From 6b5c8121cac59c5cf2f66ea80076b29c5dd82f27 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 14 Oct 2026 07:56:12 +0000 Subject: [PATCH 1/4] fix(lead): stop requiring an owner pick on the New Lead form The create form marked owner_id required, so the console refused the save with "Lead Owner is required" before the platform's insert-time stamp could make the creator the owner. Keep the field on the form so a manager can still pick another owner, as the Opportunity, Account and Contact New forms already do. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv --- objectstack.config.bundled_4tw0mek20uf.mjs | 35749 +++++++++++++++++++ src/sales/views/lead.view.ts | 9 +- 2 files changed, 35754 insertions(+), 4 deletions(-) create mode 100644 objectstack.config.bundled_4tw0mek20uf.mjs diff --git a/objectstack.config.bundled_4tw0mek20uf.mjs b/objectstack.config.bundled_4tw0mek20uf.mjs new file mode 100644 index 00000000..00f6fd91 --- /dev/null +++ b/objectstack.config.bundled_4tw0mek20uf.mjs @@ -0,0 +1,35749 @@ +var __defProp = Object.defineProperty; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; + +// objectstack.config.ts +import { composeStacks } from "@objectstack/spec"; + +// src/sales/index.ts +import { defineStack } from "@objectstack/spec"; +var createHotCrmAppStack = (collections, options) => defineStack({ + manifest: { + id: "app.objectstack.hotcrm", + namespace: "crm", + version: "4.0.1", + type: "app", + name: "HotCRM", + description: "AI-Native CRM for the ObjectStack marketplace \u2014 Accounts, Contacts, Leads, Opportunities, Cases, Knowledge, Forecasts, Campaigns, Contracts.", + // ADR-0087 protocol handshake (ADR-0025 §3.2): the metadata/runtime + // protocol major this app's metadata is authored against. Only the major + // participates in the check — a runtime on a different major refuses the + // load with a structured OS_PROTOCOL_INCOMPATIBLE diagnostic (naming the + // `objectstack migrate meta` replay) instead of failing deep in a schema + // parse. Bump together with `specVersion` on every platform upgrade + // (docs/MAINTENANCE.md §3) — `test/docs-declared-versions.test.ts` now + // enforces that pairing against `objectstack.manifest.json` instead of + // trusting this comment, because two platform upgrades in a row (rc.2, then + // rc.3) moved the manifest and left this line behind (#728). Every package + // of this artifact states the same protocol; `src/service/index.ts` + // repeats it for the same reason. + engines: { protocol: "^18.0.0-next.0" } + }, + // ─── Platform capabilities this app needs ───────────────────────── + // The runtime resolves each capability name to a built-in service plugin + // and auto-loads it (with extras like Automation's node packs). No need + // to hand-instantiate plugins or pass `--preset` flags. See + // packages/cli/src/commands/serve.ts CAPABILITY_PROVIDERS for the + // complete map; explicit `plugins: [...]` always shadows the resolver. + // `auth` enables the auth/login surface (login/register) via @objectstack/plugin-auth. + // `ui` serves the unified Console shell and CRM apps under /_console/ + // (login at /_console/login). ObjectStack 7.x replaced the legacy + // /_studio/ and /_account/ mounts with this single /_console/ surface. + // Both are required for a clickable login flow when running `objectstack start` + // off the compiled artifact. + // Note: the foundational slate (queue, job, cache, settings, email, + // storage) is auto-injected by the CLI for every non-`minimal` + // preset — see `ALWAYS_CAPS` in packages/cli/src/commands/serve.ts. + // Listed below only the *opt-in* capabilities this stack actually + // wants on top of that slate. + // `triggers` installs the record-change + schedule trigger providers that + // actually fire autolaunched flows (record_change & schedule types). Without + // it the `automation` engine registers flows but nothing ever launches them. + // Schedule triggers run via the job service (in the always-on slate). + // + // This is the APP package's slate. `defineStack` validates capabilities per + // stack, so `src/service/index.ts` declares the four its own metadata needs + // itself, and the artifact's slate is the union of the two lists. + // + // `ai` is deliberately NOT listed. ObjectStack 11.3.0 (ADR-0025 S2) removed + // `@objectstack/service-ai` from the open edition — the AI runtime now ships + // only in the closed cloud package, and the framework CLI does not depend on + // it. Under ObjectStack 16, `requires: ['ai']` is a *fail-fast* capability: + // the serve command hard-aborts boot when the package is absent, so keeping it + // here would break `objectstack start`/`dev` for this open-edition app (the AI + // block runs before every other capability resolves). The AI metadata is + // unaffected — the skills still validate, build into the artifact, and run + // wherever a runtime provides the `ai` tier (cloud's objectos-runtime). There + // are no app-authored agents: they were retired in #512 and the surface is + // skills-only (ADR-0063 §2); skills attach to a platform agent by `surface`. + // A local open-edition boot simply omits the AI service and hides its console + // surface. To run AI locally, declare `@objectstack/service-ai` (cloud) in + // package.json — its mere presence best-effort auto-loads it. + // `hierarchy-security` is the ONE enterprise-edition capability this app + // declares. It was introduced for #880 — `sales_manager` authored + // `writeScope: 'own_and_reports'` on `crm_contract`, an ADR-0057 HIERARCHY + // scope resolved by the `hierarchy-scope-resolver` service that ships only + // in `@objectstack/security-enterprise`, and `defineStack` refuses such a + // grant unless the capability is declared. Since #549 `crm_contract` is + // `controlled_by_parent` under the account, that scope is inert and is no + // longer authored; the app currently authors NO hierarchy scope at all. + // + // The declaration STAYS. Maintainer ruling 2026-08-31 (#1378, pinned by + // `test/hierarchy-read-depth.test.ts`): nothing is removed from `requires[]`. + // Maintainer ruling, 2026-08-11, verbatim: 「本项目是元数据app,在企业版运行就 + // 具备企业版相关的能力,不重复开发。」 The app states what it MEANS and the + // edition supplies the capability, rather than approximating it with a broader + // open-edition value. + // + // UNLIKE `ai` above, this is SAFE to declare on an open-edition boot and does + // NOT fail fast. Verified against `@objectstack/cli`'s serve command: the + // capability resolver looks the token up in `CAPABILITY_PROVIDERS`, finds no + // entry, and because `hierarchy-security` IS in the known + // `PLATFORM_CAPABILITY_TOKENS` vocabulary it takes the deliberate "stay quiet" + // branch — no warning, no abort — since the capability arrives via an explicit + // enterprise plugin in `plugins[]`. Only tier-gated tokens (ai / ai-studio / + // i18n / ui / auth) have the dedicated hard-abort blocks the note above + // describes. `objectstack validate` does print one informational line naming + // the package to install; that is expected output, not a defect to silence. + requires: ["automation", "triggers", "analytics", "auth", "ui", "approvals", "sharing", "hierarchy-security"], + // The locale configuration is the ARTIFACT's, and `i18n` is a + // `'single'`-disposition key: two stacks declaring different values make + // `composeStacks` throw, and declaring identical ones twice is a second + // place to drift. It lives on the App package, alone. + i18n: { + defaultLocale: "en", + supportedLocales: ["en", "zh-CN", "ja-JP", "es-ES"], + fallbackLocale: "en" + }, + ...collections +}, { artifactObjects: options.artifactObjects }); + +// src/service/index.ts +import { defineStack as defineStack2 } from "@objectstack/spec"; + +// src/service/actions/case.actions.ts +import { P } from "@objectstack/spec"; +var EscalateCaseAction = { + name: "escalate_case", + label: "Escalate Case", + objectName: "crm_case", + icon: "alert-triangle", + type: "flow", + target: "escalate_case", + locations: ["record_header", "list_item"], + visible: P`has(record.is_escalated) && record.is_escalated == false && has(record.is_closed) && record.is_closed == false`, + confirmText: "This will escalate the case to the escalation team. Continue?", + successMessage: "Case escalated successfully!", + refreshAfter: true +}; +var CloseCaseAction = { + name: "close_case", + label: "Close Case", + objectName: "crm_case", + icon: "check-circle", + type: "flow", + target: "close_case", + locations: ["record_header"], + visible: P`has(record.is_closed) && record.is_closed == false`, + confirmText: "Are you sure you want to close this case?", + successMessage: "Case closed successfully!", + refreshAfter: true +}; +var ClaimCaseAction = { + name: "claim_case", + label: "Claim Case", + objectName: "crm_case", + icon: "user-plus", + type: "flow", + target: "claim_case", + locations: ["record_header", "list_item"], + // ⛔ Deliberately NOT `has()`-guarded — the one site the #1890 totality sweep + // left alone after making every other `visible` in `src/actions/` total. This + // predicate is the sharing grant's own text, verbatim, and + // `test/claim-case-one-owner-writer.test.ts` compares the two strings; the + // grant itself cannot carry `has()`, because `plugin-sharing` compiles a + // criteria condition with `compileCelToFilter`, which rejects the whole + // function-call class, and an untranslatable rule is DROPPED by the seeder + // (#621). `src/service/sharing/case.sharing.ts` writes that out in full, including why + // `record.owner_id == null` is total one layer down (`{ owner_id: { $null: true } }`). + // ⚠️ What that reasoning does NOT cover is THIS surface: an action `visible` is + // interpreted by CEL in the browser against whatever the page holds, which is + // `{}` for the first renders, so this predicate does abort there. Making it + // total needs the grant and the parity pin moved together — a maintainer call, + // not this card's. (#1890) + visible: P`record.owner_id == null && record.status != "resolved" && record.status != "closed"`, + successMessage: "Case claimed \u2014 it is yours now.", + refreshAfter: true +}; + +// src/service/objects/index.ts +var objects_exports = {}; +__export(objects_exports, { + ArticleFeedback: () => ArticleFeedback, + Case: () => Case, + KnowledgeArticle: () => KnowledgeArticle +}); + +// src/service/objects/article_feedback.object.ts +import { ObjectSchema, Field } from "@objectstack/spec/data"; +var ArticleFeedback = ObjectSchema.create({ + name: "crm_article_feedback", + label: "Article Feedback", + pluralLabel: "Article Feedback", + icon: "thumbs-up", + description: "One reader\u2019s helpful / not-helpful verdict on a knowledge article", + // ADR-0090 D1/D7: OWD is an authored decision. Feedback is an attribute of + // the article, so record access DERIVES from it (ADR-0055) — the same call + // `crm_campaign_member` makes, and for the same reason: a vote row means + // nothing apart from the article it is about, and `crm_knowledge_article` is + // `public_read`, so anyone who can read the article can read its feedback. + // + // ⛔ Not `private`: with the voter as owner, the counters' own evidence would + // be invisible to the author trying to understand them — the same way it was + // wrong on `crm_campaign_member`. + sharingModel: "controlled_by_parent", + // ADR-0079: junction rows have no derivable text title; point the canonical + // nameField at the stored autonumber explicitly (autonumber is not in the + // auto-derivation whitelist). Same call as `crm_campaign_member` and + // `crm_event_attendee`. + nameField: "feedback_number", + // A related list takes its columns from the child's `highlightFields` MINUS + // the lookup it is scoped by, and this object ships no view of its own — so + // this list IS the feedback panel on an article's detail page (#944): the + // verdict, and who gave it. + // + // TWO fields are deliberately absent, for two different reasons: + // + // - `feedback_number`, the same call `crm_campaign_member` makes with + // `member_number`: it is the record TITLE, which a detail page hoists out + // of the body, so leading the strip with it would fill the panel with + // autonumbers instead of verdicts. + // - `comment`, a 500-character textarea. A highlight strip holds short + // values, and keeping it out is also what stops the `basic` group being + // ENTIRELY title-or-strip — a group whose every field is hoisted keeps its + // heading on forms and silently vanishes from detail pages + // (`field-group-shadowed`, the same trap `crm_campaign_member`'s `basic` + // group and `crm_task`'s `assignment` group each had to be rescued from). + // So the comment is the group's own content on the row's detail page, + // and reaches the panel through `relatedListColumns` on the article + // lookup below instead (#1199). + highlightFields: ["crm_knowledge_article", "verdict", "owner_id"], + fieldGroups: [ + { key: "basic", label: "Feedback", icon: "message-square" } + ], + fields: { + feedback_number: Field.autonumber({ + label: "Feedback #", + format: "AF-{0000}", + group: "basic" + }), + // Platform ownership anchor — canonical note in `account.object.ts` (#548). + // Here it is also the VOTER: the platform stamps it on insert, which is + // what `unique_vote_per_reader` keys on and what lets a reader change + // their own mind without an admin's help. + owner_id: Field.lookup("sys_user", { + label: "Reader", + group: "basic", + system: true, + readonly: false + }), + /** + * The article this verdict is about. + * + * `deleteBehavior: 'cascade'` — a vote on a deleted article denotes + * nothing. This is the lesson #696 cost the campaign junction: both party + * lookups there took `Field.lookup`'s `set_null` default, the cleared row + * instantly violated the object's own required-reference rule, and every + * enrolled person became permanently undeletable. A required lookup that + * defaults to `set_null` is that bug waiting to happen, so the behaviour is + * spelled out here rather than inherited. + */ + crm_knowledge_article: Field.lookup("crm_knowledge_article", { + label: "Article", + required: true, + storage: { notNull: true }, + group: "basic", + deleteBehavior: "cascade", + description: "Knowledge article this feedback is about.", + // Curates the feedback panel on the article's detail page — the surface + // the article's AUTHOR reads (#1199). A related list reads + // `relatedListColumns` on the child's lookup before it falls back to + // `highlightFields` minus that lookup (#944), so this is a SUPERSET of + // the fallback (Verdict / Reader) plus `comment`: the note a reader + // types to explain a verdict was stored and shown on no list, and the + // author the field's own description names could not see it without + // opening each row. Last, because it is the one long value. + // + // ⛔ Deliberately NOT solved by adding `comment` to `highlightFields` — + // see the note above that list (`field-group-shadowed`). + relatedListColumns: ["verdict", "owner_id", "comment"] + }), + verdict: Field.select({ + label: "Verdict", + required: true, + storage: { notNull: true }, + group: "basic", + options: [ + { label: "Helpful", value: "helpful", color: "#10B981", default: true }, + { label: "Not Helpful", value: "not_helpful", color: "#EF4444" } + ] + }), + comment: Field.textarea({ + label: "Comment", + group: "basic", + maxLength: 500, + description: "Optional note explaining the verdict \u2014 read by the article\u2019s author." + }) + }, + indexes: [ + { fields: ["crm_knowledge_article"] }, + { fields: ["verdict"] }, + // One vote per reader per article. Without it the counters answer "how many + // clicks", which is not a number anybody wants next to "Not Helpful". + // + // `unique: 'organization'` states the scope explicitly, per ADR-0120: the + // driver prepends the NULL-safe organization key part + // (`COALESCE(organization_id, '__global__')`) at registration, so the + // constraint is one vote per reader per article WITHIN an organization, + // and rows with no organization form one bucket rather than each escaping + // under SQL's NULL-distinct semantics. Bare `unique: true` is the + // deprecated positional spelling of `'global'` — it warns today + // (`unique/unscoped-declared-index`) and protocol 18 rejects it, and + // "globally unique across every installation" is not what one reader's + // opinion of one article means. + { fields: ["crm_knowledge_article", "owner_id"], unique: "organization" } + ], + enable: { + apiEnabled: true, + apiMethods: ["get", "list", "create", "update", "delete"] + } +}); + +// src/service/objects/case.object.ts +import { ObjectSchema as ObjectSchema2, Field as Field2 } from "@objectstack/spec/data"; +import { F, P as P2 } from "@objectstack/spec"; +var Case = ObjectSchema2.create({ + name: "crm_case", + label: "Case", + pluralLabel: "Cases", + icon: "life-buoy", + description: "Customer support cases and service requests", + // ADR-0090 D1/D7: OWD is an authored decision. Owner + escalation sharing rule. + sharingModel: "private", + fieldGroups: [ + { key: "basic", label: "Case Information", icon: "info" }, + { key: "origin", label: "Origin & Routing", icon: "route" }, + { key: "sla", label: "SLA & Priority", icon: "clock" }, + { key: "resolution", label: "Resolution", icon: "check-circle" }, + { key: "escalation", label: "Escalation", icon: "alert-triangle", collapse: "collapsed" }, + { key: "system", label: "System", icon: "database", collapse: "collapsed" } + ], + fields: { + // Platform ownership anchor — canonical note in `account.object.ts` (#548). + owner_id: Field2.lookup("sys_user", { + label: "Case Owner", + group: "origin", + system: true, + readonly: false, + trackHistory: true + }), + // Case Information + // + // `unique: true` is declared HERE, on the field, and deliberately NOT as a + // `{ fields: ['organization_id', 'case_number'], unique: true }` entry in + // `indexes[]` below (#1023) — same spelling `crm_account.name`, + // `crm_contact.email` and `crm_product.sku` already use, for the same + // reason. Since framework #3696 the field-level form is per-organization: + // it materializes as the composite `(organization key part, case_number)`, + // unique WITHIN an organization. Since platform 17.0.0-rc.4 (ADR-0120 D3, + // #5030) that key part is NULL-safe — `COALESCE(organization_id, + // '__global__')` — so rows with no organization form ONE bucket instead of + // each escaping the constraint under SQL's NULL-distinct semantics. + // + // The hand-written table composite this replaced could not get that: a + // declared index is taken verbatim, so it materialized as plain + // `UNIQUE (organization_id, case_number)` and enforced NOTHING on any row + // whose `organization_id` was NULL — i.e. every row of a single-organization + // or untenanted install. It also read as "unique per organization" while + // materializing as an unscoped composite, which is the bare-`unique: true` + // spelling ADR-0120 warns on in 17.x and protocol 18 rejects (#5082). + // + // Scope spelling: bare `true` at FIELD level already means "per + // organization" and carries no deprecation (`'organization'` is its + // explicit synonym with byte-identical materialization — measured). It is + // written as `true` to match the four sibling objects above; switching the + // repo to the explicit word is a uniform decision for all of them, not + // something `crm_case` forks on alone. + case_number: Field2.autonumber({ + label: "Case Number", + group: "basic", + format: "CASE-{00000}", + unique: true + }), + subject: Field2.text({ + label: "Subject", + group: "basic", + required: true, + storage: { notNull: true }, + searchable: true, + maxLength: 255 + }), + // ADR-0079 record title (was titleFormat '{case_number} - {subject}'). + display_title: Field2.formula({ + label: "Display Title", + group: "basic", + expression: F`record.case_number + " - " + record.subject` + }), + description: Field2.markdown({ + label: "Description", + group: "basic", + required: true, + storage: { notNull: true } + }), + // Relationships + crm_account: Field2.lookup("crm_account", { + label: "Account", + group: "basic" + }), + crm_contact: Field2.lookup("crm_contact", { + label: "Contact", + group: "basic", + // Optional so Web-to-Case (anonymous) submissions can land without + // an existing CRM contact. Back-office staff or a triage flow links + // the case to a contact after the fact. This matches the Salesforce + // Web-to-Case convention. + // @objectstack 12: string[] `referenceFilters` is dead (not read by the + // picker). `dependsOn` is the live cascading-lookup form — it scopes the + // contact candidates to those sharing the case's `crm_account` (ADR-0049). + dependsOn: ["crm_account"] + }), + // Case Management + status: Field2.select({ + label: "Status", + group: "basic", + required: true, + storage: { notNull: true }, + // ADR-0052 §5b.1 — platform auto-renders status changes on the timeline + // ("Status: New → Escalated"). Delivers the case timeline declaratively + // (the hand-coded version was deferred in #396 due to a hook-crash bug). + trackHistory: true, + options: [ + { label: "New", value: "new", color: "#808080", default: true }, + { label: "In Progress", value: "in_progress", color: "#FFA500" }, + { label: "Waiting on Customer", value: "waiting_customer", color: "#FFD700" }, + { label: "Waiting on Support", value: "waiting_support", color: "#4169E1" }, + { label: "Escalated", value: "escalated", color: "#FF0000" }, + { label: "Resolved", value: "resolved", color: "#00AA00" }, + { label: "Closed", value: "closed", color: "#006400" } + ] + }), + priority: Field2.select({ + label: "Priority", + group: "sla", + required: true, + storage: { notNull: true }, + trackHistory: true, + options: [ + { label: "Low", value: "low", color: "#4169E1", default: true }, + { label: "Medium", value: "medium", color: "#FFA500" }, + { label: "High", value: "high", color: "#FF4500" }, + { label: "Critical", value: "critical", color: "#FF0000" } + ] + }), + // Sortable ordinal for `priority`. Ordering a queue by the select field + // itself sorts the raw strings, so `priority desc` yields + // medium > low > high > critical — the exact inversion of urgency, which + // buried every critical case at the bottom of the agent's queue. Select + // options carry no ordinal in the spec, so the rank is materialised here + // and stamped by `case_sla_defaults`; queue views sort on it instead. + // `0` is the UNRANKED sentinel, shared with crm_task.priority_rank: it is + // what a record carries when no recognised priority has been stamped, and + // it sorts below every real rank (1–4) on the `priority_rank desc` queues. + // ⛔ It must not be `1` here (or `2` on crm_task): a non-zero sentinel + // orders the same unknown priority differently on the two objects, and on + // this one it is indistinguishable from a genuine `low`. + priority_rank: Field2.number({ + label: "Priority Rank", + readonly: true, + defaultValue: 0 + }), + type: Field2.select({ + label: "Case Type", + group: "basic", + options: [ + { label: "Question", value: "question" }, + { label: "Problem", value: "problem" }, + { label: "Feature Request", value: "feature_request" }, + { label: "Bug", value: "bug" } + ] + }), + origin: Field2.select({ + label: "Case Origin", + group: "origin", + options: [ + { label: "Email", value: "email" }, + { label: "Phone", value: "phone" }, + { label: "Web", value: "web" }, + { label: "Chat", value: "chat" }, + { label: "Social Media", value: "social_media" } + ] + }), + // Assignment + // SLA and Metrics + // + // NO `created_date` here (#1992, the #575 B2 precedent on + // `crm_opportunity`): the platform already injects `created_at` on every + // object and stamps it on every insert, while this duplicate had no writer + // at all — only the seed data set it, so every case created through the + // UI or REST stored null and fell out of "Cases Opened by Priority × Day" + // and the service dashboard's date range. Surfaces that need the creation + // instant read `created_at` (the `case_metrics` dataset, the dashboard + // range, the `case_timeline` view, `case_sla_defaults`' resolution time); + // the seeds author it directly, and the seed loader keeps an authored + // `created_at` on first insert since @objectstack/objectql 17.7.0 + // (objectstack#21646). + closed_date: Field2.datetime({ + label: "Closed Date", + group: "sla", + readonly: true + }), + // ⛔ NOT `readonly`: stamped by `event_activity_bubble` + // (`src/sales/objects/event.hook.ts`) on the first HELD `crm_event` related to the + // case, whoever wrote that event. ⚠️ That hook reaches this case through + // `ctx.api`, a `ScopedContext` over the ACTING USER's execution context — + // so its write is a CALLER-supplied write from a non-`isSystem` context, + // which `stripReadonlyFields` deletes. `readonly` here silently disables + // the stamp. (A hook writing its OWN record's `ctx.input.data` is a + // different case and SURVIVES `readonly` — hook-written keys are not + // caller-supplied. Measured in `test/readonly-write-semantics.test.ts`.) + // + // Definition: the moment the customer first heard back from us, matching + // Salesforce `FirstResponseDateTime` / Zendesk first reply time — NOT an + // internal status change, which would report "responded" while the customer + // is still waiting. + first_response_date: Field2.datetime({ + label: "First Response Date", + group: "sla" + }), + resolution_time_hours: Field2.number({ + label: "Resolution Time (Hours)", + group: "sla", + readonly: true, + scale: 2 + }), + // Stamped once, on the first write that gives the case a priority, from the + // priority × account-tier matrix in `./_case-sla.ts` (`case_sla_defaults`). + // Not `readonly`: a service manager may legitimately renegotiate a deadline, + // and the hook never overwrites a value that is already there. + sla_due_date: Field2.datetime({ + label: "SLA Due Date", + description: "Set from the case priority and the account\u2019s Customer Tier, in calendar hours: nights, weekends and holidays count.", + group: "sla" + }), + // Stamped by two writers, one per side of the clock stop (#2070): the + // `case_sla_monitor` schedule flow while the case is live work, and + // `case_sla_defaults` on the write that resolves or closes it late. The + // rule both apply is `caseSlaBreached` in `./_case-sla.ts`. + // + // NOT `readonly` — but NOT for the reason this comment used to give, and + // the difference is measured in `test/readonly-write-semantics.test.ts` + // (#1429). `case_sla_monitor` declares `runAs: 'system'`, so its writes + // would SURVIVE a `readonly: true` here. It stays writable pending a + // decision that has to weigh the other surfaces (seed data, + // `service-agent.profile.ts`, the create form), not because the platform + // would drop the sweep's write. + // + // ⚠️ This is now the ONLY escalation-group flag still declared writable: + // `is_escalated` and `escalated_date` became `readonly: true` when #1434 + // moved their user-context writer into a system sub-flow. So the open + // question here is narrower than it was — it is purely about this field's + // authoring surfaces, with no platform obstacle left to blame. + is_sla_violated: Field2.boolean({ + label: "SLA Violated", + group: "sla", + defaultValue: false + }), + // Escalation + // + // `readonly: true` — the honest declaration, because nobody types this. + // Its three writers are now unanimously elevated (#1434, maintainer- + // approved decision batch #21 ②): + // + // case_escalation runAs: 'system' (record-change) + // case_sla_monitor runAs: 'system' (schedule) + // case_escalation_stamp runAs: 'system' (called by the escalate_case + // screen flow via a subflow node) + // + // ⭐ What changed, and why the readonly declaration is now safe: the + // `escalate_case` screen flow used to write this field itself, and it + // stays `runAs: 'user'` because a person clicks it. The platform's + // readonly strip is one branch of the UPDATE path + // (`if (!opCtx.context?.isSystem)`, over CALLER-supplied keys), so that + // user-context write WOULD have been silently dropped. Rather than + // elevating the whole screen flow, the stamp moved into the dedicated + // `case_escalation_stamp` sub-flow. The agent's own writes + // (`escalation_reason`, `priority`, `status`) still carry their identity; + // only these two stamps are elevated. + // + // The guest-submission branch of `case.hook.ts` also forces this false, and + // is unaffected: it is a `beforeInsert` hook, so its key is not + // caller-supplied AND the INSERT path is exempt from the strip entirely. + // Seed data (`service.seed.ts`) is exempt for the same reason. + // + // ⛔ If you find yourself reverting this to writable so a user-context flow + // write lands, you are re-opening #1434 — add a `subflow` step instead. + // Semantics measured in `test/readonly-write-semantics.test.ts`. + is_escalated: Field2.boolean({ + label: "Escalated", + group: "escalation", + readonly: true, + defaultValue: false + }), + // `readonly: true`, same reasoning as `is_escalated` above and stamped by + // the same writers — `case_escalation` and the `case_escalation_stamp` + // sub-flow, both `runAs: 'system'`. Never typed by a person. + escalated_date: Field2.datetime({ + label: "Escalated Date", + group: "escalation", + readonly: true + }), + // ⛔ DELIBERATELY NOT `readonly`, and this is load-bearing (#1434). This is + // the agent's own screen input — `escalate_case`'s screen collects it and + // writes it with the USER's context. Declaring it readonly would make the + // platform silently strip the reason the agent just typed, which is the + // harm #1434 was filed about, inverted onto user input. It is also + // required whenever `is_escalated` flips true (the + // `escalation_reason_required` validation below), so dropping it would + // reject the escalation outright. + escalation_reason: Field2.textarea({ + label: "Escalation Reason", + group: "escalation" + }), + // No `parent_case`. A case hierarchy was declared here and never + // traversed: nothing rolled child cases up, nothing closed or notified them + // with the parent, and no service flow read the link. Related cases that + // matter in this app are linked through the knowledge article that resolved + // them (`resolved_by_article`), which the deflection measures do read. + // Resolution + resolution: Field2.markdown({ + label: "Resolution", + group: "resolution" + }), + /** + * The knowledge article that RESOLVED this case (#601). + * + * The second half of a two-way link, and deliberately not a replacement for + * the first. `crm_knowledge_article.related_to_case` points the other way — + * "the case this article was WRITTEN FROM" — and the two answer different + * questions: provenance (where did this article come from) versus + * deflection (what did this article save us). Merging them would make both + * unanswerable, so both stay. + * + * This is the column the deflection measures on `case_metrics` read + * (`kb_resolved_count` / `kb_deflection_rate`), which is why blank is + * normalised to NULL by `case_resolution_article_normalize` in + * `case.hook.ts`: the close-case screen sends `''` for a field the agent + * left empty, an empty string is NOT null, and `count(resolved_by_article)` + * counts it — a silently inflated numerator on a ratio widget, the exact + * shape of #614. + */ + resolved_by_article: Field2.lookup("crm_knowledge_article", { + label: "Resolved by Article", + group: "resolution", + description: "Knowledge article that resolved this case \u2014 the deflection signal." + }), + // Internal notes + internal_notes: Field2.markdown({ + label: "Internal Notes", + group: "system", + description: "Internal notes; not visible to the customer." + }), + // Flags + is_closed: Field2.boolean({ + label: "Is Closed", + group: "system", + defaultValue: false, + readonly: true + }) + }, + // Database indexes for performance + // + // `case_number` is an autonumber (`CASE-{00000}`), and the platform's + // autonumber sequence is PER TENANT — every organization counts from 1. A + // platform-wide unique index on it therefore rejects the second + // organization's `CASE-00001` on insert: the exact collision framework #3696 + // exists to prevent. The constraint has to match the sequence that feeds it. + // + // No `{ fields: ['organization_id', 'case_number'], unique: true }` here + // (#1023). Case-number uniqueness is declared on the `case_number` field + // itself — see the note there for why the hand-written table composite could + // not express it. Do NOT add it back alongside the field-level declaration + // either: declaring both makes the verbatim index win and leaves the + // per-organization one unreachable (framework#3991 + // `unique/double-declaration`), which would silently undo the fix. + indexes: [ + { fields: ["crm_account"] }, + { fields: ["owner_id"] }, + { fields: ["status"] }, + { fields: ["priority"] } + ], + // API surface. History → Field.trackHistory (ADR-0052). + enable: { + apiEnabled: true, + // #602 — screenshots and logs are how a support case gets diagnosed. + // See the canonical capability note in `src/sales/objects/index.ts`. + files: true + }, + // ADR-0052 §5b.2 — declarative milestone activity for the service narrative. + // The caseSideEffects hook still owns its real side-effects (escalation task, + // closed-date stamping); these are timeline entries only, emitted by the platform. + activityMilestones: [ + { field: "status", value: "escalated", summary: "Case escalated \u2014 {subject}", type: "updated" }, + { field: "status", value: "resolved", summary: "Case resolved \u2014 {subject}", type: "completed" }, + { field: "status", value: "closed", summary: "Case closed \u2014 {subject}", type: "completed" } + ], + // ADR-0079: render-only `titleFormat` retired in favor of `nameField`, + // which names a real field. The former template composed two local fields, so + // the `display_title` formula field (see fields) reproduces it. + nameField: "display_title", + // Explicit search targets (ADR-0061). REQUIRED because nameField is a + // FORMULA (display_title/full_name): without this, $search auto-defaults to + // the formula field, which isn't a real column, so the lookup picker + global + // search silently return zero. These are real, indexed columns. + searchableFields: ["subject", "case_number"], + highlightFields: ["case_number", "subject", "crm_account", "status", "priority"], + // Removed: list_views and form_views belong in UI configuration, not object definition + // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the + // rule returns a verdict even when the merged record has no such key. See + // AGENTS.md "Validation predicates must be TOTAL" and + // test/object-validation-predicates.test.ts, which fails the build otherwise. + validations: [ + { + name: "resolution_required_for_closed", + type: "script", + severity: "error", + message: "Resolution is required when closing a case", + condition: P2`has(record.status) && record.status == "closed" && (!has(record.resolution) || isBlank(record.resolution))` + }, + { + name: "escalation_reason_required", + type: "script", + severity: "error", + message: "Escalation reason is required when escalating a case", + condition: P2`has(record.is_escalated) && record.is_escalated == true && (!has(record.escalation_reason) || isBlank(record.escalation_reason))` + }, + { + name: "case_status_progression", + type: "state_machine", + severity: "warning", + message: "Invalid status transition", + field: "status", + // Escalate + Close actions are available from ANY open status (see + // escalate_case / close_case visibility). The transition map must permit + // →escalated and →closed from every open state, else those actions emit a + // spurious "Invalid status transition" warning (e.g. escalating a brand-new + // case, which is a legitimate support move). + transitions: { + "new": ["in_progress", "waiting_customer", "escalated", "closed"], + "in_progress": ["waiting_customer", "waiting_support", "escalated", "resolved", "closed"], + "waiting_customer": ["in_progress", "waiting_support", "escalated", "closed"], + "waiting_support": ["in_progress", "waiting_customer", "escalated", "closed"], + "escalated": ["in_progress", "resolved", "closed"], + "resolved": ["closed", "in_progress"], + // Can reopen + "closed": ["in_progress"] + // Can reopen + } + } + ] + // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were + // removed from the platform. Field updates live in this object's `*.hook.ts`; + // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. +}); + +// src/service/objects/knowledge_article.object.ts +import { ObjectSchema as ObjectSchema3, Field as Field3 } from "@objectstack/spec/data"; +import { F as F2, P as P3 } from "@objectstack/spec"; +var KnowledgeArticle = ObjectSchema3.create({ + name: "crm_knowledge_article", + label: "Knowledge Article", + pluralLabel: "Knowledge Articles", + icon: "book-open", + description: "Reusable knowledge base articles for self-service and AI grounding", + // ADR-0090 D1/D7: OWD is an authored decision. Knowledge base is org-readable; authors edit. + sharingModel: "public_read", + // ─── Public access ───────────────────────────────────────────────────── + // + // Publishing a public article mints a share link through the platform's + // `publicSharing` surface (maintainer ruling, 2026-08-02: no customer portal, + // no anonymous-grant widening). ⛔ The whole safety of that rests on + // `eligibility`, which is the ONLY thing standing between a share dialog and + // a stranger reading an internal or draft article — so this block may only be + // declared while every key below is enforced. + // + // MEASURED on `@objectstack/plugin-sharing@17.1.0` — the version + // installed AT THE TIME of the measurement, not the current pin (this table + // has NOT been re-taken on any later pin — not 17.3.0, #1676, not 17.4.0, + // PR #1814, and not 17.5.0) — + // against the real `ShareLinkService` and a real engine, + // not read off a grep count: + // + // | key | measured on 17.1.0 | + // | -------------------- | ---------------------------------------------- | + // | `enabled` | ENFORCED — false ⇒ SHARING_NOT_ENABLED 422 | + // | `allowedAudiences` | ENFORCED — `signed_in` refused 422 | + // | `allowedPermissions` | ENFORCED — non-`view` refused 422 | + // | `redactFields` | APPLIED to every token-served response | + // | `eligibility` | **ENFORCED — false verdict ⇒ 422, no link** | + // + // `test/knowledge-article-share-links.test.ts` drives all of it end to end + // and is the acceptance evidence; read it before changing anything here. + // + // ⚠️ TWO SPELLING TRAPS, both measured, both of which produce a block that + // LOOKS declared and silently is not: + // + // 1. `eligibility` must be a PLAIN STRING. It is `z.ZodString` in the spec + // and `getPolicy()` keeps it only when `typeof raw.eligibility === + // 'string'`. The `P` tagged template used by `validations[].condition` + // below returns an Expression OBJECT `{ dialect, source }` — passing one + // here does not narrow anything, it makes the predicate vanish. + // + // 2. Every field read is `record.`-PREFIXED. The evaluator is + // `ExpressionEngine` from `@objectstack/formula` (record-level CEL), and + // `record` is the ONLY binding it is given. The bare-identifier spelling + // `status == 'published' && audience == 'public'` COMPILES and then fails + // at evaluate with `Unknown variable: audience`, + // which `assertEligible` turns into ELIGIBILITY_UNEVALUABLE 422. That + // fails CLOSED, so it is not a security hole; it is a feature that never + // mints a single link while reading as if it works. + // + // The predicate is TOTAL for the same reason the `validations` below are: + // `has()` guards every read. `assertEligible` materializes declared fields to + // `null` first, so an absent key would not abort here today — the guards keep + // that true if the field set changes. (The `has(record.x)` caveat carried + // from objectstack#7861 is about `compileCelToFilter`, the SHARING-RULE path. + // That is a different evaluator, it is not on this code path, and it is not + // even exported from `@objectstack/plugin-sharing`. Verified, not assumed.) + // + // ⚠️ Eligibility is evaluated at MINT time only; `resolveToken()` does not + // re-check it. Re-classifying a published/public article to internal or back + // to draft does NOT revoke links already minted from it — those must be + // revoked explicitly. That is platform behaviour, filed upstream, not + // something this app compensates for app-side. + publicSharing: { + enabled: true, + // `public` and `link_only` only. `signed_in` would be a different feature + // and `email` is refused at creation without an allowlist. + allowedAudiences: ["public", "link_only"], + // Read-only. Same as the platform default, declared anyway: this is a + // security boundary, and a default is not a decision. + allowedPermissions: ["view"], + // The gate. Published AND public-audience, nothing else — a draft, an + // in_review, an archived, or any internal-audience article is refused at + // `createLink` with RECORD_NOT_ELIGIBLE 422 and no row is written. + eligibility: 'has(record.status) && record.status == "published" && has(record.audience) && record.audience == "public"', + // Stripped from every token-served response. These are the fields that + // exist for staff: who owns the article, which customer case it was + // written from, and when an editor last reviewed it. None of them are part + // of the answer a reader followed the link for. + redactFields: ["owner_id", "related_to_case", "last_reviewed_at"] + }, + // ADR-0079: render-only `titleFormat` retired in favor of `nameField`, + // which names a real field. The former template composed two local fields, so + // a `display_title` formula field reproduces it for the record title. + nameField: "display_title", + // Explicit search targets (ADR-0061). REQUIRED because nameField is a + // FORMULA (display_title/full_name): without this, $search auto-defaults to + // the formula field, which isn't a real column, so the lookup picker + global + // search silently return zero. These are real, indexed columns. + searchableFields: ["title", "article_number", "summary"], + highlightFields: ["article_number", "title", "category", "status", "audience"], + fieldGroups: [ + { key: "basic", label: "Article Information", icon: "info" }, + { key: "content", label: "Content", icon: "file-text" }, + { key: "taxonomy", label: "Categorization", icon: "tag" }, + { key: "metrics", label: "Engagement", icon: "activity", collapse: "collapsed" } + ], + fields: { + // Platform ownership anchor — canonical note in `account.object.ts` (#548). + owner_id: Field3.lookup("sys_user", { + label: "Article Owner", + group: "basic", + system: true, + readonly: false, + trackHistory: true + }), + article_number: Field3.autonumber({ + label: "Article Number", + format: "KA-{0000}", + group: "basic" + }), + title: Field3.text({ + label: "Title", + required: true, + storage: { notNull: true }, + searchable: true, + maxLength: 255, + group: "basic" + }), + // ADR-0079 record title (was titleFormat '{article_number} - {title}'). + display_title: Field3.formula({ + label: "Display Title", + expression: F2`record.article_number + " - " + record.title`, + group: "basic" + }), + summary: Field3.text({ + label: "Summary", + description: "One-paragraph TL;DR shown in search results and AI citations.", + maxLength: 500, + searchable: true, + group: "basic" + }), + body: Field3.markdown({ + label: "Body", + description: "Full article content (Markdown).", + searchable: true, + group: "content" + }), + category: Field3.select({ + label: "Category", + group: "taxonomy", + options: [ + { label: "Getting Started", value: "getting_started", default: true }, + { label: "How-To", value: "how_to" }, + { label: "Troubleshooting", value: "troubleshooting" }, + { label: "Billing & Pricing", value: "billing" }, + { label: "API & Integrations", value: "api" }, + { label: "Release Notes", value: "release_notes" }, + { label: "Policy", value: "policy" } + ] + }), + tags: Field3.select({ + label: "Tags", + multiple: true, + group: "taxonomy", + options: [ + { label: "Auth", value: "auth" }, + { label: "SSO", value: "sso" }, + { label: "Mobile", value: "mobile" }, + { label: "Email", value: "email" }, + { label: "Reports", value: "reports" }, + { label: "Performance", value: "performance" }, + { label: "Data Import", value: "data_import" }, + { label: "Webhooks", value: "webhooks" } + ] + }), + status: Field3.select({ + label: "Status", + required: true, + storage: { notNull: true }, + group: "basic", + trackHistory: true, + options: [ + { label: "Draft", value: "draft", color: "#94A3B8", default: true }, + { label: "In Review", value: "in_review", color: "#F59E0B" }, + { label: "Published", value: "published", color: "#10B981" }, + { label: "Archived", value: "archived", color: "#475569" } + ] + }), + audience: Field3.select({ + label: "Audience", + required: true, + storage: { notNull: true }, + group: "basic", + description: "Public articles are visible in the customer portal; internal articles are agent-only.", + options: [ + { label: "Public", value: "public", default: true, color: "#0EA5E9" }, + { label: "Internal", value: "internal", color: "#7C3AED" } + ] + }), + language: Field3.select({ + label: "Language", + group: "basic", + options: [ + { label: "English", value: "en", default: true }, + { label: "Simplified Chinese", value: "zh_cn" }, + { label: "Spanish", value: "es_es" }, + { label: "Japanese", value: "ja_jp" } + ] + }), + related_to_case: Field3.lookup("crm_case", { + label: "Originating Case", + description: "Case this article was authored from (optional).", + group: "content" + }), + published_at: Field3.datetime({ + label: "Published At", + readonly: true, + group: "basic" + }), + last_reviewed_at: Field3.datetime({ + label: "Last Reviewed At", + readonly: true, + group: "basic" + }), + /** + * `view_count` is GONE (#601), and this note is the record of why. + * + * All three engagement counters were `readonly: true` with a writer + * nowhere — on the platform or in this app — so all three were pinned at + * whatever the seed said, forever, while the article grid summed a "Views" + * column. ADR-0049's enforce-or-remove leaves two honest endings per + * field: give it a writer, or delete it. The card left this one to the + * implementer, and the two below went the other way, so the split is + * argued rather than assumed. + * + * A page-view writer WOULD have been expressible — `afterFind` is a real + * hook event on this platform. It is not built, because of what the event + * actually means: `beforeFind`/`afterFind` fire on record MATERIALIZATION, + * for `find` and `findOne` alike, with no per-method read event + * (deliberately — see the spec's note on #3195). So a counter written + * there would increment on the article grid, on global search, on the + * lookup picker in the close-case screen, on the AI grounding queries that + * cite articles — every one of them a "view" of a row nobody read. The + * number would grow fastest for articles nobody opens, and it would carry + * a database write on every read path in the app to do it. + * + * "Views" that means "appearances in any query" is a worse lie than a + * field that is missing, because it looks like data. A real page-view + * counter needs a real view event from a real article surface — the day + * one exists, this field comes back with it, and not before. + * + * `helpful_count` / `not_helpful_count` DO get a writer, and it is the + * whole reason `crm_article_feedback` exists: reader verdicts are recorded + * as rows and these two are RECOUNTED from them by + * `article_feedback_metrics_refresh`. They stay `readonly: true` and that + * is now an accurate statement — derived from evidence, never typed in. + */ + helpful_count: Field3.number({ + label: "Helpful Votes", + group: "metrics", + readonly: true, + defaultValue: 0, + description: "Recounted from crm_article_feedback \u2014 never typed in." + }), + not_helpful_count: Field3.number({ + label: "Not Helpful Votes", + group: "metrics", + readonly: true, + defaultValue: 0, + description: "Recounted from crm_article_feedback \u2014 never typed in." + }) + }, + indexes: [ + { fields: ["title"] }, + { fields: ["category"] }, + { fields: ["status"] }, + { fields: ["audience"] }, + { fields: ["language"] } + ], + // API surface. History → Field.trackHistory (ADR-0052). + enable: { + apiEnabled: true, + apiMethods: ["get", "list", "create", "update", "delete"] + }, + // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the + // rule returns a verdict even when the merged record has no such key. See + // AGENTS.md "Validation predicates must be TOTAL" and + // test/object-validation-predicates.test.ts, which fails the build otherwise. + validations: [ + { + name: "published_requires_body", + type: "script", + severity: "error", + message: "Articles cannot be published without a body.", + condition: P3`has(record.status) && record.status == "published" && (!has(record.body) || record.body == null || record.body == "")` + }, + { + name: "published_requires_summary", + type: "script", + severity: "warning", + message: "Published articles should have a summary for search results and AI citations.", + condition: P3`has(record.status) && record.status == "published" && (!has(record.summary) || record.summary == null || record.summary == "")` + } + ] +}); + +// src/sales/objects/index.ts +var objects_exports2 = {}; +__export(objects_exports2, { + Account: () => Account, + Contact: () => Contact, + Event: () => Event, + EventAttendee: () => EventAttendee, + Forecast: () => Forecast, + Lead: () => Lead, + Opportunity: () => Opportunity, + Task: () => Task +}); + +// src/sales/objects/account.object.ts +import { ObjectSchema as ObjectSchema4, Field as Field4 } from "@objectstack/spec/data"; +import { F as F3 } from "@objectstack/spec"; + +// src/sales/objects/_picklists.ts +var SALUTATION_OPTIONS = [ + { label: "Mr.", value: "mr" }, + { label: "Ms.", value: "ms" }, + { label: "Mrs.", value: "mrs" }, + { label: "Dr.", value: "dr" }, + { label: "Prof.", value: "prof" } +]; +var INDUSTRY_OPTIONS = [ + { label: "Technology", value: "technology" }, + { label: "Software / SaaS", value: "software" }, + { label: "Finance", value: "finance" }, + { label: "Healthcare", value: "healthcare" }, + { label: "Retail", value: "retail" }, + { label: "Manufacturing", value: "manufacturing" }, + { label: "Education", value: "education" }, + { label: "Real Estate", value: "real_estate" }, + { label: "Media & Entertainment", value: "media" }, + { label: "Logistics", value: "logistics" }, + { label: "Hospitality", value: "hospitality" }, + { label: "Energy & Utilities", value: "energy" }, + { label: "Government", value: "government" }, + { label: "Non-profit", value: "nonprofit" }, + { label: "Other", value: "other" } +]; +var LEAD_SOURCE_OPTIONS = [ + { label: "Web", value: "web" }, + { label: "Referral", value: "referral" }, + { label: "Event / Trade Show", value: "event" }, + { label: "Webinar", value: "webinar" }, + { label: "Partner", value: "partner" }, + { label: "Advertisement", value: "advertisement" }, + { label: "Paid Search", value: "paid_search" }, + { label: "Social Media", value: "social" }, + { label: "Content / Blog", value: "content" }, + { label: "Cold Call", value: "cold_call" }, + { label: "Email Campaign", value: "email_campaign" }, + { label: "Other", value: "other" } +]; +var PAYMENT_TERMS_OPTIONS = [ + { label: "Net 15", value: "net_15" }, + { label: "Net 30", value: "net_30", default: true }, + { label: "Net 60", value: "net_60" }, + { label: "Net 90", value: "net_90" }, + { label: "Due on Receipt", value: "due_on_receipt" } +]; +var TASK_TYPE_OPTIONS = [ + { label: "Call", value: "call" }, + { label: "Email", value: "email" }, + { label: "Meeting", value: "meeting" }, + { label: "Follow-up", value: "follow_up" }, + { label: "Demo", value: "demo" }, + { label: "Other", value: "other" } +]; +var OPPORTUNITY_STAGE_OPTIONS = [ + { label: "Prospecting", value: "prospecting", color: "#808080", default: true }, + { label: "Qualification", value: "qualification", color: "#FFA500" }, + { label: "Needs Analysis", value: "needs_analysis", color: "#FFD700" }, + { label: "Proposal", value: "proposal", color: "#4169E1" }, + { label: "Negotiation", value: "negotiation", color: "#9370DB" }, + { label: "Closed Won", value: "closed_won", color: "#00AA00" }, + { label: "Closed Lost", value: "closed_lost", color: "#FF0000" } +]; +var EVENT_TYPE_OPTIONS = [ + { label: "Meeting", value: "meeting", color: "#4169E1", default: true }, + { label: "Call", value: "call", color: "#00AA00" }, + { label: "Demo", value: "demo", color: "#9370DB" }, + { label: "Webinar", value: "webinar", color: "#FFA500" }, + { label: "Onsite Visit", value: "onsite_visit", color: "#0EA5E9" }, + { label: "Other", value: "other", color: "#808080" } +]; +var EVENT_STATUS_OPTIONS = [ + { label: "Planned", value: "planned", color: "#4169E1", default: true }, + { label: "Held", value: "held", color: "#00AA00" }, + { label: "Cancelled", value: "cancelled", color: "#999999" }, + { label: "No Show", value: "no_show", color: "#FF4500" } +]; +var ATTENDEE_RESPONSE_OPTIONS = [ + { label: "No Response", value: "no_response", color: "#808080", default: true }, + { label: "Accepted", value: "accepted", color: "#00AA00" }, + { label: "Declined", value: "declined", color: "#FF0000" }, + { label: "Tentative", value: "tentative", color: "#FFA500" } +]; +var RELATED_TO_TYPE_OPTIONS = [ + { label: "Account", value: "crm_account" }, + { label: "Contact", value: "crm_contact" }, + { label: "Opportunity", value: "crm_opportunity" }, + { label: "Lead", value: "crm_lead" }, + { label: "Case", value: "crm_case" } +]; +var DUPLICATE_OF_TYPE_AUTHORABLE_OPTIONS = [ + { label: "Lead", value: "crm_lead" }, + { label: "Contact", value: "crm_contact" } +]; +var DUPLICATE_OF_TYPE_ERASED = "erased"; +var DUPLICATE_OF_TYPE_OPTIONS = [ + ...DUPLICATE_OF_TYPE_AUTHORABLE_OPTIONS, + { label: "Erased Record", value: DUPLICATE_OF_TYPE_ERASED } +]; +var plainOptions = (options) => options.map(({ label, value }) => ({ label, value })); +var LEAD_NEED_TYPE_OPTIONS = [ + { label: "New Implementation", value: "new_implementation" }, + { label: "Expansion", value: "expansion" }, + { label: "Replacement", value: "replacement" }, + { label: "Renewal", value: "renewal" }, + { label: "Consulting", value: "consulting" }, + { label: "Support & Maintenance", value: "support" }, + { label: "Other", value: "other" } +]; + +// src/sales/objects/_territory.ts +var TERRITORY = { + NA: "na", + EMEA: "emea", + OTHER: "other" +}; +var TERRITORY_OPTIONS = [ + { label: "North America", value: TERRITORY.NA, color: "#0070D2" }, + { label: "EMEA", value: TERRITORY.EMEA, color: "#7C3AED" }, + { label: "Other", value: TERRITORY.OTHER, color: "#999999" } +]; +var TERRITORY_FALLBACK = TERRITORY.OTHER; +var TERRITORY_COUNTRIES = { + na: ["US", "CA", "MX"], + emea: ["GB", "DE", "FR", "IT", "ES"] +}; +var COUNTRY_ALIASES = { + "United States": "US", + "United States of America": "US", + USA: "US", + Canada: "CA", + Mexico: "MX", + UK: "GB", + "United Kingdom": "GB", + "Great Britain": "GB", + Germany: "DE", + France: "FR", + Italy: "IT", + Spain: "ES" +}; +var COUNTRY_TERRITORY = (() => { + const map = {}; + for (const [territory, countries] of Object.entries(TERRITORY_COUNTRIES)) { + for (const code of countries) map[code] = territory; + } + for (const [alias, code] of Object.entries(COUNTRY_ALIASES)) { + const territory = map[code]; + if (!territory) { + throw new Error(`COUNTRY_ALIASES: "${alias}" points at "${code}", which no territory covers`); + } + const key = normalizeCountry(alias); + if (map[key] && map[key] !== territory) { + throw new Error(`COUNTRY_ALIASES: "${alias}" collides with an entry mapped to "${map[key]}"`); + } + map[key] = territory; + } + return map; +})(); +function normalizeCountry(value) { + return typeof value === "string" ? value.trim().replace(/\s+/g, " ").toUpperCase() : ""; +} + +// src/sales/objects/account.object.ts +var Account = ObjectSchema4.create({ + name: "crm_account", + label: "Account", + pluralLabel: "Accounts", + icon: "building", + description: "Companies and organizations doing business with us", + // ADR-0090 D1/D7: OWD is an authored decision. Owner + sharing rules (team/territory grants below). + sharingModel: "private", + // ADR-0079: render-only `titleFormat` retired in favor of `nameField`, + // which names a real field. The former template composed two local fields, so + // a `display_title` formula field reproduces it for the record title. + nameField: "display_title", + // Explicit search targets (ADR-0061). REQUIRED because nameField is a + // FORMULA (display_title/full_name): without this, $search auto-defaults to + // the formula field, which isn't a real column, so the lookup picker + global + // search silently return zero. These are real, indexed columns. + searchableFields: ["name", "account_number", "registration_number"], + highlightFields: ["account_number", "name", "type", "owner_id"], + // The record's picture (#1199): the record chrome draws the logo beside the + // title in every account page header. No logo, no picture: the platform + // draws no placeholder or initials in its place. + imageField: "logo", + // Field groups organize the form layout. Array order == display order. + // Each field below opts in via `group: ''`. + fieldGroups: [ + { key: "basic", label: "Basic Information", icon: "building" }, + { key: "financials", label: "Financials", icon: "dollar-sign" }, + // REQ-0003 acceptance 3: the business-profile fields render as their own + // group with NO `record:details` section authored anywhere — the derived + // layout ladder's rung 1 (AGENTS.md: escape hatches are for extreme cases). + { key: "business_profile", label: "Business Profile", icon: "briefcase" }, + { key: "contact_info", label: "Contact Information", icon: "phone" }, + { key: "ownership", label: "Ownership & Status", icon: "users" }, + { key: "branding", label: "Branding", icon: "palette", collapse: "collapsed" }, + { key: "system", label: "System", icon: "settings", collapse: "collapsed" } + ], + fields: { + // ─── Ownership ───────────────────────────────────────────────────── + // + // `owner_id` is the PLATFORM ownership anchor, not an app invention: the + // registry injects exactly this column into every user-owned object + // (`applySystemFields`), and it is the one OWD, sharing rules, owner-scope + // widening and the `is_private` row filter all read. ⛔ Never author a + // SECOND `owner` lookup beside it — reassigning that moves the record in + // every list and report and moves no access at all. + // + // ⚠️ Declared rather than left to injection, which the platform supports + // explicitly ("author-declared fields with the same name always win over + // injection, no overwrite"). Three things only a declaration buys: + // • `os validate` resolves it. An injected column is invisible to every + // author-time rule, so `highlightFields: ['owner_id']` is reported as + // "not a field on this object — silently skipped by every consumer", + // and a CEL predicate reading `record.owner_id` fails outright. + // • the per-object label and `group` survive (an injected field carries + // the generic label "Owner" and no group at all); + // • `trackHistory` survives, so a transfer still renders on the record + // timeline instead of only in the compliance audit log. + // `system: true` keeps the injected marker the platform's own tooling + // reads — notably the clone path, which strips system columns so a copy is + // stamped to the cloner rather than inheriting the source's owner. + // + // No `defaultValue`: the security middleware stamps `owner_id` to the + // acting user on any insert that leaves it empty, and denies one that names + // another user without `allowTransfer` (#3004). That is stronger than a + // field default, which evaluates to nothing on every user-less write. + owner_id: Field4.lookup("sys_user", { + label: "Account Owner", + group: "ownership", + system: true, + readonly: false, + trackHistory: true + }), + // AutoNumber field - Unique account identifier + account_number: Field4.autonumber({ + label: "Account Number", + format: "ACC-{000000}", + group: "basic" + }), + // Basic Information + // + // ⚠️ `unique: true` is declared HERE, on the field, and deliberately NOT as + // a `{ fields: ['name'], unique: true }` entry in `indexes[]` below. The + // field-level form is tenant-scoped — it materializes as + // `(organization_id, name)`, unique WITHIN an organization — while a + // declared index is taken verbatim, i.e. platform-wide. The table form + // means the SECOND organization to create an "Acme Corp" is rejected by the + // database, and account name is also the seed data's external-id / upsert + // key (`src/sales/data/sales.seed.ts`), so it bites the first multi-tenant + // install. The composite also indexes the column, so no separate + // `{ fields: ['name'] }` entry is needed for the `searchableFields` / + // seed-upsert read paths. + name: Field4.text({ + label: "Account Name", + required: true, + storage: { notNull: true }, + searchable: true, + unique: true, + maxLength: 255, + group: "basic" + }), + /** + * Case- and whitespace-folded copy of `name` — the key lead conversion + * matches accounts on. + * + * ### Why a stored column, and not any of the cheaper shapes + * + * ⚠️ Three cheaper fixes are all dead ends, and each is a live platform + * constraint. `test/account-name-normalized-match.test.ts` re-measures every + * one so this note cannot quietly go stale: + * + * - **A flow cannot normalize.** `service-automation`'s `resolveToken` + * understands exactly one function form, `/^(NOW|TODAY)\s*\(\s*\)…/`. + * `{LOWER(x)}`, `{TRIM(x)}` and `{x.toLowerCase()}` all resolve to + * `undefined` (every bare identifier is substituted before the expression + * is evaluated, so no string method is reachable), and an unwrapped + * `LOWER({x})` interpolates literally to `"LOWER(Acme Corp)"`. + * - **A formula field cannot be the match key.** `driver-sql`'s + * `fieldHasColumn` returns false for `type: 'formula'`, so a computed + * value has no physical column and nothing can filter on it. + * - **`$regex` is not an answer.** On `driver-sql` it does not run as a + * regex at all: it compiles to `LIKE '%value%'`, a SUBSTRING match, so + * `"Acme Corp"` also matches `"Not Acme Corp Ltd"`. It cannot collapse + * internal whitespace, the leading wildcard defeats the index, and on the + * in-memory driver it does compile user-controlled text into a `RegExp`. + * + * So the canonical form is established by the PRODUCER at write time — the + * same doctrine `crm_lead.email` / `crm_contact.email` follow — and the + * reader does a plain, indexed equality match. The other side of that + * comparison is `crm_lead.company_normalized`, which exists for the same + * reason: a flow can compare two stored columns, it cannot compute either. + * + * ### What it holds + * + * `name`, trimmed, lower-cased, with runs of internal whitespace collapsed + * to one space. Nothing else — normalize-then-EXACT. Fuzzy matching + * (punctuation folding, legal-suffix stripping, edit distance) is + * deliberately out of scope; it turns a lookup into a ranking problem and + * needs a human review affordance this app does not have. + * + * Derived, never authored: `account.hook.ts` recomputes it on every write + * that carries `name`, and leaves it alone otherwise. `readonly` keeps + * user/API writes off it (INSERT is exempt from the strip and UPDATE strips + * only CALLER-supplied keys, so the hook's own write always survives); + * `hidden` keeps a machine-owned column out of forms and pickers — the same + * pairing `crm_forecast.seed_key` uses. + */ + name_normalized: Field4.text({ + label: "Account Name (Normalized)", + description: "Match key for lead conversion: Account Name lower-cased, trimmed, with internal whitespace collapsed. Maintained by the account_protection hook \u2014 never edit directly.", + readonly: true, + hidden: true, + maxLength: 255, + group: "system" + }), + // ADR-0079 record title (was titleFormat '{account_number} - {name}'). + display_title: Field4.formula({ + label: "Display Title", + expression: F3`record.account_number + " - " + record.name`, + group: "basic" + }), + /** + * The counterparty's registered identity in a government registry. + * + * ⛔ NOT named after one country's registry, and that is the whole design + * constraint (REQ-0003 *Disposition & rationale*). The requirement arrived + * as 社会信用代码 because the customer registers in China; a Japanese install + * writes 法人番号 here, a German one a Handelsregisternummer, a US one an + * EIN. A `unified_social_credit_code` field would carry one country's + * registry in its NAME, where no install can rename it — so the core field + * is generic and the registry it came from is the install's own knowledge. + * + * ⚠️ Distinct from `account_number` above, which is OUR sequence + * (`Field.autonumber`, `ACC-{000000}`) and already spent as half the record + * title. That is an identifier we issue; this is one we were given, and + * invoicing, credit checks and entity resolution key on the latter. + * + * `searchable` + the `searchableFields` entry above is REQ-0003 acceptance + * 1 — the value is findable from global search and the lookup picker. It is + * indexed below for that read path. + * + * ⛔ NOT `unique: true`. Refusing a save because two rows carry the same + * registered identity is a data-quality POLICY, and this repo has already + * chosen the soft shape for that question once — the hard unique on + * `crm_lead.email` was removed because refusing a repeat is worse than + * recording it. The same reasoning `name_normalized` records: a match key, + * not a policy. Deduplication is a review affordance this app does not have. + */ + registration_number: Field4.text({ + label: "Registration Number", + description: "The counterparty's registered identity as issued by its own government registry \u2014 whichever registry that is. Not the Account Number, which we issue.", + searchable: true, + maxLength: 64, + group: "basic" + }), + /** + * What this account may be used for commercially — the category that GATES + * capability rather than merely classifying (REQ-0003, the record's most + * valuable primitive: *some counterparties are payable but not sellable*). + * + * ## Why a field BESIDE `type`, and not four more options on it + * + * REQ-0003 leaves this open ("either new options on `type` or a field + * beside it, decided when built"). It is a separate field because `type` + * is a RELATIONSHIP-STAGE axis — prospect → customer → former, plus + * partner — and it already has two readers that would be broken by a value + * meaning "may not be sold to": `account.hook.ts` promotes on it, and + * `opportunity.hook.ts` flips a won deal's account to `customer`. An + * `agency` option on `type` would therefore be overwritten into `customer` + * by the first won deal booked against it, silently un-restricting the + * account. The two axes are independent — an agency can be a prospect, a + * customer or a former customer — so they are two fields. + * + * ## Generic values only + * + * REQ-0003 rules the customer's own vocabulary (招标代理公司 …) **C**: + * overlay configuration, ⛔ never committed into core. Core ships the + * capability distinction itself; an install maps its market's categories + * onto these two values. + * + * ## What reads it: `opportunity.hook.ts` `beforeInsert` + * + * REQ-0003 is explicit that "a category no rule reads is prose, and the + * rule is the point", so this field ships WITH its reader. The reader is a + * hook, and which construct carries the gate is a maintainer ruling + * (2026-09-16), quoted verbatim and kept untranslated: + * + * 「闸门走 `opportunity.hook.ts` 的 `beforeInsert`,用 hook 的 `ctx.api` 读客户类别。 + * REQ-0003 第 128 行的 `validations[]` 与该记录自己的验收第 2 条冲突,以验收为准。」 + * + * ⛔ Do NOT restate the gate as the `validations[]` entry REQ-0003 line + * 128 names. TWO independent measurements say it cannot be that, and both + * are recorded here because each alone would be talked past: + * + * 1. **It would brick history.** A validation is evaluated against + * `{...previous, ...data}` on EVERY write, so "already linked to a + * restricted account" and "linking now" are the same state and every + * later edit to every historical opportunity would be refused — the + * exact thing REQ-0003 acceptance 2 forbids ("opportunities that + * already point at it keep working and keep being editable"). + * `lead.hook.ts` carries the same finding for its own gate. + * 2. **It cannot read the account at all.** A predicate is evaluated by + * `checkPredicate(rule, merged, previous)` over plain data objects — + * the opportunity's OWN stored columns. `record.crm_account.type` + * does not traverse the lookup (measured: `runtime: No such key: + * type`), and `os.lookup(...)` has no overload because `buildScope()` + * in `@objectstack/formula` composes `os` from only `ctx.user` / + * `ctx.org` / `ctx.env` and never binds `ctx.api` (measured: + * `runtime: found no matching overload for 'dyn.lookup(string, + * dyn)'`; filed upstream as objectstack#18318). An unevaluable + * predicate REJECTS THE WRITE, so authoring it literally refuses + * every opportunity write, insert and update alike. + * + * ⚠️ The hook's `ctx.api` is a DIFFERENT surface from the formula + * `EvalContext.api` that measurement 2 is about, and the two are routinely + * confused. The hook one is live and used ~20 times across + * `src/sales/objects/*.hook.ts`; its shape is `./_hook-api.ts`, pinned + * against a real engine by `test/hook-query-predicate.test.ts` and + * `test/hook-write-shape.test.ts`. objectstack#18318 does not block this + * field. + * + * ⛔ Do NOT "fix" anything here by denormalising this value onto + * `crm_opportunity`: a copy needs a writer and goes stale the moment an + * account is reclassified, and anything able to write the copy is able to + * simply refuse. + */ + commercial_capability: Field4.select({ + label: "Commercial Capability", + group: "basic", + description: "Whether new business may be opened against this account. Settlement Only accounts stay fully usable for billing and payment, but no new opportunity may be linked to them.", + defaultValue: "full", + options: [ + { label: "Full", value: "full", color: "#00AA00", default: true }, + { label: "Settlement Only", value: "settlement_only", color: "#FFA500" } + ] + }), + // Select fields with custom options + type: Field4.select({ + label: "Account Type", + group: "basic", + options: [ + { label: "Prospect", value: "prospect", color: "#FFA500", default: true }, + { label: "Customer", value: "customer", color: "#00AA00" }, + { label: "Partner", value: "partner", color: "#0000FF" }, + { label: "Former Customer", value: "former", color: "#999999" } + ] + }), + industry: Field4.select({ + label: "Industry", + group: "basic", + // Canonical set shared with Lead (#490): lead_conversion copies + // `leadRecord.industry` onto the account it creates, so this must + // accept every Lead value. + options: [...INDUSTRY_OPTIONS] + }), + description: Field4.markdown({ + label: "Description", + group: "basic" + }), + // Number fields + annual_revenue: Field4.currency({ + label: "Annual Revenue", + min: 0, + group: "financials", + trackHistory: true + }), + /** + * Rolled-up annual revenue of this account's direct children. + * + * ⚠️ DIRECT children only, one level — the engine aggregates over the rows + * whose `parent_account` is this account, not over a transitive closure. A + * grandparent shows the sum of its own children, and the docs say so; + * anything else needs a different (and much more expensive) primitive than + * the one the platform ships. + * + * Self-referencing roll-ups are worth measuring rather than assuming, + * because parent and child are the same object and the engine's summary + * index is keyed by child object. `test/decorative-field-sweep.test.ts` + * drives all four legs of the lifecycle (insert, raise, re-parent, delete) + * so a platform regression cannot quietly turn this back into decoration. + */ + child_account_revenue: Field4.summary({ + label: "Child Account Revenue", + group: "financials", + scale: 2, + summaryOperations: { + object: "crm_account", + field: "annual_revenue", + function: "sum", + relationshipField: "parent_account" + } + }), + number_of_employees: Field4.number({ + label: "Employees", + min: 0, + group: "financials" + }), + // ─── Business profile (REQ-0003 step 3) ──────────────────────────── + // + // Generic B2B sales intelligence, not IT-services vocabulary: who holds the + // account today, how much there is to win this year, and how they pay. + // + // ⚠️ `annual_revenue` above answers none of these — it is the account's OWN + // turnover, what the counterparty earns, whereas the budget below is what + // it will SPEND with vendors. Reusing one for the other is the mistake this + // group exists to prevent. + // + // ⚠️ `pnpm validate` reports all three as "carrier-only — declared but + // nothing in this stack reads or displays it", and that reading is EXPECTED + // here rather than a defect to tidy away. The liveness diagnostic counts + // view columns, form sections, page bindings, flow nodes, formulas, hooks + // and actions as sites; it does NOT count `fieldGroups` membership, which + // is precisely the DERIVED layout REQ-0003 acceptance 3 asks for ("render + // as their own group … without any `record:details` section being + // authored"). These are data-entry fields a person fills in and a person + // reads off the derived form. ⛔ Do NOT answer the warning by authoring a + // `record:details` section — that is the escape hatch AGENTS.md reserves + // for a named customer demand, and it would trade acceptance 3 for a + // quieter log. No guard reads this warning. + incumbent_vendor: Field4.text({ + label: "Incumbent Vendor", + description: "The supplier currently holding this account for the spend we are chasing.", + maxLength: 255, + group: "business_profile" + }), + annual_purchasing_budget: Field4.currency({ + label: "Annual Purchasing Budget", + description: "What this account expects to SPEND with vendors this year \u2014 not its own revenue.", + min: 0, + group: "business_profile" + }), + // Payment terms as a select, not free text: it is read by a person sizing + // cash-flow risk, and a picklist keeps that domain knowable. The values are + // the net-terms ladder every B2B install shares; a customer whose contracts + // use a different ladder overlays its own. + payment_cycle: Field4.select({ + label: "Payment Cycle", + group: "business_profile", + options: [ + { label: "Prepaid", value: "prepaid" }, + { label: "Net 30", value: "net_30" }, + { label: "Net 60", value: "net_60" }, + { label: "Net 90", value: "net_90" } + ] + }), + // Contact Information + phone: Field4.text({ + label: "Phone", + format: "phone", + group: "contact_info" + }), + website: Field4.url({ + label: "Website", + group: "contact_info" + }), + // Structured Address field (new field type) + billing_address: Field4.address({ + label: "Billing Address", + group: "contact_info" + }), + /** + * Flat projection of `billing_address.country`. + * + * ### Why the flat column exists — the trap that catches every rule + * ### authored against an `address` + * + * ⚠️ `billing_address` is an `address` field: the platform stores the whole + * {street, city, state, postalCode, country, countryCode, formatted} value + * in ONE column. A sharing rule's CEL condition is compiled to a + * pushdown-able `FilterCondition` by `compileCelToFilter`, and that compiler + * rejects every path reaching INSIDE such a value: + * + * record.billing_address.country in ["US","CA","MX"] + * → unsupported: cross-object/nested field path + * "record.billing_address.country" is not pushdown-able + * + * `plugin-sharing` then refuses to seed the rule rather than degrade it to + * match-all, so the rule is dropped on every boot and its recipients get + * nothing at all. Measured: the blocker is the NESTED PATH, not the + * `in [...]` operator — `in [...]`, `==`, `!=`, `<`, `>`, `&&`, `||`, `!`, + * `startsWith()` and `== null` all compile fine against a FLAT field. + * Rewriting the condition as a disjunction of `==` therefore does NOT help; + * only a flat column does. `test/sharing-seeding.test.ts` measures that + * matrix instead of assuming it. + * + * ### What it holds + * + * `billing_address.country`, trimmed, internal whitespace collapsed, and + * upper-cased — nothing else. It is what was TYPED, so it is still free + * text and still capable of holding `Deutschland`. Nothing matches against + * it: `territory` below classifies it, and an unrecognised spelling lands in + * a stated `other`. `countryCode` is deliberately not consulted; see the + * note in `account.hook.ts` for why the ISO slot is not the input. + * + * Derived, never authored: `account.hook.ts` recomputes it on every write + * that carries `billing_address`, and leaves it untouched otherwise. + */ + billing_country: Field4.text({ + label: "Billing Country", + description: "Derived from Billing Address \u2014 the country exactly as it was entered, trimmed and upper-cased. Territory is classified from it.", + readonly: true, + maxLength: 64, + group: "contact_info" + }), + /** + * Territory — the declared value the territory sharing rules filter on. + * + * ### Why a select and not the country + * + * Matching free-text `billing_country` against a list of country codes + * inside a CEL string means an account whose address reads `United States` + * belongs to NO territory, silently — the metadata says territory sharing + * works and for that account it does nothing, with no error anywhere. A + * `select` makes the domain knowable: three values, declared, every one + * reachable, and an account outside the staffed territories says `other` + * rather than nothing. + * + * It also collapses four copies of the country list (two CEL strings and + * six localised documentation tables) into one authored table in + * `./_territory.ts`. Adding a country is a line there; the sharing rules, + * this picklist and the docs all follow, and + * `test/territory-single-source.test.ts` fails if any of them does not. + * + * ### Readonly, and always stated + * + * Derived by `account_protection` from `billing_address.country`, never + * authored — correcting an account's territory means correcting its + * address, which keeps ONE fact behind the classification. Every insert + * states it (an account with no address at all is `other`), and an update + * that does not carry the address leaves it alone. + */ + territory: Field4.select({ + label: "Territory", + description: "Derived from Billing Address \u2014 the sales territory this account belongs to. Accounts outside the staffed territories are Other.", + readonly: true, + options: [...TERRITORY_OPTIONS], + group: "contact_info" + }), + // Office Location (new field type) + office_location: Field4.location({ + label: "Office Location", + group: "contact_info" + }), + // Relationship fields + /** + * The account hierarchy. `child_account_revenue` below is its one reader — + * the platform computes roll-up summaries itself, so the honest consumer is + * a single declaration rather than hand-written recompute hooks. + */ + parent_account: Field4.lookup("crm_account", { + label: "Parent Account", + description: "Parent company in hierarchy", + group: "ownership" + }), + // Boolean field + is_active: Field4.boolean({ + label: "Active", + defaultValue: true, + group: "ownership", + trackHistory: true + }), + /** + * Where this account stands in its sign-off (REQ-0003 step 5 / acceptance 4). + * + * `readonly`, so only the platform's own approval write reaches it: a + * user's insert or edit that names this column has it stripped (measured + * on 17.7.0 for `approved`, `pending` and `rejected` alike, #2067). + * + * ⛔ NOT a second boolean beside `is_active`, which REQ-0003 rules out by + * name. `is_active` answers "is this account live at all"; this answers + * "has the record been signed off", and collapsing them would make + * deactivating an account indistinguishable from rejecting one. + * + * ⚠️ Ships with NO default, and that is what keeps the gate armed (#2067). + * A new account is born blank, `account_approval` starts on the blank, and + * its approval node opens the request; the node's `approvalStatusField` + * mirror then writes `pending` (plugin-approvals `openNodeRequest`) before + * the create returns; only the create's own response body still shows the + * blank row it inserted. So with approvals in the composition REQ-0003 + * acceptance 4 holds in as many words ("A newly created account sits in a + * pending state, appears in the platform approval inbox …"), and `pending` + * always has a request behind it. Without approvals (a plan or edition + * that omits the capability) nothing opens a request, so nothing writes + * `pending`: the account stays blank and editable instead of reading + * "locked for approval" forever, which is what a shipped `pending` default + * did, since the console derives its lock from this column's value. + * + * ⛔ Do not restore `defaultValue: 'pending'`, nor an option-level + * `default: true` on Pending (the form would preselect it). An install + * that wants no account sign-off ADDS `defaultValue: 'approved'`; the + * flow's start condition is then false for every record and the gate is + * off, switchable and inert. That is the same kind of off switch + * `crm_lead.conversion_approval_status` records, and ⛔ NOT the flow's + * `status`, for the reasons measured in `lead-conversion-approval.flow.ts`. + * + * ⛔ There is deliberately no `not_required` value. Blank already says + * "no request has been opened", and `approved` already spells "nothing to + * decide". + */ + approval_status: Field4.select({ + label: "Approval Status", + group: "ownership", + readonly: true, + trackHistory: true, + options: [ + { label: "Pending", value: "pending", color: "#FFA500" }, + { label: "Approved", value: "approved", color: "#00AA00" }, + { label: "Rejected", value: "rejected", color: "#FF0000" } + ] + }), + // Brand color (new field type) + brand_color: Field4.color({ + label: "Brand Color", + group: "branding" + }), + // Company logo (uploaded image). `accept` / `maxSize` are server-enforced + // from @objectstack 17 — see the note on `crm_product.image`. + logo: Field4.image({ + label: "Company Logo", + group: "branding", + accept: ["image/png", "image/jpeg", "image/svg+xml", "image/webp"], + maxSize: 2 * 1024 * 1024 + }), + // Date field + // + // ⛔ NOT `readonly`, and it must not become readonly. This is the signal + // `at_risk_accounts` and `customer_churn_signals` are built on, and it is + // written by ONE path: another object's hook calling + // `api.object('crm_account').update({ last_activity_date }, …)`. + // + // ⚠️ Platform constraint: `stripReadonlyFields` deletes a readonly key from + // any payload whose CALLER supplied it, for every context that is not + // `isSystem` — and a hook's `ctx.api` is a `ScopedContext` over the ACTING + // USER's execution context, not a system one. So a readonly field a hook + // writes is silently dropped: the engine logs `Field '…' is read-only — + // ignoring incoming change` and the column stays null forever. + // + // ⛔ `crm_campaign_member.added_date` was cited here as a twin and is NOT + // one — it was ruled `readonly: true` in #1667 precisely because its + // writers are INSERTs, which the strip never reaches. THIS field is an + // UPDATE through a hook's `ctx.api`, which is the one shape that cannot be + // `readonly`. Note the rule + // is about the CONTEXT, not about hooks or flows as such — a hook stamping + // its own `ctx.input.data` survives, and a flow survives when its `runAs` + // is `'system'` (measured: `test/readonly-write-semantics.test.ts`, #1429; + // `crm_case.is_sla_violated` is cited elsewhere as a twin of this field + // and is NOT one — its writer is a system flow). This field stays out of + // every form section instead, which is the protection that actually + // holds. `test/activity-recency.test.ts` proves + // the write lands — and fails if the flag comes back. + last_activity_date: Field4.date({ + label: "Last Activity Date", + group: "system" + }), + // ─── Customer Success / Account Health ──────────────────────────── + tier: Field4.select({ + label: "Customer Tier", + group: "ownership", + options: [ + { label: "Strategic", value: "strategic", color: "#7C3AED" }, + { label: "Enterprise", value: "enterprise", color: "#4169E1" }, + { label: "Mid-Market", value: "mid_market", color: "#00AA00" }, + { label: "SMB", value: "smb", color: "#FFA500", default: true } + ] + }), + segment: Field4.select({ + label: "Segment", + group: "ownership", + options: [ + { label: "Net New", value: "net_new" }, + { label: "Growth", value: "growth" }, + { label: "At Risk", value: "at_risk" }, + { label: "Stable", value: "stable" } + ] + }), + health_score: Field4.select({ + label: "Health Score", + group: "ownership", + description: "CSM-maintained health indicator", + options: [ + { label: "Healthy", value: "healthy", color: "#00AA00" }, + { label: "Watching", value: "watching", color: "#FFA500" }, + { label: "At Risk", value: "at_risk", color: "#FF4500" }, + { label: "Churning", value: "churning", color: "#FF0000" } + ] + }) + // ⛔ No account-level renewal model here, on purpose. Renewal is a + // CONTRACT-level process with exactly one home — `crm_contract.end_date` + + // `renewal_notice_days`, swept daily by `src/revenue/flows/contract-renewal.flow.ts`, + // which books the task and notifies the CONTRACT owner; the user-facing + // queue is that object's `renewal_calendar` view. A `renewal_owner` / + // `next_renewal_date` pair here would be declared and inert, telling an + // admin a renewal reaches the CSM they named when nothing would. If an + // account-level renewal owner is ever wanted, it is a change to that flow + // plus a real writer for the date — not a second pair of fields. + }, + // Database indexes for performance + // + // ⚠️ No `{ fields: ['name'], unique: true }` here. Account-name uniqueness is + // declared on the `name` field itself, which the framework builds as the + // tenant composite `(organization_id, name)`. Declaring the single-column + // index too makes the platform-wide constraint win and leaves the per-tenant + // one unreachable (framework#3991 `unique/double-declaration`) — the same + // trap `crm_contact`, `crm_lead` and `crm_product` document. Two + // organizations must be able to each have their own "Acme Corp". + indexes: [ + { fields: ["owner_id"] }, + { fields: ["type", "is_active"] }, + // The territory sharing rules filter on this column, so it is read on every + // account query a territory recipient makes. `billing_country` carries no + // index of its own: nothing filters on it — it is displayed, and classified + // into this column by the hook. + { fields: ["territory"] }, + // Lead conversion filters on this column on every conversion — the column + // exists to replace an unindexed `$regex` scan. Plain index, NOT + // `unique: true`, deliberately: + // + // 1. Per-tenant uniqueness of account names is already declared on the + // `name` field. A unique `name_normalized` would SUBSUME it (equal names + // normalize equally) and force that constraint to be re-decided. + // 2. This column is a MATCH key, not a policy. Rejecting a near-duplicate + // name outright is a separate data-quality decision, and this repo has + // already chosen the soft shape for that question once (the hard unique + // on `crm_lead.email` was removed because refusing a repeat enquiry is + // worse than recording it). + // 3. ⚠️ Measured hazard: `create_index` FAILS on any deployment already + // holding `Acme Corp` and `ACME Corp` separately, so a unique index + // could not be an upgrade step without a merge pass first. That hazard + // is bounded today ONLY because this repo's deployment shape is fresh + // installs — see docs/MAINTENANCE.md §3.3. The conclusion is conditional + // on that premise, not universal. + // + // Consequence, recorded rather than hidden: two accounts CAN still hold the + // same normalized name if something outside the flow creates them, and + // `get_record` has no `sort` option, so the conversion would reuse an + // arbitrary one. Reusing one of N is still better than creating the N+1th. + { fields: ["name_normalized"] }, + // `searchableFields` carries `registration_number`, and the note at the top + // of this file records why those must be real, indexed columns. + { fields: ["registration_number"] } + ], + // API surface + capabilities. `files` and `feeds` are live and enforced (see + // the canonical note in `src/sales/objects/index.ts`). Field history lives on + // individual `Field.trackHistory` (ADR-0052); global search uses + // `searchableFields` / per-field `searchable`. + enable: { + apiEnabled: true, + // Expose via REST/GraphQL + apiMethods: ["get", "list", "create", "update", "delete"], + // Whitelist allowed API operations + // Contracts, org charts and RFPs live on the account record. Opt-in (spec + // default false); attach/download/delete authority is the parent record's + // own, so this adds a surface, not a grant. + files: true + } + // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were + // removed from the platform. Field updates live in this object's `*.hook.ts`; + // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. +}); + +// src/sales/objects/contact.object.ts +import { ObjectSchema as ObjectSchema5, Field as Field5 } from "@objectstack/spec/data"; +import { F as F4 } from "@objectstack/spec"; +var Contact = ObjectSchema5.create({ + name: "crm_contact", + label: "Contact", + pluralLabel: "Contacts", + icon: "user", + description: "People associated with accounts", + // ADR-0090 D1/D7: OWD is an authored decision. Master-detail child of crm_account — inherits the account's sharing. + sharingModel: "controlled_by_parent", + fieldGroups: [ + { key: "identity", label: "Identity", icon: "user" }, + { key: "account_info", label: "Account & Title", icon: "briefcase" }, + { key: "buying_centre", label: "Buying Centre", icon: "users" }, + { key: "contact_info", label: "Contact Information", icon: "phone" }, + { key: "mailing_address", label: "Mailing Address", icon: "map-pin", collapse: "collapsed" }, + { key: "additional", label: "Additional Info", icon: "info", collapse: "collapsed" }, + { key: "preferences", label: "Communication Preferences", icon: "bell-off", collapse: "collapsed" } + ], + fields: { + // Platform ownership anchor — canonical note in `account.object.ts` (#548). + owner_id: Field5.lookup("sys_user", { + label: "Contact Owner", + group: "account_info", + system: true, + readonly: false, + trackHistory: true + }), + // Name fields + salutation: Field5.select({ + label: "Salutation", + group: "identity", + // Canonical set shared with Lead (#490) — see _picklists.ts. + options: [...SALUTATION_OPTIONS] + }), + first_name: Field5.text({ + label: "First Name", + required: true, + storage: { notNull: true }, + searchable: true, + group: "identity" + }), + last_name: Field5.text({ + label: "Last Name", + required: true, + storage: { notNull: true }, + searchable: true, + group: "identity" + }), + // Formula field - Full name + // `salutation` is a picklist, so the formula sees the raw VALUE (`ms`, `dr`), + // not the label — names rendered as "ms Emily Davis" in lists and details + // (#461). The formula language has no proper-case or option-label lookup, and + // hardcoding "Ms." would defeat translation, so the name is built from the + // name fields alone; salutation stays its own (translated) field. + full_name: Field5.formula({ + label: "Full Name", + expression: F4`joinNonEmpty([record.first_name, record.last_name], ' ')`, + group: "identity" + }), + // Avatar field. `accept` / `maxSize` are server-enforced from + // @objectstack 17 — see the note on `crm_product.image`. + avatar: Field5.avatar({ + label: "Profile Picture", + group: "identity", + accept: ["image/png", "image/jpeg", "image/webp"], + maxSize: 2 * 1024 * 1024 + }), + // Relationship: Link to Account (Master-Detail) + crm_account: Field5.masterDetail("crm_account", { + label: "Account", + required: true, + storage: { notNull: true }, + deleteBehavior: "cascade", + // Delete contacts when account is deleted + group: "account_info" + }), + // Professional Information + title: Field5.text({ + label: "Job Title", + group: "account_info" + }), + department: Field5.select({ + label: "Department", + group: "account_info", + options: [ + { label: "Executive", value: "executive" }, + { label: "Sales", value: "sales" }, + { label: "Marketing", value: "marketing" }, + { label: "Engineering", value: "engineering" }, + { label: "Support", value: "support" }, + { label: "Finance", value: "finance" }, + { label: "Human Resources", value: "hr" }, + { label: "Operations", value: "operations" } + ] + }), + // ── Buying centre (REQ-0004) ───────────────────────────────────────── + // + // The three attributes that turn an account's contact list from a + // DIRECTORY into a MAP: what this person does in the purchase decision, + // where they stand on us, and how strong our relationship with them is. + // `title` above is the employer's job title and `is_primary` below is a + // one-bit answer to "who do we call" — neither of them is this fact. + // + // ⛔ Read by people and by reporting, never by a gate. No hook, no flow + // and no validation is authored against any of the three, none is + // `required`, and none carries an option `default`: a contact with all + // three blank saves exactly as it did before this group existed + // (REQ-0004 acceptance 4). They are sales intelligence, and AGENTS.md + // metadata semantics rule 8 is what keeps a machine signal from refusing + // a write. + // ⚠️ `buying_function`, not `buying_role` — and 'Buying Function', not + // 'Buying Role'. `security-role-word` (an author-time rule, ADR-0090 D3) + // refuses the word `role` on BOTH, measured on this branch as two + // successive `pnpm validate` exit-1 runs: first the field name, then the + // label, because "admins must meet ONE vocabulary" and `role` is the + // platform's security vocabulary (permission_set / position / + // business_unit). Its own remedy prescribes the replacement used here — + // "a domain word (e.g. 'function', 'duty')". + // + // The rule's surface is the ENGLISH one it can read: it matches + // `/\brole(s)?\b/i` over object/field/action/permission-set/position/app + // declarations and does not reach the locale packs. So the three + // non-English packs keep the natural business term for this concept in + // their own language (zh-CN 采购角色, es-ES Rol de Compra, ja-JP 購買役割) + // — same fact, each written the way its reader says it. + buying_function: Field5.select({ + label: "Buying Function", + group: "buying_centre", + // SINGLE-valued, and REQ-0004 left that call to the implementing PR. + // `multiple: true` would cost the field the property acceptance 2 asks + // for: `GroupingConfigSchema` (`@objectstack/spec/ui`, the installed + // pin) answers a grouped list with ONE server-side aggregate query, and + // its `GroupingFieldSchema.field` says the group header "carries its + // raw stored value" — so a multi-valued column groups by the + // COMBINATION. `decision_maker` + `user` would become a group of its + // own instead of feeding both, which is the opposite of reading an + // account as a map. A person who is genuinely two things is recorded as + // the role that governs THIS decision; the second one is already + // legible from `title` / `department`. + // + // The six are the generic buying-centre slots every industry reads the + // same way — ⛔ deliberately not one company's role model. + options: [ + { label: "Decision Maker", value: "decision_maker" }, + { label: "Economic Buyer", value: "economic_buyer" }, + { label: "Technical Evaluator", value: "technical_evaluator" }, + { label: "User", value: "user" }, + { label: "Influencer", value: "influencer" }, + { label: "Gatekeeper", value: "gatekeeper" } + ] + }), + attitude: Field5.select({ + label: "Attitude to Us", + group: "buying_centre", + // ORDERED, most to least favourable — declaration order IS the order a + // picklist and a grouped list present, so the ladder is authored rather + // than described. A blank means nobody has formed a view yet, which is + // a different fact from `neutral`. + options: [ + { label: "Champion", value: "champion" }, + { label: "Supportive", value: "supportive" }, + { label: "Neutral", value: "neutral" }, + { label: "Skeptical", value: "skeptical" }, + { label: "Blocker", value: "blocker" } + ] + }), + relationship_strength: Field5.select({ + label: "Relationship Strength", + group: "buying_centre", + // ORDERED, weakest to strongest. ⛔ Not a free-text score, and ⛔ not + // derived from `last_contacted_date` below: recency is machine-written + // and measures something else — a weekly call with someone who will not + // take our side is not a strong relationship. A blank means unassessed; + // `distant` is an assessment that came back weak. + options: [ + { label: "Distant", value: "distant" }, + { label: "Acquaintance", value: "acquaintance" }, + { label: "Working Relationship", value: "working" }, + { label: "Strong", value: "strong" }, + { label: "Trusted Advisor", value: "trusted_advisor" } + ] + }), + // No `reports_to`. The org chart was declared and never built: no page + // rendered the tree the contact docs promised, no skill read the chain when + // summarising an account, and no flow escalated along it. Sharing derives + // from the master `crm_account`, never from this lookup. + // Contact Information + email: Field5.email({ + label: "Email", + required: true, + storage: { notNull: true }, + unique: true, + group: "contact_info" + }), + phone: Field5.text({ + label: "Phone", + format: "phone", + group: "contact_info" + }), + mobile: Field5.text({ + label: "Mobile", + format: "phone", + group: "contact_info" + }), + // Mailing Address — one structured `address` value, the same shape as + // `crm_account.billing_address` and `crm_lead.address`, because a postal + // address is one fact and AGENTS.md's field-type guidance names + // `Field.address()` for it (ruling on #1836; it replaced five flat + // `mailing_*` text fields, converted by `scripts/backfill-contact-mailing-address.ts`). + mailing_address: Field5.address({ + label: "Mailing Address", + group: "mailing_address" + }), + // Additional Information + // + // No `birthdate`. Nothing greeted, segmented or reported on it, and an + // importable date of birth with no consumer is personal data held for no + // stated purpose — the one field on this object where "declared but inert" + // also carries a data-protection cost. + lead_source: Field5.select({ + label: "Lead Source", + group: "additional", + // Canonical set shared with Lead + Opportunity (#490) — a converted + // lead's source must remain representable on the contact. + options: [...LEAD_SOURCE_OPTIONS] + }), + description: Field5.markdown({ + label: "Description", + group: "additional" + }), + // Flags + is_primary: Field5.boolean({ + label: "Primary Contact", + defaultValue: false, + description: "Is this the main contact for the account?", + group: "preferences" + }), + do_not_call: Field5.boolean({ + label: "Do Not Call", + defaultValue: false, + group: "preferences" + }), + email_opt_out: Field5.boolean({ + label: "Email Opt Out", + defaultValue: false, + group: "preferences" + }), + // Interaction recency for the PERSON (#592). `crm_account` carries + // `last_activity_date` for the company and `crm_lead` carries + // `last_contacted_date` for a prospect; the contact — the record a rep + // actually calls and emails — had neither, so "when did anyone last speak + // to our champion?" was unanswerable. + // + // Written by the activity bubble in `event.hook.ts` / `task.hook.ts` and by + // `send_email`. Deliberately NOT `readonly`: a readonly field is stripped + // from every non-system write whose caller supplied the key (#2948), which + // is exactly how the account and lead columns above ended up permanently + // null. It is kept off the form sections instead. + last_contacted_date: Field5.datetime({ + label: "Last Contacted", + group: "additional" + }) + }, + // Enable features + // API surface. History → Field.trackHistory (ADR-0052). + enable: { + apiEnabled: true, + // #602 — signed NDAs, business cards, meeting notes attach to the person. + // See the canonical capability note in `src/sales/objects/index.ts`. + files: true + }, + // Database indexes for performance + // + // NOTE: no `{ fields: ['email'], unique: true }` here. Email uniqueness is + // declared on the field itself (`unique: true`), which since framework #3696 + // materializes as the tenant composite `(organization_id, email)` — unique + // WITHIN an organization, which is what a multi-tenant CRM wants (two orgs + // may each know john@acme.com). A declared single-column index is taken + // verbatim, i.e. platform-wide, so declaring both left the global index + // enforcing the old behaviour and the per-tenant constraint unreachable + // (framework#3991 `unique/double-declaration`). + indexes: [ + { fields: ["crm_account"] }, + { fields: ["owner_id"] }, + { fields: ["last_name", "first_name"] } + ], + // Display configuration. ADR-0079 `nameField` names the real field holding + // the record title — here the `full_name` formula field defined above. + nameField: "full_name", + // Explicit search targets (ADR-0061). REQUIRED because nameField is a + // FORMULA (display_title/full_name): without this, $search auto-defaults to + // the formula field, which isn't a real column, so the lookup picker + global + // search silently return zero. These are real, indexed columns. + searchableFields: ["first_name", "last_name", "email"], + highlightFields: ["full_name", "email", "crm_account", "phone"] + // ⚠️ No standalone `type: 'unique'` validation exists on this platform + // (ADR-0032 validation union). Email uniqueness is enforced by the + // field-level `unique: true` above, scoped per organization. + // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were + // removed from the platform. Field updates live in this object's `*.hook.ts`; + // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. +}); + +// src/sales/objects/event.object.ts +import { P as P4 } from "@objectstack/spec"; +import { ObjectSchema as ObjectSchema6, Field as Field6 } from "@objectstack/spec/data"; +var Event = ObjectSchema6.create({ + name: "crm_event", + label: "Event", + pluralLabel: "Events", + icon: "calendar-days", + description: "Meetings, calls and other scheduled interactions with customers", + // ADR-0090 D1/D7: OWD is an authored decision. Mirrors `crm_task`: an event + // is a personal activity record, owned by the rep who ran it. + sharingModel: "private", + fieldGroups: [ + { key: "basic", label: "Event Information", icon: "info" }, + { key: "schedule", label: "Schedule", icon: "calendar" }, + { key: "related", label: "Related Records", icon: "link" }, + { key: "outcome", label: "Outcome", icon: "clipboard-check", collapse: "collapsed" } + ], + fields: { + // Platform ownership anchor — canonical note in `account.object.ts` (#548). + owner_id: Field6.lookup("sys_user", { + label: "Assigned To", + group: "basic", + system: true, + readonly: false, + trackHistory: true + }), + // ─── Event Information ──────────────────────────────────────────── + subject: Field6.text({ + group: "basic", + label: "Subject", + required: true, + storage: { notNull: true }, + searchable: true, + maxLength: 255 + }), + type: Field6.select({ + group: "basic", + label: "Event Type", + required: true, + storage: { notNull: true }, + // Field-level default, not just the option flag: the option `default` + // only preselects in some form surfaces, so a quick-create opened from a + // related list left this required field blank (same defect crm_task.status + // carries a note about). + defaultValue: "meeting", + options: [...EVENT_TYPE_OPTIONS] + }), + status: Field6.select({ + group: "basic", + label: "Status", + required: true, + storage: { notNull: true }, + trackHistory: true, + defaultValue: "planned", + options: [...EVENT_STATUS_OPTIONS] + }), + description: Field6.markdown({ + group: "basic", + label: "Description" + }), + // ─── Schedule ───────────────────────────────────────────────────── + start_datetime: Field6.datetime({ + group: "schedule", + label: "Start", + required: true, + storage: { notNull: true } + }), + end_datetime: Field6.datetime({ + group: "schedule", + label: "End" + }), + all_day: Field6.boolean({ + group: "schedule", + label: "All Day Event", + defaultValue: false + }), + // Derived in `event.hook.ts` from start/end. NOT `readonly`: the field is + // also what the activity actions supply directly when a rep logs a call + // that took 20 minutes, and a readonly field is stripped from any write + // whose CALLER supplied the key (#2948) — including an action body running + // under the rep's own context. Derivation inside this object's own + // before-hook is unaffected either way (the strip keys off the caller's + // payload, not the post-hook document), so leaving it writable costs + // nothing and keeps `log_call` honest. + duration_minutes: Field6.number({ + group: "schedule", + label: "Duration (minutes)", + min: 0, + scale: 0 + }), + location: Field6.text({ + group: "schedule", + label: "Location", + maxLength: 255, + description: "Room, address, or meeting link" + }), + // ─── Related Records (polymorphic, same shape as crm_task) ───────── + related_to_type: Field6.select({ + group: "related", + label: "Related To Type", + options: [...RELATED_TO_TYPE_OPTIONS] + }), + related_to_account: Field6.lookup("crm_account", { + group: "related", + label: "Related Account" + }), + related_to_contact: Field6.lookup("crm_contact", { + group: "related", + label: "Related Contact" + }), + related_to_opportunity: Field6.lookup("crm_opportunity", { + group: "related", + label: "Related Opportunity" + }), + related_to_lead: Field6.lookup("crm_lead", { + group: "related", + label: "Related Lead" + }), + related_to_case: Field6.lookup("crm_case", { + group: "related", + label: "Related Case" + }), + // ─── Outcome ────────────────────────────────────────────────────── + outcome_notes: Field6.markdown({ + group: "outcome", + label: "Outcome Notes", + description: "What was agreed, and what happens next" + }) + // No `is_past` / `is_upcoming` boolean. A write-time snapshot of "has this + // happened yet" is stale the moment the clock passes it, and the app has + // already been burnt by exactly that (`crm_task.is_overdue` — see the + // `overdue_tasks` view's label note). `status` is the authored, non-decaying + // signal, and the upcoming/past views filter on it and sort by + // `start_datetime` instead. + }, + // API surface. History → Field.trackHistory (ADR-0052). + enable: { + apiEnabled: true + }, + indexes: [ + { fields: ["start_datetime"] }, + { fields: ["owner_id"] }, + { fields: ["status"] }, + { fields: ["related_to_account"] }, + { fields: ["related_to_opportunity"] } + ], + // ADR-0079: `nameField` names the real field holding the record title. + nameField: "subject", + highlightFields: ["subject", "type", "status", "start_datetime", "owner_id"], + searchableFields: ["subject", "location"], + // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the + // rule returns a verdict even when the merged record has no such key. See + // AGENTS.md "Validation predicates must be TOTAL" and + // test/object-validation-predicates.test.ts, which fails the build otherwise. + validations: [ + { + name: "end_after_start", + type: "script", + severity: "error", + message: "The end time must be after the start time", + // BOTH guards, on both operands, because they answer different hazards + // (AGENTS.md "Validation predicates must be TOTAL"): + // · `has(...)` — absent key. On a driver that stores only the columns + // a row was written with, an absent `end_datetime` aborts the whole + // predicate under strict CEL, and from 17.0.0-rc.2 that abort REJECTS + // the save rather than skipping the rule (#4649). + // · `!= null` — present-but-null. `dyn < dyn` aborts too, and + // `has()` says nothing about it. + // An ordering comparison needs both; neither substitutes for the other. + condition: P4`has(record.start_datetime) && has(record.end_datetime) && record.start_datetime != null && record.end_datetime != null && !isBlank(record.end_datetime) && record.end_datetime < record.start_datetime` + }, + { + name: "related_to_required", + type: "script", + severity: "warning", + message: "At least one related record should be selected", + condition: P4`(!has(record.related_to_account) || isBlank(record.related_to_account)) && (!has(record.related_to_contact) || isBlank(record.related_to_contact)) && (!has(record.related_to_opportunity) || isBlank(record.related_to_opportunity)) && (!has(record.related_to_lead) || isBlank(record.related_to_lead)) && (!has(record.related_to_case) || isBlank(record.related_to_case))` + } + ] +}); + +// src/sales/objects/event_attendee.object.ts +import { expression } from "@objectstack/spec"; +import { ObjectSchema as ObjectSchema7, Field as Field7 } from "@objectstack/spec/data"; +var ATTENDEE_RESOLUTIONS = [ + { value: "contact", column: "crm_contact", label: "Contact", color: "#4169E1" }, + { value: "lead", column: "crm_lead", label: "Lead", color: "#FFA500" }, + { value: "user", column: "sys_user", label: "User", color: "#00AA00" }, + { value: "external", column: "external_name", label: "External", color: "#8A8A8A" } +]; +var DEFAULT_ATTENDEE_TYPE = "contact"; +var blank = (f) => `(!has(record.${f}) || isBlank(record.${f}))`; +var filled = (f) => `(has(record.${f}) && !isBlank(record.${f}))`; +var typeIs = (v) => `(has(record.attendee_type) && record.attendee_type == "${v}")`; +var typeIsNot = (v) => `(has(record.attendee_type) && record.attendee_type != "${v}")`; +var RESOLVES_CONDITION = ATTENDEE_RESOLUTIONS.map((r) => `(${typeIs(r.value)} && ${blank(r.column)})`).join(" || "); +var EXCLUSIVE_CONDITION = ATTENDEE_RESOLUTIONS.map((r) => `(${filled(r.column)} && ${typeIsNot(r.value)})`).join(" || "); +var partyFormHints = (column) => { + const resolution = ATTENDEE_RESOLUTIONS.find((r) => r.column === column); + if (!resolution) { + throw new Error(`No attendee resolution declares the column "${column}"`); + } + return { + requiredWhen: expression(typeIs(resolution.value), "cel") + }; +}; +var EventAttendee = ObjectSchema7.create({ + name: "crm_event_attendee", + label: "Event Attendee", + pluralLabel: "Event Attendees", + icon: "users", + description: "A person invited to or present at an event", + sharingModel: "controlled_by_parent", + // ADR-0079: junction rows have no derivable text title; point the canonical + // nameField at the stored autonumber explicitly (autonumber is not in the + // auto-derivation whitelist). + nameField: "attendee_number", + highlightFields: ["crm_event", "attendee_type", "response", "is_organizer"], + fieldGroups: [ + { key: "basic", label: "Attendee", icon: "user" }, + { key: "response", label: "Invitation", icon: "mail-check" } + ], + fields: { + attendee_number: Field7.autonumber({ + group: "basic", + label: "Attendee Number", + format: "EA-{00000}" + }), + // ⚠️ Deliberately left on the spec default, and NOT cascaded with the party + // lookups below. Because it is REQUIRED, the engine escalates the stored + // `set_null` to a refusal at delete time, with a message naming the real + // obstacle instead of an unrelated rule: "Cannot delete crm_event (...): 3 + // dependent crm_event_attendee record(s) reference it via crm_event + // (crm_event is required, so it cannot be cleared)." That is the correct + // answer on this side, for the same reason `crm_campaign_member.crm_campaign` + // keeps it: a meeting's attendee list is the meeting's historical record, + // not a per-person artefact. `test/event-attendee-cascade.test.ts` pins the + // resolved value so a copy-paste of the three cascades cannot reach here. + crm_event: Field7.lookup("crm_event", { + group: "basic", + label: "Event", + required: true, + storage: { notNull: true } + }), + // The discriminator says which of the four columns below is the live one. It + // is authored rather than derived so a query can filter "internal attendees + // only" without four OR'd null checks. The options are GENERATED from the + // resolution table rather than retyped — see the note at the top of this + // file for why the pairing is declared once. + attendee_type: Field7.select({ + group: "basic", + label: "Attendee Type", + required: true, + storage: { notNull: true }, + defaultValue: DEFAULT_ATTENDEE_TYPE, + options: ATTENDEE_RESOLUTIONS.map((r) => ({ + label: r.label, + value: r.value, + color: r.color, + ...r.value === DEFAULT_ATTENDEE_TYPE ? { default: true } : {} + })) + }), + // ⛔ `deleteBehavior: 'cascade'` on ALL THREE party lookups, not the default. + // + // ⚠️ Platform constraint: a lookup defaults to `set_null`, and the engine + // implements `set_null` by UPDATING the row that holds it. On a column a + // validation rule reads, that makes the referenced party permanently + // UNDELETABLE: clearing this column leaves the row the engine just edited in + // violation of `attendee_resolves` below, and the whole delete rolls back + // with an error naming an object the caller never addressed. The same + // construction bites `crm_campaign_member`. + // + // `external_name` is the fourth resolution, but it is blank on every row the + // product actually writes (`src/sales/actions/activity-actions.ts` logs attendees + // with a party reference and never an external name), so it rescues nothing. + // + // Cascade rather than `restrict`: an attendee row is a JUNCTION whose whole + // meaning is "this person was in this room". Once the person is gone the row + // denotes nothing, and the query it exists to serve ("meetings this person + // attended") has lost its subject. `restrict` would produce an accurate + // message but keep the person undeletable until someone deleted their + // attendance by hand, and undeletable PEOPLE is the impact being fixed. + // Cascade also leaves no reachable state in which a stored attendee row + // breaks its own object's rule. + crm_contact: Field7.lookup("crm_contact", { + group: "basic", + label: "Contact", + deleteBehavior: "cascade", + description: "Set when the attendee is an existing customer contact", + ...partyFormHints("crm_contact") + }), + crm_lead: Field7.lookup("crm_lead", { + group: "basic", + label: "Lead", + deleteBehavior: "cascade", + description: "Set when the attendee is still an unconverted lead", + ...partyFormHints("crm_lead") + }), + // `sys_user` gets the SAME answer as the two CRM parties, and it was worth a + // second look rather than a copy-paste: + // + // · Deleting a user is a real, reachable operation. Generic CRUD delete on + // the identity table is off (`sys_user` ships `apiMethods: ['get', + // 'list', 'update', 'bulk']`), but better-auth's own routes — + // `/api/v1/auth/delete-user`, which the platform's `sys_user` object + // surfaces as the "Delete My Account" record action, and + // `/api/v1/auth/admin/remove-user` — resolve `user` to `sys_user` and + // land on `dataEngine.delete(...)`, i.e. the SAME ObjectQL delete that + // runs the referential pass. So `set_null` here is not dormant: it breaks + // account erasure for any colleague who ever attended a meeting. + // · The app's shipped stance is already "a deleted user's references + // degrade". EVERY other `sys_user` lookup in HotCRM (every `owner_id`, + // plus `product_manager`) is `set_null` and NO validation rule reads any + // of them — the rule below is the only one in the app that reads a user + // reference at all, which is precisely why this is the only lookup where + // the default misbehaves. `restrict` here would make this junction the + // ONE app row able to veto a platform identity erasure — an app object + // holding a `protection: { lock: 'full' }`, better-auth-managed table + // hostage, surfacing as an opaque failure from an auth route. That is a + // layering inversion, not a fix. + // · The cost of cascade is bounded and is the right half to lose: the + // meeting itself (`crm_event` — subject, times, outcome notes) survives + // untouched; only the per-person row goes, and it goes because the + // person's identity record was erased. Deactivation, not deletion, is the + // ordinary offboarding path (the platform ships ban/unban), and it + // touches nothing here. + sys_user: Field7.lookup("sys_user", { + group: "basic", + label: "User", + deleteBehavior: "cascade", + description: "Set when the attendee is a colleague", + ...partyFormHints("sys_user") + }), + // Free text is the LAST resort, not the default: it exists only for the + // genuinely unmodelled guest (a prospect's lawyer who is in no CRM object). + // It is the resolution of ONE attendee type — `external` — and the rules + // below enforce that both ways: an `external` row must fill it, and no + // other type may. It is not a place to paste a list, and not a note field + // to hang off a Contact row. + external_name: Field7.text({ + group: "basic", + label: "External Attendee", + maxLength: 255, + description: "Name of an attendee who is in no CRM object \u2014 set when Attendee Type is External", + ...partyFormHints("external_name") + }), + response: Field7.select({ + group: "response", + label: "Response", + required: true, + storage: { notNull: true }, + trackHistory: true, + defaultValue: "no_response", + options: [...ATTENDEE_RESPONSE_OPTIONS] + }), + is_organizer: Field7.boolean({ + group: "response", + label: "Organizer", + defaultValue: false + }), + // ⛔ NOT `readonly` — but the cross-reference this note used to carry is + // retired, not merely reworded: `crm_campaign_member.added_date` was ruled + // `readonly: true` in #1667, so it is no longer a precedent for keeping an + // insert-stamped column open, and the reason it cited ("the engine strips a + // readonly key the CALLER supplied") does not reach an INSERT at all — the + // strip is an UPDATE-path rule (`test/readonly-write-semantics.test.ts`). + // What holds it open is now MEASURED (#1747, the per-writer census #1435 + // ran for the other three), not "nobody has ruled on it": this column has a + // user-context UPDATE writer, which none of the three columns #1666 / #1667 + // moved had. The census, in full: + // • the fifteen generated activity actions (5 `ACTIVITY_TARGETS` × 3 + // kinds, one shared body in `activity-actions.ts`) INSERT it, and an + // action body runs `isSystem` — exempt twice over; + // • the two `service.seed.ts` attendee seeds write it, and their + // `mode: 'upsert'` replay UPDATE is exempt too, because seed writes are + // `isSystem` (`flow-scheduled.test.ts` pins that via ownerless rows); + // • the record form — `event_attendee.view.ts` lists it in the + // `invitation` section, AUTHORED rather than synthesized, and the four + // profiles that name the object all grant `allowEdit`. A rep correcting + // Invited on a saved row is a non-`isSystem` UPDATE carrying a + // caller-supplied key: precisely what the strip deletes. The three + // flipped columns appear in NO form section anywhere in `src/*/views/`, + // `crm_opportunity`'s authored form included. + // ⭐ It is also not the same KIND of column. `added_date` / `approved_date` + // are stamped `{NOW()}` by the writer, so their value IS the write moment; + // `invited_date` records when the invitation went out, and the seed dates it + // 3-10 days before its own event, per row. A column whose value is not the + // write moment is one a person can be right about. ⛔ Do not flip it on the + // strength of the sibling ruling. + invited_date: Field7.datetime({ + group: "response", + label: "Invited" + }) + }, + indexes: [ + { fields: ["crm_event"] }, + { fields: ["crm_contact"] }, + { fields: ["sys_user"] } + ], + // ⚠️ Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so + // the rule returns a verdict even when the merged record has no such key. See + // AGENTS.md "Validation predicates must be TOTAL" and + // test/object-validation-predicates.test.ts, which fails the build otherwise. + // + // Both rules are GENERATED from `ATTENDEE_RESOLUTIONS` at the top of this + // file. ⚠️ `expression(..., 'cel')` is the same envelope the ``P`…` `` tag + // produces, but the tag JSON-quotes an interpolated string and so cannot + // splice a source fragment — which is why these use the function form. The + // pairing is declared once and read twice; see the note up there. + validations: [ + // The type's own column must be filled. + { + name: "attendee_resolves", + type: "script", + severity: "error", + message: "An attendee must fill the party its Attendee Type names \u2014 a Contact row needs a Contact, an External row needs an External Attendee name", + condition: expression(RESOLVES_CONDITION, "cel") + }, + // …and no other column may be filled. The separate rule is deliberate: one + // condition, one wording. Folding both into `attendee_resolves` would make + // its message a lie for half the rows it rejects, and "you filled the wrong + // column" is not the same instruction as "you filled nothing". + { + name: "attendee_type_exclusive", + type: "script", + severity: "error", + message: "An attendee names exactly one party \u2014 clear every party column its Attendee Type does not name", + condition: expression(EXCLUSIVE_CONDITION, "cel") + } + ] +}); + +// src/sales/objects/forecast.object.ts +import { ObjectSchema as ObjectSchema8, Field as Field8 } from "@objectstack/spec/data"; +import { F as F5, P as P5 } from "@objectstack/spec"; +var Forecast = ObjectSchema8.create({ + name: "crm_forecast", + label: "Forecast", + pluralLabel: "Forecasts", + icon: "trending-up", + description: "Periodic pipeline snapshot by owner used for revenue forecasting.", + // OWD is an authored decision (ADR-0090 D1/D7). Forecasts are personal to the + // owner. + sharingModel: "private", + // ADR-0079 record title. ⚠️ A formula cannot dot-walk a lookup (ADR-0072), so + // `display_title` composes local fields only: period_label + (period_start). + nameField: "display_title", + // ⚠️ Explicit search targets (ADR-0061), REQUIRED because `nameField` is a + // FORMULA: without this, `$search` auto-defaults to the formula field, which + // is not a real column, so the lookup picker and global search silently + // return zero. These are real, indexed columns. + searchableFields: ["period_label"], + highlightFields: ["owner_id", "period", "period_start", "commit_amount", "closed_amount"], + fieldGroups: [ + { key: "basic", label: "Snapshot", icon: "info" }, + { key: "amounts", label: "Amounts", icon: "dollar-sign" }, + { key: "meta", label: "Source", icon: "database", collapse: "collapsed" } + ], + fields: { + // Platform ownership anchor — canonical note in `account.object.ts` (#548). + owner_id: Field8.lookup("sys_user", { + label: "Owner", + group: "basic", + system: true, + readonly: false, + trackHistory: true + }), + period: Field8.select({ + label: "Period", + required: true, + storage: { notNull: true }, + group: "basic", + options: [ + { label: "Month", value: "month", default: true }, + { label: "Quarter", value: "quarter" } + ] + }), + // Wording mirrors the two refusal messages this field is bound by + // (`period_start_first_of_period` / `quarter_starts_on_quarter_boundary`, + // both below) so the form and the rejection agree on the same rule + // instead of describing two different ones (#1085). + period_start: Field8.date({ + label: "Period Start", + description: "Must be the first day of the period \u2014 e.g. 2026-08-01 for Aug 2026. A quarterly forecast must additionally start on a quarter boundary: January 1, April 1, July 1 or October 1.", + required: true, + storage: { notNull: true }, + group: "basic" + }), + // Still not read-only: `forecast.hook.ts` fills it only when the write + // leaves it unset, and `src/sales/data/forecast.seed.ts` hand-fills it on every + // seeded row — so hand-entry is a capability this app uses. A hand-filled + // value is pinned to the same calendar period `period_start` is + // (`period_end_matches_calendar_period` below), and the description states + // that rule rather than the weaker `period_end_after_start` it subsumes: + // the form says what is actually enforced. + period_end: Field8.date({ + label: "Period End", + description: "Normally derived automatically from Period and Period Start. If set by hand, it must be the last day of that period \u2014 e.g. 2026-09-30 for a quarter starting 2026-07-01, or 2026-08-31 for Aug 2026.", + required: true, + storage: { notNull: true }, + group: "basic" + }), + period_label: Field8.text({ + label: "Period Label", + description: 'Human-friendly label, e.g. "Q3 2026" or "Aug 2026".', + group: "basic" + }), + // ADR-0079 record title. ⚠️ A formula cannot dot-walk a lookup (ADR-0072), + // so this composes local fields only; `period_start` (a date) is + // string()-coerced for concat. + // + // ⚠️ The coercion is `string()`, NOT `text()`. `text` is not a registered + // CEL function — it is absent from `CEL_STDLIB_FUNCTIONS` — so a formula + // using it faults at runtime and leaves the record's `nameField` null. The + // author-time `expression-invalid` rule now REPORTS it ("found no matching + // overload for 'text(dyn)'") instead of letting a broken formula through to + // null silently. `string` is the catalog's coercion, alongside + // `int`/`bool`/`double`/`timestamp`. + display_title: Field8.formula({ + label: "Display Title", + expression: F5`record.period_label + " (" + string(record.period_start) + ")"`, + group: "basic" + }), + snapshot_date: Field8.date({ + label: "Snapshot Date", + description: "The day this snapshot was captured.", + required: true, + storage: { notNull: true }, + group: "meta" + }), + quota: Field8.currency({ + label: "Quota", + min: 0, + group: "amounts", + trackHistory: true + }), + pipeline_amount: Field8.currency({ + label: "Pipeline", + description: "Sum of all open opportunities closing in this period (any stage).", + min: 0, + group: "amounts" + }), + best_case_amount: Field8.currency({ + label: "Best Case", + description: "Open opportunities in the Best Case or Commit forecast category.", + min: 0, + group: "amounts" + }), + commit_amount: Field8.currency({ + label: "Commit", + description: "Open opportunities in the Commit forecast category (owner-committed).", + min: 0, + group: "amounts" + }), + closed_amount: Field8.currency({ + label: "Closed Won", + description: "Already-closed-won amount in this period.", + min: 0, + group: "amounts" + }), + expected_amount: Field8.formula({ + label: "Expected", + description: "Closed Won + Commit \u2014 what the owner reasonably expects to land.", + expression: F5`coalesce(record.closed_amount, 0) + coalesce(record.commit_amount, 0)`, + scale: 2, + group: "amounts" + }), + attainment_pct: Field8.formula({ + label: "Attainment %", + description: "Closed Won \xF7 Quota \xD7 100. Reads 0% until a positive quota is set.", + expression: F5`coalesce(record.quota, 0) > 0 ? (coalesce(record.closed_amount, 0) * 100.0) / record.quota : 0.0`, + scale: 2, + group: "amounts" + }), + coverage_ratio: Field8.formula({ + label: "Coverage Ratio", + description: "Pipeline \xF7 (Quota \u2212 Closed Won) \u2014 whether enough pipeline remains to cover the gap. Reads 0 once the quota is already met.", + expression: F5`(coalesce(record.quota, 0) - coalesce(record.closed_amount, 0)) > 0 ? coalesce(record.pipeline_amount, 0) / (record.quota - coalesce(record.closed_amount, 0)) : 0.0`, + scale: 2, + group: "amounts" + }), + source: Field8.select({ + label: "Source", + group: "meta", + options: [ + { label: "Scheduled snapshot", value: "scheduled", default: true }, + { label: "AI skill", value: "ai" }, + { label: "Manual entry", value: "manual" } + ] + }), + notes: Field8.text({ + label: "Notes", + maxLength: 1e3, + group: "meta" + }), + // Fixture identity — the seed loader's `externalId`, and nothing else. + // + // `crm_forecast` is a PER-OWNER snapshot: its real identity is + // (owner_id, period, period_start), and every other column is a rendering of + // part of that. `period_label` in particular names a SET of rows once the + // `forecast_snapshot` sweep writes one row per active owner per quarter — + // they all read 'Q3 2026' — so upserting on that label lets a re-seed match, + // and overwrite, a real rep's snapshot. + // + // ⚠️ The true composite `externalId: ['owner_id', 'period', 'period_start']` + // is not available here: a seed cannot name a user (see the note in + // `objectstack.composition.ts`, "A seed can't name a user"), so `owner_id` + // is null on every seeded row, and + // the loader's `externalIdKey` returns "" as soon as any part is empty. An + // empty key never matches, so upsert degrades to insert-on-every-replay. + // Dropping `owner_id` does not rescue it: a runtime row for the current + // quarter carries exactly the same (period, period_start). + // + // ⚠️ `mode: 'insert'` does NOT mean "insert once" — the loader inserts + // unconditionally on every replay boot (framework#3434). `'ignore'` is the + // real insert-once mode, but it decides "already there?" from the same + // `externalId`, so on a broken key it would SKIP the demo row because a real + // rep's row already claimed 'Q3 2026'. Fixing the identity is a prerequisite + // either way. Hence this synthetic, seeder-only key. + // + // ⚠️ `readonly` is the load-bearing part, not decoration: seed writes run + // `{ isSystem: true }` and bypass readonly stripping, while readonly + // stripping does guard user/API writes — so a genuine forecast row can never + // acquire a `seed_key` and can never be matched by a re-seed. That is what + // makes the fix structural rather than a naming convention. `hidden` keeps a + // fixtures-only column out of forms and pickers. + seed_key: Field8.text({ + label: "Seed Key", + description: "Demo-fixture identity. Written only by the seed loader; empty on every real snapshot.", + maxLength: 64, + readonly: true, + hidden: true, + group: "meta" + }) + }, + indexes: [ + { fields: ["owner_id", "period_start", "period"] }, + { fields: ["snapshot_date"] }, + { fields: ["period_start"] } + ], + // API surface. History → Field.trackHistory (ADR-0052). + enable: { + apiEnabled: true, + apiMethods: ["get", "list", "create", "update", "delete"] + }, + // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the + // rule returns a verdict even when the merged record has no such key. See + // AGENTS.md "Validation predicates must be TOTAL" and + // test/object-validation-predicates.test.ts, which fails the build otherwise. + validations: [ + { + name: "period_end_after_start", + type: "script", + severity: "error", + message: "Period End must be after Period Start.", + // `<=`, not `<`: the rule name says "after" and a forecast period is a + // month or a quarter, never a single instant, so `period_end == + // period_start` is a zero-length period rather than a valid one. Same + // operator and wording as the `end_after_start` twins on + // campaign/contract. + condition: P5`has(record.period_end) && record.period_end != null && has(record.period_start) && record.period_start != null && record.period_end <= record.period_start` + }, + // A hand-filled `period_start` must be the first day of the calendar period + // it labels. Maintainer ruling 2026-08-11: 「接受你的全部建议」 — refuse + // rather than accept or snap. + // + // The hook derives `period_end` as "start + one period" — a ROLLING window. + // That is calendar-true for a start on a boundary and drifts for anything + // else: `period: 'quarter'` + `period_start: 2026-08-15` derives + // `period_end: 2026-10-31` under `period_label: 'Q3 2026'`, a window + // labelled Q3 that reaches a month into Q4. The row is internally + // inconsistent in a way no consumer can detect: every "this quarter" + // equals-filter reads `period_start`, and the nightly sweep selects the + // current row by `period_start <= today <= period_end`. + // + // These rules are the ONE enforcement point — deliberately not a throw in + // `forecast.hook.ts` as well. ⚠️ A declared rule is the shape the platform + // can act on: it refuses the write with a `ValidationError` / + // `VALIDATION_FAILED` envelope (HTTP 400) on the record form, on the API and + // on a seed's system write alike, where a hook throw is a bare `Error`. The + // derivation is left alone: with the start pinned to a boundary, "start + + // one period" IS the calendar period. + // + // ⚠️ WHY A REGEX AND NOT DATE ARITHMETIC: the CEL stdlib this app compiles + // against (`CEL_STDLIB_FUNCTIONS`) has no month/day accessor — the date + // functions are `today`/`daysBetween`/`addDays`/`addMonths`/`date` — so "the + // 1st of its month" is not expressible as arithmetic. Both drivers this app + // can run on hand `period_start` back as a `YYYY-MM-DD` string, and an ISO + // *datetime* string still matches these prefix-anchored patterns. A caller + // that writes a JS `Date` object is the one shape `string()` has no overload + // for; the engine then rejects that write naming the rule rather than + // admitting it, and no writer in this app does that. + { + name: "period_start_first_of_period", + type: "script", + severity: "error", + message: "Period Start must be the first day of the period \u2014 e.g. 2026-08-01 for Aug 2026.", + condition: P5`has(record.period_start) && record.period_start != null && !matches(string(record.period_start), "^[0-9]{4}-[0-9]{2}-01")` + }, + { + name: "quarter_starts_on_quarter_boundary", + type: "script", + severity: "error", + // The month rule above already rejects any non-1st day, so this one only + // ever adds the quarter-month half: 2026-08-01 is a valid month start and + // not a valid quarter start. + message: "A quarterly forecast must start on a quarter boundary \u2014 January 1, April 1, July 1 or October 1.", + condition: P5`has(record.period) && record.period == "quarter" && has(record.period_start) && record.period_start != null && !matches(string(record.period_start), "^[0-9]{4}-(01|04|07|10)-01")` + }, + // …and the OTHER end of the same window. The two rules above pin the START; + // `period_end` stays reachable, because the hook derives it only when the + // write leaves it unset and the field sits editable on the record form. + // Without this rule, `period: 'quarter'` + `period_start: 2026-07-01` (a + // boundary the rules above admit) + a hand-typed `period_end: 2027-05-15` is + // ADMITTED under `period_label: 'Q3 2026'` — a ten-month window labelled as + // one quarter, reached through the other field. + // + // WHY A RULE AND NOT A READ-ONLY FIELD: deriving `period_end` always and + // locking the form breaks the demo seed — + // `src/sales/data/forecast.seed.ts` hand-fills it on every seeded row. + // Hand-entry stays; it is now bounded. + // + // ⚠️ WHY `type: 'script'` AND NOT A FIELD CONSTRAINT: a field bound judges + // only the value being written, so a row already stored wrong keeps + // accepting edits forever; a script validation is evaluated against the + // MERGED record on every write and is therefore a true invariant. + // `test/forecast-period-end-boundary.test.ts` pins both halves — a legacy + // row is refused on its next unrelated edit, and the repair is admitted. + // + // WHY DATE ARITHMETIC HERE WHEN THE TWO RULES ABOVE USE A REGEX: not taste. + // Those rules inspect ONE date's components ("is this the 1st of its + // month?"), and the CEL stdlib has no month/day accessor. This rule compares + // TWO dates, which `addMonths`/`addDays`/`daysBetween` express directly. + // + // The predicate says "one period long", and that is the same claim as "ends + // on the calendar boundary" ONLY because the two rules above pin the start + // to one. That coupling is deliberate: the three are one set enforcing one + // invariant (a row's window is exactly the calendar period it is labelled + // with), not three independent gates. + // + // ⚠️ `daysBetween(a, b) != 0` rather than `a == b`: both drivers this app + // runs on hand dates back as `YYYY-MM-DD` strings while `addDays` returns a + // timestamp, and a string never `==` a timestamp — the rule would be + // permanently green. `daysBetween` puts both sides through the same + // `toDate`, so the string, an ISO datetime spelling and a JS `Date` all + // compare alike. + // + // ⚠️ The `!= null` guards are load-bearing for a THIRD hazard beyond the two + // AGENTS.md names: `daysBetween(null, …)` reaches `BigInt(NaN)` and THROWS, + // which the engine reports as `predicate failed to evaluate` — a rule that + // cannot answer, i.e. a rejected ordinary save. This predicate has no + // ordering operator, so `object-validation-predicates.test.ts`'s + // unguarded-comparison sweep does not cover it; the pin lives in + // `test/forecast-period-end-boundary.test.ts` instead. + { + name: "period_end_matches_calendar_period", + type: "script", + severity: "error", + message: "Period End must be the last day of the period \u2014 e.g. 2026-09-30 for a quarter starting 2026-07-01, or 2026-08-31 for Aug 2026.", + // Spelled out per period value instead of a ternary on the month count: + // an undeclared `period` is refused BY NAME by the picklist ("Period must + // be one of: month, quarter", measured), so this rule judges only the two + // values it understands and leaves the rest to the schema. + condition: P5`has(record.period) && record.period != null && has(record.period_start) && record.period_start != null && has(record.period_end) && record.period_end != null && ((record.period == "month" && daysBetween(record.period_end, addDays(addMonths(record.period_start, 1), -1)) != 0) || (record.period == "quarter" && daysBetween(record.period_end, addDays(addMonths(record.period_start, 3), -1)) != 0))` + }, + { + name: "snapshot_amounts_non_negative", + type: "script", + severity: "error", + message: "Snapshot amounts cannot be negative.", + condition: P5`(has(record.pipeline_amount) && record.pipeline_amount != null && record.pipeline_amount < 0) || (has(record.best_case_amount) && record.best_case_amount != null && record.best_case_amount < 0) || (has(record.commit_amount) && record.commit_amount != null && record.commit_amount < 0) || (has(record.closed_amount) && record.closed_amount != null && record.closed_amount < 0)` + } + ] +}); + +// src/sales/objects/lead.object.ts +import { ObjectSchema as ObjectSchema9, Field as Field9 } from "@objectstack/spec/data"; +import { F as F6, P as P6 } from "@objectstack/spec"; +var Lead = ObjectSchema9.create({ + name: "crm_lead", + label: "Lead", + pluralLabel: "Leads", + icon: "user-plus", + description: "Potential customers not yet qualified", + // ADR-0090 D1/D7: OWD is an authored decision. Owner-worked queue. + sharingModel: "private", + fieldGroups: [ + { key: "identity", label: "Identity", icon: "user-plus" }, + { key: "company_info", label: "Company Information", icon: "building" }, + { key: "contact_info", label: "Contact Information", icon: "phone" }, + { key: "qualification", label: "Qualification", icon: "star" }, + { key: "assignment", label: "Assignment", icon: "user" }, + { key: "address", label: "Address", icon: "map-pin", collapse: "collapsed" }, + { key: "additional", label: "Additional Info", icon: "info", collapse: "collapsed" }, + { key: "preferences", label: "Communication Preferences", icon: "bell-off", collapse: "collapsed" }, + { key: "conversion", label: "Conversion", icon: "check-circle", collapse: "collapsed" }, + { key: "duplicates", label: "Duplicate Management", icon: "copy", collapse: "collapsed" } + ], + fields: { + // Platform ownership anchor — canonical note in `account.object.ts` (#548). + owner_id: Field9.lookup("sys_user", { + label: "Lead Owner", + group: "assignment", + system: true, + readonly: false, + trackHistory: true + }), + // Personal Information + salutation: Field9.select({ + label: "Salutation", + group: "identity", + // Canonical set shared with Contact (#490) — see _picklists.ts. + options: [...SALUTATION_OPTIONS] + }), + first_name: Field9.text({ + label: "First Name", + required: true, + storage: { notNull: true }, + searchable: true, + group: "identity" + }), + last_name: Field9.text({ + label: "Last Name", + required: true, + storage: { notNull: true }, + searchable: true, + group: "identity" + }), + // ⚠️ `salutation` is a picklist, so a formula sees the raw VALUE (`ms`, + // `dr`), not the label — including it renders names as "ms Emily Davis" in + // lists and details. Dropped here and from `display_title` below, matching + // Contact. + full_name: Field9.formula({ + label: "Full Name", + expression: F6`joinNonEmpty([record.first_name, record.last_name], ' ')`, + group: "identity" + }), + // ADR-0079 record title (was titleFormat '{full_name} - {company}'). + // Composed from the same source fields as `full_name` (not formula-on-formula) + // plus `company`, so the title resolves from real stored values. + display_title: Field9.formula({ + label: "Display Title", + expression: F6`joinNonEmpty([record.first_name, record.last_name], ' ') + " - " + record.company`, + group: "identity" + }), + // Company Information + company: Field9.text({ + label: "Company", + required: true, + storage: { notNull: true }, + searchable: true, + group: "company_info" + }), + /** + * Case- and whitespace-folded copy of `company` — the value lead conversion + * compares against `crm_account.name_normalized`. + * + * ### Why the LEAD needs one too + * + * ⚠️ A normalized column on `crm_account` alone fixes nothing: the + * conversion flow would then compare a raw company string against a folded + * account name, and `"ACME Corp"` still would not match `acme corp`. Both + * sides have to be canonical, and the flow can canonicalize neither — + * `service-automation`'s `resolveToken` accepts exactly one function form + * (`NOW()` / `TODAY()`), so `{LOWER(x)}`, `{TRIM(x)}` and + * `{x.toLowerCase()}` all resolve to `undefined`. See the field comment on + * `crm_account.name_normalized` for the full measurement. + * + * `company` itself is NOT folded in place: it is the display value, it is + * copied verbatim onto the account the conversion creates, and lower-casing + * it would ship `acme corp` as a customer-visible account name. That is the + * one way this differs from `email`, which has no meaningful case and so is + * canonicalized in place. + * + * Derived, never authored: `lead_duplicate_check` recomputes it on every + * write that carries `company`. Not indexed — nothing filters on it; it is + * read off the lead record the flow already fetched. + */ + company_normalized: Field9.text({ + label: "Company (Normalized)", + description: "Match key for lead conversion: Company lower-cased, trimmed, with internal whitespace collapsed. Maintained by the lead_duplicate_check hook \u2014 never edit directly.", + readonly: true, + hidden: true, + maxLength: 255, + group: "company_info" + }), + title: Field9.text({ + label: "Job Title", + group: "company_info" + }), + industry: Field9.select({ + label: "Industry", + group: "company_info", + // Canonical set shared with Account (#490): lead_conversion copies this + // value onto the created Account, so both objects MUST agree. + options: [...INDUSTRY_OPTIONS] + }), + // ⚠️ NOT `unique`. A hard uniqueness constraint on a lead's email says a + // person may enquire once, ever, and the database enforces it by REJECTING + // the second enquiry — turning an ordinary follow-up into a 500 on the + // public form. Real funnels re-capture the same address routinely. + // Duplicates are a fact to be RECORDED, not an error: `lead_duplicate_check` + // in lead.hook.ts links the new lead to the record it repeats (see the + // `duplicates` field group below). The plain index below is what keeps the + // column indexed in the constraint's absence — the intake dedupe lookup, the + // `crm_lead_import` upsert key and the conversion flow all read leads by + // email on every write. + email: Field9.email({ + label: "Email", + required: true, + storage: { notNull: true }, + group: "contact_info" + }), + phone: Field9.text({ + label: "Phone", + format: "phone", + group: "contact_info" + }), + mobile: Field9.text({ + label: "Mobile", + format: "phone", + group: "contact_info" + }), + website: Field9.url({ + label: "Website", + group: "contact_info" + }), + // Lead Qualification + status: Field9.select({ + label: "Lead Status", + required: true, + storage: { notNull: true }, + group: "qualification", + trackHistory: true, + // Field-level default: option-level `default: true` only preselects in + // UI forms after first paint; the quick-create dialog and API inserts + // need a real defaultValue (see approval_status for the same lesson). + defaultValue: "new", + options: [ + { label: "New", value: "new", color: "#808080", default: true }, + { label: "Contacted", value: "contacted", color: "#FFA500" }, + { label: "Qualified", value: "qualified", color: "#4169E1" }, + { label: "Unqualified", value: "unqualified", color: "#FF0000" }, + { label: "Converted", value: "converted", color: "#00AA00" } + ] + }), + rating: Field9.rating(5, { + label: "Lead Score", + description: "Lead quality score (1-5 stars)", + group: "qualification" + }), + lead_source: Field9.select({ + label: "Lead Source", + group: "qualification", + // Canonical set shared with Contact + Opportunity (#490): lead_conversion + // copies this value onto the created Opportunity, so all three MUST agree. + options: [...LEAD_SOURCE_OPTIONS] + }), + // ── Demand: what this prospect wants, and what it is worth ───────── + // + // REQ-0005 steps 6-7. Both fields are in `qualification` because they ARE + // qualification data — what the buyer is asking for and how big it is are + // the two facts a rep weighs before working a lead — and neither is + // required: a lead captured off the public form has neither, and saves + // exactly as it did before. + need_type: Field9.select({ + label: "Need Type", + group: "qualification", + description: "What this prospect is asking for. Routing, prioritisation and demand reporting read this.", + // Generic starter vocabulary, declared once in `_picklists.ts` — see the + // note there for why it is NOT shared with `crm_opportunity.type`. + options: [...LEAD_NEED_TYPE_OPTIONS] + }), + // ⛔ NEVER conflated with `annual_revenue`, which sits two groups below in + // `additional` and answers a different question: that is the prospect + // COMPANY's own turnover, a size signal, and it is the value + // `lead_conversion` copies onto the account it creates. This is the value + // of the DEMAND — the number that becomes `crm_opportunity.amount` when the + // lead converts, and the only figure the pipeline has before then. + // + // ⛔ Nor is it a second copy of `crm_opportunity.amount`. The opportunity's + // amount is a committed deal figure a rep defends in a forecast; this is an + // estimate taken before qualification, and the conversion screen is where a + // human turns one into the other (it PREFILLS from here — see the + // `opportunityAmount` screen field in `lead-conversion.flow.ts` — rather + // than copying silently, so the rep confirms the number that enters the + // forecast). + estimated_amount: Field9.currency({ + label: "Estimated Amount", + group: "qualification", + description: "Estimated value of this demand, before qualification. Prefills the deal amount at conversion." + }), + // ── The conversion approval gate (REQ-0005 step 7) ───────────────── + // + // ⚠️ `defaultValue: 'not_required'` IS THE GATE'S OFF SWITCH, and it is the + // one line an install changes to arm it. REQ-0005: "The gate must be + // configurable — off by default. A single-seller install must not be forced + // through an approval to convert a lead." + // + // OFF (shipped) every lead is born `not_required`; nothing ever writes + // `pending`, so `lead_conversion_approval` never enters, + // the Convert button never hides and the write-path gate in + // `lead.hook.ts` never fires. Conversion behaves EXACTLY as + // it did before this field existed. + // ON change this one value to `'pending'`. Every lead is then + // born pending, `lead_conversion_approval` opens its + // request, and conversion is refused until an approver + // decides. + // + // Leads that predate the switch keep whatever they were born with, which is + // the point: arming the gate does not invalidate or re-open a single + // existing record (REQ-0005 acceptance 4). This is a TRANSITION GATE, not an + // invariant (AGENTS.md metadata semantics rule 7) — what is refused is the + // ACT of converting, evaluated against `previous` in `lead.hook.ts`, never + // the state of a record that is already converted. + // + // Shape copied from `crm_opportunity.approval_status`: `readonly: true` + // plus a REAL field-level `defaultValue`, ⛔ not only an option-level + // `default: true` — the same lesson `status` above records, and the reason + // that field's own comment gives: an option default only preselects in UI + // forms after first paint, so a quick-create dialog or an API insert would + // land a null and a null matches no flow entry condition. + // + // ⛔ Do NOT add an "approved" value to `status` instead. That select is the + // qualification lifecycle; a sixth value there would break the + // `convert_lead` predicate, the `lead_status_progression` transitions and + // the seeded rows, and would conflate "this lead is worth working" with + // "someone signed off on converting it". + conversion_approval_status: Field9.select({ + label: "Conversion Approval", + group: "qualification", + readonly: true, + trackHistory: true, + description: "Whether this lead has been signed off for conversion. Not Required means no approval is asked for \u2014 the shipped default.", + defaultValue: "not_required", + options: [ + { label: "Not Required", value: "not_required", default: true }, + { label: "Pending", value: "pending", color: "#FFA500" }, + { label: "Approved", value: "approved", color: "#00AA00" }, + { label: "Rejected", value: "rejected", color: "#FF0000" } + ] + }), + // Assignment + // Conversion tracking. + // ⛔ NOT `readonly`: the `lead_conversion` flow's `mark_converted` node + // UPDATEs this column and the four `converted_*` ones below, and that flow + // declares no `runAs` — so it runs at the engine default `'user'`, which is + // also where house rule 9 keeps a screen flow. `stripReadonlyFields` runs + // under `if (!opCtx.context?.isSystem)` and deletes every readonly key the + // CALLER supplied, so `readonly` here would silently un-convert every + // conversion. + // ⚠️ The other writer is unaffected, and is not the reason: the + // guest-submission sanitiser in `lead.hook.ts` ASSIGNS these on + // `beforeInsert`, and hook-written keys are not caller-supplied — nor does + // the strip run on INSERT at all. Measured in + // `test/readonly-write-semantics.test.ts`. + // ⇒ Declaring these `readonly` would need the flow's write ELEVATED, which + // is a privilege decision on the maintainer's floor, not this file's (#1435). + // Edit-protection is the `beforeUpdate` guard in `lead.hook.ts`, which + // rejects any USER edit to a converted lead outside a small allow-list — + // and it is the ONLY guard, deliberately: a script validation beside it + // never fires, because the hook's throw always wins the race. + is_converted: Field9.boolean({ + label: "Converted", + defaultValue: false, + group: "conversion", + trackHistory: true + }), + converted_account: Field9.lookup("crm_account", { + label: "Converted Account", + group: "conversion" + }), + converted_contact: Field9.lookup("crm_contact", { + label: "Converted Contact", + group: "conversion" + }), + converted_opportunity: Field9.lookup("crm_opportunity", { + label: "Converted Opportunity", + group: "conversion" + }), + converted_date: Field9.datetime({ + label: "Converted Date", + group: "conversion" + }), + // Address (using new address field type) + address: Field9.address({ + label: "Address", + group: "address" + }), + // Additional Info + annual_revenue: Field9.currency({ + label: "Annual Revenue", + group: "additional" + }), + number_of_employees: Field9.number({ + label: "Number of Employees", + group: "additional" + }), + description: Field9.markdown({ + label: "Description", + group: "additional" + }), + // Custom notes with rich text formatting + notes: Field9.richtext({ + label: "Notes", + description: "Working notes on this lead \u2014 supports formatting.", + group: "additional" + }), + // Flags + do_not_call: Field9.boolean({ + label: "Do Not Call", + defaultValue: false, + group: "preferences" + }), + email_opt_out: Field9.boolean({ + label: "Email Opt Out", + defaultValue: false, + group: "preferences" + }), + // Follow-up & disqualification tracking + next_followup_date: Field9.date({ + label: "Next Follow-up Date", + group: "qualification" + }), + // NOT `readonly` (#592) — see the long note on + // `crm_account.last_activity_date`. The activity bubble writes this from + // another object's hook, and a readonly field is stripped from any + // non-system write whose caller supplied the key (#2948), so every bubble + // into this column was silently discarded. + last_contacted_date: Field9.datetime({ + label: "Last Contacted", + group: "qualification" + }), + disqualification_reason: Field9.select({ + label: "Disqualification Reason", + group: "qualification", + description: "Required when status is Unqualified", + options: [ + { label: "Not a Fit", value: "not_a_fit" }, + { label: "No Budget", value: "no_budget" }, + { label: "Wrong Persona", value: "wrong_persona" }, + { label: "Unreachable", value: "unreachable" }, + { label: "Duplicate", value: "duplicate" }, + { label: "Competitor", value: "competitor" }, + { label: "Other", value: "other" } + ] + }), + // ── Duplicate management ─────────────────────────────────────────── + // + // `disqualification_reason: 'duplicate'` is only meaningful if the record + // says WHAT it duplicates — otherwise the "duplicate" bar on the + // disqualification breakdown points at nothing you can open. + // + // ⚠️ The surviving record can live on either object — a still-open lead, or + // a contact the prospect already became — and `Field.lookup` takes exactly + // one target (`Field.lookup(['crm_lead','crm_contact'])` is rejected at + // schema parse: "reference: expected string, received array"). So the link + // is the same TYPE-DISCRIMINATOR shape `crm_task.related_to_*` already uses: + // one select naming the object, one lookup per object, and the pairing + // enforced declaratively. + // + // The vocabulary is TWO sets, declared and split in `_picklists.ts`: the two + // object names an author may pick, plus `erased` — a tombstone the form does + // not offer and only `lead_duplicate_check` ever writes. + // + // The tombstone is what lets an erasure COMPLETE against a lead a human + // confirmed as a duplicate, without relaxing one rule, so read it as a + // constraint rather than as a spare value: `requiredWhen` below pairs only + // `crm_lead` / `crm_contact`, so a tombstoned type never fires either + // pairing and never demands a pointer to a record that is gone; and + // `duplicate_disqualification_requires_survivor` asks for a NON-BLANK type + // plus `duplicate_status == "confirmed"`, both of which a tombstoned lead + // still satisfies — so the verdict a reviewer recorded survives the erasure + // instead of being deleted as a side effect of someone else's GDPR request. + duplicate_of_type: Field9.select({ + label: "Duplicate Of", + group: "duplicates", + description: "Which object holds the surviving record this lead repeats.", + options: [...DUPLICATE_OF_TYPE_OPTIONS] + }), + // ⚠️ The type↔lookup pairing is `requiredWhen`, not a script validation: + // "the lookup named by the type must be populated" is exactly a conditional + // write contract, the engine evaluates it on insert and update, and it + // reports against the FIELD, so the form marks the empty lookup instead of + // showing a record-level error. (`crm_task` states the same intent as a + // warning-severity script rule because it predates `requiredWhen`, + // ADR-0113.) + // + // ⚠️ `has(...)` is load-bearing, not decoration. A bare + // `record.duplicate_of_type == "crm_lead"` aborts with `No such key` on any + // record whose merged shape omits the column, and the engine's response to a + // predicate that fails to evaluate is to SKIP it ("requiredWhen for + // 'duplicate_of_lead' failed to evaluate — skipped"). The rule would then + // read as enforced and require nothing at all. + // + // ⚠️ Both lookups take the spec default `deleteBehavior: 'set_null'`, and + // that is deliberate: a lead is a first-class record that happens to carry a + // flag, so `cascade` would destroy the lead because the record it was + // compared against was deleted. What keeps the pairing honest under a + // `set_null` clear is the retirement block in `lead_duplicate_check` + // (`lead.hook.ts`, job 1c): when a write leaves the named lookup blank it + // drops `duplicate_of_type` and `duplicate_status` in the same write, so the + // pair is never left half-stated and this rule never has to be loosened to + // tolerate one. Read that note before changing either predicate. + duplicate_of_lead: Field9.lookup("crm_lead", { + label: "Duplicate Of Lead", + group: "duplicates", + requiredWhen: P6`has(record.duplicate_of_type) && record.duplicate_of_type == "crm_lead"` + }), + duplicate_of_contact: Field9.lookup("crm_contact", { + label: "Duplicate Of Contact", + group: "duplicates", + requiredWhen: P6`has(record.duplicate_of_type) && record.duplicate_of_type == "crm_contact"` + }), + // Machine suspicion and human verdict are ONE field with two values, not two + // parallel sets of link fields: the intake hook writes `suspected` and only + // ever when this is blank (lead.hook.ts), so a human's `confirmed` survives + // every later write, and both states stay queryable off one column. + duplicate_status: Field9.select({ + label: "Duplicate Status", + group: "duplicates", + trackHistory: true, + description: "Suspected = flagged automatically at intake. Confirmed = a human verified the match.", + options: [ + { label: "Suspected", value: "suspected", color: "#FFA500" }, + { label: "Confirmed", value: "confirmed", color: "#FF0000" } + ] + }) + }, + // Lifecycle transitions are enforced via a `state_machine` validation rule + // (see validations[] below). ⚠️ There is no top-level `stateMachines` key on + // the platform — status state machines are expressed in the validation union. + // Database indexes for performance + // + // ⚠️ `email` is indexed but NOT unique, and the index must stay explicit: it + // used to exist only as a side effect of a field-level `unique: true`, so + // dropping that constraint would otherwise have dropped the index with it and + // left three read paths — the `lead_duplicate_check` intake lookup, the + // `crm_lead_import` upsert key and the conversion flow — scanning the table + // on every write. + // + // ⛔ Do NOT add `unique: true` back here: a single-column unique index makes + // the platform-wide constraint win over the per-tenant composite + // (framework#3991), so two organizations could not work the same address + // independently. Uniqueness is not the rule this object wants at all. + indexes: [ + { fields: ["owner_id"] }, + { fields: ["status"] }, + { fields: ["company"] }, + { fields: ["email"] } + ], + // API surface. History → Field.trackHistory (ADR-0052). + enable: { + apiEnabled: true + }, + // ADR-0079 record title — the `display_title` formula field defined above. + nameField: "display_title", + // Explicit search targets (ADR-0061). REQUIRED because nameField is a + // FORMULA (display_title/full_name): without this, $search auto-defaults to + // the formula field, which isn't a real column, so the lookup picker + global + // search silently return zero. These are real, indexed columns. + searchableFields: ["first_name", "last_name", "company", "email"], + highlightFields: ["full_name", "company", "email", "status", "owner_id"], + // Removed: list_views and form_views belong in UI configuration, not object definition + // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the + // rule returns a verdict even when the merged record has no such key. See + // AGENTS.md "Validation predicates must be TOTAL" and + // test/object-validation-predicates.test.ts, which fails the build otherwise. + validations: [ + { + name: "email_required", + type: "script", + severity: "error", + message: "Email is required", + condition: P6`!has(record.email) || isBlank(record.email)` + }, + { + // The field description promises "Required when status is Unqualified"; + // this is what enforces it. A lead in `unqualified` with no recorded + // reason loses the one datum a disqualification review needs. Same shape + // as `crm_case.escalation_reason_required`. + name: "disqualification_reason_required", + type: "script", + severity: "error", + message: "Disqualification reason is required when a lead is Unqualified", + condition: P6`has(record.status) && record.status == "unqualified" && (!has(record.disqualification_reason) || isBlank(record.disqualification_reason))` + }, + { + // "Disqualified as a duplicate" has to name the survivor. + // + // Same shape as `disqualification_reason_required` directly above — a + // declarative condition evaluated by the engine on insert and update, with + // no hook involved. The two clauses are the two things the field-level + // `requiredWhen` on the lookups cannot say: + // + // 1. `duplicate_of_type` must be chosen, which is what makes exactly one + // of the two `requiredWhen` predicates fire and demand its lookup. + // 2. `duplicate_status` must be `confirmed` SPECIFICALLY. `requiredWhen` + // asks whether a field is populated, not what it holds — and a lead + // closed on the machine's `suspected` guess is precisely the outcome + // this rule exists to prevent. A human has to look and agree. + // + // ⚠️ Every field reference is wrapped in `has(...)`, and that is what makes + // this an enforced rule rather than a decorative one. The engine evaluates + // a validation against `{...previous, ...data}` and fills absent fields + // with null on INSERT — but not on UPDATE, where `previous` is whatever + // the driver returned, and a driver that stores only the columns a row was + // written with hands back a record with no `duplicate_status` key at all. + // Strict CEL then aborts the whole predicate with `No such key`, and a + // predicate that fails to evaluate is SKIPPED, not failed: + // + // WARN Validation rule '…' predicate failed to evaluate (…) — skipped + // + // The unguarded first draft of this rule let a lead be closed as a + // duplicate with no survivor named, silently, on the in-memory driver — + // the driver the whole test suite runs on. + name: "duplicate_disqualification_requires_survivor", + type: "script", + severity: "error", + message: "Disqualifying a lead as Duplicate requires naming the surviving record and setting Duplicate Status to Confirmed", + condition: P6`has(record.disqualification_reason) && record.disqualification_reason == "duplicate" && !(has(record.duplicate_of_type) && !isBlank(record.duplicate_of_type) && has(record.duplicate_status) && record.duplicate_status == "confirmed")` + }, + { + name: "lead_status_progression", + type: "state_machine", + severity: "warning", + message: "Invalid lead status transition", + field: "status", + // Conversion (→ converted) is allowed from any worked-open status so the + // Convert action's widened visibility (new/contacted/qualified) never trips + // a spurious "invalid transition" warning when the flow stamps + // status:'converted'. + transitions: { + new: ["contacted", "qualified", "unqualified", "converted"], + contacted: ["qualified", "unqualified", "converted"], + qualified: ["converted", "unqualified"], + unqualified: ["new"], + converted: [] + } + } + ] + // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were + // removed from the platform. Field updates live in this object's `*.hook.ts`; + // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. +}); + +// src/sales/objects/opportunity.object.ts +import { ObjectSchema as ObjectSchema10, Field as Field10 } from "@objectstack/spec/data"; +import { F as F7, P as P7 } from "@objectstack/spec"; +var Opportunity = ObjectSchema10.create({ + name: "crm_opportunity", + label: "Opportunity", + pluralLabel: "Opportunities", + icon: "dollar-sign", + description: "Sales opportunities and deals in the pipeline", + // ADR-0090 D1/D7: OWD is an authored decision. Owner + high-value management sharing rule. + sharingModel: "private", + // ⚠️ ADR-0079 `nameField` is a FIELD, not a render template, and a FORMULA + // sees the stored select VALUE rather than its translated label — so a + // `'{name} - {stage}'` title renders every deal "Enterprise Deal - + // closed_won" in lookups, related lists and search, in every locale. The + // formula language has no option-label lookup, so the title is the plain + // `name` column; `stage` still leads the highlight strip below, translated. + nameField: "name", + // Explicit search targets (ADR-0061). `name` is a real indexed column, so + // $search resolves on its own here; the list is kept explicit to pin the + // intent (other objects whose nameField IS a formula rely on it). + searchableFields: ["name"], + highlightFields: ["name", "crm_account", "amount", "stage", "owner_id"], + fieldGroups: [ + { key: "basic", label: "Basic Information", icon: "dollar-sign" }, + { key: "financials", label: "Financials", icon: "trending-up" }, + { key: "sales_process", label: "Sales Process", icon: "target" }, + { key: "qualification", label: "Qualification", icon: "filter" }, + { key: "narrative", label: "Deal Narrative", icon: "book-open" }, + { key: "classification", label: "Classification", icon: "tag" }, + { key: "campaign", label: "Campaigns", icon: "flag", collapse: "collapsed" }, + { key: "notes", label: "Notes & Next Steps", icon: "file-text" }, + { key: "crm_forecast", label: "Forecast & Metrics", icon: "bar-chart", collapse: "collapsed" } + ], + fields: { + // Platform ownership anchor — canonical note in `account.object.ts` (#548). + owner_id: Field10.lookup("sys_user", { + label: "Opportunity Owner", + group: "basic", + system: true, + readonly: false, + trackHistory: true + }), + // Basic Information + name: Field10.text({ + label: "Opportunity Name", + required: true, + storage: { notNull: true }, + searchable: true, + group: "basic" + }), + // (No `display_title` formula — see `nameField` above: composing the title + // from `stage` leaked the raw select value into every rendered title.) + // Relationships + crm_account: Field10.lookup("crm_account", { + label: "Account", + required: true, + storage: { notNull: true }, + group: "basic" + }), + primary_contact: Field10.lookup("crm_contact", { + label: "Primary Contact", + // @objectstack 12: string[] `referenceFilters` is dead (not read by the + // picker); `dependsOn` is the live cascading form — scopes contacts to the + // opportunity's `crm_account` (ADR-0049). + dependsOn: ["crm_account"], + group: "basic" + }), + // Financial Information + amount: Field10.currency({ + label: "Amount", + required: true, + storage: { notNull: true }, + min: 0, + group: "financials", + trackHistory: true + }), + expected_revenue: Field10.currency({ + label: "Expected Revenue", + readonly: true, + // Calculated field + group: "financials" + }), + // ─── Qualification (REQ-0006 step 8) ─────────────────────────────── + // + // The standard triage vocabulary of a seller that cannot pursue every + // deal. `forecast_category` answers a different question — it is the + // forecast roll-up bucket, derived from `stage` — so none of this is + // folded into it. GENERIC values only: a customer's own grading scale is + // overlay configuration (REQ-0006 acceptance 5). + // + // ⚠️ `pnpm validate` reports the fields in this block, in the narrative + // block below, and the customer-side dates as "carrier-only — declared + // but nothing in this stack reads or displays it", and that reading is + // EXPECTED here rather than a defect to tidy away. The liveness + // diagnostic counts view columns, form sections, page bindings, flow + // nodes, formulas, hooks and actions as sites; it does NOT count + // `fieldGroups` membership, which is precisely the DERIVED layout + // REQ-0006 acceptance 1 asks for. ⛔ Do NOT answer the warning by + // authoring a `record:details` section — that is the escape hatch + // AGENTS.md reserves for a named customer demand, and it would trade + // acceptance 1 for a quieter log. `crm_account`'s business-profile block + // carries the same verdict on `main` for the same reason (#1948). + will_bid: Field10.boolean({ + label: "Will Bid", + description: "Whether we intend to bid. Unset means the decision is open.", + group: "qualification" + }), + controllability: Field10.select({ + label: "Controllability", + group: "qualification", + options: [ + { label: "High", value: "high" }, + { label: "Medium", value: "medium" }, + { label: "Low", value: "low" } + ] + }), + priority: Field10.select({ + label: "Priority", + group: "qualification", + options: [ + { label: "High", value: "high" }, + { label: "Medium", value: "medium" }, + { label: "Low", value: "low" } + ] + }), + deal_level: Field10.select({ + label: "Deal Level", + group: "qualification", + options: [ + { label: "Strategic", value: "strategic" }, + { label: "Key", value: "key" }, + { label: "Standard", value: "standard" } + ] + }), + // The FACT of subcontracting is generic and belongs in core; the + // customer's supplier list is not and is not proposed here. + is_subcontracted: Field10.boolean({ + label: "Involves Subcontracting", + defaultValue: false, + group: "qualification" + }), + subcontracting_note: Field10.textarea({ + label: "Subcontracting Note", + group: "qualification" + }), + // ─── The 立项 (qualification) gate: the rep's request ───────────── + // + // REQ-0006 step 11: 「销售立项需走审批流程;新增商机可跟进,立项通过后方可更新阶段、 + // 投标、赢丢单操作。」 The rep ASKS for 立项 by ticking this box, and + // `opportunity_qualification_approval` opens one approval when it turns on + // (the TRANSITION, not the current value). A rejection clears it, so + // ticking it again is a fresh request — the role `requested_status` plays + // for the status-change gate, as a boolean because 立项 asks for one thing. + // + // `defaultValue: false` is load-bearing for the start condition: every deal + // born after this column then STORES the key, so `has(previous.…)` holds + // on every driver and the off→on transition is visible. Not readonly: this + // is the one half of the gate a person writes. Inert while the gate is + // off — nothing reads it unless an install arms the verdict below. + qualification_requested: Field10.boolean({ + label: "Request Qualification Approval", + description: "Tick to send this deal for qualification approval. A rejection clears it; tick it again to ask again.", + defaultValue: false, + group: "qualification" + }), + // ─── The 立项 gate's switch AND its verdict column ───────────────── + // + // ⚠️ This `defaultValue` IS the switch, exactly as on + // `status_change_approval_status` below, and shipped it is `not_required`: + // the gate is OFF by default (REQ-0006 *Disposition*: "Both gates must be + // configurable — off by default"). No deal is born `pending`, the flow's + // start condition and the `opportunity_lifecycle` refusal are false for + // every record that has ever existed, and a stage move, Will Bid and a + // direct close work exactly as they do without it. An install ARMS the gate + // by changing this one value to `'pending'`; deals that already exist keep + // `not_required`, so arming it invalidates no record. ⛔ Not the flow's + // `status` — `lead-conversion-approval.flow.ts` records why. + // + // ⚠️ Its OWN column — ⛔ never `approval_status` (the amount-tiered + // flow's; its entry keys on `not_required`, so sharing would re-arm it) and + // ⛔ never `status_change_approval_status` (one gate's verdict would erase + // the other's, and the step-14 hook reads that column input-first). + // + // `readonly: true` on the #1666 grounds: the only writers are the gate's + // own `runAs: 'system'` flow and the insert default, and both survive the + // readonly strip. A user-supplied verdict is stripped BEFORE the + // `beforeUpdate` hooks run — measured on 17.6.0 with a real ObjectQL: a + // user update of `{ stage, qualification_approval_status: 'approved' }` + // reached the hooks as `{ id, stage }` and was refused 409 — so the + // input-first read in `opportunity_lifecycle` cannot be fed an `approved` + // by hand. + qualification_approval_status: Field10.select({ + label: "Qualification Approval", + group: "qualification", + readonly: true, + defaultValue: "not_required", + options: [ + { label: "Not Required", value: "not_required", default: true }, + { label: "Pending", value: "pending", color: "#FFA500" }, + { label: "Approved", value: "approved", color: "#00AA00" }, + { label: "Rejected", value: "rejected", color: "#FF0000" } + ] + }), + // Sales Process + stage: Field10.select({ + label: "Stage", + required: true, + storage: { notNull: true }, + group: "sales_process", + // ADR-0052 §5b.1 — the platform auto-renders each stage change on the + // activity timeline as "Stage: Proposal → Negotiation" (no hook code). + trackHistory: true, + // Canonical set (#490) — the mass_update_stage action renders the same + // list; see _picklists.ts. + options: [...OPPORTUNITY_STAGE_OPTIONS] + }), + probability: Field10.percent({ + label: "Probability (%)", + min: 0, + max: 100, + defaultValue: 10, + group: "sales_process" + }), + // Important Dates + close_date: Field10.date({ + label: "Close Date", + required: true, + storage: { notNull: true }, + group: "sales_process", + trackHistory: true + }), + // NO `created_date` here: the platform already injects `created_at` on + // every object, and this duplicate had no writer at all — not the seed + // data, not a hook, not a flow — so it was permanently null while + // `created_at` carried the real value (#575 B2). Surfaces that need the + // creation instant read `created_at` (see the deal_timeline view). + // + // Stage-age clock (#489). This is the STORED half of the pair: a real, + // indexed date column, so it is what automation and views may filter and + // sort on. `days_in_stage` below is a formula derived from it. + // `opportunity_lifecycle` stamps it on insert and re-stamps it on every + // stage change; readonly because nothing but that hook should move it + // (before-hook writes survive readonly stripping — only caller-supplied + // keys are dropped). + stage_entry_date: Field10.date({ + label: "Stage Entry Date", + description: "Date this opportunity entered its current stage.", + readonly: true, + group: "sales_process" + }), + // ─── The customer's own procurement calendar (REQ-0006 step 8) ───── + // + // ⛔ Never folded into `close_date`: that is a single date and it is OUR + // expected close. These are three distinct BUYER-side events, and + // REQ-0006 acceptance 2 requires them to be reportable independently of + // the forecast close date — see the `tender_this_quarter` list view, + // which predicates on `expected_tender_date` alone. + customer_initiation_date: Field10.date({ + label: "Customer Initiation Date", + group: "sales_process" + }), + expected_tender_date: Field10.date({ + label: "Expected Tender Date", + group: "sales_process" + }), + expected_signing_date: Field10.date({ + label: "Expected Signing Date", + group: "sales_process" + }), + expected_tender_amount: Field10.currency({ + label: "Expected Tender Amount", + min: 0, + group: "sales_process" + }), + expected_signing_amount: Field10.currency({ + label: "Expected Signing Amount", + min: 0, + group: "sales_process" + }), + // Additional Classification + type: Field10.select({ + label: "Opportunity Type", + group: "classification", + options: [ + { label: "New Business", value: "new_business" }, + { label: "Existing Customer - Upgrade", value: "existing_upgrade" }, + { label: "Existing Customer - Renewal", value: "existing_renewal" }, + { label: "Existing Customer - Expansion", value: "existing_expansion" } + ] + }), + // ⛔ BESIDE `type`, never replacing or overloading it: `type`'s four + // values are a RELATIONSHIP taxonomy that `opportunity.hook.ts` and + // reporting read. Generic delivery-model values only — the customer's own + // line-of-business list is overlay (REQ-0006 acceptance 5). + business_line: Field10.select({ + label: "Business Line", + group: "classification", + options: [ + { label: "Product", value: "product" }, + { label: "Professional Services", value: "services" }, + { label: "Consulting", value: "consulting" }, + { label: "Support & Maintenance", value: "support" }, + { label: "Other", value: "other" } + ] + }), + lead_source: Field10.select({ + label: "Lead Source", + group: "classification", + // Canonical set shared with Lead + Contact (#490): lead_conversion + // copies `leadRecord.lead_source` onto the opportunity it creates, so + // this must accept every Lead value. + options: [...LEAD_SOURCE_OPTIONS] + }), + // Campaign tracking + crm_campaign: Field10.lookup("crm_campaign", { + label: "Campaign", + description: "Marketing campaign that generated this opportunity", + group: "campaign" + }), + // Sales cycle metrics + // + // ⚠️ FORMULA, not a stored counter. As a plain number column nothing ever + // raises it: the hook resets it to 0 on a stage change and no sweep + // increments it, so `days_in_stage > 14` matches only rows a seed hardcoded + // and the `opportunity_stagnation` flow never fires on real data. Deriving + // it from `stage_entry_date` is correct on every read and costs no nightly + // full-table pass. + // + // ⚠️ The trade-off: formulas are evaluated AFTER the query (the engine's + // `applyFormulaPlan` walks the returned rows), so this is not a real column + // and CANNOT appear in a filter or a sort. Anything that needs to *select* + // stalled deals predicates on `stage_entry_date` instead — see + // `opportunity-stagnation.flow.ts` and the `stale_opportunities` view. + // + // ⚠️ `has()` + null guard: `daysBetween(null, …)` faults and the whole field + // silently evaluates to null, so an unstamped row is spelled out as null + // rather than arriving there by accident. + days_in_stage: Field10.formula({ + label: "Days in Current Stage", + expression: F7`has(record.stage_entry_date) && record.stage_entry_date != null ? daysBetween(record.stage_entry_date, today()) : null`, + returnType: "number", + group: "crm_forecast" + }), + // Additional information + description: Field10.markdown({ + label: "Description", + group: "notes" + }), + next_step: Field10.textarea({ + label: "Next Steps", + group: "notes" + }), + // ─── Deal narrative (REQ-0006 step 10) ───────────────────────────── + // + // The standard deal-review narrative, split out of `description` so each + // part is reviewable, templatable and (later) reportable on its own — + // ⛔ not more prose crammed into one markdown field. + // + // ⚠️ `payment_terms` is PROSE here and a select on `crm_quote` / + // `crm_contract`: what a rep records mid-pursuit is the shape of a term + // still being negotiated, not the net-terms ladder a signed document + // carries. ⛔ Do not "unify" it onto PAYMENT_TERMS_OPTIONS — that would + // force a half-agreed term into a closed vocabulary. + // + // All four are `Field.textarea` (REQ-0006 names markdown OR textarea per + // field). Measured on the 17.6.0 console, the Details tab's edit mode — + // the surface these fields render on — has no markdown editor, so a + // markdown field here could be read but never written. The maintainer + // ruled textarea for the three that were markdown (2026-10-03, on #1950: + // 「改成 textarea(推荐)」). + customer_background: Field10.textarea({ + label: "Customer Background", + group: "narrative" + }), + project_background: Field10.textarea({ + label: "Project Background", + group: "narrative" + }), + risk_analysis: Field10.textarea({ + label: "Risk Analysis", + group: "narrative" + }), + payment_terms: Field10.textarea({ + label: "Payment Terms", + group: "narrative" + }), + // Flags + is_private: Field10.boolean({ + label: "Private", + defaultValue: false, + group: "crm_forecast" + }), + forecast_category: Field10.select({ + label: "Forecast Category", + group: "crm_forecast", + options: [ + { label: "Pipeline", value: "pipeline" }, + { label: "Best Case", value: "best_case" }, + { label: "Commit", value: "commit" }, + { label: "Omitted", value: "omitted" }, + { label: "Closed", value: "closed" } + ] + }), + // Approval workflow tracking. + // ⭐ `readonly: true` — DECLARED, and the declaration is the honest one + // rather than a hopeful one. Audited per writer (#1666): every writer of + // this column and of `approved_date` is elevated or an insert. + // `opportunity_approval` declares `runAs: 'system'`, and + // `opportunity_approval_on_create` inherits it by spreading that flow, so + // `resolveRunDataContext` hands the engine `isSystem: true` and the + // `if (!opCtx.context?.isSystem)` strip branch is skipped outright; the + // `approval` node's own `approvalStatusField` write runs inside those same + // system runs; seeds write on INSERT, which the strip never touches. No + // view, page or action writes either column. ⇒ No writer loses its write. + // Ruled #1666 (director seat, decision batch #74, 2026-09-07): "Declared = + // enforced" applies to the audit surface too. ⛔ The hand-edit escape hatch + // — an admin clearing a stuck approval by typing over the stamp — is given + // up ON PURPOSE: a stuck approval is a platform or flow defect to be fixed + // as one, not a reason to keep an audit stamp hand-editable. ⛔ Do not + // reintroduce a bypass, and do not soften either column back to editable + // without a new ruling. Both halves are pinned in + // `test/audit-stamp-readonly.test.ts`: the system path still lands both + // stamps, and a plain user-context UPDATE of either is stripped. + // ⚠️ `defaultValue` at FIELD level: option-level `default: true` + // only preselects in UI forms — API and flow inserts land null without it, + // and a null `approval_status` never matches the flow's entry condition. + approval_status: Field10.select({ + label: "Approval Status", + group: "sales_process", + readonly: true, + defaultValue: "not_required", + options: [ + { label: "Not Required", value: "not_required", default: true }, + { label: "Pending", value: "pending", color: "#FFA500" }, + { label: "Approved", value: "approved", color: "#00AA00" }, + { label: "Rejected", value: "rejected", color: "#FF0000" } + ] + }), + approved_date: Field10.datetime({ + label: "Approved Date", + group: "sales_process", + readonly: true + }), + // ─── The status-change gate's switch AND its verdict column ──────── + // + // ⚠️ This `defaultValue` IS the switch, and shipped it is `not_required`, + // so the gate is OFF by default — REQ-0006 acceptance 3: "with it off + // (the default), the existing amount-tiered behaviour of + // `opportunity-approval.flow.ts` is bit-for-bit what it is today". No + // record is ever born `pending`, `opportunity_status_change_approval`'s + // start condition is false for every row that has ever existed, and + // nothing about the amount-tiered flow changes. An install ARMS the gate + // by changing this one value to `'pending'`. + // + // ⛔ Not the flow's `status`, for the reason + // `lead-conversion-approval.flow.ts` records and measured: `draft` still + // fires its triggers, and `obsolete` composes with the installation's + // activation ledger into a gate no install can ever turn ON. + // + // ⚠️ Deliberately NOT `approval_status`. That column is the amount-tiered + // flow's, and sharing it would make either gate's verdict erase the + // other's — and re-trigger the amount flow, whose entry condition keys on + // `approval_status == "not_required"`. + // + // `readonly: true` on the same audited grounds as `approval_status` + // (#1666): the only writers are the gate's own `runAs: 'system'` flow and + // the insert default, and both survive the readonly strip. + // What the rep is ASKING for, ⛔ never the stage itself: REQ-0006 + // acceptance 3 requires the stage not to move until the request is + // decided, and a `record_change` flow binds an AFTER hook — by the time it + // runs, a stage the rep wrote has already moved. So the rep writes the + // request here (with the win/loss reason), and the approved decision + // writes `stage` — the customer's own step 14, 「通过后商机状态正式生效」. + // + // Values ARE the two stage values, so the flow's approve branch can apply + // it with `stage: '{oppRecord.requested_status}'` and no mapping table can + // drift. Not readonly: this is the one half of the gate a person writes. + // Inert while the gate is off — nothing reads it unless the install arms + // `status_change_approval_status`. + requested_status: Field10.select({ + label: "Requested Status", + group: "sales_process", + options: [ + { label: "Won", value: "closed_won" }, + { label: "Lost", value: "closed_lost" } + ] + }), + status_change_approval_status: Field10.select({ + label: "Status Change Approval", + group: "sales_process", + readonly: true, + defaultValue: "not_required", + options: [ + { label: "Not Required", value: "not_required", default: true }, + { label: "Pending", value: "pending", color: "#FFA500" }, + { label: "Approved", value: "approved", color: "#00AA00" }, + { label: "Rejected", value: "rejected", color: "#FF0000" } + ] + }), + // ─── Win / Loss analysis ─────────────────────────────────────────── + // + // ⛔ The reason is captured AT CLOSE, and that is enforced, not requested. + // Leaving both fields optional means every seeded and user-closed deal + // lands with them empty and the win/loss widgets below have nothing to draw. + // + // `requiredWhen`, not a script validation, for the same reason + // `crm_lead.duplicate_of_lead` uses it (ADR-0113): "this field must hold a + // value when the record looks like X" is exactly a conditional write + // contract, the engine evaluates it on insert AND update inside + // `evaluateValidationRules`, and it reports against the FIELD — so the form + // marks the empty picklist instead of showing a record-level banner. It is + // ALSO the only shape the freeze below leaves usable: once a deal is closed, + // `opportunity.hook.ts` refuses every user edit outside the narrative + // fields, so a reason not captured in the closing write can never be added + // afterwards. Close time is the only chance. + // `test/win-loss-capture.test.ts` drives both predicates through a real + // ObjectQL over a real driver, on insert and on update. + // + // ⚠️ `has(...)` is load-bearing. A bare `record.stage == "closed_lost"` + // aborts with `No such key` on any merged record that omits the column, and + // the engine's answer to a predicate that cannot evaluate is to SKIP it + // ("requiredWhen for 'loss_reason' failed to evaluate — skipped"), which + // would make this read as enforced while requiring nothing at all. + win_reason: Field10.select({ + label: "Win Reason", + description: "Why this deal was won. Required to close an opportunity as Won.", + group: "classification", + requiredWhen: P7`has(record.stage) && record.stage == "closed_won"`, + options: [ + { label: "Better Product", value: "better_product" }, + { label: "Better Price", value: "better_price" }, + { label: "Existing Relationship", value: "relationship" }, + { label: "Better Support", value: "better_support" }, + { label: "Best Fit / Features", value: "best_fit" }, + // Written by the machine, not chosen by a rep: `quote_on_accepted` + // (quote.hook.ts) wins the deal the moment a customer accepts the + // quote, and no human is in that write to attribute it. Naming the + // automated path is this repo's existing idiom for exactly that split + // (`crm_lead.duplicate_status` = machine `suspected` vs human + // `confirmed`) and it keeps the rule exception-free: every closed_won + // row carries a reason, and an analyst can still tell a CPQ close from + // a rep's attribution instead of reading a fabricated "Better Product". + { label: "Quote Accepted", value: "quote_accepted" }, + { label: "Other", value: "other" } + ] + }), + loss_reason: Field10.select({ + label: "Loss Reason", + description: "Why this deal was lost. Required to close an opportunity as Lost.", + group: "classification", + requiredWhen: P7`has(record.stage) && record.stage == "closed_lost"`, + options: [ + { label: "Price Too High", value: "price" }, + { label: "Lost to Competitor", value: "competitor" }, + { label: "No Budget", value: "no_budget" }, + { label: "No Decision", value: "no_decision" }, + { label: "Bad Timing", value: "timing" }, + { label: "Missing Features", value: "features" }, + { label: "Other", value: "other" } + ] + }), + loss_details: Field10.textarea({ + label: "Loss/Win Details", + description: "Free-text context behind the win or loss reason.", + group: "classification" + }) + }, + // Database indexes for performance + indexes: [ + { fields: ["name"] }, + { fields: ["crm_account"] }, + { fields: ["owner_id"] }, + { fields: ["stage"] }, + { fields: ["close_date"] }, + // The stagnation sweep filters on this every morning. + { fields: ["stage_entry_date"] } + ], + // Enable advanced features + // + // Stage/amount history is tracked per-field via `Field.trackHistory` + // (ADR-0052). ⚠️ Ownership is NOT: it lives on the platform's injected + // `owner_id`, which carries no `trackHistory` flag — a transfer is recorded + // in the compliance audit log (`sys_audit_log`, unconditional) rather than on + // the activity feed. + enable: { + apiEnabled: true, + apiMethods: ["get", "list", "create", "update", "delete"], + // Whitelist allowed API operations + // #602 — proposals, redlines and signed orders belong on the deal. + // See the canonical capability note in `src/sales/objects/index.ts`. + files: true + }, + // ADR-0052 §5b.2 — declarative milestone activity. When `stage` enters these + // values the platform emits a semantic timeline entry (no hook code). + // Combined with the field-level `trackHistory` above (stage-change rows) this + // replaces any hand-coded activity hook. + activityMilestones: [ + { field: "stage", value: "closed_won", summary: "Deal won \u2014 {name}", type: "completed" }, + { field: "stage", value: "closed_lost", summary: "Deal lost \u2014 {name}", type: "completed" } + ], + // Removed: list_views and form_views belong in UI configuration, not object definition + // Lifecycle transitions are enforced via a `state_machine` validation rule + // (see validations[] below). ⚠️ There is no top-level `stateMachines` key on + // the platform — status state machines live in the validation union. + // Validation Rules + // + // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the + // rule returns a verdict even when the merged record has no such key. See + // AGENTS.md "Validation predicates must be TOTAL" and + // test/object-validation-predicates.test.ts, which fails the build otherwise. + validations: [ + { + name: "close_date_future", + type: "script", + severity: "warning", + message: "Close date should not be in the past unless opportunity is closed", + // An absent `stage` key means "no stage recorded", which is not a closed + // stage — hence `!has(record.stage) || (…)` rather than a leading + // `has(record.stage) &&`, which would suppress the warning instead. + condition: P7`has(record.close_date) && record.close_date != null && record.close_date < today() && (!has(record.stage) || (record.stage != "closed_won" && record.stage != "closed_lost"))` + }, + { + name: "amount_positive", + type: "script", + severity: "error", + message: "Amount must be greater than zero", + condition: P7`has(record.amount) && record.amount != null && record.amount <= 0` + }, + { + name: "opportunity_stage_progression", + type: "state_machine", + severity: "warning", + message: "Invalid opportunity stage transition", + field: "stage", + transitions: { + // `→ proposal` is legal from every pre-proposal stage: the + // quote_generation flow fast-forwards the deal to `proposal` when a + // quote is generated, which can happen at any open stage. + prospecting: ["qualification", "proposal", "closed_lost"], + qualification: ["needs_analysis", "proposal", "closed_lost"], + needs_analysis: ["proposal", "closed_lost"], + // `proposal → closed_won` is legal: the quote_on_accepted hook closes + // the linked deal directly from the CPQ path (quote_generation parks + // the opportunity at `proposal`; an accepted quote wins it without a + // separate negotiation step). + proposal: ["negotiation", "closed_won", "closed_lost"], + negotiation: ["closed_won", "closed_lost"], + closed_won: [], + closed_lost: [] + } + } + ] + // ⚠️ `probability` and `expected_revenue` are NOT computed declaratively. + // They are derived in `opportunity.hook.ts` (single source of truth = + // stage → STAGE_PROBABILITY); keeping the math in one place avoids drift + // between a declarative CASE() table and the hook's lookup table. + // + // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were + // removed from the platform. Field updates live in this object's `*.hook.ts`; + // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. +}); + +// src/sales/objects/task.object.ts +import { ObjectSchema as ObjectSchema11, Field as Field11 } from "@objectstack/spec/data"; +import { P as P8 } from "@objectstack/spec"; +var Task = ObjectSchema11.create({ + name: "crm_task", + label: "Task", + pluralLabel: "Tasks", + icon: "check-square", + description: "Activities and to-do items", + // ADR-0090 D1/D7: OWD is an authored decision. Personal activity records. + sharingModel: "private", + // Every other business object with a detail page groups its fields; task was + // one of the two that did not, so its detail page fell back to one flat grid + // where the five polymorphic `related_to_*` lookups and the recurrence + // machinery sat inline with the subject. The keys mirror the sections the + // task form already uses (Task / Related Records / Recurrence & Effort) so + // the two surfaces agree. + fieldGroups: [ + { key: "basic", label: "Task Information", icon: "info" }, + { key: "scheduling", label: "Scheduling", icon: "calendar" }, + // No 'assignment' group: the assignee (`owner_id`) was its only member, and + // the synthesized detail page hoists it into the highlight strip — so the + // group rendered on forms and never on detail pages + // (`field-group-shadowed`). It lives in `basic` alongside + // subject/status/priority instead. + { key: "related", label: "Related Records", icon: "link" }, + { key: "recurrence", label: "Recurrence", icon: "refresh-ccw", collapse: "collapsed" }, + { key: "effort", label: "Progress & Effort", icon: "activity", collapse: "collapsed" }, + { key: "system", label: "System", icon: "database", collapse: "collapsed" } + ], + fields: { + // Platform ownership anchor — canonical note in `account.object.ts` (#548). + owner_id: Field11.lookup("sys_user", { + label: "Assigned To", + group: "basic", + system: true, + readonly: false, + trackHistory: true + }), + // Task Information + subject: Field11.text({ + group: "basic", + label: "Subject", + required: true, + storage: { notNull: true }, + searchable: true, + maxLength: 255 + }), + description: Field11.markdown({ + group: "basic", + label: "Description" + }), + // Task Management + status: Field11.select({ + group: "basic", + label: "Status", + required: true, + storage: { notNull: true }, + trackHistory: true, + // Field-level default, not just the option flag: the option `default` + // only preselects in some form surfaces, so a quick-create modal opened + // from a related list left this required field blank and the rep had to + // pick "Not Started" by hand every time. + defaultValue: "not_started", + options: [ + { label: "Not Started", value: "not_started", color: "#808080", default: true }, + { label: "In Progress", value: "in_progress", color: "#FFA500" }, + { label: "Waiting", value: "waiting", color: "#FFD700" }, + { label: "Completed", value: "completed", color: "#00AA00" }, + { label: "Deferred", value: "deferred", color: "#999999" } + ] + }), + priority: Field11.select({ + group: "basic", + label: "Priority", + required: true, + storage: { notNull: true }, + trackHistory: true, + // `normal` is the default rather than `low`: a rep filing a to-do has + // made no priority judgement, and defaulting everything to Low made the + // field meaningless (nothing ever sorted above the noise). + defaultValue: "normal", + options: [ + { label: "Low", value: "low", color: "#4169E1" }, + { label: "Normal", value: "normal", color: "#00AA00", default: true }, + { label: "High", value: "high", color: "#FFA500" }, + { label: "Urgent", value: "urgent", color: "#FF0000" } + ] + }), + // Sortable ordinal for `priority` — see crm_case.priority_rank. Sorting on + // the select itself compares raw strings (normal > low > high > urgent), + // which pushes urgent work to the bottom of the to-do queue. + // + // `0` is the UNRANKED sentinel, identical to crm_case.priority_rank. ⛔ It + // must stay identical on both: a differing sentinel orders the same unknown + // priority differently on the two objects, and `2` here would make an + // unranked task indistinguishable from a genuine `normal`. + priority_rank: Field11.number({ + label: "Priority Rank", + readonly: true, + defaultValue: 0 + }), + type: Field11.select({ + group: "basic", + label: "Task Type", + // Canonical set (#490) — the schedule_followup screen renders the same + // list; see _picklists.ts. + options: [...TASK_TYPE_OPTIONS] + }), + // Dates + due_date: Field11.date({ + group: "scheduling", + label: "Due Date" + }), + reminder_date: Field11.datetime({ + group: "scheduling", + label: "Reminder Date/Time" + }), + completed_date: Field11.datetime({ + group: "scheduling", + label: "Completed Date", + readonly: true + }), + // Related To (Polymorphic relationship - can link to multiple object types) + related_to_type: Field11.select({ + group: "related", + label: "Related To Type", + options: [ + { label: "Account", value: "crm_account" }, + { label: "Contact", value: "crm_contact" }, + { label: "Opportunity", value: "crm_opportunity" }, + { label: "Lead", value: "crm_lead" }, + { label: "Case", value: "crm_case" } + ] + }), + related_to_account: Field11.lookup("crm_account", { + group: "related", + label: "Related Account" + }), + related_to_contact: Field11.lookup("crm_contact", { + group: "related", + label: "Related Contact" + }), + related_to_opportunity: Field11.lookup("crm_opportunity", { + group: "related", + label: "Related Opportunity" + }), + related_to_lead: Field11.lookup("crm_lead", { + group: "related", + label: "Related Lead" + }), + related_to_case: Field11.lookup("crm_case", { + group: "related", + label: "Related Case" + }), + // Recurrence (for recurring tasks) + is_recurring: Field11.boolean({ + group: "recurrence", + label: "Recurring Task", + defaultValue: false + }), + recurrence_type: Field11.select({ + group: "recurrence", + label: "Recurrence Type", + options: [ + { label: "Daily", value: "daily" }, + { label: "Weekly", value: "weekly" }, + { label: "Monthly", value: "monthly" }, + { label: "Yearly", value: "yearly" } + ] + }), + recurrence_interval: Field11.number({ + group: "recurrence", + label: "Recurrence Interval", + defaultValue: 1, + min: 1 + }), + recurrence_end_date: Field11.date({ + group: "recurrence", + label: "Recurrence End Date" + }), + // Flags + is_completed: Field11.boolean({ + group: "system", + label: "Is Completed", + defaultValue: false, + readonly: true + }), + is_overdue: Field11.boolean({ + group: "system", + label: "Is Overdue", + defaultValue: false, + readonly: true + }), + // Set by the `task_due_reminder` schedule flow once a reminder has fired + // (the sweep de-dups on `reminder_date`, which it clears; this flag is the + // audit trail), and defaulted to `false` by `task.hook.ts` on insert. + // + // NOT readonly — but the old reason here ("16.x drops flow writes to + // readonly fields") does not survive measurement. Taken on 17.1.0, + // RE-TAKEN on 17.2.0 (#1460) and RE-CONFIRMED on 17.3.0 (#1676) — the pin + // at each of those takings; not re-taken on 17.4.0 (PR #1814, #1807) or + // 17.5.0 — same verdict all three times: `task_due_reminder` + // declares `runAs: 'system'`, so its write WOULD survive a + // `readonly: true`. + // + // ⚠️ The other half of that reason EXPIRED at 17.4.0 and is ⛔ NOT + // renumbered here: "the insert path is exempt from the strip" held through + // 17.3.0 and was reversed as a declared BREAKING change — the retirement + // is recorded in the INSERT-path section of + // `test/readonly-write-semantics.test.ts` (#1429) and in + // `campaign_member.object.ts`. Neither half moves this field, which is not + // `readonly` at all. Left writable as-is; flipping it is a separate + // decision, not a comment fix. + reminder_sent: Field11.boolean({ + group: "system", + label: "Reminder Sent", + defaultValue: false + }), + // Progress + progress_percent: Field11.percent({ + group: "effort", + label: "Progress (%)", + min: 0, + max: 100, + defaultValue: 0 + }) + // No time tracking. `estimated_hours` / `actual_hours` were declared and + // inert: no rollup summed them onto a case or an opportunity, no variance + // report compared them, and nothing warned when actual overran estimate. + // Effort on a task is `progress_percent`, which the task views do read. + }, + // API surface. History → Field.trackHistory (ADR-0052). + enable: { + apiEnabled: true + }, + // Database indexes for performance + indexes: [ + { fields: ["status"] }, + { fields: ["priority"] }, + { fields: ["owner_id"] }, + { fields: ["due_date"] } + ], + // ADR-0079: render-only `titleFormat` retired in favor of `nameField`, + // which names the real field holding the record title (here: `subject`). + nameField: "subject", + highlightFields: ["subject", "status", "priority", "due_date", "owner_id"], + // Removed: list_views and form_views belong in UI configuration, not object definition + // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the + // rule returns a verdict even when the merged record has no such key. See + // AGENTS.md "Validation predicates must be TOTAL" and + // test/object-validation-predicates.test.ts, which fails the build otherwise. + validations: [ + { + name: "completed_date_required", + type: "script", + severity: "error", + message: "Completed date is required when status is Completed", + condition: P8`has(record.status) && record.status == "completed" && (!has(record.completed_date) || isBlank(record.completed_date))` + }, + { + name: "recurrence_fields_required", + type: "script", + severity: "error", + message: "Recurrence type is required for recurring tasks", + condition: P8`has(record.is_recurring) && record.is_recurring == true && (!has(record.recurrence_type) || isBlank(record.recurrence_type))` + }, + { + name: "related_to_required", + type: "script", + severity: "warning", + message: "At least one related record should be selected", + condition: P8`(!has(record.related_to_account) || isBlank(record.related_to_account)) && (!has(record.related_to_contact) || isBlank(record.related_to_contact)) && (!has(record.related_to_opportunity) || isBlank(record.related_to_opportunity)) && (!has(record.related_to_lead) || isBlank(record.related_to_lead)) && (!has(record.related_to_case) || isBlank(record.related_to_case))` + } + ] + // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were + // removed from the platform. Field updates live in this object's `*.hook.ts`; + // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. +}); + +// src/sales/actions/activity-actions.ts +var nameFieldMap = (objectDefs) => Object.fromEntries( + Object.values(objectDefs).filter( + (o) => typeof o?.name === "string" && typeof o?.nameField === "string" + ).map((o) => [o.name, o.nameField]) +); +var ACTIVITY_TARGETS = { + crm_lead: "related_to_lead", + crm_contact: "related_to_contact", + crm_account: "related_to_account", + crm_opportunity: "related_to_opportunity", + crm_case: "related_to_case" +}; +var lit = (value) => JSON.stringify(value); +var ACTOR_NAME_RESOLUTION_SOURCE = `// The acting user's DISPLAY name, for the sys_activity row (#673 / #678). + // + // PLATFORM WORKAROUND. \`ctx.user.name\` is not a display name on the + // dispatch path the Console uses: the REST action dispatcher builds the + // body's user as \`{ id: ec.userId, name: ec.userId, \u2026 }\` \u2014 the key is + // present and carries the raw id, so \`ctx.user?.name\` reads as a + // plausible string and silently wrote ids like + // "grDEyLoIgnunJ2M7Y2muLgcuQbDUT0s2" into \`sys_activity.actor_name\` + // (@objectstack/runtime 17.0.0-rc.2, dist/index.js:5397-5399). The MCP + // dispatcher does try a display name first + // (\`ec.userName ?? ec.userDisplayName ?? ec.userId\`, dist/index.js:1776) + // but nothing in the installed platform ever populates either field, so + // it falls back to the id too. + // + // So the name is resolved HERE, from \`sys_user.name\` (the column the + // platform itself treats as the profile display name), with the id kept + // as the last resort \u2014 an opaque id is bad, a blank actor is worse. + // A name that differs from the id is taken as already-resolved, which is + // what makes this one query and not a query per activity write. + // + // DELETE THIS once the platform delivers a display name on ctx.user.name + // for REST-dispatched action bodies: every splice site collapses back to + // \`actor_name: ctx.user?.name\` (objectstack-ai/objectstack#5372). + const ctxName = ctx.user?.name ? String(ctx.user.name).trim() : ''; + let actorName = ctxName && ctxName !== userId ? ctxName : ''; + if (!actorName && userId) { + try { + const found = await ctx.api.object('sys_user').find({ + where: { id: userId }, + fields: ['name'], + top: 1, + }); + const users = Array.isArray(found) ? found : (found?.records ?? []); + const resolved = users.length && users[0].name ? String(users[0].name).trim() : ''; + if (resolved) actorName = resolved; + } catch (e) { + // A denied or unavailable sys_user read must not fail the log \u2014 the + // interaction the rep just recorded matters more than its label. + } + } + if (!actorName) actorName = userId;`; +function activityAction(spec, objectName, nameField) { + const relatedField = ACTIVITY_TARGETS[objectName]; + if (!relatedField) { + throw new Error( + `activityAction: '${objectName}' is not an activity target \u2014 extend ACTIVITY_TARGETS together with crm_event.related_to_type and its related_to_* lookup.` + ); + } + return { + name: spec.name, + label: spec.label, + // Object-scoped, one registration per object. The runtime registers a body + // action under `:` and the dispatcher probes + // `` then `*`; a body action with no objectName lands under a + // 'global' key nothing ever probes ("Action 'log_call' on object '*' not + // found", verified 2026-07-28). ⛔ Never author an object-less body action. + objectName, + icon: spec.icon, + // script, not modal: modal submits die on GET /api/v1/meta/object/ + // → 400 in 16.1.0; script actions POST /api/v1/actions/... and execute. + type: "script", + body: { + language: "js", + source: ` + const OBJECT_NAME = ${lit(objectName)}; + const RELATED_FIELD = ${lit(relatedField)}; + const NAME_FIELD = ${lit(nameField)}; + const EVENT_TYPE = ${lit(spec.eventType)}; + const EVENT_STATUS = ${lit(spec.eventStatus)}; + + const record = ctx.record ?? {}; + const recordId = ctx.recordId ?? record.id ?? null; + const userId = ctx.user?.id ?? null; + const nowIso = new Date().toISOString(); + + ${ACTOR_NAME_RESOLUTION_SOURCE} + + const subject = input.subject ? String(input.subject) : ${lit(spec.defaultSubject)}; + const duration = input.duration ? Number(input.duration) : 0; + const notes = input.notes ? String(input.notes) : ''; + const location = input.location ? String(input.location) : ''; + + // A booking states its own start; a log is "just now". + // + // WORKAROUND for objectstack-ai/objectstack#5061 \u2014 the start is collected + // as a CALENDAR DAY + a WALL CLOCK (\`start_date\` / \`start_time\`) and + // joined here, instead of as one \`type: 'datetime'\` param. A datetime + // param is unusable from the Console: it renders as a zone-less + // \`\` and POSTs the raw value + // ("2026-08-10T15:00"), which the runtime's action-param validator rejects + // with 400 "expected an ISO-8601 instant with explicit zone" \u2014 no user + // input can pass. \`date\` and \`time\` are the two param types whose + // renderer output ("YYYY-MM-DD" / "HH:MM") the validator accepts verbatim, + // so the pair is submittable where the single datetime never was. + // + // TIMEZONE: the wall clock is interpreted as **UTC**, and both param + // labels say so. UTC is the only zone this body can apply deterministically + // \u2014 the sandbox context carries no user or org timezone (\`ctx.user\` is + // id/name/email), and reading the server's local zone would make the same + // input mean different instants on different hosts and in tests. Everything + // else this app writes is likewise a UTC instant (\`new Date().toISOString()\`). + // + // When #5061 lands (the Console serializing datetime-local in the + // browser's zone), this reverts to ONE \`type: 'datetime'\` param and the + // zone becomes the user's own \u2014 see \`collectsSchedule\` in this file. + let startIso = nowIso; + const startDate = input.start_date ? String(input.start_date).trim() : ''; + if (startDate) { + const startTime = input.start_time ? String(input.start_time).trim() : '00:00'; + // 'HH:MM' and 'HH:MM:SS' are both shapes the validator lets through. + const clock = startTime.length === 5 ? startTime + ':00' : startTime; + const parsed = new Date(startDate + 'T' + clock + '.000Z'); + // An unparseable value falls back to now rather than writing NaN into a + // required column. + if (!isNaN(parsed.getTime())) startIso = parsed.toISOString(); + } + + // 1. the interaction itself, as a queryable record. + const eventDoc = { + subject: subject, + type: EVENT_TYPE, + status: EVENT_STATUS, + start_datetime: startIso, + // Load-bearing, not decoration: an action body executes with + // isSystem: true (runtime buildActionExecutionContext), which + // short-circuits the security middleware \u2014 so the insert-time + // auto-stamp of owner_id never fires here. Omitting it would land the + // interaction ownerless, i.e. invisible in "My \u2026" and uneditable under + // a private OWD (#548, the #622 failure mode). + owner_id: userId, + related_to_type: OBJECT_NAME, + }; + if (duration > 0) eventDoc.duration_minutes = duration; + if (location) eventDoc.location = location; + if (notes) eventDoc.description = notes; + if (recordId) eventDoc[RELATED_FIELD] = recordId; + const event = await ctx.api.object('crm_event').insert(eventDoc); + const eventId = event?.id ?? null; + + // 2. attendees, as rows \u2014 the point of #592. + // A multi-lookup param may arrive as an array or, on a surface that + // renders it single-valued, as one scalar. Normalising both is not a + // lenient parse of authored metadata: it is the console's own input + // shape, which this body does not control. + const toList = (v) => { + if (v === null || v === undefined || v === '') return []; + return Array.isArray(v) ? v : [v]; + }; + const attendees = []; + if (userId) { + attendees.push({ attendee_type: 'user', sys_user: userId, is_organizer: true, response: 'accepted' }); + } + // The record the action was fired from IS an attendee when it is a + // person. On an account / opportunity / case it is not, so nothing is + // invented for it \u2014 the event's related_to_* link already records it. + if (OBJECT_NAME === 'crm_contact' && recordId) { + attendees.push({ attendee_type: 'contact', crm_contact: recordId, response: 'no_response' }); + } + if (OBJECT_NAME === 'crm_lead' && recordId) { + attendees.push({ attendee_type: 'lead', crm_lead: recordId, response: 'no_response' }); + } + for (const c of toList(input.attendee_contacts)) { + attendees.push({ attendee_type: 'contact', crm_contact: String(c), response: 'no_response' }); + } + for (const u of toList(input.attendee_users)) { + attendees.push({ attendee_type: 'user', sys_user: String(u), response: 'no_response' }); + } + + const seen = {}; + const attendeeIds = []; + for (const a of attendees) { + const who = a.sys_user ?? a.crm_contact ?? a.crm_lead ?? ''; + const key = a.attendee_type + ':' + who; + if (seen[key]) continue; + seen[key] = true; + const doc = Object.assign({}, a, { crm_event: eventId, invited_date: nowIso }); + const row = await ctx.api.object('crm_event_attendee').insert(doc); + if (row?.id) attendeeIds.push(row.id); + } + + // 3. the unified-timeline pointer. + // \`metadata\` no longer carries the attendee list: it is a display hint + // beside a real record now, not the record itself. ADR-0052 + // source_object/source_id is the queryable drill to the crm_event row. + const summary = duration ? subject + ' (' + duration + ' min)' : subject; + const activity = await ctx.api.object('sys_activity').insert({ + type: EVENT_STATUS === 'held' ? 'completed' : 'scheduled', + summary: ${lit(spec.summaryPrefix)} + summary, + actor_id: userId, + actor_name: actorName, + object_name: OBJECT_NAME, + record_id: recordId, + // #514 item 2: the object's DECLARED nameField, not a hardcoded name. + record_label: record[NAME_FIELD] ?? null, + source_object: 'crm_event', + source_id: eventId, + metadata: JSON.stringify({ + kind: EVENT_TYPE, + duration_minutes: duration, + notes: notes, + attendee_count: attendeeIds.length, + }), + }); + + // 4. SLA first-response stamp \u2014 NOT here. #575 B2 originally stamped + // \`crm_case.first_response_date\` from this body, which meant the metric + // was only ever written when the interaction was recorded through the two + // buttons this factory builds; an event created any other way left it + // null, under a comment asking every future author to remember. #595 + // moved the stamp to \`event_activity_bubble\` in + // \`src/sales/objects/event.hook.ts\`, which already fires on exactly the + // condition that matters ("a held event, on its transition into held") + // and already resolves \`related_to_case\`. Step 1 above writes that + // event, so this action still stamps the case \u2014 through one writer + // instead of a convention. Do not reintroduce a copy here: two writers + // racing on a "first" timestamp is how it becomes a "last" one. + + return { eventId: eventId, activityId: activity?.id ?? null, attendeeIds: attendeeIds }; + `, + capabilities: ["api.read", "api.write"], + timeoutMs: 5e3 + }, + locations: ["record_header", "list_item", "record_related"], + params: [ + { + name: "subject", + label: spec.subjectLabel, + type: "text", + required: true + }, + // WORKAROUND objectstack-ai/objectstack#5061 — one `type: 'datetime'` + // param ("Starts At") is what this WANTS to be, and it is unusable: the + // Console renders it as a zone-less `` and + // POSTs the raw value, which the action-param validator rejects with a + // 400 (`expected an ISO-8601 instant with explicit zone`). The renderer's + // output shape and the validator's accepted shape do not intersect, so + // NO user input can submit the action — reproduced from both the list-row + // menu and the record header. + // + // `date` and `time` are the two param types where they DO intersect: the + // Console renders native `` / `` + // pickers (`ui-components` DateField / TimeField, both emitting + // `e.target.value` verbatim) and the validator's `CalendarDateValueSchema` + // /`ClockTimeValueSchema` accept exactly `YYYY-MM-DD` and `HH:MM`. Two + // native pickers are also better UX than one free-text box, which is the + // other shape that would have submitted. + // + // The zone is stated in the LABELS, not in `helpText`: the Console's + // action-param form forwards only name/label/type/required/placeholder/ + // options/multiple/accept/maxSize to the field widget, so a `helpText` + // here would never reach the user. + // + // REVERT WHEN #5061 LANDS: back to + // { name: 'start', label: 'Starts At', type: 'datetime', required: true } + // and drop the join in the body above. + ...spec.collectsSchedule ? [ + { name: "start_date", label: "Start Date (UTC)", type: "date", required: true }, + { name: "start_time", label: "Start Time (UTC)", type: "time", required: true }, + { name: "location", label: "Location", type: "text", required: false } + ] : [], + { + name: "duration", + label: "Duration (minutes)", + type: "number", + required: false + }, + // Two typed lookups, not one free-text box: the platform has no + // polymorphic picker, and typed lookups produce queryable rows where a + // text box produces a comma-separated sentence nothing can filter on. + { + name: "attendee_contacts", + label: "Contact Attendees", + type: "lookup", + reference: "crm_contact", + multiple: true, + required: false + }, + { + name: "attendee_users", + label: "Internal Attendees", + type: "lookup", + reference: "sys_user", + multiple: true, + required: false + }, + { + name: "notes", + label: spec.notesLabel, + type: "textarea", + required: false + } + ], + successMessage: spec.successMessage, + refreshAfter: true + }; +} +var LOG_CALL_SPEC = { + name: "log_call", + label: "Log a Call", + icon: "phone", + eventType: "call", + eventStatus: "held", + summaryPrefix: "", + defaultSubject: "Untitled Call", + subjectLabel: "Call Subject", + notesLabel: "Call Notes", + successMessage: "Call logged successfully!" +}; +var LOG_MEETING_SPEC = { + name: "log_meeting", + label: "Log a Meeting", + icon: "calendar-check", + eventType: "meeting", + eventStatus: "held", + summaryPrefix: "Meeting: ", + defaultSubject: "Untitled Meeting", + subjectLabel: "Meeting Subject", + notesLabel: "Meeting Notes", + successMessage: "Meeting logged successfully!" +}; +var SCHEDULE_MEETING_SPEC = { + name: "schedule_meeting", + label: "Schedule a Meeting", + icon: "calendar-plus", + eventType: "meeting", + // `planned`, and that is the whole difference that matters: a booking must + // NOT reset the customer's recency clock (see event.hook.ts). + eventStatus: "planned", + summaryPrefix: "Meeting scheduled: ", + defaultSubject: "Untitled Meeting", + subjectLabel: "Meeting Subject", + notesLabel: "Agenda", + collectsSchedule: true, + successMessage: "Meeting scheduled!" +}; +var ACTIVITY_SPECS = [LOG_CALL_SPEC, LOG_MEETING_SPEC, SCHEDULE_MEETING_SPEC]; +var activityActionsFor = (objectName, objectDefs) => { + const nameField = nameFieldMap(objectDefs)[objectName] ?? "name"; + const built = ACTIVITY_SPECS.map((spec) => activityAction(spec, objectName, nameField)); + return Object.fromEntries(built.map((a) => [a.name, a])); +}; +var leadActivityActions = activityActionsFor("crm_lead", objects_exports2); +var contactActivityActions = activityActionsFor("crm_contact", objects_exports2); +var accountActivityActions = activityActionsFor("crm_account", objects_exports2); +var opportunityActivityActions = activityActionsFor("crm_opportunity", objects_exports2); +var LeadLogCallAction = leadActivityActions.log_call; +var LeadLogMeetingAction = leadActivityActions.log_meeting; +var LeadScheduleMeetingAction = leadActivityActions.schedule_meeting; +var ContactLogCallAction = contactActivityActions.log_call; +var ContactLogMeetingAction = contactActivityActions.log_meeting; +var ContactScheduleMeetingAction = contactActivityActions.schedule_meeting; +var AccountLogCallAction = accountActivityActions.log_call; +var AccountLogMeetingAction = accountActivityActions.log_meeting; +var AccountScheduleMeetingAction = accountActivityActions.schedule_meeting; +var OpportunityLogCallAction = opportunityActivityActions.log_call; +var OpportunityLogMeetingAction = opportunityActivityActions.log_meeting; +var OpportunityScheduleMeetingAction = opportunityActivityActions.schedule_meeting; + +// src/service/actions/case-activity.actions.ts +var caseActivityActions = activityActionsFor("crm_case", objects_exports); +var LogCallAction = caseActivityActions.log_call; +var LogMeetingAction = caseActivityActions.log_meeting; +var CaseScheduleMeetingAction = caseActivityActions.schedule_meeting; + +// src/service/actions/knowledge_article.actions.ts +import { P as P9 } from "@objectstack/spec"; +var feedbackBody = (verdict) => ` + const id = ctx.recordId; + if (!id) throw new Error('submit_article_feedback requires a recordId'); + const userId = ctx.user?.id ?? null; + if (!userId) throw new Error('Sign in to rate an article.'); + + // One row per (article, reader) \u2014 the unique index says so, and this + // read is what keeps a mind-change an UPDATE instead of a duplicate. + const existing = await ctx.api.object('crm_article_feedback').findOne({ + where: { crm_knowledge_article: id, owner_id: userId }, + }); + + if (existing && existing.id) { + if (existing.verdict === '${verdict}') { + return { ok: true, id: existing.id, verdict: '${verdict}', changed: false }; + } + await ctx.api.object('crm_article_feedback').update( + { id: existing.id, verdict: '${verdict}' }, + { where: { id: existing.id } }, + ); + return { ok: true, id: existing.id, verdict: '${verdict}', changed: true }; + } + + const inserted = await ctx.api.object('crm_article_feedback').insert({ + crm_knowledge_article: id, + verdict: '${verdict}', + owner_id: userId, + }); + return { ok: true, id: inserted?.id ?? null, verdict: '${verdict}', changed: true }; + `; +var publishedOnly = P9`has(record.status) && record.status == "published"`; +var MarkArticleHelpfulAction = { + name: "mark_article_helpful", + label: "Helpful", + objectName: "crm_knowledge_article", + icon: "thumbs-up", + type: "script", + body: { + language: "js", + source: feedbackBody("helpful"), + capabilities: ["api.read", "api.write"], + timeoutMs: 5e3 + }, + locations: ["record_header"], + visible: publishedOnly, + successMessage: "Thanks \u2014 recorded as helpful.", + refreshAfter: true +}; +var MarkArticleNotHelpfulAction = { + name: "mark_article_not_helpful", + label: "Not Helpful", + objectName: "crm_knowledge_article", + icon: "thumbs-down", + type: "script", + body: { + language: "js", + source: feedbackBody("not_helpful"), + capabilities: ["api.read", "api.write"], + timeoutMs: 5e3 + }, + locations: ["record_header"], + visible: publishedOnly, + successMessage: "Thanks \u2014 recorded as not helpful.", + refreshAfter: true +}; + +// src/service/dashboards/service.dashboard.ts +var dataset = "case_metrics"; +var ServiceDashboard = { + name: "service_dashboard", + label: "Customer Service", + description: "Case load, SLA health, and resolution performance", + columns: 12, + gap: 4, + refreshIntervalSeconds: 60, + // 1 minute — service desks need fresh numbers + header: { + showTitle: true, + showDescription: true + // Header action buttons removed: `create_case` is not a defined action and + // `/objects/case?owner=current_user` / `/reports/sla` are not in-app view + // routes — all three were dead. Re-add real, wired-up actions here when available. + }, + // Historical note (#460 → #1157): this dashboard shipped without a date + // picker from PR #546 until the 17.0.0 GA upgrade, because windowing a + // `Field.datetime()` could not be compared — `driver-sql` 16.1.0 coerced + // datetime bounds to epoch-ms INTEGER while every datetime in the database is + // ISO TEXT, so `$gte` matched everything and `$lte` matched nothing and the + // whole dashboard read zeros. Both named preconditions are fixed and + // released: objectstack#3912 (the coercion) and objectstack#3777 (a bare-date + // `$lte` dropping same-day rows). The window below is not restored on the + // strength of those closures alone — `test/dashboard-date-range-window.test.ts` + // executes it against a real SQLite database and compares every widget to a + // ground truth computed in the same run, so a re-regression fails CI here + // rather than being discovered as an all-zero dashboard again. + // + // The range windows `created_at`, the platform's creation stamp (#1992). It + // used to window `created_date`, which nothing wrote on a real case, so + // every case created through the UI or REST fell outside every range. + dateRange: { field: "created_at", defaultRange: "last_90_days", allowCustomRange: true }, + globalFilters: [ + { + field: "owner_id", + label: { en: "Agent", "zh-CN": "\u8D1F\u8D23\u4EBA", "es-ES": "Propietario del Caso", "ja-JP": "\u30B1\u30FC\u30B9\u62C5\u5F53\u8005" }, + type: "lookup", + scope: "dashboard", + optionsFrom: { object: "sys_user", valueField: "id", labelField: "name" } + }, + { + field: "priority", + label: { en: "Priority", "zh-CN": "\u4F18\u5148\u7EA7", "es-ES": "Prioridad", "ja-JP": "\u512A\u5148\u5EA6" }, + type: "select", + scope: "dashboard", + options: [ + // zh-CN `critical` is 严重, never 紧急 — 紧急 belongs to crm_task.priority.urgent + // and the two vocabularies are distinct sets (ruling #1342). Same wording as + // `objects.crm_case.fields.priority.options` in every locale pack. + { value: "critical", label: { en: "Critical", "zh-CN": "\u4E25\u91CD", "es-ES": "Cr\xEDtica", "ja-JP": "\u91CD\u5927" } }, + { value: "high", label: { en: "High", "zh-CN": "\u9AD8", "es-ES": "Alta", "ja-JP": "\u9AD8" } }, + { value: "medium", label: { en: "Medium", "zh-CN": "\u4E2D", "es-ES": "Media", "ja-JP": "\u4E2D" } }, + { value: "low", label: { en: "Low", "zh-CN": "\u4F4E", "es-ES": "Baja", "ja-JP": "\u4F4E" } } + ] + } + ], + widgets: [ + // ─── Row 1: Case-Load KPIs ──────────────────────────────────────── + { + id: "open_cases", + title: "Open Cases", + description: "Cases that are not yet closed", + type: "metric", + filter: { is_closed: false }, + colorVariant: "orange", + dataset, + values: ["case_count"], + layout: { x: 0, y: 0, w: 3, h: 2 } + }, + { + id: "critical_cases", + title: "Critical Cases", + description: "Open cases marked as critical priority", + type: "metric", + filter: { priority: "critical", is_closed: false }, + colorVariant: "danger", + dataset, + values: ["case_count"], + layout: { x: 3, y: 0, w: 3, h: 2 } + }, + { + id: "avg_resolution_time", + title: "Avg Resolution Time", + description: "Mean time to close, in hours", + type: "metric", + filter: { is_closed: true }, + colorVariant: "blue", + dataset, + values: ["avg_resolution"], + layout: { x: 6, y: 0, w: 3, h: 2 } + }, + { + id: "sla_violations", + title: "SLA Violations", + description: "Cases that breached their SLA", + type: "metric", + // Counted at READ time (#2070): a case already flagged, OR a case still + // open whose deadline has passed. The second branch is the selection + // `case_sla_monitor` sweeps — same status set, same strict `$lt` at the + // current instant (`{now}` is that instant in a query filter; `{NOW()}` + // in a flow template) — so the tile reads true on a deployment that runs + // no scheduled work, where nothing flags an open breach. It counts; it + // does not act: escalation and the owner's alert still need the sweep. + // `test/case-sla-breach-on-close.test.ts` pins the two to one selection. + filter: { + $or: [ + { is_sla_violated: true }, + { status: { $nin: ["resolved", "closed"] }, sla_due_date: { $lt: "{now}" } } + ] + }, + colorVariant: "warning", + dataset, + values: ["case_count"], + layout: { x: 9, y: 0, w: 3, h: 2 } + }, + // ─── Row 2: Distribution ────────────────────────────────────────── + { + id: "cases_by_status", + title: "Cases by Status", + description: "Workload distribution across the pipeline", + type: "donut", + filter: { is_closed: false }, + colorVariant: "blue", + dataset, + dimensions: ["status"], + values: ["case_count"], + layout: { x: 0, y: 2, w: 4, h: 4 }, + chartConfig: { + showLegend: true, + showDataLabels: true, + colors: ["#0EA5E9", "#06B6D4", "#14B8A6", "#10B981", "#F59E0B"] + } + }, + { + id: "cases_by_priority", + title: "Cases by Priority", + description: "Open case mix by urgency", + type: "pie", + filter: { is_closed: false }, + colorVariant: "warning", + dataset, + dimensions: ["priority"], + values: ["case_count"], + layout: { x: 4, y: 2, w: 4, h: 4 }, + chartConfig: { + showLegend: true, + showDataLabels: true, + // critical → high → medium → low + colors: ["#DC2626", "#F97316", "#F59E0B", "#10B981"] + } + }, + { + id: "cases_by_origin", + title: "Cases by Origin", + description: "Where our cases are coming from", + type: "bar", + colorVariant: "purple", + dataset, + dimensions: ["origin"], + values: ["case_count"], + layout: { x: 8, y: 2, w: 4, h: 4 }, + chartConfig: { + showLegend: false, + showDataLabels: true, + colors: ["#8B5CF6"] + } + }, + // ─── Row 3: Volume & SLA Trends ─────────────────────────────────── + { + id: "daily_case_volume", + title: "Daily Case Volume", + description: "New cases created over the last 30 days", + type: "area", + filter: { created_at: { $gte: "{30_days_ago}" } }, + // Opted out ON PURPOSE, re-decided in #1157 rather than inherited. + // + // The floor above is no longer inert: on 17.0.0 `{30_days_ago}` resolves + // to a start-of-day bound the driver compares correctly (measured, with a + // ground truth, in `test/dashboard-date-range-window.test.ts`), so this + // chart really does plot the last 30 days and its title is true again. + // That is exactly why it must not follow the picker: the dashboard range + // is ANDed into every bound widget, so a reader who selects "last 7 days" + // would get a 7-day chart still labelled "last 30 days". Self-described + // windows opt out — the same rule the Executive dashboard's YTD tile + // follows, pinned by `test/action-references.test.ts`. Binding it instead + // would mean dropping this filter and retitling the widget in all four + // locale bundles; the fixed 30-day volume trend beside a 90-day case load + // is the intended reading. + filterBindings: { dateRange: false }, + colorVariant: "blue", + dataset, + dimensions: ["created_at"], + values: ["case_count"], + layout: { x: 0, y: 6, w: 8, h: 4 }, + chartConfig: { + showLegend: false, + showDataLabels: false, + colors: ["#0EA5E9"], + interaction: { tooltips: true, brush: true } + }, + options: { dateGranularity: "day" } + }, + { + id: "sla_compliance_gauge", + title: "SLA Compliance", + description: "Percent of cases resolved within SLA this period", + type: "gauge", + filter: { is_closed: true }, + colorVariant: "success", + // Plots COMPLIANCE, the quantity the title, the description, the + // success colouring and the 0.95 target line all name (#1213). It used + // to plot `avg_sla_violated` — the complement — with `options.invert` + // asking the renderer to flip it. `invert` is not a declared key on + // `DashboardWidgetOptionsSchema`; it rode the `.passthrough()`, nothing + // could report it inert, and the gauge read 0.0% on an org with 100% + // compliance. The key is gone rather than left pretending: a measure + // that means what the widget says is the fix, and the measure's own + // label prints under the number, so the two cannot drift apart again. + dataset, + values: ["sla_compliance_rate"], + layout: { x: 8, y: 6, w: 4, h: 4 }, + chartConfig: { + showLegend: false, + showDataLabels: true, + colors: ["#10B981", "#F59E0B", "#EF4444"], + annotations: [ + { type: "line", axis: "y", value: 0.95, label: "Target", style: "dashed", color: "#10B981" } + ] + } + // The target line was written for COMPLIANCE and is unchanged: it was + // always right — it was the plotted value that disagreed with it. (The + // green/amber/red `options.thresholds` ladder beside it was deleted in + // 17.6.0's strict cleanup: no dashboard renderer reads widget + // `thresholds`, so it never coloured anything.) + }, + // ─── Row 4: Knowledge deflection (#601) ─────────────────────────── + // + // The deflection metric the card asks the service dashboard to show, and + // the reason it is THREE tiles rather than one: a ratio widget on its own + // is unreadable — 100% could be "40 of 40" or "1 of 1", and a blank rate + // could be "no closed cases" or "no KB resolutions" (measured: a filtered + // measure contributes NO row for a group it selects nothing in, so the + // rate comes back absent, not 0). Numerator and denominator therefore ship + // beside the percentage, the same rule the sales dashboard's win rate + // follows after #614. + { + id: "kb_deflection_rate", + title: "KB Deflection Rate", + description: "Share of closed cases resolved with a knowledge article", + type: "metric", + colorVariant: "success", + dataset, + values: ["kb_deflection_rate"], + layout: { x: 0, y: 10, w: 4, h: 2 } + }, + { + id: "kb_resolved_cases", + title: "Resolved by KB", + description: "Closed cases pointing at the article that resolved them", + type: "metric", + colorVariant: "blue", + dataset, + values: ["kb_resolved_count"], + layout: { x: 4, y: 10, w: 4, h: 2 } + }, + { + id: "closed_cases_total", + title: "Closed Cases", + description: "The denominator behind the deflection rate", + type: "metric", + colorVariant: "default", + dataset, + values: ["closed_count"], + layout: { x: 8, y: 10, w: 4, h: 2 } + }, + { + id: "top_resolving_articles", + title: "Top Resolving Articles", + description: "Knowledge articles ranked by the closed cases they resolved", + type: "table", + filter: { is_closed: true }, + colorVariant: "default", + dataset, + dimensions: ["resolved_article"], + values: ["kb_resolved_count"], + layout: { x: 0, y: 12, w: 12, h: 4 }, + options: { + sortBy: "kb_resolved_count", + sortOrder: "desc", + limit: 10 + } + }, + // ─── Row 5: My Open Cases by Priority ───────────────────────────── + // A dashboard `table` binds to an analytics cube and aggregates; it cannot + // list individual cases (ADR-0021) — for the case-by-case queue, use the + // my_open_cases ListView ("My Cases" in the My Work nav group). + // `{current_user_id}` scopes what this widget SHOWS; it is presentation + // scope, not an access boundary — row-level security owns that (#510). + { + id: "my_open_cases_by_priority", + title: "My Open Cases by Priority", + description: "Your open cases and their SLA-violation rate, broken down by priority", + type: "table", + filter: { is_closed: false, owner_id: "{current_user_id}" }, + // Opts out of the Agent global filter (keyed by its field, `owner_id`): + // ANDing an agent pick into "mine" empties the widget for anyone else. + filterBindings: { owner_id: false }, + colorVariant: "default", + dataset, + dimensions: ["priority"], + values: ["case_count", "avg_sla_violated"], + layout: { x: 0, y: 16, w: 12, h: 4 }, + options: { + sortBy: "case_count", + sortOrder: "desc", + limit: 10 + } + } + ] +}; + +// src/service/datasets/case.dataset.ts +import { defineDataset } from "@objectstack/spec/ui"; +var CaseDataset = defineDataset({ + name: "case_metrics", + label: "Case Metrics", + description: "Semantic layer for support-case counts, resolution time and SLA", + object: "crm_case", + dimensions: [ + { name: "status", label: "Status", field: "status", type: "string" }, + { name: "priority", label: "Priority", field: "priority", type: "string" }, + { name: "origin", label: "Origin", field: "origin", type: "string" }, + { name: "type", label: "Type", field: "type", type: "string" }, + // The platform's creation stamp (#1992) — the same dimension + // `account_metrics` and `lead_metrics` declare, bucketed by day here. + { name: "created_at", label: "Created", field: "created_at", type: "date", dateGranularity: "day" }, + // Article ranking by resolutions (#601) — group closed cases by the + // article that resolved them. `type: 'lookup'`, the same spelling the + // `owner` dimension on `opportunity_metrics` uses for `owner_id`. + { name: "resolved_article", label: "Resolving Article", field: "resolved_by_article", type: "lookup" } + ], + measures: [ + { name: "case_count", label: "Cases", aggregate: "count" }, + { name: "avg_resolution", label: "Avg Resolution (h)", aggregate: "avg", field: "resolution_time_hours", format: "0.0" }, + { name: "avg_sla_violated", label: "SLA Violation Rate", aggregate: "avg", field: "is_sla_violated", format: "0.0%" }, + // ─── Knowledge deflection (#601) ──────────────────────────────────── + // + // "% of closed cases resolved with an article". Built to the shape + // `opportunity_metrics.win_rate` arrived at the hard way (#593/#614): the + // two halves of the ratio are declared HERE as named measures, once, so no + // widget improvises a denominator — a wrong denominator does not error, it + // returns a plausible number. + // + // Each half carries its OWN `filter`, which the executor runs as a + // sub-query and merges back on the selected dimensions. A widget-level + // filter cannot express this: it would narrow BOTH halves to the same row + // set, which is how you end up dividing a number by itself. + // + // `kb_resolved_count` counts the COLUMN, not the rows: `count()` + // counts non-NULL values, so it needs no `$ne: null` predicate and no + // parallel boolean flag to drift out of step with the lookup. MEASURED on + // 17.0.0-rc.6 against both drivers — the numbers are pinned in + // `test/knowledge-deflection.test.ts`. The one thing it CANNOT discount is + // an empty string, which is non-NULL; that is why the blank is normalised + // to NULL at write time by `case_resolution_article_normalize`, and why + // that hook is part of this metric rather than a tidy-up beside it. + // + // Every widget that shows `kb_deflection_rate` also shows + // `kb_resolved_count` and `closed_count` beside it, so a reader can check + // the arithmetic that produced the percentage. + { name: "closed_count", label: "Closed Cases", aggregate: "count", filter: { is_closed: true } }, + { + name: "kb_resolved_count", + label: "Resolved by KB", + aggregate: "count", + field: "resolved_by_article", + filter: { is_closed: true } + }, + { + name: "kb_deflection_rate", + label: "KB Deflection Rate", + derived: { op: "ratio", of: ["kb_resolved_count", "closed_count"] }, + format: "0%" + }, + // ─── SLA compliance (#1213) ───────────────────────────────────────── + // + // The service dashboard's gauge asks "are we meeting SLA?", so the number + // it plots has to BE compliance. It used to plot `avg_sla_violated` — the + // complement — and ask the renderer to flip it with `options.invert`. That + // key is not declared by `DashboardWidgetOptionsSchema`; it rides the + // schema's `.passthrough()`, so no validator, lint rule or gate could ever + // tell the author it does nothing — and none did. The gauge read 0.0% on + // an org with 100% compliance. + // + // Spelled as a ratio of two counts rather than `1 - avg_sla_violated` + // because `DerivedMeasureOp` operands are MEASURE NAMES only (`of: + // string[]` — "no raw fields, no raw SQL"), so there is no literal `1` to + // subtract from. `difference` cannot express it either. This is the card's + // own second option and the spec's sanctioned shape — the one + // `kb_deflection_rate` above already uses. + // + // `is_sla_violated: false`, not `$ne: true`: the field declares + // `defaultValue: false`, and MEASURED on both drivers this app runs, a + // closed case inserted without the column stores `false` rather than NULL. + // So `sla_met_count + violated = closed_count` holds with no NULL hole. + // Both spellings measured identical (2 of 3, both drivers); the plain one + // is the one that reads as what it means. + // + // The denominator is `closed_count`, already declared above — the same + // measure the `closed_cases_total` tile shows, so a reader can check the + // percentage against a number on the same page. An empty numerator group + // does NOT blank the rate: the executor fills a `count` column's empty + // group with 0 BEFORE evaluating derived measures, so a fully-breached org + // reads 0%, not blank. A zero DENOMINATOR (no closed cases at all) does + // return null — "no data", which is the honest reading. + { name: "sla_met_count", label: "Cases Within SLA", aggregate: "count", filter: { is_closed: true, is_sla_violated: false } }, + { + name: "sla_compliance_rate", + label: "SLA Compliance Rate", + derived: { op: "ratio", of: ["sla_met_count", "closed_count"] }, + format: "0%" + } + ] +}); + +// src/sales/email-templates/_bundle.ts +var bundle = (packs) => Object.entries(packs).flatMap(([locale, pack]) => Object.entries(pack).map(([name, row]) => ({ name, locale, ...row }))); + +// src/service/email-templates/en.ts +var en = { + "crm.case_escalated": { + label: "Case Escalated", + subject: "Case escalated: {{case_number}}", + bodyHtml: "

Case {{case_number}} ({{priority}}) has been auto-escalated on critical priority. Ownership passes to the service manager with the lightest load; while nobody holds that position the case stays with you. Open the case to see who owns it now.

" + }, + "crm.case_sla_breach": { + label: "Case SLA Breached", + subject: "SLA breached: case {{case_number}}", + bodyHtml: "

Case {{case_number}} ({{priority}}) passed its SLA due date and has been auto-escalated.

" + } +}; + +// src/service/email-templates/zh-CN.ts +var zhCN = { + "crm.case_escalated": { + label: "\u5DE5\u5355\u5DF2\u5347\u7EA7", + subject: "\u5DE5\u5355\u5DF2\u5347\u7EA7\uFF1A{{case_number}}", + bodyHtml: "

\u5DE5\u5355 {{case_number}}\uFF08{{priority}}\uFF09\u56E0\u4E25\u91CD\u7EA7\u522B\u5DF2\u81EA\u52A8\u5347\u7EA7\u3002\u6240\u6709\u6743\u5C06\u8F6C\u4EA4\u7ED9\u5F53\u524D\u8D1F\u8377\u6700\u8F7B\u7684\u670D\u52A1\u7ECF\u7406\uFF1B\u82E5\u8BE5\u804C\u4F4D\u6682\u65E0\u4EBA\u62C5\u4EFB\uFF0C\u5DE5\u5355\u4ECD\u5F52\u60A8\u6240\u6709\u3002\u8BF7\u6253\u5F00\u5DE5\u5355\u67E5\u770B\u5F53\u524D\u8D1F\u8D23\u4EBA\u3002

" + }, + "crm.case_sla_breach": { + label: "\u5DE5\u5355 SLA \u8D85\u65F6", + subject: "SLA \u8D85\u65F6\uFF1A\u5DE5\u5355 {{case_number}}", + bodyHtml: "

\u5DE5\u5355 {{case_number}}\uFF08{{priority}}\uFF09\u5DF2\u8D85\u8FC7 SLA \u5230\u671F\u65F6\u95F4\uFF0C\u5E76\u5DF2\u81EA\u52A8\u5347\u7EA7\u3002

" + } +}; + +// src/service/email-templates/ja-JP.ts +var jaJP = { + "crm.case_escalated": { + label: "\u30B1\u30FC\u30B9\u306E\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3", + subject: "\u30B1\u30FC\u30B9\u304C\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u3055\u308C\u307E\u3057\u305F: {{case_number}}", + bodyHtml: "

\u30B1\u30FC\u30B9 {{case_number}}\uFF08{{priority}}\uFF09\u306F\u91CD\u5927\u5EA6\u304C\u9AD8\u3044\u305F\u3081\u81EA\u52D5\u7684\u306B\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u3055\u308C\u307E\u3057\u305F\u3002\u6240\u6709\u6A29\u306F\u8CA0\u8377\u306E\u6700\u3082\u8EFD\u3044\u30B5\u30FC\u30D3\u30B9\u30DE\u30CD\u30FC\u30B8\u30E3\u30FC\u306B\u79FB\u308A\u307E\u3059\u3002\u305D\u306E\u5F79\u8077\u306B\u8AB0\u3082\u3044\u306A\u3044\u9593\u306F\u3001\u30B1\u30FC\u30B9\u306F\u3042\u306A\u305F\u306E\u307E\u307E\u3067\u3059\u3002\u30B1\u30FC\u30B9\u3092\u958B\u3044\u3066\u73FE\u5728\u306E\u6240\u6709\u8005\u3092\u3054\u78BA\u8A8D\u304F\u3060\u3055\u3044\u3002

" + }, + "crm.case_sla_breach": { + label: "\u30B1\u30FC\u30B9\u306E SLA \u8D85\u904E", + subject: "SLA \u8D85\u904E: \u30B1\u30FC\u30B9 {{case_number}}", + bodyHtml: "

\u30B1\u30FC\u30B9 {{case_number}}\uFF08{{priority}}\uFF09\u306F SLA \u671F\u9650\u3092\u904E\u304E\u305F\u305F\u3081\u3001\u81EA\u52D5\u7684\u306B\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u3055\u308C\u307E\u3057\u305F\u3002

" + } +}; + +// src/service/email-templates/es-ES.ts +var esES = { + "crm.case_escalated": { + label: "Caso escalado", + subject: "Caso escalado: {{case_number}}", + bodyHtml: "

El caso {{case_number}} ({{priority}}) se ha escalado autom\xE1ticamente por prioridad cr\xEDtica. La propiedad pasa al responsable de servicio con menos carga; mientras nadie ocupe ese puesto, el caso sigue siendo tuyo. Abre el caso para ver qui\xE9n lo tiene ahora.

" + }, + "crm.case_sla_breach": { + label: "SLA del caso incumplido", + subject: "SLA incumplido: caso {{case_number}}", + bodyHtml: "

El caso {{case_number}} ({{priority}}) super\xF3 su fecha l\xEDmite de SLA y se ha escalado autom\xE1ticamente.

" + } +}; + +// src/service/email-templates/crm.email-template.ts +var ServiceEmailTemplates = bundle({ + "en-US": en, + "zh-CN": zhCN, + "ja-JP": jaJP, + "es-ES": esES +}); + +// src/service/flows/case-escalation.flow.ts +import { P as P10, cel } from "@objectstack/spec"; +var CaseEscalationFlow = { + name: "case_escalation", + label: "Case Escalation Process", + description: "Automatically escalate high-priority cases", + type: "record_change", + status: "active", + // A record-change flow fired by a SYSTEM write carries no trigger user + // either — the user-less exposure is NOT schedule-only (ADR-0049), and the + // platform's own build-time lint cannot see this shape + // because it is only knowable at run time. Measured on 17.0.0-rc.2: a + // user-less run refuses the very first data node — "[runAs] refusing a data + // operation (object 'crm_case', event 'record-after-update')" — so a case + // raised by the seed loader, an integration, or another runAs:'system' + // flow's write silently keeps its critical priority forever. + // + // Elevating the USER-driven runs too is correct here: escalation is a + // service-level policy, not the writer's own edit. Both data nodes are keyed + // to `{record.id}` — the row that just fired the trigger — so user scope + // buys no restriction that matters, while it does add a failure mode: an + // agent may legitimately raise a case without holding edit rights on the + // escalation lifecycle fields (`is_escalated` / `escalated_date` / `status`). + // This also puts the flow on the same footing as `case_sla_monitor`, which + // performs the same escalation on a schedule under `runAs: 'system'`. + runAs: "system", + variables: [ + { name: "caseId", type: "text", isInput: true, isOutput: false } + ], + nodes: [ + { + // Trigger wiring (7.4): bind to afterUpdate and gate on the critical + // transition. The re-fire guard MUST NOT rely on the boolean + // `is_escalated`: this flow's own escalation write re-triggers + // record-after-update, and on SQLite/libsql a boolean persists as integer + // `1`, so `record.is_escalated != true` is `1 != true` = true — the guard + // never trips and the flow loops forever (it wedged a first-boot seed on + // 2026-07-06). Instead: + // - `escalated_date == null` marks "never escalated" (the escalation write + // stamps it, suppressing the second fire AND any re-escalation when an + // agent later moves the case back to in_progress to work it); + // - the status terms keep the flow off cases already escalated or already + // finished — without them a critical case could never be resolved or + // closed (the flow would yank `status` straight back to `escalated`). + id: "start", + type: "start", + label: "Start", + config: { + objectName: "crm_case", + triggerType: "record-after-update", + // Also suppress on closed/resolved: closing a critical case is itself + // an afterUpdate, and with only the `!= "escalated"` guard this flow + // re-escalated the case the moment it was closed (observed live: + // close_case wrote status "closed", this flow immediately rewrote it + // to "escalated"). Status strings are the reliable guard — comparing + // the boolean is_closed suffers the SQLite `1 != true` trap above. + // `escalated_date == null` additionally keeps a case that was already + // escalated once (then reopened) from being escalated again. + // + // TOTALITY: every `record.x` read carries a `has(record.x)` + // guard — see the house-rule block in + // `test/flow-condition-totality.test.ts`. Measured end-to-end on + // driver-memory: a case BORN critical is stored without an + // `escalated_date` column at all, `record.escalated_date == null` + // aborted with `No such key: escalated_date`, and this flow never ran + // on the very population it exists for. The guards below preserve the + // predicate's answer on every shape where it previously had one. + // `escalated_date` absent means the same as null ("never escalated"); + // an absent `status` cannot be a terminal status, so it must not + // suppress the escalation. + condition: P10`has(record.priority) && record.priority == "critical" + && (!has(record.escalated_date) || record.escalated_date == null) + && (!has(record.status) + || (record.status != "escalated" && record.status != "resolved" && record.status != "closed"))` + } + }, + { + id: "get_case", + type: "get_record", + label: "Get Case Record", + config: { objectName: "crm_case", filter: { id: cel`record.id` }, outputVariable: "caseRecord" } + }, + { + // The `label` names what this node actually does: it flags the case as + // escalated (see `fields` below) and reassigns nothing. The `id` keeps + // its original `assign_senior_agent` spelling on purpose — `edges[]` + // reference nodes by id, and `CaseEscalationOnCreateFlow` rewrites the + // node list by id, so renaming one is a behaviour change, not a wording + // fix. + id: "assign_senior_agent", + type: "update_record", + label: "Flag as Escalated", + config: { + objectName: "crm_case", + filter: { id: cel`record.id` }, + // `escalation_reason` must be set whenever `is_escalated` flips true — the + // object's `escalation_reason_required` validation rejects the write + // otherwise (which silently aborted this flow until it was supplied). + // + // ⛔ This node writes NO owner, and cannot: reassigning from a flow + // would mean `{caseRecord.owner_id.manager}`, and a flow template + // cannot traverse a lookup — it interpolates to the literal "undefined" + // and would orphan the case under a phantom owner. The hand-off does not + // need to happen here: this very update fires the + // `case_escalation_reassign` beforeUpdate hook + // (`src/service/objects/_case-assignment.ts`), which puts the case with the + // least-loaded holder of the flat `service_manager` position — a pool, + // which the app can resolve, rather than a manager chain, which it + // cannot. With that pool unstaffed the case keeps its owner and this + // write is unchanged. + fields: { is_escalated: true, escalation_reason: "Auto-escalated: critical priority", escalated_date: cel`isoDatetime(now())`, status: "escalated" } + } + }, + // No `create_task` node here: the escalation write above flips `status` to + // `escalated`, which fires the `case_status_side_effects` hook — the single + // owner of escalation follow-up tasks (it also covers the `escalate_case` + // action and the SLA monitor). A second task node here produced duplicate, + // disagreeing tasks (case owner/high vs account owner/urgent) per escalation. + { + // Gateway only — the live predicate is on the out-edge `e4`. The engine + // never reads a `decision` node's singular `config.condition`, so a copy + // here would restate the gate without BEING the gate + // (`flow-inert-node-condition`); `pnpm lint` — `os lint --strict` — + // fails on that. + // + // Why the gate exists: `crm_case.owner_id` is NULLABLE and an unowned case + // is an ordinary state — this repo ships `scripts/backfill-owner-id.ts` + // and `pnpm backfill:owner` precisely because ownerless rows happen, and + // ordinary REST creation / import reach the same state. `notify_team` + // below addresses exactly ONE recipient, so an ownerless case leaves it + // with an empty slate, which the builtin node treats as a HARD failure: + // `execute` returns `success: false`, `executeNode` turns that into a + // throw, and the run ends `status: 'failed'`. + // + // BLAST RADIUS, stated precisely because it differs from the sibling + // defect in `case_sla_monitor` and the difference is structural: these two + // are `record_change` flows with NO loop, so one ownerless case kills only + // its OWN run — there is no queue of other records behind it. A `schedule` + // flow whose work sits inside a `loop` awaits `runRegion` with no + // try/catch, and there one ownerless row takes down every record ordered + // behind it. + // + // ⛔ The gate sits AFTER `assign_senior_agent`, which stays + // UNCONDITIONAL: the escalation itself must still land (measured + // `is_escalated: true`, `status: 'escalated'` on every failing run), so an + // ownerless critical case stays visible in views and reports. Only the + // notify is gated — and here that loses nothing a reader would want, + // because `caseRecord` is read by `get_case` UPSTREAM of the escalation + // write, so `{caseRecord.owner_id}` is deliberately the owner the case had + // BEFORE the hand-off. With no such person there is no "previous owner" + // for the message to be addressed to. + // + // ⚠️ This guard is exactly the duplication objectstack#13682 exists to + // retire — `notify` should treat an empty audience as a RECORDED SKIP + // rather than a hard failure. When that lands, delete this node and edge + // `e4`'s predicate here, and the same pair in `case-sla-monitor.flow.ts`. + id: "check_owner", + type: "decision", + label: "Case Has an Owner?" + }, + { + // ADR-0012: the dedicated `notify` node dispatches through the messaging + // service (inbox + email + push). The legacy `script` + `actionType:'email'` + // shape is a no-op stub in 7.4 and never delivered anything. + // Owner only: `{caseRecord.owner_id.manager}` cannot traverse a lookup in + // flow templates — it interpolates to the literal "undefined". + // The `label` names the single recipient this node has (`recipients` + // below); the `id` keeps its `notify_team` spelling because `edges[]` + // reference it. Cf. the same node in `case-sla-monitor.flow.ts`, whose + // label already says `Alert Owner`. + id: "notify_team", + type: "notify", + label: "Notify Case Owner", + config: { + // Owner only, and the owner it reaches is the one the case had BEFORE + // the escalation: `caseRecord` was read by `get_case` upstream of the + // write, so `{caseRecord.owner_id}` is the agent being handed off from + // — exactly the person this message is for. Flow templates cannot + // traverse a lookup (see the note on `assign_senior_agent` above): + // `{caseRecord.owner_id.manager}` and `{caseRecord.crm_account.name}` + // both interpolate to the literal string "undefined" — a phantom + // recipient and a garbled body. + recipients: [cel`caseRecord.owner_id`], + channels: ["inbox", "email"], + severity: "critical", + topic: "case_escalated", + // ⚠️ The body — now `crm.case_escalated` in `../email-templates/`, one + // row per locale — must stay true on BOTH outcomes. "It remains + // assigned to you" is false whenever the hand-off finds a manager; the + // opposite claim ("it has been reassigned") is false whenever the + // `service_manager` pool is unstaffed, which is the first-install norm. + // So it states the rule and points at the record for the answer, in + // every language. + template: "crm.case_escalated", + templateData: { case_number: cel`caseRecord.case_number`, priority: cel`caseRecord.priority` }, + actionUrl: "/crm_case/{{record.id}}" + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "get_case", type: "default" }, + { id: "e2", source: "get_case", target: "assign_senior_agent", type: "default" }, + { id: "e3", source: "assign_senior_agent", target: "check_owner", type: "default" }, + // The gate. A `decision` with no matching out-edge simply ends the run + // here, after the escalation has already been written. + // + // TOTALITY: `caseRecord` is a `get_record` OUTPUT — a raw driver row, sparse + // in the way `driver-memory` / `driver-mongodb` store only the columns a row + // was written with — so only `has()` is total, and it must be `vars.`-scoped + // (measured: bare `has(caseRecord.owner_id)` still aborts with `Unknown + // variable` on an unbound root, while `has(vars.caseRecord)` answers + // `false`). + // + // ⛔ EVERY TERM IS LOAD-BEARING — do not simplify this predicate. The last + // one MIRRORS THE NOTIFY NODE'S OWN emptiness rule rather than guessing at + // it: builtin `notify` builds its audience with `String(v).trim()` + + // `.filter(Boolean)`, so null, undefined, `''` and any all-whitespace value + // all collapse to the same empty slate. Each term was measured through + // `evaluateCondition` on the shape it alone covers, by dropping it and + // recording what the rest do: + // - `has(vars.caseRecord)` — an UNBOUND root. Without it the predicate + // aborts with `No such key: caseRecord`. `get_case` binds the variable + // on every path here (it sets it even when it matched nothing), so this + // term is what keeps a future graph edit from turning a gate into an + // abort — and the `vars.`-scoped `has()` pair is the house rule + // `test/flow-variable-conditions.test.ts` enforces. + // - `has(vars.caseRecord.owner_id)` — the ABSENT key. Without it, + // `vars.caseRecord.owner_id != null` aborts with `No such key: owner_id`. + // - `vars.caseRecord.owner_id != null` — the explicit NULL. Without it the + // wrap is handed one and aborts with `no matching overload for + // 'string(null)'`, so this term must short-circuit in front of it. + // - `string(...).trim() != ""` — the BLANK/whitespace id. `' ' != ""` is + // TRUE in CEL, so a gate written that way opens for a whitespace + // `owner_id` and reproduces this very defect one input narrower. The + // `string()` wrap is not decoration either: measured, a bare `.trim()` + // on a numeric id aborts with `no matching overload for + // 'double.trim()'` and `.matches()` with `'double.matches(string)'` — a + // thrown condition, the fault mode this gate exists to remove. + // + // ⛔ Do NOT add a `vars.caseRecord != null` term for the row that is GONE by + // the time `get_case` reads it. Measured INERT: `get_record` with no match + // sets the variable to `null`, key present, and `has()` on a null base + // answers `false` rather than aborting, so the four terms above already + // close that shape (`test/flow-escalation-ownerless-case.test.ts` covers + // it). A term that cannot change an answer is an inert copy, not defence in + // depth. + { id: "e4", source: "check_owner", target: "notify_team", type: "conditional", condition: P10`has(vars.caseRecord) && has(vars.caseRecord.owner_id) + && vars.caseRecord.owner_id != null && string(vars.caseRecord.owner_id).trim() != ""`, label: "Has owner" }, + { id: "e5", source: "notify_team", target: "end", type: "default" } + ] +}; +var CaseEscalationOnCreateFlow = { + ...CaseEscalationFlow, + name: "case_escalation_on_create", + label: "Case Escalation Process (on create)", + description: "Escalate cases created critical (insert-time twin of case_escalation)", + nodes: CaseEscalationFlow.nodes.map( + (n) => n.id === "start" ? { ...n, config: { ...n.config, triggerType: "record-after-create" } } : n + ) +}; + +// src/service/flows/case-actions.flow.ts +import { cel as cel2 } from "@objectstack/spec"; + +// src/service/objects/_case-assignment.ts +var CLAIMABLE_TARGET_STATUSES = [ + "in_progress", + "waiting_customer", + "waiting_support" +]; +function createCaseRoundRobinAssign(hookName = "case_auto_assign") { + return { + name: hookName, + object: "crm_case", + events: ["beforeInsert"], + priority: 250, + description: "Assign ownerless new cases to the least-loaded service agent.", + handler: async (ctx) => { + const { input } = ctx; + if (typeof input.owner_id === "string" && input.owner_id) return; + const api = ctx.api; + if (!api) return; + try { + const holders = await api.object("sys_user_position").find({ + where: { position: "service_agent" }, + fields: ["user_id"], + top: 1e3 + }); + const agentIds = Array.from( + new Set( + (holders ?? []).map((r) => typeof r.user_id === "string" ? r.user_id : "").filter(Boolean) + ) + ); + if (agentIds.length === 0) return; + let best; + let bestCount = Infinity; + for (const agentId of agentIds) { + const openCount = await api.object("crm_case").count({ + where: { owner_id: agentId, status: { $nin: ["resolved", "closed"] } } + }); + if (openCount < bestCount) { + bestCount = openCount; + best = agentId; + } + } + if (best) input.owner_id = best; + } catch { + } + } + }; +} +function createCaseEscalationReassign(hookName = "case_escalation_reassign") { + return { + name: hookName, + object: "crm_case", + events: ["beforeUpdate"], + priority: 250, + runAs: "system", + description: "Hand a case being escalated to the least-loaded service manager.", + handler: async (ctx) => { + if (ctx.dispatch?.mode === "per-row") return; + const { input } = ctx; + const previous = ctx.previous; + if (!previous) return; + if (input.status !== "escalated" || previous.status === "escalated") return; + if (typeof input.owner_id === "string" && input.owner_id) return; + const api = ctx.api; + if (!api) return; + const organizationId = typeof previous.organization_id === "string" && previous.organization_id !== "" ? previous.organization_id : void 0; + const inOrganization = organizationId ? { organization_id: organizationId } : {}; + try { + const holders = await api.object("sys_user_position").find({ + where: { position: "service_manager", ...inOrganization }, + fields: ["user_id"], + top: 1e3 + }); + const managerIds = Array.from( + new Set( + (holders ?? []).map((r) => typeof r.user_id === "string" ? r.user_id : "").filter(Boolean) + ) + ); + if (managerIds.length === 0) return; + const currentOwner = typeof previous.owner_id === "string" && previous.owner_id || ""; + if (currentOwner && managerIds.indexOf(currentOwner) !== -1) return; + let best; + let bestCount = Infinity; + for (const managerId of managerIds) { + const openCount = await api.object("crm_case").count({ + where: { owner_id: managerId, status: { $nin: ["resolved", "closed"] }, ...inOrganization } + }); + if (openCount < bestCount) { + bestCount = openCount; + best = managerId; + } + } + if (best) input.owner_id = best; + } catch { + } + } + }; +} +function createCaseSelfClaim(hookName = "case_self_claim") { + return { + name: hookName, + object: "crm_case", + events: ["beforeUpdate"], + priority: 260, + description: "Let a user claim an unowned open case by picking it up; the owner written is always the caller.", + handler: async (ctx) => { + if (ctx.dispatch?.mode === "per-row") return; + const { input } = ctx; + const previous = ctx.previous; + if (!previous) return; + const claimant = ctx.user?.id; + if (typeof claimant !== "string" || !claimant) return; + if (ctx.session?.isSystem) return; + if ("owner_id" in input) return; + if (typeof previous.owner_id === "string" && previous.owner_id) return; + if (previous.status === "closed") return; + if (previous.is_closed === true || previous.is_closed === 1) return; + const next = input.status; + if (typeof next !== "string" || next === previous.status) return; + if (next !== "in_progress" && next !== "waiting_customer" && next !== "waiting_support") return; + input.owner_id = claimant; + } + }; +} + +// src/service/flows/case-actions.flow.ts +var EscalateCaseFlow = { + name: "escalate_case", + label: "Escalate Case", + description: "Collect an escalation reason, then flag and re-prioritise the case.", + type: "screen", + status: "active", + variables: [ + // MUST be `recordId` — the console's flow-action contract seeds only that + // name (and its camelCase object alias); a custom name arrives undefined. + { name: "recordId", type: "text", isInput: true, isOutput: false }, + { name: "reason", type: "text", isInput: true, isOutput: false } + ], + nodes: [ + { id: "start", type: "start", label: "Start", config: { objectName: "crm_case" } }, + { + id: "screen_1", + type: "screen", + label: "Escalate Case", + config: { + fields: [ + { name: "reason", label: "Escalation Reason", type: "textarea", required: true } + ] + } + }, + { + // The USER-CONTEXT half of the escalation. Everything here is a + // column the acting agent may legitimately write, so it is written with + // their identity — this flow stays `runAs: 'user'`. + // + // escalation_reason the agent's own screen input + // priority an ordinary editable field + // status ordinary, and the hook trigger (below) + // + // The two stamps a person never types — `is_escalated` and + // `escalated_date` — are `readonly: true` on `crm_case` and are written + // by the `case_escalation_stamp` subflow that follows, with the system + // context. See `src/service/flows/case-escalation-stamp.flow.ts`. + // + // ⚠️ `status: 'escalated'` MUST stay in this node, and not only because + // it is user-writable: it is the trigger both escalation hooks key off — + // `case_escalation_reassign` (`_case-assignment.ts`) gates on + // `input.status !== 'escalated' || previous.status === 'escalated'`, and + // `case_status_side_effects` (`case.hook.ts`) reads the same transition. + // Keeping it here keeps the ownership hand-off and the side-effect tasks + // firing from the ACTING USER's write, exactly as they did before the + // split. Moving it into the elevated subflow would silently re-attribute + // both to the system. + // + // It is also what suppresses a double-fire of the automatic + // `case_escalation` record-change flow. + id: "escalate", + type: "update_record", + label: "Escalate Case", + config: { + objectName: "crm_case", + filter: { id: cel2`recordId` }, + fields: { + escalation_reason: cel2`reason`, + status: "escalated", + priority: "critical" + } + } + }, + { + // The ELEVATED half, and the only elevation in this flow: one + // `runAs: 'system'` flow, one `update_record`, two readonly columns. + // The maintainer-approved direction — elevate the write, not the flow. + // + // ⚠️ THIS NODE MUST RUN AFTER `escalate`, NOT BEFORE. `crm_case`'s + // `escalation_reason_required` validation rejects any write whose merged + // record has `is_escalated == true` and a blank `escalation_reason`. The + // reason is written by the node above, so by the time the flag flips it + // is already stored. Reversing these two nodes fires that validation + // against a record with no reason yet and the stamp is rejected. + // + // ⛔ Do not "simplify" this by giving THIS flow `runAs: 'system'` and + // folding the stamp back into the node above. That is option A, costed + // and explicitly not adopted: it elevates every write this screen flow + // makes and stops it carrying the acting user's context downstream. + // `AGENTS.md` house rule 9 states it as standing policy. + id: "stamp_escalation", + type: "subflow", + label: "Stamp Escalation Flags", + config: { + flowName: "case_escalation_stamp", + input: { recordId: cel2`recordId` } + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "screen_1", type: "default" }, + { id: "e2", source: "screen_1", target: "escalate", type: "default" }, + { id: "e3", source: "escalate", target: "stamp_escalation", type: "default" }, + { id: "e4", source: "stamp_escalation", target: "end", type: "default" } + ] +}; +var CloseCaseFlow = { + name: "close_case", + label: "Close Case", + description: "Collect the resolution, then close the case and stop the SLA clock.", + type: "screen", + status: "active", + // `is_closed` is a readonly lifecycle field. This trusted screen flow owns + // the transition and must therefore run with the system writer. + // + // ⛔ A HISTORICAL PRECEDENT, NOT A POLICY — do not cite this line to justify + // elevating another screen flow (#1434, the maintainer ruling that settled + // it). The standing rule is the opposite one: a screen flow stays + // `runAs: 'user'` and a write that genuinely needs elevation is split into a + // dedicated `system` sub-flow reached by a `subflow` node — see + // `escalate_case` above and `src/service/flows/case-escalation-stamp.flow.ts`. + // "Readonly stripped my write, so I made the flow system" is the pattern + // that ruling exists to stop being copied; `AGENTS.md` house rule 9 carries + // it as house policy. This flow predates that rule and has not been + // re-shaped to match it. + runAs: "system", + variables: [ + { name: "recordId", type: "text", isInput: true, isOutput: false }, + { name: "resolution", type: "text", isInput: true, isOutput: false }, + { name: "resolved_by_article", type: "text", isInput: true, isOutput: false } + ], + nodes: [ + { id: "start", type: "start", label: "Start", config: { objectName: "crm_case" } }, + { + // The "attach the article that resolved it" affordance. Optional + // on purpose: most cases are not resolved out of the knowledge base, and + // a required field here would be answered with a junk value rather than + // left honest — which is worse than an absent link for a measure whose + // whole job is to say how OFTEN the KB resolves a case. + // + // `reference` names the object the picker offers. Up to + // `@objectstack/spec@17.4.0` a screen field had no such key, so this + // `type: 'lookup'` field had nothing to resolve a record picker from; + // 17.5.0 added `reference` to `ScreenFieldConfigSchema` and made it + // REQUIRED on a lookup screen field (#17913) — the stack does not load + // without it. It is the same target the case's own `resolved_by_article` + // lookup declares (`crm_knowledge_article`). + // + // The `Resolved by Article` lookup in the case's Resolution group, on the + // record form, writes the same column; the action is + // `refreshAfter: true`, so the record form is what the agent lands on + // immediately after closing. + id: "screen_1", + type: "screen", + label: "Close Case", + config: { + fields: [ + { name: "resolution", label: "Resolution", type: "textarea", required: true }, + { + name: "resolved_by_article", + label: "Resolved by Article (optional)", + type: "lookup", + reference: "crm_knowledge_article", + required: false + } + ] + } + }, + { + // `resolved_by_article` is written unconditionally, and a blank one is + // normalised to NULL by `case_resolution_article_normalize` + // (`src/service/objects/case.hook.ts`) rather than branched around here: MEASURED + // on the real engine, a screen field left empty resumes as `''` and lands + // as an empty string, which `count(resolved_by_article)` counts. A + // `decision` node could not have branched it either — this repo has + // measured `decision.config.condition` to be inert metadata + // (`test/win-loss-capture.test.ts`'s table of five such surfaces). + // + // The read is guarded because the field is optional: a resume that omits + // it leaves the variable unbound, which the 17.x template wrote as nothing + // (the stored link left alone) and CEL refuses. The guard writes NULL + // there — the value a blank field already lands as after the normalize + // hook — so an omitted answer and an empty one now close the case alike. + id: "close", + type: "update_record", + label: "Close Case", + config: { + objectName: "crm_case", + filter: { id: cel2`recordId` }, + fields: { + is_closed: true, + resolution: cel2`resolution`, + status: "closed", + resolved_by_article: cel2`has(vars.resolved_by_article) ? resolved_by_article : null` + } + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "screen_1", type: "default" }, + { id: "e2", source: "screen_1", target: "close", type: "default" }, + { id: "e3", source: "close", target: "end", type: "default" } + ] +}; +var CLAIM_STATUS_LABEL = { + in_progress: "In Progress", + waiting_customer: "Waiting on Customer", + waiting_support: "Waiting on Support" +}; +var CLAIM_STATUS_OPTIONS = CLAIMABLE_TARGET_STATUSES.map((value) => ({ + value, + label: CLAIM_STATUS_LABEL[value] +})); +var ClaimCaseFlow = { + name: "claim_case", + label: "Claim Case", + description: "Take an unowned case out of triage by moving it to a status that means you are on it.", + type: "screen", + status: "active", + // Load-bearing, not boilerplate — see the header. A system run claims nobody. + runAs: "user", + variables: [ + // MUST be `recordId` — the console's flow-action contract seeds only that + // name (and its camelCase object alias); a custom name arrives undefined. + { name: "recordId", type: "text", isInput: true, isOutput: false }, + { name: "claimStatus", type: "text", isInput: true, isOutput: false } + ], + nodes: [ + { id: "start", type: "start", label: "Start", config: { objectName: "crm_case" } }, + { + id: "screen_1", + type: "screen", + label: "Claim Case", + config: { + fields: [ + { + name: "claimStatus", + label: "Working status", + type: "select", + required: true, + defaultValue: "in_progress", + options: CLAIM_STATUS_OPTIONS + } + ] + } + }, + { + // ⛔ `status` is the ONLY field this node may ever carry. Adding + // `owner_id` here does not "make the claim explicit" — it makes the write + // refused by the transfer gate before any hook runs, and it takes + // `case_self_claim` out of the path on the one caller it would reach. + // The guard beside this file fails on any such addition. + id: "claim", + type: "update_record", + label: "Claim Case", + config: { + objectName: "crm_case", + filter: { id: cel2`recordId` }, + fields: { + status: cel2`claimStatus` + } + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "screen_1", type: "default" }, + { id: "e2", source: "screen_1", target: "claim", type: "default" }, + { id: "e3", source: "claim", target: "end", type: "default" } + ] +}; + +// src/service/flows/case-escalation-stamp.flow.ts +import { cel as cel3 } from "@objectstack/spec"; +var CaseEscalationStampFlow = { + name: "case_escalation_stamp", + label: "Stamp Case Escalation", + description: "Write the two readonly escalation stamps (is_escalated, escalated_date) with the system context. Called by escalate_case through a subflow node.", + type: "autolaunched", + status: "active", + // ⭐ THE ENTIRE POINT OF THIS FILE. This is the only elevation in the + // escalate path, and it covers exactly one `update_record` node. + runAs: "system", + variables: [ + // Supplied by the caller's `subflow` node, whose `input` envelope reads its own `recordId`. + { name: "recordId", type: "text", isInput: true, isOutput: false } + ], + nodes: [ + // `config: {}` matches the shape measured in + // `test/readonly-write-semantics.test.ts`: an autolaunched callee is handed + // its params by the `subflow` executor and resolves no trigger record of + // its own, so there is no `objectName` for the start node to load. + { id: "start", type: "start", label: "Start", config: {} }, + { + id: "stamp", + type: "update_record", + label: "Stamp Escalation Flags", + config: { + objectName: "crm_case", + filter: { id: cel3`recordId` }, + // ⛔ Do not add fields here. Every column in this node is written with + // the elevated context; anything a user can legitimately type belongs + // in `escalate_case` instead. + fields: { + is_escalated: true, + escalated_date: cel3`isoDatetime(now())` + } + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "stamp", type: "default" }, + { id: "e2", source: "stamp", target: "end", type: "default" } + ] +}; + +// src/service/flows/case-sla-monitor.flow.ts +import { P as P11, cel as cel4 } from "@objectstack/spec"; + +// src/sales/flows/_guarded-iteration.ts +var guarded = (key, region) => ({ + nodes: [{ + id: `guard_${key}`, + type: "try_catch", + label: "Guarded Iteration", + config: { + try: region, + catch: { nodes: [{ id: `handled_${key}`, type: "assignment", label: "Skip This Item" }] } + } + }] +}); + +// src/service/flows/case-sla-monitor.flow.ts +var CASE_HAS_OWNER = () => P11`has(vars.currentCase) && has(vars.currentCase.owner_id) + && vars.currentCase.owner_id != null && string(vars.currentCase.owner_id).trim() != ""`; +var CASE_HAS_NO_OWNER = () => P11`has(vars.currentCase) && (!has(vars.currentCase.owner_id) + || vars.currentCase.owner_id == null || string(vars.currentCase.owner_id).trim() == "")`; +var CaseSlaMonitorFlow = { + name: "case_sla_monitor", + label: "Case SLA Monitor", + description: "Hourly sweep: flag and escalate open cases that have breached their SLA due date.", + type: "schedule", + status: "active", + // Scheduled runs have no trigger user, so under the default runAs:'user' the + // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that + // RLS-bypassing elevation explicit and intended (ADR-0049). + runAs: "system", + variables: [], + nodes: [ + { id: "start", type: "start", label: "Start (hourly)", config: { schedule: "0 * * * *" } }, + { + id: "query_breached", + type: "get_record", + label: "Find Breached Cases", + config: { + objectName: "crm_case", + // ⛔ `$nin` on `status`, never `is_closed: false`: a case in `resolved` + // has met its SLA — work is finished — but `is_closed` only flips on + // `closed`, so the boolean filter stamps false breaches on resolved + // cases and drags them back to `escalated`. + // + // `$lt` is `caseSlaBreached` (`src/service/objects/_case-sla.ts`) read + // with "now" as the instant: STRICTLY past due. Its other half is + // `case_sla_defaults`, which applies the same rule on the write that + // settles a case — so a case settled late is flagged even when this + // sweep never reached it, or never runs (#2070). + // + // "Now" is the query engine's own `{now}` placeholder, which an + // 18.0.0-next.0 filter operand leaves to the engine as written. It + // renders the instant's ISO text, as the retired `{NOW()}` flow token + // did, and it is the spelling the SLA Violations tile reads, so the + // sweep and the tile say "past due" in one wording. + filter: { + status: { $nin: ["resolved", "closed"] }, + is_sla_violated: false, + sla_due_date: { $lt: "{now}" } + }, + limit: 500, + outputVariable: "caseList" + } + }, + { + id: "loop_cases", + type: "loop", + label: "For Each Breached Case", + config: { + collection: cel4`caseList`, + iteratorVariable: "currentCase", + body: guarded("case", { + nodes: [ + { + id: "flag_breach", + type: "update_record", + label: "Flag SLA Breach", + config: { + objectName: "crm_case", + filter: { id: cel4`currentCase.id` }, + // `escalation_reason` must accompany `is_escalated: true` — the + // object's `escalation_reason_required` validation (severity: + // error) rejects the whole write otherwise, turning this sweep + // into a silent no-op (cf. the same fix in case_escalation). + fields: { + is_sla_violated: true, + is_escalated: true, + status: "escalated", + escalated_date: cel4`isoDatetime(now())`, + escalation_reason: "Auto-escalated: SLA due date breached" + } + } + }, + { + // Gateway only — the predicate lives on the out-edge. + // + // `crm_case.owner_id` is NULLABLE and an unowned case is an + // ordinary state (this repo ships `scripts/backfill-owner-id.ts` / + // `pnpm backfill:owner` precisely because ownerless rows happen; + // ordinary REST creation and import reach it too). The `notify` + // node below addresses exactly one recipient, so an ownerless case + // left it with an empty slate — which the builtin node treats as a + // HARD failure, and that failure is not scoped to the one case: + // `executeNode` throws, `runRegion` rethrows, and the `loop` node + // awaits it with no try/catch, so the whole sweep died on the + // ownerless row and every breached case ORDERED BEHIND IT was + // never even flagged. Measured, not assumed — see + // `test/flow-sla-ownerless-case.test.ts`. + // + // The gate sits AFTER `flag_breach` on purpose. `flag_breach` is + // unconditional, so an ownerless breach is still RECORDED on the + // record — visible in views and reports, where a service manager + // finds it. Gating both would trade a dead run for a silently + // dropped alert on exactly the cases most likely to be neglected. + // + // The ownerless branch is not a dead end: it goes to + // `reload_case`, because by the time the gate is reached the + // sweep's own write may ALREADY HAVE GIVEN THE CASE AN OWNER — + // see that node (maintainer ruling 2026-09-03, option C). + id: "check_owner", + type: "decision", + label: "Case Has an Owner?" + }, + { + // Re-read the case the sweep just wrote. + // + // ⚠️ THE ASSIGNMENT IS NOT AUTHORED HERE, AND MUST NOT BE. + // `flag_breach` writes `status: 'escalated'`, and that IS the + // escalation transition `case_escalation_reassign` + // (`src/service/objects/_case-assignment.ts`, `beforeUpdate`, priority + // 250) fires on: it stamps the least-loaded holder of the + // `service_manager` position onto the payload of the update + // already in flight. So the sweep does not need a seam to "call" + // the assignment — performing the transition IS putting the case + // through it, and the app keeps ONE answer to "who should own + // this case" instead of a flow-shaped second implementation of + // least-loaded balancing. + // + // MEASURED, not assumed (`test/flow-sla-ownerless-case.test.ts` + // drives the real flow, the real engine and the real hooks): with + // a staffed pool an ownerless breached case comes back owned; with + // an empty pool the hook stands down and the case comes back + // ownerless. No second write, no re-entry, no loop — the hook + // mutates the in-flight payload and issues no operation of its + // own. + // + // ⛔ The READ is what this node is for, not a second write: + // `currentCase` is the loop item bound by `query_breached` BEFORE + // `flag_breach` ran, so the owner the sweep just assigned is + // invisible to it and `{currentCase.owner_id}` addresses the + // pre-write state. Re-binding the SAME variable is what makes the + // rest of the iteration — the gate below and the notify node's + // whole template — read the case as it now stands, with no second + // notify node to keep in step. + // + // No `limit`: `get_record` calls `findOne` at or below 1 and binds + // the single row itself, which is what `{currentCase.}` + // needs. A miss binds `null` — `get_record` always binds — which + // `check_assigned` below is there to read. + id: "reload_case", + type: "get_record", + label: "Re-read Case After Escalation", + config: { + objectName: "crm_case", + filter: { id: cel4`currentCase.id` }, + outputVariable: "currentCase" + } + }, + { + // Gateway only — the predicate lives on the out-edge. + // + // The ruled empty-pool clause, as a gate rather than a failure: + // when the `service_manager` pool resolves empty the hook assigns + // nobody, the re-read case is still ownerless, no edge matches and + // the iteration ends. The breach stays on the record and in the + // run summary, the notification is skipped at a NAMED gate, and + // the run survives. ⛔ No hard failure, no fallback recipient, no + // manager-chain dot-walk. + id: "check_assigned", + type: "decision", + label: "Escalation Found an Owner?" + }, + { + // Owner only: `{currentCase.owner_id.manager}` cannot traverse a + // lookup in flow templates — it interpolates to the literal + // "undefined" (cf. case_escalation / opportunity_won_alert). + // + // Reached from BOTH gates, and the whole template reads + // `currentCase` either way: on the owned branch that is the row + // `query_breached` bound, on the ownerless branch the row + // `reload_case` re-bound. One node, one wording, one recipient + // rule — a second notify node would be the same alert authored + // twice, free to drift on the half nobody is looking at. + // + // ⚠️ THE RECIPIENT IS RULED, NOT INCIDENTAL — #1535, maintainer + // ruling 2026-09-07, option A. On a breached + // case that ALREADY HAS AN OWNER, `flag_breach` writes + // `status: 'escalated'` and `case_escalation_reassign` hands the + // case to the least-loaded `service_manager` inside that same + // write — yet this node addresses `currentCase` as + // `query_breached` bound it, BEFORE the hand-off. So the breach + // alert deliberately reaches the agent the case is being taken + // FROM, not the manager who now owns it. + // + // It is the SAME etiquette `case_escalation` already states in + // `content/docs/service/sla-and-escalation.mdx` — "the + // notification goes to the previous owner alone" — and that page + // now states it for this sweep too. One escalation etiquette + // across both mechanisms. + // + // ⛔ Do not "fix" this into an alert for the new owner. That is + // option C, and it would have to re-rule `case_escalation` in the + // same stroke — ⛔ never one mechanism only. + // + // `test/flow-sla-ownerless-assignment.test.ts` pins the pairing + // (the owned breach IS handed over AND its alert still goes to + // the pre-hand-off owner), and records the ruling's declared gap + // as measured: the hand-off hook issues no notice of its own, so + // the receiving manager is told nothing by this run. + id: "notify_team", + type: "notify", + label: "Alert Owner", + config: { + // Owner only — `{currentCase.owner_id.manager}` dot-walks a + // lookup, which flow templates interpolate as "undefined". + recipients: [cel4`currentCase.owner_id`], + channels: ["inbox", "email"], + severity: "critical", + topic: "case_sla_breach", + template: "crm.case_sla_breach", + templateData: { + case_number: cel4`currentCase.case_number`, + priority: cel4`currentCase.priority` + }, + actionUrl: "/crm_case/{{currentCase.id}}" + } + } + ], + edges: [ + { id: "b1", source: "flag_breach", target: "check_owner", type: "default" }, + // The two out-edges of `check_owner` are an exact PARTITION of the + // cases where `currentCase` is bound (see {@link CASE_HAS_OWNER} / + // {@link CASE_HAS_NO_OWNER}) — never a `default` edge alongside a + // conditional one, which would traverse BOTH and notify twice. + // + // ⚠️ The owned branch reads `currentCase` as `query_breached` bound + // it, deliberately: a case that already had an + // owner keeps alerting THAT owner, which is what the sweep has + // always done. ⚠️ That is RULED intent now, no longer an open + // question — the `notify_team` node carries the ruling. + { id: "b2", source: "check_owner", target: "notify_team", type: "conditional", condition: CASE_HAS_OWNER(), label: "Has owner" }, + { id: "b3", source: "check_owner", target: "reload_case", type: "conditional", condition: CASE_HAS_NO_OWNER(), label: "No owner \u2014 re-read after escalation" }, + { id: "b4", source: "reload_case", target: "check_assigned", type: "default" }, + // Both branches converge on the ONE notify node, which is why the + // re-read re-binds `currentCase` rather than a second variable: the + // recipient, the title, the message and the action URL are authored + // once and cannot drift into two versions of the same alert. + // + // A gate with no matching edge simply ends the iteration, so an + // ownerless case the pool could not place is skipped and the loop + // moves on to the next breached case — the run survives, which is + // the property this flow was repaired for. + { id: "b5", source: "check_assigned", target: "notify_team", type: "conditional", condition: CASE_HAS_OWNER(), label: "Escalation assigned an owner" } + ] + }) + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "query_breached", type: "default" }, + { id: "e2", source: "query_breached", target: "loop_cases", type: "default" }, + { id: "e3", source: "loop_cases", target: "end", type: "default" } + ] +}; + +// src/service/objects/article_feedback.hook.ts +var articleFeedbackMetricsRefresh = { + name: "article_feedback_metrics_refresh", + object: "crm_article_feedback", + events: ["afterInsert", "afterUpdate", "afterDelete"], + priority: 800, + async: true, + onError: "log", + runAs: "system", + description: "Recount an article\u2019s helpful / not-helpful votes from crm_article_feedback.", + handler: async (ctx) => { + const api = ctx.api; + if (!api) return; + const { input } = ctx; + const previous = ctx.previous; + const articleIds = Array.from(new Set([ + typeof input?.crm_knowledge_article === "string" ? input.crm_knowledge_article : "", + typeof previous?.crm_knowledge_article === "string" ? previous.crm_knowledge_article : "" + ].filter(Boolean))); + for (const id of articleIds) { + const helpful = await api.object("crm_article_feedback").count({ + where: { crm_knowledge_article: id, verdict: "helpful" } + }); + const notHelpful = await api.object("crm_article_feedback").count({ + where: { crm_knowledge_article: id, verdict: "not_helpful" } + }); + await api.object("crm_knowledge_article").update({ + id, + helpful_count: helpful, + not_helpful_count: notHelpful + }, { where: { id } }); + } + } +}; +var article_feedback_hook_default = [articleFeedbackMetricsRefresh]; + +// src/service/objects/case.hook.ts +var caseValidation = { + name: "case_sla_defaults", + object: "crm_case", + events: ["beforeInsert", "beforeUpdate"], + priority: 200, + description: "Apply the priority \xD7 account-tier SLA matrix and the case lifecycle defaults.", + handler: async (ctx) => { + if (ctx.event === "beforeUpdate" && ctx.dispatch?.mode === "per-row") return; + const { input } = ctx; + const api = ctx.api; + const isGuestSubmission = !ctx.previous && !ctx.user?.id && !ctx.session?.isSystem; + if (isGuestSubmission) { + if (!input.origin) input.origin = "web"; + if (!input.status) input.status = "new"; + input.owner_id = null; + input.is_escalated = false; + input.escalation_reason = null; + input.internal_notes = null; + input.resolution = null; + } + const priority = typeof input.priority === "string" && input.priority || typeof ctx.previous?.priority === "string" && ctx.previous.priority || void 0; + if (priority) { + const rank = { low: 1, medium: 2, high: 3, critical: 4 }; + input.priority_rank = rank[priority] ?? 0; + } + if (priority && !input.sla_due_date && !ctx.previous?.sla_due_date) { + const slaCalendarHours = { + critical: { strategic: 4, enterprise: 4, mid_market: 4, smb: 4 }, + high: { strategic: 6, enterprise: 8, mid_market: 8, smb: 8 }, + medium: { strategic: 24, enterprise: 36, mid_market: 48, smb: 48 }, + low: { strategic: 96, enterprise: 120, mid_market: 168, smb: 168 } + }; + const DEFAULT_TIER = "smb"; + const row = slaCalendarHours[priority]; + if (row) { + let tier = DEFAULT_TIER; + const variesByTier = row.strategic !== row.enterprise || row.enterprise !== row.mid_market || row.mid_market !== row.smb; + const accountId = typeof input.crm_account === "string" && input.crm_account || typeof ctx.previous?.crm_account === "string" && ctx.previous.crm_account || void 0; + if (variesByTier && accountId && api) { + try { + const found = await api.object("crm_account").find({ + where: { id: accountId }, + fields: ["tier"], + top: 1 + }); + const rows = Array.isArray(found) ? found : []; + const stored = rows.length ? rows[0].tier : void 0; + if (typeof stored === "string" && stored) tier = stored; + } catch { + } + } + const hours = row[tier] ?? row[DEFAULT_TIER]; + input.sla_due_date = new Date(Date.now() + hours * 36e5).toISOString(); + } + } + const effStatus = typeof input.status === "string" && input.status || typeof ctx.previous?.status === "string" && ctx.previous.status || void 0; + if (typeof effStatus === "string") input.is_closed = effStatus === "closed"; + if (!isGuestSubmission) { + const becameClosed = input.status === "closed" && ctx.previous?.status !== "closed"; + if (becameClosed && !input.closed_date && !ctx.previous?.closed_date) { + input.closed_date = (/* @__PURE__ */ new Date()).toISOString(); + } + const closedDate = typeof input.closed_date === "string" && input.closed_date || typeof ctx.previous?.closed_date === "string" && ctx.previous.closed_date || void 0; + const createdDate = typeof input.created_at === "string" && input.created_at || typeof ctx.previous?.created_at === "string" && ctx.previous.created_at || void 0; + if (closedDate && createdDate) { + const hrs = (new Date(closedDate).getTime() - new Date(createdDate).getTime()) / 36e5; + if (Number.isFinite(hrs) && hrs >= 0) input.resolution_time_hours = Math.round(hrs * 10) / 10; + } + const settledStatuses = ["resolved", "closed"]; + if (settledStatuses.includes(String(effStatus)) && !settledStatuses.includes(String(ctx.previous?.status))) { + const due = input.sla_due_date !== void 0 ? input.sla_due_date : ctx.previous?.sla_due_date; + const stoppedAt = typeof input.closed_date === "string" && input.closed_date || (/* @__PURE__ */ new Date()).toISOString(); + if (typeof due === "string" && Date.parse(due) < Date.parse(stoppedAt)) input.is_sla_violated = true; + } + } + } +}; +var caseSideEffects = { + name: "case_status_side_effects", + object: "crm_case", + events: ["afterUpdate"], + priority: 800, + async: true, + onError: "log", + description: "Open the escalation follow-up task for the account owner.", + handler: async (ctx) => { + const { input } = ctx; + const previous = ctx.previous; + if (!previous) return; + const api = ctx.api; + if (!api) return; + const caseId = typeof input.id === "string" && input.id || (typeof previous.id === "string" ? previous.id : void 0); + const accountId = typeof input.crm_account === "string" && input.crm_account || typeof previous.crm_account === "string" && previous.crm_account || void 0; + if (input.status === "escalated" && previous.status !== "escalated" && accountId) { + const account = await api.object("crm_account").findOne({ where: { id: accountId } }); + const ownerId = account?.owner_id ?? ctx.user?.id; + const due = /* @__PURE__ */ new Date(); + due.setUTCDate(due.getUTCDate() + 1); + const caseNumber = typeof previous.case_number === "string" ? previous.case_number.trim() : ""; + const caseSubject = typeof input.subject === "string" && input.subject.trim() || typeof previous.subject === "string" && previous.subject.trim() || ""; + const label = [caseNumber, caseSubject].filter(Boolean).join(" \xB7 "); + const titled = label ? `Escalated: ${label}` : "Escalated case needs attention"; + await api.object("crm_task").insert({ + subject: titled.length > 255 ? `${titled.slice(0, 254)}\u2026` : titled, + status: "not_started", + priority: "urgent", + type: "follow_up", + due_date: due.toISOString().slice(0, 10), + owner_id: ownerId, + related_to_type: "crm_case", + related_to_case: caseId, + related_to_account: accountId + }); + } + } +}; +var caseResolutionAccountActivity = { + name: "case_resolution_account_activity", + object: "crm_case", + events: ["afterUpdate"], + priority: 800, + async: true, + onError: "log", + runAs: "system", + description: "Bump the account\u2019s last activity date when a case is resolved.", + handler: async (ctx) => { + const { input } = ctx; + const previous = ctx.previous; + if (!previous) return; + if (input.status !== "resolved" || previous.status === "resolved") return; + const api = ctx.api; + if (!api) return; + const accountId = typeof input.crm_account === "string" && input.crm_account || typeof previous.crm_account === "string" && previous.crm_account || void 0; + if (!accountId) return; + await api.object("crm_account").update( + { id: accountId, last_activity_date: (/* @__PURE__ */ new Date()).toISOString().slice(0, 10) }, + { where: { id: accountId } } + ); + } +}; +var caseAutoAssign = createCaseRoundRobinAssign(); +var caseEscalationReassign = createCaseEscalationReassign(); +var caseSelfClaim = createCaseSelfClaim(); +var caseResolutionArticleNormalize = { + name: "case_resolution_article_normalize", + object: "crm_case", + events: ["beforeInsert", "beforeUpdate"], + priority: 150, + description: "Normalise a blank resolved_by_article to null so the deflection measure counts only real links.", + handler: async (ctx) => { + const { input } = ctx; + if (!("resolved_by_article" in input)) return; + const value = input.resolved_by_article; + if (value === "" || value === void 0) { + input.resolved_by_article = null; + return; + } + if (typeof value === "string" && value.trim() === "") { + input.resolved_by_article = null; + } + } +}; +var case_hook_default = [ + caseValidation, + caseAutoAssign, + caseEscalationReassign, + caseSelfClaim, + caseResolutionArticleNormalize, + caseSideEffects, + caseResolutionAccountActivity +]; + +// src/service/objects/knowledge_article.hook.ts +var knowledgeArticlePublish = { + name: "knowledge_article_publish_timestamps", + object: "crm_knowledge_article", + events: ["beforeInsert", "beforeUpdate"], + priority: 300, + description: "Stamp published_at on the first publish; refresh last_reviewed_at while published.", + handler: async (ctx) => { + if (ctx.event === "beforeUpdate" && ctx.dispatch?.mode === "per-row") return; + const { input } = ctx; + const previous = ctx.previous; + const nextStatus = typeof input.status === "string" && input.status || previous?.status; + if (nextStatus !== "published") return; + const nowIso = (/* @__PURE__ */ new Date()).toISOString(); + input.last_reviewed_at = nowIso; + const existing = input.published_at ?? previous?.published_at; + if (existing === void 0 || existing === null || existing === "") { + input.published_at = nowIso; + } + } +}; +var knowledge_article_hook_default = knowledgeArticlePublish; + +// src/service/pages/case_detail.page.ts +var CaseDetailPage = { + name: "case_detail_page", + label: "Case Detail", + description: "Service-agent case record: highlights, SLA path, details and activity timeline.", + type: "record", + object: "crm_case", + template: "full-width", + kind: "full", + variables: [ + { name: "activeTab", type: "string", defaultValue: "details" } + ], + regions: [ + { + name: "header", + width: "full", + components: [ + { + type: "page:header", + id: "case_header", + label: "Case Information", + properties: { + title: "{case_number} \xB7 {subject}", + // The lookup field is `crm_account` — `{account}` matched nothing + // and the subtitle rendered blank. + subtitle: "{crm_account}", + // `icon` removed from `page:header` in @objectstack/spec 17.0.0 + // (#6946, ADR-0087 D2) — deleted, not renamed. See the full note on + // `account_detail.page.ts`; nothing ever drew it. + // `breadcrumb` retired from `page:header` in @objectstack/spec 17.6.0 + // (#20785, `page-header-breadcrumb-removed`) — deleted: no renderer + // ever drew a trail for it; the app shell's own trail is unchanged. + // Action IDs, not `ActionDef` objects: `PageHeaderProps.actions` is + // `z.array(z.string())` ("Action IDs to show in header") in + // @objectstack/spec 17.3.0, and this repo authors against the + // protocol (#1653). Each id is the `name` of a crm_case-scoped + // action — `claim_case` / `escalate_case` / `close_case` in + // `src/service/actions/case.actions.ts`, the activity trio in + // `src/service/actions/case-activity.actions.ts`. + // + // This list is the whole header (#2072, the #592 sentence on + // `lead_detail.page.ts`): an action it does not name is reachable + // only from the list row's ⋮ menu, which is how an agent on an + // unowned case had to go back to the list to claim it, and could + // not log or book a meeting here at all. Each action's own + // `visible` still decides when it shows — `claim_case` only on an + // ownerless open case. `claim_case` goes FIRST because the header + // draws three buttons inline and folds the rest into ⋯: on an + // ownerless case claiming is the gesture, and on an owned one it + // is hidden, so the inline three stay escalate / close / call. + // `test/action-references.test.ts` holds this list to every + // crm_case action placed at `record_header`. + actions: ["claim_case", "escalate_case", "close_case", "log_call", "log_meeting", "schedule_meeting"] + } + }, + { + type: "record:highlights", + id: "case_highlights", + label: "Key Information", + properties: { + // crm_case carries a single `sla_due_date` plus the derived + // `is_sla_violated` flag — the split response/resolution deadlines + // named here do not exist, so the agent's most time-critical fact + // was missing from the strip entirely. + fields: [ + "status", + "priority", + "sla_due_date", + "is_sla_violated", + "owner_id", + "crm_account" + ] + } + }, + { + type: "record:path", + id: "case_status_path", + label: "Case Status Path", + properties: { + statusField: "status", + stages: [ + { value: "new", label: "New" }, + { value: "in_progress", label: "In Progress" }, + // The status option is `waiting_customer`; the longer spelling + // matched no option, so this stage never lit up and rendered + // untranslated next to its neighbours. + { value: "waiting_customer", label: "Waiting on Customer" }, + { value: "escalated", label: "Escalated" }, + { value: "resolved", label: "Resolved" }, + { value: "closed", label: "Closed" } + ] + } + } + ] + }, + { + name: "main", + width: "large", + components: [ + { + type: "page:tabs", + id: "case_main_tabs", + properties: { + // `type` → `tabStyle` (@objectstack/spec 17.0.0, #6776, ADR-0087 + // D2). Same concept, same three values (`line` | `card` | `pill`); + // the rename exists because a props key called `type` collides with + // the component node's own dispatch key and is unauthorable in the + // flat and JSX carriers. See the full note on `home.page.ts`. + tabStyle: "line", + position: "top", + items: [ + { + // Tab item `key` → `value` (#1269). `value` is the stable + // `?tab=` URL token the renderer reads (`it.value`, falling back + // to an index-derived `tab-`); `key` is read by nothing, so + // these tabs were addressable only as `tab-0`/`tab-1`/`tab-2`, + // which point at different tabs the moment the item list + // changes. `PageTabsProps`' own alias table answers `key` with + // `value` for exactly this reason. + value: "details", + label: "Details", + children: [ + { + type: "record:details", + id: "case_details", + label: "Case Details", + properties: { + // `columns` is a STRING enum ('1'|'2'|'3'|'4') in + // @objectstack/spec 17, and `layout` was removed there + // (#6946 / ADR-0087 D2). + columns: "2", + // Every section references one of crm_case's `fieldGroups` + // (#970, the #806 class ruling C): the renderer derives + // members, label, icon and collapse state from the object, + // so this page curates only the order. The full note — + // what a group section does on 17.6.0 and what may not sit + // beside `group` — is on `lead_detail.page.ts`. + // + // The highlights strip still wins (#1211): the renderer + // drops what `record:highlights` registered (`status`, + // `priority`, `sla_due_date`, `is_sla_violated`, + // `owner_id`, `crm_account`) and the title candidate + // `subject` from the derived members. + // + // `escalated_date` — written by three flows and shown + // nowhere until now (#970) — arrives with the `escalation` + // group, beside `is_escalated` and `escalation_reason`. + // + // `internal_notes` (#1428) is in the `system` group with + // `is_closed`. A group whose members are ALL empty renders + // nothing, but a boolean always holds a value, so `system` + // renders on every case and an unwritten `internal_notes` + // stays reachable the way every empty field here is: the + // section's "Show N empty fields" toggle, then inline edit. + // ⛔ Not the create form — `/new` and edit both resolve + // `view.form`, and `case.hook.ts` nulls the column for + // anonymous web-to-case submissions. + // + // `resolution` / `resolved_by_article` render once the case + // carries one; `close_case` is the flow that collects the + // resolution. + // + // `hideEmpty: false` (#2003, the #1211 reasoning) only on + // `origin`: with `owner_id` in the strip, its one member is + // the channel an agent picks, and without the key the + // section vanishes on a new case. Not on `sla`: outside + // the strip its members are stamps no one types + // (`closed_date` and `resolution_time_hours` at close, + // `first_response_date` by `event.hook.ts`), so the key + // would draw empty rows to look at, not to fill. + sections: [ + { group: "basic" }, + { group: "origin", hideEmpty: false }, + { group: "sla" }, + { group: "escalation" }, + { group: "resolution" }, + { group: "system" } + ] + } + } + ] + }, + { + value: "related", + label: "Related", + children: [ + { + type: "page:accordion", + id: "case_related_accordion", + properties: { + items: [ + { + // An accordion item `key` is DELETED, not renamed to + // `value` — the opposite verdict to the tab items + // above, and the difference is a read point (#1269). + // `PageAccordionProps`' item shape is + // `{ label, icon?, collapsed?, children }` and it + // prescribes AGAINST `value` by name: the renderer + // maps every item to `{ ...it, value: `panel-` }` + // before rendering, so an authored value is + // overwritten. `page:tabs` really does read `it.value`; + // `page:accordion` does not. Nothing addresses these + // panels, so the identifier has nowhere to land. + label: "Open Tasks", + children: [ + { + type: "record:related_list", + id: "case_tasks", + properties: { + objectName: "crm_task", + relationshipField: "related_to_case", + columns: [ + "subject", + "status", + "priority", + "due_date", + "owner_id" + ], + filter: [ + { field: "status", operator: "not_equals", value: "completed" } + ], + limit: 10 + } + } + ] + } + ] + } + } + ] + }, + { + value: "activity", + label: "Activity", + children: [ + { + type: "record:activity", + id: "case_activity", + properties: { + filterMode: "all", + showFilterToggle: true, + limit: 25, + unifiedTimeline: true, + showCommentInput: true, + enableMentions: true, + enableReactions: true, + enableThreading: true, + // Load-bearing (#2071): a call or meeting logged on the + // case is a `sys_activity` row of type `completed` (the + // `task` feed kind), and the renderer drops every such + // row unless this is true — so an agent's logged call + // never reached this tab. The case's other `completed` + // writers are its own `resolved` / `closed` milestones + // (`case.object.ts`), which belong on this timeline too. + // Completed crm_task rows do NOT arrive here: a task's + // audit rows are keyed to the task, and this feed reads + // only rows keyed to the case. No `types` filter, unlike + // the lead page: this timeline mixes comments and field + // changes on purpose (`unifiedTimeline` above). + showCompleted: true + } + } + ] + } + ] + } + } + ] + } + ], + isDefault: true, + aria: { + ariaLabel: "Case Detail Page", + ariaDescribedBy: "Service-agent case detail view with SLA path, details, related items and activity timeline." + } +}; + +// src/service/reports/case.report.ts +var CasesByStatusPriorityReport = { + name: "cases_by_status_priority", + label: "Cases by Status and Priority", + description: "Summary of cases by status and priority", + // The chart counts cases, so `case_count` must be selected alongside the + // resolution time — and the yAxis must name that MEASURE ('case_number' + // was a raw-field name that exists in no dataset, so the axis was empty). + dataset: "case_metrics", + rows: ["status", "priority"], + values: ["case_count", "avg_resolution"], + type: "summary", + chart: { type: "bar", title: "Cases by Status", showLegend: true, xAxis: "status", yAxis: "case_count" } +}; +var SlaPerformanceReport = { + name: "sla_performance", + label: "SLA Performance Report", + description: "Analysis of SLA compliance", + // 'avg_sla_violated' (not a duplicated 'case_count') — the table showed two + // identical Cases columns and no violation measure; the chart's yAxis must + // name a dataset MEASURE, not a raw field ('is_sla_violated' leaked the + // column name onto the axis). + dataset: "case_metrics", + rows: ["priority"], + values: ["case_count", "avg_sla_violated", "avg_resolution"], + type: "summary", + runtimeFilter: { is_closed: true }, + chart: { type: "column", title: "SLA Violations by Priority", showLegend: false, xAxis: "priority", yAxis: "avg_sla_violated" } +}; +var CasesOpenedByDayPriorityReport = { + name: "cases_opened_by_day_priority", + label: "Cases Opened by Priority \xD7 Day", + description: "Daily case inflow split by priority", + dataset: "case_metrics", + rows: ["priority"], + columns: ["created_at"], + values: ["case_count"], + type: "matrix" +}; + +// src/service/sharing/case.sharing.ts +import { P as P12 } from "@objectstack/spec"; +var CaseEscalationSharingRule = { + name: "case_escalation_sharing", + label: "Escalated Cases Sharing", + object: "crm_case", + type: "criteria", + condition: P12`record.priority == "critical" && record.is_closed == false`, + accessLevel: "edit", + sharedWith: { type: "position", value: "service_manager" } +}; +var CaseDirectorSharingRule = { + name: "case_director_sharing", + label: "Escalated Cases \u2014 Service Director", + object: "crm_case", + type: "criteria", + condition: P12`record.priority == "critical" && record.is_closed == false`, + accessLevel: "read", + sharedWith: { type: "position", value: "service_director" } +}; +var CaseUnassignedTriageSharingRule = { + name: "case_unassigned_triage_sharing", + label: "Unassigned Cases \u2014 Triage", + object: "crm_case", + type: "criteria", + condition: P12`record.owner_id == null && record.status != "resolved" && record.status != "closed"`, + accessLevel: "edit", + sharedWith: { type: "position", value: "service_agent" } +}; + +// src/service/skills/case-triage.skill.ts +import { defineSkill } from "@objectstack/spec"; +var CaseTriageSkill = defineSkill({ + name: "case_triage", + label: "Case Triage", + description: "Triages a support case, assigns a priority with its justification, and points at the escalate/close action.", + instructions: `When the user asks to triage, prioritise, or classify a case: + +1. Read the case first \u2014 call \`describe_object\` for \`crm_case\` (the + schema is alive; admins add fields), then \`get_record\` for the case + at hand. Never triage from memory of a previous turn. +2. Assign a priority yourself from what you read. There is no triage + tool and you do not need one \u2014 weigh, in order: customer tier and + contract value, whether the customer is blocked with no workaround, + how long the case has been open against its SLA, and the sentiment + of the latest customer message. +3. State the priority and the ONE reason that drove it. Cite the case + ID and the field values you used. +4. If the priority is critical, say so and point the user at + **Escalate Case** on the record header \u2014 offer a ready-to-paste + \`reason\` built from step 3. You cannot escalate yourself, and should + not imply otherwise. +5. If the case is resolved in substance, point at **Close Case** and + offer a \`resolution\` summary the user can paste. +6. For the customer-facing reply, hand off to the \`email_drafting\` + skill rather than drafting it here.`, + tools: ["describe_object", "get_record"], + triggerConditions: [ + { field: "objectName", operator: "eq", value: "crm_case" } + ] +}); + +// src/service/views/case.view.ts +import { defineView } from "@objectstack/spec/ui"; +var data = { provider: "object", object: "crm_case" }; +var CaseViews = defineView({ + list: { + type: "grid", + name: "all_cases", + label: "All Cases", + userActions: { editInline: true }, + data, + columns: [ + { field: "case_number", width: 130, sortable: true, link: true, pinned: "left" }, + { field: "subject", width: 280, sortable: true }, + { field: "crm_account", width: 180 }, + { field: "crm_contact", width: 160 }, + { field: "priority", width: 110, sortable: true }, + { field: "status", width: 130, sortable: true }, + { field: "origin", width: 120 }, + { field: "sla_due_date", width: 160, sortable: true }, + { field: "is_sla_violated", width: 110, align: "center" }, + { field: "is_escalated", width: 110, align: "center" }, + { field: "owner_id", width: 150 } + ], + // Sort on the materialised ordinal, not the select itself: `priority desc` + // compares raw strings and lands medium > low > high > critical, burying + // every critical case at the bottom of the queue. + sort: [ + { field: "priority_rank", order: "desc" }, + { field: "sla_due_date", order: "asc" } + ], + rowColor: { + field: "priority", + colors: { critical: "red", high: "orange", medium: "yellow", low: "slate" } + }, + selection: { type: "multiple" }, + pagination: { pageSize: 50 }, + // The UI door for the `allowExport` grant four profiles already hold on + // `crm_case`. Export runs on ONE server-side route + // (`GET /api/v1/data/crm_case/export`, gated by `security.canExport`), so + // this declares which formats the toolbar offers — not a second gate: a + // profile without the grant gets 403 whether it clicks the button or + // curls the route. Measured in #798/#816; before this the grant was live + // but reachable only by `curl`. + exportOptions: { formats: ["csv", "xlsx"] }, + appearance: { + showDescription: true, + allowedVisualizations: ["grid", "kanban", "calendar", "timeline"] + }, + // Binds the 'calendar' entry above: the switcher opens the same deadlines + // the dedicated `sla_calendar` view shows, on the field this list already + // sorts by. `sla_due_date` is optional — a case the SLA monitor has not + // stamped carries no date at all, which is the truthful answer; the + // alternative the platform refuses is a guessed field putting every such + // case on today. + calendar: { + startDateField: "sla_due_date", + titleField: "subject", + colorField: "priority" + } + // Escalate straight from the queue: escalate_case's own + // `locations: ['list_item']` auto-injects the row-menu item. + }, + listViews: { + /** Service workflow board */ + case_workflow: { + name: "case_workflow", + type: "kanban", + label: "Service Workflow", + data, + columns: ["case_number", "subject", "priority", "sla_due_date"], + kanban: { + groupByField: "status", + columns: ["case_number", "subject", "crm_account", "priority", "owner_id"] + }, + filter: [{ field: "is_closed", operator: "equals", value: false }], + navigation: { mode: "drawer", width: "640px" } + }, + /** SLA calendar */ + sla_calendar: { + name: "sla_calendar", + type: "calendar", + label: "SLA Calendar", + data, + columns: ["case_number", "subject", "priority"], + calendar: { + startDateField: "sla_due_date", + titleField: "subject", + colorField: "priority" + } + }, + /** Chronological case stream */ + case_timeline: { + name: "case_timeline", + type: "timeline", + label: "Case Timeline", + data, + columns: ["case_number", "subject"], + timeline: { + // `created_at`, the platform's own creation stamp — the object's + // duplicate `created_date` was removed in #1992 because nothing wrote + // it on a real case, so every user-created case started its bar at + // null. Same spelling as `deal_timeline` on crm_opportunity (#575 B2). + startDateField: "created_at", + endDateField: "closed_date", + titleField: "subject", + groupByField: "owner_id", + colorField: "status", + scale: "day" + } + }, + /** + * The agent's personal queue: the cases themselves, one row each. Its + * aggregate counterpart is service_dashboard's "My Open Cases by + * Priority" (#510) — a dashboard widget counts, it cannot list. + */ + my_open_cases: { + name: "my_open_cases", + type: "grid", + label: "My Open Cases", + userActions: { editInline: true }, + data, + columns: ["case_number", "subject", "crm_account", "priority", "status", "sla_due_date"], + // ⚠️ `status not_in CLOSED_CASE_STATUSES`, NOT `is_closed == false`: the + // flag is derived as `effStatus === 'closed'` and never flips on + // `resolved`, so the flag spelling listed every RESOLVED case under a tab + // labelled "My Open Cases" — measured on the seeded demo population, the + // flag returned 30 of 38 cases and 7 of those 30 were resolved. A resolved + // case is finished work awaiting closure, not an open queue, and the + // mainstream service-cloud reading of "open" excludes it (Zendesk's open + // set omits Solved; ServiceNow's OOTB Open filter is + // `state not in (Resolved, Closed, Cancelled)`). Ruled 2026-08-31; pinned by + // `test/live-work-predicate-parity.test.ts` (#1145), whose consumer roster + // this view joined in the same change. + filter: [ + { field: "owner_id", operator: "equals", value: "{current_user_id}" }, + { field: "status", operator: "not_in", value: ["resolved", "closed"] } + ], + sort: [ + { field: "priority_rank", order: "desc" }, + { field: "sla_due_date", order: "asc" } + ] + }, + /** + * Unassigned — triage (#596). The second half of the queue substitute. + * + * `case_auto_assign` (`src/service/objects/_case-assignment.ts`) is a NO-OP whenever + * the `service_agent` pool is empty, and an empty pool is the FIRST-INSTALL + * NORM rather than an edge case: `sys_user_position` membership is runtime + * data, so on a fresh org — and any time every agent has been unassigned + * from the position — an inbound web-to-case lands ownerless. Best-effort + * assignment also stands down on a permission denial (the anonymous + * public-form context cannot read `sys_user_position` at all). + * + * Those cases used to be invisible: no view filtered on the absence of an + * owner, so an unowned case appeared in `All Cases` with a blank Owner + * column and nothing distinguished it from the rest. This view is the + * standing answer — silence replaced by a pinned tab whose row count IS the + * intake backlog. + * + * `is_null` on `owner_id`, not `equals: null`: the ownerless shape is an + * ABSENT column on driver-memory (see the totality note in + * `case-escalation.flow.ts`, where `record.escalated_date == null` aborted + * with `No such key`) as well as a NULL one on SQL, and only the operator + * form answers the same way for both. + * + * The predicate for "no longer live work" is `status not_in ['resolved', + * 'closed']`, NOT `is_closed == false`. `is_closed` is derived by + * `case_sla_defaults` as `effStatus === 'closed'`, so it never flips on + * `resolved` — and a resolved ownerless case satisfied both of this view's + * old filters and sat here forever, which is neither "arrives with no + * owner" nor "work waiting for a human". `not_in` lowers to the `$nin` the + * load-balancing hooks and `case_sla_monitor` already use for the same + * concept, so the four consumers now state one predicate; the roster that + * holds them together by NAME is `test/live-work-predicate-parity.test.ts`. + * `closed` stays excluded for the reason it always was: history, not + * backlog. + * + * ⚠️ WHO ACTUALLY SEES ROWS HERE is decided by record-level access, not by + * this view, and the answer today is narrower than the tab suggests. A + * view tab carries no role scoping — `ViewTabSchema` has `pinned`, + * `isDefault` and a boolean `visible`, and nothing per-profile — so this is + * pinned for everyone who can open Cases, while the ROWS resolve per + * profile: + * + * - `system_admin` — `viewAllRecords`, so the full backlog. This is the + * persona the empty-pool state is FOR: an empty `service_agent` pool is + * fixed by staffing `sys_user_position`, which only an admin can do. + * - `sales_manager` — `viewAllRecords`, read-only. + * - a service manager / director — the critical, open slice only, via the + * existing `case_escalation_sharing` / `case_director_sharing` criteria + * rules (`src/service/sharing/case.sharing.ts`). + * - `service_agent` — `readScope: 'own'` on `crm_case`, and an unowned + * row is owned by nobody, so **an agent's triage tab is empty**. + * + * The last line is a real gap for the "agent pulls from the queue" story + * and is deliberately NOT closed here: granting service roles sight of + * unowned cases is a sharing-model change (a new criteria rule, or a + * `readScope` widening), which is outside this card's file surface and is + * exactly the kind of quiet permission widening the #596 ruling rules out. + * Filed as #1096 for a decision, with the reach table above and the three + * options priced. + */ + unassigned_triage: { + name: "unassigned_triage", + type: "grid", + label: "Unassigned \u2014 triage", + userActions: { editInline: true }, + data, + columns: ["case_number", "subject", "crm_account", "crm_contact", "priority", "status", "origin", "sla_due_date"], + filter: [ + { field: "owner_id", operator: "is_null" }, + { field: "status", operator: "not_in", value: ["resolved", "closed"] } + ], + // Same ordering as the main queue: urgency first (on the materialised + // ordinal, never the raw select), then soonest deadline. + sort: [ + { field: "priority_rank", order: "desc" }, + { field: "sla_due_date", order: "asc" } + ], + rowColor: { + field: "priority", + colors: { critical: "red", high: "orange", medium: "yellow", low: "slate" } + }, + // The empty state carries the operational instruction, because "no rows" + // here is ambiguous on its own: it means either "the round-robin placed + // everything" (good) or "no case has arrived yet" (also fine) — and the + // reader most likely to be looking is someone who just found the tab + // full and needs to know why. + emptyState: { + title: "Nothing waiting for triage", + message: "Every case has an owner. Cases appear here when they arrive with no owner \u2014 typically a web-to-case submission that arrived while nobody held the Service Agent position.", + icon: "inbox" + } + }, + escalated_cases: { + name: "escalated_cases", + type: "grid", + label: "Escalated Cases", + userActions: { editInline: true }, + data, + columns: ["case_number", "subject", "crm_account", "priority", "sla_due_date", "owner_id"], + filter: [{ field: "is_escalated", operator: "equals", value: true }], + sort: [{ field: "priority_rank", order: "desc" }] + }, + /** + * SLA-at-risk: open cases at High or Critical priority needing attention. + * + * ⚠️ Names what the filter below actually selects. This read + * "high/urgent" until #1333 — but `crm_case.priority` is + * low/medium/high/critical (`case.object.ts:138-142`) and has NO `urgent`; + * that value belongs to `crm_task`. The mirror-image crossing already + * shipped a real defect once (`task.view.ts:35` — Case colour keys on the + * task view left every urgent and normal row uncoloured), and the + * direction that cost something was the one where the comment was + * believed. Two overlapping-but-unequal vocabularies: keep them apart. + */ + sla_at_risk: { + name: "sla_at_risk", + type: "grid", + label: "\u23F0 SLA at Risk", + userActions: { editInline: true }, + data, + columns: ["case_number", "subject", "crm_account", "priority", "sla_due_date", "owner_id"], + // Operator-only filter — sort by SLA due date ascending so the soonest + // surface first. (The view runtime does not interpolate `{NOW() + 4h}`.) + // + // ⚠️ `status not_in CLOSED_CASE_STATUSES`, NOT `is_closed == false`: the + // flag is derived as `effStatus === 'closed'` and never flips on + // `resolved`, so the flag spelling listed resolved cases as at risk while + // `case_sla_monitor` — the automation that OWNS SLA — had already + // excluded them (`status: { $nin: ['resolved', 'closed'] }`). The tab a + // human reads and the sweep that acts must answer this one question the + // same way. Pinned by `test/live-work-predicate-parity.test.ts` (#1145). + filter: [ + { field: "status", operator: "not_in", value: ["resolved", "closed"] }, + { field: "priority", operator: "in", value: ["high", "critical"] } + ], + sort: [{ field: "sla_due_date", order: "asc" }] + } + }, + /** + * The record form — and, because the platform has ONE, the CREATE form too. + * + * ## ⚠️ This object's `form` IS the create dialog (#1214 item 3) + * + * Measured against the console this app shipped at that taking + * (`@objectstack/console` 17.1.0, `dist/assets/`; this bundle read was ⛔ NOT + * re-taken on any later pin), BOTH + * entry points that open a case form resolve + * it the same way and neither takes a create/edit argument: + * + * RecordFormPage (`/{object}/new`, `/{object}/record/{id}/edit`) + * view.form ?? view.formViews?.default + * useActionModal (the `+ New` modal off a list view) + * view.form ?? view.formViews?.default + * + * ⇒ There is no create-only form to author. `ListViewSchema.addRecord` + * carries a `formView` key in `@objectstack/spec`, but NO console code path + * reads it (the string appears only in the view designer's own i18n table), + * so pointing it at a second form view would ship an ADR-0049 + * declared-but-unenforced shape and change nothing on screen. + * + * ⇒ Therefore the create-safe field set has to BE this form's field set. + * That is why the SLA and Resolution sections are gone rather than gated. + * + * ## ⛔ Why the tab strip was not the object's `fieldGroups` + * + * `crm_case.fieldGroups` declares SIX groups (Case Information / Origin & + * Routing / SLA & Priority / Resolution / Escalation / System) and the + * dialog showed THREE tabs — these sections. The renderer only reaches for + * `fieldGroups` on its AUTO-DERIVED path, taken when a form authors no + * `sections` at all; an authored `sections` array wins outright. So + * `src/service/objects/case.object.ts` is not part of this surface. + * + * ## ⚠️ Authoring `sections` OPTS OUT of the create-mode field strip + * + * That auto-derived path also runs two filters the authored path never sees + * (`plugin-form`: `Qe` → `qe` drops `readonly`/`hidden` fields, and on + * `mode === 'create'` `Je` additionally drops formula / summary / autonumber + * fields). An authored section renders its list VERBATIM. That is the whole + * mechanism behind this defect: the platform would have hidden + * `created_date` (retired in #1992), `closed_date`, `resolution_time_hours` + * and `is_closed` from a creator by itself, and naming them in a section put + * them back. + * + * ## ⛔ Why not gate the old sections on a predicate instead + * + * A section-level `visibleWhen` is parsed by `FormSectionSchema` and read by + * NOTHING in the form renderer (only FIELD-level `visibleWhen` is + * evaluated), so it would hide nothing. And field-level predicate evaluation + * FAILS OPEN — an unevaluable predicate renders the field visible, with no + * diagnostic (the house rule at the top of `lead.view.ts`, upstream + * objectstack-ai/objectstack#5149). A gate that fails open is not a gate for + * a data-integrity control, which is what this one is. + * + * ## What a creator may author here, and why the rest left + * + * Everything below is a fact the person raising the case HAS at intake. + * `case_number` stays because it is `readonly: true` on the object, so the + * renderer disables it — it is shown, never authored. + * + * The removed fields are all written by the lifecycle, and every one of them + * still has the surface it belongs on (pinned in + * `test/case-create-form-narrowing.test.ts`, both directions): + * + * closed_date readonly; `case_timeline` end + * (its start is the platform's + * `created_at`; `created_date` was + * retired in #1992) + * sla_due_date `case.hook.ts` stamps it from the + * priority × tier matrix; list column, + * sort key, `sla_calendar.startDateField`, + * detail-page highlights + * first_response_date `event.hook.ts` is its SINGLE writer + * resolution_time_hours readonly; derived at close; detail page + * is_sla_violated list column + detail-page highlights + * is_escalated, escalation_reason written by `case_escalation` / + * `case_sla_monitor` / `escalate_case`; + * detail page's Status & SLA section + * resolution detail page's Description section + * (the `resolution_required_on_close` + * validation still has its surface) + * is_closed readonly; derived from `status` + * + * ⚠️ `internal_notes`, `customer_rating` and `customer_feedback` left with + * the Resolution section and had NO other authoring surface at all. #1428 + * settled both halves of that, and neither answer was "put them back here": + * + * internal_notes `case_detail.page.ts`'s Description + * section, authored by inline edit — + * staff prose an agent writes while + * WORKING a case, which is why it did not + * come back to this form. The guest + * branch of `case.hook.ts` nulls the + * column on anonymous intake, so an + * intake surface for it would be a + * surface for a value the app discards. + * + * customer_rating, RETIRED under ADR-0049 enforce-or-remove + * customer_feedback (maintainer ruling, decision batch #21, + * 2026-09-03). Neither column exists on + * `crm_case` any more, so there is nothing + * here to omit and nothing anywhere to + * author. + * + * ⛔ Do not re-introduce either field, here or elsewhere. The ruling was not + * "no room on this form": a satisfaction score typed by the person being + * scored is not the same fact as one the customer gave, and neither field was + * named in ANY profile's `fields` map — which on this platform means + * unrestricted, not restricted. `case_csat_followup`, whose only purpose was + * to notify the case owner to log a rating, was retired in the same change. + * A customer-answered survey is a feature and would arrive as its own card, + * not as two inputs added back here. + * + * `type: 'simple'`, not `'tabbed'`: one section is not a tab strip. + */ + form: { + type: "simple", + sections: [ + { + name: "case", + label: "Case", + columns: 2, + fields: [ + "case_number", + { field: "subject", required: true, span: "full" }, + { field: "crm_account", required: true }, + "crm_contact", + { field: "status", required: true }, + "priority", + "origin", + "owner_id", + // Required on the object with no default — a form without it could + // never save a new case. + { field: "description", required: true, span: "full" } + ] + } + ] + }, + /** + * Additional named form views. + * + * `web_to_case` is a PUBLIC / ANONYMOUS support form (Salesforce + * Web-to-Case equivalent). Hosted at `/forms/support` and embeddable in + * a help center. Guests can ONLY submit — the `guest_portal` profile + * denies read/edit/delete on `crm_case`. Internal fields (status, origin, + * owner_id, SLA) are stamped by `case.hook.ts` after a guest submission. + * `priority` is NOT one of them: this form asks the guest for it, and an + * unset one is filled by the `low` option `crm_case.priority` declares + * `default: true`. Field defaults are applied before `beforeInsert`, so the + * hook only ever reads `priority` (to derive `priority_rank`). + */ + formViews: { + web_to_case: { + type: "simple", + data, + sections: [ + { + name: "how_can_we_help", + label: "How can we help?", + columns: 1, + fields: [ + { + field: "subject", + required: true, + placeholder: "Short summary of the issue" + }, + { + field: "description", + required: true, + placeholder: "Steps to reproduce, error messages, screenshots..." + }, + { + field: "type", + helpText: "Pick the option that best matches your issue." + }, + { + field: "priority", + helpText: "Critical issues should also be reported via phone." + } + ] + } + ], + sharing: { + enabled: true, + allowAnonymous: true, + publicLink: "/forms/support" + } + } + } +}); + +// src/service/views/knowledge_article.view.ts +import { defineView as defineView2 } from "@objectstack/spec/ui"; +var KnowledgeArticleViews = defineView2({ + list: { + type: "grid", + name: "all_articles", + label: "All Articles", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_knowledge_article" }, + columns: [ + { field: "article_number", width: 120, link: true, pinned: "left", sortable: true }, + { field: "title", width: 320, sortable: true }, + { field: "category", width: 160 }, + { field: "status", width: 130, sortable: true }, + { field: "audience", width: 110 }, + { field: "language", width: 110 }, + { field: "owner_id", width: 150 }, + { field: "published_at", width: 160, sortable: true }, + { field: "helpful_count", width: 110, align: "right", summary: "sum" } + ], + sort: [{ field: "published_at", order: "desc" }], + grouping: { fields: [{ field: "category", order: "asc" }] }, + selection: { type: "multiple" }, + pagination: { pageSize: 50 }, + rowColor: { + field: "status", + colors: { draft: "slate", in_review: "amber", published: "emerald", archived: "gray" } + }, + appearance: { + showDescription: true, + allowedVisualizations: ["grid", "kanban"] + } + }, + listViews: { + published_articles: { + name: "published_articles", + type: "grid", + label: "Published", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_knowledge_article" }, + columns: ["article_number", "title", "category", "audience", "helpful_count", "not_helpful_count", "published_at"], + filter: [{ field: "status", operator: "equals", value: "published" }], + sort: [{ field: "helpful_count", order: "desc" }] + }, + my_drafts: { + name: "my_drafts", + type: "grid", + label: "My Drafts", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_knowledge_article" }, + columns: ["article_number", "title", "category", "status", "updated_at"], + filter: [ + { field: "status", operator: "in", value: ["draft", "in_review"] }, + // `{current_user_id}` is the only user token the view runtime resolves. + { field: "owner_id", operator: "equals", value: "{current_user_id}" } + ], + sort: [{ field: "updated_at", order: "desc" }] + } + }, + form: { + type: "simple", + sections: [ + { + name: "article", + label: "Article", + columns: 2, + fields: [ + "article_number", + { field: "title", required: true, span: "full" }, + { field: "summary", span: "full" }, + "category", + "tags", + "status", + "audience", + "language", + "owner_id" + ] + }, + { + name: "content", + label: "Content", + columns: 1, + fields: ["body"] + }, + { + // `name` alongside `label` (#1100): a form section declaring only a + // label renders its ENGLISH label under every locale, and neither the + // existing i18n tests nor the `i18n/missing-*` gate can see it — the + // heading has no key for a translator to miss. This section is named + // because this change edits it (`view_count` was removed from it, #601); + // the app-wide sweep of the other headings is #1100's job, held behind + // this card precisely so the two do not collide in the locale packs. + name: "engagement", + label: "Engagement", + columns: 3, + fields: ["helpful_count", "not_helpful_count", "published_at", "last_reviewed_at", "related_to_case"] + } + ] + } +}); + +// src/service/index.ts +var serviceHooks = [article_feedback_hook_default, case_hook_default, knowledge_article_hook_default].flat(); +var serviceFlows = [ + CaseEscalationFlow, + CaseEscalationOnCreateFlow, + EscalateCaseFlow, + CloseCaseFlow, + ClaimCaseFlow, + CaseEscalationStampFlow, + CaseSlaMonitorFlow +]; +var serviceSkills = [CaseTriageSkill]; +var serviceSharingRules = [ + CaseEscalationSharingRule, + CaseDirectorSharingRule, + CaseUnassignedTriageSharingRule +]; +var createHotCrmServiceStack = (collections) => defineStack2({ + manifest: { + id: "app.objectstack.hotcrm.service", + name: "HotCRM Service", + // The app package's namespace, deliberately (ADR-0130 D1). + namespace: "crm", + // The ARTIFACT's version: one `package.json`, one build, one release + // (ADR-0130 D6), so a module of this artifact is never at a version of its + // own. Bump it with the app package's and `package.json` — + // `test/docs-declared-versions.test.ts` holds all three, and the range + // below, to one value. + version: "4.0.1", + type: "module", + description: "HotCRM support module \u2014 cases, knowledge articles, and the SLA surface.", + // The same protocol as the app package (ADR-0087 handshake); bump it with + // `specVersion` on every platform upgrade, exactly as the app's is. + engines: { protocol: "^18.0.0-next.0" }, + // The App package this module extends. + dependencies: { "app.objectstack.hotcrm": "^4.0.1" }, + /** + * The five navigation entries this module puts into the app's menu + * (ADR-0029 D7). + * + * Not a design choice: an app's own `navigation` may not name another + * package's object (ADR-0130 §1.5, rule R3 of `module-split-plan.md`), so + * all five became contributions the moment `crm_case`, + * `crm_knowledge_article`, `service_dashboard` and `sla_performance` left + * the app package. The app keeps the GROUPS (`group_service`, `group_work`, + * `group_insights`) — a container a module cannot declare inside an app it + * does not own — and this module fills them. + * + * `app` is the app's bare `name` (`crm_enterprise`), not the manifest id: a + * dotted id is refused as a non-snake_case identifier. + * + * ⚠️ `priority` orders CONTRIBUTIONS against each other inside a group. It + * does NOT interleave them with the app's own children — a contributed item + * is appended after everything the app itself declares in that group. The + * one visible consequence is `nav_my_cases`, 4th of 6 in *My Work* before + * the split and last after it; the three `group_service` items and + * `nav_report_sla` keep their positions because the app declares nothing + * after them. ⛔ Do not compensate with a per-item `order`: that key sorts + * in the renderer only, this app authors none anywhere, and adding one to + * work around a platform merge rule is what AGENTS.md forbids. + */ + navigationContributions: [ + { + app: "crm_enterprise", + group: "group_service", + // Stated rather than defaulted so that the day a second package + // contributes into one of these groups, the order is an authored fact + // instead of a registration-order accident. + priority: 10, + items: [ + { id: "nav_case", type: "object", objectName: "crm_case", label: "Cases", icon: "life-buoy" }, + { id: "nav_knowledge", type: "object", objectName: "crm_knowledge_article", label: "Knowledge", icon: "book-open" }, + { id: "nav_service_dashboard", type: "dashboard", dashboardName: "service_dashboard", label: "Service Overview", icon: "gauge" } + ] + }, + { + app: "crm_enterprise", + group: "group_work", + priority: 20, + items: [ + { id: "nav_my_cases", type: "object", objectName: "crm_case", viewName: "my_open_cases", label: "My Cases", icon: "life-buoy" } + ] + }, + { + app: "crm_enterprise", + group: "group_insights", + priority: 30, + items: [ + { id: "nav_report_sla", type: "report", reportName: "sla_performance", label: "SLA Performance", icon: "timer" } + ] + } + ] + }, + // What THIS package's metadata needs — see the `requires` paragraph above. + requires: ["automation", "triggers", "analytics", "sharing"], + objects: [ArticleFeedback, Case, KnowledgeArticle], + hooks: serviceHooks, + views: [CaseViews, KnowledgeArticleViews], + pages: [CaseDetailPage], + flows: serviceFlows, + actions: [ + EscalateCaseAction, + CloseCaseAction, + ClaimCaseAction, + LogCallAction, + LogMeetingAction, + CaseScheduleMeetingAction, + MarkArticleHelpfulAction, + MarkArticleNotHelpfulAction + ], + datasets: [CaseDataset], + reports: [CasesByStatusPriorityReport, SlaPerformanceReport, CasesOpenedByDayPriorityReport], + dashboards: [ServiceDashboard], + skills: serviceSkills, + sharingRules: serviceSharingRules, + emailTemplates: ServiceEmailTemplates, + ...collections +}); + +// src/revenue/objects/index.ts +var objects_exports3 = {}; +__export(objects_exports3, { + Contract: () => Contract, + OpportunityLineItem: () => OpportunityLineItem, + Product: () => Product, + Quote: () => Quote, + QuoteLineItem: () => QuoteLineItem +}); + +// src/revenue/objects/contract.object.ts +import { ObjectSchema as ObjectSchema12, Field as Field12 } from "@objectstack/spec/data"; +import { P as P13 } from "@objectstack/spec"; +var Contract = ObjectSchema12.create({ + name: "crm_contract", + label: "Contract", + pluralLabel: "Contracts", + icon: "file-pen-line", + description: "Legal contracts and agreements", + // ADR-0090 D1/D7: OWD is an authored decision. Master-detail child of + // crm_account — a contract IS account data: reachable by whoever can reach + // the account, editable by whoever can edit it (#549, ruling 2026-08-31). + sharingModel: "controlled_by_parent", + // ADR-0079: render-only `titleFormat` retired in favor of `nameField`. + // Original template was '{contract_number} - {crm_account.name}'. The + // `crm_account.name` segment is a lookup DOT-WALK, which a formula field + // cannot reference (ADR-0072), so it is DROPPED. Only the local + // `contract_number` (autonumber) remains, so no formula is needed — point + // `nameField` straight at it. + nameField: "contract_number", + highlightFields: ["contract_number", "crm_account", "status", "start_date", "end_date"], + fieldGroups: [ + { key: "basic", label: "Contract Information", icon: "info" }, + { key: "parties", label: "Parties", icon: "users" }, + { key: "terms", label: "Terms & Dates", icon: "calendar" }, + { key: "value", label: "Contract Value", icon: "dollar-sign" }, + { key: "status", label: "Status & Approval", icon: "check-circle" }, + { key: "renewal", label: "Renewal", icon: "refresh-ccw", collapse: "collapsed" } + ], + fields: { + // Platform ownership anchor — canonical note in `account.object.ts` (#548). + owner_id: Field12.lookup("sys_user", { + label: "Contract Owner", + group: "parties", + system: true, + readonly: false, + trackHistory: true + }), + // AutoNumber field + contract_number: Field12.autonumber({ + label: "Contract Number", + group: "basic", + format: "CTR-{0000}" + }), + // Relationships — the master the OWD derives from. Authored as + // master-detail so the master is not decided by declaration order against + // the required `crm_contact` lookup below (objectstack#14747). + crm_account: Field12.masterDetail("crm_account", { + label: "Account", + group: "parties", + required: true, + storage: { notNull: true }, + deleteBehavior: "cascade" + }), + crm_contact: Field12.lookup("crm_contact", { + label: "Primary Contact", + group: "parties", + required: true, + storage: { notNull: true }, + // @objectstack 12: string[] `referenceFilters` is dead (not read by the + // picker); `dependsOn` is the live cascading-lookup form — scopes contacts + // to the contract's `crm_account` (ADR-0049). + dependsOn: ["crm_account"] + }), + crm_opportunity: Field12.lookup("crm_opportunity", { + label: "Related Opportunity", + group: "parties", + // Scope opportunities to the contract's account (was dead referenceFilters). + dependsOn: ["crm_account"] + }), + // Status + status: Field12.select({ + label: "Status", + group: "status", + options: [ + { label: "Draft", value: "draft", color: "#999999", default: true }, + { label: "In Approval", value: "in_approval", color: "#FFA500" }, + { label: "Activated", value: "activated", color: "#00AA00" }, + { label: "Expired", value: "expired", color: "#FF0000" }, + { label: "Terminated", value: "terminated", color: "#666666" } + ], + required: true, + storage: { notNull: true }, + trackHistory: true + }), + // Contract Terms + contract_term_months: Field12.number({ + label: "Contract Term (Months)", + group: "terms", + required: true, + storage: { notNull: true }, + min: 1 + }), + start_date: Field12.date({ + label: "Start Date", + group: "terms", + required: true, + storage: { notNull: true } + }), + end_date: Field12.date({ + label: "End Date", + group: "terms", + required: true, + storage: { notNull: true } + }), + // Financial + contract_value: Field12.currency({ + label: "Contract Value", + group: "value", + min: 0, + required: true, + storage: { notNull: true } + }), + billing_frequency: Field12.select({ + label: "Billing Frequency", + group: "value", + options: [ + { label: "Monthly", value: "monthly", default: true }, + { label: "Quarterly", value: "quarterly" }, + { label: "Annually", value: "annually" }, + { label: "One-time", value: "one_time" } + ] + }), + payment_terms: Field12.select({ + label: "Payment Terms", + group: "value", + // Canonical set shared with Quote: an accepted quote's terms (incl. + // due_on_receipt) must survive the copy onto the contract. That copy is + // `quote_accepted_contract_draft` (src/revenue/objects/quote.hook.ts). This field's `net_30` + // option default applies only when the quote itself carried no term, + // which is the intended fall-through, not a gap. + options: [...PAYMENT_TERMS_OPTIONS] + }), + // Renewal + auto_renewal: Field12.boolean({ + label: "Auto Renewal", + group: "renewal", + defaultValue: false + }), + renewal_notice_days: Field12.number({ + label: "Renewal Notice (Days)", + group: "renewal", + min: 0, + defaultValue: 30 + }), + // Legal + contract_type: Field12.select({ + label: "Contract Type", + group: "basic", + options: [ + { label: "Subscription", value: "subscription" }, + { label: "Service Agreement", value: "service" }, + { label: "License", value: "license" }, + { label: "Partnership", value: "partnership" }, + { label: "NDA", value: "nda" }, + { label: "MSA", value: "msa" } + ] + }), + signed_date: Field12.date({ + label: "Signed Date", + group: "status" + }), + signed_by: Field12.text({ + label: "Signed By", + group: "status", + maxLength: 255 + }), + document_url: Field12.url({ + label: "Contract Document", + group: "basic" + }), + // Terms & Conditions + special_terms: Field12.markdown({ + label: "Special Terms", + group: "terms" + }), + description: Field12.markdown({ + label: "Description", + group: "basic" + }), + // Billing Address + billing_address: Field12.address({ + label: "Billing Address", + group: "value" + }) + }, + // Database indexes + indexes: [ + { fields: ["crm_account"] }, + { fields: ["status"] }, + { fields: ["start_date"] }, + { fields: ["end_date"] }, + { fields: ["owner_id"] } + ], + // Enable advanced features + // API surface. History → Field.trackHistory (ADR-0052). + enable: { + apiEnabled: true, + apiMethods: ["get", "list", "create", "update", "delete"], + // #602 — the executed contract itself. `document_url` remains the pointer + // to an external DMS copy; this is where the file actually lives. + // See the canonical capability note in `src/sales/objects/index.ts`. + files: true + }, + // Validation Rules + // + // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the + // rule returns a verdict even when the merged record has no such key. See + // AGENTS.md "Validation predicates must be TOTAL" and + // test/object-validation-predicates.test.ts, which fails the build otherwise. + validations: [ + { + name: "end_after_start", + type: "script", + severity: "error", + message: "End Date must be after Start Date", + condition: P13`has(record.end_date) && record.end_date != null && has(record.start_date) && record.start_date != null && record.end_date <= record.start_date` + }, + // NOTE: the `valid_contract_term` warning (months-between term check) was + // dropped in the 9.8.0 upgrade — its CEL predicate used `monthsBetween()`, + // which 9.8.0's aligned CEL stdlib (ADR-0032) no longer provides. It was a + // non-blocking warning; the hard end-date>start-date rule above remains. + { + // #575 B4. Like `crm_quote`, this object shipped a lifecycle vocabulary + // with no transition constraint and no status guard in `contract.hook.ts` + // — so `draft → activated` was a legal move, activating an agreement that + // never passed approval. Activation is the consequential edge here: + // `contract_on_activation` stamps `signed_date`, promotes the account to + // `customer`, and the renewal flow starts counting from it. + name: "contract_status_progression", + type: "state_machine", + severity: "warning", + message: "Invalid contract status transition", + field: "status", + transitions: { + draft: ["in_approval", "terminated"], + // Approval either lands (`activated`) or sends the paperwork back. + in_approval: ["draft", "activated", "terminated"], + // `→ expired` is the contract_expiration flow, whose own sweep filter + // is `status: 'activated'` — nothing else ages out. + activated: ["expired", "terminated"], + // Both ends are terminal: a renewal is a NEW contract (the + // contract_renewal flow files a task, it does not revive the old row). + expired: [], + terminated: [] + } + } + ] + // Workflow Rules + // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were + // removed from the platform. Field updates live in this object's `*.hook.ts`; + // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. +}); + +// src/revenue/objects/opportunity_line_item.object.ts +import { ObjectSchema as ObjectSchema13, Field as Field13 } from "@objectstack/spec/data"; +import { F as F8, P as P14 } from "@objectstack/spec"; +var OpportunityLineItem = ObjectSchema13.create({ + name: "crm_opportunity_line_item", + label: "Opportunity Line Item", + pluralLabel: "Opportunity Line Items", + icon: "package", + description: "A single product line on an Opportunity", + // ADR-0090 D1/D7: OWD is an authored decision. A line item has no meaning + // apart from its deal, so its record access DERIVES from the opportunity + // (ADR-0055), and as of 17.0.0-rc.4 that derivation means what it says. + // + // ⚠️ Reads ARE filtered to line items whose `crm_opportunity` the caller can + // read, and master accessibility resolves through the same paths a direct + // read of the opportunity takes — ownership and `sys_record_share` grants + // included, NOT the master's row-level security policies alone. So a rep + // reads the lines of the deals in their own book plus anything shared to + // them, and the private-deal RLS filter carried by the `sales_manager` and + // `marketing_user` sets narrows on top of that rather than being the only + // thing that narrows. The parent-write gate derives the same way: a line + // whose opportunity the caller cannot edit is refused. + // + // `test/parent-derived-reach.test.ts` pins the narrow semantics and was + // written to go red the day the platform widens them: with the master set + // resolved from RLS policies alone, any caller without the private-deal + // policy — `sales_rep` included — reaches EVERY opportunity's lines. + // ADR-0055's relation resolver accepts a REQUIRED LOOKUP as the parent, so + // this works without converting the relationship to master-detail. + // + // ⛔ Not `private`: this object has no owner of its own, so `private` falls + // back to the platform's auto-stamped `owner_id` (whoever inserted the row) — + // and the rep who owns the deal then cannot see a line the quote-generation + // flow or their manager added to it. + sharingModel: "controlled_by_parent", + // Per-field history is opt-in via `Field.trackHistory` (ADR-0052), set on + // quantity/unit_price/discount below. Master-detail children still inherit + // the master's sharing automatically. + highlightFields: ["crm_product", "quantity", "unit_price", "total_price"], + // Two groups, derived from the nine fields this object actually declares + // rather than copied off a neighbour (#1453). The split is the one the + // arithmetic already makes: everything `total_price` multiplies together is + // `pricing`, everything that says WHICH line this is is `basic`. + // + // `quantity` is a pricing field here, not an identity one — it is a factor in + // `total_price`, and separating it from the price it multiplies would put the + // two halves of one product on two sections. `crm_quote_line_item` takes the + // same split over its ten fields, and the parents agree: `crm_quote` and + // `crm_product` both keep every money field in `pricing` — `crm_quote`'s + // `tax` included — and both keep `description` in `basic`. + // + // ⚠️ Neither group may be a subset of the highlight strip: a synthesized + // detail page hoists the title plus the first four `highlightFields` out of + // the body, so an all-hoisted group renders on forms and nowhere else + // (`field-group-shadowed`; `pnpm lint` — `os lint --strict` — fails on it). + // `basic` keeps crm_opportunity/description/line_number and `pricing` keeps + // list_price/discount outside that strip, so both survive the hoist. + fieldGroups: [ + { key: "basic", label: "Line Item", icon: "package" }, + { key: "pricing", label: "Pricing", icon: "dollar-sign" } + ], + fields: { + // The parent link, and the ONE field on this object that decides whether the + // deal it belongs to can be deleted at all (#727). + // + // Declaring nothing here does not mean "no opinion": `Field.lookup` resolves + // `deleteBehavior` to the spec default `set_null`, and the engine's + // `cascadeDeleteRelations` escalates a `set_null` default on a REQUIRED + // lookup to `restrict` — a NOT NULL column cannot be cleared. So the silent + // default made every itemised opportunity undeletable, with a message that + // told the API caller to `set deleteBehavior:'cascade'` on this very field: + // + // DELETE /api/v1/data/crm_opportunity/ + // → 409 DELETE_RESTRICTED "…1 dependent crm_opportunity_line_item + // record(s) reference it via crm_opportunity…" + // + // `cascade` is the semantics this object already claims twice over: the + // header comment says a line has no meaning apart from its deal, and + // `opportunity_line_item.hook.ts` derives `crm_opportunity.amount` FROM the + // line set. A record whose parent is gone denotes nothing and would keep a + // dead deal's revenue in the line-level reports. + // + // This is deliberately NOT the campaign/event answer (#696, #711 kept + // `crm_campaign_member.crm_campaign` and `crm_event_attendee.crm_event` on + // the restricting default): a member list is a campaign's historical record + // and survives on its own terms. A price line does not. + crm_opportunity: Field13.masterDetail("crm_opportunity", { + label: "Opportunity", + group: "basic", + required: true, + storage: { notNull: true }, + deleteBehavior: "cascade" + }), + // Deliberately left on the default, which the same escalation turns into + // `restrict`: deleting a catalog product must NOT shred the priced history + // of deals that sold it. `product.hook.ts`'s own `beforeDelete` says the + // same thing in words ("Set is_active=false to retire instead"). + crm_product: Field13.lookup("crm_product", { + label: "Product", + group: "basic", + required: true, + storage: { notNull: true } + }), + description: Field13.text({ + label: "Description", + group: "basic", + maxLength: 500 + }), + quantity: Field13.number({ + label: "Quantity", + group: "pricing", + required: true, + storage: { notNull: true }, + scale: 2, + min: 0, + defaultValue: 1, + trackHistory: true + }), + list_price: Field13.currency({ + label: "List Price", + group: "pricing", + readonly: true, + description: "Auto-populated from the product's List Price." + }), + unit_price: Field13.currency({ + label: "Sales Price", + group: "pricing", + required: true, + storage: { notNull: true }, + description: "Negotiated unit price (may differ from list price)", + trackHistory: true + }), + discount: Field13.percent({ + label: "Discount %", + group: "pricing", + scale: 2, + min: 0, + max: 100, + defaultValue: 0, + trackHistory: true + }), + total_price: Field13.formula({ + label: "Total", + group: "pricing", + expression: F8`record.quantity * record.unit_price * (1 - record.discount / 100)` + }), + line_number: Field13.number({ + label: "Line #", + group: "basic", + scale: 0, + readonly: true + }) + }, + // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the + // rule returns a verdict even when the merged record has no such key. See + // AGENTS.md "Validation predicates must be TOTAL" and + // test/object-validation-predicates.test.ts, which fails the build otherwise. + validations: [ + { + name: "unit_price_positive", + type: "script", + severity: "error", + message: "Sales price cannot be negative", + // Both guards are load-bearing, not defensive noise. `has(...)` answers + // "is the key present at all": on update the predicate sees + // `{...previous, ...data}`, and a driver that stores only written columns + // returns no key, which aborts the whole predicate and silently skips the + // rule (#630). `!= null` answers "does it hold a value": strict CEL + // ABORTS on `null < 0` instead of evaluating it false, so the unguarded + // form left this rule inert on a blank price — it never fired at all, + // which is the opposite of what a validation is for. The `null` hazard is + // written up at `account.object.ts:244-245`; the same-named rule in + // `quote_line_item.object.ts` has carried that guard all along. + condition: P14`has(record.unit_price) && record.unit_price != null && record.unit_price < 0` + } + ] +}); + +// src/revenue/objects/product.object.ts +import { ObjectSchema as ObjectSchema14, Field as Field14 } from "@objectstack/spec/data"; +import { F as F9, P as P15 } from "@objectstack/spec"; +var Product = ObjectSchema14.create({ + name: "crm_product", + label: "Product", + pluralLabel: "Products", + icon: "box", + description: "Products and services offered by the company", + // ADR-0090 D1/D7: OWD is an authored decision. Product catalog is org-visible; only owners edit. + sharingModel: "public_read", + // ADR-0079: render-only `titleFormat` retired in favor of `nameField`, + // which names a real field. The former template composed two local fields, so + // a `display_title` formula field reproduces it for the record title. + nameField: "display_title", + // Explicit search targets (ADR-0061). REQUIRED because nameField is a + // FORMULA (display_title/full_name): without this, $search auto-defaults to + // the formula field, which isn't a real column, so the lookup picker + global + // search silently return zero. These are real, indexed columns. + searchableFields: ["name", "product_code", "sku"], + highlightFields: ["product_code", "name", "category", "is_active"], + fieldGroups: [ + { key: "basic", label: "Product Information", icon: "info" }, + { key: "pricing", label: "Pricing", icon: "dollar-sign" }, + { key: "metadata", label: "Resources", icon: "link", collapse: "collapsed" } + ], + fields: { + // AutoNumber field - Unique product identifier + product_code: Field14.autonumber({ + label: "Product Code", + group: "basic", + format: "PRD-{0000}" + }), + // Basic Information + name: Field14.text({ + label: "Product Name", + group: "basic", + required: true, + storage: { notNull: true }, + searchable: true, + maxLength: 255 + }), + // ADR-0079 record title (was titleFormat '{product_code} - {name}'). + display_title: Field14.formula({ + label: "Display Title", + group: "basic", + expression: F9`record.product_code + " - " + record.name` + }), + description: Field14.markdown({ + label: "Description", + group: "basic" + }), + // Categorization + category: Field14.select({ + label: "Category", + group: "basic", + options: [ + { label: "Software", value: "software", default: true }, + { label: "Hardware", value: "hardware" }, + { label: "Service", value: "service" }, + { label: "Subscription", value: "subscription" }, + { label: "Support", value: "support" } + ] + }), + family: Field14.select({ + label: "Product Family", + group: "basic", + options: [ + { label: "Enterprise Solutions", value: "enterprise" }, + { label: "SMB Solutions", value: "smb" }, + { label: "Professional Services", value: "services" }, + { label: "Cloud Services", value: "cloud" } + ] + }), + // Pricing + list_price: Field14.currency({ + label: "List Price", + group: "pricing", + min: 0, + required: true, + storage: { notNull: true } + }), + cost: Field14.currency({ + label: "Cost", + group: "pricing", + min: 0 + }), + // SKU + // + // `quantity_on_hand` / `reorder_point` were removed with the rest of the + // inventory surface: nothing in this app decremented stock, and the "Low + // Stock" view they fed compared against a hardcoded 10 rather than the + // reorder point beside it. HotCRM sells from a catalog; warehouse state + // belongs to the system of record that owns it. + sku: Field14.text({ + label: "SKU", + group: "basic", + maxLength: 50, + unique: true + }), + // Status + is_active: Field14.boolean({ + label: "Active", + group: "basic", + defaultValue: true, + trackHistory: true + }), + // Relationships + product_manager: Field14.lookup("sys_user", { + label: "Product Manager", + group: "basic" + }), + // Images and Assets + // `accept` / `maxSize` are declarable AND server-enforced from + // @objectstack 17 (ADR-0104 D3 wave 2). Before that the upload widget read + // them but `FieldSchema` dropped them at parse, so the constraint existed + // only in the browser and any direct API caller walked past it. + image: Field14.image({ + label: "Product Image", + group: "metadata", + accept: ["image/png", "image/jpeg", "image/webp"], + maxSize: 5 * 1024 * 1024 + }), + datasheet: Field14.file({ + label: "Datasheet", + group: "metadata", + accept: ["application/pdf"], + maxSize: 20 * 1024 * 1024 + }) + // `billing_type` and `unit_of_measure` were removed with the tax flag: both + // were seeded on all 13 catalog products and read by nothing — no quote + // total, no revenue-recognition report and no line-item behaviour ever + // consulted either. A picklist that only ever renders itself is a + // maintenance obligation (four locales, an import column, every future + // migration) charged against a capability that does not exist. + }, + // Database indexes + // + // No `{ fields: ['sku'], unique: true }` here: the field-level `unique: true` + // already builds the tenant composite `(organization_id, sku)` since + // framework #3696. Declaring the single-column index too made the + // platform-wide constraint win and left the per-tenant one unreachable + // (framework#3991) — an SKU is unique inside a catalogue, and two + // organizations may legitimately both stock "ABC-123". + indexes: [ + { fields: ["name"] }, + { fields: ["category"] }, + { fields: ["is_active"] } + ], + // Enable advanced features + // API surface. History → Field.trackHistory (ADR-0052). + enable: { + apiEnabled: true, + apiMethods: ["get", "list", "create", "update", "delete"] + }, + // Validation Rules + // + // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the + // rule returns a verdict even when the merged record has no such key. See + // AGENTS.md "Validation predicates must be TOTAL" and + // test/object-validation-predicates.test.ts, which fails the build otherwise. + validations: [ + { + name: "price_positive", + type: "script", + severity: "error", + message: "List Price must be positive", + // Two distinct guards, both required. `has(...)` answers "is the key + // there at all" — on update the merged record is `{...previous, ...data}` + // and a driver that stores only written columns hands back no key, which + // aborts the whole predicate (#630). `!= null` then answers "does it hold + // a value" — strict CEL cannot compare dyn < int, the hazard + // written up on `account.object.ts`. `list_price` is `required`, but the + // rule also runs on partial updates that omit it. + condition: P15`has(record.list_price) && record.list_price != null && record.list_price < 0` + }, + { + name: "cost_less_than_price", + type: "script", + severity: "warning", + message: "Cost should be less than List Price", + // Both operands need both guards: `cost` is optional and absent on every + // seeded product, so this warning has never once evaluated. + condition: P15`has(record.cost) && record.cost != null && has(record.list_price) && record.list_price != null && record.cost >= record.list_price` + } + ] +}); + +// src/revenue/objects/quote.object.ts +import { ObjectSchema as ObjectSchema15, Field as Field15 } from "@objectstack/spec/data"; +import { F as F10, P as P16, cel as cel5 } from "@objectstack/spec"; + +// src/sales/objects/_thresholds.ts +var LARGE_DEAL_AMOUNT = 1e5; +var HIGH_VALUE_DEAL_AMOUNT = 5e5; +var QUOTE_DISCOUNT_CEILING = 60; + +// src/revenue/objects/quote.object.ts +var Quote = ObjectSchema15.create({ + name: "crm_quote", + label: "Quote", + pluralLabel: "Quotes", + icon: "file-text", + description: "Price quotes for customers", + // ADR-0090 D1/D7: OWD is an authored decision. Master-detail child of + // crm_account — a quote is reachable by whoever can reach its account, and + // its line items derive one level further (#549, ruling 2026-08-31). + sharingModel: "controlled_by_parent", + // ADR-0079: render-only `titleFormat` retired in favor of `nameField`, + // which names a real field. The former template composed two local fields, so + // a `display_title` formula field reproduces it for the record title. + nameField: "display_title", + // Explicit search targets (ADR-0061). REQUIRED because nameField is a + // FORMULA (display_title/full_name): without this, $search auto-defaults to + // the formula field, which isn't a real column, so the lookup picker + global + // search silently return zero. These are real, indexed columns. + searchableFields: ["name", "quote_number"], + highlightFields: ["quote_number", "name", "crm_account", "status", "total_price"], + fieldGroups: [ + { key: "basic", label: "Quote Information", icon: "info" }, + { key: "pricing", label: "Pricing", icon: "dollar-sign" }, + { key: "terms", label: "Terms & Validity", icon: "calendar" }, + { key: "address", label: "Addresses", icon: "map-pin", collapse: "collapsed" }, + { key: "system", label: "System", icon: "database", collapse: "collapsed" } + ], + fields: { + // Platform ownership anchor — canonical note in `account.object.ts` (#548). + owner_id: Field15.lookup("sys_user", { + label: "Quote Owner", + group: "basic", + system: true, + readonly: false, + trackHistory: true + }), + // AutoNumber field + quote_number: Field15.autonumber({ + label: "Quote Number", + group: "basic", + format: "QTE-{0000}" + }), + // Basic Information + name: Field15.text({ + label: "Quote Name", + group: "basic", + required: true, + storage: { notNull: true }, + searchable: true, + maxLength: 255 + }), + // ADR-0079 record title (was titleFormat '{quote_number} - {name}'). + display_title: Field15.formula({ + label: "Display Title", + group: "basic", + expression: F10`record.quote_number + " - " + record.name` + }), + // Relationships — the master the OWD derives from (authored, not positional). + crm_account: Field15.masterDetail("crm_account", { + label: "Account", + group: "basic", + required: true, + storage: { notNull: true }, + deleteBehavior: "cascade" + }), + crm_contact: Field15.lookup("crm_contact", { + label: "Contact", + group: "basic", + // Optional AT DRAFT TIME, required from `presented` on (#1017). + // + // quote_generation maps the opportunity's `primary_contact`, which is + // itself optional — a flat `required: true` here meant contact-less + // opportunities could never draft a quote at all. So the recipient is + // nailed down by the time a quote is PRESENTED, not when it is drafted. + // That sentence sat in this comment for the field's whole life with + // nothing enforcing it: no rule stopped a contact-less quote reaching + // `presented` or `accepted`, and the bill came due one object over. + // `crm_contract.crm_contact` is `required` + `notNull`, so accepting such + // a quote made `quote_on_accepted` fail to draft the contract — since + // #714/#1013 that failure is honest and no longer swallows the close-won + // leg, but the hook is `async` + `onError: 'log'`, so the accepting write + // still answers 200 and the only evidence is a server log nobody reads. + // `requiredWhen` moves the same refusal to the synchronous, someone-is- + // watching moment: the rep is told on the write that turns the quote + // outward, against the field, with the quote still editable. + // + // WHY EXACTLY `presented` + `accepted`, and not the other two terminal + // states. Both of those are reachable WITHOUT the quote ever being sent + // (see the `quote_status_progression` transitions below): + // • `expired` — the `quote_expiration` flow sweeps on `expiration_date` + // alone and expires never-sent drafts as readily as presented ones. + // Requiring a recipient there would make a nightly system write fail + // on exactly the quotes that have no recipient BECAUSE nobody sent + // them, and the sweep's `runAs: 'system'` would not exempt it — the + // gate applies on write, not on actor. + // • `rejected` — legal straight from `in_review`, i.e. a quote killed + // internally before anyone saw it. Demanding a contact to file that + // verdict asks for a recipient the quote never had. + // Neither state passes anything on to a contract, so neither needs one. + // + // ⚠️ `has(record.status)` is load-bearing, not decoration — the same trap + // documented at `lead.object.ts`'s duplicate lookups: a bare + // `record.status == "presented"` aborts with `No such key` on any merged + // record that simply omits the column, and the engine's answer to a + // predicate that fails to evaluate is to SKIP it ("requiredWhen for + // 'crm_contact' failed to evaluate — skipped"). The rule would then read + // as enforced and require nothing at all. + // + // @objectstack 12: string[] `referenceFilters` is dead (not read by the + // picker); `dependsOn` is the live cascading form — scopes contacts to the + // quote's `crm_account` (ADR-0049). + dependsOn: ["crm_account"], + requiredWhen: P16`has(record.status) && (record.status == "presented" || record.status == "accepted")`, + description: "Required once the quote is Presented or Accepted \u2014 the drafted contract takes its Primary Contact from here." + }), + crm_opportunity: Field15.lookup("crm_opportunity", { + label: "Opportunity", + group: "basic", + // Scope opportunities to the quote's account (was dead referenceFilters). + dependsOn: ["crm_account"] + }), + // Status + status: Field15.select({ + label: "Status", + group: "basic", + options: [ + { label: "Draft", value: "draft", color: "#999999", default: true }, + { label: "In Review", value: "in_review", color: "#FFA500" }, + { label: "Presented", value: "presented", color: "#4169E1" }, + { label: "Accepted", value: "accepted", color: "#00AA00" }, + { label: "Rejected", value: "rejected", color: "#FF0000" }, + { label: "Expired", value: "expired", color: "#666666" } + ], + required: true, + storage: { notNull: true }, + trackHistory: true + }), + // Dates + quote_date: Field15.date({ + label: "Quote Date", + group: "terms", + required: true, + storage: { notNull: true }, + defaultValue: cel5`today()` + }), + expiration_date: Field15.date({ + label: "Expiration Date", + group: "terms", + required: true, + storage: { notNull: true } + }), + // Pricing + // subtotal/discount_amount/total_price are NOT `readonly`, and the writer + // that decides it is the LINE-ITEM ROLLUP — not the flow this note used to + // name. `quote_total_rollup` (`quote_line_item.hook.ts`) recomputes all + // three on every line insert/update/delete through + // `api.object('crm_quote').update(...)`: a cross-record write via `ctx.api`, + // which is a `ScopedContext` over the ACTING USER's context. The keys are + // therefore CALLER-supplied to a non-`isSystem` UPDATE, exactly what + // `stripReadonlyFields` deletes — with `readonly` on, a quote's totals would + // freeze at whatever the flow first seeded and never track its lines again. + // ⚠️ `quote_generation` writes them too, but at CREATE time, and the strip + // is an UPDATE-path rule — that write would survive `readonly` untouched. + // The retired 16.x claim rested on that create-time write, which is how this + // note reached a right conclusion from the wrong writer. + // Measured in `test/readonly-write-semantics.test.ts` (insert is exempt) and + // `test/activity-recency.test.ts` (the `ctx.api` strip, on the real engine). + subtotal: Field15.currency({ + label: "Subtotal", + group: "pricing" + }), + discount: Field15.percent({ + label: "Discount %", + group: "pricing", + scale: 2, + min: 0, + max: 100 + }), + discount_amount: Field15.currency({ + label: "Discount Amount", + group: "pricing" + }), + tax: Field15.currency({ + label: "Tax", + group: "pricing" + }), + shipping_handling: Field15.currency({ + label: "Shipping & Handling", + group: "pricing" + }), + total_price: Field15.currency({ + label: "Total Price", + group: "pricing" + }), + // Terms + payment_terms: Field15.select({ + label: "Payment Terms", + group: "terms", + // Canonical set shared with Contract (#490) — see _picklists.ts. + options: [...PAYMENT_TERMS_OPTIONS] + }), + shipping_terms: Field15.text({ + label: "Shipping Terms", + group: "terms", + maxLength: 255 + }), + // Billing & Shipping Address + billing_address: Field15.address({ + label: "Billing Address", + group: "address" + }), + shipping_address: Field15.address({ + label: "Shipping Address", + group: "address" + }), + // Notes + description: Field15.markdown({ + label: "Description", + group: "basic" + }), + internal_notes: Field15.textarea({ + label: "Internal Notes", + group: "system" + }) + }, + // Database indexes + indexes: [ + { fields: ["crm_account"] }, + { fields: ["crm_opportunity"] }, + { fields: ["owner_id"] }, + { fields: ["status"] }, + { fields: ["quote_date"] } + ], + // Enable advanced features + // API surface. History → Field.trackHistory (ADR-0052). + enable: { + apiEnabled: true, + apiMethods: ["get", "list", "create", "update", "delete"], + // #602 — the generated quote PDF and the customer's countersigned copy. + // See the canonical capability note in `src/sales/objects/index.ts`. + files: true + }, + // Validation Rules + // + // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the + // rule returns a verdict even when the merged record has no such key. See + // AGENTS.md "Validation predicates must be TOTAL" and + // test/object-validation-predicates.test.ts, which fails the build otherwise. + validations: [ + { + name: "expiration_after_quote", + type: "script", + severity: "error", + message: "Expiration Date must be after Quote Date", + condition: P16`has(record.expiration_date) && record.expiration_date != null && has(record.quote_date) && record.quote_date != null && record.expiration_date <= record.quote_date` + }, + { + // #599. The only discount constraint this object ever had was the field's + // own `max: 100` — the arithmetic domain of a percentage — so a rep could + // put 90% off a $99K deal on a quote and nothing anywhere objected: the + // approval flow keys on the opportunity's AMOUNT, and $99K is under the + // large-deal line. This is the policy ceiling that constraint never was. + // + // ⚠️ A predicate of `record.discount > 100` here would be DEAD: field-level + // bounds are evaluated BEFORE object validations, so `discount: 150` is + // already refused by `max: 100` with `code: 'max_value'` and the message + // "Discount % must be ≤ 100", and the rule's own message is unreachable on + // every input that could reach it. + // + // ### Why a script validation and not a lower `max` on the field + // + // This is an INVARIANT — "a quote's discount may never exceed the + // ceiling" — not a transition condition, and #1069 is open on exactly + // that distinction for `requiredWhen`. Both instruments were measured + // against a row stored above the ceiling before the rule existed + // (`test/quote-discount-ceiling.test.ts` runs the measurement): + // + // Field.percent({ max: 60 }) legacy row, unrelated edit → ADMITTED + // this rule legacy row, unrelated edit → REFUSED + // + // A field bound checks the value being WRITTEN; a script validation is + // evaluated against the MERGED record on every write. So `max` carries + // the same silent legacy hole #1069 describes, in a second instrument, + // and the rule does not. The cost of the invariant, stated rather than + // hidden: an over-ceiling row is frozen to everything except the repair — + // bringing the discount back under the ceiling is admitted, and is an + // ordinary edit. HotCRM ships no such row (deepest seeded discount: 20%). + // + // `max: 100` stays on the field as the domain of a percentage. The policy + // number lives in `_thresholds.ts`, interpolated into both the predicate + // and the message so the two cannot disagree. + name: "discount_within_ceiling", + type: "script", + severity: "error", + message: `Discount cannot exceed ${QUOTE_DISCOUNT_CEILING}%`, + condition: P16`has(record.discount) && record.discount != null && record.discount > ${QUOTE_DISCOUNT_CEILING}` + }, + { + // #575 B4. `crm_quote` had a full lifecycle vocabulary and no transition + // constraint whatsoever — nor a status guard in `quote.hook.ts` — so a + // quote could go straight from `draft` to `accepted`, which in CPQ terms + // is a signed number nobody reviewed or sent. `warning` severity matches + // the lead / opportunity / case machines: it flags the jump on the record + // without blocking a support-driven correction. + name: "quote_status_progression", + type: "state_machine", + severity: "warning", + message: "Invalid quote status transition", + field: "status", + transitions: { + // `→ expired` is legal from every UNSETTLED state: the quote_expiration + // flow sweeps on `expiration_date` alone and expires drafts that were + // never sent as readily as presented ones. + draft: ["in_review", "expired"], + in_review: ["draft", "presented", "rejected", "expired"], + presented: ["accepted", "rejected", "expired"], + // `accepted` and `expired` are terminal, and not only by convention — + // `quote_pricing_guard` in quote.hook.ts freezes both, allowing edits + // to `internal_notes` and nothing else. + accepted: [], + expired: [], + // A rejected quote is not frozen: the rep revises the numbers and + // re-issues, which starts again at `draft`. + rejected: ["draft"] + } + } + ] + // Workflow Rules + // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were + // removed from the platform. Field updates live in this object's `*.hook.ts`; + // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. +}); + +// src/revenue/objects/quote_line_item.object.ts +import { ObjectSchema as ObjectSchema16, Field as Field16 } from "@objectstack/spec/data"; +import { F as F11, P as P17 } from "@objectstack/spec"; +var QuoteLineItem = ObjectSchema16.create({ + name: "crm_quote_line_item", + label: "Quote Line Item", + pluralLabel: "Quote Line Items", + icon: "package", + description: "A single product line on a Quote", + // OWD is an authored decision (ADR-0090 D1/D7). Record access DERIVES from + // the quote (ADR-0055). + // + // ⚠️ Reads ARE filtered to lines whose `crm_quote` the caller can read, and + // "can read" resolves through the same paths a direct read of the quote takes + // — owner scope and `sys_record_share` grants included, NOT the master's + // row-level security policies alone. A rep who owns one quote reads that + // quote's lines and no others. The parent-write gate derives the same way: a + // line whose quote the caller cannot edit is refused with a + // `PermissionDeniedError` naming the master. + // + // `test/parent-derived-reach.test.ts` pins those semantics with positive + // controls, so a regression is caught in either direction — it was written to + // go red the day the platform widens them: with the derivation consulting + // master RLS policies only, under a SYSTEM context, and no policy authored on + // `crm_quote`, the master set is EVERY quote and a line item is readable — + // and writable — by every holder of object-level read on this object. The + // relation resolver accepts a REQUIRED LOOKUP as the parent, so no + // master-detail conversion is needed. + // + // ⛔ Not `private`: with no owner field on this object that resolves to the + // platform's auto-stamped `owner_id` — the row's inserter — so lines cloned + // onto a quote by the `quote_generation` flow are invisible to the rep who + // owns the quote. + sharingModel: "controlled_by_parent", + // Per-field history is opt-in via `Field.trackHistory` (ADR-0052), set on + // quantity/unit_price/discount below. Master-detail children still inherit + // the master's sharing automatically. + highlightFields: ["crm_product", "quantity", "unit_price", "total_price"], + // The same two-group split as `crm_opportunity_line_item` (#1453), derived + // from the ten fields declared here: every factor `total_price` multiplies + // is `pricing`, everything that says WHICH line this is is `basic`. + // + // ⚠️ Neither group may be a subset of the highlight strip — see the twin + // object for the hoisting rule this satisfies. + fieldGroups: [ + { key: "basic", label: "Line Item", icon: "package" }, + { key: "pricing", label: "Pricing", icon: "dollar-sign" } + ], + fields: { + // The parent link — same decision, same reasoning, as + // `opportunity_line_item.crm_opportunity` (#727); read the long note there. + // In short: declaring nothing resolves to the spec default `set_null`, which + // the engine escalates to `restrict` on a REQUIRED lookup, so every quote + // that had been itemised refused to delete with a 409 quoting this field. + // A quote line is subordinate to its quote (`quote_line_item.hook.ts` rolls + // the quote's subtotal/total UP from these rows), so it goes with it. + crm_quote: Field16.masterDetail("crm_quote", { + label: "Quote", + group: "basic", + required: true, + storage: { notNull: true }, + deleteBehavior: "cascade", + // Curates the line-items panel on a quote's detail page (#1199) — the + // mechanism that panel reads first (#944; the long note is on + // `crm_campaign_member.crm_campaign`). A SUPERSET of the fallback it + // replaces (`highlightFields` minus this lookup: Product / Quantity / + // Sales Price / Total) plus `subtotal`, the line's price after its own + // discount — the formula was evaluated on every read and shown in no list. + // + // ⛔ Not added to `highlightFields`: the detail page hoists the first + // four of that strip, so a fifth entry never reaches the strip, and + // reordering it would evict `total_price` from the record's header. + relatedListColumns: ["crm_product", "quantity", "unit_price", "subtotal", "total_price"] + }), + // Left on the restricting default on purpose — see the twin object: a + // product's catalog entry must not take priced quote history with it. + crm_product: Field16.lookup("crm_product", { + label: "Product", + group: "basic", + required: true, + storage: { notNull: true } + }), + description: Field16.text({ + label: "Description", + group: "basic", + maxLength: 500 + }), + quantity: Field16.number({ + label: "Quantity", + group: "pricing", + required: true, + storage: { notNull: true }, + scale: 2, + min: 0, + defaultValue: 1, + trackHistory: true + }), + list_price: Field16.currency({ + label: "List Price", + group: "pricing", + readonly: true + }), + unit_price: Field16.currency({ + label: "Sales Price", + group: "pricing", + required: true, + storage: { notNull: true }, + trackHistory: true + }), + discount: Field16.percent({ + label: "Discount %", + group: "pricing", + scale: 2, + min: 0, + max: 100, + defaultValue: 0, + trackHistory: true + }), + subtotal: Field16.formula({ + label: "Subtotal", + group: "pricing", + expression: F11`record.quantity * record.unit_price * (1 - record.discount / 100)` + }), + // A line carries no tax: tax is the quote's own amount (#2069), so Total is + // `subtotal`'s expression, not a read of `subtotal` — a formula reading a + // formula depends on hydration order (`lead.object.ts:61-64`). + total_price: Field16.formula({ + label: "Total", + group: "pricing", + expression: F11`record.quantity * record.unit_price * (1 - record.discount / 100)` + }), + line_number: Field16.number({ + label: "Line #", + group: "basic", + scale: 0, + readonly: true + }) + }, + // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the + // rule returns a verdict even when the merged record has no such key. See + // AGENTS.md "Validation predicates must be TOTAL" and + // test/object-validation-predicates.test.ts, which fails the build otherwise. + validations: [ + { + name: "unit_price_positive", + type: "script", + severity: "error", + message: "Sales price cannot be negative", + condition: P17`has(record.unit_price) && record.unit_price != null && record.unit_price < 0` + }, + { + // #1086. The other half of #599's ceiling, and the reason that card's own + // acceptance criterion — "a quote with a 90% line discount cannot reach + // `presented`" — was not met by the quote-level rule alone. + // + // ### The walk-around this closes + // + // A quote's total has TWO independent discount multipliers, and + // `quote_total_rollup` composes them: + // + // subtotal = Σ line (quantity × unit_price × (1 − LINE discount/100)) + // discount_amount = subtotal × QUOTE discount% + // + // #599 put a ceiling on the second one only. So a quote at + // `discount: 0` — which clears `discount_within_ceiling` on `crm_quote` + // outright — with every line at `discount: 90` prices 90% below list, and + // nothing objected: this object's only discount constraint was the + // field's own `max: 100`, the arithmetic domain of a percentage. An + // invariant with a documented walk-around is worse than no invariant, + // because a reader (human or AI) cites the rule as the guarantee. + // + // ### Same constant, same instrument, deliberately + // + // The number is `QUOTE_DISCOUNT_CEILING` — imported, never retyped, so the + // two ceilings are one policy and cannot drift into two. The instrument is + // a `type: 'script'` validation for the reason #599 measured on the quote + // (and this card re-measured on this object, in + // `test/quote-discount-ceiling.test.ts`): a field-level `max` validates + // only the value being WRITTEN, so a line stored above the ceiling before + // the rule existed keeps accepting edits forever, while a script + // validation is evaluated against the MERGED record on every write and is + // therefore a true invariant. `max: 100` stays on the field as the domain + // of a percentage; the policy line lives here. + // + // ### What this rule does NOT decide + // + // 60% per line AND 60% on the quote still compounds to ~84% EFFECTIVE. + // Whether the ceiling should be read against the effective discount is a + // business-policy question with no answer in this codebase, and it is + // open as #1109 — deliberately not guessed here. A per-line ceiling is + // correct under either answer: it is the whole policy if the answer is + // per-line, and a component of it if the answer is effective. + name: "discount_within_ceiling", + type: "script", + severity: "error", + // Names the LINE, because the quote carries a same-named rule with its + // own message: on a refused save the rep must be able to tell which of + // the two numbers the platform is objecting to. + message: `Line discount cannot exceed ${QUOTE_DISCOUNT_CEILING}%`, + condition: P17`has(record.discount) && record.discount != null && record.discount > ${QUOTE_DISCOUNT_CEILING}` + } + ] +}); + +// src/marketing/objects/index.ts +var objects_exports4 = {}; +__export(objects_exports4, { + Campaign: () => Campaign, + CampaignMember: () => CampaignMember +}); + +// src/marketing/objects/campaign.object.ts +import { ObjectSchema as ObjectSchema17, Field as Field17 } from "@objectstack/spec/data"; +import { F as F12, P as P18 } from "@objectstack/spec"; +var Campaign = ObjectSchema17.create({ + name: "crm_campaign", + label: "Campaign", + pluralLabel: "Campaigns", + icon: "megaphone", + description: "Marketing campaigns and initiatives", + // ADR-0090 D1/D7: OWD is an authored decision. Campaign catalog is org-visible; only owners edit. + sharingModel: "public_read", + // ADR-0079: render-only `titleFormat` retired in favor of `nameField`, + // which names a real field. The former template composed two local fields, so + // a `display_title` formula field reproduces it for the record title. + nameField: "display_title", + // Explicit search targets (ADR-0061). REQUIRED because nameField is a + // FORMULA (display_title/full_name): without this, $search auto-defaults to + // the formula field, which isn't a real column, so the lookup picker + global + // search silently return zero. These are real, indexed columns. + searchableFields: ["name", "campaign_code"], + highlightFields: ["campaign_code", "name", "type", "status", "start_date"], + // Every other business object with a detail page groups its fields; campaign + // was one of the two that did not, so its detail page fell back to one flat + // 30-field grid with the ROI formulas sitting next to the campaign name. The + // labels mirror the sections the campaign form uses (Campaign Information / + // Schedule / Budget & ROI / Performance) so the two surfaces agree — the + // form's old three-section shape buried the two manual-entry cost fields in a + // combined "Schedule & Budget" row and was split to match this one (#597). + fieldGroups: [ + { key: "basic", label: "Campaign Information", icon: "megaphone" }, + { key: "schedule", label: "Schedule", icon: "calendar" }, + { key: "budget", label: "Budget & ROI", icon: "dollar-sign" }, + { key: "metrics", label: "Performance", icon: "bar-chart" }, + { key: "assignment", label: "Ownership", icon: "user" }, + { key: "assets", label: "Campaign Assets", icon: "link", collapse: "collapsed" } + ], + fields: { + // Platform ownership anchor — canonical note in `account.object.ts` (#548). + owner_id: Field17.lookup("sys_user", { + label: "Campaign Owner", + group: "assignment", + system: true, + readonly: false, + trackHistory: true + }), + // AutoNumber field + campaign_code: Field17.autonumber({ + group: "basic", + label: "Campaign Code", + format: "CPG-{0000}" + }), + // Basic Information + name: Field17.text({ + group: "basic", + label: "Campaign Name", + required: true, + storage: { notNull: true }, + searchable: true, + maxLength: 255 + }), + // ADR-0079 record title (was titleFormat '{campaign_code} - {name}'). + display_title: Field17.formula({ + group: "basic", + label: "Display Title", + expression: F12`record.campaign_code + " - " + record.name` + }), + description: Field17.markdown({ + group: "basic", + label: "Description" + }), + // Type & Channel + type: Field17.select({ + group: "basic", + label: "Campaign Type", + options: [ + { label: "Email", value: "email", default: true }, + { label: "Webinar", value: "webinar" }, + { label: "Trade Show", value: "trade_show" }, + { label: "Conference", value: "conference" }, + { label: "Direct Mail", value: "direct_mail" }, + { label: "Social Media", value: "social_media" }, + { label: "Content Marketing", value: "content" }, + { label: "Partner Marketing", value: "partner" } + ] + }), + channel: Field17.select({ + group: "basic", + label: "Primary Channel", + options: [ + { label: "Digital", value: "digital" }, + { label: "Social", value: "social" }, + { label: "Email", value: "email" }, + { label: "Events", value: "events" }, + { label: "Partner", value: "partner" } + ] + }), + // Status + status: Field17.select({ + group: "basic", + label: "Status", + options: [ + { label: "Planning", value: "planning", color: "#999999", default: true }, + { label: "In Progress", value: "in_progress", color: "#FFA500" }, + { label: "Completed", value: "completed", color: "#00AA00" }, + { label: "Aborted", value: "aborted", color: "#FF0000" } + ], + required: true, + storage: { notNull: true }, + trackHistory: true + }), + // Dates + start_date: Field17.date({ + group: "schedule", + label: "Start Date", + required: true, + storage: { notNull: true } + }), + end_date: Field17.date({ + group: "schedule", + label: "End Date", + required: true, + storage: { notNull: true } + }), + // Budget & ROI + budgeted_cost: Field17.currency({ + group: "budget", + label: "Budgeted Cost", + min: 0 + }), + actual_cost: Field17.currency({ + group: "budget", + label: "Actual Cost", + min: 0 + }), + expected_revenue: Field17.currency({ + group: "budget", + label: "Expected Revenue", + min: 0 + }), + // ⛔ NOT `readonly` (here and on the num_* snapshot fields below), and the + // reason holds on the pinned engine rather than on the retired 16.x claim + // this note used to carry. The metric block — `CAMPAIGN_METRIC_FIELDS` in + // `campaign.hook.ts` — is written by FOUR refresh hooks, not by the + // long-retired `campaign_snapshot_metrics`: `campaign_metrics_refresh`, + // `campaign_attribution_refresh`, `campaign_lead_conversion_refresh` and + // `campaign_member_metrics_refresh`. Every one of them writes + // `api.object('crm_campaign').update(...)`, and none declares `Hook.runAs`, + // which defaults to `'inherit'` — so `ctx.api` is a `ScopedContext` over the + // ACTING USER's context, and the keys are CALLER-supplied to a + // non-`isSystem` UPDATE, exactly what `stripReadonlyFields` deletes. Their + // least-privileged trigger is an ordinary user edit — a rep moving a + // campaign's status, saving an opportunity, enrolling a member — so + // `readonly` here would freeze the whole block at its seeded values. + // Measured in `test/activity-recency.test.ts`, which runs this same + // `ctx.api` shape through the real engine under a plain user context. + actual_revenue: Field17.currency({ + group: "budget", + label: "Actual Revenue", + min: 0 + }), + // Metrics + target_size: Field17.number({ + group: "metrics", + label: "Target Size", + description: "Target number of leads/contacts", + min: 0 + }), + // NOT `readonly`: written by the same four refresh hooks, and for the same + // reason — see the note on `actual_revenue` above. + // Definition: total members enrolled. + num_sent: Field17.number({ + group: "metrics", + label: "Number Sent", + min: 0 + }), + num_responses: Field17.number({ + group: "metrics", + label: "Number of Responses", + min: 0 + }), + num_leads: Field17.number({ + group: "metrics", + label: "Number of Leads", + min: 0 + }), + num_converted_leads: Field17.number({ + group: "metrics", + label: "Converted Leads", + min: 0 + }), + num_opportunities: Field17.number({ + group: "metrics", + label: "Opportunities Created", + min: 0 + }), + num_won_opportunities: Field17.number({ + group: "metrics", + label: "Won Opportunities", + min: 0 + }), + // Calculated Metrics (Formula Fields) + response_rate: Field17.formula({ + group: "metrics", + label: "Response Rate %", + expression: F12`coalesce(record.num_sent, 0) > 0 ? (coalesce(record.num_responses, 0) * 100.0) / record.num_sent : 0.0`, + scale: 2 + }), + roi: Field17.formula({ + group: "budget", + label: "ROI %", + expression: F12`coalesce(record.actual_cost, 0) > 0 ? ((coalesce(record.actual_revenue, 0) - record.actual_cost) * 100.0) / record.actual_cost : 0.0`, + scale: 2 + }), + // No `parent_campaign`. Campaign hierarchy was declared and never used: no + // page, doc or report mentioned it, and the honest consumer for it — a + // rolled-up ROI — cannot be one declaration. `roi` here is a formula over + // this campaign's OWN `actual_cost` / `actual_revenue`, so a hierarchy ROI + // would put a second, differently-scoped ROI on the same record and leave + // every reader to guess which one they were looking at. + // Campaign Assets + landing_page_url: Field17.url({ + group: "assets", + label: "Landing Page" + }), + is_active: Field17.boolean({ + group: "assets", + label: "Active", + defaultValue: true + }) + }, + // Database indexes + indexes: [ + { fields: ["name"] }, + { fields: ["type"] }, + { fields: ["status"] }, + { fields: ["start_date"] }, + { fields: ["owner_id"] } + ], + // Enable advanced features + // API surface. History → Field.trackHistory (ADR-0052). + enable: { + apiEnabled: true, + apiMethods: ["get", "list", "create", "update", "delete"] + }, + // Validation Rules + // + // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the + // rule returns a verdict even when the merged record has no such key. See + // AGENTS.md "Validation predicates must be TOTAL" and + // test/object-validation-predicates.test.ts, which fails the build otherwise. + validations: [ + { + name: "end_after_start", + type: "script", + severity: "error", + message: "End Date must be after Start Date", + // `<=`, not `<`: the message promises "after", so a campaign that ends + // the day it starts is a violation. Matches `crm_contract`'s twin rule + // and `crm_forecast.period_end_after_start` (#514 item 12). + condition: P18`has(record.end_date) && record.end_date != null && has(record.start_date) && record.start_date != null && record.end_date <= record.start_date` + }, + { + name: "actual_cost_within_budget", + type: "script", + severity: "warning", + message: "Actual Cost exceeds Budgeted Cost", + condition: P18`has(record.actual_cost) && record.actual_cost != null && has(record.budgeted_cost) && record.budgeted_cost != null && record.actual_cost > record.budgeted_cost` + } + ] + // Workflow Rules + // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were + // removed from the platform. Field updates live in this object's `*.hook.ts`; + // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. +}); + +// src/marketing/objects/campaign_member.object.ts +import { ObjectSchema as ObjectSchema18, Field as Field18 } from "@objectstack/spec/data"; +import { P as P19 } from "@objectstack/spec"; +var CampaignMember = ObjectSchema18.create({ + name: "crm_campaign_member", + label: "Campaign Member", + pluralLabel: "Campaign Members", + icon: "user-plus", + description: "Membership and response tracking for marketing campaigns", + // ADR-0090 D1/D7: OWD is an authored decision. Membership is an attribute of + // the campaign, so record access DERIVES from it (ADR-0055). The relation + // resolver accepts the REQUIRED `crm_campaign` LOOKUP as the parent, so no + // master-detail conversion is needed. + // + // The derivation delivers exactly "members whose `crm_campaign` the caller + // can read". ⚠️ Master accessibility resolves through the same paths a direct + // read of the campaign takes — ownership and `sys_record_share` grants folded + // in ALONGSIDE the master's row-level security policies, not the policies + // alone. `test/parent-derived-reach.test.ts` pins that, and was written to go + // red the day the platform changes it: an earlier version consulted master + // RLS ONLY, under a SYSTEM context, so with no policy narrowing a SELECT on + // `crm_campaign` a member row was readable by every holder of object-level + // read on this object. + // + // ⚠️ The write side reaches further than reads: the platform's + // `member_default` set carries an owner-only-writes RLS policy on updates, + // and because the derivation folds master RLS in, that policy reaches through + // to member writes — see the `marketing_campaign_updates` note in + // `src/sales/profiles/marketing-user.profile.ts`. + // + // ⛔ Not `private`: with no owner field on the junction row that resolves to + // "whoever inserted it", which is nobody's idea of campaign membership and + // hides rows written by the enrollment flow. + sharingModel: "controlled_by_parent", + // Per-field history is opt-in via `Field.trackHistory` (ADR-0052), set on + // `status` below — there is no object-level history flag. + // ADR-0079: junction rows have no derivable text title; point the canonical + // nameField at the stored autonumber explicitly (autonumber is not in the + // auto-derivation whitelist). + nameField: "member_number", + // Load-bearing on TWO surfaces, and the second one is why this list is not + // the side that gave way to fix `field-group-shadowed` below (#715). Besides the + // detail highlight strip, it is what curates the members panel on a + // campaign's detail page: a related list takes its columns from the child's + // `highlightFields` minus the lookup it is scoped by, and this object ships + // no view at all, so dropping `crm_lead`/`crm_contact` here would leave that + // panel showing Status / Response Date and no person — measured and pinned in + // `test/view-references.test.ts` (#944). + highlightFields: ["crm_campaign", "crm_lead", "crm_contact", "status", "response_date"], + // Both groups render on detail pages as well as on forms, and keeping them + // that way is a constraint on the two lists above, not a free choice (#715). + // A synthesized detail page hoists the record title plus the first four + // highlightFields out of the body, so a group whose every field is hoisted + // keeps its heading on forms and silently disappears from detail pages + // (`field-group-shadowed`). + // `basic` was exactly that: member_number is the title, and campaign/lead/ + // contact are the first three of the strip. `added_date` — the enrollment + // stamp, which describes the MEMBERSHIP rather than the person's response — + // sits here rather than under `response` so the group has something of its + // own to show. Same resolution as `crm_task`'s shadowed `assignment` group + // (#582): move the field to the group it reads under, leave the strip alone. + fieldGroups: [ + { key: "basic", label: "Basic Information", icon: "info" }, + { key: "response", label: "Response Tracking", icon: "activity" } + ], + fields: { + member_number: Field18.autonumber({ + label: "Member Number", + format: "CM-{00000}", + group: "basic" + }), + crm_campaign: Field18.lookup("crm_campaign", { + label: "Campaign", + required: true, + storage: { notNull: true }, + group: "basic", + // Curates the members panel on a campaign — and it is the ONE mechanism + // that actually reaches that panel. Measured in #944 and restated in + // `test/view-references.test.ts`: a detail-page related list reads + // `relatedListColumns` on the CHILD's lookup first, and only without it + // falls back to the child's `highlightFields` minus this lookup. The + // child's `list` view is never consulted, which is why authoring one + // here would not have shown anything. + // + // It is a SUPERSET of the fallback it replaces — Lead / Contact / + // Status / Response Date, in that order — plus the one column the panel + // was missing. `added_date` is the enrollment stamp: `readonly: true` + // (#1667) and written on every enrollment by the two elevated sub-flows + // #1807 built for it, so a marketer could see WHEN a member responded + // but not when they were added, on a register whose whole subject is + // the enrollment. It sits after the person and before the response + // lifecycle, which is the order the row happens in. + // + // ⛔ Deliberately NOT solved by adding `added_date` to + // `highlightFields`: that strip is hoisted out of the detail body, and + // `added_date` is the only field in the `basic` group that is neither + // the record title nor already in the strip — hoisting it would leave + // the group with nothing of its own and silently vanish its heading + // from every detail page (`field-group-shadowed`, the trap the note + // above this object's `fieldGroups` records being rescued from). + relatedListColumns: ["crm_lead", "crm_contact", "added_date", "status", "response_date"] + }), + // `deleteBehavior: 'cascade'` on BOTH party lookups (#696). A lookup + // defaults to `set_null`, and that default made every enrolled person + // permanently undeletable: deleting the lead cleared this column, the + // cleared row instantly violated `lead_or_contact_required` below, and the + // whole delete rolled back with a 400 naming an object the caller never + // touched ("A campaign member must reference either a Lead or a Contact", + // `"object":"crm_lead"`). A GDPR "delete this person" request could not be + // served through the API or the UI. + // + // Cascade rather than `restrict`: this is a JUNCTION row whose entire + // meaning is "this person is enrolled in this campaign". Once the person is + // gone the row denotes nothing, so keeping it (restrict) would only trade + // one undeletable person for a manual un-enrol chore, and the impact this + // fixes is undeletable people, not a confusing message. Cascade also makes + // the object's own rule unfalsifiable by construction: there is no longer a + // reachable state in which a stored member row breaks it. + crm_lead: Field18.lookup("crm_lead", { + label: "Lead", + group: "basic", + deleteBehavior: "cascade", + description: "Set when the member was a Lead at enrollment time" + }), + crm_contact: Field18.lookup("crm_contact", { + label: "Contact", + group: "basic", + deleteBehavior: "cascade", + description: "Set when the member is an existing Contact" + }), + // ⭐ `readonly: true` — DECLARED, and it still costs no writer its write, + // but the reason CHANGED on the @objectstack/* 17.4.0 migration. It used to + // be "the strip is an UPDATE-path rule and every writer here is an INSERT". + // objectql 17.4.0 retired that: a static readonly field is now stripped from + // a NON-SYSTEM caller's INSERT payload inside `engine.insert` too, so an + // ordinary user-context create no longer seeds this column. + // + // Every writer is therefore elevated now, and the elevation is scoped as + // narrowly as AGENTS.md house rule 9 requires — the `campaign_enrollment` + // SCREEN flow stays `runAs: 'user'` and hands only the insert to + // `campaign_lead_member_enroll` / `campaign_contact_member_enroll` + // (`runAs: 'system'`, one `create_record` each); the marketing seed is a + // system write already. Nothing updates it: there is no `update_record` + // node, no hook and no action that writes `added_date`. This column's own + // two halves are pinned in `test/audit-stamp-readonly.test.ts` — the + // enrollment writers still stamp it, and a user-context UPDATE is stripped. + // Ruled #1667 (director seat, decision batch #74, 2026-09-07): an + // enrollment stamp nobody is meant to hand-edit gets the declaration that + // says so. ⛔ The 16.x claim this note used to carry ("every member landed + // with a null Added Date while the flag was on") described an engine this + // repo no longer runs; ⛔ do not resurrect it as a reason to open the + // column back up. + // + // Grouped under `basic`, not `response` (#715): it records when the + // membership was created, which is a fact about the enrollment, not a step + // in the response lifecycle the other stamps track. + added_date: Field18.datetime({ + label: "Added Date", + group: "basic", + readonly: true + }), + // Writers, one per surviving value (#597): + // sent — campaign_enrollment flow, `create_campaign` (leads) and + // `add_contact_to_campaign` (contacts) stamp it on insert. + // responded — the `mark_responded` action (src/marketing/actions/campaign.actions.ts). + // converted — the member's lead converting; `campaign_lead_conversion_refresh` + // (src/sales/objects/lead.campaign-metrics.hook.ts) promotes + // the row when `crm_lead.is_converted` flips. + // unsubscribed — set by a rep (or an opt-out request) on the member row; + // `campaign_member_optout_sync` round-trips it to the + // lead/contact's `email_opt_out`, which is what makes the + // enrollment flow's opt-out filter honour it next run. + // + // `opened` / `clicked` / `bounced` were removed here — see the object + // docblock. Nothing on the platform can produce them. + status: Field18.select({ + label: "Status", + required: true, + storage: { notNull: true }, + group: "response", + trackHistory: true, + options: [ + { label: "Sent", value: "sent", default: true, color: "#A0A0A0" }, + { label: "Responded", value: "responded", color: "#00AA00" }, + { label: "Converted", value: "converted", color: "#7C3AED" }, + { label: "Unsubscribed", value: "unsubscribed", color: "#FF0000" } + ] + }), + // Written by the `mark_responded` action, and by + // `campaign_member_lifecycle` when it back-fills a member whose response + // was recorded by flipping `status` directly. + response_date: Field18.datetime({ + label: "Response Date", + group: "response" + }), + // Kept in lockstep with `status == "responded"` by + // `campaign_member_lifecycle` (beforeInsert/beforeUpdate) — a boolean that + // disagrees with the status it summarises is the shape the response + // surfaces cannot render, and it is what `test/seed-consistency.test.ts` + // already pins on the seed side. + has_responded: Field18.boolean({ + label: "Has Responded", + defaultValue: false, + group: "response" + }) + }, + // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the + // rule returns a verdict even when the merged record has no such key. See + // AGENTS.md "Validation predicates must be TOTAL" and + // test/object-validation-predicates.test.ts, which fails the build otherwise. + validations: [ + { + name: "lead_or_contact_required", + type: "script", + severity: "error", + message: "A campaign member must reference either a Lead or a Contact", + condition: P19`(!has(record.crm_lead) || isBlank(record.crm_lead)) && (!has(record.crm_contact) || isBlank(record.crm_contact))` + } + ] +}); + +// src/sales/actions/index.ts +var actions_exports = {}; +__export(actions_exports, { + AccountLogCallAction: () => AccountLogCallAction, + AccountLogMeetingAction: () => AccountLogMeetingAction, + AccountScheduleMeetingAction: () => AccountScheduleMeetingAction, + AddContactToCampaignAction: () => AddContactToCampaignAction, + CloneOpportunityAction: () => CloneOpportunityAction, + ContactLogCallAction: () => ContactLogCallAction, + ContactLogMeetingAction: () => ContactLogMeetingAction, + ContactScheduleMeetingAction: () => ContactScheduleMeetingAction, + ConvertLeadAction: () => ConvertLeadAction, + CreateCampaignAction: () => CreateCampaignAction, + GenerateQuoteAction: () => GenerateQuoteAction, + LeadLogCallAction: () => LeadLogCallAction, + LeadLogMeetingAction: () => LeadLogMeetingAction, + LeadScheduleMeetingAction: () => LeadScheduleMeetingAction, + MarkPrimaryContactAction: () => MarkPrimaryContactAction, + MassUpdateStageAction: () => MassUpdateStageAction, + OpportunityLogCallAction: () => OpportunityLogCallAction, + OpportunityLogMeetingAction: () => OpportunityLogMeetingAction, + OpportunityScheduleMeetingAction: () => OpportunityScheduleMeetingAction, + ScheduleFollowUpAction: () => ScheduleFollowUpAction, + SendEmailAction: () => SendEmailAction +}); + +// src/sales/actions/contact.actions.ts +import { P as P20 } from "@objectstack/spec"; +var MarkPrimaryContactAction = { + name: "mark_primary", + label: "Mark as Primary Contact", + objectName: "crm_contact", + icon: "star", + type: "script", + body: { + language: "js", + source: ` + const id = ctx.recordId; + if (!id) throw new Error('mark_primary requires a recordId'); + await ctx.api.object('crm_contact').update({ id, is_primary: true }, { where: { id } }); + return { ok: true, id, is_primary: true }; + `, + capabilities: ["api.write"], + timeoutMs: 2e3 + }, + locations: ["record_header", "list_item"], + visible: P20`has(record.is_primary) && record.is_primary == false`, + confirmText: "Mark this contact as the primary contact for the account?", + successMessage: "Contact marked as primary!", + refreshAfter: true +}; +var AddContactToCampaignAction = { + name: "add_contact_to_campaign", + label: "Add to Campaign", + objectName: "crm_contact", + icon: "send", + type: "script", + body: { + language: "js", + source: ` + // Value key = the param's field name ('crm_campaign') since the param + // omits an explicit 'name'. Insert uses the REAL lookup field names on + // crm_campaign_member (crm_campaign / crm_contact). + const campaignId = input.crm_campaign ?? null; + if (!campaignId) throw new Error('add_contact_to_campaign requires a campaign id'); + const ids = ctx.recordId ? [ctx.recordId] : []; + if (!ids.length) throw new Error('add_contact_to_campaign: no contact selected'); + const raw = await ctx.api.object('crm_campaign_member').find({ + where: { crm_campaign: campaignId }, + fields: ['crm_contact'], + top: 5000, + }); + const existingRows = Array.isArray(raw) ? raw : (raw?.records ?? []); + const existing = new Set(existingRows.map((r) => r.crm_contact)); + const inserted = []; + let skipped = 0; + for (const contactId of ids) { + if (existing.has(contactId)) { skipped++; continue; } + const row = await ctx.api.object('crm_campaign_member').insert({ + crm_campaign: campaignId, + crm_contact: contactId, + status: 'sent', + }); + inserted.push(row?.id ?? null); + } + return { campaignId, count: inserted.length, skipped, ids: inserted }; + `, + capabilities: ["api.read", "api.write"], + timeoutMs: 1e4 + }, + locations: ["list_toolbar", "list_item"], + params: [ + { + field: "crm_campaign", + objectOverride: "crm_campaign_member", + label: "Campaign", + required: true + } + ], + // An opted-out contact must not be added to a campaign by hand either — the + // enrollment flow already filters them out, and a manual add-to-campaign is + // the obvious way around a filter nobody remembers is there. Same predicate + // the `send_email` action uses. + visible: P20`has(record.email_opt_out) && record.email_opt_out == false`, + successMessage: "Contacts added to campaign!", + refreshAfter: true +}; +var SendEmailAction = { + name: "send_email", + label: "Send Email", + objectName: "crm_contact", + icon: "mail", + // script, not modal: modal submits die on GET /api/v1/meta/object/ + // → 400 in 16.1.0; script actions POST /api/v1/actions/... and execute. + type: "script", + body: { + language: "js", + source: ` + const record = ctx.record ?? {}; + const recipientId = ctx.recordId ?? record.id ?? null; + const to = record.email ? String(record.email) : ''; + const from = ctx.user?.email ?? 'noreply@hotcrm.local'; + const userId = ctx.user?.id ?? null; + const subject = input.subject ? String(input.subject) : ('Email to ' + to); + const body = input.body ? String(input.body) : ''; + const email = await ctx.api.object('sys_email').insert({ + from_address: from, + to_addresses: to, + subject, + body_text: body, + status: 'queued', + related_object: 'crm_contact', + related_id: recipientId, + sent_by: userId, + }); + + ${ACTOR_NAME_RESOLUTION_SOURCE} + + // Surface the email on the contact's unified activity timeline + // (the audit writer only logs generic CRUD; this is the semantic event). + const activity = await ctx.api.object('sys_activity').insert({ + type: 'completed', + summary: 'Email: ' + subject, + actor_id: userId, + actor_name: actorName, + object_name: 'crm_contact', + record_id: recipientId, + record_label: record.full_name ?? record.name ?? to, + // ADR-0052 ActivityPointer: structured pointer to the rich source entity + // (the sys_email row) so the timeline renders a "View source \u2192" drill to + // the full email \u2014 the queryable replacement for stashing the id in metadata. + source_object: 'sys_email', + source_id: email?.id ?? null, + metadata: JSON.stringify({ kind: 'email', to, subject }), + }); + // #592 scope item 3: every activity writer bumps interaction recency. + // An email is an interaction but NOT a calendar slot, so it writes no + // \`crm_event\` \u2014 which means it cannot ride the event hook's bubble and + // has to stamp the two timestamps itself. Both columns are deliberately + // non-readonly (see crm_account.last_activity_date's note): a readonly + // field is stripped from any non-system write whose caller supplied the + // key (#2948), and an action body runs under the sending rep's context. + if (recipientId) { + const nowIso = new Date().toISOString(); + try { + await ctx.api.object('crm_contact').update( + { id: recipientId, last_contacted_date: nowIso }, + { where: { id: recipientId } }, + ); + } catch (e) { /* best-effort recency; never fail the send */ } + const accountId = record.crm_account ? String(record.crm_account) : null; + if (accountId) { + try { + await ctx.api.object('crm_account').update( + { id: accountId, last_activity_date: nowIso.slice(0, 10) }, + { where: { id: accountId } }, + ); + } catch (e) { /* best-effort recency; never fail the send */ } + } + } + return { emailId: email?.id, activityId: activity?.id }; + `, + capabilities: ["api.read", "api.write"], + timeoutMs: 5e3 + }, + locations: ["record_header", "list_item"], + visible: P20`has(record.email_opt_out) && record.email_opt_out == false`, + params: [ + { name: "subject", label: "Subject", type: "text", required: true }, + { name: "body", label: "Body", type: "textarea", required: true } + ], + refreshAfter: false +}; + +// src/sales/actions/lead.actions.ts +import { P as P21 } from "@objectstack/spec"; +var ConvertLeadAction = { + name: "convert_lead", + label: "Convert Lead", + objectName: "crm_lead", + icon: "arrow-right-circle", + type: "flow", + target: "lead_conversion", + locations: ["record_header", "list_item"], + // Convert is the lead's most basic outcome — surface it on ANY open lead + // (new / contacted / qualified), not just qualified. Gating to qualified-only + // hid the button on most seeded leads, so it read as "conversion is missing". + // Only already-converted or disqualified leads hide it. + // + // TOTALITY (AGENTS.md → "Validation predicates must be TOTAL", #630): every + // `record.x` read carries a `has(record.x)`, and the guards are arranged to + // fail CLOSED — an unknown record hides the button. That arrangement is a + // MEASUREMENT, not a preference. Measured in the browser on console 17.4.0 by + // instrumenting the shipped predicate evaluator: the record page evaluates this + // predicate twice against an EMPTY record (`record` is `{}`, zero keys) before + // the row lands, then re-evaluates it against the full row. So an absent + // `status` here means "no record yet", never "a lead with no status" — a lead + // with no status cannot exist, since `status` is `required` with + // `storage: { notNull: true }` and `defaultValue: 'new'` (src/sales/objects/lead.object.ts), + // and the REST payload this surface reads carries every declared column. + // Fail-open (`!has(record.status) || …`) would therefore buy nothing and cost + // something real: Convert would flash on a disqualified lead for the + // pre-hydration beat, on an IRREVERSIBLE action. + // Unguarded, strict CEL aborted the whole predicate on those two renders + // (`[runtime] No such key: status`) and object-ui fell back to its own + // `fallback: false`, so this spelling states the policy the error path was + // already applying — minus the console warning on every lead page load. (#1890) + // + // ⚠️ The approval term is the ONE fail-OPEN read in this predicate, and the + // asymmetry is deliberate rather than an oversight in an otherwise + // fail-closed arrangement (REQ-0005 step 7). The two terms above fail closed + // because an absent `status` means "no record yet" — a lead with no status + // cannot exist, since `status` is `required` with a `defaultValue`. An absent + // `conversion_approval_status` means something else entirely: a lead written + // before the column existed, which must convert the way it always did. And + // the shipped `not_required` default is the gate's OFF position, so treating + // "not one of the two refusing verdicts" as convertible is what makes the + // default install behave exactly as it did before this field. `lead.hook.ts` + // and `lead-conversion.flow.ts`'s `decision_approval` carry the same polarity + // — the three surfaces have to agree about what "off" means, or the button + // disappears on leads the write path would happily convert. + // + // ⛔ Hiding this button is NOT the gate. It is the courtesy half; the control + // is the `beforeUpdate` refusal in `lead.hook.ts`, which a REST caller cannot + // route around. + visible: P21`has(record.is_converted) && record.is_converted == false && has(record.status) && record.status != "unqualified" && record.status != "converted" + && (!has(record.conversion_approval_status) || (record.conversion_approval_status != "pending" && record.conversion_approval_status != "rejected"))`, + // NO `confirmText`. A screen flow IS the confirmation, and this one opens + // `Conversion Details` — a screen carrying the decision (`Create + // Opportunity?`, and the deal's name and amount), a Cancel button, and the + // suspected-duplicate warning that says something TRUE about THIS lead. A + // dialog in front of it costs every conversion one extra click to answer a + // question it cannot help anyone answer. Confirms are for DESTRUCTIVE actions + // with no follow-up UI — `close_case` / `escalate_case` in `case.actions.ts` + // are the shape that still earns one. + // + // Mechanism, measured on the console this app pinned at that taking + // (@objectstack/console 17.3.0, `dist/assets/`; this bundle read was ⛔ NOT + // re-taken on any later pin — 17.4.0, PR #1814, or 17.5.0) rather than + // assumed: the runner gates the dialog on + // the key's presence alone — + // if (action.confirmText && !await confirmHandler(evaluate(action.confirmText))) + // return { success: false, error: 'Action cancelled by user' }; + // — so REMOVING the key is what removes the dialog; there is no `confirm: + // false` to write, and no other key re-raises it. + successMessage: "Lead converted successfully!", + refreshAfter: true, + // ADR-0011 — opt this Action in to AI, which materialises the + // `action_convert_lead` tool the `lead_qualification` skill references. + // Flow-typed with a target, so it has a headless path. `requiresConfirmation` + // is the only key the AI path reads: `actionLooksDestructive` consults + // `ai.requiresConfirmation` and nothing else, and the console's + // confirm-dialog string reached no AI code — so dropping `confirmText` above + // leaves the AI approval signal exactly where it was. The flag is SURFACED, + // not enforced — `list_actions` reports `requiresConfirmation: true` and the + // calling client decides what to do with it, while `run_action` dispatches + // the flow with no server-side pause. It warns the caller that this is + // irreversible; it is not a lock. + ai: { + exposed: true, + requiresConfirmation: true, + description: "Converts a qualified lead into an account, contact and opportunity. Irreversible \u2014 requires human approval before it runs." + } +}; +var ScheduleFollowUpAction = { + name: "schedule_followup", + label: "Schedule Follow-up", + objectName: "crm_lead", + icon: "calendar-plus", + type: "flow", + target: "schedule_followup", + locations: ["record_header", "list_item"], + // A converted or disqualified lead has no next touch to schedule. + visible: P21`has(record.is_converted) && record.is_converted == false && has(record.status) && record.status != "unqualified" && record.status != "converted"`, + successMessage: "Follow-up scheduled.", + refreshAfter: true, + // ADR-0011 — materialises `action_schedule_followup` for the + // `lead_qualification` skill. Additive and reversible, so no approval gate. + ai: { + exposed: true, + description: "Schedules the next follow-up task on a lead, assigned to its owner, so the next touch lands on the rep list." + } +}; +var CreateCampaignAction = { + name: "create_campaign", + label: "Add to Campaign", + objectName: "crm_lead", + icon: "send", + // script, not modal — a `type: 'modal'` action has NO server dispatch at all: + // the renderer just opens its `target`, and the runtime refuses it over REST + // (`headlessActionTypeError`, 400 "a client-side action with no server + // dispatch"), so its `body` never runs. To collect input and then run + // server-side, the shape is `type: 'script'` + `params` — the runner collects + // the same dialog. See ScheduleFollowUpAction. + type: "script", + body: { + language: "js", + source: ` + // Value key = the param's field name ('crm_campaign') since the param + // omits an explicit 'name'. Insert uses the REAL lookup field names on + // crm_campaign_member (crm_campaign / crm_lead) \u2014 not the generic + // campaign_id / lead_id an earlier revision of the doc example taught, + // which don't exist here and left crm_campaign null \u2192 'Campaign required' + // validation failure. + const campaignId = input.crm_campaign ?? null; + if (!campaignId) throw new Error('create_campaign requires a campaign id'); + // One lead per dispatch \u2014 the bare-string \`bulkActions\` wiring fans this + // body out once per selected row (see the note above). \`ids\` stays a + // list so the dedupe + skip loop below reads the same on both contracts, + // should this action ever move to an aggregate def. + const ids = ctx.recordId ? [ctx.recordId] : []; + if (!ids.length) throw new Error('create_campaign: no lead selected'); + // Skip leads already on this campaign \u2014 the modal copy promises + // duplicates are skipped, and re-running the action on the same + // selection must not double-count marketing touches. + const raw = await ctx.api.object('crm_campaign_member').find({ + where: { crm_campaign: campaignId }, + fields: ['crm_lead'], + top: 5000, + }); + const existingRows = Array.isArray(raw) ? raw : (raw?.records ?? []); + const existing = new Set(existingRows.map((r) => r.crm_lead)); + const inserted = []; + let skipped = 0; + for (const leadId of ids) { + if (existing.has(leadId)) { skipped++; continue; } + const row = await ctx.api.object('crm_campaign_member').insert({ + crm_campaign: campaignId, + crm_lead: leadId, + status: 'sent', + }); + inserted.push(row?.id ?? null); + } + return { campaignId, count: inserted.length, skipped, ids: inserted }; + `, + capabilities: ["api.read", "api.write"], + timeoutMs: 1e4 + }, + // list_item gives every row a working record-scoped entry point. The + // list_toolbar button is single-record by construction: with no `_selectedIds` + // in the bag the dispatcher resolves a recordId from the grid selection, and a + // multi-row selection there is ambiguous, so it is refused client-side with + // "This action runs on a single record — select exactly one row." + // Multi-lead enrollment is the SELECTION-BAR button instead, which the view's + // `bulkActions: ['create_campaign']` produces and which fans out per row. + locations: ["list_toolbar", "list_item"], + params: [ + // Field-backed param: `field` + `objectOverride` make the console resolve + // the widget from crm_campaign_member.crm_campaign (a lookup → crm_campaign), + // rendering a RECORD PICKER. A bare `{ type:'lookup' }` with no field can't + // resolve a target object and silently falls back to a paste-the-ID textbox. + { + field: "crm_campaign", + objectOverride: "crm_campaign_member", + label: "Campaign", + required: true + } + ], + successMessage: "Leads added to campaign!", + refreshAfter: true +}; + +// src/sales/actions/opportunity.actions.ts +import { P as P22 } from "@objectstack/spec"; +var CloneOpportunityAction = { + name: "clone_opportunity", + label: "Clone Opportunity", + objectName: "crm_opportunity", + icon: "copy", + type: "script", + body: { + language: "js", + source: ` + const id = ctx.recordId; + if (!id) throw new Error('clone_opportunity requires a recordId'); + // Read the source from ctx.record (seeded by the runner for record-scoped + // actions \u2014 same source send_email uses). This avoids the in-sandbox + // find() that previously faulted, WHILE still copying the REQUIRED fields + // (crm_account / amount / close_date). The old minimal insert set only + // name+stage, so every clone failed the object's required-field + amount>0 + // validations at runtime and no opportunity was ever created. + const src = ctx.record ?? {}; + if (!src.crm_account) { + throw new Error('clone_opportunity: source account not loaded; cannot clone.'); + } + // Give the clone a fresh 90-day close horizon so a copied past date can't + // trip the "close date in the past" validation on a new prospecting deal. + // + // The step is on the UTC calendar because the render below is + // (\`toISOString()\`). The base is \`new Date()\` \u2014 an instant, not a + // stored \`YYYY-MM-DD\` \u2014 so unlike quote.hook/task.hook there is no + // UTC-midnight anchor being read back on the wrong calendar here; the + // only mixture was the step itself. A local \`getDate\`/\`setDate\` step + // preserves WALL-CLOCK time, so a 90-day window containing a DST + // transition is 23 h or 25 h long and the rendered UTC day lands one off + // whenever the clone instant is within an hour of a UTC day boundary. + const horizon = new Date(); + horizon.setUTCDate(horizon.getUTCDate() + 90); + const inserted = await ctx.api.object('crm_opportunity').insert({ + name: 'Copy of ' + (src.name ?? ('opportunity ' + id)), + crm_account: src.crm_account, + primary_contact: src.primary_contact ?? null, + amount: src.amount ?? 1, + stage: 'prospecting', + probability: 10, + close_date: horizon.toISOString().slice(0, 10), + type: src.type ?? null, + lead_source: src.lead_source ?? null, + crm_campaign: src.crm_campaign ?? null, + // Explicit because an action body runs \`isSystem\`, so nothing stamps + // \`owner_id\` for it \u2014 see the note in activity-actions.ts (#548). + owner_id: ctx.user?.id ?? null, + }); + return { id: inserted?.id ?? null }; + `, + capabilities: ["api.read", "api.write"], + timeoutMs: 5e3 + }, + locations: ["record_header", "record_more"], + successMessage: "Opportunity cloned successfully!", + refreshAfter: true +}; +var MassUpdateStageAction = { + name: "mass_update_stage", + label: "Update Stage", + objectName: "crm_opportunity", + icon: "layers", + type: "script", + body: { + language: "js", + source: ` + const newStage = input.stage ?? null; + if (!newStage) throw new Error('mass_update_stage requires a stage'); + // Selection first, single record as the fallback. An aggregate dispatch + // carries the whole selection in \`_selectedIds\` and NO recordId; a + // single-record dispatch carries recordId and no selection. The two are + // never both present, so the order only decides which shape wins if the + // platform ever sends both. + const selected = Array.isArray(input._selectedIds) ? input._selectedIds : []; + const ids = selected.length ? selected : (ctx.recordId ? [ctx.recordId] : []); + if (!ids.length) throw new Error('mass_update_stage: no opportunity selected'); + const missed = []; + let firstCause = ''; + let updated = 0; + for (const id of ids) { + // \`update(data, options)\` \u2014 \`ctx.api\` is the engine repo facade, whose + // update takes a DOCUMENT, not an id. \`updateById(id, data)\` exists on + // ObjectRepository but NOT on the facade the runtime builds when it has + // no scoped context, so this spelling is the only one live on both. + // + // An id that matches no row is a MISS, not an abort, and the engine has + // answered it both ways: through @objectstack/* 17.0.0-rc.6 \`update\` + // RESOLVED WITH NULL, and from 17.0.0 it REJECTS (RECORD_NOT_FOUND / + // 404). Both are handled here, and neither may end the loop \u2014 an + // uncaught rejection on the first stale id would leave every id after + // it unattempted, so re-running the action over the same selection + // would fail at the same row forever and the live rows behind it could + // never be covered. That is strictly worse than the silent-success + // failure #588 pulled this button for, because it is unrecoverable + // from the UI. Collect the miss, keep going, reject once at the end. + // + // The catch is deliberately cause-AGNOSTIC \u2014 but NOT because the cause + // is invisible. Read on 17.4.0 (\`hostErrorToVm\`; not re-read on 17.5.0), a host + // rejection reaches a body as \`name\` and \`message\` plus, when the host + // error carries them, \`code\`, \`status\`, \`fields\` and \`userMessage\` \u2014 + // nothing else, so a stale id arrives branchable as + // \`code === 'RECORD_NOT_FOUND'\` while \`details\` really is dropped. The + // branch is not taken because every cause has the same outcome here \u2014 + // the row did not move, so collect it and keep going \u2014 and narrowing + // the catch to a roster of known codes would let an unlisted cause + // abort the loop, the failure the paragraph above forbids. Message text + // is engine wording and not contract, so \`firstCause\` is carried + // verbatim and never parsed. + let row = null; + try { + row = await ctx.api.object('crm_opportunity').update( + { id: id, stage: newStage }, + { where: { id: id } }, + ); + } catch (err) { + row = null; + if (!firstCause) firstCause = (err && err.message) ? String(err.message) : String(err); + } + // Count only what came back: counting the ATTEMPT is how a stale or + // invisible id turns into a success toast for a write that never + // happened (#588). + if (row) { updated++; } else { missed.push(id); } + } + // Aggregate dispatch is all-or-nothing (objectui#3139): a handler that + // cannot cover the whole selection must reject rather than report partial + // work, because the bar offers no per-row retry \u2014 the retry IS re-running + // the action over the selection, which is safe here since setting a stage + // is idempotent. Rows already moved in this run keep the new stage; the + // error names the ones that did not so the rep can see the difference. + if (missed.length) { + throw new Error( + 'mass_update_stage: ' + missed.length + ' of ' + ids.length + + ' selected opportunities could not be updated (' + missed.join(', ') + + '). Re-run the action on the selection to retry.' + + (firstCause ? ' First cause: ' + firstCause : '') + ); + } + return { stage: newStage, updated }; + `, + capabilities: ["api.write"], + timeoutMs: 1e4 + }, + locations: ["list_toolbar"], + params: [ + { + name: "stage", + label: "New Stage", + type: "select", + required: true, + // Mirrors crm_opportunity.stage exactly — see _picklists.ts. + options: plainOptions(OPPORTUNITY_STAGE_OPTIONS) + } + ], + successMessage: "Opportunities updated successfully!", + refreshAfter: true +}; +var GenerateQuoteAction = { + name: "generate_quote", + label: "Generate Quote", + objectName: "crm_opportunity", + icon: "receipt", + type: "flow", + target: "quote_generation", + // Mirror clone_opportunity's placement (header + overflow menu) so the action + // is reachable both as a primary button and from the "…" menu on narrow + // viewports where the header collapses. + locations: ["record_header", "record_more", "list_item"], + visible: P22`has(record.stage) && record.stage != "closed_won" && record.stage != "closed_lost"`, + successMessage: "Quote created from opportunity!", + refreshAfter: true +}; + +// src/marketing/actions/index.ts +var actions_exports2 = {}; +__export(actions_exports2, { + EnrollLeadsAction: () => EnrollLeadsAction, + MarkRespondedAction: () => MarkRespondedAction +}); + +// src/marketing/actions/campaign.actions.ts +import { P as P23 } from "@objectstack/spec"; +var EnrollLeadsAction = { + name: "enroll_leads", + label: "Enroll Members", + objectName: "crm_campaign", + icon: "user-plus", + type: "flow", + target: "campaign_enrollment", + locations: ["record_header", "record_more"], + // Enrollment only makes sense while the campaign is open — the flow + // double-checks this server-side. + visible: P23`has(record.status) && (record.status == "planning" || record.status == "in_progress")`, + successMessage: "Eligible members enrolled in campaign.", + refreshAfter: true +}; +var MarkRespondedAction = { + name: "mark_responded", + label: "Mark Responded", + objectName: "crm_campaign_member", + icon: "reply", + // script, not modal — a `type: 'modal'` action has no server dispatch at all + // and its body never runs (see `create_campaign`'s note in lead.actions.ts). + type: "script", + body: { + language: "js", + source: ` + const id = ctx.recordId; + if (!id) throw new Error('mark_responded requires a recordId'); + const respondedAt = new Date().toISOString(); + await ctx.api.object('crm_campaign_member').update( + { id, status: 'responded', has_responded: true, response_date: respondedAt }, + { where: { id } }, + ); + return { id, status: 'responded', response_date: respondedAt }; + `, + capabilities: ["api.write"], + timeoutMs: 5e3 + }, + locations: ["record_header", "list_item"], + // Already-responded and converted members have nothing to record; an + // unsubscribed member must not be dragged back into the funnel by a + // mis-click (`campaign_member_optout_sync` has already opted that person out + // of email, and this action would not undo that — leaving the two records + // disagreeing about the same person). + visible: P23`has(record.status) && record.status == "sent"`, + successMessage: "Response recorded on this campaign member.", + refreshAfter: true +}; + +// src/sales/dashboards/index.ts +var dashboards_exports = {}; +__export(dashboards_exports, { + ActivityDashboard: () => ActivityDashboard, + CrmOverviewDashboard: () => CrmOverviewDashboard, + ExecutiveDashboard: () => ExecutiveDashboard, + SalesDashboard: () => SalesDashboard +}); + +// src/sales/dashboards/activity.dashboard.ts +var ActivityDashboard = { + name: "sales_activity_dashboard", + label: "Sales Activity", + description: "Who is talking to customers, how often, and which accounts have gone quiet", + columns: 12, + gap: 4, + refreshIntervalSeconds: 300, + header: { + showTitle: true, + showDescription: true + }, + globalFilters: [ + { + field: "owner_id", + label: { en: "Rep", "zh-CN": "\u9500\u552E\u4EE3\u8868", "es-ES": "Representante", "ja-JP": "\u62C5\u5F53\u8005" }, + type: "lookup", + scope: "dashboard", + optionsFrom: { object: "sys_user", valueField: "id", labelField: "name" } + } + ], + widgets: [ + // ─── Row 1: what happened, and what is booked ───────────────────── + { + id: "interactions_held", + title: "Interactions Logged", + description: "Calls and meetings that actually happened", + type: "metric", + filter: { status: "held" }, + colorVariant: "success", + dataset: "event_metrics", + values: ["event_count"], + layout: { x: 0, y: 0, w: 3, h: 2 } + }, + { + id: "meetings_booked", + title: "Meetings Booked", + description: "Meetings on the calendar that have not happened yet", + type: "metric", + filter: { status: "planned", type: "meeting" }, + colorVariant: "blue", + dataset: "event_metrics", + values: ["event_count"], + layout: { x: 3, y: 0, w: 3, h: 2 } + }, + { + id: "customer_minutes", + title: "Customer Minutes", + description: "Total time spent in front of customers", + type: "metric", + filter: { status: "held" }, + colorVariant: "purple", + dataset: "event_metrics", + values: ["total_minutes"], + layout: { x: 6, y: 0, w: 3, h: 2 } + }, + { + // First widget in the app to use `task_metrics`. The dataset shipped with + // the "My Day" work and then had no consumer at all (#592) — a semantic + // layer nobody queries is a maintenance cost with no reader. + id: "tasks_completed", + title: "Tasks Completed", + description: "Follow-ups closed out \u2014 the other half of activity", + type: "metric", + filter: { is_completed: true }, + colorVariant: "orange", + dataset: "task_metrics", + values: ["task_count"], + layout: { x: 9, y: 0, w: 3, h: 2 } + }, + // ─── Row 2: who, and when ───────────────────────────────────────── + { + id: "activity_by_rep", + title: "Activity by Rep", + description: "Logged interactions per owner \u2014 the coverage question", + type: "bar", + filter: { status: "held" }, + colorVariant: "success", + dataset: "event_metrics", + dimensions: ["owner"], + values: ["event_count"], + layout: { x: 0, y: 2, w: 6, h: 4 }, + chartConfig: { + showLegend: false, + showDataLabels: true, + colors: ["#10B981"] + } + }, + { + id: "activity_by_week", + title: "Activity Volume by Week", + description: "Interactions per week \u2014 is the team speeding up or going quiet?", + type: "area", + filter: { status: "held" }, + colorVariant: "blue", + // The week bucket lives on the DIMENSION, not in a filter — see the + // header note on why the trend belongs on an axis here. The datetime + // filter bound itself works (objectstack#3912 / #3777, 17.0.0); putting + // the trend in a filter would narrow it, which is a different objection. + dataset: "event_metrics", + dimensions: ["start_datetime"], + values: ["event_count"], + layout: { x: 6, y: 2, w: 6, h: 4 }, + chartConfig: { + showLegend: false, + showDataLabels: false, + colors: ["#0EA5E9"], + interaction: { tooltips: true, brush: true } + } + }, + // ─── Row 3: what the activity is about ──────────────────────────── + { + id: "activity_mix", + title: "Activity Mix", + description: "Calls vs meetings vs demos", + type: "donut", + filter: { status: "held" }, + colorVariant: "purple", + dataset: "event_metrics", + dimensions: ["type"], + values: ["event_count"], + layout: { x: 0, y: 6, w: 4, h: 4 }, + chartConfig: { + showLegend: true, + showDataLabels: true, + colors: ["#4169E1", "#10B981", "#8B5CF6", "#F59E0B", "#0EA5E9", "#94A3B8"] + } + }, + { + id: "activity_by_record_type", + title: "Where the Activity Lands", + description: "Which part of the funnel is getting attention", + type: "bar", + filter: { status: "held" }, + colorVariant: "blue", + dataset: "event_metrics", + dimensions: ["related_to_type"], + values: ["event_count"], + layout: { x: 4, y: 6, w: 4, h: 4 }, + chartConfig: { + showLegend: false, + showDataLabels: true, + colors: ["#4169E1"] + } + }, + { + // "Activity per open deal" as two honest numbers rather than one + // fabricated ratio: the semantic layer has no cross-dataset calculated + // measure, so a single "1.8 activities/deal" tile would have to be + // computed by the renderer over two independent queries — which nothing + // does today. A manager reads the pair; a made-up quotient would read as + // measured. Filed as a follow-up rather than faked here. + id: "deal_activity", + title: "Interactions on Deals", + description: "Logged interactions linked to an opportunity \u2014 read against Open Deals \u2192", + type: "metric", + filter: { status: "held", related_to_type: "crm_opportunity" }, + colorVariant: "success", + dataset: "event_metrics", + values: ["event_count"], + layout: { x: 8, y: 6, w: 2, h: 4 } + }, + { + id: "open_deals_for_activity", + title: "Open Deals", + description: "Opportunities still in play", + type: "metric", + filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, + colorVariant: "blue", + dataset: "opportunity_metrics", + values: ["opp_count"], + layout: { x: 10, y: 6, w: 2, h: 4 } + }, + // ─── Row 4: the churn story, now backed by a real signal ────────── + // These window `crm_account.last_activity_date`, which is a `Field.date()` + // (TEXT `YYYY-MM-DD`) — the same shape `customer_churn_signals` already + // filters safely. Until #592 the column was written by nothing at all: the + // bubble that fed it was silently discarded on every invocation because + // the field was `readonly` (#2948). These three tiles are the reason that + // mattered. + { + id: "quiet_accounts_30", + title: "Quiet 30+ Days", + description: "Active accounts with no logged interaction in a month", + type: "metric", + filter: { is_active: true, last_activity_date: { $lt: "{30_days_ago}" } }, + colorVariant: "warning", + dataset: "account_metrics", + values: ["account_count"], + layout: { x: 0, y: 10, w: 4, h: 2 } + }, + { + id: "quiet_accounts_60", + title: "Quiet 60+ Days", + description: "Two months of silence \u2014 the at-risk threshold", + type: "metric", + filter: { is_active: true, last_activity_date: { $lt: "{60_days_ago}" } }, + colorVariant: "orange", + dataset: "account_metrics", + values: ["account_count"], + layout: { x: 4, y: 10, w: 4, h: 2 } + }, + { + id: "quiet_accounts_90", + title: "Quiet 90+ Days", + description: "A quarter with no contact \u2014 intervene or write it off", + type: "metric", + filter: { is_active: true, last_activity_date: { $lt: "{90_days_ago}" } }, + colorVariant: "danger", + dataset: "account_metrics", + values: ["account_count"], + layout: { x: 8, y: 10, w: 4, h: 2 } + } + ] +}; + +// src/sales/dashboards/shared-widgets.ts +var pipelineByStageFunnelWidget = (layout) => ({ + id: "pipeline_by_stage", + title: "Pipeline by Stage", + description: "Open opportunity value at each sales stage", + type: "funnel", + filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, + dataset: "opportunity_metrics", + dimensions: ["stage"], + values: ["total_amount"], + layout, + suppressWarnings: ["chart-config-missing"] + // intentional default rendering +}); +var avgDealSizeMetricWidget = (layout, overrides = {}) => ({ + id: "avg_deal_size", + title: "Avg Deal Size", + description: "Average value of closed-won deals", + type: "metric", + filter: { stage: "closed_won" }, + colorVariant: "orange", + dataset: "opportunity_metrics", + values: ["avg_amount"], + layout, + ...overrides +}); + +// src/sales/dashboards/crm.dashboard.ts +var CrmOverviewDashboard = { + name: "crm_overview_dashboard", + label: "CRM Overview", + description: "Revenue metrics, pipeline analytics, and deal insights", + columns: 12, + gap: 4, + refreshIntervalSeconds: 300, + header: { + showTitle: true, + showDescription: true + // Header action buttons removed: `create_opportunity` / `create_lead` are not + // defined actions and `/reports` is not an in-app view route — all three were + // dead. Re-add real, wired-up actions here when available. + }, + dateRange: { + field: "close_date", + defaultRange: "this_quarter", + allowCustomRange: true + }, + globalFilters: [ + { + field: "owner_id", + label: { en: "Owner", "zh-CN": "\u8D1F\u8D23\u4EBA", "es-ES": "Responsable", "ja-JP": "\u62C5\u5F53\u8005" }, + type: "lookup", + scope: "dashboard", + optionsFrom: { object: "sys_user", valueField: "id", labelField: "name" } + } + ], + widgets: [ + // ─── KPI Row ────────────────────────────────────────────────────── + { + id: "total_revenue", + title: "Total Revenue", + description: "Closed-won revenue this period", + type: "metric", + filter: { stage: "closed_won" }, + colorVariant: "success", + dataset: "opportunity_metrics", + values: ["total_amount"], + layout: { x: 0, y: 0, w: 3, h: 2 } + }, + { + id: "active_deals", + title: "Active Deals", + description: "Open opportunities in the pipeline", + type: "metric", + filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, + colorVariant: "blue", + dataset: "opportunity_metrics", + values: ["opp_count"], + layout: { x: 3, y: 0, w: 3, h: 2 } + }, + { + id: "won_deals", + title: "Won Deals", + description: "Closed-won deals this period", + type: "metric", + filter: { stage: "closed_won" }, + colorVariant: "purple", + dataset: "opportunity_metrics", + values: ["opp_count"], + layout: { x: 6, y: 0, w: 3, h: 2 } + }, + // No overrides left once the fabricated trend is gone. + avgDealSizeMetricWidget({ x: 9, y: 0, w: 3, h: 2 }), + // ─── Charts Row 1 ───────────────────────────────────────────────── + { + id: "revenue_trends", + title: "Revenue Trends", + description: "Closed-won revenue over the last 12 months", + type: "area", + filter: { stage: "closed_won", close_date: { $gte: "{12_months_ago}" } }, + filterBindings: { dateRange: false }, + // self-scoped to 12 months — the date picker must not narrow it + colorVariant: "success", + dataset: "opportunity_metrics", + dimensions: ["close_date"], + values: ["total_amount"], + layout: { x: 0, y: 2, w: 9, h: 4 }, + chartConfig: { + showLegend: false, + showDataLabels: false, + colors: ["#10B981"], + interaction: { tooltips: true, brush: true } + }, + options: { dateGranularity: "month" } + }, + { + id: "lead_source", + title: "Lead Source", + description: "Pipeline value by acquisition channel", + type: "donut", + colorVariant: "purple", + dataset: "opportunity_metrics", + dimensions: ["lead_source"], + values: ["total_amount"], + layout: { x: 9, y: 2, w: 3, h: 4 }, + chartConfig: { + showLegend: true, + showDataLabels: true, + colors: ["#4F46E5", "#06B6D4", "#10B981", "#F59E0B", "#EF4444", "#8B5CF6"] + } + }, + // ─── Charts Row 2 ───────────────────────────────────────────────── + pipelineByStageFunnelWidget({ x: 0, y: 6, w: 6, h: 4 }), + { + id: "top_products", + title: "Top Products", + description: "Total list-price revenue by product category", + type: "bar", + colorVariant: "blue", + // crm_product has no `close_date`, so the date picker would fail it with + // `no such column`. ObjectStack 15 (framework#2501) injects every dashboard + // filter (dateRange + globalFilters) into each widget's query. + // The `owner_id` opt-out is SEMANTIC, not structural: since #548 every + // business object carries the injected `owner_id`, so the filter would now + // resolve — it just means nothing on a shared product catalog, where the + // column records whoever created the entry. + filterBindings: { dateRange: false, owner_id: false }, + dataset: "product_metrics", + dimensions: ["category"], + values: ["list_price_sum"], + layout: { x: 6, y: 6, w: 6, h: 4 }, + chartConfig: { + showLegend: false, + showDataLabels: true, + colors: ["#4F46E5"] + } + }, + // ─── Pipeline by Owner ──────────────────────────────────────────── + // A dashboard `table` binds to an analytics dataset (a cube), so it must + // aggregate — it cannot list raw records (ADR-0021). The previous + // "Recent Opportunities" table selected only the `opp_count` measure with + // no dimension, which renders a single summary row, not a per-deal list. + // For a true per-record listing, surface an object-bound ListView through + // app navigation instead (ADR-0017). Here we group by owner for a rep + // pipeline breakdown that renders one row per owner. + { + id: "pipeline_by_owner", + title: "Pipeline by Owner", + description: "Open pipeline value and deal count per sales rep", + type: "table", + filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, + colorVariant: "default", + dataset: "opportunity_metrics", + dimensions: ["owner"], + values: ["total_amount", "opp_count", "avg_amount"], + layout: { x: 0, y: 10, w: 12, h: 4 }, + options: { + sortBy: "total_amount", + sortOrder: "desc", + limit: 10 + } + } + ] +}; + +// src/sales/dashboards/executive.dashboard.ts +var LEAD_SOURCE_FILTER_LABELS = { + web: { en: "Web", "zh-CN": "\u7F51\u7AD9", "es-ES": "Web", "ja-JP": "\u30A6\u30A7\u30D6" }, + referral: { en: "Referral", "zh-CN": "\u63A8\u8350", "es-ES": "Referencia", "ja-JP": "\u7D39\u4ECB" }, + event: { en: "Event / Trade Show", "zh-CN": "\u6D3B\u52A8 / \u5C55\u4F1A", "es-ES": "Evento / Feria", "ja-JP": "\u30A4\u30D9\u30F3\u30C8\u30FB\u5C55\u793A\u4F1A" }, + webinar: { en: "Webinar", "zh-CN": "\u7EBF\u4E0A\u7814\u8BA8\u4F1A", "es-ES": "Seminario Web", "ja-JP": "\u30A6\u30A7\u30D3\u30CA\u30FC" }, + partner: { en: "Partner", "zh-CN": "\u5408\u4F5C\u4F19\u4F34", "es-ES": "Socio", "ja-JP": "\u30D1\u30FC\u30C8\u30CA\u30FC" }, + advertisement: { en: "Advertisement", "zh-CN": "\u5E7F\u544A", "es-ES": "Publicidad", "ja-JP": "\u5E83\u544A" }, + paid_search: { en: "Paid Search", "zh-CN": "\u4ED8\u8D39\u641C\u7D22", "es-ES": "B\xFAsqueda de Pago", "ja-JP": "\u6709\u6599\u691C\u7D22" }, + social: { en: "Social Media", "zh-CN": "\u793E\u4EA4\u5A92\u4F53", "es-ES": "Redes Sociales", "ja-JP": "\u30BD\u30FC\u30B7\u30E3\u30EB\u30E1\u30C7\u30A3\u30A2" }, + content: { en: "Content / Blog", "zh-CN": "\u5185\u5BB9 / \u535A\u5BA2", "es-ES": "Contenido / Blog", "ja-JP": "\u30B3\u30F3\u30C6\u30F3\u30C4\u30FB\u30D6\u30ED\u30B0" }, + cold_call: { en: "Cold Call", "zh-CN": "\u964C\u751F\u62DC\u8BBF", "es-ES": "Llamada en Fr\xEDo", "ja-JP": "\u30B3\u30FC\u30EB\u30C9\u30B3\u30FC\u30EB" }, + email_campaign: { en: "Email Campaign", "zh-CN": "\u90AE\u4EF6\u8425\u9500", "es-ES": "Campa\xF1a de Email", "ja-JP": "\u30E1\u30FC\u30EB\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" }, + other: { en: "Other", "zh-CN": "\u5176\u4ED6", "es-ES": "Otro", "ja-JP": "\u305D\u306E\u4ED6" } +}; +var ExecutiveDashboard = { + name: "executive_dashboard", + label: "Executive Overview", + description: "High-level revenue, customer, and pipeline KPIs for leadership", + columns: 12, + gap: 4, + refreshIntervalSeconds: 300, + // 5 minutes + header: { + showTitle: true, + showDescription: true + // Header action buttons removed: they referenced actions/routes that were + // never implemented (`export_dashboard_pdf`, `schedule_dashboard_email`, + // `customize_dashboard` are not defined anywhere), so they rendered as dead + // buttons. Re-add real, wired-up actions here if these features land. + }, + dateRange: { + field: "close_date", + defaultRange: "this_quarter", + allowCustomRange: true + }, + globalFilters: [ + { + field: "owner_id", + label: { en: "Owner", "zh-CN": "\u8D1F\u8D23\u4EBA", "es-ES": "Responsable", "ja-JP": "\u62C5\u5F53\u8005" }, + type: "lookup", + scope: "dashboard", + optionsFrom: { object: "sys_user", valueField: "id", labelField: "name" } + }, + { + field: "lead_source", + label: { en: "Lead Source", "zh-CN": "\u7EBF\u7D22\u6765\u6E90", "es-ES": "Origen del Prospecto", "ja-JP": "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9" }, + type: "select", + scope: "dashboard", + // Roster derived, wording from the language packs — see + // LEAD_SOURCE_FILTER_LABELS above. Order follows the canonical constant. + options: LEAD_SOURCE_OPTIONS.map(({ value }) => ({ + value, + label: LEAD_SOURCE_FILTER_LABELS[String(value)] + })) + } + ], + widgets: [ + // ─── Row 1: Headline KPIs ───────────────────────────────────────── + { + id: "total_revenue_ytd", + title: "Total Revenue (YTD)", + description: "Closed-won revenue this year", + type: "metric", + filter: { stage: "closed_won", close_date: { $gte: "{current_year_start}" } }, + // Self-scoped to YTD; without this the injected dashboard dateRange + // (default this_quarter) is ANDed in and the tile shows quarter revenue. + filterBindings: { dateRange: false }, + dataset: "opportunity_metrics", + values: ["total_amount"], + layout: { x: 0, y: 0, w: 3, h: 2 } + }, + { + id: "total_accounts", + title: "Active Accounts", + description: "Customers with at least one active relationship", + type: "metric", + filter: { is_active: true }, + // crm_account has neither `close_date` nor `lead_source`; opt this widget + // out of both dashboard filters bound to those fields. ObjectStack 15 + // (framework#2501) injects every dashboard filter (dateRange + globalFilters) + // into each widget's query, so a widget on an object lacking a filter field + // fails with `no such column`. crm_account DOES have `owner_id` (injected + // into every business object, #548), so the owner filter is left to apply. + filterBindings: { dateRange: false, lead_source: false }, + dataset: "account_metrics", + values: ["account_count"], + layout: { x: 3, y: 0, w: 3, h: 2 } + }, + { + id: "total_contacts", + title: "Total Contacts", + description: "People in our address book", + type: "metric", + filterBindings: { dateRange: false }, + // crm_contact has no close_date — opt out of the date picker + dataset: "contact_metrics", + values: ["contact_count"], + layout: { x: 6, y: 0, w: 3, h: 2 } + }, + { + id: "open_leads", + title: "Open Leads", + description: "Unconverted leads in the funnel", + type: "metric", + filter: { is_converted: false }, + filterBindings: { dateRange: false }, + // crm_lead has no close_date — opt out of the date picker + dataset: "lead_metrics", + values: ["lead_count"], + layout: { x: 9, y: 0, w: 3, h: 2 } + }, + // ─── Row 2: Revenue Analysis ────────────────────────────────────── + { + id: "revenue_trend", + title: "Revenue Trend", + description: "Closed-won revenue over the last 12 months", + type: "area", + filter: { stage: "closed_won", close_date: { $gte: "{12_months_ago}" } }, + filterBindings: { dateRange: false }, + // self-scoped to 12 months — the date picker must not narrow it + dataset: "opportunity_metrics", + dimensions: ["close_date"], + values: ["total_amount"], + layout: { x: 0, y: 2, w: 8, h: 4 }, + // Default rendering is intentional: the dataset widget plots the selected + // dimension × values directly; a chartConfig would duplicate them inertly. + suppressWarnings: ["chart-config-missing"] + }, + { + id: "revenue_by_industry", + title: "Revenue by Industry", + description: "YTD closed-won revenue split by customer industry", + type: "donut", + filter: { stage: "closed_won", close_date: { $gte: "{current_year_start}" } }, + filterBindings: { dateRange: false }, + // self-scoped to YTD — the date picker must not narrow it + dataset: "opportunity_metrics", + dimensions: ["account_industry"], + values: ["total_amount"], + layout: { x: 8, y: 2, w: 4, h: 4 }, + suppressWarnings: ["chart-config-missing"] + // intentional default rendering (see revenue_trend) + }, + // ─── Row 3: Pipeline & Activity ─────────────────────────────────── + // The funnel now comes from the shared factory (#539); its remaining inert + // config lives in shared-widgets.ts and is out of this PR's scope. + pipelineByStageFunnelWidget({ x: 0, y: 6, w: 6, h: 4 }), + { + id: "new_accounts_by_month", + title: "New Accounts", + description: "Account creation cadence \u2014 last 6 months", + type: "bar", + filter: { created_at: { $gte: "{6_months_ago}" } }, + filterBindings: { dateRange: false, lead_source: false }, + // crm_account has no close_date/lead_source; scopes itself by created_at + dataset: "account_metrics", + dimensions: ["created_at"], + values: ["account_count"], + layout: { x: 6, y: 6, w: 6, h: 4 }, + suppressWarnings: ["chart-config-missing"] + // intentional default rendering (see revenue_trend) + }, + // ─── Row 4: Revenue by Industry ─────────────────────────────────── + // A dashboard `table` binds to an analytics cube, so it aggregates rather + // than listing raw accounts (ADR-0021). The previous "Top Accounts by + // Revenue" table selected only the `account_count` measure with no + // dimension — a single summary row, not a customer ranking. Grouping by + // industry gives a real multi-row breakdown of book-of-business by sector; + // for a per-account list, use an object-bound ListView (ADR-0017). + // Column headers and number formats come from the dataset's dimension and + // measure metadata. + { + id: "accounts_by_industry", + title: "Accounts by Industry", + description: "Total annual revenue and account count per industry", + type: "table", + filterBindings: { dateRange: false, lead_source: false }, + // crm_account has no close_date/lead_source — opt out of both + dataset: "account_metrics", + dimensions: ["industry"], + values: ["annual_revenue_sum", "account_count"], + layout: { x: 0, y: 10, w: 12, h: 4 } + } + ] +}; + +// src/sales/dashboards/sales.dashboard.ts +var SalesDashboard = { + name: "sales_dashboard", + label: "Sales Performance", + description: "Pipeline analytics, win rate trends, and rep performance", + columns: 12, + gap: 4, + refreshIntervalSeconds: 180, + // 3 minutes + header: { + showTitle: true, + // Keep the opening KPI row in the first viewport for a live demo. The + // description remains available in dashboard metadata and translations. + showDescription: false + // Header action buttons removed: `create_opportunity` / `export_dashboard_pdf` + // are not defined actions, and `/reports/forecast` matches no report route — + // all three were dead. Re-add real, wired-up actions here when available. + }, + dateRange: { + field: "close_date", + defaultRange: "this_quarter", + allowCustomRange: true + }, + globalFilters: [ + { + field: "owner_id", + label: { en: "Sales Rep", "zh-CN": "\u9500\u552E\u4EE3\u8868", "es-ES": "Representante de Ventas", "ja-JP": "\u55B6\u696D\u62C5\u5F53\u8005" }, + type: "lookup", + scope: "dashboard", + optionsFrom: { object: "sys_user", valueField: "id", labelField: "name" } + }, + { + field: "type", + label: { en: "Deal Type", "zh-CN": "\u5546\u673A\u7C7B\u578B", "es-ES": "Tipo de Oportunidad", "ja-JP": "\u5546\u8AC7\u30BF\u30A4\u30D7" }, + type: "select", + scope: "dashboard", + options: [ + { value: "new_business", label: { en: "New Business", "zh-CN": "\u65B0\u4E1A\u52A1", "es-ES": "Nuevo Negocio", "ja-JP": "\u65B0\u898F\u30D3\u30B8\u30CD\u30B9" } }, + { value: "existing_upgrade", label: { en: "Existing Customer - Upgrade", "zh-CN": "\u8001\u5BA2\u6237\u5347\u7EA7", "es-ES": "Cliente Existente - Mejora", "ja-JP": "\u65E2\u5B58\u9867\u5BA2 - \u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9" } }, + { value: "existing_renewal", label: { en: "Existing Customer - Renewal", "zh-CN": "\u8001\u5BA2\u6237\u7EED\u7EA6", "es-ES": "Cliente Existente - Renovaci\xF3n", "ja-JP": "\u65E2\u5B58\u9867\u5BA2 - \u66F4\u65B0" } }, + { value: "existing_expansion", label: { en: "Existing Customer - Expansion", "zh-CN": "\u8001\u5BA2\u6237\u62D3\u5C55", "es-ES": "Cliente Existente - Expansi\xF3n", "ja-JP": "\u65E2\u5B58\u9867\u5BA2 - \u62E1\u5927" } } + ] + } + ], + widgets: [ + // ─── Row 1: Pipeline KPIs ───────────────────────────────────────── + { + id: "total_pipeline_value", + title: "Total Pipeline", + description: "Sum of open opportunity value", + type: "metric", + filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, + colorVariant: "blue", + dataset: "opportunity_metrics", + values: ["total_amount"], + layout: { x: 0, y: 0, w: 3, h: 2 } + }, + { + id: "closed_won_qtd", + title: "Closed Won (QTD)", + description: "Revenue closed this quarter", + type: "metric", + filter: { stage: "closed_won", close_date: { $gte: "{current_quarter_start}" } }, + filterBindings: { dateRange: false }, + // self-scoped to QTD — the date picker must not re-window it + colorVariant: "success", + dataset: "opportunity_metrics", + values: ["total_amount"], + layout: { x: 3, y: 0, w: 3, h: 2 } + }, + { + id: "open_opportunities", + title: "Open Opportunities", + description: "Active deals in flight", + type: "metric", + filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, + colorVariant: "orange", + dataset: "opportunity_metrics", + values: ["opp_count"], + layout: { x: 6, y: 0, w: 3, h: 2 } + }, + avgDealSizeMetricWidget({ x: 9, y: 0, w: 3, h: 2 }, { + description: "Average value of closed-won deals this quarter", + filter: { stage: "closed_won", close_date: { $gte: "{current_quarter_start}" } }, + filterBindings: { dateRange: false }, + // self-scoped to QTD — the date picker must not re-window it + colorVariant: "purple" + }), + // ─── Row 2: Win / Loss KPIs ─────────────────────────────────────── + // + // The ratio and its two inputs sit side by side ON PURPOSE (#593). A win + // rate is the failure mode #614 shipped: a wrong denominator raises no + // error, it just prints a plausible percentage. Showing "62%" next to + // "8 won" and "5 lost" means a reader can check the arithmetic at a + // glance, and a half that silently loses its filter stops being invisible. + // + // All three windows are the same self-scoped 12 months (`dateRange: false` + // so the header's date picker cannot re-window one of them and not the + // others — three tiles over three different windows would be worse than + // no tiles at all). + { + // NOTE: no `stage` filter here, and that is deliberate. Both halves of + // the ratio come from the DATASET's own measure filters — `won_count` + // over closed_won, `decided_count` over closed_won + closed_lost — so + // open pipeline is excluded by the measures. A widget-level + // `stage: {$in: [...]}` filter would narrow numerator and denominator + // alike, which is how a ratio quietly becomes a division by itself. + id: "win_rate_12m", + title: "Win Rate (12M)", + description: "Deals won as a share of all deals settled in the last 12 months", + type: "metric", + filter: { close_date: { $gte: "{12_months_ago}" } }, + filterBindings: { dateRange: false }, + colorVariant: "success", + dataset: "opportunity_metrics", + values: ["win_rate"], + layout: { x: 0, y: 2, w: 4, h: 2 } + }, + { + id: "won_deals_12m", + title: "Deals Won (12M)", + description: "The numerator of the win rate", + type: "metric", + filter: { close_date: { $gte: "{12_months_ago}" } }, + filterBindings: { dateRange: false }, + colorVariant: "blue", + dataset: "opportunity_metrics", + values: ["won_count"], + layout: { x: 4, y: 2, w: 4, h: 2 } + }, + { + id: "lost_deals_12m", + title: "Deals Lost (12M)", + description: "The other half of the win-rate denominator", + type: "metric", + filter: { close_date: { $gte: "{12_months_ago}" } }, + filterBindings: { dateRange: false }, + colorVariant: "orange", + dataset: "opportunity_metrics", + values: ["lost_count"], + layout: { x: 8, y: 2, w: 4, h: 2 } + }, + // ─── Row 3: Pipeline & Trends ───────────────────────────────────── + pipelineByStageFunnelWidget({ x: 0, y: 4, w: 6, h: 4 }), + { + id: "monthly_revenue_trend", + title: "Monthly Revenue Trend", + description: "Closed-won revenue, last 12 months", + type: "area", + filter: { stage: "closed_won", close_date: { $gte: "{12_months_ago}" } }, + filterBindings: { dateRange: false }, + // self-scoped to 12 months — the date picker must not narrow it + colorVariant: "success", + dataset: "opportunity_metrics", + dimensions: ["close_date"], + values: ["total_amount"], + layout: { x: 6, y: 4, w: 6, h: 4 }, + chartConfig: { + showLegend: false, + showDataLabels: false, + colors: ["#10B981"], + // No quota annotation line: ChartAnnotationSchema only takes a STATIC + // value, and the real quotas live per-owner/per-period in + // crm_forecast.quota (seeded 500k–1.5M — the old hardcoded 100000 was + // fiction). Quota vs. actual is the quota_attainment_by_rep table + // below, bound to the forecast_metrics dataset. + interaction: { tooltips: true, brush: true } + }, + options: { dateGranularity: "month" } + }, + // ─── Row 4: Performance Breakdown ───────────────────────────────── + { + id: "pipeline_by_forecast_category", + title: "Pipeline by Forecast Category", + description: "Open pipeline grouped by sales forecast category", + type: "horizontal-bar", + filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, + colorVariant: "blue", + dataset: "opportunity_metrics", + dimensions: ["forecast_category"], + values: ["total_amount"], + layout: { x: 0, y: 8, w: 6, h: 4 }, + chartConfig: { + showLegend: false, + showDataLabels: true, + colors: ["#4F46E5"] + } + }, + { + id: "lead_source_breakdown", + title: "Lead Source", + description: "Where our pipeline is coming from", + type: "donut", + filter: { stage: { $nin: ["closed_lost"] } }, + colorVariant: "purple", + dataset: "opportunity_metrics", + dimensions: ["lead_source"], + values: ["total_amount"], + layout: { x: 6, y: 8, w: 6, h: 4 }, + chartConfig: { + showLegend: true, + showDataLabels: true, + colors: ["#4F46E5", "#06B6D4", "#10B981", "#F59E0B", "#EF4444", "#8B5CF6"] + } + }, + // ─── Row 5: Rep Leaderboard ─────────────────────────────────────── + // A dashboard `table` binds to an analytics cube and aggregates; it cannot + // list raw deals (ADR-0021). The previous "Top Open Opportunities" table + // selected only `opp_count` with no dimension — one summary row, not a deal + // ranking. Grouping open pipeline by owner yields a rep leaderboard (one + // row per rep). For a per-deal list, surface an object-bound ListView + // through app navigation (ADR-0017). + { + id: "open_pipeline_by_owner", + title: "Open Pipeline by Owner", + description: "In-flight pipeline value, deal count and avg win probability per rep", + type: "table", + filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, + colorVariant: "default", + dataset: "opportunity_metrics", + dimensions: ["owner"], + values: ["total_amount", "opp_count", "avg_probability"], + layout: { x: 0, y: 12, w: 12, h: 4 }, + options: { + sortBy: "total_amount", + sortOrder: "desc", + limit: 10 + } + }, + // ─── Row 6: Quota Attainment ────────────────────────────────────── + // The real per-rep quota data (crm_forecast.quota) surfaced as a table: + // dashboard chart annotations cannot reference a dataset (static values + // only), so quota vs. actual gets its own widget instead of a fake line. + { + id: "quota_attainment_by_rep", + title: "Quota Attainment by Rep", + description: "Current-quarter quota, closed revenue and attainment per rep, from forecast snapshots", + type: "table", + colorVariant: "default", + // crm_forecast has neither `close_date` nor `type`; opt out of the + // dashboard filters bound to those fields (framework#2501 injects every + // dashboard filter into each widget query). `owner` exists and applies. + filterBindings: { dateRange: false, type: false }, + // ONE period, or the numbers are nonsense (#614). `crm_forecast` holds a + // row per owner PER PERIOD, and `quota_sum` / `closed_sum` are plain + // `sum` measures — so an unpinned query adds this quarter's quota to this + // month's quota to every settled quarter's quota and labels the total + // "Quota". On the shipped seeds that turned a rep's real 1,500,000 + // quarterly quota into 7,940,000, with attainment wrong by the same + // construction (89% instead of 55%). + // + // Both halves of the key are needed. `period: 'quarter'` alone still sums + // every quarter ever snapshotted; `period_start` alone still merges the + // quarter row with the month row that opens the same quarter (Q3 and July + // both start on the 1st). Together they name exactly one snapshot per + // owner — the same (owner, period, period_start) tuple the snapshot sweep + // upserts on and the object indexes. + // + // `{current_quarter_start}` is resolved by the ANALYTICS path, verified + // rather than assumed: `queryDataset` runs both the dataset filter and the + // widget's `runtimeFilter` through `resolveFilterTokens`, which + // understands `{(current|last|next)_(week|month|quarter|year)_(start|end)}` + // and throws `FILTER_TOKEN_UNKNOWN` on anything else. + // + // The LIST path resolves the same macros, and has since 17.0.0-rc.0: + // `resolveFilterTokens()` was wired into the ObjectQL READ path (objectql + // `feat(filters): evaluate {filter-token} placeholders server-side`, + // #3582) ahead of the middleware chain, covering `find` / `findOne` / + // `count` / `aggregate` — the one gate every server-side read passes + // through, saved-view filters included. So this widget's filter and a + // saved view's filter now read the same way, and the sibling + // `this_quarter_forecasts` in `src/sales/views/forecast.view.ts` pins this same + // quarter with this same macro. Measured, not inferred: + // `test/forecast-current-quarter-view.test.ts` runs both filter shapes — + // the `period_start` equality (#730) and the `close_date` range (#743) — + // through a real engine and pins a three-way outcome (current quarter + // only: not zero rows, not every quarter). First taken on 17.0.0-rc.2; + // RE-RUN 2026-09-03 on 17.2.0 (#1467), RE-RUN on 17.3.0 (#1676, the PR + // #1577 pin) and RE-RUN again on 17.4.0 (PR #1814, #1807) — green all + // four times, so the outcome held on every pin it was taken on, not + // only the first. Not yet re-run on 17.5.0. + // + // What stood here before described the two paths as asymmetric and told + // the next author not to generalise between them. That was true on + // @objectstack 16.1.0 and expired at rc.0 (#744). + // + // Cost of pinning to the CURRENT quarter rather than the latest one: for + // the few hours between a quarter boundary and the 03:00 sweep that opens + // the new row, the table is empty. Empty is the honest state — the + // alternative renders last quarter's attainment under a header that says + // this one. + filter: { period: "quarter", period_start: "{current_quarter_start}" }, + dataset: "forecast_metrics", + dimensions: ["owner"], + values: ["quota_sum", "closed_sum", "attainment"], + layout: { x: 0, y: 16, w: 12, h: 4 }, + options: { + sortBy: "attainment", + sortOrder: "desc", + limit: 10 + } + }, + // ─── Row 7: Win / Loss analysis ─────────────────────────────────── + // + // Three widgets over the settled half of the pipeline (#593). Each of the + // two win-rate breakdowns is a TABLE, not a bar chart, and that is the + // whole design: a bar of "67%" is unfalsifiable, whereas a row reading + // "Won 2 · Lost 1 · Settled 3 · 67%" carries its own proof. Perturb either + // half — win a deal that was lost, or lose one that was won — and three of + // those four numbers move. `test/win-loss-capture.test.ts` does exactly + // that against the real dataset executor and the real seeds. + // + // Both tables opt out of the header's `close_date` window + // (`dateRange: false`) for the reason the quota table does: a win rate over + // "this quarter" on a demo database is computed from whichever one or two + // deals happen to have settled inside it, which is noise wearing the + // costume of a KPI. Twelve months is the same window the row-2 tiles and + // the revenue trend use, so the dashboard tells one consistent story. + { + id: "win_rate_by_owner", + title: "Win / Loss by Rep", + description: "Deals won, deals lost and win rate per rep \u2014 last 12 months", + type: "table", + filter: { close_date: { $gte: "{12_months_ago}" } }, + filterBindings: { dateRange: false }, + colorVariant: "default", + dataset: "opportunity_metrics", + dimensions: ["owner"], + values: ["won_count", "lost_count", "decided_count", "win_rate", "won_amount"], + layout: { x: 0, y: 20, w: 6, h: 4 }, + options: { + sortBy: "decided_count", + sortOrder: "desc", + limit: 10 + } + }, + { + id: "win_rate_by_lead_source", + title: "Win / Loss by Lead Source", + description: "Which sources produce deals that actually close \u2014 last 12 months", + type: "table", + filter: { close_date: { $gte: "{12_months_ago}" } }, + filterBindings: { dateRange: false }, + colorVariant: "default", + dataset: "opportunity_metrics", + dimensions: ["lead_source"], + values: ["won_count", "lost_count", "decided_count", "win_rate", "won_amount"], + layout: { x: 6, y: 20, w: 6, h: 4 }, + options: { + sortBy: "decided_count", + sortOrder: "desc", + limit: 12 + } + }, + { + // The loss-reason breakdown the fields were declared for and never got. + // + // `loss_reason` is mandatory on every `closed_lost` record (see + // crm_opportunity), so this chart has no "unattributed" slice to + // apologise for — an empty chart here means no losses in the window, + // never "nobody filled the field in". + // + // Counts, not amounts: the question a loss review asks is "how often did + // we lose for this reason", and one large lost deal should not outweigh + // five recurring feature gaps. `lost_amount` is declared on the dataset + // for the revenue view of the same question. + id: "loss_reason_breakdown", + title: "Why We Lose", + description: "Lost deals by reason \u2014 last 12 months", + type: "donut", + filter: { stage: "closed_lost", close_date: { $gte: "{12_months_ago}" } }, + filterBindings: { dateRange: false }, + colorVariant: "orange", + dataset: "opportunity_metrics", + dimensions: ["loss_reason"], + values: ["opp_count"], + layout: { x: 0, y: 24, w: 12, h: 4 }, + chartConfig: { + showLegend: true, + showDataLabels: true, + colors: ["#EF4444", "#F59E0B", "#8B5CF6", "#06B6D4", "#4F46E5", "#10B981", "#64748B"] + } + }, + // ─── Row 9: Pivot — Stage × Lead Source ─────────────────────────── + { + id: "pipeline_stage_by_source", + title: "Pipeline by Stage \xD7 Lead Source", + description: "Cross-tab of open opportunity amount by stage and source", + type: "pivot", + filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, + colorVariant: "default", + dataset: "opportunity_metrics", + dimensions: ["stage", "lead_source"], + values: ["total_amount"], + layout: { x: 0, y: 28, w: 12, h: 4 } + } + ] +}; + +// src/sales/datasets/index.ts +var datasets_exports = {}; +__export(datasets_exports, { + AccountDataset: () => AccountDataset, + ContactDataset: () => ContactDataset, + EventDataset: () => EventDataset, + ForecastDataset: () => ForecastDataset, + LeadDataset: () => LeadDataset, + OpportunityDataset: () => OpportunityDataset, + TaskDataset: () => TaskDataset +}); + +// src/sales/datasets/opportunity.dataset.ts +import { defineDataset as defineDataset2 } from "@objectstack/spec/ui"; +var OpportunityDataset = defineDataset2({ + name: "opportunity_metrics", + label: "Opportunity Metrics", + description: "Semantic layer for sales-pipeline counts and amounts", + object: "crm_opportunity", + // Include the account relationship so dimensions can traverse it (the join is + // derived from the `crm_account` lookup — no hand-written ON clause). + include: ["crm_account"], + dimensions: [ + { name: "stage", label: "Stage", field: "stage", type: "string" }, + { name: "lead_source", label: "Lead Source", field: "lead_source", type: "string" }, + { name: "forecast_category", label: "Forecast Category", field: "forecast_category", type: "string" }, + { name: "type", label: "Deal Type", field: "type", type: "string" }, + // Semantic name `owner`; column `owner_id`, the platform anchor (#548). + { name: "owner", label: "Owner", field: "owner_id", type: "lookup" }, + // Win/loss attribution (#593). Both columns are now mandatory at close + // (`requiredWhen` on crm_opportunity), so grouping by either one over + // settled deals has no "unattributed" bucket to explain away. + { name: "win_reason", label: "Win Reason", field: "win_reason", type: "string" }, + { name: "loss_reason", label: "Loss Reason", field: "loss_reason", type: "string" }, + // v17 fixes scoped aggregate execution and SQLite's epoch bucketing. + // Trends and quarter coverage need different buckets over the same field, + // so each one is its own semantic dimension. + { name: "close_date", label: "Close Date", field: "close_date", type: "date", dateGranularity: "month" }, + { name: "close_quarter", label: "Close Quarter", field: "close_date", type: "date", dateGranularity: "quarter" }, + // Cross-object dimension: account industry via the crm_account relationship. + { name: "account_industry", label: "Account Industry", field: "crm_account.industry", type: "string" } + ], + measures: [ + { name: "opp_count", label: "Opportunities", aggregate: "count" }, + { name: "total_amount", label: "Total Amount", aggregate: "sum", field: "amount", format: "0,0" }, + { name: "avg_amount", label: "Avg Deal Size", aggregate: "avg", field: "amount", format: "0,0" }, + { name: "avg_probability", label: "Avg Probability", aggregate: "avg", field: "probability", format: "0%" }, + // ─── Win rate (#593) ──────────────────────────────────────────────── + // + // A ratio is the most dangerous kind of measure: a wrong denominator does + // not error, it returns a plausible number (#614 rendered a 1,500,000 + // quota as 7,940,000 because a filter was missing one of its two halves). + // So the two halves are declared here, ONCE, as named measures — not + // improvised per widget — and every widget that shows `win_rate` also + // shows `won_count` and `lost_count` beside it, so the reader can check + // the arithmetic that produced the percentage. + // + // Each carries its OWN `filter`, which the executor honours by running + // that measure as its own sub-query and merging the result back on the + // selected dimensions. That is what lets one widget row hold "won 2, lost + // 1, 67%" — the counts are over different row sets, and only a + // measure-level filter can say so. A widget-level `filter` cannot: it + // narrows the whole row set at once, which is exactly how you end up + // dividing a number by itself. + // + // `decided_count` is deliberately its own filtered count and NOT + // `derived: { op: 'sum', of: ['won_count', 'lost_count'] }`. Measured on + // 17.0.0-rc.1: a filtered measure contributes NO row for a group its + // filter selects nothing in — the count comes back absent, not 0 — and a + // derived measure over an absent input evaluates to null. Summing the two + // would therefore blank the win rate of any rep who has never lost a deal + // (100%, the group you least want to hide). Counting the union directly + // keeps the denominator present whenever the group has any settled deal at + // all. The remaining asymmetry — a group with losses but NO wins reports a + // null win rate rather than 0% — is a platform behaviour, not something a + // widget can paper over; it is pinned by `test/win-loss-capture.test.ts` + // and filed as #656. The tables show `lost_count` next to `win_rate` + // precisely so that a blank rate reads as "0 wins out of 3", not as + // "no data". + { name: "won_count", label: "Won Deals", aggregate: "count", filter: { stage: "closed_won" } }, + { name: "lost_count", label: "Lost Deals", aggregate: "count", filter: { stage: "closed_lost" } }, + { + name: "decided_count", + label: "Settled Deals", + aggregate: "count", + filter: { stage: { $in: ["closed_won", "closed_lost"] } } + }, + { name: "won_amount", label: "Won Revenue", aggregate: "sum", field: "amount", filter: { stage: "closed_won" }, format: "0,0" }, + { name: "lost_amount", label: "Lost Revenue", aggregate: "sum", field: "amount", filter: { stage: "closed_lost" }, format: "0,0" }, + { name: "win_rate", label: "Win Rate", derived: { op: "ratio", of: ["won_count", "decided_count"] }, format: "0%" } + ] +}); + +// src/sales/datasets/account.dataset.ts +import { defineDataset as defineDataset3 } from "@objectstack/spec/ui"; +var AccountDataset = defineDataset3({ + name: "account_metrics", + label: "Account Metrics", + description: "Semantic layer for account counts by industry / type", + object: "crm_account", + dimensions: [ + { name: "industry", label: "Industry", field: "industry", type: "string" }, + { name: "type", label: "Type", field: "type", type: "string" }, + { name: "created_at", label: "Created", field: "created_at", type: "date", dateGranularity: "month" } + ], + measures: [ + { name: "account_count", label: "Accounts", aggregate: "count" }, + { name: "annual_revenue_sum", label: "Annual Revenue", aggregate: "sum", field: "annual_revenue", format: "0,0" } + ] +}); + +// src/sales/datasets/contact.dataset.ts +import { defineDataset as defineDataset4 } from "@objectstack/spec/ui"; +var ContactDataset = defineDataset4({ + name: "contact_metrics", + label: "Contact Metrics", + description: "Semantic layer for contact counts", + object: "crm_contact", + dimensions: [], + measures: [{ name: "contact_count", label: "Contacts", aggregate: "count" }] +}); + +// src/sales/datasets/lead.dataset.ts +import { defineDataset as defineDataset5 } from "@objectstack/spec/ui"; +var LeadDataset = defineDataset5({ + name: "lead_metrics", + label: "Lead Metrics", + description: "Semantic layer for lead counts", + object: "crm_lead", + dimensions: [ + { name: "status", label: "Status", field: "status", type: "string" }, + { name: "lead_source", label: "Source", field: "lead_source", type: "string" }, + { name: "created_at", label: "Created", field: "created_at", type: "date" }, + { name: "last_contacted_date", label: "Last Contacted", field: "last_contacted_date", type: "date", dateGranularity: "month" } + ], + measures: [{ name: "lead_count", label: "Leads", aggregate: "count" }] +}); + +// src/sales/datasets/task.dataset.ts +import { defineDataset as defineDataset6 } from "@objectstack/spec/ui"; +var TaskDataset = defineDataset6({ + name: "task_metrics", + label: "Task Metrics", + description: "Semantic layer for task workload and completion", + object: "crm_task", + dimensions: [ + { name: "status", label: "Status", field: "status", type: "string" }, + { name: "priority", label: "Priority", field: "priority", type: "string" }, + { name: "priority_rank", label: "Urgency", field: "priority_rank", type: "number" }, + { name: "type", label: "Type", field: "type", type: "string" }, + { name: "due_date", label: "Due Date", field: "due_date", type: "date" }, + { name: "is_overdue", label: "Overdue", field: "is_overdue", type: "boolean" }, + { name: "is_completed", label: "Completed", field: "is_completed", type: "boolean" } + ], + measures: [ + { name: "task_count", label: "Tasks", aggregate: "count" }, + { name: "avg_progress", label: "Avg Progress", aggregate: "avg", field: "progress_percent", format: "0.0%" } + ] +}); + +// src/sales/datasets/event.dataset.ts +import { defineDataset as defineDataset7 } from "@objectstack/spec/ui"; +var EventDataset = defineDataset7({ + name: "event_metrics", + label: "Activity Metrics", + description: "Semantic layer for meetings, calls and interaction recency", + object: "crm_event", + dimensions: [ + { name: "type", label: "Activity Type", field: "type", type: "string" }, + { name: "status", label: "Status", field: "status", type: "string" }, + // `owner` is the SEMANTIC name every widget/report selects by; the column + // behind it is the platform ownership anchor `owner_id` (#548). + { name: "owner", label: "Owner", field: "owner_id", type: "string" }, + { name: "related_to_type", label: "Related To", field: "related_to_type", type: "string" }, + { + name: "start_datetime", + label: "Activity Week", + field: "start_datetime", + type: "date", + dateGranularity: "week" + } + ], + measures: [ + { name: "event_count", label: "Activities", aggregate: "count" }, + { + name: "total_minutes", + label: "Minutes", + aggregate: "sum", + field: "duration_minutes", + format: "0,0" + }, + { + name: "avg_minutes", + label: "Avg Duration", + aggregate: "avg", + field: "duration_minutes", + format: "0,0" + } + ] +}); + +// src/sales/datasets/forecast.dataset.ts +import { defineDataset as defineDataset8 } from "@objectstack/spec/ui"; +var ForecastDataset = defineDataset8({ + name: "forecast_metrics", + label: "Forecast Metrics", + description: "Semantic layer for per-owner quota, attainment and pipeline coverage", + object: "crm_forecast", + dimensions: [ + // Semantic name `owner`; column `owner_id`, the platform anchor (#548). + { name: "owner", label: "Owner", field: "owner_id", type: "lookup" }, + { name: "period", label: "Period Type", field: "period", type: "string" }, + { name: "period_label", label: "Period", field: "period_label", type: "string" }, + { name: "period_start", label: "Period Start", field: "period_start", type: "date" } + ], + measures: [ + { name: "quota_sum", label: "Quota", aggregate: "sum", field: "quota", format: "0,0" }, + { name: "closed_sum", label: "Closed", aggregate: "sum", field: "closed_amount", format: "0,0" }, + { name: "pipeline_sum", label: "Pipeline", aggregate: "sum", field: "pipeline_amount", format: "0,0" }, + { name: "commit_sum", label: "Commit", aggregate: "sum", field: "commit_amount", format: "0,0" }, + // Derived ratio (ADR-0021 Q1) rather than avg(attainment_pct): summing + // closed and quota before dividing weights every rep/period by quota + // size, where an average of per-row percentages would not. + { name: "attainment", label: "Attainment", derived: { op: "ratio", of: ["closed_sum", "quota_sum"] }, format: "0%" } + ] +}); + +// src/revenue/datasets/index.ts +var datasets_exports2 = {}; +__export(datasets_exports2, { + ProductDataset: () => ProductDataset +}); + +// src/revenue/datasets/product.dataset.ts +import { defineDataset as defineDataset9 } from "@objectstack/spec/ui"; +var ProductDataset = defineDataset9({ + name: "product_metrics", + label: "Product Metrics", + description: "Semantic layer for product catalog counts and list price", + object: "crm_product", + dimensions: [ + { name: "category", label: "Category", field: "category", type: "string" } + ], + measures: [ + { name: "product_count", label: "Products", aggregate: "count" }, + { name: "list_price_sum", label: "Total List Price", aggregate: "sum", field: "list_price", format: "0,0" } + ] +}); + +// src/sales/reports/index.ts +var reports_exports = {}; +__export(reports_exports, { + AccountsByIndustryTypeReport: () => AccountsByIndustryTypeReport, + CustomerChurnSignalsReport: () => CustomerChurnSignalsReport, + LeadInflowByMonthSourceReport: () => LeadInflowByMonthSourceReport, + OpportunitiesByStageReport: () => OpportunitiesByStageReport, + OpportunityFunnelByOwnerStageReport: () => OpportunityFunnelByOwnerStageReport, + PipelineCoverageByQuarterReport: () => PipelineCoverageByQuarterReport, + WonOpportunitiesByOwnerReport: () => WonOpportunitiesByOwnerReport +}); + +// src/sales/reports/account.report.ts +var AccountsByIndustryTypeReport = { + name: "accounts_by_industry_type", + label: "Accounts by Industry and Type", + description: "Matrix report showing accounts by industry and type", + dataset: "account_metrics", + rows: ["industry"], + columns: ["type"], + values: ["account_count", "annual_revenue_sum"], + type: "matrix", + runtimeFilter: { is_active: true } +}; + +// src/sales/reports/lead.report.ts +var LeadInflowByMonthSourceReport = { + name: "lead_inflow_by_month_source", + label: "Lead Engagement by Month \xD7 Source", + description: "Contacted-lead volume per month, broken down by acquisition channel", + dataset: "lead_metrics", + rows: ["lead_source"], + columns: ["last_contacted_date"], + values: ["lead_count"], + type: "matrix", + // A never-contacted lead has no engagement month, and grouping it produced a + // headerless '—' column next to the real ones. This report counts CONTACTED + // leads (see the label/description), so the empty bucket is excluded at the + // source rather than rendered as a mystery column. + runtimeFilter: { last_contacted_date: { $ne: null } } +}; + +// src/sales/reports/opportunity.report.ts +var OpportunitiesByStageReport = { + name: "opportunities_by_stage", + label: "Opportunities by Stage", + description: "Summary of opportunities grouped by stage", + dataset: "opportunity_metrics", + rows: ["stage"], + values: ["total_amount", "avg_probability"], + type: "summary", + // `{current_year_start}` is a spec date macro (DATE_MACRO_TOKENS) resolved + // per-query, so the YTD window rolls with time instead of freezing the year + // the artifact was built into dist/objectstack.json. + runtimeFilter: { stage: { $ne: "closed_lost" }, close_date: { $gte: "{current_year_start}" } }, + chart: { type: "bar", title: "Pipeline by Stage", showLegend: true, xAxis: "stage", yAxis: "total_amount" } +}; +var WonOpportunitiesByOwnerReport = { + name: "won_opportunities_by_owner", + label: "Won Opportunities by Owner", + description: "Closed won opportunities grouped by owner", + dataset: "opportunity_metrics", + rows: ["owner"], + values: ["total_amount"], + type: "summary", + runtimeFilter: { stage: "closed_won" }, + chart: { type: "column", title: "Revenue by Sales Rep", showLegend: false, xAxis: "owner", yAxis: "total_amount" } +}; +var PipelineCoverageByQuarterReport = { + name: "pipeline_coverage_by_quarter", + label: "Pipeline Coverage by Forecast \xD7 Quarter", + description: "Open pipeline amount by forecast category, bucketed by close quarter", + dataset: "opportunity_metrics", + rows: ["forecast_category"], + columns: ["close_quarter"], + values: ["total_amount", "opp_count"], + type: "matrix", + runtimeFilter: { stage: { $nin: ["closed_won", "closed_lost"] } } +}; +var OpportunityFunnelByOwnerStageReport = { + name: "opportunity_funnel_owner_stage", + label: "Opportunity Funnel by Owner \u2192 Stage", + description: "Per-rep stage-by-stage pipeline funnel", + dataset: "opportunity_metrics", + rows: ["owner", "stage"], + values: ["total_amount", "opp_count", "avg_probability"], + type: "summary", + runtimeFilter: { stage: { $ne: "closed_lost" } }, + chart: { type: "funnel", title: "Pipeline Funnel", showLegend: false, xAxis: "stage", yAxis: "total_amount" } +}; + +// src/sales/reports/churn.report.ts +var CustomerChurnSignalsReport = { + name: "customer_churn_signals", + label: "Customer Churn Signals", + description: "Three-panel early-warning view: at-risk customers, silent high-value accounts, and recently-lost opportunities.", + type: "joined", + blocks: [ + { + // Named for the ACTOR, not the value, because `at_risk` is also a + // `health_score` option and `at_risk_accounts` is already the block + // below (a time window, nothing to do with the field). The two are + // allowed to overlap: this one asks "who did a human flag", that one + // asks "whose clock stopped". + name: "csm_flagged_accounts", + label: "CSM-Flagged Accounts", + description: "Accounts a CSM has hand-flagged as at-risk or churning, grouped by type \u2014 human judgement, independent of the activity clock.", + type: "summary", + dataset: "account_metrics", + rows: ["type"], + values: ["account_count"], + // No date term on purpose (see the header). `is_active` matches the two + // account blocks below: a deactivated account has already churned, so it + // is not a retention queue item. Grouping by `type` separates a flagged + // CUSTOMER (revenue at risk today) from a flagged prospect or partner, + // which the grid view `crm_account.at_risk_accounts` cannot show — it is + // scoped to `type: 'customer'` before anything else. + runtimeFilter: { + is_active: true, + health_score: { $in: ["at_risk", "churning"] } + } + }, + { + name: "at_risk_accounts", + label: "At-Risk Accounts", + description: "Active accounts with no activity in 60+ days, grouped by industry.", + type: "summary", + dataset: "account_metrics", + rows: ["industry"], + values: ["account_count"], + runtimeFilter: { + is_active: true, + last_activity_date: { $lt: "{60_days_ago}" } + } + }, + { + name: "silent_high_value", + label: "Silent High-Value Accounts", + description: "Strategic and enterprise accounts gone quiet for 90+ days, grouped by type.", + type: "summary", + dataset: "account_metrics", + rows: ["type"], + values: ["account_count"], + // "High-value" is the account's tier, not a revenue threshold: the + // strategic/enterprise tiers are exactly the book the CSM team owns. + runtimeFilter: { + is_active: true, + tier: { $in: ["strategic", "enterprise"] }, + last_activity_date: { $lt: "{90_days_ago}" } + } + }, + { + name: "recently_closed_lost", + label: "Recently Lost Opportunities", + description: "Opportunities closed-lost in the last 30 days \u2014 investigate before the customer fully churns.", + type: "summary", + dataset: "opportunity_metrics", + rows: ["owner"], + values: ["total_amount", "opp_count"], + runtimeFilter: { + stage: "closed_lost", + close_date: { $gte: "{30_days_ago}" } + } + } + ] +}; + +// src/sales/mappings/index.ts +var mappings_exports = {}; +__export(mappings_exports, { + AccountImportMapping: () => AccountImportMapping, + ContactImportMapping: () => ContactImportMapping, + LeadImportMapping: () => LeadImportMapping +}); + +// src/sales/mappings/account_import.mapping.ts +import { defineMapping } from "@objectstack/spec/data"; + +// src/sales/mappings/_shared.ts +var INDUSTRY_SYNONYMS = { + "SaaS": "software", + "Saas": "software", + "IT": "technology", + "Tech": "technology", + "Information Technology": "technology", + "Financial Services": "finance", + "Banking": "finance", + "Insurance": "finance", + "Health Care": "healthcare", + "Pharmaceuticals": "healthcare", + "E-commerce": "retail", + "Ecommerce": "retail", + "Consumer Goods": "retail", + "Transportation": "logistics", + "Utilities": "energy", + "Oil & Gas": "energy", + "Public Sector": "government", + "Non Profit": "nonprofit", + "Non-Profit": "nonprofit", + "NGO": "nonprofit", + "Travel & Hospitality": "hospitality" +}; +var LEAD_SOURCE_SYNONYMS = { + "Website": "web", + "Web Site": "web", + "Inbound": "web", + "Word of mouth": "referral", + "Customer Referral": "referral", + "Trade Show": "event", + "Conference": "event", + "Seminar": "webinar", + "Partner Referral": "partner", + "Google Ads": "paid_search", + "AdWords": "paid_search", + "SEM": "paid_search", + "LinkedIn": "social", + "Facebook": "social", + "X": "social", + "Twitter": "social", + "Blog": "content", + "Whitepaper": "content", + "Phone Inquiry": "cold_call", + "Outbound": "cold_call", + "Email": "email_campaign", + "Newsletter": "email_campaign" +}; +var DEPARTMENT_SYNONYMS = { + "HR": "hr" +}; + +// src/sales/mappings/account_import.mapping.ts +var AccountImportMapping = defineMapping({ + name: "crm_account_import", + label: "Account Import (CSV)", + targetObject: "crm_account", + sourceFormat: "csv", + // also accepted for .xlsx uploads — both are tabular + mode: "upsert", + upsertKey: ["name"], + fieldMapping: [ + { source: "Account Name", target: "name" }, + { + source: "Account Type", + target: "type", + transform: "map", + params: { + valueMap: { + "Client": "customer", + "Reseller": "partner", + "Churned": "former", + "Lost Customer": "former" + } + } + }, + { + source: "Industry", + target: "industry", + transform: "map", + params: { valueMap: INDUSTRY_SYNONYMS } + }, + // The account hook rejects a website that is not http(s) — keep full URLs + // in the source sheet (see `src/sales/objects/account.hook.ts`). + { source: "Website", target: "website" }, + { source: "Phone", target: "phone" }, + { source: "Annual Revenue", target: "annual_revenue" }, + { source: "Employees", target: "number_of_employees" }, + { source: "Description", target: "description" }, + // Owner resolution. VERIFIED against the platform import path + // (`packages/rest/src/import-runner.ts` → `resolveRef`): a reference cell + // is resolved against the referenced object by `id`, the field's + // `displayField`, then `name` / `title` / `label` / `full_name` / `email` / + // `username`. `sys_user` has an `email` column, so an owner-email cell + // resolves to that user's id — no separate resolution step is needed here. + // An address that matches no user FAILS the row (`reference_not_found`); + // leaving the cell BLANK is the supported fallback — the security + // middleware's insert-time stamp then makes the importing user the owner + // (the import write carries the importer's context, not `isSystem`). + // + // The target is `owner_id`, the platform ownership anchor — #548 retired + // the app-authored `owner` lookup this used to name. A resolved cell is + // therefore an ownership TRANSFER: it plants the row under someone other + // than the importer, which the #3004 guard denies unless the importing user + // holds `allowTransfer` (system_admin / sales_manager do). That is the + // intended posture — a bulk file that silently reassigns the book is + // exactly what the grant exists to gate. + { source: "Account Owner Email", target: "owner_id", transform: "lookup" }, + // Self-reference: a parent named later in the same file still resolves — + // the runner flushes buffered creates and retries once (framework#3148). + { source: "Parent Account", target: "parent_account", transform: "lookup" } + // NOT MAPPED — `billing_address` / `office_location` are structured + // (json-backed `address` / `location`) fields. A joined string is not a + // way in: the engine rejects it per row — measured, `Billing Address has an + // invalid address value: Invalid input: expected object, received string`. + // (The dry run does NOT predict that rejection; it reports the row ok. + // Framework-side, filed as objectstack-ai/objectstack#4633.) + // Address columns are therefore left out of the account template. A target + // may now name a declared PART of a compound field — `contact_import.mapping.ts` + // maps five columns into `mailing_address.street` … `.country` (#1836) — so + // adding address columns here would be a template change, not a platform gap. + ] +}); + +// src/sales/mappings/contact_import.mapping.ts +import { defineMapping as defineMapping2 } from "@objectstack/spec/data"; +var ContactImportMapping = defineMapping2({ + name: "crm_contact_import", + label: "Contact Import (CSV)", + targetObject: "crm_contact", + sourceFormat: "csv", + mode: "upsert", + upsertKey: ["email"], + fieldMapping: [ + { source: "Salutation", target: "salutation" }, + { source: "First Name", target: "first_name" }, + { source: "Last Name", target: "last_name" }, + // Required master-detail parent; resolved by account name. + { source: "Account Name", target: "crm_account", transform: "lookup" }, + { source: "Title", target: "title" }, + { + source: "Department", + target: "department", + transform: "map", + params: { valueMap: DEPARTMENT_SYNONYMS } + }, + { source: "Email", target: "email" }, + { source: "Phone", target: "phone" }, + { source: "Mobile", target: "mobile" }, + // Five template columns, one structured field: each column names a part + // of `mailing_address`, and the import assembles the parts one row maps + // into that field's single value. + { source: "Mailing Street", target: "mailing_address.street" }, + { source: "Mailing City", target: "mailing_address.city" }, + { source: "Mailing State", target: "mailing_address.state" }, + { source: "Mailing Postal Code", target: "mailing_address.postalCode" }, + { source: "Mailing Country", target: "mailing_address.country" }, + { + source: "Lead Source", + target: "lead_source", + transform: "map", + params: { valueMap: LEAD_SOURCE_SYNONYMS } + }, + { source: "Description", target: "description" }, + // Owner-email resolution, the blank-cell fallback, and why a filled cell + // needs `allowTransfer`: see the long note in `account_import.mapping.ts`. + { source: "Contact Owner Email", target: "owner_id", transform: "lookup" } + ] +}); + +// src/sales/mappings/lead_import.mapping.ts +import { defineMapping as defineMapping3 } from "@objectstack/spec/data"; +var LeadImportMapping = defineMapping3({ + name: "crm_lead_import", + label: "Lead Import (CSV)", + targetObject: "crm_lead", + sourceFormat: "csv", + mode: "upsert", + upsertKey: ["email"], + fieldMapping: [ + { source: "Salutation", target: "salutation" }, + { source: "First Name", target: "first_name" }, + { source: "Last Name", target: "last_name" }, + { source: "Company", target: "company" }, + { source: "Title", target: "title" }, + { + source: "Industry", + target: "industry", + transform: "map", + params: { valueMap: INDUSTRY_SYNONYMS } + }, + { source: "Email", target: "email" }, + { source: "Phone", target: "phone" }, + { source: "Mobile", target: "mobile" }, + { source: "Website", target: "website" }, + { + source: "Lead Status", + target: "status", + transform: "map", + params: { + valueMap: { + "Open": "new", + "Working": "contacted", + "In Progress": "contacted", + "Nurturing": "contacted", + "Disqualified": "unqualified", + "Closed - Not Converted": "unqualified" + } + } + }, + { + source: "Lead Source", + target: "lead_source", + transform: "map", + params: { valueMap: LEAD_SOURCE_SYNONYMS } + }, + { source: "Annual Revenue", target: "annual_revenue" }, + { source: "Employees", target: "number_of_employees" }, + { source: "Description", target: "description" }, + // Owner-email resolution and the `allowTransfer` gate on a filled cell: + // see the long note in `account_import.mapping.ts`. The blank-cell + // behaviour differs — see the header comment above. + { source: "Lead Owner Email", target: "owner_id", transform: "lookup" } + // NOT MAPPED — `crm_lead.address` is a structured (json-backed) `address` + // field; the import path cannot compose one from separate street/city/ + // postcode columns, and a joined string is rejected per row. Same + // reasoning, and the same measurement, as the account mapping. + ] +}); + +// src/sales/apps/index.ts +var apps_exports = {}; +__export(apps_exports, { + CrmApp: () => CrmApp +}); + +// src/sales/apps/crm.app.ts +import { App } from "@objectstack/spec/ui"; +var HOTCRM_ICON = 'data:image/svg+xml,%0A %0A %0A%0A'; +var CrmApp = App.create({ + name: "crm_enterprise", + label: "HotCRM", + icon: "briefcase", + // ADR-0063 §1/§2 — `defaultAgent` is a surface binding, not a custom-agent + // slot: the only resolvable values are the two PLATFORM agents, `ask` (data + // surface) and `build` (authoring surface). HotCRM is a data surface, so it + // binds `ask`; the app's own AI capability ships as skills (`src/*/skills/`), + // which attach to the platform agents by `surface` affinity. The app-authored + // agents this key used to name were retired in #512. + defaultAgent: "ask", + // `logo` and `favicon` are the inlined `HOTCRM_ICON` above (#2051), never a + // server path: an install serves only what the artifact carries. The console + // passes each value through untouched — `logo` as the sidebar's ``, + // `favicon` as the favicon `link.href` — and a `data:` URI renders in both. + // `primaryColor` is the icon's tile fill (#2066): the mark and the theme are one orange. + branding: { + primaryColor: "#EA580C", + logo: HOTCRM_ICON, + favicon: HOTCRM_ICON + }, + navigation: [ + // Pinned landing — single executive view, single click from launcher. + { + id: "nav_home", + type: "dashboard", + dashboardName: "executive_dashboard", + label: "Home", + icon: "home" + }, + { + id: "group_sales", + type: "group", + label: "Sales", + icon: "chart-line", + expanded: true, + children: [ + { id: "nav_lead", type: "object", objectName: "crm_lead", label: "Leads", icon: "user-plus" }, + { id: "nav_account", type: "object", objectName: "crm_account", label: "Accounts", icon: "building" }, + // ADR-0047 interface page — the curated counterpart to the Accounts + // object entry (quick filters only; activates with spec > 9.2.0). + { id: "nav_account_workbench", type: "page", pageName: "account_workbench", label: "Account Workbench", icon: "sliders-horizontal" }, + { id: "nav_contact", type: "object", objectName: "crm_contact", label: "Contacts", icon: "user" }, + // No separate "Pipeline" entry: the kanban board is another tab on + // this same list page — `pipeline_kanban` in + // `OpportunityViews.listViews`, which the switcher puts on the strip + // under its own label, *Sales Pipeline* — one click from here and + // zero clicks further than a second sidebar row. The + // view-entry exemplar duty this item used to carry now sits with the + // "My Work" items below, which are all object + `viewName`. + { id: "nav_opportunity", type: "object", objectName: "crm_opportunity", label: "Opportunities", icon: "target" }, + { id: "nav_quote", type: "object", objectName: "crm_quote", label: "Quotes", icon: "receipt" }, + // Contracts close the sales cycle: quote → signed agreement → renewal. + // The object, its views and its renewal automation all shipped, but + // there was no way to reach any of it from the app. + { id: "nav_contract", type: "object", objectName: "crm_contract", label: "Contracts", icon: "file-signature" }, + // Products sit here, not under Marketing (#1259): they are the + // revenue master data every quote line and opportunity line item + // points at — a sales object that happened to be filed next to + // campaigns. + { id: "nav_product", type: "object", objectName: "crm_product", label: "Products", icon: "package" }, + { id: "nav_sales_dashboard", type: "dashboard", dashboardName: "sales_dashboard", label: "Sales Performance", icon: "chart-line" } + ] + }, + { + // Everything a rep owes someone. `crm_task` had views, seed data, a + // recurrence hook and two reminder flows, and no entry point — the only + // way to see a task was to open the record it hung off. + id: "group_work", + type: "group", + label: "My Work", + icon: "list-checks", + expanded: true, + // These are ListViews: they list the records themselves, which a + // dashboard widget (an aggregate over a dataset, ADR-0021) cannot. Both + // surfaces resolve `{current_user_id}` since objectstack#12230 — the + // Service dashboard's "My Open Cases by Priority" is the aggregate + // counterpart of "My Cases" (#510). + // + // Every item here is object + `viewName`, which makes this group the + // app's view-entry exemplar since #1259 retired the "Pipeline" row. + // The one exception is the approvals Inbox at the bottom — a + // `component` entry, and the app's only one. + children: [ + { id: "nav_my_tasks", type: "object", objectName: "crm_task", viewName: "my_open_tasks", label: "My Tasks", icon: "circle-check" }, + { id: "nav_my_deals", type: "object", objectName: "crm_opportunity", viewName: "my_open_deals", label: "My Deals", icon: "target" }, + { id: "nav_my_leads", type: "object", objectName: "crm_lead", viewName: "my_leads", label: "My Leads", icon: "user-plus" }, + // #592 — the rep's own calendar: a list of events, so a view, not a + // dashboard. + { id: "nav_my_calendar", type: "object", objectName: "crm_event", viewName: "my_events", label: "My Calendar", icon: "calendar-days" }, + // No "All Tasks" entry: "My Tasks" opens the `crm_task` list page, + // whose tab strip leads with *All Tasks* — `TaskViews.list`, name + // `all_tasks`. It leads because it is the object's PRIMARY list: the + // switcher moves the primary to the front of the strip and marks it + // default, so nothing has to be authored to say so. The whole book is + // one tab away, and the sidebar keeps one row per object instead of + // two. + // + // ── The approvals Inbox lives here, not in a group of its own (#1259) + // + // It used to be the single child of an "Approvals" group. Its content + // is a personal queue — the things waiting on *you* — which is what + // this group is; a one-item group next to it was structure without a + // distinction. Dissolving that group is why this entry moved, not any + // rule against single-item groups (Marketing is one and stays one). + // + // "Inbox" (zh-CN 待我审批) must land somewhere an approver can actually + // approve. It used to be `type: 'object'` on `sys_approval_request` — + // the approvals plugin's raw request table, which is read-only: no row + // actions, no approve/reject, only Share on the record detail. The label + // promised an action the destination could not perform (#1123). + // + // `component` — not `url`. The platform's approval centre is a + // first-party console surface registered in the ComponentRegistry as + // `approvals:inbox` (registered by @objectstack/console itself, source + // `@object-ui/console`, rendering ApprovalsInboxPage) — exactly what the + // spec documents `component` for: "a first-party UI shipped with the + // platform — typically admin/setup surfaces that have no row in any data + // store". `url` is documented as the *external link* type, and taking it + // would mean hard-coding a console-internal route plus this app's own + // name (`/apps/crm_enterprise/system/approvals`) into metadata. A + // `componentRef` instead resolves against the *current* app base, so the + // entry keeps the user inside HotCRM's shell without naming the app, and + // a ref that ever stops resolving renders a loud "Component not + // registered" panel rather than silently bouncing to the console home. + // + // The read-only object list is not kept as a second "history" entry: the + // approval centre already subsumes it — My Pending / Submitted by me / + // All tabs plus a status filter (Pending / Approved / Rejected / + // Recalled / Returned for revision) — so a second entry would add a + // strictly weaker view of the same rows. + // + // `requiresObject` is retained: it is a base nav-item field on every + // item type, so the entry still hides itself on installs where + // @objectstack/plugin-approvals is absent and no approval exists to act + // on. + // + // There is no "Processes" item either: @objectstack/plugin-approvals + // registers sys_approval_request / sys_approval_action / + // sys_approval_approver / sys_approval_delegation — but neither a bare + // `sys_approval` nor a `sys_approval_process` object exists in any + // installed plugin (measured on the 17.2.0 rosters), + // so the old item's requiresObject guard hid it on every install, + // forever. + { id: "nav_approval_requests", type: "component", componentRef: "approvals:inbox", label: "Inbox", icon: "inbox", requiresObject: "sys_approval_request" } + ] + }, + { + // #592 — activity was the app's largest blind spot: `crm_event` and its + // attendee rows had nowhere to be seen, and no dashboard anywhere counted + // an interaction. Kept as its own group rather than buried under Sales, + // because "what happened with this customer, and when?" is the question + // the whole batch was about. + id: "group_activity", + type: "group", + label: "Activity", + icon: "calendar-days", + expanded: true, + children: [ + // One row for the object, one for the dashboard. The calendar and the + // interaction history are two more tabs on this same list page — + // `event_calendar` and `held_events` in `EventViews.listViews`, which + // the switcher puts on the strip under each view's own label — #1259 + // removed the sidebar duplicates, not the surfaces. `crm_event` had + // four sidebar rows; + // it was the single largest source of the nav's growth. + { id: "nav_event", type: "object", objectName: "crm_event", label: "Events", icon: "calendar-days" }, + { id: "nav_activity_dashboard", type: "dashboard", dashboardName: "sales_activity_dashboard", label: "Sales Activity", icon: "activity" } + ] + }, + { + // Campaigns drive lead_source and the campaign-member records that + // "Add to Campaign" writes — with no nav entry the marketing half of + // the data model was invisible. + // + // A single-item group on purpose (#1259). Marketing is a domain of its + // own, and a reader scanning the sidebar for "where does campaign work + // live" finds it by name. Item-count symmetry is not the goal; the + // Approvals group was dissolved because its item *was* personal work, + // not because one child is too few. + id: "group_marketing", + type: "group", + label: "Marketing", + icon: "megaphone", + children: [ + { id: "nav_campaign", type: "object", objectName: "crm_campaign", label: "Campaigns", icon: "megaphone" } + ] + }, + { + id: "group_service", + type: "group", + label: "Service", + icon: "headset", + expanded: true, + // EMPTY ON PURPOSE — this group is a CONTAINER, not a menu. + // + // `crm_case`, `crm_knowledge_article`, `service_dashboard` and + // `sla_performance` belong to `app.objectstack.hotcrm.service`, and an + // app's own `navigation` may not name another package's object (ADR-0130 + // §1.5): the entry fails at author time with "references object + // `crm_case` which is not defined in objects". The module puts all three + // back through `navigationContributions` (ADR-0029 D7), and it can only + // aim at a group the app DECLARES — a module cannot create one inside an + // app it does not own. So the app publishes the anchor and the module + // fills it; `src/service/index.ts` holds the other half, and the two + // service items of *My Work* and *Insights* come back the same way. + // + // ⛔ Do not "tidy" the group away: deleting it relocates all three + // contributed items to the app's top level with a + // `nav_contribution_group_missing` warning. + children: [] + }, + { + id: "group_insights", + type: "group", + label: "Insights", + icon: "sparkles", + children: [ + // Trimmed to three high-signal reports. Full report catalogue still + // ships as metadata; admins can pin more from the report picker. + { id: "nav_crm_dashboard", type: "dashboard", dashboardName: "crm_overview_dashboard", label: "CRM Overview", icon: "layout-dashboard" }, + { id: "nav_forecast", type: "object", objectName: "crm_forecast", label: "Forecasts", icon: "trending-up" }, + { id: "nav_report_pipeline_coverage", type: "report", reportName: "pipeline_coverage_by_quarter", label: "Pipeline Coverage", icon: "columns-3" }, + { id: "nav_report_lead_inflow", type: "report", reportName: "lead_inflow_by_month_source", label: "Lead Inflow", icon: "trending-up" } + ] + } + ] +}); + +// src/sales/profiles/index.ts +var profiles_exports = {}; +__export(profiles_exports, { + GuestPortalProfile: () => GuestPortalProfile, + MarketingUserProfile: () => MarketingUserProfile, + SalesManagerProfile: () => SalesManagerProfile, + SalesRepProfile: () => SalesRepProfile, + ServiceAgentProfile: () => ServiceAgentProfile, + ServiceManagerProfile: () => ServiceManagerProfile, + SystemAdminProfile: () => SystemAdminProfile +}); + +// src/sales/profiles/guest-portal.profile.ts +var GuestPortalProfile = { + name: "guest_portal", + label: "Guest (Public Forms)", + description: "Anonymous visitors submitting public Web-to-Lead / Web-to-Case forms. INSERT-only on lead and case; no read/edit/delete on any object.", + // No `allowExport` anywhere below, deliberately: this set is bound to the + // `guest` anchor, and ADR-0090 D9 classes `allowExport` as a high-privilege + // bit no anchor may confer — the set would stop binding at all, on top of + // handing anonymous visitors bulk table egress. See `src/sales/profiles/index.ts`. + objects: { + crm_lead: { + allowCreate: true, + allowRead: false, + allowEdit: false, + allowDelete: false, + viewAllRecords: false, + modifyAllRecords: false + }, + crm_case: { + allowCreate: true, + allowRead: false, + allowEdit: false, + allowDelete: false, + viewAllRecords: false, + modifyAllRecords: false + } + } +}; + +// src/sales/profiles/marketing-user.profile.ts +var MarketingUserProfile = { + name: "marketing_user", + label: "Marketing User", + objects: { + // `allowExport` where an export surface exists — canonical note in + // `src/sales/profiles/index.ts`. Lead and contact list exports are marketing's + // core targeting workflow; account/opportunity back the campaign-ROI + // reports. No `crm_case` grant here, so no export bit for it either. + crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, + crm_account: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, + crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, + crm_campaign: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + // Org-wide read: marketing attributes campaign → pipeline ROI, which needs + // every opportunity, not just self-owned. viewAllRecords was false here + // while every other object on this set is true — an oversight that hid all + // pipeline from marketing (and tripped security-private-no-readscope). + crm_opportunity: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, + // Campaign membership is THIS profile's core write surface: the + // "Add to Campaign" action (`src/sales/actions/lead.actions.ts`) inserts + // `crm_campaign_member` rows, and before #488 no permission set granted the + // object — the action failed for the only persona meant to run it. Rows + // derive from the campaign (controlled_by_parent), so there is no record + // scope to author — and as of 17.0.0-rc.4 that derivation does follow the + // campaign grant: MEASURED and pinned by + // `test/parent-derived-reach.test.ts`, master accessibility resolves through + // the same paths a direct read of the campaign takes, ownership and + // `sys_record_share` grants included. For THIS profile the delta is small — + // `crm_campaign` is `public_read` and this set holds org-wide campaign read, + // so the rows are the same either way — but the grant is now scope that + // follows the campaigns above, not org-wide read in fact as it was through + // 17.0.0-rc.3 (objectstack-ai/objectstack#5386, #694). + // Deleting membership history stays a manager/admin privilege, matching + // every other object here. + crm_campaign_member: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + // Read-only reference: knowledge articles for campaign copy + // (public_read catalog). + // Reads the KB and may rate it; cannot author articles (#601). + crm_article_feedback: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + crm_knowledge_article: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + // The record Attachments panel, READ only: canonical note on `enable.files` + // in `src/sales/objects/index.ts` (#2029). Which attachments it lists + // derives from the parent record; upload and delete wait upstream. + sys_attachment: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + // The record Discussion panel, comments and activity: canonical note on + // `enable.feeds` in `src/sales/objects/index.ts` (#2029). Which threads it + // reaches derives from the parent record; deleting a comment waits upstream. + sys_comment: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + sys_activity: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false } + }, + fields: { + // Marketing reads pipeline for campaign ROI but never prices a deal, and + // account health is the renewal team's call — read, never write (#488). + "crm_opportunity.amount": { readable: true, editable: false }, + "crm_account.health_score": { readable: true, editable: false } + }, + // The same private-deal row filter the sales_manager set carries: this + // profile also holds org-wide opportunity read, so it is one of the readers + // `crm_opportunity.is_private` has to hold back. See sales-manager.profile.ts + // for the full rationale. + rowLevelSecurity: [ + { + name: "opportunity_private_owner_only_marketing", + // A deal flagged Private is visible only to its owner, even to holders of + // org-wide opportunity read. (`rowLevelSecurity[].label` / `description` + // are display copy — the 17.7.0 liveness ledger marks both live: the + // permission editor draws them on the policy card. This policy authors + // neither, so its intent lives in this comment.) + object: "crm_opportunity", + operation: "select", + using: "is_private == false || owner_id == current_user.id" + }, + // The platform's `member_default` set carries a wildcard owner-only-writes + // policy (`created_by == current_user.id` on update), and RLS policies are + // OR-combined — so without a policy of its own, this set's allowEdit on + // campaigns only reaches campaigns the user personally created. That also + // silently broke "Add to Campaign": enrolling a member is a write DERIVED + // from the campaign (controlled_by_parent), so it requires campaign edit at + // the row level. This is the one direction in which the ADR-0055 derivation + // really does narrow: a master RLS policy is exactly what it folds in, while + // ownership and `sys_record_share` grants are not (which is why the READ + // side of these member rows is org-wide — see the `crm_campaign_member` + // grant above and objectstack-ai/objectstack#5386, #694). This policy widens + // campaign updates to every holder of the set — exactly what the object + // grant above already declares. `id != null` + // is the pushdown-safe "all rows" predicate (verified: compiles to + // `{id: {$null: false}}`). + { + name: "marketing_campaign_updates", + // Marketing users edit any campaign (and thereby enrol members into it), + // not only campaigns they created. + object: "crm_campaign", + operation: "update", + using: "id != null" + }, + // Same widening for the member rows themselves: response tracking means + // updating rows the enrollment flow (system context) created, which the + // default owner-only-writes policy would otherwise deny. + { + name: "marketing_campaign_member_updates", + // Marketing users update member response state on rows they did not + // personally create. + object: "crm_campaign_member", + operation: "update", + using: "id != null" + } + ] +}; + +// src/sales/profiles/sales-manager.profile.ts +var SalesManagerProfile = { + name: "sales_manager", + label: "Sales Manager", + objects: { + // `allowTransfer` on exactly the objects this set holds `modifyAllRecords` + // on — the sales book a manager reassigns. Canonical note in + // `src/sales/profiles/index.ts`. + // `allowExport` where an export surface exists — canonical note in + // `src/sales/profiles/index.ts`. A manager owns the number, so the pipeline and + // book exports that feed offline forecasting are part of the job. + crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, + crm_account: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, + crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, + crm_opportunity: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, + crm_quote: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + // No writeScope: `crm_contract` is `controlled_by_parent` under + // `crm_account` (#549), so a scope here would be inert — the write gate + // asks for EDIT on the account instead, which this set holds org-wide + // (`modifyAllRecords` above). That retires the #880 gap on BOTH editions: + // the contract an accepted quote drafts hangs under the rep, and the + // manager edits it because they can edit its account, not because of a + // hierarchy depth. `own_and_reports` was the app's only authored hierarchy + // scope; `requires: ['hierarchy-security']` stays declared (#1378 ruling). + // `allowDelete: false` must keep holding; `modifyAllRecords: false` keeps + // this off the super-user bypass. `test/contract-write-depth.test.ts`. + crm_contract: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + crm_product: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + crm_campaign: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + crm_case: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, + crm_task: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + // A manager coaches on activity, so this is org-wide read AND write on a + // private object — the same shape their `crm_task` grant already has. + // `crm_event_attendee` is `controlled_by_parent` (ADR-0055): no scope to + // author — one would be inert metadata. It narrows to the events this set + // can read, which is every event: `viewAllRecords` on `crm_event` above puts + // the whole activity stack in reach, so the derived attendee rows follow. + // MEASURED on 17.0.0-rc.4 and pinned by `test/parent-derived-reach.test.ts`, + // master accessibility resolves through the same paths a direct read of the + // event takes — ownership and `sys_record_share` grants folded in, not the + // master's row-level security policies alone. Until 17.0.0-rc.3 this grant + // was org-wide in FACT rather than by derivation, whatever the event grants + // said (#694); objectstack-ai/objectstack#5386 fixed that upstream and it + // shipped in rc.4. Same note in `sales-rep.profile.ts`. + crm_event: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + crm_event_attendee: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false }, + // The forecast IS the manager's job: they read every rep's snapshot and + // adjust the committed number, so this is org-wide read AND write on a + // private object (#488 — the object had no grant at all). + crm_forecast: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + // Knowledge is service-authored; sales reads it (public_read OWD). + // Reads the KB and may rate it; cannot author articles (#601). + crm_article_feedback: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + crm_knowledge_article: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + // Enrollment is marketing's job; a manager only reads the membership rows + // behind campaign ROI. `crm_campaign_member` is `controlled_by_parent`, so + // no readScope/viewAllRecords applies (ADR-0055) — but the rows do not + // "follow the campaign": the derivation resolves the master set through the + // master's RLS policies only (none narrow a select on `crm_campaign`), so + // this is org-wide read on every member row. The practical delta is small + // here — `crm_campaign` is `public_read` and this set reads every campaign + // anyway — so the intended derivation would return the same rows. See + // `campaign_member.object.ts` and objectstack-ai/objectstack#5386 (#694). + crm_campaign_member: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + // Line items: full CRUD so a manager can fix pricing on any rep's deal or + // quote. Both objects are `controlled_by_parent`, so there is no scope to + // author — but that derivation does not narrow these rows to the deals and + // quotes the manager can read. MEASURED (see the note in + // `sales-rep.profile.ts` and `test/parent-derived-reach.test.ts`): the master + // set comes from the master's RLS policies only, never from ownership or a + // share. This set authors one such policy — the private-deal filter on + // `crm_opportunity` below — and none on `crm_quote`, so quote lines are + // org-wide, and opportunity lines are bounded by that policy and nothing + // else (the guard test pins the quote chain; the opportunity side follows + // from the same measured mechanism). Upstream gap: + // objectstack-ai/objectstack#5386 (#694). + crm_opportunity_line_item: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false }, + crm_quote_line_item: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false }, + // The record Attachments panel, READ only: canonical note on `enable.files` + // in `src/sales/objects/index.ts` (#2029). Which attachments it lists + // derives from the parent record; upload and delete wait upstream. + sys_attachment: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + // The record Discussion panel, comments and activity: canonical note on + // `enable.feeds` in `src/sales/objects/index.ts` (#2029). Which threads it + // reaches derives from the parent record; deleting a comment waits upstream. + sys_comment: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + sys_activity: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false } + }, + fields: { + // Sensitive fields a manager must see in full. Authored explicitly rather + // than left absent: these are the fields other sets mask, and an unauthored + // grant reads as an oversight instead of a decision (#488). + "crm_opportunity.amount": { readable: true, editable: true }, + "crm_account.health_score": { readable: true, editable: true }, + "crm_quote.internal_notes": { readable: true, editable: true }, + // Case internal notes are the service team's working memory: a sales + // manager reads them for account context but never edits them. + "crm_case.internal_notes": { readable: true, editable: false } + }, + // ADR-0058: `crm_opportunity.is_private` is settable in the opportunity form + // (`opportunity.view.ts`) and, before this rule, was read by nothing — a + // checkbox that promised confidentiality and delivered none. Org-wide readers + // are exactly who it has to hold back, so the set that grants + // `viewAllRecords` on opportunities also carries the row filter that honours + // it. Compiles to `{ $or: [{ is_private: false }, { owner_id: }] }`. + // + // `owner_id`, not the app-authored `owner` lookup this used to name: #548 + // retired that field. The predicate now keys on the SAME column the OWD / + // sharing owner-match reads, so "its owner" means one thing app-wide. + rowLevelSecurity: [ + { + name: "opportunity_private_owner_only", + // A deal flagged Private is visible only to its owner, even to holders of + // org-wide opportunity read. (`rowLevelSecurity[].label` / `description` + // are display copy — the 17.7.0 liveness ledger marks both live: the + // permission editor draws them on the policy card. This policy authors + // neither, so its intent lives in this comment.) + object: "crm_opportunity", + operation: "select", + using: "is_private == false || owner_id == current_user.id" + } + ] +}; + +// src/sales/profiles/sales-rep.profile.ts +var SalesRepProfile = { + name: "sales_rep", + label: "Sales Representative", + // A rep's book of business is private by design (own records + whatever a + // sharing rule or team grant extends). The objects below carry an explicit + // `readScope: 'own'` so the intent is authored, not inferred — this both + // silences the `security-private-no-readscope` liveness warning and pins the + // behavior: without it, a private-OWD object with allowRead but no scope is + // an under-specified grant the engine reads as "own only" anyway. + // + // What widens that scope today is narrower than it sounds: the territory / + // account-team rules are authored on `crm_account` ONLY, and a sharing rule + // widens the object it names — not the records hanging off it. So a rep who + // receives an account through a territory rule reads that account, while the + // tasks on it stay own-only and opportunities widen only through the + // >= $100k leadership rules. Quotes and contracts are the exception since + // #549 (ruling 2026-08-31): both are `controlled_by_parent` under the + // account, so they arrive with it — the same derivation as contacts. + // + // The `controlled_by_parent` grants below read as narrow, and as of + // 17.0.0-rc.4 they ARE. MEASURED and pinned by + // `test/parent-derived-reach.test.ts`: the ADR-0055 derivation resolves master + // accessibility through the same paths a direct read of the master takes — + // owner scope AND `sys_record_share` grants, not the master's row-level + // security policies alone. A rep holding ONE account through a territory rule + // reads that account's contacts and no others, and reads line items only under + // the quotes they can reach. Writes derive the same way: a child of a master + // the rep cannot edit is refused. So each grant below is bounded by the + // parent's sharing, which is what it looks like. + // + // Until 17.0.0-rc.3 the same grants were org-wide reads and this note said so + // (#694): the derivation consulted master RLS policies only, and HotCRM + // authors none, so the master set was every record. + // objectstack-ai/objectstack#5386 fixed that upstream and it shipped in rc.4. + objects: { + // `allowExport` where an export surface exists — canonical note in + // `src/sales/profiles/index.ts`. Safe alongside `readScope: 'own'`: export is + // read-derived, so a rep's CSV carries their own book, not the org's. + crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: "own", allowExport: true }, + crm_account: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: "own", allowExport: true }, + // NO readScope: `crm_contact` is `controlled_by_parent` (master-detail to + // crm_account), so a `readScope` here is inert — the sharing service only + // applies owner scope to `private` objects — and it read as a promise the + // engine never kept: it said "own contacts only" while access derived from + // the parent (#488). That derivation now delivers exactly "the accounts the + // rep can read": measured on 17.0.0-rc.4, a rep holding one territory + // account reads THAT account's contacts and no others (see the note at the + // top of this file, #694). + crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, allowExport: true }, + crm_opportunity: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: "own", allowExport: true }, + // NO readScope on quote/contract either: both are `controlled_by_parent` + // under `crm_account` (#549), so a scope here would be inert. A rep reads + // the quotes and contracts of every account they can reach, edits the + // quotes of accounts they can edit, and never edits a contract (object + // gate). `test/parent-derived-reach.test.ts` measures both levels. + crm_quote: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + crm_contract: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + crm_product: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + crm_campaign: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + crm_case: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: "own", allowExport: true }, + crm_task: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false, readScope: "own" }, + // ─── Activity (#592) ────────────────────────────────────────────── + // `crm_event` is `private` like `crm_task` — a personal activity record — + // so an explicit record scope is required alongside allowRead (an omitted + // scope silently means "own only" and reads as an unmade decision). + // `crm_event_attendee` is `controlled_by_parent`, so authoring a readScope + // here would be inert metadata the engine never applies. Its rows narrow to + // the events the rep can read — which, `crm_event` being private and + // own-scoped, is their own calendar (see the note at the top of this file, + // #694). + crm_event: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false, readScope: "own" }, + crm_event_attendee: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false }, + // Reference catalog (public_read OWD): reps read knowledge articles, which + // are authored by service. + // Reads the KB and may rate it; cannot author articles (#601). + crm_article_feedback: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + crm_knowledge_article: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + // Forecast snapshots are written by the nightly `forecast.hook` job and the + // `revenue_forecasting` skill, never by hand — read-only, and only the rep's + // own snapshots (private OWD + explicit own scope, as above). + crm_forecast: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: "own" }, + // Product lines on deals and quotes. Both objects are + // `controlled_by_parent`, so there is no readScope to author — one would be + // inert metadata. That derivation scopes a rep to the lines under the deals + // and quotes they can reach: measured on 17.0.0-rc.4, a rep reads the lines + // of the one quote they own and none of the others (see the note at the top + // of this file, #694). Without these grants the opportunity "Products" + // related list and the whole CPQ path were denied for every non-admin user + // (#488). + crm_opportunity_line_item: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false }, + crm_quote_line_item: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false }, + // Which campaign sourced a lead — read-only context, derived from the + // campaign (controlled_by_parent). Enrollment belongs to marketing_user. + crm_campaign_member: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + // The record Attachments panel, READ only: canonical note on `enable.files` + // in `src/sales/objects/index.ts` (#2029). Which attachments it lists + // derives from the parent record; upload and delete wait upstream. + sys_attachment: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + // The record Discussion panel, comments and activity: canonical note on + // `enable.feeds` in `src/sales/objects/index.ts` (#2029). Which threads it + // reaches derives from the parent record; deleting a comment waits upstream. + sys_comment: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + sys_activity: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false } + }, + fields: { + "crm_account.annual_revenue": { readable: true, editable: false }, + "crm_account.description": { readable: true, editable: true }, + "crm_opportunity.amount": { readable: true, editable: true }, + "crm_opportunity.probability": { readable: true, editable: true }, + // Health score drives the renewal book and the at-risk views: reps see it, + // the renewal/CS process sets it. Readable (the `at_risk_accounts` view + // filters and sorts on it, and a masked field cannot be filtered) but never + // rep-editable — it was previously unauthored on every set (#488). + "crm_account.health_score": { readable: true, editable: false }, + // Quote internal notes stay rep-editable: `quote.hook` deliberately keeps + // them writable after a quote is sent, when nothing else is. + "crm_quote.internal_notes": { readable: true, editable: true }, + // Case internal notes are the service team's private working notes. A rep + // reads the case (own scope) for account context; the agent-only commentary + // inside it is masked — no view filters or sorts on this field, so masking + // costs nothing but the value itself. + "crm_case.internal_notes": { readable: false, editable: false } + } +}; + +// src/sales/profiles/service-agent.profile.ts +var ServiceAgentProfile = { + name: "service_agent", + label: "Service Agent", + objects: { + // Reference context an agent needs to work ANY ticket — a customer's cases + // are meaningless without seeing the account/contact behind them, so these + // are org-visible reads (viewAllRecords: true), NOT own-only. This was the + // security-private-no-readscope warning's real signal: allowRead on a + // private object with no scope had silently locked agents out of every + // account they didn't personally own. + // `allowExport` where an export surface exists — canonical note in + // `src/sales/profiles/index.ts`. `crm_opportunity` carries no export bit: this + // set has no read on it at all, and the axis never widens read. + crm_lead: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, + crm_account: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, + crm_contact: { allowCreate: false, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, + crm_opportunity: { allowCreate: false, allowRead: false, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + // Cases + tasks: an agent's own queue by default (readScope: 'own'). + // Cross-agent visibility exists for CASES only — the escalation rules widen + // open critical cases to service_manager / service_director. `crm_task` has + // no sharing rule at all, so an agent reading an account org-wide still + // sees only their own tasks on it (#549). + crm_case: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: "own", allowExport: true }, + // `allowTransfer` on `crm_task` ONLY — canonical note in + // `src/sales/profiles/index.ts`. Narrow and load-bearing: escalating a case fires + // `case_status_side_effects`, which opens the follow-up task OWNED BY the + // account owner (`case.hook.ts`). That insert runs on `ctx.api` with the + // agent's own context, so planting it under another user is a transfer and + // is denied without this bit — the case update would fail with it. This is + // "assign work to a colleague", not "reassign the ticket": the agent holds + // no transfer grant on `crm_case` or any customer record. + // + // ⚠️ Escalation DOES now move a case to the `service_manager` pool (#1070), + // and it does so with no `crm_case` grant here — deliberately. That + // hand-off runs on the `beforeUpdate` seam, which the #3004 guard cannot + // see (measured, three readings, in `_case-assignment.ts`'s header and + // pinned in `test/case-assignment.test.ts`), so the case moves as part of + // the escalation write the automation is already performing rather than as + // an agent-initiated transfer. Doing it the other way — a `ctx.api` write + // from `afterUpdate` — WOULD need `crm_case.allowTransfer` here, which + // would let an agent reassign any case they can edit. That is a + // permission-model decision and is not being taken as a side effect of a + // hook: this line stays `crm_task` only. + crm_task: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false, readScope: "own", allowTransfer: true }, + // #592 — `log_call` / `log_meeting` are scoped to `crm_case` too, and an + // agent who cannot INSERT a `crm_event` gets a button that 403s. Same + // own-scoped shape as their tasks. + crm_event: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false, readScope: "own" }, + crm_event_attendee: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false }, + crm_product: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + // The knowledge base is this team's own surface: agents draft and revise + // articles (draft → in_review → published is enforced by the KB flow, not by + // CRUD), and read every published article regardless of author. Archiving + // is destructive-by-policy, so deletion stays with admins. Before #488 the + // object had no grant at all — the "Knowledge" nav item was denied for + // everyone, including the agents it was built for. + // Agents rate the articles they use to close cases (#601). Create + edit + // their OWN row (`modifyAllRecords: false` keeps them off everyone else's + // vote); no delete — a withdrawn opinion is a changed verdict, not an + // erased one. + crm_article_feedback: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + crm_knowledge_article: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + // The record Attachments panel, READ only: canonical note on `enable.files` + // in `src/sales/objects/index.ts` (#2029). Which attachments it lists + // derives from the parent record; upload and delete wait upstream. + sys_attachment: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + // The record Discussion panel, comments and activity: canonical note on + // `enable.feeds` in `src/sales/objects/index.ts` (#2029). Which threads it + // reaches derives from the parent record; deleting a comment waits upstream. + sys_comment: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + sys_activity: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false } + }, + fields: { + "crm_case.is_sla_violated": { readable: true, editable: false }, + "crm_case.resolution_time_hours": { readable: true, editable: false }, + // Internal notes are the agent's working memory on a ticket — full access + // here, read-only for sales_manager, masked for sales_rep (#488). + "crm_case.internal_notes": { readable: true, editable: true }, + // Account health is renewal-team data an agent reads for context only. + "crm_account.health_score": { readable: true, editable: false } + } +}; +var ServiceManagerProfile = { + ...ServiceAgentProfile, + name: "service_manager", + label: "Service Manager" +}; + +// src/sales/profiles/system-admin.profile.ts +var SystemAdminProfile = { + name: "system_admin", + label: "System Administrator", + objects: { + // `allowTransfer` on every object — canonical note in `src/sales/profiles/index.ts`. + // The admin is the persona that reassigns ownership when someone leaves. + // `allowExport` on the five objects with an export surface — see the + // canonical note in `src/sales/profiles/index.ts`. It is authored even here: + // 17.0 gates export on the explicit bit, and `modifyAllRecords` does not + // stand in for it, so without these an admin cannot export either. + crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, + crm_account: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, + crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, + crm_opportunity: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, + crm_quote: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + crm_contract: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + crm_product: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + crm_campaign: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + crm_case: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, + crm_task: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + crm_event: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + crm_event_attendee: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + // The objects below shipped with navigation, views, hooks and seed data + // but no grant in ANY permission set (#488): "Knowledge" and "Forecasts" + // were permission-denied nav items for every user, admins included. + crm_forecast: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + crm_article_feedback: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + crm_knowledge_article: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + // Detail rows. Their RECORD-level access derives from the master + // (ADR-0055 `controlled_by_parent`), but object-level CRUD is a separate + // gate that is never derived — it has to be granted explicitly here. + crm_opportunity_line_item: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + crm_quote_line_item: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + crm_campaign_member: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, + // The record Attachments panel, READ only: canonical note on `enable.files` + // in `src/sales/objects/index.ts` (#2029). Which attachments it lists + // derives from the parent record; upload and delete wait upstream. + sys_attachment: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + // The record Discussion panel, comments and activity: canonical note on + // `enable.feeds` in `src/sales/objects/index.ts` (#2029). Which threads it + // reaches derives from the parent record; deleting a comment waits upstream. + sys_comment: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, + sys_activity: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false } + }, + systemPermissions: [ + "view_setup", + "manage_users", + "customize_application", + "view_all_data", + "modify_all_data", + "manage_profiles", + "manage_roles", + "manage_sharing" + ] +}; + +// src/sales/translations/index.ts +var translations_exports = {}; +__export(translations_exports, { + CrmTranslations: () => CrmTranslations +}); + +// src/sales/translations/en/app.ts +var appSurface = { + apps: { + crm_enterprise: { + label: "HotCRM", + description: "Customer relationship management for sales, service, and marketing", + navigation: { + group_activity: { label: "Activity" }, + group_sales: { label: "Sales" }, + group_service: { label: "Service" }, + group_marketing: { label: "Marketing" } + } + } + }, + messages: { + "common.save": "Save", + "common.cancel": "Cancel", + "common.delete": "Delete", + "common.edit": "Edit", + "common.create": "Create", + "common.search": "Search", + "common.filter": "Filter", + "common.export": "Export", + "common.back": "Back", + "common.confirm": "Confirm", + "nav.sales": "Sales", + "nav.service": "Service", + "nav.marketing": "Marketing", + "nav.products": "Products", + "nav.analytics": "Analytics", + "success.saved": "Record saved successfully", + "success.converted": "Lead converted successfully", + "confirm.delete": "Are you sure you want to delete this record?", + "confirm.convert_lead": "Convert this lead to account, contact, and opportunity?", + "error.required": "This field is required", + "error.load_failed": "Failed to load data" + }, + dashboards: { + sales_activity_dashboard: { + label: "Sales Activity", + description: "Who is talking to customers, how often, and which accounts have gone quiet", + widgets: { + interactions_held: { title: "Interactions Logged", description: "Calls and meetings that actually happened" }, + meetings_booked: { title: "Meetings Booked", description: "Meetings on the calendar that have not happened yet" }, + customer_minutes: { title: "Customer Minutes", description: "Total time spent in front of customers" }, + tasks_completed: { title: "Tasks Completed", description: "Follow-ups closed out \u2014 the other half of activity" }, + activity_by_rep: { title: "Activity by Rep", description: "Logged interactions per owner" }, + activity_by_week: { title: "Activity Volume by Week", description: "Interactions per week" }, + activity_mix: { title: "Activity Mix", description: "Calls vs meetings vs demos" }, + activity_by_record_type: { title: "Where the Activity Lands", description: "Which part of the funnel is getting attention" }, + deal_activity: { title: "Interactions on Deals", description: "Logged interactions linked to an opportunity" }, + open_deals_for_activity: { title: "Open Deals", description: "Opportunities still in play" }, + quiet_accounts_30: { title: "Quiet 30+ Days", description: "Active accounts with no logged interaction in a month" }, + quiet_accounts_60: { title: "Quiet 60+ Days", description: "Two months of silence \u2014 the at-risk threshold" }, + quiet_accounts_90: { title: "Quiet 90+ Days", description: "A quarter with no contact" } + } + }, + crm_overview_dashboard: { + label: "CRM Overview", + description: "Revenue metrics, pipeline analytics, and deal insights", + widgets: { + total_revenue: { title: "Total Revenue", description: "Closed-won revenue this period" }, + active_deals: { title: "Active Deals", description: "Open opportunities in the pipeline" }, + won_deals: { title: "Won Deals", description: "Closed-won deals this period" }, + avg_deal_size: { title: "Avg Deal Size", description: "Average value of closed-won deals" }, + revenue_trends: { title: "Revenue Trends", description: "Closed-won revenue over the last 12 months" }, + lead_source: { title: "Lead Source", description: "Pipeline value by acquisition channel" }, + pipeline_by_stage: { title: "Pipeline by Stage", description: "Open opportunity value at each sales stage" }, + top_products: { title: "Top Products", description: "Total list-price revenue by product category" }, + pipeline_by_owner: { title: "Pipeline by Owner", description: "Open pipeline value and deal count per sales rep" } + } + }, + executive_dashboard: { + label: "Executive Overview", + description: "High-level revenue, customer, and pipeline KPIs for leadership", + widgets: { + total_revenue_ytd: { title: "Total Revenue (YTD)", description: "Closed-won revenue this year" }, + total_accounts: { title: "Active Accounts", description: "Customers with at least one active relationship" }, + total_contacts: { title: "Total Contacts", description: "People in our address book" }, + open_leads: { title: "Open Leads", description: "Unconverted leads in the funnel" }, + revenue_trend: { title: "Revenue Trend", description: "Closed-won revenue over the last 12 months" }, + revenue_by_industry: { title: "Revenue by Industry", description: "YTD closed-won revenue split by customer industry" }, + pipeline_by_stage: { title: "Pipeline by Stage", description: "Open opportunity value at each sales stage" }, + new_accounts_by_month: { title: "New Accounts", description: "Account creation cadence \u2014 last 6 months" }, + accounts_by_industry: { title: "Accounts by Industry", description: "Total annual revenue and account count per industry" } + } + }, + sales_dashboard: { + label: "Sales Performance", + description: "Pipeline analytics, win rate trends, and rep performance", + widgets: { + total_pipeline_value: { title: "Total Pipeline", description: "Sum of open opportunity value" }, + closed_won_qtd: { title: "Closed Won (QTD)", description: "Revenue closed this quarter" }, + open_opportunities: { title: "Open Opportunities", description: "Active deals in flight" }, + avg_deal_size: { title: "Avg Deal Size", description: "Average value of closed-won deals this quarter" }, + pipeline_by_stage: { title: "Pipeline by Stage", description: "Open opportunity value at each sales stage" }, + monthly_revenue_trend: { title: "Monthly Revenue Trend", description: "Closed-won revenue, last 12 months" }, + pipeline_by_forecast_category: { title: "Pipeline by Forecast Category", description: "Open pipeline grouped by sales forecast category" }, + lead_source_breakdown: { title: "Lead Source", description: "Where our pipeline is coming from" }, + open_pipeline_by_owner: { title: "Open Pipeline by Owner", description: "In-flight pipeline value, deal count and avg win probability per rep" }, + quota_attainment_by_rep: { title: "Quota Attainment by Rep", description: "Current-quarter quota, closed revenue and attainment per rep, from forecast snapshots" }, + pipeline_stage_by_source: { title: "Pipeline by Stage \xD7 Lead Source", description: "Cross-tab of open opportunity amount by stage and source" }, + win_rate_12m: { title: "Win Rate (12M)", description: "Deals won as a share of all deals settled in the last 12 months" }, + won_deals_12m: { title: "Deals Won (12M)", description: "The numerator of the win rate" }, + lost_deals_12m: { title: "Deals Lost (12M)", description: "The other half of the win-rate denominator" }, + win_rate_by_owner: { title: "Win / Loss by Rep", description: "Deals won, deals lost and win rate per rep \u2014 last 12 months" }, + win_rate_by_lead_source: { title: "Win / Loss by Lead Source", description: "Which sources produce deals that actually close \u2014 last 12 months" }, + loss_reason_breakdown: { title: "Why We Lose", description: "Lost deals by reason \u2014 last 12 months" } + } + }, + service_dashboard: { + label: "Customer Service", + description: "Case load, SLA health, and resolution performance", + widgets: { + open_cases: { title: "Open Cases", description: "Cases that are not yet closed" }, + critical_cases: { title: "Critical Cases", description: "Open cases marked as critical priority" }, + avg_resolution_time: { title: "Avg Resolution Time", description: "Mean time to close, in hours" }, + sla_violations: { title: "SLA Violations", description: "Cases that breached their SLA" }, + cases_by_status: { title: "Cases by Status", description: "Workload distribution across the pipeline" }, + cases_by_priority: { title: "Cases by Priority", description: "Open case mix by urgency" }, + cases_by_origin: { title: "Cases by Origin", description: "Where our cases are coming from" }, + daily_case_volume: { title: "Daily Case Volume", description: "New cases created over the last 30 days" }, + sla_compliance_gauge: { title: "SLA Compliance", description: "Percent of cases resolved within SLA this period" }, + kb_deflection_rate: { title: "KB Deflection Rate", description: "Share of closed cases resolved with a knowledge article" }, + kb_resolved_cases: { title: "Resolved by KB", description: "Closed cases pointing at the article that resolved them" }, + closed_cases_total: { title: "Closed Cases", description: "The denominator behind the deflection rate" }, + top_resolving_articles: { title: "Top Resolving Articles", description: "Knowledge articles ranked by the closed cases they resolved" }, + my_open_cases_by_priority: { title: "My Open Cases by Priority", description: "Your open cases and their SLA-violation rate, broken down by priority" } + } + } + }, + pages: { + account_detail_page: { + label: "Account Detail", + description: "Slotted account record page \u2014 custom header + persistent discussion feed.", + // Required, though it equals the page source: a missing `title` falls + // back to `label`, and the header then read "Account Detail" instead of + // the account's name (#2042). + title: "{name}", + subtitle: "{industry} \xB7 {type}" + }, + account_workbench: { + label: "Account Workbench", + description: "Curated account list for the sales team: quick filters only, no view management." + }, + app_launcher_page: { + label: "App Launcher", + description: "Central hub for accessing all applications", + subtitle: "Select an app to get started", + components: { + app_search: { label: "Search Apps" }, + app_grid: { label: "Application Grid" } + } + }, + case_detail_page: { + label: "Case Detail", + description: "Service-agent case record: highlights, SLA path, details and activity timeline.", + title: "{case_number} \xB7 {subject}", + subtitle: "{crm_account}", + components: { + case_highlights: { label: "Key Information" }, + case_status_path: { label: "Case Status Path" } + } + }, + lead_detail_page: { + label: "Lead Detail", + description: "Comprehensive lead detail page with highlights, details, and related information", + title: "{first_name} {last_name}", + subtitle: "{company}", + components: { + lead_duplicate_alert_confirmed: { label: "Confirmed Duplicate Alert" }, + lead_duplicate_alert_suspected: { label: "Suspected Duplicate Alert" }, + lead_highlights: { label: "Key Information" }, + lead_path: { label: "Lead Status Path" }, + main_tabs: { label: "Lead Information Tabs" } + } + }, + opportunity_detail_page: { + label: "Opportunity Detail", + description: "Comprehensive opportunity detail page with path, highlights, details, and related lists", + title: "{name}", + subtitle: "{crm_account}", + components: { + opp_highlights: { label: "Key Information" }, + opp_stage_path: { label: "Opportunity Stage Path" } + } + }, + sales_home_page: { + label: "Sales Home", + description: "Sales team home page with key metrics and quick actions", + title: "Sales Dashboard", + subtitle: "Welcome back", + components: { + quick_create: { title: "Quick Create", label: "Quick Create" }, + key_metrics: { title: "Key Performance Indicators", label: "Key Metrics" }, + home_tabs: { label: "Home Tabs" }, + ai_briefing: { + title: "Ask the AI Assistant", + label: "Today with the AI Assistant" + }, + upcoming_events: { title: "Upcoming Events", label: "Upcoming Events" } + } + }, + utility_bar_page: { + label: "Utility Bar", + description: "Quick access utility bar with floating tools", + components: { + notifications_panel: { label: "Notifications" }, + quick_notes: { title: "Quick Notes", label: "Quick Notes" }, + quick_search: { label: "Quick Search" } + } + } + } +}; + +// src/sales/translations/en/_shared.ts +var activityActions = { + log_call: { + label: "Log a Call", + successMessage: "Call logged successfully!", + params: { + subject: { label: "Call Subject" }, + duration: { label: "Duration (minutes)" }, + attendee_contacts: { label: "Contact Attendees" }, + attendee_users: { label: "Internal Attendees" }, + notes: { label: "Call Notes" } + } + }, + log_meeting: { + label: "Log a Meeting", + successMessage: "Meeting logged successfully!", + params: { + subject: { label: "Meeting Subject" }, + duration: { label: "Duration (minutes)" }, + attendee_contacts: { label: "Contact Attendees" }, + attendee_users: { label: "Internal Attendees" }, + notes: { label: "Meeting Notes" } + } + }, + schedule_meeting: { + label: "Schedule a Meeting", + successMessage: "Meeting scheduled!", + params: { + subject: { label: "Meeting Subject" }, + start_date: { label: "Start Date (UTC)" }, + start_time: { label: "Start Time (UTC)" }, + location: { label: "Location" }, + duration: { label: "Duration (minutes)" }, + attendee_contacts: { label: "Contact Attendees" }, + attendee_users: { label: "Internal Attendees" }, + notes: { label: "Agenda" } + } + } +}; + +// src/sales/translations/en/objects.customer.ts +var customer = { + crm_account: { + label: "Account", + pluralLabel: "Accounts", + fields: { + account_number: { label: "Account Number" }, + registration_number: { + label: "Registration Number", + help: "The counterparty's registered identity as issued by its own government registry. Not the Account Number, which we issue." + }, + commercial_capability: { + label: "Commercial Capability", + help: "Whether new business may be opened against this account. Settlement Only accounts stay usable for billing and payment, but no new opportunity may be linked to them.", + options: { full: "Full", settlement_only: "Settlement Only" } + }, + incumbent_vendor: { label: "Incumbent Vendor", help: "The supplier currently holding this account for the spend we are chasing." }, + annual_purchasing_budget: { label: "Annual Purchasing Budget", help: "What this account expects to spend with vendors this year \u2014 not its own revenue." }, + payment_cycle: { + label: "Payment Cycle", + options: { prepaid: "Prepaid", net_30: "Net 30", net_60: "Net 60", net_90: "Net 90" } + }, + approval_status: { + label: "Approval Status", + help: "Where this account stands in its sign-off. A new account starts Pending and is decided in the approval inbox.", + options: { pending: "Pending", approved: "Approved", rejected: "Rejected" } + }, + name: { label: "Account Name", help: "Legal name of the company or organization" }, + type: { + label: "Type", + options: { prospect: "Prospect", customer: "Customer", partner: "Partner", former: "Former Customer" } + }, + industry: { + label: "Industry", + options: { + technology: "Technology", + software: "Software / SaaS", + finance: "Finance", + healthcare: "Healthcare", + retail: "Retail", + manufacturing: "Manufacturing", + education: "Education", + real_estate: "Real Estate", + media: "Media & Entertainment", + logistics: "Logistics", + hospitality: "Hospitality", + energy: "Energy & Utilities", + government: "Government", + nonprofit: "Non-profit", + other: "Other" + } + }, + annual_revenue: { label: "Annual Revenue" }, + child_account_revenue: { label: "Child Account Revenue", help: "Sum of the annual revenue of the direct children of this account." }, + number_of_employees: { label: "Number of Employees" }, + phone: { label: "Phone" }, + website: { label: "Website" }, + billing_address: { label: "Billing Address" }, + billing_country: { + label: "Billing Country", + help: "Derived from Billing Address \u2014 the country exactly as entered, trimmed and upper-cased." + }, + territory: { + label: "Territory", + help: "Derived from Billing Address \u2014 the sales territory the sharing rules match on. Accounts outside the staffed territories are Other.", + options: { na: "North America", emea: "EMEA", other: "Other" } + }, + office_location: { label: "Office Location" }, + owner_id: { label: "Account Owner" }, + parent_account: { label: "Parent Account", help: "Parent company in hierarchy" }, + description: { label: "Description" }, + is_active: { label: "Active" }, + last_activity_date: { label: "Last Activity Date" }, + brand_color: { label: "Brand Color" }, + logo: { label: "Company Logo" }, + tier: { + label: "Customer Tier", + options: { strategic: "Strategic", enterprise: "Enterprise", mid_market: "Mid-Market", smb: "SMB" } + }, + segment: { + label: "Segment", + options: { net_new: "Net New", growth: "Growth", at_risk: "At Risk", stable: "Stable" } + }, + health_score: { + label: "Health Score", + help: "CSM-maintained health indicator", + options: { healthy: "Healthy", watching: "Watching", at_risk: "At Risk", churning: "Churning" } + }, + name_normalized: { + label: "Account Name (Normalized)", + help: "Match key for lead conversion: Account Name lower-cased, trimmed, with internal whitespace collapsed. Maintained by the account_protection hook \u2014 never edit directly." + }, + display_title: { label: "Display Title" } + }, + _views: { + all_accounts: { label: "All Accounts", description: "Primary account list with revenue & industry summaries" }, + account_gallery: { label: "Account Cards", description: "Branded account cards with brand-color highlights" }, + account_map: { label: "Accounts by Location", description: "Geospatial distribution of accounts" }, + enterprise_accounts: { label: "Enterprise Accounts", description: "Accounts with the highest annual revenue" }, + my_accounts: { label: "My Accounts", description: "Accounts owned by the current user" }, + at_risk_accounts: { label: "\u26A0\uFE0F At-Risk Accounts" } + }, + _sections: { + basic: { label: "Basic Information" }, + financials: { label: "Financials" }, + business_profile: { label: "Business Profile" }, + contact_info: { label: "Contact Information" }, + ownership: { label: "Ownership & Status" }, + branding: { label: "Branding" }, + system: { label: "System" }, + // Form section names on account.view.ts (#1100) + profile: { label: "Profile" }, + customer_success: { label: "Customer Success" }, + locations: { label: "Locations" }, + description: { label: "Description" } + }, + _actions: { ...activityActions } + }, + crm_contact: { + label: "Contact", + pluralLabel: "Contacts", + fields: { + salutation: { + label: "Salutation", + options: { mr: "Mr.", ms: "Ms.", mrs: "Mrs.", dr: "Dr.", prof: "Prof." } + }, + first_name: { label: "First Name" }, + last_name: { label: "Last Name" }, + full_name: { label: "Full Name" }, + crm_account: { label: "Account" }, + email: { label: "Email" }, + phone: { label: "Phone" }, + mobile: { label: "Mobile" }, + title: { label: "Title" }, + department: { + label: "Department", + options: { + executive: "Executive", + sales: "Sales", + marketing: "Marketing", + engineering: "Engineering", + support: "Support", + finance: "Finance", + hr: "Human Resources", + operations: "Operations" + } + }, + // Buying centre (REQ-0004) — the decision map. English is the source + // wording for the option VALUES; every other pack translates these. + buying_function: { + label: "Buying Function", + options: { + decision_maker: "Decision Maker", + economic_buyer: "Economic Buyer", + technical_evaluator: "Technical Evaluator", + user: "User", + influencer: "Influencer", + gatekeeper: "Gatekeeper" + } + }, + attitude: { + label: "Attitude to Us", + options: { + champion: "Champion", + supportive: "Supportive", + neutral: "Neutral", + skeptical: "Skeptical", + blocker: "Blocker" + } + }, + relationship_strength: { + label: "Relationship Strength", + options: { + distant: "Distant", + acquaintance: "Acquaintance", + working: "Working Relationship", + strong: "Strong", + trusted_advisor: "Trusted Advisor" + } + }, + owner_id: { label: "Contact Owner" }, + description: { label: "Description" }, + is_primary: { label: "Primary Contact", help: "Is this the main contact for the account?" }, + avatar: { label: "Profile Picture" }, + mailing_address: { label: "Mailing Address" }, + lead_source: { + label: "Lead Source", + options: { + web: "Web", + referral: "Referral", + event: "Event / Trade Show", + webinar: "Webinar", + partner: "Partner", + advertisement: "Advertisement", + paid_search: "Paid Search", + social: "Social Media", + content: "Content / Blog", + cold_call: "Cold Call", + email_campaign: "Email Campaign", + other: "Other" + } + }, + do_not_call: { label: "Do Not Call" }, + email_opt_out: { label: "Email Opt Out" }, + last_contacted_date: { label: "Last Contacted" } + }, + _views: { + all_contacts: { label: "All Contacts" }, + contact_directory: { label: "People Directory" }, + primary_contacts: { label: "Primary Contacts" } + }, + _sections: { + identity: { label: "Identity" }, + account_info: { label: "Account & Title" }, + buying_centre: { label: "Buying Centre" }, + contact_info: { label: "Contact Information" }, + mailing_address: { label: "Mailing Address" }, + additional: { label: "Additional Info" }, + preferences: { label: "Communication Preferences" }, + // Form section names on contact.view.ts (#1100). `contact_details` / + // `comm_preferences`, not `contact_info` / `preferences` — those are + // already fieldGroup keys with their own (longer) wording above. + contact_details: { label: "Contact Info" }, + comm_preferences: { label: "Preferences" } + }, + _actions: { + ...activityActions, + mark_primary: { + label: "Mark as Primary Contact", + confirmText: "Mark this contact as the primary contact for the account?", + successMessage: "Contact marked as primary!" + }, + send_email: { + label: "Send Email", + params: { + subject: { label: "Subject" }, + body: { label: "Body" } + } + }, + add_contact_to_campaign: { + label: "Add to Campaign", + successMessage: "Contacts added to campaign!", + params: { + crm_campaign: { label: "Campaign" } + } + } + } + } +}; + +// src/sales/translations/en/objects.pipeline.ts +var pipeline = { + crm_lead: { + label: "Lead", + pluralLabel: "Leads", + fields: { + first_name: { label: "First Name" }, + last_name: { label: "Last Name" }, + company: { label: "Company" }, + title: { label: "Title" }, + email: { label: "Email" }, + phone: { label: "Phone" }, + status: { + label: "Status", + options: { + new: "New", + contacted: "Contacted", + qualified: "Qualified", + unqualified: "Unqualified", + converted: "Converted" + } + }, + lead_source: { + label: "Lead Source", + options: { + web: "Web", + referral: "Referral", + event: "Event / Trade Show", + webinar: "Webinar", + partner: "Partner", + advertisement: "Advertisement", + paid_search: "Paid Search", + social: "Social Media", + content: "Content / Blog", + cold_call: "Cold Call", + email_campaign: "Email Campaign", + other: "Other" + } + }, + owner_id: { label: "Lead Owner" }, + is_converted: { label: "Converted" }, + description: { label: "Description" }, + salutation: { + label: "Salutation", + options: { mr: "Mr.", ms: "Ms.", mrs: "Mrs.", dr: "Dr.", prof: "Prof." } + }, + full_name: { label: "Full Name" }, + industry: { + label: "Industry", + options: { + technology: "Technology", + software: "Software / SaaS", + finance: "Finance", + healthcare: "Healthcare", + retail: "Retail", + manufacturing: "Manufacturing", + education: "Education", + real_estate: "Real Estate", + media: "Media & Entertainment", + logistics: "Logistics", + hospitality: "Hospitality", + energy: "Energy & Utilities", + government: "Government", + nonprofit: "Non-profit", + other: "Other" + } + }, + mobile: { label: "Mobile" }, + website: { label: "Website" }, + rating: { label: "Lead Score", help: "Lead quality score (1-5 stars)" }, + converted_account: { label: "Converted Account" }, + converted_contact: { label: "Converted Contact" }, + converted_opportunity: { label: "Converted Opportunity" }, + converted_date: { label: "Converted Date" }, + address: { label: "Address" }, + annual_revenue: { label: "Annual Revenue" }, + number_of_employees: { label: "Number of Employees" }, + notes: { label: "Notes", help: "Working notes on this lead \u2014 supports formatting." }, + do_not_call: { label: "Do Not Call" }, + email_opt_out: { label: "Email Opt Out" }, + disqualification_reason: { + label: "Disqualification Reason", + help: "Required when status is Unqualified", + options: { + not_a_fit: "Not a Fit", + no_budget: "No Budget", + wrong_persona: "Wrong Persona", + unreachable: "Unreachable", + duplicate: "Duplicate", + competitor: "Competitor", + other: "Other" + } + }, + duplicate_of_type: { + label: "Duplicate Of", + help: "Which object holds the surviving record this lead repeats.", + // `erased` is a tombstone, not a choice: the form does not offer it + // (see `src/sales/views/lead.view.ts`), but a lead whose survivor was + // deleted carries it, so it needs a label wherever the record is + // READ — detail page, list column, export. Untranslated it would + // render as the raw `erased`. + options: { crm_lead: "Lead", crm_contact: "Contact", erased: "Erased Record" } + }, + duplicate_of_lead: { label: "Duplicate Of Lead" }, + duplicate_of_contact: { label: "Duplicate Of Contact" }, + duplicate_status: { + label: "Duplicate Status", + help: "Suspected = flagged automatically at intake. Confirmed = a human verified the match.", + options: { suspected: "Suspected", confirmed: "Confirmed" } + }, + display_title: { label: "Display Title" }, + company_normalized: { + label: "Company (Normalized)", + help: "Match key for lead conversion: Company lower-cased, trimmed, with internal whitespace collapsed. Maintained by the lead_duplicate_check hook \u2014 never edit directly." + }, + next_followup_date: { label: "Next Follow-up Date" }, + last_contacted_date: { label: "Last Contacted" }, + need_type: { + label: "Need Type", + help: "What this prospect is asking for. Routing, prioritisation and demand reporting read this.", + options: { + new_implementation: "New Implementation", + expansion: "Expansion", + replacement: "Replacement", + renewal: "Renewal", + consulting: "Consulting", + support: "Support & Maintenance", + other: "Other" + } + }, + estimated_amount: { + label: "Estimated Amount", + help: "Estimated value of this demand, before qualification. Prefills the deal amount at conversion." + }, + conversion_approval_status: { + label: "Conversion Approval", + help: "Whether this lead has been signed off for conversion. Not Required means no approval is asked for \u2014 the shipped default.", + options: { + not_required: "Not Required", + pending: "Pending", + approved: "Approved", + rejected: "Rejected" + } + } + }, + _views: { + all_leads: { + label: "All Leads", + emptyState: { title: "No Leads Yet", message: "Get started by creating your first lead" } + }, + kanban_by_status: { label: "Lead Pipeline" }, + calendar_by_created: { label: "Lead Calendar" }, + gallery_view: { label: "Lead Cards" }, + my_leads: { label: "My Leads" }, + high_priority: { label: "High Priority" }, + hot_leads: { label: "\u{1F525} Hot Leads" }, + suspected_duplicates: { + label: "Suspected Duplicates", + emptyState: { + title: "No Suspected Duplicates", + message: "Nothing to review \u2014 every re-captured email has been checked." + } + } + }, + _sections: { + identity: { label: "Identity" }, + company_info: { label: "Company Information" }, + contact_info: { label: "Contact Information" }, + qualification: { label: "Qualification" }, + assignment: { label: "Assignment" }, + address: { label: "Address" }, + additional: { label: "Additional Info" }, + preferences: { label: "Communication Preferences" }, + conversion: { label: "Conversion" }, + duplicates: { label: "Duplicate Management" }, + // The detail page's sections reference the groups above (#806), so it + // has no section names of its own. + // Form section names on lead.view.ts (#1100). The sections of the + // default form and of every named formView live here — add a form + // there, add its section names here. `address` / `qualification` above + // are reused (identical fieldGroup wording); every other name here is new. + contact_information: { label: "Contact Information" }, + lead_classification: { label: "Lead Classification" }, + company_information: { label: "Company Information" }, + additional_information: { label: "Additional Information" }, + privacy: { label: "Privacy" }, + general: { label: "General" }, + details: { label: "Details" }, + step_1_contact_details: { label: "Step 1: Contact Details" }, + step_2_company_information: { label: "Step 2: Company Information" }, + step_3_qualification: { label: "Step 3: Qualification" }, + step_4_review_and_convert: { label: "Step 4: Review & Convert" }, + primary_information: { label: "Primary Information" }, + extended_details: { label: "Extended Details" }, + quick_edit: { label: "Quick Edit" }, + update_lead_status: { label: "Update Lead Status" }, + tell_us_about_yourself: { label: "Tell us about yourself" }, + about_your_company: { label: "About your company" }, + how_can_we_help: { label: "How can we help?" }, + lead_information: { label: "Lead Information" }, + address_information: { label: "Address Information" }, + privacy_preferences: { label: "Privacy Preferences" } + }, + _actions: { + ...activityActions, + convert_lead: { + label: "Convert Lead", + successMessage: "Lead converted successfully!" + }, + create_campaign: { + label: "Add to Campaign", + successMessage: "Leads added to campaign!", + params: { + crm_campaign: { label: "Campaign" } + } + }, + schedule_followup: { + label: "Schedule Follow-up", + successMessage: "Follow-up scheduled." + } + } + }, + crm_opportunity: { + label: "Opportunity", + pluralLabel: "Opportunities", + fields: { + name: { label: "Opportunity Name" }, + crm_account: { label: "Account" }, + primary_contact: { label: "Primary Contact" }, + owner_id: { label: "Opportunity Owner" }, + amount: { label: "Amount" }, + expected_revenue: { label: "Expected Revenue" }, + stage: { + label: "Stage", + options: { + prospecting: "Prospecting", + qualification: "Qualification", + needs_analysis: "Needs Analysis", + proposal: "Proposal", + negotiation: "Negotiation", + closed_won: "Closed Won", + closed_lost: "Closed Lost" + } + }, + probability: { label: "Probability (%)" }, + close_date: { label: "Close Date" }, + type: { + label: "Type", + options: { + new_business: "New Business", + existing_upgrade: "Existing Customer - Upgrade", + existing_renewal: "Existing Customer - Renewal", + existing_expansion: "Existing Customer - Expansion" + } + }, + forecast_category: { + label: "Forecast Category", + options: { + pipeline: "Pipeline", + best_case: "Best Case", + commit: "Commit", + omitted: "Omitted", + closed: "Closed" + } + }, + description: { label: "Description" }, + next_step: { label: "Next Step" }, + lead_source: { + label: "Lead Source", + options: { + web: "Web", + referral: "Referral", + event: "Event / Trade Show", + webinar: "Webinar", + partner: "Partner", + advertisement: "Advertisement", + paid_search: "Paid Search", + social: "Social Media", + content: "Content / Blog", + cold_call: "Cold Call", + email_campaign: "Email Campaign", + other: "Other" + } + }, + crm_campaign: { label: "Campaign", help: "Marketing campaign that generated this opportunity" }, + days_in_stage: { label: "Days in Current Stage" }, + stage_entry_date: { + label: "Stage Entry Date", + help: "Date this opportunity entered its current stage." + }, + is_private: { label: "Private" }, + approval_status: { + label: "Approval Status", + options: { not_required: "Not Required", pending: "Pending", approved: "Approved", rejected: "Rejected" } + }, + approved_date: { label: "Approved Date" }, + win_reason: { + label: "Win Reason", + help: "Why this deal was won. Required to close an opportunity as Won.", + options: { + better_product: "Better Product", + better_price: "Better Price", + relationship: "Existing Relationship", + better_support: "Better Support", + best_fit: "Best Fit / Features", + quote_accepted: "Quote Accepted", + other: "Other" + } + }, + loss_reason: { + label: "Loss Reason", + help: "Why this deal was lost. Required to close an opportunity as Lost.", + options: { + price: "Price Too High", + competitor: "Lost to Competitor", + no_budget: "No Budget", + no_decision: "No Decision", + timing: "Bad Timing", + features: "Missing Features", + other: "Other" + } + }, + loss_details: { + label: "Loss/Win Details", + help: "Free-text context behind the win or loss reason." + }, + // REQ-0006 — qualification, the customer's procurement calendar, the + // deal narrative, the business line and the status-change gate. + will_bid: { + label: "Will Bid", + help: "Whether we intend to bid. Unset means the decision is open." + }, + controllability: { label: "Controllability", options: { high: "High", medium: "Medium", low: "Low" } }, + priority: { label: "Priority", options: { high: "High", medium: "Medium", low: "Low" } }, + deal_level: { label: "Deal Level", options: { strategic: "Strategic", key: "Key", standard: "Standard" } }, + is_subcontracted: { label: "Involves Subcontracting" }, + subcontracting_note: { label: "Subcontracting Note" }, + customer_initiation_date: { label: "Customer Initiation Date" }, + expected_tender_date: { label: "Expected Tender Date" }, + expected_signing_date: { label: "Expected Signing Date" }, + expected_tender_amount: { label: "Expected Tender Amount" }, + expected_signing_amount: { label: "Expected Signing Amount" }, + business_line: { + label: "Business Line", + options: { + product: "Product", + services: "Professional Services", + consulting: "Consulting", + support: "Support & Maintenance", + other: "Other" + } + }, + customer_background: { label: "Customer Background" }, + project_background: { label: "Project Background" }, + risk_analysis: { label: "Risk Analysis" }, + payment_terms: { label: "Payment Terms" }, + requested_status: { label: "Requested Status", options: { closed_won: "Won", closed_lost: "Lost" } }, + status_change_approval_status: { + label: "Status Change Approval", + options: { not_required: "Not Required", pending: "Pending", approved: "Approved", rejected: "Rejected" } + }, + // REQ-0006 step 11 — the 立项 (qualification) approval gate. + qualification_requested: { + label: "Request Qualification Approval", + help: "Tick to send this deal for qualification approval. A rejection clears it; tick it again to ask again." + }, + qualification_approval_status: { + label: "Qualification Approval", + options: { not_required: "Not Required", pending: "Pending", approved: "Approved", rejected: "Rejected" } + } + }, + _views: { + tender_this_quarter: { + label: "Tender This Quarter", + emptyState: { + title: "No Tenders Expected This Quarter", + message: "This tab lists open deals whose customer-side tender date falls inside the current quarter. Record Expected Tender Date on a deal to see it here." + } + }, + open_opportunities: { label: "Open Deals" }, + all_opportunities: { label: "All Opportunities" }, + pipeline_kanban: { label: "Sales Pipeline" }, + close_date_calendar: { label: "Forecast Calendar" }, + deal_timeline: { label: "Deal Timeline" }, + deal_gallery: { label: "Deal Cards" }, + my_open_deals: { label: "My Open Deals" }, + stale_opportunities: { label: "\u26A0\uFE0F Stale Opportunities \xB7 Longest in Stage First" }, + closing_this_quarter: { + label: "Closing This Quarter", + emptyState: { + title: "No Deals Closing This Quarter", + message: "This tab lists open commit and best-case deals with a close date inside the current quarter. Nothing matches right now \u2014 deals closing later are on the Open Deals tab." + } + } + }, + _sections: { + basic: { label: "Basic Information" }, + financials: { label: "Financials" }, + sales_process: { label: "Sales Process" }, + classification: { label: "Classification" }, + campaign: { label: "Campaigns" }, + notes: { label: "Notes & Next Steps" }, + qualification: { label: "Qualification" }, + narrative: { label: "Deal Narrative" }, + crm_forecast: { label: "Forecast & Metrics" }, + // The detail page's sections reference the groups above (#1452), so it + // has no section names of its own. + // Form section names on opportunity.view.ts (#1100) + overview: { label: "Overview" }, + forecast: { label: "Forecast" }, + sales_strategy: { label: "Sales Strategy" }, + win_loss: { label: "Win / Loss" } + }, + _actions: { + ...activityActions, + clone_opportunity: { + label: "Clone Opportunity", + successMessage: "Opportunity cloned successfully!" + }, + mass_update_stage: { + label: "Update Stage", + successMessage: "Opportunities updated successfully!", + params: { + stage: { label: "New Stage" } + } + }, + generate_quote: { + label: "Generate Quote", + successMessage: "Quote created from opportunity!" + } + } + }, + crm_opportunity_line_item: { + label: "Opportunity Line Item", + pluralLabel: "Opportunity Line Items", + description: "Per-product pricing lines under an opportunity", + fields: { + crm_opportunity: { label: "Opportunity" }, + crm_product: { label: "Product" }, + description: { label: "Description" }, + quantity: { label: "Quantity" }, + list_price: { label: "List Price", help: "Auto-populated from the product's List Price." }, + unit_price: { + label: "Sales Price", + help: "Negotiated unit price (may differ from list price)" + }, + discount: { label: "Discount %" }, + total_price: { label: "Total" }, + line_number: { label: "Line #" } + }, + _sections: { + basic: { label: "Line Item" }, + pricing: { label: "Pricing" } + } + }, + crm_forecast: { + label: "Forecast", + pluralLabel: "Forecasts", + description: "Periodic pipeline snapshot by owner used for revenue forecasting", + fields: { + owner_id: { label: "Owner" }, + period: { label: "Period", options: { month: "Month", quarter: "Quarter" } }, + period_start: { + label: "Period Start", + help: "Must be the first day of the period \u2014 e.g. 2026-08-01 for Aug 2026. A quarterly forecast must additionally start on a quarter boundary: January 1, April 1, July 1 or October 1." + }, + period_end: { + label: "Period End", + help: "Normally derived automatically from Period and Period Start. If set by hand, it must be the last day of that period \u2014 e.g. 2026-09-30 for a quarter starting 2026-07-01, or 2026-08-31 for Aug 2026." + }, + period_label: { label: "Period", help: 'Human-friendly label, e.g. "Q3 2026" or "Aug 2026".' }, + snapshot_date: { label: "Snapshot Date", help: "The day this snapshot was captured." }, + source: { + label: "Source", + options: { scheduled: "Scheduled snapshot", ai: "AI skill", manual: "Manual entry" } + }, + quota: { label: "Quota" }, + pipeline_amount: { + label: "Pipeline", + help: "Sum of all open opportunities closing in this period (any stage)." + }, + best_case_amount: { + label: "Best Case", + help: "Open opportunities in the Best Case or Commit forecast category." + }, + commit_amount: { + label: "Commit", + help: "Open opportunities in the Commit forecast category (owner-committed)." + }, + closed_amount: { label: "Closed Won", help: "Already-closed-won amount in this period." }, + expected_amount: { + label: "Expected", + help: "Closed Won + Commit \u2014 what the owner reasonably expects to land." + }, + attainment_pct: { label: "Attainment %", help: "Closed Won \xF7 Quota \xD7 100. Reads 0% until a positive quota is set." }, + coverage_ratio: { + label: "Coverage", + help: "Pipeline \xF7 (Quota \u2212 Closed Won) \u2014 whether enough pipeline remains to cover the gap. Reads 0 once the quota is already met." + }, + notes: { label: "Notes" }, + display_title: { label: "Display Title" }, + seed_key: { + label: "Seed Key", + help: "Demo-fixture identity. Written only by the seed loader; empty on every real snapshot." + } + }, + _views: { + all_forecasts: { label: "All Forecasts" }, + this_quarter_forecasts: { + label: "This Quarter", + emptyState: { + title: "This Quarter Has No Snapshots Yet", + message: "Quarterly snapshots are written by the nightly forecast sweep. Until it has run once for the current quarter this view is empty \u2014 settled quarters are on the All tab." + } + }, + my_forecast: { label: "My Forecast" } + }, + _sections: { + basic: { label: "Snapshot" }, + amounts: { label: "Amounts" }, + meta: { label: "Source" }, + // Form section names on forecast.view.ts (#1100). `basic`'s label + // matches "Snapshot" but its key does not, so this form section + // needs its own entry; `notes` has no fieldGroup counterpart at all. + snapshot: { label: "Snapshot" }, + notes: { label: "Notes" } + } + } +}; + +// src/sales/translations/en/objects.commerce.ts +var commerce = { + crm_quote: { + label: "Quote", + pluralLabel: "Quotes", + fields: { + quote_number: { label: "Quote Number" }, + name: { label: "Quote Name" }, + crm_account: { label: "Account" }, + crm_contact: { + label: "Contact", + help: "Required once the quote is Presented or Accepted \u2014 the drafted contract takes its Primary Contact from here." + }, + crm_opportunity: { label: "Opportunity" }, + owner_id: { label: "Quote Owner" }, + status: { + label: "Status", + options: { + draft: "Draft", + in_review: "In Review", + presented: "Presented", + accepted: "Accepted", + rejected: "Rejected", + expired: "Expired" + } + }, + quote_date: { label: "Quote Date" }, + expiration_date: { label: "Expiration Date" }, + subtotal: { label: "Subtotal" }, + discount: { label: "Discount %" }, + discount_amount: { label: "Discount Amount" }, + tax: { label: "Tax" }, + shipping_handling: { label: "Shipping & Handling" }, + total_price: { label: "Total Price" }, + payment_terms: { + label: "Payment Terms", + options: { + net_15: "Net 15", + net_30: "Net 30", + net_60: "Net 60", + net_90: "Net 90", + due_on_receipt: "Due on Receipt" + } + }, + shipping_terms: { label: "Shipping Terms" }, + billing_address: { label: "Billing Address" }, + shipping_address: { label: "Shipping Address" }, + description: { label: "Description" }, + internal_notes: { label: "Internal Notes" }, + display_title: { label: "Display Title" } + }, + _views: { + all_quotes: { label: "All Quotes" }, + quote_pipeline: { label: "Quote Pipeline" }, + quote_calendar: { label: "Quote Calendar" } + }, + _sections: { + basic: { label: "Quote Information" }, + pricing: { label: "Pricing" }, + terms: { label: "Terms & Validity" }, + address: { label: "Addresses" }, + system: { label: "System" }, + // Form section names on quote.view.ts (#1100). `quote_terms`, not + // `terms` — `terms` is already the fieldGroup key for "Terms & Validity". + quote: { label: "Quote" }, + totals: { label: "Totals" }, + quote_terms: { label: "Terms" }, + addresses_and_notes: { label: "Addresses & Notes" } + } + }, + crm_quote_line_item: { + label: "Quote Line Item", + pluralLabel: "Quote Line Items", + description: "Per-product pricing lines under a quote", + fields: { + crm_quote: { label: "Quote" }, + crm_product: { label: "Product" }, + description: { label: "Description" }, + quantity: { label: "Quantity" }, + list_price: { label: "List Price" }, + unit_price: { label: "Sales Price" }, + discount: { label: "Discount %" }, + subtotal: { label: "Subtotal" }, + total_price: { label: "Total" }, + line_number: { label: "Line #" } + }, + _sections: { + basic: { label: "Line Item" }, + pricing: { label: "Pricing" } + } + }, + crm_contract: { + label: "Contract", + pluralLabel: "Contracts", + fields: { + contract_number: { label: "Contract Number" }, + crm_account: { label: "Account" }, + crm_contact: { label: "Primary Contact" }, + crm_opportunity: { label: "Related Opportunity" }, + owner_id: { label: "Contract Owner" }, + status: { + label: "Status", + options: { + draft: "Draft", + in_approval: "In Approval", + activated: "Activated", + expired: "Expired", + terminated: "Terminated" + } + }, + contract_term_months: { label: "Contract Term (Months)" }, + start_date: { label: "Start Date" }, + end_date: { label: "End Date" }, + contract_value: { label: "Contract Value" }, + billing_frequency: { + label: "Billing Frequency", + options: { + monthly: "Monthly", + quarterly: "Quarterly", + annually: "Annually", + one_time: "One-time" + } + }, + payment_terms: { + label: "Payment Terms", + options: { + net_15: "Net 15", + net_30: "Net 30", + net_60: "Net 60", + net_90: "Net 90", + due_on_receipt: "Due on Receipt" + } + }, + auto_renewal: { label: "Auto Renewal" }, + renewal_notice_days: { label: "Renewal Notice (Days)" }, + contract_type: { + label: "Contract Type", + options: { + subscription: "Subscription", + service: "Service Agreement", + license: "License", + partnership: "Partnership", + nda: "NDA", + msa: "MSA" + } + }, + signed_date: { label: "Signed Date" }, + signed_by: { label: "Signed By" }, + document_url: { label: "Contract Document" }, + special_terms: { label: "Special Terms" }, + description: { label: "Description" }, + billing_address: { label: "Billing Address" } + }, + _views: { + all_contracts: { label: "All Contracts" }, + renewal_calendar: { label: "Renewal Calendar" }, + contract_gantt: { label: "Contract Terms" }, + contract_timeline: { label: "Contract Timeline" } + }, + _sections: { + basic: { label: "Contract Information" }, + parties: { label: "Parties" }, + terms: { label: "Terms & Dates" }, + value: { label: "Contract Value" }, + status: { label: "Status & Approval" }, + renewal: { label: "Renewal" }, + // Form section names on contract.view.ts (#1100). `contract_terms`, + // not `terms` — `terms` is already the fieldGroup key for "Terms & Dates". + contract_terms: { label: "Terms" }, + signing_and_documents: { label: "Signing & Documents" }, + notes: { label: "Notes" } + } + }, + crm_product: { + label: "Product", + pluralLabel: "Products", + fields: { + product_code: { label: "Product Code" }, + name: { label: "Product Name" }, + description: { label: "Description" }, + category: { + label: "Category", + options: { + software: "Software", + hardware: "Hardware", + service: "Service", + subscription: "Subscription", + support: "Support" + } + }, + family: { + label: "Product Family", + options: { + enterprise: "Enterprise Solutions", + smb: "SMB Solutions", + services: "Professional Services", + cloud: "Cloud Services" + } + }, + list_price: { label: "List Price" }, + cost: { label: "Cost" }, + sku: { label: "SKU" }, + is_active: { label: "Active" }, + product_manager: { label: "Product Manager" }, + image: { label: "Product Image" }, + datasheet: { label: "Datasheet" }, + display_title: { label: "Display Title" } + }, + _views: { + all_products: { label: "All Products" }, + product_catalog: { label: "Product Catalog" } + }, + _sections: { + basic: { label: "Product Information" }, + pricing: { label: "Pricing" }, + metadata: { label: "Resources" }, + // Form section names on product.view.ts (#1100) + product_info: { label: "Product Info" }, + pricing_info: { label: "Pricing" }, + media: { label: "Media" } + } + } +}; + +// src/sales/translations/en/objects.service.ts +var service = { + crm_case: { + label: "Case", + pluralLabel: "Cases", + fields: { + case_number: { label: "Case Number" }, + subject: { label: "Subject" }, + description: { label: "Description" }, + crm_account: { label: "Account" }, + crm_contact: { label: "Contact" }, + status: { + label: "Status", + options: { + new: "New", + in_progress: "In Progress", + waiting_customer: "Waiting on Customer", + waiting_support: "Waiting on Support", + escalated: "Escalated", + resolved: "Resolved", + closed: "Closed" + } + }, + priority: { + label: "Priority", + options: { low: "Low", medium: "Medium", high: "High", critical: "Critical" } + }, + type: { + label: "Case Type", + options: { + question: "Question", + problem: "Problem", + feature_request: "Feature Request", + bug: "Bug" + } + }, + origin: { + label: "Case Origin", + options: { email: "Email", phone: "Phone", web: "Web", chat: "Chat", social_media: "Social Media" } + }, + owner_id: { label: "Case Owner" }, + closed_date: { label: "Closed Date" }, + first_response_date: { label: "First Response Date" }, + resolution_time_hours: { label: "Resolution Time (Hours)" }, + sla_due_date: { label: "SLA Due Date", help: "Set from the case priority and the account\u2019s Customer Tier, in calendar hours: nights, weekends and holidays count." }, + is_sla_violated: { label: "SLA Violated" }, + is_escalated: { label: "Escalated" }, + escalation_reason: { label: "Escalation Reason" }, + resolution: { label: "Resolution" }, + resolved_by_article: { label: "Resolved by Article", help: "Knowledge article that resolved this case \u2014 the deflection signal." }, + internal_notes: { label: "Internal Notes", help: "Internal notes; not visible to the customer." }, + is_closed: { label: "Is Closed" }, + display_title: { label: "Display Title" }, + priority_rank: { label: "Priority Rank" }, + escalated_date: { label: "Escalated Date" } + }, + _views: { + all_cases: { label: "All Cases" }, + case_workflow: { label: "Service Workflow" }, + sla_calendar: { label: "SLA Calendar" }, + case_timeline: { label: "Case Timeline" }, + unassigned_triage: { + label: "Unassigned \u2014 triage", + emptyState: { + title: "Nothing waiting for triage", + message: "Every case has an owner. Cases appear here when they arrive with no owner \u2014 typically a web-to-case submission that arrived while nobody held the Service Agent position." + } + }, + escalated_cases: { label: "Escalated Cases" }, + my_open_cases: { label: "My Open Cases" }, + sla_at_risk: { label: "\u23F0 SLA at Risk" } + }, + _sections: { + basic: { label: "Case Information" }, + origin: { label: "Origin & Routing" }, + sla: { label: "SLA & Priority" }, + resolution: { label: "Resolution" }, + escalation: { label: "Escalation" }, + system: { label: "System" }, + // The detail page's sections reference the groups above (#970), so it + // has no section names of its own. + // Form section names on case.view.ts (#1100). + case: { label: "Case" }, + how_can_we_help: { label: "How can we help?" } + }, + _actions: { + ...activityActions, + escalate_case: { + label: "Escalate Case", + confirmText: "This will escalate the case to the escalation team. Continue?", + successMessage: "Case escalated successfully!" + }, + close_case: { + label: "Close Case", + confirmText: "Are you sure you want to close this case?", + successMessage: "Case closed successfully!" + }, + claim_case: { + label: "Claim Case", + successMessage: "Case claimed \u2014 it is yours now." + } + } + }, + crm_knowledge_article: { + label: "Knowledge Article", + pluralLabel: "Knowledge Base", + description: "Reusable answers and how-to guides for customers and agents", + fields: { + article_number: { label: "Article #" }, + title: { label: "Title" }, + summary: { label: "Summary", help: "One-paragraph TL;DR shown in search results and AI citations." }, + body: { label: "Body", help: "Full article content (Markdown)." }, + category: { + label: "Category", + options: { + getting_started: "Getting Started", + how_to: "How-To", + troubleshooting: "Troubleshooting", + billing: "Billing & Pricing", + api: "API & Integrations", + release_notes: "Release Notes", + policy: "Policy" + } + }, + tags: { + label: "Tags", + options: { + auth: "Auth", + sso: "SSO", + mobile: "Mobile", + email: "Email", + reports: "Reports", + performance: "Performance", + data_import: "Data Import", + webhooks: "Webhooks" + } + }, + status: { + label: "Status", + options: { draft: "Draft", in_review: "In Review", published: "Published", archived: "Archived" } + }, + audience: { + label: "Audience", + help: "Public articles are visible in the customer portal; internal articles are agent-only.", + options: { public: "Public", internal: "Internal" } + }, + language: { + label: "Language", + options: { en: "English", zh_cn: "Simplified Chinese", es_es: "Spanish", ja_jp: "Japanese" } + }, + owner_id: { label: "Owner" }, + related_to_case: { label: "Source Case", help: "Case this article was authored from (optional)." }, + published_at: { label: "Published At" }, + last_reviewed_at: { label: "Last Reviewed" }, + helpful_count: { label: "Helpful", help: "Recounted from crm_article_feedback \u2014 never typed in." }, + not_helpful_count: { label: "Not Helpful", help: "Recounted from crm_article_feedback \u2014 never typed in." }, + display_title: { label: "Display Title" } + }, + _views: { + all_articles: { label: "All Articles" }, + published_articles: { label: "Published" }, + my_drafts: { label: "My Drafts" } + }, + _sections: { + basic: { label: "Article Information" }, + content: { label: "Content" }, + taxonomy: { label: "Categorization" }, + metrics: { label: "Engagement" }, + engagement: { label: "Engagement" }, + // Form section name on knowledge_article.view.ts (#1100) + article: { label: "Article" } + }, + _actions: { + mark_article_helpful: { + label: "Helpful", + successMessage: "Thanks \u2014 recorded as helpful." + }, + mark_article_not_helpful: { + label: "Not Helpful", + successMessage: "Thanks \u2014 recorded as not helpful." + } + } + }, + crm_article_feedback: { + label: "Article Feedback", + pluralLabel: "Article Feedback", + description: "One reader\u2019s helpful / not-helpful verdict on a knowledge article", + fields: { + feedback_number: { label: "Feedback #" }, + owner_id: { label: "Reader" }, + crm_knowledge_article: { label: "Article", help: "Knowledge article this feedback is about." }, + verdict: { + label: "Verdict", + options: { helpful: "Helpful", not_helpful: "Not Helpful" } + }, + comment: { label: "Comment", help: "Optional note explaining the verdict \u2014 read by the article\u2019s author." } + }, + _sections: { + basic: { label: "Feedback" } + } + } +}; + +// src/sales/translations/en/objects.activity.ts +var activity = { + crm_task: { + label: "Task", + pluralLabel: "Tasks", + fields: { + subject: { label: "Subject" }, + description: { label: "Description" }, + status: { + label: "Status", + options: { + not_started: "Not Started", + in_progress: "In Progress", + waiting: "Waiting", + completed: "Completed", + deferred: "Deferred" + } + }, + priority: { + label: "Priority", + options: { low: "Low", normal: "Normal", high: "High", urgent: "Urgent" } + }, + type: { + label: "Task Type", + options: { + call: "Call", + email: "Email", + meeting: "Meeting", + follow_up: "Follow-up", + demo: "Demo", + other: "Other" + } + }, + due_date: { label: "Due Date" }, + reminder_date: { label: "Reminder Date/Time" }, + completed_date: { label: "Completed Date" }, + owner_id: { label: "Assigned To" }, + related_to_type: { + label: "Related To Type", + options: { + crm_account: "Account", + crm_contact: "Contact", + crm_opportunity: "Opportunity", + crm_lead: "Lead", + crm_case: "Case" + } + }, + related_to_account: { label: "Related Account" }, + related_to_contact: { label: "Related Contact" }, + related_to_opportunity: { label: "Related Opportunity" }, + related_to_lead: { label: "Related Lead" }, + related_to_case: { label: "Related Case" }, + is_recurring: { label: "Recurring Task" }, + recurrence_type: { + label: "Recurrence Type", + options: { daily: "Daily", weekly: "Weekly", monthly: "Monthly", yearly: "Yearly" } + }, + recurrence_interval: { label: "Recurrence Interval" }, + recurrence_end_date: { label: "Recurrence End Date" }, + is_completed: { label: "Is Completed" }, + is_overdue: { label: "Is Overdue" }, + progress_percent: { label: "Progress (%)" }, + priority_rank: { label: "Priority Rank" }, + reminder_sent: { label: "Reminder Sent" } + }, + _views: { + all_tasks: { label: "All Tasks" }, + task_board: { label: "Task Board" }, + task_calendar: { label: "Task Schedule" }, + task_gantt: { label: "Execution Plan" }, + task_timeline: { label: "Worklog Timeline" }, + my_open_tasks: { label: "My Open Tasks" }, + todays_tasks: { label: "\u{1F4C5} My Priority Tasks" }, + overdue_tasks: { label: "\u23F0 Open Tasks \xB7 Most Overdue First" } + }, + _sections: { + basic: { label: "Task Information" }, + scheduling: { label: "Scheduling" }, + related: { label: "Related Records" }, + recurrence: { label: "Recurrence" }, + effort: { label: "Progress & Effort" }, + system: { label: "System" }, + // Form section names on task.view.ts (#1100) + task: { label: "Task" }, + related_records: { label: "Related Records" }, + recurrence_and_effort: { label: "Recurrence & Effort" } + } + }, + crm_event: { + label: "Event", + pluralLabel: "Events", + description: "Meetings, calls and other scheduled interactions with customers", + fields: { + subject: { label: "Subject" }, + description: { label: "Description" }, + type: { + label: "Event Type", + options: { + meeting: "Meeting", + call: "Call", + demo: "Demo", + webinar: "Webinar", + onsite_visit: "Onsite Visit", + other: "Other" + } + }, + status: { + label: "Status", + options: { + planned: "Planned", + held: "Held", + cancelled: "Cancelled", + no_show: "No Show" + } + }, + owner_id: { label: "Assigned To" }, + start_datetime: { label: "Start" }, + end_datetime: { label: "End" }, + all_day: { label: "All Day Event" }, + duration_minutes: { label: "Duration (minutes)" }, + location: { label: "Location", help: "Room, address, or meeting link" }, + related_to_type: { + label: "Related To Type", + options: { + crm_account: "Account", + crm_contact: "Contact", + crm_opportunity: "Opportunity", + crm_lead: "Lead", + crm_case: "Case" + } + }, + related_to_account: { label: "Related Account" }, + related_to_contact: { label: "Related Contact" }, + related_to_opportunity: { label: "Related Opportunity" }, + related_to_lead: { label: "Related Lead" }, + related_to_case: { label: "Related Case" }, + outcome_notes: { label: "Outcome Notes", help: "What was agreed, and what happens next" } + }, + _views: { + all_events: { label: "All Events" }, + event_calendar: { label: "Event Calendar" }, + event_timeline: { label: "Team Schedule" }, + my_events: { label: "My Calendar" }, + upcoming_events: { label: "\u{1F4C5} Upcoming \xB7 Soonest First" }, + held_events: { label: "\u2705 Interaction History" } + }, + _sections: { + basic: { label: "Event Information" }, + schedule: { label: "Schedule" }, + related: { label: "Related Records" }, + outcome: { label: "Outcome" }, + // Form section names on event.view.ts (#1100). `related_records`, + // not `related` — `related` is already the fieldGroup key above. + event: { label: "Event" }, + related_records: { label: "Related Records" } + } + }, + crm_event_attendee: { + label: "Event Attendee", + pluralLabel: "Event Attendees", + description: "A person invited to or present at an event", + fields: { + attendee_number: { label: "Attendee Number" }, + crm_event: { label: "Event" }, + attendee_type: { + label: "Attendee Type", + options: { contact: "Contact", lead: "Lead", user: "User", external: "External" } + }, + crm_contact: { label: "Contact", help: "Set when the attendee is an existing customer contact" }, + crm_lead: { label: "Lead", help: "Set when the attendee is still an unconverted lead" }, + sys_user: { label: "User", help: "Set when the attendee is a colleague" }, + external_name: { + label: "External Attendee", + help: "Name of an attendee who is in no CRM object \u2014 set when Attendee Type is External" + }, + response: { + label: "Response", + options: { + no_response: "No Response", + accepted: "Accepted", + declined: "Declined", + tentative: "Tentative" + } + }, + is_organizer: { label: "Organizer" }, + invited_date: { label: "Invited" } + }, + _views: { + all_event_attendees: { label: "Event Attendees" } + }, + _sections: { + basic: { label: "Attendee" }, + response: { label: "Invitation" }, + // Form section names on event_attendee.view.ts (#1100) — same English + // text as the fieldGroups above, but a distinct key: `attendee` / + // `invitation` are not `basic` / `response`. + attendee: { label: "Attendee" }, + invitation: { label: "Invitation" } + } + } +}; + +// src/sales/translations/en/objects.marketing.ts +var marketing = { + crm_campaign: { + label: "Campaign", + pluralLabel: "Campaigns", + fields: { + campaign_code: { label: "Campaign Code" }, + name: { label: "Campaign Name" }, + description: { label: "Description" }, + type: { + label: "Campaign Type", + options: { + email: "Email", + webinar: "Webinar", + trade_show: "Trade Show", + conference: "Conference", + direct_mail: "Direct Mail", + social_media: "Social Media", + content: "Content Marketing", + partner: "Partner Marketing" + } + }, + channel: { + label: "Primary Channel", + options: { + digital: "Digital", + social: "Social", + email: "Email", + events: "Events", + partner: "Partner" + } + }, + status: { + label: "Status", + options: { + planning: "Planning", + in_progress: "In Progress", + completed: "Completed", + aborted: "Aborted" + } + }, + start_date: { label: "Start Date" }, + end_date: { label: "End Date" }, + budgeted_cost: { label: "Budgeted Cost" }, + actual_cost: { label: "Actual Cost" }, + expected_revenue: { label: "Expected Revenue" }, + actual_revenue: { label: "Actual Revenue" }, + target_size: { label: "Target Size", help: "Target number of leads/contacts" }, + num_sent: { label: "Number Sent" }, + num_responses: { label: "Number of Responses" }, + num_leads: { label: "Number of Leads" }, + num_converted_leads: { label: "Converted Leads" }, + num_opportunities: { label: "Opportunities Created" }, + num_won_opportunities: { label: "Won Opportunities" }, + response_rate: { label: "Response Rate %" }, + roi: { label: "ROI %" }, + owner_id: { label: "Campaign Owner" }, + landing_page_url: { label: "Landing Page" }, + is_active: { label: "Active" }, + display_title: { label: "Display Title" } + }, + _views: { + all_campaigns: { label: "All Campaigns" }, + campaign_gantt: { label: "Campaign Schedule" }, + campaign_calendar: { label: "Launch Calendar" }, + campaign_timeline: { label: "Marketing Timeline" } + }, + _sections: { + basic: { label: "Campaign Information" }, + schedule: { label: "Schedule" }, + budget: { label: "Budget & ROI" }, + metrics: { label: "Performance" }, + assignment: { label: "Ownership" }, + assets: { label: "Campaign Assets" } + }, + _actions: { + enroll_leads: { + label: "Enroll Members", + successMessage: "Eligible members enrolled in campaign." + } + } + }, + crm_campaign_member: { + label: "Campaign Member", + pluralLabel: "Campaign Members", + description: "Leads and contacts touched by a campaign, with response status", + fields: { + member_number: { label: "Member Number" }, + crm_campaign: { label: "Campaign" }, + crm_lead: { label: "Lead", help: "Set when the member was a Lead at enrollment time" }, + crm_contact: { label: "Contact", help: "Set when the member is an existing Contact" }, + status: { + label: "Status", + options: { + sent: "Sent", + responded: "Responded", + converted: "Converted", + unsubscribed: "Unsubscribed" + } + }, + added_date: { label: "Added Date" }, + response_date: { label: "Response Date" }, + has_responded: { label: "Has Responded" } + }, + _sections: { + basic: { label: "Basic Information" }, + response: { label: "Response Tracking" } + }, + _actions: { + mark_responded: { + label: "Mark Responded", + successMessage: "Response recorded on this campaign member." + } + } + } +}; + +// src/sales/translations/en.ts +var en2 = { + objects: { + crm_account: customer.crm_account, + crm_contact: customer.crm_contact, + crm_knowledge_article: service.crm_knowledge_article, + crm_forecast: pipeline.crm_forecast, + crm_lead: pipeline.crm_lead, + crm_opportunity: pipeline.crm_opportunity, + crm_case: service.crm_case, + crm_contract: commerce.crm_contract, + crm_product: commerce.crm_product, + crm_quote: commerce.crm_quote, + crm_task: activity.crm_task, + crm_campaign: marketing.crm_campaign, + crm_event: activity.crm_event, + crm_event_attendee: activity.crm_event_attendee, + crm_article_feedback: service.crm_article_feedback, + crm_campaign_member: marketing.crm_campaign_member, + crm_opportunity_line_item: pipeline.crm_opportunity_line_item, + crm_quote_line_item: commerce.crm_quote_line_item + }, + ...appSurface +}; + +// src/sales/translations/zh-CN/app.ts +var appSurface2 = { + apps: { + crm_enterprise: { + label: "HotCRM", + description: "\u6DB5\u76D6\u9500\u552E\u3001\u670D\u52A1\u548C\u5E02\u573A\u8425\u9500\u7684\u5BA2\u6237\u5173\u7CFB\u7BA1\u7406\u7CFB\u7EDF", + // Keyed by navigation-node `id` (a flat keyspace regardless of depth). + navigation: { + group_activity: { label: "\u6D3B\u52A8" }, + nav_event: { label: "\u6D3B\u52A8" }, + nav_activity_dashboard: { label: "\u9500\u552E\u6D3B\u52A8" }, + nav_my_calendar: { label: "\u6211\u7684\u65E5\u5386" }, + nav_home: { label: "\u9996\u9875" }, + group_sales: { label: "\u9500\u552E" }, + nav_lead: { label: "\u7EBF\u7D22" }, + nav_account: { label: "\u5BA2\u6237" }, + nav_account_workbench: { label: "\u5BA2\u6237\u5DE5\u4F5C\u53F0" }, + nav_contact: { label: "\u8054\u7CFB\u4EBA" }, + nav_opportunity: { label: "\u5546\u673A" }, + nav_quote: { label: "\u62A5\u4EF7" }, + nav_contract: { label: "\u5408\u540C" }, + nav_product: { label: "\u4EA7\u54C1" }, + nav_sales_dashboard: { label: "\u9500\u552E\u4E1A\u7EE9" }, + group_work: { label: "\u6211\u7684\u5DE5\u4F5C" }, + nav_my_tasks: { label: "\u6211\u7684\u4EFB\u52A1" }, + nav_my_deals: { label: "\u6211\u7684\u5546\u673A" }, + nav_my_leads: { label: "\u6211\u7684\u7EBF\u7D22" }, + nav_my_cases: { label: "\u6211\u7684\u5DE5\u5355" }, + nav_approval_requests: { label: "\u5F85\u6211\u5BA1\u6279" }, + group_marketing: { label: "\u5E02\u573A\u8425\u9500" }, + nav_campaign: { label: "\u8425\u9500\u6D3B\u52A8" }, + group_service: { label: "\u670D\u52A1" }, + nav_case: { label: "\u5DE5\u5355" }, + nav_knowledge: { label: "\u77E5\u8BC6\u5E93" }, + nav_service_dashboard: { label: "\u670D\u52A1\u6982\u89C8" }, + group_insights: { label: "\u6570\u636E\u6D1E\u5BDF" }, + nav_crm_dashboard: { label: "CRM \u603B\u89C8" }, + nav_forecast: { label: "\u9500\u552E\u9884\u6D4B" }, + nav_report_pipeline_coverage: { label: "\u7BA1\u9053\u8986\u76D6\u7387" }, + nav_report_lead_inflow: { label: "\u7EBF\u7D22\u6D41\u5165" }, + nav_report_sla: { label: "SLA \u8FBE\u6210" } + } + } + }, + messages: { + "common.save": "\u4FDD\u5B58", + "common.cancel": "\u53D6\u6D88", + "common.delete": "\u5220\u9664", + "common.edit": "\u7F16\u8F91", + "common.create": "\u65B0\u5EFA", + "common.search": "\u641C\u7D22", + "common.filter": "\u7B5B\u9009", + "common.export": "\u5BFC\u51FA", + "common.back": "\u8FD4\u56DE", + "common.confirm": "\u786E\u8BA4", + "nav.sales": "\u9500\u552E", + "nav.service": "\u670D\u52A1", + "nav.marketing": "\u8425\u9500", + "nav.products": "\u4EA7\u54C1", + "nav.analytics": "\u6570\u636E\u5206\u6790", + "success.saved": "\u8BB0\u5F55\u4FDD\u5B58\u6210\u529F", + "success.converted": "\u7EBF\u7D22\u8F6C\u5316\u6210\u529F", + "confirm.delete": "\u786E\u5B9A\u8981\u5220\u9664\u6B64\u8BB0\u5F55\u5417\uFF1F", + "confirm.convert_lead": "\u5C06\u6B64\u7EBF\u7D22\u8F6C\u5316\u4E3A\u5BA2\u6237\u3001\u8054\u7CFB\u4EBA\u548C\u5546\u673A\uFF1F", + "error.required": "\u6B64\u5B57\u6BB5\u4E3A\u5FC5\u586B\u9879", + "error.load_failed": "\u6570\u636E\u52A0\u8F7D\u5931\u8D25" + }, + dashboards: { + sales_activity_dashboard: { + label: "\u9500\u552E\u6D3B\u52A8", + description: "\u8C01\u5728\u548C\u5BA2\u6237\u6C9F\u901A\u3001\u9891\u7387\u5982\u4F55\uFF0C\u4EE5\u53CA\u54EA\u4E9B\u5BA2\u6237\u5DF2\u7ECF\u6C89\u9ED8", + widgets: { + interactions_held: { title: "\u5DF2\u8BB0\u5F55\u4E92\u52A8", description: "\u771F\u5B9E\u53D1\u751F\u8FC7\u7684\u901A\u8BDD\u4E0E\u4F1A\u8BAE" }, + meetings_booked: { title: "\u5DF2\u9884\u7EA6\u4F1A\u8BAE", description: "\u5DF2\u6392\u5165\u65E5\u5386\u4F46\u5C1A\u672A\u4E3E\u884C\u7684\u4F1A\u8BAE" }, + customer_minutes: { title: "\u5BA2\u6237\u63A5\u89E6\u5206\u949F\u6570", description: "\u9762\u5411\u5BA2\u6237\u7684\u603B\u65F6\u957F" }, + tasks_completed: { title: "\u5DF2\u5B8C\u6210\u4EFB\u52A1", description: "\u5DF2\u95ED\u73AF\u7684\u8DDF\u8FDB\u4E8B\u9879\u2014\u2014\u6D3B\u52A8\u7684\u53E6\u4E00\u534A" }, + activity_by_rep: { title: "\u6309\u9500\u552E\u4EE3\u8868\u7EDF\u8BA1\u7684\u6D3B\u52A8", description: "\u6BCF\u4F4D\u8D1F\u8D23\u4EBA\u8BB0\u5F55\u7684\u4E92\u52A8\u6570" }, + activity_by_week: { title: "\u6BCF\u5468\u6D3B\u52A8\u91CF", description: "\u6BCF\u5468\u4E92\u52A8\u6570" }, + activity_mix: { title: "\u6D3B\u52A8\u6784\u6210", description: "\u901A\u8BDD\u3001\u4F1A\u8BAE\u4E0E\u6F14\u793A\u7684\u5360\u6BD4" }, + activity_by_record_type: { title: "\u6D3B\u52A8\u843D\u5728\u54EA\u91CC", description: "\u6F0F\u6597\u7684\u54EA\u4E2A\u73AF\u8282\u83B7\u5F97\u4E86\u5173\u6CE8" }, + deal_activity: { title: "\u5546\u673A\u4E0A\u7684\u4E92\u52A8", description: "\u5173\u8054\u5230\u5546\u673A\u7684\u5DF2\u8BB0\u5F55\u4E92\u52A8" }, + open_deals_for_activity: { title: "\u8FDB\u884C\u4E2D\u7684\u5546\u673A", description: "\u4ECD\u5728\u63A8\u8FDB\u7684\u5546\u673A\u6570" }, + quiet_accounts_30: { title: "\u6C89\u9ED8 30 \u5929\u4EE5\u4E0A", description: "\u4E00\u4E2A\u6708\u5185\u6CA1\u6709\u4EFB\u4F55\u4E92\u52A8\u8BB0\u5F55\u7684\u6D3B\u8DC3\u5BA2\u6237" }, + quiet_accounts_60: { title: "\u6C89\u9ED8 60 \u5929\u4EE5\u4E0A", description: "\u4E24\u4E2A\u6708\u65E0\u8054\u7CFB\u2014\u2014\u98CE\u9669\u9608\u503C" }, + quiet_accounts_90: { title: "\u6C89\u9ED8 90 \u5929\u4EE5\u4E0A", description: "\u6574\u6574\u4E00\u4E2A\u5B63\u5EA6\u6CA1\u6709\u8054\u7CFB" } + } + }, + crm_overview_dashboard: { + label: "CRM \u603B\u89C8", + description: "\u6536\u5165\u6307\u6807\u3001\u7BA1\u9053\u5206\u6790\u4E0E\u5546\u673A\u6D1E\u5BDF", + widgets: { + total_revenue: { title: "\u603B\u6536\u5165", description: "\u672C\u671F\u5DF2\u6210\u4EA4\u6536\u5165" }, + active_deals: { title: "\u6D3B\u8DC3\u5546\u673A", description: "\u7BA1\u9053\u4E2D\u8FDB\u884C\u4E2D\u7684\u5546\u673A" }, + won_deals: { title: "\u8D62\u5355\u6570", description: "\u672C\u671F\u5DF2\u7ED3\u6848\u5546\u673A\u4E2D\u8D62\u5355\u7684\u603B\u6570" }, + avg_deal_size: { title: "\u5E73\u5747\u8BA2\u5355\u91D1\u989D", description: "\u5DF2\u6210\u4EA4\u5546\u673A\u7684\u5E73\u5747\u91D1\u989D" }, + revenue_trends: { title: "\u6536\u5165\u8D8B\u52BF", description: "\u8FC7\u53BB 12 \u4E2A\u6708\u7684\u5DF2\u6210\u4EA4\u6536\u5165" }, + lead_source: { title: "\u7EBF\u7D22\u6765\u6E90", description: "\u6309\u83B7\u5BA2\u6E20\u9053\u7EDF\u8BA1\u7684\u7BA1\u9053\u91D1\u989D" }, + pipeline_by_stage: { title: "\u9636\u6BB5\u7BA1\u9053\u5206\u5E03", description: "\u6309\u9636\u6BB5\u7EDF\u8BA1\u7684\u8FDB\u884C\u4E2D\u5546\u673A\u91D1\u989D" }, + top_products: { title: "\u70ED\u95E8\u4EA7\u54C1", description: "\u6309\u4EA7\u54C1\u7C7B\u522B\u7EDF\u8BA1\u7684\u76EE\u5F55\u4EF7\u6536\u5165" }, + pipeline_by_owner: { title: "\u6309\u8D1F\u8D23\u4EBA\u7EDF\u8BA1\u7BA1\u9053", description: "\u5404\u9500\u552E\u8D1F\u8D23\u4EBA\u7684\u8FDB\u884C\u4E2D\u7BA1\u9053\u91D1\u989D\u4E0E\u5546\u673A\u6570" } + } + }, + executive_dashboard: { + label: "\u9AD8\u7BA1\u603B\u89C8", + description: "\u9762\u5411\u7BA1\u7406\u5C42\u7684\u6536\u5165\u3001\u5BA2\u6237\u4E0E\u7BA1\u9053\u9AD8\u9636\u6307\u6807", + widgets: { + total_revenue_ytd: { title: "\u5E74\u5EA6\u7D2F\u8BA1\u6536\u5165", description: "\u672C\u5E74\u5EA6\u5DF2\u6210\u4EA4\u6536\u5165" }, + total_accounts: { title: "\u6D3B\u8DC3\u5BA2\u6237", description: "\u81F3\u5C11\u5B58\u5728\u4E00\u9879\u6D3B\u8DC3\u5173\u7CFB\u7684\u5BA2\u6237" }, + total_contacts: { title: "\u8054\u7CFB\u4EBA\u603B\u6570", description: "\u901A\u8BAF\u5F55\u4E2D\u7684\u8054\u7CFB\u4EBA" }, + open_leads: { title: "\u672A\u8F6C\u5316\u7EBF\u7D22", description: "\u6F0F\u6597\u4E2D\u5C1A\u672A\u8F6C\u5316\u7684\u7EBF\u7D22" }, + revenue_trend: { title: "\u6536\u5165\u8D8B\u52BF", description: "\u8FC7\u53BB 12 \u4E2A\u6708\u7684\u5DF2\u6210\u4EA4\u6536\u5165" }, + revenue_by_industry: { title: "\u884C\u4E1A\u6536\u5165\u5206\u5E03", description: "\u672C\u5E74\u5EA6\u5DF2\u6210\u4EA4\u6536\u5165\u6309\u5BA2\u6237\u884C\u4E1A\u62C6\u5206" }, + pipeline_by_stage: { title: "\u9636\u6BB5\u7BA1\u9053\u5206\u5E03", description: "\u6309\u9636\u6BB5\u7EDF\u8BA1\u7684\u8FDB\u884C\u4E2D\u5546\u673A\u91D1\u989D" }, + new_accounts_by_month: { title: "\u65B0\u589E\u5BA2\u6237", description: "\u8FC7\u53BB 6 \u4E2A\u6708\u7684\u5BA2\u6237\u521B\u5EFA\u8282\u594F" }, + accounts_by_industry: { title: "\u6309\u884C\u4E1A\u7EDF\u8BA1\u5BA2\u6237", description: "\u5404\u884C\u4E1A\u7684\u5E74\u8425\u6536\u603B\u989D\u4E0E\u5BA2\u6237\u6570" } + } + }, + sales_dashboard: { + label: "\u9500\u552E\u4E1A\u7EE9", + description: "\u7BA1\u9053\u5206\u6790\u3001\u8D62\u7387\u8D8B\u52BF\u53CA\u9500\u552E\u4EE3\u8868\u7EE9\u6548", + widgets: { + total_pipeline_value: { title: "\u7BA1\u9053\u603B\u989D", description: "\u6240\u6709\u8FDB\u884C\u4E2D\u5546\u673A\u91D1\u989D\u5408\u8BA1" }, + closed_won_qtd: { title: "\u672C\u5B63\u5EA6\u5DF2\u6210\u4EA4", description: "\u672C\u5B63\u5EA6\u5DF2\u8D62\u5F97\u7684\u6536\u5165" }, + open_opportunities: { title: "\u8FDB\u884C\u4E2D\u5546\u673A", description: "\u6B63\u5728\u63A8\u8FDB\u7684\u6D3B\u8DC3\u5546\u673A" }, + avg_deal_size: { title: "\u5E73\u5747\u8BA2\u5355\u91D1\u989D", description: "\u672C\u5B63\u5EA6\u5DF2\u6210\u4EA4\u5546\u673A\u7684\u5E73\u5747\u91D1\u989D" }, + pipeline_by_stage: { title: "\u9636\u6BB5\u7BA1\u9053\u5206\u5E03", description: "\u6309\u9636\u6BB5\u7EDF\u8BA1\u7684\u8FDB\u884C\u4E2D\u5546\u673A\u91D1\u989D" }, + monthly_revenue_trend: { title: "\u6708\u5EA6\u6536\u5165\u8D8B\u52BF", description: "\u8FC7\u53BB 12 \u4E2A\u6708\u7684\u5DF2\u6210\u4EA4\u6536\u5165" }, + pipeline_by_forecast_category: { title: "\u9884\u6D4B\u7C7B\u522B\u7BA1\u9053\u5206\u5E03", description: "\u6309\u9884\u6D4B\u7C7B\u522B\u7EDF\u8BA1\u7684\u8FDB\u884C\u4E2D\u7BA1\u9053\u91D1\u989D" }, + lead_source_breakdown: { title: "\u7EBF\u7D22\u6765\u6E90\u5206\u5E03", description: "\u6309\u6765\u6E90\u7EDF\u8BA1\u7684\u7EBF\u7D22\u6570\u91CF" }, + open_pipeline_by_owner: { title: "\u6309\u8D1F\u8D23\u4EBA\u7EDF\u8BA1\u8FDB\u884C\u4E2D\u7BA1\u9053", description: "\u5404\u9500\u552E\u8D1F\u8D23\u4EBA\u7684\u8FDB\u884C\u4E2D\u7BA1\u9053\u91D1\u989D\u3001\u5546\u673A\u6570\u4E0E\u5E73\u5747\u8D62\u5355\u6982\u7387" }, + quota_attainment_by_rep: { title: "\u6309\u9500\u552E\u4EE3\u8868\u7EDF\u8BA1\u914D\u989D\u8FBE\u6210", description: "\u6765\u81EA\u9884\u6D4B\u5FEB\u7167\u7684\u5404\u9500\u552E\u4EE3\u8868\u672C\u5B63\u5EA6\u914D\u989D\u3001\u5DF2\u6210\u4EA4\u6536\u5165\u4E0E\u8FBE\u6210\u7387" }, + pipeline_stage_by_source: { title: "\u9636\u6BB5 \xD7 \u7EBF\u7D22\u6765\u6E90", description: "\u6309\u9636\u6BB5\u548C\u6765\u6E90\u4EA4\u53C9\u7EDF\u8BA1\u8FDB\u884C\u4E2D\u5546\u673A\u91D1\u989D" }, + win_rate_12m: { title: "\u8D62\u7387\uFF08\u8FD1 12 \u4E2A\u6708\uFF09", description: "\u8FD1 12 \u4E2A\u6708\u5DF2\u7ED3\u5355\u5546\u673A\u4E2D\u8D62\u5355\u6240\u5360\u7684\u6BD4\u4F8B" }, + won_deals_12m: { title: "\u8D62\u5355\u6570\uFF08\u8FD1 12 \u4E2A\u6708\uFF09", description: "\u8D62\u7387\u7684\u5206\u5B50" }, + lost_deals_12m: { title: "\u4E22\u5355\u6570\uFF08\u8FD1 12 \u4E2A\u6708\uFF09", description: "\u8D62\u7387\u5206\u6BCD\u7684\u53E6\u4E00\u534A" }, + win_rate_by_owner: { title: "\u6309\u9500\u552E\u4EE3\u8868\u7EDF\u8BA1\u8D62/\u4E22\u5355", description: "\u8FD1 12 \u4E2A\u6708\u5404\u9500\u552E\u4EE3\u8868\u7684\u8D62\u5355\u6570\u3001\u4E22\u5355\u6570\u4E0E\u8D62\u7387" }, + win_rate_by_lead_source: { title: "\u6309\u7EBF\u7D22\u6765\u6E90\u7EDF\u8BA1\u8D62/\u4E22\u5355", description: "\u8FD1 12 \u4E2A\u6708\u54EA\u4E9B\u6765\u6E90\u5E26\u6765\u7684\u5546\u673A\u771F\u6B63\u6210\u4EA4" }, + loss_reason_breakdown: { title: "\u4E22\u5355\u539F\u56E0\u5206\u6790", description: "\u8FD1 12 \u4E2A\u6708\u4E22\u5355\u6309\u539F\u56E0\u5206\u5E03" } + } + }, + service_dashboard: { + label: "\u5BA2\u6237\u670D\u52A1", + description: "\u5DE5\u5355\u8D1F\u8F7D\u3001SLA \u5065\u5EB7\u5EA6\u4E0E\u5904\u7406\u7EE9\u6548", + widgets: { + open_cases: { title: "\u672A\u5173\u95ED\u5DE5\u5355", description: "\u5C1A\u672A\u5173\u95ED\u7684\u5DE5\u5355" }, + critical_cases: { title: "\u4E25\u91CD\u5DE5\u5355", description: "\u6807\u8BB0\u4E3A\u4E25\u91CD\u4F18\u5148\u7EA7\u7684\u672A\u5173\u95ED\u5DE5\u5355" }, + avg_resolution_time: { title: "\u5E73\u5747\u89E3\u51B3\u65F6\u957F", description: "\u5173\u95ED\u5DE5\u5355\u7684\u5E73\u5747\u5904\u7406\u65F6\u957F\uFF08\u5C0F\u65F6\uFF09" }, + sla_violations: { title: "SLA \u8FDD\u7EA6", description: "\u5DF2\u8D85\u51FA SLA \u7684\u5DE5\u5355" }, + cases_by_status: { title: "\u6309\u72B6\u6001\u5206\u5E03", description: "\u5DE5\u5355\u5728\u5404\u5904\u7406\u9636\u6BB5\u7684\u5206\u5E03" }, + cases_by_priority: { title: "\u6309\u4F18\u5148\u7EA7\u5206\u5E03", description: "\u672A\u5173\u95ED\u5DE5\u5355\u6309\u7D27\u6025\u7A0B\u5EA6\u7684\u5206\u5E03" }, + cases_by_origin: { title: "\u6309\u6765\u6E90\u5206\u5E03", description: "\u5DE5\u5355\u7684\u6765\u6E90\u6E20\u9053" }, + daily_case_volume: { title: "\u6BCF\u65E5\u5DE5\u5355\u91CF", description: "\u8FC7\u53BB 30 \u5929\u7684\u65B0\u5EFA\u5DE5\u5355" }, + sla_compliance_gauge: { title: "SLA \u8FBE\u6210\u7387", description: "\u672C\u671F SLA \u5185\u89E3\u51B3\u5DE5\u5355\u7684\u5360\u6BD4" }, + kb_deflection_rate: { title: "\u77E5\u8BC6\u5E93\u8F6C\u79FB\u7387", description: "\u5DF2\u5173\u95ED\u5DE5\u5355\u4E2D\u7531\u77E5\u8BC6\u6587\u7AE0\u89E3\u51B3\u7684\u5360\u6BD4" }, + kb_resolved_cases: { title: "\u77E5\u8BC6\u5E93\u89E3\u51B3\u6570", description: "\u5DF2\u5173\u8054\u89E3\u51B3\u6587\u7AE0\u7684\u5DF2\u5173\u95ED\u5DE5\u5355" }, + closed_cases_total: { title: "\u5DF2\u5173\u95ED\u5DE5\u5355", description: "\u8F6C\u79FB\u7387\u7684\u5206\u6BCD" }, + top_resolving_articles: { title: "\u89E3\u51B3\u5DE5\u5355\u6700\u591A\u7684\u6587\u7AE0", description: "\u6309\u89E3\u51B3\u7684\u5DF2\u5173\u95ED\u5DE5\u5355\u6570\u6392\u540D\u7684\u77E5\u8BC6\u6587\u7AE0" }, + my_open_cases_by_priority: { title: "\u6211\u7684\u672A\u5173\u95ED\u5DE5\u5355\uFF08\u6309\u4F18\u5148\u7EA7\uFF09", description: "\u4F60\u7684\u672A\u5173\u95ED\u5DE5\u5355\u53CA\u5176 SLA \u8FDD\u7EA6\u7387\uFF0C\u6309\u4F18\u5148\u7EA7\u7EC6\u5206" } + } + } + }, + // `title` / `subtitle` translate the page's `page:header`; `title` falls back + // to `label` when omitted, so it is authored only where the two differ. + // Header strings carrying `{field}` tokens keep the token spelling verbatim — + // the console substitutes on the raw key, so a translated token resolves to + // nothing and the header renders blank. + datasets: { + account_metrics: { + label: "\u5BA2\u6237\u6307\u6807", + description: "\u6309\u884C\u4E1A\u4E0E\u7C7B\u578B\u7EDF\u8BA1\u5BA2\u6237\u6570\u91CF\u7684\u8BED\u4E49\u5C42", + dimensions: { + industry: { + label: "\u884C\u4E1A" + }, + type: { + label: "\u7C7B\u578B" + }, + created_at: { + label: "\u521B\u5EFA\u65F6\u95F4" + } + }, + measures: { + account_count: { + label: "\u5BA2\u6237\u6570" + }, + annual_revenue_sum: { + label: "\u5E74\u8425\u6536" + } + } + }, + case_metrics: { + label: "\u5DE5\u5355\u6307\u6807", + description: "\u7EDF\u8BA1\u5DE5\u5355\u6570\u91CF\u3001\u89E3\u51B3\u65F6\u957F\u4E0E SLA \u7684\u8BED\u4E49\u5C42", + dimensions: { + created_at: { + label: "\u521B\u5EFA\u65F6\u95F4" + }, + origin: { + label: "\u6765\u6E90" + }, + priority: { + label: "\u4F18\u5148\u7EA7" + }, + resolved_article: { + label: "\u89E3\u51B3\u7528\u77E5\u8BC6\u6587\u7AE0" + }, + status: { + label: "\u72B6\u6001" + }, + type: { + label: "\u7C7B\u578B" + } + }, + measures: { + avg_resolution: { + label: "\u5E73\u5747\u89E3\u51B3\u65F6\u957F\uFF08\u5C0F\u65F6\uFF09" + }, + avg_sla_violated: { + label: "SLA \u8FDD\u7EA6\u7387" + }, + case_count: { + label: "\u5DE5\u5355\u6570" + }, + closed_count: { + label: "\u5DF2\u5173\u95ED\u5DE5\u5355" + }, + kb_deflection_rate: { + label: "\u77E5\u8BC6\u5E93\u81EA\u52A9\u89E3\u51B3\u7387" + }, + kb_resolved_count: { + label: "\u77E5\u8BC6\u5E93\u89E3\u51B3\u6570" + }, + sla_compliance_rate: { + label: "SLA \u8FBE\u6807\u7387" + }, + sla_met_count: { + label: "SLA \u8FBE\u6807\u5DE5\u5355" + } + } + }, + contact_metrics: { + label: "\u8054\u7CFB\u4EBA\u6307\u6807", + description: "\u7EDF\u8BA1\u8054\u7CFB\u4EBA\u6570\u91CF\u7684\u8BED\u4E49\u5C42", + measures: { + contact_count: { + label: "\u8054\u7CFB\u4EBA\u6570" + } + } + }, + event_metrics: { + label: "\u6D3B\u52A8\u6307\u6807", + description: "\u7EDF\u8BA1\u4F1A\u8BAE\u3001\u901A\u8BDD\u4E0E\u4E92\u52A8\u65B0\u8FD1\u5EA6\u7684\u8BED\u4E49\u5C42", + dimensions: { + owner: { + label: "\u8D1F\u8D23\u4EBA" + }, + related_to_type: { + label: "\u5173\u8054\u5BF9\u8C61" + }, + start_datetime: { + label: "\u6D3B\u52A8\u5468" + }, + status: { + label: "\u72B6\u6001" + }, + type: { + label: "\u6D3B\u52A8\u7C7B\u578B" + } + }, + measures: { + avg_minutes: { + label: "\u5E73\u5747\u65F6\u957F" + }, + event_count: { + label: "\u6D3B\u52A8\u6570" + }, + total_minutes: { + label: "\u603B\u5206\u949F\u6570" + } + } + }, + forecast_metrics: { + label: "\u9500\u552E\u9884\u6D4B\u6307\u6807", + description: "\u6309\u8D1F\u8D23\u4EBA\u7EDF\u8BA1\u914D\u989D\u3001\u8FBE\u6210\u7387\u4E0E\u7BA1\u9053\u8986\u76D6\u500D\u6570\u7684\u8BED\u4E49\u5C42", + dimensions: { + owner: { + label: "\u8D1F\u8D23\u4EBA" + }, + period: { + label: "\u5468\u671F\u7C7B\u578B" + }, + period_label: { + label: "\u5468\u671F" + }, + period_start: { + label: "\u5468\u671F\u5F00\u59CB" + } + }, + measures: { + attainment: { + label: "\u8FBE\u6210\u7387" + }, + closed_sum: { + label: "\u5DF2\u6210\u4EA4" + }, + commit_sum: { + label: "\u627F\u8BFA" + }, + pipeline_sum: { + label: "\u9500\u552E\u7BA1\u9053" + }, + quota_sum: { + label: "\u914D\u989D" + } + } + }, + lead_metrics: { + label: "\u7EBF\u7D22\u6307\u6807", + description: "\u7EDF\u8BA1\u7EBF\u7D22\u6570\u91CF\u7684\u8BED\u4E49\u5C42", + dimensions: { + created_at: { + label: "\u521B\u5EFA\u65F6\u95F4" + }, + last_contacted_date: { + label: "\u6700\u8FD1\u8054\u7CFB" + }, + lead_source: { + label: "\u6765\u6E90" + }, + status: { + label: "\u72B6\u6001" + } + }, + measures: { + lead_count: { + label: "\u7EBF\u7D22\u6570" + } + } + }, + opportunity_metrics: { + label: "\u5546\u673A\u6307\u6807", + description: "\u7EDF\u8BA1\u9500\u552E\u7BA1\u9053\u6570\u91CF\u4E0E\u91D1\u989D\u7684\u8BED\u4E49\u5C42", + dimensions: { + account_industry: { + label: "\u5BA2\u6237\u884C\u4E1A" + }, + close_date: { + label: "\u9884\u8BA1\u6210\u4EA4\u65E5" + }, + close_quarter: { + label: "\u6210\u4EA4\u5B63\u5EA6" + }, + forecast_category: { + label: "\u9884\u6D4B\u7C7B\u522B" + }, + lead_source: { + label: "\u7EBF\u7D22\u6765\u6E90" + }, + loss_reason: { + label: "\u5931\u5355\u539F\u56E0" + }, + owner: { + label: "\u8D1F\u8D23\u4EBA" + }, + stage: { + label: "\u9636\u6BB5" + }, + type: { + label: "\u5546\u673A\u7C7B\u578B" + }, + win_reason: { + label: "\u8D62\u5355\u539F\u56E0" + } + }, + measures: { + avg_amount: { + label: "\u5E73\u5747\u5355\u7B14\u91D1\u989D" + }, + avg_probability: { + label: "\u5E73\u5747\u8D62\u5355\u6982\u7387" + }, + decided_count: { + label: "\u5DF2\u5B9A\u5C40\u5546\u673A" + }, + lost_amount: { + label: "\u5931\u5355\u91D1\u989D" + }, + lost_count: { + label: "\u5931\u5355\u6570" + }, + opp_count: { + label: "\u5546\u673A\u6570" + }, + total_amount: { + label: "\u603B\u91D1\u989D" + }, + win_rate: { + label: "\u8D62\u5355\u7387" + }, + won_amount: { + label: "\u8D62\u5355\u91D1\u989D" + }, + won_count: { + label: "\u8D62\u5355\u6570" + } + } + }, + product_metrics: { + label: "\u4EA7\u54C1\u6307\u6807", + description: "\u7EDF\u8BA1\u4EA7\u54C1\u76EE\u5F55\u6570\u91CF\u4E0E\u6807\u4EF7\u7684\u8BED\u4E49\u5C42", + dimensions: { + category: { + label: "\u7C7B\u522B" + } + }, + measures: { + list_price_sum: { + label: "\u6807\u4EF7\u5408\u8BA1" + }, + product_count: { + label: "\u4EA7\u54C1\u6570" + } + } + }, + task_metrics: { + label: "\u4EFB\u52A1\u6307\u6807", + description: "\u7EDF\u8BA1\u4EFB\u52A1\u5DE5\u4F5C\u91CF\u4E0E\u5B8C\u6210\u60C5\u51B5\u7684\u8BED\u4E49\u5C42", + dimensions: { + due_date: { + label: "\u622A\u6B62\u65E5\u671F" + }, + is_completed: { + label: "\u5DF2\u5B8C\u6210" + }, + is_overdue: { + label: "\u5DF2\u903E\u671F" + }, + priority: { + label: "\u4F18\u5148\u7EA7" + }, + priority_rank: { + label: "\u7D27\u6025\u5EA6" + }, + status: { + label: "\u72B6\u6001" + }, + type: { + label: "\u7C7B\u578B" + } + }, + measures: { + avg_progress: { + label: "\u5E73\u5747\u8FDB\u5EA6" + }, + task_count: { + label: "\u4EFB\u52A1\u6570" + } + } + } + }, + pages: { + account_detail_page: { + label: "\u5BA2\u6237\u8BE6\u60C5", + description: "\u63D2\u69FD\u5F0F\u5BA2\u6237\u8BB0\u5F55\u9875\u2014\u2014\u81EA\u5B9A\u4E49\u9875\u5934 + \u5E38\u9A7B\u8BA8\u8BBA\u533A\u3002", + title: "{name}", + subtitle: "{industry} \xB7 {type}", + components: { + account_chatter: { label: "\u8BA8\u8BBA" } + } + }, + account_workbench: { + label: "\u5BA2\u6237\u5DE5\u4F5C\u53F0", + description: "\u9762\u5411\u9500\u552E\u56E2\u961F\u7684\u7CBE\u9009\u5BA2\u6237\u5217\u8868\uFF1A\u4EC5\u63D0\u4F9B\u5FEB\u6377\u7B5B\u9009\uFF0C\u4E0D\u542B\u89C6\u56FE\u7BA1\u7406\u3002" + }, + app_launcher_page: { + label: "\u5E94\u7528\u4E2D\u5FC3", + description: "\u8BBF\u95EE\u5168\u90E8\u5E94\u7528\u7684\u7EDF\u4E00\u5165\u53E3", + subtitle: "\u9009\u62E9\u4E00\u4E2A\u5E94\u7528\u5F00\u59CB\u4F7F\u7528", + components: { + app_search: { label: "\u641C\u7D22\u5E94\u7528" }, + app_grid: { label: "\u5E94\u7528\u7F51\u683C" } + } + }, + case_detail_page: { + label: "\u5DE5\u5355\u8BE6\u60C5", + description: "\u5BA2\u670D\u5DE5\u5355\u8BB0\u5F55\u9875\uFF1A\u5173\u952E\u4FE1\u606F\u3001SLA \u8FDB\u5EA6\u3001\u660E\u7EC6\u4E0E\u6D3B\u52A8\u65F6\u95F4\u7EBF\u3002", + title: "{case_number} \xB7 {subject}", + subtitle: "{crm_account}", + components: { + case_highlights: { label: "\u5173\u952E\u4FE1\u606F" }, + case_status_path: { label: "\u5DE5\u5355\u72B6\u6001\u8FDB\u5EA6" }, + case_details: { label: "\u5DE5\u5355\u660E\u7EC6" } + } + }, + lead_detail_page: { + label: "\u7EBF\u7D22\u8BE6\u60C5", + description: "\u5B8C\u6574\u7684\u7EBF\u7D22\u8BE6\u60C5\u9875\uFF0C\u5305\u542B\u5173\u952E\u4FE1\u606F\u3001\u660E\u7EC6\u4E0E\u76F8\u5173\u8BB0\u5F55\u3002", + title: "{first_name} {last_name}", + subtitle: "{company}", + components: { + lead_duplicate_alert_confirmed: { label: "\u5DF2\u786E\u8BA4\u91CD\u590D\u63D0\u9192" }, + lead_duplicate_alert_suspected: { label: "\u7591\u4F3C\u91CD\u590D\u63D0\u9192" }, + lead_highlights: { label: "\u5173\u952E\u4FE1\u606F" }, + lead_path: { label: "\u7EBF\u7D22\u72B6\u6001\u8FDB\u5EA6" }, + main_tabs: { label: "\u7EBF\u7D22\u4FE1\u606F\u6807\u7B7E\u9875" }, + lead_details: { label: "\u7EBF\u7D22\u660E\u7EC6" }, + related_accordion: { label: "\u76F8\u5173\u8BB0\u5F55" }, + related_tasks: { title: "\u5F85\u529E\u4EFB\u52A1", label: "\u4EFB\u52A1" }, + lead_activity: { label: "\u6D3B\u52A8\u65F6\u95F4\u7EBF" }, + lead_history: { label: "\u5B57\u6BB5\u5386\u53F2" } + } + }, + opportunity_detail_page: { + label: "\u5546\u673A\u8BE6\u60C5", + description: "\u5B8C\u6574\u7684\u5546\u673A\u8BE6\u60C5\u9875\uFF0C\u5305\u542B\u9636\u6BB5\u8FDB\u5EA6\u3001\u5173\u952E\u4FE1\u606F\u3001\u660E\u7EC6\u4E0E\u76F8\u5173\u5217\u8868\u3002", + title: "{name}", + subtitle: "{crm_account}", + components: { + opp_highlights: { label: "\u5173\u952E\u4FE1\u606F" }, + opp_stage_path: { label: "\u5546\u673A\u9636\u6BB5\u8FDB\u5EA6" }, + opp_details: { label: "\u5546\u673A\u660E\u7EC6" } + } + }, + sales_home_page: { + label: "\u9500\u552E\u4E3B\u9875", + description: "\u9500\u552E\u56E2\u961F\u4E3B\u9875\uFF0C\u6C47\u603B\u5173\u952E\u6307\u6807\u4E0E\u5FEB\u6377\u64CD\u4F5C", + title: "\u9500\u552E\u770B\u677F", + subtitle: "\u6B22\u8FCE\u56DE\u6765", + components: { + kpi_revenue_won: { + label: "\u8D62\u5355\u8425\u6536" + }, + kpi_deals_won: { + label: "\u8D62\u5355\u6570" + }, + kpi_pipeline_value: { + label: "\u9500\u552E\u7BA1\u9053\u91D1\u989D" + }, + kpi_open_leads: { + label: "\u5F00\u653E\u7EBF\u7D22" + }, + home_upcoming_events: { + label: "\u{1F4C5} \u5373\u5C06\u5F00\u59CB \xB7 \u6700\u8FD1\u4F18\u5148" + }, + quick_create: { title: "\u5FEB\u901F\u521B\u5EFA", label: "\u5FEB\u901F\u521B\u5EFA" }, + key_metrics: { title: "\u5173\u952E\u7EE9\u6548\u6307\u6807", label: "\u5173\u952E\u6307\u6807" }, + home_tabs: { label: "\u4E3B\u9875\u6807\u7B7E\u9875" }, + home_my_leads: { label: "\u6211\u7684\u7EBF\u7D22" }, + home_my_deals: { label: "\u6211\u7684\u8FDB\u884C\u4E2D\u5546\u673A" }, + home_my_tasks: { label: "\u6211\u7684\u5F85\u529E\u4EFB\u52A1" }, + ai_briefing: { + title: "\u8BE2\u95EE AI \u52A9\u624B", + label: "AI \u52A9\u624B\u4ECA\u65E5\u901F\u89C8" + }, + upcoming_events: { title: "\u5373\u5C06\u5F00\u59CB\u7684\u6D3B\u52A8", label: "\u5373\u5C06\u5F00\u59CB\u7684\u6D3B\u52A8" } + } + }, + utility_bar_page: { + label: "\u5DE5\u5177\u680F", + description: "\u60AC\u6D6E\u5DE5\u5177\u7684\u5FEB\u6377\u8BBF\u95EE\u680F", + components: { + notifications_panel: { label: "\u901A\u77E5" }, + quick_notes: { title: "\u5FEB\u901F\u7B14\u8BB0", label: "\u5FEB\u901F\u7B14\u8BB0" }, + quick_search: { label: "\u5FEB\u901F\u641C\u7D22" } + } + } + }, + // Screen-flow copy (#1210, #1975). Keyed `flows..label`, + // `screens..title` and `screens..fields..{label,placeholder}` + // — the keys `os lint`'s `i18n/missing-flow` names, read by the console's + // flow runner since @objectstack 17.7.0 (the spec's `flows` liveness row is + // `live` there). A screen with no authored `title` shows its flow's label in + // every locale, so each `screen_1.title` repeats the flow label. Since + // 18.0.0-next.0 three more surfaces are keys the engine reads in the run's + // locale, and `i18n/missing-flow` names each missing one: a select field's + // `options.` (worded as the object field's own option in this pack), + // an authored screen `description`, and a refusing `end` node's + // `refusals..message`. A translated description or message is a text + // slot like the one it translates, so a hole in it is `{{ }}`. + // The discount ceiling is interpolated from `QUOTE_DISCOUNT_CEILING`, never + // retyped: the number lives in `_thresholds.ts` alone (#1711). + flows: { + campaign_enrollment: { + label: "\u5C06\u6210\u5458\u52A0\u5165\u8425\u9500\u6D3B\u52A8", + screens: { + screen_1: { + title: "\u5C06\u6210\u5458\u52A0\u5165\u8425\u9500\u6D3B\u52A8", + fields: { + memberSource: { label: "\u52A0\u5165\u7684\u6210\u5458\u7C7B\u578B", options: { leads: "\u7EBF\u7D22", contacts: "\u8054\u7CFB\u4EBA" } }, + leadStatus: { label: "\u52A0\u5165\u4EE5\u4E0B\u72B6\u6001\u7684\u7EBF\u7D22", options: { new: "\u65B0\u5EFA", contacted: "\u5DF2\u8054\u7CFB", qualified: "\u5DF2\u786E\u8BA4" } }, + contactDepartment: { + label: "\u52A0\u5165\u4EE5\u4E0B\u90E8\u95E8\u7684\u8054\u7CFB\u4EBA", + options: { executive: "\u7BA1\u7406\u5C42", sales: "\u9500\u552E\u90E8", marketing: "\u5E02\u573A\u90E8", engineering: "\u5DE5\u7A0B\u90E8", support: "\u652F\u6301\u90E8", finance: "\u8D22\u52A1\u90E8", hr: "\u4EBA\u529B\u8D44\u6E90", operations: "\u8FD0\u8425\u90E8" } + } + } + } + } + }, + escalate_case: { + label: "\u5347\u7EA7\u5DE5\u5355", + screens: { screen_1: { title: "\u5347\u7EA7\u5DE5\u5355", fields: { reason: { label: "\u5347\u7EA7\u539F\u56E0" } } } } + }, + close_case: { + label: "\u5173\u95ED\u5DE5\u5355", + screens: { + screen_1: { + title: "\u5173\u95ED\u5DE5\u5355", + fields: { + resolution: { label: "\u89E3\u51B3\u65B9\u6848" }, + resolved_by_article: { label: "\u901A\u8FC7\u77E5\u8BC6\u6587\u7AE0\u89E3\u51B3\uFF08\u53EF\u9009\uFF09" } + } + } + } + }, + claim_case: { + label: "\u8BA4\u9886\u5DE5\u5355", + screens: { + screen_1: { + title: "\u8BA4\u9886\u5DE5\u5355", + fields: { + claimStatus: { + label: "\u5904\u7406\u72B6\u6001", + options: { in_progress: "\u5904\u7406\u4E2D", waiting_customer: "\u7B49\u5F85\u5BA2\u6237\u56DE\u590D", waiting_support: "\u7B49\u5F85\u652F\u6301\u56DE\u590D" } + } + } + } + } + }, + lead_conversion: { + label: "\u7EBF\u7D22\u8F6C\u5316\u6D41\u7A0B", + screens: { + screen_1: { + title: "\u7EBF\u7D22\u8F6C\u5316\u6D41\u7A0B", + // The duplicate warning's text is a variable the flow assigns; this + // key can only carry the hole that shows it. + description: "{{duplicateWarning}}", + fields: { + createOpportunity: { label: "\u662F\u5426\u521B\u5EFA\u5546\u673A\uFF1F" }, + opportunityName: { label: "\u5546\u673A\u540D\u79F0" }, + opportunityAmount: { label: "\u5546\u673A\u91D1\u989D" }, + closeDate: { label: "\u9884\u8BA1\u6210\u4EA4\u65E5\u671F" } + } + }, + refuse_confirmed_duplicate: { + title: "\u8F6C\u5316\u88AB\u62D2\u7EDD", + description: "\u8BE5\u7EBF\u7D22\u7684\u300C\u91CD\u590D\u72B6\u6001\u300D\u4E3A\u300C\u5DF2\u786E\u8BA4\u91CD\u590D\u300D\uFF1A\u5BA1\u6838\u4EBA\u5DF2\u5C06\u5176\u4E0E\u73B0\u6709\u8BB0\u5F55\u6BD4\u5BF9\uFF0C\u5E76\u8BB0\u5F55\u4E3A\u91CD\u590D\u3002\u8F6C\u5316\u4F1A\u4E3A\u540C\u4E00\u4E70\u5BB6\u518D\u521B\u5EFA\u4E00\u4E2A\u5BA2\u6237\u3001\u8054\u7CFB\u4EBA\u548C\u5546\u673A\u3002\u672C\u7EBF\u7D22\u7684\u300C\u91CD\u590D\u7EBF\u7D22\u7BA1\u7406\u300D\u90E8\u5206\u5217\u51FA\u4E86\u4FDD\u7559\u7684\u8BB0\u5F55\uFF1B\u8BF7\u6539\u4E3A\u4EE5\u91CD\u590D\u4E3A\u7531\u5C06\u6B64\u7EBF\u7D22\u8BBE\u4E3A\u300C\u672A\u901A\u8FC7\u300D\u3002\u53EA\u6709\u5BA1\u6838\u4EBA\u4FEE\u6539\u8BE5\u7ED3\u8BBA\u540E\u624D\u80FD\u91CD\u65B0\u8F6C\u5316\u3002" + }, + refuse_unapproved: { + title: "\u8F6C\u5316\u88AB\u62D2\u7EDD", + description: "\u8BE5\u7EBF\u7D22\u5C1A\u672A\u83B7\u51C6\u8F6C\u5316\u3002\u5FC5\u987B\u7531\u5BA1\u6279\u4EBA\u6279\u51C6\u540E\uFF0C\u624D\u80FD\u8F6C\u5316\u4E3A\u5BA2\u6237\u3001\u8054\u7CFB\u4EBA\u548C\u5546\u673A\uFF1B\u7EBF\u7D22\u4E0A\u7684\u300C\u8F6C\u5316\u5BA1\u6279\u300D\u5B57\u6BB5\u663E\u793A\u8BE5\u51B3\u5B9A\u4ECD\u5728\u5F85\u5BA1\u6279\u8FD8\u662F\u5DF2\u88AB\u9A73\u56DE\u3002\u5728\u6B64\u671F\u95F4\u8BF7\u7EE7\u7EED\u8DDF\u8FDB\u8BE5\u7EBF\u7D22\u2014\u2014\u5B83\u7684\u4EFB\u4F55\u5185\u5BB9\u90FD\u6CA1\u6709\u88AB\u51BB\u7ED3\u3002" + }, + refuse_no_match_key: { + title: "\u8F6C\u5316\u88AB\u62D2\u7EDD", + description: "\u8BE5\u7EBF\u7D22\u7684\u516C\u53F8\u6CA1\u6709\u5339\u914D\u952E\uFF0C\u56E0\u6B64\u8F6C\u5316\u65E0\u6CD5\u5224\u65AD\u5B83\u5C5E\u4E8E\u54EA\u4E2A\u5BA2\u6237\uFF0C\u4E5F\u4E0D\u4F1A\u53BB\u731C\u6D4B\uFF1A\u731C\u6D4B\u53EF\u80FD\u4F1A\u628A\u8054\u7CFB\u4EBA\u548C\u5546\u673A\u5F52\u5230\u53E6\u4E00\u4E2A\u5BA2\u6237\u540D\u4E0B\u3002\u4FDD\u5B58\u7EBF\u7D22\u7684\u300C\u516C\u53F8\u300D\u4F1A\u91CD\u65B0\u751F\u6210\u5339\u914D\u952E\uFF0C\u8BF7\u91CD\u65B0\u4FDD\u5B58\u540E\u518D\u8F6C\u5316\u3002\u5C1A\u672A\u521B\u5EFA\u4EFB\u4F55\u8BB0\u5F55\u3002" + } + } + }, + schedule_followup: { + label: "\u5B89\u6392\u8DDF\u8FDB", + screens: { + screen_1: { + title: "\u5B89\u6392\u8DDF\u8FDB", + fields: { + subject: { label: "\u4E0B\u4E00\u6B65\u505A\u4EC0\u4E48\uFF1F" }, + dueDate: { label: "\u622A\u6B62\u65E5\u671F" }, + activityType: { + label: "\u6D3B\u52A8\u7C7B\u578B", + options: { call: "\u7535\u8BDD", email: "\u90AE\u4EF6", meeting: "\u4F1A\u8BAE", follow_up: "\u8DDF\u8FDB", demo: "\u6F14\u793A", other: "\u5176\u4ED6" } + }, + priority: { label: "\u4F18\u5148\u7EA7", options: { low: "\u4F4E", normal: "\u666E\u901A", high: "\u9AD8", urgent: "\u7D27\u6025" } }, + notes: { label: "\u5907\u6CE8" } + } + } + } + }, + quote_generation: { + label: "\u4ECE\u5546\u673A\u751F\u6210\u62A5\u4EF7\u5355", + refusals: { refuse_held: { message: "\u9700\u5148\u5B8C\u6210\u7ACB\u9879\u5BA1\u6279\uFF1A\u8BF7\u52FE\u9009\u300C\u7533\u8BF7\u7ACB\u9879\u5BA1\u6279\u300D\u3002\u5C1A\u672A\u521B\u5EFA\u4EFB\u4F55\u5185\u5BB9\u3002" } }, + screens: { + screen_1: { + title: "\u4ECE\u5546\u673A\u751F\u6210\u62A5\u4EF7\u5355", + fields: { + quoteName: { label: "\u62A5\u4EF7\u540D\u79F0" }, + expirationDays: { label: "\u6709\u6548\u671F\uFF08\u5929\uFF09" }, + discount: { label: `\u6298\u6263 % (\u2264 ${QUOTE_DISCOUNT_CEILING})`, placeholder: `0-${QUOTE_DISCOUNT_CEILING}` } + } + } + } + } + } +}; + +// src/sales/translations/zh-CN/_shared.ts +var activityActions2 = { + log_call: { + label: "\u8BB0\u5F55\u901A\u8BDD", + successMessage: "\u901A\u8BDD\u8BB0\u5F55\u6210\u529F\uFF01", + params: { + subject: { label: "\u901A\u8BDD\u4E3B\u9898" }, + duration: { label: "\u65F6\u957F\uFF08\u5206\u949F\uFF09" }, + attendee_contacts: { label: "\u8054\u7CFB\u4EBA\u53C2\u4E0E\u8005" }, + attendee_users: { label: "\u5185\u90E8\u53C2\u4E0E\u8005" }, + notes: { label: "\u901A\u8BDD\u8BB0\u5F55" } + } + }, + log_meeting: { + label: "\u8BB0\u5F55\u4F1A\u8BAE", + successMessage: "\u4F1A\u8BAE\u8BB0\u5F55\u6210\u529F\uFF01", + params: { + subject: { label: "\u4F1A\u8BAE\u4E3B\u9898" }, + duration: { label: "\u65F6\u957F\uFF08\u5206\u949F\uFF09" }, + attendee_contacts: { label: "\u8054\u7CFB\u4EBA\u53C2\u4F1A\u4EBA" }, + attendee_users: { label: "\u5185\u90E8\u53C2\u4F1A\u4EBA" }, + notes: { label: "\u4F1A\u8BAE\u7EAA\u8981" } + } + }, + schedule_meeting: { + label: "\u5B89\u6392\u4F1A\u8BAE", + successMessage: "\u4F1A\u8BAE\u5DF2\u5B89\u6392\uFF01", + params: { + subject: { label: "\u4F1A\u8BAE\u4E3B\u9898" }, + start_date: { label: "\u5F00\u59CB\u65E5\u671F\uFF08UTC\uFF09" }, + start_time: { label: "\u5F00\u59CB\u65F6\u95F4\uFF08UTC\uFF09" }, + location: { label: "\u5730\u70B9" }, + duration: { label: "\u65F6\u957F\uFF08\u5206\u949F\uFF09" }, + attendee_contacts: { label: "\u8054\u7CFB\u4EBA\u53C2\u4F1A\u4EBA" }, + attendee_users: { label: "\u5185\u90E8\u53C2\u4F1A\u4EBA" }, + notes: { label: "\u4F1A\u8BAE\u8BAE\u7A0B" } + } + } +}; + +// src/sales/translations/zh-CN/objects.customer.ts +var customer2 = { + crm_account: { + label: "\u5BA2\u6237", + pluralLabel: "\u5BA2\u6237", + description: "\u4E0E\u6211\u4EEC\u6709\u4E1A\u52A1\u5F80\u6765\u7684\u516C\u53F8\u548C\u7EC4\u7EC7", + fields: { + account_number: { label: "\u5BA2\u6237\u7F16\u53F7" }, + registration_number: { + label: "\u767B\u8BB0\u8BC1\u4EF6\u53F7", + help: "\u5BF9\u65B9\u5728\u5176\u6240\u5C5E\u653F\u5E9C\u767B\u8BB0\u673A\u5173\u53D6\u5F97\u7684\u767B\u8BB0\u6807\u8BC6\u3002\u4E0D\u540C\u4E8E\u7531\u6211\u65B9\u53D1\u653E\u7684\u5BA2\u6237\u7F16\u53F7\u3002" + }, + commercial_capability: { + label: "\u5546\u52A1\u80FD\u529B", + help: "\u8BE5\u5BA2\u6237\u662F\u5426\u53EF\u4EE5\u627F\u63A5\u65B0\u4E1A\u52A1\u3002\u4EC5\u7ED3\u7B97\u7C7B\u5BA2\u6237\u4F9D\u7136\u53EF\u7528\u4E8E\u5F00\u7968\u4E0E\u6536\u4ED8\u6B3E\uFF0C\u4F46\u4E0D\u80FD\u5173\u8054\u65B0\u7684\u5546\u673A\u3002", + options: { full: "\u5B8C\u6574", settlement_only: "\u4EC5\u7ED3\u7B97" } + }, + incumbent_vendor: { label: "\u73B0\u6709\u4F9B\u5E94\u5546", help: "\u5F53\u524D\u627F\u63A5\u8BE5\u5BA2\u6237\u8FD9\u90E8\u5206\u652F\u51FA\u7684\u4F9B\u5E94\u5546\u3002" }, + annual_purchasing_budget: { label: "\u5E74\u5EA6\u91C7\u8D2D\u9884\u7B97", help: "\u8BE5\u5BA2\u6237\u672C\u5E74\u5EA6\u9884\u8BA1\u5411\u4F9B\u5E94\u5546\u652F\u51FA\u7684\u91D1\u989D\uFF0C\u800C\u975E\u5176\u81EA\u8EAB\u8425\u6536\u3002" }, + payment_cycle: { + label: "\u4ED8\u6B3E\u5468\u671F", + options: { prepaid: "\u9884\u4ED8", net_30: "30 \u5929", net_60: "60 \u5929", net_90: "90 \u5929" } + }, + approval_status: { + label: "\u5BA1\u6279\u72B6\u6001", + help: "\u8BE5\u5BA2\u6237\u7684\u5BA1\u6279\u8FDB\u5C55\u3002\u65B0\u5EFA\u5BA2\u6237\u521D\u59CB\u4E3A\u5F85\u5BA1\u6279\uFF0C\u5E76\u5728\u5BA1\u6279\u6536\u4EF6\u7BB1\u4E2D\u88C1\u5B9A\u3002", + options: { pending: "\u5F85\u5BA1\u6279", approved: "\u5DF2\u901A\u8FC7", rejected: "\u5DF2\u9A73\u56DE" } + }, + name: { label: "\u5BA2\u6237\u540D\u79F0", help: "\u516C\u53F8\u6216\u7EC4\u7EC7\u7684\u6CD5\u5B9A\u540D\u79F0" }, + type: { + label: "\u7C7B\u578B", + options: { prospect: "\u6F5C\u5728\u5BA2\u6237", customer: "\u6B63\u5F0F\u5BA2\u6237", partner: "\u5408\u4F5C\u4F19\u4F34", former: "\u524D\u5BA2\u6237" } + }, + industry: { + label: "\u884C\u4E1A", + options: { + technology: "\u79D1\u6280", + software: "\u8F6F\u4EF6 / SaaS", + finance: "\u91D1\u878D", + healthcare: "\u533B\u7597", + retail: "\u96F6\u552E", + manufacturing: "\u5236\u9020", + education: "\u6559\u80B2", + real_estate: "\u623F\u5730\u4EA7", + media: "\u4F20\u5A92\u5A31\u4E50", + logistics: "\u7269\u6D41", + hospitality: "\u9152\u5E97\u65C5\u6E38", + energy: "\u80FD\u6E90\u516C\u7528\u4E8B\u4E1A", + government: "\u653F\u5E9C", + nonprofit: "\u975E\u8425\u5229", + other: "\u5176\u4ED6" + } + }, + annual_revenue: { label: "\u5E74\u8425\u6536" }, + child_account_revenue: { label: "\u5B50\u516C\u53F8\u5E74\u8425\u6536\u5408\u8BA1", help: "\u672C\u5BA2\u6237\u76F4\u5C5E\u5B50\u516C\u53F8\u7684\u5E74\u8425\u6536\u5408\u8BA1\u3002" }, + number_of_employees: { label: "\u5458\u5DE5\u4EBA\u6570" }, + phone: { label: "\u7535\u8BDD" }, + website: { label: "\u7F51\u7AD9" }, + billing_address: { label: "\u8D26\u5355\u5730\u5740" }, + billing_country: { + label: "\u8D26\u5355\u56FD\u5BB6", + help: "\u7531\u8D26\u5355\u5730\u5740\u63A8\u5BFC\u2014\u2014\u6309\u5F55\u5165\u539F\u6837\u53BB\u9664\u9996\u5C3E\u7A7A\u683C\u5E76\u8F6C\u4E3A\u5927\u5199\u3002" + }, + territory: { + label: "\u9500\u552E\u533A\u57DF", + help: "\u7531\u8D26\u5355\u5730\u5740\u63A8\u5BFC\u2014\u2014\u533A\u57DF\u5171\u4EAB\u89C4\u5219\u636E\u6B64\u5339\u914D\u3002\u4E0D\u5C5E\u4E8E\u5DF2\u914D\u7F6E\u533A\u57DF\u7684\u5BA2\u6237\u4E3A\u201C\u5176\u4ED6\u201D\u3002", + options: { na: "\u5317\u7F8E", emea: "\u6B27\u6D32\u3001\u4E2D\u4E1C\u4E0E\u975E\u6D32", other: "\u5176\u4ED6" } + }, + office_location: { label: "\u529E\u516C\u5730\u70B9" }, + owner_id: { label: "\u5BA2\u6237\u8D1F\u8D23\u4EBA" }, + parent_account: { label: "\u6BCD\u516C\u53F8", help: "\u5C42\u7EA7\u7ED3\u6784\u4E2D\u7684\u6BCD\u516C\u53F8" }, + description: { label: "\u63CF\u8FF0" }, + is_active: { label: "\u662F\u5426\u6D3B\u8DC3" }, + last_activity_date: { label: "\u6700\u8FD1\u6D3B\u52A8\u65E5\u671F" }, + brand_color: { label: "\u54C1\u724C\u8272" }, + logo: { label: "\u516C\u53F8\u6807\u8BC6" }, + tier: { + label: "\u5BA2\u6237\u5206\u5C42", + options: { strategic: "\u6218\u7565\u5BA2\u6237", enterprise: "\u4F01\u4E1A\u5BA2\u6237", mid_market: "\u4E2D\u578B\u5BA2\u6237", smb: "\u4E2D\u5C0F\u5BA2\u6237" } + }, + segment: { + label: "\u5BA2\u6237\u7EC6\u5206", + options: { net_new: "\u5168\u65B0\u5BA2\u6237", growth: "\u589E\u957F\u5BA2\u6237", at_risk: "\u98CE\u9669\u5BA2\u6237", stable: "\u7A33\u5B9A\u5BA2\u6237" } + }, + health_score: { + label: "\u5065\u5EB7\u5EA6", + help: "\u5BA2\u6237\u6210\u529F\u7ECF\u7406\u7EF4\u62A4\u7684\u5065\u5EB7\u5EA6\u6307\u6807", + options: { healthy: "\u5065\u5EB7", watching: "\u5173\u6CE8", at_risk: "\u98CE\u9669", churning: "\u6D41\u5931\u4E2D" } + }, + name_normalized: { label: "\u5BA2\u6237\u540D\u79F0\uFF08\u89C4\u8303\u5316\uFF09", help: "\u7EBF\u7D22\u8F6C\u5316\u7684\u5339\u914D\u952E\uFF1A\u5BA2\u6237\u540D\u79F0\u8F6C\u5C0F\u5199\u3001\u53BB\u9664\u9996\u5C3E\u7A7A\u683C\u3001\u5185\u90E8\u8FDE\u7EED\u7A7A\u767D\u5408\u5E76\u4E3A\u4E00\u4E2A\u7A7A\u683C\u3002\u7531 account_protection \u94A9\u5B50\u7EF4\u62A4\u2014\u2014\u8BF7\u52FF\u76F4\u63A5\u7F16\u8F91\u3002" }, + display_title: { label: "\u663E\u793A\u540D\u79F0" } + }, + _views: { + all_accounts: { + label: "\u5168\u90E8\u5BA2\u6237", + description: "\u5BA2\u6237\u4E3B\u5217\u8868\uFF0C\u5305\u542B\u8425\u6536\u4E0E\u884C\u4E1A\u6458\u8981", + bulkActions: { + delete: { + label: "\u5220\u9664", + confirmLabel: "\u5220\u9664", + confirmText: "\u786E\u5B9A\u8981\u6C38\u4E45\u5220\u9664 {{count}} \u4E2A\u5BA2\u6237\u5417\uFF1F\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u9500\u3002" + }, + transfer_owner: { + label: "\u8F6C\u79FB\u8D1F\u8D23\u4EBA", + confirmText: "\u786E\u5B9A\u8981\u8F6C\u79FB {{count}} \u4E2A\u5BA2\u6237\u7684\u8D1F\u8D23\u4EBA\u5417\uFF1F", + params: { + owner_id: { + label: "\u65B0\u8D1F\u8D23\u4EBA" + } + } + }, + update_tier: { + label: "\u66F4\u65B0\u5BA2\u6237\u7B49\u7EA7", + confirmText: "\u786E\u5B9A\u8981\u5C06 {{count}} \u4E2A\u5BA2\u6237\u7684\u7B49\u7EA7\u66F4\u65B0\u4E3A {{tier}} \u5417\uFF1F", + params: { + tier: { + label: "\u5BA2\u6237\u7B49\u7EA7" + } + } + } + } + }, + account_gallery: { label: "\u5BA2\u6237\u5361\u7247", description: "\u4F7F\u7528\u54C1\u724C\u8272\u9AD8\u4EAE\u7684\u5BA2\u6237\u5361\u7247\u89C6\u56FE" }, + account_map: { label: "\u5BA2\u6237\u5730\u56FE", description: "\u5BA2\u6237\u7684\u5730\u7406\u5206\u5E03" }, + enterprise_accounts: { label: "\u4F01\u4E1A\u5BA2\u6237", description: "\u5E74\u8425\u6536\u6700\u9AD8\u7684\u5927\u5BA2\u6237" }, + my_accounts: { label: "\u6211\u7684\u5BA2\u6237", description: "\u7531\u5F53\u524D\u7528\u6237\u8D1F\u8D23\u7684\u5BA2\u6237" }, + at_risk_accounts: { label: "\u26A0\uFE0F \u98CE\u9669\u5BA2\u6237" } + }, + _sections: { + basic: { label: "\u57FA\u672C\u4FE1\u606F" }, + financials: { label: "\u8D22\u52A1\u4FE1\u606F" }, + business_profile: { label: "\u4E1A\u52A1\u4FE1\u606F" }, + contact_info: { label: "\u8054\u7CFB\u4FE1\u606F" }, + ownership: { label: "\u5F52\u5C5E\u4E0E\u72B6\u6001" }, + branding: { label: "\u54C1\u724C" }, + system: { label: "\u7CFB\u7EDF" }, + // account.view.ts 表单区块名称 (#1100) + profile: { label: "\u8D44\u6599" }, + customer_success: { label: "\u5BA2\u6237\u6210\u529F" }, + locations: { label: "\u5730\u5740\u4FE1\u606F" }, + description: { label: "\u63CF\u8FF0" } + }, + _actions: { ...activityActions2 } + }, + crm_contact: { + label: "\u8054\u7CFB\u4EBA", + pluralLabel: "\u8054\u7CFB\u4EBA", + description: "\u5BA2\u6237\u4E0E\u5546\u673A\u7684\u5173\u952E\u4EBA\u7269\u8054\u7CFB\u4EBA", + fields: { + salutation: { + label: "\u79F0\u8C13", + options: { mr: "\u5148\u751F", ms: "\u5973\u58EB", mrs: "\u592B\u4EBA", dr: "\u535A\u58EB", prof: "\u6559\u6388" } + }, + first_name: { label: "\u540D" }, + last_name: { label: "\u59D3" }, + full_name: { label: "\u5168\u540D" }, + crm_account: { label: "\u6240\u5C5E\u5BA2\u6237" }, + email: { label: "\u90AE\u7BB1" }, + phone: { label: "\u7535\u8BDD" }, + mobile: { label: "\u624B\u673A" }, + title: { label: "\u804C\u4F4D" }, + department: { + label: "\u90E8\u95E8", + options: { + executive: "\u7BA1\u7406\u5C42", + sales: "\u9500\u552E\u90E8", + marketing: "\u5E02\u573A\u90E8", + engineering: "\u5DE5\u7A0B\u90E8", + support: "\u652F\u6301\u90E8", + finance: "\u8D22\u52A1\u90E8", + hr: "\u4EBA\u529B\u8D44\u6E90", + operations: "\u8FD0\u8425\u90E8" + } + }, + // 采购决策圈 (REQ-0004)。英文标签是 'Buying Function' 而非 'Buying Role': + // 平台的 security-role-word 规则在对象声明上保留了英文 role 一词(ADR-0090 D3)。 + // 该规则只匹配英文,不读语言包,所以中文这里用本地读者真正在说的词。 + buying_function: { + label: "\u91C7\u8D2D\u89D2\u8272", + options: { + decision_maker: "\u51B3\u7B56\u8005", + economic_buyer: "\u9884\u7B97\u51B3\u7B56\u4EBA", + technical_evaluator: "\u6280\u672F\u8BC4\u4F30\u4EBA", + user: "\u4F7F\u7528\u8005", + influencer: "\u5F71\u54CD\u8005", + gatekeeper: "\u5B88\u95E8\u4EBA" + } + }, + attitude: { + label: "\u5BF9\u6211\u53F8\u6001\u5EA6", + options: { + champion: "\u62E5\u62A4\u8005", + supportive: "\u652F\u6301", + neutral: "\u4E2D\u7ACB", + skeptical: "\u5B58\u7591", + blocker: "\u53CD\u5BF9\u8005" + } + }, + relationship_strength: { + label: "\u4E0E\u9500\u552E\u5173\u7CFB\u5F3A\u5EA6", + options: { + distant: "\u758F\u8FDC", + acquaintance: "\u4E00\u822C\u8BA4\u8BC6", + working: "\u5DE5\u4F5C\u5F80\u6765", + strong: "\u5173\u7CFB\u7D27\u5BC6", + trusted_advisor: "\u53EF\u4FE1\u987E\u95EE" + } + }, + owner_id: { label: "\u8054\u7CFB\u4EBA\u8D1F\u8D23\u4EBA" }, + description: { label: "\u63CF\u8FF0" }, + is_primary: { label: "\u4E3B\u8981\u8054\u7CFB\u4EBA", help: "\u662F\u5426\u4E3A\u8BE5\u5BA2\u6237\u7684\u4E3B\u8981\u8054\u7CFB\u4EBA\uFF1F" }, + mailing_address: { label: "\u90AE\u5BC4\u5730\u5740" }, + lead_source: { + label: "\u7EBF\u7D22\u6765\u6E90", + options: { + web: "\u7F51\u7AD9", + referral: "\u63A8\u8350", + event: "\u6D3B\u52A8 / \u5C55\u4F1A", + webinar: "\u7EBF\u4E0A\u7814\u8BA8\u4F1A", + partner: "\u5408\u4F5C\u4F19\u4F34", + advertisement: "\u5E7F\u544A", + paid_search: "\u4ED8\u8D39\u641C\u7D22", + social: "\u793E\u4EA4\u5A92\u4F53", + content: "\u5185\u5BB9 / \u535A\u5BA2", + cold_call: "\u964C\u751F\u62DC\u8BBF", + email_campaign: "\u90AE\u4EF6\u8425\u9500", + other: "\u5176\u4ED6" + } + }, + do_not_call: { label: "\u7981\u6B62\u81F4\u7535" }, + email_opt_out: { label: "\u62D2\u7EDD\u90AE\u4EF6" }, + last_contacted_date: { label: "\u6700\u8FD1\u8054\u7CFB\u65F6\u95F4" }, + avatar: { label: "\u5934\u50CF" } + }, + _views: { + all_contacts: { label: "\u5168\u90E8\u8054\u7CFB\u4EBA" }, + contact_directory: { label: "\u8054\u7CFB\u4EBA\u76EE\u5F55" }, + primary_contacts: { label: "\u4E3B\u8981\u8054\u7CFB\u4EBA" } + }, + _actions: { + ...activityActions2, + mark_primary: { + label: "\u8BBE\u4E3A\u4E3B\u8981\u8054\u7CFB\u4EBA", + confirmText: "\u662F\u5426\u5C06\u6B64\u8054\u7CFB\u4EBA\u8BBE\u4E3A\u8BE5\u5BA2\u6237\u7684\u4E3B\u8981\u8054\u7CFB\u4EBA\uFF1F", + successMessage: "\u5DF2\u8BBE\u4E3A\u4E3B\u8981\u8054\u7CFB\u4EBA\uFF01" + }, + send_email: { + label: "\u53D1\u9001\u90AE\u4EF6", + params: { + subject: { label: "\u4E3B\u9898" }, + body: { label: "\u6B63\u6587" } + } + }, + add_contact_to_campaign: { + label: "\u52A0\u5165\u8425\u9500\u6D3B\u52A8", + successMessage: "\u8054\u7CFB\u4EBA\u5DF2\u52A0\u5165\u8425\u9500\u6D3B\u52A8\uFF01", + params: { + crm_campaign: { label: "\u8425\u9500\u6D3B\u52A8" } + } + } + }, + _sections: { + identity: { label: "\u8EAB\u4EFD\u4FE1\u606F" }, + account_info: { label: "\u5BA2\u6237\u4E0E\u804C\u52A1" }, + buying_centre: { label: "\u91C7\u8D2D\u51B3\u7B56\u5708" }, + contact_info: { label: "\u8054\u7CFB\u65B9\u5F0F" }, + mailing_address: { label: "\u90AE\u5BC4\u5730\u5740" }, + additional: { label: "\u9644\u52A0\u4FE1\u606F" }, + preferences: { label: "\u6C9F\u901A\u504F\u597D" }, + // contact.view.ts 表单区块名称 (#1100) + contact_details: { label: "\u8054\u7CFB\u4FE1\u606F" }, + comm_preferences: { label: "\u504F\u597D\u8BBE\u7F6E" } + } + } +}; + +// src/sales/translations/zh-CN/objects.pipeline.ts +var pipeline2 = { + crm_lead: { + _validations: { + disqualification_reason_required: { + message: "\u7EBF\u7D22\u6807\u8BB0\u4E3A\u4E0D\u5408\u683C\u65F6\u5FC5\u987B\u586B\u5199\u53D6\u6D88\u8D44\u683C\u539F\u56E0" + }, + duplicate_disqualification_requires_survivor: { + message: "\u4EE5\u91CD\u590D\u4E3A\u7531\u53D6\u6D88\u7EBF\u7D22\u8D44\u683C\u65F6\uFF0C\u5FC5\u987B\u6307\u660E\u4FDD\u7559\u7684\u8BB0\u5F55\u5E76\u5C06\u91CD\u590D\u72B6\u6001\u8BBE\u4E3A\u5DF2\u786E\u8BA4" + }, + email_required: { + message: "\u7535\u5B50\u90AE\u4EF6\u4E3A\u5FC5\u586B\u9879" + }, + lead_status_progression: { + message: "\u65E0\u6548\u7684\u7EBF\u7D22\u72B6\u6001\u6D41\u8F6C" + } + }, + label: "\u7EBF\u7D22", + pluralLabel: "\u7EBF\u7D22", + description: "\u5C1A\u672A\u786E\u8BA4\u7684\u6F5C\u5728\u5BA2\u6237", + fields: { + salutation: { + label: "\u79F0\u8C13", + options: { mr: "\u5148\u751F", ms: "\u5973\u58EB", mrs: "\u592B\u4EBA", dr: "\u535A\u58EB", prof: "\u6559\u6388" } + }, + first_name: { label: "\u540D" }, + last_name: { label: "\u59D3" }, + full_name: { label: "\u5168\u540D" }, + company: { label: "\u516C\u53F8" }, + title: { label: "\u804C\u4F4D" }, + email: { label: "\u90AE\u7BB1" }, + phone: { label: "\u7535\u8BDD" }, + industry: { + label: "\u884C\u4E1A", + options: { + technology: "\u79D1\u6280", + software: "\u8F6F\u4EF6 / SaaS", + finance: "\u91D1\u878D", + healthcare: "\u533B\u7597", + retail: "\u96F6\u552E", + manufacturing: "\u5236\u9020", + education: "\u6559\u80B2", + real_estate: "\u623F\u5730\u4EA7", + media: "\u4F20\u5A92\u5A31\u4E50", + logistics: "\u7269\u6D41", + hospitality: "\u9152\u5E97\u65C5\u6E38", + energy: "\u80FD\u6E90\u516C\u7528\u4E8B\u4E1A", + government: "\u653F\u5E9C", + nonprofit: "\u975E\u8425\u5229", + other: "\u5176\u4ED6" + } + }, + status: { + label: "\u72B6\u6001", + options: { + // 已确认 / 未通过 是同一个动作(线索确认)的正反两面;原先的 + // 已确认 / 不合格 出自两套说法,在状态条上并排时读起来不成对。 + new: "\u65B0\u5EFA", + contacted: "\u5DF2\u8054\u7CFB", + qualified: "\u5DF2\u786E\u8BA4", + unqualified: "\u672A\u901A\u8FC7", + converted: "\u5DF2\u8F6C\u5316" + } + }, + lead_source: { + label: "\u7EBF\u7D22\u6765\u6E90", + options: { + web: "\u7F51\u7AD9", + referral: "\u63A8\u8350", + event: "\u6D3B\u52A8 / \u5C55\u4F1A", + webinar: "\u7EBF\u4E0A\u7814\u8BA8\u4F1A", + partner: "\u5408\u4F5C\u4F19\u4F34", + advertisement: "\u5E7F\u544A", + paid_search: "\u4ED8\u8D39\u641C\u7D22", + social: "\u793E\u4EA4\u5A92\u4F53", + content: "\u5185\u5BB9 / \u535A\u5BA2", + cold_call: "\u964C\u751F\u62DC\u8BBF", + email_campaign: "\u90AE\u4EF6\u8425\u9500", + other: "\u5176\u4ED6" + } + }, + owner_id: { label: "\u7EBF\u7D22\u8D1F\u8D23\u4EBA" }, + is_converted: { label: "\u5DF2\u8F6C\u5316" }, + description: { label: "\u63CF\u8FF0" }, + mobile: { label: "\u624B\u673A" }, + website: { label: "\u7F51\u7AD9" }, + rating: { label: "\u7EBF\u7D22\u8BC4\u5206", help: "\u7EBF\u7D22\u8D28\u91CF\u8BC4\u5206\uFF081-5 \u661F\uFF09" }, + converted_account: { label: "\u8F6C\u5316\u5BA2\u6237" }, + converted_contact: { label: "\u8F6C\u5316\u8054\u7CFB\u4EBA" }, + converted_opportunity: { label: "\u8F6C\u5316\u5546\u673A" }, + converted_date: { label: "\u8F6C\u5316\u65E5\u671F" }, + address: { label: "\u5730\u5740" }, + annual_revenue: { label: "\u5E74\u8425\u6536" }, + number_of_employees: { label: "\u5458\u5DE5\u4EBA\u6570" }, + notes: { label: "\u5907\u6CE8", help: "\u672C\u7EBF\u7D22\u7684\u5DE5\u4F5C\u5907\u6CE8\u2014\u2014\u652F\u6301\u683C\u5F0F\u6392\u7248\u3002" }, + do_not_call: { label: "\u7981\u6B62\u81F4\u7535" }, + email_opt_out: { label: "\u62D2\u6536\u90AE\u4EF6" }, + disqualification_reason: { + // 状态里的 unqualified 译作「未通过」,所以这里跟着叫「未通过原因」 + // 而不是「取消资格原因」—— 两个字段在同一张表单上下相邻,用词必须成对。 + label: "\u672A\u901A\u8FC7\u539F\u56E0", + help: "\u72B6\u6001\u4E3A\u300C\u672A\u901A\u8FC7\u300D\u65F6\u5FC5\u586B", + options: { + not_a_fit: "\u9700\u6C42\u4E0D\u5339\u914D", + no_budget: "\u9884\u7B97\u4E0D\u8DB3", + wrong_persona: "\u8054\u7CFB\u4EBA\u89D2\u8272\u4E0D\u7B26", + unreachable: "\u65E0\u6CD5\u8054\u7CFB", + duplicate: "\u91CD\u590D\u7EBF\u7D22", + competitor: "\u9009\u62E9\u4E86\u7ADE\u4E89\u5BF9\u624B", + other: "\u5176\u4ED6" + } + }, + duplicate_of_type: { + help: "\u4FDD\u7559\u4E0B\u6765\u7684\u90A3\u6761\u8BB0\u5F55\u6240\u5C5E\u7684\u5BF9\u8C61\u7C7B\u578B\u3002", + label: "\u91CD\u590D\u4E8E", + // `erased` 是墓碑值,不是可选项:表单不提供它(见 + // `src/sales/views/lead.view.ts`),但幸存记录被删除后线索会带着它, + // 所以凡是读取记录的地方都需要标签,否则会显示原始值 `erased`。 + options: { crm_lead: "\u7EBF\u7D22", crm_contact: "\u8054\u7CFB\u4EBA", erased: "\u8BB0\u5F55\u5DF2\u5220\u9664" } + }, + duplicate_of_lead: { label: "\u91CD\u590D\u7684\u7EBF\u7D22" }, + duplicate_of_contact: { label: "\u91CD\u590D\u7684\u8054\u7CFB\u4EBA" }, + duplicate_status: { + help: "\u7591\u4F3C = \u5F55\u5165\u65F6\u81EA\u52A8\u6807\u8BB0\uFF1B\u5DF2\u786E\u8BA4 = \u4EBA\u5DE5\u6838\u5B9E\u8FC7\u5339\u914D\u3002", + // 疑似 = 录入时自动标记;已确认 = 人工核对后的判定。两者是同一 + // 判断的两个阶段,所以共用一个字段而不是各占一套链接字段。 + label: "\u91CD\u590D\u72B6\u6001", + options: { suspected: "\u7591\u4F3C\u91CD\u590D", confirmed: "\u5DF2\u786E\u8BA4\u91CD\u590D" } + }, + display_title: { label: "\u663E\u793A\u540D\u79F0" }, + company_normalized: { label: "\u516C\u53F8\u540D\u79F0\uFF08\u89C4\u8303\u5316\uFF09", help: "\u7EBF\u7D22\u8F6C\u5316\u7684\u5339\u914D\u952E\uFF1A\u516C\u53F8\u540D\u79F0\u8F6C\u5C0F\u5199\u3001\u53BB\u9664\u9996\u5C3E\u7A7A\u683C\u3001\u5185\u90E8\u8FDE\u7EED\u7A7A\u767D\u5408\u5E76\u4E3A\u4E00\u4E2A\u7A7A\u683C\u3002\u7531 lead_duplicate_check \u94A9\u5B50\u7EF4\u62A4\u2014\u2014\u8BF7\u52FF\u76F4\u63A5\u7F16\u8F91\u3002" }, + next_followup_date: { label: "\u4E0B\u6B21\u8DDF\u8FDB\u65E5\u671F" }, + last_contacted_date: { label: "\u6700\u8FD1\u8054\u7CFB\u65F6\u95F4" }, + need_type: { + label: "\u9700\u6C42\u7C7B\u578B", + help: "\u5BA2\u6237\u60F3\u8981\u4EC0\u4E48\u3002\u7EBF\u7D22\u5206\u6D3E\u3001\u4F18\u5148\u7EA7\u6392\u5E8F\u548C\u9700\u6C42\u5206\u6790\u90FD\u8BFB\u8FD9\u4E2A\u5B57\u6BB5\u3002", + options: { + new_implementation: "\u65B0\u5EFA\u5B9E\u65BD", + expansion: "\u6269\u5BB9\u589E\u8D2D", + replacement: "\u66FF\u6362\u8FC1\u79FB", + renewal: "\u7EED\u7EA6", + consulting: "\u54A8\u8BE2\u670D\u52A1", + support: "\u8FD0\u7EF4\u652F\u6301", + other: "\u5176\u4ED6" + } + }, + estimated_amount: { + label: "\u9884\u8BA1\u91D1\u989D", + help: "\u8D44\u683C\u5224\u5B9A\u4E4B\u524D\u5BF9\u8BE5\u9700\u6C42\u91D1\u989D\u7684\u4F30\u7B97\u3002\u8F6C\u5316\u65F6\u7528\u4E8E\u9884\u586B\u5546\u673A\u91D1\u989D\u3002" + }, + conversion_approval_status: { + label: "\u8F6C\u5316\u5BA1\u6279", + help: "\u8BE5\u7EBF\u7D22\u662F\u5426\u5DF2\u83B7\u51C6\u8F6C\u5316\u3002\u300C\u65E0\u9700\u5BA1\u6279\u300D\u8868\u793A\u4E0D\u8D70\u5BA1\u6279\u6D41\u7A0B\u2014\u2014\u8FD9\u662F\u4EA7\u54C1\u7684\u51FA\u5382\u9ED8\u8BA4\u503C\u3002", + options: { + not_required: "\u65E0\u9700\u5BA1\u6279", + pending: "\u5F85\u5BA1\u6279", + approved: "\u5BA1\u6279\u901A\u8FC7", + rejected: "\u5BA1\u6279\u9A73\u56DE" + } + } + }, + _views: { + all_leads: { + label: "\u5168\u90E8\u7EBF\u7D22", + emptyState: { title: "\u8FD8\u6CA1\u6709\u7EBF\u7D22", message: "\u521B\u5EFA\u7B2C\u4E00\u6761\u7EBF\u7D22\uFF0C\u4ECE\u8FD9\u91CC\u5F00\u59CB" } + }, + kanban_by_status: { label: "\u7EBF\u7D22\u6D41\u6C34\u7EBF" }, + calendar_by_created: { label: "\u7EBF\u7D22\u65E5\u5386" }, + gallery_view: { label: "\u7EBF\u7D22\u5361\u7247" }, + my_leads: { label: "\u6211\u7684\u7EBF\u7D22" }, + high_priority: { label: "\u9AD8\u4F18\u5148\u7EA7" }, + hot_leads: { label: "\u{1F525} \u9AD8\u70ED\u5EA6\u7EBF\u7D22" }, + suspected_duplicates: { + label: "\u7591\u4F3C\u91CD\u590D\u7EBF\u7D22", + emptyState: { title: "\u6CA1\u6709\u7591\u4F3C\u91CD\u590D", message: "\u65E0\u9700\u590D\u6838\u2014\u2014\u6BCF\u4E2A\u91CD\u590D\u5F55\u5165\u7684\u90AE\u7BB1\u90FD\u5DF2\u68C0\u67E5\u8FC7\u3002" } + } + }, + _sections: { + // Object-level section keys (lead.object.ts), used by record forms and + // by the detail page, whose sections reference these groups (#806) + address: { label: "\u5730\u5740" }, + identity: { label: "\u8EAB\u4EFD\u4FE1\u606F" }, + company_info: { label: "\u516C\u53F8\u4FE1\u606F" }, + contact_info: { label: "\u8054\u7CFB\u65B9\u5F0F" }, + qualification: { label: "\u8D44\u683C\u8BC4\u4F30" }, + assignment: { label: "\u5206\u914D" }, + additional: { label: "\u9644\u52A0\u4FE1\u606F" }, + preferences: { label: "\u6C9F\u901A\u504F\u597D" }, + conversion: { label: "\u8F6C\u5316" }, + duplicates: { label: "\u91CD\u590D\u7EBF\u7D22\u7BA1\u7406" }, + // lead.view.ts 表单区块名称 (#1100) —— 默认表单与每一个具名 formView + // 的区块名字都住在这里:那边新增一个表单,这里就补上它的区块名。 + contact_information: { label: "\u8054\u7CFB\u4FE1\u606F" }, + lead_classification: { label: "\u7EBF\u7D22\u5206\u7C7B" }, + company_information: { label: "\u516C\u53F8\u4FE1\u606F" }, + additional_information: { label: "\u9644\u52A0\u4FE1\u606F" }, + privacy: { label: "\u9690\u79C1" }, + general: { label: "\u5E38\u89C4\u4FE1\u606F" }, + details: { label: "\u8BE6\u60C5" }, + step_1_contact_details: { label: "\u7B2C\u4E00\u6B65\uFF1A\u8054\u7CFB\u65B9\u5F0F" }, + step_2_company_information: { label: "\u7B2C\u4E8C\u6B65\uFF1A\u516C\u53F8\u4FE1\u606F" }, + step_3_qualification: { label: "\u7B2C\u4E09\u6B65\uFF1A\u8D44\u8D28\u5BA1\u6838" }, + step_4_review_and_convert: { label: "\u7B2C\u56DB\u6B65\uFF1A\u5BA1\u6838\u5E76\u8F6C\u5316" }, + primary_information: { label: "\u4E3B\u8981\u4FE1\u606F" }, + extended_details: { label: "\u6269\u5C55\u4FE1\u606F" }, + quick_edit: { label: "\u5FEB\u901F\u7F16\u8F91" }, + update_lead_status: { label: "\u66F4\u65B0\u7EBF\u7D22\u72B6\u6001" }, + tell_us_about_yourself: { label: "\u8BF7\u4ECB\u7ECD\u4E00\u4E0B\u60A8\u81EA\u5DF1" }, + about_your_company: { label: "\u60A8\u7684\u516C\u53F8\u4FE1\u606F" }, + how_can_we_help: { label: "\u6211\u4EEC\u80FD\u5E2E\u60A8\u4EC0\u4E48\uFF1F" }, + lead_information: { label: "\u7EBF\u7D22\u4FE1\u606F" }, + address_information: { label: "\u5730\u5740\u4FE1\u606F" }, + privacy_preferences: { label: "\u9690\u79C1\u504F\u597D" } + }, + _actions: { + ...activityActions2, + convert_lead: { + label: "\u8F6C\u5316\u7EBF\u7D22", + successMessage: "\u7EBF\u7D22\u8F6C\u5316\u6210\u529F\uFF01" + }, + create_campaign: { + label: "\u52A0\u5165\u8425\u9500\u6D3B\u52A8", + successMessage: "\u5DF2\u5C06\u7EBF\u7D22\u52A0\u5165\u8425\u9500\u6D3B\u52A8\uFF01", + params: { + crm_campaign: { label: "\u8425\u9500\u6D3B\u52A8" } + } + }, + schedule_followup: { + label: "\u5B89\u6392\u8DDF\u8FDB", + successMessage: "\u8DDF\u8FDB\u4EFB\u52A1\u5DF2\u521B\u5EFA\u3002" + } + } + }, + crm_opportunity: { + _validations: { + amount_positive: { + message: "\u91D1\u989D\u5FC5\u987B\u5927\u4E8E\u96F6" + }, + close_date_future: { + message: "\u9664\u975E\u5546\u673A\u5DF2\u7ED3\u675F\uFF0C\u5426\u5219\u9884\u8BA1\u6210\u4EA4\u65E5\u4E0D\u5E94\u65E9\u4E8E\u4ECA\u5929" + }, + opportunity_stage_progression: { + message: "\u65E0\u6548\u7684\u5546\u673A\u9636\u6BB5\u6D41\u8F6C" + } + }, + label: "\u5546\u673A", + pluralLabel: "\u5546\u673A", + description: "\u9500\u552E\u6D41\u7A0B\u4E2D\u7684\u5546\u673A\u4E0E\u4EA4\u6613", + fields: { + name: { label: "\u5546\u673A\u540D\u79F0" }, + crm_account: { label: "\u6240\u5C5E\u5BA2\u6237" }, + primary_contact: { label: "\u4E3B\u8981\u8054\u7CFB\u4EBA" }, + owner_id: { label: "\u5546\u673A\u8D1F\u8D23\u4EBA" }, + amount: { label: "\u91D1\u989D" }, + expected_revenue: { label: "\u9884\u671F\u6536\u5165" }, + stage: { + label: "\u9636\u6BB5", + options: { + prospecting: "\u5BFB\u627E\u5BA2\u6237", + qualification: "\u8D44\u683C\u5BA1\u67E5", + needs_analysis: "\u9700\u6C42\u5206\u6790", + proposal: "\u63D0\u6848", + negotiation: "\u8C08\u5224", + closed_won: "\u6210\u4EA4", + closed_lost: "\u5931\u8D25" + } + }, + probability: { label: "\u6210\u4EA4\u6982\u7387 (%)" }, + close_date: { label: "\u9884\u8BA1\u6210\u4EA4\u65E5\u671F" }, + type: { + label: "\u7C7B\u578B", + options: { + new_business: "\u65B0\u4E1A\u52A1", + existing_upgrade: "\u8001\u5BA2\u6237\u5347\u7EA7", + existing_renewal: "\u8001\u5BA2\u6237\u7EED\u7EA6", + existing_expansion: "\u8001\u5BA2\u6237\u62D3\u5C55" + } + }, + forecast_category: { + label: "\u9884\u6D4B\u7C7B\u522B", + options: { + pipeline: "\u7BA1\u9053", + best_case: "\u6700\u4F73\u60C5\u51B5", + commit: "\u627F\u8BFA", + omitted: "\u5DF2\u6392\u9664", + closed: "\u5DF2\u5173\u95ED" + } + }, + description: { label: "\u63CF\u8FF0" }, + next_step: { label: "\u4E0B\u4E00\u6B65" }, + lead_source: { + label: "\u7EBF\u7D22\u6765\u6E90", + options: { + web: "\u7F51\u7AD9", + referral: "\u63A8\u8350", + event: "\u6D3B\u52A8 / \u5C55\u4F1A", + webinar: "\u7EBF\u4E0A\u7814\u8BA8\u4F1A", + partner: "\u5408\u4F5C\u4F19\u4F34", + advertisement: "\u5E7F\u544A", + paid_search: "\u4ED8\u8D39\u641C\u7D22", + social: "\u793E\u4EA4\u5A92\u4F53", + content: "\u5185\u5BB9 / \u535A\u5BA2", + cold_call: "\u964C\u751F\u62DC\u8BBF", + email_campaign: "\u90AE\u4EF6\u8425\u9500", + other: "\u5176\u4ED6" + } + }, + crm_campaign: { label: "\u8425\u9500\u6D3B\u52A8", help: "\u5E26\u6765\u6B64\u5546\u673A\u7684\u8425\u9500\u6D3B\u52A8" }, + days_in_stage: { label: "\u5F53\u524D\u9636\u6BB5\u5929\u6570" }, + stage_entry_date: { label: "\u8FDB\u5165\u5F53\u524D\u9636\u6BB5\u65E5\u671F", help: "\u672C\u5546\u673A\u8FDB\u5165\u5F53\u524D\u9636\u6BB5\u7684\u65E5\u671F\u3002" }, + is_private: { label: "\u79C1\u5BC6" }, + approval_status: { + label: "\u5BA1\u6279\u72B6\u6001", + options: { not_required: "\u65E0\u9700\u5BA1\u6279", pending: "\u5BA1\u6279\u4E2D", approved: "\u5DF2\u6279\u51C6", rejected: "\u5DF2\u9A73\u56DE" } + }, + approved_date: { label: "\u6279\u51C6\u65F6\u95F4" }, + win_reason: { + help: '\u8D62\u5355\u539F\u56E0\u3002\u5C06\u5546\u673A\u5173\u95ED\u4E3A"\u6210\u4EA4"\u65F6\u5FC5\u586B\u3002', + label: "\u8D62\u5355\u539F\u56E0", + options: { + better_product: "\u4EA7\u54C1\u66F4\u4F18", + better_price: "\u4EF7\u683C\u66F4\u4F18", + relationship: "\u5BA2\u6237\u5173\u7CFB", + better_support: "\u652F\u6301\u66F4\u597D", + best_fit: "\u6700\u4F73\u5951\u5408", + quote_accepted: "\u62A5\u4EF7\u88AB\u63A5\u53D7", + other: "\u5176\u4ED6" + } + }, + loss_reason: { + help: '\u4E22\u5355\u539F\u56E0\u3002\u5C06\u5546\u673A\u5173\u95ED\u4E3A"\u5931\u8D25"\u65F6\u5FC5\u586B\u3002', + label: "\u4E22\u5355\u539F\u56E0", + options: { + price: "\u4EF7\u683C\u8FC7\u9AD8", + competitor: "\u8F93\u7ED9\u7ADE\u4E89\u5BF9\u624B", + no_budget: "\u65E0\u9884\u7B97", + no_decision: "\u672A\u51B3\u7B56", + timing: "\u65F6\u673A\u4E0D\u5408\u9002", + features: "\u529F\u80FD\u7F3A\u5931", + other: "\u5176\u4ED6" + } + }, + loss_details: { label: "\u8D62/\u4E22\u5355\u8BE6\u60C5", help: "\u8D62\u5355\u6216\u4E22\u5355\u539F\u56E0\u7684\u8865\u5145\u8BF4\u660E\u3002" }, + // REQ-0006 — 资格评估、客户侧采购日程、商机叙述、业务线与状态变更审批。 + will_bid: { label: "\u662F\u5426\u6295\u6807", help: "\u6211\u65B9\u662F\u5426\u6253\u7B97\u6295\u6807\u3002\u7559\u7A7A\u8868\u793A\u5C1A\u672A\u51B3\u5B9A\u3002" }, + controllability: { label: "\u53EF\u63A7\u6027", options: { high: "\u9AD8", medium: "\u4E2D", low: "\u4F4E" } }, + priority: { label: "\u4F18\u5148\u7EA7", options: { high: "\u9AD8", medium: "\u4E2D", low: "\u4F4E" } }, + deal_level: { label: "\u5546\u673A\u7EA7\u522B", options: { strategic: "\u6218\u7565\u7EA7", key: "\u91CD\u70B9", standard: "\u666E\u901A" } }, + is_subcontracted: { label: "\u6D89\u53CA\u5206\u5305" }, + subcontracting_note: { label: "\u5206\u5305\u8BF4\u660E" }, + customer_initiation_date: { label: "\u5BA2\u6237\u7ACB\u9879\u65E5\u671F" }, + expected_tender_date: { label: "\u9884\u8BA1\u62DB\u6807\u65E5\u671F" }, + expected_signing_date: { label: "\u9884\u8BA1\u7B7E\u7EA6\u65E5\u671F" }, + expected_tender_amount: { label: "\u9884\u8BA1\u62DB\u6807\u91D1\u989D" }, + expected_signing_amount: { label: "\u9884\u8BA1\u7B7E\u7EA6\u91D1\u989D" }, + business_line: { + label: "\u4E1A\u52A1\u7EBF", + options: { product: "\u4EA7\u54C1", services: "\u4E13\u4E1A\u670D\u52A1", consulting: "\u54A8\u8BE2\u670D\u52A1", support: "\u8FD0\u7EF4\u652F\u6301", other: "\u5176\u4ED6" } + }, + customer_background: { label: "\u5BA2\u6237\u7B80\u4ECB" }, + project_background: { label: "\u9879\u76EE\u80CC\u666F" }, + risk_analysis: { label: "\u98CE\u9669\u5206\u6790" }, + payment_terms: { label: "\u4ED8\u6B3E\u6761\u6B3E" }, + requested_status: { label: "\u7533\u8BF7\u53D8\u66F4\u72B6\u6001", options: { closed_won: "\u8D62\u5355", closed_lost: "\u4E22\u5355" } }, + status_change_approval_status: { + label: "\u72B6\u6001\u53D8\u66F4\u5BA1\u6279", + options: { not_required: "\u65E0\u9700\u5BA1\u6279", pending: "\u5BA1\u6279\u4E2D", approved: "\u5DF2\u6279\u51C6", rejected: "\u5DF2\u9A73\u56DE" } + }, + // REQ-0006 第 11 步 — 立项审批。 + qualification_requested: { + label: "\u7533\u8BF7\u7ACB\u9879\u5BA1\u6279", + help: "\u52FE\u9009\u540E\u63D0\u4EA4\u7ACB\u9879\u5BA1\u6279\u3002\u5BA1\u6279\u88AB\u9A73\u56DE\u65F6\u4F1A\u81EA\u52A8\u53D6\u6D88\u52FE\u9009\uFF1B\u518D\u6B21\u52FE\u9009\u5373\u53EF\u91CD\u65B0\u7533\u8BF7\u3002" + }, + qualification_approval_status: { + label: "\u7ACB\u9879\u5BA1\u6279", + options: { not_required: "\u65E0\u9700\u5BA1\u6279", pending: "\u5BA1\u6279\u4E2D", approved: "\u5DF2\u6279\u51C6", rejected: "\u5DF2\u9A73\u56DE" } + } + }, + _views: { + tender_this_quarter: { + label: "\u672C\u5B63\u5EA6\u9884\u8BA1\u62DB\u6807", + emptyState: { + title: "\u672C\u5B63\u5EA6\u6682\u65E0\u9884\u8BA1\u62DB\u6807\u7684\u5546\u673A", + message: "\u672C\u6807\u7B7E\u9875\u5217\u51FA\u5BA2\u6237\u4FA7\u9884\u8BA1\u62DB\u6807\u65E5\u671F\u843D\u5728\u5F53\u524D\u5B63\u5EA6\u5185\u7684\u8FDB\u884C\u4E2D\u5546\u673A\u3002\u5728\u5546\u673A\u4E0A\u586B\u5199\u201C\u9884\u8BA1\u62DB\u6807\u65E5\u671F\u201D\u540E\uFF0C\u5B83\u5C31\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002" + } + }, + open_opportunities: { label: "\u8FDB\u884C\u4E2D\u5546\u673A" }, + all_opportunities: { label: "\u5168\u90E8\u5546\u673A" }, + pipeline_kanban: { label: "\u9500\u552E\u6D41\u6C34\u7EBF" }, + close_date_calendar: { label: "\u9884\u6D4B\u65E5\u5386" }, + deal_timeline: { label: "\u5546\u673A\u65F6\u95F4\u7EBF" }, + deal_gallery: { label: "\u5546\u673A\u5361\u7247" }, + my_open_deals: { label: "\u6211\u7684\u8FDB\u884C\u4E2D\u5546\u673A" }, + stale_opportunities: { label: "\u26A0\uFE0F \u505C\u6EDE\u5546\u673A \xB7 \u6309\u9636\u6BB5\u505C\u7559\u65F6\u95F4\u6392\u5E8F" }, + closing_this_quarter: { + label: "\u672C\u5B63\u5EA6\u5F85\u6210\u4EA4\u5546\u673A", + emptyState: { + title: "\u672C\u5B63\u5EA6\u6682\u65E0\u5F85\u6210\u4EA4\u5546\u673A", + message: "\u672C\u6807\u7B7E\u9875\u5217\u51FA\u9884\u8BA1\u6210\u4EA4\u65E5\u671F\u843D\u5728\u5F53\u524D\u5B63\u5EA6\u5185\u3001\u4E14\u5904\u4E8E\u627F\u8BFA\uFF08Commit\uFF09\u6216\u6700\u4F73\u53EF\u80FD\uFF08Best Case\uFF09\u7684\u8FDB\u884C\u4E2D\u5546\u673A\u3002\u5F53\u524D\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u8BB0\u5F55\u2014\u2014\u9884\u8BA1\u6210\u4EA4\u65E5\u671F\u66F4\u665A\u7684\u5546\u673A\u8BF7\u89C1\u201C\u8FDB\u884C\u4E2D\u5546\u673A\u201D\u6807\u7B7E\u9875\u3002" + } + } + }, + _sections: { + // Object-level section keys (opportunity.object.ts), used by record forms + // and by the detail page, whose sections reference these groups (#1452) + crm_forecast: { label: "\u9636\u6BB5\u4E0E\u9884\u6D4B" }, + basic: { label: "\u57FA\u672C\u4FE1\u606F" }, + financials: { label: "\u8D22\u52A1\u4FE1\u606F" }, + sales_process: { label: "\u9500\u552E\u6D41\u7A0B" }, + classification: { label: "\u5206\u7C7B" }, + campaign: { label: "\u8425\u9500\u6D3B\u52A8" }, + notes: { label: "\u5907\u6CE8\u4E0E\u4E0B\u4E00\u6B65" }, + qualification: { label: "\u8D44\u683C\u8BC4\u4F30" }, + narrative: { label: "\u5546\u673A\u53D9\u8FF0" }, + // opportunity.view.ts 表单区块名称 (#1100) + overview: { label: "\u6982\u89C8" }, + forecast: { label: "\u9884\u6D4B" }, + sales_strategy: { label: "\u9500\u552E\u7B56\u7565" }, + win_loss: { label: "\u8D62\u5355/\u8F93\u5355" } + }, + _actions: { + ...activityActions2, + clone_opportunity: { + label: "\u514B\u9686\u5546\u673A", + successMessage: "\u5546\u673A\u514B\u9686\u6210\u529F\uFF01" + }, + generate_quote: { + label: "\u751F\u6210\u62A5\u4EF7\u5355", + successMessage: "\u5DF2\u6839\u636E\u5546\u673A\u521B\u5EFA\u62A5\u4EF7\u5355\uFF01" + }, + mass_update_stage: { + label: "\u66F4\u65B0\u9636\u6BB5", + successMessage: "\u5546\u673A\u9636\u6BB5\u5DF2\u66F4\u65B0\uFF01", + params: { + stage: { + label: "\u65B0\u9636\u6BB5", + options: { + prospecting: "\u5BFB\u627E\u5BA2\u6237", + qualification: "\u8D44\u683C\u5BA1\u67E5", + needs_analysis: "\u9700\u6C42\u5206\u6790", + proposal: "\u63D0\u6848", + negotiation: "\u8C08\u5224", + closed_won: "\u6210\u4EA4", + closed_lost: "\u5931\u8D25" + } + } + } + } + } + }, + crm_opportunity_line_item: { + _validations: { + unit_price_positive: { + message: "\u9500\u552E\u4EF7\u683C\u4E0D\u80FD\u4E3A\u8D1F\u6570" + } + }, + label: "\u5546\u673A\u4EA7\u54C1\u660E\u7EC6", + pluralLabel: "\u5546\u673A\u4EA7\u54C1\u660E\u7EC6", + description: "\u5546\u673A\u4E0B\u6309\u4EA7\u54C1\u62C6\u5206\u7684\u62A5\u4EF7\u884C", + fields: { + crm_opportunity: { label: "\u5173\u8054\u5546\u673A" }, + crm_product: { label: "\u4EA7\u54C1" }, + description: { label: "\u63CF\u8FF0" }, + quantity: { label: "\u6570\u91CF" }, + list_price: { label: "\u6807\u4EF7", help: "\u81EA\u52A8\u53D6\u81EA\u4EA7\u54C1\u7684\u76EE\u5F55\u4EF7" }, + unit_price: { label: "\u9500\u552E\u5355\u4EF7", help: "\u534F\u5546\u540E\u7684\u5355\u4EF7\uFF08\u53EF\u4E0E\u76EE\u5F55\u4EF7\u4E0D\u540C\uFF09" }, + discount: { label: "\u6298\u6263\uFF08%\uFF09" }, + total_price: { label: "\u603B\u8BA1" }, + line_number: { label: "\u884C\u53F7" } + }, + _sections: { + basic: { label: "\u660E\u7EC6\u884C" }, + pricing: { label: "\u4EF7\u683C" } + } + }, + crm_forecast: { + _validations: { + period_end_after_start: { + message: "\u5468\u671F\u7ED3\u675F\u5FC5\u987B\u665A\u4E8E\u5468\u671F\u5F00\u59CB\u3002" + }, + period_end_matches_calendar_period: { + message: "\u5468\u671F\u7ED3\u675F\u5FC5\u987B\u662F\u8BE5\u5468\u671F\u7684\u6700\u540E\u4E00\u5929\u2014\u2014\u4F8B\u5982\u4EE5 2026-07-01 \u5F00\u59CB\u7684\u5B63\u5EA6\u5BF9\u5E94 2026-09-30\uFF0C2026 \u5E74 8 \u6708\u5BF9\u5E94 2026-08-31\u3002" + }, + period_start_first_of_period: { + message: "\u5468\u671F\u5F00\u59CB\u5FC5\u987B\u662F\u8BE5\u5468\u671F\u7684\u7B2C\u4E00\u5929\u2014\u2014\u4F8B\u5982 2026 \u5E74 8 \u6708\u5BF9\u5E94 2026-08-01\u3002" + }, + quarter_starts_on_quarter_boundary: { + message: "\u5B63\u5EA6\u9884\u6D4B\u5FC5\u987B\u4ECE\u5B63\u5EA6\u8FB9\u754C\u5F00\u59CB\u2014\u20141 \u6708 1 \u65E5\u30014 \u6708 1 \u65E5\u30017 \u6708 1 \u65E5\u6216 10 \u6708 1 \u65E5\u3002" + }, + snapshot_amounts_non_negative: { + message: "\u5FEB\u7167\u91D1\u989D\u4E0D\u80FD\u4E3A\u8D1F\u6570\u3002" + } + }, + label: "\u9500\u552E\u9884\u6D4B", + pluralLabel: "\u9500\u552E\u9884\u6D4B", + description: "\u6309\u9500\u552E\u8D1F\u8D23\u4EBA\u5B9A\u671F\u8BB0\u5F55\u7684\u7BA1\u9053\u5FEB\u7167\uFF0C\u7528\u4E8E\u6536\u5165\u9884\u6D4B", + fields: { + owner_id: { label: "\u8D1F\u8D23\u4EBA" }, + period: { label: "\u5468\u671F", options: { month: "\u6708\u5EA6", quarter: "\u5B63\u5EA6" } }, + period_start: { + label: "\u5468\u671F\u8D77\u59CB", + help: "\u5FC5\u987B\u662F\u6240\u5728\u5468\u671F\u7684\u7B2C\u4E00\u5929\u2014\u2014\u4F8B\u5982 2026 \u5E74 8 \u6708\u5BF9\u5E94 2026-08-01\u3002\u5B63\u5EA6\u9884\u6D4B\u8FD8\u5FC5\u987B\u843D\u5728\u5B63\u5EA6\u8FB9\u754C\u4E0A\uFF1A1 \u6708 1 \u65E5\u30014 \u6708 1 \u65E5\u30017 \u6708 1 \u65E5\u6216 10 \u6708 1 \u65E5\u3002" + }, + period_end: { + label: "\u5468\u671F\u622A\u6B62", + help: '\u901A\u5E38\u6839\u636E"\u5468\u671F"\u548C"\u5468\u671F\u8D77\u59CB"\u81EA\u52A8\u63A8\u7B97\u3002\u5982\u624B\u52A8\u586B\u5199\uFF0C\u5FC5\u987B\u662F\u8BE5\u5468\u671F\u7684\u6700\u540E\u4E00\u5929\u2014\u2014\u4F8B\u5982\u8D77\u59CB\u4E3A 2026-07-01 \u7684\u5B63\u5EA6\u5BF9\u5E94 2026-09-30\uFF0C2026 \u5E74 8 \u6708\u5BF9\u5E94 2026-08-31\u3002' + }, + period_label: { label: "\u5468\u671F\u6807\u7B7E", help: '\u6613\u8BFB\u7684\u5468\u671F\u6807\u7B7E\uFF0C\u4F8B\u5982"2026 \u5E74\u7B2C\u4E09\u5B63\u5EA6"\u6216"2026 \u5E74 8 \u6708"\u3002' }, + snapshot_date: { label: "\u5FEB\u7167\u65E5\u671F", help: "\u672C\u6B21\u5FEB\u7167\u7684\u91C7\u96C6\u65E5\u671F\u3002" }, + source: { + label: "\u6765\u6E90", + options: { scheduled: "\u5B9A\u65F6\u5FEB\u7167", ai: "AI \u6280\u80FD", manual: "\u624B\u5DE5\u5F55\u5165" } + }, + quota: { label: "\u914D\u989D" }, + pipeline_amount: { label: "\u7BA1\u9053\u91D1\u989D", help: "\u672C\u5468\u671F\u5185\u6240\u6709\u9884\u8BA1\u7ED3\u5355\u7684\u8FDB\u884C\u4E2D\u5546\u673A\u91D1\u989D\u5408\u8BA1\uFF08\u4E0D\u9650\u9636\u6BB5\uFF09\u3002" }, + best_case_amount: { label: "\u6700\u4F73\u60C5\u51B5", help: '\u9884\u6D4B\u7C7B\u522B\u4E3A"\u6700\u4F73\u60C5\u51B5"\u6216"\u627F\u8BFA"\u7684\u8FDB\u884C\u4E2D\u5546\u673A\u3002' }, + commit_amount: { label: "\u627F\u8BFA\u91D1\u989D", help: '\u9884\u6D4B\u7C7B\u522B\u4E3A"\u627F\u8BFA"\u7684\u8FDB\u884C\u4E2D\u5546\u673A\uFF08\u8D1F\u8D23\u4EBA\u5DF2\u627F\u8BFA\uFF09\u3002' }, + closed_amount: { label: "\u5DF2\u6210\u4EA4\u91D1\u989D", help: "\u672C\u5468\u671F\u5185\u5DF2\u8D62\u5355\u7684\u91D1\u989D\u3002" }, + expected_amount: { label: "\u9884\u671F\u91D1\u989D", help: "\u5DF2\u6210\u4EA4 + \u627F\u8BFA\u2014\u2014\u8D1F\u8D23\u4EBA\u5408\u7406\u9884\u671F\u80FD\u62FF\u4E0B\u7684\u91D1\u989D\u3002" }, + attainment_pct: { label: "\u8FBE\u6210\u7387\uFF08%\uFF09", help: "\u5DF2\u6210\u4EA4 \xF7 \u914D\u989D \xD7 100\u3002\u914D\u989D\u4E3A\u6B63\u6570\u4E4B\u524D\u663E\u793A 0%\u3002" }, + coverage_ratio: { label: "\u8986\u76D6\u500D\u6570", help: "\u7BA1\u9053\u91D1\u989D \xF7\uFF08\u914D\u989D \u2212 \u5DF2\u6210\u4EA4\uFF09\u2014\u2014\u5224\u65AD\u5269\u4F59\u7F3A\u53E3\u662F\u5426\u6709\u8DB3\u591F\u7BA1\u9053\u8986\u76D6\u3002\u914D\u989D\u5DF2\u8FBE\u6210\u65F6\u663E\u793A 0\u3002" }, + notes: { label: "\u5907\u6CE8" }, + display_title: { label: "\u663E\u793A\u540D\u79F0" }, + seed_key: { label: "\u79CD\u5B50\u6807\u8BC6", help: "\u6F14\u793A\u6570\u636E\u6807\u8BC6\u3002\u4EC5\u7531\u79CD\u5B50\u52A0\u8F7D\u5668\u5199\u5165\uFF1B\u771F\u5B9E\u5FEB\u7167\u4E0A\u59CB\u7EC8\u4E3A\u7A7A\u3002" } + }, + _views: { + all_forecasts: { label: "\u5168\u90E8\u9884\u6D4B" }, + this_quarter_forecasts: { + label: "\u672C\u5B63\u5EA6", + emptyState: { + title: "\u672C\u5B63\u5EA6\u5C1A\u65E0\u5FEB\u7167", + message: "\u5B63\u5EA6\u5FEB\u7167\u7531\u6BCF\u665A\u7684\u9884\u6D4B\u626B\u63CF\u4EFB\u52A1\u5199\u5165\u3002\u5728\u5B83\u4E3A\u5F53\u524D\u5B63\u5EA6\u9996\u6B21\u8DD1\u5B8C\u4E4B\u524D\uFF0C\u672C\u89C6\u56FE\u4E3A\u7A7A\u2014\u2014\u5DF2\u7ED3\u675F\u7684\u5B63\u5EA6\u8BF7\u89C1\u201C\u5168\u90E8\u201D\u6807\u7B7E\u9875\u3002" + } + }, + my_forecast: { label: "\u6211\u7684\u9884\u6D4B" } + }, + _sections: { + basic: { label: "\u5FEB\u7167" }, + amounts: { label: "\u91D1\u989D" }, + meta: { label: "\u6765\u6E90" }, + // forecast.view.ts 表单区块名称 (#1100) + snapshot: { label: "\u5FEB\u7167" }, + notes: { label: "\u5907\u6CE8" } + } + } +}; + +// src/sales/translations/zh-CN/objects.commerce.ts +var commerce2 = { + crm_quote: { + _validations: { + discount_within_ceiling: { + message: "\u6298\u6263\u4E0D\u80FD\u8D85\u8FC7 60%" + }, + expiration_after_quote: { + message: "\u5931\u6548\u65E5\u671F\u5FC5\u987B\u665A\u4E8E\u62A5\u4EF7\u65E5\u671F" + }, + quote_status_progression: { + message: "\u65E0\u6548\u7684\u62A5\u4EF7\u5355\u72B6\u6001\u6D41\u8F6C" + } + }, + label: "\u62A5\u4EF7\u5355", + pluralLabel: "\u62A5\u4EF7\u5355", + description: "\u53D1\u9001\u7ED9\u5BA2\u6237\u7684\u4EF7\u683C\u62A5\u4EF7", + fields: { + quote_number: { label: "\u62A5\u4EF7\u5355\u7F16\u53F7" }, + name: { label: "\u62A5\u4EF7\u540D\u79F0" }, + crm_account: { label: "\u6240\u5C5E\u5BA2\u6237" }, + crm_opportunity: { label: "\u5173\u8054\u5546\u673A" }, + status: { + label: "\u72B6\u6001", + options: { + draft: "\u8349\u7A3F", + in_review: "\u5BA1\u6838\u4E2D", + presented: "\u5DF2\u63D0\u4EA4", + accepted: "\u5DF2\u63A5\u53D7", + rejected: "\u5DF2\u62D2\u7EDD", + expired: "\u5DF2\u8FC7\u671F" + } + }, + total_price: { label: "\u603B\u91D1\u989D" }, + discount: { label: "\u6298\u6263 (%)" }, + expiration_date: { label: "\u5230\u671F\u65E5\u671F" }, + description: { label: "\u63CF\u8FF0" }, + crm_contact: { + label: "\u8054\u7CFB\u4EBA", + help: "\u62A5\u4EF7\u8FDB\u5165\u300C\u5DF2\u63D0\u4EA4\u300D\u6216\u300C\u5DF2\u63A5\u53D7\u300D\u540E\u5FC5\u586B \u2014\u2014 \u8D77\u8349\u7684\u5408\u540C\u4ECE\u8FD9\u91CC\u53D6\u4E3B\u8981\u8054\u7CFB\u4EBA\u3002" + }, + owner_id: { label: "\u62A5\u4EF7\u8D1F\u8D23\u4EBA" }, + quote_date: { label: "\u62A5\u4EF7\u65E5\u671F" }, + subtotal: { label: "\u5C0F\u8BA1" }, + discount_amount: { label: "\u6298\u6263\u91D1\u989D" }, + tax: { label: "\u7A0E\u989D" }, + shipping_handling: { label: "\u8FD0\u8D39\u53CA\u624B\u7EED\u8D39" }, + payment_terms: { + label: "\u4ED8\u6B3E\u6761\u6B3E", + options: { + net_15: "15 \u5929\u8D26\u671F", + net_30: "30 \u5929\u8D26\u671F", + net_60: "60 \u5929\u8D26\u671F", + net_90: "90 \u5929\u8D26\u671F", + due_on_receipt: "\u8D27\u5230\u4ED8\u6B3E" + } + }, + shipping_terms: { label: "\u8FD0\u8F93\u6761\u6B3E" }, + billing_address: { label: "\u8D26\u5355\u5730\u5740" }, + shipping_address: { label: "\u6536\u8D27\u5730\u5740" }, + internal_notes: { label: "\u5185\u90E8\u5907\u6CE8" }, + display_title: { label: "\u663E\u793A\u540D\u79F0" } + }, + _views: { + all_quotes: { label: "\u5168\u90E8\u62A5\u4EF7\u5355" }, + quote_pipeline: { label: "\u62A5\u4EF7\u6D41\u6C34\u7EBF" }, + quote_calendar: { label: "\u62A5\u4EF7\u65E5\u5386" } + }, + _sections: { + basic: { label: "\u62A5\u4EF7\u4FE1\u606F" }, + pricing: { label: "\u4EF7\u683C" }, + terms: { label: "\u6761\u6B3E\u4E0E\u6709\u6548\u671F" }, + address: { label: "\u5730\u5740" }, + system: { label: "\u7CFB\u7EDF" }, + // quote.view.ts 表单区块名称 (#1100) + quote: { label: "\u62A5\u4EF7\u5355" }, + totals: { label: "\u5408\u8BA1" }, + quote_terms: { label: "\u6761\u6B3E" }, + addresses_and_notes: { label: "\u5730\u5740\u4E0E\u5907\u6CE8" } + } + }, + crm_quote_line_item: { + _validations: { + discount_within_ceiling: { + message: "\u884C\u6298\u6263\u4E0D\u80FD\u8D85\u8FC7 60%" + }, + unit_price_positive: { + message: "\u9500\u552E\u4EF7\u683C\u4E0D\u80FD\u4E3A\u8D1F\u6570" + } + }, + label: "\u62A5\u4EF7\u5355\u660E\u7EC6", + pluralLabel: "\u62A5\u4EF7\u5355\u660E\u7EC6", + description: "\u62A5\u4EF7\u5355\u4E0B\u6309\u4EA7\u54C1\u62C6\u5206\u7684\u62A5\u4EF7\u884C", + fields: { + crm_quote: { label: "\u5173\u8054\u62A5\u4EF7\u5355" }, + crm_product: { label: "\u4EA7\u54C1" }, + description: { label: "\u63CF\u8FF0" }, + quantity: { label: "\u6570\u91CF" }, + list_price: { label: "\u6807\u4EF7" }, + unit_price: { label: "\u9500\u552E\u5355\u4EF7" }, + discount: { label: "\u6298\u6263\uFF08%\uFF09" }, + subtotal: { label: "\u5C0F\u8BA1" }, + total_price: { label: "\u603B\u8BA1" }, + line_number: { label: "\u884C\u53F7" } + }, + _sections: { + basic: { label: "\u660E\u7EC6\u884C" }, + pricing: { label: "\u4EF7\u683C" } + } + }, + crm_contract: { + _validations: { + end_after_start: { + message: "\u7ED3\u675F\u65E5\u671F\u5FC5\u987B\u665A\u4E8E\u5F00\u59CB\u65E5\u671F" + }, + contract_status_progression: { + message: "\u65E0\u6548\u7684\u5408\u540C\u72B6\u6001\u6D41\u8F6C" + } + }, + label: "\u5408\u540C", + pluralLabel: "\u5408\u540C", + description: "\u4E0E\u5BA2\u6237\u7B7E\u7F72\u7684\u6CD5\u5F8B\u5408\u540C", + fields: { + contract_number: { label: "\u5408\u540C\u7F16\u53F7" }, + crm_account: { label: "\u6240\u5C5E\u5BA2\u6237" }, + status: { + label: "\u72B6\u6001", + options: { + draft: "\u8349\u7A3F", + in_approval: "\u5BA1\u6279\u4E2D", + activated: "\u5DF2\u6FC0\u6D3B", + expired: "\u5DF2\u8FC7\u671F", + terminated: "\u5DF2\u7EC8\u6B62" + } + }, + start_date: { label: "\u5F00\u59CB\u65E5\u671F" }, + end_date: { label: "\u7ED3\u675F\u65E5\u671F" }, + contract_value: { label: "\u5408\u540C\u91D1\u989D" }, + description: { label: "\u63CF\u8FF0" }, + crm_contact: { label: "\u4E3B\u8981\u8054\u7CFB\u4EBA" }, + crm_opportunity: { label: "\u5173\u8054\u5546\u673A" }, + owner_id: { label: "\u5408\u540C\u8D1F\u8D23\u4EBA" }, + contract_term_months: { label: "\u5408\u540C\u671F\u9650\uFF08\u6708\uFF09" }, + billing_frequency: { + label: "\u8BA1\u8D39\u5468\u671F", + options: { monthly: "\u6309\u6708", quarterly: "\u6309\u5B63\u5EA6", annually: "\u6309\u5E74", one_time: "\u4E00\u6B21\u6027" } + }, + payment_terms: { + label: "\u4ED8\u6B3E\u6761\u6B3E", + options: { + net_15: "15 \u5929\u8D26\u671F", + net_30: "30 \u5929\u8D26\u671F", + net_60: "60 \u5929\u8D26\u671F", + net_90: "90 \u5929\u8D26\u671F", + due_on_receipt: "\u8D27\u5230\u4ED8\u6B3E" + } + }, + auto_renewal: { label: "\u81EA\u52A8\u7EED\u7EA6" }, + renewal_notice_days: { label: "\u7EED\u7EA6\u901A\u77E5\uFF08\u5929\uFF09" }, + contract_type: { + label: "\u5408\u540C\u7C7B\u578B", + options: { + subscription: "\u8BA2\u9605\u5408\u540C", + service: "\u670D\u52A1\u534F\u8BAE", + license: "\u6388\u6743\u8BB8\u53EF", + partnership: "\u5408\u4F5C\u534F\u8BAE", + nda: "\u4FDD\u5BC6\u534F\u8BAE", + msa: "\u4E3B\u670D\u52A1\u534F\u8BAE" + } + }, + signed_date: { label: "\u7B7E\u7F72\u65E5\u671F" }, + signed_by: { label: "\u7B7E\u7F72\u4EBA" }, + document_url: { label: "\u5408\u540C\u6587\u6863" }, + special_terms: { label: "\u7279\u6B8A\u6761\u6B3E" }, + billing_address: { label: "\u8D26\u5355\u5730\u5740" } + }, + _views: { + all_contracts: { label: "\u5168\u90E8\u5408\u540C" }, + renewal_calendar: { label: "\u7EED\u7EA6\u65E5\u5386" }, + contract_gantt: { label: "\u5408\u540C\u6761\u6B3E" }, + contract_timeline: { label: "\u5408\u540C\u65F6\u95F4\u7EBF" } + }, + _sections: { + basic: { label: "\u5408\u540C\u4FE1\u606F" }, + parties: { label: "\u7B7E\u7EA6\u65B9" }, + terms: { label: "\u6761\u6B3E\u4E0E\u65E5\u671F" }, + value: { label: "\u5408\u540C\u91D1\u989D" }, + status: { label: "\u72B6\u6001\u4E0E\u5BA1\u6279" }, + renewal: { label: "\u7EED\u7EA6" }, + // contract.view.ts 表单区块名称 (#1100) + contract_terms: { label: "\u6761\u6B3E" }, + signing_and_documents: { label: "\u7B7E\u7F72\u4E0E\u6587\u4EF6" }, + notes: { label: "\u5907\u6CE8" } + } + }, + crm_product: { + _validations: { + cost_less_than_price: { + message: "\u6210\u672C\u5E94\u4F4E\u4E8E\u6807\u4EF7" + }, + price_positive: { + message: "\u6807\u4EF7\u5FC5\u987B\u4E3A\u6B63\u6570" + } + }, + label: "\u4EA7\u54C1", + pluralLabel: "\u4EA7\u54C1", + description: "\u516C\u53F8\u63D0\u4F9B\u7684\u4EA7\u54C1\u4E0E\u670D\u52A1", + fields: { + product_code: { label: "\u4EA7\u54C1\u4EE3\u7801" }, + name: { label: "\u4EA7\u54C1\u540D\u79F0" }, + category: { + label: "\u4EA7\u54C1\u7C7B\u522B", + options: { + software: "\u8F6F\u4EF6", + hardware: "\u786C\u4EF6", + service: "\u670D\u52A1", + subscription: "\u8BA2\u9605", + support: "\u652F\u6301\u670D\u52A1" + } + }, + cost: { label: "\u6210\u672C" }, + is_active: { label: "\u662F\u5426\u542F\u7528" }, + description: { label: "\u63CF\u8FF0" }, + family: { + label: "\u4EA7\u54C1\u7CFB\u5217", + options: { + enterprise: "\u4F01\u4E1A\u7EA7\u65B9\u6848", + smb: "\u4E2D\u5C0F\u4F01\u4E1A\u65B9\u6848", + services: "\u4E13\u4E1A\u670D\u52A1", + cloud: "\u4E91\u670D\u52A1" + } + }, + list_price: { label: "\u6807\u4EF7" }, + sku: { label: "SKU" }, + product_manager: { label: "\u4EA7\u54C1\u7ECF\u7406" }, + image: { label: "\u4EA7\u54C1\u56FE\u7247" }, + datasheet: { label: "\u89C4\u683C\u4E66" }, + display_title: { label: "\u663E\u793A\u540D\u79F0" } + }, + _views: { + all_products: { label: "\u5168\u90E8\u4EA7\u54C1" }, + product_catalog: { label: "\u4EA7\u54C1\u76EE\u5F55" } + }, + _sections: { + basic: { label: "\u4EA7\u54C1\u4FE1\u606F" }, + pricing: { label: "\u4EF7\u683C" }, + metadata: { label: "\u8D44\u6E90" }, + // product.view.ts 表单区块名称 (#1100) + product_info: { label: "\u4EA7\u54C1\u4FE1\u606F" }, + pricing_info: { label: "\u5B9A\u4EF7" }, + media: { label: "\u5A92\u4F53" } + } + } +}; + +// src/sales/translations/zh-CN/objects.service.ts +var service2 = { + crm_case: { + _validations: { + resolution_required_for_closed: { + message: "\u5173\u95ED\u5DE5\u5355\u65F6\u5FC5\u987B\u586B\u5199\u89E3\u51B3\u65B9\u6848" + }, + escalation_reason_required: { + message: "\u5347\u7EA7\u5DE5\u5355\u65F6\u5FC5\u987B\u586B\u5199\u5347\u7EA7\u539F\u56E0" + }, + case_status_progression: { + message: "\u65E0\u6548\u7684\u72B6\u6001\u6D41\u8F6C" + } + }, + label: "\u5DE5\u5355", + pluralLabel: "\u5DE5\u5355", + description: "\u5BA2\u6237\u652F\u6301\u5DE5\u5355\u4E0E\u670D\u52A1\u8BF7\u6C42", + fields: { + case_number: { label: "\u5DE5\u5355\u7F16\u53F7" }, + subject: { label: "\u4E3B\u9898" }, + description: { label: "\u63CF\u8FF0" }, + crm_account: { label: "\u6240\u5C5E\u5BA2\u6237" }, + crm_contact: { label: "\u8054\u7CFB\u4EBA" }, + status: { + label: "\u72B6\u6001", + options: { + new: "\u65B0\u5EFA", + in_progress: "\u5904\u7406\u4E2D", + waiting_customer: "\u7B49\u5F85\u5BA2\u6237\u56DE\u590D", + waiting_support: "\u7B49\u5F85\u652F\u6301\u56DE\u590D", + escalated: "\u5DF2\u5347\u7EA7", + resolved: "\u5DF2\u89E3\u51B3", + closed: "\u5DF2\u5173\u95ED" + } + }, + priority: { + // `critical` MUST NOT render 紧急 — that word belongs to + // `crm_task.priority.urgent`, and the two vocabularies are different + // sets (case: low/medium/high/critical · task: low/normal/high/urgent). + // When both rendered 紧急 the screen showed one word for two values the + // model treats as distinct, which is how a case value ends up in a task + // predicate (`src/sales/views/task.view.ts` carries the tombstone of that + // crossing). Maintainer ruling 2026-08-31, #1342: case `critical` is + // 严重, task `urgent` keeps 紧急. en/es-ES/ja-JP already separate them + // (Critical/Urgent · Crítica/Urgente · 重大/緊急); zh-CN was the outlier. + label: "\u4F18\u5148\u7EA7", + options: { low: "\u4F4E", medium: "\u4E2D", high: "\u9AD8", critical: "\u4E25\u91CD" } + }, + type: { + label: "\u7C7B\u578B", + options: { + question: "\u54A8\u8BE2", + problem: "\u6545\u969C", + feature_request: "\u529F\u80FD\u9700\u6C42", + bug: "\u7F3A\u9677" + } + }, + owner_id: { label: "\u8D1F\u8D23\u4EBA" }, + origin: { + label: "\u5DE5\u5355\u6765\u6E90", + options: { email: "\u90AE\u4EF6", phone: "\u7535\u8BDD", web: "\u7F51\u7AD9", chat: "\u5728\u7EBF\u5BA2\u670D", social_media: "\u793E\u4EA4\u5A92\u4F53" } + }, + closed_date: { label: "\u5173\u95ED\u65E5\u671F" }, + first_response_date: { label: "\u9996\u6B21\u54CD\u5E94\u65E5\u671F" }, + resolution_time_hours: { label: "\u89E3\u51B3\u8017\u65F6\uFF08\u5C0F\u65F6\uFF09" }, + sla_due_date: { label: "SLA \u5230\u671F", help: "\u6309\u5DE5\u5355\u4F18\u5148\u7EA7\u4E0E\u6240\u5C5E\u5BA2\u6237\u7684\u5BA2\u6237\u5206\u5C42\u8BBE\u5B9A\uFF0C\u4EE5\u65E5\u5386\u5C0F\u65F6\u8BA1\uFF1A\u591C\u95F4\u3001\u5468\u672B\u4E0E\u8282\u5047\u65E5\u90FD\u8BA1\u5165\u3002" }, + is_sla_violated: { label: "SLA \u8FDD\u53CD" }, + is_escalated: { label: "\u5DF2\u5347\u7EA7" }, + escalation_reason: { label: "\u5347\u7EA7\u539F\u56E0" }, + resolution: { label: "\u89E3\u51B3\u65B9\u6848" }, + resolved_by_article: { label: "\u89E3\u51B3\u8BE5\u5DE5\u5355\u7684\u77E5\u8BC6\u6587\u7AE0", help: "\u89E3\u51B3\u6B64\u5DE5\u5355\u7684\u77E5\u8BC6\u5E93\u6587\u7AE0 \u2014\u2014 \u8F6C\u79FB\u7387\u7684\u7EDF\u8BA1\u53E3\u5F84\u3002" }, + internal_notes: { label: "\u5185\u90E8\u5907\u6CE8", help: "\u5185\u90E8\u5907\u6CE8\uFF0C\u5BA2\u6237\u4E0D\u53EF\u89C1" }, + is_closed: { label: "\u662F\u5426\u5173\u95ED" }, + display_title: { label: "\u663E\u793A\u540D\u79F0" }, + priority_rank: { label: "\u4F18\u5148\u7EA7\u6392\u5E8F" }, + escalated_date: { label: "\u5347\u7EA7\u65E5\u671F" } + }, + _views: { + all_cases: { label: "\u5168\u90E8\u5DE5\u5355" }, + case_workflow: { label: "\u670D\u52A1\u6D41\u8F6C" }, + sla_calendar: { label: "SLA \u65E5\u5386" }, + case_timeline: { label: "\u5DE5\u5355\u65F6\u95F4\u7EBF" }, + unassigned_triage: { + label: "\u672A\u5206\u6D3E \u2014 \u5F85\u5206\u8BCA", + emptyState: { + title: "\u6CA1\u6709\u5F85\u5206\u8BCA\u7684\u5DE5\u5355", + message: "\u6240\u6709\u5DE5\u5355\u90FD\u6709\u8D1F\u8D23\u4EBA\u3002\u5F53\u5DE5\u5355\u5230\u8FBE\u65F6\u6CA1\u6709\u8D1F\u8D23\u4EBA\uFF0C\u5C31\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC \u2014\u2014 \u901A\u5E38\u662F\u5728\u65E0\u4EBA\u62C5\u4EFB\u300C\u5BA2\u670D\u4E13\u5458\u300D\u804C\u4F4D\u671F\u95F4\u63D0\u4EA4\u7684\u7F51\u9875\u8F6C\u5DE5\u5355\u3002" + } + }, + escalated_cases: { label: "\u5DF2\u5347\u7EA7\u5DE5\u5355" }, + my_open_cases: { label: "\u6211\u7684\u5F85\u5904\u7406\u5DE5\u5355" }, + sla_at_risk: { label: "\u23F0 SLA \u98CE\u9669\u9884\u8B66" } + }, + _actions: { + ...activityActions2, + escalate_case: { + label: "\u5347\u7EA7\u5DE5\u5355", + confirmText: "\u6B64\u64CD\u4F5C\u4F1A\u5C06\u5DE5\u5355\u5347\u7EA7\u5230\u5347\u7EA7\u5904\u7406\u56E2\u961F\uFF0C\u662F\u5426\u7EE7\u7EED\uFF1F", + successMessage: "\u5DE5\u5355\u5347\u7EA7\u6210\u529F\uFF01" + }, + close_case: { + label: "\u5173\u95ED\u5DE5\u5355", + confirmText: "\u786E\u5B9A\u8981\u5173\u95ED\u6B64\u5DE5\u5355\u5417\uFF1F", + successMessage: "\u5DE5\u5355\u5DF2\u6210\u529F\u5173\u95ED\uFF01" + }, + claim_case: { + label: "\u8BA4\u9886\u5DE5\u5355", + successMessage: "\u5DE5\u5355\u5DF2\u8BA4\u9886\uFF0C\u73B0\u5728\u5F52\u4F60\u8D1F\u8D23\u3002" + } + }, + _sections: { + // case.view.ts 表单区块名称 (#1100)。 + case: { label: "\u5DE5\u5355" }, + how_can_we_help: { label: "\u6211\u4EEC\u80FD\u5E2E\u60A8\u4EC0\u4E48\uFF1F" }, + // Object-level section keys (case.object.ts), used by record forms and + // by the detail page, whose sections reference these groups (#970) + basic: { label: "\u5DE5\u5355\u4FE1\u606F" }, + origin: { label: "\u6765\u6E90\u4E0E\u8DEF\u7531" }, + sla: { label: "SLA \u4E0E\u4F18\u5148\u7EA7" }, + resolution: { label: "\u89E3\u51B3\u65B9\u6848" }, + escalation: { label: "\u5347\u7EA7" }, + system: { label: "\u7CFB\u7EDF" } + } + }, + crm_knowledge_article: { + _validations: { + published_requires_body: { + message: "\u6CA1\u6709\u6B63\u6587\u7684\u6587\u7AE0\u65E0\u6CD5\u53D1\u5E03\u3002" + }, + published_requires_summary: { + message: "\u5DF2\u53D1\u5E03\u7684\u6587\u7AE0\u5E94\u586B\u5199\u6458\u8981\uFF0C\u4F9B\u641C\u7D22\u7ED3\u679C\u4E0E AI \u5F15\u7528\u4F7F\u7528\u3002" + } + }, + label: "\u77E5\u8BC6\u6587\u7AE0", + pluralLabel: "\u77E5\u8BC6\u5E93", + description: "\u9762\u5411\u5BA2\u6237\u548C\u5750\u5E2D\u7684\u53EF\u590D\u7528\u95EE\u7B54\u4E0E\u64CD\u4F5C\u6307\u5357", + fields: { + article_number: { label: "\u6587\u7AE0\u7F16\u53F7" }, + title: { label: "\u6807\u9898" }, + summary: { label: "\u6458\u8981", help: "\u4E00\u6BB5\u8BDD\u6458\u8981\uFF0C\u663E\u793A\u5728\u641C\u7D22\u7ED3\u679C\u548C AI \u5F15\u7528\u4E2D\u3002" }, + body: { label: "\u6B63\u6587", help: "\u6587\u7AE0\u6B63\u6587\uFF08Markdown\uFF09\u3002" }, + category: { + label: "\u5206\u7C7B", + options: { + getting_started: "\u5165\u95E8\u6307\u5357", + how_to: "\u64CD\u4F5C\u6307\u5357", + troubleshooting: "\u6545\u969C\u6392\u67E5", + billing: "\u8D26\u52A1\u4E0E\u4EF7\u683C", + api: "API \u4E0E\u96C6\u6210", + release_notes: "\u7248\u672C\u8BF4\u660E", + policy: "\u653F\u7B56\u5236\u5EA6" + } + }, + tags: { + label: "\u6807\u7B7E", + options: { + auth: "\u8EAB\u4EFD\u8BA4\u8BC1", + sso: "\u5355\u70B9\u767B\u5F55", + mobile: "\u79FB\u52A8\u7AEF", + email: "\u90AE\u4EF6", + reports: "\u62A5\u8868", + performance: "\u6027\u80FD", + data_import: "\u6570\u636E\u5BFC\u5165", + webhooks: "Webhook" + } + }, + status: { + label: "\u72B6\u6001", + options: { draft: "\u8349\u7A3F", in_review: "\u5BA1\u6838\u4E2D", published: "\u5DF2\u53D1\u5E03", archived: "\u5DF2\u5F52\u6863" } + }, + audience: { label: "\u53D7\u4F17", options: { public: "\u516C\u5F00", internal: "\u4EC5\u5185\u90E8" }, help: "\u516C\u5F00\u6587\u7AE0\u5728\u5BA2\u6237\u95E8\u6237\u53EF\u89C1\uFF1B\u5185\u90E8\u6587\u7AE0\u4EC5\u5BA2\u670D\u53EF\u89C1\u3002" }, + language: { + label: "\u8BED\u8A00", + options: { en: "\u82F1\u8BED", zh_cn: "\u7B80\u4F53\u4E2D\u6587", es_es: "\u897F\u73ED\u7259\u8BED", ja_jp: "\u65E5\u8BED" } + }, + owner_id: { label: "\u8D1F\u8D23\u4EBA" }, + related_to_case: { label: "\u6765\u6E90\u5DE5\u5355", help: "\u672C\u6587\u6240\u4F9D\u636E\u7684\u5DE5\u5355\uFF08\u53EF\u9009\uFF09\u3002" }, + published_at: { label: "\u53D1\u5E03\u65F6\u95F4" }, + last_reviewed_at: { label: "\u6700\u8FD1\u590D\u6838" }, + helpful_count: { label: "\u6709\u7528", help: "\u7531 crm_article_feedback \u91CD\u65B0\u7EDF\u8BA1\u5F97\u51FA\uFF0C\u4E0D\u53EF\u624B\u5DE5\u586B\u5199\u3002" }, + not_helpful_count: { label: "\u6CA1\u7528", help: "\u7531 crm_article_feedback \u91CD\u65B0\u7EDF\u8BA1\u5F97\u51FA\uFF0C\u4E0D\u53EF\u624B\u5DE5\u586B\u5199\u3002" }, + display_title: { label: "\u663E\u793A\u540D\u79F0" } + }, + _views: { + all_articles: { label: "\u5168\u90E8\u6587\u7AE0" }, + published_articles: { label: "\u5DF2\u53D1\u5E03" }, + my_drafts: { label: "\u6211\u7684\u8349\u7A3F" } + }, + _sections: { + basic: { label: "\u6587\u7AE0\u4FE1\u606F" }, + content: { label: "\u5185\u5BB9" }, + taxonomy: { label: "\u5206\u7C7B" }, + metrics: { label: "\u4E92\u52A8\u6570\u636E" }, + engagement: { label: "\u4E92\u52A8\u6570\u636E" }, + // knowledge_article.view.ts 表单区块名称 (#1100) + article: { label: "\u6587\u7AE0" } + }, + _actions: { + mark_article_helpful: { + label: "\u6709\u7528", + successMessage: "\u5DF2\u8BB0\u5F55\u4E3A\u300C\u6709\u7528\u300D\uFF0C\u8C22\u8C22\u53CD\u9988\u3002" + }, + mark_article_not_helpful: { + label: "\u6CA1\u7528", + successMessage: "\u5DF2\u8BB0\u5F55\u4E3A\u300C\u6CA1\u7528\u300D\uFF0C\u8C22\u8C22\u53CD\u9988\u3002" + } + } + }, + crm_article_feedback: { + label: "\u6587\u7AE0\u53CD\u9988", + pluralLabel: "\u6587\u7AE0\u53CD\u9988", + description: "\u8BFB\u8005\u5BF9\u67D0\u7BC7\u77E5\u8BC6\u6587\u7AE0\u7684\u300C\u6709\u7528 / \u6CA1\u7528\u300D\u8BC4\u4EF7", + fields: { + feedback_number: { label: "\u53CD\u9988\u7F16\u53F7" }, + owner_id: { label: "\u8BFB\u8005" }, + crm_knowledge_article: { label: "\u6587\u7AE0", help: "\u672C\u6761\u53CD\u9988\u9488\u5BF9\u7684\u77E5\u8BC6\u6587\u7AE0\u3002" }, + verdict: { + label: "\u8BC4\u4EF7", + options: { helpful: "\u6709\u7528", not_helpful: "\u6CA1\u7528" } + }, + comment: { label: "\u5907\u6CE8", help: "\u53EF\u9009\u8BF4\u660E\uFF0C\u4F5C\u8005\u53EF\u89C1\u3002" } + }, + _sections: { + basic: { label: "\u53CD\u9988" } + } + } +}; + +// src/sales/translations/zh-CN/objects.activity.ts +var activity2 = { + crm_task: { + _validations: { + completed_date_required: { + message: "\u72B6\u6001\u4E3A\u5DF2\u5B8C\u6210\u65F6\u5FC5\u987B\u586B\u5199\u5B8C\u6210\u65E5\u671F" + }, + recurrence_fields_required: { + message: "\u91CD\u590D\u4EFB\u52A1\u5FC5\u987B\u586B\u5199\u91CD\u590D\u7C7B\u578B" + }, + related_to_required: { + message: "\u81F3\u5C11\u9700\u8981\u9009\u62E9\u4E00\u6761\u5173\u8054\u8BB0\u5F55" + } + }, + label: "\u4EFB\u52A1", + pluralLabel: "\u4EFB\u52A1", + description: "\u6D3B\u52A8\u4E0E\u5F85\u529E\u4E8B\u9879", + fields: { + subject: { label: "\u4E3B\u9898" }, + description: { label: "\u63CF\u8FF0" }, + status: { + label: "\u72B6\u6001", + options: { + not_started: "\u672A\u5F00\u59CB", + in_progress: "\u8FDB\u884C\u4E2D", + waiting: "\u7B49\u5F85\u4E2D", + completed: "\u5DF2\u5B8C\u6210", + deferred: "\u5DF2\u63A8\u8FDF" + } + }, + priority: { + // `urgent` KEEPS 紧急, and ⛔ nothing may re-point it at `crm_case`'s + // top value: the two vocabularies are different sets (task: + // low/normal/high/urgent · case: low/medium/high/critical), so the two + // zh-CN words must stay different or the screen stops distinguishing + // two values the model treats as distinct — the crossing + // `src/sales/views/task.view.ts` carries the tombstone of. Maintainer ruling + // 2026-08-31, #1342: 紧急 stays here (urgent is this object's literal + // word) and case `critical` moved to 严重. + label: "\u4F18\u5148\u7EA7", + options: { low: "\u4F4E", normal: "\u666E\u901A", high: "\u9AD8", urgent: "\u7D27\u6025" } + }, + due_date: { label: "\u622A\u6B62\u65E5\u671F" }, + type: { + label: "\u4EFB\u52A1\u7C7B\u578B", + options: { + call: "\u7535\u8BDD", + email: "\u90AE\u4EF6", + meeting: "\u4F1A\u8BAE", + follow_up: "\u8DDF\u8FDB", + demo: "\u6F14\u793A", + other: "\u5176\u4ED6" + } + }, + reminder_date: { label: "\u63D0\u9192\u65F6\u95F4" }, + completed_date: { label: "\u5B8C\u6210\u65E5\u671F" }, + owner_id: { label: "\u8D1F\u8D23\u4EBA" }, + related_to_type: { + label: "\u5173\u8054\u5BF9\u8C61\u7C7B\u578B", + options: { + crm_account: "\u5BA2\u6237", + crm_contact: "\u8054\u7CFB\u4EBA", + crm_opportunity: "\u5546\u673A", + crm_lead: "\u7EBF\u7D22", + crm_case: "\u5DE5\u5355" + } + }, + related_to_account: { label: "\u5173\u8054\u5BA2\u6237" }, + related_to_contact: { label: "\u5173\u8054\u8054\u7CFB\u4EBA" }, + related_to_opportunity: { label: "\u5173\u8054\u5546\u673A" }, + related_to_lead: { label: "\u5173\u8054\u7EBF\u7D22" }, + related_to_case: { label: "\u5173\u8054\u5DE5\u5355" }, + is_recurring: { label: "\u91CD\u590D\u4EFB\u52A1" }, + recurrence_type: { + label: "\u91CD\u590D\u7C7B\u578B", + options: { daily: "\u6BCF\u65E5", weekly: "\u6BCF\u5468", monthly: "\u6BCF\u6708", yearly: "\u6BCF\u5E74" } + }, + recurrence_interval: { label: "\u91CD\u590D\u95F4\u9694" }, + recurrence_end_date: { label: "\u91CD\u590D\u7ED3\u675F\u65E5\u671F" }, + is_completed: { label: "\u662F\u5426\u5B8C\u6210" }, + is_overdue: { label: "\u662F\u5426\u903E\u671F" }, + progress_percent: { label: "\u8FDB\u5EA6\uFF08%\uFF09" }, + priority_rank: { label: "\u4F18\u5148\u7EA7\u6392\u5E8F" }, + reminder_sent: { label: "\u63D0\u9192\u5DF2\u53D1\u9001" } + }, + _sections: { + basic: { label: "\u4EFB\u52A1\u4FE1\u606F" }, + scheduling: { label: "\u65E5\u7A0B\u5B89\u6392" }, + related: { label: "\u5173\u8054\u8BB0\u5F55" }, + recurrence: { label: "\u91CD\u590D\u89C4\u5219" }, + system: { label: "\u7CFB\u7EDF" }, + effort: { label: "\u8FDB\u5EA6\u4E0E\u5DE5\u65F6" }, + // task.view.ts 表单区块名称 (#1100) + task: { label: "\u4EFB\u52A1" }, + related_records: { label: "\u5173\u8054\u8BB0\u5F55" }, + recurrence_and_effort: { label: "\u91CD\u590D\u4E0E\u5DE5\u65F6" } + }, + _views: { + all_tasks: { label: "\u5168\u90E8\u4EFB\u52A1" }, + task_board: { label: "\u4EFB\u52A1\u770B\u677F" }, + task_calendar: { label: "\u4EFB\u52A1\u65E5\u7A0B" }, + task_gantt: { label: "\u6267\u884C\u8BA1\u5212" }, + task_timeline: { label: "\u5DE5\u65F6\u65F6\u95F4\u7EBF" }, + my_open_tasks: { label: "\u6211\u7684\u5F85\u529E\u4EFB\u52A1" }, + todays_tasks: { label: "\u{1F4C5} \u6211\u7684\u4F18\u5148\u4EFB\u52A1" }, + overdue_tasks: { label: "\u23F0 \u5F85\u529E\u4EFB\u52A1 \xB7 \u6309\u903E\u671F\u65F6\u957F\u6392\u5E8F" } + } + }, + crm_event: { + _validations: { + end_after_start: { + message: "\u7ED3\u675F\u65F6\u95F4\u5FC5\u987B\u665A\u4E8E\u5F00\u59CB\u65F6\u95F4" + }, + related_to_required: { + message: "\u81F3\u5C11\u9700\u8981\u9009\u62E9\u4E00\u6761\u5173\u8054\u8BB0\u5F55" + } + }, + label: "\u6D3B\u52A8", + pluralLabel: "\u6D3B\u52A8", + description: "\u4E0E\u5BA2\u6237\u7684\u4F1A\u8BAE\u3001\u901A\u8BDD\u53CA\u5176\u4ED6\u5DF2\u5B89\u6392\u7684\u4E92\u52A8", + fields: { + subject: { label: "\u4E3B\u9898" }, + description: { label: "\u63CF\u8FF0" }, + type: { + label: "\u6D3B\u52A8\u7C7B\u578B", + options: { + meeting: "\u4F1A\u8BAE", + call: "\u7535\u8BDD", + demo: "\u6F14\u793A", + webinar: "\u7EBF\u4E0A\u7814\u8BA8\u4F1A", + onsite_visit: "\u4E0A\u95E8\u62DC\u8BBF", + other: "\u5176\u4ED6" + } + }, + status: { + label: "\u72B6\u6001", + options: { + planned: "\u5DF2\u8BA1\u5212", + held: "\u5DF2\u4E3E\u884C", + cancelled: "\u5DF2\u53D6\u6D88", + no_show: "\u5BA2\u6237\u672A\u5230" + } + }, + owner_id: { label: "\u8D1F\u8D23\u4EBA" }, + start_datetime: { label: "\u5F00\u59CB\u65F6\u95F4" }, + end_datetime: { label: "\u7ED3\u675F\u65F6\u95F4" }, + all_day: { label: "\u5168\u5929\u6D3B\u52A8" }, + duration_minutes: { label: "\u65F6\u957F\uFF08\u5206\u949F\uFF09" }, + location: { label: "\u5730\u70B9", help: "\u4F1A\u8BAE\u5BA4\u3001\u5730\u5740\u6216\u4F1A\u8BAE\u94FE\u63A5" }, + related_to_type: { + label: "\u5173\u8054\u5BF9\u8C61\u7C7B\u578B", + options: { + crm_account: "\u5BA2\u6237", + crm_contact: "\u8054\u7CFB\u4EBA", + crm_opportunity: "\u5546\u673A", + crm_lead: "\u7EBF\u7D22", + crm_case: "\u5DE5\u5355" + } + }, + related_to_account: { label: "\u5173\u8054\u5BA2\u6237" }, + related_to_contact: { label: "\u5173\u8054\u8054\u7CFB\u4EBA" }, + related_to_opportunity: { label: "\u5173\u8054\u5546\u673A" }, + related_to_lead: { label: "\u5173\u8054\u7EBF\u7D22" }, + related_to_case: { label: "\u5173\u8054\u5DE5\u5355" }, + outcome_notes: { label: "\u4F1A\u540E\u7EAA\u8981", help: "\u8FBE\u6210\u4E86\u4EC0\u4E48\u5171\u8BC6\uFF0C\u4E0B\u4E00\u6B65\u505A\u4EC0\u4E48" } + }, + _sections: { + basic: { label: "\u6D3B\u52A8\u4FE1\u606F" }, + schedule: { label: "\u65E5\u7A0B\u5B89\u6392" }, + related: { label: "\u5173\u8054\u8BB0\u5F55" }, + outcome: { label: "\u7ED3\u679C" }, + // event.view.ts 表单区块名称 (#1100) + event: { label: "\u6D3B\u52A8" }, + related_records: { label: "\u5173\u8054\u8BB0\u5F55" } + }, + _views: { + all_events: { label: "\u5168\u90E8\u6D3B\u52A8" }, + event_calendar: { label: "\u6D3B\u52A8\u65E5\u5386" }, + event_timeline: { label: "\u56E2\u961F\u65E5\u7A0B" }, + my_events: { label: "\u6211\u7684\u65E5\u5386" }, + upcoming_events: { label: "\u{1F4C5} \u5373\u5C06\u5F00\u59CB \xB7 \u6309\u65F6\u95F4\u5347\u5E8F" }, + held_events: { label: "\u2705 \u4E92\u52A8\u5386\u53F2" } + } + }, + crm_event_attendee: { + _validations: { + attendee_resolves: { + message: "\u53C2\u4E0E\u8005\u5FC5\u987B\u586B\u5199\u5176\u53C2\u4E0E\u8005\u7C7B\u578B\u6240\u6307\u7684\u4E00\u65B9\u2014\u2014\u8054\u7CFB\u4EBA\u7C7B\u578B\u9700\u8981\u586B\u5199\u8054\u7CFB\u4EBA\uFF0C\u5916\u90E8\u7C7B\u578B\u9700\u8981\u586B\u5199\u5916\u90E8\u53C2\u4E0E\u8005\u59D3\u540D" + }, + attendee_type_exclusive: { + message: "\u53C2\u4E0E\u8005\u53EA\u80FD\u6307\u5B9A\u4E00\u65B9\u2014\u2014\u8BF7\u6E05\u7A7A\u5176\u53C2\u4E0E\u8005\u7C7B\u578B\u672A\u6307\u660E\u7684\u6240\u6709\u5B57\u6BB5" + } + }, + label: "\u6D3B\u52A8\u53C2\u4E0E\u8005", + pluralLabel: "\u6D3B\u52A8\u53C2\u4E0E\u8005", + description: "\u53D7\u9080\u53C2\u52A0\u6216\u5B9E\u9645\u51FA\u5E2D\u6D3B\u52A8\u7684\u4EBA\u5458", + fields: { + attendee_number: { label: "\u53C2\u4E0E\u8005\u7F16\u53F7" }, + crm_event: { label: "\u6D3B\u52A8" }, + attendee_type: { + label: "\u53C2\u4E0E\u8005\u7C7B\u578B", + options: { contact: "\u8054\u7CFB\u4EBA", lead: "\u7EBF\u7D22", user: "\u5185\u90E8\u7528\u6237", external: "\u5916\u90E8\u6765\u5BBE" } + }, + crm_contact: { label: "\u8054\u7CFB\u4EBA", help: "\u53C2\u4E0E\u8005\u662F\u5DF2\u6709\u5BA2\u6237\u8054\u7CFB\u4EBA\u65F6\u586B\u5199" }, + crm_lead: { label: "\u7EBF\u7D22", help: "\u53C2\u4E0E\u8005\u4ECD\u662F\u672A\u8F6C\u5316\u7EBF\u7D22\u65F6\u586B\u5199" }, + sys_user: { label: "\u5185\u90E8\u7528\u6237", help: "\u53C2\u4E0E\u8005\u662F\u540C\u4E8B\u65F6\u586B\u5199" }, + external_name: { label: "\u5916\u90E8\u53C2\u4E0E\u8005", help: "\u4E0D\u5728\u4EFB\u4F55 CRM \u5BF9\u8C61\u4E2D\u7684\u53C2\u4E0E\u8005\u59D3\u540D\u2014\u2014\u53C2\u4E0E\u8005\u7C7B\u578B\u4E3A\u300C\u5916\u90E8\u6765\u5BBE\u300D\u65F6\u586B\u5199" }, + response: { + label: "\u56DE\u590D", + options: { + no_response: "\u672A\u56DE\u590D", + accepted: "\u5DF2\u63A5\u53D7", + declined: "\u5DF2\u62D2\u7EDD", + tentative: "\u5F85\u5B9A" + } + }, + is_organizer: { label: "\u7EC4\u7EC7\u8005" }, + invited_date: { label: "\u9080\u8BF7\u65F6\u95F4" } + }, + _sections: { + basic: { label: "\u53C2\u4E0E\u8005" }, + response: { label: "\u9080\u8BF7" }, + // event_attendee.view.ts 表单区块名称 (#1100) + attendee: { label: "\u53C2\u4E0E\u8005" }, + invitation: { label: "\u9080\u8BF7" } + }, + _views: { + all_event_attendees: { label: "\u6D3B\u52A8\u53C2\u4E0E\u8005" } + } + } +}; + +// src/sales/translations/zh-CN/objects.marketing.ts +var marketing2 = { + crm_campaign: { + _validations: { + end_after_start: { + message: "\u7ED3\u675F\u65E5\u671F\u5FC5\u987B\u665A\u4E8E\u5F00\u59CB\u65E5\u671F" + }, + actual_cost_within_budget: { + message: "\u5B9E\u9645\u6210\u672C\u8D85\u51FA\u9884\u7B97\u6210\u672C" + } + }, + label: "\u8425\u9500\u6D3B\u52A8", + pluralLabel: "\u8425\u9500\u6D3B\u52A8", + description: "\u5E02\u573A\u8425\u9500\u6D3B\u52A8\u4E0E\u63A8\u5E7F", + fields: { + campaign_code: { label: "\u6D3B\u52A8\u4EE3\u7801" }, + name: { label: "\u6D3B\u52A8\u540D\u79F0" }, + type: { + label: "\u7C7B\u578B", + options: { + email: "\u90AE\u4EF6\u8425\u9500", + webinar: "\u7EBF\u4E0A\u7814\u8BA8\u4F1A", + trade_show: "\u5C55\u4F1A", + conference: "\u884C\u4E1A\u4F1A\u8BAE", + direct_mail: "\u76F4\u90AE", + social_media: "\u793E\u4EA4\u5A92\u4F53", + content: "\u5185\u5BB9\u8425\u9500", + partner: "\u4F19\u4F34\u8054\u5408\u8425\u9500" + } + }, + status: { + label: "\u72B6\u6001", + options: { + planning: "\u89C4\u5212\u4E2D", + in_progress: "\u8FDB\u884C\u4E2D", + completed: "\u5DF2\u5B8C\u6210", + aborted: "\u5DF2\u4E2D\u6B62" + } + }, + start_date: { label: "\u5F00\u59CB\u65E5\u671F" }, + end_date: { label: "\u7ED3\u675F\u65E5\u671F" }, + expected_revenue: { label: "\u9884\u671F\u6536\u5165" }, + description: { label: "\u63CF\u8FF0" }, + channel: { + label: "\u4E3B\u8981\u6E20\u9053", + options: { digital: "\u6570\u5B57\u6E20\u9053", social: "\u793E\u4EA4\u5A92\u4F53", email: "\u90AE\u4EF6", events: "\u7EBF\u4E0B\u6D3B\u52A8", partner: "\u5408\u4F5C\u4F19\u4F34" } + }, + budgeted_cost: { label: "\u9884\u7B97\u6210\u672C" }, + actual_cost: { label: "\u5B9E\u9645\u6210\u672C" }, + actual_revenue: { label: "\u5B9E\u9645\u6536\u5165" }, + target_size: { label: "\u76EE\u6807\u4EBA\u6570", help: "\u76EE\u6807\u7EBF\u7D22/\u8054\u7CFB\u4EBA\u6570\u91CF" }, + num_sent: { label: "\u53D1\u9001\u6570\u91CF" }, + num_responses: { label: "\u54CD\u5E94\u6570\u91CF" }, + num_leads: { label: "\u7EBF\u7D22\u6570\u91CF" }, + num_converted_leads: { label: "\u5DF2\u8F6C\u5316\u7EBF\u7D22\u6570" }, + num_opportunities: { label: "\u5DF2\u521B\u5EFA\u5546\u673A\u6570" }, + num_won_opportunities: { label: "\u5DF2\u8D62\u5F97\u5546\u673A" }, + response_rate: { label: "\u54CD\u5E94\u7387\uFF08%\uFF09" }, + roi: { label: "\u6295\u8D44\u56DE\u62A5\u7387\uFF08%\uFF09" }, + owner_id: { label: "\u6D3B\u52A8\u8D1F\u8D23\u4EBA" }, + landing_page_url: { label: "\u7740\u9646\u9875" }, + is_active: { label: "\u662F\u5426\u542F\u7528" }, + display_title: { label: "\u663E\u793A\u540D\u79F0" } + }, + _sections: { + basic: { label: "\u6D3B\u52A8\u4FE1\u606F" }, + schedule: { label: "\u65E5\u7A0B\u5B89\u6392" }, + budget: { label: "\u9884\u7B97\u4E0E\u6295\u8D44\u56DE\u62A5" }, + metrics: { label: "\u6548\u679C\u6570\u636E" }, + assignment: { label: "\u5F52\u5C5E" }, + assets: { label: "\u6D3B\u52A8\u7D20\u6750" } + }, + _views: { + all_campaigns: { label: "\u5168\u90E8\u8425\u9500\u6D3B\u52A8" }, + campaign_gantt: { label: "\u6D3B\u52A8\u6392\u671F" }, + campaign_calendar: { label: "\u6D3B\u52A8\u65E5\u5386" }, + campaign_timeline: { label: "\u8425\u9500\u65F6\u95F4\u7EBF" } + }, + _actions: { + enroll_leads: { + label: "\u6279\u91CF\u52A0\u5165\u6210\u5458", + successMessage: "\u7B26\u5408\u6761\u4EF6\u7684\u6210\u5458\u5DF2\u52A0\u5165\u8425\u9500\u6D3B\u52A8\u3002" + } + } + }, + crm_campaign_member: { + _validations: { + lead_or_contact_required: { + message: "\u8425\u9500\u6D3B\u52A8\u6210\u5458\u5FC5\u987B\u5173\u8054\u7EBF\u7D22\u6216\u8054\u7CFB\u4EBA\u4E4B\u4E00" + } + }, + // 「营销活动成员」, not 「活动成员」: this object's master is `crm_campaign` + // (营销活动), while 「活动」 is already this pack's label for `crm_event` and + // 「活动参与者」 its child `crm_event_attendee`. Dropping 「营销」 put a + // marketing object inside the calendar family's name space (#810). + label: "\u8425\u9500\u6D3B\u52A8\u6210\u5458", + pluralLabel: "\u8425\u9500\u6D3B\u52A8\u6210\u5458", + description: "\u8425\u9500\u6D3B\u52A8\u6240\u89E6\u8FBE\u7684\u7EBF\u7D22\u4E0E\u8054\u7CFB\u4EBA\u53CA\u5176\u54CD\u5E94\u72B6\u6001", + fields: { + member_number: { label: "\u6210\u5458\u7F16\u53F7" }, + crm_campaign: { label: "\u8425\u9500\u6D3B\u52A8" }, + crm_lead: { label: "\u7EBF\u7D22", help: "\u6210\u5458\u52A0\u5165\u65F6\u8EAB\u4EFD\u4E3A\u7EBF\u7D22\u7684\uFF0C\u8BB0\u5F55\u5728\u6B64" }, + crm_contact: { label: "\u8054\u7CFB\u4EBA", help: "\u6210\u5458\u4E3A\u5DF2\u6709\u8054\u7CFB\u4EBA\u7684\uFF0C\u8BB0\u5F55\u5728\u6B64" }, + status: { + label: "\u72B6\u6001", + options: { + sent: "\u5DF2\u53D1\u9001", + responded: "\u5DF2\u54CD\u5E94", + converted: "\u5DF2\u8F6C\u5316", + unsubscribed: "\u5DF2\u9000\u8BA2" + } + }, + added_date: { label: "\u52A0\u5165\u65F6\u95F4" }, + response_date: { label: "\u54CD\u5E94\u65F6\u95F4" }, + has_responded: { label: "\u5DF2\u54CD\u5E94" } + }, + _sections: { + basic: { label: "\u57FA\u672C\u4FE1\u606F" }, + response: { label: "\u54CD\u5E94\u8DDF\u8E2A" } + }, + _actions: { + mark_responded: { + label: "\u6807\u8BB0\u4E3A\u5DF2\u54CD\u5E94", + successMessage: "\u5DF2\u8BB0\u5F55\u8BE5\u8425\u9500\u6D3B\u52A8\u6210\u5458\u7684\u54CD\u5E94\u3002" + } + } + } +}; + +// src/sales/translations/zh-CN.ts +var zhCN2 = { + objects: { + crm_account: customer2.crm_account, + crm_contact: customer2.crm_contact, + crm_knowledge_article: service2.crm_knowledge_article, + crm_forecast: pipeline2.crm_forecast, + crm_lead: pipeline2.crm_lead, + crm_quote: commerce2.crm_quote, + crm_contract: commerce2.crm_contract, + crm_case: service2.crm_case, + crm_task: activity2.crm_task, + crm_campaign: marketing2.crm_campaign, + crm_product: commerce2.crm_product, + crm_opportunity: pipeline2.crm_opportunity, + crm_event: activity2.crm_event, + crm_event_attendee: activity2.crm_event_attendee, + crm_article_feedback: service2.crm_article_feedback, + crm_campaign_member: marketing2.crm_campaign_member, + crm_opportunity_line_item: pipeline2.crm_opportunity_line_item, + crm_quote_line_item: commerce2.crm_quote_line_item + }, + ...appSurface2 +}; + +// src/sales/translations/ja-JP/app.ts +var appSurface3 = { + apps: { + crm_enterprise: { + label: "HotCRM", + description: "\u55B6\u696D\u30FB\u30B5\u30FC\u30D3\u30B9\u30FB\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0\u5411\u3051\u9867\u5BA2\u95A2\u4FC2\u7BA1\u7406\u30B7\u30B9\u30C6\u30E0", + // Keyed by navigation-node `id` (a flat keyspace regardless of depth). + navigation: { + nav_home: { label: "\u30DB\u30FC\u30E0" }, + group_sales: { label: "\u55B6\u696D" }, + nav_lead: { label: "\u30EA\u30FC\u30C9" }, + nav_account: { label: "\u53D6\u5F15\u5148" }, + nav_account_workbench: { label: "\u53D6\u5F15\u5148\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1" }, + nav_contact: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, + nav_opportunity: { label: "\u5546\u8AC7" }, + nav_quote: { label: "\u898B\u7A4D" }, + nav_contract: { label: "\u5951\u7D04" }, + nav_product: { label: "\u88FD\u54C1" }, + nav_sales_dashboard: { label: "\u55B6\u696D\u5B9F\u7E3E" }, + group_work: { label: "\u30DE\u30A4\u30EF\u30FC\u30AF" }, + nav_my_tasks: { label: "\u79C1\u306E\u30BF\u30B9\u30AF" }, + nav_my_deals: { label: "\u79C1\u306E\u5546\u8AC7" }, + nav_my_leads: { label: "\u79C1\u306E\u30EA\u30FC\u30C9" }, + nav_my_cases: { label: "\u79C1\u306E\u30B1\u30FC\u30B9" }, + nav_my_calendar: { label: "\u30DE\u30A4\u30AB\u30EC\u30F3\u30C0\u30FC" }, + nav_approval_requests: { label: "\u53D7\u4FE1\u30C8\u30EC\u30A4" }, + group_activity: { label: "\u6D3B\u52D5" }, + nav_event: { label: "\u30A4\u30D9\u30F3\u30C8" }, + nav_activity_dashboard: { label: "\u55B6\u696D\u6D3B\u52D5" }, + group_marketing: { label: "\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0" }, + nav_campaign: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" }, + group_service: { label: "\u30B5\u30FC\u30D3\u30B9" }, + nav_case: { label: "\u30B1\u30FC\u30B9" }, + nav_knowledge: { label: "\u30CA\u30EC\u30C3\u30B8\u30D9\u30FC\u30B9" }, + nav_service_dashboard: { label: "\u30B5\u30FC\u30D3\u30B9\u6982\u8981" }, + group_insights: { label: "\u30A4\u30F3\u30B5\u30A4\u30C8" }, + nav_crm_dashboard: { label: "CRM \u6982\u8981" }, + nav_forecast: { label: "\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8" }, + nav_report_pipeline_coverage: { label: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u30AB\u30D0\u30EC\u30C3\u30B8" }, + nav_report_lead_inflow: { label: "\u30EA\u30FC\u30C9\u6D41\u5165" }, + nav_report_sla: { label: "SLA \u5B9F\u7E3E" } + } + } + }, + messages: { + "common.save": "\u4FDD\u5B58", + "common.cancel": "\u30AD\u30E3\u30F3\u30BB\u30EB", + "common.delete": "\u524A\u9664", + "common.edit": "\u7DE8\u96C6", + "common.create": "\u65B0\u898F\u4F5C\u6210", + "common.search": "\u691C\u7D22", + "common.filter": "\u30D5\u30A3\u30EB\u30BF\u30FC", + "common.export": "\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8", + "common.back": "\u623B\u308B", + "common.confirm": "\u78BA\u8A8D", + "nav.sales": "\u55B6\u696D", + "nav.service": "\u30B5\u30FC\u30D3\u30B9", + "nav.marketing": "\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0", + "nav.products": "\u88FD\u54C1", + "nav.analytics": "\u30A2\u30CA\u30EA\u30C6\u30A3\u30AF\u30B9", + "success.saved": "\u30EC\u30B3\u30FC\u30C9\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F", + "success.converted": "\u30EA\u30FC\u30C9\u3092\u5909\u63DB\u3057\u307E\u3057\u305F", + "confirm.delete": "\u3053\u306E\u30EC\u30B3\u30FC\u30C9\u3092\u524A\u9664\u3057\u3066\u3082\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F", + "confirm.convert_lead": "\u3053\u306E\u30EA\u30FC\u30C9\u3092\u53D6\u5F15\u5148\u30FB\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u30FB\u5546\u8AC7\u306B\u5909\u63DB\u3057\u307E\u3059\u304B\uFF1F", + "error.required": "\u3053\u306E\u9805\u76EE\u306F\u5FC5\u9808\u3067\u3059", + "error.load_failed": "\u30C7\u30FC\u30BF\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F" + }, + dashboards: { + sales_activity_dashboard: { + label: "\u55B6\u696D\u6D3B\u52D5", + description: "\u8AB0\u304C\u3069\u308C\u3060\u3051\u9867\u5BA2\u3068\u8A71\u3057\u3066\u3044\u308B\u304B\u3001\u3069\u306E\u53D6\u5F15\u5148\u304C\u6C88\u9ED9\u3057\u3066\u3044\u308B\u304B", + widgets: { + interactions_held: { title: "\u8A18\u9332\u6E08\u307F\u306E\u5BFE\u8A71", description: "\u5B9F\u969B\u306B\u884C\u308F\u308C\u305F\u96FB\u8A71\u3068\u4F1A\u8B70" }, + meetings_booked: { title: "\u8A2D\u5B9A\u6E08\u307F\u306E\u4F1A\u8B70", description: "\u30AB\u30EC\u30F3\u30C0\u30FC\u4E0A\u306B\u3042\u308A\u672A\u5B9F\u65BD\u306E\u4F1A\u8B70" }, + customer_minutes: { title: "\u9867\u5BA2\u63A5\u89E6\u6642\u9593\uFF08\u5206\uFF09", description: "\u9867\u5BA2\u3068\u5411\u304D\u5408\u3063\u305F\u7DCF\u6642\u9593" }, + tasks_completed: { title: "\u5B8C\u4E86\u30BF\u30B9\u30AF", description: "\u30AF\u30ED\u30FC\u30BA\u3057\u305F\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7" }, + activity_by_rep: { title: "\u62C5\u5F53\u8005\u5225\u306E\u6D3B\u52D5", description: "\u62C5\u5F53\u8005\u3054\u3068\u306E\u8A18\u9332\u6E08\u307F\u5BFE\u8A71\u6570" }, + activity_by_week: { title: "\u9031\u6B21\u306E\u6D3B\u52D5\u91CF", description: "\u9031\u3042\u305F\u308A\u306E\u5BFE\u8A71\u6570" }, + activity_mix: { title: "\u6D3B\u52D5\u306E\u5185\u8A33", description: "\u96FB\u8A71\u30FB\u4F1A\u8B70\u30FB\u30C7\u30E2\u306E\u6BD4\u7387" }, + activity_by_record_type: { title: "\u6D3B\u52D5\u306E\u5BFE\u8C61", description: "\u30D5\u30A1\u30CD\u30EB\u306E\u3069\u3053\u306B\u6CE8\u529B\u3057\u3066\u3044\u308B\u304B" }, + deal_activity: { title: "\u5546\u8AC7\u4E0A\u306E\u5BFE\u8A71", description: "\u5546\u8AC7\u306B\u7D10\u3065\u304F\u8A18\u9332\u6E08\u307F\u5BFE\u8A71" }, + open_deals_for_activity: { title: "\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7", description: "\u9032\u884C\u4E2D\u306E\u5546\u8AC7\u6570" }, + quiet_accounts_30: { title: "30 \u65E5\u4EE5\u4E0A\u6C88\u9ED9", description: "1 \u304B\u6708\u9593\u5BFE\u8A71\u8A18\u9332\u306E\u306A\u3044\u30A2\u30AF\u30C6\u30A3\u30D6\u53D6\u5F15\u5148" }, + quiet_accounts_60: { title: "60 \u65E5\u4EE5\u4E0A\u6C88\u9ED9", description: "2 \u304B\u6708\u306E\u6C88\u9ED9 \u2014 \u30EA\u30B9\u30AF\u95BE\u5024" }, + quiet_accounts_90: { title: "90 \u65E5\u4EE5\u4E0A\u6C88\u9ED9", description: "\u56DB\u534A\u671F\u306B\u308F\u305F\u308A\u63A5\u89E6\u306A\u3057" } + } + }, + crm_overview_dashboard: { + label: "CRM \u6982\u8981", + description: "\u58F2\u4E0A\u6307\u6A19\u3001\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u5206\u6790\u3001\u5546\u8AC7\u30A4\u30F3\u30B5\u30A4\u30C8", + widgets: { + total_revenue: { title: "\u7DCF\u58F2\u4E0A", description: "\u5F53\u671F\u306E\u6210\u7ACB\u6E08\u307F\u58F2\u4E0A" }, + active_deals: { title: "\u9032\u884C\u4E2D\u306E\u5546\u8AC7", description: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u4E0A\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7" }, + won_deals: { title: "\u6210\u7ACB\u5546\u8AC7\u6570", description: "\u5F53\u671F\u306B\u6210\u7ACB\u3057\u305F\u5546\u8AC7\u306E\u7DCF\u6570" }, + avg_deal_size: { title: "\u5E73\u5747\u5546\u8AC7\u898F\u6A21", description: "\u6210\u7ACB\u6E08\u307F\u5546\u8AC7\u306E\u5E73\u5747\u91D1\u984D" }, + revenue_trends: { title: "\u58F2\u4E0A\u30C8\u30EC\u30F3\u30C9", description: "\u904E\u53BB12\u304B\u6708\u306E\u6210\u7ACB\u6E08\u307F\u58F2\u4E0A" }, + lead_source: { title: "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9", description: "\u7372\u5F97\u30C1\u30E3\u30CD\u30EB\u5225\u306E\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u91D1\u984D" }, + pipeline_by_stage: { title: "\u30B9\u30C6\u30FC\u30B8\u5225\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", description: "\u5404\u55B6\u696D\u30B9\u30C6\u30FC\u30B8\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u91D1\u984D" }, + top_products: { title: "\u58F2\u308C\u7B4B\u88FD\u54C1", description: "\u88FD\u54C1\u30AB\u30C6\u30B4\u30EA\u5225\u306E\u5B9A\u4FA1\u30D9\u30FC\u30B9\u58F2\u4E0A" }, + pipeline_by_owner: { title: "\u62C5\u5F53\u8005\u5225\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", description: "\u55B6\u696D\u62C5\u5F53\u8005\u3054\u3068\u306E\u30AA\u30FC\u30D7\u30F3\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u91D1\u984D\u3068\u5546\u8AC7\u6570" } + } + }, + executive_dashboard: { + label: "\u30A8\u30B0\u30BC\u30AF\u30C6\u30A3\u30D6\u6982\u8981", + description: "\u7D4C\u55B6\u5C64\u5411\u3051\u306E\u58F2\u4E0A\u30FB\u9867\u5BA2\u30FB\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u306E\u4E3B\u8981KPI", + widgets: { + total_revenue_ytd: { title: "\u5E74\u5EA6\u7D2F\u8A08\u58F2\u4E0A", description: "\u672C\u5E74\u5EA6\u306E\u6210\u7ACB\u6E08\u307F\u58F2\u4E0A" }, + total_accounts: { title: "\u30A2\u30AF\u30C6\u30A3\u30D6\u53D6\u5F15\u5148", description: "\u5C11\u306A\u304F\u3068\u30821\u3064\u306E\u6709\u52B9\u306A\u95A2\u4FC2\u3092\u6301\u3064\u9867\u5BA2" }, + total_contacts: { title: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u6570", description: "\u540D\u7C3F\u306B\u767B\u9332\u3055\u308C\u305F\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, + open_leads: { title: "\u30AA\u30FC\u30D7\u30F3\u30EA\u30FC\u30C9", description: "\u672A\u5909\u63DB\u306E\u30EA\u30FC\u30C9" }, + revenue_trend: { title: "\u58F2\u4E0A\u30C8\u30EC\u30F3\u30C9", description: "\u904E\u53BB12\u304B\u6708\u306E\u6210\u7ACB\u6E08\u307F\u58F2\u4E0A" }, + revenue_by_industry: { title: "\u696D\u7A2E\u5225\u58F2\u4E0A", description: "\u672C\u5E74\u5EA6\u306E\u6210\u7ACB\u6E08\u307F\u58F2\u4E0A\u3092\u696D\u7A2E\u5225\u306B\u5206\u985E" }, + pipeline_by_stage: { title: "\u30B9\u30C6\u30FC\u30B8\u5225\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", description: "\u5404\u55B6\u696D\u30B9\u30C6\u30FC\u30B8\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u91D1\u984D" }, + new_accounts_by_month: { title: "\u65B0\u898F\u53D6\u5F15\u5148", description: "\u904E\u53BB6\u304B\u6708\u306E\u53D6\u5F15\u5148\u4F5C\u6210\u30DA\u30FC\u30B9" }, + accounts_by_industry: { title: "\u696D\u7A2E\u5225\u53D6\u5F15\u5148", description: "\u696D\u7A2E\u3054\u3068\u306E\u5E74\u9593\u58F2\u4E0A\u5408\u8A08\u3068\u53D6\u5F15\u5148\u6570" } + } + }, + sales_dashboard: { + label: "\u55B6\u696D\u5B9F\u7E3E", + description: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u5206\u6790\u3001\u52DD\u7387\u30C8\u30EC\u30F3\u30C9\u3001\u62C5\u5F53\u8005\u5225\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9", + widgets: { + total_pipeline_value: { title: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u5408\u8A08", description: "\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u91D1\u984D\u306E\u5408\u8A08" }, + closed_won_qtd: { title: "\u4ECA\u56DB\u534A\u671F\u6210\u7ACB\u984D", description: "\u4ECA\u56DB\u534A\u671F\u306B\u6210\u7ACB\u3057\u305F\u58F2\u4E0A" }, + open_opportunities: { title: "\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7", description: "\u9032\u884C\u4E2D\u306E\u30A2\u30AF\u30C6\u30A3\u30D6\u5546\u8AC7" }, + avg_deal_size: { title: "\u5E73\u5747\u5546\u8AC7\u898F\u6A21", description: "\u4ECA\u56DB\u534A\u671F\u306E\u6210\u7ACB\u6E08\u307F\u5546\u8AC7\u306E\u5E73\u5747\u91D1\u984D" }, + pipeline_by_stage: { title: "\u30B9\u30C6\u30FC\u30B8\u5225\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", description: "\u5404\u55B6\u696D\u30B9\u30C6\u30FC\u30B8\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u91D1\u984D" }, + monthly_revenue_trend: { title: "\u6708\u6B21\u58F2\u4E0A\u30C8\u30EC\u30F3\u30C9", description: "\u904E\u53BB12\u304B\u6708\u306E\u6210\u7ACB\u6E08\u307F\u58F2\u4E0A" }, + pipeline_by_forecast_category: { title: "\u4E88\u6E2C\u30AB\u30C6\u30B4\u30EA\u5225\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", description: "\u58F2\u4E0A\u4E88\u6E2C\u30AB\u30C6\u30B4\u30EA\u5225\u306E\u30AA\u30FC\u30D7\u30F3\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u91D1\u984D" }, + lead_source_breakdown: { title: "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9", description: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u306E\u6D41\u5165\u5143" }, + open_pipeline_by_owner: { title: "\u62C5\u5F53\u8005\u5225\u30AA\u30FC\u30D7\u30F3\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", description: "\u55B6\u696D\u62C5\u5F53\u8005\u3054\u3068\u306E\u9032\u884C\u4E2D\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u91D1\u984D\u30FB\u5546\u8AC7\u6570\u30FB\u5E73\u5747\u52DD\u7387" }, + quota_attainment_by_rep: { title: "\u62C5\u5F53\u8005\u5225\u30CE\u30EB\u30DE\u9054\u6210\u72B6\u6CC1", description: "\u4E88\u6E2C\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u306B\u57FA\u3065\u304F\u62C5\u5F53\u8005\u5225\u306E\u4ECA\u56DB\u534A\u671F\u30CE\u30EB\u30DE\u30FB\u6210\u7D04\u53CE\u76CA\u30FB\u9054\u6210\u7387" }, + pipeline_stage_by_source: { title: "\u30B9\u30C6\u30FC\u30B8 \xD7 \u30EA\u30FC\u30C9\u30BD\u30FC\u30B9", description: "\u30B9\u30C6\u30FC\u30B8\u3068\u30BD\u30FC\u30B9\u5225\u306E\u9032\u884C\u4E2D\u5546\u8AC7\u91D1\u984D\u306E\u30AF\u30ED\u30B9\u96C6\u8A08" }, + win_rate_12m: { title: "\u52DD\u7387\uFF08\u76F4\u8FD112\u304B\u6708\uFF09", description: "\u76F4\u8FD112\u304B\u6708\u306B\u6C7A\u7740\u3057\u305F\u5546\u8AC7\u306E\u3046\u3061\u6210\u7ACB\u3057\u305F\u5272\u5408" }, + won_deals_12m: { title: "\u6210\u7ACB\u5546\u8AC7\u6570\uFF08\u76F4\u8FD112\u304B\u6708\uFF09", description: "\u52DD\u7387\u306E\u5206\u5B50" }, + lost_deals_12m: { title: "\u5931\u6CE8\u5546\u8AC7\u6570\uFF08\u76F4\u8FD112\u304B\u6708\uFF09", description: "\u52DD\u7387\u306E\u5206\u6BCD\u306E\u3082\u3046\u534A\u5206" }, + win_rate_by_owner: { title: "\u62C5\u5F53\u8005\u5225 \u53D7\u6CE8\uFF0F\u5931\u6CE8", description: "\u76F4\u8FD112\u304B\u6708\u306E\u62C5\u5F53\u8005\u3054\u3068\u306E\u6210\u7ACB\u6570\u30FB\u5931\u6CE8\u6570\u30FB\u52DD\u7387" }, + win_rate_by_lead_source: { title: "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9\u5225 \u53D7\u6CE8\uFF0F\u5931\u6CE8", description: "\u5B9F\u969B\u306B\u6210\u7ACB\u306B\u3064\u306A\u304C\u308B\u306E\u306F\u3069\u306E\u30BD\u30FC\u30B9\u304B \u2014 \u76F4\u8FD112\u304B\u6708" }, + loss_reason_breakdown: { title: "\u5931\u6CE8\u306E\u7406\u7531", description: "\u76F4\u8FD112\u304B\u6708\u306E\u5931\u6CE8\u5546\u8AC7\u3092\u7406\u7531\u5225\u306B\u96C6\u8A08" } + } + }, + service_dashboard: { + label: "\u30AB\u30B9\u30BF\u30DE\u30FC\u30B5\u30FC\u30D3\u30B9", + description: "\u30B1\u30FC\u30B9\u8CA0\u8377\u3001SLA\u5065\u5168\u6027\u3001\u89E3\u6C7A\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9", + widgets: { + open_cases: { title: "\u30AA\u30FC\u30D7\u30F3\u30B1\u30FC\u30B9", description: "\u307E\u3060\u30AF\u30ED\u30FC\u30BA\u3055\u308C\u3066\u3044\u306A\u3044\u30B1\u30FC\u30B9" }, + critical_cases: { title: "\u91CD\u5927\u30B1\u30FC\u30B9", description: "\u512A\u5148\u5EA6\u300C\u91CD\u5927\u300D\u306E\u30AA\u30FC\u30D7\u30F3\u30B1\u30FC\u30B9" }, + avg_resolution_time: { title: "\u5E73\u5747\u89E3\u6C7A\u6642\u9593", description: "\u30AF\u30ED\u30FC\u30BA\u307E\u3067\u306E\u5E73\u5747\u6642\u9593\uFF08\u6642\uFF09" }, + sla_violations: { title: "SLA \u9055\u53CD", description: "SLA \u3092\u8D85\u904E\u3057\u305F\u30B1\u30FC\u30B9" }, + cases_by_status: { title: "\u30B9\u30C6\u30FC\u30BF\u30B9\u5225\u30B1\u30FC\u30B9", description: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u5168\u4F53\u306E\u30EF\u30FC\u30AF\u30ED\u30FC\u30C9\u5206\u5E03" }, + cases_by_priority: { title: "\u512A\u5148\u5EA6\u5225\u30B1\u30FC\u30B9", description: "\u7DCA\u6025\u5EA6\u5225\u306E\u30AA\u30FC\u30D7\u30F3\u30B1\u30FC\u30B9\u69CB\u6210" }, + cases_by_origin: { title: "\u767A\u751F\u6E90\u5225\u30B1\u30FC\u30B9", description: "\u30B1\u30FC\u30B9\u306E\u6D41\u5165\u30C1\u30E3\u30CD\u30EB" }, + daily_case_volume: { title: "\u65E5\u6B21\u30B1\u30FC\u30B9\u4EF6\u6570", description: "\u904E\u53BB30\u65E5\u9593\u306E\u65B0\u898F\u30B1\u30FC\u30B9" }, + sla_compliance_gauge: { title: "SLA \u9054\u6210\u7387", description: "\u5F53\u671F SLA \u5185\u306B\u89E3\u6C7A\u3057\u305F\u30B1\u30FC\u30B9\u306E\u5272\u5408" }, + kb_deflection_rate: { title: "\u30CA\u30EC\u30C3\u30B8\u89E3\u6C7A\u7387", description: "\u30AF\u30ED\u30FC\u30BA\u3057\u305F\u30B1\u30FC\u30B9\u306E\u3046\u3061\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B\u3067\u89E3\u6C7A\u3057\u305F\u5272\u5408" }, + kb_resolved_cases: { title: "\u30CA\u30EC\u30C3\u30B8\u3067\u89E3\u6C7A", description: "\u89E3\u6C7A\u3057\u305F\u8A18\u4E8B\u304C\u7D10\u3065\u304F\u30AF\u30ED\u30FC\u30BA\u6E08\u307F\u30B1\u30FC\u30B9" }, + closed_cases_total: { title: "\u30AF\u30ED\u30FC\u30BA\u6E08\u307F\u30B1\u30FC\u30B9", description: "\u30CA\u30EC\u30C3\u30B8\u89E3\u6C7A\u7387\u306E\u5206\u6BCD" }, + top_resolving_articles: { title: "\u89E3\u6C7A\u4EF6\u6570\u306E\u591A\u3044\u8A18\u4E8B", description: "\u89E3\u6C7A\u3057\u305F\u30AF\u30ED\u30FC\u30BA\u6E08\u307F\u30B1\u30FC\u30B9\u6570\u3067\u4E26\u3079\u305F\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B" }, + my_open_cases_by_priority: { title: "\u512A\u5148\u5EA6\u5225\u306E\u79C1\u306E\u30AA\u30FC\u30D7\u30F3\u30B1\u30FC\u30B9", description: "\u3042\u306A\u305F\u306E\u30AA\u30FC\u30D7\u30F3\u30B1\u30FC\u30B9\u3068\u305D\u306ESLA\u9055\u53CD\u7387\u3092\u512A\u5148\u5EA6\u5225\u306B\u96C6\u8A08" } + } + } + }, + // `title` / `subtitle` translate the page's `page:header`; `title` falls back + // to `label` when omitted, so it is authored only where the two differ. + // Header strings carrying `{field}` tokens keep the token spelling verbatim — + // the console substitutes on the raw key, so a translated token resolves to + // nothing and the header renders blank. + datasets: { + account_metrics: { + label: "\u53D6\u5F15\u5148\u6307\u6A19", + description: "\u696D\u7A2E\u30FB\u7A2E\u5225\u3054\u3068\u306B\u53D6\u5F15\u5148\u6570\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", + dimensions: { + industry: { + label: "\u696D\u7A2E" + }, + type: { + label: "\u7A2E\u5225" + }, + created_at: { + label: "\u4F5C\u6210\u65E5" + } + }, + measures: { + account_count: { + label: "\u53D6\u5F15\u5148\u6570" + }, + annual_revenue_sum: { + label: "\u5E74\u9593\u58F2\u4E0A" + } + } + }, + case_metrics: { + label: "\u30B1\u30FC\u30B9\u6307\u6A19", + description: "\u30B1\u30FC\u30B9\u6570\u30FB\u89E3\u6C7A\u6642\u9593\u30FBSLA \u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", + dimensions: { + created_at: { + label: "\u4F5C\u6210\u65E5" + }, + origin: { + label: "\u767A\u751F\u5143" + }, + priority: { + label: "\u512A\u5148\u5EA6" + }, + resolved_article: { + label: "\u89E3\u6C7A\u306B\u4F7F\u7528\u3057\u305F\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B" + }, + status: { + label: "\u30B9\u30C6\u30FC\u30BF\u30B9" + }, + type: { + label: "\u7A2E\u5225" + } + }, + measures: { + avg_resolution: { + label: "\u5E73\u5747\u89E3\u6C7A\u6642\u9593\uFF08\u6642\u9593\uFF09" + }, + avg_sla_violated: { + label: "SLA \u9055\u53CD\u7387" + }, + case_count: { + label: "\u30B1\u30FC\u30B9\u6570" + }, + closed_count: { + label: "\u30AF\u30ED\u30FC\u30BA\u6E08\u307F\u30B1\u30FC\u30B9" + }, + kb_deflection_rate: { + label: "\u30CA\u30EC\u30C3\u30B8\u30D9\u30FC\u30B9\u81EA\u5DF1\u89E3\u6C7A\u7387" + }, + kb_resolved_count: { + label: "\u30CA\u30EC\u30C3\u30B8\u30D9\u30FC\u30B9\u3067\u89E3\u6C7A\u3057\u305F\u4EF6\u6570" + }, + sla_compliance_rate: { + label: "SLA \u9075\u5B88\u7387" + }, + sla_met_count: { + label: "SLA \u3092\u6E80\u305F\u3057\u305F\u30B1\u30FC\u30B9" + } + } + }, + contact_metrics: { + label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u6307\u6A19", + description: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u6570\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", + measures: { + contact_count: { + label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u6570" + } + } + }, + event_metrics: { + label: "\u6D3B\u52D5\u6307\u6A19", + description: "\u4F1A\u8B70\u30FB\u901A\u8A71\u30FB\u63A5\u89E6\u306E\u65B0\u3057\u3055\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", + dimensions: { + owner: { + label: "\u6240\u6709\u8005" + }, + related_to_type: { + label: "\u95A2\u9023\u5148" + }, + start_datetime: { + label: "\u6D3B\u52D5\u9031" + }, + status: { + label: "\u30B9\u30C6\u30FC\u30BF\u30B9" + }, + type: { + label: "\u6D3B\u52D5\u7A2E\u5225" + } + }, + measures: { + avg_minutes: { + label: "\u5E73\u5747\u6240\u8981\u6642\u9593" + }, + event_count: { + label: "\u6D3B\u52D5\u4EF6\u6570" + }, + total_minutes: { + label: "\u5408\u8A08\u5206\u6570" + } + } + }, + forecast_metrics: { + label: "\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8\u6307\u6A19", + description: "\u62C5\u5F53\u8005\u3054\u3068\u306E\u76EE\u6A19\u30FB\u9054\u6210\u7387\u30FB\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u30AB\u30D0\u30EC\u30C3\u30B8\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", + dimensions: { + owner: { + label: "\u6240\u6709\u8005" + }, + period: { + label: "\u671F\u9593\u7A2E\u5225" + }, + period_label: { + label: "\u671F\u9593" + }, + period_start: { + label: "\u671F\u9593\u958B\u59CB" + } + }, + measures: { + attainment: { + label: "\u9054\u6210\u7387" + }, + closed_sum: { + label: "\u30AF\u30ED\u30FC\u30BA\u6E08\u307F" + }, + commit_sum: { + label: "\u30B3\u30DF\u30C3\u30C8" + }, + pipeline_sum: { + label: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3" + }, + quota_sum: { + label: "\u76EE\u6A19" + } + } + }, + lead_metrics: { + label: "\u30EA\u30FC\u30C9\u6307\u6A19", + description: "\u30EA\u30FC\u30C9\u6570\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", + dimensions: { + created_at: { + label: "\u4F5C\u6210\u65E5" + }, + last_contacted_date: { + label: "\u6700\u7D42\u63A5\u89E6\u65E5" + }, + lead_source: { + label: "\u30BD\u30FC\u30B9" + }, + status: { + label: "\u30B9\u30C6\u30FC\u30BF\u30B9" + } + }, + measures: { + lead_count: { + label: "\u30EA\u30FC\u30C9\u6570" + } + } + }, + opportunity_metrics: { + label: "\u5546\u8AC7\u6307\u6A19", + description: "\u55B6\u696D\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u306E\u4EF6\u6570\u3068\u91D1\u984D\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", + dimensions: { + account_industry: { + label: "\u53D6\u5F15\u5148\u306E\u696D\u7A2E" + }, + close_date: { + label: "\u5B8C\u4E86\u4E88\u5B9A\u65E5" + }, + close_quarter: { + label: "\u5B8C\u4E86\u56DB\u534A\u671F" + }, + forecast_category: { + label: "\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8\u533A\u5206" + }, + lead_source: { + label: "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9" + }, + loss_reason: { + label: "\u5931\u6CE8\u7406\u7531" + }, + owner: { + label: "\u6240\u6709\u8005" + }, + stage: { + label: "\u30B9\u30C6\u30FC\u30B8" + }, + type: { + label: "\u5546\u8AC7\u7A2E\u5225" + }, + win_reason: { + label: "\u53D7\u6CE8\u7406\u7531" + } + }, + measures: { + avg_amount: { + label: "\u5E73\u5747\u5546\u8AC7\u91D1\u984D" + }, + avg_probability: { + label: "\u5E73\u5747\u78BA\u5EA6" + }, + decided_count: { + label: "\u6C7A\u7740\u3057\u305F\u5546\u8AC7" + }, + lost_amount: { + label: "\u5931\u6CE8\u91D1\u984D" + }, + lost_count: { + label: "\u5931\u6CE8\u4EF6\u6570" + }, + opp_count: { + label: "\u5546\u8AC7\u6570" + }, + total_amount: { + label: "\u5408\u8A08\u91D1\u984D" + }, + win_rate: { + label: "\u53D7\u6CE8\u7387" + }, + won_amount: { + label: "\u53D7\u6CE8\u91D1\u984D" + }, + won_count: { + label: "\u53D7\u6CE8\u4EF6\u6570" + } + } + }, + product_metrics: { + label: "\u88FD\u54C1\u6307\u6A19", + description: "\u88FD\u54C1\u30AB\u30BF\u30ED\u30B0\u306E\u4EF6\u6570\u3068\u5B9A\u4FA1\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", + dimensions: { + category: { + label: "\u30AB\u30C6\u30B4\u30EA" + } + }, + measures: { + list_price_sum: { + label: "\u5B9A\u4FA1\u5408\u8A08" + }, + product_count: { + label: "\u88FD\u54C1\u6570" + } + } + }, + task_metrics: { + label: "\u30BF\u30B9\u30AF\u6307\u6A19", + description: "\u30BF\u30B9\u30AF\u306E\u4F5C\u696D\u91CF\u3068\u5B8C\u4E86\u72B6\u6CC1\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", + dimensions: { + due_date: { + label: "\u671F\u9650" + }, + is_completed: { + label: "\u5B8C\u4E86\u6E08\u307F" + }, + is_overdue: { + label: "\u671F\u9650\u8D85\u904E" + }, + priority: { + label: "\u512A\u5148\u5EA6" + }, + priority_rank: { + label: "\u7DCA\u6025\u5EA6" + }, + status: { + label: "\u30B9\u30C6\u30FC\u30BF\u30B9" + }, + type: { + label: "\u7A2E\u5225" + } + }, + measures: { + avg_progress: { + label: "\u5E73\u5747\u9032\u6357" + }, + task_count: { + label: "\u30BF\u30B9\u30AF\u6570" + } + } + } + }, + pages: { + account_detail_page: { + label: "\u53D6\u5F15\u5148\u8A73\u7D30", + description: "\u30B9\u30ED\u30C3\u30C8\u69CB\u6210\u306E\u53D6\u5F15\u5148\u30EC\u30B3\u30FC\u30C9\u30DA\u30FC\u30B8 \u2014 \u30AB\u30B9\u30BF\u30E0\u30D8\u30C3\u30C0\u30FC\u3068\u5E38\u8A2D\u306E\u30C7\u30A3\u30B9\u30AB\u30C3\u30B7\u30E7\u30F3\u30D5\u30A3\u30FC\u30C9\u3002", + title: "{name}", + subtitle: "{industry} \xB7 {type}", + components: { + account_chatter: { label: "\u30C7\u30A3\u30B9\u30AB\u30C3\u30B7\u30E7\u30F3" } + } + }, + account_workbench: { + label: "\u53D6\u5F15\u5148\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1", + description: "\u55B6\u696D\u30C1\u30FC\u30E0\u5411\u3051\u306B\u53B3\u9078\u3057\u305F\u53D6\u5F15\u5148\u30EA\u30B9\u30C8\u3002\u30AF\u30A4\u30C3\u30AF\u30D5\u30A3\u30EB\u30BF\u30FC\u306E\u307F\u3067\u3001\u30D3\u30E5\u30FC\u7BA1\u7406\u306F\u884C\u3044\u307E\u305B\u3093\u3002" + }, + app_launcher_page: { + label: "\u30A2\u30D7\u30EA\u30E9\u30F3\u30C1\u30E3\u30FC", + description: "\u3059\u3079\u3066\u306E\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u306B\u30A2\u30AF\u30BB\u30B9\u3059\u308B\u305F\u3081\u306E\u7D71\u5408\u30CF\u30D6", + subtitle: "\u958B\u59CB\u3059\u308B\u30A2\u30D7\u30EA\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044", + components: { + app_search: { label: "\u30A2\u30D7\u30EA\u3092\u691C\u7D22" }, + app_grid: { label: "\u30A2\u30D7\u30EA\u30B0\u30EA\u30C3\u30C9" } + } + }, + case_detail_page: { + label: "\u30B1\u30FC\u30B9\u8A73\u7D30", + description: "\u30B5\u30FC\u30D3\u30B9\u62C5\u5F53\u8005\u5411\u3051\u306E\u30B1\u30FC\u30B9\u30EC\u30B3\u30FC\u30C9\u30DA\u30FC\u30B8\uFF1A\u30CF\u30A4\u30E9\u30A4\u30C8\u3001SLA \u30D1\u30B9\u3001\u8A73\u7D30\u3001\u6D3B\u52D5\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u3002", + title: "{case_number} \xB7 {subject}", + subtitle: "{crm_account}", + components: { + case_highlights: { label: "\u91CD\u8981\u60C5\u5831" }, + case_status_path: { label: "\u30B1\u30FC\u30B9\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u9032\u6357" }, + case_details: { label: "\u30B1\u30FC\u30B9\u8A73\u7D30\u60C5\u5831" } + } + }, + lead_detail_page: { + label: "\u30EA\u30FC\u30C9\u8A73\u7D30", + description: "\u30CF\u30A4\u30E9\u30A4\u30C8\u30FB\u8A73\u7D30\u30FB\u95A2\u9023\u60C5\u5831\u3092\u5099\u3048\u305F\u30EA\u30FC\u30C9\u306E\u7DCF\u5408\u8A73\u7D30\u30DA\u30FC\u30B8\u3002", + title: "{first_name} {last_name}", + subtitle: "{company}", + components: { + lead_duplicate_alert_confirmed: { label: "\u91CD\u8907\u78BA\u5B9A\u306E\u8B66\u544A" }, + lead_duplicate_alert_suspected: { label: "\u91CD\u8907\u306E\u7591\u3044\u306E\u8B66\u544A" }, + lead_highlights: { label: "\u91CD\u8981\u60C5\u5831" }, + lead_path: { label: "\u30EA\u30FC\u30C9\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u9032\u6357" }, + main_tabs: { label: "\u30EA\u30FC\u30C9\u60C5\u5831\u30BF\u30D6" }, + lead_details: { label: "\u30EA\u30FC\u30C9\u8A73\u7D30\u60C5\u5831" }, + related_accordion: { label: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9" }, + related_tasks: { title: "\u672A\u5B8C\u4E86\u306E\u30BF\u30B9\u30AF", label: "\u30BF\u30B9\u30AF" }, + lead_activity: { label: "\u6D3B\u52D5\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3" }, + lead_history: { label: "\u9805\u76EE\u5C65\u6B74" } + } + }, + opportunity_detail_page: { + label: "\u5546\u8AC7\u8A73\u7D30", + description: "\u30B9\u30C6\u30FC\u30B8\u30D1\u30B9\u30FB\u30CF\u30A4\u30E9\u30A4\u30C8\u30FB\u8A73\u7D30\u30FB\u95A2\u9023\u30EA\u30B9\u30C8\u3092\u5099\u3048\u305F\u5546\u8AC7\u306E\u7DCF\u5408\u8A73\u7D30\u30DA\u30FC\u30B8\u3002", + title: "{name}", + subtitle: "{crm_account}", + components: { + opp_highlights: { label: "\u91CD\u8981\u60C5\u5831" }, + opp_stage_path: { label: "\u5546\u8AC7\u30B9\u30C6\u30FC\u30B8\u306E\u9032\u6357" }, + opp_details: { label: "\u5546\u8AC7\u8A73\u7D30\u60C5\u5831" } + } + }, + sales_home_page: { + label: "\u55B6\u696D\u30DB\u30FC\u30E0", + description: "\u4E3B\u8981\u6307\u6A19\u3068\u30AF\u30A4\u30C3\u30AF\u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u307E\u3068\u3081\u305F\u55B6\u696D\u30C1\u30FC\u30E0\u306E\u30DB\u30FC\u30E0\u30DA\u30FC\u30B8", + title: "\u55B6\u696D\u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9", + subtitle: "\u304A\u304B\u3048\u308A\u306A\u3055\u3044", + components: { + kpi_revenue_won: { + label: "\u53D7\u6CE8\u58F2\u4E0A" + }, + kpi_deals_won: { + label: "\u53D7\u6CE8\u4EF6\u6570" + }, + kpi_pipeline_value: { + label: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u91D1\u984D" + }, + kpi_open_leads: { + label: "\u30AA\u30FC\u30D7\u30F3\u30EA\u30FC\u30C9" + }, + home_upcoming_events: { + label: "\u{1F4C5} \u958B\u50AC\u4E88\u5B9A \xB7 \u76F4\u8FD1\u9806" + }, + quick_create: { title: "\u30AF\u30A4\u30C3\u30AF\u4F5C\u6210", label: "\u30AF\u30A4\u30C3\u30AF\u4F5C\u6210" }, + key_metrics: { title: "\u4E3B\u8981\u696D\u7E3E\u8A55\u4FA1\u6307\u6A19", label: "\u4E3B\u8981\u6307\u6A19" }, + home_tabs: { label: "\u30DB\u30FC\u30E0\u30BF\u30D6" }, + home_my_leads: { label: "\u79C1\u306E\u30EA\u30FC\u30C9" }, + home_my_deals: { label: "\u79C1\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7" }, + home_my_tasks: { label: "\u79C1\u306E\u30AA\u30FC\u30D7\u30F3\u30BF\u30B9\u30AF" }, + ai_briefing: { + title: "AI \u30A2\u30B7\u30B9\u30BF\u30F3\u30C8\u306B\u8CEA\u554F", + label: "\u4ECA\u65E5\u306E AI \u30A2\u30B7\u30B9\u30BF\u30F3\u30C8" + }, + upcoming_events: { title: "\u4ECA\u5F8C\u306E\u4E88\u5B9A", label: "\u4ECA\u5F8C\u306E\u4E88\u5B9A" } + } + }, + utility_bar_page: { + label: "\u30E6\u30FC\u30C6\u30A3\u30EA\u30C6\u30A3\u30D0\u30FC", + description: "\u30D5\u30ED\u30FC\u30C6\u30A3\u30F3\u30B0\u30C4\u30FC\u30EB\u3078\u306E\u30AF\u30A4\u30C3\u30AF\u30A2\u30AF\u30BB\u30B9\u30D0\u30FC", + components: { + notifications_panel: { label: "\u901A\u77E5" }, + quick_notes: { title: "\u30AF\u30A4\u30C3\u30AF\u30E1\u30E2", label: "\u30AF\u30A4\u30C3\u30AF\u30E1\u30E2" }, + quick_search: { label: "\u30AF\u30A4\u30C3\u30AF\u691C\u7D22" } + } + } + }, + // Screen-flow copy (#1210, #1975). Keyed `flows..label`, + // `screens..title` and `screens..fields..{label,placeholder}` + // — the keys `os lint`'s `i18n/missing-flow` names, read by the console's + // flow runner since @objectstack 17.7.0 (the spec's `flows` liveness row is + // `live` there). A screen with no authored `title` shows its flow's label in + // every locale, so each `screen_1.title` repeats the flow label. Since + // 18.0.0-next.0 three more surfaces are keys the engine reads in the run's + // locale, and `i18n/missing-flow` names each missing one: a select field's + // `options.` (worded as the object field's own option in this pack), + // an authored screen `description`, and a refusing `end` node's + // `refusals..message`. A translated description or message is a text + // slot like the one it translates, so a hole in it is `{{ }}`. + // The discount ceiling is interpolated from `QUOTE_DISCOUNT_CEILING`, never + // retyped: the number lives in `_thresholds.ts` alone (#1711). + flows: { + campaign_enrollment: { + label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306B\u30E1\u30F3\u30D0\u30FC\u3092\u767B\u9332", + screens: { + screen_1: { + title: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306B\u30E1\u30F3\u30D0\u30FC\u3092\u767B\u9332", + fields: { + memberSource: { label: "\u767B\u9332\u3059\u308B\u30E1\u30F3\u30D0\u30FC\u306E\u7A2E\u985E", options: { leads: "\u30EA\u30FC\u30C9", contacts: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" } }, + leadStatus: { label: "\u767B\u9332\u3059\u308B\u30EA\u30FC\u30C9\u306E\u30B9\u30C6\u30FC\u30BF\u30B9", options: { new: "\u65B0\u898F", contacted: "\u30B3\u30F3\u30BF\u30AF\u30C8\u6E08\u307F", qualified: "\u9069\u683C" } }, + contactDepartment: { + label: "\u767B\u9332\u3059\u308B\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u90E8\u9580", + options: { executive: "\u7D4C\u55B6\u5C64", sales: "\u55B6\u696D\u90E8", marketing: "\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0\u90E8", engineering: "\u30A8\u30F3\u30B8\u30CB\u30A2\u30EA\u30F3\u30B0\u90E8", support: "\u30B5\u30DD\u30FC\u30C8\u90E8", finance: "\u7D4C\u7406\u90E8", hr: "\u4EBA\u4E8B\u90E8", operations: "\u30AA\u30DA\u30EC\u30FC\u30B7\u30E7\u30F3\u90E8" } + } + } + } + } + }, + escalate_case: { + label: "\u30B1\u30FC\u30B9\u3092\u30A8\u30B9\u30AB\u30EC\u30FC\u30C8", + screens: { screen_1: { title: "\u30B1\u30FC\u30B9\u3092\u30A8\u30B9\u30AB\u30EC\u30FC\u30C8", fields: { reason: { label: "\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u7406\u7531" } } } } + }, + close_case: { + label: "\u30B1\u30FC\u30B9\u3092\u30AF\u30ED\u30FC\u30BA", + screens: { + screen_1: { + title: "\u30B1\u30FC\u30B9\u3092\u30AF\u30ED\u30FC\u30BA", + fields: { + resolution: { label: "\u89E3\u6C7A\u5185\u5BB9" }, + resolved_by_article: { label: "\u89E3\u6C7A\u306B\u4F7F\u3063\u305F\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B\uFF08\u4EFB\u610F\uFF09" } + } + } + } + }, + claim_case: { + label: "\u30B1\u30FC\u30B9\u3092\u5F15\u304D\u53D7\u3051\u308B", + screens: { + screen_1: { + title: "\u30B1\u30FC\u30B9\u3092\u5F15\u304D\u53D7\u3051\u308B", + fields: { + claimStatus: { + label: "\u5BFE\u5FDC\u72B6\u6CC1", + options: { in_progress: "\u5BFE\u5FDC\u4E2D", waiting_customer: "\u9867\u5BA2\u306E\u56DE\u7B54\u5F85\u3061", waiting_support: "\u30B5\u30DD\u30FC\u30C8\u306E\u56DE\u7B54\u5F85\u3061" } + } + } + } + } + }, + lead_conversion: { + label: "\u30EA\u30FC\u30C9\u5909\u63DB\u30D7\u30ED\u30BB\u30B9", + screens: { + screen_1: { + title: "\u30EA\u30FC\u30C9\u5909\u63DB\u30D7\u30ED\u30BB\u30B9", + // The duplicate warning's text is a variable the flow assigns; this + // key can only carry the hole that shows it. + description: "{{duplicateWarning}}", + fields: { + createOpportunity: { label: "\u5546\u8AC7\u3092\u4F5C\u6210\u3057\u307E\u3059\u304B\uFF1F" }, + opportunityName: { label: "\u5546\u8AC7\u540D" }, + opportunityAmount: { label: "\u5546\u8AC7\u91D1\u984D" }, + closeDate: { label: "\u5B8C\u4E86\u4E88\u5B9A\u65E5" } + } + }, + refuse_confirmed_duplicate: { + title: "\u5909\u63DB\u306F\u62D2\u5426\u3055\u308C\u307E\u3057\u305F", + description: "\u3053\u306E\u30EA\u30FC\u30C9\u306E\u91CD\u8907\u30B9\u30C6\u30FC\u30BF\u30B9\u306F\u300C\u91CD\u8907\u78BA\u5B9A\u300D\u3067\u3059\u3002\u30EC\u30D3\u30E5\u30FC\u62C5\u5F53\u8005\u304C\u65E2\u5B58\u306E\u30EC\u30B3\u30FC\u30C9\u3068\u7167\u5408\u3057\u3001\u91CD\u8907\u3067\u3042\u308B\u3068\u8A18\u9332\u3057\u307E\u3057\u305F\u3002\u5909\u63DB\u3059\u308B\u3068\u3001\u540C\u3058\u8CFC\u5165\u8005\u306B\u5BFE\u3057\u3066\u53D6\u5F15\u5148\u30FB\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u30FB\u5546\u8AC7\u304C\u3082\u3046 1 \u4EF6\u305A\u3064\u4F5C\u6210\u3055\u308C\u307E\u3059\u3002\u6B8B\u3059\u30EC\u30B3\u30FC\u30C9\u306F\u3053\u306E\u30EA\u30FC\u30C9\u306E\u300C\u91CD\u8907\u7BA1\u7406\u300D\u30BB\u30AF\u30B7\u30E7\u30F3\u306B\u8868\u793A\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u4EE3\u308F\u308A\u306B\u3001\u3053\u306E\u30EA\u30FC\u30C9\u3092\u91CD\u8907\u3068\u3057\u3066\u4E0D\u9069\u683C\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u5909\u63DB\u3092\u518D\u3073\u53EF\u80FD\u306B\u3067\u304D\u308B\u306E\u306F\u3001\u305D\u306E\u5224\u5B9A\u3092\u898B\u76F4\u3059\u30EC\u30D3\u30E5\u30FC\u62C5\u5F53\u8005\u3060\u3051\u3067\u3059\u3002" + }, + refuse_unapproved: { + title: "\u5909\u63DB\u306F\u62D2\u5426\u3055\u308C\u307E\u3057\u305F", + description: "\u3053\u306E\u30EA\u30FC\u30C9\u306F\u307E\u3060\u5909\u63DB\u306E\u627F\u8A8D\u3092\u5F97\u3066\u3044\u307E\u305B\u3093\u3002\u53D6\u5F15\u5148\u30FB\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u30FB\u5546\u8AC7\u306B\u5909\u63DB\u3059\u308B\u306B\u306F\u3001\u5148\u306B\u627F\u8A8D\u8005\u306E\u627F\u8A8D\u304C\u5FC5\u8981\u3067\u3059\u3002\u30EA\u30FC\u30C9\u306E\u300C\u30B3\u30F3\u30D0\u30FC\u30B8\u30E7\u30F3\u627F\u8A8D\u300D\u9805\u76EE\u3067\u3001\u5224\u65AD\u304C\u307E\u3060\u627F\u8A8D\u5F85\u3061\u304B\u3001\u5374\u4E0B\u3055\u308C\u305F\u304B\u3092\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002\u305D\u308C\u307E\u3067\u306E\u9593\u3082\u30EA\u30FC\u30C9\u3078\u306E\u5BFE\u5FDC\u306F\u7D9A\u3051\u3066\u304F\u3060\u3055\u3044\u3002\u51CD\u7D50\u3055\u308C\u308B\u3082\u306E\u306F\u3042\u308A\u307E\u305B\u3093\u3002" + }, + refuse_no_match_key: { + title: "\u5909\u63DB\u306F\u62D2\u5426\u3055\u308C\u307E\u3057\u305F", + description: "\u3053\u306E\u30EA\u30FC\u30C9\u306E\u4F1A\u793E\u540D\u306B\u306F\u7167\u5408\u30AD\u30FC\u304C\u306A\u3044\u305F\u3081\u3001\u5909\u63DB\u3067\u306F\u3069\u306E\u53D6\u5F15\u5148\u306B\u5C5E\u3059\u308B\u304B\u3092\u5224\u65AD\u3067\u304D\u305A\u3001\u63A8\u6E2C\u3082\u3057\u307E\u305B\u3093\u3002\u63A8\u6E2C\u3059\u308B\u3068\u3001\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3068\u5546\u8AC7\u304C\u5225\u306E\u9867\u5BA2\u306E\u4E0B\u306B\u767B\u9332\u3055\u308C\u308B\u304A\u305D\u308C\u304C\u3042\u308A\u307E\u3059\u3002\u30EA\u30FC\u30C9\u306E\u300C\u4F1A\u793E\u540D\u300D\u3092\u4FDD\u5B58\u3059\u308B\u3068\u30AD\u30FC\u304C\u518D\u4F5C\u6210\u3055\u308C\u308B\u306E\u3067\u3001\u3082\u3046\u4E00\u5EA6\u4FDD\u5B58\u3057\u3066\u304B\u3089\u5909\u63DB\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u4F55\u3082\u4F5C\u6210\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002" + } + } + }, + schedule_followup: { + label: "\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7\u3092\u8A2D\u5B9A", + screens: { + screen_1: { + title: "\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7\u3092\u8A2D\u5B9A", + fields: { + subject: { label: "\u6B21\u306E\u30B9\u30C6\u30C3\u30D7\u306F\uFF1F" }, + dueDate: { label: "\u671F\u9650" }, + activityType: { + label: "\u6D3B\u52D5\u7A2E\u5225", + options: { call: "\u96FB\u8A71", email: "\u30E1\u30FC\u30EB", meeting: "\u4F1A\u8B70", follow_up: "\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7", demo: "\u30C7\u30E2", other: "\u305D\u306E\u4ED6" } + }, + priority: { label: "\u512A\u5148\u5EA6", options: { low: "\u4F4E", normal: "\u901A\u5E38", high: "\u9AD8", urgent: "\u7DCA\u6025" } }, + notes: { label: "\u30E1\u30E2" } + } + } + } + }, + quote_generation: { + label: "\u5546\u8AC7\u304B\u3089\u898B\u7A4D\u3092\u4F5C\u6210", + refusals: { refuse_held: { message: "\u5148\u306B\u6848\u4EF6\u5316\u627F\u8A8D\u304C\u5FC5\u8981\u3067\u3059\u3002\u300C\u6848\u4EF6\u5316\u627F\u8A8D\u3092\u7533\u8ACB\u300D\u306B\u30C1\u30A7\u30C3\u30AF\u3092\u5165\u308C\u3066\u304F\u3060\u3055\u3044\u3002\u4F55\u3082\u4F5C\u6210\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002" } }, + screens: { + screen_1: { + title: "\u5546\u8AC7\u304B\u3089\u898B\u7A4D\u3092\u4F5C\u6210", + fields: { + quoteName: { label: "\u898B\u7A4D\u540D" }, + expirationDays: { label: "\u6709\u52B9\u671F\u9593\uFF08\u65E5\uFF09" }, + discount: { label: `\u5272\u5F15\u7387 % (\u2264 ${QUOTE_DISCOUNT_CEILING})`, placeholder: `0-${QUOTE_DISCOUNT_CEILING}` } + } + } + } + } + } +}; + +// src/sales/translations/ja-JP/_shared.ts +var activityActions3 = { + log_call: { + label: "\u96FB\u8A71\u3092\u8A18\u9332", + successMessage: "\u96FB\u8A71\u3092\u8A18\u9332\u3057\u307E\u3057\u305F\uFF01", + params: { + subject: { label: "\u96FB\u8A71\u306E\u4EF6\u540D" }, + duration: { label: "\u6240\u8981\u6642\u9593\uFF08\u5206\uFF09" }, + attendee_contacts: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u53C2\u52A0\u8005" }, + attendee_users: { label: "\u793E\u5185\u53C2\u52A0\u8005" }, + notes: { label: "\u901A\u8A71\u30E1\u30E2" } + } + }, + log_meeting: { + label: "\u4F1A\u8B70\u3092\u8A18\u9332", + successMessage: "\u4F1A\u8B70\u3092\u8A18\u9332\u3057\u307E\u3057\u305F\uFF01", + params: { + subject: { label: "\u4F1A\u8B70\u306E\u4EF6\u540D" }, + duration: { label: "\u6240\u8981\u6642\u9593\uFF08\u5206\uFF09" }, + attendee_contacts: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u53C2\u52A0\u8005" }, + attendee_users: { label: "\u793E\u5185\u53C2\u52A0\u8005" }, + notes: { label: "\u8B70\u4E8B\u30E1\u30E2" } + } + }, + schedule_meeting: { + label: "\u4F1A\u8B70\u3092\u8A2D\u5B9A", + successMessage: "\u4F1A\u8B70\u3092\u8A2D\u5B9A\u3057\u307E\u3057\u305F\uFF01", + params: { + subject: { label: "\u4F1A\u8B70\u306E\u4EF6\u540D" }, + start_date: { label: "\u958B\u59CB\u65E5 (UTC)" }, + start_time: { label: "\u958B\u59CB\u6642\u523B (UTC)" }, + location: { label: "\u5834\u6240" }, + duration: { label: "\u6240\u8981\u6642\u9593\uFF08\u5206\uFF09" }, + attendee_contacts: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u53C2\u52A0\u8005" }, + attendee_users: { label: "\u793E\u5185\u53C2\u52A0\u8005" }, + notes: { label: "\u30A2\u30B8\u30A7\u30F3\u30C0" } + } + } +}; +var salutationOptions = { mr: "Mr.", ms: "Ms.", mrs: "Mrs.", dr: "\u535A\u58EB", prof: "\u6559\u6388" }; +var industryOptions = { + technology: "\u30C6\u30AF\u30CE\u30ED\u30B8\u30FC", + software: "\u30BD\u30D5\u30C8\u30A6\u30A7\u30A2 / SaaS", + finance: "\u91D1\u878D", + healthcare: "\u30D8\u30EB\u30B9\u30B1\u30A2", + retail: "\u5C0F\u58F2", + manufacturing: "\u88FD\u9020", + education: "\u6559\u80B2", + real_estate: "\u4E0D\u52D5\u7523", + media: "\u30E1\u30C7\u30A3\u30A2\u30FB\u30A8\u30F3\u30BF\u30E1", + logistics: "\u7269\u6D41", + hospitality: "\u30DB\u30B9\u30D4\u30BF\u30EA\u30C6\u30A3", + energy: "\u30A8\u30CD\u30EB\u30AE\u30FC\u30FB\u516C\u76CA", + government: "\u653F\u5E9C\u30FB\u884C\u653F", + nonprofit: "\u975E\u55B6\u5229", + other: "\u305D\u306E\u4ED6" +}; +var leadSourceOptions = { + web: "\u30A6\u30A7\u30D6", + referral: "\u7D39\u4ECB", + event: "\u30A4\u30D9\u30F3\u30C8\u30FB\u5C55\u793A\u4F1A", + webinar: "\u30A6\u30A7\u30D3\u30CA\u30FC", + partner: "\u30D1\u30FC\u30C8\u30CA\u30FC", + advertisement: "\u5E83\u544A", + paid_search: "\u6709\u6599\u691C\u7D22", + social: "\u30BD\u30FC\u30B7\u30E3\u30EB\u30E1\u30C7\u30A3\u30A2", + content: "\u30B3\u30F3\u30C6\u30F3\u30C4\u30FB\u30D6\u30ED\u30B0", + cold_call: "\u30B3\u30FC\u30EB\u30C9\u30B3\u30FC\u30EB", + email_campaign: "\u30E1\u30FC\u30EB\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3", + other: "\u305D\u306E\u4ED6" +}; + +// src/sales/translations/ja-JP/objects.customer.ts +var customer3 = { + crm_account: { + label: "\u53D6\u5F15\u5148", + pluralLabel: "\u53D6\u5F15\u5148", + description: "\u5F53\u793E\u3068\u53D6\u5F15\u306E\u3042\u308B\u4F01\u696D\u30FB\u7D44\u7E54", + fields: { + account_number: { label: "\u53D6\u5F15\u5148\u756A\u53F7" }, + registration_number: { + label: "\u767B\u8A18\u756A\u53F7", + help: "\u53D6\u5F15\u5148\u304C\u81EA\u56FD\u306E\u767B\u8A18\u6A5F\u95A2\u304B\u3089\u4EA4\u4ED8\u3055\u308C\u305F\u767B\u8A18\u4E0A\u306E\u8B58\u5225\u756A\u53F7\u3002\u5F53\u793E\u304C\u63A1\u756A\u3059\u308B\u53D6\u5F15\u5148\u756A\u53F7\u3068\u306F\u7570\u306A\u308A\u307E\u3059\u3002" + }, + commercial_capability: { + label: "\u5546\u8AC7\u53EF\u5426\u533A\u5206", + help: "\u3053\u306E\u53D6\u5F15\u5148\u306B\u5BFE\u3057\u3066\u65B0\u898F\u306E\u5546\u8AC7\u3092\u958B\u59CB\u3067\u304D\u308B\u304B\u3069\u3046\u304B\u3002\u6C7A\u6E08\u306E\u307F\u306E\u53D6\u5F15\u5148\u306F\u8ACB\u6C42\u30FB\u5165\u91D1\u306B\u306F\u5F15\u304D\u7D9A\u304D\u5229\u7528\u3067\u304D\u307E\u3059\u304C\u3001\u65B0\u898F\u5546\u8AC7\u3092\u95A2\u9023\u4ED8\u3051\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002", + options: { full: "\u5236\u9650\u306A\u3057", settlement_only: "\u6C7A\u6E08\u306E\u307F" } + }, + incumbent_vendor: { label: "\u73FE\u884C\u30D9\u30F3\u30C0\u30FC", help: "\u5F53\u793E\u304C\u72D9\u3063\u3066\u3044\u308B\u652F\u51FA\u3092\u73FE\u5728\u53D7\u6CE8\u3057\u3066\u3044\u308B\u30D9\u30F3\u30C0\u30FC\u3002" }, + annual_purchasing_budget: { label: "\u5E74\u9593\u8ABF\u9054\u4E88\u7B97", help: "\u3053\u306E\u53D6\u5F15\u5148\u304C\u4ECA\u5E74\u5EA6\u30D9\u30F3\u30C0\u30FC\u306B\u652F\u51FA\u3059\u308B\u898B\u8FBC\u307F\u984D\u3067\u3042\u308A\u3001\u81EA\u793E\u306E\u58F2\u4E0A\u9AD8\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002" }, + payment_cycle: { + label: "\u652F\u6255\u30B5\u30A4\u30AF\u30EB", + options: { prepaid: "\u524D\u6255\u3044", net_30: "30\u65E5", net_60: "60\u65E5", net_90: "90\u65E5" } + }, + approval_status: { + label: "\u627F\u8A8D\u30B9\u30C6\u30FC\u30BF\u30B9", + help: "\u3053\u306E\u53D6\u5F15\u5148\u306E\u627F\u8A8D\u72B6\u6CC1\u3002\u65B0\u898F\u53D6\u5F15\u5148\u306F\u627F\u8A8D\u5F85\u3061\u3067\u4F5C\u6210\u3055\u308C\u3001\u627F\u8A8D\u30C8\u30EC\u30A4\u3067\u5224\u65AD\u3055\u308C\u307E\u3059\u3002", + options: { pending: "\u627F\u8A8D\u5F85\u3061", approved: "\u627F\u8A8D\u6E08\u307F", rejected: "\u5374\u4E0B" } + }, + name: { label: "\u53D6\u5F15\u5148\u540D", help: "\u4F1A\u793E\u307E\u305F\u306F\u7D44\u7E54\u306E\u6B63\u5F0F\u540D\u79F0" }, + name_normalized: { + label: "\u53D6\u5F15\u5148\u540D\uFF08\u6B63\u898F\u5316\uFF09", + help: "\u30EA\u30FC\u30C9\u5909\u63DB\u306E\u7167\u5408\u30AD\u30FC\u3002\u53D6\u5F15\u5148\u540D\u3092\u5C0F\u6587\u5B57\u5316\u3057\u3001\u524D\u5F8C\u306E\u7A7A\u767D\u3092\u9664\u53BB\u3057\u3066\u3001\u5185\u90E8\u306E\u9023\u7D9A\u3059\u308B\u7A7A\u767D\u3092 1 \u3064\u306B\u307E\u3068\u3081\u305F\u3082\u306E\u3002account_protection \u30D5\u30C3\u30AF\u304C\u81EA\u52D5\u3067\u7DAD\u6301\u3057\u307E\u3059 \u2014 \u76F4\u63A5\u7DE8\u96C6\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002" + }, + display_title: { label: "\u8868\u793A\u540D" }, + type: { + label: "\u30BF\u30A4\u30D7", + options: { prospect: "\u898B\u8FBC\u307F\u5BA2", customer: "\u9867\u5BA2", partner: "\u30D1\u30FC\u30C8\u30CA\u30FC", former: "\u904E\u53BB\u306E\u53D6\u5F15\u5148" } + }, + industry: { + label: "\u696D\u7A2E", + options: { ...industryOptions } + }, + annual_revenue: { label: "\u5E74\u9593\u58F2\u4E0A" }, + child_account_revenue: { label: "\u5B50\u4F1A\u793E\u5E74\u9593\u58F2\u4E0A\u5408\u8A08", help: "\u76F4\u5C5E\u306E\u5B50\u53D6\u5F15\u5148\u306E\u5E74\u9593\u58F2\u4E0A\u306E\u5408\u8A08\u3002" }, + number_of_employees: { label: "\u5F93\u696D\u54E1\u6570" }, + phone: { label: "\u96FB\u8A71\u756A\u53F7" }, + website: { label: "Web\u30B5\u30A4\u30C8" }, + billing_address: { label: "\u8ACB\u6C42\u5148\u4F4F\u6240" }, + billing_country: { + label: "\u8ACB\u6C42\u5148\u56FD", + help: "\u8ACB\u6C42\u5148\u4F4F\u6240\u304B\u3089\u5C0E\u51FA \u2014 \u5165\u529B\u3055\u308C\u305F\u56FD\u540D\u3092\u305D\u306E\u307E\u307E\u3001\u524D\u5F8C\u306E\u7A7A\u767D\u3092\u9664\u53BB\u3057\u5927\u6587\u5B57\u5316\u3057\u305F\u5024\u3002" + }, + territory: { + label: "\u30C6\u30EA\u30C8\u30EA\u30FC", + help: "\u8ACB\u6C42\u5148\u4F4F\u6240\u304B\u3089\u5C0E\u51FA \u2014 \u30C6\u30EA\u30C8\u30EA\u30FC\u5171\u6709\u30EB\u30FC\u30EB\u304C\u7167\u5408\u3059\u308B\u55B6\u696D\u30C6\u30EA\u30C8\u30EA\u30FC\u3002\u62C5\u5F53\u30C1\u30FC\u30E0\u306E\u306A\u3044\u30C6\u30EA\u30C8\u30EA\u30FC\u306E\u53D6\u5F15\u5148\u306F\u300C\u305D\u306E\u4ED6\u300D\u3002", + options: { na: "\u5317\u7C73", emea: "EMEA", other: "\u305D\u306E\u4ED6" } + }, + office_location: { label: "\u30AA\u30D5\u30A3\u30B9\u6240\u5728\u5730" }, + owner_id: { label: "\u53D6\u5F15\u5148\u6240\u6709\u8005" }, + parent_account: { label: "\u89AA\u53D6\u5F15\u5148", help: "\u968E\u5C64\u69CB\u9020\u306B\u304A\u3051\u308B\u89AA\u4F1A\u793E" }, + description: { label: "\u8AAC\u660E" }, + is_active: { label: "\u6709\u52B9" }, + last_activity_date: { label: "\u6700\u7D42\u6D3B\u52D5\u65E5" }, + brand_color: { label: "\u30D6\u30E9\u30F3\u30C9\u30AB\u30E9\u30FC" }, + logo: { label: "\u4F1A\u793E\u30ED\u30B4" }, + tier: { + label: "\u9867\u5BA2\u30E9\u30F3\u30AF", + options: { + strategic: "\u6226\u7565\u9867\u5BA2", + enterprise: "\u30A8\u30F3\u30BF\u30FC\u30D7\u30E9\u30A4\u30BA", + mid_market: "\u30DF\u30C3\u30C9\u30DE\u30FC\u30B1\u30C3\u30C8", + smb: "\u4E2D\u5C0F\u4F01\u696D" + } + }, + segment: { + label: "\u9867\u5BA2\u30BB\u30B0\u30E1\u30F3\u30C8", + options: { net_new: "\u65B0\u898F\u7372\u5F97", growth: "\u6210\u9577", at_risk: "\u30EA\u30B9\u30AF\u3042\u308A", stable: "\u5B89\u5B9A" } + }, + health_score: { + label: "\u30D8\u30EB\u30B9\u30B9\u30B3\u30A2", + help: "\u30AB\u30B9\u30BF\u30DE\u30FC\u30B5\u30AF\u30BB\u30B9\u62C5\u5F53\uFF08CSM\uFF09\u304C\u7BA1\u7406\u3059\u308B\u5065\u5168\u6027\u306E\u6307\u6A19", + options: { healthy: "\u826F\u597D", watching: "\u8981\u89B3\u5BDF", at_risk: "\u30EA\u30B9\u30AF\u3042\u308A", churning: "\u89E3\u7D04\u9032\u884C\u4E2D" } + } + }, + _views: { + all_accounts: { + label: "\u5168\u53D6\u5F15\u5148", + description: "\u58F2\u4E0A\u3068\u696D\u7A2E\u3092\u542B\u3080\u53D6\u5F15\u5148\u306E\u4E00\u89A7", + bulkActions: { + delete: { + label: "\u524A\u9664", + confirmLabel: "\u524A\u9664", + confirmText: "{{count}} \u4EF6\u306E\u53D6\u5F15\u5148\u3092\u5B8C\u5168\u306B\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F\u3053\u306E\u64CD\u4F5C\u306F\u53D6\u308A\u6D88\u305B\u307E\u305B\u3093\u3002" + }, + transfer_owner: { + label: "\u6240\u6709\u8005\u306E\u5909\u66F4", + confirmText: "{{count}} \u4EF6\u306E\u53D6\u5F15\u5148\u306E\u6240\u6709\u8005\u3092\u5909\u66F4\u3057\u307E\u3059\u304B\uFF1F", + params: { + owner_id: { + label: "\u65B0\u3057\u3044\u6240\u6709\u8005" + } + } + }, + update_tier: { + label: "\u9867\u5BA2\u30E9\u30F3\u30AF\u306E\u66F4\u65B0", + confirmText: "{{count}} \u4EF6\u306E\u53D6\u5F15\u5148\u306E\u9867\u5BA2\u30E9\u30F3\u30AF\u3092 {{tier}} \u306B\u66F4\u65B0\u3057\u307E\u3059\u304B\uFF1F", + params: { + tier: { + label: "\u9867\u5BA2\u30E9\u30F3\u30AF" + } + } + } + } + }, + account_gallery: { label: "\u53D6\u5F15\u5148\u30AB\u30FC\u30C9", description: "\u30D6\u30E9\u30F3\u30C9\u30AB\u30E9\u30FC\u4ED8\u304D\u306E\u30AB\u30FC\u30C9\u30D3\u30E5\u30FC" }, + account_map: { label: "\u53D6\u5F15\u5148\u30DE\u30C3\u30D7", description: "\u53D6\u5F15\u5148\u306E\u5730\u7406\u7684\u5206\u5E03" }, + enterprise_accounts: { label: "\u30A8\u30F3\u30BF\u30FC\u30D7\u30E9\u30A4\u30BA\u53D6\u5F15\u5148", description: "\u5E74\u5546\u6700\u4E0A\u4F4D\u306E\u4E3B\u8981\u9867\u5BA2" }, + my_accounts: { label: "\u79C1\u306E\u53D6\u5F15\u5148", description: "\u81EA\u5206\u304C\u6240\u6709\u3059\u308B\u53D6\u5F15\u5148" }, + at_risk_accounts: { label: "\u26A0\uFE0F \u30EA\u30B9\u30AF\u306E\u3042\u308B\u53D6\u5F15\u5148" } + }, + _sections: { + basic: { label: "\u57FA\u672C\u60C5\u5831" }, + financials: { label: "\u8CA1\u52D9\u60C5\u5831" }, + business_profile: { label: "\u30D3\u30B8\u30CD\u30B9\u60C5\u5831" }, + contact_info: { label: "\u9023\u7D61\u5148\u60C5\u5831" }, + ownership: { label: "\u6240\u6709\u8005\u30FB\u30B9\u30C6\u30FC\u30BF\u30B9" }, + branding: { label: "\u30D6\u30E9\u30F3\u30C7\u30A3\u30F3\u30B0" }, + system: { label: "\u30B7\u30B9\u30C6\u30E0" }, + // account.view.ts のフォームセクション名 (#1100) + profile: { label: "\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB" }, + customer_success: { label: "\u30AB\u30B9\u30BF\u30DE\u30FC\u30B5\u30AF\u30BB\u30B9" }, + locations: { label: "\u6240\u5728\u5730" }, + description: { label: "\u8AAC\u660E" } + }, + _actions: { ...activityActions3 } + }, + crm_contact: { + label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", + pluralLabel: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", + description: "\u53D6\u5F15\u5148\u306B\u6240\u5C5E\u3059\u308B\u62C5\u5F53\u8005", + fields: { + salutation: { label: "\u656C\u79F0", options: { ...salutationOptions } }, + first_name: { label: "\u540D" }, + last_name: { label: "\u59D3" }, + full_name: { label: "\u6C0F\u540D" }, + crm_account: { label: "\u53D6\u5F15\u5148" }, + email: { label: "\u30E1\u30FC\u30EB" }, + phone: { label: "\u96FB\u8A71" }, + mobile: { label: "\u643A\u5E2F\u96FB\u8A71" }, + title: { label: "\u5F79\u8077" }, + department: { + label: "\u90E8\u9580", + options: { + executive: "\u7D4C\u55B6\u5C64", + sales: "\u55B6\u696D\u90E8", + marketing: "\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0\u90E8", + engineering: "\u30A8\u30F3\u30B8\u30CB\u30A2\u30EA\u30F3\u30B0\u90E8", + support: "\u30B5\u30DD\u30FC\u30C8\u90E8", + finance: "\u7D4C\u7406\u90E8", + hr: "\u4EBA\u4E8B\u90E8", + operations: "\u30AA\u30DA\u30EC\u30FC\u30B7\u30E7\u30F3\u90E8" + } + }, + // バイイングセンター (REQ-0004) — 意思決定のマップ。英語ラベルは + // 'Buying Role' ではなく 'Buying Function':security-role-word ルールが + // 宣言側で英単語 role を予約している (ADR-0090 D3)。同ルールは英語のみを + // 読み言語パックには及ばないため、ここでは日本語として自然な語を使う。 + buying_function: { + label: "\u8CFC\u8CB7\u5F79\u5272", + options: { + decision_maker: "\u6C7A\u88C1\u8005", + economic_buyer: "\u4E88\u7B97\u6C7A\u88C1\u8005", + technical_evaluator: "\u6280\u8853\u8A55\u4FA1\u8005", + user: "\u5229\u7528\u8005", + influencer: "\u5F71\u97FF\u8005", + gatekeeper: "\u30B2\u30FC\u30C8\u30AD\u30FC\u30D1\u30FC" + } + }, + attitude: { + label: "\u81EA\u793E\u3078\u306E\u614B\u5EA6", + options: { + champion: "\u63A8\u9032\u8005", + supportive: "\u597D\u610F\u7684", + neutral: "\u4E2D\u7ACB", + skeptical: "\u61D0\u7591\u7684", + blocker: "\u53CD\u5BFE\u8005" + } + }, + relationship_strength: { + label: "\u95A2\u4FC2\u306E\u5F37\u3055", + options: { + distant: "\u758E\u9060", + acquaintance: "\u9854\u898B\u77E5\u308A", + working: "\u696D\u52D9\u4E0A\u306E\u95A2\u4FC2", + strong: "\u5F37\u3044", + trusted_advisor: "\u4FE1\u983C\u3055\u308C\u308B\u30A2\u30C9\u30D0\u30A4\u30B6\u30FC" + } + }, + owner_id: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u6240\u6709\u8005" }, + description: { label: "\u8AAC\u660E" }, + is_primary: { label: "\u4E3B\u62C5\u5F53\u8005", help: "\u3053\u306E\u53D6\u5F15\u5148\u306E\u4E3B\u62C5\u5F53\u8005\u304B\u3069\u3046\u304B" }, + avatar: { label: "\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u753B\u50CF" }, + mailing_address: { label: "\u90F5\u9001\u5148\u4F4F\u6240" }, + lead_source: { label: "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9", options: { ...leadSourceOptions } }, + do_not_call: { label: "\u96FB\u8A71\u62D2\u5426" }, + email_opt_out: { label: "\u30E1\u30FC\u30EB\u914D\u4FE1\u505C\u6B62" }, + last_contacted_date: { label: "\u6700\u7D42\u63A5\u89E6\u65E5\u6642" } + }, + _views: { + all_contacts: { label: "\u5168\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, + contact_directory: { label: "\u8CAC\u4EFB\u8005\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA" }, + primary_contacts: { label: "\u4E3B\u62C5\u5F53\u8005" } + }, + _sections: { + identity: { label: "\u57FA\u672C\u60C5\u5831" }, + account_info: { label: "\u53D6\u5F15\u5148\u30FB\u5F79\u8077" }, + buying_centre: { label: "\u30D0\u30A4\u30A4\u30F3\u30B0\u30BB\u30F3\u30BF\u30FC" }, + contact_info: { label: "\u9023\u7D61\u5148\u60C5\u5831" }, + mailing_address: { label: "\u90F5\u9001\u5148\u4F4F\u6240" }, + additional: { label: "\u305D\u306E\u4ED6\u306E\u60C5\u5831" }, + preferences: { label: "\u30B3\u30DF\u30E5\u30CB\u30B1\u30FC\u30B7\u30E7\u30F3\u8A2D\u5B9A" }, + // contact.view.ts のフォームセクション名 (#1100) + contact_details: { label: "\u9023\u7D61\u5148\u60C5\u5831" }, + comm_preferences: { label: "\u8A2D\u5B9A" } + }, + _actions: { + ...activityActions3, + mark_primary: { + label: "\u4E3B\u62C5\u5F53\u8005\u306B\u8A2D\u5B9A", + confirmText: "\u3053\u306E\u8CAC\u4EFB\u8005\u3092\u53D6\u5F15\u5148\u306E\u4E3B\u62C5\u5F53\u8005\u306B\u8A2D\u5B9A\u3057\u307E\u3059\u304B\uFF1F", + successMessage: "\u4E3B\u62C5\u5F53\u8005\u306B\u8A2D\u5B9A\u3057\u307E\u3057\u305F\uFF01" + }, + send_email: { + label: "\u30E1\u30FC\u30EB\u9001\u4FE1", + params: { + subject: { label: "\u4EF6\u540D" }, + body: { label: "\u672C\u6587" } + } + }, + add_contact_to_campaign: { + label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306B\u8FFD\u52A0", + successMessage: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3092\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306B\u8FFD\u52A0\u3057\u307E\u3057\u305F\uFF01", + params: { + crm_campaign: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" } + } + } + } + } +}; + +// src/sales/translations/ja-JP/objects.pipeline.ts +var opportunityStageOptions = { + prospecting: "\u898B\u8FBC\u307F\u8ABF\u67FB", + qualification: "\u9078\u5B9A", + needs_analysis: "\u30CB\u30FC\u30BA\u5206\u6790", + proposal: "\u63D0\u6848", + negotiation: "\u4EA4\u6E09", + closed_won: "\u6210\u7ACB", + closed_lost: "\u4E0D\u6210\u7ACB" +}; +var pipeline3 = { + crm_lead: { + _validations: { + disqualification_reason_required: { + message: "\u30EA\u30FC\u30C9\u3092\u300C\u5BFE\u8C61\u5916\u300D\u306B\u3059\u308B\u5834\u5408\u306F\u5931\u683C\u7406\u7531\u304C\u5FC5\u8981\u3067\u3059" + }, + duplicate_disqualification_requires_survivor: { + message: "\u91CD\u8907\u3092\u7406\u7531\u306B\u30EA\u30FC\u30C9\u3092\u5931\u683C\u3068\u3059\u308B\u5834\u5408\u306F\u3001\u6B8B\u3059\u30EC\u30B3\u30FC\u30C9\u3092\u6307\u5B9A\u3057\u3001\u91CD\u8907\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u300C\u78BA\u8A8D\u6E08\u307F\u300D\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" + }, + email_required: { + message: "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u5FC5\u9808\u3067\u3059" + }, + lead_status_progression: { + message: "\u7121\u52B9\u306A\u30EA\u30FC\u30C9\u30B9\u30C6\u30FC\u30BF\u30B9\u9077\u79FB\u3067\u3059" + } + }, + label: "\u30EA\u30FC\u30C9", + pluralLabel: "\u30EA\u30FC\u30C9", + description: "\u307E\u3060\u9069\u683C\u5224\u5B9A\u3092\u53D7\u3051\u3066\u3044\u306A\u3044\u898B\u8FBC\u307F\u5BA2", + fields: { + salutation: { label: "\u656C\u79F0", options: { ...salutationOptions } }, + first_name: { label: "\u540D" }, + last_name: { label: "\u59D3" }, + full_name: { label: "\u6C0F\u540D" }, + display_title: { label: "\u8868\u793A\u540D" }, + company: { label: "\u4F1A\u793E\u540D" }, + company_normalized: { + label: "\u4F1A\u793E\u540D\uFF08\u6B63\u898F\u5316\uFF09", + help: "\u30EA\u30FC\u30C9\u5909\u63DB\u306E\u7167\u5408\u30AD\u30FC\u3002\u4F1A\u793E\u540D\u3092\u5C0F\u6587\u5B57\u5316\u3057\u3001\u524D\u5F8C\u306E\u7A7A\u767D\u3092\u9664\u53BB\u3057\u3066\u3001\u5185\u90E8\u306E\u9023\u7D9A\u3059\u308B\u7A7A\u767D\u3092 1 \u3064\u306B\u307E\u3068\u3081\u305F\u3082\u306E\u3002lead_duplicate_check \u30D5\u30C3\u30AF\u304C\u81EA\u52D5\u3067\u7DAD\u6301\u3057\u307E\u3059 \u2014 \u76F4\u63A5\u7DE8\u96C6\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002" + }, + title: { label: "\u5F79\u8077" }, + email: { label: "\u30E1\u30FC\u30EB" }, + phone: { label: "\u96FB\u8A71" }, + industry: { + label: "\u696D\u7A2E", + options: { ...industryOptions } + }, + status: { + label: "\u30B9\u30C6\u30FC\u30BF\u30B9", + options: { + new: "\u65B0\u898F", + contacted: "\u30B3\u30F3\u30BF\u30AF\u30C8\u6E08\u307F", + qualified: "\u9069\u683C", + unqualified: "\u4E0D\u9069\u683C", + converted: "\u5909\u63DB\u6E08\u307F" + } + }, + lead_source: { label: "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9", options: { ...leadSourceOptions } }, + owner_id: { label: "\u30EA\u30FC\u30C9\u6240\u6709\u8005" }, + is_converted: { label: "\u5909\u63DB\u6E08\u307F" }, + description: { label: "\u8AAC\u660E" }, + mobile: { label: "\u643A\u5E2F\u96FB\u8A71" }, + website: { label: "Web\u30B5\u30A4\u30C8" }, + rating: { label: "\u30EA\u30FC\u30C9\u30B9\u30B3\u30A2", help: "\u30EA\u30FC\u30C9\u306E\u54C1\u8CEA\u30B9\u30B3\u30A2\uFF081\u301C5 \u6BB5\u968E\uFF09" }, + converted_account: { label: "\u5909\u63DB\u5F8C\u306E\u53D6\u5F15\u5148" }, + converted_contact: { label: "\u5909\u63DB\u5F8C\u306E\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, + converted_opportunity: { label: "\u5909\u63DB\u5F8C\u306E\u5546\u8AC7" }, + converted_date: { label: "\u5909\u63DB\u65E5" }, + address: { label: "\u4F4F\u6240" }, + annual_revenue: { label: "\u5E74\u9593\u58F2\u4E0A" }, + number_of_employees: { label: "\u5F93\u696D\u54E1\u6570" }, + notes: { label: "\u30E1\u30E2", help: "\u3053\u306E\u30EA\u30FC\u30C9\u306B\u95A2\u3059\u308B\u4F5C\u696D\u30E1\u30E2 \u2014 \u66F8\u5F0F\u8A2D\u5B9A\u306B\u5BFE\u5FDC\u3002" }, + do_not_call: { label: "\u96FB\u8A71\u62D2\u5426" }, + email_opt_out: { label: "\u30E1\u30FC\u30EB\u914D\u4FE1\u505C\u6B62" }, + next_followup_date: { label: "\u6B21\u56DE\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7\u65E5" }, + last_contacted_date: { label: "\u6700\u7D42\u63A5\u89E6\u65E5\u6642" }, + need_type: { + label: "\u30CB\u30FC\u30BA\u7A2E\u5225", + help: "\u3053\u306E\u898B\u8FBC\u5BA2\u304C\u4F55\u3092\u6C42\u3081\u3066\u3044\u308B\u304B\u3002\u5272\u308A\u5F53\u3066\u30FB\u512A\u5148\u9806\u4F4D\u4ED8\u3051\u30FB\u9700\u8981\u5206\u6790\u304C\u3053\u306E\u9805\u76EE\u3092\u53C2\u7167\u3057\u307E\u3059\u3002", + options: { + new_implementation: "\u65B0\u898F\u5C0E\u5165", + expansion: "\u62E1\u5F35\u30FB\u8FFD\u52A0", + replacement: "\u5165\u308C\u66FF\u3048\u30FB\u79FB\u884C", + renewal: "\u66F4\u65B0", + consulting: "\u30B3\u30F3\u30B5\u30EB\u30C6\u30A3\u30F3\u30B0", + support: "\u4FDD\u5B88\u30FB\u30B5\u30DD\u30FC\u30C8", + other: "\u305D\u306E\u4ED6" + } + }, + estimated_amount: { + label: "\u4E88\u60F3\u91D1\u984D", + help: "\u30AF\u30AA\u30EA\u30D5\u30A3\u30B1\u30FC\u30B7\u30E7\u30F3\u524D\u306E\u9700\u8981\u91D1\u984D\u306E\u898B\u7A4D\u308A\u3002\u30B3\u30F3\u30D0\u30FC\u30B8\u30E7\u30F3\u6642\u306B\u5546\u8AC7\u91D1\u984D\u3078\u521D\u671F\u5024\u3068\u3057\u3066\u5165\u308A\u307E\u3059\u3002" + }, + conversion_approval_status: { + label: "\u30B3\u30F3\u30D0\u30FC\u30B8\u30E7\u30F3\u627F\u8A8D", + help: "\u3053\u306E\u898B\u8FBC\u5BA2\u304C\u30B3\u30F3\u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u627F\u8A8D\u3092\u5F97\u3066\u3044\u308B\u304B\u3002\u300C\u627F\u8A8D\u4E0D\u8981\u300D\u306F\u627F\u8A8D\u3092\u6C42\u3081\u306A\u3044\u72B6\u614B\u3067\u3001\u51FA\u8377\u6642\u306E\u65E2\u5B9A\u5024\u3067\u3059\u3002", + options: { + not_required: "\u627F\u8A8D\u4E0D\u8981", + pending: "\u627F\u8A8D\u5F85\u3061", + approved: "\u627F\u8A8D\u6E08\u307F", + rejected: "\u5374\u4E0B" + } + }, + disqualification_reason: { + label: "\u4E0D\u9069\u683C\u7406\u7531", + help: "\u30B9\u30C6\u30FC\u30BF\u30B9\u304C\u300C\u4E0D\u9069\u683C\u300D\u306E\u5834\u5408\u306F\u5FC5\u9808", + options: { + not_a_fit: "\u30CB\u30FC\u30BA\u304C\u5408\u308F\u306A\u3044", + no_budget: "\u4E88\u7B97\u306A\u3057", + wrong_persona: "\u62C5\u5F53\u8005\u304C\u7570\u306A\u308B", + unreachable: "\u9023\u7D61\u4E0D\u80FD", + duplicate: "\u91CD\u8907\u30EA\u30FC\u30C9", + competitor: "\u7AF6\u5408\u4ED6\u793E\u306B\u6C7A\u5B9A", + other: "\u305D\u306E\u4ED6" + } + }, + duplicate_of_type: { + label: "\u91CD\u8907\u5BFE\u8C61", + help: "\u91CD\u8907\u5143\u3068\u3057\u3066\u6B8B\u308B\u30EC\u30B3\u30FC\u30C9\u304C\u5C5E\u3059\u308B\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u7A2E\u5225\u3002", + // `erased` は墓碑値であり選択肢ではない。フォームには表示しない + // (`src/sales/views/lead.view.ts` を参照)が、残存レコードが削除された + // リードはこの値を保持するため、レコードを読む場所ではラベルが要る。 + options: { crm_lead: "\u30EA\u30FC\u30C9", crm_contact: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", erased: "\u524A\u9664\u6E08\u307F\u30EC\u30B3\u30FC\u30C9" } + }, + duplicate_of_lead: { label: "\u91CD\u8907\u3059\u308B\u30EA\u30FC\u30C9" }, + duplicate_of_contact: { label: "\u91CD\u8907\u3059\u308B\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, + duplicate_status: { + label: "\u91CD\u8907\u30B9\u30C6\u30FC\u30BF\u30B9", + help: "\u300C\u91CD\u8907\u306E\u7591\u3044\u300D= \u767B\u9332\u6642\u306B\u81EA\u52D5\u3067\u4ED8\u4E0E\u3002\u300C\u91CD\u8907\u78BA\u5B9A\u300D= \u62C5\u5F53\u8005\u304C\u4E00\u81F4\u3092\u78BA\u8A8D\u6E08\u307F\u3002", + options: { suspected: "\u91CD\u8907\u306E\u7591\u3044", confirmed: "\u91CD\u8907\u78BA\u5B9A" } + } + }, + _views: { + all_leads: { + label: "\u5168\u30EA\u30FC\u30C9", + emptyState: { title: "\u30EA\u30FC\u30C9\u304C\u307E\u3060\u3042\u308A\u307E\u305B\u3093", message: "\u6700\u521D\u306E\u30EA\u30FC\u30C9\u3092\u4F5C\u6210\u3057\u3066\u59CB\u3081\u307E\u3057\u3087\u3046" } + }, + kanban_by_status: { label: "\u30EA\u30FC\u30C9\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3" }, + calendar_by_created: { label: "\u30EA\u30FC\u30C9\u30AB\u30EC\u30F3\u30C0\u30FC" }, + gallery_view: { label: "\u30EA\u30FC\u30C9\u30AB\u30FC\u30C9" }, + my_leads: { label: "\u79C1\u306E\u30EA\u30FC\u30C9" }, + high_priority: { label: "\u512A\u5148\u5EA6\u9AD8" }, + hot_leads: { label: "\u{1F525} \u30DB\u30C3\u30C8\u30EA\u30FC\u30C9" }, + suspected_duplicates: { + label: "\u91CD\u8907\u306E\u7591\u3044\u304C\u3042\u308B\u30EA\u30FC\u30C9", + emptyState: { + title: "\u91CD\u8907\u306E\u7591\u3044\u306F\u3042\u308A\u307E\u305B\u3093", + message: "\u78BA\u8A8D\u306F\u4E0D\u8981\u3067\u3059 \u2014 \u518D\u767B\u9332\u3055\u308C\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u3059\u3079\u3066\u30C1\u30A7\u30C3\u30AF\u6E08\u307F\u3067\u3059\u3002" + } + } + }, + _sections: { + // オブジェクト定義のセクションキー(lead.object.ts)— 入力フォームと、 + // これらのグループを参照する詳細ページのセクション(#806)で使用 + address: { label: "\u4F4F\u6240" }, + identity: { label: "\u57FA\u672C\u60C5\u5831" }, + company_info: { label: "\u4F1A\u793E\u60C5\u5831" }, + contact_info: { label: "\u9023\u7D61\u5148\u60C5\u5831" }, + qualification: { label: "\u9069\u683C\u5224\u5B9A" }, + assignment: { label: "\u62C5\u5F53\u8005" }, + additional: { label: "\u305D\u306E\u4ED6\u306E\u60C5\u5831" }, + preferences: { label: "\u30B3\u30DF\u30E5\u30CB\u30B1\u30FC\u30B7\u30E7\u30F3\u8A2D\u5B9A" }, + conversion: { label: "\u5909\u63DB" }, + duplicates: { label: "\u91CD\u8907\u7BA1\u7406" }, + // lead.view.ts のフォームセクション名 (#1100) — デフォルトフォームと + // 名前付き formView すべてのセクション名がここに集まる。あちらにフォームを + // 追加したら、そのセクション名をここに追加する。 + contact_information: { label: "\u9023\u7D61\u5148\u60C5\u5831" }, + lead_classification: { label: "\u30EA\u30FC\u30C9\u5206\u985E" }, + company_information: { label: "\u4F1A\u793E\u60C5\u5831" }, + additional_information: { label: "\u8FFD\u52A0\u60C5\u5831" }, + privacy: { label: "\u30D7\u30E9\u30A4\u30D0\u30B7\u30FC" }, + general: { label: "\u4E00\u822C" }, + details: { label: "\u8A73\u7D30" }, + step_1_contact_details: { label: "\u30B9\u30C6\u30C3\u30D71\uFF1A\u9023\u7D61\u5148\u60C5\u5831" }, + step_2_company_information: { label: "\u30B9\u30C6\u30C3\u30D72\uFF1A\u4F1A\u793E\u60C5\u5831" }, + step_3_qualification: { label: "\u30B9\u30C6\u30C3\u30D73\uFF1A\u8CC7\u683C\u8A55\u4FA1" }, + step_4_review_and_convert: { label: "\u30B9\u30C6\u30C3\u30D74\uFF1A\u78BA\u8A8D\u3068\u5909\u63DB" }, + primary_information: { label: "\u4E3B\u8981\u60C5\u5831" }, + extended_details: { label: "\u8A73\u7D30\u60C5\u5831" }, + quick_edit: { label: "\u30AF\u30A4\u30C3\u30AF\u7DE8\u96C6" }, + update_lead_status: { label: "\u30EA\u30FC\u30C9\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u66F4\u65B0" }, + tell_us_about_yourself: { label: "\u3042\u306A\u305F\u306B\u3064\u3044\u3066\u6559\u3048\u3066\u304F\u3060\u3055\u3044" }, + about_your_company: { label: "\u8CB4\u793E\u306B\u3064\u3044\u3066" }, + how_can_we_help: { label: "\u3069\u306E\u3088\u3046\u306A\u3054\u7528\u4EF6\u3067\u3057\u3087\u3046\u304B\uFF1F" }, + lead_information: { label: "\u30EA\u30FC\u30C9\u60C5\u5831" }, + address_information: { label: "\u4F4F\u6240\u60C5\u5831" }, + privacy_preferences: { label: "\u30D7\u30E9\u30A4\u30D0\u30B7\u30FC\u8A2D\u5B9A" } + }, + _actions: { + ...activityActions3, + convert_lead: { + label: "\u30EA\u30FC\u30C9\u5909\u63DB", + successMessage: "\u30EA\u30FC\u30C9\u306E\u5909\u63DB\u306B\u6210\u529F\u3057\u307E\u3057\u305F\uFF01" + }, + create_campaign: { + label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306B\u8FFD\u52A0", + successMessage: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306B\u8FFD\u52A0\u3057\u307E\u3057\u305F\uFF01", + params: { + crm_campaign: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" } + } + }, + schedule_followup: { + label: "\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7\u3092\u8A2D\u5B9A", + successMessage: "\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7\u3092\u8A2D\u5B9A\u3057\u307E\u3057\u305F\u3002" + } + } + }, + crm_opportunity: { + _validations: { + amount_positive: { + message: "\u91D1\u984D\u306F 0 \u3088\u308A\u5927\u304D\u3044\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" + }, + close_date_future: { + message: "\u5546\u8AC7\u304C\u30AF\u30ED\u30FC\u30BA\u3057\u3066\u3044\u308B\u5834\u5408\u3092\u9664\u304D\u3001\u5B8C\u4E86\u4E88\u5B9A\u65E5\u3092\u904E\u53BB\u306B\u8A2D\u5B9A\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093" + }, + opportunity_stage_progression: { + message: "\u7121\u52B9\u306A\u5546\u8AC7\u30B9\u30C6\u30FC\u30B8\u9077\u79FB\u3067\u3059" + } + }, + label: "\u5546\u8AC7", + pluralLabel: "\u5546\u8AC7", + description: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u4E0A\u306E\u5546\u8AC7\u30FB\u6848\u4EF6", + fields: { + name: { label: "\u5546\u8AC7\u540D" }, + crm_account: { label: "\u53D6\u5F15\u5148" }, + primary_contact: { label: "\u4E3B\u62C5\u5F53\u8005" }, + owner_id: { label: "\u5546\u8AC7\u6240\u6709\u8005" }, + amount: { label: "\u91D1\u984D" }, + expected_revenue: { label: "\u671F\u5F85\u53CE\u76CA" }, + stage: { + label: "\u30B9\u30C6\u30FC\u30B8", + options: { ...opportunityStageOptions } + }, + probability: { label: "\u78BA\u5EA6 (%)" }, + close_date: { label: "\u5B8C\u4E86\u4E88\u5B9A\u65E5" }, + type: { + label: "\u30BF\u30A4\u30D7", + options: { + new_business: "\u65B0\u898F\u30D3\u30B8\u30CD\u30B9", + existing_upgrade: "\u65E2\u5B58\u9867\u5BA2 - \u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9", + existing_renewal: "\u65E2\u5B58\u9867\u5BA2 - \u66F4\u65B0", + existing_expansion: "\u65E2\u5B58\u9867\u5BA2 - \u62E1\u5927" + } + }, + forecast_category: { + label: "\u58F2\u4E0A\u4E88\u6E2C\u30AB\u30C6\u30B4\u30EA", + options: { + pipeline: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", + best_case: "\u30D9\u30B9\u30C8\u30B1\u30FC\u30B9", + commit: "\u30B3\u30DF\u30C3\u30C8", + omitted: "\u9664\u5916", + closed: "\u5B8C\u4E86" + } + }, + description: { label: "\u8AAC\u660E" }, + next_step: { label: "\u6B21\u306E\u30B9\u30C6\u30C3\u30D7" }, + lead_source: { label: "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9", options: { ...leadSourceOptions } }, + crm_campaign: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3", help: "\u3053\u306E\u5546\u8AC7\u3092\u751F\u307F\u51FA\u3057\u305F\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" }, + days_in_stage: { label: "\u73FE\u30B9\u30C6\u30FC\u30B8\u6EDE\u5728\u65E5\u6570" }, + stage_entry_date: { label: "\u30B9\u30C6\u30FC\u30B8\u958B\u59CB\u65E5", help: "\u3053\u306E\u5546\u8AC7\u304C\u73FE\u5728\u306E\u30B9\u30C6\u30FC\u30B8\u306B\u5165\u3063\u305F\u65E5\u3002" }, + is_private: { label: "\u975E\u516C\u958B" }, + approval_status: { + label: "\u627F\u8A8D\u30B9\u30C6\u30FC\u30BF\u30B9", + options: { not_required: "\u627F\u8A8D\u4E0D\u8981", pending: "\u627F\u8A8D\u5F85\u3061", approved: "\u627F\u8A8D\u6E08\u307F", rejected: "\u5374\u4E0B" } + }, + approved_date: { label: "\u627F\u8A8D\u65E5" }, + // #593 — 商談クローズ時に必須。失注理由は営業ダッシュボードの + // 内訳ウィジェットにも出るため、保存値がそのまま画面に出てはいけない。 + win_reason: { + label: "\u53D7\u6CE8\u7406\u7531", + help: "\u53D7\u6CE8\u306B\u81F3\u3063\u305F\u7406\u7531\u3002\u5546\u8AC7\u3092\u300C\u6210\u7ACB\u300D\u3067\u30AF\u30ED\u30FC\u30BA\u3059\u308B\u969B\u306B\u5FC5\u9808\u3067\u3059\u3002", + options: { + better_product: "\u88FD\u54C1\u304C\u512A\u308C\u3066\u3044\u308B", + better_price: "\u4FA1\u683C\u304C\u512A\u308C\u3066\u3044\u308B", + relationship: "\u65E2\u5B58\u306E\u95A2\u4FC2", + better_support: "\u30B5\u30DD\u30FC\u30C8\u304C\u512A\u308C\u3066\u3044\u308B", + best_fit: "\u6700\u9069\u306A\u6A5F\u80FD\u30FB\u9069\u5408\u6027", + quote_accepted: "\u898B\u7A4D\u627F\u8A8D", + other: "\u305D\u306E\u4ED6" + } + }, + loss_reason: { + label: "\u5931\u6CE8\u7406\u7531", + help: "\u5931\u6CE8\u3057\u305F\u7406\u7531\u3002\u5546\u8AC7\u3092\u300C\u4E0D\u6210\u7ACB\u300D\u3067\u30AF\u30ED\u30FC\u30BA\u3059\u308B\u969B\u306B\u5FC5\u9808\u3067\u3059\u3002", + options: { + price: "\u4FA1\u683C\u304C\u9AD8\u3059\u304E\u308B", + competitor: "\u7AF6\u5408\u4ED6\u793E\u306B\u6557\u5317", + no_budget: "\u4E88\u7B97\u306A\u3057", + no_decision: "\u610F\u601D\u6C7A\u5B9A\u306A\u3057", + timing: "\u30BF\u30A4\u30DF\u30F3\u30B0\u4E0D\u9069", + features: "\u6A5F\u80FD\u4E0D\u8DB3", + other: "\u305D\u306E\u4ED6" + } + }, + loss_details: { label: "\u53D7\u6CE8\u30FB\u5931\u6CE8\u306E\u8A73\u7D30", help: "\u53D7\u6CE8\u30FB\u5931\u6CE8\u7406\u7531\u306E\u88DC\u8DB3\u8AAC\u660E\uFF08\u81EA\u7531\u8A18\u8FF0\uFF09\u3002" }, + // REQ-0006 — 適格判定、顧客側の調達スケジュール、商談の経緯、事業区分、ステータス変更承認。 + will_bid: { label: "\u5165\u672D\u4E88\u5B9A", help: "\u5165\u672D\u3059\u308B\u610F\u5411\u304C\u3042\u308B\u304B\u3069\u3046\u304B\u3002\u672A\u8A2D\u5B9A\u306F\u5224\u65AD\u304C\u4FDD\u7559\u4E2D\u3067\u3042\u308B\u3053\u3068\u3092\u793A\u3057\u307E\u3059\u3002" }, + controllability: { label: "\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u5EA6", options: { high: "\u9AD8", medium: "\u4E2D", low: "\u4F4E" } }, + priority: { label: "\u512A\u5148\u5EA6", options: { high: "\u9AD8", medium: "\u4E2D", low: "\u4F4E" } }, + deal_level: { label: "\u5546\u8AC7\u30E9\u30F3\u30AF", options: { strategic: "\u6226\u7565", key: "\u91CD\u70B9", standard: "\u6A19\u6E96" } }, + is_subcontracted: { label: "\u5916\u6CE8\u3042\u308A" }, + subcontracting_note: { label: "\u5916\u6CE8\u30E1\u30E2" }, + customer_initiation_date: { label: "\u9867\u5BA2\u306E\u6848\u4EF6\u5316\u65E5" }, + expected_tender_date: { label: "\u5165\u672D\u4E88\u5B9A\u65E5" }, + expected_signing_date: { label: "\u5951\u7D04\u7DE0\u7D50\u4E88\u5B9A\u65E5" }, + expected_tender_amount: { label: "\u5165\u672D\u4E88\u5B9A\u91D1\u984D" }, + expected_signing_amount: { label: "\u5951\u7D04\u4E88\u5B9A\u91D1\u984D" }, + business_line: { + label: "\u4E8B\u696D\u533A\u5206", + options: { + product: "\u88FD\u54C1", + services: "\u30D7\u30ED\u30D5\u30A7\u30C3\u30B7\u30E7\u30CA\u30EB\u30B5\u30FC\u30D3\u30B9", + consulting: "\u30B3\u30F3\u30B5\u30EB\u30C6\u30A3\u30F3\u30B0", + support: "\u4FDD\u5B88\u30FB\u30B5\u30DD\u30FC\u30C8", + other: "\u305D\u306E\u4ED6" + } + }, + customer_background: { label: "\u9867\u5BA2\u6982\u8981" }, + project_background: { label: "\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u80CC\u666F" }, + risk_analysis: { label: "\u30EA\u30B9\u30AF\u5206\u6790" }, + payment_terms: { label: "\u652F\u6255\u6761\u4EF6" }, + requested_status: { label: "\u7533\u8ACB\u30B9\u30C6\u30FC\u30BF\u30B9", options: { closed_won: "\u53D7\u6CE8", closed_lost: "\u5931\u6CE8" } }, + status_change_approval_status: { + label: "\u30B9\u30C6\u30FC\u30BF\u30B9\u5909\u66F4\u627F\u8A8D", + options: { not_required: "\u627F\u8A8D\u4E0D\u8981", pending: "\u627F\u8A8D\u5F85\u3061", approved: "\u627F\u8A8D\u6E08\u307F", rejected: "\u5374\u4E0B" } + }, + // REQ-0006 ステップ 11 — 案件化(立项)承認。 + qualification_requested: { + label: "\u6848\u4EF6\u5316\u627F\u8A8D\u3092\u7533\u8ACB", + help: "\u30C1\u30A7\u30C3\u30AF\u3059\u308B\u3068\u3053\u306E\u5546\u8AC7\u3092\u6848\u4EF6\u5316\u627F\u8A8D\u306B\u56DE\u3057\u307E\u3059\u3002\u5374\u4E0B\u3055\u308C\u308B\u3068\u30C1\u30A7\u30C3\u30AF\u304C\u5916\u308C\u307E\u3059\u3002\u518D\u5EA6\u30C1\u30A7\u30C3\u30AF\u3059\u308B\u3068\u6539\u3081\u3066\u7533\u8ACB\u3067\u304D\u307E\u3059\u3002" + }, + qualification_approval_status: { + label: "\u6848\u4EF6\u5316\u627F\u8A8D", + options: { not_required: "\u627F\u8A8D\u4E0D\u8981", pending: "\u627F\u8A8D\u5F85\u3061", approved: "\u627F\u8A8D\u6E08\u307F", rejected: "\u5374\u4E0B" } + } + }, + _views: { + tender_this_quarter: { + label: "\u4ECA\u56DB\u534A\u671F\u306B\u5165\u672D\u4E88\u5B9A", + emptyState: { + title: "\u4ECA\u56DB\u534A\u671F\u306B\u5165\u672D\u4E88\u5B9A\u306E\u5546\u8AC7\u306F\u3042\u308A\u307E\u305B\u3093", + message: "\u3053\u306E\u30BF\u30D6\u306B\u306F\u3001\u9867\u5BA2\u5074\u306E\u5165\u672D\u4E88\u5B9A\u65E5\u304C\u4ECA\u56DB\u534A\u671F\u5185\u306B\u3042\u308B\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002\u5546\u8AC7\u306B\u300C\u5165\u672D\u4E88\u5B9A\u65E5\u300D\u3092\u5165\u529B\u3059\u308B\u3068\u3001\u3053\u3053\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002" + } + }, + open_opportunities: { label: "\u9032\u884C\u4E2D\u306E\u5546\u8AC7" }, + all_opportunities: { label: "\u5168\u5546\u8AC7" }, + pipeline_kanban: { label: "\u30BB\u30FC\u30EB\u30B9\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3" }, + close_date_calendar: { label: "\u4E88\u6E2C\u30AB\u30EC\u30F3\u30C0\u30FC" }, + deal_timeline: { label: "\u5546\u8AC7\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3" }, + deal_gallery: { label: "\u5546\u8AC7\u30AB\u30FC\u30C9" }, + my_open_deals: { label: "\u79C1\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7" }, + stale_opportunities: { label: "\u26A0\uFE0F \u505C\u6EDE\u5546\u8AC7 \xB7 \u30B9\u30C6\u30FC\u30B8\u6EDE\u5728\u304C\u9577\u3044\u9806" }, + closing_this_quarter: { + label: "\u4ECA\u56DB\u534A\u671F\u306B\u30AF\u30ED\u30FC\u30BA\u4E88\u5B9A", + emptyState: { + title: "\u4ECA\u56DB\u534A\u671F\u306B\u30AF\u30ED\u30FC\u30BA\u4E88\u5B9A\u306E\u5546\u8AC7\u306F\u3042\u308A\u307E\u305B\u3093", + message: "\u3053\u306E\u30BF\u30D6\u306B\u306F\u3001\u5B8C\u4E86\u4E88\u5B9A\u65E5\u304C\u4ECA\u56DB\u534A\u671F\u5185\u306B\u3042\u308B\u30B3\u30DF\u30C3\u30C8\uFF0F\u30D9\u30B9\u30C8\u30B1\u30FC\u30B9\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002\u73FE\u5728\u8A72\u5F53\u3059\u308B\u5546\u8AC7\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u305D\u308C\u4EE5\u964D\u306B\u30AF\u30ED\u30FC\u30BA\u3059\u308B\u5546\u8AC7\u306F\u300C\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u300D\u30BF\u30D6\u306B\u3042\u308A\u307E\u3059\u3002" + } + } + }, + _sections: { + // オブジェクト定義のセクションキー(opportunity.object.ts)— 入力フォームと、 + // これらのグループを参照する詳細ページのセクション(#1452)で使用 + crm_forecast: { label: "\u30B9\u30C6\u30FC\u30B8\u30FB\u58F2\u4E0A\u4E88\u6E2C" }, + basic: { label: "\u57FA\u672C\u60C5\u5831" }, + financials: { label: "\u8CA1\u52D9\u60C5\u5831" }, + sales_process: { label: "\u55B6\u696D\u30D7\u30ED\u30BB\u30B9" }, + classification: { label: "\u5206\u985E" }, + campaign: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" }, + notes: { label: "\u30E1\u30E2\u30FB\u6B21\u306E\u30B9\u30C6\u30C3\u30D7" }, + qualification: { label: "\u9069\u683C\u5224\u5B9A" }, + narrative: { label: "\u5546\u8AC7\u306E\u7D4C\u7DEF" }, + // opportunity.view.ts のフォームセクション名 (#1100) + overview: { label: "\u6982\u8981" }, + forecast: { label: "\u4E88\u6E2C" }, + sales_strategy: { label: "\u55B6\u696D\u6226\u7565" }, + win_loss: { label: "\u53D7\u6CE8\uFF0F\u5931\u6CE8" } + }, + _actions: { + ...activityActions3, + clone_opportunity: { + label: "\u5546\u8AC7\u3092\u8907\u88FD", + successMessage: "\u5546\u8AC7\u3092\u8907\u88FD\u3057\u307E\u3057\u305F\uFF01" + }, + mass_update_stage: { + label: "\u30B9\u30C6\u30FC\u30B8\u66F4\u65B0", + successMessage: "\u5546\u8AC7\u30B9\u30C6\u30FC\u30B8\u3092\u66F4\u65B0\u3057\u307E\u3057\u305F\uFF01", + params: { + stage: { + label: "\u65B0\u3057\u3044\u30B9\u30C6\u30FC\u30B8", + options: { ...opportunityStageOptions } + } + } + }, + generate_quote: { + label: "\u898B\u7A4D\u3092\u4F5C\u6210", + successMessage: "\u5546\u8AC7\u304B\u3089\u898B\u7A4D\u3092\u4F5C\u6210\u3057\u307E\u3057\u305F\uFF01" + } + } + }, + crm_opportunity_line_item: { + _validations: { + unit_price_positive: { + message: "\u8CA9\u58F2\u4FA1\u683C\u3092\u8CA0\u306E\u5024\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093" + } + }, + label: "\u5546\u8AC7\u5546\u54C1\u660E\u7D30", + pluralLabel: "\u5546\u8AC7\u5546\u54C1\u660E\u7D30", + description: "\u5546\u8AC7\u914D\u4E0B\u306E\u88FD\u54C1\u5225\u4FA1\u683C\u660E\u7D30\u884C", + fields: { + crm_opportunity: { label: "\u5546\u8AC7" }, + crm_product: { label: "\u88FD\u54C1" }, + description: { label: "\u8AAC\u660E" }, + quantity: { label: "\u6570\u91CF" }, + list_price: { label: "\u5B9A\u4FA1", help: "\u88FD\u54C1\u306E\u30AB\u30BF\u30ED\u30B0\u4FA1\u683C\u304B\u3089\u81EA\u52D5\u5165\u529B\u3055\u308C\u307E\u3059" }, + unit_price: { label: "\u8CA9\u58F2\u4FA1\u683C", help: "\u4EA4\u6E09\u5F8C\u306E\u5358\u4FA1\uFF08\u5B9A\u4FA1\u3068\u7570\u306A\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059\uFF09" }, + discount: { label: "\u5272\u5F15\u7387\uFF08%\uFF09" }, + total_price: { label: "\u5408\u8A08" }, + line_number: { label: "\u884C\u756A\u53F7" } + }, + _sections: { + basic: { label: "\u660E\u7D30\u884C" }, + pricing: { label: "\u4FA1\u683C" } + } + }, + crm_forecast: { + _validations: { + period_end_after_start: { + message: "\u671F\u9593\u7D42\u4E86\u306F\u671F\u9593\u958B\u59CB\u3088\u308A\u5F8C\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002" + }, + period_end_matches_calendar_period: { + message: "\u671F\u9593\u7D42\u4E86\u306F\u305D\u306E\u671F\u9593\u306E\u6700\u7D42\u65E5\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u4F8B\uFF1A2026-07-01 \u958B\u59CB\u306E\u56DB\u534A\u671F\u306A\u3089 2026-09-30\u30012026 \u5E74 8 \u6708\u306A\u3089 2026-08-31\u3002" + }, + period_start_first_of_period: { + message: "\u671F\u9593\u958B\u59CB\u306F\u305D\u306E\u671F\u9593\u306E\u521D\u65E5\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u4F8B\uFF1A2026 \u5E74 8 \u6708\u306A\u3089 2026-08-01\u3002" + }, + quarter_starts_on_quarter_boundary: { + message: "\u56DB\u534A\u671F\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8\u306F\u56DB\u534A\u671F\u306E\u5883\u754C\uFF081 \u6708 1 \u65E5\u30014 \u6708 1 \u65E5\u30017 \u6708 1 \u65E5\u300110 \u6708 1 \u65E5\uFF09\u304B\u3089\u958B\u59CB\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002" + }, + snapshot_amounts_non_negative: { + message: "\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u91D1\u984D\u306F\u8CA0\u306E\u5024\u306B\u3067\u304D\u307E\u305B\u3093\u3002" + } + }, + label: "\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8", + pluralLabel: "\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8", + description: "\u62C5\u5F53\u8005\u3054\u3068\u306E\u5B9A\u671F\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3067\u53CE\u76CA\u4E88\u6E2C\u306B\u4F7F\u7528", + fields: { + owner_id: { label: "\u62C5\u5F53\u8005" }, + period: { label: "\u671F\u9593", options: { month: "\u6708\u6B21", quarter: "\u56DB\u534A\u671F" } }, + period_start: { + label: "\u671F\u9593\u958B\u59CB", + help: "\u671F\u9593\u306E\u521D\u65E5\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059 \u2014 \u4F8B: 2026 \u5E74 8 \u6708\u306A\u3089 2026-08-01\u3002\u56DB\u534A\u671F\u306E\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8\u306F\u3055\u3089\u306B\u56DB\u534A\u671F\u306E\u5883\u754C\uFF081 \u6708 1 \u65E5\u30FB4 \u6708 1 \u65E5\u30FB7 \u6708 1 \u65E5\u30FB10 \u6708 1 \u65E5\uFF09\u3067\u958B\u59CB\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002" + }, + period_end: { + label: "\u671F\u9593\u7D42\u4E86", + help: "\u901A\u5E38\u306F\u300C\u671F\u9593\u300D\u3068\u300C\u671F\u9593\u958B\u59CB\u300D\u304B\u3089\u81EA\u52D5\u7684\u306B\u7B97\u51FA\u3055\u308C\u307E\u3059\u3002\u624B\u52D5\u3067\u5165\u529B\u3059\u308B\u5834\u5408\u306F\u3001\u305D\u306E\u671F\u9593\u306E\u6700\u7D42\u65E5\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059 \u2014 \u4F8B: 2026-07-01 \u958B\u59CB\u306E\u56DB\u534A\u671F\u306A\u3089 2026-09-30\u30012026 \u5E74 8 \u6708\u306A\u3089 2026-08-31\u3002" + }, + period_label: { + label: "\u671F\u9593", + help: "\u300C2026 \u5E74\u7B2C 3 \u56DB\u534A\u671F\u300D\u300C2026 \u5E74 8 \u6708\u300D\u306E\u3088\u3046\u306A\u8AAD\u307F\u3084\u3059\u3044\u671F\u9593\u30E9\u30D9\u30EB\u3002" + }, + display_title: { label: "\u8868\u793A\u540D" }, + snapshot_date: { label: "\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u65E5", help: "\u3053\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u53D6\u5F97\u3057\u305F\u65E5\u3002" }, + source: { + label: "\u30BD\u30FC\u30B9", + options: { scheduled: "\u5B9A\u671F\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8", ai: "AI \u30B9\u30AD\u30EB", manual: "\u624B\u52D5\u5165\u529B" } + }, + quota: { label: "\u30AF\u30A9\u30FC\u30BF" }, + pipeline_amount: { + label: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", + help: "\u3053\u306E\u671F\u9593\u306B\u30AF\u30ED\u30FC\u30BA\u4E88\u5B9A\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u306E\u5408\u8A08\u91D1\u984D\uFF08\u30B9\u30C6\u30FC\u30B8\u3092\u554F\u308F\u306A\u3044\uFF09\u3002" + }, + best_case_amount: { + label: "\u30D9\u30B9\u30C8\u30B1\u30FC\u30B9", + help: "\u58F2\u4E0A\u4E88\u6E2C\u30AB\u30C6\u30B4\u30EA\u304C\u300C\u30D9\u30B9\u30C8\u30B1\u30FC\u30B9\u300D\u307E\u305F\u306F\u300C\u30B3\u30DF\u30C3\u30C8\u300D\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u3002" + }, + commit_amount: { + label: "\u30B3\u30DF\u30C3\u30C8", + help: "\u58F2\u4E0A\u4E88\u6E2C\u30AB\u30C6\u30B4\u30EA\u304C\u300C\u30B3\u30DF\u30C3\u30C8\u300D\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\uFF08\u62C5\u5F53\u8005\u304C\u30B3\u30DF\u30C3\u30C8\u6E08\u307F\uFF09\u3002" + }, + closed_amount: { label: "\u30AF\u30ED\u30FC\u30BA", help: "\u3053\u306E\u671F\u9593\u306B\u3059\u3067\u306B\u6210\u7ACB\u3057\u305F\u91D1\u984D\u3002" }, + expected_amount: { + label: "\u4E88\u60F3", + help: "\u30AF\u30ED\u30FC\u30BA + \u30B3\u30DF\u30C3\u30C8 \u2014 \u62C5\u5F53\u8005\u304C\u7121\u7406\u306A\u304F\u7740\u5730\u3092\u898B\u8FBC\u3081\u308B\u91D1\u984D\u3002" + }, + attainment_pct: { + label: "\u9054\u6210\u7387 %", + help: "\u30AF\u30ED\u30FC\u30BA \xF7 \u30AF\u30A9\u30FC\u30BF \xD7 100\u3002\u30AF\u30A9\u30FC\u30BF\u304C\u6B63\u306E\u5024\u306B\u306A\u308B\u307E\u3067\u306F 0% \u3068\u8868\u793A\u3055\u308C\u307E\u3059\u3002" + }, + coverage_ratio: { + label: "\u30AB\u30D0\u30EC\u30C3\u30B8", + help: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3 \xF7\uFF08\u30AF\u30A9\u30FC\u30BF \u2212 \u30AF\u30ED\u30FC\u30BA\uFF09\u2014 \u6B8B\u308A\u306E\u5DEE\u5206\u3092\u57CB\u3081\u308B\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u304C\u5341\u5206\u304B\u3069\u3046\u304B\u3002\u30AF\u30A9\u30FC\u30BF\u9054\u6210\u6E08\u307F\u306E\u5834\u5408\u306F 0 \u3068\u8868\u793A\u3055\u308C\u307E\u3059\u3002" + }, + notes: { label: "\u30E1\u30E2" }, + seed_key: { + label: "\u30B7\u30FC\u30C9\u30AD\u30FC", + help: "\u30C7\u30E2\u30C7\u30FC\u30BF\u306E\u8B58\u5225\u5B50\u3002\u30B7\u30FC\u30C9\u30ED\u30FC\u30C0\u30FC\u3060\u3051\u304C\u66F8\u304D\u8FBC\u307F\u3001\u5B9F\u969B\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3067\u306F\u5E38\u306B\u7A7A\u3067\u3059\u3002" + } + }, + _views: { + all_forecasts: { label: "\u3059\u3079\u3066\u306E\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8" }, + this_quarter_forecasts: { + label: "\u4ECA\u56DB\u534A\u671F", + emptyState: { + title: "\u4ECA\u56DB\u534A\u671F\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093", + message: "\u56DB\u534A\u671F\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u306F\u591C\u9593\u306E\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8\u96C6\u8A08\u304C\u66F8\u304D\u8FBC\u307F\u307E\u3059\u3002\u4ECA\u56DB\u534A\u671F\u5206\u304C\u4E00\u5EA6\u5B9F\u884C\u3055\u308C\u308B\u307E\u3067\u3053\u306E\u30D3\u30E5\u30FC\u306F\u7A7A\u3067\u3059\u3002\u78BA\u5B9A\u6E08\u307F\u306E\u56DB\u534A\u671F\u306F\u300C\u3059\u3079\u3066\u300D\u30BF\u30D6\u306B\u3042\u308A\u307E\u3059\u3002" + } + }, + my_forecast: { label: "\u81EA\u5206\u306E\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8" } + }, + _sections: { + basic: { label: "\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8" }, + amounts: { label: "\u91D1\u984D" }, + meta: { label: "\u30BD\u30FC\u30B9" }, + // forecast.view.ts のフォームセクション名 (#1100) + snapshot: { label: "\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8" }, + notes: { label: "\u30E1\u30E2" } + } + } +}; + +// src/sales/translations/ja-JP/objects.commerce.ts +var paymentTermsOptions = { + net_15: "15 \u65E5\u4EE5\u5185\u6255\u3044", + net_30: "30 \u65E5\u4EE5\u5185\u6255\u3044", + net_60: "60 \u65E5\u4EE5\u5185\u6255\u3044", + net_90: "90 \u65E5\u4EE5\u5185\u6255\u3044", + due_on_receipt: "\u8ACB\u6C42\u66F8\u53D7\u9818\u6642\u6255\u3044" +}; +var commerce3 = { + crm_quote: { + _validations: { + discount_within_ceiling: { + message: "\u5272\u5F15\u7387\u306F 60% \u3092\u8D85\u3048\u3089\u308C\u307E\u305B\u3093" + }, + expiration_after_quote: { + message: "\u6709\u52B9\u671F\u9650\u306F\u898B\u7A4D\u65E5\u3088\u308A\u5F8C\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" + }, + quote_status_progression: { + message: "\u7121\u52B9\u306A\u898B\u7A4D\u30B9\u30C6\u30FC\u30BF\u30B9\u9077\u79FB\u3067\u3059" + } + }, + label: "\u898B\u7A4D", + pluralLabel: "\u898B\u7A4D", + description: "\u9867\u5BA2\u306B\u63D0\u793A\u3059\u308B\u4FA1\u683C\u898B\u7A4D", + fields: { + quote_number: { label: "\u898B\u7A4D\u756A\u53F7" }, + name: { label: "\u898B\u7A4D\u540D" }, + display_title: { label: "\u8868\u793A\u540D" }, + crm_account: { label: "\u53D6\u5F15\u5148" }, + crm_contact: { + label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", + help: "\u898B\u7A4D\u304C\u300C\u63D0\u793A\u6E08\u307F\u300D\u307E\u305F\u306F\u300C\u627F\u8A8D\u6E08\u307F\u300D\u306B\u306A\u3063\u305F\u6642\u70B9\u3067\u5FC5\u9808\u3067\u3059\u3002\u4F5C\u6210\u3055\u308C\u308B\u5951\u7D04\u306E\u4E3B\u62C5\u5F53\u8005\u306F\u3053\u3053\u304B\u3089\u5F15\u304D\u7D99\u304C\u308C\u307E\u3059\u3002" + }, + crm_opportunity: { label: "\u5546\u8AC7" }, + owner_id: { label: "\u898B\u7A4D\u62C5\u5F53\u8005" }, + status: { + label: "\u30B9\u30C6\u30FC\u30BF\u30B9", + options: { + draft: "\u4E0B\u66F8\u304D", + in_review: "\u30EC\u30D3\u30E5\u30FC\u4E2D", + presented: "\u63D0\u793A\u6E08\u307F", + accepted: "\u627F\u8A8D\u6E08\u307F", + rejected: "\u5374\u4E0B", + expired: "\u671F\u9650\u5207\u308C" + } + }, + quote_date: { label: "\u898B\u7A4D\u65E5" }, + expiration_date: { label: "\u6709\u52B9\u671F\u9650" }, + subtotal: { label: "\u5C0F\u8A08" }, + discount: { label: "\u5272\u5F15\u7387(%)" }, + discount_amount: { label: "\u5272\u5F15\u984D" }, + tax: { label: "\u7A0E\u984D" }, + shipping_handling: { label: "\u914D\u9001\u30FB\u624B\u6570\u6599" }, + total_price: { label: "\u5408\u8A08\u91D1\u984D" }, + payment_terms: { label: "\u652F\u6255\u6761\u4EF6", options: { ...paymentTermsOptions } }, + shipping_terms: { label: "\u914D\u9001\u6761\u4EF6" }, + billing_address: { label: "\u8ACB\u6C42\u5148\u4F4F\u6240" }, + shipping_address: { label: "\u914D\u9001\u5148\u4F4F\u6240" }, + description: { label: "\u8AAC\u660E" }, + internal_notes: { label: "\u5185\u90E8\u30E1\u30E2" } + }, + _views: { + all_quotes: { label: "\u5168\u898B\u7A4D" }, + quote_pipeline: { label: "\u898B\u7A4D\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3" }, + quote_calendar: { label: "\u898B\u7A4D\u30AB\u30EC\u30F3\u30C0\u30FC" } + }, + _sections: { + basic: { label: "\u898B\u7A4D\u60C5\u5831" }, + pricing: { label: "\u4FA1\u683C" }, + terms: { label: "\u6761\u4EF6\u30FB\u6709\u52B9\u671F\u9650" }, + address: { label: "\u4F4F\u6240" }, + system: { label: "\u30B7\u30B9\u30C6\u30E0" }, + // quote.view.ts のフォームセクション名 (#1100) + quote: { label: "\u898B\u7A4D\u66F8" }, + totals: { label: "\u5408\u8A08" }, + quote_terms: { label: "\u5951\u7D04\u6761\u4EF6" }, + addresses_and_notes: { label: "\u4F4F\u6240\u3068\u5099\u8003" } + } + }, + crm_quote_line_item: { + _validations: { + discount_within_ceiling: { + message: "\u660E\u7D30\u306E\u5272\u5F15\u7387\u306F 60% \u3092\u8D85\u3048\u3089\u308C\u307E\u305B\u3093" + }, + unit_price_positive: { + message: "\u8CA9\u58F2\u4FA1\u683C\u3092\u8CA0\u306E\u5024\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093" + } + }, + label: "\u898B\u7A4D\u660E\u7D30", + pluralLabel: "\u898B\u7A4D\u660E\u7D30", + description: "\u898B\u7A4D\u914D\u4E0B\u306E\u88FD\u54C1\u5225\u4FA1\u683C\u660E\u7D30\u884C", + fields: { + crm_quote: { label: "\u898B\u7A4D" }, + crm_product: { label: "\u88FD\u54C1" }, + description: { label: "\u8AAC\u660E" }, + quantity: { label: "\u6570\u91CF" }, + list_price: { label: "\u5B9A\u4FA1" }, + unit_price: { label: "\u8CA9\u58F2\u4FA1\u683C" }, + discount: { label: "\u5272\u5F15\u7387\uFF08%\uFF09" }, + subtotal: { label: "\u5C0F\u8A08" }, + total_price: { label: "\u5408\u8A08" }, + line_number: { label: "\u884C\u756A\u53F7" } + }, + _sections: { + basic: { label: "\u660E\u7D30\u884C" }, + pricing: { label: "\u4FA1\u683C" } + } + }, + crm_contract: { + _validations: { + end_after_start: { + message: "\u7D42\u4E86\u65E5\u306F\u958B\u59CB\u65E5\u3088\u308A\u5F8C\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" + }, + contract_status_progression: { + message: "\u7121\u52B9\u306A\u5951\u7D04\u30B9\u30C6\u30FC\u30BF\u30B9\u9077\u79FB\u3067\u3059" + } + }, + label: "\u5951\u7D04", + pluralLabel: "\u5951\u7D04", + description: "\u9867\u5BA2\u3068\u7DE0\u7D50\u3057\u305F\u6CD5\u7684\u306A\u5951\u7D04\u30FB\u5408\u610F", + fields: { + contract_number: { label: "\u5951\u7D04\u756A\u53F7" }, + crm_account: { label: "\u53D6\u5F15\u5148" }, + crm_contact: { label: "\u4E3B\u62C5\u5F53\u8005" }, + crm_opportunity: { label: "\u95A2\u9023\u5546\u8AC7" }, + owner_id: { label: "\u5951\u7D04\u62C5\u5F53\u8005" }, + status: { + label: "\u30B9\u30C6\u30FC\u30BF\u30B9", + options: { + draft: "\u4E0B\u66F8\u304D", + in_approval: "\u627F\u8A8D\u4E2D", + activated: "\u6709\u52B9", + expired: "\u671F\u9650\u5207\u308C", + terminated: "\u89E3\u7D04" + } + }, + contract_term_months: { label: "\u5951\u7D04\u671F\u9593\uFF08\u6708\uFF09" }, + start_date: { label: "\u958B\u59CB\u65E5" }, + end_date: { label: "\u7D42\u4E86\u65E5" }, + contract_value: { label: "\u5951\u7D04\u91D1\u984D" }, + billing_frequency: { + label: "\u8ACB\u6C42\u983B\u5EA6", + options: { monthly: "\u6708\u6B21", quarterly: "\u56DB\u534A\u671F", annually: "\u5E74\u6B21", one_time: "\u4E00\u62EC" } + }, + payment_terms: { label: "\u652F\u6255\u6761\u4EF6", options: { ...paymentTermsOptions } }, + auto_renewal: { label: "\u81EA\u52D5\u66F4\u65B0" }, + renewal_notice_days: { label: "\u66F4\u65B0\u901A\u77E5\uFF08\u65E5\uFF09" }, + contract_type: { + label: "\u5951\u7D04\u7A2E\u5225", + options: { + subscription: "\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u5951\u7D04", + service: "\u30B5\u30FC\u30D3\u30B9\u5951\u7D04", + license: "\u30E9\u30A4\u30BB\u30F3\u30B9\u5951\u7D04", + partnership: "\u30D1\u30FC\u30C8\u30CA\u30FC\u30B7\u30C3\u30D7\u5951\u7D04", + nda: "\u79D8\u5BC6\u4FDD\u6301\u5951\u7D04 (NDA)", + msa: "\u57FA\u672C\u5951\u7D04 (MSA)" + } + }, + signed_date: { label: "\u7F72\u540D\u65E5" }, + signed_by: { label: "\u7F72\u540D\u8005" }, + document_url: { label: "\u5951\u7D04\u66F8\u985E" }, + special_terms: { label: "\u7279\u7D04\u4E8B\u9805" }, + description: { label: "\u8AAC\u660E" }, + billing_address: { label: "\u8ACB\u6C42\u5148\u4F4F\u6240" } + }, + _views: { + all_contracts: { label: "\u5168\u5951\u7D04" }, + renewal_calendar: { label: "\u66F4\u65B0\u30AB\u30EC\u30F3\u30C0\u30FC" }, + contract_gantt: { label: "\u5951\u7D04\u671F\u9593" }, + contract_timeline: { label: "\u5951\u7D04\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3" } + }, + _sections: { + basic: { label: "\u5951\u7D04\u60C5\u5831" }, + parties: { label: "\u5951\u7D04\u5F53\u4E8B\u8005" }, + terms: { label: "\u5951\u7D04\u6761\u4EF6\u30FB\u671F\u9593" }, + value: { label: "\u5951\u7D04\u91D1\u984D" }, + status: { label: "\u30B9\u30C6\u30FC\u30BF\u30B9\u30FB\u627F\u8A8D" }, + renewal: { label: "\u66F4\u65B0" }, + // contract.view.ts のフォームセクション名 (#1100) + contract_terms: { label: "\u5951\u7D04\u6761\u4EF6" }, + signing_and_documents: { label: "\u7F72\u540D\u3068\u66F8\u985E" }, + notes: { label: "\u5099\u8003" } + } + }, + crm_product: { + _validations: { + cost_less_than_price: { + message: "\u539F\u4FA1\u306F\u5B9A\u4FA1\u3088\u308A\u4F4E\u304F\u3057\u3066\u304F\u3060\u3055\u3044" + }, + price_positive: { + message: "\u5B9A\u4FA1\u306F\u6B63\u306E\u5024\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" + } + }, + label: "\u88FD\u54C1", + pluralLabel: "\u88FD\u54C1", + description: "\u81EA\u793E\u304C\u63D0\u4F9B\u3059\u308B\u88FD\u54C1\u30FB\u30B5\u30FC\u30D3\u30B9", + fields: { + product_code: { label: "\u88FD\u54C1\u30B3\u30FC\u30C9" }, + name: { label: "\u88FD\u54C1\u540D" }, + display_title: { label: "\u8868\u793A\u540D" }, + description: { label: "\u8AAC\u660E" }, + category: { + label: "\u30AB\u30C6\u30B4\u30EA", + options: { + software: "\u30BD\u30D5\u30C8\u30A6\u30A7\u30A2", + hardware: "\u30CF\u30FC\u30C9\u30A6\u30A7\u30A2", + service: "\u30B5\u30FC\u30D3\u30B9", + subscription: "\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3", + support: "\u30B5\u30DD\u30FC\u30C8" + } + }, + family: { + label: "\u88FD\u54C1\u30D5\u30A1\u30DF\u30EA", + options: { + enterprise: "\u30A8\u30F3\u30BF\u30FC\u30D7\u30E9\u30A4\u30BA\u5411\u3051\u30BD\u30EA\u30E5\u30FC\u30B7\u30E7\u30F3", + smb: "\u4E2D\u5C0F\u4F01\u696D\u5411\u3051\u30BD\u30EA\u30E5\u30FC\u30B7\u30E7\u30F3", + services: "\u30D7\u30ED\u30D5\u30A7\u30C3\u30B7\u30E7\u30CA\u30EB\u30B5\u30FC\u30D3\u30B9", + cloud: "\u30AF\u30E9\u30A6\u30C9\u30B5\u30FC\u30D3\u30B9" + } + }, + list_price: { label: "\u5B9A\u4FA1" }, + cost: { label: "\u30B3\u30B9\u30C8" }, + sku: { label: "SKU" }, + is_active: { label: "\u6709\u52B9" }, + product_manager: { label: "\u30D7\u30ED\u30C0\u30AF\u30C8\u30DE\u30CD\u30FC\u30B8\u30E3\u30FC" }, + image: { label: "\u88FD\u54C1\u753B\u50CF" }, + datasheet: { label: "\u30C7\u30FC\u30BF\u30B7\u30FC\u30C8" } + }, + _views: { + all_products: { label: "\u5168\u88FD\u54C1" }, + product_catalog: { label: "\u88FD\u54C1\u30AB\u30BF\u30ED\u30B0" } + }, + _sections: { + basic: { label: "\u88FD\u54C1\u60C5\u5831" }, + pricing: { label: "\u4FA1\u683C" }, + metadata: { label: "\u95A2\u9023\u8CC7\u6599" }, + // product.view.ts のフォームセクション名 (#1100) + product_info: { label: "\u88FD\u54C1\u60C5\u5831" }, + pricing_info: { label: "\u4FA1\u683C" }, + media: { label: "\u30E1\u30C7\u30A3\u30A2" } + } + } +}; + +// src/sales/translations/ja-JP/objects.service.ts +var service3 = { + crm_case: { + _validations: { + resolution_required_for_closed: { + message: "\u30B1\u30FC\u30B9\u3092\u30AF\u30ED\u30FC\u30BA\u3059\u308B\u306B\u306F\u89E3\u6C7A\u5185\u5BB9\u304C\u5FC5\u8981\u3067\u3059" + }, + escalation_reason_required: { + message: "\u30B1\u30FC\u30B9\u3092\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u3059\u308B\u306B\u306F\u7406\u7531\u304C\u5FC5\u8981\u3067\u3059" + }, + case_status_progression: { + message: "\u7121\u52B9\u306A\u30B9\u30C6\u30FC\u30BF\u30B9\u9077\u79FB\u3067\u3059" + } + }, + label: "\u30B1\u30FC\u30B9", + pluralLabel: "\u30B1\u30FC\u30B9", + description: "\u30AB\u30B9\u30BF\u30DE\u30FC\u30B5\u30DD\u30FC\u30C8\u306E\u30B1\u30FC\u30B9\u3068\u30B5\u30FC\u30D3\u30B9\u4F9D\u983C", + fields: { + case_number: { label: "\u30B1\u30FC\u30B9\u756A\u53F7" }, + subject: { label: "\u4EF6\u540D" }, + display_title: { label: "\u8868\u793A\u540D" }, + description: { label: "\u8AAC\u660E" }, + crm_account: { label: "\u53D6\u5F15\u5148" }, + crm_contact: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, + status: { + label: "\u30B9\u30C6\u30FC\u30BF\u30B9", + options: { + new: "\u65B0\u898F", + in_progress: "\u5BFE\u5FDC\u4E2D", + waiting_customer: "\u9867\u5BA2\u306E\u56DE\u7B54\u5F85\u3061", + waiting_support: "\u30B5\u30DD\u30FC\u30C8\u306E\u56DE\u7B54\u5F85\u3061", + escalated: "\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u6E08", + resolved: "\u89E3\u6C7A\u6E08", + closed: "\u30AF\u30ED\u30FC\u30BA\u6E08" + } + }, + priority: { + label: "\u512A\u5148\u5EA6", + options: { low: "\u4F4E", medium: "\u4E2D", high: "\u9AD8", critical: "\u91CD\u5927" } + }, + priority_rank: { label: "\u512A\u5148\u5EA6\u30E9\u30F3\u30AF" }, + type: { + label: "\u30B1\u30FC\u30B9\u7A2E\u5225", + options: { + question: "\u554F\u3044\u5408\u308F\u305B", + problem: "\u4E0D\u5177\u5408", + feature_request: "\u6A5F\u80FD\u8981\u671B", + bug: "\u30D0\u30B0" + } + }, + origin: { + label: "\u30B1\u30FC\u30B9\u767A\u751F\u5143", + options: { email: "\u30E1\u30FC\u30EB", phone: "\u96FB\u8A71", web: "\u30A6\u30A7\u30D6", chat: "\u30C1\u30E3\u30C3\u30C8", social_media: "\u30BD\u30FC\u30B7\u30E3\u30EB\u30E1\u30C7\u30A3\u30A2" } + }, + owner_id: { label: "\u30B1\u30FC\u30B9\u62C5\u5F53\u8005" }, + closed_date: { label: "\u30AF\u30ED\u30FC\u30BA\u65E5" }, + first_response_date: { label: "\u521D\u56DE\u5FDC\u7B54\u65E5" }, + resolution_time_hours: { label: "\u89E3\u6C7A\u6642\u9593\uFF08\u6642\u9593\uFF09" }, + sla_due_date: { label: "SLA\u671F\u9650", help: "\u30B1\u30FC\u30B9\u306E\u512A\u5148\u5EA6\u3068\u53D6\u5F15\u5148\u306E\u9867\u5BA2\u30E9\u30F3\u30AF\u304B\u3089\u8A2D\u5B9A\u3055\u308C\u3001\u66A6\u6642\u9593\u3067\u6570\u3048\u307E\u3059\u3002\u591C\u9593\u30FB\u9031\u672B\u30FB\u795D\u65E5\u3082\u3059\u3079\u3066\u542B\u307E\u308C\u307E\u3059\u3002" }, + is_sla_violated: { label: "SLA\u9055\u53CD" }, + is_escalated: { label: "\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u6E08" }, + escalated_date: { label: "\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u65E5" }, + escalation_reason: { label: "\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u7406\u7531" }, + resolution: { label: "\u89E3\u6C7A\u5185\u5BB9" }, + resolved_by_article: { label: "\u89E3\u6C7A\u3057\u305F\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B", help: "\u3053\u306E\u30B1\u30FC\u30B9\u3092\u89E3\u6C7A\u3057\u305F\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B \u2014 \u9038\u3089\u3057\u7387\u306E\u6307\u6A19\u3002" }, + internal_notes: { label: "\u5185\u90E8\u30E1\u30E2", help: "\u9867\u5BA2\u306B\u306F\u8868\u793A\u3055\u308C\u306A\u3044\u793E\u5185\u5411\u3051\u30E1\u30E2" }, + is_closed: { label: "\u30AF\u30ED\u30FC\u30BA\u6E08" } + }, + _views: { + all_cases: { label: "\u5168\u30B1\u30FC\u30B9" }, + case_workflow: { label: "\u30B5\u30FC\u30D3\u30B9\u30D5\u30ED\u30FC" }, + sla_calendar: { label: "SLA \u30AB\u30EC\u30F3\u30C0\u30FC" }, + case_timeline: { label: "\u30B1\u30FC\u30B9\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3" }, + unassigned_triage: { + label: "\u672A\u5272\u308A\u5F53\u3066 \u2014 \u30C8\u30EA\u30A2\u30FC\u30B8", + emptyState: { + title: "\u30C8\u30EA\u30A2\u30FC\u30B8\u5F85\u3061\u306F\u3042\u308A\u307E\u305B\u3093", + message: "\u3059\u3079\u3066\u306E\u30B1\u30FC\u30B9\u306B\u6240\u6709\u8005\u304C\u3044\u307E\u3059\u3002\u6240\u6709\u8005\u306E\u306A\u3044\u30B1\u30FC\u30B9\u306F\u3053\u3053\u306B\u8868\u793A\u3055\u308C\u307E\u3059 \u2014 \u901A\u5E38\u306F\u3001\u30B5\u30FC\u30D3\u30B9\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306E\u8077\u4F4D\u3092\u8AB0\u3082\u4FDD\u6301\u3057\u3066\u3044\u306A\u3044\u9593\u306B\u5C4A\u3044\u305F Web-to-Case \u306E\u9001\u4FE1\u3067\u3059\u3002" + } + }, + escalated_cases: { label: "\u30A8\u30B9\u30AB\u30EC\u30FC\u30C8\u3057\u305F\u30B1\u30FC\u30B9" }, + my_open_cases: { label: "\u79C1\u306E\u30AA\u30FC\u30D7\u30F3\u30B1\u30FC\u30B9" }, + sla_at_risk: { label: "\u23F0 SLA \u30EA\u30B9\u30AF\u3042\u308A" } + }, + _sections: { + // case.view.ts のフォームセクション名 (#1100)。 + case: { label: "\u30B1\u30FC\u30B9" }, + how_can_we_help: { label: "\u3069\u306E\u3088\u3046\u306A\u3054\u7528\u4EF6\u3067\u3057\u3087\u3046\u304B\uFF1F" }, + // オブジェクト定義のセクションキー(case.object.ts)— 入力フォームと、 + // これらのグループを参照する詳細ページのセクション(#970)で使用 + basic: { label: "\u30B1\u30FC\u30B9\u60C5\u5831" }, + origin: { label: "\u767A\u751F\u5143\u30FB\u632F\u308A\u5206\u3051" }, + sla: { label: "SLA\u30FB\u512A\u5148\u5EA6" }, + resolution: { label: "\u89E3\u6C7A" }, + escalation: { label: "\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3" }, + system: { label: "\u30B7\u30B9\u30C6\u30E0" } + }, + _actions: { + ...activityActions3, + escalate_case: { + label: "\u30B1\u30FC\u30B9\u3092\u30A8\u30B9\u30AB\u30EC\u30FC\u30C8", + confirmText: "\u3053\u306E\u30B1\u30FC\u30B9\u3092\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u30C1\u30FC\u30E0\u3078\u5F15\u304D\u7D99\u304E\u307E\u3059\u3002\u7D9A\u884C\u3057\u307E\u3059\u304B\uFF1F", + successMessage: "\u30B1\u30FC\u30B9\u3092\u30A8\u30B9\u30AB\u30EC\u30FC\u30C8\u3057\u307E\u3057\u305F\uFF01" + }, + close_case: { + label: "\u30B1\u30FC\u30B9\u3092\u30AF\u30ED\u30FC\u30BA", + confirmText: "\u3053\u306E\u30B1\u30FC\u30B9\u3092\u30AF\u30ED\u30FC\u30BA\u3057\u3066\u3082\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F", + successMessage: "\u30B1\u30FC\u30B9\u3092\u30AF\u30ED\u30FC\u30BA\u3057\u307E\u3057\u305F\uFF01" + }, + claim_case: { + label: "\u30B1\u30FC\u30B9\u3092\u5F15\u304D\u53D7\u3051\u308B", + successMessage: "\u30B1\u30FC\u30B9\u3092\u5F15\u304D\u53D7\u3051\u307E\u3057\u305F\u3002\u62C5\u5F53\u8005\u306F\u3042\u306A\u305F\u3067\u3059\u3002" + } + } + }, + crm_knowledge_article: { + _validations: { + published_requires_body: { + message: "\u672C\u6587\u306E\u306A\u3044\u8A18\u4E8B\u306F\u516C\u958B\u3067\u304D\u307E\u305B\u3093\u3002" + }, + published_requires_summary: { + message: "\u516C\u958B\u6E08\u307F\u306E\u8A18\u4E8B\u306B\u306F\u3001\u691C\u7D22\u7D50\u679C\u3068 AI \u306E\u5F15\u7528\u306E\u305F\u3081\u306B\u6982\u8981\u3092\u8A18\u8F09\u3057\u3066\u304F\u3060\u3055\u3044\u3002" + } + }, + label: "\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B", + pluralLabel: "\u30CA\u30EC\u30C3\u30B8\u30D9\u30FC\u30B9", + description: "\u9867\u5BA2\u3068\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u304C\u518D\u5229\u7528\u3067\u304D\u308B\u56DE\u7B54\u3068\u30CF\u30A6\u30C4\u30FC\u30AC\u30A4\u30C9", + fields: { + article_number: { label: "\u8A18\u4E8B\u756A\u53F7" }, + title: { label: "\u30BF\u30A4\u30C8\u30EB" }, + display_title: { label: "\u8868\u793A\u540D" }, + summary: { label: "\u8981\u7D04", help: "\u691C\u7D22\u7D50\u679C\u3084 AI \u306E\u5F15\u7528\u306B\u8868\u793A\u3055\u308C\u308B 1 \u6BB5\u843D\u306E\u8981\u7D04\u3002" }, + body: { label: "\u672C\u6587", help: "\u8A18\u4E8B\u306E\u672C\u6587\uFF08Markdown\uFF09\u3002" }, + category: { + label: "\u30AB\u30C6\u30B4\u30EA", + options: { + getting_started: "\u306F\u3058\u3081\u306B", + how_to: "\u30CF\u30A6\u30C4\u30FC", + troubleshooting: "\u30C8\u30E9\u30D6\u30EB\u30B7\u30E5\u30FC\u30C6\u30A3\u30F3\u30B0", + billing: "\u8ACB\u6C42\u3068\u6599\u91D1", + api: "API \u3068\u9023\u643A", + release_notes: "\u30EA\u30EA\u30FC\u30B9\u30CE\u30FC\u30C8", + policy: "\u30DD\u30EA\u30B7\u30FC" + } + }, + tags: { + label: "\u30BF\u30B0", + options: { + auth: "\u8A8D\u8A3C", + sso: "SSO", + mobile: "\u30E2\u30D0\u30A4\u30EB", + email: "\u30E1\u30FC\u30EB", + reports: "\u30EC\u30DD\u30FC\u30C8", + performance: "\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9", + data_import: "\u30C7\u30FC\u30BF\u30A4\u30F3\u30DD\u30FC\u30C8", + webhooks: "Webhook" + } + }, + status: { + label: "\u30B9\u30C6\u30FC\u30BF\u30B9", + options: { draft: "\u4E0B\u66F8\u304D", in_review: "\u30EC\u30D3\u30E5\u30FC\u4E2D", published: "\u516C\u958B\u6E08\u307F", archived: "\u30A2\u30FC\u30AB\u30A4\u30D6" } + }, + audience: { + label: "\u5BFE\u8C61", + help: "\u516C\u958B\u8A18\u4E8B\u306F\u30AB\u30B9\u30BF\u30DE\u30FC\u30DD\u30FC\u30BF\u30EB\u306B\u8868\u793A\u3055\u308C\u3001\u793E\u5185\u8A18\u4E8B\u306F\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306E\u307F\u304C\u95B2\u89A7\u3067\u304D\u307E\u3059\u3002", + options: { public: "\u516C\u958B", internal: "\u793E\u5185" } + }, + language: { + label: "\u8A00\u8A9E", + options: { en: "\u82F1\u8A9E", zh_cn: "\u7C21\u4F53\u5B57\u4E2D\u56FD\u8A9E", es_es: "\u30B9\u30DA\u30A4\u30F3\u8A9E", ja_jp: "\u65E5\u672C\u8A9E" } + }, + owner_id: { label: "\u6240\u6709\u8005" }, + related_to_case: { label: "\u5143\u306E\u30B1\u30FC\u30B9", help: "\u3053\u306E\u8A18\u4E8B\u306E\u5143\u306B\u306A\u3063\u305F\u30B1\u30FC\u30B9\uFF08\u4EFB\u610F\uFF09\u3002" }, + published_at: { label: "\u516C\u958B\u65E5\u6642" }, + last_reviewed_at: { label: "\u6700\u7D42\u30EC\u30D3\u30E5\u30FC" }, + helpful_count: { label: "\u5F79\u306B\u7ACB\u3063\u305F", help: "crm_article_feedback \u304B\u3089\u518D\u96C6\u8A08\u3055\u308C\u307E\u3059\u3002\u624B\u5165\u529B\u306F\u3067\u304D\u307E\u305B\u3093\u3002" }, + not_helpful_count: { label: "\u5F79\u306B\u7ACB\u305F\u306A\u304B\u3063\u305F", help: "crm_article_feedback \u304B\u3089\u518D\u96C6\u8A08\u3055\u308C\u307E\u3059\u3002\u624B\u5165\u529B\u306F\u3067\u304D\u307E\u305B\u3093\u3002" } + }, + _views: { + all_articles: { label: "\u3059\u3079\u3066\u306E\u8A18\u4E8B" }, + published_articles: { label: "\u516C\u958B\u6E08\u307F" }, + my_drafts: { label: "\u81EA\u5206\u306E\u4E0B\u66F8\u304D" } + }, + _sections: { + basic: { label: "\u8A18\u4E8B\u60C5\u5831" }, + content: { label: "\u30B3\u30F3\u30C6\u30F3\u30C4" }, + taxonomy: { label: "\u5206\u985E" }, + metrics: { label: "\u5229\u7528\u72B6\u6CC1" }, + engagement: { label: "\u5229\u7528\u72B6\u6CC1" }, + // knowledge_article.view.ts のフォームセクション名 (#1100) + article: { label: "\u8A18\u4E8B" } + }, + _actions: { + mark_article_helpful: { + label: "\u5F79\u306B\u7ACB\u3063\u305F", + successMessage: "\u300C\u5F79\u306B\u7ACB\u3063\u305F\u300D\u3068\u3057\u3066\u8A18\u9332\u3057\u307E\u3057\u305F\u3002\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002" + }, + mark_article_not_helpful: { + label: "\u5F79\u306B\u7ACB\u305F\u306A\u304B\u3063\u305F", + successMessage: "\u300C\u5F79\u306B\u7ACB\u305F\u306A\u304B\u3063\u305F\u300D\u3068\u3057\u3066\u8A18\u9332\u3057\u307E\u3057\u305F\u3002\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002" + } + } + }, + crm_article_feedback: { + label: "\u8A18\u4E8B\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF", + pluralLabel: "\u8A18\u4E8B\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF", + description: "\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B\u306B\u5BFE\u3059\u308B\u8AAD\u8005\u306E\u300C\u5F79\u306B\u7ACB\u3063\u305F / \u5F79\u306B\u7ACB\u305F\u306A\u304B\u3063\u305F\u300D\u8A55\u4FA1", + fields: { + feedback_number: { label: "\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u756A\u53F7" }, + owner_id: { label: "\u8AAD\u8005" }, + crm_knowledge_article: { label: "\u8A18\u4E8B", help: "\u3053\u306E\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u306E\u5BFE\u8C61\u3068\u306A\u308B\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B\u3002" }, + verdict: { + label: "\u8A55\u4FA1", + options: { helpful: "\u5F79\u306B\u7ACB\u3063\u305F", not_helpful: "\u5F79\u306B\u7ACB\u305F\u306A\u304B\u3063\u305F" } + }, + comment: { label: "\u30B3\u30E1\u30F3\u30C8", help: "\u8A55\u4FA1\u306E\u7406\u7531\uFF08\u4EFB\u610F\uFF09 \u2014 \u8A18\u4E8B\u306E\u4F5C\u6210\u8005\u304C\u8AAD\u307F\u307E\u3059\u3002" } + }, + _sections: { + basic: { label: "\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF" } + } + } +}; + +// src/sales/translations/ja-JP/objects.activity.ts +var relatedToTypeOptions = { + crm_account: "\u53D6\u5F15\u5148", + crm_contact: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", + crm_opportunity: "\u5546\u8AC7", + crm_lead: "\u30EA\u30FC\u30C9", + crm_case: "\u30B1\u30FC\u30B9" +}; +var activity3 = { + crm_task: { + _validations: { + completed_date_required: { + message: "\u30B9\u30C6\u30FC\u30BF\u30B9\u304C\u300C\u5B8C\u4E86\u300D\u306E\u5834\u5408\u306F\u5B8C\u4E86\u65E5\u304C\u5FC5\u8981\u3067\u3059" + }, + recurrence_fields_required: { + message: "\u7E70\u308A\u8FD4\u3057\u30BF\u30B9\u30AF\u306B\u306F\u7E70\u308A\u8FD4\u3057\u7A2E\u5225\u304C\u5FC5\u8981\u3067\u3059" + }, + related_to_required: { + message: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9\u3092\u5C11\u306A\u304F\u3068\u3082 1 \u4EF6\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044" + } + }, + label: "\u30BF\u30B9\u30AF", + pluralLabel: "\u30BF\u30B9\u30AF", + description: "\u6D3B\u52D5\u3068 ToDo", + fields: { + subject: { label: "\u4EF6\u540D" }, + description: { label: "\u8AAC\u660E" }, + status: { + label: "\u30B9\u30C6\u30FC\u30BF\u30B9", + options: { + not_started: "\u672A\u7740\u624B", + in_progress: "\u9032\u884C\u4E2D", + waiting: "\u5F85\u6A5F\u4E2D", + completed: "\u5B8C\u4E86", + deferred: "\u4FDD\u7559" + } + }, + priority: { + label: "\u512A\u5148\u5EA6", + options: { low: "\u4F4E", normal: "\u901A\u5E38", high: "\u9AD8", urgent: "\u7DCA\u6025" } + }, + priority_rank: { label: "\u512A\u5148\u5EA6\u30E9\u30F3\u30AF" }, + type: { + label: "\u30BF\u30B9\u30AF\u7A2E\u5225", + options: { + call: "\u96FB\u8A71", + email: "\u30E1\u30FC\u30EB", + meeting: "\u4F1A\u8B70", + follow_up: "\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7", + demo: "\u30C7\u30E2", + other: "\u305D\u306E\u4ED6" + } + }, + due_date: { label: "\u671F\u9650" }, + reminder_date: { label: "\u30EA\u30DE\u30A4\u30F3\u30C0\u30FC\u65E5\u6642" }, + reminder_sent: { label: "\u30EA\u30DE\u30A4\u30F3\u30C0\u30FC\u9001\u4FE1\u6E08\u307F" }, + completed_date: { label: "\u5B8C\u4E86\u65E5" }, + owner_id: { label: "\u62C5\u5F53\u8005" }, + related_to_type: { + label: "\u95A2\u9023\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u7A2E\u5225", + options: { ...relatedToTypeOptions } + }, + related_to_account: { label: "\u95A2\u9023\u53D6\u5F15\u5148" }, + related_to_contact: { label: "\u95A2\u9023\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, + related_to_opportunity: { label: "\u95A2\u9023\u5546\u8AC7" }, + related_to_lead: { label: "\u95A2\u9023\u30EA\u30FC\u30C9" }, + related_to_case: { label: "\u95A2\u9023\u30B1\u30FC\u30B9" }, + is_recurring: { label: "\u7E70\u308A\u8FD4\u3057\u30BF\u30B9\u30AF" }, + recurrence_type: { + label: "\u7E70\u308A\u8FD4\u3057\u7A2E\u5225", + options: { daily: "\u6BCE\u65E5", weekly: "\u6BCE\u9031", monthly: "\u6BCE\u6708", yearly: "\u6BCE\u5E74" } + }, + recurrence_interval: { label: "\u7E70\u308A\u8FD4\u3057\u9593\u9694" }, + recurrence_end_date: { label: "\u7E70\u308A\u8FD4\u3057\u7D42\u4E86\u65E5" }, + is_completed: { label: "\u5B8C\u4E86\u6E08" }, + is_overdue: { label: "\u671F\u9650\u8D85\u904E" }, + progress_percent: { label: "\u9032\u6357\uFF08%\uFF09" } + }, + _views: { + all_tasks: { label: "\u5168\u30BF\u30B9\u30AF" }, + task_board: { label: "\u30BF\u30B9\u30AF\u30DC\u30FC\u30C9" }, + task_calendar: { label: "\u30BF\u30B9\u30AF\u30AB\u30EC\u30F3\u30C0\u30FC" }, + task_gantt: { label: "\u5B9F\u884C\u8A08\u753B" }, + task_timeline: { label: "\u5DE5\u6570\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3" }, + my_open_tasks: { label: "\u79C1\u306E\u30AA\u30FC\u30D7\u30F3\u30BF\u30B9\u30AF" }, + todays_tasks: { label: "\u{1F4C5} \u79C1\u306E\u512A\u5148\u30BF\u30B9\u30AF" }, + overdue_tasks: { label: "\u23F0 \u30AA\u30FC\u30D7\u30F3\u30BF\u30B9\u30AF \xB7 \u671F\u9650\u8D85\u904E\u304C\u9577\u3044\u9806" } + }, + _sections: { + basic: { label: "\u30BF\u30B9\u30AF\u60C5\u5831" }, + scheduling: { label: "\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB" }, + related: { label: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9" }, + recurrence: { label: "\u7E70\u308A\u8FD4\u3057" }, + effort: { label: "\u9032\u6357\u30FB\u5DE5\u6570" }, + system: { label: "\u30B7\u30B9\u30C6\u30E0" }, + // task.view.ts のフォームセクション名 (#1100) + task: { label: "\u30BF\u30B9\u30AF" }, + related_records: { label: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9" }, + recurrence_and_effort: { label: "\u7E70\u308A\u8FD4\u3057\u3068\u5DE5\u6570" } + } + }, + crm_event: { + _validations: { + end_after_start: { + message: "\u7D42\u4E86\u6642\u523B\u306F\u958B\u59CB\u6642\u523B\u3088\u308A\u5F8C\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" + }, + related_to_required: { + message: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9\u3092\u5C11\u306A\u304F\u3068\u3082 1 \u4EF6\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044" + } + }, + label: "\u30A4\u30D9\u30F3\u30C8", + pluralLabel: "\u30A4\u30D9\u30F3\u30C8", + description: "\u9867\u5BA2\u3068\u306E\u4F1A\u8B70\u30FB\u96FB\u8A71\u306A\u3069\u306E\u4E88\u5B9A\u3055\u308C\u305F\u5BFE\u8A71", + fields: { + subject: { label: "\u4EF6\u540D" }, + description: { label: "\u8AAC\u660E" }, + type: { + label: "\u30A4\u30D9\u30F3\u30C8\u7A2E\u5225", + options: { + meeting: "\u4F1A\u8B70", + call: "\u96FB\u8A71", + demo: "\u30C7\u30E2", + webinar: "\u30A6\u30A7\u30D3\u30CA\u30FC", + onsite_visit: "\u8A2A\u554F", + other: "\u305D\u306E\u4ED6" + } + }, + status: { + label: "\u30B9\u30C6\u30FC\u30BF\u30B9", + options: { + planned: "\u4E88\u5B9A", + held: "\u5B9F\u65BD\u6E08\u307F", + cancelled: "\u30AD\u30E3\u30F3\u30BB\u30EB", + no_show: "\u7121\u65AD\u6B20\u5E2D" + } + }, + owner_id: { label: "\u62C5\u5F53\u8005" }, + start_datetime: { label: "\u958B\u59CB" }, + end_datetime: { label: "\u7D42\u4E86" }, + all_day: { label: "\u7D42\u65E5\u30A4\u30D9\u30F3\u30C8" }, + duration_minutes: { label: "\u6240\u8981\u6642\u9593\uFF08\u5206\uFF09" }, + location: { label: "\u5834\u6240", help: "\u4F1A\u8B70\u5BA4\u30FB\u4F4F\u6240\u30FB\u4F1A\u8B70\u30EA\u30F3\u30AF" }, + related_to_type: { + label: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9\u7A2E\u5225", + options: { ...relatedToTypeOptions } + }, + related_to_account: { label: "\u95A2\u9023\u53D6\u5F15\u5148" }, + related_to_contact: { label: "\u95A2\u9023\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, + related_to_opportunity: { label: "\u95A2\u9023\u5546\u8AC7" }, + related_to_lead: { label: "\u95A2\u9023\u30EA\u30FC\u30C9" }, + related_to_case: { label: "\u95A2\u9023\u30B1\u30FC\u30B9" }, + outcome_notes: { label: "\u7D50\u679C\u30E1\u30E2", help: "\u5408\u610F\u4E8B\u9805\u3068\u6B21\u306E\u30A2\u30AF\u30B7\u30E7\u30F3" } + }, + _views: { + all_events: { label: "\u3059\u3079\u3066\u306E\u30A4\u30D9\u30F3\u30C8" }, + event_calendar: { label: "\u30A4\u30D9\u30F3\u30C8\u30AB\u30EC\u30F3\u30C0\u30FC" }, + event_timeline: { label: "\u30C1\u30FC\u30E0\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB" }, + my_events: { label: "\u30DE\u30A4\u30AB\u30EC\u30F3\u30C0\u30FC" }, + upcoming_events: { label: "\u{1F4C5} \u958B\u50AC\u4E88\u5B9A \xB7 \u76F4\u8FD1\u9806" }, + held_events: { label: "\u2705 \u5BFE\u8A71\u5C65\u6B74" } + }, + _sections: { + basic: { label: "\u30A4\u30D9\u30F3\u30C8\u60C5\u5831" }, + schedule: { label: "\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB" }, + related: { label: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9" }, + outcome: { label: "\u5B9F\u65BD\u7D50\u679C" }, + // event.view.ts のフォームセクション名 (#1100) + event: { label: "\u30A4\u30D9\u30F3\u30C8" }, + related_records: { label: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9" } + } + }, + crm_event_attendee: { + _validations: { + attendee_resolves: { + message: "\u53C2\u52A0\u8005\u306F\u53C2\u52A0\u8005\u7A2E\u5225\u304C\u793A\u3059\u76F8\u624B\u3092\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u5834\u5408\u306F\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3092\u3001\u793E\u5916\u306E\u5834\u5408\u306F\u793E\u5916\u53C2\u52A0\u8005\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044" + }, + attendee_type_exclusive: { + message: "\u53C2\u52A0\u8005\u304C\u6307\u5B9A\u3067\u304D\u308B\u76F8\u624B\u306F 1 \u3064\u3060\u3051\u3067\u3059\u3002\u53C2\u52A0\u8005\u7A2E\u5225\u304C\u793A\u3055\u306A\u3044\u9805\u76EE\u306F\u3059\u3079\u3066\u7A7A\u306B\u3057\u3066\u304F\u3060\u3055\u3044" + } + }, + label: "\u30A4\u30D9\u30F3\u30C8\u53C2\u52A0\u8005", + pluralLabel: "\u30A4\u30D9\u30F3\u30C8\u53C2\u52A0\u8005", + description: "\u30A4\u30D9\u30F3\u30C8\u306B\u62DB\u5F85\u3055\u308C\u305F\u3001\u307E\u305F\u306F\u51FA\u5E2D\u3057\u305F\u4EBA", + fields: { + attendee_number: { label: "\u53C2\u52A0\u8005\u756A\u53F7" }, + crm_event: { label: "\u30A4\u30D9\u30F3\u30C8" }, + attendee_type: { + label: "\u53C2\u52A0\u8005\u7A2E\u5225", + options: { contact: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", lead: "\u30EA\u30FC\u30C9", user: "\u793E\u5185\u30E6\u30FC\u30B6\u30FC", external: "\u793E\u5916\u30B2\u30B9\u30C8" } + }, + crm_contact: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", help: "\u53C2\u52A0\u8005\u304C\u65E2\u5B58\u306E\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3067\u3042\u308B\u5834\u5408\u306B\u8A2D\u5B9A\u3057\u307E\u3059" }, + crm_lead: { label: "\u30EA\u30FC\u30C9", help: "\u53C2\u52A0\u8005\u304C\u307E\u3060\u5909\u63DB\u3055\u308C\u3066\u3044\u306A\u3044\u30EA\u30FC\u30C9\u3067\u3042\u308B\u5834\u5408\u306B\u8A2D\u5B9A\u3057\u307E\u3059" }, + sys_user: { label: "\u793E\u5185\u30E6\u30FC\u30B6\u30FC", help: "\u53C2\u52A0\u8005\u304C\u793E\u5185\u306E\u540C\u50DA\u3067\u3042\u308B\u5834\u5408\u306B\u8A2D\u5B9A\u3057\u307E\u3059" }, + external_name: { label: "\u793E\u5916\u53C2\u52A0\u8005", help: "CRM \u306E\u3069\u306E\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306B\u3082\u5B58\u5728\u3057\u306A\u3044\u53C2\u52A0\u8005\u306E\u6C0F\u540D \u2014 \u53C2\u52A0\u8005\u7A2E\u5225\u304C\u300C\u793E\u5916\u30B2\u30B9\u30C8\u300D\u306E\u3068\u304D\u306B\u8A2D\u5B9A\u3057\u307E\u3059" }, + response: { + label: "\u56DE\u7B54", + options: { + no_response: "\u672A\u56DE\u7B54", + accepted: "\u627F\u8AFE", + declined: "\u8F9E\u9000", + tentative: "\u4EEE\u627F\u8AFE" + } + }, + is_organizer: { label: "\u4E3B\u50AC\u8005" }, + invited_date: { label: "\u62DB\u5F85\u65E5\u6642" } + }, + _views: { + all_event_attendees: { label: "\u30A4\u30D9\u30F3\u30C8\u53C2\u52A0\u8005" } + }, + _sections: { + basic: { label: "\u53C2\u52A0\u8005" }, + response: { label: "\u62DB\u5F85" }, + // event_attendee.view.ts のフォームセクション名 (#1100) + attendee: { label: "\u53C2\u52A0\u8005" }, + invitation: { label: "\u62DB\u5F85" } + } + } +}; + +// src/sales/translations/ja-JP/objects.marketing.ts +var marketing3 = { + crm_campaign: { + _validations: { + end_after_start: { + message: "\u7D42\u4E86\u65E5\u306F\u958B\u59CB\u65E5\u3088\u308A\u5F8C\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" + }, + actual_cost_within_budget: { + message: "\u5B9F\u7E3E\u30B3\u30B9\u30C8\u304C\u4E88\u7B97\u30B3\u30B9\u30C8\u3092\u8D85\u3048\u3066\u3044\u307E\u3059" + } + }, + label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3", + pluralLabel: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3", + description: "\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3068\u65BD\u7B56", + fields: { + campaign_code: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30B3\u30FC\u30C9" }, + name: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u540D" }, + display_title: { label: "\u8868\u793A\u540D" }, + description: { label: "\u8AAC\u660E" }, + type: { + label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u7A2E\u5225", + options: { + email: "\u30E1\u30FC\u30EB", + webinar: "\u30A6\u30A7\u30D3\u30CA\u30FC", + trade_show: "\u5C55\u793A\u4F1A", + conference: "\u30AB\u30F3\u30D5\u30A1\u30EC\u30F3\u30B9", + direct_mail: "\u30C0\u30A4\u30EC\u30AF\u30C8\u30E1\u30FC\u30EB", + social_media: "\u30BD\u30FC\u30B7\u30E3\u30EB\u30E1\u30C7\u30A3\u30A2", + content: "\u30B3\u30F3\u30C6\u30F3\u30C4\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0", + partner: "\u30D1\u30FC\u30C8\u30CA\u30FC\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0" + } + }, + channel: { + label: "\u4E3B\u8981\u30C1\u30E3\u30CD\u30EB", + options: { + digital: "\u30C7\u30B8\u30BF\u30EB", + social: "\u30BD\u30FC\u30B7\u30E3\u30EB", + email: "\u30E1\u30FC\u30EB", + events: "\u30A4\u30D9\u30F3\u30C8", + partner: "\u30D1\u30FC\u30C8\u30CA\u30FC" + } + }, + status: { + label: "\u30B9\u30C6\u30FC\u30BF\u30B9", + options: { + planning: "\u8A08\u753B\u4E2D", + in_progress: "\u5B9F\u65BD\u4E2D", + completed: "\u5B8C\u4E86", + aborted: "\u4E2D\u6B62" + } + }, + start_date: { label: "\u958B\u59CB\u65E5" }, + end_date: { label: "\u7D42\u4E86\u65E5" }, + budgeted_cost: { label: "\u4E88\u7B97\u30B3\u30B9\u30C8" }, + actual_cost: { label: "\u5B9F\u30B3\u30B9\u30C8" }, + expected_revenue: { label: "\u4E88\u6E2C\u58F2\u4E0A" }, + actual_revenue: { label: "\u5B9F\u53CE\u76CA" }, + target_size: { label: "\u30BF\u30FC\u30B2\u30C3\u30C8\u898F\u6A21", help: "\u5BFE\u8C61\u3068\u3059\u308B\u30EA\u30FC\u30C9\u30FB\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u76EE\u6A19\u4EF6\u6570" }, + num_sent: { label: "\u9001\u4FE1\u6570" }, + num_responses: { label: "\u5FDC\u7B54\u6570" }, + num_leads: { label: "\u30EA\u30FC\u30C9\u6570" }, + num_converted_leads: { label: "\u5909\u63DB\u6E08\u30EA\u30FC\u30C9\u6570" }, + num_opportunities: { label: "\u4F5C\u6210\u6E08\u5546\u8AC7\u6570" }, + num_won_opportunities: { label: "\u53D7\u6CE8\u5546\u8AC7" }, + response_rate: { label: "\u5FDC\u7B54\u7387\uFF08%\uFF09" }, + roi: { label: "ROI\uFF08%\uFF09" }, + owner_id: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u62C5\u5F53\u8005" }, + landing_page_url: { label: "\u30E9\u30F3\u30C7\u30A3\u30F3\u30B0\u30DA\u30FC\u30B8" }, + is_active: { label: "\u6709\u52B9" } + }, + _views: { + all_campaigns: { label: "\u5168\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" }, + campaign_gantt: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u65E5\u7A0B" }, + campaign_calendar: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30AB\u30EC\u30F3\u30C0\u30FC" }, + campaign_timeline: { label: "\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3" } + }, + _sections: { + basic: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u60C5\u5831" }, + schedule: { label: "\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB" }, + budget: { label: "\u4E88\u7B97\u30FBROI" }, + metrics: { label: "\u5B9F\u7E3E" }, + assignment: { label: "\u62C5\u5F53\u8005" }, + assets: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30A2\u30BB\u30C3\u30C8" } + }, + _actions: { + enroll_leads: { + label: "\u30E1\u30F3\u30D0\u30FC\u3092\u4E00\u62EC\u767B\u9332", + successMessage: "\u5BFE\u8C61\u30E1\u30F3\u30D0\u30FC\u3092\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306B\u767B\u9332\u3057\u307E\u3057\u305F\u3002" + } + } + }, + crm_campaign_member: { + _validations: { + lead_or_contact_required: { + message: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30E1\u30F3\u30D0\u30FC\u306F\u30EA\u30FC\u30C9\u307E\u305F\u306F\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u3044\u305A\u308C\u304B\u3092\u53C2\u7167\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" + } + }, + label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30E1\u30F3\u30D0\u30FC", + pluralLabel: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30E1\u30F3\u30D0\u30FC", + description: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306E\u5BFE\u8C61\u3068\u306A\u3063\u305F\u30EA\u30FC\u30C9\u30FB\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3068\u305D\u306E\u53CD\u5FDC\u72B6\u6CC1", + fields: { + member_number: { label: "\u30E1\u30F3\u30D0\u30FC\u756A\u53F7" }, + crm_campaign: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" }, + crm_lead: { label: "\u30EA\u30FC\u30C9", help: "\u767B\u9332\u6642\u70B9\u3067\u30EA\u30FC\u30C9\u3060\u3063\u305F\u30E1\u30F3\u30D0\u30FC\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059" }, + crm_contact: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", help: "\u65E2\u5B58\u306E\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3067\u3042\u308B\u30E1\u30F3\u30D0\u30FC\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059" }, + status: { + label: "\u30B9\u30C6\u30FC\u30BF\u30B9", + options: { + sent: "\u9001\u4FE1\u6E08", + responded: "\u5FDC\u7B54\u6E08", + converted: "\u5909\u63DB\u6E08", + unsubscribed: "\u914D\u4FE1\u505C\u6B62" + } + }, + added_date: { label: "\u8FFD\u52A0\u65E5\u6642" }, + response_date: { label: "\u5FDC\u7B54\u65E5\u6642" }, + has_responded: { label: "\u5FDC\u7B54\u6E08" } + }, + _sections: { + basic: { label: "\u57FA\u672C\u60C5\u5831" }, + response: { label: "\u53CD\u5FDC\u30C8\u30E9\u30C3\u30AD\u30F3\u30B0" } + }, + _actions: { + mark_responded: { + label: "\u5FDC\u7B54\u6E08\u306B\u3059\u308B", + successMessage: "\u3053\u306E\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30E1\u30F3\u30D0\u30FC\u306E\u5FDC\u7B54\u3092\u8A18\u9332\u3057\u307E\u3057\u305F\u3002" + } + } + } +}; + +// src/sales/translations/ja-JP.ts +var jaJP2 = { + objects: { + crm_account: customer3.crm_account, + crm_contact: customer3.crm_contact, + crm_knowledge_article: service3.crm_knowledge_article, + crm_forecast: pipeline3.crm_forecast, + crm_lead: pipeline3.crm_lead, + crm_opportunity: pipeline3.crm_opportunity, + crm_case: service3.crm_case, + crm_contract: commerce3.crm_contract, + crm_product: commerce3.crm_product, + crm_quote: commerce3.crm_quote, + crm_task: activity3.crm_task, + crm_campaign: marketing3.crm_campaign, + crm_event: activity3.crm_event, + crm_event_attendee: activity3.crm_event_attendee, + crm_article_feedback: service3.crm_article_feedback, + crm_campaign_member: marketing3.crm_campaign_member, + crm_opportunity_line_item: pipeline3.crm_opportunity_line_item, + crm_quote_line_item: commerce3.crm_quote_line_item + }, + ...appSurface3 +}; + +// src/sales/translations/es-ES/app.ts +var appSurface4 = { + apps: { + crm_enterprise: { + label: "HotCRM", + description: "Gesti\xF3n de relaciones con clientes para ventas, servicio y marketing", + // Indexado por el `id` del nodo de navegación (espacio de nombres plano, + // sea cual sea la profundidad del nodo). + navigation: { + group_activity: { label: "Actividad" }, + nav_event: { label: "Eventos" }, + nav_activity_dashboard: { label: "Actividad de Ventas" }, + nav_my_calendar: { label: "Mi Calendario" }, + nav_home: { label: "Inicio" }, + group_sales: { label: "Ventas" }, + nav_lead: { label: "Prospectos" }, + nav_account: { label: "Cuentas" }, + nav_account_workbench: { label: "Mesa de Trabajo de Cuentas" }, + nav_contact: { label: "Contactos" }, + nav_opportunity: { label: "Oportunidades" }, + nav_quote: { label: "Cotizaciones" }, + nav_contract: { label: "Contratos" }, + nav_product: { label: "Productos" }, + nav_sales_dashboard: { label: "Rendimiento de Ventas" }, + group_work: { label: "Mi Trabajo" }, + nav_my_tasks: { label: "Mis Tareas" }, + nav_my_deals: { label: "Mis Negocios" }, + nav_my_leads: { label: "Mis Prospectos" }, + nav_my_cases: { label: "Mis Casos" }, + nav_approval_requests: { label: "Bandeja de Entrada" }, + group_service: { label: "Servicio" }, + nav_case: { label: "Casos" }, + nav_knowledge: { label: "Conocimiento" }, + nav_service_dashboard: { label: "Resumen de Servicio" }, + group_marketing: { label: "Marketing" }, + nav_campaign: { label: "Campa\xF1as" }, + group_insights: { label: "An\xE1lisis" }, + nav_crm_dashboard: { label: "Resumen CRM" }, + nav_forecast: { label: "Previsiones" }, + nav_report_pipeline_coverage: { label: "Cobertura del Pipeline" }, + nav_report_lead_inflow: { label: "Entrada de Prospectos" }, + nav_report_sla: { label: "Cumplimiento de SLA" } + } + } + }, + messages: { + "common.save": "Guardar", + "common.cancel": "Cancelar", + "common.delete": "Eliminar", + "common.edit": "Editar", + "common.create": "Crear", + "common.search": "Buscar", + "common.filter": "Filtrar", + "common.export": "Exportar", + "common.back": "Volver", + "common.confirm": "Confirmar", + "nav.sales": "Ventas", + "nav.service": "Servicio", + "nav.marketing": "Marketing", + "nav.products": "Productos", + "nav.analytics": "Anal\xEDtica", + "success.saved": "Registro guardado exitosamente", + "success.converted": "Prospecto convertido exitosamente", + "confirm.delete": "\xBFEst\xE1 seguro de que desea eliminar este registro?", + "confirm.convert_lead": "\xBFConvertir este prospecto en cuenta, contacto y oportunidad?", + "error.required": "Este campo es obligatorio", + "error.load_failed": "Error al cargar los datos" + }, + dashboards: { + sales_activity_dashboard: { + label: "Actividad de ventas", + description: "Qui\xE9n habla con los clientes, con qu\xE9 frecuencia y qu\xE9 cuentas se han quedado en silencio", + widgets: { + interactions_held: { title: "Interacciones registradas", description: "Llamadas y reuniones que realmente ocurrieron" }, + meetings_booked: { title: "Reuniones agendadas", description: "Reuniones en el calendario que a\xFAn no ocurren" }, + customer_minutes: { title: "Minutos con clientes", description: "Tiempo total frente a clientes" }, + tasks_completed: { title: "Tareas completadas", description: "Seguimientos cerrados \u2014 la otra mitad de la actividad" }, + activity_by_rep: { title: "Actividad por representante", description: "Interacciones registradas por responsable" }, + activity_by_week: { title: "Volumen de actividad por semana", description: "Interacciones por semana" }, + activity_mix: { title: "Composici\xF3n de la actividad", description: "Llamadas vs reuniones vs demostraciones" }, + activity_by_record_type: { title: "D\xF3nde cae la actividad", description: "Qu\xE9 parte del embudo recibe atenci\xF3n" }, + deal_activity: { title: "Interacciones en oportunidades", description: "Interacciones vinculadas a una oportunidad" }, + open_deals_for_activity: { title: "Oportunidades abiertas", description: "Oportunidades a\xFAn en juego" }, + quiet_accounts_30: { title: "Silencio 30+ d\xEDas", description: "Cuentas activas sin interacci\xF3n en un mes" }, + quiet_accounts_60: { title: "Silencio 60+ d\xEDas", description: "Dos meses de silencio \u2014 el umbral de riesgo" }, + quiet_accounts_90: { title: "Silencio 90+ d\xEDas", description: "Un trimestre sin contacto" } + } + }, + crm_overview_dashboard: { + label: "Resumen CRM", + description: "M\xE9tricas de ingresos, anal\xEDtica de pipeline e informaci\xF3n de oportunidades", + widgets: { + total_revenue: { title: "Ingresos totales", description: "Ingresos cerrados ganados en este per\xEDodo" }, + active_deals: { title: "Negocios activos", description: "Oportunidades abiertas en el pipeline" }, + won_deals: { title: "Negocios ganados", description: "Negocios cerrados ganados en este per\xEDodo" }, + avg_deal_size: { title: "Tama\xF1o medio del negocio", description: "Valor medio de los negocios cerrados ganados" }, + revenue_trends: { title: "Tendencia de ingresos", description: "Ingresos cerrados ganados de los \xFAltimos 12 meses" }, + lead_source: { title: "Origen del prospecto", description: "Valor del pipeline por canal de adquisici\xF3n" }, + pipeline_by_stage: { title: "Pipeline por etapa", description: "Valor de oportunidades abiertas en cada etapa de venta" }, + top_products: { title: "Productos principales", description: "Ingresos a precio de lista por categor\xEDa de producto" }, + pipeline_by_owner: { title: "Pipeline por responsable", description: "Valor del pipeline abierto y n\xFAmero de negocios por comercial" } + } + }, + executive_dashboard: { + label: "Vista ejecutiva", + description: "KPI de alto nivel sobre ingresos, clientes y pipeline para la direcci\xF3n", + widgets: { + total_revenue_ytd: { title: "Ingresos totales (YTD)", description: "Ingresos cerrados ganados en lo que va del a\xF1o" }, + total_accounts: { title: "Cuentas activas", description: "Clientes con al menos una relaci\xF3n activa" }, + total_contacts: { title: "Total de contactos", description: "Personas en nuestra agenda" }, + open_leads: { title: "Prospectos abiertos", description: "Prospectos sin convertir en el embudo" }, + revenue_trend: { title: "Tendencia de ingresos", description: "Ingresos cerrados ganados de los \xFAltimos 12 meses" }, + revenue_by_industry: { title: "Ingresos por industria", description: "Ingresos YTD ganados separados por industria del cliente" }, + pipeline_by_stage: { title: "Pipeline por etapa", description: "Valor de oportunidades abiertas en cada etapa de venta" }, + new_accounts_by_month: { title: "Cuentas nuevas", description: "Ritmo de creaci\xF3n de cuentas en los \xFAltimos 6 meses" }, + accounts_by_industry: { title: "Cuentas por sector", description: "Ingreso anual total y n\xFAmero de cuentas por sector" } + } + }, + sales_dashboard: { + label: "Rendimiento de ventas", + description: "Anal\xEDtica de pipeline, tendencias de tasa de \xE9xito y rendimiento de los representantes", + widgets: { + total_pipeline_value: { title: "Pipeline total", description: "Suma del valor de las oportunidades abiertas" }, + closed_won_qtd: { title: "Cerrado ganado (trimestre)", description: "Ingresos cerrados este trimestre" }, + open_opportunities: { title: "Oportunidades abiertas", description: "Negocios activos en curso" }, + avg_deal_size: { title: "Tama\xF1o medio del negocio", description: "Valor medio de los negocios cerrados ganados este trimestre" }, + pipeline_by_stage: { title: "Pipeline por etapa", description: "Valor de oportunidades abiertas en cada etapa de venta" }, + monthly_revenue_trend: { title: "Tendencia mensual de ingresos", description: "Ingresos cerrados ganados de los \xFAltimos 12 meses" }, + pipeline_by_forecast_category: { title: "Pipeline por categor\xEDa de pron\xF3stico", description: "Pipeline abierto agrupado por categor\xEDa de pron\xF3stico de ventas" }, + lead_source_breakdown: { title: "Origen del prospecto", description: "De d\xF3nde proviene nuestro pipeline" }, + open_pipeline_by_owner: { title: "Pipeline abierto por responsable", description: "Valor del pipeline en curso, n\xFAmero de negocios y probabilidad media de cierre por comercial" }, + quota_attainment_by_rep: { title: "Cumplimiento de cuota por representante", description: "Cuota del trimestre actual, ingresos cerrados y cumplimiento por representante, seg\xFAn instant\xE1neas de pron\xF3stico" }, + pipeline_stage_by_source: { title: "Pipeline por Etapa \xD7 Origen", description: "Tabla cruzada del importe de oportunidades abiertas por etapa y origen" }, + win_rate_12m: { title: "Tasa de \xE9xito (12M)", description: "Negocios ganados como porcentaje de todos los negocios resueltos en los \xFAltimos 12 meses" }, + won_deals_12m: { title: "Negocios ganados (12M)", description: "El numerador de la tasa de \xE9xito" }, + lost_deals_12m: { title: "Negocios perdidos (12M)", description: "La otra mitad del denominador de la tasa de \xE9xito" }, + win_rate_by_owner: { title: "Ganados / perdidos por representante", description: "Negocios ganados, negocios perdidos y tasa de \xE9xito por representante \u2014 \xFAltimos 12 meses" }, + win_rate_by_lead_source: { title: "Ganados / perdidos por origen del prospecto", description: "Qu\xE9 or\xEDgenes producen negocios que realmente se cierran \u2014 \xFAltimos 12 meses" }, + loss_reason_breakdown: { title: "Por qu\xE9 perdemos", description: "Negocios perdidos por motivo \u2014 \xFAltimos 12 meses" } + } + }, + service_dashboard: { + label: "Servicio al cliente", + description: "Carga de casos, salud del SLA y rendimiento de resoluci\xF3n", + widgets: { + open_cases: { title: "Casos abiertos", description: "Casos que a\xFAn no se han cerrado" }, + critical_cases: { title: "Casos cr\xEDticos", description: "Casos abiertos marcados como prioridad cr\xEDtica" }, + avg_resolution_time: { title: "Tiempo medio de resoluci\xF3n", description: "Tiempo medio hasta el cierre, en horas" }, + sla_violations: { title: "Incumplimientos de SLA", description: "Casos que incumplieron su SLA" }, + cases_by_status: { title: "Casos por estado", description: "Distribuci\xF3n de la carga a lo largo del pipeline" }, + cases_by_priority: { title: "Casos por prioridad", description: "Mezcla de casos abiertos por urgencia" }, + cases_by_origin: { title: "Casos por origen", description: "De d\xF3nde provienen nuestros casos" }, + daily_case_volume: { title: "Volumen diario de casos", description: "Casos nuevos creados en los \xFAltimos 30 d\xEDas" }, + sla_compliance_gauge: { title: "Cumplimiento de SLA", description: "Porcentaje de casos resueltos dentro del SLA en este per\xEDodo" }, + kb_deflection_rate: { title: "Tasa de Desv\xEDo por KB", description: "Proporci\xF3n de casos cerrados resueltos con un art\xEDculo de la base de conocimiento" }, + kb_resolved_cases: { title: "Resueltos por KB", description: "Casos cerrados que se\xF1alan el art\xEDculo que los resolvi\xF3" }, + closed_cases_total: { title: "Casos Cerrados", description: "El denominador de la tasa de desv\xEDo" }, + top_resolving_articles: { title: "Art\xEDculos que M\xE1s Resuelven", description: "Art\xEDculos de la base de conocimiento ordenados por los casos cerrados que resolvieron" }, + my_open_cases_by_priority: { title: "Mis casos abiertos por prioridad", description: "Tus casos abiertos y su tasa de incumplimiento de SLA, desglosados por prioridad" } + } + } + }, + // `title` / `subtitle` son las propiedades del componente `page:header`. + // Los marcadores `{…}` se sustituyen sobre la cadena TRADUCIDA, así que el + // token debe conservarse tal cual: traducido, no resuelve y se ve vacío. + datasets: { + account_metrics: { + label: "M\xE9tricas de cuentas", + description: "Capa sem\xE1ntica para el recuento de cuentas por sector y tipo", + dimensions: { + industry: { + label: "Sector" + }, + type: { + label: "Tipo" + }, + created_at: { + label: "Creado" + } + }, + measures: { + account_count: { + label: "Cuentas" + }, + annual_revenue_sum: { + label: "Ingresos anuales" + } + } + }, + case_metrics: { + label: "M\xE9tricas de casos", + description: "Capa sem\xE1ntica para el recuento de casos, el tiempo de resoluci\xF3n y el SLA", + dimensions: { + created_at: { + label: "Creado" + }, + origin: { + label: "Origen" + }, + priority: { + label: "Prioridad" + }, + resolved_article: { + label: "Art\xEDculo de resoluci\xF3n" + }, + status: { + label: "Estado" + }, + type: { + label: "Tipo" + } + }, + measures: { + avg_resolution: { + label: "Resoluci\xF3n media (h)" + }, + avg_sla_violated: { + label: "Tasa de incumplimiento del SLA" + }, + case_count: { + label: "Casos" + }, + closed_count: { + label: "Casos cerrados" + }, + kb_deflection_rate: { + label: "Tasa de desv\xEDo por base de conocimiento" + }, + kb_resolved_count: { + label: "Resueltos por base de conocimiento" + }, + sla_compliance_rate: { + label: "Tasa de cumplimiento del SLA" + }, + sla_met_count: { + label: "Casos dentro del SLA" + } + } + }, + contact_metrics: { + label: "M\xE9tricas de contactos", + description: "Capa sem\xE1ntica para el recuento de contactos", + measures: { + contact_count: { + label: "Contactos" + } + } + }, + event_metrics: { + label: "M\xE9tricas de actividad", + description: "Capa sem\xE1ntica para reuniones, llamadas y recencia de interacci\xF3n", + dimensions: { + owner: { + label: "Propietario" + }, + related_to_type: { + label: "Relacionado con" + }, + start_datetime: { + label: "Semana de actividad" + }, + status: { + label: "Estado" + }, + type: { + label: "Tipo de actividad" + } + }, + measures: { + avg_minutes: { + label: "Duraci\xF3n media" + }, + event_count: { + label: "Actividades" + }, + total_minutes: { + label: "Minutos" + } + } + }, + forecast_metrics: { + label: "M\xE9tricas de previsi\xF3n", + description: "Capa sem\xE1ntica para cuota, cumplimiento y cobertura de pipeline por propietario", + dimensions: { + owner: { + label: "Propietario" + }, + period: { + label: "Tipo de periodo" + }, + period_label: { + label: "Periodo" + }, + period_start: { + label: "Inicio del periodo" + } + }, + measures: { + attainment: { + label: "Cumplimiento" + }, + closed_sum: { + label: "Cerrado" + }, + commit_sum: { + label: "Comprometido" + }, + pipeline_sum: { + label: "Pipeline" + }, + quota_sum: { + label: "Cuota" + } + } + }, + lead_metrics: { + label: "M\xE9tricas de prospectos", + description: "Capa sem\xE1ntica para el recuento de prospectos", + dimensions: { + created_at: { + label: "Creado" + }, + last_contacted_date: { + label: "\xDAltimo contacto" + }, + lead_source: { + label: "Origen" + }, + status: { + label: "Estado" + } + }, + measures: { + lead_count: { + label: "Prospectos" + } + } + }, + opportunity_metrics: { + label: "M\xE9tricas de oportunidades", + description: "Capa sem\xE1ntica para el recuento y los importes del pipeline de ventas", + dimensions: { + account_industry: { + label: "Sector de la cuenta" + }, + close_date: { + label: "Fecha de cierre" + }, + close_quarter: { + label: "Trimestre de cierre" + }, + forecast_category: { + label: "Categor\xEDa de previsi\xF3n" + }, + lead_source: { + label: "Origen del prospecto" + }, + loss_reason: { + label: "Motivo de p\xE9rdida" + }, + owner: { + label: "Propietario" + }, + stage: { + label: "Etapa" + }, + type: { + label: "Tipo de negocio" + }, + win_reason: { + label: "Motivo de ganancia" + } + }, + measures: { + avg_amount: { + label: "Tama\xF1o medio del negocio" + }, + avg_probability: { + label: "Probabilidad media" + }, + decided_count: { + label: "Negocios resueltos" + }, + lost_amount: { + label: "Ingresos perdidos" + }, + lost_count: { + label: "Negocios perdidos" + }, + opp_count: { + label: "Oportunidades" + }, + total_amount: { + label: "Importe total" + }, + win_rate: { + label: "Tasa de ganancia" + }, + won_amount: { + label: "Ingresos ganados" + }, + won_count: { + label: "Negocios ganados" + } + } + }, + product_metrics: { + label: "M\xE9tricas de productos", + description: "Capa sem\xE1ntica para el recuento del cat\xE1logo y el precio de lista", + dimensions: { + category: { + label: "Categor\xEDa" + } + }, + measures: { + list_price_sum: { + label: "Precio de lista total" + }, + product_count: { + label: "Productos" + } + } + }, + task_metrics: { + label: "M\xE9tricas de tareas", + description: "Capa sem\xE1ntica para la carga de trabajo y la finalizaci\xF3n de tareas", + dimensions: { + due_date: { + label: "Fecha de vencimiento" + }, + is_completed: { + label: "Completada" + }, + is_overdue: { + label: "Vencida" + }, + priority: { + label: "Prioridad" + }, + priority_rank: { + label: "Urgencia" + }, + status: { + label: "Estado" + }, + type: { + label: "Tipo" + } + }, + measures: { + avg_progress: { + label: "Progreso medio" + }, + task_count: { + label: "Tareas" + } + } + } + }, + pages: { + account_detail_page: { + label: "Detalle de Cuenta", + description: "P\xE1gina de registro de cuenta por slots: cabecera personalizada + feed de discusi\xF3n permanente.", + title: "{name}", + subtitle: "{industry} \xB7 {type}", + components: { + account_chatter: { label: "Discusi\xF3n" } + } + }, + account_workbench: { + label: "Mesa de Trabajo de Cuentas", + description: "Lista de cuentas curada para el equipo comercial: solo filtros r\xE1pidos, sin gesti\xF3n de vistas." + }, + app_launcher_page: { + label: "Lanzador de Aplicaciones", + description: "Punto de acceso central a todas las aplicaciones", + subtitle: "Seleccione una aplicaci\xF3n para empezar", + components: { + app_search: { label: "Buscar Aplicaciones" }, + app_grid: { label: "Cuadr\xEDcula de Aplicaciones" } + } + }, + case_detail_page: { + label: "Detalle de Caso", + description: "P\xE1gina de caso para el agente de servicio: datos destacados, progreso del SLA, detalles y cronolog\xEDa de actividad.", + title: "{case_number} \xB7 {subject}", + subtitle: "{crm_account}", + components: { + case_highlights: { label: "Informaci\xF3n Clave" }, + case_status_path: { label: "Progreso del Estado del Caso" }, + case_details: { label: "Detalles del Caso" } + } + }, + lead_detail_page: { + label: "Detalle de Prospecto", + description: "P\xE1gina completa de detalle del prospecto, con datos destacados, detalles e informaci\xF3n relacionada", + title: "{first_name} {last_name}", + subtitle: "{company}", + components: { + lead_duplicate_alert_confirmed: { label: "Aviso de duplicado confirmado" }, + lead_duplicate_alert_suspected: { label: "Aviso de duplicado sospechoso" }, + lead_highlights: { label: "Informaci\xF3n Clave" }, + lead_path: { label: "Progreso del Estado del Prospecto" }, + main_tabs: { label: "Pesta\xF1as de Informaci\xF3n del Prospecto" }, + lead_details: { label: "Detalles del Prospecto" }, + related_accordion: { label: "Registros Relacionados" }, + related_tasks: { title: "Tareas Abiertas", label: "Tareas" }, + lead_activity: { label: "Cronolog\xEDa de Actividad" }, + lead_history: { label: "Historial de Campos" } + } + }, + opportunity_detail_page: { + label: "Detalle de Oportunidad", + description: "P\xE1gina completa de detalle de la oportunidad, con recorrido de etapas, datos destacados, detalles y listas relacionadas", + title: "{name}", + subtitle: "{crm_account}", + components: { + opp_highlights: { label: "Informaci\xF3n Clave" }, + opp_stage_path: { label: "Progreso de Etapa de la Oportunidad" }, + opp_details: { label: "Detalles de la Oportunidad" } + } + }, + sales_home_page: { + label: "Inicio de Ventas", + description: "P\xE1gina de inicio del equipo comercial con m\xE9tricas clave y acciones r\xE1pidas", + title: "Panel de Ventas", + subtitle: "Bienvenido de nuevo", + components: { + kpi_revenue_won: { + label: "Ingresos (ganados)" + }, + kpi_deals_won: { + label: "Negocios ganados" + }, + kpi_pipeline_value: { + label: "Valor del pipeline" + }, + kpi_open_leads: { + label: "Prospectos abiertos" + }, + home_upcoming_events: { + label: "\u{1F4C5} Pr\xF3ximos \xB7 M\xE1s cercanos primero" + }, + quick_create: { title: "Creaci\xF3n R\xE1pida", label: "Creaci\xF3n R\xE1pida" }, + key_metrics: { title: "Indicadores Clave de Rendimiento", label: "M\xE9tricas Clave" }, + home_tabs: { label: "Pesta\xF1as de Inicio" }, + home_my_leads: { label: "Mis Prospectos" }, + home_my_deals: { label: "Mis Negocios Abiertos" }, + home_my_tasks: { label: "Mis Tareas Abiertas" }, + ai_briefing: { + title: "Preg\xFAntale al Asistente de IA", + label: "Hoy con el Asistente de IA" + }, + upcoming_events: { title: "Pr\xF3ximos Eventos", label: "Pr\xF3ximos Eventos" } + } + }, + utility_bar_page: { + label: "Barra de Utilidades", + description: "Barra de acceso r\xE1pido con herramientas flotantes", + components: { + notifications_panel: { label: "Notificaciones" }, + quick_notes: { title: "Notas R\xE1pidas", label: "Notas R\xE1pidas" }, + quick_search: { label: "B\xFAsqueda R\xE1pida" } + } + } + }, + // Screen-flow copy (#1210, #1975). Keyed `flows..label`, + // `screens..title` and `screens..fields..{label,placeholder}` + // — the keys `os lint`'s `i18n/missing-flow` names, read by the console's + // flow runner since @objectstack 17.7.0 (the spec's `flows` liveness row is + // `live` there). A screen with no authored `title` shows its flow's label in + // every locale, so each `screen_1.title` repeats the flow label. Since + // 18.0.0-next.0 three more surfaces are keys the engine reads in the run's + // locale, and `i18n/missing-flow` names each missing one: a select field's + // `options.` (worded as the object field's own option in this pack), + // an authored screen `description`, and a refusing `end` node's + // `refusals..message`. A translated description or message is a text + // slot like the one it translates, so a hole in it is `{{ }}`. + // The discount ceiling is interpolated from `QUOTE_DISCOUNT_CEILING`, never + // retyped: the number lives in `_thresholds.ts` alone (#1711). + flows: { + campaign_enrollment: { + label: "Inscribir miembros en la campa\xF1a", + screens: { + screen_1: { + title: "Inscribir miembros en la campa\xF1a", + fields: { + memberSource: { label: "Tipo de miembro a inscribir", options: { leads: "Prospectos", contacts: "Contactos" } }, + leadStatus: { label: "Inscribir prospectos con estado", options: { new: "Nuevo", contacted: "Contactado", qualified: "Calificado" } }, + contactDepartment: { + label: "Inscribir contactos del departamento", + options: { executive: "Ejecutivo", sales: "Ventas", marketing: "Marketing", engineering: "Ingenier\xEDa", support: "Soporte", finance: "Finanzas", hr: "Recursos Humanos", operations: "Operaciones" } + } + } + } + } + }, + escalate_case: { + label: "Escalar Caso", + screens: { screen_1: { title: "Escalar Caso", fields: { reason: { label: "Motivo de Escalaci\xF3n" } } } } + }, + close_case: { + label: "Cerrar Caso", + screens: { + screen_1: { + title: "Cerrar Caso", + fields: { + resolution: { label: "Resoluci\xF3n" }, + resolved_by_article: { label: "Resuelto con art\xEDculo (opcional)" } + } + } + } + }, + claim_case: { + label: "Tomar Caso", + screens: { + screen_1: { + title: "Tomar Caso", + fields: { + claimStatus: { + label: "Estado de trabajo", + options: { in_progress: "En Curso", waiting_customer: "Esperando al Cliente", waiting_support: "Esperando a Soporte" } + } + } + } + } + }, + lead_conversion: { + label: "Proceso de conversi\xF3n de prospecto", + screens: { + screen_1: { + title: "Proceso de conversi\xF3n de prospecto", + // The duplicate warning's text is a variable the flow assigns; this + // key can only carry the hole that shows it. + description: "{{duplicateWarning}}", + fields: { + createOpportunity: { label: "\xBFCrear oportunidad?" }, + opportunityName: { label: "Nombre de Oportunidad" }, + opportunityAmount: { label: "Monto de la Oportunidad" }, + closeDate: { label: "Fecha de Cierre" } + } + }, + refuse_confirmed_duplicate: { + title: "Conversi\xF3n rechazada", + description: "El Estado del Duplicado de este prospecto es Confirmado: un revisor lo compar\xF3 con un registro existente y registr\xF3 que lo repite. Convertirlo crear\xEDa una segunda cuenta, contacto y oportunidad para el mismo comprador. La secci\xF3n Gesti\xF3n de Duplicados de este prospecto indica el registro que se conserva; descalifique este prospecto como duplicado. Solo un revisor que cambie ese veredicto vuelve a habilitar la conversi\xF3n." + }, + refuse_unapproved: { + title: "Conversi\xF3n rechazada", + description: "Este prospecto no ha sido aprobado para la conversi\xF3n. Un aprobador debe darle el visto bueno antes de que pueda convertirse en una cuenta, un contacto y una oportunidad; el campo Aprobaci\xF3n de Conversi\xF3n del prospecto muestra si la decisi\xF3n sigue pendiente o fue rechazada. Mientras tanto, siga trabajando el prospecto: nada de \xE9l queda bloqueado." + }, + refuse_no_match_key: { + title: "Conversi\xF3n rechazada", + description: "La empresa de este prospecto no tiene clave de coincidencia, as\xED que la conversi\xF3n no puede saber a qu\xE9 cuenta pertenece y no lo va a adivinar: una suposici\xF3n podr\xEDa archivar el contacto y la oportunidad bajo otro cliente. Guardar la Empresa del prospecto reconstruye la clave, as\xED que gu\xE1rdela de nuevo y luego convi\xE9rtalo. No se ha creado nada." + } + } + }, + schedule_followup: { + label: "Programar Seguimiento", + screens: { + screen_1: { + title: "Programar Seguimiento", + fields: { + subject: { label: "\xBFCu\xE1l es el siguiente paso?" }, + dueDate: { label: "Fecha L\xEDmite" }, + activityType: { + label: "Tipo de Actividad", + options: { call: "Llamada", email: "Email", meeting: "Reuni\xF3n", follow_up: "Seguimiento", demo: "Demostraci\xF3n", other: "Otro" } + }, + priority: { label: "Prioridad", options: { low: "Baja", normal: "Normal", high: "Alta", urgent: "Urgente" } }, + notes: { label: "Notas" } + } + } + } + }, + quote_generation: { + label: "Generar cotizaci\xF3n desde la oportunidad", + refusals: { refuse_held: { message: "Primero va la aprobaci\xF3n de calificaci\xF3n: marque Solicitar Aprobaci\xF3n de Calificaci\xF3n. No se cre\xF3 nada." } }, + screens: { + screen_1: { + title: "Generar cotizaci\xF3n desde la oportunidad", + fields: { + quoteName: { label: "Nombre de Cotizaci\xF3n" }, + expirationDays: { label: "V\xE1lida por (d\xEDas)" }, + discount: { label: `Descuento % (\u2264 ${QUOTE_DISCOUNT_CEILING})`, placeholder: `0-${QUOTE_DISCOUNT_CEILING}` } + } + } + } + } + } +}; + +// src/sales/translations/es-ES/_shared.ts +var activityActions4 = { + log_call: { + label: "Registrar llamada", + successMessage: "\xA1Llamada registrada exitosamente!", + params: { + subject: { label: "Asunto de la llamada" }, + duration: { label: "Duraci\xF3n (minutos)" }, + attendee_contacts: { label: "Contactos participantes" }, + attendee_users: { label: "Participantes internos" }, + notes: { label: "Notas de la llamada" } + } + }, + log_meeting: { + label: "Registrar reuni\xF3n", + successMessage: "\xA1Reuni\xF3n registrada exitosamente!", + params: { + subject: { label: "Asunto de la reuni\xF3n" }, + duration: { label: "Duraci\xF3n (minutos)" }, + attendee_contacts: { label: "Contactos participantes" }, + attendee_users: { label: "Participantes internos" }, + notes: { label: "Notas de la reuni\xF3n" } + } + }, + schedule_meeting: { + label: "Programar reuni\xF3n", + successMessage: "\xA1Reuni\xF3n programada!", + params: { + subject: { label: "Asunto de la reuni\xF3n" }, + start_date: { label: "Fecha de inicio (UTC)" }, + start_time: { label: "Hora de inicio (UTC)" }, + location: { label: "Ubicaci\xF3n" }, + duration: { label: "Duraci\xF3n (minutos)" }, + attendee_contacts: { label: "Contactos participantes" }, + attendee_users: { label: "Participantes internos" }, + notes: { label: "Agenda" } + } + } +}; + +// src/sales/translations/es-ES/objects.customer.ts +var customer4 = { + crm_account: { + label: "Cuenta", + pluralLabel: "Cuentas", + description: "Empresas y organizaciones con las que mantenemos relaci\xF3n comercial", + fields: { + account_number: { label: "N\xFAmero de Cuenta" }, + registration_number: { + label: "N\xFAmero de Registro", + help: "La identidad registrada de la contraparte, emitida por su propio registro gubernamental. No es el N\xFAmero de Cuenta, que emitimos nosotros." + }, + commercial_capability: { + label: "Capacidad Comercial", + help: "Si se puede abrir nuevo negocio con esta cuenta. Las cuentas de Solo Liquidaci\xF3n siguen siendo utilizables para facturaci\xF3n y pagos, pero no se les puede vincular ninguna oportunidad nueva.", + options: { full: "Completa", settlement_only: "Solo Liquidaci\xF3n" } + }, + incumbent_vendor: { label: "Proveedor Actual", help: "El proveedor que actualmente atiende el gasto que perseguimos en esta cuenta." }, + annual_purchasing_budget: { label: "Presupuesto Anual de Compras", help: "Lo que esta cuenta espera gastar con proveedores este a\xF1o, no sus propios ingresos." }, + payment_cycle: { + label: "Ciclo de Pago", + options: { prepaid: "Prepago", net_30: "30 d\xEDas", net_60: "60 d\xEDas", net_90: "90 d\xEDas" } + }, + approval_status: { + label: "Estado de Aprobaci\xF3n", + help: "En qu\xE9 punto de su aprobaci\xF3n est\xE1 esta cuenta. Una cuenta nueva comienza Pendiente y se decide en la bandeja de aprobaciones.", + options: { pending: "Pendiente", approved: "Aprobada", rejected: "Rechazada" } + }, + name: { label: "Nombre de Cuenta", help: "Nombre legal de la empresa u organizaci\xF3n" }, + name_normalized: { + label: "Nombre de Cuenta (Normalizado)", + help: "Clave de coincidencia para la conversi\xF3n de prospectos: el Nombre de Cuenta en min\xFAsculas, sin espacios sobrantes y con los espacios internos reducidos a uno. Lo mantiene el hook account_protection \u2014 nunca lo edite directamente." + }, + display_title: { label: "T\xEDtulo Mostrado" }, + type: { + label: "Tipo", + // `former` is 'Former Customer' in account.object.ts; the `en` bundle + // had truncated it to 'Former', and translating that truncation gave + // a bare 'Anterior' — an adjective with no noun, next to three option + // labels that are all nouns. + options: { prospect: "Prospecto", customer: "Cliente", partner: "Socio", former: "Cliente Anterior" } + }, + industry: { + label: "Industria", + options: { + technology: "Tecnolog\xEDa", + software: "Software / SaaS", + finance: "Finanzas", + healthcare: "Salud", + retail: "Comercio", + manufacturing: "Manufactura", + education: "Educaci\xF3n", + real_estate: "Inmobiliaria", + media: "Medios y Entretenimiento", + logistics: "Log\xEDstica", + hospitality: "Hosteler\xEDa", + energy: "Energ\xEDa y Servicios P\xFAblicos", + government: "Gobierno", + nonprofit: "Sin \xC1nimo de Lucro", + other: "Otro" + } + }, + annual_revenue: { label: "Ingresos Anuales" }, + child_account_revenue: { label: "Ingresos de Cuentas Hijas", help: "Suma de los ingresos anuales de las cuentas hijas directas." }, + number_of_employees: { label: "N\xFAmero de Empleados" }, + phone: { label: "Tel\xE9fono" }, + website: { label: "Sitio Web" }, + billing_address: { label: "Direcci\xF3n de Facturaci\xF3n" }, + billing_country: { + label: "Pa\xEDs de Facturaci\xF3n", + help: "Derivado de la Direcci\xF3n de Facturaci\xF3n \u2014 el pa\xEDs tal como se introdujo, sin espacios y en may\xFAsculas." + }, + territory: { + label: "Territorio", + help: "Derivado de la Direcci\xF3n de Facturaci\xF3n \u2014 el territorio de ventas que usan las reglas de compartici\xF3n. Las cuentas fuera de los territorios con equipo asignado son Otro.", + options: { na: "Norteam\xE9rica", emea: "EMEA", other: "Otro" } + }, + office_location: { label: "Ubicaci\xF3n de Oficina" }, + owner_id: { label: "Propietario de Cuenta" }, + parent_account: { label: "Cuenta Matriz", help: "Empresa matriz en la jerarqu\xEDa" }, + description: { label: "Descripci\xF3n" }, + is_active: { label: "Activo" }, + last_activity_date: { label: "Fecha de \xDAltima Actividad" }, + brand_color: { label: "Color de Marca" }, + logo: { label: "Logo de la Empresa" }, + tier: { + label: "Nivel de Cliente", + options: { + strategic: "Estrat\xE9gico", + enterprise: "Gran Empresa", + mid_market: "Mediana Empresa", + smb: "PYME" + } + }, + segment: { + label: "Segmento", + options: { + net_new: "Cliente Nuevo", + growth: "Crecimiento", + at_risk: "En Riesgo", + stable: "Estable" + } + }, + health_score: { + label: "\xCDndice de Salud", + help: "Indicador de salud mantenido por el CSM", + options: { + healthy: "Saludable", + watching: "En Observaci\xF3n", + at_risk: "En Riesgo", + churning: "En Fuga" + } + } + }, + _views: { + all_accounts: { + label: "Todas las Cuentas", + description: "Lista maestra de cuentas con ingresos e industria", + bulkActions: { + delete: { + label: "Eliminar", + confirmLabel: "Eliminar", + confirmText: "\xBFEliminar permanentemente {{count}} cuenta(s)? Esta acci\xF3n no se puede deshacer." + }, + transfer_owner: { + label: "Transferir propietario", + confirmText: "\xBFTransferir la propiedad de {{count}} cuenta(s)?", + params: { + owner_id: { + label: "Nuevo propietario" + } + } + }, + update_tier: { + label: "Actualizar nivel", + confirmText: "\xBFActualizar el nivel de {{count}} cuenta(s) a {{tier}}?", + params: { + tier: { + label: "Nivel de cliente" + } + } + } + } + }, + account_gallery: { label: "Galer\xEDa de Cuentas", description: "Vista de tarjetas con colores de marca" }, + account_map: { label: "Mapa de Cuentas", description: "Distribuci\xF3n geogr\xE1fica de cuentas" }, + enterprise_accounts: { label: "Cuentas Empresariales", description: "Cuentas con mayores ingresos anuales" }, + my_accounts: { label: "Mis Cuentas", description: "Cuentas asignadas al usuario actual" }, + at_risk_accounts: { label: "\u26A0\uFE0F Cuentas en Riesgo" } + }, + _sections: { + basic: { label: "Informaci\xF3n B\xE1sica" }, + financials: { label: "Datos Financieros" }, + business_profile: { label: "Perfil de Negocio" }, + contact_info: { label: "Informaci\xF3n de Contacto" }, + ownership: { label: "Propiedad y Estado" }, + branding: { label: "Identidad de Marca" }, + system: { label: "Sistema" }, + // Nombres de sección del formulario en account.view.ts (#1100) + profile: { label: "Perfil" }, + customer_success: { label: "\xC9xito del Cliente" }, + locations: { label: "Ubicaciones" }, + description: { label: "Descripci\xF3n" } + }, + _actions: { ...activityActions4 } + }, + crm_contact: { + label: "Contacto", + pluralLabel: "Contactos", + description: "Personas asociadas a las cuentas", + fields: { + // Mismo juego de valores que `crm_lead.salutation` — tradúzcanse igual. + salutation: { + label: "T\xEDtulo", + options: { mr: "Sr.", ms: "Srta.", mrs: "Sra.", dr: "Dr.", prof: "Prof." } + }, + first_name: { label: "Nombre" }, + last_name: { label: "Apellido" }, + full_name: { label: "Nombre Completo" }, + crm_account: { label: "Cuenta" }, + email: { label: "Correo Electr\xF3nico" }, + phone: { label: "Tel\xE9fono" }, + mobile: { label: "M\xF3vil" }, + title: { label: "Cargo" }, + department: { + label: "Departamento", + options: { + executive: "Ejecutivo", + sales: "Ventas", + marketing: "Marketing", + engineering: "Ingenier\xEDa", + support: "Soporte", + finance: "Finanzas", + hr: "Recursos Humanos", + operations: "Operaciones" + } + }, + // Centro de compra (REQ-0004) — el mapa de la decisión. La etiqueta + // inglesa es 'Buying Function' y no 'Buying Role': la regla + // security-role-word reserva la palabra inglesa `role` en las + // declaraciones (ADR-0090 D3). Esa regla sólo lee inglés y no alcanza + // los paquetes de idioma, así que aquí va el término natural. + buying_function: { + label: "Rol de Compra", + options: { + decision_maker: "Decisor", + economic_buyer: "Comprador Econ\xF3mico", + technical_evaluator: "Evaluador T\xE9cnico", + user: "Usuario", + influencer: "Influenciador", + gatekeeper: "Guardi\xE1n" + } + }, + attitude: { + label: "Actitud hacia Nosotros", + options: { + champion: "Defensor", + supportive: "Favorable", + neutral: "Neutral", + skeptical: "Esc\xE9ptico", + blocker: "Bloqueador" + } + }, + relationship_strength: { + label: "Fuerza de la Relaci\xF3n", + options: { + distant: "Distante", + acquaintance: "Conocido", + working: "Relaci\xF3n de Trabajo", + strong: "Fuerte", + trusted_advisor: "Asesor de Confianza" + } + }, + owner_id: { label: "Propietario de Contacto" }, + description: { label: "Descripci\xF3n" }, + is_primary: { label: "Contacto Principal", help: "\xBFEs este el contacto principal de la cuenta?" }, + avatar: { label: "Foto de Perfil" }, + mailing_address: { label: "Direcci\xF3n de Correo" }, + // Juego compartido con `crm_lead.lead_source` y + // `crm_opportunity.lead_source` — los tres deben coincidir literalmente. + lead_source: { + label: "Origen del Prospecto", + options: { + web: "Web", + referral: "Referencia", + event: "Evento / Feria", + webinar: "Seminario Web", + partner: "Socio", + advertisement: "Publicidad", + paid_search: "B\xFAsqueda de Pago", + social: "Redes Sociales", + content: "Contenido / Blog", + cold_call: "Llamada en Fr\xEDo", + email_campaign: "Campa\xF1a de Email", + other: "Otro" + } + }, + do_not_call: { label: "No Llamar" }, + email_opt_out: { label: "Excluir de Correos" }, + last_contacted_date: { label: "\xDAltimo contacto" } + }, + _views: { + all_contacts: { label: "Todos los Contactos" }, + contact_directory: { label: "Directorio de Contactos" }, + primary_contacts: { label: "Contactos Principales" } + }, + _sections: { + identity: { label: "Identidad" }, + account_info: { label: "Cuenta y Cargo" }, + buying_centre: { label: "Centro de Compra" }, + contact_info: { label: "Informaci\xF3n de Contacto" }, + mailing_address: { label: "Direcci\xF3n de Correo" }, + additional: { label: "Informaci\xF3n Adicional" }, + preferences: { label: "Preferencias de Comunicaci\xF3n" }, + // Nombres de sección del formulario en contact.view.ts (#1100) + contact_details: { label: "Informaci\xF3n de Contacto" }, + comm_preferences: { label: "Preferencias" } + }, + _actions: { + ...activityActions4, + mark_primary: { + label: "Marcar como Principal", + confirmText: "\xBFEstablecer este contacto como contacto principal de la cuenta?", + successMessage: "\xA1Establecido como contacto principal!" + }, + send_email: { + label: "Enviar Correo", + params: { + subject: { label: "Asunto" }, + body: { label: "Cuerpo" } + } + }, + add_contact_to_campaign: { + label: "A\xF1adir a Campa\xF1a", + successMessage: "\xA1Contactos a\xF1adidos a la campa\xF1a!", + params: { + crm_campaign: { label: "Campa\xF1a" } + } + } + } + } +}; + +// src/sales/translations/es-ES/objects.pipeline.ts +var pipeline4 = { + crm_lead: { + _validations: { + disqualification_reason_required: { + message: "El motivo de descalificaci\xF3n es obligatorio cuando un prospecto no est\xE1 cualificado" + }, + duplicate_disqualification_requires_survivor: { + message: "Descalificar un prospecto como duplicado exige nombrar el registro superviviente y marcar el estado de duplicado como Confirmado" + }, + email_required: { + message: "El correo electr\xF3nico es obligatorio" + }, + lead_status_progression: { + message: "Transici\xF3n de estado de prospecto no v\xE1lida" + } + }, + label: "Prospecto", + pluralLabel: "Prospectos", + description: "Clientes potenciales todav\xEDa sin calificar", + fields: { + first_name: { label: "Nombre" }, + last_name: { label: "Apellido" }, + company: { label: "Empresa" }, + company_normalized: { + label: "Empresa (Normalizado)", + help: "Clave de coincidencia para la conversi\xF3n de prospectos: la Empresa en min\xFAsculas, sin espacios sobrantes y con los espacios internos reducidos a uno. Lo mantiene el hook lead_duplicate_check \u2014 nunca lo edite directamente." + }, + display_title: { label: "T\xEDtulo Mostrado" }, + title: { label: "Cargo" }, + email: { label: "Correo Electr\xF3nico" }, + phone: { label: "Tel\xE9fono" }, + status: { + label: "Estado", + options: { + new: "Nuevo", + contacted: "Contactado", + qualified: "Calificado", + unqualified: "No Calificado", + converted: "Convertido" + } + }, + lead_source: { + label: "Origen del Prospecto", + options: { + web: "Web", + referral: "Referencia", + event: "Evento / Feria", + webinar: "Seminario Web", + partner: "Socio", + advertisement: "Publicidad", + paid_search: "B\xFAsqueda de Pago", + social: "Redes Sociales", + content: "Contenido / Blog", + cold_call: "Llamada en Fr\xEDo", + email_campaign: "Campa\xF1a de Email", + other: "Otro" + } + }, + owner_id: { label: "Propietario" }, + is_converted: { label: "Convertido" }, + description: { label: "Descripci\xF3n" }, + // Mismo juego de valores que `crm_contact.salutation` — tradúzcanse igual. + salutation: { + label: "Tratamiento", + options: { mr: "Sr.", ms: "Srta.", mrs: "Sra.", dr: "Dr.", prof: "Prof." } + }, + full_name: { label: "Nombre Completo" }, + // Los 15 valores son los mismos que en `crm_account.industry` — deben + // coincidir literalmente entre ambas pantallas. + industry: { + label: "Industria", + options: { + technology: "Tecnolog\xEDa", + software: "Software / SaaS", + finance: "Finanzas", + healthcare: "Salud", + retail: "Comercio", + manufacturing: "Manufactura", + education: "Educaci\xF3n", + real_estate: "Inmobiliaria", + media: "Medios y Entretenimiento", + logistics: "Log\xEDstica", + hospitality: "Hosteler\xEDa", + energy: "Energ\xEDa y Servicios P\xFAblicos", + government: "Gobierno", + nonprofit: "Sin \xC1nimo de Lucro", + other: "Otro" + } + }, + mobile: { label: "M\xF3vil" }, + website: { label: "Sitio Web" }, + rating: { label: "Puntuaci\xF3n de Prospecto", help: "Puntuaci\xF3n de calidad del prospecto (1-5 estrellas)" }, + next_followup_date: { label: "Pr\xF3xima Fecha de Seguimiento" }, + last_contacted_date: { label: "\xDAltimo Contacto" }, + need_type: { + label: "Tipo de Necesidad", + help: "Qu\xE9 est\xE1 pidiendo este prospecto. La asignaci\xF3n, la priorizaci\xF3n y los informes de demanda leen este campo.", + options: { + new_implementation: "Nueva Implantaci\xF3n", + expansion: "Ampliaci\xF3n", + replacement: "Sustituci\xF3n", + renewal: "Renovaci\xF3n", + consulting: "Consultor\xEDa", + support: "Soporte y Mantenimiento", + other: "Otro" + } + }, + estimated_amount: { + label: "Importe Estimado", + help: "Valor estimado de esta necesidad, antes de la cualificaci\xF3n. Precarga el importe de la oportunidad al convertir." + }, + conversion_approval_status: { + label: "Aprobaci\xF3n de Conversi\xF3n", + help: "Si este prospecto tiene el visto bueno para convertirse. \xABNo Requerida\xBB significa que no se pide aprobaci\xF3n: es el valor predeterminado de f\xE1brica.", + options: { + not_required: "No Requerida", + pending: "Pendiente", + approved: "Aprobada", + rejected: "Rechazada" + } + }, + converted_account: { label: "Cuenta Convertida" }, + converted_contact: { label: "Contacto Convertido" }, + converted_opportunity: { label: "Oportunidad Convertida" }, + converted_date: { label: "Fecha de Conversi\xF3n" }, + address: { label: "Direcci\xF3n" }, + annual_revenue: { label: "Ingresos Anuales" }, + number_of_employees: { label: "N\xFAmero de Empleados" }, + notes: { label: "Notas", help: "Notas de trabajo sobre este cliente potencial: admite formato." }, + do_not_call: { label: "No Llamar" }, + email_opt_out: { label: "Excluir de Correos" }, + disqualification_reason: { + label: "Motivo de No Calificaci\xF3n", + help: "Obligatorio cuando el estado es No Calificado", + options: { + not_a_fit: "No Encaja", + no_budget: "Sin Presupuesto", + wrong_persona: "Perfil Incorrecto", + unreachable: "Ilocalizable", + duplicate: "Duplicado", + competitor: "Competidor", + other: "Otro" + } + }, + duplicate_of_type: { + label: "Duplicado De", + help: "Qu\xE9 objeto contiene el registro superviviente que este prospecto repite.", + // `erased` es una lápida, no una opción: el formulario no la ofrece + // (ver `src/sales/views/lead.view.ts`), pero un prospecto cuyo superviviente + // fue eliminado la lleva, así que necesita etiqueta allí donde el + // registro se LEE; sin traducir se mostraría el valor crudo `erased`. + options: { crm_lead: "Prospecto", crm_contact: "Contacto", erased: "Registro Eliminado" } + }, + duplicate_of_lead: { label: "Prospecto Duplicado" }, + duplicate_of_contact: { label: "Contacto Duplicado" }, + duplicate_status: { + label: "Estado del Duplicado", + help: "Sospechoso = marcado autom\xE1ticamente en la captura. Confirmado = una persona verific\xF3 la coincidencia.", + options: { suspected: "Sospechoso", confirmed: "Confirmado" } + } + }, + _views: { + all_leads: { + label: "Todos los Prospectos", + emptyState: { title: "Todav\xEDa no hay prospectos", message: "Empiece creando su primer prospecto" } + }, + kanban_by_status: { label: "Pipeline de Prospectos" }, + calendar_by_created: { label: "Calendario de Prospectos" }, + gallery_view: { label: "Galer\xEDa de Prospectos" }, + my_leads: { label: "Mis Prospectos" }, + high_priority: { label: "Alta Prioridad" }, + hot_leads: { label: "\u{1F525} Prospectos Calientes" }, + suspected_duplicates: { + label: "Duplicados Sospechosos", + emptyState: { + title: "Sin duplicados sospechosos", + message: "Nada que revisar: se han comprobado todos los correos recapturados." + } + } + }, + _sections: { + // Claves de sección del objeto (lead.object.ts) que usan los + // formularios de registro y la página de detalle, cuyas secciones + // hacen referencia a estos grupos (#806). + address: { label: "Direcci\xF3n" }, + identity: { label: "Identidad" }, + company_info: { label: "Informaci\xF3n de la Empresa" }, + contact_info: { label: "Informaci\xF3n de Contacto" }, + qualification: { label: "Calificaci\xF3n" }, + assignment: { label: "Asignaci\xF3n" }, + conversion: { label: "Conversi\xF3n" }, + additional: { label: "Informaci\xF3n Adicional" }, + preferences: { label: "Preferencias de Comunicaci\xF3n" }, + duplicates: { label: "Gesti\xF3n de Duplicados" }, + // Nombres de sección del formulario en lead.view.ts (#1100) — aquí + // viven las secciones del formulario por defecto y las de cada formView + // con nombre: si se añade un formulario allí, se añaden aquí sus + // nombres de sección. + contact_information: { label: "Informaci\xF3n de Contacto" }, + lead_classification: { label: "Clasificaci\xF3n del Lead" }, + company_information: { label: "Informaci\xF3n de la Empresa" }, + additional_information: { label: "Informaci\xF3n Adicional" }, + privacy: { label: "Privacidad" }, + general: { label: "General" }, + details: { label: "Detalles" }, + step_1_contact_details: { label: "Paso 1: Datos de Contacto" }, + step_2_company_information: { label: "Paso 2: Informaci\xF3n de la Empresa" }, + step_3_qualification: { label: "Paso 3: Calificaci\xF3n" }, + step_4_review_and_convert: { label: "Paso 4: Revisar y Convertir" }, + primary_information: { label: "Informaci\xF3n Principal" }, + extended_details: { label: "Detalles Ampliados" }, + quick_edit: { label: "Edici\xF3n R\xE1pida" }, + update_lead_status: { label: "Actualizar Estado del Lead" }, + tell_us_about_yourself: { label: "Cu\xE9ntanos sobre ti" }, + about_your_company: { label: "Sobre tu empresa" }, + how_can_we_help: { label: "\xBFC\xF3mo podemos ayudarte?" }, + lead_information: { label: "Informaci\xF3n del Lead" }, + address_information: { label: "Informaci\xF3n de Direcci\xF3n" }, + privacy_preferences: { label: "Preferencias de Privacidad" } + }, + _actions: { + ...activityActions4, + convert_lead: { + label: "Convertir Prospecto", + successMessage: "\xA1Prospecto convertido con \xE9xito!" + }, + create_campaign: { + label: "Agregar a Campa\xF1a", + successMessage: "\xA1Prospecto agregado a la campa\xF1a!", + params: { + crm_campaign: { label: "Campa\xF1a" } + } + }, + schedule_followup: { + label: "Programar Seguimiento", + successMessage: "Seguimiento programado." + } + } + }, + crm_opportunity: { + _validations: { + amount_positive: { + message: "El importe debe ser mayor que cero" + }, + close_date_future: { + message: "La fecha de cierre no deber\xEDa estar en el pasado salvo que la oportunidad est\xE9 cerrada" + }, + opportunity_stage_progression: { + message: "Transici\xF3n de etapa de oportunidad no v\xE1lida" + } + }, + label: "Oportunidad", + pluralLabel: "Oportunidades", + description: "Oportunidades de venta y negocios en el pipeline", + fields: { + name: { label: "Nombre de Oportunidad" }, + crm_account: { label: "Cuenta" }, + primary_contact: { label: "Contacto Principal" }, + owner_id: { label: "Propietario de Oportunidad" }, + amount: { label: "Monto" }, + expected_revenue: { label: "Ingreso Esperado" }, + stage: { + label: "Etapa", + options: { + prospecting: "Prospecci\xF3n", + qualification: "Calificaci\xF3n", + needs_analysis: "An\xE1lisis de Necesidades", + proposal: "Propuesta", + negotiation: "Negociaci\xF3n", + closed_won: "Cerrada Ganada", + closed_lost: "Cerrada Perdida" + } + }, + probability: { label: "Probabilidad (%)" }, + close_date: { label: "Fecha de Cierre" }, + type: { + label: "Tipo", + options: { + new_business: "Nuevo Negocio", + existing_upgrade: "Cliente Existente - Mejora", + existing_renewal: "Cliente Existente - Renovaci\xF3n", + existing_expansion: "Cliente Existente - Expansi\xF3n" + } + }, + forecast_category: { + label: "Categor\xEDa de Pron\xF3stico", + options: { + pipeline: "Pipeline", + best_case: "Mejor Caso", + commit: "Compromiso", + omitted: "Omitida", + closed: "Cerrada" + } + }, + description: { label: "Descripci\xF3n" }, + next_step: { label: "Pr\xF3ximo Paso" }, + lead_source: { + label: "Origen del Prospecto", + options: { + web: "Web", + referral: "Referencia", + event: "Evento / Feria", + webinar: "Seminario Web", + partner: "Socio", + advertisement: "Publicidad", + paid_search: "B\xFAsqueda de Pago", + social: "Redes Sociales", + content: "Contenido / Blog", + cold_call: "Llamada en Fr\xEDo", + email_campaign: "Campa\xF1a de Email", + other: "Otro" + } + }, + crm_campaign: { label: "Campa\xF1a", help: "Campa\xF1a de marketing que gener\xF3 esta oportunidad" }, + days_in_stage: { label: "D\xEDas en Etapa Actual" }, + stage_entry_date: { label: "Fecha de Entrada a la Etapa", help: "Fecha en la que esta oportunidad entr\xF3 en su etapa actual." }, + is_private: { label: "Privado" }, + approval_status: { + label: "Estado de Aprobaci\xF3n", + options: { + not_required: "No Requerida", + pending: "Pendiente", + approved: "Aprobada", + rejected: "Rechazada" + } + }, + approved_date: { label: "Fecha de Aprobaci\xF3n" }, + // #593 — obligatorias al cerrar la oportunidad, y el desglose de + // motivos de pérdida las muestra en el panel de ventas, así que el + // valor almacenado nunca debe llegar crudo al selector. + win_reason: { + label: "Motivo de Ganancia", + help: "Por qu\xE9 se gan\xF3 este negocio. Obligatorio para cerrar una oportunidad como Ganada.", + options: { + better_product: "Mejor Producto", + better_price: "Mejor Precio", + relationship: "Relaci\xF3n Existente", + better_support: "Mejor Soporte", + best_fit: "Mejor Ajuste / Funcionalidades", + quote_accepted: "Cotizaci\xF3n Aceptada", + other: "Otro" + } + }, + loss_reason: { + label: "Motivo de P\xE9rdida", + help: "Por qu\xE9 se perdi\xF3 este negocio. Obligatorio para cerrar una oportunidad como Perdida.", + options: { + price: "Precio Demasiado Alto", + competitor: "Perdida ante Competidor", + no_budget: "Sin Presupuesto", + no_decision: "Sin Decisi\xF3n", + timing: "Momento Inadecuado", + features: "Funcionalidades Faltantes", + other: "Otro" + } + }, + loss_details: { + label: "Detalles de Ganancia/P\xE9rdida", + help: "Contexto en texto libre detr\xE1s del motivo de ganancia o p\xE9rdida." + }, + // REQ-0006 — calificación, calendario de compra del cliente, narrativa + // del negocio, línea de negocio y aprobación del cambio de estado. + will_bid: { + label: "Presentaremos Oferta", + help: "Si tenemos intenci\xF3n de presentar oferta. Sin valor significa que la decisi\xF3n sigue abierta." + }, + controllability: { label: "Controlabilidad", options: { high: "Alta", medium: "Media", low: "Baja" } }, + priority: { label: "Prioridad", options: { high: "Alta", medium: "Media", low: "Baja" } }, + deal_level: { label: "Nivel del Negocio", options: { strategic: "Estrat\xE9gico", key: "Clave", standard: "Est\xE1ndar" } }, + is_subcontracted: { label: "Incluye Subcontrataci\xF3n" }, + subcontracting_note: { label: "Nota de Subcontrataci\xF3n" }, + customer_initiation_date: { label: "Fecha de Inicio del Proyecto (Cliente)" }, + expected_tender_date: { label: "Fecha Prevista de Licitaci\xF3n" }, + expected_signing_date: { label: "Fecha Prevista de Firma" }, + expected_tender_amount: { label: "Importe Previsto de Licitaci\xF3n" }, + expected_signing_amount: { label: "Importe Previsto de Firma" }, + business_line: { + label: "L\xEDnea de Negocio", + options: { + product: "Producto", + services: "Servicios Profesionales", + consulting: "Consultor\xEDa", + support: "Soporte y Mantenimiento", + other: "Otro" + } + }, + customer_background: { label: "Antecedentes del Cliente" }, + project_background: { label: "Antecedentes del Proyecto" }, + risk_analysis: { label: "An\xE1lisis de Riesgos" }, + payment_terms: { label: "Condiciones de Pago" }, + requested_status: { label: "Estado Solicitado", options: { closed_won: "Ganada", closed_lost: "Perdida" } }, + status_change_approval_status: { + label: "Aprobaci\xF3n del Cambio de Estado", + options: { + not_required: "No Requerida", + pending: "Pendiente", + approved: "Aprobada", + rejected: "Rechazada" + } + }, + // REQ-0006 paso 11 — la aprobación de calificación (立项). + qualification_requested: { + label: "Solicitar Aprobaci\xF3n de Calificaci\xF3n", + help: "M\xE1rquelo para enviar este negocio a aprobaci\xF3n de calificaci\xF3n. Un rechazo lo desmarca; vuelva a marcarlo para solicitarla de nuevo." + }, + qualification_approval_status: { + label: "Aprobaci\xF3n de Calificaci\xF3n", + options: { + not_required: "No Requerida", + pending: "Pendiente", + approved: "Aprobada", + rejected: "Rechazada" + } + } + }, + _views: { + tender_this_quarter: { + label: "Licitaciones de Este Trimestre", + emptyState: { + title: "No hay licitaciones previstas este trimestre", + message: "Esta pesta\xF1a muestra los negocios abiertos cuya fecha de licitaci\xF3n del cliente cae dentro del trimestre actual. Registra la Fecha Prevista de Licitaci\xF3n en un negocio para verlo aqu\xED." + } + }, + open_opportunities: { label: "Oportunidades Abiertas" }, + all_opportunities: { label: "Todas las Oportunidades" }, + pipeline_kanban: { label: "Pipeline de Ventas" }, + close_date_calendar: { label: "Calendario de Pron\xF3stico" }, + deal_timeline: { label: "L\xEDnea de Tiempo" }, + deal_gallery: { label: "Galer\xEDa de Negocios" }, + my_open_deals: { label: "Mis Negocios Abiertos" }, + closing_this_quarter: { + label: "Cierres de Este Trimestre", + emptyState: { + title: "No hay negocios que cierren este trimestre", + message: "Esta pesta\xF1a muestra los negocios abiertos en categor\xEDa Compromiso o Mejor Caso cuya fecha de cierre cae dentro del trimestre actual. Ahora mismo no hay ninguno; los negocios que cierran m\xE1s adelante est\xE1n en la pesta\xF1a Negocios Abiertos." + } + }, + stale_opportunities: { label: "\u26A0\uFE0F Oportunidades Estancadas \xB7 M\xE1s Tiempo en Etapa Primero" } + }, + _sections: { + // Claves de sección del objeto (opportunity.object.ts) que usan los + // formularios de registro y la página de detalle, cuyas secciones + // hacen referencia a estos grupos (#1452). + // + // `crm_forecast` es la clave del grupo de campos («Forecast & Metrics» + // en inglés). Esta traducción es anterior a #1452, cuando una sección + // de la página de detalle con el mismo nombre se titulaba «Stage & + // Forecast»; desde entonces solo la lee el grupo. + crm_forecast: { label: "Etapa y Previsi\xF3n" }, + basic: { label: "Informaci\xF3n B\xE1sica" }, + financials: { label: "Datos Financieros" }, + sales_process: { label: "Proceso de Venta" }, + classification: { label: "Clasificaci\xF3n" }, + campaign: { label: "Campa\xF1as" }, + notes: { label: "Notas y Pr\xF3ximos Pasos" }, + qualification: { label: "Calificaci\xF3n" }, + narrative: { label: "Narrativa del Negocio" }, + // Nombres de sección del formulario en opportunity.view.ts (#1100) + overview: { label: "Resumen" }, + forecast: { label: "Previsi\xF3n" }, + sales_strategy: { label: "Estrategia de Ventas" }, + win_loss: { label: "Ganada / Perdida" } + }, + _actions: { + ...activityActions4, + clone_opportunity: { + label: "Clonar Oportunidad", + successMessage: "\xA1Oportunidad clonada con \xE9xito!" + }, + mass_update_stage: { + label: "Actualizar Etapa", + successMessage: "\xA1Etapa de oportunidad actualizada!", + params: { + // Mismos valores que `fields.stage` — deben coincidir literalmente. + stage: { + label: "Nueva Etapa", + options: { + prospecting: "Prospecci\xF3n", + qualification: "Calificaci\xF3n", + needs_analysis: "An\xE1lisis de Necesidades", + proposal: "Propuesta", + negotiation: "Negociaci\xF3n", + closed_won: "Cerrada Ganada", + closed_lost: "Cerrada Perdida" + } + } + } + }, + generate_quote: { + label: "Generar Cotizaci\xF3n", + successMessage: "\xA1Cotizaci\xF3n creada desde la oportunidad!" + } + } + }, + crm_opportunity_line_item: { + _validations: { + unit_price_positive: { + message: "El precio de venta no puede ser negativo" + } + }, + label: "L\xEDnea de Oportunidad", + pluralLabel: "L\xEDneas de Oportunidad", + description: "L\xEDneas de precio por producto dentro de una oportunidad", + fields: { + crm_opportunity: { label: "Oportunidad" }, + crm_product: { label: "Producto" }, + description: { label: "Descripci\xF3n" }, + quantity: { label: "Cantidad" }, + list_price: { label: "Precio de Lista", help: "Se rellena autom\xE1ticamente desde el Precio de Lista del producto." }, + unit_price: { label: "Precio de Venta", help: "Precio unitario negociado (puede diferir del precio de lista)" }, + discount: { label: "Descuento (%)" }, + total_price: { label: "Total" }, + line_number: { label: "N\xBA de L\xEDnea" } + }, + _sections: { + basic: { label: "L\xEDnea" }, + pricing: { label: "Precios" } + } + }, + crm_forecast: { + _validations: { + period_end_after_start: { + message: "El fin del periodo debe ser posterior a su inicio." + }, + period_end_matches_calendar_period: { + message: "El fin del periodo debe ser el \xFAltimo d\xEDa del periodo: p. ej. 2026-09-30 para un trimestre que empieza el 2026-07-01, o 2026-08-31 para agosto de 2026." + }, + period_start_first_of_period: { + message: "El inicio del periodo debe ser el primer d\xEDa del periodo: p. ej. 2026-08-01 para agosto de 2026." + }, + quarter_starts_on_quarter_boundary: { + message: "Una previsi\xF3n trimestral debe comenzar en un l\xEDmite de trimestre: 1 de enero, 1 de abril, 1 de julio o 1 de octubre." + }, + snapshot_amounts_non_negative: { + message: "Los importes de la instant\xE1nea no pueden ser negativos." + } + }, + label: "Previsi\xF3n", + pluralLabel: "Previsiones", + description: "Instant\xE1nea peri\xF3dica del pipeline por propietario para previsi\xF3n de ingresos", + fields: { + owner_id: { label: "Propietario" }, + period: { label: "Periodo", options: { month: "Mes", quarter: "Trimestre" } }, + period_start: { + label: "Inicio del periodo", + help: "Debe ser el primer d\xEDa del periodo \u2014 p. ej. 2026-08-01 para agosto de 2026. Adem\xE1s, una previsi\xF3n trimestral debe comenzar en un l\xEDmite de trimestre: 1 de enero, 1 de abril, 1 de julio o 1 de octubre." + }, + period_end: { + label: "Fin del periodo", + help: "Normalmente se calcula autom\xE1ticamente a partir de Periodo e Inicio del periodo. Si se introduce a mano, debe ser el \xFAltimo d\xEDa de ese periodo \u2014 p. ej. 2026-09-30 para un trimestre que empieza el 2026-07-01, o 2026-08-31 para agosto de 2026." + }, + period_label: { label: "Periodo", help: "Etiqueta legible, p. ej. \xABT3 2026\xBB o \xABAgo 2026\xBB." }, + display_title: { label: "T\xEDtulo Mostrado" }, + snapshot_date: { label: "Fecha de instant\xE1nea", help: "El d\xEDa en que se captur\xF3 esta instant\xE1nea." }, + source: { + label: "Origen", + options: { scheduled: "Instant\xE1nea programada", ai: "Skill de IA", manual: "Entrada manual" } + }, + quota: { label: "Cuota" }, + pipeline_amount: { label: "Pipeline", help: "Suma de todas las oportunidades abiertas que cierran en este periodo (en cualquier etapa)." }, + best_case_amount: { label: "Mejor caso", help: "Oportunidades abiertas en la categor\xEDa de pron\xF3stico Mejor caso o Compromiso." }, + commit_amount: { label: "Compromiso", help: "Oportunidades abiertas en la categor\xEDa de pron\xF3stico Compromiso (comprometidas por el propietario)." }, + closed_amount: { label: "Cerrado", help: "Importe ya cerrado ganado en este periodo." }, + expected_amount: { label: "Esperado", help: "Cerrado + Compromiso: lo que el propietario espera razonablemente cerrar." }, + attainment_pct: { label: "Cumplimiento %", help: "Cerrado \xF7 Cuota \xD7 100. Muestra 0 % hasta que se fija una cuota positiva." }, + coverage_ratio: { label: "Cobertura", help: "Pipeline \xF7 (Cuota \u2212 Cerrado): si queda pipeline suficiente para cubrir la diferencia. Muestra 0 cuando ya se ha alcanzado la cuota." }, + notes: { label: "Notas" }, + seed_key: { + label: "Clave de semilla", + help: "Identidad del juego de datos de demostraci\xF3n. Solo la escribe el cargador de semillas; est\xE1 vac\xEDa en cualquier instant\xE1nea real." + } + }, + _views: { + all_forecasts: { label: "Todas las previsiones" }, + this_quarter_forecasts: { + label: "Este trimestre", + emptyState: { + title: "A\xFAn no hay instant\xE1neas de este trimestre", + message: "Las instant\xE1neas trimestrales las escribe el barrido nocturno de previsiones. Hasta que se ejecute una vez para el trimestre actual, esta vista est\xE1 vac\xEDa; los trimestres cerrados est\xE1n en la pesta\xF1a Todas." + } + }, + my_forecast: { label: "Mi previsi\xF3n" } + }, + _sections: { + basic: { label: "Instant\xE1nea" }, + amounts: { label: "Importes" }, + meta: { label: "Origen" }, + // Nombres de sección del formulario en forecast.view.ts (#1100) + snapshot: { label: "Instant\xE1nea" }, + notes: { label: "Notas" } + } + } +}; + +// src/sales/translations/es-ES/objects.commerce.ts +var commerce4 = { + crm_quote: { + _validations: { + discount_within_ceiling: { + message: "El descuento no puede superar el 60 %" + }, + expiration_after_quote: { + message: "La fecha de vencimiento debe ser posterior a la de la cotizaci\xF3n" + }, + quote_status_progression: { + message: "Transici\xF3n de estado de cotizaci\xF3n no v\xE1lida" + } + }, + label: "Cotizaci\xF3n", + pluralLabel: "Cotizaciones", + description: "Cotizaciones de precios para clientes", + fields: { + quote_number: { label: "N\xFAmero de Cotizaci\xF3n" }, + display_title: { label: "T\xEDtulo Mostrado" }, + name: { label: "Nombre de Cotizaci\xF3n" }, + crm_account: { label: "Cuenta" }, + crm_contact: { + label: "Contacto", + help: "Obligatorio en cuanto la cotizaci\xF3n pasa a Presentada o Aceptada: el contrato generado toma de aqu\xED su Contacto principal." + }, + crm_opportunity: { label: "Oportunidad" }, + owner_id: { label: "Propietario de Cotizaci\xF3n" }, + status: { + label: "Estado", + options: { + draft: "Borrador", + in_review: "En Revisi\xF3n", + presented: "Presentada", + accepted: "Aceptada", + rejected: "Rechazada", + expired: "Expirada" + } + }, + quote_date: { label: "Fecha de Cotizaci\xF3n" }, + expiration_date: { label: "Fecha de Expiraci\xF3n" }, + subtotal: { label: "Subtotal" }, + discount: { label: "Descuento %" }, + discount_amount: { label: "Monto de Descuento" }, + tax: { label: "Impuesto" }, + shipping_handling: { label: "Env\xEDo y Manipulaci\xF3n" }, + total_price: { label: "Precio Total" }, + // Mismo juego de valores que `crm_contract.payment_terms` — tradúzcanse igual. + payment_terms: { + label: "T\xE9rminos de Pago", + options: { + net_15: "Neto 15", + net_30: "Neto 30", + net_60: "Neto 60", + net_90: "Neto 90", + due_on_receipt: "Pago a la Recepci\xF3n" + } + }, + shipping_terms: { label: "T\xE9rminos de Env\xEDo" }, + billing_address: { label: "Direcci\xF3n de Facturaci\xF3n" }, + shipping_address: { label: "Direcci\xF3n de Env\xEDo" }, + description: { label: "Descripci\xF3n" }, + internal_notes: { label: "Notas Internas" } + }, + _views: { + all_quotes: { label: "Todas las Cotizaciones" }, + quote_pipeline: { label: "Pipeline de Cotizaciones" }, + quote_calendar: { label: "Calendario de Cotizaciones" } + }, + _sections: { + basic: { label: "Informaci\xF3n de la Cotizaci\xF3n" }, + pricing: { label: "Precios" }, + terms: { label: "T\xE9rminos y Vigencia" }, + address: { label: "Direcciones" }, + system: { label: "Sistema" }, + // Nombres de sección del formulario en quote.view.ts (#1100) + quote: { label: "Cotizaci\xF3n" }, + totals: { label: "Totales" }, + quote_terms: { label: "T\xE9rminos" }, + addresses_and_notes: { label: "Direcciones y Notas" } + } + }, + crm_quote_line_item: { + _validations: { + discount_within_ceiling: { + message: "El descuento de l\xEDnea no puede superar el 60 %" + }, + unit_price_positive: { + message: "El precio de venta no puede ser negativo" + } + }, + label: "L\xEDnea de Cotizaci\xF3n", + pluralLabel: "L\xEDneas de Cotizaci\xF3n", + description: "L\xEDneas de precio por producto dentro de una cotizaci\xF3n", + fields: { + crm_quote: { label: "Cotizaci\xF3n" }, + crm_product: { label: "Producto" }, + description: { label: "Descripci\xF3n" }, + quantity: { label: "Cantidad" }, + list_price: { label: "Precio de Lista" }, + unit_price: { label: "Precio de Venta" }, + discount: { label: "Descuento (%)" }, + subtotal: { label: "Subtotal" }, + total_price: { label: "Total" }, + line_number: { label: "N\xBA de L\xEDnea" } + }, + _sections: { + basic: { label: "L\xEDnea" }, + pricing: { label: "Precios" } + } + }, + crm_contract: { + _validations: { + end_after_start: { + message: "La fecha de fin debe ser posterior a la de inicio" + }, + contract_status_progression: { + message: "Transici\xF3n de estado de contrato no v\xE1lida" + } + }, + label: "Contrato", + pluralLabel: "Contratos", + description: "Contratos y acuerdos legales", + fields: { + contract_number: { label: "N\xFAmero de Contrato" }, + crm_account: { label: "Cuenta" }, + crm_contact: { label: "Contacto Principal" }, + crm_opportunity: { label: "Oportunidad Relacionada" }, + owner_id: { label: "Propietario del Contrato" }, + status: { + label: "Estado", + options: { + draft: "Borrador", + in_approval: "En Aprobaci\xF3n", + activated: "Activado", + expired: "Expirado", + terminated: "Rescindido" + } + }, + contract_term_months: { label: "Plazo del Contrato (Meses)" }, + start_date: { label: "Fecha de Inicio" }, + end_date: { label: "Fecha de Fin" }, + contract_value: { label: "Valor del Contrato" }, + billing_frequency: { + label: "Frecuencia de Facturaci\xF3n", + options: { monthly: "Mensual", quarterly: "Trimestral", annually: "Anual", one_time: "Pago \xDAnico" } + }, + // Mismo juego de valores que `crm_quote.payment_terms` — tradúzcanse igual. + payment_terms: { + label: "T\xE9rminos de Pago", + options: { + net_15: "Neto 15", + net_30: "Neto 30", + net_60: "Neto 60", + net_90: "Neto 90", + due_on_receipt: "Pago a la Recepci\xF3n" + } + }, + auto_renewal: { label: "Renovaci\xF3n Autom\xE1tica" }, + renewal_notice_days: { label: "Aviso de Renovaci\xF3n (D\xEDas)" }, + contract_type: { + label: "Tipo de Contrato", + options: { + subscription: "Suscripci\xF3n", + service: "Acuerdo de Servicio", + license: "Licencia", + partnership: "Asociaci\xF3n", + nda: "Acuerdo de Confidencialidad (NDA)", + msa: "Acuerdo Marco de Servicios (MSA)" + } + }, + signed_date: { label: "Fecha de Firma" }, + signed_by: { label: "Firmado Por" }, + document_url: { label: "Documento de Contrato" }, + special_terms: { label: "T\xE9rminos Especiales" }, + description: { label: "Descripci\xF3n" }, + billing_address: { label: "Direcci\xF3n de Facturaci\xF3n" } + }, + _views: { + all_contracts: { label: "Todos los Contratos" }, + renewal_calendar: { label: "Calendario de Renovaci\xF3n" }, + contract_gantt: { label: "Plazos del Contrato" }, + contract_timeline: { label: "L\xEDnea de Tiempo" } + }, + _sections: { + basic: { label: "Informaci\xF3n del Contrato" }, + parties: { label: "Partes" }, + terms: { label: "T\xE9rminos y Fechas" }, + value: { label: "Valor del Contrato" }, + status: { label: "Estado y Aprobaci\xF3n" }, + renewal: { label: "Renovaci\xF3n" }, + // Nombres de sección del formulario en contract.view.ts (#1100) + contract_terms: { label: "T\xE9rminos" }, + signing_and_documents: { label: "Firma y Documentos" }, + notes: { label: "Notas" } + } + }, + crm_product: { + _validations: { + cost_less_than_price: { + message: "El coste deber\xEDa ser inferior al precio de lista" + }, + price_positive: { + message: "El precio de lista debe ser positivo" + } + }, + label: "Producto", + pluralLabel: "Productos", + description: "Productos y servicios que ofrece la empresa", + fields: { + product_code: { label: "C\xF3digo de Producto" }, + display_title: { label: "T\xEDtulo Mostrado" }, + name: { label: "Nombre de Producto" }, + description: { label: "Descripci\xF3n" }, + category: { + label: "Categor\xEDa", + options: { + software: "Software", + hardware: "Hardware", + service: "Servicio", + subscription: "Suscripci\xF3n", + support: "Soporte" + } + }, + family: { + label: "Familia de Producto", + options: { + enterprise: "Soluciones para Gran Empresa", + smb: "Soluciones para PYMEs", + services: "Servicios Profesionales", + cloud: "Servicios en la Nube" + } + }, + list_price: { label: "Precio de Lista" }, + cost: { label: "Costo" }, + sku: { label: "SKU" }, + is_active: { label: "Activo" }, + product_manager: { label: "Gerente de Producto" }, + image: { label: "Imagen de Producto" }, + datasheet: { label: "Ficha T\xE9cnica" } + }, + _views: { + all_products: { label: "Todos los Productos" }, + product_catalog: { label: "Cat\xE1logo de Productos" } + }, + _sections: { + basic: { label: "Informaci\xF3n del Producto" }, + pricing: { label: "Precios" }, + metadata: { label: "Recursos" }, + // Nombres de sección del formulario en product.view.ts (#1100) + product_info: { label: "Informaci\xF3n del Producto" }, + pricing_info: { label: "Precios" }, + media: { label: "Multimedia" } + } + } +}; + +// src/sales/translations/es-ES/objects.service.ts +var service4 = { + crm_case: { + _validations: { + resolution_required_for_closed: { + message: "La resoluci\xF3n es obligatoria al cerrar un caso" + }, + escalation_reason_required: { + message: "El motivo de escalado es obligatorio al escalar un caso" + }, + case_status_progression: { + message: "Transici\xF3n de estado no v\xE1lida" + } + }, + label: "Caso", + pluralLabel: "Casos", + description: "Casos de soporte y solicitudes de servicio de clientes", + fields: { + case_number: { label: "N\xFAmero de Caso" }, + display_title: { label: "T\xEDtulo Mostrado" }, + subject: { label: "Asunto" }, + description: { label: "Descripci\xF3n" }, + crm_account: { label: "Cuenta" }, + crm_contact: { label: "Contacto" }, + status: { + label: "Estado", + options: { + new: "Nuevo", + in_progress: "En Curso", + waiting_customer: "Esperando al Cliente", + waiting_support: "Esperando a Soporte", + escalated: "Escalado", + resolved: "Resuelto", + closed: "Cerrado" + } + }, + priority: { + label: "Prioridad", + options: { low: "Baja", medium: "Media", high: "Alta", critical: "Cr\xEDtica" } + }, + priority_rank: { label: "Rango de Prioridad" }, + type: { + label: "Tipo de Caso", + options: { + question: "Consulta", + problem: "Problema", + feature_request: "Solicitud de Funcionalidad", + bug: "Error" + } + }, + // `email` y `chat` se dejan como préstamos: son el término habitual en + // español de negocios y concuerdan con `crm_campaign.channel`. + origin: { + label: "Origen del Caso", + options: { email: "Email", phone: "Tel\xE9fono", web: "Web", chat: "Chat", social_media: "Redes Sociales" } + }, + owner_id: { label: "Propietario del Caso" }, + closed_date: { label: "Fecha de Cierre" }, + first_response_date: { label: "Fecha de Primera Respuesta" }, + resolution_time_hours: { label: "Tiempo de Resoluci\xF3n (Horas)" }, + sla_due_date: { label: "Fecha L\xEDmite SLA", help: "Se fija seg\xFAn la prioridad del caso y el Nivel de Cliente de la cuenta, en horas naturales: las noches, los fines de semana y los festivos cuentan." }, + is_sla_violated: { label: "SLA Incumplido" }, + is_escalated: { label: "Escalado" }, + escalated_date: { label: "Fecha de Escalaci\xF3n" }, + escalation_reason: { label: "Motivo de Escalaci\xF3n" }, + resolution: { label: "Resoluci\xF3n" }, + resolved_by_article: { label: "Resuelto por Art\xEDculo", help: "Art\xEDculo de la base de conocimiento que resolvi\xF3 este caso \u2014 la se\xF1al de desv\xEDo." }, + internal_notes: { label: "Notas Internas", help: "Notas internas no visibles para el cliente" }, + is_closed: { label: "Est\xE1 Cerrado" } + }, + _views: { + all_cases: { label: "Todos los Casos" }, + case_workflow: { label: "Flujo de Servicio" }, + sla_calendar: { label: "Calendario SLA" }, + case_timeline: { label: "L\xEDnea de Tiempo de Casos" }, + unassigned_triage: { + label: "Sin asignar \u2014 triaje", + emptyState: { + title: "Nada pendiente de triaje", + message: "Todos los casos tienen propietario. Los casos aparecen aqu\xED cuando llegan sin propietario \u2014 normalmente un env\xEDo web-a-caso recibido mientras nadie ocupaba el puesto de Agente de Servicio." + } + }, + escalated_cases: { label: "Casos Escalados" }, + my_open_cases: { label: "Mis Casos Abiertos" }, + sla_at_risk: { label: "\u23F0 SLA en Riesgo" } + }, + _sections: { + // Nombres de sección del formulario en case.view.ts (#1100). + case: { label: "Caso" }, + how_can_we_help: { label: "\xBFC\xF3mo podemos ayudarte?" }, + // Claves de sección del objeto (case.object.ts) que usan los + // formularios de registro y la página de detalle, cuyas secciones + // hacen referencia a estos grupos (#970). + basic: { label: "Informaci\xF3n del Caso" }, + origin: { label: "Origen y Asignaci\xF3n" }, + sla: { label: "SLA y Prioridad" }, + resolution: { label: "Resoluci\xF3n" }, + escalation: { label: "Escalaci\xF3n" }, + system: { label: "Sistema" } + }, + _actions: { + ...activityActions4, + escalate_case: { + label: "Escalar Caso", + confirmText: "Esto enviar\xE1 el caso al equipo de escalaci\xF3n. \xBFContinuar?", + successMessage: "\xA1Caso escalado con \xE9xito!" + }, + close_case: { + label: "Cerrar Caso", + confirmText: "\xBFEst\xE1 seguro de querer cerrar este caso?", + successMessage: "\xA1Caso cerrado con \xE9xito!" + }, + claim_case: { + label: "Tomar Caso", + successMessage: "Caso tomado: ahora es suyo." + } + } + }, + crm_knowledge_article: { + _validations: { + published_requires_body: { + message: "No se pueden publicar art\xEDculos sin cuerpo." + }, + published_requires_summary: { + message: "Los art\xEDculos publicados deben tener un resumen para los resultados de b\xFAsqueda y las citas de IA." + } + }, + label: "Art\xEDculo de Conocimiento", + pluralLabel: "Base de Conocimiento", + description: "Respuestas y gu\xEDas reutilizables para clientes y agentes", + fields: { + article_number: { label: "N.\xBA Art\xEDculo" }, + display_title: { label: "T\xEDtulo Mostrado" }, + title: { label: "T\xEDtulo" }, + summary: { label: "Resumen", help: "Resumen de un p\xE1rrafo que se muestra en los resultados de b\xFAsqueda y en las citas de la IA." }, + body: { label: "Contenido", help: "Contenido completo del art\xEDculo (Markdown)." }, + category: { + label: "Categor\xEDa", + options: { + getting_started: "Primeros pasos", + how_to: "C\xF3mo hacerlo", + troubleshooting: "Resoluci\xF3n de problemas", + billing: "Facturaci\xF3n", + api: "API e Integraciones", + release_notes: "Notas de versi\xF3n", + policy: "Pol\xEDticas" + } + }, + tags: { + label: "Etiquetas", + options: { + auth: "Autenticaci\xF3n", + sso: "SSO", + mobile: "M\xF3vil", + email: "Correo", + reports: "Informes", + performance: "Rendimiento", + data_import: "Importaci\xF3n de datos", + webhooks: "Webhooks" + } + }, + status: { + label: "Estado", + options: { draft: "Borrador", in_review: "En revisi\xF3n", published: "Publicado", archived: "Archivado" } + }, + audience: { + label: "Audiencia", + help: "Los art\xEDculos p\xFAblicos son visibles en el portal de clientes; los internos solo los ven los agentes.", + options: { public: "P\xFAblico", internal: "Interno" } + }, + language: { + label: "Idioma", + options: { en: "Ingl\xE9s", zh_cn: "Chino simplificado", es_es: "Espa\xF1ol", ja_jp: "Japon\xE9s" } + }, + owner_id: { label: "Propietario" }, + related_to_case: { label: "Caso de origen", help: "Caso a partir del cual se redact\xF3 este art\xEDculo (opcional)." }, + published_at: { label: "Publicado el" }, + last_reviewed_at: { label: "\xDAltima revisi\xF3n" }, + helpful_count: { label: "\xDAtil", help: "Recontado desde crm_article_feedback \u2014 nunca se escribe a mano." }, + not_helpful_count: { label: "No \xFAtil", help: "Recontado desde crm_article_feedback \u2014 nunca se escribe a mano." } + }, + _views: { + all_articles: { label: "Todos los art\xEDculos" }, + published_articles: { label: "Publicados" }, + my_drafts: { label: "Mis borradores" } + }, + _sections: { + basic: { label: "Informaci\xF3n del Art\xEDculo" }, + content: { label: "Contenido" }, + taxonomy: { label: "Categorizaci\xF3n" }, + metrics: { label: "Interacci\xF3n" }, + engagement: { label: "Interacci\xF3n" }, + // Nombre de sección del formulario en knowledge_article.view.ts (#1100) + article: { label: "Art\xEDculo" } + }, + _actions: { + mark_article_helpful: { + label: "\xDAtil", + successMessage: "Gracias \u2014 registrado como \xFAtil." + }, + mark_article_not_helpful: { + label: "No \xFAtil", + successMessage: "Gracias \u2014 registrado como no \xFAtil." + } + } + }, + crm_article_feedback: { + label: "Opini\xF3n sobre el Art\xEDculo", + pluralLabel: "Opiniones sobre Art\xEDculos", + description: "El veredicto \xFAtil / no \xFAtil de un lector sobre un art\xEDculo de la base de conocimiento", + fields: { + feedback_number: { label: "N.\xBA de Opini\xF3n" }, + owner_id: { label: "Lector" }, + crm_knowledge_article: { label: "Art\xEDculo", help: "Art\xEDculo de la base de conocimiento al que se refiere esta opini\xF3n." }, + verdict: { + label: "Veredicto", + options: { helpful: "\xDAtil", not_helpful: "No \xFAtil" } + }, + comment: { label: "Comentario", help: "Nota opcional que explica el veredicto \u2014 la lee el autor del art\xEDculo." } + }, + _sections: { + basic: { label: "Opini\xF3n" } + } + } +}; + +// src/sales/translations/es-ES/objects.activity.ts +var activity4 = { + crm_task: { + _validations: { + completed_date_required: { + message: "La fecha de finalizaci\xF3n es obligatoria cuando el estado es Completada" + }, + recurrence_fields_required: { + message: "El tipo de recurrencia es obligatorio para las tareas recurrentes" + }, + related_to_required: { + message: "Debe seleccionarse al menos un registro relacionado" + } + }, + label: "Tarea", + pluralLabel: "Tareas", + description: "Actividades y tareas pendientes", + fields: { + subject: { label: "Asunto" }, + description: { label: "Descripci\xF3n" }, + status: { + label: "Estado", + options: { + not_started: "No Iniciada", + in_progress: "En Curso", + waiting: "En Espera", + completed: "Completada", + deferred: "Aplazada" + } + }, + priority: { + label: "Prioridad", + options: { low: "Baja", normal: "Normal", high: "Alta", urgent: "Urgente" } + }, + priority_rank: { label: "Rango de Prioridad" }, + type: { + label: "Tipo de Tarea", + options: { + call: "Llamada", + email: "Email", + meeting: "Reuni\xF3n", + follow_up: "Seguimiento", + demo: "Demostraci\xF3n", + other: "Otro" + } + }, + due_date: { label: "Fecha L\xEDmite" }, + reminder_date: { label: "Fecha/Hora de Recordatorio" }, + reminder_sent: { label: "Recordatorio Enviado" }, + completed_date: { label: "Fecha de Finalizaci\xF3n" }, + owner_id: { label: "Asignado A" }, + // Los valores son nombres de objeto: se reutilizan las etiquetas ya + // traducidas de cada objeto en este mismo paquete (igual que + // `crm_event.related_to_type`). + related_to_type: { + label: "Tipo de Objeto Relacionado", + options: { + crm_account: "Cuenta", + crm_contact: "Contacto", + crm_opportunity: "Oportunidad", + crm_lead: "Prospecto", + crm_case: "Caso" + } + }, + related_to_account: { label: "Cuenta Relacionada" }, + related_to_contact: { label: "Contacto Relacionado" }, + related_to_opportunity: { label: "Oportunidad Relacionada" }, + related_to_lead: { label: "Prospecto Relacionado" }, + related_to_case: { label: "Caso Relacionado" }, + is_recurring: { label: "Tarea Recurrente" }, + recurrence_type: { + label: "Tipo de Recurrencia", + options: { daily: "Diaria", weekly: "Semanal", monthly: "Mensual", yearly: "Anual" } + }, + recurrence_interval: { label: "Intervalo de Recurrencia" }, + recurrence_end_date: { label: "Fecha Fin de Recurrencia" }, + is_completed: { label: "Est\xE1 Completado" }, + is_overdue: { label: "Est\xE1 Vencido" }, + progress_percent: { label: "Progreso (%)" } + }, + _views: { + all_tasks: { label: "Todas las Tareas" }, + task_board: { label: "Tablero de Tareas" }, + task_calendar: { label: "Calendario de Tareas" }, + task_gantt: { label: "Plan de Ejecuci\xF3n" }, + task_timeline: { label: "L\xEDnea de Tiempo" }, + my_open_tasks: { label: "Mis Tareas Abiertas" }, + todays_tasks: { label: "\u{1F4C5} Mis Tareas Prioritarias" }, + overdue_tasks: { label: "\u23F0 Tareas Abiertas \xB7 M\xE1s Vencidas Primero" } + }, + _sections: { + basic: { label: "Informaci\xF3n de la Tarea" }, + scheduling: { label: "Programaci\xF3n" }, + related: { label: "Registros Relacionados" }, + recurrence: { label: "Recurrencia" }, + effort: { label: "Progreso y Esfuerzo" }, + system: { label: "Sistema" }, + // Nombres de sección del formulario en task.view.ts (#1100) + task: { label: "Tarea" }, + related_records: { label: "Registros Relacionados" }, + recurrence_and_effort: { label: "Recurrencia y Esfuerzo" } + } + }, + crm_event: { + _validations: { + end_after_start: { + message: "La hora de fin debe ser posterior a la de inicio" + }, + related_to_required: { + message: "Debe seleccionarse al menos un registro relacionado" + } + }, + label: "Evento", + pluralLabel: "Eventos", + description: "Reuniones, llamadas y otras interacciones programadas con clientes", + fields: { + subject: { label: "Asunto" }, + description: { label: "Descripci\xF3n" }, + type: { + label: "Tipo de evento", + options: { + meeting: "Reuni\xF3n", + call: "Llamada", + demo: "Demostraci\xF3n", + webinar: "Seminario web", + onsite_visit: "Visita presencial", + other: "Otro" + } + }, + status: { + label: "Estado", + options: { + planned: "Planificado", + held: "Realizado", + cancelled: "Cancelado", + no_show: "No asisti\xF3" + } + }, + owner_id: { label: "Asignado a" }, + start_datetime: { label: "Inicio" }, + end_datetime: { label: "Fin" }, + all_day: { label: "Evento de todo el d\xEDa" }, + duration_minutes: { label: "Duraci\xF3n (minutos)" }, + location: { label: "Ubicaci\xF3n", help: "Sala, direcci\xF3n o enlace de la reuni\xF3n" }, + related_to_type: { + label: "Tipo de registro relacionado", + options: { + crm_account: "Cuenta", + crm_contact: "Contacto", + crm_opportunity: "Oportunidad", + crm_lead: "Prospecto", + crm_case: "Caso" + } + }, + related_to_account: { label: "Cuenta relacionada" }, + related_to_contact: { label: "Contacto relacionado" }, + related_to_opportunity: { label: "Oportunidad relacionada" }, + related_to_lead: { label: "Prospecto relacionado" }, + related_to_case: { label: "Caso relacionado" }, + outcome_notes: { label: "Notas de resultado", help: "Qu\xE9 se acord\xF3 y qu\xE9 sigue" } + }, + _views: { + all_events: { label: "Todos los eventos" }, + event_calendar: { label: "Calendario de eventos" }, + event_timeline: { label: "Agenda del equipo" }, + my_events: { label: "Mi calendario" }, + upcoming_events: { label: "\u{1F4C5} Pr\xF3ximos \xB7 M\xE1s cercanos primero" }, + held_events: { label: "\u2705 Historial de interacciones" } + }, + _sections: { + basic: { label: "Informaci\xF3n del Evento" }, + schedule: { label: "Programaci\xF3n" }, + related: { label: "Registros Relacionados" }, + outcome: { label: "Resultado" }, + // Nombres de sección del formulario en event.view.ts (#1100) + event: { label: "Evento" }, + related_records: { label: "Registros Relacionados" } + } + }, + crm_event_attendee: { + _validations: { + attendee_resolves: { + message: "Un asistente debe indicar la parte que nombra su tipo: el tipo Contacto requiere un contacto y el tipo Externo requiere un nombre de asistente externo" + }, + attendee_type_exclusive: { + message: "Un asistente nombra exactamente una parte: borre las columnas que su tipo de asistente no nombra" + } + }, + label: "Asistente al evento", + pluralLabel: "Asistentes al evento", + description: "Persona invitada o presente en un evento", + fields: { + attendee_number: { label: "N\xFAmero de asistente" }, + crm_event: { label: "Evento" }, + attendee_type: { + label: "Tipo de asistente", + options: { contact: "Contacto", lead: "Prospecto", user: "Usuario", external: "Externo" } + }, + crm_contact: { label: "Contacto", help: "Se rellena cuando el asistente es un contacto de cliente ya existente" }, + crm_lead: { label: "Prospecto", help: "Se rellena cuando el asistente sigue siendo un prospecto sin convertir" }, + sys_user: { label: "Usuario", help: "Se rellena cuando el asistente es un compa\xF1ero de la empresa" }, + external_name: { label: "Asistente externo", help: "Nombre de un asistente que no est\xE1 en ning\xFAn objeto del CRM: se rellena cuando el tipo de asistente es Externo" }, + response: { + label: "Respuesta", + options: { + no_response: "Sin respuesta", + accepted: "Aceptado", + declined: "Rechazado", + tentative: "Tentativo" + } + }, + is_organizer: { label: "Organizador" }, + invited_date: { label: "Invitado el" } + }, + _views: { + all_event_attendees: { label: "Asistentes al evento" } + }, + _sections: { + // El inglés es «Attendee» / «Invitation», no el par + // «Basic Information» / «Response Tracking» de crm_campaign_member. + basic: { label: "Asistente" }, + response: { label: "Invitaci\xF3n" }, + // Nombres de sección del formulario en event_attendee.view.ts (#1100) + attendee: { label: "Asistente" }, + invitation: { label: "Invitaci\xF3n" } + } + } +}; + +// src/sales/translations/es-ES/objects.marketing.ts +var marketing4 = { + crm_campaign: { + _validations: { + end_after_start: { + message: "La fecha de fin debe ser posterior a la de inicio" + }, + actual_cost_within_budget: { + message: "El coste real supera el coste presupuestado" + } + }, + label: "Campa\xF1a", + pluralLabel: "Campa\xF1as", + description: "Campa\xF1as e iniciativas de marketing", + fields: { + campaign_code: { label: "C\xF3digo de Campa\xF1a" }, + display_title: { label: "T\xEDtulo Mostrado" }, + name: { label: "Nombre de Campa\xF1a" }, + description: { label: "Descripci\xF3n" }, + type: { + label: "Tipo de Campa\xF1a", + options: { + email: "Email", + webinar: "Seminario Web", + trade_show: "Feria Comercial", + conference: "Conferencia", + direct_mail: "Correo Postal", + social_media: "Redes Sociales", + content: "Marketing de Contenidos", + partner: "Marketing con Socios" + } + }, + channel: { + label: "Canal Principal", + options: { + digital: "Digital", + social: "Redes Sociales", + email: "Email", + events: "Eventos", + partner: "Socios" + } + }, + status: { + label: "Estado", + options: { + planning: "Planificaci\xF3n", + in_progress: "En Curso", + completed: "Completada", + aborted: "Cancelada" + } + }, + start_date: { label: "Fecha de Inicio" }, + end_date: { label: "Fecha de Fin" }, + budgeted_cost: { label: "Costo Presupuestado" }, + actual_cost: { label: "Costo Real" }, + expected_revenue: { label: "Ingresos Previstos" }, + actual_revenue: { label: "Ingresos Reales" }, + target_size: { label: "Tama\xF1o Objetivo", help: "N\xFAmero objetivo de prospectos/contactos" }, + num_sent: { label: "Cantidad Enviada" }, + num_responses: { label: "N\xFAmero de Respuestas" }, + num_leads: { label: "N\xFAmero de Prospectos" }, + num_converted_leads: { label: "Prospectos Convertidos" }, + num_opportunities: { label: "Oportunidades Creadas" }, + num_won_opportunities: { label: "Oportunidades Ganadas" }, + response_rate: { label: "Tasa de Respuesta %" }, + roi: { label: "ROI %" }, + owner_id: { label: "Propietario de Campa\xF1a" }, + landing_page_url: { label: "P\xE1gina de Aterrizaje" }, + is_active: { label: "Activo" } + }, + _views: { + all_campaigns: { label: "Todas las Campa\xF1as" }, + campaign_gantt: { label: "Programaci\xF3n de Campa\xF1as" }, + campaign_calendar: { label: "Calendario de Campa\xF1as" }, + campaign_timeline: { label: "L\xEDnea de Tiempo de Marketing" } + }, + _sections: { + basic: { label: "Informaci\xF3n de Campa\xF1a" }, + schedule: { label: "Programaci\xF3n" }, + budget: { label: "Presupuesto y ROI" }, + metrics: { label: "Rendimiento" }, + // El inglés de este grupo es «Ownership», no «Assignment»: agrupa al + // propietario de la campaña, igual que `crm_account.ownership`. + assignment: { label: "Propiedad" }, + assets: { label: "Recursos de Campa\xF1a" } + }, + _actions: { + enroll_leads: { + label: "Inscribir Miembros", + successMessage: "Miembros elegibles inscritos en la campa\xF1a." + } + } + }, + crm_campaign_member: { + _validations: { + lead_or_contact_required: { + message: "Un miembro de campa\xF1a debe referenciar un prospecto o un contacto" + } + }, + label: "Miembro de Campa\xF1a", + pluralLabel: "Miembros de Campa\xF1a", + description: "Prospectos y contactos alcanzados por una campa\xF1a, con su estado de respuesta", + fields: { + member_number: { label: "N\xFAmero de Miembro" }, + crm_campaign: { label: "Campa\xF1a" }, + crm_lead: { label: "Prospecto", help: "Se rellena cuando el miembro era un Prospecto en el momento de la inscripci\xF3n" }, + crm_contact: { label: "Contacto", help: "Se rellena cuando el miembro es un Contacto existente" }, + status: { + label: "Estado", + options: { + sent: "Enviado", + responded: "Respondido", + converted: "Convertido", + unsubscribed: "Dado de Baja" + } + }, + added_date: { label: "Fecha de Alta" }, + response_date: { label: "Fecha de Respuesta" }, + has_responded: { label: "Ha Respondido" } + }, + _sections: { + basic: { label: "Informaci\xF3n B\xE1sica" }, + response: { label: "Seguimiento de Respuesta" } + }, + _actions: { + mark_responded: { + label: "Marcar como Respondido", + successMessage: "Respuesta registrada en este miembro de campa\xF1a." + } + } + } +}; + +// src/sales/translations/es-ES.ts +var esES2 = { + objects: { + crm_account: customer4.crm_account, + crm_contact: customer4.crm_contact, + crm_knowledge_article: service4.crm_knowledge_article, + crm_forecast: pipeline4.crm_forecast, + crm_lead: pipeline4.crm_lead, + crm_opportunity: pipeline4.crm_opportunity, + crm_case: service4.crm_case, + crm_contract: commerce4.crm_contract, + crm_product: commerce4.crm_product, + crm_quote: commerce4.crm_quote, + crm_task: activity4.crm_task, + crm_campaign: marketing4.crm_campaign, + crm_event: activity4.crm_event, + crm_event_attendee: activity4.crm_event_attendee, + crm_article_feedback: service4.crm_article_feedback, + crm_campaign_member: marketing4.crm_campaign_member, + crm_opportunity_line_item: pipeline4.crm_opportunity_line_item, + crm_quote_line_item: commerce4.crm_quote_line_item + }, + ...appSurface4 +}; + +// src/sales/translations/crm.translation.ts +var CrmTranslations = { + en: en2, + "zh-CN": zhCN2, + "ja-JP": jaJP2, + "es-ES": esES2 +}; + +// src/sales/views/index.ts +var views_exports = {}; +__export(views_exports, { + AccountViews: () => AccountViews, + ContactViews: () => ContactViews, + EventAttendeeViews: () => EventAttendeeViews, + EventViews: () => EventViews, + ForecastViews: () => ForecastViews, + LeadViews: () => LeadViews, + OpportunityViews: () => OpportunityViews, + TaskViews: () => TaskViews +}); + +// src/sales/views/lead.view.ts +import { P as P24 } from "@objectstack/spec"; +import { defineView as defineView3 } from "@objectstack/spec/ui"; +var DUPLICATE_LINK_FIELDS = [ + { + field: "duplicate_of_type", + required: true, + // The picker offers the AUTHORABLE half of the vocabulary only (#1164). + // `crm_lead.duplicate_of_type` also accepts `erased`, a tombstone + // `lead_duplicate_check` stamps when the engine's reference cleanup nulls + // the pointer — "confirmed duplicate of a record that has since been + // erased". Nobody authors that: it is an observation about a deletion that + // already happened, and offering it would let a reviewer close a lead as a + // duplicate of nothing while satisfying every rule that exists to stop + // exactly that. Narrowing here rather than deleting the value is the point + // — the record can still SAY it, and the field keeps its label in all four + // locales, so a tombstoned lead reads as "Erased Record" on the detail page + // instead of as a raw enum nobody can explain. + // + // Spread from `_picklists.ts` rather than retyped: the authorable set is + // the source both lists derive from, so a future object type added there + // reaches this picker automatically and the tombstone never can. + options: [...DUPLICATE_OF_TYPE_AUTHORABLE_OPTIONS], + visibleOn: P24`has(record.disqualification_reason) && record.disqualification_reason == "duplicate"` + }, + { + field: "duplicate_of_lead", + required: true, + visibleOn: P24`has(record.duplicate_of_type) && record.duplicate_of_type == "crm_lead"` + }, + { + field: "duplicate_of_contact", + required: true, + visibleOn: P24`has(record.duplicate_of_type) && record.duplicate_of_type == "crm_contact"` + }, + { + field: "duplicate_status", + required: true, + visibleOn: P24`has(record.disqualification_reason) && record.disqualification_reason == "duplicate"`, + helpText: "Confirmed means a human checked the two records and they are the same person." + } +]; +var LeadViews = defineView3({ + /** + * Default List View - Grid with Advanced Features + */ + list: { + type: "grid", + name: "all_leads", + label: "All Leads", + userActions: { editInline: true }, + data: { + provider: "object", + object: "crm_lead" + }, + // Column Configuration with Enhanced Features + columns: [ + { + // One name column, not two. Splitting first/last spent 300px to say + // what "Alice Martinez" says in one, and hung the record link off the + // given name alone — so opening a person meant aiming at their first + // name specifically. + field: "full_name", + label: "Name", + width: 200, + sortable: true, + link: true + // Primary navigation link + }, + { + field: "company", + label: "Company", + width: 200, + sortable: true + }, + { + field: "email", + label: "Email", + width: 200 + }, + { + field: "status", + label: "Status", + width: 120, + sortable: true + }, + { + field: "rating", + label: "Score", + width: 100, + align: "center" + }, + { + field: "lead_source", + label: "Source", + width: 120 + }, + // REQ-0005 acceptance 1: what the prospect wants and what it is worth, + // on the roster a rep opens every morning. Columns are also what the + // list's own filter and grouping controls offer, which is what makes the + // two FILTERABLE and GROUPABLE here rather than only readable — the same + // reading `contact.view.ts` records for the buying-centre columns. + // `need_type` is single-valued for exactly that reason (see + // `_picklists.ts`): a grouped list answers with one aggregate per raw + // stored value, so a multi-valued column would group by the combination. + { + field: "need_type", + label: "Need Type", + width: 160, + sortable: true + }, + { + field: "estimated_amount", + label: "Est. Amount", + width: 130, + align: "right", + sortable: true + }, + { + field: "owner_id", + label: "Owner", + width: 150 + } + ], + sort: [ + { field: "created_at", order: "desc" } + ], + // A row click opens the record page. There is deliberately no + // `navigation.view` here: measured in the browser on console 17.3.0 + // (#1716), the key is not resolved as a form-view name. The navigation + // hook reads it into the SECOND argument of `onNavigate` — the slot that + // otherwise carries the literal mode string, `r(t, d ?? 'view')` — so it + // named nothing and selected nothing. The record page here is rendered by + // `lead_detail_page` (`src/sales/pages/lead_detail.page.ts`), not by a named + // form view, and clicking a row behaved identically with the key present, + // with it absent, and on a list that never declared it. `detail_form` + // below stays: it is this file's one TABBED layout example, and it was + // already reachable by no path. + navigation: { + mode: "page" + }, + // `convert_lead` / `schedule_followup` declare `locations: ['list_item']` + // and are auto-injected into the menu. Do not add strings here: the legacy + // rowActions surface only dispatches defined stack actions. + // Built-in `exportOptions` covers CSV export; no export action needed. + bulkActions: ["create_campaign"], + // Features + pagination: { pageSize: 25, pageSizeOptions: [10, 25, 50, 100] }, + rowHeight: "medium", + exportOptions: { formats: ["csv", "xlsx"] }, + // Empty State + emptyState: { + title: "No Leads Yet", + message: "Get started by creating your first lead", + icon: "user-plus" + } + }, + /** + * Default Form View - SIMPLE Layout + * Basic sectioned form with collapsible sections and column layouts + */ + form: { + type: "simple", + sections: [ + { + name: "contact_information", + label: "Contact Information", + collapsible: true, + collapsed: false, + columns: 2, + // 2-column layout + fields: [ + { + field: "salutation" + }, + { + field: "first_name", + required: true + }, + { + field: "last_name", + required: true, + span: "full" + }, + "company", + "title", + "email", + "phone", + "mobile", + "website" + ] + }, + { + name: "lead_classification", + label: "Lead Classification", + collapsible: true, + collapsed: false, + columns: 3, + // 3-column layout + fields: [ + { + field: "status", + required: true + }, + { + field: "rating", + widget: "star_rating" + // Custom widget + }, + "lead_source", + "industry", + // Offered, ⛔ not `required` (#2097): an insert that leaves it empty is + // stamped to the creator by the platform (see `lead.hook.ts`), so a + // rep's new lead is theirs without a pick, and a manager can still + // choose another owner. `required` blocked that save client-side. + "owner_id", + // `disqualification_reason` is enforced by the + // `disqualification_reason_required` validation on crm_lead, so every + // form that lets a user pick "Unqualified" must also offer the reason + // — otherwise the save fails with an error the form gives you no way + // to clear. Hidden until it applies. + { + field: "disqualification_reason", + required: true, + visibleOn: P24`has(record.status) && record.status == "unqualified"` + }, + // REQ-0005 step 6: 「填写…需求类型…预计金额」. A rep types these at + // intake, so they need an authoring surface — and this form IS the + // create dialog (`RecordFormPage` and `useActionModal` both resolve + // `view.form ?? view.formViews?.default`, see `case.view.ts`). + // + // ⚠️ Named rather than reached through a group reference, and the + // AGENTS.md ladder's rung 3 asks for the reason in writing. Both + // fields declare `group: 'qualification'` on the object, so every + // DERIVED surface — the page synthesizer, an auto-derived form — + // already carries them from `fieldGroups` alone with nothing authored. + // This form is not one of those: it authors `sections`, and an + // authored `sections` array wins outright over the auto-derived path. + // The rung-2 fix, a `{ group: 'qualification' }` section, cannot be + // used HERE specifically: this section is a CURATED cross-group set, + // not a mirror of that group. It already names four of the group's + // members with per-field overrides a group reference cannot carry + // (`status` required, `rating`'s star widget, and + // `disqualification_reason`'s `required` + `visibleOn` directly + // above), and it borrows `industry` and `owner_id` from two other + // groups. Adding a group reference beside it would render those four + // a second time and pull in `next_followup_date` / + // `last_contacted_date`, which are machine-written and deliberately + // absent from every form. ⇒ The customer need is real, the group + // reference genuinely cannot express it, and the two lines below are + // what that leaves. + "need_type", + "estimated_amount", + ...DUPLICATE_LINK_FIELDS + ] + }, + { + name: "company_information", + label: "Company Information", + collapsible: true, + collapsed: true, + // Collapsed by default + columns: 2, + fields: [ + "annual_revenue", + "number_of_employees" + ] + }, + { + name: "address", + label: "Address", + collapsible: true, + collapsed: true, + columns: 2, + // `crm_lead` stores the location in one composite `Field.address`; + // the discrete street/city/state/postal_code/country columns this + // section used to list do not exist on the object, so the whole + // section rendered blank. + fields: [ + { + field: "address", + span: "full" + } + ] + }, + { + name: "additional_information", + label: "Additional Information", + collapsible: true, + collapsed: true, + columns: 1, + // Single column for text areas + fields: [ + "description", + "notes" + ] + }, + { + name: "privacy", + label: "Privacy", + collapsible: true, + collapsed: true, + columns: 2, + fields: [ + "do_not_call", + "email_opt_out" + ] + } + ] + }, + /** + * Additional Named List Views + */ + listViews: { + // Declaration order IS tab order in the console. These three working + // queues used to sit AFTER the kanban / calendar / gallery views, which + // pushed all of them into the "3 more" overflow menu — so the one screen + // a rep opens this list for was the one they had to go hunting for, while + // three presentation modes held the front row. + /** + * My Leads — a rep's own queue, hottest first. + */ + my_leads: { + name: "my_leads", + type: "grid", + label: "My Leads", + userActions: { editInline: true }, + data: { + provider: "object", + object: "crm_lead" + }, + columns: ["full_name", "company", "email", "status", "rating"], + filter: [ + { field: "owner_id", operator: "equals", value: "{current_user_id}" } + ], + sort: [ + { field: "rating", order: "desc" }, + { field: "created_at", order: "desc" } + ] + }, + /** + * Hot Leads — the working queue for the leads routing declared HOT. + * + * "Hot" is defined in exactly ONE place: the `lead_assignment` flow's + * `check_hot` decision (edge `e2`, `record.rating >= 4`). Crossing that + * line is what stamps the 1-day follow-up SLA and fires the "Hot lead — + * assign within 24h" alert at the owner, so this queue must hold precisely + * the leads that alert is about. (An earlier comment here credited a + * flagging workflow that has never existed in this repo — dead name + * removed, the routing flow is the producer.) + * + * The cut was `rating >= 4.5` (#766). `rating` is a WHOLE-star field — + * `lead.hook.ts` rounds its computed score ("round to WHOLE stars"), the + * `star_rating` widget offers nothing finer, and the one seeded 4.5 was + * deleted for the same reason (#591) — so `>= 4.5` meant `== 5` on every + * row that can actually exist. A 4-star lead was routed hot, alerted on, + * and then missing from the queue its owner was sent to. + * + * Sharing the population with "High Priority" is the deliberate cost of + * having one definition of hot, not an oversight: both views now show + * rating >= 4, still New or Contacted. What differs is what they are FOR. + * Hot Leads is the work order — sorted by next-follow-up (the SLA that + * routing just stamped), with phone, email and owner on the row so it can + * be dialled top to bottom. High Priority is the scan list — score-tinted + * rows and lead source, no SLA column, no time ordering. A 5-star-only + * queue, if it is ever a real need, gets its own view under its own name + * instead of squatting on "Hot". + * + * `test/hot-lead-threshold-parity.test.ts` derives this threshold and the + * flow's from the metadata and fails if they drift apart again. + */ + hot_leads: { + name: "hot_leads", + type: "grid", + label: "\u{1F525} Hot Leads", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_lead" }, + columns: ["full_name", "company", "phone", "email", "rating", "next_followup_date", "owner_id"], + // Same rating cut as the `lead_assignment` hot branch, scoped to the + // statuses still worth working. (Operator-only filters; the view runtime + // does not resolve date template strings.) + filter: [ + { field: "rating", operator: "greater_than_or_equal", value: 4 }, + { field: "status", operator: "in", value: ["new", "contacted"] } + ], + sort: [{ field: "next_followup_date", order: "asc" }] + }, + /** + * High Priority Leads + */ + high_priority: { + name: "high_priority", + type: "grid", + label: "High Priority", + userActions: { editInline: true }, + data: { + provider: "object", + object: "crm_lead" + }, + columns: ["full_name", "company", "email", "status", "rating", "lead_source"], + filter: [ + { field: "rating", operator: "greater_than_or_equal", value: 4 }, + { field: "status", operator: "in", value: ["new", "contacted"] } + ], + rowColor: { + field: "rating", + colors: { + "5": "green", + "4": "orange" + } + } + }, + /** + * Suspected Duplicates — the review queue behind the intake flag (#598). + * + * `lead_duplicate_check` marks a re-captured email `suspected` and links it + * to the record it repeats. Without a place to SEE that set, the flag would + * be a column nobody reads: the reviewer opens this queue, compares the two + * records, and either clears the flag or disqualifies the lead as a + * confirmed duplicate. `confirmed` rows drop out of the queue, so it drains. + */ + suspected_duplicates: { + name: "suspected_duplicates", + type: "grid", + label: "Suspected Duplicates", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_lead" }, + columns: [ + "full_name", + "company", + "email", + "duplicate_of_type", + "duplicate_of_lead", + "duplicate_of_contact", + "status", + "owner_id" + ], + filter: [ + { field: "duplicate_status", operator: "equals", value: "suspected" } + ], + // Oldest suspicion first: an unreviewed duplicate is a second rep working + // the same person, so the queue is worked front to back. + sort: [{ field: "created_at", order: "asc" }], + emptyState: { + title: "No Suspected Duplicates", + message: "Nothing to review \u2014 every re-captured email has been checked.", + icon: "copy" + } + }, + /** + * Kanban Board View + */ + kanban_by_status: { + name: "kanban_by_status", + type: "kanban", + label: "Lead Pipeline", + data: { + provider: "object", + object: "crm_lead" + }, + columns: ["first_name", "last_name", "company", "email"], + kanban: { + groupByField: "status", + summarizeField: "annual_revenue", + columns: ["first_name", "last_name", "company", "rating"] + }, + navigation: { + mode: "drawer", + // Open in drawer instead of new page + width: "600px" + } + }, + /** + * Calendar View + */ + calendar_by_created: { + name: "calendar_by_created", + type: "calendar", + label: "Lead Calendar", + data: { + provider: "object", + object: "crm_lead" + }, + columns: ["first_name", "last_name", "company"], + calendar: { + startDateField: "created_at", + titleField: "company", + colorField: "status" + } + }, + /** + * Gallery/Card View + */ + gallery_view: { + name: "gallery_view", + type: "gallery", + label: "Lead Cards", + data: { + provider: "object", + object: "crm_lead" + }, + columns: ["first_name", "last_name", "company", "email", "status"], + gallery: { + cardSize: "medium", + titleField: "company", + visibleFields: ["first_name", "last_name", "email", "phone", "status", "rating"] + } + } + }, + /** + * Additional Named Form Views - Demonstrating All 6 Layout Types + * + * One example per layout type. The SIMPLE one is the default `form` + * above, so this block carries the other five, plus the public and the + * conditional-visibility examples. Every layout is demonstrated exactly + * once across the file: each entry below is the only example of its own. + */ + formViews: { + /** + * 2. TABBED Layout + * Organize complex forms with tabs + */ + detail_form: { + type: "tabbed", + sections: [ + { + name: "general", + label: "General", + columns: 2, + fields: [ + "salutation", + "first_name", + "last_name", + "company", + "title", + "email", + "phone", + "mobile" + ] + }, + { + name: "qualification", + label: "Qualification", + columns: 2, + fields: [ + { field: "status", required: true }, + { field: "rating", widget: "star_rating" }, + "lead_source", + "industry", + "annual_revenue", + "number_of_employees", + // See the default form: `unqualified` requires a reason. + { + field: "disqualification_reason", + required: true, + visibleOn: P24`has(record.status) && record.status == "unqualified"` + }, + ...DUPLICATE_LINK_FIELDS + ] + }, + { + name: "address", + label: "Address", + columns: 2, + // Single composite `Field.address` — see the note on the default + // form's Address section. + fields: [ + { field: "address", span: "full" } + ] + }, + { + name: "details", + label: "Details", + columns: 1, + fields: [ + "description", + "notes", + "do_not_call", + "email_opt_out" + ] + } + ] + }, + /** + * 3. WIZARD Layout + * Step-by-step guided process + */ + lead_conversion_wizard: { + type: "wizard", + data: { + provider: "object", + object: "crm_lead" + }, + sections: [ + { + name: "step_1_contact_details", + label: "Step 1: Contact Details", + columns: 2, + fields: [ + { field: "first_name", required: true, readonly: true }, + { field: "last_name", required: true, readonly: true }, + { field: "email", readonly: true, span: "full" }, + "phone", + "mobile" + ] + }, + { + name: "step_2_company_information", + label: "Step 2: Company Information", + columns: 2, + fields: [ + { field: "company", required: true, readonly: true }, + "title", + "industry", + "annual_revenue", + "number_of_employees", + "website" + ] + }, + { + name: "step_3_qualification", + label: "Step 3: Qualification", + columns: 2, + fields: [ + { field: "status", required: true }, + // See the default form: `unqualified` requires a reason. The status + // is editable in this step, so the wizard can land there too. + { + field: "disqualification_reason", + required: true, + visibleOn: P24`has(record.status) && record.status == "unqualified"` + }, + ...DUPLICATE_LINK_FIELDS, + { field: "rating", widget: "star_rating" }, + "lead_source", + { + field: "owner_id", + // Conditional visibility. `!= null` on top of `has(...)`: strict + // CEL aborts on `dyn < int`, which `has()` alone allows. + visibleOn: P24`has(record.rating) && record.rating != null && record.rating >= 4` + } + ] + }, + { + name: "step_4_review_and_convert", + label: "Step 4: Review & Convert", + columns: 1, + fields: [ + { + field: "description", + helpText: "Review all information before converting to Account and Contact" + } + ] + } + ] + }, + /** + * 4. SPLIT Layout + * Master-detail split view + */ + split_edit: { + type: "split", + data: { + provider: "object", + object: "crm_lead" + }, + sections: [ + { + name: "primary_information", + label: "Primary Information", + columns: 1, + fields: [ + "first_name", + "last_name", + "company", + "email", + { field: "status", required: true }, + "owner_id", + // See the default form: `unqualified` requires a reason. + { + field: "disqualification_reason", + required: true, + visibleOn: P24`has(record.status) && record.status == "unqualified"` + }, + ...DUPLICATE_LINK_FIELDS + ] + }, + { + name: "extended_details", + label: "Extended Details", + columns: 2, + fields: [ + "phone", + "mobile", + "title", + "industry", + "lead_source", + { field: "rating", widget: "star_rating" }, + "annual_revenue", + "number_of_employees" + ] + } + ] + }, + /** + * 5. DRAWER Layout + * Side panel form (typically opened from list view) + */ + quick_edit_drawer: { + type: "drawer", + data: { + provider: "object", + object: "crm_lead" + }, + sections: [ + { + name: "quick_edit", + label: "Quick Edit", + columns: 1, + // Drawers typically use single column + fields: [ + { field: "first_name", required: true }, + { field: "last_name", required: true }, + "company", + "email", + "phone", + { field: "status", required: true }, + { field: "rating", widget: "star_rating" }, + "lead_source", + { + field: "owner_id", + // Only show owner after initial contact. A record with no status + // yet has not been contacted, so `!isBlank` keeps the blank case + // on the "hidden" side rather than letting `null != "new"` show it. + visibleOn: P24`has(record.status) && !isBlank(record.status) && record.status != "new"` + }, + // See the default form: `unqualified` requires a reason. + { + field: "disqualification_reason", + required: true, + visibleOn: P24`has(record.status) && record.status == "unqualified"` + }, + ...DUPLICATE_LINK_FIELDS + ] + } + ] + }, + /** + * 6. MODAL Layout + * Dialog-based form for quick actions + */ + status_update_modal: { + type: "modal", + data: { + provider: "object", + object: "crm_lead" + }, + sections: [ + { + name: "update_lead_status", + label: "Update Lead Status", + columns: 1, + fields: [ + { field: "first_name", readonly: true }, + { field: "last_name", readonly: true }, + { field: "company", readonly: true }, + { + field: "status", + required: true, + helpText: "Select the new status for this lead" + }, + { + field: "rating", + widget: "star_rating", + // Only show rating for qualified leads + visibleOn: P24`has(record.status) && record.status == "qualified"` + }, + // The reason picklist, not just free-text notes: it is what the + // `disqualification_reason_required` validation checks, and this + // modal is the main place a rep flips a lead to Unqualified. + { + field: "disqualification_reason", + required: true, + visibleOn: P24`has(record.status) && record.status == "unqualified"` + }, + ...DUPLICATE_LINK_FIELDS, + { + field: "notes", + placeholder: "Add notes about this status change", + // Free-text context alongside the reason + visibleOn: P24`has(record.status) && record.status == "unqualified"` + } + ] + } + ] + }, + /** + * 7. PUBLIC / ANONYMOUS — "Web-to-Lead" + * + * Airtable-style public form hosted at `/forms/contact-us`. Embeddable + * via iframe on a marketing site. Guests can ONLY submit (insert) — the + * `guest_portal` profile denies read/edit/delete on `crm_lead`. + * + * Fields not on the form (status, lead_source, owner_id, rating) are stamped + * by the `lead_automation` hook in `lead.hook.ts` after a guest submission. + */ + web_to_lead: { + type: "simple", + data: { + provider: "object", + object: "crm_lead" + }, + sections: [ + { + name: "tell_us_about_yourself", + label: "Tell us about yourself", + columns: 2, + fields: [ + { field: "first_name", required: true }, + { field: "last_name", required: true }, + { field: "email", required: true, span: "full" }, + "phone", + "title" + ] + }, + { + name: "about_your_company", + label: "About your company", + columns: 2, + fields: [ + { field: "company", required: true, span: "full" }, + "website", + "industry", + "number_of_employees", + "annual_revenue" + ] + }, + { + name: "how_can_we_help", + label: "How can we help?", + columns: 1, + fields: [ + { + field: "description", + required: true, + placeholder: "Briefly describe what you are looking for...", + helpText: "A sales representative will get back to you within one business day." + } + ] + } + ], + sharing: { + enabled: true, + allowAnonymous: true, + publicLink: "/forms/contact-us" + } + }, + /** + * Advanced Example: Conditional Field Visibility & Dependencies + */ + advanced_conditional: { + type: "simple", + data: { + provider: "object", + object: "crm_lead" + }, + sections: [ + { + name: "lead_information", + label: "Lead Information", + columns: 2, + fields: [ + "first_name", + "last_name", + "company", + "email", + "status", + "lead_source", + { + field: "rating", + widget: "star_rating", + // Only show after first contact — see the drawer form's note on + // why blank stays on the "hidden" side. + visibleOn: P24`has(record.status) && !isBlank(record.status) && record.status != "new"` + }, + { + field: "industry", + dependsOn: "company" + // Industry options depend on company + }, + { + field: "annual_revenue", + // Only for qualified leads + visibleOn: P24`has(record.rating) && record.rating != null && record.rating >= 3` + }, + { + field: "number_of_employees", + visibleOn: P24`has(record.rating) && record.rating != null && record.rating >= 3` + }, + { + field: "owner_id", + required: true, + visibleOn: P24`has(record.status) && (record.status == "contacted" || record.status == "qualified")` + }, + // See the default form: `unqualified` requires a reason. + { + field: "disqualification_reason", + required: true, + visibleOn: P24`has(record.status) && record.status == "unqualified"` + }, + ...DUPLICATE_LINK_FIELDS, + { + field: "notes", + span: "full", + required: true, + // Require explanation for unqualified + visibleOn: P24`has(record.status) && record.status == "unqualified"` + } + ] + }, + { + name: "address_information", + label: "Address Information", + collapsible: true, + collapsed: true, + columns: 2, + // Single composite `Field.address` — the discrete street/city/state/ + // postal_code/country columns do not exist on crm_lead. + fields: [ + { field: "address", span: "full" } + ] + }, + { + name: "privacy_preferences", + label: "Privacy Preferences", + collapsible: true, + collapsed: true, + columns: 2, + fields: [ + { + field: "do_not_call", + helpText: "Check if this lead has requested not to be called" + }, + { + field: "email_opt_out", + helpText: "Check if this lead has opted out of email communications" + } + ] + } + ] + } + } +}); + +// src/sales/views/account.view.ts +import { defineView as defineView4 } from "@objectstack/spec/ui"; +var AccountViews = defineView4({ + list: { + type: "grid", + name: "all_accounts", + label: "All Accounts", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_account" }, + columns: [ + { field: "name", width: 240, sortable: true, link: true, pinned: "left" }, + { field: "industry", width: 140, sortable: true }, + { field: "type", width: 130 }, + { field: "annual_revenue", width: 160, align: "right", summary: "sum" }, + { field: "number_of_employees", width: 130, align: "right", summary: "avg" }, + { field: "health_score", width: 140 } + ], + sort: [{ field: "annual_revenue", order: "desc" }], + rowColor: { field: "is_active", colors: { true: "green", false: "slate" } }, + selection: { type: "multiple" }, + pagination: { pageSize: 50, pageSizeOptions: [25, 50, 100] }, + exportOptions: { formats: ["csv", "xlsx"] }, + compactToolbar: true, + bulkActionDefs: [ + { + name: "update_tier", + label: "Update Tier", + icon: "tag", + operation: "update", + params: [ + { + name: "tier", + label: "Customer Tier", + type: "select", + required: true, + options: [ + { label: "Strategic", value: "strategic" }, + { label: "Enterprise", value: "enterprise" }, + { label: "Mid-Market", value: "mid_market" }, + { label: "SMB", value: "smb" } + ] + } + ], + confirmText: "Update tier on {{count}} account(s) to {{tier}}?" + }, + { + name: "transfer_owner", + label: "Transfer Owner", + icon: "user-check", + operation: "update", + params: [ + { + name: "owner_id", + label: "New Owner", + type: "lookup", + // The platform registers `sys_user` — `user` matches no object and + // rendered an empty picker. + object: "sys_user", + required: true + } + ], + confirmText: "Transfer ownership of {{count}} account(s)?" + }, + { + name: "delete", + label: "Delete", + icon: "trash-2", + variant: "danger", + operation: "delete", + confirmText: "Permanently delete {{count}} account(s)? This cannot be undone.", + confirmLabel: "Delete" + } + ], + appearance: { + showDescription: true, + allowedVisualizations: ["grid", "gallery", "map"] + } + }, + listViews: { + /** Branded account cards */ + account_gallery: { + name: "account_gallery", + type: "gallery", + label: "Account Cards", + data: { provider: "object", object: "crm_account" }, + // `logo` rides in the projection for the same reason the timeline view + // carries its date fields: the list data source projects the configured + // columns, and `coverField` reads off that projection. + columns: ["name", "industry", "annual_revenue", "phone", "logo"], + gallery: { + // The card art this view was named for. "Branded account cards" had a + // brand COLOUR and no brand IMAGE — `crm_account.logo` is the object's + // only image field and nothing displayed it, so every card drew the + // same blank cover. `coverFit` is left unstated: the schema's default + // is the crop these cards want, and materialising a default rewrites + // "the author said nothing" into "the author asked for this". + coverField: "logo", + cardSize: "medium", + titleField: "name", + visibleFields: ["industry", "annual_revenue", "number_of_employees", "phone", "website", "owner_id"] + } + }, + /** + * Geospatial distribution. + * + * The `map` block is what BINDS the view to a coordinate source. Without it + * the renderer falls back to literal default field names, which resolve on + * `crm_account` only by luck — the view draws no marker while authoring + * reports success (`view/layout-without-binding`). `office_location` is the + * object's `Field.location(...)`, which is the one field on `crm_account` + * carrying coordinates; `billing_address` is an `address` field and is a + * postal shape, not a coordinate one, so it stays a column rather than the + * binding. `titleField` names the marker label — `name`, not the object's + * `nameField` (`display_title`), because the map's own `columns` show + * `name` and the two should agree. + */ + account_map: { + name: "account_map", + type: "map", + label: "Accounts by Location", + data: { provider: "object", object: "crm_account" }, + columns: ["name", "industry", "office_location", "billing_address"], + map: { locationField: "office_location", titleField: "name" } + }, + /** Tier accounts: Enterprise (>= $10M ARR) */ + enterprise_accounts: { + name: "enterprise_accounts", + type: "grid", + label: "Enterprise Accounts", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_account" }, + columns: ["name", "industry", "annual_revenue", "number_of_employees", "owner_id"], + filter: [{ field: "annual_revenue", operator: "greater_than_or_equal", value: 1e7 }], + sort: [{ field: "annual_revenue", order: "desc" }], + // ADR-0047 end-user quick filters (Airtable "User filters", Elements: + // dropdowns). `element: 'dropdown'`, deliberately — on an object list + // the view SWITCHER owns the tab bar (it builds one entry per `list` / + // `listViews` descriptor), so a quick-filter block shaped as tabs is + // dropped there: the console logs `defines userFilters (element: + // "tabs"), which are ignored on an object list view (ADR-0047 "views" + // mode — the view switcher owns the tab bar here)` and renders nothing. + // Dropdowns sit beside the switcher and are unaffected. + // `owner_id` is the platform ownership lookup (#548) — it renders as a + // record-picker dropdown. + // NOTE: requires @objectstack/spec > 9.2.0 (ADR-0047 UserFiltersSchema); + // on older specs defineStack strips this block — harmless no-op. + ...{ + userFilters: { + element: "dropdown", + fields: [ + { field: "industry", showCount: true }, + { field: "type" }, + { field: "owner_id" } + ] + } + // typed via spread-as-any until @objectstack/spec ships ADR-0047 + // (UserFiltersSchema is in framework main, > 9.2.0) + } + }, + my_accounts: { + name: "my_accounts", + type: "grid", + label: "My Accounts", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_account" }, + columns: ["name", "industry", "annual_revenue", "phone", "last_activity_date"], + filter: [{ field: "owner_id", operator: "equals", value: "{current_user_id}" }], + sort: [{ field: "last_activity_date", order: "desc" }] + }, + // The `renewals_due` view is gone with the fields it was built on (#1181): + // both its `is_not_null` filter and its sort key were + // `crm_account.next_renewal_date`, so the view could not outlive the field. + // Nothing is lost — `crm_contract` ships the renewals queue that the daily + // sweep actually acts on (`renewal_calendar`, over `end_date`). + /** At-risk customers — CSM action queue */ + at_risk_accounts: { + name: "at_risk_accounts", + type: "grid", + label: "\u26A0\uFE0F At-Risk Accounts", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_account" }, + columns: ["name", "tier", "health_score", "segment", "last_activity_date"], + filter: [ + { field: "type", operator: "equals", value: "customer" }, + { field: "health_score", operator: "in", value: ["at_risk", "churning"] } + ], + sort: [{ field: "health_score", order: "desc" }] + } + }, + form: { + type: "tabbed", + sections: [ + { + name: "profile", + label: "Profile", + columns: 2, + fields: [ + { field: "name", required: true, span: "full" }, + "account_number", + // `type` (prospect / customer / partner …) drives the Renewals and + // At-Risk views' `type = customer` filter — with no form field it + // could never be set, so those views matched nothing. + "type", + "industry", + "phone", + "website", + "owner_id", + "parent_account", + "is_active", + "brand_color", + // The other half of the `branding` group. Without a form field there + // is no upload control anywhere in the app, so the logo the gallery + // cards now cover with could never have been set. Full span: an + // image drop target in a half-width cell is a thumbnail-sized one. + { field: "logo", span: "full" } + ] + }, + { + // `child_account_revenue` is a roll-up the engine maintains, so it is + // read-only on the form by construction — it is here because a hierarchy + // nobody can see the effect of is the decoration this field replaced. + name: "financials", + label: "Financials", + columns: 2, + fields: ["annual_revenue", "number_of_employees", "child_account_revenue"] + }, + { + // The customer-success fields the at_risk_accounts view lists and + // filters on. They existed on the object but no form offered them, so + // the CS working queue stayed permanently empty. (`renewal_owner` and + // `next_renewal_date` were removed from this section with the fields + // themselves — #1181.) + name: "customer_success", + label: "Customer Success", + columns: 2, + fields: ["tier", "segment", "health_score"] + }, + { + name: "locations", + label: "Locations", + columns: 1, + // `billing_country` and `territory` are readonly and derived, but both + // are on the form on purpose: an admin asking "why does the NA team not + // see this account?" reads the answer off the record instead of + // guessing at the address blob (#621). `territory` is what the rules + // actually match (#639) and `billing_country` is the input it was + // classified from, so the two together show the whole derivation — + // including the case the picklist alone cannot explain, an account + // sitting in `Other` because its country was typed in a spelling the + // mapping does not know. + fields: ["billing_address", "billing_country", "territory", "office_location"] + }, + { + name: "description", + label: "Description", + columns: 1, + fields: ["description"] + } + ] + } +}); + +// src/sales/views/contact.view.ts +import { defineView as defineView5 } from "@objectstack/spec/ui"; +var ContactViews = defineView5({ + list: { + type: "grid", + name: "all_contacts", + label: "All Contacts", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_contact" }, + columns: [ + { field: "avatar", width: 64, align: "center" }, + { field: "first_name", width: 140, sortable: true, link: true }, + { field: "last_name", width: 140, sortable: true }, + { field: "crm_account", width: 200 }, + { field: "title", width: 180 }, + { field: "department", width: 140 }, + // REQ-0004 acceptance 2: the three buying-centre attributes are columns + // on the landing roster, which is already grouped by account with the + // groups collapsed — so expanding one account reads as a MAP (who + // decides, who is on our side) instead of a directory. Columns are also + // what the list's own filter and grouping controls offer. + { field: "buying_function", width: 160 }, + { field: "attitude", width: 140 }, + { field: "relationship_strength", width: 180 }, + { field: "email", width: 220 }, + { field: "phone", width: 150 }, + { field: "owner_id", width: 150 } + ], + sort: [{ field: "last_name", order: "asc" }], + grouping: { fields: [{ field: "crm_account", order: "asc", collapsed: true }] }, + selection: { type: "multiple" }, + // The selection-bar entry point for campaigning at existing customers + // (#597), mirroring `bulkActions: ['create_campaign']` on the lead grid. + // The bare-string form fans the action out once per selected row; do not + // add strings for `mark_primary` / `send_email`, which declare + // `locations: ['list_item']` and are auto-injected into the row menu. + bulkActions: ["add_contact_to_campaign"], + pagination: { pageSize: 50, pageSizeOptions: [25, 50, 100] }, + exportOptions: { formats: ["csv", "xlsx"] }, + appearance: { + showDescription: true, + allowedVisualizations: ["grid", "gallery"] + } + }, + listViews: { + /** People directory */ + contact_directory: { + name: "contact_directory", + type: "gallery", + label: "People Directory", + data: { provider: "object", object: "crm_contact" }, + columns: ["first_name", "last_name", "title", "email"], + gallery: { + coverField: "avatar", + coverFit: "cover", + cardSize: "small", + titleField: "last_name", + visibleFields: ["first_name", "title", "department", "email", "phone", "crm_account"] + } + }, + primary_contacts: { + name: "primary_contacts", + type: "grid", + label: "Primary Contacts", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_contact" }, + columns: ["first_name", "last_name", "crm_account", "title", "email", "phone"], + filter: [{ field: "is_primary", operator: "equals", value: true }], + sort: [{ field: "crm_account", order: "asc" }] + } + }, + form: { + type: "tabbed", + sections: [ + { + name: "identity", + label: "Identity", + columns: 2, + fields: [ + "salutation", + { field: "first_name", required: true }, + { field: "last_name", required: true, span: "full" }, + { field: "crm_account", required: true }, + "title", + "department", + "owner_id" + ] + }, + { + // REQ-0004 acceptance 1: the buying-centre group is rendered FROM + // `fieldGroups`, with no per-field enumeration authored anywhere. + // + // This form authors `sections`, and an authored `sections` array wins + // outright over the renderer's `fieldGroups` auto-derivation (the + // mechanism is written up at length in `case.view.ts`), so a group + // declared on the object alone would reach the SYNTHESIZED detail + // page and never this form — which is also the create dialog. The + // group-reference form is rung 2 of the AGENTS.md ladder, for exactly + // this "partial arrangement is genuinely needed" case: `group:` + // inherits the object's `buying_centre` members (every field pointing + // at it, in declaration order) and its presentation, so adding a + // fourth attribute to the group later reaches this form by itself. + // + // ⛔ `group:` is mutually exclusive with `fields:` and with every key + // the group itself declares (`name`, `label`, `description`, + // `visibleWhen`, `collapsible`/`collapsed: true`) — `columns` is not + // one of those, because the group declares nothing about layout. + group: "buying_centre", + columns: 2 + }, + { + // Named `contact_details`, not `contact_info` — `contact_info` is + // already a distinct fieldGroup key on `crm_contact` ("Contact + // Information"), and reusing it here would make this section's + // translated heading follow that group's wording instead of its own + // "Contact Info". + name: "contact_details", + label: "Contact Info", + columns: 2, + fields: ["email", "phone", "mobile", "avatar"] + }, + { + // Named `mailing_address` — deliberately the SAME key as the + // `mailing_address` fieldGroup on `crm_contact`, which is the opposite + // call from the two sections either side of it and for the same + // reason. Reusing a group key makes the section's translated heading + // follow that group's wording; `contact_details` and + // `comm_preferences` wanted their own shorter wording, so they had to + // avoid the collision. This section wants exactly the group's wording + // ("Mailing Address"), which every locale already carries under + // `objects.crm_contact._sections.mailing_address`, so the collision is + // the feature: one heading, one translation, four locales, no new row. + // + // Why the section exists at all: an authored `sections` array wins + // outright over the renderer's `fieldGroups` auto-derivation (the + // mechanism is written up at length in `case.view.ts`), and this form + // is also the CREATE dialog. Without this section the address was + // readable on the SYNTHESIZED detail page — which does derive from + // `fieldGroups` — while no form in the app could enter or edit it, + // even though `contact_import.mapping.ts` writes it from the shipped + // CSV template. This tab is the authoring half of the import path. + name: "mailing_address", + label: "Mailing Address", + columns: 2, + fields: [ + // One structured `address` field; full width, so its parts lay out + // as a unit rather than in half a grid column. + { field: "mailing_address", span: "full" } + ] + }, + { + // Named `comm_preferences`, not `preferences` — `preferences` is + // already a distinct fieldGroup key on `crm_contact` ("Communication + // Preferences"), and reusing it here would make this section's + // translated heading follow that group's wording instead of its own + // "Preferences". + name: "comm_preferences", + label: "Preferences", + columns: 2, + fields: ["lead_source", "is_primary", "do_not_call", "email_opt_out"] + } + ] + } +}); + +// src/sales/views/opportunity.view.ts +import { defineView as defineView6 } from "@objectstack/spec/ui"; +var OpportunityViews = defineView6({ + // The landing view is OPEN deals, not every deal ever recorded. + // + // Sorted by close_date ascending and unfiltered, "All Opportunities" opened + // on settled history: the first screen was 7 closed-won and 4 closed-lost + // records, and a rep had to scroll past months of finished business to reach + // anything they could still act on. The full unfiltered list is still one + // click away on the "All Opportunities" tab. + list: { + type: "grid", + name: "open_opportunities", + label: "Open Deals", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_opportunity" }, + filter: [ + { field: "stage", operator: "not_in", value: ["closed_won", "closed_lost"] } + ], + columns: [ + { field: "name", width: 220, sortable: true, link: true }, + { field: "crm_account", label: "Account", width: 180 }, + { field: "stage", width: 140, sortable: true }, + { field: "amount", width: 140, align: "right", sortable: true, summary: "sum" }, + { field: "probability", width: 110, align: "right" }, + { field: "expected_revenue", width: 160, align: "right", summary: "sum" }, + { field: "close_date", width: 140, sortable: true } + ], + sort: [{ field: "close_date", order: "asc" }], + rowColor: { + field: "stage", + colors: { + prospecting: "slate", + qualification: "sky", + // Teal sits between the cool qualification blue and the warm proposal + // amber, keeping the cool→warm funnel ramp readable. NOT the gold + // `#FFD700` this option carries in `_picklists.ts`: gold is one hue + // step from proposal's amber, so the two adjacent stages would tint + // rows the same. + // + // Values are colour NAMES, not hex: objectui's `useRowColor` resolves + // only a name from its own vocabulary (or a full `bg-*` class) and + // turns a hex into no colour at all — so until 17.6.0's lint said so, + // this map tinted nothing. + needs_analysis: "teal", + proposal: "amber", + negotiation: "purple", + closed_won: "green", + closed_lost: "red" + } + }, + pagination: { pageSize: 25, pageSizeOptions: [25, 50, 100] }, + selection: { type: "multiple" }, + showRecordCount: true, + exportOptions: { formats: ["csv", "xlsx"] }, + appearance: { + showDescription: true, + allowedVisualizations: ["grid", "kanban", "calendar", "timeline", "gallery"] + }, + // Binds the 'calendar' entry above: the same forecast dates the dedicated + // `close_date_calendar` view shows, on the field this list sorts by. + // `close_date` is required + notNull on crm_opportunity. + calendar: { + startDateField: "close_date", + titleField: "name", + colorField: "stage" + }, + // List-level entry points: generate_quote reaches the row menu via its + // own `locations: ['list_item']`. Built-in `exportOptions` covers CSV + // export. + // + // `mass_update_stage` is wired as an AGGREGATE bulk def, not as a bare + // `bulkActions: ['mass_update_stage']` string (#508). The two forms are + // different dispatch contracts, and only this one moves a whole selection: + // + // - bare string → per-record fan-out: the action is dispatched ONCE PER + // selected row with `recordId` set. N requests, N stage moves. + // - aggregate def → ONE dispatch for the whole selection, carrying every + // id in the builtin `params._selectedIds` and no `recordId`. One + // request, N stage moves, one audit entry. + // + // Aggregate is the right shape here because the body already loops over the + // selection itself, and because the run is all-or-nothing: a partial result + // rejects instead of leaving the bar reporting per-row success it cannot + // honour (see the body in `src/sales/actions/opportunity.actions.ts`). + // + // `execution: 'aggregate'` is REQUIRED on an `operation: 'custom'` def and + // is not boilerplate: a custom def without it has no dispatcher, so the + // button ticks green once per row and does nothing at all. The spec refuses + // that shape at parse time (#4457) — which is also what makes this + // declaration safe to trust rather than merely present. + // + // History: this list carried the bare-string form until #588 removed it as + // a silent no-op, and the removal was read as "the platform cannot deliver + // a selection" for two release candidates. It could: the channel is + // `params._selectedIds`, the underscore is load-bearing, and nothing was + // injecting it precisely BECAUSE this declaration was gone + // (objectstack-ai/objectstack#5568, closed works-as-declared). + // + // The def deliberately carries only the three keys that choose the dispatch + // contract. Label, icon, params (the New Stage picker) and `visible` are + // promoted from the action itself by the renderer, so the dialog and the + // toolbar button cannot drift apart — and the label stays i18n-resolved, + // which an inline `label:` here would not be. + bulkActionDefs: [ + { name: "mass_update_stage", operation: "custom", execution: "aggregate" } + ] + }, + listViews: { + /** + * All Opportunities — the unfiltered book, including closed business. + * + * Demoted from the landing view (see the note on `list` above) but kept + * whole: reporting, audits and win/loss reviews all need the closed rows, + * and a manager reaches this in one click. + */ + all_opportunities: { + name: "all_opportunities", + type: "grid", + label: "All Opportunities", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_opportunity" }, + columns: [ + { field: "name", width: 220, sortable: true, link: true }, + { field: "crm_account", label: "Account", width: 180 }, + { field: "stage", width: 140, sortable: true }, + { field: "amount", width: 140, align: "right", sortable: true, summary: "sum" }, + { field: "probability", width: 110, align: "right" }, + { field: "expected_revenue", width: 160, align: "right", summary: "sum" }, + { field: "close_date", width: 140, sortable: true }, + { field: "owner_id", width: 150 } + ], + sort: [{ field: "close_date", order: "desc" }], + showRecordCount: true + }, + /** Drag-and-drop sales pipeline */ + pipeline_kanban: { + name: "pipeline_kanban", + type: "kanban", + label: "Sales Pipeline", + data: { provider: "object", object: "crm_opportunity" }, + columns: ["name", "crm_account", "amount", "close_date", "owner_id"], + kanban: { + groupByField: "stage", + summarizeField: "amount", + columns: ["name", "crm_account", "amount", "close_date"] + }, + // The board is the active working pipeline. Closed business remains in + // the full book and the dashboard, while excluding it here keeps all + // five active stages visible at a presentation-friendly width. + filter: [{ field: "stage", operator: "not_in", value: ["closed_won", "closed_lost"] }], + sort: [{ field: "close_date", order: "asc" }], + navigation: { mode: "drawer", width: "640px" } + }, + /** Close-date forecasting calendar */ + close_date_calendar: { + name: "close_date_calendar", + type: "calendar", + label: "Forecast Calendar", + data: { provider: "object", object: "crm_opportunity" }, + columns: ["name", "amount", "stage", "owner_id"], + calendar: { + startDateField: "close_date", + titleField: "name", + colorField: "stage" + } + }, + /** Chronological deal flow */ + deal_timeline: { + name: "deal_timeline", + type: "timeline", + label: "Deal Timeline", + data: { provider: "object", object: "crm_opportunity" }, + columns: ["name", "crm_account", "amount"], + timeline: { + // `created_at`, the platform's own creation stamp — the object's + // duplicate `created_date` was removed in #575 B2 because nothing ever + // wrote it, so this timeline started every bar at null. Same spelling + // as the lead activity calendar. + startDateField: "created_at", + endDateField: "close_date", + titleField: "name", + groupByField: "owner_id", + colorField: "stage", + scale: "month" + } + }, + /** Executive review cards */ + deal_gallery: { + name: "deal_gallery", + type: "gallery", + label: "Deal Cards", + data: { provider: "object", object: "crm_opportunity" }, + columns: ["name", "crm_account", "amount", "stage", "close_date"], + gallery: { + cardSize: "medium", + titleField: "name", + visibleFields: ["crm_account", "amount", "stage", "probability", "close_date", "owner_id"] + } + }, + /** Personal pipeline */ + my_open_deals: { + name: "my_open_deals", + type: "grid", + label: "My Open Deals", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_opportunity" }, + columns: ["name", "crm_account", "stage", "amount", "close_date"], + // "Open" has to exclude BOTH closed stages. Excluding only closed_won + // meant a rep's own queue opened on their lost deals, sorted to the top + // by close_date — the least actionable rows in the system. + filter: [ + { field: "owner_id", operator: "equals", value: "{current_user_id}" }, + { field: "stage", operator: "not_in", value: ["closed_won", "closed_lost"] } + ], + sort: [{ field: "close_date", order: "asc" }] + }, + /** Stale Opportunities — still-open deals, longest-parked first */ + stale_opportunities: { + name: "stale_opportunities", + type: "grid", + // Honest label: this view does not apply the 14-day cut its automation + // twin (`opportunity_stagnation`, STALE_THRESHOLD_DAYS = 14) uses, and + // does not claim to. Two independent reasons were recorded for that; one + // still holds and one has expired, so they are separated here. + // + // STILL TRUE — `days_in_stage` is a FORMULA (#489), evaluated in JS after + // the query, so the data engine can neither filter nor sort on it. Any + // filter phrased in terms of `days_in_stage` remains impossible. + // + // EXPIRED (#744) — the second reason said the list data path resolves no + // date macros, so `stage_entry_date < {14_days_ago}` would ship the token + // as a literal and invert the comparison lexicographically ('2026-…' sorts + // below '{', so every row matched). That was measured on @objectstack + // 16.1.0 and stopped being true at 17.0.0-rc.0, when `resolveFilterTokens()` + // was wired into the ObjectQL read path (objectql #3582). `{14_days_ago}` + // is a first-class vocabulary member — it matches the parameterised + // grammar `DATE_MACRO_PARAM_RE`, `{N_(minutes|hours|days|weeks|months| + // years)_(ago|from_now)}` — and it reaches the driver already substituted + // for an ISO date. Measured on 17.0.0-rc.2, RE-MEASURED 2026-09-03 on + // 17.2.0 (#1467), RE-RUN on 17.3.0 (#1676, after the PR #1577 bump) and + // RE-RUN again on 17.4.0 (#1883, after the PR #1814 bump; not yet on + // 17.5.0), unchanged at every taking: over four rows parked + // 30d / 15d / 13d / 1d, `stage_entry_date < {14_days_ago}` returned the + // 30d and 15d rows — the same two the equivalent day-start literal + // returns, and not all four, which is what an unsubstituted token would + // have matched. It is the same seam + // `closing_this_quarter` — the very next view in this file — relies on, + // pinned against a real engine in + // `test/forecast-current-quarter-view.test.ts`. + // + // Correcting that half of the comment does not decide anything about the + // filter, and is deliberately not a licence to change it: expressing the + // cut as `stage_entry_date <= {14_days_ago}` would drop `days_in_stage` + // from the question entirely and change which rows this view returns — + // hiding today's 13-day-old deals from a manager's queue. That is a + // BEHAVIOUR change with its own issue (#770), where the open question is + // whether this queue should be a cut or a ranking at all — this label + // promises a ranking and honours it. `stale_articles` in + // `src/views/knowledge_article.view.ts` carried the same expired premise + // and was corrected in the same pass (#769); that tab was then DELETED + // outright (#781, the review queue ruled out of the product), so it is no + // longer a comparison available in this tree — the surviving precedent + // for "ranking, not cut" is this view. Nothing below was touched. + // + // As shipped: operator-only filter, ordered by the stored + // `stage_entry_date` ascending — longest-parked on top, which is the + // queue a manager works. The `days_in_stage` column puts the + // `opportunity_stagnation` threshold in plain sight on every row. + label: "\u26A0\uFE0F Stale Opportunities \xB7 Longest in Stage First", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_opportunity" }, + columns: ["name", "crm_account", "stage", "amount", "stage_entry_date", "days_in_stage", "close_date", "owner_id"], + filter: [ + { field: "stage", operator: "not_in", value: ["closed_won", "closed_lost"] } + ], + sort: [{ field: "stage_entry_date", order: "asc" }, { field: "close_date", order: "asc" }] + }, + /** + * Tender expected this quarter — REQ-0006 acceptance 2 in one view. + * + * The point of the view is the predicate: it windows + * `expected_tender_date`, the CUSTOMER's procurement calendar, and touches + * `close_date` nowhere — which is what "reportable independently of + * `close_date`" means and what a single forecast date could never express. + * + * Same inclusive `{current_quarter_*}` bounds as `closing_this_quarter` + * below, exact for the same measured reason: both bounds are date macros + * resolved server-side, and `expected_tender_date` is a `Field.date()` + * stored as `YYYY-MM-DD` TEXT, so the inclusive upper bound drops no rows. + */ + tender_this_quarter: { + name: "tender_this_quarter", + type: "grid", + label: "Tender This Quarter", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_opportunity" }, + columns: ["name", "crm_account", "expected_tender_date", "expected_tender_amount", "expected_signing_date", "stage", "owner_id"], + filter: [ + { field: "stage", operator: "not_in", value: ["closed_won", "closed_lost"] }, + { field: "expected_tender_date", operator: "greater_than_or_equal", value: "{current_quarter_start}" }, + { field: "expected_tender_date", operator: "less_than_or_equal", value: "{current_quarter_end}" } + ], + sort: [{ field: "expected_tender_date", order: "asc" }], + // Empty is the legitimate state on a fresh install: no seed row carries + // a customer-side tender date, so this tab opens on nothing until a rep + // records one. Unexplained, that reads as broken. + emptyState: { + title: "No Tenders Expected This Quarter", + message: "This tab lists open deals whose customer-side tender date falls inside the current quarter. Record Expected Tender Date on a deal to see it here.", + icon: "calendar-clock" + } + }, + /** Closing this quarter (commit + best_case) — sales-manager forecast */ + closing_this_quarter: { + name: "closing_this_quarter", + type: "grid", + label: "Closing This Quarter", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_opportunity" }, + columns: ["name", "crm_account", "amount", "forecast_category", "probability", "close_date", "owner_id"], + // The `close_date` window is what makes the label true (#743). Without + // it this view returned EVERY open commit/best-case deal whenever it + // closed — a deal slated for next March sat under a heading that said + // "Closing This Quarter", and summing the Amount column gave a number + // that was not this quarter's commit. + // + // Both bounds are date macros resolved server-side: `resolveFilterTokens()` + // was wired into the ObjectQL read path in 17.0.0-rc.0 (objectql #3582, + // covering find/findOne/count/aggregate ahead of the middleware chain), + // so a saved-view filter value reaches the driver already substituted. + // Measured on 17.0.0-rc.2, RE-MEASURED 2026-09-03 on 17.2.0 (#1467), + // RE-RUN on 17.3.0 (#1676, after the PR #1577 bump) and RE-RUN again on + // 17.4.0 (#1883, after the PR #1814 bump), unchanged at + // every taking — see the runtime block in + // `test/forecast-current-quarter-view.test.ts`, which is that + // re-measurement (not yet re-run on 17.5.0). + // + // The upper bound is INCLUSIVE against `{current_quarter_end}` rather + // than half-open against `{next_quarter_start}`, and that choice is + // deliberate: a `*_end` token resolves to the period's last calendar DAY + // (2026-09-30), which on a `datetime` column would stop at midnight and + // silently drop that day's rows — the spec says to use the half-open + // form there. `close_date` is `Field.date()`, stored as `YYYY-MM-DD` + // TEXT on both sides of the comparison, so the inclusive bound is exact. + // That is the same field-type property `metadata-references.test.ts` + // relies on for why the CRM/Sales/Executive dashboards may window + // `close_date` at all (#460). Both forms were measured to return the + // identical row set here; the inclusive one reads as what it means. + filter: [ + { field: "forecast_category", operator: "in", value: ["commit", "best_case"] }, + { field: "stage", operator: "not_in", value: ["closed_won", "closed_lost"] }, + { field: "close_date", operator: "greater_than_or_equal", value: "{current_quarter_start}" }, + { field: "close_date", operator: "less_than_or_equal", value: "{current_quarter_end}" } + ], + sort: [{ field: "close_date", order: "asc" }], + // Scoping the list makes "empty" a state a real user meets, so it needs + // copy. Unlike the forecast view's (#745, where the sweep owns the + // window and a fresh install is ALWAYS empty until it runs), the seeds + // here do produce rows for most of a quarter — six seeded deals qualify + // on forecast_category + stage, at `daysFromNow` offsets 11/14/24/30/38/45. + // But every one of those offsets is relative to the INSTALL day, so once + // fewer than 11 days remain in the quarter all six land in the next one + // and a freshly seeded demo opens this tab on nothing. A real org meets + // the same state whenever a quarter's commit slips out. Empty is + // legitimate here; unexplained, it reads as broken. + emptyState: { + title: "No Deals Closing This Quarter", + message: "This tab lists open commit and best-case deals with a close date inside the current quarter. Nothing matches right now \u2014 deals closing later are on the Open Deals tab.", + icon: "calendar-check" + } + } + }, + form: { + type: "tabbed", + sections: [ + { + name: "overview", + label: "Overview", + columns: 2, + fields: [ + { field: "name", required: true, span: "full" }, + { field: "crm_account", required: true }, + "primary_contact", + { field: "stage", required: true }, + { field: "amount", required: true }, + "probability", + "close_date", + "owner_id" + ] + }, + { + name: "forecast", + label: "Forecast", + columns: 2, + fields: [ + "expected_revenue", + "forecast_category", + "type", + "lead_source", + "crm_campaign", + "stage_entry_date", + "days_in_stage", + "is_private", + // REQ-0006 step 8 — the customer's own procurement calendar. Named + // here (AGENTS.md ladder rung 3), and the reason in writing: + // `tender_this_quarter` filters on `expected_tender_date`, and a + // filtered field no form offers is a view that can never match a + // deal a rep created through the UI (`test/metadata-references + // .test.ts`). The fields declare `group: 'sales_process'`, so every + // DERIVED surface — the record page's Details tab — already carries + // them; this form authors `sections`, which win outright over + // derivation. A `{ group: 'sales_process' }` reference cannot stand + // in: it would render `stage`, `probability` and `close_date` + // (curated in Overview, `stage` `required`) and `stage_entry_date` + // (above) a second time, and pull the approval verdict columns and + // the inert-by-default `requested_status` into the create dialog. + "customer_initiation_date", + "expected_tender_date", + "expected_tender_amount", + "expected_signing_date", + "expected_signing_amount" + ] + }, + // REQ-0006 acceptance 1, FROM `fieldGroups` (AGENTS.md ladder rung 2), + // the way `contact.view.ts` references REQ-0004's buying centre: this + // form authors `sections`, which win outright over the renderer's + // `fieldGroups` derivation, so a group declared on the object alone + // never reaches this form — the Edit and New dialog. A group reference + // enumerates nothing; members, label and icon come from the object. + // + // ⚠️ Measured on the 17.6.0 console: the tabbed dialog renders NO tab + // for a `{ group }` section — this one, and the contact form's buying + // centre on `main` alike. That is the platform's to fix, and these two + // lines are the contract-correct form waiting for it (AGENTS.md: a + // platform defect is waited for, never routed around). Until then every + // REQ-0006 field is edited through the Details tab's edit mode — which + // offers no markdown editor, the reason the narrative fields are + // textareas (see the note above `customer_background`). + { group: "qualification", columns: 2 }, + { group: "narrative", columns: 1 }, + { + name: "sales_strategy", + label: "Sales Strategy", + columns: 1, + // `competitors` sat here until #1061 retired it — this form section was + // the field's ONLY surface anywhere in the app (nothing read it back). + fields: ["next_step"] + }, + { + // Win/loss capture at close time. The fields existed on the object for + // reporting but no form offered them, so every closed deal lost its + // why-we-won / why-we-lost data. + name: "win_loss", + label: "Win / Loss", + collapsible: true, + collapsed: true, + columns: 2, + fields: ["win_reason", "loss_reason", { field: "loss_details", span: "full" }] + } + ] + } +}); + +// src/sales/views/task.view.ts +import { defineView as defineView7 } from "@objectstack/spec/ui"; +var TaskViews = defineView7({ + list: { + type: "grid", + name: "all_tasks", + label: "All Tasks", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_task" }, + // NO `progress_percent` column here (#1214 item 5). The default grid used + // to render completion THREE times on one row — 是否完成 (tick), 状态, and + // 进度(%) — and the percent was the one that carried nothing. + // + // ⚠️ The card justified the removal as "every seeded row is 0%". That is + // FALSE as stated and was re-measured before deleting: two of the seven + // seeded tasks carry 100. What is TRUE is the claim underneath it — nobody + // maintains a percent per task — and the seed shows it more sharply than + // the card did: + // · every value that exists is 100, and every one of those rows is + // `status: 'completed'` (`service.seed.ts` mirrors what the hook would + // stamp, since hooks do not run over seeds); + // · `task_completion` stamps 100 on the completed transition and writes + // the field at no other time; + // · both `in_progress` rows sit at 0 — the one status where a percent + // could say something a status cannot, and it says nothing. + // ⇒ On this grid the column is `status` re-rendered at LOWER resolution: it + // cannot tell `not_started` from `in_progress` (both 0), while the `status` + // column beside it can. Dropping it loses no fact this row does not already + // carry twice. + // + // ⛔ The FIELD stays, and so does every other reader — this is one column + // on one view, not a retirement: `task_gantt` fills its bars from + // `gantt.progressField`, `task_board` and `my_open_tasks` show it (neither + // carries `status` AND `is_completed`, so there it is not a third spelling), + // `avg_progress` in `task.dataset.ts` aggregates it, and the Effort section + // of this file's form still lets a user author one. + // + // ⛔ `is_completed` STAYS, and is not the second half of this cleanup: it is + // not an independent shadow that can contradict `status` — `task_completion` + // recomputes it from status on every insert and update + // (`input.is_completed = effStatus === 'completed'`), which is precisely the + // "render completion from status" the card asks for, already done at the + // data layer. It is also this list's first sort key and its completion + // control. + columns: [ + { field: "is_completed", width: 60, align: "center" }, + { field: "subject", width: 280, sortable: true, link: true }, + { field: "status", width: 130, sortable: true }, + { field: "priority", width: 110, sortable: true }, + { field: "due_date", width: 140, sortable: true }, + { field: "owner_id", width: 150 }, + { field: "is_overdue", width: 100, align: "center" } + ], + sort: [ + { field: "is_completed", order: "asc" }, + { field: "due_date", order: "asc" } + ], + rowColor: { + // Task priority is low/normal/high/urgent — the previous critical/medium + // keys were Case values, so urgent and normal rows got no color at all. + // Colors mirror the option colors on crm_task.priority. + field: "priority", + colors: { urgent: "red", high: "orange", normal: "green", low: "slate" } + }, + selection: { type: "multiple" }, + pagination: { pageSize: 50 }, + appearance: { + showDescription: true, + allowedVisualizations: ["grid", "kanban", "calendar", "gantt", "timeline"] + }, + // Binds the 'calendar' entry above: the same schedule the dedicated + // `task_calendar` view shows, on the field this list sorts by. `due_date` + // is optional — an undated task stays off the calendar instead of being + // dropped on today by a guessed field. + calendar: { + startDateField: "due_date", + titleField: "subject", + colorField: "priority" + } + }, + listViews: { + /** Work board */ + task_board: { + name: "task_board", + type: "kanban", + label: "Task Board", + data: { provider: "object", object: "crm_task" }, + columns: ["subject", "priority", "due_date", "owner_id"], + kanban: { + groupByField: "status", + columns: ["subject", "priority", "due_date", "progress_percent"] + }, + filter: [{ field: "is_completed", operator: "equals", value: false }], + navigation: { mode: "drawer", width: "520px" } + }, + /** Schedule view */ + task_calendar: { + name: "task_calendar", + type: "calendar", + label: "Task Schedule", + data: { provider: "object", object: "crm_task" }, + columns: ["subject", "priority", "owner_id"], + calendar: { + startDateField: "due_date", + titleField: "subject", + colorField: "priority" + } + }, + /** Execution plan */ + task_gantt: { + name: "task_gantt", + type: "gantt", + label: "Execution Plan", + data: { provider: "object", object: "crm_task" }, + columns: ["subject", "owner_id", "progress_percent"], + gantt: { + startDateField: "reminder_date", + endDateField: "due_date", + titleField: "subject", + progressField: "progress_percent" + } + }, + /** Worklog timeline */ + task_timeline: { + name: "task_timeline", + type: "timeline", + label: "Worklog Timeline", + data: { provider: "object", object: "crm_task" }, + columns: ["subject", "status"], + timeline: { + startDateField: "reminder_date", + endDateField: "due_date", + titleField: "subject", + groupByField: "owner_id", + colorField: "status", + scale: "week" + } + }, + my_open_tasks: { + name: "my_open_tasks", + type: "grid", + label: "My Open Tasks", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_task" }, + columns: ["subject", "priority", "due_date", "progress_percent"], + filter: [ + { field: "owner_id", operator: "equals", value: "{current_user_id}" }, + { field: "is_completed", operator: "equals", value: false } + ], + sort: [{ field: "due_date", order: "asc" }] + }, + /** My open priority tasks — daily morning queue */ + todays_tasks: { + name: "todays_tasks", + type: "grid", + label: "\u{1F4C5} My Priority Tasks", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_task" }, + columns: ["subject", "priority", "status", "due_date", "related_to_type", "owner_id"], + // Operator-only filter — priority and status, no tokens — and the reason + // recorded here for that has expired (#782). Two claims stood here; both + // were wrong already on 17.0.0-rc.2 — the version this repo pinned AT + // THE TIME they were measured, not the current pin — in different + // ways. "Wrong" is about those two + // retired claims, not about the engine: nothing in this block reports + // broken platform behaviour. + // + // ⚠️ READ THE VERSION ON EACH READING BELOW. They were taken at + // several different pins and are labelled individually; a reading + // labelled 17.2.0 was taken there and has NOT been re-taken on any later + // pin unless it says so. + // + // `{current_user_id}` DOES interpolate. `resolveFilterTokens()` was wired + // into the ObjectQL READ path at 17.0.0-rc.0 (objectql #3582) ahead of + // the middleware chain, covering `find` / `findOne` / `count` / + // `aggregate` — saved-view filters included. `my_open_tasks`, the view + // directly above, ships that exact token. Measured in #784 with two probes + // that separate the three possible outcomes: `owner_id = + // {current_org_id}` returned 0 rows (the filter is not being dropped) + // while `owner_id = {current_user_id}` returned every seeded task (not a + // literal-string compare either — the literal matches no owner at all). + // RE-MEASURED 2026-09-03 on 17.2.0 (#1467), unchanged: both probes + // reported exactly those results there. NOT re-run on 17.3.0 (#1676) — + // the two-probe result is a 17.2.0 reading, and the seam it rests on + // (`resolveFilterTokens()` on the read path) was re-confirmed on 17.4.0 + // by `test/flow-filter-today-token.test.ts` (not yet re-run on 17.5.0). + // + // `{TODAY()}` is not a spelling of anything and never was. The vocabulary + // is `{today}` / `{yesterday}` / `{tomorrow}` / `{now}`, the period + // tokens, and the parameterised `{N_days_ago}` family. + // + // ⚠️ WHAT CHANGED between rc.2 and 17.4.0 — the one reading in + // this block that did NOT survive re-measurement, and the reason the + // version qualifiers here are load-bearing rather than bookkeeping. On + // rc.2 `{TODAY()}` was not REJECTED either: the placeholder grammar was + // `/^\$?\{([a-zA-Z0-9_]+)\}$/`, parentheses fell outside it, + // `classifyFilterToken('{TODAY()}')` returned null, and the string + // reached the driver verbatim and compared as text. From 17.2.0 on — + // re-confirmed on 17.3.0 (#1676) and again on 17.4.0 + // (#1883) by the PREMISE case in + // `test/flow-filter-today-token.test.ts`, which drives a real engine — + // that is FALSE: `FILTER_TOKEN_WRAPPED_RE` in `@objectstack/spec/data` + // now reads `/^\$?\{([^{}]+)\}$/`, which DOES match `TODAY()`, so it + // classifies as `kind: 'unknown'` and `resolveFilterTokens()` throws + // `UnknownFilterTokenError` (`FILTER_TOKEN_UNKNOWN`, HTTP 400) — the same + // envelope `{TODAY}` gets. The change landed at 17.0.0-rc.6 and this repo + // already pins it elsewhere: `test/flow-filter-today-token.test.ts` + // (#1107). That is also why the `src/*/flows` sweeps that still spell + // `{TODAY()}` work — `interpolateFilter()` resolves it before ObjectQL + // sees the filter at all. + // + // Measured on rc.2 over a four-row `crm_task` fixture (due 30d ago / 1d + // ago / today / in 7d), and RE-MEASURED 2026-09-03 on 17.2.0 (#1467) + // over the same fixture — three rows unchanged, the fourth not. ⛔ The + // row COUNTS below are a 17.2.0 reading and were NOT re-taken on 17.3.0 + // (#1676); what WAS re-confirmed there is the throw/resolve verdict in + // the right-hand column, by `test/flow-filter-today-token.test.ts`: + // + // rc.2 17.2.0 + // due_date < '{today}' -> 2 rows (past-due) 2 rows + // due_date <= '{today}' -> 3 rows 3 rows + // due_date < '{TODAY}' -> throws throws + // due_date < '{TODAY()}' -> ALL 4 rows throws + // + // (Both throws are `UnknownFilterTokenError`, `FILTER_TOKEN_UNKNOWN`.) + // + // So the #744 lexicographic inversion ('2026-…' sorts below '{') is NOT + // still live on this path, and ⛔ nothing here should carry a workaround + // for it: on rc.2 it reached every spelling the grammar could not see, + // and the 17.2.0 grammar sees them all. The author-time guard in + // `test/metadata-references.test.ts` — it scans the broader + // `/\{([^{}]+)\}/` and rejects any token neither path resolves — still + // earns its keep, by failing at authoring time rather than as a 400 in a + // user's face, and by covering the analytics path the engine gate does + // not. + // + // Correcting the comment is not a licence to change the filter. Whether + // this view should carry a date bound at all — and whether a label + // reading "My Priority Tasks" over a filter with no owner condition is + // the right name — are BEHAVIOUR decisions on #770's line for the task + // views, not this one's. + // + // The sort below is due_date-MAJOR, not priority-major: `priority_rank + // desc` only breaks ties inside a single due date, so a high task due + // tomorrow outranks an urgent one due next week. Measured on rc.2 with + // the shipped sort over four rows — soon/urgent, soon/high, later/urgent, + // later/high, in that order. What stood here said the sort "puts urgent + // at top", which is what the OTHER key order would do. + filter: [ + { field: "status", operator: "in", value: ["not_started", "in_progress"] }, + { field: "priority", operator: "in", value: ["high", "urgent"] } + ], + sort: [{ field: "due_date", order: "asc" }, { field: "priority_rank", order: "desc" }] + }, + /** Overdue / open tasks across the team — sorted oldest-due first */ + overdue_tasks: { + name: "overdue_tasks", + type: "grid", + // Honest label. Two independent reasons were recorded for it; one still + // holds and one has expired (#782), so they are separated here. + // + // STILL TRUE — `is_overdue` is a WRITE-TIME snapshot. `task.hook.ts:68` + // stamps it in `beforeSave` off that moment's clock (`effDue < todayStr` + // and not completed) and nothing re-stamps it afterwards, so a task that + // was on time when it was last saved still reads `is_overdue = false` the + // day after its due date passes. A filter on that column would hand back + // the wrong rows, and it would go wrong silently. + // + // EXPIRED — the other reason said the view layer cannot resolve + // `due_date < {TODAY()}`, and that only `{current_user_id}` interpolates. + // Both halves were wrong already on 17.0.0-rc.2 — the version this repo + // pinned AT THE TIME they were measured, not the current pin — and the + // file said the opposite of + // itself: the note on `todays_tasks` above asserted that + // `{current_user_id}` does NOT interpolate. It does. + // That comment carries the measurements with their versions, INCLUDING + // the one that moved: `{TODAY()}` is REJECTED from 17.2.0 on + // (`FILTER_TOKEN_UNKNOWN`, re-confirmed on 17.3.0 and again on + // 17.4.0 by + // `test/flow-filter-today-token.test.ts`) where on rc.2 it shipped to + // the driver as text, so "cannot resolve `{TODAY()}`" is wrong on the + // current pin for a different reason than it was wrong on rc.2. The + // canonical `{today}` resolves on the read path either way, so a + // strictly past-due filter IS expressible: `due_date < '{today}'` + // selected exactly the past-due rows out of four on rc.2, and did again + // on 17.2.0 (RE-MEASURED 2026-09-03; that row count was not re-taken on + // 17.3.0, where the token's resolution is re-confirmed by the test file + // named above). + // + // So the honest statement is narrower than the one that stood here: this + // view CAN be given a strictly past-due cut through `{today}`, and is not + // given one. Adding it is a BEHAVIOUR change, not a comment correction — + // it would drop today's due-today work out of the queue and turn an + // "Open Tasks" backlog into a strict overdue list, which is the + // cut-versus-ranking question already open on #770 for the task views. + // That also retires the follow-up this comment used to end on: an hourly + // flow re-stamping `is_overdue` was proposed as the ONLY route to a + // truly-overdue gauge, because the filter route was believed closed. + // There are two routes now, and choosing between them belongs to #770. + // + // As shipped: the open-task backlog ordered most-overdue-first (oldest + // due date on top), which is the actionable queue a manager works. + label: "\u23F0 Open Tasks \xB7 Most Overdue First", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_task" }, + columns: ["subject", "priority", "status", "due_date", "owner_id"], + filter: [ + { field: "is_completed", operator: "equals", value: false } + ], + sort: [{ field: "due_date", order: "asc" }] + } + }, + form: { + type: "simple", + sections: [ + { + name: "task", + label: "Task", + columns: 2, + // `type` (call / email / meeting / demo) is what makes an activity + // history readable and is the first thing a rep reaches for after the + // subject — it was missing entirely. `description` captures what was + // actually said on the call. `progress_percent` moved to the Effort + // section: a task being filed is 0% by definition, so a percentage + // slider on the create form is noise. + fields: [ + { field: "subject", required: true, span: "full" }, + { field: "type", required: false }, + { field: "status", required: true }, + "priority", + "due_date", + "owner_id", + "reminder_date", + { field: "description", span: "full" } + ] + }, + { + name: "related_records", + label: "Related Records", + collapsible: true, + columns: 2, + fields: [ + "related_to_account", + "related_to_contact", + "related_to_opportunity", + "related_to_lead", + "related_to_case" + ] + }, + { + name: "recurrence_and_effort", + label: "Recurrence & Effort", + collapsible: true, + collapsed: true, + columns: 2, + fields: [ + "is_recurring", + "recurrence_type", + "recurrence_interval", + "recurrence_end_date", + "progress_percent" + ] + } + ] + } +}); + +// src/sales/views/event.view.ts +import { defineView as defineView8 } from "@objectstack/spec/ui"; +var EventViews = defineView8({ + list: { + type: "grid", + name: "all_events", + label: "All Events", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_event" }, + columns: [ + { field: "subject", width: 280, sortable: true, link: true }, + { field: "type", width: 120, sortable: true }, + { field: "status", width: 120, sortable: true }, + { field: "start_datetime", width: 180, sortable: true }, + { field: "duration_minutes", width: 120, align: "right" }, + { field: "location", width: 180 }, + { field: "owner_id", width: 150 } + ], + sort: [{ field: "start_datetime", order: "desc" }], + rowColor: { + // Mirrors the option colors on crm_event.status. + field: "status", + colors: { planned: "blue", held: "green", cancelled: "slate", no_show: "orange" } + }, + selection: { type: "multiple" }, + pagination: { pageSize: 50 }, + appearance: { + showDescription: true, + allowedVisualizations: ["grid", "calendar", "timeline", "kanban"] + }, + // Binds the 'calendar' entry above: the same span the dedicated + // `event_calendar` view shows. `start_datetime` is required + notNull; + // `end_datetime` is optional, so an event without one stays a single point + // in time rather than borrowing a neighbour's end. + calendar: { + startDateField: "start_datetime", + endDateField: "end_datetime", + titleField: "subject", + colorField: "type" + } + }, + listViews: { + /** The calendar the issue asks for — start → end, coloured by kind. */ + event_calendar: { + name: "event_calendar", + type: "calendar", + label: "Event Calendar", + data: { provider: "object", object: "crm_event" }, + columns: ["subject", "type", "owner_id"], + calendar: { + startDateField: "start_datetime", + endDateField: "end_datetime", + titleField: "subject", + colorField: "type" + } + }, + /** Who is booked when — one lane per rep. */ + event_timeline: { + name: "event_timeline", + type: "timeline", + label: "Team Schedule", + data: { provider: "object", object: "crm_event" }, + columns: ["subject", "status"], + timeline: { + startDateField: "start_datetime", + endDateField: "end_datetime", + titleField: "subject", + groupByField: "owner_id", + colorField: "type", + scale: "day" + } + }, + my_events: { + name: "my_events", + type: "calendar", + label: "My Calendar", + data: { provider: "object", object: "crm_event" }, + columns: ["subject", "type", "location"], + // `{current_user_id}` is the one token the list-view data path really + // interpolates (see crm.app.ts's "My Work" note). + filter: [{ field: "owner_id", operator: "equals", value: "{current_user_id}" }], + calendar: { + startDateField: "start_datetime", + endDateField: "end_datetime", + titleField: "subject", + colorField: "type" + } + }, + /** Booked, not yet held — soonest first. */ + upcoming_events: { + name: "upcoming_events", + type: "grid", + label: "\u{1F4C5} Upcoming \xB7 Soonest First", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_event" }, + columns: ["subject", "type", "start_datetime", "location", "related_to_type", "owner_id"], + filter: [{ field: "status", operator: "equals", value: "planned" }], + sort: [{ field: "start_datetime", order: "asc" }] + }, + /** What actually happened — the interaction history the CRM could not show. */ + held_events: { + name: "held_events", + type: "grid", + label: "\u2705 Interaction History", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_event" }, + columns: ["subject", "type", "start_datetime", "duration_minutes", "related_to_type", "owner_id"], + filter: [{ field: "status", operator: "equals", value: "held" }], + sort: [{ field: "start_datetime", order: "desc" }] + } + }, + form: { + type: "simple", + sections: [ + { + name: "event", + label: "Event", + columns: 2, + fields: [ + { field: "subject", required: true, span: "full" }, + { field: "type", required: true }, + { field: "status", required: true }, + "owner_id", + "location", + { field: "description", span: "full" } + ] + }, + { + name: "schedule", + label: "Schedule", + columns: 2, + fields: [ + { field: "start_datetime", required: true }, + "end_datetime", + "all_day", + "duration_minutes" + ] + }, + { + name: "related_records", + label: "Related Records", + collapsible: true, + columns: 2, + fields: [ + "related_to_account", + "related_to_contact", + "related_to_opportunity", + "related_to_lead", + "related_to_case" + ] + }, + { + name: "outcome", + label: "Outcome", + collapsible: true, + collapsed: true, + columns: 1, + fields: ["outcome_notes"] + } + ] + } +}); + +// src/sales/views/event_attendee.view.ts +import { defineView as defineView9 } from "@objectstack/spec/ui"; +var EventAttendeeViews = defineView9({ + list: { + type: "grid", + name: "all_event_attendees", + label: "Event Attendees", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_event_attendee" }, + columns: [ + { field: "attendee_type", width: 120, sortable: true }, + { field: "crm_contact", width: 200 }, + { field: "crm_lead", width: 200 }, + { field: "sys_user", width: 200 }, + { field: "external_name", width: 200 }, + { field: "response", width: 140, sortable: true }, + { field: "is_organizer", width: 100, align: "center" } + ], + sort: [{ field: "is_organizer", order: "desc" }], + rowColor: { + // Mirrors the option colors on crm_event_attendee.response. + field: "response", + colors: { accepted: "green", declined: "red", tentative: "orange", no_response: "slate" } + }, + pagination: { pageSize: 25 } + }, + form: { + type: "simple", + sections: [ + { + name: "attendee", + label: "Attendee", + columns: 2, + fields: [ + { field: "crm_event", required: true }, + { field: "attendee_type", required: true }, + "crm_contact", + "crm_lead", + "sys_user", + "external_name" + ] + }, + { + name: "invitation", + label: "Invitation", + columns: 2, + fields: ["response", "is_organizer", "invited_date"] + } + ] + } +}); + +// src/sales/views/forecast.view.ts +import { defineView as defineView10 } from "@objectstack/spec/ui"; +var ForecastViews = defineView10({ + list: { + type: "grid", + name: "all_forecasts", + label: "All Forecasts", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_forecast" }, + columns: [ + { field: "owner_id", width: 160, pinned: "left", link: true }, + { field: "period_label", width: 130, sortable: true }, + { field: "period_start", width: 130, sortable: true }, + { field: "snapshot_date", width: 130, sortable: true }, + { field: "quota", width: 130, align: "right", summary: "sum" }, + { field: "closed_amount", width: 140, align: "right", summary: "sum" }, + { field: "commit_amount", width: 140, align: "right", summary: "sum" }, + { field: "best_case_amount", width: 140, align: "right", summary: "sum" }, + { field: "pipeline_amount", width: 140, align: "right", summary: "sum" }, + // No total here: a formula has no stored column to aggregate, so the spec refuses `sum` on a `formula` field (#1980). + { field: "expected_amount", width: 140, align: "right" }, + { field: "attainment_pct", width: 130, align: "right" }, + { field: "coverage_ratio", width: 130, align: "right" }, + { field: "source", width: 130 } + ], + sort: [ + { field: "period_start", order: "desc" }, + { field: "owner_id", order: "asc" } + ], + grouping: { fields: [{ field: "period_label", order: "desc" }] }, + pagination: { pageSize: 50 }, + appearance: { allowedVisualizations: ["grid"] } + }, + listViews: { + this_quarter_forecasts: { + name: "this_quarter_forecasts", + type: "grid", + // The label promises the CURRENT quarter, and the filter delivers it. + // + // The restriction was dropped in #515 on the measurement that "the list + // data path resolves no date macro". That measurement was taken on + // @objectstack 16.1.0 and has since expired: `resolveFilterTokens()` was + // wired into the ObjectQL READ path in 17.0.0-rc.0 (objectql + // `feat(filters): evaluate {filter-token} placeholders server-side`, + // #3582) — `find`/`findOne`/`count`/`aggregate`, ahead of the middleware + // chain, which is the one gate every server-side read passes through, + // saved-view filters included. Measured rather than inferred; + // `test/forecast-current-quarter-view.test.ts` runs THIS filter through a + // real engine and pins the three-way outcome (one quarter selected, not + // zero and not all of them). First taken on 17.0.0-rc.2, RE-RUN + // 2026-09-03 on 17.2.0 (#1467), RE-RUN on 17.3.0 (#1676, after the PR + // #1577 bump) and RE-RUN again on 17.4.0 (#1883, after the PR #1814 + // bump), green all four times. Not yet re-run on 17.5.0; the test is + // what re-takes the reading on each new pin. + // + // Both halves of the key are load-bearing, same as the quota-attainment + // widget in `src/sales/dashboards/sales.dashboard.ts`: `period: 'quarter'` + // alone returns every quarter ever snapshotted (the #730 defect), and + // `period_start` alone merges the quarter row with the MONTH row that + // opens the same quarter — Q3 and July both start on the 1st. + // + // The old `{this_quarter_start}` spelling is not merely unresolved now, + // it is rejected: the resolver throws `Unresolvable filter placeholder` + // and names `{current_quarter_start}` as the fix, so the silent-empty + // failure mode that removal was reacting to is no longer reachable. + label: "This Quarter", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_forecast" }, + columns: ["owner_id", "quota", "closed_amount", "commit_amount", "best_case_amount", "pipeline_amount", "attainment_pct", "coverage_ratio"], + filter: [ + { field: "period", operator: "equals", value: "quarter" }, + { field: "period_start", operator: "equals", value: "{current_quarter_start}" } + ], + // One sort key, because the filter pins `period_start` to a single value + // — the `period_start desc` key that ranked quarters against each other + // existed only to float the current quarter to the top of an unscoped + // list, and is provably inert now that the list holds one quarter. + // + // The tiebreaker is NOT `attainment_pct desc`, which is a FORMULA — the + // engine computes it in JS after the query, so the data engine never saw + // that sort key and the ordering within a quarter was arbitrary (same + // class of defect as #489's `days_in_stage` filter). `closed_amount` is + // the stored numerator behind attainment and ranks the same direction. + sort: [ + { field: "closed_amount", order: "desc" } + ], + // Empty is the honest state, and it needs to say so. The seeds ship no + // current-quarter row on purpose (#702 — the sweep owns that window, and + // two producers in one window is what left a phantom ownerless + // duplicate), so on a fresh install this view is empty until the 03:00 + // `forecast_snapshot` sweep has run once. That is the same trade the + // quota-attainment widget already takes; without this copy the user + // cannot tell it apart from a broken view. + emptyState: { + title: "This Quarter Has No Snapshots Yet", + message: "Quarterly snapshots are written by the nightly forecast sweep. Until it has run once for the current quarter this view is empty \u2014 settled quarters are on the All tab.", + icon: "calendar" + } + }, + my_forecast: { + name: "my_forecast", + type: "grid", + label: "My Forecast", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_forecast" }, + columns: ["period_label", "snapshot_date", "quota", "closed_amount", "commit_amount", "pipeline_amount", "attainment_pct"], + // `{current_user_id}` is the only user token the view runtime resolves + // (`{current_user}` silently never matches). + filter: [{ field: "owner_id", operator: "equals", value: "{current_user_id}" }], + sort: [{ field: "period_start", order: "desc" }] + } + }, + form: { + type: "simple", + sections: [ + { + name: "snapshot", + label: "Snapshot", + columns: 2, + fields: ["owner_id", "period", "period_start", "period_end", "period_label", "snapshot_date", "source"] + }, + { + name: "amounts", + label: "Amounts", + columns: 2, + fields: ["quota", "closed_amount", "commit_amount", "best_case_amount", "pipeline_amount", "expected_amount", "attainment_pct", "coverage_ratio"] + }, + { + name: "notes", + label: "Notes", + columns: 1, + fields: ["notes"] + } + ] + } +}); + +// src/revenue/views/index.ts +var views_exports2 = {}; +__export(views_exports2, { + ContractViews: () => ContractViews, + ProductViews: () => ProductViews, + QuoteViews: () => QuoteViews +}); + +// src/revenue/views/contract.view.ts +import { defineView as defineView11 } from "@objectstack/spec/ui"; +var ContractViews = defineView11({ + list: { + type: "grid", + name: "all_contracts", + label: "All Contracts", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_contract" }, + columns: [ + { field: "contract_number", width: 150, link: true, pinned: "left" }, + { field: "crm_account", width: 200 }, + { field: "crm_opportunity", width: 200 }, + { field: "status", width: 130, sortable: true }, + { field: "contract_value", width: 140, align: "right", summary: "sum" }, + { field: "contract_term_months", width: 130, align: "right" }, + { field: "start_date", width: 130, sortable: true }, + { field: "end_date", width: 130, sortable: true }, + { field: "auto_renewal", width: 110, align: "center" }, + { field: "owner_id", width: 150 } + ], + sort: [{ field: "end_date", order: "asc" }], + pagination: { pageSize: 25 }, + selection: { type: "multiple" }, + appearance: { + allowedVisualizations: ["grid", "calendar", "gantt", "timeline"] + }, + // Binds the 'calendar' entry above: renewal dates, same as the dedicated + // `renewal_calendar` view and the field this list sorts by. A contract + // calendar answers "what renews when" — the start -> end term SPAN is + // already carried by `contract_gantt` and `contract_timeline`, which is + // why `end_date` is the start of the event here rather than an end. + calendar: { + startDateField: "end_date", + titleField: "contract_number", + colorField: "status" + } + }, + listViews: { + /** Renewal calendar (highlights upcoming end dates) */ + renewal_calendar: { + name: "renewal_calendar", + type: "calendar", + label: "Renewal Calendar", + data: { provider: "object", object: "crm_contract" }, + columns: ["contract_number", "crm_account", "status"], + calendar: { + startDateField: "end_date", + titleField: "contract_number", + colorField: "status" + } + }, + /** Contract terms gantt */ + contract_gantt: { + name: "contract_gantt", + type: "gantt", + label: "Contract Terms", + data: { provider: "object", object: "crm_contract" }, + columns: ["contract_number", "crm_account", "contract_value"], + gantt: { + startDateField: "start_date", + endDateField: "end_date", + titleField: "contract_number" + } + }, + /** Chronological timeline */ + contract_timeline: { + name: "contract_timeline", + type: "timeline", + label: "Contract Timeline", + data: { provider: "object", object: "crm_contract" }, + columns: ["contract_number", "crm_account"], + timeline: { + startDateField: "start_date", + endDateField: "end_date", + titleField: "contract_number", + groupByField: "crm_account", + colorField: "status", + scale: "quarter" + } + } + }, + form: { + type: "tabbed", + sections: [ + { + name: "parties", + label: "Parties", + columns: 2, + fields: ["contract_number", "crm_account", "crm_contact", "crm_opportunity", "owner_id", "status"] + }, + { + // Named `contract_terms`, not `terms` — `terms` is already a distinct + // fieldGroup key on `crm_contract` ("Terms & Dates"), and reusing it + // here would make this section's translated heading follow that + // group's wording instead of its own "Terms". + name: "contract_terms", + label: "Terms", + columns: 2, + fields: [ + "contract_term_months", + "start_date", + "end_date", + "contract_value", + "billing_frequency", + "payment_terms", + "auto_renewal", + "renewal_notice_days" + ] + }, + { + name: "signing_and_documents", + label: "Signing & Documents", + columns: 2, + fields: ["signed_date", "signed_by", "document_url"] + }, + { + // The contract's two markdown bodies, together and in the order a + // reader needs them — the question #1826 asked this form to answer. + // They are not redundant, and `content/docs/revenue/contracts.mdx` + // already rules which is which: **Description** is the plain summary + // of what this contract is (declared on the `basic` group, listed + // there under "Contract Information"), while **Special Terms** is + // where every free-text TERM goes — the doc sends renewal + // instructions, an unlisted billing cadence and an unlisted payment + // arrangement to Special Terms by name, three separate times. + // Description was the one field in that inventory no form offered, so + // the summary a reader was told the record carries could not be + // written. One column, because both are long-form. + name: "notes", + label: "Notes", + columns: 1, + fields: ["description", "special_terms", "billing_address"] + } + ] + } +}); + +// src/revenue/views/product.view.ts +import { defineView as defineView12 } from "@objectstack/spec/ui"; +var ProductViews = defineView12({ + list: { + type: "grid", + name: "all_products", + label: "All Products", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_product" }, + columns: [ + { field: "product_code", width: 140, link: true, pinned: "left" }, + { field: "name", width: 240, sortable: true }, + { field: "category", width: 140 }, + { field: "family", width: 140 }, + { field: "sku", width: 140 }, + { field: "list_price", width: 130, align: "right", summary: "avg" }, + { field: "cost", width: 130, align: "right" }, + { field: "is_active", width: 100, align: "center" } + ], + sort: [{ field: "name", order: "asc" }], + grouping: { fields: [{ field: "category", order: "asc" }] }, + pagination: { pageSize: 50 }, + selection: { type: "multiple" }, + appearance: { + allowedVisualizations: ["grid", "gallery"] + } + }, + listViews: { + /** Visual catalog */ + product_catalog: { + name: "product_catalog", + type: "gallery", + label: "Product Catalog", + data: { provider: "object", object: "crm_product" }, + columns: ["name", "category", "list_price"], + gallery: { + coverField: "image", + coverFit: "cover", + cardSize: "medium", + titleField: "name", + visibleFields: ["product_code", "category", "family", "list_price", "sku"] + } + } + }, + form: { + type: "simple", + sections: [ + { + name: "product_info", + label: "Product Info", + columns: 2, + fields: [ + "product_code", + { field: "name", required: true, span: "full" }, + "category", + "family", + "sku", + "product_manager", + "is_active" + ] + }, + { + name: "pricing_info", + label: "Pricing", + columns: 2, + fields: ["list_price", "cost"] + }, + { + name: "media", + label: "Media", + columns: 1, + fields: ["image", "datasheet", "description"] + } + ] + } +}); + +// src/revenue/views/quote.view.ts +import { defineView as defineView13 } from "@objectstack/spec/ui"; +var QuoteViews = defineView13({ + list: { + type: "grid", + name: "all_quotes", + label: "All Quotes", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_quote" }, + columns: [ + { field: "quote_number", width: 140, link: true, pinned: "left" }, + { field: "crm_account", width: 200 }, + { field: "crm_opportunity", width: 200 }, + { field: "status", width: 130, sortable: true }, + { field: "quote_date", width: 130, sortable: true }, + { field: "expiration_date", width: 140, sortable: true }, + { field: "subtotal", width: 130, align: "right", summary: "sum" }, + { field: "discount", width: 110, align: "right" }, + { field: "tax", width: 110, align: "right", summary: "sum" }, + { field: "total_price", width: 140, align: "right", summary: "sum" }, + { field: "owner_id", width: 150 } + ], + sort: [{ field: "quote_date", order: "desc" }], + pagination: { pageSize: 25 }, + selection: { type: "multiple" }, + appearance: { + allowedVisualizations: ["grid", "kanban", "calendar"] + }, + // Binds the 'calendar' entry above: the same span the dedicated + // `quote_calendar` view shows. `quote_date` and `expiration_date` are both + // required + notNull on crm_quote, so every quote lands on a real window. + calendar: { + startDateField: "quote_date", + endDateField: "expiration_date", + titleField: "quote_number", + colorField: "status" + } + }, + listViews: { + /** Quote workflow board */ + quote_pipeline: { + name: "quote_pipeline", + type: "kanban", + label: "Quote Pipeline", + data: { provider: "object", object: "crm_quote" }, + columns: ["quote_number", "crm_account", "total_price", "expiration_date"], + kanban: { + groupByField: "status", + summarizeField: "total_price", + columns: ["quote_number", "crm_account", "total_price", "expiration_date"] + } + }, + /** Quote-date calendar */ + quote_calendar: { + name: "quote_calendar", + type: "calendar", + label: "Quote Calendar", + data: { provider: "object", object: "crm_quote" }, + columns: ["quote_number", "crm_account", "total_price"], + calendar: { + startDateField: "quote_date", + endDateField: "expiration_date", + titleField: "quote_number", + colorField: "status" + } + } + }, + form: { + type: "tabbed", + sections: [ + { + name: "quote", + label: "Quote", + columns: 2, + // `name` is required on crm_quote with no default — omitting it made + // quote creation through this form impossible. + fields: [{ field: "name", required: true, span: "full" }, "quote_number", "crm_account", "crm_contact", "crm_opportunity", "owner_id", "status", "quote_date", "expiration_date"] + }, + { + name: "totals", + label: "Totals", + columns: 2, + fields: ["subtotal", "discount", "discount_amount", "tax", "shipping_handling", "total_price"] + }, + { + // Named `quote_terms`, not `terms` — `terms` is already a distinct + // fieldGroup key on `crm_quote` ("Terms & Validity"), and reusing it + // here would make this section's translated heading follow that + // group's wording instead of its own "Terms". + name: "quote_terms", + label: "Terms", + columns: 2, + fields: ["payment_terms", "shipping_terms"] + }, + { + name: "addresses_and_notes", + label: "Addresses & Notes", + columns: 1, + fields: ["billing_address", "shipping_address", "internal_notes"] + } + ] + } +}); + +// src/marketing/views/index.ts +var views_exports3 = {}; +__export(views_exports3, { + CampaignViews: () => CampaignViews +}); + +// src/marketing/views/campaign.view.ts +import { defineView as defineView14 } from "@objectstack/spec/ui"; +var CampaignViews = defineView14({ + list: { + type: "grid", + name: "all_campaigns", + label: "All Campaigns", + userActions: { editInline: true }, + data: { provider: "object", object: "crm_campaign" }, + columns: [ + { field: "name", width: 240, sortable: true, link: true, pinned: "left" }, + { field: "channel", width: 130 }, + { field: "status", width: 130, sortable: true }, + { field: "start_date", width: 130, sortable: true }, + { field: "end_date", width: 130, sortable: true }, + { field: "budgeted_cost", width: 140, align: "right", summary: "sum" }, + { field: "expected_revenue", width: 160, align: "right", summary: "sum" } + ], + sort: [{ field: "start_date", order: "asc" }], + pagination: { pageSize: 25 }, + selection: { type: "multiple" }, + appearance: { + showDescription: true, + allowedVisualizations: ["grid", "gantt", "calendar", "timeline"] + }, + // Binds the 'calendar' entry above: the switcher opens the same schedule + // the dedicated `campaign_calendar` view shows. Both dates are required + + // notNull on crm_campaign, so every campaign spans a truthful range. + calendar: { + startDateField: "start_date", + endDateField: "end_date", + titleField: "name", + colorField: "channel" + } + }, + listViews: { + /** Campaign schedule */ + campaign_gantt: { + name: "campaign_gantt", + type: "gantt", + label: "Campaign Schedule", + data: { provider: "object", object: "crm_campaign" }, + columns: ["name", "channel"], + gantt: { + startDateField: "start_date", + endDateField: "end_date", + titleField: "name" + } + }, + /** Launch calendar */ + campaign_calendar: { + name: "campaign_calendar", + type: "calendar", + label: "Launch Calendar", + data: { provider: "object", object: "crm_campaign" }, + columns: ["name", "channel", "status"], + calendar: { + startDateField: "start_date", + endDateField: "end_date", + titleField: "name", + colorField: "channel" + } + }, + /** Marketing timeline */ + campaign_timeline: { + name: "campaign_timeline", + type: "timeline", + label: "Marketing Timeline", + data: { provider: "object", object: "crm_campaign" }, + // The list data source projects configured columns. Keep the date + // fields in that projection so the timeline renderer can bucket and + // order campaigns from the same schedule data as the calendar/Gantt. + columns: ["name", "channel", "start_date", "end_date"], + timeline: { + startDateField: "start_date", + endDateField: "end_date", + titleField: "name", + groupByField: "channel", + colorField: "status", + scale: "month" + } + } + }, + form: { + type: "tabbed", + sections: [ + { + // Every form section here carries a `name` matching the object's + // fieldGroup key, so the heading resolves through + // `objects.crm_campaign._sections..label` in all four packs. A + // nameless section has no key a bundle can carry and renders its + // English label in every locale — the platform warns about exactly this + // during `objectstack validate`, and this form was carrying four of + // those warnings before the #597 restructure gave it a reason to move. + name: "basic", + label: "Campaign Information", + columns: 2, + fields: [ + { field: "name", required: true, span: "full" }, + "campaign_code", + "type", + "channel", + { field: "status", required: true }, + "owner_id", + "is_active", + "landing_page_url", + // The markdown body of the campaign brief. Declared on the `basic` + // group and filled by seven of the seed campaigns, but omitted from + // this enumeration — so the only surface that could show it did not, + // and a marketer could neither read nor write the brief they wrote. + { field: "description", span: "full" } + ] + }, + { + name: "schedule", + label: "Schedule", + columns: 2, + fields: ["start_date", "end_date"] + }, + { + /** + * Budget & ROI — a SECTION OF ITS OWN, deliberately (#597). + * + * `budgeted_cost` and `actual_cost` are the only two campaign numbers + * that are manual-entry by design: nothing on the platform knows what a + * trade-show booth cost. They used to sit seventh and eighth in a + * seven-field "Schedule & Budget" row, below the dates and beside two + * revenue figures one of which the metric hooks own — so the two fields + * a marketer must type were the least visible things on the form, and + * `actual_cost` in particular went untyped. + * + * That is not a cosmetic complaint: `roi` divides by `actual_cost`, and + * its formula answers a flat `0.0` for any campaign where that field is + * blank. An empty cost field renders as 0% ROI on every campaign — the + * one number the whole Performance section exists to produce, reading + * as a real measurement rather than as missing input. + * + * So the costs get their own heading, and `roi` is displayed HERE with + * them rather than at the bottom of Performance, where its dependency + * on two fields three sections away was invisible. The heading matches + * the object's `budget` fieldGroup, so the form and the detail page + * agree on what this group is called. + */ + name: "budget", + label: "Budget & ROI", + columns: 2, + fields: ["budgeted_cost", "actual_cost", "expected_revenue", "actual_revenue", "roi"] + }, + { + name: "metrics", + label: "Performance", + columns: 2, + fields: [ + "target_size", + "num_sent", + "num_responses", + "num_leads", + "num_converted_leads", + "num_opportunities", + "num_won_opportunities", + "response_rate" + ] + } + ] + } +}); + +// src/sales/pages/index.ts +var pages_exports = {}; +__export(pages_exports, { + AccountDetailPage: () => AccountDetailPage, + AccountWorkbenchPage: () => AccountWorkbenchPage, + AppLauncherPage: () => AppLauncherPage, + LeadDetailPage: () => LeadDetailPage, + OpportunityDetailPage: () => OpportunityDetailPage, + SalesHomePage: () => SalesHomePage, + UtilityBarPage: () => UtilityBarPage +}); + +// src/sales/pages/lead_detail.page.ts +import { P as P25 } from "@objectstack/spec"; +var LeadDetailPage = { + name: "lead_detail_page", + label: "Lead Detail", + description: "Comprehensive lead detail page with highlights, details, and related information", + type: "record", + object: "crm_lead", + // Template defines the overall layout structure. We use `full-width` + // (single column) because the previous `header-sidebar-main` layout + // sandwiched the highlights strip into a cramped sidebar with no other + // meaningful sidebar content — Salesforce Lightning record pages + // similarly default to a stacked column for medium-density objects. + template: "full-width", + kind: "full", + // Page-level state variables + variables: [ + { + name: "showHistory", + type: "boolean", + defaultValue: false + }, + { + name: "activeTab", + type: "string", + defaultValue: "details" + } + ], + // Regions correspond to slots in the template + regions: [ + { + name: "header", + width: "full", + components: [ + // Title + subtitle + icon, with record-level actions rendered + // inline in the header's action slot via the first-class + // `actions` property (no sibling node, no visual offset hack). + { + type: "page:header", + id: "lead_header", + label: "Lead Information", + properties: { + title: "{first_name} {last_name}", + subtitle: "{company}", + // `icon` removed from `page:header` in @objectstack/spec 17.0.0 + // (#6946, ADR-0087 D2) — deleted, not renamed. See the full note on + // `account_detail.page.ts`; nothing ever drew it. + // `breadcrumb` retired from `page:header` in @objectstack/spec 17.6.0 + // (#20785, `page-header-breadcrumb-removed`) — deleted: no renderer + // ever drew a trail for it; the app shell's own trail is unchanged. + // Convert is the outcome; scheduling the next touch is the daily + // act. Both belong in the header — the follow-up used to be four + // clicks deep in the Related tab. + // + // The three activity actions are listed EXPLICITLY (#592): a custom + // record page replaces the synthesized header, so an object-scoped + // action that is not named here is unreachable from the record — + // only the list-row ⋮ menu can fire it. Logging the call you just + // made is the single most frequent thing a rep does on a lead, and + // it was two navigations away. + // + // Action IDs, not `ActionDef` objects: `PageHeaderProps.actions` is + // `z.array(z.string())` ("Action IDs to show in header") in + // @objectstack/spec 17.3.0, and this repo authors against the + // protocol (#1653). Each id is the `name` of a crm_lead-scoped + // action — `convert_lead` / `schedule_followup` in + // `src/sales/actions/lead.actions.ts`, the activity trio in + // `src/sales/actions/activity-actions.ts`. + actions: [ + "convert_lead", + "schedule_followup", + "log_call", + "log_meeting", + "schedule_meeting" + ] + } + }, + // Duplicate banners — ONE PER VERDICT (#1207 · widened by #1289 · + // split by #1628). + // + // `lead_duplicate_check` (lead.hook.ts, job 2) already writes + // `duplicate_status: 'suspected'` and links the record the lead repeats + // — the flag existed, and this page never read it. A rep opened a + // flagged lead, saw a page identical to a clean one, and converted it + // into a second account, contact and opportunity. These banners and the + // `duplicates` section on the Details tab are the record-page half of + // that fix — the banner is the alarm, the section is the link to + // compare against; the conversion screen carries the other half. + // + // ## Why there are TWO of them (#1628) + // + // #1207 shipped one banner gated on `== "suspected"`, which left the + // STRONGER state silent. #1289 widened the predicate to every verdict + // and, being one component, had to pick copy that named NEITHER state: + // a `record:alert` carries a single `visible` and a single title/body + // pair, and `pickLocalized` picks by LANGUAGE, not by row — so naming + // one verdict would have mislabelled every lead in the other. + // + // That was correct for one banner, and it is why one banner is not + // enough. Since #1288 the two verdicts have OPPOSITE next steps: + // + // suspected — the intake hook's guess. Conversion PROCEEDS; the rep + // should compare against the linked record first. + // confirmed — a reviewer's verdict. Conversion is REFUSED outright + // (`lead-conversion.flow.ts`, `refuse_confirmed_duplicate`). + // + // One sentence cannot state either without being false for the other, + // so it stated neither, and the rep had to scroll to the Duplicate + // Status chip to learn which situation they were in. A banner that + // announces something is wrong but not what to do is not doing the one + // job a banner has. Two components, two predicates, two next steps. + // + // ⚠️ Two sibling `record:alert` nodes really do BOTH render: a region + // renders as `components.map((node, i) => )` — read out of the shipped console bundle at the + // `.objectui-sha` pin — so each is mounted separately and evaluates its + // own `visible` against the same row. Their `id`s are their React keys, + // which is why the two ids differ rather than sharing one. + // + // ⚠️ `visible` is the ONE record component whose PROPS carry a real row + // predicate: `record-alert.tsx` evaluates `properties.visible` through + // `toPredicateInput` + `useCondition` against the row + // (`usePredicateRecordContext`), the same pipeline as an action button. + // A node-level `visibleWhen` is a different gate one tier up, + // evaluated by `SchemaRenderer`, and the two compose as AND. Measured + // on the 17.6.0 pin (#1887), that tier binds the page's row as + // `record` too (objectui#5454): this same predicate, moved there, + // gated correctly in both directions. `visible` stays because it is + // the gate `record:alert` declares in its own props. + // + // ⚠️ `has()` is load-bearing, and this surface is the WORST of the four + // this repo measures (cf. `test/view-predicate-dialect.test.ts`): the + // renderer's call site is FAIL-SOFT — an unevaluable predicate answers + // SHOWN. So a bare `record.duplicate_status == "suspected"` would abort + // with `No such key` on every clean lead whose driver omits the column + // (`driver-memory` / `driver-mongodb`; `driver-sql` returns it as null) + // and put a duplicate warning on leads that are not duplicates. The + // guard is what makes the predicate answer `false` instead of faulting. + // Pinned on the real engine in `test/lead-duplicate-visibility.test.ts`. + // + // ⛔ And the guard is NOT the whole predicate — `has()` ALONE is wrong + // here, in either shape. It is TRUE for a key that is PRESENT AND NULL, + // which is precisely what `driver-sql` hands back for a clean lead + // (measured: `has(record.duplicate_status)` against + // `{ duplicate_status: null }` answers `{ ok: true, value: true }`), so + // the guard needs a comparison beside it or the banner cries wolf on + // every clean lead. #1289, covering both verdicts at once, spelled that + // comparison `&& … != null`. A per-verdict banner spells it with the + // EQUALITY, which is strictly narrower and subsumes it: measured on + // this engine, `null == "suspected"` is a clean `false`, not a fault, + // and the two spellings agree on every record shape a driver can + // produce. Both halves of the shape #1289 ruled for are intact — the + // `has()` guard verbatim, and a comparison that makes "set" mean set — + // and the comparison got STRICTER, which is the point of the split. The + // same spelling already ships one file over, on this same field: the + // conversion flow's `e21` / `e25` edges (#1288) read + // `has(vars.leadRecord.duplicate_status) && … == "suspected"`. + // + // ⛔ Neither half may be simplified away. Both are pinned, shape by + // shape, including the reverse pin that the unguarded tail really does + // fault. + // + // `P` — an explicit `{ dialect: 'cel' }` envelope — is not decoration + // either: `ExpressionEvaluator.evaluateCondition` routes ONLY the + // envelope to `@objectstack/formula`'s CEL engine, where `has()` is a + // real function; a bare string takes the legacy JS path, whose + // `FormulaFunctions` has no CEL `has()`, so the guard would itself be + // the fault that fails soft to visible. + // + // `title` / `body` carry inline locale maps rather than plain strings: + // this renderer resolves both through `pickLocalized(…, language)` + // (the same capability `opportunity_detail.page.ts` records under + // #972), and `body` has no other channel — the i18n extractor's + // per-component copy keys (`PAGE_COMPONENT_COPY_KEYS`, read on 17.6.0) + // are title/description/label/placeholder/emptyText, so a plain-string + // `body` would ship English to all four locales. Keeping both halves of one banner's copy in one + // place beats splitting `title` into the locale packs. + // + // ⭐ Each banner's copy NAMES ITS OWN VERDICT, in the vocabulary the + // `duplicate_status` chip below publishes, and never the other one — + // pinned against the option labels read out of the locale packs in + // `test/lead-duplicate-visibility.test.ts`, so renaming an option + // re-aims the assertion rather than retiring it. + { + type: "record:alert", + id: "lead_duplicate_alert_suspected", + label: "Suspected Duplicate Alert", + properties: { + // `warning`, not `error`: conversion still PROCEEDS on this + // verdict, and the renderer maps `error` to `role="alert"` / + // `aria-live="assertive"` — an interruption this state has not + // earned. + severity: "warning", + visible: P25`has(record.duplicate_status) && record.duplicate_status == "suspected"`, + title: { + en: "Suspected duplicate \u2014 compare before you convert", + "zh-CN": "\u7591\u4F3C\u91CD\u590D\u2014\u2014\u8F6C\u6362\u524D\u8BF7\u5148\u6BD4\u5BF9", + "ja-JP": "\u91CD\u8907\u306E\u7591\u3044 \u2014 \u5909\u63DB\u3059\u308B\u524D\u306B\u7167\u5408\u3057\u3066\u304F\u3060\u3055\u3044", + "es-ES": "Duplicado Sospechoso: compare antes de convertir" + }, + body: { + en: "Intake matched this lead to a record this app already has. Duplicate Management below links that record \u2014 open it and compare. You can still convert this lead: this is the match intake guessed at, not a reviewer's decision. But if it is the same buyer, disqualify it instead, because converting creates a second account, contact and opportunity for them.", + "zh-CN": "\u5F55\u5165\u65F6\u53D1\u73B0\u8BE5\u7EBF\u7D22\u4E0E\u7CFB\u7EDF\u4E2D\u5DF2\u6709\u8BB0\u5F55\u5339\u914D\u3002\u4E0B\u65B9\u300C\u91CD\u590D\u7EBF\u7D22\u7BA1\u7406\u300D\u4E2D\u662F\u5B83\u91CD\u590D\u7684\u90A3\u6761\u8BB0\u5F55\uFF0C\u8BF7\u5148\u6253\u5F00\u6BD4\u5BF9\u3002\u8BE5\u7EBF\u7D22\u4ECD\u7136\u53EF\u4EE5\u8F6C\u6362\uFF1A\u8FD9\u662F\u5F55\u5165\u65F6\u7684\u81EA\u52A8\u5224\u65AD\uFF0C\u4E0D\u662F\u5BA1\u6838\u4EBA\u7684\u7ED3\u8BBA\u3002\u4F46\u82E5\u786E\u5C5E\u540C\u4E00\u5BA2\u6237\uFF0C\u8BF7\u6539\u4E3A\u53D6\u6D88\u8D44\u683C\u2014\u2014\u8F6C\u6362\u4F1A\u4E3A\u540C\u4E00\u5BA2\u6237\u518D\u521B\u5EFA\u4E00\u5957\u5BA2\u6237\u3001\u8054\u7CFB\u4EBA\u548C\u5546\u673A\u3002", + "ja-JP": "\u767B\u9332\u6642\u306B\u3001\u3053\u306E\u30EA\u30FC\u30C9\u304C\u65E2\u5B58\u30EC\u30B3\u30FC\u30C9\u3068\u4E00\u81F4\u3057\u307E\u3057\u305F\u3002\u4E0B\u306E\u300C\u91CD\u8907\u7BA1\u7406\u300D\u306B\u91CD\u8907\u5148\u306E\u30EC\u30B3\u30FC\u30C9\u304C\u3042\u308A\u307E\u3059\u3002\u307E\u305A\u958B\u3044\u3066\u7167\u5408\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u3053\u306E\u30EA\u30FC\u30C9\u306F\u307E\u3060\u5909\u63DB\u3067\u304D\u307E\u3059\u3002\u3053\u308C\u306F\u767B\u9332\u6642\u306E\u81EA\u52D5\u5224\u5B9A\u3067\u3042\u308A\u3001\u62C5\u5F53\u8005\u306E\u7D50\u8AD6\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u305F\u3060\u3057\u540C\u3058\u76F8\u624B\u3067\u3042\u308C\u3070\u3001\u5909\u63DB\u305B\u305A\u4E0D\u9069\u683C\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u5909\u63DB\u3059\u308B\u3068\u540C\u3058\u76F8\u624B\u306B\u53D6\u5F15\u5148\u30FB\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u30FB\u5546\u8AC7\u304C\u3082\u3046\u4E00\u7D44\u4F5C\u6210\u3055\u308C\u307E\u3059\u3002", + "es-ES": "La captura encontr\xF3 que este prospecto coincide con un registro que ya existe. Gesti\xF3n de Duplicados, m\xE1s abajo, enlaza ese registro: \xE1bralo y comp\xE1relo. Todav\xEDa puede convertir este prospecto, porque se trata de una coincidencia autom\xE1tica de la captura y no del veredicto de una persona. Pero si es el mismo comprador, descalif\xEDquelo en su lugar: convertirlo crea una segunda cuenta, contacto y oportunidad para \xE9l." + } + } + }, + { + type: "record:alert", + id: "lead_duplicate_alert_confirmed", + label: "Confirmed Duplicate Alert", + properties: { + // `error`, and the level is the message: this is the state on which + // the app REFUSES the rep's next click, and the renderer gives + // `error` `role="alert"` / `aria-live="assertive"` rather than the + // polite `role="status"` every other level gets. ⛔ The severity is + // presentation only — what the app refuses was ruled by #1288 and + // shipped by PR #1555, and nothing here changes it. + severity: "error", + visible: P25`has(record.duplicate_status) && record.duplicate_status == "confirmed"`, + title: { + en: "Confirmed duplicate \u2014 conversion will be refused", + "zh-CN": "\u5DF2\u786E\u8BA4\u91CD\u590D\u2014\u2014\u8F6C\u6362\u5C06\u88AB\u62D2\u7EDD", + "ja-JP": "\u91CD\u8907\u78BA\u5B9A \u2014 \u5909\u63DB\u306F\u62D2\u5426\u3055\u308C\u307E\u3059", + "es-ES": "Duplicado Confirmado: la conversi\xF3n ser\xE1 rechazada" + }, + body: { + // ⭐ The only place a rep learns the Convert button will refuse + // them BEFORE they press it — until this banner, the refusal + // dialog was the first they heard of it. + en: "A reviewer checked this lead and recorded that it repeats a record this app already has, so Convert Lead refuses it \u2014 this banner is the only warning you get before you press the button. Disqualify this lead instead, naming the surviving record from Duplicate Management below. If the verdict is wrong, a reviewer revises Duplicate Status; there is no override here.", + "zh-CN": "\u5BA1\u6838\u4EBA\u5DF2\u6838\u5B9E\u8BE5\u7EBF\u7D22\u4E0E\u7CFB\u7EDF\u4E2D\u5DF2\u6709\u8BB0\u5F55\u91CD\u590D\uFF0C\u56E0\u6B64\u300C\u8F6C\u6362\u7EBF\u7D22\u300D\u4F1A\u62D2\u7EDD\u6267\u884C\u2014\u2014\u672C\u63D0\u793A\u662F\u4F60\u6309\u4E0B\u6309\u94AE\u524D\u552F\u4E00\u7684\u9884\u8B66\u3002\u8BF7\u6539\u4E3A\u53D6\u6D88\u8BE5\u7EBF\u7D22\u7684\u8D44\u683C\uFF0C\u5E76\u5728\u4E0B\u65B9\u300C\u91CD\u590D\u7EBF\u7D22\u7BA1\u7406\u300D\u4E2D\u6CE8\u660E\u4FDD\u7559\u7684\u90A3\u6761\u8BB0\u5F55\u3002\u82E5\u5224\u5B9A\u6709\u8BEF\uFF0C\u5E94\u7531\u5BA1\u6838\u4EBA\u4FEE\u6539\u300C\u91CD\u590D\u72B6\u6001\u300D\uFF0C\u6B64\u5904\u4E0D\u63D0\u4F9B\u5F3A\u5236\u8F6C\u6362\u7684\u5165\u53E3\u3002", + "ja-JP": "\u62C5\u5F53\u8005\u304C\u78BA\u8A8D\u3057\u3001\u3053\u306E\u30EA\u30FC\u30C9\u306F\u65E2\u5B58\u30EC\u30B3\u30FC\u30C9\u306E\u91CD\u8907\u3067\u3042\u308B\u3068\u8A18\u9332\u3055\u308C\u307E\u3057\u305F\u3002\u305D\u306E\u305F\u3081\u300C\u30EA\u30FC\u30C9\u5909\u63DB\u300D\u306F\u62D2\u5426\u3055\u308C\u307E\u3059\u3002\u3053\u306E\u901A\u77E5\u304C\u3001\u30DC\u30BF\u30F3\u3092\u62BC\u3059\u524D\u306B\u5F97\u3089\u308C\u308B\u552F\u4E00\u306E\u8B66\u544A\u3067\u3059\u3002\u3053\u306E\u30EA\u30FC\u30C9\u306F\u4E0D\u9069\u683C\u306B\u3057\u305F\u3046\u3048\u3067\u3001\u4E0B\u306E\u300C\u91CD\u8907\u7BA1\u7406\u300D\u3067\u6B8B\u3059\u30EC\u30B3\u30FC\u30C9\u3092\u660E\u8A18\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u5224\u5B9A\u304C\u8AA4\u3063\u3066\u3044\u308B\u5834\u5408\u306F\u62C5\u5F53\u8005\u304C\u300C\u91CD\u8907\u30B9\u30C6\u30FC\u30BF\u30B9\u300D\u3092\u4FEE\u6B63\u3057\u307E\u3059\u3002\u3053\u3053\u306B\u5F37\u5236\u5909\u63DB\u306E\u624B\u6BB5\u306F\u3042\u308A\u307E\u305B\u3093\u3002", + "es-ES": "Una persona verific\xF3 que este prospecto repite un registro que ya existe, por lo que Convertir Prospecto lo rechazar\xE1: este aviso es la \xFAnica advertencia antes de pulsar el bot\xF3n. Descalifique el prospecto e indique el registro que sobrevive desde Gesti\xF3n de Duplicados, m\xE1s abajo. Si el veredicto es incorrecto, una persona debe cambiar el Estado del Duplicado; aqu\xED no hay forma de forzar la conversi\xF3n." + } + } + }, + // Salesforce-style Highlights Panel: a horizontal strip of the + // most-important key facts directly under the header. Pulled out + // of the sidebar so it can use the full page width. + { + type: "record:highlights", + id: "lead_highlights", + label: "Key Information", + properties: { + fields: ["status", "rating", "lead_source", "owner_id", "email", "phone"] + } + }, + { + type: "record:path", + id: "lead_path", + label: "Lead Status Path", + properties: { + statusField: "status", + // `converted` is the terminal WIN state and must be on the path — + // without it the strip reads as if "Unqualified" were the goal, and + // a converted lead had no stage to light up at all. + stages: [ + { value: "new", label: "New" }, + { value: "contacted", label: "Contacted" }, + { value: "qualified", label: "Qualified" }, + { value: "converted", label: "Converted" }, + { value: "unqualified", label: "Unqualified" } + ] + } + } + ] + }, + { + name: "main", + width: "large", + components: [ + { + type: "page:tabs", + id: "main_tabs", + label: "Lead Information Tabs", + properties: { + // `type` → `tabStyle` (@objectstack/spec 17.0.0, #6776, ADR-0087 + // D2). Same three values; see the full note on `home.page.ts`. + tabStyle: "line", + position: "top", + items: [ + { + label: "Details", + icon: "info-circle", + children: [ + { + type: "record:details", + id: "lead_details", + label: "Lead Details", + properties: { + columns: "2", + // `layout` was REMOVED from `record:details` in + // @objectstack/spec 17.0.0 (#6946, ADR-0087 D2) and is + // deleted with no successor: its `auto` | `custom` + // semantics were never implemented. + // + // Every section is a GROUP REFERENCE (#806, maintainer + // ruling C, decision batch #21, 2026-09-03). `{ group }` + // names one of crm_lead's `fieldGroups`, and the renderer + // derives that section's members, label, icon and collapse + // state from the object (`deriveFieldGroupLayout`, + // ADR-0085 §5). Membership has ONE declaration site — the + // `group:` on each field in lead.object.ts — and this page + // curates only the ORDER, so a field added to a group shows + // up here with no edit to this file. ⛔ Do not enumerate + // `fields:` again, and do not restate a key the group owns + // (`name` / `label` / `icon` / `collapsible` / + // `defaultCollapsed`) beside `group`: the spec refuses both. + // + // ⛔ `sections` stays load-bearing. Omitting it renders an + // EMPTY Details tab, not a `fieldGroups` fallback (#806 R28 + // on 17.2.0, #1521); derivation is per section, through + // `group:`, never page-level. + // + // Measured on @objectstack/console 17.6.0 (#806 R70, + // headless Chromium, with a control leg; on 17.4.0 R61 + // measured this form crashing the component). What a + // group section does there is the renderer's, not ours: + // - it lays out its own column count (the page-level + // `columns` above does not reach it); + // - a group whose members are all empty renders nothing + // (`duplicates` on a clean lead), unless the section + // says `hideEmpty: false`; + // - members the highlights strip registered are dropped, + // so `assignment` (only `owner_id`) renders nothing on + // this page — the owner is in the strip; + // - a group declared `collapse: 'collapsed'` starts + // collapsed; changing that is a `fieldGroups` decision + // in lead.object.ts, not a key on this page. + // + // `hideEmpty: false` (#2003, the #1211 reasoning) sits on + // the groups whose every member a rep types and the + // create form asks for: `contact_info` (`mobile` and + // `website` once the strip takes `email` and `phone`), + // `address`, and `additional` (revenue, headcount, + // description, notes). Without it all three vanish on a + // fresh lead, so a rep cannot see what is left to fill. + // Not on `assignment`: its derived list is empty, and the + // renderer draws nothing for an empty list whatever + // `hideEmpty` says. Not on `duplicates`: the + // `lead_duplicate_check` hook writes it. + sections: [ + { group: "identity" }, + { group: "company_info" }, + { group: "contact_info", hideEmpty: false }, + // Do Not Call / Email Opt Out, right under the numbers + // a rep is about to dial (#806). + { group: "preferences" }, + { group: "qualification" }, + { group: "assignment" }, + { group: "address", hideEmpty: false }, + { group: "conversion" }, + // The LINK half of the duplicate banners (#1207): the + // group carries both survivor lookups, because + // `lead_duplicate_check` matches contacts before leads. + // On a clean lead every member is empty, so the section + // renders nothing. ⚠️ Not the highlights strip: + // `record:highlights` caps `fields` at 7 and holds 6. + { group: "duplicates" }, + // Description and Notes — kept last, where the page's + // Description section always sat. + { group: "additional", hideEmpty: false } + ] + } + } + ] + }, + { + label: "Related", + icon: "link", + children: [ + { + type: "page:accordion", + id: "related_accordion", + label: "Related Records", + properties: { + allowMultiple: true, + items: [ + { + label: "Tasks", + icon: "list-checks", + collapsed: false, + children: [ + { + type: "record:related_list", + id: "related_tasks", + label: "Tasks", + properties: { + objectName: "crm_task", + // crm_task links back through the polymorphic + // `related_to_lead` lookup; there is no `lead_id` + // column, so the old binding matched nothing and + // this list read "0" no matter how many follow-ups + // the rep had filed. + relationshipField: "related_to_lead", + columns: ["subject", "status", "priority", "due_date", "owner_id"], + sort: [ + { field: "due_date", order: "asc" } + ], + limit: 10, + title: "Open Tasks", + filter: [{ field: "status", operator: "not_equals", value: "completed" }], + showViewAll: true + } + } + ] + } + ] + } + } + ] + }, + { + label: "Activity", + icon: "clock", + children: [ + { + type: "record:activity", + id: "lead_activity", + label: "Activity Timeline", + properties: { + // `types` is keyed on FEED ITEM KIND, never on object name + // (#1209). The old `['crm_task']` was not one of the kinds + // the prop accepts, and nothing anywhere enforced that: the + // page schema's `properties` is an open bag + // (`z.record(z.string(), z.unknown())`) so the value was + // stored verbatim, and the renderer's own sanitiser drops + // members it does not recognise and then reads the EMPTY + // remainder as "no filter authored" — measured on the + // shipped bundle, `types: ['crm_task']`, `types: []` and + // omitting `types` all render the same unfiltered stream. + // That is why the tab showed `Created Lead` / `Updated + // Lead` audit rows, which the History tab already covers. + // + // What this component can actually show is `sys_activity` + // scoped to the record, through the renderer's own + // type map — measured, not inferred: + // + // sys_activity.type feed kind written by + // created/updated/… field_change platform audit + // system system platform + // completed task log_call / + // log_meeting / + // send_email + // scheduled (dropped) schedule_meeting + // + // So `task` is the kind that carries a rep's logged + // interactions, and it is the only reachable one worth + // filtering to. `event` is NOT added: it is a legal kind + // the prop accepts but no `sys_activity.type` maps to it, + // so it would be a declared value enforced by nothing. + // `scheduled` rows fall out of the map upstream — a + // platform gap, not something to work around here. + types: ["task"], + limit: 20, + // Load-bearing, not cosmetic: the renderer strips every + // `task` item BEFORE the `types` filter runs unless this is + // true, and `task` items are exactly the `completed` rows. + // `types: ['task']` with the old `showCompleted: false` + // renders an empty tab. + showCompleted: true + } + } + ] + }, + { + label: "History", + icon: "history", + children: [ + { + // `record:history` is the platform's own audit feed over the + // fields marked `trackHistory` (status / rating). Ownership + // moved to the platform's `owner_id` in #548, which carries no + // `trackHistory` flag — transfers land in the compliance audit + // log, not on this feed. + // The hand-rolled version queried an object named + // `field_history`, which this app does not define, so the + // tab could only ever render empty. + type: "record:history", + id: "lead_history", + label: "Field History", + properties: { + limit: 25 + } + } + ] + } + ] + } + } + ] + } + ], + // Make this the default page for leads + isDefault: true, + // ARIA accessibility + aria: { + ariaLabel: "Lead Detail Page", + ariaDescribedBy: "Detailed view of lead information with related records and activity" + } +}; + +// src/sales/pages/opportunity_detail.page.ts +var OpportunityDetailPage = { + name: "opportunity_detail_page", + label: "Opportunity Detail", + description: "Comprehensive opportunity detail page with path, highlights, details, and related lists", + type: "record", + object: "crm_opportunity", + template: "full-width", + kind: "full", + variables: [ + { name: "activeTab", type: "string", defaultValue: "details" } + ], + regions: [ + { + name: "header", + width: "full", + components: [ + { + type: "page:header", + id: "opp_header", + label: "Opportunity Information", + properties: { + title: "{name}", + // The lookup field is `crm_account` — `{account}` matched nothing + // and the subtitle rendered blank. + subtitle: "{crm_account}", + // `icon` removed from `page:header` in @objectstack/spec 17.0.0 + // (#6946, ADR-0087 D2) — deleted, not renamed. See the full note on + // `account_detail.page.ts`; nothing ever drew it. + // `breadcrumb` retired from `page:header` in @objectstack/spec 17.6.0 + // (#20785, `page-header-breadcrumb-removed`) — deleted: no renderer + // ever drew a trail for it; the app shell's own trail is unchanged. + // generate_quote is the CPQ entry point (opportunity → quote); a + // custom record page replaces the default header, so the action + // must be listed here explicitly or it is unreachable. The same + // sentence is why the three activity actions are named here (#592): + // without them a rep can log a call on the deal only from the list + // row's ⋮ menu, never from the deal itself. + // + // Action IDs, not `ActionDef` objects: `PageHeaderProps.actions` is + // `z.array(z.string())` ("Action IDs to show in header") in + // @objectstack/spec 17.3.0, and this repo authors against the + // protocol (#1653). Each id is the `name` of a + // crm_opportunity-scoped action — `generate_quote` / + // `clone_opportunity` in `src/sales/actions/opportunity.actions.ts`, the + // activity trio in `src/sales/actions/activity-actions.ts`. + actions: [ + "generate_quote", + "clone_opportunity", + "log_call", + "log_meeting", + "schedule_meeting" + ] + } + }, + { + type: "record:highlights", + id: "opp_highlights", + label: "Key Information", + properties: { + fields: ["amount", "close_date", "probability", "expected_revenue", "owner_id", "crm_account"] + } + }, + { + type: "record:path", + id: "opp_stage_path", + label: "Opportunity Stage Path", + properties: { + statusField: "stage", + // Every canonical value of `stage` must appear here, in funnel + // order — the path is the only place a rep reads "where is this + // deal". `needs_analysis` was missing, so a deal sitting in that + // stage lit up NO step at all and the strip read as if the deal + // had skipped from Qualification to Proposal. The two terminal + // stages stay last (won before lost), matching lead_detail's + // converted/unqualified tail. + stages: [ + { value: "prospecting", label: "Prospecting" }, + { value: "qualification", label: "Qualification" }, + { value: "needs_analysis", label: "Needs Analysis" }, + { value: "proposal", label: "Proposal" }, + { value: "negotiation", label: "Negotiation" }, + { value: "closed_won", label: "Closed Won" }, + { value: "closed_lost", label: "Closed Lost" } + ] + } + } + ] + }, + { + name: "main", + width: "large", + components: [ + { + type: "page:tabs", + id: "opp_main_tabs", + properties: { + // `type` → `tabStyle` (@objectstack/spec 17.0.0, #6776, ADR-0087 + // D2). Same three values; see the full note on `home.page.ts`. + tabStyle: "line", + position: "top", + items: [ + { + // Tab item `key` → `value` (#1269): `value` is the stable + // `?tab=` URL token the renderer reads, `key` is read by + // nothing. See the full note on `case_detail.page.ts`. + value: "details", + label: "Details", + children: [ + { + type: "record:details", + id: "opp_details", + label: "Opportunity Details", + properties: { + // `columns` is a STRING enum ('1'|'2'|'3'|'4') in + // @objectstack/spec 17. `layout` is gone (removed in spec + // 17.0.0, #6946 / ADR-0087 D2). + columns: "2", + // Every section references one of crm_opportunity's + // `fieldGroups` (#1452, the #806 class ruling C): the + // renderer derives members, label, icon and collapse state + // from the object, so this page curates only the order. + // The full note — what a group section does on 17.6.0 and + // what may not sit beside `group` — is on + // `lead_detail.page.ts`. + // + // The highlights strip still wins (#1211): the renderer + // drops every field `record:highlights` registered, and the + // record title, from the derived members. So `basic` shows + // `primary_contact` only, and `financials` (`amount`, + // `expected_revenue`, both in the strip) renders nothing + // here — it stays referenced so that a field added to the + // group reaches this tab without an edit to this file. + // + // `hideEmpty: false` keeps an ALL-empty section on screen + // (#1211). The platform default (objectui#8603 ruling A) + // renders such a section as nothing at all, so on a deal + // with only its required fields the deal's type and + // source (`classification`), its campaign (`campaign`) + // and its description and next step (`notes`) vanished — + // the very fields a seller fills in later. Kept, they + // show as labelled empty rows to fill. Measured on + // 17.6.0 on such a deal: 2 sections render without it, 5 + // with it. Not on `basic` (its only member outside the + // title and the strip is `primary_contact`), nor on + // `financials`: both members sit in the strip, the + // derived list is empty, and the renderer draws nothing + // for an empty list whatever `hideEmpty` says. + // + // `qualification` and `narrative` (REQ-0006) sit right + // after `sales_process`, the order the object declares + // them in, and both keep `hideEmpty: false` on the same + // reasoning: every member is a judgement or a piece of + // prose the seller is expected to write (bid / no-bid, + // controllability, priority, deal level, subcontracting; + // the four narrative fields), none sits in the strip, and + // no deal that predates REQ-0006 carries any of them — so + // without the key both sections vanish on every existing + // deal, which is exactly where a seller would fill them. + sections: [ + { group: "basic" }, + { group: "financials" }, + { group: "classification", hideEmpty: false }, + { group: "campaign", hideEmpty: false }, + { group: "sales_process" }, + { group: "qualification", hideEmpty: false }, + { group: "narrative", hideEmpty: false }, + { group: "crm_forecast" }, + { group: "notes", hideEmpty: false } + ] + } + } + ] + }, + { + value: "related", + label: "Related", + children: [ + { + type: "page:accordion", + id: "opp_related_accordion", + properties: { + items: [ + { + // Accordion item `key` is DELETED, not renamed to + // `value` — the opposite verdict to the tab items + // above, because this renderer overwrites `value` with + // `panel-`. See the full note on + // `case_detail.page.ts`. + label: "Quotes", + // OPEN on arrival (#1214 item 6). All three panels + // used to start shut, so the Related tab opened on + // three closed bars whose headers already carried the + // counts — the click bought the user nothing the page + // had not already told them. + // + // `collapsed: false` is the whole mechanism, and it is + // needed even though the schema DEFAULTS it to false: + // the renderer opens the panels it finds by strict + // identity — `items.filter(i => i.collapsed === false)` + // — so an item that simply omits the key is + // `undefined`, not `false`, and stays shut. Measured + // on the @objectstack/console 17.3.0 bundle — the pin + // at that taking, ⛔ NOT re-taken on 17.4.0 + // (#1814, #1807) or 17.5.0 — + // and the component's own designer text says the same + // ("collapsed: false opens a panel by default"). + // + // ⚠️ ONLY the first panel, and that is the renderer's + // choice rather than a preference: with `allowMultiple` + // absent (it defaults false) the accordion mounts as + // `type="single"` and takes `defaultValue={open[0]}` — + // one panel, the first in declaration order. Marking + // Products or Open Tasks too would change nothing on + // screen. Opening more than one means declaring + // `allowMultiple: true`, which changes the interaction + // model (panels stop closing each other) and is not + // this card's ask. + // + // ⛔ NOT "default-open the sections that have rows", + // which the card asked for first: that is not + // expressible here. `collapsed` is a static boolean on + // a strict item shape (`label` / `icon` / `collapsed` / + // `children` — nothing else parses), the page is + // authored metadata evaluated before any row is read, + // and the related lists below fetch their own rows + // after mount. Reported rather than worked around; ⛔ + // the component is not this repo's to change. + collapsed: false, + children: [ + { + type: "record:related_list", + id: "opp_quotes", + properties: { + objectName: "crm_quote", + relationshipField: "crm_opportunity", + columns: ["quote_number", "name", "status", "total_price", "expiration_date"], + limit: 10 + } + } + ] + }, + { + label: "Products", + children: [ + { + type: "record:related_list", + id: "opp_products", + properties: { + objectName: "crm_opportunity_line_item", + relationshipField: "crm_opportunity", + columns: ["crm_product", "quantity", "unit_price", "total_price"], + limit: 10, + // The entry point that was missing (#1731). Every + // OTHER surface already treated line items as + // live — three profiles grant `allowCreate`, the + // docs describe the amount rolling up from them, + // and `billing-handoff.flow.ts`'s + // `load_line_items` reads them on every won deal + // — while nothing in the app could create one: + // no action, no list view, no navigation entry, + // no seed. A rep who wanted to itemise a deal had + // to type the Amount by hand. Declared surface and + // reachable surface now coincide again. + // + // What `add` writes is the whole reason a picker + // is sufficient here. It creates a row carrying + // exactly two authored keys — + // `{ [relationshipField]: , + // [linkField]: }` — and + // nothing else. On this object that would leave + // `quantity` and `unit_price` unset, and both are + // `required` + `storage.notNull`, so the insert + // would be refused. It is not, because the two + // gaps are already filled by machinery that + // predates this list: + // + // quantity -> the field's own `defaultValue: 1` + // unit_price -> `_line-item-price-fill.ts`, which + // on `beforeInsert` stamps + // `list_price` from the chosen + // product and defaults the + // negotiated `unit_price` to it + // discount -> the field's own `defaultValue: 0` + // total_price-> the formula over the three above + // + // and `crm_product.list_price` is itself `required` + // + `notNull`, so the hook can never fail to find a + // source. Measured end-to-end, not reasoned: + // `test/opportunity-line-item-add-picker.test.ts` + // inserts the picker's exact two-key shape and + // asserts the complete priced row, with an ablation + // that unbinds the hook and shows the same insert + // rejected as "Sales Price is required" — so the + // assertion cannot pass vacuously. + // + // ⛔ Do not add a `label`. The button falls back to + // the platform's own localized "Add"; the + // translation bundles reach a page component through + // `pages..components.`, which carries + // `label`/`title`/`description` for the COMPONENT + // and has no route to a nested `add.label`. A + // hand-authored string here would ship English into + // the zh-CN / es-ES / ja-JP bundles with no key to + // translate it under. + // + // `valueField` and `labelField` are both omitted on + // purpose rather than restated: `valueField` + // defaults to `id`, which is what the `crm_product` + // lookup stores, and `labelField` defaults to the + // picked object's own title field — `crm_product` + // declares `nameField: 'display_title'` (ADR-0079), + // so the picker labels rows "PRD-0001 - Widget" and + // keeps ONE source of truth for a product's title. + // That formula title is searchable only because the + // object also declares `searchableFields`, which it + // already does for exactly this reason. + add: { + picker: { + object: "crm_product", + // A retired product must not be sellable onto a + // new deal. `product.hook.ts`'s `beforeDelete` + // defines retirement as precisely this flag + // ("Set is_active=false to retire instead"), + // so the catalog's own retirement mechanism is + // what scopes the picker. All 13 seeded + // products carry `is_active: true`, so this + // narrows without emptying. + filter: [{ field: "is_active", operator: "equals", value: true }] + }, + linkField: "crm_product" + } + } + } + ] + }, + { + label: "Open Tasks", + children: [ + { + type: "record:related_list", + id: "opp_tasks", + properties: { + objectName: "crm_task", + relationshipField: "related_to_opportunity", + columns: ["subject", "status", "priority", "due_date", "owner_id"], + filter: [{ field: "status", operator: "not_equals", value: "completed" }], + limit: 10 + } + } + ] + } + ] + } + } + ] + }, + { + value: "activity", + label: "Activity", + children: [ + { + type: "record:activity", + id: "opp_activity", + /** + * `filters` is deleted with nothing put in its place, and + * that is the whole finding (#1269). + * + * It used to read `['all', 'tasks', 'meetings', 'calls', + * 'emails']` — a vocabulary that exists nowhere in the + * contract. `RecordActivityProps` has exactly two filter + * channels and neither takes that list: + * + * `types` — an array of FEED ITEM KINDS + * (`comment` | `field_change` | `task` | + * `event` | `email` | `call` | …). Not + * these values: `all` is not a kind and + * `meetings` is not one either (the kind + * is `event`), and all five are plural + * where the enum is singular. + * `filterMode` — ONE default for the panel's dropdown, + * from `all` | `comments_only` | + * `changes_only` | `tasks_only`. The + * dropdown's option list is the renderer's, + * not authorable. + * + * So the list was reaching for a third thing — "offer these + * filter chips" — that the component does not expose. What + * it wanted is already delivered: `showFilterToggle` + * defaults on, so the panel renders its filter dropdown, and + * `filterMode` defaults to `all`, so it opens unfiltered. + * Neither is restated here, because materializing a default + * turns "the author said nothing" into "the author asked for + * the default" — a different fact, and the one a later + * liveness audit reads. + * + * Mapping it onto `types` instead was considered and + * rejected: #1209 corrected exactly that mistake one page + * over (the lead timeline's `types: ['crm_task']`), and the + * renderer sanitises out-of-enum members then reads the + * EMPTY remainder as "no filter authored" — so a bad `types` + * is indistinguishable from no `types` on screen while + * claiming otherwise in source. A `types` here would also + * be a NEW restriction nobody asked for: it would drop + * comments and field changes from a timeline that shows them + * today. + */ + properties: { + limit: 25, + // Load-bearing (#2071): a call or meeting logged on the + // deal is a `sys_activity` row of type `completed` (the + // `task` feed kind), and the renderer drops every such + // row unless this is true — so a rep's logged call never + // reached this tab. The deal's other `completed` writers + // are its own won / lost milestones + // (`opportunity.object.ts`), which belong here too. + // Completed crm_task rows do NOT arrive: their audit rows + // are keyed to the task, and this feed reads only rows + // keyed to the deal. Nor is this the `types` restriction + // the note above refuses: it adds rows and filters none. + showCompleted: true + } + } + ] + } + ] + } + } + ] + }, + { + name: "aside", + width: "small", + components: [ + { + type: "record:reference_rail", + id: "opp_reference_rail", + properties: { + /** + * No entry declares a `title` — deliberately (#972). + * + * The rail resolves a card's heading as + * `entry.title || i18n.objectLabel({ name: objectName, … })`, so a + * literal `title` does not merely provide a default: it WINS, and + * the locale bundle is never consulted. The three literals that + * used to sit here (`Quotes` / `Products` / `Open Tasks`) therefore + * printed English into every one of the four locales this app + * ships, on top of `objects..label` already being translated + * in all of them. Dropping them hands the heading back to the + * translation bundle — the single source of truth for what an + * object is called — so a locale added later is covered for free. + * + * A translated literal is not available as an alternative: unlike + * `record:alert`, whose `title` is run through the inline + * translation-map resolver, the rail renders `entry.title` as a + * raw React child. An `{ en, 'zh-CN' }` map here would not be + * resolved — it would be handed to React as an object. + * + * The third card losing the word "Open" is a correction, not a + * casualty. A rail entry has no filter at all — the rail queries + * `{ $filter: { [relationshipField]: parentId }, $top: limit }` and + * reads nothing else — so that card always counted and listed this + * deal's tasks whatever their status. The heading claimed a filter + * the component cannot apply. The genuinely filtered view is the + * `opp_tasks` related list on the *Related* tab above, which does + * carry `status neq completed`. + * + * Pinned by `test/metadata-references.test.ts` (entries resolve, + * no literal titles) and `test/i18n-references.test.ts` (every + * rail object has a `label` in every locale, so the fallback + * lands on a translation rather than on a humanized object name). + */ + entries: [ + { + objectName: "crm_quote", + relationshipField: "crm_opportunity", + limit: 3 + }, + { + objectName: "crm_opportunity_line_item", + relationshipField: "crm_opportunity", + limit: 3 + }, + { + objectName: "crm_task", + relationshipField: "related_to_opportunity", + limit: 3 + } + ] + } + } + ] + } + ], + isDefault: true, + aria: { + ariaLabel: "Opportunity Detail Page", + ariaDescribedBy: "Detailed view of opportunity information with related records and activity" + } +}; + +// src/sales/pages/account_detail.page.ts +var AccountDetailPage = { + name: "account_detail_page", + label: "Account Detail", + description: "Slotted account record page \u2014 custom header + persistent discussion feed.", + type: "record", + object: "crm_account", + kind: "slotted", + regions: [], + slots: { + header: { + type: "page:header", + id: "account_header_slotted", + label: "Account Header (slotted)", + properties: { + title: "{name}", + subtitle: "{industry} \xB7 {type}", + // `icon` and `eyebrow` are GONE, and for two different reasons — both + // measured against the contract rather than inferred from the warning + // text (#1269). + // + // `icon` was REMOVED from `page:header` in @objectstack/spec 17.0.0 + // (#6946, ADR-0087 D2). It is deleted rather than renamed because no + // renderer ever read it: objectui resolves `icon` per header ACTION + // (`action.icon`) and never off the header's own props bag, and the + // component registry never published it as an input — which is what put + // the key in objectui's `UNPUBLISHED_EXEMPTIONS` as a "spec declares it, + // NO renderer read point" entry. The header's own identity comes from + // the record chrome (`recordChrome`, on by default). + // + // `eyebrow` was never declared by anything. It is not in + // `PageHeaderProps`, it has no alias or tombstone there, and the string + // "eyebrow" does not occur anywhere in objectui — no schema, no + // registry input, no renderer. So the ACCOUNT kicker this page's + // docblock used to promise has never reached a screen: the props bag is + // `z.record(z.string(), z.unknown())`, so the key was carried into the + // artifact and dropped at render. Deleting it changes nothing a user + // sees; it only stops the source claiming a kicker exists. + // `breadcrumb` retired from `page:header` in @objectstack/spec 17.6.0 + // (#20785, `page-header-breadcrumb-removed`) — deleted: no renderer + // ever drew a trail for it; the app shell's own trail is unchanged. + // Overriding the `header` slot REPLACES the synthesized header, actions + // and all — so this slot has to re-state every action it wants to keep. + // Before #592 it named none, which is why an account record showed no + // activity buttons at all while the list row's ⋮ menu showed three. + // + // Action IDs, not `ActionDef` objects: `PageHeaderProps.actions` is + // `z.array(z.string())` ("Action IDs to show in header") in + // @objectstack/spec 17.3.0, and this repo authors against the protocol + // (#1653). Each id is the `name` of a crm_account-scoped action in + // `src/sales/actions/activity-actions.ts`. + actions: ["log_call", "log_meeting", "schedule_meeting"] + } + }, + discussion: { + type: "record:chatter", + id: "account_chatter", + label: "Discussion", + /** + * One `feed`, for one reason: `showCompleted` (#2071). + * + * This feed IS the account's activity timeline — the slotted page + * synthesizes no Activity tab, so the panel's "All Activity" stream is + * where an account's `sys_activity` rows surface. A call or meeting + * logged on the account is a row of type `completed` (the `task` feed + * kind), and the timeline drops every such row unless + * `feed.showCompleted` is true — so Log a Call / Log a Meeting on an + * account wrote a row that appeared nowhere on the account. + * + * Authoring a `feed` costs two more keys, and they are stated rather + * than left out. `RecordChatterRenderer` builds `{ position: 'bottom', + * collapsible: false, feed: { enableReactions: true, enableThreading: + * true, showCommentInput: true }, ...schema }` — one shallow spread — so + * a `feed` of our own REPLACES that default object wholesale, and + * `RecordActivityTimeline` reads `enableReactions ?? false` and + * `enableThreading ?? false` off what is left. Without the two keys + * below, reactions and threading would silently switch off. + * `showCommentInput` needs no restating: the timeline reads it as + * `!== false`. + * + * `feed.enableMentions` needs none either: the renderer reads it as + * `!== false` too. And the older note still holds (#1269): + * `enableComments` and a top-level `enableReactions` / `enableMentions` + * are not `record:chatter` keys — `RecordChatterProps` declares + * `position`, `width`, `collapsible`, `defaultCollapsed`, `feed` and + * `aria`, nothing else. + */ + properties: { + feed: { + showCompleted: true, + enableReactions: true, + enableThreading: true + } + } + } + } +}; + +// src/sales/pages/account_workbench.page.ts +var AccountWorkbenchPage = { + name: "account_workbench", + label: "Account Workbench", + description: "Curated account list for the sales team: quick filters only, no view management.", + type: "list", + object: "crm_account", + kind: "full", + template: "default", + isDefault: false, + // Interface pages carry no regions — the list surface is generated from + // `interfaceConfig` (ADR-0047), not composed from components. + regions: [], + interfaceConfig: { + source: "crm_account", + sourceView: "all_accounts", + ...{ + userFilters: { + element: "dropdown", + fields: [ + { field: "industry", showCount: true }, + { field: "type" }, + { field: "owner_id" } + ] + } + // typed via spread-as-any until @objectstack/spec ships ADR-0047 + // (UserFiltersSchema is in framework main, > 9.2.0) + }, + appearance: { + showDescription: true, + allowedVisualizations: ["grid"] + }, + userActions: { + sort: true, + search: true, + filter: false, + rowHeight: false, + addRecordForm: false + }, + showRecordCount: true + } +}; + +// src/sales/pages/home.page.ts +var embeddedListView = (id, objectName, views, viewKey) => { + const view = views.listViews?.[viewKey]; + if (!view) throw new Error(`home.page.ts: no saved view "${viewKey}" on ${objectName}`); + return { + type: "list-view", + id, + label: view.label, + properties: { + objectName, + viewType: "grid", + columns: view.columns, + filter: view.filter, + sort: view.sort + } + }; +}; +var SalesHomePage = { + name: "sales_home_page", + label: "Sales Home", + description: "Sales team home page with key metrics and quick actions", + type: "home", + template: "three-column", + kind: "full", + variables: [ + { + name: "selectedPeriod", + type: "string", + defaultValue: "this_month" + } + ], + regions: [ + { + name: "header", + width: "full", + components: [ + { + type: "page:header", + id: "home_header", + label: "Sales Home Header", + properties: { + title: "Sales Dashboard", + // Was `Welcome back, {current_user.first_name}`, which rendered as + // "Welcome back, " — the name was never going to arrive, because + // that one string mixes three vocabularies that do not compose: + // + // 1. `subtitle` is an `I18nLabel` (`ComponentPropsMap`, + // `@objectstack/spec/ui`) — a display string or an inline + // locale map, resolved by `resolveI18nLabel`. The field has no + // token pass and no expression pass of its own. + // 2. Braces DO resolve in a page header, but the vocabulary is the + // BOUND RECORD's own fields — `case_detail.page.ts` records the + // measurement, where `{account}` matched no field and the + // subtitle rendered blank until it was spelled `{crm_account}`. + // A `type: 'home'` page has no record, so no brace token can + // ever resolve here. + // 3. `current_user.first_name` is a CEL path, and CEL is written + // bare, never inside `{…}`. The one resolvable brace token in + // the filter vocabulary is `{current_user_id}` on its own. + // + // A greeting that names the user is not expressible on a + // translatable label, so the label now says the part that is true + // in every locale and the four bundles carry the translations + // (`pages.sales_home_page.subtitle`). Personalising it would need a + // component that takes user data — no shipped component does + // (`user:profile` and its neighbours are `emptyProps` rows), so + // this is a static greeting rather than a widened accept surface. + subtitle: "Welcome back" + // `icon` removed from `page:header` in @objectstack/spec 17.0.0 + // (#6946, ADR-0087 D2) — deleted, not renamed. See the full note on + // `account_detail.page.ts`; nothing ever drew it. + // `breadcrumb` retired from `page:header` in @objectstack/spec 17.6.0 + // (#20785, `page-header-breadcrumb-removed`) — deleted: no renderer + // ever drew a trail for it; the app shell's own trail is unchanged. + } + } + ] + }, + { + name: "left_sidebar", + width: "small", + components: [ + { + type: "page:card", + id: "quick_create", + label: "Quick Create", + properties: { + title: "Quick Create", + bordered: true, + children: [ + { + type: "nav:menu", + id: "create_menu", + properties: {} + } + ] + } + } + // There is no `Recent Items` card here any more, and re-adding one + // needs a data source that does not exist yet. + // + // It shipped as a `page:card` with a title and no body: a bordered box + // with the words "Recent Items" and nothing under them, on the landing + // page of every `sales_rep` / `sales_manager`. "Recent" is per-user + // access history across objects, and the platform publishes no source + // for it on 17.1.0 — `ComponentPropsMap` has no recent-records + // component, and the two that sound like one (`record:activity`, + // `record:history`) both read the page's BOUND RECORD, which a home + // page does not have. Binding it to one object's list view instead + // would have made the title lie, which is the defect #771 exists to + // prevent, so the card is removed rather than filled with something + // that is not recency. Recorded as #1217; when the platform ships a + // recent-records source, this is where the card goes back. + ] + }, + { + name: "main", + width: "large", + components: [ + { + type: "page:card", + id: "key_metrics", + label: "Key Metrics", + properties: { + title: "Key Performance Indicators", + bordered: false, + // `record:highlights` needs a bound record and real fields; a home + // page has neither, and the four names it listed (total_revenue, + // deals_won, …) exist on no object — the card rendered blank. + // `object-metric` widgets aggregate live data instead. + children: [ + { + type: "object-metric", + id: "kpi_revenue_won", + properties: { + objectName: "crm_opportunity", + label: "Revenue (Won)", + icon: "dollar-sign", + aggregate: { field: "amount", function: "sum" }, + filter: [{ field: "stage", operator: "equals", value: "closed_won" }] + } + }, + { + type: "object-metric", + id: "kpi_deals_won", + properties: { + objectName: "crm_opportunity", + label: "Deals Won", + icon: "trophy", + aggregate: { field: "id", function: "count" }, + filter: [{ field: "stage", operator: "equals", value: "closed_won" }] + } + }, + { + type: "object-metric", + id: "kpi_pipeline_value", + properties: { + objectName: "crm_opportunity", + label: "Pipeline Value", + icon: "briefcase", + aggregate: { field: "amount", function: "sum" }, + filter: [{ field: "stage", operator: "not_in", value: ["closed_won", "closed_lost"] }] + } + }, + { + type: "object-metric", + id: "kpi_open_leads", + properties: { + objectName: "crm_lead", + label: "Open Leads", + icon: "user-plus", + aggregate: { field: "id", function: "count" }, + filter: [{ field: "is_converted", operator: "equals", value: false }] + } + } + ] + } + }, + { + type: "page:tabs", + id: "home_tabs", + label: "Home Tabs", + properties: { + /** + * `type` → `tabStyle` (@objectstack/spec 17.0.0, #6776, ADR-0087 + * D2). The concept and the value vocabulary (`line` | `card` | + * `pill`) are unchanged; only the spelling moved, because a props + * key named `type` collides with the page component's own dispatch + * key: objectui's `SchemaRenderer` hoists `properties` onto the node + * but deliberately skips `type` and `id` (or the inner value would + * shadow which renderer to dispatch to), and `sdui-parser` lists + * `type` in `BASE_PROPS`, so a manifest input by that name is never + * validated at all. + * + * Renaming is behaviour-preserving on this page and on the three + * record pages: the renderer resolves + * `schema?.properties?.type || schema?.tabStyle || 'line'`, so it + * has been honouring the retired spelling as a back-compat read all + * along and picks up the canonical one through the same hoist. + */ + tabStyle: "card", + position: "top", + items: [ + { + label: "My Leads", + icon: "user-plus", + children: [embeddedListView("home_my_leads", "crm_lead", LeadViews, "my_leads")] + }, + { + // Was "My Opportunities", which promises every deal I own; the + // view behind it is the open-pipeline one (the nav's My Work > + // My Deals opens the same `my_open_deals`). The tab name now + // says what the panel shows. + label: "My Open Deals", + icon: "dollar-sign", + children: [embeddedListView("home_my_deals", "crm_opportunity", OpportunityViews, "my_open_deals")] + }, + { + // Same correction: `my_open_tasks` excludes completed tasks. + label: "My Open Tasks", + icon: "list-checks", + children: [embeddedListView("home_my_tasks", "crm_task", TaskViews, "my_open_tasks")] + } + ] + } + } + ] + }, + { + name: "right_sidebar", + width: "medium", + components: [ + { + type: "page:card", + id: "ai_briefing", + // The assistant is the PLATFORM's (`ask`), not an app-owned persona: + // HotCRM contributes skills, the agent lives in the cloud side + // (maintainer ruling on #612, 2026-08-04). The retired `sales_copilot` + // agent (#512, ADR-0063 §2) must not be named in live UI copy — and + // the entry point is the assistant panel the platform opens from the + // right edge of every page, which is the wording + // `content/docs/ai-copilot/index.mdx` landed in #611/PR #1001. + label: "Today with the AI Assistant", + properties: { + title: "Ask the AI Assistant", + bordered: true, + // The paragraph is an `element:text` child (#1581). It used to be + // `properties.description`, which `page:card` does not declare, so + // the card rendered as a title over nothing. `content` is not on + // the locale pack's page-component face, so the four languages + // live here as an inline locale map, the spec's route for page + // prose. The #1002 persona guard in + // `test/metadata-references.test.ts` reads this child. + children: [ + { + type: "element:text", + id: "ai_briefing_text", + properties: { + content: { + en: 'Open the assistant panel from the right edge of the page and ask "what should I focus on today?" \u2014 it sees your live pipeline, schema, and accounts.', + "zh-CN": '\u4ECE\u9875\u9762\u53F3\u4FA7\u6253\u5F00\u52A9\u624B\u9762\u677F\uFF0C\u8BE2\u95EE"\u6211\u4ECA\u5929\u5E94\u8BE5\u5173\u6CE8\u4EC0\u4E48\uFF1F"\u2014\u2014\u5B83\u53EF\u4EE5\u5B9E\u65F6\u67E5\u770B\u60A8\u7684\u9500\u552E\u7BA1\u9053\u3001\u67B6\u6784\u4E0E\u5BA2\u6237\u4FE1\u606F\u3002', + "es-ES": 'Abra el panel del asistente desde el borde derecho de la p\xE1gina y pregunte "\xBFen qu\xE9 deber\xEDa concentrarme hoy?" \u2014 ve su flujo de ventas, esquema y cuentas en tiempo real.', + "ja-JP": "\u30DA\u30FC\u30B8\u53F3\u7AEF\u304B\u3089\u30A2\u30B7\u30B9\u30BF\u30F3\u30C8\u30D1\u30CD\u30EB\u3092\u958B\u304D\u3001\u300C\u4ECA\u65E5\u306F\u4F55\u306B\u96C6\u4E2D\u3059\u3079\u304D\u304B\uFF1F\u300D\u3068\u5C0B\u306D\u3066\u304F\u3060\u3055\u3044 \u2014 \u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u306E\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u3001\u30B9\u30AD\u30FC\u30DE\u3001\u53D6\u5F15\u5148\u60C5\u5831\u3092\u628A\u63E1\u3057\u3066\u3044\u307E\u3059\u3002" + } + } + } + ] + } + }, + { + type: "page:card", + id: "upcoming_events", + // Was `Calendar` / "Today's Schedule" over an empty bordered box — + // the card declared no body, so the renderer had nothing to draw. + // + // It is bound to `crm_event`'s saved `upcoming_events` view, read off + // the view exactly like the tabs above, and the name now matches what + // the panel shows. "Today's Schedule" is NOT what any existing view + // says: `my_events` is scoped to the current user but carries no date + // filter, no sort and no date column (27 seeded rows, mostly `held` + // interactions from the past), while `upcoming_events` is + // `status: 'planned'` sorted by `start_datetime` ascending with the + // date on the row. Narrowing either one to today would mean retyping + // a filter in this page — the second definition the helper above + // exists to prevent — so the title says "upcoming" instead of + // promising a day this page cannot compute. + label: "Upcoming Events", + properties: { + title: "Upcoming Events", + bordered: true, + children: [embeddedListView("home_upcoming_events", "crm_event", EventViews, "upcoming_events")] + } + } + ] + } + ], + isDefault: true, + aria: { + ariaLabel: "Sales Home Page", + ariaDescribedBy: "Sales team home page with metrics, leads, and quick actions" + } +}; + +// src/sales/pages/app_launcher.page.ts +var AppLauncherPage = { + name: "app_launcher_page", + label: "App Launcher", + description: "Central hub for accessing all applications", + type: "app", + template: "centered", + kind: "full", + regions: [ + { + name: "header", + width: "full", + components: [ + { + type: "global:search", + id: "app_search", + label: "Search Apps", + properties: {} + } + ] + }, + { + name: "main", + width: "large", + components: [ + { + type: "page:header", + id: "launcher_header", + label: "App Launcher Header", + properties: { + title: "App Launcher", + subtitle: "Select an app to get started" + // `icon` removed from `page:header` in @objectstack/spec 17.0.0 + // (#6946, ADR-0087 D2) — deleted, not renamed. See the full note on + // `account_detail.page.ts`; nothing ever drew it. + // `breadcrumb` retired from `page:header` in @objectstack/spec 17.6.0 + // (#20785, `page-header-breadcrumb-removed`) — deleted: no renderer + // ever drew a trail for it; the app shell's own trail is unchanged. + } + }, + { + type: "app:launcher", + id: "app_grid", + label: "Application Grid", + properties: {} + } + ] + } + ], + isDefault: false, + aria: { + ariaLabel: "App Launcher Page", + ariaDescribedBy: "Central application launcher for accessing all apps" + } +}; + +// src/sales/pages/utility_bar.page.ts +var UtilityBarPage = { + name: "utility_bar_page", + label: "Utility Bar", + description: "Quick access utility bar with floating tools", + type: "utility", + template: "utility-bar", + kind: "full", + regions: [ + { + name: "utilities", + width: "full", + components: [ + { + type: "global:notifications", + id: "notifications_panel", + label: "Notifications", + properties: {} + }, + { + type: "page:card", + id: "quick_notes", + label: "Quick Notes", + properties: { + title: "Quick Notes", + bordered: true + } + }, + { + type: "global:search", + id: "quick_search", + label: "Quick Search", + properties: {} + } + ] + } + ], + isDefault: false, + aria: { + ariaLabel: "Utility Bar", + ariaDescribedBy: "Quick access utility bar with floating tools and notifications" + } +}; + +// src/sales/email-templates/index.ts +var email_templates_exports = {}; +__export(email_templates_exports, { + SalesEmailTemplates: () => SalesEmailTemplates +}); + +// src/sales/email-templates/en.ts +var en3 = { + "crm.account_approved": { + label: "Account Approved", + subject: "Account approved: {{name}}", + bodyHtml: "

This account has been signed off and is now established data.

" + }, + "crm.account_rejected": { + label: "Account Not Approved", + subject: "Account not approved: {{name}}", + bodyHtml: "

This account was not signed off. Correct its details and ask for another review.

" + }, + "crm.contact_welcome": { + label: "New Contact", + subject: "New contact: {{first_name}} {{last_name}}", + bodyHtml: "

{{first_name}} {{last_name}} was added as a contact. Reach out to welcome them.

" + }, + "crm.deal_stalled": { + label: "Stalled Deal", + subject: "Stalled deal: {{name}}", + bodyHtml: "

Opportunity {{name}} has sat in {{stage}} for {{days_in_stage}} days. Time to advance or re-qualify it.

" + }, + "crm.large_deal_won": { + label: "Large Deal Won", + subject: "Large deal won: {{name}}", + bodyHtml: "

{{name}} closed at {{amount}}. Congratulations to the team.

" + }, + "crm.lead_conversion_approved": { + label: "Lead Approved for Conversion", + subject: "Lead approved for conversion: {{first_name}} {{last_name}}", + bodyHtml: "

This lead has been signed off. You can convert it into an account, contact and opportunity.

" + }, + "crm.lead_conversion_rejected": { + label: "Lead Not Approved", + subject: "Lead not approved: {{first_name}} {{last_name}}", + bodyHtml: "

Conversion of this lead was not approved. Keep working it, or disqualify it with a reason.

" + }, + "crm.lead_converted": { + label: "Lead Converted", + subject: "Lead converted: {{first_name}} {{last_name}}", + bodyHtml: "

Lead {{first_name}} {{last_name}} was converted into an account and contact.

" + }, + "crm.lead_routing_hot": { + label: "Hot Lead Routing", + subject: "Hot lead \u2014 assign within 24h: {{first_name}} {{last_name}}", + bodyHtml: "

{{first_name}} {{last_name}} from {{company}} (rating {{rating}}) needs an owner today.

" + }, + "crm.lead_routing_new": { + label: "New Lead Routing", + subject: "New lead to assign: {{first_name}} {{last_name}}", + bodyHtml: "

{{first_name}} {{last_name}} from {{company}} is awaiting assignment.

" + }, + "crm.opportunity_approved": { + label: "Deal Approved", + subject: "Deal approved: {{name}}", + bodyHtml: "

Your opportunity {{name}} has been approved.

" + }, + "crm.opportunity_rejected": { + label: "Deal Rejected", + subject: "Deal rejected: {{name}}", + bodyHtml: "

Your opportunity {{name}} was not approved. Review and revise before resubmitting.

" + }, + "crm.task_reminder": { + label: "Task Reminder", + subject: "Task reminder: {{subject}}", + bodyHtml: '

Your task "{{subject}}" is due (reminder set for {{reminder_date}}).

' + }, + "crm.urgent_task": { + label: "Urgent Task", + subject: "Urgent task: {{subject}}", + bodyHtml: '

An urgent task "{{subject}}" was assigned to you and needs attention.

' + } +}; + +// src/sales/email-templates/zh-CN.ts +var zhCN3 = { + "crm.account_approved": { + label: "\u5BA2\u6237\u5BA1\u6279\u901A\u8FC7", + subject: "\u5BA2\u6237\u5DF2\u5BA1\u6279\u901A\u8FC7\uFF1A{{name}}", + bodyHtml: "

\u8BE5\u5BA2\u6237\u5DF2\u5BA1\u6279\u901A\u8FC7\uFF0C\u73B0\u4E3A\u6B63\u5F0F\u6570\u636E\u3002

" + }, + "crm.account_rejected": { + label: "\u5BA2\u6237\u5BA1\u6279\u672A\u901A\u8FC7", + subject: "\u5BA2\u6237\u672A\u901A\u8FC7\u5BA1\u6279\uFF1A{{name}}", + bodyHtml: "

\u8BE5\u5BA2\u6237\u672A\u901A\u8FC7\u5BA1\u6279\u3002\u8BF7\u4FEE\u6B63\u5176\u4FE1\u606F\u540E\u518D\u6B21\u63D0\u4EA4\u5BA1\u6838\u3002

" + }, + "crm.contact_welcome": { + label: "\u65B0\u8054\u7CFB\u4EBA", + subject: "\u65B0\u8054\u7CFB\u4EBA\uFF1A{{first_name}} {{last_name}}", + bodyHtml: "

{{first_name}} {{last_name}} \u5DF2\u6DFB\u52A0\u4E3A\u8054\u7CFB\u4EBA\u3002\u8BF7\u4E3B\u52A8\u8054\u7CFB\u5E76\u8868\u793A\u6B22\u8FCE\u3002

" + }, + "crm.deal_stalled": { + label: "\u5546\u673A\u505C\u6EDE", + subject: "\u505C\u6EDE\u5546\u673A\uFF1A{{name}}", + bodyHtml: "

\u5546\u673A {{name}} \u5DF2\u5728\u201C{{stage}}\u201D\u9636\u6BB5\u505C\u7559 {{days_in_stage}} \u5929\u3002\u8BF7\u63A8\u8FDB\u6216\u91CD\u65B0\u8BC4\u4F30\u3002

" + }, + "crm.large_deal_won": { + label: "\u5927\u989D\u5546\u673A\u8D62\u5355", + subject: "\u5927\u989D\u5546\u673A\u8D62\u5355\uFF1A{{name}}", + bodyHtml: "

{{name}} \u4EE5 {{amount}} \u6210\u4EA4\u3002\u606D\u559C\u56E2\u961F\u3002

" + }, + "crm.lead_conversion_approved": { + label: "\u7EBF\u7D22\u8F6C\u6362\u5DF2\u6279\u51C6", + subject: "\u7EBF\u7D22\u8F6C\u6362\u5DF2\u6279\u51C6\uFF1A{{first_name}} {{last_name}}", + bodyHtml: "

\u8BE5\u7EBF\u7D22\u5DF2\u5BA1\u6279\u901A\u8FC7\u3002\u60A8\u53EF\u4EE5\u5C06\u5176\u8F6C\u6362\u4E3A\u5BA2\u6237\u3001\u8054\u7CFB\u4EBA\u548C\u5546\u673A\u3002

" + }, + "crm.lead_conversion_rejected": { + label: "\u7EBF\u7D22\u8F6C\u6362\u672A\u6279\u51C6", + subject: "\u7EBF\u7D22\u672A\u901A\u8FC7\u5BA1\u6279\uFF1A{{first_name}} {{last_name}}", + bodyHtml: "

\u8BE5\u7EBF\u7D22\u7684\u8F6C\u6362\u672A\u83B7\u6279\u51C6\u3002\u8BF7\u7EE7\u7EED\u8DDF\u8FDB\uFF0C\u6216\u6CE8\u660E\u539F\u56E0\u5C06\u5176\u53D6\u6D88\u8D44\u683C\u3002

" + }, + "crm.lead_converted": { + label: "\u7EBF\u7D22\u5DF2\u8F6C\u6362", + subject: "\u7EBF\u7D22\u5DF2\u8F6C\u6362\uFF1A{{first_name}} {{last_name}}", + bodyHtml: "

\u7EBF\u7D22 {{first_name}} {{last_name}} \u5DF2\u8F6C\u6362\u4E3A\u5BA2\u6237\u548C\u8054\u7CFB\u4EBA\u3002

" + }, + "crm.lead_routing_hot": { + label: "\u70ED\u95E8\u7EBF\u7D22\u5206\u914D", + subject: "\u70ED\u95E8\u7EBF\u7D22 \u2014 24 \u5C0F\u65F6\u5185\u5206\u914D\uFF1A{{first_name}} {{last_name}}", + bodyHtml: "

\u6765\u81EA {{company}} \u7684 {{first_name}} {{last_name}}\uFF08\u8BC4\u5206 {{rating}}\uFF09\u9700\u8981\u4ECA\u5929\u5C31\u6307\u5B9A\u8D1F\u8D23\u4EBA\u3002

" + }, + "crm.lead_routing_new": { + label: "\u65B0\u7EBF\u7D22\u5206\u914D", + subject: "\u5F85\u5206\u914D\u65B0\u7EBF\u7D22\uFF1A{{first_name}} {{last_name}}", + bodyHtml: "

\u6765\u81EA {{company}} \u7684 {{first_name}} {{last_name}} \u6B63\u5728\u7B49\u5F85\u5206\u914D\u3002

" + }, + "crm.opportunity_approved": { + label: "\u5546\u673A\u5BA1\u6279\u901A\u8FC7", + subject: "\u5546\u673A\u5DF2\u6279\u51C6\uFF1A{{name}}", + bodyHtml: "

\u60A8\u7684\u5546\u673A {{name}} \u5DF2\u83B7\u6279\u51C6\u3002

" + }, + "crm.opportunity_rejected": { + label: "\u5546\u673A\u5BA1\u6279\u672A\u901A\u8FC7", + subject: "\u5546\u673A\u672A\u6279\u51C6\uFF1A{{name}}", + bodyHtml: "

\u60A8\u7684\u5546\u673A {{name}} \u672A\u83B7\u6279\u51C6\u3002\u8BF7\u68C0\u67E5\u5E76\u4FEE\u6539\u540E\u91CD\u65B0\u63D0\u4EA4\u3002

" + }, + "crm.task_reminder": { + label: "\u4EFB\u52A1\u63D0\u9192", + subject: "\u4EFB\u52A1\u63D0\u9192\uFF1A{{subject}}", + bodyHtml: "

\u60A8\u7684\u4EFB\u52A1\u201C{{subject}}\u201D\u5DF2\u5230\u671F\uFF08\u63D0\u9192\u65F6\u95F4 {{reminder_date}}\uFF09\u3002

" + }, + "crm.urgent_task": { + label: "\u7D27\u6025\u4EFB\u52A1", + subject: "\u7D27\u6025\u4EFB\u52A1\uFF1A{{subject}}", + bodyHtml: "

\u4E00\u9879\u7D27\u6025\u4EFB\u52A1\u201C{{subject}}\u201D\u5DF2\u5206\u914D\u7ED9\u60A8\uFF0C\u9700\u8981\u5C3D\u5FEB\u5904\u7406\u3002

" + } +}; + +// src/sales/email-templates/ja-JP.ts +var jaJP3 = { + "crm.account_approved": { + label: "\u30A2\u30AB\u30A6\u30F3\u30C8\u627F\u8A8D\u6E08\u307F", + subject: "\u30A2\u30AB\u30A6\u30F3\u30C8\u304C\u627F\u8A8D\u3055\u308C\u307E\u3057\u305F: {{name}}", + bodyHtml: "

\u3053\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306F\u627F\u8A8D\u3055\u308C\u3001\u6B63\u5F0F\u306A\u30C7\u30FC\u30BF\u306B\u306A\u308A\u307E\u3057\u305F\u3002

" + }, + "crm.account_rejected": { + label: "\u30A2\u30AB\u30A6\u30F3\u30C8\u672A\u627F\u8A8D", + subject: "\u30A2\u30AB\u30A6\u30F3\u30C8\u304C\u627F\u8A8D\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: {{name}}", + bodyHtml: "

\u3053\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306F\u627F\u8A8D\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u5185\u5BB9\u3092\u4FEE\u6B63\u306E\u3046\u3048\u3001\u518D\u5EA6\u627F\u8A8D\u3092\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044\u3002

" + }, + "crm.contact_welcome": { + label: "\u65B0\u898F\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", + subject: "\u65B0\u3057\u3044\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005: {{first_name}} {{last_name}}", + bodyHtml: "

{{first_name}} {{last_name}} \u304C\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3068\u3057\u3066\u8FFD\u52A0\u3055\u308C\u307E\u3057\u305F\u3002\u3054\u6328\u62F6\u306E\u9023\u7D61\u3092\u3057\u3066\u304F\u3060\u3055\u3044\u3002

" + }, + "crm.deal_stalled": { + label: "\u505C\u6EDE\u4E2D\u306E\u5546\u8AC7", + subject: "\u505C\u6EDE\u4E2D\u306E\u5546\u8AC7: {{name}}", + bodyHtml: "

\u5546\u8AC7 {{name}} \u306F\u300C{{stage}}\u300D\u306B {{days_in_stage}} \u65E5\u9593\u7559\u307E\u3063\u3066\u3044\u307E\u3059\u3002\u6B21\u306E\u6BB5\u968E\u306B\u9032\u3081\u308B\u304B\u3001\u518D\u8A55\u4FA1\u3057\u3066\u304F\u3060\u3055\u3044\u3002

" + }, + "crm.large_deal_won": { + label: "\u5927\u578B\u5546\u8AC7\u306E\u53D7\u6CE8", + subject: "\u5927\u578B\u5546\u8AC7\u3092\u53D7\u6CE8: {{name}}", + bodyHtml: "

{{name}} \u304C {{amount}} \u3067\u6210\u7D04\u3057\u307E\u3057\u305F\u3002\u30C1\u30FC\u30E0\u306E\u7686\u3055\u3093\u3001\u304A\u3081\u3067\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002

" + }, + "crm.lead_conversion_approved": { + label: "\u30EA\u30FC\u30C9\u5909\u63DB\u306E\u627F\u8A8D", + subject: "\u30EA\u30FC\u30C9\u306E\u5909\u63DB\u304C\u627F\u8A8D\u3055\u308C\u307E\u3057\u305F: {{first_name}} {{last_name}}", + bodyHtml: "

\u3053\u306E\u30EA\u30FC\u30C9\u306F\u627F\u8A8D\u3055\u308C\u307E\u3057\u305F\u3002\u53D6\u5F15\u5148\u3001\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3001\u5546\u8AC7\u306B\u5909\u63DB\u3067\u304D\u307E\u3059\u3002

" + }, + "crm.lead_conversion_rejected": { + label: "\u30EA\u30FC\u30C9\u672A\u627F\u8A8D", + subject: "\u30EA\u30FC\u30C9\u304C\u627F\u8A8D\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: {{first_name}} {{last_name}}", + bodyHtml: "

\u3053\u306E\u30EA\u30FC\u30C9\u306E\u5909\u63DB\u306F\u627F\u8A8D\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u5F15\u304D\u7D9A\u304D\u5BFE\u5FDC\u3059\u308B\u304B\u3001\u7406\u7531\u3092\u4ED8\u3051\u3066\u5BFE\u8C61\u5916\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002

" + }, + "crm.lead_converted": { + label: "\u30EA\u30FC\u30C9\u5909\u63DB\u6E08\u307F", + subject: "\u30EA\u30FC\u30C9\u3092\u5909\u63DB\u3057\u307E\u3057\u305F: {{first_name}} {{last_name}}", + bodyHtml: "

\u30EA\u30FC\u30C9 {{first_name}} {{last_name}} \u3092\u53D6\u5F15\u5148\u3068\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306B\u5909\u63DB\u3057\u307E\u3057\u305F\u3002

" + }, + "crm.lead_routing_hot": { + label: "\u30DB\u30C3\u30C8\u30EA\u30FC\u30C9\u306E\u5272\u308A\u5F53\u3066", + subject: "\u30DB\u30C3\u30C8\u30EA\u30FC\u30C9 \u2014 24 \u6642\u9593\u4EE5\u5185\u306B\u5272\u308A\u5F53\u3066: {{first_name}} {{last_name}}", + bodyHtml: "

{{company}} \u306E {{first_name}} {{last_name}}\uFF08\u8A55\u4FA1 {{rating}}\uFF09\u306B\u672C\u65E5\u4E2D\u306B\u62C5\u5F53\u8005\u3092\u5272\u308A\u5F53\u3066\u3066\u304F\u3060\u3055\u3044\u3002

" + }, + "crm.lead_routing_new": { + label: "\u65B0\u898F\u30EA\u30FC\u30C9\u306E\u5272\u308A\u5F53\u3066", + subject: "\u5272\u308A\u5F53\u3066\u5F85\u3061\u306E\u65B0\u898F\u30EA\u30FC\u30C9: {{first_name}} {{last_name}}", + bodyHtml: "

{{company}} \u306E {{first_name}} {{last_name}} \u304C\u5272\u308A\u5F53\u3066\u3092\u5F85\u3063\u3066\u3044\u307E\u3059\u3002

" + }, + "crm.opportunity_approved": { + label: "\u5546\u8AC7\u627F\u8A8D\u6E08\u307F", + subject: "\u5546\u8AC7\u304C\u627F\u8A8D\u3055\u308C\u307E\u3057\u305F: {{name}}", + bodyHtml: "

\u5546\u8AC7 {{name}} \u304C\u627F\u8A8D\u3055\u308C\u307E\u3057\u305F\u3002

" + }, + "crm.opportunity_rejected": { + label: "\u5546\u8AC7\u672A\u627F\u8A8D", + subject: "\u5546\u8AC7\u304C\u627F\u8A8D\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: {{name}}", + bodyHtml: "

\u5546\u8AC7 {{name}} \u306F\u627F\u8A8D\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u5185\u5BB9\u3092\u78BA\u8A8D\u30FB\u4FEE\u6B63\u306E\u3046\u3048\u3001\u518D\u7533\u8ACB\u3057\u3066\u304F\u3060\u3055\u3044\u3002

" + }, + "crm.task_reminder": { + label: "ToDo \u30EA\u30DE\u30A4\u30F3\u30C0\u30FC", + subject: "ToDo \u306E\u30EA\u30DE\u30A4\u30F3\u30C0\u30FC: {{subject}}", + bodyHtml: "

ToDo\u300C{{subject}}\u300D\u304C\u671F\u9650\u3092\u8FCE\u3048\u307E\u3057\u305F\uFF08\u30EA\u30DE\u30A4\u30F3\u30C0\u30FC\u8A2D\u5B9A: {{reminder_date}}\uFF09\u3002

" + }, + "crm.urgent_task": { + label: "\u7DCA\u6025 ToDo", + subject: "\u7DCA\u6025\u306E ToDo: {{subject}}", + bodyHtml: "

\u7DCA\u6025\u306E ToDo\u300C{{subject}}\u300D\u304C\u5272\u308A\u5F53\u3066\u3089\u308C\u307E\u3057\u305F\u3002\u5BFE\u5FDC\u3092\u304A\u9858\u3044\u3057\u307E\u3059\u3002

" + } +}; + +// src/sales/email-templates/es-ES.ts +var esES3 = { + "crm.account_approved": { + label: "Cuenta aprobada", + subject: "Cuenta aprobada: {{name}}", + bodyHtml: "

Esta cuenta ha sido aprobada y ya es un dato consolidado.

" + }, + "crm.account_rejected": { + label: "Cuenta no aprobada", + subject: "Cuenta no aprobada: {{name}}", + bodyHtml: "

Esta cuenta no fue aprobada. Corrige sus datos y solicita otra revisi\xF3n.

" + }, + "crm.contact_welcome": { + label: "Nuevo contacto", + subject: "Nuevo contacto: {{first_name}} {{last_name}}", + bodyHtml: "

{{first_name}} {{last_name}} se ha a\xF1adido como contacto. Ponte en contacto para darle la bienvenida.

" + }, + "crm.deal_stalled": { + label: "Oportunidad estancada", + subject: "Oportunidad estancada: {{name}}", + bodyHtml: "

La oportunidad {{name}} lleva {{days_in_stage}} d\xEDas en {{stage}}. Es hora de avanzarla o volver a cualificarla.

" + }, + "crm.large_deal_won": { + label: "Gran operaci\xF3n ganada", + subject: "Gran operaci\xF3n ganada: {{name}}", + bodyHtml: "

{{name}} se cerr\xF3 por {{amount}}. Enhorabuena al equipo.

" + }, + "crm.lead_conversion_approved": { + label: "Cliente potencial aprobado para conversi\xF3n", + subject: "Cliente potencial aprobado para conversi\xF3n: {{first_name}} {{last_name}}", + bodyHtml: "

Este cliente potencial ha sido aprobado. Puedes convertirlo en cuenta, contacto y oportunidad.

" + }, + "crm.lead_conversion_rejected": { + label: "Cliente potencial no aprobado", + subject: "Cliente potencial no aprobado: {{first_name}} {{last_name}}", + bodyHtml: "

La conversi\xF3n de este cliente potencial no fue aprobada. Sigue trabaj\xE1ndolo o descalif\xEDcalo indicando un motivo.

" + }, + "crm.lead_converted": { + label: "Cliente potencial convertido", + subject: "Cliente potencial convertido: {{first_name}} {{last_name}}", + bodyHtml: "

El cliente potencial {{first_name}} {{last_name}} se convirti\xF3 en cuenta y contacto.

" + }, + "crm.lead_routing_hot": { + label: "Asignaci\xF3n de cliente potencial caliente", + subject: "Cliente potencial caliente \u2014 asignar en 24 h: {{first_name}} {{last_name}}", + bodyHtml: "

{{first_name}} {{last_name}} de {{company}} (puntuaci\xF3n {{rating}}) necesita propietario hoy.

" + }, + "crm.lead_routing_new": { + label: "Asignaci\xF3n de cliente potencial", + subject: "Nuevo cliente potencial por asignar: {{first_name}} {{last_name}}", + bodyHtml: "

{{first_name}} {{last_name}} de {{company}} est\xE1 pendiente de asignaci\xF3n.

" + }, + "crm.opportunity_approved": { + label: "Oportunidad aprobada", + subject: "Oportunidad aprobada: {{name}}", + bodyHtml: "

Tu oportunidad {{name}} ha sido aprobada.

" + }, + "crm.opportunity_rejected": { + label: "Oportunidad rechazada", + subject: "Oportunidad rechazada: {{name}}", + bodyHtml: "

Tu oportunidad {{name}} no fue aprobada. Rev\xEDsala y corr\xEDgela antes de volver a enviarla.

" + }, + "crm.task_reminder": { + label: "Recordatorio de tarea", + subject: "Recordatorio de tarea: {{subject}}", + bodyHtml: '

Tu tarea "{{subject}}" vence (recordatorio fijado para {{reminder_date}}).

' + }, + "crm.urgent_task": { + label: "Tarea urgente", + subject: "Tarea urgente: {{subject}}", + bodyHtml: '

Se te ha asignado una tarea urgente "{{subject}}" que requiere atenci\xF3n.

' + } +}; + +// src/sales/email-templates/crm.email-template.ts +var SalesEmailTemplates = bundle({ + "en-US": en3, + "zh-CN": zhCN3, + "ja-JP": jaJP3, + "es-ES": esES3 +}); + +// src/revenue/email-templates/index.ts +var email_templates_exports2 = {}; +__export(email_templates_exports2, { + RevenueEmailTemplates: () => RevenueEmailTemplates +}); + +// src/revenue/email-templates/en.ts +var en4 = { + "crm.contract_expired": { + label: "Contract Expired", + subject: "Contract expired: {{contract_number}}", + bodyHtml: "

Contract {{contract_number}} reached its end date and has been marked expired.

" + }, + "crm.contract_renewal": { + label: "Contract Renewal Due", + subject: "Contract renewal due: {{contract_number}}", + bodyHtml: "

Contract {{contract_number}} ends on {{end_date}}. Start the renewal conversation now.

" + }, + "crm.quote_created": { + label: "Quote Created", + subject: "Quote created: {{quote_name}}", + bodyHtml: "

Your quote {{quote_name}} has been created from this opportunity.

" + } +}; + +// src/revenue/email-templates/zh-CN.ts +var zhCN4 = { + "crm.contract_expired": { + label: "\u5408\u540C\u5DF2\u5230\u671F", + subject: "\u5408\u540C\u5DF2\u5230\u671F\uFF1A{{contract_number}}", + bodyHtml: "

\u5408\u540C {{contract_number}} \u5DF2\u5230\u8FBE\u7ED3\u675F\u65E5\u671F\uFF0C\u5E76\u5DF2\u6807\u8BB0\u4E3A\u5230\u671F\u3002

" + }, + "crm.contract_renewal": { + label: "\u5408\u540C\u7EED\u7EA6\u63D0\u9192", + subject: "\u5408\u540C\u5F85\u7EED\u7EA6\uFF1A{{contract_number}}", + bodyHtml: "

\u5408\u540C {{contract_number}} \u5C06\u4E8E {{end_date}} \u7ED3\u675F\u3002\u8BF7\u7ACB\u5373\u542F\u52A8\u7EED\u7EA6\u6C9F\u901A\u3002

" + }, + "crm.quote_created": { + label: "\u62A5\u4EF7\u5355\u5DF2\u521B\u5EFA", + subject: "\u62A5\u4EF7\u5355\u5DF2\u521B\u5EFA\uFF1A{{quote_name}}", + bodyHtml: "

\u60A8\u7684\u62A5\u4EF7\u5355 {{quote_name}} \u5DF2\u4ECE\u8BE5\u5546\u673A\u521B\u5EFA\u3002

" + } +}; + +// src/revenue/email-templates/ja-JP.ts +var jaJP4 = { + "crm.contract_expired": { + label: "\u5951\u7D04\u306E\u6E80\u4E86", + subject: "\u5951\u7D04\u304C\u6E80\u4E86\u3057\u307E\u3057\u305F: {{contract_number}}", + bodyHtml: "

\u5951\u7D04 {{contract_number}} \u306F\u7D42\u4E86\u65E5\u306B\u9054\u3057\u3001\u6E80\u4E86\u3068\u3057\u3066\u8A18\u9332\u3055\u308C\u307E\u3057\u305F\u3002

" + }, + "crm.contract_renewal": { + label: "\u5951\u7D04\u66F4\u65B0\u306E\u6642\u671F", + subject: "\u5951\u7D04\u306E\u66F4\u65B0\u6642\u671F\u3067\u3059: {{contract_number}}", + bodyHtml: "

\u5951\u7D04 {{contract_number}} \u306F {{end_date}} \u306B\u7D42\u4E86\u3057\u307E\u3059\u3002\u66F4\u65B0\u306E\u76F8\u8AC7\u3092\u59CB\u3081\u3066\u304F\u3060\u3055\u3044\u3002

" + }, + "crm.quote_created": { + label: "\u898B\u7A4D\u306E\u4F5C\u6210", + subject: "\u898B\u7A4D\u3092\u4F5C\u6210\u3057\u307E\u3057\u305F: {{quote_name}}", + bodyHtml: "

\u3053\u306E\u5546\u8AC7\u304B\u3089\u898B\u7A4D {{quote_name}} \u304C\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F\u3002

" + } +}; + +// src/revenue/email-templates/es-ES.ts +var esES4 = { + "crm.contract_expired": { + label: "Contrato vencido", + subject: "Contrato vencido: {{contract_number}}", + bodyHtml: "

El contrato {{contract_number}} alcanz\xF3 su fecha de fin y se ha marcado como vencido.

" + }, + "crm.contract_renewal": { + label: "Renovaci\xF3n de contrato pendiente", + subject: "Renovaci\xF3n de contrato pendiente: {{contract_number}}", + bodyHtml: "

El contrato {{contract_number}} finaliza el {{end_date}}. Inicia ya la conversaci\xF3n de renovaci\xF3n.

" + }, + "crm.quote_created": { + label: "Presupuesto creado", + subject: "Presupuesto creado: {{quote_name}}", + bodyHtml: "

Tu presupuesto {{quote_name}} se ha creado a partir de esta oportunidad.

" + } +}; + +// src/revenue/email-templates/crm.email-template.ts +var RevenueEmailTemplates = bundle({ + "en-US": en4, + "zh-CN": zhCN4, + "ja-JP": jaJP4, + "es-ES": esES4 +}); + +// src/sales/profiles/tenant-admin.profile.ts +var TenantAdminProfile = { + name: "tenant_admin", + label: "Tenant Administrator", + // Derived, never transcribed — see the note above. Spread rather than + // aliased so the two sets are independent values in the built artifact. + objects: { ...SystemAdminProfile.objects }, + systemPermissions: [ + "view_setup", + // The one substitution this profile exists for: org-scoped member + // management instead of platform-wide user management. + "manage_org_users", + // Org-bounded by the driver's tenant predicate — see the audit above. + "view_all_data", + "modify_all_data", + "manage_sharing" + ] +}; + +// src/sales/objects/account.hook.ts +var accountHook = { + name: "account_protection", + object: "crm_account", + events: ["beforeInsert", "beforeUpdate", "beforeDelete"], + priority: 200, + description: "Validate account fields and protect customer accounts with opportunities or activated contracts from deletion.", + handler: async (ctx) => { + function refuse(message, code, status, userMessage = message) { + const err = new Error(message); + err.code = code; + err.status = status; + err.userMessage = userMessage; + return err; + } + const { event, input } = ctx; + if (event === "beforeInsert" || event === "beforeUpdate") { + if (typeof input.website === "string" && input.website.length > 0) { + if (!/^https?:\/\//i.test(input.website)) { + throw refuse("Website must start with http:// or https://", "VALIDATION_FAILED", 400); + } + } + if (typeof input.annual_revenue === "number" && input.annual_revenue < 0) { + throw refuse("Annual Revenue must be greater than or equal to 0", "VALIDATION_FAILED", 400); + } + if ("billing_address" in input || event === "beforeInsert") { + const address = input.billing_address; + const country = address !== null && typeof address === "object" && !Array.isArray(address) ? address.country : void 0; + const normalized = typeof country === "string" ? country.trim().replace(/\s+/g, " ").toUpperCase() : ""; + if ("billing_address" in input) { + input.billing_country = normalized === "" ? null : normalized; + } + const TERRITORY_BY_COUNTRY = { + "US": "na", + "CA": "na", + "MX": "na", + "GB": "emea", + "DE": "emea", + "FR": "emea", + "IT": "emea", + "ES": "emea", + "UNITED STATES": "na", + "UNITED STATES OF AMERICA": "na", + "USA": "na", + "CANADA": "na", + "MEXICO": "na", + "UK": "emea", + "UNITED KINGDOM": "emea", + "GREAT BRITAIN": "emea", + "GERMANY": "emea", + "FRANCE": "emea", + "ITALY": "emea", + "SPAIN": "emea" + }; + input.territory = TERRITORY_BY_COUNTRY[normalized] || "other"; + } + if ("name" in input) { + const rawName = input.name; + const normalizedName = typeof rawName === "string" ? rawName.trim().toLowerCase().replace(/\s+/g, " ") : ""; + input.name_normalized = normalizedName === "" ? null : normalizedName; + } + } + if (event === "beforeUpdate" && ctx.user?.id && ctx.dispatch?.mode !== "per-row") { + const prev = ctx.previous ?? {}; + const ownerChanged = typeof input.owner_id !== "undefined" && input.owner_id !== prev.owner_id; + const typeChanged = typeof input.type !== "undefined" && input.type !== prev.type; + if (ownerChanged || typeChanged) { + input.last_activity_date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10); + } + } + if (event === "beforeDelete") { + const previous = ctx.previous; + if (!previous || previous.type !== "customer") return; + const api = ctx.api; + if (!api) return; + const opportunities2 = await api.object("crm_opportunity").count({ + where: { crm_account: previous.id } + }); + if (opportunities2 > 0) { + throw refuse( + opportunities2 === 1 ? "Cannot delete customer account: 1 opportunity, open or closed, still references it. Delete the opportunity first, or mark the account inactive to retire it instead." : `Cannot delete customer account: ${opportunities2} opportunities, open or closed, still reference it. Delete the opportunities first, or mark the account inactive to retire it instead.`, + "DELETE_RESTRICTED", + 409 + ); + } + const activeContracts = await api.object("crm_contract").count({ + where: { crm_account: previous.id, status: "activated" } + }); + if (activeContracts > 0) { + throw refuse( + activeContracts === 1 ? "Cannot delete customer account: 1 activated contract still references it. Terminate or reassign it first." : `Cannot delete customer account: ${activeContracts} activated contracts still reference it. Terminate or reassign them first.`, + "DELETE_RESTRICTED", + 409 + ); + } + } + } +}; +var account_hook_default = accountHook; + +// src/sales/objects/contact.hook.ts +var contactHook = { + name: "contact_integrity", + object: "crm_contact", + events: ["beforeInsert", "beforeUpdate", "beforeDelete"], + priority: 200, + description: "Dedupe contacts by email and protect referenced contacts from deletion.", + handler: async (ctx) => { + function refuse(message, code, status, userMessage = message) { + const err = new Error(message); + err.code = code; + err.status = status; + err.userMessage = userMessage; + return err; + } + const { event, input } = ctx; + const api = ctx.api; + if ((event === "beforeInsert" || event === "beforeUpdate") && api) { + const email = typeof input.email === "string" ? input.email.toLowerCase() : ""; + if (email) { + input.email = email; + const organizationId = [ + ctx.user?.organizationId, + ctx.session?.organizationId, + input.organization_id, + ctx.previous?.organization_id + ].find((candidate) => typeof candidate === "string" && candidate !== ""); + if (organizationId || ctx.user?.id) { + const dup = await api.object("crm_contact").findOne({ + where: organizationId ? { organization_id: organizationId, email } : { email } + }); + const dupRow = dup; + const dupId = dupRow?.id; + const selfId = ctx.previous?.id ?? input.id; + if (dup && dupId !== selfId) { + const dupName = [dupRow?.first_name, dupRow?.last_name].filter((part) => typeof part === "string" && part.trim() !== "").join(" "); + throw refuse( + dupName ? `Another contact (${dupName}) with email ${email} already exists.` : `Another contact with email ${email} already exists.`, + "DUPLICATE_VALUE", + 409 + ); + } + } + } + } + if (event === "beforeDelete" && api) { + const id = ctx.previous?.id; + if (!id) return; + const [openOpps, openQuotes, activeContracts] = await Promise.all([ + api.object("crm_opportunity").count({ + where: { primary_contact: id, stage: { $nin: ["closed_won", "closed_lost"] } } + }), + api.object("crm_quote").count({ + where: { crm_contact: id, status: { $nin: ["rejected", "expired"] } } + }), + api.object("crm_contract").count({ + where: { crm_contact: id, status: "activated" } + }) + ]); + const total = openOpps + openQuotes + activeContracts; + if (total > 0) { + const name = [ctx.previous?.first_name, ctx.previous?.last_name].filter((part) => typeof part === "string" && part.trim() !== "").join(" "); + const subject = name ? `Contact ${name}` : "This contact"; + throw refuse( + `${subject} is still referenced by ${openOpps} open opportunity(ies), ${openQuotes} active quote(s), ${activeContracts} active contract(s), so it cannot be deleted \u2014 and neither can its account, because deleting an account deletes its contacts. Close or reassign the opportunities and quotes first, and give each contract another primary contact: a contract keeps its primary contact even after it ends.`, + "DELETE_RESTRICTED", + 409 + ); + } + } + } +}; +var contact_hook_default = contactHook; + +// src/sales/objects/event.hook.ts +var eventScheduleDerive = { + name: "event_schedule_derive", + object: "crm_event", + events: ["beforeInsert", "beforeUpdate"], + priority: 200, + description: "Keep start/end/duration coherent: derive whichever of end_datetime or duration_minutes was not supplied.", + handler: async (ctx) => { + if (ctx.event === "beforeUpdate" && ctx.dispatch?.mode === "per-row") return; + const { input } = ctx; + const previous = ctx.previous; + const effective = (key) => input[key] !== void 0 && input[key] !== null ? input[key] : previous?.[key]; + const start = effective("start_datetime"); + const end = effective("end_datetime"); + const durationRaw = effective("duration_minutes"); + const startMs = typeof start === "string" || start instanceof Date ? new Date(start).getTime() : NaN; + const endMs = typeof end === "string" || end instanceof Date ? new Date(end).getTime() : NaN; + const duration = typeof durationRaw === "number" && isFinite(durationRaw) ? durationRaw : NaN; + const allDay = effective("all_day") === true; + if (!isNaN(startMs) && !isNaN(endMs)) { + if (!allDay) input.duration_minutes = Math.max(0, Math.round((endMs - startMs) / 6e4)); + } else if (!isNaN(startMs) && isNaN(endMs) && !isNaN(duration) && duration > 0) { + input.end_datetime = new Date(startMs + duration * 6e4).toISOString(); + } + const status = effective("status"); + if (status === "cancelled" || status === "no_show") input.duration_minutes = 0; + } +}; +var eventActivityBubble = { + name: "event_activity_bubble", + object: "crm_event", + events: ["afterInsert", "afterUpdate"], + priority: 800, + async: true, + onError: "log", + runAs: "system", + description: "A held event stamps interaction recency on the related account (walking up from contact/opportunity/case), lead and contact, and the first-response time on a related case.", + handler: async (ctx) => { + const { input } = ctx; + const previous = ctx.previous; + const api = ctx.api; + if (!api) return; + const r = { ...previous ?? {}, ...input }; + if (r.status !== "held") return; + if (previous && previous.status === "held") return; + const nowIso = (/* @__PURE__ */ new Date()).toISOString(); + const today = nowIso.slice(0, 10); + const idOf = (key) => typeof r[key] === "string" && r[key].length > 0 ? r[key] : void 0; + const org = idOf("organization_id"); + const inOrg = org ? { organization_id: org } : {}; + const accountIds = /* @__PURE__ */ new Set(); + const contactIds = /* @__PURE__ */ new Set(); + const leadIds = /* @__PURE__ */ new Set(); + const direct = idOf("related_to_account"); + if (direct) accountIds.add(direct); + const contactId = idOf("related_to_contact"); + if (contactId) contactIds.add(contactId); + const leadId = idOf("related_to_lead"); + if (leadId) leadIds.add(leadId); + const parentLookups = [ + ["related_to_contact", "crm_contact"], + ["related_to_opportunity", "crm_opportunity"], + ["related_to_case", "crm_case"] + ]; + for (const [field, object] of parentLookups) { + const id = idOf(field); + if (!id) continue; + try { + const raw = await api.object(object).find({ + where: { id, ...inOrg }, + fields: ["crm_account"], + top: 1 + }); + const rows = Array.isArray(raw) ? raw : raw?.records ?? []; + const parent = rows.length ? rows[0].crm_account : void 0; + if (typeof parent === "string" && parent.length > 0) accountIds.add(parent); + } catch { + } + } + const targets = [ + ["crm_account", accountIds, { last_activity_date: today }], + ["crm_contact", contactIds, { last_contacted_date: nowIso }], + ["crm_lead", leadIds, { last_contacted_date: nowIso }] + ]; + for (const [object, ids, doc] of targets) { + let inside = [...ids]; + if (org && inside.length > 0) { + try { + const raw = await api.object(object).find({ where: { id: { $in: inside }, ...inOrg }, fields: ["id"], top: inside.length }); + inside = (Array.isArray(raw) ? raw : raw?.records ?? []).map((row) => String(row.id)); + } catch { + inside = []; + } + } + for (const id of inside) { + try { + await api.object(object).update({ ...doc, id }, { where: { id } }); + } catch { + } + } + } + const responseCaseId = idOf("related_to_case"); + if (responseCaseId) { + try { + const raw = await api.object("crm_case").find({ + where: { id: responseCaseId, ...inOrg }, + fields: ["first_response_date"], + top: 1 + }); + const rows = Array.isArray(raw) ? raw : raw?.records ?? []; + if (rows.length > 0 && !rows[0].first_response_date) { + await api.object("crm_case").update( + { id: responseCaseId, first_response_date: nowIso }, + { where: { id: responseCaseId } } + ); + } + } catch { + } + } + } +}; +var eventDoNotCallGuard = { + name: "event_do_not_call_guard", + object: "crm_event", + events: ["beforeInsert", "beforeUpdate"], + priority: 150, + description: "Refuse to book a planned Call event against a lead/contact flagged Do Not Call.", + handler: async (ctx) => { + function refuse(message, code, status, userMessage = message) { + const err = new Error(message); + err.code = code; + err.status = status; + err.userMessage = userMessage; + return err; + } + const { input } = ctx; + const previous = ctx.previous; + const api = ctx.api; + if (!api) return; + const effective = (key) => input[key] !== void 0 && input[key] !== null ? input[key] : previous?.[key]; + if (effective("type") !== "call") return; + if (effective("status") !== "planned") return; + const leadId = effective("related_to_lead"); + const contactId = effective("related_to_contact"); + const targets = []; + if (typeof leadId === "string" && leadId) { + targets.push({ object: "crm_lead", id: leadId, label: "lead" }); + } + if (typeof contactId === "string" && contactId) { + targets.push({ object: "crm_contact", id: contactId, label: "contact" }); + } + for (const t of targets) { + const raw = await api.object(t.object).find({ + where: { id: t.id }, + fields: ["id", "do_not_call"], + top: 1 + }); + const rows = Array.isArray(raw) ? raw : raw?.records ?? []; + const person = rows[0]; + if (person?.do_not_call === true) { + throw refuse( + `This ${t.label} is flagged Do Not Call, so a call cannot be scheduled against them. Log the call as held if it already happened, book a meeting instead, or clear Do Not Call on the record first.`, + "FORBIDDEN", + 403 + ); + } + } + } +}; +var event_hook_default = [eventScheduleDerive, eventDoNotCallGuard, eventActivityBubble]; + +// src/sales/objects/forecast.hook.ts +var forecastDerive = { + name: "forecast_derive_period", + object: "crm_forecast", + events: ["beforeInsert", "beforeUpdate"], + priority: 200, + description: "Derive period_start, period_end and period_label from period (+ snapshot_date).", + handler: async (ctx) => { + if (ctx.event === "beforeUpdate" && ctx.dispatch?.mode === "per-row") return; + const pad = (n) => String(n).padStart(2, "0"); + const isoDate = (d) => `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`; + const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + const endOfMonth = (start) => new Date(Date.UTC(start.getUTCFullYear(), start.getUTCMonth() + 1, 0)); + const endOfQuarter = (start) => new Date(Date.UTC(start.getUTCFullYear(), start.getUTCMonth() + 3, 0)); + const startOfPeriod = (period2, d) => new Date(Date.UTC( + d.getUTCFullYear(), + period2 === "quarter" ? Math.floor(d.getUTCMonth() / 3) * 3 : d.getUTCMonth(), + 1 + )); + const labelFor = (period2, start) => { + if (period2 === "quarter") { + const q = Math.floor(start.getUTCMonth() / 3) + 1; + return `Q${q} ${start.getUTCFullYear()}`; + } + return `${MONTHS[start.getUTCMonth()]} ${start.getUTCFullYear()}`; + }; + const { input } = ctx; + const previous = ctx.previous; + const period = typeof input.period === "string" && input.period || typeof previous?.period === "string" && previous.period || "month"; + let startStr = typeof input.period_start === "string" && input.period_start || typeof previous?.period_start === "string" && previous.period_start || void 0; + if (!startStr) { + const anchorStr = typeof input.snapshot_date === "string" && input.snapshot_date || typeof previous?.snapshot_date === "string" && previous.snapshot_date || isoDate(/* @__PURE__ */ new Date()); + const anchor = /* @__PURE__ */ new Date(`${anchorStr.slice(0, 10)}T00:00:00Z`); + if (!Number.isNaN(anchor.getTime())) { + startStr = isoDate(startOfPeriod(period, anchor)); + input.period_start = startStr; + } + } + if (startStr) { + const start = /* @__PURE__ */ new Date(`${startStr}T00:00:00Z`); + if (!Number.isNaN(start.getTime())) { + const end = period === "quarter" ? endOfQuarter(start) : endOfMonth(start); + if (!input.period_end) input.period_end = isoDate(end); + if (!input.period_label) input.period_label = labelFor(period, start); + } + } + if (!input.snapshot_date && !previous?.snapshot_date) { + input.snapshot_date = isoDate(/* @__PURE__ */ new Date()); + } + } +}; +var forecast_hook_default = forecastDerive; + +// src/sales/objects/lead.hook.ts +var leadAutoAssignHook = { + name: "lead_auto_assign", + object: "crm_lead", + events: ["beforeInsert"], + priority: 250, + description: "Assign ownerless new leads to the least-loaded sales rep.", + handler: async (ctx) => { + const { input } = ctx; + if (typeof input.owner_id === "string" && input.owner_id) return; + const api = ctx.api; + if (!api) return; + try { + const holders = await api.object("sys_user_position").find({ + where: { position: "sales_rep" }, + fields: ["user_id"], + top: 1e3 + }); + const repIds = Array.from( + new Set( + (holders ?? []).map((r) => typeof r.user_id === "string" ? r.user_id : "").filter(Boolean) + ) + ); + if (repIds.length === 0) return; + let best; + let bestCount = Infinity; + for (const repId of repIds) { + const openCount = await api.object("crm_lead").count({ + where: { owner_id: repId, is_converted: false } + }); + if (openCount < bestCount) { + bestCount = openCount; + best = repId; + } + } + if (best) input.owner_id = best; + } catch { + } + } +}; +var leadHook = { + name: "lead_automation", + object: "crm_lead", + events: ["beforeInsert", "beforeUpdate", "afterUpdate"], + priority: 200, + description: "Score new leads, lock converted leads, and create follow-up task on qualification.", + handler: async (ctx) => { + function refuse(message, code, status, userMessage = message) { + const err = new Error(message); + err.code = code; + err.status = status; + err.userMessage = userMessage; + return err; + } + const { event, input } = ctx; + const HIGH_VALUE_INDUSTRIES = /* @__PURE__ */ new Set(["technology", "finance", "healthcare"]); + const SENIOR_TITLE_PATTERN = /\b(ceo|cto|cfo|cio|coo|founder|vp|vice president|director|head of)\b/i; + function computeRating(input2) { + let score = 0; + const email = typeof input2.email === "string" ? input2.email : ""; + const phone = typeof input2.phone === "string" ? input2.phone : ""; + const title = typeof input2.title === "string" ? input2.title : ""; + const industry = typeof input2.industry === "string" ? input2.industry : ""; + const employees = typeof input2.number_of_employees === "number" ? input2.number_of_employees : 0; + const revenue = typeof input2.annual_revenue === "number" ? input2.annual_revenue : 0; + if (email && !/(gmail|yahoo|hotmail|outlook|qq|163)\.com$/i.test(email)) score += 1; + if (phone.length > 0) score += 0.5; + if (SENIOR_TITLE_PATTERN.test(title)) score += 1.5; + if (HIGH_VALUE_INDUSTRIES.has(industry)) score += 1; + if (employees >= 200) score += 0.5; + if (revenue >= 1e7) score += 0.5; + const clamped = Math.max(1, Math.min(5, score)); + return Math.round(clamped); + } + if (event === "beforeInsert") { + const isGuestSubmission = !ctx.user?.id && !ctx.session?.isSystem; + if (isGuestSubmission) { + if (!input.lead_source) input.lead_source = "web"; + if (!input.status) input.status = "new"; + input.is_converted = false; + input.converted_account = null; + input.converted_contact = null; + input.converted_opportunity = null; + input.converted_date = null; + input.owner_id = null; + input.duplicate_of_type = null; + input.duplicate_of_lead = null; + input.duplicate_of_contact = null; + input.duplicate_status = null; + } + if (typeof input.rating !== "number") { + input.rating = computeRating(input); + } + } + if (event === "beforeUpdate") { + const previous = ctx.previous; + const wasConverted = previous?.is_converted === true || previous?.status === "converted"; + const isConverting = !wasConverted && (input.is_converted === true || input.status === "converted"); + const verdict = previous?.conversion_approval_status; + if (isConverting && (verdict === "pending" || verdict === "rejected")) { + const person = [previous?.first_name, previous?.last_name].filter((part) => typeof part === "string" && part.trim() !== "").join(" "); + const company = typeof previous?.company === "string" ? previous.company.trim() : ""; + const label = [person, company].filter(Boolean).join(" - "); + const state = verdict === "rejected" ? "was rejected" : "is still awaiting approval"; + throw refuse( + `Cannot convert ${label ? `lead ${label}` : "this lead"}: its conversion ${state}. Conversion opens once an approver signs it off \u2014 the Conversion Approval field on the lead shows where it stands.`, + "RECORD_LOCKED", + 409 + ); + } + } + if (event === "beforeUpdate" && ctx.user?.id) { + const previous = ctx.previous; + const wasConverted = previous?.is_converted === true || previous?.status === "converted"; + if (wasConverted) { + const ALLOWED = /* @__PURE__ */ new Set([ + "description", + "notes", + // Framework-managed / system columns (cf. opportunity.hook.ts). + "id", + "owner_id", + "created_at", + "updated_at", + "created_by", + "updated_by", + "space_id", + "organization_id", + "org_id", + "version" + ]); + const violating = Object.keys(input).filter( + (k) => !ALLOWED.has(k) && input[k] !== previous?.[k] + ); + if (violating.length > 0) { + const REFERENCE_FIELDS = /* @__PURE__ */ new Set([ + "converted_account", + "converted_contact", + "converted_opportunity", + "duplicate_of_lead", + "duplicate_of_contact" + ]); + const isReferenceCleanup = violating.every( + (k) => REFERENCE_FIELDS.has(k) && input[k] === null && previous?.[k] != null + ); + if (isReferenceCleanup) return; + const person = [previous?.first_name, previous?.last_name].filter((part) => typeof part === "string" && part.trim() !== "").join(" "); + const company = typeof previous?.company === "string" ? previous.company.trim() : ""; + const label = [person, company].filter(Boolean).join(" - "); + throw refuse( + `Cannot edit ${label ? `converted lead ${label}` : "a converted lead"} (attempted: ${violating.join(", ")}). Make changes on the converted records instead.`, + "RECORD_LOCKED", + 409 + ); + } + } + } + if (event === "afterUpdate") { + const previous = ctx.previous; + const becameQualified = input.status === "qualified" && previous?.status !== "qualified"; + if (!becameQualified) return; + const api = ctx.api; + if (!api) return; + const leadId = typeof input.id === "string" && input.id || typeof previous?.id === "string" && previous.id || void 0; + const ownerId = typeof input.owner_id === "string" && input.owner_id || typeof previous?.owner_id === "string" && previous.owner_id || ctx.user?.id; + const dueDate = /* @__PURE__ */ new Date(); + dueDate.setUTCDate(dueDate.getUTCDate() + 2); + const person = [ + typeof input.first_name === "string" && input.first_name || previous?.first_name, + typeof input.last_name === "string" && input.last_name || previous?.last_name + ].filter((part) => typeof part === "string" && part.trim() !== "").join(" "); + const company = typeof input.company === "string" && input.company.trim() || typeof previous?.company === "string" && previous.company.trim() || ""; + const label = [person, company].filter(Boolean).join(" - "); + const titled = label ? `Follow up with qualified lead: ${label}` : "Follow up with qualified lead"; + try { + await api.object("crm_task").insert({ + subject: titled.length > 255 ? `${titled.slice(0, 254)}\u2026` : titled, + status: "not_started", + priority: "high", + type: "follow_up", + due_date: dueDate.toISOString().slice(0, 10), + // Unlike `lead_auto_assign` above, this is a SEPARATE insert on + // `ctx.api` — a new operation carrying the caller's context, so the + // #3004 transfer guard does apply to it. When the qualifier is the + // lead's own rep (`owner_id` == caller) it is not a transfer at all; + // a manager qualifying a rep's lead holds `allowTransfer`. Any other + // caller is denied and the catch below drops the task rather than + // landing it on the wrong desk. + owner_id: ownerId, + related_to_type: "crm_lead", + related_to_lead: leadId + }); + } catch { + } + } + } +}; +var leadDuplicateCheckHook = { + name: "lead_duplicate_check", + object: "crm_lead", + events: ["beforeInsert", "beforeUpdate"], + priority: 300, + description: "Normalize lead email and company match key; flag a re-captured address as a suspected duplicate of the record it repeats.", + handler: async (ctx) => { + const { event, input } = ctx; + const SCAN_LIMIT = 50; + const isBlank = (value) => value === void 0 || value === null || typeof value === "string" && value.trim() === ""; + if (typeof input.email === "string") { + input.email = input.email.trim().toLowerCase(); + } + const email = typeof input.email === "string" ? input.email : ""; + if ("company" in input) { + const rawCompany = input.company; + const normalizedCompany = typeof rawCompany === "string" ? rawCompany.trim().toLowerCase().replace(/\s+/g, " ") : ""; + input.company_normalized = normalizedCompany === "" ? null : normalizedCompany; + } + if (event === "beforeUpdate" && ctx.dispatch?.mode !== "per-row") { + const previous = ctx.previous; + const LINK_OF_TYPE = { + crm_lead: "duplicate_of_lead", + crm_contact: "duplicate_of_contact" + }; + const restated = "duplicate_of_type" in input && !isBlank(input.duplicate_of_type); + const declared = previous?.duplicate_of_type; + const link = typeof declared === "string" ? LINK_OF_TYPE[declared] : void 0; + if (!restated && link && link in input && isBlank(input[link])) { + if (!("duplicate_status" in input) && previous?.duplicate_status === "confirmed") { + input.duplicate_of_type = "erased"; + } else { + input.duplicate_of_type = null; + input.duplicate_status = null; + } + } + } + if (event !== "beforeInsert" || !email) return; + if (!isBlank(input.duplicate_status) || !isBlank(input.duplicate_of_type)) return; + const api = ctx.api; + if (!api) return; + const original = (rows) => { + let best; + let bestKey = Infinity; + for (const row of rows) { + const id = typeof row.id === "string" ? row.id : ""; + if (!id) continue; + const raw = row.created_at; + const parsed = typeof raw === "string" || typeof raw === "number" || raw instanceof Date ? new Date(raw).getTime() : Number.NaN; + const key = Number.isFinite(parsed) ? parsed : Infinity; + if (best === void 0 || key < bestKey) { + best = id; + bestKey = key; + } + } + return best; + }; + try { + const contacts2 = await api.object("crm_contact").find({ + where: { email }, + fields: ["id", "created_at"], + top: SCAN_LIMIT + }); + const contactId = original(contacts2 ?? []); + if (contactId) { + input.duplicate_of_type = "crm_contact"; + input.duplicate_of_contact = contactId; + input.duplicate_status = "suspected"; + return; + } + const leads2 = await api.object("crm_lead").find({ + where: { email, is_converted: false }, + fields: ["id", "created_at"], + top: SCAN_LIMIT + }); + const leadId = original(leads2 ?? []); + if (leadId) { + input.duplicate_of_type = "crm_lead"; + input.duplicate_of_lead = leadId; + input.duplicate_status = "suspected"; + } + } catch { + } + } +}; +var lead_hook_default = [leadAutoAssignHook, leadHook, leadDuplicateCheckHook]; + +// src/sales/objects/lead.campaign-metrics.hook.ts +var campaignLeadConversionRefresh = { + name: "campaign_lead_conversion_refresh", + object: "crm_lead", + events: ["afterUpdate"], + priority: 810, + async: true, + onError: "log", + runAs: "system", + description: "Promote campaign members of a converting lead and recompute campaign metrics.", + handler: async (ctx) => { + const api = ctx.api; + if (!api) return; + const { input } = ctx; + const previous = ctx.previous; + if (input?.is_converted !== true) return; + if (previous?.is_converted === true) return; + const leadId = typeof input?.id === "string" && input.id || (typeof previous?.id === "string" ? previous.id : ""); + if (!leadId) return; + const memberships = await api.object("crm_campaign_member").find({ + where: { crm_lead: leadId }, + fields: ["id", "crm_campaign", "status"], + top: 500 + }); + for (const m of memberships) { + const memberId = typeof m.id === "string" ? m.id : ""; + if (!memberId) continue; + if (m.status !== "sent" && m.status !== "responded") continue; + await api.object("crm_campaign_member").update( + { id: memberId, status: "converted" }, + { where: { id: memberId } } + ); + } + const campaignIds = Array.from(new Set( + memberships.map((m) => typeof m.crm_campaign === "string" ? m.crm_campaign : "").filter(Boolean) + )); + for (const id of campaignIds) { + const memberRows = await api.object("crm_campaign_member").find({ + where: { crm_campaign: id }, + fields: ["crm_lead", "status"], + top: 5e3 + }); + const leadIds = Array.from(new Set( + memberRows.map((r) => typeof r.crm_lead === "string" ? r.crm_lead : "").filter(Boolean) + )); + const convertedLeads = leadIds.length > 0 ? await api.object("crm_lead").count({ where: { id: { $in: leadIds }, is_converted: true } }) : 0; + const numOpportunities = await api.object("crm_opportunity").count({ where: { crm_campaign: id } }); + const numWon = await api.object("crm_opportunity").count({ where: { crm_campaign: id, stage: "closed_won" } }); + const wonRows = await api.object("crm_opportunity").find({ + where: { crm_campaign: id, stage: "closed_won" }, + fields: ["amount"], + top: 5e3 + }); + const actualRevenue = wonRows.reduce( + (sum, row) => sum + (typeof row.amount === "number" ? row.amount : Number(row.amount) || 0), + 0 + ); + await api.object("crm_campaign").update({ + id, + num_sent: memberRows.length, + num_responses: memberRows.filter((r) => r.status === "responded" || r.status === "converted").length, + num_leads: leadIds.length, + num_converted_leads: convertedLeads, + num_opportunities: numOpportunities, + num_won_opportunities: numWon, + actual_revenue: actualRevenue + }, { where: { id } }); + } + } +}; +var lead_campaign_metrics_hook_default = [campaignLeadConversionRefresh]; + +// src/sales/objects/opportunity.hook.ts +var opportunityValidationHook = { + name: "opportunity_lifecycle", + object: "crm_opportunity", + events: ["beforeInsert", "beforeUpdate"], + priority: 200, + description: "Recompute expected_revenue, freeze closed opportunities except narrative fields.", + handler: async (ctx) => { + function refuse(message, code, status, userMessage = message) { + const err = new Error(message); + err.code = code; + err.status = status; + err.userMessage = userMessage; + return err; + } + const STAGE_PROBABILITY = { + prospecting: 10, + qualification: 25, + needs_analysis: 40, + proposal: 60, + negotiation: 80, + closed_won: 100, + closed_lost: 0 + }; + const NARRATIVE_FIELDS = /* @__PURE__ */ new Set(["description", "next_step", "notes"]); + const SYSTEM_FIELDS = /* @__PURE__ */ new Set([ + "id", + "owner_id", + "created_at", + "updated_at", + "created_by", + "updated_by", + "space_id", + "organization_id", + "org_id", + "version" + ]); + const APPROVAL_FIELDS = /* @__PURE__ */ new Set([ + "approval_status", + "approved_date", + "status_change_approval_status", + "requested_status", + "qualification_approval_status", + "qualification_requested" + ]); + const STAGE_FORECAST = { + prospecting: "pipeline", + qualification: "pipeline", + needs_analysis: "best_case", + proposal: "commit", + negotiation: "commit", + closed_won: "closed", + closed_lost: "omitted" + }; + const { event, input } = ctx; + const previous = ctx.previous; + if (event === "beforeUpdate" && previous && ctx.user?.id) { + const qualification = input.qualification_approval_status ?? previous.qualification_approval_status; + if (qualification === "pending" || qualification === "rejected") { + const held = []; + if (typeof input.stage === "string" && input.stage !== previous.stage) held.push("Stage"); + if (typeof input.requested_status === "string" && input.requested_status !== "" && input.requested_status !== previous.requested_status) { + held.push("Requested Status"); + } + if (held.length > 0) { + throw refuse( + `This deal needs qualification approval first: tick Request Qualification Approval. ${held.join(" and ")} can change once it is approved.`, + "RECORD_LOCKED", + 409 + ); + } + } + } + if (event === "beforeUpdate" && previous && ctx.user?.id) { + const gate = input.status_change_approval_status ?? previous.status_change_approval_status; + const next = input.stage; + const closing = (next === "closed_won" || next === "closed_lost") && next !== previous.stage; + if (closing && (gate === "pending" || gate === "rejected")) { + throw refuse( + "This deal's status change needs approval: set Requested Status (and the win/loss reason) instead. The stage takes effect when the request is approved.", + "RECORD_LOCKED", + 409 + ); + } + } + if (event === "beforeUpdate" && previous && ctx.user?.id) { + const prevStage = previous.stage; + const isClosed = prevStage === "closed_won" || prevStage === "closed_lost"; + if (isClosed) { + const violating = Object.keys(input).filter( + (k) => !NARRATIVE_FIELDS.has(k) && !SYSTEM_FIELDS.has(k) && !APPROVAL_FIELDS.has(k) && input[k] !== previous[k] + ); + if (violating.length > 0) { + const REFERENCE_FIELDS = /* @__PURE__ */ new Set(["crm_account", "primary_contact", "crm_campaign"]); + const isReferenceCleanup = violating.every( + (k) => REFERENCE_FIELDS.has(k) && input[k] === null && previous?.[k] != null + ); + if (isReferenceCleanup) return; + const name = typeof previous.name === "string" ? previous.name.trim() : ""; + const subject = name ? `Opportunity ${name}` : "Opportunity"; + throw refuse( + `${subject} is closed (${prevStage}); only ${[...NARRATIVE_FIELDS].join(", ")} may be edited. Attempted: ${violating.join(", ")}.`, + "RECORD_LOCKED", + 409 + ); + } + } + } + if (ctx.event === "beforeUpdate" && ctx.dispatch?.mode === "per-row") return; + const amount = typeof input.amount === "number" ? input.amount : typeof previous?.amount === "number" ? previous.amount : void 0; + const stage = typeof input.stage === "string" ? input.stage : typeof previous?.stage === "string" ? previous.stage : void 0; + if (typeof amount === "number" && stage && STAGE_PROBABILITY[stage] !== void 0) { + input.expected_revenue = Math.round(amount * STAGE_PROBABILITY[stage]) / 100; + } + if (stage && STAGE_PROBABILITY[stage] !== void 0) { + input.probability = STAGE_PROBABILITY[stage]; + } + if (stage && STAGE_FORECAST[stage] !== void 0) { + const stageChanged = event === "beforeInsert" || typeof input.stage === "string" && input.stage !== previous?.stage; + if (stageChanged) input.forecast_category = STAGE_FORECAST[stage]; + } + if (event === "beforeInsert" && !input.stage_entry_date) { + input.stage_entry_date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10); + } + if (event === "beforeUpdate" && previous) { + if (input.stage === "closed_won" && previous.stage !== "closed_won" && !input.close_date) { + input.close_date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10); + } + if (typeof input.stage === "string" && input.stage !== previous.stage) { + input.stage_entry_date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10); + } + } + } +}; +var opportunityWonHook = { + name: "opportunity_promote_account", + object: "crm_opportunity", + events: ["afterUpdate"], + priority: 800, + async: true, + onError: "log", + runAs: "system", + description: "On closed_won: promote linked account to customer and create activation task.", + handler: async (ctx) => { + const { input } = ctx; + const previous = ctx.previous; + const becameWon = input.stage === "closed_won" && previous?.stage !== "closed_won"; + if (!becameWon) return; + const api = ctx.api; + if (!api) return; + const accountId = typeof input.crm_account === "string" && input.crm_account || typeof previous?.crm_account === "string" && previous.crm_account || void 0; + if (!accountId) return; + const account = await api.object("crm_account").findOne({ where: { id: accountId } }); + if (account && account.type !== "customer") { + await api.object("crm_account").update( + { id: accountId, type: "customer" }, + { where: { id: accountId } } + ); + } + const oppId = typeof input.id === "string" && input.id || previous?.id; + const ownerId = typeof input.owner_id === "string" && input.owner_id || typeof previous?.owner_id === "string" && previous.owner_id || ctx.user?.id; + const due = /* @__PURE__ */ new Date(); + due.setUTCDate(due.getUTCDate() + 3); + const oppName = typeof input.name === "string" && input.name.trim() || typeof previous?.name === "string" && previous.name.trim() || ""; + const titled = oppName ? `Activate new customer for opportunity ${oppName}` : "Activate new customer"; + await api.object("crm_task").insert({ + subject: titled.length > 255 ? `${titled.slice(0, 254)}\u2026` : titled, + status: "not_started", + priority: "high", + type: "follow_up", + due_date: due.toISOString().slice(0, 10), + owner_id: ownerId, + related_to_type: "crm_opportunity", + related_to_opportunity: oppId, + related_to_account: accountId + }); + } +}; +var opportunityAccountCapabilityHook = { + name: "opportunity_account_capability", + object: "crm_opportunity", + events: ["beforeInsert"], + priority: 150, + runAs: "system", + description: "Refuse a NEW opportunity linked to an account whose commercial capability is settlement only.", + handler: async (ctx) => { + function refuse(message, code, status, userMessage = message) { + const err = new Error(message); + err.code = code; + err.status = status; + err.userMessage = userMessage; + return err; + } + const api = ctx.api; + if (!api) return; + const accountId = ctx.input.crm_account; + if (typeof accountId !== "string" || accountId === "") return; + const org = ctx.input.organization_id; + const account = await api.object("crm_account").findOne({ + where: { id: accountId, ...typeof org === "string" && org ? { organization_id: org } : {} }, + fields: ["commercial_capability"] + }); + if (!account || account.commercial_capability !== "settlement_only") return; + throw refuse( + "Cannot open an opportunity against this account: its Commercial Capability is Settlement Only, so it is available for billing and payment but no new business may be booked against it. Pick a different account, or have the account reclassified to Full first.", + "VALIDATION_FAILED", + 400 + ); + } +}; +var opportunity_hook_default = [ + opportunityAccountCapabilityHook, + opportunityValidationHook, + opportunityWonHook +]; + +// src/sales/objects/opportunity.campaign-metrics.hook.ts +var campaignAttributionRefresh = { + name: "campaign_attribution_refresh", + object: "crm_opportunity", + events: ["afterInsert", "afterUpdate", "afterDelete"], + priority: 810, + async: true, + onError: "log", + runAs: "system", + description: "Recompute campaign metrics when an opportunity\u2019s campaign attribution changes.", + handler: async (ctx) => { + const api = ctx.api; + if (!api) return; + const { input } = ctx; + const previous = ctx.previous; + const campaignIds = Array.from(new Set([ + typeof input?.crm_campaign === "string" ? input.crm_campaign : "", + typeof previous?.crm_campaign === "string" ? previous.crm_campaign : "" + ].filter(Boolean))); + for (const id of campaignIds) { + const memberRows = await api.object("crm_campaign_member").find({ + where: { crm_campaign: id }, + fields: ["crm_lead", "status"], + top: 5e3 + }); + const leadIds = Array.from(new Set( + memberRows.map((r) => typeof r.crm_lead === "string" ? r.crm_lead : "").filter(Boolean) + )); + const convertedLeads = leadIds.length > 0 ? await api.object("crm_lead").count({ where: { id: { $in: leadIds }, is_converted: true } }) : 0; + const numOpportunities = await api.object("crm_opportunity").count({ where: { crm_campaign: id } }); + const numWon = await api.object("crm_opportunity").count({ where: { crm_campaign: id, stage: "closed_won" } }); + const wonRows = await api.object("crm_opportunity").find({ + where: { crm_campaign: id, stage: "closed_won" }, + fields: ["amount"], + top: 5e3 + }); + const actualRevenue = wonRows.reduce( + (sum, row) => sum + (typeof row.amount === "number" ? row.amount : Number(row.amount) || 0), + 0 + ); + await api.object("crm_campaign").update({ + id, + num_sent: memberRows.length, + num_responses: memberRows.filter((r) => r.status === "responded" || r.status === "converted").length, + num_leads: leadIds.length, + num_converted_leads: convertedLeads, + num_opportunities: numOpportunities, + num_won_opportunities: numWon, + actual_revenue: actualRevenue + }, { where: { id } }); + } + } +}; +var opportunity_campaign_metrics_hook_default = [campaignAttributionRefresh]; + +// src/sales/objects/task.hook.ts +var taskValidation = { + name: "task_completion", + object: "crm_task", + events: ["beforeInsert", "beforeUpdate"], + priority: 200, + description: "Stamp completed/overdue flags + dates on completion and validate reminder timing.", + handler: async (ctx) => { + if (ctx.event === "beforeUpdate" && ctx.dispatch?.mode === "per-row") return; + function refuse(message, code, status, userMessage = message) { + const err = new Error(message); + err.code = code; + err.status = status; + err.userMessage = userMessage; + return err; + } + const { input } = ctx; + const previous = ctx.previous; + if (!previous && input.reminder_sent == null) { + input.reminder_sent = false; + } + const effPriority = typeof input.priority === "string" && input.priority || typeof previous?.priority === "string" && previous.priority || void 0; + if (effPriority) { + const rank = { low: 1, normal: 2, high: 3, urgent: 4 }; + input.priority_rank = rank[effPriority] ?? 0; + } + if (input.status === "completed" && previous?.status !== "completed") { + if (!input.completed_date || !ctx.session?.isSystem) { + input.completed_date = (/* @__PURE__ */ new Date()).toISOString(); + } + if (typeof input.progress_percent !== "number") input.progress_percent = 100; + } + const effStatus = typeof input.status === "string" && input.status || typeof previous?.status === "string" && previous.status || void 0; + if (typeof effStatus === "string") input.is_completed = effStatus === "completed"; + const effDue = typeof input.due_date === "string" && input.due_date || typeof previous?.due_date === "string" && previous.due_date || void 0; + const todayStr = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10); + input.is_overdue = !!effDue && effDue.slice(0, 10) < todayStr && input.is_completed !== true; + const reminder = typeof input.reminder_date === "string" && input.reminder_date || typeof previous?.reminder_date === "string" && previous.reminder_date || void 0; + const due = typeof input.due_date === "string" && input.due_date || typeof previous?.due_date === "string" && previous.due_date || void 0; + if (reminder && due && reminder.slice(0, 10) > due.slice(0, 10)) { + throw refuse( + `Reminder (${reminder}) is after the due date (${due}); reminders should fire before the deadline.`, + "VALIDATION_FAILED", + 400 + ); + } + } +}; +var taskRecurrence = { + name: "task_recurrence", + object: "crm_task", + events: ["afterUpdate"], + priority: 700, + async: true, + onError: "log", + description: "On completion of a recurring task, spawn the next occurrence (dates advanced by recurrence_type \xD7 interval).", + handler: async (ctx) => { + function advanceDate(d, type2, interval2) { + const next = new Date(d); + if (type2 === "daily") { + next.setUTCDate(next.getUTCDate() + interval2); + return next; + } + if (type2 === "weekly") { + next.setUTCDate(next.getUTCDate() + 7 * interval2); + return next; + } + const months = type2 === "monthly" ? interval2 : type2 === "yearly" ? 12 * interval2 : 0; + if (months === 0) return next; + const day = next.getUTCDate(); + next.setUTCDate(1); + next.setUTCMonth(next.getUTCMonth() + months); + const lastDayOfTargetMonth = new Date(Date.UTC( + next.getUTCFullYear(), + next.getUTCMonth() + 1, + 0 + )).getUTCDate(); + next.setUTCDate(Math.min(day, lastDayOfTargetMonth)); + return next; + } + const { input } = ctx; + const previous = ctx.previous; + const api = ctx.api; + if (!api) return; + const nowDone = input.status === "completed" || input.is_completed === true; + const wasDone = previous?.status === "completed" || previous?.is_completed === true; + if (!nowDone || wasDone) return; + const r = { ...previous ?? {}, ...input }; + if (r.is_recurring !== true) return; + const type = typeof r.recurrence_type === "string" ? r.recurrence_type : void 0; + if (!type || !["daily", "weekly", "monthly", "yearly"].includes(type)) return; + const interval = Number(r.recurrence_interval) > 0 ? Number(r.recurrence_interval) : 1; + const baseDue = r.due_date ? new Date(r.due_date) : /* @__PURE__ */ new Date(); + if (isNaN(baseDue.getTime())) return; + const nextDue = advanceDate(baseDue, type, interval); + if (r.recurrence_end_date) { + const end = new Date(r.recurrence_end_date); + if (!isNaN(end.getTime()) && nextDue > end) return; + } + const doc = { + subject: r.subject, + description: r.description ?? null, + priority: r.priority, + type: r.type ?? null, + owner_id: r.owner_id ?? null, + status: "not_started", + is_completed: false, + reminder_sent: false, + due_date: nextDue.toISOString().slice(0, 10), + is_recurring: true, + recurrence_type: type, + recurrence_interval: interval, + recurrence_end_date: r.recurrence_end_date ?? null, + related_to_type: r.related_to_type ?? null, + related_to_account: r.related_to_account ?? null, + related_to_contact: r.related_to_contact ?? null, + related_to_opportunity: r.related_to_opportunity ?? null, + related_to_lead: r.related_to_lead ?? null, + related_to_case: r.related_to_case ?? null + }; + if (r.reminder_date) { + const baseRem = new Date(r.reminder_date); + if (!isNaN(baseRem.getTime())) doc.reminder_date = advanceDate(baseRem, type, interval).toISOString(); + } + try { + await api.object("crm_task").insert(doc); + } catch { + } + } +}; +var taskBubble = { + name: "task_activity_bubble", + object: "crm_task", + events: ["afterUpdate"], + priority: 800, + async: true, + onError: "log", + runAs: "system", + description: "A completed task stamps interaction recency on the related account (walking up from contact/opportunity/case), lead and contact.", + handler: async (ctx) => { + const { input } = ctx; + const previous = ctx.previous; + const api = ctx.api; + if (!api) return; + const nowDone = input.status === "completed" || input.is_completed === true; + const wasDone = previous?.status === "completed" || previous?.is_completed === true; + if (!nowDone || wasDone) return; + const r = { ...previous ?? {}, ...input }; + const nowIso = (/* @__PURE__ */ new Date()).toISOString(); + const today = nowIso.slice(0, 10); + const idOf = (key) => typeof r[key] === "string" && r[key].length > 0 ? r[key] : void 0; + const org = idOf("organization_id"); + const inOrg = org ? { organization_id: org } : {}; + const accountIds = /* @__PURE__ */ new Set(); + const contactIds = /* @__PURE__ */ new Set(); + const leadIds = /* @__PURE__ */ new Set(); + const direct = idOf("related_to_account"); + if (direct) accountIds.add(direct); + const contactId = idOf("related_to_contact"); + if (contactId) contactIds.add(contactId); + const leadId = idOf("related_to_lead"); + if (leadId) leadIds.add(leadId); + const parentLookups = [ + ["related_to_contact", "crm_contact"], + ["related_to_opportunity", "crm_opportunity"], + ["related_to_case", "crm_case"] + ]; + for (const [field, object] of parentLookups) { + const id = idOf(field); + if (!id) continue; + try { + const raw = await api.object(object).find({ + where: { id, ...inOrg }, + fields: ["crm_account"], + top: 1 + }); + const rows = Array.isArray(raw) ? raw : raw?.records ?? []; + const parent = rows.length ? rows[0].crm_account : void 0; + if (typeof parent === "string" && parent.length > 0) accountIds.add(parent); + } catch { + } + } + const targets = [ + ["crm_account", accountIds, { last_activity_date: today }], + ["crm_contact", contactIds, { last_contacted_date: nowIso }], + ["crm_lead", leadIds, { last_contacted_date: nowIso }] + ]; + for (const [object, ids, doc] of targets) { + let inside = [...ids]; + if (org && inside.length > 0) { + try { + const raw = await api.object(object).find({ where: { id: { $in: inside }, ...inOrg }, fields: ["id"], top: inside.length }); + inside = (Array.isArray(raw) ? raw : raw?.records ?? []).map((row) => String(row.id)); + } catch { + inside = []; + } + } + for (const id of inside) { + try { + await api.object(object).update({ ...doc, id }, { where: { id } }); + } catch { + } + } + } + } +}; +var taskDoNotCallGuard = { + name: "task_do_not_call_guard", + object: "crm_task", + events: ["beforeInsert", "beforeUpdate"], + priority: 150, + description: "Refuse to schedule an open Call task against a lead/contact flagged Do Not Call.", + handler: async (ctx) => { + function refuse(message, code, status, userMessage = message) { + const err = new Error(message); + err.code = code; + err.status = status; + err.userMessage = userMessage; + return err; + } + const { input } = ctx; + const previous = ctx.previous; + const api = ctx.api; + if (!api) return; + const effective = (key) => input[key] !== void 0 && input[key] !== null ? input[key] : previous?.[key]; + if (effective("type") !== "call") return; + if (effective("status") === "completed") return; + const leadId = effective("related_to_lead"); + const contactId = effective("related_to_contact"); + const targets = []; + if (typeof leadId === "string" && leadId) { + targets.push({ object: "crm_lead", id: leadId, label: "lead" }); + } + if (typeof contactId === "string" && contactId) { + targets.push({ object: "crm_contact", id: contactId, label: "contact" }); + } + for (const t of targets) { + const raw = await api.object(t.object).find({ + where: { id: t.id }, + fields: ["id", "do_not_call"], + top: 1 + }); + const rows = Array.isArray(raw) ? raw : raw?.records ?? []; + const person = rows[0]; + if (person?.do_not_call === true) { + throw refuse( + `This ${t.label} is flagged Do Not Call, so a Call task cannot be scheduled against them. Log a completed call if one already happened, choose a non-phone activity type, or clear Do Not Call on the record first.`, + "FORBIDDEN", + 403 + ); + } + } + } +}; +var task_hook_default = [taskValidation, taskDoNotCallGuard, taskRecurrence, taskBubble]; + +// src/revenue/objects/contract.hook.ts +var contractValidation = { + name: "contract_validation", + object: "crm_contract", + events: ["beforeInsert", "beforeUpdate"], + priority: 200, + description: "Enforce contract term math and prevent shrinking end_date once activated.", + handler: async (ctx) => { + function refuse(message, code, status, userMessage = message) { + const err = new Error(message); + err.code = code; + err.status = status; + err.userMessage = userMessage; + return err; + } + const { event, input, previous } = ctx; + function monthsBetween(startISO, endISO) { + const s = new Date(startISO); + const e = new Date(endISO); + return (e.getUTCFullYear() - s.getUTCFullYear()) * 12 + (e.getUTCMonth() - s.getUTCMonth()) + // Unchanged intent: has the end day-of-month reached the start's yet? + // If not, the last month is not complete and does not count. + (e.getUTCDate() >= s.getUTCDate() ? 0 : -1); + } + const startDate = [input.start_date, previous?.start_date].find((v) => typeof v === "string" && v !== ""); + const endDate = [input.end_date, previous?.end_date].find((v) => typeof v === "string" && v !== ""); + const term = [input.contract_term_months, previous?.contract_term_months].find((v) => typeof v === "number" && !!v); + if (startDate && endDate && term) { + const calc = monthsBetween(startDate, endDate); + if (Math.abs(calc - term) > 1) { + throw refuse( + `Contract term (${term} months) does not match date range (${calc} months from ${startDate} to ${endDate}).`, + "VALIDATION_FAILED", + 400 + ); + } + } + if (event === "beforeUpdate" && previous?.status === "activated") { + if (typeof input.end_date === "string" && typeof previous.end_date === "string" && input.end_date < previous.end_date) { + throw refuse( + `Cannot shrink end_date (${previous.end_date} \u2192 ${input.end_date}) after activation. Use a termination/amendment workflow instead.`, + "RECORD_LOCKED", + 409 + ); + } + } + } +}; +var contractActivation = { + name: "contract_on_activation", + object: "crm_contract", + events: ["afterUpdate"], + priority: 800, + async: true, + onError: "log", + description: "On activation: stamp signed_date, promote account.", + handler: async (ctx) => { + const { input, previous } = ctx; + if (input.status !== "activated" || previous?.status === "activated") return; + const api = ctx.api; + if (!api) return; + const id = [input.id, previous?.id].find((v) => typeof v === "string" && v !== ""); + const accountId = [input.crm_account, previous?.crm_account].find((v) => typeof v === "string" && v !== ""); + if (id && !input.signed_date && !previous?.signed_date) { + await api.object("crm_contract").update( + { id, signed_date: (/* @__PURE__ */ new Date()).toISOString().slice(0, 10) }, + { where: { id } } + ); + } + if (accountId) { + const account = await api.object("crm_account").findOne({ where: { id: accountId } }); + if (account && account.type !== "customer") { + await api.object("crm_account").update( + { id: accountId, type: "customer" }, + { where: { id: accountId } } + ); + } + } + } +}; +var contract_hook_default = [contractValidation, contractActivation]; + +// src/revenue/objects/_line-item-price-fill.ts +function createLineItemPriceFill(objectName, hookName) { + return { + name: hookName, + object: objectName, + events: ["beforeInsert", "beforeUpdate"], + priority: 100, + description: "Default list_price / unit_price from the chosen product.", + handler: async (ctx) => { + const { event, input } = ctx; + const api = ctx.api; + if (!api) return; + const productId = typeof input.crm_product === "string" ? input.crm_product : void 0; + if (!productId) return; + const product = await api.object("crm_product").findOne({ + where: { id: productId }, + fields: ["id", "list_price"] + }); + const listPrice = product && typeof product.list_price === "number" ? product.list_price : void 0; + if (listPrice === void 0) return; + input.list_price = listPrice; + if (event === "beforeInsert" && input.unit_price == null) { + input.unit_price = listPrice; + } + } + }; +} +function createLineItemNumbering(objectName, hookName) { + return { + name: hookName, + object: objectName, + events: ["beforeInsert", "beforeUpdate"], + priority: 110, + runAs: "system", + description: "Assign line_number = (max under the parent) + 1.", + handler: async (ctx) => { + const { event, input } = ctx; + const prev = ctx.previous; + const api = ctx.api; + if (!api) return; + if (!ctx.user?.id && typeof input.line_number === "number") return; + if (event === "beforeUpdate" && (ctx.dispatch?.mode === "per-row" || typeof prev?.line_number === "number")) return; + const parentKey = ctx.object === "crm_quote_line_item" ? "crm_quote" : "crm_opportunity"; + const parentId = input[parentKey] ?? prev?.[parentKey]; + if (typeof parentId !== "string" || !parentId) return; + const siblings = await api.object(ctx.object).find({ + where: { [parentKey]: parentId }, + fields: ["line_number"], + top: 5e3 + }); + let max = 0; + for (const s of siblings) { + if (typeof s.line_number === "number" && s.line_number > max) max = s.line_number; + } + const offset = event === "beforeInsert" && ctx.dispatch?.mode === "per-row" ? ctx.dispatch.index : 0; + input.line_number = max + 1 + offset; + } + }; +} + +// src/revenue/objects/opportunity_line_item.hook.ts +var opportunityLineItemPriceFill = createLineItemPriceFill( + "crm_opportunity_line_item", + "opportunity_line_item_price_fill" +); +var opportunityLineItemNumbering = createLineItemNumbering( + "crm_opportunity_line_item", + "opportunity_line_item_line_number" +); +var opportunityAmountRollup = { + name: "opportunity_amount_rollup", + object: "crm_opportunity_line_item", + events: ["afterInsert", "afterUpdate", "afterDelete"], + priority: 300, + async: true, + onError: "log", + description: "Recompute parent opportunity.amount from the sum of its line items.", + handler: async (ctx) => { + const api = ctx.api; + if (!api) return; + const { input, previous } = ctx; + const num = (v) => typeof v === "number" ? v : 0; + const oppIds = /* @__PURE__ */ new Set(); + for (const v of [input?.crm_opportunity, previous?.crm_opportunity]) { + if (typeof v === "string" && v) oppIds.add(v); + } + if (oppIds.size === 0) return; + for (const oppId of oppIds) { + const opp = await api.object("crm_opportunity").findOne({ + where: { id: oppId }, + fields: ["id", "stage"] + }); + const stage = opp && typeof opp.stage === "string" ? opp.stage : void 0; + if (stage === "closed_won" || stage === "closed_lost") continue; + const lines = await api.object("crm_opportunity_line_item").find({ + where: { crm_opportunity: oppId }, + fields: ["quantity", "unit_price", "discount"], + top: 5e3 + }); + if (!lines || lines.length === 0) continue; + let sum = 0; + for (const l of lines) sum += num(l.quantity) * num(l.unit_price) * (1 - num(l.discount) / 100); + sum = Math.round(sum * 100) / 100; + if (sum > 0) { + await api.object("crm_opportunity").update( + { id: oppId, amount: sum }, + { where: { id: oppId } } + ); + } + } + } +}; +var opportunity_line_item_hook_default = [opportunityLineItemPriceFill, opportunityLineItemNumbering, opportunityAmountRollup]; + +// src/revenue/objects/product.hook.ts +var productHook = { + name: "product_catalog", + object: "crm_product", + events: ["beforeInsert", "beforeUpdate", "beforeDelete"], + priority: 200, + description: "Pricing sanity, SKU normalization, and protect referenced products from deletion.", + handler: async (ctx) => { + function refuse(message, code, status, userMessage = message) { + const err = new Error(message); + err.code = code; + err.status = status; + err.userMessage = userMessage; + return err; + } + const { event, input, previous } = ctx; + if (event === "beforeInsert" || event === "beforeUpdate") { + const listPrice = [input.list_price, previous?.list_price].find((v) => typeof v === "number"); + const cost = [input.cost, previous?.cost].find((v) => typeof v === "number"); + if (typeof listPrice === "number" && typeof cost === "number" && listPrice < cost) { + throw refuse( + `List Price (${listPrice}) must be greater than or equal to Cost (${cost}).`, + "VALIDATION_FAILED", + 400 + ); + } + if (typeof input.sku === "string") { + input.sku = input.sku.toUpperCase(); + } + } + if (event === "beforeDelete") { + const api = ctx.api; + const id = previous?.id; + if (!api || !id) return; + const [oppRefs, quoteRefs] = await Promise.all([ + api.object("crm_opportunity_line_item").count({ where: { crm_product: id } }).catch(() => 0), + api.object("crm_quote_line_item").count({ where: { crm_product: id } }).catch(() => 0) + ]); + if (oppRefs + quoteRefs > 0) { + throw refuse( + `Cannot delete product: referenced by ${oppRefs} opportunity(ies) and ${quoteRefs} quote(s). Set is_active=false to retire instead.`, + "DELETE_RESTRICTED", + 409 + ); + } + } + } +}; +var product_hook_default = productHook; + +// src/revenue/objects/quote.hook.ts +var quoteValidation = { + name: "quote_workflow", + // ⚠️ Two objects, deliberately (#2060): the freeze below is ONE freeze — the + // quote's and its lines' — so it lives in one place, judged by one user/system + // boundary and carried by one envelope, rather than a second copy of both on + // the line. `test/package-ownership.test.ts` reads every name in the list. + object: ["crm_quote", "crm_quote_line_item"], + events: ["beforeInsert", "beforeUpdate"], + priority: 200, + description: "Default expiration date; freeze accepted/expired quotes and their lines.", + handler: async (ctx) => { + function refuse(message, code, status, userMessage = message) { + const err = new Error(message); + err.code = code; + err.status = status; + err.userMessage = userMessage; + return err; + } + const { event, input, previous } = ctx; + if (ctx.object === "crm_quote_line_item") { + const changed = Object.keys(input).some((k) => !["id", "updated_at", "updated_by", "line_number"].includes(k) && input[k] !== previous?.[k]); + for (const id of /* @__PURE__ */ new Set([input.crm_quote, previous?.crm_quote])) { + const q = changed && ctx.user?.id && typeof id === "string" && id ? await ctx.api?.object("crm_quote").findOne({ where: { id }, fields: ["quote_number", "name", "status"] }) : null; + if (q?.status === "accepted" || q?.status === "expired") { + throw refuse(`Quote ${String(q.quote_number)} - ${String(q.name)} is ${q.status}, so its line items can no longer be added or changed.`, "RECORD_LOCKED", 409); + } + } + return; + } + function subject() { + const label = [previous?.quote_number, previous?.name].map((v) => typeof v === "string" ? v.trim() : "").filter(Boolean).join(" - "); + return label ? `Quote ${label}` : "Quote"; + } + function addDays(iso, days) { + const d = new Date(iso); + d.setUTCDate(d.getUTCDate() + days); + return d.toISOString().slice(0, 10); + } + if (event === "beforeInsert" && !input.expiration_date) { + const base = typeof input.quote_date === "string" ? input.quote_date : (/* @__PURE__ */ new Date()).toISOString().slice(0, 10); + input.expiration_date = addDays(base, 30); + } + if (event === "beforeUpdate" && previous && ctx.user?.id) { + const frozen = previous.status === "accepted" || previous.status === "expired"; + if (frozen) { + const allowed = /* @__PURE__ */ new Set(["internal_notes"]); + const SYSTEM_FIELDS = /* @__PURE__ */ new Set([ + "id", + "owner_id", + "created_at", + "updated_at", + "created_by", + "updated_by", + "space_id", + "organization_id", + "org_id", + "version" + ]); + const violating = Object.keys(input).filter( + (k) => !allowed.has(k) && !SYSTEM_FIELDS.has(k) && input[k] !== previous[k] + ); + if (violating.length > 0) { + const REFERENCE_FIELDS = /* @__PURE__ */ new Set(["crm_account", "crm_contact", "crm_opportunity"]); + const isReferenceCleanup = violating.every( + (k) => REFERENCE_FIELDS.has(k) && input[k] === null && previous?.[k] != null + ); + if (isReferenceCleanup) return; + const what = `${subject()} is ${previous.status}`; + throw refuse(`${what}; only internal_notes may be edited. Attempted: ${violating.join(", ")}.`, "RECORD_LOCKED", 409); + } + } + if (input.status === "accepted" && previous.status !== "accepted") { + const dealId = [input.crm_opportunity, previous.crm_opportunity].find((v) => typeof v === "string" && v); + const deal = dealId ? await ctx.api?.object("crm_opportunity").findOne({ + where: { id: dealId }, + fields: ["stage", "approval_status", "status_change_approval_status", "qualification_approval_status"] + }).catch(() => null) : null; + const held = deal && !String(deal.stage).startsWith("closed_") ? [["approval_status", "Approval Status"], ["status_change_approval_status", "Status Change Approval"], ["qualification_approval_status", "Qualification Approval"]].filter(([f]) => deal[f] === "pending" || deal[f] === "rejected" && f !== "approval_status").map(([f, label]) => `${label} is ${deal[f] === "pending" ? "Pending" : "Rejected"}`) : []; + if (held.length > 0) { + const what = `${subject()} cannot be accepted while its opportunity is held by an approval`; + throw refuse(`${what} (${held.join("; ")}): accepting it would close that deal as won. Accept it once the approval is granted.`, "RECORD_LOCKED", 409); + } + } + } + } +}; +var quoteAcceptedContractDraft = { + name: "quote_accepted_contract_draft", + object: "crm_quote", + events: ["afterUpdate"], + priority: 800, + async: true, + onError: "log", + runAs: "system", + description: "Draft the accepted quote\u2019s contract.", + handler: async (ctx) => { + const { input, previous } = ctx; + if (input.status !== "accepted" || previous?.status === "accepted") return; + const api = ctx.api; + if (!api) return; + function addMonths(iso, months) { + const d = new Date(iso); + d.setUTCMonth(d.getUTCMonth() + months); + return d.toISOString().slice(0, 10); + } + const pickId = (...candidates) => candidates.find((c) => typeof c === "string" && c !== ""); + const accountId = pickId(input.crm_account, previous?.crm_account); + const contactId = pickId(input.crm_contact, previous?.crm_contact); + const opportunityId = pickId(input.crm_opportunity, previous?.crm_opportunity); + const ownerId = pickId(input.owner_id, previous?.owner_id, ctx.user?.id); + const totalPrice = [input.total_price, previous?.total_price].find((v) => typeof v === "number") ?? 0; + const paymentTerms = pickId(input.payment_terms, previous?.payment_terms); + const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10); + const DRAFT_CONTRACT_DEFAULTS = { + contract_term_months: 12, + contract_type: "subscription", + start_date: today + }; + const trimmed = (v) => typeof v === "string" ? v.trim() : ""; + const quoteLabel = [trimmed(previous?.quote_number), [input.name, previous?.name].map(trimmed).find(Boolean)].filter(Boolean).join(" - "); + const contract = { + ...DRAFT_CONTRACT_DEFAULTS, + status: "draft", + end_date: addMonths(DRAFT_CONTRACT_DEFAULTS.start_date, DRAFT_CONTRACT_DEFAULTS.contract_term_months), + contract_value: totalPrice, + description: quoteLabel ? `Auto-drafted from accepted quote ${quoteLabel}` : "Auto-drafted from an accepted quote" + }; + if (accountId) contract.crm_account = accountId; + if (contactId) contract.crm_contact = contactId; + if (opportunityId) contract.crm_opportunity = opportunityId; + if (ownerId) contract.owner_id = ownerId; + if (paymentTerms) contract.payment_terms = paymentTerms; + try { + await api.object("crm_contract").insert(contract); + } catch (err) { + throw new Error(`could not draft the contract for quote ${quoteLabel}: ${err.message}`); + } + } +}; +var quoteAccepted = { + name: "quote_on_accepted", + object: "crm_quote", + events: ["afterUpdate"], + priority: 800, + async: true, + onError: "log", + description: "Close-win the accepted quote\u2019s opportunity.", + handler: async (ctx) => { + const { input, previous } = ctx; + if (input.status !== "accepted" || previous?.status === "accepted") return; + const api = ctx.api; + const id = [input.crm_opportunity, previous?.crm_opportunity].find((v) => typeof v === "string" && v !== ""); + if (!api || !id) return; + try { + const opp = await api.object("crm_opportunity").findOne({ where: { id } }); + if (opp && !String(opp.stage).startsWith("closed_")) { + const won = { id, stage: "closed_won", close_date: (/* @__PURE__ */ new Date()).toISOString().slice(0, 10) }; + await api.object("crm_opportunity").update({ ...won, ...opp.win_reason ? {} : { win_reason: "quote_accepted" } }, { where: { id } }); + } + } catch (err) { + throw new Error(`could not close-won the opportunity of quote ${String(previous?.quote_number)}: ${err.message}`); + } + } +}; +var quote_hook_default = [quoteValidation, quoteAcceptedContractDraft, quoteAccepted]; + +// src/revenue/objects/quote_line_item.hook.ts +var quoteLineItemPriceFill = createLineItemPriceFill( + "crm_quote_line_item", + "quote_line_item_price_fill" +); +var quoteLineItemNumbering = createLineItemNumbering( + "crm_quote_line_item", + "quote_line_item_line_number" +); +var quoteTotalRollup = { + name: "quote_total_rollup", + object: "crm_quote_line_item", + events: ["afterInsert", "afterUpdate", "afterDelete"], + priority: 300, + async: true, + onError: "log", + description: "Recompute parent quote subtotal/discount/total from its line items.", + handler: async (ctx) => { + const api = ctx.api; + if (!api) return; + const { input, previous } = ctx; + const num = (v) => typeof v === "number" ? v : 0; + const quoteIds = /* @__PURE__ */ new Set(); + for (const v of [input?.crm_quote, previous?.crm_quote]) { + if (typeof v === "string" && v) quoteIds.add(v); + } + if (quoteIds.size === 0) return; + for (const quoteId of quoteIds) { + const quote = await api.object("crm_quote").findOne({ + where: { id: quoteId }, + fields: ["id", "status", "discount", "tax", "shipping_handling"] + }); + if (!quote) continue; + const status = typeof quote.status === "string" ? quote.status : void 0; + if (status === "accepted" || status === "expired") continue; + const lines = await api.object("crm_quote_line_item").find({ + where: { crm_quote: quoteId }, + fields: ["quantity", "unit_price", "discount"], + top: 5e3 + }); + if (!lines || lines.length === 0) continue; + let subtotal = 0; + for (const l of lines) subtotal += num(l.quantity) * num(l.unit_price) * (1 - num(l.discount) / 100); + subtotal = Math.round(subtotal * 100) / 100; + const discountAmount = Math.round(subtotal * (num(quote.discount) / 100) * 100) / 100; + const total = Math.round((subtotal - discountAmount + num(quote.tax) + num(quote.shipping_handling)) * 100) / 100; + await api.object("crm_quote").update( + { id: quoteId, subtotal, discount_amount: discountAmount, total_price: total }, + { where: { id: quoteId } } + ); + } + } +}; +var quote_line_item_hook_default = [quoteLineItemPriceFill, quoteLineItemNumbering, quoteTotalRollup]; + +// src/marketing/objects/campaign.hook.ts +var campaignValidation = { + name: "campaign_validation", + object: "crm_campaign", + events: ["beforeInsert", "beforeUpdate"], + priority: 200, + description: "Validate campaign date range and required fields per status.", + handler: async (ctx) => { + function refuse(message, code, status2, userMessage = message) { + const err = new Error(message); + err.code = code; + err.status = status2; + err.userMessage = userMessage; + return err; + } + const { input } = ctx; + const previous = ctx.previous; + const start = typeof input.start_date === "string" && input.start_date || typeof previous?.start_date === "string" && previous.start_date || void 0; + const end = typeof input.end_date === "string" && input.end_date || typeof previous?.end_date === "string" && previous.end_date || void 0; + if (start && end && start > end) { + throw refuse(`Campaign start_date (${start}) must not be after end_date (${end}).`, "VALIDATION_FAILED", 400); + } + const status = typeof input.status === "string" && input.status || typeof previous?.status === "string" && previous.status || void 0; + if (status === "in_progress" && (!start || !end)) { + throw refuse("Campaign cannot move to in_progress without both start_date and end_date.", "VALIDATION_FAILED", 400); + } + } +}; +var campaignMetricsRefresh = { + name: "campaign_metrics_refresh", + object: "crm_campaign", + events: ["afterUpdate"], + priority: 800, + async: true, + onError: "log", + description: "Recompute the campaign metric block whenever the campaign status moves.", + handler: async (ctx) => { + const { input } = ctx; + const previous = ctx.previous; + if (typeof input.status !== "string") return; + if (previous && input.status === previous.status) return; + const api = ctx.api; + if (!api) return; + const campaignId = typeof input.id === "string" && input.id || (typeof previous?.id === "string" ? previous.id : ""); + if (!campaignId) return; + for (const id of [campaignId]) { + const memberRows = await api.object("crm_campaign_member").find({ + where: { crm_campaign: id }, + fields: ["crm_lead", "status"], + top: 5e3 + }); + const leadIds = Array.from(new Set( + memberRows.map((r) => typeof r.crm_lead === "string" ? r.crm_lead : "").filter(Boolean) + )); + const convertedLeads = leadIds.length > 0 ? await api.object("crm_lead").count({ where: { id: { $in: leadIds }, is_converted: true } }) : 0; + const numOpportunities = await api.object("crm_opportunity").count({ where: { crm_campaign: id } }); + const numWon = await api.object("crm_opportunity").count({ where: { crm_campaign: id, stage: "closed_won" } }); + const wonRows = await api.object("crm_opportunity").find({ + where: { crm_campaign: id, stage: "closed_won" }, + fields: ["amount"], + top: 5e3 + }); + const actualRevenue = wonRows.reduce( + (sum, row) => sum + (typeof row.amount === "number" ? row.amount : Number(row.amount) || 0), + 0 + ); + await api.object("crm_campaign").update({ + id, + num_sent: memberRows.length, + num_responses: memberRows.filter((r) => r.status === "responded" || r.status === "converted").length, + num_leads: leadIds.length, + num_converted_leads: convertedLeads, + num_opportunities: numOpportunities, + num_won_opportunities: numWon, + actual_revenue: actualRevenue + }, { where: { id } }); + } + } +}; +var CAMPAIGN_METRIC_FIELDS = [ + "num_sent", + "num_responses", + "num_leads", + "num_converted_leads", + "num_opportunities", + "num_won_opportunities", + "actual_revenue" +]; +var CAMPAIGN_METRIC_WRITE_KEYS = ["id", ...CAMPAIGN_METRIC_FIELDS]; +var campaign_hook_default = [campaignValidation, campaignMetricsRefresh]; + +// src/marketing/objects/campaign_member.hook.ts +var campaignMemberLifecycle = { + name: "campaign_member_lifecycle", + object: "crm_campaign_member", + events: ["beforeInsert", "beforeUpdate"], + priority: 200, + description: "Keep has_responded / response_date in lockstep with the member status.", + handler: async (ctx) => { + if (ctx.event === "beforeUpdate" && ctx.dispatch?.mode === "per-row") return; + const { input } = ctx; + const previous = ctx.previous; + const status = typeof input.status === "string" && input.status || (typeof previous?.status === "string" ? previous.status : void 0); + if (!status) return; + const responded = status === "responded" || status === "converted"; + const priorStatus = typeof previous?.status === "string" ? previous.status : ""; + const wasResponded = priorStatus === "responded" || priorStatus === "converted"; + if (responded) { + input.has_responded = true; + const existing = input.response_date ?? previous?.response_date; + if (!wasResponded && (existing === void 0 || existing === null || existing === "")) { + input.response_date = (/* @__PURE__ */ new Date()).toISOString(); + } + return; + } + if (wasResponded && typeof input.status === "string") { + input.has_responded = false; + input.response_date = null; + return; + } + if (ctx.event === "beforeInsert" && input.has_responded === void 0) { + input.has_responded = false; + } + } +}; +var campaignMemberOptOutSync = { + name: "campaign_member_optout_sync", + object: "crm_campaign_member", + events: ["afterInsert", "afterUpdate"], + priority: 300, + async: true, + onError: "log", + runAs: "system", + description: "Sync an unsubscribed member back to the lead/contact email_opt_out flag.", + handler: async (ctx) => { + const api = ctx.api; + if (!api) return; + const { input } = ctx; + const previous = ctx.previous; + if (input?.status !== "unsubscribed") return; + if (previous?.status === "unsubscribed") return; + const leadId = typeof input?.crm_lead === "string" && input.crm_lead || (typeof previous?.crm_lead === "string" ? previous.crm_lead : void 0); + const contactId = typeof input?.crm_contact === "string" && input.crm_contact || (typeof previous?.crm_contact === "string" ? previous.crm_contact : void 0); + if (leadId) { + await api.object("crm_lead").update( + { id: leadId, email_opt_out: true }, + { where: { id: leadId } } + ); + } + if (contactId) { + await api.object("crm_contact").update( + { id: contactId, email_opt_out: true }, + { where: { id: contactId } } + ); + } + } +}; +var campaignMemberMetricsRefresh = { + name: "campaign_member_metrics_refresh", + object: "crm_campaign_member", + events: ["afterInsert", "afterUpdate", "afterDelete"], + priority: 800, + async: true, + onError: "log", + runAs: "system", + description: "Recompute the campaign metric block live whenever its membership changes.", + handler: async (ctx) => { + const api = ctx.api; + if (!api) return; + const { input } = ctx; + const previous = ctx.previous; + const campaignIds = Array.from(new Set([ + typeof input?.crm_campaign === "string" ? input.crm_campaign : "", + typeof previous?.crm_campaign === "string" ? previous.crm_campaign : "" + ].filter(Boolean))); + for (const id of campaignIds) { + const memberRows = await api.object("crm_campaign_member").find({ + where: { crm_campaign: id }, + fields: ["crm_lead", "status"], + top: 5e3 + }); + const leadIds = Array.from(new Set( + memberRows.map((r) => typeof r.crm_lead === "string" ? r.crm_lead : "").filter(Boolean) + )); + const convertedLeads = leadIds.length > 0 ? await api.object("crm_lead").count({ where: { id: { $in: leadIds }, is_converted: true } }) : 0; + const numOpportunities = await api.object("crm_opportunity").count({ where: { crm_campaign: id } }); + const numWon = await api.object("crm_opportunity").count({ where: { crm_campaign: id, stage: "closed_won" } }); + const wonRows = await api.object("crm_opportunity").find({ + where: { crm_campaign: id, stage: "closed_won" }, + fields: ["amount"], + top: 5e3 + }); + const actualRevenue = wonRows.reduce( + (sum, row) => sum + (typeof row.amount === "number" ? row.amount : Number(row.amount) || 0), + 0 + ); + await api.object("crm_campaign").update({ + id, + num_sent: memberRows.length, + num_responses: memberRows.filter((r) => r.status === "responded" || r.status === "converted").length, + num_leads: leadIds.length, + num_converted_leads: convertedLeads, + num_opportunities: numOpportunities, + num_won_opportunities: numWon, + actual_revenue: actualRevenue + }, { where: { id } }); + } + } +}; +var campaign_member_hook_default = [ + campaignMemberLifecycle, + campaignMemberOptOutSync, + campaignMemberMetricsRefresh +]; + +// src/sales/flows/lead-conversion.flow.ts +import { P as P26, cel as cel6 } from "@objectstack/spec"; +var LeadConversionFlow = { + name: "lead_conversion", + label: "Lead Conversion Process", + description: "Automated flow to convert qualified leads to accounts, contacts, and opportunities", + type: "screen", + status: "active", + variables: [ + // Named `recordId` to match the console's flow-action invocation contract: + // POST /automation/:name/trigger sends { recordId, objectName } and the + // dispatcher exposes them as params.recordId / params.crmLeadId. A custom + // name like `leadId` never gets seeded (16.x runtime). + { name: "recordId", type: "text", isInput: true, isOutput: false }, + // THE authority for the conversion default. `defaultValue` is what makes + // declared mean BOUND: the engine seeds every declared variable that + // carries one before the run starts, so `createOpportunity` is bound on + // every path — including the one where the screen runner posts back only + // the fields the user touched. The screen field below derives its prefill + // from this line rather than restating `false`. + // + // Measured on 17.0.0 GA, by running flows (not by reading the engine): + // · declared + nothing supplied → bound to `false`; ablating this key + // from the declaration re-fails the read with `No such key: + // createOpportunity`, so the default is what binds it; + // · seeded BEFORE the start condition is evaluated, so a start condition + // could read it too; + // · a caller-supplied `context.params.createOpportunity` WINS — the + // boundary is `!== undefined`, so an explicit `false`/`null` is a + // supplied answer, and only absence falls through to this default. + // ⛔ Never seed this with an assignment node instead: an assignment is + // unconditional and clobbers a caller-supplied value. All of the above is + // pinned in `test/flow-variable-conditions.test.ts`. + { name: "createOpportunity", type: "boolean", isInput: true, isOutput: false, defaultValue: false }, + { name: "opportunityName", type: "text", isInput: true, isOutput: false }, + { name: "opportunityAmount", type: "text", isInput: true, isOutput: false }, + // The conversion's close date, collected on the screen below + // instead of stamped inside `create_opportunity`. Declared with NO + // `defaultValue`, and that is measured rather than chosen: the engine + // binds a DECLARATION's default raw — `seedDeclaredVariables` does a plain + // `variables.set(name, defaultValue)` with no `interpolate` call — so + // `{TODAY() + 90}` written here would bind that string verbatim and + // `create_opportunity` would post the braces into a date column. Measured + // on 17.3.0 by running a probe flow, not by reading the engine. The screen + // field is therefore the only layer that can carry the expression, which + // is where the +90 lives and why this line is deliberately bare. + { name: "closeDate", type: "date", isInput: true, isOutput: false } + ], + nodes: [ + { id: "start", type: "start", label: "Start", config: { objectName: "crm_lead" } }, + { + id: "screen_1", + type: "screen", + label: "Conversion Details", + config: { + // The suspected-duplicate warning. `lead_duplicate_check` flags a + // re-captured email at intake and links the record the lead repeats; + // the rep about to CONVERT is the last moment that flag is worth + // anything, and without it the duplicate becomes a second account, + // contact and opportunity. + // + // ⛔ Not on `convert_lead`'s `confirmText`: that string is static and + // unconditional, so it would warn identically on every clean lead — the + // cry-wolf that makes a confirm dialog furniture. This screen is where + // the conversion decision is actually taken, and the one surface that + // can say something TRUE about THIS lead. + // + // Mechanism: the executor renders `config.description` — a text slot, + // written as a `{{ }}` hole since 18.0.0-next.0 — into the `ScreenSpec` + // it puts on the wire, and `FlowRunner.tsx` renders it — + // `{screen.description && …}`. A hole over `null` + // renders the empty string, which the executor's `renderTextSlot` + // turns into no description at all (read in the installed + // 18.0.0-next.0 `service-automation`; on the 17.1.0 bundles it was + // measured as `interp` mapping null to `undefined`), so the clean-lead + // branch below (which assigns `null`) renders NO description rather + // than an empty paragraph. That is why the conditionality lives in an + // assignment and not in the copy: a screen `description` has no + // `visibleWhen`. + description: "{{duplicateWarning}}", + // `visibleWhen` on a screen field is BARE CEL over the screen's own + // field names — not the CEL value envelopes the rest of this flow uses + // for filters and `update_record` fields, evaluated on the server. The + // client re-evaluates the predicate against the values collected so far, + // which is why it cannot be a server-evaluated envelope. + fields: [ + // ⛔ NEVER `required` on a boolean screen field. A checkbox has no + // unanswered state — clear IS an answer, and "convert this lead + // WITHOUT an opportunity" is the commonest path. `required: true` + // blocks on both sides of the wire: the client counts the untouched + // box as an unanswered field and disables Submit, and from + // 17.0.0-rc.2 the SERVER enforces the screen's declared contract too, + // refusing the resume with `INVALID_SCREEN_INPUT: Screen field + // "createOpportunity" is required` — so a runner that posts only what + // the user touched cannot convert a lead at all. The variable's + // declared `defaultValue` is what supplies the answer. + // + // DERIVED, not restated. The envelope reads the flow variable + // `createOpportunity`, so the literal `false` is written exactly once in this + // file — on the declaration — and the widget prefill cannot drift from + // the value the engine binds. + // + // A screen field's `defaultValue` is a CEL value envelope evaluated + // before the descriptor goes on the wire, so the client receives the + // value, never the envelope: boolean `false`, which is what the + // 17.0.0 GA template was measured to send. (`visibleWhen` below is the + // opposite case: forwarded raw, never evaluated on the server. Same + // node, two different dialects.) + { name: "createOpportunity", label: "Create Opportunity?", type: "boolean", defaultValue: cel6`createOpportunity` }, + // PREFILLED FROM THE LEAD (REQ-0005 acceptance 2). Both defaults are + // CEL envelopes over `leadRecord`, which `get_lead` bound before this + // screen was reached — the fetch sits AHEAD of the screen for the + // duplicate warning, and these two ride the same ordering. + // + // ⚠️ Each envelope is evaluated before the descriptor goes on the + // wire, so `estimated_amount` arrives as a NUMBER. `company` is + // required on a lead; `estimated_amount` is not, so its read is + // guarded: a lead with no estimate is served `null` where 17.x served + // nothing (the migration entry: a field's `defaultValue` seeds the + // field with null), and an ABSENT column on a sparse datasource no + // longer fails the run at this screen. + // + // ⛔ The amount is prefilled, never copied silently. `estimated_amount` + // is a pre-qualification guess and `crm_opportunity.amount` is a + // number a rep defends in a forecast; conversion is the moment a human + // turns one into the other, so the figure is shown in an editable box + // and the rep confirms it. Writing it straight into + // `create_opportunity` would put an unreviewed estimate into the + // forecast and leave the two fields looking like copies of each other. + // + // `required` on the amount mirrors the column, for the reason given + // at `closeDate` below: `crm_opportunity.amount` is `required` + + // `notNull`, and without this a ticked box with no amount reached + // `create_opportunity` after the account and contact were written, + // leaving the lead half-converted (#2060 item 2). Visible-only, so + // an unticked box still converts with no amount. + { name: "opportunityName", label: "Opportunity Name", type: "text", required: true, defaultValue: cel6`leadRecord.company`, visibleWhen: "createOpportunity == true" }, + { name: "opportunityAmount", label: "Opportunity Amount", type: "currency", required: true, defaultValue: cel6`has(leadRecord.estimated_amount) ? leadRecord.estimated_amount : null`, visibleWhen: "createOpportunity == true" }, + // The close date, DEFAULTED AND VISIBLE. `close_date` is what files + // an opportunity into a forecast PERIOD, so ⛔ never stamp it silently + // inside `create_opportunity`: a hidden +90 days files every converted + // deal a quarter out and moves the forecast where nobody can see it. + // + // The +90 is written HERE and nowhere else, and here the layer is + // FORCED rather than preferred. A screen field's `defaultValue` is + // evaluated before the descriptor goes on the wire and a flow + // variable's default is bound raw (see the declaration above), so this + // is the only place the expression can be written at all. + // `isoDate(daysFromNow(90))` writes the `YYYY-MM-DD` string 90 days out + // on the UTC calendar — what 17.3.0's `{TODAY() + 90}` was measured to + // send — and the value the rep sees is the value + // `create_opportunity` writes. + // + // `required` mirrors the column — `crm_opportunity.close_date` is + // `required` + `notNull` — and it is what keeps the refusal at the + // SCREEN boundary. Measured both ways against a real ObjectQL engine: + // WITHOUT it, a submission carrying no date reaches + // `create_opportunity` and fails there with `Close Date is required`, + // by which point the account and the contact have already been + // written and the lead is left half-converted; WITH it the resume is + // refused before any node runs, nothing is written, and the message + // names the field. That path is not hypothetical — a rep who CLEARS + // the prefilled date posts the key empty, and `isPresent('')` is + // false. A hidden `required` never fires: the server contract skips it + // when `visibleWhen` evaluates false, and so does the console, which + // is the untouched-checkbox path this screen has always had to keep + // working. + { name: "closeDate", label: "Close Date", type: "date", required: true, defaultValue: cel6`isoDate(daysFromNow(90))`, visibleWhen: "createOpportunity == true" } + ] + } + }, + { + // ⛔ This fetch must stay AHEAD of the screen: the duplicate warning + // reads `leadRecord`, and a screen that suspends before the fetch has + // nothing to read. The fetch itself never depended on the screen — + // `recordId` is an input variable, seeded before the run starts. + id: "get_lead", + type: "get_record", + label: "Get Lead Record", + config: { objectName: "crm_lead", filter: { id: cel6`recordId` }, outputVariable: "leadRecord" } + }, + { + // Branching is on edges `e21` / `e22` / `e25` — see `decision_account`. + // Three ways out, because `duplicate_status` carries two different KINDS + // of fact and they get different answers: the machine's `suspected` guess + // warns and lets the rep decide (`e21`), a person's `confirmed` verdict + // refuses outright (`e25`), and everything else converts silently (`e22`). + id: "decision_duplicate", + type: "decision", + label: "Duplicate Verdict?" + }, + { + // The warning names the record the way the UI names a person — by the + // email address the two records share — and NOT by + // `duplicate_of_lead` / `duplicate_of_contact`, which hold ids. That is + // the house rule `test/record-id-not-in-prose.test.ts` states for every + // sentence a user reads: "the id goes in the relationship field that + // exists to carry it, or nowhere". The link itself is on the lead's + // record page (`lead_detail.page.ts`), where it can be clicked. + // + // "flagged at intake" is the app's own published definition of this + // value, not a guess about provenance: `duplicate_status`'s help text + // reads "Suspected = flagged automatically at intake" in all four + // locales, and `lead_duplicate_check` is insert-only by design. + // + // This warning's TEXT is English-only: it is the value of a variable, + // and no locale pack reaches a variable — the screen's translated + // `description` can only carry the `{{duplicateWarning}}` hole that + // shows it. The screens' own headings and bodies are keyed in the packs + // (`flows.lead_conversion` in `src/sales/translations//app.ts`), + // and the banner on the record page carries the warning in all four. + id: "warn_duplicate", + type: "assignment", + label: "Compose Duplicate Warning", + config: { + assignments: { + duplicateWarning: cel6`'Suspected duplicate — intake flagged this lead as repeating an existing record with this email address (' + leadRecord.email + '). Converting creates a second account, contact and opportunity for the same buyer; compare the linked record on the lead page before you continue.'` + } + } + }, + { + // The other branch assigns `null`, which is what makes the warning + // CONDITIONAL: the description hole renders it as no description at + // all (see `screen_1`). Same shape as `no_opportunity` below — both branches + // write the variable so no downstream read ever meets an unset one. + id: "no_duplicate_warning", + type: "assignment", + label: "No Duplicate Warning", + config: { assignments: { duplicateWarning: null } } + }, + { + // The REFUSAL. A `confirmed` duplicate is a person's verdict, and the app + // stops converting on it — the rule AGENTS.md states as "interception + // stands on a person's judgement". `suspected` keeps the warn-and-allow + // above: a machine's guess stays advisory, because `lead_duplicate_check` + // matches on email EQUALITY and a shared inbox (`info@`, a switchboard + // address) false-positives by construction. ⛔ Do not block on the guess — + // it would need an override flag to stay usable, and an override flag is + // the one shape this exhibit must not demonstrate. + // + // ## Why the refusal is HERE and not on `convert_lead`'s predicate + // + // A refusal must NAME the verdict and the surviving record, and measured + // against `@objectstack/spec` 17.2.0 the action predicates cannot: + // `visible` and `disabled` are each a bare boolean/CEL envelope with + // nowhere to put a sentence, so `visible` hides a button that cannot then + // explain itself and `disabled` greys one out with no reason attached. + // `errorMessage` on the Action is a single static string — what the + // console toasts on a FAILED run — and cannot say anything about THIS + // lead. A screen node's `description` is a text slot rendered per run + // and shown by `FlowRunner` as the dialog body. + // + // The flow is also the only choke point covering every door: the + // record-header button, the list-row button and the `action_convert_lead` + // AI tool all dispatch `POST /automation/lead_conversion/trigger`, while + // `visible` / `disabled` are console-side and say nothing to the other + // two. + // + // ## What the rep sees, measured on the shipped console bundle + // + // A run that PAUSES returns `{ success: true, silent: true }` to the + // action framework (`RecordDetailView`'s flow handler), and `silent` + // suppresses the success toast — so `convert_lead`'s + // `successMessage: 'Lead converted successfully!'` does NOT fire behind + // this dialog. Submitting it resumes into `end`; nothing is created and + // the lead is untouched on either path, because every write in this flow + // is downstream of `screen_1`. + // + // ## What the copy may claim + // + // ⛔ NOT the shared email address, which is what `warn_duplicate` above + // uses. That claim is safe for `suspected` because only + // `lead_duplicate_check` writes it and it matches on email; `confirmed` + // is written by a PERSON, and the lead form lets a reviewer point + // `duplicate_of_type` + its lookup at any record they like. So the + // refusal names the survivor through the relationship fields that exist + // to carry it (`test/record-id-not-in-prose.test.ts`: "the id goes in the + // relationship field that exists to carry it, or nowhere"), naming the + // `duplicates` field group by its shipped label, "Duplicate Management". + // That sentence also stays true on the `erased` tombstone, where the + // verdict survives its pointer (`lead.hook.ts`, job 1c). + // + // ⛔ Never transcribe the vocabulary of `duplicate_of_type` into this + // sentence ("an existing Lead" / "an existing Contact"). Those labels are + // locale-pack facts with one source of truth, the rep can see them on the + // section this line points at, and a hand-copied machine list in prose is + // the drift AGENTS.md documentation rule 5 forbids. + // + // The title and the body are translated in the packs + // (`flows.lead_conversion.screens.refuse_confirmed_duplicate`). + id: "refuse_confirmed_duplicate", + type: "screen", + label: "Conversion Refused", + config: { + title: "Conversion refused", + description: "This lead's Duplicate Status is Confirmed: a reviewer compared it against an existing record and recorded that it repeats one. Converting would create a second account, contact and opportunity for the same buyer. The Duplicate Management section on this lead names the surviving record; disqualify this lead as a duplicate instead. Only a reviewer revising that verdict reopens conversion.", + // A message-only screen: no fields, so the pause has to be asked for. + // `waitForInput` is what turns a field-less screen from a server-side + // pass-through into the dialog the rep reads (the executor's + // `shouldPause`), and without it this node would fall through to `end` + // in silence — a refusal nobody is told about. + waitForInput: true + } + }, + { + // Branching is on edges `e28` / `e29` — see `decision_account`. + id: "decision_approval", + type: "decision", + label: "Approved for Conversion?" + }, + { + // The approval gate, on the surface a REST caller reaches (REQ-0005 + // acceptance 3). `convert_lead`'s `visible` predicate hides the button and + // `lead.hook.ts` refuses the write, but this flow has its own door — + // `POST /automation/lead_conversion/trigger` — and without this branch a + // caller through that door would run the whole conversion and only be + // refused at `mark_converted`, by which point the account, the contact and + // the opportunity have already been written and the lead is left + // half-converted. Refusing HERE, ahead of `screen_1`, is what makes the + // gate whole: every create and update in this flow sits behind that + // screen, and this path never reaches it. + id: "refuse_unapproved", + type: "screen", + label: "Conversion Refused", + config: { + title: "Conversion refused", + description: "This lead has not been approved for conversion. An approver has to sign it off before it can become an account, contact and opportunity; the Conversion Approval field on the lead shows whether the decision is still pending or was refused. Keep working the lead in the meantime \u2014 nothing about it is frozen.", + // Field-less screen: `waitForInput` is what turns it from a server-side + // pass-through into the dialog the rep reads. See + // `refuse_confirmed_duplicate` for the mechanism. + waitForInput: true + } + }, + { + // Branching is on edges `e31` / `e32` — see `decision_account`. The + // match-key guard sits between the duplicate verdict and `screen_1`, so + // it dominates `find_account` and a key-less lead is refused before the + // rep fills in the form and before any write. It is the LAST of the + // three refusals on purpose: an unapproved lead or a confirmed duplicate + // is told that verdict first, and a missing key is a repairable data + // gap rather than a verdict. + id: "decision_match_key", + type: "decision", + label: "Company Match Key?" + }, + { + // The KEY-LESS refusal (#2017). Why `find_account` must not run without + // a key is recorded on that node; this is what the rep reads instead. + // + // A refusal, not a new account, and that is the flow's own stated intent + // rather than a fresh choice: a conversion that stops is far cheaper to + // diagnose than one that quietly attaches to the wrong account or + // creates a duplicate one, and `screen_1` offers the rep no account + // choice that could confirm a match by hand. + // + // The copy claims only what holds on every path into it: the key is + // derived from `company` on every write that carries it + // (`lead_duplicate_check`), and nothing has been written, because every + // create and update in this flow sits behind `screen_1`. Its title and + // body are translated in the packs, like the other two refusals. + // + // Field-less screen: `waitForInput` is what turns it from a server-side + // pass-through into the dialog the rep reads. See + // `refuse_confirmed_duplicate` for the mechanism. + id: "refuse_no_match_key", + type: "screen", + label: "Conversion Refused", + config: { + title: "Conversion refused", + description: "This lead's company has no match key, so conversion cannot tell which account it belongs to, and it will not guess: a guess could file the contact and opportunity under another customer. Saving the lead's Company rebuilds the key, so save it again, then convert. Nothing has been created.", + waitForInput: true + } + }, + { + // Account dedupe: match on the NORMALIZED company name, never on the raw + // one — "Acme Corp" and "ACME Corp" are the same account. + // + // Both sides of this comparison are stored, hook-maintained columns, and + // on 17.x that was forced rather than chosen: a flow template could not + // normalize ANYTHING. `service-automation`'s `resolveToken` recognises exactly one + // function form — `NOW()` / `TODAY()` — and every bare identifier in the + // expression fallback is substituted before evaluation, so no string + // method is reachable either: `{LOWER(x)}`, `{TRIM(x)}` and + // `{x.toLowerCase()}` all resolve to `undefined`, and an unwrapped + // `LOWER({x})` interpolates literally to "LOWER(Acme Corp)". A formula + // field is no help either — it has no physical column to filter on. So + // the producer canonicalizes (`account_protection`, + // `lead_duplicate_check`) and this node does a plain, indexed equality + // match. `test/account-name-normalized-match.test.ts` re-measures all of + // that rather than trusting this paragraph. + // + // Normalize-then-EXACT only: lower + trim + collapse internal + // whitespace. Fuzzy matching stays out of scope. + // + // A lead with NO `company_normalized` never reaches this node: + // `decision_match_key`, ahead of `screen_1`, refuses it first. The node + // cannot be left to refuse on its own, because "no key" arrives in two + // shapes that behave differently (both measured on 17.7.0): + // + // · ABSENT — a sparse datasource (`driver-memory` / `driver-mongodb`) + // on a row never written with the column. The token resolves to + // nothing and `get_record` refuses to run, so the run FAILS + // (`FLOW_FAILED`, "refusing to run — 1 filter condition(s) resolved + // to nothing and were dropped from the query …"). + // · NULL — SQL, or any datasource once the column is written empty, + // which `lead_duplicate_check` does on purpose for a company that + // folds to nothing. The token resolves to `null`, and a bare `null` + // in a filter is the platform's documented HAS-NO-VALUE predicate + // (`$eq: null`, `@objectstack/spec` `data/filter.zod.ts`). This + // lookup then MATCHES every account whose own key is null, and the + // lead converts onto an unrelated customer's account (#2017). + // + // A key-less lead is not only a row written before the producer existed + // (the backfill in docs/MAINTENANCE.md §3.3): a non-string company + // written through the record API folds to `null` too. A conversion that + // stops is far cheaper to diagnose than one that quietly attaches to the + // wrong account or creates a duplicate one, so the answer is the + // refusal the rep reads in `refuse_no_match_key`. + // + // Since 18.0.0-next.0 the operand is a CEL envelope: an absent key fails + // the run before the query, and a null one refuses the node instead of + // matching (the platform's `flow-value-slot-template-dialect-refused` + // entry; not re-measured here). Neither shape converts onto another + // account any more, and `decision_match_key` still refuses first, with + // copy the rep can read. + // + // ⛔ Never paper this over with a second, case-sensitive lookup on the + // raw `name`: a missing key means the producer could not derive one, and + // a tolerant consumer path would hide that while restoring the exact bug + // this node exists to fix. + id: "find_account", + type: "get_record", + label: "Find Existing Account", + config: { objectName: "crm_account", filter: { name_normalized: cel6`leadRecord.company_normalized` }, outputVariable: "matchedAccount" } + }, + { + // Branching is on edges `e5` / `e6`. No `config.condition` here: a + // `decision` node's singular one is never evaluated. + id: "decision_account", + type: "decision", + label: "Account Already Exists?" + }, + { + // NEW-account branch. outputVariable is `createdAccount`; the assignment + // below normalizes both branches onto a single `accountId` id string so + // downstream nodes don't need to know which path ran. + // + // `name` carries the lead's company VERBATIM — the display value. The + // match key `name_normalized` is deliberately absent: it is readonly and + // hook-owned, and `account_protection` derives it from the `name` written + // here, so an account created by this node is immediately findable by the + // next conversion. + id: "create_account", + type: "create_record", + label: "Create Account", + config: { + objectName: "crm_account", + fields: { + // `company` is required on a lead; every other copied fact is + // optional, so its read is guarded to null (an insert treats null as + // it treated the key the template left out). + name: cel6`leadRecord.company`, + phone: cel6`has(leadRecord.phone) ? leadRecord.phone : null`, + website: cel6`has(leadRecord.website) ? leadRecord.website : null`, + industry: cel6`has(leadRecord.industry) ? leadRecord.industry : null`, + annual_revenue: cel6`has(leadRecord.annual_revenue) ? leadRecord.annual_revenue : null`, + number_of_employees: cel6`has(leadRecord.number_of_employees) ? leadRecord.number_of_employees : null`, + billing_address: cel6`has(leadRecord.address) ? leadRecord.address : null`, + owner_id: cel6`current_user.id`, + is_active: true + }, + outputVariable: "createdAccount" + } + }, + { + id: "use_new_account", + type: "assignment", + label: "Use New Account", + config: { assignments: { accountId: cel6`createdAccount.id` } } + }, + { + id: "use_existing_account", + type: "assignment", + label: "Reuse Existing Account", + config: { assignments: { accountId: cel6`matchedAccount.id` } } + }, + { + // Contact dedupe by email — GLOBAL, not per-account. ⛔ Never scope this + // lookup to the account: `crm_contact` carries a global unique index on + // `email`, so an account-scoped lookup misses a same-email contact under + // another account and `create_contact` then explodes on the DB index + // AFTER the account has been created, orphaning it. Leads require an + // email, so the match key is reliable. + id: "find_contact", + type: "get_record", + label: "Find Existing Contact", + config: { + objectName: "crm_contact", + filter: { email: cel6`leadRecord.email` }, + outputVariable: "matchedContact" + } + }, + { + // Branching is on edges `e11` / `e12` — see `decision_account`. + id: "decision_contact", + type: "decision", + label: "Contact Already Exists?" + }, + { + // `accountId` is a bare id string from whichever account branch ran. + id: "create_contact", + type: "create_record", + label: "Create Contact", + config: { + objectName: "crm_contact", + fields: { + // The person's own facts travel with them (#2068). `crm_contact` + // declares each of these on the lead's vocabulary (`_picklists.ts` + // for the two selects, pinned by `test/actions-flows-integrity`), so + // a straight copy is always legal. The two opt-outs are copied, + // never defaulted: a lead that opted out must not become a contact + // that has not — `email_opt_out` hides Send Email and silences + // `contact_welcome`, `do_not_call` refuses a scheduled call. A + // REUSED contact does not come through here: see + // `decision_contact_do_not_call`. + // + // Names and email are required on a lead and read bare; the rest + // are optional and guarded to null, which an insert reads as the + // omitted key the template wrote (each opt-out then takes its + // `false` default, as before). + salutation: cel6`has(leadRecord.salutation) ? leadRecord.salutation : null`, + mobile: cel6`has(leadRecord.mobile) ? leadRecord.mobile : null`, + lead_source: cel6`has(leadRecord.lead_source) ? leadRecord.lead_source : null`, + do_not_call: cel6`has(leadRecord.do_not_call) ? leadRecord.do_not_call : null`, + email_opt_out: cel6`has(leadRecord.email_opt_out) ? leadRecord.email_opt_out : null`, + first_name: cel6`leadRecord.first_name`, + last_name: cel6`leadRecord.last_name`, + email: cel6`leadRecord.email`, + phone: cel6`has(leadRecord.phone) ? leadRecord.phone : null`, + title: cel6`has(leadRecord.title) ? leadRecord.title : null`, + crm_account: cel6`accountId`, + is_primary: true, + owner_id: cel6`current_user.id` + }, + outputVariable: "createdContact" + } + }, + { + id: "use_new_contact", + type: "assignment", + label: "Use New Contact", + config: { assignments: { contactId: cel6`createdContact.id` } } + }, + { + id: "use_existing_contact", + type: "assignment", + label: "Reuse Existing Contact", + config: { assignments: { contactId: cel6`matchedContact.id` } } + }, + { + // ── A REUSED contact keeps the stricter consent (#2068) ────────────── + // + // `create_contact` copies the lead's opt-outs onto a NEW contact. A + // reused contact already holds its own answer, and an opt-out is a + // promise to a person that a conversion never takes back — so this path + // only ever RAISES a flag, one node per flag, and only when the lead + // carries it. The `raise_*` nodes write the literal `true`, ⛔ never a + // copy of `leadRecord.x`: a copy would write the lead's `false` over a contact + // who had opted out. `crm_account` carries neither flag, so the account + // half of "the stricter value wins" has nothing to write. + // + // The edges read the LEAD's flag only, not whether the contact already + // holds it. Reading `vars.matchedContact.x` needs a + // `has(vars.matchedContact)` guard, which + // `test/flow-variable-conditions.test.ts` forbids on this flow (a + // `get_record` binds it on every path) — and writing `true` over `true` + // changes nothing. + // + // Branching on `e35` / `e36`, then `e38` / `e39`: each pair is TOTAL and + // partitions by De Morgan, so exactly one edge holds on every shape + // `get_lead` can bind — pinned in `test/flow-conversion.test.ts`. + id: "decision_contact_do_not_call", + type: "decision", + label: "Lead Is Do-Not-Call?" + }, + { + id: "raise_contact_do_not_call", + type: "update_record", + label: "Carry Do-Not-Call to Contact", + config: { objectName: "crm_contact", filter: { id: cel6`contactId` }, fields: { do_not_call: true } } + }, + { + id: "decision_contact_email_opt_out", + type: "decision", + label: "Lead Opted Out of Email?" + }, + { + id: "raise_contact_email_opt_out", + type: "update_record", + label: "Carry Email Opt-Out to Contact", + config: { objectName: "crm_contact", filter: { id: cel6`contactId` }, fields: { email_opt_out: true } } + }, + { + // Branching is on edges `e16` / `e17` — see `decision_account`. + id: "decision_opportunity", + type: "decision", + label: "Create Opportunity?" + }, + { + // `close_date` comes from the screen field, which is the only layer that + // can carry the `isoDate(daysFromNow(90))` expression — see the + // `closeDate` declaration. An unbound `closeDate` fails the run at this + // node rather than inventing a quarter, which is the failure this node + // is allowed to have. + id: "create_opportunity", + type: "create_record", + label: "Create Opportunity", + config: { + objectName: "crm_opportunity", + fields: { + name: cel6`opportunityName`, + crm_account: cel6`accountId`, + primary_contact: cel6`contactId`, + amount: cel6`opportunityAmount`, + stage: "prospecting", + probability: 10, + lead_source: cel6`has(leadRecord.lead_source) ? leadRecord.lead_source : null`, + close_date: cel6`closeDate`, + owner_id: cel6`current_user.id` + }, + outputVariable: "createdOpportunity" + } + }, + { + // Normalize both opportunity branches onto a single `opportunityId`, the + // same pattern as accountId/contactId. ⛔ Never reference + // `createdOpportunity.id` downstream instead: on the "No" branch the + // create node never ran, and the unbound read fails the run (on 17.x the + // unresolved token interpolated into the `converted_opportunity` lookup + // as a placeholder). + id: "use_new_opportunity", + type: "assignment", + label: "Use New Opportunity", + config: { assignments: { opportunityId: cel6`createdOpportunity.id` } } + }, + { + id: "no_opportunity", + type: "assignment", + label: "No Opportunity", + config: { assignments: { opportunityId: null } } + }, + { + id: "mark_converted", + type: "update_record", + label: "Mark Lead as Converted", + config: { + objectName: "crm_lead", + filter: { id: cel6`recordId` }, + fields: { + // `status: 'converted'` rides along so list views agree with the + // conversion flags (the qualified → converted transition is legal + // per the lead_status_progression state machine). + is_converted: true, + status: "converted", + converted_date: cel6`isoDatetime(now())`, + converted_account: cel6`accountId`, + converted_contact: cel6`contactId`, + converted_opportunity: cel6`opportunityId` + } + } + }, + { + // ADR-0012: deliver via the `notify` node (inbox + email). The legacy + // `script` + `actionType:'email'` shape is a no-op stub in 7.4. + id: "send_notification", + type: "notify", + label: "Send Confirmation", + config: { + recipients: [cel6`current_user.id`], + channels: ["inbox", "email"], + topic: "lead_converted", + template: "crm.lead_converted", + templateData: { first_name: cel6`leadRecord.first_name`, last_name: cel6`leadRecord.last_name` }, + actionUrl: "/crm_account/{{accountId}}" + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + // ⛔ A retired edge's id stays VACANT and every surviving edge keeps the id + // it has always had — `e1`, `e3` and `e15` are gaps on purpose. + // Renumbering to close a gap rewrites ids that other notes, tests and run + // logs refer to. + { id: "e0", source: "start", target: "get_lead", type: "default" }, + // ⛔ When you add an edge, take the next id AFTER THE HIGHEST IN USE — do + // not reuse a vacant one, and do not assume an unused-looking id is free. + // A duplicate id is INERT (traversal filters out-edges by `source`, never + // by `id`), so nothing fails and the collision survives to trap the next + // editor picking out of the sequence. `e1`, `e3` and `e15` are vacant + // retired ids and stay that way; `e27` is above the highest live id, not + // a gap-fill. + { id: "e27", source: "get_lead", target: "decision_approval", type: "default" }, + // ── The approval gate (REQ-0005 step 7) ──────────────────────────── + // + // The same TOTAL, PARTITIONING pair the duplicate verdict below is written + // as, and for the same measured reason: a decision node declaring no + // `config.conditions` takes EVERY out-edge whose condition holds, in + // parallel, so two overlapping guards would refuse the conversion and + // continue it in one run. `e29` is `e28` negated by De Morgan. + // + // ⚠️ The polarity is fail-OPEN, unlike the duplicate branch, and that is the + // gate's off switch rather than a slip. Only the two verdicts a live + // approval writes refuse; `not_required` — the shipped default — and an + // absent column (a lead from before the field existed) both continue, so + // with the gate off this pair is invisible and conversion behaves exactly as + // it did before. `lead.hook.ts` and `convert_lead.visible` carry the same + // polarity, because the three have to agree about what "off" means. + { id: "e28", source: "decision_approval", target: "refuse_unapproved", type: "default", condition: P26`has(vars.leadRecord) && has(vars.leadRecord.conversion_approval_status) + && (vars.leadRecord.conversion_approval_status == "pending" || vars.leadRecord.conversion_approval_status == "rejected")`, label: "Not approved" }, + { id: "e29", source: "decision_approval", target: "decision_duplicate", type: "default", condition: P26`!has(vars.leadRecord) || !has(vars.leadRecord.conversion_approval_status) + || (vars.leadRecord.conversion_approval_status != "pending" && vars.leadRecord.conversion_approval_status != "rejected")`, label: "Clear" }, + // Rejoins nothing, exactly like `e26`: the refusal IS not reaching a writer. + { id: "e30", source: "refuse_unapproved", target: "end", type: "default" }, + // ⚠️ Both conditions are TOTAL, and on this surface that is not a style + // preference: a flow condition is interpreted strict CEL on every run, and + // an unguarded field read against a driver that omits absent columns + // (`driver-memory` / `driver-mongodb`) aborts — which FAILS THE RUN, so an + // unguarded read here would make ordinary leads unconvertible. Measured, in + // exactly that shape: `condition failed to evaluate as CEL: No such key: + // duplicate_status`. The full table is in + // `test/flow-condition-totality.test.ts`. + // + // TWO guards, in the spelling `test/flow-variable-conditions.test.ts` + // requires, and the outer one is not decoration: `vars.leadRecord` is a + // KEY, so a plain `vars.leadRecord != null` would itself abort with + // `Unknown variable` on the run where `get_lead` bound nothing — the guard + // would be the fault it was written to prevent. `has(vars.leadRecord)` + // answers instead of reading. + // + // The THREE edges PARTITION by De Morgan (`!(a && b && c)` written out as + // `!a || !b || !c`, with the two verdict tests conjoined under the last + // term), so exactly one is true for every record shape, including the + // shapes where the column, the row or both are missing. + // + // ⛔ `e22`'s third term must carry BOTH inequalities. A decision node that + // declares no `config.conditions` reports no branch, so traversal takes + // EVERY out-edge whose condition holds, IN PARALLEL — with `e22` left at + // `!= "suspected"` a confirmed lead satisfies `e22` AND `e25`, showing the + // refusal and converting the lead in the same run. Measured on + // `AutomationEngine.evaluateCondition` across all seven record shapes; the + // pin is in `test/lead-duplicate-visibility.test.ts`. + { id: "e21", source: "decision_duplicate", target: "warn_duplicate", type: "default", condition: P26`has(vars.leadRecord) && has(vars.leadRecord.duplicate_status) && vars.leadRecord.duplicate_status == "suspected"`, label: "Suspected" }, + { id: "e25", source: "decision_duplicate", target: "refuse_confirmed_duplicate", type: "default", condition: P26`has(vars.leadRecord) && has(vars.leadRecord.duplicate_status) && vars.leadRecord.duplicate_status == "confirmed"`, label: "Confirmed" }, + { id: "e22", source: "decision_duplicate", target: "no_duplicate_warning", type: "default", condition: P26`!has(vars.leadRecord) || !has(vars.leadRecord.duplicate_status) || (vars.leadRecord.duplicate_status != "suspected" && vars.leadRecord.duplicate_status != "confirmed")`, label: "Clean" }, + // Both clear duplicate branches pass the match-key guard before the form. + { id: "e23", source: "warn_duplicate", target: "decision_match_key", type: "default" }, + { id: "e24", source: "no_duplicate_warning", target: "decision_match_key", type: "default" }, + // ── The match-key guard (#2017) ──────────────────────────────────── + // + // TOTAL and PARTITIONING, for the reason recorded at `e28` / `e29`: `e32` + // is `e31` negated by De Morgan, so exactly one holds for every shape + // `get_lead` can bind — unbound, a null row, the column absent, null, + // empty, or keyed. `has()` alone is not the test: on a row that carries + // the column as null it answers true, so the value needs `isBlank` too. + // Fail-CLOSED, unlike the approval gate: without a key there is nothing to + // match on, and a guess is the defect. + { id: "e31", source: "decision_match_key", target: "screen_1", type: "default", condition: P26`has(vars.leadRecord) && has(vars.leadRecord.company_normalized) && !isBlank(vars.leadRecord.company_normalized)`, label: "Has match key" }, + { id: "e32", source: "decision_match_key", target: "refuse_no_match_key", type: "default", condition: P26`!has(vars.leadRecord) || !has(vars.leadRecord.company_normalized) || isBlank(vars.leadRecord.company_normalized)`, label: "No match key" }, + // Rejoins nothing, exactly like `e26` / `e30`. + { id: "e33", source: "refuse_no_match_key", target: "end", type: "default" }, + // The refusal branch rejoins nothing: it goes straight to `end`, so no + // node that writes is downstream of it. That is the refusal — the flow's + // every create/update sits behind `screen_1`, which this path never + // reaches. + { id: "e26", source: "refuse_confirmed_duplicate", target: "end", type: "default" }, + { id: "e2", source: "screen_1", target: "find_account", type: "default" }, + { id: "e4", source: "find_account", target: "decision_account", type: "default" }, + // Existing account → reuse; no account → create. Both converge on create_contact. + // `find_account` is reached only with a match key (`e31`), so a match + // here is an equality on a real key, never the has-no-value predicate. + // ⛔ No second copy of the key test on these two edges: it could never + // be false here, and an inert restatement of a live predicate is the + // shape #650 retired from this repo's decision nodes. + { id: "e5", source: "decision_account", target: "use_existing_account", type: "default", condition: P26`vars.matchedAccount != null`, label: "Existing" }, + { id: "e6", source: "decision_account", target: "create_account", type: "default", condition: P26`vars.matchedAccount == null`, label: "New" }, + { id: "e7", source: "create_account", target: "use_new_account", type: "default" }, + // Both account branches converge on the contact-dedupe lookup. + { id: "e8", source: "use_new_account", target: "find_contact", type: "default" }, + { id: "e9", source: "use_existing_account", target: "find_contact", type: "default" }, + { id: "e10", source: "find_contact", target: "decision_contact", type: "default" }, + // Existing contact → reuse; none → create. Both converge on + // decision_opportunity, the reuse path through the consent raise below. + { id: "e11", source: "decision_contact", target: "use_existing_contact", type: "default", condition: P26`vars.matchedContact != null`, label: "Existing" }, + { id: "e12", source: "decision_contact", target: "create_contact", type: "default", condition: P26`vars.matchedContact == null`, label: "New" }, + { id: "e13", source: "create_contact", target: "use_new_contact", type: "default" }, + { id: "e14", source: "use_new_contact", target: "decision_opportunity", type: "default" }, + // ── The reused contact's consent raise (#2068) ───────────────────── + // + // `e15` (use_existing_contact → decision_opportunity) is RETIRED and stays + // vacant; `e34` replaces it. Each pair below is TOTAL and PARTITIONING, and + // only a flag the lead carries as `true` takes the raise. + { id: "e34", source: "use_existing_contact", target: "decision_contact_do_not_call", type: "default" }, + { id: "e35", source: "decision_contact_do_not_call", target: "raise_contact_do_not_call", type: "default", condition: P26`has(vars.leadRecord) && has(vars.leadRecord.do_not_call) && vars.leadRecord.do_not_call == true`, label: "Do not call" }, + { id: "e36", source: "decision_contact_do_not_call", target: "decision_contact_email_opt_out", type: "default", condition: P26`!has(vars.leadRecord) || !has(vars.leadRecord.do_not_call) || vars.leadRecord.do_not_call != true`, label: "Callable" }, + { id: "e37", source: "raise_contact_do_not_call", target: "decision_contact_email_opt_out", type: "default" }, + { id: "e38", source: "decision_contact_email_opt_out", target: "raise_contact_email_opt_out", type: "default", condition: P26`has(vars.leadRecord) && has(vars.leadRecord.email_opt_out) && vars.leadRecord.email_opt_out == true`, label: "Opted out" }, + { id: "e39", source: "decision_contact_email_opt_out", target: "decision_opportunity", type: "default", condition: P26`!has(vars.leadRecord) || !has(vars.leadRecord.email_opt_out) || vars.leadRecord.email_opt_out != true`, label: "Emailable" }, + { id: "e40", source: "raise_contact_email_opt_out", target: "decision_opportunity", type: "default" }, + { id: "e16", source: "decision_opportunity", target: "create_opportunity", type: "default", condition: P26`vars.createOpportunity == true`, label: "Yes" }, + { id: "e17", source: "decision_opportunity", target: "no_opportunity", type: "default", condition: P26`vars.createOpportunity != true`, label: "No" }, + { id: "e18", source: "create_opportunity", target: "use_new_opportunity", type: "default" }, + { id: "e18a", source: "use_new_opportunity", target: "mark_converted", type: "default" }, + { id: "e18b", source: "no_opportunity", target: "mark_converted", type: "default" }, + { id: "e19", source: "mark_converted", target: "send_notification", type: "default" }, + { id: "e20", source: "send_notification", target: "end", type: "default" } + ] +}; + +// src/sales/flows/lead-conversion-approval.flow.ts +import { P as P27, cel as cel7 } from "@objectstack/spec"; +var LeadConversionApprovalFlow = { + name: "lead_conversion_approval", + label: "Lead Conversion Approval", + description: "Sign-off a lead needs before it may be converted. Inert unless the install arms the gate on crm_lead.conversion_approval_status.", + type: "record_change", + status: "active", + // Same reading `opportunity_approval` records, and for the same two reasons. + // A gate exists to CONSTRAIN the submitter, so the submitter's own scope is + // the wrong identity to evaluate it under — and an approval control that + // engages only for writers carrying a session is not a control, since a + // `runAs: 'system'` importer creating leads would simply bypass it. The + // verdict writes below also land on `conversion_approval_status`, which is + // `readonly: true` on the object, so only a platform write reaches it. + runAs: "system", + variables: [ + { name: "leadId", type: "text", isInput: true, isOutput: false } + ], + nodes: [ + { + id: "start", + type: "start", + label: "Start", + config: { + objectName: "crm_lead", + triggerType: "record-after-create", + // TOTALITY (AGENTS.md — validation predicates must be TOTAL): `has()` + // on every read. A flow condition is strict CEL on every run, and an + // unguarded read against a driver that omits absent columns aborts — + // which from 17.0.0-rc.2 FAILS THE RUN rather than skipping it. The + // absent case must read as "not gated": a lead with no approval column + // at all is a lead from before the field existed, and it converts the + // way it always did. + condition: P27`has(record.conversion_approval_status) && record.conversion_approval_status == "pending"` + } + }, + { + id: "get_lead", + type: "get_record", + label: "Get Lead", + config: { objectName: "crm_lead", filter: { id: cel7`record.id` }, outputVariable: "leadRecord" } + }, + { + id: "conversion_review", + type: "approval", + label: "Lead Conversion Review", + config: { + // The customer's chain is 销售负责人 → 销售总监; the generic shape core + // ships is the manager bench this app already declares approvers + // against. A second tier, or a different position, is overlay + // configuration — the same status as the need-type vocabulary. + approvers: [{ type: "position", value: "sales_manager" }], + // Explicit though it is the schema default, exactly as + // `opportunity_approval` authors it: approvers snapshot at request + // creation, so an empty bench would otherwise leave the request + // undecidable — and here that means a lead nobody can ever convert. + onEmptyApprovers: "admin_rescue", + behavior: "first_response", + // ⚠️ `false`, and NOT the schema default `true` — the one place this + // node deliberately differs from its opportunity sibling. A deal under + // review is a document being negotiated; a LEAD under review is a person + // a rep is still calling. Locking the record would freeze + // `last_contacted_date`, `next_followup_date`, the notes and every + // activity bubble for as long as the approver takes, so the gate would + // stop the work it exists to authorise. Nothing is at risk in leaving it + // open: the verdict column is `readonly: true`, so the only field this + // node's decision touches is one no user may write anyway. + lockRecord: false, + approvalStatusField: "conversion_approval_status" + } + }, + { + id: "mark_approved", + type: "update_record", + label: "Mark Approved", + config: { + objectName: "crm_lead", + filter: { id: cel7`record.id` }, + fields: { conversion_approval_status: "approved" } + } + }, + { + id: "notify_approved", + type: "notify", + label: "Notify Owner \u2014 Approved", + config: { + recipients: [cel7`has(leadRecord.owner_id) ? leadRecord.owner_id : null`], + channels: ["inbox"], + topic: "lead_conversion_approved", + template: "crm.lead_conversion_approved", + templateData: { first_name: cel7`leadRecord.first_name`, last_name: cel7`leadRecord.last_name` }, + actionUrl: "/crm_lead/{{record.id}}" + } + }, + { + id: "mark_rejected", + type: "update_record", + label: "Mark Rejected", + config: { + objectName: "crm_lead", + filter: { id: cel7`record.id` }, + fields: { conversion_approval_status: "rejected" } + } + }, + { + id: "notify_rejected", + type: "notify", + label: "Notify Owner \u2014 Rejected", + config: { + recipients: [cel7`has(leadRecord.owner_id) ? leadRecord.owner_id : null`], + channels: ["inbox"], + severity: "warning", + topic: "lead_conversion_rejected", + template: "crm.lead_conversion_rejected", + templateData: { first_name: cel7`leadRecord.first_name`, last_name: cel7`leadRecord.last_name` }, + actionUrl: "/crm_lead/{{record.id}}" + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "get_lead", type: "default" }, + { id: "e2", source: "get_lead", target: "conversion_review", type: "default" }, + // Approval-node branch labels — the engine resumes down the out-edge whose + // `label` matches the recorded decision. + { id: "e3", source: "conversion_review", target: "mark_approved", type: "default", label: "approve" }, + { id: "e4", source: "conversion_review", target: "mark_rejected", type: "default", label: "reject" }, + { id: "e5", source: "mark_approved", target: "notify_approved", type: "default" }, + { id: "e6", source: "notify_approved", target: "end", type: "default" }, + { id: "e7", source: "mark_rejected", target: "notify_rejected", type: "default" }, + { id: "e8", source: "notify_rejected", target: "end", type: "default" } + ] +}; + +// src/sales/flows/account-approval.flow.ts +import { P as P28, cel as cel8 } from "@objectstack/spec"; +var AccountApprovalFlow = { + name: "account_approval", + label: "Account Approval", + description: "Sign-off a newly created account needs before it counts as established data. Switchable from crm_account.approval_status.", + type: "record_change", + status: "active", + // Same reading the two sibling approval flows record. A gate exists to + // CONSTRAIN the submitter, so the submitter's own scope is the wrong identity + // to evaluate it under; and the verdict writes below land on + // `approval_status`, which is `readonly: true` on the object, so only a + // platform write reaches it at all. + runAs: "system", + variables: [{ name: "accountId", type: "text", isInput: true, isOutput: false }], + nodes: [ + { + id: "start", + type: "start", + label: "Start", + config: { + objectName: "crm_account", + triggerType: "record-after-create", + // Fires on the BLANK a new account is born with (see the header): + // absent on a sparse driver, null on SQL. A user cannot pre-fill the + // column (it is `readonly`), so only a system writer or an install's + // `approved` default can make it non-blank at insert, and both mean + // "nothing to submit". + // TOTALITY (AGENTS.md — validation predicates must be TOTAL): the + // `(!has(x) || isBlank(x))` form is the "x holds no value" row of that + // table. A flow condition is strict CEL on every run, and an unguarded + // read against a driver that omits absent columns aborts — which from + // 17.0.0-rc.2 FAILS THE RUN rather than skipping it. + condition: P28`!has(record.approval_status) || isBlank(record.approval_status)` + } + }, + { + id: "get_account", + type: "get_record", + label: "Get Account", + config: { + objectName: "crm_account", + filter: { id: cel8`record.id` }, + outputVariable: "accountRecord" + } + }, + { + id: "account_review", + type: "approval", + label: "Account Review", + config: { + // The customer's chain is 销售负责人 → 销售总监; REQ-0003 rules that named + // chain **C** (overlay — one company's org chart), so core ships the + // one generic tier against the manager bench this app already declares. + approvers: [{ type: "position", value: "sales_manager" }], + // Explicit though it is the schema default, exactly as both sibling + // flows author it: approvers snapshot at request creation, so an empty + // bench would otherwise leave the request undecidable — and here that + // means an account nobody can ever approve. + onEmptyApprovers: "admin_rescue", + behavior: "first_response", + // ⚠️ `false`, matching the lead sibling rather than the opportunity one. + // An account under review is a record a rep is still working — contacts + // are being attached, the address is being corrected, activity is + // landing on it. Locking it would freeze exactly the data-entry the + // approval exists to review. Nothing is at risk: the verdict column is + // `readonly: true`, so the only field this decision touches is one no + // user may write anyway. + lockRecord: false, + approvalStatusField: "approval_status" + } + }, + { + id: "mark_approved", + type: "update_record", + label: "Mark Approved", + config: { + objectName: "crm_account", + filter: { id: cel8`record.id` }, + fields: { approval_status: "approved" } + } + }, + { + id: "notify_approved", + type: "notify", + label: "Notify Owner \u2014 Approved", + config: { + recipients: [cel8`has(accountRecord.owner_id) ? accountRecord.owner_id : null`], + channels: ["inbox"], + topic: "account_approved", + template: "crm.account_approved", + templateData: { name: cel8`accountRecord.name` }, + actionUrl: "/crm_account/{{record.id}}" + } + }, + { + id: "mark_rejected", + type: "update_record", + label: "Mark Rejected", + config: { + objectName: "crm_account", + filter: { id: cel8`record.id` }, + fields: { approval_status: "rejected" } + } + }, + { + id: "notify_rejected", + type: "notify", + label: "Notify Owner \u2014 Rejected", + config: { + recipients: [cel8`has(accountRecord.owner_id) ? accountRecord.owner_id : null`], + channels: ["inbox"], + severity: "warning", + topic: "account_rejected", + template: "crm.account_rejected", + templateData: { name: cel8`accountRecord.name` }, + actionUrl: "/crm_account/{{record.id}}" + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "get_account", type: "default" }, + { id: "e2", source: "get_account", target: "account_review", type: "default" }, + // Approval-node branch labels — the engine resumes down the out-edge whose + // `label` matches the recorded decision. + { id: "e3", source: "account_review", target: "mark_approved", type: "default", label: "approve" }, + { id: "e4", source: "account_review", target: "mark_rejected", type: "default", label: "reject" }, + { id: "e5", source: "mark_approved", target: "notify_approved", type: "default" }, + { id: "e6", source: "notify_approved", target: "end", type: "default" }, + { id: "e7", source: "mark_rejected", target: "notify_rejected", type: "default" }, + { id: "e8", source: "notify_rejected", target: "end", type: "default" } + ] +}; + +// src/sales/flows/schedule-followup.flow.ts +import { cel as cel9 } from "@objectstack/spec"; +var ScheduleFollowUpFlow = { + name: "schedule_followup", + label: "Schedule Follow-up", + description: "Create the next follow-up task on a lead, already linked and owned.", + type: "screen", + status: "active", + variables: [ + // MUST be `recordId` — the console's flow-action contract seeds only that + // name (and its camelCase object alias); a custom name arrives undefined. + { name: "recordId", type: "text", isInput: true, isOutput: false }, + { name: "subject", type: "text", isInput: true, isOutput: false }, + { name: "dueDate", type: "date", isInput: true, isOutput: false }, + { name: "activityType", type: "text", isInput: true, isOutput: false }, + { name: "priority", type: "text", isInput: true, isOutput: false }, + { name: "notes", type: "text", isInput: true, isOutput: false } + ], + nodes: [ + { id: "start", type: "start", label: "Start", config: { objectName: "crm_lead" } }, + { + id: "screen_1", + type: "screen", + label: "Schedule Follow-up", + config: { + fields: [ + { name: "subject", label: "What is the next step?", type: "text", required: true }, + { name: "dueDate", label: "Due Date", type: "date", required: true }, + { + name: "activityType", + label: "Activity Type", + type: "select", + // Mirrors crm_task.type exactly. ⛔ Never hand-copy the subset — it + // silently drops an option (`other`) from the picker. + options: plainOptions(TASK_TYPE_OPTIONS) + }, + { + name: "priority", + label: "Priority", + type: "select", + options: [ + { label: "Low", value: "low" }, + { label: "Normal", value: "normal" }, + { label: "High", value: "high" }, + { label: "Urgent", value: "urgent" } + ] + }, + { name: "notes", label: "Notes", type: "textarea" } + ] + } + }, + { + id: "get_lead", + type: "get_record", + label: "Get Lead Record", + config: { objectName: "crm_lead", filter: { id: cel9`recordId` }, outputVariable: "leadRecord" } + }, + { + id: "create_task", + type: "create_record", + label: "Create Follow-up Task", + config: { + objectName: "crm_task", + fields: { + subject: cel9`subject`, + due_date: cel9`dueDate`, + // The three optional answers: a resume may leave one unbound, which + // the template wrote as nothing and the guard writes as null. On an + // insert the two are the same — the engine applies a field's default + // to an explicit null exactly as to an omitted key, so an unanswered + // priority still lands as `normal`. + type: cel9`has(vars.activityType) ? activityType : null`, + priority: cel9`has(vars.priority) ? priority : null`, + description: cel9`has(vars.notes) ? notes : null`, + status: "not_started", + owner_id: cel9`current_user.id`, + // Polymorphic parent: both halves are required for the lead's + // Related tab to pick the task up. + related_to_type: "crm_lead", + related_to_lead: cel9`recordId` + }, + outputVariable: "createdTask" + } + }, + { + // Keep the lead's own follow-up date in step with the task that was just + // filed, so the Hot Leads view (sorted by next_followup_date) reflects + // the commitment the rep actually made. + id: "stamp_lead", + type: "update_record", + label: "Stamp Next Follow-up Date", + config: { + objectName: "crm_lead", + filter: { id: cel9`recordId` }, + fields: { next_followup_date: cel9`dueDate` } + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "screen_1", type: "default" }, + { id: "e2", source: "screen_1", target: "get_lead", type: "default" }, + { id: "e3", source: "get_lead", target: "create_task", type: "default" }, + { id: "e4", source: "create_task", target: "stamp_lead", type: "default" }, + { id: "e5", source: "stamp_lead", target: "end", type: "default" } + ] +}; + +// src/sales/flows/opportunity-approval.flow.ts +import { P as P29, cel as cel10 } from "@objectstack/spec"; +var OpportunityApprovalFlow = { + name: "opportunity_approval", + label: "Large Deal Approval", + description: "Tiered approval for opportunities: manager review at $100K or more, director sign-off > $500K.", + type: "record_change", + status: "active", + // Same user-less exposure as every record-change flow (ADR-0049) — and the + // one with teeth. Measured on 17.0.0-rc.2: a $150K renewal + // created by the `runAs: 'system'` contract_renewal sweep fired this flow + // with no trigger user, and the run died at `get_opportunity`. The deal sat + // at `approval_status: 'not_required'`, unlocked, with no approval request + // ever opened — the gate was bypassed by the writer simply not carrying a + // session. An approval control that only engages for logged-in writers is + // not a control. + // + // Elevating the USER-driven runs too is not merely acceptable here, it is + // required. This gate exists to CONSTRAIN the submitter, so the submitter's + // own scope is the wrong identity to evaluate it under; and + // `mark_approved` / `mark_rejected` stamp `approval_status` on a record the + // approval node holds locked (`lockRecord: true`), which only a platform + // write may land. The approval node itself already opens its request under + // the platform identity while re-attaching the deciding user for + // attribution, so this declaration aligns the flow with the node it drives. + runAs: "system", + variables: [ + { name: "opportunityId", type: "text", isInput: true, isOutput: false } + ], + nodes: [ + { + id: "start", + type: "start", + label: "Start", + // Trigger wiring (7.4): bind to afterUpdate; gate on crossing the entry + // threshold while not already in an approval state. The `not_required` + // guard stops the flow's own approval_status writes from re-triggering it. + config: { + objectName: "crm_opportunity", + triggerType: "record-after-update", + // Null-tolerant: rows inserted before approval_status had a field-level + // defaultValue (e.g. flow-created opportunities) carry null, which must + // still enter approval. + // Stage guard: a settled deal must never (re-)enter approval — the + // freeze hook rejects approval-status writes on closed records, so + // without this guard the flow opened a locked approval request it + // could never resolve (lockRecord held the closed record hostage). + // TOTALITY: `has(...)` on every read, plus `!= null` on the + // ordering comparison — `has()` passes an explicit null and + // `record.amount >= 100000` then aborts with + // `no such overload: dyn >= int`. Measured total as authored + // today (amount/stage are required, approval_status is defaulted), but + // that is `crm_opportunity`'s schema doing the work, not the + // predicate. An absent `approval_status` reads the same as the null + // this condition already tolerates; an absent `stage` is not a settled + // stage, so it must not block approval. + condition: P29`has(record.amount) && record.amount != null && record.amount >= ${LARGE_DEAL_AMOUNT} + && (!has(record.approval_status) || record.approval_status == "not_required" || record.approval_status == null) + && (!has(record.stage) || (record.stage != "closed_won" && record.stage != "closed_lost"))` + } + }, + { + id: "get_opportunity", + type: "get_record", + label: "Get Opportunity", + config: { objectName: "crm_opportunity", filter: { id: cel10`record.id` }, outputVariable: "oppRecord" } + }, + // ── Tier 1: Sales Manager review (all deals at $100K or more) ─── + { + id: "manager_review", + type: "approval", + label: "Sales Manager Review", + config: { + // ⛔ Never add an org-owner approver as an empty-bench workaround. + // `onEmptyApprovers: 'admin_rescue'` is the node policy for an empty + // position on @objectstack 17 (approvers snapshot at request creation, + // so a position with no holders would otherwise leave the request + // undecidable while `lockRecord` held the record hostage). An + // `{ type: 'org_membership_level', value: 'owner' }` entry overshoots: + // with `behavior: 'first_response'` it makes an org owner a routine + // approver for every deal, not a rescue when the bench is empty. + approvers: [{ type: "position", value: "sales_manager" }], + // Explicit even though `admin_rescue` is the schema default — this is + // the mechanism the node depends on, so it is authored, not inherited. + onEmptyApprovers: "admin_rescue", + behavior: "first_response", + lockRecord: true, + approvalStatusField: "approval_status" + } + }, + // ── Tier gate: does this deal also need director sign-off? ────── + { + // No `config.condition` here: the branch is on edges `e5` / `e6`, which + // is where the engine actually reads it. A copy on the node would be + // inert and indistinguishable from the live one (17.0.0-rc.2's + // `flow-inert-node-condition`). + id: "check_high_value", + type: "decision", + label: "High Value (> $500K)?" + }, + // ── Tier 2: Sales Director sign-off (deals > $500K only) ──────── + { + id: "director_signoff", + type: "approval", + label: "Sales Director Sign-off", + config: { + // Same node policy as manager_review — see the note there. + approvers: [{ type: "position", value: "sales_director" }], + onEmptyApprovers: "admin_rescue", + behavior: "first_response", + lockRecord: true, + approvalStatusField: "approval_status" + } + }, + // ── Final approve: stamp status + notify owner ────────────────── + { + id: "mark_approved", + type: "update_record", + label: "Mark Approved", + config: { + objectName: "crm_opportunity", + filter: { id: cel10`record.id` }, + fields: { approval_status: "approved", approved_date: cel10`isoDatetime(now())` } + } + }, + { + id: "notify_approved", + type: "notify", + label: "Notify Owner \u2014 Approved", + config: { + recipients: [cel10`has(oppRecord.owner_id) ? oppRecord.owner_id : null`], + channels: ["inbox", "email"], + topic: "opportunity_approved", + template: "crm.opportunity_approved", + templateData: { name: cel10`oppRecord.name` }, + actionUrl: "/crm_opportunity/{{record.id}}" + } + }, + // ── Rejection: stamp status + notify owner ────────────────────── + { + id: "mark_rejected", + type: "update_record", + label: "Mark Rejected", + config: { + objectName: "crm_opportunity", + filter: { id: cel10`record.id` }, + fields: { approval_status: "rejected" } + } + }, + { + id: "notify_rejected", + type: "notify", + label: "Notify Owner \u2014 Rejected", + config: { + recipients: [cel10`has(oppRecord.owner_id) ? oppRecord.owner_id : null`], + channels: ["inbox", "email"], + severity: "warning", + topic: "opportunity_rejected", + template: "crm.opportunity_rejected", + templateData: { name: cel10`oppRecord.name` }, + actionUrl: "/crm_opportunity/{{record.id}}" + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "get_opportunity", type: "default" }, + { id: "e2", source: "get_opportunity", target: "manager_review", type: "default" }, + // Manager decision (approval-node branch labels) + { id: "e3", source: "manager_review", target: "check_high_value", type: "default", label: "approve" }, + { id: "e4", source: "manager_review", target: "mark_rejected", type: "default", label: "reject" }, + // Tier gate (decision-node conditional branches). These EDGES are the live + // sites — the engine never evaluates a `decision` node's singular + // `config.condition` — and they must PARTITION, so the guards are written + // in opposite polarity. A deal whose amount cannot be read lands on + // `mark_approved`: the manager has already approved it, and an unreadable + // amount must not strand an approved deal in a locked, undecidable + // director step. + // + // TOTALITY: `oppRecord` is a `get_record` OUTPUT, so the read needs + // `has(vars.oppRecord)` (the variable), `has(vars.oppRecord.amount)` (the + // column — `findOne` answers a miss with `null`, and a sparse driver row + // omits an unwritten column outright) and `!= null` (an explicit null + // passes `has()` and the ordering comparison then aborts with `no such + // overload: dyn > int`). Measured total as authored today — `amount` + // is `required` on `crm_opportunity` and the `get_record` is keyed on the + // row that just fired the trigger — but that is the neighbouring schema + // doing the work, exactly as in the start condition above. `vars.`-scoped + // rather than bare: `has(oppRecord.amount)` still aborts with `Unknown + // variable: oppRecord` on an unbound variable, `has(vars.oppRecord)` + // answers `false` (measured). From 17.0.0-rc.2 an unevaluable condition + // ABORTS the step rather than skipping it, so a guard that was + // belt-and-braces is now what keeps the run alive. + { id: "e5", source: "check_high_value", target: "director_signoff", type: "conditional", condition: P29`has(vars.oppRecord) && has(vars.oppRecord.amount) + && vars.oppRecord.amount != null && vars.oppRecord.amount > ${HIGH_VALUE_DEAL_AMOUNT}`, label: "High value (> $500K)" }, + { id: "e6", source: "check_high_value", target: "mark_approved", type: "conditional", condition: P29`!has(vars.oppRecord) || !has(vars.oppRecord.amount) + || vars.oppRecord.amount == null || vars.oppRecord.amount <= ${HIGH_VALUE_DEAL_AMOUNT}`, label: "Standard (\u2264 $500K)" }, + // Director decision (approval-node branch labels) + { id: "e7", source: "director_signoff", target: "mark_approved", type: "default", label: "approve" }, + { id: "e8", source: "director_signoff", target: "mark_rejected", type: "default", label: "reject" }, + // Terminal branches + { id: "e9", source: "mark_approved", target: "notify_approved", type: "default" }, + { id: "e10", source: "notify_approved", target: "end", type: "default" }, + { id: "e11", source: "mark_rejected", target: "notify_rejected", type: "default" }, + { id: "e12", source: "notify_rejected", target: "end", type: "default" } + ] +}; +var OpportunityApprovalOnCreateFlow = { + ...OpportunityApprovalFlow, + name: "opportunity_approval_on_create", + label: "Large Deal Approval (on create)", + description: "Approval intake for opportunities created above the threshold (insert-time twin of opportunity_approval).", + nodes: OpportunityApprovalFlow.nodes.map( + (n) => n.id === "start" ? { ...n, config: { ...n.config, triggerType: "record-after-create" } } : n + ) +}; + +// src/sales/flows/opportunity-status-change-approval.flow.ts +import { P as P30, cel as cel11 } from "@objectstack/spec"; +var OpportunityStatusChangeApprovalFlow = { + name: "opportunity_status_change_approval", + label: "Opportunity Status Change Approval", + description: "Sign-off a deal needs before it is declared won or lost. Inert unless the install arms the gate on crm_opportunity.status_change_approval_status.", + type: "record_change", + status: "active", + // REQ-0006 acceptance 4, and the same reading `opportunity_approval` records + // from its own measured failure: a gate that engages only for writers + // carrying a session is not a control — a `runAs: 'system'` sweep or import + // would simply bypass it. The verdict and the stage write below also land on + // columns the readonly strip protects, which only a platform write reaches. + runAs: "system", + variables: [ + { name: "opportunityId", type: "text", isInput: true, isOutput: false } + ], + nodes: [ + { + id: "start", + type: "start", + label: "Start", + config: { + objectName: "crm_opportunity", + triggerType: "record-after-update", + // TOTALITY (AGENTS.md — validation predicates must be TOTAL): `has()` + // on every read. A flow condition is strict CEL on every run and an + // unguarded read against a driver that omits absent columns aborts, + // which from 17.0.0-rc.2 FAILS THE RUN rather than skipping it. The + // absent case must read as "not gated": a deal with no gate column at + // all predates the field and closes the way it always did. + // + // Three halves: + // + // - the gate is ARMED: `pending` (born armed, no request decided yet) + // or `rejected` (the last request was refused). `rejected` re-opens + // on a new request because `opportunity.hook.ts` refuses a direct + // close in both states — if only `pending` entered here, a rejected + // deal could be neither requested nor closed, ever. + // - a request is present; + // - the request is NEW on this write. TRANSITION, not current value — + // the idiom `billing_handoff_closed_won` records for this object. + // Without it the flow re-fires on its own write-back while the + // request is still open (the approval node's `pending` stamp through + // `approvalStatusField` is an update of this record). Measured on + // 17.6.0 with this term deleted: one re-entry per request, each + // caught only by the engine's self-trigger guard ("the guard as + // authored does not exclude the flow's own write-back"); with it, + // none. `previous.*` is guarded FAIL-CLOSED: no visible prior + // value, no visible new request. + // + // `apply_status` leaves the gate `approved` (out of reach) and + // `clear_request` empties the request, so neither re-enters. + condition: P30`has(record.status_change_approval_status) + && (record.status_change_approval_status == "pending" || record.status_change_approval_status == "rejected") + && has(record.requested_status) && record.requested_status != null && record.requested_status != "" + && has(previous.requested_status) && previous.requested_status != record.requested_status` + } + }, + { + id: "get_opportunity", + type: "get_record", + label: "Get Opportunity", + config: { objectName: "crm_opportunity", filter: { id: cel11`record.id` }, outputVariable: "oppRecord" } + }, + { + id: "status_review", + type: "approval", + label: "Status Change Review", + config: { + // The customer's chain is 销售负责人 → 事业部负责人; the generic shape core + // ships is the manager bench this app already declares approvers + // against. A second tier, or a different position, is overlay + // configuration (REQ-0006 acceptance 5). + approvers: [{ type: "position", value: "sales_manager" }], + // Explicit though it is the schema default, exactly as both sibling + // approvals author it: approvers snapshot at request creation, so an + // empty bench would leave the request undecidable — and here that + // means a deal nobody can ever close. + onEmptyApprovers: "admin_rescue", + behavior: "first_response", + // `true`, matching `opportunity_approval` and NOT the lead gate: a deal + // awaiting a won/lost verdict must not keep moving underneath the + // approver. Its narrative fields are what the freeze hook leaves open + // anyway. + lockRecord: true, + approvalStatusField: "status_change_approval_status" + } + }, + { + // The approved decision is what moves the stage — "通过后正式生效". + // + // ⚠️ Both fields in ONE write, and that is load-bearing: the + // status-change guard in `opportunity.hook.ts` reads the gate column + // INPUT-FIRST, so this write presents itself as already-approved and the + // guard lets the stage through. Splitting it into two writes would have + // the guard refuse the flow's own write (ELEVATION IS NOT ANONYMITY — + // `runAs: 'system'` carries the triggering user, so `ctx.user?.id` is + // present in this run). + // + // `win_reason` / `loss_reason` are `requiredWhen` the stage is closed and + // are evaluated against the merged record, so the values the rep captured + // when requesting satisfy them here. + id: "apply_status", + type: "update_record", + label: "Apply Requested Status", + config: { + objectName: "crm_opportunity", + filter: { id: cel11`record.id` }, + fields: { + stage: cel11`oppRecord.requested_status`, + status_change_approval_status: "approved", + approved_date: cel11`isoDatetime(now())` + } + } + }, + { + // A rejected request is cleared, not left standing, and the verdict stays + // `rejected` so the hook keeps refusing a direct close: the way on is a + // new request, which the start condition opens as a fresh approval. + id: "clear_request", + type: "update_record", + label: "Clear Rejected Request", + config: { + objectName: "crm_opportunity", + filter: { id: cel11`record.id` }, + fields: { status_change_approval_status: "rejected", requested_status: null } + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "get_opportunity", type: "default" }, + { id: "e2", source: "get_opportunity", target: "status_review", type: "default" }, + // Approval-node branch labels. + { id: "e3", source: "status_review", target: "apply_status", type: "default", label: "approve" }, + { id: "e4", source: "status_review", target: "clear_request", type: "default", label: "reject" }, + { id: "e5", source: "apply_status", target: "end", type: "default" }, + { id: "e6", source: "clear_request", target: "end", type: "default" } + ] +}; + +// src/sales/flows/opportunity-qualification-approval.flow.ts +import { P as P31, cel as cel12 } from "@objectstack/spec"; +var OpportunityQualificationApprovalFlow = { + name: "opportunity_qualification_approval", + label: "Opportunity Qualification Approval", + description: "The \u7ACB\u9879 sign-off a deal needs before its stage or won/lost call may change. Inert unless the install arms the gate on crm_opportunity.qualification_approval_status.", + type: "record_change", + status: "active", + // The reading both sibling gates record from `opportunity_approval`'s + // measured failure: a gate that engages only for writers carrying a session + // is not a control. The verdict writes below also land on a column the + // readonly strip protects, which only a platform write reaches. + runAs: "system", + variables: [ + { name: "opportunityId", type: "text", isInput: true, isOutput: false } + ], + nodes: [ + { + id: "start", + type: "start", + label: "Start", + config: { + objectName: "crm_opportunity", + triggerType: "record-after-update", + // TOTALITY (AGENTS.md — validation predicates must be TOTAL): `has()` + // on every read; the absent case reads as "not gated". + // + // Three halves, the status-change gate's own: + // + // - the gate is ARMED: `pending` or `rejected`. `rejected` re-opens on a + // new request because the hook refuses the gated acts in both states — + // if only `pending` entered here, a rejected deal could never qualify. + // - the request is ticked; + // - the request is NEW on this write. TRANSITION, not current value: + // the approval node's `pending` stamp through `approvalStatusField` is + // an update of this record while the request is still ticked, and a + // current-value test re-fires on it. Measured on a 17.6.0 boot with + // this term deleted: one re-entry per request, caught only by the + // engine's self-trigger guard ("the guard as authored does not + // exclude the flow's own write-back"); with it, none. `previous.*` is + // guarded FAIL-CLOSED: no visible prior value, no visible new request. + // + // `mark_qualified` leaves the gate `approved` (out of reach) and + // `clear_request` unticks the request, so neither re-enters. + condition: P31`has(record.qualification_approval_status) + && (record.qualification_approval_status == "pending" || record.qualification_approval_status == "rejected") + && has(record.qualification_requested) && record.qualification_requested == true + && has(previous.qualification_requested) && previous.qualification_requested != true` + } + }, + { + id: "get_opportunity", + type: "get_record", + label: "Get Opportunity", + config: { objectName: "crm_opportunity", filter: { id: cel12`record.id` }, outputVariable: "oppRecord" } + }, + { + id: "qualification_review", + type: "approval", + label: "Qualification Review", + config: { + // The customer's chain is 销售负责人 / 事业部审批岗 → 事业部负责人; the generic + // shape core ships is the manager bench both sibling gates route to. A + // second tier, or a different position, is overlay configuration + // (REQ-0006: the named approval chains are C). + approvers: [{ type: "position", value: "sales_manager" }], + // Explicit though it is the schema default, as every sibling authors + // it: an empty bench would leave the request undecidable — here, a + // deal that can never move its stage. + onEmptyApprovers: "admin_rescue", + behavior: "first_response", + // ⚠️ `false`, NOT the status-change gate's `true` — the one term this + // node deliberately takes from the LEAD gate instead. Step 11 says it + // in as many words: 「新增商机可跟进」. A deal awaiting 立项 is still being + // worked — the narrative, the customer calendar, the amount and Will + // Bid are what the approver reads — and locking it would stop that work + // for as long as the approver takes. The two acts the gate exists to hold + // are refused by `opportunity_lifecycle` whether or not a request is + // open, so the lock would add nothing but the freeze. + lockRecord: false, + approvalStatusField: "qualification_approval_status" + } + }, + { + id: "mark_qualified", + type: "update_record", + label: "Mark Qualified", + config: { + objectName: "crm_opportunity", + filter: { id: cel12`record.id` }, + fields: { qualification_approval_status: "approved" } + } + }, + { + // A rejected request is cleared, not left standing, and the verdict stays + // `rejected` so the hook keeps refusing the gated acts: the way on is a + // new request, which the start condition opens as a fresh approval. + id: "clear_request", + type: "update_record", + label: "Clear Rejected Request", + config: { + objectName: "crm_opportunity", + filter: { id: cel12`record.id` }, + fields: { qualification_approval_status: "rejected", qualification_requested: false } + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "get_opportunity", type: "default" }, + { id: "e2", source: "get_opportunity", target: "qualification_review", type: "default" }, + // Approval-node branch labels. + { id: "e3", source: "qualification_review", target: "mark_qualified", type: "default", label: "approve" }, + { id: "e4", source: "qualification_review", target: "clear_request", type: "default", label: "reject" }, + { id: "e5", source: "mark_qualified", target: "end", type: "default" }, + { id: "e6", source: "clear_request", target: "end", type: "default" } + ] +}; + +// src/sales/flows/opportunity-stagnation.flow.ts +import { P as P32, cel as cel13 } from "@objectstack/spec"; +var STALE_THRESHOLD_DAYS = 14; +var OpportunityStagnationFlow = { + name: "opportunity_stagnation", + label: "Stalled Deal Alert", + description: "Daily sweep: nudge owners about open opportunities stuck in-stage beyond the threshold.", + type: "schedule", + status: "active", + // Scheduled runs have no trigger user, so under the default runAs:'user' the + // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that + // RLS-bypassing elevation explicit and intended (ADR-0049). + runAs: "system", + variables: [], + nodes: [ + { id: "start", type: "start", label: "Start (daily 07:30)", config: { schedule: "30 7 * * *" } }, + { + id: "query_stalled", + type: "get_record", + label: "Find Stalled Deals", + config: { + objectName: "crm_opportunity", + // ⛔ Predicate on the STORED `stage_entry_date`, never on + // `days_in_stage`: the latter is a formula, computed after the query, so + // as a filter key it addresses a column that does not exist. + // `entry < today − N` + // is the same test as `days_in_stage > N`, computed by a CEL value + // envelope (the `isoDate(daysAgo(n))` spelling; contract-renewal uses + // its `daysFromNow` twin). + // A row with a null `stage_entry_date` does not satisfy `$lt` and is + // skipped, preserving "nothing has stagnated yet" for unstamped rows. + filter: { + stage: { $nin: ["closed_won", "closed_lost"] }, + stage_entry_date: { $lt: cel13`isoDate(daysAgo(${STALE_THRESHOLD_DAYS}))` } + }, + limit: 500, + outputVariable: "oppList" + } + }, + { + id: "loop_opps", + type: "loop", + label: "For Each Stalled Deal", + config: { + collection: cel13`oppList`, + iteratorVariable: "currentOpp", + body: guarded("opp", { + nodes: [ + { + // Idempotency gate: a still-open stall task means this deal was + // already nudged. ⛔ Without it the daily sweep re-notifies and + // re-creates an identical task every morning for as long as the + // deal stays stalled — an unbounded duplicate pile-up. + id: "find_existing_task", + type: "get_record", + label: "Already Nudged?", + config: { + objectName: "crm_task", + filter: { + related_to_opportunity: cel13`currentOpp.id`, + subject: cel13`'Advance stalled deal: ' + currentOpp.name`, + status: { $nin: ["completed"] } + }, + outputVariable: "existingStallTask" + } + }, + { + // Gateway only — the predicate lives on the out-edge. + id: "check_not_nudged", + type: "decision", + label: "First Nudge?" + }, + { + // Owner only: `{currentOpp.owner_id.manager}` cannot traverse a + // lookup in flow templates — it interpolates to the literal + // "undefined" (cf. opportunity_won_alert). + id: "notify_owner", + type: "notify", + label: "Nudge Owner", + config: { + recipients: [cel13`has(currentOpp.owner_id) ? currentOpp.owner_id : null`], + channels: ["inbox", "email"], + topic: "deal_stalled", + template: "crm.deal_stalled", + templateData: { + name: cel13`currentOpp.name`, + stage: cel13`currentOpp.stage`, + days_in_stage: cel13`currentOpp.days_in_stage` + }, + actionUrl: "/crm_opportunity/{{currentOpp.id}}" + } + }, + { + id: "create_followup_task", + type: "create_record", + label: "Create Follow-up Task", + config: { + objectName: "crm_task", + fields: { + subject: cel13`'Advance stalled deal: ' + currentOpp.name`, + type: "follow_up", + priority: "high", + status: "not_started", + due_date: cel13`isoDate(daysFromNow(2))`, + owner_id: cel13`has(currentOpp.owner_id) ? currentOpp.owner_id : null`, + // ORG PARTITION. A schedule trigger carries no + // organization, so without this the nudge task is born + // `organization_id` NULL — outside every org partition. + // Upstream ruling objectstack#6155 Q2=A assigns the answer to + // the flow author; the task belongs to the org of the deal it + // nudges. `crm_opportunity` carries the column, so the read + // resolves. It is deliberately UNGUARDED: on 17.x a source + // lacking it interpolated to `undefined` and landed as NULL + // while looking declared; CEL fails the iteration instead, and + // a `has()` guard would write that NULL back. + organization_id: cel13`currentOpp.organization_id`, + related_to_type: "crm_opportunity", + related_to_opportunity: cel13`currentOpp.id` + } + } + } + ], + edges: [ + { id: "b1", source: "find_existing_task", target: "check_not_nudged", type: "default" }, + // "Already nudged" has no edge, so the loop moves to the next item. + // This edge is the ONLY site for the predicate: a `decision` + // node's singular `config.condition` is never read, so a node copy + // would be inert metadata free to drift away from what runs. + { id: "b2", source: "check_not_nudged", target: "notify_owner", type: "conditional", condition: P32`existingStallTask == null`, label: "First nudge" }, + { id: "b3", source: "notify_owner", target: "create_followup_task", type: "default" } + ] + }) + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "query_stalled", type: "default" }, + { id: "e2", source: "query_stalled", target: "loop_opps", type: "default" }, + { id: "e3", source: "loop_opps", target: "end", type: "default" } + ] +}; + +// src/sales/flows/forecast-snapshot.flow.ts +import { P as P33, expression as expression2, cel as cel14 } from "@objectstack/spec"; +var SNAPSHOT_PERIOD = "quarter"; +var OPEN_STAGES = { $nin: ["closed_won", "closed_lost"] }; +var CURRENT_PERIOD_FILTER = { + owner_id: cel14`currentOwner.id`, + period: SNAPSHOT_PERIOD, + period_start: { $lte: cel14`isoDate(today())` }, + period_end: { $gte: cel14`isoDate(today())` } +}; +var OWNED_PERIOD_FILTER = { ...CURRENT_PERIOD_FILTER, source: "scheduled" }; +var inPeriod = (extra) => ({ + owner_id: cel14`currentOwner.id`, + organization_id: cel14`currentForecast.organization_id`, + close_date: { + $gte: cel14`currentForecast.period_start`, + $lte: cel14`currentForecast.period_end` + }, + ...extra +}); +var sumBucket = (key, label, filter, total, item = `current_${key}`) => ({ + find: { + id: `find_${key}`, + type: "get_record", + label: `Find ${label}`, + config: { + objectName: "crm_opportunity", + filter, + limit: 500, + outputVariable: `${key}Opps` + } + }, + sum: { + id: `sum_${key}`, + type: "loop", + label: `Sum ${label}`, + config: { + collection: expression2(`${key}Opps`, "cel"), + iteratorVariable: item, + body: { + nodes: [ + { + id: `add_${key}`, + type: "assignment", + label: `Add to ${label}`, + config: { + assignments: { + [total]: expression2(`${total} + (!has(${item}.amount) || isBlank(${item}.amount) ? 0.0 : double(${item}.amount))`, "cel") + } + } + } + ], + edges: [] + } + } + } +}); +var BUCKETS = [ + sumBucket("pipeline", "Open Pipeline", inPeriod({ stage: OPEN_STAGES }), "pipelineTotal"), + sumBucket( + "best_case", + "Best Case", + inPeriod({ stage: OPEN_STAGES, forecast_category: { $in: ["best_case", "commit"] } }), + "bestCaseTotal" + ), + sumBucket( + "commit", + "Commit", + inPeriod({ stage: OPEN_STAGES, forecast_category: "commit" }), + "commitTotal" + ), + sumBucket("won", "Closed Won", inPeriod({ stage: "closed_won" }), "closedTotal") +]; +var OWNER_CHAIN = [ + "reset_totals", + ...BUCKETS.flatMap((b) => [b.find.id, b.sum.id]), + "write_snapshot" +]; +var ForecastSnapshotFlow = { + name: "forecast_snapshot", + label: "Forecast Snapshot", + description: "Nightly sweep: upsert a current-quarter crm_forecast row per active opportunity owner with pipeline, best-case, commit and closed-won totals.", + type: "schedule", + status: "active", + // Scheduled runs have no trigger user, so under the default runAs:'user' the + // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that + // RLS-bypassing elevation explicit and intended (ADR-0049) — and it + // is load-bearing here: `crm_forecast` is `sharingModel: 'private'`, so a + // user-scoped sweep could only ever see its own rows. + runAs: "system", + variables: [], + nodes: [ + { id: "start", type: "start", label: "Start (daily 03:00)", config: { schedule: "0 3 * * *" } }, + { + // Every user is a candidate; the `has_deals` gate below decides who is + // actually an opportunity owner. Filtering `sys_user` here instead would + // hard-code an activity flag this app does not own. + // No `filter` key: an EMPTY filter node (`{}`) reduces to TRUE and + // matches every row, so it is indistinguishable from an absent key — + // ObjectStack 17.0.0-rc.6 promotes the pair to an author-time error + // (`filter-empty-node`) precisely because only the absent key SAYS + // "every user is a candidate" to the next reader. The `has_deals` gate + // below is what actually narrows the set. + id: "query_owners", + type: "get_record", + label: "Find Users", + config: { objectName: "sys_user", limit: 500, outputVariable: "ownerList" } + }, + { + id: "loop_owners", + type: "loop", + label: "For Each Owner", + config: { + collection: cel14`ownerList`, + iteratorVariable: "currentOwner", + body: guarded("owner", { + nodes: [ + { + // Cheap findOne gate: a user with no live opportunity is not a + // forecast owner, and must not get a row (a fresh install would + // otherwise gain one empty snapshot per employee). + id: "find_any_deal", + type: "get_record", + label: "Owns Any Live Deal?", + config: { + objectName: "crm_opportunity", + filter: { owner_id: cel14`currentOwner.id`, stage: { $nin: ["closed_lost"] } }, + outputVariable: "ownerAnyDeal" + } + }, + { + // Gateway only — the predicate lives on the out-edge. + id: "has_deals", + type: "decision", + label: "Active Owner?" + }, + { + // Idempotency gate AND period lookup in one read: the row whose + // window contains today IS this owner's current-period snapshot. + id: "find_forecast", + type: "get_record", + label: "Current-Period Snapshot?", + config: { + objectName: "crm_forecast", + filter: CURRENT_PERIOD_FILTER, + outputVariable: "existingForecast" + } + }, + { + // Gateway only — the predicate lives on the out-edges. + id: "check_missing", + type: "decision", + label: "First Snapshot This Period?" + }, + { + // Only `period` is supplied: `forecast.hook.ts` derives + // period_start/period_end/period_label so the boundaries are + // calendar-true without the flow doing date arithmetic it + // cannot do. `quota` is omitted on purpose — see the header. + // A leaf node: the two mutually-exclusive edges out of + // `check_missing` both converge on `reload_forecast`, so the + // chain below runs exactly once on either path. + id: "create_forecast", + type: "create_record", + label: "Open Snapshot Row", + config: { + objectName: "crm_forecast", + fields: { + owner_id: cel14`currentOwner.id`, + // ORG PARTITION. A schedule trigger carries no + // organization, so without this the snapshot row is born + // `organization_id` NULL — outside every org partition, where + // an `(organization_id, …)` unique index does not constrain + // and org-scoped reads never see it. Upstream ruling + // objectstack#6155 Q2=A assigns the answer to the flow author. + // + // The source is `ownerAnyDeal`, NOT `currentOwner`. The loop + // item here is a `sys_user` row, and `sys_user` declares NO + // `organization_id` — identity is global, org-partitioned it + // is not (it carries `primary_business_unit_id` instead). + // On 17.x `{currentOwner.organization_id}` interpolated to + // `undefined` and landed as NULL: the publish guard, which only + // checks that the key is declared, went green over a row still + // born outside every partition (measured, not assumed). Under + // CEL that read fails the iteration instead. + // + // `ownerAnyDeal` is the `crm_opportunity` from `find_any_deal` + // — it carries the column, and edge `b2` (`ownerAnyDeal != + // null`) is the only route to this node, so it is never null + // here. Semantically right too: an owner's forecast belongs to + // the org their pipeline is in. + organization_id: cel14`ownerAnyDeal.organization_id`, + period: SNAPSHOT_PERIOD, + snapshot_date: cel14`isoDate(today())`, + source: "scheduled", + pipeline_amount: 0, + best_case_amount: 0, + commit_amount: 0, + closed_amount: 0 + } + } + }, + { + // Re-read rather than reuse the create output, so both paths + // (row already existed / row just created) hand the rest of the + // body ONE variable carrying the hook-derived period window. + // + // ⛔ Scope this to OWNED_PERIOD_FILTER, never to the gate's + // window: this read chooses the row that gets WRITTEN, and the + // sweep only ever owns its own. A miss binds `currentForecast` to + // null — `get_record` always binds — which is exactly what + // `check_owned` below is there to read. + id: "reload_forecast", + type: "get_record", + label: "Load Snapshot Row", + config: { + objectName: "crm_forecast", + filter: OWNED_PERIOD_FILTER, + outputVariable: "currentForecast" + } + }, + { + // Gateway only — the predicate lives on the out-edge. + // + // The stand-down gate. The window is handled either way by the + // time we get here; this asks whether the row handling it is the + // sweep's. Same single-out-edge skip shape as `has_deals`: when + // the only conditional edge does not match, the iteration ends and + // the engine records the unreached nodes as `skipped` with this + // node as `skippedBy` — so a stand-down is visible in the run log + // rather than silent. + id: "check_owned", + type: "decision", + label: "Sweep Owns This Row?" + }, + { + // Accumulators live in the flow-wide variable map (a loop body + // shares the enclosing scope), so they MUST be zeroed per owner + // or every rep inherits the previous rep's totals. + id: "reset_totals", + type: "assignment", + label: "Reset Totals", + config: { + assignments: { + pipelineTotal: 0, + bestCaseTotal: 0, + commitTotal: 0, + closedTotal: 0 + } + } + }, + ...BUCKETS.flatMap((b) => [b.find, b.sum]), + { + // Filter by id: `update_record` calls `data.update` without + // `options.multi`, so a filter matching more than one row fails + // (same constraint as demo_bootstrap / case_sla_monitor). + id: "write_snapshot", + type: "update_record", + label: "Write Snapshot", + config: { + objectName: "crm_forecast", + filter: { id: cel14`currentForecast.id` }, + fields: { + pipeline_amount: cel14`pipelineTotal`, + best_case_amount: cel14`bestCaseTotal`, + commit_amount: cel14`commitTotal`, + closed_amount: cel14`closedTotal`, + snapshot_date: cel14`isoDate(today())`, + source: "scheduled" + } + } + } + ], + edges: [ + // Loop-nested conditions are explicit CEL envelopes (`P`): the + // conversion pass that wraps bare strings only walks a flow's + // TOP-LEVEL edges, so a bare string in here would fall through to + // the legacy template path and compare as text — a gate that never + // opens, silently. + // + // These edges are the ONLY site for their predicates: a + // `decision` node's singular `config.condition` is never read, so a + // node-level copy would be inert metadata free to drift. + { id: "b1", source: "find_any_deal", target: "has_deals", type: "default" }, + // No matching edge simply ends this iteration, so a user with no + // live deal is skipped without a snapshot row. + { id: "b2", source: "has_deals", target: "find_forecast", type: "conditional", condition: P33`ownerAnyDeal != null`, label: "Active owner" }, + { id: "b3", source: "find_forecast", target: "check_missing", type: "default" }, + // Mutually exclusive, and both reach `reload_forecast` — never a + // default edge alongside a conditional one, which would traverse + // BOTH and double-count the whole chain. + { id: "b4", source: "check_missing", target: "create_forecast", type: "conditional", condition: P33`existingForecast == null`, label: "Open new row" }, + { id: "b5", source: "check_missing", target: "reload_forecast", type: "conditional", condition: P33`existingForecast != null`, label: "Refresh existing row" }, + { id: "b6", source: "create_forecast", target: "reload_forecast", type: "default" }, + { id: "b7", source: "reload_forecast", target: "check_owned", type: "default" }, + // The stand-down. No complementary edge, on purpose: the + // false branch is "this window belongs to a manual/ai row", and the + // whole point is that the sweep then does NOTHING — no write, and + // no second row. A variable-root null test, so no `has()` guard is + // needed: `reload_forecast` is a `get_record` and binds + // `currentForecast` unconditionally, to `null` on a miss. + { id: "b8", source: "check_owned", target: "reset_totals", type: "conditional", condition: P33`currentForecast != null`, label: "Sweep owns the row" }, + ...OWNER_CHAIN.slice(0, -1).map((source, i) => ({ + id: `c${i}`, + source, + target: OWNER_CHAIN[i + 1], + type: "default" + })) + ] + }) + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "query_owners", type: "default" }, + { id: "e2", source: "query_owners", target: "loop_owners", type: "default" }, + { id: "e3", source: "loop_owners", target: "end", type: "default" } + ] +}; + +// src/sales/flows/lead-assignment.flow.ts +import { P as P34, cel as cel15 } from "@objectstack/spec"; +var LeadAssignmentFlow = { + name: "lead_assignment", + label: "New Lead Routing & SLA", + description: "On new lead: set a rating-based follow-up SLA and alert the lead owner.", + type: "record_change", + status: "active", + // A record-change flow fired by a SYSTEM write carries no trigger user + // either (ADR-0049). This is the population the flow is FOR: + // leads arrive from web-to-lead, a CSV import, a partner integration or a + // seed load, none of which carry a user session. Measured on 17.0.0-rc.2, a + // user-less run refuses `sla_hot` / `sla_std` outright, so the lead lands + // with no follow-up SLA and no alert at all — silently, since the refusal + // surfaces only in the server log. + // + // Elevating the USER-driven runs too is correct: the SLA stamp is the + // platform's routing decision about the row that just fired the trigger + // (keyed to `{record.id}`), not the submitting rep's own edit, and a rep who + // may create a lead is not thereby guaranteed edit rights on it. + runAs: "system", + variables: [], + nodes: [ + { + id: "start", + type: "start", + label: "Start (lead created)", + config: { objectName: "crm_lead", triggerType: "record-after-create" } + }, + { + // Branching lives on edges `e2` / `e3` — see the totality note there. + // This node carries no `config.condition`: the engine never evaluates a + // `decision` node's singular one, so a copy here would restate the gate + // without being the gate (17.0.0-rc.2's `flow-inert-node-condition`). + id: "check_hot", + type: "decision", + label: "Hot Lead (rating \u2265 4)?" + }, + // ── Hot path: 1-day SLA, high-severity alert ─────────────────── + { + id: "sla_hot", + type: "update_record", + label: "Set 1-Day SLA", + config: { objectName: "crm_lead", filter: { id: cel15`record.id` }, fields: { next_followup_date: cel15`isoDate(daysFromNow(1))` } } + }, + { + id: "notify_hot", + type: "notify", + label: "Alert \u2014 Hot Lead", + config: { + // Route to the lead's OWNER (a real user id). A CRM position like + // 'sales_manager' is NOT a messaging audience — the messaging service + // resolves user:/role:(sys_member)/team:/owner_of:, and a bare + // 'sales_manager' was stored verbatim as sys_inbox_message.user_id, + // matching no real user, so these alerts reached nobody. owner is set + // on insert (defaultValue os.user.id) and is the accountable party. + recipients: [cel15`record.owner_id`], + channels: ["inbox", "email"], + severity: "warning", + topic: "lead_routing", + template: "crm.lead_routing_hot", + templateData: { + first_name: cel15`record.first_name`, + last_name: cel15`record.last_name`, + company: cel15`record.company`, + rating: cel15`record.rating` + }, + actionUrl: "/crm_lead/{{record.id}}" + } + }, + // ── Standard path: 3-day SLA, normal alert ───────────────────── + { + id: "sla_std", + type: "update_record", + label: "Set 3-Day SLA", + config: { objectName: "crm_lead", filter: { id: cel15`record.id` }, fields: { next_followup_date: cel15`isoDate(daysFromNow(3))` } } + }, + { + id: "notify_std", + type: "notify", + label: "Alert \u2014 New Lead", + config: { + // Route to the lead's owner — see notify_hot for why a bare + // 'sales_manager' position never reached anyone. + recipients: [cel15`record.owner_id`], + channels: ["inbox"], + topic: "lead_routing", + template: "crm.lead_routing_new", + templateData: { + first_name: cel15`record.first_name`, + last_name: cel15`record.last_name`, + company: cel15`record.company` + }, + actionUrl: "/crm_lead/{{record.id}}" + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "check_hot", type: "default" }, + // TOTALITY: these two edges must PARTITION every lead — a rating + // the predicate cannot read has to fall down one branch, never neither. + // Guarding both with `has(...) &&` would have traded a loud abort for a + // silent no-op (unrated lead → no SLA, no alert, no error), which is the + // "declared ≠ enforced" shape this repo keeps deleting rules over. So the + // hot branch demands a readable rating and the standard branch absorbs + // everything else: an unrated lead is, correctly, not a hot lead. + // + // `rating` is neither required nor defaulted, so a lead written without one + // is stored with NO `rating` column on driver-memory / driver-mongodb. + // Measured end-to-end: the unguarded `record.rating >= 4` aborted with `No + // such key: rating` and an unrated lead got no SLA stamp and no alert at + // all. `has()` alone is not enough on an ORDERING comparison — an explicit + // `rating: null` passes `has()` and then aborts with `no such overload: + // dyn >= int` — so both guards are required, in this order. + { id: "e2", source: "check_hot", target: "sla_hot", type: "conditional", condition: P34`has(record.rating) && record.rating != null && record.rating >= 4`, label: "Hot" }, + { id: "e3", source: "check_hot", target: "sla_std", type: "conditional", condition: P34`!has(record.rating) || record.rating == null || record.rating < 4`, label: "Standard" }, + { id: "e4", source: "sla_hot", target: "notify_hot", type: "default" }, + { id: "e5", source: "notify_hot", target: "end", type: "default" }, + { id: "e6", source: "sla_std", target: "notify_std", type: "default" }, + { id: "e7", source: "notify_std", target: "end", type: "default" } + ] +}; + +// src/sales/flows/contact-welcome.flow.ts +import { P as P35, cel as cel16 } from "@objectstack/spec"; +var ContactWelcomeFlow = { + name: "contact_welcome", + label: "Contact Welcome", + description: "On new contact: prompt the owner to welcome them.", + type: "record_change", + status: "active", + // A record-change flow fired by a SYSTEM write carries no trigger user + // either (ADR-0049) — and this flow exists FOR that + // population: the start condition below already documents the seeded / + // integration-written contacts whose `owner_id` the security middleware + // never stamped because the write carried no session. + // + // Measured honestly on 17.0.0-rc.2: this flow has NO data node today (start + // → notify → end), the runAs refusal covers get/create/update/delete only, + // and `notify` dispatches through the messaging service without a run data + // context — so a user-less run completes and delivers today, and this + // declaration changes nothing observable right now. It is declared anyway + // because the decision being recorded is "record-change automation runs as + // the platform", not "this flow currently happens to have no data node". + // The day a data node is added — or a start-node `config.expand`, which is + // the remedy the notify node's own error message recommends and which reads + // through the same guarded path — the elevation has already been reasoned + // about here rather than discovered as a refusal in production. Elevation is + // harmless for the user-driven runs: there is no data operation to scope. + runAs: "system", + variables: [], + nodes: [ + { + id: "start", + type: "start", + label: "Start (contact created)", + config: { + objectName: "crm_contact", + triggerType: "record-after-create", + // TOTALITY: every `record.x` read carries a `has(record.x)` + // guard — see the house-rule block in + // `test/flow-condition-totality.test.ts`. The absent-key case is real + // here, not hypothetical: `owner_id` is auto-stamped by the security + // middleware only on writes that CARRY a user, and a system write — + // seed data, an integration, a `runAs: 'system'` flow — short-circuits + // that middleware entirely. Such a row reaches driver-memory + // with NO `owner_id` column at all, so `record.owner_id != null` alone + // aborts with `No such key` and no seeded contact ever gets a welcome + // prompt. `!= null` is not a substitute for `has()`: on an absent key + // it aborts exactly like `== "v"` does. An absent `email_opt_out` + // means the contact has not opted out. + condition: P35`has(record.owner_id) && record.owner_id != null + && (!has(record.email_opt_out) || record.email_opt_out != true)` + } + }, + { + id: "send_welcome", + type: "notify", + label: "Prompt Owner to Welcome", + config: { + recipients: [cel16`record.owner_id`], + channels: ["inbox", "email"], + topic: "contact_welcome", + template: "crm.contact_welcome", + templateData: { first_name: cel16`record.first_name`, last_name: cel16`record.last_name` }, + actionUrl: "/crm_contact/{{record.id}}" + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "send_welcome", type: "default" }, + { id: "e2", source: "send_welcome", target: "end", type: "default" } + ] +}; + +// src/sales/flows/opportunity-won-alert.flow.ts +import { P as P36, cel as cel17 } from "@objectstack/spec"; +var OpportunityWonAlertFlow = { + name: "opportunity_won_alert", + label: "Large Deal Won Alert", + description: "On closed_won opportunities of $100K or more: notify the owner \u2014 the owner alone, not their manager.", + type: "record_change", + status: "active", + // A record-change flow fired by a SYSTEM write carries no trigger user + // either (ADR-0049). Deals reach `closed_won` through + // machinery as well as through a rep's own save — `lead_conversion` and the + // `contract_renewal` sweep both write opportunities, and the latter is + // itself `runAs: 'system'`. + // + // Measured honestly on 17.0.0-rc.2: this flow has NO data node (start → + // notify → end), so the refusal does not reach it today and declaring + // `system` changes nothing observable. Declared for the same reason as + // `contact_welcome` — see the fuller note there. Nothing to scope, so + // elevating the user-driven runs costs nothing. + runAs: "system", + variables: [], + nodes: [ + { + id: "start", + type: "start", + label: "Start (opp updated)", + config: { + objectName: "crm_opportunity", + triggerType: "record-after-update", + // `previous.stage` guard: fire on the TRANSITION into closed_won only. + // Without it every later edit of a won deal (seed-ownership + // claims, approval-status stamps, description tweaks) re-sent the + // congratulations blast. The trigger forwards `previous` into the + // condition scope (cf. the engine's record-change context). + // TOTALITY: `has(...)` on every read, plus `!= null` on the + // ordering comparison (`has()` passes an explicit null and + // `record.amount >= 100000` then aborts with + // `no such overload: dyn >= int`). + // + // `previous.stage` is guarded FAIL-CLOSED — `has(previous.stage) &&`, + // not `!has(previous.stage) ||` — which is the opposite of how + // `record.stage` is guarded, deliberately. This term exists solely to + // suppress a re-fire, and the failure it was written for (a + // congratulations blast to management re-sent on every later edit of a + // won deal) is worse than a missed one. When the engine cannot see + // what the prior stage was it cannot see a TRANSITION either, so it + // must not claim one. In practice `previous` is a full prior row on + // every record-after-update; the shape this covers is a bulk + // `updateMany`, where ObjectQL never reads a prior row and `previous` + // arrives null — and firing one blast per row of a bulk update is + // exactly what nobody wants. + condition: P36`has(record.stage) && record.stage == "closed_won" + && has(previous.stage) && previous.stage != "closed_won" + && has(record.amount) && record.amount != null && record.amount >= ${LARGE_DEAL_AMOUNT}` + } + }, + { + // The `label` names what this node actually does: it notifies the owner + // and nobody else. The `id` keeps its original `notify_management` + // spelling on purpose — `edges[]` reference nodes by id, so renaming one + // is a behaviour change, not a wording fix. + id: "notify_management", + type: "notify", + label: "Notify Owner", + config: { + // Owner only: `{record.owner_id.manager}` cannot traverse a lookup on the + // raw trigger snapshot — it interpolates to the literal "undefined" + // and the message is delivered to a phantom user. + recipients: [cel17`record.owner_id`], + channels: ["inbox", "email"], + severity: "info", + topic: "large_deal_won", + template: "crm.large_deal_won", + templateData: { name: cel17`record.name`, amount: cel17`record.amount` }, + actionUrl: "/crm_opportunity/{{record.id}}" + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "notify_management", type: "default" }, + { id: "e2", source: "notify_management", target: "end", type: "default" } + ] +}; + +// src/sales/flows/task-urgent-alert.flow.ts +import { P as P37, cel as cel18 } from "@objectstack/spec"; +var TaskUrgentAlertFlow = { + name: "task_urgent_alert", + label: "Urgent Task Alert", + description: "On new urgent task: notify the owner.", + type: "record_change", + status: "active", + // A record-change flow fired by a SYSTEM write carries no trigger user + // either (ADR-0049), and most urgent tasks in this app are + // machine-written: `case_status_side_effects` opens the escalation follow-up + // task, and the scheduled sweeps create their own — none of those writes + // carries a session. + // + // Measured honestly on 17.0.0-rc.2: this flow has NO data node (start → + // notify → end), so the refusal does not reach it today and declaring + // `system` changes nothing observable. Declared for the same reason as + // `contact_welcome` — see the fuller note there: the recorded decision is + // that record-change automation runs as the platform, so a data node added + // later inherits an elevation that was reasoned about rather than one + // discovered as a production refusal. No data operation exists to scope, so + // elevating the user-driven runs costs nothing. + runAs: "system", + variables: [], + nodes: [ + { + id: "start", + type: "start", + label: "Start (task created)", + config: { + objectName: "crm_task", + triggerType: "record-after-create", + // Gate on the `status` enum, not the `is_completed` boolean: on + // SQLite/libsql booleans persist as integer 1, so `is_completed != true` + // is `1 != true` = always true and the guard never trips (cf. the same + // hazard documented in case_escalation). + // TOTALITY: `has(...)` on every read. Both fields are `required` + // AND defaulted today, so this predicate measured total as authored — + // but that is a property of `crm_task`'s schema, not of the predicate. + // Drop either default and the flow goes silently inert on + // driver-memory / driver-mongodb, with nothing to catch it. An absent + // `status` is not `completed`, so it must not suppress the alert. + condition: P37`has(record.priority) && record.priority == "urgent" + && (!has(record.status) || record.status != "completed")` + } + }, + { + id: "notify_owner", + type: "notify", + label: "Notify Owner", + config: { + recipients: [cel18`record.owner_id`], + channels: ["inbox", "email"], + severity: "warning", + topic: "urgent_task", + template: "crm.urgent_task", + templateData: { subject: cel18`record.subject` }, + actionUrl: "/crm_task/{{record.id}}" + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "notify_owner", type: "default" }, + { id: "e2", source: "notify_owner", target: "end", type: "default" } + ] +}; + +// src/sales/flows/task-due-reminder.flow.ts +import { cel as cel19 } from "@objectstack/spec"; +var TaskDueReminderFlow = { + name: "task_due_reminder", + label: "Task Due Reminder", + description: "Hourly sweep: notify owners of tasks whose reminder time has arrived.", + type: "schedule", + status: "active", + // Scheduled runs have no trigger user, so under the default runAs:'user' the + // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that + // RLS-bypassing elevation explicit and intended (ADR-0049). + runAs: "system", + variables: [], + nodes: [ + { + id: "start", + type: "start", + label: "Start (hourly)", + config: { schedule: "0 * * * *" } + }, + { + id: "query_due", + type: "get_record", + label: "Find Tasks Due for Reminder", + config: { + objectName: "crm_task", + // De-dup via `reminder_date` itself: the sweep notifies tasks whose + // reminder time has arrived, then CLEARS reminder_date (see mark_sent), + // so the row no longer matches `$lte` next tick. We do NOT filter on the + // `reminder_sent` boolean here — empirically, a where-clause on that + // (newly added) boolean column returns zero rows at runtime in this + // engine build, while the long-standing `is_completed` boolean works. + // Reusing the verified `$lte` + `is_completed` predicates keeps the + // sweep reliable; `reminder_sent` is still stamped for the audit trail. + filter: { + is_completed: false, + reminder_date: { $lte: cel19`isoDatetime(now())` } + }, + limit: 500, + outputVariable: "reminderList" + } + }, + { + // The loop body MUST be nested in `config.body` — a flat-graph loop + // (body omitted, iterator wired via outer edges) does NOT iterate or bind + // the iterator variable in the runtime (legacy no-op path), so + // `{currentTask.*}` resolves empty. Verified empirically. + id: "loop_tasks", + type: "loop", + label: "For Each Due Task", + config: { + collection: cel19`reminderList`, + iteratorVariable: "currentTask", + body: guarded("task", { + nodes: [ + { + id: "notify_owner", + type: "notify", + label: "Notify Owner", + config: { + recipients: [cel19`has(currentTask.owner_id) ? currentTask.owner_id : null`], + channels: ["inbox", "email"], + severity: "warning", + topic: "task_reminder", + template: "crm.task_reminder", + templateData: { + subject: cel19`currentTask.subject`, + reminder_date: cel19`currentTask.reminder_date` + }, + actionUrl: "/crm_task/{{currentTask.id}}" + } + }, + { + id: "mark_sent", + type: "update_record", + label: "Mark Reminder Sent", + config: { + objectName: "crm_task", + filter: { id: cel19`currentTask.id` }, + // Clearing reminder_date is what de-dups (the row stops matching + // the sweep's `$lte` next tick); reminder_sent is the audit flag. + fields: { reminder_sent: true, reminder_date: null } + } + } + ], + edges: [ + { id: "b1", source: "notify_owner", target: "mark_sent", type: "default" } + ] + }) + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "query_due", type: "default" }, + { id: "e2", source: "query_due", target: "loop_tasks", type: "default" }, + { id: "e3", source: "loop_tasks", target: "end", type: "default" } + ] +}; + +// src/sales/flows/billing-handoff-closed-won.flow.ts +import { P as P38, cel as cel21 } from "@objectstack/spec"; + +// src/sales/flows/_billing-endpoint.ts +import { cel as cel20, expression as expression3 } from "@objectstack/spec"; +var BILLING_HANDOFF_ENDPOINT = process.env.HOTCRM_BILLING_ENDPOINT?.trim() || "https://billing.example.com/hotcrm/events"; +var BILLING_HANDOFF_SIGNING_SECRET = process.env.HOTCRM_BILLING_SIGNING_SECRET?.trim() || void 0; +var BILLING_HANDOFF_TIMEOUT_MS = 3e4; +var BILLING_HANDOFF_EVENT = { + opportunityClosedWon: "crm.opportunity.closed_won", + contractActivated: "crm.contract.activated" +}; +var BILLING_HANDOFF_PAYLOAD_VERSION = 1; +var BILLING_HANDOFF_LINE_ITEM_LIMIT = 200; +var ACCOUNT_FIELDS = [ + "id", + "name", + "account_number", + "billing_address", + "billing_country", + "phone", + "website" +]; +var LINE_ITEM_FIELDS = [ + "id", + "line_number", + "crm_product", + "description", + "quantity", + "list_price", + "unit_price", + "discount", + "total_price" +]; +var accountField = (field) => `has(billingAccount.${field}) ? billingAccount.${field} : null`; +var ACCOUNT_BLOCK = `{'id': billingAccount.id, 'name': billingAccount.name, 'account_number': billingAccount.account_number, 'billing_address': ${accountField("billing_address")}, 'billing_country': ${accountField("billing_country")}, 'phone': ${accountField("phone")}, 'website': ${accountField("website")}}`; +var billingBody = (event, key, fields) => expression3( + `{'event': dyn('${event}'), 'version': dyn(${BILLING_HANDOFF_PAYLOAD_VERSION}), 'occurred_at': dyn(isoDatetime(now())), '${key}': dyn({${fields.map((f) => typeof f === "string" ? [f, f] : f).map(([k, f]) => `'${k}': record.${f}`).join(", ")}}), 'account': dyn(${ACCOUNT_BLOCK}), 'line_items': billingLineItems}` +); +var loadAccountNode = () => ({ + id: "load_account", + type: "get_record", + label: "Load Account", + config: { + objectName: "crm_account", + filter: { id: cel20`record.crm_account` }, + fields: ACCOUNT_FIELDS, + // No `limit`: `get_record` calls `findOne` below 2 and binds the single row + // itself, which is what the account block's `billingAccount.FIELD` reads need. + outputVariable: "billingAccount" + } +}); + +// src/sales/flows/billing-handoff-closed-won.flow.ts +var BillingHandoffClosedWonFlow = { + name: "billing_handoff_closed_won", + label: "Billing Hand-off: Closed Won", + description: "On the transition into closed_won: POST the deal, its account and its line items to the billing endpoint via the durable HTTP outbox.", + type: "record_change", + status: "active", + // A record-change flow fired by a SYSTEM write carries no trigger user + // (ADR-0049), and opportunities reach `closed_won` through + // machinery as well as a rep's own save — `lead_conversion` writes them, and + // the `contract_renewal` sweep is itself `runAs: 'system'`. This flow has two + // data nodes, so under the default `runAs: 'user'` those reads would be + // REFUSED on exactly those runs and the hand-off would vanish silently. The + // hand-off must also see the WHOLE deal, not the slice the closing rep may + // read: an RLS-scoped line-item query that returns three of five rows would + // under-bill the customer without failing anything. + runAs: "system", + variables: [ + // Bound with a default so the payload key always exists. Not strictly + // needed here (this flow always runs the read) — declared for symmetry with + // the contract flow, where the read is conditional, so the two payloads + // cannot drift into different shapes for an empty item list. + { name: "billingLineItems", type: "collection", isInput: false, isOutput: false, defaultValue: [] } + ], + nodes: [ + { + id: "start", + type: "start", + label: "Start (opportunity updated)", + config: { + objectName: "crm_opportunity", + triggerType: "record-after-update", + // TRANSITION, not current value — see the file header. `previous.stage` + // is guarded fail-closed: no visible prior stage means no visible + // transition, so no hand-off. + condition: P38`has(record.stage) && record.stage == "closed_won" + && has(previous.stage) && previous.stage != "closed_won"` + } + }, + loadAccountNode(), + { + id: "load_line_items", + type: "get_record", + label: "Load Line Items", + config: { + objectName: "crm_opportunity_line_item", + filter: { crm_opportunity: cel21`record.id` }, + fields: LINE_ITEM_FIELDS, + // > 1 is what makes `get_record` issue a `find` and bind an ARRAY; + // omit it and the node calls `findOne` and binds a single row. + limit: BILLING_HANDOFF_LINE_ITEM_LIMIT, + outputVariable: "billingLineItems" + } + }, + { + // The node id becomes the delivery's `X-Objectstack-Event` header + // (`flow:`), so it is named for the event and not for the verb. + id: "send_closed_won_handoff", + type: "http", + label: "Enqueue Billing Hand-off", + config: { + url: BILLING_HANDOFF_ENDPOINT, + method: "POST", + // The whole point of this route: enqueue on `sys_http_delivery` rather + // than call inline, so a receiver that is down gets the delivery when + // it comes back instead of losing it. + durable: true, + timeoutMs: BILLING_HANDOFF_TIMEOUT_MS, + signingSecret: BILLING_HANDOFF_SIGNING_SECRET, + // One envelope building the whole payload (see `billingBody`). Each + // read is the value itself, never its stringification, so the amount + // stays a number and the line items an array. + body: billingBody(BILLING_HANDOFF_EVENT.opportunityClosedWon, "opportunity", [ + "id", + "name", + "amount", + "close_date", + "stage", + "type", + ["account_id", "crm_account"], + "owner_id" + ]) + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "load_account", type: "default" }, + { id: "e2", source: "load_account", target: "load_line_items", type: "default" }, + { id: "e3", source: "load_line_items", target: "send_closed_won_handoff", type: "default" }, + { id: "e4", source: "send_closed_won_handoff", target: "end", type: "default" } + ] +}; + +// src/revenue/flows/quote-generation.flow.ts +import { P as P39, expression as expression4, cel as cel22 } from "@objectstack/spec"; +var DISCOUNT = "(!has(vars.discount) || isBlank(vars.discount) ? 0.0 : double(vars.discount))"; +var ADVANCE = `has(vars.oppRecord) && has(vars.oppRecord.stage) + && (vars.oppRecord.stage == "prospecting" || vars.oppRecord.stage == "qualification" || vars.oppRecord.stage == "needs_analysis") + && (!has(vars.oppRecord.approval_status) || vars.oppRecord.approval_status != "pending")`; +var QuoteGenerationFlow = { + name: "quote_generation", + label: "Generate Quote from Opportunity", + description: "Create a quote based on opportunity details", + type: "screen", + status: "active", + variables: [ + // MUST be `recordId` — the console's flow-action trigger contract seeds + // only that name ({ recordId, objectName }); a custom name like + // `opportunityId` arrives undefined. + { name: "recordId", type: "text", isInput: true, isOutput: false }, + { name: "quoteName", type: "text", isInput: true, isOutput: false }, + { name: "expirationDays", type: "number", isInput: true, isOutput: false }, + { name: "discount", type: "number", isInput: true, isOutput: false } + ], + nodes: [ + { id: "start", type: "start", label: "Start", config: { objectName: "crm_opportunity" } }, + // ─── The 立项 (qualification) gate, REQ-0006 step 11 (#2032) ───────── + // + // 「新增商机可跟进,立项通过后方可更新阶段、投标、赢丢单操作。」 Ruled (hotcrm-R74b + // item 2, B): before 立项 is approved, Generate Quote REFUSES and creates + // nothing. Steps 15 and 18 put quoting after the deal's approval too. + // + // Why the refusal is HERE, ahead of the form and of every writer: this + // flow writes the quote BEFORE the stage, and a flow carries no + // transaction (ADR-0077). With the gate armed, `opportunity_lifecycle` + // refuses the `update_opportunity` stage write — so the run used to fail + // AFTER `create_quote` had landed: measured on 17.7.0 as a sales_rep, + // `FLOW_FAILED` 400 at `update_opportunity` ("This deal needs + // qualification approval first …"), one draft quote left behind, the + // stage unchanged. ⛔ Not #2015's keep-stage-and-quote: that lock does + // not hold quoting, this gate does. + // + // The flow is the one choke point every door reaches — the record-header + // and list-row buttons and `POST /automation/quote_generation/trigger` — + // so the refusal lives here and `generate_quote` stays visible: hiding + // it would leave the rep a missing button with no reason, because an + // action's `visible` / `disabled` are bare predicates with nowhere to + // put a sentence. + // + // The FILTER is the gate's reading, the one `opportunity_lifecycle` + // applies: `pending` or `rejected` holds the deal (an approver's "no" is + // not a release), every other value — the shipped `not_required`, + // `approved`, none at all — does not. So `held` binds the deal only while + // it is held, and `null` otherwise; `test/flow-quote.test.ts` pins that + // the two answer alike, verdict by verdict. + // + // A read of its own, at click time. ⛔ Do not fold it into + // `get_opportunity`: that read stays AFTER the screen so the pricing and + // the #2015 approval branch (`e4a` / `e4b`) see the deal as it is at + // submit. The verdict cannot drift toward held while the form is open: + // `not_required` and `approved` are never written back to `pending`. + { id: "get_held", type: "get_record", label: "Get Held Deal", config: { objectName: "crm_opportunity", filter: { id: cel22`recordId`, qualification_approval_status: { $in: ["pending", "rejected"] } }, outputVariable: "held" } }, + // A first-class refusal (`EndConfigSchema` `outcome: 'refused'`): the run + // ends `refused`, never `failed` and never parked, nothing is written, + // and the console shows the message with Close only — no Submit and no + // "completed" toast, which is what a message-only screen would give. It + // names the next step the `opportunity_lifecycle` refusal of this gate + // names. + // + // Translated: since 18.0.0-next.0 the `flows` translation group keys an + // `end` node's refusal as `refusals.refuse_held.message`, which the + // engine renders in the run's locale (at 17.7.0 it had no such key, the + // gap raised from #2032). The console titles the dialog with the action's + // translated label. ⛔ Do not re-route the refusal through a screen to + // borrow a translatable title. + { id: "refuse_held", type: "end", label: "Quote Refused", config: { outcome: "refused", message: "Qualification approval comes first: tick Request Qualification Approval. Nothing was created." } }, + { + id: "screen_1", + type: "screen", + label: "Quote Details", + config: { + fields: [ + { name: "quoteName", label: "Quote Name", type: "text", required: true }, + { name: "expirationDays", label: "Valid For (Days)", type: "number", required: true, defaultValue: 30 }, + // The ceiling is a HARD block with no override + // (`crm_quote.discount_within_ceiling`), so until it is written here + // a rep meets the number only by having the quote refused. Both + // strings below interpolate `QUOTE_DISCOUNT_CEILING` — imported, + // never retyped, the same rule the two object rules follow — so the + // hint cannot drift from the rule it describes. + // + // ⛔ There is deliberately NO `max`, and adding one does not work: + // `ScreenFieldConfigSchema` is STRICT at 17.3.0 and its entire key + // set is `name` / `label` / `type` / `required` / `options` / + // `defaultValue` / `placeholder` / `visibleWhen`. `max` is rejected + // BY NAME (`Unrecognized key(s) on this screen field: max`), so + // it fails `pnpm validate` rather than quietly doing nothing, and + // the executor forwards no such key into the `ScreenSpec` the client + // renders. `helpText` is rejected the same way — the console's + // dialog would render one, but no flow screen can carry it there. + // + // That leaves two carriers, and the label is the load-bearing one: + // `placeholder` renders only while the input is empty and + // `defaultValue: 0` seeds it, so it surfaces for the moment the rep + // clears the box to type — real, but not enough on its own. + { + name: "discount", + label: `Discount % (\u2264 ${QUOTE_DISCOUNT_CEILING})`, + type: "percent", + defaultValue: 0, + placeholder: `0-${QUOTE_DISCOUNT_CEILING}` + } + ] + } + }, + { + id: "get_opportunity", + type: "get_record", + label: "Get Opportunity", + config: { objectName: "crm_opportunity", filter: { id: cel22`recordId` }, outputVariable: "oppRecord" } + }, + { + id: "create_quote", + type: "create_record", + label: "Create Quote", + config: { + objectName: "crm_quote", + fields: { + name: cel22`quoteName`, + crm_opportunity: cel22`recordId`, + crm_account: cel22`oppRecord.crm_account`, + crm_contact: cel22`has(oppRecord.primary_contact) ? oppRecord.primary_contact : null`, + owner_id: cel22`current_user.id`, + status: "draft", + quote_date: cel22`isoDate(today())`, + expiration_date: cel22`isoDate(addDays(today(), expirationDays))`, + // `subtotal` is a bare path pass-through and needs no rounding: it + // copies `crm_opportunity.amount` as stored and does no arithmetic, + // so it adds no floating-point tail of its own. + // `discount` is an optional screen answer: a resume may leave it + // unbound, which the template wrote as nothing and the guard writes + // as null (the quote field has no default, so the two agree). + subtotal: cel22`oppRecord.amount`, + discount: cel22`has(vars.discount) ? discount : null`, + // ⛔ A currency × percentage MUST be rounded to whole cents inside the + // expression — the flow hands the engine a money amount, never an + // unrounded double. `discount / 100` is inexact for every percentage + // whose hundredth is not a dyadic rational, so a BARE product carries + // a tail: 180,000 at 30% is 125999.99999999999. While these fields + // declared `scale: 2` the insert was rejected for it (`Total Price + // must have at most 2 decimal places (got 11)`, #1206). Currency + // fields no longer declare `scale` — the platform refuses it, a + // currency's decimals are its ISO 4217 minor unit (#1965) — so the + // write is now ACCEPTED and the tail would be stored silently. The + // rounding keeps `discount_amount` / `total_price` whole-cent amounts. + // + // Both are CEL value envelopes. CEL's `round()` is INTEGER-ONLY and + // single-argument, and it returns an INT — so the divisor MUST be + // the decimal `100.0`. ⛔ Never `/ 100`: in CEL int / int is integer + // division, which silently drops the cents (1,234.56 at 10% would + // store 123, not 123.46; `test/flow-quote.test.ts` pins it). ⛔ Not + // `round(x, 2)` either: there is no precision form, and it fails + // loudly. `double()` types the amount, which some drivers return as + // a string. A cleared discount (null / absent / "") prices as 0%, as + // it did before; the `has()` guard is what keeps that TOTAL. + // + // ⭐ This shape applies ANYWHERE a flow multiplies a currency by a + // percentage. Write the rounding, not the bare product. + discount_amount: expression4(`round(double(oppRecord.amount) * (${DISCOUNT} / 100.0) * 100.0) / 100.0`, "cel"), + total_price: expression4(`round(double(oppRecord.amount) * (1.0 - ${DISCOUNT} / 100.0) * 100.0) / 100.0`, "cel"), + payment_terms: "net_30" + }, + outputVariable: "quoteId" + } + }, + { + // Advance to `proposal` only from a PRE-proposal stage (the state machine + // allows `→ proposal` from all three). ⛔ Never re-write `proposal` on a + // deal already at proposal/negotiation: that is an illegal self/backward + // transition. Those deals keep their stage; the quote is still created. + // + // ⛔ Nor on a deal AWAITING APPROVAL (`approval_status == "pending"`). A + // deal of `LARGE_DEAL_AMOUNT` or more is held by `opportunity_approval`'s + // approval node (`lockRecord: true`) until a manager decides, and the + // lock refuses this run's stage write — the run is the rep's + // (`runAs: 'user'`), and the lock is the approval working as intended. + // `create_quote` has already landed by then and a flow carries no + // transaction (ADR-0077), so the refusal used to fail the run AFTER the + // quote existed: measured on 17.7.0, `FLOW_FAILED` 400 `RECORD_LOCKED` + // at `update_opportunity`, the rep told the quote failed, and the draft + // quote left standing (#2015). A deal under review keeps its stage + // exactly like a deal already at proposal; the quote is still created — + // the button is offered at every open stage, and a draft quote commits + // nothing the approval is there to hold. `approval_status` is the lock's + // own mirror (`approvalStatusField`): the approvals plugin stamps + // `pending` when it opens the locking request and a terminal verdict + // when it releases it. + // + // The predicate itself lives on edges `e4a` / `e4b` — a `decision` node's + // singular `config.condition` is never evaluated, so a copy here would be + // inert (17.0.0-rc.2's `flow-inert-node-condition`). The totality + // rationale is on those edges, where the guards are. + id: "check_stage", + type: "decision", + label: "Can Advance to Proposal?" + }, + { + id: "update_opportunity", + type: "update_record", + label: "Update Opportunity", + config: { + // ⛔ No `last_activity_date` write: `crm_opportunity` has no such field + // (it lives on `crm_account`), and an unknown column fails this node. + objectName: "crm_opportunity", + filter: { id: cel22`recordId` }, + fields: { stage: "proposal" } + } + }, + { + // ADR-0012: deliver via the `notify` node (inbox + email). The legacy + // `script` + `actionType:'email'` shape is a no-op stub in 7.4. + id: "notify_owner", + type: "notify", + label: "Send Notification", + config: { + recipients: [cel22`current_user.id`], + channels: ["inbox", "email"], + topic: "quote_created", + template: "crm.quote_created", + templateData: { quote_name: cel22`quoteName` }, + actionUrl: "/crm_quote/{{quoteId.id}}" + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + // ⛔ A retired edge's id stays VACANT: `e1` (start → screen_1) is one. + // Every surviving edge keeps its id, and a new one takes the next id after + // the highest in use — a duplicate id is inert, so nothing would flag it. + { id: "e7", source: "start", target: "get_held", type: "default" }, + // ── The 立项 gate (#2032) ────────────────────────────────────────── + // + // COMPLEMENTARY CONDITIONALS off a plain data node, not a `decision` — the + // shape `billing-handoff-contract-activated.flow.ts` records: they are + // evaluated one by one, and `!= null` / `== null` partition exactly. + // `get_held` dominates both and binds `held` on every path — the row, or + // `null` on a miss — so neither read takes a `has()` guard: the + // get_record-dominated case `test/flow-variable-conditions.test.ts` + // records as needing none, written like `lead_conversion`'s `e5` / `e6`. + // Fail-OPEN like the hook: a deal the read cannot see goes on to the form + // and fails at `create_quote` exactly as it always did. + { id: "e9", source: "get_held", target: "refuse_held", type: "default", condition: P39`vars.held != null`, label: "Held" }, + { id: "e10", source: "get_held", target: "screen_1", type: "default", condition: P39`vars.held == null`, label: "Not held" }, + { id: "e2", source: "screen_1", target: "get_opportunity", type: "default" }, + { id: "e3", source: "get_opportunity", target: "create_quote", type: "default" }, + { id: "e4", source: "create_quote", target: "check_stage", type: "default" }, + // The two branches must PARTITION, so the keep side is the advance side + // negated whole (`ADVANCE` above): `has(…) && …` advances and everything + // else keeps. An unknown stage therefore lands on "keep stage" — the quote + // is still created and nothing illegal is written to the state machine. + // These EDGES are the live sites; `check_stage` carries no + // `config.condition` at all, because the engine never evaluates one. + // + // TOTALITY: `oppRecord` is a `get_record` OUTPUT — `findOne` answers + // a miss with `null`, and reading a field off it then aborts with `No such + // key: stage`. Measured unreachable TODAY only because two neighbouring + // schemas happen to close it: `crm_opportunity.stage` is `required` (never + // a sparse column) and `crm_quote.crm_account` is `required`, so a null + // `oppRecord` makes `create_quote` fail one node earlier. Both are one + // `required: false` away from re-opening it, so the predicate carries its + // own guard — and from 17.0.0-rc.2 an unevaluable condition aborts the step + // instead of skipping it, so the guard is load-bearing, not + // decorative. Note the scope is `vars.oppRecord`, not bare `oppRecord`: + // measured, `has(oppRecord.stage)` still aborts with `Unknown variable: + // oppRecord` when the variable is unbound, while `has(vars.oppRecord)` + // answers `false` — only the `vars.`-scoped form is total against both + // hazards. + // + // The approval term (see `check_stage`) is guarded the same way: an absent + // or null `approval_status` is "not under approval" and advances, as it + // did before the term existed. + { id: "e4a", source: "check_stage", target: "update_opportunity", type: "conditional", condition: expression4(ADVANCE, "cel"), label: "Advance" }, + { id: "e4b", source: "check_stage", target: "notify_owner", type: "conditional", condition: expression4(`!(${ADVANCE})`, "cel"), label: "Keep stage" }, + { id: "e5", source: "update_opportunity", target: "notify_owner", type: "default" }, + { id: "e6", source: "notify_owner", target: "end", type: "default" } + ] +}; + +// src/revenue/flows/contract-renewal.flow.ts +import { P as P40, cel as cel23 } from "@objectstack/spec"; +var ContractRenewalFlow = { + name: "contract_renewal", + label: "Contract Renewal Reminder", + description: "Daily sweep: open renewal tasks/opportunities for contracts nearing end_date.", + type: "schedule", + status: "active", + // Scheduled runs have no trigger user, so under the default runAs:'user' the + // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that + // RLS-bypassing elevation explicit and intended (ADR-0049). + runAs: "system", + variables: [], + nodes: [ + { id: "start", type: "start", label: "Start (daily 08:00)", config: { schedule: "0 8 * * *" } }, + { + // Broad pre-filter (next 120 days — ⛔ must cover the LARGEST + // renewal_notice_days in use; seeds go up to 90). The per-record notice + // window is applied in the decision node below so each contract honours + // its own renewal_notice_days. A pre-filter narrower than the largest + // notice period silently truncates it: a 90-day contract stays invisible + // until 60 days out. + id: "query_contracts", + type: "get_record", + label: "Find Expiring Contracts", + config: { + objectName: "crm_contract", + filter: { status: "activated", end_date: { $gte: cel23`isoDate(today())`, $lte: cel23`isoDate(daysFromNow(120))` } }, + limit: 500, + outputVariable: "contractList" + } + }, + { + id: "loop_contracts", + type: "loop", + label: "For Each Contract", + config: { + collection: cel23`contractList`, + iteratorVariable: "currentContract", + body: guarded("contract", { + nodes: [ + { + // Gateway only — the predicate lives on the out-edge. + id: "check_notice_window", + type: "decision", + label: "Within Notice Window?" + }, + { + // Idempotency gate: the sweep matches the same contract every day + // of its notice window, so ⛔ without it every day produces a + // duplicate task + notification (and, below, a duplicate + // pipeline-inflating renewal opportunity). An open renewal task + // for this contract means this window was already handled. + id: "find_existing_task", + type: "get_record", + label: "Already Reminded?", + config: { + objectName: "crm_task", + filter: { + related_to_account: cel23`currentContract.crm_account`, + subject: cel23`'Renewal due: contract ' + currentContract.contract_number`, + status: { $nin: ["completed"] } + }, + outputVariable: "existingRenewalTask" + } + }, + { + // Gateway only — the predicate lives on the out-edge. + id: "check_not_reminded", + type: "decision", + label: "First Reminder?" + }, + { + id: "create_renewal_task", + type: "create_record", + label: "Create Renewal Task", + config: { + objectName: "crm_task", + fields: { + subject: cel23`'Renewal due: contract ' + currentContract.contract_number`, + type: "follow_up", + priority: "high", + status: "not_started", + due_date: cel23`currentContract.end_date`, + owner_id: cel23`has(currentContract.owner_id) ? currentContract.owner_id : null`, + // ORG PARTITION. A schedule trigger carries no + // organization, so the engine has nothing to fill this from + // and the row would be born `organization_id` NULL — outside + // every org partition, where an `(organization_id, …)` unique + // index does not constrain and org-scoped reads never see it. + // Upstream ruling objectstack#6155 Q2=A puts the answer here, + // with the flow author: a renewal task belongs to the org of + // the contract that spawned it. Fill-only precedence means an + // author-set value wins over the engine (objectstack#6153). + // The source MUST be a row that actually carries the column. + // On 17.x an absent key interpolated to `undefined` and landed + // as NULL, which satisfied the publish guard while reproducing + // the bug; the CEL read below fails the iteration instead, and + // it is deliberately left UNGUARDED — a `has()` guard would + // write that NULL back. `crm_contract` carries it; `sys_user` + // does not. + organization_id: cel23`currentContract.organization_id`, + related_to_type: "crm_account", + related_to_account: cel23`currentContract.crm_account` + } + } + }, + { + id: "notify_owner", + type: "notify", + label: "Notify Owner", + config: { + recipients: [cel23`has(currentContract.owner_id) ? currentContract.owner_id : null`], + channels: ["inbox", "email"], + topic: "contract_renewal", + template: "crm.contract_renewal", + templateData: { + contract_number: cel23`currentContract.contract_number`, + end_date: cel23`currentContract.end_date` + }, + actionUrl: "/crm_contract/{{currentContract.id}}" + } + }, + { + // Gateway only — the predicate lives on the out-edge. + id: "check_auto_renewal", + type: "decision", + label: "Auto-Renewal On?" + }, + { + // Second gate: never open a second renewal opportunity while one + // is still in flight for this account (belt-and-braces for the + // case where the task was completed but the deal is still open). + id: "find_existing_renewal_opp", + type: "get_record", + label: "Open Renewal Deal Exists?", + config: { + objectName: "crm_opportunity", + filter: { + crm_account: cel23`currentContract.crm_account`, + type: "existing_renewal", + stage: { $nin: ["closed_won", "closed_lost"] } + }, + outputVariable: "existingRenewalOpp" + } + }, + { + // Gateway only — the predicate lives on the out-edge. + id: "check_no_open_renewal", + type: "decision", + label: "No Open Renewal Deal?" + }, + { + id: "create_renewal_opp", + type: "create_record", + label: "Open Renewal Opportunity", + config: { + objectName: "crm_opportunity", + fields: { + name: cel23`'Renewal — ' + currentContract.contract_number`, + crm_account: cel23`currentContract.crm_account`, + amount: cel23`currentContract.contract_value`, + stage: "proposal", + type: "existing_renewal", + close_date: cel23`currentContract.end_date`, + owner_id: cel23`has(currentContract.owner_id) ? currentContract.owner_id : null`, + // ORG PARTITION — see `create_renewal_task` above. + // The renewal deal belongs to the same org as the contract. + organization_id: cel23`currentContract.organization_id`, + next_step: "Confirm renewal terms with customer" + } + } + } + ], + edges: [ + // Only act when inside the per-contract notice window; gates with + // no matching edge simply end the iteration, so the loop moves on. + // + // The EDGE is the ONLY site: a `decision` node's singular + // `config.condition` is never read — the executor reads the plural + // `config.conditions[]` and nothing else — so a copy on the node + // would be inert metadata that drifts silently. `check_notice_window` + // is therefore a bare gateway and this predicate is authored once. + // + // `end_date` is a DATE field and arrives as `YYYY-MM-DD`, but CEL's + // `timestamp()` only accepts a full ISO 8601 datetime and throws + // otherwise ("timestamp() requires a string in ISO 8601 format"). + // Appending the time part is what makes this evaluate instead of + // blowing up mid-sweep. + // + // TOTALITY: `currentContract` is a LOOP ITEM over + // `contractList`, which `get_record` filled from `data.find` — + // every element is a raw driver row, sparse in exactly the way + // a raw driver row is. `end_date` is `required` on `crm_contract` so + // that column is always written, but `renewal_notice_days` + // (`defaultValue: 30`) and `auto_renewal` (`defaultValue: false`) + // are only DEFAULTED, and a row written before the default existed + // carries neither the column nor a value. Both operands + // additionally need `!= null`, because the abort here is not the + // usual overload error: `null + "T00:00:00Z"` and `int(null)` each + // blow up inside the function call, one contract into a 500-row + // sweep, taking the whole scheduled run with them. + { id: "b1", source: "check_notice_window", target: "find_existing_task", type: "conditional", condition: P40`has(vars.currentContract) && has(vars.currentContract.end_date) && has(vars.currentContract.renewal_notice_days) + && vars.currentContract.end_date != null && vars.currentContract.renewal_notice_days != null + && timestamp(vars.currentContract.end_date + "T00:00:00Z") <= daysFromNow(int(vars.currentContract.renewal_notice_days))`, label: "In window" }, + { id: "b2", source: "find_existing_task", target: "check_not_reminded", type: "default" }, + { id: "b3", source: "check_not_reminded", target: "create_renewal_task", type: "conditional", condition: P40`existingRenewalTask == null`, label: "First reminder" }, + { id: "b4", source: "create_renewal_task", target: "notify_owner", type: "default" }, + { id: "b5", source: "notify_owner", target: "check_auto_renewal", type: "default" }, + // TOTALITY: same loop item, same sparse driver row. Only an + // explicit `true` opens a renewal deal, so an absent column reads + // as "auto-renewal off" — the conservative branch. + { id: "b6", source: "check_auto_renewal", target: "find_existing_renewal_opp", type: "conditional", condition: P40`has(vars.currentContract) && has(vars.currentContract.auto_renewal) + && vars.currentContract.auto_renewal == true`, label: "Auto-renew" }, + { id: "b7", source: "find_existing_renewal_opp", target: "check_no_open_renewal", type: "default" }, + { id: "b8", source: "check_no_open_renewal", target: "create_renewal_opp", type: "conditional", condition: P40`existingRenewalOpp == null`, label: "Open renewal deal" } + ] + }) + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "query_contracts", type: "default" }, + { id: "e2", source: "query_contracts", target: "loop_contracts", type: "default" }, + { id: "e3", source: "loop_contracts", target: "end", type: "default" } + ] +}; + +// src/revenue/flows/quote-expiration.flow.ts +import { cel as cel24 } from "@objectstack/spec"; +var QuoteExpirationFlow = { + name: "quote_expiration", + label: "Quote Auto-Expiration", + description: "Daily: expire quotes past their expiration_date that are still open.", + type: "schedule", + status: "active", + // Scheduled runs have no trigger user, so under the default runAs:'user' the + // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that + // RLS-bypassing elevation explicit and intended (ADR-0049). + runAs: "system", + variables: [], + nodes: [ + { id: "start", type: "start", label: "Start (daily 01:00)", config: { schedule: "0 1 * * *" } }, + { + id: "query_quotes", + type: "get_record", + label: "Find Expired Quotes", + config: { + objectName: "crm_quote", + filter: { status: { $nin: ["accepted", "rejected", "expired"] }, expiration_date: { $lt: cel24`isoDate(today())` } }, + limit: 500, + outputVariable: "quoteList" + } + }, + { + id: "loop_quotes", + type: "loop", + label: "For Each Quote", + config: { + collection: cel24`quoteList`, + iteratorVariable: "currentQuote", + body: guarded("quote", { + nodes: [ + { + id: "mark_expired", + type: "update_record", + label: "Mark Expired", + config: { objectName: "crm_quote", filter: { id: cel24`currentQuote.id` }, fields: { status: "expired" } } + } + ], + edges: [] + }) + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "query_quotes", type: "default" }, + { id: "e2", source: "query_quotes", target: "loop_quotes", type: "default" }, + { id: "e3", source: "loop_quotes", target: "end", type: "default" } + ] +}; + +// src/revenue/flows/contract-expiration.flow.ts +import { cel as cel25 } from "@objectstack/spec"; +var ContractExpirationFlow = { + name: "contract_expiration", + label: "Contract Auto-Expiration", + description: "Daily: expire activated contracts past their end_date and notify the owner.", + type: "schedule", + status: "active", + // Scheduled runs have no trigger user, so under the default runAs:'user' the + // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that + // RLS-bypassing elevation explicit and intended (ADR-0049). + runAs: "system", + variables: [], + nodes: [ + { id: "start", type: "start", label: "Start (daily 00:00)", config: { schedule: "0 0 * * *" } }, + { + id: "query_contracts", + type: "get_record", + label: "Find Expired Contracts", + config: { + objectName: "crm_contract", + filter: { status: "activated", end_date: { $lt: cel25`isoDate(today())` } }, + limit: 500, + outputVariable: "contractList" + } + }, + { + id: "loop_contracts", + type: "loop", + label: "For Each Contract", + config: { + collection: cel25`contractList`, + iteratorVariable: "currentContract", + body: guarded("contract", { + nodes: [ + { + id: "mark_expired", + type: "update_record", + label: "Mark Expired", + config: { objectName: "crm_contract", filter: { id: cel25`currentContract.id` }, fields: { status: "expired" } } + }, + { + id: "notify_owner", + type: "notify", + label: "Notify Owner", + config: { + recipients: [cel25`has(currentContract.owner_id) ? currentContract.owner_id : null`], + channels: ["inbox", "email"], + topic: "contract_expired", + template: "crm.contract_expired", + templateData: { contract_number: cel25`currentContract.contract_number` }, + actionUrl: "/crm_contract/{{currentContract.id}}" + } + } + ], + edges: [ + { id: "b1", source: "mark_expired", target: "notify_owner", type: "default" } + ] + }) + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "query_contracts", type: "default" }, + { id: "e2", source: "query_contracts", target: "loop_contracts", type: "default" }, + { id: "e3", source: "loop_contracts", target: "end", type: "default" } + ] +}; + +// src/revenue/flows/billing-handoff-contract-activated.flow.ts +import { P as P41, cel as cel26 } from "@objectstack/spec"; +var BillingHandoffContractActivatedFlow = { + name: "billing_handoff_contract_activated", + label: "Billing Hand-off: Contract Activated", + description: "On the transition into activated: POST the contract, its account and the originating deal\u2019s line items to the billing endpoint via the durable HTTP outbox.", + type: "record_change", + status: "active", + // Contracts are activated by machinery as well as by hand — `contract.hook.ts` + // stamps the account promotion and signed date on that same transition, and + // the renewal sweep runs `runAs: 'system'`. A system write carries no trigger + // user, so under the default `runAs: 'user'` this flow's two reads would be + // refused on exactly those runs and the hand-off would disappear without a + // failed step. Elevation also guarantees the payload is the whole contract, + // not an RLS-narrowed view of it. + runAs: "system", + variables: [ + // Bound with a default because the line-item read below is CONDITIONAL: a + // contract need not have an originating opportunity. Without the default, + // the skipped path leaves `billingLineItems` unbound and the payload key + // vanishes — so a receiver could not tell "no items" from "not sent". + { name: "billingLineItems", type: "collection", isInput: false, isOutput: false, defaultValue: [] } + ], + nodes: [ + { + id: "start", + type: "start", + label: "Start (contract updated)", + config: { + objectName: "crm_contract", + triggerType: "record-after-update", + condition: P41`has(record.status) && record.status == "activated" + && has(previous.status) && previous.status != "activated"` + } + }, + loadAccountNode(), + { + id: "load_line_items", + type: "get_record", + label: "Load Originating Deal\u2019s Line Items", + config: { + objectName: "crm_opportunity_line_item", + // Contracts carry no line items of their own; what was sold sits on the + // opportunity the contract came from. Reached only via the guarded edge + // below, because `crm_opportunity` is OPTIONAL on a contract and a + // filter operand that evaluates to null makes `get_record` refuse the + // step (an absent condition widens a query rather than narrowing it). + filter: { crm_opportunity: cel26`record.crm_opportunity` }, + fields: LINE_ITEM_FIELDS, + limit: BILLING_HANDOFF_LINE_ITEM_LIMIT, + outputVariable: "billingLineItems" + } + }, + { + id: "send_contract_activated_handoff", + type: "http", + label: "Enqueue Billing Hand-off", + config: { + url: BILLING_HANDOFF_ENDPOINT, + method: "POST", + durable: true, + timeoutMs: BILLING_HANDOFF_TIMEOUT_MS, + signingSecret: BILLING_HANDOFF_SIGNING_SECRET, + // One envelope building the whole payload (see `billingBody`). This + // flow is the consumer of `billing_frequency` and `payment_terms`: they + // are what the billing system needs to raise the schedule HotCRM + // deliberately does not model. + body: billingBody(BILLING_HANDOFF_EVENT.contractActivated, "contract", [ + "id", + "contract_number", + "status", + "contract_type", + "start_date", + "end_date", + "contract_term_months", + "contract_value", + "billing_frequency", + "payment_terms", + "auto_renewal", + "signed_date", + ["account_id", "crm_account"], + ["opportunity_id", "crm_opportunity"], + "owner_id" + ]) + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "load_account", type: "default" }, + // The two edges below are COMPLEMENTARY CONDITIONALS on a plain data node, + // deliberately not a `decision` gateway. A decision with no declared + // `config.conditions` reports the engine's `default` branch label, and + // traversal then narrows the edge set to out-edges claiming that label — + // an `isDefault: true` sibling would swallow the whole branch and the + // conditional edge would never be evaluated. Complementary conditions off a + // non-branching node are evaluated one by one, which is the behaviour this + // needs. + { + id: "e2", + source: "load_account", + target: "load_line_items", + type: "conditional", + label: "Has originating deal", + condition: P41`has(record.crm_opportunity) && record.crm_opportunity != null` + }, + { + id: "e3", + source: "load_account", + target: "send_contract_activated_handoff", + type: "conditional", + label: "No originating deal", + condition: P41`!has(record.crm_opportunity) || record.crm_opportunity == null` + }, + { id: "e4", source: "load_line_items", target: "send_contract_activated_handoff", type: "default" }, + { id: "e5", source: "send_contract_activated_handoff", target: "end", type: "default" } + ] +}; + +// src/marketing/flows/campaign-enrollment.flow.ts +import { P as P42, cel as cel27 } from "@objectstack/spec"; +var CampaignEnrollmentFlow = { + name: "campaign_enrollment", + label: "Enroll Members in Campaign", + description: "Bulk enroll eligible leads or contacts into this campaign (skips already-enrolled and opted-out people).", + type: "screen", + status: "active", + variables: [ + // `recordId` matches the console's flow-action trigger contract + // ({ recordId, objectName }) — cf. lead_conversion / quote_generation. + { name: "recordId", type: "text", isInput: true, isOutput: false }, + /** + * `memberSource` is BOUND BY THIS DECLARATION — not by a seeding node. + * + * Both branch edges (`e4` / `e7`) read `vars.memberSource`, so it must be + * bound on every path reaching them. `FlowVariableSchema` carries + * `defaultValue` and the engine seeds it before the start node runs, so this + * key alone binds the name — while a caller-supplied + * `context.params.memberSource` still WINS over it. + * + * ⚠️ Measured on the 17.1.0 spec, with the schema key re-checked on 17.2.0. + * Neither that key nor the seeding behaviour was re-checked on 17.3.0 or + * 17.4.0 (PR #1814, #1807), nor on 17.5.0, 17.6.0, 17.7.0 or 18.0.0-next.0 (the pin since #2031). + * + * ⛔ Never seed this with an assignment node instead. An assignment is + * unconditional, so it CLOBBERS a supplied param — measured: launching with + * `params.memberSource = 'contacts'` ran the LEAD branch. It also restates a + * default the screen field carries, with nothing keeping the two in step. + * + * A second, independent reason no seeding node is needed here: the + * `memberSource` screen field below is `required: true`, and since + * 17.0.0-rc.2 the SERVER holds a screen resume to the declared field + * contract. A resume signal omitting `memberSource` is refused with + * `INVALID_SCREEN_INPUT` and the run stays paused, so the ordinary resume + * path cannot reach an unbound read at all — unlike `lead_conversion`'s + * checkbox, which is deliberately not `required` and therefore has an + * unanswered state. The one path that skips that check is a resume carrying + * NO signal object; measured on 17.x, it fails one node later at + * `query_leads` regardless of this binding, because `leadStatus` is unbound + * and the query never runs widened. Since 18.0.0-next.0 the filter operand + * is a CEL envelope, and an unbound variable fails the run before the query + * (the platform's `flow-value-slot-template-dialect-refused` contract; not + * re-measured here). + * + * The literal lives HERE and nowhere else: the screen field derives its + * prefill from this variable (its `defaultValue` envelope reads `memberSource`). + */ + { name: "memberSource", type: "text", isInput: true, isOutput: false, defaultValue: "leads" }, + /** + * `leadStatus` / `contactDepartment` deliberately carry NO `defaultValue`, + * and the asymmetry with `memberSource` is the point. No condition in this + * flow reads either one — each is a `get_record` `filter` operand — so the + * binding analysis in `test/flow-variable-conditions.test.ts` does not + * cover them. An unbound one fails the run before the query is made (the + * 18.0.0-next.0 filter-operand contract), because an absent condition + * widens a query instead of narrowing it. Seeding these two would turn that + * loud failure into a silent enrolment of a segment nobody chose; their + * `required: true` screen fields are what supply them. + */ + { name: "leadStatus", type: "text", isInput: true, isOutput: false }, + { name: "contactDepartment", type: "text", isInput: true, isOutput: false } + ], + nodes: [ + { id: "start", type: "start", label: "Start", config: { objectName: "crm_campaign" } }, + { + id: "screen_1", + type: "screen", + label: "Enrollment Criteria", + config: { + fields: [ + { + // Prefill DERIVED from the variable, so the default is written + // once (on the declaration) rather than restated here — the + // single-authority form. The envelope is evaluated before the + // screen goes on the wire, so the client receives the raw value, + // the string `leads`, which is what a literal + // `defaultValue: 'leads'` used to send. + name: "memberSource", + label: "Enroll", + type: "select", + required: true, + defaultValue: cel27`memberSource`, + options: [ + { label: "Leads", value: "leads" }, + { label: "Contacts", value: "contacts" } + ] + }, + { + name: "leadStatus", + label: "Enroll leads in status", + type: "select", + required: true, + defaultValue: "new", + options: [ + { label: "New", value: "new" }, + { label: "Contacted", value: "contacted" }, + { label: "Qualified", value: "qualified" } + ] + }, + { + // Required, like `leadStatus`, and for the same reason: a blank + // segment would reach the filter as an empty string and + // silently match the contacts with NO department rather than all of + // them. Both branches make the caller name a segment. + name: "contactDepartment", + label: "Enroll contacts in department", + type: "select", + required: true, + defaultValue: "executive", + options: [ + { label: "Executive", value: "executive" }, + { label: "Sales", value: "sales" }, + { label: "Marketing", value: "marketing" }, + { label: "Engineering", value: "engineering" }, + { label: "Support", value: "support" }, + { label: "Finance", value: "finance" }, + { label: "Human Resources", value: "hr" }, + { label: "Operations", value: "operations" } + ] + } + ] + } + }, + { + id: "get_campaign", + type: "get_record", + label: "Get Campaign", + config: { objectName: "crm_campaign", filter: { id: cel27`recordId` }, outputVariable: "campaignRecord" } + }, + { + // The gate itself is on edges `e4` / `e7` — see the notes there. This node + // carries NO `config.condition`: the key is the trigger gate on a `start` + // node and is read nowhere else, so a copy here would be a second, inert + // statement of the predicate that no reader can tell apart from the live + // one (flagged by `flow-inert-node-condition` from 17.0.0-rc.2). + id: "check_campaign_open", + type: "decision", + label: "Campaign Open?" + }, + { + id: "query_leads", + type: "get_record", + label: "Find Eligible Leads", + config: { + objectName: "crm_lead", + filter: { + status: cel27`leadStatus`, + is_converted: false, + email: { $ne: null }, + // This is email-campaign enrollment — honour the opt-out flag. + // `campaign_member_optout_sync` populates it: an unsubscribed member + // round-trips to the person's `email_opt_out`. + email_opt_out: false + }, + limit: 1e3, + outputVariable: "leadList" + } + }, + { + id: "loop_leads", + type: "loop", + label: "Process Each Lead", + config: { + collection: cel27`leadList`, + iteratorVariable: "currentLead", + body: guarded("lead", { + nodes: [ + { + // Dedupe: skip leads already enrolled in THIS campaign, so a + // re-run tops up instead of double-enrolling (double rows + // inflated num_sent / response_rate). + id: "find_existing_member", + type: "get_record", + label: "Already Enrolled?", + config: { + objectName: "crm_campaign_member", + filter: { crm_campaign: cel27`recordId`, crm_lead: cel27`currentLead.id` }, + outputVariable: "existingMember" + } + }, + { + // Gateway only — the predicate lives on the out-edge. + id: "check_not_enrolled", + type: "decision", + label: "New Member?" + }, + { + // ⭐ The INSERT is elevated, this flow is NOT. `added_date` is + // `readonly: true`, and from @objectstack/objectql 17.4.0 the + // readonly strip runs inside `engine.insert` for a non-system + // caller as well as on update — so a write from this screen + // flow's user context now loses the stamp. The remedy the + // platform names is a system context; the remedy AGENTS.md house + // rule 9 names is a dedicated `system` sub-flow rather than + // elevating the screen flow. Both are satisfied here. ⛔ Do not + // fold this back by giving THIS flow `runAs: 'system'`: it would + // also lift RLS off `query_leads` / `query_contacts`, and + // `crm_lead` is `sharingModel: 'private'`. + // See `src/marketing/flows/campaign-member-enroll.flow.ts`. + id: "create_campaign_member", + type: "subflow", + label: "Add to Campaign", + config: { + flowName: "campaign_lead_member_enroll", + input: { campaignId: cel27`recordId`, leadId: cel27`currentLead.id` } + } + } + ], + edges: [ + { id: "b1", source: "find_existing_member", target: "check_not_enrolled", type: "default" }, + // Already enrolled → no edge → next lead. This edge is the ONLY + // site for the predicate: a `decision` node's singular + // `config.condition` is never read, so a node copy would be inert. + { id: "b2", source: "check_not_enrolled", target: "create_campaign_member", type: "conditional", condition: P42`existingMember == null`, label: "Enroll" } + ] + }) + } + }, + { + id: "query_contacts", + type: "get_record", + label: "Find Eligible Contacts", + config: { + objectName: "crm_contact", + filter: { + department: cel27`contactDepartment`, + email: { $ne: null }, + // Same opt-out honour as the lead branch. There is no `is_converted` + // twin here: a contact IS the converted end state. + email_opt_out: false + }, + limit: 1e3, + outputVariable: "contactList" + } + }, + { + id: "loop_contacts", + type: "loop", + label: "Process Each Contact", + config: { + collection: cel27`contactList`, + iteratorVariable: "currentContact", + body: guarded("contact", { + nodes: [ + { + // Dedupe scoped on `crm_contact`, so a person enrolled as a LEAD + // and again as a CONTACT is not treated as a duplicate: those are + // two records of two different relationships, and the seed + // datasets key them separately for the same reason. + id: "find_existing_contact_member", + type: "get_record", + label: "Already Enrolled?", + config: { + objectName: "crm_campaign_member", + filter: { crm_campaign: cel27`recordId`, crm_contact: cel27`currentContact.id` }, + outputVariable: "existingContactMember" + } + }, + { + // Gateway only — the predicate lives on the out-edge. + id: "check_contact_not_enrolled", + type: "decision", + label: "New Member?" + }, + { + // The contact mirror of `create_campaign_member` above — same + // elevation, same reason. See that node's note. + id: "create_contact_member", + type: "subflow", + label: "Add Contact to Campaign", + config: { + flowName: "campaign_contact_member_enroll", + input: { campaignId: cel27`recordId`, contactId: cel27`currentContact.id` } + } + } + ], + edges: [ + { id: "c1", source: "find_existing_contact_member", target: "check_contact_not_enrolled", type: "default" }, + { id: "c2", source: "check_contact_not_enrolled", target: "create_contact_member", type: "conditional", condition: P42`existingContactMember == null`, label: "Enroll" } + ] + }) + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "screen_1", type: "default" }, + { id: "e2", source: "screen_1", target: "get_campaign", type: "default" }, + { id: "e3", source: "get_campaign", target: "check_campaign_open", type: "default" }, + // Closed campaign → no edge → flow ends without enrolling. + // + // THE live gate, on the EDGES and only here. A `decision` node's singular + // `config.condition` is never read by the engine. + // + // Only enroll into campaigns that are actually running (or planned): + // topping up a completed/aborted campaign would corrupt its recorded + // metrics. (Status values: planning / in_progress / completed / aborted.) + // + // TOTALITY: `has(vars.campaignRecord)` first, then + // `has(vars.campaignRecord.status)`. `campaignRecord` is a `get_record` + // OUTPUT, and `findOne` answers a miss with `null` — so a campaign that was + // deleted (or hidden by sharing) between the action click and this node + // leaves the variable bound to null, and an unguarded read aborts with + // `No such key: status`, recording the run `failed` with not one lead + // enrolled. `status` is `required` on `crm_campaign` today so the column is + // never sparse — but that is the neighbouring schema doing the work, not + // this predicate, so it is guarded too. + // + // TWO conditional out-edges, one per member side. The open-campaign clause + // is repeated on both rather than hoisted to a second decision node: the + // gate IS the edge predicate here, so a separate "which side" node would + // need its own out-edges carrying the same clause anyway, and a node + // stating it once in `config.condition` is inert. + { id: "e4", source: "check_campaign_open", target: "query_leads", type: "conditional", condition: P42`has(vars.campaignRecord) && has(vars.campaignRecord.status) + && (vars.campaignRecord.status == "planning" || vars.campaignRecord.status == "in_progress") + && vars.memberSource != "contacts"`, label: "Open \xB7 Leads" }, + { id: "e5", source: "query_leads", target: "loop_leads", type: "default" }, + { id: "e6", source: "loop_leads", target: "end", type: "default" }, + // The contact branch. `memberSource` carries no `has()` guard on either + // edge, deliberately: its `flow.variables` declaration carries + // `defaultValue: 'leads'`, which the engine seeds before the start node, so + // it is bound on every path that reaches here — and on the ordinary resume + // path the server has already refused any signal that omitted the + // `required` screen field. A guard would have buried the policy ("no answer + // means leads") inside a predicate and left the graph defect in place — see + // test/flow-variable-conditions.test.ts. + { id: "e7", source: "check_campaign_open", target: "query_contacts", type: "conditional", condition: P42`has(vars.campaignRecord) && has(vars.campaignRecord.status) + && (vars.campaignRecord.status == "planning" || vars.campaignRecord.status == "in_progress") + && vars.memberSource == "contacts"`, label: "Open \xB7 Contacts" }, + { id: "e8", source: "query_contacts", target: "loop_contacts", type: "default" }, + { id: "e9", source: "loop_contacts", target: "end", type: "default" } + ] +}; + +// src/marketing/flows/campaign-member-enroll.flow.ts +import { cel as cel28 } from "@objectstack/spec"; +var MEMBERSHIP_FIELDS = { + status: "sent", + // The readonly stamp this elevation exists for. + added_date: cel28`isoDatetime(now())` +}; +var CampaignLeadMemberEnrollFlow = { + name: "campaign_lead_member_enroll", + label: "Enroll Lead in Campaign", + description: "Insert one lead campaign-membership row with its readonly added_date stamp, using the system context. Called by campaign_enrollment through a subflow node.", + type: "autolaunched", + status: "active", + // ⭐ THE ENTIRE POINT OF THIS FILE — see the header. One `create_record`. + runAs: "system", + variables: [ + // Supplied by the caller's `subflow` node. + { name: "campaignId", type: "text", isInput: true, isOutput: false }, + { name: "leadId", type: "text", isInput: true, isOutput: false } + ], + nodes: [ + // `config: {}` — an autolaunched callee is handed its params by the + // `subflow` executor and resolves no trigger record of its own, so there is + // no `objectName` for the start node to load. Same shape as + // `case_escalation_stamp`, measured in `test/readonly-write-semantics.test.ts`. + { id: "start", type: "start", label: "Start", config: {} }, + { + id: "create_campaign_member", + type: "create_record", + label: "Add to Campaign", + config: { + objectName: "crm_campaign_member", + // ⛔ Do not add fields here. Every column in this node is written with + // the elevated context; anything a marketer may legitimately type + // belongs in `campaign_enrollment` instead. + fields: { crm_campaign: cel28`campaignId`, crm_lead: cel28`leadId`, ...MEMBERSHIP_FIELDS } + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "create_campaign_member", type: "default" }, + { id: "e2", source: "create_campaign_member", target: "end", type: "default" } + ] +}; +var CampaignContactMemberEnrollFlow = { + name: "campaign_contact_member_enroll", + label: "Enroll Contact in Campaign", + description: "Insert one contact campaign-membership row with its readonly added_date stamp, using the system context. Called by campaign_enrollment through a subflow node.", + type: "autolaunched", + status: "active", + runAs: "system", + variables: [ + { name: "campaignId", type: "text", isInput: true, isOutput: false }, + { name: "contactId", type: "text", isInput: true, isOutput: false } + ], + nodes: [ + { id: "start", type: "start", label: "Start", config: {} }, + { + id: "create_contact_member", + type: "create_record", + label: "Add Contact to Campaign", + config: { + objectName: "crm_campaign_member", + fields: { crm_campaign: cel28`campaignId`, crm_contact: cel28`contactId`, ...MEMBERSHIP_FIELDS } + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "create_contact_member", type: "default" }, + { id: "e2", source: "create_contact_member", target: "end", type: "default" } + ] +}; + +// src/marketing/flows/campaign-completion.flow.ts +import { cel as cel29 } from "@objectstack/spec"; +var CampaignCompletionFlow = { + name: "campaign_completion", + label: "Campaign Auto-Completion", + description: "Daily: mark in_progress campaigns whose end_date has passed as completed.", + type: "schedule", + status: "active", + // Scheduled runs have no trigger user, so under the default runAs:'user' the + // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that + // RLS-bypassing elevation explicit and intended (ADR-0049). + runAs: "system", + variables: [], + nodes: [ + { id: "start", type: "start", label: "Start (daily 02:00)", config: { schedule: "0 2 * * *" } }, + { + id: "query_campaigns", + type: "get_record", + label: "Find Ended Campaigns", + config: { + objectName: "crm_campaign", + filter: { status: "in_progress", end_date: { $lt: cel29`isoDate(today())` } }, + limit: 500, + outputVariable: "campaignList" + } + }, + { + id: "loop_campaigns", + type: "loop", + label: "For Each Campaign", + config: { + collection: cel29`campaignList`, + iteratorVariable: "currentCampaign", + body: guarded("campaign", { + nodes: [ + { + id: "mark_completed", + type: "update_record", + label: "Mark Completed", + config: { objectName: "crm_campaign", filter: { id: cel29`currentCampaign.id` }, fields: { status: "completed" } } + } + ], + edges: [] + }) + } + }, + { id: "end", type: "end", label: "End" } + ], + edges: [ + { id: "e1", source: "start", target: "query_campaigns", type: "default" }, + { id: "e2", source: "query_campaigns", target: "loop_campaigns", type: "default" }, + { id: "e3", source: "loop_campaigns", target: "end", type: "default" } + ] +}; + +// src/sales/skills/lead-qualification.skill.ts +import { defineSkill as defineSkill2 } from "@objectstack/spec"; +var LeadQualificationSkill = defineSkill2({ + name: "lead_qualification", + label: "Lead Qualification", + description: "Qualifies inbound leads using BANT criteria and assigns a 0\u2013100 score.", + instructions: `When the user asks to qualify, score, or analyse a lead: + +1. Read the lead \u2014 \`describe_object\` for \`crm_lead\` first (fields + change), then \`get_record\`. Use \`query_records\` to pull the + related activity history when the lead has any. +2. Score it yourself, 0\u2013100, with BANT. There is no scoring tool: + Budget (is spend confirmed or inferable from company size?), + Authority (is the contact a decision maker?), Need (is there a + stated problem you solve?), Timeline (is there a date?). Weight + them evenly unless the user says otherwise. +3. Report the score, one line of justification per BANT dimension + naming the field or activity you read, and the single recommended + next step. Cite the lead ID. +4. Score >= 70 and the user agrees \u2192 call \`action_convert_lead\`. +5. Otherwise, or when the user wants to nurture, call + \`action_schedule_followup\` with the date you recommend. Say why + that date. +6. Never convert without explicit confirmation \u2014 conversion is not + reversible from this surface.`, + tools: [ + "describe_object", + "get_record", + "query_records", + "action_convert_lead", + "action_schedule_followup" + ], + triggerConditions: [ + { field: "objectName", operator: "eq", value: "crm_lead" } + ] +}); + +// src/sales/skills/email-drafting.skill.ts +import { defineSkill as defineSkill3 } from "@objectstack/spec"; +var EmailDraftingSkill = defineSkill3({ + name: "email_drafting", + label: "Email Drafting", + description: "Drafts personalised outbound emails grounded in live contact data, ready for a human to review and send.", + instructions: `When the user asks to draft, write, or optimise an email: + +1. Ground it in real data before writing a word: \`get_record\` the + contact (and the related account or opportunity when the request + references one) so names, titles and recent activity are accurate. + Use \`query_records\` when you need the recent history. +2. Write the copy yourself \u2014 subject and body. You do not have, and do + not need, a copy-generation tool. Aim for: a subject under 60 + characters naming the concrete value, a first line referencing + something specific to THIS recipient rather than a generic + pleasantry, one clear ask, and no more than 150 words. +3. Offer two subject-line variants, say which you recommend and why, + so the user can A/B them. +4. Show the draft and stop. You cannot send \u2014 say so plainly rather + than implying a send is queued. +5. Point the user at **Send Email** on the contact record, where the + subject and body you drafted can be pasted, reviewed and sent.`, + tools: ["get_record", "query_records"] +}); + +// src/sales/skills/revenue-forecasting.skill.ts +import { defineSkill as defineSkill4 } from "@objectstack/spec"; +var RevenueForecastingSkill = defineSkill4({ + name: "revenue_forecasting", + label: "Revenue Forecasting", + description: "Analyses pipeline health, surfaces at-risk deals, and forecasts revenue from live opportunity data.", + instructions: `When the user asks about pipeline health, forecast, +risk, or deal slippage: + +1. Establish the shape first: \`describe_object\` for + \`crm_opportunity\` so you use the CURRENT stage, amount, + probability and close-date fields rather than assumed ones. +2. Summarise the pipeline with \`aggregate_data\` \u2014 count and summed + amount grouped by stage, scoped to the period the user names + (default: the current quarter). Weighted value is amount \xD7 + probability; compute it yourself from what you read. +3. Surface at-risk deals with \`query_records\`: close date already + past, or no activity in 30+ days, or the stage unchanged for longer + than its typical duration. Name each deal and the specific signal. +4. Forecast by summing weighted value for open deals plus closed-won + in the period. State the assumption behind the number in one line, + and give a range rather than false precision \u2014 the spread between + commit-only (high-probability stages) and full weighted pipeline. +5. Offer \`visualize_data\` when a chart would carry the answer better + than prose, e.g. stage distribution or month-over-month trend. +6. Be quantitative: every claim cites a number or a deal name. If the + data cannot support a claim, say so instead of estimating.`, + tools: ["describe_object", "aggregate_data", "query_records", "visualize_data"], + triggerConditions: [ + { field: "objectName", operator: "in", value: ["crm_opportunity", "dashboard"] } + ] +}); + +// src/sales/skills/customer-360.skill.ts +import { defineSkill as defineSkill5 } from "@objectstack/spec"; +var Customer360Skill = defineSkill5({ + name: "customer_360", + label: "Customer 360", + description: "Aggregates account, recent cases, open opportunities, and knowledge hits into a single customer profile.", + instructions: `When the user asks for "the full picture" of a +customer / account / contact: + +1. Read the shape first \u2014 \`describe_object\` for \`crm_account\`, and for + each related object before you query it. Admins add fields; never + summarise from memory of a previous turn. +2. \`get_record\` the account, then pull the related work with + \`query_records\`, each filtered to this account: + - \`crm_contact\` \u2014 who the people are, primary contact first. + - \`crm_case\` \u2014 cases where \`is_closed\` is false, newest first. + - \`crm_opportunity\` \u2014 open deals with stage, amount and close date. + Quote totals from \`aggregate_data\` (open pipeline amount, case count + by status) rather than adding up rows yourself. +3. For the policy or playbook context, \`query_records\` on + \`crm_knowledge_article\` \u2014 \`status\` published, matched on the + \`category\` or \`tags\` of the cases you just read. You have no + knowledge-search tool in this skill and do not need one: the knowledge + base is an object like any other. +4. Summarise into three sections: **Account Snapshot** \xB7 **Active Work** \xB7 + **Risks & Notes**. Every risk names the record and the signal that + raised it \u2014 an escalated case, a close date already past, a deal with + no activity in 30+ days. Do not infer risk you cannot cite. +5. Cite record IDs inline (e.g. "case CASE-01234", "article KA-0007") so + the UI can deep link. If a section has no records, say so plainly + instead of filling it.`, + tools: ["describe_object", "get_record", "query_records", "aggregate_data"] +}); + +// src/sales/skills/live-data.skill.ts +import { defineSkill as defineSkill6 } from "@objectstack/spec"; +var LiveDataSkill = defineSkill6({ + name: "live_data", + label: "Live Data Access", + description: "Queries any CRM object using the current live schema. Always inspects the object structure first so newly added fields are picked up immediately.", + instructions: `When the user asks a question that touches a CRM +record (account, contact, lead, opportunity, case, quote, etc.): + +1. **Always** call \`describe_object\` for the relevant object FIRST, + even if you think you remember the fields. The schema can change + between turns \u2014 trust the tool, not your memory. +2. Use \`list_objects\` if you are not sure which object holds the + data the user is asking about. +3. Use \`query_records\` (filters, sort, limit) for lists, + \`get_record\` for a single ID, \`aggregate_data\` for sums / + counts / averages. +4. When you reference data, cite the record ID inline so the UI + can deep-link (e.g. "opportunity OPP-1234"). +5. If \`describe_object\` shows a field you've never seen before, + USE IT \u2014 that's the user's whole point in adding it. Surface it + in your answer when relevant.`, + tools: [ + "describe_object", + "list_objects", + "query_records", + "get_record", + "aggregate_data" + ] +}); + +// src/sales/sharing/account.sharing.ts +import { P as P43 } from "@objectstack/spec"; +var AccountTeamSharingRule = { + name: "account_team_sharing", + label: "Account Team Sharing", + object: "crm_account", + type: "criteria", + condition: P43`record.type == "customer" && record.is_active == true`, + accessLevel: "edit", + sharedWith: { type: "position", value: "sales_manager" } +}; +var TerritorySharingRules = [ + { + name: "north_america_territory", + label: "North America Territory", + object: "crm_account", + type: "criteria", + condition: P43`record.territory == ${TERRITORY.NA}`, + accessLevel: "edit", + sharedWith: { type: "position", value: "na_sales_team" } + }, + { + name: "europe_territory", + label: "Europe Territory", + object: "crm_account", + type: "criteria", + condition: P43`record.territory == ${TERRITORY.EMEA}`, + accessLevel: "edit", + sharedWith: { type: "position", value: "eu_sales_team" } + } +]; + +// src/sales/sharing/opportunity.sharing.ts +import { P as P44 } from "@objectstack/spec"; +var OpportunitySalesSharingRule = { + name: "opportunity_sales_sharing", + label: "Opportunity Sales Team Sharing", + object: "crm_opportunity", + type: "criteria", + condition: P44`!(record.stage in ["closed_won", "closed_lost"]) && record.amount >= ${LARGE_DEAL_AMOUNT}`, + accessLevel: "read", + sharedWith: { type: "position", value: "sales_director" } +}; +var OpportunityExecutiveSharingRule = { + name: "opportunity_executive_sharing", + label: "Large Open Deals \u2014 Executive", + object: "crm_opportunity", + type: "criteria", + condition: P44`!(record.stage in ["closed_won", "closed_lost"]) && record.amount >= ${LARGE_DEAL_AMOUNT}`, + accessLevel: "read", + sharedWith: { type: "position", value: "executive" } +}; + +// src/sales/sharing/positions.ts +var CrmPositions = [ + { name: "executive", label: "Executive" }, + { name: "sales_director", label: "Sales Director" }, + { name: "sales_manager", label: "Sales Manager" }, + { name: "sales_rep", label: "Sales Representative" }, + { name: "service_director", label: "Service Director" }, + { name: "service_manager", label: "Service Manager" }, + { name: "service_agent", label: "Service Agent" }, + { name: "marketing_director", label: "Marketing Director" }, + { name: "marketing_manager", label: "Marketing Manager" }, + { name: "marketing_user", label: "Marketing User" }, + // Territory groupings referenced by the account sharing rules. + { name: "na_sales_team", label: "NA Sales Team" }, + { name: "eu_sales_team", label: "EU Sales Team" } +]; + +// src/marketing/sharing/campaign.sharing.ts +import { P as P45 } from "@objectstack/spec"; +var CampaignLeadershipSharingRules = [ + { + name: "campaign_leadership_manager", + label: "Live Campaigns \u2014 Marketing Manager", + object: "crm_campaign", + type: "criteria", + condition: P45`record.status in ["planning", "in_progress"] && record.is_active == true`, + accessLevel: "edit", + sharedWith: { type: "position", value: "marketing_manager" } + }, + { + name: "campaign_leadership_director", + label: "Live Campaigns \u2014 Marketing Director", + object: "crm_campaign", + type: "criteria", + condition: P45`record.status in ["planning", "in_progress"] && record.is_active == true`, + accessLevel: "edit", + sharedWith: { type: "position", value: "marketing_director" } + } +]; + +// src/sales/data/sales.seed.ts +import { defineSeed } from "@objectstack/spec/data"; +import { cel as cel31 } from "@objectstack/spec"; + +// src/sales/data/_shared.ts +import { cel as cel30 } from "@objectstack/spec"; +var celDaysAgo = (n) => cel30`daysAgo(${n})`; +var lineTotal = (l) => Math.round(l.quantity * l.unit_price * (1 - (l.discount ?? 0) / 100) * 100) / 100; +var linesTotal = (lines) => Math.round(lines.reduce((sum, l) => sum + lineTotal(l), 0) * 100) / 100; + +// src/sales/data/sales.seed.ts +var accounts = defineSeed(Account, { + mode: "upsert", + externalId: "name", + records: [ + { + name: "Acme Corporation", + approval_status: "approved", + type: "customer", + industry: "technology", + annual_revenue: 5e6, + number_of_employees: 250, + phone: "+1-415-555-0100", + billing_address: { street: "500 Howard Street, Suite 400", city: "San Francisco", state: "CA", postalCode: "94105", country: "US" }, + website: "https://acme.example.com", + tier: "enterprise", + segment: "growth", + health_score: "healthy", + // Held: workshop, demo, calls and an onsite visit — see `service.seed.ts`. + last_activity_date: cel31`today()`, + // The ARR line below used to read "signed Q1 2025 renewal" while the + // deal it describes closes `daysAgo(15)` — a fixed calendar quarter on a + // relative-date record, wrong in both the quarter and the year (#1692). + // The label is not re-derived here either: that date belongs to + // `Acme Annual Renewal 2025` (`close_date`) and to its contract + // (`signed_date`, `revenue.seed.ts`), and computing a copy in this module + // means re-stating that record's own offset — a second source of truth + // for a value two records already own. Same ruling as the `next_step` + // block below (#1660): no date goes back into this prose, absolute OR + // relative. What stays true however the renewal is dated is that it IS + // signed: the deal is `closed_won` and its contract `activated`. + description: `**Strategic Customer \xB7 Enterprise Tier** + +Acme Corporation is a Series-C robotics & industrial automation +company that switched from a competitor 18 months ago. They run +HotCRM as their system of record for sales + service across +three regional teams (NA, EMEA, APAC). + +**Relationship** +- Primary economic buyer: Jordan Park (CTO) \u2014 values our open + architecture and AI roadmap. +- Day-to-day champion: John Smith (VP Engineering) \u2014 owns the + technical evaluation and integration questions. +- Procurement: handled by Lisa Kim \u2014 prefers annual contracts, + net-30 terms. + +**Current state** +- ARR: $220K (signed renewal). Up 22% YoY. +- 1 open enterprise opportunity ($150K platform upgrade) in proposal + stage, 1 service ticket open (login issues), 1 billing dispute + awaiting customer response. +- AI agent governance became a hard requirement for that upgrade + after their internal compliance review, so the workshop now on + the calendar is the gate on signature. + +**Red flags** +- Lost the $75K Marketing Cloud add-on on timing \u2014 their marketing + org is locked into a 2-year HubSpot contract, and the buying + window opens when that contract renews. +- Login issues ticket is already past its SLA clock \u2014 needs eyes + today.` + }, + { + name: "Globex Industries", + approval_status: "approved", + type: "prospect", + industry: "manufacturing", + annual_revenue: 12e6, + number_of_employees: 800, + phone: "+1-312-555-0200", + billing_address: { street: "233 South Wacker Drive", city: "Chicago", state: "IL", postalCode: "60606", country: "US" }, + website: "https://globex.example.com", + tier: "enterprise", + segment: "net_new", + // Only a booked demo and a cancelled review — neither bubbles, so this + // 8-day age survives the seed load and stays inside every churn window. + last_activity_date: cel31`daysAgo(8)` + }, + { + name: "Initech Solutions", + approval_status: "approved", + type: "customer", + industry: "finance", + annual_revenue: 35e5, + number_of_employees: 150, + phone: "+1-212-555-0300", + billing_address: { street: "1 Liberty Plaza, 23rd Floor", city: "New York", state: "NY", postalCode: "10006", country: "US" }, + website: "https://initech.example.com", + tier: "mid_market", + segment: "at_risk", + health_score: "at_risk", + // QUIET 60+ — the `at_risk` segment and health score, with a clock that + // finally agrees with them: ten weeks of silence. A no-show call 55 days + // ago was the last attempt; the re-engagement call on the calendar is + // `planned`, so it moves nothing. + last_activity_date: cel31`daysAgo(72)` + }, + { + name: "Stark Medical", + approval_status: "approved", + type: "partner", + industry: "healthcare", + annual_revenue: 8e6, + number_of_employees: 400, + // The one Canadian account: still inside north_america_territory, and the + // reason that rule's `$in` list is not a single-country list in disguise. + phone: "+1-416-555-0400", + billing_address: { street: "181 Bay Street, Suite 2200", city: "Toronto", state: "ON", postalCode: "M5J 2T3", country: "CA" }, + website: "https://starkmed.example.com", + tier: "mid_market", + segment: "stable", + // `at_risk` rather than `churning`, and the distinction is the reason + // this row can exist at all: a partner whose pilot was WON and whose + // expansion then died on a capital freeze can be at risk, but it was + // never a subscription that could churn. The records say it — `Stark + // Expansion (Lost)` closed `no_budget` 60 days ago and the partnership + // contract is still in legal review — and the panel's criterion admits + // both values, so the honest severity is also the one that flags. + // + // Diverging from `segment: 'stable'` is deliberate, the same split + // Wayne demonstrates below: `segment` is how the book classifies the + // account, `health_score` is what a person asserts about it. The clock + // stays at today(), so like Wayne this row is outside every windowed + // panel on that report: it reaches `csm_flagged_accounts` and no other + // block. + health_score: "at_risk", + // The completed 'Send welcome package' task bubbles here on every seed + // load, so this has ALWAYS resolved to today — the previous `daysAgo(5)` + // was authored and then overwritten before anyone could read it. + last_activity_date: cel31`today()` + }, + { + name: "Wayne Enterprises", + approval_status: "approved", + type: "customer", + industry: "technology", + annual_revenue: 25e6, + number_of_employees: 2e3, + phone: "+1-650-555-0500", + billing_address: { street: "3000 Hanover Street", city: "Palo Alto", state: "CA", postalCode: "94304", country: "US" }, + website: "https://wayne.example.com", + tier: "strategic", + segment: "growth", + // CHURNING, with the clock still running — the population + // `csm_flagged_accounts` exists for (#1414). Every DERIVED signal on + // this row reads healthy: an operations rollout closed four days ago, a + // licence sits at 80% two weeks from signature, three meetings were held + // this month. The CSM who has been in the room says the account is going + // anyway, and `health_score` is the only churn signal in the model a + // person ASSERTS — which is why the panel that reads it is first on the + // report and carries no time window. + // + // ⛔ Do not "correct" this to `at_risk` to agree with the pipeline, and + // ⛔ do not stop the clock to agree with the health score: either edit + // folds the row back into `at_risk_accounts` (60-day window) and the + // flagged panel goes back to restating its neighbour. + health_score: "churning", + // Held: negotiation meeting, security-addendum call, governance webinar. + last_activity_date: cel31`today()` + }, + { + name: "Northwind Energy", + approval_status: "approved", + type: "prospect", + industry: "energy", + annual_revenue: 18e6, + number_of_employees: 1100, + // europe_territory, half 1: DE. + phone: "+49-89-5550-0600", + billing_address: { street: "Leopoldstrasse 21", city: "Munich", state: "BY", postalCode: "80802", country: "DE" }, + website: "https://northwind.example.com", + tier: "enterprise", + segment: "net_new", + // QUIET 30+ — the field-service pilot was lost 80 days ago and the grid + // program has not been worked since. The discovery workshop is booked, + // not held. + last_activity_date: cel31`daysAgo(41)`, + description: "A regional energy provider evaluating a unified operations and customer-data platform." + }, + { + name: "Vertex Analytics", + approval_status: "approved", + type: "customer", + industry: "software", + annual_revenue: 95e5, + number_of_employees: 420, + phone: "+1-512-555-0700", + billing_address: { street: "600 Congress Avenue, Floor 14", city: "Austin", state: "TX", postalCode: "78701", country: "US" }, + website: "https://vertex.example.com", + tier: "enterprise", + segment: "growth", + health_score: "healthy", + // Held: rollout meeting, analytics demo, committee call, retrospective. + last_activity_date: cel31`today()`, + description: "An analytics SaaS customer expanding usage from the data team to its revenue organization." + }, + { + name: "Lattice Education", + approval_status: "approved", + type: "customer", + industry: "education", + annual_revenue: 68e5, + number_of_employees: 320, + // europe_territory, half 2 — and the alias fixture. `UK` is not ISO + // 3166-1 alpha-2 (`GB` is); it is an ACCEPTED SPELLING in + // `src/sales/objects/_territory.ts`, so this row proves on stock data that a + // legacy spelling still lands in `emea` (#639). No `state`: an address + // without a subdivision is a normal shape, and only `country` is read. + phone: "+44-20-7946-0800", + billing_address: { street: "20 Fenchurch Street", city: "London", postalCode: "EC3M 3BY", country: "UK" }, + website: "https://lattice.example.com", + tier: "mid_market", + segment: "stable", + health_score: "healthy", + // Signed the analytics expansion six days ago; the renewal review is + // booked, not held, so nothing bubbles and this age stands. + last_activity_date: cel31`daysAgo(6)`, + description: "A higher-education technology company consolidating admissions, student-success and alumni workflows." + }, + { + name: "Apex Logistics", + approval_status: "approved", + type: "prospect", + industry: "logistics", + annual_revenue: 22e6, + number_of_employees: 1400, + // `territory == "other"` on purpose: without a record that matches + // neither rule, "the rules partition the accounts" is unfalsifiable — + // a match-all regression would look identical to a working one. `SG` is + // a real country the staffed territories do not cover, which is exactly + // what `other` is for (#639) — it is a stated classification here, not a + // blank. + phone: "+65-6555-0900", + billing_address: { street: "10 Marina Boulevard, #30-01", city: "Singapore", postalCode: "018983", country: "SG" }, + website: "https://apexlogistics.example.com", + tier: "enterprise", + segment: "net_new", + // QUIET 90+ — a lost compliance deal 110 days ago and a data-hub + // evaluation that has been silent for a quarter. Only a booked + // re-engagement call. + last_activity_date: cel31`daysAgo(104)`, + description: "A fast-growing logistics provider assessing a modern data hub for its operations and commercial teams." + } + ] +}); +var contacts = defineSeed(Contact, { + mode: "upsert", + externalId: "email", + records: [ + { + salutation: "mr", + first_name: "John", + last_name: "Smith", + email: "john.smith@acme.example.com", + phone: "+1-415-555-0101", + title: "VP of Engineering", + department: "engineering", + crm_account: "Acme Corporation", + is_primary: true + }, + { + salutation: "ms", + first_name: "Sarah", + last_name: "Johnson", + email: "sarah.j@globex.example.com", + phone: "+1-312-555-0201", + title: "Chief Procurement Officer", + department: "executive", + crm_account: "Globex Industries", + is_primary: true + }, + { + salutation: "dr", + first_name: "Michael", + last_name: "Chen", + email: "mchen@initech.example.com", + phone: "+1-212-555-0301", + title: "Director of Operations", + department: "operations", + crm_account: "Initech Solutions", + is_primary: true + }, + { + salutation: "ms", + first_name: "Emily", + last_name: "Davis", + email: "emily.d@starkmed.example.com", + phone: "+1-617-555-0401", + title: "Head of Partnerships", + department: "sales", + crm_account: "Stark Medical", + is_primary: true + }, + { + salutation: "mr", + first_name: "Robert", + last_name: "Wilson", + email: "rwilson@wayne.example.com", + phone: "+1-650-555-0501", + title: "CTO", + department: "engineering", + crm_account: "Wayne Enterprises", + is_primary: true + }, + { + salutation: "ms", + first_name: "Olivia", + last_name: "Chen", + email: "olivia.chen@northwind.example.com", + phone: "+1-303-555-0601", + title: "VP of Digital Operations", + department: "operations", + crm_account: "Northwind Energy", + is_primary: true + }, + { + salutation: "mr", + first_name: "Ethan", + last_name: "Brooks", + email: "ethan.brooks@vertex.example.com", + phone: "+1-512-555-0701", + title: "Chief Revenue Officer", + department: "executive", + crm_account: "Vertex Analytics", + is_primary: true + }, + { + salutation: "ms", + first_name: "Priya", + last_name: "Shah", + email: "priya.shah@lattice.example.com", + phone: "+1-617-555-0801", + title: "VP of Student Success", + department: "operations", + crm_account: "Lattice Education", + is_primary: true + }, + { + salutation: "mr", + first_name: "Marcus", + last_name: "Reed", + email: "marcus.reed@apexlogistics.example.com", + phone: "+1-404-555-0901", + title: "Director of Commercial Systems", + department: "operations", + crm_account: "Apex Logistics", + is_primary: true + } + ] +}); +var DISQUALIFICATION_REASONS = [ + { reason: "no_budget", note: "No budget approved for this fiscal year \u2014 revisit next planning cycle." }, + { reason: "not_a_fit", note: "Requirements sit outside what the product covers today." }, + { reason: "wrong_persona", note: "Contact has no say in the buying decision and no path to an owner." }, + { reason: "unreachable", note: "Six touches across email and phone over four weeks, no response." } +]; +var leads = defineSeed(Lead, { + mode: "upsert", + externalId: "email", + records: [ + { + first_name: "Alice", + last_name: "Martinez", + company: "NextGen Retail", + email: "alice@nextgenretail.example.com", + phone: "+1-503-555-0600", + status: "new", + lead_source: "web", + industry: "retail", + rating: 3, + next_followup_date: cel31`daysFromNow(2)` + }, + { + first_name: "David", + last_name: "Kim", + company: "EduTech Labs", + email: "dkim@edutechlabs.example.com", + phone: "+1-408-555-0700", + status: "contacted", + lead_source: "referral", + industry: "education", + rating: 4, + next_followup_date: cel31`daysFromNow(1)`, + // A seeded `held` event names this lead, and `event_activity_bubble` + // stamps `last_contacted_date` with the SEED MOMENT rather than the + // event's own timestamp — so an authored age here would be overwritten + // the instant it was written (doctrine rule 2 in `./_shared.ts`). Day + // granularity is the honest match: the seed writes today's UTC midnight, + // the bubble writes today's instant, and both render as "today". + last_contacted_date: cel31`today()` + }, + { + first_name: "Lisa", + last_name: "Thompson", + company: "CloudFirst Inc", + email: "lisa.t@cloudfirst.example.com", + phone: "+1-206-555-0800", + status: "qualified", + lead_source: "event", + industry: "technology", + // WHOLE stars only. `lead.hook.ts` rounds its computed score to an + // integer because "half values rendered inconsistently in the star + // widget", and the hook leaves an explicitly seeded number alone — so a + // seeded 4.5 was the one rating in the system the contract could never + // produce, and it rendered as the broken half-star it was meant to + // prevent (#591). + rating: 5, + next_followup_date: cel31`daysFromNow(0)`, + // Same as David Kim above: a `held` qualification call names this lead. + last_contacted_date: cel31`today()` + }, + // ─── Generated demo leads — spread across 6 months for monthly-bucket reports + // (`LeadInflowByMonthSourceReport`). Each `last_contacted_date` lives in a + // distinct month / source pair so the matrix has multiple cells populated. + ...[ + { fn: "Noah", ln: "Patel", co: "Vertex Analytics", src: "web", ind: "technology", age: 7 }, + { fn: "Maya", ln: "Singh", co: "BluePeak Logistics", src: "referral", ind: "logistics", age: 14 }, + { fn: "Owen", ln: "Becker", co: "Northwind Energy", src: "event", ind: "energy", age: 21 }, + { fn: "Sara", ln: "Lopez", co: "Helios Solar", src: "partner", ind: "energy", age: 28 }, + { fn: "Leo", ln: "Vance", co: "CleanCart", src: "web", ind: "retail", age: 38 }, + { fn: "Iris", ln: "Okafor", co: "PulseHealth", src: "cold_call", ind: "healthcare", age: 45 }, + { fn: "Ravi", ln: "Mehta", co: "Foundry Robotics", src: "event", ind: "manufacturing", age: 52 }, + { fn: "Tess", ln: "Brown", co: "Lattice Education", src: "referral", ind: "education", age: 67 }, + { fn: "Marco", ln: "Ricci", co: "Aurora Travel", src: "advertisement", ind: "hospitality", age: 74 }, + { fn: "Pia", ln: "Anand", co: "Citrine Finance", src: "partner", ind: "finance", age: 81 }, + { fn: "Jonas", ln: "Holt", co: "Polar Cargo", src: "web", ind: "logistics", age: 95 }, + { fn: "Anya", ln: "Volkov", co: "RedOak Realty", src: "cold_call", ind: "real_estate", age: 102 }, + { fn: "Theo", ln: "Park", co: "Skyline Media", src: "advertisement", ind: "media", age: 116 }, + { fn: "Wren", ln: "Garcia", co: "Maple Bakery Group", src: "event", ind: "retail", age: 123 }, + { fn: "Hugo", ln: "Dubois", co: "Nimbus Aerospace", src: "referral", ind: "manufacturing", age: 138 }, + { fn: "Lena", ln: "Fischer", co: "Granite Insurance", src: "partner", ind: "finance", age: 145 }, + { fn: "Kai", ln: "Watanabe", co: "Coral Reef Hotels", src: "web", ind: "hospitality", age: 162 }, + { fn: "Mira", ln: "Costa", co: "Atlas Construction", src: "cold_call", ind: "other", age: 175 } + ].map((l, i) => { + const domain = `${l.co.toLowerCase().replace(/\s+/g, "")}.example.com`; + const status = ["new", "contacted", "qualified", "unqualified"][i % 4]; + return { + first_name: l.fn, + last_name: l.ln, + company: l.co, + email: `${l.fn.toLowerCase()}.${l.ln.toLowerCase()}@${domain}`, + phone: `+1-555-01${String(i).padStart(2, "0")}-${String(1e3 + i * 7)}`, + status, + lead_source: l.src, + industry: l.ind, + rating: 1 + i * 7 % 5, + last_contacted_date: celDaysAgo(l.age), + // The qualification fields were left blank on every generated lead, so + // the detail page's Contact / Lead Detail / Description sections had + // nothing to render (they also drop whatever the highlights strip + // already shows, so all four collapsed to nothing) and the demo read + // like a half-finished import. + title: ["VP Operations", "Head of IT", "Director of Sales", "COO", "Procurement Lead"][i % 5], + mobile: `+1-555-02${String(i).padStart(2, "0")}-${String(2e3 + i * 3)}`, + website: `https://${domain}`, + annual_revenue: 2e6 + i * 37e5 % 9e7, + number_of_employees: 25 + i * 137 % 4800, + description: `Inbound via ${l.src.replace(/_/g, " ")}. Evaluating a CRM to replace spreadsheets across their ${l.ind.replace(/_/g, " ")} operation.`, + ...status === "unqualified" ? { + disqualification_reason: DISQUALIFICATION_REASONS[(i >> 2) % DISQUALIFICATION_REASONS.length].reason, + notes: DISQUALIFICATION_REASONS[(i >> 2) % DISQUALIFICATION_REASONS.length].note + } : {} + }; + }) + ] +}); +var OPPORTUNITY_LINES = { + "Acme Platform Upgrade": [ + { product: "ObjectStack Platform", quantity: 2, unit_price: 5e4, discount: 10, description: "Enterprise edition \u2014 NA + EMEA production tenants (multi-year discount)." }, + { product: "Premium Support", quantity: 1, unit_price: 25e3, description: "24\xD77 premium support with a named TAM." }, + { product: "AI Agent Seat (Annual)", quantity: 35, unit_price: 1e3, description: "Agent seats for the Ops organization." } + ], + "Globex Manufacturing Suite": [ + { product: "ObjectStack Platform", quantity: 1, unit_price: 5e4, description: "Enterprise edition \u2014 one shared tenant serving all six manufacturing sites." }, + { product: "Admin Training Workshop", quantity: 4, unit_price: 6e3, description: "Four workshop days, one per regional plant cluster." }, + { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Business-hours support for the first year." }, + { product: "AI Agent Seat (Annual)", quantity: 12, unit_price: 1e3, description: "Agent seats for the plant operations leads." } + ], + "Wayne Enterprise License": [ + { product: "ObjectStack Platform", quantity: 20, unit_price: 5e4, discount: 15, description: "Enterprise-wide license, volume discount at 20 tenants." }, + { product: "Premium Support", quantity: 4, unit_price: 25e3, description: "Premium support across four business units." }, + { product: "AI Agent Seat (Annual)", quantity: 250, unit_price: 1e3, description: "Agent seats for the global revenue organization." } + ], + "Initech Cloud Migration": [ + { product: "Data Migration Services", quantity: 1, unit_price: 35e3, description: "Migration off the legacy on-premise CRM." }, + { product: "Cloud Hosting (Annual)", quantity: 2, unit_price: 12e3, description: "Managed hosting, primary + DR region." }, + { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Business-hours support for the first year." }, + { product: "AI Agent Seat (Annual)", quantity: 12, unit_price: 1e3, description: "Agent seats for the service desk." } + ], + "Acme Annual Renewal 2025": [ + { product: "ObjectStack Platform", quantity: 3, unit_price: 5e4, description: "Renewal of the three production tenants." }, + { product: "Premium Support", quantity: 1, unit_price: 25e3, description: "Premium support renewal." }, + { product: "AI Agent Seat (Annual)", quantity: 45, unit_price: 1e3, description: "Seat expansion driven by the new EMEA team." } + ], + "Stark Medical Pilot": [ + { product: "ObjectStack Platform", quantity: 2, unit_price: 5e4, description: "Pilot tenants for two clinical service lines." }, + { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Standard support during the pilot." }, + { product: "Admin Training Workshop", quantity: 6, unit_price: 6e3, description: "Six workshop days for the clinical operations admins." } + ], + "Wayne Q1 Expansion": [ + { product: "ObjectStack Platform", quantity: 6, unit_price: 5e4, description: "Expansion into six additional subsidiaries." }, + { product: "Premium Support", quantity: 2, unit_price: 25e3, description: "Premium support for the expanded footprint." }, + { product: "AI Agent Seat (Annual)", quantity: 30, unit_price: 1e3, description: "Agent seats for the expansion teams." } + ], + "Globex Training Package": [ + { product: "Admin Training Workshop", quantity: 10, unit_price: 6e3, description: "Ten workshop days across the plant admin community." }, + { product: "AI Agent Seat (Annual)", quantity: 5, unit_price: 1e3, description: "Agent seats for the training sandbox." } + ], + "Initech Phase 1": [ + { product: "Implementation Services", quantity: 1, unit_price: 75e3, description: "Phase 1 implementation: accounts, contacts, pipeline." }, + { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Standard support for phase 1." }, + { product: "AI Agent Seat (Annual)", quantity: 6, unit_price: 1e3, description: "Agent seats for the phase-1 pilot group." } + ], + "Acme Add-on (Lost)": [ + { product: "Analytics Add-on", quantity: 2, unit_price: 22e3, description: "Marketing analytics for two business units." }, + { product: "Integration Connector Pack", quantity: 1, unit_price: 16e3, description: "Marketing-automation connector pack." }, + { product: "Sandbox Environment (Annual)", quantity: 2, unit_price: 7500, description: "Two sandboxes for the marketing build-out." } + ], + "Stark Expansion (Lost)": [ + { product: "ObjectStack Platform", quantity: 2, unit_price: 5e4, description: "Two additional clinical tenants." }, + { product: "Field Service Mobile", quantity: 1, unit_price: 14e3, description: "Field service mobile for the device-servicing team." }, + { product: "AI Agent Seat (Annual)", quantity: 6, unit_price: 1e3, description: "Agent seats for the service coordinators." } + ], + "Globex Line Expansion (Lost)": [ + { product: "ObjectStack Platform", quantity: 2, unit_price: 5e4, description: "Two further production-line tenants." }, + { product: "Integration Connector Pack", quantity: 1, unit_price: 16e3, description: "Connector pack for the line-control systems." }, + { product: "AI Agent Seat (Annual)", quantity: 8, unit_price: 1e3, description: "Agent seats for the line supervisors." } + ], + "Northwind Field Service Pilot (Lost)": [ + { product: "Field Service Mobile", quantity: 1, unit_price: 14e3, description: "Field-service mobile for the metering crews." }, + { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Business-hours support during the pilot." }, + { product: "AI Agent Seat (Annual)", quantity: 10, unit_price: 1e3, description: "Agent seats for the dispatch desk." } + ], + "Apex Compliance Reporting (Lost)": [ + { product: "Analytics Add-on", quantity: 1, unit_price: 22e3, description: "Regulatory reporting pack for fleet compliance." }, + { product: "Sandbox Environment (Annual)", quantity: 1, unit_price: 7500, description: "Sandbox for the compliance rule build-out." }, + { product: "AI Agent Seat (Annual)", quantity: 6, unit_price: 1e3, description: "Agent seats for the compliance analysts." } + ], + "Northwind Grid Modernization": [ + { product: "ObjectStack Platform", quantity: 1, unit_price: 5e4, description: "Enterprise edition for grid, field and customer operations." }, + { product: "Field Service Mobile", quantity: 1, unit_price: 14e3, description: "Field-service mobile for the grid maintenance crews." }, + { product: "Sandbox Environment (Annual)", quantity: 1, unit_price: 7500, description: "Sandbox for the operational-data assessment." }, + { product: "AI Agent Seat (Annual)", quantity: 15, unit_price: 1e3, description: "Agent seats for the control-room pilot." } + ], + "Lattice Student Success Platform": [ + { product: "ObjectStack Platform (SMB Edition)", quantity: 2, unit_price: 18e3, description: "Student-success tenants for the two pilot colleges." }, + { product: "Admin Training Workshop", quantity: 2, unit_price: 6e3, description: "Two workshop days for the student-success advisers." }, + { product: "AI Agent Seat (Annual)", quantity: 5, unit_price: 1e3, description: "Agent seats for the advising team." } + ], + "Vertex Analytics Expansion": [ + { product: "Analytics Add-on", quantity: 2, unit_price: 22e3, description: "Analytics for the sales and marketing teams." }, + { product: "Premium Support", quantity: 1, unit_price: 25e3, description: "Premium support for the expanded footprint." }, + { product: "AI Agent Seat (Annual)", quantity: 10, unit_price: 1e3, description: "Agent seats for the revenue operations team." } + ], + "Apex Logistics Data Hub": [ + { product: "ObjectStack Platform", quantity: 1, unit_price: 5e4, description: "Data-hub tenant shared by commercial, operations and finance." }, + { product: "Data Migration Services", quantity: 1, unit_price: 35e3, description: "Consolidation of four fragmented commercial systems." }, + { product: "AI Agent Seat (Annual)", quantity: 8, unit_price: 1e3, description: "Agent seats for the commercial operations team." } + ], + "Lattice Education Renewal": [ + { product: "ObjectStack Platform", quantity: 1, unit_price: 5e4, description: "Renewal of the institution-wide tenant." }, + { product: "Analytics Add-on", quantity: 1, unit_price: 22e3, description: "Expanded analytics package for the renewal term." }, + { product: "AI Agent Seat (Annual)", quantity: 15, unit_price: 1e3, description: "Student-success automation seats." } + ], + "Vertex Enterprise Rollout": [ + { product: "ObjectStack Platform", quantity: 1, unit_price: 5e4, discount: 20, description: "Phase-one tenant for the first region, with data-residency controls (multi-phase commitment discount)." }, + { product: "Data Migration Services", quantity: 1, unit_price: 35e3, description: "Phase-one migration of the regional revenue data." }, + { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Business-hours support for phase one." }, + { product: "AI Agent Seat (Annual)", quantity: 10, unit_price: 1e3, description: "Agent seats for the first rollout wave." } + ], + // Campaign-attributed wins — see the campaign metrics note below. + "Lattice Analytics Expansion": [ + { product: "Analytics Add-on", quantity: 2, unit_price: 22e3, description: "Analytics for admissions and alumni engagement." }, + { product: "Admin Training Workshop", quantity: 1, unit_price: 6e3, description: "Analytics enablement day for the institutional-research team." }, + { product: "AI Agent Seat (Annual)", quantity: 20, unit_price: 1e3, description: "Agent seats for the admissions team." } + ], + "Wayne Operations Module Rollout": [ + { product: "ObjectStack Platform", quantity: 2, unit_price: 5e4, description: "Operations tenants for two manufacturing divisions." }, + { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Standard support for the operations rollout." }, + { product: "AI Agent Seat (Annual)", quantity: 11, unit_price: 1e3, description: "Agent seats for the operations planners." } + ], + "Vertex Developer Platform Adoption": [ + { product: "ObjectStack Platform", quantity: 3, unit_price: 5e4, description: "Developer platform tenants for three product teams." }, + { product: "Integration Connector Pack", quantity: 1, unit_price: 16e3, description: "Connector pack for the internal data warehouse." }, + { product: "Analytics Add-on", quantity: 1, unit_price: 22e3, description: "Product-usage analytics for the platform team." }, + { product: "AI Agent Seat (Annual)", quantity: 12, unit_price: 1e3, description: "Agent seats for the developer-experience team." } + ] +}; +var dealValue = (opportunityName, probability) => { + const lines = OPPORTUNITY_LINES[opportunityName]; + if (!lines) throw new Error(`Seed error: no line items authored for opportunity "${opportunityName}"`); + const amount = linesTotal(lines); + return { amount, expected_revenue: Math.round(amount * probability) / 100 }; +}; +var opportunities = defineSeed(Opportunity, { + mode: "upsert", + externalId: "name", + records: [ + { + name: "Acme Platform Upgrade", + crm_account: "Acme Corporation", + ...dealValue("Acme Platform Upgrade", 60), + stage: "proposal", + probability: 60, + close_date: cel31`daysFromNow(30)`, + type: "existing_upgrade", + forecast_category: "commit", + lead_source: "web", + stage_entry_date: celDaysAgo(12), + description: `Upgrade from Standard to Enterprise edition for the +NA + EMEA teams. Drivers: (1) AI agent governance becomes a hard +requirement after their internal compliance review, (2) advanced +analytics seats for the Ops org, (3) priority support SLA.`, + // This sentence used to DATE the workshop itself ("the week of + // close_date - 14d" => daysFromNow(16)) while the seeded event had it at + // daysFromNow(6) and a seeded task chased it at daysFromNow(7) — three + // records, three answers (#1660). The date now lives in exactly ONE + // place, the `crm_event` row in service.seed.ts, and this prose states + // only what stays true however that event is scheduled: it is booked, + // and its invitation has gone out (the attendee builder clamps + // `invited_date` at daysAgo(0), so a planned event's invite is never in + // the future). Re-dating the event therefore cannot strand this line. + // Do not put a date back here, absolute OR relative: a second copy is + // a second thing to drift. + next_step: `Send the revised proposal (Enterprise edition, 18-month term, 12% multi-year discount) to Jordan Park by EOW. The AI governance workshop with their compliance team is already booked and the invitation is out.` + }, + { + name: "Globex Manufacturing Suite", + crm_account: "Globex Industries", + ...dealValue("Globex Manufacturing Suite", 25), + stage: "qualification", + probability: 25, + close_date: cel31`daysFromNow(60)`, + type: "new_business", + forecast_category: "pipeline", + lead_source: "referral", + stage_entry_date: celDaysAgo(45) + }, + { + name: "Wayne Enterprise License", + crm_account: "Wayne Enterprises", + ...dealValue("Wayne Enterprise License", 80), + stage: "negotiation", + probability: 80, + close_date: cel31`daysFromNow(14)`, + type: "new_business", + forecast_category: "commit", + lead_source: "partner", + stage_entry_date: celDaysAgo(7) + }, + { + name: "Initech Cloud Migration", + crm_account: "Initech Solutions", + ...dealValue("Initech Cloud Migration", 40), + stage: "needs_analysis", + probability: 40, + close_date: cel31`daysFromNow(45)`, + type: "existing_upgrade", + forecast_category: "best_case", + lead_source: "event", + stage_entry_date: celDaysAgo(38) + }, + // ─── Closed Won deals (powers KPIs & revenue trends) ──────────────── + { + name: "Acme Annual Renewal 2025", + crm_account: "Acme Corporation", + ...dealValue("Acme Annual Renewal 2025", 100), + stage: "closed_won", + probability: 100, + close_date: cel31`daysAgo(15)`, + stage_entry_date: cel31`daysAgo(15)`, + type: "existing_renewal", + forecast_category: "closed", + lead_source: "partner", + win_reason: "relationship", + description: `Annual renewal of the Acme Standard subscription, signed two weeks ahead of the renewal date. 22% YoY uplift driven by seat expansion in the new EMEA team. Multi-year option declined this round \u2014 they want to see how the platform upgrade lands first.` + }, + { + name: "Stark Medical Pilot", + crm_account: "Stark Medical", + ...dealValue("Stark Medical Pilot", 100), + stage: "closed_won", + probability: 100, + close_date: cel31`daysAgo(50)`, + stage_entry_date: cel31`daysAgo(50)`, + type: "new_business", + forecast_category: "closed", + lead_source: "event", + win_reason: "best_fit" + }, + { + name: "Wayne Q1 Expansion", + crm_account: "Wayne Enterprises", + ...dealValue("Wayne Q1 Expansion", 100), + stage: "closed_won", + probability: 100, + close_date: cel31`daysAgo(95)`, + stage_entry_date: cel31`daysAgo(95)`, + type: "existing_upgrade", + forecast_category: "closed", + lead_source: "web", + win_reason: "better_product" + }, + { + name: "Globex Training Package", + crm_account: "Globex Industries", + ...dealValue("Globex Training Package", 100), + stage: "closed_won", + probability: 100, + close_date: cel31`daysAgo(140)`, + stage_entry_date: cel31`daysAgo(140)`, + type: "new_business", + forecast_category: "closed", + lead_source: "referral", + win_reason: "better_support" + }, + { + name: "Initech Phase 1", + crm_account: "Initech Solutions", + ...dealValue("Initech Phase 1", 100), + stage: "closed_won", + probability: 100, + close_date: cel31`daysAgo(200)`, + stage_entry_date: cel31`daysAgo(200)`, + type: "new_business", + forecast_category: "closed", + lead_source: "web", + win_reason: "better_price" + }, + // ─── Campaign-attributed wins ─────────────────────────────────────── + // `crm_campaign` is what `campaign_attribution_refresh` counts + // (`num_opportunities` / `num_won_opportunities` / the summed + // `actual_revenue`) — on every opportunity insert, update and delete, not + // once at completion. Before #591 not one opportunity carried it, so those + // three metrics were structurally zero and every campaign's seeded + // `actual_revenue` was a number the hook would have overwritten on the + // first attributed write. + // These three wins are what make the marketing ROI numbers below TRUE. + { + name: "Lattice Analytics Expansion", + crm_account: "Lattice Education", + primary_contact: "priya.shah@lattice.example.com", + crm_campaign: "Q3 Enterprise Email Nurture", + ...dealValue("Lattice Analytics Expansion", 100), + stage: "closed_won", + probability: 100, + close_date: cel31`daysAgo(6)`, + stage_entry_date: cel31`daysAgo(6)`, + type: "existing_expansion", + forecast_category: "closed", + lead_source: "email_campaign", + win_reason: "best_fit", + description: "Analytics package for admissions and alumni engagement, sourced from the enterprise nurture track." + }, + { + name: "Wayne Operations Module Rollout", + crm_account: "Wayne Enterprises", + primary_contact: "rwilson@wayne.example.com", + crm_campaign: "Operations Platform Launch", + ...dealValue("Wayne Operations Module Rollout", 100), + stage: "closed_won", + probability: 100, + close_date: cel31`daysAgo(4)`, + stage_entry_date: cel31`daysAgo(4)`, + type: "existing_upgrade", + forecast_category: "closed", + lead_source: "content", + description: "Operations module for two manufacturing divisions, closed off the operations-platform launch program.", + win_reason: "relationship" + }, + { + name: "Vertex Developer Platform Adoption", + crm_account: "Vertex Analytics", + primary_contact: "ethan.brooks@vertex.example.com", + crm_campaign: "Developer Content Marketing Push", + ...dealValue("Vertex Developer Platform Adoption", 100), + stage: "closed_won", + probability: 100, + close_date: cel31`daysAgo(6)`, + stage_entry_date: cel31`daysAgo(6)`, + type: "existing_expansion", + forecast_category: "closed", + lead_source: "content", + description: "Three product teams adopted the developer platform after the technical content series.", + win_reason: "better_product" + }, + // ─── Closed Lost deals (powers win-rate + loss-reason analytics) ──── + // + // Five losses across five distinct `loss_reason` values, and every one of + // them is now MANDATORY rather than decorative: `loss_reason` is + // `requiredWhen` stage is `closed_lost` (#593), so a seeded lost deal + // without one is rejected by the engine at seed time — the demo database + // cannot boot with the empty column that made the loss-reason widget + // unbuildable in the first place. + // + // Their `lead_source` values are chosen so that the sources carrying a loss + // ALSO carry a win (`web`, `referral`, `content`), plus two sources that + // only ever lost (`cold_call`, `advertisement`). That is what makes + // `win_rate_by_lead_source` a real measurement instead of a column of + // 100%s: three rows where both halves of the ratio move, and two rows that + // show what an all-loss source looks like. + { + name: "Acme Add-on (Lost)", + crm_account: "Acme Corporation", + ...dealValue("Acme Add-on (Lost)", 0), + stage: "closed_lost", + probability: 0, + close_date: cel31`daysAgo(25)`, + stage_entry_date: cel31`daysAgo(25)`, + type: "existing_upgrade", + forecast_category: "omitted", + lead_source: "cold_call", + loss_reason: "timing", + loss_details: "Marketing is locked into a 2-year HubSpot contract; the buying window opens when that renews.", + // This line used to end "Revisit in Q3" — a hand-typed calendar quarter + // on a record whose `close_date` is `daysAgo(25)`, so the quarter it told + // a rep to wait for is the one the deal was already lost in, and it + // contradicted this record's own `loss_details`: a 2-year lock does not + // reopen inside the quarter the deal closed in (#1712). Same ruling as + // the `next_step` block above (#1660): no date goes back into this prose, + // absolute OR relative. The renewal is the anchor that stays true however + // this record is dated — which is how `loss_details` and the account + // description already state it. + description: `Tried to bolt on the Marketing Cloud module via cold outbound. Lost because Acme's marketing org is already on a 2-year HubSpot contract. Revisit when that contract comes up for renewal \u2014 that is when the buying window opens.` + }, + { + name: "Stark Expansion (Lost)", + crm_account: "Stark Medical", + ...dealValue("Stark Expansion (Lost)", 0), + stage: "closed_lost", + probability: 0, + close_date: cel31`daysAgo(60)`, + stage_entry_date: cel31`daysAgo(60)`, + type: "new_business", + forecast_category: "omitted", + lead_source: "advertisement", + loss_reason: "no_budget", + loss_details: "Capital freeze on non-clinical systems for the rest of the fiscal year." + }, + { + name: "Globex Line Expansion (Lost)", + crm_account: "Globex Industries", + ...dealValue("Globex Line Expansion (Lost)", 0), + stage: "closed_lost", + probability: 0, + close_date: cel31`daysAgo(35)`, + stage_entry_date: cel31`daysAgo(35)`, + type: "existing_expansion", + forecast_category: "omitted", + lead_source: "referral", + loss_reason: "competitor", + loss_details: "Incumbent MES vendor bundled the two additional lines into an existing master agreement.", + description: "Expansion into two further production lines, lost to the incumbent MES vendor on bundling." + }, + { + name: "Northwind Field Service Pilot (Lost)", + crm_account: "Northwind Energy", + ...dealValue("Northwind Field Service Pilot (Lost)", 0), + stage: "closed_lost", + probability: 0, + close_date: cel31`daysAgo(80)`, + stage_entry_date: cel31`daysAgo(80)`, + type: "new_business", + forecast_category: "omitted", + lead_source: "web", + loss_reason: "price", + loss_details: "Per-technician pricing landed ~30% above the budget the operations director had approved.", + description: "Field-service pilot for the metering crews, lost on price against a cheaper point solution." + }, + { + name: "Apex Compliance Reporting (Lost)", + crm_account: "Apex Logistics", + ...dealValue("Apex Compliance Reporting (Lost)", 0), + stage: "closed_lost", + probability: 0, + close_date: cel31`daysAgo(110)`, + stage_entry_date: cel31`daysAgo(110)`, + type: "new_business", + forecast_category: "omitted", + lead_source: "content", + loss_reason: "features", + loss_details: "No native hours-of-service audit trail; the compliance team could not sign off without it.", + description: "Regulatory reporting pack for the fleet compliance team, lost on a missing audit-trail capability." + }, + // ─── Curated active pipeline ───────────────────────────────────── + // Two cards in each active stage make the kanban immediately legible in + // a customer demo. They also tell a coherent sales story instead of + // overwhelming the board with anonymous generated rows. + // + // PRICED TO STAY DRAGGABLE (#1902). A deal at or above + // `LARGE_DEAL_AMOUNT` is born into `opportunity_approval_on_create`, whose + // approval nodes hold the record with `lockRecord: true` — on the board + // that card refuses every drag with `RECORD_LOCKED`. When nine of the ten + // open deals sat over the line, the one board a demo opens first was + // frozen. So exactly TWO open deals exhibit the approval flow, one per + // tier, and both are in the block above: `Acme Platform Upgrade` + // (manager review only, $100K–$500K) and `Wayne Enterprise License` + // (manager, then director sign-off, over `HIGH_VALUE_DEAL_AMOUNT`). Every + // deal in this block is priced under the line, so each active stage keeps + // at least one card that moves. `test/seed-consistency.test.ts` pins the + // two by name — re-pricing a deal here over $100K goes red there. + { + name: "Northwind Grid Modernization", + crm_account: "Northwind Energy", + primary_contact: "olivia.chen@northwind.example.com", + ...dealValue("Northwind Grid Modernization", 10), + stage: "prospecting", + probability: 10, + close_date: cel31`daysFromNow(72)`, + type: "new_business", + forecast_category: "pipeline", + lead_source: "webinar", + stage_entry_date: celDaysAgo(4), + description: "Northwind is assessing a unified grid-modernization program after an executive webinar.", + next_step: "Confirm discovery participants and agree the operational-data assessment scope." + }, + { + name: "Lattice Student Success Platform", + crm_account: "Lattice Education", + primary_contact: "priya.shah@lattice.example.com", + crm_campaign: "Developer Content Marketing Push", + ...dealValue("Lattice Student Success Platform", 10), + stage: "prospecting", + probability: 10, + close_date: cel31`daysFromNow(96)`, + type: "new_business", + forecast_category: "pipeline", + lead_source: "content", + stage_entry_date: celDaysAgo(11), + description: "A new student-success initiative sourced from the higher-education content series.", + next_step: "Invite the operations sponsor to the discovery workshop." + }, + { + name: "Vertex Analytics Expansion", + crm_account: "Vertex Analytics", + primary_contact: "ethan.brooks@vertex.example.com", + ...dealValue("Vertex Analytics Expansion", 25), + stage: "qualification", + probability: 25, + close_date: cel31`daysFromNow(52)`, + type: "existing_expansion", + forecast_category: "pipeline", + lead_source: "partner", + stage_entry_date: celDaysAgo(8), + description: "Vertex wants to extend the platform from its data team to the full revenue organization.", + next_step: "Validate the buying committee, budget owner and expansion timeline." + }, + { + name: "Apex Logistics Data Hub", + crm_account: "Apex Logistics", + primary_contact: "marcus.reed@apexlogistics.example.com", + ...dealValue("Apex Logistics Data Hub", 40), + stage: "needs_analysis", + probability: 40, + close_date: cel31`daysFromNow(38)`, + type: "new_business", + forecast_category: "best_case", + lead_source: "partner", + stage_entry_date: celDaysAgo(18), + description: "Apex is mapping its fragmented commercial systems before committing to a data-hub program.", + next_step: "Complete the architecture workshop and quantify the integration backlog." + }, + { + name: "Lattice Education Renewal", + crm_account: "Lattice Education", + primary_contact: "priya.shah@lattice.example.com", + crm_campaign: "Q3 Enterprise Email Nurture", + ...dealValue("Lattice Education Renewal", 60), + stage: "proposal", + probability: 60, + close_date: cel31`daysFromNow(24)`, + type: "existing_renewal", + forecast_category: "commit", + lead_source: "email_campaign", + stage_entry_date: celDaysAgo(6), + description: "Renewal proposal adds student-success automation and an expanded analytics package.", + next_step: "Review the two-year option with procurement before the executive sponsor meeting." + }, + { + name: "Vertex Enterprise Rollout", + crm_account: "Vertex Analytics", + primary_contact: "ethan.brooks@vertex.example.com", + ...dealValue("Vertex Enterprise Rollout", 80), + stage: "negotiation", + probability: 80, + close_date: cel31`daysFromNow(11)`, + type: "existing_expansion", + forecast_category: "commit", + lead_source: "referral", + stage_entry_date: celDaysAgo(3), + description: "Phase one of an enterprise rollout, negotiated around phased deployment and data-residency requirements.", + next_step: "Resolve the final security addendum and confirm the procurement signature date." + } + ] +}); + +// src/sales/data/activity.seed.ts +import { defineSeed as defineSeed2 } from "@objectstack/spec/data"; +import { cel as cel32 } from "@objectstack/spec"; +var tasks = defineSeed2(Task, { + mode: "upsert", + externalId: "subject", + records: [ + { + subject: "Follow up with Acme on proposal", + description: "Send Jordan Park the revised Enterprise proposal and a 30-min calendar slot to walk through the AI governance section.", + status: "not_started", + priority: "high", + priority_rank: 3, + due_date: cel32`daysFromNow(2)`, + related_to_type: "crm_opportunity", + related_to_account: "Acme Corporation", + related_to_opportunity: "Acme Platform Upgrade" + }, + { + // The workshop this task asks someone to book is ALREADY on the + // calendar: the `Acme — AI agent governance workshop` event lower in + // this file is `planned` at daysFromNow(6), and the attendee builder + // dates its invitation `daysAgo(max(-6 + invitedDaysBefore(9), 0))` = + // daysAgo(3) — already sent, and already answered `tentative`. So the + // booking task is DONE, and it was done the day the invitation went + // out. An open "schedule it" task beside a booked-and-invited meeting + // is the contradiction itself, not a due date to nudge (#1660). + // + // The EVENT owns the workshop's date. Nothing here restates it — both + // dates below derive from the invitation instant — so there is no + // second copy to drift out of step. + subject: "Acme \u2014 schedule AI governance workshop", + description: "Block a 90-min joint workshop with Acme\u2019s compliance team to walk through how HotCRM agents handle data scoping, RBAC, audit trails, and human-in-the-loop. Pre-read: ADR-0007 + the governance demo deck.", + status: "completed", + priority: "high", + priority_rank: 3, + due_date: cel32`daysAgo(3)`, + completed_date: cel32`daysAgo(3)`, + // Hooks don't run over seeds — mirror what task_completion would stamp. + is_completed: true, + progress_percent: 100, + related_to_type: "crm_opportunity", + related_to_account: "Acme Corporation", + related_to_opportunity: "Acme Platform Upgrade" + }, + { + subject: "Acme \u2014 close out login-issues ticket before SLA", + description: "Confirm engineering has the EMEA SSO clock-skew patch ready, deploy to Acme\u2019s tenant, and send Lisa Kim a customer-facing post-mortem.", + status: "in_progress", + priority: "urgent", + priority_rank: 4, + due_date: cel32`daysFromNow(1)`, + related_to_type: "crm_case", + related_to_account: "Acme Corporation", + related_to_case: "Login issues after platform upgrade" + }, + { + subject: "Schedule demo for Globex team", + status: "in_progress", + priority: "normal", + priority_rank: 2, + due_date: cel32`daysFromNow(5)`, + related_to_type: "crm_account", + related_to_account: "Globex Industries" + }, + { + subject: "Prepare contract for Wayne Enterprises", + status: "not_started", + priority: "urgent", + priority_rank: 4, + due_date: cel32`daysFromNow(1)`, + related_to_type: "crm_account", + related_to_account: "Wayne Enterprises" + }, + { + subject: "Send welcome package to Stark Medical", + status: "completed", + priority: "low", + priority_rank: 1, + completed_date: cel32`daysAgo(2)`, + // Hooks don't run over seeds — mirror what task_completion would stamp. + is_completed: true, + progress_percent: 100, + related_to_type: "crm_account", + related_to_account: "Stark Medical" + }, + { + // Internal housekeeping task — deliberately unparented (the + // related_to_required rule is a warning, not an error). + subject: "Update CRM pipeline report", + status: "not_started", + priority: "normal", + priority_rank: 2, + due_date: cel32`daysFromNow(7)` + } + ] +}); +var EVENT_RELATED_FIELD = { + crm_account: "related_to_account", + crm_contact: "related_to_contact", + crm_opportunity: "related_to_opportunity", + crm_lead: "related_to_lead", + crm_case: "related_to_case" +}; +var celClock = (daysAgo, hour, minute) => { + const clock = `${hour}h${minute}m`; + return daysAgo >= 0 ? cel32`daysAgo(${daysAgo}) + duration(${clock})` : cel32`daysFromNow(${-daysAgo}) + duration(${clock})`; +}; +var EVENT_SPECS = [ + // ─── Acme Corporation — the hero account, worked across every parent ──── + { + subject: "Acme \u2014 Enterprise edition walkthrough", + type: "demo", + status: "held", + daysAgo: 2, + at: [10, 0], + minutes: 60, + relatedType: "crm_opportunity", + relatedKey: "Acme Platform Upgrade", + account: "Acme Corporation", + location: "Zoom", + outcome: "Walked the Ops team through agent governance and the analytics seats. Revised proposal to follow this week.", + attendees: [{ contact: "john.smith@acme.example.com", response: "accepted" }] + }, + { + subject: "Acme \u2014 proposal follow-up call", + type: "call", + status: "held", + daysAgo: 5, + at: [15, 30], + minutes: 25, + relatedType: "crm_contact", + relatedKey: "john.smith@acme.example.com", + account: "Acme Corporation", + outcome: "Procurement wants an 18-month term. Pricing to be re-cut before the governance workshop.", + attendees: [{ contact: "john.smith@acme.example.com", response: "accepted" }] + }, + { + subject: "Acme \u2014 AI governance scoping session", + type: "meeting", + status: "held", + daysAgo: 12, + at: [9, 0], + minutes: 90, + relatedType: "crm_account", + relatedKey: "Acme Corporation", + location: "Google Meet", + outcome: "Agreed the workshop agenda: data scoping, RBAC, audit trails, human-in-the-loop.", + attendees: [{ contact: "john.smith@acme.example.com", response: "accepted" }] + }, + { + subject: "Acme \u2014 login incident status call", + type: "call", + status: "held", + daysAgo: 16, + at: [8, 30], + minutes: 20, + relatedType: "crm_case", + relatedKey: "Login issues after platform upgrade", + account: "Acme Corporation", + outcome: "Confirmed the EMEA SSO clock-skew hypothesis; engineering reproducing in staging.", + attendees: [{ contact: "john.smith@acme.example.com", response: "accepted" }] + }, + { + subject: "Acme \u2014 renewal signature review", + type: "meeting", + status: "held", + daysAgo: 20, + at: [14, 0], + minutes: 45, + relatedType: "crm_opportunity", + relatedKey: "Acme Annual Renewal 2025", + account: "Acme Corporation", + outcome: "Signed two weeks ahead of the renewal date. Multi-year deferred to the upgrade decision.", + attendees: [{ contact: "john.smith@acme.example.com", response: "accepted" }] + }, + { + subject: "Acme \u2014 San Francisco HQ business review", + type: "onsite_visit", + status: "held", + daysAgo: 33, + at: [13, 0], + minutes: 120, + relatedType: "crm_account", + relatedKey: "Acme Corporation", + location: "500 Howard Street, Suite 400, San Francisco", + outcome: "Quarterly review with the CTO org. Expansion into the EMEA team confirmed as the next motion.", + attendees: [{ contact: "john.smith@acme.example.com", response: "accepted" }] + }, + // ─── Wayne Enterprises — a deal in negotiation ────────────────────────── + { + subject: "Wayne \u2014 enterprise license negotiation", + type: "meeting", + status: "held", + daysAgo: 3, + at: [16, 0], + minutes: 60, + relatedType: "crm_opportunity", + relatedKey: "Wayne Enterprise License", + account: "Wayne Enterprises", + location: "Zoom", + outcome: "Volume tier agreed at 20 tenants. Security addendum is the last open item.", + attendees: [{ contact: "rwilson@wayne.example.com", response: "accepted" }] + }, + { + subject: "Wayne \u2014 security addendum walkthrough", + type: "call", + status: "held", + daysAgo: 8, + at: [11, 0], + minutes: 30, + relatedType: "crm_contact", + relatedKey: "rwilson@wayne.example.com", + account: "Wayne Enterprises", + outcome: "Legal to return redlines within the week.", + attendees: [{ contact: "rwilson@wayne.example.com", response: "accepted" }] + }, + { + subject: "Wayne \u2014 platform governance webinar", + type: "webinar", + status: "held", + daysAgo: 26, + at: [15, 0], + minutes: 60, + relatedType: "crm_account", + relatedKey: "Wayne Enterprises", + location: "https://acme.example.com/webinars/governance", + outcome: "Four business units attended; two asked for their own rollout plan.", + attendees: [{ contact: "rwilson@wayne.example.com", response: "accepted" }] + }, + { + subject: "Wayne \u2014 bulk import rollout check-in", + type: "call", + status: "held", + daysAgo: 45, + at: [10, 30], + minutes: 25, + relatedType: "crm_case", + relatedKey: "Request: bulk import via CSV", + account: "Wayne Enterprises", + outcome: "CSV import shipped and documented; the customer closed the request out on the call.", + attendees: [{ contact: "rwilson@wayne.example.com", response: "accepted" }] + }, + // ─── Vertex Analytics — expansion, then an enterprise rollout ─────────── + { + subject: "Vertex \u2014 rollout phasing and data residency", + type: "meeting", + status: "held", + daysAgo: 1, + at: [9, 30], + minutes: 75, + relatedType: "crm_opportunity", + relatedKey: "Vertex Enterprise Rollout", + account: "Vertex Analytics", + location: "Zoom", + outcome: "Phase 1 scoped to four regions. Residency controls to be confirmed with their security team.", + attendees: [{ contact: "ethan.brooks@vertex.example.com", response: "accepted" }] + }, + { + subject: "Vertex \u2014 revenue analytics demo", + type: "demo", + status: "held", + daysAgo: 10, + at: [14, 30], + minutes: 45, + relatedType: "crm_opportunity", + relatedKey: "Vertex Analytics Expansion", + account: "Vertex Analytics", + location: "Zoom", + outcome: "Sales, marketing and service leads all asked for their own workspace \u2014 the expansion case makes itself.", + attendees: [{ contact: "ethan.brooks@vertex.example.com", response: "accepted" }] + }, + { + subject: "Vertex \u2014 expansion buying committee call", + type: "call", + status: "held", + daysAgo: 19, + at: [16, 30], + minutes: 30, + relatedType: "crm_contact", + relatedKey: "ethan.brooks@vertex.example.com", + account: "Vertex Analytics", + outcome: "CRO owns the budget; the data team stays the technical sponsor.", + attendees: [{ contact: "ethan.brooks@vertex.example.com", response: "accepted" }] + }, + { + subject: "Vertex \u2014 developer platform retrospective", + type: "meeting", + status: "held", + daysAgo: 38, + at: [11, 0], + minutes: 60, + relatedType: "crm_account", + relatedKey: "Vertex Analytics", + outcome: "Three product teams live on the developer platform; usage analytics is the next ask.", + attendees: [{ contact: "ethan.brooks@vertex.example.com", response: "accepted" }] + }, + // ─── Stark Medical — the partner motion ──────────────────────────────── + { + subject: "Stark Medical \u2014 Toronto clinical operations visit", + type: "onsite_visit", + status: "held", + daysAgo: 52, + at: [9, 0], + minutes: 180, + relatedType: "crm_account", + relatedKey: "Stark Medical", + location: "181 Bay Street, Suite 2200, Toronto", + outcome: "Two clinical service lines live on the pilot. Device-servicing expansion parked on budget.", + attendees: [{ contact: "emily.d@starkmed.example.com", response: "accepted" }] + }, + // ─── Leads: the only held rows that touch a prospect's own clock ──────── + { + subject: "CloudFirst \u2014 qualification call with Lisa Thompson", + type: "call", + status: "held", + daysAgo: 1, + at: [11, 0], + minutes: 30, + relatedType: "crm_lead", + relatedKey: "lisa.t@cloudfirst.example.com", + outcome: "Budget confirmed and a technical evaluation agreed \u2014 qualified.", + attendees: [{ lead: "lisa.t@cloudfirst.example.com", response: "accepted" }] + }, + { + subject: "EduTech Labs \u2014 discovery call with David Kim", + type: "call", + status: "held", + daysAgo: 4, + at: [13, 0], + minutes: 30, + relatedType: "crm_lead", + relatedKey: "dkim@edutechlabs.example.com", + outcome: "Replacing spreadsheets across admissions. Referral source confirmed.", + attendees: [{ lead: "dkim@edutechlabs.example.com", response: "accepted" }] + }, + // The earlier touch on each of the two leads above, so each lead's Activity + // tab reads as a short history rather than a single row. Both leads already + // carry `last_contacted_date: today()` for their later call, so a second held + // row moves no recency clock (`event_activity_bubble` stamps the seed moment). + { + subject: "CloudFirst \u2014 follow-up meeting after the Cloud Summit booth", + type: "meeting", + status: "held", + daysAgo: 8, + at: [15, 0], + minutes: 45, + relatedType: "crm_lead", + relatedKey: "lisa.t@cloudfirst.example.com", + outcome: "Walked through pipeline and forecasting. Asked for a qualification call with finance.", + attendees: [{ lead: "lisa.t@cloudfirst.example.com", response: "accepted" }] + }, + { + subject: "EduTech Labs \u2014 referral intro call with David Kim", + type: "call", + status: "held", + daysAgo: 9, + at: [10, 0], + minutes: 15, + relatedType: "crm_lead", + relatedKey: "dkim@edutechlabs.example.com", + outcome: "Warm intro from the referring partner. Booked a proper discovery call.", + attendees: [{ lead: "dkim@edutechlabs.example.com", response: "accepted" }] + }, + // ─── Booked, not held: the calendar ahead ─────────────────────────────── + // These are what `status` exists for. Not one of them moves a recency clock, + // and the three re-engagement rows below sit on the accounts the churn tiles + // count — which is the demonstration, not an oversight. + { + subject: "Acme \u2014 AI agent governance workshop", + type: "meeting", + status: "planned", + daysAgo: -6, + at: [9, 0], + minutes: 90, + relatedType: "crm_opportunity", + relatedKey: "Acme Platform Upgrade", + account: "Acme Corporation", + location: "Google Meet", + description: "Joint workshop with Acme compliance: data scoping, RBAC, audit trails, human-in-the-loop.", + attendees: [{ contact: "john.smith@acme.example.com", response: "tentative" }], + invitedDaysBefore: 9 + }, + { + subject: "Wayne \u2014 procurement signature call", + type: "meeting", + status: "planned", + daysAgo: -1, + at: [11, 0], + minutes: 30, + relatedType: "crm_opportunity", + relatedKey: "Wayne Enterprise License", + account: "Wayne Enterprises", + description: "Confirm the signature date once the security addendum is closed.", + attendees: [{ contact: "rwilson@wayne.example.com", response: "accepted" }], + invitedDaysBefore: 4 + }, + { + subject: "Globex \u2014 manufacturing suite demo", + type: "demo", + status: "planned", + daysAgo: -5, + at: [15, 0], + minutes: 60, + relatedType: "crm_opportunity", + relatedKey: "Globex Manufacturing Suite", + account: "Globex Industries", + location: "Zoom", + description: "Plant-operations demo for the six-site rollout, ahead of the qualification review.", + attendees: [{ contact: "sarah.j@globex.example.com", response: "accepted" }], + invitedDaysBefore: 8 + }, + { + subject: "Lattice \u2014 renewal proposal review", + type: "meeting", + status: "planned", + daysAgo: -3, + at: [10, 0], + minutes: 45, + relatedType: "crm_opportunity", + relatedKey: "Lattice Education Renewal", + account: "Lattice Education", + description: "Walk procurement through the two-year option before the executive sponsor meeting.", + attendees: [{ contact: "priya.shah@lattice.example.com", response: "accepted" }], + invitedDaysBefore: 6 + }, + { + subject: "Initech \u2014 re-engagement call before renewal", + type: "call", + status: "planned", + daysAgo: -2, + at: [14, 0], + minutes: 30, + relatedType: "crm_account", + relatedKey: "Initech Solutions", + description: "Nobody has spoken to Initech in ten weeks and the renewal is 75 days out. Re-open the relationship.", + attendees: [{ contact: "mchen@initech.example.com", response: "no_response" }], + invitedDaysBefore: 5 + }, + { + subject: "Northwind \u2014 grid modernization discovery workshop", + type: "meeting", + status: "planned", + daysAgo: -7, + at: [9, 30], + minutes: 120, + relatedType: "crm_opportunity", + relatedKey: "Northwind Grid Modernization", + account: "Northwind Energy", + location: "Leopoldstrasse 21, Munich", + description: "Confirm discovery participants and agree the operational-data assessment scope.", + attendees: [{ contact: "olivia.chen@northwind.example.com", response: "tentative" }], + invitedDaysBefore: 10 + }, + { + subject: "Apex Logistics \u2014 data hub re-engagement call", + type: "call", + status: "planned", + daysAgo: -4, + at: [16, 0], + minutes: 30, + relatedType: "crm_account", + relatedKey: "Apex Logistics", + description: "The data-hub evaluation has been silent for a quarter. Re-establish the commercial sponsor.", + attendees: [{ contact: "marcus.reed@apexlogistics.example.com", response: "no_response" }], + invitedDaysBefore: 6 + }, + { + subject: "NextGen Retail \u2014 first discovery call with Alice Martinez", + type: "call", + status: "planned", + daysAgo: -2, + at: [15, 0], + minutes: 30, + relatedType: "crm_lead", + relatedKey: "alice@nextgenretail.example.com", + description: "Inbound web lead, booked on her follow-up date.", + attendees: [{ lead: "alice@nextgenretail.example.com", response: "no_response" }], + invitedDaysBefore: 3 + }, + // ─── Neither held nor booked ──────────────────────────────────────────── + // `duration_minutes` is 0 on both, exactly as `event_schedule_derive` + // recomputes it: a meeting nobody attended occupies nobody's time, while the + // calendar slot it was booked into stays on the record as evidence of the + // attempt. + { + subject: "Globex \u2014 line expansion review", + type: "meeting", + status: "cancelled", + daysAgo: 30, + at: [14, 0], + minutes: 60, + relatedType: "crm_opportunity", + relatedKey: "Globex Line Expansion (Lost)", + account: "Globex Industries", + description: "Cancelled by the customer: the incumbent MES vendor had already bundled the two lines.", + attendees: [{ contact: "sarah.j@globex.example.com", response: "declined" }], + invitedDaysBefore: 7 + }, + { + subject: "Initech \u2014 SSO configuration check-in", + type: "call", + status: "no_show", + daysAgo: 55, + at: [10, 0], + minutes: 30, + relatedType: "crm_account", + relatedKey: "Initech Solutions", + description: "Customer did not join. The last attempt to reach Initech before the account went quiet.", + attendees: [{ contact: "mchen@initech.example.com", response: "no_response" }], + invitedDaysBefore: 4 + } +]; +var endClock = (spec) => { + const total = spec.at[0] * 60 + spec.at[1] + spec.minutes; + return [Math.floor(total / 60), total % 60]; +}; +var events = defineSeed2(Event, { + mode: "upsert", + externalId: "subject", + records: EVENT_SPECS.map((spec) => { + const [endHour, endMinute] = endClock(spec); + return { + subject: spec.subject, + type: spec.type, + status: spec.status, + start_datetime: celClock(spec.daysAgo, spec.at[0], spec.at[1]), + end_datetime: celClock(spec.daysAgo, endHour, endMinute), + // Authored rather than left to the hook, and authored to the value the + // hook computes: `event_schedule_derive` measures the gap between the two + // timestamps above, then zeroes it for a cancelled / no-show row. Both + // branches agree with this literal, so the figure is right whether or not + // hooks fire over the seed write (`./_shared.ts`, doctrine rule 2). + duration_minutes: spec.status === "cancelled" || spec.status === "no_show" ? 0 : spec.minutes, + all_day: false, + related_to_type: spec.relatedType, + [EVENT_RELATED_FIELD[spec.relatedType]]: spec.relatedKey, + // The account link is authored on every row that has one, including rows + // whose `related_to_type` is the contact / opportunity / case — the same + // shape the task seeds use, and what fills the ACCOUNT's activity list. + ...spec.account && spec.relatedType !== "crm_account" ? { related_to_account: spec.account } : {}, + ...spec.location ? { location: spec.location } : {}, + ...spec.description ? { description: spec.description } : {}, + ...spec.outcome ? { outcome_notes: spec.outcome } : {} + // No `owner_id`: a seed cannot name a user (see `objectstack.composition.ts`, + // "A seed can't name a user"), so these rows land ownerless and the + // platform's seed-ownership claim hands them to the first administrator + // when the seed settles (#671, #1892). + }; + }) +}); +var attendeeRecords = (kind) => EVENT_SPECS.flatMap( + (spec) => spec.attendees.filter((a) => kind === "lead" ? a.lead : a.contact).map((a) => ({ + crm_event: spec.subject, + attendee_type: kind, + ...kind === "lead" ? { crm_lead: a.lead } : { crm_contact: a.contact }, + response: a.response, + is_organizer: false, + // The invitation predates the slot. Clamped at 0 so a meeting booked + // for the day after tomorrow was invited today, never tomorrow. + invited_date: celDaysAgo(Math.max(spec.daysAgo + (spec.invitedDaysBefore ?? 3), 0)) + })) +); +var eventAttendeesFromContacts = defineSeed2(EventAttendee, { + mode: "upsert", + externalId: ["crm_event", "crm_contact"], + records: attendeeRecords("contact") +}); +var eventAttendeesFromLeads = defineSeed2(EventAttendee, { + mode: "upsert", + externalId: ["crm_event", "crm_lead"], + records: attendeeRecords("lead") +}); +var SYS_ACTIVITY_RETENTION_DAYS = 14; +var LOGGED_SUMMARY_PREFIX = { + call: "", + meeting: "Meeting: " +}; +var leadInteractionPointers = { + object: "sys_activity", + mode: "upsert", + // One timeline pointer per rich source record, exactly as the action writes + // it. Matched on the RESOLVED ids, so replay boots dedupe. + externalId: ["source_object", "source_id"], + records: EVENT_SPECS.filter( + (spec) => spec.relatedType === "crm_lead" && spec.status === "held" && LOGGED_SUMMARY_PREFIX[spec.type] !== void 0 && spec.daysAgo >= 0 && spec.daysAgo < SYS_ACTIVITY_RETENTION_DAYS + ).map((spec) => { + const [endHour, endMinute] = endClock(spec); + return { + // `held` is what both actions write as `completed` — the `task` feed + // kind, the one the lead Activity tab renders. + type: "completed", + // The action's own summary: prefix, subject, duration in brackets. + summary: `${LOGGED_SUMMARY_PREFIX[spec.type]}${spec.subject} (${spec.minutes} min)`, + // Logged when the slot ended. + timestamp: celClock(spec.daysAgo, endHour, endMinute), + object_name: "crm_lead", + record_id: spec.relatedKey, + source_object: "crm_event", + source_id: spec.subject, + metadata: JSON.stringify({ + kind: spec.type, + duration_minutes: spec.minutes, + notes: spec.outcome ?? "", + attendee_count: spec.attendees.length + }) + }; + }) +}; + +// src/sales/data/forecast.seed.ts +import { defineSeed as defineSeed3 } from "@objectstack/spec/data"; +import { cel as cel33 } from "@objectstack/spec"; +var FORECAST_MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; +var forecastIsoDate = (d) => `${d.getUTCFullYear()}-${String(d.getUTCMonth() + 1).padStart(2, "0")}-${String(d.getUTCDate()).padStart(2, "0")}`; +var forecastQuarterLabel = (d) => `Q${Math.floor(d.getUTCMonth() / 3) + 1} ${d.getUTCFullYear()}`; +var forecastMonthLabel = (d) => `${FORECAST_MONTHS[d.getUTCMonth()]} ${d.getUTCFullYear()}`; +var forecastNow = /* @__PURE__ */ new Date(); +var forecastYear = forecastNow.getUTCFullYear(); +var forecastMonth = forecastNow.getUTCMonth(); +var forecastQuarterMonth = Math.floor(forecastMonth / 3) * 3; +var thisMonthStart = new Date(Date.UTC(forecastYear, forecastMonth, 1)); +var thisMonthEnd = new Date(Date.UTC(forecastYear, forecastMonth + 1, 0)); +var lastQuarterStart = new Date(Date.UTC(forecastYear, forecastQuarterMonth - 3, 1)); +var lastQuarterEnd = new Date(Date.UTC(forecastYear, forecastQuarterMonth, 0)); +var quarterStartAgo = (n) => new Date(Date.UTC(forecastYear, forecastQuarterMonth - 3 * n, 1)); +var quarterEndAgo = (n) => new Date(Date.UTC(forecastYear, forecastQuarterMonth - 3 * (n - 1), 0)); +var monthStartAgo = (n) => new Date(Date.UTC(forecastYear, forecastMonth - n, 1)); +var monthEndAgo = (n) => new Date(Date.UTC(forecastYear, forecastMonth - n + 1, 0)); +var closedPeriod = (seed_key, period, start, end, quota, closed, open, notes) => ({ + seed_key, + period, + period_label: period === "quarter" ? forecastQuarterLabel(start) : forecastMonthLabel(start), + period_start: forecastIsoDate(start), + period_end: forecastIsoDate(end), + snapshot_date: forecastIsoDate(end), + quota, + pipeline_amount: open.pipeline, + best_case_amount: open.bestCase, + commit_amount: open.commit, + closed_amount: closed, + source: "scheduled", + notes +}); +var forecasts = defineSeed3(Forecast, { + mode: "upsert", + externalId: "seed_key", + records: [ + { + seed_key: "demo_month_current", + period: "month", + period_label: forecastMonthLabel(thisMonthStart), + period_start: forecastIsoDate(thisMonthStart), + period_end: forecastIsoDate(thisMonthEnd), + snapshot_date: cel33`today()`, + quota: 5e5, + pipeline_amount: 76e4, + best_case_amount: 54e4, + commit_amount: 36e4, + closed_amount: 295e3, + source: "scheduled", + notes: "Healthy coverage; two commit deals expected to close this week." + }, + { + seed_key: "demo_quarter_minus_1", + period: "quarter", + period_label: forecastQuarterLabel(lastQuarterStart), + period_start: forecastIsoDate(lastQuarterStart), + period_end: forecastIsoDate(lastQuarterEnd), + snapshot_date: forecastIsoDate(lastQuarterEnd), + quota: 14e5, + pipeline_amount: 24e4, + best_case_amount: 15e4, + commit_amount: 95e3, + closed_amount: 1485e3, + source: "scheduled", + notes: "Closed at 106% of quota." + }, + closedPeriod( + "demo_quarter_minus_2", + "quarter", + quarterStartAgo(2), + quarterEndAgo(2), + 13e5, + 1196e3, + { pipeline: 285e3, bestCase: 19e4, commit: 12e4 }, + "Closed at 92% of quota \u2014 two enterprise deals slipped into the next quarter." + ), + closedPeriod( + "demo_quarter_minus_3", + "quarter", + quarterStartAgo(3), + quarterEndAgo(3), + 12e5, + 1308e3, + { pipeline: 195e3, bestCase: 13e4, commit: 85e3 }, + "Closed at 109% of quota, carried by the enterprise renewal cohort." + ), + closedPeriod( + "demo_quarter_minus_4", + "quarter", + quarterStartAgo(4), + quarterEndAgo(4), + 11e5, + 1045e3, + { pipeline: 165e3, bestCase: 11e4, commit: 7e4 }, + "Closed at 95% of quota in the first quarter on the new territory model." + ), + closedPeriod( + "demo_month_minus_1", + "month", + monthStartAgo(1), + monthEndAgo(1), + 48e4, + 505e3, + { pipeline: 96e3, bestCase: 62e3, commit: 4e4 }, + "Closed at 105% of quota; the expansion motion covered a soft new-business month." + ), + closedPeriod( + "demo_month_minus_2", + "month", + monthStartAgo(2), + monthEndAgo(2), + 46e4, + 414e3, + { pipeline: 92e3, bestCase: 58e3, commit: 35e3 }, + "Closed at 90% of quota \u2014 summer slowdown across the mid-market segment." + ) + ] +}); + +// src/sales/data/index.ts +var COMPOSITION_ENV_VAR = "HOTCRM_COMPOSITION"; +var HOTCRM_COMPOSITIONS = ["default", "saas"]; +function resolveComposition(raw = process.env[COMPOSITION_ENV_VAR]) { + const value = (raw ?? "").trim(); + if (value === "") return "default"; + if (HOTCRM_COMPOSITIONS.includes(value)) { + return value; + } + throw new Error( + `${COMPOSITION_ENV_VAR}="${value}" is not a HotCRM composition. Expected one of: ${HOTCRM_COMPOSITIONS.join(", ")} (or leave it unset for 'default').` + ); +} + +// src/revenue/data/catalog.seed.ts +import { defineSeed as defineSeed4 } from "@objectstack/spec/data"; +var products = defineSeed4(Product, { + mode: "upsert", + externalId: "name", + records: [ + { + name: "ObjectStack Platform", + description: "The enterprise edition: unlimited objects, AI agents, governance and audit.", + category: "software", + family: "enterprise", + sku: "OS-PLAT-ENT", + list_price: 5e4, + cost: 12e3, + is_active: true + }, + { + name: "ObjectStack Platform (SMB Edition)", + description: "The mid-market edition: core CRM objects and automation, capped agent usage.", + category: "software", + family: "smb", + sku: "OS-PLAT-SMB", + list_price: 18e3, + cost: 4500, + is_active: true + }, + { + name: "Cloud Hosting (Annual)", + description: "Managed hosting with regional data residency and a 99.9% availability target.", + category: "subscription", + family: "cloud", + sku: "OS-CLOUD-HOST", + list_price: 12e3, + cost: 4200, + is_active: true + }, + { + name: "Sandbox Environment (Annual)", + description: "A full-copy non-production environment for testing metadata changes before release.", + category: "subscription", + family: "cloud", + sku: "OS-CLOUD-SBX", + list_price: 7500, + cost: 2600, + is_active: true + }, + { + name: "AI Agent Seat (Annual)", + description: "A named-user seat for the Co-Pilot and agent surfaces, billed annually.", + category: "subscription", + family: "cloud", + sku: "OS-AI-SEAT", + list_price: 1e3, + cost: 260, + is_active: true + }, + { + name: "Analytics Add-on", + description: "Dashboards, cubes and scheduled reporting for the revenue organization.", + category: "software", + family: "enterprise", + sku: "OS-ADDON-ANL", + list_price: 22e3, + cost: 6500, + is_active: true + }, + { + name: "Integration Connector Pack", + description: "Pre-built connectors for ERP, marketing automation and data warehouse targets.", + category: "software", + family: "enterprise", + sku: "OS-ADDON-INT", + list_price: 16e3, + cost: 5200, + is_active: true + }, + { + name: "Field Service Mobile", + description: "Offline-capable mobile app for field technicians and route-based service work.", + category: "software", + family: "smb", + sku: "OS-ADDON-FSM", + list_price: 14e3, + cost: 4200, + is_active: true + }, + { + name: "Premium Support", + description: "24\xD77 support with a one-hour P1 response target and a named technical account manager.", + category: "support", + family: "services", + sku: "OS-SUP-PREM", + list_price: 25e3, + cost: 9e3, + is_active: true + }, + { + name: "Standard Support", + description: "Business-hours support with a next-business-day response target.", + category: "support", + family: "services", + sku: "OS-SUP-STD", + list_price: 9e3, + cost: 3600, + is_active: true + }, + { + name: "Implementation Services", + description: "Guided implementation: discovery, metadata build, integration and go-live support.", + category: "service", + family: "services", + sku: "OS-SVC-IMPL", + list_price: 75e3, + cost: 41e3, + is_active: true + }, + { + name: "Data Migration Services", + description: "Extraction, mapping and reconciliation of legacy CRM and spreadsheet data.", + category: "service", + family: "services", + sku: "OS-SVC-MIGR", + list_price: 35e3, + cost: 19e3, + is_active: true + }, + { + name: "Admin Training Workshop", + description: "A one-day workshop for administrators on metadata, permissions and analytics.", + category: "service", + family: "services", + sku: "OS-SVC-TRN", + list_price: 6e3, + cost: 2400, + is_active: true + } + ] +}); +var catalogPrice = (productName) => { + const product = products.records.find((r) => r.name === productName); + if (!product || typeof product.list_price !== "number") { + throw new Error(`Seed error: no catalog product named "${productName}"`); + } + return product.list_price; +}; +var lineItemRecords = (parentField, table) => Object.entries(table).flatMap( + ([parent, lines]) => lines.map((l, i) => ({ + [parentField]: parent, + crm_product: l.product, + description: l.description, + quantity: l.quantity, + list_price: catalogPrice(l.product), + unit_price: l.unit_price, + discount: l.discount ?? 0, + line_number: i + 1 + })) +); + +// src/revenue/data/opportunity-line-item.seed.ts +import { defineSeed as defineSeed5 } from "@objectstack/spec/data"; +var opportunityLineItems = defineSeed5(OpportunityLineItem, { + mode: "upsert", + externalId: ["crm_opportunity", "crm_product"], + records: lineItemRecords("crm_opportunity", OPPORTUNITY_LINES) +}); + +// src/revenue/data/revenue.seed.ts +import { defineSeed as defineSeed6 } from "@objectstack/spec/data"; +import { cel as cel34 } from "@objectstack/spec"; +var contracts = defineSeed6(Contract, { + mode: "upsert", + externalId: "description", + records: [ + // The one ACTIVATED contract in the app — `contract_renewal`, + // `contract_expiration` and `billing_handoff` all filter on exactly that + // status — so it has to be a contract that was really signed, off a deal + // that was really won. + // + // It used to link `Acme Platform Upgrade` and carry that deal's line total + // (150000) while that deal is still `proposal`, closing `daysFromNow(30)` + // (#1661). Nothing in this app can produce that pairing: `quote_on_accepted` + // close-wins an opportunity the moment its quote is accepted, and + // `closed_won` is TERMINAL in `opportunity_stage_progression` — so a signed + // contract can never sit on an open deal, from either direction. + // + // Every field below is now derived from `Acme Annual Renewal 2025`, the + // `closed_won` deal this contract's own description was already describing: + // contract_value — that deal's line-item total, which is also the ARR the + // account description reports. 150000 was the upgrade's + // total, i.e. the value came from a different deal than + // the link did; + // signed_date — its `close_date`: you sign when you win, and + // `quote_on_accepted` stamps that same day; + // start_date — signature + 14d, because that deal's description says + // it was "signed two weeks ahead of the renewal date"; + // end_date — start + 365d, the span every other row here uses for a + // 12-month term. + { + crm_account: "Acme Corporation", + crm_contact: "john.smith@acme.example.com", + crm_opportunity: "Acme Annual Renewal 2025", + status: "activated", + contract_term_months: 12, + start_date: cel34`daysAgo(1)`, + end_date: cel34`daysFromNow(364)`, + contract_value: 22e4, + billing_frequency: "annually", + payment_terms: "net_30", + auto_renewal: true, + renewal_notice_days: 60, + contract_type: "subscription", + signed_date: cel34`daysAgo(15)`, + signed_by: "John Smith", + description: "Annual platform subscription with premium support tier." + }, + { + crm_account: "Wayne Enterprises", + crm_contact: "rwilson@wayne.example.com", + crm_opportunity: "Wayne Enterprise License", + status: "in_approval", + contract_term_months: 36, + start_date: cel34`daysFromNow(14)`, + end_date: cel34`daysFromNow(1109)`, + contract_value: 12e5, + billing_frequency: "annually", + payment_terms: "net_60", + auto_renewal: false, + renewal_notice_days: 90, + contract_type: "license", + description: "Multi-year enterprise license with custom SLA." + }, + { + crm_account: "Initech Solutions", + crm_contact: "mchen@initech.example.com", + status: "expired", + contract_term_months: 12, + start_date: cel34`daysAgo(400)`, + end_date: cel34`daysAgo(35)`, + contract_value: 6e4, + billing_frequency: "quarterly", + payment_terms: "net_30", + auto_renewal: false, + renewal_notice_days: 30, + contract_type: "service", + signed_date: cel34`daysAgo(405)`, + signed_by: "Michael Chen", + description: "Initial service agreement, pending renewal discussion." + }, + { + crm_account: "Stark Medical", + crm_contact: "emily.d@starkmed.example.com", + status: "draft", + contract_term_months: 24, + start_date: cel34`daysFromNow(30)`, + end_date: cel34`daysFromNow(760)`, + contract_value: 35e4, + billing_frequency: "monthly", + payment_terms: "net_30", + auto_renewal: true, + renewal_notice_days: 60, + contract_type: "partnership", + description: "Healthcare partnership agreement, currently under legal review." + } + ] +}); +var QUOTE_LINES = { + "Acme Platform Upgrade Quote": OPPORTUNITY_LINES["Acme Platform Upgrade"], + "Acme Annual Renewal 2025 Quote": OPPORTUNITY_LINES["Acme Annual Renewal 2025"], + "Globex Manufacturing Suite Proposal": OPPORTUNITY_LINES["Globex Manufacturing Suite"], + "Wayne Enterprise License Quote": OPPORTUNITY_LINES["Wayne Enterprise License"], + "Initech Cloud Migration Estimate": OPPORTUNITY_LINES["Initech Cloud Migration"], + // Quoted standalone, before any opportunity existed — and then rejected. + "Stark Medical Pilot Quote": [ + { product: "Admin Training Workshop", quantity: 5, unit_price: 6e3, description: "Five workshop days for the pilot clinical teams." }, + { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Standard support for the pilot term." }, + { product: "AI Agent Seat (Annual)", quantity: 6, unit_price: 1e3, description: "Agent seats for the pilot coordinators." } + ] +}; +var quoteTotals = (quoteName, opts) => { + const lines = QUOTE_LINES[quoteName]; + if (!lines) throw new Error(`Seed error: no line items authored for quote "${quoteName}"`); + const subtotal = linesTotal(lines); + const discount_amount = Math.round(subtotal * (opts.discount / 100) * 100) / 100; + const total_price = Math.round((subtotal - discount_amount + opts.tax + opts.shipping_handling) * 100) / 100; + return { + subtotal, + discount: opts.discount, + discount_amount, + tax: opts.tax, + shipping_handling: opts.shipping_handling, + total_price + }; +}; +var quotes = defineSeed6(Quote, { + mode: "upsert", + externalId: "name", + records: [ + { + name: "Acme Platform Upgrade Quote", + crm_account: "Acme Corporation", + crm_contact: "john.smith@acme.example.com", + crm_opportunity: "Acme Platform Upgrade", + // `expired`, not `accepted` (#1661). Accepting this quote would have + // close-won `Acme Platform Upgrade`, which is `proposal` and 30 days from + // close — the same impossible pairing the contract above carried, one + // object over. `expired` is what `quote_expiration` computes for a + // presented quote past its `expiration_date`, and it is what the deal's + // own next step assumes: the revised Enterprise proposal still has to go + // out. Its `crm_contact` stays put — the row is no longer gated by + // `requiredWhen`, but the recipient is still who it was sent to. + status: "expired", + quote_date: cel34`daysAgo(45)`, + expiration_date: cel34`daysAgo(15)`, + ...quoteTotals("Acme Platform Upgrade Quote", { discount: 10, tax: 11475, shipping_handling: 0 }), + payment_terms: "net_30", + description: "Platform upgrade with 10% loyalty discount applied." + }, + // The renewal's own quote, and the seed's one ACCEPTED quote. Acceptance is + // only coherent here: `quote_on_accepted` close-wins whatever opportunity a + // quote links, so an accepted quote can only ever point at a `closed_won` + // deal. It also completes the provenance chain the contract above needs — + // deal won, quote accepted, contract drafted, then completed and activated + // by an admin (the draft the hook writes is explicitly a starting point). + // `Acme Annual Renewal 2025` keeps its rep-recorded `relationship` win + // reason: the hook only supplies `quote_accepted` when nobody recorded one. + { + name: "Acme Annual Renewal 2025 Quote", + crm_account: "Acme Corporation", + crm_contact: "john.smith@acme.example.com", + crm_opportunity: "Acme Annual Renewal 2025", + status: "accepted", + quote_date: cel34`daysAgo(30)`, + expiration_date: cel34`daysAgo(1)`, + // No discount — the renewal went at list ("multi-year option declined + // this round"), which is what its 22% YoY uplift is made of. Tax is 8.5% + // of the post-discount subtotal, the rate the other Acme quote bills at; + // every non-Acme quote here bills 8%. + ...quoteTotals("Acme Annual Renewal 2025 Quote", { discount: 0, tax: 18700, shipping_handling: 0 }), + payment_terms: "net_30", + description: "Annual renewal \u2014 three production tenants, premium support and the EMEA seat expansion." + }, + { + name: "Globex Manufacturing Suite Proposal", + crm_account: "Globex Industries", + crm_contact: "sarah.j@globex.example.com", + crm_opportunity: "Globex Manufacturing Suite", + status: "presented", + quote_date: cel34`daysAgo(7)`, + expiration_date: cel34`daysFromNow(23)`, + ...quoteTotals("Globex Manufacturing Suite Proposal", { discount: 5, tax: 7220, shipping_handling: 2500 }), + payment_terms: "net_60", + description: "Manufacturing suite licensing with plant-admin training." + }, + { + name: "Wayne Enterprise License Quote", + crm_account: "Wayne Enterprises", + crm_contact: "rwilson@wayne.example.com", + crm_opportunity: "Wayne Enterprise License", + status: "in_review", + quote_date: cel34`daysAgo(3)`, + expiration_date: cel34`daysFromNow(27)`, + ...quoteTotals("Wayne Enterprise License Quote", { discount: 15, tax: 81600, shipping_handling: 0 }), + payment_terms: "net_60", + description: "Multi-year enterprise license with volume discount." + }, + { + name: "Initech Cloud Migration Estimate", + crm_account: "Initech Solutions", + crm_contact: "mchen@initech.example.com", + crm_opportunity: "Initech Cloud Migration", + status: "draft", + quote_date: cel34`daysAgo(1)`, + expiration_date: cel34`daysFromNow(29)`, + ...quoteTotals("Initech Cloud Migration Estimate", { discount: 0, tax: 6400, shipping_handling: 0 }), + payment_terms: "net_30", + description: "Cloud migration services, awaiting internal review." + }, + { + name: "Stark Medical Pilot Quote", + crm_account: "Stark Medical", + crm_contact: "emily.d@starkmed.example.com", + status: "rejected", + quote_date: cel34`daysAgo(60)`, + expiration_date: cel34`daysAgo(30)`, + ...quoteTotals("Stark Medical Pilot Quote", { discount: 0, tax: 3600, shipping_handling: 0 }), + payment_terms: "net_30", + description: "Pilot project quote, rejected due to budget constraints.", + internal_notes: "Customer requested re-quote with smaller scope." + } + ] +}); +var quoteLineItems = defineSeed6(QuoteLineItem, { + mode: "upsert", + externalId: ["crm_quote", "crm_product"], + records: lineItemRecords("crm_quote", QUOTE_LINES) +}); + +// src/service/data/service.seed.ts +import { defineSeed as defineSeed7 } from "@objectstack/spec/data"; +import { cel as cel35 } from "@objectstack/spec"; + +// src/service/objects/_case-sla.ts +var CASE_SLA_DEFAULT_TIER = "smb"; +var CASE_SLA_CALENDAR_HOURS = { + // strategic enterprise mid_market smb + critical: { strategic: 4, enterprise: 4, mid_market: 4, smb: 4 }, + high: { strategic: 6, enterprise: 8, mid_market: 8, smb: 8 }, + medium: { strategic: 24, enterprise: 36, mid_market: 48, smb: 48 }, + low: { strategic: 96, enterprise: 120, mid_market: 168, smb: 168 } +}; +function caseSlaCalendarHours(priority, tier) { + const row = CASE_SLA_CALENDAR_HOURS[priority]; + if (!row) return void 0; + return row[tier] ?? row[CASE_SLA_DEFAULT_TIER]; +} +var caseSlaBreached = (dueAt, clockStoppedAt) => dueAt < clockStoppedAt; + +// src/service/data/service.seed.ts +var TIER_BY_ACCOUNT = new Map( + accounts.records.map((a) => [ + String(a.name), + typeof a.tier === "string" ? a.tier : CASE_SLA_DEFAULT_TIER + ]) +); +var seededSlaHours = (priority, accountName) => { + const hours = caseSlaCalendarHours(priority, accountName ? TIER_BY_ACCOUNT.get(accountName) : void 0); + if (hours === void 0) throw new Error(`seed: no SLA matrix row for priority "${priority}"`); + return hours; +}; +var celCaseSlaDue = (createdDaysAgo, priority, accountName) => cel35`daysAgo(${createdDaysAgo}) + duration('${seededSlaHours(priority, accountName)}h')`; +var seededSettledBreach = (createdDaysAgo, settledDaysAgo, priority, accountName) => caseSlaBreached(seededSlaHours(priority, accountName), (createdDaysAgo - settledDaysAgo) * 24); +var cases = defineSeed7(Case, { + mode: "upsert", + externalId: "subject", + records: [ + { + subject: "Login issues after platform upgrade", + description: `Users in the EMEA office report intermittent 401 errors when logging in after the v4.2 upgrade rolled out Wednesday night. Pattern: only affects users authenticating via SAML through Okta, only between 09:00\u201310:30 UTC. NA and APAC users are unaffected. + +**Customer impact:** ~40 users blocked at peak, costing ~3 productive hours per affected user. + +**Initial triage:** Suspect a clock-skew issue on the EMEA SSO relay added during the upgrade window. Engineering is reproducing in staging.`, + crm_account: "Acme Corporation", + crm_contact: "john.smith@acme.example.com", + status: "in_progress", + priority: "high", + priority_rank: 3, + type: "problem", + origin: "email", + is_closed: false, + is_sla_violated: false, + is_escalated: false, + created_at: cel35`daysAgo(2)`, + sla_due_date: celCaseSlaDue(2, "high", "Acme Corporation") + }, + { + subject: "Data export timing out for large datasets", + description: "CSV export fails for datasets over 10k rows.", + crm_account: "Globex Industries", + crm_contact: "sarah.j@globex.example.com", + status: "escalated", + priority: "critical", + priority_rank: 4, + type: "bug", + origin: "phone", + is_closed: false, + is_sla_violated: true, + is_escalated: true, + escalation_reason: "Customer threatening churn", + created_at: cel35`daysAgo(5)`, + sla_due_date: celCaseSlaDue(5, "critical", "Globex Industries") + }, + { + subject: "How to configure SSO with Okta?", + description: "Customer needs guidance on SSO setup with Okta.", + crm_account: "Initech Solutions", + crm_contact: "mchen@initech.example.com", + status: "resolved", + priority: "medium", + priority_rank: 2, + type: "question", + origin: "web", + // Resolved-but-not-closed: case.hook keeps is_closed=false and stamps + // closed_date as the resolved-date proxy; resolution_time_hours is the + // closed−created delta the hook would compute (daysAgo() is day-granular, + // so deltas come in 24h steps). + is_closed: false, + is_sla_violated: seededSettledBreach(3, 2, "medium", "Initech Solutions"), + is_escalated: false, + resolution_time_hours: 24, + created_at: cel35`daysAgo(3)`, + closed_date: cel35`daysAgo(2)`, + sla_due_date: celCaseSlaDue(3, "medium", "Initech Solutions") + }, + { + subject: "API rate limit exceeded on production", + description: "Production environment hitting rate limits during peak hours.", + crm_account: "Wayne Enterprises", + crm_contact: "rwilson@wayne.example.com", + status: "closed", + priority: "high", + priority_rank: 3, + type: "problem", + origin: "chat", + is_closed: true, + is_sla_violated: seededSettledBreach(7, 6, "high", "Wayne Enterprises"), + is_escalated: false, + // `resolution` is REQUIRED when status is 'closed' (object validation + // `resolution_required_for_closed`) — without it the seed row is rejected. + resolution: "Raised the production rate-limit tier and added client-side backoff; usage now within limits.", + // The deflection link (#601): this case was answered out of the knowledge + // base, so it names the article that resolved it. Referenced by the + // article seed's `externalId` (`title`), the same way every other seeded + // lookup names its target. + resolved_by_article: "API Rate Limits", + // closed−created delta, as case.hook computes it. + resolution_time_hours: 24, + created_at: cel35`daysAgo(7)`, + closed_date: cel35`daysAgo(6)`, + sla_due_date: celCaseSlaDue(7, "high", "Wayne Enterprises") + }, + { + subject: "PDF reports not rendering charts correctly", + description: "Charts appear blank when exporting dashboard to PDF.", + crm_account: "Stark Medical", + crm_contact: "emily.d@starkmed.example.com", + status: "new", + priority: "medium", + priority_rank: 2, + type: "bug", + origin: "email", + is_closed: false, + is_sla_violated: false, + is_escalated: false, + created_at: cel35`daysAgo(1)`, + sla_due_date: celCaseSlaDue(1, "medium", "Stark Medical") + }, + { + subject: "Billing discrepancy on last invoice", + description: `Customer (Lisa Kim, Procurement) flagged that the May invoice shows 15 active seats but Acme is only using 12. Two of the seats were de-provisioned in early April when two engineers left the company. + +**Root cause:** the de-provisioning happened in our admin console but the seat-count metric in billing only refreshes monthly, so the May invoice picked up the pre-change count. + +**Resolution path:** issue a $1,200 credit memo and switch Acme to the new real-time seat-billing pipeline so this can't recur. Waiting on Lisa to confirm she's good with the credit-memo treatment vs a refund.`, + crm_account: "Acme Corporation", + crm_contact: "john.smith@acme.example.com", + status: "waiting_customer", + priority: "low", + priority_rank: 1, + type: "problem", + origin: "email", + is_closed: false, + is_sla_violated: false, + is_escalated: false, + created_at: cel35`daysAgo(4)`, + sla_due_date: celCaseSlaDue(4, "low", "Acme Corporation") + }, + { + subject: "Mobile app crashes on iOS 17", + description: "App crashes on launch for users running iOS 17.2+.", + crm_account: "Globex Industries", + crm_contact: "sarah.j@globex.example.com", + status: "in_progress", + priority: "critical", + priority_rank: 4, + type: "bug", + origin: "web", + is_closed: false, + is_sla_violated: true, + is_escalated: true, + escalation_reason: "Affects 30% of mobile users", + created_at: cel35`daysAgo(3)`, + sla_due_date: celCaseSlaDue(3, "critical", "Globex Industries") + }, + { + subject: "Request: bulk import via CSV", + description: "Customer requesting ability to import records via CSV upload.", + crm_account: "Wayne Enterprises", + crm_contact: "rwilson@wayne.example.com", + status: "closed", + priority: "low", + priority_rank: 1, + type: "feature_request", + origin: "web", + is_closed: true, + is_sla_violated: seededSettledBreach(10, 8, "low", "Wayne Enterprises"), + is_escalated: false, + // Required for closed cases (resolution_required_for_closed). + resolution: "Delivered CSV bulk-import in the 9.4 release; shared the docs link with the customer.", + // closed−created delta, as case.hook computes it. + resolution_time_hours: 48, + created_at: cel35`daysAgo(10)`, + closed_date: cel35`daysAgo(8)`, + sla_due_date: celCaseSlaDue(10, "low", "Wayne Enterprises") + }, + // ─── Generated demo cases — 30 cases over the last 30 days, mixed across + // priorities. Powers `CasesOpenedByDayPriorityReport` (daily bucketing + // matrix) and the service dashboard's daily-volume area chart. + // + // ### Why every axis carries a rotation, and not just `i % length` (#1659) + // + // These rows used to read ONE counter for every axis: `crm_account` and + // `status` both took `i % 5`, and `priority`, `type` and `origin` all took + // `i % 4`. Equal-length lists walked by one index advance in lockstep, so + // each group came out PERFECTLY correlated — every Acme case `new`, every + // Globex case `in_progress`, and every `low` case a `question` raised by + // `email`. Thirty rows of volume with no variety, which is the opposite of + // what a volume generator is for: the account × status cross-tab held 5 of + // its 25 cells, and priority × type × origin 4 of 16 apiece. + // + // Each list now advances one step per row PLUS a rotation — `c` extra steps + // every `m` rows. Two axes stay correlated exactly when their relative + // offset never moves, so the rotations are chosen to make every relative + // offset sweep its whole cycle. `crm_account` is the anchor and carries no + // rotation; the other four are stated relative to it. + // + // `account × status` is complete BY CONSTRUCTION rather than by luck, and + // the proof is one line: account `a` takes rows i = a, a+5 … a+25, whose + // block numbers run 0…5, so its statuses are `(a + b) % 5` over b = 0…5 — + // all five of them. The thirty rows therefore walk the whole 5 × 5 grid, + // twenty-five cells once and five of them a second time. + // + // ⚠️ The remaining three constants are TUNED, not derived. They were picked + // by computing all ten pairwise cross-tabs and keeping the assignment that + // left the fewest empty cells. Measured over the lists as shipped: 188 of + // the 193 pairwise cells are occupied, no cell holds more than 3 rows, and + // the marginals stay as flat as thirty rows allow — 6/6/6/6/6 by account + // and by status, 8/7/7/8 by priority, type and origin. ⛔ Changing the + // LENGTH of any list below voids that tuning: re-measure the cross-tabs + // rather than assuming the rotations still separate the axes. + // + // Two schemes that read as more principled than they measure were rejected + // here, and are recorded so they are not re-derived: rotating the 5-lists + // on the 4-block and the 4-lists on the 5-block ("the lengths are coprime, + // so they cannot resonate") empties one status completely; and rotating + // `crm_account` as well — to break the every-fifth-day beat it walks the + // calendar on — costs twelve further empty cells. That beat is the + // deliberate price of anchoring: with one row per day, some axis has to be + // the fixed one the other four are measured against. + ...(() => { + const priorities = ["low", "medium", "high", "critical"]; + const rankByPriority = { low: 1, medium: 2, high: 3, critical: 4 }; + const types = ["question", "bug", "problem", "feature_request"]; + const origins = ["email", "phone", "web", "chat"]; + const statuses = ["new", "in_progress", "resolved", "closed", "escalated"]; + const accountsList = ["Acme Corporation", "Globex Industries", "Wayne Enterprises", "Initech Solutions", "Stark Medical"]; + const out = []; + for (let i = 0; i < 30; i++) { + const account = accountsList[i % accountsList.length]; + const status = statuses[(i + Math.floor(i / accountsList.length)) % statuses.length]; + const priority = priorities[(i + Math.floor(i / priorities.length)) % priorities.length]; + const type = types[(i + 2 * Math.floor(i / types.length)) % types.length]; + const origin = origins[(i + Math.floor(i / 10)) % origins.length]; + const settled = status === "resolved" || status === "closed"; + const ageDays = 1 + i % 30; + const resolutionDays = Math.min(ageDays, 1 + i % 3); + const slaViolated = settled ? seededSettledBreach(ageDays, ageDays - resolutionDays, priority, account) : priority === "critical" && i % 3 === 0; + out.push({ + subject: `Demo case ${String(i + 1).padStart(2, "0")} \u2014 ${priority} ${type}`, + description: `Auto-generated demo case for ${priority} priority on day -${ageDays}.`, + crm_account: account, + status, + priority, + priority_rank: rankByPriority[priority], + type, + origin, + // is_closed strictly mirrors case.hook: true ONLY for status + // 'closed' — a resolved case is NOT closed yet. + is_closed: status === "closed", + is_sla_violated: slaViolated, + is_escalated: status === "escalated", + ...settled ? { resolution_time_hours: resolutionDays * 24 } : {}, + // Object validations require these when closed/escalated — without + // them the generated rows are rejected (resolution_required_for_closed + // / escalation_reason_required). + ...status === "closed" ? { resolution: "Resolved per standard runbook; root cause documented and customer confirmed." } : {}, + ...status === "escalated" ? { escalation_reason: "Escalated to tier-2 engineering for SLA-risk review." } : {}, + created_at: celDaysAgo(ageDays), + // Resolved cases also carry closed_date: case.hook stamps it as the + // resolved-date proxy while keeping is_closed=false. + ...settled ? { closed_date: celDaysAgo(ageDays - resolutionDays) } : {}, + sla_due_date: celCaseSlaDue(ageDays, priority, account) + }); + } + return out; + })() + ] +}); +var knowledgeArticles = defineSeed7(KnowledgeArticle, { + mode: "upsert", + externalId: "title", + records: [ + { + title: "Getting Started with HotCRM", + summary: "A five-minute tour of accounts, contacts, leads and the sales pipeline.", + category: "getting_started", + status: "published", + audience: "public", + language: "en", + body: `# Getting Started with HotCRM + +Welcome! This guide walks you through the core objects: + +1. **Accounts** \u2014 the companies you sell to and serve. +2. **Contacts** \u2014 the people at those accounts. +3. **Leads** \u2014 unqualified prospects in the top of the funnel. +4. **Opportunities** \u2014 qualified deals moving through your pipeline. + +Open the **Sales Pipeline** kanban to drag deals between stages, and use the +**Executive Overview** dashboard to track revenue at a glance.`, + published_at: cel35`daysAgo(40)`, + last_reviewed_at: cel35`daysAgo(20)` + }, + { + title: "Resetting Your Password", + summary: "How end users reset a forgotten password from the login screen.", + category: "how_to", + status: "published", + audience: "public", + language: "en", + body: `# Resetting Your Password + +1. On the login screen, click **Forgot password?** +2. Enter the email associated with your account. +3. Check your inbox for a reset link (valid for 30 minutes). +4. Choose a new password of at least 12 characters. + +If the email does not arrive, check spam or contact your administrator.`, + published_at: cel35`daysAgo(25)`, + last_reviewed_at: cel35`daysAgo(10)` + }, + { + title: "API Rate Limits", + summary: "Per-token request quotas and recommended back-off strategy.", + category: "api", + status: "draft", + audience: "internal", + language: "en", + body: `# API Rate Limits (DRAFT) + +Default quota is 600 requests/minute per token. On HTTP 429, back off +exponentially starting at 1s. Numbers pending final review with platform team.` + }, + { + title: "Legacy SSO Setup", + summary: "SAML configuration for the pre-2025 identity stack.", + category: "troubleshooting", + status: "published", + audience: "internal", + language: "en", + body: `# Legacy SSO Setup + +This covers the deprecated SAML 1.1 flow. New tenants should use the OIDC +connector instead. Retained for customers still on the legacy stack.`, + published_at: cel35`daysAgo(240)`, + last_reviewed_at: cel35`daysAgo(220)` + } + ] +}); + +// src/marketing/data/marketing.seed.ts +import { defineSeed as defineSeed8 } from "@objectstack/spec/data"; +import { cel as cel36 } from "@objectstack/spec"; +var CAMPAIGN_MEMBERS = { + "Q3 Enterprise Email Nurture": [ + { lead: "noah.patel@vertexanalytics.example.com", status: "responded", addedDaysAgo: 14, respondedDaysAgo: 9 }, + { lead: "maya.singh@bluepeaklogistics.example.com", status: "sent", addedDaysAgo: 14 }, + { lead: "owen.becker@northwindenergy.example.com", status: "responded", addedDaysAgo: 14, respondedDaysAgo: 11 }, + { lead: "sara.lopez@heliossolar.example.com", status: "sent", addedDaysAgo: 14 }, + { lead: "leo.vance@cleancart.example.com", status: "unsubscribed", addedDaysAgo: 14 }, + { lead: "iris.okafor@pulsehealth.example.com", status: "sent", addedDaysAgo: 13 }, + { lead: "ravi.mehta@foundryrobotics.example.com", status: "sent", addedDaysAgo: 13 }, + { lead: "tess.brown@latticeeducation.example.com", status: "responded", addedDaysAgo: 13, respondedDaysAgo: 8 }, + { contact: "john.smith@acme.example.com", status: "responded", addedDaysAgo: 14, respondedDaysAgo: 10 }, + { contact: "ethan.brooks@vertex.example.com", status: "sent", addedDaysAgo: 14 }, + { contact: "priya.shah@lattice.example.com", status: "responded", addedDaysAgo: 14, respondedDaysAgo: 7 }, + { contact: "rwilson@wayne.example.com", status: "sent", addedDaysAgo: 13 } + ], + "Operations Platform Launch": [ + { lead: "jonas.holt@polarcargo.example.com", status: "responded", addedDaysAgo: 11, respondedDaysAgo: 6 }, + { lead: "anya.volkov@redoakrealty.example.com", status: "sent", addedDaysAgo: 11 }, + { lead: "theo.park@skylinemedia.example.com", status: "sent", addedDaysAgo: 11 }, + { lead: "wren.garcia@maplebakerygroup.example.com", status: "responded", addedDaysAgo: 10, respondedDaysAgo: 5 }, + { lead: "hugo.dubois@nimbusaerospace.example.com", status: "sent", addedDaysAgo: 10 }, + { contact: "rwilson@wayne.example.com", status: "responded", addedDaysAgo: 11, respondedDaysAgo: 7 }, + { contact: "marcus.reed@apexlogistics.example.com", status: "sent", addedDaysAgo: 11 }, + { contact: "olivia.chen@northwind.example.com", status: "sent", addedDaysAgo: 10 }, + { contact: "sarah.j@globex.example.com", status: "sent", addedDaysAgo: 10 } + ], + "Developer Content Marketing Push": [ + { lead: "lena.fischer@graniteinsurance.example.com", status: "responded", addedDaysAgo: 33, respondedDaysAgo: 27 }, + { lead: "kai.watanabe@coralreefhotels.example.com", status: "sent", addedDaysAgo: 33 }, + { lead: "mira.costa@atlasconstruction.example.com", status: "unsubscribed", addedDaysAgo: 33 }, + { lead: "pia.anand@citrinefinance.example.com", status: "responded", addedDaysAgo: 32, respondedDaysAgo: 24 }, + { lead: "marco.ricci@auroratravel.example.com", status: "sent", addedDaysAgo: 32 }, + { lead: "lisa.t@cloudfirst.example.com", status: "responded", addedDaysAgo: 30, respondedDaysAgo: 21 }, + { contact: "ethan.brooks@vertex.example.com", status: "responded", addedDaysAgo: 33, respondedDaysAgo: 19 }, + { contact: "mchen@initech.example.com", status: "sent", addedDaysAgo: 33 }, + { contact: "john.smith@acme.example.com", status: "sent", addedDaysAgo: 32 }, + { contact: "emily.d@starkmed.example.com", status: "sent", addedDaysAgo: 32 }, + { contact: "sarah.j@globex.example.com", status: "sent", addedDaysAgo: 30 } + ], + // Campaigns still in `planning` carry their invitation / registration list: + // the enrollment flow runs for `planning` and `in_progress` campaigns alike + // and stamps `sent` on enrollment, so a pre-launch target list looks exactly + // like this. + "Cloud Migration Webinar": [ + { lead: "dkim@edutechlabs.example.com", status: "sent", addedDaysAgo: 4 }, + { lead: "alice@nextgenretail.example.com", status: "sent", addedDaysAgo: 4 }, + { lead: "jonas.holt@polarcargo.example.com", status: "sent", addedDaysAgo: 3 }, + { lead: "anya.volkov@redoakrealty.example.com", status: "sent", addedDaysAgo: 3 }, + { contact: "mchen@initech.example.com", status: "sent", addedDaysAgo: 4 }, + { contact: "marcus.reed@apexlogistics.example.com", status: "sent", addedDaysAgo: 3 } + ], + "Executive AI Governance Roundtable": [ + { contact: "john.smith@acme.example.com", status: "sent", addedDaysAgo: 6 }, + { contact: "rwilson@wayne.example.com", status: "sent", addedDaysAgo: 6 }, + { contact: "ethan.brooks@vertex.example.com", status: "sent", addedDaysAgo: 5 }, + { contact: "priya.shah@lattice.example.com", status: "sent", addedDaysAgo: 5 }, + { contact: "emily.d@starkmed.example.com", status: "sent", addedDaysAgo: 5 } + ], + "Partner Operations Roadshow": [ + { lead: "maya.singh@bluepeaklogistics.example.com", status: "sent", addedDaysAgo: 7 }, + { lead: "ravi.mehta@foundryrobotics.example.com", status: "sent", addedDaysAgo: 7 }, + { contact: "marcus.reed@apexlogistics.example.com", status: "sent", addedDaysAgo: 6 }, + { contact: "olivia.chen@northwind.example.com", status: "sent", addedDaysAgo: 6 } + ], + "SaaSCon 2026 Trade Show": [ + { lead: "theo.park@skylinemedia.example.com", status: "sent", addedDaysAgo: 8 }, + { lead: "wren.garcia@maplebakerygroup.example.com", status: "sent", addedDaysAgo: 8 }, + { lead: "hugo.dubois@nimbusaerospace.example.com", status: "sent", addedDaysAgo: 7 }, + { lead: "marco.ricci@auroratravel.example.com", status: "sent", addedDaysAgo: 7 } + ] +}; +var campaignMetrics = (campaignName) => { + const members = CAMPAIGN_MEMBERS[campaignName] ?? []; + const leadKeys = new Set(members.map((m) => m.lead).filter((e) => Boolean(e))); + const convertedLeads = leads.records.filter( + (l) => typeof l.email === "string" && leadKeys.has(l.email) && l.is_converted === true + ).length; + const attributed = opportunities.records.filter((o) => o.crm_campaign === campaignName); + const won = attributed.filter((o) => o.stage === "closed_won"); + return { + // "Total members enrolled" — campaign.hook.ts's single definition of num_sent. + num_sent: members.length, + // `responded` or `converted`, as in `computeCampaignMetrics`. The seed set + // holds no `converted` member (see the note on CAMPAIGN_MEMBERS), so the + // two predicates coincide on this data — spelled the narrow way because + // widening it here would suggest a seeded state that does not exist. + num_responses: members.filter((m) => m.status === "responded").length, + num_leads: leadKeys.size, + num_converted_leads: convertedLeads, + num_opportunities: attributed.length, + num_won_opportunities: won.length, + actual_revenue: won.reduce((sum, o) => sum + (typeof o.amount === "number" ? o.amount : 0), 0) + }; +}; +var campaigns = defineSeed8(Campaign, { + mode: "upsert", + externalId: "name", + records: [ + { + name: "Q3 Enterprise Email Nurture", + description: "Multi-touch nurture for enterprise IT decision makers evaluating AI governance and analytics.", + type: "email", + channel: "email", + status: "in_progress", + start_date: cel36`daysAgo(15)`, + end_date: cel36`daysFromNow(21)`, + budgeted_cost: 28e3, + actual_cost: 14e3, + expected_revenue: 56e4, + target_size: 5e3, + ...campaignMetrics("Q3 Enterprise Email Nurture"), + landing_page_url: "https://acme.example.com/lp/enterprise-q3", + is_active: true + }, + { + name: "Executive AI Governance Roundtable", + description: "A live executive roundtable on operating AI agents with governance, auditability and trust.", + type: "conference", + channel: "events", + status: "planning", + start_date: cel36`daysFromNow(2)`, + end_date: cel36`daysFromNow(3)`, + budgeted_cost: 22e3, + expected_revenue: 32e4, + target_size: 120, + ...campaignMetrics("Executive AI Governance Roundtable"), + is_active: true + }, + { + name: "Cloud Migration Webinar", + description: "A technical webinar on modernizing customer operations and data workflows in the cloud.", + type: "webinar", + channel: "digital", + status: "planning", + start_date: cel36`daysFromNow(6)`, + end_date: cel36`daysFromNow(8)`, + budgeted_cost: 18e3, + expected_revenue: 36e4, + target_size: 1500, + ...campaignMetrics("Cloud Migration Webinar"), + landing_page_url: "https://acme.example.com/webinars/cloud-migration", + is_active: true + }, + { + name: "Operations Platform Launch", + description: "Launch campaign for the operations platform, pairing product content with customer proof points.", + type: "content", + channel: "digital", + status: "in_progress", + // Was `daysFromNow(12)` — an `in_progress` campaign that had not started + // yet, which no attribution can be consistent with (#591). + start_date: cel36`daysAgo(12)`, + end_date: cel36`daysFromNow(14)`, + budgeted_cost: 36e3, + actual_cost: 12e3, + expected_revenue: 48e4, + target_size: 8e3, + ...campaignMetrics("Operations Platform Launch"), + landing_page_url: "https://acme.example.com/launch/operations-platform", + is_active: true + }, + { + name: "Partner Operations Roadshow", + description: "Joint regional sessions with strategic partners for operations and IT leaders.", + type: "partner", + channel: "partner", + status: "planning", + start_date: cel36`daysFromNow(19)`, + end_date: cel36`daysFromNow(22)`, + budgeted_cost: 48e3, + expected_revenue: 72e4, + target_size: 600, + ...campaignMetrics("Partner Operations Roadshow"), + is_active: true + }, + { + name: "SaaSCon 2026 Trade Show", + description: "A focused booth, executive dinner and customer-story program at the SaaSCon industry conference.", + type: "trade_show", + channel: "events", + status: "planning", + start_date: cel36`daysFromNow(27)`, + end_date: cel36`daysFromNow(30)`, + budgeted_cost: 75e3, + expected_revenue: 12e5, + target_size: 3e3, + ...campaignMetrics("SaaSCon 2026 Trade Show"), + is_active: true + }, + { + name: "Developer Content Marketing Push", + description: "Technical blog posts, video tutorials and developer community engagement completed last month.", + type: "content", + channel: "digital", + status: "completed", + start_date: cel36`daysAgo(35)`, + end_date: cel36`daysAgo(4)`, + budgeted_cost: 4e4, + actual_cost: 25e3, + expected_revenue: 25e4, + target_size: 1e4, + ...campaignMetrics("Developer Content Marketing Push"), + landing_page_url: "https://acme.example.com/developers", + is_active: true + } + ] +}); +var memberRecords = (kind) => Object.entries(CAMPAIGN_MEMBERS).flatMap( + ([campaign, members]) => members.filter((m) => kind === "lead" ? m.lead : m.contact).map((m) => ({ + crm_campaign: campaign, + ...kind === "lead" ? { crm_lead: m.lead } : { crm_contact: m.contact }, + status: m.status, + added_date: celDaysAgo(m.addedDaysAgo), + // `has_responded` / `response_date` track the `responded` status + // exactly — a responded member with no response date is a shape the + // response-tracking surfaces cannot render. + has_responded: m.status === "responded", + ...m.respondedDaysAgo !== void 0 ? { response_date: celDaysAgo(m.respondedDaysAgo) } : {} + })) +); +var campaignMembersFromLeads = defineSeed8(CampaignMember, { + mode: "upsert", + externalId: ["crm_campaign", "crm_lead"], + records: memberRecords("lead") +}); +var campaignMembersFromContacts = defineSeed8(CampaignMember, { + mode: "upsert", + externalId: ["crm_campaign", "crm_contact"], + records: memberRecords("contact") +}); + +// objectstack.composition.ts +var byExportName = (merged) => Object.entries(merged).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([, value]) => value); +var appHooks = [ + account_hook_default, + campaign_hook_default, + opportunity_campaign_metrics_hook_default, + lead_campaign_metrics_hook_default, + campaign_member_hook_default, + contact_hook_default, + contract_hook_default, + event_hook_default, + forecast_hook_default, + lead_hook_default, + opportunity_hook_default, + opportunity_line_item_hook_default, + product_hook_default, + quote_hook_default, + quote_line_item_hook_default, + task_hook_default +].flatMap((entry) => Array.isArray(entry) ? entry : [entry]); +var appFlows = [ + CampaignEnrollmentFlow, + CampaignLeadMemberEnrollFlow, + CampaignContactMemberEnrollFlow, + AccountApprovalFlow, + LeadConversionFlow, + LeadConversionApprovalFlow, + ScheduleFollowUpFlow, + OpportunityApprovalFlow, + OpportunityApprovalOnCreateFlow, + OpportunityStatusChangeApprovalFlow, + OpportunityQualificationApprovalFlow, + QuoteGenerationFlow, + ContractRenewalFlow, + OpportunityStagnationFlow, + ForecastSnapshotFlow, + LeadAssignmentFlow, + CampaignCompletionFlow, + QuoteExpirationFlow, + ContractExpirationFlow, + ContactWelcomeFlow, + OpportunityWonAlertFlow, + TaskUrgentAlertFlow, + TaskDueReminderFlow, + BillingHandoffClosedWonFlow, + BillingHandoffContractActivatedFlow +]; +var appSkills = [ + LeadQualificationSkill, + EmailDraftingSkill, + RevenueForecastingSkill, + Customer360Skill, + LiveDataSkill +]; +var appObjects = byExportName({ + ...objects_exports2, + ...objects_exports3, + ...objects_exports4 +}); +var appActions = byExportName({ ...actions_exports, ...actions_exports2 }); +var appDashboards = byExportName({ ...dashboards_exports }); +var appDatasets = byExportName({ ...datasets_exports, ...datasets_exports2 }); +var appReports = byExportName({ ...reports_exports }); +var appViews = byExportName({ + ...views_exports, + ...views_exports2, + ...views_exports3 +}); +var appPages = byExportName({ ...pages_exports }); +var appMappings = byExportName({ ...mappings_exports }); +var appApps = byExportName({ ...apps_exports }); +var appTranslations = byExportName({ ...translations_exports }); +var appEmailTemplates = byExportName({ + ...email_templates_exports, + ...email_templates_exports2 +}).flat(); +var allProfiles = profiles_exports; +var appSharingRules = [ + AccountTeamSharingRule, + OpportunitySalesSharingRule, + OpportunityExecutiveSharingRule, + ...TerritorySharingRules, + ...CampaignLeadershipSharingRules +]; +var allHooks = [...appHooks, ...serviceHooks]; +var allFlows = [...appFlows, ...serviceFlows]; +var allSkills = [...appSkills, ...serviceSkills]; +var CrmSharingRules = [...appSharingRules, ...serviceSharingRules]; +var CrmSeedData = [ + accounts, + contacts, + leads, + opportunities, + products, + opportunityLineItems, + tasks, + cases, + // Events come after the five objects their `related_to_*` lookups resolve + // against (accounts, contacts, leads, opportunities, cases); the attendee + // junctions come after the events they hang off. + events, + eventAttendeesFromContacts, + eventAttendeesFromLeads, + leadInteractionPointers, + campaigns, + campaignMembersFromLeads, + campaignMembersFromContacts, + contracts, + quotes, + quoteLineItems, + forecasts, + knowledgeArticles +]; +var SaasTenantSeedData = [products]; +var ServiceSeedData = [cases, knowledgeArticles]; +var AppSeedData = CrmSeedData.filter((family) => !ServiceSeedData.includes(family)); +var seedDataFor = (composition2) => composition2 === "saas" ? { app: SaasTenantSeedData, service: [] } : { app: AppSeedData, service: ServiceSeedData }; +var composition = resolveComposition(); +var isSaas = composition === "saas"; +var seedData = seedDataFor(composition); +var compositionPermissions = isSaas ? [...Object.values(allProfiles).filter((set) => set !== SystemAdminProfile), TenantAdminProfile] : Object.values(allProfiles); +var serviceStack = createHotCrmServiceStack({ data: seedData.service }); +var appStack = createHotCrmAppStack( + { + objects: appObjects, + actions: appActions, + dashboards: appDashboards, + datasets: appDatasets, + reports: appReports, + // Reusable import projections (#603). Referenced by name from the import + // endpoint — `mappingName: 'crm_account_import'` — so a customer's own + // spreadsheet loads without per-column mapping by hand. Templates: + // `assets/import-templates/`. + mappings: appMappings, + flows: appFlows, + skills: appSkills, + permissions: compositionPermissions, + apps: appApps, + views: appViews, + pages: appPages, + // Approvals are modeled as `record_change` flows with `approval` nodes + // (ADR-0019); see src/sales/flows/opportunity-approval.flow.ts. The + // standalone `approvals` stack field was removed in ObjectStack 7.4. + // No `analyticsCubes`: datasets (ADR-0021) are the semantic layer — the + // analytics service compiles each dataset into its cube internally, and a + // second hand-written cube layer only duplicates and drifts. + hooks: appHooks, + data: seedData.app, + translations: appTranslations, + // The localizable content path for `notify` (#9205). A node names a template + // and supplies its `templateData`; the delivery path resolves + // `(name, locale)` against these rows PER RECIPIENT, after fan-out — the + // recipient's own `sys_user.locale` when set, else `i18n.defaultLocale` — + // so two people on one notification can read it in two languages. + emailTemplates: appEmailTemplates, + sharingRules: appSharingRules, + // ADR-0090 D3: positions are flat capability-distribution groups — the v1 + // role hierarchy's parent links are gone (hierarchy belongs to the + // business-unit tree, which this app does not model). + positions: CrmPositions + }, + { artifactObjects: (serviceStack.objects ?? []).map((object) => object.name) } +); + +// objectstack.config.ts +var objectstack_config_default = composeStacks([serviceStack, appStack], { manifest: "preserve" }); +export { + objectstack_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsib2JqZWN0c3RhY2suY29uZmlnLnRzIiwgInNyYy9zYWxlcy9pbmRleC50cyIsICJzcmMvc2VydmljZS9pbmRleC50cyIsICJzcmMvc2VydmljZS9hY3Rpb25zL2Nhc2UuYWN0aW9ucy50cyIsICJzcmMvc2VydmljZS9vYmplY3RzL2luZGV4LnRzIiwgInNyYy9zZXJ2aWNlL29iamVjdHMvYXJ0aWNsZV9mZWVkYmFjay5vYmplY3QudHMiLCAic3JjL3NlcnZpY2Uvb2JqZWN0cy9jYXNlLm9iamVjdC50cyIsICJzcmMvc2VydmljZS9vYmplY3RzL2tub3dsZWRnZV9hcnRpY2xlLm9iamVjdC50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9pbmRleC50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9hY2NvdW50Lm9iamVjdC50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9fcGlja2xpc3RzLnRzIiwgInNyYy9zYWxlcy9vYmplY3RzL190ZXJyaXRvcnkudHMiLCAic3JjL3NhbGVzL29iamVjdHMvY29udGFjdC5vYmplY3QudHMiLCAic3JjL3NhbGVzL29iamVjdHMvZXZlbnQub2JqZWN0LnRzIiwgInNyYy9zYWxlcy9vYmplY3RzL2V2ZW50X2F0dGVuZGVlLm9iamVjdC50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9mb3JlY2FzdC5vYmplY3QudHMiLCAic3JjL3NhbGVzL29iamVjdHMvbGVhZC5vYmplY3QudHMiLCAic3JjL3NhbGVzL29iamVjdHMvb3Bwb3J0dW5pdHkub2JqZWN0LnRzIiwgInNyYy9zYWxlcy9vYmplY3RzL3Rhc2sub2JqZWN0LnRzIiwgInNyYy9zYWxlcy9hY3Rpb25zL2FjdGl2aXR5LWFjdGlvbnMudHMiLCAic3JjL3NlcnZpY2UvYWN0aW9ucy9jYXNlLWFjdGl2aXR5LmFjdGlvbnMudHMiLCAic3JjL3NlcnZpY2UvYWN0aW9ucy9rbm93bGVkZ2VfYXJ0aWNsZS5hY3Rpb25zLnRzIiwgInNyYy9zZXJ2aWNlL2Rhc2hib2FyZHMvc2VydmljZS5kYXNoYm9hcmQudHMiLCAic3JjL3NlcnZpY2UvZGF0YXNldHMvY2FzZS5kYXRhc2V0LnRzIiwgInNyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvX2J1bmRsZS50cyIsICJzcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXMvZW4udHMiLCAic3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzL3poLUNOLnRzIiwgInNyYy9zZXJ2aWNlL2VtYWlsLXRlbXBsYXRlcy9qYS1KUC50cyIsICJzcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXMvZXMtRVMudHMiLCAic3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzL2NybS5lbWFpbC10ZW1wbGF0ZS50cyIsICJzcmMvc2VydmljZS9mbG93cy9jYXNlLWVzY2FsYXRpb24uZmxvdy50cyIsICJzcmMvc2VydmljZS9mbG93cy9jYXNlLWFjdGlvbnMuZmxvdy50cyIsICJzcmMvc2VydmljZS9vYmplY3RzL19jYXNlLWFzc2lnbm1lbnQudHMiLCAic3JjL3NlcnZpY2UvZmxvd3MvY2FzZS1lc2NhbGF0aW9uLXN0YW1wLmZsb3cudHMiLCAic3JjL3NlcnZpY2UvZmxvd3MvY2FzZS1zbGEtbW9uaXRvci5mbG93LnRzIiwgInNyYy9zYWxlcy9mbG93cy9fZ3VhcmRlZC1pdGVyYXRpb24udHMiLCAic3JjL3NlcnZpY2Uvb2JqZWN0cy9hcnRpY2xlX2ZlZWRiYWNrLmhvb2sudHMiLCAic3JjL3NlcnZpY2Uvb2JqZWN0cy9jYXNlLmhvb2sudHMiLCAic3JjL3NlcnZpY2Uvb2JqZWN0cy9rbm93bGVkZ2VfYXJ0aWNsZS5ob29rLnRzIiwgInNyYy9zZXJ2aWNlL3BhZ2VzL2Nhc2VfZGV0YWlsLnBhZ2UudHMiLCAic3JjL3NlcnZpY2UvcmVwb3J0cy9jYXNlLnJlcG9ydC50cyIsICJzcmMvc2VydmljZS9zaGFyaW5nL2Nhc2Uuc2hhcmluZy50cyIsICJzcmMvc2VydmljZS9za2lsbHMvY2FzZS10cmlhZ2Uuc2tpbGwudHMiLCAic3JjL3NlcnZpY2Uvdmlld3MvY2FzZS52aWV3LnRzIiwgInNyYy9zZXJ2aWNlL3ZpZXdzL2tub3dsZWRnZV9hcnRpY2xlLnZpZXcudHMiLCAic3JjL3JldmVudWUvb2JqZWN0cy9pbmRleC50cyIsICJzcmMvcmV2ZW51ZS9vYmplY3RzL2NvbnRyYWN0Lm9iamVjdC50cyIsICJzcmMvcmV2ZW51ZS9vYmplY3RzL29wcG9ydHVuaXR5X2xpbmVfaXRlbS5vYmplY3QudHMiLCAic3JjL3JldmVudWUvb2JqZWN0cy9wcm9kdWN0Lm9iamVjdC50cyIsICJzcmMvcmV2ZW51ZS9vYmplY3RzL3F1b3RlLm9iamVjdC50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9fdGhyZXNob2xkcy50cyIsICJzcmMvcmV2ZW51ZS9vYmplY3RzL3F1b3RlX2xpbmVfaXRlbS5vYmplY3QudHMiLCAic3JjL21hcmtldGluZy9vYmplY3RzL2luZGV4LnRzIiwgInNyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbi5vYmplY3QudHMiLCAic3JjL21hcmtldGluZy9vYmplY3RzL2NhbXBhaWduX21lbWJlci5vYmplY3QudHMiLCAic3JjL3NhbGVzL2FjdGlvbnMvaW5kZXgudHMiLCAic3JjL3NhbGVzL2FjdGlvbnMvY29udGFjdC5hY3Rpb25zLnRzIiwgInNyYy9zYWxlcy9hY3Rpb25zL2xlYWQuYWN0aW9ucy50cyIsICJzcmMvc2FsZXMvYWN0aW9ucy9vcHBvcnR1bml0eS5hY3Rpb25zLnRzIiwgInNyYy9tYXJrZXRpbmcvYWN0aW9ucy9pbmRleC50cyIsICJzcmMvbWFya2V0aW5nL2FjdGlvbnMvY2FtcGFpZ24uYWN0aW9ucy50cyIsICJzcmMvc2FsZXMvZGFzaGJvYXJkcy9pbmRleC50cyIsICJzcmMvc2FsZXMvZGFzaGJvYXJkcy9hY3Rpdml0eS5kYXNoYm9hcmQudHMiLCAic3JjL3NhbGVzL2Rhc2hib2FyZHMvc2hhcmVkLXdpZGdldHMudHMiLCAic3JjL3NhbGVzL2Rhc2hib2FyZHMvY3JtLmRhc2hib2FyZC50cyIsICJzcmMvc2FsZXMvZGFzaGJvYXJkcy9leGVjdXRpdmUuZGFzaGJvYXJkLnRzIiwgInNyYy9zYWxlcy9kYXNoYm9hcmRzL3NhbGVzLmRhc2hib2FyZC50cyIsICJzcmMvc2FsZXMvZGF0YXNldHMvaW5kZXgudHMiLCAic3JjL3NhbGVzL2RhdGFzZXRzL29wcG9ydHVuaXR5LmRhdGFzZXQudHMiLCAic3JjL3NhbGVzL2RhdGFzZXRzL2FjY291bnQuZGF0YXNldC50cyIsICJzcmMvc2FsZXMvZGF0YXNldHMvY29udGFjdC5kYXRhc2V0LnRzIiwgInNyYy9zYWxlcy9kYXRhc2V0cy9sZWFkLmRhdGFzZXQudHMiLCAic3JjL3NhbGVzL2RhdGFzZXRzL3Rhc2suZGF0YXNldC50cyIsICJzcmMvc2FsZXMvZGF0YXNldHMvZXZlbnQuZGF0YXNldC50cyIsICJzcmMvc2FsZXMvZGF0YXNldHMvZm9yZWNhc3QuZGF0YXNldC50cyIsICJzcmMvcmV2ZW51ZS9kYXRhc2V0cy9pbmRleC50cyIsICJzcmMvcmV2ZW51ZS9kYXRhc2V0cy9wcm9kdWN0LmRhdGFzZXQudHMiLCAic3JjL3NhbGVzL3JlcG9ydHMvaW5kZXgudHMiLCAic3JjL3NhbGVzL3JlcG9ydHMvYWNjb3VudC5yZXBvcnQudHMiLCAic3JjL3NhbGVzL3JlcG9ydHMvbGVhZC5yZXBvcnQudHMiLCAic3JjL3NhbGVzL3JlcG9ydHMvb3Bwb3J0dW5pdHkucmVwb3J0LnRzIiwgInNyYy9zYWxlcy9yZXBvcnRzL2NodXJuLnJlcG9ydC50cyIsICJzcmMvc2FsZXMvbWFwcGluZ3MvaW5kZXgudHMiLCAic3JjL3NhbGVzL21hcHBpbmdzL2FjY291bnRfaW1wb3J0Lm1hcHBpbmcudHMiLCAic3JjL3NhbGVzL21hcHBpbmdzL19zaGFyZWQudHMiLCAic3JjL3NhbGVzL21hcHBpbmdzL2NvbnRhY3RfaW1wb3J0Lm1hcHBpbmcudHMiLCAic3JjL3NhbGVzL21hcHBpbmdzL2xlYWRfaW1wb3J0Lm1hcHBpbmcudHMiLCAic3JjL3NhbGVzL2FwcHMvaW5kZXgudHMiLCAic3JjL3NhbGVzL2FwcHMvY3JtLmFwcC50cyIsICJzcmMvc2FsZXMvcHJvZmlsZXMvaW5kZXgudHMiLCAic3JjL3NhbGVzL3Byb2ZpbGVzL2d1ZXN0LXBvcnRhbC5wcm9maWxlLnRzIiwgInNyYy9zYWxlcy9wcm9maWxlcy9tYXJrZXRpbmctdXNlci5wcm9maWxlLnRzIiwgInNyYy9zYWxlcy9wcm9maWxlcy9zYWxlcy1tYW5hZ2VyLnByb2ZpbGUudHMiLCAic3JjL3NhbGVzL3Byb2ZpbGVzL3NhbGVzLXJlcC5wcm9maWxlLnRzIiwgInNyYy9zYWxlcy9wcm9maWxlcy9zZXJ2aWNlLWFnZW50LnByb2ZpbGUudHMiLCAic3JjL3NhbGVzL3Byb2ZpbGVzL3N5c3RlbS1hZG1pbi5wcm9maWxlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvaW5kZXgudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9hcHAudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9fc2hhcmVkLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vb2JqZWN0cy5jdXN0b21lci50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuL29iamVjdHMucGlwZWxpbmUudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9vYmplY3RzLmNvbW1lcmNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vb2JqZWN0cy5zZXJ2aWNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vb2JqZWN0cy5hY3Rpdml0eS50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuL29iamVjdHMubWFya2V0aW5nLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4udHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9hcHAudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9fc2hhcmVkLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vb2JqZWN0cy5jdXN0b21lci50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOL29iamVjdHMucGlwZWxpbmUudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9vYmplY3RzLmNvbW1lcmNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vb2JqZWN0cy5zZXJ2aWNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vb2JqZWN0cy5hY3Rpdml0eS50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOL29iamVjdHMubWFya2V0aW5nLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04udHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9hcHAudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9fc2hhcmVkLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5jdXN0b21lci50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQL29iamVjdHMucGlwZWxpbmUudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9vYmplY3RzLmNvbW1lcmNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5zZXJ2aWNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5hY3Rpdml0eS50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQL29iamVjdHMubWFya2V0aW5nLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy9hcHAudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy9fc2hhcmVkLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvb2JqZWN0cy5jdXN0b21lci50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL29iamVjdHMucGlwZWxpbmUudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy9vYmplY3RzLmNvbW1lcmNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvb2JqZWN0cy5zZXJ2aWNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvb2JqZWN0cy5hY3Rpdml0eS50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL29iamVjdHMubWFya2V0aW5nLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9jcm0udHJhbnNsYXRpb24udHMiLCAic3JjL3NhbGVzL3ZpZXdzL2luZGV4LnRzIiwgInNyYy9zYWxlcy92aWV3cy9sZWFkLnZpZXcudHMiLCAic3JjL3NhbGVzL3ZpZXdzL2FjY291bnQudmlldy50cyIsICJzcmMvc2FsZXMvdmlld3MvY29udGFjdC52aWV3LnRzIiwgInNyYy9zYWxlcy92aWV3cy9vcHBvcnR1bml0eS52aWV3LnRzIiwgInNyYy9zYWxlcy92aWV3cy90YXNrLnZpZXcudHMiLCAic3JjL3NhbGVzL3ZpZXdzL2V2ZW50LnZpZXcudHMiLCAic3JjL3NhbGVzL3ZpZXdzL2V2ZW50X2F0dGVuZGVlLnZpZXcudHMiLCAic3JjL3NhbGVzL3ZpZXdzL2ZvcmVjYXN0LnZpZXcudHMiLCAic3JjL3JldmVudWUvdmlld3MvaW5kZXgudHMiLCAic3JjL3JldmVudWUvdmlld3MvY29udHJhY3Qudmlldy50cyIsICJzcmMvcmV2ZW51ZS92aWV3cy9wcm9kdWN0LnZpZXcudHMiLCAic3JjL3JldmVudWUvdmlld3MvcXVvdGUudmlldy50cyIsICJzcmMvbWFya2V0aW5nL3ZpZXdzL2luZGV4LnRzIiwgInNyYy9tYXJrZXRpbmcvdmlld3MvY2FtcGFpZ24udmlldy50cyIsICJzcmMvc2FsZXMvcGFnZXMvaW5kZXgudHMiLCAic3JjL3NhbGVzL3BhZ2VzL2xlYWRfZGV0YWlsLnBhZ2UudHMiLCAic3JjL3NhbGVzL3BhZ2VzL29wcG9ydHVuaXR5X2RldGFpbC5wYWdlLnRzIiwgInNyYy9zYWxlcy9wYWdlcy9hY2NvdW50X2RldGFpbC5wYWdlLnRzIiwgInNyYy9zYWxlcy9wYWdlcy9hY2NvdW50X3dvcmtiZW5jaC5wYWdlLnRzIiwgInNyYy9zYWxlcy9wYWdlcy9ob21lLnBhZ2UudHMiLCAic3JjL3NhbGVzL3BhZ2VzL2FwcF9sYXVuY2hlci5wYWdlLnRzIiwgInNyYy9zYWxlcy9wYWdlcy91dGlsaXR5X2Jhci5wYWdlLnRzIiwgInNyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvaW5kZXgudHMiLCAic3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9lbi50cyIsICJzcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzL3poLUNOLnRzIiwgInNyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvamEtSlAudHMiLCAic3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9lcy1FUy50cyIsICJzcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzL2NybS5lbWFpbC10ZW1wbGF0ZS50cyIsICJzcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXMvaW5kZXgudHMiLCAic3JjL3JldmVudWUvZW1haWwtdGVtcGxhdGVzL2VuLnRzIiwgInNyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlcy96aC1DTi50cyIsICJzcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXMvamEtSlAudHMiLCAic3JjL3JldmVudWUvZW1haWwtdGVtcGxhdGVzL2VzLUVTLnRzIiwgInNyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlcy9jcm0uZW1haWwtdGVtcGxhdGUudHMiLCAic3JjL3NhbGVzL3Byb2ZpbGVzL3RlbmFudC1hZG1pbi5wcm9maWxlLnRzIiwgInNyYy9zYWxlcy9vYmplY3RzL2FjY291bnQuaG9vay50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9jb250YWN0Lmhvb2sudHMiLCAic3JjL3NhbGVzL29iamVjdHMvZXZlbnQuaG9vay50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9mb3JlY2FzdC5ob29rLnRzIiwgInNyYy9zYWxlcy9vYmplY3RzL2xlYWQuaG9vay50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9sZWFkLmNhbXBhaWduLW1ldHJpY3MuaG9vay50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9vcHBvcnR1bml0eS5ob29rLnRzIiwgInNyYy9zYWxlcy9vYmplY3RzL29wcG9ydHVuaXR5LmNhbXBhaWduLW1ldHJpY3MuaG9vay50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy90YXNrLmhvb2sudHMiLCAic3JjL3JldmVudWUvb2JqZWN0cy9jb250cmFjdC5ob29rLnRzIiwgInNyYy9yZXZlbnVlL29iamVjdHMvX2xpbmUtaXRlbS1wcmljZS1maWxsLnRzIiwgInNyYy9yZXZlbnVlL29iamVjdHMvb3Bwb3J0dW5pdHlfbGluZV9pdGVtLmhvb2sudHMiLCAic3JjL3JldmVudWUvb2JqZWN0cy9wcm9kdWN0Lmhvb2sudHMiLCAic3JjL3JldmVudWUvb2JqZWN0cy9xdW90ZS5ob29rLnRzIiwgInNyYy9yZXZlbnVlL29iamVjdHMvcXVvdGVfbGluZV9pdGVtLmhvb2sudHMiLCAic3JjL21hcmtldGluZy9vYmplY3RzL2NhbXBhaWduLmhvb2sudHMiLCAic3JjL21hcmtldGluZy9vYmplY3RzL2NhbXBhaWduX21lbWJlci5ob29rLnRzIiwgInNyYy9zYWxlcy9mbG93cy9sZWFkLWNvbnZlcnNpb24uZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3MvbGVhZC1jb252ZXJzaW9uLWFwcHJvdmFsLmZsb3cudHMiLCAic3JjL3NhbGVzL2Zsb3dzL2FjY291bnQtYXBwcm92YWwuZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3Mvc2NoZWR1bGUtZm9sbG93dXAuZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3Mvb3Bwb3J0dW5pdHktYXBwcm92YWwuZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3Mvb3Bwb3J0dW5pdHktc3RhdHVzLWNoYW5nZS1hcHByb3ZhbC5mbG93LnRzIiwgInNyYy9zYWxlcy9mbG93cy9vcHBvcnR1bml0eS1xdWFsaWZpY2F0aW9uLWFwcHJvdmFsLmZsb3cudHMiLCAic3JjL3NhbGVzL2Zsb3dzL29wcG9ydHVuaXR5LXN0YWduYXRpb24uZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3MvZm9yZWNhc3Qtc25hcHNob3QuZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3MvbGVhZC1hc3NpZ25tZW50LmZsb3cudHMiLCAic3JjL3NhbGVzL2Zsb3dzL2NvbnRhY3Qtd2VsY29tZS5mbG93LnRzIiwgInNyYy9zYWxlcy9mbG93cy9vcHBvcnR1bml0eS13b24tYWxlcnQuZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3MvdGFzay11cmdlbnQtYWxlcnQuZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3MvdGFzay1kdWUtcmVtaW5kZXIuZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3MvYmlsbGluZy1oYW5kb2ZmLWNsb3NlZC13b24uZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3MvX2JpbGxpbmctZW5kcG9pbnQudHMiLCAic3JjL3JldmVudWUvZmxvd3MvcXVvdGUtZ2VuZXJhdGlvbi5mbG93LnRzIiwgInNyYy9yZXZlbnVlL2Zsb3dzL2NvbnRyYWN0LXJlbmV3YWwuZmxvdy50cyIsICJzcmMvcmV2ZW51ZS9mbG93cy9xdW90ZS1leHBpcmF0aW9uLmZsb3cudHMiLCAic3JjL3JldmVudWUvZmxvd3MvY29udHJhY3QtZXhwaXJhdGlvbi5mbG93LnRzIiwgInNyYy9yZXZlbnVlL2Zsb3dzL2JpbGxpbmctaGFuZG9mZi1jb250cmFjdC1hY3RpdmF0ZWQuZmxvdy50cyIsICJzcmMvbWFya2V0aW5nL2Zsb3dzL2NhbXBhaWduLWVucm9sbG1lbnQuZmxvdy50cyIsICJzcmMvbWFya2V0aW5nL2Zsb3dzL2NhbXBhaWduLW1lbWJlci1lbnJvbGwuZmxvdy50cyIsICJzcmMvbWFya2V0aW5nL2Zsb3dzL2NhbXBhaWduLWNvbXBsZXRpb24uZmxvdy50cyIsICJzcmMvc2FsZXMvc2tpbGxzL2xlYWQtcXVhbGlmaWNhdGlvbi5za2lsbC50cyIsICJzcmMvc2FsZXMvc2tpbGxzL2VtYWlsLWRyYWZ0aW5nLnNraWxsLnRzIiwgInNyYy9zYWxlcy9za2lsbHMvcmV2ZW51ZS1mb3JlY2FzdGluZy5za2lsbC50cyIsICJzcmMvc2FsZXMvc2tpbGxzL2N1c3RvbWVyLTM2MC5za2lsbC50cyIsICJzcmMvc2FsZXMvc2tpbGxzL2xpdmUtZGF0YS5za2lsbC50cyIsICJzcmMvc2FsZXMvc2hhcmluZy9hY2NvdW50LnNoYXJpbmcudHMiLCAic3JjL3NhbGVzL3NoYXJpbmcvb3Bwb3J0dW5pdHkuc2hhcmluZy50cyIsICJzcmMvc2FsZXMvc2hhcmluZy9wb3NpdGlvbnMudHMiLCAic3JjL21hcmtldGluZy9zaGFyaW5nL2NhbXBhaWduLnNoYXJpbmcudHMiLCAic3JjL3NhbGVzL2RhdGEvc2FsZXMuc2VlZC50cyIsICJzcmMvc2FsZXMvZGF0YS9fc2hhcmVkLnRzIiwgInNyYy9zYWxlcy9kYXRhL2FjdGl2aXR5LnNlZWQudHMiLCAic3JjL3NhbGVzL2RhdGEvZm9yZWNhc3Quc2VlZC50cyIsICJzcmMvc2FsZXMvZGF0YS9pbmRleC50cyIsICJzcmMvcmV2ZW51ZS9kYXRhL2NhdGFsb2cuc2VlZC50cyIsICJzcmMvcmV2ZW51ZS9kYXRhL29wcG9ydHVuaXR5LWxpbmUtaXRlbS5zZWVkLnRzIiwgInNyYy9yZXZlbnVlL2RhdGEvcmV2ZW51ZS5zZWVkLnRzIiwgInNyYy9zZXJ2aWNlL2RhdGEvc2VydmljZS5zZWVkLnRzIiwgInNyYy9zZXJ2aWNlL29iamVjdHMvX2Nhc2Utc2xhLnRzIiwgInNyYy9tYXJrZXRpbmcvZGF0YS9tYXJrZXRpbmcuc2VlZC50cyIsICJvYmplY3RzdGFjay5jb21wb3NpdGlvbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L29iamVjdHN0YWNrLmNvbmZpZy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3XCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvb2JqZWN0c3RhY2suY29uZmlnLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBjb21wb3NlU3RhY2tzIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuXG4vLyBUaGUgdHdvIHBhY2thZ2Ugc3RhY2tzLCBidWlsdCBcdTIwMTQgc2VlIGBvYmplY3RzdGFjay5jb21wb3NpdGlvbi50c2AsIHdoaWNoIGFsc29cbi8vIHJlc29sdmVzIHRoZSBgSE9UQ1JNX0NPTVBPU0lUSU9OYCBrbm9iIGFuZCByZWNvcmRzIHdoeSB0aGF0IHdvcmsgY2Fubm90IGxpdmVcbi8vIGluIHRoaXMgZmlsZSAoXHUyNkQ0IHRoaXMgbW9kdWxlIG1heSBjYXJyeSBubyBuYW1lZCBleHBvcnQ6IHRoZSBidWlsZCBwYXJzZXMgaXRcbi8vIGFnYWluc3QgYSBgLnN0cmljdGAgc3RhY2sgc2NoZW1hIGFuZCBmYWlscyBvbiBhbnkga2V5IGJ1dCB0aGUgZGVmYXVsdCkuXG5pbXBvcnQgeyBzZXJ2aWNlU3RhY2ssIGFwcFN0YWNrIH0gZnJvbSAnLi9vYmplY3RzdGFjay5jb21wb3NpdGlvbi5qcyc7XG5cbi8qKlxuICogT05FIHJlbGVhc2UgYXJ0aWZhY3QsIFRXTyBwYWNrYWdlcyAoQURSLTAxMzAgRDQpLlxuICpcbiAqICAtIGBhcHAub2JqZWN0c3RhY2suaG90Y3JtYCAoYHNyYy9zYWxlcy9pbmRleC50c2ApIFx1MjAxNCB0aGUgYHR5cGU6ICdhcHAnYFxuICogICAgcGFja2FnZSBhIGN1c3RvbWVyIGluc3RhbGxzOiBzYWxlcywgcGx1cyB0aGUgYHNyYy9yZXZlbnVlL2AgYW5kXG4gKiAgICBgc3JjL21hcmtldGluZy9gIGRpcmVjdG9yaWVzIGl0IHN0aWxsIHJlZ2lzdGVycywgdGhlIGFwcCBhbmQgaXRzXG4gKiAgICBuYXZpZ2F0aW9uIGdyb3VwcywgdGhlIHBlcm1pc3Npb24gc2V0cywgdGhlIGxvY2FsZSBwYWNrcy5cbiAqICAtIGBhcHAub2JqZWN0c3RhY2suaG90Y3JtLnNlcnZpY2VgIChgc3JjL3NlcnZpY2UvaW5kZXgudHNgKSBcdTIwMTQgdGhlIHN1cHBvcnRcbiAqICAgIG1vZHVsZTogY2FzZXMgYW5kIGtub3dsZWRnZSwgYW5kIHRoZSBmaXZlIG5hdmlnYXRpb24gZW50cmllcyBpdFxuICogICAgY29udHJpYnV0ZXMgaW50byB0aGUgYXBwJ3MgZ3JvdXBzLlxuICpcbiAqIGBtYW5pZmVzdDogJ3ByZXNlcnZlJ2AgaXMgdGhlIG9ubHkgb3B0aW9uIHRoYXQgc2VwYXJhdGVzIFwib25lIGFydGlmYWN0XG4gKiBjYXJyeWluZyBOIHBhY2thZ2VzXCIgZnJvbSB0aGUgcGljay1vbmUgY29tcG9zaXRpb24gZXZlcnkgb3RoZXIgc3RyYXRlZ3lcbiAqIHBlcmZvcm1zLiBJdCBlbWl0cyBgcGFja2FnZXNbXWAsIG9uZSBlbnRyeSBwZXIgaW5wdXQgc3RhY2sgY2FycnlpbmcgdGhhdFxuICogcGFja2FnZSBBU1NFTUJMRUQgXHUyMDE0IGl0cyBtYW5pZmVzdCBwbHVzIHRoZSBjb2xsZWN0aW9ucyBpdCBvd25zLiBUaGF0IGxpc3QgaXNcbiAqIHdoYXQgYE9iamVjdFFMLnJlZ2lzdGVyQXBwYCByZWdpc3RlcnMgcGFja2FnZSBieSBwYWNrYWdlLCBhbmQgaXQgaXMgd2hlcmVcbiAqIHBlci1wYWNrYWdlIE9XTkVSU0hJUCBjb21lcyBmcm9tLiBFYWNoIGRlZmluaXRpb24gaXMgY2FycmllZCBPTkNFLCBpbiB0aGVcbiAqIGJvZHkgb2YgdGhlIHBhY2thZ2UgdGhhdCBvd25zIGl0OiBhIG11bHRpLXBhY2thZ2UgYXJ0aWZhY3QgaGFzIG5vIGZsYXR0ZW5lZFxuICogY29weSBvZiBpdHMgY29sbGVjdGlvbnMgYmVzaWRlIGBwYWNrYWdlc1tdYCAoQURSLTAxMzAgRDQsIDIwMjYtMDktMjJcbiAqIGFkZGVuZHVtKSwgc28gYSByZWFkZXIgd2FudGluZyBcImV2ZXJ5IG9iamVjdCBvZiB0aGUgYXBwXCIgcmVzb2x2ZXMgdGhlXG4gKiBwYWNrYWdlIGJvZGllcywgYXMgZXZlcnkgcGxhdGZvcm0gcmVhZGVyIGRvZXMuXG4gKlxuICogVGhlIEFwcCBwYWNrYWdlIGlzIExBU1QgZGVsaWJlcmF0ZWx5LCBhbmQgdGhhdCBpcyBub3QgdGhlIGxvYWQtYmVhcmluZyBoYWxmOlxuICpcbiAqICAtIHRoZSBzaW5ndWxhciBgbWFuaWZlc3RgIGlzIHN0aWxsIHBpY2tlZCBieSB0aGUgZGVmYXVsdCBgJ2xhc3QnYCBydWxlLCBzb1xuICogICAgdGhlIGFydGlmYWN0IGlkZW50aWZpZXMgYXMgdGhlIEFwcCBhIGNvbnN1bWVyIGluc3RhbGxzIChBRFItMDAxOSBEMSksXG4gKiAgICBgYXBwLm9iamVjdHN0YWNrLmhvdGNybWAsIG5vdCBhcyBvbmUgb2YgaXRzIG1vZHVsZXM7XG4gKiAgLSBSRUdJU1RSQVRJT04gb3JkZXIgaXMgZGVjaWRlZCBieSBgZGVwZW5kZW5jaWVzYCBcdTIwMTQgdGhlIHNlcnZpY2UgbW9kdWxlXG4gKiAgICBkZWNsYXJlcyBgYXBwLm9iamVjdHN0YWNrLmhvdGNybWAsIGFuZCBgcGFja2FnZXNbXWAgaXMgc29ydGVkIHRocm91Z2ggdGhlXG4gKiAgICBwbGF0Zm9ybSdzIG9uZSB0b3BvbG9naWNhbCBzb3J0ZXIgKEFEUi0wMTMwIEQ1LCBBRFItMDExNikgXHUyMDE0IHNvIHRoZSBhcHBcbiAqICAgIHJlZ2lzdGVycyBmaXJzdCB3aGF0ZXZlciBzbG90IGl0IG9jY3VwaWVzIGhlcmUuIEFuIGFydGlmYWN0IHRoYXQgb25seVxuICogICAgd29ya2VkIGJlY2F1c2Ugc29tZW9uZSBsaXN0ZWQgdGhlIHBhY2thZ2VzIGluIHRoZSByaWdodCBvcmRlciBpcyB0aGVcbiAqICAgIGZhaWx1cmUgQURSLTAxMTYgZXhpc3RzIGFib3V0LCBhbmQgaXQgZmFpbHMgU0lMRU5UTFkuXG4gKlxuICogYG9iamVjdHN0YWNrIGJ1aWxkYCBjb21waWxlcyB0aGlzIGZpbGUgaW50byBvbmUgYGRpc3Qvb2JqZWN0c3RhY2suanNvbmA7XG4gKiBgb2JqZWN0c3RhY2sgZGV2YCBib290cyB0aGUgc2FtZSBzaGFwZSBzdHJhaWdodCBmcm9tIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY29tcG9zZVN0YWNrcyhbc2VydmljZVN0YWNrLCBhcHBTdGFja10sIHsgbWFuaWZlc3Q6ICdwcmVzZXJ2ZScgfSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9pbmRleC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNiBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lU3RhY2ssIHR5cGUgT2JqZWN0U3RhY2tEZWZpbml0aW9uLCB0eXBlIE9iamVjdFN0YWNrRGVmaW5pdGlvbklucHV0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuXG4vKipcbiAqIEV2ZXJ5dGhpbmcgdGhlIGFwcCBwYWNrYWdlIFJFR0lTVEVSUywgYXMgb3Bwb3NlZCB0byB3aGF0IGl0IElTLlxuICpcbiAqIFRoZSBpZGVudGl0eSBrZXlzIGFyZSBub3QgaW4gaXQgYW5kIGNhbm5vdCBiZSBwYXNzZWQ6IGBtYW5pZmVzdGAsIGByZXF1aXJlc2BcbiAqIGFuZCBgaTE4bmAgYXJlIHRoaXMgcGFja2FnZSdzIG93biBzdGF0ZW1lbnQgYWJvdXQgaXRzZWxmLCBhbmQgYHBhY2thZ2VzYFxuICogYmVsb25ncyB0byB0aGUgYXJ0aWZhY3QgZW52ZWxvcGUgb25lIGxldmVsIHVwLlxuICovXG5leHBvcnQgdHlwZSBIb3RDcm1BcHBDb2xsZWN0aW9ucyA9IE9taXQ8XG4gIE9iamVjdFN0YWNrRGVmaW5pdGlvbklucHV0LFxuICAnbWFuaWZlc3QnIHwgJ3BhY2thZ2VzJyB8ICdyZXF1aXJlcycgfCAnaTE4bidcbj47XG5cbi8qKlxuICogYGFwcC5vYmplY3RzdGFjay5ob3Rjcm1gIFx1MjAxNCB0aGUgQXBwIHBhY2thZ2Ugb2YgdGhpcyBhcnRpZmFjdCwgYW5kIHRoZSBzYWxlc1xuICogbW9kdWxlIChBRFItMDEzMCBENCwgYG1vZHVsZS1zcGxpdC1wbGFuLm1kYCBkZWNpc2lvbiA0KS5cbiAqXG4gKiBBRFItMDAxOSByZXF1aXJlcyBleGFjdGx5IG9uZSBgdHlwZTogJ2FwcCdgIHBhY2thZ2UgcGVyIGFydGlmYWN0IGFuZCB0aGVcbiAqIGFydGlmYWN0IHRha2VzIGl0cyBpZGVudGl0eSBmcm9tIGl0OyBub3RoaW5nIHJlcXVpcmVzIHRoYXQgcGFja2FnZSB0byBiZSBhblxuICogZW1wdHkgc2hlbGwsIGFuZCB0aGUgcGxhdGZvcm0ncyBvd24gdHdvLXBhY2thZ2UgZml4dHVyZVxuICogKGBleGFtcGxlcy9hcHAtbXVsdGktcGFja2FnZWApIHNheXMgdGhlIG9wcG9zaXRlIFx1MjAxNCBpdHMgQXBwIHBhY2thZ2Ugb3ducyB0aGVcbiAqIGN1c3RvbWVyIG9iamVjdCBhbmQgdGhlIG5hdmlnYXRpb24uIFNvIHNhbGVzIElTIHRoZSBhcHA6IGl0IGtlZXBzIHRoZSBpZFxuICogYGFwcC5vYmplY3RzdGFjay5ob3Rjcm1gLCBvd25zIHRoZSBjdXN0b21lciBjb3JlIGFuZCB0aGUgYWN0aXZpdHkgb2JqZWN0cyxcbiAqIHRoZSBhcHAgYW5kIGl0cyBuYXZpZ2F0aW9uIEdST1VQUywgdGhlIGNyb3NzLWRvbWFpbiBkYXNoYm9hcmRzIGFuZCBza2lsbHMsXG4gKiB0aGUgcGVybWlzc2lvbiBzZXRzLCB0aGUgcG9zaXRpb25zLCB0aGUgZm91ciBsb2NhbGUgcGFja3MsIHRoZSBpbXBvcnRcbiAqIG1hcHBpbmdzLCBhbmQgZXZlcnkgc291cmNlIGZpbGUgbW9yZSB0aGFuIG9uZSBwYWNrYWdlIG5lZWRzLlxuICpcbiAqICMjIFdoeSB0aGlzIGZpbGUgdGFrZXMgaXRzIGNvbGxlY3Rpb25zIGluc3RlYWQgb2YgaW1wb3J0aW5nIHRoZW1cbiAqXG4gKiBgc3JjL3JldmVudWUvYCBhbmQgYHNyYy9tYXJrZXRpbmcvYCBhcmUgcGFja2FnZXMgaW4gdGhlIExBWU9VVCBidXQgbm90IHlldFxuICogcGFja2FnZXMgaW4gdGhlIEFSVElGQUNUIFx1MjAxNCB0aGUgcnVsaW5nIGFza2VkIGZvciBzYWxlcyBhbmQgc3VwcG9ydCBmaXJzdCBcdTIwMTQgc29cbiAqIHRoZSBhcHAgcGFja2FnZSByZWdpc3RlcnMgdGhlaXIgY29sbGVjdGlvbnMgZm9yIG5vdy4gQSBmaWxlIHVuZGVyXG4gKiBgc3JjL3NhbGVzL2AgbWF5IG5vdCBpbXBvcnQgZnJvbSBhIG1vZHVsZSBkaXJlY3RvcnkgKEFHRU5UUy5tZCAqUHJvamVjdFxuICogQXJjaGl0ZWN0dXJlKiBydWxlIDI6IG93biBkaXJlY3Rvcnkgb3IgYHNyYy9zYWxlcy9gLCBuZXZlciBzaWRld2F5cyksIHNvIHRoZVxuICogYXNzZW1ibHkgb2YgdGhvc2UgdHdvIGNhbm5vdCBoYXBwZW4gaGVyZS4gSXQgaGFwcGVucyBpblxuICogYG9iamVjdHN0YWNrLmNvbXBvc2l0aW9uLnRzYCwgdGhlIHJvb3QgbW9kdWxlIHRoYXQgaXMgYWxsb3dlZCB0byBzZWUgZXZlcnlcbiAqIHBhY2thZ2UuIFdoZW4gcmV2ZW51ZSBhbmQgbWFya2V0aW5nIGJlY29tZSBwYWNrYWdlcyBvZiB0aGVpciBvd24sIHRoZVxuICogYXJndW1lbnQgc2hyaW5rcyB0byB0aGUgc2FsZXMgYmFycmVscyBhbmQgdGhpcyBmaWxlIGNhbiBpbXBvcnQgdGhlbSBpdHNlbGYuXG4gKlxuICogIyMgYGFydGlmYWN0T2JqZWN0c2AgXHUyMDE0IHRoZSBwZXJtaXNzaW9uIHNldHMgc3RheSB3aG9sZSBoZXJlXG4gKlxuICogQURSLTAxMzAncyAyMDI2LTA5LTAyIGFkZGVuZHVtIGtlZXBzIGV2ZXJ5IHBlcm1pc3Npb24gc2V0IFdIT0xFIGluIHRoZVxuICogYHR5cGU6ICdhcHAnYCBwYWNrYWdlOiBhIHNldCBpcyBhdXRob3JlZCBwZXIgUk9MRSwgc28gbm8gbW9kdWxlIG93bnMgb25lLiBUaGVcbiAqIGFwcCBwYWNrYWdlIGFsc28gb3ducyBvYmplY3RzIG9mIGl0cyBvd24sIHNvIGBkZWZpbmVTdGFja2Agd291bGQgb3RoZXJ3aXNlXG4gKiByZWFkIGEgZ3JhbnQgb24gYGNybV9jYXNlYCBhcyBhIGdyYW50IG9uIGFuIG9iamVjdCBcIm5vdCBkZWZpbmVkIGluIG9iamVjdHNcIi5cbiAqIGBhcnRpZmFjdE9iamVjdHNgIGlzIHRoZSBwbGF0Zm9ybSdzIGFuc3dlciB0byBleGFjdGx5IHRoYXQgKG9iamVjdHN0YWNrIzE4MjAyKTpcbiAqIHRoZSBuYW1lcyB0aGUgT1RIRVIgcGFja2FnZXMgb2YgdGhpcyBhcnRpZmFjdCBvd24sIGFnYWluc3Qgd2hpY2ggdGhpc1xuICogcGFja2FnZSdzIGBwZXJtaXNzaW9uc1tdLm9iamVjdHNgIGFuZCBgZGF0YVtdLm9iamVjdGAgXHUyMDE0IGFuZCB0aG9zZSB0d29cbiAqIHJlZmVyZW5jZSBjbGFzc2VzIG9ubHkgXHUyMDE0IGFyZSByZXNvbHZlZC4gTWVhc3VyZWQgb24gMTcuNy4wOiB3aXRob3V0IGl0LCB0aGVcbiAqIHNldmVuIHNldHMnIDE4IGdyYW50cyBvbiBgY3JtX2Nhc2VgLCBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCBhbmRcbiAqIGBjcm1fYXJ0aWNsZV9mZWVkYmFja2AgYXJlIHJlZnVzZWQgKFwiZGVmaW5lU3RhY2sgY3Jvc3MtcmVmZXJlbmNlIHZhbGlkYXRpb25cbiAqIGZhaWxlZCAoMTggaXNzdWVzKVwiKTsgd2l0aCBpdCwgbm9uZS4gVGhlIGNsYWltIGlzIHZlcmlmaWVkLCBub3QgdHJ1c3RlZDogYVxuICogZ3JhbnQgbmFtaW5nIGFuIG9iamVjdCBubyBwYWNrYWdlIG9mIHRoZSBhcnRpZmFjdCBkZWZpbmVzIGlzIHN0aWxsIHJlZnVzZWQsXG4gKiBieSBgY29tcG9zZVN0YWNrc2AnIGFydGlmYWN0IHBhc3MsIGV2ZW4gd2hlbiB0aGUgbmFtZSBpcyBsaXN0ZWQgaGVyZS4gQSBob29rXG4gKiBvciBhbiBhcHAgbmF2aWdhdGlvbiBlbnRyeSBvbiBhbm90aGVyIHBhY2thZ2UncyBvYmplY3Qgc3RheXMgcmVmdXNlZDtcbiAqIG5hdmlnYXRpb24gY3Jvc3NlcyBvbmx5IHRocm91Z2ggdGhlIG1vZHVsZSdzIGBuYXZpZ2F0aW9uQ29udHJpYnV0aW9uc2AuXG4gKlxuICogIyMgV2hhdCBpcyBkZWxpYmVyYXRlbHkgTk9UIGhlcmVcbiAqXG4gKiBUaGUgYEhPVENSTV9DT01QT1NJVElPTmAga25vYiAoIzEzNjEpLiBJdCBzZWxlY3RzIHBlcm1pc3Npb24gc2V0cyBhbmQgc2VlZFxuICogZmFtaWxpZXMsIGFuZCBpdCBpcyByZXNvbHZlZCBvbmNlIGF0IHRoZSByb290IGFuZCBoYW5kZWQgZG93biBhbHJlYWR5XG4gKiBhcHBsaWVkIFx1MjAxNCBgb2JqZWN0c3RhY2suY29tcG9zaXRpb24udHNgIGNhcnJpZXMgdGhlIGZ1bGwgYXVkaXQgb2Ygd2hhdCB0aGVcbiAqIGtub2IgY2hhbmdlcyBhbmQgd2h5LCBiZWNhdXNlIHRoZSBhbnN3ZXIgaXMgYWJvdXQgdGhlIEFSVElGQUNULCBub3QgYWJvdXRcbiAqIHRoaXMgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUhvdENybUFwcFN0YWNrID0gKFxuICBjb2xsZWN0aW9uczogSG90Q3JtQXBwQ29sbGVjdGlvbnMsXG4gIG9wdGlvbnM6IHsgYXJ0aWZhY3RPYmplY3RzOiByZWFkb25seSBzdHJpbmdbXSB9LFxuKTogT2JqZWN0U3RhY2tEZWZpbml0aW9uID0+XG4gIGRlZmluZVN0YWNrKHtcbiAgICBtYW5pZmVzdDoge1xuICAgICAgaWQ6ICdhcHAub2JqZWN0c3RhY2suaG90Y3JtJyxcbiAgICAgIG5hbWVzcGFjZTogJ2NybScsXG4gICAgICB2ZXJzaW9uOiAnNC4wLjEnLFxuICAgICAgdHlwZTogJ2FwcCcsXG4gICAgICBuYW1lOiAnSG90Q1JNJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQUktTmF0aXZlIENSTSBmb3IgdGhlIE9iamVjdFN0YWNrIG1hcmtldHBsYWNlIFx1MjAxNCBBY2NvdW50cywgQ29udGFjdHMsIExlYWRzLCBPcHBvcnR1bml0aWVzLCBDYXNlcywgS25vd2xlZGdlLCBGb3JlY2FzdHMsIENhbXBhaWducywgQ29udHJhY3RzLicsXG4gICAgICAvLyBBRFItMDA4NyBwcm90b2NvbCBoYW5kc2hha2UgKEFEUi0wMDI1IFx1MDBBNzMuMik6IHRoZSBtZXRhZGF0YS9ydW50aW1lXG4gICAgICAvLyBwcm90b2NvbCBtYWpvciB0aGlzIGFwcCdzIG1ldGFkYXRhIGlzIGF1dGhvcmVkIGFnYWluc3QuIE9ubHkgdGhlIG1ham9yXG4gICAgICAvLyBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGNoZWNrIFx1MjAxNCBhIHJ1bnRpbWUgb24gYSBkaWZmZXJlbnQgbWFqb3IgcmVmdXNlcyB0aGVcbiAgICAgIC8vIGxvYWQgd2l0aCBhIHN0cnVjdHVyZWQgT1NfUFJPVE9DT0xfSU5DT01QQVRJQkxFIGRpYWdub3N0aWMgKG5hbWluZyB0aGVcbiAgICAgIC8vIGBvYmplY3RzdGFjayBtaWdyYXRlIG1ldGFgIHJlcGxheSkgaW5zdGVhZCBvZiBmYWlsaW5nIGRlZXAgaW4gYSBzY2hlbWFcbiAgICAgIC8vIHBhcnNlLiBCdW1wIHRvZ2V0aGVyIHdpdGggYHNwZWNWZXJzaW9uYCBvbiBldmVyeSBwbGF0Zm9ybSB1cGdyYWRlXG4gICAgICAvLyAoZG9jcy9NQUlOVEVOQU5DRS5tZCBcdTAwQTczKSBcdTIwMTQgYHRlc3QvZG9jcy1kZWNsYXJlZC12ZXJzaW9ucy50ZXN0LnRzYCBub3dcbiAgICAgIC8vIGVuZm9yY2VzIHRoYXQgcGFpcmluZyBhZ2FpbnN0IGBvYmplY3RzdGFjay5tYW5pZmVzdC5qc29uYCBpbnN0ZWFkIG9mXG4gICAgICAvLyB0cnVzdGluZyB0aGlzIGNvbW1lbnQsIGJlY2F1c2UgdHdvIHBsYXRmb3JtIHVwZ3JhZGVzIGluIGEgcm93IChyYy4yLCB0aGVuXG4gICAgICAvLyByYy4zKSBtb3ZlZCB0aGUgbWFuaWZlc3QgYW5kIGxlZnQgdGhpcyBsaW5lIGJlaGluZCAoIzcyOCkuIEV2ZXJ5IHBhY2thZ2VcbiAgICAgIC8vIG9mIHRoaXMgYXJ0aWZhY3Qgc3RhdGVzIHRoZSBzYW1lIHByb3RvY29sOyBgc3JjL3NlcnZpY2UvaW5kZXgudHNgXG4gICAgICAvLyByZXBlYXRzIGl0IGZvciB0aGUgc2FtZSByZWFzb24uXG4gICAgICBlbmdpbmVzOiB7IHByb3RvY29sOiAnXjE4LjAuMC1uZXh0LjAnIH0sXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBQbGF0Zm9ybSBjYXBhYmlsaXRpZXMgdGhpcyBhcHAgbmVlZHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy8gVGhlIHJ1bnRpbWUgcmVzb2x2ZXMgZWFjaCBjYXBhYmlsaXR5IG5hbWUgdG8gYSBidWlsdC1pbiBzZXJ2aWNlIHBsdWdpblxuICAgIC8vIGFuZCBhdXRvLWxvYWRzIGl0ICh3aXRoIGV4dHJhcyBsaWtlIEF1dG9tYXRpb24ncyBub2RlIHBhY2tzKS4gTm8gbmVlZFxuICAgIC8vIHRvIGhhbmQtaW5zdGFudGlhdGUgcGx1Z2lucyBvciBwYXNzIGAtLXByZXNldGAgZmxhZ3MuIFNlZVxuICAgIC8vIHBhY2thZ2VzL2NsaS9zcmMvY29tbWFuZHMvc2VydmUudHMgQ0FQQUJJTElUWV9QUk9WSURFUlMgZm9yIHRoZVxuICAgIC8vIGNvbXBsZXRlIG1hcDsgZXhwbGljaXQgYHBsdWdpbnM6IFsuLi5dYCBhbHdheXMgc2hhZG93cyB0aGUgcmVzb2x2ZXIuXG4gICAgLy8gYGF1dGhgIGVuYWJsZXMgdGhlIGF1dGgvbG9naW4gc3VyZmFjZSAobG9naW4vcmVnaXN0ZXIpIHZpYSBAb2JqZWN0c3RhY2svcGx1Z2luLWF1dGguXG4gICAgLy8gYHVpYCAgIHNlcnZlcyB0aGUgdW5pZmllZCBDb25zb2xlIHNoZWxsIGFuZCBDUk0gYXBwcyB1bmRlciAvX2NvbnNvbGUvXG4gICAgLy8gICAgICAgIChsb2dpbiBhdCAvX2NvbnNvbGUvbG9naW4pLiBPYmplY3RTdGFjayA3LnggcmVwbGFjZWQgdGhlIGxlZ2FjeVxuICAgIC8vICAgICAgICAvX3N0dWRpby8gYW5kIC9fYWNjb3VudC8gbW91bnRzIHdpdGggdGhpcyBzaW5nbGUgL19jb25zb2xlLyBzdXJmYWNlLlxuICAgIC8vIEJvdGggYXJlIHJlcXVpcmVkIGZvciBhIGNsaWNrYWJsZSBsb2dpbiBmbG93IHdoZW4gcnVubmluZyBgb2JqZWN0c3RhY2sgc3RhcnRgXG4gICAgLy8gb2ZmIHRoZSBjb21waWxlZCBhcnRpZmFjdC5cbiAgICAvLyBOb3RlOiB0aGUgZm91bmRhdGlvbmFsIHNsYXRlIChxdWV1ZSwgam9iLCBjYWNoZSwgc2V0dGluZ3MsIGVtYWlsLFxuICAgIC8vIHN0b3JhZ2UpIGlzIGF1dG8taW5qZWN0ZWQgYnkgdGhlIENMSSBmb3IgZXZlcnkgbm9uLWBtaW5pbWFsYFxuICAgIC8vIHByZXNldCBcdTIwMTQgc2VlIGBBTFdBWVNfQ0FQU2AgaW4gcGFja2FnZXMvY2xpL3NyYy9jb21tYW5kcy9zZXJ2ZS50cy5cbiAgICAvLyBMaXN0ZWQgYmVsb3cgb25seSB0aGUgKm9wdC1pbiogY2FwYWJpbGl0aWVzIHRoaXMgc3RhY2sgYWN0dWFsbHlcbiAgICAvLyB3YW50cyBvbiB0b3Agb2YgdGhhdCBzbGF0ZS5cbiAgICAvLyBgdHJpZ2dlcnNgIGluc3RhbGxzIHRoZSByZWNvcmQtY2hhbmdlICsgc2NoZWR1bGUgdHJpZ2dlciBwcm92aWRlcnMgdGhhdFxuICAgIC8vIGFjdHVhbGx5IGZpcmUgYXV0b2xhdW5jaGVkIGZsb3dzIChyZWNvcmRfY2hhbmdlICYgc2NoZWR1bGUgdHlwZXMpLiBXaXRob3V0XG4gICAgLy8gaXQgdGhlIGBhdXRvbWF0aW9uYCBlbmdpbmUgcmVnaXN0ZXJzIGZsb3dzIGJ1dCBub3RoaW5nIGV2ZXIgbGF1bmNoZXMgdGhlbS5cbiAgICAvLyBTY2hlZHVsZSB0cmlnZ2VycyBydW4gdmlhIHRoZSBqb2Igc2VydmljZSAoaW4gdGhlIGFsd2F5cy1vbiBzbGF0ZSkuXG4gICAgLy9cbiAgICAvLyBUaGlzIGlzIHRoZSBBUFAgcGFja2FnZSdzIHNsYXRlLiBgZGVmaW5lU3RhY2tgIHZhbGlkYXRlcyBjYXBhYmlsaXRpZXMgcGVyXG4gICAgLy8gc3RhY2ssIHNvIGBzcmMvc2VydmljZS9pbmRleC50c2AgZGVjbGFyZXMgdGhlIGZvdXIgaXRzIG93biBtZXRhZGF0YSBuZWVkc1xuICAgIC8vIGl0c2VsZiwgYW5kIHRoZSBhcnRpZmFjdCdzIHNsYXRlIGlzIHRoZSB1bmlvbiBvZiB0aGUgdHdvIGxpc3RzLlxuICAgIC8vXG4gICAgLy8gYGFpYCBpcyBkZWxpYmVyYXRlbHkgTk9UIGxpc3RlZC4gT2JqZWN0U3RhY2sgMTEuMy4wIChBRFItMDAyNSBTMikgcmVtb3ZlZFxuICAgIC8vIGBAb2JqZWN0c3RhY2svc2VydmljZS1haWAgZnJvbSB0aGUgb3BlbiBlZGl0aW9uIFx1MjAxNCB0aGUgQUkgcnVudGltZSBub3cgc2hpcHNcbiAgICAvLyBvbmx5IGluIHRoZSBjbG9zZWQgY2xvdWQgcGFja2FnZSwgYW5kIHRoZSBmcmFtZXdvcmsgQ0xJIGRvZXMgbm90IGRlcGVuZCBvblxuICAgIC8vIGl0LiBVbmRlciBPYmplY3RTdGFjayAxNiwgYHJlcXVpcmVzOiBbJ2FpJ11gIGlzIGEgKmZhaWwtZmFzdCogY2FwYWJpbGl0eTpcbiAgICAvLyB0aGUgc2VydmUgY29tbWFuZCBoYXJkLWFib3J0cyBib290IHdoZW4gdGhlIHBhY2thZ2UgaXMgYWJzZW50LCBzbyBrZWVwaW5nIGl0XG4gICAgLy8gaGVyZSB3b3VsZCBicmVhayBgb2JqZWN0c3RhY2sgc3RhcnRgL2BkZXZgIGZvciB0aGlzIG9wZW4tZWRpdGlvbiBhcHAgKHRoZSBBSVxuICAgIC8vIGJsb2NrIHJ1bnMgYmVmb3JlIGV2ZXJ5IG90aGVyIGNhcGFiaWxpdHkgcmVzb2x2ZXMpLiBUaGUgQUkgbWV0YWRhdGEgaXNcbiAgICAvLyB1bmFmZmVjdGVkIFx1MjAxNCB0aGUgc2tpbGxzIHN0aWxsIHZhbGlkYXRlLCBidWlsZCBpbnRvIHRoZSBhcnRpZmFjdCwgYW5kIHJ1blxuICAgIC8vIHdoZXJldmVyIGEgcnVudGltZSBwcm92aWRlcyB0aGUgYGFpYCB0aWVyIChjbG91ZCdzIG9iamVjdG9zLXJ1bnRpbWUpLiBUaGVyZVxuICAgIC8vIGFyZSBubyBhcHAtYXV0aG9yZWQgYWdlbnRzOiB0aGV5IHdlcmUgcmV0aXJlZCBpbiAjNTEyIGFuZCB0aGUgc3VyZmFjZSBpc1xuICAgIC8vIHNraWxscy1vbmx5IChBRFItMDA2MyBcdTAwQTcyKTsgc2tpbGxzIGF0dGFjaCB0byBhIHBsYXRmb3JtIGFnZW50IGJ5IGBzdXJmYWNlYC5cbiAgICAvLyBBIGxvY2FsIG9wZW4tZWRpdGlvbiBib290IHNpbXBseSBvbWl0cyB0aGUgQUkgc2VydmljZSBhbmQgaGlkZXMgaXRzIGNvbnNvbGVcbiAgICAvLyBzdXJmYWNlLiBUbyBydW4gQUkgbG9jYWxseSwgZGVjbGFyZSBgQG9iamVjdHN0YWNrL3NlcnZpY2UtYWlgIChjbG91ZCkgaW5cbiAgICAvLyBwYWNrYWdlLmpzb24gXHUyMDE0IGl0cyBtZXJlIHByZXNlbmNlIGJlc3QtZWZmb3J0IGF1dG8tbG9hZHMgaXQuXG4gICAgLy8gYGhpZXJhcmNoeS1zZWN1cml0eWAgaXMgdGhlIE9ORSBlbnRlcnByaXNlLWVkaXRpb24gY2FwYWJpbGl0eSB0aGlzIGFwcFxuICAgIC8vIGRlY2xhcmVzLiBJdCB3YXMgaW50cm9kdWNlZCBmb3IgIzg4MCBcdTIwMTQgYHNhbGVzX21hbmFnZXJgIGF1dGhvcmVkXG4gICAgLy8gYHdyaXRlU2NvcGU6ICdvd25fYW5kX3JlcG9ydHMnYCBvbiBgY3JtX2NvbnRyYWN0YCwgYW4gQURSLTAwNTcgSElFUkFSQ0hZXG4gICAgLy8gc2NvcGUgcmVzb2x2ZWQgYnkgdGhlIGBoaWVyYXJjaHktc2NvcGUtcmVzb2x2ZXJgIHNlcnZpY2UgdGhhdCBzaGlwcyBvbmx5XG4gICAgLy8gaW4gYEBvYmplY3RzdGFjay9zZWN1cml0eS1lbnRlcnByaXNlYCwgYW5kIGBkZWZpbmVTdGFja2AgcmVmdXNlcyBzdWNoIGFcbiAgICAvLyBncmFudCB1bmxlc3MgdGhlIGNhcGFiaWxpdHkgaXMgZGVjbGFyZWQuIFNpbmNlICM1NDkgYGNybV9jb250cmFjdGAgaXNcbiAgICAvLyBgY29udHJvbGxlZF9ieV9wYXJlbnRgIHVuZGVyIHRoZSBhY2NvdW50LCB0aGF0IHNjb3BlIGlzIGluZXJ0IGFuZCBpcyBub1xuICAgIC8vIGxvbmdlciBhdXRob3JlZDsgdGhlIGFwcCBjdXJyZW50bHkgYXV0aG9ycyBOTyBoaWVyYXJjaHkgc2NvcGUgYXQgYWxsLlxuICAgIC8vXG4gICAgLy8gVGhlIGRlY2xhcmF0aW9uIFNUQVlTLiBNYWludGFpbmVyIHJ1bGluZyAyMDI2LTA4LTMxICgjMTM3OCwgcGlubmVkIGJ5XG4gICAgLy8gYHRlc3QvaGllcmFyY2h5LXJlYWQtZGVwdGgudGVzdC50c2ApOiBub3RoaW5nIGlzIHJlbW92ZWQgZnJvbSBgcmVxdWlyZXNbXWAuXG4gICAgLy8gTWFpbnRhaW5lciBydWxpbmcsIDIwMjYtMDgtMTEsIHZlcmJhdGltOiBcdTMwMENcdTY3MkNcdTk4NzlcdTc2RUVcdTY2MkZcdTUxNDNcdTY1NzBcdTYzNkVhcHBcdUZGMENcdTU3MjhcdTRGMDFcdTRFMUFcdTcyNDhcdThGRDBcdTg4NENcdTVDMzFcbiAgICAvLyBcdTUxNzdcdTU5MDdcdTRGMDFcdTRFMUFcdTcyNDhcdTc2RjhcdTUxNzNcdTc2ODRcdTgwRkRcdTUyOUJcdUZGMENcdTRFMERcdTkxQ0RcdTU5MERcdTVGMDBcdTUzRDFcdTMwMDJcdTMwMEQgVGhlIGFwcCBzdGF0ZXMgd2hhdCBpdCBNRUFOUyBhbmQgdGhlXG4gICAgLy8gZWRpdGlvbiBzdXBwbGllcyB0aGUgY2FwYWJpbGl0eSwgcmF0aGVyIHRoYW4gYXBwcm94aW1hdGluZyBpdCB3aXRoIGEgYnJvYWRlclxuICAgIC8vIG9wZW4tZWRpdGlvbiB2YWx1ZS5cbiAgICAvL1xuICAgIC8vIFVOTElLRSBgYWlgIGFib3ZlLCB0aGlzIGlzIFNBRkUgdG8gZGVjbGFyZSBvbiBhbiBvcGVuLWVkaXRpb24gYm9vdCBhbmQgZG9lc1xuICAgIC8vIE5PVCBmYWlsIGZhc3QuIFZlcmlmaWVkIGFnYWluc3QgYEBvYmplY3RzdGFjay9jbGlgJ3Mgc2VydmUgY29tbWFuZDogdGhlXG4gICAgLy8gY2FwYWJpbGl0eSByZXNvbHZlciBsb29rcyB0aGUgdG9rZW4gdXAgaW4gYENBUEFCSUxJVFlfUFJPVklERVJTYCwgZmluZHMgbm9cbiAgICAvLyBlbnRyeSwgYW5kIGJlY2F1c2UgYGhpZXJhcmNoeS1zZWN1cml0eWAgSVMgaW4gdGhlIGtub3duXG4gICAgLy8gYFBMQVRGT1JNX0NBUEFCSUxJVFlfVE9LRU5TYCB2b2NhYnVsYXJ5IGl0IHRha2VzIHRoZSBkZWxpYmVyYXRlIFwic3RheSBxdWlldFwiXG4gICAgLy8gYnJhbmNoIFx1MjAxNCBubyB3YXJuaW5nLCBubyBhYm9ydCBcdTIwMTQgc2luY2UgdGhlIGNhcGFiaWxpdHkgYXJyaXZlcyB2aWEgYW4gZXhwbGljaXRcbiAgICAvLyBlbnRlcnByaXNlIHBsdWdpbiBpbiBgcGx1Z2luc1tdYC4gT25seSB0aWVyLWdhdGVkIHRva2VucyAoYWkgLyBhaS1zdHVkaW8gL1xuICAgIC8vIGkxOG4gLyB1aSAvIGF1dGgpIGhhdmUgdGhlIGRlZGljYXRlZCBoYXJkLWFib3J0IGJsb2NrcyB0aGUgbm90ZSBhYm92ZVxuICAgIC8vIGRlc2NyaWJlcy4gYG9iamVjdHN0YWNrIHZhbGlkYXRlYCBkb2VzIHByaW50IG9uZSBpbmZvcm1hdGlvbmFsIGxpbmUgbmFtaW5nXG4gICAgLy8gdGhlIHBhY2thZ2UgdG8gaW5zdGFsbDsgdGhhdCBpcyBleHBlY3RlZCBvdXRwdXQsIG5vdCBhIGRlZmVjdCB0byBzaWxlbmNlLlxuICAgIHJlcXVpcmVzOiBbJ2F1dG9tYXRpb24nLCAndHJpZ2dlcnMnLCAnYW5hbHl0aWNzJywgJ2F1dGgnLCAndWknLCAnYXBwcm92YWxzJywgJ3NoYXJpbmcnLCAnaGllcmFyY2h5LXNlY3VyaXR5J10sXG5cbiAgICAvLyBUaGUgbG9jYWxlIGNvbmZpZ3VyYXRpb24gaXMgdGhlIEFSVElGQUNUJ3MsIGFuZCBgaTE4bmAgaXMgYVxuICAgIC8vIGAnc2luZ2xlJ2AtZGlzcG9zaXRpb24ga2V5OiB0d28gc3RhY2tzIGRlY2xhcmluZyBkaWZmZXJlbnQgdmFsdWVzIG1ha2VcbiAgICAvLyBgY29tcG9zZVN0YWNrc2AgdGhyb3csIGFuZCBkZWNsYXJpbmcgaWRlbnRpY2FsIG9uZXMgdHdpY2UgaXMgYSBzZWNvbmRcbiAgICAvLyBwbGFjZSB0byBkcmlmdC4gSXQgbGl2ZXMgb24gdGhlIEFwcCBwYWNrYWdlLCBhbG9uZS5cbiAgICBpMThuOiB7XG4gICAgICBkZWZhdWx0TG9jYWxlOiAnZW4nLFxuICAgICAgc3VwcG9ydGVkTG9jYWxlczogWydlbicsICd6aC1DTicsICdqYS1KUCcsICdlcy1FUyddLFxuICAgICAgZmFsbGJhY2tMb2NhbGU6ICdlbicsXG4gICAgfSxcblxuICAgIC4uLmNvbGxlY3Rpb25zLFxuICB9LCB7IGFydGlmYWN0T2JqZWN0czogb3B0aW9ucy5hcnRpZmFjdE9iamVjdHMgfSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2luZGV4LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2VcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNiBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lU3RhY2ssIHR5cGUgT2JqZWN0U3RhY2tEZWZpbml0aW9uLCB0eXBlIE9iamVjdFN0YWNrRGVmaW5pdGlvbklucHV0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuXG5pbXBvcnQge1xuICBFc2NhbGF0ZUNhc2VBY3Rpb24sIENsb3NlQ2FzZUFjdGlvbiwgQ2xhaW1DYXNlQWN0aW9uLFxuICBMb2dDYWxsQWN0aW9uLCBMb2dNZWV0aW5nQWN0aW9uLCBDYXNlU2NoZWR1bGVNZWV0aW5nQWN0aW9uLFxuICBNYXJrQXJ0aWNsZUhlbHBmdWxBY3Rpb24sIE1hcmtBcnRpY2xlTm90SGVscGZ1bEFjdGlvbixcbn0gZnJvbSAnLi9hY3Rpb25zL2luZGV4LmpzJztcbmltcG9ydCB7IFNlcnZpY2VEYXNoYm9hcmQgfSBmcm9tICcuL2Rhc2hib2FyZHMvaW5kZXguanMnO1xuaW1wb3J0IHsgQ2FzZURhdGFzZXQgfSBmcm9tICcuL2RhdGFzZXRzL2luZGV4LmpzJztcbmltcG9ydCB7IFNlcnZpY2VFbWFpbFRlbXBsYXRlcyB9IGZyb20gJy4vZW1haWwtdGVtcGxhdGVzL2luZGV4LmpzJztcbmltcG9ydCB7XG4gIENhc2VFc2NhbGF0aW9uRmxvdywgQ2FzZUVzY2FsYXRpb25PbkNyZWF0ZUZsb3csIEVzY2FsYXRlQ2FzZUZsb3csIENsb3NlQ2FzZUZsb3csXG4gIENsYWltQ2FzZUZsb3csIENhc2VFc2NhbGF0aW9uU3RhbXBGbG93LCBDYXNlU2xhTW9uaXRvckZsb3csXG59IGZyb20gJy4vZmxvd3MvaW5kZXguanMnO1xuaW1wb3J0IHsgQXJ0aWNsZUZlZWRiYWNrLCBDYXNlLCBLbm93bGVkZ2VBcnRpY2xlIH0gZnJvbSAnLi9vYmplY3RzL2luZGV4LmpzJztcbmltcG9ydCB7IGFydGljbGVGZWVkYmFja0hvb2ssIGNhc2VIb29rLCBrbm93bGVkZ2VBcnRpY2xlSG9vayB9IGZyb20gJy4vb2JqZWN0cy9ob29rcy5qcyc7XG5pbXBvcnQgeyBDYXNlRGV0YWlsUGFnZSB9IGZyb20gJy4vcGFnZXMvaW5kZXguanMnO1xuaW1wb3J0IHtcbiAgQ2FzZXNCeVN0YXR1c1ByaW9yaXR5UmVwb3J0LCBTbGFQZXJmb3JtYW5jZVJlcG9ydCwgQ2FzZXNPcGVuZWRCeURheVByaW9yaXR5UmVwb3J0LFxufSBmcm9tICcuL3JlcG9ydHMvaW5kZXguanMnO1xuaW1wb3J0IHtcbiAgQ2FzZURpcmVjdG9yU2hhcmluZ1J1bGUsIENhc2VFc2NhbGF0aW9uU2hhcmluZ1J1bGUsIENhc2VVbmFzc2lnbmVkVHJpYWdlU2hhcmluZ1J1bGUsXG59IGZyb20gJy4vc2hhcmluZy9pbmRleC5qcyc7XG5pbXBvcnQgeyBDYXNlVHJpYWdlU2tpbGwgfSBmcm9tICcuL3NraWxscy9pbmRleC5qcyc7XG5pbXBvcnQgeyBDYXNlVmlld3MsIEtub3dsZWRnZUFydGljbGVWaWV3cyB9IGZyb20gJy4vdmlld3MvaW5kZXguanMnO1xuXG4vKipcbiAqIFRoZSBmb3VyIGNvbGxlY3Rpb25zIG9mIHRoaXMgcGFja2FnZSB0aGF0IHRoZSBhcHAtd2lkZSBzd2VlcHMgYWxzbyByZWFkLFxuICogbmFtZWQgb25jZSwgaGVyZS5cbiAqXG4gKiBgb2JqZWN0c3RhY2suY29tcG9zaXRpb24udHNgIGFzc2VtYmxlcyBgYWxsSG9va3NgLCBgYWxsRmxvd3NgLCBgYWxsU2tpbGxzYFxuICogYW5kIGBDcm1TaGFyaW5nUnVsZXNgIFx1MjAxNCBldmVyeSBob29rLCBmbG93LCBza2lsbCBhbmQgc2hhcmluZyBydWxlIG9mIHRoZVxuICogQVJUSUZBQ1QgXHUyMDE0IG91dCBvZiBlYWNoIHBhY2thZ2UncyBvd24gbGlzdCwgc28gdGhlIHN1aXRlcyB0aGF0IHN3ZWVwIHRoZW0ga2VlcFxuICogcmVhZGluZyBvbmUgbGlzdCBhbmQgdGhpcyBwYWNrYWdlJ3MgaGFsZiBvZiBpdCBpcyB0aGUgdmVyeSBhcnJheSBpdHMgc3RhY2tcbiAqIHJlZ2lzdGVycy4gYC5mbGF0KClgIGJlY2F1c2UgYSBgKi5ob29rLnRzYCBtYXkgZGVmYXVsdC1leHBvcnQgYW4gQVJSQVkgb2ZcbiAqIGhvb2tzIChvbmUgZmlsZSwgc2V2ZXJhbCB0cmlnZ2VycyBvbiBpdHMgb2JqZWN0KS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlcnZpY2VIb29rcyA9IFthcnRpY2xlRmVlZGJhY2tIb29rLCBjYXNlSG9vaywga25vd2xlZGdlQXJ0aWNsZUhvb2tdLmZsYXQoKTtcblxuLyoqIFRoaXMgcGFja2FnZSdzIGZsb3dzIFx1MjAxNCBzZWUge0BsaW5rIHNlcnZpY2VIb29rc30uICovXG5leHBvcnQgY29uc3Qgc2VydmljZUZsb3dzID0gW1xuICBDYXNlRXNjYWxhdGlvbkZsb3csIENhc2VFc2NhbGF0aW9uT25DcmVhdGVGbG93LCBFc2NhbGF0ZUNhc2VGbG93LCBDbG9zZUNhc2VGbG93LFxuICBDbGFpbUNhc2VGbG93LCBDYXNlRXNjYWxhdGlvblN0YW1wRmxvdywgQ2FzZVNsYU1vbml0b3JGbG93LFxuXTtcblxuLyoqIFRoaXMgcGFja2FnZSdzIHNraWxscyBcdTIwMTQgc2VlIHtAbGluayBzZXJ2aWNlSG9va3N9LiAqL1xuZXhwb3J0IGNvbnN0IHNlcnZpY2VTa2lsbHMgPSBbQ2FzZVRyaWFnZVNraWxsXTtcblxuLyoqIFRoaXMgcGFja2FnZSdzIHNoYXJpbmcgcnVsZXMgXHUyMDE0IHNlZSB7QGxpbmsgc2VydmljZUhvb2tzfS4gKi9cbmV4cG9ydCBjb25zdCBzZXJ2aWNlU2hhcmluZ1J1bGVzID0gW1xuICBDYXNlRXNjYWxhdGlvblNoYXJpbmdSdWxlLCBDYXNlRGlyZWN0b3JTaGFyaW5nUnVsZSwgQ2FzZVVuYXNzaWduZWRUcmlhZ2VTaGFyaW5nUnVsZSxcbl07XG5cbi8qKlxuICogV2hhdCB0aGlzIHBhY2thZ2UgcmVnaXN0ZXJzIGJ1dCBkb2VzIG5vdCBhc3NlbWJsZTogaXRzIHNlZWQgcm93cy5cbiAqXG4gKiBFdmVyeXRoaW5nIGVsc2UgY29tZXMgZnJvbSB0aGlzIHBhY2thZ2UncyBvd24gYmFycmVscy4gVGhlIHNlZWQgZmFtaWxpZXMgYXJlXG4gKiB0aGUgb25lIGV4Y2VwdGlvbiBiZWNhdXNlIFdISUNIIGZhbWlsaWVzIGEgYnVpbGQgcmVwbGF5cyBpcyB0aGVcbiAqIGBIT1RDUk1fQ09NUE9TSVRJT05gIGtub2IncyBkZWNpc2lvbiAoIzEzNjEpLCBtYWRlIG9uY2UsIGF0IHRoZSByb290IFx1MjAxNCBhXG4gKiBTYWFTIHRlbmFudCBnZXRzIHRoZSBwcm9kdWN0IGNhdGFsb2d1ZSBhbmQgbm90aGluZyBlbHNlLCBzbyB0aGlzIHBhY2thZ2VcbiAqIHJlZ2lzdGVycyBubyByb3dzIGluIHRoYXQgc2hhcGUuIFNlZSBgc2VlZERhdGFGb3JgIGluXG4gKiBgb2JqZWN0c3RhY2suY29tcG9zaXRpb24udHNgLlxuICovXG5leHBvcnQgdHlwZSBIb3RDcm1TZXJ2aWNlQ29sbGVjdGlvbnMgPSBQaWNrPE9iamVjdFN0YWNrRGVmaW5pdGlvbklucHV0LCAnZGF0YSc+O1xuXG4vKipcbiAqIGBhcHAub2JqZWN0c3RhY2suaG90Y3JtLnNlcnZpY2VgIFx1MjAxNCB0aGUgU1VQUE9SVCBtb2R1bGUgb2YgdGhpcyBhcnRpZmFjdFxuICogKEFEUi0wMTMwIEQ0OiBvbmUgcmVsZWFzZSBhcnRpZmFjdCwgTiBwYWNrYWdlcywgb25lIG5hbWVzcGFjZSkuXG4gKlxuICogSXQgb3ducyBgY3JtX2Nhc2VgLCBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCBhbmQgYGNybV9hcnRpY2xlX2ZlZWRiYWNrYCwgYW5kXG4gKiBldmVyeSBpdGVtIGF1dGhvcmVkIGFnYWluc3QgdGhlbTogdGhlaXIgaG9va3MsIHZpZXdzLCB0aGUgY2FzZSBkZXRhaWwgcGFnZSxcbiAqIHRoZSBzZXZlbiBjYXNlIGZsb3dzLCB0aGUgY2FzZSBhbmQgYXJ0aWNsZSBhY3Rpb25zLCBgY2FzZV9tZXRyaWNzYCBhbmQgdGhlXG4gKiB0aHJlZSByZXBvcnRzIG92ZXIgaXQsIHRoZSBTZXJ2aWNlIE92ZXJ2aWV3IGRhc2hib2FyZCwgdGhlIGNhc2UtdHJpYWdlIHNraWxsLFxuICogdGhlIHRocmVlIGNhc2Ugc2hhcmluZyBydWxlcywgdGhlIHR3byBjYXNlIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZXMgYW5kIHRoZVxuICogY2FzZSBhbmQga25vd2xlZGdlIHNlZWQgcm93cy5cbiAqXG4gKiBUaHJlZSBwcm9wZXJ0aWVzIGFyZSBsb2FkLWJlYXJpbmc6XG4gKlxuICogIC0gKipUaGUgc2FtZSBgbmFtZXNwYWNlYCBhcyB0aGUgYXBwIHBhY2thZ2UuKiogVGhhdCBpcyB3aGF0IEFEUi0wMTMwIEQxXG4gKiAgICBidXlzOiBjby1vd25lcnNoaXAgb2Ygb25lIG5hbWVzcGFjZSBpbnNpZGUgb25lIGFydGlmYWN0LCBzbyBgY3JtX2Nhc2VgXG4gKiAgICBrZWVwcyBpdHMgbmFtZSBpbnN0ZWFkIG9mIGJlY29taW5nIGBzZXJ2aWNlX2Nhc2VgLiBUaGUgb2JqZWN0IGBuYW1lYCBJU1xuICogICAgdGhlIHRhYmxlIG5hbWUsIHRoZSBSRVNUIHBhdGggYW5kIHRoZSBzYXZlZC12aWV3IGtleSAoQURSLTAxMjkgRDFcdTIwMTNEMiksIHNvXG4gKiAgICBhIHJlbmFtZSB3b3VsZCBiZSBhIGRhdGEgbWlncmF0aW9uOyB0aGlzIHNwbGl0IGNvc3RzIG5vbmUuXG4gKiAgLSAqKmBkZXBlbmRlbmNpZXNgIGlzIHRoZSBlZGdlOyB0aGUgYXJyYXkgb3JkZXIgaW4gYG9iamVjdHN0YWNrLmNvbmZpZy50c2BcbiAqICAgIGlzIG5vdC4qKiBUaGUgbG9hZCBwYXRoIHNvcnRzIGBwYWNrYWdlc1tdYCB0aHJvdWdoIHRoZSBwbGF0Zm9ybSdzIG9uZVxuICogICAgdG9wb2xvZ2ljYWwgc29ydGVyIChBRFItMDEzMCBENSwgQURSLTAxMTYpLCBzbyB0aGUgYXBwIHBhY2thZ2UgcmVnaXN0ZXJzXG4gKiAgICBmaXJzdCB3aGF0ZXZlciBzbG90IGl0IG9jY3VwaWVzIGluIHRoZSBgY29tcG9zZVN0YWNrcyhbXHUyMDI2XSlgIGNhbGwuXG4gKiAgLSAqKk5hdmlnYXRpb24gY3Jvc3NlcyBvbmx5IHRocm91Z2ggY29udHJpYnV0aW9ucyoqIFx1MjAxNCB0aGUgYmxvY2sgYmVsb3cuXG4gKlxuICogXHUyNkQ0IE5vIGBpMThuYCBoZXJlOiBpdCBpcyBhIGAnc2luZ2xlJ2AtZGlzcG9zaXRpb24gc3RhY2sga2V5LCBzbyB0d28gc3RhY2tzXG4gKiBkZWNsYXJpbmcgRElGRkVSRU5UIHZhbHVlcyBtYWtlIGBjb21wb3NlU3RhY2tzYCB0aHJvdyBhbmQgZGVjbGFyaW5nIGlkZW50aWNhbFxuICogb25lcyB0d2ljZSBpcyBhIHNlY29uZCBwbGFjZSB0byBkcmlmdC4gVGhlIGFwcCBwYWNrYWdlIGRlY2xhcmVzIGl0IG9uY2UsIGZvclxuICogdGhlIGFydGlmYWN0IFx1MjAxNCBhbmQgdGhlIGxvY2FsZSBwYWNrcyB0aGF0IGxhYmVsIHRoaXMgcGFja2FnZSdzIG9iamVjdHMgc3RheVxuICogd2hvbGUgaW4gdGhlIGFwcCBwYWNrYWdlIHdpdGggaXQuXG4gKlxuICogYHJlcXVpcmVzYCBpcyB0aGUgb3Bwb3NpdGU6IGBkZWZpbmVTdGFja2AgdmFsaWRhdGVzIHRyaWdnZXIgY2FwYWJpbGl0eSBQRVJcbiAqIFNUQUNLLCBzbyBhIHBhY2thZ2Ugd2hvc2Ugb3duIGZsb3dzIGRlY2xhcmUgYHJlY29yZF9jaGFuZ2VgIC8gYHNjaGVkdWxlYFxuICogdHJpZ2dlcnMgbXVzdCBkZWNsYXJlIGB0cmlnZ2Vyc2AgaXRzZWxmIFx1MjAxNCB0aGUgYXBwIHBhY2thZ2UncyBzbGF0ZSBkb2VzIG5vdFxuICogcmVhY2ggdGhpcyBwYXJzZTpcbiAqXG4gKiAgICAgXHUyNzE3IGZsb3cgJ2Nhc2VfZXNjYWxhdGlvbicgZGVjbGFyZXMgYSAncmVjb3JkX2NoYW5nZScgdHJpZ2dlciBidXRcbiAqICAgICAgIGByZXF1aXJlc2AgZG9lcyBub3QgaW5jbHVkZSAnYXV0b21hdGlvbicgb3IgJ3RyaWdnZXJzJyBcdTIwMTQgbm9cbiAqICAgICAgICdyZWNvcmRfY2hhbmdlJyB0cmlnZ2VyIHdvdWxkIGJlIHJlZ2lzdGVyZWQgXHUyMDI2XG4gKlxuICogKG1lYXN1cmVkIG9uIDE3LjcuMCBieSBkZWxldGluZyB0aGUgbGluZSBiZWxvdzogdGhyZWUgc3VjaCByZWZ1c2Fscywgb25lXG4gKiBwZXIgdHJpZ2dlcmVkIGNhc2UgZmxvdykuXG4gKlxuICogU28gdGhpcyBsaXN0IGlzIGV4YWN0bHkgd2hhdCBUSElTIHBhY2thZ2UncyBtZXRhZGF0YSBuZWVkczogYGF1dG9tYXRpb25gIGFuZFxuICogYHRyaWdnZXJzYCBmb3IgdGhlIHNldmVuIGNhc2UgZmxvd3MsIGBhbmFseXRpY3NgIGZvciBgY2FzZV9tZXRyaWNzYCBhbmQgdGhlXG4gKiBpdGVtcyBvdmVyIGl0LCBgc2hhcmluZ2AgZm9yIHRoZSB0aHJlZSBjYXNlIHNoYXJpbmcgcnVsZXMuIFRoZSBhcHAgcGFja2FnZSdzXG4gKiBzdXJmYWNlIGNhcGFiaWxpdGllcyAoYGF1dGhgLCBgdWlgLCBgYXBwcm92YWxzYCwgYGhpZXJhcmNoeS1zZWN1cml0eWApIGFyZVxuICogbm90IHJlcGVhdGVkLlxuICpcbiAqIFJlZ2lzdHJhdGlvbiBzdGF5cyBmaWxlLWJ5LWZpbGU6IGV2ZXJ5IGl0ZW0gaXMgbmFtZWQgaGVyZSwgdGhyb3VnaCBpdHNcbiAqIGRpcmVjdG9yeSBiYXJyZWwuIEEgZmlsZSB0aGF0IHJlYWNoZXMgbm8gYmFycmVsIGFuZCBubyBsaW5lIGJlbG93IGlzXG4gKiB2YWxpZGF0ZWQgYnkgbm90aGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUhvdENybVNlcnZpY2VTdGFjayA9IChcbiAgY29sbGVjdGlvbnM6IEhvdENybVNlcnZpY2VDb2xsZWN0aW9ucyxcbik6IE9iamVjdFN0YWNrRGVmaW5pdGlvbiA9PiBkZWZpbmVTdGFjayh7XG4gIG1hbmlmZXN0OiB7XG4gICAgaWQ6ICdhcHAub2JqZWN0c3RhY2suaG90Y3JtLnNlcnZpY2UnLFxuICAgIG5hbWU6ICdIb3RDUk0gU2VydmljZScsXG4gICAgLy8gVGhlIGFwcCBwYWNrYWdlJ3MgbmFtZXNwYWNlLCBkZWxpYmVyYXRlbHkgKEFEUi0wMTMwIEQxKS5cbiAgICBuYW1lc3BhY2U6ICdjcm0nLFxuICAgIC8vIFRoZSBBUlRJRkFDVCdzIHZlcnNpb246IG9uZSBgcGFja2FnZS5qc29uYCwgb25lIGJ1aWxkLCBvbmUgcmVsZWFzZVxuICAgIC8vIChBRFItMDEzMCBENiksIHNvIGEgbW9kdWxlIG9mIHRoaXMgYXJ0aWZhY3QgaXMgbmV2ZXIgYXQgYSB2ZXJzaW9uIG9mIGl0c1xuICAgIC8vIG93bi4gQnVtcCBpdCB3aXRoIHRoZSBhcHAgcGFja2FnZSdzIGFuZCBgcGFja2FnZS5qc29uYCBcdTIwMTRcbiAgICAvLyBgdGVzdC9kb2NzLWRlY2xhcmVkLXZlcnNpb25zLnRlc3QudHNgIGhvbGRzIGFsbCB0aHJlZSwgYW5kIHRoZSByYW5nZVxuICAgIC8vIGJlbG93LCB0byBvbmUgdmFsdWUuXG4gICAgdmVyc2lvbjogJzQuMC4xJyxcbiAgICB0eXBlOiAnbW9kdWxlJyxcbiAgICBkZXNjcmlwdGlvbjogJ0hvdENSTSBzdXBwb3J0IG1vZHVsZSBcdTIwMTQgY2FzZXMsIGtub3dsZWRnZSBhcnRpY2xlcywgYW5kIHRoZSBTTEEgc3VyZmFjZS4nLFxuICAgIC8vIFRoZSBzYW1lIHByb3RvY29sIGFzIHRoZSBhcHAgcGFja2FnZSAoQURSLTAwODcgaGFuZHNoYWtlKTsgYnVtcCBpdCB3aXRoXG4gICAgLy8gYHNwZWNWZXJzaW9uYCBvbiBldmVyeSBwbGF0Zm9ybSB1cGdyYWRlLCBleGFjdGx5IGFzIHRoZSBhcHAncyBpcy5cbiAgICBlbmdpbmVzOiB7IHByb3RvY29sOiAnXjE4LjAuMC1uZXh0LjAnIH0sXG4gICAgLy8gVGhlIEFwcCBwYWNrYWdlIHRoaXMgbW9kdWxlIGV4dGVuZHMuXG4gICAgZGVwZW5kZW5jaWVzOiB7ICdhcHAub2JqZWN0c3RhY2suaG90Y3JtJzogJ140LjAuMScgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmaXZlIG5hdmlnYXRpb24gZW50cmllcyB0aGlzIG1vZHVsZSBwdXRzIGludG8gdGhlIGFwcCdzIG1lbnVcbiAgICAgKiAoQURSLTAwMjkgRDcpLlxuICAgICAqXG4gICAgICogTm90IGEgZGVzaWduIGNob2ljZTogYW4gYXBwJ3Mgb3duIGBuYXZpZ2F0aW9uYCBtYXkgbm90IG5hbWUgYW5vdGhlclxuICAgICAqIHBhY2thZ2UncyBvYmplY3QgKEFEUi0wMTMwIFx1MDBBNzEuNSwgcnVsZSBSMyBvZiBgbW9kdWxlLXNwbGl0LXBsYW4ubWRgKSwgc29cbiAgICAgKiBhbGwgZml2ZSBiZWNhbWUgY29udHJpYnV0aW9ucyB0aGUgbW9tZW50IGBjcm1fY2FzZWAsXG4gICAgICogYGNybV9rbm93bGVkZ2VfYXJ0aWNsZWAsIGBzZXJ2aWNlX2Rhc2hib2FyZGAgYW5kIGBzbGFfcGVyZm9ybWFuY2VgIGxlZnRcbiAgICAgKiB0aGUgYXBwIHBhY2thZ2UuIFRoZSBhcHAga2VlcHMgdGhlIEdST1VQUyAoYGdyb3VwX3NlcnZpY2VgLCBgZ3JvdXBfd29ya2AsXG4gICAgICogYGdyb3VwX2luc2lnaHRzYCkgXHUyMDE0IGEgY29udGFpbmVyIGEgbW9kdWxlIGNhbm5vdCBkZWNsYXJlIGluc2lkZSBhbiBhcHAgaXRcbiAgICAgKiBkb2VzIG5vdCBvd24gXHUyMDE0IGFuZCB0aGlzIG1vZHVsZSBmaWxscyB0aGVtLlxuICAgICAqXG4gICAgICogYGFwcGAgaXMgdGhlIGFwcCdzIGJhcmUgYG5hbWVgIChgY3JtX2VudGVycHJpc2VgKSwgbm90IHRoZSBtYW5pZmVzdCBpZDogYVxuICAgICAqIGRvdHRlZCBpZCBpcyByZWZ1c2VkIGFzIGEgbm9uLXNuYWtlX2Nhc2UgaWRlbnRpZmllci5cbiAgICAgKlxuICAgICAqIFx1MjZBMFx1RkUwRiBgcHJpb3JpdHlgIG9yZGVycyBDT05UUklCVVRJT05TIGFnYWluc3QgZWFjaCBvdGhlciBpbnNpZGUgYSBncm91cC4gSXRcbiAgICAgKiBkb2VzIE5PVCBpbnRlcmxlYXZlIHRoZW0gd2l0aCB0aGUgYXBwJ3Mgb3duIGNoaWxkcmVuIFx1MjAxNCBhIGNvbnRyaWJ1dGVkIGl0ZW1cbiAgICAgKiBpcyBhcHBlbmRlZCBhZnRlciBldmVyeXRoaW5nIHRoZSBhcHAgaXRzZWxmIGRlY2xhcmVzIGluIHRoYXQgZ3JvdXAuIFRoZVxuICAgICAqIG9uZSB2aXNpYmxlIGNvbnNlcXVlbmNlIGlzIGBuYXZfbXlfY2FzZXNgLCA0dGggb2YgNiBpbiAqTXkgV29yayogYmVmb3JlXG4gICAgICogdGhlIHNwbGl0IGFuZCBsYXN0IGFmdGVyIGl0OyB0aGUgdGhyZWUgYGdyb3VwX3NlcnZpY2VgIGl0ZW1zIGFuZFxuICAgICAqIGBuYXZfcmVwb3J0X3NsYWAga2VlcCB0aGVpciBwb3NpdGlvbnMgYmVjYXVzZSB0aGUgYXBwIGRlY2xhcmVzIG5vdGhpbmdcbiAgICAgKiBhZnRlciB0aGVtLiBcdTI2RDQgRG8gbm90IGNvbXBlbnNhdGUgd2l0aCBhIHBlci1pdGVtIGBvcmRlcmA6IHRoYXQga2V5IHNvcnRzXG4gICAgICogaW4gdGhlIHJlbmRlcmVyIG9ubHksIHRoaXMgYXBwIGF1dGhvcnMgbm9uZSBhbnl3aGVyZSwgYW5kIGFkZGluZyBvbmUgdG9cbiAgICAgKiB3b3JrIGFyb3VuZCBhIHBsYXRmb3JtIG1lcmdlIHJ1bGUgaXMgd2hhdCBBR0VOVFMubWQgZm9yYmlkcy5cbiAgICAgKi9cbiAgICBuYXZpZ2F0aW9uQ29udHJpYnV0aW9uczogW1xuICAgICAge1xuICAgICAgICBhcHA6ICdjcm1fZW50ZXJwcmlzZScsXG4gICAgICAgIGdyb3VwOiAnZ3JvdXBfc2VydmljZScsXG4gICAgICAgIC8vIFN0YXRlZCByYXRoZXIgdGhhbiBkZWZhdWx0ZWQgc28gdGhhdCB0aGUgZGF5IGEgc2Vjb25kIHBhY2thZ2VcbiAgICAgICAgLy8gY29udHJpYnV0ZXMgaW50byBvbmUgb2YgdGhlc2UgZ3JvdXBzLCB0aGUgb3JkZXIgaXMgYW4gYXV0aG9yZWQgZmFjdFxuICAgICAgICAvLyBpbnN0ZWFkIG9mIGEgcmVnaXN0cmF0aW9uLW9yZGVyIGFjY2lkZW50LlxuICAgICAgICBwcmlvcml0eTogMTAsXG4gICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgeyBpZDogJ25hdl9jYXNlJywgICAgICB0eXBlOiAnb2JqZWN0Jywgb2JqZWN0TmFtZTogJ2NybV9jYXNlJywgICAgICAgICAgICAgIGxhYmVsOiAnQ2FzZXMnLCAgICAgaWNvbjogJ2xpZmUtYnVveScgfSxcbiAgICAgICAgICB7IGlkOiAnbmF2X2tub3dsZWRnZScsIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX2tub3dsZWRnZV9hcnRpY2xlJywgbGFiZWw6ICdLbm93bGVkZ2UnLCBpY29uOiAnYm9vay1vcGVuJyB9LFxuICAgICAgICAgIHsgaWQ6ICduYXZfc2VydmljZV9kYXNoYm9hcmQnLCB0eXBlOiAnZGFzaGJvYXJkJywgZGFzaGJvYXJkTmFtZTogJ3NlcnZpY2VfZGFzaGJvYXJkJywgbGFiZWw6ICdTZXJ2aWNlIE92ZXJ2aWV3JywgaWNvbjogJ2dhdWdlJyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYXBwOiAnY3JtX2VudGVycHJpc2UnLFxuICAgICAgICBncm91cDogJ2dyb3VwX3dvcmsnLFxuICAgICAgICBwcmlvcml0eTogMjAsXG4gICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgeyBpZDogJ25hdl9teV9jYXNlcycsIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX2Nhc2UnLCB2aWV3TmFtZTogJ215X29wZW5fY2FzZXMnLCBsYWJlbDogJ015IENhc2VzJywgaWNvbjogJ2xpZmUtYnVveScgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGFwcDogJ2NybV9lbnRlcnByaXNlJyxcbiAgICAgICAgZ3JvdXA6ICdncm91cF9pbnNpZ2h0cycsXG4gICAgICAgIHByaW9yaXR5OiAzMCxcbiAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICB7IGlkOiAnbmF2X3JlcG9ydF9zbGEnLCB0eXBlOiAncmVwb3J0JywgcmVwb3J0TmFtZTogJ3NsYV9wZXJmb3JtYW5jZScsIGxhYmVsOiAnU0xBIFBlcmZvcm1hbmNlJywgaWNvbjogJ3RpbWVyJyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuXG4gIC8vIFdoYXQgVEhJUyBwYWNrYWdlJ3MgbWV0YWRhdGEgbmVlZHMgXHUyMDE0IHNlZSB0aGUgYHJlcXVpcmVzYCBwYXJhZ3JhcGggYWJvdmUuXG4gIHJlcXVpcmVzOiBbJ2F1dG9tYXRpb24nLCAndHJpZ2dlcnMnLCAnYW5hbHl0aWNzJywgJ3NoYXJpbmcnXSxcblxuICBvYmplY3RzOiBbQXJ0aWNsZUZlZWRiYWNrLCBDYXNlLCBLbm93bGVkZ2VBcnRpY2xlXSxcbiAgaG9va3M6IHNlcnZpY2VIb29rcyxcbiAgdmlld3M6IFtDYXNlVmlld3MsIEtub3dsZWRnZUFydGljbGVWaWV3c10sXG4gIHBhZ2VzOiBbQ2FzZURldGFpbFBhZ2VdLFxuICBmbG93czogc2VydmljZUZsb3dzLFxuICBhY3Rpb25zOiBbXG4gICAgRXNjYWxhdGVDYXNlQWN0aW9uLCBDbG9zZUNhc2VBY3Rpb24sIENsYWltQ2FzZUFjdGlvbixcbiAgICBMb2dDYWxsQWN0aW9uLCBMb2dNZWV0aW5nQWN0aW9uLCBDYXNlU2NoZWR1bGVNZWV0aW5nQWN0aW9uLFxuICAgIE1hcmtBcnRpY2xlSGVscGZ1bEFjdGlvbiwgTWFya0FydGljbGVOb3RIZWxwZnVsQWN0aW9uLFxuICBdLFxuICBkYXRhc2V0czogW0Nhc2VEYXRhc2V0XSxcbiAgcmVwb3J0czogW0Nhc2VzQnlTdGF0dXNQcmlvcml0eVJlcG9ydCwgU2xhUGVyZm9ybWFuY2VSZXBvcnQsIENhc2VzT3BlbmVkQnlEYXlQcmlvcml0eVJlcG9ydF0sXG4gIGRhc2hib2FyZHM6IFtTZXJ2aWNlRGFzaGJvYXJkXSxcbiAgc2tpbGxzOiBzZXJ2aWNlU2tpbGxzLFxuICBzaGFyaW5nUnVsZXM6IHNlcnZpY2VTaGFyaW5nUnVsZXMsXG4gIGVtYWlsVGVtcGxhdGVzOiBTZXJ2aWNlRW1haWxUZW1wbGF0ZXMsXG5cbiAgLi4uY29sbGVjdGlvbnMsXG59KTtcblxuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9hY3Rpb25zL2Nhc2UuYWN0aW9ucy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2FjdGlvbnNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9hY3Rpb25zL2Nhc2UuYWN0aW9ucy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBBY3Rpb24gfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5pbXBvcnQgeyBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuXG4vKipcbiAqIENhc2UgYWN0aW9ucyBcdTIwMTQgYWxsIHRocmVlIGRlbGVnYXRlIHRvIHNjcmVlbiBmbG93cyBpblxuICogYHNyYy9zZXJ2aWNlL2Zsb3dzL2Nhc2UtYWN0aW9ucy5mbG93LnRzYCAoc2VlIHRoZSBub3RlIHRoZXJlIGZvciB3aHk6IG1vZGFsXG4gKiBhY3Rpb25zIG5ldmVyIGV4ZWN1dGUgdGhlaXIgYm9keSBpbiAxNi4xLjAsIGFuZCBzY3JpcHQgYm9kaWVzIGNhbm5vdFxuICogVVBEQVRFIGEgcmVjb3JkIG9uIGEgc2hhcmluZy1ydWxlZCBvYmplY3Q7IHNjcmVlbiBmbG93cyBhcmUgdGhlIG1lY2hhbmlzbVxuICogdGhhdCBkZW1vbnN0cmFibHkgd29ya3MsIHNhbWUgYXMgYGNvbnZlcnRfbGVhZGAgLyBgc2NoZWR1bGVfZm9sbG93dXBgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IEVzY2FsYXRlQ2FzZUFjdGlvbjogQWN0aW9uID0ge1xuICBuYW1lOiAnZXNjYWxhdGVfY2FzZScsXG4gIGxhYmVsOiAnRXNjYWxhdGUgQ2FzZScsXG4gIG9iamVjdE5hbWU6ICdjcm1fY2FzZScsXG4gIGljb246ICdhbGVydC10cmlhbmdsZScsXG4gIHR5cGU6ICdmbG93JyxcbiAgdGFyZ2V0OiAnZXNjYWxhdGVfY2FzZScsXG4gIGxvY2F0aW9uczogWydyZWNvcmRfaGVhZGVyJywgJ2xpc3RfaXRlbSddLFxuICB2aXNpYmxlOiBQYGhhcyhyZWNvcmQuaXNfZXNjYWxhdGVkKSAmJiByZWNvcmQuaXNfZXNjYWxhdGVkID09IGZhbHNlICYmIGhhcyhyZWNvcmQuaXNfY2xvc2VkKSAmJiByZWNvcmQuaXNfY2xvc2VkID09IGZhbHNlYCxcbiAgY29uZmlybVRleHQ6ICdUaGlzIHdpbGwgZXNjYWxhdGUgdGhlIGNhc2UgdG8gdGhlIGVzY2FsYXRpb24gdGVhbS4gQ29udGludWU/JyxcbiAgc3VjY2Vzc01lc3NhZ2U6ICdDYXNlIGVzY2FsYXRlZCBzdWNjZXNzZnVsbHkhJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcblxuZXhwb3J0IGNvbnN0IENsb3NlQ2FzZUFjdGlvbjogQWN0aW9uID0ge1xuICBuYW1lOiAnY2xvc2VfY2FzZScsXG4gIGxhYmVsOiAnQ2xvc2UgQ2FzZScsXG4gIG9iamVjdE5hbWU6ICdjcm1fY2FzZScsXG4gIGljb246ICdjaGVjay1jaXJjbGUnLFxuICB0eXBlOiAnZmxvdycsXG4gIHRhcmdldDogJ2Nsb3NlX2Nhc2UnLFxuICBsb2NhdGlvbnM6IFsncmVjb3JkX2hlYWRlciddLFxuICB2aXNpYmxlOiBQYGhhcyhyZWNvcmQuaXNfY2xvc2VkKSAmJiByZWNvcmQuaXNfY2xvc2VkID09IGZhbHNlYCxcbiAgY29uZmlybVRleHQ6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2xvc2UgdGhpcyBjYXNlPycsXG4gIHN1Y2Nlc3NNZXNzYWdlOiAnQ2FzZSBjbG9zZWQgc3VjY2Vzc2Z1bGx5IScsXG4gIHJlZnJlc2hBZnRlcjogdHJ1ZSxcbn07XG5cbi8qKlxuICogQ2xhaW0gQ2FzZSBcdTIwMTQgdGhlIGFmZm9yZGFuY2UgZm9yIHRoZSB1bmFzc2lnbmVkLXRyaWFnZSBnZXN0dXJlLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBgdmlzaWJsZWAgTVVTVCBtaXJyb3IgdGhlIHNoYXJpbmcgZ3JhbnQsIG5ldmVyIGEgY29udmVuaWVuY2UgZmxhZy5cbiAqIGBjYXNlX3VuYXNzaWduZWRfdHJpYWdlX3NoYXJpbmdgIChgc3JjL3NlcnZpY2Uvc2hhcmluZy9jYXNlLnNoYXJpbmcudHNgKSBpcyB3aGF0XG4gKiBkZWNpZGVzIHdoZXRoZXIgdGhlIGFnZW50IGxvb2tpbmcgYXQgdGhpcyBidXR0b24gbWF5IHdyaXRlIHRoZSByb3cgYXQgYWxsLCBzb1xuICogdGhlIHByZWRpY2F0ZSBoZXJlIGlzIGNvcGllZCBmcm9tIGl0IHZlcmJhdGltLiBcdTI2RDQgTmV2ZXIgcmVzdGF0ZSBpdCBhc1xuICogYHJlY29yZC5pc19jbG9zZWQgPT0gZmFsc2VgOiB0aGF0IGZsYWcgaXMgZGVyaXZlZCBhcyBgc3RhdHVzID09PSAnY2xvc2VkJ2AgYW5kXG4gKiBuZXZlciBmbGlwcyBvbiBgcmVzb2x2ZWRgLCBzbyBpdCB3b3VsZCBvZmZlciBhIENsYWltIGJ1dHRvbiBvbiByZXNvbHZlZFxuICogb3duZXJsZXNzIGNhc2VzIHRoZSBhZ2VudCBpcyBub3Qgc2hhcmVkIGFuZCBjYW5ub3QgY2xhaW0gXHUyMDE0IGEgYnV0dG9uIHRoYXRcbiAqIGFuc3dlcnMgRk9SQklEREVOLiBUaGUgYnV0dG9uIGFuZCB0aGUgZ3JhbnQgYXJlIG9uZSBzZW50ZW5jZSBzdGF0ZWQgdHdpY2UsIGFuZFxuICogYHRlc3QvY2xhaW0tY2FzZS1vbmUtb3duZXItd3JpdGVyLnRlc3QudHNgIGhvbGRzIHRoZW0gdG8gdGhhdC5cbiAqXG4gKiBObyBgY29uZmlybVRleHRgOiB0aGUgZmxvdyBvcGVucyBhIHNjcmVlbiB0aGF0IGFza3Mgd2hpY2ggd29ya2luZyBzdGF0dXMgdGhlXG4gKiBhZ2VudCBpcyBjbGFpbWluZyBpbnRvLCBhbmQgdGhhdCBzY3JlZW4gSVMgdGhlIGNvbmZpcm1hdGlvbi4gQSBtb2RhbCBpbiBmcm9udFxuICogb2YgaXQgd291bGQgYmUgdHdvIGRpYWxvZ3MgZm9yIG9uZSBnZXN0dXJlLlxuICovXG5leHBvcnQgY29uc3QgQ2xhaW1DYXNlQWN0aW9uOiBBY3Rpb24gPSB7XG4gIG5hbWU6ICdjbGFpbV9jYXNlJyxcbiAgbGFiZWw6ICdDbGFpbSBDYXNlJyxcbiAgb2JqZWN0TmFtZTogJ2NybV9jYXNlJyxcbiAgaWNvbjogJ3VzZXItcGx1cycsXG4gIHR5cGU6ICdmbG93JyxcbiAgdGFyZ2V0OiAnY2xhaW1fY2FzZScsXG4gIGxvY2F0aW9uczogWydyZWNvcmRfaGVhZGVyJywgJ2xpc3RfaXRlbSddLFxuICAvLyBcdTI2RDQgRGVsaWJlcmF0ZWx5IE5PVCBgaGFzKClgLWd1YXJkZWQgXHUyMDE0IHRoZSBvbmUgc2l0ZSB0aGUgIzE4OTAgdG90YWxpdHkgc3dlZXBcbiAgLy8gbGVmdCBhbG9uZSBhZnRlciBtYWtpbmcgZXZlcnkgb3RoZXIgYHZpc2libGVgIGluIGBzcmMvYWN0aW9ucy9gIHRvdGFsLiBUaGlzXG4gIC8vIHByZWRpY2F0ZSBpcyB0aGUgc2hhcmluZyBncmFudCdzIG93biB0ZXh0LCB2ZXJiYXRpbSwgYW5kXG4gIC8vIGB0ZXN0L2NsYWltLWNhc2Utb25lLW93bmVyLXdyaXRlci50ZXN0LnRzYCBjb21wYXJlcyB0aGUgdHdvIHN0cmluZ3M7IHRoZVxuICAvLyBncmFudCBpdHNlbGYgY2Fubm90IGNhcnJ5IGBoYXMoKWAsIGJlY2F1c2UgYHBsdWdpbi1zaGFyaW5nYCBjb21waWxlcyBhXG4gIC8vIGNyaXRlcmlhIGNvbmRpdGlvbiB3aXRoIGBjb21waWxlQ2VsVG9GaWx0ZXJgLCB3aGljaCByZWplY3RzIHRoZSB3aG9sZVxuICAvLyBmdW5jdGlvbi1jYWxsIGNsYXNzLCBhbmQgYW4gdW50cmFuc2xhdGFibGUgcnVsZSBpcyBEUk9QUEVEIGJ5IHRoZSBzZWVkZXJcbiAgLy8gKCM2MjEpLiBgc3JjL3NlcnZpY2Uvc2hhcmluZy9jYXNlLnNoYXJpbmcudHNgIHdyaXRlcyB0aGF0IG91dCBpbiBmdWxsLCBpbmNsdWRpbmcgd2h5XG4gIC8vIGByZWNvcmQub3duZXJfaWQgPT0gbnVsbGAgaXMgdG90YWwgb25lIGxheWVyIGRvd24gKGB7IG93bmVyX2lkOiB7ICRudWxsOiB0cnVlIH0gfWApLlxuICAvLyBcdTI2QTBcdUZFMEYgV2hhdCB0aGF0IHJlYXNvbmluZyBkb2VzIE5PVCBjb3ZlciBpcyBUSElTIHN1cmZhY2U6IGFuIGFjdGlvbiBgdmlzaWJsZWAgaXNcbiAgLy8gaW50ZXJwcmV0ZWQgYnkgQ0VMIGluIHRoZSBicm93c2VyIGFnYWluc3Qgd2hhdGV2ZXIgdGhlIHBhZ2UgaG9sZHMsIHdoaWNoIGlzXG4gIC8vIGB7fWAgZm9yIHRoZSBmaXJzdCByZW5kZXJzLCBzbyB0aGlzIHByZWRpY2F0ZSBkb2VzIGFib3J0IHRoZXJlLiBNYWtpbmcgaXRcbiAgLy8gdG90YWwgbmVlZHMgdGhlIGdyYW50IGFuZCB0aGUgcGFyaXR5IHBpbiBtb3ZlZCB0b2dldGhlciBcdTIwMTQgYSBtYWludGFpbmVyIGNhbGwsXG4gIC8vIG5vdCB0aGlzIGNhcmQncy4gKCMxODkwKVxuICB2aXNpYmxlOiBQYHJlY29yZC5vd25lcl9pZCA9PSBudWxsICYmIHJlY29yZC5zdGF0dXMgIT0gXCJyZXNvbHZlZFwiICYmIHJlY29yZC5zdGF0dXMgIT0gXCJjbG9zZWRcImAsXG4gIHN1Y2Nlc3NNZXNzYWdlOiAnQ2FzZSBjbGFpbWVkIFx1MjAxNCBpdCBpcyB5b3VycyBub3cuJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2Uvb2JqZWN0cy9pbmRleC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL2luZGV4LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFNlcnZpY2Ugb2JqZWN0IGJhcnJlbC5cbiAqXG4gKiBSZS1leHBvcnRzIHRoaXMgcGFja2FnZSdzICoub2JqZWN0LnRzIGRlZmluaXRpb25zOyB0aGUgYCouaG9vay50c2AgZmlsZXNcbiAqIGJlc2lkZSB0aGVtIHJlZ2lzdGVyIHRocm91Z2ggYC4vaG9va3MudHNgLiBUaGUgY2Fub25pY2FsIG5vdGUgb24gdGhlXG4gKiBjb2xsYWJvcmF0aW9uIGNhcGFiaWxpdGllcyAoYGVuYWJsZS5maWxlc2AsIGBlbmFibGUuZmVlZHNgKSB0aGF0IGV2ZXJ5XG4gKiBvYmplY3QgaW4gdGhpcyBhcHAgcG9pbnRzIGF0IGlzIHdyaXR0ZW4gb25jZSwgaW5cbiAqIGBzcmMvc2FsZXMvb2JqZWN0cy9pbmRleC50c2AuXG4gKi9cblxuZXhwb3J0IHsgQXJ0aWNsZUZlZWRiYWNrIH0gZnJvbSAnLi9hcnRpY2xlX2ZlZWRiYWNrLm9iamVjdCc7XG5leHBvcnQgeyBDYXNlIH0gZnJvbSAnLi9jYXNlLm9iamVjdCc7XG5leHBvcnQgeyBLbm93bGVkZ2VBcnRpY2xlIH0gZnJvbSAnLi9rbm93bGVkZ2VfYXJ0aWNsZS5vYmplY3QnO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL2FydGljbGVfZmVlZGJhY2sub2JqZWN0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2Uvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHMvYXJ0aWNsZV9mZWVkYmFjay5vYmplY3QudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IE9iamVjdFNjaGVtYSwgRmllbGQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcblxuLyoqXG4gKiBBcnRpY2xlIEZlZWRiYWNrIE9iamVjdCAoIzYwMSlcbiAqXG4gKiBPbmUgcmVhZGVyJ3MgdmVyZGljdCBvbiBvbmUga25vd2xlZGdlIGFydGljbGUgXHUyMDE0IHRoZSBXUklURVIgYmVoaW5kXG4gKiBgY3JtX2tub3dsZWRnZV9hcnRpY2xlLmhlbHBmdWxfY291bnRgIC8gYG5vdF9oZWxwZnVsX2NvdW50YCwgd2hpY2ggd2VyZVxuICogYHJlYWRvbmx5YCB3aXRoIG5vdGhpbmcgb24gZWl0aGVyIHNpZGUgb2YgdGhlIHBsYXRmb3JtIGFibGUgdG8gbW92ZSB0aGVtLlxuICpcbiAqICMjIyBXaHkgYSByb3cgYW5kIG5vdCBhIGNvdW50ZXIgYnVtcFxuICpcbiAqIFRoZSBvYnZpb3VzIHNoYXBlIFx1MjAxNCBhIFwiSGVscGZ1bFwiIGJ1dHRvbiB3aG9zZSBhY3Rpb24gYm9keSBkb2VzXG4gKiBgaGVscGZ1bF9jb3VudCArIDFgIFx1MjAxNCBjYW5ub3QgYmUgYnVpbHQgb24gdGhpcyBwbGF0Zm9ybSwgYW5kIHRoZSByZWFzb24gaXNcbiAqIG1lYXN1cmVkIHJhdGhlciB0aGFuIGFzc3VtZWQ6XG4gKlxuICogIC0gQSBgdHlwZTogJ3NjcmlwdCdgIGFjdGlvbiBib2R5IHJ1bnMgaW4gdGhlIFF1aWNrSlMgc2FuZGJveCwgd2hvc2VcbiAqICAgIGV4ZWN1dGlvbiBjb250ZXh0IGNhcnJpZXMgbm8gY2FsbGVyIGlkZW50aXR5LiBBbiBVUERBVEUgaXQgaXNzdWVzIGFnYWluc3RcbiAqICAgIGFuIG9iamVjdCB3aXRoIHNoYXJpbmcgcnVsZXMgaXMgcmVmdXNlZCBieSB0aGUgc2hhcmluZyBtaWRkbGV3YXJlIGV2ZW4gZm9yXG4gKiAgICB0aGUgcmVjb3JkJ3Mgb3duZXIgXHUyMDE0IHRoZSBtZWFzdXJlbWVudCBgc3JjL3NlcnZpY2UvZmxvd3MvY2FzZS1hY3Rpb25zLmZsb3cudHNgXG4gKiAgICByZWNvcmRzLCBhbmQgdGhlIHJlYXNvbiBib3RoIGNhc2UgYWN0aW9ucyBhcmUgc2NyZWVuIGZsb3dzLiBJTlNFUlRTIGFyZVxuICogICAgdW5hZmZlY3RlZCwgd2hpY2ggaXMgdGhlIHNlYW0gdGhpcyBvYmplY3QgdGFrZXMuXG4gKiAgLSBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCBpcyBgcHVibGljX3JlYWRgOiByZWFkLW9wZW4sIFdSSVRFLU9XTkVELiBTbyB0aGVcbiAqICAgIG9uZSBhZ2VudCB3aG8gY291bGQgYnVtcCB0aGUgY291bnRlciBieSBoYW5kIGlzIHRoZSBhcnRpY2xlJ3MgYXV0aG9yLFxuICogICAgd2hpY2ggaXMgcHJlY2lzZWx5IHRoZSBwZXJzb24gd2hvc2Ugdm90ZSBpcyB3b3J0aGxlc3MuXG4gKiAgLSBUaGVyZSBpcyBubyBhdG9taWMgaW5jcmVtZW50IG9uIHRoZSBkYXRhIEFQSSwgc28gdHdvIGNvbmN1cnJlbnQgdm90ZXNcbiAqICAgIHJlYWQtbW9kaWZ5LXdyaXRlIHRoZSBzYW1lIHZhbHVlIGFuZCBvbmUgb2YgdGhlbSBkaXNhcHBlYXJzLlxuICpcbiAqIEEgdm90ZSByb3cgc2lkZXN0ZXBzIGFsbCB0aHJlZTogdGhlIHJlYWRlciBJTlNFUlRTIHRoZWlyIG93biByb3cgKGFsbG93ZWQpLFxuICogYW5kIGBhcnRpY2xlX2ZlZWRiYWNrX21ldHJpY3NfcmVmcmVzaGAgKGBhcnRpY2xlX2ZlZWRiYWNrLmhvb2sudHNgKSBSRUNPVU5UU1xuICogdGhlIGFydGljbGUncyB0d28gY291bnRlcnMgZnJvbSB0aGlzIHRhYmxlIHVuZGVyIHRoZSBob29rJ3Mgb3duIHByaXZpbGVnZXMuXG4gKiBSZWNvdW50LCBub3QgaW5jcmVtZW50IFx1MjAxNCBpdCBpcyBpZGVtcG90ZW50LCBpdCBzZWxmLWhlYWxzIGFmdGVyIGEgZGVsZXRlZCBvclxuICogZWRpdGVkIHZvdGUsIGFuZCBpdCBjYW5ub3QgZHJpZnQgdGhlIHdheSBhIHJ1bm5pbmcgdG90YWwgZG9lcy4gRXhhY3RseSB0aGVcbiAqIHNoYXBlIGBjYW1wYWlnbl9tZW1iZXJfbWV0cmljc19yZWZyZXNoYCB1c2VzIHRvIGtlZXAgYGNybV9jYW1wYWlnbmAncyBtZXRyaWNcbiAqIGJsb2NrIGxpdmUgKCM1OTcpLCB3aGljaCBpcyB0aGUgcHJlY2VkZW50IHRoaXMgZmlsZSBmb2xsb3dzIG9uIHB1cnBvc2VcbiAqIHJhdGhlciB0aGFuIGludmVudGluZyBhIHNlY29uZCBpZGlvbSBmb3IgdGhlIHNhbWUgcHJvYmxlbS5cbiAqXG4gKiAjIyMgV2hhdCBpdCBidXlzIGJleW9uZCBhIHdyaXRlclxuICpcbiAqIEEgY291bnRlciB3aXRoIG5vIHJvdyBiZWhpbmQgaXQgY2Fubm90IGFuc3dlciBcImRpZCB0aGlzIHBlcnNvbiBhbHJlYWR5XG4gKiB2b3RlXCIsIHNvIGl0IGNvdW50cyBvbmUgZW50aHVzaWFzdCBmb3J0eSB0aW1lcy4gYHVuaXF1ZV92b3RlX3Blcl9yZWFkZXJgXG4gKiBiZWxvdyBrZXlzIG9uZSByb3cgcGVyIChhcnRpY2xlLCByZWFkZXIpIGFuZCB0aGUgYHN1Ym1pdF9hcnRpY2xlX2ZlZWRiYWNrYFxuICogYWN0aW9uIFVQREFURVMgdGhhdCByb3cgd2hlbiBhIHJlYWRlciBjaGFuZ2VzIHRoZWlyIG1pbmQgXHUyMDE0IHNvIHRoZSBjb3VudGVyc1xuICogbWVhbiBcImhvdyBtYW55IHBlb3BsZVwiLCB3aGljaCBpcyB0aGUgb25seSByZWFkaW5nIHRoYXQgbWFrZXNcbiAqIGBoZWxwZnVsX2NvdW50YCB2cyBgbm90X2hlbHBmdWxfY291bnRgIGEgY29tcGFyaXNvbiByYXRoZXIgdGhhbiB0d29cbiAqIHVucmVsYXRlZCB0YWxsaWVzLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBgdmVyZGljdGAgaXMgZGVsaWJlcmF0ZWx5IHR3by12YWx1ZWQuIEEgZml2ZS1zdGFyIHNjYWxlLCBhIGZyZWUtdGV4dFxuICogcmVhc29uIHRheG9ub215IGFuZCBcIndhcyB0aGlzIGFydGljbGUgdXAgdG8gZGF0ZVwiIGFyZSBhbGwgcGxhdXNpYmxlIGFuZCBhbGxcbiAqIHVuYnVpbHQ6IHRoaXMgb2JqZWN0IGV4aXN0cyB0byBnaXZlIHR3byBkZWNsYXJlZCBjb3VudGVycyBhIHJlYWwgd3JpdGVyLCBhbmRcbiAqIGEgdm9jYWJ1bGFyeSBub3RoaW5nIHJlYWRzIHdvdWxkIHJlY3JlYXRlIHRoZSB2ZXJ5IGRlZmVjdCBpdCBpcyBmaXhpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBBcnRpY2xlRmVlZGJhY2sgPSBPYmplY3RTY2hlbWEuY3JlYXRlKHtcbiAgbmFtZTogJ2NybV9hcnRpY2xlX2ZlZWRiYWNrJyxcbiAgbGFiZWw6ICdBcnRpY2xlIEZlZWRiYWNrJyxcbiAgcGx1cmFsTGFiZWw6ICdBcnRpY2xlIEZlZWRiYWNrJyxcbiAgaWNvbjogJ3RodW1icy11cCcsXG4gIGRlc2NyaXB0aW9uOiAnT25lIHJlYWRlclx1MjAxOXMgaGVscGZ1bCAvIG5vdC1oZWxwZnVsIHZlcmRpY3Qgb24gYSBrbm93bGVkZ2UgYXJ0aWNsZScsXG5cbiAgLy8gQURSLTAwOTAgRDEvRDc6IE9XRCBpcyBhbiBhdXRob3JlZCBkZWNpc2lvbi4gRmVlZGJhY2sgaXMgYW4gYXR0cmlidXRlIG9mXG4gIC8vIHRoZSBhcnRpY2xlLCBzbyByZWNvcmQgYWNjZXNzIERFUklWRVMgZnJvbSBpdCAoQURSLTAwNTUpIFx1MjAxNCB0aGUgc2FtZSBjYWxsXG4gIC8vIGBjcm1fY2FtcGFpZ25fbWVtYmVyYCBtYWtlcywgYW5kIGZvciB0aGUgc2FtZSByZWFzb246IGEgdm90ZSByb3cgbWVhbnNcbiAgLy8gbm90aGluZyBhcGFydCBmcm9tIHRoZSBhcnRpY2xlIGl0IGlzIGFib3V0LCBhbmQgYGNybV9rbm93bGVkZ2VfYXJ0aWNsZWAgaXNcbiAgLy8gYHB1YmxpY19yZWFkYCwgc28gYW55b25lIHdobyBjYW4gcmVhZCB0aGUgYXJ0aWNsZSBjYW4gcmVhZCBpdHMgZmVlZGJhY2suXG4gIC8vXG4gIC8vIFx1MjZENCBOb3QgYHByaXZhdGVgOiB3aXRoIHRoZSB2b3RlciBhcyBvd25lciwgdGhlIGNvdW50ZXJzJyBvd24gZXZpZGVuY2Ugd291bGRcbiAgLy8gYmUgaW52aXNpYmxlIHRvIHRoZSBhdXRob3IgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhlbSBcdTIwMTQgdGhlIHNhbWUgd2F5IGl0IHdhc1xuICAvLyB3cm9uZyBvbiBgY3JtX2NhbXBhaWduX21lbWJlcmAuXG4gIHNoYXJpbmdNb2RlbDogJ2NvbnRyb2xsZWRfYnlfcGFyZW50JyxcblxuICAvLyBBRFItMDA3OToganVuY3Rpb24gcm93cyBoYXZlIG5vIGRlcml2YWJsZSB0ZXh0IHRpdGxlOyBwb2ludCB0aGUgY2Fub25pY2FsXG4gIC8vIG5hbWVGaWVsZCBhdCB0aGUgc3RvcmVkIGF1dG9udW1iZXIgZXhwbGljaXRseSAoYXV0b251bWJlciBpcyBub3QgaW4gdGhlXG4gIC8vIGF1dG8tZGVyaXZhdGlvbiB3aGl0ZWxpc3QpLiBTYW1lIGNhbGwgYXMgYGNybV9jYW1wYWlnbl9tZW1iZXJgIGFuZFxuICAvLyBgY3JtX2V2ZW50X2F0dGVuZGVlYC5cbiAgbmFtZUZpZWxkOiAnZmVlZGJhY2tfbnVtYmVyJyxcblxuICAvLyBBIHJlbGF0ZWQgbGlzdCB0YWtlcyBpdHMgY29sdW1ucyBmcm9tIHRoZSBjaGlsZCdzIGBoaWdobGlnaHRGaWVsZHNgIE1JTlVTXG4gIC8vIHRoZSBsb29rdXAgaXQgaXMgc2NvcGVkIGJ5LCBhbmQgdGhpcyBvYmplY3Qgc2hpcHMgbm8gdmlldyBvZiBpdHMgb3duIFx1MjAxNCBzb1xuICAvLyB0aGlzIGxpc3QgSVMgdGhlIGZlZWRiYWNrIHBhbmVsIG9uIGFuIGFydGljbGUncyBkZXRhaWwgcGFnZSAoIzk0NCk6IHRoZVxuICAvLyB2ZXJkaWN0LCBhbmQgd2hvIGdhdmUgaXQuXG4gIC8vXG4gIC8vIFRXTyBmaWVsZHMgYXJlIGRlbGliZXJhdGVseSBhYnNlbnQsIGZvciB0d28gZGlmZmVyZW50IHJlYXNvbnM6XG4gIC8vXG4gIC8vICAtIGBmZWVkYmFja19udW1iZXJgLCB0aGUgc2FtZSBjYWxsIGBjcm1fY2FtcGFpZ25fbWVtYmVyYCBtYWtlcyB3aXRoXG4gIC8vICAgIGBtZW1iZXJfbnVtYmVyYDogaXQgaXMgdGhlIHJlY29yZCBUSVRMRSwgd2hpY2ggYSBkZXRhaWwgcGFnZSBob2lzdHMgb3V0XG4gIC8vICAgIG9mIHRoZSBib2R5LCBzbyBsZWFkaW5nIHRoZSBzdHJpcCB3aXRoIGl0IHdvdWxkIGZpbGwgdGhlIHBhbmVsIHdpdGhcbiAgLy8gICAgYXV0b251bWJlcnMgaW5zdGVhZCBvZiB2ZXJkaWN0cy5cbiAgLy8gIC0gYGNvbW1lbnRgLCBhIDUwMC1jaGFyYWN0ZXIgdGV4dGFyZWEuIEEgaGlnaGxpZ2h0IHN0cmlwIGhvbGRzIHNob3J0XG4gIC8vICAgIHZhbHVlcywgYW5kIGtlZXBpbmcgaXQgb3V0IGlzIGFsc28gd2hhdCBzdG9wcyB0aGUgYGJhc2ljYCBncm91cCBiZWluZ1xuICAvLyAgICBFTlRJUkVMWSB0aXRsZS1vci1zdHJpcCBcdTIwMTQgYSBncm91cCB3aG9zZSBldmVyeSBmaWVsZCBpcyBob2lzdGVkIGtlZXBzIGl0c1xuICAvLyAgICBoZWFkaW5nIG9uIGZvcm1zIGFuZCBzaWxlbnRseSB2YW5pc2hlcyBmcm9tIGRldGFpbCBwYWdlc1xuICAvLyAgICAoYGZpZWxkLWdyb3VwLXNoYWRvd2VkYCwgdGhlIHNhbWUgdHJhcCBgY3JtX2NhbXBhaWduX21lbWJlcmAncyBgYmFzaWNgXG4gIC8vICAgIGdyb3VwIGFuZCBgY3JtX3Rhc2tgJ3MgYGFzc2lnbm1lbnRgIGdyb3VwIGVhY2ggaGFkIHRvIGJlIHJlc2N1ZWQgZnJvbSkuXG4gIC8vICAgIFNvIHRoZSBjb21tZW50IGlzIHRoZSBncm91cCdzIG93biBjb250ZW50IG9uIHRoZSByb3cncyBkZXRhaWwgcGFnZSxcbiAgLy8gICAgYW5kIHJlYWNoZXMgdGhlIHBhbmVsIHRocm91Z2ggYHJlbGF0ZWRMaXN0Q29sdW1uc2Agb24gdGhlIGFydGljbGVcbiAgLy8gICAgbG9va3VwIGJlbG93IGluc3RlYWQgKCMxMTk5KS5cbiAgaGlnaGxpZ2h0RmllbGRzOiBbJ2NybV9rbm93bGVkZ2VfYXJ0aWNsZScsICd2ZXJkaWN0JywgJ293bmVyX2lkJ10sXG5cbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2Jhc2ljJywgbGFiZWw6ICdGZWVkYmFjaycsIGljb246ICdtZXNzYWdlLXNxdWFyZScgfSxcbiAgXSxcblxuICBmaWVsZHM6IHtcbiAgICBmZWVkYmFja19udW1iZXI6IEZpZWxkLmF1dG9udW1iZXIoe1xuICAgICAgbGFiZWw6ICdGZWVkYmFjayAjJyxcbiAgICAgIGZvcm1hdDogJ0FGLXswMDAwfScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICB9KSxcblxuICAgIC8vIFBsYXRmb3JtIG93bmVyc2hpcCBhbmNob3IgXHUyMDE0IGNhbm9uaWNhbCBub3RlIGluIGBhY2NvdW50Lm9iamVjdC50c2AgKCM1NDgpLlxuICAgIC8vIEhlcmUgaXQgaXMgYWxzbyB0aGUgVk9URVI6IHRoZSBwbGF0Zm9ybSBzdGFtcHMgaXQgb24gaW5zZXJ0LCB3aGljaCBpc1xuICAgIC8vIHdoYXQgYHVuaXF1ZV92b3RlX3Blcl9yZWFkZXJgIGtleXMgb24gYW5kIHdoYXQgbGV0cyBhIHJlYWRlciBjaGFuZ2VcbiAgICAvLyB0aGVpciBvd24gbWluZCB3aXRob3V0IGFuIGFkbWluJ3MgaGVscC5cbiAgICBvd25lcl9pZDogRmllbGQubG9va3VwKCdzeXNfdXNlcicsIHtcbiAgICAgIGxhYmVsOiAnUmVhZGVyJyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgc3lzdGVtOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IGZhbHNlLFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogVGhlIGFydGljbGUgdGhpcyB2ZXJkaWN0IGlzIGFib3V0LlxuICAgICAqXG4gICAgICogYGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZSdgIFx1MjAxNCBhIHZvdGUgb24gYSBkZWxldGVkIGFydGljbGUgZGVub3Rlc1xuICAgICAqIG5vdGhpbmcuIFRoaXMgaXMgdGhlIGxlc3NvbiAjNjk2IGNvc3QgdGhlIGNhbXBhaWduIGp1bmN0aW9uOiBib3RoIHBhcnR5XG4gICAgICogbG9va3VwcyB0aGVyZSB0b29rIGBGaWVsZC5sb29rdXBgJ3MgYHNldF9udWxsYCBkZWZhdWx0LCB0aGUgY2xlYXJlZCByb3dcbiAgICAgKiBpbnN0YW50bHkgdmlvbGF0ZWQgdGhlIG9iamVjdCdzIG93biByZXF1aXJlZC1yZWZlcmVuY2UgcnVsZSwgYW5kIGV2ZXJ5XG4gICAgICogZW5yb2xsZWQgcGVyc29uIGJlY2FtZSBwZXJtYW5lbnRseSB1bmRlbGV0YWJsZS4gQSByZXF1aXJlZCBsb29rdXAgdGhhdFxuICAgICAqIGRlZmF1bHRzIHRvIGBzZXRfbnVsbGAgaXMgdGhhdCBidWcgd2FpdGluZyB0byBoYXBwZW4sIHNvIHRoZSBiZWhhdmlvdXIgaXNcbiAgICAgKiBzcGVsbGVkIG91dCBoZXJlIHJhdGhlciB0aGFuIGluaGVyaXRlZC5cbiAgICAgKi9cbiAgICBjcm1fa25vd2xlZGdlX2FydGljbGU6IEZpZWxkLmxvb2t1cCgnY3JtX2tub3dsZWRnZV9hcnRpY2xlJywge1xuICAgICAgbGFiZWw6ICdBcnRpY2xlJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0tub3dsZWRnZSBhcnRpY2xlIHRoaXMgZmVlZGJhY2sgaXMgYWJvdXQuJyxcblxuICAgICAgLy8gQ3VyYXRlcyB0aGUgZmVlZGJhY2sgcGFuZWwgb24gdGhlIGFydGljbGUncyBkZXRhaWwgcGFnZSBcdTIwMTQgdGhlIHN1cmZhY2VcbiAgICAgIC8vIHRoZSBhcnRpY2xlJ3MgQVVUSE9SIHJlYWRzICgjMTE5OSkuIEEgcmVsYXRlZCBsaXN0IHJlYWRzXG4gICAgICAvLyBgcmVsYXRlZExpc3RDb2x1bW5zYCBvbiB0aGUgY2hpbGQncyBsb29rdXAgYmVmb3JlIGl0IGZhbGxzIGJhY2sgdG9cbiAgICAgIC8vIGBoaWdobGlnaHRGaWVsZHNgIG1pbnVzIHRoYXQgbG9va3VwICgjOTQ0KSwgc28gdGhpcyBpcyBhIFNVUEVSU0VUIG9mXG4gICAgICAvLyB0aGUgZmFsbGJhY2sgKFZlcmRpY3QgLyBSZWFkZXIpIHBsdXMgYGNvbW1lbnRgOiB0aGUgbm90ZSBhIHJlYWRlclxuICAgICAgLy8gdHlwZXMgdG8gZXhwbGFpbiBhIHZlcmRpY3Qgd2FzIHN0b3JlZCBhbmQgc2hvd24gb24gbm8gbGlzdCwgYW5kIHRoZVxuICAgICAgLy8gYXV0aG9yIHRoZSBmaWVsZCdzIG93biBkZXNjcmlwdGlvbiBuYW1lcyBjb3VsZCBub3Qgc2VlIGl0IHdpdGhvdXRcbiAgICAgIC8vIG9wZW5pbmcgZWFjaCByb3cuIExhc3QsIGJlY2F1c2UgaXQgaXMgdGhlIG9uZSBsb25nIHZhbHVlLlxuICAgICAgLy9cbiAgICAgIC8vIFx1MjZENCBEZWxpYmVyYXRlbHkgTk9UIHNvbHZlZCBieSBhZGRpbmcgYGNvbW1lbnRgIHRvIGBoaWdobGlnaHRGaWVsZHNgIFx1MjAxNFxuICAgICAgLy8gc2VlIHRoZSBub3RlIGFib3ZlIHRoYXQgbGlzdCAoYGZpZWxkLWdyb3VwLXNoYWRvd2VkYCkuXG4gICAgICByZWxhdGVkTGlzdENvbHVtbnM6IFsndmVyZGljdCcsICdvd25lcl9pZCcsICdjb21tZW50J10sXG4gICAgfSksXG5cbiAgICB2ZXJkaWN0OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdWZXJkaWN0JyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0hlbHBmdWwnLCB2YWx1ZTogJ2hlbHBmdWwnLCBjb2xvcjogJyMxMEI5ODEnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdOb3QgSGVscGZ1bCcsIHZhbHVlOiAnbm90X2hlbHBmdWwnLCBjb2xvcjogJyNFRjQ0NDQnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgY29tbWVudDogRmllbGQudGV4dGFyZWEoe1xuICAgICAgbGFiZWw6ICdDb21tZW50JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbWF4TGVuZ3RoOiA1MDAsXG4gICAgICBkZXNjcmlwdGlvbjogJ09wdGlvbmFsIG5vdGUgZXhwbGFpbmluZyB0aGUgdmVyZGljdCBcdTIwMTQgcmVhZCBieSB0aGUgYXJ0aWNsZVx1MjAxOXMgYXV0aG9yLicsXG4gICAgfSksXG4gIH0sXG5cbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ2NybV9rbm93bGVkZ2VfYXJ0aWNsZSddIH0sXG4gICAgeyBmaWVsZHM6IFsndmVyZGljdCddIH0sXG4gICAgLy8gT25lIHZvdGUgcGVyIHJlYWRlciBwZXIgYXJ0aWNsZS4gV2l0aG91dCBpdCB0aGUgY291bnRlcnMgYW5zd2VyIFwiaG93IG1hbnlcbiAgICAvLyBjbGlja3NcIiwgd2hpY2ggaXMgbm90IGEgbnVtYmVyIGFueWJvZHkgd2FudHMgbmV4dCB0byBcIk5vdCBIZWxwZnVsXCIuXG4gICAgLy9cbiAgICAvLyBgdW5pcXVlOiAnb3JnYW5pemF0aW9uJ2Agc3RhdGVzIHRoZSBzY29wZSBleHBsaWNpdGx5LCBwZXIgQURSLTAxMjA6IHRoZVxuICAgIC8vIGRyaXZlciBwcmVwZW5kcyB0aGUgTlVMTC1zYWZlIG9yZ2FuaXphdGlvbiBrZXkgcGFydFxuICAgIC8vIChgQ09BTEVTQ0Uob3JnYW5pemF0aW9uX2lkLCAnX19nbG9iYWxfXycpYCkgYXQgcmVnaXN0cmF0aW9uLCBzbyB0aGVcbiAgICAvLyBjb25zdHJhaW50IGlzIG9uZSB2b3RlIHBlciByZWFkZXIgcGVyIGFydGljbGUgV0lUSElOIGFuIG9yZ2FuaXphdGlvbixcbiAgICAvLyBhbmQgcm93cyB3aXRoIG5vIG9yZ2FuaXphdGlvbiBmb3JtIG9uZSBidWNrZXQgcmF0aGVyIHRoYW4gZWFjaCBlc2NhcGluZ1xuICAgIC8vIHVuZGVyIFNRTCdzIE5VTEwtZGlzdGluY3Qgc2VtYW50aWNzLiBCYXJlIGB1bmlxdWU6IHRydWVgIGlzIHRoZVxuICAgIC8vIGRlcHJlY2F0ZWQgcG9zaXRpb25hbCBzcGVsbGluZyBvZiBgJ2dsb2JhbCdgIFx1MjAxNCBpdCB3YXJucyB0b2RheVxuICAgIC8vIChgdW5pcXVlL3Vuc2NvcGVkLWRlY2xhcmVkLWluZGV4YCkgYW5kIHByb3RvY29sIDE4IHJlamVjdHMgaXQsIGFuZFxuICAgIC8vIFwiZ2xvYmFsbHkgdW5pcXVlIGFjcm9zcyBldmVyeSBpbnN0YWxsYXRpb25cIiBpcyBub3Qgd2hhdCBvbmUgcmVhZGVyJ3NcbiAgICAvLyBvcGluaW9uIG9mIG9uZSBhcnRpY2xlIG1lYW5zLlxuICAgIHsgZmllbGRzOiBbJ2NybV9rbm93bGVkZ2VfYXJ0aWNsZScsICdvd25lcl9pZCddLCB1bmlxdWU6ICdvcmdhbml6YXRpb24nIH0sXG4gIF0sXG5cbiAgZW5hYmxlOiB7XG4gICAgYXBpRW5hYmxlZDogdHJ1ZSxcbiAgICBhcGlNZXRob2RzOiBbJ2dldCcsICdsaXN0JywgJ2NyZWF0ZScsICd1cGRhdGUnLCAnZGVsZXRlJ10sXG4gIH0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2Uvb2JqZWN0cy9jYXNlLm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL2Nhc2Uub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBPYmplY3RTY2hlbWEsIEZpZWxkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBGLCBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuXG5leHBvcnQgY29uc3QgQ2FzZSA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX2Nhc2UnLFxuICBsYWJlbDogJ0Nhc2UnLFxuICBwbHVyYWxMYWJlbDogJ0Nhc2VzJyxcbiAgaWNvbjogJ2xpZmUtYnVveScsXG4gIGRlc2NyaXB0aW9uOiAnQ3VzdG9tZXIgc3VwcG9ydCBjYXNlcyBhbmQgc2VydmljZSByZXF1ZXN0cycsXG5cbiAgLy8gQURSLTAwOTAgRDEvRDc6IE9XRCBpcyBhbiBhdXRob3JlZCBkZWNpc2lvbi4gT3duZXIgKyBlc2NhbGF0aW9uIHNoYXJpbmcgcnVsZS5cbiAgc2hhcmluZ01vZGVsOiAncHJpdmF0ZScsXG5cbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2Jhc2ljJywgICAgICAgbGFiZWw6ICdDYXNlIEluZm9ybWF0aW9uJywgaWNvbjogJ2luZm8nIH0sXG4gICAgeyBrZXk6ICdvcmlnaW4nLCAgICAgIGxhYmVsOiAnT3JpZ2luICYgUm91dGluZycsIGljb246ICdyb3V0ZScgfSxcbiAgICB7IGtleTogJ3NsYScsICAgICAgICAgbGFiZWw6ICdTTEEgJiBQcmlvcml0eScsICAgaWNvbjogJ2Nsb2NrJyB9LFxuICAgIHsga2V5OiAncmVzb2x1dGlvbicsICBsYWJlbDogJ1Jlc29sdXRpb24nLCAgICAgICBpY29uOiAnY2hlY2stY2lyY2xlJyB9LFxuICAgIHsga2V5OiAnZXNjYWxhdGlvbicsICBsYWJlbDogJ0VzY2FsYXRpb24nLCAgICAgICBpY29uOiAnYWxlcnQtdHJpYW5nbGUnLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ3N5c3RlbScsICAgICAgbGFiZWw6ICdTeXN0ZW0nLCAgICAgICAgICAgaWNvbjogJ2RhdGFiYXNlJywgICAgICAgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gUGxhdGZvcm0gb3duZXJzaGlwIGFuY2hvciBcdTIwMTQgY2Fub25pY2FsIG5vdGUgaW4gYGFjY291bnQub2JqZWN0LnRzYCAoIzU0OCkuXG4gICAgb3duZXJfaWQ6IEZpZWxkLmxvb2t1cCgnc3lzX3VzZXInLCB7XG4gICAgICBsYWJlbDogJ0Nhc2UgT3duZXInLFxuICAgICAgZ3JvdXA6ICdvcmlnaW4nLFxuICAgICAgc3lzdGVtOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IGZhbHNlLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgLy8gQ2FzZSBJbmZvcm1hdGlvblxuICAgIC8vXG4gICAgLy8gYHVuaXF1ZTogdHJ1ZWAgaXMgZGVjbGFyZWQgSEVSRSwgb24gdGhlIGZpZWxkLCBhbmQgZGVsaWJlcmF0ZWx5IE5PVCBhcyBhXG4gICAgLy8gYHsgZmllbGRzOiBbJ29yZ2FuaXphdGlvbl9pZCcsICdjYXNlX251bWJlciddLCB1bmlxdWU6IHRydWUgfWAgZW50cnkgaW5cbiAgICAvLyBgaW5kZXhlc1tdYCBiZWxvdyAoIzEwMjMpIFx1MjAxNCBzYW1lIHNwZWxsaW5nIGBjcm1fYWNjb3VudC5uYW1lYCxcbiAgICAvLyBgY3JtX2NvbnRhY3QuZW1haWxgIGFuZCBgY3JtX3Byb2R1Y3Quc2t1YCBhbHJlYWR5IHVzZSwgZm9yIHRoZSBzYW1lXG4gICAgLy8gcmVhc29uLiBTaW5jZSBmcmFtZXdvcmsgIzM2OTYgdGhlIGZpZWxkLWxldmVsIGZvcm0gaXMgcGVyLW9yZ2FuaXphdGlvbjpcbiAgICAvLyBpdCBtYXRlcmlhbGl6ZXMgYXMgdGhlIGNvbXBvc2l0ZSBgKG9yZ2FuaXphdGlvbiBrZXkgcGFydCwgY2FzZV9udW1iZXIpYCxcbiAgICAvLyB1bmlxdWUgV0lUSElOIGFuIG9yZ2FuaXphdGlvbi4gU2luY2UgcGxhdGZvcm0gMTcuMC4wLXJjLjQgKEFEUi0wMTIwIEQzLFxuICAgIC8vICM1MDMwKSB0aGF0IGtleSBwYXJ0IGlzIE5VTEwtc2FmZSBcdTIwMTQgYENPQUxFU0NFKG9yZ2FuaXphdGlvbl9pZCxcbiAgICAvLyAnX19nbG9iYWxfXycpYCBcdTIwMTQgc28gcm93cyB3aXRoIG5vIG9yZ2FuaXphdGlvbiBmb3JtIE9ORSBidWNrZXQgaW5zdGVhZCBvZlxuICAgIC8vIGVhY2ggZXNjYXBpbmcgdGhlIGNvbnN0cmFpbnQgdW5kZXIgU1FMJ3MgTlVMTC1kaXN0aW5jdCBzZW1hbnRpY3MuXG4gICAgLy9cbiAgICAvLyBUaGUgaGFuZC13cml0dGVuIHRhYmxlIGNvbXBvc2l0ZSB0aGlzIHJlcGxhY2VkIGNvdWxkIG5vdCBnZXQgdGhhdDogYVxuICAgIC8vIGRlY2xhcmVkIGluZGV4IGlzIHRha2VuIHZlcmJhdGltLCBzbyBpdCBtYXRlcmlhbGl6ZWQgYXMgcGxhaW5cbiAgICAvLyBgVU5JUVVFIChvcmdhbml6YXRpb25faWQsIGNhc2VfbnVtYmVyKWAgYW5kIGVuZm9yY2VkIE5PVEhJTkcgb24gYW55IHJvd1xuICAgIC8vIHdob3NlIGBvcmdhbml6YXRpb25faWRgIHdhcyBOVUxMIFx1MjAxNCBpLmUuIGV2ZXJ5IHJvdyBvZiBhIHNpbmdsZS1vcmdhbml6YXRpb25cbiAgICAvLyBvciB1bnRlbmFudGVkIGluc3RhbGwuIEl0IGFsc28gcmVhZCBhcyBcInVuaXF1ZSBwZXIgb3JnYW5pemF0aW9uXCIgd2hpbGVcbiAgICAvLyBtYXRlcmlhbGl6aW5nIGFzIGFuIHVuc2NvcGVkIGNvbXBvc2l0ZSwgd2hpY2ggaXMgdGhlIGJhcmUtYHVuaXF1ZTogdHJ1ZWBcbiAgICAvLyBzcGVsbGluZyBBRFItMDEyMCB3YXJucyBvbiBpbiAxNy54IGFuZCBwcm90b2NvbCAxOCByZWplY3RzICgjNTA4MikuXG4gICAgLy9cbiAgICAvLyBTY29wZSBzcGVsbGluZzogYmFyZSBgdHJ1ZWAgYXQgRklFTEQgbGV2ZWwgYWxyZWFkeSBtZWFucyBcInBlclxuICAgIC8vIG9yZ2FuaXphdGlvblwiIGFuZCBjYXJyaWVzIG5vIGRlcHJlY2F0aW9uIChgJ29yZ2FuaXphdGlvbidgIGlzIGl0c1xuICAgIC8vIGV4cGxpY2l0IHN5bm9ueW0gd2l0aCBieXRlLWlkZW50aWNhbCBtYXRlcmlhbGl6YXRpb24gXHUyMDE0IG1lYXN1cmVkKS4gSXQgaXNcbiAgICAvLyB3cml0dGVuIGFzIGB0cnVlYCB0byBtYXRjaCB0aGUgZm91ciBzaWJsaW5nIG9iamVjdHMgYWJvdmU7IHN3aXRjaGluZyB0aGVcbiAgICAvLyByZXBvIHRvIHRoZSBleHBsaWNpdCB3b3JkIGlzIGEgdW5pZm9ybSBkZWNpc2lvbiBmb3IgYWxsIG9mIHRoZW0sIG5vdFxuICAgIC8vIHNvbWV0aGluZyBgY3JtX2Nhc2VgIGZvcmtzIG9uIGFsb25lLlxuICAgIGNhc2VfbnVtYmVyOiBGaWVsZC5hdXRvbnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnQ2FzZSBOdW1iZXInLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBmb3JtYXQ6ICdDQVNFLXswMDAwMH0nLFxuICAgICAgdW5pcXVlOiB0cnVlLFxuICAgIH0pLFxuICAgIFxuICAgIHN1YmplY3Q6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdTdWJqZWN0JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBtYXhMZW5ndGg6IDI1NSxcbiAgICB9KSxcblxuICAgIC8vIEFEUi0wMDc5IHJlY29yZCB0aXRsZSAod2FzIHRpdGxlRm9ybWF0ICd7Y2FzZV9udW1iZXJ9IC0ge3N1YmplY3R9JykuXG4gICAgZGlzcGxheV90aXRsZTogRmllbGQuZm9ybXVsYSh7XG4gICAgICBsYWJlbDogJ0Rpc3BsYXkgVGl0bGUnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBleHByZXNzaW9uOiBGYHJlY29yZC5jYXNlX251bWJlciArIFwiIC0gXCIgKyByZWNvcmQuc3ViamVjdGAsXG4gICAgfSksXG5cbiAgICBkZXNjcmlwdGlvbjogRmllbGQubWFya2Rvd24oe1xuICAgICAgbGFiZWw6ICdEZXNjcmlwdGlvbicsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgfSksXG4gICAgXG4gICAgLy8gUmVsYXRpb25zaGlwc1xuICAgIGNybV9hY2NvdW50OiBGaWVsZC5sb29rdXAoJ2NybV9hY2NvdW50Jywge1xuICAgICAgbGFiZWw6ICdBY2NvdW50JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuICAgIFxuICAgIGNybV9jb250YWN0OiBGaWVsZC5sb29rdXAoJ2NybV9jb250YWN0Jywge1xuICAgICAgbGFiZWw6ICdDb250YWN0JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgLy8gT3B0aW9uYWwgc28gV2ViLXRvLUNhc2UgKGFub255bW91cykgc3VibWlzc2lvbnMgY2FuIGxhbmQgd2l0aG91dFxuICAgICAgLy8gYW4gZXhpc3RpbmcgQ1JNIGNvbnRhY3QuIEJhY2stb2ZmaWNlIHN0YWZmIG9yIGEgdHJpYWdlIGZsb3cgbGlua3NcbiAgICAgIC8vIHRoZSBjYXNlIHRvIGEgY29udGFjdCBhZnRlciB0aGUgZmFjdC4gVGhpcyBtYXRjaGVzIHRoZSBTYWxlc2ZvcmNlXG4gICAgICAvLyBXZWItdG8tQ2FzZSBjb252ZW50aW9uLlxuICAgICAgLy8gQG9iamVjdHN0YWNrIDEyOiBzdHJpbmdbXSBgcmVmZXJlbmNlRmlsdGVyc2AgaXMgZGVhZCAobm90IHJlYWQgYnkgdGhlXG4gICAgICAvLyBwaWNrZXIpLiBgZGVwZW5kc09uYCBpcyB0aGUgbGl2ZSBjYXNjYWRpbmctbG9va3VwIGZvcm0gXHUyMDE0IGl0IHNjb3BlcyB0aGVcbiAgICAgIC8vIGNvbnRhY3QgY2FuZGlkYXRlcyB0byB0aG9zZSBzaGFyaW5nIHRoZSBjYXNlJ3MgYGNybV9hY2NvdW50YCAoQURSLTAwNDkpLlxuICAgICAgZGVwZW5kc09uOiBbJ2NybV9hY2NvdW50J10sXG4gICAgfSksXG4gICAgXG4gICAgLy8gQ2FzZSBNYW5hZ2VtZW50XG4gICAgc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgLy8gQURSLTAwNTIgXHUwMEE3NWIuMSBcdTIwMTQgcGxhdGZvcm0gYXV0by1yZW5kZXJzIHN0YXR1cyBjaGFuZ2VzIG9uIHRoZSB0aW1lbGluZVxuICAgICAgLy8gKFwiU3RhdHVzOiBOZXcgXHUyMTkyIEVzY2FsYXRlZFwiKS4gRGVsaXZlcnMgdGhlIGNhc2UgdGltZWxpbmUgZGVjbGFyYXRpdmVseVxuICAgICAgLy8gKHRoZSBoYW5kLWNvZGVkIHZlcnNpb24gd2FzIGRlZmVycmVkIGluICMzOTYgZHVlIHRvIGEgaG9vay1jcmFzaCBidWcpLlxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnTmV3JywgdmFsdWU6ICduZXcnLCBjb2xvcjogJyM4MDgwODAnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdJbiBQcm9ncmVzcycsIHZhbHVlOiAnaW5fcHJvZ3Jlc3MnLCBjb2xvcjogJyNGRkE1MDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdXYWl0aW5nIG9uIEN1c3RvbWVyJywgdmFsdWU6ICd3YWl0aW5nX2N1c3RvbWVyJywgY29sb3I6ICcjRkZENzAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnV2FpdGluZyBvbiBTdXBwb3J0JywgdmFsdWU6ICd3YWl0aW5nX3N1cHBvcnQnLCBjb2xvcjogJyM0MTY5RTEnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFc2NhbGF0ZWQnLCB2YWx1ZTogJ2VzY2FsYXRlZCcsIGNvbG9yOiAnI0ZGMDAwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1Jlc29sdmVkJywgdmFsdWU6ICdyZXNvbHZlZCcsIGNvbG9yOiAnIzAwQUEwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0Nsb3NlZCcsIHZhbHVlOiAnY2xvc2VkJywgY29sb3I6ICcjMDA2NDAwJyB9LFxuICAgICAgXVxuICAgIH0pLFxuICAgIFxuICAgIHByaW9yaXR5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdQcmlvcml0eScsXG4gICAgICBncm91cDogJ3NsYScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnTG93JywgdmFsdWU6ICdsb3cnLCBjb2xvcjogJyM0MTY5RTEnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdNZWRpdW0nLCB2YWx1ZTogJ21lZGl1bScsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0hpZ2gnLCB2YWx1ZTogJ2hpZ2gnLCBjb2xvcjogJyNGRjQ1MDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDcml0aWNhbCcsIHZhbHVlOiAnY3JpdGljYWwnLCBjb2xvcjogJyNGRjAwMDAnIH0sXG4gICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTb3J0YWJsZSBvcmRpbmFsIGZvciBgcHJpb3JpdHlgLiBPcmRlcmluZyBhIHF1ZXVlIGJ5IHRoZSBzZWxlY3QgZmllbGRcbiAgICAvLyBpdHNlbGYgc29ydHMgdGhlIHJhdyBzdHJpbmdzLCBzbyBgcHJpb3JpdHkgZGVzY2AgeWllbGRzXG4gICAgLy8gbWVkaXVtID4gbG93ID4gaGlnaCA+IGNyaXRpY2FsIFx1MjAxNCB0aGUgZXhhY3QgaW52ZXJzaW9uIG9mIHVyZ2VuY3ksIHdoaWNoXG4gICAgLy8gYnVyaWVkIGV2ZXJ5IGNyaXRpY2FsIGNhc2UgYXQgdGhlIGJvdHRvbSBvZiB0aGUgYWdlbnQncyBxdWV1ZS4gU2VsZWN0XG4gICAgLy8gb3B0aW9ucyBjYXJyeSBubyBvcmRpbmFsIGluIHRoZSBzcGVjLCBzbyB0aGUgcmFuayBpcyBtYXRlcmlhbGlzZWQgaGVyZVxuICAgIC8vIGFuZCBzdGFtcGVkIGJ5IGBjYXNlX3NsYV9kZWZhdWx0c2A7IHF1ZXVlIHZpZXdzIHNvcnQgb24gaXQgaW5zdGVhZC5cbiAgICAvLyBgMGAgaXMgdGhlIFVOUkFOS0VEIHNlbnRpbmVsLCBzaGFyZWQgd2l0aCBjcm1fdGFzay5wcmlvcml0eV9yYW5rOiBpdCBpc1xuICAgIC8vIHdoYXQgYSByZWNvcmQgY2FycmllcyB3aGVuIG5vIHJlY29nbmlzZWQgcHJpb3JpdHkgaGFzIGJlZW4gc3RhbXBlZCwgYW5kXG4gICAgLy8gaXQgc29ydHMgYmVsb3cgZXZlcnkgcmVhbCByYW5rICgxXHUyMDEzNCkgb24gdGhlIGBwcmlvcml0eV9yYW5rIGRlc2NgIHF1ZXVlcy5cbiAgICAvLyBcdTI2RDQgSXQgbXVzdCBub3QgYmUgYDFgIGhlcmUgKG9yIGAyYCBvbiBjcm1fdGFzayk6IGEgbm9uLXplcm8gc2VudGluZWxcbiAgICAvLyBvcmRlcnMgdGhlIHNhbWUgdW5rbm93biBwcmlvcml0eSBkaWZmZXJlbnRseSBvbiB0aGUgdHdvIG9iamVjdHMsIGFuZCBvblxuICAgIC8vIHRoaXMgb25lIGl0IGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBnZW51aW5lIGBsb3dgLlxuICAgIHByaW9yaXR5X3Jhbms6IEZpZWxkLm51bWJlcih7XG4gICAgICBsYWJlbDogJ1ByaW9yaXR5IFJhbmsnLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBkZWZhdWx0VmFsdWU6IDAsXG4gICAgfSksXG5cbiAgICB0eXBlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdDYXNlIFR5cGUnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdRdWVzdGlvbicsIHZhbHVlOiAncXVlc3Rpb24nIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQcm9ibGVtJywgdmFsdWU6ICdwcm9ibGVtJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRmVhdHVyZSBSZXF1ZXN0JywgdmFsdWU6ICdmZWF0dXJlX3JlcXVlc3QnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdCdWcnLCB2YWx1ZTogJ2J1ZycgfSxcbiAgICAgIF1cbiAgICB9KSxcbiAgICBcbiAgICBvcmlnaW46IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ0Nhc2UgT3JpZ2luJyxcbiAgICAgIGdyb3VwOiAnb3JpZ2luJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0VtYWlsJywgdmFsdWU6ICdlbWFpbCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1Bob25lJywgdmFsdWU6ICdwaG9uZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1dlYicsIHZhbHVlOiAnd2ViJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQ2hhdCcsIHZhbHVlOiAnY2hhdCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1NvY2lhbCBNZWRpYScsIHZhbHVlOiAnc29jaWFsX21lZGlhJyB9LFxuICAgICAgXVxuICAgIH0pLFxuICAgIFxuICAgIC8vIEFzc2lnbm1lbnRcbiAgICBcbiAgICAvLyBTTEEgYW5kIE1ldHJpY3NcbiAgICAvL1xuICAgIC8vIE5PIGBjcmVhdGVkX2RhdGVgIGhlcmUgKCMxOTkyLCB0aGUgIzU3NSBCMiBwcmVjZWRlbnQgb25cbiAgICAvLyBgY3JtX29wcG9ydHVuaXR5YCk6IHRoZSBwbGF0Zm9ybSBhbHJlYWR5IGluamVjdHMgYGNyZWF0ZWRfYXRgIG9uIGV2ZXJ5XG4gICAgLy8gb2JqZWN0IGFuZCBzdGFtcHMgaXQgb24gZXZlcnkgaW5zZXJ0LCB3aGlsZSB0aGlzIGR1cGxpY2F0ZSBoYWQgbm8gd3JpdGVyXG4gICAgLy8gYXQgYWxsIFx1MjAxNCBvbmx5IHRoZSBzZWVkIGRhdGEgc2V0IGl0LCBzbyBldmVyeSBjYXNlIGNyZWF0ZWQgdGhyb3VnaCB0aGVcbiAgICAvLyBVSSBvciBSRVNUIHN0b3JlZCBudWxsIGFuZCBmZWxsIG91dCBvZiBcIkNhc2VzIE9wZW5lZCBieSBQcmlvcml0eSBcdTAwRDcgRGF5XCJcbiAgICAvLyBhbmQgdGhlIHNlcnZpY2UgZGFzaGJvYXJkJ3MgZGF0ZSByYW5nZS4gU3VyZmFjZXMgdGhhdCBuZWVkIHRoZSBjcmVhdGlvblxuICAgIC8vIGluc3RhbnQgcmVhZCBgY3JlYXRlZF9hdGAgKHRoZSBgY2FzZV9tZXRyaWNzYCBkYXRhc2V0LCB0aGUgZGFzaGJvYXJkXG4gICAgLy8gcmFuZ2UsIHRoZSBgY2FzZV90aW1lbGluZWAgdmlldywgYGNhc2Vfc2xhX2RlZmF1bHRzYCcgcmVzb2x1dGlvbiB0aW1lKTtcbiAgICAvLyB0aGUgc2VlZHMgYXV0aG9yIGl0IGRpcmVjdGx5LCBhbmQgdGhlIHNlZWQgbG9hZGVyIGtlZXBzIGFuIGF1dGhvcmVkXG4gICAgLy8gYGNyZWF0ZWRfYXRgIG9uIGZpcnN0IGluc2VydCBzaW5jZSBAb2JqZWN0c3RhY2svb2JqZWN0cWwgMTcuNy4wXG4gICAgLy8gKG9iamVjdHN0YWNrIzIxNjQ2KS5cbiAgICBjbG9zZWRfZGF0ZTogRmllbGQuZGF0ZXRpbWUoe1xuICAgICAgbGFiZWw6ICdDbG9zZWQgRGF0ZScsXG4gICAgICBncm91cDogJ3NsYScsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBcdTI2RDQgTk9UIGByZWFkb25seWA6IHN0YW1wZWQgYnkgYGV2ZW50X2FjdGl2aXR5X2J1YmJsZWBcbiAgICAvLyAoYHNyYy9zYWxlcy9vYmplY3RzL2V2ZW50Lmhvb2sudHNgKSBvbiB0aGUgZmlyc3QgSEVMRCBgY3JtX2V2ZW50YCByZWxhdGVkIHRvIHRoZVxuICAgIC8vIGNhc2UsIHdob2V2ZXIgd3JvdGUgdGhhdCBldmVudC4gXHUyNkEwXHVGRTBGIFRoYXQgaG9vayByZWFjaGVzIHRoaXMgY2FzZSB0aHJvdWdoXG4gICAgLy8gYGN0eC5hcGlgLCBhIGBTY29wZWRDb250ZXh0YCBvdmVyIHRoZSBBQ1RJTkcgVVNFUidzIGV4ZWN1dGlvbiBjb250ZXh0IFx1MjAxNFxuICAgIC8vIHNvIGl0cyB3cml0ZSBpcyBhIENBTExFUi1zdXBwbGllZCB3cml0ZSBmcm9tIGEgbm9uLWBpc1N5c3RlbWAgY29udGV4dCxcbiAgICAvLyB3aGljaCBgc3RyaXBSZWFkb25seUZpZWxkc2AgZGVsZXRlcy4gYHJlYWRvbmx5YCBoZXJlIHNpbGVudGx5IGRpc2FibGVzXG4gICAgLy8gdGhlIHN0YW1wLiAoQSBob29rIHdyaXRpbmcgaXRzIE9XTiByZWNvcmQncyBgY3R4LmlucHV0LmRhdGFgIGlzIGFcbiAgICAvLyBkaWZmZXJlbnQgY2FzZSBhbmQgU1VSVklWRVMgYHJlYWRvbmx5YCBcdTIwMTQgaG9vay13cml0dGVuIGtleXMgYXJlIG5vdFxuICAgIC8vIGNhbGxlci1zdXBwbGllZC4gTWVhc3VyZWQgaW4gYHRlc3QvcmVhZG9ubHktd3JpdGUtc2VtYW50aWNzLnRlc3QudHNgLilcbiAgICAvL1xuICAgIC8vIERlZmluaXRpb246IHRoZSBtb21lbnQgdGhlIGN1c3RvbWVyIGZpcnN0IGhlYXJkIGJhY2sgZnJvbSB1cywgbWF0Y2hpbmdcbiAgICAvLyBTYWxlc2ZvcmNlIGBGaXJzdFJlc3BvbnNlRGF0ZVRpbWVgIC8gWmVuZGVzayBmaXJzdCByZXBseSB0aW1lIFx1MjAxNCBOT1QgYW5cbiAgICAvLyBpbnRlcm5hbCBzdGF0dXMgY2hhbmdlLCB3aGljaCB3b3VsZCByZXBvcnQgXCJyZXNwb25kZWRcIiB3aGlsZSB0aGUgY3VzdG9tZXJcbiAgICAvLyBpcyBzdGlsbCB3YWl0aW5nLlxuICAgIGZpcnN0X3Jlc3BvbnNlX2RhdGU6IEZpZWxkLmRhdGV0aW1lKHtcbiAgICAgIGxhYmVsOiAnRmlyc3QgUmVzcG9uc2UgRGF0ZScsXG4gICAgICBncm91cDogJ3NsYScsXG4gICAgfSksXG4gICAgXG4gICAgcmVzb2x1dGlvbl90aW1lX2hvdXJzOiBGaWVsZC5udW1iZXIoe1xuICAgICAgbGFiZWw6ICdSZXNvbHV0aW9uIFRpbWUgKEhvdXJzKScsXG4gICAgICBncm91cDogJ3NsYScsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgIHNjYWxlOiAyLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFN0YW1wZWQgb25jZSwgb24gdGhlIGZpcnN0IHdyaXRlIHRoYXQgZ2l2ZXMgdGhlIGNhc2UgYSBwcmlvcml0eSwgZnJvbSB0aGVcbiAgICAvLyBwcmlvcml0eSBcdTAwRDcgYWNjb3VudC10aWVyIG1hdHJpeCBpbiBgLi9fY2FzZS1zbGEudHNgIChgY2FzZV9zbGFfZGVmYXVsdHNgKS5cbiAgICAvLyBOb3QgYHJlYWRvbmx5YDogYSBzZXJ2aWNlIG1hbmFnZXIgbWF5IGxlZ2l0aW1hdGVseSByZW5lZ290aWF0ZSBhIGRlYWRsaW5lLFxuICAgIC8vIGFuZCB0aGUgaG9vayBuZXZlciBvdmVyd3JpdGVzIGEgdmFsdWUgdGhhdCBpcyBhbHJlYWR5IHRoZXJlLlxuICAgIHNsYV9kdWVfZGF0ZTogRmllbGQuZGF0ZXRpbWUoe1xuICAgICAgbGFiZWw6ICdTTEEgRHVlIERhdGUnLFxuICAgICAgZGVzY3JpcHRpb246ICdTZXQgZnJvbSB0aGUgY2FzZSBwcmlvcml0eSBhbmQgdGhlIGFjY291bnRcdTIwMTlzIEN1c3RvbWVyIFRpZXIsIGluIGNhbGVuZGFyIGhvdXJzOiBuaWdodHMsIHdlZWtlbmRzIGFuZCBob2xpZGF5cyBjb3VudC4nLFxuICAgICAgZ3JvdXA6ICdzbGEnLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFN0YW1wZWQgYnkgdHdvIHdyaXRlcnMsIG9uZSBwZXIgc2lkZSBvZiB0aGUgY2xvY2sgc3RvcCAoIzIwNzApOiB0aGVcbiAgICAvLyBgY2FzZV9zbGFfbW9uaXRvcmAgc2NoZWR1bGUgZmxvdyB3aGlsZSB0aGUgY2FzZSBpcyBsaXZlIHdvcmssIGFuZFxuICAgIC8vIGBjYXNlX3NsYV9kZWZhdWx0c2Agb24gdGhlIHdyaXRlIHRoYXQgcmVzb2x2ZXMgb3IgY2xvc2VzIGl0IGxhdGUuIFRoZVxuICAgIC8vIHJ1bGUgYm90aCBhcHBseSBpcyBgY2FzZVNsYUJyZWFjaGVkYCBpbiBgLi9fY2FzZS1zbGEudHNgLlxuICAgIC8vXG4gICAgLy8gTk9UIGByZWFkb25seWAgXHUyMDE0IGJ1dCBOT1QgZm9yIHRoZSByZWFzb24gdGhpcyBjb21tZW50IHVzZWQgdG8gZ2l2ZSwgYW5kXG4gICAgLy8gdGhlIGRpZmZlcmVuY2UgaXMgbWVhc3VyZWQgaW4gYHRlc3QvcmVhZG9ubHktd3JpdGUtc2VtYW50aWNzLnRlc3QudHNgXG4gICAgLy8gKCMxNDI5KS4gYGNhc2Vfc2xhX21vbml0b3JgIGRlY2xhcmVzIGBydW5BczogJ3N5c3RlbSdgLCBzbyBpdHMgd3JpdGVzXG4gICAgLy8gd291bGQgU1VSVklWRSBhIGByZWFkb25seTogdHJ1ZWAgaGVyZS4gSXQgc3RheXMgd3JpdGFibGUgcGVuZGluZyBhXG4gICAgLy8gZGVjaXNpb24gdGhhdCBoYXMgdG8gd2VpZ2ggdGhlIG90aGVyIHN1cmZhY2VzIChzZWVkIGRhdGEsXG4gICAgLy8gYHNlcnZpY2UtYWdlbnQucHJvZmlsZS50c2AsIHRoZSBjcmVhdGUgZm9ybSksIG5vdCBiZWNhdXNlIHRoZSBwbGF0Zm9ybVxuICAgIC8vIHdvdWxkIGRyb3AgdGhlIHN3ZWVwJ3Mgd3JpdGUuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgVGhpcyBpcyBub3cgdGhlIE9OTFkgZXNjYWxhdGlvbi1ncm91cCBmbGFnIHN0aWxsIGRlY2xhcmVkIHdyaXRhYmxlOlxuICAgIC8vIGBpc19lc2NhbGF0ZWRgIGFuZCBgZXNjYWxhdGVkX2RhdGVgIGJlY2FtZSBgcmVhZG9ubHk6IHRydWVgIHdoZW4gIzE0MzRcbiAgICAvLyBtb3ZlZCB0aGVpciB1c2VyLWNvbnRleHQgd3JpdGVyIGludG8gYSBzeXN0ZW0gc3ViLWZsb3cuIFNvIHRoZSBvcGVuXG4gICAgLy8gcXVlc3Rpb24gaGVyZSBpcyBuYXJyb3dlciB0aGFuIGl0IHdhcyBcdTIwMTQgaXQgaXMgcHVyZWx5IGFib3V0IHRoaXMgZmllbGQnc1xuICAgIC8vIGF1dGhvcmluZyBzdXJmYWNlcywgd2l0aCBubyBwbGF0Zm9ybSBvYnN0YWNsZSBsZWZ0IHRvIGJsYW1lLlxuICAgIGlzX3NsYV92aW9sYXRlZDogRmllbGQuYm9vbGVhbih7XG4gICAgICBsYWJlbDogJ1NMQSBWaW9sYXRlZCcsXG4gICAgICBncm91cDogJ3NsYScsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIEVzY2FsYXRpb25cbiAgICAvL1xuICAgIC8vIGByZWFkb25seTogdHJ1ZWAgXHUyMDE0IHRoZSBob25lc3QgZGVjbGFyYXRpb24sIGJlY2F1c2Ugbm9ib2R5IHR5cGVzIHRoaXMuXG4gICAgLy8gSXRzIHRocmVlIHdyaXRlcnMgYXJlIG5vdyB1bmFuaW1vdXNseSBlbGV2YXRlZCAoIzE0MzQsIG1haW50YWluZXItXG4gICAgLy8gYXBwcm92ZWQgZGVjaXNpb24gYmF0Y2ggIzIxIFx1MjQ2MSk6XG4gICAgLy9cbiAgICAvLyAgIGNhc2VfZXNjYWxhdGlvbiAgICAgICAgcnVuQXM6ICdzeXN0ZW0nICAocmVjb3JkLWNoYW5nZSlcbiAgICAvLyAgIGNhc2Vfc2xhX21vbml0b3IgICAgICAgcnVuQXM6ICdzeXN0ZW0nICAoc2NoZWR1bGUpXG4gICAgLy8gICBjYXNlX2VzY2FsYXRpb25fc3RhbXAgIHJ1bkFzOiAnc3lzdGVtJyAgKGNhbGxlZCBieSB0aGUgZXNjYWxhdGVfY2FzZVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW4gZmxvdyB2aWEgYSBzdWJmbG93IG5vZGUpXG4gICAgLy9cbiAgICAvLyBcdTJCNTAgV2hhdCBjaGFuZ2VkLCBhbmQgd2h5IHRoZSByZWFkb25seSBkZWNsYXJhdGlvbiBpcyBub3cgc2FmZTogdGhlXG4gICAgLy8gYGVzY2FsYXRlX2Nhc2VgIHNjcmVlbiBmbG93IHVzZWQgdG8gd3JpdGUgdGhpcyBmaWVsZCBpdHNlbGYsIGFuZCBpdFxuICAgIC8vIHN0YXlzIGBydW5BczogJ3VzZXInYCBiZWNhdXNlIGEgcGVyc29uIGNsaWNrcyBpdC4gVGhlIHBsYXRmb3JtJ3NcbiAgICAvLyByZWFkb25seSBzdHJpcCBpcyBvbmUgYnJhbmNoIG9mIHRoZSBVUERBVEUgcGF0aFxuICAgIC8vIChgaWYgKCFvcEN0eC5jb250ZXh0Py5pc1N5c3RlbSlgLCBvdmVyIENBTExFUi1zdXBwbGllZCBrZXlzKSwgc28gdGhhdFxuICAgIC8vIHVzZXItY29udGV4dCB3cml0ZSBXT1VMRCBoYXZlIGJlZW4gc2lsZW50bHkgZHJvcHBlZC4gUmF0aGVyIHRoYW5cbiAgICAvLyBlbGV2YXRpbmcgdGhlIHdob2xlIHNjcmVlbiBmbG93LCB0aGUgc3RhbXAgbW92ZWQgaW50byB0aGUgZGVkaWNhdGVkXG4gICAgLy8gYGNhc2VfZXNjYWxhdGlvbl9zdGFtcGAgc3ViLWZsb3cuIFRoZSBhZ2VudCdzIG93biB3cml0ZXNcbiAgICAvLyAoYGVzY2FsYXRpb25fcmVhc29uYCwgYHByaW9yaXR5YCwgYHN0YXR1c2ApIHN0aWxsIGNhcnJ5IHRoZWlyIGlkZW50aXR5O1xuICAgIC8vIG9ubHkgdGhlc2UgdHdvIHN0YW1wcyBhcmUgZWxldmF0ZWQuXG4gICAgLy9cbiAgICAvLyBUaGUgZ3Vlc3Qtc3VibWlzc2lvbiBicmFuY2ggb2YgYGNhc2UuaG9vay50c2AgYWxzbyBmb3JjZXMgdGhpcyBmYWxzZSwgYW5kXG4gICAgLy8gaXMgdW5hZmZlY3RlZDogaXQgaXMgYSBgYmVmb3JlSW5zZXJ0YCBob29rLCBzbyBpdHMga2V5IGlzIG5vdFxuICAgIC8vIGNhbGxlci1zdXBwbGllZCBBTkQgdGhlIElOU0VSVCBwYXRoIGlzIGV4ZW1wdCBmcm9tIHRoZSBzdHJpcCBlbnRpcmVseS5cbiAgICAvLyBTZWVkIGRhdGEgKGBzZXJ2aWNlLnNlZWQudHNgKSBpcyBleGVtcHQgZm9yIHRoZSBzYW1lIHJlYXNvbi5cbiAgICAvL1xuICAgIC8vIFx1MjZENCBJZiB5b3UgZmluZCB5b3Vyc2VsZiByZXZlcnRpbmcgdGhpcyB0byB3cml0YWJsZSBzbyBhIHVzZXItY29udGV4dCBmbG93XG4gICAgLy8gd3JpdGUgbGFuZHMsIHlvdSBhcmUgcmUtb3BlbmluZyAjMTQzNCBcdTIwMTQgYWRkIGEgYHN1YmZsb3dgIHN0ZXAgaW5zdGVhZC5cbiAgICAvLyBTZW1hbnRpY3MgbWVhc3VyZWQgaW4gYHRlc3QvcmVhZG9ubHktd3JpdGUtc2VtYW50aWNzLnRlc3QudHNgLlxuICAgIGlzX2VzY2FsYXRlZDogRmllbGQuYm9vbGVhbih7XG4gICAgICBsYWJlbDogJ0VzY2FsYXRlZCcsXG4gICAgICBncm91cDogJ2VzY2FsYXRpb24nLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIGByZWFkb25seTogdHJ1ZWAsIHNhbWUgcmVhc29uaW5nIGFzIGBpc19lc2NhbGF0ZWRgIGFib3ZlIGFuZCBzdGFtcGVkIGJ5XG4gICAgLy8gdGhlIHNhbWUgd3JpdGVycyBcdTIwMTQgYGNhc2VfZXNjYWxhdGlvbmAgYW5kIHRoZSBgY2FzZV9lc2NhbGF0aW9uX3N0YW1wYFxuICAgIC8vIHN1Yi1mbG93LCBib3RoIGBydW5BczogJ3N5c3RlbSdgLiBOZXZlciB0eXBlZCBieSBhIHBlcnNvbi5cbiAgICBlc2NhbGF0ZWRfZGF0ZTogRmllbGQuZGF0ZXRpbWUoe1xuICAgICAgbGFiZWw6ICdFc2NhbGF0ZWQgRGF0ZScsXG4gICAgICBncm91cDogJ2VzY2FsYXRpb24nLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgfSksXG4gICAgXG4gICAgLy8gXHUyNkQ0IERFTElCRVJBVEVMWSBOT1QgYHJlYWRvbmx5YCwgYW5kIHRoaXMgaXMgbG9hZC1iZWFyaW5nICgjMTQzNCkuIFRoaXMgaXNcbiAgICAvLyB0aGUgYWdlbnQncyBvd24gc2NyZWVuIGlucHV0IFx1MjAxNCBgZXNjYWxhdGVfY2FzZWAncyBzY3JlZW4gY29sbGVjdHMgaXQgYW5kXG4gICAgLy8gd3JpdGVzIGl0IHdpdGggdGhlIFVTRVIncyBjb250ZXh0LiBEZWNsYXJpbmcgaXQgcmVhZG9ubHkgd291bGQgbWFrZSB0aGVcbiAgICAvLyBwbGF0Zm9ybSBzaWxlbnRseSBzdHJpcCB0aGUgcmVhc29uIHRoZSBhZ2VudCBqdXN0IHR5cGVkLCB3aGljaCBpcyB0aGVcbiAgICAvLyBoYXJtICMxNDM0IHdhcyBmaWxlZCBhYm91dCwgaW52ZXJ0ZWQgb250byB1c2VyIGlucHV0LiBJdCBpcyBhbHNvXG4gICAgLy8gcmVxdWlyZWQgd2hlbmV2ZXIgYGlzX2VzY2FsYXRlZGAgZmxpcHMgdHJ1ZSAodGhlXG4gICAgLy8gYGVzY2FsYXRpb25fcmVhc29uX3JlcXVpcmVkYCB2YWxpZGF0aW9uIGJlbG93KSwgc28gZHJvcHBpbmcgaXQgd291bGRcbiAgICAvLyByZWplY3QgdGhlIGVzY2FsYXRpb24gb3V0cmlnaHQuXG4gICAgZXNjYWxhdGlvbl9yZWFzb246IEZpZWxkLnRleHRhcmVhKHtcbiAgICAgIGxhYmVsOiAnRXNjYWxhdGlvbiBSZWFzb24nLFxuICAgICAgZ3JvdXA6ICdlc2NhbGF0aW9uJyxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBObyBgcGFyZW50X2Nhc2VgLiBBIGNhc2UgaGllcmFyY2h5IHdhcyBkZWNsYXJlZCBoZXJlIGFuZCBuZXZlclxuICAgIC8vIHRyYXZlcnNlZDogbm90aGluZyByb2xsZWQgY2hpbGQgY2FzZXMgdXAsIG5vdGhpbmcgY2xvc2VkIG9yIG5vdGlmaWVkIHRoZW1cbiAgICAvLyB3aXRoIHRoZSBwYXJlbnQsIGFuZCBubyBzZXJ2aWNlIGZsb3cgcmVhZCB0aGUgbGluay4gUmVsYXRlZCBjYXNlcyB0aGF0XG4gICAgLy8gbWF0dGVyIGluIHRoaXMgYXBwIGFyZSBsaW5rZWQgdGhyb3VnaCB0aGUga25vd2xlZGdlIGFydGljbGUgdGhhdCByZXNvbHZlZFxuICAgIC8vIHRoZW0gKGByZXNvbHZlZF9ieV9hcnRpY2xlYCksIHdoaWNoIHRoZSBkZWZsZWN0aW9uIG1lYXN1cmVzIGRvIHJlYWQuXG4gICAgXG4gICAgLy8gUmVzb2x1dGlvblxuICAgIHJlc29sdXRpb246IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGxhYmVsOiAnUmVzb2x1dGlvbicsXG4gICAgICBncm91cDogJ3Jlc29sdXRpb24nLFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogVGhlIGtub3dsZWRnZSBhcnRpY2xlIHRoYXQgUkVTT0xWRUQgdGhpcyBjYXNlICgjNjAxKS5cbiAgICAgKlxuICAgICAqIFRoZSBzZWNvbmQgaGFsZiBvZiBhIHR3by13YXkgbGluaywgYW5kIGRlbGliZXJhdGVseSBub3QgYSByZXBsYWNlbWVudCBmb3JcbiAgICAgKiB0aGUgZmlyc3QuIGBjcm1fa25vd2xlZGdlX2FydGljbGUucmVsYXRlZF90b19jYXNlYCBwb2ludHMgdGhlIG90aGVyIHdheSBcdTIwMTRcbiAgICAgKiBcInRoZSBjYXNlIHRoaXMgYXJ0aWNsZSB3YXMgV1JJVFRFTiBGUk9NXCIgXHUyMDE0IGFuZCB0aGUgdHdvIGFuc3dlciBkaWZmZXJlbnRcbiAgICAgKiBxdWVzdGlvbnM6IHByb3ZlbmFuY2UgKHdoZXJlIGRpZCB0aGlzIGFydGljbGUgY29tZSBmcm9tKSB2ZXJzdXNcbiAgICAgKiBkZWZsZWN0aW9uICh3aGF0IGRpZCB0aGlzIGFydGljbGUgc2F2ZSB1cykuIE1lcmdpbmcgdGhlbSB3b3VsZCBtYWtlIGJvdGhcbiAgICAgKiB1bmFuc3dlcmFibGUsIHNvIGJvdGggc3RheS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdGhlIGNvbHVtbiB0aGUgZGVmbGVjdGlvbiBtZWFzdXJlcyBvbiBgY2FzZV9tZXRyaWNzYCByZWFkXG4gICAgICogKGBrYl9yZXNvbHZlZF9jb3VudGAgLyBga2JfZGVmbGVjdGlvbl9yYXRlYCksIHdoaWNoIGlzIHdoeSBibGFuayBpc1xuICAgICAqIG5vcm1hbGlzZWQgdG8gTlVMTCBieSBgY2FzZV9yZXNvbHV0aW9uX2FydGljbGVfbm9ybWFsaXplYCBpblxuICAgICAqIGBjYXNlLmhvb2sudHNgOiB0aGUgY2xvc2UtY2FzZSBzY3JlZW4gc2VuZHMgYCcnYCBmb3IgYSBmaWVsZCB0aGUgYWdlbnRcbiAgICAgKiBsZWZ0IGVtcHR5LCBhbiBlbXB0eSBzdHJpbmcgaXMgTk9UIG51bGwsIGFuZCBgY291bnQocmVzb2x2ZWRfYnlfYXJ0aWNsZSlgXG4gICAgICogY291bnRzIGl0IFx1MjAxNCBhIHNpbGVudGx5IGluZmxhdGVkIG51bWVyYXRvciBvbiBhIHJhdGlvIHdpZGdldCwgdGhlIGV4YWN0XG4gICAgICogc2hhcGUgb2YgIzYxNC5cbiAgICAgKi9cbiAgICByZXNvbHZlZF9ieV9hcnRpY2xlOiBGaWVsZC5sb29rdXAoJ2NybV9rbm93bGVkZ2VfYXJ0aWNsZScsIHtcbiAgICAgIGxhYmVsOiAnUmVzb2x2ZWQgYnkgQXJ0aWNsZScsXG4gICAgICBncm91cDogJ3Jlc29sdXRpb24nLFxuICAgICAgZGVzY3JpcHRpb246ICdLbm93bGVkZ2UgYXJ0aWNsZSB0aGF0IHJlc29sdmVkIHRoaXMgY2FzZSBcdTIwMTQgdGhlIGRlZmxlY3Rpb24gc2lnbmFsLicsXG4gICAgfSksXG5cblxuICAgIC8vIEludGVybmFsIG5vdGVzXG4gICAgaW50ZXJuYWxfbm90ZXM6IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGxhYmVsOiAnSW50ZXJuYWwgTm90ZXMnLFxuICAgICAgZ3JvdXA6ICdzeXN0ZW0nLFxuICAgICAgZGVzY3JpcHRpb246ICdJbnRlcm5hbCBub3Rlczsgbm90IHZpc2libGUgdG8gdGhlIGN1c3RvbWVyLicsXG4gICAgfSksXG4gICAgXG4gICAgLy8gRmxhZ3NcbiAgICBpc19jbG9zZWQ6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdJcyBDbG9zZWQnLFxuICAgICAgZ3JvdXA6ICdzeXN0ZW0nLFxuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgIH0pLFxuICB9LFxuICBcbiAgLy8gRGF0YWJhc2UgaW5kZXhlcyBmb3IgcGVyZm9ybWFuY2VcbiAgLy9cbiAgLy8gYGNhc2VfbnVtYmVyYCBpcyBhbiBhdXRvbnVtYmVyIChgQ0FTRS17MDAwMDB9YCksIGFuZCB0aGUgcGxhdGZvcm0nc1xuICAvLyBhdXRvbnVtYmVyIHNlcXVlbmNlIGlzIFBFUiBURU5BTlQgXHUyMDE0IGV2ZXJ5IG9yZ2FuaXphdGlvbiBjb3VudHMgZnJvbSAxLiBBXG4gIC8vIHBsYXRmb3JtLXdpZGUgdW5pcXVlIGluZGV4IG9uIGl0IHRoZXJlZm9yZSByZWplY3RzIHRoZSBzZWNvbmRcbiAgLy8gb3JnYW5pemF0aW9uJ3MgYENBU0UtMDAwMDFgIG9uIGluc2VydDogdGhlIGV4YWN0IGNvbGxpc2lvbiBmcmFtZXdvcmsgIzM2OTZcbiAgLy8gZXhpc3RzIHRvIHByZXZlbnQuIFRoZSBjb25zdHJhaW50IGhhcyB0byBtYXRjaCB0aGUgc2VxdWVuY2UgdGhhdCBmZWVkcyBpdC5cbiAgLy9cbiAgLy8gTm8gYHsgZmllbGRzOiBbJ29yZ2FuaXphdGlvbl9pZCcsICdjYXNlX251bWJlciddLCB1bmlxdWU6IHRydWUgfWAgaGVyZVxuICAvLyAoIzEwMjMpLiBDYXNlLW51bWJlciB1bmlxdWVuZXNzIGlzIGRlY2xhcmVkIG9uIHRoZSBgY2FzZV9udW1iZXJgIGZpZWxkXG4gIC8vIGl0c2VsZiBcdTIwMTQgc2VlIHRoZSBub3RlIHRoZXJlIGZvciB3aHkgdGhlIGhhbmQtd3JpdHRlbiB0YWJsZSBjb21wb3NpdGUgY291bGRcbiAgLy8gbm90IGV4cHJlc3MgaXQuIERvIE5PVCBhZGQgaXQgYmFjayBhbG9uZ3NpZGUgdGhlIGZpZWxkLWxldmVsIGRlY2xhcmF0aW9uXG4gIC8vIGVpdGhlcjogZGVjbGFyaW5nIGJvdGggbWFrZXMgdGhlIHZlcmJhdGltIGluZGV4IHdpbiBhbmQgbGVhdmVzIHRoZVxuICAvLyBwZXItb3JnYW5pemF0aW9uIG9uZSB1bnJlYWNoYWJsZSAoZnJhbWV3b3JrIzM5OTFcbiAgLy8gYHVuaXF1ZS9kb3VibGUtZGVjbGFyYXRpb25gKSwgd2hpY2ggd291bGQgc2lsZW50bHkgdW5kbyB0aGUgZml4LlxuICBpbmRleGVzOiBbXG4gICAgeyBmaWVsZHM6IFsnY3JtX2FjY291bnQnXSB9LFxuICAgIHsgZmllbGRzOiBbJ293bmVyX2lkJ10gfSxcbiAgICB7IGZpZWxkczogWydzdGF0dXMnXSB9LFxuICAgIHsgZmllbGRzOiBbJ3ByaW9yaXR5J10gfSxcbiAgXSxcbiAgXG4gIC8vIEFQSSBzdXJmYWNlLiBIaXN0b3J5IFx1MjE5MiBGaWVsZC50cmFja0hpc3RvcnkgKEFEUi0wMDUyKS5cbiAgZW5hYmxlOiB7XG4gICAgYXBpRW5hYmxlZDogdHJ1ZSxcbiAgICAvLyAjNjAyIFx1MjAxNCBzY3JlZW5zaG90cyBhbmQgbG9ncyBhcmUgaG93IGEgc3VwcG9ydCBjYXNlIGdldHMgZGlhZ25vc2VkLlxuICAgIC8vIFNlZSB0aGUgY2Fub25pY2FsIGNhcGFiaWxpdHkgbm90ZSBpbiBgc3JjL3NhbGVzL29iamVjdHMvaW5kZXgudHNgLlxuICAgIGZpbGVzOiB0cnVlLFxuICB9LFxuXG4gIC8vIEFEUi0wMDUyIFx1MDBBNzViLjIgXHUyMDE0IGRlY2xhcmF0aXZlIG1pbGVzdG9uZSBhY3Rpdml0eSBmb3IgdGhlIHNlcnZpY2UgbmFycmF0aXZlLlxuICAvLyBUaGUgY2FzZVNpZGVFZmZlY3RzIGhvb2sgc3RpbGwgb3ducyBpdHMgcmVhbCBzaWRlLWVmZmVjdHMgKGVzY2FsYXRpb24gdGFzayxcbiAgLy8gY2xvc2VkLWRhdGUgc3RhbXBpbmcpOyB0aGVzZSBhcmUgdGltZWxpbmUgZW50cmllcyBvbmx5LCBlbWl0dGVkIGJ5IHRoZSBwbGF0Zm9ybS5cbiAgYWN0aXZpdHlNaWxlc3RvbmVzOiBbXG4gICAgeyBmaWVsZDogJ3N0YXR1cycsIHZhbHVlOiAnZXNjYWxhdGVkJywgc3VtbWFyeTogJ0Nhc2UgZXNjYWxhdGVkIFx1MjAxNCB7c3ViamVjdH0nLCB0eXBlOiAndXBkYXRlZCcgfSxcbiAgICB7IGZpZWxkOiAnc3RhdHVzJywgdmFsdWU6ICdyZXNvbHZlZCcsIHN1bW1hcnk6ICdDYXNlIHJlc29sdmVkIFx1MjAxNCB7c3ViamVjdH0nLCB0eXBlOiAnY29tcGxldGVkJyB9LFxuICAgIHsgZmllbGQ6ICdzdGF0dXMnLCB2YWx1ZTogJ2Nsb3NlZCcsIHN1bW1hcnk6ICdDYXNlIGNsb3NlZCBcdTIwMTQge3N1YmplY3R9JywgdHlwZTogJ2NvbXBsZXRlZCcgfSxcbiAgXSxcblxuICAvLyBBRFItMDA3OTogcmVuZGVyLW9ubHkgYHRpdGxlRm9ybWF0YCByZXRpcmVkIGluIGZhdm9yIG9mIGBuYW1lRmllbGRgLFxuICAvLyB3aGljaCBuYW1lcyBhIHJlYWwgZmllbGQuIFRoZSBmb3JtZXIgdGVtcGxhdGUgY29tcG9zZWQgdHdvIGxvY2FsIGZpZWxkcywgc29cbiAgLy8gdGhlIGBkaXNwbGF5X3RpdGxlYCBmb3JtdWxhIGZpZWxkIChzZWUgZmllbGRzKSByZXByb2R1Y2VzIGl0LlxuICBuYW1lRmllbGQ6ICdkaXNwbGF5X3RpdGxlJyxcbiAgLy8gRXhwbGljaXQgc2VhcmNoIHRhcmdldHMgKEFEUi0wMDYxKS4gUkVRVUlSRUQgYmVjYXVzZSBuYW1lRmllbGQgaXMgYVxuICAvLyBGT1JNVUxBIChkaXNwbGF5X3RpdGxlL2Z1bGxfbmFtZSk6IHdpdGhvdXQgdGhpcywgJHNlYXJjaCBhdXRvLWRlZmF1bHRzIHRvXG4gIC8vIHRoZSBmb3JtdWxhIGZpZWxkLCB3aGljaCBpc24ndCBhIHJlYWwgY29sdW1uLCBzbyB0aGUgbG9va3VwIHBpY2tlciArIGdsb2JhbFxuICAvLyBzZWFyY2ggc2lsZW50bHkgcmV0dXJuIHplcm8uIFRoZXNlIGFyZSByZWFsLCBpbmRleGVkIGNvbHVtbnMuXG4gIHNlYXJjaGFibGVGaWVsZHM6IFsnc3ViamVjdCcsICdjYXNlX251bWJlciddLFxuICBoaWdobGlnaHRGaWVsZHM6IFsnY2FzZV9udW1iZXInLCAnc3ViamVjdCcsICdjcm1fYWNjb3VudCcsICdzdGF0dXMnLCAncHJpb3JpdHknXSxcbiAgXG4gIC8vIFJlbW92ZWQ6IGxpc3Rfdmlld3MgYW5kIGZvcm1fdmlld3MgYmVsb25nIGluIFVJIGNvbmZpZ3VyYXRpb24sIG5vdCBvYmplY3QgZGVmaW5pdGlvblxuICBcbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAncmVzb2x1dGlvbl9yZXF1aXJlZF9mb3JfY2xvc2VkJyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiAnUmVzb2x1dGlvbiBpcyByZXF1aXJlZCB3aGVuIGNsb3NpbmcgYSBjYXNlJyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnN0YXR1cykgJiYgcmVjb3JkLnN0YXR1cyA9PSBcImNsb3NlZFwiICYmICghaGFzKHJlY29yZC5yZXNvbHV0aW9uKSB8fCBpc0JsYW5rKHJlY29yZC5yZXNvbHV0aW9uKSlgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2VzY2FsYXRpb25fcmVhc29uX3JlcXVpcmVkJyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXNjYWxhdGlvbiByZWFzb24gaXMgcmVxdWlyZWQgd2hlbiBlc2NhbGF0aW5nIGEgY2FzZScsXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5pc19lc2NhbGF0ZWQpICYmIHJlY29yZC5pc19lc2NhbGF0ZWQgPT0gdHJ1ZSAmJiAoIWhhcyhyZWNvcmQuZXNjYWxhdGlvbl9yZWFzb24pIHx8IGlzQmxhbmsocmVjb3JkLmVzY2FsYXRpb25fcmVhc29uKSlgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2Nhc2Vfc3RhdHVzX3Byb2dyZXNzaW9uJyxcbiAgICAgIHR5cGU6ICdzdGF0ZV9tYWNoaW5lJyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiAnSW52YWxpZCBzdGF0dXMgdHJhbnNpdGlvbicsXG4gICAgICBmaWVsZDogJ3N0YXR1cycsXG4gICAgICAvLyBFc2NhbGF0ZSArIENsb3NlIGFjdGlvbnMgYXJlIGF2YWlsYWJsZSBmcm9tIEFOWSBvcGVuIHN0YXR1cyAoc2VlXG4gICAgICAvLyBlc2NhbGF0ZV9jYXNlIC8gY2xvc2VfY2FzZSB2aXNpYmlsaXR5KS4gVGhlIHRyYW5zaXRpb24gbWFwIG11c3QgcGVybWl0XG4gICAgICAvLyBcdTIxOTJlc2NhbGF0ZWQgYW5kIFx1MjE5MmNsb3NlZCBmcm9tIGV2ZXJ5IG9wZW4gc3RhdGUsIGVsc2UgdGhvc2UgYWN0aW9ucyBlbWl0IGFcbiAgICAgIC8vIHNwdXJpb3VzIFwiSW52YWxpZCBzdGF0dXMgdHJhbnNpdGlvblwiIHdhcm5pbmcgKGUuZy4gZXNjYWxhdGluZyBhIGJyYW5kLW5ld1xuICAgICAgLy8gY2FzZSwgd2hpY2ggaXMgYSBsZWdpdGltYXRlIHN1cHBvcnQgbW92ZSkuXG4gICAgICB0cmFuc2l0aW9uczoge1xuICAgICAgICAnbmV3JzogWydpbl9wcm9ncmVzcycsICd3YWl0aW5nX2N1c3RvbWVyJywgJ2VzY2FsYXRlZCcsICdjbG9zZWQnXSxcbiAgICAgICAgJ2luX3Byb2dyZXNzJzogWyd3YWl0aW5nX2N1c3RvbWVyJywgJ3dhaXRpbmdfc3VwcG9ydCcsICdlc2NhbGF0ZWQnLCAncmVzb2x2ZWQnLCAnY2xvc2VkJ10sXG4gICAgICAgICd3YWl0aW5nX2N1c3RvbWVyJzogWydpbl9wcm9ncmVzcycsICd3YWl0aW5nX3N1cHBvcnQnLCAnZXNjYWxhdGVkJywgJ2Nsb3NlZCddLFxuICAgICAgICAnd2FpdGluZ19zdXBwb3J0JzogWydpbl9wcm9ncmVzcycsICd3YWl0aW5nX2N1c3RvbWVyJywgJ2VzY2FsYXRlZCcsICdjbG9zZWQnXSxcbiAgICAgICAgJ2VzY2FsYXRlZCc6IFsnaW5fcHJvZ3Jlc3MnLCAncmVzb2x2ZWQnLCAnY2xvc2VkJ10sXG4gICAgICAgICdyZXNvbHZlZCc6IFsnY2xvc2VkJywgJ2luX3Byb2dyZXNzJ10sICAvLyBDYW4gcmVvcGVuXG4gICAgICAgICdjbG9zZWQnOiBbJ2luX3Byb2dyZXNzJ10sICAvLyBDYW4gcmVvcGVuXG4gICAgICB9XG4gICAgfSxcbiAgXSxcbiAgXG4gIC8vIFx1MjZBMFx1RkUwRiBObyBgd29ya2Zsb3dzW11gIGhlcmUsIGFuZCBub25lIGlzIHBvc3NpYmxlOiBvYmplY3QgYHdvcmtmbG93c1tdYCB3ZXJlXG4gIC8vIHJlbW92ZWQgZnJvbSB0aGUgcGxhdGZvcm0uIEZpZWxkIHVwZGF0ZXMgbGl2ZSBpbiB0aGlzIG9iamVjdCdzIGAqLmhvb2sudHNgO1xuICAvLyBzY2hlZHVsZWQgc3RhdHVzIGZsaXBzIGFuZCBub3RpZmljYXRpb25zIGxpdmUgaW4gYHNyYy8qL2Zsb3dzLyouZmxvdy50c2AuXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2Uvb2JqZWN0cy9rbm93bGVkZ2VfYXJ0aWNsZS5vYmplY3QudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2Uvb2JqZWN0cy9rbm93bGVkZ2VfYXJ0aWNsZS5vYmplY3QudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IE9iamVjdFNjaGVtYSwgRmllbGQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB7IEYsIFAgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogS25vd2xlZGdlIEFydGljbGUgT2JqZWN0XG4gKlxuICogUmV1c2FibGUsIHNlYXJjaC1pbmRleGVkIGFuc3dlcnMgdGhhdCBiYWNrIHRoZSBTdXBwb3J0IEtub3dsZWRnZSBCYXNlXG4gKiBhbmQgZ3JvdW5kIHRoZSBhc3Npc3RhbnQncyBjYXNlLXJlc29sdXRpb24gc2tpbGxzLlxuICpcbiAqIExpZmVjeWNsZTogZHJhZnQgXHUyMTkyIGluX3JldmlldyBcdTIxOTIgcHVibGlzaGVkIFx1MjE5MiBhcmNoaXZlZC5cbiAqIEF1ZGllbmNlOiAgcHVibGljIChjdXN0b21lciBwb3J0YWwgdmlzaWJsZSkgfCBpbnRlcm5hbCAoYWdlbnQtb25seSkuXG4gKi9cbmV4cG9ydCBjb25zdCBLbm93bGVkZ2VBcnRpY2xlID0gT2JqZWN0U2NoZW1hLmNyZWF0ZSh7XG4gIG5hbWU6ICdjcm1fa25vd2xlZGdlX2FydGljbGUnLFxuICBsYWJlbDogJ0tub3dsZWRnZSBBcnRpY2xlJyxcbiAgcGx1cmFsTGFiZWw6ICdLbm93bGVkZ2UgQXJ0aWNsZXMnLFxuICBpY29uOiAnYm9vay1vcGVuJyxcbiAgZGVzY3JpcHRpb246ICdSZXVzYWJsZSBrbm93bGVkZ2UgYmFzZSBhcnRpY2xlcyBmb3Igc2VsZi1zZXJ2aWNlIGFuZCBBSSBncm91bmRpbmcnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIEtub3dsZWRnZSBiYXNlIGlzIG9yZy1yZWFkYWJsZTsgYXV0aG9ycyBlZGl0LlxuICBzaGFyaW5nTW9kZWw6ICdwdWJsaWNfcmVhZCcsXG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFB1YmxpYyBhY2Nlc3MgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIC8vXG4gIC8vIFB1Ymxpc2hpbmcgYSBwdWJsaWMgYXJ0aWNsZSBtaW50cyBhIHNoYXJlIGxpbmsgdGhyb3VnaCB0aGUgcGxhdGZvcm0nc1xuICAvLyBgcHVibGljU2hhcmluZ2Agc3VyZmFjZSAobWFpbnRhaW5lciBydWxpbmcsIDIwMjYtMDgtMDI6IG5vIGN1c3RvbWVyIHBvcnRhbCxcbiAgLy8gbm8gYW5vbnltb3VzLWdyYW50IHdpZGVuaW5nKS4gXHUyNkQ0IFRoZSB3aG9sZSBzYWZldHkgb2YgdGhhdCByZXN0cyBvblxuICAvLyBgZWxpZ2liaWxpdHlgLCB3aGljaCBpcyB0aGUgT05MWSB0aGluZyBzdGFuZGluZyBiZXR3ZWVuIGEgc2hhcmUgZGlhbG9nIGFuZFxuICAvLyBhIHN0cmFuZ2VyIHJlYWRpbmcgYW4gaW50ZXJuYWwgb3IgZHJhZnQgYXJ0aWNsZSBcdTIwMTQgc28gdGhpcyBibG9jayBtYXkgb25seSBiZVxuICAvLyBkZWNsYXJlZCB3aGlsZSBldmVyeSBrZXkgYmVsb3cgaXMgZW5mb3JjZWQuXG4gIC8vXG4gIC8vIE1FQVNVUkVEIG9uIGBAb2JqZWN0c3RhY2svcGx1Z2luLXNoYXJpbmdAMTcuMS4wYCBcdTIwMTQgdGhlIHZlcnNpb25cbiAgLy8gaW5zdGFsbGVkIEFUIFRIRSBUSU1FIG9mIHRoZSBtZWFzdXJlbWVudCwgbm90IHRoZSBjdXJyZW50IHBpbiAodGhpcyB0YWJsZVxuICAvLyBoYXMgTk9UIGJlZW4gcmUtdGFrZW4gb24gYW55IGxhdGVyIHBpbiBcdTIwMTQgbm90IDE3LjMuMCwgIzE2NzYsIG5vdCAxNy40LjAsXG4gIC8vIFBSICMxODE0LCBhbmQgbm90IDE3LjUuMCkgXHUyMDE0XG4gIC8vIGFnYWluc3QgdGhlIHJlYWwgYFNoYXJlTGlua1NlcnZpY2VgIGFuZCBhIHJlYWwgZW5naW5lLFxuICAvLyBub3QgcmVhZCBvZmYgYSBncmVwIGNvdW50OlxuICAvL1xuICAvLyAgIHwga2V5ICAgICAgICAgICAgICAgICAgfCBtZWFzdXJlZCBvbiAxNy4xLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgLy8gICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gIC8vICAgfCBgZW5hYmxlZGAgICAgICAgICAgICB8IEVORk9SQ0VEIFx1MjAxNCBmYWxzZSBcdTIxRDIgU0hBUklOR19OT1RfRU5BQkxFRCA0MjIgICAgIHxcbiAgLy8gICB8IGBhbGxvd2VkQXVkaWVuY2VzYCAgIHwgRU5GT1JDRUQgXHUyMDE0IGBzaWduZWRfaW5gIHJlZnVzZWQgNDIyICAgICAgICAgICAgIHxcbiAgLy8gICB8IGBhbGxvd2VkUGVybWlzc2lvbnNgIHwgRU5GT1JDRUQgXHUyMDE0IG5vbi1gdmlld2AgcmVmdXNlZCA0MjIgICAgICAgICAgICAgIHxcbiAgLy8gICB8IGByZWRhY3RGaWVsZHNgICAgICAgIHwgQVBQTElFRCB0byBldmVyeSB0b2tlbi1zZXJ2ZWQgcmVzcG9uc2UgICAgICAgICB8XG4gIC8vICAgfCBgZWxpZ2liaWxpdHlgICAgICAgICB8ICoqRU5GT1JDRUQgXHUyMDE0IGZhbHNlIHZlcmRpY3QgXHUyMUQyIDQyMiwgbm8gbGluayoqICAgIHxcbiAgLy9cbiAgLy8gYHRlc3Qva25vd2xlZGdlLWFydGljbGUtc2hhcmUtbGlua3MudGVzdC50c2AgZHJpdmVzIGFsbCBvZiBpdCBlbmQgdG8gZW5kXG4gIC8vIGFuZCBpcyB0aGUgYWNjZXB0YW5jZSBldmlkZW5jZTsgcmVhZCBpdCBiZWZvcmUgY2hhbmdpbmcgYW55dGhpbmcgaGVyZS5cbiAgLy9cbiAgLy8gXHUyNkEwXHVGRTBGIFRXTyBTUEVMTElORyBUUkFQUywgYm90aCBtZWFzdXJlZCwgYm90aCBvZiB3aGljaCBwcm9kdWNlIGEgYmxvY2sgdGhhdFxuICAvLyBMT09LUyBkZWNsYXJlZCBhbmQgc2lsZW50bHkgaXMgbm90OlxuICAvL1xuICAvLyAgMS4gYGVsaWdpYmlsaXR5YCBtdXN0IGJlIGEgUExBSU4gU1RSSU5HLiBJdCBpcyBgei5ab2RTdHJpbmdgIGluIHRoZSBzcGVjXG4gIC8vICAgICBhbmQgYGdldFBvbGljeSgpYCBrZWVwcyBpdCBvbmx5IHdoZW4gYHR5cGVvZiByYXcuZWxpZ2liaWxpdHkgPT09XG4gIC8vICAgICAnc3RyaW5nJ2AuIFRoZSBgUGAgdGFnZ2VkIHRlbXBsYXRlIHVzZWQgYnkgYHZhbGlkYXRpb25zW10uY29uZGl0aW9uYFxuICAvLyAgICAgYmVsb3cgcmV0dXJucyBhbiBFeHByZXNzaW9uIE9CSkVDVCBgeyBkaWFsZWN0LCBzb3VyY2UgfWAgXHUyMDE0IHBhc3Npbmcgb25lXG4gIC8vICAgICBoZXJlIGRvZXMgbm90IG5hcnJvdyBhbnl0aGluZywgaXQgbWFrZXMgdGhlIHByZWRpY2F0ZSB2YW5pc2guXG4gIC8vXG4gIC8vICAyLiBFdmVyeSBmaWVsZCByZWFkIGlzIGByZWNvcmQuYC1QUkVGSVhFRC4gVGhlIGV2YWx1YXRvciBpc1xuICAvLyAgICAgYEV4cHJlc3Npb25FbmdpbmVgIGZyb20gYEBvYmplY3RzdGFjay9mb3JtdWxhYCAocmVjb3JkLWxldmVsIENFTCksIGFuZFxuICAvLyAgICAgYHJlY29yZGAgaXMgdGhlIE9OTFkgYmluZGluZyBpdCBpcyBnaXZlbi4gVGhlIGJhcmUtaWRlbnRpZmllciBzcGVsbGluZ1xuICAvLyAgICAgYHN0YXR1cyA9PSAncHVibGlzaGVkJyAmJiBhdWRpZW5jZSA9PSAncHVibGljJ2AgQ09NUElMRVMgYW5kIHRoZW4gZmFpbHNcbiAgLy8gICAgIGF0IGV2YWx1YXRlIHdpdGggYFVua25vd24gdmFyaWFibGU6IGF1ZGllbmNlYCxcbiAgLy8gICAgIHdoaWNoIGBhc3NlcnRFbGlnaWJsZWAgdHVybnMgaW50byBFTElHSUJJTElUWV9VTkVWQUxVQUJMRSA0MjIuIFRoYXRcbiAgLy8gICAgIGZhaWxzIENMT1NFRCwgc28gaXQgaXMgbm90IGEgc2VjdXJpdHkgaG9sZTsgaXQgaXMgYSBmZWF0dXJlIHRoYXQgbmV2ZXJcbiAgLy8gICAgIG1pbnRzIGEgc2luZ2xlIGxpbmsgd2hpbGUgcmVhZGluZyBhcyBpZiBpdCB3b3Jrcy5cbiAgLy9cbiAgLy8gVGhlIHByZWRpY2F0ZSBpcyBUT1RBTCBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBgdmFsaWRhdGlvbnNgIGJlbG93IGFyZTpcbiAgLy8gYGhhcygpYCBndWFyZHMgZXZlcnkgcmVhZC4gYGFzc2VydEVsaWdpYmxlYCBtYXRlcmlhbGl6ZXMgZGVjbGFyZWQgZmllbGRzIHRvXG4gIC8vIGBudWxsYCBmaXJzdCwgc28gYW4gYWJzZW50IGtleSB3b3VsZCBub3QgYWJvcnQgaGVyZSB0b2RheSBcdTIwMTQgdGhlIGd1YXJkcyBrZWVwXG4gIC8vIHRoYXQgdHJ1ZSBpZiB0aGUgZmllbGQgc2V0IGNoYW5nZXMuIChUaGUgYGhhcyhyZWNvcmQueClgIGNhdmVhdCBjYXJyaWVkXG4gIC8vIGZyb20gb2JqZWN0c3RhY2sjNzg2MSBpcyBhYm91dCBgY29tcGlsZUNlbFRvRmlsdGVyYCwgdGhlIFNIQVJJTkctUlVMRSBwYXRoLlxuICAvLyBUaGF0IGlzIGEgZGlmZmVyZW50IGV2YWx1YXRvciwgaXQgaXMgbm90IG9uIHRoaXMgY29kZSBwYXRoLCBhbmQgaXQgaXMgbm90XG4gIC8vIGV2ZW4gZXhwb3J0ZWQgZnJvbSBgQG9iamVjdHN0YWNrL3BsdWdpbi1zaGFyaW5nYC4gVmVyaWZpZWQsIG5vdCBhc3N1bWVkLilcbiAgLy9cbiAgLy8gXHUyNkEwXHVGRTBGIEVsaWdpYmlsaXR5IGlzIGV2YWx1YXRlZCBhdCBNSU5UIHRpbWUgb25seTsgYHJlc29sdmVUb2tlbigpYCBkb2VzIG5vdFxuICAvLyByZS1jaGVjayBpdC4gUmUtY2xhc3NpZnlpbmcgYSBwdWJsaXNoZWQvcHVibGljIGFydGljbGUgdG8gaW50ZXJuYWwgb3IgYmFja1xuICAvLyB0byBkcmFmdCBkb2VzIE5PVCByZXZva2UgbGlua3MgYWxyZWFkeSBtaW50ZWQgZnJvbSBpdCBcdTIwMTQgdGhvc2UgbXVzdCBiZVxuICAvLyByZXZva2VkIGV4cGxpY2l0bHkuIFRoYXQgaXMgcGxhdGZvcm0gYmVoYXZpb3VyLCBmaWxlZCB1cHN0cmVhbSwgbm90XG4gIC8vIHNvbWV0aGluZyB0aGlzIGFwcCBjb21wZW5zYXRlcyBmb3IgYXBwLXNpZGUuXG4gIHB1YmxpY1NoYXJpbmc6IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8vIGBwdWJsaWNgIGFuZCBgbGlua19vbmx5YCBvbmx5LiBgc2lnbmVkX2luYCB3b3VsZCBiZSBhIGRpZmZlcmVudCBmZWF0dXJlXG4gICAgLy8gYW5kIGBlbWFpbGAgaXMgcmVmdXNlZCBhdCBjcmVhdGlvbiB3aXRob3V0IGFuIGFsbG93bGlzdC5cbiAgICBhbGxvd2VkQXVkaWVuY2VzOiBbJ3B1YmxpYycsICdsaW5rX29ubHknXSxcbiAgICAvLyBSZWFkLW9ubHkuIFNhbWUgYXMgdGhlIHBsYXRmb3JtIGRlZmF1bHQsIGRlY2xhcmVkIGFueXdheTogdGhpcyBpcyBhXG4gICAgLy8gc2VjdXJpdHkgYm91bmRhcnksIGFuZCBhIGRlZmF1bHQgaXMgbm90IGEgZGVjaXNpb24uXG4gICAgYWxsb3dlZFBlcm1pc3Npb25zOiBbJ3ZpZXcnXSxcbiAgICAvLyBUaGUgZ2F0ZS4gUHVibGlzaGVkIEFORCBwdWJsaWMtYXVkaWVuY2UsIG5vdGhpbmcgZWxzZSBcdTIwMTQgYSBkcmFmdCwgYW5cbiAgICAvLyBpbl9yZXZpZXcsIGFuIGFyY2hpdmVkLCBvciBhbnkgaW50ZXJuYWwtYXVkaWVuY2UgYXJ0aWNsZSBpcyByZWZ1c2VkIGF0XG4gICAgLy8gYGNyZWF0ZUxpbmtgIHdpdGggUkVDT1JEX05PVF9FTElHSUJMRSA0MjIgYW5kIG5vIHJvdyBpcyB3cml0dGVuLlxuICAgIGVsaWdpYmlsaXR5OlxuICAgICAgJ2hhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwicHVibGlzaGVkXCIgJiYgJyArXG4gICAgICAnaGFzKHJlY29yZC5hdWRpZW5jZSkgJiYgcmVjb3JkLmF1ZGllbmNlID09IFwicHVibGljXCInLFxuICAgIC8vIFN0cmlwcGVkIGZyb20gZXZlcnkgdG9rZW4tc2VydmVkIHJlc3BvbnNlLiBUaGVzZSBhcmUgdGhlIGZpZWxkcyB0aGF0XG4gICAgLy8gZXhpc3QgZm9yIHN0YWZmOiB3aG8gb3ducyB0aGUgYXJ0aWNsZSwgd2hpY2ggY3VzdG9tZXIgY2FzZSBpdCB3YXNcbiAgICAvLyB3cml0dGVuIGZyb20sIGFuZCB3aGVuIGFuIGVkaXRvciBsYXN0IHJldmlld2VkIGl0LiBOb25lIG9mIHRoZW0gYXJlIHBhcnRcbiAgICAvLyBvZiB0aGUgYW5zd2VyIGEgcmVhZGVyIGZvbGxvd2VkIHRoZSBsaW5rIGZvci5cbiAgICByZWRhY3RGaWVsZHM6IFsnb3duZXJfaWQnLCAncmVsYXRlZF90b19jYXNlJywgJ2xhc3RfcmV2aWV3ZWRfYXQnXSxcbiAgfSxcblxuICAvLyBBRFItMDA3OTogcmVuZGVyLW9ubHkgYHRpdGxlRm9ybWF0YCByZXRpcmVkIGluIGZhdm9yIG9mIGBuYW1lRmllbGRgLFxuICAvLyB3aGljaCBuYW1lcyBhIHJlYWwgZmllbGQuIFRoZSBmb3JtZXIgdGVtcGxhdGUgY29tcG9zZWQgdHdvIGxvY2FsIGZpZWxkcywgc29cbiAgLy8gYSBgZGlzcGxheV90aXRsZWAgZm9ybXVsYSBmaWVsZCByZXByb2R1Y2VzIGl0IGZvciB0aGUgcmVjb3JkIHRpdGxlLlxuICBuYW1lRmllbGQ6ICdkaXNwbGF5X3RpdGxlJyxcbiAgLy8gRXhwbGljaXQgc2VhcmNoIHRhcmdldHMgKEFEUi0wMDYxKS4gUkVRVUlSRUQgYmVjYXVzZSBuYW1lRmllbGQgaXMgYVxuICAvLyBGT1JNVUxBIChkaXNwbGF5X3RpdGxlL2Z1bGxfbmFtZSk6IHdpdGhvdXQgdGhpcywgJHNlYXJjaCBhdXRvLWRlZmF1bHRzIHRvXG4gIC8vIHRoZSBmb3JtdWxhIGZpZWxkLCB3aGljaCBpc24ndCBhIHJlYWwgY29sdW1uLCBzbyB0aGUgbG9va3VwIHBpY2tlciArIGdsb2JhbFxuICAvLyBzZWFyY2ggc2lsZW50bHkgcmV0dXJuIHplcm8uIFRoZXNlIGFyZSByZWFsLCBpbmRleGVkIGNvbHVtbnMuXG4gIHNlYXJjaGFibGVGaWVsZHM6IFsndGl0bGUnLCAnYXJ0aWNsZV9udW1iZXInLCAnc3VtbWFyeSddLFxuICBoaWdobGlnaHRGaWVsZHM6IFsnYXJ0aWNsZV9udW1iZXInLCAndGl0bGUnLCAnY2F0ZWdvcnknLCAnc3RhdHVzJywgJ2F1ZGllbmNlJ10sXG5cbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2Jhc2ljJywgICAgIGxhYmVsOiAnQXJ0aWNsZSBJbmZvcm1hdGlvbicsIGljb246ICdpbmZvJyB9LFxuICAgIHsga2V5OiAnY29udGVudCcsICAgbGFiZWw6ICdDb250ZW50JywgICAgICAgICAgICAgaWNvbjogJ2ZpbGUtdGV4dCcgfSxcbiAgICB7IGtleTogJ3RheG9ub215JywgIGxhYmVsOiAnQ2F0ZWdvcml6YXRpb24nLCAgICAgIGljb246ICd0YWcnIH0sXG4gICAgeyBrZXk6ICdtZXRyaWNzJywgICBsYWJlbDogJ0VuZ2FnZW1lbnQnLCAgICAgICAgICBpY29uOiAnYWN0aXZpdHknLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgXSxcblxuICBmaWVsZHM6IHtcbiAgICAvLyBQbGF0Zm9ybSBvd25lcnNoaXAgYW5jaG9yIFx1MjAxNCBjYW5vbmljYWwgbm90ZSBpbiBgYWNjb3VudC5vYmplY3QudHNgICgjNTQ4KS5cbiAgICBvd25lcl9pZDogRmllbGQubG9va3VwKCdzeXNfdXNlcicsIHtcbiAgICAgIGxhYmVsOiAnQXJ0aWNsZSBPd25lcicsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIHN5c3RlbTogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiBmYWxzZSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIGFydGljbGVfbnVtYmVyOiBGaWVsZC5hdXRvbnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnQXJ0aWNsZSBOdW1iZXInLFxuICAgICAgZm9ybWF0OiAnS0EtezAwMDB9JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuXG4gICAgdGl0bGU6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdUaXRsZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG1heExlbmd0aDogMjU1LFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICAvLyBBRFItMDA3OSByZWNvcmQgdGl0bGUgKHdhcyB0aXRsZUZvcm1hdCAne2FydGljbGVfbnVtYmVyfSAtIHt0aXRsZX0nKS5cbiAgICBkaXNwbGF5X3RpdGxlOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnRGlzcGxheSBUaXRsZScsXG4gICAgICBleHByZXNzaW9uOiBGYHJlY29yZC5hcnRpY2xlX251bWJlciArIFwiIC0gXCIgKyByZWNvcmQudGl0bGVgLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICBzdW1tYXJ5OiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnU3VtbWFyeScsXG4gICAgICBkZXNjcmlwdGlvbjogJ09uZS1wYXJhZ3JhcGggVEw7RFIgc2hvd24gaW4gc2VhcmNoIHJlc3VsdHMgYW5kIEFJIGNpdGF0aW9ucy4nLFxuICAgICAgbWF4TGVuZ3RoOiA1MDAsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICBib2R5OiBGaWVsZC5tYXJrZG93bih7XG4gICAgICBsYWJlbDogJ0JvZHknLFxuICAgICAgZGVzY3JpcHRpb246ICdGdWxsIGFydGljbGUgY29udGVudCAoTWFya2Rvd24pLicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgZ3JvdXA6ICdjb250ZW50JyxcbiAgICB9KSxcblxuICAgIGNhdGVnb3J5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdDYXRlZ29yeScsXG4gICAgICBncm91cDogJ3RheG9ub215JyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0dldHRpbmcgU3RhcnRlZCcsICAgICB2YWx1ZTogJ2dldHRpbmdfc3RhcnRlZCcsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ0hvdy1UbycsICAgICAgICAgICAgICB2YWx1ZTogJ2hvd190bycgfSxcbiAgICAgICAgeyBsYWJlbDogJ1Ryb3VibGVzaG9vdGluZycsICAgICB2YWx1ZTogJ3Ryb3VibGVzaG9vdGluZycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0JpbGxpbmcgJiBQcmljaW5nJywgICB2YWx1ZTogJ2JpbGxpbmcnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdBUEkgJiBJbnRlZ3JhdGlvbnMnLCAgdmFsdWU6ICdhcGknIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWxlYXNlIE5vdGVzJywgICAgICAgdmFsdWU6ICdyZWxlYXNlX25vdGVzJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUG9saWN5JywgICAgICAgICAgICAgIHZhbHVlOiAncG9saWN5JyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIHRhZ3M6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ1RhZ3MnLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBncm91cDogJ3RheG9ub215JyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0F1dGgnLCAgICAgICAgICB2YWx1ZTogJ2F1dGgnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTU08nLCAgICAgICAgICAgdmFsdWU6ICdzc28nIH0sXG4gICAgICAgIHsgbGFiZWw6ICdNb2JpbGUnLCAgICAgICAgdmFsdWU6ICdtb2JpbGUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFbWFpbCcsICAgICAgICAgdmFsdWU6ICdlbWFpbCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1JlcG9ydHMnLCAgICAgICB2YWx1ZTogJ3JlcG9ydHMnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQZXJmb3JtYW5jZScsICAgdmFsdWU6ICdwZXJmb3JtYW5jZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0RhdGEgSW1wb3J0JywgICB2YWx1ZTogJ2RhdGFfaW1wb3J0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnV2ViaG9va3MnLCAgICAgIHZhbHVlOiAnd2ViaG9va3MnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnRHJhZnQnLCAgICAgIHZhbHVlOiAnZHJhZnQnLCAgICAgY29sb3I6ICcjOTRBM0I4JywgZGVmYXVsdDogdHJ1ZSB9LFxuICAgICAgICB7IGxhYmVsOiAnSW4gUmV2aWV3JywgIHZhbHVlOiAnaW5fcmV2aWV3JywgY29sb3I6ICcjRjU5RTBCJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUHVibGlzaGVkJywgIHZhbHVlOiAncHVibGlzaGVkJywgY29sb3I6ICcjMTBCOTgxJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQXJjaGl2ZWQnLCAgIHZhbHVlOiAnYXJjaGl2ZWQnLCAgY29sb3I6ICcjNDc1NTY5JyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIGF1ZGllbmNlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdBdWRpZW5jZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1B1YmxpYyBhcnRpY2xlcyBhcmUgdmlzaWJsZSBpbiB0aGUgY3VzdG9tZXIgcG9ydGFsOyBpbnRlcm5hbCBhcnRpY2xlcyBhcmUgYWdlbnQtb25seS4nLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnUHVibGljJywgICB2YWx1ZTogJ3B1YmxpYycsIGRlZmF1bHQ6IHRydWUsIGNvbG9yOiAnIzBFQTVFOScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0ludGVybmFsJywgdmFsdWU6ICdpbnRlcm5hbCcsIGNvbG9yOiAnIzdDM0FFRCcgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICBsYW5ndWFnZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnTGFuZ3VhZ2UnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdFbmdsaXNoJywgICAgICAgICAgICAgdmFsdWU6ICdlbicsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ1NpbXBsaWZpZWQgQ2hpbmVzZScsICB2YWx1ZTogJ3poX2NuJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU3BhbmlzaCcsICAgICAgICAgICAgIHZhbHVlOiAnZXNfZXMnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdKYXBhbmVzZScsICAgICAgICAgICAgdmFsdWU6ICdqYV9qcCcgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICByZWxhdGVkX3RvX2Nhc2U6IEZpZWxkLmxvb2t1cCgnY3JtX2Nhc2UnLCB7XG4gICAgICBsYWJlbDogJ09yaWdpbmF0aW5nIENhc2UnLFxuICAgICAgZGVzY3JpcHRpb246ICdDYXNlIHRoaXMgYXJ0aWNsZSB3YXMgYXV0aG9yZWQgZnJvbSAob3B0aW9uYWwpLicsXG4gICAgICBncm91cDogJ2NvbnRlbnQnLFxuICAgIH0pLFxuXG5cbiAgICBwdWJsaXNoZWRfYXQ6IEZpZWxkLmRhdGV0aW1lKHtcbiAgICAgIGxhYmVsOiAnUHVibGlzaGVkIEF0JyxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICBsYXN0X3Jldmlld2VkX2F0OiBGaWVsZC5kYXRldGltZSh7XG4gICAgICBsYWJlbDogJ0xhc3QgUmV2aWV3ZWQgQXQnLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIGB2aWV3X2NvdW50YCBpcyBHT05FICgjNjAxKSwgYW5kIHRoaXMgbm90ZSBpcyB0aGUgcmVjb3JkIG9mIHdoeS5cbiAgICAgKlxuICAgICAqIEFsbCB0aHJlZSBlbmdhZ2VtZW50IGNvdW50ZXJzIHdlcmUgYHJlYWRvbmx5OiB0cnVlYCB3aXRoIGEgd3JpdGVyXG4gICAgICogbm93aGVyZSBcdTIwMTQgb24gdGhlIHBsYXRmb3JtIG9yIGluIHRoaXMgYXBwIFx1MjAxNCBzbyBhbGwgdGhyZWUgd2VyZSBwaW5uZWQgYXRcbiAgICAgKiB3aGF0ZXZlciB0aGUgc2VlZCBzYWlkLCBmb3JldmVyLCB3aGlsZSB0aGUgYXJ0aWNsZSBncmlkIHN1bW1lZCBhIFwiVmlld3NcIlxuICAgICAqIGNvbHVtbi4gQURSLTAwNDkncyBlbmZvcmNlLW9yLXJlbW92ZSBsZWF2ZXMgdHdvIGhvbmVzdCBlbmRpbmdzIHBlclxuICAgICAqIGZpZWxkOiBnaXZlIGl0IGEgd3JpdGVyLCBvciBkZWxldGUgaXQuIFRoZSBjYXJkIGxlZnQgdGhpcyBvbmUgdG8gdGhlXG4gICAgICogaW1wbGVtZW50ZXIsIGFuZCB0aGUgdHdvIGJlbG93IHdlbnQgdGhlIG90aGVyIHdheSwgc28gdGhlIHNwbGl0IGlzXG4gICAgICogYXJndWVkIHJhdGhlciB0aGFuIGFzc3VtZWQuXG4gICAgICpcbiAgICAgKiBBIHBhZ2UtdmlldyB3cml0ZXIgV09VTEQgaGF2ZSBiZWVuIGV4cHJlc3NpYmxlIFx1MjAxNCBgYWZ0ZXJGaW5kYCBpcyBhIHJlYWxcbiAgICAgKiBob29rIGV2ZW50IG9uIHRoaXMgcGxhdGZvcm0uIEl0IGlzIG5vdCBidWlsdCwgYmVjYXVzZSBvZiB3aGF0IHRoZSBldmVudFxuICAgICAqIGFjdHVhbGx5IG1lYW5zOiBgYmVmb3JlRmluZGAvYGFmdGVyRmluZGAgZmlyZSBvbiByZWNvcmQgTUFURVJJQUxJWkFUSU9OLFxuICAgICAqIGZvciBgZmluZGAgYW5kIGBmaW5kT25lYCBhbGlrZSwgd2l0aCBubyBwZXItbWV0aG9kIHJlYWQgZXZlbnRcbiAgICAgKiAoZGVsaWJlcmF0ZWx5IFx1MjAxNCBzZWUgdGhlIHNwZWMncyBub3RlIG9uICMzMTk1KS4gU28gYSBjb3VudGVyIHdyaXR0ZW5cbiAgICAgKiB0aGVyZSB3b3VsZCBpbmNyZW1lbnQgb24gdGhlIGFydGljbGUgZ3JpZCwgb24gZ2xvYmFsIHNlYXJjaCwgb24gdGhlXG4gICAgICogbG9va3VwIHBpY2tlciBpbiB0aGUgY2xvc2UtY2FzZSBzY3JlZW4sIG9uIHRoZSBBSSBncm91bmRpbmcgcXVlcmllcyB0aGF0XG4gICAgICogY2l0ZSBhcnRpY2xlcyBcdTIwMTQgZXZlcnkgb25lIG9mIHRoZW0gYSBcInZpZXdcIiBvZiBhIHJvdyBub2JvZHkgcmVhZC4gVGhlXG4gICAgICogbnVtYmVyIHdvdWxkIGdyb3cgZmFzdGVzdCBmb3IgYXJ0aWNsZXMgbm9ib2R5IG9wZW5zLCBhbmQgaXQgd291bGQgY2FycnlcbiAgICAgKiBhIGRhdGFiYXNlIHdyaXRlIG9uIGV2ZXJ5IHJlYWQgcGF0aCBpbiB0aGUgYXBwIHRvIGRvIGl0LlxuICAgICAqXG4gICAgICogXCJWaWV3c1wiIHRoYXQgbWVhbnMgXCJhcHBlYXJhbmNlcyBpbiBhbnkgcXVlcnlcIiBpcyBhIHdvcnNlIGxpZSB0aGFuIGFcbiAgICAgKiBmaWVsZCB0aGF0IGlzIG1pc3NpbmcsIGJlY2F1c2UgaXQgbG9va3MgbGlrZSBkYXRhLiBBIHJlYWwgcGFnZS12aWV3XG4gICAgICogY291bnRlciBuZWVkcyBhIHJlYWwgdmlldyBldmVudCBmcm9tIGEgcmVhbCBhcnRpY2xlIHN1cmZhY2UgXHUyMDE0IHRoZSBkYXlcbiAgICAgKiBvbmUgZXhpc3RzLCB0aGlzIGZpZWxkIGNvbWVzIGJhY2sgd2l0aCBpdCwgYW5kIG5vdCBiZWZvcmUuXG4gICAgICpcbiAgICAgKiBgaGVscGZ1bF9jb3VudGAgLyBgbm90X2hlbHBmdWxfY291bnRgIERPIGdldCBhIHdyaXRlciwgYW5kIGl0IGlzIHRoZVxuICAgICAqIHdob2xlIHJlYXNvbiBgY3JtX2FydGljbGVfZmVlZGJhY2tgIGV4aXN0czogcmVhZGVyIHZlcmRpY3RzIGFyZSByZWNvcmRlZFxuICAgICAqIGFzIHJvd3MgYW5kIHRoZXNlIHR3byBhcmUgUkVDT1VOVEVEIGZyb20gdGhlbSBieVxuICAgICAqIGBhcnRpY2xlX2ZlZWRiYWNrX21ldHJpY3NfcmVmcmVzaGAuIFRoZXkgc3RheSBgcmVhZG9ubHk6IHRydWVgIGFuZCB0aGF0XG4gICAgICogaXMgbm93IGFuIGFjY3VyYXRlIHN0YXRlbWVudCBcdTIwMTQgZGVyaXZlZCBmcm9tIGV2aWRlbmNlLCBuZXZlciB0eXBlZCBpbi5cbiAgICAgKi9cbiAgICBoZWxwZnVsX2NvdW50OiBGaWVsZC5udW1iZXIoe1xuICAgICAgbGFiZWw6ICdIZWxwZnVsIFZvdGVzJyxcbiAgICAgIGdyb3VwOiAnbWV0cmljcycsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogMCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUmVjb3VudGVkIGZyb20gY3JtX2FydGljbGVfZmVlZGJhY2sgXHUyMDE0IG5ldmVyIHR5cGVkIGluLicsXG4gICAgfSksXG5cbiAgICBub3RfaGVscGZ1bF9jb3VudDogRmllbGQubnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnTm90IEhlbHBmdWwgVm90ZXMnLFxuICAgICAgZ3JvdXA6ICdtZXRyaWNzJyxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgZGVmYXVsdFZhbHVlOiAwLFxuICAgICAgZGVzY3JpcHRpb246ICdSZWNvdW50ZWQgZnJvbSBjcm1fYXJ0aWNsZV9mZWVkYmFjayBcdTIwMTQgbmV2ZXIgdHlwZWQgaW4uJyxcbiAgICB9KSxcbiAgfSxcblxuICBpbmRleGVzOiBbXG4gICAgeyBmaWVsZHM6IFsndGl0bGUnXSB9LFxuICAgIHsgZmllbGRzOiBbJ2NhdGVnb3J5J10gfSxcbiAgICB7IGZpZWxkczogWydzdGF0dXMnXSB9LFxuICAgIHsgZmllbGRzOiBbJ2F1ZGllbmNlJ10gfSxcbiAgICB7IGZpZWxkczogWydsYW5ndWFnZSddIH0sXG4gIF0sXG5cbiAgLy8gQVBJIHN1cmZhY2UuIEhpc3RvcnkgXHUyMTkyIEZpZWxkLnRyYWNrSGlzdG9yeSAoQURSLTAwNTIpLlxuICBlbmFibGU6IHtcbiAgICBhcGlFbmFibGVkOiB0cnVlLFxuICAgIGFwaU1ldGhvZHM6IFsnZ2V0JywgJ2xpc3QnLCAnY3JlYXRlJywgJ3VwZGF0ZScsICdkZWxldGUnXSxcbiAgfSxcblxuICAvLyBQcmVkaWNhdGVzIGJlbG93IGFyZSBUT1RBTDogZXZlcnkgYHJlY29yZC54YCByZWFkIGlzIGBoYXMoKWAtZ3VhcmRlZCwgc28gdGhlXG4gIC8vIHJ1bGUgcmV0dXJucyBhIHZlcmRpY3QgZXZlbiB3aGVuIHRoZSBtZXJnZWQgcmVjb3JkIGhhcyBubyBzdWNoIGtleS4gU2VlXG4gIC8vIEFHRU5UUy5tZCBcIlZhbGlkYXRpb24gcHJlZGljYXRlcyBtdXN0IGJlIFRPVEFMXCIgYW5kXG4gIC8vIHRlc3Qvb2JqZWN0LXZhbGlkYXRpb24tcHJlZGljYXRlcy50ZXN0LnRzLCB3aGljaCBmYWlscyB0aGUgYnVpbGQgb3RoZXJ3aXNlLlxuICB2YWxpZGF0aW9uczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdwdWJsaXNoZWRfcmVxdWlyZXNfYm9keScsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0FydGljbGVzIGNhbm5vdCBiZSBwdWJsaXNoZWQgd2l0aG91dCBhIGJvZHkuJyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnN0YXR1cykgJiYgcmVjb3JkLnN0YXR1cyA9PSBcInB1Ymxpc2hlZFwiICYmICghaGFzKHJlY29yZC5ib2R5KSB8fCByZWNvcmQuYm9keSA9PSBudWxsIHx8IHJlY29yZC5ib2R5ID09IFwiXCIpYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdwdWJsaXNoZWRfcmVxdWlyZXNfc3VtbWFyeScsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiAnUHVibGlzaGVkIGFydGljbGVzIHNob3VsZCBoYXZlIGEgc3VtbWFyeSBmb3Igc2VhcmNoIHJlc3VsdHMgYW5kIEFJIGNpdGF0aW9ucy4nLFxuICAgICAgY29uZGl0aW9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwicHVibGlzaGVkXCIgJiYgKCFoYXMocmVjb3JkLnN1bW1hcnkpIHx8IHJlY29yZC5zdW1tYXJ5ID09IG51bGwgfHwgcmVjb3JkLnN1bW1hcnkgPT0gXCJcIilgLFxuICAgIH0sXG4gIF0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIE9iamVjdCBEZWZpbml0aW9ucyBCYXJyZWxcbiAqIFxuICogUmUtZXhwb3J0cyB0aGlzIHBhY2thZ2UncyAqLm9iamVjdC50cyBkZWZpbml0aW9ucyBmb3IgcmVnaXN0cmF0aW9uIGJ5IHRoZVxuICogYXBwIHBhY2thZ2UncyBzdGFjayAoYG9iamVjdHN0YWNrLmNvbXBvc2l0aW9uLnRzYCBcdTIxOTIgYHNyYy9zYWxlcy9pbmRleC50c2ApLiBUaGUgYCouaG9vay50c2AgZmlsZXMgc2l0IGJlc2lkZSB0aGVtIGFuZCBhcmVcbiAqIHJlZ2lzdGVyZWQgdGhyb3VnaCBgLi9ob29rcy50c2AgaW5zdGVhZCBcdTIwMTQgYSBob29rIGlzIGF0dGFjaGVkIHRvIHRoZSBvYmplY3RcbiAqIGl0IG5hbWVzLCBhbmQgc2luY2UgdGhlIEFEUi0wMTMwIGxheW91dCBhIGRpcmVjdG9yeSBpcyBhIHBhY2thZ2UsIHNvIHRoZSB0d29cbiAqIHRyYXZlbCB0b2dldGhlci5cbiAqL1xuXG4vKlxuICogQ2Fub25pY2FsIG5vdGUgXHUyMDE0IHRoZSBjb2xsYWJvcmF0aW9uIGNhcGFiaWxpdGllcyAoYGVuYWJsZS5maWxlc2AsXG4gKiBgZW5hYmxlLmZlZWRzYCkuIFJlZmVyZW5jZWQgZnJvbSBlYWNoIG9iamVjdCB0aGF0IG9wdHMgaW4gKCM2MDIpLlxuICpcbiAqICoqYGVuYWJsZS5maWxlc2AgXHUyMDE0IGF0dGFjaG1lbnRzLiBPcHQtaW4sIHNwZWMgZGVmYXVsdCBgZmFsc2VgLioqIEl0IGlzIGEgcmVhbCxcbiAqIGRvdWJseS1lbmZvcmNlZCBzd2l0Y2gsIG5vdCBkb2N1bWVudGF0aW9uOlxuICpcbiAqIC0gU2VydmVyOiBgcGx1Z2luLWF1ZGl0YCdzIGBlbmZvcmNlRmlsZXNDYXBhYmlsaXR5YCBydW5zIGBiZWZvcmVJbnNlcnRgIG9uXG4gKiAgIGBzeXNfYXR0YWNobWVudGAgYW5kIHRocm93cyBgRklMRVNfRElTQUJMRURgICg0MDMpIHdoZW4gdGhlIHJvdydzXG4gKiAgIGBwYXJlbnRfb2JqZWN0YCBkb2VzIG5vdCBkZWNsYXJlIGBmaWxlczogdHJ1ZWAuIE5vIGZsYWcgXHUyMTkyIG5vIGF0dGFjaG1lbnQgY2FuXG4gKiAgIGV4aXN0IGFnYWluc3QgdGhlIHJlY29yZCwgd2hhdGV2ZXIgdGhlIFVJIG9mZmVycy5cbiAqIC0gQ2xpZW50OiB0aGUgY29uc29sZSdzIGBSZWNvcmREZXRhaWxWaWV3YCBnYXRlcyBpdHMgQXR0YWNobWVudHMgcGFuZWwgb25cbiAqICAgYGVuYWJsZT8uZmlsZXMgPT09IHRydWVgLCBzbyBhbiBvYmplY3Qgd2l0aG91dCB0aGUgZmxhZyBoYXMgbm8gdXBsb2FkXG4gKiAgIHN1cmZhY2UgYXQgYWxsLlxuICpcbiAqIFRoZSBmbGFnIG9wZW5zIHRoZSBzdXJmYWNlOyBpdCBncmFudHMgKipubyoqIGFjY2VzcyBvZiBpdHMgb3duLCBhbmQgbm90aGluZ1xuICogZWxzZSBvbiB0aGUgcGxhdGZvcm0gZG9lcyBlaXRoZXIuIGBzeXNfYXR0YWNobWVudGAgaXMgYW4gb2JqZWN0IGxpa2UgYW55XG4gKiBvdGhlcjogdGhlIHBsYXRmb3JtJ3MgbWVtYmVyIGJhc2VsaW5lIG5hbWVzIGl0IG5vd2hlcmUgKGl0IHdhcyBuYXJyb3dlZCB0b1xuICogZXhwbGljaXQtYWxsb3csIG9iamVjdHN0YWNrLWFpL29iamVjdHN0YWNrIzU0OTEpLCBzbyBhIHBlcnNvbiB3aG9zZVxuICogcGVybWlzc2lvbiBzZXRzIGRvIG5vdCBncmFudCBpdCBpcyByZWZ1c2VkIHRoZSB3aG9sZSBwYW5lbCB3aXRoIDQwM1xuICogYFBFUk1JU1NJT05fREVOSUVEYCwgcmVhZHMgaW5jbHVkZWQuIE1lYXN1cmVkIG9uIGEgZnJlc2ggYHBucG0gZGV2YCBib3hcbiAqICgjMjAyOSk6IGBuYS5yZXBgLCBvcGVuaW5nIGEgcXVvdGUgdGhleSBjYW4gcmVhZCwgZ290IFwiWW91IGRvbid0IGhhdmUgYWNjZXNzXG4gKiB0byB0aGVzZSBhdHRhY2htZW50c1wiLCBhbmQgZXZlcnkgb3RoZXIgZGVtbyBwZXJzb25hIGdvdCB0aGUgc2FtZSBhbnN3ZXIuXG4gKiBUaGUgcGxhdGZvcm0ncyBhdHRhY2htZW50cy1hY2Nlc3MgcGFnZSBuYW1lcyB0aGUgcmVtZWR5OiBhbiBvcmRpbmFyeSxcbiAqIHBvc2l0aW9uLWRpc3RyaWJ1dGVkIHBlcm1pc3Npb24gc2V0IGdyYW50cyBgc3lzX2F0dGFjaG1lbnRgLiBTbyBFVkVSWVxuICogcGVybWlzc2lvbiBzZXQgd2hvc2UgaG9sZGVycyBjYW4gcmVhZCBhIGZpbGVzLWVuYWJsZWQgb2JqZWN0IGdyYW50cyBpdFxuICogYGFsbG93UmVhZGAsIGFuZCBgZ3Vlc3RfcG9ydGFsYCBncmFudHMgbm90aGluZy5cbiAqXG4gKiBXSElDSCBhdHRhY2htZW50cyB0aGF0IGdyYW50IHJlYWNoZXMgc3RheXMgd2l0aCB0aGUgcGFyZW50IHJlY29yZDogYVxuICogYHNlcnZpY2Utc3RvcmFnZWAgbWlkZGxld2FyZSBpbnRlcnNlY3RzIGV2ZXJ5IGBzeXNfYXR0YWNobWVudGAgcmVhZCB3aXRoIHRoZVxuICogcGFyZW50cyB0aGUgY2FsbGVyIGNhbiBhY3R1YWxseSBzZWUgKGZhaWxpbmcgY2xvc2VkIHRvIGEgZGVueS1hbGwgZmlsdGVyIG9uXG4gKiBlcnJvcikuIFNvIGEgcmVwIGxpc3RzIHRoZSBhdHRhY2htZW50cyBvZiB0aGUgcXVvdGVzIHRoZXkgY2FuIHJlYWQgYW5kIG9mIG5vXG4gKiBvdGhlciAoYHRlc3QvcmVjb3JkLWF0dGFjaG1lbnRzLWFjY2Vzcy50ZXN0LnRzYCBtZWFzdXJlcyBpdCkuXG4gKlxuICogKipVcGxvYWQgYW5kIGRlbGV0ZSBhcmUgTk9UIGdyYW50ZWQsIG9uIHB1cnBvc2UgKCMyMDI5KS4qKiBUaGVpciBnYXRlIGlzXG4gKiBgY2FuRWRpdChwYXJlbnQpYCAoYXR0YWNoKSBhbmQgdXBsb2FkZXItb3ItYGNhbkVkaXQocGFyZW50KWAgKGRlbGV0ZSksIGFza2VkXG4gKiBvZiB0aGUgc2hhcmluZyBzZXJ2aWNlLCBhbmQgb24gMTcuNy4wIHRoYXQgc2VydmljZSBhbnN3ZXJzIGB0cnVlYCBmb3IgRVZFUllcbiAqIGBjb250cm9sbGVkX2J5X3BhcmVudGAgb2JqZWN0OiBpdCByZWFkcyB0aGF0IG1vZGVsIGFzIGBwdWJsaWNgIGFuZCBuZXZlciBhc2tzXG4gKiB0aGUgbWFzdGVyLiBUaHJlZSBvZiB0aGUgc2l4IGZpbGVzLWVuYWJsZWQgb2JqZWN0cyBhcmUgc3VjaCBjaGlsZHJlblxuICogKGBjcm1fY29udGFjdGAsIGBjcm1fcXVvdGVgLCBgY3JtX2NvbnRyYWN0YCkuIE1lYXN1cmVkIG9uIHRoZSBzYW1lIGJveCB3aXRoXG4gKiB0aGUgd3JpdGUgYml0cyBncmFudGVkOiBgbmEucmVwYCBhdHRhY2hlZCBhIGZpbGUgdG8gYSBxdW90ZSB0aGV5IGdldCA0MDQgb25cbiAqICgyMDEpLCBhbmQgb24gYSBjb250cmFjdCB3aG9zZSBvd24gUEFUQ0ggYW5zd2VycyB0aGVtIDQwMyB0aGV5IGF0dGFjaGVkIGFcbiAqIGZpbGUgKDIwMSkgYW5kIGRlbGV0ZWQgdGhlIGFkbWluJ3MgZXhlY3V0ZWQtY29udHJhY3QgZmlsZSAoMjAwKSwgd2hpbGUgYW5cbiAqIGF0dGFjaCB0byBhIHByaXZhdGUgYWNjb3VudCB0aGV5IGNhbm5vdCByZWFkIGFuc3dlcmVkIDQwM1xuICogYEFUVEFDSE1FTlRfUEFSRU5UX0FDQ0VTU2AuIFNvIHRoZSB3cml0ZSBiaXRzIHdvdWxkIGxldCBldmVyeSBwZXJzb25hIHBsYW50XG4gKiBmaWxlcyBvbiwgYW5kIGRlbGV0ZSBvdGhlcnMnIGZpbGVzIGZyb20sIHF1b3RlcywgY29udHJhY3RzIGFuZCBjb250YWN0c1xuICogdGhleSBjYW5ub3QgZWRpdC4gVGhhdCBpcyBhIHBsYXRmb3JtIGRlZmVjdCwgcmVwb3J0ZWQgdXBzdHJlYW1cbiAqIGZyb20gIzIwMjk7IHVudGlsIGl0cyBmaXggaXMgaW4gdGhlIHBpbm5lZCB2ZXJzaW9uLCBvbmx5IGFuIGFkbWluaXN0cmF0b3JcbiAqIHVwbG9hZHMsIGFuZCB0aGUgd3JpdGUgYml0cyBqb2luIGBhbGxvd1JlYWRgIGhlcmUgd2hlbiBpdCBsYW5kcyAoQUdFTlRTLm1kXG4gKiBcdTAwQTcyOiB3YWl0LCBkbyBub3Qgcm91dGUgYXJvdW5kIGl0KS5cbiAqXG4gKiBMZWFkcyBhcmUgZGVsaWJlcmF0ZWx5IGV4Y2x1ZGVkIFx1MjAxNCBhdHRhY2htZW50cyBvbiB1bnF1YWxpZmllZCBsZWFkcyBpbnZpdGVcbiAqIGp1bmsuIFJldmlzaXQgb24gZGVtYW5kLlxuICpcbiAqICoqYGVuYWJsZS5mZWVkc2AgXHUyMDE0IHJlY29yZCBjb21tZW50cyAoYHN5c19jb21tZW50YCkuIE9wdC1PVVQsIHNwZWMgZGVmYXVsdFxuICogYHRydWVgLioqIEJvdGggZW5mb3JjZW1lbnQgcG9pbnRzIGdhdGUgb24gYW4gZXhwbGljaXQgYGZhbHNlYFxuICogKGBlbmZvcmNlRmVlZHNDYXBhYmlsaXR5YCB0aHJvd3MgYEZFRURTX0RJU0FCTEVEYCBvbmx5IGZvciBgZmVlZHMgPT09IGZhbHNlYDtcbiAqIHRoZSBjb25zb2xlIHJlbmRlcnMgdGhlIGZlZWQgdW5sZXNzIGBlbmFibGU/LmZlZWRzID09PSBmYWxzZWApLCBzbyBldmVyeVxuICogSG90Q1JNIG9iamVjdCBhbHJlYWR5IGhhcyBjb21tZW50cyBlbmFibGVkIGFuZCBhdXRob3JpbmcgYGZlZWRzOiB0cnVlYCB3b3VsZFxuICogcmVzdGF0ZSBhIGRlZmF1bHQgcmF0aGVyIHRoYW4gY2hhbmdlIGJlaGF2aW91ci4gRG8gbm90IGFkZCBpdDogYW4gaW5lcnRcbiAqIHJlc3RhdGVtZW50IGlzIHRoZSBraW5kIG9mIG1ldGFkYXRhIHRoYXQgbGF0ZXIgcmVhZHMgYXMgbG9hZC1iZWFyaW5nLlxuICogSWYgY29tbWVudHMgZXZlciBuZWVkIHRvIGJlIHN3aXRjaGVkIG9mZiBmb3IgYW4gb2JqZWN0LCBhdXRob3IgYGZhbHNlYC5cbiAqIGB0ZXN0L2NvbGxhYm9yYXRpb24tY2FwYWJpbGl0aWVzLnRlc3QudHNgIHBpbnMgYm90aCBoYWx2ZXMgb2YgdGhpcyBydWxlLlxuICpcbiAqIFZlcmlmaWVkIGluIGEgbGl2ZSBjb25zb2xlICgjNjAyKTogdGhlIERpc2N1c3Npb24gcGFuZWwgcmVuZGVycyBvbiB0aGVcbiAqIG9wcG9ydHVuaXR5IGFuZCBhY2NvdW50IHJlY29yZHMsIGEgcG9zdGVkIGNvbW1lbnQgcm91bmQtdHJpcHNcbiAqIChgUE9TVCAvYXBpL3YxL2RhdGEvc3lzX2NvbW1lbnRgIFx1MjE5MiAyMDEpIGFuZCBzdXJ2aXZlcyBhIHJlbG9hZC5cbiAqXG4gKiBMaWtlIGBlbmFibGUuZmlsZXNgLCB0aGUgZmxhZyBvcGVucyB0aGUgc3VyZmFjZSBhbmQgZ3JhbnRzIG5vIGFjY2Vzcy4gVGhlXG4gKiBEaXNjdXNzaW9uIHBhbmVsIHJlYWRzIHR3byBwbGF0Zm9ybSBvYmplY3RzLCBgc3lzX2NvbW1lbnRgICh0aGUgY29tbWVudHMpXG4gKiBhbmQgYHN5c19hY3Rpdml0eWAgKHRoZSByZWNvcmQncyBhY3Rpdml0eSB0aW1lbGluZSksIGFuZCB0aGUgbWVtYmVyIGJhc2VsaW5lXG4gKiBuYW1lcyBuZWl0aGVyLCBzbyB0aHJvdWdoICMyMDI5IGV2ZXJ5IHBlcnNvbmEgYnV0IHRoZSBwbGF0Zm9ybSBhZG1pbiBnb3RcbiAqIFwiWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3IGNvbW1lbnRzIG9uIHRoaXMgcmVjb3JkXCIgYW5kIHRoZSBzYW1lIGZvclxuICogaXRzIGFjdGl2aXR5ICg0MDMgYFBFUk1JU1NJT05fREVOSUVEYCkuIFNvIGV2ZXJ5IHNldCB0aGF0IGdyYW50c1xuICogYHN5c19hdHRhY2htZW50YCBhbHNvIGdyYW50cyBgc3lzX2NvbW1lbnRgIHJlYWQsIGNyZWF0ZSBhbmQgZWRpdCBhbmRcbiAqIGBzeXNfYWN0aXZpdHlgIHJlYWQsIGFuZCBgZ3Vlc3RfcG9ydGFsYCBncmFudHMgbmVpdGhlci5cbiAqXG4gKiBXSElDSCB0aHJlYWRzIHRob3NlIGdyYW50cyByZWFjaCBpcyB0aGUgcGxhdGZvcm0ncywgYW5kIGl0IGZvbGxvd3MgdGhlXG4gKiBwYXJlbnQgcmVjb3JkICh0aGUgcGxhdGZvcm0ncyBvYmplY3RzdGFjay1haS9vYmplY3RzdGFjayM0NjMwIGdhdGVzKTogYVxuICogYHBsdWdpbi1hdWRpdGAgbWlkZGxld2FyZSBuYXJyb3dzIGV2ZXJ5IGBzeXNfY29tbWVudGAgYW5kIGBzeXNfYWN0aXZpdHlgIHJlYWRcbiAqIHRvIHJvd3Mgd2hvc2UgcGFyZW50IHRoZSBjYWxsZXIgY2FuIHJlYWQsIGEgcG9zdCB0byBhIHRocmVhZCB3aG9zZSByZWNvcmQgdGhlXG4gKiBjYWxsZXIgY2Fubm90IHJlYWQgaXMgcmVmdXNlZCB3aXRoIDQwMyBgUkVDT1JEX05PVF9BQ0NFU1NJQkxFYCwgYW5kIG9ubHkgYVxuICogY29tbWVudCdzIGF1dGhvciBtYXkgZWRpdCBpdC4gTWVhc3VyZWQgYXMgYG5hLnJlcGAgb24gYSBmcmVzaCBgcG5wbSBkZXZgIGJveFxuICogKCMyMDI5KTogdGhlIGNvbW1lbnRzIGFuZCBhY3Rpdml0eSBvZiB0aGUgYWNjb3VudHMsIHF1b3RlcyBhbmQgY29udHJhY3RzIHRoZXlcbiAqIGNhbiByZWFkIGFyZSBsaXN0ZWQsIHRob3NlIG9mIHJlY29yZHMgdGhleSBjYW5ub3QgcmVhZCBhcmUgbm90ICg0MDQgYnkgaWQpLFxuICogYW5kIGEgcG9zdCB0byBvbmUgb2YgdGhvc2UgaXMgcmVmdXNlZC4gYHRlc3QvcmVjb3JkLWNvbW1lbnRzLWFjY2Vzcy50ZXN0LnRzYFxuICogcGlucyBpdC5cbiAqXG4gKiAqKkRlbGV0aW5nIGEgY29tbWVudCBpcyBOT1QgZ3JhbnRlZCwgb24gcHVycG9zZSAoIzIwMjkpLioqIEl0cyBnYXRlIGlzXG4gKiBhdXRob3Itb3ItYGNhbkVkaXQocGFyZW50KWAsIHRoZSBzYW1lIHNoYXJpbmctc2VydmljZSBjYWxsIGFzIHRoZSBhdHRhY2htZW50XG4gKiBnYXRlIGFib3ZlLCB3aXRoIHRoZSBzYW1lIDE3LjcuMCBhbnN3ZXIgb2YgYHRydWVgIGZvciBldmVyeVxuICogYGNvbnRyb2xsZWRfYnlfcGFyZW50YCBwYXJlbnQuIE1lYXN1cmVkIHdpdGggdGhlIGRlbGV0ZSBiaXQgZ3JhbnRlZDogYG5hLnJlcGBcbiAqIGRlbGV0ZWQgdGhlIGFkbWluJ3MgY29tbWVudCBvbiBhIGNvbnRyYWN0IHdob3NlIG93biBQQVRDSCBhbnN3ZXJzIHRoZW0gNDAzLlxuICogUmVwb3J0ZWQgdXBzdHJlYW0gZnJvbSAjMjAyOTsgdGhlIGRlbGV0ZSBiaXQgam9pbnMgdGhlIGdyYW50IHdoZW4gdGhlIGZpeCBpc1xuICogaW4gdGhlIHBpbm5lZCB2ZXJzaW9uIChBR0VOVFMubWQgXHUwMEE3MikuXG4gKi9cblxuZXhwb3J0IHsgQWNjb3VudCB9IGZyb20gJy4vYWNjb3VudC5vYmplY3QnO1xuZXhwb3J0IHsgQ29udGFjdCB9IGZyb20gJy4vY29udGFjdC5vYmplY3QnO1xuZXhwb3J0IHsgRXZlbnQgfSBmcm9tICcuL2V2ZW50Lm9iamVjdCc7XG5leHBvcnQgeyBFdmVudEF0dGVuZGVlIH0gZnJvbSAnLi9ldmVudF9hdHRlbmRlZS5vYmplY3QnO1xuZXhwb3J0IHsgRm9yZWNhc3QgfSBmcm9tICcuL2ZvcmVjYXN0Lm9iamVjdCc7XG5leHBvcnQgeyBMZWFkIH0gZnJvbSAnLi9sZWFkLm9iamVjdCc7XG5leHBvcnQgeyBPcHBvcnR1bml0eSB9IGZyb20gJy4vb3Bwb3J0dW5pdHkub2JqZWN0JztcbmV4cG9ydCB7IFRhc2sgfSBmcm9tICcuL3Rhc2sub2JqZWN0JztcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvYWNjb3VudC5vYmplY3QudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2FjY291bnQub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBPYmplY3RTY2hlbWEsIEZpZWxkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBGIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgSU5EVVNUUllfT1BUSU9OUyB9IGZyb20gJy4vX3BpY2tsaXN0cyc7XG5pbXBvcnQgeyBURVJSSVRPUllfT1BUSU9OUyB9IGZyb20gJy4vX3RlcnJpdG9yeSc7XG5cbmV4cG9ydCBjb25zdCBBY2NvdW50ID0gT2JqZWN0U2NoZW1hLmNyZWF0ZSh7XG4gIG5hbWU6ICdjcm1fYWNjb3VudCcsXG4gIGxhYmVsOiAnQWNjb3VudCcsXG4gIHBsdXJhbExhYmVsOiAnQWNjb3VudHMnLFxuICBpY29uOiAnYnVpbGRpbmcnLFxuICBkZXNjcmlwdGlvbjogJ0NvbXBhbmllcyBhbmQgb3JnYW5pemF0aW9ucyBkb2luZyBidXNpbmVzcyB3aXRoIHVzJyxcblxuICAvLyBBRFItMDA5MCBEMS9ENzogT1dEIGlzIGFuIGF1dGhvcmVkIGRlY2lzaW9uLiBPd25lciArIHNoYXJpbmcgcnVsZXMgKHRlYW0vdGVycml0b3J5IGdyYW50cyBiZWxvdykuXG4gIHNoYXJpbmdNb2RlbDogJ3ByaXZhdGUnLFxuICAvLyBBRFItMDA3OTogcmVuZGVyLW9ubHkgYHRpdGxlRm9ybWF0YCByZXRpcmVkIGluIGZhdm9yIG9mIGBuYW1lRmllbGRgLFxuICAvLyB3aGljaCBuYW1lcyBhIHJlYWwgZmllbGQuIFRoZSBmb3JtZXIgdGVtcGxhdGUgY29tcG9zZWQgdHdvIGxvY2FsIGZpZWxkcywgc29cbiAgLy8gYSBgZGlzcGxheV90aXRsZWAgZm9ybXVsYSBmaWVsZCByZXByb2R1Y2VzIGl0IGZvciB0aGUgcmVjb3JkIHRpdGxlLlxuICBuYW1lRmllbGQ6ICdkaXNwbGF5X3RpdGxlJyxcbiAgLy8gRXhwbGljaXQgc2VhcmNoIHRhcmdldHMgKEFEUi0wMDYxKS4gUkVRVUlSRUQgYmVjYXVzZSBuYW1lRmllbGQgaXMgYVxuICAvLyBGT1JNVUxBIChkaXNwbGF5X3RpdGxlL2Z1bGxfbmFtZSk6IHdpdGhvdXQgdGhpcywgJHNlYXJjaCBhdXRvLWRlZmF1bHRzIHRvXG4gIC8vIHRoZSBmb3JtdWxhIGZpZWxkLCB3aGljaCBpc24ndCBhIHJlYWwgY29sdW1uLCBzbyB0aGUgbG9va3VwIHBpY2tlciArIGdsb2JhbFxuICAvLyBzZWFyY2ggc2lsZW50bHkgcmV0dXJuIHplcm8uIFRoZXNlIGFyZSByZWFsLCBpbmRleGVkIGNvbHVtbnMuXG4gIHNlYXJjaGFibGVGaWVsZHM6IFsnbmFtZScsICdhY2NvdW50X251bWJlcicsICdyZWdpc3RyYXRpb25fbnVtYmVyJ10sXG4gIGhpZ2hsaWdodEZpZWxkczogWydhY2NvdW50X251bWJlcicsICduYW1lJywgJ3R5cGUnLCAnb3duZXJfaWQnXSxcbiAgLy8gVGhlIHJlY29yZCdzIHBpY3R1cmUgKCMxMTk5KTogdGhlIHJlY29yZCBjaHJvbWUgZHJhd3MgdGhlIGxvZ28gYmVzaWRlIHRoZVxuICAvLyB0aXRsZSBpbiBldmVyeSBhY2NvdW50IHBhZ2UgaGVhZGVyLiBObyBsb2dvLCBubyBwaWN0dXJlOiB0aGUgcGxhdGZvcm1cbiAgLy8gZHJhd3Mgbm8gcGxhY2Vob2xkZXIgb3IgaW5pdGlhbHMgaW4gaXRzIHBsYWNlLlxuICBpbWFnZUZpZWxkOiAnbG9nbycsXG5cbiAgLy8gRmllbGQgZ3JvdXBzIG9yZ2FuaXplIHRoZSBmb3JtIGxheW91dC4gQXJyYXkgb3JkZXIgPT0gZGlzcGxheSBvcmRlci5cbiAgLy8gRWFjaCBmaWVsZCBiZWxvdyBvcHRzIGluIHZpYSBgZ3JvdXA6ICc8a2V5PidgLlxuICBmaWVsZEdyb3VwczogW1xuICAgIHsga2V5OiAnYmFzaWMnLCAgICAgICAgbGFiZWw6ICdCYXNpYyBJbmZvcm1hdGlvbicsICBpY29uOiAnYnVpbGRpbmcnIH0sXG4gICAgeyBrZXk6ICdmaW5hbmNpYWxzJywgICBsYWJlbDogJ0ZpbmFuY2lhbHMnLCAgICAgICAgIGljb246ICdkb2xsYXItc2lnbicgfSxcbiAgICAvLyBSRVEtMDAwMyBhY2NlcHRhbmNlIDM6IHRoZSBidXNpbmVzcy1wcm9maWxlIGZpZWxkcyByZW5kZXIgYXMgdGhlaXIgb3duXG4gICAgLy8gZ3JvdXAgd2l0aCBOTyBgcmVjb3JkOmRldGFpbHNgIHNlY3Rpb24gYXV0aG9yZWQgYW55d2hlcmUgXHUyMDE0IHRoZSBkZXJpdmVkXG4gICAgLy8gbGF5b3V0IGxhZGRlcidzIHJ1bmcgMSAoQUdFTlRTLm1kOiBlc2NhcGUgaGF0Y2hlcyBhcmUgZm9yIGV4dHJlbWUgY2FzZXMpLlxuICAgIHsga2V5OiAnYnVzaW5lc3NfcHJvZmlsZScsIGxhYmVsOiAnQnVzaW5lc3MgUHJvZmlsZScsIGljb246ICdicmllZmNhc2UnIH0sXG4gICAgeyBrZXk6ICdjb250YWN0X2luZm8nLCBsYWJlbDogJ0NvbnRhY3QgSW5mb3JtYXRpb24nLCBpY29uOiAncGhvbmUnIH0sXG4gICAgeyBrZXk6ICdvd25lcnNoaXAnLCAgICBsYWJlbDogJ093bmVyc2hpcCAmIFN0YXR1cycsIGljb246ICd1c2VycycgfSxcbiAgICB7IGtleTogJ2JyYW5kaW5nJywgICAgIGxhYmVsOiAnQnJhbmRpbmcnLCAgICAgICAgICAgaWNvbjogJ3BhbGV0dGUnLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ3N5c3RlbScsICAgICAgIGxhYmVsOiAnU3lzdGVtJywgICAgICAgICAgICAgaWNvbjogJ3NldHRpbmdzJywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIE93bmVyc2hpcCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIGBvd25lcl9pZGAgaXMgdGhlIFBMQVRGT1JNIG93bmVyc2hpcCBhbmNob3IsIG5vdCBhbiBhcHAgaW52ZW50aW9uOiB0aGVcbiAgICAvLyByZWdpc3RyeSBpbmplY3RzIGV4YWN0bHkgdGhpcyBjb2x1bW4gaW50byBldmVyeSB1c2VyLW93bmVkIG9iamVjdFxuICAgIC8vIChgYXBwbHlTeXN0ZW1GaWVsZHNgKSwgYW5kIGl0IGlzIHRoZSBvbmUgT1dELCBzaGFyaW5nIHJ1bGVzLCBvd25lci1zY29wZVxuICAgIC8vIHdpZGVuaW5nIGFuZCB0aGUgYGlzX3ByaXZhdGVgIHJvdyBmaWx0ZXIgYWxsIHJlYWQuIFx1MjZENCBOZXZlciBhdXRob3IgYVxuICAgIC8vIFNFQ09ORCBgb3duZXJgIGxvb2t1cCBiZXNpZGUgaXQgXHUyMDE0IHJlYXNzaWduaW5nIHRoYXQgbW92ZXMgdGhlIHJlY29yZCBpblxuICAgIC8vIGV2ZXJ5IGxpc3QgYW5kIHJlcG9ydCBhbmQgbW92ZXMgbm8gYWNjZXNzIGF0IGFsbC5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBEZWNsYXJlZCByYXRoZXIgdGhhbiBsZWZ0IHRvIGluamVjdGlvbiwgd2hpY2ggdGhlIHBsYXRmb3JtIHN1cHBvcnRzXG4gICAgLy8gZXhwbGljaXRseSAoXCJhdXRob3ItZGVjbGFyZWQgZmllbGRzIHdpdGggdGhlIHNhbWUgbmFtZSBhbHdheXMgd2luIG92ZXJcbiAgICAvLyBpbmplY3Rpb24sIG5vIG92ZXJ3cml0ZVwiKS4gVGhyZWUgdGhpbmdzIG9ubHkgYSBkZWNsYXJhdGlvbiBidXlzOlxuICAgIC8vICAgXHUyMDIyIGBvcyB2YWxpZGF0ZWAgcmVzb2x2ZXMgaXQuIEFuIGluamVjdGVkIGNvbHVtbiBpcyBpbnZpc2libGUgdG8gZXZlcnlcbiAgICAvLyAgICAgYXV0aG9yLXRpbWUgcnVsZSwgc28gYGhpZ2hsaWdodEZpZWxkczogWydvd25lcl9pZCddYCBpcyByZXBvcnRlZCBhc1xuICAgIC8vICAgICBcIm5vdCBhIGZpZWxkIG9uIHRoaXMgb2JqZWN0IFx1MjAxNCBzaWxlbnRseSBza2lwcGVkIGJ5IGV2ZXJ5IGNvbnN1bWVyXCIsXG4gICAgLy8gICAgIGFuZCBhIENFTCBwcmVkaWNhdGUgcmVhZGluZyBgcmVjb3JkLm93bmVyX2lkYCBmYWlscyBvdXRyaWdodC5cbiAgICAvLyAgIFx1MjAyMiB0aGUgcGVyLW9iamVjdCBsYWJlbCBhbmQgYGdyb3VwYCBzdXJ2aXZlIChhbiBpbmplY3RlZCBmaWVsZCBjYXJyaWVzXG4gICAgLy8gICAgIHRoZSBnZW5lcmljIGxhYmVsIFwiT3duZXJcIiBhbmQgbm8gZ3JvdXAgYXQgYWxsKTtcbiAgICAvLyAgIFx1MjAyMiBgdHJhY2tIaXN0b3J5YCBzdXJ2aXZlcywgc28gYSB0cmFuc2ZlciBzdGlsbCByZW5kZXJzIG9uIHRoZSByZWNvcmRcbiAgICAvLyAgICAgdGltZWxpbmUgaW5zdGVhZCBvZiBvbmx5IGluIHRoZSBjb21wbGlhbmNlIGF1ZGl0IGxvZy5cbiAgICAvLyBgc3lzdGVtOiB0cnVlYCBrZWVwcyB0aGUgaW5qZWN0ZWQgbWFya2VyIHRoZSBwbGF0Zm9ybSdzIG93biB0b29saW5nXG4gICAgLy8gcmVhZHMgXHUyMDE0IG5vdGFibHkgdGhlIGNsb25lIHBhdGgsIHdoaWNoIHN0cmlwcyBzeXN0ZW0gY29sdW1ucyBzbyBhIGNvcHkgaXNcbiAgICAvLyBzdGFtcGVkIHRvIHRoZSBjbG9uZXIgcmF0aGVyIHRoYW4gaW5oZXJpdGluZyB0aGUgc291cmNlJ3Mgb3duZXIuXG4gICAgLy9cbiAgICAvLyBObyBgZGVmYXVsdFZhbHVlYDogdGhlIHNlY3VyaXR5IG1pZGRsZXdhcmUgc3RhbXBzIGBvd25lcl9pZGAgdG8gdGhlXG4gICAgLy8gYWN0aW5nIHVzZXIgb24gYW55IGluc2VydCB0aGF0IGxlYXZlcyBpdCBlbXB0eSwgYW5kIGRlbmllcyBvbmUgdGhhdCBuYW1lc1xuICAgIC8vIGFub3RoZXIgdXNlciB3aXRob3V0IGBhbGxvd1RyYW5zZmVyYCAoIzMwMDQpLiBUaGF0IGlzIHN0cm9uZ2VyIHRoYW4gYVxuICAgIC8vIGZpZWxkIGRlZmF1bHQsIHdoaWNoIGV2YWx1YXRlcyB0byBub3RoaW5nIG9uIGV2ZXJ5IHVzZXItbGVzcyB3cml0ZS5cbiAgICBvd25lcl9pZDogRmllbGQubG9va3VwKCdzeXNfdXNlcicsIHtcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBPd25lcicsXG4gICAgICBncm91cDogJ293bmVyc2hpcCcsXG4gICAgICBzeXN0ZW06IHRydWUsXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBBdXRvTnVtYmVyIGZpZWxkIC0gVW5pcXVlIGFjY291bnQgaWRlbnRpZmllclxuICAgIGFjY291bnRfbnVtYmVyOiBGaWVsZC5hdXRvbnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBOdW1iZXInLFxuICAgICAgZm9ybWF0OiAnQUNDLXswMDAwMDB9JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuXG4gICAgLy8gQmFzaWMgSW5mb3JtYXRpb25cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBgdW5pcXVlOiB0cnVlYCBpcyBkZWNsYXJlZCBIRVJFLCBvbiB0aGUgZmllbGQsIGFuZCBkZWxpYmVyYXRlbHkgTk9UIGFzXG4gICAgLy8gYSBgeyBmaWVsZHM6IFsnbmFtZSddLCB1bmlxdWU6IHRydWUgfWAgZW50cnkgaW4gYGluZGV4ZXNbXWAgYmVsb3cuIFRoZVxuICAgIC8vIGZpZWxkLWxldmVsIGZvcm0gaXMgdGVuYW50LXNjb3BlZCBcdTIwMTQgaXQgbWF0ZXJpYWxpemVzIGFzXG4gICAgLy8gYChvcmdhbml6YXRpb25faWQsIG5hbWUpYCwgdW5pcXVlIFdJVEhJTiBhbiBvcmdhbml6YXRpb24gXHUyMDE0IHdoaWxlIGFcbiAgICAvLyBkZWNsYXJlZCBpbmRleCBpcyB0YWtlbiB2ZXJiYXRpbSwgaS5lLiBwbGF0Zm9ybS13aWRlLiBUaGUgdGFibGUgZm9ybVxuICAgIC8vIG1lYW5zIHRoZSBTRUNPTkQgb3JnYW5pemF0aW9uIHRvIGNyZWF0ZSBhbiBcIkFjbWUgQ29ycFwiIGlzIHJlamVjdGVkIGJ5IHRoZVxuICAgIC8vIGRhdGFiYXNlLCBhbmQgYWNjb3VudCBuYW1lIGlzIGFsc28gdGhlIHNlZWQgZGF0YSdzIGV4dGVybmFsLWlkIC8gdXBzZXJ0XG4gICAgLy8ga2V5IChgc3JjL3NhbGVzL2RhdGEvc2FsZXMuc2VlZC50c2ApLCBzbyBpdCBiaXRlcyB0aGUgZmlyc3QgbXVsdGktdGVuYW50XG4gICAgLy8gaW5zdGFsbC4gVGhlIGNvbXBvc2l0ZSBhbHNvIGluZGV4ZXMgdGhlIGNvbHVtbiwgc28gbm8gc2VwYXJhdGVcbiAgICAvLyBgeyBmaWVsZHM6IFsnbmFtZSddIH1gIGVudHJ5IGlzIG5lZWRlZCBmb3IgdGhlIGBzZWFyY2hhYmxlRmllbGRzYCAvXG4gICAgLy8gc2VlZC11cHNlcnQgcmVhZCBwYXRocy5cbiAgICBuYW1lOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBOYW1lJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgbWF4TGVuZ3RoOiAyNTUsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIENhc2UtIGFuZCB3aGl0ZXNwYWNlLWZvbGRlZCBjb3B5IG9mIGBuYW1lYCBcdTIwMTQgdGhlIGtleSBsZWFkIGNvbnZlcnNpb25cbiAgICAgKiBtYXRjaGVzIGFjY291bnRzIG9uLlxuICAgICAqXG4gICAgICogIyMjIFdoeSBhIHN0b3JlZCBjb2x1bW4sIGFuZCBub3QgYW55IG9mIHRoZSBjaGVhcGVyIHNoYXBlc1xuICAgICAqXG4gICAgICogXHUyNkEwXHVGRTBGIFRocmVlIGNoZWFwZXIgZml4ZXMgYXJlIGFsbCBkZWFkIGVuZHMsIGFuZCBlYWNoIGlzIGEgbGl2ZSBwbGF0Zm9ybVxuICAgICAqIGNvbnN0cmFpbnQuIGB0ZXN0L2FjY291bnQtbmFtZS1ub3JtYWxpemVkLW1hdGNoLnRlc3QudHNgIHJlLW1lYXN1cmVzIGV2ZXJ5XG4gICAgICogb25lIHNvIHRoaXMgbm90ZSBjYW5ub3QgcXVpZXRseSBnbyBzdGFsZTpcbiAgICAgKlxuICAgICAqIC0gKipBIGZsb3cgY2Fubm90IG5vcm1hbGl6ZS4qKiBgc2VydmljZS1hdXRvbWF0aW9uYCdzIGByZXNvbHZlVG9rZW5gXG4gICAgICogICB1bmRlcnN0YW5kcyBleGFjdGx5IG9uZSBmdW5jdGlvbiBmb3JtLCBgL14oTk9XfFRPREFZKVxccypcXChcXHMqXFwpXHUyMDI2L2AuXG4gICAgICogICBge0xPV0VSKHgpfWAsIGB7VFJJTSh4KX1gIGFuZCBge3gudG9Mb3dlckNhc2UoKX1gIGFsbCByZXNvbHZlIHRvXG4gICAgICogICBgdW5kZWZpbmVkYCAoZXZlcnkgYmFyZSBpZGVudGlmaWVyIGlzIHN1YnN0aXR1dGVkIGJlZm9yZSB0aGUgZXhwcmVzc2lvblxuICAgICAqICAgaXMgZXZhbHVhdGVkLCBzbyBubyBzdHJpbmcgbWV0aG9kIGlzIHJlYWNoYWJsZSksIGFuZCBhbiB1bndyYXBwZWRcbiAgICAgKiAgIGBMT1dFUih7eH0pYCBpbnRlcnBvbGF0ZXMgbGl0ZXJhbGx5IHRvIGBcIkxPV0VSKEFjbWUgQ29ycClcImAuXG4gICAgICogLSAqKkEgZm9ybXVsYSBmaWVsZCBjYW5ub3QgYmUgdGhlIG1hdGNoIGtleS4qKiBgZHJpdmVyLXNxbGAnc1xuICAgICAqICAgYGZpZWxkSGFzQ29sdW1uYCByZXR1cm5zIGZhbHNlIGZvciBgdHlwZTogJ2Zvcm11bGEnYCwgc28gYSBjb21wdXRlZFxuICAgICAqICAgdmFsdWUgaGFzIG5vIHBoeXNpY2FsIGNvbHVtbiBhbmQgbm90aGluZyBjYW4gZmlsdGVyIG9uIGl0LlxuICAgICAqIC0gKipgJHJlZ2V4YCBpcyBub3QgYW4gYW5zd2VyLioqIE9uIGBkcml2ZXItc3FsYCBpdCBkb2VzIG5vdCBydW4gYXMgYVxuICAgICAqICAgcmVnZXggYXQgYWxsOiBpdCBjb21waWxlcyB0byBgTElLRSAnJXZhbHVlJSdgLCBhIFNVQlNUUklORyBtYXRjaCwgc29cbiAgICAgKiAgIGBcIkFjbWUgQ29ycFwiYCBhbHNvIG1hdGNoZXMgYFwiTm90IEFjbWUgQ29ycCBMdGRcImAuIEl0IGNhbm5vdCBjb2xsYXBzZVxuICAgICAqICAgaW50ZXJuYWwgd2hpdGVzcGFjZSwgdGhlIGxlYWRpbmcgd2lsZGNhcmQgZGVmZWF0cyB0aGUgaW5kZXgsIGFuZCBvbiB0aGVcbiAgICAgKiAgIGluLW1lbW9yeSBkcml2ZXIgaXQgZG9lcyBjb21waWxlIHVzZXItY29udHJvbGxlZCB0ZXh0IGludG8gYSBgUmVnRXhwYC5cbiAgICAgKlxuICAgICAqIFNvIHRoZSBjYW5vbmljYWwgZm9ybSBpcyBlc3RhYmxpc2hlZCBieSB0aGUgUFJPRFVDRVIgYXQgd3JpdGUgdGltZSBcdTIwMTQgdGhlXG4gICAgICogc2FtZSBkb2N0cmluZSBgY3JtX2xlYWQuZW1haWxgIC8gYGNybV9jb250YWN0LmVtYWlsYCBmb2xsb3cgXHUyMDE0IGFuZCB0aGVcbiAgICAgKiByZWFkZXIgZG9lcyBhIHBsYWluLCBpbmRleGVkIGVxdWFsaXR5IG1hdGNoLiBUaGUgb3RoZXIgc2lkZSBvZiB0aGF0XG4gICAgICogY29tcGFyaXNvbiBpcyBgY3JtX2xlYWQuY29tcGFueV9ub3JtYWxpemVkYCwgd2hpY2ggZXhpc3RzIGZvciB0aGUgc2FtZVxuICAgICAqIHJlYXNvbjogYSBmbG93IGNhbiBjb21wYXJlIHR3byBzdG9yZWQgY29sdW1ucywgaXQgY2Fubm90IGNvbXB1dGUgZWl0aGVyLlxuICAgICAqXG4gICAgICogIyMjIFdoYXQgaXQgaG9sZHNcbiAgICAgKlxuICAgICAqIGBuYW1lYCwgdHJpbW1lZCwgbG93ZXItY2FzZWQsIHdpdGggcnVucyBvZiBpbnRlcm5hbCB3aGl0ZXNwYWNlIGNvbGxhcHNlZFxuICAgICAqIHRvIG9uZSBzcGFjZS4gTm90aGluZyBlbHNlIFx1MjAxNCBub3JtYWxpemUtdGhlbi1FWEFDVC4gRnV6enkgbWF0Y2hpbmdcbiAgICAgKiAocHVuY3R1YXRpb24gZm9sZGluZywgbGVnYWwtc3VmZml4IHN0cmlwcGluZywgZWRpdCBkaXN0YW5jZSkgaXNcbiAgICAgKiBkZWxpYmVyYXRlbHkgb3V0IG9mIHNjb3BlOyBpdCB0dXJucyBhIGxvb2t1cCBpbnRvIGEgcmFua2luZyBwcm9ibGVtIGFuZFxuICAgICAqIG5lZWRzIGEgaHVtYW4gcmV2aWV3IGFmZm9yZGFuY2UgdGhpcyBhcHAgZG9lcyBub3QgaGF2ZS5cbiAgICAgKlxuICAgICAqIERlcml2ZWQsIG5ldmVyIGF1dGhvcmVkOiBgYWNjb3VudC5ob29rLnRzYCByZWNvbXB1dGVzIGl0IG9uIGV2ZXJ5IHdyaXRlXG4gICAgICogdGhhdCBjYXJyaWVzIGBuYW1lYCwgYW5kIGxlYXZlcyBpdCBhbG9uZSBvdGhlcndpc2UuIGByZWFkb25seWAga2VlcHNcbiAgICAgKiB1c2VyL0FQSSB3cml0ZXMgb2ZmIGl0IChJTlNFUlQgaXMgZXhlbXB0IGZyb20gdGhlIHN0cmlwIGFuZCBVUERBVEUgc3RyaXBzXG4gICAgICogb25seSBDQUxMRVItc3VwcGxpZWQga2V5cywgc28gdGhlIGhvb2sncyBvd24gd3JpdGUgYWx3YXlzIHN1cnZpdmVzKTtcbiAgICAgKiBgaGlkZGVuYCBrZWVwcyBhIG1hY2hpbmUtb3duZWQgY29sdW1uIG91dCBvZiBmb3JtcyBhbmQgcGlja2VycyBcdTIwMTQgdGhlIHNhbWVcbiAgICAgKiBwYWlyaW5nIGBjcm1fZm9yZWNhc3Quc2VlZF9rZXlgIHVzZXMuXG4gICAgICovXG4gICAgbmFtZV9ub3JtYWxpemVkOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBOYW1lIChOb3JtYWxpemVkKScsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ01hdGNoIGtleSBmb3IgbGVhZCBjb252ZXJzaW9uOiBBY2NvdW50IE5hbWUgbG93ZXItY2FzZWQsIHRyaW1tZWQsIHdpdGggaW50ZXJuYWwgd2hpdGVzcGFjZSBjb2xsYXBzZWQuIE1haW50YWluZWQgYnkgdGhlIGFjY291bnRfcHJvdGVjdGlvbiBob29rIFx1MjAxNCBuZXZlciBlZGl0IGRpcmVjdGx5LicsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICAgIG1heExlbmd0aDogMjU1LFxuICAgICAgZ3JvdXA6ICdzeXN0ZW0nLFxuICAgIH0pLFxuXG4gICAgLy8gQURSLTAwNzkgcmVjb3JkIHRpdGxlICh3YXMgdGl0bGVGb3JtYXQgJ3thY2NvdW50X251bWJlcn0gLSB7bmFtZX0nKS5cbiAgICBkaXNwbGF5X3RpdGxlOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnRGlzcGxheSBUaXRsZScsXG4gICAgICBleHByZXNzaW9uOiBGYHJlY29yZC5hY2NvdW50X251bWJlciArIFwiIC0gXCIgKyByZWNvcmQubmFtZWAsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydHkncyByZWdpc3RlcmVkIGlkZW50aXR5IGluIGEgZ292ZXJubWVudCByZWdpc3RyeS5cbiAgICAgKlxuICAgICAqIFx1MjZENCBOT1QgbmFtZWQgYWZ0ZXIgb25lIGNvdW50cnkncyByZWdpc3RyeSwgYW5kIHRoYXQgaXMgdGhlIHdob2xlIGRlc2lnblxuICAgICAqIGNvbnN0cmFpbnQgKFJFUS0wMDAzICpEaXNwb3NpdGlvbiAmIHJhdGlvbmFsZSopLiBUaGUgcmVxdWlyZW1lbnQgYXJyaXZlZFxuICAgICAqIGFzIFx1NzkzRVx1NEYxQVx1NEZFMVx1NzUyOFx1NEVFM1x1NzgwMSBiZWNhdXNlIHRoZSBjdXN0b21lciByZWdpc3RlcnMgaW4gQ2hpbmE7IGEgSmFwYW5lc2UgaW5zdGFsbFxuICAgICAqIHdyaXRlcyBcdTZDRDVcdTRFQkFcdTc1NkFcdTUzRjcgaGVyZSwgYSBHZXJtYW4gb25lIGEgSGFuZGVsc3JlZ2lzdGVybnVtbWVyLCBhIFVTIG9uZSBhblxuICAgICAqIEVJTi4gQSBgdW5pZmllZF9zb2NpYWxfY3JlZGl0X2NvZGVgIGZpZWxkIHdvdWxkIGNhcnJ5IG9uZSBjb3VudHJ5J3NcbiAgICAgKiByZWdpc3RyeSBpbiBpdHMgTkFNRSwgd2hlcmUgbm8gaW5zdGFsbCBjYW4gcmVuYW1lIGl0IFx1MjAxNCBzbyB0aGUgY29yZSBmaWVsZFxuICAgICAqIGlzIGdlbmVyaWMgYW5kIHRoZSByZWdpc3RyeSBpdCBjYW1lIGZyb20gaXMgdGhlIGluc3RhbGwncyBvd24ga25vd2xlZGdlLlxuICAgICAqXG4gICAgICogXHUyNkEwXHVGRTBGIERpc3RpbmN0IGZyb20gYGFjY291bnRfbnVtYmVyYCBhYm92ZSwgd2hpY2ggaXMgT1VSIHNlcXVlbmNlXG4gICAgICogKGBGaWVsZC5hdXRvbnVtYmVyYCwgYEFDQy17MDAwMDAwfWApIGFuZCBhbHJlYWR5IHNwZW50IGFzIGhhbGYgdGhlIHJlY29yZFxuICAgICAqIHRpdGxlLiBUaGF0IGlzIGFuIGlkZW50aWZpZXIgd2UgaXNzdWU7IHRoaXMgaXMgb25lIHdlIHdlcmUgZ2l2ZW4sIGFuZFxuICAgICAqIGludm9pY2luZywgY3JlZGl0IGNoZWNrcyBhbmQgZW50aXR5IHJlc29sdXRpb24ga2V5IG9uIHRoZSBsYXR0ZXIuXG4gICAgICpcbiAgICAgKiBgc2VhcmNoYWJsZWAgKyB0aGUgYHNlYXJjaGFibGVGaWVsZHNgIGVudHJ5IGFib3ZlIGlzIFJFUS0wMDAzIGFjY2VwdGFuY2VcbiAgICAgKiAxIFx1MjAxNCB0aGUgdmFsdWUgaXMgZmluZGFibGUgZnJvbSBnbG9iYWwgc2VhcmNoIGFuZCB0aGUgbG9va3VwIHBpY2tlci4gSXQgaXNcbiAgICAgKiBpbmRleGVkIGJlbG93IGZvciB0aGF0IHJlYWQgcGF0aC5cbiAgICAgKlxuICAgICAqIFx1MjZENCBOT1QgYHVuaXF1ZTogdHJ1ZWAuIFJlZnVzaW5nIGEgc2F2ZSBiZWNhdXNlIHR3byByb3dzIGNhcnJ5IHRoZSBzYW1lXG4gICAgICogcmVnaXN0ZXJlZCBpZGVudGl0eSBpcyBhIGRhdGEtcXVhbGl0eSBQT0xJQ1ksIGFuZCB0aGlzIHJlcG8gaGFzIGFscmVhZHlcbiAgICAgKiBjaG9zZW4gdGhlIHNvZnQgc2hhcGUgZm9yIHRoYXQgcXVlc3Rpb24gb25jZSBcdTIwMTQgdGhlIGhhcmQgdW5pcXVlIG9uXG4gICAgICogYGNybV9sZWFkLmVtYWlsYCB3YXMgcmVtb3ZlZCBiZWNhdXNlIHJlZnVzaW5nIGEgcmVwZWF0IGlzIHdvcnNlIHRoYW5cbiAgICAgKiByZWNvcmRpbmcgaXQuIFRoZSBzYW1lIHJlYXNvbmluZyBgbmFtZV9ub3JtYWxpemVkYCByZWNvcmRzOiBhIG1hdGNoIGtleSxcbiAgICAgKiBub3QgYSBwb2xpY3kuIERlZHVwbGljYXRpb24gaXMgYSByZXZpZXcgYWZmb3JkYW5jZSB0aGlzIGFwcCBkb2VzIG5vdCBoYXZlLlxuICAgICAqL1xuICAgIHJlZ2lzdHJhdGlvbl9udW1iZXI6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdSZWdpc3RyYXRpb24gTnVtYmVyJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlRoZSBjb3VudGVycGFydHkncyByZWdpc3RlcmVkIGlkZW50aXR5IGFzIGlzc3VlZCBieSBpdHMgb3duIGdvdmVybm1lbnQgcmVnaXN0cnkgXHUyMDE0IHdoaWNoZXZlciByZWdpc3RyeSB0aGF0IGlzLiBOb3QgdGhlIEFjY291bnQgTnVtYmVyLCB3aGljaCB3ZSBpc3N1ZS5cIixcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBtYXhMZW5ndGg6IDY0LFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICAvKipcbiAgICAgKiBXaGF0IHRoaXMgYWNjb3VudCBtYXkgYmUgdXNlZCBmb3IgY29tbWVyY2lhbGx5IFx1MjAxNCB0aGUgY2F0ZWdvcnkgdGhhdCBHQVRFU1xuICAgICAqIGNhcGFiaWxpdHkgcmF0aGVyIHRoYW4gbWVyZWx5IGNsYXNzaWZ5aW5nIChSRVEtMDAwMywgdGhlIHJlY29yZCdzIG1vc3RcbiAgICAgKiB2YWx1YWJsZSBwcmltaXRpdmU6ICpzb21lIGNvdW50ZXJwYXJ0aWVzIGFyZSBwYXlhYmxlIGJ1dCBub3Qgc2VsbGFibGUqKS5cbiAgICAgKlxuICAgICAqICMjIFdoeSBhIGZpZWxkIEJFU0lERSBgdHlwZWAsIGFuZCBub3QgZm91ciBtb3JlIG9wdGlvbnMgb24gaXRcbiAgICAgKlxuICAgICAqIFJFUS0wMDAzIGxlYXZlcyB0aGlzIG9wZW4gKFwiZWl0aGVyIG5ldyBvcHRpb25zIG9uIGB0eXBlYCBvciBhIGZpZWxkXG4gICAgICogYmVzaWRlIGl0LCBkZWNpZGVkIHdoZW4gYnVpbHRcIikuIEl0IGlzIGEgc2VwYXJhdGUgZmllbGQgYmVjYXVzZSBgdHlwZWBcbiAgICAgKiBpcyBhIFJFTEFUSU9OU0hJUC1TVEFHRSBheGlzIFx1MjAxNCBwcm9zcGVjdCBcdTIxOTIgY3VzdG9tZXIgXHUyMTkyIGZvcm1lciwgcGx1c1xuICAgICAqIHBhcnRuZXIgXHUyMDE0IGFuZCBpdCBhbHJlYWR5IGhhcyB0d28gcmVhZGVycyB0aGF0IHdvdWxkIGJlIGJyb2tlbiBieSBhIHZhbHVlXG4gICAgICogbWVhbmluZyBcIm1heSBub3QgYmUgc29sZCB0b1wiOiBgYWNjb3VudC5ob29rLnRzYCBwcm9tb3RlcyBvbiBpdCwgYW5kXG4gICAgICogYG9wcG9ydHVuaXR5Lmhvb2sudHNgIGZsaXBzIGEgd29uIGRlYWwncyBhY2NvdW50IHRvIGBjdXN0b21lcmAuIEFuXG4gICAgICogYGFnZW5jeWAgb3B0aW9uIG9uIGB0eXBlYCB3b3VsZCB0aGVyZWZvcmUgYmUgb3ZlcndyaXR0ZW4gaW50byBgY3VzdG9tZXJgXG4gICAgICogYnkgdGhlIGZpcnN0IHdvbiBkZWFsIGJvb2tlZCBhZ2FpbnN0IGl0LCBzaWxlbnRseSB1bi1yZXN0cmljdGluZyB0aGVcbiAgICAgKiBhY2NvdW50LiBUaGUgdHdvIGF4ZXMgYXJlIGluZGVwZW5kZW50IFx1MjAxNCBhbiBhZ2VuY3kgY2FuIGJlIGEgcHJvc3BlY3QsIGFcbiAgICAgKiBjdXN0b21lciBvciBhIGZvcm1lciBjdXN0b21lciBcdTIwMTQgc28gdGhleSBhcmUgdHdvIGZpZWxkcy5cbiAgICAgKlxuICAgICAqICMjIEdlbmVyaWMgdmFsdWVzIG9ubHlcbiAgICAgKlxuICAgICAqIFJFUS0wMDAzIHJ1bGVzIHRoZSBjdXN0b21lcidzIG93biB2b2NhYnVsYXJ5IChcdTYyREJcdTY4MDdcdTRFRTNcdTc0MDZcdTUxNkNcdTUzRjggXHUyMDI2KSAqKkMqKjpcbiAgICAgKiBvdmVybGF5IGNvbmZpZ3VyYXRpb24sIFx1MjZENCBuZXZlciBjb21taXR0ZWQgaW50byBjb3JlLiBDb3JlIHNoaXBzIHRoZVxuICAgICAqIGNhcGFiaWxpdHkgZGlzdGluY3Rpb24gaXRzZWxmOyBhbiBpbnN0YWxsIG1hcHMgaXRzIG1hcmtldCdzIGNhdGVnb3JpZXNcbiAgICAgKiBvbnRvIHRoZXNlIHR3byB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAjIyBXaGF0IHJlYWRzIGl0OiBgb3Bwb3J0dW5pdHkuaG9vay50c2AgYGJlZm9yZUluc2VydGBcbiAgICAgKlxuICAgICAqIFJFUS0wMDAzIGlzIGV4cGxpY2l0IHRoYXQgXCJhIGNhdGVnb3J5IG5vIHJ1bGUgcmVhZHMgaXMgcHJvc2UsIGFuZCB0aGVcbiAgICAgKiBydWxlIGlzIHRoZSBwb2ludFwiLCBzbyB0aGlzIGZpZWxkIHNoaXBzIFdJVEggaXRzIHJlYWRlci4gVGhlIHJlYWRlciBpcyBhXG4gICAgICogaG9vaywgYW5kIHdoaWNoIGNvbnN0cnVjdCBjYXJyaWVzIHRoZSBnYXRlIGlzIGEgbWFpbnRhaW5lciBydWxpbmdcbiAgICAgKiAoMjAyNi0wOS0xNiksIHF1b3RlZCB2ZXJiYXRpbSBhbmQga2VwdCB1bnRyYW5zbGF0ZWQ6XG4gICAgICpcbiAgICAgKiAgIFx1MzAwQ1x1OTVGOFx1OTVFOFx1OEQ3MCBgb3Bwb3J0dW5pdHkuaG9vay50c2AgXHU3Njg0IGBiZWZvcmVJbnNlcnRgXHVGRjBDXHU3NTI4IGhvb2sgXHU3Njg0IGBjdHguYXBpYCBcdThCRkJcdTVCQTJcdTYyMzdcdTdDN0JcdTUyMkJcdTMwMDJcbiAgICAgKiAgICBSRVEtMDAwMyBcdTdCMkMgMTI4IFx1ODg0Q1x1NzY4NCBgdmFsaWRhdGlvbnNbXWAgXHU0RTBFXHU4QkU1XHU4QkIwXHU1RjU1XHU4MUVBXHU1REYxXHU3Njg0XHU5QThDXHU2NTM2XHU3QjJDIDIgXHU2NzYxXHU1MUIyXHU3QTgxXHVGRjBDXHU0RUU1XHU5QThDXHU2NTM2XHU0RTNBXHU1MUM2XHUzMDAyXHUzMDBEXG4gICAgICpcbiAgICAgKiBcdTI2RDQgRG8gTk9UIHJlc3RhdGUgdGhlIGdhdGUgYXMgdGhlIGB2YWxpZGF0aW9uc1tdYCBlbnRyeSBSRVEtMDAwMyBsaW5lXG4gICAgICogMTI4IG5hbWVzLiBUV08gaW5kZXBlbmRlbnQgbWVhc3VyZW1lbnRzIHNheSBpdCBjYW5ub3QgYmUgdGhhdCwgYW5kIGJvdGhcbiAgICAgKiBhcmUgcmVjb3JkZWQgaGVyZSBiZWNhdXNlIGVhY2ggYWxvbmUgd291bGQgYmUgdGFsa2VkIHBhc3Q6XG4gICAgICpcbiAgICAgKiAgIDEuICoqSXQgd291bGQgYnJpY2sgaGlzdG9yeS4qKiBBIHZhbGlkYXRpb24gaXMgZXZhbHVhdGVkIGFnYWluc3RcbiAgICAgKiAgICAgIGB7Li4ucHJldmlvdXMsIC4uLmRhdGF9YCBvbiBFVkVSWSB3cml0ZSwgc28gXCJhbHJlYWR5IGxpbmtlZCB0byBhXG4gICAgICogICAgICByZXN0cmljdGVkIGFjY291bnRcIiBhbmQgXCJsaW5raW5nIG5vd1wiIGFyZSB0aGUgc2FtZSBzdGF0ZSBhbmQgZXZlcnlcbiAgICAgKiAgICAgIGxhdGVyIGVkaXQgdG8gZXZlcnkgaGlzdG9yaWNhbCBvcHBvcnR1bml0eSB3b3VsZCBiZSByZWZ1c2VkIFx1MjAxNCB0aGVcbiAgICAgKiAgICAgIGV4YWN0IHRoaW5nIFJFUS0wMDAzIGFjY2VwdGFuY2UgMiBmb3JiaWRzIChcIm9wcG9ydHVuaXRpZXMgdGhhdFxuICAgICAqICAgICAgYWxyZWFkeSBwb2ludCBhdCBpdCBrZWVwIHdvcmtpbmcgYW5kIGtlZXAgYmVpbmcgZWRpdGFibGVcIikuXG4gICAgICogICAgICBgbGVhZC5ob29rLnRzYCBjYXJyaWVzIHRoZSBzYW1lIGZpbmRpbmcgZm9yIGl0cyBvd24gZ2F0ZS5cbiAgICAgKiAgIDIuICoqSXQgY2Fubm90IHJlYWQgdGhlIGFjY291bnQgYXQgYWxsLioqIEEgcHJlZGljYXRlIGlzIGV2YWx1YXRlZCBieVxuICAgICAqICAgICAgYGNoZWNrUHJlZGljYXRlKHJ1bGUsIG1lcmdlZCwgcHJldmlvdXMpYCBvdmVyIHBsYWluIGRhdGEgb2JqZWN0cyBcdTIwMTRcbiAgICAgKiAgICAgIHRoZSBvcHBvcnR1bml0eSdzIE9XTiBzdG9yZWQgY29sdW1ucy4gYHJlY29yZC5jcm1fYWNjb3VudC50eXBlYFxuICAgICAqICAgICAgZG9lcyBub3QgdHJhdmVyc2UgdGhlIGxvb2t1cCAobWVhc3VyZWQ6IGBydW50aW1lOiBObyBzdWNoIGtleTpcbiAgICAgKiAgICAgIHR5cGVgKSwgYW5kIGBvcy5sb29rdXAoLi4uKWAgaGFzIG5vIG92ZXJsb2FkIGJlY2F1c2UgYGJ1aWxkU2NvcGUoKWBcbiAgICAgKiAgICAgIGluIGBAb2JqZWN0c3RhY2svZm9ybXVsYWAgY29tcG9zZXMgYG9zYCBmcm9tIG9ubHkgYGN0eC51c2VyYCAvXG4gICAgICogICAgICBgY3R4Lm9yZ2AgLyBgY3R4LmVudmAgYW5kIG5ldmVyIGJpbmRzIGBjdHguYXBpYCAobWVhc3VyZWQ6XG4gICAgICogICAgICBgcnVudGltZTogZm91bmQgbm8gbWF0Y2hpbmcgb3ZlcmxvYWQgZm9yICdkeW4ubG9va3VwKHN0cmluZyxcbiAgICAgKiAgICAgIGR5biknYDsgZmlsZWQgdXBzdHJlYW0gYXMgb2JqZWN0c3RhY2sjMTgzMTgpLiBBbiB1bmV2YWx1YWJsZVxuICAgICAqICAgICAgcHJlZGljYXRlIFJFSkVDVFMgVEhFIFdSSVRFLCBzbyBhdXRob3JpbmcgaXQgbGl0ZXJhbGx5IHJlZnVzZXNcbiAgICAgKiAgICAgIGV2ZXJ5IG9wcG9ydHVuaXR5IHdyaXRlLCBpbnNlcnQgYW5kIHVwZGF0ZSBhbGlrZS5cbiAgICAgKlxuICAgICAqIFx1MjZBMFx1RkUwRiBUaGUgaG9vaydzIGBjdHguYXBpYCBpcyBhIERJRkZFUkVOVCBzdXJmYWNlIGZyb20gdGhlIGZvcm11bGFcbiAgICAgKiBgRXZhbENvbnRleHQuYXBpYCB0aGF0IG1lYXN1cmVtZW50IDIgaXMgYWJvdXQsIGFuZCB0aGUgdHdvIGFyZSByb3V0aW5lbHlcbiAgICAgKiBjb25mdXNlZC4gVGhlIGhvb2sgb25lIGlzIGxpdmUgYW5kIHVzZWQgfjIwIHRpbWVzIGFjcm9zc1xuICAgICAqIGBzcmMvc2FsZXMvb2JqZWN0cy8qLmhvb2sudHNgOyBpdHMgc2hhcGUgaXMgYC4vX2hvb2stYXBpLnRzYCwgcGlubmVkXG4gICAgICogYWdhaW5zdCBhIHJlYWwgZW5naW5lIGJ5IGB0ZXN0L2hvb2stcXVlcnktcHJlZGljYXRlLnRlc3QudHNgIGFuZFxuICAgICAqIGB0ZXN0L2hvb2std3JpdGUtc2hhcGUudGVzdC50c2AuIG9iamVjdHN0YWNrIzE4MzE4IGRvZXMgbm90IGJsb2NrIHRoaXNcbiAgICAgKiBmaWVsZC5cbiAgICAgKlxuICAgICAqIFx1MjZENCBEbyBOT1QgXCJmaXhcIiBhbnl0aGluZyBoZXJlIGJ5IGRlbm9ybWFsaXNpbmcgdGhpcyB2YWx1ZSBvbnRvXG4gICAgICogYGNybV9vcHBvcnR1bml0eWA6IGEgY29weSBuZWVkcyBhIHdyaXRlciBhbmQgZ29lcyBzdGFsZSB0aGUgbW9tZW50IGFuXG4gICAgICogYWNjb3VudCBpcyByZWNsYXNzaWZpZWQsIGFuZCBhbnl0aGluZyBhYmxlIHRvIHdyaXRlIHRoZSBjb3B5IGlzIGFibGUgdG9cbiAgICAgKiBzaW1wbHkgcmVmdXNlLlxuICAgICAqL1xuICAgIGNvbW1lcmNpYWxfY2FwYWJpbGl0eTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnQ29tbWVyY2lhbCBDYXBhYmlsaXR5JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdXaGV0aGVyIG5ldyBidXNpbmVzcyBtYXkgYmUgb3BlbmVkIGFnYWluc3QgdGhpcyBhY2NvdW50LiBTZXR0bGVtZW50IE9ubHkgYWNjb3VudHMgc3RheSBmdWxseSB1c2FibGUgZm9yIGJpbGxpbmcgYW5kIHBheW1lbnQsIGJ1dCBubyBuZXcgb3Bwb3J0dW5pdHkgbWF5IGJlIGxpbmtlZCB0byB0aGVtLicsXG4gICAgICBkZWZhdWx0VmFsdWU6ICdmdWxsJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0Z1bGwnLCB2YWx1ZTogJ2Z1bGwnLCBjb2xvcjogJyMwMEFBMDAnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTZXR0bGVtZW50IE9ubHknLCB2YWx1ZTogJ3NldHRsZW1lbnRfb25seScsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICAvLyBTZWxlY3QgZmllbGRzIHdpdGggY3VzdG9tIG9wdGlvbnNcbiAgICB0eXBlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdBY2NvdW50IFR5cGUnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdQcm9zcGVjdCcsIHZhbHVlOiAncHJvc3BlY3QnLCBjb2xvcjogJyNGRkE1MDAnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDdXN0b21lcicsIHZhbHVlOiAnY3VzdG9tZXInLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQYXJ0bmVyJywgdmFsdWU6ICdwYXJ0bmVyJywgY29sb3I6ICcjMDAwMEZGJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRm9ybWVyIEN1c3RvbWVyJywgdmFsdWU6ICdmb3JtZXInLCBjb2xvcjogJyM5OTk5OTknIH0sXG4gICAgICBdXG4gICAgfSksXG5cbiAgICBpbmR1c3RyeTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnSW5kdXN0cnknLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICAvLyBDYW5vbmljYWwgc2V0IHNoYXJlZCB3aXRoIExlYWQgKCM0OTApOiBsZWFkX2NvbnZlcnNpb24gY29waWVzXG4gICAgICAvLyBgbGVhZFJlY29yZC5pbmR1c3RyeWAgb250byB0aGUgYWNjb3VudCBpdCBjcmVhdGVzLCBzbyB0aGlzIG11c3RcbiAgICAgIC8vIGFjY2VwdCBldmVyeSBMZWFkIHZhbHVlLlxuICAgICAgb3B0aW9uczogWy4uLklORFVTVFJZX09QVElPTlNdLFxuICAgIH0pLFxuXG4gICAgZGVzY3JpcHRpb246IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGxhYmVsOiAnRGVzY3JpcHRpb24nLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICAvLyBOdW1iZXIgZmllbGRzXG4gICAgYW5udWFsX3JldmVudWU6IEZpZWxkLmN1cnJlbmN5KHtcbiAgICAgIGxhYmVsOiAnQW5udWFsIFJldmVudWUnLFxuICAgICAgbWluOiAwLFxuICAgICAgZ3JvdXA6ICdmaW5hbmNpYWxzJyxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIFJvbGxlZC11cCBhbm51YWwgcmV2ZW51ZSBvZiB0aGlzIGFjY291bnQncyBkaXJlY3QgY2hpbGRyZW4uXG4gICAgICpcbiAgICAgKiBcdTI2QTBcdUZFMEYgRElSRUNUIGNoaWxkcmVuIG9ubHksIG9uZSBsZXZlbCBcdTIwMTQgdGhlIGVuZ2luZSBhZ2dyZWdhdGVzIG92ZXIgdGhlIHJvd3NcbiAgICAgKiB3aG9zZSBgcGFyZW50X2FjY291bnRgIGlzIHRoaXMgYWNjb3VudCwgbm90IG92ZXIgYSB0cmFuc2l0aXZlIGNsb3N1cmUuIEFcbiAgICAgKiBncmFuZHBhcmVudCBzaG93cyB0aGUgc3VtIG9mIGl0cyBvd24gY2hpbGRyZW4sIGFuZCB0aGUgZG9jcyBzYXkgc287XG4gICAgICogYW55dGhpbmcgZWxzZSBuZWVkcyBhIGRpZmZlcmVudCAoYW5kIG11Y2ggbW9yZSBleHBlbnNpdmUpIHByaW1pdGl2ZSB0aGFuXG4gICAgICogdGhlIG9uZSB0aGUgcGxhdGZvcm0gc2hpcHMuXG4gICAgICpcbiAgICAgKiBTZWxmLXJlZmVyZW5jaW5nIHJvbGwtdXBzIGFyZSB3b3J0aCBtZWFzdXJpbmcgcmF0aGVyIHRoYW4gYXNzdW1pbmcsXG4gICAgICogYmVjYXVzZSBwYXJlbnQgYW5kIGNoaWxkIGFyZSB0aGUgc2FtZSBvYmplY3QgYW5kIHRoZSBlbmdpbmUncyBzdW1tYXJ5XG4gICAgICogaW5kZXggaXMga2V5ZWQgYnkgY2hpbGQgb2JqZWN0LiBgdGVzdC9kZWNvcmF0aXZlLWZpZWxkLXN3ZWVwLnRlc3QudHNgXG4gICAgICogZHJpdmVzIGFsbCBmb3VyIGxlZ3Mgb2YgdGhlIGxpZmVjeWNsZSAoaW5zZXJ0LCByYWlzZSwgcmUtcGFyZW50LCBkZWxldGUpXG4gICAgICogc28gYSBwbGF0Zm9ybSByZWdyZXNzaW9uIGNhbm5vdCBxdWlldGx5IHR1cm4gdGhpcyBiYWNrIGludG8gZGVjb3JhdGlvbi5cbiAgICAgKi9cbiAgICBjaGlsZF9hY2NvdW50X3JldmVudWU6IEZpZWxkLnN1bW1hcnkoe1xuICAgICAgbGFiZWw6ICdDaGlsZCBBY2NvdW50IFJldmVudWUnLFxuICAgICAgZ3JvdXA6ICdmaW5hbmNpYWxzJyxcbiAgICAgIHNjYWxlOiAyLFxuICAgICAgc3VtbWFyeU9wZXJhdGlvbnM6IHtcbiAgICAgICAgb2JqZWN0OiAnY3JtX2FjY291bnQnLFxuICAgICAgICBmaWVsZDogJ2FubnVhbF9yZXZlbnVlJyxcbiAgICAgICAgZnVuY3Rpb246ICdzdW0nLFxuICAgICAgICByZWxhdGlvbnNoaXBGaWVsZDogJ3BhcmVudF9hY2NvdW50JyxcbiAgICAgIH0sXG4gICAgfSksXG5cbiAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiBGaWVsZC5udW1iZXIoe1xuICAgICAgbGFiZWw6ICdFbXBsb3llZXMnLFxuICAgICAgbWluOiAwLFxuICAgICAgZ3JvdXA6ICdmaW5hbmNpYWxzJyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBCdXNpbmVzcyBwcm9maWxlIChSRVEtMDAwMyBzdGVwIDMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gR2VuZXJpYyBCMkIgc2FsZXMgaW50ZWxsaWdlbmNlLCBub3QgSVQtc2VydmljZXMgdm9jYWJ1bGFyeTogd2hvIGhvbGRzIHRoZVxuICAgIC8vIGFjY291bnQgdG9kYXksIGhvdyBtdWNoIHRoZXJlIGlzIHRvIHdpbiB0aGlzIHllYXIsIGFuZCBob3cgdGhleSBwYXkuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgYGFubnVhbF9yZXZlbnVlYCBhYm92ZSBhbnN3ZXJzIG5vbmUgb2YgdGhlc2UgXHUyMDE0IGl0IGlzIHRoZSBhY2NvdW50J3MgT1dOXG4gICAgLy8gdHVybm92ZXIsIHdoYXQgdGhlIGNvdW50ZXJwYXJ0eSBlYXJucywgd2hlcmVhcyB0aGUgYnVkZ2V0IGJlbG93IGlzIHdoYXRcbiAgICAvLyBpdCB3aWxsIFNQRU5EIHdpdGggdmVuZG9ycy4gUmV1c2luZyBvbmUgZm9yIHRoZSBvdGhlciBpcyB0aGUgbWlzdGFrZSB0aGlzXG4gICAgLy8gZ3JvdXAgZXhpc3RzIHRvIHByZXZlbnQuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgYHBucG0gdmFsaWRhdGVgIHJlcG9ydHMgYWxsIHRocmVlIGFzIFwiY2Fycmllci1vbmx5IFx1MjAxNCBkZWNsYXJlZCBidXRcbiAgICAvLyBub3RoaW5nIGluIHRoaXMgc3RhY2sgcmVhZHMgb3IgZGlzcGxheXMgaXRcIiwgYW5kIHRoYXQgcmVhZGluZyBpcyBFWFBFQ1RFRFxuICAgIC8vIGhlcmUgcmF0aGVyIHRoYW4gYSBkZWZlY3QgdG8gdGlkeSBhd2F5LiBUaGUgbGl2ZW5lc3MgZGlhZ25vc3RpYyBjb3VudHNcbiAgICAvLyB2aWV3IGNvbHVtbnMsIGZvcm0gc2VjdGlvbnMsIHBhZ2UgYmluZGluZ3MsIGZsb3cgbm9kZXMsIGZvcm11bGFzLCBob29rc1xuICAgIC8vIGFuZCBhY3Rpb25zIGFzIHNpdGVzOyBpdCBkb2VzIE5PVCBjb3VudCBgZmllbGRHcm91cHNgIG1lbWJlcnNoaXAsIHdoaWNoXG4gICAgLy8gaXMgcHJlY2lzZWx5IHRoZSBERVJJVkVEIGxheW91dCBSRVEtMDAwMyBhY2NlcHRhbmNlIDMgYXNrcyBmb3IgKFwicmVuZGVyXG4gICAgLy8gYXMgdGhlaXIgb3duIGdyb3VwIFx1MjAyNiB3aXRob3V0IGFueSBgcmVjb3JkOmRldGFpbHNgIHNlY3Rpb24gYmVpbmdcbiAgICAvLyBhdXRob3JlZFwiKS4gVGhlc2UgYXJlIGRhdGEtZW50cnkgZmllbGRzIGEgcGVyc29uIGZpbGxzIGluIGFuZCBhIHBlcnNvblxuICAgIC8vIHJlYWRzIG9mZiB0aGUgZGVyaXZlZCBmb3JtLiBcdTI2RDQgRG8gTk9UIGFuc3dlciB0aGUgd2FybmluZyBieSBhdXRob3JpbmcgYVxuICAgIC8vIGByZWNvcmQ6ZGV0YWlsc2Agc2VjdGlvbiBcdTIwMTQgdGhhdCBpcyB0aGUgZXNjYXBlIGhhdGNoIEFHRU5UUy5tZCByZXNlcnZlc1xuICAgIC8vIGZvciBhIG5hbWVkIGN1c3RvbWVyIGRlbWFuZCwgYW5kIGl0IHdvdWxkIHRyYWRlIGFjY2VwdGFuY2UgMyBmb3IgYVxuICAgIC8vIHF1aWV0ZXIgbG9nLiBObyBndWFyZCByZWFkcyB0aGlzIHdhcm5pbmcuXG5cbiAgICBpbmN1bWJlbnRfdmVuZG9yOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnSW5jdW1iZW50IFZlbmRvcicsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBzdXBwbGllciBjdXJyZW50bHkgaG9sZGluZyB0aGlzIGFjY291bnQgZm9yIHRoZSBzcGVuZCB3ZSBhcmUgY2hhc2luZy4nLFxuICAgICAgbWF4TGVuZ3RoOiAyNTUsXG4gICAgICBncm91cDogJ2J1c2luZXNzX3Byb2ZpbGUnLFxuICAgIH0pLFxuXG4gICAgYW5udWFsX3B1cmNoYXNpbmdfYnVkZ2V0OiBGaWVsZC5jdXJyZW5jeSh7XG4gICAgICBsYWJlbDogJ0FubnVhbCBQdXJjaGFzaW5nIEJ1ZGdldCcsXG4gICAgICBkZXNjcmlwdGlvbjogXCJXaGF0IHRoaXMgYWNjb3VudCBleHBlY3RzIHRvIFNQRU5EIHdpdGggdmVuZG9ycyB0aGlzIHllYXIgXHUyMDE0IG5vdCBpdHMgb3duIHJldmVudWUuXCIsXG4gICAgICBtaW46IDAsXG4gICAgICBncm91cDogJ2J1c2luZXNzX3Byb2ZpbGUnLFxuICAgIH0pLFxuXG4gICAgLy8gUGF5bWVudCB0ZXJtcyBhcyBhIHNlbGVjdCwgbm90IGZyZWUgdGV4dDogaXQgaXMgcmVhZCBieSBhIHBlcnNvbiBzaXppbmdcbiAgICAvLyBjYXNoLWZsb3cgcmlzaywgYW5kIGEgcGlja2xpc3Qga2VlcHMgdGhhdCBkb21haW4ga25vd2FibGUuIFRoZSB2YWx1ZXMgYXJlXG4gICAgLy8gdGhlIG5ldC10ZXJtcyBsYWRkZXIgZXZlcnkgQjJCIGluc3RhbGwgc2hhcmVzOyBhIGN1c3RvbWVyIHdob3NlIGNvbnRyYWN0c1xuICAgIC8vIHVzZSBhIGRpZmZlcmVudCBsYWRkZXIgb3ZlcmxheXMgaXRzIG93bi5cbiAgICBwYXltZW50X2N5Y2xlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdQYXltZW50IEN5Y2xlJyxcbiAgICAgIGdyb3VwOiAnYnVzaW5lc3NfcHJvZmlsZScsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdQcmVwYWlkJywgdmFsdWU6ICdwcmVwYWlkJyB9LFxuICAgICAgICB7IGxhYmVsOiAnTmV0IDMwJywgdmFsdWU6ICduZXRfMzAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdOZXQgNjAnLCB2YWx1ZTogJ25ldF82MCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ05ldCA5MCcsIHZhbHVlOiAnbmV0XzkwJyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIC8vIENvbnRhY3QgSW5mb3JtYXRpb25cbiAgICBwaG9uZTogRmllbGQudGV4dCh7XG4gICAgICBsYWJlbDogJ1Bob25lJyxcbiAgICAgIGZvcm1hdDogJ3Bob25lJyxcbiAgICAgIGdyb3VwOiAnY29udGFjdF9pbmZvJyxcbiAgICB9KSxcblxuICAgIHdlYnNpdGU6IEZpZWxkLnVybCh7XG4gICAgICBsYWJlbDogJ1dlYnNpdGUnLFxuICAgICAgZ3JvdXA6ICdjb250YWN0X2luZm8nLFxuICAgIH0pLFxuXG4gICAgLy8gU3RydWN0dXJlZCBBZGRyZXNzIGZpZWxkIChuZXcgZmllbGQgdHlwZSlcbiAgICBiaWxsaW5nX2FkZHJlc3M6IEZpZWxkLmFkZHJlc3Moe1xuICAgICAgbGFiZWw6ICdCaWxsaW5nIEFkZHJlc3MnLFxuICAgICAgZ3JvdXA6ICdjb250YWN0X2luZm8nLFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogRmxhdCBwcm9qZWN0aW9uIG9mIGBiaWxsaW5nX2FkZHJlc3MuY291bnRyeWAuXG4gICAgICpcbiAgICAgKiAjIyMgV2h5IHRoZSBmbGF0IGNvbHVtbiBleGlzdHMgXHUyMDE0IHRoZSB0cmFwIHRoYXQgY2F0Y2hlcyBldmVyeSBydWxlXG4gICAgICogIyMjIGF1dGhvcmVkIGFnYWluc3QgYW4gYGFkZHJlc3NgXG4gICAgICpcbiAgICAgKiBcdTI2QTBcdUZFMEYgYGJpbGxpbmdfYWRkcmVzc2AgaXMgYW4gYGFkZHJlc3NgIGZpZWxkOiB0aGUgcGxhdGZvcm0gc3RvcmVzIHRoZSB3aG9sZVxuICAgICAqIHtzdHJlZXQsIGNpdHksIHN0YXRlLCBwb3N0YWxDb2RlLCBjb3VudHJ5LCBjb3VudHJ5Q29kZSwgZm9ybWF0dGVkfSB2YWx1ZVxuICAgICAqIGluIE9ORSBjb2x1bW4uIEEgc2hhcmluZyBydWxlJ3MgQ0VMIGNvbmRpdGlvbiBpcyBjb21waWxlZCB0byBhXG4gICAgICogcHVzaGRvd24tYWJsZSBgRmlsdGVyQ29uZGl0aW9uYCBieSBgY29tcGlsZUNlbFRvRmlsdGVyYCwgYW5kIHRoYXQgY29tcGlsZXJcbiAgICAgKiByZWplY3RzIGV2ZXJ5IHBhdGggcmVhY2hpbmcgSU5TSURFIHN1Y2ggYSB2YWx1ZTpcbiAgICAgKlxuICAgICAqICAgICByZWNvcmQuYmlsbGluZ19hZGRyZXNzLmNvdW50cnkgaW4gW1wiVVNcIixcIkNBXCIsXCJNWFwiXVxuICAgICAqICAgICAgIFx1MjE5MiB1bnN1cHBvcnRlZDogY3Jvc3Mtb2JqZWN0L25lc3RlZCBmaWVsZCBwYXRoXG4gICAgICogICAgICAgICBcInJlY29yZC5iaWxsaW5nX2FkZHJlc3MuY291bnRyeVwiIGlzIG5vdCBwdXNoZG93bi1hYmxlXG4gICAgICpcbiAgICAgKiBgcGx1Z2luLXNoYXJpbmdgIHRoZW4gcmVmdXNlcyB0byBzZWVkIHRoZSBydWxlIHJhdGhlciB0aGFuIGRlZ3JhZGUgaXQgdG9cbiAgICAgKiBtYXRjaC1hbGwsIHNvIHRoZSBydWxlIGlzIGRyb3BwZWQgb24gZXZlcnkgYm9vdCBhbmQgaXRzIHJlY2lwaWVudHMgZ2V0XG4gICAgICogbm90aGluZyBhdCBhbGwuIE1lYXN1cmVkOiB0aGUgYmxvY2tlciBpcyB0aGUgTkVTVEVEIFBBVEgsIG5vdCB0aGVcbiAgICAgKiBgaW4gWy4uLl1gIG9wZXJhdG9yIFx1MjAxNCBgaW4gWy4uLl1gLCBgPT1gLCBgIT1gLCBgPGAsIGA+YCwgYCYmYCwgYHx8YCwgYCFgLFxuICAgICAqIGBzdGFydHNXaXRoKClgIGFuZCBgPT0gbnVsbGAgYWxsIGNvbXBpbGUgZmluZSBhZ2FpbnN0IGEgRkxBVCBmaWVsZC5cbiAgICAgKiBSZXdyaXRpbmcgdGhlIGNvbmRpdGlvbiBhcyBhIGRpc2p1bmN0aW9uIG9mIGA9PWAgdGhlcmVmb3JlIGRvZXMgTk9UIGhlbHA7XG4gICAgICogb25seSBhIGZsYXQgY29sdW1uIGRvZXMuIGB0ZXN0L3NoYXJpbmctc2VlZGluZy50ZXN0LnRzYCBtZWFzdXJlcyB0aGF0XG4gICAgICogbWF0cml4IGluc3RlYWQgb2YgYXNzdW1pbmcgaXQuXG4gICAgICpcbiAgICAgKiAjIyMgV2hhdCBpdCBob2xkc1xuICAgICAqXG4gICAgICogYGJpbGxpbmdfYWRkcmVzcy5jb3VudHJ5YCwgdHJpbW1lZCwgaW50ZXJuYWwgd2hpdGVzcGFjZSBjb2xsYXBzZWQsIGFuZFxuICAgICAqIHVwcGVyLWNhc2VkIFx1MjAxNCBub3RoaW5nIGVsc2UuIEl0IGlzIHdoYXQgd2FzIFRZUEVELCBzbyBpdCBpcyBzdGlsbCBmcmVlXG4gICAgICogdGV4dCBhbmQgc3RpbGwgY2FwYWJsZSBvZiBob2xkaW5nIGBEZXV0c2NobGFuZGAuIE5vdGhpbmcgbWF0Y2hlcyBhZ2FpbnN0XG4gICAgICogaXQ6IGB0ZXJyaXRvcnlgIGJlbG93IGNsYXNzaWZpZXMgaXQsIGFuZCBhbiB1bnJlY29nbmlzZWQgc3BlbGxpbmcgbGFuZHMgaW5cbiAgICAgKiBhIHN0YXRlZCBgb3RoZXJgLiBgY291bnRyeUNvZGVgIGlzIGRlbGliZXJhdGVseSBub3QgY29uc3VsdGVkOyBzZWUgdGhlXG4gICAgICogbm90ZSBpbiBgYWNjb3VudC5ob29rLnRzYCBmb3Igd2h5IHRoZSBJU08gc2xvdCBpcyBub3QgdGhlIGlucHV0LlxuICAgICAqXG4gICAgICogRGVyaXZlZCwgbmV2ZXIgYXV0aG9yZWQ6IGBhY2NvdW50Lmhvb2sudHNgIHJlY29tcHV0ZXMgaXQgb24gZXZlcnkgd3JpdGVcbiAgICAgKiB0aGF0IGNhcnJpZXMgYGJpbGxpbmdfYWRkcmVzc2AsIGFuZCBsZWF2ZXMgaXQgdW50b3VjaGVkIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBiaWxsaW5nX2NvdW50cnk6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdCaWxsaW5nIENvdW50cnknLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdEZXJpdmVkIGZyb20gQmlsbGluZyBBZGRyZXNzIFx1MjAxNCB0aGUgY291bnRyeSBleGFjdGx5IGFzIGl0IHdhcyBlbnRlcmVkLCB0cmltbWVkIGFuZCB1cHBlci1jYXNlZC4gVGVycml0b3J5IGlzIGNsYXNzaWZpZWQgZnJvbSBpdC4nLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBtYXhMZW5ndGg6IDY0LFxuICAgICAgZ3JvdXA6ICdjb250YWN0X2luZm8nLFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogVGVycml0b3J5IFx1MjAxNCB0aGUgZGVjbGFyZWQgdmFsdWUgdGhlIHRlcnJpdG9yeSBzaGFyaW5nIHJ1bGVzIGZpbHRlciBvbi5cbiAgICAgKlxuICAgICAqICMjIyBXaHkgYSBzZWxlY3QgYW5kIG5vdCB0aGUgY291bnRyeVxuICAgICAqXG4gICAgICogTWF0Y2hpbmcgZnJlZS10ZXh0IGBiaWxsaW5nX2NvdW50cnlgIGFnYWluc3QgYSBsaXN0IG9mIGNvdW50cnkgY29kZXNcbiAgICAgKiBpbnNpZGUgYSBDRUwgc3RyaW5nIG1lYW5zIGFuIGFjY291bnQgd2hvc2UgYWRkcmVzcyByZWFkcyBgVW5pdGVkIFN0YXRlc2BcbiAgICAgKiBiZWxvbmdzIHRvIE5PIHRlcnJpdG9yeSwgc2lsZW50bHkgXHUyMDE0IHRoZSBtZXRhZGF0YSBzYXlzIHRlcnJpdG9yeSBzaGFyaW5nXG4gICAgICogd29ya3MgYW5kIGZvciB0aGF0IGFjY291bnQgaXQgZG9lcyBub3RoaW5nLCB3aXRoIG5vIGVycm9yIGFueXdoZXJlLiBBXG4gICAgICogYHNlbGVjdGAgbWFrZXMgdGhlIGRvbWFpbiBrbm93YWJsZTogdGhyZWUgdmFsdWVzLCBkZWNsYXJlZCwgZXZlcnkgb25lXG4gICAgICogcmVhY2hhYmxlLCBhbmQgYW4gYWNjb3VudCBvdXRzaWRlIHRoZSBzdGFmZmVkIHRlcnJpdG9yaWVzIHNheXMgYG90aGVyYFxuICAgICAqIHJhdGhlciB0aGFuIG5vdGhpbmcuXG4gICAgICpcbiAgICAgKiBJdCBhbHNvIGNvbGxhcHNlcyBmb3VyIGNvcGllcyBvZiB0aGUgY291bnRyeSBsaXN0ICh0d28gQ0VMIHN0cmluZ3MgYW5kXG4gICAgICogc2l4IGxvY2FsaXNlZCBkb2N1bWVudGF0aW9uIHRhYmxlcykgaW50byBvbmUgYXV0aG9yZWQgdGFibGUgaW5cbiAgICAgKiBgLi9fdGVycml0b3J5LnRzYC4gQWRkaW5nIGEgY291bnRyeSBpcyBhIGxpbmUgdGhlcmU7IHRoZSBzaGFyaW5nIHJ1bGVzLFxuICAgICAqIHRoaXMgcGlja2xpc3QgYW5kIHRoZSBkb2NzIGFsbCBmb2xsb3csIGFuZFxuICAgICAqIGB0ZXN0L3RlcnJpdG9yeS1zaW5nbGUtc291cmNlLnRlc3QudHNgIGZhaWxzIGlmIGFueSBvZiB0aGVtIGRvZXMgbm90LlxuICAgICAqXG4gICAgICogIyMjIFJlYWRvbmx5LCBhbmQgYWx3YXlzIHN0YXRlZFxuICAgICAqXG4gICAgICogRGVyaXZlZCBieSBgYWNjb3VudF9wcm90ZWN0aW9uYCBmcm9tIGBiaWxsaW5nX2FkZHJlc3MuY291bnRyeWAsIG5ldmVyXG4gICAgICogYXV0aG9yZWQgXHUyMDE0IGNvcnJlY3RpbmcgYW4gYWNjb3VudCdzIHRlcnJpdG9yeSBtZWFucyBjb3JyZWN0aW5nIGl0c1xuICAgICAqIGFkZHJlc3MsIHdoaWNoIGtlZXBzIE9ORSBmYWN0IGJlaGluZCB0aGUgY2xhc3NpZmljYXRpb24uIEV2ZXJ5IGluc2VydFxuICAgICAqIHN0YXRlcyBpdCAoYW4gYWNjb3VudCB3aXRoIG5vIGFkZHJlc3MgYXQgYWxsIGlzIGBvdGhlcmApLCBhbmQgYW4gdXBkYXRlXG4gICAgICogdGhhdCBkb2VzIG5vdCBjYXJyeSB0aGUgYWRkcmVzcyBsZWF2ZXMgaXQgYWxvbmUuXG4gICAgICovXG4gICAgdGVycml0b3J5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdUZXJyaXRvcnknLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdEZXJpdmVkIGZyb20gQmlsbGluZyBBZGRyZXNzIFx1MjAxNCB0aGUgc2FsZXMgdGVycml0b3J5IHRoaXMgYWNjb3VudCBiZWxvbmdzIHRvLiBBY2NvdW50cyBvdXRzaWRlIHRoZSBzdGFmZmVkIHRlcnJpdG9yaWVzIGFyZSBPdGhlci4nLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBvcHRpb25zOiBbLi4uVEVSUklUT1JZX09QVElPTlNdLFxuICAgICAgZ3JvdXA6ICdjb250YWN0X2luZm8nLFxuICAgIH0pLFxuXG4gICAgLy8gT2ZmaWNlIExvY2F0aW9uIChuZXcgZmllbGQgdHlwZSlcbiAgICBvZmZpY2VfbG9jYXRpb246IEZpZWxkLmxvY2F0aW9uKHtcbiAgICAgIGxhYmVsOiAnT2ZmaWNlIExvY2F0aW9uJyxcbiAgICAgIGdyb3VwOiAnY29udGFjdF9pbmZvJyxcbiAgICB9KSxcblxuICAgIC8vIFJlbGF0aW9uc2hpcCBmaWVsZHNcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IGhpZXJhcmNoeS4gYGNoaWxkX2FjY291bnRfcmV2ZW51ZWAgYmVsb3cgaXMgaXRzIG9uZSByZWFkZXIgXHUyMDE0XG4gICAgICogdGhlIHBsYXRmb3JtIGNvbXB1dGVzIHJvbGwtdXAgc3VtbWFyaWVzIGl0c2VsZiwgc28gdGhlIGhvbmVzdCBjb25zdW1lciBpc1xuICAgICAqIGEgc2luZ2xlIGRlY2xhcmF0aW9uIHJhdGhlciB0aGFuIGhhbmQtd3JpdHRlbiByZWNvbXB1dGUgaG9va3MuXG4gICAgICovXG4gICAgcGFyZW50X2FjY291bnQ6IEZpZWxkLmxvb2t1cCgnY3JtX2FjY291bnQnLCB7XG4gICAgICBsYWJlbDogJ1BhcmVudCBBY2NvdW50JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUGFyZW50IGNvbXBhbnkgaW4gaGllcmFyY2h5JyxcbiAgICAgIGdyb3VwOiAnb3duZXJzaGlwJyxcbiAgICB9KSxcblxuICAgIC8vIEJvb2xlYW4gZmllbGRcbiAgICBpc19hY3RpdmU6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdBY3RpdmUnLFxuICAgICAgZGVmYXVsdFZhbHVlOiB0cnVlLFxuICAgICAgZ3JvdXA6ICdvd25lcnNoaXAnLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogV2hlcmUgdGhpcyBhY2NvdW50IHN0YW5kcyBpbiBpdHMgc2lnbi1vZmYgKFJFUS0wMDAzIHN0ZXAgNSAvIGFjY2VwdGFuY2UgNCkuXG4gICAgICpcbiAgICAgKiBgcmVhZG9ubHlgLCBzbyBvbmx5IHRoZSBwbGF0Zm9ybSdzIG93biBhcHByb3ZhbCB3cml0ZSByZWFjaGVzIGl0OiBhXG4gICAgICogdXNlcidzIGluc2VydCBvciBlZGl0IHRoYXQgbmFtZXMgdGhpcyBjb2x1bW4gaGFzIGl0IHN0cmlwcGVkIChtZWFzdXJlZFxuICAgICAqIG9uIDE3LjcuMCBmb3IgYGFwcHJvdmVkYCwgYHBlbmRpbmdgIGFuZCBgcmVqZWN0ZWRgIGFsaWtlLCAjMjA2NykuXG4gICAgICpcbiAgICAgKiBcdTI2RDQgTk9UIGEgc2Vjb25kIGJvb2xlYW4gYmVzaWRlIGBpc19hY3RpdmVgLCB3aGljaCBSRVEtMDAwMyBydWxlcyBvdXQgYnlcbiAgICAgKiBuYW1lLiBgaXNfYWN0aXZlYCBhbnN3ZXJzIFwiaXMgdGhpcyBhY2NvdW50IGxpdmUgYXQgYWxsXCI7IHRoaXMgYW5zd2Vyc1xuICAgICAqIFwiaGFzIHRoZSByZWNvcmQgYmVlbiBzaWduZWQgb2ZmXCIsIGFuZCBjb2xsYXBzaW5nIHRoZW0gd291bGQgbWFrZVxuICAgICAqIGRlYWN0aXZhdGluZyBhbiBhY2NvdW50IGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gcmVqZWN0aW5nIG9uZS5cbiAgICAgKlxuICAgICAqIFx1MjZBMFx1RkUwRiBTaGlwcyB3aXRoIE5PIGRlZmF1bHQsIGFuZCB0aGF0IGlzIHdoYXQga2VlcHMgdGhlIGdhdGUgYXJtZWQgKCMyMDY3KS5cbiAgICAgKiBBIG5ldyBhY2NvdW50IGlzIGJvcm4gYmxhbmssIGBhY2NvdW50X2FwcHJvdmFsYCBzdGFydHMgb24gdGhlIGJsYW5rLCBhbmRcbiAgICAgKiBpdHMgYXBwcm92YWwgbm9kZSBvcGVucyB0aGUgcmVxdWVzdDsgdGhlIG5vZGUncyBgYXBwcm92YWxTdGF0dXNGaWVsZGBcbiAgICAgKiBtaXJyb3IgdGhlbiB3cml0ZXMgYHBlbmRpbmdgIChwbHVnaW4tYXBwcm92YWxzIGBvcGVuTm9kZVJlcXVlc3RgKSBiZWZvcmVcbiAgICAgKiB0aGUgY3JlYXRlIHJldHVybnM7IG9ubHkgdGhlIGNyZWF0ZSdzIG93biByZXNwb25zZSBib2R5IHN0aWxsIHNob3dzIHRoZVxuICAgICAqIGJsYW5rIHJvdyBpdCBpbnNlcnRlZC4gU28gd2l0aCBhcHByb3ZhbHMgaW4gdGhlIGNvbXBvc2l0aW9uIFJFUS0wMDAzXG4gICAgICogYWNjZXB0YW5jZSA0IGhvbGRzIGluIGFzIG1hbnkgd29yZHMgKFwiQSBuZXdseSBjcmVhdGVkIGFjY291bnQgc2l0cyBpbiBhXG4gICAgICogcGVuZGluZyBzdGF0ZSwgYXBwZWFycyBpbiB0aGUgcGxhdGZvcm0gYXBwcm92YWwgaW5ib3ggXHUyMDI2XCIpLCBhbmQgYHBlbmRpbmdgXG4gICAgICogYWx3YXlzIGhhcyBhIHJlcXVlc3QgYmVoaW5kIGl0LiBXaXRob3V0IGFwcHJvdmFscyAoYSBwbGFuIG9yIGVkaXRpb25cbiAgICAgKiB0aGF0IG9taXRzIHRoZSBjYXBhYmlsaXR5KSBub3RoaW5nIG9wZW5zIGEgcmVxdWVzdCwgc28gbm90aGluZyB3cml0ZXNcbiAgICAgKiBgcGVuZGluZ2A6IHRoZSBhY2NvdW50IHN0YXlzIGJsYW5rIGFuZCBlZGl0YWJsZSBpbnN0ZWFkIG9mIHJlYWRpbmdcbiAgICAgKiBcImxvY2tlZCBmb3IgYXBwcm92YWxcIiBmb3JldmVyLCB3aGljaCBpcyB3aGF0IGEgc2hpcHBlZCBgcGVuZGluZ2AgZGVmYXVsdFxuICAgICAqIGRpZCwgc2luY2UgdGhlIGNvbnNvbGUgZGVyaXZlcyBpdHMgbG9jayBmcm9tIHRoaXMgY29sdW1uJ3MgdmFsdWUuXG4gICAgICpcbiAgICAgKiBcdTI2RDQgRG8gbm90IHJlc3RvcmUgYGRlZmF1bHRWYWx1ZTogJ3BlbmRpbmcnYCwgbm9yIGFuIG9wdGlvbi1sZXZlbFxuICAgICAqIGBkZWZhdWx0OiB0cnVlYCBvbiBQZW5kaW5nICh0aGUgZm9ybSB3b3VsZCBwcmVzZWxlY3QgaXQpLiBBbiBpbnN0YWxsXG4gICAgICogdGhhdCB3YW50cyBubyBhY2NvdW50IHNpZ24tb2ZmIEFERFMgYGRlZmF1bHRWYWx1ZTogJ2FwcHJvdmVkJ2A7IHRoZVxuICAgICAqIGZsb3cncyBzdGFydCBjb25kaXRpb24gaXMgdGhlbiBmYWxzZSBmb3IgZXZlcnkgcmVjb3JkIGFuZCB0aGUgZ2F0ZSBpc1xuICAgICAqIG9mZiwgc3dpdGNoYWJsZSBhbmQgaW5lcnQuIFRoYXQgaXMgdGhlIHNhbWUga2luZCBvZiBvZmYgc3dpdGNoXG4gICAgICogYGNybV9sZWFkLmNvbnZlcnNpb25fYXBwcm92YWxfc3RhdHVzYCByZWNvcmRzLCBhbmQgXHUyNkQ0IE5PVCB0aGUgZmxvdydzXG4gICAgICogYHN0YXR1c2AsIGZvciB0aGUgcmVhc29ucyBtZWFzdXJlZCBpbiBgbGVhZC1jb252ZXJzaW9uLWFwcHJvdmFsLmZsb3cudHNgLlxuICAgICAqXG4gICAgICogXHUyNkQ0IFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBgbm90X3JlcXVpcmVkYCB2YWx1ZS4gQmxhbmsgYWxyZWFkeSBzYXlzXG4gICAgICogXCJubyByZXF1ZXN0IGhhcyBiZWVuIG9wZW5lZFwiLCBhbmQgYGFwcHJvdmVkYCBhbHJlYWR5IHNwZWxscyBcIm5vdGhpbmcgdG9cbiAgICAgKiBkZWNpZGVcIi5cbiAgICAgKi9cbiAgICBhcHByb3ZhbF9zdGF0dXM6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ0FwcHJvdmFsIFN0YXR1cycsXG4gICAgICBncm91cDogJ293bmVyc2hpcCcsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ1BlbmRpbmcnLCB2YWx1ZTogJ3BlbmRpbmcnLCBjb2xvcjogJyNGRkE1MDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdBcHByb3ZlZCcsIHZhbHVlOiAnYXBwcm92ZWQnLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWplY3RlZCcsIHZhbHVlOiAncmVqZWN0ZWQnLCBjb2xvcjogJyNGRjAwMDAnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgLy8gQnJhbmQgY29sb3IgKG5ldyBmaWVsZCB0eXBlKVxuICAgIGJyYW5kX2NvbG9yOiBGaWVsZC5jb2xvcih7XG4gICAgICBsYWJlbDogJ0JyYW5kIENvbG9yJyxcbiAgICAgIGdyb3VwOiAnYnJhbmRpbmcnLFxuICAgIH0pLFxuXG4gICAgLy8gQ29tcGFueSBsb2dvICh1cGxvYWRlZCBpbWFnZSkuIGBhY2NlcHRgIC8gYG1heFNpemVgIGFyZSBzZXJ2ZXItZW5mb3JjZWRcbiAgICAvLyBmcm9tIEBvYmplY3RzdGFjayAxNyBcdTIwMTQgc2VlIHRoZSBub3RlIG9uIGBjcm1fcHJvZHVjdC5pbWFnZWAuXG4gICAgbG9nbzogRmllbGQuaW1hZ2Uoe1xuICAgICAgbGFiZWw6ICdDb21wYW55IExvZ28nLFxuICAgICAgZ3JvdXA6ICdicmFuZGluZycsXG4gICAgICBhY2NlcHQ6IFsnaW1hZ2UvcG5nJywgJ2ltYWdlL2pwZWcnLCAnaW1hZ2Uvc3ZnK3htbCcsICdpbWFnZS93ZWJwJ10sXG4gICAgICBtYXhTaXplOiAyICogMTAyNCAqIDEwMjQsXG4gICAgfSksXG5cbiAgICAvLyBEYXRlIGZpZWxkXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgTk9UIGByZWFkb25seWAsIGFuZCBpdCBtdXN0IG5vdCBiZWNvbWUgcmVhZG9ubHkuIFRoaXMgaXMgdGhlIHNpZ25hbFxuICAgIC8vIGBhdF9yaXNrX2FjY291bnRzYCBhbmQgYGN1c3RvbWVyX2NodXJuX3NpZ25hbHNgIGFyZSBidWlsdCBvbiwgYW5kIGl0IGlzXG4gICAgLy8gd3JpdHRlbiBieSBPTkUgcGF0aDogYW5vdGhlciBvYmplY3QncyBob29rIGNhbGxpbmdcbiAgICAvLyBgYXBpLm9iamVjdCgnY3JtX2FjY291bnQnKS51cGRhdGUoeyBsYXN0X2FjdGl2aXR5X2RhdGUgfSwgXHUyMDI2KWAuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgUGxhdGZvcm0gY29uc3RyYWludDogYHN0cmlwUmVhZG9ubHlGaWVsZHNgIGRlbGV0ZXMgYSByZWFkb25seSBrZXkgZnJvbVxuICAgIC8vIGFueSBwYXlsb2FkIHdob3NlIENBTExFUiBzdXBwbGllZCBpdCwgZm9yIGV2ZXJ5IGNvbnRleHQgdGhhdCBpcyBub3RcbiAgICAvLyBgaXNTeXN0ZW1gIFx1MjAxNCBhbmQgYSBob29rJ3MgYGN0eC5hcGlgIGlzIGEgYFNjb3BlZENvbnRleHRgIG92ZXIgdGhlIEFDVElOR1xuICAgIC8vIFVTRVIncyBleGVjdXRpb24gY29udGV4dCwgbm90IGEgc3lzdGVtIG9uZS4gU28gYSByZWFkb25seSBmaWVsZCBhIGhvb2tcbiAgICAvLyB3cml0ZXMgaXMgc2lsZW50bHkgZHJvcHBlZDogdGhlIGVuZ2luZSBsb2dzIGBGaWVsZCAnXHUyMDI2JyBpcyByZWFkLW9ubHkgXHUyMDE0XG4gICAgLy8gaWdub3JpbmcgaW5jb21pbmcgY2hhbmdlYCBhbmQgdGhlIGNvbHVtbiBzdGF5cyBudWxsIGZvcmV2ZXIuXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgYGNybV9jYW1wYWlnbl9tZW1iZXIuYWRkZWRfZGF0ZWAgd2FzIGNpdGVkIGhlcmUgYXMgYSB0d2luIGFuZCBpcyBOT1RcbiAgICAvLyBvbmUgXHUyMDE0IGl0IHdhcyBydWxlZCBgcmVhZG9ubHk6IHRydWVgIGluICMxNjY3IHByZWNpc2VseSBiZWNhdXNlIGl0c1xuICAgIC8vIHdyaXRlcnMgYXJlIElOU0VSVHMsIHdoaWNoIHRoZSBzdHJpcCBuZXZlciByZWFjaGVzLiBUSElTIGZpZWxkIGlzIGFuXG4gICAgLy8gVVBEQVRFIHRocm91Z2ggYSBob29rJ3MgYGN0eC5hcGlgLCB3aGljaCBpcyB0aGUgb25lIHNoYXBlIHRoYXQgY2Fubm90IGJlXG4gICAgLy8gYHJlYWRvbmx5YC4gTm90ZSB0aGUgcnVsZVxuICAgIC8vIGlzIGFib3V0IHRoZSBDT05URVhULCBub3QgYWJvdXQgaG9va3Mgb3IgZmxvd3MgYXMgc3VjaCBcdTIwMTQgYSBob29rIHN0YW1waW5nXG4gICAgLy8gaXRzIG93biBgY3R4LmlucHV0LmRhdGFgIHN1cnZpdmVzLCBhbmQgYSBmbG93IHN1cnZpdmVzIHdoZW4gaXRzIGBydW5Bc2BcbiAgICAvLyBpcyBgJ3N5c3RlbSdgIChtZWFzdXJlZDogYHRlc3QvcmVhZG9ubHktd3JpdGUtc2VtYW50aWNzLnRlc3QudHNgLCAjMTQyOTtcbiAgICAvLyBgY3JtX2Nhc2UuaXNfc2xhX3Zpb2xhdGVkYCBpcyBjaXRlZCBlbHNld2hlcmUgYXMgYSB0d2luIG9mIHRoaXMgZmllbGRcbiAgICAvLyBhbmQgaXMgTk9UIG9uZSBcdTIwMTQgaXRzIHdyaXRlciBpcyBhIHN5c3RlbSBmbG93KS4gVGhpcyBmaWVsZCBzdGF5cyBvdXQgb2ZcbiAgICAvLyBldmVyeSBmb3JtIHNlY3Rpb24gaW5zdGVhZCwgd2hpY2ggaXMgdGhlIHByb3RlY3Rpb24gdGhhdCBhY3R1YWxseVxuICAgIC8vIGhvbGRzLiBgdGVzdC9hY3Rpdml0eS1yZWNlbmN5LnRlc3QudHNgIHByb3Zlc1xuICAgIC8vIHRoZSB3cml0ZSBsYW5kcyBcdTIwMTQgYW5kIGZhaWxzIGlmIHRoZSBmbGFnIGNvbWVzIGJhY2suXG4gICAgbGFzdF9hY3Rpdml0eV9kYXRlOiBGaWVsZC5kYXRlKHtcbiAgICAgIGxhYmVsOiAnTGFzdCBBY3Rpdml0eSBEYXRlJyxcbiAgICAgIGdyb3VwOiAnc3lzdGVtJyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDdXN0b21lciBTdWNjZXNzIC8gQWNjb3VudCBIZWFsdGggXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgdGllcjogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnQ3VzdG9tZXIgVGllcicsXG4gICAgICBncm91cDogJ293bmVyc2hpcCcsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdTdHJhdGVnaWMnLCAgdmFsdWU6ICdzdHJhdGVnaWMnLCAgY29sb3I6ICcjN0MzQUVEJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRW50ZXJwcmlzZScsIHZhbHVlOiAnZW50ZXJwcmlzZScsIGNvbG9yOiAnIzQxNjlFMScgfSxcbiAgICAgICAgeyBsYWJlbDogJ01pZC1NYXJrZXQnLCB2YWx1ZTogJ21pZF9tYXJrZXQnLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTTUInLCAgICAgICAgdmFsdWU6ICdzbWInLCAgICAgICAgY29sb3I6ICcjRkZBNTAwJywgZGVmYXVsdDogdHJ1ZSB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIHNlZ21lbnQ6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ1NlZ21lbnQnLFxuICAgICAgZ3JvdXA6ICdvd25lcnNoaXAnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnTmV0IE5ldycsICAgIHZhbHVlOiAnbmV0X25ldycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0dyb3d0aCcsICAgICB2YWx1ZTogJ2dyb3d0aCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0F0IFJpc2snLCAgICB2YWx1ZTogJ2F0X3Jpc2snIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdGFibGUnLCAgICAgdmFsdWU6ICdzdGFibGUnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgaGVhbHRoX3Njb3JlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdIZWFsdGggU2NvcmUnLFxuICAgICAgZ3JvdXA6ICdvd25lcnNoaXAnLFxuICAgICAgZGVzY3JpcHRpb246ICdDU00tbWFpbnRhaW5lZCBoZWFsdGggaW5kaWNhdG9yJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0hlYWx0aHknLCAgICB2YWx1ZTogJ2hlYWx0aHknLCAgICBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdXYXRjaGluZycsICAgdmFsdWU6ICd3YXRjaGluZycsICAgY29sb3I6ICcjRkZBNTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQXQgUmlzaycsICAgIHZhbHVlOiAnYXRfcmlzaycsICAgIGNvbG9yOiAnI0ZGNDUwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0NodXJuaW5nJywgICB2YWx1ZTogJ2NodXJuaW5nJywgICBjb2xvcjogJyNGRjAwMDAnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNkQ0IE5vIGFjY291bnQtbGV2ZWwgcmVuZXdhbCBtb2RlbCBoZXJlLCBvbiBwdXJwb3NlLiBSZW5ld2FsIGlzIGFcbiAgICAvLyBDT05UUkFDVC1sZXZlbCBwcm9jZXNzIHdpdGggZXhhY3RseSBvbmUgaG9tZSBcdTIwMTQgYGNybV9jb250cmFjdC5lbmRfZGF0ZWAgK1xuICAgIC8vIGByZW5ld2FsX25vdGljZV9kYXlzYCwgc3dlcHQgZGFpbHkgYnkgYHNyYy9yZXZlbnVlL2Zsb3dzL2NvbnRyYWN0LXJlbmV3YWwuZmxvdy50c2AsXG4gICAgLy8gd2hpY2ggYm9va3MgdGhlIHRhc2sgYW5kIG5vdGlmaWVzIHRoZSBDT05UUkFDVCBvd25lcjsgdGhlIHVzZXItZmFjaW5nXG4gICAgLy8gcXVldWUgaXMgdGhhdCBvYmplY3QncyBgcmVuZXdhbF9jYWxlbmRhcmAgdmlldy4gQSBgcmVuZXdhbF9vd25lcmAgL1xuICAgIC8vIGBuZXh0X3JlbmV3YWxfZGF0ZWAgcGFpciBoZXJlIHdvdWxkIGJlIGRlY2xhcmVkIGFuZCBpbmVydCwgdGVsbGluZyBhblxuICAgIC8vIGFkbWluIGEgcmVuZXdhbCByZWFjaGVzIHRoZSBDU00gdGhleSBuYW1lZCB3aGVuIG5vdGhpbmcgd291bGQuIElmIGFuXG4gICAgLy8gYWNjb3VudC1sZXZlbCByZW5ld2FsIG93bmVyIGlzIGV2ZXIgd2FudGVkLCBpdCBpcyBhIGNoYW5nZSB0byB0aGF0IGZsb3dcbiAgICAvLyBwbHVzIGEgcmVhbCB3cml0ZXIgZm9yIHRoZSBkYXRlIFx1MjAxNCBub3QgYSBzZWNvbmQgcGFpciBvZiBmaWVsZHMuXG4gIH0sXG4gIFxuICAvLyBEYXRhYmFzZSBpbmRleGVzIGZvciBwZXJmb3JtYW5jZVxuICAvL1xuICAvLyBcdTI2QTBcdUZFMEYgTm8gYHsgZmllbGRzOiBbJ25hbWUnXSwgdW5pcXVlOiB0cnVlIH1gIGhlcmUuIEFjY291bnQtbmFtZSB1bmlxdWVuZXNzIGlzXG4gIC8vIGRlY2xhcmVkIG9uIHRoZSBgbmFtZWAgZmllbGQgaXRzZWxmLCB3aGljaCB0aGUgZnJhbWV3b3JrIGJ1aWxkcyBhcyB0aGVcbiAgLy8gdGVuYW50IGNvbXBvc2l0ZSBgKG9yZ2FuaXphdGlvbl9pZCwgbmFtZSlgLiBEZWNsYXJpbmcgdGhlIHNpbmdsZS1jb2x1bW5cbiAgLy8gaW5kZXggdG9vIG1ha2VzIHRoZSBwbGF0Zm9ybS13aWRlIGNvbnN0cmFpbnQgd2luIGFuZCBsZWF2ZXMgdGhlIHBlci10ZW5hbnRcbiAgLy8gb25lIHVucmVhY2hhYmxlIChmcmFtZXdvcmsjMzk5MSBgdW5pcXVlL2RvdWJsZS1kZWNsYXJhdGlvbmApIFx1MjAxNCB0aGUgc2FtZVxuICAvLyB0cmFwIGBjcm1fY29udGFjdGAsIGBjcm1fbGVhZGAgYW5kIGBjcm1fcHJvZHVjdGAgZG9jdW1lbnQuIFR3b1xuICAvLyBvcmdhbml6YXRpb25zIG11c3QgYmUgYWJsZSB0byBlYWNoIGhhdmUgdGhlaXIgb3duIFwiQWNtZSBDb3JwXCIuXG4gIGluZGV4ZXM6IFtcbiAgICB7IGZpZWxkczogWydvd25lcl9pZCddIH0sXG4gICAgeyBmaWVsZHM6IFsndHlwZScsICdpc19hY3RpdmUnXSB9LFxuICAgIC8vIFRoZSB0ZXJyaXRvcnkgc2hhcmluZyBydWxlcyBmaWx0ZXIgb24gdGhpcyBjb2x1bW4sIHNvIGl0IGlzIHJlYWQgb24gZXZlcnlcbiAgICAvLyBhY2NvdW50IHF1ZXJ5IGEgdGVycml0b3J5IHJlY2lwaWVudCBtYWtlcy4gYGJpbGxpbmdfY291bnRyeWAgY2FycmllcyBub1xuICAgIC8vIGluZGV4IG9mIGl0cyBvd246IG5vdGhpbmcgZmlsdGVycyBvbiBpdCBcdTIwMTQgaXQgaXMgZGlzcGxheWVkLCBhbmQgY2xhc3NpZmllZFxuICAgIC8vIGludG8gdGhpcyBjb2x1bW4gYnkgdGhlIGhvb2suXG4gICAgeyBmaWVsZHM6IFsndGVycml0b3J5J10gfSxcbiAgICAvLyBMZWFkIGNvbnZlcnNpb24gZmlsdGVycyBvbiB0aGlzIGNvbHVtbiBvbiBldmVyeSBjb252ZXJzaW9uIFx1MjAxNCB0aGUgY29sdW1uXG4gICAgLy8gZXhpc3RzIHRvIHJlcGxhY2UgYW4gdW5pbmRleGVkIGAkcmVnZXhgIHNjYW4uIFBsYWluIGluZGV4LCBOT1RcbiAgICAvLyBgdW5pcXVlOiB0cnVlYCwgZGVsaWJlcmF0ZWx5OlxuICAgIC8vXG4gICAgLy8gMS4gUGVyLXRlbmFudCB1bmlxdWVuZXNzIG9mIGFjY291bnQgbmFtZXMgaXMgYWxyZWFkeSBkZWNsYXJlZCBvbiB0aGVcbiAgICAvLyAgICBgbmFtZWAgZmllbGQuIEEgdW5pcXVlIGBuYW1lX25vcm1hbGl6ZWRgIHdvdWxkIFNVQlNVTUUgaXQgKGVxdWFsIG5hbWVzXG4gICAgLy8gICAgbm9ybWFsaXplIGVxdWFsbHkpIGFuZCBmb3JjZSB0aGF0IGNvbnN0cmFpbnQgdG8gYmUgcmUtZGVjaWRlZC5cbiAgICAvLyAyLiBUaGlzIGNvbHVtbiBpcyBhIE1BVENIIGtleSwgbm90IGEgcG9saWN5LiBSZWplY3RpbmcgYSBuZWFyLWR1cGxpY2F0ZVxuICAgIC8vICAgIG5hbWUgb3V0cmlnaHQgaXMgYSBzZXBhcmF0ZSBkYXRhLXF1YWxpdHkgZGVjaXNpb24sIGFuZCB0aGlzIHJlcG8gaGFzXG4gICAgLy8gICAgYWxyZWFkeSBjaG9zZW4gdGhlIHNvZnQgc2hhcGUgZm9yIHRoYXQgcXVlc3Rpb24gb25jZSAodGhlIGhhcmQgdW5pcXVlXG4gICAgLy8gICAgb24gYGNybV9sZWFkLmVtYWlsYCB3YXMgcmVtb3ZlZCBiZWNhdXNlIHJlZnVzaW5nIGEgcmVwZWF0IGVucXVpcnkgaXNcbiAgICAvLyAgICB3b3JzZSB0aGFuIHJlY29yZGluZyBpdCkuXG4gICAgLy8gMy4gXHUyNkEwXHVGRTBGIE1lYXN1cmVkIGhhemFyZDogYGNyZWF0ZV9pbmRleGAgRkFJTFMgb24gYW55IGRlcGxveW1lbnQgYWxyZWFkeVxuICAgIC8vICAgIGhvbGRpbmcgYEFjbWUgQ29ycGAgYW5kIGBBQ01FICBDb3JwYCBzZXBhcmF0ZWx5LCBzbyBhIHVuaXF1ZSBpbmRleFxuICAgIC8vICAgIGNvdWxkIG5vdCBiZSBhbiB1cGdyYWRlIHN0ZXAgd2l0aG91dCBhIG1lcmdlIHBhc3MgZmlyc3QuIFRoYXQgaGF6YXJkXG4gICAgLy8gICAgaXMgYm91bmRlZCB0b2RheSBPTkxZIGJlY2F1c2UgdGhpcyByZXBvJ3MgZGVwbG95bWVudCBzaGFwZSBpcyBmcmVzaFxuICAgIC8vICAgIGluc3RhbGxzIFx1MjAxNCBzZWUgZG9jcy9NQUlOVEVOQU5DRS5tZCBcdTAwQTczLjMuIFRoZSBjb25jbHVzaW9uIGlzIGNvbmRpdGlvbmFsXG4gICAgLy8gICAgb24gdGhhdCBwcmVtaXNlLCBub3QgdW5pdmVyc2FsLlxuICAgIC8vXG4gICAgLy8gQ29uc2VxdWVuY2UsIHJlY29yZGVkIHJhdGhlciB0aGFuIGhpZGRlbjogdHdvIGFjY291bnRzIENBTiBzdGlsbCBob2xkIHRoZVxuICAgIC8vIHNhbWUgbm9ybWFsaXplZCBuYW1lIGlmIHNvbWV0aGluZyBvdXRzaWRlIHRoZSBmbG93IGNyZWF0ZXMgdGhlbSwgYW5kXG4gICAgLy8gYGdldF9yZWNvcmRgIGhhcyBubyBgc29ydGAgb3B0aW9uLCBzbyB0aGUgY29udmVyc2lvbiB3b3VsZCByZXVzZSBhblxuICAgIC8vIGFyYml0cmFyeSBvbmUuIFJldXNpbmcgb25lIG9mIE4gaXMgc3RpbGwgYmV0dGVyIHRoYW4gY3JlYXRpbmcgdGhlIE4rMXRoLlxuICAgIHsgZmllbGRzOiBbJ25hbWVfbm9ybWFsaXplZCddIH0sXG4gICAgLy8gYHNlYXJjaGFibGVGaWVsZHNgIGNhcnJpZXMgYHJlZ2lzdHJhdGlvbl9udW1iZXJgLCBhbmQgdGhlIG5vdGUgYXQgdGhlIHRvcFxuICAgIC8vIG9mIHRoaXMgZmlsZSByZWNvcmRzIHdoeSB0aG9zZSBtdXN0IGJlIHJlYWwsIGluZGV4ZWQgY29sdW1ucy5cbiAgICB7IGZpZWxkczogWydyZWdpc3RyYXRpb25fbnVtYmVyJ10gfSxcbiAgXSxcbiAgXG4gIC8vIEFQSSBzdXJmYWNlICsgY2FwYWJpbGl0aWVzLiBgZmlsZXNgIGFuZCBgZmVlZHNgIGFyZSBsaXZlIGFuZCBlbmZvcmNlZCAoc2VlXG4gIC8vIHRoZSBjYW5vbmljYWwgbm90ZSBpbiBgc3JjL3NhbGVzL29iamVjdHMvaW5kZXgudHNgKS4gRmllbGQgaGlzdG9yeSBsaXZlcyBvblxuICAvLyBpbmRpdmlkdWFsIGBGaWVsZC50cmFja0hpc3RvcnlgIChBRFItMDA1Mik7IGdsb2JhbCBzZWFyY2ggdXNlc1xuICAvLyBgc2VhcmNoYWJsZUZpZWxkc2AgLyBwZXItZmllbGQgYHNlYXJjaGFibGVgLlxuICBlbmFibGU6IHtcbiAgICBhcGlFbmFibGVkOiB0cnVlLCAgICAgICAvLyBFeHBvc2UgdmlhIFJFU1QvR3JhcGhRTFxuICAgIGFwaU1ldGhvZHM6IFsnZ2V0JywgJ2xpc3QnLCAnY3JlYXRlJywgJ3VwZGF0ZScsICdkZWxldGUnXSwgLy8gV2hpdGVsaXN0IGFsbG93ZWQgQVBJIG9wZXJhdGlvbnNcbiAgICAvLyBDb250cmFjdHMsIG9yZyBjaGFydHMgYW5kIFJGUHMgbGl2ZSBvbiB0aGUgYWNjb3VudCByZWNvcmQuIE9wdC1pbiAoc3BlY1xuICAgIC8vIGRlZmF1bHQgZmFsc2UpOyBhdHRhY2gvZG93bmxvYWQvZGVsZXRlIGF1dGhvcml0eSBpcyB0aGUgcGFyZW50IHJlY29yZCdzXG4gICAgLy8gb3duLCBzbyB0aGlzIGFkZHMgYSBzdXJmYWNlLCBub3QgYSBncmFudC5cbiAgICBmaWxlczogdHJ1ZSxcbiAgfSxcbiAgXG4gIC8vIFx1MjZBMFx1RkUwRiBObyBgd29ya2Zsb3dzW11gIGhlcmUsIGFuZCBub25lIGlzIHBvc3NpYmxlOiBvYmplY3QgYHdvcmtmbG93c1tdYCB3ZXJlXG4gIC8vIHJlbW92ZWQgZnJvbSB0aGUgcGxhdGZvcm0uIEZpZWxkIHVwZGF0ZXMgbGl2ZSBpbiB0aGlzIG9iamVjdCdzIGAqLmhvb2sudHNgO1xuICAvLyBzY2hlZHVsZWQgc3RhdHVzIGZsaXBzIGFuZCBub3RpZmljYXRpb25zIGxpdmUgaW4gYHNyYy8qL2Zsb3dzLyouZmxvdy50c2AuXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvX3BpY2tsaXN0cy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvX3BpY2tsaXN0cy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBTZWxlY3RPcHRpb24gfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcblxuLyoqXG4gKiBDYW5vbmljYWwgcGlja2xpc3QgdmFsdWUgc2V0cyBzaGFyZWQgYWNyb3NzIG9iamVjdHMsIGZsb3dzLCBhbmQgYWN0aW9ucy5cbiAqXG4gKiBTZXZlcmFsIGZpZWxkcyBjYXJyeSB0aGUgc2FtZSBidXNpbmVzcyB2b2NhYnVsYXJ5IG9uIG1vcmUgdGhhbiBvbmUgb2JqZWN0XG4gKiAoYGxlYWRfc291cmNlYCBvbiBMZWFkL0NvbnRhY3QvT3Bwb3J0dW5pdHksIGBpbmR1c3RyeWAgb24gTGVhZC9BY2NvdW50LFxuICogYHNhbHV0YXRpb25gIG9uIExlYWQvQ29udGFjdCwgYHBheW1lbnRfdGVybXNgIG9uIFF1b3RlL0NvbnRyYWN0KSwgYW5kIGEgZmV3XG4gKiBmbG93cy9hY3Rpb25zIHJlLWRlY2xhcmUgYW4gb2JqZWN0J3Mgb3duIG9wdGlvbnMgaW5saW5lIChUYXNrIGB0eXBlYCBpbiB0aGVcbiAqIHNjaGVkdWxlX2ZvbGxvd3VwIHNjcmVlbiwgT3Bwb3J0dW5pdHkgYHN0YWdlYCBpbiBtYXNzX3VwZGF0ZV9zdGFnZSkuIEVhY2hcbiAqIGNvcHkgZHJpZnRlZCBpbmRlcGVuZGVudGx5ICgjNDkwKTogdGhlIGxlYWRfY29udmVyc2lvbiBmbG93IGNvcGllc1xuICogYGxlYWRSZWNvcmQuaW5kdXN0cnlgIC8gYGxlYWRSZWNvcmQubGVhZF9zb3VyY2VgIHZlcmJhdGltIG9udG8gdGhlIGNyZWF0ZWRcbiAqIEFjY291bnQvT3Bwb3J0dW5pdHksIHNvIGFueSBMZWFkLW9ubHkgdmFsdWUgKGBsb2dpc3RpY3NgLCBgd2ViaW5hcmAsIFx1MjAyNilcbiAqIGJlY2FtZSBhbiBpbGxlZ2FsIGVudW0gdmFsdWUgb24gdGhlIHRhcmdldCBvYmplY3QuXG4gKlxuICogRGVjbGFyaW5nIHRoZSBzZXQgT05DRSBoZXJlIGFuZCBzcHJlYWRpbmcgaXQgaW50byBldmVyeSBkZWNsYXJhdGlvbiBrZWVwc1xuICogdGhlIHZvY2FidWxhcmllcyBpZGVudGljYWwgYnkgY29uc3RydWN0aW9uLiBDcm9zcy1vYmplY3QgY29waWVzIChmbG93cyxcbiAqIGNvbnZlcnNpb24gbWFwcGluZ3MpIGFyZSB0aGVuIGFsd2F5cyBsZWdhbC5cbiAqXG4gKiBOT1RFOiBzcHJlYWQgKGBbLi4uWF1gKSBhdCBldmVyeSB1c2Ugc2l0ZSBzbyBlYWNoIE9iamVjdFNjaGVtYSBnZXRzIGl0cyBvd25cbiAqIGFycmF5IGluc3RhbmNlIFx1MjAxNCBzY2hlbWFzIG11c3Qgbm90IGFsaWFzIG9uZSBhbm90aGVyJ3MgbWV0YWRhdGEuXG4gKi9cblxuLyoqIFNhbHV0YXRpb24gXHUyMDE0IExlYWQgKyBDb250YWN0LiBTdXBlcnNldCAoaW5jbC4gYHByb2ZgLCBmb3JtZXJseSBDb250YWN0LW9ubHkpLiAqL1xuZXhwb3J0IGNvbnN0IFNBTFVUQVRJT05fT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gIHsgbGFiZWw6ICdNci4nLCB2YWx1ZTogJ21yJyB9LFxuICB7IGxhYmVsOiAnTXMuJywgdmFsdWU6ICdtcycgfSxcbiAgeyBsYWJlbDogJ01ycy4nLCB2YWx1ZTogJ21ycycgfSxcbiAgeyBsYWJlbDogJ0RyLicsIHZhbHVlOiAnZHInIH0sXG4gIHsgbGFiZWw6ICdQcm9mLicsIHZhbHVlOiAncHJvZicgfSxcbl07XG5cbi8qKlxuICogSW5kdXN0cnkgXHUyMDE0IExlYWQgKyBBY2NvdW50LiBTdXBlcnNldCAoZm9ybWVybHkgMTUgb24gTGVhZCwgNiBvbiBBY2NvdW50KTtcbiAqIGxlYWRfY29udmVyc2lvbiBjb3BpZXMgYGxlYWRSZWNvcmQuaW5kdXN0cnlgIG9udG8gdGhlIGNyZWF0ZWQgQWNjb3VudCwgc29cbiAqIEFjY291bnQgTVVTVCBhY2NlcHQgZXZlcnkgTGVhZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IElORFVTVFJZX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnVGVjaG5vbG9neScsICAgICAgICAgIHZhbHVlOiAndGVjaG5vbG9neScgfSxcbiAgeyBsYWJlbDogJ1NvZnR3YXJlIC8gU2FhUycsICAgICB2YWx1ZTogJ3NvZnR3YXJlJyB9LFxuICB7IGxhYmVsOiAnRmluYW5jZScsICAgICAgICAgICAgIHZhbHVlOiAnZmluYW5jZScgfSxcbiAgeyBsYWJlbDogJ0hlYWx0aGNhcmUnLCAgICAgICAgICB2YWx1ZTogJ2hlYWx0aGNhcmUnIH0sXG4gIHsgbGFiZWw6ICdSZXRhaWwnLCAgICAgICAgICAgICAgdmFsdWU6ICdyZXRhaWwnIH0sXG4gIHsgbGFiZWw6ICdNYW51ZmFjdHVyaW5nJywgICAgICAgdmFsdWU6ICdtYW51ZmFjdHVyaW5nJyB9LFxuICB7IGxhYmVsOiAnRWR1Y2F0aW9uJywgICAgICAgICAgIHZhbHVlOiAnZWR1Y2F0aW9uJyB9LFxuICB7IGxhYmVsOiAnUmVhbCBFc3RhdGUnLCAgICAgICAgIHZhbHVlOiAncmVhbF9lc3RhdGUnIH0sXG4gIHsgbGFiZWw6ICdNZWRpYSAmIEVudGVydGFpbm1lbnQnLCB2YWx1ZTogJ21lZGlhJyB9LFxuICB7IGxhYmVsOiAnTG9naXN0aWNzJywgICAgICAgICAgIHZhbHVlOiAnbG9naXN0aWNzJyB9LFxuICB7IGxhYmVsOiAnSG9zcGl0YWxpdHknLCAgICAgICAgIHZhbHVlOiAnaG9zcGl0YWxpdHknIH0sXG4gIHsgbGFiZWw6ICdFbmVyZ3kgJiBVdGlsaXRpZXMnLCAgdmFsdWU6ICdlbmVyZ3knIH0sXG4gIHsgbGFiZWw6ICdHb3Zlcm5tZW50JywgICAgICAgICAgdmFsdWU6ICdnb3Zlcm5tZW50JyB9LFxuICB7IGxhYmVsOiAnTm9uLXByb2ZpdCcsICAgICAgICAgIHZhbHVlOiAnbm9ucHJvZml0JyB9LFxuICB7IGxhYmVsOiAnT3RoZXInLCAgICAgICAgICAgICAgIHZhbHVlOiAnb3RoZXInIH0sXG5dO1xuXG4vKipcbiAqIExlYWQgU291cmNlIFx1MjAxNCBMZWFkICsgQ29udGFjdCArIE9wcG9ydHVuaXR5LiBTdXBlcnNldCAoZm9ybWVybHkgMTIvNS82KTtcbiAqIGxlYWRfY29udmVyc2lvbiBjb3BpZXMgYGxlYWRSZWNvcmQubGVhZF9zb3VyY2VgIG9udG8gdGhlIGNyZWF0ZWRcbiAqIE9wcG9ydHVuaXR5LCBzbyBPcHBvcnR1bml0eSBNVVNUIGFjY2VwdCBldmVyeSBMZWFkIHZhbHVlLlxuICovXG5leHBvcnQgY29uc3QgTEVBRF9TT1VSQ0VfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gIHsgbGFiZWw6ICdXZWInLCAgICAgICAgICAgICB2YWx1ZTogJ3dlYicgfSxcbiAgeyBsYWJlbDogJ1JlZmVycmFsJywgICAgICAgIHZhbHVlOiAncmVmZXJyYWwnIH0sXG4gIHsgbGFiZWw6ICdFdmVudCAvIFRyYWRlIFNob3cnLCB2YWx1ZTogJ2V2ZW50JyB9LFxuICB7IGxhYmVsOiAnV2ViaW5hcicsICAgICAgICAgdmFsdWU6ICd3ZWJpbmFyJyB9LFxuICB7IGxhYmVsOiAnUGFydG5lcicsICAgICAgICAgdmFsdWU6ICdwYXJ0bmVyJyB9LFxuICB7IGxhYmVsOiAnQWR2ZXJ0aXNlbWVudCcsICAgdmFsdWU6ICdhZHZlcnRpc2VtZW50JyB9LFxuICB7IGxhYmVsOiAnUGFpZCBTZWFyY2gnLCAgICAgdmFsdWU6ICdwYWlkX3NlYXJjaCcgfSxcbiAgeyBsYWJlbDogJ1NvY2lhbCBNZWRpYScsICAgIHZhbHVlOiAnc29jaWFsJyB9LFxuICB7IGxhYmVsOiAnQ29udGVudCAvIEJsb2cnLCAgdmFsdWU6ICdjb250ZW50JyB9LFxuICB7IGxhYmVsOiAnQ29sZCBDYWxsJywgICAgICAgdmFsdWU6ICdjb2xkX2NhbGwnIH0sXG4gIHsgbGFiZWw6ICdFbWFpbCBDYW1wYWlnbicsICB2YWx1ZTogJ2VtYWlsX2NhbXBhaWduJyB9LFxuICB7IGxhYmVsOiAnT3RoZXInLCAgICAgICAgICAgdmFsdWU6ICdvdGhlcicgfSxcbl07XG5cbi8qKlxuICogUGF5bWVudCBUZXJtcyBcdTIwMTQgUXVvdGUgKyBDb250cmFjdC4gU3VwZXJzZXQgKGluY2wuIGBkdWVfb25fcmVjZWlwdGAsXG4gKiBmb3JtZXJseSBRdW90ZS1vbmx5KTogYW4gYWNjZXB0ZWQgcXVvdGUncyB0ZXJtcyBjYXJyeSBvdmVyIHRvIHRoZSBjb250cmFjdCxcbiAqIHNvIHRoZSBjb250cmFjdCB2b2NhYnVsYXJ5IG11c3QgY292ZXIgZXZlcnkgcXVvdGUgdmFsdWUuXG4gKlxuICogVGhlIGNhcnJ5LW92ZXIgaXMgYHF1b3RlX2FjY2VwdGVkX2NvbnRyYWN0X2RyYWZ0YCBpbiBgc3JjL3JldmVudWUvb2JqZWN0cy9xdW90ZS5ob29rLnRzYCwgbmFtZWRcbiAqIGhlcmUgYmVjYXVzZSB0aGlzIHJhdGlvbmFsZSBzcGVudCBpdHMgZmlyc3QgbW9udGhzIHVuZW5mb3JjZWQgKCM4NzMpOiB0aGVcbiAqIGhvb2sgZHJhZnRlZCB0aGUgY29udHJhY3Qgd2l0aG91dCBgcGF5bWVudF90ZXJtc2AsIHNvIGV2ZXJ5IGFjY2VwdGVkIHF1b3RlXG4gKiBwcm9kdWNlZCBhIGNvbnRyYWN0IG9uIHRoZSBgbmV0XzMwYCBvcHRpb24gZGVmYXVsdCBiZWxvdyByZWdhcmRsZXNzIG9mIHdoYXRcbiAqIHdhcyBuZWdvdGlhdGVkIFx1MjAxNCBhIHNoYXJlZCB2b2NhYnVsYXJ5IGp1c3RpZmllZCBieSBhIGNvcHkgdGhhdCBkaWQgbm90IGV4aXN0LlxuICogQSBjb21tZW50IHRoYXQgbmFtZXMgaXRzIGVuZm9yY2VyIGNhbiBiZSBjaGVja2VkOyB0aGlzIG9uZSBjb3VsZCBub3QgYmUuXG4gKi9cbmV4cG9ydCBjb25zdCBQQVlNRU5UX1RFUk1TX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnTmV0IDE1JywgdmFsdWU6ICduZXRfMTUnIH0sXG4gIHsgbGFiZWw6ICdOZXQgMzAnLCB2YWx1ZTogJ25ldF8zMCcsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBsYWJlbDogJ05ldCA2MCcsIHZhbHVlOiAnbmV0XzYwJyB9LFxuICB7IGxhYmVsOiAnTmV0IDkwJywgdmFsdWU6ICduZXRfOTAnIH0sXG4gIHsgbGFiZWw6ICdEdWUgb24gUmVjZWlwdCcsIHZhbHVlOiAnZHVlX29uX3JlY2VpcHQnIH0sXG5dO1xuXG4vKipcbiAqIFRhc2sgVHlwZSBcdTIwMTQgY3JtX3Rhc2sudHlwZSwgYWxzbyByZS1yZW5kZXJlZCBhcyB0aGUgYGFjdGl2aXR5VHlwZWAgc2VsZWN0IGluXG4gKiB0aGUgc2NoZWR1bGVfZm9sbG93dXAgc2NyZWVuIGZsb3cgKHdoaWNoIGhhZCBkcmlmdGVkIHRvIGEgNS12YWx1ZSBjb3B5XG4gKiBtaXNzaW5nIGBvdGhlcmApLlxuICovXG5leHBvcnQgY29uc3QgVEFTS19UWVBFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnQ2FsbCcsIHZhbHVlOiAnY2FsbCcgfSxcbiAgeyBsYWJlbDogJ0VtYWlsJywgdmFsdWU6ICdlbWFpbCcgfSxcbiAgeyBsYWJlbDogJ01lZXRpbmcnLCB2YWx1ZTogJ21lZXRpbmcnIH0sXG4gIHsgbGFiZWw6ICdGb2xsb3ctdXAnLCB2YWx1ZTogJ2ZvbGxvd191cCcgfSxcbiAgeyBsYWJlbDogJ0RlbW8nLCB2YWx1ZTogJ2RlbW8nIH0sXG4gIHsgbGFiZWw6ICdPdGhlcicsIHZhbHVlOiAnb3RoZXInIH0sXG5dO1xuXG4vKipcbiAqIE9wcG9ydHVuaXR5IFN0YWdlIFx1MjAxNCBjcm1fb3Bwb3J0dW5pdHkuc3RhZ2UsIGFsc28gcmUtcmVuZGVyZWQgYXMgdGhlIGBzdGFnZWBcbiAqIHBhcmFtIG9mIHRoZSBtYXNzX3VwZGF0ZV9zdGFnZSBhY3Rpb24uIENvbG9ycy9kZWZhdWx0IG9ubHkgbWF0dGVyIG9uIHRoZVxuICogb2JqZWN0IHNjaGVtYTsgdXNlIHtAbGluayBwbGFpbk9wdGlvbnN9IHdoZXJlIGEgc2NyZWVuL3BhcmFtIHNlbGVjdCB3YW50c1xuICogYmFyZSBsYWJlbC92YWx1ZSBwYWlycy5cbiAqL1xuZXhwb3J0IGNvbnN0IE9QUE9SVFVOSVRZX1NUQUdFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnUHJvc3BlY3RpbmcnLCB2YWx1ZTogJ3Byb3NwZWN0aW5nJywgY29sb3I6ICcjODA4MDgwJywgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IGxhYmVsOiAnUXVhbGlmaWNhdGlvbicsIHZhbHVlOiAncXVhbGlmaWNhdGlvbicsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgeyBsYWJlbDogJ05lZWRzIEFuYWx5c2lzJywgdmFsdWU6ICduZWVkc19hbmFseXNpcycsIGNvbG9yOiAnI0ZGRDcwMCcgfSxcbiAgeyBsYWJlbDogJ1Byb3Bvc2FsJywgdmFsdWU6ICdwcm9wb3NhbCcsIGNvbG9yOiAnIzQxNjlFMScgfSxcbiAgeyBsYWJlbDogJ05lZ290aWF0aW9uJywgdmFsdWU6ICduZWdvdGlhdGlvbicsIGNvbG9yOiAnIzkzNzBEQicgfSxcbiAgeyBsYWJlbDogJ0Nsb3NlZCBXb24nLCB2YWx1ZTogJ2Nsb3NlZF93b24nLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gIHsgbGFiZWw6ICdDbG9zZWQgTG9zdCcsIHZhbHVlOiAnY2xvc2VkX2xvc3QnLCBjb2xvcjogJyNGRjAwMDAnIH0sXG5dO1xuXG4vKipcbiAqIEV2ZW50IFR5cGUgXHUyMDE0IGNybV9ldmVudC50eXBlLCBhbmQgdGhlIGBraW5kYCBkaXNjcmltaW5hdG9yIHRoZSBwZXItb2JqZWN0XG4gKiBhY3Rpdml0eSBhY3Rpb25zIHN0YW1wIG9uIHRoZSBgY3JtX2V2ZW50YCByb3cgdGhleSBpbnNlcnQgKCM1OTIpLlxuICpcbiAqIERpc3RpbmN0IGZyb20ge0BsaW5rIFRBU0tfVFlQRV9PUFRJT05TfSBvbiBwdXJwb3NlOiBhIFRhc2sgaXMgc29tZXRoaW5nIGEgcmVwXG4gKiBzdGlsbCBvd2VzIHNvbWVvbmUsIGFuIEV2ZW50IGlzIGFuIGludGVyYWN0aW9uIHRoYXQgb2NjdXBpZXMgYSBzbG90IG9uIHRoZVxuICogY2FsZW5kYXIuIGBlbWFpbGAgaXMgdGhlcmVmb3JlIGFic2VudCBoZXJlIChhbiBlbWFpbCBpcyBub3QgYSBtZWV0aW5nIHNsb3Q7XG4gKiBpdCBzdGF5cyBhIGBzeXNfZW1haWxgICsgYHN5c19hY3Rpdml0eWAgcGFpcikgYW5kIGB3ZWJpbmFyYCAvIGBvbnNpdGVfdmlzaXRgXG4gKiBhcmUgcHJlc2VudCwgYmVjYXVzZSB0aG9zZSBhcmUgdGhlIG1lZXRpbmcgc2hhcGVzIGEgcmVwIGJvb2tzLlxuICovXG5leHBvcnQgY29uc3QgRVZFTlRfVFlQRV9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgeyBsYWJlbDogJ01lZXRpbmcnLCAgICAgIHZhbHVlOiAnbWVldGluZycsICAgICAgIGNvbG9yOiAnIzQxNjlFMScsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBsYWJlbDogJ0NhbGwnLCAgICAgICAgIHZhbHVlOiAnY2FsbCcsICAgICAgICAgIGNvbG9yOiAnIzAwQUEwMCcgfSxcbiAgeyBsYWJlbDogJ0RlbW8nLCAgICAgICAgIHZhbHVlOiAnZGVtbycsICAgICAgICAgIGNvbG9yOiAnIzkzNzBEQicgfSxcbiAgeyBsYWJlbDogJ1dlYmluYXInLCAgICAgIHZhbHVlOiAnd2ViaW5hcicsICAgICAgIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgeyBsYWJlbDogJ09uc2l0ZSBWaXNpdCcsIHZhbHVlOiAnb25zaXRlX3Zpc2l0JywgIGNvbG9yOiAnIzBFQTVFOScgfSxcbiAgeyBsYWJlbDogJ090aGVyJywgICAgICAgIHZhbHVlOiAnb3RoZXInLCAgICAgICAgIGNvbG9yOiAnIzgwODA4MCcgfSxcbl07XG5cbi8qKlxuICogRXZlbnQgU3RhdHVzIFx1MjAxNCBjcm1fZXZlbnQuc3RhdHVzLlxuICpcbiAqIFRoZSBgcGxhbm5lZGAgXHUyMTkyIGBoZWxkYCB0cmFuc2l0aW9uIGlzIHdoYXQgc2VwYXJhdGVzIFwiYSBtZWV0aW5nIGlzIGJvb2tlZFwiXG4gKiBmcm9tIFwiYW4gaW50ZXJhY3Rpb24gaGFwcGVuZWRcIiwgYW5kIG9ubHkgdGhlIHNlY29uZCBvbmUgYnVtcHNcbiAqIGBjcm1fYWNjb3VudC5sYXN0X2FjdGl2aXR5X2RhdGVgIChzZWUgYGV2ZW50Lmhvb2sudHNgKS4gV2l0aG91dCB0aGF0IHNwbGl0IGFcbiAqIG1lZXRpbmcgYm9va2VkIGZvciBuZXh0IHF1YXJ0ZXIgd291bGQgcmVzZXQgdGhlIGNodXJuIGNsb2NrIHRvZGF5LlxuICovXG5leHBvcnQgY29uc3QgRVZFTlRfU1RBVFVTX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnUGxhbm5lZCcsICAgdmFsdWU6ICdwbGFubmVkJywgICBjb2xvcjogJyM0MTY5RTEnLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbGFiZWw6ICdIZWxkJywgICAgICB2YWx1ZTogJ2hlbGQnLCAgICAgIGNvbG9yOiAnIzAwQUEwMCcgfSxcbiAgeyBsYWJlbDogJ0NhbmNlbGxlZCcsIHZhbHVlOiAnY2FuY2VsbGVkJywgY29sb3I6ICcjOTk5OTk5JyB9LFxuICB7IGxhYmVsOiAnTm8gU2hvdycsICAgdmFsdWU6ICdub19zaG93JywgICBjb2xvcjogJyNGRjQ1MDAnIH0sXG5dO1xuXG4vKipcbiAqIEF0dGVuZGVlIFJlc3BvbnNlIFx1MjAxNCBjcm1fZXZlbnRfYXR0ZW5kZWUucmVzcG9uc2UuXG4gKlxuICogVGhlIHJlYXNvbiBhdHRlbmRlZXMgYXJlIFJFQ09SRFMgcmF0aGVyIHRoYW4gYSBKU09OIHN0cmluZyBvbiB0aGUgYWN0aXZpdHlcbiAqICgjNTkyIGFjY2VwdGFuY2UpOiBhIHBlci1hdHRlbmRlZSByZXNwb25zZSBvbmx5IGV4aXN0cyBpZiB0aGUgYXR0ZW5kZWUgZG9lcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEFUVEVOREVFX1JFU1BPTlNFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnTm8gUmVzcG9uc2UnLCB2YWx1ZTogJ25vX3Jlc3BvbnNlJywgY29sb3I6ICcjODA4MDgwJywgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IGxhYmVsOiAnQWNjZXB0ZWQnLCAgICB2YWx1ZTogJ2FjY2VwdGVkJywgICAgY29sb3I6ICcjMDBBQTAwJyB9LFxuICB7IGxhYmVsOiAnRGVjbGluZWQnLCAgICB2YWx1ZTogJ2RlY2xpbmVkJywgICAgY29sb3I6ICcjRkYwMDAwJyB9LFxuICB7IGxhYmVsOiAnVGVudGF0aXZlJywgICB2YWx1ZTogJ3RlbnRhdGl2ZScsICAgY29sb3I6ICcjRkZBNTAwJyB9LFxuXTtcblxuLyoqXG4gKiBQb2x5bW9ycGhpYyBcIlJlbGF0ZWQgVG9cIiB0eXBlIFx1MjAxNCBjcm1fdGFzay5yZWxhdGVkX3RvX3R5cGUgYW5kXG4gKiBjcm1fZXZlbnQucmVsYXRlZF90b190eXBlLlxuICpcbiAqIEJvdGggYWN0aXZpdHkgb2JqZWN0cyBjYXJyeSB0aGUgc2FtZSBmaXZlIGByZWxhdGVkX3RvXypgIGxvb2t1cHMsIGFuZCBib3RoXG4gKiBob29rcyBidWJibGUgcmVjZW5jeSB0aHJvdWdoIHRoZSBzYW1lIGByZWxhdGVkX3RvX3R5cGUgXHUyMTkyIGxvb2t1cCBmaWVsZGAgbWFwLlxuICogRGVjbGFyZWQgb25jZSBzbyB0aGUgdm9jYWJ1bGFyeSBvZiB0aGUgZGlzY3JpbWluYXRvciBjYW5ub3QgZHJpZnQgZnJvbSB0aGVcbiAqIHNldCBvZiBsb29rdXBzIHRoYXQgYmFjayBpdCBcdTIwMTQgYSBkcmlmdCB0aGF0IHJlYWRzIGFzIFwidGhlIGJ1YmJsZSBzaWxlbnRseVxuICogc3RvcHBlZCBmaXJpbmcgZm9yIG9uZSBvYmplY3QgdHlwZVwiLlxuICovXG5leHBvcnQgY29uc3QgUkVMQVRFRF9UT19UWVBFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnQWNjb3VudCcsICAgICB2YWx1ZTogJ2NybV9hY2NvdW50JyB9LFxuICB7IGxhYmVsOiAnQ29udGFjdCcsICAgICB2YWx1ZTogJ2NybV9jb250YWN0JyB9LFxuICB7IGxhYmVsOiAnT3Bwb3J0dW5pdHknLCB2YWx1ZTogJ2NybV9vcHBvcnR1bml0eScgfSxcbiAgeyBsYWJlbDogJ0xlYWQnLCAgICAgICAgdmFsdWU6ICdjcm1fbGVhZCcgfSxcbiAgeyBsYWJlbDogJ0Nhc2UnLCAgICAgICAgdmFsdWU6ICdjcm1fY2FzZScgfSxcbl07XG5cbi8qKlxuICogRHVwbGljYXRlIE9mIFx1MjAxNCBjcm1fbGVhZC5kdXBsaWNhdGVfb2ZfdHlwZSwgdGhlIGRpc2NyaW1pbmF0b3IgaGFsZiBvZiB0aGVcbiAqIGBkdXBsaWNhdGVfb2ZfbGVhZGAgLyBgZHVwbGljYXRlX29mX2NvbnRhY3RgIHBhaXIgKCM1OTgpLlxuICpcbiAqIFR3byB2b2NhYnVsYXJpZXMsIGRlbGliZXJhdGVseSwgYW5kIHRoZSBzcGxpdCBpcyB0aGUgZW5mb3JjZW1lbnQ6XG4gKlxuICogICAtIHtAbGluayBEVVBMSUNBVEVfT0ZfVFlQRV9BVVRIT1JBQkxFX09QVElPTlN9IGlzIHdoYXQgYSBodW1hbiBtYXkgcGljay4gRWFjaFxuICogICAgIHZhbHVlIG5hbWVzIGFuIG9iamVjdCwgYW5kIGBsZWFkLm9iamVjdC50c2AgcGFpcnMgaXQgd2l0aCB0aGF0IG9iamVjdCdzXG4gKiAgICAgbG9va3VwIHRocm91Z2ggYHJlcXVpcmVkV2hlbmAsIHNvIGNob29zaW5nIG9uZSBkZW1hbmRzIGEgcmVjb3JkLlxuICogICAtIHtAbGluayBEVVBMSUNBVEVfT0ZfVFlQRV9PUFRJT05TfSBpcyB3aGF0IHRoZSBDT0xVTU4gbWF5IGhvbGQuIEl0IGlzIHRoZVxuICogICAgIGF1dGhvcmFibGUgc2V0IHBsdXMge0BsaW5rIERVUExJQ0FURV9PRl9UWVBFX0VSQVNFRH0sIGEgdG9tYnN0b25lIG5vXG4gKiAgICAgYXV0aG9yIHdyaXRlcy5cbiAqXG4gKiBUaGUgZm9ybSBzcHJlYWRzIHRoZSBhdXRob3JhYmxlIHNldCAoYHNyYy9zYWxlcy92aWV3cy9sZWFkLnZpZXcudHNgKSBhbmQgdGhlIG9iamVjdFxuICogc3ByZWFkcyB0aGUgZnVsbCBvbmUsIHNvIHRoZSB0b21ic3RvbmUgaXMgdW5waWNrYWJsZSBCWSBDT05TVFJVQ1RJT04gcmF0aGVyXG4gKiB0aGFuIGJ5IGEgaGFuZC1tYWludGFpbmVkIGV4Y2x1c2lvbiBsaXN0OiBhIGZvdXJ0aCBhdXRob3JhYmxlIG9iamVjdCB0eXBlXG4gKiBhZGRlZCBiZWxvdyByZWFjaGVzIHRoZSBmb3JtIGF1dG9tYXRpY2FsbHksIGFuZCB0aGUgdG9tYnN0b25lIG5ldmVyIGRvZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBEVVBMSUNBVEVfT0ZfVFlQRV9BVVRIT1JBQkxFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnTGVhZCcsICAgIHZhbHVlOiAnY3JtX2xlYWQnIH0sXG4gIHsgbGFiZWw6ICdDb250YWN0JywgdmFsdWU6ICdjcm1fY29udGFjdCcgfSxcbl07XG5cbi8qKlxuICogVGhlIHRvbWJzdG9uZSAoIzExNjQpOiBcInRoaXMgbGVhZCB3YXMgY29uZmlybWVkIGEgZHVwbGljYXRlIG9mIGEgcmVjb3JkIHRoYXRcbiAqIGhhcyBzaW5jZSBiZWVuIGVyYXNlZC5cIlxuICpcbiAqIEl0IGV4aXN0cyBiZWNhdXNlIG9uIHRoZSByZWNvcmQgXHUyMDE0IHdoaWNoIGlzIGFsbCBhIHZhbGlkYXRpb24gY2FuIHNlZSwgYmVpbmdcbiAqIGV2YWx1YXRlZCBhZ2FpbnN0IGB7Li4ucHJldmlvdXMsIC4uLmRhdGF9YCBcdTIwMTQgXCJ0aGUgcG9pbnRlciB3YXMgZXJhc2VkXCIgYW5kXG4gKiBcInRoaXMgY2xhaW0gbmV2ZXIgbmFtZWQgYW55b25lXCIgd2VyZSB0aGUgU0FNRSBzdGF0ZS4gRXZlcnkgd2F5IG9mIHRlYWNoaW5nIGFcbiAqIHJ1bGUgdG8gdG9sZXJhdGUgdGhlIGZpcnN0IGFsc28gYWRtaXR0ZWQgdGhlIHNlY29uZCwgd2hpY2ggaXMgd2h5IHRoZSBlcmFzdXJlXG4gKiBwYXRoIGNvdWxkIG5vdCBiZSBjbGVhcmVkIGJ5IHJlbGF4aW5nIGFueXRoaW5nIChtZWFzdXJlZCBpbiBmdWxsIG9uICMxMTY0KS5cbiAqIEdpdmluZyB0aGUgdHdvIHN0YXRlcyBkaWZmZXJlbnQgdmFsdWVzIG1ha2VzIHRoZW0gZGlmZmVyZW50IGZhY3RzLCBhbmQgdGhlblxuICogbm8gcnVsZSBoYXMgdG8gYmUgbG9vc2VuZWQgYXQgYWxsOiB0aGUgYHJlcXVpcmVkV2hlbmAgcGFpcmluZyBmaXJlcyBvbmx5IG9uXG4gKiBgY3JtX2xlYWRgIC8gYGNybV9jb250YWN0YCBzbyBpdCBuZXZlciBzZWVzIHRoaXMgdmFsdWUsIGFuZFxuICogYGR1cGxpY2F0ZV9kaXNxdWFsaWZpY2F0aW9uX3JlcXVpcmVzX3N1cnZpdm9yYCBhc2tzIGZvciBhIE5PTi1CTEFOSyB0eXBlLFxuICogd2hpY2ggdGhpcyBpcy5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbm90IGFuIG9iamVjdCBuYW1lOiBpdCBpcyB0aGUgYW5zd2VyIHRvIFwid2hpY2ggb2JqZWN0IGhvbGRzIHRoZVxuICogc3Vydml2b3JcIiB3aGVuIHRoZSBhbnN3ZXIgaXMgXCJub25lLCBhbnkgbW9yZVwiLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBgbGVhZF9kdXBsaWNhdGVfY2hlY2tgIChgbGVhZC5ob29rLnRzYCwgam9iIDFjKSBpcyB0aGUgT05MWSB3cml0ZXIsIGFuZCBpdFxuICogc3BlbGxzIHRoZSB2YWx1ZSBhcyBhbiBpbmxpbmUgbGl0ZXJhbCBcdTIwMTQgTDIgaG9vayBib2RpZXMgcnVuIGJvZHktb25seSBpbiB0aGVcbiAqIFF1aWNrSlMgc2FuZGJveCwgc28gYSBtb2R1bGUgY29uc3RhbnQgcmVzb2x2ZXMgYXQgYXV0aG9yaW5nIHRpbWUgYW5kIGFycml2ZXNcbiAqIGFzIGB1bmRlZmluZWRgIChzYW1lIGNvbnN0cmFpbnQgYXMgdGhlIFNMQSBtYXRyaXggaW4gYGNhc2UuaG9vay50c2ApLiBUaGUgdHdvXG4gKiBzcGVsbGluZ3MgYXJlIHBpbm5lZCB0b2dldGhlciwgYW5kIHRoZSB3cml0ZXIgcGlubmVkIHRvIHRoYXQgb25lIHNpdGUsIGJ5XG4gKiBgdGVzdC9sZWFkLWR1cGxpY2F0ZS1tYW5hZ2VtZW50LnRlc3QudHNgLlxuICovXG5leHBvcnQgY29uc3QgRFVQTElDQVRFX09GX1RZUEVfRVJBU0VEID0gJ2VyYXNlZCc7XG5cbi8qKiBUaGUgZnVsbCBjb2x1bW4gdm9jYWJ1bGFyeTogd2hhdCBhbiBhdXRob3IgbWF5IHBpY2ssIHBsdXMgdGhlIHRvbWJzdG9uZS4gKi9cbmV4cG9ydCBjb25zdCBEVVBMSUNBVEVfT0ZfVFlQRV9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgLi4uRFVQTElDQVRFX09GX1RZUEVfQVVUSE9SQUJMRV9PUFRJT05TLFxuICB7IGxhYmVsOiAnRXJhc2VkIFJlY29yZCcsIHZhbHVlOiBEVVBMSUNBVEVfT0ZfVFlQRV9FUkFTRUQgfSxcbl07XG5cbi8qKiBQcm9qZWN0IGEgY2Fub25pY2FsIHNldCBkb3duIHRvIGJhcmUgYHsgbGFiZWwsIHZhbHVlIH1gIHBhaXJzIGZvciBmbG93XG4gKiBzY3JlZW5zIGFuZCBhY3Rpb24gcGFyYW1zLCB3aGljaCBkb24ndCB1bmRlcnN0YW5kIGNvbG9yL2RlZmF1bHQga2V5cy4gKi9cbmV4cG9ydCBjb25zdCBwbGFpbk9wdGlvbnMgPSAob3B0aW9uczogU2VsZWN0T3B0aW9uW10pOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdID0+XG4gIG9wdGlvbnMubWFwKCh7IGxhYmVsLCB2YWx1ZSB9KSA9PiAoeyBsYWJlbCwgdmFsdWUgfSkpO1xuXG4vKipcbiAqIE5lZWQgVHlwZSBcdTIwMTQgYGNybV9sZWFkLm5lZWRfdHlwZWAsIHRoZSBhbnN3ZXIgdG8gXCJ3aGF0IGlzIHRoaXMgcHJvc3BlY3RcbiAqIGFza2luZyBmb3JcIiAoUkVRLTAwMDUgc3RlcCA2LCBcdTk3MDBcdTZDNDJcdTdDN0JcdTU3OEIpLlxuICpcbiAqIEEgR0VORVJJQyBTVEFSVEVSIFNFVCwgYW5kIHRoYXQgaXMgdGhlIGRpc3Bvc2l0aW9uIHJhdGhlciB0aGFuIGFuIGFwb2xvZ3lcbiAqIGZvciBhIHNob3J0IGxpc3Q6IFJFUS0wMDA1IHJ1bGVzIHRoZSAqc2xvdCogc3RhbmRhcmQgYW5kIHRoZSAqdmFsdWVzKlxuICogY29uZmlndXJhdGlvbiBcdTIwMTQgXCJhIGN1c3RvbWVyJ3Mgb3duIGRlbWFuZCB0YXhvbm9teSBpcyBvdmVybGF5IGNvbmZpZ3VyYXRpb25cbiAqIHRoZSBzYW1lIHdheSBgaW5kdXN0cnlgIHZhbHVlcyBhcmVcIi4gU28gdGhlc2Ugc2V2ZW4gYXJlIHRoZSB2b2NhYnVsYXJ5IGFcbiAqIGZyZXNoIGluc3RhbGwgcm91dGVzIGFuZCByZXBvcnRzIG9uIHVudGlsIGFuIG92ZXJsYXkgcmVwbGFjZXMgdGhlbSwgYW5kXG4gKiByZXBsYWNpbmcgdGhlbSBpcyBhIG9uZS1zaXRlIGVkaXQgYmVjYXVzZSB0aGUgc2V0IGlzIGRlY2xhcmVkIGhlcmUuXG4gKlxuICogXHUyNkEwXHVGRTBGIE5PVCB0aGUgc2FtZSBheGlzIGFzIGBjcm1fb3Bwb3J0dW5pdHkudHlwZWAsIGFuZCBcdTI2RDQgbmV2ZXIgZm9sZGVkIGludG8gaXQuXG4gKiBUaGF0IGZpZWxkIGFuc3dlcnMgXCJpcyB0aGlzIG5ldyBidXNpbmVzcywgYW4gdXBncmFkZSwgYSByZW5ld2FsIG9yIGFuXG4gKiBleHBhbnNpb25cIiBcdTIwMTQgdGhlIGN1c3RvbWVyIFJFTEFUSU9OU0hJUCB0aGUgZGVhbCBjaGFuZ2VzLiBUaGlzIG9uZSBhbnN3ZXJzXG4gKiB3aGF0IHRoZSBidXllciB3YW50cyBkZWxpdmVyZWQsIHdoaWNoIGlzIG9ydGhvZ29uYWw6IGEgcmVuZXdhbCBvZiBhIHN1cHBvcnRcbiAqIGNvbnRyYWN0IGFuZCBhIHJlbmV3YWwgb2YgYSBjb25zdWx0aW5nIGVuZ2FnZW1lbnQgZGlmZmVyIGhlcmUgYW5kIG5vdCB0aGVyZS5cbiAqIFRoZXkgYXJlIGRlbGliZXJhdGVseSBub3Qgc2hhcmVkLCBzbyBcdTI2RDQgZG8gbm90IHNwcmVhZCB0aGlzIHNldCBvbnRvXG4gKiBgY3JtX29wcG9ydHVuaXR5YCB0byBtYWtlIGEgY29udmVyc2lvbiBtYXBwaW5nIHBvc3NpYmxlLlxuICpcbiAqIFNJTkdMRS12YWx1ZWQsIGZvciB0aGUgcmVhc29uIGBjcm1fY29udGFjdC5idXlpbmdfZnVuY3Rpb25gIHJlY29yZHM6IGFcbiAqIGdyb3VwZWQgbGlzdCB2aWV3IGFuc3dlcnMgd2l0aCBvbmUgc2VydmVyLXNpZGUgYWdncmVnYXRlIHBlciByYXcgc3RvcmVkXG4gKiB2YWx1ZSwgc28gYSBgbXVsdGlwbGU6IHRydWVgIGNvbHVtbiBncm91cHMgYnkgdGhlIENPTUJJTkFUSU9OIGFuZCBsb3NlcyB0aGVcbiAqIGdyb3VwYWJpbGl0eSBSRVEtMDAwNSBhY2NlcHRhbmNlIDEgYXNrcyBmb3IuXG4gKi9cbmV4cG9ydCBjb25zdCBMRUFEX05FRURfVFlQRV9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgeyBsYWJlbDogJ05ldyBJbXBsZW1lbnRhdGlvbicsICAgdmFsdWU6ICduZXdfaW1wbGVtZW50YXRpb24nIH0sXG4gIHsgbGFiZWw6ICdFeHBhbnNpb24nLCAgICAgICAgICAgIHZhbHVlOiAnZXhwYW5zaW9uJyB9LFxuICB7IGxhYmVsOiAnUmVwbGFjZW1lbnQnLCAgICAgICAgICB2YWx1ZTogJ3JlcGxhY2VtZW50JyB9LFxuICB7IGxhYmVsOiAnUmVuZXdhbCcsICAgICAgICAgICAgICB2YWx1ZTogJ3JlbmV3YWwnIH0sXG4gIHsgbGFiZWw6ICdDb25zdWx0aW5nJywgICAgICAgICAgIHZhbHVlOiAnY29uc3VsdGluZycgfSxcbiAgeyBsYWJlbDogJ1N1cHBvcnQgJiBNYWludGVuYW5jZScsIHZhbHVlOiAnc3VwcG9ydCcgfSxcbiAgeyBsYWJlbDogJ090aGVyJywgICAgICAgICAgICAgICAgdmFsdWU6ICdvdGhlcicgfSxcbl07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL190ZXJyaXRvcnkudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL190ZXJyaXRvcnkudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgU2VsZWN0T3B0aW9uIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5cbi8qKlxuICogVGVycml0b3J5IFx1MjAxNCB0aGUgT05FIHBsYWNlIHRoZSBjb3VudHJ5LXRvLXRlcnJpdG9yeSBtYXBwaW5nIGlzIGF1dGhvcmVkLlxuICpcbiAqIFx1MjZENCBUZXJyaXRvcnkgaXMgYSBkZWNsYXJlZCBgc2VsZWN0YCBvbiBgY3JtX2FjY291bnRgLCBkZXJpdmVkIGZyb20gdGhlIGJpbGxpbmdcbiAqIGNvdW50cnkgYnkgYGFjY291bnRfcHJvdGVjdGlvbmAsIGFuZCB0aGUgc2hhcmluZyBydWxlcyBjb21wYXJlXG4gKiBgcmVjb3JkLnRlcnJpdG9yeWAgYWdhaW5zdCBhIGRlY2xhcmVkIHZhbHVlLiBBIGNvdW50cnkgc3RyaW5nIGlzIG5ldmVyXG4gKiBjb21wYXJlZCBhZ2Fpbi4gTWF0Y2hpbmcgZnJlZSB0ZXh0IGluc2lkZSBhIENFTCBjb25kaXRpb24gZmFpbHMgZm91ciB3YXlzLFxuICogYWxsIG9mIHRoZW0gc2lsZW50OiBhbiBhY2NvdW50IHdob3NlIGNvdW50cnkgcmVhZHMgYFVuaXRlZCBTdGF0ZXNgIHJhdGhlclxuICogdGhhbiBgVVNgIGxhbmRzIGluIE5PIHRlcnJpdG9yeSB3aXRoIG5vdGhpbmcgZXJyb3JlZDsgYWRkaW5nIGEgY291bnRyeSBtZWFuc1xuICogZWRpdGluZyBhIENFTCBzdHJpbmcgQU5EIHRocmVlIGxvY2FsaXNlZCB0YWJsZXMgd2l0aCBub3RoaW5nIHRvIGZhaWwgaWYgeW91XG4gKiBlZGl0IGZld2VyIHRoYW4gYWxsIGZvdXI7IGEgd3JvbmcgY29kZSAoYFVLYCBmb3IgYEdCYCkgY2Fubm90IGJlIGNvcnJlY3RlZFxuICogd2l0aG91dCBldmljdGluZyBldmVyeSBhY2NvdW50IGFscmVhZHkgdHlwZWQgdGhhdCB3YXk7IGFuZCBmcmVlIHRleHQgaGFzIG5vXG4gKiBlbnVtZXJhYmxlIERPTUFJTiwgc28gbm8gYXV0aG9yaW5nIHN1cmZhY2UsIGltcG9ydCBtYXBwaW5nIG9yIGdlbmVyYXRlZCBzZWVkXG4gKiBjYW4gYmUgY2hlY2tlZCBhZ2FpbnN0IGl0LlxuICpcbiAqICMjIyBUaGUgdGhyZWUgYXV0aG9yZWQgdGFibGVzLCBhbmQgZXZlcnl0aGluZyBkZXJpdmVkIGZyb20gdGhlbVxuICpcbiAqIHtAbGluayBURVJSSVRPUllfT1BUSU9OU30gKHRoZSBwaWNrbGlzdCksIHtAbGluayBURVJSSVRPUllfQ09VTlRSSUVTfSAod2hpY2hcbiAqIGNvdW50cmllcyBhIHRlcnJpdG9yeSBjb3ZlcnMpIGFuZCB7QGxpbmsgQ09VTlRSWV9BTElBU0VTfSAoaG93IGVsc2UgYSBjb3VudHJ5XG4gKiBtYXkgYmUgc3BlbGxlZCkgYXJlIEFVVEhPUkVELiB7QGxpbmsgQ09VTlRSWV9URVJSSVRPUll9IGFuZFxuICoge0BsaW5rIHRlcnJpdG9yeUZvcn0gYXJlIERFUklWRUQgZnJvbSB0aGVtLCBhbmQgc28gYXJlIHRoZSBzaGFyaW5nIHJ1bGVcbiAqIGNvbmRpdGlvbnMsIHRoZSBhY2NvdW50IGZvcm0ncyBwaWNrbGlzdCBhbmQgdGhlIGRvY3VtZW50YXRpb24gdGFibGVzIFx1MjAxNCBzZWVcbiAqIGB0ZXN0L3RlcnJpdG9yeS1zaW5nbGUtc291cmNlLnRlc3QudHNgLCB3aGljaCBwaW5zIGV2ZXJ5IGRlcml2YXRpb24uXG4gKlxuICogIyMjIFx1MjZBMFx1RkUwRiBXaHkgYGFjY291bnQuaG9vay50c2Agc3RpbGwgY2FycmllcyBhIGNvcHkgb2YgdGhpcyBtYXBcbiAqXG4gKiBJdCBoYXMgdG8uIEEgaG9vayBoYW5kbGVyIGlzIGxvd2VyZWQgdG8gYSBtZXRhZGF0YS1vbmx5IGBib2R5LnNvdXJjZWAgYW5kXG4gKiBldmFsdWF0ZWQgaW5zaWRlIFF1aWNrSlMgd2l0aCBOTyBtb2R1bGUgc2NvcGU6IGEgcmVmZXJlbmNlIHRvIGFueXRoaW5nXG4gKiBleHBvcnRlZCBoZXJlIGlzIG5vdCBhIGNsb3N1cmUgYXQgcnVudGltZSwgaXQgaXMgYSBgUmVmZXJlbmNlRXJyb3JgLlxuICogYGV4dHJhY3RIb29rQm9keWAgcmVqZWN0cyBzdWNoIGEgaGFuZGxlciBvdXRyaWdodFxuICogKGBkZXRlY3RGcmVlSWRlbnRpZmllcnNgKSwgYW5kIGB0ZXN0L2FjdGlvbi1zYW5kYm94LnRlc3QudHNgIGZhaWxzIHRoZVxuICogYnVpbGQncyBvd24gbG93ZXJpbmcgcGFzcyBmb3IgZXZlcnkgcmVnaXN0ZXJlZCBob29rLiBTbyB0aGUgZGVyaXZhdGlvbiBjYW5ub3RcbiAqIGltcG9ydCB0aGlzIG1vZHVsZSBcdTIwMTQgdGhlIHRhYmxlIGhhcyB0byBiZSBpbmxpbmUgaW4gdGhlIGhhbmRsZXIuXG4gKlxuICogYHRlc3QvdGVycml0b3J5LXNpbmdsZS1zb3VyY2UudGVzdC50c2AgY2xvc2VzIHRoYXQgZ2FwIGZyb20gYm90aCBkaXJlY3Rpb25zOlxuICogaXQgcGFyc2VzIHRoZSBpbmxpbmUgdGFibGUgb3V0IG9mIHRoZSBMT1dFUkVEIGJvZHkgc291cmNlIGFuZCBhc3NlcnRzIGRlZXBcbiAqIGVxdWFsaXR5IHdpdGgge0BsaW5rIENPVU5UUllfVEVSUklUT1JZfSAoc28gYSBjb3VudHJ5IGFkZGVkIHRvIGVpdGhlciBzaWRlXG4gKiBhbG9uZSBpcyByZWQpLCBhbmQgaXQgcnVucyB0aGUgcmVhbCBib2R5IGluIHRoZSByZWFsIHNhbmRib3ggb3ZlciBldmVyeVxuICogZGVjbGFyZWQgc3BlbGxpbmcgYW5kIGFzc2VydHMgdGhlIHRlcnJpdG9yeSBpdCBwcm9kdWNlcy4gVGhlIG1hcCBpcyB0aGVyZWZvcmVcbiAqIGF1dGhvcmVkIG9uY2UgZXZlbiB0aG91Z2ggaXQgaXMgc3RvcmVkIHR3aWNlLlxuICpcbiAqICMjIyBTY29wZSBvZiB0aGUgY291bnRyeSBsaXN0XG4gKlxuICogVGhpcyBpcyBhIFNQRUxMSU5HIHRhYmxlIGZvciB0aGUgY291bnRyaWVzIHRoZSB0d28gc3RhZmZlZCB0ZXJyaXRvcmllcyBjb3ZlcixcbiAqIG5vdCBhIHdvcmxkIGNvdW50cnkgbGlzdC4gVGhlIHZhbHVlIGRvbWFpbiBpcyBgbmFgIC8gYGVtZWFgIC8gYG90aGVyYDtcbiAqIGV2ZXJ5dGhpbmcgZWxzZSBcdTIwMTQgYFNHYCwgYEpQYCwgYW4gZW1wdHkgYWRkcmVzcyBcdTIwMTQgaXMgYG90aGVyYCwgZXhwbGljaXRseS5cbiAqL1xuXG4vKiogVGhlIGRlY2xhcmVkIHRlcnJpdG9yeSBkb21haW4uIGBvdGhlcmAgaXMgYSBzdGF0ZWQgZmFjdCwgbmV2ZXIgYSBibGFuay4gKi9cbmV4cG9ydCB0eXBlIFRlcnJpdG9yeSA9ICduYScgfCAnZW1lYScgfCAnb3RoZXInO1xuXG4vKipcbiAqIFRoZSBzdG9yZWQgdmFsdWVzLCBuYW1lZC4gRXZlcnkgb3RoZXIgZGVjbGFyYXRpb24gaW4gdGhlIHJlcG8gdGhhdCBuZWVkcyBvbmVcbiAqIHNwZWxscyBpdCB0aHJvdWdoIGhlcmUgXHUyMDE0IGluY2x1ZGluZyB0aGUgc2hhcmluZyBydWxlIGNvbmRpdGlvbnMsIHdoZXJlIGBQYFxuICogcXVvdGVzIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUgKGByZWNvcmQudGVycml0b3J5ID09IFwibmFcImApLCBzbyBhIHJlbmFtZSBvZiBhXG4gKiB0ZXJyaXRvcnkgdmFsdWUgY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIHBpY2tsaXN0IGFuZCBtaXNzZWQgaW4gdGhlIHJ1bGVzLlxuICovXG5leHBvcnQgY29uc3QgVEVSUklUT1JZOiBSZWNvcmQ8J05BJyB8ICdFTUVBJyB8ICdPVEhFUicsIFRlcnJpdG9yeT4gPSB7XG4gIE5BOiAnbmEnLFxuICBFTUVBOiAnZW1lYScsXG4gIE9USEVSOiAnb3RoZXInLFxufTtcblxuLyoqXG4gKiBUaGUgYWNjb3VudCBwaWNrbGlzdC4gYG90aGVyYCBpcyBkZWxpYmVyYXRlbHkgYSBWQUxVRSBhbmQgbm90IGFuIGVtcHR5XG4gKiBzdHJpbmc6IFwidGhpcyBhY2NvdW50IGJlbG9uZ3MgdG8gbm8gdGVycml0b3J5XCIgYW5kIFwibm9ib2R5IGZpbGxlZCB0aGlzIGluXCJcbiAqIGFyZSBkaWZmZXJlbnQgZmFjdHMsIGFuZCBmcmVlIHRleHQgY291bGQgbm90IHRlbGwgdGhlbSBhcGFydCAoIzYzOSkuXG4gKi9cbmV4cG9ydCBjb25zdCBURVJSSVRPUllfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gIHsgbGFiZWw6ICdOb3J0aCBBbWVyaWNhJywgdmFsdWU6IFRFUlJJVE9SWS5OQSwgY29sb3I6ICcjMDA3MEQyJyB9LFxuICB7IGxhYmVsOiAnRU1FQScsIHZhbHVlOiBURVJSSVRPUlkuRU1FQSwgY29sb3I6ICcjN0MzQUVEJyB9LFxuICB7IGxhYmVsOiAnT3RoZXInLCB2YWx1ZTogVEVSUklUT1JZLk9USEVSLCBjb2xvcjogJyM5OTk5OTknIH0sXG5dO1xuXG4vKiogVGhlIHRlcnJpdG9yeSBldmVyeSB1bm1hcHBlZCBjb3VudHJ5IGZhbGxzIGludG8uICovXG5leHBvcnQgY29uc3QgVEVSUklUT1JZX0ZBTExCQUNLOiBUZXJyaXRvcnkgPSBURVJSSVRPUlkuT1RIRVI7XG5cbi8qKlxuICogV2hpY2ggY291bnRyaWVzIGVhY2ggc3RhZmZlZCB0ZXJyaXRvcnkgY292ZXJzLCBieSBJU08gMzE2Ni0xIGFscGhhLTIgY29kZS5cbiAqXG4gKiBgb3RoZXJgIGlzIGFic2VudCBvbiBwdXJwb3NlIFx1MjAxNCBpdCBpcyB0aGUgRkFMTEJBQ0ssIHJlYWNoZWQgYnkgZXZlcnkgY291bnRyeVxuICogbm90IG5hbWVkIGhlcmUsIHNvIGxpc3RpbmcgY291bnRyaWVzIHVuZGVyIGl0IHdvdWxkIGJlIGEgc2Vjb25kIHdheSB0byBzYXlcbiAqIHRoZSBzYW1lIHRoaW5nLiBUaGUgZG9jdW1lbnRhdGlvbiB0YWJsZXMgcmVuZGVyIHRoaXMgcmVjb3JkIHBsdXMgb25lIHJvd1xuICogc3RhdGluZyB0aGUgZmFsbGJhY2suXG4gKi9cbmV4cG9ydCBjb25zdCBURVJSSVRPUllfQ09VTlRSSUVTOiBSZWNvcmQ8RXhjbHVkZTxUZXJyaXRvcnksICdvdGhlcic+LCByZWFkb25seSBzdHJpbmdbXT4gPSB7XG4gIG5hOiBbJ1VTJywgJ0NBJywgJ01YJ10sXG4gIGVtZWE6IFsnR0InLCAnREUnLCAnRlInLCAnSVQnLCAnRVMnXSxcbn07XG5cbi8qKlxuICogQWNjZXB0ZWQgYWx0ZXJuYXRpdmUgc3BlbGxpbmdzLCBtYXBwZWQgdG8gdGhlIGNhbm9uaWNhbCBjb2RlLlxuICpcbiAqIEF1dGhvcmVkIGluIERJU1BMQVkgZm9ybSAoYFVuaXRlZCBTdGF0ZXNgLCBub3QgYFVOSVRFRCBTVEFURVNgKSBiZWNhdXNlIHRoaXNcbiAqIGlzIHdoYXQgdGhlIGRvY3VtZW50YXRpb24gdGFibGVzIHJlbmRlciBcdTIwMTQge0BsaW5rIENPVU5UUllfVEVSUklUT1JZfSBhcHBsaWVzXG4gKiB7QGxpbmsgbm9ybWFsaXplQ291bnRyeX0gd2hlbiBpdCBmbGF0dGVucyB0aGVtLCBzbyB0aGUgbG9va3VwIGlzXG4gKiBjYXNlLWluc2Vuc2l0aXZlIHdpdGhvdXQgdGhlIGF1dGhvcmVkIHRhYmxlIGhhdmluZyB0byBiZSBzaG91dGVkLlxuICpcbiAqIGBVSyAtPiBHQmAgaXMgZGVsaWJlcmF0ZTogYFVLYCBpcyBub3QgdGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb2RlIGZvciB0aGVcbiAqIFVuaXRlZCBLaW5nZG9tLCBidXQgdGhlIHN0b2NrIExvbmRvbiBhY2NvdW50IGFuZCBldmVyeSBjdXN0b21lciByZWNvcmQgdHlwZWRcbiAqIHRoZSBzYW1lIHdheSBtdXN0IGtlZXAgbGFuZGluZyBpbiBgZW1lYWAuIEJlY2F1c2UgdGhlIHJ1bGVzIG5vIGxvbmdlciBjb21wYXJlXG4gKiBhIGNvdW50cnkgYXQgYWxsLCBgR0JgIGNhbiBiZSBjYW5vbmljYWwgQU5EIGBVS2AgY2FuIGtlZXAgd29ya2luZy5cbiAqXG4gKiBFbmdsaXNoIG5hbWVzIGFyZSBoZXJlIGJlY2F1c2UgdGhleSBhcmUgd2hhdCBhIENTViBpbXBvcnQsIGEgZ2VuZXJhdGVkIHNlZWRcbiAqIG9yIGEgcGVyc29uIHR5cGluZyBpbnRvIHRoZSBhZGRyZXNzIGZvcm0gYWN0dWFsbHkgcHJvZHVjZXMuIE5hdGl2ZS1sYW5ndWFnZVxuICogc3BlbGxpbmdzIGFyZSBOT1Q6IHRoZXkgYXJlIHVuYm91bmRlZCwgYW5kIHRoZSBmYWlsdXJlIHRoZXkgd291bGQgcHJldmVudCBpc1xuICogbm93IHZpc2libGUgKGBvdGhlcmApIHJhdGhlciB0aGFuIHNpbGVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IENPVU5UUllfQUxJQVNFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ1VuaXRlZCBTdGF0ZXMnOiAnVVMnLFxuICAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJzogJ1VTJyxcbiAgVVNBOiAnVVMnLFxuICBDYW5hZGE6ICdDQScsXG4gIE1leGljbzogJ01YJyxcbiAgVUs6ICdHQicsXG4gICdVbml0ZWQgS2luZ2RvbSc6ICdHQicsXG4gICdHcmVhdCBCcml0YWluJzogJ0dCJyxcbiAgR2VybWFueTogJ0RFJyxcbiAgRnJhbmNlOiAnRlInLFxuICBJdGFseTogJ0lUJyxcbiAgU3BhaW46ICdFUycsXG59O1xuXG4vKipcbiAqIEV2ZXJ5IGFjY2VwdGVkIHNwZWxsaW5nIHRvIGl0cyB0ZXJyaXRvcnkgXHUyMDE0IHRoZSBmbGF0dGVuZWQgZm9ybSB0aGUgaG9vayBib2R5XG4gKiBjYXJyaWVzIGlubGluZSBhbmQgYHRlc3QvdGVycml0b3J5LXNpbmdsZS1zb3VyY2UudGVzdC50c2AgcGlucyBpdCBhZ2FpbnN0LlxuICpcbiAqIERlcml2ZWQsIG5ldmVyIGF1dGhvcmVkOiBhZGQgYSBjb3VudHJ5IHRvIHtAbGluayBURVJSSVRPUllfQ09VTlRSSUVTfSBvciBhXG4gKiBzcGVsbGluZyB0byB7QGxpbmsgQ09VTlRSWV9BTElBU0VTfSBhbmQgaXQgYXBwZWFycyBoZXJlLCBpbiB0aGUgZG9jcyB0YWJsZXNcbiAqIGFuZCAob25jZSB0aGUgaG9vaydzIGlubGluZSBjb3B5IGlzIHVwZGF0ZWQsIHdoaWNoIHRoZSBwaW4gdGVzdCBmb3JjZXMpIGluXG4gKiB0aGUgZGVyaXZhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IENPVU5UUllfVEVSUklUT1JZOiBSZWNvcmQ8c3RyaW5nLCBUZXJyaXRvcnk+ID0gKCgpID0+IHtcbiAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBUZXJyaXRvcnk+ID0ge307XG4gIGZvciAoY29uc3QgW3RlcnJpdG9yeSwgY291bnRyaWVzXSBvZiBPYmplY3QuZW50cmllcyhURVJSSVRPUllfQ09VTlRSSUVTKSkge1xuICAgIGZvciAoY29uc3QgY29kZSBvZiBjb3VudHJpZXMpIG1hcFtjb2RlXSA9IHRlcnJpdG9yeSBhcyBUZXJyaXRvcnk7XG4gIH1cbiAgZm9yIChjb25zdCBbYWxpYXMsIGNvZGVdIG9mIE9iamVjdC5lbnRyaWVzKENPVU5UUllfQUxJQVNFUykpIHtcbiAgICBjb25zdCB0ZXJyaXRvcnkgPSBtYXBbY29kZV07XG4gICAgaWYgKCF0ZXJyaXRvcnkpIHtcbiAgICAgIC8vIEEgc3BlbGxpbmcgcG9pbnRpbmcgYXQgYSBjb3VudHJ5IG5vIHRlcnJpdG9yeSBjb3ZlcnMgd291bGQgcmVzb2x2ZSB0b1xuICAgICAgLy8gYG90aGVyYCBhbmQgcmVhZCBhcyBkZWxpYmVyYXRlLiBGYWlsaW5nIGF0IG1vZHVsZSBsb2FkIG1ha2VzIGl0IGFcbiAgICAgIC8vIGJ1aWxkLXRpbWUgZXJyb3IgaW5zdGVhZCBvZiBhIHdyb25nIGFuc3dlciBhdCBydW50aW1lLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDT1VOVFJZX0FMSUFTRVM6IFwiJHthbGlhc31cIiBwb2ludHMgYXQgXCIke2NvZGV9XCIsIHdoaWNoIG5vIHRlcnJpdG9yeSBjb3ZlcnNgKTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gbm9ybWFsaXplQ291bnRyeShhbGlhcyk7XG4gICAgaWYgKG1hcFtrZXldICYmIG1hcFtrZXldICE9PSB0ZXJyaXRvcnkpIHtcbiAgICAgIC8vIFR3byBzcGVsbGluZ3MgdGhhdCBub3JtYWxpc2UgdG8gdGhlIHNhbWUga2V5IGFuZCBkaXNhZ3JlZTogbGFzdCB3cml0ZVxuICAgICAgLy8gd291bGQgd2luLCBzaWxlbnRseSwgYW5kIHRoZSBsb3NlcidzIHRlcnJpdG9yeSB3b3VsZCBqdXN0IGJlIHdyb25nLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDT1VOVFJZX0FMSUFTRVM6IFwiJHthbGlhc31cIiBjb2xsaWRlcyB3aXRoIGFuIGVudHJ5IG1hcHBlZCB0byBcIiR7bWFwW2tleV19XCJgKTtcbiAgICB9XG4gICAgbWFwW2tleV0gPSB0ZXJyaXRvcnk7XG4gIH1cbiAgcmV0dXJuIG1hcDtcbn0pKCk7XG5cbi8qKlxuICogVGhlIG9uZSBub3JtYWxpc2F0aW9uIHJ1bGU6IHRyaW0sIGNvbGxhcHNlIGludGVybmFsIHdoaXRlc3BhY2UsIHVwcGVyLWNhc2UuXG4gKlxuICogYGNybV9hY2NvdW50LmJpbGxpbmdfY291bnRyeWAgc3RvcmVzIGV4YWN0bHkgdGhpcyBmb3JtLCBhbmQgZXZlcnkga2V5IGFib3ZlXG4gKiBpcyB3cml0dGVuIGluIGl0LCBzbyB0aGUgbG9va3VwIGlzIGEgcGxhaW4gcHJvcGVydHkgcmVhZC4gYGRlIGAsIGAgREVgIGFuZFxuICogYFVuaXRlZCAgU3RhdGVzYCBhcmUgYWxsIGhhbmRsZWQgaGVyZSByYXRoZXIgdGhhbiBieSBhIHRvbGVyYW50IGxvb2t1cCBcdTIwMTRcbiAqIG9uZSBydWxlLCBhcHBsaWVkIG9uY2UsIGluc3RlYWQgb2YgYSBzZXQgb2YgZmFsbGJhY2tzIGF0IGVhY2ggcmVhZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ291bnRyeSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKS50b1VwcGVyQ2FzZSgpIDogJyc7XG59XG5cbi8qKlxuICogVGhlIHRlcnJpdG9yeSBhIGNvdW50cnkgc3RyaW5nIGJlbG9uZ3MgdG8uIFRvdGFsOiBldmVyeSBpbnB1dCBoYXMgYW4gYW5zd2VyLFxuICogYW5kIGFuIHVucmVjb2duaXNlZCBvbmUgaXMgYG90aGVyYCByYXRoZXIgdGhhbiBibGFuay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlcnJpdG9yeUZvcih2YWx1ZTogdW5rbm93bik6IFRlcnJpdG9yeSB7XG4gIHJldHVybiBDT1VOVFJZX1RFUlJJVE9SWVtub3JtYWxpemVDb3VudHJ5KHZhbHVlKV0gPz8gVEVSUklUT1JZX0ZBTExCQUNLO1xufVxuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0cy9jb250YWN0Lm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvY29udGFjdC5vYmplY3QudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IE9iamVjdFNjaGVtYSwgRmllbGQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB7IEYgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgeyBTQUxVVEFUSU9OX09QVElPTlMsIExFQURfU09VUkNFX09QVElPTlMgfSBmcm9tICcuL19waWNrbGlzdHMnO1xuXG5leHBvcnQgY29uc3QgQ29udGFjdCA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX2NvbnRhY3QnLFxuICBsYWJlbDogJ0NvbnRhY3QnLFxuICBwbHVyYWxMYWJlbDogJ0NvbnRhY3RzJyxcbiAgaWNvbjogJ3VzZXInLFxuICBkZXNjcmlwdGlvbjogJ1Blb3BsZSBhc3NvY2lhdGVkIHdpdGggYWNjb3VudHMnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIE1hc3Rlci1kZXRhaWwgY2hpbGQgb2YgY3JtX2FjY291bnQgXHUyMDE0IGluaGVyaXRzIHRoZSBhY2NvdW50J3Mgc2hhcmluZy5cbiAgc2hhcmluZ01vZGVsOiAnY29udHJvbGxlZF9ieV9wYXJlbnQnLFxuICBcbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2lkZW50aXR5JywgICAgICAgIGxhYmVsOiAnSWRlbnRpdHknLCAgICAgICAgICAgICBpY29uOiAndXNlcicgfSxcbiAgICB7IGtleTogJ2FjY291bnRfaW5mbycsICAgIGxhYmVsOiAnQWNjb3VudCAmIFRpdGxlJywgICAgICBpY29uOiAnYnJpZWZjYXNlJyB9LFxuICAgIHsga2V5OiAnYnV5aW5nX2NlbnRyZScsICAgbGFiZWw6ICdCdXlpbmcgQ2VudHJlJywgICAgICAgIGljb246ICd1c2VycycgfSxcbiAgICB7IGtleTogJ2NvbnRhY3RfaW5mbycsICAgIGxhYmVsOiAnQ29udGFjdCBJbmZvcm1hdGlvbicsICBpY29uOiAncGhvbmUnIH0sXG4gICAgeyBrZXk6ICdtYWlsaW5nX2FkZHJlc3MnLCBsYWJlbDogJ01haWxpbmcgQWRkcmVzcycsICAgICAgaWNvbjogJ21hcC1waW4nLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ2FkZGl0aW9uYWwnLCAgICAgIGxhYmVsOiAnQWRkaXRpb25hbCBJbmZvJywgICAgICBpY29uOiAnaW5mbycsIGNvbGxhcHNlOiAnY29sbGFwc2VkJyB9LFxuICAgIHsga2V5OiAncHJlZmVyZW5jZXMnLCAgICAgbGFiZWw6ICdDb21tdW5pY2F0aW9uIFByZWZlcmVuY2VzJywgaWNvbjogJ2JlbGwtb2ZmJywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gUGxhdGZvcm0gb3duZXJzaGlwIGFuY2hvciBcdTIwMTQgY2Fub25pY2FsIG5vdGUgaW4gYGFjY291bnQub2JqZWN0LnRzYCAoIzU0OCkuXG4gICAgb3duZXJfaWQ6IEZpZWxkLmxvb2t1cCgnc3lzX3VzZXInLCB7XG4gICAgICBsYWJlbDogJ0NvbnRhY3QgT3duZXInLFxuICAgICAgZ3JvdXA6ICdhY2NvdW50X2luZm8nLFxuICAgICAgc3lzdGVtOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IGZhbHNlLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgLy8gTmFtZSBmaWVsZHNcbiAgICBzYWx1dGF0aW9uOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdTYWx1dGF0aW9uJyxcbiAgICAgIGdyb3VwOiAnaWRlbnRpdHknLFxuICAgICAgLy8gQ2Fub25pY2FsIHNldCBzaGFyZWQgd2l0aCBMZWFkICgjNDkwKSBcdTIwMTQgc2VlIF9waWNrbGlzdHMudHMuXG4gICAgICBvcHRpb25zOiBbLi4uU0FMVVRBVElPTl9PUFRJT05TXSxcbiAgICB9KSxcbiAgICBmaXJzdF9uYW1lOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnRmlyc3QgTmFtZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIGdyb3VwOiAnaWRlbnRpdHknLFxuICAgIH0pLFxuICAgIGxhc3RfbmFtZTogRmllbGQudGV4dCh7XG4gICAgICBsYWJlbDogJ0xhc3QgTmFtZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIGdyb3VwOiAnaWRlbnRpdHknLFxuICAgIH0pLFxuXG4gICAgLy8gRm9ybXVsYSBmaWVsZCAtIEZ1bGwgbmFtZVxuICAgIC8vIGBzYWx1dGF0aW9uYCBpcyBhIHBpY2tsaXN0LCBzbyB0aGUgZm9ybXVsYSBzZWVzIHRoZSByYXcgVkFMVUUgKGBtc2AsIGBkcmApLFxuICAgIC8vIG5vdCB0aGUgbGFiZWwgXHUyMDE0IG5hbWVzIHJlbmRlcmVkIGFzIFwibXMgRW1pbHkgRGF2aXNcIiBpbiBsaXN0cyBhbmQgZGV0YWlsc1xuICAgIC8vICgjNDYxKS4gVGhlIGZvcm11bGEgbGFuZ3VhZ2UgaGFzIG5vIHByb3Blci1jYXNlIG9yIG9wdGlvbi1sYWJlbCBsb29rdXAsIGFuZFxuICAgIC8vIGhhcmRjb2RpbmcgXCJNcy5cIiB3b3VsZCBkZWZlYXQgdHJhbnNsYXRpb24sIHNvIHRoZSBuYW1lIGlzIGJ1aWx0IGZyb20gdGhlXG4gICAgLy8gbmFtZSBmaWVsZHMgYWxvbmU7IHNhbHV0YXRpb24gc3RheXMgaXRzIG93biAodHJhbnNsYXRlZCkgZmllbGQuXG4gICAgZnVsbF9uYW1lOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnRnVsbCBOYW1lJyxcbiAgICAgIGV4cHJlc3Npb246IEZgam9pbk5vbkVtcHR5KFtyZWNvcmQuZmlyc3RfbmFtZSwgcmVjb3JkLmxhc3RfbmFtZV0sICcgJylgLFxuICAgICAgZ3JvdXA6ICdpZGVudGl0eScsXG4gICAgfSksXG5cbiAgICAvLyBBdmF0YXIgZmllbGQuIGBhY2NlcHRgIC8gYG1heFNpemVgIGFyZSBzZXJ2ZXItZW5mb3JjZWQgZnJvbVxuICAgIC8vIEBvYmplY3RzdGFjayAxNyBcdTIwMTQgc2VlIHRoZSBub3RlIG9uIGBjcm1fcHJvZHVjdC5pbWFnZWAuXG4gICAgYXZhdGFyOiBGaWVsZC5hdmF0YXIoe1xuICAgICAgbGFiZWw6ICdQcm9maWxlIFBpY3R1cmUnLFxuICAgICAgZ3JvdXA6ICdpZGVudGl0eScsXG4gICAgICBhY2NlcHQ6IFsnaW1hZ2UvcG5nJywgJ2ltYWdlL2pwZWcnLCAnaW1hZ2Uvd2VicCddLFxuICAgICAgbWF4U2l6ZTogMiAqIDEwMjQgKiAxMDI0LFxuICAgIH0pLFxuXG4gICAgLy8gUmVsYXRpb25zaGlwOiBMaW5rIHRvIEFjY291bnQgKE1hc3Rlci1EZXRhaWwpXG4gICAgY3JtX2FjY291bnQ6IEZpZWxkLm1hc3RlckRldGFpbCgnY3JtX2FjY291bnQnLCB7XG4gICAgICBsYWJlbDogJ0FjY291bnQnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZScsICAvLyBEZWxldGUgY29udGFjdHMgd2hlbiBhY2NvdW50IGlzIGRlbGV0ZWRcbiAgICAgIGdyb3VwOiAnYWNjb3VudF9pbmZvJyxcbiAgICB9KSxcblxuICAgIC8vIFByb2Zlc3Npb25hbCBJbmZvcm1hdGlvblxuICAgIHRpdGxlOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnSm9iIFRpdGxlJyxcbiAgICAgIGdyb3VwOiAnYWNjb3VudF9pbmZvJyxcbiAgICB9KSxcblxuICAgIGRlcGFydG1lbnQ6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ0RlcGFydG1lbnQnLFxuICAgICAgZ3JvdXA6ICdhY2NvdW50X2luZm8nLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnRXhlY3V0aXZlJywgdmFsdWU6ICdleGVjdXRpdmUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTYWxlcycsIHZhbHVlOiAnc2FsZXMnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdNYXJrZXRpbmcnLCB2YWx1ZTogJ21hcmtldGluZycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0VuZ2luZWVyaW5nJywgdmFsdWU6ICdlbmdpbmVlcmluZycgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1cHBvcnQnLCB2YWx1ZTogJ3N1cHBvcnQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdGaW5hbmNlJywgdmFsdWU6ICdmaW5hbmNlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnSHVtYW4gUmVzb3VyY2VzJywgdmFsdWU6ICdocicgfSxcbiAgICAgICAgeyBsYWJlbDogJ09wZXJhdGlvbnMnLCB2YWx1ZTogJ29wZXJhdGlvbnMnIH0sXG4gICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgQnV5aW5nIGNlbnRyZSAoUkVRLTAwMDQpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gVGhlIHRocmVlIGF0dHJpYnV0ZXMgdGhhdCB0dXJuIGFuIGFjY291bnQncyBjb250YWN0IGxpc3QgZnJvbSBhXG4gICAgLy8gRElSRUNUT1JZIGludG8gYSBNQVA6IHdoYXQgdGhpcyBwZXJzb24gZG9lcyBpbiB0aGUgcHVyY2hhc2UgZGVjaXNpb24sXG4gICAgLy8gd2hlcmUgdGhleSBzdGFuZCBvbiB1cywgYW5kIGhvdyBzdHJvbmcgb3VyIHJlbGF0aW9uc2hpcCB3aXRoIHRoZW0gaXMuXG4gICAgLy8gYHRpdGxlYCBhYm92ZSBpcyB0aGUgZW1wbG95ZXIncyBqb2IgdGl0bGUgYW5kIGBpc19wcmltYXJ5YCBiZWxvdyBpcyBhXG4gICAgLy8gb25lLWJpdCBhbnN3ZXIgdG8gXCJ3aG8gZG8gd2UgY2FsbFwiIFx1MjAxNCBuZWl0aGVyIG9mIHRoZW0gaXMgdGhpcyBmYWN0LlxuICAgIC8vXG4gICAgLy8gXHUyNkQ0IFJlYWQgYnkgcGVvcGxlIGFuZCBieSByZXBvcnRpbmcsIG5ldmVyIGJ5IGEgZ2F0ZS4gTm8gaG9vaywgbm8gZmxvd1xuICAgIC8vIGFuZCBubyB2YWxpZGF0aW9uIGlzIGF1dGhvcmVkIGFnYWluc3QgYW55IG9mIHRoZSB0aHJlZSwgbm9uZSBpc1xuICAgIC8vIGByZXF1aXJlZGAsIGFuZCBub25lIGNhcnJpZXMgYW4gb3B0aW9uIGBkZWZhdWx0YDogYSBjb250YWN0IHdpdGggYWxsXG4gICAgLy8gdGhyZWUgYmxhbmsgc2F2ZXMgZXhhY3RseSBhcyBpdCBkaWQgYmVmb3JlIHRoaXMgZ3JvdXAgZXhpc3RlZFxuICAgIC8vIChSRVEtMDAwNCBhY2NlcHRhbmNlIDQpLiBUaGV5IGFyZSBzYWxlcyBpbnRlbGxpZ2VuY2UsIGFuZCBBR0VOVFMubWRcbiAgICAvLyBtZXRhZGF0YSBzZW1hbnRpY3MgcnVsZSA4IGlzIHdoYXQga2VlcHMgYSBtYWNoaW5lIHNpZ25hbCBmcm9tIHJlZnVzaW5nXG4gICAgLy8gYSB3cml0ZS5cbiAgICAvLyBcdTI2QTBcdUZFMEYgYGJ1eWluZ19mdW5jdGlvbmAsIG5vdCBgYnV5aW5nX3JvbGVgIFx1MjAxNCBhbmQgJ0J1eWluZyBGdW5jdGlvbicsIG5vdFxuICAgIC8vICdCdXlpbmcgUm9sZScuIGBzZWN1cml0eS1yb2xlLXdvcmRgIChhbiBhdXRob3ItdGltZSBydWxlLCBBRFItMDA5MCBEMylcbiAgICAvLyByZWZ1c2VzIHRoZSB3b3JkIGByb2xlYCBvbiBCT1RILCBtZWFzdXJlZCBvbiB0aGlzIGJyYW5jaCBhcyB0d29cbiAgICAvLyBzdWNjZXNzaXZlIGBwbnBtIHZhbGlkYXRlYCBleGl0LTEgcnVuczogZmlyc3QgdGhlIGZpZWxkIG5hbWUsIHRoZW4gdGhlXG4gICAgLy8gbGFiZWwsIGJlY2F1c2UgXCJhZG1pbnMgbXVzdCBtZWV0IE9ORSB2b2NhYnVsYXJ5XCIgYW5kIGByb2xlYCBpcyB0aGVcbiAgICAvLyBwbGF0Zm9ybSdzIHNlY3VyaXR5IHZvY2FidWxhcnkgKHBlcm1pc3Npb25fc2V0IC8gcG9zaXRpb24gL1xuICAgIC8vIGJ1c2luZXNzX3VuaXQpLiBJdHMgb3duIHJlbWVkeSBwcmVzY3JpYmVzIHRoZSByZXBsYWNlbWVudCB1c2VkIGhlcmUgXHUyMDE0XG4gICAgLy8gXCJhIGRvbWFpbiB3b3JkIChlLmcuICdmdW5jdGlvbicsICdkdXR5JylcIi5cbiAgICAvL1xuICAgIC8vIFRoZSBydWxlJ3Mgc3VyZmFjZSBpcyB0aGUgRU5HTElTSCBvbmUgaXQgY2FuIHJlYWQ6IGl0IG1hdGNoZXNcbiAgICAvLyBgL1xcYnJvbGUocyk/XFxiL2lgIG92ZXIgb2JqZWN0L2ZpZWxkL2FjdGlvbi9wZXJtaXNzaW9uLXNldC9wb3NpdGlvbi9hcHBcbiAgICAvLyBkZWNsYXJhdGlvbnMgYW5kIGRvZXMgbm90IHJlYWNoIHRoZSBsb2NhbGUgcGFja3MuIFNvIHRoZSB0aHJlZVxuICAgIC8vIG5vbi1FbmdsaXNoIHBhY2tzIGtlZXAgdGhlIG5hdHVyYWwgYnVzaW5lc3MgdGVybSBmb3IgdGhpcyBjb25jZXB0IGluXG4gICAgLy8gdGhlaXIgb3duIGxhbmd1YWdlICh6aC1DTiBcdTkxQzdcdThEMkRcdTg5RDJcdTgyNzIsIGVzLUVTIFJvbCBkZSBDb21wcmEsIGphLUpQIFx1OENGQ1x1OENCN1x1NUY3OVx1NTI3MilcbiAgICAvLyBcdTIwMTQgc2FtZSBmYWN0LCBlYWNoIHdyaXR0ZW4gdGhlIHdheSBpdHMgcmVhZGVyIHNheXMgaXQuXG4gICAgYnV5aW5nX2Z1bmN0aW9uOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdCdXlpbmcgRnVuY3Rpb24nLFxuICAgICAgZ3JvdXA6ICdidXlpbmdfY2VudHJlJyxcbiAgICAgIC8vIFNJTkdMRS12YWx1ZWQsIGFuZCBSRVEtMDAwNCBsZWZ0IHRoYXQgY2FsbCB0byB0aGUgaW1wbGVtZW50aW5nIFBSLlxuICAgICAgLy8gYG11bHRpcGxlOiB0cnVlYCB3b3VsZCBjb3N0IHRoZSBmaWVsZCB0aGUgcHJvcGVydHkgYWNjZXB0YW5jZSAyIGFza3NcbiAgICAgIC8vIGZvcjogYEdyb3VwaW5nQ29uZmlnU2NoZW1hYCAoYEBvYmplY3RzdGFjay9zcGVjL3VpYCwgdGhlIGluc3RhbGxlZFxuICAgICAgLy8gcGluKSBhbnN3ZXJzIGEgZ3JvdXBlZCBsaXN0IHdpdGggT05FIHNlcnZlci1zaWRlIGFnZ3JlZ2F0ZSBxdWVyeSwgYW5kXG4gICAgICAvLyBpdHMgYEdyb3VwaW5nRmllbGRTY2hlbWEuZmllbGRgIHNheXMgdGhlIGdyb3VwIGhlYWRlciBcImNhcnJpZXMgaXRzXG4gICAgICAvLyByYXcgc3RvcmVkIHZhbHVlXCIgXHUyMDE0IHNvIGEgbXVsdGktdmFsdWVkIGNvbHVtbiBncm91cHMgYnkgdGhlXG4gICAgICAvLyBDT01CSU5BVElPTi4gYGRlY2lzaW9uX21ha2VyYCArIGB1c2VyYCB3b3VsZCBiZWNvbWUgYSBncm91cCBvZiBpdHNcbiAgICAgIC8vIG93biBpbnN0ZWFkIG9mIGZlZWRpbmcgYm90aCwgd2hpY2ggaXMgdGhlIG9wcG9zaXRlIG9mIHJlYWRpbmcgYW5cbiAgICAgIC8vIGFjY291bnQgYXMgYSBtYXAuIEEgcGVyc29uIHdobyBpcyBnZW51aW5lbHkgdHdvIHRoaW5ncyBpcyByZWNvcmRlZCBhc1xuICAgICAgLy8gdGhlIHJvbGUgdGhhdCBnb3Zlcm5zIFRISVMgZGVjaXNpb247IHRoZSBzZWNvbmQgb25lIGlzIGFscmVhZHlcbiAgICAgIC8vIGxlZ2libGUgZnJvbSBgdGl0bGVgIC8gYGRlcGFydG1lbnRgLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBzaXggYXJlIHRoZSBnZW5lcmljIGJ1eWluZy1jZW50cmUgc2xvdHMgZXZlcnkgaW5kdXN0cnkgcmVhZHMgdGhlXG4gICAgICAvLyBzYW1lIHdheSBcdTIwMTQgXHUyNkQ0IGRlbGliZXJhdGVseSBub3Qgb25lIGNvbXBhbnkncyByb2xlIG1vZGVsLlxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnRGVjaXNpb24gTWFrZXInLCAgICAgIHZhbHVlOiAnZGVjaXNpb25fbWFrZXInIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFY29ub21pYyBCdXllcicsICAgICAgdmFsdWU6ICdlY29ub21pY19idXllcicgfSxcbiAgICAgICAgeyBsYWJlbDogJ1RlY2huaWNhbCBFdmFsdWF0b3InLCB2YWx1ZTogJ3RlY2huaWNhbF9ldmFsdWF0b3InIH0sXG4gICAgICAgIHsgbGFiZWw6ICdVc2VyJywgICAgICAgICAgICAgICAgdmFsdWU6ICd1c2VyJyB9LFxuICAgICAgICB7IGxhYmVsOiAnSW5mbHVlbmNlcicsICAgICAgICAgIHZhbHVlOiAnaW5mbHVlbmNlcicgfSxcbiAgICAgICAgeyBsYWJlbDogJ0dhdGVrZWVwZXInLCAgICAgICAgICB2YWx1ZTogJ2dhdGVrZWVwZXInIH0sXG4gICAgICBdXG4gICAgfSksXG5cbiAgICBhdHRpdHVkZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnQXR0aXR1ZGUgdG8gVXMnLFxuICAgICAgZ3JvdXA6ICdidXlpbmdfY2VudHJlJyxcbiAgICAgIC8vIE9SREVSRUQsIG1vc3QgdG8gbGVhc3QgZmF2b3VyYWJsZSBcdTIwMTQgZGVjbGFyYXRpb24gb3JkZXIgSVMgdGhlIG9yZGVyIGFcbiAgICAgIC8vIHBpY2tsaXN0IGFuZCBhIGdyb3VwZWQgbGlzdCBwcmVzZW50LCBzbyB0aGUgbGFkZGVyIGlzIGF1dGhvcmVkIHJhdGhlclxuICAgICAgLy8gdGhhbiBkZXNjcmliZWQuIEEgYmxhbmsgbWVhbnMgbm9ib2R5IGhhcyBmb3JtZWQgYSB2aWV3IHlldCwgd2hpY2ggaXNcbiAgICAgIC8vIGEgZGlmZmVyZW50IGZhY3QgZnJvbSBgbmV1dHJhbGAuXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdDaGFtcGlvbicsICAgdmFsdWU6ICdjaGFtcGlvbicgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1cHBvcnRpdmUnLCB2YWx1ZTogJ3N1cHBvcnRpdmUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdOZXV0cmFsJywgICAgdmFsdWU6ICduZXV0cmFsJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU2tlcHRpY2FsJywgIHZhbHVlOiAnc2tlcHRpY2FsJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQmxvY2tlcicsICAgIHZhbHVlOiAnYmxvY2tlcicgfSxcbiAgICAgIF1cbiAgICB9KSxcblxuICAgIHJlbGF0aW9uc2hpcF9zdHJlbmd0aDogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnUmVsYXRpb25zaGlwIFN0cmVuZ3RoJyxcbiAgICAgIGdyb3VwOiAnYnV5aW5nX2NlbnRyZScsXG4gICAgICAvLyBPUkRFUkVELCB3ZWFrZXN0IHRvIHN0cm9uZ2VzdC4gXHUyNkQ0IE5vdCBhIGZyZWUtdGV4dCBzY29yZSwgYW5kIFx1MjZENCBub3RcbiAgICAgIC8vIGRlcml2ZWQgZnJvbSBgbGFzdF9jb250YWN0ZWRfZGF0ZWAgYmVsb3c6IHJlY2VuY3kgaXMgbWFjaGluZS13cml0dGVuXG4gICAgICAvLyBhbmQgbWVhc3VyZXMgc29tZXRoaW5nIGVsc2UgXHUyMDE0IGEgd2Vla2x5IGNhbGwgd2l0aCBzb21lb25lIHdobyB3aWxsIG5vdFxuICAgICAgLy8gdGFrZSBvdXIgc2lkZSBpcyBub3QgYSBzdHJvbmcgcmVsYXRpb25zaGlwLiBBIGJsYW5rIG1lYW5zIHVuYXNzZXNzZWQ7XG4gICAgICAvLyBgZGlzdGFudGAgaXMgYW4gYXNzZXNzbWVudCB0aGF0IGNhbWUgYmFjayB3ZWFrLlxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnRGlzdGFudCcsICAgICAgICAgICAgICB2YWx1ZTogJ2Rpc3RhbnQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdBY3F1YWludGFuY2UnLCAgICAgICAgIHZhbHVlOiAnYWNxdWFpbnRhbmNlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnV29ya2luZyBSZWxhdGlvbnNoaXAnLCB2YWx1ZTogJ3dvcmtpbmcnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdHJvbmcnLCAgICAgICAgICAgICAgIHZhbHVlOiAnc3Ryb25nJyB9LFxuICAgICAgICB7IGxhYmVsOiAnVHJ1c3RlZCBBZHZpc29yJywgICAgICB2YWx1ZTogJ3RydXN0ZWRfYWR2aXNvcicgfSxcbiAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE5vIGByZXBvcnRzX3RvYC4gVGhlIG9yZyBjaGFydCB3YXMgZGVjbGFyZWQgYW5kIG5ldmVyIGJ1aWx0OiBubyBwYWdlXG4gICAgLy8gcmVuZGVyZWQgdGhlIHRyZWUgdGhlIGNvbnRhY3QgZG9jcyBwcm9taXNlZCwgbm8gc2tpbGwgcmVhZCB0aGUgY2hhaW4gd2hlblxuICAgIC8vIHN1bW1hcmlzaW5nIGFuIGFjY291bnQsIGFuZCBubyBmbG93IGVzY2FsYXRlZCBhbG9uZyBpdC4gU2hhcmluZyBkZXJpdmVzXG4gICAgLy8gZnJvbSB0aGUgbWFzdGVyIGBjcm1fYWNjb3VudGAsIG5ldmVyIGZyb20gdGhpcyBsb29rdXAuXG5cbiAgICAvLyBDb250YWN0IEluZm9ybWF0aW9uXG4gICAgZW1haWw6IEZpZWxkLmVtYWlsKHtcbiAgICAgIGxhYmVsOiAnRW1haWwnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgIGdyb3VwOiAnY29udGFjdF9pbmZvJyxcbiAgICB9KSxcblxuICAgIHBob25lOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnUGhvbmUnLFxuICAgICAgZm9ybWF0OiAncGhvbmUnLFxuICAgICAgZ3JvdXA6ICdjb250YWN0X2luZm8nLFxuICAgIH0pLFxuXG4gICAgbW9iaWxlOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnTW9iaWxlJyxcbiAgICAgIGZvcm1hdDogJ3Bob25lJyxcbiAgICAgIGdyb3VwOiAnY29udGFjdF9pbmZvJyxcbiAgICB9KSxcblxuICAgIC8vIE1haWxpbmcgQWRkcmVzcyBcdTIwMTQgb25lIHN0cnVjdHVyZWQgYGFkZHJlc3NgIHZhbHVlLCB0aGUgc2FtZSBzaGFwZSBhc1xuICAgIC8vIGBjcm1fYWNjb3VudC5iaWxsaW5nX2FkZHJlc3NgIGFuZCBgY3JtX2xlYWQuYWRkcmVzc2AsIGJlY2F1c2UgYSBwb3N0YWxcbiAgICAvLyBhZGRyZXNzIGlzIG9uZSBmYWN0IGFuZCBBR0VOVFMubWQncyBmaWVsZC10eXBlIGd1aWRhbmNlIG5hbWVzXG4gICAgLy8gYEZpZWxkLmFkZHJlc3MoKWAgZm9yIGl0IChydWxpbmcgb24gIzE4MzY7IGl0IHJlcGxhY2VkIGZpdmUgZmxhdFxuICAgIC8vIGBtYWlsaW5nXypgIHRleHQgZmllbGRzLCBjb252ZXJ0ZWQgYnkgYHNjcmlwdHMvYmFja2ZpbGwtY29udGFjdC1tYWlsaW5nLWFkZHJlc3MudHNgKS5cbiAgICBtYWlsaW5nX2FkZHJlc3M6IEZpZWxkLmFkZHJlc3Moe1xuICAgICAgbGFiZWw6ICdNYWlsaW5nIEFkZHJlc3MnLFxuICAgICAgZ3JvdXA6ICdtYWlsaW5nX2FkZHJlc3MnLFxuICAgIH0pLFxuXG4gICAgLy8gQWRkaXRpb25hbCBJbmZvcm1hdGlvblxuICAgIC8vXG4gICAgLy8gTm8gYGJpcnRoZGF0ZWAuIE5vdGhpbmcgZ3JlZXRlZCwgc2VnbWVudGVkIG9yIHJlcG9ydGVkIG9uIGl0LCBhbmQgYW5cbiAgICAvLyBpbXBvcnRhYmxlIGRhdGUgb2YgYmlydGggd2l0aCBubyBjb25zdW1lciBpcyBwZXJzb25hbCBkYXRhIGhlbGQgZm9yIG5vXG4gICAgLy8gc3RhdGVkIHB1cnBvc2UgXHUyMDE0IHRoZSBvbmUgZmllbGQgb24gdGhpcyBvYmplY3Qgd2hlcmUgXCJkZWNsYXJlZCBidXQgaW5lcnRcIlxuICAgIC8vIGFsc28gY2FycmllcyBhIGRhdGEtcHJvdGVjdGlvbiBjb3N0LlxuXG4gICAgbGVhZF9zb3VyY2U6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ0xlYWQgU291cmNlJyxcbiAgICAgIGdyb3VwOiAnYWRkaXRpb25hbCcsXG4gICAgICAvLyBDYW5vbmljYWwgc2V0IHNoYXJlZCB3aXRoIExlYWQgKyBPcHBvcnR1bml0eSAoIzQ5MCkgXHUyMDE0IGEgY29udmVydGVkXG4gICAgICAvLyBsZWFkJ3Mgc291cmNlIG11c3QgcmVtYWluIHJlcHJlc2VudGFibGUgb24gdGhlIGNvbnRhY3QuXG4gICAgICBvcHRpb25zOiBbLi4uTEVBRF9TT1VSQ0VfT1BUSU9OU10sXG4gICAgfSksXG5cbiAgICBkZXNjcmlwdGlvbjogRmllbGQubWFya2Rvd24oe1xuICAgICAgbGFiZWw6ICdEZXNjcmlwdGlvbicsXG4gICAgICBncm91cDogJ2FkZGl0aW9uYWwnLFxuICAgIH0pLFxuXG4gICAgLy8gRmxhZ3NcbiAgICBpc19wcmltYXJ5OiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGxhYmVsOiAnUHJpbWFyeSBDb250YWN0JyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmlwdGlvbjogJ0lzIHRoaXMgdGhlIG1haW4gY29udGFjdCBmb3IgdGhlIGFjY291bnQ/JyxcbiAgICAgIGdyb3VwOiAncHJlZmVyZW5jZXMnLFxuICAgIH0pLFxuXG4gICAgZG9fbm90X2NhbGw6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdEbyBOb3QgQ2FsbCcsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZ3JvdXA6ICdwcmVmZXJlbmNlcycsXG4gICAgfSksXG5cbiAgICBlbWFpbF9vcHRfb3V0OiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGxhYmVsOiAnRW1haWwgT3B0IE91dCcsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZ3JvdXA6ICdwcmVmZXJlbmNlcycsXG4gICAgfSksXG5cbiAgICAvLyBJbnRlcmFjdGlvbiByZWNlbmN5IGZvciB0aGUgUEVSU09OICgjNTkyKS4gYGNybV9hY2NvdW50YCBjYXJyaWVzXG4gICAgLy8gYGxhc3RfYWN0aXZpdHlfZGF0ZWAgZm9yIHRoZSBjb21wYW55IGFuZCBgY3JtX2xlYWRgIGNhcnJpZXNcbiAgICAvLyBgbGFzdF9jb250YWN0ZWRfZGF0ZWAgZm9yIGEgcHJvc3BlY3Q7IHRoZSBjb250YWN0IFx1MjAxNCB0aGUgcmVjb3JkIGEgcmVwXG4gICAgLy8gYWN0dWFsbHkgY2FsbHMgYW5kIGVtYWlscyBcdTIwMTQgaGFkIG5laXRoZXIsIHNvIFwid2hlbiBkaWQgYW55b25lIGxhc3Qgc3BlYWtcbiAgICAvLyB0byBvdXIgY2hhbXBpb24/XCIgd2FzIHVuYW5zd2VyYWJsZS5cbiAgICAvL1xuICAgIC8vIFdyaXR0ZW4gYnkgdGhlIGFjdGl2aXR5IGJ1YmJsZSBpbiBgZXZlbnQuaG9vay50c2AgLyBgdGFzay5ob29rLnRzYCBhbmQgYnlcbiAgICAvLyBgc2VuZF9lbWFpbGAuIERlbGliZXJhdGVseSBOT1QgYHJlYWRvbmx5YDogYSByZWFkb25seSBmaWVsZCBpcyBzdHJpcHBlZFxuICAgIC8vIGZyb20gZXZlcnkgbm9uLXN5c3RlbSB3cml0ZSB3aG9zZSBjYWxsZXIgc3VwcGxpZWQgdGhlIGtleSAoIzI5NDgpLCB3aGljaFxuICAgIC8vIGlzIGV4YWN0bHkgaG93IHRoZSBhY2NvdW50IGFuZCBsZWFkIGNvbHVtbnMgYWJvdmUgZW5kZWQgdXAgcGVybWFuZW50bHlcbiAgICAvLyBudWxsLiBJdCBpcyBrZXB0IG9mZiB0aGUgZm9ybSBzZWN0aW9ucyBpbnN0ZWFkLlxuICAgIGxhc3RfY29udGFjdGVkX2RhdGU6IEZpZWxkLmRhdGV0aW1lKHtcbiAgICAgIGxhYmVsOiAnTGFzdCBDb250YWN0ZWQnLFxuICAgICAgZ3JvdXA6ICdhZGRpdGlvbmFsJyxcbiAgICB9KSxcbiAgfSxcbiAgXG4gIC8vIEVuYWJsZSBmZWF0dXJlc1xuICAvLyBBUEkgc3VyZmFjZS4gSGlzdG9yeSBcdTIxOTIgRmllbGQudHJhY2tIaXN0b3J5IChBRFItMDA1MikuXG4gIGVuYWJsZToge1xuICAgIGFwaUVuYWJsZWQ6IHRydWUsXG4gICAgLy8gIzYwMiBcdTIwMTQgc2lnbmVkIE5EQXMsIGJ1c2luZXNzIGNhcmRzLCBtZWV0aW5nIG5vdGVzIGF0dGFjaCB0byB0aGUgcGVyc29uLlxuICAgIC8vIFNlZSB0aGUgY2Fub25pY2FsIGNhcGFiaWxpdHkgbm90ZSBpbiBgc3JjL3NhbGVzL29iamVjdHMvaW5kZXgudHNgLlxuICAgIGZpbGVzOiB0cnVlLFxuICB9LFxuICBcbiAgLy8gRGF0YWJhc2UgaW5kZXhlcyBmb3IgcGVyZm9ybWFuY2VcbiAgLy9cbiAgLy8gTk9URTogbm8gYHsgZmllbGRzOiBbJ2VtYWlsJ10sIHVuaXF1ZTogdHJ1ZSB9YCBoZXJlLiBFbWFpbCB1bmlxdWVuZXNzIGlzXG4gIC8vIGRlY2xhcmVkIG9uIHRoZSBmaWVsZCBpdHNlbGYgKGB1bmlxdWU6IHRydWVgKSwgd2hpY2ggc2luY2UgZnJhbWV3b3JrICMzNjk2XG4gIC8vIG1hdGVyaWFsaXplcyBhcyB0aGUgdGVuYW50IGNvbXBvc2l0ZSBgKG9yZ2FuaXphdGlvbl9pZCwgZW1haWwpYCBcdTIwMTQgdW5pcXVlXG4gIC8vIFdJVEhJTiBhbiBvcmdhbml6YXRpb24sIHdoaWNoIGlzIHdoYXQgYSBtdWx0aS10ZW5hbnQgQ1JNIHdhbnRzICh0d28gb3Jnc1xuICAvLyBtYXkgZWFjaCBrbm93IGpvaG5AYWNtZS5jb20pLiBBIGRlY2xhcmVkIHNpbmdsZS1jb2x1bW4gaW5kZXggaXMgdGFrZW5cbiAgLy8gdmVyYmF0aW0sIGkuZS4gcGxhdGZvcm0td2lkZSwgc28gZGVjbGFyaW5nIGJvdGggbGVmdCB0aGUgZ2xvYmFsIGluZGV4XG4gIC8vIGVuZm9yY2luZyB0aGUgb2xkIGJlaGF2aW91ciBhbmQgdGhlIHBlci10ZW5hbnQgY29uc3RyYWludCB1bnJlYWNoYWJsZVxuICAvLyAoZnJhbWV3b3JrIzM5OTEgYHVuaXF1ZS9kb3VibGUtZGVjbGFyYXRpb25gKS5cbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ2NybV9hY2NvdW50J10gfSxcbiAgICB7IGZpZWxkczogWydvd25lcl9pZCddIH0sXG4gICAgeyBmaWVsZHM6IFsnbGFzdF9uYW1lJywgJ2ZpcnN0X25hbWUnXSB9LFxuICBdLFxuICBcbiAgLy8gRGlzcGxheSBjb25maWd1cmF0aW9uLiBBRFItMDA3OSBgbmFtZUZpZWxkYCBuYW1lcyB0aGUgcmVhbCBmaWVsZCBob2xkaW5nXG4gIC8vIHRoZSByZWNvcmQgdGl0bGUgXHUyMDE0IGhlcmUgdGhlIGBmdWxsX25hbWVgIGZvcm11bGEgZmllbGQgZGVmaW5lZCBhYm92ZS5cbiAgbmFtZUZpZWxkOiAnZnVsbF9uYW1lJyxcbiAgLy8gRXhwbGljaXQgc2VhcmNoIHRhcmdldHMgKEFEUi0wMDYxKS4gUkVRVUlSRUQgYmVjYXVzZSBuYW1lRmllbGQgaXMgYVxuICAvLyBGT1JNVUxBIChkaXNwbGF5X3RpdGxlL2Z1bGxfbmFtZSk6IHdpdGhvdXQgdGhpcywgJHNlYXJjaCBhdXRvLWRlZmF1bHRzIHRvXG4gIC8vIHRoZSBmb3JtdWxhIGZpZWxkLCB3aGljaCBpc24ndCBhIHJlYWwgY29sdW1uLCBzbyB0aGUgbG9va3VwIHBpY2tlciArIGdsb2JhbFxuICAvLyBzZWFyY2ggc2lsZW50bHkgcmV0dXJuIHplcm8uIFRoZXNlIGFyZSByZWFsLCBpbmRleGVkIGNvbHVtbnMuXG4gIHNlYXJjaGFibGVGaWVsZHM6IFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnLCAnZW1haWwnXSxcbiAgaGlnaGxpZ2h0RmllbGRzOiBbJ2Z1bGxfbmFtZScsICdlbWFpbCcsICdjcm1fYWNjb3VudCcsICdwaG9uZSddLFxuICBcbiAgLy8gXHUyNkEwXHVGRTBGIE5vIHN0YW5kYWxvbmUgYHR5cGU6ICd1bmlxdWUnYCB2YWxpZGF0aW9uIGV4aXN0cyBvbiB0aGlzIHBsYXRmb3JtXG4gIC8vIChBRFItMDAzMiB2YWxpZGF0aW9uIHVuaW9uKS4gRW1haWwgdW5pcXVlbmVzcyBpcyBlbmZvcmNlZCBieSB0aGVcbiAgLy8gZmllbGQtbGV2ZWwgYHVuaXF1ZTogdHJ1ZWAgYWJvdmUsIHNjb3BlZCBwZXIgb3JnYW5pemF0aW9uLlxuXG4gIC8vIFx1MjZBMFx1RkUwRiBObyBgd29ya2Zsb3dzW11gIGhlcmUsIGFuZCBub25lIGlzIHBvc3NpYmxlOiBvYmplY3QgYHdvcmtmbG93c1tdYCB3ZXJlXG4gIC8vIHJlbW92ZWQgZnJvbSB0aGUgcGxhdGZvcm0uIEZpZWxkIHVwZGF0ZXMgbGl2ZSBpbiB0aGlzIG9iamVjdCdzIGAqLmhvb2sudHNgO1xuICAvLyBzY2hlZHVsZWQgc3RhdHVzIGZsaXBzIGFuZCBub3RpZmljYXRpb25zIGxpdmUgaW4gYHNyYy8qL2Zsb3dzLyouZmxvdy50c2AuXG59KTsiLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2V2ZW50Lm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvZXZlbnQub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgT2JqZWN0U2NoZW1hLCBGaWVsZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHtcbiAgRVZFTlRfU1RBVFVTX09QVElPTlMsXG4gIEVWRU5UX1RZUEVfT1BUSU9OUyxcbiAgUkVMQVRFRF9UT19UWVBFX09QVElPTlMsXG59IGZyb20gJy4vX3BpY2tsaXN0cyc7XG5cbi8qKlxuICogRXZlbnQgXHUyMDE0IGEgZmlyc3QtY2xhc3MgaW50ZXJhY3Rpb24gcmVjb3JkICgjNTkyKS5cbiAqXG4gKiAjIFdoeSB0aGlzIG9iamVjdCBleGlzdHNcbiAqXG4gKiBUaGUgQ1JNIGNvdWxkIG5vdCBhbnN3ZXIgKlwid2hhdCBoYXBwZW5lZCB3aXRoIHRoaXMgY3VzdG9tZXIsIGFuZCB3aGVuP1wiKi5cbiAqIGBjcm1fdGFzay50eXBlYCBvZmZlcmVkIGEgYG1lZXRpbmdgIHZhbHVlIHdpdGggbm8gc3RhcnQgdGltZSwgbm8gZW5kIHRpbWUsXG4gKiBubyBsb2NhdGlvbiBhbmQgbm8gYXR0ZW5kZWVzLCBhbmQgYGxvZ19tZWV0aW5nYCBzdHVmZmVkIHRoZSBhdHRlbmRlZSBsaXN0XG4gKiBpbnRvIGEgSlNPTiBzdHJpbmcgaW5zaWRlIGBzeXNfYWN0aXZpdHkubWV0YWRhdGFgIFx1MjAxNCBhIHBheWxvYWQgbm8gbGlzdCB2aWV3XG4gKiBjYW4gZmlsdGVyLCBubyBkYXRhc2V0IGNhbiBncm91cCBieSwgYW5kIG5vIHJlcG9ydCBjYW4gY291bnQuXG4gKlxuICogYGNybV9ldmVudGAgaXMgdGhlIHF1ZXJ5YWJsZSBoYWxmIG9mIHRoYXQgc3Rvcnk6IG9uZSByb3cgcGVyIGludGVyYWN0aW9uXG4gKiB0aGF0IG9jY3VwaWVzIGEgc2xvdCBvbiBzb21lb25lJ3MgY2FsZW5kYXIsIHdoZXRoZXIgaXQgYWxyZWFkeSBoYXBwZW5lZCAoYVxuICogbG9nZ2VkIGNhbGwpIG9yIGlzIGJvb2tlZCBmb3IgbmV4dCBUdWVzZGF5IChhIHNjaGVkdWxlZCBtZWV0aW5nKS5cbiAqXG4gKiAjIFRoZSBUYXNrIC8gRXZlbnQgc3BsaXRcbiAqXG4gKiBgY3JtX3Rhc2tgIHN0YXlzIHdoYXQgaXQgd2FzIFx1MjAxNCBzb21ldGhpbmcgYSByZXAgc3RpbGwgKm93ZXMqIHNvbWVvbmUsIGR1ZSBvblxuICogYSBkYXRlLiBgY3JtX2V2ZW50YCBpcyBzb21ldGhpbmcgdGhhdCAqb2NjdXJzKiwgYmV0d2VlbiB0d28gdGltZXN0YW1wcywgd2l0aFxuICogcGVvcGxlIGluIHRoZSByb29tLiBUaGUgdHdvIG9iamVjdHMgZGVsaWJlcmF0ZWx5IGRvIE5PVCBtZXJnZTogYSB0by1kbyBsaXN0XG4gKiBzb3J0ZWQgYnkgZHVlIGRhdGUgYW5kIGEgY2FsZW5kYXIgc2NhbGVkIGJ5IGR1cmF0aW9uIGFyZSBkaWZmZXJlbnQgc3VyZmFjZXMsXG4gKiBhbmQgZXZlcnkgQ1JNIHRoYXQgY29sbGFwc2VkIHRoZW0gZW5kZWQgdXAgd2l0aCBhIFwiZHVyYXRpb25cIiBjb2x1bW4gdGhhdCBpc1xuICogbnVsbCBvbiA5MCUgb2Ygcm93cy5cbiAqXG4gKiBFbWFpbHMgYXJlIHRoZSB0aGlyZCBzaGFwZSBhbmQgc3RheSBvdXQ6IGFuIGVtYWlsIGlzIG5vdCBhIGNhbGVuZGFyIHNsb3QsIHNvXG4gKiBgc2VuZF9lbWFpbGAga2VlcHMgd3JpdGluZyBgc3lzX2VtYWlsYCArIGBzeXNfYWN0aXZpdHlgIChpdCBkb2VzIG5vdyBhbHNvXG4gKiBzdGFtcCBjb250YWN0IHJlY2VuY3kgXHUyMDE0IHNlZSBgY29udGFjdC5hY3Rpb25zLnRzYCkuXG4gKlxuICogIyBgc3RhdHVzYCBpcyB3aGF0IG1ha2VzIHRoZSBjaHVybiBzaWduYWwgaG9uZXN0XG4gKlxuICogT25seSBhIGBoZWxkYCBldmVudCBidW1wcyBgY3JtX2FjY291bnQubGFzdF9hY3Rpdml0eV9kYXRlYCAvXG4gKiBgY3JtX2xlYWQubGFzdF9jb250YWN0ZWRfZGF0ZWAgKHNlZSBgZXZlbnQuaG9vay50c2ApLiBBIG1lZXRpbmcgKmJvb2tlZCogZm9yXG4gKiBuZXh0IHF1YXJ0ZXIgaXMgbm90IGFuIGludGVyYWN0aW9uIHRoYXQgaGFwcGVuZWQsIGFuZCBsZXR0aW5nIGl0IHJlc2V0IHRoZVxuICogcmVjZW5jeSBjbG9jayBpcyBwcmVjaXNlbHkgaG93IGFuIFwiYXQgcmlza1wiIHJlcG9ydCBsZWFybnMgdG8gbGllLlxuICovXG5leHBvcnQgY29uc3QgRXZlbnQgPSBPYmplY3RTY2hlbWEuY3JlYXRlKHtcbiAgbmFtZTogJ2NybV9ldmVudCcsXG4gIGxhYmVsOiAnRXZlbnQnLFxuICBwbHVyYWxMYWJlbDogJ0V2ZW50cycsXG4gIGljb246ICdjYWxlbmRhci1kYXlzJyxcbiAgZGVzY3JpcHRpb246ICdNZWV0aW5ncywgY2FsbHMgYW5kIG90aGVyIHNjaGVkdWxlZCBpbnRlcmFjdGlvbnMgd2l0aCBjdXN0b21lcnMnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIE1pcnJvcnMgYGNybV90YXNrYDogYW4gZXZlbnRcbiAgLy8gaXMgYSBwZXJzb25hbCBhY3Rpdml0eSByZWNvcmQsIG93bmVkIGJ5IHRoZSByZXAgd2hvIHJhbiBpdC5cbiAgc2hhcmluZ01vZGVsOiAncHJpdmF0ZScsXG5cbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2Jhc2ljJywgICAgbGFiZWw6ICdFdmVudCBJbmZvcm1hdGlvbicsIGljb246ICdpbmZvJyB9LFxuICAgIHsga2V5OiAnc2NoZWR1bGUnLCBsYWJlbDogJ1NjaGVkdWxlJywgICAgICAgICAgaWNvbjogJ2NhbGVuZGFyJyB9LFxuICAgIHsga2V5OiAncmVsYXRlZCcsICBsYWJlbDogJ1JlbGF0ZWQgUmVjb3JkcycsICAgaWNvbjogJ2xpbmsnIH0sXG4gICAgeyBrZXk6ICdvdXRjb21lJywgIGxhYmVsOiAnT3V0Y29tZScsICAgICAgICAgICBpY29uOiAnY2xpcGJvYXJkLWNoZWNrJywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gUGxhdGZvcm0gb3duZXJzaGlwIGFuY2hvciBcdTIwMTQgY2Fub25pY2FsIG5vdGUgaW4gYGFjY291bnQub2JqZWN0LnRzYCAoIzU0OCkuXG4gICAgb3duZXJfaWQ6IEZpZWxkLmxvb2t1cCgnc3lzX3VzZXInLCB7XG4gICAgICBsYWJlbDogJ0Fzc2lnbmVkIFRvJyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgc3lzdGVtOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IGZhbHNlLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEV2ZW50IEluZm9ybWF0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHN1YmplY3Q6IEZpZWxkLnRleHQoe1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ1N1YmplY3QnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBtYXhMZW5ndGg6IDI1NSxcbiAgICB9KSxcblxuICAgIHR5cGU6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnRXZlbnQgVHlwZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgLy8gRmllbGQtbGV2ZWwgZGVmYXVsdCwgbm90IGp1c3QgdGhlIG9wdGlvbiBmbGFnOiB0aGUgb3B0aW9uIGBkZWZhdWx0YFxuICAgICAgLy8gb25seSBwcmVzZWxlY3RzIGluIHNvbWUgZm9ybSBzdXJmYWNlcywgc28gYSBxdWljay1jcmVhdGUgb3BlbmVkIGZyb20gYVxuICAgICAgLy8gcmVsYXRlZCBsaXN0IGxlZnQgdGhpcyByZXF1aXJlZCBmaWVsZCBibGFuayAoc2FtZSBkZWZlY3QgY3JtX3Rhc2suc3RhdHVzXG4gICAgICAvLyBjYXJyaWVzIGEgbm90ZSBhYm91dCkuXG4gICAgICBkZWZhdWx0VmFsdWU6ICdtZWV0aW5nJyxcbiAgICAgIG9wdGlvbnM6IFsuLi5FVkVOVF9UWVBFX09QVElPTlNdLFxuICAgIH0pLFxuXG4gICAgc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ1N0YXR1cycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgICAgZGVmYXVsdFZhbHVlOiAncGxhbm5lZCcsXG4gICAgICBvcHRpb25zOiBbLi4uRVZFTlRfU1RBVFVTX09QVElPTlNdLFxuICAgIH0pLFxuXG4gICAgZGVzY3JpcHRpb246IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbGFiZWw6ICdEZXNjcmlwdGlvbicsXG4gICAgfSksXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgU2NoZWR1bGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgc3RhcnRfZGF0ZXRpbWU6IEZpZWxkLmRhdGV0aW1lKHtcbiAgICAgIGdyb3VwOiAnc2NoZWR1bGUnLFxuICAgICAgbGFiZWw6ICdTdGFydCcsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgIH0pLFxuXG4gICAgZW5kX2RhdGV0aW1lOiBGaWVsZC5kYXRldGltZSh7XG4gICAgICBncm91cDogJ3NjaGVkdWxlJyxcbiAgICAgIGxhYmVsOiAnRW5kJyxcbiAgICB9KSxcblxuICAgIGFsbF9kYXk6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgZ3JvdXA6ICdzY2hlZHVsZScsXG4gICAgICBsYWJlbDogJ0FsbCBEYXkgRXZlbnQnLFxuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICB9KSxcblxuICAgIC8vIERlcml2ZWQgaW4gYGV2ZW50Lmhvb2sudHNgIGZyb20gc3RhcnQvZW5kLiBOT1QgYHJlYWRvbmx5YDogdGhlIGZpZWxkIGlzXG4gICAgLy8gYWxzbyB3aGF0IHRoZSBhY3Rpdml0eSBhY3Rpb25zIHN1cHBseSBkaXJlY3RseSB3aGVuIGEgcmVwIGxvZ3MgYSBjYWxsXG4gICAgLy8gdGhhdCB0b29rIDIwIG1pbnV0ZXMsIGFuZCBhIHJlYWRvbmx5IGZpZWxkIGlzIHN0cmlwcGVkIGZyb20gYW55IHdyaXRlXG4gICAgLy8gd2hvc2UgQ0FMTEVSIHN1cHBsaWVkIHRoZSBrZXkgKCMyOTQ4KSBcdTIwMTQgaW5jbHVkaW5nIGFuIGFjdGlvbiBib2R5IHJ1bm5pbmdcbiAgICAvLyB1bmRlciB0aGUgcmVwJ3Mgb3duIGNvbnRleHQuIERlcml2YXRpb24gaW5zaWRlIHRoaXMgb2JqZWN0J3Mgb3duXG4gICAgLy8gYmVmb3JlLWhvb2sgaXMgdW5hZmZlY3RlZCBlaXRoZXIgd2F5ICh0aGUgc3RyaXAga2V5cyBvZmYgdGhlIGNhbGxlcidzXG4gICAgLy8gcGF5bG9hZCwgbm90IHRoZSBwb3N0LWhvb2sgZG9jdW1lbnQpLCBzbyBsZWF2aW5nIGl0IHdyaXRhYmxlIGNvc3RzXG4gICAgLy8gbm90aGluZyBhbmQga2VlcHMgYGxvZ19jYWxsYCBob25lc3QuXG4gICAgZHVyYXRpb25fbWludXRlczogRmllbGQubnVtYmVyKHtcbiAgICAgIGdyb3VwOiAnc2NoZWR1bGUnLFxuICAgICAgbGFiZWw6ICdEdXJhdGlvbiAobWludXRlcyknLFxuICAgICAgbWluOiAwLFxuICAgICAgc2NhbGU6IDAsXG4gICAgfSksXG5cbiAgICBsb2NhdGlvbjogRmllbGQudGV4dCh7XG4gICAgICBncm91cDogJ3NjaGVkdWxlJyxcbiAgICAgIGxhYmVsOiAnTG9jYXRpb24nLFxuICAgICAgbWF4TGVuZ3RoOiAyNTUsXG4gICAgICBkZXNjcmlwdGlvbjogJ1Jvb20sIGFkZHJlc3MsIG9yIG1lZXRpbmcgbGluaycsXG4gICAgfSksXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgUmVsYXRlZCBSZWNvcmRzIChwb2x5bW9ycGhpYywgc2FtZSBzaGFwZSBhcyBjcm1fdGFzaykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgcmVsYXRlZF90b190eXBlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgZ3JvdXA6ICdyZWxhdGVkJyxcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBUbyBUeXBlJyxcbiAgICAgIG9wdGlvbnM6IFsuLi5SRUxBVEVEX1RPX1RZUEVfT1BUSU9OU10sXG4gICAgfSksXG5cbiAgICByZWxhdGVkX3RvX2FjY291bnQ6IEZpZWxkLmxvb2t1cCgnY3JtX2FjY291bnQnLCB7XG4gICAgICBncm91cDogJ3JlbGF0ZWQnLFxuICAgICAgbGFiZWw6ICdSZWxhdGVkIEFjY291bnQnLFxuICAgIH0pLFxuXG4gICAgcmVsYXRlZF90b19jb250YWN0OiBGaWVsZC5sb29rdXAoJ2NybV9jb250YWN0Jywge1xuICAgICAgZ3JvdXA6ICdyZWxhdGVkJyxcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBDb250YWN0JyxcbiAgICB9KSxcblxuICAgIHJlbGF0ZWRfdG9fb3Bwb3J0dW5pdHk6IEZpZWxkLmxvb2t1cCgnY3JtX29wcG9ydHVuaXR5Jywge1xuICAgICAgZ3JvdXA6ICdyZWxhdGVkJyxcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBPcHBvcnR1bml0eScsXG4gICAgfSksXG5cbiAgICByZWxhdGVkX3RvX2xlYWQ6IEZpZWxkLmxvb2t1cCgnY3JtX2xlYWQnLCB7XG4gICAgICBncm91cDogJ3JlbGF0ZWQnLFxuICAgICAgbGFiZWw6ICdSZWxhdGVkIExlYWQnLFxuICAgIH0pLFxuXG4gICAgcmVsYXRlZF90b19jYXNlOiBGaWVsZC5sb29rdXAoJ2NybV9jYXNlJywge1xuICAgICAgZ3JvdXA6ICdyZWxhdGVkJyxcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBDYXNlJyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBPdXRjb21lIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIG91dGNvbWVfbm90ZXM6IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGdyb3VwOiAnb3V0Y29tZScsXG4gICAgICBsYWJlbDogJ091dGNvbWUgTm90ZXMnLFxuICAgICAgZGVzY3JpcHRpb246ICdXaGF0IHdhcyBhZ3JlZWQsIGFuZCB3aGF0IGhhcHBlbnMgbmV4dCcsXG4gICAgfSksXG5cbiAgICAvLyBObyBgaXNfcGFzdGAgLyBgaXNfdXBjb21pbmdgIGJvb2xlYW4uIEEgd3JpdGUtdGltZSBzbmFwc2hvdCBvZiBcImhhcyB0aGlzXG4gICAgLy8gaGFwcGVuZWQgeWV0XCIgaXMgc3RhbGUgdGhlIG1vbWVudCB0aGUgY2xvY2sgcGFzc2VzIGl0LCBhbmQgdGhlIGFwcCBoYXNcbiAgICAvLyBhbHJlYWR5IGJlZW4gYnVybnQgYnkgZXhhY3RseSB0aGF0IChgY3JtX3Rhc2suaXNfb3ZlcmR1ZWAgXHUyMDE0IHNlZSB0aGVcbiAgICAvLyBgb3ZlcmR1ZV90YXNrc2AgdmlldydzIGxhYmVsIG5vdGUpLiBgc3RhdHVzYCBpcyB0aGUgYXV0aG9yZWQsIG5vbi1kZWNheWluZ1xuICAgIC8vIHNpZ25hbCwgYW5kIHRoZSB1cGNvbWluZy9wYXN0IHZpZXdzIGZpbHRlciBvbiBpdCBhbmQgc29ydCBieVxuICAgIC8vIGBzdGFydF9kYXRldGltZWAgaW5zdGVhZC5cbiAgfSxcblxuICAvLyBBUEkgc3VyZmFjZS4gSGlzdG9yeSBcdTIxOTIgRmllbGQudHJhY2tIaXN0b3J5IChBRFItMDA1MikuXG4gIGVuYWJsZToge1xuICAgIGFwaUVuYWJsZWQ6IHRydWUsXG4gIH0sXG5cbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ3N0YXJ0X2RhdGV0aW1lJ10gfSxcbiAgICB7IGZpZWxkczogWydvd25lcl9pZCddIH0sXG4gICAgeyBmaWVsZHM6IFsnc3RhdHVzJ10gfSxcbiAgICB7IGZpZWxkczogWydyZWxhdGVkX3RvX2FjY291bnQnXSB9LFxuICAgIHsgZmllbGRzOiBbJ3JlbGF0ZWRfdG9fb3Bwb3J0dW5pdHknXSB9LFxuICBdLFxuXG4gIC8vIEFEUi0wMDc5OiBgbmFtZUZpZWxkYCBuYW1lcyB0aGUgcmVhbCBmaWVsZCBob2xkaW5nIHRoZSByZWNvcmQgdGl0bGUuXG4gIG5hbWVGaWVsZDogJ3N1YmplY3QnLFxuICBoaWdobGlnaHRGaWVsZHM6IFsnc3ViamVjdCcsICd0eXBlJywgJ3N0YXR1cycsICdzdGFydF9kYXRldGltZScsICdvd25lcl9pZCddLFxuICBzZWFyY2hhYmxlRmllbGRzOiBbJ3N1YmplY3QnLCAnbG9jYXRpb24nXSxcblxuICAvLyBQcmVkaWNhdGVzIGJlbG93IGFyZSBUT1RBTDogZXZlcnkgYHJlY29yZC54YCByZWFkIGlzIGBoYXMoKWAtZ3VhcmRlZCwgc28gdGhlXG4gIC8vIHJ1bGUgcmV0dXJucyBhIHZlcmRpY3QgZXZlbiB3aGVuIHRoZSBtZXJnZWQgcmVjb3JkIGhhcyBubyBzdWNoIGtleS4gU2VlXG4gIC8vIEFHRU5UUy5tZCBcIlZhbGlkYXRpb24gcHJlZGljYXRlcyBtdXN0IGJlIFRPVEFMXCIgYW5kXG4gIC8vIHRlc3Qvb2JqZWN0LXZhbGlkYXRpb24tcHJlZGljYXRlcy50ZXN0LnRzLCB3aGljaCBmYWlscyB0aGUgYnVpbGQgb3RoZXJ3aXNlLlxuICB2YWxpZGF0aW9uczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdlbmRfYWZ0ZXJfc3RhcnQnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdUaGUgZW5kIHRpbWUgbXVzdCBiZSBhZnRlciB0aGUgc3RhcnQgdGltZScsXG4gICAgICAvLyBCT1RIIGd1YXJkcywgb24gYm90aCBvcGVyYW5kcywgYmVjYXVzZSB0aGV5IGFuc3dlciBkaWZmZXJlbnQgaGF6YXJkc1xuICAgICAgLy8gKEFHRU5UUy5tZCBcIlZhbGlkYXRpb24gcHJlZGljYXRlcyBtdXN0IGJlIFRPVEFMXCIpOlxuICAgICAgLy8gICBcdTAwQjcgYGhhcyguLi4pYCAgXHUyMDE0IGFic2VudCBrZXkuIE9uIGEgZHJpdmVyIHRoYXQgc3RvcmVzIG9ubHkgdGhlIGNvbHVtbnNcbiAgICAgIC8vICAgICBhIHJvdyB3YXMgd3JpdHRlbiB3aXRoLCBhbiBhYnNlbnQgYGVuZF9kYXRldGltZWAgYWJvcnRzIHRoZSB3aG9sZVxuICAgICAgLy8gICAgIHByZWRpY2F0ZSB1bmRlciBzdHJpY3QgQ0VMLCBhbmQgZnJvbSAxNy4wLjAtcmMuMiB0aGF0IGFib3J0IFJFSkVDVFNcbiAgICAgIC8vICAgICB0aGUgc2F2ZSByYXRoZXIgdGhhbiBza2lwcGluZyB0aGUgcnVsZSAoIzQ2NDkpLlxuICAgICAgLy8gICBcdTAwQjcgYCE9IG51bGxgICAgXHUyMDE0IHByZXNlbnQtYnV0LW51bGwuIGBkeW48bnVsbD4gPCBkeW5gIGFib3J0cyB0b28sIGFuZFxuICAgICAgLy8gICAgIGBoYXMoKWAgc2F5cyBub3RoaW5nIGFib3V0IGl0LlxuICAgICAgLy8gQW4gb3JkZXJpbmcgY29tcGFyaXNvbiBuZWVkcyBib3RoOyBuZWl0aGVyIHN1YnN0aXR1dGVzIGZvciB0aGUgb3RoZXIuXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5zdGFydF9kYXRldGltZSkgJiYgaGFzKHJlY29yZC5lbmRfZGF0ZXRpbWUpICYmIHJlY29yZC5zdGFydF9kYXRldGltZSAhPSBudWxsICYmIHJlY29yZC5lbmRfZGF0ZXRpbWUgIT0gbnVsbCAmJiAhaXNCbGFuayhyZWNvcmQuZW5kX2RhdGV0aW1lKSAmJiByZWNvcmQuZW5kX2RhdGV0aW1lIDwgcmVjb3JkLnN0YXJ0X2RhdGV0aW1lYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdyZWxhdGVkX3RvX3JlcXVpcmVkJyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6ICdBdCBsZWFzdCBvbmUgcmVsYXRlZCByZWNvcmQgc2hvdWxkIGJlIHNlbGVjdGVkJyxcbiAgICAgIGNvbmRpdGlvbjogUGAoIWhhcyhyZWNvcmQucmVsYXRlZF90b19hY2NvdW50KSB8fCBpc0JsYW5rKHJlY29yZC5yZWxhdGVkX3RvX2FjY291bnQpKSAmJiAoIWhhcyhyZWNvcmQucmVsYXRlZF90b19jb250YWN0KSB8fCBpc0JsYW5rKHJlY29yZC5yZWxhdGVkX3RvX2NvbnRhY3QpKSAmJiAoIWhhcyhyZWNvcmQucmVsYXRlZF90b19vcHBvcnR1bml0eSkgfHwgaXNCbGFuayhyZWNvcmQucmVsYXRlZF90b19vcHBvcnR1bml0eSkpICYmICghaGFzKHJlY29yZC5yZWxhdGVkX3RvX2xlYWQpIHx8IGlzQmxhbmsocmVjb3JkLnJlbGF0ZWRfdG9fbGVhZCkpICYmICghaGFzKHJlY29yZC5yZWxhdGVkX3RvX2Nhc2UpIHx8IGlzQmxhbmsocmVjb3JkLnJlbGF0ZWRfdG9fY2FzZSkpYCxcbiAgICB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2V2ZW50X2F0dGVuZGVlLm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvZXZlbnRfYXR0ZW5kZWUub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBleHByZXNzaW9uIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgT2JqZWN0U2NoZW1hLCBGaWVsZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgQVRURU5ERUVfUkVTUE9OU0VfT1BUSU9OUyB9IGZyb20gJy4vX3BpY2tsaXN0cyc7XG5cbi8qKlxuICogVGhlIHdheXMgYW4gYXR0ZW5kZWUgcm93IGNhbiBuYW1lIGEgcGVyc29uIFx1MjAxNCBPTkUgZGVjbGFyYXRpb24sIG5vdCB0d28gbGlzdHNcbiAqIHRoYXQgaGFwcGVuIHRvIGxpbmUgdXAuXG4gKlxuICogYGF0dGVuZGVlX3R5cGVgIGlzIHRoZSBkaXNjcmltaW5hdG9yIGFuZCBlYWNoIG9mIHRoZSBmb3VyIGNvbHVtbnMgYmVsb3cgaXMgYVxuICogcmVzb2x1dGlvbi4gXHUyNkQ0IEF1dGhvcmluZyB0aGUgdHdvIHNlcGFyYXRlbHkgbGV0cyB0aGVtIGRyaWZ0LCBhbmQgdGhlIGZhaWx1cmVcbiAqIGlzIHNpbGVudDogYSB0eXBlIHdpdGggbm8gbWF0Y2hpbmcgcmVzb2x1dGlvbiBtZWFucyBhbiBleHRlcm5hbCBndWVzdCBjYW5cbiAqIG9ubHkgYmUgU1RPUkVEIE1JU0xBQkVMTEVEIChhIHJvdyBjbGFpbWluZyB0byBiZSBhIENvbnRhY3Qgd2hpbGUgcG9pbnRpbmcgYXRcbiAqIG5vIGNvbnRhY3QgaXMgQUNDRVBURUQsIGFuZCBhbiBvbWl0dGVkIHR5cGUgZmFsbHMgdG8gdGhlIGZpZWxkIGRlZmF1bHQpLlxuICpcbiAqIERlcml2aW5nIEJPVEggdGhlIHBpY2tsaXN0IGFuZCB0aGUgdHdvIHJ1bGVzIGZyb20gdGhpcyB0YWJsZSBpcyB0aGUgcG9pbnQ6IGFcbiAqIGZpZnRoIHJlc29sdXRpb24gY2Fubm90IGJlIGFkZGVkIHdpdGhvdXQgaXRzIHR5cGUsIGFuZCBhIHR5cGUgY2Fubm90IGJlIGFkZGVkXG4gKiB3aXRob3V0IHNheWluZyB3aGljaCBjb2x1bW4gaXQgbmFtZXMgXHUyMDE0IHRoZSBmYWlsdXJlIGlzIG5vdCBleHByZXNzaWJsZSBpbiB0aGlzXG4gKiBzaGFwZS4gRXZlcnl0aGluZyBkb3duc3RyZWFtIChvcHRpb25zLCBgYXR0ZW5kZWVfcmVzb2x2ZXNgLFxuICogYGF0dGVuZGVlX3R5cGVfZXhjbHVzaXZlYCkgaXMgZ2VuZXJhdGVkIGJlbG93OyBub3RoaW5nIHJlcGVhdHMgdGhlIHBhaXJpbmcuXG4gKiBgdGVzdC9hdHRlbmRlZS10eXBlLXJlc29sdXRpb24udGVzdC50c2AgcGlucyBpdC5cbiAqXG4gKiBBZGRpbmcgYSByb3cgaGVyZSBpcyBhIHVzZXItdmlzaWJsZSBwaWNrbGlzdCBjaGFuZ2U6IGl0IG5lZWRzIGEgbGFiZWwgaW4gYWxsXG4gKiBmb3VyIGxvY2FsZSBwYWNrcyAoYHRlc3QvaTE4bi1yZWZlcmVuY2VzLnRlc3QudHNgIGZhaWxzIG90aGVyd2lzZSkgYW5kIGFcbiAqIGNoYW5nZXNldC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFUVEVOREVFX1JFU09MVVRJT05TID0gW1xuICB7IHZhbHVlOiAnY29udGFjdCcsICBjb2x1bW46ICdjcm1fY29udGFjdCcsICAgbGFiZWw6ICdDb250YWN0JywgIGNvbG9yOiAnIzQxNjlFMScgfSxcbiAgeyB2YWx1ZTogJ2xlYWQnLCAgICAgY29sdW1uOiAnY3JtX2xlYWQnLCAgICAgIGxhYmVsOiAnTGVhZCcsICAgICBjb2xvcjogJyNGRkE1MDAnIH0sXG4gIHsgdmFsdWU6ICd1c2VyJywgICAgIGNvbHVtbjogJ3N5c191c2VyJywgICAgICBsYWJlbDogJ1VzZXInLCAgICAgY29sb3I6ICcjMDBBQTAwJyB9LFxuICB7IHZhbHVlOiAnZXh0ZXJuYWwnLCBjb2x1bW46ICdleHRlcm5hbF9uYW1lJywgbGFiZWw6ICdFeHRlcm5hbCcsIGNvbG9yOiAnIzhBOEE4QScgfSxcbl0gYXMgY29uc3Q7XG5cbi8qKiBBIG5ldyBhdHRlbmRlZSByb3cgaXMgYSBDb250YWN0IHVudGlsIHRoZSBhdXRob3Igc2F5cyBvdGhlcndpc2UuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BVFRFTkRFRV9UWVBFID0gJ2NvbnRhY3QnO1xuXG4vLyBUaGUgcHJlZGljYXRlIGZyYWdtZW50cyBiZWxvdyBhcmUgdGhlIFRPVEFMIHNoYXBlcyBmcm9tIHRoZSBob3VzZSBydWxlIGluXG4vLyBgdGVzdC9vYmplY3QtdmFsaWRhdGlvbi1wcmVkaWNhdGVzLnRlc3QudHNgOiBldmVyeSBgcmVjb3JkLnhgIHJlYWQgY2FycmllcyBpdHNcbi8vIG93biBgaGFzKHJlY29yZC54KWAgaW4gdGhlIHNhbWUgZXhwcmVzc2lvbiwgc28gdGhlIHJ1bGUgcmV0dXJucyBhIHZlcmRpY3Qgb24gYVxuLy8gbWVyZ2VkIHJlY29yZCB3aXRoIGFic2VudCBrZXlzIGluc3RlYWQgb2YgYWJvcnRpbmcgKGFuZCwgZnJvbSAxNy4wLjAtcmMuMixcbi8vIHJlamVjdGluZyB0aGUgd3JpdGUgaXQgY291bGQgbm90IGp1ZGdlKS5cbmNvbnN0IGJsYW5rID0gKGY6IHN0cmluZykgPT4gYCghaGFzKHJlY29yZC4ke2Z9KSB8fCBpc0JsYW5rKHJlY29yZC4ke2Z9KSlgO1xuY29uc3QgZmlsbGVkID0gKGY6IHN0cmluZykgPT4gYChoYXMocmVjb3JkLiR7Zn0pICYmICFpc0JsYW5rKHJlY29yZC4ke2Z9KSlgO1xuY29uc3QgdHlwZUlzID0gKHY6IHN0cmluZykgPT4gYChoYXMocmVjb3JkLmF0dGVuZGVlX3R5cGUpICYmIHJlY29yZC5hdHRlbmRlZV90eXBlID09IFwiJHt2fVwiKWA7XG5jb25zdCB0eXBlSXNOb3QgPSAodjogc3RyaW5nKSA9PiBgKGhhcyhyZWNvcmQuYXR0ZW5kZWVfdHlwZSkgJiYgcmVjb3JkLmF0dGVuZGVlX3R5cGUgIT0gXCIke3Z9XCIpYDtcblxuLyoqXG4gKiBWaW9sYXRpb24gcHJlZGljYXRlcyBcdTIwMTQgdmFsaWRhdGlvbnMgZmlyZSB3aGVuIHRoZSBjb25kaXRpb24gaXMgVFJVRS5cbiAqXG4gKiBUaGV5IGFyZSB0aGUgdHdvIGhhbHZlcyBvZiBcImRlY2xhcmVkID0gZW5mb3JjZWRcIiwgc3BsaXQgc28gZWFjaCBjb25kaXRpb25cbiAqIGNhcnJpZXMgaXRzIG93biB3b3JkaW5nOiBhIHJvdyBtaXNzaW5nIHRoZSBwYXJ0eSBpdHMgdHlwZSBuYW1lcyBpcyBhXG4gKiBkaWZmZXJlbnQgbWlzdGFrZSBmcm9tIGEgcm93IG5hbWluZyBhIHBhcnR5IGl0cyB0eXBlIGRvZXMgbm90LlxuICpcbiAqIEEgcmVjb3JkIHdob3NlIGBhdHRlbmRlZV90eXBlYCBpcyBhYnNlbnQgc2F0aXNmaWVzIG5laXRoZXIgKGV2ZXJ5IGZyYWdtZW50IGlzXG4gKiBgaGFzKClgLWd1YXJkZWQgb24gaXQpLCB3aGljaCBpcyBkZWxpYmVyYXRlOiBcIm5vIHR5cGUgYXQgYWxsXCIgaXMgdGhlIFJFUVVJUkVEXG4gKiBmaWVsZCdzIGpvYiBcdTIwMTQgYEF0dGVuZGVlIFR5cGUgaXMgcmVxdWlyZWRgIG5hbWVzIHRoZSByZWFsIG9ic3RhY2xlLCBhbmQgYVxuICogc2Vjb25kIHJ1bGUgc2F5aW5nIHNvIHdvdWxkIG9ubHkgc2hhZG93IGl0LlxuICovXG5jb25zdCBSRVNPTFZFU19DT05ESVRJT04gPSBBVFRFTkRFRV9SRVNPTFVUSU9OU1xuICAubWFwKChyKSA9PiBgKCR7dHlwZUlzKHIudmFsdWUpfSAmJiAke2JsYW5rKHIuY29sdW1uKX0pYClcbiAgLmpvaW4oJyB8fCAnKTtcblxuY29uc3QgRVhDTFVTSVZFX0NPTkRJVElPTiA9IEFUVEVOREVFX1JFU09MVVRJT05TXG4gIC5tYXAoKHIpID0+IGAoJHtmaWxsZWQoci5jb2x1bW4pfSAmJiAke3R5cGVJc05vdChyLnZhbHVlKX0pYClcbiAgLmpvaW4oJyB8fCAnKTtcblxuLyoqXG4gKiBgcmVxdWlyZWRXaGVuYCBmb3Igb25lIHBhcnR5IGNvbHVtbiBcdTIwMTQgdGhlIFNBTUUgY29ycmVzcG9uZGVuY2UgdGhlIHR3byBydWxlc1xuICogZW5mb3JjZSwgYXNrZWQgb25lIGxheWVyIGVhcmxpZXIgc28gdGhlIGZvcm0gbWFya3MgdGhlIGNvbHVtbiB0aGUgY2hvc2VuIHR5cGVcbiAqIG5hbWVzIGluc3RlYWQgb2YgbGV0dGluZyB0aGUgc2F2ZSBkaXNjb3ZlciBpdCBpcyBlbXB0eS4gRGVyaXZlZCBmcm9tXG4gKiBgQVRURU5ERUVfUkVTT0xVVElPTlNgIGxpa2UgZXZlcnl0aGluZyBlbHNlIGhlcmU6IGEgZmlmdGggcmVzb2x1dGlvbiBnZXRzIGl0c1xuICogaGludCBmb3IgZnJlZSBhbmQgY2Fubm90IGdldCBpdCB3cm9uZy5cbiAqXG4gKiBUaGlzIGlzIGEgSElOVCwgbm90IHRoZSBjb250cmFjdC4gYGF0dGVuZGVlX3Jlc29sdmVzYCBhbmRcbiAqIGBhdHRlbmRlZV90eXBlX2V4Y2x1c2l2ZWAgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUgYXJlIHRoZSBjb250cmFjdCBldmVyeVxuICogd3JpdGVyIG1lZXRzIFx1MjAxNCBSRVNULCBPYmplY3RRTCwgc2VlZHMsIGZsb3dzIFx1MjAxNCBhbmQgbm90aGluZyBoZXJlIHJlbGF4ZXNcbiAqIGVpdGhlci4gXHUyNkEwXHVGRTBGIGByZXF1aXJlZFdoZW5gIGlzIGEgdHJhbnNpdGlvbiBnYXRlLCBub3QgYW4gaW52YXJpYW50OiBpdCBhc2tzIHRoZVxuICogd3JpdGUgaW4gZnJvbnQgb2YgaXQgZm9yIHRoZSBjb2x1bW4sIGl0IGRvZXMgbm90IHN0YXRlIGEgcHJvcGVydHkgb2Ygc3RvcmVkXG4gKiByb3dzLiBUaGUgZHVwbGljYXRpb24gaXMgZGVsaWJlcmF0ZSBhbmQgdmlzaWJsZSBcdTIwMTQgYSBSRVNUIGluc2VydCBvbWl0dGluZyB0aGVcbiAqIG5hbWVkIGNvbHVtbiBhbnN3ZXJzIHR3aWNlLCBvbmNlIHBlciBsYXllciwgYW5kIHRoZSBhY2NlcHRlZCBzZXQgaXNcbiAqIHVuY2hhbmdlZC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgVGhlIHByZWRpY2F0ZSBpcyBUT1RBTCAoYGhhcygpYC1ndWFyZGVkIHZpYSBgdHlwZUlzYCksIHRoZSBzYW1lIGhvdXNlIHJ1bGVcbiAqIEFHRU5UUy5tZCBzdGF0ZXMgZm9yIGV2ZXJ5IGF1dGhvcmVkIENFTCBwcmVkaWNhdGUuIGByZXF1aXJlZFdoZW5gIGZhaWxzXG4gKiBDTE9TRUQgaW4gdGhlIENvbnNvbGUgXHUyMDE0IGFuIHVuZXZhbHVhYmxlIHByZWRpY2F0ZSBkZW1hbmRzIG5vdGhpbmcgXHUyMDE0IHNvIGFuXG4gKiB1bmd1YXJkZWQgb25lIHdvdWxkIHJlYWQgYXMgZW5mb3JjZWQgaGVyZSBhbmQgcmVxdWlyZSBub3RoaW5nIGF0IHRoZSBmb3JtLlxuICpcbiAqICMgXHUyNkQ0IFdoeSB0aGVyZSBpcyBubyBgdmlzaWJsZVdoZW5gIGJlc2lkZSBpdFxuICpcbiAqIFx1MjZBMFx1RkUwRiBQbGF0Zm9ybSBjb25zdHJhaW50LCBtZWFzdXJlZCBpbiB0aGUgYnJvd3NlciBvbiAxNy4xLjA6IHRoZSBDb25zb2xlIGhpZGVzXG4gKiBhIHBvcHVsYXRlZCBmaWVsZCBXSVRIT1VUIGNsZWFyaW5nIGl0IGFuZCBzdWJtaXRzIHRoZSBzdGFsZSB2YWx1ZSBhbnl3YXkuXG4gKiBGaWxsIENvbnRhY3QsIHRoZW4gY2hhbmdlIHRoZSB0eXBlIHRvIExlYWQgXHUyMDE0IHRoZSBDb250YWN0IGNvbHVtbiBsZWF2ZXMgdGhlXG4gKiBET00sIGl0cyB2YWx1ZSBzdGF5cyBpbiBmb3JtIHN0YXRlLCBhbmQgdGhlIHdyaXRlIGNhcnJpZXMgaXQ6XG4gKlxuICogICAgIFBPU1QgIHtcImF0dGVuZGVlX3R5cGVcIjpcImxlYWRcIiwgXHUyMDI2LCBcImNybV9jb250YWN0XCI6XCJBRXdQZmZia012eC1PbEM0XCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY3JtX2xlYWRcIjpcIjBBTV96YmRqdUxjWE1kbkxcIn1cbiAqICAgICA0MDAgICBBbiBhdHRlbmRlZSBuYW1lcyBleGFjdGx5IG9uZSBwYXJ0eSBcdTIwMTQgY2xlYXIgZXZlcnkgcGFydHkgY29sdW1uXG4gKiAgICAgICAgICAgaXRzIEF0dGVuZGVlIFR5cGUgZG9lcyBub3QgbmFtZVxuICpcbiAqIFx1MjAxNCBzbyB0aGUgcm93IGlzIHJlZnVzZWQsIGNvcnJlY3RseSwgYnkgYSBtZXNzYWdlIG5hbWluZyBhIGNvbHVtbiBubyBsb25nZXIgb25cbiAqIHNjcmVlbiB0byBjbGVhci4gT24gdGhlIEVESVQgcGF0aCBpdCBpcyBhIGRlYWQgZW5kIHJhdGhlciB0aGFuIGEgcHV6emxlOlxuICogcmV0eXBpbmcgYSBzdG9yZWQgYGNvbnRhY3RgIHJvdyB0byBgdXNlcmAgcmUtc2VuZHMgdGhlIHN0b3JlZCBgY3JtX2NvbnRhY3RgXG4gKiBvbiBldmVyeSBhdHRlbXB0LCBhbmQgdGhlIENvbnNvbGUgb2ZmZXJzIG5vIHdheSB0byBlbXB0eSBpdC4gVG9kYXkncyBmb3JtIGlzXG4gKiB3b3JzZS1sb29raW5nIGFuZCBzdHJpY3RseSBtb3JlIHVzYWJsZTogdGhlIG9mZmVuZGluZyBjb2x1bW4gaXMgdmlzaWJsZSwgc29cbiAqIHRoZSBlcnJvciBjYW4gYmUgYWN0ZWQgb24uXG4gKlxuICogTm90aGluZyBpbiBgQG9iamVjdHN0YWNrL3NwZWNgIDE3LjEuMCBvciB0aGUgc2hpcHBlZCBDb25zb2xlIGNsZWFycyBhIHZhbHVlXG4gKiB3aGVuIGl0cyBmaWVsZCBnb2VzIGludmlzaWJsZSBcdTIwMTQgbm8gYGNsZWFyT25IaWRlYC1zaGFwZWQga2V5IGV4aXN0cyBvbiBlaXRoZXJcbiAqIHN1cmZhY2UgXHUyMDE0IHNvIGB2aXNpYmxlV2hlbmAgaGVyZSBjYW5ub3QgYmUgcGFpcmVkIGludG8gc2FmZXR5IGZyb20gdGhpcyByZXBvLlxuICogVGhlIGhhbGYgdGhhdCB3b3VsZCBuZWVkIHRvIGNoYW5nZSBpcyB1cHN0cmVhbTsgaXQgaXMgdGhlIHNhbWVcbiAqIGZhaWwtb3Blbi9zdGFsZS1zdGF0ZSBmYW1pbHkgYXMgdGhlIG5vdGUgaW4gYHNyYy9zYWxlcy92aWV3cy9sZWFkLnZpZXcudHNgLiBcdTI2RDQgRG9cbiAqIG5vdCBhZGQgYHZpc2libGVXaGVuYCB0byB0aGVzZSBmb3VyIGNvbHVtbnMgdW50aWwgYSBoaWRkZW4gZmllbGQgc3RvcHMgYmVpbmdcbiAqIHN1Ym1pdHRlZDsgdGhlIHJ1bGVzIGFib3ZlIHdpbGwga2VlcCByZWZ1c2luZyB0aGUgcm93LCBidXQgdGhlIHBlcnNvbiBpblxuICogZnJvbnQgb2YgdGhlIGZvcm0gd2lsbCBoYXZlIG5vIHdheSB0byBmaXggaXQuXG4gKi9cbmNvbnN0IHBhcnR5Rm9ybUhpbnRzID0gKGNvbHVtbjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHJlc29sdXRpb24gPSBBVFRFTkRFRV9SRVNPTFVUSU9OUy5maW5kKChyKSA9PiByLmNvbHVtbiA9PT0gY29sdW1uKTtcbiAgaWYgKCFyZXNvbHV0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBhdHRlbmRlZSByZXNvbHV0aW9uIGRlY2xhcmVzIHRoZSBjb2x1bW4gXCIke2NvbHVtbn1cImApO1xuICB9XG4gIHJldHVybiB7XG4gICAgcmVxdWlyZWRXaGVuOiBleHByZXNzaW9uKHR5cGVJcyhyZXNvbHV0aW9uLnZhbHVlKSwgJ2NlbCcpLFxuICB9O1xufTtcblxuLyoqXG4gKiBFdmVudCBBdHRlbmRlZSBcdTIwMTQgd2hvIHdhcyBpbiB0aGUgcm9vbS5cbiAqXG4gKiAjIFdoeSBhIGp1bmN0aW9uIG9iamVjdCwgYW5kIG5vdCBtdWx0aS12YWx1ZSBsb29rdXBzXG4gKlxuICogXCJBdHRlbmRlZXMgYXJlIHF1ZXJ5YWJsZSBSRUNPUkRTLCBub3QgSlNPTiBzdHJpbmdzXCIsIGFuZCB0aHJlZSBwcm9wZXJ0aWVzXG4gKiBkZWNpZGUgdGhlIHNoYXBlOlxuICpcbiAqICAxLiAqKkF0dGVuZGVlcyBhcmUgaGV0ZXJvZ2VuZW91cy4qKiBBIGN1c3RvbWVyIG1lZXRpbmcgaGFzIGludGVybmFsIHBlb3BsZVxuICogICAgIChgc3lzX3VzZXJgKSwgZXhpc3RpbmcgY3VzdG9tZXJzIChgY3JtX2NvbnRhY3RgKSBhbmQgcHJvc3BlY3RzXG4gKiAgICAgKGBjcm1fbGVhZGApIGluIGl0LiBBIGBGaWVsZC5sb29rdXAoLi4uLCB7IG11bHRpcGxlOiB0cnVlIH0pYCBwb2ludHMgYXRcbiAqICAgICBleGFjdGx5IE9ORSBvYmplY3QsIHNvIGEgbXVsdGktbG9va3VwIGRlc2lnbiBuZWVkcyB0aHJlZSBwYXJhbGxlbFxuICogICAgIG11bHRpLWxvb2t1cHMgYW5kIG5vIHdheSB0byBvcmRlciBvciBkZS1kdXBsaWNhdGUgYWNyb3NzIHRoZW0uXG4gKiAgMi4gKipBbiBhdHRlbmRlZSBjYXJyaWVzIGl0cyBvd24gYXR0cmlidXRlcy4qKiBgcmVzcG9uc2VgIGFuZCBgaXNfb3JnYW5pemVyYFxuICogICAgIGJlbG9uZyB0byB0aGUgKnBhaXJpbmcqIG9mIGEgcGVyc29uIGFuZCBhbiBldmVudCwgbm90IHRvIGVpdGhlciBzaWRlLiBBXG4gKiAgICAgbXVsdGktdmFsdWUgbG9va3VwIHN0b3JlcyBhIGJhcmUgaWQgYXJyYXkgd2l0aCBub3doZXJlIHRvIGhhbmcgdGhlbS5cbiAqICAzLiAqKkEganVuY3Rpb24gaXMgcXVlcnlhYmxlLioqIFwiTWVldGluZ3MgdGhpcyByZXAgYXR0ZW5kZWRcIiwgXCJjb250YWN0cyB3aG9cbiAqICAgICBkZWNsaW5lZCB0d2ljZSB0aGlzIHF1YXJ0ZXJcIiBhbmQgXCJhY2NvdW50cyB3aG9zZSBjaGFtcGlvbiBoYXMgbm90XG4gKiAgICAgYXR0ZW5kZWQgYW55dGhpbmcgaW4gOTAgZGF5c1wiIGFyZSBhbGwgYGZpbmQoKWAgY2FsbHMgb24gdGhpcyBvYmplY3QuXG4gKiAgICAgQWdhaW5zdCBhbiBpZCBhcnJheSBpbnNpZGUgYSBtdWx0aS12YWx1ZSBjb2x1bW4gdGhleSBhcmUgbm90IGV4cHJlc3NpYmxlXG4gKiAgICAgaW4gT2JqZWN0UUwgYXQgYWxsLlxuICpcbiAqIFRoaXMgbWlycm9ycyBgY3JtX2NhbXBhaWduX21lbWJlcmAsIHRoZSBhcHAncyBleGlzdGluZyBqdW5jdGlvbiwgZG93biB0byB0aGVcbiAqIGF1dG9udW1iZXIgYG5hbWVGaWVsZGAgYW5kIHRoZSBgY29udHJvbGxlZF9ieV9wYXJlbnRgIE9XRC5cbiAqXG4gKiAjIEFjY2VzcyBkZXJpdmVzIGZyb20gdGhlIGV2ZW50XG4gKlxuICogYHNoYXJpbmdNb2RlbDogJ2NvbnRyb2xsZWRfYnlfcGFyZW50J2AgKEFEUi0wMDU1KS4gVGhlIHJlbGF0aW9uIHJlc29sdmVyXG4gKiBhY2NlcHRzIHRoZSBSRVFVSVJFRCBgY3JtX2V2ZW50YCBsb29rdXAgYXMgdGhlIHBhcmVudCwgc28gbm8gbWFzdGVyLWRldGFpbFxuICogY29udmVyc2lvbiBpcyBuZWVkZWQgXHUyMDE0IHNhbWUgY29uc3RydWN0aW9uIGFzIGBjcm1fY2FtcGFpZ25fbWVtYmVyYC5cbiAqXG4gKiBSZWFkcyBhcmUgZmlsdGVyZWQgdG8gYXR0ZW5kZWVzIHdob3NlIGBjcm1fZXZlbnRgIHRoZSBjYWxsZXIgY2FuIHJlYWQsIGFuZFxuICogYWRkaW5nIG9yIHVwZGF0aW5nIGFuIGF0dGVuZGVlIHJlcXVpcmVzIGVkaXQgYWNjZXNzIHRvIHRoYXQgZXZlbnQuIFx1MjZBMFx1RkUwRiBUaGF0XG4gKiBkZXJpdmF0aW9uIHJlc29sdmVzIHRocm91Z2ggdGhlIHNhbWUgcGF0aHMgYSBkaXJlY3QgcmVhZCBvZiB0aGUgZXZlbnQgdGFrZXMgXHUyMDE0XG4gKiBvd25lcnNoaXAgc2NvcGUgYW5kIGBzeXNfcmVjb3JkX3NoYXJlYCBncmFudHMgZm9sZGVkIGluLCBub3QgdGhlIG1hc3RlcidzXG4gKiByb3ctbGV2ZWwgc2VjdXJpdHkgcG9saWNpZXMgYWxvbmUuIFRoZSBkaXN0aW5jdGlvbiBpcyBub3QgYWNhZGVtaWM6IGFuXG4gKiBlYXJsaWVyIHBsYXRmb3JtIHZlcnNpb24gY29uc3VsdGVkIG1hc3RlciBSTFMgcG9saWNpZXMgT05MWSwgdW5kZXIgYSBTWVNURU1cbiAqIGNvbnRleHQsIGFuZCBIb3RDUk0gYXV0aG9ycyBub25lIG9uIGBjcm1fZXZlbnRgIFx1MjAxNCBzbyBldmVyeSBhdHRlbmRlZSByb3cgb2ZcbiAqIGV2ZXJ5IG1lZXRpbmcgcmVhY2hlZCBldmVyeSBob2xkZXIgb2Ygb2JqZWN0LWxldmVsIHJlYWQuXG4gKiBgdGVzdC9wYXJlbnQtZGVyaXZlZC1yZWFjaC50ZXN0LnRzYCBwaW5zIHRoZSBuYXJyb3cgYmVoYXZpb3VyIGFuZCB3YXMgd3JpdHRlblxuICogdG8gZ28gcmVkIHRoZSBkYXkgdGhlIHBsYXRmb3JtIGNoYW5nZWQgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBFdmVudEF0dGVuZGVlID0gT2JqZWN0U2NoZW1hLmNyZWF0ZSh7XG4gIG5hbWU6ICdjcm1fZXZlbnRfYXR0ZW5kZWUnLFxuICBsYWJlbDogJ0V2ZW50IEF0dGVuZGVlJyxcbiAgcGx1cmFsTGFiZWw6ICdFdmVudCBBdHRlbmRlZXMnLFxuICBpY29uOiAndXNlcnMnLFxuICBkZXNjcmlwdGlvbjogJ0EgcGVyc29uIGludml0ZWQgdG8gb3IgcHJlc2VudCBhdCBhbiBldmVudCcsXG5cbiAgc2hhcmluZ01vZGVsOiAnY29udHJvbGxlZF9ieV9wYXJlbnQnLFxuXG4gIC8vIEFEUi0wMDc5OiBqdW5jdGlvbiByb3dzIGhhdmUgbm8gZGVyaXZhYmxlIHRleHQgdGl0bGU7IHBvaW50IHRoZSBjYW5vbmljYWxcbiAgLy8gbmFtZUZpZWxkIGF0IHRoZSBzdG9yZWQgYXV0b251bWJlciBleHBsaWNpdGx5IChhdXRvbnVtYmVyIGlzIG5vdCBpbiB0aGVcbiAgLy8gYXV0by1kZXJpdmF0aW9uIHdoaXRlbGlzdCkuXG4gIG5hbWVGaWVsZDogJ2F0dGVuZGVlX251bWJlcicsXG5cbiAgaGlnaGxpZ2h0RmllbGRzOiBbJ2NybV9ldmVudCcsICdhdHRlbmRlZV90eXBlJywgJ3Jlc3BvbnNlJywgJ2lzX29yZ2FuaXplciddLFxuXG4gIGZpZWxkR3JvdXBzOiBbXG4gICAgeyBrZXk6ICdiYXNpYycsICAgIGxhYmVsOiAnQXR0ZW5kZWUnLCAgIGljb246ICd1c2VyJyB9LFxuICAgIHsga2V5OiAncmVzcG9uc2UnLCBsYWJlbDogJ0ludml0YXRpb24nLCBpY29uOiAnbWFpbC1jaGVjaycgfSxcbiAgXSxcblxuICBmaWVsZHM6IHtcbiAgICBhdHRlbmRlZV9udW1iZXI6IEZpZWxkLmF1dG9udW1iZXIoe1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ0F0dGVuZGVlIE51bWJlcicsXG4gICAgICBmb3JtYXQ6ICdFQS17MDAwMDB9JyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjZBMFx1RkUwRiBEZWxpYmVyYXRlbHkgbGVmdCBvbiB0aGUgc3BlYyBkZWZhdWx0LCBhbmQgTk9UIGNhc2NhZGVkIHdpdGggdGhlIHBhcnR5XG4gICAgLy8gbG9va3VwcyBiZWxvdy4gQmVjYXVzZSBpdCBpcyBSRVFVSVJFRCwgdGhlIGVuZ2luZSBlc2NhbGF0ZXMgdGhlIHN0b3JlZFxuICAgIC8vIGBzZXRfbnVsbGAgdG8gYSByZWZ1c2FsIGF0IGRlbGV0ZSB0aW1lLCB3aXRoIGEgbWVzc2FnZSBuYW1pbmcgdGhlIHJlYWxcbiAgICAvLyBvYnN0YWNsZSBpbnN0ZWFkIG9mIGFuIHVucmVsYXRlZCBydWxlOiBcIkNhbm5vdCBkZWxldGUgY3JtX2V2ZW50ICguLi4pOiAzXG4gICAgLy8gZGVwZW5kZW50IGNybV9ldmVudF9hdHRlbmRlZSByZWNvcmQocykgcmVmZXJlbmNlIGl0IHZpYSBjcm1fZXZlbnRcbiAgICAvLyAoY3JtX2V2ZW50IGlzIHJlcXVpcmVkLCBzbyBpdCBjYW5ub3QgYmUgY2xlYXJlZCkuXCIgVGhhdCBpcyB0aGUgY29ycmVjdFxuICAgIC8vIGFuc3dlciBvbiB0aGlzIHNpZGUsIGZvciB0aGUgc2FtZSByZWFzb24gYGNybV9jYW1wYWlnbl9tZW1iZXIuY3JtX2NhbXBhaWduYFxuICAgIC8vIGtlZXBzIGl0OiBhIG1lZXRpbmcncyBhdHRlbmRlZSBsaXN0IGlzIHRoZSBtZWV0aW5nJ3MgaGlzdG9yaWNhbCByZWNvcmQsXG4gICAgLy8gbm90IGEgcGVyLXBlcnNvbiBhcnRlZmFjdC4gYHRlc3QvZXZlbnQtYXR0ZW5kZWUtY2FzY2FkZS50ZXN0LnRzYCBwaW5zIHRoZVxuICAgIC8vIHJlc29sdmVkIHZhbHVlIHNvIGEgY29weS1wYXN0ZSBvZiB0aGUgdGhyZWUgY2FzY2FkZXMgY2Fubm90IHJlYWNoIGhlcmUuXG4gICAgY3JtX2V2ZW50OiBGaWVsZC5sb29rdXAoJ2NybV9ldmVudCcsIHtcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbGFiZWw6ICdFdmVudCcsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgIH0pLFxuXG4gICAgLy8gVGhlIGRpc2NyaW1pbmF0b3Igc2F5cyB3aGljaCBvZiB0aGUgZm91ciBjb2x1bW5zIGJlbG93IGlzIHRoZSBsaXZlIG9uZS4gSXRcbiAgICAvLyBpcyBhdXRob3JlZCByYXRoZXIgdGhhbiBkZXJpdmVkIHNvIGEgcXVlcnkgY2FuIGZpbHRlciBcImludGVybmFsIGF0dGVuZGVlc1xuICAgIC8vIG9ubHlcIiB3aXRob3V0IGZvdXIgT1InZCBudWxsIGNoZWNrcy4gVGhlIG9wdGlvbnMgYXJlIEdFTkVSQVRFRCBmcm9tIHRoZVxuICAgIC8vIHJlc29sdXRpb24gdGFibGUgcmF0aGVyIHRoYW4gcmV0eXBlZCBcdTIwMTQgc2VlIHRoZSBub3RlIGF0IHRoZSB0b3Agb2YgdGhpc1xuICAgIC8vIGZpbGUgZm9yIHdoeSB0aGUgcGFpcmluZyBpcyBkZWNsYXJlZCBvbmNlLlxuICAgIGF0dGVuZGVlX3R5cGU6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnQXR0ZW5kZWUgVHlwZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgZGVmYXVsdFZhbHVlOiBERUZBVUxUX0FUVEVOREVFX1RZUEUsXG4gICAgICBvcHRpb25zOiBBVFRFTkRFRV9SRVNPTFVUSU9OUy5tYXAoKHIpID0+ICh7XG4gICAgICAgIGxhYmVsOiByLmxhYmVsLFxuICAgICAgICB2YWx1ZTogci52YWx1ZSxcbiAgICAgICAgY29sb3I6IHIuY29sb3IsXG4gICAgICAgIC4uLihyLnZhbHVlID09PSBERUZBVUxUX0FUVEVOREVFX1RZUEUgPyB7IGRlZmF1bHQ6IHRydWUgfSA6IHt9KSxcbiAgICAgIH0pKSxcbiAgICB9KSxcblxuICAgIC8vIFx1MjZENCBgZGVsZXRlQmVoYXZpb3I6ICdjYXNjYWRlJ2Agb24gQUxMIFRIUkVFIHBhcnR5IGxvb2t1cHMsIG5vdCB0aGUgZGVmYXVsdC5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBQbGF0Zm9ybSBjb25zdHJhaW50OiBhIGxvb2t1cCBkZWZhdWx0cyB0byBgc2V0X251bGxgLCBhbmQgdGhlIGVuZ2luZVxuICAgIC8vIGltcGxlbWVudHMgYHNldF9udWxsYCBieSBVUERBVElORyB0aGUgcm93IHRoYXQgaG9sZHMgaXQuIE9uIGEgY29sdW1uIGFcbiAgICAvLyB2YWxpZGF0aW9uIHJ1bGUgcmVhZHMsIHRoYXQgbWFrZXMgdGhlIHJlZmVyZW5jZWQgcGFydHkgcGVybWFuZW50bHlcbiAgICAvLyBVTkRFTEVUQUJMRTogY2xlYXJpbmcgdGhpcyBjb2x1bW4gbGVhdmVzIHRoZSByb3cgdGhlIGVuZ2luZSBqdXN0IGVkaXRlZCBpblxuICAgIC8vIHZpb2xhdGlvbiBvZiBgYXR0ZW5kZWVfcmVzb2x2ZXNgIGJlbG93LCBhbmQgdGhlIHdob2xlIGRlbGV0ZSByb2xscyBiYWNrXG4gICAgLy8gd2l0aCBhbiBlcnJvciBuYW1pbmcgYW4gb2JqZWN0IHRoZSBjYWxsZXIgbmV2ZXIgYWRkcmVzc2VkLiBUaGUgc2FtZVxuICAgIC8vIGNvbnN0cnVjdGlvbiBiaXRlcyBgY3JtX2NhbXBhaWduX21lbWJlcmAuXG4gICAgLy9cbiAgICAvLyBgZXh0ZXJuYWxfbmFtZWAgaXMgdGhlIGZvdXJ0aCByZXNvbHV0aW9uLCBidXQgaXQgaXMgYmxhbmsgb24gZXZlcnkgcm93IHRoZVxuICAgIC8vIHByb2R1Y3QgYWN0dWFsbHkgd3JpdGVzIChgc3JjL3NhbGVzL2FjdGlvbnMvYWN0aXZpdHktYWN0aW9ucy50c2AgbG9ncyBhdHRlbmRlZXNcbiAgICAvLyB3aXRoIGEgcGFydHkgcmVmZXJlbmNlIGFuZCBuZXZlciBhbiBleHRlcm5hbCBuYW1lKSwgc28gaXQgcmVzY3VlcyBub3RoaW5nLlxuICAgIC8vXG4gICAgLy8gQ2FzY2FkZSByYXRoZXIgdGhhbiBgcmVzdHJpY3RgOiBhbiBhdHRlbmRlZSByb3cgaXMgYSBKVU5DVElPTiB3aG9zZSB3aG9sZVxuICAgIC8vIG1lYW5pbmcgaXMgXCJ0aGlzIHBlcnNvbiB3YXMgaW4gdGhpcyByb29tXCIuIE9uY2UgdGhlIHBlcnNvbiBpcyBnb25lIHRoZSByb3dcbiAgICAvLyBkZW5vdGVzIG5vdGhpbmcsIGFuZCB0aGUgcXVlcnkgaXQgZXhpc3RzIHRvIHNlcnZlIChcIm1lZXRpbmdzIHRoaXMgcGVyc29uXG4gICAgLy8gYXR0ZW5kZWRcIikgaGFzIGxvc3QgaXRzIHN1YmplY3QuIGByZXN0cmljdGAgd291bGQgcHJvZHVjZSBhbiBhY2N1cmF0ZVxuICAgIC8vIG1lc3NhZ2UgYnV0IGtlZXAgdGhlIHBlcnNvbiB1bmRlbGV0YWJsZSB1bnRpbCBzb21lb25lIGRlbGV0ZWQgdGhlaXJcbiAgICAvLyBhdHRlbmRhbmNlIGJ5IGhhbmQsIGFuZCB1bmRlbGV0YWJsZSBQRU9QTEUgaXMgdGhlIGltcGFjdCBiZWluZyBmaXhlZC5cbiAgICAvLyBDYXNjYWRlIGFsc28gbGVhdmVzIG5vIHJlYWNoYWJsZSBzdGF0ZSBpbiB3aGljaCBhIHN0b3JlZCBhdHRlbmRlZSByb3dcbiAgICAvLyBicmVha3MgaXRzIG93biBvYmplY3QncyBydWxlLlxuICAgIGNybV9jb250YWN0OiBGaWVsZC5sb29rdXAoJ2NybV9jb250YWN0Jywge1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ0NvbnRhY3QnLFxuICAgICAgZGVsZXRlQmVoYXZpb3I6ICdjYXNjYWRlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2V0IHdoZW4gdGhlIGF0dGVuZGVlIGlzIGFuIGV4aXN0aW5nIGN1c3RvbWVyIGNvbnRhY3QnLFxuICAgICAgLi4ucGFydHlGb3JtSGludHMoJ2NybV9jb250YWN0JyksXG4gICAgfSksXG5cbiAgICBjcm1fbGVhZDogRmllbGQubG9va3VwKCdjcm1fbGVhZCcsIHtcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbGFiZWw6ICdMZWFkJyxcbiAgICAgIGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NldCB3aGVuIHRoZSBhdHRlbmRlZSBpcyBzdGlsbCBhbiB1bmNvbnZlcnRlZCBsZWFkJyxcbiAgICAgIC4uLnBhcnR5Rm9ybUhpbnRzKCdjcm1fbGVhZCcpLFxuICAgIH0pLFxuXG4gICAgLy8gYHN5c191c2VyYCBnZXRzIHRoZSBTQU1FIGFuc3dlciBhcyB0aGUgdHdvIENSTSBwYXJ0aWVzLCBhbmQgaXQgd2FzIHdvcnRoIGFcbiAgICAvLyBzZWNvbmQgbG9vayByYXRoZXIgdGhhbiBhIGNvcHktcGFzdGU6XG4gICAgLy9cbiAgICAvLyAgXHUwMEI3IERlbGV0aW5nIGEgdXNlciBpcyBhIHJlYWwsIHJlYWNoYWJsZSBvcGVyYXRpb24uIEdlbmVyaWMgQ1JVRCBkZWxldGUgb25cbiAgICAvLyAgICB0aGUgaWRlbnRpdHkgdGFibGUgaXMgb2ZmIChgc3lzX3VzZXJgIHNoaXBzIGBhcGlNZXRob2RzOiBbJ2dldCcsXG4gICAgLy8gICAgJ2xpc3QnLCAndXBkYXRlJywgJ2J1bGsnXWApLCBidXQgYmV0dGVyLWF1dGgncyBvd24gcm91dGVzIFx1MjAxNFxuICAgIC8vICAgIGAvYXBpL3YxL2F1dGgvZGVsZXRlLXVzZXJgLCB3aGljaCB0aGUgcGxhdGZvcm0ncyBgc3lzX3VzZXJgIG9iamVjdFxuICAgIC8vICAgIHN1cmZhY2VzIGFzIHRoZSBcIkRlbGV0ZSBNeSBBY2NvdW50XCIgcmVjb3JkIGFjdGlvbiwgYW5kXG4gICAgLy8gICAgYC9hcGkvdjEvYXV0aC9hZG1pbi9yZW1vdmUtdXNlcmAgXHUyMDE0IHJlc29sdmUgYHVzZXJgIHRvIGBzeXNfdXNlcmAgYW5kXG4gICAgLy8gICAgbGFuZCBvbiBgZGF0YUVuZ2luZS5kZWxldGUoLi4uKWAsIGkuZS4gdGhlIFNBTUUgT2JqZWN0UUwgZGVsZXRlIHRoYXRcbiAgICAvLyAgICBydW5zIHRoZSByZWZlcmVudGlhbCBwYXNzLiBTbyBgc2V0X251bGxgIGhlcmUgaXMgbm90IGRvcm1hbnQ6IGl0IGJyZWFrc1xuICAgIC8vICAgIGFjY291bnQgZXJhc3VyZSBmb3IgYW55IGNvbGxlYWd1ZSB3aG8gZXZlciBhdHRlbmRlZCBhIG1lZXRpbmcuXG4gICAgLy8gIFx1MDBCNyBUaGUgYXBwJ3Mgc2hpcHBlZCBzdGFuY2UgaXMgYWxyZWFkeSBcImEgZGVsZXRlZCB1c2VyJ3MgcmVmZXJlbmNlc1xuICAgIC8vICAgIGRlZ3JhZGVcIi4gRVZFUlkgb3RoZXIgYHN5c191c2VyYCBsb29rdXAgaW4gSG90Q1JNIChldmVyeSBgb3duZXJfaWRgLFxuICAgIC8vICAgIHBsdXMgYHByb2R1Y3RfbWFuYWdlcmApIGlzIGBzZXRfbnVsbGAgYW5kIE5PIHZhbGlkYXRpb24gcnVsZSByZWFkcyBhbnlcbiAgICAvLyAgICBvZiB0aGVtIFx1MjAxNCB0aGUgcnVsZSBiZWxvdyBpcyB0aGUgb25seSBvbmUgaW4gdGhlIGFwcCB0aGF0IHJlYWRzIGEgdXNlclxuICAgIC8vICAgIHJlZmVyZW5jZSBhdCBhbGwsIHdoaWNoIGlzIHByZWNpc2VseSB3aHkgdGhpcyBpcyB0aGUgb25seSBsb29rdXAgd2hlcmVcbiAgICAvLyAgICB0aGUgZGVmYXVsdCBtaXNiZWhhdmVzLiBgcmVzdHJpY3RgIGhlcmUgd291bGQgbWFrZSB0aGlzIGp1bmN0aW9uIHRoZVxuICAgIC8vICAgIE9ORSBhcHAgcm93IGFibGUgdG8gdmV0byBhIHBsYXRmb3JtIGlkZW50aXR5IGVyYXN1cmUgXHUyMDE0IGFuIGFwcCBvYmplY3RcbiAgICAvLyAgICBob2xkaW5nIGEgYHByb3RlY3Rpb246IHsgbG9jazogJ2Z1bGwnIH1gLCBiZXR0ZXItYXV0aC1tYW5hZ2VkIHRhYmxlXG4gICAgLy8gICAgaG9zdGFnZSwgc3VyZmFjaW5nIGFzIGFuIG9wYXF1ZSBmYWlsdXJlIGZyb20gYW4gYXV0aCByb3V0ZS4gVGhhdCBpcyBhXG4gICAgLy8gICAgbGF5ZXJpbmcgaW52ZXJzaW9uLCBub3QgYSBmaXguXG4gICAgLy8gIFx1MDBCNyBUaGUgY29zdCBvZiBjYXNjYWRlIGlzIGJvdW5kZWQgYW5kIGlzIHRoZSByaWdodCBoYWxmIHRvIGxvc2U6IHRoZVxuICAgIC8vICAgIG1lZXRpbmcgaXRzZWxmIChgY3JtX2V2ZW50YCBcdTIwMTQgc3ViamVjdCwgdGltZXMsIG91dGNvbWUgbm90ZXMpIHN1cnZpdmVzXG4gICAgLy8gICAgdW50b3VjaGVkOyBvbmx5IHRoZSBwZXItcGVyc29uIHJvdyBnb2VzLCBhbmQgaXQgZ29lcyBiZWNhdXNlIHRoZVxuICAgIC8vICAgIHBlcnNvbidzIGlkZW50aXR5IHJlY29yZCB3YXMgZXJhc2VkLiBEZWFjdGl2YXRpb24sIG5vdCBkZWxldGlvbiwgaXMgdGhlXG4gICAgLy8gICAgb3JkaW5hcnkgb2ZmYm9hcmRpbmcgcGF0aCAodGhlIHBsYXRmb3JtIHNoaXBzIGJhbi91bmJhbiksIGFuZCBpdFxuICAgIC8vICAgIHRvdWNoZXMgbm90aGluZyBoZXJlLlxuICAgIHN5c191c2VyOiBGaWVsZC5sb29rdXAoJ3N5c191c2VyJywge1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ1VzZXInLFxuICAgICAgZGVsZXRlQmVoYXZpb3I6ICdjYXNjYWRlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2V0IHdoZW4gdGhlIGF0dGVuZGVlIGlzIGEgY29sbGVhZ3VlJyxcbiAgICAgIC4uLnBhcnR5Rm9ybUhpbnRzKCdzeXNfdXNlcicpLFxuICAgIH0pLFxuXG4gICAgLy8gRnJlZSB0ZXh0IGlzIHRoZSBMQVNUIHJlc29ydCwgbm90IHRoZSBkZWZhdWx0OiBpdCBleGlzdHMgb25seSBmb3IgdGhlXG4gICAgLy8gZ2VudWluZWx5IHVubW9kZWxsZWQgZ3Vlc3QgKGEgcHJvc3BlY3QncyBsYXd5ZXIgd2hvIGlzIGluIG5vIENSTSBvYmplY3QpLlxuICAgIC8vIEl0IGlzIHRoZSByZXNvbHV0aW9uIG9mIE9ORSBhdHRlbmRlZSB0eXBlIFx1MjAxNCBgZXh0ZXJuYWxgIFx1MjAxNCBhbmQgdGhlIHJ1bGVzXG4gICAgLy8gYmVsb3cgZW5mb3JjZSB0aGF0IGJvdGggd2F5czogYW4gYGV4dGVybmFsYCByb3cgbXVzdCBmaWxsIGl0LCBhbmQgbm9cbiAgICAvLyBvdGhlciB0eXBlIG1heS4gSXQgaXMgbm90IGEgcGxhY2UgdG8gcGFzdGUgYSBsaXN0LCBhbmQgbm90IGEgbm90ZSBmaWVsZFxuICAgIC8vIHRvIGhhbmcgb2ZmIGEgQ29udGFjdCByb3cuXG4gICAgZXh0ZXJuYWxfbmFtZTogRmllbGQudGV4dCh7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnRXh0ZXJuYWwgQXR0ZW5kZWUnLFxuICAgICAgbWF4TGVuZ3RoOiAyNTUsXG4gICAgICBkZXNjcmlwdGlvbjogJ05hbWUgb2YgYW4gYXR0ZW5kZWUgd2hvIGlzIGluIG5vIENSTSBvYmplY3QgXHUyMDE0IHNldCB3aGVuIEF0dGVuZGVlIFR5cGUgaXMgRXh0ZXJuYWwnLFxuICAgICAgLi4ucGFydHlGb3JtSGludHMoJ2V4dGVybmFsX25hbWUnKSxcbiAgICB9KSxcblxuICAgIHJlc3BvbnNlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgZ3JvdXA6ICdyZXNwb25zZScsXG4gICAgICBsYWJlbDogJ1Jlc3BvbnNlJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgICBkZWZhdWx0VmFsdWU6ICdub19yZXNwb25zZScsXG4gICAgICBvcHRpb25zOiBbLi4uQVRURU5ERUVfUkVTUE9OU0VfT1BUSU9OU10sXG4gICAgfSksXG5cbiAgICBpc19vcmdhbml6ZXI6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgZ3JvdXA6ICdyZXNwb25zZScsXG4gICAgICBsYWJlbDogJ09yZ2FuaXplcicsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNkQ0IE5PVCBgcmVhZG9ubHlgIFx1MjAxNCBidXQgdGhlIGNyb3NzLXJlZmVyZW5jZSB0aGlzIG5vdGUgdXNlZCB0byBjYXJyeSBpc1xuICAgIC8vIHJldGlyZWQsIG5vdCBtZXJlbHkgcmV3b3JkZWQ6IGBjcm1fY2FtcGFpZ25fbWVtYmVyLmFkZGVkX2RhdGVgIHdhcyBydWxlZFxuICAgIC8vIGByZWFkb25seTogdHJ1ZWAgaW4gIzE2NjcsIHNvIGl0IGlzIG5vIGxvbmdlciBhIHByZWNlZGVudCBmb3Iga2VlcGluZyBhblxuICAgIC8vIGluc2VydC1zdGFtcGVkIGNvbHVtbiBvcGVuLCBhbmQgdGhlIHJlYXNvbiBpdCBjaXRlZCAoXCJ0aGUgZW5naW5lIHN0cmlwcyBhXG4gICAgLy8gcmVhZG9ubHkga2V5IHRoZSBDQUxMRVIgc3VwcGxpZWRcIikgZG9lcyBub3QgcmVhY2ggYW4gSU5TRVJUIGF0IGFsbCBcdTIwMTQgdGhlXG4gICAgLy8gc3RyaXAgaXMgYW4gVVBEQVRFLXBhdGggcnVsZSAoYHRlc3QvcmVhZG9ubHktd3JpdGUtc2VtYW50aWNzLnRlc3QudHNgKS5cbiAgICAvLyBXaGF0IGhvbGRzIGl0IG9wZW4gaXMgbm93IE1FQVNVUkVEICgjMTc0NywgdGhlIHBlci13cml0ZXIgY2Vuc3VzICMxNDM1XG4gICAgLy8gcmFuIGZvciB0aGUgb3RoZXIgdGhyZWUpLCBub3QgXCJub2JvZHkgaGFzIHJ1bGVkIG9uIGl0XCI6IHRoaXMgY29sdW1uIGhhcyBhXG4gICAgLy8gdXNlci1jb250ZXh0IFVQREFURSB3cml0ZXIsIHdoaWNoIG5vbmUgb2YgdGhlIHRocmVlIGNvbHVtbnMgIzE2NjYgLyAjMTY2N1xuICAgIC8vIG1vdmVkIGhhZC4gVGhlIGNlbnN1cywgaW4gZnVsbDpcbiAgICAvLyAgIFx1MjAyMiB0aGUgZmlmdGVlbiBnZW5lcmF0ZWQgYWN0aXZpdHkgYWN0aW9ucyAoNSBgQUNUSVZJVFlfVEFSR0VUU2AgXHUwMEQ3IDNcbiAgICAvLyAgICAga2luZHMsIG9uZSBzaGFyZWQgYm9keSBpbiBgYWN0aXZpdHktYWN0aW9ucy50c2ApIElOU0VSVCBpdCwgYW5kIGFuXG4gICAgLy8gICAgIGFjdGlvbiBib2R5IHJ1bnMgYGlzU3lzdGVtYCBcdTIwMTQgZXhlbXB0IHR3aWNlIG92ZXI7XG4gICAgLy8gICBcdTIwMjIgdGhlIHR3byBgc2VydmljZS5zZWVkLnRzYCBhdHRlbmRlZSBzZWVkcyB3cml0ZSBpdCwgYW5kIHRoZWlyXG4gICAgLy8gICAgIGBtb2RlOiAndXBzZXJ0J2AgcmVwbGF5IFVQREFURSBpcyBleGVtcHQgdG9vLCBiZWNhdXNlIHNlZWQgd3JpdGVzIGFyZVxuICAgIC8vICAgICBgaXNTeXN0ZW1gIChgZmxvdy1zY2hlZHVsZWQudGVzdC50c2AgcGlucyB0aGF0IHZpYSBvd25lcmxlc3Mgcm93cyk7XG4gICAgLy8gICBcdTIwMjIgdGhlIHJlY29yZCBmb3JtIFx1MjAxNCBgZXZlbnRfYXR0ZW5kZWUudmlldy50c2AgbGlzdHMgaXQgaW4gdGhlXG4gICAgLy8gICAgIGBpbnZpdGF0aW9uYCBzZWN0aW9uLCBBVVRIT1JFRCByYXRoZXIgdGhhbiBzeW50aGVzaXplZCwgYW5kIHRoZSBmb3VyXG4gICAgLy8gICAgIHByb2ZpbGVzIHRoYXQgbmFtZSB0aGUgb2JqZWN0IGFsbCBncmFudCBgYWxsb3dFZGl0YC4gQSByZXAgY29ycmVjdGluZ1xuICAgIC8vICAgICBJbnZpdGVkIG9uIGEgc2F2ZWQgcm93IGlzIGEgbm9uLWBpc1N5c3RlbWAgVVBEQVRFIGNhcnJ5aW5nIGFcbiAgICAvLyAgICAgY2FsbGVyLXN1cHBsaWVkIGtleTogcHJlY2lzZWx5IHdoYXQgdGhlIHN0cmlwIGRlbGV0ZXMuIFRoZSB0aHJlZVxuICAgIC8vICAgICBmbGlwcGVkIGNvbHVtbnMgYXBwZWFyIGluIE5PIGZvcm0gc2VjdGlvbiBhbnl3aGVyZSBpbiBgc3JjLyovdmlld3MvYCxcbiAgICAvLyAgICAgYGNybV9vcHBvcnR1bml0eWAncyBhdXRob3JlZCBmb3JtIGluY2x1ZGVkLlxuICAgIC8vIFx1MkI1MCBJdCBpcyBhbHNvIG5vdCB0aGUgc2FtZSBLSU5EIG9mIGNvbHVtbi4gYGFkZGVkX2RhdGVgIC8gYGFwcHJvdmVkX2RhdGVgXG4gICAgLy8gYXJlIHN0YW1wZWQgYHtOT1coKX1gIGJ5IHRoZSB3cml0ZXIsIHNvIHRoZWlyIHZhbHVlIElTIHRoZSB3cml0ZSBtb21lbnQ7XG4gICAgLy8gYGludml0ZWRfZGF0ZWAgcmVjb3JkcyB3aGVuIHRoZSBpbnZpdGF0aW9uIHdlbnQgb3V0LCBhbmQgdGhlIHNlZWQgZGF0ZXMgaXRcbiAgICAvLyAzLTEwIGRheXMgYmVmb3JlIGl0cyBvd24gZXZlbnQsIHBlciByb3cuIEEgY29sdW1uIHdob3NlIHZhbHVlIGlzIG5vdCB0aGVcbiAgICAvLyB3cml0ZSBtb21lbnQgaXMgb25lIGEgcGVyc29uIGNhbiBiZSByaWdodCBhYm91dC4gXHUyNkQ0IERvIG5vdCBmbGlwIGl0IG9uIHRoZVxuICAgIC8vIHN0cmVuZ3RoIG9mIHRoZSBzaWJsaW5nIHJ1bGluZy5cbiAgICBpbnZpdGVkX2RhdGU6IEZpZWxkLmRhdGV0aW1lKHtcbiAgICAgIGdyb3VwOiAncmVzcG9uc2UnLFxuICAgICAgbGFiZWw6ICdJbnZpdGVkJyxcbiAgICB9KSxcbiAgfSxcblxuICBpbmRleGVzOiBbXG4gICAgeyBmaWVsZHM6IFsnY3JtX2V2ZW50J10gfSxcbiAgICB7IGZpZWxkczogWydjcm1fY29udGFjdCddIH0sXG4gICAgeyBmaWVsZHM6IFsnc3lzX3VzZXInXSB9LFxuICBdLFxuXG4gIC8vIFx1MjZBMFx1RkUwRiBQcmVkaWNhdGVzIGJlbG93IGFyZSBUT1RBTDogZXZlcnkgYHJlY29yZC54YCByZWFkIGlzIGBoYXMoKWAtZ3VhcmRlZCwgc29cbiAgLy8gdGhlIHJ1bGUgcmV0dXJucyBhIHZlcmRpY3QgZXZlbiB3aGVuIHRoZSBtZXJnZWQgcmVjb3JkIGhhcyBubyBzdWNoIGtleS4gU2VlXG4gIC8vIEFHRU5UUy5tZCBcIlZhbGlkYXRpb24gcHJlZGljYXRlcyBtdXN0IGJlIFRPVEFMXCIgYW5kXG4gIC8vIHRlc3Qvb2JqZWN0LXZhbGlkYXRpb24tcHJlZGljYXRlcy50ZXN0LnRzLCB3aGljaCBmYWlscyB0aGUgYnVpbGQgb3RoZXJ3aXNlLlxuICAvL1xuICAvLyBCb3RoIHJ1bGVzIGFyZSBHRU5FUkFURUQgZnJvbSBgQVRURU5ERUVfUkVTT0xVVElPTlNgIGF0IHRoZSB0b3Agb2YgdGhpc1xuICAvLyBmaWxlLiBcdTI2QTBcdUZFMEYgYGV4cHJlc3Npb24oLi4uLCAnY2VsJylgIGlzIHRoZSBzYW1lIGVudmVsb3BlIHRoZSBgYFBgXHUyMDI2YCBgYCB0YWdcbiAgLy8gcHJvZHVjZXMsIGJ1dCB0aGUgdGFnIEpTT04tcXVvdGVzIGFuIGludGVycG9sYXRlZCBzdHJpbmcgYW5kIHNvIGNhbm5vdFxuICAvLyBzcGxpY2UgYSBzb3VyY2UgZnJhZ21lbnQgXHUyMDE0IHdoaWNoIGlzIHdoeSB0aGVzZSB1c2UgdGhlIGZ1bmN0aW9uIGZvcm0uIFRoZVxuICAvLyBwYWlyaW5nIGlzIGRlY2xhcmVkIG9uY2UgYW5kIHJlYWQgdHdpY2U7IHNlZSB0aGUgbm90ZSB1cCB0aGVyZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICAvLyBUaGUgdHlwZSdzIG93biBjb2x1bW4gbXVzdCBiZSBmaWxsZWQuXG4gICAge1xuICAgICAgbmFtZTogJ2F0dGVuZGVlX3Jlc29sdmVzJyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOlxuICAgICAgICAnQW4gYXR0ZW5kZWUgbXVzdCBmaWxsIHRoZSBwYXJ0eSBpdHMgQXR0ZW5kZWUgVHlwZSBuYW1lcyBcdTIwMTQgYSBDb250YWN0IHJvdyBuZWVkcyBhIENvbnRhY3QsIGFuIEV4dGVybmFsIHJvdyBuZWVkcyBhbiBFeHRlcm5hbCBBdHRlbmRlZSBuYW1lJyxcbiAgICAgIGNvbmRpdGlvbjogZXhwcmVzc2lvbihSRVNPTFZFU19DT05ESVRJT04sICdjZWwnKSxcbiAgICB9LFxuICAgIC8vIFx1MjAyNmFuZCBubyBvdGhlciBjb2x1bW4gbWF5IGJlIGZpbGxlZC4gVGhlIHNlcGFyYXRlIHJ1bGUgaXMgZGVsaWJlcmF0ZTogb25lXG4gICAgLy8gY29uZGl0aW9uLCBvbmUgd29yZGluZy4gRm9sZGluZyBib3RoIGludG8gYGF0dGVuZGVlX3Jlc29sdmVzYCB3b3VsZCBtYWtlXG4gICAgLy8gaXRzIG1lc3NhZ2UgYSBsaWUgZm9yIGhhbGYgdGhlIHJvd3MgaXQgcmVqZWN0cywgYW5kIFwieW91IGZpbGxlZCB0aGUgd3JvbmdcbiAgICAvLyBjb2x1bW5cIiBpcyBub3QgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gYXMgXCJ5b3UgZmlsbGVkIG5vdGhpbmdcIi5cbiAgICB7XG4gICAgICBuYW1lOiAnYXR0ZW5kZWVfdHlwZV9leGNsdXNpdmUnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6XG4gICAgICAgICdBbiBhdHRlbmRlZSBuYW1lcyBleGFjdGx5IG9uZSBwYXJ0eSBcdTIwMTQgY2xlYXIgZXZlcnkgcGFydHkgY29sdW1uIGl0cyBBdHRlbmRlZSBUeXBlIGRvZXMgbm90IG5hbWUnLFxuICAgICAgY29uZGl0aW9uOiBleHByZXNzaW9uKEVYQ0xVU0lWRV9DT05ESVRJT04sICdjZWwnKSxcbiAgICB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2ZvcmVjYXN0Lm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvZm9yZWNhc3Qub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBPYmplY3RTY2hlbWEsIEZpZWxkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBGLCBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuXG4vKipcbiAqIEZvcmVjYXN0IE9iamVjdFxuICpcbiAqIE1vbnRobHkgLyBxdWFydGVybHkgc25hcHNob3Qgb2YgcGlwZWxpbmUgYnkgb3duZXIuIEVhY2ggcmVjb3JkIGhvbGRzXG4gKiB0aGUgYWdncmVnYXRlZCBhbW91bnRzIGF0IHRoZSBtb21lbnQgb2Ygc25hcHNob3QsIHNvIHRyZW5kIHJlcG9ydHNcbiAqIChcImhvdyBkaWQgb3VyIFEzIGZvcmVjYXN0IGNoYW5nZSB3ZWVrIG92ZXIgd2Vlaz9cIikgY2FuIGJlIGJ1aWx0XG4gKiB3aXRob3V0IHJlLWFnZ3JlZ2F0aW5nIG9wcG9ydHVuaXR5IGhpc3RvcnkuXG4gKlxuICogV3JpdHRlbiBieTpcbiAqICAgXHUyMDIyIGBzcmMvc2FsZXMvZmxvd3MvZm9yZWNhc3Qtc25hcHNob3QuZmxvdy50c2AgXHUyMDE0IHRoZSBgZm9yZWNhc3Rfc25hcHNob3RgXG4gKiAgICAgc2NoZWR1bGVkIGZsb3csIG5pZ2h0bHkgYXQgMDM6MDAsIG9uZSBjdXJyZW50LXF1YXJ0ZXIgcm93IHBlciBhY3RpdmVcbiAqICAgICBvcHBvcnR1bml0eSBvd25lciAoIzU5MCkuIEl0IG5ldmVyIHRvdWNoZXMgYHF1b3RhYC5cbiAqICAgXHUyMDIyIGByZXZlbnVlX2ZvcmVjYXN0aW5nYCBBSSBza2lsbCBvbiBkZW1hbmRcbiAqICAgXHUyMDIyIGBmb3JlY2FzdC5ob29rLnRzYCBkZXJpdmVzIHRoZSBwZXJpb2QgZmFtaWx5ICsgYHNuYXBzaG90X2RhdGVgIG9uIGV2ZXJ5XG4gKiAgICAgd3JpdGU7IGl0IGNyZWF0ZXMgbm90aGluZyBvbiBpdHMgb3duLlxuICpcbiAqIEZvcmVjYXN0IGNhdGVnb3JpZXMgZm9sbG93IHRoZSBzdGFuZGFyZCBTYWxlc2ZvcmNlIGxhZGRlciwgYW5kIHRoZSBidWNrZXRzXG4gKiBhcmUgQ1VNVUxBVElWRSBcdTIwMTQgZWFjaCBpcyBhIHN1YnNldCBvZiB0aGUgb25lIGFib3ZlIGl0OlxuICogICBwaXBlbGluZSAgXHUyMTkyIGFsbCBvcGVuIG9wcHMgY2xvc2luZyBpbiB0aGUgcGVyaW9kXG4gKiAgIGJlc3RfY2FzZSBcdTIxOTIgb3BlbiBvcHBzIHdob3NlIGZvcmVjYXN0X2NhdGVnb3J5IGlzIGJlc3RfY2FzZSBPUiBjb21taXRcbiAqICAgY29tbWl0ICAgIFx1MjE5MiBvcGVuIG9wcHMgd2hvc2UgZm9yZWNhc3RfY2F0ZWdvcnkgaXMgY29tbWl0XG4gKiAgIGNsb3NlZCAgICBcdTIxOTIgYWxyZWFkeS13b24gYW1vdW50IGluIHRoZSBwZXJpb2RcbiAqXG4gKiBUaGUgYnVja2V0IGJvdW5kYXJ5IGlzIHRoZSBzdG9yZWQgYGZvcmVjYXN0X2NhdGVnb3J5YCBjb2x1bW4gKGRlcml2ZWQgZnJvbVxuICogYHN0YWdlYCBieSB0aGUgb3Bwb3J0dW5pdHkgbGlmZWN5Y2xlIGhvb2spLCBOT1QgYSBwcm9iYWJpbGl0eSB0aHJlc2hvbGQgXHUyMDE0XG4gKiBvbmUgZGVmaW5pdGlvbiwgc2hhcmVkIHdpdGggdGhlIFwiQ29tbWl0ICYgQmVzdCBDYXNlXCIgb3Bwb3J0dW5pdHkgdmlldyBhbmRcbiAqIHRoZSBgcGlwZWxpbmVfYnlfZm9yZWNhc3RfY2F0ZWdvcnlgIGRhc2hib2FyZCB3aWRnZXQuXG4gKi9cbmV4cG9ydCBjb25zdCBGb3JlY2FzdCA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX2ZvcmVjYXN0JyxcbiAgbGFiZWw6ICdGb3JlY2FzdCcsXG4gIHBsdXJhbExhYmVsOiAnRm9yZWNhc3RzJyxcbiAgaWNvbjogJ3RyZW5kaW5nLXVwJyxcbiAgZGVzY3JpcHRpb246ICdQZXJpb2RpYyBwaXBlbGluZSBzbmFwc2hvdCBieSBvd25lciB1c2VkIGZvciByZXZlbnVlIGZvcmVjYXN0aW5nLicsXG5cbiAgLy8gT1dEIGlzIGFuIGF1dGhvcmVkIGRlY2lzaW9uIChBRFItMDA5MCBEMS9ENykuIEZvcmVjYXN0cyBhcmUgcGVyc29uYWwgdG8gdGhlXG4gIC8vIG93bmVyLlxuICBzaGFyaW5nTW9kZWw6ICdwcml2YXRlJyxcbiAgLy8gQURSLTAwNzkgcmVjb3JkIHRpdGxlLiBcdTI2QTBcdUZFMEYgQSBmb3JtdWxhIGNhbm5vdCBkb3Qtd2FsayBhIGxvb2t1cCAoQURSLTAwNzIpLCBzb1xuICAvLyBgZGlzcGxheV90aXRsZWAgY29tcG9zZXMgbG9jYWwgZmllbGRzIG9ubHk6IHBlcmlvZF9sYWJlbCArIChwZXJpb2Rfc3RhcnQpLlxuICBuYW1lRmllbGQ6ICdkaXNwbGF5X3RpdGxlJyxcbiAgLy8gXHUyNkEwXHVGRTBGIEV4cGxpY2l0IHNlYXJjaCB0YXJnZXRzIChBRFItMDA2MSksIFJFUVVJUkVEIGJlY2F1c2UgYG5hbWVGaWVsZGAgaXMgYVxuICAvLyBGT1JNVUxBOiB3aXRob3V0IHRoaXMsIGAkc2VhcmNoYCBhdXRvLWRlZmF1bHRzIHRvIHRoZSBmb3JtdWxhIGZpZWxkLCB3aGljaFxuICAvLyBpcyBub3QgYSByZWFsIGNvbHVtbiwgc28gdGhlIGxvb2t1cCBwaWNrZXIgYW5kIGdsb2JhbCBzZWFyY2ggc2lsZW50bHlcbiAgLy8gcmV0dXJuIHplcm8uIFRoZXNlIGFyZSByZWFsLCBpbmRleGVkIGNvbHVtbnMuXG4gIHNlYXJjaGFibGVGaWVsZHM6IFsncGVyaW9kX2xhYmVsJ10sXG4gIGhpZ2hsaWdodEZpZWxkczogWydvd25lcl9pZCcsICdwZXJpb2QnLCAncGVyaW9kX3N0YXJ0JywgJ2NvbW1pdF9hbW91bnQnLCAnY2xvc2VkX2Ftb3VudCddLFxuXG4gIGZpZWxkR3JvdXBzOiBbXG4gICAgeyBrZXk6ICdiYXNpYycsICAgbGFiZWw6ICdTbmFwc2hvdCcsICAgIGljb246ICdpbmZvJyB9LFxuICAgIHsga2V5OiAnYW1vdW50cycsIGxhYmVsOiAnQW1vdW50cycsICAgICBpY29uOiAnZG9sbGFyLXNpZ24nIH0sXG4gICAgeyBrZXk6ICdtZXRhJywgICAgbGFiZWw6ICdTb3VyY2UnLCAgICAgIGljb246ICdkYXRhYmFzZScsIGNvbGxhcHNlOiAnY29sbGFwc2VkJyB9LFxuICBdLFxuXG4gIGZpZWxkczoge1xuICAgIC8vIFBsYXRmb3JtIG93bmVyc2hpcCBhbmNob3IgXHUyMDE0IGNhbm9uaWNhbCBub3RlIGluIGBhY2NvdW50Lm9iamVjdC50c2AgKCM1NDgpLlxuICAgIG93bmVyX2lkOiBGaWVsZC5sb29rdXAoJ3N5c191c2VyJywge1xuICAgICAgbGFiZWw6ICdPd25lcicsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIHN5c3RlbTogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiBmYWxzZSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuXG4gICAgcGVyaW9kOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdQZXJpb2QnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnTW9udGgnLCAgIHZhbHVlOiAnbW9udGgnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdRdWFydGVyJywgdmFsdWU6ICdxdWFydGVyJyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIC8vIFdvcmRpbmcgbWlycm9ycyB0aGUgdHdvIHJlZnVzYWwgbWVzc2FnZXMgdGhpcyBmaWVsZCBpcyBib3VuZCBieVxuICAgIC8vIChgcGVyaW9kX3N0YXJ0X2ZpcnN0X29mX3BlcmlvZGAgLyBgcXVhcnRlcl9zdGFydHNfb25fcXVhcnRlcl9ib3VuZGFyeWAsXG4gICAgLy8gYm90aCBiZWxvdykgc28gdGhlIGZvcm0gYW5kIHRoZSByZWplY3Rpb24gYWdyZWUgb24gdGhlIHNhbWUgcnVsZVxuICAgIC8vIGluc3RlYWQgb2YgZGVzY3JpYmluZyB0d28gZGlmZmVyZW50IG9uZXMgKCMxMDg1KS5cbiAgICBwZXJpb2Rfc3RhcnQ6IEZpZWxkLmRhdGUoe1xuICAgICAgbGFiZWw6ICdQZXJpb2QgU3RhcnQnLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdNdXN0IGJlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHBlcmlvZCBcdTIwMTQgZS5nLiAyMDI2LTA4LTAxIGZvciBBdWcgMjAyNi4gQSBxdWFydGVybHkgZm9yZWNhc3QgbXVzdCBhZGRpdGlvbmFsbHkgc3RhcnQgb24gYSBxdWFydGVyIGJvdW5kYXJ5OiBKYW51YXJ5IDEsIEFwcmlsIDEsIEp1bHkgMSBvciBPY3RvYmVyIDEuJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICB9KSxcblxuICAgIC8vIFN0aWxsIG5vdCByZWFkLW9ubHk6IGBmb3JlY2FzdC5ob29rLnRzYCBmaWxscyBpdCBvbmx5IHdoZW4gdGhlIHdyaXRlXG4gICAgLy8gbGVhdmVzIGl0IHVuc2V0LCBhbmQgYHNyYy9zYWxlcy9kYXRhL2ZvcmVjYXN0LnNlZWQudHNgIGhhbmQtZmlsbHMgaXQgb24gZXZlcnlcbiAgICAvLyBzZWVkZWQgcm93IFx1MjAxNCBzbyBoYW5kLWVudHJ5IGlzIGEgY2FwYWJpbGl0eSB0aGlzIGFwcCB1c2VzLiBBIGhhbmQtZmlsbGVkXG4gICAgLy8gdmFsdWUgaXMgcGlubmVkIHRvIHRoZSBzYW1lIGNhbGVuZGFyIHBlcmlvZCBgcGVyaW9kX3N0YXJ0YCBpc1xuICAgIC8vIChgcGVyaW9kX2VuZF9tYXRjaGVzX2NhbGVuZGFyX3BlcmlvZGAgYmVsb3cpLCBhbmQgdGhlIGRlc2NyaXB0aW9uIHN0YXRlc1xuICAgIC8vIHRoYXQgcnVsZSByYXRoZXIgdGhhbiB0aGUgd2Vha2VyIGBwZXJpb2RfZW5kX2FmdGVyX3N0YXJ0YCBpdCBzdWJzdW1lczpcbiAgICAvLyB0aGUgZm9ybSBzYXlzIHdoYXQgaXMgYWN0dWFsbHkgZW5mb3JjZWQuXG4gICAgcGVyaW9kX2VuZDogRmllbGQuZGF0ZSh7XG4gICAgICBsYWJlbDogJ1BlcmlvZCBFbmQnLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdOb3JtYWxseSBkZXJpdmVkIGF1dG9tYXRpY2FsbHkgZnJvbSBQZXJpb2QgYW5kIFBlcmlvZCBTdGFydC4gSWYgc2V0IGJ5IGhhbmQsIGl0IG11c3QgYmUgdGhlIGxhc3QgZGF5IG9mIHRoYXQgcGVyaW9kIFx1MjAxNCBlLmcuIDIwMjYtMDktMzAgZm9yIGEgcXVhcnRlciBzdGFydGluZyAyMDI2LTA3LTAxLCBvciAyMDI2LTA4LTMxIGZvciBBdWcgMjAyNi4nLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuXG4gICAgcGVyaW9kX2xhYmVsOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnUGVyaW9kIExhYmVsJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSHVtYW4tZnJpZW5kbHkgbGFiZWwsIGUuZy4gXCJRMyAyMDI2XCIgb3IgXCJBdWcgMjAyNlwiLicsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICB9KSxcblxuICAgIC8vIEFEUi0wMDc5IHJlY29yZCB0aXRsZS4gXHUyNkEwXHVGRTBGIEEgZm9ybXVsYSBjYW5ub3QgZG90LXdhbGsgYSBsb29rdXAgKEFEUi0wMDcyKSxcbiAgICAvLyBzbyB0aGlzIGNvbXBvc2VzIGxvY2FsIGZpZWxkcyBvbmx5OyBgcGVyaW9kX3N0YXJ0YCAoYSBkYXRlKSBpc1xuICAgIC8vIHN0cmluZygpLWNvZXJjZWQgZm9yIGNvbmNhdC5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBUaGUgY29lcmNpb24gaXMgYHN0cmluZygpYCwgTk9UIGB0ZXh0KClgLiBgdGV4dGAgaXMgbm90IGEgcmVnaXN0ZXJlZFxuICAgIC8vIENFTCBmdW5jdGlvbiBcdTIwMTQgaXQgaXMgYWJzZW50IGZyb20gYENFTF9TVERMSUJfRlVOQ1RJT05TYCBcdTIwMTQgc28gYSBmb3JtdWxhXG4gICAgLy8gdXNpbmcgaXQgZmF1bHRzIGF0IHJ1bnRpbWUgYW5kIGxlYXZlcyB0aGUgcmVjb3JkJ3MgYG5hbWVGaWVsZGAgbnVsbC4gVGhlXG4gICAgLy8gYXV0aG9yLXRpbWUgYGV4cHJlc3Npb24taW52YWxpZGAgcnVsZSBub3cgUkVQT1JUUyBpdCAoXCJmb3VuZCBubyBtYXRjaGluZ1xuICAgIC8vIG92ZXJsb2FkIGZvciAndGV4dChkeW4pJ1wiKSBpbnN0ZWFkIG9mIGxldHRpbmcgYSBicm9rZW4gZm9ybXVsYSB0aHJvdWdoIHRvXG4gICAgLy8gbnVsbCBzaWxlbnRseS4gYHN0cmluZ2AgaXMgdGhlIGNhdGFsb2cncyBjb2VyY2lvbiwgYWxvbmdzaWRlXG4gICAgLy8gYGludGAvYGJvb2xgL2Bkb3VibGVgL2B0aW1lc3RhbXBgLlxuICAgIGRpc3BsYXlfdGl0bGU6IEZpZWxkLmZvcm11bGEoe1xuICAgICAgbGFiZWw6ICdEaXNwbGF5IFRpdGxlJyxcbiAgICAgIGV4cHJlc3Npb246IEZgcmVjb3JkLnBlcmlvZF9sYWJlbCArIFwiIChcIiArIHN0cmluZyhyZWNvcmQucGVyaW9kX3N0YXJ0KSArIFwiKVwiYCxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuXG4gICAgc25hcHNob3RfZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBsYWJlbDogJ1NuYXBzaG90IERhdGUnLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgZGF5IHRoaXMgc25hcHNob3Qgd2FzIGNhcHR1cmVkLicsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgZ3JvdXA6ICdtZXRhJyxcbiAgICB9KSxcblxuICAgIHF1b3RhOiBGaWVsZC5jdXJyZW5jeSh7XG4gICAgICBsYWJlbDogJ1F1b3RhJyxcbiAgICAgIG1pbjogMCxcbiAgICAgIGdyb3VwOiAnYW1vdW50cycsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICBwaXBlbGluZV9hbW91bnQ6IEZpZWxkLmN1cnJlbmN5KHtcbiAgICAgIGxhYmVsOiAnUGlwZWxpbmUnLFxuICAgICAgZGVzY3JpcHRpb246ICdTdW0gb2YgYWxsIG9wZW4gb3Bwb3J0dW5pdGllcyBjbG9zaW5nIGluIHRoaXMgcGVyaW9kIChhbnkgc3RhZ2UpLicsXG4gICAgICBtaW46IDAsXG4gICAgICBncm91cDogJ2Ftb3VudHMnLFxuICAgIH0pLFxuXG4gICAgYmVzdF9jYXNlX2Ftb3VudDogRmllbGQuY3VycmVuY3koe1xuICAgICAgbGFiZWw6ICdCZXN0IENhc2UnLFxuICAgICAgZGVzY3JpcHRpb246ICdPcGVuIG9wcG9ydHVuaXRpZXMgaW4gdGhlIEJlc3QgQ2FzZSBvciBDb21taXQgZm9yZWNhc3QgY2F0ZWdvcnkuJyxcbiAgICAgIG1pbjogMCxcbiAgICAgIGdyb3VwOiAnYW1vdW50cycsXG4gICAgfSksXG5cbiAgICBjb21taXRfYW1vdW50OiBGaWVsZC5jdXJyZW5jeSh7XG4gICAgICBsYWJlbDogJ0NvbW1pdCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ09wZW4gb3Bwb3J0dW5pdGllcyBpbiB0aGUgQ29tbWl0IGZvcmVjYXN0IGNhdGVnb3J5IChvd25lci1jb21taXR0ZWQpLicsXG4gICAgICBtaW46IDAsXG4gICAgICBncm91cDogJ2Ftb3VudHMnLFxuICAgIH0pLFxuXG4gICAgY2xvc2VkX2Ftb3VudDogRmllbGQuY3VycmVuY3koe1xuICAgICAgbGFiZWw6ICdDbG9zZWQgV29uJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQWxyZWFkeS1jbG9zZWQtd29uIGFtb3VudCBpbiB0aGlzIHBlcmlvZC4nLFxuICAgICAgbWluOiAwLFxuICAgICAgZ3JvdXA6ICdhbW91bnRzJyxcbiAgICB9KSxcblxuICAgIGV4cGVjdGVkX2Ftb3VudDogRmllbGQuZm9ybXVsYSh7XG4gICAgICBsYWJlbDogJ0V4cGVjdGVkJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2xvc2VkIFdvbiArIENvbW1pdCBcdTIwMTQgd2hhdCB0aGUgb3duZXIgcmVhc29uYWJseSBleHBlY3RzIHRvIGxhbmQuJyxcbiAgICAgIGV4cHJlc3Npb246IEZgY29hbGVzY2UocmVjb3JkLmNsb3NlZF9hbW91bnQsIDApICsgY29hbGVzY2UocmVjb3JkLmNvbW1pdF9hbW91bnQsIDApYCxcbiAgICAgIHNjYWxlOiAyLFxuICAgICAgZ3JvdXA6ICdhbW91bnRzJyxcbiAgICB9KSxcblxuICAgIGF0dGFpbm1lbnRfcGN0OiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnQXR0YWlubWVudCAlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2xvc2VkIFdvbiBcdTAwRjcgUXVvdGEgXHUwMEQ3IDEwMC4gUmVhZHMgMCUgdW50aWwgYSBwb3NpdGl2ZSBxdW90YSBpcyBzZXQuJyxcbiAgICAgIGV4cHJlc3Npb246IEZgY29hbGVzY2UocmVjb3JkLnF1b3RhLCAwKSA+IDAgPyAoY29hbGVzY2UocmVjb3JkLmNsb3NlZF9hbW91bnQsIDApICogMTAwLjApIC8gcmVjb3JkLnF1b3RhIDogMC4wYCxcbiAgICAgIHNjYWxlOiAyLFxuICAgICAgZ3JvdXA6ICdhbW91bnRzJyxcbiAgICB9KSxcblxuICAgIGNvdmVyYWdlX3JhdGlvOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnQ292ZXJhZ2UgUmF0aW8nLFxuICAgICAgZGVzY3JpcHRpb246ICdQaXBlbGluZSBcdTAwRjcgKFF1b3RhIFx1MjIxMiBDbG9zZWQgV29uKSBcdTIwMTQgd2hldGhlciBlbm91Z2ggcGlwZWxpbmUgcmVtYWlucyB0byBjb3ZlciB0aGUgZ2FwLiBSZWFkcyAwIG9uY2UgdGhlIHF1b3RhIGlzIGFscmVhZHkgbWV0LicsXG4gICAgICBleHByZXNzaW9uOiBGYChjb2FsZXNjZShyZWNvcmQucXVvdGEsIDApIC0gY29hbGVzY2UocmVjb3JkLmNsb3NlZF9hbW91bnQsIDApKSA+IDAgPyBjb2FsZXNjZShyZWNvcmQucGlwZWxpbmVfYW1vdW50LCAwKSAvIChyZWNvcmQucXVvdGEgLSBjb2FsZXNjZShyZWNvcmQuY2xvc2VkX2Ftb3VudCwgMCkpIDogMC4wYCxcbiAgICAgIHNjYWxlOiAyLFxuICAgICAgZ3JvdXA6ICdhbW91bnRzJyxcbiAgICB9KSxcblxuICAgIHNvdXJjZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnU291cmNlJyxcbiAgICAgIGdyb3VwOiAnbWV0YScsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdTY2hlZHVsZWQgc25hcHNob3QnLCB2YWx1ZTogJ3NjaGVkdWxlZCcsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ0FJIHNraWxsJywgICAgICAgICAgIHZhbHVlOiAnYWknIH0sXG4gICAgICAgIHsgbGFiZWw6ICdNYW51YWwgZW50cnknLCAgICAgICB2YWx1ZTogJ21hbnVhbCcgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICBub3RlczogRmllbGQudGV4dCh7XG4gICAgICBsYWJlbDogJ05vdGVzJyxcbiAgICAgIG1heExlbmd0aDogMTAwMCxcbiAgICAgIGdyb3VwOiAnbWV0YScsXG4gICAgfSksXG5cbiAgICAvLyBGaXh0dXJlIGlkZW50aXR5IFx1MjAxNCB0aGUgc2VlZCBsb2FkZXIncyBgZXh0ZXJuYWxJZGAsIGFuZCBub3RoaW5nIGVsc2UuXG4gICAgLy9cbiAgICAvLyBgY3JtX2ZvcmVjYXN0YCBpcyBhIFBFUi1PV05FUiBzbmFwc2hvdDogaXRzIHJlYWwgaWRlbnRpdHkgaXNcbiAgICAvLyAob3duZXJfaWQsIHBlcmlvZCwgcGVyaW9kX3N0YXJ0KSwgYW5kIGV2ZXJ5IG90aGVyIGNvbHVtbiBpcyBhIHJlbmRlcmluZyBvZlxuICAgIC8vIHBhcnQgb2YgdGhhdC4gYHBlcmlvZF9sYWJlbGAgaW4gcGFydGljdWxhciBuYW1lcyBhIFNFVCBvZiByb3dzIG9uY2UgdGhlXG4gICAgLy8gYGZvcmVjYXN0X3NuYXBzaG90YCBzd2VlcCB3cml0ZXMgb25lIHJvdyBwZXIgYWN0aXZlIG93bmVyIHBlciBxdWFydGVyIFx1MjAxNFxuICAgIC8vIHRoZXkgYWxsIHJlYWQgJ1EzIDIwMjYnIFx1MjAxNCBzbyB1cHNlcnRpbmcgb24gdGhhdCBsYWJlbCBsZXRzIGEgcmUtc2VlZCBtYXRjaCxcbiAgICAvLyBhbmQgb3ZlcndyaXRlLCBhIHJlYWwgcmVwJ3Mgc25hcHNob3QuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgVGhlIHRydWUgY29tcG9zaXRlIGBleHRlcm5hbElkOiBbJ293bmVyX2lkJywgJ3BlcmlvZCcsICdwZXJpb2Rfc3RhcnQnXWBcbiAgICAvLyBpcyBub3QgYXZhaWxhYmxlIGhlcmU6IGEgc2VlZCBjYW5ub3QgbmFtZSBhIHVzZXIgKHNlZSB0aGUgbm90ZSBpblxuICAgIC8vIGBvYmplY3RzdGFjay5jb21wb3NpdGlvbi50c2AsIFwiQSBzZWVkIGNhbid0IG5hbWUgYSB1c2VyXCIpLCBzbyBgb3duZXJfaWRgXG4gICAgLy8gaXMgbnVsbCBvbiBldmVyeSBzZWVkZWQgcm93LCBhbmRcbiAgICAvLyB0aGUgbG9hZGVyJ3MgYGV4dGVybmFsSWRLZXlgIHJldHVybnMgXCJcIiBhcyBzb29uIGFzIGFueSBwYXJ0IGlzIGVtcHR5LiBBblxuICAgIC8vIGVtcHR5IGtleSBuZXZlciBtYXRjaGVzLCBzbyB1cHNlcnQgZGVncmFkZXMgdG8gaW5zZXJ0LW9uLWV2ZXJ5LXJlcGxheS5cbiAgICAvLyBEcm9wcGluZyBgb3duZXJfaWRgIGRvZXMgbm90IHJlc2N1ZSBpdDogYSBydW50aW1lIHJvdyBmb3IgdGhlIGN1cnJlbnRcbiAgICAvLyBxdWFydGVyIGNhcnJpZXMgZXhhY3RseSB0aGUgc2FtZSAocGVyaW9kLCBwZXJpb2Rfc3RhcnQpLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIGBtb2RlOiAnaW5zZXJ0J2AgZG9lcyBOT1QgbWVhbiBcImluc2VydCBvbmNlXCIgXHUyMDE0IHRoZSBsb2FkZXIgaW5zZXJ0c1xuICAgIC8vIHVuY29uZGl0aW9uYWxseSBvbiBldmVyeSByZXBsYXkgYm9vdCAoZnJhbWV3b3JrIzM0MzQpLiBgJ2lnbm9yZSdgIGlzIHRoZVxuICAgIC8vIHJlYWwgaW5zZXJ0LW9uY2UgbW9kZSwgYnV0IGl0IGRlY2lkZXMgXCJhbHJlYWR5IHRoZXJlP1wiIGZyb20gdGhlIHNhbWVcbiAgICAvLyBgZXh0ZXJuYWxJZGAsIHNvIG9uIGEgYnJva2VuIGtleSBpdCB3b3VsZCBTS0lQIHRoZSBkZW1vIHJvdyBiZWNhdXNlIGEgcmVhbFxuICAgIC8vIHJlcCdzIHJvdyBhbHJlYWR5IGNsYWltZWQgJ1EzIDIwMjYnLiBGaXhpbmcgdGhlIGlkZW50aXR5IGlzIGEgcHJlcmVxdWlzaXRlXG4gICAgLy8gZWl0aGVyIHdheS4gSGVuY2UgdGhpcyBzeW50aGV0aWMsIHNlZWRlci1vbmx5IGtleS5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBgcmVhZG9ubHlgIGlzIHRoZSBsb2FkLWJlYXJpbmcgcGFydCwgbm90IGRlY29yYXRpb246IHNlZWQgd3JpdGVzIHJ1blxuICAgIC8vIGB7IGlzU3lzdGVtOiB0cnVlIH1gIGFuZCBieXBhc3MgcmVhZG9ubHkgc3RyaXBwaW5nLCB3aGlsZSByZWFkb25seVxuICAgIC8vIHN0cmlwcGluZyBkb2VzIGd1YXJkIHVzZXIvQVBJIHdyaXRlcyBcdTIwMTQgc28gYSBnZW51aW5lIGZvcmVjYXN0IHJvdyBjYW4gbmV2ZXJcbiAgICAvLyBhY3F1aXJlIGEgYHNlZWRfa2V5YCBhbmQgY2FuIG5ldmVyIGJlIG1hdGNoZWQgYnkgYSByZS1zZWVkLiBUaGF0IGlzIHdoYXRcbiAgICAvLyBtYWtlcyB0aGUgZml4IHN0cnVjdHVyYWwgcmF0aGVyIHRoYW4gYSBuYW1pbmcgY29udmVudGlvbi4gYGhpZGRlbmAga2VlcHMgYVxuICAgIC8vIGZpeHR1cmVzLW9ubHkgY29sdW1uIG91dCBvZiBmb3JtcyBhbmQgcGlja2Vycy5cbiAgICBzZWVkX2tleTogRmllbGQudGV4dCh7XG4gICAgICBsYWJlbDogJ1NlZWQgS2V5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGVtby1maXh0dXJlIGlkZW50aXR5LiBXcml0dGVuIG9ubHkgYnkgdGhlIHNlZWQgbG9hZGVyOyBlbXB0eSBvbiBldmVyeSByZWFsIHNuYXBzaG90LicsXG4gICAgICBtYXhMZW5ndGg6IDY0LFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgICBncm91cDogJ21ldGEnLFxuICAgIH0pLFxuICB9LFxuXG4gIGluZGV4ZXM6IFtcbiAgICB7IGZpZWxkczogWydvd25lcl9pZCcsICdwZXJpb2Rfc3RhcnQnLCAncGVyaW9kJ10gfSxcbiAgICB7IGZpZWxkczogWydzbmFwc2hvdF9kYXRlJ10gfSxcbiAgICB7IGZpZWxkczogWydwZXJpb2Rfc3RhcnQnXSB9LFxuICBdLFxuXG4gIC8vIEFQSSBzdXJmYWNlLiBIaXN0b3J5IFx1MjE5MiBGaWVsZC50cmFja0hpc3RvcnkgKEFEUi0wMDUyKS5cbiAgZW5hYmxlOiB7XG4gICAgYXBpRW5hYmxlZDogdHJ1ZSxcbiAgICBhcGlNZXRob2RzOiBbJ2dldCcsICdsaXN0JywgJ2NyZWF0ZScsICd1cGRhdGUnLCAnZGVsZXRlJ10sXG4gIH0sXG5cbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAncGVyaW9kX2VuZF9hZnRlcl9zdGFydCcsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ1BlcmlvZCBFbmQgbXVzdCBiZSBhZnRlciBQZXJpb2QgU3RhcnQuJyxcbiAgICAgIC8vIGA8PWAsIG5vdCBgPGA6IHRoZSBydWxlIG5hbWUgc2F5cyBcImFmdGVyXCIgYW5kIGEgZm9yZWNhc3QgcGVyaW9kIGlzIGFcbiAgICAgIC8vIG1vbnRoIG9yIGEgcXVhcnRlciwgbmV2ZXIgYSBzaW5nbGUgaW5zdGFudCwgc28gYHBlcmlvZF9lbmQgPT1cbiAgICAgIC8vIHBlcmlvZF9zdGFydGAgaXMgYSB6ZXJvLWxlbmd0aCBwZXJpb2QgcmF0aGVyIHRoYW4gYSB2YWxpZCBvbmUuIFNhbWVcbiAgICAgIC8vIG9wZXJhdG9yIGFuZCB3b3JkaW5nIGFzIHRoZSBgZW5kX2FmdGVyX3N0YXJ0YCB0d2lucyBvblxuICAgICAgLy8gY2FtcGFpZ24vY29udHJhY3QuXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5wZXJpb2RfZW5kKSAmJiByZWNvcmQucGVyaW9kX2VuZCAhPSBudWxsICYmIGhhcyhyZWNvcmQucGVyaW9kX3N0YXJ0KSAmJiByZWNvcmQucGVyaW9kX3N0YXJ0ICE9IG51bGwgJiYgcmVjb3JkLnBlcmlvZF9lbmQgPD0gcmVjb3JkLnBlcmlvZF9zdGFydGAsXG4gICAgfSxcbiAgICAvLyBBIGhhbmQtZmlsbGVkIGBwZXJpb2Rfc3RhcnRgIG11c3QgYmUgdGhlIGZpcnN0IGRheSBvZiB0aGUgY2FsZW5kYXIgcGVyaW9kXG4gICAgLy8gaXQgbGFiZWxzLiBNYWludGFpbmVyIHJ1bGluZyAyMDI2LTA4LTExOiBcdTMwMENcdTYzQTVcdTUzRDdcdTRGNjBcdTc2ODRcdTUxNjhcdTkwRThcdTVFRkFcdThCQUVcdTMwMEQgXHUyMDE0IHJlZnVzZVxuICAgIC8vIHJhdGhlciB0aGFuIGFjY2VwdCBvciBzbmFwLlxuICAgIC8vXG4gICAgLy8gVGhlIGhvb2sgZGVyaXZlcyBgcGVyaW9kX2VuZGAgYXMgXCJzdGFydCArIG9uZSBwZXJpb2RcIiBcdTIwMTQgYSBST0xMSU5HIHdpbmRvdy5cbiAgICAvLyBUaGF0IGlzIGNhbGVuZGFyLXRydWUgZm9yIGEgc3RhcnQgb24gYSBib3VuZGFyeSBhbmQgZHJpZnRzIGZvciBhbnl0aGluZ1xuICAgIC8vIGVsc2U6IGBwZXJpb2Q6ICdxdWFydGVyJ2AgKyBgcGVyaW9kX3N0YXJ0OiAyMDI2LTA4LTE1YCBkZXJpdmVzXG4gICAgLy8gYHBlcmlvZF9lbmQ6IDIwMjYtMTAtMzFgIHVuZGVyIGBwZXJpb2RfbGFiZWw6ICdRMyAyMDI2J2AsIGEgd2luZG93XG4gICAgLy8gbGFiZWxsZWQgUTMgdGhhdCByZWFjaGVzIGEgbW9udGggaW50byBRNC4gVGhlIHJvdyBpcyBpbnRlcm5hbGx5XG4gICAgLy8gaW5jb25zaXN0ZW50IGluIGEgd2F5IG5vIGNvbnN1bWVyIGNhbiBkZXRlY3Q6IGV2ZXJ5IFwidGhpcyBxdWFydGVyXCJcbiAgICAvLyBlcXVhbHMtZmlsdGVyIHJlYWRzIGBwZXJpb2Rfc3RhcnRgLCBhbmQgdGhlIG5pZ2h0bHkgc3dlZXAgc2VsZWN0cyB0aGVcbiAgICAvLyBjdXJyZW50IHJvdyBieSBgcGVyaW9kX3N0YXJ0IDw9IHRvZGF5IDw9IHBlcmlvZF9lbmRgLlxuICAgIC8vXG4gICAgLy8gVGhlc2UgcnVsZXMgYXJlIHRoZSBPTkUgZW5mb3JjZW1lbnQgcG9pbnQgXHUyMDE0IGRlbGliZXJhdGVseSBub3QgYSB0aHJvdyBpblxuICAgIC8vIGBmb3JlY2FzdC5ob29rLnRzYCBhcyB3ZWxsLiBcdTI2QTBcdUZFMEYgQSBkZWNsYXJlZCBydWxlIGlzIHRoZSBzaGFwZSB0aGUgcGxhdGZvcm1cbiAgICAvLyBjYW4gYWN0IG9uOiBpdCByZWZ1c2VzIHRoZSB3cml0ZSB3aXRoIGEgYFZhbGlkYXRpb25FcnJvcmAgL1xuICAgIC8vIGBWQUxJREFUSU9OX0ZBSUxFRGAgZW52ZWxvcGUgKEhUVFAgNDAwKSBvbiB0aGUgcmVjb3JkIGZvcm0sIG9uIHRoZSBBUEkgYW5kXG4gICAgLy8gb24gYSBzZWVkJ3Mgc3lzdGVtIHdyaXRlIGFsaWtlLCB3aGVyZSBhIGhvb2sgdGhyb3cgaXMgYSBiYXJlIGBFcnJvcmAuIFRoZVxuICAgIC8vIGRlcml2YXRpb24gaXMgbGVmdCBhbG9uZTogd2l0aCB0aGUgc3RhcnQgcGlubmVkIHRvIGEgYm91bmRhcnksIFwic3RhcnQgK1xuICAgIC8vIG9uZSBwZXJpb2RcIiBJUyB0aGUgY2FsZW5kYXIgcGVyaW9kLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFdIWSBBIFJFR0VYIEFORCBOT1QgREFURSBBUklUSE1FVElDOiB0aGUgQ0VMIHN0ZGxpYiB0aGlzIGFwcCBjb21waWxlc1xuICAgIC8vIGFnYWluc3QgKGBDRUxfU1RETElCX0ZVTkNUSU9OU2ApIGhhcyBubyBtb250aC9kYXkgYWNjZXNzb3IgXHUyMDE0IHRoZSBkYXRlXG4gICAgLy8gZnVuY3Rpb25zIGFyZSBgdG9kYXlgL2BkYXlzQmV0d2VlbmAvYGFkZERheXNgL2BhZGRNb250aHNgL2BkYXRlYCBcdTIwMTQgc28gXCJ0aGVcbiAgICAvLyAxc3Qgb2YgaXRzIG1vbnRoXCIgaXMgbm90IGV4cHJlc3NpYmxlIGFzIGFyaXRobWV0aWMuIEJvdGggZHJpdmVycyB0aGlzIGFwcFxuICAgIC8vIGNhbiBydW4gb24gaGFuZCBgcGVyaW9kX3N0YXJ0YCBiYWNrIGFzIGEgYFlZWVktTU0tRERgIHN0cmluZywgYW5kIGFuIElTT1xuICAgIC8vICpkYXRldGltZSogc3RyaW5nIHN0aWxsIG1hdGNoZXMgdGhlc2UgcHJlZml4LWFuY2hvcmVkIHBhdHRlcm5zLiBBIGNhbGxlclxuICAgIC8vIHRoYXQgd3JpdGVzIGEgSlMgYERhdGVgIG9iamVjdCBpcyB0aGUgb25lIHNoYXBlIGBzdHJpbmcoKWAgaGFzIG5vIG92ZXJsb2FkXG4gICAgLy8gZm9yOyB0aGUgZW5naW5lIHRoZW4gcmVqZWN0cyB0aGF0IHdyaXRlIG5hbWluZyB0aGUgcnVsZSByYXRoZXIgdGhhblxuICAgIC8vIGFkbWl0dGluZyBpdCwgYW5kIG5vIHdyaXRlciBpbiB0aGlzIGFwcCBkb2VzIHRoYXQuXG4gICAge1xuICAgICAgbmFtZTogJ3BlcmlvZF9zdGFydF9maXJzdF9vZl9wZXJpb2QnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdQZXJpb2QgU3RhcnQgbXVzdCBiZSB0aGUgZmlyc3QgZGF5IG9mIHRoZSBwZXJpb2QgXHUyMDE0IGUuZy4gMjAyNi0wOC0wMSBmb3IgQXVnIDIwMjYuJyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnBlcmlvZF9zdGFydCkgJiYgcmVjb3JkLnBlcmlvZF9zdGFydCAhPSBudWxsICYmICFtYXRjaGVzKHN0cmluZyhyZWNvcmQucGVyaW9kX3N0YXJ0KSwgXCJeWzAtOV17NH0tWzAtOV17Mn0tMDFcIilgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ3F1YXJ0ZXJfc3RhcnRzX29uX3F1YXJ0ZXJfYm91bmRhcnknLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIC8vIFRoZSBtb250aCBydWxlIGFib3ZlIGFscmVhZHkgcmVqZWN0cyBhbnkgbm9uLTFzdCBkYXksIHNvIHRoaXMgb25lIG9ubHlcbiAgICAgIC8vIGV2ZXIgYWRkcyB0aGUgcXVhcnRlci1tb250aCBoYWxmOiAyMDI2LTA4LTAxIGlzIGEgdmFsaWQgbW9udGggc3RhcnQgYW5kXG4gICAgICAvLyBub3QgYSB2YWxpZCBxdWFydGVyIHN0YXJ0LlxuICAgICAgbWVzc2FnZTogJ0EgcXVhcnRlcmx5IGZvcmVjYXN0IG11c3Qgc3RhcnQgb24gYSBxdWFydGVyIGJvdW5kYXJ5IFx1MjAxNCBKYW51YXJ5IDEsIEFwcmlsIDEsIEp1bHkgMSBvciBPY3RvYmVyIDEuJyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnBlcmlvZCkgJiYgcmVjb3JkLnBlcmlvZCA9PSBcInF1YXJ0ZXJcIiAmJiBoYXMocmVjb3JkLnBlcmlvZF9zdGFydCkgJiYgcmVjb3JkLnBlcmlvZF9zdGFydCAhPSBudWxsICYmICFtYXRjaGVzKHN0cmluZyhyZWNvcmQucGVyaW9kX3N0YXJ0KSwgXCJeWzAtOV17NH0tKDAxfDA0fDA3fDEwKS0wMVwiKWAsXG4gICAgfSxcbiAgICAvLyBcdTIwMjZhbmQgdGhlIE9USEVSIGVuZCBvZiB0aGUgc2FtZSB3aW5kb3cuIFRoZSB0d28gcnVsZXMgYWJvdmUgcGluIHRoZSBTVEFSVDtcbiAgICAvLyBgcGVyaW9kX2VuZGAgc3RheXMgcmVhY2hhYmxlLCBiZWNhdXNlIHRoZSBob29rIGRlcml2ZXMgaXQgb25seSB3aGVuIHRoZVxuICAgIC8vIHdyaXRlIGxlYXZlcyBpdCB1bnNldCBhbmQgdGhlIGZpZWxkIHNpdHMgZWRpdGFibGUgb24gdGhlIHJlY29yZCBmb3JtLlxuICAgIC8vIFdpdGhvdXQgdGhpcyBydWxlLCBgcGVyaW9kOiAncXVhcnRlcidgICsgYHBlcmlvZF9zdGFydDogMjAyNi0wNy0wMWAgKGFcbiAgICAvLyBib3VuZGFyeSB0aGUgcnVsZXMgYWJvdmUgYWRtaXQpICsgYSBoYW5kLXR5cGVkIGBwZXJpb2RfZW5kOiAyMDI3LTA1LTE1YCBpc1xuICAgIC8vIEFETUlUVEVEIHVuZGVyIGBwZXJpb2RfbGFiZWw6ICdRMyAyMDI2J2AgXHUyMDE0IGEgdGVuLW1vbnRoIHdpbmRvdyBsYWJlbGxlZCBhc1xuICAgIC8vIG9uZSBxdWFydGVyLCByZWFjaGVkIHRocm91Z2ggdGhlIG90aGVyIGZpZWxkLlxuICAgIC8vXG4gICAgLy8gV0hZIEEgUlVMRSBBTkQgTk9UIEEgUkVBRC1PTkxZIEZJRUxEOiBkZXJpdmluZyBgcGVyaW9kX2VuZGAgYWx3YXlzIGFuZFxuICAgIC8vIGxvY2tpbmcgdGhlIGZvcm0gYnJlYWtzIHRoZSBkZW1vIHNlZWQgXHUyMDE0XG4gICAgLy8gYHNyYy9zYWxlcy9kYXRhL2ZvcmVjYXN0LnNlZWQudHNgIGhhbmQtZmlsbHMgaXQgb24gZXZlcnkgc2VlZGVkIHJvdy5cbiAgICAvLyBIYW5kLWVudHJ5IHN0YXlzOyBpdCBpcyBub3cgYm91bmRlZC5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBXSFkgYHR5cGU6ICdzY3JpcHQnYCBBTkQgTk9UIEEgRklFTEQgQ09OU1RSQUlOVDogYSBmaWVsZCBib3VuZCBqdWRnZXNcbiAgICAvLyBvbmx5IHRoZSB2YWx1ZSBiZWluZyB3cml0dGVuLCBzbyBhIHJvdyBhbHJlYWR5IHN0b3JlZCB3cm9uZyBrZWVwc1xuICAgIC8vIGFjY2VwdGluZyBlZGl0cyBmb3JldmVyOyBhIHNjcmlwdCB2YWxpZGF0aW9uIGlzIGV2YWx1YXRlZCBhZ2FpbnN0IHRoZVxuICAgIC8vIE1FUkdFRCByZWNvcmQgb24gZXZlcnkgd3JpdGUgYW5kIGlzIHRoZXJlZm9yZSBhIHRydWUgaW52YXJpYW50LlxuICAgIC8vIGB0ZXN0L2ZvcmVjYXN0LXBlcmlvZC1lbmQtYm91bmRhcnkudGVzdC50c2AgcGlucyBib3RoIGhhbHZlcyBcdTIwMTQgYSBsZWdhY3lcbiAgICAvLyByb3cgaXMgcmVmdXNlZCBvbiBpdHMgbmV4dCB1bnJlbGF0ZWQgZWRpdCwgYW5kIHRoZSByZXBhaXIgaXMgYWRtaXR0ZWQuXG4gICAgLy9cbiAgICAvLyBXSFkgREFURSBBUklUSE1FVElDIEhFUkUgV0hFTiBUSEUgVFdPIFJVTEVTIEFCT1ZFIFVTRSBBIFJFR0VYOiBub3QgdGFzdGUuXG4gICAgLy8gVGhvc2UgcnVsZXMgaW5zcGVjdCBPTkUgZGF0ZSdzIGNvbXBvbmVudHMgKFwiaXMgdGhpcyB0aGUgMXN0IG9mIGl0c1xuICAgIC8vIG1vbnRoP1wiKSwgYW5kIHRoZSBDRUwgc3RkbGliIGhhcyBubyBtb250aC9kYXkgYWNjZXNzb3IuIFRoaXMgcnVsZSBjb21wYXJlc1xuICAgIC8vIFRXTyBkYXRlcywgd2hpY2ggYGFkZE1vbnRoc2AvYGFkZERheXNgL2BkYXlzQmV0d2VlbmAgZXhwcmVzcyBkaXJlY3RseS5cbiAgICAvL1xuICAgIC8vIFRoZSBwcmVkaWNhdGUgc2F5cyBcIm9uZSBwZXJpb2QgbG9uZ1wiLCBhbmQgdGhhdCBpcyB0aGUgc2FtZSBjbGFpbSBhcyBcImVuZHNcbiAgICAvLyBvbiB0aGUgY2FsZW5kYXIgYm91bmRhcnlcIiBPTkxZIGJlY2F1c2UgdGhlIHR3byBydWxlcyBhYm92ZSBwaW4gdGhlIHN0YXJ0XG4gICAgLy8gdG8gb25lLiBUaGF0IGNvdXBsaW5nIGlzIGRlbGliZXJhdGU6IHRoZSB0aHJlZSBhcmUgb25lIHNldCBlbmZvcmNpbmcgb25lXG4gICAgLy8gaW52YXJpYW50IChhIHJvdydzIHdpbmRvdyBpcyBleGFjdGx5IHRoZSBjYWxlbmRhciBwZXJpb2QgaXQgaXMgbGFiZWxsZWRcbiAgICAvLyB3aXRoKSwgbm90IHRocmVlIGluZGVwZW5kZW50IGdhdGVzLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIGBkYXlzQmV0d2VlbihhLCBiKSAhPSAwYCByYXRoZXIgdGhhbiBgYSA9PSBiYDogYm90aCBkcml2ZXJzIHRoaXMgYXBwXG4gICAgLy8gcnVucyBvbiBoYW5kIGRhdGVzIGJhY2sgYXMgYFlZWVktTU0tRERgIHN0cmluZ3Mgd2hpbGUgYGFkZERheXNgIHJldHVybnMgYVxuICAgIC8vIHRpbWVzdGFtcCwgYW5kIGEgc3RyaW5nIG5ldmVyIGA9PWAgYSB0aW1lc3RhbXAgXHUyMDE0IHRoZSBydWxlIHdvdWxkIGJlXG4gICAgLy8gcGVybWFuZW50bHkgZ3JlZW4uIGBkYXlzQmV0d2VlbmAgcHV0cyBib3RoIHNpZGVzIHRocm91Z2ggdGhlIHNhbWVcbiAgICAvLyBgdG9EYXRlYCwgc28gdGhlIHN0cmluZywgYW4gSVNPIGRhdGV0aW1lIHNwZWxsaW5nIGFuZCBhIEpTIGBEYXRlYCBhbGxcbiAgICAvLyBjb21wYXJlIGFsaWtlLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoZSBgIT0gbnVsbGAgZ3VhcmRzIGFyZSBsb2FkLWJlYXJpbmcgZm9yIGEgVEhJUkQgaGF6YXJkIGJleW9uZCB0aGUgdHdvXG4gICAgLy8gQUdFTlRTLm1kIG5hbWVzOiBgZGF5c0JldHdlZW4obnVsbCwgXHUyMDI2KWAgcmVhY2hlcyBgQmlnSW50KE5hTilgIGFuZCBUSFJPV1MsXG4gICAgLy8gd2hpY2ggdGhlIGVuZ2luZSByZXBvcnRzIGFzIGBwcmVkaWNhdGUgZmFpbGVkIHRvIGV2YWx1YXRlYCBcdTIwMTQgYSBydWxlIHRoYXRcbiAgICAvLyBjYW5ub3QgYW5zd2VyLCBpLmUuIGEgcmVqZWN0ZWQgb3JkaW5hcnkgc2F2ZS4gVGhpcyBwcmVkaWNhdGUgaGFzIG5vXG4gICAgLy8gb3JkZXJpbmcgb3BlcmF0b3IsIHNvIGBvYmplY3QtdmFsaWRhdGlvbi1wcmVkaWNhdGVzLnRlc3QudHNgJ3NcbiAgICAvLyB1bmd1YXJkZWQtY29tcGFyaXNvbiBzd2VlcCBkb2VzIG5vdCBjb3ZlciBpdDsgdGhlIHBpbiBsaXZlcyBpblxuICAgIC8vIGB0ZXN0L2ZvcmVjYXN0LXBlcmlvZC1lbmQtYm91bmRhcnkudGVzdC50c2AgaW5zdGVhZC5cbiAgICB7XG4gICAgICBuYW1lOiAncGVyaW9kX2VuZF9tYXRjaGVzX2NhbGVuZGFyX3BlcmlvZCcsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTpcbiAgICAgICAgJ1BlcmlvZCBFbmQgbXVzdCBiZSB0aGUgbGFzdCBkYXkgb2YgdGhlIHBlcmlvZCBcdTIwMTQgZS5nLiAyMDI2LTA5LTMwIGZvciBhIHF1YXJ0ZXIgc3RhcnRpbmcgMjAyNi0wNy0wMSwgb3IgMjAyNi0wOC0zMSBmb3IgQXVnIDIwMjYuJyxcbiAgICAgIC8vIFNwZWxsZWQgb3V0IHBlciBwZXJpb2QgdmFsdWUgaW5zdGVhZCBvZiBhIHRlcm5hcnkgb24gdGhlIG1vbnRoIGNvdW50OlxuICAgICAgLy8gYW4gdW5kZWNsYXJlZCBgcGVyaW9kYCBpcyByZWZ1c2VkIEJZIE5BTUUgYnkgdGhlIHBpY2tsaXN0IChcIlBlcmlvZCBtdXN0XG4gICAgICAvLyBiZSBvbmUgb2Y6IG1vbnRoLCBxdWFydGVyXCIsIG1lYXN1cmVkKSwgc28gdGhpcyBydWxlIGp1ZGdlcyBvbmx5IHRoZSB0d29cbiAgICAgIC8vIHZhbHVlcyBpdCB1bmRlcnN0YW5kcyBhbmQgbGVhdmVzIHRoZSByZXN0IHRvIHRoZSBzY2hlbWEuXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5wZXJpb2QpICYmIHJlY29yZC5wZXJpb2QgIT0gbnVsbCAmJiBoYXMocmVjb3JkLnBlcmlvZF9zdGFydCkgJiYgcmVjb3JkLnBlcmlvZF9zdGFydCAhPSBudWxsICYmIGhhcyhyZWNvcmQucGVyaW9kX2VuZCkgJiYgcmVjb3JkLnBlcmlvZF9lbmQgIT0gbnVsbCAmJiAoKHJlY29yZC5wZXJpb2QgPT0gXCJtb250aFwiICYmIGRheXNCZXR3ZWVuKHJlY29yZC5wZXJpb2RfZW5kLCBhZGREYXlzKGFkZE1vbnRocyhyZWNvcmQucGVyaW9kX3N0YXJ0LCAxKSwgLTEpKSAhPSAwKSB8fCAocmVjb3JkLnBlcmlvZCA9PSBcInF1YXJ0ZXJcIiAmJiBkYXlzQmV0d2VlbihyZWNvcmQucGVyaW9kX2VuZCwgYWRkRGF5cyhhZGRNb250aHMocmVjb3JkLnBlcmlvZF9zdGFydCwgMyksIC0xKSkgIT0gMCkpYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdzbmFwc2hvdF9hbW91bnRzX25vbl9uZWdhdGl2ZScsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ1NuYXBzaG90IGFtb3VudHMgY2Fubm90IGJlIG5lZ2F0aXZlLicsXG4gICAgICBjb25kaXRpb246IFBgKGhhcyhyZWNvcmQucGlwZWxpbmVfYW1vdW50KSAmJiByZWNvcmQucGlwZWxpbmVfYW1vdW50ICE9IG51bGwgJiYgcmVjb3JkLnBpcGVsaW5lX2Ftb3VudCA8IDApIHx8IChoYXMocmVjb3JkLmJlc3RfY2FzZV9hbW91bnQpICYmIHJlY29yZC5iZXN0X2Nhc2VfYW1vdW50ICE9IG51bGwgJiYgcmVjb3JkLmJlc3RfY2FzZV9hbW91bnQgPCAwKSB8fCAoaGFzKHJlY29yZC5jb21taXRfYW1vdW50KSAmJiByZWNvcmQuY29tbWl0X2Ftb3VudCAhPSBudWxsICYmIHJlY29yZC5jb21taXRfYW1vdW50IDwgMCkgfHwgKGhhcyhyZWNvcmQuY2xvc2VkX2Ftb3VudCkgJiYgcmVjb3JkLmNsb3NlZF9hbW91bnQgIT0gbnVsbCAmJiByZWNvcmQuY2xvc2VkX2Ftb3VudCA8IDApYCxcbiAgICB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2xlYWQub2JqZWN0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0cy9sZWFkLm9iamVjdC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgT2JqZWN0U2NoZW1hLCBGaWVsZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgRiwgUCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB7XG4gIFNBTFVUQVRJT05fT1BUSU9OUyxcbiAgSU5EVVNUUllfT1BUSU9OUyxcbiAgTEVBRF9TT1VSQ0VfT1BUSU9OUyxcbiAgTEVBRF9ORUVEX1RZUEVfT1BUSU9OUyxcbiAgRFVQTElDQVRFX09GX1RZUEVfT1BUSU9OUyxcbn0gZnJvbSAnLi9fcGlja2xpc3RzJztcblxuZXhwb3J0IGNvbnN0IExlYWQgPSBPYmplY3RTY2hlbWEuY3JlYXRlKHtcbiAgbmFtZTogJ2NybV9sZWFkJyxcbiAgbGFiZWw6ICdMZWFkJyxcbiAgcGx1cmFsTGFiZWw6ICdMZWFkcycsXG4gIGljb246ICd1c2VyLXBsdXMnLFxuICBkZXNjcmlwdGlvbjogJ1BvdGVudGlhbCBjdXN0b21lcnMgbm90IHlldCBxdWFsaWZpZWQnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIE93bmVyLXdvcmtlZCBxdWV1ZS5cbiAgc2hhcmluZ01vZGVsOiAncHJpdmF0ZScsXG4gIFxuICBmaWVsZEdyb3VwczogW1xuICAgIHsga2V5OiAnaWRlbnRpdHknLCAgICAgbGFiZWw6ICdJZGVudGl0eScsICAgICAgICAgICBpY29uOiAndXNlci1wbHVzJyB9LFxuICAgIHsga2V5OiAnY29tcGFueV9pbmZvJywgbGFiZWw6ICdDb21wYW55IEluZm9ybWF0aW9uJywgaWNvbjogJ2J1aWxkaW5nJyB9LFxuICAgIHsga2V5OiAnY29udGFjdF9pbmZvJywgbGFiZWw6ICdDb250YWN0IEluZm9ybWF0aW9uJywgaWNvbjogJ3Bob25lJyB9LFxuICAgIHsga2V5OiAncXVhbGlmaWNhdGlvbicsIGxhYmVsOiAnUXVhbGlmaWNhdGlvbicsICAgICBpY29uOiAnc3RhcicgfSxcbiAgICB7IGtleTogJ2Fzc2lnbm1lbnQnLCAgIGxhYmVsOiAnQXNzaWdubWVudCcsICAgICAgICAgaWNvbjogJ3VzZXInIH0sXG4gICAgeyBrZXk6ICdhZGRyZXNzJywgICAgICBsYWJlbDogJ0FkZHJlc3MnLCAgICAgICAgICAgIGljb246ICdtYXAtcGluJywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gICAgeyBrZXk6ICdhZGRpdGlvbmFsJywgICBsYWJlbDogJ0FkZGl0aW9uYWwgSW5mbycsICAgIGljb246ICdpbmZvJywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gICAgeyBrZXk6ICdwcmVmZXJlbmNlcycsICBsYWJlbDogJ0NvbW11bmljYXRpb24gUHJlZmVyZW5jZXMnLCBpY29uOiAnYmVsbC1vZmYnLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ2NvbnZlcnNpb24nLCAgIGxhYmVsOiAnQ29udmVyc2lvbicsICAgICAgICAgaWNvbjogJ2NoZWNrLWNpcmNsZScsIGNvbGxhcHNlOiAnY29sbGFwc2VkJyB9LFxuICAgIHsga2V5OiAnZHVwbGljYXRlcycsICAgbGFiZWw6ICdEdXBsaWNhdGUgTWFuYWdlbWVudCcsIGljb246ICdjb3B5JywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gUGxhdGZvcm0gb3duZXJzaGlwIGFuY2hvciBcdTIwMTQgY2Fub25pY2FsIG5vdGUgaW4gYGFjY291bnQub2JqZWN0LnRzYCAoIzU0OCkuXG4gICAgb3duZXJfaWQ6IEZpZWxkLmxvb2t1cCgnc3lzX3VzZXInLCB7XG4gICAgICBsYWJlbDogJ0xlYWQgT3duZXInLFxuICAgICAgZ3JvdXA6ICdhc3NpZ25tZW50JyxcbiAgICAgIHN5c3RlbTogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiBmYWxzZSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIC8vIFBlcnNvbmFsIEluZm9ybWF0aW9uXG4gICAgc2FsdXRhdGlvbjogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnU2FsdXRhdGlvbicsXG4gICAgICBncm91cDogJ2lkZW50aXR5JyxcbiAgICAgIC8vIENhbm9uaWNhbCBzZXQgc2hhcmVkIHdpdGggQ29udGFjdCAoIzQ5MCkgXHUyMDE0IHNlZSBfcGlja2xpc3RzLnRzLlxuICAgICAgb3B0aW9uczogWy4uLlNBTFVUQVRJT05fT1BUSU9OU10sXG4gICAgfSksXG5cbiAgICBmaXJzdF9uYW1lOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnRmlyc3QgTmFtZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIGdyb3VwOiAnaWRlbnRpdHknLFxuICAgIH0pLFxuXG4gICAgbGFzdF9uYW1lOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnTGFzdCBOYW1lJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgZ3JvdXA6ICdpZGVudGl0eScsXG4gICAgfSksXG5cbiAgICAvLyBcdTI2QTBcdUZFMEYgYHNhbHV0YXRpb25gIGlzIGEgcGlja2xpc3QsIHNvIGEgZm9ybXVsYSBzZWVzIHRoZSByYXcgVkFMVUUgKGBtc2AsXG4gICAgLy8gYGRyYCksIG5vdCB0aGUgbGFiZWwgXHUyMDE0IGluY2x1ZGluZyBpdCByZW5kZXJzIG5hbWVzIGFzIFwibXMgRW1pbHkgRGF2aXNcIiBpblxuICAgIC8vIGxpc3RzIGFuZCBkZXRhaWxzLiBEcm9wcGVkIGhlcmUgYW5kIGZyb20gYGRpc3BsYXlfdGl0bGVgIGJlbG93LCBtYXRjaGluZ1xuICAgIC8vIENvbnRhY3QuXG4gICAgZnVsbF9uYW1lOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnRnVsbCBOYW1lJyxcbiAgICAgIGV4cHJlc3Npb246IEZgam9pbk5vbkVtcHR5KFtyZWNvcmQuZmlyc3RfbmFtZSwgcmVjb3JkLmxhc3RfbmFtZV0sICcgJylgLFxuICAgICAgZ3JvdXA6ICdpZGVudGl0eScsXG4gICAgfSksXG5cbiAgICAvLyBBRFItMDA3OSByZWNvcmQgdGl0bGUgKHdhcyB0aXRsZUZvcm1hdCAne2Z1bGxfbmFtZX0gLSB7Y29tcGFueX0nKS5cbiAgICAvLyBDb21wb3NlZCBmcm9tIHRoZSBzYW1lIHNvdXJjZSBmaWVsZHMgYXMgYGZ1bGxfbmFtZWAgKG5vdCBmb3JtdWxhLW9uLWZvcm11bGEpXG4gICAgLy8gcGx1cyBgY29tcGFueWAsIHNvIHRoZSB0aXRsZSByZXNvbHZlcyBmcm9tIHJlYWwgc3RvcmVkIHZhbHVlcy5cbiAgICBkaXNwbGF5X3RpdGxlOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnRGlzcGxheSBUaXRsZScsXG4gICAgICBleHByZXNzaW9uOiBGYGpvaW5Ob25FbXB0eShbcmVjb3JkLmZpcnN0X25hbWUsIHJlY29yZC5sYXN0X25hbWVdLCAnICcpICsgXCIgLSBcIiArIHJlY29yZC5jb21wYW55YCxcbiAgICAgIGdyb3VwOiAnaWRlbnRpdHknLFxuICAgIH0pLFxuXG4gICAgLy8gQ29tcGFueSBJbmZvcm1hdGlvblxuICAgIGNvbXBhbnk6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdDb21wYW55JyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgZ3JvdXA6ICdjb21wYW55X2luZm8nLFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogQ2FzZS0gYW5kIHdoaXRlc3BhY2UtZm9sZGVkIGNvcHkgb2YgYGNvbXBhbnlgIFx1MjAxNCB0aGUgdmFsdWUgbGVhZCBjb252ZXJzaW9uXG4gICAgICogY29tcGFyZXMgYWdhaW5zdCBgY3JtX2FjY291bnQubmFtZV9ub3JtYWxpemVkYC5cbiAgICAgKlxuICAgICAqICMjIyBXaHkgdGhlIExFQUQgbmVlZHMgb25lIHRvb1xuICAgICAqXG4gICAgICogXHUyNkEwXHVGRTBGIEEgbm9ybWFsaXplZCBjb2x1bW4gb24gYGNybV9hY2NvdW50YCBhbG9uZSBmaXhlcyBub3RoaW5nOiB0aGVcbiAgICAgKiBjb252ZXJzaW9uIGZsb3cgd291bGQgdGhlbiBjb21wYXJlIGEgcmF3IGNvbXBhbnkgc3RyaW5nIGFnYWluc3QgYSBmb2xkZWRcbiAgICAgKiBhY2NvdW50IG5hbWUsIGFuZCBgXCJBQ01FICBDb3JwXCJgIHN0aWxsIHdvdWxkIG5vdCBtYXRjaCBgYWNtZSBjb3JwYC4gQm90aFxuICAgICAqIHNpZGVzIGhhdmUgdG8gYmUgY2Fub25pY2FsLCBhbmQgdGhlIGZsb3cgY2FuIGNhbm9uaWNhbGl6ZSBuZWl0aGVyIFx1MjAxNFxuICAgICAqIGBzZXJ2aWNlLWF1dG9tYXRpb25gJ3MgYHJlc29sdmVUb2tlbmAgYWNjZXB0cyBleGFjdGx5IG9uZSBmdW5jdGlvbiBmb3JtXG4gICAgICogKGBOT1coKWAgLyBgVE9EQVkoKWApLCBzbyBge0xPV0VSKHgpfWAsIGB7VFJJTSh4KX1gIGFuZFxuICAgICAqIGB7eC50b0xvd2VyQ2FzZSgpfWAgYWxsIHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuIFNlZSB0aGUgZmllbGQgY29tbWVudCBvblxuICAgICAqIGBjcm1fYWNjb3VudC5uYW1lX25vcm1hbGl6ZWRgIGZvciB0aGUgZnVsbCBtZWFzdXJlbWVudC5cbiAgICAgKlxuICAgICAqIGBjb21wYW55YCBpdHNlbGYgaXMgTk9UIGZvbGRlZCBpbiBwbGFjZTogaXQgaXMgdGhlIGRpc3BsYXkgdmFsdWUsIGl0IGlzXG4gICAgICogY29waWVkIHZlcmJhdGltIG9udG8gdGhlIGFjY291bnQgdGhlIGNvbnZlcnNpb24gY3JlYXRlcywgYW5kIGxvd2VyLWNhc2luZ1xuICAgICAqIGl0IHdvdWxkIHNoaXAgYGFjbWUgY29ycGAgYXMgYSBjdXN0b21lci12aXNpYmxlIGFjY291bnQgbmFtZS4gVGhhdCBpcyB0aGVcbiAgICAgKiBvbmUgd2F5IHRoaXMgZGlmZmVycyBmcm9tIGBlbWFpbGAsIHdoaWNoIGhhcyBubyBtZWFuaW5nZnVsIGNhc2UgYW5kIHNvIGlzXG4gICAgICogY2Fub25pY2FsaXplZCBpbiBwbGFjZS5cbiAgICAgKlxuICAgICAqIERlcml2ZWQsIG5ldmVyIGF1dGhvcmVkOiBgbGVhZF9kdXBsaWNhdGVfY2hlY2tgIHJlY29tcHV0ZXMgaXQgb24gZXZlcnlcbiAgICAgKiB3cml0ZSB0aGF0IGNhcnJpZXMgYGNvbXBhbnlgLiBOb3QgaW5kZXhlZCBcdTIwMTQgbm90aGluZyBmaWx0ZXJzIG9uIGl0OyBpdCBpc1xuICAgICAqIHJlYWQgb2ZmIHRoZSBsZWFkIHJlY29yZCB0aGUgZmxvdyBhbHJlYWR5IGZldGNoZWQuXG4gICAgICovXG4gICAgY29tcGFueV9ub3JtYWxpemVkOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnQ29tcGFueSAoTm9ybWFsaXplZCknLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdNYXRjaCBrZXkgZm9yIGxlYWQgY29udmVyc2lvbjogQ29tcGFueSBsb3dlci1jYXNlZCwgdHJpbW1lZCwgd2l0aCBpbnRlcm5hbCB3aGl0ZXNwYWNlIGNvbGxhcHNlZC4gTWFpbnRhaW5lZCBieSB0aGUgbGVhZF9kdXBsaWNhdGVfY2hlY2sgaG9vayBcdTIwMTQgbmV2ZXIgZWRpdCBkaXJlY3RseS4nLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgICBtYXhMZW5ndGg6IDI1NSxcbiAgICAgIGdyb3VwOiAnY29tcGFueV9pbmZvJyxcbiAgICB9KSxcblxuICAgIHRpdGxlOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnSm9iIFRpdGxlJyxcbiAgICAgIGdyb3VwOiAnY29tcGFueV9pbmZvJyxcbiAgICB9KSxcblxuICAgIGluZHVzdHJ5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdJbmR1c3RyeScsXG4gICAgICBncm91cDogJ2NvbXBhbnlfaW5mbycsXG4gICAgICAvLyBDYW5vbmljYWwgc2V0IHNoYXJlZCB3aXRoIEFjY291bnQgKCM0OTApOiBsZWFkX2NvbnZlcnNpb24gY29waWVzIHRoaXNcbiAgICAgIC8vIHZhbHVlIG9udG8gdGhlIGNyZWF0ZWQgQWNjb3VudCwgc28gYm90aCBvYmplY3RzIE1VU1QgYWdyZWUuXG4gICAgICBvcHRpb25zOiBbLi4uSU5EVVNUUllfT1BUSU9OU10sXG4gICAgfSksXG5cbiAgICAvLyBcdTI2QTBcdUZFMEYgTk9UIGB1bmlxdWVgLiBBIGhhcmQgdW5pcXVlbmVzcyBjb25zdHJhaW50IG9uIGEgbGVhZCdzIGVtYWlsIHNheXMgYVxuICAgIC8vIHBlcnNvbiBtYXkgZW5xdWlyZSBvbmNlLCBldmVyLCBhbmQgdGhlIGRhdGFiYXNlIGVuZm9yY2VzIGl0IGJ5IFJFSkVDVElOR1xuICAgIC8vIHRoZSBzZWNvbmQgZW5xdWlyeSBcdTIwMTQgdHVybmluZyBhbiBvcmRpbmFyeSBmb2xsb3ctdXAgaW50byBhIDUwMCBvbiB0aGVcbiAgICAvLyBwdWJsaWMgZm9ybS4gUmVhbCBmdW5uZWxzIHJlLWNhcHR1cmUgdGhlIHNhbWUgYWRkcmVzcyByb3V0aW5lbHkuXG4gICAgLy8gRHVwbGljYXRlcyBhcmUgYSBmYWN0IHRvIGJlIFJFQ09SREVELCBub3QgYW4gZXJyb3I6IGBsZWFkX2R1cGxpY2F0ZV9jaGVja2BcbiAgICAvLyBpbiBsZWFkLmhvb2sudHMgbGlua3MgdGhlIG5ldyBsZWFkIHRvIHRoZSByZWNvcmQgaXQgcmVwZWF0cyAoc2VlIHRoZVxuICAgIC8vIGBkdXBsaWNhdGVzYCBmaWVsZCBncm91cCBiZWxvdykuIFRoZSBwbGFpbiBpbmRleCBiZWxvdyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgIC8vIGNvbHVtbiBpbmRleGVkIGluIHRoZSBjb25zdHJhaW50J3MgYWJzZW5jZSBcdTIwMTQgdGhlIGludGFrZSBkZWR1cGUgbG9va3VwLCB0aGVcbiAgICAvLyBgY3JtX2xlYWRfaW1wb3J0YCB1cHNlcnQga2V5IGFuZCB0aGUgY29udmVyc2lvbiBmbG93IGFsbCByZWFkIGxlYWRzIGJ5XG4gICAgLy8gZW1haWwgb24gZXZlcnkgd3JpdGUuXG4gICAgZW1haWw6IEZpZWxkLmVtYWlsKHtcbiAgICAgIGxhYmVsOiAnRW1haWwnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGdyb3VwOiAnY29udGFjdF9pbmZvJyxcbiAgICB9KSxcblxuICAgIHBob25lOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnUGhvbmUnLFxuICAgICAgZm9ybWF0OiAncGhvbmUnLFxuICAgICAgZ3JvdXA6ICdjb250YWN0X2luZm8nLFxuICAgIH0pLFxuXG4gICAgbW9iaWxlOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnTW9iaWxlJyxcbiAgICAgIGZvcm1hdDogJ3Bob25lJyxcbiAgICAgIGdyb3VwOiAnY29udGFjdF9pbmZvJyxcbiAgICB9KSxcblxuICAgIHdlYnNpdGU6IEZpZWxkLnVybCh7XG4gICAgICBsYWJlbDogJ1dlYnNpdGUnLFxuICAgICAgZ3JvdXA6ICdjb250YWN0X2luZm8nLFxuICAgIH0pLFxuXG4gICAgLy8gTGVhZCBRdWFsaWZpY2F0aW9uXG4gICAgc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdMZWFkIFN0YXR1cycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICAgIC8vIEZpZWxkLWxldmVsIGRlZmF1bHQ6IG9wdGlvbi1sZXZlbCBgZGVmYXVsdDogdHJ1ZWAgb25seSBwcmVzZWxlY3RzIGluXG4gICAgICAvLyBVSSBmb3JtcyBhZnRlciBmaXJzdCBwYWludDsgdGhlIHF1aWNrLWNyZWF0ZSBkaWFsb2cgYW5kIEFQSSBpbnNlcnRzXG4gICAgICAvLyBuZWVkIGEgcmVhbCBkZWZhdWx0VmFsdWUgKHNlZSBhcHByb3ZhbF9zdGF0dXMgZm9yIHRoZSBzYW1lIGxlc3NvbikuXG4gICAgICBkZWZhdWx0VmFsdWU6ICduZXcnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnTmV3JywgdmFsdWU6ICduZXcnLCBjb2xvcjogJyM4MDgwODAnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDb250YWN0ZWQnLCB2YWx1ZTogJ2NvbnRhY3RlZCcsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1F1YWxpZmllZCcsIHZhbHVlOiAncXVhbGlmaWVkJywgY29sb3I6ICcjNDE2OUUxJyB9LFxuICAgICAgICB7IGxhYmVsOiAnVW5xdWFsaWZpZWQnLCB2YWx1ZTogJ3VucXVhbGlmaWVkJywgY29sb3I6ICcjRkYwMDAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQ29udmVydGVkJywgdmFsdWU6ICdjb252ZXJ0ZWQnLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICBdXG4gICAgfSksXG5cbiAgICByYXRpbmc6IEZpZWxkLnJhdGluZyg1LCB7XG4gICAgICBsYWJlbDogJ0xlYWQgU2NvcmUnLFxuICAgICAgZGVzY3JpcHRpb246ICdMZWFkIHF1YWxpdHkgc2NvcmUgKDEtNSBzdGFycyknLFxuICAgICAgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICB9KSxcblxuICAgIGxlYWRfc291cmNlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdMZWFkIFNvdXJjZScsXG4gICAgICBncm91cDogJ3F1YWxpZmljYXRpb24nLFxuICAgICAgLy8gQ2Fub25pY2FsIHNldCBzaGFyZWQgd2l0aCBDb250YWN0ICsgT3Bwb3J0dW5pdHkgKCM0OTApOiBsZWFkX2NvbnZlcnNpb25cbiAgICAgIC8vIGNvcGllcyB0aGlzIHZhbHVlIG9udG8gdGhlIGNyZWF0ZWQgT3Bwb3J0dW5pdHksIHNvIGFsbCB0aHJlZSBNVVNUIGFncmVlLlxuICAgICAgb3B0aW9uczogWy4uLkxFQURfU09VUkNFX09QVElPTlNdLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIERlbWFuZDogd2hhdCB0aGlzIHByb3NwZWN0IHdhbnRzLCBhbmQgd2hhdCBpdCBpcyB3b3J0aCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIFJFUS0wMDA1IHN0ZXBzIDYtNy4gQm90aCBmaWVsZHMgYXJlIGluIGBxdWFsaWZpY2F0aW9uYCBiZWNhdXNlIHRoZXkgQVJFXG4gICAgLy8gcXVhbGlmaWNhdGlvbiBkYXRhIFx1MjAxNCB3aGF0IHRoZSBidXllciBpcyBhc2tpbmcgZm9yIGFuZCBob3cgYmlnIGl0IGlzIGFyZVxuICAgIC8vIHRoZSB0d28gZmFjdHMgYSByZXAgd2VpZ2hzIGJlZm9yZSB3b3JraW5nIGEgbGVhZCBcdTIwMTQgYW5kIG5laXRoZXIgaXNcbiAgICAvLyByZXF1aXJlZDogYSBsZWFkIGNhcHR1cmVkIG9mZiB0aGUgcHVibGljIGZvcm0gaGFzIG5laXRoZXIsIGFuZCBzYXZlc1xuICAgIC8vIGV4YWN0bHkgYXMgaXQgZGlkIGJlZm9yZS5cblxuICAgIG5lZWRfdHlwZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnTmVlZCBUeXBlJyxcbiAgICAgIGdyb3VwOiAncXVhbGlmaWNhdGlvbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ1doYXQgdGhpcyBwcm9zcGVjdCBpcyBhc2tpbmcgZm9yLiBSb3V0aW5nLCBwcmlvcml0aXNhdGlvbiBhbmQgZGVtYW5kIHJlcG9ydGluZyByZWFkIHRoaXMuJyxcbiAgICAgIC8vIEdlbmVyaWMgc3RhcnRlciB2b2NhYnVsYXJ5LCBkZWNsYXJlZCBvbmNlIGluIGBfcGlja2xpc3RzLnRzYCBcdTIwMTQgc2VlIHRoZVxuICAgICAgLy8gbm90ZSB0aGVyZSBmb3Igd2h5IGl0IGlzIE5PVCBzaGFyZWQgd2l0aCBgY3JtX29wcG9ydHVuaXR5LnR5cGVgLlxuICAgICAgb3B0aW9uczogWy4uLkxFQURfTkVFRF9UWVBFX09QVElPTlNdLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNkQ0IE5FVkVSIGNvbmZsYXRlZCB3aXRoIGBhbm51YWxfcmV2ZW51ZWAsIHdoaWNoIHNpdHMgdHdvIGdyb3VwcyBiZWxvdyBpblxuICAgIC8vIGBhZGRpdGlvbmFsYCBhbmQgYW5zd2VycyBhIGRpZmZlcmVudCBxdWVzdGlvbjogdGhhdCBpcyB0aGUgcHJvc3BlY3RcbiAgICAvLyBDT01QQU5ZJ3Mgb3duIHR1cm5vdmVyLCBhIHNpemUgc2lnbmFsLCBhbmQgaXQgaXMgdGhlIHZhbHVlXG4gICAgLy8gYGxlYWRfY29udmVyc2lvbmAgY29waWVzIG9udG8gdGhlIGFjY291bnQgaXQgY3JlYXRlcy4gVGhpcyBpcyB0aGUgdmFsdWVcbiAgICAvLyBvZiB0aGUgREVNQU5EIFx1MjAxNCB0aGUgbnVtYmVyIHRoYXQgYmVjb21lcyBgY3JtX29wcG9ydHVuaXR5LmFtb3VudGAgd2hlbiB0aGVcbiAgICAvLyBsZWFkIGNvbnZlcnRzLCBhbmQgdGhlIG9ubHkgZmlndXJlIHRoZSBwaXBlbGluZSBoYXMgYmVmb3JlIHRoZW4uXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgTm9yIGlzIGl0IGEgc2Vjb25kIGNvcHkgb2YgYGNybV9vcHBvcnR1bml0eS5hbW91bnRgLiBUaGUgb3Bwb3J0dW5pdHknc1xuICAgIC8vIGFtb3VudCBpcyBhIGNvbW1pdHRlZCBkZWFsIGZpZ3VyZSBhIHJlcCBkZWZlbmRzIGluIGEgZm9yZWNhc3Q7IHRoaXMgaXMgYW5cbiAgICAvLyBlc3RpbWF0ZSB0YWtlbiBiZWZvcmUgcXVhbGlmaWNhdGlvbiwgYW5kIHRoZSBjb252ZXJzaW9uIHNjcmVlbiBpcyB3aGVyZSBhXG4gICAgLy8gaHVtYW4gdHVybnMgb25lIGludG8gdGhlIG90aGVyIChpdCBQUkVGSUxMUyBmcm9tIGhlcmUgXHUyMDE0IHNlZSB0aGVcbiAgICAvLyBgb3Bwb3J0dW5pdHlBbW91bnRgIHNjcmVlbiBmaWVsZCBpbiBgbGVhZC1jb252ZXJzaW9uLmZsb3cudHNgIFx1MjAxNCByYXRoZXJcbiAgICAvLyB0aGFuIGNvcHlpbmcgc2lsZW50bHksIHNvIHRoZSByZXAgY29uZmlybXMgdGhlIG51bWJlciB0aGF0IGVudGVycyB0aGVcbiAgICAvLyBmb3JlY2FzdCkuXG4gICAgZXN0aW1hdGVkX2Ftb3VudDogRmllbGQuY3VycmVuY3koe1xuICAgICAgbGFiZWw6ICdFc3RpbWF0ZWQgQW1vdW50JyxcbiAgICAgIGdyb3VwOiAncXVhbGlmaWNhdGlvbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0VzdGltYXRlZCB2YWx1ZSBvZiB0aGlzIGRlbWFuZCwgYmVmb3JlIHF1YWxpZmljYXRpb24uIFByZWZpbGxzIHRoZSBkZWFsIGFtb3VudCBhdCBjb252ZXJzaW9uLicsXG4gICAgfSksXG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgVGhlIGNvbnZlcnNpb24gYXBwcm92YWwgZ2F0ZSAoUkVRLTAwMDUgc3RlcCA3KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBgZGVmYXVsdFZhbHVlOiAnbm90X3JlcXVpcmVkJ2AgSVMgVEhFIEdBVEUnUyBPRkYgU1dJVENILCBhbmQgaXQgaXMgdGhlXG4gICAgLy8gb25lIGxpbmUgYW4gaW5zdGFsbCBjaGFuZ2VzIHRvIGFybSBpdC4gUkVRLTAwMDU6IFwiVGhlIGdhdGUgbXVzdCBiZVxuICAgIC8vIGNvbmZpZ3VyYWJsZSBcdTIwMTQgb2ZmIGJ5IGRlZmF1bHQuIEEgc2luZ2xlLXNlbGxlciBpbnN0YWxsIG11c3Qgbm90IGJlIGZvcmNlZFxuICAgIC8vIHRocm91Z2ggYW4gYXBwcm92YWwgdG8gY29udmVydCBhIGxlYWQuXCJcbiAgICAvL1xuICAgIC8vICAgT0ZGIChzaGlwcGVkKSAgZXZlcnkgbGVhZCBpcyBib3JuIGBub3RfcmVxdWlyZWRgOyBub3RoaW5nIGV2ZXIgd3JpdGVzXG4gICAgLy8gICAgICAgICAgICAgICAgICBgcGVuZGluZ2AsIHNvIGBsZWFkX2NvbnZlcnNpb25fYXBwcm92YWxgIG5ldmVyIGVudGVycyxcbiAgICAvLyAgICAgICAgICAgICAgICAgIHRoZSBDb252ZXJ0IGJ1dHRvbiBuZXZlciBoaWRlcyBhbmQgdGhlIHdyaXRlLXBhdGggZ2F0ZSBpblxuICAgIC8vICAgICAgICAgICAgICAgICAgYGxlYWQuaG9vay50c2AgbmV2ZXIgZmlyZXMuIENvbnZlcnNpb24gYmVoYXZlcyBFWEFDVExZIGFzXG4gICAgLy8gICAgICAgICAgICAgICAgICBpdCBkaWQgYmVmb3JlIHRoaXMgZmllbGQgZXhpc3RlZC5cbiAgICAvLyAgIE9OICAgICAgICAgICAgIGNoYW5nZSB0aGlzIG9uZSB2YWx1ZSB0byBgJ3BlbmRpbmcnYC4gRXZlcnkgbGVhZCBpcyB0aGVuXG4gICAgLy8gICAgICAgICAgICAgICAgICBib3JuIHBlbmRpbmcsIGBsZWFkX2NvbnZlcnNpb25fYXBwcm92YWxgIG9wZW5zIGl0c1xuICAgIC8vICAgICAgICAgICAgICAgICAgcmVxdWVzdCwgYW5kIGNvbnZlcnNpb24gaXMgcmVmdXNlZCB1bnRpbCBhbiBhcHByb3ZlclxuICAgIC8vICAgICAgICAgICAgICAgICAgZGVjaWRlcy5cbiAgICAvL1xuICAgIC8vIExlYWRzIHRoYXQgcHJlZGF0ZSB0aGUgc3dpdGNoIGtlZXAgd2hhdGV2ZXIgdGhleSB3ZXJlIGJvcm4gd2l0aCwgd2hpY2ggaXNcbiAgICAvLyB0aGUgcG9pbnQ6IGFybWluZyB0aGUgZ2F0ZSBkb2VzIG5vdCBpbnZhbGlkYXRlIG9yIHJlLW9wZW4gYSBzaW5nbGVcbiAgICAvLyBleGlzdGluZyByZWNvcmQgKFJFUS0wMDA1IGFjY2VwdGFuY2UgNCkuIFRoaXMgaXMgYSBUUkFOU0lUSU9OIEdBVEUsIG5vdCBhblxuICAgIC8vIGludmFyaWFudCAoQUdFTlRTLm1kIG1ldGFkYXRhIHNlbWFudGljcyBydWxlIDcpIFx1MjAxNCB3aGF0IGlzIHJlZnVzZWQgaXMgdGhlXG4gICAgLy8gQUNUIG9mIGNvbnZlcnRpbmcsIGV2YWx1YXRlZCBhZ2FpbnN0IGBwcmV2aW91c2AgaW4gYGxlYWQuaG9vay50c2AsIG5ldmVyXG4gICAgLy8gdGhlIHN0YXRlIG9mIGEgcmVjb3JkIHRoYXQgaXMgYWxyZWFkeSBjb252ZXJ0ZWQuXG4gICAgLy9cbiAgICAvLyBTaGFwZSBjb3BpZWQgZnJvbSBgY3JtX29wcG9ydHVuaXR5LmFwcHJvdmFsX3N0YXR1c2A6IGByZWFkb25seTogdHJ1ZWBcbiAgICAvLyBwbHVzIGEgUkVBTCBmaWVsZC1sZXZlbCBgZGVmYXVsdFZhbHVlYCwgXHUyNkQ0IG5vdCBvbmx5IGFuIG9wdGlvbi1sZXZlbFxuICAgIC8vIGBkZWZhdWx0OiB0cnVlYCBcdTIwMTQgdGhlIHNhbWUgbGVzc29uIGBzdGF0dXNgIGFib3ZlIHJlY29yZHMsIGFuZCB0aGUgcmVhc29uXG4gICAgLy8gdGhhdCBmaWVsZCdzIG93biBjb21tZW50IGdpdmVzOiBhbiBvcHRpb24gZGVmYXVsdCBvbmx5IHByZXNlbGVjdHMgaW4gVUlcbiAgICAvLyBmb3JtcyBhZnRlciBmaXJzdCBwYWludCwgc28gYSBxdWljay1jcmVhdGUgZGlhbG9nIG9yIGFuIEFQSSBpbnNlcnQgd291bGRcbiAgICAvLyBsYW5kIGEgbnVsbCBhbmQgYSBudWxsIG1hdGNoZXMgbm8gZmxvdyBlbnRyeSBjb25kaXRpb24uXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgRG8gTk9UIGFkZCBhbiBcImFwcHJvdmVkXCIgdmFsdWUgdG8gYHN0YXR1c2AgaW5zdGVhZC4gVGhhdCBzZWxlY3QgaXMgdGhlXG4gICAgLy8gcXVhbGlmaWNhdGlvbiBsaWZlY3ljbGU7IGEgc2l4dGggdmFsdWUgdGhlcmUgd291bGQgYnJlYWsgdGhlXG4gICAgLy8gYGNvbnZlcnRfbGVhZGAgcHJlZGljYXRlLCB0aGUgYGxlYWRfc3RhdHVzX3Byb2dyZXNzaW9uYCB0cmFuc2l0aW9ucyBhbmRcbiAgICAvLyB0aGUgc2VlZGVkIHJvd3MsIGFuZCB3b3VsZCBjb25mbGF0ZSBcInRoaXMgbGVhZCBpcyB3b3J0aCB3b3JraW5nXCIgd2l0aFxuICAgIC8vIFwic29tZW9uZSBzaWduZWQgb2ZmIG9uIGNvbnZlcnRpbmcgaXRcIi5cbiAgICBjb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1czogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnQ29udmVyc2lvbiBBcHByb3ZhbCcsXG4gICAgICBncm91cDogJ3F1YWxpZmljYXRpb24nLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1doZXRoZXIgdGhpcyBsZWFkIGhhcyBiZWVuIHNpZ25lZCBvZmYgZm9yIGNvbnZlcnNpb24uIE5vdCBSZXF1aXJlZCBtZWFucyBubyBhcHByb3ZhbCBpcyBhc2tlZCBmb3IgXHUyMDE0IHRoZSBzaGlwcGVkIGRlZmF1bHQuJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogJ25vdF9yZXF1aXJlZCcsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdOb3QgUmVxdWlyZWQnLCB2YWx1ZTogJ25vdF9yZXF1aXJlZCcsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ1BlbmRpbmcnLCB2YWx1ZTogJ3BlbmRpbmcnLCBjb2xvcjogJyNGRkE1MDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdBcHByb3ZlZCcsIHZhbHVlOiAnYXBwcm92ZWQnLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWplY3RlZCcsIHZhbHVlOiAncmVqZWN0ZWQnLCBjb2xvcjogJyNGRjAwMDAnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgLy8gQXNzaWdubWVudFxuXG4gICAgLy8gQ29udmVyc2lvbiB0cmFja2luZy5cbiAgICAvLyBcdTI2RDQgTk9UIGByZWFkb25seWA6IHRoZSBgbGVhZF9jb252ZXJzaW9uYCBmbG93J3MgYG1hcmtfY29udmVydGVkYCBub2RlXG4gICAgLy8gVVBEQVRFcyB0aGlzIGNvbHVtbiBhbmQgdGhlIGZvdXIgYGNvbnZlcnRlZF8qYCBvbmVzIGJlbG93LCBhbmQgdGhhdCBmbG93XG4gICAgLy8gZGVjbGFyZXMgbm8gYHJ1bkFzYCBcdTIwMTQgc28gaXQgcnVucyBhdCB0aGUgZW5naW5lIGRlZmF1bHQgYCd1c2VyJ2AsIHdoaWNoIGlzXG4gICAgLy8gYWxzbyB3aGVyZSBob3VzZSBydWxlIDkga2VlcHMgYSBzY3JlZW4gZmxvdy4gYHN0cmlwUmVhZG9ubHlGaWVsZHNgIHJ1bnNcbiAgICAvLyB1bmRlciBgaWYgKCFvcEN0eC5jb250ZXh0Py5pc1N5c3RlbSlgIGFuZCBkZWxldGVzIGV2ZXJ5IHJlYWRvbmx5IGtleSB0aGVcbiAgICAvLyBDQUxMRVIgc3VwcGxpZWQsIHNvIGByZWFkb25seWAgaGVyZSB3b3VsZCBzaWxlbnRseSB1bi1jb252ZXJ0IGV2ZXJ5XG4gICAgLy8gY29udmVyc2lvbi5cbiAgICAvLyBcdTI2QTBcdUZFMEYgVGhlIG90aGVyIHdyaXRlciBpcyB1bmFmZmVjdGVkLCBhbmQgaXMgbm90IHRoZSByZWFzb246IHRoZVxuICAgIC8vIGd1ZXN0LXN1Ym1pc3Npb24gc2FuaXRpc2VyIGluIGBsZWFkLmhvb2sudHNgIEFTU0lHTlMgdGhlc2Ugb25cbiAgICAvLyBgYmVmb3JlSW5zZXJ0YCwgYW5kIGhvb2std3JpdHRlbiBrZXlzIGFyZSBub3QgY2FsbGVyLXN1cHBsaWVkIFx1MjAxNCBub3IgZG9lc1xuICAgIC8vIHRoZSBzdHJpcCBydW4gb24gSU5TRVJUIGF0IGFsbC4gTWVhc3VyZWQgaW5cbiAgICAvLyBgdGVzdC9yZWFkb25seS13cml0ZS1zZW1hbnRpY3MudGVzdC50c2AuXG4gICAgLy8gXHUyMUQyIERlY2xhcmluZyB0aGVzZSBgcmVhZG9ubHlgIHdvdWxkIG5lZWQgdGhlIGZsb3cncyB3cml0ZSBFTEVWQVRFRCwgd2hpY2hcbiAgICAvLyBpcyBhIHByaXZpbGVnZSBkZWNpc2lvbiBvbiB0aGUgbWFpbnRhaW5lcidzIGZsb29yLCBub3QgdGhpcyBmaWxlJ3MgKCMxNDM1KS5cbiAgICAvLyBFZGl0LXByb3RlY3Rpb24gaXMgdGhlIGBiZWZvcmVVcGRhdGVgIGd1YXJkIGluIGBsZWFkLmhvb2sudHNgLCB3aGljaFxuICAgIC8vIHJlamVjdHMgYW55IFVTRVIgZWRpdCB0byBhIGNvbnZlcnRlZCBsZWFkIG91dHNpZGUgYSBzbWFsbCBhbGxvdy1saXN0IFx1MjAxNFxuICAgIC8vIGFuZCBpdCBpcyB0aGUgT05MWSBndWFyZCwgZGVsaWJlcmF0ZWx5OiBhIHNjcmlwdCB2YWxpZGF0aW9uIGJlc2lkZSBpdFxuICAgIC8vIG5ldmVyIGZpcmVzLCBiZWNhdXNlIHRoZSBob29rJ3MgdGhyb3cgYWx3YXlzIHdpbnMgdGhlIHJhY2UuXG4gICAgaXNfY29udmVydGVkOiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGxhYmVsOiAnQ29udmVydGVkJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBncm91cDogJ2NvbnZlcnNpb24nLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgY29udmVydGVkX2FjY291bnQ6IEZpZWxkLmxvb2t1cCgnY3JtX2FjY291bnQnLCB7XG4gICAgICBsYWJlbDogJ0NvbnZlcnRlZCBBY2NvdW50JyxcbiAgICAgIGdyb3VwOiAnY29udmVyc2lvbicsXG4gICAgfSksXG5cbiAgICBjb252ZXJ0ZWRfY29udGFjdDogRmllbGQubG9va3VwKCdjcm1fY29udGFjdCcsIHtcbiAgICAgIGxhYmVsOiAnQ29udmVydGVkIENvbnRhY3QnLFxuICAgICAgZ3JvdXA6ICdjb252ZXJzaW9uJyxcbiAgICB9KSxcblxuICAgIGNvbnZlcnRlZF9vcHBvcnR1bml0eTogRmllbGQubG9va3VwKCdjcm1fb3Bwb3J0dW5pdHknLCB7XG4gICAgICBsYWJlbDogJ0NvbnZlcnRlZCBPcHBvcnR1bml0eScsXG4gICAgICBncm91cDogJ2NvbnZlcnNpb24nLFxuICAgIH0pLFxuXG4gICAgY29udmVydGVkX2RhdGU6IEZpZWxkLmRhdGV0aW1lKHtcbiAgICAgIGxhYmVsOiAnQ29udmVydGVkIERhdGUnLFxuICAgICAgZ3JvdXA6ICdjb252ZXJzaW9uJyxcbiAgICB9KSxcblxuICAgIC8vIEFkZHJlc3MgKHVzaW5nIG5ldyBhZGRyZXNzIGZpZWxkIHR5cGUpXG4gICAgYWRkcmVzczogRmllbGQuYWRkcmVzcyh7XG4gICAgICBsYWJlbDogJ0FkZHJlc3MnLFxuICAgICAgZ3JvdXA6ICdhZGRyZXNzJyxcbiAgICB9KSxcblxuICAgIC8vIEFkZGl0aW9uYWwgSW5mb1xuICAgIGFubnVhbF9yZXZlbnVlOiBGaWVsZC5jdXJyZW5jeSh7XG4gICAgICBsYWJlbDogJ0FubnVhbCBSZXZlbnVlJyxcbiAgICAgIGdyb3VwOiAnYWRkaXRpb25hbCcsXG4gICAgfSksXG5cbiAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiBGaWVsZC5udW1iZXIoe1xuICAgICAgbGFiZWw6ICdOdW1iZXIgb2YgRW1wbG95ZWVzJyxcbiAgICAgIGdyb3VwOiAnYWRkaXRpb25hbCcsXG4gICAgfSksXG5cbiAgICBkZXNjcmlwdGlvbjogRmllbGQubWFya2Rvd24oe1xuICAgICAgbGFiZWw6ICdEZXNjcmlwdGlvbicsXG4gICAgICBncm91cDogJ2FkZGl0aW9uYWwnLFxuICAgIH0pLFxuXG4gICAgLy8gQ3VzdG9tIG5vdGVzIHdpdGggcmljaCB0ZXh0IGZvcm1hdHRpbmdcbiAgICBub3RlczogRmllbGQucmljaHRleHQoe1xuICAgICAgbGFiZWw6ICdOb3RlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1dvcmtpbmcgbm90ZXMgb24gdGhpcyBsZWFkIFx1MjAxNCBzdXBwb3J0cyBmb3JtYXR0aW5nLicsXG4gICAgICBncm91cDogJ2FkZGl0aW9uYWwnLFxuICAgIH0pLFxuXG4gICAgLy8gRmxhZ3NcbiAgICBkb19ub3RfY2FsbDogRmllbGQuYm9vbGVhbih7XG4gICAgICBsYWJlbDogJ0RvIE5vdCBDYWxsJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBncm91cDogJ3ByZWZlcmVuY2VzJyxcbiAgICB9KSxcblxuICAgIGVtYWlsX29wdF9vdXQ6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdFbWFpbCBPcHQgT3V0JyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBncm91cDogJ3ByZWZlcmVuY2VzJyxcbiAgICB9KSxcblxuICAgIC8vIEZvbGxvdy11cCAmIGRpc3F1YWxpZmljYXRpb24gdHJhY2tpbmdcbiAgICBuZXh0X2ZvbGxvd3VwX2RhdGU6IEZpZWxkLmRhdGUoe1xuICAgICAgbGFiZWw6ICdOZXh0IEZvbGxvdy11cCBEYXRlJyxcbiAgICAgIGdyb3VwOiAncXVhbGlmaWNhdGlvbicsXG4gICAgfSksXG5cbiAgICAvLyBOT1QgYHJlYWRvbmx5YCAoIzU5MikgXHUyMDE0IHNlZSB0aGUgbG9uZyBub3RlIG9uXG4gICAgLy8gYGNybV9hY2NvdW50Lmxhc3RfYWN0aXZpdHlfZGF0ZWAuIFRoZSBhY3Rpdml0eSBidWJibGUgd3JpdGVzIHRoaXMgZnJvbVxuICAgIC8vIGFub3RoZXIgb2JqZWN0J3MgaG9vaywgYW5kIGEgcmVhZG9ubHkgZmllbGQgaXMgc3RyaXBwZWQgZnJvbSBhbnlcbiAgICAvLyBub24tc3lzdGVtIHdyaXRlIHdob3NlIGNhbGxlciBzdXBwbGllZCB0aGUga2V5ICgjMjk0OCksIHNvIGV2ZXJ5IGJ1YmJsZVxuICAgIC8vIGludG8gdGhpcyBjb2x1bW4gd2FzIHNpbGVudGx5IGRpc2NhcmRlZC5cbiAgICBsYXN0X2NvbnRhY3RlZF9kYXRlOiBGaWVsZC5kYXRldGltZSh7XG4gICAgICBsYWJlbDogJ0xhc3QgQ29udGFjdGVkJyxcbiAgICAgIGdyb3VwOiAncXVhbGlmaWNhdGlvbicsXG4gICAgfSksXG5cbiAgICBkaXNxdWFsaWZpY2F0aW9uX3JlYXNvbjogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnRGlzcXVhbGlmaWNhdGlvbiBSZWFzb24nLFxuICAgICAgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUmVxdWlyZWQgd2hlbiBzdGF0dXMgaXMgVW5xdWFsaWZpZWQnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnTm90IGEgRml0JywgICAgICAgICB2YWx1ZTogJ25vdF9hX2ZpdCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ05vIEJ1ZGdldCcsICAgICAgICAgdmFsdWU6ICdub19idWRnZXQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdXcm9uZyBQZXJzb25hJywgICAgIHZhbHVlOiAnd3JvbmdfcGVyc29uYScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1VucmVhY2hhYmxlJywgICAgICAgdmFsdWU6ICd1bnJlYWNoYWJsZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0R1cGxpY2F0ZScsICAgICAgICAgdmFsdWU6ICdkdXBsaWNhdGUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDb21wZXRpdG9yJywgICAgICAgIHZhbHVlOiAnY29tcGV0aXRvcicgfSxcbiAgICAgICAgeyBsYWJlbDogJ090aGVyJywgICAgICAgICAgICAgdmFsdWU6ICdvdGhlcicgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgRHVwbGljYXRlIG1hbmFnZW1lbnQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBgZGlzcXVhbGlmaWNhdGlvbl9yZWFzb246ICdkdXBsaWNhdGUnYCBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIHJlY29yZFxuICAgIC8vIHNheXMgV0hBVCBpdCBkdXBsaWNhdGVzIFx1MjAxNCBvdGhlcndpc2UgdGhlIFwiZHVwbGljYXRlXCIgYmFyIG9uIHRoZVxuICAgIC8vIGRpc3F1YWxpZmljYXRpb24gYnJlYWtkb3duIHBvaW50cyBhdCBub3RoaW5nIHlvdSBjYW4gb3Blbi5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBUaGUgc3Vydml2aW5nIHJlY29yZCBjYW4gbGl2ZSBvbiBlaXRoZXIgb2JqZWN0IFx1MjAxNCBhIHN0aWxsLW9wZW4gbGVhZCwgb3JcbiAgICAvLyBhIGNvbnRhY3QgdGhlIHByb3NwZWN0IGFscmVhZHkgYmVjYW1lIFx1MjAxNCBhbmQgYEZpZWxkLmxvb2t1cGAgdGFrZXMgZXhhY3RseVxuICAgIC8vIG9uZSB0YXJnZXQgKGBGaWVsZC5sb29rdXAoWydjcm1fbGVhZCcsJ2NybV9jb250YWN0J10pYCBpcyByZWplY3RlZCBhdFxuICAgIC8vIHNjaGVtYSBwYXJzZTogXCJyZWZlcmVuY2U6IGV4cGVjdGVkIHN0cmluZywgcmVjZWl2ZWQgYXJyYXlcIikuIFNvIHRoZSBsaW5rXG4gICAgLy8gaXMgdGhlIHNhbWUgVFlQRS1ESVNDUklNSU5BVE9SIHNoYXBlIGBjcm1fdGFzay5yZWxhdGVkX3RvXypgIGFscmVhZHkgdXNlczpcbiAgICAvLyBvbmUgc2VsZWN0IG5hbWluZyB0aGUgb2JqZWN0LCBvbmUgbG9va3VwIHBlciBvYmplY3QsIGFuZCB0aGUgcGFpcmluZ1xuICAgIC8vIGVuZm9yY2VkIGRlY2xhcmF0aXZlbHkuXG4gICAgLy9cbiAgICAvLyBUaGUgdm9jYWJ1bGFyeSBpcyBUV08gc2V0cywgZGVjbGFyZWQgYW5kIHNwbGl0IGluIGBfcGlja2xpc3RzLnRzYDogdGhlIHR3b1xuICAgIC8vIG9iamVjdCBuYW1lcyBhbiBhdXRob3IgbWF5IHBpY2ssIHBsdXMgYGVyYXNlZGAgXHUyMDE0IGEgdG9tYnN0b25lIHRoZSBmb3JtIGRvZXNcbiAgICAvLyBub3Qgb2ZmZXIgYW5kIG9ubHkgYGxlYWRfZHVwbGljYXRlX2NoZWNrYCBldmVyIHdyaXRlcy5cbiAgICAvL1xuICAgIC8vIFRoZSB0b21ic3RvbmUgaXMgd2hhdCBsZXRzIGFuIGVyYXN1cmUgQ09NUExFVEUgYWdhaW5zdCBhIGxlYWQgYSBodW1hblxuICAgIC8vIGNvbmZpcm1lZCBhcyBhIGR1cGxpY2F0ZSwgd2l0aG91dCByZWxheGluZyBvbmUgcnVsZSwgc28gcmVhZCBpdCBhcyBhXG4gICAgLy8gY29uc3RyYWludCByYXRoZXIgdGhhbiBhcyBhIHNwYXJlIHZhbHVlOiBgcmVxdWlyZWRXaGVuYCBiZWxvdyBwYWlycyBvbmx5XG4gICAgLy8gYGNybV9sZWFkYCAvIGBjcm1fY29udGFjdGAsIHNvIGEgdG9tYnN0b25lZCB0eXBlIG5ldmVyIGZpcmVzIGVpdGhlclxuICAgIC8vIHBhaXJpbmcgYW5kIG5ldmVyIGRlbWFuZHMgYSBwb2ludGVyIHRvIGEgcmVjb3JkIHRoYXQgaXMgZ29uZTsgYW5kXG4gICAgLy8gYGR1cGxpY2F0ZV9kaXNxdWFsaWZpY2F0aW9uX3JlcXVpcmVzX3N1cnZpdm9yYCBhc2tzIGZvciBhIE5PTi1CTEFOSyB0eXBlXG4gICAgLy8gcGx1cyBgZHVwbGljYXRlX3N0YXR1cyA9PSBcImNvbmZpcm1lZFwiYCwgYm90aCBvZiB3aGljaCBhIHRvbWJzdG9uZWQgbGVhZFxuICAgIC8vIHN0aWxsIHNhdGlzZmllcyBcdTIwMTQgc28gdGhlIHZlcmRpY3QgYSByZXZpZXdlciByZWNvcmRlZCBzdXJ2aXZlcyB0aGUgZXJhc3VyZVxuICAgIC8vIGluc3RlYWQgb2YgYmVpbmcgZGVsZXRlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHNvbWVvbmUgZWxzZSdzIEdEUFIgcmVxdWVzdC5cbiAgICBkdXBsaWNhdGVfb2ZfdHlwZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnRHVwbGljYXRlIE9mJyxcbiAgICAgIGdyb3VwOiAnZHVwbGljYXRlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1doaWNoIG9iamVjdCBob2xkcyB0aGUgc3Vydml2aW5nIHJlY29yZCB0aGlzIGxlYWQgcmVwZWF0cy4nLFxuICAgICAgb3B0aW9uczogWy4uLkRVUExJQ0FURV9PRl9UWVBFX09QVElPTlNdLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoZSB0eXBlXHUyMTk0bG9va3VwIHBhaXJpbmcgaXMgYHJlcXVpcmVkV2hlbmAsIG5vdCBhIHNjcmlwdCB2YWxpZGF0aW9uOlxuICAgIC8vIFwidGhlIGxvb2t1cCBuYW1lZCBieSB0aGUgdHlwZSBtdXN0IGJlIHBvcHVsYXRlZFwiIGlzIGV4YWN0bHkgYSBjb25kaXRpb25hbFxuICAgIC8vIHdyaXRlIGNvbnRyYWN0LCB0aGUgZW5naW5lIGV2YWx1YXRlcyBpdCBvbiBpbnNlcnQgYW5kIHVwZGF0ZSwgYW5kIGl0XG4gICAgLy8gcmVwb3J0cyBhZ2FpbnN0IHRoZSBGSUVMRCwgc28gdGhlIGZvcm0gbWFya3MgdGhlIGVtcHR5IGxvb2t1cCBpbnN0ZWFkIG9mXG4gICAgLy8gc2hvd2luZyBhIHJlY29yZC1sZXZlbCBlcnJvci4gKGBjcm1fdGFza2Agc3RhdGVzIHRoZSBzYW1lIGludGVudCBhcyBhXG4gICAgLy8gd2FybmluZy1zZXZlcml0eSBzY3JpcHQgcnVsZSBiZWNhdXNlIGl0IHByZWRhdGVzIGByZXF1aXJlZFdoZW5gLFxuICAgIC8vIEFEUi0wMTEzLilcbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBgaGFzKC4uLilgIGlzIGxvYWQtYmVhcmluZywgbm90IGRlY29yYXRpb24uIEEgYmFyZVxuICAgIC8vIGByZWNvcmQuZHVwbGljYXRlX29mX3R5cGUgPT0gXCJjcm1fbGVhZFwiYCBhYm9ydHMgd2l0aCBgTm8gc3VjaCBrZXlgIG9uIGFueVxuICAgIC8vIHJlY29yZCB3aG9zZSBtZXJnZWQgc2hhcGUgb21pdHMgdGhlIGNvbHVtbiwgYW5kIHRoZSBlbmdpbmUncyByZXNwb25zZSB0byBhXG4gICAgLy8gcHJlZGljYXRlIHRoYXQgZmFpbHMgdG8gZXZhbHVhdGUgaXMgdG8gU0tJUCBpdCAoXCJyZXF1aXJlZFdoZW4gZm9yXG4gICAgLy8gJ2R1cGxpY2F0ZV9vZl9sZWFkJyBmYWlsZWQgdG8gZXZhbHVhdGUgXHUyMDE0IHNraXBwZWRcIikuIFRoZSBydWxlIHdvdWxkIHRoZW5cbiAgICAvLyByZWFkIGFzIGVuZm9yY2VkIGFuZCByZXF1aXJlIG5vdGhpbmcgYXQgYWxsLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIEJvdGggbG9va3VwcyB0YWtlIHRoZSBzcGVjIGRlZmF1bHQgYGRlbGV0ZUJlaGF2aW9yOiAnc2V0X251bGwnYCwgYW5kXG4gICAgLy8gdGhhdCBpcyBkZWxpYmVyYXRlOiBhIGxlYWQgaXMgYSBmaXJzdC1jbGFzcyByZWNvcmQgdGhhdCBoYXBwZW5zIHRvIGNhcnJ5IGFcbiAgICAvLyBmbGFnLCBzbyBgY2FzY2FkZWAgd291bGQgZGVzdHJveSB0aGUgbGVhZCBiZWNhdXNlIHRoZSByZWNvcmQgaXQgd2FzXG4gICAgLy8gY29tcGFyZWQgYWdhaW5zdCB3YXMgZGVsZXRlZC4gV2hhdCBrZWVwcyB0aGUgcGFpcmluZyBob25lc3QgdW5kZXIgYVxuICAgIC8vIGBzZXRfbnVsbGAgY2xlYXIgaXMgdGhlIHJldGlyZW1lbnQgYmxvY2sgaW4gYGxlYWRfZHVwbGljYXRlX2NoZWNrYFxuICAgIC8vIChgbGVhZC5ob29rLnRzYCwgam9iIDFjKTogd2hlbiBhIHdyaXRlIGxlYXZlcyB0aGUgbmFtZWQgbG9va3VwIGJsYW5rIGl0XG4gICAgLy8gZHJvcHMgYGR1cGxpY2F0ZV9vZl90eXBlYCBhbmQgYGR1cGxpY2F0ZV9zdGF0dXNgIGluIHRoZSBzYW1lIHdyaXRlLCBzbyB0aGVcbiAgICAvLyBwYWlyIGlzIG5ldmVyIGxlZnQgaGFsZi1zdGF0ZWQgYW5kIHRoaXMgcnVsZSBuZXZlciBoYXMgdG8gYmUgbG9vc2VuZWQgdG9cbiAgICAvLyB0b2xlcmF0ZSBvbmUuIFJlYWQgdGhhdCBub3RlIGJlZm9yZSBjaGFuZ2luZyBlaXRoZXIgcHJlZGljYXRlLlxuICAgIGR1cGxpY2F0ZV9vZl9sZWFkOiBGaWVsZC5sb29rdXAoJ2NybV9sZWFkJywge1xuICAgICAgbGFiZWw6ICdEdXBsaWNhdGUgT2YgTGVhZCcsXG4gICAgICBncm91cDogJ2R1cGxpY2F0ZXMnLFxuICAgICAgcmVxdWlyZWRXaGVuOiBQYGhhcyhyZWNvcmQuZHVwbGljYXRlX29mX3R5cGUpICYmIHJlY29yZC5kdXBsaWNhdGVfb2ZfdHlwZSA9PSBcImNybV9sZWFkXCJgLFxuICAgIH0pLFxuXG4gICAgZHVwbGljYXRlX29mX2NvbnRhY3Q6IEZpZWxkLmxvb2t1cCgnY3JtX2NvbnRhY3QnLCB7XG4gICAgICBsYWJlbDogJ0R1cGxpY2F0ZSBPZiBDb250YWN0JyxcbiAgICAgIGdyb3VwOiAnZHVwbGljYXRlcycsXG4gICAgICByZXF1aXJlZFdoZW46IFBgaGFzKHJlY29yZC5kdXBsaWNhdGVfb2ZfdHlwZSkgJiYgcmVjb3JkLmR1cGxpY2F0ZV9vZl90eXBlID09IFwiY3JtX2NvbnRhY3RcImAsXG4gICAgfSksXG5cbiAgICAvLyBNYWNoaW5lIHN1c3BpY2lvbiBhbmQgaHVtYW4gdmVyZGljdCBhcmUgT05FIGZpZWxkIHdpdGggdHdvIHZhbHVlcywgbm90IHR3b1xuICAgIC8vIHBhcmFsbGVsIHNldHMgb2YgbGluayBmaWVsZHM6IHRoZSBpbnRha2UgaG9vayB3cml0ZXMgYHN1c3BlY3RlZGAgYW5kIG9ubHlcbiAgICAvLyBldmVyIHdoZW4gdGhpcyBpcyBibGFuayAobGVhZC5ob29rLnRzKSwgc28gYSBodW1hbidzIGBjb25maXJtZWRgIHN1cnZpdmVzXG4gICAgLy8gZXZlcnkgbGF0ZXIgd3JpdGUsIGFuZCBib3RoIHN0YXRlcyBzdGF5IHF1ZXJ5YWJsZSBvZmYgb25lIGNvbHVtbi5cbiAgICBkdXBsaWNhdGVfc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdEdXBsaWNhdGUgU3RhdHVzJyxcbiAgICAgIGdyb3VwOiAnZHVwbGljYXRlcycsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1N1c3BlY3RlZCA9IGZsYWdnZWQgYXV0b21hdGljYWxseSBhdCBpbnRha2UuIENvbmZpcm1lZCA9IGEgaHVtYW4gdmVyaWZpZWQgdGhlIG1hdGNoLicsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdTdXNwZWN0ZWQnLCB2YWx1ZTogJ3N1c3BlY3RlZCcsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0NvbmZpcm1lZCcsIHZhbHVlOiAnY29uZmlybWVkJywgY29sb3I6ICcjRkYwMDAwJyB9LFxuICAgICAgXSxcbiAgICB9KSxcbiAgfSxcblxuICAvLyBMaWZlY3ljbGUgdHJhbnNpdGlvbnMgYXJlIGVuZm9yY2VkIHZpYSBhIGBzdGF0ZV9tYWNoaW5lYCB2YWxpZGF0aW9uIHJ1bGVcbiAgLy8gKHNlZSB2YWxpZGF0aW9uc1tdIGJlbG93KS4gXHUyNkEwXHVGRTBGIFRoZXJlIGlzIG5vIHRvcC1sZXZlbCBgc3RhdGVNYWNoaW5lc2Aga2V5IG9uXG4gIC8vIHRoZSBwbGF0Zm9ybSBcdTIwMTQgc3RhdHVzIHN0YXRlIG1hY2hpbmVzIGFyZSBleHByZXNzZWQgaW4gdGhlIHZhbGlkYXRpb24gdW5pb24uXG5cbiAgLy8gRGF0YWJhc2UgaW5kZXhlcyBmb3IgcGVyZm9ybWFuY2VcbiAgLy9cbiAgLy8gXHUyNkEwXHVGRTBGIGBlbWFpbGAgaXMgaW5kZXhlZCBidXQgTk9UIHVuaXF1ZSwgYW5kIHRoZSBpbmRleCBtdXN0IHN0YXkgZXhwbGljaXQ6IGl0XG4gIC8vIHVzZWQgdG8gZXhpc3Qgb25seSBhcyBhIHNpZGUgZWZmZWN0IG9mIGEgZmllbGQtbGV2ZWwgYHVuaXF1ZTogdHJ1ZWAsIHNvXG4gIC8vIGRyb3BwaW5nIHRoYXQgY29uc3RyYWludCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBkcm9wcGVkIHRoZSBpbmRleCB3aXRoIGl0IGFuZFxuICAvLyBsZWZ0IHRocmVlIHJlYWQgcGF0aHMgXHUyMDE0IHRoZSBgbGVhZF9kdXBsaWNhdGVfY2hlY2tgIGludGFrZSBsb29rdXAsIHRoZVxuICAvLyBgY3JtX2xlYWRfaW1wb3J0YCB1cHNlcnQga2V5IGFuZCB0aGUgY29udmVyc2lvbiBmbG93IFx1MjAxNCBzY2FubmluZyB0aGUgdGFibGVcbiAgLy8gb24gZXZlcnkgd3JpdGUuXG4gIC8vXG4gIC8vIFx1MjZENCBEbyBOT1QgYWRkIGB1bmlxdWU6IHRydWVgIGJhY2sgaGVyZTogYSBzaW5nbGUtY29sdW1uIHVuaXF1ZSBpbmRleCBtYWtlc1xuICAvLyB0aGUgcGxhdGZvcm0td2lkZSBjb25zdHJhaW50IHdpbiBvdmVyIHRoZSBwZXItdGVuYW50IGNvbXBvc2l0ZVxuICAvLyAoZnJhbWV3b3JrIzM5OTEpLCBzbyB0d28gb3JnYW5pemF0aW9ucyBjb3VsZCBub3Qgd29yayB0aGUgc2FtZSBhZGRyZXNzXG4gIC8vIGluZGVwZW5kZW50bHkuIFVuaXF1ZW5lc3MgaXMgbm90IHRoZSBydWxlIHRoaXMgb2JqZWN0IHdhbnRzIGF0IGFsbC5cbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ293bmVyX2lkJ10gfSxcbiAgICB7IGZpZWxkczogWydzdGF0dXMnXSB9LFxuICAgIHsgZmllbGRzOiBbJ2NvbXBhbnknXSB9LFxuICAgIHsgZmllbGRzOiBbJ2VtYWlsJ10gfSxcbiAgXSxcbiAgXG4gIC8vIEFQSSBzdXJmYWNlLiBIaXN0b3J5IFx1MjE5MiBGaWVsZC50cmFja0hpc3RvcnkgKEFEUi0wMDUyKS5cbiAgZW5hYmxlOiB7XG4gICAgYXBpRW5hYmxlZDogdHJ1ZSxcbiAgfSxcbiAgXG4gIC8vIEFEUi0wMDc5IHJlY29yZCB0aXRsZSBcdTIwMTQgdGhlIGBkaXNwbGF5X3RpdGxlYCBmb3JtdWxhIGZpZWxkIGRlZmluZWQgYWJvdmUuXG4gIG5hbWVGaWVsZDogJ2Rpc3BsYXlfdGl0bGUnLFxuICAvLyBFeHBsaWNpdCBzZWFyY2ggdGFyZ2V0cyAoQURSLTAwNjEpLiBSRVFVSVJFRCBiZWNhdXNlIG5hbWVGaWVsZCBpcyBhXG4gIC8vIEZPUk1VTEEgKGRpc3BsYXlfdGl0bGUvZnVsbF9uYW1lKTogd2l0aG91dCB0aGlzLCAkc2VhcmNoIGF1dG8tZGVmYXVsdHMgdG9cbiAgLy8gdGhlIGZvcm11bGEgZmllbGQsIHdoaWNoIGlzbid0IGEgcmVhbCBjb2x1bW4sIHNvIHRoZSBsb29rdXAgcGlja2VyICsgZ2xvYmFsXG4gIC8vIHNlYXJjaCBzaWxlbnRseSByZXR1cm4gemVyby4gVGhlc2UgYXJlIHJlYWwsIGluZGV4ZWQgY29sdW1ucy5cbiAgc2VhcmNoYWJsZUZpZWxkczogWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsICdjb21wYW55JywgJ2VtYWlsJ10sXG4gIGhpZ2hsaWdodEZpZWxkczogWydmdWxsX25hbWUnLCAnY29tcGFueScsICdlbWFpbCcsICdzdGF0dXMnLCAnb3duZXJfaWQnXSxcbiAgXG4gIC8vIFJlbW92ZWQ6IGxpc3Rfdmlld3MgYW5kIGZvcm1fdmlld3MgYmVsb25nIGluIFVJIGNvbmZpZ3VyYXRpb24sIG5vdCBvYmplY3QgZGVmaW5pdGlvblxuICBcbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnZW1haWxfcmVxdWlyZWQnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFbWFpbCBpcyByZXF1aXJlZCcsXG4gICAgICBjb25kaXRpb246IFBgIWhhcyhyZWNvcmQuZW1haWwpIHx8IGlzQmxhbmsocmVjb3JkLmVtYWlsKWAsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBUaGUgZmllbGQgZGVzY3JpcHRpb24gcHJvbWlzZXMgXCJSZXF1aXJlZCB3aGVuIHN0YXR1cyBpcyBVbnF1YWxpZmllZFwiO1xuICAgICAgLy8gdGhpcyBpcyB3aGF0IGVuZm9yY2VzIGl0LiBBIGxlYWQgaW4gYHVucXVhbGlmaWVkYCB3aXRoIG5vIHJlY29yZGVkXG4gICAgICAvLyByZWFzb24gbG9zZXMgdGhlIG9uZSBkYXR1bSBhIGRpc3F1YWxpZmljYXRpb24gcmV2aWV3IG5lZWRzLiBTYW1lIHNoYXBlXG4gICAgICAvLyBhcyBgY3JtX2Nhc2UuZXNjYWxhdGlvbl9yZWFzb25fcmVxdWlyZWRgLlxuICAgICAgbmFtZTogJ2Rpc3F1YWxpZmljYXRpb25fcmVhc29uX3JlcXVpcmVkJyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRGlzcXVhbGlmaWNhdGlvbiByZWFzb24gaXMgcmVxdWlyZWQgd2hlbiBhIGxlYWQgaXMgVW5xdWFsaWZpZWQnLFxuICAgICAgY29uZGl0aW9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwidW5xdWFsaWZpZWRcIiAmJiAoIWhhcyhyZWNvcmQuZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24pIHx8IGlzQmxhbmsocmVjb3JkLmRpc3F1YWxpZmljYXRpb25fcmVhc29uKSlgLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gXCJEaXNxdWFsaWZpZWQgYXMgYSBkdXBsaWNhdGVcIiBoYXMgdG8gbmFtZSB0aGUgc3Vydml2b3IuXG4gICAgICAvL1xuICAgICAgLy8gU2FtZSBzaGFwZSBhcyBgZGlzcXVhbGlmaWNhdGlvbl9yZWFzb25fcmVxdWlyZWRgIGRpcmVjdGx5IGFib3ZlIFx1MjAxNCBhXG4gICAgICAvLyBkZWNsYXJhdGl2ZSBjb25kaXRpb24gZXZhbHVhdGVkIGJ5IHRoZSBlbmdpbmUgb24gaW5zZXJ0IGFuZCB1cGRhdGUsIHdpdGhcbiAgICAgIC8vIG5vIGhvb2sgaW52b2x2ZWQuIFRoZSB0d28gY2xhdXNlcyBhcmUgdGhlIHR3byB0aGluZ3MgdGhlIGZpZWxkLWxldmVsXG4gICAgICAvLyBgcmVxdWlyZWRXaGVuYCBvbiB0aGUgbG9va3VwcyBjYW5ub3Qgc2F5OlxuICAgICAgLy9cbiAgICAgIC8vICAgMS4gYGR1cGxpY2F0ZV9vZl90eXBlYCBtdXN0IGJlIGNob3Nlbiwgd2hpY2ggaXMgd2hhdCBtYWtlcyBleGFjdGx5IG9uZVxuICAgICAgLy8gICAgICBvZiB0aGUgdHdvIGByZXF1aXJlZFdoZW5gIHByZWRpY2F0ZXMgZmlyZSBhbmQgZGVtYW5kIGl0cyBsb29rdXAuXG4gICAgICAvLyAgIDIuIGBkdXBsaWNhdGVfc3RhdHVzYCBtdXN0IGJlIGBjb25maXJtZWRgIFNQRUNJRklDQUxMWS4gYHJlcXVpcmVkV2hlbmBcbiAgICAgIC8vICAgICAgYXNrcyB3aGV0aGVyIGEgZmllbGQgaXMgcG9wdWxhdGVkLCBub3Qgd2hhdCBpdCBob2xkcyBcdTIwMTQgYW5kIGEgbGVhZFxuICAgICAgLy8gICAgICBjbG9zZWQgb24gdGhlIG1hY2hpbmUncyBgc3VzcGVjdGVkYCBndWVzcyBpcyBwcmVjaXNlbHkgdGhlIG91dGNvbWVcbiAgICAgIC8vICAgICAgdGhpcyBydWxlIGV4aXN0cyB0byBwcmV2ZW50LiBBIGh1bWFuIGhhcyB0byBsb29rIGFuZCBhZ3JlZS5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgRXZlcnkgZmllbGQgcmVmZXJlbmNlIGlzIHdyYXBwZWQgaW4gYGhhcyguLi4pYCwgYW5kIHRoYXQgaXMgd2hhdCBtYWtlc1xuICAgICAgLy8gdGhpcyBhbiBlbmZvcmNlZCBydWxlIHJhdGhlciB0aGFuIGEgZGVjb3JhdGl2ZSBvbmUuIFRoZSBlbmdpbmUgZXZhbHVhdGVzXG4gICAgICAvLyBhIHZhbGlkYXRpb24gYWdhaW5zdCBgey4uLnByZXZpb3VzLCAuLi5kYXRhfWAgYW5kIGZpbGxzIGFic2VudCBmaWVsZHNcbiAgICAgIC8vIHdpdGggbnVsbCBvbiBJTlNFUlQgXHUyMDE0IGJ1dCBub3Qgb24gVVBEQVRFLCB3aGVyZSBgcHJldmlvdXNgIGlzIHdoYXRldmVyXG4gICAgICAvLyB0aGUgZHJpdmVyIHJldHVybmVkLCBhbmQgYSBkcml2ZXIgdGhhdCBzdG9yZXMgb25seSB0aGUgY29sdW1ucyBhIHJvdyB3YXNcbiAgICAgIC8vIHdyaXR0ZW4gd2l0aCBoYW5kcyBiYWNrIGEgcmVjb3JkIHdpdGggbm8gYGR1cGxpY2F0ZV9zdGF0dXNgIGtleSBhdCBhbGwuXG4gICAgICAvLyBTdHJpY3QgQ0VMIHRoZW4gYWJvcnRzIHRoZSB3aG9sZSBwcmVkaWNhdGUgd2l0aCBgTm8gc3VjaCBrZXlgLCBhbmQgYVxuICAgICAgLy8gcHJlZGljYXRlIHRoYXQgZmFpbHMgdG8gZXZhbHVhdGUgaXMgU0tJUFBFRCwgbm90IGZhaWxlZDpcbiAgICAgIC8vXG4gICAgICAvLyAgICAgV0FSTiBWYWxpZGF0aW9uIHJ1bGUgJ1x1MjAyNicgcHJlZGljYXRlIGZhaWxlZCB0byBldmFsdWF0ZSAoXHUyMDI2KSBcdTIwMTQgc2tpcHBlZFxuICAgICAgLy9cbiAgICAgIC8vIFRoZSB1bmd1YXJkZWQgZmlyc3QgZHJhZnQgb2YgdGhpcyBydWxlIGxldCBhIGxlYWQgYmUgY2xvc2VkIGFzIGFcbiAgICAgIC8vIGR1cGxpY2F0ZSB3aXRoIG5vIHN1cnZpdm9yIG5hbWVkLCBzaWxlbnRseSwgb24gdGhlIGluLW1lbW9yeSBkcml2ZXIgXHUyMDE0XG4gICAgICAvLyB0aGUgZHJpdmVyIHRoZSB3aG9sZSB0ZXN0IHN1aXRlIHJ1bnMgb24uXG4gICAgICBuYW1lOiAnZHVwbGljYXRlX2Rpc3F1YWxpZmljYXRpb25fcmVxdWlyZXNfc3Vydml2b3InLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6XG4gICAgICAgICdEaXNxdWFsaWZ5aW5nIGEgbGVhZCBhcyBEdXBsaWNhdGUgcmVxdWlyZXMgbmFtaW5nIHRoZSBzdXJ2aXZpbmcgcmVjb3JkIGFuZCBzZXR0aW5nIER1cGxpY2F0ZSBTdGF0dXMgdG8gQ29uZmlybWVkJyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmRpc3F1YWxpZmljYXRpb25fcmVhc29uKSAmJiByZWNvcmQuZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24gPT0gXCJkdXBsaWNhdGVcIiAmJiAhKGhhcyhyZWNvcmQuZHVwbGljYXRlX29mX3R5cGUpICYmICFpc0JsYW5rKHJlY29yZC5kdXBsaWNhdGVfb2ZfdHlwZSkgJiYgaGFzKHJlY29yZC5kdXBsaWNhdGVfc3RhdHVzKSAmJiByZWNvcmQuZHVwbGljYXRlX3N0YXR1cyA9PSBcImNvbmZpcm1lZFwiKWAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnbGVhZF9zdGF0dXNfcHJvZ3Jlc3Npb24nLFxuICAgICAgdHlwZTogJ3N0YXRlX21hY2hpbmUnLFxuICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGxlYWQgc3RhdHVzIHRyYW5zaXRpb24nLFxuICAgICAgZmllbGQ6ICdzdGF0dXMnLFxuICAgICAgLy8gQ29udmVyc2lvbiAoXHUyMTkyIGNvbnZlcnRlZCkgaXMgYWxsb3dlZCBmcm9tIGFueSB3b3JrZWQtb3BlbiBzdGF0dXMgc28gdGhlXG4gICAgICAvLyBDb252ZXJ0IGFjdGlvbidzIHdpZGVuZWQgdmlzaWJpbGl0eSAobmV3L2NvbnRhY3RlZC9xdWFsaWZpZWQpIG5ldmVyIHRyaXBzXG4gICAgICAvLyBhIHNwdXJpb3VzIFwiaW52YWxpZCB0cmFuc2l0aW9uXCIgd2FybmluZyB3aGVuIHRoZSBmbG93IHN0YW1wc1xuICAgICAgLy8gc3RhdHVzOidjb252ZXJ0ZWQnLlxuICAgICAgdHJhbnNpdGlvbnM6IHtcbiAgICAgICAgbmV3OiBbJ2NvbnRhY3RlZCcsICdxdWFsaWZpZWQnLCAndW5xdWFsaWZpZWQnLCAnY29udmVydGVkJ10sXG4gICAgICAgIGNvbnRhY3RlZDogWydxdWFsaWZpZWQnLCAndW5xdWFsaWZpZWQnLCAnY29udmVydGVkJ10sXG4gICAgICAgIHF1YWxpZmllZDogWydjb252ZXJ0ZWQnLCAndW5xdWFsaWZpZWQnXSxcbiAgICAgICAgdW5xdWFsaWZpZWQ6IFsnbmV3J10sXG4gICAgICAgIGNvbnZlcnRlZDogW10sXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG4gIFxuICAvLyBcdTI2QTBcdUZFMEYgTm8gYHdvcmtmbG93c1tdYCBoZXJlLCBhbmQgbm9uZSBpcyBwb3NzaWJsZTogb2JqZWN0IGB3b3JrZmxvd3NbXWAgd2VyZVxuICAvLyByZW1vdmVkIGZyb20gdGhlIHBsYXRmb3JtLiBGaWVsZCB1cGRhdGVzIGxpdmUgaW4gdGhpcyBvYmplY3QncyBgKi5ob29rLnRzYDtcbiAgLy8gc2NoZWR1bGVkIHN0YXR1cyBmbGlwcyBhbmQgbm90aWZpY2F0aW9ucyBsaXZlIGluIGBzcmMvKi9mbG93cy8qLmZsb3cudHNgLlxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL29wcG9ydHVuaXR5Lm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvb3Bwb3J0dW5pdHkub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBPYmplY3RTY2hlbWEsIEZpZWxkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBGLCBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgTEVBRF9TT1VSQ0VfT1BUSU9OUywgT1BQT1JUVU5JVFlfU1RBR0VfT1BUSU9OUyB9IGZyb20gJy4vX3BpY2tsaXN0cyc7XG5cbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eSA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgbGFiZWw6ICdPcHBvcnR1bml0eScsXG4gIHBsdXJhbExhYmVsOiAnT3Bwb3J0dW5pdGllcycsXG4gIGljb246ICdkb2xsYXItc2lnbicsXG4gIGRlc2NyaXB0aW9uOiAnU2FsZXMgb3Bwb3J0dW5pdGllcyBhbmQgZGVhbHMgaW4gdGhlIHBpcGVsaW5lJyxcblxuICAvLyBBRFItMDA5MCBEMS9ENzogT1dEIGlzIGFuIGF1dGhvcmVkIGRlY2lzaW9uLiBPd25lciArIGhpZ2gtdmFsdWUgbWFuYWdlbWVudCBzaGFyaW5nIHJ1bGUuXG4gIHNoYXJpbmdNb2RlbDogJ3ByaXZhdGUnLFxuICAvLyBcdTI2QTBcdUZFMEYgQURSLTAwNzkgYG5hbWVGaWVsZGAgaXMgYSBGSUVMRCwgbm90IGEgcmVuZGVyIHRlbXBsYXRlLCBhbmQgYSBGT1JNVUxBXG4gIC8vIHNlZXMgdGhlIHN0b3JlZCBzZWxlY3QgVkFMVUUgcmF0aGVyIHRoYW4gaXRzIHRyYW5zbGF0ZWQgbGFiZWwgXHUyMDE0IHNvIGFcbiAgLy8gYCd7bmFtZX0gLSB7c3RhZ2V9J2AgdGl0bGUgcmVuZGVycyBldmVyeSBkZWFsIFwiRW50ZXJwcmlzZSBEZWFsIC1cbiAgLy8gY2xvc2VkX3dvblwiIGluIGxvb2t1cHMsIHJlbGF0ZWQgbGlzdHMgYW5kIHNlYXJjaCwgaW4gZXZlcnkgbG9jYWxlLiBUaGVcbiAgLy8gZm9ybXVsYSBsYW5ndWFnZSBoYXMgbm8gb3B0aW9uLWxhYmVsIGxvb2t1cCwgc28gdGhlIHRpdGxlIGlzIHRoZSBwbGFpblxuICAvLyBgbmFtZWAgY29sdW1uOyBgc3RhZ2VgIHN0aWxsIGxlYWRzIHRoZSBoaWdobGlnaHQgc3RyaXAgYmVsb3csIHRyYW5zbGF0ZWQuXG4gIG5hbWVGaWVsZDogJ25hbWUnLFxuICAvLyBFeHBsaWNpdCBzZWFyY2ggdGFyZ2V0cyAoQURSLTAwNjEpLiBgbmFtZWAgaXMgYSByZWFsIGluZGV4ZWQgY29sdW1uLCBzb1xuICAvLyAkc2VhcmNoIHJlc29sdmVzIG9uIGl0cyBvd24gaGVyZTsgdGhlIGxpc3QgaXMga2VwdCBleHBsaWNpdCB0byBwaW4gdGhlXG4gIC8vIGludGVudCAob3RoZXIgb2JqZWN0cyB3aG9zZSBuYW1lRmllbGQgSVMgYSBmb3JtdWxhIHJlbHkgb24gaXQpLlxuICBzZWFyY2hhYmxlRmllbGRzOiBbJ25hbWUnXSxcbiAgaGlnaGxpZ2h0RmllbGRzOiBbJ25hbWUnLCAnY3JtX2FjY291bnQnLCAnYW1vdW50JywgJ3N0YWdlJywgJ293bmVyX2lkJ10sXG5cbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2Jhc2ljJywgICAgICAgbGFiZWw6ICdCYXNpYyBJbmZvcm1hdGlvbicsICAgaWNvbjogJ2RvbGxhci1zaWduJyB9LFxuICAgIHsga2V5OiAnZmluYW5jaWFscycsICBsYWJlbDogJ0ZpbmFuY2lhbHMnLCAgICAgICAgICBpY29uOiAndHJlbmRpbmctdXAnIH0sXG4gICAgeyBrZXk6ICdzYWxlc19wcm9jZXNzJywgbGFiZWw6ICdTYWxlcyBQcm9jZXNzJywgICAgIGljb246ICd0YXJnZXQnIH0sXG4gICAgeyBrZXk6ICdxdWFsaWZpY2F0aW9uJywgbGFiZWw6ICdRdWFsaWZpY2F0aW9uJywgICAgIGljb246ICdmaWx0ZXInIH0sXG4gICAgeyBrZXk6ICduYXJyYXRpdmUnLCAgIGxhYmVsOiAnRGVhbCBOYXJyYXRpdmUnLCAgICAgIGljb246ICdib29rLW9wZW4nIH0sXG4gICAgeyBrZXk6ICdjbGFzc2lmaWNhdGlvbicsIGxhYmVsOiAnQ2xhc3NpZmljYXRpb24nLCAgIGljb246ICd0YWcnIH0sXG4gICAgeyBrZXk6ICdjYW1wYWlnbicsIGxhYmVsOiAnQ2FtcGFpZ25zJywgaWNvbjogJ2ZsYWcnLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ25vdGVzJywgICAgICAgbGFiZWw6ICdOb3RlcyAmIE5leHQgU3RlcHMnLCAgaWNvbjogJ2ZpbGUtdGV4dCcgfSxcbiAgICB7IGtleTogJ2NybV9mb3JlY2FzdCcsICAgIGxhYmVsOiAnRm9yZWNhc3QgJiBNZXRyaWNzJywgIGljb246ICdiYXItY2hhcnQnLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgXSxcblxuICBmaWVsZHM6IHtcbiAgICAvLyBQbGF0Zm9ybSBvd25lcnNoaXAgYW5jaG9yIFx1MjAxNCBjYW5vbmljYWwgbm90ZSBpbiBgYWNjb3VudC5vYmplY3QudHNgICgjNTQ4KS5cbiAgICBvd25lcl9pZDogRmllbGQubG9va3VwKCdzeXNfdXNlcicsIHtcbiAgICAgIGxhYmVsOiAnT3Bwb3J0dW5pdHkgT3duZXInLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBzeXN0ZW06IHRydWUsXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBCYXNpYyBJbmZvcm1hdGlvblxuICAgIG5hbWU6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdPcHBvcnR1bml0eSBOYW1lJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICAvLyAoTm8gYGRpc3BsYXlfdGl0bGVgIGZvcm11bGEgXHUyMDE0IHNlZSBgbmFtZUZpZWxkYCBhYm92ZTogY29tcG9zaW5nIHRoZSB0aXRsZVxuICAgIC8vIGZyb20gYHN0YWdlYCBsZWFrZWQgdGhlIHJhdyBzZWxlY3QgdmFsdWUgaW50byBldmVyeSByZW5kZXJlZCB0aXRsZS4pXG5cbiAgICAvLyBSZWxhdGlvbnNoaXBzXG4gICAgY3JtX2FjY291bnQ6IEZpZWxkLmxvb2t1cCgnY3JtX2FjY291bnQnLCB7XG4gICAgICBsYWJlbDogJ0FjY291bnQnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuXG4gICAgcHJpbWFyeV9jb250YWN0OiBGaWVsZC5sb29rdXAoJ2NybV9jb250YWN0Jywge1xuICAgICAgbGFiZWw6ICdQcmltYXJ5IENvbnRhY3QnLFxuICAgICAgLy8gQG9iamVjdHN0YWNrIDEyOiBzdHJpbmdbXSBgcmVmZXJlbmNlRmlsdGVyc2AgaXMgZGVhZCAobm90IHJlYWQgYnkgdGhlXG4gICAgICAvLyBwaWNrZXIpOyBgZGVwZW5kc09uYCBpcyB0aGUgbGl2ZSBjYXNjYWRpbmcgZm9ybSBcdTIwMTQgc2NvcGVzIGNvbnRhY3RzIHRvIHRoZVxuICAgICAgLy8gb3Bwb3J0dW5pdHkncyBgY3JtX2FjY291bnRgIChBRFItMDA0OSkuXG4gICAgICBkZXBlbmRzT246IFsnY3JtX2FjY291bnQnXSxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuXG5cbiAgICAvLyBGaW5hbmNpYWwgSW5mb3JtYXRpb25cbiAgICBhbW91bnQ6IEZpZWxkLmN1cnJlbmN5KHtcbiAgICAgIGxhYmVsOiAnQW1vdW50JyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBtaW46IDAsXG4gICAgICBncm91cDogJ2ZpbmFuY2lhbHMnLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgZXhwZWN0ZWRfcmV2ZW51ZTogRmllbGQuY3VycmVuY3koe1xuICAgICAgbGFiZWw6ICdFeHBlY3RlZCBSZXZlbnVlJyxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLCAgLy8gQ2FsY3VsYXRlZCBmaWVsZFxuICAgICAgZ3JvdXA6ICdmaW5hbmNpYWxzJyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBRdWFsaWZpY2F0aW9uIChSRVEtMDAwNiBzdGVwIDgpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gVGhlIHN0YW5kYXJkIHRyaWFnZSB2b2NhYnVsYXJ5IG9mIGEgc2VsbGVyIHRoYXQgY2Fubm90IHB1cnN1ZSBldmVyeVxuICAgIC8vIGRlYWwuIGBmb3JlY2FzdF9jYXRlZ29yeWAgYW5zd2VycyBhIGRpZmZlcmVudCBxdWVzdGlvbiBcdTIwMTQgaXQgaXMgdGhlXG4gICAgLy8gZm9yZWNhc3Qgcm9sbC11cCBidWNrZXQsIGRlcml2ZWQgZnJvbSBgc3RhZ2VgIFx1MjAxNCBzbyBub25lIG9mIHRoaXMgaXNcbiAgICAvLyBmb2xkZWQgaW50byBpdC4gR0VORVJJQyB2YWx1ZXMgb25seTogYSBjdXN0b21lcidzIG93biBncmFkaW5nIHNjYWxlIGlzXG4gICAgLy8gb3ZlcmxheSBjb25maWd1cmF0aW9uIChSRVEtMDAwNiBhY2NlcHRhbmNlIDUpLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIGBwbnBtIHZhbGlkYXRlYCByZXBvcnRzIHRoZSBmaWVsZHMgaW4gdGhpcyBibG9jaywgaW4gdGhlIG5hcnJhdGl2ZVxuICAgIC8vIGJsb2NrIGJlbG93LCBhbmQgdGhlIGN1c3RvbWVyLXNpZGUgZGF0ZXMgYXMgXCJjYXJyaWVyLW9ubHkgXHUyMDE0IGRlY2xhcmVkXG4gICAgLy8gYnV0IG5vdGhpbmcgaW4gdGhpcyBzdGFjayByZWFkcyBvciBkaXNwbGF5cyBpdFwiLCBhbmQgdGhhdCByZWFkaW5nIGlzXG4gICAgLy8gRVhQRUNURUQgaGVyZSByYXRoZXIgdGhhbiBhIGRlZmVjdCB0byB0aWR5IGF3YXkuIFRoZSBsaXZlbmVzc1xuICAgIC8vIGRpYWdub3N0aWMgY291bnRzIHZpZXcgY29sdW1ucywgZm9ybSBzZWN0aW9ucywgcGFnZSBiaW5kaW5ncywgZmxvd1xuICAgIC8vIG5vZGVzLCBmb3JtdWxhcywgaG9va3MgYW5kIGFjdGlvbnMgYXMgc2l0ZXM7IGl0IGRvZXMgTk9UIGNvdW50XG4gICAgLy8gYGZpZWxkR3JvdXBzYCBtZW1iZXJzaGlwLCB3aGljaCBpcyBwcmVjaXNlbHkgdGhlIERFUklWRUQgbGF5b3V0XG4gICAgLy8gUkVRLTAwMDYgYWNjZXB0YW5jZSAxIGFza3MgZm9yLiBcdTI2RDQgRG8gTk9UIGFuc3dlciB0aGUgd2FybmluZyBieVxuICAgIC8vIGF1dGhvcmluZyBhIGByZWNvcmQ6ZGV0YWlsc2Agc2VjdGlvbiBcdTIwMTQgdGhhdCBpcyB0aGUgZXNjYXBlIGhhdGNoXG4gICAgLy8gQUdFTlRTLm1kIHJlc2VydmVzIGZvciBhIG5hbWVkIGN1c3RvbWVyIGRlbWFuZCwgYW5kIGl0IHdvdWxkIHRyYWRlXG4gICAgLy8gYWNjZXB0YW5jZSAxIGZvciBhIHF1aWV0ZXIgbG9nLiBgY3JtX2FjY291bnRgJ3MgYnVzaW5lc3MtcHJvZmlsZSBibG9ja1xuICAgIC8vIGNhcnJpZXMgdGhlIHNhbWUgdmVyZGljdCBvbiBgbWFpbmAgZm9yIHRoZSBzYW1lIHJlYXNvbiAoIzE5NDgpLlxuICAgIHdpbGxfYmlkOiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGxhYmVsOiAnV2lsbCBCaWQnLFxuICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdlIGludGVuZCB0byBiaWQuIFVuc2V0IG1lYW5zIHRoZSBkZWNpc2lvbiBpcyBvcGVuLicsXG4gICAgICBncm91cDogJ3F1YWxpZmljYXRpb24nLFxuICAgIH0pLFxuXG4gICAgY29udHJvbGxhYmlsaXR5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdDb250cm9sbGFiaWxpdHknLFxuICAgICAgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0hpZ2gnLCB2YWx1ZTogJ2hpZ2gnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdNZWRpdW0nLCB2YWx1ZTogJ21lZGl1bScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0xvdycsIHZhbHVlOiAnbG93JyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIHByaW9yaXR5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdQcmlvcml0eScsXG4gICAgICBncm91cDogJ3F1YWxpZmljYXRpb24nLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnSGlnaCcsIHZhbHVlOiAnaGlnaCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ01lZGl1bScsIHZhbHVlOiAnbWVkaXVtJyB9LFxuICAgICAgICB7IGxhYmVsOiAnTG93JywgdmFsdWU6ICdsb3cnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgZGVhbF9sZXZlbDogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnRGVhbCBMZXZlbCcsXG4gICAgICBncm91cDogJ3F1YWxpZmljYXRpb24nLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnU3RyYXRlZ2ljJywgdmFsdWU6ICdzdHJhdGVnaWMnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdLZXknLCB2YWx1ZTogJ2tleScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N0YW5kYXJkJywgdmFsdWU6ICdzdGFuZGFyZCcgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICAvLyBUaGUgRkFDVCBvZiBzdWJjb250cmFjdGluZyBpcyBnZW5lcmljIGFuZCBiZWxvbmdzIGluIGNvcmU7IHRoZVxuICAgIC8vIGN1c3RvbWVyJ3Mgc3VwcGxpZXIgbGlzdCBpcyBub3QgYW5kIGlzIG5vdCBwcm9wb3NlZCBoZXJlLlxuICAgIGlzX3N1YmNvbnRyYWN0ZWQ6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdJbnZvbHZlcyBTdWJjb250cmFjdGluZycsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICB9KSxcblxuICAgIHN1YmNvbnRyYWN0aW5nX25vdGU6IEZpZWxkLnRleHRhcmVhKHtcbiAgICAgIGxhYmVsOiAnU3ViY29udHJhY3RpbmcgTm90ZScsXG4gICAgICBncm91cDogJ3F1YWxpZmljYXRpb24nLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFRoZSBcdTdBQ0JcdTk4NzkgKHF1YWxpZmljYXRpb24pIGdhdGU6IHRoZSByZXAncyByZXF1ZXN0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gUkVRLTAwMDYgc3RlcCAxMTogXHUzMDBDXHU5NTAwXHU1NTJFXHU3QUNCXHU5ODc5XHU5NzAwXHU4RDcwXHU1QkExXHU2Mjc5XHU2RDQxXHU3QTBCXHVGRjFCXHU2NUIwXHU1ODlFXHU1NTQ2XHU2NzNBXHU1M0VGXHU4RERGXHU4RkRCXHVGRjBDXHU3QUNCXHU5ODc5XHU5MDFBXHU4RkM3XHU1NDBFXHU2NUI5XHU1M0VGXHU2NkY0XHU2NUIwXHU5NjM2XHU2QkI1XHUzMDAxXG4gICAgLy8gXHU2Mjk1XHU2ODA3XHUzMDAxXHU4RDYyXHU0RTIyXHU1MzU1XHU2NENEXHU0RjVDXHUzMDAyXHUzMDBEIFRoZSByZXAgQVNLUyBmb3IgXHU3QUNCXHU5ODc5IGJ5IHRpY2tpbmcgdGhpcyBib3gsIGFuZFxuICAgIC8vIGBvcHBvcnR1bml0eV9xdWFsaWZpY2F0aW9uX2FwcHJvdmFsYCBvcGVucyBvbmUgYXBwcm92YWwgd2hlbiBpdCB0dXJucyBvblxuICAgIC8vICh0aGUgVFJBTlNJVElPTiwgbm90IHRoZSBjdXJyZW50IHZhbHVlKS4gQSByZWplY3Rpb24gY2xlYXJzIGl0LCBzb1xuICAgIC8vIHRpY2tpbmcgaXQgYWdhaW4gaXMgYSBmcmVzaCByZXF1ZXN0IFx1MjAxNCB0aGUgcm9sZSBgcmVxdWVzdGVkX3N0YXR1c2AgcGxheXNcbiAgICAvLyBmb3IgdGhlIHN0YXR1cy1jaGFuZ2UgZ2F0ZSwgYXMgYSBib29sZWFuIGJlY2F1c2UgXHU3QUNCXHU5ODc5IGFza3MgZm9yIG9uZSB0aGluZy5cbiAgICAvL1xuICAgIC8vIGBkZWZhdWx0VmFsdWU6IGZhbHNlYCBpcyBsb2FkLWJlYXJpbmcgZm9yIHRoZSBzdGFydCBjb25kaXRpb246IGV2ZXJ5IGRlYWxcbiAgICAvLyBib3JuIGFmdGVyIHRoaXMgY29sdW1uIHRoZW4gU1RPUkVTIHRoZSBrZXksIHNvIGBoYXMocHJldmlvdXMuXHUyMDI2KWAgaG9sZHNcbiAgICAvLyBvbiBldmVyeSBkcml2ZXIgYW5kIHRoZSBvZmZcdTIxOTJvbiB0cmFuc2l0aW9uIGlzIHZpc2libGUuIE5vdCByZWFkb25seTogdGhpc1xuICAgIC8vIGlzIHRoZSBvbmUgaGFsZiBvZiB0aGUgZ2F0ZSBhIHBlcnNvbiB3cml0ZXMuIEluZXJ0IHdoaWxlIHRoZSBnYXRlIGlzXG4gICAgLy8gb2ZmIFx1MjAxNCBub3RoaW5nIHJlYWRzIGl0IHVubGVzcyBhbiBpbnN0YWxsIGFybXMgdGhlIHZlcmRpY3QgYmVsb3cuXG4gICAgcXVhbGlmaWNhdGlvbl9yZXF1ZXN0ZWQ6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdSZXF1ZXN0IFF1YWxpZmljYXRpb24gQXBwcm92YWwnLFxuICAgICAgZGVzY3JpcHRpb246ICdUaWNrIHRvIHNlbmQgdGhpcyBkZWFsIGZvciBxdWFsaWZpY2F0aW9uIGFwcHJvdmFsLiBBIHJlamVjdGlvbiBjbGVhcnMgaXQ7IHRpY2sgaXQgYWdhaW4gdG8gYXNrIGFnYWluLicsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBUaGUgXHU3QUNCXHU5ODc5IGdhdGUncyBzd2l0Y2ggQU5EIGl0cyB2ZXJkaWN0IGNvbHVtbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBUaGlzIGBkZWZhdWx0VmFsdWVgIElTIHRoZSBzd2l0Y2gsIGV4YWN0bHkgYXMgb25cbiAgICAvLyBgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXNgIGJlbG93LCBhbmQgc2hpcHBlZCBpdCBpcyBgbm90X3JlcXVpcmVkYDpcbiAgICAvLyB0aGUgZ2F0ZSBpcyBPRkYgYnkgZGVmYXVsdCAoUkVRLTAwMDYgKkRpc3Bvc2l0aW9uKjogXCJCb3RoIGdhdGVzIG11c3QgYmVcbiAgICAvLyBjb25maWd1cmFibGUgXHUyMDE0IG9mZiBieSBkZWZhdWx0XCIpLiBObyBkZWFsIGlzIGJvcm4gYHBlbmRpbmdgLCB0aGUgZmxvdydzXG4gICAgLy8gc3RhcnQgY29uZGl0aW9uIGFuZCB0aGUgYG9wcG9ydHVuaXR5X2xpZmVjeWNsZWAgcmVmdXNhbCBhcmUgZmFsc2UgZm9yXG4gICAgLy8gZXZlcnkgcmVjb3JkIHRoYXQgaGFzIGV2ZXIgZXhpc3RlZCwgYW5kIGEgc3RhZ2UgbW92ZSwgV2lsbCBCaWQgYW5kIGFcbiAgICAvLyBkaXJlY3QgY2xvc2Ugd29yayBleGFjdGx5IGFzIHRoZXkgZG8gd2l0aG91dCBpdC4gQW4gaW5zdGFsbCBBUk1TIHRoZSBnYXRlXG4gICAgLy8gYnkgY2hhbmdpbmcgdGhpcyBvbmUgdmFsdWUgdG8gYCdwZW5kaW5nJ2A7IGRlYWxzIHRoYXQgYWxyZWFkeSBleGlzdCBrZWVwXG4gICAgLy8gYG5vdF9yZXF1aXJlZGAsIHNvIGFybWluZyBpdCBpbnZhbGlkYXRlcyBubyByZWNvcmQuIFx1MjZENCBOb3QgdGhlIGZsb3cnc1xuICAgIC8vIGBzdGF0dXNgIFx1MjAxNCBgbGVhZC1jb252ZXJzaW9uLWFwcHJvdmFsLmZsb3cudHNgIHJlY29yZHMgd2h5LlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIEl0cyBPV04gY29sdW1uIFx1MjAxNCBcdTI2RDQgbmV2ZXIgYGFwcHJvdmFsX3N0YXR1c2AgKHRoZSBhbW91bnQtdGllcmVkXG4gICAgLy8gZmxvdydzOyBpdHMgZW50cnkga2V5cyBvbiBgbm90X3JlcXVpcmVkYCwgc28gc2hhcmluZyB3b3VsZCByZS1hcm0gaXQpIGFuZFxuICAgIC8vIFx1MjZENCBuZXZlciBgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXNgIChvbmUgZ2F0ZSdzIHZlcmRpY3Qgd291bGQgZXJhc2VcbiAgICAvLyB0aGUgb3RoZXIncywgYW5kIHRoZSBzdGVwLTE0IGhvb2sgcmVhZHMgdGhhdCBjb2x1bW4gaW5wdXQtZmlyc3QpLlxuICAgIC8vXG4gICAgLy8gYHJlYWRvbmx5OiB0cnVlYCBvbiB0aGUgIzE2NjYgZ3JvdW5kczogdGhlIG9ubHkgd3JpdGVycyBhcmUgdGhlIGdhdGUnc1xuICAgIC8vIG93biBgcnVuQXM6ICdzeXN0ZW0nYCBmbG93IGFuZCB0aGUgaW5zZXJ0IGRlZmF1bHQsIGFuZCBib3RoIHN1cnZpdmUgdGhlXG4gICAgLy8gcmVhZG9ubHkgc3RyaXAuIEEgdXNlci1zdXBwbGllZCB2ZXJkaWN0IGlzIHN0cmlwcGVkIEJFRk9SRSB0aGVcbiAgICAvLyBgYmVmb3JlVXBkYXRlYCBob29rcyBydW4gXHUyMDE0IG1lYXN1cmVkIG9uIDE3LjYuMCB3aXRoIGEgcmVhbCBPYmplY3RRTDogYVxuICAgIC8vIHVzZXIgdXBkYXRlIG9mIGB7IHN0YWdlLCBxdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1czogJ2FwcHJvdmVkJyB9YFxuICAgIC8vIHJlYWNoZWQgdGhlIGhvb2tzIGFzIGB7IGlkLCBzdGFnZSB9YCBhbmQgd2FzIHJlZnVzZWQgNDA5IFx1MjAxNCBzbyB0aGVcbiAgICAvLyBpbnB1dC1maXJzdCByZWFkIGluIGBvcHBvcnR1bml0eV9saWZlY3ljbGVgIGNhbm5vdCBiZSBmZWQgYW4gYGFwcHJvdmVkYFxuICAgIC8vIGJ5IGhhbmQuXG4gICAgcXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXM6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ1F1YWxpZmljYXRpb24gQXBwcm92YWwnLFxuICAgICAgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgZGVmYXVsdFZhbHVlOiAnbm90X3JlcXVpcmVkJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ05vdCBSZXF1aXJlZCcsIHZhbHVlOiAnbm90X3JlcXVpcmVkJywgZGVmYXVsdDogdHJ1ZSB9LFxuICAgICAgICB7IGxhYmVsOiAnUGVuZGluZycsIHZhbHVlOiAncGVuZGluZycsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0FwcHJvdmVkJywgdmFsdWU6ICdhcHByb3ZlZCcsIGNvbG9yOiAnIzAwQUEwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1JlamVjdGVkJywgdmFsdWU6ICdyZWplY3RlZCcsIGNvbG9yOiAnI0ZGMDAwMCcgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICAvLyBTYWxlcyBQcm9jZXNzXG4gICAgc3RhZ2U6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ1N0YWdlJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBncm91cDogJ3NhbGVzX3Byb2Nlc3MnLFxuICAgICAgLy8gQURSLTAwNTIgXHUwMEE3NWIuMSBcdTIwMTQgdGhlIHBsYXRmb3JtIGF1dG8tcmVuZGVycyBlYWNoIHN0YWdlIGNoYW5nZSBvbiB0aGVcbiAgICAgIC8vIGFjdGl2aXR5IHRpbWVsaW5lIGFzIFwiU3RhZ2U6IFByb3Bvc2FsIFx1MjE5MiBOZWdvdGlhdGlvblwiIChubyBob29rIGNvZGUpLlxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgICAgLy8gQ2Fub25pY2FsIHNldCAoIzQ5MCkgXHUyMDE0IHRoZSBtYXNzX3VwZGF0ZV9zdGFnZSBhY3Rpb24gcmVuZGVycyB0aGUgc2FtZVxuICAgICAgLy8gbGlzdDsgc2VlIF9waWNrbGlzdHMudHMuXG4gICAgICBvcHRpb25zOiBbLi4uT1BQT1JUVU5JVFlfU1RBR0VfT1BUSU9OU10sXG4gICAgfSksXG5cbiAgICBwcm9iYWJpbGl0eTogRmllbGQucGVyY2VudCh7XG4gICAgICBsYWJlbDogJ1Byb2JhYmlsaXR5ICglKScsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEwMCxcbiAgICAgIGRlZmF1bHRWYWx1ZTogMTAsXG4gICAgICBncm91cDogJ3NhbGVzX3Byb2Nlc3MnLFxuICAgIH0pLFxuXG4gICAgLy8gSW1wb3J0YW50IERhdGVzXG4gICAgY2xvc2VfZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBsYWJlbDogJ0Nsb3NlIERhdGUnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGdyb3VwOiAnc2FsZXNfcHJvY2VzcycsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBOTyBgY3JlYXRlZF9kYXRlYCBoZXJlOiB0aGUgcGxhdGZvcm0gYWxyZWFkeSBpbmplY3RzIGBjcmVhdGVkX2F0YCBvblxuICAgIC8vIGV2ZXJ5IG9iamVjdCwgYW5kIHRoaXMgZHVwbGljYXRlIGhhZCBubyB3cml0ZXIgYXQgYWxsIFx1MjAxNCBub3QgdGhlIHNlZWRcbiAgICAvLyBkYXRhLCBub3QgYSBob29rLCBub3QgYSBmbG93IFx1MjAxNCBzbyBpdCB3YXMgcGVybWFuZW50bHkgbnVsbCB3aGlsZVxuICAgIC8vIGBjcmVhdGVkX2F0YCBjYXJyaWVkIHRoZSByZWFsIHZhbHVlICgjNTc1IEIyKS4gU3VyZmFjZXMgdGhhdCBuZWVkIHRoZVxuICAgIC8vIGNyZWF0aW9uIGluc3RhbnQgcmVhZCBgY3JlYXRlZF9hdGAgKHNlZSB0aGUgZGVhbF90aW1lbGluZSB2aWV3KS5cbiAgICAvL1xuICAgIC8vIFN0YWdlLWFnZSBjbG9jayAoIzQ4OSkuIFRoaXMgaXMgdGhlIFNUT1JFRCBoYWxmIG9mIHRoZSBwYWlyOiBhIHJlYWwsXG4gICAgLy8gaW5kZXhlZCBkYXRlIGNvbHVtbiwgc28gaXQgaXMgd2hhdCBhdXRvbWF0aW9uIGFuZCB2aWV3cyBtYXkgZmlsdGVyIGFuZFxuICAgIC8vIHNvcnQgb24uIGBkYXlzX2luX3N0YWdlYCBiZWxvdyBpcyBhIGZvcm11bGEgZGVyaXZlZCBmcm9tIGl0LlxuICAgIC8vIGBvcHBvcnR1bml0eV9saWZlY3ljbGVgIHN0YW1wcyBpdCBvbiBpbnNlcnQgYW5kIHJlLXN0YW1wcyBpdCBvbiBldmVyeVxuICAgIC8vIHN0YWdlIGNoYW5nZTsgcmVhZG9ubHkgYmVjYXVzZSBub3RoaW5nIGJ1dCB0aGF0IGhvb2sgc2hvdWxkIG1vdmUgaXRcbiAgICAvLyAoYmVmb3JlLWhvb2sgd3JpdGVzIHN1cnZpdmUgcmVhZG9ubHkgc3RyaXBwaW5nIFx1MjAxNCBvbmx5IGNhbGxlci1zdXBwbGllZFxuICAgIC8vIGtleXMgYXJlIGRyb3BwZWQpLlxuICAgIHN0YWdlX2VudHJ5X2RhdGU6IEZpZWxkLmRhdGUoe1xuICAgICAgbGFiZWw6ICdTdGFnZSBFbnRyeSBEYXRlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGF0ZSB0aGlzIG9wcG9ydHVuaXR5IGVudGVyZWQgaXRzIGN1cnJlbnQgc3RhZ2UuJyxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgZ3JvdXA6ICdzYWxlc19wcm9jZXNzJyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBUaGUgY3VzdG9tZXIncyBvd24gcHJvY3VyZW1lbnQgY2FsZW5kYXIgKFJFUS0wMDA2IHN0ZXAgOCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgTmV2ZXIgZm9sZGVkIGludG8gYGNsb3NlX2RhdGVgOiB0aGF0IGlzIGEgc2luZ2xlIGRhdGUgYW5kIGl0IGlzIE9VUlxuICAgIC8vIGV4cGVjdGVkIGNsb3NlLiBUaGVzZSBhcmUgdGhyZWUgZGlzdGluY3QgQlVZRVItc2lkZSBldmVudHMsIGFuZFxuICAgIC8vIFJFUS0wMDA2IGFjY2VwdGFuY2UgMiByZXF1aXJlcyB0aGVtIHRvIGJlIHJlcG9ydGFibGUgaW5kZXBlbmRlbnRseSBvZlxuICAgIC8vIHRoZSBmb3JlY2FzdCBjbG9zZSBkYXRlIFx1MjAxNCBzZWUgdGhlIGB0ZW5kZXJfdGhpc19xdWFydGVyYCBsaXN0IHZpZXcsXG4gICAgLy8gd2hpY2ggcHJlZGljYXRlcyBvbiBgZXhwZWN0ZWRfdGVuZGVyX2RhdGVgIGFsb25lLlxuICAgIGN1c3RvbWVyX2luaXRpYXRpb25fZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBsYWJlbDogJ0N1c3RvbWVyIEluaXRpYXRpb24gRGF0ZScsXG4gICAgICBncm91cDogJ3NhbGVzX3Byb2Nlc3MnLFxuICAgIH0pLFxuXG4gICAgZXhwZWN0ZWRfdGVuZGVyX2RhdGU6IEZpZWxkLmRhdGUoe1xuICAgICAgbGFiZWw6ICdFeHBlY3RlZCBUZW5kZXIgRGF0ZScsXG4gICAgICBncm91cDogJ3NhbGVzX3Byb2Nlc3MnLFxuICAgIH0pLFxuXG4gICAgZXhwZWN0ZWRfc2lnbmluZ19kYXRlOiBGaWVsZC5kYXRlKHtcbiAgICAgIGxhYmVsOiAnRXhwZWN0ZWQgU2lnbmluZyBEYXRlJyxcbiAgICAgIGdyb3VwOiAnc2FsZXNfcHJvY2VzcycsXG4gICAgfSksXG5cbiAgICBleHBlY3RlZF90ZW5kZXJfYW1vdW50OiBGaWVsZC5jdXJyZW5jeSh7XG4gICAgICBsYWJlbDogJ0V4cGVjdGVkIFRlbmRlciBBbW91bnQnLFxuICAgICAgbWluOiAwLFxuICAgICAgZ3JvdXA6ICdzYWxlc19wcm9jZXNzJyxcbiAgICB9KSxcblxuICAgIGV4cGVjdGVkX3NpZ25pbmdfYW1vdW50OiBGaWVsZC5jdXJyZW5jeSh7XG4gICAgICBsYWJlbDogJ0V4cGVjdGVkIFNpZ25pbmcgQW1vdW50JyxcbiAgICAgIG1pbjogMCxcbiAgICAgIGdyb3VwOiAnc2FsZXNfcHJvY2VzcycsXG4gICAgfSksXG5cbiAgICAvLyBBZGRpdGlvbmFsIENsYXNzaWZpY2F0aW9uXG4gICAgdHlwZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnT3Bwb3J0dW5pdHkgVHlwZScsXG4gICAgICBncm91cDogJ2NsYXNzaWZpY2F0aW9uJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ05ldyBCdXNpbmVzcycsIHZhbHVlOiAnbmV3X2J1c2luZXNzJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRXhpc3RpbmcgQ3VzdG9tZXIgLSBVcGdyYWRlJywgdmFsdWU6ICdleGlzdGluZ191cGdyYWRlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRXhpc3RpbmcgQ3VzdG9tZXIgLSBSZW5ld2FsJywgdmFsdWU6ICdleGlzdGluZ19yZW5ld2FsJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRXhpc3RpbmcgQ3VzdG9tZXIgLSBFeHBhbnNpb24nLCB2YWx1ZTogJ2V4aXN0aW5nX2V4cGFuc2lvbicgfSxcbiAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFx1MjZENCBCRVNJREUgYHR5cGVgLCBuZXZlciByZXBsYWNpbmcgb3Igb3ZlcmxvYWRpbmcgaXQ6IGB0eXBlYCdzIGZvdXJcbiAgICAvLyB2YWx1ZXMgYXJlIGEgUkVMQVRJT05TSElQIHRheG9ub215IHRoYXQgYG9wcG9ydHVuaXR5Lmhvb2sudHNgIGFuZFxuICAgIC8vIHJlcG9ydGluZyByZWFkLiBHZW5lcmljIGRlbGl2ZXJ5LW1vZGVsIHZhbHVlcyBvbmx5IFx1MjAxNCB0aGUgY3VzdG9tZXIncyBvd25cbiAgICAvLyBsaW5lLW9mLWJ1c2luZXNzIGxpc3QgaXMgb3ZlcmxheSAoUkVRLTAwMDYgYWNjZXB0YW5jZSA1KS5cbiAgICBidXNpbmVzc19saW5lOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdCdXNpbmVzcyBMaW5lJyxcbiAgICAgIGdyb3VwOiAnY2xhc3NpZmljYXRpb24nLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnUHJvZHVjdCcsIHZhbHVlOiAncHJvZHVjdCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1Byb2Zlc3Npb25hbCBTZXJ2aWNlcycsIHZhbHVlOiAnc2VydmljZXMnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDb25zdWx0aW5nJywgdmFsdWU6ICdjb25zdWx0aW5nJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU3VwcG9ydCAmIE1haW50ZW5hbmNlJywgdmFsdWU6ICdzdXBwb3J0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnT3RoZXInLCB2YWx1ZTogJ290aGVyJyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIGxlYWRfc291cmNlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdMZWFkIFNvdXJjZScsXG4gICAgICBncm91cDogJ2NsYXNzaWZpY2F0aW9uJyxcbiAgICAgIC8vIENhbm9uaWNhbCBzZXQgc2hhcmVkIHdpdGggTGVhZCArIENvbnRhY3QgKCM0OTApOiBsZWFkX2NvbnZlcnNpb25cbiAgICAgIC8vIGNvcGllcyBgbGVhZFJlY29yZC5sZWFkX3NvdXJjZWAgb250byB0aGUgb3Bwb3J0dW5pdHkgaXQgY3JlYXRlcywgc29cbiAgICAgIC8vIHRoaXMgbXVzdCBhY2NlcHQgZXZlcnkgTGVhZCB2YWx1ZS5cbiAgICAgIG9wdGlvbnM6IFsuLi5MRUFEX1NPVVJDRV9PUFRJT05TXSxcbiAgICB9KSxcblxuXG4gICAgLy8gQ2FtcGFpZ24gdHJhY2tpbmdcbiAgICBjcm1fY2FtcGFpZ246IEZpZWxkLmxvb2t1cCgnY3JtX2NhbXBhaWduJywge1xuICAgICAgbGFiZWw6ICdDYW1wYWlnbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ01hcmtldGluZyBjYW1wYWlnbiB0aGF0IGdlbmVyYXRlZCB0aGlzIG9wcG9ydHVuaXR5JyxcbiAgICAgIGdyb3VwOiAnY2FtcGFpZ24nLFxuICAgIH0pLFxuXG4gICAgLy8gU2FsZXMgY3ljbGUgbWV0cmljc1xuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIEZPUk1VTEEsIG5vdCBhIHN0b3JlZCBjb3VudGVyLiBBcyBhIHBsYWluIG51bWJlciBjb2x1bW4gbm90aGluZyBldmVyXG4gICAgLy8gcmFpc2VzIGl0OiB0aGUgaG9vayByZXNldHMgaXQgdG8gMCBvbiBhIHN0YWdlIGNoYW5nZSBhbmQgbm8gc3dlZXBcbiAgICAvLyBpbmNyZW1lbnRzIGl0LCBzbyBgZGF5c19pbl9zdGFnZSA+IDE0YCBtYXRjaGVzIG9ubHkgcm93cyBhIHNlZWQgaGFyZGNvZGVkXG4gICAgLy8gYW5kIHRoZSBgb3Bwb3J0dW5pdHlfc3RhZ25hdGlvbmAgZmxvdyBuZXZlciBmaXJlcyBvbiByZWFsIGRhdGEuIERlcml2aW5nXG4gICAgLy8gaXQgZnJvbSBgc3RhZ2VfZW50cnlfZGF0ZWAgaXMgY29ycmVjdCBvbiBldmVyeSByZWFkIGFuZCBjb3N0cyBubyBuaWdodGx5XG4gICAgLy8gZnVsbC10YWJsZSBwYXNzLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoZSB0cmFkZS1vZmY6IGZvcm11bGFzIGFyZSBldmFsdWF0ZWQgQUZURVIgdGhlIHF1ZXJ5ICh0aGUgZW5naW5lJ3NcbiAgICAvLyBgYXBwbHlGb3JtdWxhUGxhbmAgd2Fsa3MgdGhlIHJldHVybmVkIHJvd3MpLCBzbyB0aGlzIGlzIG5vdCBhIHJlYWwgY29sdW1uXG4gICAgLy8gYW5kIENBTk5PVCBhcHBlYXIgaW4gYSBmaWx0ZXIgb3IgYSBzb3J0LiBBbnl0aGluZyB0aGF0IG5lZWRzIHRvICpzZWxlY3QqXG4gICAgLy8gc3RhbGxlZCBkZWFscyBwcmVkaWNhdGVzIG9uIGBzdGFnZV9lbnRyeV9kYXRlYCBpbnN0ZWFkIFx1MjAxNCBzZWVcbiAgICAvLyBgb3Bwb3J0dW5pdHktc3RhZ25hdGlvbi5mbG93LnRzYCBhbmQgdGhlIGBzdGFsZV9vcHBvcnR1bml0aWVzYCB2aWV3LlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIGBoYXMoKWAgKyBudWxsIGd1YXJkOiBgZGF5c0JldHdlZW4obnVsbCwgXHUyMDI2KWAgZmF1bHRzIGFuZCB0aGUgd2hvbGUgZmllbGRcbiAgICAvLyBzaWxlbnRseSBldmFsdWF0ZXMgdG8gbnVsbCwgc28gYW4gdW5zdGFtcGVkIHJvdyBpcyBzcGVsbGVkIG91dCBhcyBudWxsXG4gICAgLy8gcmF0aGVyIHRoYW4gYXJyaXZpbmcgdGhlcmUgYnkgYWNjaWRlbnQuXG4gICAgZGF5c19pbl9zdGFnZTogRmllbGQuZm9ybXVsYSh7XG4gICAgICBsYWJlbDogJ0RheXMgaW4gQ3VycmVudCBTdGFnZScsXG4gICAgICBleHByZXNzaW9uOiBGYGhhcyhyZWNvcmQuc3RhZ2VfZW50cnlfZGF0ZSkgJiYgcmVjb3JkLnN0YWdlX2VudHJ5X2RhdGUgIT0gbnVsbCA/IGRheXNCZXR3ZWVuKHJlY29yZC5zdGFnZV9lbnRyeV9kYXRlLCB0b2RheSgpKSA6IG51bGxgLFxuICAgICAgcmV0dXJuVHlwZTogJ251bWJlcicsXG4gICAgICBncm91cDogJ2NybV9mb3JlY2FzdCcsXG4gICAgfSksXG5cbiAgICAvLyBBZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gICAgZGVzY3JpcHRpb246IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGxhYmVsOiAnRGVzY3JpcHRpb24nLFxuICAgICAgZ3JvdXA6ICdub3RlcycsXG4gICAgfSksXG5cbiAgICBuZXh0X3N0ZXA6IEZpZWxkLnRleHRhcmVhKHtcbiAgICAgIGxhYmVsOiAnTmV4dCBTdGVwcycsXG4gICAgICBncm91cDogJ25vdGVzJyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBEZWFsIG5hcnJhdGl2ZSAoUkVRLTAwMDYgc3RlcCAxMCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBUaGUgc3RhbmRhcmQgZGVhbC1yZXZpZXcgbmFycmF0aXZlLCBzcGxpdCBvdXQgb2YgYGRlc2NyaXB0aW9uYCBzbyBlYWNoXG4gICAgLy8gcGFydCBpcyByZXZpZXdhYmxlLCB0ZW1wbGF0YWJsZSBhbmQgKGxhdGVyKSByZXBvcnRhYmxlIG9uIGl0cyBvd24gXHUyMDE0XG4gICAgLy8gXHUyNkQ0IG5vdCBtb3JlIHByb3NlIGNyYW1tZWQgaW50byBvbmUgbWFya2Rvd24gZmllbGQuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgYHBheW1lbnRfdGVybXNgIGlzIFBST1NFIGhlcmUgYW5kIGEgc2VsZWN0IG9uIGBjcm1fcXVvdGVgIC9cbiAgICAvLyBgY3JtX2NvbnRyYWN0YDogd2hhdCBhIHJlcCByZWNvcmRzIG1pZC1wdXJzdWl0IGlzIHRoZSBzaGFwZSBvZiBhIHRlcm1cbiAgICAvLyBzdGlsbCBiZWluZyBuZWdvdGlhdGVkLCBub3QgdGhlIG5ldC10ZXJtcyBsYWRkZXIgYSBzaWduZWQgZG9jdW1lbnRcbiAgICAvLyBjYXJyaWVzLiBcdTI2RDQgRG8gbm90IFwidW5pZnlcIiBpdCBvbnRvIFBBWU1FTlRfVEVSTVNfT1BUSU9OUyBcdTIwMTQgdGhhdCB3b3VsZFxuICAgIC8vIGZvcmNlIGEgaGFsZi1hZ3JlZWQgdGVybSBpbnRvIGEgY2xvc2VkIHZvY2FidWxhcnkuXG4gICAgLy9cbiAgICAvLyBBbGwgZm91ciBhcmUgYEZpZWxkLnRleHRhcmVhYCAoUkVRLTAwMDYgbmFtZXMgbWFya2Rvd24gT1IgdGV4dGFyZWEgcGVyXG4gICAgLy8gZmllbGQpLiBNZWFzdXJlZCBvbiB0aGUgMTcuNi4wIGNvbnNvbGUsIHRoZSBEZXRhaWxzIHRhYidzIGVkaXQgbW9kZSBcdTIwMTRcbiAgICAvLyB0aGUgc3VyZmFjZSB0aGVzZSBmaWVsZHMgcmVuZGVyIG9uIFx1MjAxNCBoYXMgbm8gbWFya2Rvd24gZWRpdG9yLCBzbyBhXG4gICAgLy8gbWFya2Rvd24gZmllbGQgaGVyZSBjb3VsZCBiZSByZWFkIGJ1dCBuZXZlciB3cml0dGVuLiBUaGUgbWFpbnRhaW5lclxuICAgIC8vIHJ1bGVkIHRleHRhcmVhIGZvciB0aGUgdGhyZWUgdGhhdCB3ZXJlIG1hcmtkb3duICgyMDI2LTEwLTAzLCBvbiAjMTk1MDpcbiAgICAvLyBcdTMwMENcdTY1MzlcdTYyMTAgdGV4dGFyZWEoXHU2M0E4XHU4MzUwKVx1MzAwRCkuXG4gICAgY3VzdG9tZXJfYmFja2dyb3VuZDogRmllbGQudGV4dGFyZWEoe1xuICAgICAgbGFiZWw6ICdDdXN0b21lciBCYWNrZ3JvdW5kJyxcbiAgICAgIGdyb3VwOiAnbmFycmF0aXZlJyxcbiAgICB9KSxcblxuICAgIHByb2plY3RfYmFja2dyb3VuZDogRmllbGQudGV4dGFyZWEoe1xuICAgICAgbGFiZWw6ICdQcm9qZWN0IEJhY2tncm91bmQnLFxuICAgICAgZ3JvdXA6ICduYXJyYXRpdmUnLFxuICAgIH0pLFxuXG4gICAgcmlza19hbmFseXNpczogRmllbGQudGV4dGFyZWEoe1xuICAgICAgbGFiZWw6ICdSaXNrIEFuYWx5c2lzJyxcbiAgICAgIGdyb3VwOiAnbmFycmF0aXZlJyxcbiAgICB9KSxcblxuICAgIHBheW1lbnRfdGVybXM6IEZpZWxkLnRleHRhcmVhKHtcbiAgICAgIGxhYmVsOiAnUGF5bWVudCBUZXJtcycsXG4gICAgICBncm91cDogJ25hcnJhdGl2ZScsXG4gICAgfSksXG5cbiAgICAvLyBGbGFnc1xuICAgIGlzX3ByaXZhdGU6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdQcml2YXRlJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBncm91cDogJ2NybV9mb3JlY2FzdCcsXG4gICAgfSksXG5cbiAgICBmb3JlY2FzdF9jYXRlZ29yeTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnRm9yZWNhc3QgQ2F0ZWdvcnknLFxuICAgICAgZ3JvdXA6ICdjcm1fZm9yZWNhc3QnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnUGlwZWxpbmUnLCB2YWx1ZTogJ3BpcGVsaW5lJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQmVzdCBDYXNlJywgdmFsdWU6ICdiZXN0X2Nhc2UnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDb21taXQnLCB2YWx1ZTogJ2NvbW1pdCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ09taXR0ZWQnLCB2YWx1ZTogJ29taXR0ZWQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDbG9zZWQnLCB2YWx1ZTogJ2Nsb3NlZCcgfSxcbiAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEFwcHJvdmFsIHdvcmtmbG93IHRyYWNraW5nLlxuICAgIC8vIFx1MkI1MCBgcmVhZG9ubHk6IHRydWVgIFx1MjAxNCBERUNMQVJFRCwgYW5kIHRoZSBkZWNsYXJhdGlvbiBpcyB0aGUgaG9uZXN0IG9uZVxuICAgIC8vIHJhdGhlciB0aGFuIGEgaG9wZWZ1bCBvbmUuIEF1ZGl0ZWQgcGVyIHdyaXRlciAoIzE2NjYpOiBldmVyeSB3cml0ZXIgb2ZcbiAgICAvLyB0aGlzIGNvbHVtbiBhbmQgb2YgYGFwcHJvdmVkX2RhdGVgIGlzIGVsZXZhdGVkIG9yIGFuIGluc2VydC5cbiAgICAvLyBgb3Bwb3J0dW5pdHlfYXBwcm92YWxgIGRlY2xhcmVzIGBydW5BczogJ3N5c3RlbSdgLCBhbmRcbiAgICAvLyBgb3Bwb3J0dW5pdHlfYXBwcm92YWxfb25fY3JlYXRlYCBpbmhlcml0cyBpdCBieSBzcHJlYWRpbmcgdGhhdCBmbG93LCBzb1xuICAgIC8vIGByZXNvbHZlUnVuRGF0YUNvbnRleHRgIGhhbmRzIHRoZSBlbmdpbmUgYGlzU3lzdGVtOiB0cnVlYCBhbmQgdGhlXG4gICAgLy8gYGlmICghb3BDdHguY29udGV4dD8uaXNTeXN0ZW0pYCBzdHJpcCBicmFuY2ggaXMgc2tpcHBlZCBvdXRyaWdodDsgdGhlXG4gICAgLy8gYGFwcHJvdmFsYCBub2RlJ3Mgb3duIGBhcHByb3ZhbFN0YXR1c0ZpZWxkYCB3cml0ZSBydW5zIGluc2lkZSB0aG9zZSBzYW1lXG4gICAgLy8gc3lzdGVtIHJ1bnM7IHNlZWRzIHdyaXRlIG9uIElOU0VSVCwgd2hpY2ggdGhlIHN0cmlwIG5ldmVyIHRvdWNoZXMuIE5vXG4gICAgLy8gdmlldywgcGFnZSBvciBhY3Rpb24gd3JpdGVzIGVpdGhlciBjb2x1bW4uIFx1MjFEMiBObyB3cml0ZXIgbG9zZXMgaXRzIHdyaXRlLlxuICAgIC8vIFJ1bGVkICMxNjY2IChkaXJlY3RvciBzZWF0LCBkZWNpc2lvbiBiYXRjaCAjNzQsIDIwMjYtMDktMDcpOiBcIkRlY2xhcmVkID1cbiAgICAvLyBlbmZvcmNlZFwiIGFwcGxpZXMgdG8gdGhlIGF1ZGl0IHN1cmZhY2UgdG9vLiBcdTI2RDQgVGhlIGhhbmQtZWRpdCBlc2NhcGUgaGF0Y2hcbiAgICAvLyBcdTIwMTQgYW4gYWRtaW4gY2xlYXJpbmcgYSBzdHVjayBhcHByb3ZhbCBieSB0eXBpbmcgb3ZlciB0aGUgc3RhbXAgXHUyMDE0IGlzIGdpdmVuXG4gICAgLy8gdXAgT04gUFVSUE9TRTogYSBzdHVjayBhcHByb3ZhbCBpcyBhIHBsYXRmb3JtIG9yIGZsb3cgZGVmZWN0IHRvIGJlIGZpeGVkXG4gICAgLy8gYXMgb25lLCBub3QgYSByZWFzb24gdG8ga2VlcCBhbiBhdWRpdCBzdGFtcCBoYW5kLWVkaXRhYmxlLiBcdTI2RDQgRG8gbm90XG4gICAgLy8gcmVpbnRyb2R1Y2UgYSBieXBhc3MsIGFuZCBkbyBub3Qgc29mdGVuIGVpdGhlciBjb2x1bW4gYmFjayB0byBlZGl0YWJsZVxuICAgIC8vIHdpdGhvdXQgYSBuZXcgcnVsaW5nLiBCb3RoIGhhbHZlcyBhcmUgcGlubmVkIGluXG4gICAgLy8gYHRlc3QvYXVkaXQtc3RhbXAtcmVhZG9ubHkudGVzdC50c2A6IHRoZSBzeXN0ZW0gcGF0aCBzdGlsbCBsYW5kcyBib3RoXG4gICAgLy8gc3RhbXBzLCBhbmQgYSBwbGFpbiB1c2VyLWNvbnRleHQgVVBEQVRFIG9mIGVpdGhlciBpcyBzdHJpcHBlZC5cbiAgICAvLyBcdTI2QTBcdUZFMEYgYGRlZmF1bHRWYWx1ZWAgYXQgRklFTEQgbGV2ZWw6IG9wdGlvbi1sZXZlbCBgZGVmYXVsdDogdHJ1ZWBcbiAgICAvLyBvbmx5IHByZXNlbGVjdHMgaW4gVUkgZm9ybXMgXHUyMDE0IEFQSSBhbmQgZmxvdyBpbnNlcnRzIGxhbmQgbnVsbCB3aXRob3V0IGl0LFxuICAgIC8vIGFuZCBhIG51bGwgYGFwcHJvdmFsX3N0YXR1c2AgbmV2ZXIgbWF0Y2hlcyB0aGUgZmxvdydzIGVudHJ5IGNvbmRpdGlvbi5cbiAgICBhcHByb3ZhbF9zdGF0dXM6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ0FwcHJvdmFsIFN0YXR1cycsXG4gICAgICBncm91cDogJ3NhbGVzX3Byb2Nlc3MnLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBkZWZhdWx0VmFsdWU6ICdub3RfcmVxdWlyZWQnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnTm90IFJlcXVpcmVkJywgdmFsdWU6ICdub3RfcmVxdWlyZWQnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQZW5kaW5nJywgdmFsdWU6ICdwZW5kaW5nJywgY29sb3I6ICcjRkZBNTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQXBwcm92ZWQnLCB2YWx1ZTogJ2FwcHJvdmVkJywgY29sb3I6ICcjMDBBQTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUmVqZWN0ZWQnLCB2YWx1ZTogJ3JlamVjdGVkJywgY29sb3I6ICcjRkYwMDAwJyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIGFwcHJvdmVkX2RhdGU6IEZpZWxkLmRhdGV0aW1lKHtcbiAgICAgIGxhYmVsOiAnQXBwcm92ZWQgRGF0ZScsXG4gICAgICBncm91cDogJ3NhbGVzX3Byb2Nlc3MnLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgVGhlIHN0YXR1cy1jaGFuZ2UgZ2F0ZSdzIHN3aXRjaCBBTkQgaXRzIHZlcmRpY3QgY29sdW1uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoaXMgYGRlZmF1bHRWYWx1ZWAgSVMgdGhlIHN3aXRjaCwgYW5kIHNoaXBwZWQgaXQgaXMgYG5vdF9yZXF1aXJlZGAsXG4gICAgLy8gc28gdGhlIGdhdGUgaXMgT0ZGIGJ5IGRlZmF1bHQgXHUyMDE0IFJFUS0wMDA2IGFjY2VwdGFuY2UgMzogXCJ3aXRoIGl0IG9mZlxuICAgIC8vICh0aGUgZGVmYXVsdCksIHRoZSBleGlzdGluZyBhbW91bnQtdGllcmVkIGJlaGF2aW91ciBvZlxuICAgIC8vIGBvcHBvcnR1bml0eS1hcHByb3ZhbC5mbG93LnRzYCBpcyBiaXQtZm9yLWJpdCB3aGF0IGl0IGlzIHRvZGF5XCIuIE5vXG4gICAgLy8gcmVjb3JkIGlzIGV2ZXIgYm9ybiBgcGVuZGluZ2AsIGBvcHBvcnR1bml0eV9zdGF0dXNfY2hhbmdlX2FwcHJvdmFsYCdzXG4gICAgLy8gc3RhcnQgY29uZGl0aW9uIGlzIGZhbHNlIGZvciBldmVyeSByb3cgdGhhdCBoYXMgZXZlciBleGlzdGVkLCBhbmRcbiAgICAvLyBub3RoaW5nIGFib3V0IHRoZSBhbW91bnQtdGllcmVkIGZsb3cgY2hhbmdlcy4gQW4gaW5zdGFsbCBBUk1TIHRoZSBnYXRlXG4gICAgLy8gYnkgY2hhbmdpbmcgdGhpcyBvbmUgdmFsdWUgdG8gYCdwZW5kaW5nJ2AuXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgTm90IHRoZSBmbG93J3MgYHN0YXR1c2AsIGZvciB0aGUgcmVhc29uXG4gICAgLy8gYGxlYWQtY29udmVyc2lvbi1hcHByb3ZhbC5mbG93LnRzYCByZWNvcmRzIGFuZCBtZWFzdXJlZDogYGRyYWZ0YCBzdGlsbFxuICAgIC8vIGZpcmVzIGl0cyB0cmlnZ2VycywgYW5kIGBvYnNvbGV0ZWAgY29tcG9zZXMgd2l0aCB0aGUgaW5zdGFsbGF0aW9uJ3NcbiAgICAvLyBhY3RpdmF0aW9uIGxlZGdlciBpbnRvIGEgZ2F0ZSBubyBpbnN0YWxsIGNhbiBldmVyIHR1cm4gT04uXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgRGVsaWJlcmF0ZWx5IE5PVCBgYXBwcm92YWxfc3RhdHVzYC4gVGhhdCBjb2x1bW4gaXMgdGhlIGFtb3VudC10aWVyZWRcbiAgICAvLyBmbG93J3MsIGFuZCBzaGFyaW5nIGl0IHdvdWxkIG1ha2UgZWl0aGVyIGdhdGUncyB2ZXJkaWN0IGVyYXNlIHRoZVxuICAgIC8vIG90aGVyJ3MgXHUyMDE0IGFuZCByZS10cmlnZ2VyIHRoZSBhbW91bnQgZmxvdywgd2hvc2UgZW50cnkgY29uZGl0aW9uIGtleXMgb25cbiAgICAvLyBgYXBwcm92YWxfc3RhdHVzID09IFwibm90X3JlcXVpcmVkXCJgLlxuICAgIC8vXG4gICAgLy8gYHJlYWRvbmx5OiB0cnVlYCBvbiB0aGUgc2FtZSBhdWRpdGVkIGdyb3VuZHMgYXMgYGFwcHJvdmFsX3N0YXR1c2BcbiAgICAvLyAoIzE2NjYpOiB0aGUgb25seSB3cml0ZXJzIGFyZSB0aGUgZ2F0ZSdzIG93biBgcnVuQXM6ICdzeXN0ZW0nYCBmbG93IGFuZFxuICAgIC8vIHRoZSBpbnNlcnQgZGVmYXVsdCwgYW5kIGJvdGggc3Vydml2ZSB0aGUgcmVhZG9ubHkgc3RyaXAuXG4gICAgLy8gV2hhdCB0aGUgcmVwIGlzIEFTS0lORyBmb3IsIFx1MjZENCBuZXZlciB0aGUgc3RhZ2UgaXRzZWxmOiBSRVEtMDAwNlxuICAgIC8vIGFjY2VwdGFuY2UgMyByZXF1aXJlcyB0aGUgc3RhZ2Ugbm90IHRvIG1vdmUgdW50aWwgdGhlIHJlcXVlc3QgaXNcbiAgICAvLyBkZWNpZGVkLCBhbmQgYSBgcmVjb3JkX2NoYW5nZWAgZmxvdyBiaW5kcyBhbiBBRlRFUiBob29rIFx1MjAxNCBieSB0aGUgdGltZSBpdFxuICAgIC8vIHJ1bnMsIGEgc3RhZ2UgdGhlIHJlcCB3cm90ZSBoYXMgYWxyZWFkeSBtb3ZlZC4gU28gdGhlIHJlcCB3cml0ZXMgdGhlXG4gICAgLy8gcmVxdWVzdCBoZXJlICh3aXRoIHRoZSB3aW4vbG9zcyByZWFzb24pLCBhbmQgdGhlIGFwcHJvdmVkIGRlY2lzaW9uXG4gICAgLy8gd3JpdGVzIGBzdGFnZWAgXHUyMDE0IHRoZSBjdXN0b21lcidzIG93biBzdGVwIDE0LCBcdTMwMENcdTkwMUFcdThGQzdcdTU0MEVcdTU1NDZcdTY3M0FcdTcyQjZcdTYwMDFcdTZCNjNcdTVGMEZcdTc1MUZcdTY1NDhcdTMwMEQuXG4gICAgLy9cbiAgICAvLyBWYWx1ZXMgQVJFIHRoZSB0d28gc3RhZ2UgdmFsdWVzLCBzbyB0aGUgZmxvdydzIGFwcHJvdmUgYnJhbmNoIGNhbiBhcHBseVxuICAgIC8vIGl0IHdpdGggYHN0YWdlOiAne29wcFJlY29yZC5yZXF1ZXN0ZWRfc3RhdHVzfSdgIGFuZCBubyBtYXBwaW5nIHRhYmxlIGNhblxuICAgIC8vIGRyaWZ0LiBOb3QgcmVhZG9ubHk6IHRoaXMgaXMgdGhlIG9uZSBoYWxmIG9mIHRoZSBnYXRlIGEgcGVyc29uIHdyaXRlcy5cbiAgICAvLyBJbmVydCB3aGlsZSB0aGUgZ2F0ZSBpcyBvZmYgXHUyMDE0IG5vdGhpbmcgcmVhZHMgaXQgdW5sZXNzIHRoZSBpbnN0YWxsIGFybXNcbiAgICAvLyBgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXNgLlxuICAgIHJlcXVlc3RlZF9zdGF0dXM6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ1JlcXVlc3RlZCBTdGF0dXMnLFxuICAgICAgZ3JvdXA6ICdzYWxlc19wcm9jZXNzJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ1dvbicsIHZhbHVlOiAnY2xvc2VkX3dvbicgfSxcbiAgICAgICAgeyBsYWJlbDogJ0xvc3QnLCB2YWx1ZTogJ2Nsb3NlZF9sb3N0JyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIHN0YXR1c19jaGFuZ2VfYXBwcm92YWxfc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdTdGF0dXMgQ2hhbmdlIEFwcHJvdmFsJyxcbiAgICAgIGdyb3VwOiAnc2FsZXNfcHJvY2VzcycsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogJ25vdF9yZXF1aXJlZCcsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdOb3QgUmVxdWlyZWQnLCB2YWx1ZTogJ25vdF9yZXF1aXJlZCcsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ1BlbmRpbmcnLCB2YWx1ZTogJ3BlbmRpbmcnLCBjb2xvcjogJyNGRkE1MDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdBcHByb3ZlZCcsIHZhbHVlOiAnYXBwcm92ZWQnLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWplY3RlZCcsIHZhbHVlOiAncmVqZWN0ZWQnLCBjb2xvcjogJyNGRjAwMDAnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFdpbiAvIExvc3MgYW5hbHlzaXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgVGhlIHJlYXNvbiBpcyBjYXB0dXJlZCBBVCBDTE9TRSwgYW5kIHRoYXQgaXMgZW5mb3JjZWQsIG5vdCByZXF1ZXN0ZWQuXG4gICAgLy8gTGVhdmluZyBib3RoIGZpZWxkcyBvcHRpb25hbCBtZWFucyBldmVyeSBzZWVkZWQgYW5kIHVzZXItY2xvc2VkIGRlYWxcbiAgICAvLyBsYW5kcyB3aXRoIHRoZW0gZW1wdHkgYW5kIHRoZSB3aW4vbG9zcyB3aWRnZXRzIGJlbG93IGhhdmUgbm90aGluZyB0byBkcmF3LlxuICAgIC8vXG4gICAgLy8gYHJlcXVpcmVkV2hlbmAsIG5vdCBhIHNjcmlwdCB2YWxpZGF0aW9uLCBmb3IgdGhlIHNhbWUgcmVhc29uXG4gICAgLy8gYGNybV9sZWFkLmR1cGxpY2F0ZV9vZl9sZWFkYCB1c2VzIGl0IChBRFItMDExMyk6IFwidGhpcyBmaWVsZCBtdXN0IGhvbGQgYVxuICAgIC8vIHZhbHVlIHdoZW4gdGhlIHJlY29yZCBsb29rcyBsaWtlIFhcIiBpcyBleGFjdGx5IGEgY29uZGl0aW9uYWwgd3JpdGVcbiAgICAvLyBjb250cmFjdCwgdGhlIGVuZ2luZSBldmFsdWF0ZXMgaXQgb24gaW5zZXJ0IEFORCB1cGRhdGUgaW5zaWRlXG4gICAgLy8gYGV2YWx1YXRlVmFsaWRhdGlvblJ1bGVzYCwgYW5kIGl0IHJlcG9ydHMgYWdhaW5zdCB0aGUgRklFTEQgXHUyMDE0IHNvIHRoZSBmb3JtXG4gICAgLy8gbWFya3MgdGhlIGVtcHR5IHBpY2tsaXN0IGluc3RlYWQgb2Ygc2hvd2luZyBhIHJlY29yZC1sZXZlbCBiYW5uZXIuIEl0IGlzXG4gICAgLy8gQUxTTyB0aGUgb25seSBzaGFwZSB0aGUgZnJlZXplIGJlbG93IGxlYXZlcyB1c2FibGU6IG9uY2UgYSBkZWFsIGlzIGNsb3NlZCxcbiAgICAvLyBgb3Bwb3J0dW5pdHkuaG9vay50c2AgcmVmdXNlcyBldmVyeSB1c2VyIGVkaXQgb3V0c2lkZSB0aGUgbmFycmF0aXZlXG4gICAgLy8gZmllbGRzLCBzbyBhIHJlYXNvbiBub3QgY2FwdHVyZWQgaW4gdGhlIGNsb3Npbmcgd3JpdGUgY2FuIG5ldmVyIGJlIGFkZGVkXG4gICAgLy8gYWZ0ZXJ3YXJkcy4gQ2xvc2UgdGltZSBpcyB0aGUgb25seSBjaGFuY2UuXG4gICAgLy8gYHRlc3Qvd2luLWxvc3MtY2FwdHVyZS50ZXN0LnRzYCBkcml2ZXMgYm90aCBwcmVkaWNhdGVzIHRocm91Z2ggYSByZWFsXG4gICAgLy8gT2JqZWN0UUwgb3ZlciBhIHJlYWwgZHJpdmVyLCBvbiBpbnNlcnQgYW5kIG9uIHVwZGF0ZS5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBgaGFzKC4uLilgIGlzIGxvYWQtYmVhcmluZy4gQSBiYXJlIGByZWNvcmQuc3RhZ2UgPT0gXCJjbG9zZWRfbG9zdFwiYFxuICAgIC8vIGFib3J0cyB3aXRoIGBObyBzdWNoIGtleWAgb24gYW55IG1lcmdlZCByZWNvcmQgdGhhdCBvbWl0cyB0aGUgY29sdW1uLCBhbmRcbiAgICAvLyB0aGUgZW5naW5lJ3MgYW5zd2VyIHRvIGEgcHJlZGljYXRlIHRoYXQgY2Fubm90IGV2YWx1YXRlIGlzIHRvIFNLSVAgaXRcbiAgICAvLyAoXCJyZXF1aXJlZFdoZW4gZm9yICdsb3NzX3JlYXNvbicgZmFpbGVkIHRvIGV2YWx1YXRlIFx1MjAxNCBza2lwcGVkXCIpLCB3aGljaFxuICAgIC8vIHdvdWxkIG1ha2UgdGhpcyByZWFkIGFzIGVuZm9yY2VkIHdoaWxlIHJlcXVpcmluZyBub3RoaW5nIGF0IGFsbC5cbiAgICB3aW5fcmVhc29uOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdXaW4gUmVhc29uJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnV2h5IHRoaXMgZGVhbCB3YXMgd29uLiBSZXF1aXJlZCB0byBjbG9zZSBhbiBvcHBvcnR1bml0eSBhcyBXb24uJyxcbiAgICAgIGdyb3VwOiAnY2xhc3NpZmljYXRpb24nLFxuICAgICAgcmVxdWlyZWRXaGVuOiBQYGhhcyhyZWNvcmQuc3RhZ2UpICYmIHJlY29yZC5zdGFnZSA9PSBcImNsb3NlZF93b25cImAsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdCZXR0ZXIgUHJvZHVjdCcsIHZhbHVlOiAnYmV0dGVyX3Byb2R1Y3QnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdCZXR0ZXIgUHJpY2UnLCB2YWx1ZTogJ2JldHRlcl9wcmljZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0V4aXN0aW5nIFJlbGF0aW9uc2hpcCcsIHZhbHVlOiAncmVsYXRpb25zaGlwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQmV0dGVyIFN1cHBvcnQnLCB2YWx1ZTogJ2JldHRlcl9zdXBwb3J0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnQmVzdCBGaXQgLyBGZWF0dXJlcycsIHZhbHVlOiAnYmVzdF9maXQnIH0sXG4gICAgICAgIC8vIFdyaXR0ZW4gYnkgdGhlIG1hY2hpbmUsIG5vdCBjaG9zZW4gYnkgYSByZXA6IGBxdW90ZV9vbl9hY2NlcHRlZGBcbiAgICAgICAgLy8gKHF1b3RlLmhvb2sudHMpIHdpbnMgdGhlIGRlYWwgdGhlIG1vbWVudCBhIGN1c3RvbWVyIGFjY2VwdHMgdGhlXG4gICAgICAgIC8vIHF1b3RlLCBhbmQgbm8gaHVtYW4gaXMgaW4gdGhhdCB3cml0ZSB0byBhdHRyaWJ1dGUgaXQuIE5hbWluZyB0aGVcbiAgICAgICAgLy8gYXV0b21hdGVkIHBhdGggaXMgdGhpcyByZXBvJ3MgZXhpc3RpbmcgaWRpb20gZm9yIGV4YWN0bHkgdGhhdCBzcGxpdFxuICAgICAgICAvLyAoYGNybV9sZWFkLmR1cGxpY2F0ZV9zdGF0dXNgID0gbWFjaGluZSBgc3VzcGVjdGVkYCB2cyBodW1hblxuICAgICAgICAvLyBgY29uZmlybWVkYCkgYW5kIGl0IGtlZXBzIHRoZSBydWxlIGV4Y2VwdGlvbi1mcmVlOiBldmVyeSBjbG9zZWRfd29uXG4gICAgICAgIC8vIHJvdyBjYXJyaWVzIGEgcmVhc29uLCBhbmQgYW4gYW5hbHlzdCBjYW4gc3RpbGwgdGVsbCBhIENQUSBjbG9zZSBmcm9tXG4gICAgICAgIC8vIGEgcmVwJ3MgYXR0cmlidXRpb24gaW5zdGVhZCBvZiByZWFkaW5nIGEgZmFicmljYXRlZCBcIkJldHRlciBQcm9kdWN0XCIuXG4gICAgICAgIHsgbGFiZWw6ICdRdW90ZSBBY2NlcHRlZCcsIHZhbHVlOiAncXVvdGVfYWNjZXB0ZWQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdPdGhlcicsIHZhbHVlOiAnb3RoZXInIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgbG9zc19yZWFzb246IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ0xvc3MgUmVhc29uJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnV2h5IHRoaXMgZGVhbCB3YXMgbG9zdC4gUmVxdWlyZWQgdG8gY2xvc2UgYW4gb3Bwb3J0dW5pdHkgYXMgTG9zdC4nLFxuICAgICAgZ3JvdXA6ICdjbGFzc2lmaWNhdGlvbicsXG4gICAgICByZXF1aXJlZFdoZW46IFBgaGFzKHJlY29yZC5zdGFnZSkgJiYgcmVjb3JkLnN0YWdlID09IFwiY2xvc2VkX2xvc3RcImAsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdQcmljZSBUb28gSGlnaCcsIHZhbHVlOiAncHJpY2UnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdMb3N0IHRvIENvbXBldGl0b3InLCB2YWx1ZTogJ2NvbXBldGl0b3InIH0sXG4gICAgICAgIHsgbGFiZWw6ICdObyBCdWRnZXQnLCB2YWx1ZTogJ25vX2J1ZGdldCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ05vIERlY2lzaW9uJywgdmFsdWU6ICdub19kZWNpc2lvbicgfSxcbiAgICAgICAgeyBsYWJlbDogJ0JhZCBUaW1pbmcnLCB2YWx1ZTogJ3RpbWluZycgfSxcbiAgICAgICAgeyBsYWJlbDogJ01pc3NpbmcgRmVhdHVyZXMnLCB2YWx1ZTogJ2ZlYXR1cmVzJyB9LFxuICAgICAgICB7IGxhYmVsOiAnT3RoZXInLCB2YWx1ZTogJ290aGVyJyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIGxvc3NfZGV0YWlsczogRmllbGQudGV4dGFyZWEoe1xuICAgICAgbGFiZWw6ICdMb3NzL1dpbiBEZXRhaWxzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRnJlZS10ZXh0IGNvbnRleHQgYmVoaW5kIHRoZSB3aW4gb3IgbG9zcyByZWFzb24uJyxcbiAgICAgIGdyb3VwOiAnY2xhc3NpZmljYXRpb24nLFxuICAgIH0pLFxuICB9LFxuICBcbiAgLy8gRGF0YWJhc2UgaW5kZXhlcyBmb3IgcGVyZm9ybWFuY2VcbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ25hbWUnXSB9LFxuICAgIHsgZmllbGRzOiBbJ2NybV9hY2NvdW50J10gfSxcbiAgICB7IGZpZWxkczogWydvd25lcl9pZCddIH0sXG4gICAgeyBmaWVsZHM6IFsnc3RhZ2UnXSB9LFxuICAgIHsgZmllbGRzOiBbJ2Nsb3NlX2RhdGUnXSB9LFxuICAgIC8vIFRoZSBzdGFnbmF0aW9uIHN3ZWVwIGZpbHRlcnMgb24gdGhpcyBldmVyeSBtb3JuaW5nLlxuICAgIHsgZmllbGRzOiBbJ3N0YWdlX2VudHJ5X2RhdGUnXSB9LFxuICBdLFxuICBcbiAgLy8gRW5hYmxlIGFkdmFuY2VkIGZlYXR1cmVzXG4gIC8vXG4gIC8vIFN0YWdlL2Ftb3VudCBoaXN0b3J5IGlzIHRyYWNrZWQgcGVyLWZpZWxkIHZpYSBgRmllbGQudHJhY2tIaXN0b3J5YFxuICAvLyAoQURSLTAwNTIpLiBcdTI2QTBcdUZFMEYgT3duZXJzaGlwIGlzIE5PVDogaXQgbGl2ZXMgb24gdGhlIHBsYXRmb3JtJ3MgaW5qZWN0ZWRcbiAgLy8gYG93bmVyX2lkYCwgd2hpY2ggY2FycmllcyBubyBgdHJhY2tIaXN0b3J5YCBmbGFnIFx1MjAxNCBhIHRyYW5zZmVyIGlzIHJlY29yZGVkXG4gIC8vIGluIHRoZSBjb21wbGlhbmNlIGF1ZGl0IGxvZyAoYHN5c19hdWRpdF9sb2dgLCB1bmNvbmRpdGlvbmFsKSByYXRoZXIgdGhhbiBvblxuICAvLyB0aGUgYWN0aXZpdHkgZmVlZC5cbiAgZW5hYmxlOiB7XG4gICAgYXBpRW5hYmxlZDogdHJ1ZSxcbiAgICBhcGlNZXRob2RzOiBbJ2dldCcsICdsaXN0JywgJ2NyZWF0ZScsICd1cGRhdGUnLCAnZGVsZXRlJ10sIC8vIFdoaXRlbGlzdCBhbGxvd2VkIEFQSSBvcGVyYXRpb25zXG4gICAgLy8gIzYwMiBcdTIwMTQgcHJvcG9zYWxzLCByZWRsaW5lcyBhbmQgc2lnbmVkIG9yZGVycyBiZWxvbmcgb24gdGhlIGRlYWwuXG4gICAgLy8gU2VlIHRoZSBjYW5vbmljYWwgY2FwYWJpbGl0eSBub3RlIGluIGBzcmMvc2FsZXMvb2JqZWN0cy9pbmRleC50c2AuXG4gICAgZmlsZXM6IHRydWUsXG4gIH0sXG5cbiAgLy8gQURSLTAwNTIgXHUwMEE3NWIuMiBcdTIwMTQgZGVjbGFyYXRpdmUgbWlsZXN0b25lIGFjdGl2aXR5LiBXaGVuIGBzdGFnZWAgZW50ZXJzIHRoZXNlXG4gIC8vIHZhbHVlcyB0aGUgcGxhdGZvcm0gZW1pdHMgYSBzZW1hbnRpYyB0aW1lbGluZSBlbnRyeSAobm8gaG9vayBjb2RlKS5cbiAgLy8gQ29tYmluZWQgd2l0aCB0aGUgZmllbGQtbGV2ZWwgYHRyYWNrSGlzdG9yeWAgYWJvdmUgKHN0YWdlLWNoYW5nZSByb3dzKSB0aGlzXG4gIC8vIHJlcGxhY2VzIGFueSBoYW5kLWNvZGVkIGFjdGl2aXR5IGhvb2suXG4gIGFjdGl2aXR5TWlsZXN0b25lczogW1xuICAgIHsgZmllbGQ6ICdzdGFnZScsIHZhbHVlOiAnY2xvc2VkX3dvbicsIHN1bW1hcnk6ICdEZWFsIHdvbiBcdTIwMTQge25hbWV9JywgdHlwZTogJ2NvbXBsZXRlZCcgfSxcbiAgICB7IGZpZWxkOiAnc3RhZ2UnLCB2YWx1ZTogJ2Nsb3NlZF9sb3N0Jywgc3VtbWFyeTogJ0RlYWwgbG9zdCBcdTIwMTQge25hbWV9JywgdHlwZTogJ2NvbXBsZXRlZCcgfSxcbiAgXSxcblxuICAvLyBSZW1vdmVkOiBsaXN0X3ZpZXdzIGFuZCBmb3JtX3ZpZXdzIGJlbG9uZyBpbiBVSSBjb25maWd1cmF0aW9uLCBub3Qgb2JqZWN0IGRlZmluaXRpb25cbiAgXG4gIC8vIExpZmVjeWNsZSB0cmFuc2l0aW9ucyBhcmUgZW5mb3JjZWQgdmlhIGEgYHN0YXRlX21hY2hpbmVgIHZhbGlkYXRpb24gcnVsZVxuICAvLyAoc2VlIHZhbGlkYXRpb25zW10gYmVsb3cpLiBcdTI2QTBcdUZFMEYgVGhlcmUgaXMgbm8gdG9wLWxldmVsIGBzdGF0ZU1hY2hpbmVzYCBrZXkgb25cbiAgLy8gdGhlIHBsYXRmb3JtIFx1MjAxNCBzdGF0dXMgc3RhdGUgbWFjaGluZXMgbGl2ZSBpbiB0aGUgdmFsaWRhdGlvbiB1bmlvbi5cblxuICAvLyBWYWxpZGF0aW9uIFJ1bGVzXG4gIC8vXG4gIC8vIFByZWRpY2F0ZXMgYmVsb3cgYXJlIFRPVEFMOiBldmVyeSBgcmVjb3JkLnhgIHJlYWQgaXMgYGhhcygpYC1ndWFyZGVkLCBzbyB0aGVcbiAgLy8gcnVsZSByZXR1cm5zIGEgdmVyZGljdCBldmVuIHdoZW4gdGhlIG1lcmdlZCByZWNvcmQgaGFzIG5vIHN1Y2gga2V5LiBTZWVcbiAgLy8gQUdFTlRTLm1kIFwiVmFsaWRhdGlvbiBwcmVkaWNhdGVzIG11c3QgYmUgVE9UQUxcIiBhbmRcbiAgLy8gdGVzdC9vYmplY3QtdmFsaWRhdGlvbi1wcmVkaWNhdGVzLnRlc3QudHMsIHdoaWNoIGZhaWxzIHRoZSBidWlsZCBvdGhlcndpc2UuXG4gIHZhbGlkYXRpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2Nsb3NlX2RhdGVfZnV0dXJlJyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6ICdDbG9zZSBkYXRlIHNob3VsZCBub3QgYmUgaW4gdGhlIHBhc3QgdW5sZXNzIG9wcG9ydHVuaXR5IGlzIGNsb3NlZCcsXG4gICAgICAvLyBBbiBhYnNlbnQgYHN0YWdlYCBrZXkgbWVhbnMgXCJubyBzdGFnZSByZWNvcmRlZFwiLCB3aGljaCBpcyBub3QgYSBjbG9zZWRcbiAgICAgIC8vIHN0YWdlIFx1MjAxNCBoZW5jZSBgIWhhcyhyZWNvcmQuc3RhZ2UpIHx8IChcdTIwMjYpYCByYXRoZXIgdGhhbiBhIGxlYWRpbmdcbiAgICAgIC8vIGBoYXMocmVjb3JkLnN0YWdlKSAmJmAsIHdoaWNoIHdvdWxkIHN1cHByZXNzIHRoZSB3YXJuaW5nIGluc3RlYWQuXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5jbG9zZV9kYXRlKSAmJiByZWNvcmQuY2xvc2VfZGF0ZSAhPSBudWxsICYmIHJlY29yZC5jbG9zZV9kYXRlIDwgdG9kYXkoKSAmJiAoIWhhcyhyZWNvcmQuc3RhZ2UpIHx8IChyZWNvcmQuc3RhZ2UgIT0gXCJjbG9zZWRfd29uXCIgJiYgcmVjb3JkLnN0YWdlICE9IFwiY2xvc2VkX2xvc3RcIikpYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdhbW91bnRfcG9zaXRpdmUnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdBbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybycsXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5hbW91bnQpICYmIHJlY29yZC5hbW91bnQgIT0gbnVsbCAmJiByZWNvcmQuYW1vdW50IDw9IDBgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ29wcG9ydHVuaXR5X3N0YWdlX3Byb2dyZXNzaW9uJyxcbiAgICAgIHR5cGU6ICdzdGF0ZV9tYWNoaW5lJyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiAnSW52YWxpZCBvcHBvcnR1bml0eSBzdGFnZSB0cmFuc2l0aW9uJyxcbiAgICAgIGZpZWxkOiAnc3RhZ2UnLFxuICAgICAgdHJhbnNpdGlvbnM6IHtcbiAgICAgICAgLy8gYFx1MjE5MiBwcm9wb3NhbGAgaXMgbGVnYWwgZnJvbSBldmVyeSBwcmUtcHJvcG9zYWwgc3RhZ2U6IHRoZVxuICAgICAgICAvLyBxdW90ZV9nZW5lcmF0aW9uIGZsb3cgZmFzdC1mb3J3YXJkcyB0aGUgZGVhbCB0byBgcHJvcG9zYWxgIHdoZW4gYVxuICAgICAgICAvLyBxdW90ZSBpcyBnZW5lcmF0ZWQsIHdoaWNoIGNhbiBoYXBwZW4gYXQgYW55IG9wZW4gc3RhZ2UuXG4gICAgICAgIHByb3NwZWN0aW5nOiBbJ3F1YWxpZmljYXRpb24nLCAncHJvcG9zYWwnLCAnY2xvc2VkX2xvc3QnXSxcbiAgICAgICAgcXVhbGlmaWNhdGlvbjogWyduZWVkc19hbmFseXNpcycsICdwcm9wb3NhbCcsICdjbG9zZWRfbG9zdCddLFxuICAgICAgICBuZWVkc19hbmFseXNpczogWydwcm9wb3NhbCcsICdjbG9zZWRfbG9zdCddLFxuICAgICAgICAvLyBgcHJvcG9zYWwgXHUyMTkyIGNsb3NlZF93b25gIGlzIGxlZ2FsOiB0aGUgcXVvdGVfb25fYWNjZXB0ZWQgaG9vayBjbG9zZXNcbiAgICAgICAgLy8gdGhlIGxpbmtlZCBkZWFsIGRpcmVjdGx5IGZyb20gdGhlIENQUSBwYXRoIChxdW90ZV9nZW5lcmF0aW9uIHBhcmtzXG4gICAgICAgIC8vIHRoZSBvcHBvcnR1bml0eSBhdCBgcHJvcG9zYWxgOyBhbiBhY2NlcHRlZCBxdW90ZSB3aW5zIGl0IHdpdGhvdXQgYVxuICAgICAgICAvLyBzZXBhcmF0ZSBuZWdvdGlhdGlvbiBzdGVwKS5cbiAgICAgICAgcHJvcG9zYWw6IFsnbmVnb3RpYXRpb24nLCAnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddLFxuICAgICAgICBuZWdvdGlhdGlvbjogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10sXG4gICAgICAgIGNsb3NlZF93b246IFtdLFxuICAgICAgICBjbG9zZWRfbG9zdDogW10sXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG4gIFxuICAvLyBcdTI2QTBcdUZFMEYgYHByb2JhYmlsaXR5YCBhbmQgYGV4cGVjdGVkX3JldmVudWVgIGFyZSBOT1QgY29tcHV0ZWQgZGVjbGFyYXRpdmVseS5cbiAgLy8gVGhleSBhcmUgZGVyaXZlZCBpbiBgb3Bwb3J0dW5pdHkuaG9vay50c2AgKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggPVxuICAvLyBzdGFnZSBcdTIxOTIgU1RBR0VfUFJPQkFCSUxJVFkpOyBrZWVwaW5nIHRoZSBtYXRoIGluIG9uZSBwbGFjZSBhdm9pZHMgZHJpZnRcbiAgLy8gYmV0d2VlbiBhIGRlY2xhcmF0aXZlIENBU0UoKSB0YWJsZSBhbmQgdGhlIGhvb2sncyBsb29rdXAgdGFibGUuXG4gIC8vXG4gIC8vIFx1MjZBMFx1RkUwRiBObyBgd29ya2Zsb3dzW11gIGhlcmUsIGFuZCBub25lIGlzIHBvc3NpYmxlOiBvYmplY3QgYHdvcmtmbG93c1tdYCB3ZXJlXG4gIC8vIHJlbW92ZWQgZnJvbSB0aGUgcGxhdGZvcm0uIEZpZWxkIHVwZGF0ZXMgbGl2ZSBpbiB0aGlzIG9iamVjdCdzIGAqLmhvb2sudHNgO1xuICAvLyBzY2hlZHVsZWQgc3RhdHVzIGZsaXBzIGFuZCBub3RpZmljYXRpb25zIGxpdmUgaW4gYHNyYy8qL2Zsb3dzLyouZmxvdy50c2AuXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvdGFzay5vYmplY3QudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL3Rhc2sub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBPYmplY3RTY2hlbWEsIEZpZWxkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgVEFTS19UWVBFX09QVElPTlMgfSBmcm9tICcuL19waWNrbGlzdHMnO1xuXG5leHBvcnQgY29uc3QgVGFzayA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX3Rhc2snLFxuICBsYWJlbDogJ1Rhc2snLFxuICBwbHVyYWxMYWJlbDogJ1Rhc2tzJyxcbiAgaWNvbjogJ2NoZWNrLXNxdWFyZScsXG4gIGRlc2NyaXB0aW9uOiAnQWN0aXZpdGllcyBhbmQgdG8tZG8gaXRlbXMnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIFBlcnNvbmFsIGFjdGl2aXR5IHJlY29yZHMuXG4gIHNoYXJpbmdNb2RlbDogJ3ByaXZhdGUnLFxuXG4gIC8vIEV2ZXJ5IG90aGVyIGJ1c2luZXNzIG9iamVjdCB3aXRoIGEgZGV0YWlsIHBhZ2UgZ3JvdXBzIGl0cyBmaWVsZHM7IHRhc2sgd2FzXG4gIC8vIG9uZSBvZiB0aGUgdHdvIHRoYXQgZGlkIG5vdCwgc28gaXRzIGRldGFpbCBwYWdlIGZlbGwgYmFjayB0byBvbmUgZmxhdCBncmlkXG4gIC8vIHdoZXJlIHRoZSBmaXZlIHBvbHltb3JwaGljIGByZWxhdGVkX3RvXypgIGxvb2t1cHMgYW5kIHRoZSByZWN1cnJlbmNlXG4gIC8vIG1hY2hpbmVyeSBzYXQgaW5saW5lIHdpdGggdGhlIHN1YmplY3QuIFRoZSBrZXlzIG1pcnJvciB0aGUgc2VjdGlvbnMgdGhlXG4gIC8vIHRhc2sgZm9ybSBhbHJlYWR5IHVzZXMgKFRhc2sgLyBSZWxhdGVkIFJlY29yZHMgLyBSZWN1cnJlbmNlICYgRWZmb3J0KSBzb1xuICAvLyB0aGUgdHdvIHN1cmZhY2VzIGFncmVlLlxuICBmaWVsZEdyb3VwczogW1xuICAgIHsga2V5OiAnYmFzaWMnLCAgICAgIGxhYmVsOiAnVGFzayBJbmZvcm1hdGlvbicsIGljb246ICdpbmZvJyB9LFxuICAgIHsga2V5OiAnc2NoZWR1bGluZycsIGxhYmVsOiAnU2NoZWR1bGluZycsICAgICAgIGljb246ICdjYWxlbmRhcicgfSxcbiAgICAvLyBObyAnYXNzaWdubWVudCcgZ3JvdXA6IHRoZSBhc3NpZ25lZSAoYG93bmVyX2lkYCkgd2FzIGl0cyBvbmx5IG1lbWJlciwgYW5kXG4gICAgLy8gdGhlIHN5bnRoZXNpemVkIGRldGFpbCBwYWdlIGhvaXN0cyBpdCBpbnRvIHRoZSBoaWdobGlnaHQgc3RyaXAgXHUyMDE0IHNvIHRoZVxuICAgIC8vIGdyb3VwIHJlbmRlcmVkIG9uIGZvcm1zIGFuZCBuZXZlciBvbiBkZXRhaWwgcGFnZXNcbiAgICAvLyAoYGZpZWxkLWdyb3VwLXNoYWRvd2VkYCkuIEl0IGxpdmVzIGluIGBiYXNpY2AgYWxvbmdzaWRlXG4gICAgLy8gc3ViamVjdC9zdGF0dXMvcHJpb3JpdHkgaW5zdGVhZC5cbiAgICB7IGtleTogJ3JlbGF0ZWQnLCAgICBsYWJlbDogJ1JlbGF0ZWQgUmVjb3JkcycsICBpY29uOiAnbGluaycgfSxcbiAgICB7IGtleTogJ3JlY3VycmVuY2UnLCBsYWJlbDogJ1JlY3VycmVuY2UnLCAgICAgICBpY29uOiAncmVmcmVzaC1jY3cnLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ2VmZm9ydCcsICAgICBsYWJlbDogJ1Byb2dyZXNzICYgRWZmb3J0JywgaWNvbjogJ2FjdGl2aXR5JywgICBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ3N5c3RlbScsICAgICBsYWJlbDogJ1N5c3RlbScsICAgICAgICAgICBpY29uOiAnZGF0YWJhc2UnLCAgICBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgXSxcblxuICBmaWVsZHM6IHtcbiAgICAvLyBQbGF0Zm9ybSBvd25lcnNoaXAgYW5jaG9yIFx1MjAxNCBjYW5vbmljYWwgbm90ZSBpbiBgYWNjb3VudC5vYmplY3QudHNgICgjNTQ4KS5cbiAgICBvd25lcl9pZDogRmllbGQubG9va3VwKCdzeXNfdXNlcicsIHtcbiAgICAgIGxhYmVsOiAnQXNzaWduZWQgVG8nLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBzeXN0ZW06IHRydWUsXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBUYXNrIEluZm9ybWF0aW9uXG4gICAgc3ViamVjdDogRmllbGQudGV4dCh7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnU3ViamVjdCcsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG1heExlbmd0aDogMjU1LFxuICAgIH0pLFxuICAgIFxuICAgIGRlc2NyaXB0aW9uOiBGaWVsZC5tYXJrZG93bih7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnRGVzY3JpcHRpb24nLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFRhc2sgTWFuYWdlbWVudFxuICAgIHN0YXR1czogRmllbGQuc2VsZWN0KHtcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICAgIC8vIEZpZWxkLWxldmVsIGRlZmF1bHQsIG5vdCBqdXN0IHRoZSBvcHRpb24gZmxhZzogdGhlIG9wdGlvbiBgZGVmYXVsdGBcbiAgICAgIC8vIG9ubHkgcHJlc2VsZWN0cyBpbiBzb21lIGZvcm0gc3VyZmFjZXMsIHNvIGEgcXVpY2stY3JlYXRlIG1vZGFsIG9wZW5lZFxuICAgICAgLy8gZnJvbSBhIHJlbGF0ZWQgbGlzdCBsZWZ0IHRoaXMgcmVxdWlyZWQgZmllbGQgYmxhbmsgYW5kIHRoZSByZXAgaGFkIHRvXG4gICAgICAvLyBwaWNrIFwiTm90IFN0YXJ0ZWRcIiBieSBoYW5kIGV2ZXJ5IHRpbWUuXG4gICAgICBkZWZhdWx0VmFsdWU6ICdub3Rfc3RhcnRlZCcsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdOb3QgU3RhcnRlZCcsIHZhbHVlOiAnbm90X3N0YXJ0ZWQnLCBjb2xvcjogJyM4MDgwODAnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdJbiBQcm9ncmVzcycsIHZhbHVlOiAnaW5fcHJvZ3Jlc3MnLCBjb2xvcjogJyNGRkE1MDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdXYWl0aW5nJywgdmFsdWU6ICd3YWl0aW5nJywgY29sb3I6ICcjRkZENzAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQ29tcGxldGVkJywgdmFsdWU6ICdjb21wbGV0ZWQnLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdEZWZlcnJlZCcsIHZhbHVlOiAnZGVmZXJyZWQnLCBjb2xvcjogJyM5OTk5OTknIH0sXG4gICAgICBdXG4gICAgfSksXG5cbiAgICBwcmlvcml0eTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbGFiZWw6ICdQcmlvcml0eScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgICAgLy8gYG5vcm1hbGAgaXMgdGhlIGRlZmF1bHQgcmF0aGVyIHRoYW4gYGxvd2A6IGEgcmVwIGZpbGluZyBhIHRvLWRvIGhhc1xuICAgICAgLy8gbWFkZSBubyBwcmlvcml0eSBqdWRnZW1lbnQsIGFuZCBkZWZhdWx0aW5nIGV2ZXJ5dGhpbmcgdG8gTG93IG1hZGUgdGhlXG4gICAgICAvLyBmaWVsZCBtZWFuaW5nbGVzcyAobm90aGluZyBldmVyIHNvcnRlZCBhYm92ZSB0aGUgbm9pc2UpLlxuICAgICAgZGVmYXVsdFZhbHVlOiAnbm9ybWFsJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0xvdycsIHZhbHVlOiAnbG93JywgY29sb3I6ICcjNDE2OUUxJyB9LFxuICAgICAgICB7IGxhYmVsOiAnTm9ybWFsJywgdmFsdWU6ICdub3JtYWwnLCBjb2xvcjogJyMwMEFBMDAnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdIaWdoJywgdmFsdWU6ICdoaWdoJywgY29sb3I6ICcjRkZBNTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnVXJnZW50JywgdmFsdWU6ICd1cmdlbnQnLCBjb2xvcjogJyNGRjAwMDAnIH0sXG4gICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTb3J0YWJsZSBvcmRpbmFsIGZvciBgcHJpb3JpdHlgIFx1MjAxNCBzZWUgY3JtX2Nhc2UucHJpb3JpdHlfcmFuay4gU29ydGluZyBvblxuICAgIC8vIHRoZSBzZWxlY3QgaXRzZWxmIGNvbXBhcmVzIHJhdyBzdHJpbmdzIChub3JtYWwgPiBsb3cgPiBoaWdoID4gdXJnZW50KSxcbiAgICAvLyB3aGljaCBwdXNoZXMgdXJnZW50IHdvcmsgdG8gdGhlIGJvdHRvbSBvZiB0aGUgdG8tZG8gcXVldWUuXG4gICAgLy9cbiAgICAvLyBgMGAgaXMgdGhlIFVOUkFOS0VEIHNlbnRpbmVsLCBpZGVudGljYWwgdG8gY3JtX2Nhc2UucHJpb3JpdHlfcmFuay4gXHUyNkQ0IEl0XG4gICAgLy8gbXVzdCBzdGF5IGlkZW50aWNhbCBvbiBib3RoOiBhIGRpZmZlcmluZyBzZW50aW5lbCBvcmRlcnMgdGhlIHNhbWUgdW5rbm93blxuICAgIC8vIHByaW9yaXR5IGRpZmZlcmVudGx5IG9uIHRoZSB0d28gb2JqZWN0cywgYW5kIGAyYCBoZXJlIHdvdWxkIG1ha2UgYW5cbiAgICAvLyB1bnJhbmtlZCB0YXNrIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBnZW51aW5lIGBub3JtYWxgLlxuICAgIHByaW9yaXR5X3Jhbms6IEZpZWxkLm51bWJlcih7XG4gICAgICBsYWJlbDogJ1ByaW9yaXR5IFJhbmsnLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBkZWZhdWx0VmFsdWU6IDAsXG4gICAgfSksXG5cbiAgICB0eXBlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ1Rhc2sgVHlwZScsXG4gICAgICAvLyBDYW5vbmljYWwgc2V0ICgjNDkwKSBcdTIwMTQgdGhlIHNjaGVkdWxlX2ZvbGxvd3VwIHNjcmVlbiByZW5kZXJzIHRoZSBzYW1lXG4gICAgICAvLyBsaXN0OyBzZWUgX3BpY2tsaXN0cy50cy5cbiAgICAgIG9wdGlvbnM6IFsuLi5UQVNLX1RZUEVfT1BUSU9OU10sXG4gICAgfSksXG4gICAgXG4gICAgLy8gRGF0ZXNcbiAgICBkdWVfZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBncm91cDogJ3NjaGVkdWxpbmcnLFxuICAgICAgbGFiZWw6ICdEdWUgRGF0ZScsXG4gICAgfSksXG4gICAgXG4gICAgcmVtaW5kZXJfZGF0ZTogRmllbGQuZGF0ZXRpbWUoe1xuICAgICAgZ3JvdXA6ICdzY2hlZHVsaW5nJyxcbiAgICAgIGxhYmVsOiAnUmVtaW5kZXIgRGF0ZS9UaW1lJyxcbiAgICB9KSxcbiAgICBcbiAgICBjb21wbGV0ZWRfZGF0ZTogRmllbGQuZGF0ZXRpbWUoe1xuICAgICAgZ3JvdXA6ICdzY2hlZHVsaW5nJyxcbiAgICAgIGxhYmVsOiAnQ29tcGxldGVkIERhdGUnLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgfSksXG4gICAgXG4gICAgLy8gUmVsYXRlZCBUbyAoUG9seW1vcnBoaWMgcmVsYXRpb25zaGlwIC0gY2FuIGxpbmsgdG8gbXVsdGlwbGUgb2JqZWN0IHR5cGVzKVxuICAgIHJlbGF0ZWRfdG9fdHlwZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGdyb3VwOiAncmVsYXRlZCcsXG4gICAgICBsYWJlbDogJ1JlbGF0ZWQgVG8gVHlwZScsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdBY2NvdW50JywgdmFsdWU6ICdjcm1fYWNjb3VudCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0NvbnRhY3QnLCB2YWx1ZTogJ2NybV9jb250YWN0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnT3Bwb3J0dW5pdHknLCB2YWx1ZTogJ2NybV9vcHBvcnR1bml0eScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0xlYWQnLCB2YWx1ZTogJ2NybV9sZWFkJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQ2FzZScsIHZhbHVlOiAnY3JtX2Nhc2UnIH0sXG4gICAgICBdXG4gICAgfSksXG4gICAgXG4gICAgcmVsYXRlZF90b19hY2NvdW50OiBGaWVsZC5sb29rdXAoJ2NybV9hY2NvdW50Jywge1xuICAgICAgZ3JvdXA6ICdyZWxhdGVkJyxcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBBY2NvdW50JyxcbiAgICB9KSxcbiAgICBcbiAgICByZWxhdGVkX3RvX2NvbnRhY3Q6IEZpZWxkLmxvb2t1cCgnY3JtX2NvbnRhY3QnLCB7XG4gICAgICBncm91cDogJ3JlbGF0ZWQnLFxuICAgICAgbGFiZWw6ICdSZWxhdGVkIENvbnRhY3QnLFxuICAgIH0pLFxuICAgIFxuICAgIHJlbGF0ZWRfdG9fb3Bwb3J0dW5pdHk6IEZpZWxkLmxvb2t1cCgnY3JtX29wcG9ydHVuaXR5Jywge1xuICAgICAgZ3JvdXA6ICdyZWxhdGVkJyxcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBPcHBvcnR1bml0eScsXG4gICAgfSksXG4gICAgXG4gICAgcmVsYXRlZF90b19sZWFkOiBGaWVsZC5sb29rdXAoJ2NybV9sZWFkJywge1xuICAgICAgZ3JvdXA6ICdyZWxhdGVkJyxcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBMZWFkJyxcbiAgICB9KSxcbiAgICBcbiAgICByZWxhdGVkX3RvX2Nhc2U6IEZpZWxkLmxvb2t1cCgnY3JtX2Nhc2UnLCB7XG4gICAgICBncm91cDogJ3JlbGF0ZWQnLFxuICAgICAgbGFiZWw6ICdSZWxhdGVkIENhc2UnLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFJlY3VycmVuY2UgKGZvciByZWN1cnJpbmcgdGFza3MpXG4gICAgaXNfcmVjdXJyaW5nOiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGdyb3VwOiAncmVjdXJyZW5jZScsXG4gICAgICBsYWJlbDogJ1JlY3VycmluZyBUYXNrJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgfSksXG4gICAgXG4gICAgcmVjdXJyZW5jZV90eXBlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgZ3JvdXA6ICdyZWN1cnJlbmNlJyxcbiAgICAgIGxhYmVsOiAnUmVjdXJyZW5jZSBUeXBlJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0RhaWx5JywgdmFsdWU6ICdkYWlseScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1dlZWtseScsIHZhbHVlOiAnd2Vla2x5JyB9LFxuICAgICAgICB7IGxhYmVsOiAnTW9udGhseScsIHZhbHVlOiAnbW9udGhseScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1llYXJseScsIHZhbHVlOiAneWVhcmx5JyB9LFxuICAgICAgXVxuICAgIH0pLFxuICAgIFxuICAgIHJlY3VycmVuY2VfaW50ZXJ2YWw6IEZpZWxkLm51bWJlcih7XG4gICAgICBncm91cDogJ3JlY3VycmVuY2UnLFxuICAgICAgbGFiZWw6ICdSZWN1cnJlbmNlIEludGVydmFsJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogMSxcbiAgICAgIG1pbjogMSxcbiAgICB9KSxcbiAgICBcbiAgICByZWN1cnJlbmNlX2VuZF9kYXRlOiBGaWVsZC5kYXRlKHtcbiAgICAgIGdyb3VwOiAncmVjdXJyZW5jZScsXG4gICAgICBsYWJlbDogJ1JlY3VycmVuY2UgRW5kIERhdGUnLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIEZsYWdzXG4gICAgaXNfY29tcGxldGVkOiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGdyb3VwOiAnc3lzdGVtJyxcbiAgICAgIGxhYmVsOiAnSXMgQ29tcGxldGVkJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICB9KSxcbiAgICBcbiAgICBpc19vdmVyZHVlOiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGdyb3VwOiAnc3lzdGVtJyxcbiAgICAgIGxhYmVsOiAnSXMgT3ZlcmR1ZScsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBTZXQgYnkgdGhlIGB0YXNrX2R1ZV9yZW1pbmRlcmAgc2NoZWR1bGUgZmxvdyBvbmNlIGEgcmVtaW5kZXIgaGFzIGZpcmVkXG4gICAgLy8gKHRoZSBzd2VlcCBkZS1kdXBzIG9uIGByZW1pbmRlcl9kYXRlYCwgd2hpY2ggaXQgY2xlYXJzOyB0aGlzIGZsYWcgaXMgdGhlXG4gICAgLy8gYXVkaXQgdHJhaWwpLCBhbmQgZGVmYXVsdGVkIHRvIGBmYWxzZWAgYnkgYHRhc2suaG9vay50c2Agb24gaW5zZXJ0LlxuICAgIC8vXG4gICAgLy8gTk9UIHJlYWRvbmx5IFx1MjAxNCBidXQgdGhlIG9sZCByZWFzb24gaGVyZSAoXCIxNi54IGRyb3BzIGZsb3cgd3JpdGVzIHRvXG4gICAgLy8gcmVhZG9ubHkgZmllbGRzXCIpIGRvZXMgbm90IHN1cnZpdmUgbWVhc3VyZW1lbnQuIFRha2VuIG9uIDE3LjEuMCxcbiAgICAvLyBSRS1UQUtFTiBvbiAxNy4yLjAgKCMxNDYwKSBhbmQgUkUtQ09ORklSTUVEIG9uIDE3LjMuMCAoIzE2NzYpIFx1MjAxNCB0aGUgcGluXG4gICAgLy8gYXQgZWFjaCBvZiB0aG9zZSB0YWtpbmdzOyBub3QgcmUtdGFrZW4gb24gMTcuNC4wIChQUiAjMTgxNCwgIzE4MDcpIG9yXG4gICAgLy8gMTcuNS4wIFx1MjAxNCBzYW1lIHZlcmRpY3QgYWxsIHRocmVlIHRpbWVzOiBgdGFza19kdWVfcmVtaW5kZXJgXG4gICAgLy8gZGVjbGFyZXMgYHJ1bkFzOiAnc3lzdGVtJ2AsIHNvIGl0cyB3cml0ZSBXT1VMRCBzdXJ2aXZlIGFcbiAgICAvLyBgcmVhZG9ubHk6IHRydWVgLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoZSBvdGhlciBoYWxmIG9mIHRoYXQgcmVhc29uIEVYUElSRUQgYXQgMTcuNC4wIGFuZCBpcyBcdTI2RDQgTk9UXG4gICAgLy8gcmVudW1iZXJlZCBoZXJlOiBcInRoZSBpbnNlcnQgcGF0aCBpcyBleGVtcHQgZnJvbSB0aGUgc3RyaXBcIiBoZWxkIHRocm91Z2hcbiAgICAvLyAxNy4zLjAgYW5kIHdhcyByZXZlcnNlZCBhcyBhIGRlY2xhcmVkIEJSRUFLSU5HIGNoYW5nZSBcdTIwMTQgdGhlIHJldGlyZW1lbnRcbiAgICAvLyBpcyByZWNvcmRlZCBpbiB0aGUgSU5TRVJULXBhdGggc2VjdGlvbiBvZlxuICAgIC8vIGB0ZXN0L3JlYWRvbmx5LXdyaXRlLXNlbWFudGljcy50ZXN0LnRzYCAoIzE0MjkpIGFuZCBpblxuICAgIC8vIGBjYW1wYWlnbl9tZW1iZXIub2JqZWN0LnRzYC4gTmVpdGhlciBoYWxmIG1vdmVzIHRoaXMgZmllbGQsIHdoaWNoIGlzIG5vdFxuICAgIC8vIGByZWFkb25seWAgYXQgYWxsLiBMZWZ0IHdyaXRhYmxlIGFzLWlzOyBmbGlwcGluZyBpdCBpcyBhIHNlcGFyYXRlXG4gICAgLy8gZGVjaXNpb24sIG5vdCBhIGNvbW1lbnQgZml4LlxuICAgIHJlbWluZGVyX3NlbnQ6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgZ3JvdXA6ICdzeXN0ZW0nLFxuICAgICAgbGFiZWw6ICdSZW1pbmRlciBTZW50JyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgfSksXG5cbiAgICAvLyBQcm9ncmVzc1xuICAgIHByb2dyZXNzX3BlcmNlbnQ6IEZpZWxkLnBlcmNlbnQoe1xuICAgICAgZ3JvdXA6ICdlZmZvcnQnLFxuICAgICAgbGFiZWw6ICdQcm9ncmVzcyAoJSknLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxMDAsXG4gICAgICBkZWZhdWx0VmFsdWU6IDAsXG4gICAgfSksXG4gICAgXG4gICAgLy8gTm8gdGltZSB0cmFja2luZy4gYGVzdGltYXRlZF9ob3Vyc2AgLyBgYWN0dWFsX2hvdXJzYCB3ZXJlIGRlY2xhcmVkIGFuZFxuICAgIC8vIGluZXJ0OiBubyByb2xsdXAgc3VtbWVkIHRoZW0gb250byBhIGNhc2Ugb3IgYW4gb3Bwb3J0dW5pdHksIG5vIHZhcmlhbmNlXG4gICAgLy8gcmVwb3J0IGNvbXBhcmVkIHRoZW0sIGFuZCBub3RoaW5nIHdhcm5lZCB3aGVuIGFjdHVhbCBvdmVycmFuIGVzdGltYXRlLlxuICAgIC8vIEVmZm9ydCBvbiBhIHRhc2sgaXMgYHByb2dyZXNzX3BlcmNlbnRgLCB3aGljaCB0aGUgdGFzayB2aWV3cyBkbyByZWFkLlxuICB9LFxuICBcbiAgLy8gQVBJIHN1cmZhY2UuIEhpc3RvcnkgXHUyMTkyIEZpZWxkLnRyYWNrSGlzdG9yeSAoQURSLTAwNTIpLlxuICBlbmFibGU6IHtcbiAgICBhcGlFbmFibGVkOiB0cnVlLFxuICB9LFxuICBcbiAgLy8gRGF0YWJhc2UgaW5kZXhlcyBmb3IgcGVyZm9ybWFuY2VcbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ3N0YXR1cyddIH0sXG4gICAgeyBmaWVsZHM6IFsncHJpb3JpdHknXSB9LFxuICAgIHsgZmllbGRzOiBbJ293bmVyX2lkJ10gfSxcbiAgICB7IGZpZWxkczogWydkdWVfZGF0ZSddIH0sXG4gIF0sXG4gIFxuICAvLyBBRFItMDA3OTogcmVuZGVyLW9ubHkgYHRpdGxlRm9ybWF0YCByZXRpcmVkIGluIGZhdm9yIG9mIGBuYW1lRmllbGRgLFxuICAvLyB3aGljaCBuYW1lcyB0aGUgcmVhbCBmaWVsZCBob2xkaW5nIHRoZSByZWNvcmQgdGl0bGUgKGhlcmU6IGBzdWJqZWN0YCkuXG4gIG5hbWVGaWVsZDogJ3N1YmplY3QnLFxuICBoaWdobGlnaHRGaWVsZHM6IFsnc3ViamVjdCcsICdzdGF0dXMnLCAncHJpb3JpdHknLCAnZHVlX2RhdGUnLCAnb3duZXJfaWQnXSxcbiAgXG4gIC8vIFJlbW92ZWQ6IGxpc3Rfdmlld3MgYW5kIGZvcm1fdmlld3MgYmVsb25nIGluIFVJIGNvbmZpZ3VyYXRpb24sIG5vdCBvYmplY3QgZGVmaW5pdGlvblxuICBcbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnY29tcGxldGVkX2RhdGVfcmVxdWlyZWQnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdDb21wbGV0ZWQgZGF0ZSBpcyByZXF1aXJlZCB3aGVuIHN0YXR1cyBpcyBDb21wbGV0ZWQnLFxuICAgICAgY29uZGl0aW9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwiY29tcGxldGVkXCIgJiYgKCFoYXMocmVjb3JkLmNvbXBsZXRlZF9kYXRlKSB8fCBpc0JsYW5rKHJlY29yZC5jb21wbGV0ZWRfZGF0ZSkpYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdyZWN1cnJlbmNlX2ZpZWxkc19yZXF1aXJlZCcsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ1JlY3VycmVuY2UgdHlwZSBpcyByZXF1aXJlZCBmb3IgcmVjdXJyaW5nIHRhc2tzJyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmlzX3JlY3VycmluZykgJiYgcmVjb3JkLmlzX3JlY3VycmluZyA9PSB0cnVlICYmICghaGFzKHJlY29yZC5yZWN1cnJlbmNlX3R5cGUpIHx8IGlzQmxhbmsocmVjb3JkLnJlY3VycmVuY2VfdHlwZSkpYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdyZWxhdGVkX3RvX3JlcXVpcmVkJyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6ICdBdCBsZWFzdCBvbmUgcmVsYXRlZCByZWNvcmQgc2hvdWxkIGJlIHNlbGVjdGVkJyxcbiAgICAgIGNvbmRpdGlvbjogUGAoIWhhcyhyZWNvcmQucmVsYXRlZF90b19hY2NvdW50KSB8fCBpc0JsYW5rKHJlY29yZC5yZWxhdGVkX3RvX2FjY291bnQpKSAmJiAoIWhhcyhyZWNvcmQucmVsYXRlZF90b19jb250YWN0KSB8fCBpc0JsYW5rKHJlY29yZC5yZWxhdGVkX3RvX2NvbnRhY3QpKSAmJiAoIWhhcyhyZWNvcmQucmVsYXRlZF90b19vcHBvcnR1bml0eSkgfHwgaXNCbGFuayhyZWNvcmQucmVsYXRlZF90b19vcHBvcnR1bml0eSkpICYmICghaGFzKHJlY29yZC5yZWxhdGVkX3RvX2xlYWQpIHx8IGlzQmxhbmsocmVjb3JkLnJlbGF0ZWRfdG9fbGVhZCkpICYmICghaGFzKHJlY29yZC5yZWxhdGVkX3RvX2Nhc2UpIHx8IGlzQmxhbmsocmVjb3JkLnJlbGF0ZWRfdG9fY2FzZSkpYCxcbiAgICB9LFxuICBdLFxuICBcbiAgLy8gXHUyNkEwXHVGRTBGIE5vIGB3b3JrZmxvd3NbXWAgaGVyZSwgYW5kIG5vbmUgaXMgcG9zc2libGU6IG9iamVjdCBgd29ya2Zsb3dzW11gIHdlcmVcbiAgLy8gcmVtb3ZlZCBmcm9tIHRoZSBwbGF0Zm9ybS4gRmllbGQgdXBkYXRlcyBsaXZlIGluIHRoaXMgb2JqZWN0J3MgYCouaG9vay50c2A7XG4gIC8vIHNjaGVkdWxlZCBzdGF0dXMgZmxpcHMgYW5kIG5vdGlmaWNhdGlvbnMgbGl2ZSBpbiBgc3JjLyovZmxvd3MvKi5mbG93LnRzYC5cbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvYWN0aW9ucy9hY3Rpdml0eS1hY3Rpb25zLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FjdGlvbnNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvYWN0aW9ucy9hY3Rpdml0eS1hY3Rpb25zLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEFjdGlvbiB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcbmltcG9ydCAqIGFzIHNhbGVzT2JqZWN0cyBmcm9tICcuLi9vYmplY3RzJztcblxuLyoqXG4gKiBBY3Rpdml0eS1sb2dnaW5nIGFjdGlvbnMgXHUyMDE0IGBsb2dfY2FsbGAsIGBsb2dfbWVldGluZ2AsIGBzY2hlZHVsZV9tZWV0aW5nYC5cbiAqXG4gKiAoSXQgd2FzIGBzcmMvYWN0aW9ucy9nbG9iYWwuYWN0aW9ucy50c2AgdW50aWwgdGhlIEFEUi0wMTMwIGxheW91dDogbm90aGluZ1xuICogaGVyZSBpcyBhICpnbG9iYWwqIGFjdGlvbiwgYW5kIG5vdGhpbmcgY2FuIGJlIFx1MjAxNCBzZWUgdGhlIGRpc3BhdGNoZXIgbm90ZSBvblxuICogYG9iamVjdE5hbWVgIGJlbG93LiBUaGUgbmFtZSBub3cgc2F5cyB3aGF0IGl0IGJ1aWxkcy4pXG4gKlxuICogIyBXaHkgdGhlIGZhY3RvcnkgbGl2ZXMgaW4gdGhlIFNBTEVTIHBhY2thZ2VcbiAqXG4gKiBGb3VyIG9mIHRoZSBmaXZlIGhvc3Qgb2JqZWN0cyBcdTIwMTQgYGNybV9sZWFkYCwgYGNybV9jb250YWN0YCwgYGNybV9hY2NvdW50YCxcbiAqIGBjcm1fb3Bwb3J0dW5pdHlgIFx1MjAxNCBhcmUgc2FsZXMnLCBhcyBpcyB0aGUgYGNybV9ldmVudGAgZXZlcnkgYWN0aW9uIHdyaXRlcy5cbiAqIFRoZSBmaWZ0aCwgYGNybV9jYXNlYCwgaXMgc2VydmljZSdzLCBhbmQgdW5kZXIgcGxhbiBpdGVtIDcgYSBzb3VyY2UgbW9yZSB0aGFuXG4gKiBvbmUgcGFja2FnZSBuZWVkcyB0YWtlcyB0aGUgbG93ZXN0IHBhY2thZ2UgYWxsIGl0cyBjb25zdW1lcnMgZGVwZW5kIG9uLiBTb1xuICogdGhlIGZhY3RvcnkgaXMgaGVyZSBhbmQgYHNyYy9zZXJ2aWNlL2FjdGlvbnMvY2FzZS1hY3Rpdml0eS5hY3Rpb25zLnRzYFxuICogaW5zdGFudGlhdGVzIHRoZSBjYXNlIHRyaXBsZSBmcm9tIGl0IGFsb25nIHRoZSBzZXJ2aWNlIC0+IHNhbGVzIGVkZ2UuIE9uZVxuICogY29weSwgbmV2ZXIgdHdvLlxuICpcbiAqICMgVGhlIHR3byBydWxlcyB0aGlzIGZhbWlseSBleGlzdHMgdG8gaG9sZFxuICpcbiAqICAxLiAqKlNjb3BlLioqIFRoZSBhY3Rpb25zIGFyZSBHRU5FUkFURUQgcGVyIG9iamVjdDogb25lIHJlZ2lzdGVyZWQgYWN0aW9uXG4gKiAgICAgcGVyIChraW5kIFx1MDBENyBvYmplY3QpLiBcdTI2RDQgTmV2ZXIgcGluIGFuIGFjdGl2aXR5IGFjdGlvbiB0byBhIHNpbmdsZSBvYmplY3QsXG4gKiAgICAgYW5kIG5ldmVyIGF1dGhvciBvbmUgd2l0aG91dCBhbiBgb2JqZWN0TmFtZWAgXHUyMDE0IHRoZSBydW50aW1lIGtleXMgdGhlXG4gKiAgICAgcmVnaXN0cnkgb24gYDxvYmplY3ROYW1lPjo8YWN0aW9uLm5hbWU+YCBhbmQgdGhlIGRpc3BhdGNoZXIgcHJvYmVzXG4gKiAgICAgYDxvYmplY3ROYW1lPmAgZmlyc3QsIHNvIGEgc2luZ2xlLW9iamVjdCBhY3Rpb24gaXMgdW5yZWFjaGFibGUgZnJvbSBldmVyeVxuICogICAgIG90aGVyIG9iamVjdCBhIHJlcCBzZWxscyB0bywgYW5kIGFuIG9iamVjdC1sZXNzIG9uZSBpcyB1bnJlYWNoYWJsZVxuICogICAgIGV2ZXJ5d2hlcmUuXG4gKiAgMi4gKipTaGFwZS4qKiBFYWNoIG9mIHRoZXNlIGFjdGlvbnMgaW5zZXJ0cyBhIHJlYWwgYGNybV9ldmVudGAsIHJlYWxcbiAqICAgICBgY3JtX2V2ZW50X2F0dGVuZGVlYCByb3dzLCBhbmQga2VlcHMgdGhlIGBzeXNfYWN0aXZpdHlgIHJvdyBwdXJlbHkgYXMgdGhlXG4gKiAgICAgdW5pZmllZC10aW1lbGluZSBwb2ludGVyIChBRFItMDA1MiBgc291cmNlX29iamVjdGAgLyBgc291cmNlX2lkYCksIHRoZVxuICogICAgIHNhbWUgd2F5IGBzZW5kX2VtYWlsYCBwb2ludHMgYXQgaXRzIGBzeXNfZW1haWxgLiBcdTI2RDQgTmV2ZXIgbW92ZSB0aGF0XG4gKiAgICAgc3RydWN0dXJlIGJhY2sgaW50byBhIGBtZXRhZGF0YWAgSlNPTiBibG9iOiBhIGJsb2IgaXMgbm90IGRhdGEgXHUyMDE0IG5vIHZpZXdcbiAqICAgICBmaWx0ZXJzIGl0LCBubyBkYXRhc2V0IGdyb3VwcyBieSBpdCwgbm8gcmVwb3J0IGNvdW50cyBpdC5cbiAqXG4gKiAjIExpdmUgcGxhdGZvcm0gd29ya2Fyb3VuZFxuICpcbiAqIGBzY2hlZHVsZV9tZWV0aW5nYCBjb2xsZWN0cyBpdHMgc3RhcnQgYXMgYSBgZGF0ZWAgKyBgdGltZWAgUEFJUiByYXRoZXIgdGhhblxuICogYXMgb25lIGBkYXRldGltZWAgcGFyYW0sIGJlY2F1c2UgYSBgZGF0ZXRpbWVgIGFjdGlvbiBwYXJhbSBjYW5ub3QgYmVcbiAqIHN1Ym1pdHRlZCBmcm9tIHRoZSBDb25zb2xlIGF0IGFsbCAob2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjNTA2MSkuIEJvdGggdGhlXG4gKiBib2R5IGFuZCB0aGUgcGFyYW0gbGlzdCBjYXJyeSB0aGUgZnVsbCByZWFzb25pbmcgYW5kIHRoZSByZXZlcnQgaW5zdHJ1Y3Rpb24uXG4gKlxuICogVGhlIHJlY2VuY3kgYnViYmxlIChgY3JtX2FjY291bnQubGFzdF9hY3Rpdml0eV9kYXRlYCxcbiAqIGBjcm1fbGVhZC5sYXN0X2NvbnRhY3RlZF9kYXRlYCwgYGNybV9jb250YWN0Lmxhc3RfY29udGFjdGVkX2RhdGVgKSBpc1xuICogZGVsaWJlcmF0ZWx5IE5PVCB3cml0dGVuIGhlcmUuIEl0IGhhbmdzIG9mZiBgY3JtX2V2ZW50YCdzIG93biBob29rLCBzbyBhblxuICogZXZlbnQgY3JlYXRlZCBmcm9tIHRoZSBjYWxlbmRhciwgZnJvbSBhbiBpbXBvcnQsIG9yIGZyb20gYSBmdXR1cmUgZmxvdyBidW1wc1xuICogcmVjZW5jeSBleGFjdGx5IGxpa2Ugb25lIGNyZWF0ZWQgZnJvbSB0aGlzIGJ1dHRvbi4gT25lIHdyaXRlciwgbm90IG9uZSBwZXJcbiAqIGVudHJ5IHBvaW50LlxuICovXG5cbi8qKlxuICogYG9iamVjdE5hbWVgIFx1MjE5MiB0aGUgb2JqZWN0J3MgREVDTEFSRUQgYG5hbWVGaWVsZGAsIGRlcml2ZWQgZnJvbSB0aGUgb2JqZWN0XG4gKiBkZWZpbml0aW9ucyByYXRoZXIgdGhhbiBoYW5kLWxpc3RlZC5cbiAqXG4gKiBcdTI2RDQgTmV2ZXIgc3RhbXAgYHJlY29yZF9sYWJlbGAgZnJvbSBgY3R4LnJlY29yZD8ubmFtZWA6IGBuYW1lYCBpcyBub3QgdGhlXG4gKiBkaXNwbGF5IGZpZWxkIG9uIGFsbW9zdCBhbnl0aGluZyBoZXJlIFx1MjAxNCBtb3N0IG9iamVjdHMgZGVjbGFyZSBhIGRpZmZlcmVudFxuICogYG5hbWVGaWVsZGAgKGBkaXNwbGF5X3RpdGxlYCwgYGZ1bGxfbmFtZWAsIGBzdWJqZWN0YCwgYGNvbnRyYWN0X251bWJlcmAsIFx1MjAyNilcbiAqIGFuZCBoYXZlIG5vIGBuYW1lYCBjb2x1bW4gYXQgYWxsLCBzbyB0aGUgbGFiZWwgbGFuZHMgYG51bGxgLlxuICpcbiAqIERlcml2aW5nIHRoZSBtYXAga2VlcHMgaXQgY29ycmVjdCB3aGVuIGFuIG9iamVjdCByZXRhcmdldHMgaXRzIGBuYW1lRmllbGRgLlxuICogVGhlIGxvb2t1cCBoYXBwZW5zIGF0IEFVVEhPUklORyB0aW1lIChlYWNoIGFjdGlvbiBrbm93cyBpdHMgb3duIG9iamVjdCksIHNvXG4gKiB0aGUgYm9keSBjYXJyaWVzIHRoZSByZXNvbHZlZCBmaWVsZCBuYW1lIHJhdGhlciB0aGFuIGEgdGFibGUgaXQgY291bGQgbWlzc1xuICogb24uXG4gKlxuICogVGhlIG9iamVjdCBkZWZpbml0aW9ucyBhcmUgcGFzc2VkIElOIHJhdGhlciB0aGFuIGltcG9ydGVkIGhlcmUsIGJlY2F1c2UgdGhlXG4gKiBmaXZlIGhvc3Qgb2JqZWN0cyBubyBsb25nZXIgbGl2ZSBpbiBvbmUgZGlyZWN0b3J5OiBgY3JtX2Nhc2VgIGlzIHNlcnZpY2Uncy5cbiAqIEEgcGFja2FnZSBoYW5kcyB7QGxpbmsgYWN0aXZpdHlBY3Rpb25zRm9yfSBpdHMgb3duIG9iamVjdCBiYXJyZWwsIHNvIHRoZSBtYXBcbiAqIGlzIHN0aWxsIGRlcml2ZWQgZnJvbSB0aGUgcmVhbCBkZWZpbml0aW9uIG9mIHRoZSBvYmplY3QgYmVpbmcgYm91bmQgYW5kIG5vXG4gKiBwYWNrYWdlIHJlYWNoZXMgaW50byBhbm90aGVyJ3MuXG4gKi9cbnR5cGUgTmFtZUZpZWxkU291cmNlID0geyBuYW1lPzogdW5rbm93bjsgbmFtZUZpZWxkPzogdW5rbm93biB9O1xuXG5jb25zdCBuYW1lRmllbGRNYXAgPSAob2JqZWN0RGVmczogUmVjb3JkPHN0cmluZywgTmFtZUZpZWxkU291cmNlPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT5cbiAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC52YWx1ZXMob2JqZWN0RGVmcylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChvKTogbyBpcyB7IG5hbWU6IHN0cmluZzsgbmFtZUZpZWxkOiBzdHJpbmcgfSA9PlxuICAgICAgICAgIHR5cGVvZiBvPy5uYW1lID09PSAnc3RyaW5nJyAmJiB0eXBlb2Ygbz8ubmFtZUZpZWxkID09PSAnc3RyaW5nJyxcbiAgICAgIClcbiAgICAgIC5tYXAoKG8pID0+IFtvLm5hbWUsIG8ubmFtZUZpZWxkXSksXG4gICk7XG5cbi8qKlxuICogVGhlIG9iamVjdHMgYSByZXAgY2FuIGxvZyBhbiBpbnRlcmFjdGlvbiBhZ2FpbnN0LCBhbmQgdGhlIGBjcm1fZXZlbnRgXG4gKiBsb29rdXAgdGhhdCByZWNvcmRzIHRoZSBsaW5rLlxuICpcbiAqIFRoZSBrZXlzIGFyZSBleGFjdGx5IGBjcm1fZXZlbnQucmVsYXRlZF90b190eXBlYCdzIG9wdGlvbnNcbiAqIChgUkVMQVRFRF9UT19UWVBFX09QVElPTlNgKSwgYW5kIHRoZSB2YWx1ZXMgZXhhY3RseSB0aGUgYHJlbGF0ZWRfdG9fKmBcbiAqIGxvb2t1cHMgdGhhdCBiYWNrIHRoZW0uIGB0ZXN0L2FjdGl2aXR5LWFjdGlvbnMudGVzdC50c2AgcGlucyB0aGF0IGFncmVlbWVudFxuICogYWdhaW5zdCB0aGUgb2JqZWN0IGRlZmluaXRpb24sIHNvIGFkZGluZyBhIHNpeHRoIGByZWxhdGVkX3RvXypgIGZpZWxkXG4gKiB3aXRob3V0IGV4dGVuZGluZyB0aGlzIG1hcCBmYWlscyBpbiBDSSBpbnN0ZWFkIG9mIHByb2R1Y2luZyBhbiBhY3Rpb24gdGhhdFxuICogd3JpdGVzIGFuIGV2ZW50IGxpbmtlZCB0byBub3RoaW5nLlxuICovXG5leHBvcnQgY29uc3QgQUNUSVZJVFlfVEFSR0VUUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgY3JtX2xlYWQ6ICdyZWxhdGVkX3RvX2xlYWQnLFxuICBjcm1fY29udGFjdDogJ3JlbGF0ZWRfdG9fY29udGFjdCcsXG4gIGNybV9hY2NvdW50OiAncmVsYXRlZF90b19hY2NvdW50JyxcbiAgY3JtX29wcG9ydHVuaXR5OiAncmVsYXRlZF90b19vcHBvcnR1bml0eScsXG4gIGNybV9jYXNlOiAncmVsYXRlZF90b19jYXNlJyxcbn07XG5cbi8qKiBKUyBzdHJpbmcgbGl0ZXJhbCwgc2FmZWx5IHF1b3RlZCBmb3Igc3BsaWNpbmcgaW50byBhIGJvZHkgc291cmNlLiAqL1xuY29uc3QgbGl0ID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXG4vKipcbiAqIFRoZSBhY3RpbmcgdXNlcidzIGRpc3BsYXkgbmFtZSwgYXMgYWN0aW9uLWJvZHkgU09VUkNFIFRFWFQuXG4gKlxuICogU2hhcmVkIHZlcmJhdGltIGJ5IGV2ZXJ5IGJvZHkgdGhhdCB3cml0ZXMgYHN5c19hY3Rpdml0eS5hY3Rvcl9uYW1lYDogdGhlXG4gKiBhY3Rpdml0eSBmYW1pbHkgYmVsb3cgYW5kIGBzZW5kX2VtYWlsYCBpbiBgY29udGFjdC5hY3Rpb25zLnRzYC5cbiAqXG4gKiAjIFdoeSBhIHN0cmluZyBhbmQgbm90IGEgZnVuY3Rpb25cbiAqXG4gKiBBbiBhY3Rpb24gYm9keSBpcyBzaGlwcGVkIEJPRFktT05MWSBhbmQgZXZhbHVhdGVkIGluIGEgUXVpY2tKUyBzYW5kYm94IHdpdGhcbiAqIG5vIG1vZHVsZSBzY29wZSwgc28gYSBzaGFyZWQgaGVscGVyIGNhbGxlZCBmcm9tIGEgYm9keSBpcyBub3QgYSBjbG9zdXJlIGF0XG4gKiBydW50aW1lIFx1MjAxNCBpdCBpcyBhIGBSZWZlcmVuY2VFcnJvcmAgKGB0ZXN0L2hlbHBlcnMvYWN0aW9uLXNhbmRib3gudHNgIHN0YXRlc1xuICogdGhlIHNhbWUgY29uc3RyYWludCBmb3IgdGhlIHNoYXJlZCBsaW5lLWl0ZW0gcHJpY2UgZmlsbCkuIEEgc3RyaW5nIHNwbGljZWQgYXRcbiAqIEFVVEhPUklORyB0aW1lLCB3aGlsZSBOb2RlIGJ1aWxkcyB0aGUgbWV0YWRhdGEsIGhhcyBubyBzdWNoIHByb2JsZW06IHdoYXRcbiAqIHJlYWNoZXMgdGhlIHNhbmRib3ggaXMgb25lIHNlbGYtY29udGFpbmVkIGJvZHkgd2l0aCB0aGlzIHRleHQgaW5saW5lZCxcbiAqIGV4YWN0bHkgYXMgaWYgaXQgaGFkIGJlZW4gdHlwZWQgdGhlcmUuIGB0ZXN0L2FjdGlvbi1zYW5kYm94LnRlc3QudHNgIGV4ZWN1dGVzXG4gKiBib3RoIGJvZGllcyB1bmRlciB0aGUgcmVhbCBydW5uZXIgQU5EIHBpbnMgdGhhdCBib3RoIHN0aWxsIGNvbnRhaW4gdGhpc1xuICogY29uc3RhbnQsIHNvIHRoZSB0d28gY2FsbCBzaXRlcyBjYW5ub3QgZHJpZnQgaW50byBkaXNhZ3JlZWluZy5cbiAqXG4gKiAjIENvbnRyYWN0IGZvciBhIHNwbGljZSBzaXRlXG4gKlxuICogU3BsaWNlIGludG8gYSBib2R5IHRoYXQgaGFzIGFscmVhZHkgZGVjbGFyZWQgYHVzZXJJZGAgKGBjdHgudXNlcj8uaWQgPz8gbnVsbGApXG4gKiBhbmQgd2hvc2UgYWN0aW9uIGRlY2xhcmVzIGBhcGkucmVhZGAuIEFmdGVyd2FyZHMgYGFjdG9yTmFtZWAgaG9sZHMgYVxuICogbm9uLWJsYW5rIGRpc3BsYXkgbmFtZSBcdTIwMTQgdGhlIGlkIG9ubHkgYXMgYSBsYXN0IHJlc29ydCwgbmV2ZXIgYG51bGxgLlxuICovXG5leHBvcnQgY29uc3QgQUNUT1JfTkFNRV9SRVNPTFVUSU9OX1NPVVJDRSA9IGAvLyBUaGUgYWN0aW5nIHVzZXIncyBESVNQTEFZIG5hbWUsIGZvciB0aGUgc3lzX2FjdGl2aXR5IHJvdyAoIzY3MyAvICM2NzgpLlxuICAgICAgLy9cbiAgICAgIC8vIFBMQVRGT1JNIFdPUktBUk9VTkQuIFxcYGN0eC51c2VyLm5hbWVcXGAgaXMgbm90IGEgZGlzcGxheSBuYW1lIG9uIHRoZVxuICAgICAgLy8gZGlzcGF0Y2ggcGF0aCB0aGUgQ29uc29sZSB1c2VzOiB0aGUgUkVTVCBhY3Rpb24gZGlzcGF0Y2hlciBidWlsZHMgdGhlXG4gICAgICAvLyBib2R5J3MgdXNlciBhcyBcXGB7IGlkOiBlYy51c2VySWQsIG5hbWU6IGVjLnVzZXJJZCwgXHUyMDI2IH1cXGAgXHUyMDE0IHRoZSBrZXkgaXNcbiAgICAgIC8vIHByZXNlbnQgYW5kIGNhcnJpZXMgdGhlIHJhdyBpZCwgc28gXFxgY3R4LnVzZXI/Lm5hbWVcXGAgcmVhZHMgYXMgYVxuICAgICAgLy8gcGxhdXNpYmxlIHN0cmluZyBhbmQgc2lsZW50bHkgd3JvdGUgaWRzIGxpa2VcbiAgICAgIC8vIFwiZ3JERXlMb0lnbnVuSjJNN1kybXVMZ2N1UWJEVVQwczJcIiBpbnRvIFxcYHN5c19hY3Rpdml0eS5hY3Rvcl9uYW1lXFxgXG4gICAgICAvLyAoQG9iamVjdHN0YWNrL3J1bnRpbWUgMTcuMC4wLXJjLjIsIGRpc3QvaW5kZXguanM6NTM5Ny01Mzk5KS4gVGhlIE1DUFxuICAgICAgLy8gZGlzcGF0Y2hlciBkb2VzIHRyeSBhIGRpc3BsYXkgbmFtZSBmaXJzdFxuICAgICAgLy8gKFxcYGVjLnVzZXJOYW1lID8/IGVjLnVzZXJEaXNwbGF5TmFtZSA/PyBlYy51c2VySWRcXGAsIGRpc3QvaW5kZXguanM6MTc3NilcbiAgICAgIC8vIGJ1dCBub3RoaW5nIGluIHRoZSBpbnN0YWxsZWQgcGxhdGZvcm0gZXZlciBwb3B1bGF0ZXMgZWl0aGVyIGZpZWxkLCBzb1xuICAgICAgLy8gaXQgZmFsbHMgYmFjayB0byB0aGUgaWQgdG9vLlxuICAgICAgLy9cbiAgICAgIC8vIFNvIHRoZSBuYW1lIGlzIHJlc29sdmVkIEhFUkUsIGZyb20gXFxgc3lzX3VzZXIubmFtZVxcYCAodGhlIGNvbHVtbiB0aGVcbiAgICAgIC8vIHBsYXRmb3JtIGl0c2VsZiB0cmVhdHMgYXMgdGhlIHByb2ZpbGUgZGlzcGxheSBuYW1lKSwgd2l0aCB0aGUgaWQga2VwdFxuICAgICAgLy8gYXMgdGhlIGxhc3QgcmVzb3J0IFx1MjAxNCBhbiBvcGFxdWUgaWQgaXMgYmFkLCBhIGJsYW5rIGFjdG9yIGlzIHdvcnNlLlxuICAgICAgLy8gQSBuYW1lIHRoYXQgZGlmZmVycyBmcm9tIHRoZSBpZCBpcyB0YWtlbiBhcyBhbHJlYWR5LXJlc29sdmVkLCB3aGljaCBpc1xuICAgICAgLy8gd2hhdCBtYWtlcyB0aGlzIG9uZSBxdWVyeSBhbmQgbm90IGEgcXVlcnkgcGVyIGFjdGl2aXR5IHdyaXRlLlxuICAgICAgLy9cbiAgICAgIC8vIERFTEVURSBUSElTIG9uY2UgdGhlIHBsYXRmb3JtIGRlbGl2ZXJzIGEgZGlzcGxheSBuYW1lIG9uIGN0eC51c2VyLm5hbWVcbiAgICAgIC8vIGZvciBSRVNULWRpc3BhdGNoZWQgYWN0aW9uIGJvZGllczogZXZlcnkgc3BsaWNlIHNpdGUgY29sbGFwc2VzIGJhY2sgdG9cbiAgICAgIC8vIFxcYGFjdG9yX25hbWU6IGN0eC51c2VyPy5uYW1lXFxgIChvYmplY3RzdGFjay1haS9vYmplY3RzdGFjayM1MzcyKS5cbiAgICAgIGNvbnN0IGN0eE5hbWUgPSBjdHgudXNlcj8ubmFtZSA/IFN0cmluZyhjdHgudXNlci5uYW1lKS50cmltKCkgOiAnJztcbiAgICAgIGxldCBhY3Rvck5hbWUgPSBjdHhOYW1lICYmIGN0eE5hbWUgIT09IHVzZXJJZCA/IGN0eE5hbWUgOiAnJztcbiAgICAgIGlmICghYWN0b3JOYW1lICYmIHVzZXJJZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgY3R4LmFwaS5vYmplY3QoJ3N5c191c2VyJykuZmluZCh7XG4gICAgICAgICAgICB3aGVyZTogeyBpZDogdXNlcklkIH0sXG4gICAgICAgICAgICBmaWVsZHM6IFsnbmFtZSddLFxuICAgICAgICAgICAgdG9wOiAxLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHVzZXJzID0gQXJyYXkuaXNBcnJheShmb3VuZCkgPyBmb3VuZCA6IChmb3VuZD8ucmVjb3JkcyA/PyBbXSk7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB1c2Vycy5sZW5ndGggJiYgdXNlcnNbMF0ubmFtZSA/IFN0cmluZyh1c2Vyc1swXS5uYW1lKS50cmltKCkgOiAnJztcbiAgICAgICAgICBpZiAocmVzb2x2ZWQpIGFjdG9yTmFtZSA9IHJlc29sdmVkO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gQSBkZW5pZWQgb3IgdW5hdmFpbGFibGUgc3lzX3VzZXIgcmVhZCBtdXN0IG5vdCBmYWlsIHRoZSBsb2cgXHUyMDE0IHRoZVxuICAgICAgICAgIC8vIGludGVyYWN0aW9uIHRoZSByZXAganVzdCByZWNvcmRlZCBtYXR0ZXJzIG1vcmUgdGhhbiBpdHMgbGFiZWwuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghYWN0b3JOYW1lKSBhY3Rvck5hbWUgPSB1c2VySWQ7YDtcblxuLyoqXG4gKiBUaGUgYXV0aG9yZWQgZGlmZmVyZW5jZSBiZXR3ZWVuIG9uZSBhY3Rpdml0eSBhY3Rpb24gYW5kIHRoZSBuZXh0LlxuICpcbiAqIEV2ZXJ5dGhpbmcgdGhlIHZhcmlhbnRzIHNoYXJlIGxpdmVzIGluIHtAbGluayBhY3Rpdml0eUFjdGlvbn07IHRoaXMgdHlwZSBpc1xuICogdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygd2hhdCBhIHZhcmlhbnQgaXMgc3RpbGwgYWxsb3dlZCB0byBkaWZmZXIgb24uIFx1MjZENCBOZXZlclxuICogaGFuZC1jb3B5IG9uZSB2YXJpYW50IGludG8gYW5vdGhlcjogYGxvZ19jYWxsYCBhbmQgYGxvZ19tZWV0aW5nYCB3ZXJlXG4gKiBuZWFyLXZlcmJhdGltIGNvcGllcyBvbmNlIFx1MjAxNCBpZGVudGljYWwgYm9kaWVzIGFwYXJ0IGZyb20gYSBzdW1tYXJ5IHByZWZpeCBhbmRcbiAqIGEgbWV0YWRhdGEga2V5IFx1MjAxNCBhbmQgZHJpZnRlZCBpbnRvIGRpc2FncmVlaW5nIGFib3V0IHdoZXRoZXIgYGR1cmF0aW9uYCBpc1xuICogcmVxdWlyZWQuXG4gKi9cbnR5cGUgQWN0aXZpdHlTcGVjID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgLyoqIGBjcm1fZXZlbnQudHlwZWAgZm9yIHRoZSByb3cgdGhpcyBhY3Rpb24gd3JpdGVzLiAqL1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgLyoqIGBjcm1fZXZlbnQuc3RhdHVzYDogYGhlbGRgIGZvciBzb21ldGhpbmcgdGhhdCBoYXBwZW5lZCwgYHBsYW5uZWRgIGZvciBhIGJvb2tpbmcuICovXG4gIGV2ZW50U3RhdHVzOiAnaGVsZCcgfCAncGxhbm5lZCc7XG4gIC8qKiBTdGFtcGVkIGluIGZyb250IG9mIHRoZSBhY3Rpdml0eSBzdW1tYXJ5OyBgJydgIGZvciBjYWxscy4gKi9cbiAgc3VtbWFyeVByZWZpeDogc3RyaW5nO1xuICAvKiogU3ViamVjdCB1c2VkIHdoZW4gdGhlIHVzZXIgc3VibWl0cyB0aGUgZm9ybSB3aXRoIHRoZSBmaWVsZCBibGFuay4gKi9cbiAgZGVmYXVsdFN1YmplY3Q6IHN0cmluZztcbiAgc3ViamVjdExhYmVsOiBzdHJpbmc7XG4gIG5vdGVzTGFiZWw6IHN0cmluZztcbiAgLyoqIEJvb2tlZC1pbi10aGUtZnV0dXJlIHZhcmlhbnRzIGNvbGxlY3QgYSBzdGFydCBkYXRlICsgd2FsbCBjbG9jayBhbmQgYSBsb2NhdGlvbi4gKi9cbiAgY29sbGVjdHNTY2hlZHVsZT86IGJvb2xlYW47XG4gIHN1Y2Nlc3NNZXNzYWdlOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEJ1aWxkIG9uZSBhY3Rpdml0eSBhY3Rpb24sIGJvdW5kIHRvIG9uZSBvYmplY3QuXG4gKlxuICogYGR1cmF0aW9uYCBpcyBPUFRJT05BTCBldmVyeXdoZXJlLiBJdCB3YXMgYHJlcXVpcmVkOiB0cnVlYCBmb3IgY2FsbHMgYW5kXG4gKiBgcmVxdWlyZWQ6IGZhbHNlYCBmb3IgbWVldGluZ3Mgd2l0aCBub3RoaW5nIGRvY3VtZW50aW5nIHRoZSBzcGxpdDsgb3B0aW9uYWxcbiAqIGlzIHRoZSBkaXJlY3Rpb24gdGhhdCBrZWVwcyBldmVyeSBmb3JtIHN1Ym1pdHRhYmxlLCBhbmQgaXQgaXMgdGhlIG9uZSB0aGVcbiAqIGJvZHkgaXMgd3JpdHRlbiBmb3IuXG4gKi9cbmZ1bmN0aW9uIGFjdGl2aXR5QWN0aW9uKHNwZWM6IEFjdGl2aXR5U3BlYywgb2JqZWN0TmFtZTogc3RyaW5nLCBuYW1lRmllbGQ6IHN0cmluZyk6IEFjdGlvbiB7XG4gIGNvbnN0IHJlbGF0ZWRGaWVsZCA9IEFDVElWSVRZX1RBUkdFVFNbb2JqZWN0TmFtZV07XG4gIGlmICghcmVsYXRlZEZpZWxkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYGFjdGl2aXR5QWN0aW9uOiAnJHtvYmplY3ROYW1lfScgaXMgbm90IGFuIGFjdGl2aXR5IHRhcmdldCBcdTIwMTQgZXh0ZW5kIEFDVElWSVRZX1RBUkdFVFMgYCArXG4gICAgICAgICd0b2dldGhlciB3aXRoIGNybV9ldmVudC5yZWxhdGVkX3RvX3R5cGUgYW5kIGl0cyByZWxhdGVkX3RvXyogbG9va3VwLicsXG4gICAgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6IHNwZWMubmFtZSxcbiAgICBsYWJlbDogc3BlYy5sYWJlbCxcbiAgICAvLyBPYmplY3Qtc2NvcGVkLCBvbmUgcmVnaXN0cmF0aW9uIHBlciBvYmplY3QuIFRoZSBydW50aW1lIHJlZ2lzdGVycyBhIGJvZHlcbiAgICAvLyBhY3Rpb24gdW5kZXIgYDxvYmplY3ROYW1lPjo8bmFtZT5gIGFuZCB0aGUgZGlzcGF0Y2hlciBwcm9iZXNcbiAgICAvLyBgPG9iamVjdE5hbWU+YCB0aGVuIGAqYDsgYSBib2R5IGFjdGlvbiB3aXRoIG5vIG9iamVjdE5hbWUgbGFuZHMgdW5kZXIgYVxuICAgIC8vICdnbG9iYWwnIGtleSBub3RoaW5nIGV2ZXIgcHJvYmVzIChcIkFjdGlvbiAnbG9nX2NhbGwnIG9uIG9iamVjdCAnKicgbm90XG4gICAgLy8gZm91bmRcIiwgdmVyaWZpZWQgMjAyNi0wNy0yOCkuIFx1MjZENCBOZXZlciBhdXRob3IgYW4gb2JqZWN0LWxlc3MgYm9keSBhY3Rpb24uXG4gICAgb2JqZWN0TmFtZSxcbiAgICBpY29uOiBzcGVjLmljb24sXG4gICAgLy8gc2NyaXB0LCBub3QgbW9kYWw6IG1vZGFsIHN1Ym1pdHMgZGllIG9uIEdFVCAvYXBpL3YxL21ldGEvb2JqZWN0Lzx0YXJnZXQ+XG4gICAgLy8gXHUyMTkyIDQwMCBpbiAxNi4xLjA7IHNjcmlwdCBhY3Rpb25zIFBPU1QgL2FwaS92MS9hY3Rpb25zLy4uLiBhbmQgZXhlY3V0ZS5cbiAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICBib2R5OiB7XG4gICAgICBsYW5ndWFnZTogJ2pzJyxcbiAgICAgIHNvdXJjZTogYFxuICAgICAgY29uc3QgT0JKRUNUX05BTUUgPSAke2xpdChvYmplY3ROYW1lKX07XG4gICAgICBjb25zdCBSRUxBVEVEX0ZJRUxEID0gJHtsaXQocmVsYXRlZEZpZWxkKX07XG4gICAgICBjb25zdCBOQU1FX0ZJRUxEID0gJHtsaXQobmFtZUZpZWxkKX07XG4gICAgICBjb25zdCBFVkVOVF9UWVBFID0gJHtsaXQoc3BlYy5ldmVudFR5cGUpfTtcbiAgICAgIGNvbnN0IEVWRU5UX1NUQVRVUyA9ICR7bGl0KHNwZWMuZXZlbnRTdGF0dXMpfTtcblxuICAgICAgY29uc3QgcmVjb3JkID0gY3R4LnJlY29yZCA/PyB7fTtcbiAgICAgIGNvbnN0IHJlY29yZElkID0gY3R4LnJlY29yZElkID8/IHJlY29yZC5pZCA/PyBudWxsO1xuICAgICAgY29uc3QgdXNlcklkID0gY3R4LnVzZXI/LmlkID8/IG51bGw7XG4gICAgICBjb25zdCBub3dJc28gPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG5cbiAgICAgICR7QUNUT1JfTkFNRV9SRVNPTFVUSU9OX1NPVVJDRX1cblxuICAgICAgY29uc3Qgc3ViamVjdCA9IGlucHV0LnN1YmplY3QgPyBTdHJpbmcoaW5wdXQuc3ViamVjdCkgOiAke2xpdChzcGVjLmRlZmF1bHRTdWJqZWN0KX07XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IGlucHV0LmR1cmF0aW9uID8gTnVtYmVyKGlucHV0LmR1cmF0aW9uKSA6IDA7XG4gICAgICBjb25zdCBub3RlcyA9IGlucHV0Lm5vdGVzID8gU3RyaW5nKGlucHV0Lm5vdGVzKSA6ICcnO1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBpbnB1dC5sb2NhdGlvbiA/IFN0cmluZyhpbnB1dC5sb2NhdGlvbikgOiAnJztcblxuICAgICAgLy8gQSBib29raW5nIHN0YXRlcyBpdHMgb3duIHN0YXJ0OyBhIGxvZyBpcyBcImp1c3Qgbm93XCIuXG4gICAgICAvL1xuICAgICAgLy8gV09SS0FST1VORCBmb3Igb2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjNTA2MSBcdTIwMTQgdGhlIHN0YXJ0IGlzIGNvbGxlY3RlZFxuICAgICAgLy8gYXMgYSBDQUxFTkRBUiBEQVkgKyBhIFdBTEwgQ0xPQ0sgKFxcYHN0YXJ0X2RhdGVcXGAgLyBcXGBzdGFydF90aW1lXFxgKSBhbmRcbiAgICAgIC8vIGpvaW5lZCBoZXJlLCBpbnN0ZWFkIG9mIGFzIG9uZSBcXGB0eXBlOiAnZGF0ZXRpbWUnXFxgIHBhcmFtLiBBIGRhdGV0aW1lXG4gICAgICAvLyBwYXJhbSBpcyB1bnVzYWJsZSBmcm9tIHRoZSBDb25zb2xlOiBpdCByZW5kZXJzIGFzIGEgem9uZS1sZXNzXG4gICAgICAvLyBcXGA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCI+XFxgIGFuZCBQT1NUcyB0aGUgcmF3IHZhbHVlXG4gICAgICAvLyAoXCIyMDI2LTA4LTEwVDE1OjAwXCIpLCB3aGljaCB0aGUgcnVudGltZSdzIGFjdGlvbi1wYXJhbSB2YWxpZGF0b3IgcmVqZWN0c1xuICAgICAgLy8gd2l0aCA0MDAgXCJleHBlY3RlZCBhbiBJU08tODYwMSBpbnN0YW50IHdpdGggZXhwbGljaXQgem9uZVwiIFx1MjAxNCBubyB1c2VyXG4gICAgICAvLyBpbnB1dCBjYW4gcGFzcy4gXFxgZGF0ZVxcYCBhbmQgXFxgdGltZVxcYCBhcmUgdGhlIHR3byBwYXJhbSB0eXBlcyB3aG9zZVxuICAgICAgLy8gcmVuZGVyZXIgb3V0cHV0IChcIllZWVktTU0tRERcIiAvIFwiSEg6TU1cIikgdGhlIHZhbGlkYXRvciBhY2NlcHRzIHZlcmJhdGltLFxuICAgICAgLy8gc28gdGhlIHBhaXIgaXMgc3VibWl0dGFibGUgd2hlcmUgdGhlIHNpbmdsZSBkYXRldGltZSBuZXZlciB3YXMuXG4gICAgICAvL1xuICAgICAgLy8gVElNRVpPTkU6IHRoZSB3YWxsIGNsb2NrIGlzIGludGVycHJldGVkIGFzICoqVVRDKiosIGFuZCBib3RoIHBhcmFtXG4gICAgICAvLyBsYWJlbHMgc2F5IHNvLiBVVEMgaXMgdGhlIG9ubHkgem9uZSB0aGlzIGJvZHkgY2FuIGFwcGx5IGRldGVybWluaXN0aWNhbGx5XG4gICAgICAvLyBcdTIwMTQgdGhlIHNhbmRib3ggY29udGV4dCBjYXJyaWVzIG5vIHVzZXIgb3Igb3JnIHRpbWV6b25lIChcXGBjdHgudXNlclxcYCBpc1xuICAgICAgLy8gaWQvbmFtZS9lbWFpbCksIGFuZCByZWFkaW5nIHRoZSBzZXJ2ZXIncyBsb2NhbCB6b25lIHdvdWxkIG1ha2UgdGhlIHNhbWVcbiAgICAgIC8vIGlucHV0IG1lYW4gZGlmZmVyZW50IGluc3RhbnRzIG9uIGRpZmZlcmVudCBob3N0cyBhbmQgaW4gdGVzdHMuIEV2ZXJ5dGhpbmdcbiAgICAgIC8vIGVsc2UgdGhpcyBhcHAgd3JpdGVzIGlzIGxpa2V3aXNlIGEgVVRDIGluc3RhbnQgKFxcYG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxcYCkuXG4gICAgICAvL1xuICAgICAgLy8gV2hlbiAjNTA2MSBsYW5kcyAodGhlIENvbnNvbGUgc2VyaWFsaXppbmcgZGF0ZXRpbWUtbG9jYWwgaW4gdGhlXG4gICAgICAvLyBicm93c2VyJ3Mgem9uZSksIHRoaXMgcmV2ZXJ0cyB0byBPTkUgXFxgdHlwZTogJ2RhdGV0aW1lJ1xcYCBwYXJhbSBhbmQgdGhlXG4gICAgICAvLyB6b25lIGJlY29tZXMgdGhlIHVzZXIncyBvd24gXHUyMDE0IHNlZSBcXGBjb2xsZWN0c1NjaGVkdWxlXFxgIGluIHRoaXMgZmlsZS5cbiAgICAgIGxldCBzdGFydElzbyA9IG5vd0lzbztcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGlucHV0LnN0YXJ0X2RhdGUgPyBTdHJpbmcoaW5wdXQuc3RhcnRfZGF0ZSkudHJpbSgpIDogJyc7XG4gICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGlucHV0LnN0YXJ0X3RpbWUgPyBTdHJpbmcoaW5wdXQuc3RhcnRfdGltZSkudHJpbSgpIDogJzAwOjAwJztcbiAgICAgICAgLy8gJ0hIOk1NJyBhbmQgJ0hIOk1NOlNTJyBhcmUgYm90aCBzaGFwZXMgdGhlIHZhbGlkYXRvciBsZXRzIHRocm91Z2guXG4gICAgICAgIGNvbnN0IGNsb2NrID0gc3RhcnRUaW1lLmxlbmd0aCA9PT0gNSA/IHN0YXJ0VGltZSArICc6MDAnIDogc3RhcnRUaW1lO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZShzdGFydERhdGUgKyAnVCcgKyBjbG9jayArICcuMDAwWicpO1xuICAgICAgICAvLyBBbiB1bnBhcnNlYWJsZSB2YWx1ZSBmYWxscyBiYWNrIHRvIG5vdyByYXRoZXIgdGhhbiB3cml0aW5nIE5hTiBpbnRvIGFcbiAgICAgICAgLy8gcmVxdWlyZWQgY29sdW1uLlxuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKSBzdGFydElzbyA9IHBhcnNlZC50b0lTT1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICAvLyAxLiB0aGUgaW50ZXJhY3Rpb24gaXRzZWxmLCBhcyBhIHF1ZXJ5YWJsZSByZWNvcmQuXG4gICAgICBjb25zdCBldmVudERvYyA9IHtcbiAgICAgICAgc3ViamVjdDogc3ViamVjdCxcbiAgICAgICAgdHlwZTogRVZFTlRfVFlQRSxcbiAgICAgICAgc3RhdHVzOiBFVkVOVF9TVEFUVVMsXG4gICAgICAgIHN0YXJ0X2RhdGV0aW1lOiBzdGFydElzbyxcbiAgICAgICAgLy8gTG9hZC1iZWFyaW5nLCBub3QgZGVjb3JhdGlvbjogYW4gYWN0aW9uIGJvZHkgZXhlY3V0ZXMgd2l0aFxuICAgICAgICAvLyBpc1N5c3RlbTogdHJ1ZSAocnVudGltZSBidWlsZEFjdGlvbkV4ZWN1dGlvbkNvbnRleHQpLCB3aGljaFxuICAgICAgICAvLyBzaG9ydC1jaXJjdWl0cyB0aGUgc2VjdXJpdHkgbWlkZGxld2FyZSBcdTIwMTQgc28gdGhlIGluc2VydC10aW1lXG4gICAgICAgIC8vIGF1dG8tc3RhbXAgb2Ygb3duZXJfaWQgbmV2ZXIgZmlyZXMgaGVyZS4gT21pdHRpbmcgaXQgd291bGQgbGFuZCB0aGVcbiAgICAgICAgLy8gaW50ZXJhY3Rpb24gb3duZXJsZXNzLCBpLmUuIGludmlzaWJsZSBpbiBcIk15IFx1MjAyNlwiIGFuZCB1bmVkaXRhYmxlIHVuZGVyXG4gICAgICAgIC8vIGEgcHJpdmF0ZSBPV0QgKCM1NDgsIHRoZSAjNjIyIGZhaWx1cmUgbW9kZSkuXG4gICAgICAgIG93bmVyX2lkOiB1c2VySWQsXG4gICAgICAgIHJlbGF0ZWRfdG9fdHlwZTogT0JKRUNUX05BTUUsXG4gICAgICB9O1xuICAgICAgaWYgKGR1cmF0aW9uID4gMCkgZXZlbnREb2MuZHVyYXRpb25fbWludXRlcyA9IGR1cmF0aW9uO1xuICAgICAgaWYgKGxvY2F0aW9uKSBldmVudERvYy5sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgICAgaWYgKG5vdGVzKSBldmVudERvYy5kZXNjcmlwdGlvbiA9IG5vdGVzO1xuICAgICAgaWYgKHJlY29yZElkKSBldmVudERvY1tSRUxBVEVEX0ZJRUxEXSA9IHJlY29yZElkO1xuICAgICAgY29uc3QgZXZlbnQgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2V2ZW50JykuaW5zZXJ0KGV2ZW50RG9jKTtcbiAgICAgIGNvbnN0IGV2ZW50SWQgPSBldmVudD8uaWQgPz8gbnVsbDtcblxuICAgICAgLy8gMi4gYXR0ZW5kZWVzLCBhcyByb3dzIFx1MjAxNCB0aGUgcG9pbnQgb2YgIzU5Mi5cbiAgICAgIC8vIEEgbXVsdGktbG9va3VwIHBhcmFtIG1heSBhcnJpdmUgYXMgYW4gYXJyYXkgb3IsIG9uIGEgc3VyZmFjZSB0aGF0XG4gICAgICAvLyByZW5kZXJzIGl0IHNpbmdsZS12YWx1ZWQsIGFzIG9uZSBzY2FsYXIuIE5vcm1hbGlzaW5nIGJvdGggaXMgbm90IGFcbiAgICAgIC8vIGxlbmllbnQgcGFyc2Ugb2YgYXV0aG9yZWQgbWV0YWRhdGE6IGl0IGlzIHRoZSBjb25zb2xlJ3Mgb3duIGlucHV0XG4gICAgICAvLyBzaGFwZSwgd2hpY2ggdGhpcyBib2R5IGRvZXMgbm90IGNvbnRyb2wuXG4gICAgICBjb25zdCB0b0xpc3QgPSAodikgPT4ge1xuICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gJycpIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodikgPyB2IDogW3ZdO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGF0dGVuZGVlcyA9IFtdO1xuICAgICAgaWYgKHVzZXJJZCkge1xuICAgICAgICBhdHRlbmRlZXMucHVzaCh7IGF0dGVuZGVlX3R5cGU6ICd1c2VyJywgc3lzX3VzZXI6IHVzZXJJZCwgaXNfb3JnYW5pemVyOiB0cnVlLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSByZWNvcmQgdGhlIGFjdGlvbiB3YXMgZmlyZWQgZnJvbSBJUyBhbiBhdHRlbmRlZSB3aGVuIGl0IGlzIGFcbiAgICAgIC8vIHBlcnNvbi4gT24gYW4gYWNjb3VudCAvIG9wcG9ydHVuaXR5IC8gY2FzZSBpdCBpcyBub3QsIHNvIG5vdGhpbmcgaXNcbiAgICAgIC8vIGludmVudGVkIGZvciBpdCBcdTIwMTQgdGhlIGV2ZW50J3MgcmVsYXRlZF90b18qIGxpbmsgYWxyZWFkeSByZWNvcmRzIGl0LlxuICAgICAgaWYgKE9CSkVDVF9OQU1FID09PSAnY3JtX2NvbnRhY3QnICYmIHJlY29yZElkKSB7XG4gICAgICAgIGF0dGVuZGVlcy5wdXNoKHsgYXR0ZW5kZWVfdHlwZTogJ2NvbnRhY3QnLCBjcm1fY29udGFjdDogcmVjb3JkSWQsIHJlc3BvbnNlOiAnbm9fcmVzcG9uc2UnIH0pO1xuICAgICAgfVxuICAgICAgaWYgKE9CSkVDVF9OQU1FID09PSAnY3JtX2xlYWQnICYmIHJlY29yZElkKSB7XG4gICAgICAgIGF0dGVuZGVlcy5wdXNoKHsgYXR0ZW5kZWVfdHlwZTogJ2xlYWQnLCBjcm1fbGVhZDogcmVjb3JkSWQsIHJlc3BvbnNlOiAnbm9fcmVzcG9uc2UnIH0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjIG9mIHRvTGlzdChpbnB1dC5hdHRlbmRlZV9jb250YWN0cykpIHtcbiAgICAgICAgYXR0ZW5kZWVzLnB1c2goeyBhdHRlbmRlZV90eXBlOiAnY29udGFjdCcsIGNybV9jb250YWN0OiBTdHJpbmcoYyksIHJlc3BvbnNlOiAnbm9fcmVzcG9uc2UnIH0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB1IG9mIHRvTGlzdChpbnB1dC5hdHRlbmRlZV91c2VycykpIHtcbiAgICAgICAgYXR0ZW5kZWVzLnB1c2goeyBhdHRlbmRlZV90eXBlOiAndXNlcicsIHN5c191c2VyOiBTdHJpbmcodSksIHJlc3BvbnNlOiAnbm9fcmVzcG9uc2UnIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWVuID0ge307XG4gICAgICBjb25zdCBhdHRlbmRlZUlkcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhIG9mIGF0dGVuZGVlcykge1xuICAgICAgICBjb25zdCB3aG8gPSBhLnN5c191c2VyID8/IGEuY3JtX2NvbnRhY3QgPz8gYS5jcm1fbGVhZCA/PyAnJztcbiAgICAgICAgY29uc3Qga2V5ID0gYS5hdHRlbmRlZV90eXBlICsgJzonICsgd2hvO1xuICAgICAgICBpZiAoc2VlbltrZXldKSBjb250aW51ZTtcbiAgICAgICAgc2VlbltrZXldID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZG9jID0gT2JqZWN0LmFzc2lnbih7fSwgYSwgeyBjcm1fZXZlbnQ6IGV2ZW50SWQsIGludml0ZWRfZGF0ZTogbm93SXNvIH0pO1xuICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2V2ZW50X2F0dGVuZGVlJykuaW5zZXJ0KGRvYyk7XG4gICAgICAgIGlmIChyb3c/LmlkKSBhdHRlbmRlZUlkcy5wdXNoKHJvdy5pZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIHRoZSB1bmlmaWVkLXRpbWVsaW5lIHBvaW50ZXIuXG4gICAgICAvLyBcXGBtZXRhZGF0YVxcYCBubyBsb25nZXIgY2FycmllcyB0aGUgYXR0ZW5kZWUgbGlzdDogaXQgaXMgYSBkaXNwbGF5IGhpbnRcbiAgICAgIC8vIGJlc2lkZSBhIHJlYWwgcmVjb3JkIG5vdywgbm90IHRoZSByZWNvcmQgaXRzZWxmLiBBRFItMDA1MlxuICAgICAgLy8gc291cmNlX29iamVjdC9zb3VyY2VfaWQgaXMgdGhlIHF1ZXJ5YWJsZSBkcmlsbCB0byB0aGUgY3JtX2V2ZW50IHJvdy5cbiAgICAgIGNvbnN0IHN1bW1hcnkgPSBkdXJhdGlvbiA/IHN1YmplY3QgKyAnICgnICsgZHVyYXRpb24gKyAnIG1pbiknIDogc3ViamVjdDtcbiAgICAgIGNvbnN0IGFjdGl2aXR5ID0gYXdhaXQgY3R4LmFwaS5vYmplY3QoJ3N5c19hY3Rpdml0eScpLmluc2VydCh7XG4gICAgICAgIHR5cGU6IEVWRU5UX1NUQVRVUyA9PT0gJ2hlbGQnID8gJ2NvbXBsZXRlZCcgOiAnc2NoZWR1bGVkJyxcbiAgICAgICAgc3VtbWFyeTogJHtsaXQoc3BlYy5zdW1tYXJ5UHJlZml4KX0gKyBzdW1tYXJ5LFxuICAgICAgICBhY3Rvcl9pZDogdXNlcklkLFxuICAgICAgICBhY3Rvcl9uYW1lOiBhY3Rvck5hbWUsXG4gICAgICAgIG9iamVjdF9uYW1lOiBPQkpFQ1RfTkFNRSxcbiAgICAgICAgcmVjb3JkX2lkOiByZWNvcmRJZCxcbiAgICAgICAgLy8gIzUxNCBpdGVtIDI6IHRoZSBvYmplY3QncyBERUNMQVJFRCBuYW1lRmllbGQsIG5vdCBhIGhhcmRjb2RlZCBuYW1lLlxuICAgICAgICByZWNvcmRfbGFiZWw6IHJlY29yZFtOQU1FX0ZJRUxEXSA/PyBudWxsLFxuICAgICAgICBzb3VyY2Vfb2JqZWN0OiAnY3JtX2V2ZW50JyxcbiAgICAgICAgc291cmNlX2lkOiBldmVudElkLFxuICAgICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGtpbmQ6IEVWRU5UX1RZUEUsXG4gICAgICAgICAgZHVyYXRpb25fbWludXRlczogZHVyYXRpb24sXG4gICAgICAgICAgbm90ZXM6IG5vdGVzLFxuICAgICAgICAgIGF0dGVuZGVlX2NvdW50OiBhdHRlbmRlZUlkcy5sZW5ndGgsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIDQuIFNMQSBmaXJzdC1yZXNwb25zZSBzdGFtcCBcdTIwMTQgTk9UIGhlcmUuICM1NzUgQjIgb3JpZ2luYWxseSBzdGFtcGVkXG4gICAgICAvLyBcXGBjcm1fY2FzZS5maXJzdF9yZXNwb25zZV9kYXRlXFxgIGZyb20gdGhpcyBib2R5LCB3aGljaCBtZWFudCB0aGUgbWV0cmljXG4gICAgICAvLyB3YXMgb25seSBldmVyIHdyaXR0ZW4gd2hlbiB0aGUgaW50ZXJhY3Rpb24gd2FzIHJlY29yZGVkIHRocm91Z2ggdGhlIHR3b1xuICAgICAgLy8gYnV0dG9ucyB0aGlzIGZhY3RvcnkgYnVpbGRzOyBhbiBldmVudCBjcmVhdGVkIGFueSBvdGhlciB3YXkgbGVmdCBpdFxuICAgICAgLy8gbnVsbCwgdW5kZXIgYSBjb21tZW50IGFza2luZyBldmVyeSBmdXR1cmUgYXV0aG9yIHRvIHJlbWVtYmVyLiAjNTk1XG4gICAgICAvLyBtb3ZlZCB0aGUgc3RhbXAgdG8gXFxgZXZlbnRfYWN0aXZpdHlfYnViYmxlXFxgIGluXG4gICAgICAvLyBcXGBzcmMvc2FsZXMvb2JqZWN0cy9ldmVudC5ob29rLnRzXFxgLCB3aGljaCBhbHJlYWR5IGZpcmVzIG9uIGV4YWN0bHkgdGhlXG4gICAgICAvLyBjb25kaXRpb24gdGhhdCBtYXR0ZXJzIChcImEgaGVsZCBldmVudCwgb24gaXRzIHRyYW5zaXRpb24gaW50byBoZWxkXCIpXG4gICAgICAvLyBhbmQgYWxyZWFkeSByZXNvbHZlcyBcXGByZWxhdGVkX3RvX2Nhc2VcXGAuIFN0ZXAgMSBhYm92ZSB3cml0ZXMgdGhhdFxuICAgICAgLy8gZXZlbnQsIHNvIHRoaXMgYWN0aW9uIHN0aWxsIHN0YW1wcyB0aGUgY2FzZSBcdTIwMTQgdGhyb3VnaCBvbmUgd3JpdGVyXG4gICAgICAvLyBpbnN0ZWFkIG9mIGEgY29udmVudGlvbi4gRG8gbm90IHJlaW50cm9kdWNlIGEgY29weSBoZXJlOiB0d28gd3JpdGVyc1xuICAgICAgLy8gcmFjaW5nIG9uIGEgXCJmaXJzdFwiIHRpbWVzdGFtcCBpcyBob3cgaXQgYmVjb21lcyBhIFwibGFzdFwiIG9uZS5cblxuICAgICAgcmV0dXJuIHsgZXZlbnRJZDogZXZlbnRJZCwgYWN0aXZpdHlJZDogYWN0aXZpdHk/LmlkID8/IG51bGwsIGF0dGVuZGVlSWRzOiBhdHRlbmRlZUlkcyB9O1xuICAgIGAsXG4gICAgICBjYXBhYmlsaXRpZXM6IFsnYXBpLnJlYWQnLCAnYXBpLndyaXRlJ10sXG4gICAgICB0aW1lb3V0TXM6IDUwMDAsXG4gICAgfSxcbiAgICBsb2NhdGlvbnM6IFsncmVjb3JkX2hlYWRlcicsICdsaXN0X2l0ZW0nLCAncmVjb3JkX3JlbGF0ZWQnXSxcbiAgICBwYXJhbXM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3N1YmplY3QnLFxuICAgICAgICBsYWJlbDogc3BlYy5zdWJqZWN0TGFiZWwsXG4gICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB9LFxuICAgICAgLy8gV09SS0FST1VORCBvYmplY3RzdGFjay1haS9vYmplY3RzdGFjayM1MDYxIFx1MjAxNCBvbmUgYHR5cGU6ICdkYXRldGltZSdgXG4gICAgICAvLyBwYXJhbSAoXCJTdGFydHMgQXRcIikgaXMgd2hhdCB0aGlzIFdBTlRTIHRvIGJlLCBhbmQgaXQgaXMgdW51c2FibGU6IHRoZVxuICAgICAgLy8gQ29uc29sZSByZW5kZXJzIGl0IGFzIGEgem9uZS1sZXNzIGA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCI+YCBhbmRcbiAgICAgIC8vIFBPU1RzIHRoZSByYXcgdmFsdWUsIHdoaWNoIHRoZSBhY3Rpb24tcGFyYW0gdmFsaWRhdG9yIHJlamVjdHMgd2l0aCBhXG4gICAgICAvLyA0MDAgKGBleHBlY3RlZCBhbiBJU08tODYwMSBpbnN0YW50IHdpdGggZXhwbGljaXQgem9uZWApLiBUaGUgcmVuZGVyZXInc1xuICAgICAgLy8gb3V0cHV0IHNoYXBlIGFuZCB0aGUgdmFsaWRhdG9yJ3MgYWNjZXB0ZWQgc2hhcGUgZG8gbm90IGludGVyc2VjdCwgc29cbiAgICAgIC8vIE5PIHVzZXIgaW5wdXQgY2FuIHN1Ym1pdCB0aGUgYWN0aW9uIFx1MjAxNCByZXByb2R1Y2VkIGZyb20gYm90aCB0aGUgbGlzdC1yb3dcbiAgICAgIC8vIG1lbnUgYW5kIHRoZSByZWNvcmQgaGVhZGVyLlxuICAgICAgLy9cbiAgICAgIC8vIGBkYXRlYCBhbmQgYHRpbWVgIGFyZSB0aGUgdHdvIHBhcmFtIHR5cGVzIHdoZXJlIHRoZXkgRE8gaW50ZXJzZWN0OiB0aGVcbiAgICAgIC8vIENvbnNvbGUgcmVuZGVycyBuYXRpdmUgYDxpbnB1dCB0eXBlPVwiZGF0ZVwiPmAgLyBgPGlucHV0IHR5cGU9XCJ0aW1lXCI+YFxuICAgICAgLy8gcGlja2VycyAoYHVpLWNvbXBvbmVudHNgIERhdGVGaWVsZCAvIFRpbWVGaWVsZCwgYm90aCBlbWl0dGluZ1xuICAgICAgLy8gYGUudGFyZ2V0LnZhbHVlYCB2ZXJiYXRpbSkgYW5kIHRoZSB2YWxpZGF0b3IncyBgQ2FsZW5kYXJEYXRlVmFsdWVTY2hlbWFgXG4gICAgICAvLyAvYENsb2NrVGltZVZhbHVlU2NoZW1hYCBhY2NlcHQgZXhhY3RseSBgWVlZWS1NTS1ERGAgYW5kIGBISDpNTWAuIFR3b1xuICAgICAgLy8gbmF0aXZlIHBpY2tlcnMgYXJlIGFsc28gYmV0dGVyIFVYIHRoYW4gb25lIGZyZWUtdGV4dCBib3gsIHdoaWNoIGlzIHRoZVxuICAgICAgLy8gb3RoZXIgc2hhcGUgdGhhdCB3b3VsZCBoYXZlIHN1Ym1pdHRlZC5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgem9uZSBpcyBzdGF0ZWQgaW4gdGhlIExBQkVMUywgbm90IGluIGBoZWxwVGV4dGA6IHRoZSBDb25zb2xlJ3NcbiAgICAgIC8vIGFjdGlvbi1wYXJhbSBmb3JtIGZvcndhcmRzIG9ubHkgbmFtZS9sYWJlbC90eXBlL3JlcXVpcmVkL3BsYWNlaG9sZGVyL1xuICAgICAgLy8gb3B0aW9ucy9tdWx0aXBsZS9hY2NlcHQvbWF4U2l6ZSB0byB0aGUgZmllbGQgd2lkZ2V0LCBzbyBhIGBoZWxwVGV4dGBcbiAgICAgIC8vIGhlcmUgd291bGQgbmV2ZXIgcmVhY2ggdGhlIHVzZXIuXG4gICAgICAvL1xuICAgICAgLy8gUkVWRVJUIFdIRU4gIzUwNjEgTEFORFM6IGJhY2sgdG9cbiAgICAgIC8vICAgeyBuYW1lOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0cyBBdCcsIHR5cGU6ICdkYXRldGltZScsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICAgIC8vIGFuZCBkcm9wIHRoZSBqb2luIGluIHRoZSBib2R5IGFib3ZlLlxuICAgICAgLi4uKHNwZWMuY29sbGVjdHNTY2hlZHVsZVxuICAgICAgICA/IChbXG4gICAgICAgICAgICB7IG5hbWU6ICdzdGFydF9kYXRlJywgbGFiZWw6ICdTdGFydCBEYXRlIChVVEMpJywgdHlwZTogJ2RhdGUnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnc3RhcnRfdGltZScsIGxhYmVsOiAnU3RhcnQgVGltZSAoVVRDKScsIHR5cGU6ICd0aW1lJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2xvY2F0aW9uJywgbGFiZWw6ICdMb2NhdGlvbicsIHR5cGU6ICd0ZXh0JywgcmVxdWlyZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgXSBhcyBOb25OdWxsYWJsZTxBY3Rpb25bJ3BhcmFtcyddPilcbiAgICAgICAgOiBbXSksXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdkdXJhdGlvbicsXG4gICAgICAgIGxhYmVsOiAnRHVyYXRpb24gKG1pbnV0ZXMpJyxcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICAvLyBUd28gdHlwZWQgbG9va3Vwcywgbm90IG9uZSBmcmVlLXRleHQgYm94OiB0aGUgcGxhdGZvcm0gaGFzIG5vXG4gICAgICAvLyBwb2x5bW9ycGhpYyBwaWNrZXIsIGFuZCB0eXBlZCBsb29rdXBzIHByb2R1Y2UgcXVlcnlhYmxlIHJvd3Mgd2hlcmUgYVxuICAgICAgLy8gdGV4dCBib3ggcHJvZHVjZXMgYSBjb21tYS1zZXBhcmF0ZWQgc2VudGVuY2Ugbm90aGluZyBjYW4gZmlsdGVyIG9uLlxuICAgICAge1xuICAgICAgICBuYW1lOiAnYXR0ZW5kZWVfY29udGFjdHMnLFxuICAgICAgICBsYWJlbDogJ0NvbnRhY3QgQXR0ZW5kZWVzJyxcbiAgICAgICAgdHlwZTogJ2xvb2t1cCcsXG4gICAgICAgIHJlZmVyZW5jZTogJ2NybV9jb250YWN0JyxcbiAgICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdhdHRlbmRlZV91c2VycycsXG4gICAgICAgIGxhYmVsOiAnSW50ZXJuYWwgQXR0ZW5kZWVzJyxcbiAgICAgICAgdHlwZTogJ2xvb2t1cCcsXG4gICAgICAgIHJlZmVyZW5jZTogJ3N5c191c2VyJyxcbiAgICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdub3RlcycsXG4gICAgICAgIGxhYmVsOiBzcGVjLm5vdGVzTGFiZWwsXG4gICAgICAgIHR5cGU6ICd0ZXh0YXJlYScsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBzdWNjZXNzTWVzc2FnZTogc3BlYy5zdWNjZXNzTWVzc2FnZSxcbiAgICByZWZyZXNoQWZ0ZXI6IHRydWUsXG4gIH07XG59XG5cbmNvbnN0IExPR19DQUxMX1NQRUM6IEFjdGl2aXR5U3BlYyA9IHtcbiAgbmFtZTogJ2xvZ19jYWxsJyxcbiAgbGFiZWw6ICdMb2cgYSBDYWxsJyxcbiAgaWNvbjogJ3Bob25lJyxcbiAgZXZlbnRUeXBlOiAnY2FsbCcsXG4gIGV2ZW50U3RhdHVzOiAnaGVsZCcsXG4gIHN1bW1hcnlQcmVmaXg6ICcnLFxuICBkZWZhdWx0U3ViamVjdDogJ1VudGl0bGVkIENhbGwnLFxuICBzdWJqZWN0TGFiZWw6ICdDYWxsIFN1YmplY3QnLFxuICBub3Rlc0xhYmVsOiAnQ2FsbCBOb3RlcycsXG4gIHN1Y2Nlc3NNZXNzYWdlOiAnQ2FsbCBsb2dnZWQgc3VjY2Vzc2Z1bGx5IScsXG59O1xuXG5jb25zdCBMT0dfTUVFVElOR19TUEVDOiBBY3Rpdml0eVNwZWMgPSB7XG4gIG5hbWU6ICdsb2dfbWVldGluZycsXG4gIGxhYmVsOiAnTG9nIGEgTWVldGluZycsXG4gIGljb246ICdjYWxlbmRhci1jaGVjaycsXG4gIGV2ZW50VHlwZTogJ21lZXRpbmcnLFxuICBldmVudFN0YXR1czogJ2hlbGQnLFxuICBzdW1tYXJ5UHJlZml4OiAnTWVldGluZzogJyxcbiAgZGVmYXVsdFN1YmplY3Q6ICdVbnRpdGxlZCBNZWV0aW5nJyxcbiAgc3ViamVjdExhYmVsOiAnTWVldGluZyBTdWJqZWN0JyxcbiAgbm90ZXNMYWJlbDogJ01lZXRpbmcgTm90ZXMnLFxuICBzdWNjZXNzTWVzc2FnZTogJ01lZXRpbmcgbG9nZ2VkIHN1Y2Nlc3NmdWxseSEnLFxufTtcblxuY29uc3QgU0NIRURVTEVfTUVFVElOR19TUEVDOiBBY3Rpdml0eVNwZWMgPSB7XG4gIG5hbWU6ICdzY2hlZHVsZV9tZWV0aW5nJyxcbiAgbGFiZWw6ICdTY2hlZHVsZSBhIE1lZXRpbmcnLFxuICBpY29uOiAnY2FsZW5kYXItcGx1cycsXG4gIGV2ZW50VHlwZTogJ21lZXRpbmcnLFxuICAvLyBgcGxhbm5lZGAsIGFuZCB0aGF0IGlzIHRoZSB3aG9sZSBkaWZmZXJlbmNlIHRoYXQgbWF0dGVyczogYSBib29raW5nIG11c3RcbiAgLy8gTk9UIHJlc2V0IHRoZSBjdXN0b21lcidzIHJlY2VuY3kgY2xvY2sgKHNlZSBldmVudC5ob29rLnRzKS5cbiAgZXZlbnRTdGF0dXM6ICdwbGFubmVkJyxcbiAgc3VtbWFyeVByZWZpeDogJ01lZXRpbmcgc2NoZWR1bGVkOiAnLFxuICBkZWZhdWx0U3ViamVjdDogJ1VudGl0bGVkIE1lZXRpbmcnLFxuICBzdWJqZWN0TGFiZWw6ICdNZWV0aW5nIFN1YmplY3QnLFxuICBub3Rlc0xhYmVsOiAnQWdlbmRhJyxcbiAgY29sbGVjdHNTY2hlZHVsZTogdHJ1ZSxcbiAgc3VjY2Vzc01lc3NhZ2U6ICdNZWV0aW5nIHNjaGVkdWxlZCEnLFxufTtcblxuLyoqIFRoZSB0aHJlZSBhY3Rpdml0eSBraW5kcywgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIG9uIGEgcmVjb3JkIGhlYWRlci4gKi9cbmV4cG9ydCBjb25zdCBBQ1RJVklUWV9TUEVDX05BTUVTID0gWydsb2dfY2FsbCcsICdsb2dfbWVldGluZycsICdzY2hlZHVsZV9tZWV0aW5nJ10gYXMgY29uc3Q7XG5cbmNvbnN0IEFDVElWSVRZX1NQRUNTOiBBY3Rpdml0eVNwZWNbXSA9IFtMT0dfQ0FMTF9TUEVDLCBMT0dfTUVFVElOR19TUEVDLCBTQ0hFRFVMRV9NRUVUSU5HX1NQRUNdO1xuXG4vKipcbiAqIFRoZSB0aHJlZSBhY3Rpdml0eSBhY3Rpb25zIGZvciBPTkUgaG9zdCBvYmplY3QgXHUyMDE0IHRoZSBmYWN0b3J5IGV2ZXJ5IHBhY2thZ2VcbiAqIHdpdGggYW4gYWN0aXZpdHkgdGFyZ2V0IGNhbGxzLlxuICpcbiAqIFJldHVybmVkIGtleWVkIGJ5IGtpbmQgcmF0aGVyIHRoYW4gYXMgYSBsaXN0LCBzbyB0aGUgbmFtZWQgZXhwb3J0cyBiZWxvdyByZWFkXG4gKiBhcyB0aGVtc2VsdmVzIGFuZCBhIGNhbGxlciBjYW5ub3QgcGljayB0aGUgd3JvbmcgaW5kZXguIEVhY2ggcGFja2FnZSBjYWxsc1xuICogdGhpcyBPTkNFIHBlciBob3N0IG9iamVjdCBhbmQgZXhwb3J0cyB0aGUgdGhyZWUgaXQgZ2V0cyBiYWNrLCBzbyBhIHBhZ2UgdGhhdFxuICogaW1wb3J0cyBgTG9nQ2FsbEFjdGlvbmAgYW5kIHRoZSBiYXJyZWwgdGhhdCByZWdpc3RlcnMgaXQgaG9sZCB0aGUgU0FNRVxuICogb2JqZWN0OiB0d28gc3RydWN0dXJhbGx5LWlkZW50aWNhbCBhY3Rpb25zIHVuZGVyIG9uZSBgPG9iamVjdE5hbWU+OjxuYW1lPmBcbiAqIHJlZ2lzdHJ5IGtleSBpcyBhIGR1cGxpY2F0ZSByZWdpc3RyYXRpb24gdGhlIHJ1bnRpbWUgd2FybnMgYWJvdXQsIGFuZCBvbmUgb2ZcbiAqIHRoZW0gc2lsZW50bHkgbG9zZXMuXG4gKlxuICogYG9iamVjdERlZnNgIGlzIHRoZSBjYWxsaW5nIHBhY2thZ2UncyBvYmplY3QgYmFycmVsIFx1MjAxNCBzZWUgdGhlIG5vdGUgb25cbiAqIHtAbGluayBuYW1lRmllbGRNYXB9IGZvciB3aHkgdGhlIGRlZmluaXRpb25zIGFycml2ZSBhcyBhbiBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFjdGl2aXR5QWN0aW9uc0ZvciA9IChcbiAgb2JqZWN0TmFtZTogc3RyaW5nLFxuICBvYmplY3REZWZzOiBSZWNvcmQ8c3RyaW5nLCBOYW1lRmllbGRTb3VyY2U+LFxuKTogUmVjb3JkPCh0eXBlb2YgQUNUSVZJVFlfU1BFQ19OQU1FUylbbnVtYmVyXSwgQWN0aW9uPiA9PiB7XG4gIC8vIGA/PyAnbmFtZSdgIG9ubHkgZmlyZXMgZm9yIGFuIG9iamVjdCB0aGF0IGRlY2xhcmVzIG5vIG5hbWVGaWVsZCBhdCBhbGwsXG4gIC8vIHdoaWNoIG5vIGJ1c2luZXNzIG9iamVjdCBpbiB0aGlzIGFwcCBkb2VzLlxuICBjb25zdCBuYW1lRmllbGQgPSBuYW1lRmllbGRNYXAob2JqZWN0RGVmcylbb2JqZWN0TmFtZV0gPz8gJ25hbWUnO1xuICBjb25zdCBidWlsdCA9IEFDVElWSVRZX1NQRUNTLm1hcCgoc3BlYykgPT4gYWN0aXZpdHlBY3Rpb24oc3BlYywgb2JqZWN0TmFtZSwgbmFtZUZpZWxkKSk7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoYnVpbHQubWFwKChhKSA9PiBbYS5uYW1lLCBhXSkpIGFzIFJlY29yZDxcbiAgICAodHlwZW9mIEFDVElWSVRZX1NQRUNfTkFNRVMpW251bWJlcl0sXG4gICAgQWN0aW9uXG4gID47XG59O1xuXG4vKlxuICogVGhlIGZhbWlseSwgbmFtZWQuIGBzcmMvc2FsZXMvYWN0aW9ucy9pbmRleC50c2AgcmUtZXhwb3J0cyBleGFjdGx5IHRoZXNlIFx1MjAxNFxuICogdGhlIHN0YWNrIGlzIGJ1aWx0IGZyb20gYE9iamVjdC52YWx1ZXMoYWN0aW9ucylgLCBzbyBldmVyeSBleHBvcnQgaXQgZm9yd2FyZHNcbiAqIG11c3QgYmUgb25lIEFjdGlvbiwgbmV2ZXIgYSBsaXN0IG9mIHRoZW0uXG4gKlxuICogU3BlbGxlZCBvdXQgcmF0aGVyIHRoYW4gbG9vcGVkIGZvciBncmVwLWFiaWxpdHk6IFwid2hpY2ggc3VyZmFjZSBjYW4gbG9nIGFcbiAqIGNhbGwgb24gYSBsZWFkP1wiIGhhcyB0byBiZSBhbnN3ZXJhYmxlIHdpdGggb25lIHNlYXJjaCwgYW5kIEFHRU5UUy5tZCB0cmFkZXNcbiAqIHZlcmJvc2l0eSBmb3IgZXhhY3RseSB0aGF0IGV2ZXJ5d2hlcmUgZWxzZSB0b28uXG4gKi9cbmNvbnN0IGxlYWRBY3Rpdml0eUFjdGlvbnMgPSBhY3Rpdml0eUFjdGlvbnNGb3IoJ2NybV9sZWFkJywgc2FsZXNPYmplY3RzKTtcbmNvbnN0IGNvbnRhY3RBY3Rpdml0eUFjdGlvbnMgPSBhY3Rpdml0eUFjdGlvbnNGb3IoJ2NybV9jb250YWN0Jywgc2FsZXNPYmplY3RzKTtcbmNvbnN0IGFjY291bnRBY3Rpdml0eUFjdGlvbnMgPSBhY3Rpdml0eUFjdGlvbnNGb3IoJ2NybV9hY2NvdW50Jywgc2FsZXNPYmplY3RzKTtcbmNvbnN0IG9wcG9ydHVuaXR5QWN0aXZpdHlBY3Rpb25zID0gYWN0aXZpdHlBY3Rpb25zRm9yKCdjcm1fb3Bwb3J0dW5pdHknLCBzYWxlc09iamVjdHMpO1xuXG5leHBvcnQgY29uc3QgTGVhZExvZ0NhbGxBY3Rpb246IEFjdGlvbiA9IGxlYWRBY3Rpdml0eUFjdGlvbnMubG9nX2NhbGw7XG5leHBvcnQgY29uc3QgTGVhZExvZ01lZXRpbmdBY3Rpb246IEFjdGlvbiA9IGxlYWRBY3Rpdml0eUFjdGlvbnMubG9nX21lZXRpbmc7XG5leHBvcnQgY29uc3QgTGVhZFNjaGVkdWxlTWVldGluZ0FjdGlvbjogQWN0aW9uID0gbGVhZEFjdGl2aXR5QWN0aW9ucy5zY2hlZHVsZV9tZWV0aW5nO1xuXG5leHBvcnQgY29uc3QgQ29udGFjdExvZ0NhbGxBY3Rpb246IEFjdGlvbiA9IGNvbnRhY3RBY3Rpdml0eUFjdGlvbnMubG9nX2NhbGw7XG5leHBvcnQgY29uc3QgQ29udGFjdExvZ01lZXRpbmdBY3Rpb246IEFjdGlvbiA9IGNvbnRhY3RBY3Rpdml0eUFjdGlvbnMubG9nX21lZXRpbmc7XG5leHBvcnQgY29uc3QgQ29udGFjdFNjaGVkdWxlTWVldGluZ0FjdGlvbjogQWN0aW9uID0gY29udGFjdEFjdGl2aXR5QWN0aW9ucy5zY2hlZHVsZV9tZWV0aW5nO1xuXG5leHBvcnQgY29uc3QgQWNjb3VudExvZ0NhbGxBY3Rpb246IEFjdGlvbiA9IGFjY291bnRBY3Rpdml0eUFjdGlvbnMubG9nX2NhbGw7XG5leHBvcnQgY29uc3QgQWNjb3VudExvZ01lZXRpbmdBY3Rpb246IEFjdGlvbiA9IGFjY291bnRBY3Rpdml0eUFjdGlvbnMubG9nX21lZXRpbmc7XG5leHBvcnQgY29uc3QgQWNjb3VudFNjaGVkdWxlTWVldGluZ0FjdGlvbjogQWN0aW9uID0gYWNjb3VudEFjdGl2aXR5QWN0aW9ucy5zY2hlZHVsZV9tZWV0aW5nO1xuXG5leHBvcnQgY29uc3QgT3Bwb3J0dW5pdHlMb2dDYWxsQWN0aW9uOiBBY3Rpb24gPSBvcHBvcnR1bml0eUFjdGl2aXR5QWN0aW9ucy5sb2dfY2FsbDtcbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eUxvZ01lZXRpbmdBY3Rpb246IEFjdGlvbiA9IG9wcG9ydHVuaXR5QWN0aXZpdHlBY3Rpb25zLmxvZ19tZWV0aW5nO1xuZXhwb3J0IGNvbnN0IE9wcG9ydHVuaXR5U2NoZWR1bGVNZWV0aW5nQWN0aW9uOiBBY3Rpb24gPSBvcHBvcnR1bml0eUFjdGl2aXR5QWN0aW9ucy5zY2hlZHVsZV9tZWV0aW5nO1xuXG4vKlxuICogVGhlIGBjcm1fY2FzZWAtc2NvcGVkIHRyaXBsZSBpcyBOT1QgYnVpbHQgaGVyZS4gYGNybV9jYXNlYCBpcyB0aGUgc2VydmljZVxuICogcGFja2FnZSdzIG9iamVjdCwgc28gc2VydmljZSBpbnN0YW50aWF0ZXMgaXQgZnJvbSB0aGlzIGZhY3RvcnkgXHUyMDE0IHNlZVxuICogYHNyYy9zZXJ2aWNlL2FjdGlvbnMvY2FzZS1hY3Rpdml0eS5hY3Rpb25zLnRzYCwgd2hpY2gga2VlcHMgdGhlIG9yaWdpbmFsXG4gKiBgTG9nQ2FsbEFjdGlvbmAgLyBgTG9nTWVldGluZ0FjdGlvbmAgLyBgQ2FzZVNjaGVkdWxlTWVldGluZ0FjdGlvbmAgZXhwb3J0XG4gKiBuYW1lcyBiZWNhdXNlIGBzcmMvc2VydmljZS9wYWdlcy9jYXNlX2RldGFpbC5wYWdlLnRzYCBpbXBvcnRzIHRoZW0gYnkgdGhvc2VcbiAqIG5hbWVzLlxuICovXG5cbi8vIFx1MjZENCBOZXZlciBhZGQgYSBnbG9iYWwgKG9iamVjdC1sZXNzKSBib2R5IGFjdGlvbiBoZXJlOiBpdCByZWdpc3RlcnMgdW5kZXIgdGhlXG4vLyAnZ2xvYmFsJyBrZXkgdGhlIGRpc3BhdGNoZXIgbmV2ZXIgcHJvYmVzIFx1MjAxNCBzZWUgdGhlIG5vdGUgb24gYG9iamVjdE5hbWVgXG4vLyBhYm92ZS4gQ1NWIGV4cG9ydCBpbiBwYXJ0aWN1bGFyIG5lZWRzIG5vIGFjdGlvbiBhdCBhbGw7IHRoZSBsaXN0IGdyaWRzJ1xuLy8gYnVpbHQtaW4gYGV4cG9ydE9wdGlvbnM6IFsnY3N2JywgJ3hsc3gnXWAgYWxyZWFkeSBjb3ZlciBpdC5cbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvYWN0aW9ucy9jYXNlLWFjdGl2aXR5LmFjdGlvbnMudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9hY3Rpb25zXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvYWN0aW9ucy9jYXNlLWFjdGl2aXR5LmFjdGlvbnMudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCAqIGFzIHNlcnZpY2VPYmplY3RzIGZyb20gJy4uL29iamVjdHMnO1xuaW1wb3J0IHsgYWN0aXZpdHlBY3Rpb25zRm9yIH0gZnJvbSAnLi4vLi4vc2FsZXMvYWN0aW9ucy9hY3Rpdml0eS1hY3Rpb25zJztcblxuLyoqXG4gKiBUaGUgYGNybV9jYXNlYC1zY29wZWQgYWN0aXZpdHkgdHJpcGxlIFx1MjAxNCBgbG9nX2NhbGxgLCBgbG9nX21lZXRpbmdgLFxuICogYHNjaGVkdWxlX21lZXRpbmdgIG9uIGEgY2FzZS5cbiAqXG4gKiBUaGVzZSB0aHJlZSB1c2VkIHRvIGJlIGJ1aWx0IGFsb25nc2lkZSB0aGUgb3RoZXIgdHdlbHZlIGluIHdoYXQgaXMgbm93XG4gKiBgc3JjL3NhbGVzL2FjdGlvbnMvYWN0aXZpdHktYWN0aW9ucy50c2AuIGBjcm1fY2FzZWAgaXMgdGhpcyBwYWNrYWdlJ3Mgb2JqZWN0LFxuICogc28gdGhlIEFDVElPTlMgYXV0aG9yZWQgYWdhaW5zdCBpdCBhcmUgdGhpcyBwYWNrYWdlJ3MgdG9vIChwbGFuIGl0ZW0gNTogYW5cbiAqIGl0ZW0gbGl2ZXMgd2l0aCB0aGUgb2JqZWN0IGl0IGlzIGF1dGhvcmVkIGFnYWluc3QpIFx1MjAxNCBidXQgdGhlIGZhY3RvcnkgdGhhdFxuICogYnVpbGRzIHRoZW0gaXMgbm90IGR1cGxpY2F0ZWQuIEl0IHN0YXlzIGluIHNhbGVzLCB3aGVyZSB0aGUgb3RoZXIgZm91ciBob3N0XG4gKiBvYmplY3RzIGFuZCB0aGUgYGNybV9ldmVudGAgZXZlcnkgb25lIG9mIHRoZXNlIHdyaXRlcyBsaXZlLCBhbmQgc2VydmljZVxuICogaW1wb3J0cyBpdCBhbG9uZyB0aGUgb25lIGVkZ2UgQURSLTAxMzAgYWxsb3dzIGEgbW9kdWxlIHRvIGltcG9ydCBvbjpcbiAqIHNlcnZpY2UgLT4gc2FsZXMsIG5ldmVyIHNpZGV3YXlzLCBuZXZlciBhIHNlY29uZCBjb3B5LlxuICpcbiAqIFRoZSBleHBvcnQgbmFtZXMgYXJlIHRoZSBvcmlnaW5hbHMgXHUyMDE0IGBMb2dDYWxsQWN0aW9uYCwgYExvZ01lZXRpbmdBY3Rpb25gLFxuICogYENhc2VTY2hlZHVsZU1lZXRpbmdBY3Rpb25gLCB3aXRoIG5vIGBDYXNlYCBwcmVmaXggb24gdGhlIGZpcnN0IHR3byBcdTIwMTQgYmVjYXVzZVxuICogYHNyYy9zZXJ2aWNlL2luZGV4LnRzYCByZWdpc3RlcnMgdGhlbSBieSB0aG9zZSBuYW1lcywgYW5kIHRoZSBQUiB0aGF0IG1vdmVkXG4gKiB0aGlzIGZpbGUgcmVuYW1lZCBub3RoaW5nIGl0IGV4cG9ydHMuIChUaGUgY2FzZSBwYWdlIG5hbWVzIHRoZW0gYnkgYWN0aW9uIGlkXG4gKiBzaW5jZSAjMTY1Mywgbm90IGJ5IHRoZXNlIGV4cG9ydHMuKVxuICpcbiAqIE5vIGA6IEFjdGlvbmAgYW5ub3RhdGlvbiBvbiB0aGUgdGhyZWU6IGBhY3Rpdml0eUFjdGlvbnNGb3JgIGFscmVhZHkgcmV0dXJuc1xuICogYFJlY29yZDxraW5kLCBBY3Rpb24+YCwgc28gZWFjaCBleHBvcnQgaXMgdHlwZWQgYEFjdGlvbmAgd2l0aG91dCBvbmUgKCMyMDcyXG4gKiBkcm9wcGVkIHRoZSB0aHJlZSwgYW5kIHRoZSB0eXBlLW9ubHkgaW1wb3J0IHRoZXkgbmVlZGVkLCB0byBwYXkgZm9yIHRoZSBjYXNlXG4gKiBoZWFkZXIncyB0aHJlZSBuZXcgYWN0aW9uIGlkcyB1bmRlciB0aGUgYHNyYy9zZXJ2aWNlYCB0b2tlbiBjZWlsaW5nKS5cbiAqL1xuY29uc3QgY2FzZUFjdGl2aXR5QWN0aW9ucyA9IGFjdGl2aXR5QWN0aW9uc0ZvcignY3JtX2Nhc2UnLCBzZXJ2aWNlT2JqZWN0cyk7XG5cbmV4cG9ydCBjb25zdCBMb2dDYWxsQWN0aW9uID0gY2FzZUFjdGl2aXR5QWN0aW9ucy5sb2dfY2FsbDtcbmV4cG9ydCBjb25zdCBMb2dNZWV0aW5nQWN0aW9uID0gY2FzZUFjdGl2aXR5QWN0aW9ucy5sb2dfbWVldGluZztcbmV4cG9ydCBjb25zdCBDYXNlU2NoZWR1bGVNZWV0aW5nQWN0aW9uID0gY2FzZUFjdGl2aXR5QWN0aW9ucy5zY2hlZHVsZV9tZWV0aW5nO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9hY3Rpb25zL2tub3dsZWRnZV9hcnRpY2xlLmFjdGlvbnMudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9hY3Rpb25zXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvYWN0aW9ucy9rbm93bGVkZ2VfYXJ0aWNsZS5hY3Rpb25zLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEFjdGlvbiB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcbmltcG9ydCB7IFAgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogS25vd2xlZGdlIGFydGljbGUgZmVlZGJhY2sgYWN0aW9ucy5cbiAqXG4gKiBUaGUgdHdvIGJ1dHRvbnMgdGhhdCBtYWtlIGBoZWxwZnVsX2NvdW50YCAvIGBub3RfaGVscGZ1bF9jb3VudGAgbW92ZS4gTmVpdGhlclxuICogd3JpdGVzIGEgY291bnRlcjogZWFjaCByZWNvcmRzIHRoZSByZWFkZXIncyBvd24gYGNybV9hcnRpY2xlX2ZlZWRiYWNrYCByb3csXG4gKiBhbmQgYGFydGljbGVfZmVlZGJhY2tfbWV0cmljc19yZWZyZXNoYCByZWNvdW50cyB0aGUgYXJ0aWNsZSBmcm9tIHRoYXQgdGFibGUuXG4gKiBUaGUgZnVsbCByZWFzb25pbmcgZm9yIHRoZSBpbmRpcmVjdGlvbiBcdTIwMTQgYSBzYW5kYm94ZWQgYWN0aW9uIGJvZHkgY2Fubm90XG4gKiBVUERBVEUgYSBzaGFyaW5nLXJ1bGVkIG9iamVjdCwgdGhlIGFydGljbGUgaXMgd3JpdGUtb3duZWQsIGFuZCB0aGVyZSBpcyBub1xuICogYXRvbWljIGluY3JlbWVudCBcdTIwMTQgaXMgb24gYHNyYy9zZXJ2aWNlL29iamVjdHMvYXJ0aWNsZV9mZWVkYmFjay5vYmplY3QudHNgLlxuICpcbiAqICMjIyBPbmUgYm9keSwgZ2VuZXJhdGVkIHR3aWNlXG4gKlxuICogYGZlZWRiYWNrQm9keSh2ZXJkaWN0KWAgY29tcG9zZXMgdGhlIHNvdXJjZSBzdHJpbmcgYm90aCBhY3Rpb25zIHNoaXAuIFRoaXMgaXNcbiAqIEZBQ1RPUlkgY29tcG9zaXRpb24sIHdoaWNoIGlzIGFsbG93ZWQgYW5kIGlzIHdoYXQgYF9jYXNlLWFzc2lnbm1lbnQudHNgIGRvZXNcbiAqIGZvciBob29rczogdGhlIHN0cmluZyBpdCByZXR1cm5zIGlzIGNvbXBsZXRlIGFuZCBzZWxmLWNvbnRhaW5lZCwgc28gdGhlIGJvZHlcbiAqIHRoYXQgcmVhY2hlcyB0aGUgUXVpY2tKUyBzYW5kYm94IHJlYWNoZXMgZm9yIG5vIG1vZHVsZSBzY29wZS4gXHUyNkQ0IE5ldmVyIHdyaXRlXG4gKiB0aGUgb3RoZXIgc2hhcGUgXHUyMDE0IGEgYm9keSB0aGF0IENBTExTIGEgc2hhcmVkIGZ1bmN0aW9uIGF0IHJ1bnRpbWUgbG93ZXJzIHRvIGFcbiAqIGBSZWZlcmVuY2VFcnJvcmAsIGJlY2F1c2UgdGhlIGJvZHkgc2hpcHMgd2l0aG91dCBpdHMgbW9kdWxlXG4gKiAoYHRlc3QvYWN0aW9uLXNhbmRib3gudGVzdC50c2AgZmFpbHMgdGhlIGJ1aWxkIG9uIGl0LCBhbmRcbiAqIGB0ZXN0L2tub3dsZWRnZS1mZWVkYmFjay50ZXN0LnRzYCBwaW5zIHRoYXQgdGhlc2UgdHdvIGJvZGllcyBzdGF5XG4gKiBjaGFyYWN0ZXItaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIHZlcmRpY3QpLlxuICpcbiAqICMjIyBSZS12b3RpbmcgVVBEQVRFUyByYXRoZXIgdGhhbiBpbnNlcnRpbmdcbiAqXG4gKiBgY3JtX2FydGljbGVfZmVlZGJhY2tgIGNhcnJpZXMgYSB1bmlxdWUgaW5kZXggb25cbiAqIChgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCwgYG93bmVyX2lkYCksIHNvIGEgcmVhZGVyIHdobyBjbGlja3MgSGVscGZ1bCBhbmRcbiAqIHRoZW4gTm90IEhlbHBmdWwgbXVzdCBtb3ZlIHRoZWlyIGV4aXN0aW5nIHJvdywgbm90IGFkZCBhIHNlY29uZCBvbmUuIFRoZVxuICogYm9keSB0aGVyZWZvcmUgcmVhZHMgZmlyc3QuIFdpdGhvdXQgdGhlIGRlZHVwZSB0aGUgY291bnRlcnMgd291bGQgYW5zd2VyXG4gKiBcImhvdyBtYW55IGNsaWNrc1wiLCBhbmQgb25lIGVudGh1c2lhc3RpYyByZWFkZXIgY291bGQgb3V0LXZvdGUgYSBkZXBhcnRtZW50LlxuICpcbiAqIGBvd25lcl9pZGAgaXMgc2V0IEVYUExJQ0lUTFk6IGFuIGFjdGlvbiBib2R5IHJ1bnMgYGlzU3lzdGVtYCwgc28gbm90aGluZ1xuICogc3RhbXBzIHRoZSBvd25lcnNoaXAgYW5jaG9yIGZvciBpdCAodGhlIHNhbWUgbm90ZSBgY2xvbmVfb3Bwb3J0dW5pdHlgXG4gKiBjYXJyaWVzKS4gSXQgaXMgdGhlIHZvdGVyJ3MgaWRlbnRpdHkgdGhhdCBrZXlzIHRoZSBkZWR1cGUsIHNvIGdldHRpbmcgaXQgZnJvbVxuICogYGN0eC51c2VyYCBpcyBsb2FkLWJlYXJpbmcgcmF0aGVyIHRoYW4gdGlkeSBcdTIwMTQgYSBudWxsIG93bmVyIHdvdWxkIGNvbGxhcHNlXG4gKiBldmVyeSBhbm9ueW1vdXMtbG9va2luZyB2b3RlIG9udG8gb25lIHJvdy5cbiAqL1xuY29uc3QgZmVlZGJhY2tCb2R5ID0gKHZlcmRpY3Q6ICdoZWxwZnVsJyB8ICdub3RfaGVscGZ1bCcpOiBzdHJpbmcgPT4gYFxuICAgICAgY29uc3QgaWQgPSBjdHgucmVjb3JkSWQ7XG4gICAgICBpZiAoIWlkKSB0aHJvdyBuZXcgRXJyb3IoJ3N1Ym1pdF9hcnRpY2xlX2ZlZWRiYWNrIHJlcXVpcmVzIGEgcmVjb3JkSWQnKTtcbiAgICAgIGNvbnN0IHVzZXJJZCA9IGN0eC51c2VyPy5pZCA/PyBudWxsO1xuICAgICAgaWYgKCF1c2VySWQpIHRocm93IG5ldyBFcnJvcignU2lnbiBpbiB0byByYXRlIGFuIGFydGljbGUuJyk7XG5cbiAgICAgIC8vIE9uZSByb3cgcGVyIChhcnRpY2xlLCByZWFkZXIpIFx1MjAxNCB0aGUgdW5pcXVlIGluZGV4IHNheXMgc28sIGFuZCB0aGlzXG4gICAgICAvLyByZWFkIGlzIHdoYXQga2VlcHMgYSBtaW5kLWNoYW5nZSBhbiBVUERBVEUgaW5zdGVhZCBvZiBhIGR1cGxpY2F0ZS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgY3R4LmFwaS5vYmplY3QoJ2NybV9hcnRpY2xlX2ZlZWRiYWNrJykuZmluZE9uZSh7XG4gICAgICAgIHdoZXJlOiB7IGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogaWQsIG93bmVyX2lkOiB1c2VySWQgfSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcuaWQpIHtcbiAgICAgICAgaWYgKGV4aXN0aW5nLnZlcmRpY3QgPT09ICcke3ZlcmRpY3R9Jykge1xuICAgICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCBpZDogZXhpc3RpbmcuaWQsIHZlcmRpY3Q6ICcke3ZlcmRpY3R9JywgY2hhbmdlZDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2FydGljbGVfZmVlZGJhY2snKS51cGRhdGUoXG4gICAgICAgICAgeyBpZDogZXhpc3RpbmcuaWQsIHZlcmRpY3Q6ICcke3ZlcmRpY3R9JyB9LFxuICAgICAgICAgIHsgd2hlcmU6IHsgaWQ6IGV4aXN0aW5nLmlkIH0gfSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIGlkOiBleGlzdGluZy5pZCwgdmVyZGljdDogJyR7dmVyZGljdH0nLCBjaGFuZ2VkOiB0cnVlIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluc2VydGVkID0gYXdhaXQgY3R4LmFwaS5vYmplY3QoJ2NybV9hcnRpY2xlX2ZlZWRiYWNrJykuaW5zZXJ0KHtcbiAgICAgICAgY3JtX2tub3dsZWRnZV9hcnRpY2xlOiBpZCxcbiAgICAgICAgdmVyZGljdDogJyR7dmVyZGljdH0nLFxuICAgICAgICBvd25lcl9pZDogdXNlcklkLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgaWQ6IGluc2VydGVkPy5pZCA/PyBudWxsLCB2ZXJkaWN0OiAnJHt2ZXJkaWN0fScsIGNoYW5nZWQ6IHRydWUgfTtcbiAgICBgO1xuXG4vKipcbiAqIE9ubHkgUFVCTElTSEVEIGFydGljbGVzIGNvbGxlY3Qgdm90ZXMuIEEgZHJhZnQncyBjb3VudGVycyB3b3VsZCBkZXNjcmliZSBhXG4gKiB2ZXJzaW9uIG5vIHJlYWRlciBvdXRzaWRlIHRoZSBhdXRob3JpbmcgdGVhbSBldmVyIHNhdywgYW5kIHRoZSByZXZpZXcgcXVldWVcbiAqIHJlYWRzIHRoZXNlIG51bWJlcnMgYXMgYSBzaWduYWwgYWJvdXQgbGl2ZSBjb250ZW50LlxuICovXG5jb25zdCBwdWJsaXNoZWRPbmx5ID0gUGBoYXMocmVjb3JkLnN0YXR1cykgJiYgcmVjb3JkLnN0YXR1cyA9PSBcInB1Ymxpc2hlZFwiYDtcblxuZXhwb3J0IGNvbnN0IE1hcmtBcnRpY2xlSGVscGZ1bEFjdGlvbjogQWN0aW9uID0ge1xuICBuYW1lOiAnbWFya19hcnRpY2xlX2hlbHBmdWwnLFxuICBsYWJlbDogJ0hlbHBmdWwnLFxuICBvYmplY3ROYW1lOiAnY3JtX2tub3dsZWRnZV9hcnRpY2xlJyxcbiAgaWNvbjogJ3RodW1icy11cCcsXG4gIHR5cGU6ICdzY3JpcHQnLFxuICBib2R5OiB7XG4gICAgbGFuZ3VhZ2U6ICdqcycsXG4gICAgc291cmNlOiBmZWVkYmFja0JvZHkoJ2hlbHBmdWwnKSxcbiAgICBjYXBhYmlsaXRpZXM6IFsnYXBpLnJlYWQnLCAnYXBpLndyaXRlJ10sXG4gICAgdGltZW91dE1zOiA1MDAwLFxuICB9LFxuICBsb2NhdGlvbnM6IFsncmVjb3JkX2hlYWRlciddLFxuICB2aXNpYmxlOiBwdWJsaXNoZWRPbmx5LFxuICBzdWNjZXNzTWVzc2FnZTogJ1RoYW5rcyBcdTIwMTQgcmVjb3JkZWQgYXMgaGVscGZ1bC4nLFxuICByZWZyZXNoQWZ0ZXI6IHRydWUsXG59O1xuXG5leHBvcnQgY29uc3QgTWFya0FydGljbGVOb3RIZWxwZnVsQWN0aW9uOiBBY3Rpb24gPSB7XG4gIG5hbWU6ICdtYXJrX2FydGljbGVfbm90X2hlbHBmdWwnLFxuICBsYWJlbDogJ05vdCBIZWxwZnVsJyxcbiAgb2JqZWN0TmFtZTogJ2NybV9rbm93bGVkZ2VfYXJ0aWNsZScsXG4gIGljb246ICd0aHVtYnMtZG93bicsXG4gIHR5cGU6ICdzY3JpcHQnLFxuICBib2R5OiB7XG4gICAgbGFuZ3VhZ2U6ICdqcycsXG4gICAgc291cmNlOiBmZWVkYmFja0JvZHkoJ25vdF9oZWxwZnVsJyksXG4gICAgY2FwYWJpbGl0aWVzOiBbJ2FwaS5yZWFkJywgJ2FwaS53cml0ZSddLFxuICAgIHRpbWVvdXRNczogNTAwMCxcbiAgfSxcbiAgbG9jYXRpb25zOiBbJ3JlY29yZF9oZWFkZXInXSxcbiAgdmlzaWJsZTogcHVibGlzaGVkT25seSxcbiAgc3VjY2Vzc01lc3NhZ2U6ICdUaGFua3MgXHUyMDE0IHJlY29yZGVkIGFzIG5vdCBoZWxwZnVsLicsXG4gIHJlZnJlc2hBZnRlcjogdHJ1ZSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2Rhc2hib2FyZHMvc2VydmljZS5kYXNoYm9hcmQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9kYXNoYm9hcmRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZGFzaGJvYXJkcy9zZXJ2aWNlLmRhc2hib2FyZC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBEYXNoYm9hcmQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogVGhlIG9uZSBkYXRhc2V0IGV2ZXJ5IHdpZGdldCBiZWxvdyBiaW5kcyAoYGNhc2VfbWV0cmljc2ApLCB3cml0dGVuIG9uY2UgYW5kXG4gKiBwYXNzZWQgYnkgc2hvcnRoYW5kIChgZGF0YXNldCxgKSByYXRoZXIgdGhhbiBzcGVsbGVkIG91dCBvbiBlYWNoIHdpZGdldC5cbiAqL1xuY29uc3QgZGF0YXNldCA9ICdjYXNlX21ldHJpY3MnO1xuXG4vKipcbiAqIEN1c3RvbWVyIFNlcnZpY2UgRGFzaGJvYXJkXG4gKlxuICogQ2FzZSBsb2FkLCBTTEEgaGVhbHRoLCBhbmQgcmVzb2x1dGlvbiBwZXJmb3JtYW5jZSBmb3IgdGhlIHN1cHBvcnQgdGVhbS5cbiAqIFVzZXMgc2VtYW50aWMgY29sb3JWYXJpYW50IHRva2VucyAod2FybmluZy9kYW5nZXIvc3VjY2VzcykgYW5kIGNoYXJ0Q29uZmlnXG4gKiBwYWxldHRlcyBpbnN0ZWFkIG9mIHJhdyBoZXggdmFsdWVzLCBtaXJyb3JpbmcgdGhlIHBvbGlzaGVkIENSTSBkYXNoYm9hcmRcbiAqIHJlZmVyZW5jZSBhdCBodHRwczovL2dpdGh1Yi5jb20vb2JqZWN0c3RhY2stYWkvb2JqZWN0dWkvdHJlZS9tYWluL2V4YW1wbGVzL2NybS5cbiAqXG4gKiBObyBLUEkgdGlsZSBkZWNsYXJlcyBhIGB0cmVuZGAuIEEgcGVyaW9kLW92ZXItcGVyaW9kIGRlbHRhIGlzIGEgbWVhc3VyZW1lbnQsXG4gKiBzbyBpdCBoYXMgdG8gY29tZSBmcm9tIGEgcmVhbCBjb21wYXJpc29uIHF1ZXJ5ICh3aWRnZXQgYGNvbXBhcmVUb2ApIG9uY2UgdGhlXG4gKiByZW5kZXJlciBzdXBwb3J0cyBpdCBmb3IgZGF0YXNldCBtZXRyaWNzIFx1MjAxNCB0aGUgcGVyY2VudGFnZXMgdGhpcyBmaWxlIHVzZWQgdG9cbiAqIGNhcnJ5IHdlcmUgdHlwZWQgYnkgaGFuZCBhbmQgcmVjb21wdXRlZCBieSBub3RoaW5nLCBzbyB0aGV5IGtlcHQgYXNzZXJ0aW5nXG4gKiB0aGUgc2FtZSBcIi02LjIlIHZzIGxhc3Qgd2Vla1wiIG9uIGFueSBkYXRhLCBpbmNsdWRpbmcgYW4gZW1wdHkgZGF0YWJhc2UuXG4gKiBTYW1lIHJ1bGUgYXMgdGhlIGV4ZWN1dGl2ZSBkYXNoYm9hcmQgKCM1MDAsICM1ODcpLlxuICovXG5leHBvcnQgY29uc3QgU2VydmljZURhc2hib2FyZDogRGFzaGJvYXJkID0ge1xuICBuYW1lOiAnc2VydmljZV9kYXNoYm9hcmQnLFxuICBsYWJlbDogJ0N1c3RvbWVyIFNlcnZpY2UnLFxuICBkZXNjcmlwdGlvbjogJ0Nhc2UgbG9hZCwgU0xBIGhlYWx0aCwgYW5kIHJlc29sdXRpb24gcGVyZm9ybWFuY2UnLFxuXG4gIGNvbHVtbnM6IDEyLFxuICBnYXA6IDQsXG4gIHJlZnJlc2hJbnRlcnZhbFNlY29uZHM6IDYwLCAvLyAxIG1pbnV0ZSBcdTIwMTQgc2VydmljZSBkZXNrcyBuZWVkIGZyZXNoIG51bWJlcnNcblxuICBoZWFkZXI6IHtcbiAgICBzaG93VGl0bGU6IHRydWUsXG4gICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgIC8vIEhlYWRlciBhY3Rpb24gYnV0dG9ucyByZW1vdmVkOiBgY3JlYXRlX2Nhc2VgIGlzIG5vdCBhIGRlZmluZWQgYWN0aW9uIGFuZFxuICAgIC8vIGAvb2JqZWN0cy9jYXNlP293bmVyPWN1cnJlbnRfdXNlcmAgLyBgL3JlcG9ydHMvc2xhYCBhcmUgbm90IGluLWFwcCB2aWV3XG4gICAgLy8gcm91dGVzIFx1MjAxNCBhbGwgdGhyZWUgd2VyZSBkZWFkLiBSZS1hZGQgcmVhbCwgd2lyZWQtdXAgYWN0aW9ucyBoZXJlIHdoZW4gYXZhaWxhYmxlLlxuICB9LFxuXG4gIC8vIEhpc3RvcmljYWwgbm90ZSAoIzQ2MCBcdTIxOTIgIzExNTcpOiB0aGlzIGRhc2hib2FyZCBzaGlwcGVkIHdpdGhvdXQgYSBkYXRlXG4gIC8vIHBpY2tlciBmcm9tIFBSICM1NDYgdW50aWwgdGhlIDE3LjAuMCBHQSB1cGdyYWRlLCBiZWNhdXNlIHdpbmRvd2luZyBhXG4gIC8vIGBGaWVsZC5kYXRldGltZSgpYCBjb3VsZCBub3QgYmUgY29tcGFyZWQgXHUyMDE0IGBkcml2ZXItc3FsYCAxNi4xLjAgY29lcmNlZFxuICAvLyBkYXRldGltZSBib3VuZHMgdG8gZXBvY2gtbXMgSU5URUdFUiB3aGlsZSBldmVyeSBkYXRldGltZSBpbiB0aGUgZGF0YWJhc2UgaXNcbiAgLy8gSVNPIFRFWFQsIHNvIGAkZ3RlYCBtYXRjaGVkIGV2ZXJ5dGhpbmcgYW5kIGAkbHRlYCBtYXRjaGVkIG5vdGhpbmcgYW5kIHRoZVxuICAvLyB3aG9sZSBkYXNoYm9hcmQgcmVhZCB6ZXJvcy4gQm90aCBuYW1lZCBwcmVjb25kaXRpb25zIGFyZSBmaXhlZCBhbmRcbiAgLy8gcmVsZWFzZWQ6IG9iamVjdHN0YWNrIzM5MTIgKHRoZSBjb2VyY2lvbikgYW5kIG9iamVjdHN0YWNrIzM3NzcgKGEgYmFyZS1kYXRlXG4gIC8vIGAkbHRlYCBkcm9wcGluZyBzYW1lLWRheSByb3dzKS4gVGhlIHdpbmRvdyBiZWxvdyBpcyBub3QgcmVzdG9yZWQgb24gdGhlXG4gIC8vIHN0cmVuZ3RoIG9mIHRob3NlIGNsb3N1cmVzIGFsb25lIFx1MjAxNCBgdGVzdC9kYXNoYm9hcmQtZGF0ZS1yYW5nZS13aW5kb3cudGVzdC50c2BcbiAgLy8gZXhlY3V0ZXMgaXQgYWdhaW5zdCBhIHJlYWwgU1FMaXRlIGRhdGFiYXNlIGFuZCBjb21wYXJlcyBldmVyeSB3aWRnZXQgdG8gYVxuICAvLyBncm91bmQgdHJ1dGggY29tcHV0ZWQgaW4gdGhlIHNhbWUgcnVuLCBzbyBhIHJlLXJlZ3Jlc3Npb24gZmFpbHMgQ0kgaGVyZVxuICAvLyByYXRoZXIgdGhhbiBiZWluZyBkaXNjb3ZlcmVkIGFzIGFuIGFsbC16ZXJvIGRhc2hib2FyZCBhZ2Fpbi5cbiAgLy9cbiAgLy8gVGhlIHJhbmdlIHdpbmRvd3MgYGNyZWF0ZWRfYXRgLCB0aGUgcGxhdGZvcm0ncyBjcmVhdGlvbiBzdGFtcCAoIzE5OTIpLiBJdFxuICAvLyB1c2VkIHRvIHdpbmRvdyBgY3JlYXRlZF9kYXRlYCwgd2hpY2ggbm90aGluZyB3cm90ZSBvbiBhIHJlYWwgY2FzZSwgc29cbiAgLy8gZXZlcnkgY2FzZSBjcmVhdGVkIHRocm91Z2ggdGhlIFVJIG9yIFJFU1QgZmVsbCBvdXRzaWRlIGV2ZXJ5IHJhbmdlLlxuICBkYXRlUmFuZ2U6IHsgZmllbGQ6ICdjcmVhdGVkX2F0JywgZGVmYXVsdFJhbmdlOiAnbGFzdF85MF9kYXlzJywgYWxsb3dDdXN0b21SYW5nZTogdHJ1ZSB9LFxuXG4gIGdsb2JhbEZpbHRlcnM6IFtcbiAgICB7XG4gICAgICBmaWVsZDogJ293bmVyX2lkJyxcbiAgICAgIGxhYmVsOiB7IGVuOiAnQWdlbnQnLCAnemgtQ04nOiAnXHU4RDFGXHU4RDIzXHU0RUJBJywgJ2VzLUVTJzogJ1Byb3BpZXRhcmlvIGRlbCBDYXNvJywgJ2phLUpQJzogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgc2NvcGU6ICdkYXNoYm9hcmQnLFxuICAgICAgb3B0aW9uc0Zyb206IHsgb2JqZWN0OiAnc3lzX3VzZXInLCB2YWx1ZUZpZWxkOiAnaWQnLCBsYWJlbEZpZWxkOiAnbmFtZScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZpZWxkOiAncHJpb3JpdHknLFxuICAgICAgbGFiZWw6IHsgZW46ICdQcmlvcml0eScsICd6aC1DTic6ICdcdTRGMThcdTUxNDhcdTdFQTcnLCAnZXMtRVMnOiAnUHJpb3JpZGFkJywgJ2phLUpQJzogJ1x1NTEyQVx1NTE0OFx1NUVBNicgfSxcbiAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgc2NvcGU6ICdkYXNoYm9hcmQnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICAvLyB6aC1DTiBgY3JpdGljYWxgIGlzIFx1NEUyNVx1OTFDRCwgbmV2ZXIgXHU3RDI3XHU2MDI1IFx1MjAxNCBcdTdEMjdcdTYwMjUgYmVsb25ncyB0byBjcm1fdGFzay5wcmlvcml0eS51cmdlbnRcbiAgICAgICAgLy8gYW5kIHRoZSB0d28gdm9jYWJ1bGFyaWVzIGFyZSBkaXN0aW5jdCBzZXRzIChydWxpbmcgIzEzNDIpLiBTYW1lIHdvcmRpbmcgYXNcbiAgICAgICAgLy8gYG9iamVjdHMuY3JtX2Nhc2UuZmllbGRzLnByaW9yaXR5Lm9wdGlvbnNgIGluIGV2ZXJ5IGxvY2FsZSBwYWNrLlxuICAgICAgICB7IHZhbHVlOiAnY3JpdGljYWwnLCBsYWJlbDogeyBlbjogJ0NyaXRpY2FsJywgJ3poLUNOJzogJ1x1NEUyNVx1OTFDRCcsICdlcy1FUyc6ICdDclx1MDBFRHRpY2EnLCAnamEtSlAnOiAnXHU5MUNEXHU1OTI3JyB9IH0sXG4gICAgICAgIHsgdmFsdWU6ICdoaWdoJywgICAgIGxhYmVsOiB7IGVuOiAnSGlnaCcsICd6aC1DTic6ICdcdTlBRDgnLCAnZXMtRVMnOiAnQWx0YScsICdqYS1KUCc6ICdcdTlBRDgnIH0gfSxcbiAgICAgICAgeyB2YWx1ZTogJ21lZGl1bScsICAgbGFiZWw6IHsgZW46ICdNZWRpdW0nLCAnemgtQ04nOiAnXHU0RTJEJywgJ2VzLUVTJzogJ01lZGlhJywgJ2phLUpQJzogJ1x1NEUyRCcgfSB9LFxuICAgICAgICB7IHZhbHVlOiAnbG93JywgICAgICBsYWJlbDogeyBlbjogJ0xvdycsICd6aC1DTic6ICdcdTRGNEUnLCAnZXMtRVMnOiAnQmFqYScsICdqYS1KUCc6ICdcdTRGNEUnIH0gfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXSxcblxuICB3aWRnZXRzOiBbXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyAxOiBDYXNlLUxvYWQgS1BJcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBpZDogJ29wZW5fY2FzZXMnLFxuICAgICAgdGl0bGU6ICdPcGVuIENhc2VzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2FzZXMgdGhhdCBhcmUgbm90IHlldCBjbG9zZWQnLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgaXNfY2xvc2VkOiBmYWxzZSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnb3JhbmdlJyxcbiAgICAgIGRhdGFzZXQsIHZhbHVlczogWydjYXNlX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMCwgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdjcml0aWNhbF9jYXNlcycsXG4gICAgICB0aXRsZTogJ0NyaXRpY2FsIENhc2VzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3BlbiBjYXNlcyBtYXJrZWQgYXMgY3JpdGljYWwgcHJpb3JpdHknLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgcHJpb3JpdHk6ICdjcml0aWNhbCcsIGlzX2Nsb3NlZDogZmFsc2UgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2RhbmdlcicsXG4gICAgICBkYXRhc2V0LCB2YWx1ZXM6IFsnY2FzZV9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDMsIHk6IDAsIHc6IDMsIGg6IDIgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnYXZnX3Jlc29sdXRpb25fdGltZScsXG4gICAgICB0aXRsZTogJ0F2ZyBSZXNvbHV0aW9uIFRpbWUnLFxuICAgICAgZGVzY3JpcHRpb246ICdNZWFuIHRpbWUgdG8gY2xvc2UsIGluIGhvdXJzJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IGlzX2Nsb3NlZDogdHJ1ZSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnYmx1ZScsXG4gICAgICBkYXRhc2V0LCB2YWx1ZXM6IFsnYXZnX3Jlc29sdXRpb24nXSxcbiAgICAgIGxheW91dDogeyB4OiA2LCB5OiAwLCB3OiAzLCBoOiAyIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ3NsYV92aW9sYXRpb25zJyxcbiAgICAgIHRpdGxlOiAnU0xBIFZpb2xhdGlvbnMnLFxuICAgICAgZGVzY3JpcHRpb246ICdDYXNlcyB0aGF0IGJyZWFjaGVkIHRoZWlyIFNMQScsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIC8vIENvdW50ZWQgYXQgUkVBRCB0aW1lICgjMjA3MCk6IGEgY2FzZSBhbHJlYWR5IGZsYWdnZWQsIE9SIGEgY2FzZSBzdGlsbFxuICAgICAgLy8gb3BlbiB3aG9zZSBkZWFkbGluZSBoYXMgcGFzc2VkLiBUaGUgc2Vjb25kIGJyYW5jaCBpcyB0aGUgc2VsZWN0aW9uXG4gICAgICAvLyBgY2FzZV9zbGFfbW9uaXRvcmAgc3dlZXBzIFx1MjAxNCBzYW1lIHN0YXR1cyBzZXQsIHNhbWUgc3RyaWN0IGAkbHRgIGF0IHRoZVxuICAgICAgLy8gY3VycmVudCBpbnN0YW50IChge25vd31gIGlzIHRoYXQgaW5zdGFudCBpbiBhIHF1ZXJ5IGZpbHRlcjsgYHtOT1coKX1gXG4gICAgICAvLyBpbiBhIGZsb3cgdGVtcGxhdGUpIFx1MjAxNCBzbyB0aGUgdGlsZSByZWFkcyB0cnVlIG9uIGEgZGVwbG95bWVudCB0aGF0IHJ1bnNcbiAgICAgIC8vIG5vIHNjaGVkdWxlZCB3b3JrLCB3aGVyZSBub3RoaW5nIGZsYWdzIGFuIG9wZW4gYnJlYWNoLiBJdCBjb3VudHM7IGl0XG4gICAgICAvLyBkb2VzIG5vdCBhY3Q6IGVzY2FsYXRpb24gYW5kIHRoZSBvd25lcidzIGFsZXJ0IHN0aWxsIG5lZWQgdGhlIHN3ZWVwLlxuICAgICAgLy8gYHRlc3QvY2FzZS1zbGEtYnJlYWNoLW9uLWNsb3NlLnRlc3QudHNgIHBpbnMgdGhlIHR3byB0byBvbmUgc2VsZWN0aW9uLlxuICAgICAgZmlsdGVyOiB7XG4gICAgICAgICRvcjogW1xuICAgICAgICAgIHsgaXNfc2xhX3Zpb2xhdGVkOiB0cnVlIH0sXG4gICAgICAgICAgeyBzdGF0dXM6IHsgJG5pbjogWydyZXNvbHZlZCcsICdjbG9zZWQnXSB9LCBzbGFfZHVlX2RhdGU6IHsgJGx0OiAne25vd30nIH0gfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICd3YXJuaW5nJyxcbiAgICAgIGRhdGFzZXQsIHZhbHVlczogWydjYXNlX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogOSwgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgUm93IDI6IERpc3RyaWJ1dGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBpZDogJ2Nhc2VzX2J5X3N0YXR1cycsXG4gICAgICB0aXRsZTogJ0Nhc2VzIGJ5IFN0YXR1cycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1dvcmtsb2FkIGRpc3RyaWJ1dGlvbiBhY3Jvc3MgdGhlIHBpcGVsaW5lJyxcbiAgICAgIHR5cGU6ICdkb251dCcsXG4gICAgICBmaWx0ZXI6IHsgaXNfY2xvc2VkOiBmYWxzZSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnYmx1ZScsXG4gICAgICBkYXRhc2V0LCBkaW1lbnNpb25zOiBbJ3N0YXR1cyddLCB2YWx1ZXM6IFsnY2FzZV9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDIsIHc6IDQsIGg6IDQgfSxcbiAgICAgIGNoYXJ0Q29uZmlnOiB7XG4gICAgICAgIHNob3dMZWdlbmQ6IHRydWUsXG4gICAgICAgIHNob3dEYXRhTGFiZWxzOiB0cnVlLFxuICAgICAgICBjb2xvcnM6IFsnIzBFQTVFOScsICcjMDZCNkQ0JywgJyMxNEI4QTYnLCAnIzEwQjk4MScsICcjRjU5RTBCJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdjYXNlc19ieV9wcmlvcml0eScsXG4gICAgICB0aXRsZTogJ0Nhc2VzIGJ5IFByaW9yaXR5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3BlbiBjYXNlIG1peCBieSB1cmdlbmN5JyxcbiAgICAgIHR5cGU6ICdwaWUnLFxuICAgICAgZmlsdGVyOiB7IGlzX2Nsb3NlZDogZmFsc2UgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ3dhcm5pbmcnLFxuICAgICAgZGF0YXNldCwgZGltZW5zaW9uczogWydwcmlvcml0eSddLCB2YWx1ZXM6IFsnY2FzZV9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDQsIHk6IDIsIHc6IDQsIGg6IDQgfSxcbiAgICAgIGNoYXJ0Q29uZmlnOiB7XG4gICAgICAgIHNob3dMZWdlbmQ6IHRydWUsXG4gICAgICAgIHNob3dEYXRhTGFiZWxzOiB0cnVlLFxuICAgICAgICAvLyBjcml0aWNhbCBcdTIxOTIgaGlnaCBcdTIxOTIgbWVkaXVtIFx1MjE5MiBsb3dcbiAgICAgICAgY29sb3JzOiBbJyNEQzI2MjYnLCAnI0Y5NzMxNicsICcjRjU5RTBCJywgJyMxMEI5ODEnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2Nhc2VzX2J5X29yaWdpbicsXG4gICAgICB0aXRsZTogJ0Nhc2VzIGJ5IE9yaWdpbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ1doZXJlIG91ciBjYXNlcyBhcmUgY29taW5nIGZyb20nLFxuICAgICAgdHlwZTogJ2JhcicsXG4gICAgICBjb2xvclZhcmlhbnQ6ICdwdXJwbGUnLFxuICAgICAgZGF0YXNldCwgZGltZW5zaW9uczogWydvcmlnaW4nXSwgdmFsdWVzOiBbJ2Nhc2VfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiA4LCB5OiAyLCB3OiA0LCBoOiA0IH0sXG4gICAgICBjaGFydENvbmZpZzoge1xuICAgICAgICBzaG93TGVnZW5kOiBmYWxzZSxcbiAgICAgICAgc2hvd0RhdGFMYWJlbHM6IHRydWUsXG4gICAgICAgIGNvbG9yczogWycjOEI1Q0Y2J10sXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgUm93IDM6IFZvbHVtZSAmIFNMQSBUcmVuZHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgaWQ6ICdkYWlseV9jYXNlX3ZvbHVtZScsXG4gICAgICB0aXRsZTogJ0RhaWx5IENhc2UgVm9sdW1lJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTmV3IGNhc2VzIGNyZWF0ZWQgb3ZlciB0aGUgbGFzdCAzMCBkYXlzJyxcbiAgICAgIHR5cGU6ICdhcmVhJyxcbiAgICAgIGZpbHRlcjogeyBjcmVhdGVkX2F0OiB7ICRndGU6ICd7MzBfZGF5c19hZ299JyB9IH0sXG4gICAgICAvLyBPcHRlZCBvdXQgT04gUFVSUE9TRSwgcmUtZGVjaWRlZCBpbiAjMTE1NyByYXRoZXIgdGhhbiBpbmhlcml0ZWQuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIGZsb29yIGFib3ZlIGlzIG5vIGxvbmdlciBpbmVydDogb24gMTcuMC4wIGB7MzBfZGF5c19hZ299YCByZXNvbHZlc1xuICAgICAgLy8gdG8gYSBzdGFydC1vZi1kYXkgYm91bmQgdGhlIGRyaXZlciBjb21wYXJlcyBjb3JyZWN0bHkgKG1lYXN1cmVkLCB3aXRoIGFcbiAgICAgIC8vIGdyb3VuZCB0cnV0aCwgaW4gYHRlc3QvZGFzaGJvYXJkLWRhdGUtcmFuZ2Utd2luZG93LnRlc3QudHNgKSwgc28gdGhpc1xuICAgICAgLy8gY2hhcnQgcmVhbGx5IGRvZXMgcGxvdCB0aGUgbGFzdCAzMCBkYXlzIGFuZCBpdHMgdGl0bGUgaXMgdHJ1ZSBhZ2Fpbi5cbiAgICAgIC8vIFRoYXQgaXMgZXhhY3RseSB3aHkgaXQgbXVzdCBub3QgZm9sbG93IHRoZSBwaWNrZXI6IHRoZSBkYXNoYm9hcmQgcmFuZ2VcbiAgICAgIC8vIGlzIEFORGVkIGludG8gZXZlcnkgYm91bmQgd2lkZ2V0LCBzbyBhIHJlYWRlciB3aG8gc2VsZWN0cyBcImxhc3QgNyBkYXlzXCJcbiAgICAgIC8vIHdvdWxkIGdldCBhIDctZGF5IGNoYXJ0IHN0aWxsIGxhYmVsbGVkIFwibGFzdCAzMCBkYXlzXCIuIFNlbGYtZGVzY3JpYmVkXG4gICAgICAvLyB3aW5kb3dzIG9wdCBvdXQgXHUyMDE0IHRoZSBzYW1lIHJ1bGUgdGhlIEV4ZWN1dGl2ZSBkYXNoYm9hcmQncyBZVEQgdGlsZVxuICAgICAgLy8gZm9sbG93cywgcGlubmVkIGJ5IGB0ZXN0L2FjdGlvbi1yZWZlcmVuY2VzLnRlc3QudHNgLiBCaW5kaW5nIGl0IGluc3RlYWRcbiAgICAgIC8vIHdvdWxkIG1lYW4gZHJvcHBpbmcgdGhpcyBmaWx0ZXIgYW5kIHJldGl0bGluZyB0aGUgd2lkZ2V0IGluIGFsbCBmb3VyXG4gICAgICAvLyBsb2NhbGUgYnVuZGxlczsgdGhlIGZpeGVkIDMwLWRheSB2b2x1bWUgdHJlbmQgYmVzaWRlIGEgOTAtZGF5IGNhc2UgbG9hZFxuICAgICAgLy8gaXMgdGhlIGludGVuZGVkIHJlYWRpbmcuXG4gICAgICBmaWx0ZXJCaW5kaW5nczogeyBkYXRlUmFuZ2U6IGZhbHNlIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdibHVlJyxcbiAgICAgIGRhdGFzZXQsIGRpbWVuc2lvbnM6IFsnY3JlYXRlZF9hdCddLCB2YWx1ZXM6IFsnY2FzZV9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDYsIHc6IDgsIGg6IDQgfSxcbiAgICAgIGNoYXJ0Q29uZmlnOiB7XG4gICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlLFxuICAgICAgICBzaG93RGF0YUxhYmVsczogZmFsc2UsXG4gICAgICAgIGNvbG9yczogWycjMEVBNUU5J10sXG4gICAgICAgIGludGVyYWN0aW9uOiB7IHRvb2x0aXBzOiB0cnVlLCBicnVzaDogdHJ1ZSB9LFxuICAgICAgfSxcbiAgICAgIG9wdGlvbnM6IHsgZGF0ZUdyYW51bGFyaXR5OiAnZGF5JyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdzbGFfY29tcGxpYW5jZV9nYXVnZScsXG4gICAgICB0aXRsZTogJ1NMQSBDb21wbGlhbmNlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUGVyY2VudCBvZiBjYXNlcyByZXNvbHZlZCB3aXRoaW4gU0xBIHRoaXMgcGVyaW9kJyxcbiAgICAgIHR5cGU6ICdnYXVnZScsXG4gICAgICBmaWx0ZXI6IHsgaXNfY2xvc2VkOiB0cnVlIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdzdWNjZXNzJyxcbiAgICAgIC8vIFBsb3RzIENPTVBMSUFOQ0UsIHRoZSBxdWFudGl0eSB0aGUgdGl0bGUsIHRoZSBkZXNjcmlwdGlvbiwgdGhlXG4gICAgICAvLyBzdWNjZXNzIGNvbG91cmluZyBhbmQgdGhlIDAuOTUgdGFyZ2V0IGxpbmUgYWxsIG5hbWUgKCMxMjEzKS4gSXQgdXNlZFxuICAgICAgLy8gdG8gcGxvdCBgYXZnX3NsYV92aW9sYXRlZGAgXHUyMDE0IHRoZSBjb21wbGVtZW50IFx1MjAxNCB3aXRoIGBvcHRpb25zLmludmVydGBcbiAgICAgIC8vIGFza2luZyB0aGUgcmVuZGVyZXIgdG8gZmxpcCBpdC4gYGludmVydGAgaXMgbm90IGEgZGVjbGFyZWQga2V5IG9uXG4gICAgICAvLyBgRGFzaGJvYXJkV2lkZ2V0T3B0aW9uc1NjaGVtYWA7IGl0IHJvZGUgdGhlIGAucGFzc3Rocm91Z2goKWAsIG5vdGhpbmdcbiAgICAgIC8vIGNvdWxkIHJlcG9ydCBpdCBpbmVydCwgYW5kIHRoZSBnYXVnZSByZWFkIDAuMCUgb24gYW4gb3JnIHdpdGggMTAwJVxuICAgICAgLy8gY29tcGxpYW5jZS4gVGhlIGtleSBpcyBnb25lIHJhdGhlciB0aGFuIGxlZnQgcHJldGVuZGluZzogYSBtZWFzdXJlXG4gICAgICAvLyB0aGF0IG1lYW5zIHdoYXQgdGhlIHdpZGdldCBzYXlzIGlzIHRoZSBmaXgsIGFuZCB0aGUgbWVhc3VyZSdzIG93blxuICAgICAgLy8gbGFiZWwgcHJpbnRzIHVuZGVyIHRoZSBudW1iZXIsIHNvIHRoZSB0d28gY2Fubm90IGRyaWZ0IGFwYXJ0IGFnYWluLlxuICAgICAgZGF0YXNldCwgdmFsdWVzOiBbJ3NsYV9jb21wbGlhbmNlX3JhdGUnXSxcbiAgICAgIGxheW91dDogeyB4OiA4LCB5OiA2LCB3OiA0LCBoOiA0IH0sXG4gICAgICBjaGFydENvbmZpZzoge1xuICAgICAgICBzaG93TGVnZW5kOiBmYWxzZSxcbiAgICAgICAgc2hvd0RhdGFMYWJlbHM6IHRydWUsXG4gICAgICAgIGNvbG9yczogWycjMTBCOTgxJywgJyNGNTlFMEInLCAnI0VGNDQ0NCddLFxuICAgICAgICBhbm5vdGF0aW9uczogW1xuICAgICAgICAgIHsgdHlwZTogJ2xpbmUnLCBheGlzOiAneScsIHZhbHVlOiAwLjk1LCBsYWJlbDogJ1RhcmdldCcsIHN0eWxlOiAnZGFzaGVkJywgY29sb3I6ICcjMTBCOTgxJyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIC8vIFRoZSB0YXJnZXQgbGluZSB3YXMgd3JpdHRlbiBmb3IgQ09NUExJQU5DRSBhbmQgaXMgdW5jaGFuZ2VkOiBpdCB3YXNcbiAgICAgIC8vIGFsd2F5cyByaWdodCBcdTIwMTQgaXQgd2FzIHRoZSBwbG90dGVkIHZhbHVlIHRoYXQgZGlzYWdyZWVkIHdpdGggaXQuIChUaGVcbiAgICAgIC8vIGdyZWVuL2FtYmVyL3JlZCBgb3B0aW9ucy50aHJlc2hvbGRzYCBsYWRkZXIgYmVzaWRlIGl0IHdhcyBkZWxldGVkIGluXG4gICAgICAvLyAxNy42LjAncyBzdHJpY3QgY2xlYW51cDogbm8gZGFzaGJvYXJkIHJlbmRlcmVyIHJlYWRzIHdpZGdldFxuICAgICAgLy8gYHRocmVzaG9sZHNgLCBzbyBpdCBuZXZlciBjb2xvdXJlZCBhbnl0aGluZy4pXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSb3cgNDogS25vd2xlZGdlIGRlZmxlY3Rpb24gKCM2MDEpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gVGhlIGRlZmxlY3Rpb24gbWV0cmljIHRoZSBjYXJkIGFza3MgdGhlIHNlcnZpY2UgZGFzaGJvYXJkIHRvIHNob3csIGFuZFxuICAgIC8vIHRoZSByZWFzb24gaXQgaXMgVEhSRUUgdGlsZXMgcmF0aGVyIHRoYW4gb25lOiBhIHJhdGlvIHdpZGdldCBvbiBpdHMgb3duXG4gICAgLy8gaXMgdW5yZWFkYWJsZSBcdTIwMTQgMTAwJSBjb3VsZCBiZSBcIjQwIG9mIDQwXCIgb3IgXCIxIG9mIDFcIiwgYW5kIGEgYmxhbmsgcmF0ZVxuICAgIC8vIGNvdWxkIGJlIFwibm8gY2xvc2VkIGNhc2VzXCIgb3IgXCJubyBLQiByZXNvbHV0aW9uc1wiIChtZWFzdXJlZDogYSBmaWx0ZXJlZFxuICAgIC8vIG1lYXN1cmUgY29udHJpYnV0ZXMgTk8gcm93IGZvciBhIGdyb3VwIGl0IHNlbGVjdHMgbm90aGluZyBpbiwgc28gdGhlXG4gICAgLy8gcmF0ZSBjb21lcyBiYWNrIGFic2VudCwgbm90IDApLiBOdW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIHRoZXJlZm9yZSBzaGlwXG4gICAgLy8gYmVzaWRlIHRoZSBwZXJjZW50YWdlLCB0aGUgc2FtZSBydWxlIHRoZSBzYWxlcyBkYXNoYm9hcmQncyB3aW4gcmF0ZVxuICAgIC8vIGZvbGxvd3MgYWZ0ZXIgIzYxNC5cbiAgICB7XG4gICAgICBpZDogJ2tiX2RlZmxlY3Rpb25fcmF0ZScsXG4gICAgICB0aXRsZTogJ0tCIERlZmxlY3Rpb24gUmF0ZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NoYXJlIG9mIGNsb3NlZCBjYXNlcyByZXNvbHZlZCB3aXRoIGEga25vd2xlZGdlIGFydGljbGUnLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBjb2xvclZhcmlhbnQ6ICdzdWNjZXNzJyxcbiAgICAgIGRhdGFzZXQsIHZhbHVlczogWydrYl9kZWZsZWN0aW9uX3JhdGUnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAxMCwgdzogNCwgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdrYl9yZXNvbHZlZF9jYXNlcycsXG4gICAgICB0aXRsZTogJ1Jlc29sdmVkIGJ5IEtCJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2xvc2VkIGNhc2VzIHBvaW50aW5nIGF0IHRoZSBhcnRpY2xlIHRoYXQgcmVzb2x2ZWQgdGhlbScsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgZGF0YXNldCwgdmFsdWVzOiBbJ2tiX3Jlc29sdmVkX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogNCwgeTogMTAsIHc6IDQsIGg6IDIgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnY2xvc2VkX2Nhc2VzX3RvdGFsJyxcbiAgICAgIHRpdGxlOiAnQ2xvc2VkIENhc2VzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRlbm9taW5hdG9yIGJlaGluZCB0aGUgZGVmbGVjdGlvbiByYXRlJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgY29sb3JWYXJpYW50OiAnZGVmYXVsdCcsXG4gICAgICBkYXRhc2V0LCB2YWx1ZXM6IFsnY2xvc2VkX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogOCwgeTogMTAsIHc6IDQsIGg6IDIgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAndG9wX3Jlc29sdmluZ19hcnRpY2xlcycsXG4gICAgICB0aXRsZTogJ1RvcCBSZXNvbHZpbmcgQXJ0aWNsZXMnLFxuICAgICAgZGVzY3JpcHRpb246ICdLbm93bGVkZ2UgYXJ0aWNsZXMgcmFua2VkIGJ5IHRoZSBjbG9zZWQgY2FzZXMgdGhleSByZXNvbHZlZCcsXG4gICAgICB0eXBlOiAndGFibGUnLFxuICAgICAgZmlsdGVyOiB7IGlzX2Nsb3NlZDogdHJ1ZSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnZGVmYXVsdCcsXG4gICAgICBkYXRhc2V0LCBkaW1lbnNpb25zOiBbJ3Jlc29sdmVkX2FydGljbGUnXSwgdmFsdWVzOiBbJ2tiX3Jlc29sdmVkX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMCwgeTogMTIsIHc6IDEyLCBoOiA0IH0sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHNvcnRCeTogJ2tiX3Jlc29sdmVkX2NvdW50JyxcbiAgICAgICAgc29ydE9yZGVyOiAnZGVzYycsXG4gICAgICAgIGxpbWl0OiAxMCxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSb3cgNTogTXkgT3BlbiBDYXNlcyBieSBQcmlvcml0eSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvLyBBIGRhc2hib2FyZCBgdGFibGVgIGJpbmRzIHRvIGFuIGFuYWx5dGljcyBjdWJlIGFuZCBhZ2dyZWdhdGVzOyBpdCBjYW5ub3RcbiAgICAvLyBsaXN0IGluZGl2aWR1YWwgY2FzZXMgKEFEUi0wMDIxKSBcdTIwMTQgZm9yIHRoZSBjYXNlLWJ5LWNhc2UgcXVldWUsIHVzZSB0aGVcbiAgICAvLyBteV9vcGVuX2Nhc2VzIExpc3RWaWV3IChcIk15IENhc2VzXCIgaW4gdGhlIE15IFdvcmsgbmF2IGdyb3VwKS5cbiAgICAvLyBge2N1cnJlbnRfdXNlcl9pZH1gIHNjb3BlcyB3aGF0IHRoaXMgd2lkZ2V0IFNIT1dTOyBpdCBpcyBwcmVzZW50YXRpb25cbiAgICAvLyBzY29wZSwgbm90IGFuIGFjY2VzcyBib3VuZGFyeSBcdTIwMTQgcm93LWxldmVsIHNlY3VyaXR5IG93bnMgdGhhdCAoIzUxMCkuXG4gICAge1xuICAgICAgaWQ6ICdteV9vcGVuX2Nhc2VzX2J5X3ByaW9yaXR5JyxcbiAgICAgIHRpdGxlOiAnTXkgT3BlbiBDYXNlcyBieSBQcmlvcml0eScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1lvdXIgb3BlbiBjYXNlcyBhbmQgdGhlaXIgU0xBLXZpb2xhdGlvbiByYXRlLCBicm9rZW4gZG93biBieSBwcmlvcml0eScsXG4gICAgICB0eXBlOiAndGFibGUnLFxuICAgICAgZmlsdGVyOiB7IGlzX2Nsb3NlZDogZmFsc2UsIG93bmVyX2lkOiAne2N1cnJlbnRfdXNlcl9pZH0nIH0sXG4gICAgICAvLyBPcHRzIG91dCBvZiB0aGUgQWdlbnQgZ2xvYmFsIGZpbHRlciAoa2V5ZWQgYnkgaXRzIGZpZWxkLCBgb3duZXJfaWRgKTpcbiAgICAgIC8vIEFORGluZyBhbiBhZ2VudCBwaWNrIGludG8gXCJtaW5lXCIgZW1wdGllcyB0aGUgd2lkZ2V0IGZvciBhbnlvbmUgZWxzZS5cbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IG93bmVyX2lkOiBmYWxzZSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnZGVmYXVsdCcsXG4gICAgICBkYXRhc2V0LCBkaW1lbnNpb25zOiBbJ3ByaW9yaXR5J10sIHZhbHVlczogWydjYXNlX2NvdW50JywgJ2F2Z19zbGFfdmlvbGF0ZWQnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAxNiwgdzogMTIsIGg6IDQgfSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgc29ydEJ5OiAnY2FzZV9jb3VudCcsXG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuICAgICAgICBsaW1pdDogMTAsXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9kYXRhc2V0cy9jYXNlLmRhdGFzZXQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9kYXRhc2V0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2RhdGFzZXRzL2Nhc2UuZGF0YXNldC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lRGF0YXNldCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBDYXNlIGFuYWx5dGljcyBkYXRhc2V0IChBRFItMDAyMSkgXHUyMDE0IHRoZSBzZW1hbnRpYyBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZVxuICogU2VydmljZSBkYXNoYm9hcmQncyBjYXNlIGNvdW50cywgcmVzb2x1dGlvbiB0aW1lIGFuZCBTTEEgY29tcGxpYW5jZS5cbiAqL1xuZXhwb3J0IGNvbnN0IENhc2VEYXRhc2V0ID0gZGVmaW5lRGF0YXNldCh7XG4gIG5hbWU6ICdjYXNlX21ldHJpY3MnLFxuICBsYWJlbDogJ0Nhc2UgTWV0cmljcycsXG4gIGRlc2NyaXB0aW9uOiAnU2VtYW50aWMgbGF5ZXIgZm9yIHN1cHBvcnQtY2FzZSBjb3VudHMsIHJlc29sdXRpb24gdGltZSBhbmQgU0xBJyxcbiAgb2JqZWN0OiAnY3JtX2Nhc2UnLFxuXG4gIGRpbWVuc2lvbnM6IFtcbiAgICB7IG5hbWU6ICdzdGF0dXMnLCBsYWJlbDogJ1N0YXR1cycsIGZpZWxkOiAnc3RhdHVzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICB7IG5hbWU6ICdwcmlvcml0eScsIGxhYmVsOiAnUHJpb3JpdHknLCBmaWVsZDogJ3ByaW9yaXR5JywgdHlwZTogJ3N0cmluZycgfSxcbiAgICB7IG5hbWU6ICdvcmlnaW4nLCBsYWJlbDogJ09yaWdpbicsIGZpZWxkOiAnb3JpZ2luJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICB7IG5hbWU6ICd0eXBlJywgbGFiZWw6ICdUeXBlJywgZmllbGQ6ICd0eXBlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAvLyBUaGUgcGxhdGZvcm0ncyBjcmVhdGlvbiBzdGFtcCAoIzE5OTIpIFx1MjAxNCB0aGUgc2FtZSBkaW1lbnNpb25cbiAgICAvLyBgYWNjb3VudF9tZXRyaWNzYCBhbmQgYGxlYWRfbWV0cmljc2AgZGVjbGFyZSwgYnVja2V0ZWQgYnkgZGF5IGhlcmUuXG4gICAgeyBuYW1lOiAnY3JlYXRlZF9hdCcsIGxhYmVsOiAnQ3JlYXRlZCcsIGZpZWxkOiAnY3JlYXRlZF9hdCcsIHR5cGU6ICdkYXRlJywgZGF0ZUdyYW51bGFyaXR5OiAnZGF5JyB9LFxuICAgIC8vIEFydGljbGUgcmFua2luZyBieSByZXNvbHV0aW9ucyAoIzYwMSkgXHUyMDE0IGdyb3VwIGNsb3NlZCBjYXNlcyBieSB0aGVcbiAgICAvLyBhcnRpY2xlIHRoYXQgcmVzb2x2ZWQgdGhlbS4gYHR5cGU6ICdsb29rdXAnYCwgdGhlIHNhbWUgc3BlbGxpbmcgdGhlXG4gICAgLy8gYG93bmVyYCBkaW1lbnNpb24gb24gYG9wcG9ydHVuaXR5X21ldHJpY3NgIHVzZXMgZm9yIGBvd25lcl9pZGAuXG4gICAgeyBuYW1lOiAncmVzb2x2ZWRfYXJ0aWNsZScsIGxhYmVsOiAnUmVzb2x2aW5nIEFydGljbGUnLCBmaWVsZDogJ3Jlc29sdmVkX2J5X2FydGljbGUnLCB0eXBlOiAnbG9va3VwJyB9LFxuICBdLFxuXG4gIG1lYXN1cmVzOiBbXG4gICAgeyBuYW1lOiAnY2FzZV9jb3VudCcsIGxhYmVsOiAnQ2FzZXMnLCBhZ2dyZWdhdGU6ICdjb3VudCcgfSxcbiAgICB7IG5hbWU6ICdhdmdfcmVzb2x1dGlvbicsIGxhYmVsOiAnQXZnIFJlc29sdXRpb24gKGgpJywgYWdncmVnYXRlOiAnYXZnJywgZmllbGQ6ICdyZXNvbHV0aW9uX3RpbWVfaG91cnMnLCBmb3JtYXQ6ICcwLjAnIH0sXG4gICAgeyBuYW1lOiAnYXZnX3NsYV92aW9sYXRlZCcsIGxhYmVsOiAnU0xBIFZpb2xhdGlvbiBSYXRlJywgYWdncmVnYXRlOiAnYXZnJywgZmllbGQ6ICdpc19zbGFfdmlvbGF0ZWQnLCBmb3JtYXQ6ICcwLjAlJyB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEtub3dsZWRnZSBkZWZsZWN0aW9uICgjNjAxKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIFwiJSBvZiBjbG9zZWQgY2FzZXMgcmVzb2x2ZWQgd2l0aCBhbiBhcnRpY2xlXCIuIEJ1aWx0IHRvIHRoZSBzaGFwZVxuICAgIC8vIGBvcHBvcnR1bml0eV9tZXRyaWNzLndpbl9yYXRlYCBhcnJpdmVkIGF0IHRoZSBoYXJkIHdheSAoIzU5My8jNjE0KTogdGhlXG4gICAgLy8gdHdvIGhhbHZlcyBvZiB0aGUgcmF0aW8gYXJlIGRlY2xhcmVkIEhFUkUgYXMgbmFtZWQgbWVhc3VyZXMsIG9uY2UsIHNvIG5vXG4gICAgLy8gd2lkZ2V0IGltcHJvdmlzZXMgYSBkZW5vbWluYXRvciBcdTIwMTQgYSB3cm9uZyBkZW5vbWluYXRvciBkb2VzIG5vdCBlcnJvciwgaXRcbiAgICAvLyByZXR1cm5zIGEgcGxhdXNpYmxlIG51bWJlci5cbiAgICAvL1xuICAgIC8vIEVhY2ggaGFsZiBjYXJyaWVzIGl0cyBPV04gYGZpbHRlcmAsIHdoaWNoIHRoZSBleGVjdXRvciBydW5zIGFzIGFcbiAgICAvLyBzdWItcXVlcnkgYW5kIG1lcmdlcyBiYWNrIG9uIHRoZSBzZWxlY3RlZCBkaW1lbnNpb25zLiBBIHdpZGdldC1sZXZlbFxuICAgIC8vIGZpbHRlciBjYW5ub3QgZXhwcmVzcyB0aGlzOiBpdCB3b3VsZCBuYXJyb3cgQk9USCBoYWx2ZXMgdG8gdGhlIHNhbWUgcm93XG4gICAgLy8gc2V0LCB3aGljaCBpcyBob3cgeW91IGVuZCB1cCBkaXZpZGluZyBhIG51bWJlciBieSBpdHNlbGYuXG4gICAgLy9cbiAgICAvLyBga2JfcmVzb2x2ZWRfY291bnRgIGNvdW50cyB0aGUgQ09MVU1OLCBub3QgdGhlIHJvd3M6IGBjb3VudCg8ZmllbGQ+KWBcbiAgICAvLyBjb3VudHMgbm9uLU5VTEwgdmFsdWVzLCBzbyBpdCBuZWVkcyBubyBgJG5lOiBudWxsYCBwcmVkaWNhdGUgYW5kIG5vXG4gICAgLy8gcGFyYWxsZWwgYm9vbGVhbiBmbGFnIHRvIGRyaWZ0IG91dCBvZiBzdGVwIHdpdGggdGhlIGxvb2t1cC4gTUVBU1VSRUQgb25cbiAgICAvLyAxNy4wLjAtcmMuNiBhZ2FpbnN0IGJvdGggZHJpdmVycyBcdTIwMTQgdGhlIG51bWJlcnMgYXJlIHBpbm5lZCBpblxuICAgIC8vIGB0ZXN0L2tub3dsZWRnZS1kZWZsZWN0aW9uLnRlc3QudHNgLiBUaGUgb25lIHRoaW5nIGl0IENBTk5PVCBkaXNjb3VudCBpc1xuICAgIC8vIGFuIGVtcHR5IHN0cmluZywgd2hpY2ggaXMgbm9uLU5VTEw7IHRoYXQgaXMgd2h5IHRoZSBibGFuayBpcyBub3JtYWxpc2VkXG4gICAgLy8gdG8gTlVMTCBhdCB3cml0ZSB0aW1lIGJ5IGBjYXNlX3Jlc29sdXRpb25fYXJ0aWNsZV9ub3JtYWxpemVgLCBhbmQgd2h5XG4gICAgLy8gdGhhdCBob29rIGlzIHBhcnQgb2YgdGhpcyBtZXRyaWMgcmF0aGVyIHRoYW4gYSB0aWR5LXVwIGJlc2lkZSBpdC5cbiAgICAvL1xuICAgIC8vIEV2ZXJ5IHdpZGdldCB0aGF0IHNob3dzIGBrYl9kZWZsZWN0aW9uX3JhdGVgIGFsc28gc2hvd3NcbiAgICAvLyBga2JfcmVzb2x2ZWRfY291bnRgIGFuZCBgY2xvc2VkX2NvdW50YCBiZXNpZGUgaXQsIHNvIGEgcmVhZGVyIGNhbiBjaGVja1xuICAgIC8vIHRoZSBhcml0aG1ldGljIHRoYXQgcHJvZHVjZWQgdGhlIHBlcmNlbnRhZ2UuXG4gICAgeyBuYW1lOiAnY2xvc2VkX2NvdW50JywgbGFiZWw6ICdDbG9zZWQgQ2FzZXMnLCBhZ2dyZWdhdGU6ICdjb3VudCcsIGZpbHRlcjogeyBpc19jbG9zZWQ6IHRydWUgfSB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdrYl9yZXNvbHZlZF9jb3VudCcsXG4gICAgICBsYWJlbDogJ1Jlc29sdmVkIGJ5IEtCJyxcbiAgICAgIGFnZ3JlZ2F0ZTogJ2NvdW50JyxcbiAgICAgIGZpZWxkOiAncmVzb2x2ZWRfYnlfYXJ0aWNsZScsXG4gICAgICBmaWx0ZXI6IHsgaXNfY2xvc2VkOiB0cnVlIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAna2JfZGVmbGVjdGlvbl9yYXRlJyxcbiAgICAgIGxhYmVsOiAnS0IgRGVmbGVjdGlvbiBSYXRlJyxcbiAgICAgIGRlcml2ZWQ6IHsgb3A6ICdyYXRpbycsIG9mOiBbJ2tiX3Jlc29sdmVkX2NvdW50JywgJ2Nsb3NlZF9jb3VudCddIH0sXG4gICAgICBmb3JtYXQ6ICcwJScsXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTTEEgY29tcGxpYW5jZSAoIzEyMTMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gVGhlIHNlcnZpY2UgZGFzaGJvYXJkJ3MgZ2F1Z2UgYXNrcyBcImFyZSB3ZSBtZWV0aW5nIFNMQT9cIiwgc28gdGhlIG51bWJlclxuICAgIC8vIGl0IHBsb3RzIGhhcyB0byBCRSBjb21wbGlhbmNlLiBJdCB1c2VkIHRvIHBsb3QgYGF2Z19zbGFfdmlvbGF0ZWRgIFx1MjAxNCB0aGVcbiAgICAvLyBjb21wbGVtZW50IFx1MjAxNCBhbmQgYXNrIHRoZSByZW5kZXJlciB0byBmbGlwIGl0IHdpdGggYG9wdGlvbnMuaW52ZXJ0YC4gVGhhdFxuICAgIC8vIGtleSBpcyBub3QgZGVjbGFyZWQgYnkgYERhc2hib2FyZFdpZGdldE9wdGlvbnNTY2hlbWFgOyBpdCByaWRlcyB0aGVcbiAgICAvLyBzY2hlbWEncyBgLnBhc3N0aHJvdWdoKClgLCBzbyBubyB2YWxpZGF0b3IsIGxpbnQgcnVsZSBvciBnYXRlIGNvdWxkIGV2ZXJcbiAgICAvLyB0ZWxsIHRoZSBhdXRob3IgaXQgZG9lcyBub3RoaW5nIFx1MjAxNCBhbmQgbm9uZSBkaWQuIFRoZSBnYXVnZSByZWFkIDAuMCUgb25cbiAgICAvLyBhbiBvcmcgd2l0aCAxMDAlIGNvbXBsaWFuY2UuXG4gICAgLy9cbiAgICAvLyBTcGVsbGVkIGFzIGEgcmF0aW8gb2YgdHdvIGNvdW50cyByYXRoZXIgdGhhbiBgMSAtIGF2Z19zbGFfdmlvbGF0ZWRgXG4gICAgLy8gYmVjYXVzZSBgRGVyaXZlZE1lYXN1cmVPcGAgb3BlcmFuZHMgYXJlIE1FQVNVUkUgTkFNRVMgb25seSAoYG9mOlxuICAgIC8vIHN0cmluZ1tdYCBcdTIwMTQgXCJubyByYXcgZmllbGRzLCBubyByYXcgU1FMXCIpLCBzbyB0aGVyZSBpcyBubyBsaXRlcmFsIGAxYCB0b1xuICAgIC8vIHN1YnRyYWN0IGZyb20uIGBkaWZmZXJlbmNlYCBjYW5ub3QgZXhwcmVzcyBpdCBlaXRoZXIuIFRoaXMgaXMgdGhlIGNhcmQnc1xuICAgIC8vIG93biBzZWNvbmQgb3B0aW9uIGFuZCB0aGUgc3BlYydzIHNhbmN0aW9uZWQgc2hhcGUgXHUyMDE0IHRoZSBvbmVcbiAgICAvLyBga2JfZGVmbGVjdGlvbl9yYXRlYCBhYm92ZSBhbHJlYWR5IHVzZXMuXG4gICAgLy9cbiAgICAvLyBgaXNfc2xhX3Zpb2xhdGVkOiBmYWxzZWAsIG5vdCBgJG5lOiB0cnVlYDogdGhlIGZpZWxkIGRlY2xhcmVzXG4gICAgLy8gYGRlZmF1bHRWYWx1ZTogZmFsc2VgLCBhbmQgTUVBU1VSRUQgb24gYm90aCBkcml2ZXJzIHRoaXMgYXBwIHJ1bnMsIGFcbiAgICAvLyBjbG9zZWQgY2FzZSBpbnNlcnRlZCB3aXRob3V0IHRoZSBjb2x1bW4gc3RvcmVzIGBmYWxzZWAgcmF0aGVyIHRoYW4gTlVMTC5cbiAgICAvLyBTbyBgc2xhX21ldF9jb3VudCArIHZpb2xhdGVkID0gY2xvc2VkX2NvdW50YCBob2xkcyB3aXRoIG5vIE5VTEwgaG9sZS5cbiAgICAvLyBCb3RoIHNwZWxsaW5ncyBtZWFzdXJlZCBpZGVudGljYWwgKDIgb2YgMywgYm90aCBkcml2ZXJzKTsgdGhlIHBsYWluIG9uZVxuICAgIC8vIGlzIHRoZSBvbmUgdGhhdCByZWFkcyBhcyB3aGF0IGl0IG1lYW5zLlxuICAgIC8vXG4gICAgLy8gVGhlIGRlbm9taW5hdG9yIGlzIGBjbG9zZWRfY291bnRgLCBhbHJlYWR5IGRlY2xhcmVkIGFib3ZlIFx1MjAxNCB0aGUgc2FtZVxuICAgIC8vIG1lYXN1cmUgdGhlIGBjbG9zZWRfY2FzZXNfdG90YWxgIHRpbGUgc2hvd3MsIHNvIGEgcmVhZGVyIGNhbiBjaGVjayB0aGVcbiAgICAvLyBwZXJjZW50YWdlIGFnYWluc3QgYSBudW1iZXIgb24gdGhlIHNhbWUgcGFnZS4gQW4gZW1wdHkgbnVtZXJhdG9yIGdyb3VwXG4gICAgLy8gZG9lcyBOT1QgYmxhbmsgdGhlIHJhdGU6IHRoZSBleGVjdXRvciBmaWxscyBhIGBjb3VudGAgY29sdW1uJ3MgZW1wdHlcbiAgICAvLyBncm91cCB3aXRoIDAgQkVGT1JFIGV2YWx1YXRpbmcgZGVyaXZlZCBtZWFzdXJlcywgc28gYSBmdWxseS1icmVhY2hlZCBvcmdcbiAgICAvLyByZWFkcyAwJSwgbm90IGJsYW5rLiBBIHplcm8gREVOT01JTkFUT1IgKG5vIGNsb3NlZCBjYXNlcyBhdCBhbGwpIGRvZXNcbiAgICAvLyByZXR1cm4gbnVsbCBcdTIwMTQgXCJubyBkYXRhXCIsIHdoaWNoIGlzIHRoZSBob25lc3QgcmVhZGluZy5cbiAgICB7IG5hbWU6ICdzbGFfbWV0X2NvdW50JywgbGFiZWw6ICdDYXNlcyBXaXRoaW4gU0xBJywgYWdncmVnYXRlOiAnY291bnQnLCBmaWx0ZXI6IHsgaXNfY2xvc2VkOiB0cnVlLCBpc19zbGFfdmlvbGF0ZWQ6IGZhbHNlIH0gfSxcbiAgICB7XG4gICAgICBuYW1lOiAnc2xhX2NvbXBsaWFuY2VfcmF0ZScsXG4gICAgICBsYWJlbDogJ1NMQSBDb21wbGlhbmNlIFJhdGUnLFxuICAgICAgZGVyaXZlZDogeyBvcDogJ3JhdGlvJywgb2Y6IFsnc2xhX21ldF9jb3VudCcsICdjbG9zZWRfY291bnQnXSB9LFxuICAgICAgZm9ybWF0OiAnMCUnLFxuICAgIH0sXG4gIF0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9fYnVuZGxlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvX2J1bmRsZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBFbWFpbFRlbXBsYXRlRGVmaW5pdGlvbiB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbi8qKlxuICogVGhlIG9uZSBzcGVsbGluZyBvZiBcImEgbG9jYWxlIHBhY2sgYmVjb21lcyBgc3lzX2VtYWlsX3RlbXBsYXRlYCByb3dzXCIsXG4gKiBzaGFyZWQgYnkgZXZlcnkgcGFja2FnZSB0aGF0IG93bnMgbm90aWZpY2F0aW9uIHRlbXBsYXRlcy5cbiAqXG4gKiBgRW1haWxUZW1wbGF0ZURlZmluaXRpb25gIGNhcnJpZXMgT05FIGBsb2NhbGVgIHBlciByb3csIHNvIGFuIG4tbGFuZ3VhZ2VcbiAqIGJ1bmRsZSBpcyBuIHJvd3Mgb2YgdGhlIHNhbWUgYG5hbWVgIFx1MjAxNCB0aGF0IGlzIHRoZSBzcGVjJ3Mgb3duIGtleSwgbm90IGFcbiAqIGNvbnZlbnRpb24gdGhpcyByZXBvIHBpY2tlZC4gV3JpdGluZyB0aG9zZSByb3dzIG91dCBieSBoYW5kIHdvdWxkIG1lYW5cbiAqIHJlcGVhdGluZyBgbmFtZWAgYW5kIHRoZSByb3cgc2NhZmZvbGRpbmcgZm91ciB0aW1lcyBwZXJcbiAqIHRlbXBsYXRlOyBoZXJlIGVhY2ggbG9jYWxlIHBhY2sgc3RhdGVzIG9ubHkgd2hhdCBhY3R1YWxseSBkaWZmZXJzIGJldHdlZW5cbiAqIGxhbmd1YWdlcyAodGhlIGxhYmVsIGFuZCB0aGUgdHdvIGJvZGllcykgYW5kIHRoaXMgaGVscGVyIHByb2R1Y2VzIHRoZSByb3dzLlxuICpcbiAqIEl0IGxpdmVzIGluIGBzcmMvc2FsZXMvYCBiZWNhdXNlIGBzcmMvc2VydmljZS9gIGFuZCBgc3JjL3JldmVudWUvYCBib3RoIG5lZWRcbiAqIGl0OiBhIHNvdXJjZSBtb3JlIHRoYW4gb25lIHBhY2thZ2UgbmVlZHMgaGFzIG9uZSBkZXRlcm1pbmlzdGljIGhvbWUsIHRoZVxuICogbG93ZXN0IHBhY2thZ2UgYWxsIGl0cyBjb25zdW1lcnMgZGVwZW5kIG9uIChBR0VOVFMubWQgaW1wb3J0IHJ1bGUgMiksIGFuZFxuICogbW9kdWxlcyBpbXBvcnQgaXQgYWxvbmcgdGhlaXIgZWRnZSBpbnRvIHNhbGVzIFx1MjAxNCB0aGUgc2FtZSBwbGFjZW1lbnQgYXNcbiAqIGBmbG93cy9fZ3VhcmRlZC1pdGVyYXRpb24udHNgIGFuZCBgb2JqZWN0cy9faG9vay1hcGkudHNgLlxuICovXG5cbi8qKlxuICogV2hhdCBvbmUgdGVtcGxhdGUgbG9va3MgbGlrZSBpbiBPTkUgbGFuZ3VhZ2UgXHUyMDE0IGV2ZXJ5IGZpZWxkIG9mXG4gKiBgRW1haWxUZW1wbGF0ZURlZmluaXRpb25gIHdob3NlIHZhbHVlIGlzIGdlbnVpbmVseSBwZXItbG9jYWxlLlxuICpcbiAqIGBsYWJlbGAgaXMgaW4gaGVyZSBiZWNhdXNlIGl0IGlzIHRoZSBTdHVkaW8gZGlzcGxheSBuYW1lIGFuIGFkbWluaXN0cmF0b3JcbiAqIHJlYWRzLCBzbyBpdCBsb2NhbGl6ZXMgd2l0aCB0aGUgY29udGVudDsgYG5hbWVgIGFuZCBgbG9jYWxlYCBhcmUgbm90LCBhbmRcbiAqIHtAbGluayBidW5kbGV9IHN1cHBsaWVzIHRoZW0gb25jZSBwZXIgcm93LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsaXplZEVtYWlsVGVtcGxhdGUge1xuICAvKiogU3R1ZGlvIGRpc3BsYXkgbGFiZWwgZm9yIHRoaXMgdGVtcGxhdGUsIGluIHRoaXMgbGFuZ3VhZ2UuICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBTdWJqZWN0IGxpbmU7IGB7e3Zhcn19YCBob2xlcyBhcmUgZmlsbGVkIGZyb20gdGhlIG5vdGlmeSBub2RlJ3MgYHRlbXBsYXRlRGF0YWAuICovXG4gIHN1YmplY3Q6IHN0cmluZztcbiAgLyoqIEhUTUwgYm9keTsgc2FtZSBge3t2YXJ9fWAgaG9sZXMuIGBib2R5VGV4dGAgaXMgZGVyaXZlZCBieSB0aGUgc2VydmljZSB3aGVuIG9taXR0ZWQuICovXG4gIGJvZHlIdG1sOiBzdHJpbmc7XG59XG5cbi8qKiBPbmUgbGFuZ3VhZ2UncyBmYWNlIG9mIGV2ZXJ5IHRlbXBsYXRlIGEgcGFja2FnZSBvd25zLCBrZXllZCBieSB0ZW1wbGF0ZSBuYW1lLiAqL1xuZXhwb3J0IHR5cGUgRW1haWxUZW1wbGF0ZVBhY2sgPSBSZWNvcmQ8c3RyaW5nLCBMb2NhbGl6ZWRFbWFpbFRlbXBsYXRlPjtcblxuLyoqXG4gKiBDcm9zcyBhIHBhY2thZ2UncyBsb2NhbGUgcGFja3MgaW50byB0aGUgZmxhdCBgKG5hbWUsIGxvY2FsZSlgIHJvd3NcbiAqIGBkZWZpbmVTdGFjayh7IGVtYWlsVGVtcGxhdGVzIH0pYCB0YWtlcy5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgVGhlIEVOR0xJU0ggcGFjayBpcyByZWdpc3RlcmVkIHVuZGVyIGBlbi1VU2AsIG5vdCBgZW5gLCBhbmQgdGhhdCBpcyB0aGVcbiAqIHJlc29sdXRpb24gbGFkZGVyJ3MgZG9pbmcgcmF0aGVyIHRoYW4gYSBzdHlsZSBjaG9pY2UuXG4gKiBgRW1haWxTZXJ2aWNlLnJlc29sdmVBbmRSZW5kZXJUZW1wbGF0ZWAgbWF0Y2hlcyBgKG5hbWUsIGxvY2FsZSlgIEVYQUNUTFksXG4gKiB0aGVuIHJldHJpZXMgZXhhY3RseSBvbmNlIGFnYWluc3QgaXRzIG93biBgREVGQVVMVF9URU1QTEFURV9MT0NBTEVgIFx1MjAxNCB0aGVcbiAqIGxpdGVyYWwgYCdlbi1VUydgLiBBIHJlY2lwaWVudCB3aG9zZSBgc3lzX3VzZXIubG9jYWxlYCBpcyB0aGlzIGFwcCdzIGRlZmF1bHRcbiAqIGAnZW4nYCB0aGVyZWZvcmUgbWlzc2VzIG9uIHRoZSBmaXJzdCBwcm9iZSBhbmQgbGFuZHMgb24gdGhlIHNlY29uZDsgYVxuICogcmVjaXBpZW50IGNhcnJ5aW5nIGAnZW4tVVMnYCAob3IgYW55IGxvY2FsZSB0aGlzIGFwcCBzaGlwcyBubyBwYWNrIGZvcilcbiAqIGxhbmRzIG9uIGl0IGRpcmVjdGx5LiBUYWdnaW5nIHRoZSByb3dzIGAnZW4nYCBpbnN0ZWFkIHdvdWxkIGludmVydCB0aGF0OlxuICogYCdlbi1VUydgIGlzIGEgdHJ1dGh5IHByZWZlcnJlZCBsb2NhbGUsIHNvIHRoZSB0aGlyZCBwcm9iZSBpcyBza2lwcGVkIGFuZFxuICogdGhlIHNlbmQgZmFpbHMgd2l0aCBgVEVNUExBVEVfTk9UX0ZPVU5EYC4gYCdlbi1VUydgIGlzIHRoZSB0YWcgdGhhdCBjYW5ub3RcbiAqIHN0cmFuZCBhIHJlY2lwaWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGJ1bmRsZSA9IChwYWNrczogUmVjb3JkPHN0cmluZywgRW1haWxUZW1wbGF0ZVBhY2s+KTogRW1haWxUZW1wbGF0ZURlZmluaXRpb25bXSA9PlxuICBPYmplY3QuZW50cmllcyhwYWNrcykuZmxhdE1hcCgoW2xvY2FsZSwgcGFja10pID0+XG4gICAgT2JqZWN0LmVudHJpZXMocGFjaykubWFwKChbbmFtZSwgcm93XSkgPT4gKHsgbmFtZSwgbG9jYWxlLCAuLi5yb3cgfSkpKTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzL2VuLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzL2VuLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEVtYWlsVGVtcGxhdGVQYWNrIH0gZnJvbSAnLi4vLi4vc2FsZXMvZW1haWwtdGVtcGxhdGVzL19idW5kbGUnO1xuXG4vKipcbiAqIEVuZ2xpc2ggKGVuLVVTKSBcdTIwMTQgdGhlIHNlcnZpY2UgcGFja2FnZSdzIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZXMuXG4gKlxuICogRXZlcnkgc3RyaW5nIGlzIHRoZSB0ZXh0IGl0cyBgbm90aWZ5YCBub2RlIGFscmVhZHkgc2VudCwgd2l0aCB0aGUgZmxvdydzXG4gKiBge3Zhci5wYXRofWAgaW50ZXJwb2xhdGlvbnMgcmUtZXhwcmVzc2VkIGFzIHRoZSBge3trZXl9fWAgaG9sZXMgdGhlIHJlbmRlcmVyXG4gKiBmaWxscyBmcm9tIHRoYXQgbm9kZSdzIGB0ZW1wbGF0ZURhdGFgLiBcdTI2QTBcdUZFMEYgVGFnZ2VkIGBlbi1VU2AsIG5vdCBgZW5gIFx1MjAxNCBzZWUgdGhlXG4gKiByZXNvbHV0aW9uLWxhZGRlciBub3RlIG9uIGBidW5kbGUoKWAuXG4gKi9cbmV4cG9ydCBjb25zdCBlbjogRW1haWxUZW1wbGF0ZVBhY2sgPSB7XG4gICdjcm0uY2FzZV9lc2NhbGF0ZWQnOiB7XG4gICAgbGFiZWw6ICdDYXNlIEVzY2FsYXRlZCcsXG4gICAgc3ViamVjdDogJ0Nhc2UgZXNjYWxhdGVkOiB7e2Nhc2VfbnVtYmVyfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+Q2FzZSB7e2Nhc2VfbnVtYmVyfX0gKHt7cHJpb3JpdHl9fSkgaGFzIGJlZW4gYXV0by1lc2NhbGF0ZWQgb24gY3JpdGljYWwgcHJpb3JpdHkuIE93bmVyc2hpcCBwYXNzZXMgdG8gdGhlIHNlcnZpY2UgbWFuYWdlciB3aXRoIHRoZSBsaWdodGVzdCBsb2FkOyB3aGlsZSBub2JvZHkgaG9sZHMgdGhhdCBwb3NpdGlvbiB0aGUgY2FzZSBzdGF5cyB3aXRoIHlvdS4gT3BlbiB0aGUgY2FzZSB0byBzZWUgd2hvIG93bnMgaXQgbm93LjwvcD4nLFxuICB9LFxuICAnY3JtLmNhc2Vfc2xhX2JyZWFjaCc6IHtcbiAgICBsYWJlbDogJ0Nhc2UgU0xBIEJyZWFjaGVkJyxcbiAgICBzdWJqZWN0OiAnU0xBIGJyZWFjaGVkOiBjYXNlIHt7Y2FzZV9udW1iZXJ9fScsXG4gICAgYm9keUh0bWw6ICc8cD5DYXNlIHt7Y2FzZV9udW1iZXJ9fSAoe3twcmlvcml0eX19KSBwYXNzZWQgaXRzIFNMQSBkdWUgZGF0ZSBhbmQgaGFzIGJlZW4gYXV0by1lc2NhbGF0ZWQuPC9wPicsXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXMvemgtQ04udHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXMvemgtQ04udHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZVBhY2sgfSBmcm9tICcuLi8uLi9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvX2J1bmRsZSc7XG5cbi8qKiBcdTdCODBcdTRGNTNcdTRFMkRcdTY1ODcgKHpoLUNOKSBcdTIwMTQgdGhlIHNlcnZpY2UgcGFja2FnZSdzIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZXMuIFNlZSBgZW4udHNgLiAqL1xuZXhwb3J0IGNvbnN0IHpoQ046IEVtYWlsVGVtcGxhdGVQYWNrID0ge1xuICAnY3JtLmNhc2VfZXNjYWxhdGVkJzoge1xuICAgIGxhYmVsOiAnXHU1REU1XHU1MzU1XHU1REYyXHU1MzQ3XHU3RUE3JyxcbiAgICBzdWJqZWN0OiAnXHU1REU1XHU1MzU1XHU1REYyXHU1MzQ3XHU3RUE3XHVGRjFBe3tjYXNlX251bWJlcn19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NURFNVx1NTM1NSB7e2Nhc2VfbnVtYmVyfX1cdUZGMDh7e3ByaW9yaXR5fX1cdUZGMDlcdTU2RTBcdTRFMjVcdTkxQ0RcdTdFQTdcdTUyMkJcdTVERjJcdTgxRUFcdTUyQThcdTUzNDdcdTdFQTdcdTMwMDJcdTYyNDBcdTY3MDlcdTY3NDNcdTVDMDZcdThGNkNcdTRFQTRcdTdFRDlcdTVGNTNcdTUyNERcdThEMUZcdTgzNzdcdTY3MDBcdThGN0JcdTc2ODRcdTY3MERcdTUyQTFcdTdFQ0ZcdTc0MDZcdUZGMUJcdTgyRTVcdThCRTVcdTgwNENcdTRGNERcdTY2ODJcdTY1RTBcdTRFQkFcdTYyQzVcdTRFRkJcdUZGMENcdTVERTVcdTUzNTVcdTRFQ0RcdTVGNTJcdTYwQThcdTYyNDBcdTY3MDlcdTMwMDJcdThCRjdcdTYyNTNcdTVGMDBcdTVERTVcdTUzNTVcdTY3RTVcdTc3MEJcdTVGNTNcdTUyNERcdThEMUZcdThEMjNcdTRFQkFcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5jYXNlX3NsYV9icmVhY2gnOiB7XG4gICAgbGFiZWw6ICdcdTVERTVcdTUzNTUgU0xBIFx1OEQ4NVx1NjVGNicsXG4gICAgc3ViamVjdDogJ1NMQSBcdThEODVcdTY1RjZcdUZGMUFcdTVERTVcdTUzNTUge3tjYXNlX251bWJlcn19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NURFNVx1NTM1NSB7e2Nhc2VfbnVtYmVyfX1cdUZGMDh7e3ByaW9yaXR5fX1cdUZGMDlcdTVERjJcdThEODVcdThGQzcgU0xBIFx1NTIzMFx1NjcxRlx1NjVGNlx1OTVGNFx1RkYwQ1x1NUU3Nlx1NURGMlx1ODFFQVx1NTJBOFx1NTM0N1x1N0VBN1x1MzAwMjwvcD4nLFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzL2phLUpQLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzL2phLUpQLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEVtYWlsVGVtcGxhdGVQYWNrIH0gZnJvbSAnLi4vLi4vc2FsZXMvZW1haWwtdGVtcGxhdGVzL19idW5kbGUnO1xuXG4vKiogXHU2NUU1XHU2NzJDXHU4QTlFIChqYS1KUCkgXHUyMDE0IHRoZSBzZXJ2aWNlIHBhY2thZ2UncyBub3RpZmljYXRpb24gdGVtcGxhdGVzLiBTZWUgYGVuLnRzYC4gKi9cbmV4cG9ydCBjb25zdCBqYUpQOiBFbWFpbFRlbXBsYXRlUGFjayA9IHtcbiAgJ2NybS5jYXNlX2VzY2FsYXRlZCc6IHtcbiAgICBsYWJlbDogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA2RVx1MzBBOFx1MzBCOVx1MzBBQlx1MzBFQ1x1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGMycsXG4gICAgc3ViamVjdDogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA0Q1x1MzBBOFx1MzBCOVx1MzBBQlx1MzBFQ1x1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGM1x1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1Rjoge3tjYXNlX251bWJlcn19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1MzBCMVx1MzBGQ1x1MzBCOSB7e2Nhc2VfbnVtYmVyfX1cdUZGMDh7e3ByaW9yaXR5fX1cdUZGMDlcdTMwNkZcdTkxQ0RcdTU5MjdcdTVFQTZcdTMwNENcdTlBRDhcdTMwNDRcdTMwNUZcdTMwODFcdTgxRUFcdTUyRDVcdTc2ODRcdTMwNkJcdTMwQThcdTMwQjlcdTMwQUJcdTMwRUNcdTMwRkNcdTMwQjdcdTMwRTdcdTMwRjNcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDJcdTYyNDBcdTY3MDlcdTZBMjlcdTMwNkZcdThDQTBcdTgzNzdcdTMwNkVcdTY3MDBcdTMwODJcdThFRkRcdTMwNDRcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjlcdTMwREVcdTMwQ0RcdTMwRkNcdTMwQjhcdTMwRTNcdTMwRkNcdTMwNkJcdTc5RkJcdTMwOEFcdTMwN0VcdTMwNTlcdTMwMDJcdTMwNURcdTMwNkVcdTVGNzlcdTgwNzdcdTMwNkJcdThBQjBcdTMwODJcdTMwNDRcdTMwNkFcdTMwNDRcdTk1OTNcdTMwNkZcdTMwMDFcdTMwQjFcdTMwRkNcdTMwQjlcdTMwNkZcdTMwNDJcdTMwNkFcdTMwNUZcdTMwNkVcdTMwN0VcdTMwN0VcdTMwNjdcdTMwNTlcdTMwMDJcdTMwQjFcdTMwRkNcdTMwQjlcdTMwOTJcdTk1OEJcdTMwNDRcdTMwNjZcdTczRkVcdTU3MjhcdTMwNkVcdTYyNDBcdTY3MDlcdTgwMDVcdTMwOTJcdTMwNTRcdTc4QkFcdThBOERcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5jYXNlX3NsYV9icmVhY2gnOiB7XG4gICAgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTMwNkUgU0xBIFx1OEQ4NVx1OTA0RScsXG4gICAgc3ViamVjdDogJ1NMQSBcdThEODVcdTkwNEU6IFx1MzBCMVx1MzBGQ1x1MzBCOSB7e2Nhc2VfbnVtYmVyfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHUzMEIxXHUzMEZDXHUzMEI5IHt7Y2FzZV9udW1iZXJ9fVx1RkYwOHt7cHJpb3JpdHl9fVx1RkYwOVx1MzA2RiBTTEEgXHU2NzFGXHU5NjUwXHUzMDkyXHU5MDRFXHUzMDRFXHUzMDVGXHUzMDVGXHUzMDgxXHUzMDAxXHU4MUVBXHU1MkQ1XHU3Njg0XHUzMDZCXHUzMEE4XHUzMEI5XHUzMEFCXHUzMEVDXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyPC9wPicsXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXMvZXMtRVMudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXMvZXMtRVMudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZVBhY2sgfSBmcm9tICcuLi8uLi9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvX2J1bmRsZSc7XG5cbi8qKiBFc3BhXHUwMEYxb2wgKGVzLUVTKSBcdTIwMTQgdGhlIHNlcnZpY2UgcGFja2FnZSdzIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZXMuIFNlZSBgZW4udHNgLiAqL1xuZXhwb3J0IGNvbnN0IGVzRVM6IEVtYWlsVGVtcGxhdGVQYWNrID0ge1xuICAnY3JtLmNhc2VfZXNjYWxhdGVkJzoge1xuICAgIGxhYmVsOiAnQ2FzbyBlc2NhbGFkbycsXG4gICAgc3ViamVjdDogJ0Nhc28gZXNjYWxhZG86IHt7Y2FzZV9udW1iZXJ9fScsXG4gICAgYm9keUh0bWw6ICc8cD5FbCBjYXNvIHt7Y2FzZV9udW1iZXJ9fSAoe3twcmlvcml0eX19KSBzZSBoYSBlc2NhbGFkbyBhdXRvbVx1MDBFMXRpY2FtZW50ZSBwb3IgcHJpb3JpZGFkIGNyXHUwMEVEdGljYS4gTGEgcHJvcGllZGFkIHBhc2EgYWwgcmVzcG9uc2FibGUgZGUgc2VydmljaW8gY29uIG1lbm9zIGNhcmdhOyBtaWVudHJhcyBuYWRpZSBvY3VwZSBlc2UgcHVlc3RvLCBlbCBjYXNvIHNpZ3VlIHNpZW5kbyB0dXlvLiBBYnJlIGVsIGNhc28gcGFyYSB2ZXIgcXVpXHUwMEU5biBsbyB0aWVuZSBhaG9yYS48L3A+JyxcbiAgfSxcbiAgJ2NybS5jYXNlX3NsYV9icmVhY2gnOiB7XG4gICAgbGFiZWw6ICdTTEEgZGVsIGNhc28gaW5jdW1wbGlkbycsXG4gICAgc3ViamVjdDogJ1NMQSBpbmN1bXBsaWRvOiBjYXNvIHt7Y2FzZV9udW1iZXJ9fScsXG4gICAgYm9keUh0bWw6ICc8cD5FbCBjYXNvIHt7Y2FzZV9udW1iZXJ9fSAoe3twcmlvcml0eX19KSBzdXBlclx1MDBGMyBzdSBmZWNoYSBsXHUwMEVEbWl0ZSBkZSBTTEEgeSBzZSBoYSBlc2NhbGFkbyBhdXRvbVx1MDBFMXRpY2FtZW50ZS48L3A+JyxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2VtYWlsLXRlbXBsYXRlcy9jcm0uZW1haWwtdGVtcGxhdGUudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXMvY3JtLmVtYWlsLXRlbXBsYXRlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEVtYWlsVGVtcGxhdGVEZWZpbml0aW9uIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcbmltcG9ydCB7IGJ1bmRsZSB9IGZyb20gJy4uLy4uL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9fYnVuZGxlJztcbmltcG9ydCB7IGVuIH0gZnJvbSAnLi9lbic7XG5pbXBvcnQgeyB6aENOIH0gZnJvbSAnLi96aC1DTic7XG5pbXBvcnQgeyBqYUpQIH0gZnJvbSAnLi9qYS1KUCc7XG5pbXBvcnQgeyBlc0VTIH0gZnJvbSAnLi9lcy1FUyc7XG5cbi8qKlxuICogU2VydmljZSBcdTIwMTQgZXZlcnkgYHN5c19lbWFpbF90ZW1wbGF0ZWAgcm93IHRoaXMgcGFja2FnZSdzIGBub3RpZnlgIG5vZGVzIG5hbWUuXG4gKlxuICogRm91ciBsb2NhbGUgcGFja3MgY3Jvc3NlZCB3aXRoIHR3byB0ZW1wbGF0ZSBuYW1lcy4gYGJ1bmRsZSgpYCBpcyBpbXBvcnRlZFxuICogYWxvbmcgdGhpcyBtb2R1bGUncyBlZGdlIGludG8gc2FsZXMsIHRoZSBvbmUgZGV0ZXJtaW5pc3RpYyBob21lIGZvciBhIHNvdXJjZVxuICogbW9yZSB0aGFuIG9uZSBwYWNrYWdlIG5lZWRzLlxuICovXG5leHBvcnQgY29uc3QgU2VydmljZUVtYWlsVGVtcGxhdGVzOiBFbWFpbFRlbXBsYXRlRGVmaW5pdGlvbltdID0gYnVuZGxlKHtcbiAgJ2VuLVVTJzogZW4sXG4gICd6aC1DTic6IHpoQ04sXG4gICdqYS1KUCc6IGphSlAsXG4gICdlcy1FUyc6IGVzRVMsXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZmxvd3MvY2FzZS1lc2NhbGF0aW9uLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2Zsb3dzL2Nhc2UtZXNjYWxhdGlvbi5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKiBDYXNlIEVzY2FsYXRpb24gXHUyMDE0IGF1dG8tZXNjYWxhdGUgaGlnaC1wcmlvcml0eSBjYXNlcyAqL1xuZXhwb3J0IGNvbnN0IENhc2VFc2NhbGF0aW9uRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2Nhc2VfZXNjYWxhdGlvbicsXG4gIGxhYmVsOiAnQ2FzZSBFc2NhbGF0aW9uIFByb2Nlc3MnLFxuICBkZXNjcmlwdGlvbjogJ0F1dG9tYXRpY2FsbHkgZXNjYWxhdGUgaGlnaC1wcmlvcml0eSBjYXNlcycsXG4gIHR5cGU6ICdyZWNvcmRfY2hhbmdlJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gQSByZWNvcmQtY2hhbmdlIGZsb3cgZmlyZWQgYnkgYSBTWVNURU0gd3JpdGUgY2FycmllcyBubyB0cmlnZ2VyIHVzZXJcbiAgLy8gZWl0aGVyIFx1MjAxNCB0aGUgdXNlci1sZXNzIGV4cG9zdXJlIGlzIE5PVCBzY2hlZHVsZS1vbmx5IChBRFItMDA0OSksIGFuZCB0aGVcbiAgLy8gcGxhdGZvcm0ncyBvd24gYnVpbGQtdGltZSBsaW50IGNhbm5vdCBzZWUgdGhpcyBzaGFwZVxuICAvLyBiZWNhdXNlIGl0IGlzIG9ubHkga25vd2FibGUgYXQgcnVuIHRpbWUuIE1lYXN1cmVkIG9uIDE3LjAuMC1yYy4yOiBhXG4gIC8vIHVzZXItbGVzcyBydW4gcmVmdXNlcyB0aGUgdmVyeSBmaXJzdCBkYXRhIG5vZGUgXHUyMDE0IFwiW3J1bkFzXSByZWZ1c2luZyBhIGRhdGFcbiAgLy8gb3BlcmF0aW9uIChvYmplY3QgJ2NybV9jYXNlJywgZXZlbnQgJ3JlY29yZC1hZnRlci11cGRhdGUnKVwiIFx1MjAxNCBzbyBhIGNhc2VcbiAgLy8gcmFpc2VkIGJ5IHRoZSBzZWVkIGxvYWRlciwgYW4gaW50ZWdyYXRpb24sIG9yIGFub3RoZXIgcnVuQXM6J3N5c3RlbSdcbiAgLy8gZmxvdydzIHdyaXRlIHNpbGVudGx5IGtlZXBzIGl0cyBjcml0aWNhbCBwcmlvcml0eSBmb3JldmVyLlxuICAvL1xuICAvLyBFbGV2YXRpbmcgdGhlIFVTRVItZHJpdmVuIHJ1bnMgdG9vIGlzIGNvcnJlY3QgaGVyZTogZXNjYWxhdGlvbiBpcyBhXG4gIC8vIHNlcnZpY2UtbGV2ZWwgcG9saWN5LCBub3QgdGhlIHdyaXRlcidzIG93biBlZGl0LiBCb3RoIGRhdGEgbm9kZXMgYXJlIGtleWVkXG4gIC8vIHRvIGB7cmVjb3JkLmlkfWAgXHUyMDE0IHRoZSByb3cgdGhhdCBqdXN0IGZpcmVkIHRoZSB0cmlnZ2VyIFx1MjAxNCBzbyB1c2VyIHNjb3BlXG4gIC8vIGJ1eXMgbm8gcmVzdHJpY3Rpb24gdGhhdCBtYXR0ZXJzLCB3aGlsZSBpdCBkb2VzIGFkZCBhIGZhaWx1cmUgbW9kZTogYW5cbiAgLy8gYWdlbnQgbWF5IGxlZ2l0aW1hdGVseSByYWlzZSBhIGNhc2Ugd2l0aG91dCBob2xkaW5nIGVkaXQgcmlnaHRzIG9uIHRoZVxuICAvLyBlc2NhbGF0aW9uIGxpZmVjeWNsZSBmaWVsZHMgKGBpc19lc2NhbGF0ZWRgIC8gYGVzY2FsYXRlZF9kYXRlYCAvIGBzdGF0dXNgKS5cbiAgLy8gVGhpcyBhbHNvIHB1dHMgdGhlIGZsb3cgb24gdGhlIHNhbWUgZm9vdGluZyBhcyBgY2FzZV9zbGFfbW9uaXRvcmAsIHdoaWNoXG4gIC8vIHBlcmZvcm1zIHRoZSBzYW1lIGVzY2FsYXRpb24gb24gYSBzY2hlZHVsZSB1bmRlciBgcnVuQXM6ICdzeXN0ZW0nYC5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuXG4gIHZhcmlhYmxlczogW1xuICAgIHsgbmFtZTogJ2Nhc2VJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gIF0sXG5cbiAgbm9kZXM6IFtcbiAgICB7XG4gICAgICAvLyBUcmlnZ2VyIHdpcmluZyAoNy40KTogYmluZCB0byBhZnRlclVwZGF0ZSBhbmQgZ2F0ZSBvbiB0aGUgY3JpdGljYWxcbiAgICAgIC8vIHRyYW5zaXRpb24uIFRoZSByZS1maXJlIGd1YXJkIE1VU1QgTk9UIHJlbHkgb24gdGhlIGJvb2xlYW5cbiAgICAgIC8vIGBpc19lc2NhbGF0ZWRgOiB0aGlzIGZsb3cncyBvd24gZXNjYWxhdGlvbiB3cml0ZSByZS10cmlnZ2Vyc1xuICAgICAgLy8gcmVjb3JkLWFmdGVyLXVwZGF0ZSwgYW5kIG9uIFNRTGl0ZS9saWJzcWwgYSBib29sZWFuIHBlcnNpc3RzIGFzIGludGVnZXJcbiAgICAgIC8vIGAxYCwgc28gYHJlY29yZC5pc19lc2NhbGF0ZWQgIT0gdHJ1ZWAgaXMgYDEgIT0gdHJ1ZWAgPSB0cnVlIFx1MjAxNCB0aGUgZ3VhcmRcbiAgICAgIC8vIG5ldmVyIHRyaXBzIGFuZCB0aGUgZmxvdyBsb29wcyBmb3JldmVyIChpdCB3ZWRnZWQgYSBmaXJzdC1ib290IHNlZWQgb25cbiAgICAgIC8vIDIwMjYtMDctMDYpLiBJbnN0ZWFkOlxuICAgICAgLy8gLSBgZXNjYWxhdGVkX2RhdGUgPT0gbnVsbGAgbWFya3MgXCJuZXZlciBlc2NhbGF0ZWRcIiAodGhlIGVzY2FsYXRpb24gd3JpdGVcbiAgICAgIC8vICAgc3RhbXBzIGl0LCBzdXBwcmVzc2luZyB0aGUgc2Vjb25kIGZpcmUgQU5EIGFueSByZS1lc2NhbGF0aW9uIHdoZW4gYW5cbiAgICAgIC8vICAgYWdlbnQgbGF0ZXIgbW92ZXMgdGhlIGNhc2UgYmFjayB0byBpbl9wcm9ncmVzcyB0byB3b3JrIGl0KTtcbiAgICAgIC8vIC0gdGhlIHN0YXR1cyB0ZXJtcyBrZWVwIHRoZSBmbG93IG9mZiBjYXNlcyBhbHJlYWR5IGVzY2FsYXRlZCBvciBhbHJlYWR5XG4gICAgICAvLyAgIGZpbmlzaGVkIFx1MjAxNCB3aXRob3V0IHRoZW0gYSBjcml0aWNhbCBjYXNlIGNvdWxkIG5ldmVyIGJlIHJlc29sdmVkIG9yXG4gICAgICAvLyAgIGNsb3NlZCAodGhlIGZsb3cgd291bGQgeWFuayBgc3RhdHVzYCBzdHJhaWdodCBiYWNrIHRvIGBlc2NhbGF0ZWRgKS5cbiAgICAgIGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2Nhc2UnLFxuICAgICAgICB0cmlnZ2VyVHlwZTogJ3JlY29yZC1hZnRlci11cGRhdGUnLFxuICAgICAgICAvLyBBbHNvIHN1cHByZXNzIG9uIGNsb3NlZC9yZXNvbHZlZDogY2xvc2luZyBhIGNyaXRpY2FsIGNhc2UgaXMgaXRzZWxmXG4gICAgICAgIC8vIGFuIGFmdGVyVXBkYXRlLCBhbmQgd2l0aCBvbmx5IHRoZSBgIT0gXCJlc2NhbGF0ZWRcImAgZ3VhcmQgdGhpcyBmbG93XG4gICAgICAgIC8vIHJlLWVzY2FsYXRlZCB0aGUgY2FzZSB0aGUgbW9tZW50IGl0IHdhcyBjbG9zZWQgKG9ic2VydmVkIGxpdmU6XG4gICAgICAgIC8vIGNsb3NlX2Nhc2Ugd3JvdGUgc3RhdHVzIFwiY2xvc2VkXCIsIHRoaXMgZmxvdyBpbW1lZGlhdGVseSByZXdyb3RlIGl0XG4gICAgICAgIC8vIHRvIFwiZXNjYWxhdGVkXCIpLiBTdGF0dXMgc3RyaW5ncyBhcmUgdGhlIHJlbGlhYmxlIGd1YXJkIFx1MjAxNCBjb21wYXJpbmdcbiAgICAgICAgLy8gdGhlIGJvb2xlYW4gaXNfY2xvc2VkIHN1ZmZlcnMgdGhlIFNRTGl0ZSBgMSAhPSB0cnVlYCB0cmFwIGFib3ZlLlxuICAgICAgICAvLyBgZXNjYWxhdGVkX2RhdGUgPT0gbnVsbGAgYWRkaXRpb25hbGx5IGtlZXBzIGEgY2FzZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgIC8vIGVzY2FsYXRlZCBvbmNlICh0aGVuIHJlb3BlbmVkKSBmcm9tIGJlaW5nIGVzY2FsYXRlZCBhZ2Fpbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVE9UQUxJVFk6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBjYXJyaWVzIGEgYGhhcyhyZWNvcmQueClgXG4gICAgICAgIC8vIGd1YXJkIFx1MjAxNCBzZWUgdGhlIGhvdXNlLXJ1bGUgYmxvY2sgaW5cbiAgICAgICAgLy8gYHRlc3QvZmxvdy1jb25kaXRpb24tdG90YWxpdHkudGVzdC50c2AuIE1lYXN1cmVkIGVuZC10by1lbmQgb25cbiAgICAgICAgLy8gZHJpdmVyLW1lbW9yeTogYSBjYXNlIEJPUk4gY3JpdGljYWwgaXMgc3RvcmVkIHdpdGhvdXQgYW5cbiAgICAgICAgLy8gYGVzY2FsYXRlZF9kYXRlYCBjb2x1bW4gYXQgYWxsLCBgcmVjb3JkLmVzY2FsYXRlZF9kYXRlID09IG51bGxgXG4gICAgICAgIC8vIGFib3J0ZWQgd2l0aCBgTm8gc3VjaCBrZXk6IGVzY2FsYXRlZF9kYXRlYCwgYW5kIHRoaXMgZmxvdyBuZXZlciByYW5cbiAgICAgICAgLy8gb24gdGhlIHZlcnkgcG9wdWxhdGlvbiBpdCBleGlzdHMgZm9yLiBUaGUgZ3VhcmRzIGJlbG93IHByZXNlcnZlIHRoZVxuICAgICAgICAvLyBwcmVkaWNhdGUncyBhbnN3ZXIgb24gZXZlcnkgc2hhcGUgd2hlcmUgaXQgcHJldmlvdXNseSBoYWQgb25lLlxuICAgICAgICAvLyBgZXNjYWxhdGVkX2RhdGVgIGFic2VudCBtZWFucyB0aGUgc2FtZSBhcyBudWxsIChcIm5ldmVyIGVzY2FsYXRlZFwiKTtcbiAgICAgICAgLy8gYW4gYWJzZW50IGBzdGF0dXNgIGNhbm5vdCBiZSBhIHRlcm1pbmFsIHN0YXR1cywgc28gaXQgbXVzdCBub3RcbiAgICAgICAgLy8gc3VwcHJlc3MgdGhlIGVzY2FsYXRpb24uXG4gICAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnByaW9yaXR5KSAmJiByZWNvcmQucHJpb3JpdHkgPT0gXCJjcml0aWNhbFwiXG4gICAgICAgICAgJiYgKCFoYXMocmVjb3JkLmVzY2FsYXRlZF9kYXRlKSB8fCByZWNvcmQuZXNjYWxhdGVkX2RhdGUgPT0gbnVsbClcbiAgICAgICAgICAmJiAoIWhhcyhyZWNvcmQuc3RhdHVzKVxuICAgICAgICAgICAgfHwgKHJlY29yZC5zdGF0dXMgIT0gXCJlc2NhbGF0ZWRcIiAmJiByZWNvcmQuc3RhdHVzICE9IFwicmVzb2x2ZWRcIiAmJiByZWNvcmQuc3RhdHVzICE9IFwiY2xvc2VkXCIpKWAsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdnZXRfY2FzZScsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdHZXQgQ2FzZSBSZWNvcmQnLFxuICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fY2FzZScsIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZC5pZGAgfSwgb3V0cHV0VmFyaWFibGU6ICdjYXNlUmVjb3JkJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gVGhlIGBsYWJlbGAgbmFtZXMgd2hhdCB0aGlzIG5vZGUgYWN0dWFsbHkgZG9lczogaXQgZmxhZ3MgdGhlIGNhc2UgYXNcbiAgICAgIC8vIGVzY2FsYXRlZCAoc2VlIGBmaWVsZHNgIGJlbG93KSBhbmQgcmVhc3NpZ25zIG5vdGhpbmcuIFRoZSBgaWRgIGtlZXBzXG4gICAgICAvLyBpdHMgb3JpZ2luYWwgYGFzc2lnbl9zZW5pb3JfYWdlbnRgIHNwZWxsaW5nIG9uIHB1cnBvc2UgXHUyMDE0IGBlZGdlc1tdYFxuICAgICAgLy8gcmVmZXJlbmNlIG5vZGVzIGJ5IGlkLCBhbmQgYENhc2VFc2NhbGF0aW9uT25DcmVhdGVGbG93YCByZXdyaXRlcyB0aGVcbiAgICAgIC8vIG5vZGUgbGlzdCBieSBpZCwgc28gcmVuYW1pbmcgb25lIGlzIGEgYmVoYXZpb3VyIGNoYW5nZSwgbm90IGEgd29yZGluZ1xuICAgICAgLy8gZml4LlxuICAgICAgaWQ6ICdhc3NpZ25fc2VuaW9yX2FnZW50JywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ0ZsYWcgYXMgRXNjYWxhdGVkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2Nhc2UnLCBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sXG4gICAgICAgIC8vIGBlc2NhbGF0aW9uX3JlYXNvbmAgbXVzdCBiZSBzZXQgd2hlbmV2ZXIgYGlzX2VzY2FsYXRlZGAgZmxpcHMgdHJ1ZSBcdTIwMTQgdGhlXG4gICAgICAgIC8vIG9iamVjdCdzIGBlc2NhbGF0aW9uX3JlYXNvbl9yZXF1aXJlZGAgdmFsaWRhdGlvbiByZWplY3RzIHRoZSB3cml0ZVxuICAgICAgICAvLyBvdGhlcndpc2UgKHdoaWNoIHNpbGVudGx5IGFib3J0ZWQgdGhpcyBmbG93IHVudGlsIGl0IHdhcyBzdXBwbGllZCkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFx1MjZENCBUaGlzIG5vZGUgd3JpdGVzIE5PIG93bmVyLCBhbmQgY2Fubm90OiByZWFzc2lnbmluZyBmcm9tIGEgZmxvd1xuICAgICAgICAvLyB3b3VsZCBtZWFuIGB7Y2FzZVJlY29yZC5vd25lcl9pZC5tYW5hZ2VyfWAsIGFuZCBhIGZsb3cgdGVtcGxhdGVcbiAgICAgICAgLy8gY2Fubm90IHRyYXZlcnNlIGEgbG9va3VwIFx1MjAxNCBpdCBpbnRlcnBvbGF0ZXMgdG8gdGhlIGxpdGVyYWwgXCJ1bmRlZmluZWRcIlxuICAgICAgICAvLyBhbmQgd291bGQgb3JwaGFuIHRoZSBjYXNlIHVuZGVyIGEgcGhhbnRvbSBvd25lci4gVGhlIGhhbmQtb2ZmIGRvZXMgbm90XG4gICAgICAgIC8vIG5lZWQgdG8gaGFwcGVuIGhlcmU6IHRoaXMgdmVyeSB1cGRhdGUgZmlyZXMgdGhlXG4gICAgICAgIC8vIGBjYXNlX2VzY2FsYXRpb25fcmVhc3NpZ25gIGJlZm9yZVVwZGF0ZSBob29rXG4gICAgICAgIC8vIChgc3JjL3NlcnZpY2Uvb2JqZWN0cy9fY2FzZS1hc3NpZ25tZW50LnRzYCksIHdoaWNoIHB1dHMgdGhlIGNhc2Ugd2l0aCB0aGVcbiAgICAgICAgLy8gbGVhc3QtbG9hZGVkIGhvbGRlciBvZiB0aGUgZmxhdCBgc2VydmljZV9tYW5hZ2VyYCBwb3NpdGlvbiBcdTIwMTQgYSBwb29sLFxuICAgICAgICAvLyB3aGljaCB0aGUgYXBwIGNhbiByZXNvbHZlLCByYXRoZXIgdGhhbiBhIG1hbmFnZXIgY2hhaW4sIHdoaWNoIGl0XG4gICAgICAgIC8vIGNhbm5vdC4gV2l0aCB0aGF0IHBvb2wgdW5zdGFmZmVkIHRoZSBjYXNlIGtlZXBzIGl0cyBvd25lciBhbmQgdGhpc1xuICAgICAgICAvLyB3cml0ZSBpcyB1bmNoYW5nZWQuXG4gICAgICAgIGZpZWxkczogeyBpc19lc2NhbGF0ZWQ6IHRydWUsIGVzY2FsYXRpb25fcmVhc29uOiAnQXV0by1lc2NhbGF0ZWQ6IGNyaXRpY2FsIHByaW9yaXR5JywgZXNjYWxhdGVkX2RhdGU6IGNlbGBpc29EYXRldGltZShub3coKSlgLCBzdGF0dXM6ICdlc2NhbGF0ZWQnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gTm8gYGNyZWF0ZV90YXNrYCBub2RlIGhlcmU6IHRoZSBlc2NhbGF0aW9uIHdyaXRlIGFib3ZlIGZsaXBzIGBzdGF0dXNgIHRvXG4gICAgLy8gYGVzY2FsYXRlZGAsIHdoaWNoIGZpcmVzIHRoZSBgY2FzZV9zdGF0dXNfc2lkZV9lZmZlY3RzYCBob29rIFx1MjAxNCB0aGUgc2luZ2xlXG4gICAgLy8gb3duZXIgb2YgZXNjYWxhdGlvbiBmb2xsb3ctdXAgdGFza3MgKGl0IGFsc28gY292ZXJzIHRoZSBgZXNjYWxhdGVfY2FzZWBcbiAgICAvLyBhY3Rpb24gYW5kIHRoZSBTTEEgbW9uaXRvcikuIEEgc2Vjb25kIHRhc2sgbm9kZSBoZXJlIHByb2R1Y2VkIGR1cGxpY2F0ZSxcbiAgICAvLyBkaXNhZ3JlZWluZyB0YXNrcyAoY2FzZSBvd25lci9oaWdoIHZzIGFjY291bnQgb3duZXIvdXJnZW50KSBwZXIgZXNjYWxhdGlvbi5cbiAgICB7XG4gICAgICAvLyBHYXRld2F5IG9ubHkgXHUyMDE0IHRoZSBsaXZlIHByZWRpY2F0ZSBpcyBvbiB0aGUgb3V0LWVkZ2UgYGU0YC4gVGhlIGVuZ2luZVxuICAgICAgLy8gbmV2ZXIgcmVhZHMgYSBgZGVjaXNpb25gIG5vZGUncyBzaW5ndWxhciBgY29uZmlnLmNvbmRpdGlvbmAsIHNvIGEgY29weVxuICAgICAgLy8gaGVyZSB3b3VsZCByZXN0YXRlIHRoZSBnYXRlIHdpdGhvdXQgQkVJTkcgdGhlIGdhdGVcbiAgICAgIC8vIChgZmxvdy1pbmVydC1ub2RlLWNvbmRpdGlvbmApOyBgcG5wbSBsaW50YCBcdTIwMTQgYG9zIGxpbnQgLS1zdHJpY3RgIFx1MjAxNFxuICAgICAgLy8gZmFpbHMgb24gdGhhdC5cbiAgICAgIC8vXG4gICAgICAvLyBXaHkgdGhlIGdhdGUgZXhpc3RzOiBgY3JtX2Nhc2Uub3duZXJfaWRgIGlzIE5VTExBQkxFIGFuZCBhbiB1bm93bmVkIGNhc2VcbiAgICAgIC8vIGlzIGFuIG9yZGluYXJ5IHN0YXRlIFx1MjAxNCB0aGlzIHJlcG8gc2hpcHMgYHNjcmlwdHMvYmFja2ZpbGwtb3duZXItaWQudHNgXG4gICAgICAvLyBhbmQgYHBucG0gYmFja2ZpbGw6b3duZXJgIHByZWNpc2VseSBiZWNhdXNlIG93bmVybGVzcyByb3dzIGhhcHBlbiwgYW5kXG4gICAgICAvLyBvcmRpbmFyeSBSRVNUIGNyZWF0aW9uIC8gaW1wb3J0IHJlYWNoIHRoZSBzYW1lIHN0YXRlLiBgbm90aWZ5X3RlYW1gXG4gICAgICAvLyBiZWxvdyBhZGRyZXNzZXMgZXhhY3RseSBPTkUgcmVjaXBpZW50LCBzbyBhbiBvd25lcmxlc3MgY2FzZSBsZWF2ZXMgaXRcbiAgICAgIC8vIHdpdGggYW4gZW1wdHkgc2xhdGUsIHdoaWNoIHRoZSBidWlsdGluIG5vZGUgdHJlYXRzIGFzIGEgSEFSRCBmYWlsdXJlOlxuICAgICAgLy8gYGV4ZWN1dGVgIHJldHVybnMgYHN1Y2Nlc3M6IGZhbHNlYCwgYGV4ZWN1dGVOb2RlYCB0dXJucyB0aGF0IGludG8gYVxuICAgICAgLy8gdGhyb3csIGFuZCB0aGUgcnVuIGVuZHMgYHN0YXR1czogJ2ZhaWxlZCdgLlxuICAgICAgLy9cbiAgICAgIC8vIEJMQVNUIFJBRElVUywgc3RhdGVkIHByZWNpc2VseSBiZWNhdXNlIGl0IGRpZmZlcnMgZnJvbSB0aGUgc2libGluZ1xuICAgICAgLy8gZGVmZWN0IGluIGBjYXNlX3NsYV9tb25pdG9yYCBhbmQgdGhlIGRpZmZlcmVuY2UgaXMgc3RydWN0dXJhbDogdGhlc2UgdHdvXG4gICAgICAvLyBhcmUgYHJlY29yZF9jaGFuZ2VgIGZsb3dzIHdpdGggTk8gbG9vcCwgc28gb25lIG93bmVybGVzcyBjYXNlIGtpbGxzIG9ubHlcbiAgICAgIC8vIGl0cyBPV04gcnVuIFx1MjAxNCB0aGVyZSBpcyBubyBxdWV1ZSBvZiBvdGhlciByZWNvcmRzIGJlaGluZCBpdC4gQSBgc2NoZWR1bGVgXG4gICAgICAvLyBmbG93IHdob3NlIHdvcmsgc2l0cyBpbnNpZGUgYSBgbG9vcGAgYXdhaXRzIGBydW5SZWdpb25gIHdpdGggbm9cbiAgICAgIC8vIHRyeS9jYXRjaCwgYW5kIHRoZXJlIG9uZSBvd25lcmxlc3Mgcm93IHRha2VzIGRvd24gZXZlcnkgcmVjb3JkIG9yZGVyZWRcbiAgICAgIC8vIGJlaGluZCBpdC5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2RDQgVGhlIGdhdGUgc2l0cyBBRlRFUiBgYXNzaWduX3Nlbmlvcl9hZ2VudGAsIHdoaWNoIHN0YXlzXG4gICAgICAvLyBVTkNPTkRJVElPTkFMOiB0aGUgZXNjYWxhdGlvbiBpdHNlbGYgbXVzdCBzdGlsbCBsYW5kIChtZWFzdXJlZFxuICAgICAgLy8gYGlzX2VzY2FsYXRlZDogdHJ1ZWAsIGBzdGF0dXM6ICdlc2NhbGF0ZWQnYCBvbiBldmVyeSBmYWlsaW5nIHJ1biksIHNvIGFuXG4gICAgICAvLyBvd25lcmxlc3MgY3JpdGljYWwgY2FzZSBzdGF5cyB2aXNpYmxlIGluIHZpZXdzIGFuZCByZXBvcnRzLiBPbmx5IHRoZVxuICAgICAgLy8gbm90aWZ5IGlzIGdhdGVkIFx1MjAxNCBhbmQgaGVyZSB0aGF0IGxvc2VzIG5vdGhpbmcgYSByZWFkZXIgd291bGQgd2FudCxcbiAgICAgIC8vIGJlY2F1c2UgYGNhc2VSZWNvcmRgIGlzIHJlYWQgYnkgYGdldF9jYXNlYCBVUFNUUkVBTSBvZiB0aGUgZXNjYWxhdGlvblxuICAgICAgLy8gd3JpdGUsIHNvIGB7Y2FzZVJlY29yZC5vd25lcl9pZH1gIGlzIGRlbGliZXJhdGVseSB0aGUgb3duZXIgdGhlIGNhc2UgaGFkXG4gICAgICAvLyBCRUZPUkUgdGhlIGhhbmQtb2ZmLiBXaXRoIG5vIHN1Y2ggcGVyc29uIHRoZXJlIGlzIG5vIFwicHJldmlvdXMgb3duZXJcIlxuICAgICAgLy8gZm9yIHRoZSBtZXNzYWdlIHRvIGJlIGFkZHJlc3NlZCB0by5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgVGhpcyBndWFyZCBpcyBleGFjdGx5IHRoZSBkdXBsaWNhdGlvbiBvYmplY3RzdGFjayMxMzY4MiBleGlzdHMgdG9cbiAgICAgIC8vIHJldGlyZSBcdTIwMTQgYG5vdGlmeWAgc2hvdWxkIHRyZWF0IGFuIGVtcHR5IGF1ZGllbmNlIGFzIGEgUkVDT1JERUQgU0tJUFxuICAgICAgLy8gcmF0aGVyIHRoYW4gYSBoYXJkIGZhaWx1cmUuIFdoZW4gdGhhdCBsYW5kcywgZGVsZXRlIHRoaXMgbm9kZSBhbmQgZWRnZVxuICAgICAgLy8gYGU0YCdzIHByZWRpY2F0ZSBoZXJlLCBhbmQgdGhlIHNhbWUgcGFpciBpbiBgY2FzZS1zbGEtbW9uaXRvci5mbG93LnRzYC5cbiAgICAgIGlkOiAnY2hlY2tfb3duZXInLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0Nhc2UgSGFzIGFuIE93bmVyPycsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBBRFItMDAxMjogdGhlIGRlZGljYXRlZCBgbm90aWZ5YCBub2RlIGRpc3BhdGNoZXMgdGhyb3VnaCB0aGUgbWVzc2FnaW5nXG4gICAgICAvLyBzZXJ2aWNlIChpbmJveCArIGVtYWlsICsgcHVzaCkuIFRoZSBsZWdhY3kgYHNjcmlwdGAgKyBgYWN0aW9uVHlwZTonZW1haWwnYFxuICAgICAgLy8gc2hhcGUgaXMgYSBuby1vcCBzdHViIGluIDcuNCBhbmQgbmV2ZXIgZGVsaXZlcmVkIGFueXRoaW5nLlxuICAgICAgLy8gT3duZXIgb25seTogYHtjYXNlUmVjb3JkLm93bmVyX2lkLm1hbmFnZXJ9YCBjYW5ub3QgdHJhdmVyc2UgYSBsb29rdXAgaW5cbiAgICAgIC8vIGZsb3cgdGVtcGxhdGVzIFx1MjAxNCBpdCBpbnRlcnBvbGF0ZXMgdG8gdGhlIGxpdGVyYWwgXCJ1bmRlZmluZWRcIi5cbiAgICAgIC8vIFRoZSBgbGFiZWxgIG5hbWVzIHRoZSBzaW5nbGUgcmVjaXBpZW50IHRoaXMgbm9kZSBoYXMgKGByZWNpcGllbnRzYFxuICAgICAgLy8gYmVsb3cpOyB0aGUgYGlkYCBrZWVwcyBpdHMgYG5vdGlmeV90ZWFtYCBzcGVsbGluZyBiZWNhdXNlIGBlZGdlc1tdYFxuICAgICAgLy8gcmVmZXJlbmNlIGl0LiBDZi4gdGhlIHNhbWUgbm9kZSBpbiBgY2FzZS1zbGEtbW9uaXRvci5mbG93LnRzYCwgd2hvc2VcbiAgICAgIC8vIGxhYmVsIGFscmVhZHkgc2F5cyBgQWxlcnQgT3duZXJgLlxuICAgICAgaWQ6ICdub3RpZnlfdGVhbScsIHR5cGU6ICdub3RpZnknLCBsYWJlbDogJ05vdGlmeSBDYXNlIE93bmVyJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBPd25lciBvbmx5LCBhbmQgdGhlIG93bmVyIGl0IHJlYWNoZXMgaXMgdGhlIG9uZSB0aGUgY2FzZSBoYWQgQkVGT1JFXG4gICAgICAgIC8vIHRoZSBlc2NhbGF0aW9uOiBgY2FzZVJlY29yZGAgd2FzIHJlYWQgYnkgYGdldF9jYXNlYCB1cHN0cmVhbSBvZiB0aGVcbiAgICAgICAgLy8gd3JpdGUsIHNvIGB7Y2FzZVJlY29yZC5vd25lcl9pZH1gIGlzIHRoZSBhZ2VudCBiZWluZyBoYW5kZWQgb2ZmIGZyb21cbiAgICAgICAgLy8gXHUyMDE0IGV4YWN0bHkgdGhlIHBlcnNvbiB0aGlzIG1lc3NhZ2UgaXMgZm9yLiBGbG93IHRlbXBsYXRlcyBjYW5ub3RcbiAgICAgICAgLy8gdHJhdmVyc2UgYSBsb29rdXAgKHNlZSB0aGUgbm90ZSBvbiBgYXNzaWduX3Nlbmlvcl9hZ2VudGAgYWJvdmUpOlxuICAgICAgICAvLyBge2Nhc2VSZWNvcmQub3duZXJfaWQubWFuYWdlcn1gIGFuZCBge2Nhc2VSZWNvcmQuY3JtX2FjY291bnQubmFtZX1gXG4gICAgICAgIC8vIGJvdGggaW50ZXJwb2xhdGUgdG8gdGhlIGxpdGVyYWwgc3RyaW5nIFwidW5kZWZpbmVkXCIgXHUyMDE0IGEgcGhhbnRvbVxuICAgICAgICAvLyByZWNpcGllbnQgYW5kIGEgZ2FyYmxlZCBib2R5LlxuICAgICAgICByZWNpcGllbnRzOiBbY2VsYGNhc2VSZWNvcmQub3duZXJfaWRgXSxcbiAgICAgICAgY2hhbm5lbHM6IFsnaW5ib3gnLCAnZW1haWwnXSxcbiAgICAgICAgc2V2ZXJpdHk6ICdjcml0aWNhbCcsXG4gICAgICAgIHRvcGljOiAnY2FzZV9lc2NhbGF0ZWQnLFxuICAgICAgICAvLyBcdTI2QTBcdUZFMEYgVGhlIGJvZHkgXHUyMDE0IG5vdyBgY3JtLmNhc2VfZXNjYWxhdGVkYCBpbiBgLi4vZW1haWwtdGVtcGxhdGVzL2AsIG9uZVxuICAgICAgICAvLyByb3cgcGVyIGxvY2FsZSBcdTIwMTQgbXVzdCBzdGF5IHRydWUgb24gQk9USCBvdXRjb21lcy4gXCJJdCByZW1haW5zXG4gICAgICAgIC8vIGFzc2lnbmVkIHRvIHlvdVwiIGlzIGZhbHNlIHdoZW5ldmVyIHRoZSBoYW5kLW9mZiBmaW5kcyBhIG1hbmFnZXI7IHRoZVxuICAgICAgICAvLyBvcHBvc2l0ZSBjbGFpbSAoXCJpdCBoYXMgYmVlbiByZWFzc2lnbmVkXCIpIGlzIGZhbHNlIHdoZW5ldmVyIHRoZVxuICAgICAgICAvLyBgc2VydmljZV9tYW5hZ2VyYCBwb29sIGlzIHVuc3RhZmZlZCwgd2hpY2ggaXMgdGhlIGZpcnN0LWluc3RhbGwgbm9ybS5cbiAgICAgICAgLy8gU28gaXQgc3RhdGVzIHRoZSBydWxlIGFuZCBwb2ludHMgYXQgdGhlIHJlY29yZCBmb3IgdGhlIGFuc3dlciwgaW5cbiAgICAgICAgLy8gZXZlcnkgbGFuZ3VhZ2UuXG4gICAgICAgIHRlbXBsYXRlOiAnY3JtLmNhc2VfZXNjYWxhdGVkJyxcbiAgICAgICAgdGVtcGxhdGVEYXRhOiB7IGNhc2VfbnVtYmVyOiBjZWxgY2FzZVJlY29yZC5jYXNlX251bWJlcmAsIHByaW9yaXR5OiBjZWxgY2FzZVJlY29yZC5wcmlvcml0eWAgfSxcbiAgICAgICAgYWN0aW9uVXJsOiAnL2NybV9jYXNlL3t7cmVjb3JkLmlkfX0nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG5cbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ2dldF9jYXNlJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAnZ2V0X2Nhc2UnLCB0YXJnZXQ6ICdhc3NpZ25fc2VuaW9yX2FnZW50JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UzJywgc291cmNlOiAnYXNzaWduX3Nlbmlvcl9hZ2VudCcsIHRhcmdldDogJ2NoZWNrX293bmVyJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gVGhlIGdhdGUuIEEgYGRlY2lzaW9uYCB3aXRoIG5vIG1hdGNoaW5nIG91dC1lZGdlIHNpbXBseSBlbmRzIHRoZSBydW5cbiAgICAvLyBoZXJlLCBhZnRlciB0aGUgZXNjYWxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uXG4gICAgLy9cbiAgICAvLyBUT1RBTElUWTogYGNhc2VSZWNvcmRgIGlzIGEgYGdldF9yZWNvcmRgIE9VVFBVVCBcdTIwMTQgYSByYXcgZHJpdmVyIHJvdywgc3BhcnNlXG4gICAgLy8gaW4gdGhlIHdheSBgZHJpdmVyLW1lbW9yeWAgLyBgZHJpdmVyLW1vbmdvZGJgIHN0b3JlIG9ubHkgdGhlIGNvbHVtbnMgYSByb3dcbiAgICAvLyB3YXMgd3JpdHRlbiB3aXRoIFx1MjAxNCBzbyBvbmx5IGBoYXMoKWAgaXMgdG90YWwsIGFuZCBpdCBtdXN0IGJlIGB2YXJzLmAtc2NvcGVkXG4gICAgLy8gKG1lYXN1cmVkOiBiYXJlIGBoYXMoY2FzZVJlY29yZC5vd25lcl9pZClgIHN0aWxsIGFib3J0cyB3aXRoIGBVbmtub3duXG4gICAgLy8gdmFyaWFibGVgIG9uIGFuIHVuYm91bmQgcm9vdCwgd2hpbGUgYGhhcyh2YXJzLmNhc2VSZWNvcmQpYCBhbnN3ZXJzXG4gICAgLy8gYGZhbHNlYCkuXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgRVZFUlkgVEVSTSBJUyBMT0FELUJFQVJJTkcgXHUyMDE0IGRvIG5vdCBzaW1wbGlmeSB0aGlzIHByZWRpY2F0ZS4gVGhlIGxhc3RcbiAgICAvLyBvbmUgTUlSUk9SUyBUSEUgTk9USUZZIE5PREUnUyBPV04gZW1wdGluZXNzIHJ1bGUgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcgYXRcbiAgICAvLyBpdDogYnVpbHRpbiBgbm90aWZ5YCBidWlsZHMgaXRzIGF1ZGllbmNlIHdpdGggYFN0cmluZyh2KS50cmltKClgICtcbiAgICAvLyBgLmZpbHRlcihCb29sZWFuKWAsIHNvIG51bGwsIHVuZGVmaW5lZCwgYCcnYCBhbmQgYW55IGFsbC13aGl0ZXNwYWNlIHZhbHVlXG4gICAgLy8gYWxsIGNvbGxhcHNlIHRvIHRoZSBzYW1lIGVtcHR5IHNsYXRlLiBFYWNoIHRlcm0gd2FzIG1lYXN1cmVkIHRocm91Z2hcbiAgICAvLyBgZXZhbHVhdGVDb25kaXRpb25gIG9uIHRoZSBzaGFwZSBpdCBhbG9uZSBjb3ZlcnMsIGJ5IGRyb3BwaW5nIGl0IGFuZFxuICAgIC8vIHJlY29yZGluZyB3aGF0IHRoZSByZXN0IGRvOlxuICAgIC8vICAgLSBgaGFzKHZhcnMuY2FzZVJlY29yZClgIFx1MjAxNCBhbiBVTkJPVU5EIHJvb3QuIFdpdGhvdXQgaXQgdGhlIHByZWRpY2F0ZVxuICAgIC8vICAgICBhYm9ydHMgd2l0aCBgTm8gc3VjaCBrZXk6IGNhc2VSZWNvcmRgLiBgZ2V0X2Nhc2VgIGJpbmRzIHRoZSB2YXJpYWJsZVxuICAgIC8vICAgICBvbiBldmVyeSBwYXRoIGhlcmUgKGl0IHNldHMgaXQgZXZlbiB3aGVuIGl0IG1hdGNoZWQgbm90aGluZyksIHNvIHRoaXNcbiAgICAvLyAgICAgdGVybSBpcyB3aGF0IGtlZXBzIGEgZnV0dXJlIGdyYXBoIGVkaXQgZnJvbSB0dXJuaW5nIGEgZ2F0ZSBpbnRvIGFuXG4gICAgLy8gICAgIGFib3J0IFx1MjAxNCBhbmQgdGhlIGB2YXJzLmAtc2NvcGVkIGBoYXMoKWAgcGFpciBpcyB0aGUgaG91c2UgcnVsZVxuICAgIC8vICAgICBgdGVzdC9mbG93LXZhcmlhYmxlLWNvbmRpdGlvbnMudGVzdC50c2AgZW5mb3JjZXMuXG4gICAgLy8gICAtIGBoYXModmFycy5jYXNlUmVjb3JkLm93bmVyX2lkKWAgXHUyMDE0IHRoZSBBQlNFTlQga2V5LiBXaXRob3V0IGl0LFxuICAgIC8vICAgICBgdmFycy5jYXNlUmVjb3JkLm93bmVyX2lkICE9IG51bGxgIGFib3J0cyB3aXRoIGBObyBzdWNoIGtleTogb3duZXJfaWRgLlxuICAgIC8vICAgLSBgdmFycy5jYXNlUmVjb3JkLm93bmVyX2lkICE9IG51bGxgIFx1MjAxNCB0aGUgZXhwbGljaXQgTlVMTC4gV2l0aG91dCBpdCB0aGVcbiAgICAvLyAgICAgd3JhcCBpcyBoYW5kZWQgb25lIGFuZCBhYm9ydHMgd2l0aCBgbm8gbWF0Y2hpbmcgb3ZlcmxvYWQgZm9yXG4gICAgLy8gICAgICdzdHJpbmcobnVsbCknYCwgc28gdGhpcyB0ZXJtIG11c3Qgc2hvcnQtY2lyY3VpdCBpbiBmcm9udCBvZiBpdC5cbiAgICAvLyAgIC0gYHN0cmluZyguLi4pLnRyaW0oKSAhPSBcIlwiYCBcdTIwMTQgdGhlIEJMQU5LL3doaXRlc3BhY2UgaWQuIGAnICAgJyAhPSBcIlwiYCBpc1xuICAgIC8vICAgICBUUlVFIGluIENFTCwgc28gYSBnYXRlIHdyaXR0ZW4gdGhhdCB3YXkgb3BlbnMgZm9yIGEgd2hpdGVzcGFjZVxuICAgIC8vICAgICBgb3duZXJfaWRgIGFuZCByZXByb2R1Y2VzIHRoaXMgdmVyeSBkZWZlY3Qgb25lIGlucHV0IG5hcnJvd2VyLiBUaGVcbiAgICAvLyAgICAgYHN0cmluZygpYCB3cmFwIGlzIG5vdCBkZWNvcmF0aW9uIGVpdGhlcjogbWVhc3VyZWQsIGEgYmFyZSBgLnRyaW0oKWBcbiAgICAvLyAgICAgb24gYSBudW1lcmljIGlkIGFib3J0cyB3aXRoIGBubyBtYXRjaGluZyBvdmVybG9hZCBmb3JcbiAgICAvLyAgICAgJ2RvdWJsZS50cmltKCknYCBhbmQgYC5tYXRjaGVzKClgIHdpdGggYCdkb3VibGUubWF0Y2hlcyhzdHJpbmcpJ2AgXHUyMDE0IGFcbiAgICAvLyAgICAgdGhyb3duIGNvbmRpdGlvbiwgdGhlIGZhdWx0IG1vZGUgdGhpcyBnYXRlIGV4aXN0cyB0byByZW1vdmUuXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgRG8gTk9UIGFkZCBhIGB2YXJzLmNhc2VSZWNvcmQgIT0gbnVsbGAgdGVybSBmb3IgdGhlIHJvdyB0aGF0IGlzIEdPTkUgYnlcbiAgICAvLyB0aGUgdGltZSBgZ2V0X2Nhc2VgIHJlYWRzIGl0LiBNZWFzdXJlZCBJTkVSVDogYGdldF9yZWNvcmRgIHdpdGggbm8gbWF0Y2hcbiAgICAvLyBzZXRzIHRoZSB2YXJpYWJsZSB0byBgbnVsbGAsIGtleSBwcmVzZW50LCBhbmQgYGhhcygpYCBvbiBhIG51bGwgYmFzZVxuICAgIC8vIGFuc3dlcnMgYGZhbHNlYCByYXRoZXIgdGhhbiBhYm9ydGluZywgc28gdGhlIGZvdXIgdGVybXMgYWJvdmUgYWxyZWFkeVxuICAgIC8vIGNsb3NlIHRoYXQgc2hhcGUgKGB0ZXN0L2Zsb3ctZXNjYWxhdGlvbi1vd25lcmxlc3MtY2FzZS50ZXN0LnRzYCBjb3ZlcnNcbiAgICAvLyBpdCkuIEEgdGVybSB0aGF0IGNhbm5vdCBjaGFuZ2UgYW4gYW5zd2VyIGlzIGFuIGluZXJ0IGNvcHksIG5vdCBkZWZlbmNlIGluXG4gICAgLy8gZGVwdGguXG4gICAgeyBpZDogJ2U0Jywgc291cmNlOiAnY2hlY2tfb3duZXInLCB0YXJnZXQ6ICdub3RpZnlfdGVhbScsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGBoYXModmFycy5jYXNlUmVjb3JkKSAmJiBoYXModmFycy5jYXNlUmVjb3JkLm93bmVyX2lkKVxuICAgICAgJiYgdmFycy5jYXNlUmVjb3JkLm93bmVyX2lkICE9IG51bGwgJiYgc3RyaW5nKHZhcnMuY2FzZVJlY29yZC5vd25lcl9pZCkudHJpbSgpICE9IFwiXCJgLCBsYWJlbDogJ0hhcyBvd25lcicgfSxcbiAgICB7IGlkOiAnZTUnLCBzb3VyY2U6ICdub3RpZnlfdGVhbScsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcblxuLyoqXG4gKiBJbnNlcnQtdGltZSB0d2luIG9mIGBjYXNlX2VzY2FsYXRpb25gOiBhIHJlY29yZC1jaGFuZ2UgZmxvdyBiaW5kcyBleGFjdGx5IG9uZVxuICogaG9vayBldmVudCwgc28gdGhlIGFmdGVyVXBkYXRlIGZsb3cgYWJvdmUgbmV2ZXIgc2VlcyBjYXNlcyB0aGF0IGFyZSBCT1JOXG4gKiBjcml0aWNhbCAocGhvbmUtaW4gUDFzIFx1MjAxNCB0aGUgY29tbW9uIHBhdGgpLiBTYW1lIG5vZGVzL2VkZ2VzLCBvbmx5IHRoZSBzdGFydFxuICogbm9kZSBpcyByZWJvdW5kIHRvIGFmdGVySW5zZXJ0LiBUaGUgYGVzY2FsYXRlZF9kYXRlID09IG51bGxgICsgc3RhdHVzIGd1YXJkXG4gKiBjYXJyaWVzIG92ZXIgdW50b3VjaGVkIChhIGNhc2UgYm9ybiBjcml0aWNhbCBoYXMgbmVpdGhlcikuXG4gKi9cbmV4cG9ydCBjb25zdCBDYXNlRXNjYWxhdGlvbk9uQ3JlYXRlRmxvdzogRmxvdyA9IHtcbiAgLi4uQ2FzZUVzY2FsYXRpb25GbG93LFxuICBuYW1lOiAnY2FzZV9lc2NhbGF0aW9uX29uX2NyZWF0ZScsXG4gIGxhYmVsOiAnQ2FzZSBFc2NhbGF0aW9uIFByb2Nlc3MgKG9uIGNyZWF0ZSknLFxuICBkZXNjcmlwdGlvbjogJ0VzY2FsYXRlIGNhc2VzIGNyZWF0ZWQgY3JpdGljYWwgKGluc2VydC10aW1lIHR3aW4gb2YgY2FzZV9lc2NhbGF0aW9uKScsXG4gIG5vZGVzOiBDYXNlRXNjYWxhdGlvbkZsb3cubm9kZXMubWFwKChuKSA9PlxuICAgIG4uaWQgPT09ICdzdGFydCdcbiAgICAgID8geyAuLi5uLCBjb25maWc6IHsgLi4ubi5jb25maWcsIHRyaWdnZXJUeXBlOiAncmVjb3JkLWFmdGVyLWNyZWF0ZScgfSB9XG4gICAgICA6IG4sXG4gICksXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9mbG93cy9jYXNlLWFjdGlvbnMuZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZmxvd3MvY2FzZS1hY3Rpb25zLmZsb3cudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGNlbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcbmltcG9ydCB7IENMQUlNQUJMRV9UQVJHRVRfU1RBVFVTRVMgfSBmcm9tICcuLi9vYmplY3RzL19jYXNlLWFzc2lnbm1lbnQnO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIFNjcmVlbiBmbG93cyBiZWhpbmQgdGhlIENsYWltIENhc2UgLyBFc2NhbGF0ZSBDYXNlIC8gQ2xvc2UgQ2FzZSBoZWFkZXJcbiAqIGFjdGlvbnMuXG4gKlxuICogXHUyNkQ0IE5ldmVyIHJlLWV4cHJlc3MgdGhlc2UgYXMgYGJvZHlgLXR5cGVkIGFjdGlvbnMgKHZlcmlmaWVkIGFnYWluc3QgdGhlXG4gKiBydW5uaW5nIDE2LjEuMCBjb25zb2xlLCAyMDI2LTA3LTI4KTpcbiAqXG4gKiAgLSBgdHlwZTogJ21vZGFsJ2AgbmV2ZXIgZXhlY3V0ZXMgdGhlIGJvZHkgYXQgYWxsIFx1MjAxNCBvbiBzdWJtaXQgdGhlIGNvbnNvbGVcbiAqICAgIHJlc29sdmVzIHRoZSBhY3Rpb24gYHRhcmdldGAgYXMgYW4gT0JKRUNUIG5hbWUgYW5kIGRpZXMgb25cbiAqICAgIGBHRVQgL2FwaS92MS9tZXRhL29iamVjdC88dGFyZ2V0PmAgXHUyMTkyIDQwMCAoXCJFcnJvciBsb2FkaW5nIGZvcm1cIikuXG4gKiAgLSBgdHlwZTogJ3NjcmlwdCdgIERPRVMgcmVhY2ggYFBPU1QgL2FwaS92MS9hY3Rpb25zLy4uLmAsIGJ1dCBhIGJvZHkgdGhhdFxuICogICAgVVBEQVRFUyBhIHJlY29yZCBvbiBhbiBvYmplY3Qgd2l0aCBzaGFyaW5nIHJ1bGVzIGlzIHJlamVjdGVkIGJ5IHRoZVxuICogICAgc2hhcmluZyBtaWRkbGV3YXJlIChcIkZPUkJJRERFTjogaW5zdWZmaWNpZW50IHByaXZpbGVnZXMgdG8gdXBkYXRlXG4gKiAgICBjcm1fY2FzZSBcdTIwMjZcIikgXHUyMDE0IHRoZSBzYW5kYm94IGV4ZWN1dGlvbiBjb250ZXh0IGRvZXMgbm90IGNhcnJ5IHRoZSBjYWxsZXJcbiAqICAgIGlkZW50aXR5LCBzbyBgY2FuRWRpdGAgZmFpbHMgZXZlbiBmb3IgdGhlIHJlY29yZCBvd25lci4gSW5zZXJ0cyBhcmVcbiAqICAgIHVuYWZmZWN0ZWQgKGNsb25lX29wcG9ydHVuaXR5IHdvcmtzKSwgdXBkYXRlcyBhcmUgbm90LlxuICogIC0gU2NyZWVuIGZsb3dzIGV4ZWN1dGUgdGhyb3VnaCB0aGUgYXV0b21hdGlvbiBzZXJ2aWNlLCB3aG9zZVxuICogICAgYHVwZGF0ZV9yZWNvcmRgIG5vZGVzIGRlbW9uc3RyYWJseSB3cml0ZSBgY3JtX2Nhc2VgICh0aGVcbiAqICAgIGNhc2VfZXNjYWxhdGlvbiByZWNvcmQtY2hhbmdlIGZsb3cgZG9lcyBleGFjdGx5IHRoYXQgaW4gcHJvZHVjdGlvbikuXG4gKlxuICogU2FtZSBtZWNoYW5pc20gYXMgYHNjaGVkdWxlX2ZvbGxvd3VwYCAvIGBsZWFkX2NvbnZlcnNpb25gLlxuICovXG5leHBvcnQgY29uc3QgRXNjYWxhdGVDYXNlRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2VzY2FsYXRlX2Nhc2UnLFxuICBsYWJlbDogJ0VzY2FsYXRlIENhc2UnLFxuICBkZXNjcmlwdGlvbjogJ0NvbGxlY3QgYW4gZXNjYWxhdGlvbiByZWFzb24sIHRoZW4gZmxhZyBhbmQgcmUtcHJpb3JpdGlzZSB0aGUgY2FzZS4nLFxuICB0eXBlOiAnc2NyZWVuJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcblxuICB2YXJpYWJsZXM6IFtcbiAgICAvLyBNVVNUIGJlIGByZWNvcmRJZGAgXHUyMDE0IHRoZSBjb25zb2xlJ3MgZmxvdy1hY3Rpb24gY29udHJhY3Qgc2VlZHMgb25seSB0aGF0XG4gICAgLy8gbmFtZSAoYW5kIGl0cyBjYW1lbENhc2Ugb2JqZWN0IGFsaWFzKTsgYSBjdXN0b20gbmFtZSBhcnJpdmVzIHVuZGVmaW5lZC5cbiAgICB7IG5hbWU6ICdyZWNvcmRJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAncmVhc29uJywgdHlwZTogJ3RleHQnLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgXSxcblxuICBub2RlczogW1xuICAgIHsgaWQ6ICdzdGFydCcsIHR5cGU6ICdzdGFydCcsIGxhYmVsOiAnU3RhcnQnLCBjb25maWc6IHsgb2JqZWN0TmFtZTogJ2NybV9jYXNlJyB9IH0sXG4gICAge1xuICAgICAgaWQ6ICdzY3JlZW5fMScsIHR5cGU6ICdzY3JlZW4nLCBsYWJlbDogJ0VzY2FsYXRlIENhc2UnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogJ3JlYXNvbicsIGxhYmVsOiAnRXNjYWxhdGlvbiBSZWFzb24nLCB0eXBlOiAndGV4dGFyZWEnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSBVU0VSLUNPTlRFWFQgaGFsZiBvZiB0aGUgZXNjYWxhdGlvbi4gRXZlcnl0aGluZyBoZXJlIGlzIGFcbiAgICAgIC8vIGNvbHVtbiB0aGUgYWN0aW5nIGFnZW50IG1heSBsZWdpdGltYXRlbHkgd3JpdGUsIHNvIGl0IGlzIHdyaXR0ZW4gd2l0aFxuICAgICAgLy8gdGhlaXIgaWRlbnRpdHkgXHUyMDE0IHRoaXMgZmxvdyBzdGF5cyBgcnVuQXM6ICd1c2VyJ2AuXG4gICAgICAvL1xuICAgICAgLy8gICBlc2NhbGF0aW9uX3JlYXNvbiAgdGhlIGFnZW50J3Mgb3duIHNjcmVlbiBpbnB1dFxuICAgICAgLy8gICBwcmlvcml0eSAgICAgICAgICAgYW4gb3JkaW5hcnkgZWRpdGFibGUgZmllbGRcbiAgICAgIC8vICAgc3RhdHVzICAgICAgICAgICAgIG9yZGluYXJ5LCBhbmQgdGhlIGhvb2sgdHJpZ2dlciAoYmVsb3cpXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHR3byBzdGFtcHMgYSBwZXJzb24gbmV2ZXIgdHlwZXMgXHUyMDE0IGBpc19lc2NhbGF0ZWRgIGFuZFxuICAgICAgLy8gYGVzY2FsYXRlZF9kYXRlYCBcdTIwMTQgYXJlIGByZWFkb25seTogdHJ1ZWAgb24gYGNybV9jYXNlYCBhbmQgYXJlIHdyaXR0ZW5cbiAgICAgIC8vIGJ5IHRoZSBgY2FzZV9lc2NhbGF0aW9uX3N0YW1wYCBzdWJmbG93IHRoYXQgZm9sbG93cywgd2l0aCB0aGUgc3lzdGVtXG4gICAgICAvLyBjb250ZXh0LiBTZWUgYHNyYy9zZXJ2aWNlL2Zsb3dzL2Nhc2UtZXNjYWxhdGlvbi1zdGFtcC5mbG93LnRzYC5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgYHN0YXR1czogJ2VzY2FsYXRlZCdgIE1VU1Qgc3RheSBpbiB0aGlzIG5vZGUsIGFuZCBub3Qgb25seSBiZWNhdXNlXG4gICAgICAvLyBpdCBpcyB1c2VyLXdyaXRhYmxlOiBpdCBpcyB0aGUgdHJpZ2dlciBib3RoIGVzY2FsYXRpb24gaG9va3Mga2V5IG9mZiBcdTIwMTRcbiAgICAgIC8vIGBjYXNlX2VzY2FsYXRpb25fcmVhc3NpZ25gIChgX2Nhc2UtYXNzaWdubWVudC50c2ApIGdhdGVzIG9uXG4gICAgICAvLyBgaW5wdXQuc3RhdHVzICE9PSAnZXNjYWxhdGVkJyB8fCBwcmV2aW91cy5zdGF0dXMgPT09ICdlc2NhbGF0ZWQnYCwgYW5kXG4gICAgICAvLyBgY2FzZV9zdGF0dXNfc2lkZV9lZmZlY3RzYCAoYGNhc2UuaG9vay50c2ApIHJlYWRzIHRoZSBzYW1lIHRyYW5zaXRpb24uXG4gICAgICAvLyBLZWVwaW5nIGl0IGhlcmUga2VlcHMgdGhlIG93bmVyc2hpcCBoYW5kLW9mZiBhbmQgdGhlIHNpZGUtZWZmZWN0IHRhc2tzXG4gICAgICAvLyBmaXJpbmcgZnJvbSB0aGUgQUNUSU5HIFVTRVIncyB3cml0ZSwgZXhhY3RseSBhcyB0aGV5IGRpZCBiZWZvcmUgdGhlXG4gICAgICAvLyBzcGxpdC4gTW92aW5nIGl0IGludG8gdGhlIGVsZXZhdGVkIHN1YmZsb3cgd291bGQgc2lsZW50bHkgcmUtYXR0cmlidXRlXG4gICAgICAvLyBib3RoIHRvIHRoZSBzeXN0ZW0uXG4gICAgICAvL1xuICAgICAgLy8gSXQgaXMgYWxzbyB3aGF0IHN1cHByZXNzZXMgYSBkb3VibGUtZmlyZSBvZiB0aGUgYXV0b21hdGljXG4gICAgICAvLyBgY2FzZV9lc2NhbGF0aW9uYCByZWNvcmQtY2hhbmdlIGZsb3cuXG4gICAgICBpZDogJ2VzY2FsYXRlJywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ0VzY2FsYXRlIENhc2UnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fY2FzZScsXG4gICAgICAgIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZElkYCB9LFxuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBlc2NhbGF0aW9uX3JlYXNvbjogY2VsYHJlYXNvbmAsXG4gICAgICAgICAgc3RhdHVzOiAnZXNjYWxhdGVkJyxcbiAgICAgICAgICBwcmlvcml0eTogJ2NyaXRpY2FsJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBUaGUgRUxFVkFURUQgaGFsZiwgYW5kIHRoZSBvbmx5IGVsZXZhdGlvbiBpbiB0aGlzIGZsb3c6IG9uZVxuICAgICAgLy8gYHJ1bkFzOiAnc3lzdGVtJ2AgZmxvdywgb25lIGB1cGRhdGVfcmVjb3JkYCwgdHdvIHJlYWRvbmx5IGNvbHVtbnMuXG4gICAgICAvLyBUaGUgbWFpbnRhaW5lci1hcHByb3ZlZCBkaXJlY3Rpb24gXHUyMDE0IGVsZXZhdGUgdGhlIHdyaXRlLCBub3QgdGhlIGZsb3cuXG4gICAgICAvL1xuICAgICAgLy8gXHUyNkEwXHVGRTBGIFRISVMgTk9ERSBNVVNUIFJVTiBBRlRFUiBgZXNjYWxhdGVgLCBOT1QgQkVGT1JFLiBgY3JtX2Nhc2VgJ3NcbiAgICAgIC8vIGBlc2NhbGF0aW9uX3JlYXNvbl9yZXF1aXJlZGAgdmFsaWRhdGlvbiByZWplY3RzIGFueSB3cml0ZSB3aG9zZSBtZXJnZWRcbiAgICAgIC8vIHJlY29yZCBoYXMgYGlzX2VzY2FsYXRlZCA9PSB0cnVlYCBhbmQgYSBibGFuayBgZXNjYWxhdGlvbl9yZWFzb25gLiBUaGVcbiAgICAgIC8vIHJlYXNvbiBpcyB3cml0dGVuIGJ5IHRoZSBub2RlIGFib3ZlLCBzbyBieSB0aGUgdGltZSB0aGUgZmxhZyBmbGlwcyBpdFxuICAgICAgLy8gaXMgYWxyZWFkeSBzdG9yZWQuIFJldmVyc2luZyB0aGVzZSB0d28gbm9kZXMgZmlyZXMgdGhhdCB2YWxpZGF0aW9uXG4gICAgICAvLyBhZ2FpbnN0IGEgcmVjb3JkIHdpdGggbm8gcmVhc29uIHlldCBhbmQgdGhlIHN0YW1wIGlzIHJlamVjdGVkLlxuICAgICAgLy9cbiAgICAgIC8vIFx1MjZENCBEbyBub3QgXCJzaW1wbGlmeVwiIHRoaXMgYnkgZ2l2aW5nIFRISVMgZmxvdyBgcnVuQXM6ICdzeXN0ZW0nYCBhbmRcbiAgICAgIC8vIGZvbGRpbmcgdGhlIHN0YW1wIGJhY2sgaW50byB0aGUgbm9kZSBhYm92ZS4gVGhhdCBpcyBvcHRpb24gQSwgY29zdGVkXG4gICAgICAvLyBhbmQgZXhwbGljaXRseSBub3QgYWRvcHRlZDogaXQgZWxldmF0ZXMgZXZlcnkgd3JpdGUgdGhpcyBzY3JlZW4gZmxvd1xuICAgICAgLy8gbWFrZXMgYW5kIHN0b3BzIGl0IGNhcnJ5aW5nIHRoZSBhY3RpbmcgdXNlcidzIGNvbnRleHQgZG93bnN0cmVhbS5cbiAgICAgIC8vIGBBR0VOVFMubWRgIGhvdXNlIHJ1bGUgOSBzdGF0ZXMgaXQgYXMgc3RhbmRpbmcgcG9saWN5LlxuICAgICAgaWQ6ICdzdGFtcF9lc2NhbGF0aW9uJywgdHlwZTogJ3N1YmZsb3cnLCBsYWJlbDogJ1N0YW1wIEVzY2FsYXRpb24gRmxhZ3MnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGZsb3dOYW1lOiAnY2FzZV9lc2NhbGF0aW9uX3N0YW1wJyxcbiAgICAgICAgaW5wdXQ6IHsgcmVjb3JkSWQ6IGNlbGByZWNvcmRJZGAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdzY3JlZW5fMScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ3NjcmVlbl8xJywgdGFyZ2V0OiAnZXNjYWxhdGUnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdlc2NhbGF0ZScsIHRhcmdldDogJ3N0YW1wX2VzY2FsYXRpb24nLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTQnLCBzb3VyY2U6ICdzdGFtcF9lc2NhbGF0aW9uJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuXG5leHBvcnQgY29uc3QgQ2xvc2VDYXNlRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2Nsb3NlX2Nhc2UnLFxuICBsYWJlbDogJ0Nsb3NlIENhc2UnLFxuICBkZXNjcmlwdGlvbjogJ0NvbGxlY3QgdGhlIHJlc29sdXRpb24sIHRoZW4gY2xvc2UgdGhlIGNhc2UgYW5kIHN0b3AgdGhlIFNMQSBjbG9jay4nLFxuICB0eXBlOiAnc2NyZWVuJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gYGlzX2Nsb3NlZGAgaXMgYSByZWFkb25seSBsaWZlY3ljbGUgZmllbGQuIFRoaXMgdHJ1c3RlZCBzY3JlZW4gZmxvdyBvd25zXG4gIC8vIHRoZSB0cmFuc2l0aW9uIGFuZCBtdXN0IHRoZXJlZm9yZSBydW4gd2l0aCB0aGUgc3lzdGVtIHdyaXRlci5cbiAgLy9cbiAgLy8gXHUyNkQ0IEEgSElTVE9SSUNBTCBQUkVDRURFTlQsIE5PVCBBIFBPTElDWSBcdTIwMTQgZG8gbm90IGNpdGUgdGhpcyBsaW5lIHRvIGp1c3RpZnlcbiAgLy8gZWxldmF0aW5nIGFub3RoZXIgc2NyZWVuIGZsb3cgKCMxNDM0LCB0aGUgbWFpbnRhaW5lciBydWxpbmcgdGhhdCBzZXR0bGVkXG4gIC8vIGl0KS4gVGhlIHN0YW5kaW5nIHJ1bGUgaXMgdGhlIG9wcG9zaXRlIG9uZTogYSBzY3JlZW4gZmxvdyBzdGF5c1xuICAvLyBgcnVuQXM6ICd1c2VyJ2AgYW5kIGEgd3JpdGUgdGhhdCBnZW51aW5lbHkgbmVlZHMgZWxldmF0aW9uIGlzIHNwbGl0IGludG8gYVxuICAvLyBkZWRpY2F0ZWQgYHN5c3RlbWAgc3ViLWZsb3cgcmVhY2hlZCBieSBhIGBzdWJmbG93YCBub2RlIFx1MjAxNCBzZWVcbiAgLy8gYGVzY2FsYXRlX2Nhc2VgIGFib3ZlIGFuZCBgc3JjL3NlcnZpY2UvZmxvd3MvY2FzZS1lc2NhbGF0aW9uLXN0YW1wLmZsb3cudHNgLlxuICAvLyBcIlJlYWRvbmx5IHN0cmlwcGVkIG15IHdyaXRlLCBzbyBJIG1hZGUgdGhlIGZsb3cgc3lzdGVtXCIgaXMgdGhlIHBhdHRlcm5cbiAgLy8gdGhhdCBydWxpbmcgZXhpc3RzIHRvIHN0b3AgYmVpbmcgY29waWVkOyBgQUdFTlRTLm1kYCBob3VzZSBydWxlIDkgY2Fycmllc1xuICAvLyBpdCBhcyBob3VzZSBwb2xpY3kuIFRoaXMgZmxvdyBwcmVkYXRlcyB0aGF0IHJ1bGUgYW5kIGhhcyBub3QgYmVlblxuICAvLyByZS1zaGFwZWQgdG8gbWF0Y2ggaXQuXG4gIHJ1bkFzOiAnc3lzdGVtJyxcblxuICB2YXJpYWJsZXM6IFtcbiAgICB7IG5hbWU6ICdyZWNvcmRJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAncmVzb2x1dGlvbicsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAncmVzb2x2ZWRfYnlfYXJ0aWNsZScsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gIF0sXG5cbiAgbm9kZXM6IFtcbiAgICB7IGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0JywgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fY2FzZScgfSB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSBcImF0dGFjaCB0aGUgYXJ0aWNsZSB0aGF0IHJlc29sdmVkIGl0XCIgYWZmb3JkYW5jZS4gT3B0aW9uYWxcbiAgICAgIC8vIG9uIHB1cnBvc2U6IG1vc3QgY2FzZXMgYXJlIG5vdCByZXNvbHZlZCBvdXQgb2YgdGhlIGtub3dsZWRnZSBiYXNlLCBhbmRcbiAgICAgIC8vIGEgcmVxdWlyZWQgZmllbGQgaGVyZSB3b3VsZCBiZSBhbnN3ZXJlZCB3aXRoIGEganVuayB2YWx1ZSByYXRoZXIgdGhhblxuICAgICAgLy8gbGVmdCBob25lc3QgXHUyMDE0IHdoaWNoIGlzIHdvcnNlIHRoYW4gYW4gYWJzZW50IGxpbmsgZm9yIGEgbWVhc3VyZSB3aG9zZVxuICAgICAgLy8gd2hvbGUgam9iIGlzIHRvIHNheSBob3cgT0ZURU4gdGhlIEtCIHJlc29sdmVzIGEgY2FzZS5cbiAgICAgIC8vXG4gICAgICAvLyBgcmVmZXJlbmNlYCBuYW1lcyB0aGUgb2JqZWN0IHRoZSBwaWNrZXIgb2ZmZXJzLiBVcCB0b1xuICAgICAgLy8gYEBvYmplY3RzdGFjay9zcGVjQDE3LjQuMGAgYSBzY3JlZW4gZmllbGQgaGFkIG5vIHN1Y2gga2V5LCBzbyB0aGlzXG4gICAgICAvLyBgdHlwZTogJ2xvb2t1cCdgIGZpZWxkIGhhZCBub3RoaW5nIHRvIHJlc29sdmUgYSByZWNvcmQgcGlja2VyIGZyb207XG4gICAgICAvLyAxNy41LjAgYWRkZWQgYHJlZmVyZW5jZWAgdG8gYFNjcmVlbkZpZWxkQ29uZmlnU2NoZW1hYCBhbmQgbWFkZSBpdFxuICAgICAgLy8gUkVRVUlSRUQgb24gYSBsb29rdXAgc2NyZWVuIGZpZWxkICgjMTc5MTMpIFx1MjAxNCB0aGUgc3RhY2sgZG9lcyBub3QgbG9hZFxuICAgICAgLy8gd2l0aG91dCBpdC4gSXQgaXMgdGhlIHNhbWUgdGFyZ2V0IHRoZSBjYXNlJ3Mgb3duIGByZXNvbHZlZF9ieV9hcnRpY2xlYFxuICAgICAgLy8gbG9va3VwIGRlY2xhcmVzIChgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCkuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIGBSZXNvbHZlZCBieSBBcnRpY2xlYCBsb29rdXAgaW4gdGhlIGNhc2UncyBSZXNvbHV0aW9uIGdyb3VwLCBvbiB0aGVcbiAgICAgIC8vIHJlY29yZCBmb3JtLCB3cml0ZXMgdGhlIHNhbWUgY29sdW1uOyB0aGUgYWN0aW9uIGlzXG4gICAgICAvLyBgcmVmcmVzaEFmdGVyOiB0cnVlYCwgc28gdGhlIHJlY29yZCBmb3JtIGlzIHdoYXQgdGhlIGFnZW50IGxhbmRzIG9uXG4gICAgICAvLyBpbW1lZGlhdGVseSBhZnRlciBjbG9zaW5nLlxuICAgICAgaWQ6ICdzY3JlZW5fMScsIHR5cGU6ICdzY3JlZW4nLCBsYWJlbDogJ0Nsb3NlIENhc2UnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogJ3Jlc29sdXRpb24nLCBsYWJlbDogJ1Jlc29sdXRpb24nLCB0eXBlOiAndGV4dGFyZWEnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdyZXNvbHZlZF9ieV9hcnRpY2xlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnUmVzb2x2ZWQgYnkgQXJ0aWNsZSAob3B0aW9uYWwpJyxcbiAgICAgICAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgICAgICAgcmVmZXJlbmNlOiAnY3JtX2tub3dsZWRnZV9hcnRpY2xlJyxcbiAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIGByZXNvbHZlZF9ieV9hcnRpY2xlYCBpcyB3cml0dGVuIHVuY29uZGl0aW9uYWxseSwgYW5kIGEgYmxhbmsgb25lIGlzXG4gICAgICAvLyBub3JtYWxpc2VkIHRvIE5VTEwgYnkgYGNhc2VfcmVzb2x1dGlvbl9hcnRpY2xlX25vcm1hbGl6ZWBcbiAgICAgIC8vIChgc3JjL3NlcnZpY2Uvb2JqZWN0cy9jYXNlLmhvb2sudHNgKSByYXRoZXIgdGhhbiBicmFuY2hlZCBhcm91bmQgaGVyZTogTUVBU1VSRURcbiAgICAgIC8vIG9uIHRoZSByZWFsIGVuZ2luZSwgYSBzY3JlZW4gZmllbGQgbGVmdCBlbXB0eSByZXN1bWVzIGFzIGAnJ2AgYW5kIGxhbmRzXG4gICAgICAvLyBhcyBhbiBlbXB0eSBzdHJpbmcsIHdoaWNoIGBjb3VudChyZXNvbHZlZF9ieV9hcnRpY2xlKWAgY291bnRzLiBBXG4gICAgICAvLyBgZGVjaXNpb25gIG5vZGUgY291bGQgbm90IGhhdmUgYnJhbmNoZWQgaXQgZWl0aGVyIFx1MjAxNCB0aGlzIHJlcG8gaGFzXG4gICAgICAvLyBtZWFzdXJlZCBgZGVjaXNpb24uY29uZmlnLmNvbmRpdGlvbmAgdG8gYmUgaW5lcnQgbWV0YWRhdGFcbiAgICAgIC8vIChgdGVzdC93aW4tbG9zcy1jYXB0dXJlLnRlc3QudHNgJ3MgdGFibGUgb2YgZml2ZSBzdWNoIHN1cmZhY2VzKS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgcmVhZCBpcyBndWFyZGVkIGJlY2F1c2UgdGhlIGZpZWxkIGlzIG9wdGlvbmFsOiBhIHJlc3VtZSB0aGF0IG9taXRzXG4gICAgICAvLyBpdCBsZWF2ZXMgdGhlIHZhcmlhYmxlIHVuYm91bmQsIHdoaWNoIHRoZSAxNy54IHRlbXBsYXRlIHdyb3RlIGFzIG5vdGhpbmdcbiAgICAgIC8vICh0aGUgc3RvcmVkIGxpbmsgbGVmdCBhbG9uZSkgYW5kIENFTCByZWZ1c2VzLiBUaGUgZ3VhcmQgd3JpdGVzIE5VTExcbiAgICAgIC8vIHRoZXJlIFx1MjAxNCB0aGUgdmFsdWUgYSBibGFuayBmaWVsZCBhbHJlYWR5IGxhbmRzIGFzIGFmdGVyIHRoZSBub3JtYWxpemVcbiAgICAgIC8vIGhvb2sgXHUyMDE0IHNvIGFuIG9taXR0ZWQgYW5zd2VyIGFuZCBhbiBlbXB0eSBvbmUgbm93IGNsb3NlIHRoZSBjYXNlIGFsaWtlLlxuICAgICAgaWQ6ICdjbG9zZScsIHR5cGU6ICd1cGRhdGVfcmVjb3JkJywgbGFiZWw6ICdDbG9zZSBDYXNlJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2Nhc2UnLFxuICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmRJZGAgfSxcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgaXNfY2xvc2VkOiB0cnVlLFxuICAgICAgICAgIHJlc29sdXRpb246IGNlbGByZXNvbHV0aW9uYCxcbiAgICAgICAgICBzdGF0dXM6ICdjbG9zZWQnLFxuICAgICAgICAgIHJlc29sdmVkX2J5X2FydGljbGU6IGNlbGBoYXModmFycy5yZXNvbHZlZF9ieV9hcnRpY2xlKSA/IHJlc29sdmVkX2J5X2FydGljbGUgOiBudWxsYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdzY3JlZW5fMScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ3NjcmVlbl8xJywgdGFyZ2V0OiAnY2xvc2UnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdjbG9zZScsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcblxuLyoqXG4gKiBDbGFpbSBDYXNlIFx1MjAxNCB0aGUgdHJpYWdlIGNsYWltIGdlc3R1cmUsIGdpdmVuIGEgYnV0dG9uLlxuICpcbiAqICMjIFdoYXQgdGhpcyBmbG93IGlzLCBhbmQgd2hhdCBpdCBkZWxpYmVyYXRlbHkgaXMgTk9UXG4gKlxuICogVGhlIGNsYWltIGFscmVhZHkgZXhpc3RzIGFzIGJlaGF2aW91cjogYW4gYWdlbnQgbW92ZXMgYW4gdW5vd25lZCBjYXNlIG91dCBvZlxuICogKipVbmFzc2lnbmVkIFx1MjAxNCB0cmlhZ2UqKiBieSBzZXR0aW5nIGl0cyBzdGF0dXMgdG8gb25lIHRoYXQgbWVhbnMgYSBwZXJzb24gaXNcbiAqIG9uIGl0LCBhbmQgYGNhc2Vfc2VsZl9jbGFpbWAgKGBzcmMvc2VydmljZS9vYmplY3RzL19jYXNlLWFzc2lnbm1lbnQudHNgLCBwcmlvcml0eVxuICogMjYwKSBzdGFtcHMgYG93bmVyX2lkYCB3aXRoIHRoZSBjYWxsZXIuIFRoaXMgZmxvdyBpcyB0aGUgc2NyZWVuIHRoYXQgc2F5cyBzby5cbiAqXG4gKiBJdCBpcyAqKnB1cmUgVUkgb3ZlciB0aGUgZXhpc3Rpbmcgc2VhbSoqLiBJdHMgb25lIHdyaXRlIGlzIHRoZVxuICogU1RBVFVTIE1PVkUuIEl0IGRvZXMgbm90IHdyaXRlIGBvd25lcl9pZGAsIGFuZCB0aGF0IGlzIG5vdCBhIHN0eWxlIGNob2ljZTpcbiAqXG4gKiAgLSB0aGUgb3duZXJzaGlwLXRyYW5zZmVyIGdhdGUgcmVmdXNlcyBhbnkgcGF5bG9hZCBjYXJyeWluZyBgb3duZXJfaWRgIGluIHRoZVxuICogICAgc2hhcmluZyBNSURETEVXQVJFLCB1cHN0cmVhbSBvZiB0aGUgaG9vayBwaGFzZSwgYW5kIGEgc2NyZWVuIGZsb3cnc1xuICogICAgYHVwZGF0ZV9yZWNvcmRgIHJ1bnMgYXMgdGhlIGNhbGxlciBcdTIwMTQgc28gYSBmbG93IHRoYXQgd3JvdGUgdGhlIGNvbHVtbiB3b3VsZFxuICogICAgYmUgcmVmdXNlZCBleGFjdGx5IGxpa2UgYSBoYW5kLXdyaXR0ZW4gdXBkYXRlLCBsb3VkbHkgYW5kIGFsd2F5cztcbiAqICAtIGFuZCBgY2FzZV9zZWxmX2NsYWltYCBndWFyZCAyIHN0YW5kcyBkb3duIHRoZSBtb21lbnQgYG93bmVyX2lkYCBpcyBhbHJlYWR5XG4gKiAgICBpbiB0aGUgcGF5bG9hZCwgc28gZXZlbiBhIGNhbGxlciBob2xkaW5nIGBhbGxvd1RyYW5zZmVyYCB3b3VsZCB0YWtlIHRoZVxuICogICAgY2xhaW0gc2VhbSBvdXQgb2YgdGhlIHBpY3R1cmUgcmF0aGVyIHRoYW4gZHJpdmUgaXQuXG4gKlxuICogT3duZXJzaGlwIHRoZXJlZm9yZSBrZWVwcyBleGFjdGx5IE9ORSB3cml0ZXIuIGB0ZXN0L2NsYWltLWNhc2Utb25lLW93bmVyLXdyaXRlci50ZXN0LnRzYFxuICogaXMgdGhhdCBzZW50ZW5jZSB0dXJuZWQgaW50byBhIGd1YXJkLCBzbyBpdCBpcyBlbmZvcmNlZCByYXRoZXIgdGhhbiBpbnRlbmRlZC5cbiAqXG4gKiAjIyBXaHkgYHJ1bkFzOiAndXNlcidgLCBzcGVsbGVkIG91dCByYXRoZXIgdGhhbiBkZWZhdWx0ZWRcbiAqXG4gKiBIb3VzZSBydWxlIDkgKGBBR0VOVFMubWRgKSBhbHJlYWR5IHNheXMgYSBzY3JlZW4gZmxvdyBzdGF5cyBgcnVuQXM6ICd1c2VyJ2AsXG4gKiBidXQgaGVyZSB0aGUgZGVmYXVsdCBpcyBMT0FELUJFQVJJTkcgYW5kIHdvcnRoIHJlYWRpbmcgdHdpY2U6IGBjYXNlX3NlbGZfY2xhaW1gXG4gKiByZXR1cm5zIGVhcmx5IGZvciBhIHdyaXRlIHdpdGggbm8gdXNlciwgYW5kIGFnYWluIGZvciBgY3R4LnNlc3Npb24uaXNTeXN0ZW1gLlxuICogQW4gZWxldmF0ZWQgcnVuIG9mIHRoaXMgZmxvdyB3b3VsZCBtb3ZlIHRoZSBzdGF0dXMgYW5kIGNsYWltIE5PVEhJTkcgXHUyMDE0IHRoZVxuICogY2FzZSB3b3VsZCBsZWF2ZSB0aGUgdHJpYWdlIHRhYiBzdGlsbCBvd25lcmxlc3MuIFRoZSBkZWNsYXJhdGlvbiBpcyBleHBsaWNpdFxuICogc28gdGhlIG5leHQgYXV0aG9yIHNlZXMgdGhlIGNvdXBsaW5nIGJlZm9yZSByZWFjaGluZyBmb3IgZWxldmF0aW9uLlxuICpcbiAqICMjIFdoeSBhIHNjcmVlbiwgYW5kIHdoeSB0aGUgcGlja2VyIGlzIGRlcml2ZWRcbiAqXG4gKiBUaGUgdGhyZWUgc3RhdHVzZXMgdGhhdCBjbGFpbSBhcmUgb25lIGNvbmNlcHQgd2l0aCB0aHJlZSBmYWNlcywgYW5kIHdoaWNoIG9uZVxuICogYW4gYWdlbnQgcGlja3MgaXMgcmVhbCBpbmZvcm1hdGlvbiAoYHdhaXRpbmdfY3VzdG9tZXJgIHN0cmFpZ2h0IG9mZiBhIHRyaWFnZVxuICogcm93IGlzIGEgZGlmZmVyZW50IGRheSdzIHdvcmsgZnJvbSBgaW5fcHJvZ3Jlc3NgKS4gVGhlIG9wdGlvbnMgYXJlIGJ1aWx0IGZyb21cbiAqIHtAbGluayBDTEFJTUFCTEVfVEFSR0VUX1NUQVRVU0VTfSBcdTIwMTQgdGhlIHNlYW0ncyBvd24gZGVjbGFyZWQgc2V0IFx1MjAxNCByYXRoZXIgdGhhblxuICogaGFuZC1jb3BpZWQuIFx1MjZENCBOZXZlciBoYW5kLWNvcHkgdGhlIHN1YnNldDogaXQgc2lsZW50bHkgZHJvcHMgYW4gb3B0aW9uIGZyb21cbiAqIHRoZSBwaWNrZXIgYW5kIG5vdGhpbmcgbm90aWNlcy4gQSBmb3VydGggY2xhaW1hYmxlIHN0YXR1cyBtYWtlcyB0aGUgbGFiZWwgbWFwXG4gKiBiZWxvdyBhIENPTVBJTEUgZXJyb3IgcmF0aGVyIHRoYW4gYSBxdWlldGx5IHNob3J0IHBpY2tlci5cbiAqL1xuY29uc3QgQ0xBSU1fU1RBVFVTX0xBQkVMOiBSZWNvcmQ8KHR5cGVvZiBDTEFJTUFCTEVfVEFSR0VUX1NUQVRVU0VTKVtudW1iZXJdLCBzdHJpbmc+ID0ge1xuICBpbl9wcm9ncmVzczogJ0luIFByb2dyZXNzJyxcbiAgd2FpdGluZ19jdXN0b21lcjogJ1dhaXRpbmcgb24gQ3VzdG9tZXInLFxuICB3YWl0aW5nX3N1cHBvcnQ6ICdXYWl0aW5nIG9uIFN1cHBvcnQnLFxufTtcblxuLyoqIFRoZSBwaWNrZXIsIGRlcml2ZWQgZnJvbSB0aGUgc2VhbSdzIHNldC4gTGFiZWxzIGFyZSBwaW5uZWQgdG8gYGNybV9jYXNlLnN0YXR1c2AncyBvd24uICovXG5jb25zdCBDTEFJTV9TVEFUVVNfT1BUSU9OUyA9IENMQUlNQUJMRV9UQVJHRVRfU1RBVFVTRVMubWFwKCh2YWx1ZSkgPT4gKHtcbiAgdmFsdWUsXG4gIGxhYmVsOiBDTEFJTV9TVEFUVVNfTEFCRUxbdmFsdWVdLFxufSkpO1xuXG5leHBvcnQgY29uc3QgQ2xhaW1DYXNlRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2NsYWltX2Nhc2UnLFxuICBsYWJlbDogJ0NsYWltIENhc2UnLFxuICBkZXNjcmlwdGlvbjogJ1Rha2UgYW4gdW5vd25lZCBjYXNlIG91dCBvZiB0cmlhZ2UgYnkgbW92aW5nIGl0IHRvIGEgc3RhdHVzIHRoYXQgbWVhbnMgeW91IGFyZSBvbiBpdC4nLFxuICB0eXBlOiAnc2NyZWVuJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gTG9hZC1iZWFyaW5nLCBub3QgYm9pbGVycGxhdGUgXHUyMDE0IHNlZSB0aGUgaGVhZGVyLiBBIHN5c3RlbSBydW4gY2xhaW1zIG5vYm9keS5cbiAgcnVuQXM6ICd1c2VyJyxcblxuICB2YXJpYWJsZXM6IFtcbiAgICAvLyBNVVNUIGJlIGByZWNvcmRJZGAgXHUyMDE0IHRoZSBjb25zb2xlJ3MgZmxvdy1hY3Rpb24gY29udHJhY3Qgc2VlZHMgb25seSB0aGF0XG4gICAgLy8gbmFtZSAoYW5kIGl0cyBjYW1lbENhc2Ugb2JqZWN0IGFsaWFzKTsgYSBjdXN0b20gbmFtZSBhcnJpdmVzIHVuZGVmaW5lZC5cbiAgICB7IG5hbWU6ICdyZWNvcmRJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAnY2xhaW1TdGF0dXMnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICBdLFxuXG4gIG5vZGVzOiBbXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCcsIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX2Nhc2UnIH0gfSxcbiAgICB7XG4gICAgICBpZDogJ3NjcmVlbl8xJywgdHlwZTogJ3NjcmVlbicsIGxhYmVsOiAnQ2xhaW0gQ2FzZScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ2NsYWltU3RhdHVzJywgbGFiZWw6ICdXb3JraW5nIHN0YXR1cycsIHR5cGU6ICdzZWxlY3QnLCByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJ2luX3Byb2dyZXNzJyxcbiAgICAgICAgICAgIG9wdGlvbnM6IENMQUlNX1NUQVRVU19PUFRJT05TLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gXHUyNkQ0IGBzdGF0dXNgIGlzIHRoZSBPTkxZIGZpZWxkIHRoaXMgbm9kZSBtYXkgZXZlciBjYXJyeS4gQWRkaW5nXG4gICAgICAvLyBgb3duZXJfaWRgIGhlcmUgZG9lcyBub3QgXCJtYWtlIHRoZSBjbGFpbSBleHBsaWNpdFwiIFx1MjAxNCBpdCBtYWtlcyB0aGUgd3JpdGVcbiAgICAgIC8vIHJlZnVzZWQgYnkgdGhlIHRyYW5zZmVyIGdhdGUgYmVmb3JlIGFueSBob29rIHJ1bnMsIGFuZCBpdCB0YWtlc1xuICAgICAgLy8gYGNhc2Vfc2VsZl9jbGFpbWAgb3V0IG9mIHRoZSBwYXRoIG9uIHRoZSBvbmUgY2FsbGVyIGl0IHdvdWxkIHJlYWNoLlxuICAgICAgLy8gVGhlIGd1YXJkIGJlc2lkZSB0aGlzIGZpbGUgZmFpbHMgb24gYW55IHN1Y2ggYWRkaXRpb24uXG4gICAgICBpZDogJ2NsYWltJywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ0NsYWltIENhc2UnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fY2FzZScsXG4gICAgICAgIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZElkYCB9LFxuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBzdGF0dXM6IGNlbGBjbGFpbVN0YXR1c2AsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIHsgaWQ6ICdlMScsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAnc2NyZWVuXzEnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdzY3JlZW5fMScsIHRhcmdldDogJ2NsYWltJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UzJywgc291cmNlOiAnY2xhaW0nLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHMvX2Nhc2UtYXNzaWdubWVudC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL19jYXNlLWFzc2lnbm1lbnQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB0eXBlIHsgSG9va0FwaSB9IGZyb20gJy4uLy4uL3NhbGVzL29iamVjdHMvX2hvb2stYXBpJztcblxuLyoqXG4gKiBcdTI1NTBcdTI1NTBcdTI1NTAgQ2FzZSBvd25lcnNoaXAgYXNzaWdubWVudCBcdTIwMTQgdGhlIGFwcC1sZXZlbCBzdGFuZC1pbiBmb3IgYSBtaXNzaW5nIHF1ZXVlIFx1MjU1MFx1MjU1MFxuICpcbiAqICMgXHUyNkQ0IFRoaXMgbW9kdWxlIGlzIGEgU1RPUEdBUC4gSXQgaXMgdGhlIGNvZGUgdG8gZGVsZXRlLlxuICpcbiAqIFNhbGVzZm9yY2Utc2hhcGVkIGNhc2UgaW50YWtlIHJvdXRlcyBhbiBvd25lcmxlc3MgY2FzZSBpbnRvIGEgUVVFVUUgYW5kIGxldHNcbiAqIGFnZW50cyBwdWxsIGZyb20gaXQuIE9iamVjdFN0YWNrIGhhcyBubyBxdWV1ZSBlbmdpbmU6IGBzeXNfcXVldWVgIGRvZXMgbm90XG4gKiBleGlzdCwgYW5kIHRoZSBgcXVldWVgIHNoYXJpbmctcmVjaXBpZW50IGFuZCBhcHByb3ZlciBlbnVtIG1lbWJlcnMgYXJlXG4gKiBkZXByZWNhdGVkIHVwc3RyZWFtLiBTbyBhIHdlYi10by1jYXNlIHN1Ym1pc3Npb24gXHUyMDE0IHdob3NlIGBvd25lcl9pZGAgaXNcbiAqIGRlbGliZXJhdGVseSBzdHJpcHBlZCBieSB0aGUgZ3Vlc3Qtc2FuaXRpc2F0aW9uIGJyYW5jaCBvZiBgY2FzZV9zbGFfZGVmYXVsdHNgXG4gKiBcdTIwMTQgaGFzIG5vd2hlcmUgdG8gc2l0IGFuZCBsYW5kcyB3aXRoIG5vYm9keSBhY2NvdW50YWJsZSBmb3IgaXQuXG4gKlxuICogVGhpcyBtb2R1bGUgc3Vic3RpdHV0ZXMgYSBsb2FkLWJhbGFuY2VkIHJvdW5kLXJvYmluIGZvciB0aGUgbWlzc2luZyBxdWV1ZSwgYXRcbiAqIHRoZSBhcHAgbGF5ZXIsIHRoZSBzYW1lIHdheSBgbGVhZF9hdXRvX2Fzc2lnbmAgKGBsZWFkLmhvb2sudHNgKSBkb2VzIGZvclxuICogaW5ib3VuZCBsZWFkcy4gKipXaGVuIGEgcGxhdGZvcm0gYHN5c19xdWV1ZWAgb3IgYXNzaWdubWVudC1ydWxlIGVuZ2luZSBsYW5kcyxcbiAqIHRoaXMgd2hvbGUgbW9kdWxlIGlzIHJlY2xhaW1lZCBcdTIwMTQgbm90IGFkYXB0ZWQuKiogSXRzIHJlcGxhY2VtZW50IGlzXG4gKiBkZWNsYXJhdGl2ZSBxdWV1ZSBtZXRhZGF0YTsgYSBob29rIHRoYXQgcGlja3MgYW4gb3duZXIgYnkgY291bnRpbmcgcm93cyBpcyBub3RcbiAqIHNvbWV0aGluZyB0byBrZWVwIGFsb25nc2lkZSBvbmUuIERlbGV0ZSB0aGUgbW9kdWxlLCBkZWxldGUgaXRzIGhvb2tzIGZyb21cbiAqIGBjYXNlLmhvb2sudHNgLCBhbmQgcmUtcG9pbnQgdGhlIHRyaWFnZSB2aWV3IGF0IHRoZSBxdWV1ZS5cbiAqXG4gKiBJdCBpcyBhIE1PRFVMRSByYXRoZXIgdGhhbiBhIGJyYW5jaCBpbiBgY2FzZS5ob29rLnRzYCBzbyB0aGF0IFwid2hvIHNob3VsZCBvd25cbiAqIHRoaXMgY2FzZVwiIGhhcyBPTkUgaG9tZTogYWxsIHRocmVlIGZhY3RvcmllcyBiZWxvdyByZWFkIGEgUE9TSVRJT04gUE9PTCBhbmRcbiAqIHBpY2sgaXRzIGxlYXN0LWxvYWRlZCBob2xkZXIsIGRpZmZlcmluZyBvbmx5IGluIHBvb2wsIHNlYW0gYW5kIHRyaWdnZXIuXG4gKlxuICogIyBcdTI2QTBcdUZFMEYgVGhlIEwyIHNhbmRib3ggY29uc3RyYWludCBcdTIwMTQgdGhlIHNoYXBlIGV2ZXJ5IGhhbmRsZXIgaGVyZSBtdXN0IHRha2VcbiAqXG4gKiBMMiBob29rIGJvZGllcyBydW4gQk9EWS1PTkxZIGluc2lkZSBRdWlja0pTOiB0aGUgaGFuZGxlciBpcyBsb3dlcmVkIHRvIGFcbiAqIHNvdXJjZSBzdHJpbmcgd2l0aCBubyBtb2R1bGUgc2NvcGUsIHNvIGEgYm9keSByZWZlcmVuY2luZyBhbiBpbXBvcnQsIGFcbiAqIHRvcC1sZXZlbCBjb25zdCBvciBhIGZhY3RvcnkgUEFSQU1FVEVSIGlzIGEgYFJlZmVyZW5jZUVycm9yYCBhdCBydW50aW1lLCBub3RcbiAqIGEgY2xvc3VyZS4gYHRlc3QvYWN0aW9uLXNhbmRib3gudGVzdC50c2AgbG93ZXJzIGV2ZXJ5IGhvb2sgaW4gYGFsbEhvb2tzYCB3aXRoXG4gKiB0aGUgQ0xJIGJ1aWxkJ3Mgb3duIGV4dHJhY3Rpb24gcGFzcyBhbmQgZmFpbHMgdGhlIG9uZXMgdGhhdCBsZWFrLlxuICpcbiAqIFNvIHNoYXJpbmcgaGVyZSBpcyBhdXRob3JpbmctdGltZSBzaGFyaW5nOiB0aGUgRkFDVE9SWSBjb21wb3NlcyB0aGUgaG9vayBhbmRcbiAqIG93bnMgdGhlIGRvYywgdGhlIGNvbnN0YW50cyBhbmQgdGhlIGNvbnRyYWN0OyB0aGUgaGFuZGxlciBib2R5IGNsb3NlcyBvdmVyXG4gKiBub3RoaW5nIGJ1dCBpdHMgb3duIGBjdHhgIGFuZCBzcGVsbHMgaXRzIGxpdGVyYWxzIElOTElORS4gVGhlIGR1cGxpY2F0aW9uIGlzXG4gKiBub3QgYWNjaWRlbnRhbCBcdTIwMTQgaXQgaXMgdGhlIG9ubHkgc2hhcGUgdGhlIHJ1bnRpbWUgYWNjZXB0cyBcdTIwMTQgYW5kIHdoYXQga2VlcHMgaXRcbiAqIGhvbmVzdCBpcyBhIGJlaGF2aW91cmFsIHBpbjogYHRlc3QvY2FzZS1hc3NpZ25tZW50LnRlc3QudHNgIGRyaXZlcyB0aGUgcmVhbFxuICogaGFuZGxlciBhbmQgYXNzZXJ0cyB0aGUgcG9vbCBpdCBxdWVyaWVzIGlzIGV4YWN0bHlcbiAqIHtAbGluayBTRVJWSUNFX0FHRU5UX1BPU0lUSU9OfSwgc28gY29uc3RhbnQgYW5kIGxpdGVyYWwgY2Fubm90IGRyaWZ0IHF1aWV0bHkuXG4gKlxuICogIyBcdTI2QTBcdUZFMEYgVGhlIG93bmVyc2hpcC10cmFuc2ZlciBnYXRlICgjMzAwNCksIGFuZCB0aGUgdGhyZWUgZG9vcnMgdGhyb3VnaCBpdFxuICpcbiAqIFN0YW1waW5nIGFub3RoZXIgdXNlcidzIGBvd25lcl9pZGAgaXMgYW4gb3duZXJzaGlwIFRSQU5TRkVSLCBkZW5pZWQgdW5sZXNzXG4gKiB0aGUgY2FsbGVyIGhvbGRzIGBhbGxvd1RyYW5zZmVyYCBvbiB0aGUgb2JqZWN0IChgQG9iamVjdHN0YWNrL3NwZWNgXG4gKiBgc2VjdXJpdHkvcGVybWlzc2lvbi56b2QudHNgKS4gYGNybV9jYXNlLmFsbG93VHJhbnNmZXJgIGlzIE5PVCBncmFudGVkIHRvXG4gKiBgc2VydmljZV9hZ2VudGAsIGFuZCBncmFudGluZyBpdCB3b3VsZCB3aWRlbiB3aGF0IGFuIGFnZW50IG1heSBkbyB0byBhIGNhc2VcbiAqIGdlbmVyYWxseSBcdTIwMTQgYSBwZXJtaXNzaW9uLW1vZGVsIGNoYW5nZSwgbm90IGEgaG9vayBjaGFuZ2UuXG4gKlxuICogVGhlIGdhdGUgaXMgYW4gb3BlcmF0aW9uIG1pZGRsZXdhcmUgd3JhcHBpbmcgdGhlIHdob2xlIGNhbGwsIHNvIHdoYXQgaXQgc2Vlc1xuICogZGVwZW5kcyBlbnRpcmVseSBvbiB0aGUgc2VhbSBhIHdyaXRlIHVzZXMuIE1lYXN1cmVkIGFnYWluc3QgdGhlIGZ1bGwgc2hpcHBlZFxuICogc3RhY2sgKE9iamVjdFFMICsgYHBsdWdpbi1zZWN1cml0eWAgKyBgcGx1Z2luLXNoYXJpbmdgIG92ZXIgdGhpcyBhcHAncyBvd25cbiAqIGBvYmplY3RzdGFjay5jb25maWcudHNgKSwgd2l0aCBuZWdhdGl2ZSBjb250cm9scyBwcm92aW5nIHRoZSBvYnNlcnZhdGlvbnMgYXJlXG4gKiBub3QgdmFjdW91cywgYW5kIHBpbm5lZCBpbiBgdGVzdC9jYXNlLWFzc2lnbm1lbnQudGVzdC50c2AgYW5kXG4gKiBgdGVzdC9vd25lcnNoaXAtbW9kZWwudGVzdC50c2A6XG4gKlxuICogICBcdTI0NjAgQSBgYmVmb3JlSW5zZXJ0YCAvIGBiZWZvcmVVcGRhdGVgIGhvb2sgU1RBTVBJTkcgYG93bmVyX2lkYCBvbnRvIGEgcGF5bG9hZFxuICogICAgICB0aGF0IGRpZCBub3QgY2FycnkgdGhlIGtleSBpcyBJTlZJU0lCTEUgdG8gdGhlIGdhdGUgXHUyMDE0IHRoZSBtaWRkbGV3YXJlXG4gKiAgICAgIG9ic2VydmVzIHRoZSBwYXlsb2FkIGFzIGF1dGhvcmVkLCBhbmQgdGhlIHN0b3JlZCByb3cgY2FycmllcyB0aGUgc3RhbXAuXG4gKiAgICAgIFRoaXMgaXMgdGhlIGRvb3IgYWxsIHRocmVlIGZhY3RvcmllcyBoZXJlIHVzZSwgYW5kIGl0IGlzIHdoeSBub25lIG9mXG4gKiAgICAgIHRoZW0gbmVlZHMgYSBwZXJtaXNzaW9uIGdyYW50LlxuICogICBcdTI0NjEgQSBob29rJ3MgYGN0eC5hcGlgIFdSSVRFIGlzIGEgZnJlc2ggb3BlcmF0aW9uIGNhcnJ5aW5nIHRoZSBjYWxsZXInc1xuICogICAgICBpZGVudGl0eSwgc28gdGhlIGdhdGUgRE9FUyBzZWUgaXQuIFRoYXQgaXMgd2h5IGBjYXNlX3N0YXR1c19zaWRlX2VmZmVjdHNgXG4gKiAgICAgIG9wZW5pbmcgYW4gZXNjYWxhdGlvbiB0YXNrIHVuZGVyIHRoZSBhY2NvdW50IG93bmVyIG5lZWRzXG4gKiAgICAgIGBzZXJ2aWNlX2FnZW50LmNybV90YXNrLmFsbG93VHJhbnNmZXJgLlxuICogICBcdTI0NjIgQSBjYWxsZXItc3VwcGxpZWQgYG93bmVyX2lkYCBpcyByZWZ1c2VkIElOU0lERSB0aGUgbWlkZGxld2FyZSwgdXBzdHJlYW1cbiAqICAgICAgb2YgdGhlIGhvb2sgcGhhc2UgXHUyMDE0IHRoZSBob29rIG5ldmVyIGZpcmVzIGF0IGFsbC4gTm8gaG9vayBjYW4gYXBwcm92ZSxcbiAqICAgICAgbGF1bmRlciBvciBhZGp1ZGljYXRlIGEgcGF5bG9hZCB0aGF0IGNhcnJpZXMgdGhlIGtleS5cbiAqXG4gKiBcdTIxRDIgXCJBbiBhZ2VudCBtYXkgc2V0IGBvd25lcl9pZGAgdG8gdGhlbXNlbHZlc1wiIGlzIG5vdCBpbXBsZW1lbnRhYmxlIGFzIGFuXG4gKiBhZGp1ZGljYXRlZCB3cml0ZS4gSXQgSVMgaW1wbGVtZW50YWJsZSBvbmUgbGV2ZWwgdXAsIGFzIGEgR0VTVFVSRSB0aGUgaG9va1xuICogaW50ZXJwcmV0czoge0BsaW5rIGNyZWF0ZUNhc2VTZWxmQ2xhaW19LlxuICpcbiAqIFx1MjZBMFx1RkUwRiBJZiBhIHBsYXRmb3JtIHJlbGVhc2UgbW92ZXMgdGhlIGdhdGUgZG93bnN0cmVhbSBvZiB0aGUgaG9vayBwaGFzZSwgZG9vciBcdTI0NjBcbiAqIGZsaXBzIGFuZCB0aG9zZSB0ZXN0cyBnbyByZWQuIFRoZSBzaWduYWwgaXMgdGhlbiB0byBncmFudCBgYWxsb3dUcmFuc2ZlcmBcbiAqIGRlbGliZXJhdGVseSBvciB0byBzdG9wIGFzc2lnbmluZyBpbiBhIGhvb2sgXHUyMDE0IE5PVCB0byB3aWRlbiB0aGUgcGVybWlzc2lvblxuICogbW9kZWwgdG8gbWFrZSBhIHJlZCB0ZXN0IGdyZWVuLlxuICovXG5cbi8qKiBUaGUgcG9zaXRpb24gd2hvc2UgaG9sZGVycyBmb3JtIHRoZSBjYXNlIGludGFrZSBwb29sIChgc3lzX3VzZXJfcG9zaXRpb25gKS4gKi9cbmV4cG9ydCBjb25zdCBTRVJWSUNFX0FHRU5UX1BPU0lUSU9OID0gJ3NlcnZpY2VfYWdlbnQnO1xuXG4vKiogVGhlIHBvc2l0aW9uIEVTQ0FMQVRFRCBjYXNlcyBhcmUgcm91dGVkIHRvLiAqL1xuZXhwb3J0IGNvbnN0IFNFUlZJQ0VfTUFOQUdFUl9QT1NJVElPTiA9ICdzZXJ2aWNlX21hbmFnZXInO1xuXG4vKipcbiAqIFN0YXR1c2VzIHRoYXQgbWVhbiBcInRoaXMgY2FzZSBpcyBubyBsb25nZXIgbGl2ZSB3b3JrXCIuXG4gKlxuICogTG9hZCBiYWxhbmNpbmcgY291bnRzIE9QRU4gY2FzZXMsIGFuZCBgaXNfY2xvc2VkYCBpcyB0aGUgd3JvbmcgcHJlZGljYXRlOlxuICogaXQgb25seSBmbGlwcyBvbiBgY2xvc2VkYCwgc28gYSBwaWxlIG9mIGByZXNvbHZlZGAgY2FzZXMgd291bGQga2VlcCBjb3VudGluZ1xuICogYWdhaW5zdCBhbiBhZ2VudCB3aG8gaGFzIGFscmVhZHkgZmluaXNoZWQgdGhlbS4gYGNhc2Vfc2xhX21vbml0b3JgIHNldHRsZXMgaXRcbiAqIHRoZSBzYW1lIHdheSBcdTIwMTQgc2VlIHRoZSBgJG5pbmAgbm90ZSBpbiBgc3JjL3NlcnZpY2UvZmxvd3MvY2FzZS1zbGEtbW9uaXRvci5mbG93LnRzYCxcbiAqIHdoaWNoIGFsc28gcmVjb3JkcyB0aGF0IGNvbXBhcmluZyB0aGUgYm9vbGVhbiBgaXNfY2xvc2VkYCB3YWxrcyBpbnRvIHRoZVxuICogU1FMaXRlIGAxICE9IHRydWVgIHRyYXAuXG4gKi9cbmV4cG9ydCBjb25zdCBDTE9TRURfQ0FTRV9TVEFUVVNFUyA9IFsncmVzb2x2ZWQnLCAnY2xvc2VkJ10gYXMgY29uc3Q7XG5cbi8qKiBDYXAgb24gdGhlIHBvb2wgcmVhZCBcdTIwMTQgdGhlIHNhbWUgYm91bmQgYGxlYWRfYXV0b19hc3NpZ25gIHVzZXMuICovXG5leHBvcnQgY29uc3QgUE9PTF9RVUVSWV9MSU1JVCA9IDEwMDA7XG5cbi8qKlxuICogVGhlIHN0YXR1c2VzIHRoYXQgbWVhbiBcImEgaHVtYW4gaGFzIHBpY2tlZCB0aGlzIGNhc2UgdXAgYW5kIGl0IGlzIG5vdFxuICogZmluaXNoZWRcIiBcdTIwMTQgdGhlIGdlc3R1cmUge0BsaW5rIGNyZWF0ZUNhc2VTZWxmQ2xhaW19IHJlYWRzIGFzIGEgY2xhaW0uXG4gKlxuICogT25lIGNvbmNlcHQsIG5vdCB0aHJlZSBhcmJpdHJhcnkgcGlja3M6IGVhY2ggc2F5cyBhIHBlcnNvbiBpcyBlbmdhZ2VkIGFuZCB0aGVcbiAqIHdvcmsgaXMgc3RpbGwgbGl2ZS4gVGhlIGZvdXIgc3RhdHVzZXMgTk9UIGhlcmUgYXJlIGV4Y2x1ZGVkIGZvciBhIHJlYXNvblxuICogYXBpZWNlOlxuICpcbiAqICAgLSBgbmV3YCBcdTIwMTQgdGhlIHN0YXRlIGEgdHJpYWdlIHJvdyBpcyBhbHJlYWR5IElOLiBOb3QgYSBtb3ZlLCBzbyBub3QgYSBjbGFpbS5cbiAqICAgLSBgZXNjYWxhdGVkYCBcdTIwMTQge0BsaW5rIGNyZWF0ZUNhc2VFc2NhbGF0aW9uUmVhc3NpZ259IG93bnMgdGhhdCB0cmFuc2l0aW9uXG4gKiAgICAgYW5kIHJvdXRlcyB0byB0aGUgYHNlcnZpY2VfbWFuYWdlcmAgcG9vbC4gVHdvIGhvb2tzIGFuc3dlcmluZyBcIndobyBvd25zXG4gKiAgICAgdGhpcyBjYXNlXCIgZm9yIG9uZSBzdGF0dXMgY2hhbmdlIGlzIHRoZSBcIm9uZSBvcGVyYXRpb24sIHR3b1xuICogICAgIGltcGxlbWVudGF0aW9uc1wiIHNoYXBlIHRoaXMgbW9kdWxlIGV4aXN0cyB0byBwcmV2ZW50LlxuICogICAtIGByZXNvbHZlZGAgLyBgY2xvc2VkYCBcdTIwMTQgZmluaXNoaW5nIGEgY2FzZSBpcyBub3QgcGlja2luZyBpdCB1cC4gQW4gYWdlbnRcbiAqICAgICBtYXkgc3RpbGwgcmVzb2x2ZSBhbiB1bm93bmVkIGNhc2Ugc3RyYWlnaHQgb3V0IG9mIHRyaWFnZSAodGhlIHNoYXJlXG4gKiAgICAgZ3JhbnRzIGVkaXQpOyB0aGF0IHJlY29yZHMgdGhlbSBpbiBgdXBkYXRlZF9ieWAgYW5kIGxlYXZlcyB0aGUgb3duZXJzaGlwXG4gKiAgICAgY29sdW1uIGhvbmVzdCBhYm91dCB0aGUgZmFjdCB0aGF0IG5vYm9keSBldmVyIHRvb2sgdGhlIHdvcmsuXG4gKlxuICogXHUyNkEwXHVGRTBGIERlY2xhcmVkIGhlcmUgZm9yIHRoZSBkb2MgYW5kIHRoZSB0ZXN0cyBcdTIwMTQgdGhlIGhhbmRsZXIgYm9keSBzcGVsbHMgdGhlIHNhbWVcbiAqIHRocmVlIHN0cmluZ3MgSU5MSU5FLCBiZWNhdXNlIHRoZSBMMiBzYW5kYm94IGdpdmVzIGl0IG5vIG1vZHVsZSBzY29wZSAoc2VlXG4gKiB0aGlzIGZpbGUncyBoZWFkZXIpLiBgdGVzdC91bmFzc2lnbmVkLWNhc2UtdHJpYWdlLXJlYWNoLnRlc3QudHNgIGRyaXZlcyBldmVyeVxuICogb25lIG9mIHRoZW0gdGhyb3VnaCB0aGUgcmVhbCBlbmdpbmUsIHNvIHRoZSBjb3BpZXMgY2Fubm90IGRyaWZ0LlxuICovXG5leHBvcnQgY29uc3QgQ0xBSU1BQkxFX1RBUkdFVF9TVEFUVVNFUyA9IFtcbiAgJ2luX3Byb2dyZXNzJyxcbiAgJ3dhaXRpbmdfY3VzdG9tZXInLFxuICAnd2FpdGluZ19zdXBwb3J0Jyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogUm91bmQtcm9iaW4gYXNzaWdubWVudCBmb3Igb3duZXJsZXNzIG5ldyBjYXNlcy5cbiAqXG4gKiBBIGNhc2UgY3JlYXRlZCB3aXRob3V0IGFuIG93bmVyIFx1MjAxNCBhIHdlYi10by1jYXNlIHN1Ym1pc3Npb24sIGFuIGVtYWlsLXRvLWNhc2VcbiAqIGltcG9ydCwgYW4gQVBJIGNhcHR1cmUgXHUyMDE0IGlzIGFzc2lnbmVkIHRvIHRoZSBzZXJ2aWNlIGFnZW50IHdpdGggdGhlIEZFV0VTVFxuICogT1BFTiBjYXNlcy4gTGVhc3QtbG9hZGVkIGlzIGEgc2VsZi1iYWxhbmNpbmcgcm91bmQtcm9iaW46IG5vIHJvdGF0aW9uXG4gKiBjb3VudGVyLCBubyBzdG9yZWQgY3Vyc29yLCBubyBjb29yZGluYXRpb24gYmV0d2VlbiBjb25jdXJyZW50IGluc2VydHMuIEl0XG4gKiB3cml0ZXMgYG93bmVyX2lkYCwgdGhlIHBsYXRmb3JtIG93bmVyc2hpcCBhbmNob3IgdGhhdCBPV0QsIHNoYXJpbmcgcnVsZXMgYW5kXG4gKiB0aGUgXCJNeSBPcGVuIENhc2VzXCIgdmlldyBhbGwgcmVhZCwgc28gdGhlIGFnZW50IHJlYWxseSBvd25zIHRoZSBjYXNlIHJhdGhlclxuICogdGhhbiBtZXJlbHkgYmVpbmcgbmFtZWQgb24gaXQuXG4gKlxuICogIyMgUHJpb3JpdHkgMjUwOiBpdCBNVVNUIHJ1biBhZnRlciBgY2FzZV9zbGFfZGVmYXVsdHNgICgyMDApXG4gKlxuICogSG9va3MgcnVuIGluIEFTQ0VORElORyBwcmlvcml0eSBvcmRlciwgYW5kIGBjYXNlX3NsYV9kZWZhdWx0c2AgaXMgd2hlcmUgdGhlXG4gKiBndWVzdC1zYW5pdGlzYXRpb24gYnJhbmNoIGFzc2lnbnMgYGlucHV0Lm93bmVyX2lkID0gbnVsbGAgdG8gZHJvcCBhXG4gKiBjbGllbnQtc3Bvb2ZlZCBvd25lciBmcm9tIGFuIGFub255bW91cyBzdWJtaXNzaW9uLiBBc3NpZ25pbmcgZmlyc3QgYW5kIGJlaW5nXG4gKiBzdHJpcHBlZCBhZnRlcndhcmRzIHdvdWxkIGxhbmQgZXZlcnkgd2ViLXRvLWNhc2Ugb3duZXJsZXNzIFx1MjAxNCB0aGUgZXhhY3QgY2FzZVxuICogdGhpcyBob29rIGV4aXN0cyBmb3IuIGB0ZXN0L2Nhc2UtYXNzaWdubWVudC50ZXN0LnRzYCBwaW5zIHRoZSBvcmRlcmluZy5cbiAqXG4gKiAjIyBUaGUgZW1wdHkgcG9vbCBpcyB0aGUgRklSU1QtSU5TVEFMTCBOT1JNLCBub3QgYW4gZWRnZSBjYXNlXG4gKlxuICogYHN5c191c2VyX3Bvc2l0aW9uYCBtZW1iZXJzaGlwIGlzIHJ1bnRpbWUgZGF0YS4gQmVmb3JlIGFueW9uZSBob2xkcyB0aGVcbiAqIGBzZXJ2aWNlX2FnZW50YCBwb3NpdGlvbiB0aGUgcG9vbCBpcyBlbXB0eSBhbmQgdGhpcyBob29rIGlzIGEgTk8tT1A6IHRoZSBjYXNlXG4gKiBpcyBjcmVhdGVkIGFuZCBzdGF5cyBvd25lcmxlc3MuIE5ldmVyIGJsb2NraW5nIGludGFrZSBpcyBjb3JyZWN0LCBidXQgc2lsZW50XG4gKiBvd25lcmxlc3NuZXNzIGhpZGVzIHRoZSBwcm9ibGVtLCBzbyB0aGUgbm8tb3AgcGF0aCBoYXMgYSBVSSBjb3VudGVycGFydCBcdTIwMTQgdGhlXG4gKiBgdW5hc3NpZ25lZF90cmlhZ2VgIHBpbm5lZCB0YWIgb24gYGNybV9jYXNlYCAoYHNyYy9zZXJ2aWNlL3ZpZXdzL2Nhc2Uudmlldy50c2ApIHNob3dzXG4gKiBleGFjdGx5IHRoZSBjYXNlcyB0aGlzIGhvb2sgY291bGQgbm90IHBsYWNlLlxuICpcbiAqICMjIEJlc3QtZWZmb3J0LCBhbHdheXNcbiAqXG4gKiBBdXRvLWFzc2lnbm1lbnQgaXMgYW4gRU5IQU5DRU1FTlQgYW5kIG11c3QgbmV2ZXIgcmVqZWN0IHRoZSBpbnNlcnQuIEFuXG4gKiBhbm9ueW1vdXMgV2ViLXRvLUNhc2Ugc3VibWlzc2lvbiBydW5zIHVuZGVyIHRoZSBwdWJsaWMtZm9ybSBncmFudCwgd2hpY2hcbiAqIHBlcm1pdHMgY3JlYXRlL3JlYWQtYmFjayBvbiBgY3JtX2Nhc2VgIGFuZCBERU5JRVMgYGZpbmRgIG9uXG4gKiBgc3lzX3VzZXJfcG9zaXRpb25gOyBsZXR0aW5nIHRoYXQgZGVuaWFsIHByb3BhZ2F0ZSB3b3VsZCA0MDMgdGhlIHdob2xlXG4gKiBzdWJtaXNzaW9uIGFuZCBicmVhayB0aGUgcHVibGljIHN1cHBvcnQgZm9ybS4gU28gZXZlcnkgcmVhZCBpcyB3cmFwcGVkIGFuZFxuICogQU5ZIGZhaWx1cmUgbGVhdmVzIHRoZSBjYXNlIG93bmVybGVzcyBmb3IgdGhlIHRyaWFnZSB2aWV3IHRvIHN1cmZhY2UuXG4gKlxuICogQHBhcmFtIGhvb2tOYW1lIHJlZ2lzdHJ5IG5hbWUgZm9yIHRoZSBob29rIChtZXRhZGF0YSBvbmx5IFx1MjAxNCBuZXZlciByZWFkIGJ5XG4gKiAgIHRoZSBib2R5LCB3aGljaCB0aGUgc2FuZGJveCB3b3VsZCBub3QgbGV0IGl0IGJlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNhc2VSb3VuZFJvYmluQXNzaWduKGhvb2tOYW1lID0gJ2Nhc2VfYXV0b19hc3NpZ24nKTogSG9vayB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogaG9va05hbWUsXG4gICAgb2JqZWN0OiAnY3JtX2Nhc2UnLFxuICAgIGV2ZW50czogWydiZWZvcmVJbnNlcnQnXSxcbiAgICBwcmlvcml0eTogMjUwLFxuICAgIGRlc2NyaXB0aW9uOiAnQXNzaWduIG93bmVybGVzcyBuZXcgY2FzZXMgdG8gdGhlIGxlYXN0LWxvYWRlZCBzZXJ2aWNlIGFnZW50LicsXG4gICAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICAgIC8vIFJlc3BlY3QgYW4gZXhwbGljaXQgLyBjcmVhdG9yLWFzc2lnbmVkIG93bmVyLiBPbiBhbnkgd3JpdGUgdGhhdCBjYXJyaWVzXG4gICAgICAvLyBhIHVzZXIgdGhlIHNlY3VyaXR5IG1pZGRsZXdhcmUgaGFzIEFMUkVBRFkgc3RhbXBlZCBgb3duZXJfaWRgIHRvIHRoYXRcbiAgICAgIC8vIHVzZXIgYnkgdGhlIHRpbWUgdGhpcyBydW5zLCBzbyB0aGlzIGlzIGFsc28gd2hhdCBrZWVwcyB0aGUgcm91bmQtcm9iaW5cbiAgICAgIC8vIHNjb3BlZCB0byBnZW51aW5lbHkgb3duZXJsZXNzIGludGFrZSByYXRoZXIgdGhhbiBmaXJpbmcgb24gZXZlcnlcbiAgICAgIC8vIGFnZW50LWNyZWF0ZWQgY2FzZS5cbiAgICAgIGlmICh0eXBlb2YgaW5wdXQub3duZXJfaWQgPT09ICdzdHJpbmcnICYmIGlucHV0Lm93bmVyX2lkKSByZXR1cm47XG4gICAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWFwaSkgcmV0dXJuO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGUgcG9vbCA9IGhvbGRlcnMgb2YgdGhlIGBzZXJ2aWNlX2FnZW50YCBwb3NpdGlvbi4gVGhpcyBsaXRlcmFsIGlzXG4gICAgICAgIC8vIHRoZSBleHBvcnRlZCBTRVJWSUNFX0FHRU5UX1BPU0lUSU9OOyB0aGUgc2FuZGJveCBmb3JiaWRzIHJlYWRpbmcgdGhlXG4gICAgICAgIC8vIGNvbnN0YW50IGhlcmUsIGFuZCBgdGVzdC9jYXNlLWFzc2lnbm1lbnQudGVzdC50c2AgcGlucyB0aGUgcGFyaXR5LlxuICAgICAgICBjb25zdCBob2xkZXJzID0gYXdhaXQgYXBpLm9iamVjdCgnc3lzX3VzZXJfcG9zaXRpb24nKS5maW5kKHtcbiAgICAgICAgICB3aGVyZTogeyBwb3NpdGlvbjogJ3NlcnZpY2VfYWdlbnQnIH0sIGZpZWxkczogWyd1c2VyX2lkJ10sIHRvcDogMTAwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGFnZW50SWRzID0gQXJyYXkuZnJvbShcbiAgICAgICAgICBuZXcgU2V0KFxuICAgICAgICAgICAgKGhvbGRlcnMgPz8gW10pXG4gICAgICAgICAgICAgIC5tYXAoKHIpID0+ICh0eXBlb2Ygci51c2VyX2lkID09PSAnc3RyaW5nJyA/IHIudXNlcl9pZCA6ICcnKSlcbiAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICAvLyBObyBwb29sIFx1MjE5MiBsZWF2ZSB0aGUgY2FzZSBvd25lcmxlc3MgKG5vLW9wKS4gVGhlIGB1bmFzc2lnbmVkX3RyaWFnZWBcbiAgICAgICAgLy8gdmlldyBpcyB3aGF0IG1ha2VzIHRoaXMgdmlzaWJsZSBpbnN0ZWFkIG9mIHNpbGVudC5cbiAgICAgICAgaWYgKGFnZW50SWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIEZld2VzdCBPUEVOIGNhc2VzIHdpbnMuIGAkbmluYCBvdmVyIHN0YXR1c2VzIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIGBpc19jbG9zZWQ6IGZhbHNlYDogYSByZXNvbHZlZCBjYXNlIGlzIGZpbmlzaGVkIHdvcmsgYW5kIG11c3Qgc3RvcFxuICAgICAgICAvLyBjb3VudGluZyBhZ2FpbnN0IGl0cyBhZ2VudCAoc2FtZSBwcmVkaWNhdGUgYXMgYGNhc2Vfc2xhX21vbml0b3JgKS5cbiAgICAgICAgbGV0IGJlc3Q6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGJlc3RDb3VudCA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGNvbnN0IGFnZW50SWQgb2YgYWdlbnRJZHMpIHtcbiAgICAgICAgICBjb25zdCBvcGVuQ291bnQgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fY2FzZScpLmNvdW50KHtcbiAgICAgICAgICAgIHdoZXJlOiB7IG93bmVyX2lkOiBhZ2VudElkLCBzdGF0dXM6IHsgJG5pbjogWydyZXNvbHZlZCcsICdjbG9zZWQnXSB9IH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKG9wZW5Db3VudCA8IGJlc3RDb3VudCkge1xuICAgICAgICAgICAgYmVzdENvdW50ID0gb3BlbkNvdW50O1xuICAgICAgICAgICAgYmVzdCA9IGFnZW50SWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiZXN0KSBpbnB1dC5vd25lcl9pZCA9IGJlc3Q7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU3dhbGxvdzogYXNzaWdubWVudCBtdXN0IG5ldmVyIGJsb2NrIGNhc2UgY3JlYXRpb24uIFRoZSBjb21tb24gY2FzZVxuICAgICAgICAvLyBpcyB0aGUgYW5vbnltb3VzIHB1YmxpYy1mb3JtIGNvbnRleHQsIHdoaWNoIGNhbm5vdCByZWFkXG4gICAgICAgIC8vIGBzeXNfdXNlcl9wb3NpdGlvbmAgXHUyMDE0IHRoZSBjYXNlIGlzIHN0aWxsIGNhcHR1cmVkLCBvd25lcmxlc3MsIGFuZCB0aGVcbiAgICAgICAgLy8gdHJpYWdlIHZpZXcgc3VyZmFjZXMgaXQuIChObyBgY29uc29sZWAgaGVyZSBcdTIwMTQgdGhlIEwyIGhvb2sgc2FuZGJveFxuICAgICAgICAvLyBkb2VzIG5vdCBkZWZpbmUgb25lLilcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEhhbmQgYW4gZXNjYWxhdGluZyBjYXNlIHRvIHRoZSBsZWFzdC1sb2FkZWQgc2VydmljZSBtYW5hZ2VyLlxuICpcbiAqIE9uIHRoZSBlc2NhbGF0aW9uIFRSQU5TSVRJT04gdGhlIGNhc2UgbW92ZXMgdG8gdGhlIGhvbGRlciBvZlxuICoge0BsaW5rIFNFUlZJQ0VfTUFOQUdFUl9QT1NJVElPTn0gd2l0aCB0aGUgZmV3ZXN0IG9wZW4gY2FzZXMgXHUyMDE0IHRoZSBzYW1lXG4gKiBsZWFzdC1sb2FkZWQgYmFsYW5jZSB0aGUgaW50YWtlIHJvdW5kLXJvYmluIGNvbXB1dGVzLCBhZ2FpbnN0IGEgZGlmZmVyZW50XG4gKiBwb29sLiBXaXRob3V0IGl0LCBlc2NhbGF0aW9uIGlzIG9ubHkgYSBmbGFnLCBhIHN0YXR1cyBhbmQgYW4gaW5ib3ggbWVzc2FnZTpcbiAqIHRoZSBhZ2VudCB3aG8gY291bGQgbm90IGdldCB0byB0aGUgY2FzZSBpbiB0aW1lIHN0YXlzIHRoZSBvbmx5IHBlcnNvbiB3aG8gY2FuXG4gKiB3b3JrIGl0LlxuICpcbiAqIFx1MjZBMFx1RkUwRiBQb3NpdGlvbnMgYXJlIEZMQVQgKGBzcmMvc2FsZXMvc2hhcmluZy9wb3NpdGlvbnMudHNgKSwgc28gXCJ0aGUgb3duZXIncyBtYW5hZ2VyXCJcbiAqIGlzIG5vdCByZXNvbHZhYmxlIGluIHRoaXMgYXBwIFx1MjAxNCBhbmQgYSBmbG93IHRlbXBsYXRlIHJlZmVyZW5jaW5nIGEgbG9va3VwXG4gKiB0cmF2ZXJzYWwgc3VjaCBhcyBge2Nhc2VSZWNvcmQub3duZXJfaWQubWFuYWdlcn1gIGludGVycG9sYXRlcyB0byB0aGUgbGl0ZXJhbFxuICogc3RyaW5nIGB1bmRlZmluZWRgIHJhdGhlciB0aGFuIGZhaWxpbmcuIFRoYXQgaXMgd2h5IHRoZSBoYW5kLW9mZiBpcyBhIGhvb2tcbiAqIGFuZCBub3QgYSBmbG93LCBhbmQgd2h5IHRoZSBwb29sIHN1YnN0aXR1dGVzIGZvciB0aGUgY2hhaW4uXG4gKlxuICogIyMgYGJlZm9yZVVwZGF0ZWAsIG5vdCBgYWZ0ZXJVcGRhdGVgXG4gKlxuICogVGhlIGBhZnRlclVwZGF0ZWAgc2hhcGUgKGEgYGN0eC5hcGlgIHdyaXRlKSBpcyBhIGZyZXNoIG9wZXJhdGlvbiBhbmQgaXNcbiAqIHRoZXJlZm9yZSBWSVNJQkxFIHRvIHRoZSB0cmFuc2ZlciBnYXRlIFx1MjAxNCBpdCB3b3VsZCBuZWVkIGBjcm1fY2FzZS5hbGxvd1RyYW5zZmVyYFxuICogb24gYHNlcnZpY2VfYWdlbnRgLCB3aWRlbmluZyB3aGF0IGFuIGFnZW50IG1heSBkbyB0byBhIGNhc2UgZ2VuZXJhbGx5LiBUaGVcbiAqIGBiZWZvcmVVcGRhdGVgIGRvb3IgaXMgaW52aXNpYmxlIHRvIHRoZSBnYXRlICh0aGlzIG1vZHVsZSdzIGhlYWRlciwgZG9vciBcdTI0NjApLFxuICogc28gdGhlIGhhbmQtb2ZmIGNvc3RzIG5vIHBlcm1pc3Npb24gY2hhbmdlLlxuICpcbiAqIEl0IGFsc28gZGlzcG9zZXMgb2YgcmUtZW50cmFuY3kgcmF0aGVyIHRoYW4gZ3VhcmRpbmcgaXQ6IHRoZSBob29rIHBlcmZvcm1zIE5PXG4gKiBvcGVyYXRpb24sIG11dGF0aW5nIHRoZSBwYXlsb2FkIG9mIHRoZSB1cGRhdGUgYWxyZWFkeSBpbiBmbGlnaHQsIHNvIHRoZXJlIGlzXG4gKiBubyBzZWNvbmQgd3JpdGUgYW5kIG5vIHNlY29uZCBgcmVjb3JkLWFmdGVyLXVwZGF0ZWAgZXZlbnQgZm9yXG4gKiBgY2FzZV9lc2NhbGF0aW9uYCBvciBgY2FzZV9zdGF0dXNfc2lkZV9lZmZlY3RzYCB0byBmaXJlIG9uLiBUaGUgcHJlZGljYXRlIGlzXG4gKiBhIFRSQU5TSVRJT04gcmF0aGVyIHRoYW4gYSBzdGF0ZSwgc28gaXQgaXMgZmFsc2Ugb24gYSByZXBsYXksIGFuZCB0aGUgd3JpdGVcbiAqIGlzIGlkZW1wb3RlbnQgXHUyMDE0IGEgY2FzZSBhbHJlYWR5IG93bmVkIGJ5IGEgcG9vbCBtZW1iZXIgaXMgbGVmdCBhbG9uZS5cbiAqIGB0ZXN0L2Nhc2UtYXNzaWdubWVudC50ZXN0LnRzYCBkcml2ZXMgYWxsIHRocmVlIHByb3BlcnRpZXMuXG4gKlxuICogIyMgVGhlIFNMQSBzd2VlcCByZWFjaGVzIHRoaXMgaG9vaywgYW5kIGRlcGVuZHMgb24gaXQgKCMxNDA1KVxuICpcbiAqIGBjYXNlX3NsYV9tb25pdG9yYCdzIGBmbGFnX2JyZWFjaGAgbm9kZSB3cml0ZXMgYHN0YXR1czogJ2VzY2FsYXRlZCdgIG9uIGV2ZXJ5XG4gKiBicmVhY2hlZCBjYXNlLCB3aGljaCBJUyB0aGUgdHJhbnNpdGlvbiBiZWxvdyBcdTIwMTQgc28gdGhlIHNjaGVkdWxlZCBzd2VlcCBwdXRzIGFuXG4gKiBvd25lcmxlc3MgYnJlYWNoZWQgY2FzZSB0aHJvdWdoIHRoaXMgYXNzaWdubWVudCB3aXRob3V0IGFueSBmbG93LWNhbGxhYmxlXG4gKiBzZWFtLCBhbmQgdGhlIGZsb3cgdGhlbiByZS1yZWFkcyB0aGUgY2FzZSAoYHJlbG9hZF9jYXNlYCkgdG8gYWxlcnQgdGhlIG93bmVyXG4gKiB0aGlzIGhvb2sgcHJvZHVjZWQuIFx1MjZBMFx1RkUwRiBUaGF0IG1ha2VzIHRoZSBUUkFOU0lUSU9OIHByZWRpY2F0ZSBsb2FkLWJlYXJpbmcgZm9yIGFcbiAqIHNlY29uZCBjYWxsZXI6IG5hcnJvd2luZyBpdCB0byByZWNvcmQtdHJpZ2dlcmVkIGVzY2FsYXRpb25zLCBvciBtb3ZpbmcgdGhlXG4gKiBhc3NpZ25tZW50IHRvIGFuIGBhZnRlclVwZGF0ZWAgd3JpdGUsIHNpbGVudGx5IHJldHVybnMgdGhlIHN3ZWVwIHRvIGFsZXJ0aW5nXG4gKiBub2JvZHkgZm9yIGFuIHVub3duZWQgYnJlYWNoLiBgdGVzdC9mbG93LXNsYS1vd25lcmxlc3MtYXNzaWdubWVudC50ZXN0LnRzYFxuICogZHJpdmVzIHRoZSByZWFsIGZsb3cgdGhyb3VnaCB0aGUgcmVhbCBob29rIGNoYWluIGFuZCBnb2VzIHJlZCBpZiBpdCBkb2VzLlxuICpcbiAqICMjIFRoZSBlbXB0eSBwb29sOiBhIG5vLW9wIHRoYXQgaXMgc3RpbGwgVklTSUJMRVxuICpcbiAqIGBzeXNfdXNlcl9wb3NpdGlvbmAgbWVtYmVyc2hpcCBpcyBydW50aW1lIGRhdGEsIGFuZCBgc2VydmljZV9tYW5hZ2VyYCBpc1xuICogdW5zdGFmZmVkIG9uIGEgZnJlc2ggaW5zdGFsbC4gXHUyNkEwXHVGRTBGIFRoZSBkZW1vIG9yZyBpcyBOTyBMT05HRVIgb25lIG9mIHRob3NlOiAjMTEwMlxuICogc3RhZmZzIFRvbWFzIE9rYWZvciBpbnRvIHRoZSBwb3NpdGlvbiAoYHNyYy9zYWxlcy9zaGFyaW5nL2RlbW8tc3RhZmZpbmcudHNgKSwgc28gdGhlXG4gKiBleGVtcGxhciBub3cgZGVtb25zdHJhdGVzIHRoZSBoYW5kLW9mZiByYXRoZXIgdGhhbiB0aGUgc3RhbmQtZG93biBcdTIwMTQgd2hpY2ggaXNcbiAqIGFsc28gd2hhdCBtYWtlcyB0aGUgc3dlZXAncyBhc3NpZ25tZW50IHZpc2libGUgb24gdGhpcyByZXBvJ3Mgb3duIHNlZWQuXG4gKlxuICogV2l0aCBubyBwb29sIHRoZSBjYXNlIGtlZXBzXG4gKiBpdHMgb3duZXIgYW5kIHRoZSBlc2NhbGF0aW9uIGNvbXBsZXRlcyBhcyBiZWZvcmUuIFVubGlrZSB0aGUgaW50YWtlIHBhdGggdGhhdFxuICogbmVlZHMgbm8gbmV3IHN1cmZhY2UgdG8gc3RheSB2aXNpYmxlOiBhbiBlc2NhbGF0ZWQgY2FzZSBpcyBub3Qgb3duZXJsZXNzLCBpdFxuICogc2l0cyBpbiB0aGUgYGVzY2FsYXRlZF9jYXNlc2AgdmlldywgYW5kIGBjYXNlX2VzY2FsYXRpb25fc2hhcmluZ2AgYWxyZWFkeVxuICogZ3JhbnRzIGV2ZXJ5IGBzZXJ2aWNlX21hbmFnZXJgIGVkaXQgYWNjZXNzIHRvIG9wZW4gY3JpdGljYWwgY2FzZXMuXG4gKlxuICogIyMgQmVzdC1lZmZvcnQsIGFsd2F5c1xuICpcbiAqIFJlYXNzaWdubWVudCBpcyBhbiBFTkhBTkNFTUVOVCB0byB0aGUgZXNjYWxhdGlvbiwgbmV2ZXIgYSBwcmVjb25kaXRpb24uIEFcbiAqIHJlYWQgZGVuaWFsLCBhbiBlbXB0eSBwb29sIG9yIGFueSBvdGhlciBmYWlsdXJlIGxlYXZlcyB0aGUgY2FzZSB3aXRoIGl0c1xuICogY3VycmVudCBvd25lciBhbmQgbGV0cyB0aGUgZXNjYWxhdGlvbiB3cml0ZSB0aHJvdWdoIHVudG91Y2hlZC5cbiAqXG4gKiAjIyBgcnVuQXM6ICdzeXN0ZW0nYCAoIzIwMTQpLCBhbmQgdGhlIG9yZ2FuaXphdGlvbiBwaW5cbiAqXG4gKiBUaGUgcG9vbCBpcyBgc3lzX3VzZXJfcG9zaXRpb25gLCB3aGljaCBhIHNlcnZpY2UgYWdlbnQgbWF5IG5vdCByZWFkIFx1MjAxNCBzbyBhblxuICogYWdlbnQgZXNjYWxhdGluZyB0aGVpciBvd24gY2FzZSAodGhlIHJlY29yZCBmb3JtLCBvciB0aGUgYGVzY2FsYXRlX2Nhc2VgXG4gKiBhY3Rpb24sIHdob3NlIGBlc2NhbGF0ZWAgbm9kZSBkZWxpYmVyYXRlbHkga2VlcHMgdGhlIHN0YXR1cyB3cml0ZSBpbiB0aGVcbiAqIGFjdGluZyB1c2VyJ3MgY29udGV4dCkgd2FzIHJlZnVzZWQgdGhlIHJlYWQsIHN0b29kIGRvd24sIGFuZCB0aGUgY2FzZSBzdGF5ZWRcbiAqIHdpdGggdGhlIGFnZW50IHdobyBjb3VsZCBub3QgZ2V0IHRvIGl0OyBvbmx5IHRoZSBTTEEgc3dlZXAncyBzeXN0ZW0gd3JpdGVcbiAqIHJlYWNoZWQgdGhlIHBvb2wuIENob29zaW5nIHRoZSBlc2NhbGF0aW9uIGRlc2sgaXMgdGhlIGJ1c2luZXNzJ3Mgcm91dGluZywgbm90XG4gKiB0aGUgYWdlbnQncyBwcml2aWxlZ2UsIHNvIHRoZSBob29rIGVsZXZhdGVzLiBXaGF0IGVsZXZhdGlvbiByZWFjaGVzIGlzIHRoZVxuICogdHdvIFJFQURTOiB0aGUgaG9vayBzdGlsbCBpc3N1ZXMgbm8gd3JpdGUgb2YgaXRzIG93biAoZG9vciBcdTI0NjAgYWJvdmUpLCBzbyBpdFxuICogbmVlZHMgbm8gdHJhbnNmZXIgZ3JhbnQgYW5kIG1vdmVzIG5vdGhpbmcgdGhlIGVzY2FsYXRpb24gd3JpdGUgaXMgbm90XG4gKiBhbHJlYWR5IG1vdmluZy5cbiAqXG4gKiBBR0VOVFMubWQgcnVsZSAxMDogdGhlIHBvb2wgYW5kIHRoZSBsb2FkIGNvdW50cyBhcmUgb3JnYW5pemF0aW9uLU5FVVRSQUxcbiAqIHByZWRpY2F0ZXMgKGEgcG9zaXRpb24gbmFtZSwgYW4gb3duZXIgaWQpLCBzbyBib3RoIGFyZSBwaW5uZWQgdG8gdGhlXG4gKiBlc2NhbGF0aW5nIGNhc2UncyBvd24gYG9yZ2FuaXphdGlvbl9pZGAgd2hlbiBpdCBjYXJyaWVzIG9uZS4gQSBwZXJzb24nc1xuICogZXNjYWxhdGlvbiBpcyBhbHJlYWR5IGNvbmZpbmVkIGJ5IHRoZSBkcml2ZXIgXHUyMDE0IHRoZSBlbGV2YXRlZCBgY3R4LmFwaWAga2VlcHNcbiAqIHRoZSB0cmlnZ2VyJ3MgdGVuYW50IFx1MjAxNCBidXQgdGhlIFNMQSBzd2VlcCB3cml0ZXMgYXMgdGhlIHN5c3RlbSB3aXRoIG5vXG4gKiB0ZW5hbnQgYXQgYWxsLCBhbmQgd2l0aG91dCB0aGUgcGluIGl0cyBlc2NhbGF0aW9uIHdvdWxkIHBpY2sgdGhlXG4gKiBsZWFzdC1sb2FkZWQgbWFuYWdlciBvZiBBTlkgb3JnYW5pemF0aW9uLiBBIGNhc2Ugd2l0aCBubyBvcmdhbml6YXRpb24gKGFcbiAqIHNpbmdsZS1vcmdhbml6YXRpb24gaW5zdGFsbCkgaGFzIG5vIHdhbGwgdG8gc3RheSBpbnNpZGUsIGFuZCBpcyBub3QgcGlubmVkLlxuICogUGlubmVkLCBhIG1hbmFnZXIgd2hvc2UgcG9zaXRpb24gYXNzaWdubWVudCBpcyBnbG9iYWwgKG5vIG9yZ2FuaXphdGlvbilcbiAqIGRvZXMgbm90IHJlY2VpdmUgYSB0ZW5hbnQncyBjYXNlLlxuICpcbiAqIEBwYXJhbSBob29rTmFtZSByZWdpc3RyeSBuYW1lIGZvciB0aGUgaG9vayAobWV0YWRhdGEgb25seSBcdTIwMTQgbmV2ZXIgcmVhZCBieVxuICogICB0aGUgYm9keSwgd2hpY2ggdGhlIHNhbmRib3ggd291bGQgbm90IGxldCBpdCBiZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYXNlRXNjYWxhdGlvblJlYXNzaWduKGhvb2tOYW1lID0gJ2Nhc2VfZXNjYWxhdGlvbl9yZWFzc2lnbicpOiBIb29rIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBob29rTmFtZSxcbiAgICBvYmplY3Q6ICdjcm1fY2FzZScsXG4gICAgZXZlbnRzOiBbJ2JlZm9yZVVwZGF0ZSddLFxuICAgIHByaW9yaXR5OiAyNTAsXG4gICAgcnVuQXM6ICdzeXN0ZW0nLFxuICAgIGRlc2NyaXB0aW9uOiAnSGFuZCBhIGNhc2UgYmVpbmcgZXNjYWxhdGVkIHRvIHRoZSBsZWFzdC1sb2FkZWQgc2VydmljZSBtYW5hZ2VyLicsXG4gICAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAgIC8vIEQzIHN0YW5kLWRvd246IHRoZSBlc2NhbGF0aW9uIFRSQU5TSVRJT04gaXMgcmVhZCBvZmYgdGhpcyByb3cnc1xuICAgICAgLy8gYHByZXZpb3VzYCwgc28gb24gYSBwcmVkaWNhdGUgdXBkYXRlIHRoZSBuZXcgb3duZXIgd291bGQgYmUgd3JpdHRlbiB0b1xuICAgICAgLy8gZXZlcnkgbWF0Y2hlZCBjYXNlLiBgZXZlbnRzYCBpcyBgYmVmb3JlVXBkYXRlYCBvbmx5LCBzbyB0aGUgZXZlbnQgaGFsZlxuICAgICAgLy8gb2YgdGhlIGlkaW9tIGluIGBmb3JlY2FzdC5ob29rLnRzYCB3b3VsZCBiZSBhIGNvbnN0YW50IGhlcmUuXG4gICAgICBpZiAoY3R4LmRpc3BhdGNoPy5tb2RlID09PSAncGVyLXJvdycpIHJldHVybjtcblxuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gY3R4O1xuICAgICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgICBpZiAoIXByZXZpb3VzKSByZXR1cm47XG5cbiAgICAgIC8vIFRoZSBlc2NhbGF0aW9uIFRSQU5TSVRJT04sIG5vdCB0aGUgZXNjYWxhdGVkIFNUQVRFOiBhIHN0YXRlIHByZWRpY2F0ZVxuICAgICAgLy8gcmUtZmlyZXMgb24gYW55IHdyaXRlIHRoYXQgbGVhdmVzIHRoZSBzdGF0dXMgYWxvbmUsIGluY2x1ZGluZyBhIHJlcGxheVxuICAgICAgLy8gb2YgdGhpcyB2ZXJ5IHVwZGF0ZS4gQ29tcGFyaW5nIHN0YXR1cyBzdHJpbmdzIGFsc28gc3RheXMgY2xlYXIgb2YgdGhlXG4gICAgICAvLyBTUUxpdGUgYm9vbGVhbiB0cmFwIHRoYXQgYGlzX2VzY2FsYXRlZCAhPSB0cnVlYCB3YWxrcyBpbnRvLlxuICAgICAgaWYgKGlucHV0LnN0YXR1cyAhPT0gJ2VzY2FsYXRlZCcgfHwgcHJldmlvdXMuc3RhdHVzID09PSAnZXNjYWxhdGVkJykgcmV0dXJuO1xuXG4gICAgICAvLyBBbiBleHBsaWNpdCBvd25lciBpbiB0aGUgU0FNRSBwYXlsb2FkIHdpbnM6IGEgbWFudWFsIFwiZXNjYWxhdGUgYW5kIGhhbmRcbiAgICAgIC8vIGl0IHRvIERhbmFcIiBtdXN0IG5vdCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgcG9vbCdzIGFyaXRobWV0aWMuXG4gICAgICBpZiAodHlwZW9mIGlucHV0Lm93bmVyX2lkID09PSAnc3RyaW5nJyAmJiBpbnB1dC5vd25lcl9pZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWFwaSkgcmV0dXJuO1xuXG4gICAgICAvLyBUaGUgZXNjYWxhdGluZyBjYXNlJ3Mgb3duIG9yZ2FuaXphdGlvbiBcdTIwMTQgdGhlIHJ1bGUtMTAgcGluIG9uIGJvdGhcbiAgICAgIC8vIHJlYWRzIGJlbG93LiBSZWFkIG9mZiB0aGUgc3RvcmVkIHJvdzogYW4gdXBkYXRlIHBheWxvYWQgZG9lcyBub3QgY2FycnlcbiAgICAgIC8vIGl0LCBhbmQgdGhlIHBsYXRmb3JtIHN0YW1wZWQgaXQgdGhlcmUuXG4gICAgICBjb25zdCBvcmdhbml6YXRpb25JZCA9XG4gICAgICAgIHR5cGVvZiBwcmV2aW91cy5vcmdhbml6YXRpb25faWQgPT09ICdzdHJpbmcnICYmIHByZXZpb3VzLm9yZ2FuaXphdGlvbl9pZCAhPT0gJydcbiAgICAgICAgICA/IHByZXZpb3VzLm9yZ2FuaXphdGlvbl9pZFxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaW5Pcmdhbml6YXRpb246IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSBvcmdhbml6YXRpb25JZCA/IHsgb3JnYW5pemF0aW9uX2lkOiBvcmdhbml6YXRpb25JZCB9IDoge307XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoZSBwb29sID0gaG9sZGVycyBvZiB0aGUgYHNlcnZpY2VfbWFuYWdlcmAgcG9zaXRpb24uIFRoaXMgbGl0ZXJhbCBpc1xuICAgICAgICAvLyB0aGUgZXhwb3J0ZWQgU0VSVklDRV9NQU5BR0VSX1BPU0lUSU9OOyB0aGUgc2FuZGJveCBmb3JiaWRzIHJlYWRpbmcgdGhlXG4gICAgICAgIC8vIGNvbnN0YW50IGhlcmUsIGFuZCBgdGVzdC9jYXNlLWFzc2lnbm1lbnQudGVzdC50c2AgcGlucyB0aGUgcGFyaXR5LlxuICAgICAgICBjb25zdCBob2xkZXJzID0gYXdhaXQgYXBpLm9iamVjdCgnc3lzX3VzZXJfcG9zaXRpb24nKS5maW5kKHtcbiAgICAgICAgICB3aGVyZTogeyBwb3NpdGlvbjogJ3NlcnZpY2VfbWFuYWdlcicsIC4uLmluT3JnYW5pemF0aW9uIH0sIGZpZWxkczogWyd1c2VyX2lkJ10sIHRvcDogMTAwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG1hbmFnZXJJZHMgPSBBcnJheS5mcm9tKFxuICAgICAgICAgIG5ldyBTZXQoXG4gICAgICAgICAgICAoaG9sZGVycyA/PyBbXSlcbiAgICAgICAgICAgICAgLm1hcCgocikgPT4gKHR5cGVvZiByLnVzZXJfaWQgPT09ICdzdHJpbmcnID8gci51c2VyX2lkIDogJycpKVxuICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIC8vIE5vIHBvb2wgXHUyMTkyIHRoZSBjYXNlIGtlZXBzIGl0cyBvd25lciBhbmQgdGhlIGVzY2FsYXRpb24gc3RpbGwgbGFuZHMuXG4gICAgICAgIGlmIChtYW5hZ2VySWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIEFscmVhZHkgd2l0aCB0aGUgcG9vbCBcdTIxOTIgbGVhdmUgaXQgYWxvbmUuIFRoaXMgaXMgd2hhdCBtYWtlcyB0aGUgd3JpdGVcbiAgICAgICAgLy8gaWRlbXBvdGVudDogYSBtYW5hZ2VyIGVzY2FsYXRpbmcgdGhlaXIgb3duIGNhc2UsIG9yIGEgc2Vjb25kXG4gICAgICAgIC8vIGVzY2FsYXRpb24gb2YgYSBjYXNlIGhhbmRlZCBvdmVyIG9uY2UgYWxyZWFkeSwgbW92ZXMgbm90aGluZy5cbiAgICAgICAgY29uc3QgY3VycmVudE93bmVyID1cbiAgICAgICAgICAodHlwZW9mIHByZXZpb3VzLm93bmVyX2lkID09PSAnc3RyaW5nJyAmJiBwcmV2aW91cy5vd25lcl9pZCkgfHwgJyc7XG4gICAgICAgIGlmIChjdXJyZW50T3duZXIgJiYgbWFuYWdlcklkcy5pbmRleE9mKGN1cnJlbnRPd25lcikgIT09IC0xKSByZXR1cm47XG5cbiAgICAgICAgLy8gRmV3ZXN0IE9QRU4gY2FzZXMgd2lucyBcdTIwMTQgc2FtZSBwcmVkaWNhdGUgYXMgdGhlIGludGFrZSByb3VuZC1yb2JpbjpcbiAgICAgICAgLy8gYCRuaW5gIG92ZXIgc3RhdHVzZXMgcmF0aGVyIHRoYW4gYGlzX2Nsb3NlZDogZmFsc2VgLCBiZWNhdXNlIGFcbiAgICAgICAgLy8gcmVzb2x2ZWQgY2FzZSBpcyBmaW5pc2hlZCB3b3JrIGFuZCBtdXN0IHN0b3AgY291bnRpbmcuXG4gICAgICAgIGxldCBiZXN0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBiZXN0Q291bnQgPSBJbmZpbml0eTtcbiAgICAgICAgZm9yIChjb25zdCBtYW5hZ2VySWQgb2YgbWFuYWdlcklkcykge1xuICAgICAgICAgIGNvbnN0IG9wZW5Db3VudCA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9jYXNlJykuY291bnQoe1xuICAgICAgICAgICAgd2hlcmU6IHsgb3duZXJfaWQ6IG1hbmFnZXJJZCwgc3RhdHVzOiB7ICRuaW46IFsncmVzb2x2ZWQnLCAnY2xvc2VkJ10gfSwgLi4uaW5Pcmdhbml6YXRpb24gfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAob3BlbkNvdW50IDwgYmVzdENvdW50KSB7XG4gICAgICAgICAgICBiZXN0Q291bnQgPSBvcGVuQ291bnQ7XG4gICAgICAgICAgICBiZXN0ID0gbWFuYWdlcklkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYmVzdCkgaW5wdXQub3duZXJfaWQgPSBiZXN0O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFN3YWxsb3c6IHRoZSBoYW5kLW9mZiBtdXN0IG5ldmVyIHJlamVjdCB0aGUgZXNjYWxhdGlvbi4gQSBmYWlsZWRcbiAgICAgICAgLy8gcG9vbCByZWFkIGxlYXZlcyB0aGUgY2FzZSB3aGVyZSBpdCBpcywgZXNjYWxhdGVkLlxuICAgICAgICAvLyAoTm8gYGNvbnNvbGVgIGhlcmUgXHUyMDE0IHRoZSBMMiBob29rIHNhbmRib3ggZG9lcyBub3QgZGVmaW5lIG9uZS4pXG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBMZXQgYSB1c2VyIENMQUlNIGFuIHVub3duZWQgY2FzZSBvdXQgb2YgdHJpYWdlLlxuICpcbiAqIENvbnRyYWN0OiBhIGNhbGxlciBtYXkgdGFrZSBvd25lcnNoaXAgb25seSBmb3IgVEhFTVNFTFZFUywgb25seSB3aGlsZSB0aGVcbiAqIGNhc2UgaXMgdW5vd25lZCwgYW5kIG9ubHkgd2hpbGUgaXQgaXMgbm90IGNsb3NlZC5cbiAqXG4gKiAjIyBXaHkgdGhlIGNsYWltIGlzIGEgR0VTVFVSRSwgbm90IGEgdmFsdWUgdGhlIGNhbGxlciBzdXBwbGllc1xuICpcbiAqIFx1MjZBMFx1RkUwRiBUaGUgb3duZXJzaGlwLXRyYW5zZmVyIGdhdGUgKCMzMDA0KSByZWplY3RzIGEgcGF5bG9hZCBjYXJyeWluZyBgb3duZXJfaWRgXG4gKiBJTlNJREUgdGhlIG9wZXJhdGlvbiBtaWRkbGV3YXJlLCB1cHN0cmVhbSBvZiB0aGUgaG9vayBwaGFzZSBcdTIwMTQgdGhlIGhvb2sgbmV2ZXJcbiAqIGZpcmVzLCBzbyBpdCBjYW5ub3QgYXBwcm92ZSwgbGF1bmRlciBvciBhZGp1ZGljYXRlIHN1Y2ggYSB3cml0ZSAoZG9vciBcdTI0NjIgaW5cbiAqIHRoaXMgbW9kdWxlJ3MgaGVhZGVyKS4gXCJMZXQgdGhlIGFnZW50IHdyaXRlIGB7IG93bmVyX2lkOiA8c2VsZj4gfWAgYW5kIGhhdmUgYVxuICogaG9vayB2ZXQgaXRcIiBpcyB0aGVyZWZvcmUgbm90IGltcGxlbWVudGFibGUgYXQgYWxsLlxuICpcbiAqIFNvIHRoZSBjbGFpbSBpcyBzcGVsbGVkIGFzIGEgTU9WRTogdGhlIGNhbGxlciBwdXRzIGFuIHVub3duZWQgb3BlbiBjYXNlIGludG9cbiAqIGEgc3RhdHVzIG1lYW5pbmcgdGhleSBwaWNrZWQgaXQgdXAgKHtAbGluayBDTEFJTUFCTEVfVEFSR0VUX1NUQVRVU0VTfSkgYW5kXG4gKiB0aGlzIGhvb2sgc3RhbXBzIGBjdHgudXNlci5pZGAsIHRoZSBvbmx5IHVzZXIgaWQgaXQgaGFzLiBUaGF0IGludmVydHMgdGhlXG4gKiBzYWZldHkgYnVyZGVuIGluIHRoZSBhcHAncyBmYXZvdXIgXHUyMDE0IFwiY2xhaW0gaXQgZm9yIHNvbWVib2R5IGVsc2VcIiBhbmQgXCJjbGFpbVxuICogYW4gb3duZWQgY2FzZVwiIGhhdmUgbm8gc3BlbGxpbmcsIGJlY2F1c2UgdGhlIGhvb2sgcmVhZHMgbm8gdGFyZ2V0IGZyb20gdGhlXG4gKiBwYXlsb2FkIGFuZCBpcyBpbmVydCB1bmxlc3MgdGhlIFNUT1JFRCByb3cgaXMgb3duZXJsZXNzLiBUaGUgYWx0ZXJuYXRpdmUsXG4gKiBncmFudGluZyBgY3JtX2Nhc2UuYWxsb3dUcmFuc2ZlcmAsIGNhbm5vdCBleHByZXNzIFwidG8geW91cnNlbGYgb25seVwiOiBpdFxuICogd291bGQgbGV0IGFuIGFnZW50IHJlYXNzaWduIGFueSBjYXNlIHRoZXkgY2FuIGVkaXQsIHRvIGFueW9uZS5cbiAqIGBzcmMvc2FsZXMvcHJvZmlsZXMvc2VydmljZS1hZ2VudC5wcm9maWxlLnRzYCBuZWVkcyBubyBuZXcgZ3JhbnQgZm9yIHRoaXMgaG9vay5cbiAqXG4gKiAjIyBUaGUgZm91ciBib3VuZGFyaWVzXG4gKlxuICogfCB3cml0ZSwgYXMgYSBgc2VydmljZV9hZ2VudGAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvdXRjb21lIHxcbiAqIHwgLS0tIHwgLS0tIHxcbiAqIHwgYHsgc3RhdHVzOiAnaW5fcHJvZ3Jlc3MnIH1gIG9uIGFuIHVub3duZWQgT1BFTiBjYXNlIHwgY2xhaW1lZCBcdTIwMTQgb3duZXIgYmVjb21lcyB0aGUgY2FsbGVyIHxcbiAqIHwgdGhlIHNhbWUgb24gYSBjYXNlIG93bmVkIGJ5IFNPTUVCT0RZIEVMU0UgICAgICAgICAgIHwgcmVmdXNlZDogbm8gcmVhY2gsIGFuZCBndWFyZCAzIGJlbG93IHxcbiAqIHwgYHsgb3duZXJfaWQ6IDxhbnlvbmU+IH1gLCB1bm93bmVkIG9yIG5vdCAgICAgICAgICAgIHwgcmVmdXNlZCBieSB0aGUgdHJhbnNmZXIgZ2F0ZSwgdXBzdHJlYW0gfFxuICogfCB0aGUgc2FtZSBvbiBhbiB1bm93bmVkIENMT1NFRCBjYXNlICAgICAgICAgICAgICAgICAgfCByZWZ1c2VkOiBub3Qgc2hhcmVkLCBhbmQgZ3VhcmQgNCBiZWxvdyB8XG4gKlxuICogRWFjaCBndWFyZCBpcyBkb3VibGVkIG9uIHB1cnBvc2U6IGBjYXNlX3VuYXNzaWduZWRfdHJpYWdlX3NoYXJpbmdgIGFscmVhZHlcbiAqIGhpZGVzIGEgY2xvc2VkIG9yIG90aGVyd2lzZS1vd25lZCBjYXNlIGZyb20gYW4gYWdlbnQsIGJ1dCB0aGlzIGhvb2sgYWxzbyBydW5zXG4gKiBmb3IgY2FsbGVycyB0aGF0IHJ1bGUgZG9lcyBub3QgY29uc3RyYWluIChhbiBhZG1pbiwgYSBtYW5hZ2VyIGhvbGRpbmcgdGhlXG4gKiBlc2NhbGF0aW9uIHNoYXJlKS4gYHRlc3QvdW5hc3NpZ25lZC1jYXNlLXRyaWFnZS1yZWFjaC50ZXN0LnRzYCBkcml2ZXMgYm90aFxuICogbGF5ZXJzIHNlcGFyYXRlbHkgc28gbmVpdGhlciBjYW4gcGFzcyBvbiB0aGUgb3RoZXIncyBiZWhhbGYuXG4gKlxuICogIyMgUmUtZW50cmFuY3lcbiAqXG4gKiBUaGUgaG9vayBwZXJmb3JtcyBOTyBvcGVyYXRpb24gXHUyMDE0IGl0IG11dGF0ZXMgdGhlIHBheWxvYWQgb2YgdGhlIHVwZGF0ZSBhbHJlYWR5XG4gKiBpbiBmbGlnaHQsIHNvIHRoZXJlIGlzIG5vIHNlY29uZCB3cml0ZSBhbmQgbm8gc2Vjb25kIGByZWNvcmQtYWZ0ZXItdXBkYXRlYFxuICogZXZlbnQgZm9yIGBjYXNlX2VzY2FsYXRpb25gLCBgY2FzZV9zbGFfbW9uaXRvcmAgb3IgYGNhc2Vfc3RhdHVzX3NpZGVfZWZmZWN0c2BcbiAqIHRvIHJlLWZpcmUgb24uIEl0cyBwcmVkaWNhdGUgaXMgYSBUUkFOU0lUSU9OLCBub3QgYSBzdGF0ZSwgc28gaXQgaXMgZmFsc2Ugb25cbiAqIGEgcmVwbGF5OyBhbmQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNsYWltIHRoZSBzdG9yZWQgcm93IEhBUyBhbiBvd25lciwgc28gZ3VhcmRcbiAqIDMgc3RvcHMgZXZlcnkgbGF0ZXIgcnVuLiBJdCBjYW5ub3QgY29sbGlkZSB3aXRoIHRoZSBlc2NhbGF0aW9uIGhhbmQtb2ZmOlxuICogYGVzY2FsYXRlZGAgaXMgZGVsaWJlcmF0ZWx5IG5vdCBjbGFpbWFibGUsIGFuZCBhdCBwcmlvcml0eSAyNjAgdGhpcyBydW5zXG4gKiBhZnRlciBgY2FzZV9lc2NhbGF0aW9uX3JlYXNzaWduYCAoMjUwKSBhbmQgc3RhbmRzIGRvd24gdGhlIG1vbWVudCBgb3duZXJfaWRgXG4gKiBpcyBhbHJlYWR5IGluIHRoZSBwYXlsb2FkLlxuICpcbiAqICMjIFdobyB0aGlzIHJ1bnMgZm9yXG4gKlxuICogQSBjbGFpbSBpcyBzb21ldGhpbmcgYSBQRVJTT04gZG9lcywgc28gYSB3cml0ZSB3aXRoIG5vIHVzZXIgKGEgc2VlZCwgYVxuICogc3lzdGVtLWNvbnRleHQgbWlncmF0aW9uLCB0aGUgYW5vbnltb3VzIHdlYi10by1jYXNlIHBhdGgpIG5ldmVyIGNsYWltcyBcdTIwMTRcbiAqIG93bmVybGVzcyBpbnRha2Ugc3RheXMgb3duZXJsZXNzIGFuZCBzdGF5cyBpbiB0aGUgdHJpYWdlIHRhYi4gQSB3cml0ZVxuICogY2FycnlpbmcgYSByZWFsIHVzZXIgaWQgY2xhaW1zIGZvciB0aGF0IHVzZXIsIHdob2V2ZXIgdGhleSBhcmUuXG4gKlxuICogQHBhcmFtIGhvb2tOYW1lIHJlZ2lzdHJ5IG5hbWUgZm9yIHRoZSBob29rIChtZXRhZGF0YSBvbmx5IFx1MjAxNCBuZXZlciByZWFkIGJ5XG4gKiAgIHRoZSBib2R5LCB3aGljaCB0aGUgc2FuZGJveCB3b3VsZCBub3QgbGV0IGl0IGJlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNhc2VTZWxmQ2xhaW0oaG9va05hbWUgPSAnY2FzZV9zZWxmX2NsYWltJyk6IEhvb2sge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGhvb2tOYW1lLFxuICAgIG9iamVjdDogJ2NybV9jYXNlJyxcbiAgICBldmVudHM6IFsnYmVmb3JlVXBkYXRlJ10sXG4gICAgcHJpb3JpdHk6IDI2MCxcbiAgICBkZXNjcmlwdGlvbjogJ0xldCBhIHVzZXIgY2xhaW0gYW4gdW5vd25lZCBvcGVuIGNhc2UgYnkgcGlja2luZyBpdCB1cDsgdGhlIG93bmVyIHdyaXR0ZW4gaXMgYWx3YXlzIHRoZSBjYWxsZXIuJyxcbiAgICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgICAgLy8gRDMgc3RhbmQtZG93bjogZXZlcnkgZ3VhcmQgYmVsb3cgaXMgZGVjaWRlZCBhZ2FpbnN0IHRoaXMgcm93J3NcbiAgICAgIC8vIGBwcmV2aW91c2AsIHNvIGEgcHJlZGljYXRlIHVwZGF0ZSB3b3VsZCBjbGFpbSByb3dzIHRoZSBjYWxsZXIgbmV2ZXJcbiAgICAgIC8vIHBpY2tlZCB1cC4gYGJlZm9yZVVwZGF0ZWAtb25seSwgYXMgYWJvdmUuXG4gICAgICBpZiAoY3R4LmRpc3BhdGNoPy5tb2RlID09PSAncGVyLXJvdycpIHJldHVybjtcblxuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gY3R4O1xuICAgICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgICBpZiAoIXByZXZpb3VzKSByZXR1cm47XG5cbiAgICAgIC8vIDEuIEEgY2xhaW0gaXMgc29tZXRoaW5nIGEgUEVSU09OIGRvZXMuIEEgc3lzdGVtIG9yIHNlZWQgd3JpdGUgbGVhdmVzXG4gICAgICAvLyAgICB0aGUgY2FzZSBvd25lcmxlc3MgZm9yIHRoZSB0cmlhZ2UgdGFiIHRvIGtlZXAgc2hvd2luZy5cbiAgICAgIGNvbnN0IGNsYWltYW50ID0gY3R4LnVzZXI/LmlkO1xuICAgICAgaWYgKHR5cGVvZiBjbGFpbWFudCAhPT0gJ3N0cmluZycgfHwgIWNsYWltYW50KSByZXR1cm47XG4gICAgICBpZiAoY3R4LnNlc3Npb24/LmlzU3lzdGVtKSByZXR1cm47XG5cbiAgICAgIC8vIDIuIEFuIGV4cGxpY2l0IGBvd25lcl9pZGAgaW4gdGhlIHBheWxvYWQgV0lOUyBhbmQgaXMgbmV2ZXIgdG91Y2hlZC4gRm9yXG4gICAgICAvLyAgICBhbiBhZ2VudCB0aGF0IGJyYW5jaCBpcyB1bnJlYWNoYWJsZSAodGhlIHRyYW5zZmVyIGdhdGUgcmVmdXNlcyBzdWNoXG4gICAgICAvLyAgICBhIHBheWxvYWQgdXBzdHJlYW0pLCBzbyBpbiBwcmFjdGljZSBpdCBtZWFucyBhIGNhbGxlciB3aG9cbiAgICAgIC8vICAgIGxlZ2l0aW1hdGVseSBob2xkcyBgYWxsb3dUcmFuc2ZlcmAgZ2V0cyB0aGUgb3duZXIgdGhleSBuYW1lZC5cbiAgICAgIGlmICgnb3duZXJfaWQnIGluIGlucHV0KSByZXR1cm47XG5cbiAgICAgIC8vIDMuIE9ubHkgYW4gVU5PV05FRCBjYXNlIGNhbiBiZSBjbGFpbWVkLiBDb3ZlcnMgYm90aCBzdG9yYWdlIHNoYXBlcyBvZlxuICAgICAgLy8gICAgXCJubyBvd25lclwiOiB0aGUga2V5IEFCU0VOVCAobWVtb3J5L21vbmdvKSBhbmQgdGhlIGNvbHVtbiBOVUxMIChTUUwpLlxuICAgICAgaWYgKHR5cGVvZiBwcmV2aW91cy5vd25lcl9pZCA9PT0gJ3N0cmluZycgJiYgcHJldmlvdXMub3duZXJfaWQpIHJldHVybjtcblxuICAgICAgLy8gNC4gXHUyMDI2YW5kIG9ubHkgb25lIHRoYXQgaXMgbm90IENMT1NFRC4gXHUyNkEwXHVGRTBGIFRoaXMgZ3VhcmQgYW5kIHRoZSB0cmlhZ2VcbiAgICAgIC8vICAgIHNoYXJpbmcgZ3JhbnQgZHJhdyBESUZGRVJFTlQgbGluZXMgb24gcHVycG9zZSwgYW5kIFx1MjZENCBuZWl0aGVyIGlzIHRvXG4gICAgICAvLyAgICBiZSBcImFsaWduZWRcIiBvbnRvIHRoZSBvdGhlci4gYGNhc2VfdW5hc3NpZ25lZF90cmlhZ2Vfc2hhcmluZ2BcbiAgICAgIC8vICAgIChgc3JjL3NlcnZpY2Uvc2hhcmluZy9jYXNlLnNoYXJpbmcudHNgKSBleGNsdWRlcyBgcmVzb2x2ZWRgIGFzIHdlbGwgYXNcbiAgICAgIC8vICAgIGBjbG9zZWRgLCBiZWNhdXNlIGEgcmVzb2x2ZWQgdW5vd25lZCBjYXNlIGlzIGhpc3RvcnksIG5vdCBiYWNrbG9nLFxuICAgICAgLy8gICAgYW5kIHRoZSB0YWIncyByb3cgY291bnQgaGFzIHRvIGtlZXAgbWVhbmluZyBcIndvcmsgd2FpdGluZyBmb3IgYVxuICAgICAgLy8gICAgaHVtYW5cIi4gVGhpcyBndWFyZCBzdG9wcyBhdCBgY2xvc2VkYCBhbG9uZSwgYmVjYXVzZSBSRU9QRU5JTkcgYVxuICAgICAgLy8gICAgcmVzb2x2ZWQgY2FzZSBJUyBwaWNraW5nIHRoZSB3b3JrIHVwLCBzbyB3aG9ldmVyIGRvZXMgaXQgc2hvdWxkXG4gICAgICAvLyAgICBiZWNvbWUgaXRzIG93bmVyLiBUaGUgZ2FwIGJldHdlZW4gdGhlIHR3byBsaW5lcyBpcyBsaXZlIGZvciBleGFjdGx5XG4gICAgICAvLyAgICB0aGUgY2FsbGVycyB0aGF0IHJ1bGUgZG9lcyBub3QgcmVhY2ggXHUyMDE0IHRoZSBhZG1pbiwgdGhlIG1hbmFnZXJcbiAgICAgIC8vICAgIGhvbGRpbmcgdGhlIGVzY2FsYXRpb24gc2hhcmUgXHUyMDE0IHdoaWNoIGlzIHdoeVxuICAgICAgLy8gICAgYHRlc3QvdW5hc3NpZ25lZC1jYXNlLXRyaWFnZS1yZWFjaC50ZXN0LnRzYCBkcml2ZXMgdGhlIGNsb3NlZCBndWFyZFxuICAgICAgLy8gICAgb25jZSBwZXIgbGF5ZXIsIHRoZSBzZWNvbmQgdGltZSB3aXRoIGFuIGFjdG9yIHRoYXQgQ0FOIHJlYWNoIHRoZVxuICAgICAgLy8gICAgcm93LlxuICAgICAgLy9cbiAgICAgIC8vICAgIFx1MjZBMFx1RkUwRiBUaGUgYGlzX2Nsb3NlZCA9PSBmYWxzZWAgY29uZGl0aW9ucyBlbHNld2hlcmUgaW4gdGhhdCBzaGFyaW5nXG4gICAgICAvLyAgICBmaWxlIGFyZSBOT1QgdGhpcyBncmFudCBhbmQgTk9UIGRyaWZ0OiB0aGV5IGJlbG9uZyB0byB0aGUgbWFuYWdlclxuICAgICAgLy8gICAgYW5kIGRpcmVjdG9yIHJ1bGVzIG9uIGNyaXRpY2FsLXByaW9yaXR5IGNhc2VzLCB3aGljaCBrZWVwIHN0YW5kaW5nXG4gICAgICAvLyAgICByZWFjaCB0aHJvdWdoIHRoZSBgcmVzb2x2ZWQgXHUyMTkyIGNsb3NlZGAgcmV2aWV3IHdpbmRvdyBieSB0aGVpciBvd25cbiAgICAgIC8vICAgIHJ1bGluZy4gVGhlaXIgXHUyNkEwXHVGRTBGIGhlYWRlcnMgY2FycnkgaXQ7IFx1MjZENCBkbyBub3QgcmVhZCB0aGVtIGFzIHRoaXMgb25lLlxuICAgICAgLy9cbiAgICAgIC8vICAgIGBzdGF0dXNgIGlzIHJlYWQgZmlyc3QgYmVjYXVzZSBpdCBpcyBhIHN0cmluZyBvbiBldmVyeSBkcml2ZXI7XG4gICAgICAvLyAgICBgaXNfY2xvc2VkYCBpcyBhY2NlcHRlZCBhcyBgdHJ1ZWAgb3IgYDFgIGJlY2F1c2UgU1FMaXRlIGhhbmRzXG4gICAgICAvLyAgICBib29sZWFucyBiYWNrIGFzIGludGVnZXJzLlxuICAgICAgaWYgKHByZXZpb3VzLnN0YXR1cyA9PT0gJ2Nsb3NlZCcpIHJldHVybjtcbiAgICAgIGlmIChwcmV2aW91cy5pc19jbG9zZWQgPT09IHRydWUgfHwgcHJldmlvdXMuaXNfY2xvc2VkID09PSAxKSByZXR1cm47XG5cbiAgICAgIC8vIDUuIFRoZSBnZXN0dXJlOiB0aGUgc3RhdHVzIE1PVkVTIHRvIG9uZSBtZWFuaW5nIGEgaHVtYW4gcGlja2VkIHRoZSBjYXNlXG4gICAgICAvLyAgICB1cC4gSW5saW5lIGNvcGllcyBvZiBDTEFJTUFCTEVfVEFSR0VUX1NUQVRVU0VTIFx1MjAxNCB0aGUgc2FuZGJveCBmb3JiaWRzXG4gICAgICAvLyAgICByZWFkaW5nIHRoZSBjb25zdGFudCBoZXJlOyBgdGVzdC91bmFzc2lnbmVkLWNhc2UtdHJpYWdlLXJlYWNoLnRlc3QudHNgXG4gICAgICAvLyAgICBwaW5zIHRoZSB0d28gaW4gc3RlcC4gYGVzY2FsYXRlZGAgaXMgYWJzZW50IG9uIHB1cnBvc2U6IHRoYXRcbiAgICAgIC8vICAgIHRyYW5zaXRpb24gYmVsb25ncyB0byBgY2FzZV9lc2NhbGF0aW9uX3JlYXNzaWduYC5cbiAgICAgIGNvbnN0IG5leHQgPSBpbnB1dC5zdGF0dXM7XG4gICAgICBpZiAodHlwZW9mIG5leHQgIT09ICdzdHJpbmcnIHx8IG5leHQgPT09IHByZXZpb3VzLnN0YXR1cykgcmV0dXJuO1xuICAgICAgaWYgKG5leHQgIT09ICdpbl9wcm9ncmVzcycgJiYgbmV4dCAhPT0gJ3dhaXRpbmdfY3VzdG9tZXInICYmIG5leHQgIT09ICd3YWl0aW5nX3N1cHBvcnQnKSByZXR1cm47XG5cbiAgICAgIC8vIFRoZSBvbmx5IHVzZXIgaWQgdGhpcyBob29rIGhhcywgYW5kIHRoZSBvbmx5IG9uZSBpdCBjYW4gd3JpdGUuXG4gICAgICBpbnB1dC5vd25lcl9pZCA9IGNsYWltYW50O1xuICAgIH0sXG4gIH07XG59XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2Zsb3dzL2Nhc2UtZXNjYWxhdGlvbi1zdGFtcC5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZmxvd3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9mbG93cy9jYXNlLWVzY2FsYXRpb24tc3RhbXAuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIFRoZSBlc2NhbGF0aW9uIFNUQU1QIFx1MjAxNCB0aGUgb25lIGVsZXZhdGVkIHN0ZXAgYmVoaW5kIHRoZSBFc2NhbGF0ZSBDYXNlXG4gKiBhY3Rpb24gKG1haW50YWluZXItYXBwcm92ZWQpLlxuICpcbiAqICMjIFdoeSB0aGlzIGZsb3cgZXhpc3RzIGF0IGFsbFxuICpcbiAqIGBjcm1fY2FzZS5pc19lc2NhbGF0ZWRgIGFuZCBgZXNjYWxhdGVkX2RhdGVgIGFyZSBgcmVhZG9ubHk6IHRydWVgOiBub2JvZHlcbiAqIHR5cGVzIHRoZW0sIHNvIHRoYXQgaXMgdGhlIGhvbmVzdCBkZWNsYXJhdGlvbi4gQnV0IHRoZSBwbGF0Zm9ybSdzIHJlYWRvbmx5XG4gKiBzdHJpcCBpcyBvbmUgYnJhbmNoIG9mIHRoZSBVUERBVEUgcGF0aCBcdTIwMTRcbiAqIGBpZiAoIW9wQ3R4LmNvbnRleHQ/LmlzU3lzdGVtKWAsIG92ZXIgQ0FMTEVSLXN1cHBsaWVkIGtleXMgXHUyMDE0IHNvIGEgZmxvdyB3cml0ZVxuICogdG8gYSByZWFkb25seSBjb2x1bW4gc3Vydml2ZXMgZXhhY3RseSB3aGVuIHRoYXQgZmxvdydzIGVmZmVjdGl2ZSBgcnVuQXNgIGlzXG4gKiBgJ3N5c3RlbSdgICh0aGUgZW5naW5lIGRlZmF1bHRzIGl0IHRvIGAndXNlcidgKS4gVGhlIGBlc2NhbGF0ZV9jYXNlYCBzY3JlZW5cbiAqIGZsb3cgaXMgaW52b2tlZCBieSBhIHBlcnNvbiBmcm9tIHRoZSBVSSBhbmQgTVVTVCBrZWVwIHJ1bm5pbmcgYXMgdGhhdFxuICogcGVyc29uLCBzbyBpdCBjYW5ub3QgbWFrZSB0aGlzIHdyaXRlIGl0c2VsZi5cbiAqXG4gKiBUaGUgcmVzb2x1dGlvbiBpcyB0byBlbGV2YXRlIHRoZSBXUklURSwgbm90IHRoZSBGTE9XOiBgZXNjYWxhdGVfY2FzZWAgc3RheXNcbiAqIGBydW5BczogJ3VzZXInYCBhbmQgY2FsbHMgdGhpcyBkZWRpY2F0ZWQgYHJ1bkFzOiAnc3lzdGVtJ2AgZmxvdyB0aHJvdWdoIGFcbiAqIGBzdWJmbG93YCBub2RlLiBFdmVyeXRoaW5nIHRoZSBhZ2VudCBkb2VzIGtlZXBzIHRoZWlyIGlkZW50aXR5OyBvbmx5IHRoZXNlXG4gKiB0d28gc3RhbXBlZCBjb2x1bW5zIGFyZSB3cml0dGVuIHdpdGggdGhlIGVsZXZhdGVkIGNvbnRleHQuXG4gKlxuICogXHUyNkQ0IERvIE5PVCBmb2xkIHRoaXMgYmFjayBpbnRvIGBlc2NhbGF0ZV9jYXNlYCBieSBnaXZpbmcgdGhhdCBmbG93XG4gKiBgcnVuQXM6ICdzeXN0ZW0nYC4gVGhhdCBvcHRpb24gd2FzIGNvc3RlZCBhbmQgZXhwbGljaXRseSBOT1QgYWRvcHRlZDogaXRcbiAqIGVsZXZhdGVzIGV2ZXJ5IHdyaXRlIHRoZSBzY3JlZW4gZmxvdyBtYWtlcywgbm90IGp1c3QgdGhlc2UgdHdvLCBhbmQgaXQgc3RvcHNcbiAqIHRoZSBmbG93IGNhcnJ5aW5nIHRoZSBhY3RpbmcgdXNlcidzIGNvbnRleHQgZm9yIGFueXRoaW5nIGRvd25zdHJlYW0gdGhhdFxuICogcmVhZHMgaXQuIFNlZSBgQUdFTlRTLm1kYCBob3VzZSBydWxlIDkgKFwiRWxldmF0ZSBhcyBsaXR0bGUgYXMgcG9zc2libGVcIikuXG4gKlxuICogIyMgTWVhc3VyZWQsIG5vdCBhc3N1bWVkXG4gKlxuICogVGhlIGRpcmVjdGlvbiByZXN0cyBvbiBvbmUgZmFsc2lmaWFibGUgcHJlbWlzZSBcdTIwMTQgdGhhdCBhIGNhbGxlZSBmbG93J3Mgb3duXG4gKiBgcnVuQXNgIGdvdmVybnMgaXRzIHdyaXRlcyByYXRoZXIgdGhhbiBpbmhlcml0aW5nIHRoZSBjYWxsZXIncyBjb250ZXh0IFx1MjAxNCBhbmRcbiAqIGl0IGlzIG1lYXN1cmVkIGFnYWluc3QgYSByZWFsIGVuZ2luZSBpblxuICogYHRlc3QvcmVhZG9ubHktd3JpdGUtc2VtYW50aWNzLnRlc3QudHNgIChcImEgc3lzdGVtIHN1YmZsb3cgY2FsbGVkIGZyb20gYVxuICogdXNlciBwYXJlbnRcIikuIFRoYXQgbWVhc3VyZW1lbnQgcmVwb3J0cyB0aHJlZSB0aGluZ3M6XG4gKlxuICogIC0gYSBgcnVuQXM6ICdzeXN0ZW0nYCBjYWxsZWUgaW52b2tlZCBmcm9tIGEgYHJ1bkFzOiAndXNlcidgIHBhcmVudCBoYXMgaXRzXG4gKiAgICB3cml0ZSB0byBhIGByZWFkb25seWAgY29sdW1uIFNVUlZJVkU7XG4gKiAgLSB0aGUgc2FtZSBjYWxsZWUgZGVjbGFyZWQgYHJ1bkFzOiAndXNlcidgIGlzIFNUUklQUEVEIFx1MjAxNCBzbyBpdCBpcyB0aGVcbiAqICAgIGNhbGxlZSdzIGRlY2xhcmF0aW9uIHRoYXQgZGVjaWRlcywgbm90IHRoZSBzdWJmbG93IGhvcDtcbiAqICAtIHRoZSBwYXJlbnQncyBvd24gbGF0ZXIgd3JpdGUgdG8gYSByZWFkb25seSBjb2x1bW4gaXMgU1RJTEwgc3RyaXBwZWQgXHUyMDE0IHRoZVxuICogICAgZWxldmF0aW9uIGlzIHNjb3BlZCB0byB0aGlzIHJ1biBhbmQgZG9lcyBub3QgbGVhayBiYWNrIHVwLlxuICpcbiAqIFRoZSBtZWNoYW5pc20gaXMgYHJlc29sdmVSdW5Db250ZXh0YFxuICogKGBAb2JqZWN0c3RhY2svc2VydmljZS1hdXRvbWF0aW9uYCksIHdoaWNoIHJlLWFzc2VydHNcbiAqIGBydW5BczogZmxvdy5ydW5BcyA/PyAndXNlcidgIEFGVEVSIHNwcmVhZGluZyB0aGUgY2FsbGVyJ3MgY29udGV4dCwgc28gdGhlXG4gKiBjYWxsZWUncyBvd24gZGVjbGFyYXRpb24gd2luczogXCJhIENPUFksIG5ldmVyIG11dGF0aW5nIHRoZSBjYWxsZXIncyBjb250ZXh0LFxuICogc28gdGhlIGVsZXZhdGlvbiBpcyBzY29wZWQgdG8gdGhpcyBydW4gYW5kIHRoZSBjYWxsZXIncyBpZGVudGl0eSBpcyByZXN0b3JlZFxuICogd2hlbiB0aGUgcnVuIHJldHVybnNcIiAoQURSLTAwNDkpLlxuICpcbiAqICMjIFx1MjZENCBXaGF0IHRoaXMgZmxvdyBkZWxpYmVyYXRlbHkgZG9lcyBOT1Qgd3JpdGVcbiAqXG4gKiBPbmx5IHRoZSB0d28gY29sdW1ucyBhIHBlcnNvbiBuZXZlciB0eXBlczpcbiAqXG4gKiAgIGlzX2VzY2FsYXRlZCAgICBzdGFtcGVkIGhlcmVcbiAqICAgZXNjYWxhdGVkX2RhdGUgIHN0YW1wZWQgaGVyZVxuICpcbiAqIGBlc2NhbGF0aW9uX3JlYXNvbmAgaXMgdGhlIGFnZW50J3Mgc2NyZWVuIGlucHV0IGFuZCBgcHJpb3JpdHlgIC8gYHN0YXR1c2BcbiAqIGFyZSBvcmRpbmFyeSBlZGl0YWJsZSBjb2x1bW5zIFx1MjAxNCBhbGwgdGhyZWUgc3RheSBpbiBgZXNjYWxhdGVfY2FzZWAsIHdyaXR0ZW5cbiAqIHdpdGggdGhlIFVTRVIncyBjb250ZXh0LiBNb3ZpbmcgYGVzY2FsYXRpb25fcmVhc29uYCBoZXJlIChvciBkZWNsYXJpbmcgaXRcbiAqIGByZWFkb25seWApIHdvdWxkIG1ha2UgdGhlIHBsYXRmb3JtIHNpbGVudGx5IHN0cmlwIHRoZSByZWFzb24gdGhlIGFnZW50IGp1c3RcbiAqIHR5cGVkIFx1MjAxNCB0aGUgZXhhY3QgaGFybSB0aGlzIHNwbGl0IGV4aXN0cyB0byBwcmV2ZW50LCBpbnZlcnRlZCBvbnRvIHVzZXIgaW5wdXQuXG4gKlxuICogXHUyNkEwXHVGRTBGIE9SREVSSU5HIElTIExPQUQtQkVBUklORywgYW5kIGl0IGlzIHdoeSB0aGlzIGZsb3cgcnVucyBMQVNUIHJhdGhlciB0aGFuXG4gKiBmaXJzdC4gYGNybV9jYXNlYCdzIGBlc2NhbGF0aW9uX3JlYXNvbl9yZXF1aXJlZGAgdmFsaWRhdGlvbiByZWplY3RzIGFueSB3cml0ZVxuICogd2hvc2UgbWVyZ2VkIHJlY29yZCBoYXMgYGlzX2VzY2FsYXRlZCA9PSB0cnVlYCB3aXRoIGEgYmxhbmtcbiAqIGBlc2NhbGF0aW9uX3JlYXNvbmAuIGBlc2NhbGF0ZV9jYXNlYCB0aGVyZWZvcmUgd3JpdGVzIHRoZSByZWFzb24gRklSU1QgYW5kXG4gKiBjYWxscyB0aGlzIGZsb3cgQUZURVIsIHNvIHRoZSByZWFzb24gaXMgYWxyZWFkeSBzdG9yZWQgd2hlbiB0aGUgZmxhZyBmbGlwcy5cbiAqIFN0YW1waW5nIGZpcnN0IHdvdWxkIGZpcmUgdGhhdCB2YWxpZGF0aW9uIGFnYWluc3QgYSByZWNvcmQgdGhhdCBkb2VzIG5vdCB5ZXRcbiAqIGNhcnJ5IGEgcmVhc29uLiBCT1RIIG9yZGVycyBhcmUgbWVhc3VyZWQgaW5cbiAqIGB0ZXN0L3JlYWRvbmx5LXdyaXRlLXNlbWFudGljcy50ZXN0LnRzYCAoXCJvcmRlcmluZzogdGhlIHJlYXNvbiBtdXN0IGJlIHN0b3JlZFxuICogQkVGT1JFIHRoZSBmbGFnIGZsaXBzXCIpLCBpbmNsdWRpbmcgdGhlIGNvdW50ZXJmYWN0dWFsOiBzdGFtcGluZyBmaXJzdCBpc1xuICogcmVmdXNlZCBieSB0aGF0IHZhbGlkYXRpb24sIGFuZCBiZWNhdXNlIGEgYHN1YmZsb3dgIG5vZGUgcmVwb3J0cyBpdHMgY2hpbGQnc1xuICogZmFpbHVyZSB0aGUgcnVuIGFib3J0cyBiZWZvcmUgdGhlIHJlYXNvbiBpcyB3cml0dGVuIGVpdGhlciBcdTIwMTQgdGhlIGFnZW50IGxvc2VzXG4gKiB0aGUgd2hvbGUgZXNjYWxhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IENhc2VFc2NhbGF0aW9uU3RhbXBGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnY2FzZV9lc2NhbGF0aW9uX3N0YW1wJyxcbiAgbGFiZWw6ICdTdGFtcCBDYXNlIEVzY2FsYXRpb24nLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnV3JpdGUgdGhlIHR3byByZWFkb25seSBlc2NhbGF0aW9uIHN0YW1wcyAoaXNfZXNjYWxhdGVkLCBlc2NhbGF0ZWRfZGF0ZSkgd2l0aCB0aGUgc3lzdGVtIGNvbnRleHQuIENhbGxlZCBieSBlc2NhbGF0ZV9jYXNlIHRocm91Z2ggYSBzdWJmbG93IG5vZGUuJyxcbiAgdHlwZTogJ2F1dG9sYXVuY2hlZCcsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG5cbiAgLy8gXHUyQjUwIFRIRSBFTlRJUkUgUE9JTlQgT0YgVEhJUyBGSUxFLiBUaGlzIGlzIHRoZSBvbmx5IGVsZXZhdGlvbiBpbiB0aGVcbiAgLy8gZXNjYWxhdGUgcGF0aCwgYW5kIGl0IGNvdmVycyBleGFjdGx5IG9uZSBgdXBkYXRlX3JlY29yZGAgbm9kZS5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuXG4gIHZhcmlhYmxlczogW1xuICAgIC8vIFN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIncyBgc3ViZmxvd2Agbm9kZSwgd2hvc2UgYGlucHV0YCBlbnZlbG9wZSByZWFkcyBpdHMgb3duIGByZWNvcmRJZGAuXG4gICAgeyBuYW1lOiAncmVjb3JkSWQnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICBdLFxuXG4gIG5vZGVzOiBbXG4gICAgLy8gYGNvbmZpZzoge31gIG1hdGNoZXMgdGhlIHNoYXBlIG1lYXN1cmVkIGluXG4gICAgLy8gYHRlc3QvcmVhZG9ubHktd3JpdGUtc2VtYW50aWNzLnRlc3QudHNgOiBhbiBhdXRvbGF1bmNoZWQgY2FsbGVlIGlzIGhhbmRlZFxuICAgIC8vIGl0cyBwYXJhbXMgYnkgdGhlIGBzdWJmbG93YCBleGVjdXRvciBhbmQgcmVzb2x2ZXMgbm8gdHJpZ2dlciByZWNvcmQgb2ZcbiAgICAvLyBpdHMgb3duLCBzbyB0aGVyZSBpcyBubyBgb2JqZWN0TmFtZWAgZm9yIHRoZSBzdGFydCBub2RlIHRvIGxvYWQuXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCcsIGNvbmZpZzoge30gfSxcbiAgICB7XG4gICAgICBpZDogJ3N0YW1wJywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ1N0YW1wIEVzY2FsYXRpb24gRmxhZ3MnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fY2FzZScsXG4gICAgICAgIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZElkYCB9LFxuICAgICAgICAvLyBcdTI2RDQgRG8gbm90IGFkZCBmaWVsZHMgaGVyZS4gRXZlcnkgY29sdW1uIGluIHRoaXMgbm9kZSBpcyB3cml0dGVuIHdpdGhcbiAgICAgICAgLy8gdGhlIGVsZXZhdGVkIGNvbnRleHQ7IGFueXRoaW5nIGEgdXNlciBjYW4gbGVnaXRpbWF0ZWx5IHR5cGUgYmVsb25nc1xuICAgICAgICAvLyBpbiBgZXNjYWxhdGVfY2FzZWAgaW5zdGVhZC5cbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgaXNfZXNjYWxhdGVkOiB0cnVlLFxuICAgICAgICAgIGVzY2FsYXRlZF9kYXRlOiBjZWxgaXNvRGF0ZXRpbWUobm93KCkpYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdzdGFtcCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ3N0YW1wJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9mbG93cy9jYXNlLXNsYS1tb25pdG9yLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2Zsb3dzL2Nhc2Utc2xhLW1vbml0b3IuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUCwgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xuaW1wb3J0IHsgZ3VhcmRlZCB9IGZyb20gJy4uLy4uL3NhbGVzL2Zsb3dzL19ndWFyZGVkLWl0ZXJhdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogQ2FzZSBTTEEgTW9uaXRvciBcdTIwMTQgc2NoZWR1bGVkIGJyZWFjaCBkZXRlY3Rpb24uXG4gKlxuICogQ29tcGxlbWVudHMgYGNhc2VfZXNjYWxhdGlvbmAgKHdoaWNoIHJlYWN0cyB0byAqcHJpb3JpdHkqIHRoZSBtb21lbnQgYSBjYXNlXG4gKiBpcyBzYXZlZCkgYnkgYWRkaW5nIHRoZSBtaXNzaW5nICp0aW1lKiBkaW1lbnNpb24uIFRoZSBzY2hlbWEgY2Fycmllc1xuICogYHNsYV9kdWVfZGF0ZWAgYW5kIGBpc19zbGFfdmlvbGF0ZWRgLCBidXQgbm90aGluZyB3YXRjaGVkIHRoZSBjbG9jayBcdTIwMTQgYSBjYXNlXG4gKiBjb3VsZCBzaWxlbnRseSBibG93IGl0cyBTTEEuIFRoaXMgZmxvdyBzd2VlcHMgb3BlbiAobm90IHJlc29sdmVkL2Nsb3NlZClcbiAqIGNhc2VzIHdob3NlIGBzbGFfZHVlX2RhdGVgIGhhcyBwYXNzZWQsIHN0YW1wcyB0aGUgYnJlYWNoLCBlc2NhbGF0ZXMsIGFuZFxuICogYWxlcnRzIHRoZSBvd25lci5cbiAqXG4gKiBBIGJyZWFjaGVkIGNhc2Ugd2l0aCBOTyBvd25lciBpcyB0aGUgaGFyZCBjYXNlLCBhbmQgaXQgaXMgYW5zd2VyZWQgaW4gdHdvXG4gKiBoYWx2ZXMuIFRoZSBlc2NhbGF0aW9uIHRoZSBzd2VlcCB3cml0ZXMgaXMgaXRzZWxmIHdoYXQgZ2l2ZXMgdGhlIGNhc2UgYW5cbiAqIG93bmVyIFx1MjAxNCBgY2FzZV9lc2NhbGF0aW9uX3JlYXNzaWduYCByaWRlcyBvbiB0aGF0IHVwZGF0ZSBhbmQgaGFuZHMgdGhlIGNhc2UgdG9cbiAqIHRoZSBsZWFzdC1sb2FkZWQgYHNlcnZpY2VfbWFuYWdlcmAgXHUyMDE0IHNvIHRoaXMgZmxvdyByZS1yZWFkcyB0aGUgY2FzZVxuICogYWZ0ZXJ3YXJkcyBhbmQgYWxlcnRzIHdob2V2ZXIgaXQgbm93IGJlbG9uZ3MgdG8uIFdoZW4gdGhlIHBvb2wgaXMgZW1wdHkgdGhlXG4gKiBhc3NpZ25tZW50IGlzIGEgbm8tb3AsIHRoZSBjYXNlIHN0YXlzIHVub3duZWQsIHRoZSBhbGVydCBpcyBza2lwcGVkIGF0IGFcbiAqIG5hbWVkIGdhdGUsIGFuZCB0aGUgUlVOIFNVUlZJVkVTOiB0aGUgYnJlYWNoIGlzIHN0aWxsIHJlY29yZGVkIGFuZCBldmVyeVxuICogb3RoZXIgYnJlYWNoZWQgY2FzZSBpcyBzdGlsbCBzd2VwdC4gXHUyNkQ0IE5vIGZhbGxiYWNrIHJlY2lwaWVudCwgbm9cbiAqIG1hbmFnZXItY2hhaW4gZG90LXdhbGssIG5vIGhhcmQgZmFpbHVyZSAobWFpbnRhaW5lciBydWxpbmcgMjAyNi0wOS0wMykuXG4gKlxuICogQ2FwYWJpbGl0aWVzIGV4ZXJjaXNlZDogc2NoZWR1bGVkIHRyaWdnZXIgKyBgbG9vcGAgKyBgdXBkYXRlX3JlY29yZGAgK1xuICogYGdldF9yZWNvcmRgICsgYG5vdGlmeWAuXG4gKi9cblxuLyoqXG4gKiBcIlRoZSBjYXNlIGluIGhhbmQgY2FycmllcyBhbiBvd25lciB0aGUgYG5vdGlmeWAgbm9kZSBjYW4gYWRkcmVzcy5cIlxuICpcbiAqIEF1dGhvcmVkIE9OQ0UgYW5kIHVzZWQgb24gdHdvIGVkZ2VzIChgYjJgIGFuZCBgYjVgKSBiZWNhdXNlIHRoZSB0d28gYXNrIHRoZVxuICogc2FtZSBxdWVzdGlvbiBhdCB0d28gcG9pbnRzIGluIHRoZSBpdGVyYXRpb24gXHUyMDE0IGJlZm9yZSB0aGUgc3dlZXAncyB3cml0ZSBhbmRcbiAqIGFmdGVyIGl0IFx1MjAxNCBhbmQgYSBoYW5kLWNvcGllZCBzZWNvbmQgc3BlbGxpbmcgaXMgZXhhY3RseSB0aGUgZHJpZnQgbWVhc3VyZWQgb25cbiAqIGRlY2lzaW9uIG5vZGVzLiB7QGxpbmsgQ0FTRV9IQVNfTk9fT1dORVJ9IGlzIGl0cyBjb21wbGVtZW50LlxuICpcbiAqIFRPVEFMSVRZOiBgY3VycmVudENhc2VgIGlzIGEgTE9PUCBJVEVNIG92ZXIgYGNhc2VMaXN0YCwgd2hpY2hcbiAqIGBnZXRfcmVjb3JkYCBmaWxsZWQgZnJvbSBgZGF0YS5maW5kYCBcdTIwMTQgZXZlcnkgZWxlbWVudCBpcyBhIHJhdyBkcml2ZXIgcm93LFxuICogc3BhcnNlIGluIHRoZSB3YXkgYSByYXcgZHJpdmVyIHJvdyBpcy4gQSBjYXNlIHRoYXQgd2FzIG5ldmVyIHdyaXR0ZW4gd2l0aFxuICogYW4gYG93bmVyX2lkYCBjb2x1bW4gY2FycmllcyBubyBrZXkgYXQgYWxsLCBzbyBgaGFzKClgIGlzIHRoZSBvbmx5IHRvdGFsXG4gKiBhY2Nlc3NvcjsgYW4gdW5ndWFyZGVkIGB2YXJzLmN1cnJlbnRDYXNlLm93bmVyX2lkICE9IG51bGxgIGFib3J0cyB3aXRoXG4gKiBgTm8gc3VjaCBrZXlgIGFuZCB0YWtlcyB0aGUgcnVuIGRvd24gdGhlIHNhbWUgd2F5IGFuIGVtcHR5IHJlY2lwaWVudCBzbGF0ZVxuICogb25jZSBkaWQuXG4gKlxuICogRXZlcnkgdGVybSBpcyBsb2FkLWJlYXJpbmcsIGFuZCB0aGUgbGFzdCBvbmUgTUlSUk9SUyBUSEUgTk9USUZZIE5PREUnUyBPV05cbiAqIGVtcHRpbmVzcyBydWxlIHJhdGhlciB0aGFuIGd1ZXNzaW5nIGF0IGl0OiBidWlsdGluIGBub3RpZnlgIGJ1aWxkcyBpdHNcbiAqIGF1ZGllbmNlIHdpdGggYFN0cmluZyh2KS50cmltKClgICsgYC5maWx0ZXIoQm9vbGVhbilgLCBzbyBudWxsLCB1bmRlZmluZWQsXG4gKiBgJydgIEFORCBhbnkgYWxsLXdoaXRlc3BhY2UgdmFsdWUgYWxsIGNvbGxhcHNlIHRvIHRoZSBzYW1lIGVtcHR5IHNsYXRlLlxuICogTWVhc3VyZWQ6IGAnICAgJyAhPSBcIlwiYCBpcyBUUlVFIGluIENFTCwgc28gYSBnYXRlIHdyaXR0ZW4gdGhhdCB3YXkgb3BlbmVkIGZvclxuICogYSB3aGl0ZXNwYWNlIGBvd25lcl9pZGAgYW5kIHJlcHJvZHVjZWQgdGhpcyB2ZXJ5IGRlZmVjdCBvbmUgaW5wdXQgbmFycm93ZXIuXG4gKiBgc3RyaW5nKC4uLikudHJpbSgpICE9IFwiXCJgIGlzIHRoZSBzYW1lIHByZWRpY2F0ZSB0aGUgbm9kZSBhcHBsaWVzLCBpbiBDRUwuXG4gKlxuICogVGhlIGBzdHJpbmcoKWAgd3JhcCBpcyBub3QgZGVjb3JhdGlvbjogYmFyZSBgLm1hdGNoZXMoKWAgLyBgLnRyaW0oKWAgb24gYVxuICogbm9uLXN0cmluZyBpZCBmYWlscyB3aXRoIGBubyBtYXRjaGluZyBvdmVybG9hZGAsIHdoaWNoIGlzIGEgdGhyb3duIGNvbmRpdGlvblxuICogXHUyMDE0IHRoZSBmYXVsdCBtb2RlIHRoaXMgZmxvdyBleGlzdHMgdG8ga2VlcCBvdXQuIGBzdHJpbmcoKWAgaXMgdG90YWwgZm9yIGV2ZXJ5XG4gKiBub24tbnVsbCBzY2FsYXIsIGFuZCB0aGUgYCE9IG51bGxgIHRlcm0gaW4gZnJvbnQgc2hvcnQtY2lyY3VpdHMgYmVmb3JlIGl0IGNhblxuICogYmUgaGFuZGVkIGEgbnVsbCAoYHN0cmluZyhudWxsKWAgaGFzIG5vIG92ZXJsb2FkIGVpdGhlcikuXG4gKi9cbmNvbnN0IENBU0VfSEFTX09XTkVSID0gKCkgPT4gUGBoYXModmFycy5jdXJyZW50Q2FzZSkgJiYgaGFzKHZhcnMuY3VycmVudENhc2Uub3duZXJfaWQpXG4gICYmIHZhcnMuY3VycmVudENhc2Uub3duZXJfaWQgIT0gbnVsbCAmJiBzdHJpbmcodmFycy5jdXJyZW50Q2FzZS5vd25lcl9pZCkudHJpbSgpICE9IFwiXCJgO1xuXG4vKipcbiAqIFRoZSBleGFjdCBjb21wbGVtZW50IG9mIHtAbGluayBDQVNFX0hBU19PV05FUn0sIGluIHRoZSBvcHBvc2l0ZSBwb2xhcml0eSB0aGVcbiAqIGhvdXNlIHJ1bGUgcHJlc2NyaWJlcyBmb3IgYSBwYXJ0aXRpb24gKGAhaGFzKHgpIHx8IFx1MjAyNiBgKS5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgYGhhcyh2YXJzLmN1cnJlbnRDYXNlKWAgbGVhZHMgQk9USCBwcmVkaWNhdGVzIHJhdGhlciB0aGFuIGJlaW5nIG5lZ2F0ZWRcbiAqIGhlcmUsIHNvIHRoZSB0d28gZWRnZXMgcGFydGl0aW9uIG9ubHkgdGhlIGNhc2VzIHdoZXJlIHRoZSBpdGVyYXRvciBpcyBib3VuZC5cbiAqIFRoYXQgYXN5bW1ldHJ5IGlzIGRlbGliZXJhdGU6IHdpdGggbm8gYGN1cnJlbnRDYXNlYCBhdCBhbGwgTkVJVEhFUiBlZGdlXG4gKiBtYXRjaGVzIGFuZCB0aGUgaXRlcmF0aW9uIHNpbXBseSBlbmRzIFx1MjAxNCB0aGUgcHJlLWV4aXN0aW5nIGJlaGF2aW91ciBcdTIwMTQgaW5zdGVhZFxuICogb2Ygcm91dGluZyBhbiB1bmJpbmRhYmxlIHJvdyBpbnRvIGByZWxvYWRfY2FzZWAsIHdob3NlIGB7Y3VycmVudENhc2UuaWR9YFxuICogZmlsdGVyIHRva2VuIHdvdWxkIHRoZW4gcmVzb2x2ZSB0byBub3RoaW5nIGFuZCBtYWtlIGBnZXRfcmVjb3JkYCBSRUZVU0UgdGhlXG4gKiBzdGVwLCBraWxsaW5nIHRoZSBydW4gZm9yIHRoZSBleGFjdCByZWFzb24gdGhpcyBmbG93IHdhcyByZXBhaXJlZC5cbiAqL1xuY29uc3QgQ0FTRV9IQVNfTk9fT1dORVIgPSAoKSA9PiBQYGhhcyh2YXJzLmN1cnJlbnRDYXNlKSAmJiAoIWhhcyh2YXJzLmN1cnJlbnRDYXNlLm93bmVyX2lkKVxuICB8fCB2YXJzLmN1cnJlbnRDYXNlLm93bmVyX2lkID09IG51bGwgfHwgc3RyaW5nKHZhcnMuY3VycmVudENhc2Uub3duZXJfaWQpLnRyaW0oKSA9PSBcIlwiKWA7XG5cbmV4cG9ydCBjb25zdCBDYXNlU2xhTW9uaXRvckZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICdjYXNlX3NsYV9tb25pdG9yJyxcbiAgbGFiZWw6ICdDYXNlIFNMQSBNb25pdG9yJyxcbiAgZGVzY3JpcHRpb246ICdIb3VybHkgc3dlZXA6IGZsYWcgYW5kIGVzY2FsYXRlIG9wZW4gY2FzZXMgdGhhdCBoYXZlIGJyZWFjaGVkIHRoZWlyIFNMQSBkdWUgZGF0ZS4nLFxuICB0eXBlOiAnc2NoZWR1bGUnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBTY2hlZHVsZWQgcnVucyBoYXZlIG5vIHRyaWdnZXIgdXNlciwgc28gdW5kZXIgdGhlIGRlZmF1bHQgcnVuQXM6J3VzZXInIHRoZVxuICAvLyBkYXRhIG5vZGVzIGV4ZWN1dGUgVU5TQ09QRUQgYW55d2F5LiBEZWNsYXJlIHJ1bkFzOidzeXN0ZW0nIHRvIG1ha2UgdGhhdFxuICAvLyBSTFMtYnlwYXNzaW5nIGVsZXZhdGlvbiBleHBsaWNpdCBhbmQgaW50ZW5kZWQgKEFEUi0wMDQ5KS5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuXG4gIHZhcmlhYmxlczogW10sXG5cbiAgbm9kZXM6IFtcbiAgICB7IGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0IChob3VybHkpJywgY29uZmlnOiB7IHNjaGVkdWxlOiAnMCAqICogKiAqJyB9IH0sXG4gICAge1xuICAgICAgaWQ6ICdxdWVyeV9icmVhY2hlZCcsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdGaW5kIEJyZWFjaGVkIENhc2VzJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2Nhc2UnLFxuICAgICAgICAvLyBcdTI2RDQgYCRuaW5gIG9uIGBzdGF0dXNgLCBuZXZlciBgaXNfY2xvc2VkOiBmYWxzZWA6IGEgY2FzZSBpbiBgcmVzb2x2ZWRgXG4gICAgICAgIC8vIGhhcyBtZXQgaXRzIFNMQSBcdTIwMTQgd29yayBpcyBmaW5pc2hlZCBcdTIwMTQgYnV0IGBpc19jbG9zZWRgIG9ubHkgZmxpcHMgb25cbiAgICAgICAgLy8gYGNsb3NlZGAsIHNvIHRoZSBib29sZWFuIGZpbHRlciBzdGFtcHMgZmFsc2UgYnJlYWNoZXMgb24gcmVzb2x2ZWRcbiAgICAgICAgLy8gY2FzZXMgYW5kIGRyYWdzIHRoZW0gYmFjayB0byBgZXNjYWxhdGVkYC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYCRsdGAgaXMgYGNhc2VTbGFCcmVhY2hlZGAgKGBzcmMvc2VydmljZS9vYmplY3RzL19jYXNlLXNsYS50c2ApIHJlYWRcbiAgICAgICAgLy8gd2l0aCBcIm5vd1wiIGFzIHRoZSBpbnN0YW50OiBTVFJJQ1RMWSBwYXN0IGR1ZS4gSXRzIG90aGVyIGhhbGYgaXNcbiAgICAgICAgLy8gYGNhc2Vfc2xhX2RlZmF1bHRzYCwgd2hpY2ggYXBwbGllcyB0aGUgc2FtZSBydWxlIG9uIHRoZSB3cml0ZSB0aGF0XG4gICAgICAgIC8vIHNldHRsZXMgYSBjYXNlIFx1MjAxNCBzbyBhIGNhc2Ugc2V0dGxlZCBsYXRlIGlzIGZsYWdnZWQgZXZlbiB3aGVuIHRoaXNcbiAgICAgICAgLy8gc3dlZXAgbmV2ZXIgcmVhY2hlZCBpdCwgb3IgbmV2ZXIgcnVucyAoIzIwNzApLlxuICAgICAgICAvL1xuICAgICAgICAvLyBcIk5vd1wiIGlzIHRoZSBxdWVyeSBlbmdpbmUncyBvd24gYHtub3d9YCBwbGFjZWhvbGRlciwgd2hpY2ggYW5cbiAgICAgICAgLy8gMTguMC4wLW5leHQuMCBmaWx0ZXIgb3BlcmFuZCBsZWF2ZXMgdG8gdGhlIGVuZ2luZSBhcyB3cml0dGVuLiBJdFxuICAgICAgICAvLyByZW5kZXJzIHRoZSBpbnN0YW50J3MgSVNPIHRleHQsIGFzIHRoZSByZXRpcmVkIGB7Tk9XKCl9YCBmbG93IHRva2VuXG4gICAgICAgIC8vIGRpZCwgYW5kIGl0IGlzIHRoZSBzcGVsbGluZyB0aGUgU0xBIFZpb2xhdGlvbnMgdGlsZSByZWFkcywgc28gdGhlXG4gICAgICAgIC8vIHN3ZWVwIGFuZCB0aGUgdGlsZSBzYXkgXCJwYXN0IGR1ZVwiIGluIG9uZSB3b3JkaW5nLlxuICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICBzdGF0dXM6IHsgJG5pbjogWydyZXNvbHZlZCcsICdjbG9zZWQnXSB9LFxuICAgICAgICAgIGlzX3NsYV92aW9sYXRlZDogZmFsc2UsXG4gICAgICAgICAgc2xhX2R1ZV9kYXRlOiB7ICRsdDogJ3tub3d9JyB9LFxuICAgICAgICB9LFxuICAgICAgICBsaW1pdDogNTAwLFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2Nhc2VMaXN0JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2xvb3BfY2FzZXMnLCB0eXBlOiAnbG9vcCcsIGxhYmVsOiAnRm9yIEVhY2ggQnJlYWNoZWQgQ2FzZScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgY29sbGVjdGlvbjogY2VsYGNhc2VMaXN0YCxcbiAgICAgICAgaXRlcmF0b3JWYXJpYWJsZTogJ2N1cnJlbnRDYXNlJyxcbiAgICAgICAgYm9keTogZ3VhcmRlZCgnY2FzZScsIHtcbiAgICAgICAgICBub2RlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogJ2ZsYWdfYnJlYWNoJywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ0ZsYWcgU0xBIEJyZWFjaCcsXG4gICAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fY2FzZScsXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7IGlkOiBjZWxgY3VycmVudENhc2UuaWRgIH0sXG4gICAgICAgICAgICAgICAgLy8gYGVzY2FsYXRpb25fcmVhc29uYCBtdXN0IGFjY29tcGFueSBgaXNfZXNjYWxhdGVkOiB0cnVlYCBcdTIwMTQgdGhlXG4gICAgICAgICAgICAgICAgLy8gb2JqZWN0J3MgYGVzY2FsYXRpb25fcmVhc29uX3JlcXVpcmVkYCB2YWxpZGF0aW9uIChzZXZlcml0eTpcbiAgICAgICAgICAgICAgICAvLyBlcnJvcikgcmVqZWN0cyB0aGUgd2hvbGUgd3JpdGUgb3RoZXJ3aXNlLCB0dXJuaW5nIHRoaXMgc3dlZXBcbiAgICAgICAgICAgICAgICAvLyBpbnRvIGEgc2lsZW50IG5vLW9wIChjZi4gdGhlIHNhbWUgZml4IGluIGNhc2VfZXNjYWxhdGlvbikuXG4gICAgICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgICAgICBpc19zbGFfdmlvbGF0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICBpc19lc2NhbGF0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICBzdGF0dXM6ICdlc2NhbGF0ZWQnLFxuICAgICAgICAgICAgICAgICAgZXNjYWxhdGVkX2RhdGU6IGNlbGBpc29EYXRldGltZShub3coKSlgLFxuICAgICAgICAgICAgICAgICAgZXNjYWxhdGlvbl9yZWFzb246ICdBdXRvLWVzY2FsYXRlZDogU0xBIGR1ZSBkYXRlIGJyZWFjaGVkJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gR2F0ZXdheSBvbmx5IFx1MjAxNCB0aGUgcHJlZGljYXRlIGxpdmVzIG9uIHRoZSBvdXQtZWRnZS5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gYGNybV9jYXNlLm93bmVyX2lkYCBpcyBOVUxMQUJMRSBhbmQgYW4gdW5vd25lZCBjYXNlIGlzIGFuXG4gICAgICAgICAgICAgIC8vIG9yZGluYXJ5IHN0YXRlICh0aGlzIHJlcG8gc2hpcHMgYHNjcmlwdHMvYmFja2ZpbGwtb3duZXItaWQudHNgIC9cbiAgICAgICAgICAgICAgLy8gYHBucG0gYmFja2ZpbGw6b3duZXJgIHByZWNpc2VseSBiZWNhdXNlIG93bmVybGVzcyByb3dzIGhhcHBlbjtcbiAgICAgICAgICAgICAgLy8gb3JkaW5hcnkgUkVTVCBjcmVhdGlvbiBhbmQgaW1wb3J0IHJlYWNoIGl0IHRvbykuIFRoZSBgbm90aWZ5YFxuICAgICAgICAgICAgICAvLyBub2RlIGJlbG93IGFkZHJlc3NlcyBleGFjdGx5IG9uZSByZWNpcGllbnQsIHNvIGFuIG93bmVybGVzcyBjYXNlXG4gICAgICAgICAgICAgIC8vIGxlZnQgaXQgd2l0aCBhbiBlbXB0eSBzbGF0ZSBcdTIwMTQgd2hpY2ggdGhlIGJ1aWx0aW4gbm9kZSB0cmVhdHMgYXMgYVxuICAgICAgICAgICAgICAvLyBIQVJEIGZhaWx1cmUsIGFuZCB0aGF0IGZhaWx1cmUgaXMgbm90IHNjb3BlZCB0byB0aGUgb25lIGNhc2U6XG4gICAgICAgICAgICAgIC8vIGBleGVjdXRlTm9kZWAgdGhyb3dzLCBgcnVuUmVnaW9uYCByZXRocm93cywgYW5kIHRoZSBgbG9vcGAgbm9kZVxuICAgICAgICAgICAgICAvLyBhd2FpdHMgaXQgd2l0aCBubyB0cnkvY2F0Y2gsIHNvIHRoZSB3aG9sZSBzd2VlcCBkaWVkIG9uIHRoZVxuICAgICAgICAgICAgICAvLyBvd25lcmxlc3Mgcm93IGFuZCBldmVyeSBicmVhY2hlZCBjYXNlIE9SREVSRUQgQkVISU5EIElUIHdhc1xuICAgICAgICAgICAgICAvLyBuZXZlciBldmVuIGZsYWdnZWQuIE1lYXN1cmVkLCBub3QgYXNzdW1lZCBcdTIwMTQgc2VlXG4gICAgICAgICAgICAgIC8vIGB0ZXN0L2Zsb3ctc2xhLW93bmVybGVzcy1jYXNlLnRlc3QudHNgLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBUaGUgZ2F0ZSBzaXRzIEFGVEVSIGBmbGFnX2JyZWFjaGAgb24gcHVycG9zZS4gYGZsYWdfYnJlYWNoYCBpc1xuICAgICAgICAgICAgICAvLyB1bmNvbmRpdGlvbmFsLCBzbyBhbiBvd25lcmxlc3MgYnJlYWNoIGlzIHN0aWxsIFJFQ09SREVEIG9uIHRoZVxuICAgICAgICAgICAgICAvLyByZWNvcmQgXHUyMDE0IHZpc2libGUgaW4gdmlld3MgYW5kIHJlcG9ydHMsIHdoZXJlIGEgc2VydmljZSBtYW5hZ2VyXG4gICAgICAgICAgICAgIC8vIGZpbmRzIGl0LiBHYXRpbmcgYm90aCB3b3VsZCB0cmFkZSBhIGRlYWQgcnVuIGZvciBhIHNpbGVudGx5XG4gICAgICAgICAgICAgIC8vIGRyb3BwZWQgYWxlcnQgb24gZXhhY3RseSB0aGUgY2FzZXMgbW9zdCBsaWtlbHkgdG8gYmUgbmVnbGVjdGVkLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBUaGUgb3duZXJsZXNzIGJyYW5jaCBpcyBub3QgYSBkZWFkIGVuZDogaXQgZ29lcyB0b1xuICAgICAgICAgICAgICAvLyBgcmVsb2FkX2Nhc2VgLCBiZWNhdXNlIGJ5IHRoZSB0aW1lIHRoZSBnYXRlIGlzIHJlYWNoZWQgdGhlXG4gICAgICAgICAgICAgIC8vIHN3ZWVwJ3Mgb3duIHdyaXRlIG1heSBBTFJFQURZIEhBVkUgR0lWRU4gVEhFIENBU0UgQU4gT1dORVIgXHUyMDE0XG4gICAgICAgICAgICAgIC8vIHNlZSB0aGF0IG5vZGUgKG1haW50YWluZXIgcnVsaW5nIDIwMjYtMDktMDMsIG9wdGlvbiBDKS5cbiAgICAgICAgICAgICAgaWQ6ICdjaGVja19vd25lcicsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnQ2FzZSBIYXMgYW4gT3duZXI/JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIFJlLXJlYWQgdGhlIGNhc2UgdGhlIHN3ZWVwIGp1c3Qgd3JvdGUuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFx1MjZBMFx1RkUwRiBUSEUgQVNTSUdOTUVOVCBJUyBOT1QgQVVUSE9SRUQgSEVSRSwgQU5EIE1VU1QgTk9UIEJFLlxuICAgICAgICAgICAgICAvLyBgZmxhZ19icmVhY2hgIHdyaXRlcyBgc3RhdHVzOiAnZXNjYWxhdGVkJ2AsIGFuZCB0aGF0IElTIHRoZVxuICAgICAgICAgICAgICAvLyBlc2NhbGF0aW9uIHRyYW5zaXRpb24gYGNhc2VfZXNjYWxhdGlvbl9yZWFzc2lnbmBcbiAgICAgICAgICAgICAgLy8gKGBzcmMvc2VydmljZS9vYmplY3RzL19jYXNlLWFzc2lnbm1lbnQudHNgLCBgYmVmb3JlVXBkYXRlYCwgcHJpb3JpdHlcbiAgICAgICAgICAgICAgLy8gMjUwKSBmaXJlcyBvbjogaXQgc3RhbXBzIHRoZSBsZWFzdC1sb2FkZWQgaG9sZGVyIG9mIHRoZVxuICAgICAgICAgICAgICAvLyBgc2VydmljZV9tYW5hZ2VyYCBwb3NpdGlvbiBvbnRvIHRoZSBwYXlsb2FkIG9mIHRoZSB1cGRhdGVcbiAgICAgICAgICAgICAgLy8gYWxyZWFkeSBpbiBmbGlnaHQuIFNvIHRoZSBzd2VlcCBkb2VzIG5vdCBuZWVkIGEgc2VhbSB0byBcImNhbGxcIlxuICAgICAgICAgICAgICAvLyB0aGUgYXNzaWdubWVudCBcdTIwMTQgcGVyZm9ybWluZyB0aGUgdHJhbnNpdGlvbiBJUyBwdXR0aW5nIHRoZSBjYXNlXG4gICAgICAgICAgICAgIC8vIHRocm91Z2ggaXQsIGFuZCB0aGUgYXBwIGtlZXBzIE9ORSBhbnN3ZXIgdG8gXCJ3aG8gc2hvdWxkIG93blxuICAgICAgICAgICAgICAvLyB0aGlzIGNhc2VcIiBpbnN0ZWFkIG9mIGEgZmxvdy1zaGFwZWQgc2Vjb25kIGltcGxlbWVudGF0aW9uIG9mXG4gICAgICAgICAgICAgIC8vIGxlYXN0LWxvYWRlZCBiYWxhbmNpbmcuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIE1FQVNVUkVELCBub3QgYXNzdW1lZCAoYHRlc3QvZmxvdy1zbGEtb3duZXJsZXNzLWNhc2UudGVzdC50c2BcbiAgICAgICAgICAgICAgLy8gZHJpdmVzIHRoZSByZWFsIGZsb3csIHRoZSByZWFsIGVuZ2luZSBhbmQgdGhlIHJlYWwgaG9va3MpOiB3aXRoXG4gICAgICAgICAgICAgIC8vIGEgc3RhZmZlZCBwb29sIGFuIG93bmVybGVzcyBicmVhY2hlZCBjYXNlIGNvbWVzIGJhY2sgb3duZWQ7IHdpdGhcbiAgICAgICAgICAgICAgLy8gYW4gZW1wdHkgcG9vbCB0aGUgaG9vayBzdGFuZHMgZG93biBhbmQgdGhlIGNhc2UgY29tZXMgYmFja1xuICAgICAgICAgICAgICAvLyBvd25lcmxlc3MuIE5vIHNlY29uZCB3cml0ZSwgbm8gcmUtZW50cnksIG5vIGxvb3AgXHUyMDE0IHRoZSBob29rXG4gICAgICAgICAgICAgIC8vIG11dGF0ZXMgdGhlIGluLWZsaWdodCBwYXlsb2FkIGFuZCBpc3N1ZXMgbm8gb3BlcmF0aW9uIG9mIGl0c1xuICAgICAgICAgICAgICAvLyBvd24uXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFx1MjZENCBUaGUgUkVBRCBpcyB3aGF0IHRoaXMgbm9kZSBpcyBmb3IsIG5vdCBhIHNlY29uZCB3cml0ZTpcbiAgICAgICAgICAgICAgLy8gYGN1cnJlbnRDYXNlYCBpcyB0aGUgbG9vcCBpdGVtIGJvdW5kIGJ5IGBxdWVyeV9icmVhY2hlZGAgQkVGT1JFXG4gICAgICAgICAgICAgIC8vIGBmbGFnX2JyZWFjaGAgcmFuLCBzbyB0aGUgb3duZXIgdGhlIHN3ZWVwIGp1c3QgYXNzaWduZWQgaXNcbiAgICAgICAgICAgICAgLy8gaW52aXNpYmxlIHRvIGl0IGFuZCBge2N1cnJlbnRDYXNlLm93bmVyX2lkfWAgYWRkcmVzc2VzIHRoZVxuICAgICAgICAgICAgICAvLyBwcmUtd3JpdGUgc3RhdGUuIFJlLWJpbmRpbmcgdGhlIFNBTUUgdmFyaWFibGUgaXMgd2hhdCBtYWtlcyB0aGVcbiAgICAgICAgICAgICAgLy8gcmVzdCBvZiB0aGUgaXRlcmF0aW9uIFx1MjAxNCB0aGUgZ2F0ZSBiZWxvdyBhbmQgdGhlIG5vdGlmeSBub2RlJ3NcbiAgICAgICAgICAgICAgLy8gd2hvbGUgdGVtcGxhdGUgXHUyMDE0IHJlYWQgdGhlIGNhc2UgYXMgaXQgbm93IHN0YW5kcywgd2l0aCBubyBzZWNvbmRcbiAgICAgICAgICAgICAgLy8gbm90aWZ5IG5vZGUgdG8ga2VlcCBpbiBzdGVwLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBObyBgbGltaXRgOiBgZ2V0X3JlY29yZGAgY2FsbHMgYGZpbmRPbmVgIGF0IG9yIGJlbG93IDEgYW5kIGJpbmRzXG4gICAgICAgICAgICAgIC8vIHRoZSBzaW5nbGUgcm93IGl0c2VsZiwgd2hpY2ggaXMgd2hhdCBge2N1cnJlbnRDYXNlLjxmaWVsZD59YFxuICAgICAgICAgICAgICAvLyBuZWVkcy4gQSBtaXNzIGJpbmRzIGBudWxsYCBcdTIwMTQgYGdldF9yZWNvcmRgIGFsd2F5cyBiaW5kcyBcdTIwMTQgd2hpY2hcbiAgICAgICAgICAgICAgLy8gYGNoZWNrX2Fzc2lnbmVkYCBiZWxvdyBpcyB0aGVyZSB0byByZWFkLlxuICAgICAgICAgICAgICBpZDogJ3JlbG9hZF9jYXNlJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ1JlLXJlYWQgQ2FzZSBBZnRlciBFc2NhbGF0aW9uJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9jYXNlJyxcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGBjdXJyZW50Q2FzZS5pZGAgfSxcbiAgICAgICAgICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2N1cnJlbnRDYXNlJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIEdhdGV3YXkgb25seSBcdTIwMTQgdGhlIHByZWRpY2F0ZSBsaXZlcyBvbiB0aGUgb3V0LWVkZ2UuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFRoZSBydWxlZCBlbXB0eS1wb29sIGNsYXVzZSwgYXMgYSBnYXRlIHJhdGhlciB0aGFuIGEgZmFpbHVyZTpcbiAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgYHNlcnZpY2VfbWFuYWdlcmAgcG9vbCByZXNvbHZlcyBlbXB0eSB0aGUgaG9vayBhc3NpZ25zXG4gICAgICAgICAgICAgIC8vIG5vYm9keSwgdGhlIHJlLXJlYWQgY2FzZSBpcyBzdGlsbCBvd25lcmxlc3MsIG5vIGVkZ2UgbWF0Y2hlcyBhbmRcbiAgICAgICAgICAgICAgLy8gdGhlIGl0ZXJhdGlvbiBlbmRzLiBUaGUgYnJlYWNoIHN0YXlzIG9uIHRoZSByZWNvcmQgYW5kIGluIHRoZVxuICAgICAgICAgICAgICAvLyBydW4gc3VtbWFyeSwgdGhlIG5vdGlmaWNhdGlvbiBpcyBza2lwcGVkIGF0IGEgTkFNRUQgZ2F0ZSwgYW5kXG4gICAgICAgICAgICAgIC8vIHRoZSBydW4gc3Vydml2ZXMuIFx1MjZENCBObyBoYXJkIGZhaWx1cmUsIG5vIGZhbGxiYWNrIHJlY2lwaWVudCwgbm9cbiAgICAgICAgICAgICAgLy8gbWFuYWdlci1jaGFpbiBkb3Qtd2Fsay5cbiAgICAgICAgICAgICAgaWQ6ICdjaGVja19hc3NpZ25lZCcsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnRXNjYWxhdGlvbiBGb3VuZCBhbiBPd25lcj8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gT3duZXIgb25seTogYHtjdXJyZW50Q2FzZS5vd25lcl9pZC5tYW5hZ2VyfWAgY2Fubm90IHRyYXZlcnNlIGFcbiAgICAgICAgICAgICAgLy8gbG9va3VwIGluIGZsb3cgdGVtcGxhdGVzIFx1MjAxNCBpdCBpbnRlcnBvbGF0ZXMgdG8gdGhlIGxpdGVyYWxcbiAgICAgICAgICAgICAgLy8gXCJ1bmRlZmluZWRcIiAoY2YuIGNhc2VfZXNjYWxhdGlvbiAvIG9wcG9ydHVuaXR5X3dvbl9hbGVydCkuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFJlYWNoZWQgZnJvbSBCT1RIIGdhdGVzLCBhbmQgdGhlIHdob2xlIHRlbXBsYXRlIHJlYWRzXG4gICAgICAgICAgICAgIC8vIGBjdXJyZW50Q2FzZWAgZWl0aGVyIHdheTogb24gdGhlIG93bmVkIGJyYW5jaCB0aGF0IGlzIHRoZSByb3dcbiAgICAgICAgICAgICAgLy8gYHF1ZXJ5X2JyZWFjaGVkYCBib3VuZCwgb24gdGhlIG93bmVybGVzcyBicmFuY2ggdGhlIHJvd1xuICAgICAgICAgICAgICAvLyBgcmVsb2FkX2Nhc2VgIHJlLWJvdW5kLiBPbmUgbm9kZSwgb25lIHdvcmRpbmcsIG9uZSByZWNpcGllbnRcbiAgICAgICAgICAgICAgLy8gcnVsZSBcdTIwMTQgYSBzZWNvbmQgbm90aWZ5IG5vZGUgd291bGQgYmUgdGhlIHNhbWUgYWxlcnQgYXV0aG9yZWRcbiAgICAgICAgICAgICAgLy8gdHdpY2UsIGZyZWUgdG8gZHJpZnQgb24gdGhlIGhhbGYgbm9ib2R5IGlzIGxvb2tpbmcgYXQuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFx1MjZBMFx1RkUwRiBUSEUgUkVDSVBJRU5UIElTIFJVTEVELCBOT1QgSU5DSURFTlRBTCBcdTIwMTQgIzE1MzUsIG1haW50YWluZXJcbiAgICAgICAgICAgICAgLy8gcnVsaW5nIDIwMjYtMDktMDcsIG9wdGlvbiBBLiBPbiBhIGJyZWFjaGVkXG4gICAgICAgICAgICAgIC8vIGNhc2UgdGhhdCBBTFJFQURZIEhBUyBBTiBPV05FUiwgYGZsYWdfYnJlYWNoYCB3cml0ZXNcbiAgICAgICAgICAgICAgLy8gYHN0YXR1czogJ2VzY2FsYXRlZCdgIGFuZCBgY2FzZV9lc2NhbGF0aW9uX3JlYXNzaWduYCBoYW5kcyB0aGVcbiAgICAgICAgICAgICAgLy8gY2FzZSB0byB0aGUgbGVhc3QtbG9hZGVkIGBzZXJ2aWNlX21hbmFnZXJgIGluc2lkZSB0aGF0IHNhbWVcbiAgICAgICAgICAgICAgLy8gd3JpdGUgXHUyMDE0IHlldCB0aGlzIG5vZGUgYWRkcmVzc2VzIGBjdXJyZW50Q2FzZWAgYXNcbiAgICAgICAgICAgICAgLy8gYHF1ZXJ5X2JyZWFjaGVkYCBib3VuZCBpdCwgQkVGT1JFIHRoZSBoYW5kLW9mZi4gU28gdGhlIGJyZWFjaFxuICAgICAgICAgICAgICAvLyBhbGVydCBkZWxpYmVyYXRlbHkgcmVhY2hlcyB0aGUgYWdlbnQgdGhlIGNhc2UgaXMgYmVpbmcgdGFrZW5cbiAgICAgICAgICAgICAgLy8gRlJPTSwgbm90IHRoZSBtYW5hZ2VyIHdobyBub3cgb3ducyBpdC5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gSXQgaXMgdGhlIFNBTUUgZXRpcXVldHRlIGBjYXNlX2VzY2FsYXRpb25gIGFscmVhZHkgc3RhdGVzIGluXG4gICAgICAgICAgICAgIC8vIGBjb250ZW50L2RvY3Mvc2VydmljZS9zbGEtYW5kLWVzY2FsYXRpb24ubWR4YCBcdTIwMTQgXCJ0aGVcbiAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIGdvZXMgdG8gdGhlIHByZXZpb3VzIG93bmVyIGFsb25lXCIgXHUyMDE0IGFuZCB0aGF0IHBhZ2VcbiAgICAgICAgICAgICAgLy8gbm93IHN0YXRlcyBpdCBmb3IgdGhpcyBzd2VlcCB0b28uIE9uZSBlc2NhbGF0aW9uIGV0aXF1ZXR0ZVxuICAgICAgICAgICAgICAvLyBhY3Jvc3MgYm90aCBtZWNoYW5pc21zLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBcdTI2RDQgRG8gbm90IFwiZml4XCIgdGhpcyBpbnRvIGFuIGFsZXJ0IGZvciB0aGUgbmV3IG93bmVyLiBUaGF0IGlzXG4gICAgICAgICAgICAgIC8vIG9wdGlvbiBDLCBhbmQgaXQgd291bGQgaGF2ZSB0byByZS1ydWxlIGBjYXNlX2VzY2FsYXRpb25gIGluIHRoZVxuICAgICAgICAgICAgICAvLyBzYW1lIHN0cm9rZSBcdTIwMTQgXHUyNkQ0IG5ldmVyIG9uZSBtZWNoYW5pc20gb25seS5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gYHRlc3QvZmxvdy1zbGEtb3duZXJsZXNzLWFzc2lnbm1lbnQudGVzdC50c2AgcGlucyB0aGUgcGFpcmluZ1xuICAgICAgICAgICAgICAvLyAodGhlIG93bmVkIGJyZWFjaCBJUyBoYW5kZWQgb3ZlciBBTkQgaXRzIGFsZXJ0IHN0aWxsIGdvZXMgdG9cbiAgICAgICAgICAgICAgLy8gdGhlIHByZS1oYW5kLW9mZiBvd25lciksIGFuZCByZWNvcmRzIHRoZSBydWxpbmcncyBkZWNsYXJlZCBnYXBcbiAgICAgICAgICAgICAgLy8gYXMgbWVhc3VyZWQ6IHRoZSBoYW5kLW9mZiBob29rIGlzc3VlcyBubyBub3RpY2Ugb2YgaXRzIG93biwgc29cbiAgICAgICAgICAgICAgLy8gdGhlIHJlY2VpdmluZyBtYW5hZ2VyIGlzIHRvbGQgbm90aGluZyBieSB0aGlzIHJ1bi5cbiAgICAgICAgICAgICAgaWQ6ICdub3RpZnlfdGVhbScsIHR5cGU6ICdub3RpZnknLCBsYWJlbDogJ0FsZXJ0IE93bmVyJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgLy8gT3duZXIgb25seSBcdTIwMTQgYHtjdXJyZW50Q2FzZS5vd25lcl9pZC5tYW5hZ2VyfWAgZG90LXdhbGtzIGFcbiAgICAgICAgICAgICAgICAvLyBsb29rdXAsIHdoaWNoIGZsb3cgdGVtcGxhdGVzIGludGVycG9sYXRlIGFzIFwidW5kZWZpbmVkXCIuXG4gICAgICAgICAgICAgICAgcmVjaXBpZW50czogW2NlbGBjdXJyZW50Q2FzZS5vd25lcl9pZGBdLFxuICAgICAgICAgICAgICAgIGNoYW5uZWxzOiBbJ2luYm94JywgJ2VtYWlsJ10sXG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdjcml0aWNhbCcsXG4gICAgICAgICAgICAgICAgdG9waWM6ICdjYXNlX3NsYV9icmVhY2gnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnY3JtLmNhc2Vfc2xhX2JyZWFjaCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVEYXRhOiB7XG4gICAgICAgICAgICAgICAgICBjYXNlX251bWJlcjogY2VsYGN1cnJlbnRDYXNlLmNhc2VfbnVtYmVyYCwgcHJpb3JpdHk6IGNlbGBjdXJyZW50Q2FzZS5wcmlvcml0eWAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhY3Rpb25Vcmw6ICcvY3JtX2Nhc2Uve3tjdXJyZW50Q2FzZS5pZH19JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBlZGdlczogW1xuICAgICAgICAgICAgeyBpZDogJ2IxJywgc291cmNlOiAnZmxhZ19icmVhY2gnLCB0YXJnZXQ6ICdjaGVja19vd25lcicsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgICAgLy8gVGhlIHR3byBvdXQtZWRnZXMgb2YgYGNoZWNrX293bmVyYCBhcmUgYW4gZXhhY3QgUEFSVElUSU9OIG9mIHRoZVxuICAgICAgICAgICAgLy8gY2FzZXMgd2hlcmUgYGN1cnJlbnRDYXNlYCBpcyBib3VuZCAoc2VlIHtAbGluayBDQVNFX0hBU19PV05FUn0gL1xuICAgICAgICAgICAgLy8ge0BsaW5rIENBU0VfSEFTX05PX09XTkVSfSkgXHUyMDE0IG5ldmVyIGEgYGRlZmF1bHRgIGVkZ2UgYWxvbmdzaWRlIGFcbiAgICAgICAgICAgIC8vIGNvbmRpdGlvbmFsIG9uZSwgd2hpY2ggd291bGQgdHJhdmVyc2UgQk9USCBhbmQgbm90aWZ5IHR3aWNlLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFx1MjZBMFx1RkUwRiBUaGUgb3duZWQgYnJhbmNoIHJlYWRzIGBjdXJyZW50Q2FzZWAgYXMgYHF1ZXJ5X2JyZWFjaGVkYCBib3VuZFxuICAgICAgICAgICAgLy8gaXQsIGRlbGliZXJhdGVseTogYSBjYXNlIHRoYXQgYWxyZWFkeSBoYWQgYW5cbiAgICAgICAgICAgIC8vIG93bmVyIGtlZXBzIGFsZXJ0aW5nIFRIQVQgb3duZXIsIHdoaWNoIGlzIHdoYXQgdGhlIHN3ZWVwIGhhc1xuICAgICAgICAgICAgLy8gYWx3YXlzIGRvbmUuIFx1MjZBMFx1RkUwRiBUaGF0IGlzIFJVTEVEIGludGVudCBub3csIG5vIGxvbmdlciBhbiBvcGVuXG4gICAgICAgICAgICAvLyBxdWVzdGlvbiBcdTIwMTQgdGhlIGBub3RpZnlfdGVhbWAgbm9kZSBjYXJyaWVzIHRoZSBydWxpbmcuXG4gICAgICAgICAgICB7IGlkOiAnYjInLCBzb3VyY2U6ICdjaGVja19vd25lcicsIHRhcmdldDogJ25vdGlmeV90ZWFtJywgdHlwZTogJ2NvbmRpdGlvbmFsJywgY29uZGl0aW9uOiBDQVNFX0hBU19PV05FUigpLCBsYWJlbDogJ0hhcyBvd25lcicgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiMycsIHNvdXJjZTogJ2NoZWNrX293bmVyJywgdGFyZ2V0OiAncmVsb2FkX2Nhc2UnLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IENBU0VfSEFTX05PX09XTkVSKCksIGxhYmVsOiAnTm8gb3duZXIgXHUyMDE0IHJlLXJlYWQgYWZ0ZXIgZXNjYWxhdGlvbicgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiNCcsIHNvdXJjZTogJ3JlbG9hZF9jYXNlJywgdGFyZ2V0OiAnY2hlY2tfYXNzaWduZWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAgICAgICAgIC8vIEJvdGggYnJhbmNoZXMgY29udmVyZ2Ugb24gdGhlIE9ORSBub3RpZnkgbm9kZSwgd2hpY2ggaXMgd2h5IHRoZVxuICAgICAgICAgICAgLy8gcmUtcmVhZCByZS1iaW5kcyBgY3VycmVudENhc2VgIHJhdGhlciB0aGFuIGEgc2Vjb25kIHZhcmlhYmxlOiB0aGVcbiAgICAgICAgICAgIC8vIHJlY2lwaWVudCwgdGhlIHRpdGxlLCB0aGUgbWVzc2FnZSBhbmQgdGhlIGFjdGlvbiBVUkwgYXJlIGF1dGhvcmVkXG4gICAgICAgICAgICAvLyBvbmNlIGFuZCBjYW5ub3QgZHJpZnQgaW50byB0d28gdmVyc2lvbnMgb2YgdGhlIHNhbWUgYWxlcnQuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQSBnYXRlIHdpdGggbm8gbWF0Y2hpbmcgZWRnZSBzaW1wbHkgZW5kcyB0aGUgaXRlcmF0aW9uLCBzbyBhblxuICAgICAgICAgICAgLy8gb3duZXJsZXNzIGNhc2UgdGhlIHBvb2wgY291bGQgbm90IHBsYWNlIGlzIHNraXBwZWQgYW5kIHRoZSBsb29wXG4gICAgICAgICAgICAvLyBtb3ZlcyBvbiB0byB0aGUgbmV4dCBicmVhY2hlZCBjYXNlIFx1MjAxNCB0aGUgcnVuIHN1cnZpdmVzLCB3aGljaCBpc1xuICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5IHRoaXMgZmxvdyB3YXMgcmVwYWlyZWQgZm9yLlxuICAgICAgICAgICAgeyBpZDogJ2I1Jywgc291cmNlOiAnY2hlY2tfYXNzaWduZWQnLCB0YXJnZXQ6ICdub3RpZnlfdGVhbScsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogQ0FTRV9IQVNfT1dORVIoKSwgbGFiZWw6ICdFc2NhbGF0aW9uIGFzc2lnbmVkIGFuIG93bmVyJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG5cbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ3F1ZXJ5X2JyZWFjaGVkJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAncXVlcnlfYnJlYWNoZWQnLCB0YXJnZXQ6ICdsb29wX2Nhc2VzJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UzJywgc291cmNlOiAnbG9vcF9jYXNlcycsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL19ndWFyZGVkLWl0ZXJhdGlvbi50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9fZ3VhcmRlZC1pdGVyYXRpb24udHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogUGVyLWl0ZXJhdGlvbiBjb250YWlubWVudCBmb3IgYGxvb3BgIGJvZGllcyBcdTIwMTQgdGhlIG9uZSBzcGVsbGluZywgaW4gb25lIHBsYWNlLlxuICpcbiAqICMjIFRoZSBkZWZlY3QgdGhpcyBjbG9zZXNcbiAqXG4gKiBgbG9vcC1ub2RlLnRzYCBpdGVyYXRlcyBpdHMgYm9keSB3aXRoIGEgYmFyZSBgYXdhaXRgIGFuZCBoYXMgbm8gYHRyeWAvYGNhdGNoYFxuICogYXQgYWxsLCBzbyBhIGJvZHkgbm9kZSB0aGF0IHJldHVybnMgYHN1Y2Nlc3M6IGZhbHNlYCBvciB0aHJvd3MgcHJvcGFnYXRlc1xuICogc3RyYWlnaHQgb3V0IG9mIHRoZSBjb250YWluZXIuIFRoZSBmaXJzdCBmYWlsaW5nIGl0ZW0gdGhlcmVmb3JlIGVuZHMgdGhlXG4gKiBXSE9MRSBydW46IGV2ZXJ5IGxhdGVyIGl0ZW0gaXMgbmV2ZXIgcHJvY2Vzc2VkLCBhbmQgdGhlIHdvcmsgYWxyZWFkeSBkb25lIGlzXG4gKiBub3QgZXZlbiByZXBvcnRlZC4gTWVhc3VyZWQgYnkgdGhlIHBsYXRmb3JtIG9uIHRoZSByZWFsIGVuZ2luZSBcdTIwMTQgYSA1LWl0ZW1cbiAqIHN3ZWVwIGZhaWxpbmcgYXQgaXRlbSAzIHRvdWNoZWQgMyBpdGVtcyBhbmQgcmVwb3J0ZWQgYGFjdGVkOiAwYC5cbiAqXG4gKiBUaGF0IGlzIHdoYXQgYG9iamVjdHN0YWNrIGxpbnRgJ3MgYGZsb3ctbG9vcC1ib2R5LXVuY29udGFpbmVkYCBuYW1lcywgYW5kIHRoZVxuICogY29udGFpbm1lbnQgaXQgcHJlc2NyaWJlcyBpcyBhIGB0cnlfY2F0Y2hgIElOU0lERSB0aGUgYm9keSB3aXRoIHRoZSByZWFsIHdvcmtcbiAqIG1vdmVkIGludG8gaXRzIGB0cnlgIHJlZ2lvbi5cbiAqXG4gKiAjIyBXaHkgYSBoZWxwZXIgcmF0aGVyIHRoYW4gdGhlIGxpdGVyYWwgMjJ4IHNwZWxsaW5nXG4gKlxuICogV3JpdGluZyB0aGUgYHRyeV9jYXRjaGAgb3V0IGF0IGVhY2ggb2YgdGhlIDIyIHdhcm5lZCBsb29wcyByZS1pbmRlbnRzIGV2ZXJ5XG4gKiBib2R5IGJ5IHR3byBsZXZlbHMsIGFuZCB0aGUgcmUtaW5kZW50YXRpb24gQUxPTkUgbWVhc3VyZWQgfjEsMzI3IHRva2VucyBvdmVyXG4gKiB0aGUgYGJ1c2luZXNzIHNlbWFudGljc2AgY2VpbGluZyBvZiBgcG5wbSBoeWdpZW5lOnRva2Vuc2AgXHUyMDE0IGEgY2VpbGluZyB0aGF0XG4gKiBtb3ZlcyBvbmx5IG9uIGEgbWFpbnRhaW5lciBydWxpbmcuIFRoZSByYXRjaGV0IHN0cmlwcyBjb21tZW50cywgc28gc2xpbW1pbmdcbiAqIHByb3NlIGNhbm5vdCBidXkgdGhhdCBiYWNrIGVpdGhlci5cbiAqXG4gKiBUaGlzIGhlbHBlciB3cmFwcyB0aGUgYm9keSBmcm9tIE9VVFNJREUgaW5zdGVhZC4gQXQgZWFjaCBzaXRlIGBib2R5OiB7YFxuICogYmVjb21lcyBgYm9keTogZ3VhcmRlZCgnPGtleT4nLCB7YCBhbmQgdGhlIGNsb3NpbmcgYH0sYCBiZWNvbWVzIGB9KSxgLCBzbyB0aGVcbiAqIGJvZHkga2VlcHMgaXRzIG93biBpbmRlbnRhdGlvbiBieXRlLWZvci1ieXRlIGFuZCB0aGUgd2hvbGUgY2hhbmdlIGNvc3RzIGEgZmV3XG4gKiB0b2tlbnMgcGVyIGxvb3AgaW5zdGVhZCBvZiBzaXh0eS5cbiAqXG4gKiAjIyBWZXJpZmllZCBhZ2FpbnN0IHRoZSBwaW5uZWQgYEBvYmplY3RzdGFjay8qYCB0aGlzIHJlcG8gaW5zdGFsbHNcbiAqXG4gKiBGaXJzdCB0YWtlbiBvbiAxNy4zLjA7IFJFLVRBS0VOIG9uIDE3LjQuMCAoIzE4ODMsIGFmdGVyIHRoZSBQUiAjMTgxNCBidW1wO1xuICogbm90IHJlLXRha2VuIG9uIDE3LjUuMCksIHNhbWUgdmVyZGljdDogYSA1LWl0ZW0gc3dlZXAgd2hvc2UgYm9keSBmYWlscyBvbiBldmVyeSBpdGVtXG4gKiByYW4gdG8gY29tcGxldGlvbiBcdTIwMTQgYWxsIDUgaXRlbXMgdG91Y2hlZCwgcnVuIGBzdWNjZXNzOiB0cnVlYCBcdTIwMTQgd2hlcmUgdGhlXG4gKiBzYW1lIHN3ZWVwIHdpdGggdGhlIGJvZHkgVU5XUkFQUEVEIHN0b3BwZWQgYXQgdGhlIGZpcnN0IGZhaWx1cmUgd2l0aCAxIGl0ZW1cbiAqIHRvdWNoZWQgYW5kIHRoZSBydW4gYGZhaWxlZGAuIFRoYXQgY29udHJhc3QgSVMgdGhlIG1lYXN1cmVtZW50OyBhIGd1YXJkZWRcbiAqIHJ1biBhbG9uZSBjYW5ub3QgdGVsbCBjb250YWlubWVudCBmcm9tIGEgYm9keSB0aGF0IG5ldmVyIGZhaWxlZC5cbiAqXG4gKiAoTm90IGFnYWluc3QgdGhlIHBsYXRmb3JtIHNvdXJjZSB0cmVlIFx1MjAxNCB0aGUgY29udGFpbm1lbnQgaGFzIHRvIHdvcmsgb24gdGhlXG4gKiBhcnRpZmFjdCB0aGF0IGFjdHVhbGx5IHNoaXBzIGhlcmUuKVxuICpcbiAqICAgLSBgdHJ5X2NhdGNoYCBpcyByZWdpc3RlcmVkIGJ5IHRoZSBwaW5uZWQgZW5naW5lIChgcmVnaXN0ZXJUcnlDYXRjaE5vZGVgKSxcbiAqICAgICBydW5zIGl0cyBgdHJ5YCByZWdpb24sIGFuZCBvbiBhIGNhdWdodCBmYWlsdXJlIHJ1bnMgYGNhdGNoYCBhbmQgcmV0dXJuc1xuICogICAgIGBzdWNjZXNzOiB0cnVlYC4gVGhhdCBgc3VjY2VzczogdHJ1ZWAgaXMgd2hhdCBsZXRzIHRoZSBsb29wIGNvbnRpbnVlLlxuICogICAtIEEgYmFyZSBgYXNzaWdubWVudGAgbm9kZSB3aXRoIG5vIGBjb25maWdgIHJldHVybnMgYHN1Y2Nlc3M6IHRydWVgOiBpdHNcbiAqICAgICBleGVjdXRvciBmb2xkcyBhbiBhYnNlbnQgY29uZmlnIHRvIHplcm8gYXNzaWdubWVudHMsIGFuZCBgY29uZmlnYCBpc1xuICogICAgIG9wdGlvbmFsIG9uIGBGbG93Tm9kZVNjaGVtYWAuIFRoYXQgaXMgd2h5IHRoZSBtaW5pbWFsIGhhbmRsZXIgaXMgbGVnYWwsXG4gKiAgICAgYW5kIGl0IGlzIHRoZSBleGFjdCBoYW5kbGVyIHRoZSBsaW50IHJ1bGUncyBvd24gaGludCBwcmVzY3JpYmVzLlxuICogICAtIFRoZSBmYWlsZWQgYXR0ZW1wdCdzIHN0ZXBzIGFyZSBrZXB0IGluIHRoZSBydW4gbG9nIEFIRUFEIG9mIHRoZSBoYW5kbGVyJ3NcbiAqICAgICAoYGNoaWxkU3RlcHM6IFsuLi5mYWlsZWRBdHRlbXB0U3RlcHMsIC4uLmNhdGNoU3RlcHNdYCksIHNvIGEgc2tpcHBlZCBpdGVtXG4gKiAgICAgc3RheXMgdmlzaWJsZSB3aXRoIGl0cyBvd24gYHN0YXR1czogJ2ZhaWx1cmUnYCBzdGVwIGFuZCB0aGUgaGFuZGxlciBkb2VzXG4gKiAgICAgbm90IG5lZWQgdG8gcmUtcmVjb3JkIGl0LlxuICogICAtIGBjYXRjaGAgbmVlZHMgbm8gYGVkZ2VzYCAoYEZsb3dSZWdpb25TY2hlbWEuZWRnZXNgIGNhcnJpZXMgYC5kZWZhdWx0KFtdKWApXG4gKiAgICAgYW5kIG5vIGBlcnJvclZhcmlhYmxlYCAoaXQgZGVmYXVsdHMgdG8gYCRlcnJvcmApLiBBIG9uZS1ub2RlIHJlZ2lvbiBpc1xuICogICAgIHNpbmdsZS1lbnRyeS9zaW5nbGUtZXhpdCwgd2hpY2ggaXMgd2hhdCBgYW5hbHl6ZVJlZ2lvbmAgcmVxdWlyZXMuXG4gKlxuICogIyMgV2hhdCBpdCBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgZG9cbiAqXG4gKiBUaGUgaGFuZGxlciBzd2FsbG93cyB0aGUgaXRlbSBhbmQgbW92ZXMgb24uIEl0IGRvZXMgbm90IHJldHJ5IChubyBgcmV0cnlgXG4gKiBwb2xpY3kgaXMgZGVjbGFyZWQsIHNvIG9uZSBhdHRlbXB0IGlzIG1hZGUpLCBkb2VzIG5vdCBub3RpZnksIGFuZCBkb2VzIG5vdFxuICogYWNjdW11bGF0ZSBhIGZhaWx1cmUgbGlzdCBcdTIwMTQgYSBzd2VlcCB0aGF0IHJlcG9ydHMgaXRzIHNraXBzIGlzIGEgcHJvZHVjdFxuICogZmVhdHVyZSB0aGlzIGNhcmQgZG9lcyBub3QgaGF2ZSBhIHJ1bGluZyBmb3IuIFRoZSBydW4gbG9nIGlzIHRoZSByZWNvcmQuXG4gKlxuICogXHUyNkQ0IE5vdCBldmVyeSBsb29wIHdhbnRzIHRoaXMuIEEgc3dlZXAgTUVBTlQgdG8gc3RvcCBhdCBpdHMgZmlyc3QgZmFpbHVyZSBpcyBhXG4gKiBsZWdpdGltYXRlIHJlYWRpbmcgYW5kIGtlZXBzIGl0cyB3YXJuaW5nLCBzbyBkZWNpZGUgcGVyIGxvb3AgcmF0aGVyIHRoYW5cbiAqIHdyYXBwaW5nIGV2ZXJ5IHdhcm5lZCBzaXRlIGJ5IHJlZmxleC5cbiAqL1xuXG4vKipcbiAqIEEgY29udHJvbC1mbG93IHJlZ2lvbiwgc3RydWN0dXJhbGx5LiBEZWxpYmVyYXRlbHkgbG9vc2VyIHRoYW4gdGhlIHNwZWMnc1xuICogYEZsb3dSZWdpb25gOiB0aGUgbG9vcCBib2RpZXMgdGhpcyB3cmFwcyBsaXZlIHVuZGVyIGBjb25maWdgLCB3aGljaCB0aGUgZmxvd1xuICogc2NoZW1hIHR5cGVzIGFzIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmAsIHNvIHRpZ2h0ZW5pbmcgdGhlIHBhcmFtZXRlciBoZXJlXG4gKiB3b3VsZCB0eXBlLWNoZWNrIHRoZSBib2RpZXMgZm9yIHRoZSBmaXJzdCB0aW1lIGFuZCB0dXJuIGEgbWVjaGFuaWNhbCB3cmFwXG4gKiBpbnRvIGEgdHlwaW5nIGNoYW5nZS4gU2FtZSBzaGFwZSBpbiwgc2FtZSBzaGFwZSBvdXQuXG4gKi9cbnR5cGUgUmVnaW9uID0geyBub2RlczogdW5rbm93bltdOyBlZGdlcz86IHVua25vd25bXSB9O1xuXG4vKipcbiAqIFdyYXAgYSBsb29wIGJvZHkgcmVnaW9uIHNvIG9uZSBmYWlsaW5nIGl0ZW0gaXMgY29udGFpbmVkIHRvIHRoYXQgaXRlcmF0aW9uLlxuICpcbiAqIGBrZXlgIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBpdHMgZmxvdyBcdTIwMTQgaXQgbmFtZXMgdGhlIHR3byBub2RlcyB0aGlzIGFkZHNcbiAqIChgZ3VhcmRfPGtleT5gIGFuZCBgaGFuZGxlZF88a2V5PmApLCBhbmQgbm9kZSBpZHMgY29sbGlkZSBmbG93LXdpZGUuXG4gKi9cbmV4cG9ydCBjb25zdCBndWFyZGVkID0gKGtleTogc3RyaW5nLCByZWdpb246IFJlZ2lvbik6IFJlZ2lvbiA9PiAoe1xuICBub2RlczogW3tcbiAgICBpZDogYGd1YXJkXyR7a2V5fWAsXG4gICAgdHlwZTogJ3RyeV9jYXRjaCcsXG4gICAgbGFiZWw6ICdHdWFyZGVkIEl0ZXJhdGlvbicsXG4gICAgY29uZmlnOiB7XG4gICAgICB0cnk6IHJlZ2lvbixcbiAgICAgIGNhdGNoOiB7IG5vZGVzOiBbeyBpZDogYGhhbmRsZWRfJHtrZXl9YCwgdHlwZTogJ2Fzc2lnbm1lbnQnLCBsYWJlbDogJ1NraXAgVGhpcyBJdGVtJyB9XSB9LFxuICAgIH0sXG4gIH1dLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHMvYXJ0aWNsZV9mZWVkYmFjay5ob29rLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2Uvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHMvYXJ0aWNsZV9mZWVkYmFjay5ob29rLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tDb250ZXh0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEhvb2tBcGkgfSBmcm9tICcuLi8uLi9zYWxlcy9vYmplY3RzL19ob29rLWFwaSc7XG5cbi8qKlxuICogVGhlIHdyaXRlciBiZWhpbmQgdGhlIGtub3dsZWRnZSBhcnRpY2xlJ3MgZW5nYWdlbWVudCBjb3VudGVycyAoIzYwMSkuXG4gKlxuICogYGNybV9rbm93bGVkZ2VfYXJ0aWNsZS5oZWxwZnVsX2NvdW50YCBhbmQgYG5vdF9oZWxwZnVsX2NvdW50YCB3ZXJlIGRlY2xhcmVkXG4gKiBgcmVhZG9ubHk6IHRydWVgIHdpdGggYSBgZGVmYXVsdFZhbHVlOiAwYCBhbmQgTk8gd3JpdGVyIGFueXdoZXJlIFx1MjAxNCBvbiB0aGVcbiAqIHBsYXRmb3JtIG9yIGluIHRoaXMgYXBwIFx1MjAxNCBzbyB0aGV5IHdlcmUgc3RydWN0dXJhbGx5IHBpbm5lZCBhdCB6ZXJvIHdoaWxlIHRoZVxuICogYXJ0aWNsZSBncmlkIHNob3dlZCBhIFwiSGVscGZ1bCBWb3Rlc1wiIGNvbHVtbiBhbmQgc3VtbWVkIGl0LiBUaGF0IGlzIHRoZSBzYW1lXG4gKiBkZWZlY3QgYGNybV9jYW1wYWlnbl9tZW1iZXJgJ3MgZW5nYWdlbWVudCBsaWZlY3ljbGUgd2FzIHJldGlyZWQgZm9yICgjNTk3KSxcbiAqIGFuZCBBRFItMDA0OSdzIGVuZm9yY2Utb3ItcmVtb3ZlIGxlYXZlcyBleGFjdGx5IHR3byBob25lc3QgZW5kaW5nczogZ2l2ZSB0aGVcbiAqIGZpZWxkIGEgd3JpdGVyLCBvciBkZWxldGUgaXQuIEZlZWRiYWNrIG9uIGEga25vd2xlZGdlIGFydGljbGUgaGFzIGEgcmVhbFxuICogY29uc3VtZXIgXHUyMDE0IHRoZSByZXZpZXcgcXVldWUgYW4gYXV0aG9yIHdvcmtzIGZyb20gXHUyMDE0IHNvIHRoZXNlIHR3byBnZXQgYVxuICogd3JpdGVyLiBgdmlld19jb3VudGAsIHdoaWNoIGhhcyBub25lIGF2YWlsYWJsZSwgd2FzIGRlbGV0ZWQ7IHRoZSByZWFzb25pbmdcbiAqIGlzIG9uIGBjcm1fa25vd2xlZGdlX2FydGljbGVgIGl0c2VsZi5cbiAqXG4gKiAjIyMgUmVjb3VudCwgbmV2ZXIgaW5jcmVtZW50XG4gKlxuICogRXZlcnkgZXZlbnQgcmVjb21wdXRlcyBib3RoIGNvdW50ZXJzIGZyb20gYGNybV9hcnRpY2xlX2ZlZWRiYWNrYCByYXRoZXIgdGhhblxuICogYWRkaW5nIG9uZSB0byB3aGF0IGlzIHRoZXJlLiBUaGF0IG1ha2VzIHRoZSB3cml0ZSBpZGVtcG90ZW50IChhIHJlcGxheWVkXG4gKiBob29rIGNhbm5vdCBkb3VibGUtY291bnQpLCBzZWxmLWhlYWxpbmcgKGFuIGFkbWluIGRlbGV0aW5nIGEgYm9ndXMgdm90ZSByb3dcbiAqIGlzIHJlZmxlY3RlZCBvbiB0aGUgbmV4dCBldmVudCwgYW5kIGEgZnVsbCByZWNvdW50IGZpeGVzIGFueSBoaXN0b3JpY2FsXG4gKiBkcmlmdCBpbiBvbmUgcGFzcyksIGFuZCBzYWZlIHVuZGVyIGNvbmN1cnJlbmN5ICh0d28gc2ltdWx0YW5lb3VzIHZvdGVzIGJvdGhcbiAqIGNvbnZlcmdlIG9uIHRoZSB0cnVlIGNvdW50LCB3aGVyZSB0d28gcmVhZC1tb2RpZnktd3JpdGVzIGxvc2Ugb25lKS4gVGhlXG4gKiBjb3VudGVycyB0aGVyZWZvcmUgY2Fubm90IGRyaWZ0IGZyb20gdGhlaXIgb3duIGV2aWRlbmNlIFx1MjAxNCB3aGljaCBpcyB3aGF0IG1ha2VzXG4gKiBgcmVhZG9ubHk6IHRydWVgIGFuIGhvbmVzdCBkZWNsYXJhdGlvbiBhZ2FpbiByYXRoZXIgdGhhbiBhIGRlc2NyaXB0aW9uIG9mXG4gKiBwYXJhbHlzaXMuXG4gKlxuICogYGFmdGVyRGVsZXRlYCBpcyBpbiB0aGUgZXZlbnQgc2V0IGZvciB0aGUgc2FtZSByZWFzb246IHRoZSBjYW1wYWlnbiBqdW5jdGlvblxuICogbGVhcm5lZCB0aGUgaGFyZCB3YXkgKCM2OTYpIHRoYXQgYSBqdW5jdGlvbiByb3cncyBkaXNhcHBlYXJhbmNlIGlzIGEgbWV0cmljXG4gKiBjaGFuZ2UsIGFuZCBhIGNvdW50ZXIgdGhhdCBvbmx5IGV2ZXIgZ29lcyB1cCBpcyBhIGRpZmZlcmVudCBraW5kIG9mIGxpZS5cbiAqXG4gKiBgYXN5bmM6IHRydWVgICsgYG9uRXJyb3I6ICdsb2cnYCBtaXJyb3JzIGBjYW1wYWlnbl9tZW1iZXJfbWV0cmljc19yZWZyZXNoYDpcbiAqIHRoZSByZWFkZXIncyB2b3RlIGlzIHRoZSB1c2VyJ3MgYWN0aW9uIGFuZCBtdXN0IG5vdCBmYWlsIGJlY2F1c2UgdGhlIGFydGljbGVcbiAqIHJvdyBpcyBtb21lbnRhcmlseSBsb2NrZWQuIEEgbWlzc2VkIHJlZnJlc2ggaXMgY29ycmVjdGVkIGJ5IHRoZSBuZXh0IHZvdGU7XG4gKiBhIHJlamVjdGVkIHdyaXRlIGxvc2VzIHRoZSB2b3RlIGl0c2VsZi5cbiAqXG4gKiBgcnVuQXM6ICdzeXN0ZW0nYCAoIzIwMTQsIEFHRU5UUy5tZCBydWxlIDkpLiBUaGUgY291bnRlcnMgYXJlIGByZWFkb25seWAsXG4gKiBhbmQgdGhlIGVuZ2luZSBkcm9wcyBhIHJlYWRvbmx5IGtleSBhIG5vbi1zeXN0ZW0gY2FsbGVyIHdyaXRlcyBcdTIwMTQgc28gYSByZWNvdW50XG4gKiBmaXJlZCBieSBhIFBFUlNPTidzIG93biB3cml0ZSBvZiBhIHZvdGUgKGFuIGFkbWluIHdpdGhkcmF3aW5nIG9uZSkgY29tbWl0dGVkXG4gKiB3aXRob3V0IHRoZSBjb3VudGVycyBhbmQgdGhlIGFydGljbGUga2VwdCBjb3VudGluZyB0aGUgd2l0aGRyYXduIHZvdGUuIFRoZVxuICogcmVjb3VudCBpcyB0aGUgYXJ0aWNsZSdzIHdyaXRlciwgbm90IHRoZSB2b3RlcidzLCBzbyB0aGUgaG9vayBlbGV2YXRlczsgdGhlXG4gKiB2b3RlIGl0c2VsZiBzdGF5cyB0aGUgY2FsbGVyJ3Mgd3JpdGUuIEVsZXZhdGlvbiBpcyBub3QgYW5vbnltaXR5OiB0aGVcbiAqIGFydGljbGUncyBgdXBkYXRlZF9ieWAgc3RpbGwgbmFtZXMgdGhlIHBlcnNvbi4gT3JnYW5pemF0aW9uIChydWxlIDEwKTogZXZlcnlcbiAqIHJlYWQgYW5kIHdyaXRlIGlzIGtleWVkIHRvIHRoZSB0cmlnZ2VyaW5nIHZvdGUncyBvd24gYXJ0aWNsZSwgYW5kIHRoZVxuICogZWxldmF0ZWQgYGN0eC5hcGlgIGtlZXBzIHRoZSB0cmlnZ2VyJ3MgdGVuYW50LCBzbyB0aGUgZHJpdmVyJ3Mgb3JnYW5pemF0aW9uXG4gKiBwcmVkaWNhdGUgc3RpbGwgYXBwbGllcy5cbiAqXG4gKiBObyBsb29wOiB0aGlzIHdyaXRlcyBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCwgd2hvc2Ugb3duIGhvb2tcbiAqIChga25vd2xlZGdlX2FydGljbGVfcHVibGlzaF90aW1lc3RhbXBzYCkgZmlyZXMgb24gYGJlZm9yZSpgIGFuZCByZXR1cm5zXG4gKiBpbW1lZGlhdGVseSB1bmxlc3MgdGhlIHJlY29yZCBpcyBwdWJsaXNoZWQgXHUyMDE0IGFuZCBlaXRoZXIgd2F5IGl0IGlzc3VlcyBub1xuICogd3JpdGUgYWdhaW5zdCBgY3JtX2FydGljbGVfZmVlZGJhY2tgLCBzbyBub3RoaW5nIHJlLWVudGVycyBoZXJlLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBUaGUgcmVjb3VudCBibG9jayBpcyB3cml0dGVuIG91dCBJTkxJTkUgYW5kIGlzIG5vdCBzaGFyZWQgd2l0aFxuICogYGNhbXBhaWduX21lbWJlci5ob29rLnRzYCdzIHN0cnVjdHVyYWxseSBzaW1pbGFyIGJsb2NrLiBBIGhvb2sgaGFuZGxlciBsb3dlcnNcbiAqIHRvIGEgbWV0YWRhdGEtb25seSwgYm9keS1vbmx5IHNjcmlwdDogYSByZWZlcmVuY2UgdG8gbW9kdWxlIHNjb3BlIFx1MjAxNCBhblxuICogaW1wb3J0LCBhIHRvcC1sZXZlbCBjb25zdCwgYSBzaGFyZWQgZmFjdG9yeSdzIHBhcmFtZXRlciBcdTIwMTQgaXMgYVxuICogYFJlZmVyZW5jZUVycm9yYCBhdCBydW50aW1lLCBub3QgYSBjbG9zdXJlLCBhbmQgYSBoYW5kbGVyIHRoYXQgcmVhY2hlcyBmb3JcbiAqIG9uZSBzaWxlbnRseSBzdG9wcyBsb3dlcmluZyAoYHRlc3QvYWN0aW9uLXNhbmRib3gudGVzdC50c2AgZmFpbHMgdGhlIGJ1aWxkIG9uXG4gKiBpdCkuIEhvb2tzIG1heSBiZSBjb21wb3NlZCBieSBhIEZBQ1RPUlkgKGBfY2FzZS1hc3NpZ25tZW50LnRzYCBkb2VzIGV4YWN0bHlcbiAqIHRoYXQpOyB0aGUgbG9naWMgaW5zaWRlIGEgYm9keSBtYXkgbm90IGJlIGltcG9ydGVkLlxuICovXG5jb25zdCBhcnRpY2xlRmVlZGJhY2tNZXRyaWNzUmVmcmVzaDogSG9vayA9IHtcbiAgbmFtZTogJ2FydGljbGVfZmVlZGJhY2tfbWV0cmljc19yZWZyZXNoJyxcbiAgb2JqZWN0OiAnY3JtX2FydGljbGVfZmVlZGJhY2snLFxuICBldmVudHM6IFsnYWZ0ZXJJbnNlcnQnLCAnYWZ0ZXJVcGRhdGUnLCAnYWZ0ZXJEZWxldGUnXSxcbiAgcHJpb3JpdHk6IDgwMCxcbiAgYXN5bmM6IHRydWUsXG4gIG9uRXJyb3I6ICdsb2cnLFxuICBydW5BczogJ3N5c3RlbScsXG4gIGRlc2NyaXB0aW9uOiAnUmVjb3VudCBhbiBhcnRpY2xlXHUyMDE5cyBoZWxwZnVsIC8gbm90LWhlbHBmdWwgdm90ZXMgZnJvbSBjcm1fYXJ0aWNsZV9mZWVkYmFjay4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IGFwaSA9IGN0eC5hcGkgYXMgSG9va0FwaSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFwaSkgcmV0dXJuO1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICAvLyBCb3RoIHNpZGVzIG9uIHVwZGF0ZTogbW92aW5nIGEgdm90ZSBiZXR3ZWVuIGFydGljbGVzIGhhcyB0byByZWNvdW50IHRoZVxuICAgIC8vIGFydGljbGUgaXQgTEVGVCBhcyB3ZWxsIGFzIHRoZSBvbmUgaXQgYXJyaXZlZCBhdC5cbiAgICBjb25zdCBhcnRpY2xlSWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFtcbiAgICAgIHR5cGVvZiBpbnB1dD8uY3JtX2tub3dsZWRnZV9hcnRpY2xlID09PSAnc3RyaW5nJyA/IGlucHV0LmNybV9rbm93bGVkZ2VfYXJ0aWNsZSA6ICcnLFxuICAgICAgdHlwZW9mIHByZXZpb3VzPy5jcm1fa25vd2xlZGdlX2FydGljbGUgPT09ICdzdHJpbmcnXG4gICAgICAgID8gKHByZXZpb3VzLmNybV9rbm93bGVkZ2VfYXJ0aWNsZSBhcyBzdHJpbmcpXG4gICAgICAgIDogJycsXG4gICAgXS5maWx0ZXIoQm9vbGVhbikpKTtcblxuICAgIGZvciAoY29uc3QgaWQgb2YgYXJ0aWNsZUlkcykge1xuICAgICAgY29uc3QgaGVscGZ1bCA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9hcnRpY2xlX2ZlZWRiYWNrJykuY291bnQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fa25vd2xlZGdlX2FydGljbGU6IGlkLCB2ZXJkaWN0OiAnaGVscGZ1bCcgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgbm90SGVscGZ1bCA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9hcnRpY2xlX2ZlZWRiYWNrJykuY291bnQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fa25vd2xlZGdlX2FydGljbGU6IGlkLCB2ZXJkaWN0OiAnbm90X2hlbHBmdWwnIH0sXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV9rbm93bGVkZ2VfYXJ0aWNsZScpLnVwZGF0ZSh7XG4gICAgICAgIGlkLFxuICAgICAgICBoZWxwZnVsX2NvdW50OiBoZWxwZnVsLFxuICAgICAgICBub3RfaGVscGZ1bF9jb3VudDogbm90SGVscGZ1bCxcbiAgICAgIH0sIHsgd2hlcmU6IHsgaWQgfSB9KTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBbYXJ0aWNsZUZlZWRiYWNrTWV0cmljc1JlZnJlc2hdO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL2Nhc2UuaG9vay50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL2Nhc2UuaG9vay50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBIb29rLCBIb29rQ29udGV4dCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHR5cGUgeyBIb29rQXBpIH0gZnJvbSAnLi4vLi4vc2FsZXMvb2JqZWN0cy9faG9vay1hcGknO1xuaW1wb3J0IHtcbiAgY3JlYXRlQ2FzZVJvdW5kUm9iaW5Bc3NpZ24sXG4gIGNyZWF0ZUNhc2VFc2NhbGF0aW9uUmVhc3NpZ24sXG4gIGNyZWF0ZUNhc2VTZWxmQ2xhaW0sXG59IGZyb20gJy4vX2Nhc2UtYXNzaWdubWVudCc7XG5cbi8qKlxuICogQ2FzZSBTTEEgJiBlc2NhbGF0aW9uIGhvb2suXG4gKlxuICogLSBTdGFtcHMgYHNsYV9kdWVfZGF0ZWAgb24gYSBjYXNlIHRoYXQgaGFzIG5vbmUsIGZyb20gdGhlIHByaW9yaXR5IFx1MDBENyBhY2NvdW50XG4gKiAgIHRpZXIgbWF0cml4IGluIGBfY2FzZS1zbGEudHNgLlxuICogLSBSZWNvcmRzIGBpc19zbGFfdmlvbGF0ZWRgIG9uIHRoZSB3cml0ZSB0aGF0IHJlc29sdmVzIG9yIGNsb3NlcyBhIGNhc2UgYWZ0ZXJcbiAqICAgaXRzIGBzbGFfZHVlX2RhdGVgIFx1MjAxNCB0aGUgaGFsZiBvZiB0aGUgYnJlYWNoIHJ1bGUgbm8gc2NoZWR1bGUgY2FuIG1pc3MuXG4gKiAtIE9uIGVzY2FsYXRpb246IGNyZWF0ZXMgYSBmb2xsb3ctdXAgdGFzayBPV05FRCBCWSB0aGUgYWNjb3VudCBvd25lciAodGhlXG4gKiAgIHNpbmdsZSBvd25lciBvZiBlc2NhbGF0aW9uIHRhc2tzIFx1MjAxNCBmbG93cyBtdXN0IG5vdCBjcmVhdGUgdGhlaXIgb3duKS5cbiAqICAgT3duaW5nIGl0LCBub3QgbWVyZWx5IGxhYmVsbGluZyBpdDogYG93bmVyX2lkYCBpcyB0aGUgb25lIG93bmVyc2hpcCBjb2x1bW4sXG4gKiAgIHNvIHRoZSBwZXJzb24gdGhlIHRhc2sgbmFtZXMgaXMgdGhlIHBlcnNvbiB3aG8gY2FuIHdvcmsgaXQuXG4gKiAtIE9uIGByZXNvbHZlZGA6IGJ1bXBzIGFjY291bnQgYGxhc3RfYWN0aXZpdHlfZGF0ZWAgXHUyMDE0IGl0cyBvd24gaG9vayxcbiAqICAgYGNhc2VfcmVzb2x1dGlvbl9hY2NvdW50X2FjdGl2aXR5YCwgYmVjYXVzZSBpdCBpcyB0aGUgb25lIHdyaXRlIGhlcmUgdGhhdFxuICogICBuZWVkcyBlbGV2YXRpb24gKCMyMDE0KS5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgT3duZXJzaGlwIGFzc2lnbm1lbnQgaXMgTk9UIGhlcmU6IGFsbCB0aHJlZSBhbnN3ZXJzIHRvIFwid2hvIHNob3VsZCBvd25cbiAqIHRoaXMgY2FzZVwiIGxpdmUgaW4gYF9jYXNlLWFzc2lnbm1lbnQudHNgIFx1MjAxNCB0aGUgb3duZXJsZXNzLWludGFrZSByb3VuZC1yb2JpbixcbiAqIHRoZSBlc2NhbGF0aW9uIGhhbmQtb2ZmIHRvIHRoZSBgc2VydmljZV9tYW5hZ2VyYCBwb29sLCBhbmQgdGhlIHRyaWFnZVxuICogc2VsZi1jbGFpbS4gT25lIG1vZHVsZSwgc28gdGhlIGFwcCBuZXZlciBncm93cyB0d28gaW5kZXBlbmRlbnRseS1hdXRob3JlZFxuICogb3duZXJzaGlwIHBhdGhzIG9uIGBjcm1fY2FzZWA7IGl0cyBob29rcyBhcmUgY29tcG9zZWQgaW50byB0aGlzIG1vZHVsZSdzXG4gKiBkZWZhdWx0IGV4cG9ydCBiZWxvdywgc28gdGhlIHJlZ2lzdHJ5IHN0aWxsIHNlZXMgb25lIGBjcm1fY2FzZWAgaG9vayBzZXQuIEluXG4gKiBwYXJ0aWN1bGFyIHRoZSBlc2NhbGF0aW9uIGhhbmQtb2ZmIGlzIGRlbGliZXJhdGVseSBOT1QgYSBicmFuY2ggb2ZcbiAqIGBjYXNlX3N0YXR1c19zaWRlX2VmZmVjdHNgIGJlbG93OiB0aGF0IGhvb2sgd3JpdGVzIHRocm91Z2ggYGN0eC5hcGlgLCBhIHNlYW1cbiAqIHRoZSAjMzAwNCB0cmFuc2ZlciBndWFyZCBDQU4gc2VlICh3aGljaCB3b3VsZCBkZW1hbmRcbiAqIGBjcm1fY2FzZS5hbGxvd1RyYW5zZmVyYCkgYW5kIGEgc2Vjb25kIHdyaXRlIHRoYXQgcmUtZW50ZXJzIHRoZSByZWNvcmQtY2hhbmdlXG4gKiB0cmlnZ2VyIHN1cmZhY2UuIEJvdGggbWVhc3VyZW1lbnRzIGFyZSBpbiBgX2Nhc2UtYXNzaWdubWVudC50c2AncyBoZWFkZXIuXG4gKi9cblxuY29uc3QgY2FzZVZhbGlkYXRpb246IEhvb2sgPSB7XG4gIG5hbWU6ICdjYXNlX3NsYV9kZWZhdWx0cycsXG4gIG9iamVjdDogJ2NybV9jYXNlJyxcbiAgZXZlbnRzOiBbJ2JlZm9yZUluc2VydCcsICdiZWZvcmVVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDIwMCxcbiAgZGVzY3JpcHRpb246ICdBcHBseSB0aGUgcHJpb3JpdHkgXHUwMEQ3IGFjY291bnQtdGllciBTTEEgbWF0cml4IGFuZCB0aGUgY2FzZSBsaWZlY3ljbGUgZGVmYXVsdHMuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvLyBEMyBzdGFuZC1kb3duOiBhIHByZWRpY2F0ZSB1cGRhdGUgaGFzIE9ORSBwYXlsb2FkIGZvciBldmVyeSBtYXRjaGVkIHJvdyxcbiAgICAvLyBzbyB0aGUgYGN0eC5wcmV2aW91c2AtY29uZGl0aW9uZWQgd3JpdGVzIGJlbG93IHdvdWxkIGxhbmQgb24gcm93cyB0aGF0XG4gICAgLy8gZGlkIG5vdCBlYXJuIHRoZW0gXHUyMDE0IHJlZnVzZWQgYXMgYSBkaXZlcmdpbmcga2V5IHNldCwgb3Igc3RvcmVkIHNpbGVudGx5XG4gICAgLy8gZnJvbSB0aGUgbGFzdCByb3cuIEZ1bGwgYWNjb3VudCBhbmQgdGhlIG1lYXN1cmVtZW50OiBgZm9yZWNhc3QuaG9vay50c2AuXG4gICAgaWYgKGN0eC5ldmVudCA9PT0gJ2JlZm9yZVVwZGF0ZScgJiYgY3R4LmRpc3BhdGNoPy5tb2RlID09PSAncGVyLXJvdycpIHJldHVybjtcblxuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBHdWVzdCAod2ViLXRvLWNhc2UpIHNhbml0aXNhdGlvbi4gT1ZFUldSSVRFIHdpdGggYSBzYWZlIHZhbHVlIFx1MjAxNCBuZXZlclxuICAgIC8vIGBkZWxldGVgLlxuICAgIC8vXG4gICAgLy8gXHUyNzA1IEhJU1RPUlksIFJFU09MVkVEIFx1MjAxNCBhbmQgdGhlIGNvbmNsdXNpb24gaXMgdW5jaGFuZ2VkLiBUaHJvdWdoIDE3LjIuMCxcbiAgICAvLyBgZGVsZXRlIGN0eC5pbnB1dC48ZmllbGQ+YCBpbiBhIGhvb2sgd2FzIGEgU0lMRU5UIE5PLU9QOiBPYmplY3RRTCBoYW5kcyBhXG4gICAgLy8gaG9vayBgY3R4LmlucHV0YCBhcyBgeyBkYXRhLCBvcHRpb25zIH1gIGJlaGluZCBhIGZsYXQtcmVjb3JkIFByb3h5XG4gICAgLy8gKGBpbnN0YWxsRmxhdElucHV0YCwgYEBvYmplY3RzdGFjay9vYmplY3RxbGAgYHNyYy9ob29rLXdyYXBwZXJzLnRzYCkgdGhhdFxuICAgIC8vIHRyYXBwZWQgYGdldGAgLyBgc2V0YCAvIGBoYXNgIC8gYG93bktleXNgIC8gYGdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgYW5kXG4gICAgLy8gcm91dGVkIGVhY2ggaW50byBgZGF0YWAgXHUyMDE0IGJ1dCBkZWNsYXJlZCBubyBgZGVsZXRlUHJvcGVydHlgIHRyYXAsIHNvIHRoZVxuICAgIC8vIGRlbGV0ZSBmZWxsIHRocm91Z2ggdG8gdGhlIFdSQVBQRVIsIG9uZSBsZXZlbCBhYm92ZSB0aGUgcmVjb3JkOlxuICAgIC8vXG4gICAgLy8gICBkZWxldGUgaW5wdXQub3duZXJfaWQgICAtPiByZXR1cm5lZCBUUlVFICAoSlMgcmVwb3J0ZWQgc3VjY2VzcylcbiAgICAvLyAgICdvd25lcl9pZCcgaW4gaW5wdXQgICAgIC0+IHN0aWxsIHRydWVcbiAgICAvLyAgIGlucHV0Lm93bmVyX2lkICAgICAgICAgIC0+IHN0aWxsIHRoZSBjYWxsZXIncyB2YWx1ZVxuICAgIC8vXG4gICAgLy8gRmlmdGVlbiBzdWNoIHN0YXRlbWVudHMgYWNyb3NzIHR3byBpbnRha2UgaG9va3MgZGlkIG5vdGhpbmcgaW4gcHJvZHVjdGlvblxuICAgIC8vIHdoaWxlIHRoZWlyIHRlc3RzIHBhc3NlZCAoIzExMzMpLiBUaGlzIGJsb2NrIHdhcyByZXdyaXR0ZW4gdG8gQVNTSUdOLlxuICAgIC8vXG4gICAgLy8gVGhlIGJsb2NrIGFib3ZlIHByZWRpY3RlZCBpdHMgb3duIHRyaWdnZXIgXHUyMDE0IFwiYSBwbGF0Zm9ybSByZWxlYXNlIHRoYXRcbiAgICAvLyBQT1NUREFURVMgMjAyNi0wOC0yNlwiIFx1MjAxNCBhbmQgdGhhdCByZWxlYXNlIGlzICoqMTcuMy4wKiosIHNvIGV2ZXJ5IGxhdGVyXG4gICAgLy8gcGluIGNhcnJpZXMgdGhlIGZpeC4gb2JqZWN0c3RhY2sjMTIyNzcgc2hpcHBlZDogdGhlIGluLXByb2Nlc3MgUHJveHlcbiAgICAvLyB0cmFwcyBgZGVsZXRlUHJvcGVydHlgLCBhbmQgdGhlIHNhbmRib3ggcGF0aCBkaWZmcyBkZWxldGlvbnMgYWdhaW5zdCB0aGVcbiAgICAvLyBlbnRyeSBzbmFwc2hvdCByYXRoZXIgdGhhbiB3cml0aW5nIG11dGF0aW9ucyBob21lIHdpdGggYE9iamVjdC5hc3NpZ25gLFxuICAgIC8vIHdoaWNoIGNhbm5vdCByZXByZXNlbnQgYSByZW1vdmFsLiBSZS1tZWFzdXJlZCB0aHJvdWdoIHRoZSBlbmdpbmUncyBvd25cbiAgICAvLyBgd3JhcERlY2xhcmF0aXZlSG9va2AgaW4gYHRlc3QvaG9vay1pbnB1dC1zaGFwZS50ZXN0LnRzYCwgd2hpY2ggbm93IHBpbnNcbiAgICAvLyB0aGUgbmV3IGNvbnRyYWN0IGluIGJvdGggZGlyZWN0aW9ucy5cbiAgICAvL1xuICAgIC8vIFx1MjZENCBUaGUgdHJhcCBhcnJpdmluZyBpcyBOT1QgYSBsaWNlbmNlIHRvIHNwZWxsIHRoaXMgYmxvY2sgd2l0aCBgZGVsZXRlYC5cbiAgICAvLyBXaGF0IHRoZXNlIGxpbmVzIFdSSVRFIGlzIGxvYWQtYmVhcmluZyBpbmRlcGVuZGVudGx5IG9mIGhvdyBpdCBpcyBzcGVsbGVkOlxuICAgIC8vIGBjYXNlX2F1dG9fYXNzaWduYCBzdGFuZHMgZG93biBvbmx5IG9uIGEgbm9uLWVtcHR5IFNUUklORyBgb3duZXJfaWRgLCBzb1xuICAgIC8vIHRoZSBjb2x1bW4gbXVzdCBhcnJpdmUgYG51bGxgIHJhdGhlciB0aGFuIEFCU0VOVCAoc2VlIHRoZSBgbnVsbGAgbm90ZVxuICAgIC8vIGJlbG93KS4gUmVtb3ZpbmcgYSBrZXkgYW5kIHdyaXRpbmcgYG51bGxgIGFyZSBkaWZmZXJlbnQgZG93bnN0cmVhbSwgc29cbiAgICAvLyBzd2l0Y2hpbmcgdG8gYGRlbGV0ZWAgd291bGQgYmUgYSBiZWhhdmlvdXIgY2hhbmdlIG9uIHRoZSBwdWJsaWMtZm9ybVxuICAgIC8vIGJvdW5kYXJ5LCBub3QgYSByZS1zcGVsbGluZy4gQXNzaWduIFx1MjAxNCBmb3IgdGhlIHJlYXNvbiwgbm90IHRoZSBjb25zdHJhaW50LlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIGBudWxsYCByYXRoZXIgdGhhbiBgJydgIG9yIGB1bmRlZmluZWRgLCBhbGwgdGhyZWUgbWVhc3VyZWQgb24gdGhlXG4gICAgLy8gd3JpdGUgcGF0aDogYG51bGxgIHN0b3JlcyBhcyBudWxsLCBgJydgIHN0b3JlcyBhcyBhbiBlbXB0eSBzdHJpbmcgKHdyb25nXG4gICAgLy8gaW4gYSBsb29rdXAgXHUyMDE0IHNlZSBgY2FzZV9yZXNvbHV0aW9uX2FydGljbGVfbm9ybWFsaXplYCBiZWxvdyksIGFuZFxuICAgIC8vIGB1bmRlZmluZWRgIHN0b3JlcyB0aGUgS0VZIHdpdGggYW4gdW5kZWZpbmVkIHZhbHVlIHJhdGhlciB0aGFuIG9taXR0aW5nXG4gICAgLy8gaXQsIHdoaWNoIGlzIG5vdCB0aGUgc2FtZSBhcyBhYnNlbnQgYW5kIGlzIHdoYXQgYSBgaGFzKClgLWd1YXJkZWQgQ0VMXG4gICAgLy8gcHJlZGljYXRlIHRoZW4gdHJpcHMgb3Zlci4gYG51bGxgIGlzIGFsc28gd2hhdCB0aGUgZG93bnN0cmVhbSBvd25lclxuICAgIC8vIHdyaXRlciByZWFkcyBhcyBcIm93bmVybGVzc1wiOiBgY2FzZV9hdXRvX2Fzc2lnbmAgc3RhbmRzIGRvd24gb25seSBvbiBhXG4gICAgLy8gbm9uLWVtcHR5IFNUUklORyBgb3duZXJfaWRgLCBzbyBhIG51bGxlZCBjb2x1bW4gc3RpbGwgcmVhY2hlcyB0aGVcbiAgICAvLyByb3VuZC1yb2Jpbi5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBgIWN0eC5zZXNzaW9uPy5pc1N5c3RlbWAgaXMgbG9hZC1iZWFyaW5nLiBBIHByZWRpY2F0ZSBvZlxuICAgIC8vIGAhY3R4LnByZXZpb3VzICYmICFjdHgudXNlcj8uaWRgIGNvbmZsYXRlcyB0aGUgdHdvIGNhbGxlcnMgdGhhdCBib3RoXG4gICAgLy8gYXJyaXZlIHdpdGhvdXQgYSB1c2VyIGlkOiBhbiBhbm9ueW1vdXMgd2ViLXRvLWNhc2Ugc3VibWl0dGVyICh1bnRydXN0ZWQsXG4gICAgLy8gdGhlIGNhbGxlciB0aGlzIGJyYW5jaCBleGlzdHMgZm9yKSBhbmQgYSBTWVNURU0gd3JpdGUgXHUyMDE0IHNlZWQgbG9hZCxcbiAgICAvLyBiYWNrZmlsbCwgZGVtbyBib290c3RyYXAsIG1pZ3JhdGlvbiBcdTIwMTQgdGhlIG1vc3QgdHJ1c3RlZCBjYWxsZXIgdGhlcmUgaXMuXG4gICAgLy8gRWxzZXdoZXJlIGluIHRoaXMgYXBwIHRoYXQgc2FtZSBhYnNlbmNlIGlzIHJlYWQgdGhlIG9wcG9zaXRlIHdheTpcbiAgICAvLyBgbGVhZF9hdXRvbWF0aW9uYCdzIGNvbnZlcnRlZC1sZWFkIGxvY2sgdHJlYXRzIGAhY3R4LnVzZXI/LmlkYCBhcyBcInN5c3RlbVxuICAgIC8vIHdyaXRlLCBhbGxvdyBpdFwiLiBXaXRob3V0IHRoZSBuYXJyb3dpbmcsIGEgc3lzdGVtIGluc2VydCB0aGF0IG5hbWVzIGFuXG4gICAgLy8gb3duZXIgaGFzIHRoYXQgb3duZXIgYmxhbmtlZCBhbmQgZXZlcnkgc2VlZGVkIG9yIGJhY2tmaWxsZWQgY2FzZSBsYW5kc1xuICAgIC8vIG93bmVybGVzcyAoZWlnaHQgY2FzZXMgaW4gYHRlc3QvdW5hc3NpZ25lZC1jYXNlLXRyaWFnZS1yZWFjaC50ZXN0LnRzYFxuICAgIC8vIGluc2VydCBvd25lZCBjYXNlcyBleGFjdGx5IHRoYXQgd2F5KS4gYGN0eC5zZXNzaW9uLmlzU3lzdGVtYCBpcyB0aGVcbiAgICAvLyBkaXNjcmltaW5hdG9yOiBhIHN5c3RlbSBjb250ZXh0IGFycml2ZXMgYXMgYHNlc3Npb246IHsgaXNTeXN0ZW06IHRydWUgfWBcbiAgICAvLyBhbmQgYW4gYW5vbnltb3VzIG9uZSBjYXJyaWVzIG5vIHNlc3Npb24gYXQgYWxsLiBOYXJyb3dpbmcgb25seSBldmVyXG4gICAgLy8gUkVNT1ZFUyBjYWxsZXJzIGZyb20gdGhlIGJyYW5jaCwgc28gbm90aGluZyBzYW5pdGlzZWQgdG9kYXkgc3RvcHMgYmVpbmcuXG4gICAgLy9cbiAgICAvLyBgZXNjYWxhdGlvbl9yZWFzb25gIGlzIHN0cmlwcGVkIEFMT05HU0lERSBgaXNfZXNjYWxhdGVkYCwgYW5kIHRoZSBwYWlyIGlzXG4gICAgLy8gd2h5OiBjbGVhbmluZyBvbmx5IHRoZSBGTEFHIGxlYXZlcyB0aGUgcHJvc2UgdGhhdCBleHBsYWlucyB0aGUgZmxhZ1xuICAgIC8vIHdyaXRhYmxlLCBzbyBhIGNhc2UgY291bGQgY2FycnkgYSBzdGF0ZWQgZXNjYWxhdGlvbiByZWFzb24gd2hpbGVcbiAgICAvLyBgaXNfZXNjYWxhdGVkYCBpcyBmYWxzZSBcdTIwMTQgYSBjb250cmFkaWN0aW9uIG9uIHRoZSByZWNvcmQgcGFnZSdzIG93blxuICAgIC8vIGBlc2NhbGF0aW9uYCBmaWVsZCBncm91cCwgd2hlcmUgYSBzZXJ2aWNlIGFnZW50IHJlYWRzIGJvdGguIEl0IElTIGFcbiAgICAvLyB3aWRlbmluZyBvZiBhIHNlY3VyaXR5IGNvbnRyb2wsIHNvIGl0IGlzIGFyZ3VlZCByYXRoZXIgdGhhbiBhc3N1bWVkOlxuICAgIC8vIGBlc2NhbGF0aW9uX3JlYXNvbmAgaXMgcGlwZWxpbmUsIG5vdCBhIGZhY3QgYSBzdWJtaXR0ZXIgc3RhdGVzIGFib3V0XG4gICAgLy8gdGhlbXNlbHZlcyBcdTIwMTQgdGhlIHJ1bGUgdGhpcyBicmFuY2ggZGVjbGFyZXMgXHUyMDE0IGFuZCBldmVyeSByZWFsIHdyaXRlciBpc1xuICAgIC8vIHN0YWZmLXNpZGUgKGBjYXNlX2VzY2FsYXRpb25gLCBgY2FzZV9zbGFfbW9uaXRvcmAsIHRoZSBgZXNjYWxhdGVfY2FzZWBcbiAgICAvLyBzY3JlZW4gZmxvdykuIFRoZSBwdWJsaWMgYHdlYl90b19jYXNlYCBmb3JtIChgc3JjL3NlcnZpY2Uvdmlld3MvY2FzZS52aWV3LnRzYClcbiAgICAvLyBjb2xsZWN0cyBleGFjdGx5IGBzdWJqZWN0YCwgYGRlc2NyaXB0aW9uYCwgYHR5cGVgIGFuZCBgcHJpb3JpdHlgLCBzb1xuICAgIC8vIG51bGxpbmcgdGhpcyBkcm9wcyBub3RoaW5nIGFueSBndWVzdCBzdXJmYWNlIGFza3MgZm9yLiBgZ3Vlc3RfcG9ydGFsYFxuICAgIC8vIGdyYW50cyBgY3JtX2Nhc2UuYWxsb3dDcmVhdGVgIGF0IHRoZSBPQkpFQ1QgbGV2ZWwgd2l0aCBubyBmaWVsZFxuICAgIC8vIGFsbG93LWxpc3QsIHdoaWNoIGlzIHByZWNpc2VseSB3aHkgdGhpcyBicmFuY2ggaXMgdGhlIGZpZWxkLWxldmVsIGNvbnRyb2xcbiAgICAvLyBhbmQgd2h5IGFuIG9taXNzaW9uIGZyb20gaXQgaXMgYSBob2xlIHJhdGhlciB0aGFuIGEgc2Vjb25kIGxheWVyLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoZSBtaWRkbGV3YXJlIHBhdGggaXMgTUVBU1VSRUQsIGFuZCB0aGUgYW5zd2VyIGJvdW5kcyB3aGF0IHRoaXNcbiAgICAvLyBicmFuY2ggbWF5IGNsYWltLiBBIHJlYWwgYW5vbnltb3VzIHdyaXRlIGRvZXMgTk9UIHJlYWNoIHRoZXNlIGNvbHVtbnMgb25cbiAgICAvLyB0aGUgc2hpcHBlZCBhcHAgdG9kYXkgXHUyMDE0IGFuZCB0aGlzIGJyYW5jaCBpcyBub3Qgd2hhdCBzdG9wcyBpdC4gRHJpdmVuXG4gICAgLy8gYWdhaW5zdCBhIHJlYWwgc2VydmVyIChgb2JqZWN0c3RhY2sgc3RhcnRgLCB0aGUgcHJvZHVjdGlvbiBwbHVnaW4gc2V0OlxuICAgIC8vIEF1dGgsIFNlY3VyaXR5LCBTaGFyaW5nLCBSZXN0QVBJKSwgdW5hdXRoZW50aWNhdGVkIG92ZXIgSFRUUDpcbiAgICAvL1xuICAgIC8vICAgUE9TVCAgL2FwaS92MS9kYXRhL2NybV9jYXNlICAgICAgICAgNDAxIFVOQVVUSEVOVElDQVRFRFxuICAgIC8vICAgUEFUQ0ggL2FwaS92MS9kYXRhL2NybV9jYXNlLzppZCAgICAgNDAxIFVOQVVUSEVOVElDQVRFRFxuICAgIC8vICAgUE9TVCAgL2FwaS92MS9hY3Rpb25zLy4uLiAgICAgICAgICAgNDAxIFVOQVVUSEVOVElDQVRFRFxuICAgIC8vICAgUE9TVCAgL2FwaS92MS9tY3AgICAgICAgICAgICAgICAgICAgNDAxIFVOQVVUSEVOVElDQVRFRFxuICAgIC8vICAgUE9TVCAgL2FwaS92MS9mb3Jtcy9zdXBwb3J0L3N1Ym1pdCAgMjAxIFx1MjAxNCB0aGUgT05FIGFub255bW91cyB3cml0ZSBwYXRoXG4gICAgLy9cbiAgICAvLyBhbmQgdGhhdCBzdXJ2aXZpbmcgcm91dGUgZmlsdGVycyB0aGUgYm9keSBhZ2FpbnN0IGFuIGFsbG93LWxpc3QgYnVpbHRcbiAgICAvLyBmcm9tIHRoZSBtYXRjaGVkIGZvcm0gdmlldydzIE9XTiBkZWNsYXJlZCBzZWN0aW9ucyAoYEBvYmplY3RzdGFjay9yZXN0YCxcbiAgICAvLyBgcmVnaXN0ZXJGb3JtRW5kcG9pbnRzYCksIHNvIGEgcGxhbnRlZCBpbnRlcm5hbCBmaWVsZCBpcyBkcm9wcGVkIGJlZm9yZVxuICAgIC8vIE9iamVjdFFMIGFuZCBiZWZvcmUgdGhpcyBob29rLlxuICAgIC8vIFx1MjZENCBTbyBkbyBOT1Qgd3JpdGUgZG93biB0aGF0IGEgZ3Vlc3QgcmVhY2hlcyB0aGVzZSBjb2x1bW5zIGluIHByb2R1Y3Rpb24uXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgQW5kIGRvIG5vdCByZWFkIHRoYXQgYXMgXCJ0aGlzIGJyYW5jaCBpcyBjb3NtZXRpY1wiLiBUaGF0IGFsbG93LWxpc3QgaXNcbiAgICAvLyB0aGUgZm9ybSdzIEZJRUxEIExJU1QgXHUyMDE0IGEgcHJvZHVjdCBkZWNpc2lvbiwgbm90IGEgc2VjdXJpdHkgZGVjbGFyYXRpb24gXHUyMDE0XG4gICAgLy8gYW5kICMxNTA1IG1lYXN1cmVkIGl0IGJ5IHdpZGVuaW5nIGl0OiBPTkUgbGluZSBhZGRlZCB0byBgd2ViX3RvX2Nhc2VgJ3NcbiAgICAvLyBzZWN0aW9ucyBhbmQgdGhlIHNhbWUgYW5vbnltb3VzIFBPU1Qgc3RvcmVkIHRoZSBwbGFudGVkIHZhbHVlLCB3aGlsZSBhXG4gICAgLy8gZmllbGQgbGVmdCBvZmYgdGhlIHdpZGVuZWQgZm9ybSBzdGF5ZWQgbnVsbCBpbiB0aGUgc2FtZSByZXF1ZXN0LiBUaGF0IGlzXG4gICAgLy8gd2hhdCBpZGVudGlmaWVzIHRoZSBmb3JtIGxpc3QgYXMgdGhlIG9ubHkgdGhpbmcgaG9sZGluZywgYW5kIHRoaXMgYnJhbmNoXG4gICAgLy8gYXMgdGhlIGxheWVyIHRoYXQgaGFzIHRvIGhvbGQgd2hlbiBpdCBtb3Zlcy4gXHUyNkEwXHVGRTBGIFRoYXQgbWVhc3VyZW1lbnQgd2FzXG4gICAgLy8gdGFrZW4gb24gYGN1c3RvbWVyX3JhdGluZ2AgLyBgY3VzdG9tZXJfZmVlZGJhY2tgLCB3aGljaCAjMTQyOCBoYXMgc2luY2VcbiAgICAvLyByZXRpcmVkIHVuZGVyIEFEUi0wMDQ5IFx1MjAxNCB0aGUgdHdvIGNvbHVtbnMgYXJlIGdvbmUsIHNvIHRoZSBicmFuY2ggbm9cbiAgICAvLyBsb25nZXIgc3RyaXBzIHRoZW07IHRoZSBtZWNoYW5pc20gdGhlIG1lYXN1cmVtZW50IGVzdGFibGlzaGVkIGlzXG4gICAgLy8gdW5jaGFuZ2VkIGFuZCBnb3Zlcm5zIGV2ZXJ5IGZpZWxkIGl0IHN0aWxsIGFzc2lnbnMuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgRmllbGQtbGV2ZWwgcGVybWlzc2lvbnMgYXJlIG5vdCBhIHNlY29uZCBsYXllciBiZWhpbmQgdGhpcyBicmFuY2gsIGFuZFxuICAgIC8vIHRoYXQgd2FzIHJlLW1lYXN1cmVkIGFnYWluc3QgdGhlIGluc3RhbGxlZCB0cmVlIHJhdGhlciB0aGFuIHRha2VuIG9uXG4gICAgLy8gcmVwb3J0OiBgUGVybWlzc2lvbkV2YWx1YXRvci5nZXRGaWVsZFBlcm1pc3Npb25zYCBidWlsZHMgaXRzIG1hc2sgT05MWVxuICAgIC8vIGZyb20gYDxvYmplY3Q+LjxmaWVsZD5gIGtleXMgYSBwZXJtaXNzaW9uIHNldCBuYW1lcyBpbiBpdHMgYGZpZWxkc2AgbWFwLFxuICAgIC8vIGFuZCBgRmllbGRNYXNrZXIuZGV0ZWN0Rm9yYmlkZGVuV3JpdGVzYCByZXR1cm5zIGVhcmx5IG9uIGFuIGVtcHR5IG1hc2tcbiAgICAvLyBhbmQgb3RoZXJ3aXNlIGZsYWdzIG9ubHkgbmFtZXMgcHJlc2VudCBpbiBpdC4gYGd1ZXN0X3BvcnRhbGAgZGVjbGFyZXMgbm9cbiAgICAvLyBgZmllbGRzYCBrZXkgYXQgYWxsLCBzbyBpdHMgbWFzayBpcyBlbXB0eSBhbmQgdGhlIHdyaXRlIGd1YXJkIGlzIHNraXBwZWRcbiAgICAvLyBvdXRyaWdodCBcdTIwMTQgYSBmaWVsZCBOTyBwcm9maWxlIG5hbWVzIGlzIHVucmVzdHJpY3RlZCwgbm90IHJlc3RyaWN0ZWQuXG4gICAgLy9cbiAgICAvLyBOdWxsaW5nIGBlc2NhbGF0aW9uX3JlYXNvbmAgY2Fubm90IHRyaXAgdGhlIG9iamVjdCdzXG4gICAgLy8gYGVzY2FsYXRpb25fcmVhc29uX3JlcXVpcmVkYCB2YWxpZGF0aW9uOiB0aGF0IHJ1bGUgZmlyZXMgb25seSBvblxuICAgIC8vIGBpc19lc2NhbGF0ZWQgPT0gdHJ1ZWAsIHRoaXMgc2FtZSBicmFuY2ggZm9yY2VzIGBpc19lc2NhbGF0ZWQgPSBmYWxzZWAsXG4gICAgLy8gYW5kIG9uIHRoZSBlbmdpbmUncyBpbnNlcnQgcGF0aCBgdmFsaWRhdGVSZWNvcmRgIC9cbiAgICAvLyBgZXZhbHVhdGVWYWxpZGF0aW9uUnVsZXNgIHJ1biBBRlRFUiB0aGUgYGJlZm9yZUluc2VydGAgaG9va3MsIGFnYWluc3QgdGhlXG4gICAgLy8gcm93IHRoZSBob29rIGhhcyBhbHJlYWR5IHJld3JpdHRlbi5cbiAgICBjb25zdCBpc0d1ZXN0U3VibWlzc2lvbiA9ICFjdHgucHJldmlvdXMgJiYgIWN0eC51c2VyPy5pZCAmJiAhY3R4LnNlc3Npb24/LmlzU3lzdGVtO1xuICAgIGlmIChpc0d1ZXN0U3VibWlzc2lvbikge1xuICAgICAgaWYgKCFpbnB1dC5vcmlnaW4pICAgaW5wdXQub3JpZ2luICAgPSAnd2ViJztcbiAgICAgIGlmICghaW5wdXQuc3RhdHVzKSAgIGlucHV0LnN0YXR1cyAgID0gJ25ldyc7XG4gICAgICAvLyBcdTI2QTBcdUZFMEYgTm8gYHByaW9yaXR5YCBkZWZhdWx0IGhlcmUsIGFuZCB0aGUgYWJzZW5jZSBpcyBkZWxpYmVyYXRlLiBBXG4gICAgICAvLyBgaWYgKCFpbnB1dC5wcmlvcml0eSkgaW5wdXQucHJpb3JpdHkgPSAnbWVkaXVtJ2AgbGluZSBoZXJlIGNhbiBuZXZlclxuICAgICAgLy8gZXhlY3V0ZTogYGNybV9jYXNlLnByaW9yaXR5YCBkZWNsYXJlcyBpdHMgYGxvd2Agb3B0aW9uIGBkZWZhdWx0OiB0cnVlYCxcbiAgICAgIC8vIGFuZCBvbiB0aGUgZW5naW5lJ3Mgb3duIGluc2VydCBwYXRoIGBhcHBseUZpZWxkRGVmYXVsdHNgIHByb2R1Y2VzIHRoZVxuICAgICAgLy8gcm93IHRoYXQgQkVDT01FUyBgY3R4LmlucHV0LmRhdGFgIGJlZm9yZSBgdHJpZ2dlckhvb2tzKCdiZWZvcmVJbnNlcnQnKWBcbiAgICAgIC8vIGlzIGNhbGxlZCBcdTIwMTQgc28gdGhlIHNsb3QgaXMgYWxyZWFkeSBmdWxsIGV2ZXJ5IHRpbWUgdGhpcyBicmFuY2ggcnVucy5cbiAgICAgIC8vIFN1Y2ggYSBsaW5lIHJlYWRzIGFzIGEgZGVjbGFyZWQgaW50ZW50IChcImd1ZXN0IHN1Ym1pc3Npb25zIHN0YXJ0IGF0XG4gICAgICAvLyBtZWRpdW1cIikgdGhhdCB0aGUgYXBwIGRvZXMgbm90IGhvbm91ci4gV2hldGhlciBhIHdlYi1zdWJtaXR0ZWQgY2FzZVxuICAgICAgLy8gU0hPVUxEIG91dHJhbmsgYSBzdGFmZi1jcmVhdGVkIG9uZSBpcyBhIHByb2R1Y3QgcXVlc3Rpb24sIGFuZCBpdCBpcyBub3RcbiAgICAgIC8vIHNldHRsZWQgYnkgbGVhdmluZyBkZWFkIGNvZGUgaGVyZSB0aGF0IHNheXMgaXQgYWxyZWFkeSBpcy5cbiAgICAgIGlucHV0Lm93bmVyX2lkICAgICAgICAgID0gbnVsbDtcbiAgICAgIGlucHV0LmlzX2VzY2FsYXRlZCAgICAgID0gZmFsc2U7XG4gICAgICBpbnB1dC5lc2NhbGF0aW9uX3JlYXNvbiA9IG51bGw7XG4gICAgICBpbnB1dC5pbnRlcm5hbF9ub3RlcyAgICA9IG51bGw7XG4gICAgICBpbnB1dC5yZXNvbHV0aW9uICAgICAgICA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcHJpb3JpdHkgPVxuICAgICAgKHR5cGVvZiBpbnB1dC5wcmlvcml0eSA9PT0gJ3N0cmluZycgJiYgaW5wdXQucHJpb3JpdHkpIHx8XG4gICAgICAodHlwZW9mIGN0eC5wcmV2aW91cz8ucHJpb3JpdHkgPT09ICdzdHJpbmcnICYmIChjdHgucHJldmlvdXMucHJpb3JpdHkgYXMgc3RyaW5nKSkgfHxcbiAgICAgIHVuZGVmaW5lZDtcblxuICAgIC8vIE1hdGVyaWFsaXNlIHRoZSB1cmdlbmN5IG9yZGluYWwgc28gcXVldWUgdmlld3MgY2FuIHNvcnQgYnkgaXQuIFNvcnRpbmcgb25cbiAgICAvLyBgcHJpb3JpdHlgIGl0c2VsZiBjb21wYXJlcyByYXcgc3RyaW5ncyBhbmQgaW52ZXJ0cyB1cmdlbmN5XG4gICAgLy8gKG1lZGl1bSA+IGxvdyA+IGhpZ2ggPiBjcml0aWNhbCkuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgVGhlIG1hcCBpcyBkZWNsYXJlZCBJTkxJTkUgYW5kIGR1cGxpY2F0ZWQgaW4gdGFzay5ob29rLnRzIG9uIHB1cnBvc2U6XG4gICAgLy8gTDIgaG9vayBib2RpZXMgcnVuIGJvZHktb25seSBpbiB0aGUgUXVpY2tKUyBzYW5kYm94LCBzbyBhIHNoYXJlZCBtb2R1bGVcbiAgICAvLyBjb25zdGFudCByZXNvbHZlcyBhdCBhdXRob3JpbmcgdGltZSBhbmQgYXJyaXZlcyBhcyBgdW5kZWZpbmVkYC4gVGhlIHR3b1xuICAgIC8vIG1hcHMga2V5IG9mZiBkaWZmZXJlbnQgdm9jYWJ1bGFyaWVzIChtZWRpdW0gdnMgbm9ybWFsKSwgYnV0IHRoZSBVTktOT1dOXG4gICAgLy8gZmFsbGJhY2sgbXVzdCBzdGF5IGlkZW50aWNhbCBvbiBib3RoIG9iamVjdHMgXHUyMDE0IGAwYCwgdGhlIHVucmFua2VkIHNlbnRpbmVsXG4gICAgLy8gdGhhdCBzb3J0cyBiZWxvdyBldmVyeSByZWFsIHJhbmsuIGB0ZXN0L3ByaW9yaXR5LXJhbmstcGFyaXR5LnRlc3QudHNgXG4gICAgLy8gcGlucyB0aGF0IGFncmVlbWVudC5cbiAgICBpZiAocHJpb3JpdHkpIHtcbiAgICAgIGNvbnN0IHJhbms6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7IGxvdzogMSwgbWVkaXVtOiAyLCBoaWdoOiAzLCBjcml0aWNhbDogNCB9O1xuICAgICAgaW5wdXQucHJpb3JpdHlfcmFuayA9IHJhbmtbcHJpb3JpdHldID8/IDA7XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFNMQSBwb2xpY3kgbWF0cml4OiBwcmlvcml0eSBcdTAwRDcgYWNjb3VudCB0aWVyIFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gVGhlIGNhbm9uaWNhbCB3cml0ZS11cCBcdTIwMTQgdGhlIHVuaXQsIGFuZCB3aHkgdGhlIGBjcml0aWNhbGAgcm93IGlzIGZsYXQgYXRcbiAgICAvLyA0IFx1MjAxNCBsaXZlcyBpbiBgX2Nhc2Utc2xhLnRzYC5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBUaGUgdGFibGUgaXMgZGVjbGFyZWQgSU5MSU5FIGFuZCBkdXBsaWNhdGVkIGluIGBfY2FzZS1zbGEudHNgIG9uXG4gICAgLy8gcHVycG9zZSwgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyB0aGUgYHJhbmtgIG1hcCBhYm92ZTogTDIgaG9vayBib2RpZXMgcnVuXG4gICAgLy8gYm9keS1vbmx5IGluIHRoZSBRdWlja0pTIHNhbmRib3gsIHNvIGEgc2hhcmVkIG1vZHVsZSBjb25zdGFudCByZXNvbHZlcyBhdFxuICAgIC8vIGF1dGhvcmluZyB0aW1lIGFuZCBhcnJpdmVzIGFzIGB1bmRlZmluZWRgLiBUaGUgc2VlZCBtb2R1bGUgaW1wb3J0cyB0aGVcbiAgICAvLyByZWFsIGNvbnN0YW50OyB0aGlzIGJvZHkgY2Fubm90LiBgdGVzdC9jYXNlLXNsYS1tYXRyaXgudGVzdC50c2AgcGlucyBhbGxcbiAgICAvLyBzaXh0ZWVuIGNlbGxzIGJ5IGRyaXZpbmcgVEhJUyBoYW5kbGVyLCBzbyB0aGUgY29waWVzIGNhbm5vdCBkcmlmdC5cbiAgICBpZiAocHJpb3JpdHkgJiYgIWlucHV0LnNsYV9kdWVfZGF0ZSAmJiAhY3R4LnByZXZpb3VzPy5zbGFfZHVlX2RhdGUpIHtcbiAgICAgIGNvbnN0IHNsYUNhbGVuZGFySG91cnM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIG51bWJlcj4+ID0ge1xuICAgICAgICBjcml0aWNhbDogeyBzdHJhdGVnaWM6IDQsIGVudGVycHJpc2U6IDQsIG1pZF9tYXJrZXQ6IDQsIHNtYjogNCB9LFxuICAgICAgICBoaWdoOiB7IHN0cmF0ZWdpYzogNiwgZW50ZXJwcmlzZTogOCwgbWlkX21hcmtldDogOCwgc21iOiA4IH0sXG4gICAgICAgIG1lZGl1bTogeyBzdHJhdGVnaWM6IDI0LCBlbnRlcnByaXNlOiAzNiwgbWlkX21hcmtldDogNDgsIHNtYjogNDggfSxcbiAgICAgICAgbG93OiB7IHN0cmF0ZWdpYzogOTYsIGVudGVycHJpc2U6IDEyMCwgbWlkX21hcmtldDogMTY4LCBzbWI6IDE2OCB9LFxuICAgICAgfTtcbiAgICAgIC8vIGBzbWJgIGlzIGJvdGggdGhlIGxvb3Nlc3QgY29sdW1uIGFuZCB0aGUgYHRpZXJgIGZpZWxkJ3Mgb3duIGRlZmF1bHQsIHNvXG4gICAgICAvLyBhbiB1bmNsYXNzaWZpZWQgYWNjb3VudCBhbmQgYW4gVU5SRUFEQUJMRSBvbmUgbGFuZCBvbiB0aGUgc2FtZSBjZWxsLlxuICAgICAgLy8gRXJyaW5nIGxvb3NlIGlzIHRoZSBzYWZlIGRpcmVjdGlvbjogYSB0aWdodGVyIGRlYWRsaW5lIGludmVudGVkIG91dCBvZlxuICAgICAgLy8gYSBwZXJtaXNzaW9uIGVycm9yIHdvdWxkIG1hbnVmYWN0dXJlIGJyZWFjaGVzLlxuICAgICAgY29uc3QgREVGQVVMVF9USUVSID0gJ3NtYic7XG4gICAgICBjb25zdCByb3cgPSBzbGFDYWxlbmRhckhvdXJzW3ByaW9yaXR5XTtcbiAgICAgIC8vIEFuIHVucmVjb2duaXNlZCBwcmlvcml0eSBnZXRzIG5vIGNsb2NrIGF0IGFsbCByYXRoZXIgdGhhbiBhIGd1ZXNzZWRcbiAgICAgIC8vIG9uZSBcdTIwMTQgdGhlIHNhbWUgcmVmdXNhbC10by1pbnZlbnQgYXMgdGhlIGAwYCB1bnJhbmtlZCBzZW50aW5lbCBhYm92ZS5cbiAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgbGV0IHRpZXIgPSBERUZBVUxUX1RJRVI7XG4gICAgICAgIC8vIE9ubHkgcGF5IGZvciB0aGUgYWNjb3VudCByZWFkIHdoZW4gdGhlIHJvdyBhY3R1YWxseSB2YXJpZXMgYnkgdGllci5cbiAgICAgICAgLy8gVGhlIGBjcml0aWNhbGAgcm93IGRvZXMgbm90LCB3aGljaCBpcyB3aGF0IG1ha2VzIGEgY3JpdGljYWwgY2FzZVxuICAgICAgICAvLyBiZWhhdmUgRVhBQ1RMWSBhcyBpdCBkaWQgYmVmb3JlIHRoaXMgaG9vayBsZWFybmVkIGFib3V0IGFjY291bnRzIFx1MjAxNFxuICAgICAgICAvLyBzYW1lIDQgaG91cnMsIHNhbWUgYWJzZW5jZSBvZiBhbnkgZGVwZW5kZW5jeSBvbiBgY3R4LmFwaWAuXG4gICAgICAgIGNvbnN0IHZhcmllc0J5VGllciA9XG4gICAgICAgICAgcm93LnN0cmF0ZWdpYyAhPT0gcm93LmVudGVycHJpc2UgfHxcbiAgICAgICAgICByb3cuZW50ZXJwcmlzZSAhPT0gcm93Lm1pZF9tYXJrZXQgfHxcbiAgICAgICAgICByb3cubWlkX21hcmtldCAhPT0gcm93LnNtYjtcbiAgICAgICAgY29uc3QgYWNjb3VudElkID1cbiAgICAgICAgICAodHlwZW9mIGlucHV0LmNybV9hY2NvdW50ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jcm1fYWNjb3VudCkgfHxcbiAgICAgICAgICAodHlwZW9mIGN0eC5wcmV2aW91cz8uY3JtX2FjY291bnQgPT09ICdzdHJpbmcnICYmIChjdHgucHJldmlvdXMuY3JtX2FjY291bnQgYXMgc3RyaW5nKSkgfHxcbiAgICAgICAgICB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh2YXJpZXNCeVRpZXIgJiYgYWNjb3VudElkICYmIGFwaSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZCA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9hY2NvdW50JykuZmluZCh7XG4gICAgICAgICAgICAgIHdoZXJlOiB7IGlkOiBhY2NvdW50SWQgfSwgZmllbGRzOiBbJ3RpZXInXSwgdG9wOiAxLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByb3dzID0gQXJyYXkuaXNBcnJheShmb3VuZCkgPyBmb3VuZCA6IFtdO1xuICAgICAgICAgICAgY29uc3Qgc3RvcmVkID0gcm93cy5sZW5ndGggPyByb3dzWzBdLnRpZXIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHN0b3JlZCA9PT0gJ3N0cmluZycgJiYgc3RvcmVkKSB0aWVyID0gc3RvcmVkO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgdGllciByZXNvbHV0aW9uOiB0aGUgYW5vbnltb3VzIHdlYi10by1jYXNlIGdyYW50IGNhblxuICAgICAgICAgICAgLy8gY3JlYXRlIGEgY2FzZSBhbmQgcmVhZCBub3RoaW5nIGVsc2UsIGFuZCBhIGRlbmlhbCB0aGVyZSBtdXN0IG5vdFxuICAgICAgICAgICAgLy8gcmVqZWN0IHRoZSBzdWJtaXNzaW9uLiBGYWxsaW5nIHRocm91Z2ggbGVhdmVzIGB0aWVyYCBvbiB0aGVcbiAgICAgICAgICAgIC8vIGRlZmF1bHQgY29sdW1uLiAoTm8gYGNvbnNvbGVgIGluIHRoZSBMMiBob29rIHNhbmRib3ggXHUyMDE0IGNmLiAjNDcxLilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaG91cnMgPSByb3dbdGllcl0gPz8gcm93W0RFRkFVTFRfVElFUl07XG4gICAgICAgIC8vIE1pbGxpc2Vjb25kcywgbm90IGBzZXRIb3VycyhnZXRIb3VycygpICsgbilgOiB0aGUgbGF0dGVyIGRvZXMgTE9DQUxcbiAgICAgICAgLy8gY2FsZW5kYXIgYXJpdGhtZXRpYywgc28gb24gYSBob3N0IGluIGEgRFNULW9ic2VydmluZyB6b25lIFwiKzQgaG91cnNcIlxuICAgICAgICAvLyBzaWxlbnRseSBiZWNvbWVzIDMgb3IgNSByZWFsIGhvdXJzIGFjcm9zcyBhIHRyYW5zaXRpb24gXHUyMDE0IGFuZCBhIDE2OGhcbiAgICAgICAgLy8gTG93LXByaW9yaXR5IGNsb2NrIGNyb3NzZXMgb25lIHR3aWNlIGEgeWVhciBieSBjb25zdHJ1Y3Rpb24uIFRoZXNlXG4gICAgICAgIC8vIGFyZSBlbGFwc2VkIGhvdXJzLCBzbyBhZGQgZWxhcHNlZCBtaWxsaXNlY29uZHMuXG4gICAgICAgIGlucHV0LnNsYV9kdWVfZGF0ZSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBob3VycyAqIDNfNjAwXzAwMCkudG9JU09TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbG9zZWQgZmxhZy9kYXRlICsgcmVzb2x1dGlvbiB0aW1lLlxuICAgIGNvbnN0IGVmZlN0YXR1cyA9XG4gICAgICAodHlwZW9mIGlucHV0LnN0YXR1cyA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3RhdHVzKSB8fFxuICAgICAgKHR5cGVvZiBjdHgucHJldmlvdXM/LnN0YXR1cyA9PT0gJ3N0cmluZycgJiYgKGN0eC5wcmV2aW91cy5zdGF0dXMgYXMgc3RyaW5nKSkgfHxcbiAgICAgIHVuZGVmaW5lZDtcblxuICAgIC8vIGBpc19jbG9zZWRgIGlzIERFUklWRUQgZnJvbSBgc3RhdHVzYCwgb24gZXZlcnkgd3JpdGUgaW5jbHVkaW5nIGEgZ3Vlc3Qncy5cbiAgICAvLyBcdTI2RDQgTmV2ZXIgbWFrZSB0aGUgcmVjb21wdXRlIGNvbmRpdGlvbmFsIG9uIHRoZSBjYWxsZXI6IGEgZ3Vlc3Qnc1xuICAgIC8vIGBzdGF0dXM6ICdjbG9zZWQnYCBzdG9yZWQgYWxvbmdzaWRlIGBpc19jbG9zZWQ6IGZhbHNlYCBjb250cmFkaWN0c1xuICAgIC8vIGl0c2VsZiwgYW5kIGV2ZXJ5IGNvbnN1bWVyIGtleWVkIG9uIHRoZSBmbGFnIFx1MjAxNCB0aGUgcGlubmVkXG4gICAgLy8gYHVuYXNzaWduZWRfdHJpYWdlYCB2aWV3LCB0aGUgYGNhc2VfdW5hc3NpZ25lZF90cmlhZ2Vfc2hhcmluZ2AgcnVsZSBcdTIwMTRcbiAgICAvLyByZWFkcyBzdWNoIGEgY2FzZSBhcyBvcGVuIGJhY2tsb2cgZm9yZXZlci4gQSBkZXJpdmVkIGNvbHVtbiBpcyBkZXJpdmVkIG9uXG4gICAgLy8gZXZlcnkgd3JpdGUgb3IgaXQgaXMgbm90IGRlcml2ZWQgYXQgYWxsOyB0aGUgZ3Vlc3QncyBvd24gYGlzX2Nsb3NlZGAgaXNcbiAgICAvLyBzdGlsbCBpZ25vcmVkLCBiZWNhdXNlIHRoaXMgcmVjb21wdXRlIG92ZXJ3cml0ZXMgd2hhdGV2ZXIgdGhleSBzZW50LlxuICAgIGlmICh0eXBlb2YgZWZmU3RhdHVzID09PSAnc3RyaW5nJykgaW5wdXQuaXNfY2xvc2VkID0gZWZmU3RhdHVzID09PSAnY2xvc2VkJztcblxuICAgIGlmICghaXNHdWVzdFN1Ym1pc3Npb24pIHtcbiAgICAgIGNvbnN0IGJlY2FtZUNsb3NlZCA9IGlucHV0LnN0YXR1cyA9PT0gJ2Nsb3NlZCcgJiYgY3R4LnByZXZpb3VzPy5zdGF0dXMgIT09ICdjbG9zZWQnO1xuICAgICAgaWYgKGJlY2FtZUNsb3NlZCAmJiAhaW5wdXQuY2xvc2VkX2RhdGUgJiYgIWN0eC5wcmV2aW91cz8uY2xvc2VkX2RhdGUpIHtcbiAgICAgICAgaW5wdXQuY2xvc2VkX2RhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNsb3NlZERhdGUgPVxuICAgICAgICAodHlwZW9mIGlucHV0LmNsb3NlZF9kYXRlID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jbG9zZWRfZGF0ZSkgfHxcbiAgICAgICAgKHR5cGVvZiBjdHgucHJldmlvdXM/LmNsb3NlZF9kYXRlID09PSAnc3RyaW5nJyAmJiAoY3R4LnByZXZpb3VzLmNsb3NlZF9kYXRlIGFzIHN0cmluZykpIHx8XG4gICAgICAgIHVuZGVmaW5lZDtcbiAgICAgIC8vIFRoZSBjcmVhdGlvbiBpbnN0YW50IGlzIHRoZSBwbGF0Zm9ybSdzIGBjcmVhdGVkX2F0YCAoIzE5OTIpOiBzdGFtcGVkXG4gICAgICAvLyBieSBgc3lzX3N0YW1wX2F1ZGl0X2luc2VydGAgYmVmb3JlIHRoaXMgaG9vayBydW5zIG9uIGFuIGluc2VydCAoYVxuICAgICAgLy8gc2VlZCByb3cga2VlcHMgaXRzIGF1dGhvcmVkIHZhbHVlKSwgYW5kIHJlYWQgYmFjayBvZmYgdGhlIHN0b3JlZCByb3dcbiAgICAgIC8vIG9uIGFuIHVwZGF0ZS5cbiAgICAgIGNvbnN0IGNyZWF0ZWREYXRlID1cbiAgICAgICAgKHR5cGVvZiBpbnB1dC5jcmVhdGVkX2F0ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jcmVhdGVkX2F0KSB8fFxuICAgICAgICAodHlwZW9mIGN0eC5wcmV2aW91cz8uY3JlYXRlZF9hdCA9PT0gJ3N0cmluZycgJiYgKGN0eC5wcmV2aW91cy5jcmVhdGVkX2F0IGFzIHN0cmluZykpIHx8XG4gICAgICAgIHVuZGVmaW5lZDtcbiAgICAgIGlmIChjbG9zZWREYXRlICYmIGNyZWF0ZWREYXRlKSB7XG4gICAgICAgIGNvbnN0IGhycyA9IChuZXcgRGF0ZShjbG9zZWREYXRlKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShjcmVhdGVkRGF0ZSkuZ2V0VGltZSgpKSAvIDNfNjAwXzAwMDtcbiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShocnMpICYmIGhycyA+PSAwKSBpbnB1dC5yZXNvbHV0aW9uX3RpbWVfaG91cnMgPSBNYXRoLnJvdW5kKGhycyAqIDEwKSAvIDEwO1xuICAgICAgfVxuXG4gICAgICAvLyBcdTI1MDBcdTI1MDAgVGhlIGJyZWFjaCBpcyByZWNvcmRlZCB3aGVuIHRoZSBjbG9jayBzdG9wcyAoIzIwNzApIFx1MjUwMFx1MjUwMFxuICAgICAgLy9cbiAgICAgIC8vIGBjYXNlX3NsYV9tb25pdG9yYCBmbGFncyBhIGJyZWFjaCBvbmx5IHdoaWxlIGEgY2FzZSBpcyBsaXZlIHdvcmssIGFuZFxuICAgICAgLy8gb25seSB3aGVyZSBzY2hlZHVsZWQgd29yayBydW5zLiBBIGNhc2UgcmVzb2x2ZWQgb3IgY2xvc2VkIGFmdGVyIGl0c1xuICAgICAgLy8gYHNsYV9kdWVfZGF0ZWAgdGhlcmVmb3JlIGtlcHQgYGlzX3NsYV92aW9sYXRlZDogZmFsc2VgIGZvciBnb29kLCBhbmRcbiAgICAgIC8vIHRoZSBjbG9zZWQtY2FzZSBzdXJmYWNlcyAoYHNsYV9wZXJmb3JtYW5jZWAsIHRoZSBjb21wbGlhbmNlIGdhdWdlKVxuICAgICAgLy8gY291bnRlZCBpdCBhcyBtZXQuIFRoZSB3cml0ZSB0aGF0IHRha2VzIHRoZSBjYXNlIG91dCBvZiBsaXZlIHdvcmsgaXNcbiAgICAgIC8vIHRoZSBtb21lbnQgaXRzIGNsb2NrIHN0b3BzLCBzbyB0aGF0IHdyaXRlIHJlY29yZHMgYSBsYXRlIGZpbmlzaC5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgcnVsZSBpcyBgY2FzZVNsYUJyZWFjaGVkYCBpbiBgX2Nhc2Utc2xhLnRzYDsgdGhlIHN0YXR1cyBzZXQgaXNcbiAgICAgIC8vIGBDTE9TRURfQ0FTRV9TVEFUVVNFU2AgaW4gYF9jYXNlLWFzc2lnbm1lbnQudHNgLiBCb3RoIGFyZSBzcGVsbGVkXG4gICAgICAvLyBpbmxpbmUgYmVjYXVzZSB0aGlzIGJvZHkgaGFzIG5vIG1vZHVsZSBzY29wZTpcbiAgICAgIC8vIGB0ZXN0L2Nhc2Utc2xhLWJyZWFjaC1vbi1jbG9zZS50ZXN0LnRzYCBkcml2ZXMgdGhlIGxvd2VyZWQgYm9keVxuICAgICAgLy8gYWdhaW5zdCB0aGUgaGVscGVyLCBhbmQgYHRlc3QvbGl2ZS13b3JrLXByZWRpY2F0ZS1wYXJpdHkudGVzdC50c2AgcGluc1xuICAgICAgLy8gdGhlIHNldCBieSBuYW1lLiBPbmx5IHRoZSBFTlRSWSBpbnRvIHRoZSBzZXQgaXMganVkZ2VkIChhXG4gICAgICAvLyByZXNvbHZlZCBcdTIxOTIgY2xvc2VkIHdyaXRlIHN0b3BwZWQgbm8gY2xvY2spLCBhIGNhc2Ugd2l0aCBubyBkdWUgZGF0ZSBpc1xuICAgICAgLy8gbGVmdCBhbG9uZSwgYW5kIHRoZSBmbGFnIGlzIG5ldmVyIGNsZWFyZWQgXHUyMDE0IGEgYnJlYWNoIHN0YXlzIHJlY29yZGVkLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBzdG9wIGluc3RhbnQgaXMgdGhlIGBjbG9zZWRfZGF0ZWAgdGhpcyB3cml0ZSBjYXJyaWVzIFx1MjAxNCB0aGUgc3RhbXBcbiAgICAgIC8vIGFib3ZlLCBvciBhIHN5c3RlbSB3cml0ZXIncyBvd24gXHUyMDE0IGVsc2Ugbm93LiBUaGUgZmxhZyBpcyB3cml0dGVuIG9udG9cbiAgICAgIC8vIHRoaXMgcmVjb3JkJ3Mgb3duIHBheWxvYWQsIHdoaWNoIGlzIG5vdCBhIGNhbGxlci1zdXBwbGllZCBrZXksIHNvIHRoZVxuICAgICAgLy8gYWdlbnQncyBgZWRpdGFibGU6IGZhbHNlYCBtYXNrIG9uIGl0IGRvZXMgbm90IHJlZnVzZSB0aGUgYWdlbnQncyBjbG9zZS5cbiAgICAgIGNvbnN0IHNldHRsZWRTdGF0dXNlcyA9IFsncmVzb2x2ZWQnLCAnY2xvc2VkJ107XG4gICAgICBpZiAoc2V0dGxlZFN0YXR1c2VzLmluY2x1ZGVzKFN0cmluZyhlZmZTdGF0dXMpKSAmJiAhc2V0dGxlZFN0YXR1c2VzLmluY2x1ZGVzKFN0cmluZyhjdHgucHJldmlvdXM/LnN0YXR1cykpKSB7XG4gICAgICAgIGNvbnN0IGR1ZSA9IGlucHV0LnNsYV9kdWVfZGF0ZSAhPT0gdW5kZWZpbmVkID8gaW5wdXQuc2xhX2R1ZV9kYXRlIDogY3R4LnByZXZpb3VzPy5zbGFfZHVlX2RhdGU7XG4gICAgICAgIGNvbnN0IHN0b3BwZWRBdCA9ICh0eXBlb2YgaW5wdXQuY2xvc2VkX2RhdGUgPT09ICdzdHJpbmcnICYmIGlucHV0LmNsb3NlZF9kYXRlKSB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIGlmICh0eXBlb2YgZHVlID09PSAnc3RyaW5nJyAmJiBEYXRlLnBhcnNlKGR1ZSkgPCBEYXRlLnBhcnNlKHN0b3BwZWRBdCkpIGlucHV0LmlzX3NsYV92aW9sYXRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY2FzZVNpZGVFZmZlY3RzOiBIb29rID0ge1xuICBuYW1lOiAnY2FzZV9zdGF0dXNfc2lkZV9lZmZlY3RzJyxcbiAgb2JqZWN0OiAnY3JtX2Nhc2UnLFxuICBldmVudHM6IFsnYWZ0ZXJVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDgwMCxcbiAgYXN5bmM6IHRydWUsXG4gIG9uRXJyb3I6ICdsb2cnLFxuICBkZXNjcmlwdGlvbjogJ09wZW4gdGhlIGVzY2FsYXRpb24gZm9sbG93LXVwIHRhc2sgZm9yIHRoZSBhY2NvdW50IG93bmVyLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gY3R4O1xuICAgIGNvbnN0IHByZXZpb3VzID0gY3R4LnByZXZpb3VzO1xuICAgIGlmICghcHJldmlvdXMpIHJldHVybjtcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcblxuICAgIGNvbnN0IGNhc2VJZCA9XG4gICAgICAodHlwZW9mIGlucHV0LmlkID09PSAnc3RyaW5nJyAmJiBpbnB1dC5pZCkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXMuaWQgPT09ICdzdHJpbmcnID8gKHByZXZpb3VzLmlkIGFzIHN0cmluZykgOiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGFjY291bnRJZCA9XG4gICAgICAodHlwZW9mIGlucHV0LmNybV9hY2NvdW50ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jcm1fYWNjb3VudCkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXMuY3JtX2FjY291bnQgPT09ICdzdHJpbmcnICYmIHByZXZpb3VzLmNybV9hY2NvdW50KSB8fFxuICAgICAgdW5kZWZpbmVkO1xuXG4gICAgLy8gRXNjYWxhdGlvbjogb3BlbiB0YXNrIGZvciB0aGUgYWNjb3VudCBvd25lci5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBgb3duZXJfaWRgIGlzIHRoZSBwbGF0Zm9ybSBvd25lcnNoaXAgYW5jaG9yLCBhbmQgcGxhbnRpbmcgYSByZWNvcmRcbiAgICAvLyB1bmRlciBBTk9USEVSIHVzZXIgaXMgYSB0cmFuc2ZlcjogdGhlICMzMDA0IGd1YXJkIGRlbmllcyBpdCB1bmxlc3MgdGhlXG4gICAgLy8gY2FsbGVyIGhvbGRzIGBhbGxvd1RyYW5zZmVyYC4gVGhpcyBpbnNlcnQgcnVucyBvbiBgY3R4LmFwaWAsIHdoaWNoXG4gICAgLy8gY2FycmllcyB0aGUgQ0FMTEVSJ3MgY29udGV4dCAobm90IGEgc3lzdGVtIG9uZSksIHNvIHRoZSBndWFyZCBhcHBsaWVzIFx1MjAxNFxuICAgIC8vIGhlbmNlIHRoZSBgY3JtX3Rhc2suYWxsb3dUcmFuc2ZlcmAgZ3JhbnQgb24gYHNlcnZpY2VfYWdlbnRgIChzZWVcbiAgICAvLyBgc3JjL3NhbGVzL3Byb2ZpbGVzL3NlcnZpY2UtYWdlbnQucHJvZmlsZS50c2AsIGFuZCB0aGUgY2Fub25pY2FsIG5vdGUgaW5cbiAgICAvLyBgc3JjL3NhbGVzL3Byb2ZpbGVzL2luZGV4LnRzYCkuIE9uZSBvd25lcnNoaXAgY29sdW1uIG1lYW5zIG9uZSBhbnN3ZXIsIGFuZCB0aGVcbiAgICAvLyBhbnN3ZXIgaXMgdGhlIHBlcnNvbiB3aG8gbXVzdCBhY3QuXG4gICAgLy9cbiAgICAvLyBUaGUgQ0FTRSBpdHNlbGYgaGFzIGFscmVhZHkgY2hhbmdlZCBoYW5kcyBieSB0aGUgdGltZSB0aGlzIHJ1bnMsIG9uIHRoZVxuICAgIC8vIGBiZWZvcmVVcGRhdGVgIHNlYW0gb2YgdGhpcyB2ZXJ5IHVwZGF0ZSAoYGNhc2VfZXNjYWxhdGlvbl9yZWFzc2lnbmApIFx1MjAxNCBzb1xuICAgIC8vIHRoaXMgaG9vayBzdGlsbCB3cml0ZXMgbm8gYGNybV9jYXNlLm93bmVyX2lkYCBhbmQgbmVlZHMgbm9cbiAgICAvLyBgY3JtX2Nhc2UuYWxsb3dUcmFuc2ZlcmAuIFRoZSB0YXNrIGFuZCB0aGUgY2FzZSBhcmUgdHdvIGRpZmZlcmVudFxuICAgIC8vIGhhbmQtb2ZmczogdGhlIHRhc2sgZ29lcyB0byB0aGUgQUNDT1VOVCBvd25lciAoY29tbWVyY2lhbCBmb2xsb3ctdXApLCB0aGVcbiAgICAvLyBjYXNlIHRvIGEgc2VydmljZSBtYW5hZ2VyICh0aGUgd29yayBpdHNlbGYpLlxuICAgIGlmIChpbnB1dC5zdGF0dXMgPT09ICdlc2NhbGF0ZWQnICYmIHByZXZpb3VzLnN0YXR1cyAhPT0gJ2VzY2FsYXRlZCcgJiYgYWNjb3VudElkKSB7XG4gICAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2FjY291bnQnKS5maW5kT25lKHsgd2hlcmU6IHsgaWQ6IGFjY291bnRJZCB9IH0pO1xuICAgICAgY29uc3Qgb3duZXJJZCA9IChhY2NvdW50IGFzIHsgb3duZXJfaWQ/OiBzdHJpbmcgfSB8IG51bGwpPy5vd25lcl9pZCA/PyBjdHgudXNlcj8uaWQ7XG4gICAgICAvLyBVVEMgY2FsZW5kYXIgZm9yIHRoZSBzdGVwLCBtYXRjaGluZyB0aGUgYHRvSVNPU3RyaW5nKClgIHJlbmRlciBiZWxvd1xuICAgICAgLy8gKHNhbWUgc2hhcGUgYXMgYGxlYWQuaG9vay50c2AgLyBgb3Bwb3J0dW5pdHkuaG9vay50c2ApOiBhIGxvY2FsXG4gICAgICAvLyBgc2V0RGF0ZWAgc3RlcCBwcmVzZXJ2ZXMgd2FsbC1jbG9jayB0aW1lLCBzbyBhIG9uZS1kYXkgZm9sbG93LXVwIGZpbGVkXG4gICAgICAvLyBhY3Jvc3MgYSBzcHJpbmctZm9yd2FyZCBsYW5kcyBvbiB0aGUgZGF5IG9mIHRoZSBlc2NhbGF0aW9uIGl0c2VsZi5cbiAgICAgIGNvbnN0IGR1ZSA9IG5ldyBEYXRlKCk7XG4gICAgICBkdWUuc2V0VVRDRGF0ZShkdWUuZ2V0VVRDRGF0ZSgpICsgMSk7XG4gICAgICAvLyBUaXRsZSB0aGUgdGFzayB3aXRoIHdoYXQgdGhlIHJlYWRlciBhbHJlYWR5IGtub3dzIHRoZSBjYXNlIGJ5ICgjMTIwOCkuXG4gICAgICAvLyBUaXRsZSB0aGUgdGFzayB3aXRoIHdoYXQgdGhlIHJlYWRlciBhbHJlYWR5IGtub3dzIHRoZSBjYXNlIGJ5LiBUaGVcbiAgICAgIC8vIFBSSU1BUlkgS0VZIGlzIG5vdCB0aGF0OiBldmVyeSBjYXNlIHN1cmZhY2UgaW4gdGhpcyBhcHAgKHJlY29yZCBwYWdlcyxcbiAgICAgIC8vIGxpc3Qgdmlld3MsIGJyZWFkY3J1bWJzLCB0aGUgYGRpc3BsYXlfdGl0bGVgIGZvcm11bGEgb24gYGNybV9jYXNlYClcbiAgICAgIC8vIG5hbWVzIGEgY2FzZSBgQ0FTRS0wMDAzOWAsIHNvIGEgcXVldWUgb2YgdXJnZW50IHJvd3MgZGlmZmVyaW5nIG9ubHkgaW5cbiAgICAgIC8vIGEgMTYtY2hhcmFjdGVyIG9wYXF1ZSBpZCBpcyBhIHF1ZXVlIG5vYm9keSBjYW4gdHJpYWdlLiBUaGUgaWQgaXMgbm90XG4gICAgICAvLyBsb3N0IFx1MjAxNCBpdCB0cmF2ZWxzIGluIGByZWxhdGVkX3RvX2Nhc2VgIGJlbG93LCB3aGVyZSBhIHJlbGF0aW9uc2hpcFxuICAgICAgLy8gYmVsb25ncy5cbiAgICAgIC8vXG4gICAgICAvLyBCb3RoIHBhcnRzIGFyZSByZWFkIG9mZiBgcHJldmlvdXNgLCBub3QgZmV0Y2hlZDogYW4gYGFmdGVyVXBkYXRlYFxuICAgICAgLy8gcHJlLWltYWdlIGlzIHRoZSBXSE9MRSBzdG9yZWQgcm93IChgZHJpdmVyLmZpbmRPbmVgIHdpdGggbm9cbiAgICAgIC8vIHByb2plY3Rpb24pLCBzbyBgY2FzZV9udW1iZXJgIFx1MjAxNCBhbiBlbmdpbmUtaXNzdWVkIGF1dG9udW1iZXIsIG5ldmVyXG4gICAgICAvLyBwcmVzZW50IG9uIGFuIHVwZGF0ZSBwYXlsb2FkIFx1MjAxNCBhbmQgYHN1YmplY3RgIGFyZSBib3RoIGFscmVhZHkgaW4gaGFuZC5cbiAgICAgIC8vIGBzdWJqZWN0YCBzdGlsbCBwcmVmZXJzIGBpbnB1dGAsIHNpbmNlIGFuIHVwZGF0ZSBtYXkgYmUgY2hhbmdpbmcgaXQgaW5cbiAgICAgIC8vIHRoaXMgdmVyeSB3cml0ZS5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgVGhlIDI1NSBjYXAgaXMgbm90IGNvc21ldGljLiBgY3JtX3Rhc2suc3ViamVjdGAgZGVjbGFyZXNcbiAgICAgIC8vIGBtYXhMZW5ndGg6IDI1NWAgYW5kIHRoZSBlbmdpbmUgRU5GT1JDRVMgaXQsIHdoaWxlIGBjcm1fY2FzZS5zdWJqZWN0YFxuICAgICAgLy8gYWxsb3dzIHRoZSBzYW1lIDI1NSBcdTIwMTQgc28gYEVzY2FsYXRlZDogYCArIG51bWJlciArIHNlcGFyYXRvciArIGFcbiAgICAgIC8vIG1heC1sZW5ndGggY2FzZSBzdWJqZWN0IGlzIDI3OSBjaGFyYWN0ZXJzIGFuZCB0aGUgaW5zZXJ0IGlzIFJFSkVDVEVELlxuICAgICAgLy8gVGhpcyBob29rIGlzIGBhc3luYzogdHJ1ZWAgKyBgb25FcnJvcjogJ2xvZydgLCBzbyB0aGF0IHJlamVjdGlvblxuICAgICAgLy8gc3VyZmFjZXMgbm93aGVyZTogdGhlIGVzY2FsYXRpb24gdGFzayB3b3VsZCBzaW1wbHkgbmV2ZXIgZXhpc3QuXG4gICAgICAvLyBUcnVuY2F0aW5nIHRoZSBUQUlMIGtlZXBzIHRoZSBpZGVudGlmaWVyIFx1MjAxNCB0aGUgZGlzY3JpbWluYXRpbmcgaGFsZiBcdTIwMTRcbiAgICAgIC8vIGludGFjdCBpbiBhIGNvbHVtbiB0aGF0IHZpc2libHkgdHJ1bmNhdGVzIGFueXdheS5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgQ29tcG9zZWQgSU5MSU5FIHJhdGhlciB0aGFuIGluIGEgc2hhcmVkIGhlbHBlcjogaG9vayBib2RpZXMgc2hpcFxuICAgICAgLy8gYm9keS1vbmx5IHRocm91Z2ggUXVpY2tKUywgYW5kIGEgbW9kdWxlLXNjb3BlIHJlZmVyZW5jZSBtYWtlc1xuICAgICAgLy8gYGV4dHJhY3RIb29rQm9keWAgdGhyb3cgXHUyMDE0IHdoaWNoIHRoZSBDTEkgYnVpbGQgQ0FUQ0hFUywgc2lsZW50bHlcbiAgICAgIC8vIGJ1bmRsaW5nIHRoZSBjbG9zdXJlIGluc3RlYWQsIHdpdGggbm8gZ2F0ZSBnb2luZyByZWQuIFRoZSBwaW4gcnVucyB0aGlzXG4gICAgICAvLyBvdXQgb2YgdGhlIExPV0VSRUQgYm9keSBmb3IgZXhhY3RseSB0aGF0IHJlYXNvblxuICAgICAgLy8gKGB0ZXN0L2VzY2FsYXRpb24tdGFzay1zdWJqZWN0LnRlc3QudHNgKS5cbiAgICAgIGNvbnN0IGNhc2VOdW1iZXIgPSB0eXBlb2YgcHJldmlvdXMuY2FzZV9udW1iZXIgPT09ICdzdHJpbmcnID8gcHJldmlvdXMuY2FzZV9udW1iZXIudHJpbSgpIDogJyc7XG4gICAgICBjb25zdCBjYXNlU3ViamVjdCA9XG4gICAgICAgICh0eXBlb2YgaW5wdXQuc3ViamVjdCA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3ViamVjdC50cmltKCkpIHx8XG4gICAgICAgICh0eXBlb2YgcHJldmlvdXMuc3ViamVjdCA9PT0gJ3N0cmluZycgJiYgcHJldmlvdXMuc3ViamVjdC50cmltKCkpIHx8XG4gICAgICAgICcnO1xuICAgICAgY29uc3QgbGFiZWwgPSBbY2FzZU51bWJlciwgY2FzZVN1YmplY3RdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgXHUwMEI3ICcpO1xuICAgICAgY29uc3QgdGl0bGVkID0gbGFiZWwgPyBgRXNjYWxhdGVkOiAke2xhYmVsfWAgOiAnRXNjYWxhdGVkIGNhc2UgbmVlZHMgYXR0ZW50aW9uJztcbiAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV90YXNrJykuaW5zZXJ0KHtcbiAgICAgICAgc3ViamVjdDogdGl0bGVkLmxlbmd0aCA+IDI1NSA/IGAke3RpdGxlZC5zbGljZSgwLCAyNTQpfVx1MjAyNmAgOiB0aXRsZWQsXG4gICAgICAgIHN0YXR1czogJ25vdF9zdGFydGVkJyxcbiAgICAgICAgcHJpb3JpdHk6ICd1cmdlbnQnLFxuICAgICAgICB0eXBlOiAnZm9sbG93X3VwJyxcbiAgICAgICAgZHVlX2RhdGU6IGR1ZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKSxcbiAgICAgICAgb3duZXJfaWQ6IG93bmVySWQsXG4gICAgICAgIHJlbGF0ZWRfdG9fdHlwZTogJ2NybV9jYXNlJyxcbiAgICAgICAgcmVsYXRlZF90b19jYXNlOiBjYXNlSWQsXG4gICAgICAgIHJlbGF0ZWRfdG9fYWNjb3VudDogYWNjb3VudElkLFxuICAgICAgfSk7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBSZXNvbHV0aW9uIHJvbGx1cDogYSBjYXNlIHJlYWNoaW5nIGByZXNvbHZlZGAgYnVtcHMgaXRzIGFjY291bnQnc1xuICogYGxhc3RfYWN0aXZpdHlfZGF0ZWAuXG4gKlxuICogXHUyNkQ0IE5vIGRhdGUgaXMgc3RhbXBlZCBvbiB0aGUgQ0FTRSBcdTIwMTQgYGNsb3NlZF9kYXRlYCBiZWxvbmdzIGV4Y2x1c2l2ZWx5IHRvIHRoZVxuICogYGNsb3NlZGAgdHJhbnNpdGlvbiAoc3RhbXBlZCBieSBgY2FzZV9zbGFfZGVmYXVsdHNgKS4gV3JpdGluZyBpdCBhcyBhIHByb3h5XG4gKiBmb3IgYSByZXNvbHZlZC1kYXRlIGJvdGggY29ycnVwdHMgcmVzb2x1dGlvbiBtZXRyaWNzIChhIHJlc29sdmVkLXRoZW4tY2xvc2VkXG4gKiBjYXNlIGtlZXBzIGl0cyByZXNvbHZlIHRpbWUgYXMgaXRzIGNsb3NlIHRpbWUpIGFuZCByZS1lbnRlcnMgdGhlXG4gKiByZWNvcmQtY2hhbmdlIHRyaWdnZXIgc3VyZmFjZS5cbiAqXG4gKiAjIyBgcnVuQXM6ICdzeXN0ZW0nYCwgYW5kIHdoeSB0aGlzIGlzIGl0cyBvd24gaG9vayAoIzIwMTQpXG4gKlxuICogQ2FzZXMgYXJlIHJlc29sdmVkIGJ5IHNlcnZpY2UgYWdlbnRzLCBhbmQgYW4gYWdlbnQgaG9sZHMgbm8gZWRpdCByaWdodCBvblxuICogYWNjb3VudHMgXHUyMDE0IHNvIGFzIHRoZSBjYWxsZXIgdGhlIGJ1bXAgd2FzIHJlZnVzZWQsIGBvbkVycm9yOiAnbG9nJ2Agc3dhbGxvd2VkXG4gKiBpdCwgYW5kIGFuIGFnZW50J3MgcmVzb2x2ZSBuZXZlciByZWFjaGVkIHRoZSBhY2NvdW50J3MgYWN0aXZpdHkgY2xvY2suIFRoZVxuICogY2xvY2sgaXMgdGhlIGFjY291bnQncyBkZXJpdmVkIGZhY3QsIG5vdCB0aGUgYWdlbnQncyBlZGl0LCBzbyB0aGUgd3JpdGUgaXNcbiAqIGVsZXZhdGVkLiBJdCBpcyBzcGxpdCBvdXQgb2YgYGNhc2Vfc3RhdHVzX3NpZGVfZWZmZWN0c2AgYmVjYXVzZSBgcnVuQXNgIGlzXG4gKiBwZXIgaG9vayBhbmQgdGhhdCBob29rJ3Mgb3RoZXIgd3JpdGUgXHUyMDE0IHRoZSBlc2NhbGF0aW9uIHRhc2sgXHUyMDE0IG5lZWRzIG5vXG4gKiBlbGV2YXRpb246IHRoZSBhZ2VudCdzIG5hcnJvdyBgY3JtX3Rhc2suYWxsb3dUcmFuc2ZlcmAgZ3JhbnQgZXhpc3RzIGZvciBpdFxuICogKGBzZXJ2aWNlLWFnZW50LnByb2ZpbGUudHNgKS4gRWxldmF0aW5nIGFzIGxpdHRsZSBhcyBwb3NzaWJsZSAoQUdFTlRTLm1kIHJ1bGVcbiAqIDkpIG1lYW5zIHRoaXMgb25lIHdyaXRlLiBFbGV2YXRpb24gaXMgbm90IGFub255bWl0eTogdGhlIGFjY291bnQnc1xuICogYHVwZGF0ZWRfYnlgIHN0aWxsIG5hbWVzIHRoZSBhZ2VudC4gT3JnYW5pemF0aW9uIChydWxlIDEwKTogaXQgd3JpdGVzIG9ubHlcbiAqIHRoZSBhY2NvdW50IHRoZSB0cmlnZ2VyaW5nIGNhc2UgbmFtZXMsIGFuZCB0aGUgZWxldmF0ZWQgYGN0eC5hcGlgIGtlZXBzIHRoZVxuICogdHJpZ2dlcidzIHRlbmFudC5cbiAqL1xuY29uc3QgY2FzZVJlc29sdXRpb25BY2NvdW50QWN0aXZpdHk6IEhvb2sgPSB7XG4gIG5hbWU6ICdjYXNlX3Jlc29sdXRpb25fYWNjb3VudF9hY3Rpdml0eScsXG4gIG9iamVjdDogJ2NybV9jYXNlJyxcbiAgZXZlbnRzOiBbJ2FmdGVyVXBkYXRlJ10sXG4gIHByaW9yaXR5OiA4MDAsXG4gIGFzeW5jOiB0cnVlLFxuICBvbkVycm9yOiAnbG9nJyxcbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICBkZXNjcmlwdGlvbjogJ0J1bXAgdGhlIGFjY291bnRcdTIwMTlzIGxhc3QgYWN0aXZpdHkgZGF0ZSB3aGVuIGEgY2FzZSBpcyByZXNvbHZlZC4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICBpZiAoIXByZXZpb3VzKSByZXR1cm47XG4gICAgaWYgKGlucHV0LnN0YXR1cyAhPT0gJ3Jlc29sdmVkJyB8fCBwcmV2aW91cy5zdGF0dXMgPT09ICdyZXNvbHZlZCcpIHJldHVybjtcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcbiAgICBjb25zdCBhY2NvdW50SWQgPVxuICAgICAgKHR5cGVvZiBpbnB1dC5jcm1fYWNjb3VudCA9PT0gJ3N0cmluZycgJiYgaW5wdXQuY3JtX2FjY291bnQpIHx8XG4gICAgICAodHlwZW9mIHByZXZpb3VzLmNybV9hY2NvdW50ID09PSAnc3RyaW5nJyAmJiBwcmV2aW91cy5jcm1fYWNjb3VudCkgfHxcbiAgICAgIHVuZGVmaW5lZDtcbiAgICBpZiAoIWFjY291bnRJZCkgcmV0dXJuO1xuICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV9hY2NvdW50JykudXBkYXRlKFxuICAgICAgeyBpZDogYWNjb3VudElkLCBsYXN0X2FjdGl2aXR5X2RhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCkgfSxcbiAgICAgIHsgd2hlcmU6IHsgaWQ6IGFjY291bnRJZCB9IH0sXG4gICAgKTtcbiAgfSxcbn07XG5cbi8qKlxuICogT3duZXJsZXNzLWludGFrZSByb3VuZC1yb2JpbiwgY29tcG9zZWQgZnJvbSBgX2Nhc2UtYXNzaWdubWVudC50c2AuXG4gKlxuICogXHUyNkEwXHVGRTBGIExpc3RlZCBBRlRFUiBgY2FzZV9zbGFfZGVmYXVsdHNgIGhlcmUgZm9yIHJlYWRhYmlsaXR5IG9ubHkgXHUyMDE0IHJ1bnRpbWVcbiAqIG9yZGVyaW5nIGlzIGRlY2lkZWQgYnkgYHByaW9yaXR5YCAoMjUwIHZzIDIwMCksIG5vdCBieSBhcnJheSBwb3NpdGlvbiwgYW5kIGl0XG4gKiBpcyBsb2FkLWJlYXJpbmc6IGBjYXNlX3NsYV9kZWZhdWx0c2Agc3RyaXBzIGEgZ3Vlc3Qtc3VwcGxpZWQgYG93bmVyX2lkYCBhbmRcbiAqIHRoaXMgaG9vayBtdXN0IHJ1biBhZnRlciB0aGUgc3RyaXAsIG5ldmVyIGJlZm9yZSBpdC5cbiAqL1xuY29uc3QgY2FzZUF1dG9Bc3NpZ246IEhvb2sgPSBjcmVhdGVDYXNlUm91bmRSb2JpbkFzc2lnbigpO1xuXG4vKipcbiAqIEVzY2FsYXRpb24gaGFuZC1vZmYgdG8gdGhlIGBzZXJ2aWNlX21hbmFnZXJgIHBvb2wsIGNvbXBvc2VkIGZyb21cbiAqIGBfY2FzZS1hc3NpZ25tZW50LnRzYC5cbiAqXG4gKiBSdW5zIG9uIGBiZWZvcmVVcGRhdGVgIGFuZCBtdXRhdGVzIHRoZSBlc2NhbGF0aW9uIHdyaXRlIGl0c2VsZiBcdTIwMTQgaXQgaXNzdWVzIG5vXG4gKiBvcGVyYXRpb24gb2YgaXRzIG93biwgd2hpY2ggaXMgd2hhdCBrZWVwcyBpdCBvZmYgdGhlIHJlY29yZC1jaGFuZ2UgdHJpZ2dlclxuICogc3VyZmFjZS5cbiAqL1xuY29uc3QgY2FzZUVzY2FsYXRpb25SZWFzc2lnbjogSG9vayA9IGNyZWF0ZUNhc2VFc2NhbGF0aW9uUmVhc3NpZ24oKTtcblxuLyoqXG4gKiBUcmlhZ2Ugc2VsZi1jbGFpbSwgY29tcG9zZWQgZnJvbSBgX2Nhc2UtYXNzaWdubWVudC50c2AuXG4gKlxuICogQW4gYWdlbnQgd2hvIG1vdmVzIGFuIHVub3duZWQgb3BlbiBjYXNlIGludG8gYSB3b3JrZWQgc3RhdHVzIGJlY29tZXMgaXRzXG4gKiBvd25lci4gXHUyNkEwXHVGRTBGIFByaW9yaXR5IDI2MCBwdXRzIGl0IEFGVEVSIHRoZSBlc2NhbGF0aW9uIGhhbmQtb2ZmICgyNTApLCBhbmQgaXRcbiAqIHN0YW5kcyBkb3duIHdoZW5ldmVyIGBvd25lcl9pZGAgaXMgYWxyZWFkeSBpbiB0aGUgcGF5bG9hZCBcdTIwMTQgc28gdGhlIHR3b1xuICogb3duZXJzaGlwIHdyaXRlcnMgb24gdGhpcyBzZWFtIGNhbm5vdCBib3RoIHNwZWFrLiBMaWtlIHRoZSBoYW5kLW9mZiBpdCBpc3N1ZXNcbiAqIG5vIG9wZXJhdGlvbiBvZiBpdHMgb3duOyB1bmxpa2UgZWl0aGVyIHNpYmxpbmcgaXQgcmVhZHMgbm8gcG9vbCwgYmVjYXVzZSB0aGVcbiAqIG9ubHkgdXNlciBpZCBpdCBjYW4gd3JpdGUgaXMgdGhlIGNhbGxlcidzIG93bi5cbiAqL1xuY29uc3QgY2FzZVNlbGZDbGFpbTogSG9vayA9IGNyZWF0ZUNhc2VTZWxmQ2xhaW0oKTtcblxuLyoqXG4gKiBOb3JtYWxpc2UgYSBCTEFOSyBgcmVzb2x2ZWRfYnlfYXJ0aWNsZWAgdG8gTlVMTC5cbiAqXG4gKiBBZGRpdGl2ZSBhbmQgZGVsaWJlcmF0ZWx5IGluZGVwZW5kZW50IG9mIGV2ZXJ5dGhpbmcgYWJvdmU6IGl0IHRvdWNoZXMgbm9cbiAqIG93bmVyc2hpcCBjb2x1bW4gYW5kIGlzc3VlcyBubyBvcGVyYXRpb24gb2YgaXRzIG93bi5cbiAqXG4gKiAjIyMgV2h5IGl0IGhhcyB0byBleGlzdFxuICpcbiAqIGByZXNvbHZlZF9ieV9hcnRpY2xlYCBpcyB0aGUgY29sdW1uIHRoZSBkZWZsZWN0aW9uIHJhdGlvIG9uIGBjYXNlX21ldHJpY3NgXG4gKiBjb3VudHMgKGBrYl9yZXNvbHZlZF9jb3VudGAgPSBgY291bnQocmVzb2x2ZWRfYnlfYXJ0aWNsZSlgIG92ZXIgY2xvc2VkIGNhc2VzKS5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgUGxhdGZvcm0gYmVoYXZpb3VyLCBtZWFzdXJlZCBhZ2FpbnN0IHRoZSByZWFsIGF1dG9tYXRpb24gZW5naW5lOiBhblxuICogb3B0aW9uYWwgU0NSRUVOIGZpZWxkIHRoZSBhZ2VudCBsZWF2ZXMgZW1wdHkgZG9lcyBub3QgYXJyaXZlIGFzIFwiYWJzZW50XCIgXHUyMDE0XG4gKiB0aGUgcmVzdW1lIGNhcnJpZXMgYCcnYCwgYW5kIGB1cGRhdGVfcmVjb3JkYCB3cml0ZXMgdGhhdCBlbXB0eSBzdHJpbmcgaW50b1xuICogdGhlIGNvbHVtbjpcbiAqXG4gKiAgIHN1cHBsaWVkIGAna2ExJ2AgXHUyMTkyIGByZXNvbHZlZF9ieV9hcnRpY2xlOiBcImthMVwiYFxuICogICBsZWZ0IGJsYW5rICAgICAgIFx1MjE5MiBgcmVzb2x2ZWRfYnlfYXJ0aWNsZTogXCJcImAgICAgICBcdTIxOTAgY291bnRlZCBieSBjb3VudChjb2wpXG4gKiAgIGtleSBvbWl0dGVkICAgICAgXHUyMTkyIGNvbHVtbiBub3Qgd3JpdHRlbiBhdCBhbGwgICAgICBcdTIxOTAgY29ycmVjdFxuICpcbiAqIFNRTCBgY291bnQoY29sdW1uKWAgY291bnRzIGV2ZXJ5IE5PTi1OVUxMIHZhbHVlLCBhbmQgYCcnYCBpcyBub3QgTlVMTC4gU29cbiAqIHdpdGhvdXQgdGhpcyBob29rIGV2ZXJ5IGNhc2UgY2xvc2VkIFdJVEhPVVQgYW4gYXJ0aWNsZSBsYW5kcyBpbiB0aGUgbnVtZXJhdG9yXG4gKiBhbmQgdGhlIGRlZmxlY3Rpb24gcmF0ZSByZWFkcyAxMDAlIG9uIGEgZGFzaGJvYXJkIHRoYXQgcmFpc2VzIG5vIGVycm9yIHdoaWxlXG4gKiBkb2luZyBpdCBcdTIwMTQgYSB3cm9uZyByYXRpbyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgcmlnaHQgb25lLlxuICpcbiAqIEZpeGluZyBpdCBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSBtZWFzdXJlIGlzIGRlbGliZXJhdGU6IGFuIGVtcHR5IHN0cmluZyBpbiBhXG4gKiBsb29rdXAgY29sdW1uIGlzIHdyb25nIGZvciB0aGUgcmVjb3JkIGZvcm0sIHRoZSBsaXN0IHZpZXdzLCB0aGUgcmVwb3J0cyBhbmRcbiAqIGFueSBmdXR1cmUgcmVhZGVyIHRvbywgc28gaXQgaXMgdGhlIFNUT1JFRCB2YWx1ZSB0aGF0IGlzIGNvcnJlY3RlZC4gVGVhY2hpbmdcbiAqIG9uZSBtZWFzdXJlIHRvIGRpc2NvdW50IGAnJ2AgaXMgYSBsZW5pZW50IGNvbnN1bWVyIHBhcGVyaW5nIG92ZXIgYmFkIGRhdGEsXG4gKiBhbmQgdGhlIG5leHQgcmVhZGVyIHdvdWxkIG5vdCBrbm93IHRvIGNvcHkgaXQuXG4gKiBgdGVzdC9rbm93bGVkZ2UtZGVmbGVjdGlvbi50ZXN0LnRzYCBwaW5zIGJvdGggaGFsdmVzLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBUaGUgYmxhbmsgdGVzdCBpcyBzcGVsbGVkIGlubGluZSByYXRoZXIgdGhhbiBsaWZ0ZWQgaW50byBhIHNoYXJlZCBoZWxwZXI6XG4gKiBob29rIGhhbmRsZXJzIGxvd2VyIHRvIGEgbWV0YWRhdGEtb25seSBib2R5IGFuZCBhIGZyZWUgaWRlbnRpZmllciB3b3VsZCBwdXNoXG4gKiB0aGlzIG9uZSBpbnRvIHRoZSBsZWdhY3kgcnVudGltZSBidW5kbGUgaW5zdGVhZFxuICogKGB0ZXN0L2FjdGlvbi1zYW5kYm94LnRlc3QudHNgIGZhaWxzIHRoZSBidWlsZCBvbiBpdCkuXG4gKi9cbmNvbnN0IGNhc2VSZXNvbHV0aW9uQXJ0aWNsZU5vcm1hbGl6ZTogSG9vayA9IHtcbiAgbmFtZTogJ2Nhc2VfcmVzb2x1dGlvbl9hcnRpY2xlX25vcm1hbGl6ZScsXG4gIG9iamVjdDogJ2NybV9jYXNlJyxcbiAgZXZlbnRzOiBbJ2JlZm9yZUluc2VydCcsICdiZWZvcmVVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDE1MCxcbiAgZGVzY3JpcHRpb246ICdOb3JtYWxpc2UgYSBibGFuayByZXNvbHZlZF9ieV9hcnRpY2xlIHRvIG51bGwgc28gdGhlIGRlZmxlY3Rpb24gbWVhc3VyZSBjb3VudHMgb25seSByZWFsIGxpbmtzLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gY3R4O1xuICAgIC8vIE9ubHkgYSB3cml0ZSB0aGF0IENBUlJJRVMgdGhlIGtleSBpcyBub3JtYWxpc2VkLiBBbiB1cGRhdGUgdGhhdCBuZXZlclxuICAgIC8vIG1lbnRpb25zIHRoZSBjb2x1bW4gbXVzdCBub3QgY2xlYXIgYSBsaW5rIHNvbWVib2R5IGVsc2Ugc2V0LlxuICAgIGlmICghKCdyZXNvbHZlZF9ieV9hcnRpY2xlJyBpbiBpbnB1dCkpIHJldHVybjtcbiAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnJlc29sdmVkX2J5X2FydGljbGU7XG4gICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbnB1dC5yZXNvbHZlZF9ieV9hcnRpY2xlID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUudHJpbSgpID09PSAnJykge1xuICAgICAgaW5wdXQucmVzb2x2ZWRfYnlfYXJ0aWNsZSA9IG51bGw7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgW1xuICBjYXNlVmFsaWRhdGlvbixcbiAgY2FzZUF1dG9Bc3NpZ24sXG4gIGNhc2VFc2NhbGF0aW9uUmVhc3NpZ24sXG4gIGNhc2VTZWxmQ2xhaW0sXG4gIGNhc2VSZXNvbHV0aW9uQXJ0aWNsZU5vcm1hbGl6ZSxcbiAgY2FzZVNpZGVFZmZlY3RzLFxuICBjYXNlUmVzb2x1dGlvbkFjY291bnRBY3Rpdml0eSxcbl07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHMva25vd2xlZGdlX2FydGljbGUuaG9vay50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL2tub3dsZWRnZV9hcnRpY2xlLmhvb2sudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcblxuLyoqXG4gKiBLbm93bGVkZ2UgYXJ0aWNsZSBsaWZlY3ljbGUgaG9vay5cbiAqXG4gKiBPbiB0aGUgRklSU1QgcHVibGlzaCwgc3RhbXBzIGBwdWJsaXNoZWRfYXRgIGFuZCBgbGFzdF9yZXZpZXdlZF9hdGAuIE9uIGV2ZXJ5XG4gKiBsYXRlciB3cml0ZSB0aGF0IGxlYXZlcyB0aGUgYXJ0aWNsZSBwdWJsaXNoZWQgXHUyMDE0IGFuIG9yZGluYXJ5IGVkaXQsIG9yIGFcbiAqIHJlLXB1Ymxpc2ggYWZ0ZXIgYXJjaGl2aW5nIFx1MjAxNCByZWZyZXNoZXMgYGxhc3RfcmV2aWV3ZWRfYXRgIG9ubHksIHNvIGFkbWluXG4gKiBcInN0YWxlIGFydGljbGVcIiByZXBvcnRzIGtlZXAgd29ya2luZyB3aGlsZSB0aGUgb3JpZ2luYWwgcHVibGlzaCBkYXRlIHN0YXlzXG4gKiBwdXQuXG4gKlxuICogXCJGaXJzdCBwdWJsaXNoXCIgaXMgZGVjaWRlZCBieSB3aGV0aGVyIHRoZSByZWNvcmQgQUxSRUFEWSBDQVJSSUVTIGFcbiAqIGBwdWJsaXNoZWRfYXRgLCBub3QgYnkgd2hpY2ggc3RhdHVzIHRoZSB3cml0ZSBhcnJpdmVzIGZyb20gKCM3ODApLiBUaGUgb2xkXG4gKiB0ZXN0IHdhcyBgcHJldmlvdXMuc3RhdHVzID09PSAncHVibGlzaGVkJ2AsIHdoaWNoIHJlY29nbmlzZXMgb25seSB0aGVcbiAqIHB1Ymxpc2hlZCBcdTIxOTIgcHVibGlzaGVkIGVkaXQgYXMgYSByZS1wdWJsaXNoLiBCdXQgdGhlIGRvY3VtZW50ZWQgbGlmZWN5Y2xlIGlzXG4gKiBgZHJhZnQgXHUyMTkyIGluX3JldmlldyBcdTIxOTIgcHVibGlzaGVkIFx1MjE5MiBhcmNoaXZlZGAsIHNvIHRoZSBvcmRpbmFyeSByZS1zaGVsdmluZyBtb3ZlXG4gKiBgYXJjaGl2ZWQgXHUyMTkyIHB1Ymxpc2hlZGAgYXJyaXZlcyB3aXRoIGBwcmV2aW91cy5zdGF0dXMgPT09ICdhcmNoaXZlZCdgLCBmZWxsXG4gKiBpbnRvIHRoZSBmaXJzdC1wdWJsaXNoIGJyYW5jaCwgYW5kIG1vdmVkIGEgMjAyNCBwdWJsaXNoIGRhdGUgdG8gdG9kYXkuIFRoZVxuICogYGFsbF9hcnRpY2xlc2AgdmlldyBzb3J0cyBgcHVibGlzaGVkX2F0IGRlc2NgLCBzbyB0aGUgcmUtc2hlbHZlZCBhcnRpY2xlXG4gKiBqdW1wZWQgdG8gdGhlIHRvcCBvZiB0aGUgbGlzdCBhcyBpZiBpdCBoYWQganVzdCBiZWVuIHdyaXR0ZW4uXG4gKlxuICogVGhlIGRhdGUgaXMgcmVhZCBhcyBgaW5wdXQucHVibGlzaGVkX2F0ID8/IHByZXZpb3VzPy5wdWJsaXNoZWRfYXRgIFx1MjAxNCB0aGVcbiAqIHZhbHVlIHRoaXMgcmVjb3JkIHdvdWxkIGVuZCB1cCB3aXRoIGlmIHRoZSBoYW5kbGVyIHN0YW1wZWQgbm90aGluZywgd2hpY2ggaXNcbiAqIGV4YWN0bHkgdGhlIHF1ZXN0aW9uIFwiZG9lcyBpdCBhbHJlYWR5IGhhdmUgb25lXCIuIFRoaXMgaXMgcHJlY2VkZW5jZSBiZXR3ZWVuXG4gKiB0aGUgdHdvIGhhbHZlcyBvZiBvbmUgd3JpdGUsIG5vdCBhIHRvbGVyYXRlZCBhbGlhcyBmb3Igb25lIGtleSwgYW5kIGJvdGhcbiAqIGhhbHZlcyBhcmUgbG9hZC1iZWFyaW5nOlxuICpcbiAqICAgLSBgcHJldmlvdXNgIGlzIHRoZSBGVUxMIHN0b3JlZCByb3c6IGB1cGRhdGUoKWAgcmVhZHMgaXQgYW5kIGJpbmRzIGl0IEJFRk9SRVxuICogICAgIGRpc3BhdGNoaW5nIGBiZWZvcmVVcGRhdGVgIChBRFItMDA1OCBBZGRlbmR1bSBJSSksIHNvIGEgcmUtcHVibGlzaCBzZWVzXG4gKiAgICAgdGhlIG9yaWdpbmFsIGRhdGUgdGhlcmUuIFRoZSBgc3lzX2ZldGNoX3ByZXZpb3VzX3VwZGF0ZWAgYnVpbHRpbiB0aGF0IHVzZWRcbiAqICAgICB0byBpc3N1ZSB0aGF0IGBmaW5kT25lYCBpcyByZXRpcmVkLlxuICogICAtIGBpbnB1dGAgY2FycmllcyB0aGUgZGF0ZSB3aGVuZXZlciB0aGUgd3JpdGUgc3VwcGxpZXMgb25lLCBhbmQgb24gYW4gSU5TRVJUXG4gKiAgICAgdGhhdCB2YWx1ZSBpcyB3aGF0IGdldHMgc3RvcmVkOiBtZWFzdXJlZCBvbiAxNy4wLjAtcmMuMiwgdGhlIGVuZ2luZSdzXG4gKiAgICAgcmVhZC1vbmx5IHN0cmlwIHJ1bnMgb24gdGhlIHVwZGF0ZSBwYXRoIG9ubHksIGFuZCBob29rcyBydW4gYmVmb3JlIGl0IGluXG4gKiAgICAgYW55IGNhc2UuIFNvIGFuIGltcG9ydCBvciBtaWdyYXRpb24gcHVibGlzaGluZyByZWNvcmRzIHdpdGggdGhlaXJcbiAqICAgICBoaXN0b3JpY2FsIGRhdGVzIHJlYWNoZXMgdGhpcyBoYW5kbGVyIHdpdGggYHB1Ymxpc2hlZF9hdGAgc2V0IGFuZCBub1xuICogICAgIGBwcmV2aW91c2AsIGFuZCBzdGFtcGluZyBvdmVyIGl0IHJld3JpdGVzIGltcG9ydGVkIGhpc3RvcnkuXG4gKlxuICogVHdvIGFkamFjZW50IGVuZ2luZSBiZWhhdmlvdXJzIHRoaXMgaGFuZGxlciBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgdHJ5IHRvXG4gKiBwYXBlciBvdmVyLCBib3RoIG1lYXN1cmVkIGFuZCBmaWxlZCBhcyAjNzg4OiBgcmVhZG9ubHk6IHRydWVgIGlzIG5vdCBlbmZvcmNlZFxuICogb24gdGhlIGluc2VydCBwYXRoIGF0IGFsbCwgYW5kIG9uIHRoZSB1cGRhdGUgcGF0aCB0aGUgc3RyaXAgZGVsZXRlcyB0aGVcbiAqIGNhbGxlci1zdXBwbGllZCBrZXkgdG9nZXRoZXIgd2l0aCB3aGF0ZXZlciBhIGhvb2sgd3JvdGUgdGhlcmUgXHUyMDE0IHNvIGFuIHVwZGF0ZVxuICogdGhhdCBlY2hvZXMgYHB1Ymxpc2hlZF9hdGAgYmFjayBjYW4gbGFuZCBhIHB1Ymxpc2hlZCBhcnRpY2xlIHdpdGggbm9uZS4gVGhhdFxuICogb3V0Y29tZSBpcyBpZGVudGljYWwgYmVmb3JlIGFuZCBhZnRlciB0aGlzIGNoYW5nZTsgYSBsZW5pZW50IGNvbnN1bWVyIGhlcmVcbiAqIHdvdWxkIG9ubHkgaGlkZSBpdC5cbiAqXG4gKiBPbiB0aGUgYnVsayBwYXRoIChgbXVsdGk6IHRydWVgKSB0aGlzIGhhbmRsZXIgbm93IHJ1bnMgT05DRSBQRVIgUk9XLCB3aXRoXG4gKiBgaW5wdXQuaWRgIGJvdW5kIHRvIHRoZSByb3cgYW5kIGBwcmV2aW91c2AgaXRzIHByZS1pbWFnZSAoQURSLTAwNTggQWRkZW5kdW1cbiAqIElJLCBEMS9EMik7IHBhc3QgMTAwMDAgbWF0Y2hlZCByb3dzIHRoZSB3aG9sZSB3cml0ZSBpcyByZWZ1c2VkIHdpdGhcbiAqIGBFUlJfQlVMS19QRVJfUk9XX0hPT0tfTElNSVRgLiBUaGUgcmMuMi1lcmEgYWNjb3VudCBcdTIwMTQgbm8gYGlucHV0LmlkYCwgbm9cbiAqIGBwcmV2aW91c2AsIG5vdGhpbmcgc3RhbXBlZCAoIzc3OSwgY2xvc2VkKSBcdTIwMTQgaXMgSElTVE9SWS4gRG8gbm90IHJlYXNvbiBmcm9tXG4gKiBpdDsgaXQgaXMgcmVjb3JkZWQgaGVyZSBvbmx5IGJlY2F1c2UgdGhpcyBmaWxlJ3Mgb3duIGFyZ3VtZW50IG9uY2UgZGlkLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBBIFBSRURJQ0FURSBVUERBVEUgREVSSVZFUyBOT1RISU5HIEhFUkUgXHUyMDE0IEFEUi0wMDU4IEFkZGVuZHVtIElJIEQzLCBhbmRcbiAqIHRoZSBzdGFuZC1kb3duIGF0IHRoZSB0b3Agb2YgdGhlIGhhbmRsZXIgaXMgdGhlIGlkaW9tIGV2ZXJ5IHJvdy1jb25kaXRpb25lZFxuICogaG9vayBpbiB0aGlzIGFwcCBjYXJyaWVzLiBUaGUgZnVsbCBhY2NvdW50IGFuZCBpdHMgbWVhc3VyZW1lbnRzIGxpdmUgaW5cbiAqIGBmb3JlY2FzdC5ob29rLnRzYDsgdGhlIHNob3J0IHZlcnNpb24gaXMgdGhhdCBgdXBkYXRlKG9iaiwgcGF5bG9hZCxcbiAqIHsgbXVsdGk6IHRydWUsIHdoZXJlIH0pYCBzZW5kcyBPTkUgYFNFVGAgY2xhdXNlIGZvciBhbGwgTiBtYXRjaGVkIHJvd3MgYW5kXG4gKiBoYW5kcyBldmVyeSByb3cncyBgYmVmb3JlVXBkYXRlYCBUSEFUIHBheWxvYWQgcmF0aGVyIHRoYW4gYSBwZXItcm93IGNvcHksIHNvXG4gKiBhIHdyaXRlIHdob3NlIGlmLWd1YXJkIHJlYWRzIGBjdHgucHJldmlvdXNgIGRvZXMgbm90IHNjb3BlIGl0c2VsZiB0byB0aGUgcm93XG4gKiBpdCB3YXMgZGVjaWRlZCBvbi5cbiAqXG4gKiBCb3RoIHdyaXRlcyBiZWxvdyBhcmUgZ2F0ZWQgb24gdGhlIHJvdywgc28gYm90aCBkaXZlcmdlIFx1MjAxNCBhbmQgdGhpcyBob29rIGlzXG4gKiBrZXktcHJlc2VuY2UgZGl2ZXJnZW5jZSAodGhlIGxvdWQga2luZCkgaW4gQk9USCBsaW1icy4gVGhlcmUgaXMgbm8gc2lsZW50XG4gKiBsaW1iLCBiZWNhdXNlIG5laXRoZXIgd3JpdGUgdGFrZXMgaXRzIFZBTFVFIGZyb20gdGhlIHJvdzogYm90aCBzdG9yZVxuICogYG5vd0lzb2AsIGEgY2xvY2sgcmVhZC4gVGhlIHJvdyBvbmx5IGV2ZXIgZGVjaWRlcyBXSEVUSEVSIGEga2V5IGlzIHdyaXR0ZW4uXG4gKlxuICogICAtIGBsYXN0X3Jldmlld2VkX2F0YCBzaXRzIGJlaGluZCB0aGUgYG5leHRTdGF0dXMgIT09ICdwdWJsaXNoZWQnYCBlYXJseVxuICogICAgIHJldHVybiwgYW5kIHRoYXQgcmV0dXJuIHJlYWRzIHRoZSBST1cuIE1lYXN1cmVkIG9uIDE3LjQuMCBvbiBhXG4gKiAgICAgZnJlc2ggYHBucG0gZGV2YDogdGhlIHBsYXRmb3JtJ3Mgb3duIHNlZWQtb3duZXJzaGlwIGNsYWltIChvbmUgcGF5bG9hZCBvZlxuICogICAgIGB7IG93bmVyX2lkIH1gLCBgd2hlcmU6IHsgb3duZXJfaWQ6IG51bGwgfWApIG1hdGNoZWQgYWxsIDQgc2VlZGVkXG4gKiAgICAgYXJ0aWNsZXM7IHRoZSAzIHB1Ymxpc2hlZCBvbmVzIHN0YW1wZWQgYGxhc3RfcmV2aWV3ZWRfYXRgLCB0aGUgMSBkcmFmdFxuICogICAgIHJldHVybmVkIGVhcmx5IGFuZCBzdGFtcGVkIG5vdGhpbmcsIGFuZCB0aGUgZW5naW5lIHJlZnVzZWQgdGhlIGJhdGNoIFx1MjAxNFxuICogICAgIGBSZWZ1c2luZyBhIG11bHRpLXJlY29yZCB1cGRhdGUgb24gJ2NybV9rbm93bGVkZ2VfYXJ0aWNsZSc6IGl0c1xuICogICAgICdiZWZvcmVVcGRhdGUnIGhhbmRsZXJzIHdyb3RlICdsYXN0X3Jldmlld2VkX2F0JyBmb3Igc29tZSBvZiB0aGUgNFxuICogICAgIG1hdGNoZWQgcmVjb3JkcyBhbmQgbm90IGZvciBvdGhlcnNgLiBOb3RoaW5nIHdhcyB3cml0dGVuLCBhbGwgNCBhcnRpY2xlc1xuICogICAgIHN0YXllZCBvd25lcmxlc3MsIGFuZCBgbXlfZHJhZnRzYCAoZmlsdGVyZWQgYG93bmVyX2lkID1cbiAqICAgICB7Y3VycmVudF91c2VyX2lkfWApIHdhcyBFTVBUWSB1bnRpbCB0aGUgYGRlbW9fYm9vdHN0cmFwYCBzd2VlcCByZXBhaXJlZFxuICogICAgIHRoZW0gYnkgaWQgdGVuIG1pbnV0ZXMgbGF0ZXIuXG4gKiAgIC0gYHB1Ymxpc2hlZF9hdGAncyBleGlzdGVuY2UgY3JpdGVyaW9uIGlzIHRoZSBzYW1lIHNoYXBlIG9uZSBrZXkgb3ZlcjpcbiAqICAgICAjMTg4OCBtZWFzdXJlZCBpdCByZWZ1c2VkIG92ZXIgMyByb3dzIHdpdGhcbiAqICAgICBgTVVMVElfVVBEQVRFX0hPT0tfS0VZX0RJVkVSR0VOQ0VgLiBUaGF0IGxpbWIgaXMgd2hhdCAjMTI2NSB3YXMgZmlsZWRcbiAqICAgICBmb3IsIGJhY2sgd2hlbiB0aGUgZW5naW5lIHdpZGVuZWQgaW4gc2lsZW5jZSBpbnN0ZWFkIG9mIHJlZnVzaW5nLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBUaGUgYGN0eC5ldmVudGAgaGFsZiBvZiB0aGUgZ3VhcmQgaXMgbG9hZC1iZWFyaW5nLCBub3QgY2VyZW1vbnk6IGEgYmF0Y2hcbiAqIElOU0VSVCBhbHNvIHJlcG9ydHMgYGRpc3BhdGNoLm1vZGUgPT09ICdwZXItcm93J2AsIGFuZCB0aGVyZSBlYWNoIHJvdyBjYXJyaWVzXG4gKiBpdHMgT1dOIHBheWxvYWQuIFRoaXMgaG9vayBpcyBgYmVmb3JlSW5zZXJ0YCB0b28sIHNvIGRyb3BwaW5nIHRoYXQgaGFsZiB3b3VsZFxuICogc3RvcCB0aGUgc2VlZCBsb2FkIHN0YW1waW5nIGBwdWJsaXNoZWRfYXRgIC8gYGxhc3RfcmV2aWV3ZWRfYXRgIGF0IGFsbC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgSElTVE9SWSBcdTIwMTQgZG8gbm90IHJlYXNvbiBmcm9tIGl0LiBVbnRpbCAxNy4zLjAgdGhlIHNhbmRib3ggY29udGV4dCBjYXJyaWVkXG4gKiBubyBwZXItcm93IHNpZ25hbCwgc28gYSBgY3R4LmRpc3BhdGNoYCBndWFyZCBsb3dlcmVkIGNsZWFubHksIHBhc3NlZCBldmVyeVxuICogaW4tcHJvY2VzcyB0ZXN0IGFuZCB3YXMgSU5FUlQgaW4gcHJvZHVjdGlvbjsgUFIgIzEyNzQgcmVjb3JkZWQgdGhhdCBhcyB0aGVcbiAqIHJlYXNvbiB0aGlzIGNvdWxkIG5vdCBiZSBmaXhlZCBoZXJlLiBUaGF0IGlzIEZBTFNFIGZyb20gMTcuMy4wIG9uOlxuICogYGJ1aWxkU2FuZGJveENvbnRleHRgIG1hcnNoYWxzIGBkaXNwYXRjaGAgYW5kIGFuIGBpbnB1dE9wdGlvbnNgIHByb2plY3Rpb25cbiAqIChvYmplY3RzdGFjayMxMTU1MiksIGFuZCBgdGVzdC9ob29rcy1ydW50aW1lLXNlcnZpY2UudGVzdC50c2AgcGlucyB0aGF0IHRoZXlcbiAqIGNyb3NzLiBgY3R4LmlucHV0LmlkYCBpcyBzdGlsbCBhYnNlbnQgXHUyMDE0IHJlYWQgYGN0eC5wcmV2aW91cy5pZGAuXG4gKi9cbmNvbnN0IGtub3dsZWRnZUFydGljbGVQdWJsaXNoOiBIb29rID0ge1xuICBuYW1lOiAna25vd2xlZGdlX2FydGljbGVfcHVibGlzaF90aW1lc3RhbXBzJyxcbiAgb2JqZWN0OiAnY3JtX2tub3dsZWRnZV9hcnRpY2xlJyxcbiAgZXZlbnRzOiBbJ2JlZm9yZUluc2VydCcsICdiZWZvcmVVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDMwMCxcbiAgZGVzY3JpcHRpb246ICdTdGFtcCBwdWJsaXNoZWRfYXQgb24gdGhlIGZpcnN0IHB1Ymxpc2g7IHJlZnJlc2ggbGFzdF9yZXZpZXdlZF9hdCB3aGlsZSBwdWJsaXNoZWQuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvLyBEMyBzdGFuZC1kb3duIChzZWUgdGhlIGhlYWRlcikuIEV2ZXJ5IHdyaXRlIGJlbG93IGlzIGRlY2lkZWQgYWdhaW5zdCB0aGlzXG4gICAgLy8gcm93J3MgYHByZXZpb3VzYCwgYW5kIHRoaXMgaGFuZGxlciBtYWtlcyBubyByZWZ1c2FsLCBzbyB0aGUgd2hvbGUgYm9keVxuICAgIC8vIHN0YW5kcyBkb3duIG9uIHRoZSBwcmVkaWNhdGUgcGF0aDsgZGVyaXZpbmcgc3RpbGwgaGFwcGVucyBwZXIgcmVjb3JkLlxuICAgIGlmIChjdHguZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIGN0eC5kaXNwYXRjaD8ubW9kZSA9PT0gJ3Blci1yb3cnKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgY29uc3QgbmV4dFN0YXR1cyA9ICh0eXBlb2YgaW5wdXQuc3RhdHVzID09PSAnc3RyaW5nJyAmJiBpbnB1dC5zdGF0dXMpIHx8IHByZXZpb3VzPy5zdGF0dXM7XG4gICAgaWYgKG5leHRTdGF0dXMgIT09ICdwdWJsaXNoZWQnKSByZXR1cm47XG5cbiAgICBjb25zdCBub3dJc28gPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgLy8gUHVibGlzaGluZywgcmUtcHVibGlzaGluZyBhbmQgZWRpdGluZyB3aGlsZSBwdWJsaXNoZWQgYXJlIGFsbCByZXZpZXdzLlxuICAgIGlucHV0Lmxhc3RfcmV2aWV3ZWRfYXQgPSBub3dJc287XG4gICAgLy8gVGhlIGVtcHRpbmVzcyB0ZXN0IGlzIHNwZWxsZWQgb3V0IGhlcmUgcmF0aGVyIHRoYW4gZmFjdG9yZWQgaW50byBhXG4gICAgLy8gbW9kdWxlLXNjb3BlIGhlbHBlcjogaG9vayBoYW5kbGVycyBsb3dlciB0byBhIG1ldGFkYXRhLW9ubHkgYm9keSwgYW5kIGFcbiAgICAvLyBmcmVlIGlkZW50aWZpZXIgd291bGQgcHVzaCB0aGlzIG9uZSBpbnRvIHRoZSBsZWdhY3kgcnVudGltZSBidW5kbGVcbiAgICAvLyBpbnN0ZWFkIFx1MjAxNCBgdGVzdC9hY3Rpb24tc2FuZGJveC50ZXN0LnRzYCBmYWlscyB0aGUgYnVpbGQgb24gaXQuXG4gICAgY29uc3QgZXhpc3RpbmcgPSBpbnB1dC5wdWJsaXNoZWRfYXQgPz8gcHJldmlvdXM/LnB1Ymxpc2hlZF9hdDtcbiAgICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCB8fCBleGlzdGluZyA9PT0gbnVsbCB8fCBleGlzdGluZyA9PT0gJycpIHtcbiAgICAgIGlucHV0LnB1Ymxpc2hlZF9hdCA9IG5vd0lzbztcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBrbm93bGVkZ2VBcnRpY2xlUHVibGlzaDtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvcGFnZXMvY2FzZV9kZXRhaWwucGFnZS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3BhZ2VzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvcGFnZXMvY2FzZV9kZXRhaWwucGFnZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKipcbiAqIENhc2UgRGV0YWlsIFJlY29yZCBQYWdlXG4gKlxuICogU2VydmljZS1hZ2VudCByZWNvcmQgcGFnZSBmb3IgdGhlIGBjcm1fY2FzZWAgb2JqZWN0LiBNaXJyb3JzIHRoZVxuICogb3Bwb3J0dW5pdHlfZGV0YWlsIGxheW91dDogaGlnaGxpZ2h0cyBzdHJpcCwgc3RhdHVzIHBhdGgsIHRoZW4gYSB0YWJcbiAqIHN0cmlwIHdpdGggKipEZXRhaWxzIC8gUmVsYXRlZCAvIEFjdGl2aXR5KiouXG4gKlxuICogVGhlIEFjdGl2aXR5IHRhYiB1c2VzIGByZWNvcmQ6YWN0aXZpdHlgLCB3aGljaCBwdWxscyB0aGUgdW5pZmllZFxuICogdGltZWxpbmUgZnJvbSBgc3lzX2NvbW1lbnRgLCBgc3lzX2FjdGl2aXR5YCwgYGZlZWRfaXRlbWAgYW5kIHRoZSBmaWVsZFxuICogaGlzdG9yeSAoZW5hYmxlZCB2aWEgYHRyYWNrSGlzdG9yeTogdHJ1ZWAgb24gYGNhc2Uub2JqZWN0LnRzYCkuIFRoYXQgaXNcbiAqIGhvdyBjYXNlIGNvbW1lbnRzIGFuZCBjYWxsIGxvZ3Mgc3VyZmFjZSBoZXJlIHdpdGhvdXQgYSBjdXN0b20gZmVlZCBcdTIwMTRcbiAqIGNhbGwgbG9ncyBvbmx5IGJlY2F1c2UgdGhlIGJsb2NrIHNldHMgYHNob3dDb21wbGV0ZWRgICgjMjA3MSkuXG4gKi9cbmV4cG9ydCBjb25zdCBDYXNlRGV0YWlsUGFnZTogUGFnZSA9IHtcbiAgbmFtZTogJ2Nhc2VfZGV0YWlsX3BhZ2UnLFxuICBsYWJlbDogJ0Nhc2UgRGV0YWlsJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1NlcnZpY2UtYWdlbnQgY2FzZSByZWNvcmQ6IGhpZ2hsaWdodHMsIFNMQSBwYXRoLCBkZXRhaWxzIGFuZCBhY3Rpdml0eSB0aW1lbGluZS4nLFxuXG4gIHR5cGU6ICdyZWNvcmQnLFxuICBvYmplY3Q6ICdjcm1fY2FzZScsXG5cbiAgdGVtcGxhdGU6ICdmdWxsLXdpZHRoJyxcbiAga2luZDogJ2Z1bGwnLFxuICB2YXJpYWJsZXM6IFtcbiAgICB7IG5hbWU6ICdhY3RpdmVUYWInLCB0eXBlOiAnc3RyaW5nJywgZGVmYXVsdFZhbHVlOiAnZGV0YWlscycgfSxcbiAgXSxcblxuICByZWdpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2hlYWRlcicsXG4gICAgICB3aWR0aDogJ2Z1bGwnLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BhZ2U6aGVhZGVyJyxcbiAgICAgICAgICBpZDogJ2Nhc2VfaGVhZGVyJyxcbiAgICAgICAgICBsYWJlbDogJ0Nhc2UgSW5mb3JtYXRpb24nLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRpdGxlOiAne2Nhc2VfbnVtYmVyfSBcdTAwQjcge3N1YmplY3R9JyxcbiAgICAgICAgICAgIC8vIFRoZSBsb29rdXAgZmllbGQgaXMgYGNybV9hY2NvdW50YCBcdTIwMTQgYHthY2NvdW50fWAgbWF0Y2hlZCBub3RoaW5nXG4gICAgICAgICAgICAvLyBhbmQgdGhlIHN1YnRpdGxlIHJlbmRlcmVkIGJsYW5rLlxuICAgICAgICAgICAgc3VidGl0bGU6ICd7Y3JtX2FjY291bnR9JyxcbiAgICAgICAgICAgIC8vIGBpY29uYCByZW1vdmVkIGZyb20gYHBhZ2U6aGVhZGVyYCBpbiBAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjBcbiAgICAgICAgICAgIC8vICgjNjk0NiwgQURSLTAwODcgRDIpIFx1MjAxNCBkZWxldGVkLCBub3QgcmVuYW1lZC4gU2VlIHRoZSBmdWxsIG5vdGUgb25cbiAgICAgICAgICAgIC8vIGBhY2NvdW50X2RldGFpbC5wYWdlLnRzYDsgbm90aGluZyBldmVyIGRyZXcgaXQuXG4gICAgICAgICAgICAvLyBgYnJlYWRjcnVtYmAgcmV0aXJlZCBmcm9tIGBwYWdlOmhlYWRlcmAgaW4gQG9iamVjdHN0YWNrL3NwZWMgMTcuNi4wXG4gICAgICAgICAgICAvLyAoIzIwNzg1LCBgcGFnZS1oZWFkZXItYnJlYWRjcnVtYi1yZW1vdmVkYCkgXHUyMDE0IGRlbGV0ZWQ6IG5vIHJlbmRlcmVyXG4gICAgICAgICAgICAvLyBldmVyIGRyZXcgYSB0cmFpbCBmb3IgaXQ7IHRoZSBhcHAgc2hlbGwncyBvd24gdHJhaWwgaXMgdW5jaGFuZ2VkLlxuICAgICAgICAgICAgLy8gQWN0aW9uIElEcywgbm90IGBBY3Rpb25EZWZgIG9iamVjdHM6IGBQYWdlSGVhZGVyUHJvcHMuYWN0aW9uc2AgaXNcbiAgICAgICAgICAgIC8vIGB6LmFycmF5KHouc3RyaW5nKCkpYCAoXCJBY3Rpb24gSURzIHRvIHNob3cgaW4gaGVhZGVyXCIpIGluXG4gICAgICAgICAgICAvLyBAb2JqZWN0c3RhY2svc3BlYyAxNy4zLjAsIGFuZCB0aGlzIHJlcG8gYXV0aG9ycyBhZ2FpbnN0IHRoZVxuICAgICAgICAgICAgLy8gcHJvdG9jb2wgKCMxNjUzKS4gRWFjaCBpZCBpcyB0aGUgYG5hbWVgIG9mIGEgY3JtX2Nhc2Utc2NvcGVkXG4gICAgICAgICAgICAvLyBhY3Rpb24gXHUyMDE0IGBjbGFpbV9jYXNlYCAvIGBlc2NhbGF0ZV9jYXNlYCAvIGBjbG9zZV9jYXNlYCBpblxuICAgICAgICAgICAgLy8gYHNyYy9zZXJ2aWNlL2FjdGlvbnMvY2FzZS5hY3Rpb25zLnRzYCwgdGhlIGFjdGl2aXR5IHRyaW8gaW5cbiAgICAgICAgICAgIC8vIGBzcmMvc2VydmljZS9hY3Rpb25zL2Nhc2UtYWN0aXZpdHkuYWN0aW9ucy50c2AuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhpcyBsaXN0IGlzIHRoZSB3aG9sZSBoZWFkZXIgKCMyMDcyLCB0aGUgIzU5MiBzZW50ZW5jZSBvblxuICAgICAgICAgICAgLy8gYGxlYWRfZGV0YWlsLnBhZ2UudHNgKTogYW4gYWN0aW9uIGl0IGRvZXMgbm90IG5hbWUgaXMgcmVhY2hhYmxlXG4gICAgICAgICAgICAvLyBvbmx5IGZyb20gdGhlIGxpc3Qgcm93J3MgXHUyMkVFIG1lbnUsIHdoaWNoIGlzIGhvdyBhbiBhZ2VudCBvbiBhblxuICAgICAgICAgICAgLy8gdW5vd25lZCBjYXNlIGhhZCB0byBnbyBiYWNrIHRvIHRoZSBsaXN0IHRvIGNsYWltIGl0LCBhbmQgY291bGRcbiAgICAgICAgICAgIC8vIG5vdCBsb2cgb3IgYm9vayBhIG1lZXRpbmcgaGVyZSBhdCBhbGwuIEVhY2ggYWN0aW9uJ3Mgb3duXG4gICAgICAgICAgICAvLyBgdmlzaWJsZWAgc3RpbGwgZGVjaWRlcyB3aGVuIGl0IHNob3dzIFx1MjAxNCBgY2xhaW1fY2FzZWAgb25seSBvbiBhblxuICAgICAgICAgICAgLy8gb3duZXJsZXNzIG9wZW4gY2FzZS4gYGNsYWltX2Nhc2VgIGdvZXMgRklSU1QgYmVjYXVzZSB0aGUgaGVhZGVyXG4gICAgICAgICAgICAvLyBkcmF3cyB0aHJlZSBidXR0b25zIGlubGluZSBhbmQgZm9sZHMgdGhlIHJlc3QgaW50byBcdTIyRUY6IG9uIGFuXG4gICAgICAgICAgICAvLyBvd25lcmxlc3MgY2FzZSBjbGFpbWluZyBpcyB0aGUgZ2VzdHVyZSwgYW5kIG9uIGFuIG93bmVkIG9uZSBpdFxuICAgICAgICAgICAgLy8gaXMgaGlkZGVuLCBzbyB0aGUgaW5saW5lIHRocmVlIHN0YXkgZXNjYWxhdGUgLyBjbG9zZSAvIGNhbGwuXG4gICAgICAgICAgICAvLyBgdGVzdC9hY3Rpb24tcmVmZXJlbmNlcy50ZXN0LnRzYCBob2xkcyB0aGlzIGxpc3QgdG8gZXZlcnlcbiAgICAgICAgICAgIC8vIGNybV9jYXNlIGFjdGlvbiBwbGFjZWQgYXQgYHJlY29yZF9oZWFkZXJgLlxuICAgICAgICAgICAgYWN0aW9uczogWydjbGFpbV9jYXNlJywgJ2VzY2FsYXRlX2Nhc2UnLCAnY2xvc2VfY2FzZScsICdsb2dfY2FsbCcsICdsb2dfbWVldGluZycsICdzY2hlZHVsZV9tZWV0aW5nJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6aGlnaGxpZ2h0cycsXG4gICAgICAgICAgaWQ6ICdjYXNlX2hpZ2hsaWdodHMnLFxuICAgICAgICAgIGxhYmVsOiAnS2V5IEluZm9ybWF0aW9uJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAvLyBjcm1fY2FzZSBjYXJyaWVzIGEgc2luZ2xlIGBzbGFfZHVlX2RhdGVgIHBsdXMgdGhlIGRlcml2ZWRcbiAgICAgICAgICAgIC8vIGBpc19zbGFfdmlvbGF0ZWRgIGZsYWcgXHUyMDE0IHRoZSBzcGxpdCByZXNwb25zZS9yZXNvbHV0aW9uIGRlYWRsaW5lc1xuICAgICAgICAgICAgLy8gbmFtZWQgaGVyZSBkbyBub3QgZXhpc3QsIHNvIHRoZSBhZ2VudCdzIG1vc3QgdGltZS1jcml0aWNhbCBmYWN0XG4gICAgICAgICAgICAvLyB3YXMgbWlzc2luZyBmcm9tIHRoZSBzdHJpcCBlbnRpcmVseS5cbiAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICAnc3RhdHVzJyxcbiAgICAgICAgICAgICAgJ3ByaW9yaXR5JyxcbiAgICAgICAgICAgICAgJ3NsYV9kdWVfZGF0ZScsXG4gICAgICAgICAgICAgICdpc19zbGFfdmlvbGF0ZWQnLFxuICAgICAgICAgICAgICAnb3duZXJfaWQnLFxuICAgICAgICAgICAgICAnY3JtX2FjY291bnQnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3JlY29yZDpwYXRoJyxcbiAgICAgICAgICBpZDogJ2Nhc2Vfc3RhdHVzX3BhdGgnLFxuICAgICAgICAgIGxhYmVsOiAnQ2FzZSBTdGF0dXMgUGF0aCcsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgc3RhdHVzRmllbGQ6ICdzdGF0dXMnLFxuICAgICAgICAgICAgc3RhZ2VzOiBbXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICduZXcnLCBsYWJlbDogJ05ldycgfSxcbiAgICAgICAgICAgICAgeyB2YWx1ZTogJ2luX3Byb2dyZXNzJywgbGFiZWw6ICdJbiBQcm9ncmVzcycgfSxcbiAgICAgICAgICAgICAgLy8gVGhlIHN0YXR1cyBvcHRpb24gaXMgYHdhaXRpbmdfY3VzdG9tZXJgOyB0aGUgbG9uZ2VyIHNwZWxsaW5nXG4gICAgICAgICAgICAgIC8vIG1hdGNoZWQgbm8gb3B0aW9uLCBzbyB0aGlzIHN0YWdlIG5ldmVyIGxpdCB1cCBhbmQgcmVuZGVyZWRcbiAgICAgICAgICAgICAgLy8gdW50cmFuc2xhdGVkIG5leHQgdG8gaXRzIG5laWdoYm91cnMuXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICd3YWl0aW5nX2N1c3RvbWVyJywgbGFiZWw6ICdXYWl0aW5nIG9uIEN1c3RvbWVyJyB9LFxuICAgICAgICAgICAgICB7IHZhbHVlOiAnZXNjYWxhdGVkJywgbGFiZWw6ICdFc2NhbGF0ZWQnIH0sXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICdyZXNvbHZlZCcsIGxhYmVsOiAnUmVzb2x2ZWQnIH0sXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICdjbG9zZWQnLCBsYWJlbDogJ0Nsb3NlZCcgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnbWFpbicsXG4gICAgICB3aWR0aDogJ2xhcmdlJyxcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwYWdlOnRhYnMnLFxuICAgICAgICAgIGlkOiAnY2FzZV9tYWluX3RhYnMnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIC8vIGB0eXBlYCBcdTIxOTIgYHRhYlN0eWxlYCAoQG9iamVjdHN0YWNrL3NwZWMgMTcuMC4wLCAjNjc3NiwgQURSLTAwODdcbiAgICAgICAgICAgIC8vIEQyKS4gU2FtZSBjb25jZXB0LCBzYW1lIHRocmVlIHZhbHVlcyAoYGxpbmVgIHwgYGNhcmRgIHwgYHBpbGxgKTtcbiAgICAgICAgICAgIC8vIHRoZSByZW5hbWUgZXhpc3RzIGJlY2F1c2UgYSBwcm9wcyBrZXkgY2FsbGVkIGB0eXBlYCBjb2xsaWRlcyB3aXRoXG4gICAgICAgICAgICAvLyB0aGUgY29tcG9uZW50IG5vZGUncyBvd24gZGlzcGF0Y2gga2V5IGFuZCBpcyB1bmF1dGhvcmFibGUgaW4gdGhlXG4gICAgICAgICAgICAvLyBmbGF0IGFuZCBKU1ggY2FycmllcnMuIFNlZSB0aGUgZnVsbCBub3RlIG9uIGBob21lLnBhZ2UudHNgLlxuICAgICAgICAgICAgdGFiU3R5bGU6ICdsaW5lJyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBUYWIgaXRlbSBga2V5YCBcdTIxOTIgYHZhbHVlYCAoIzEyNjkpLiBgdmFsdWVgIGlzIHRoZSBzdGFibGVcbiAgICAgICAgICAgICAgICAvLyBgP3RhYj1gIFVSTCB0b2tlbiB0aGUgcmVuZGVyZXIgcmVhZHMgKGBpdC52YWx1ZWAsIGZhbGxpbmcgYmFja1xuICAgICAgICAgICAgICAgIC8vIHRvIGFuIGluZGV4LWRlcml2ZWQgYHRhYi08aT5gKTsgYGtleWAgaXMgcmVhZCBieSBub3RoaW5nLCBzb1xuICAgICAgICAgICAgICAgIC8vIHRoZXNlIHRhYnMgd2VyZSBhZGRyZXNzYWJsZSBvbmx5IGFzIGB0YWItMGAvYHRhYi0xYC9gdGFiLTJgLFxuICAgICAgICAgICAgICAgIC8vIHdoaWNoIHBvaW50IGF0IGRpZmZlcmVudCB0YWJzIHRoZSBtb21lbnQgdGhlIGl0ZW0gbGlzdFxuICAgICAgICAgICAgICAgIC8vIGNoYW5nZXMuIGBQYWdlVGFic1Byb3BzYCcgb3duIGFsaWFzIHRhYmxlIGFuc3dlcnMgYGtleWAgd2l0aFxuICAgICAgICAgICAgICAgIC8vIGB2YWx1ZWAgZm9yIGV4YWN0bHkgdGhpcyByZWFzb24uXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdkZXRhaWxzJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0RldGFpbHMnLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6ZGV0YWlscycsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnY2FzZV9kZXRhaWxzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdDYXNlIERldGFpbHMnLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYGNvbHVtbnNgIGlzIGEgU1RSSU5HIGVudW0gKCcxJ3wnMid8JzMnfCc0JykgaW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBAb2JqZWN0c3RhY2svc3BlYyAxNywgYW5kIGBsYXlvdXRgIHdhcyByZW1vdmVkIHRoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKCM2OTQ2IC8gQURSLTAwODcgRDIpLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBzZWN0aW9uIHJlZmVyZW5jZXMgb25lIG9mIGNybV9jYXNlJ3MgYGZpZWxkR3JvdXBzYFxuICAgICAgICAgICAgICAgICAgICAgIC8vICgjOTcwLCB0aGUgIzgwNiBjbGFzcyBydWxpbmcgQyk6IHRoZSByZW5kZXJlciBkZXJpdmVzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWVtYmVycywgbGFiZWwsIGljb24gYW5kIGNvbGxhcHNlIHN0YXRlIGZyb20gdGhlIG9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGlzIHBhZ2UgY3VyYXRlcyBvbmx5IHRoZSBvcmRlci4gVGhlIGZ1bGwgbm90ZSBcdTIwMTRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aGF0IGEgZ3JvdXAgc2VjdGlvbiBkb2VzIG9uIDE3LjYuMCBhbmQgd2hhdCBtYXkgbm90IHNpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJlc2lkZSBgZ3JvdXBgIFx1MjAxNCBpcyBvbiBgbGVhZF9kZXRhaWwucGFnZS50c2AuXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaGlnaGxpZ2h0cyBzdHJpcCBzdGlsbCB3aW5zICgjMTIxMSk6IHRoZSByZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3BzIHdoYXQgYHJlY29yZDpoaWdobGlnaHRzYCByZWdpc3RlcmVkIChgc3RhdHVzYCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgcHJpb3JpdHlgLCBgc2xhX2R1ZV9kYXRlYCwgYGlzX3NsYV92aW9sYXRlZGAsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYG93bmVyX2lkYCwgYGNybV9hY2NvdW50YCkgYW5kIHRoZSB0aXRsZSBjYW5kaWRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgc3ViamVjdGAgZnJvbSB0aGUgZGVyaXZlZCBtZW1iZXJzLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYGVzY2FsYXRlZF9kYXRlYCBcdTIwMTQgd3JpdHRlbiBieSB0aHJlZSBmbG93cyBhbmQgc2hvd25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBub3doZXJlIHVudGlsIG5vdyAoIzk3MCkgXHUyMDE0IGFycml2ZXMgd2l0aCB0aGUgYGVzY2FsYXRpb25gXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZ3JvdXAsIGJlc2lkZSBgaXNfZXNjYWxhdGVkYCBhbmQgYGVzY2FsYXRpb25fcmVhc29uYC5cbiAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGBpbnRlcm5hbF9ub3Rlc2AgKCMxNDI4KSBpcyBpbiB0aGUgYHN5c3RlbWAgZ3JvdXAgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBpc19jbG9zZWRgLiBBIGdyb3VwIHdob3NlIG1lbWJlcnMgYXJlIEFMTCBlbXB0eSByZW5kZXJzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZywgYnV0IGEgYm9vbGVhbiBhbHdheXMgaG9sZHMgYSB2YWx1ZSwgc28gYHN5c3RlbWBcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXJzIG9uIGV2ZXJ5IGNhc2UgYW5kIGFuIHVud3JpdHRlbiBgaW50ZXJuYWxfbm90ZXNgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RheXMgcmVhY2hhYmxlIHRoZSB3YXkgZXZlcnkgZW1wdHkgZmllbGQgaGVyZSBpczogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2VjdGlvbidzIFwiU2hvdyBOIGVtcHR5IGZpZWxkc1wiIHRvZ2dsZSwgdGhlbiBpbmxpbmUgZWRpdC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBcdTI2RDQgTm90IHRoZSBjcmVhdGUgZm9ybSBcdTIwMTQgYC9uZXdgIGFuZCBlZGl0IGJvdGggcmVzb2x2ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGB2aWV3LmZvcm1gLCBhbmQgYGNhc2UuaG9vay50c2AgbnVsbHMgdGhlIGNvbHVtbiBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbm9ueW1vdXMgd2ViLXRvLWNhc2Ugc3VibWlzc2lvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBgcmVzb2x1dGlvbmAgLyBgcmVzb2x2ZWRfYnlfYXJ0aWNsZWAgcmVuZGVyIG9uY2UgdGhlIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyaWVzIG9uZTsgYGNsb3NlX2Nhc2VgIGlzIHRoZSBmbG93IHRoYXQgY29sbGVjdHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x1dGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGBoaWRlRW1wdHk6IGZhbHNlYCAoIzIwMDMsIHRoZSAjMTIxMSByZWFzb25pbmcpIG9ubHkgb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBgb3JpZ2luYDogd2l0aCBgb3duZXJfaWRgIGluIHRoZSBzdHJpcCwgaXRzIG9uZSBtZW1iZXIgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2hhbm5lbCBhbiBhZ2VudCBwaWNrcywgYW5kIHdpdGhvdXQgdGhlIGtleSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzZWN0aW9uIHZhbmlzaGVzIG9uIGEgbmV3IGNhc2UuIE5vdCBvbiBgc2xhYDogb3V0c2lkZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdHJpcCBpdHMgbWVtYmVycyBhcmUgc3RhbXBzIG5vIG9uZSB0eXBlc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIChgY2xvc2VkX2RhdGVgIGFuZCBgcmVzb2x1dGlvbl90aW1lX2hvdXJzYCBhdCBjbG9zZSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgZmlyc3RfcmVzcG9uc2VfZGF0ZWAgYnkgYGV2ZW50Lmhvb2sudHNgKSwgc28gdGhlIGtleVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGRyYXcgZW1wdHkgcm93cyB0byBsb29rIGF0LCBub3QgdG8gZmlsbC5cbiAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ2Jhc2ljJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ29yaWdpbicsIGhpZGVFbXB0eTogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZ3JvdXA6ICdzbGEnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGdyb3VwOiAnZXNjYWxhdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZ3JvdXA6ICdyZXNvbHV0aW9uJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ3N5c3RlbScgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6ICdyZWxhdGVkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1JlbGF0ZWQnLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwYWdlOmFjY29yZGlvbicsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnY2FzZV9yZWxhdGVkX2FjY29yZGlvbicsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbiBhY2NvcmRpb24gaXRlbSBga2V5YCBpcyBERUxFVEVELCBub3QgcmVuYW1lZCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgdmFsdWVgIFx1MjAxNCB0aGUgb3Bwb3NpdGUgdmVyZGljdCB0byB0aGUgdGFiIGl0ZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFib3ZlLCBhbmQgdGhlIGRpZmZlcmVuY2UgaXMgYSByZWFkIHBvaW50ICgjMTI2OSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBQYWdlQWNjb3JkaW9uUHJvcHNgJyBpdGVtIHNoYXBlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGB7IGxhYmVsLCBpY29uPywgY29sbGFwc2VkPywgY2hpbGRyZW4gfWAgYW5kIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXNjcmliZXMgQUdBSU5TVCBgdmFsdWVgIGJ5IG5hbWU6IHRoZSByZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXBzIGV2ZXJ5IGl0ZW0gdG8gYHsgLi4uaXQsIHZhbHVlOiBgcGFuZWwtPGlkeD5gIH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSByZW5kZXJpbmcsIHNvIGFuIGF1dGhvcmVkIHZhbHVlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJ3cml0dGVuLiBgcGFnZTp0YWJzYCByZWFsbHkgZG9lcyByZWFkIGBpdC52YWx1ZWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBwYWdlOmFjY29yZGlvbmAgZG9lcyBub3QuIE5vdGhpbmcgYWRkcmVzc2VzIHRoZXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhbmVscywgc28gdGhlIGlkZW50aWZpZXIgaGFzIG5vd2hlcmUgdG8gbGFuZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdPcGVuIFRhc2tzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVjb3JkOnJlbGF0ZWRfbGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2Nhc2VfdGFza3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX3Rhc2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBGaWVsZDogJ3JlbGF0ZWRfdG9fY2FzZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViamVjdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByaW9yaXR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZHVlX2RhdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvd25lcl9pZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCBvcGVyYXRvcjogJ25vdF9lcXVhbHMnLCB2YWx1ZTogJ2NvbXBsZXRlZCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQ6IDEwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6ICdhY3Rpdml0eScsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBY3Rpdml0eScsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlY29yZDphY3Rpdml0eScsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnY2FzZV9hY3Rpdml0eScsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNb2RlOiAnYWxsJyxcbiAgICAgICAgICAgICAgICAgICAgICBzaG93RmlsdGVyVG9nZ2xlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiAyNSxcbiAgICAgICAgICAgICAgICAgICAgICB1bmlmaWVkVGltZWxpbmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbW1lbnRJbnB1dDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmFibGVNZW50aW9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmFibGVSZWFjdGlvbnM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgZW5hYmxlVGhyZWFkaW5nOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIExvYWQtYmVhcmluZyAoIzIwNzEpOiBhIGNhbGwgb3IgbWVldGluZyBsb2dnZWQgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBpcyBhIGBzeXNfYWN0aXZpdHlgIHJvdyBvZiB0eXBlIGBjb21wbGV0ZWRgICh0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgdGFza2AgZmVlZCBraW5kKSwgYW5kIHRoZSByZW5kZXJlciBkcm9wcyBldmVyeSBzdWNoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcm93IHVubGVzcyB0aGlzIGlzIHRydWUgXHUyMDE0IHNvIGFuIGFnZW50J3MgbG9nZ2VkIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciByZWFjaGVkIHRoaXMgdGFiLiBUaGUgY2FzZSdzIG90aGVyIGBjb21wbGV0ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVycyBhcmUgaXRzIG93biBgcmVzb2x2ZWRgIC8gYGNsb3NlZGAgbWlsZXN0b25lc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIChgY2FzZS5vYmplY3QudHNgKSwgd2hpY2ggYmVsb25nIG9uIHRoaXMgdGltZWxpbmUgdG9vLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlZCBjcm1fdGFzayByb3dzIGRvIE5PVCBhcnJpdmUgaGVyZTogYSB0YXNrJ3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpdCByb3dzIGFyZSBrZXllZCB0byB0aGUgdGFzaywgYW5kIHRoaXMgZmVlZCByZWFkc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgcm93cyBrZXllZCB0byB0aGUgY2FzZS4gTm8gYHR5cGVzYCBmaWx0ZXIsIHVubGlrZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsZWFkIHBhZ2U6IHRoaXMgdGltZWxpbmUgbWl4ZXMgY29tbWVudHMgYW5kIGZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyBvbiBwdXJwb3NlIChgdW5pZmllZFRpbWVsaW5lYCBhYm92ZSkuXG4gICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbXBsZXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXSxcblxuICBpc0RlZmF1bHQ6IHRydWUsXG5cbiAgYXJpYToge1xuICAgIGFyaWFMYWJlbDogJ0Nhc2UgRGV0YWlsIFBhZ2UnLFxuICAgIGFyaWFEZXNjcmliZWRCeTogJ1NlcnZpY2UtYWdlbnQgY2FzZSBkZXRhaWwgdmlldyB3aXRoIFNMQSBwYXRoLCBkZXRhaWxzLCByZWxhdGVkIGl0ZW1zIGFuZCBhY3Rpdml0eSB0aW1lbGluZS4nLFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvcmVwb3J0cy9jYXNlLnJlcG9ydC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3JlcG9ydHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9yZXBvcnRzL2Nhc2UucmVwb3J0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFJlcG9ydCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuZXhwb3J0IGNvbnN0IENhc2VzQnlTdGF0dXNQcmlvcml0eVJlcG9ydDogUmVwb3J0ID0ge1xuICBuYW1lOiAnY2FzZXNfYnlfc3RhdHVzX3ByaW9yaXR5JyxcbiAgbGFiZWw6ICdDYXNlcyBieSBTdGF0dXMgYW5kIFByaW9yaXR5JyxcbiAgZGVzY3JpcHRpb246ICdTdW1tYXJ5IG9mIGNhc2VzIGJ5IHN0YXR1cyBhbmQgcHJpb3JpdHknLFxuICAvLyBUaGUgY2hhcnQgY291bnRzIGNhc2VzLCBzbyBgY2FzZV9jb3VudGAgbXVzdCBiZSBzZWxlY3RlZCBhbG9uZ3NpZGUgdGhlXG4gIC8vIHJlc29sdXRpb24gdGltZSBcdTIwMTQgYW5kIHRoZSB5QXhpcyBtdXN0IG5hbWUgdGhhdCBNRUFTVVJFICgnY2FzZV9udW1iZXInXG4gIC8vIHdhcyBhIHJhdy1maWVsZCBuYW1lIHRoYXQgZXhpc3RzIGluIG5vIGRhdGFzZXQsIHNvIHRoZSBheGlzIHdhcyBlbXB0eSkuXG4gIGRhdGFzZXQ6ICdjYXNlX21ldHJpY3MnLCByb3dzOiBbJ3N0YXR1cycsICdwcmlvcml0eSddLCB2YWx1ZXM6IFsnY2FzZV9jb3VudCcsICdhdmdfcmVzb2x1dGlvbiddLFxuICB0eXBlOiAnc3VtbWFyeScsXG4gIGNoYXJ0OiB7IHR5cGU6ICdiYXInLCB0aXRsZTogJ0Nhc2VzIGJ5IFN0YXR1cycsIHNob3dMZWdlbmQ6IHRydWUsIHhBeGlzOiAnc3RhdHVzJywgeUF4aXM6ICdjYXNlX2NvdW50JyB9XG59O1xuXG5leHBvcnQgY29uc3QgU2xhUGVyZm9ybWFuY2VSZXBvcnQ6IFJlcG9ydCA9IHtcbiAgbmFtZTogJ3NsYV9wZXJmb3JtYW5jZScsXG4gIGxhYmVsOiAnU0xBIFBlcmZvcm1hbmNlIFJlcG9ydCcsXG4gIGRlc2NyaXB0aW9uOiAnQW5hbHlzaXMgb2YgU0xBIGNvbXBsaWFuY2UnLFxuICAvLyAnYXZnX3NsYV92aW9sYXRlZCcgKG5vdCBhIGR1cGxpY2F0ZWQgJ2Nhc2VfY291bnQnKSBcdTIwMTQgdGhlIHRhYmxlIHNob3dlZCB0d29cbiAgLy8gaWRlbnRpY2FsIENhc2VzIGNvbHVtbnMgYW5kIG5vIHZpb2xhdGlvbiBtZWFzdXJlOyB0aGUgY2hhcnQncyB5QXhpcyBtdXN0XG4gIC8vIG5hbWUgYSBkYXRhc2V0IE1FQVNVUkUsIG5vdCBhIHJhdyBmaWVsZCAoJ2lzX3NsYV92aW9sYXRlZCcgbGVha2VkIHRoZVxuICAvLyBjb2x1bW4gbmFtZSBvbnRvIHRoZSBheGlzKS5cbiAgZGF0YXNldDogJ2Nhc2VfbWV0cmljcycsIHJvd3M6IFsncHJpb3JpdHknXSwgdmFsdWVzOiBbJ2Nhc2VfY291bnQnLCAnYXZnX3NsYV92aW9sYXRlZCcsICdhdmdfcmVzb2x1dGlvbiddLFxuICB0eXBlOiAnc3VtbWFyeScsXG4gIHJ1bnRpbWVGaWx0ZXI6IHsgaXNfY2xvc2VkOiB0cnVlIH0sXG4gIGNoYXJ0OiB7IHR5cGU6ICdjb2x1bW4nLCB0aXRsZTogJ1NMQSBWaW9sYXRpb25zIGJ5IFByaW9yaXR5Jywgc2hvd0xlZ2VuZDogZmFsc2UsIHhBeGlzOiAncHJpb3JpdHknLCB5QXhpczogJ2F2Z19zbGFfdmlvbGF0ZWQnIH1cbn07XG5cbi8qKlxuICogRGFpbHkgY2FzZSBpbmZsb3cgYnkgcHJpb3JpdHkgXHUyMDE0IG1hdHJpeCBvdmVyIGBjcmVhdGVkX2F0YC4gU3VwcG9ydCBtYW5hZ2Vyc1xuICogdXNlIHRoaXMgdG8gc3BvdCBwcmlvcml0eSBzcGlrZXMgKGUuZy4gYSBQMSBidXJzdCBvbiBUdWVzZGF5KSBhbmQgc3RhZmZcbiAqIGFjY29yZGluZ2x5LlxuICpcbiAqIGBjYXNlX21ldHJpY3MuY3JlYXRlZF9hdGAgZGVjbGFyZXMgdGhlIGRheSBidWNrZXQsIHNvIHJlY29yZHMgY3JlYXRlZCBhdFxuICogZGlmZmVyZW50IHRpbWVzIG9uIHRoZSBzYW1lIGRheSBhZ2dyZWdhdGUgaW50byBvbmUgY29sdW1uLlxuICpcbiAqIE5vIGBydW50aW1lRmlsdGVyYCAoIzE5OTIpLiBUaGUgY29sdW1uIHVzZWQgdG8gYmUgYGNyZWF0ZWRfZGF0ZWAsIHdoaWNoXG4gKiBub3RoaW5nIHdyb3RlIG9uIGEgcmVhbCBjYXNlLCBzbyB0aGlzIHJlcG9ydCBjYXJyaWVkXG4gKiBgeyBjcmVhdGVkX2RhdGU6IHsgJG5lOiBudWxsIH0gfWAgYWdhaW5zdCBhIGhlYWRlcmxlc3MgJ1x1MjAxNCcgY29sdW1uIGFuZCBldmVyeVxuICogY2FzZSBjcmVhdGVkIHRocm91Z2ggdGhlIFVJIG9yIFJFU1QgZmVsbCBvdXQgb2YgaXQuIGBjcmVhdGVkX2F0YCBpcyB0aGVcbiAqIHBsYXRmb3JtJ3Mgb3duIGNyZWF0aW9uIHN0YW1wLCB3cml0dGVuIG9uIGV2ZXJ5IGluc2VydCwgc28gdGhlcmUgaXMgbm9cbiAqIGVtcHR5IGJ1Y2tldCB0byBleGNsdWRlIGFuZCBldmVyeSBjYXNlIG9wZW5lZCBpcyBjb3VudGVkLlxuICovXG5leHBvcnQgY29uc3QgQ2FzZXNPcGVuZWRCeURheVByaW9yaXR5UmVwb3J0OiBSZXBvcnQgPSB7XG4gIG5hbWU6ICdjYXNlc19vcGVuZWRfYnlfZGF5X3ByaW9yaXR5JyxcbiAgbGFiZWw6ICdDYXNlcyBPcGVuZWQgYnkgUHJpb3JpdHkgXHUwMEQ3IERheScsXG4gIGRlc2NyaXB0aW9uOiAnRGFpbHkgY2FzZSBpbmZsb3cgc3BsaXQgYnkgcHJpb3JpdHknLFxuICBkYXRhc2V0OiAnY2FzZV9tZXRyaWNzJywgcm93czogWydwcmlvcml0eSddLCBjb2x1bW5zOiBbJ2NyZWF0ZWRfYXQnXSwgdmFsdWVzOiBbJ2Nhc2VfY291bnQnXSxcbiAgdHlwZTogJ21hdHJpeCcsXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9zaGFyaW5nL2Nhc2Uuc2hhcmluZy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3NoYXJpbmdcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9zaGFyaW5nL2Nhc2Uuc2hhcmluZy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcblxuLyoqXG4gKiBTaGFyZSBlc2NhbGF0ZWQvY3JpdGljYWwgY2FzZXMgd2l0aCBzZXJ2aWNlIG1hbmFnZXJzLlxuICogQURSLTAwOTAgRDM6IGByb2xlX2FuZF9zdWJvcmRpbmF0ZXNgIGlzIGdvbmUgKHBvc2l0aW9ucyBhcmUgZmxhdCk7IHRoZVxuICogZ3JhbnQgbm93IHRhcmdldHMgdGhlIG1hbmFnZXIgcG9zaXRpb24gaXRzZWxmLlxuICpcbiAqICMjIyBcdTI2QTBcdUZFMEYgYGlzX2Nsb3NlZCA9PSBmYWxzZWAgaXMgREVMSUJFUkFURSBoZXJlIFx1MjAxNCBydWxlZCAyMDI2LTA4LTMxLCBkbyBOT1QgYWxpZ24gaXRcbiAqXG4gKiBgaXNfY2xvc2VkYCBpcyBkZXJpdmVkIGJ5IGBjYXNlX3NsYV9kZWZhdWx0c2AgYXMgYGVmZlN0YXR1cyA9PT0gJ2Nsb3NlZCdgIGFuZFxuICogbmV2ZXIgZmxpcHMgb24gYHJlc29sdmVkYCwgc28gdGhpcyBncmFudCBzdGFuZHMgZm9yIHRoZSBXSE9MRVxuICogYHJlc29sdmVkIFx1MjE5MiBjbG9zZWRgIHdpbmRvdzogYSBtYW5hZ2VyIGtlZXBzIGBlZGl0YCBvbiBhIGNyaXRpY2FsIGNhc2UgdGhhdCBhblxuICogYWdlbnQgaGFzIGFscmVhZHkgcmVzb2x2ZWQsIHVudGlsIHNvbWVib2R5IGNsb3NlcyBpdC5cbiAqXG4gKiBUaGF0IHN0YW5kaW5nIGFjY2VzcyBpcyB0aGUgcG9pbnQsIG5vdCBhbiBvdmVyc2lnaHQuIGByZXNvbHZlZGAgbWVhbnMgXCJ0aGVcbiAqIGFnZW50IGJlbGlldmVzIHRoaXMgaXMgZml4ZWRcIiwgbm90IFwidGhpcyBjYXNlIGlzIG92ZXJcIiwgYW5kIHRoZSB3b3JrIHRoYXRcbiAqIGJlbG9uZ3MgaW4gdGhlIGdhcCBpcyB0aGUgbWFuYWdlcidzOiBxdWFsaXR5LXNhbXBsaW5nIHRoZSByZXNvbHV0aW9uLCBjYWxsaW5nXG4gKiB0aGUgY3VzdG9tZXIgYmFjaywgcmVvcGVuaW5nIGl0IHdoZW4gdGhlIGZpeCBkaWQgbm90IGhvbGQuIFRha2luZyB0aGUgZ3JhbnRcbiAqIGF3YXkgYXQgYHJlc29sdmVkYCB3b3VsZCByZXZva2UgYWNjZXNzIGV4YWN0bHkgd2hlbiB0aGF0IHJldmlldyBzdGFydHMuIEl0IGlzXG4gKiBhbHNvIGhvdyBtYWluc3RyZWFtIHNlcnZpY2UgY2xvdWRzIHNoYXBlIHRoZSBzYW1lIHdpbmRvdyBcdTIwMTQgYSBaZW5kZXNrXG4gKiBzYXRpc2ZhY3Rpb24gcmF0aW5nIGFycml2ZXMgYWZ0ZXIgU29sdmVkLCBTZXJ2aWNlTm93IHN1cnZleXMgb24gcmVzb2x1dGlvblxuICogYW5kIGF1dG8tY2xvc2VzIG9uIGEgdGltZXIuXG4gKlxuICogVHdvIHByb3BlcnRpZXMga2VlcCB0aGlzIGZyb20gYmVpbmcgdGhlIGFjY3VtdWxhdGluZy1wZXJtaXNzaW9uIGhhemFyZCB0aGF0XG4gKiAjMTE0NSB3YXMgYWJvdXQ6IGl0IGlzIE5BUlJPVyAoYGNyaXRpY2FsYCBvbmx5IFx1MjAxNCBub3QgZXZlcnkgY2FzZSBhIG1hbmFnZXJcbiAqIGNvdWxkIGFzayBmb3IpIGFuZCBpdCBpcyBCT1VOREVEIChjbG9zaW5nIHRoZSBjYXNlIGVuZHMgaXQsIGFuZCBjbG9zaW5nIGlzIGFuXG4gKiBvcmRpbmFyeSBhZ2VudCBnZXN0dXJlLCBub3QgYW4gYWRtaW4gb25lKS5cbiAqXG4gKiBcdTI2RDQgRG8gbm90IHJld3JpdGUgdGhpcyBhcyBgc3RhdHVzIG5vdF9pbiBbJ3Jlc29sdmVkJywgJ2Nsb3NlZCddYCBmb3Igc3ltbWV0cnlcbiAqIHdpdGggYGNhc2VfdW5hc3NpZ25lZF90cmlhZ2Vfc2hhcmluZ2AgYmVsb3cuIFNhbWUgc3BlbGxpbmcsIGRpZmZlcmVudFxuICogcXVlc3Rpb246IHRoYXQgcnVsZSBhc2tzIFwiaXMgdGhpcyB3b3JrIHdhaXRpbmcgZm9yIGEgaHVtYW5cIiwgdGhpcyBvbmUgYXNrc1xuICogXCJtYXkgYSBtYW5hZ2VyIHN0aWxsIHJlYWNoIHRoaXMgY2FzZVwiLiBgdGVzdC9saXZlLXdvcmstcHJlZGljYXRlLXBhcml0eS50ZXN0LnRzYFxuICogaG9sZHMgdGhlIGRpZmZlcmVuY2Ugb24gaXRzIGJvdW5kYXJ5IHJvc3Rlciwgc28gdGhlIGFsaWdubWVudCB0dXJucyBpdCByZWRcbiAqIHJhdGhlciB0aGFuIGxhbmRpbmcgc2lsZW50bHkuXG4gKlxuICogIyMjIFdoYXQgd291bGQgbWFrZSB0aGlzIHRoZSBXUk9ORyBzaGFwZVxuICpcbiAqIFRoZSBrZWVwIHJlc3RzIG9uIGEgd29ya2Zsb3cgbm9ib2R5IGhhcyB5ZXQgbWVhc3VyZWQgYSByZWFsIHVzZXIgcGVyZm9ybWluZyxcbiAqIHNvIGl0IGlzIGEganVkZ2VtZW50IHdpdGggbmFtZWQgY29uZGl0aW9ucyByYXRoZXIgdGhhbiBhIGZhY3QuIEFueSBvZiB0aGVzZVxuICogdHVybmluZyB0cnVlIG1ha2VzIGl0IGEgY2FyZCB0byByZS1kZWNpZGUsIG5vdCBhIHRpZHktdXAgdG8gcGVyZm9ybTpcbiAqXG4gKiAgIC0gY2FzZXMgcGlsZSB1cCBpbiBgcmVzb2x2ZWRgIGJlY2F1c2Ugbm90aGluZyBjbG9zZXMgdGhlbSwgc28gXCJib3VuZGVkXCJcbiAqICAgICBzdG9wcyBiZWluZyB0cnVlIGluIHByYWN0aWNlIGFuZCB0aGUgZ3JhbnQgaXMgZWZmZWN0aXZlbHkgcGVybWFuZW50O1xuICogICAtIHRoZSBwb3N0LXJlc29sdXRpb24gcmV2aWV3IG1vdmVzIHRvIGEgc3VyZmFjZSB0aGF0IG5lZWRzIG5vIHJlY29yZCBhY2Nlc3NcbiAqICAgICAoYSBzdXJ2ZXkgb2JqZWN0LCBhIHJlcG9ydCksIGxlYXZpbmcgdGhpcyBncmFudCB3aXRoIG5vIGNvbnN1bWVyO1xuICogICAtIHRoZSBjcml0ZXJpYSB3aWRlbnMgcGFzdCBgY3JpdGljYWxgLCBhdCB3aGljaCBwb2ludCBcIm5hcnJvd1wiIGlzIGdvbmUgdG9vO1xuICogICAtIHNvbWVib2R5IG1lYXN1cmVzIHRoYXQgbm8gbWFuYWdlciBldmVyIG9wZW5zIGEgcmVzb2x2ZWQgY2FzZSBcdTIwMTQgdGhlIG9uZVxuICogICAgIHBpZWNlIG9mIGV2aWRlbmNlICMxMzI4IGNvdWxkIG5vdCBvYnRhaW4gYW5kIGV4cGxpY2l0bHkgZGVjbGluZWQgdG9cbiAqICAgICBhc3N1bWUgZWl0aGVyIHdheS5cbiAqL1xuZXhwb3J0IGNvbnN0IENhc2VFc2NhbGF0aW9uU2hhcmluZ1J1bGUgPSB7XG4gIG5hbWU6ICdjYXNlX2VzY2FsYXRpb25fc2hhcmluZycsXG4gIGxhYmVsOiAnRXNjYWxhdGVkIENhc2VzIFNoYXJpbmcnLFxuICBvYmplY3Q6ICdjcm1fY2FzZScsXG4gIHR5cGU6ICdjcml0ZXJpYScgYXMgY29uc3QsXG4gIGNvbmRpdGlvbjogUGByZWNvcmQucHJpb3JpdHkgPT0gXCJjcml0aWNhbFwiICYmIHJlY29yZC5pc19jbG9zZWQgPT0gZmFsc2VgLFxuICBhY2Nlc3NMZXZlbDogJ2VkaXQnIGFzIGNvbnN0LFxuICBzaGFyZWRXaXRoOiB7IHR5cGU6ICdwb3NpdGlvbicgYXMgY29uc3QsIHZhbHVlOiAnc2VydmljZV9tYW5hZ2VyJyB9LFxufTtcblxuLyoqXG4gKiBUaGUgc2FtZSBlc2NhbGF0aW9uIHZpc2liaWxpdHkgb25lIHJ1bmcgdXAuXG4gKlxuICogUG9zaXRpb25zIGFyZSBGTEFUIChBRFItMDA5MCBEMyksIHNvIHRoZSBkaXJlY3RvciBydW5nIG5lZWRzIGl0cyBvd24gZ3JhbnQgXHUyMDE0XG4gKiB3aXRob3V0IGl0IGEgc2VydmljZSBkaXJlY3RvciBjYW5ub3Qgb3BlbiB0aGUgY3JpdGljYWwgY2FzZSB0aGVpciBtYW5hZ2VyIGlzXG4gKiBiZWluZyBwYWdlZCBhYm91dC4gUmVhZC1vbmx5OiB0aGUgbWFuYWdlciBvbiB0aGUgcnVsZSBhYm92ZSBoYW5kbGVzIGl0LlxuICpcbiAqICMjIyBcdTI2QTBcdUZFMEYgYGlzX2Nsb3NlZCA9PSBmYWxzZWAgaXMgREVMSUJFUkFURSBoZXJlIHRvbyBcdTIwMTQgcnVsZWQgMjAyNi0wOC0zMVxuICpcbiAqIFJlYWQgdGhlIG5vdGUgb24gYENhc2VFc2NhbGF0aW9uU2hhcmluZ1J1bGVgIGFib3ZlIGluIGZ1bGw7IGl0IGlzIHRoZSBzYW1lXG4gKiBkZWNpc2lvbiBhbmQgdGhlIHNhbWUgY29uZGl0aW9ucyBmb3IgcmV2aXNpdGluZyBpdC4gVGhlIHNob3J0IGZvcm06IHRoZSBmbGFnXG4gKiBuZXZlciBmbGlwcyBvbiBgcmVzb2x2ZWRgLCBzbyBhIGRpcmVjdG9yIGtlZXBzIGByZWFkYCBvbiBhIHJlc29sdmVkIGNyaXRpY2FsXG4gKiBjYXNlIHVudGlsIGl0IGlzIGNsb3NlZCwgYW5kIHRoYXQgYHJlc29sdmVkIFx1MjE5MiBjbG9zZWRgIHdpbmRvdyBpcyBwcmVjaXNlbHlcbiAqIHdoZW4gYSBkaXJlY3RvciBsb29rcyBcdTIwMTQgYW4gZXNjYWxhdGlvbiBpcyByZXZpZXdlZCBhZnRlciBpdCBpcyBoYW5kbGVkLCBub3RcbiAqIHdoaWxlIGl0IGlzIHN0aWxsIGJ1cm5pbmcuIGByZWFkYCwgbm90IGBlZGl0YCwgaXMgdGhlIHdob2xlIGRpZmZlcmVuY2UgZnJvbVxuICogdGhlIHJ1bGUgYWJvdmU6IHRoZSBkaXJlY3RvciB3YXRjaGVzIHRoZSB3aW5kb3csIHRoZSBtYW5hZ2VyIHdvcmtzIGl0LlxuICpcbiAqIFx1MjZENCBEbyBub3QgbW92ZSB0aGlzIG9udG8gYHN0YXR1cyBub3RfaW4gWydyZXNvbHZlZCcsICdjbG9zZWQnXWAuIFBpbm5lZCBvbiB0aGVcbiAqIGJvdW5kYXJ5IHJvc3RlciBvZiBgdGVzdC9saXZlLXdvcmstcHJlZGljYXRlLXBhcml0eS50ZXN0LnRzYCwgd2l0aCB0aGUgcmVhc29uLlxuICovXG5leHBvcnQgY29uc3QgQ2FzZURpcmVjdG9yU2hhcmluZ1J1bGUgPSB7XG4gIG5hbWU6ICdjYXNlX2RpcmVjdG9yX3NoYXJpbmcnLFxuICBsYWJlbDogJ0VzY2FsYXRlZCBDYXNlcyBcdTIwMTQgU2VydmljZSBEaXJlY3RvcicsXG4gIG9iamVjdDogJ2NybV9jYXNlJyxcbiAgdHlwZTogJ2NyaXRlcmlhJyBhcyBjb25zdCxcbiAgY29uZGl0aW9uOiBQYHJlY29yZC5wcmlvcml0eSA9PSBcImNyaXRpY2FsXCIgJiYgcmVjb3JkLmlzX2Nsb3NlZCA9PSBmYWxzZWAsXG4gIGFjY2Vzc0xldmVsOiAncmVhZCcgYXMgY29uc3QsXG4gIHNoYXJlZFdpdGg6IHsgdHlwZTogJ3Bvc2l0aW9uJyBhcyBjb25zdCwgdmFsdWU6ICdzZXJ2aWNlX2RpcmVjdG9yJyB9LFxufTtcblxuLyoqXG4gKiBUaGUgaW50YWtlIHF1ZXVlJ3MgcmVhZCBzaWRlOiBhbiBPUEVOIGNhc2UgdGhhdCBub2JvZHkgb3ducyBpcyB2aXNpYmxlIHRvXG4gKiBldmVyeSBzZXJ2aWNlIGFnZW50LCBzbyB0aGV5IGNhbiBwdWxsIGl0IG91dCBvZiB0cmlhZ2UgKCMxMDk2KS5cbiAqXG4gKiAjIyMgV2hhdCB3YXMgYnJva2VuXG4gKlxuICogIzU5NiBzaGlwcGVkIHJvdW5kLXJvYmluIGludGFrZSBwbHVzIGEgcGlubmVkIGBVbmFzc2lnbmVkIFx1MjAxNCB0cmlhZ2VgIHRhYiwgYW5kXG4gKiBgY2FzZV9hdXRvX2Fzc2lnbmAgaXMgYSBkZWxpYmVyYXRlIE5PLU9QIHdoZW5ldmVyIHRoZSBgc2VydmljZV9hZ2VudGAgcG9vbCBpc1xuICogZW1wdHkgb3IgdW5yZWFkYWJsZSAodGhlIGFub255bW91cyB3ZWItdG8tY2FzZSBwYXRoIGNhbm5vdCByZWFkXG4gKiBgc3lzX3VzZXJfcG9zaXRpb25gIGF0IGFsbCkuIFRob3NlIGNhc2VzIGxhbmQgb3duZXJsZXNzIFx1MjAxNCBhbmQgYHNlcnZpY2VfYWdlbnRgXG4gKiBob2xkcyBgY3JtX2Nhc2VgIHdpdGggYHJlYWRTY29wZTogJ293bidgLCBzbyBhbiB1bm93bmVkIHJvdyBtYXRjaGVkIG5vYm9keSdzXG4gKiBvd24tc2NvcGUuIFRoZSB0YWIgd2FzIHBpbm5lZCBpbiBldmVyeSBDYXNlcyBsaXN0IGluY2x1ZGluZyB0aGUgYWdlbnQncywgYW5kXG4gKiBpdCByZXR1cm5lZCB6ZXJvIHJvd3MgZm9yIHRoZSBvbmUgcGVyc29uYSBpdCBleGlzdHMgZm9yLlxuICpcbiAqICMjIyBXaHkgVEhJUyBzaGFwZSAodGhlIHJ1bGluZyBvbiAjMTA5Niwgb3B0aW9uIEEpXG4gKlxuICogVGhlIGdyYW50IGlzICoqc2VsZi1saW1pdGluZyoqOiBpdCBob2xkcyBvbmx5IHdoaWxlIGBvd25lcl9pZGAgaXMgZW1wdHksIHNvXG4gKiB0aGUgaW5zdGFudCBhbiBhZ2VudCBjbGFpbXMgdGhlIGNhc2UgdGhlIGNyaXRlcmlhIHN0b3BzIG1hdGNoaW5nLCB0aGUgc2hhcmVcbiAqIGlzIHJldm9rZWQgb24gdGhlIG5leHQgcmVjb25jaWxlLCBhbmQgb3JkaW5hcnkgb3duLXNjb3BlIHJlc3VtZXMuIFRoZXJlIGlzIG5vXG4gKiBhY2N1bXVsYXRpbmcgcGVybWlzc2lvbiBzdXJmYWNlIFx1MjAxNCB0aGUgcnVsZSdzIG93biBjb25kaXRpb24gZGVzdHJveXMgaXQuIFRoYXRcbiAqIGlzIHdoYXQgbWFrZXMgaXQgbmFycm93ZXIgdGhhbiB0aGUgdHdvIHJlamVjdGVkIGFsdGVybmF0aXZlczogYHZpZXdBbGxSZWNvcmRzYFxuICogb24gdGhlIHByb2ZpbGUgKG9wdGlvbiBDKSBoYW5kcyBldmVyeSBhZ2VudCBldmVyeSBjdXN0b21lcidzIGVudGlyZSBjYXNlXG4gKiBoaXN0b3J5IHRvIHNvbHZlIGEgbnVsbC1vd25lciBwcm9ibGVtLCBhbmQgdW5waW5uaW5nIHRoZSB0YWIgKG9wdGlvbiBCKSBpcyBub3RcbiAqIGV4cHJlc3NpYmxlIFx1MjAxNCBgVmlld1RhYlNjaGVtYWAgaGFzIG5vIHBlci1wcm9maWxlIHNjb3BpbmcgXHUyMDE0IHNvIGl0IG1lYW5zXG4gKiByZW1vdmluZyB0aGUgdGFiIGZvciBldmVyeW9uZS5cbiAqXG4gKiBgZWRpdGAsIG5vdCBgcmVhZGA6IHRyaWFnZSBpcyBhIHB1bGwgcXVldWUuIEFuIGFnZW50IHdobyBjYW4gc2VlIHRoZSByb3cgYnV0XG4gKiBub3Qgd3JpdGUgaXQgY2Fubm90IGNsYWltIGl0LCBhbmQgY2xhaW1pbmcgaXMgdGhlIHdob2xlIHBvaW50LlxuICpcbiAqICMjIyBcdTI2QTBcdUZFMEYgV2h5IHRoZXJlIGlzIG5vIGBoYXMoKWAgZ3VhcmQgaGVyZSwgYW5kIHdoeSBhZGRpbmcgb25lIHdvdWxkIGJyZWFrIGl0XG4gKlxuICogQSBzaGFyaW5nIGNvbmRpdGlvbiBpcyBOT1QgYW4gaW50ZXJwcmV0ZWQgQ0VMIHByZWRpY2F0ZS4gYHBsdWdpbi1zaGFyaW5nYFxuICogY29tcGlsZXMgaXQgdG8gYSBwdXNoZG93biBmaWx0ZXIgd2l0aCBgY29tcGlsZUNlbFRvRmlsdGVyYCwgd2hpY2ggcmVqZWN0cyB0aGVcbiAqIHdob2xlIGZ1bmN0aW9uLWNhbGwgY2xhc3MgXHUyMDE0IHNvIGEgYGhhcyhyZWNvcmQub3duZXJfaWQpYCBndWFyZCBtYWtlcyB0aGlzIHJ1bGVcbiAqICp1bnRyYW5zbGF0YWJsZSosIGFuZCB0aGUgc2VlZGVyIHRoZW4gcmVmdXNlcyBpdCBvdXRyaWdodCAobmV2ZXIgZGVncmFkaW5nIGl0XG4gKiB0byBtYXRjaC1hbGwpLiBUaGUgcnVsZSB3b3VsZCBiZSBkZWNsYXJlZCwgZG9jdW1lbnRlZCBhbmQgc2lsZW50bHkgdW5zZWVkZWQ6XG4gKiBleGFjdGx5IHRoZSAjNjIxIGRlZmVjdC4gVGhlIGhvdXNlIHRvdGFsaXR5IHJ1bGUgKEFHRU5UUy5tZCAjNjMwKSBnb3Zlcm5zIHRoZVxuICogdHdvIElOVEVSUFJFVEVEIHN1cmZhY2VzIFx1MjAxNCBvYmplY3QgYHZhbGlkYXRpb25zW11gIC8gZmllbGQgcHJlZGljYXRlcywgYW5kXG4gKiByZWNvcmQtY2hhbmdlIGZsb3cgY29uZGl0aW9ucyBcdTIwMTQgYW5kIGRvZXMgbm90IHJlYWNoIHRoaXMgb25lLlxuICpcbiAqIFRvdGFsaXR5IGlzIHN0aWxsIGFuc3dlcmVkLCBvbmUgbGF5ZXIgZG93bjogYHJlY29yZC5vd25lcl9pZCA9PSBudWxsYCBsb3dlcnNcbiAqIHRvIGB7IG93bmVyX2lkOiB7ICRudWxsOiB0cnVlIH0gfWAsIGFuZCBgJG51bGxgIGlzIHRoZSBvcGVyYXRvciBmb3JtIHRoYXRcbiAqIHRyZWF0cyBhbiBBQlNFTlQga2V5IGFuZCBhIE5VTEwgY29sdW1uIGFsaWtlLiBUaGF0IG1hdHRlcnMgYmVjYXVzZSB0aGUgdHdvXG4gKiBzaGFwZXMgYXJlIGJvdGggcmVhbCBcdTIwMTQgYGRyaXZlci1tZW1vcnlgIHN0b3JlcyBvbmx5IHRoZSBjb2x1bW5zIGEgcm93IHdhc1xuICogd3JpdHRlbiB3aXRoLCBTUUwgc3RvcmVzIGV2ZXJ5IGNvbHVtbiBcdTIwMTQgYW5kIGEgbWFya2V0cGxhY2UgYXBwIGRvZXMgbm90IGNob29zZVxuICogaXRzIGhvc3QncyBkYXRhc291cmNlLiBCb3RoIGFyZSBNRUFTVVJFRCwgZW5kIHRvIGVuZCwgaW5cbiAqIGB0ZXN0L3VuYXNzaWduZWQtY2FzZS10cmlhZ2UtcmVhY2gudGVzdC50c2A7IHRoZSBjb21waWxlcidzIG93biB2ZXJkaWN0IG9uXG4gKiBgaGFzKClgIGlzIHBpbm5lZCBpbiBgdGVzdC9zaGFyaW5nLXNlZWRpbmcudGVzdC50c2AuXG4gKlxuICogIyMjIFx1MjZBMFx1RkUwRiBXaHkgdGhlIHNlY29uZCBjbGF1c2UgaXMgYSBTVEFUVVMgY2hhaW4sIG5vdCBgaXNfY2xvc2VkID09IGZhbHNlYFxuICpcbiAqIFRoaXMgZ3JhbnQgaXMgZGVsaWJlcmF0ZWx5IE5BUlJPV0VSIHRoYW4gaXQgd2FzLiBgaXNfY2xvc2VkYCBpcyBkZXJpdmVkIGJ5XG4gKiBgY2FzZV9zbGFfZGVmYXVsdHNgIGFzIGBlZmZTdGF0dXMgPT09ICdjbG9zZWQnYCwgc28gaXQgbmV2ZXIgZmxpcHMgb25cbiAqIGByZXNvbHZlZGAgXHUyMDE0IGFuZCB0aGUgb2xkIHByZWRpY2F0ZSB0aGVyZWZvcmUgaGFuZGVkIGV2ZXJ5IHNlcnZpY2UgYWdlbnRcbiAqIGBlZGl0YCBvbiBldmVyeSBSRVNPTFZFRCBvd25lcmxlc3MgY2FzZSwgZm9yZXZlci4gQSByZXNvbHZlZCBjYXNlIGlzIG5vdFxuICogYmFja2xvZyBhbmQgbm90IHdvcmsgd2FpdGluZyBmb3IgYSBodW1hbiwgc28gdGhlIGdyYW50IGlzIG5vdyB0aGUgc2FtZVxuICogXCJubyBsb25nZXIgbGl2ZSB3b3JrXCIgcHJlZGljYXRlIHRoZSBsb2FkLWJhbGFuY2luZyBob29rc1xuICogKGBDTE9TRURfQ0FTRV9TVEFUVVNFU2AgaW4gYF9jYXNlLWFzc2lnbm1lbnQudHNgKSBhbmQgYGNhc2Vfc2xhX21vbml0b3JgXG4gKiBhbHJlYWR5IHVzZTogdGhlIGNhc2UgaXMgc2hhcmVkIG9ubHkgd2hpbGUgaXRzIHN0YXR1cyBpcyBuZWl0aGVyIGByZXNvbHZlZGBcbiAqIG5vciBgY2xvc2VkYC4gYHRlc3QvbGl2ZS13b3JrLXByZWRpY2F0ZS1wYXJpdHkudGVzdC50c2AgaG9sZHMgdGhlIGZvdXJcbiAqIGNvbnN1bWVycyB0byB0aGF0IG9uZSBzZXQsIEJZIE5BTUUuXG4gKlxuICogXHUyNkEwXHVGRTBGIFRoZSB0aWdodGVuaW5nIGRvZXMgTk9UIGJyZWFrIHRoZSBjbGFpbSBzZWFtLiBSZWNvcmQgYWNjZXNzIGlzIHJlc29sdmVkXG4gKiBhZ2FpbnN0IHRoZSBTVE9SRUQgcm93LCBzbyBhbiBhZ2VudCByZXNvbHZpbmcgYW4gdW5vd25lZCBvcGVuIGNhc2Ugc3RyYWlnaHRcbiAqIG91dCBvZiB0cmlhZ2UgaXMgc3RpbGwgcmVhY2hhYmxlICh0aGUgY2FzZSBpcyBvcGVuIGF0IHRoZSBtb21lbnQgb2YgdGhlXG4gKiB3cml0ZSkgXHUyMDE0ICMxMTQzJ3MgXCJmaW5pc2hpbmcgYSBjYXNlIGlzIG5vdCBwaWNraW5nIGl0IHVwXCIgaXMgdW5jaGFuZ2VkLiBXaGF0XG4gKiB0aGUgYWdlbnQgbG9zZXMgaXMgcmVvcGVuaW5nIGFuICphbHJlYWR5KiByZXNvbHZlZCBvd25lcmxlc3MgY2FzZSwgd2hpY2ggcHV0c1xuICogYHJlc29sdmVkYCBpbiBleGFjdGx5IHRoZSBidWNrZXQgYGNsb3NlZGAgaGFzIGJlZW4gaW4gc2luY2UgIzExMzQ6IHJlb3BlbmluZ1xuICogYSB0ZXJtaW5hbCB1bm93bmVkIGNhc2UgaXMgYW4gYWRtaW4gbW92ZSwgbm90IGEgdHJpYWdlIG1vdmUuXG4gKlxuICogVGhlIHNwZWxsaW5nIGlzIHRoZSBgIT1gIGNoYWluIHJhdGhlciB0aGFuIGAhKHJlY29yZC5zdGF0dXMgaW4gWy4uLl0pYCwgYW5kXG4gKiB0aGF0IGlzIG1lYXN1cmVkLCBub3Qgc3R5bGlzdGljLiBCb3RoIGNvbXBpbGUsIGJ1dCB0aGUgbWVtYmVyc2hpcCBmb3JtIGxvd2Vyc1xuICogdG8gYSBUT1AtTEVWRUwgYCRub3RgIHdyYXBwaW5nIGFuIGAkaW5gLCBhIGNvbWJpbmF0aW9uIGFic2VudCBmcm9tIHRoZVxuICogbWVhc3VyZWQgb3BlcmF0b3IgbWF0cml4IGluIGB0ZXN0L3NoYXJpbmctc2VlZGluZy50ZXN0LnRzYCBhbmQgb24gdGhlIG9uZVxuICogb3BlcmF0b3IgdGhhdCBmaWxlIHJlY29yZHMgYSBkcml2ZXIgcmVncmVzc2lvbiBmb3IuIFRoZSBjaGFpbiBsb3dlcnMgdG9cbiAqIGB7ICRhbmQ6IFt7IHN0YXR1czogeyAkbmU6IFx1MjAyNiB9IH0sIFx1MjAyNl0gfWAgXHUyMDE0IHBsYWluIGNvbmp1bmN0aW9uIG9mIHRoZSBvcGVyYXRvclxuICogdGhhdCBtYXRyaXggbGlzdHMgYXMgc3VwcG9ydGVkLiBBbiB1bnRyYW5zbGF0YWJsZSBvciB1bmV4ZWN1dGFibGUgc2hhcmluZ1xuICogY29uZGl0aW9uIGlzIG5vdCBhIGxvdWQgZmFpbHVyZTogdGhlIHNlZWRlciBEUk9QUyB0aGUgcnVsZSBhbmQgdGhlIHRhYiBnb2VzXG4gKiBlbXB0eSBhZ2FpbiAoIzYyMSksIHNvIHRoaXMgcnVsZSB0YWtlcyB0aGUgcG9ydGFibGUgZm9ybS5cbiAqXG4gKiBgc3RhdHVzYCBuZWVkcyBubyB0b3RhbGl0eSBndWFyZCB0aGUgd2F5IGBvd25lcl9pZGAgZG9lczogaXQgaXMgYHJlcXVpcmVkYFxuICogd2l0aCBgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH1gIG9uIGBjcm1fY2FzZWAsIHNvIHVubGlrZSB0aGUgb3duZXJsZXNzXG4gKiBjb2x1bW4gaXQgaXMgbmV2ZXIgdGhlIGFic2VudC1rZXkgc2hhcGUuXG4gKlxuICogQSByZXNvbHZlZCBvciBjbG9zZWQgdW5vd25lZCBjYXNlIHN0YXlzIGhpZGRlbiBvbiBwdXJwb3NlOiBpdCBpcyBoaXN0b3J5LCBub3RcbiAqIGJhY2tsb2csIGFuZCB0aGUgdGFiJ3Mgcm93IGNvdW50IGhhcyB0byBrZWVwIG1lYW5pbmcgXCJ3b3JrIHdhaXRpbmcgZm9yIGFcbiAqIGh1bWFuXCIuXG4gKi9cbmV4cG9ydCBjb25zdCBDYXNlVW5hc3NpZ25lZFRyaWFnZVNoYXJpbmdSdWxlID0ge1xuICBuYW1lOiAnY2FzZV91bmFzc2lnbmVkX3RyaWFnZV9zaGFyaW5nJyxcbiAgbGFiZWw6ICdVbmFzc2lnbmVkIENhc2VzIFx1MjAxNCBUcmlhZ2UnLFxuICBvYmplY3Q6ICdjcm1fY2FzZScsXG4gIHR5cGU6ICdjcml0ZXJpYScgYXMgY29uc3QsXG4gIGNvbmRpdGlvbjogUGByZWNvcmQub3duZXJfaWQgPT0gbnVsbCAmJiByZWNvcmQuc3RhdHVzICE9IFwicmVzb2x2ZWRcIiAmJiByZWNvcmQuc3RhdHVzICE9IFwiY2xvc2VkXCJgLFxuICBhY2Nlc3NMZXZlbDogJ2VkaXQnIGFzIGNvbnN0LFxuICBzaGFyZWRXaXRoOiB7IHR5cGU6ICdwb3NpdGlvbicgYXMgY29uc3QsIHZhbHVlOiAnc2VydmljZV9hZ2VudCcgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3NraWxscy9jYXNlLXRyaWFnZS5za2lsbC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3NraWxsc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3NraWxscy9jYXNlLXRyaWFnZS5za2lsbC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lU2tpbGwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogQ2FzZSBUcmlhZ2UgXHUyMDE0IHByaW9yaXRpc2UgYSBzdXBwb3J0IGNhc2UgYW5kIHJvdXRlIGl0IHRvIHRoZSByaWdodCBhY3Rpb24uXG4gKlxuICogQURSLTAxMDk6IHRoaXMgc2tpbGwgZGVjbGFyZXMgTk8gdG9vbCByZWNvcmRzLiBUcmlhZ2UgaXRzZWxmIGlzXG4gKiByZWFzb25pbmcsIG5vdCBhIHRvb2wgXHUyMDE0IHRoZSBhZ2VudCByZWFkcyB0aGUgY2FzZSB3aXRoIHRoZSBwbGF0Zm9ybSdzXG4gKiBkYXRhIHRvb2xzIGFuZCBhcHBsaWVzIHRoZSBydWJyaWMgYmVsb3cuXG4gKlxuICogSXQgZGVsaWJlcmF0ZWx5IGNhbGxzIE5PVEhJTkcgdGhhdCBtdXRhdGVzLiBFc2NhbGF0ZSBhbmQgQ2xvc2UgY2Fycnkgbm9cbiAqIGBhaWAgYmxvY2ssIGFuZCBBRFItMDAxMSBleHBvc3VyZSBpcyBvcHQtaW4gLyBkZWZhdWx0IG9mZiwgc28gdGhlXG4gKiBydW50aW1lIG1hdGVyaWFsaXNlcyBubyBgYWN0aW9uX2VzY2FsYXRlX2Nhc2VgIC8gYGFjdGlvbl9jbG9zZV9jYXNlYFxuICogdG9vbCBmb3IgdGhlIHNraWxsIHRvIGNhbGwuIFRoYXQgaXMgdGhlIHJpZ2h0IHNoYXBlIGhlcmUgXHUyMDE0IGJvdGggQWN0aW9uc1xuICogZXhpc3QgdG8gY29sbGVjdCBhIHJlYXNvbiAvIHJlc29sdXRpb24gZnJvbSBhIHBlcnNvbiwgc28gdGhlIGFnZW50XG4gKiBzdXBwbGllcyB0aGUganVkZ2VtZW50IGFuZCB0aGUgaHVtYW4gc3VwcGxpZXMgdGhlIHdvcmRzIGFuZCB0aGVcbiAqIGRlY2lzaW9uIFx1MjAxNCBhbmQgdGhlIHNraWxsIHJlY29tbWVuZHMgdGhlIGJ1dHRvbiBpbnN0ZWFkIG9mIHByZXRlbmRpbmcgdG9cbiAqIHByZXNzIGl0LiAoQm90aCBiZWNhbWUgYHR5cGU6ICdmbG93J2AgaW4gIzUxNSwgc28gb3B0aW5nIHRoZW0gaW4gbGF0ZXJcbiAqIGlzIGEgZ292ZXJuYW5jZSBjYWxsLCBub3QgYSBtZWNoYW5pY2FsIG9uZTsgdGhlIHJldmlldyBzdGVwIGlzIHRoZVxuICogcG9pbnQuKVxuICovXG5leHBvcnQgY29uc3QgQ2FzZVRyaWFnZVNraWxsID0gZGVmaW5lU2tpbGwoe1xuICBuYW1lOiAnY2FzZV90cmlhZ2UnLFxuICBsYWJlbDogJ0Nhc2UgVHJpYWdlJyxcbiAgZGVzY3JpcHRpb246ICdUcmlhZ2VzIGEgc3VwcG9ydCBjYXNlLCBhc3NpZ25zIGEgcHJpb3JpdHkgd2l0aCBpdHMganVzdGlmaWNhdGlvbiwgYW5kIHBvaW50cyBhdCB0aGUgZXNjYWxhdGUvY2xvc2UgYWN0aW9uLicsXG5cbiAgaW5zdHJ1Y3Rpb25zOiBgV2hlbiB0aGUgdXNlciBhc2tzIHRvIHRyaWFnZSwgcHJpb3JpdGlzZSwgb3IgY2xhc3NpZnkgYSBjYXNlOlxuXG4xLiBSZWFkIHRoZSBjYXNlIGZpcnN0IFx1MjAxNCBjYWxsIFxcYGRlc2NyaWJlX29iamVjdFxcYCBmb3IgXFxgY3JtX2Nhc2VcXGAgKHRoZVxuICAgc2NoZW1hIGlzIGFsaXZlOyBhZG1pbnMgYWRkIGZpZWxkcyksIHRoZW4gXFxgZ2V0X3JlY29yZFxcYCBmb3IgdGhlIGNhc2VcbiAgIGF0IGhhbmQuIE5ldmVyIHRyaWFnZSBmcm9tIG1lbW9yeSBvZiBhIHByZXZpb3VzIHR1cm4uXG4yLiBBc3NpZ24gYSBwcmlvcml0eSB5b3Vyc2VsZiBmcm9tIHdoYXQgeW91IHJlYWQuIFRoZXJlIGlzIG5vIHRyaWFnZVxuICAgdG9vbCBhbmQgeW91IGRvIG5vdCBuZWVkIG9uZSBcdTIwMTQgd2VpZ2gsIGluIG9yZGVyOiBjdXN0b21lciB0aWVyIGFuZFxuICAgY29udHJhY3QgdmFsdWUsIHdoZXRoZXIgdGhlIGN1c3RvbWVyIGlzIGJsb2NrZWQgd2l0aCBubyB3b3JrYXJvdW5kLFxuICAgaG93IGxvbmcgdGhlIGNhc2UgaGFzIGJlZW4gb3BlbiBhZ2FpbnN0IGl0cyBTTEEsIGFuZCB0aGUgc2VudGltZW50XG4gICBvZiB0aGUgbGF0ZXN0IGN1c3RvbWVyIG1lc3NhZ2UuXG4zLiBTdGF0ZSB0aGUgcHJpb3JpdHkgYW5kIHRoZSBPTkUgcmVhc29uIHRoYXQgZHJvdmUgaXQuIENpdGUgdGhlIGNhc2VcbiAgIElEIGFuZCB0aGUgZmllbGQgdmFsdWVzIHlvdSB1c2VkLlxuNC4gSWYgdGhlIHByaW9yaXR5IGlzIGNyaXRpY2FsLCBzYXkgc28gYW5kIHBvaW50IHRoZSB1c2VyIGF0XG4gICAqKkVzY2FsYXRlIENhc2UqKiBvbiB0aGUgcmVjb3JkIGhlYWRlciBcdTIwMTQgb2ZmZXIgYSByZWFkeS10by1wYXN0ZVxuICAgXFxgcmVhc29uXFxgIGJ1aWx0IGZyb20gc3RlcCAzLiBZb3UgY2Fubm90IGVzY2FsYXRlIHlvdXJzZWxmLCBhbmQgc2hvdWxkXG4gICBub3QgaW1wbHkgb3RoZXJ3aXNlLlxuNS4gSWYgdGhlIGNhc2UgaXMgcmVzb2x2ZWQgaW4gc3Vic3RhbmNlLCBwb2ludCBhdCAqKkNsb3NlIENhc2UqKiBhbmRcbiAgIG9mZmVyIGEgXFxgcmVzb2x1dGlvblxcYCBzdW1tYXJ5IHRoZSB1c2VyIGNhbiBwYXN0ZS5cbjYuIEZvciB0aGUgY3VzdG9tZXItZmFjaW5nIHJlcGx5LCBoYW5kIG9mZiB0byB0aGUgXFxgZW1haWxfZHJhZnRpbmdcXGBcbiAgIHNraWxsIHJhdGhlciB0aGFuIGRyYWZ0aW5nIGl0IGhlcmUuYCxcblxuICB0b29sczogWydkZXNjcmliZV9vYmplY3QnLCAnZ2V0X3JlY29yZCddLFxuXG4gIHRyaWdnZXJDb25kaXRpb25zOiBbXG4gICAgeyBmaWVsZDogJ29iamVjdE5hbWUnLCBvcGVyYXRvcjogJ2VxJywgdmFsdWU6ICdjcm1fY2FzZScgfSxcbiAgXSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS92aWV3cy9jYXNlLnZpZXcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS92aWV3c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3ZpZXdzL2Nhc2Uudmlldy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBUaGUgb25lIGRhdGEgcHJvdmlkZXIgZXZlcnkgdmlldyBiZWxvdyByZWFkcyBcdTIwMTQgdGhlIGRlZmF1bHQgbGlzdCwgdGhlIHNldmVuXG4gKiBuYW1lZCBsaXN0IHZpZXdzIGFuZCB0aGUgd2ViLXRvLWNhc2UgZm9ybSBhbGwgbGlzdCBvciB3cml0ZSBgY3JtX2Nhc2VgIFx1MjAxNFxuICogd3JpdHRlbiBvbmNlIGFuZCBwYXNzZWQgYnkgc2hvcnRoYW5kIChgZGF0YSxgKSByYXRoZXIgdGhhbiBzcGVsbGVkIG91dCBuaW5lXG4gKiB0aW1lcy5cbiAqL1xuY29uc3QgZGF0YSA9IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fY2FzZScgfSBhcyBjb25zdDtcblxuLyoqXG4gKiBDYXNlIChTZXJ2aWNlKSBWaWV3c1xuICpcbiAqICAgXHUyMDIyIGdyaWQgICAgIFx1MjAxNCBzdXBwb3J0IHF1ZXVlIHdpdGggU0xBIGNvbHVtbnNcbiAqICAgXHUyMDIyIGthbmJhbiAgIFx1MjAxNCBjYXNlIHdvcmtmbG93IGdyb3VwZWQgYnkgc3RhdHVzXG4gKiAgIFx1MjAyMiB0aW1lbGluZSBcdTIwMTQgY2hyb25vbG9naWNhbCBjYXNlIHN0cmVhbVxuICogICBcdTIwMjIgY2FsZW5kYXIgXHUyMDE0IFNMQSBkdWUtZGF0ZSBjYWxlbmRhclxuICovXG5leHBvcnQgY29uc3QgQ2FzZVZpZXdzID0gZGVmaW5lVmlldyh7XG4gIGxpc3Q6IHtcbiAgICB0eXBlOiAnZ3JpZCcsXG4gICAgbmFtZTogJ2FsbF9jYXNlcycsXG4gICAgbGFiZWw6ICdBbGwgQ2FzZXMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhLFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICdjYXNlX251bWJlcicsIHdpZHRoOiAxMzAsIHNvcnRhYmxlOiB0cnVlLCBsaW5rOiB0cnVlLCBwaW5uZWQ6ICdsZWZ0JyB9LFxuICAgICAgeyBmaWVsZDogJ3N1YmplY3QnLCB3aWR0aDogMjgwLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ2NybV9hY2NvdW50Jywgd2lkdGg6IDE4MCB9LFxuICAgICAgeyBmaWVsZDogJ2NybV9jb250YWN0Jywgd2lkdGg6IDE2MCB9LFxuICAgICAgeyBmaWVsZDogJ3ByaW9yaXR5Jywgd2lkdGg6IDExMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCB3aWR0aDogMTMwLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ29yaWdpbicsIHdpZHRoOiAxMjAgfSxcbiAgICAgIHsgZmllbGQ6ICdzbGFfZHVlX2RhdGUnLCB3aWR0aDogMTYwLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ2lzX3NsYV92aW9sYXRlZCcsIHdpZHRoOiAxMTAsIGFsaWduOiAnY2VudGVyJyB9LFxuICAgICAgeyBmaWVsZDogJ2lzX2VzY2FsYXRlZCcsIHdpZHRoOiAxMTAsIGFsaWduOiAnY2VudGVyJyB9LFxuICAgICAgeyBmaWVsZDogJ293bmVyX2lkJywgd2lkdGg6IDE1MCB9LFxuICAgIF0sXG4gICAgLy8gU29ydCBvbiB0aGUgbWF0ZXJpYWxpc2VkIG9yZGluYWwsIG5vdCB0aGUgc2VsZWN0IGl0c2VsZjogYHByaW9yaXR5IGRlc2NgXG4gICAgLy8gY29tcGFyZXMgcmF3IHN0cmluZ3MgYW5kIGxhbmRzIG1lZGl1bSA+IGxvdyA+IGhpZ2ggPiBjcml0aWNhbCwgYnVyeWluZ1xuICAgIC8vIGV2ZXJ5IGNyaXRpY2FsIGNhc2UgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcXVldWUuXG4gICAgc29ydDogW1xuICAgICAgeyBmaWVsZDogJ3ByaW9yaXR5X3JhbmsnLCBvcmRlcjogJ2Rlc2MnIH0sXG4gICAgICB7IGZpZWxkOiAnc2xhX2R1ZV9kYXRlJywgb3JkZXI6ICdhc2MnIH0sXG4gICAgXSxcbiAgICByb3dDb2xvcjoge1xuICAgICAgZmllbGQ6ICdwcmlvcml0eScsXG4gICAgICBjb2xvcnM6IHsgY3JpdGljYWw6ICdyZWQnLCBoaWdoOiAnb3JhbmdlJywgbWVkaXVtOiAneWVsbG93JywgbG93OiAnc2xhdGUnIH0sXG4gICAgfSxcbiAgICBzZWxlY3Rpb246IHsgdHlwZTogJ211bHRpcGxlJyB9LFxuICAgIHBhZ2luYXRpb246IHsgcGFnZVNpemU6IDUwIH0sXG4gICAgLy8gVGhlIFVJIGRvb3IgZm9yIHRoZSBgYWxsb3dFeHBvcnRgIGdyYW50IGZvdXIgcHJvZmlsZXMgYWxyZWFkeSBob2xkIG9uXG4gICAgLy8gYGNybV9jYXNlYC4gRXhwb3J0IHJ1bnMgb24gT05FIHNlcnZlci1zaWRlIHJvdXRlXG4gICAgLy8gKGBHRVQgL2FwaS92MS9kYXRhL2NybV9jYXNlL2V4cG9ydGAsIGdhdGVkIGJ5IGBzZWN1cml0eS5jYW5FeHBvcnRgKSwgc29cbiAgICAvLyB0aGlzIGRlY2xhcmVzIHdoaWNoIGZvcm1hdHMgdGhlIHRvb2xiYXIgb2ZmZXJzIFx1MjAxNCBub3QgYSBzZWNvbmQgZ2F0ZTogYVxuICAgIC8vIHByb2ZpbGUgd2l0aG91dCB0aGUgZ3JhbnQgZ2V0cyA0MDMgd2hldGhlciBpdCBjbGlja3MgdGhlIGJ1dHRvbiBvclxuICAgIC8vIGN1cmxzIHRoZSByb3V0ZS4gTWVhc3VyZWQgaW4gIzc5OC8jODE2OyBiZWZvcmUgdGhpcyB0aGUgZ3JhbnQgd2FzIGxpdmVcbiAgICAvLyBidXQgcmVhY2hhYmxlIG9ubHkgYnkgYGN1cmxgLlxuICAgIGV4cG9ydE9wdGlvbnM6IHsgZm9ybWF0czogWydjc3YnLCAneGxzeCddIH0sXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnLCAna2FuYmFuJywgJ2NhbGVuZGFyJywgJ3RpbWVsaW5lJ10sXG4gICAgfSxcbiAgICAvLyBCaW5kcyB0aGUgJ2NhbGVuZGFyJyBlbnRyeSBhYm92ZTogdGhlIHN3aXRjaGVyIG9wZW5zIHRoZSBzYW1lIGRlYWRsaW5lc1xuICAgIC8vIHRoZSBkZWRpY2F0ZWQgYHNsYV9jYWxlbmRhcmAgdmlldyBzaG93cywgb24gdGhlIGZpZWxkIHRoaXMgbGlzdCBhbHJlYWR5XG4gICAgLy8gc29ydHMgYnkuIGBzbGFfZHVlX2RhdGVgIGlzIG9wdGlvbmFsIFx1MjAxNCBhIGNhc2UgdGhlIFNMQSBtb25pdG9yIGhhcyBub3RcbiAgICAvLyBzdGFtcGVkIGNhcnJpZXMgbm8gZGF0ZSBhdCBhbGwsIHdoaWNoIGlzIHRoZSB0cnV0aGZ1bCBhbnN3ZXI7IHRoZVxuICAgIC8vIGFsdGVybmF0aXZlIHRoZSBwbGF0Zm9ybSByZWZ1c2VzIGlzIGEgZ3Vlc3NlZCBmaWVsZCBwdXR0aW5nIGV2ZXJ5IHN1Y2hcbiAgICAvLyBjYXNlIG9uIHRvZGF5LlxuICAgIGNhbGVuZGFyOiB7XG4gICAgICBzdGFydERhdGVGaWVsZDogJ3NsYV9kdWVfZGF0ZScsXG4gICAgICB0aXRsZUZpZWxkOiAnc3ViamVjdCcsXG4gICAgICBjb2xvckZpZWxkOiAncHJpb3JpdHknLFxuICAgIH0sXG4gICAgLy8gRXNjYWxhdGUgc3RyYWlnaHQgZnJvbSB0aGUgcXVldWU6IGVzY2FsYXRlX2Nhc2UncyBvd25cbiAgICAvLyBgbG9jYXRpb25zOiBbJ2xpc3RfaXRlbSddYCBhdXRvLWluamVjdHMgdGhlIHJvdy1tZW51IGl0ZW0uXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgLyoqIFNlcnZpY2Ugd29ya2Zsb3cgYm9hcmQgKi9cbiAgICBjYXNlX3dvcmtmbG93OiB7XG4gICAgICBuYW1lOiAnY2FzZV93b3JrZmxvdycsXG4gICAgICB0eXBlOiAna2FuYmFuJyxcbiAgICAgIGxhYmVsOiAnU2VydmljZSBXb3JrZmxvdycsXG4gICAgICBkYXRhLFxuICAgICAgY29sdW1uczogWydjYXNlX251bWJlcicsICdzdWJqZWN0JywgJ3ByaW9yaXR5JywgJ3NsYV9kdWVfZGF0ZSddLFxuICAgICAga2FuYmFuOiB7XG4gICAgICAgIGdyb3VwQnlGaWVsZDogJ3N0YXR1cycsXG4gICAgICAgIGNvbHVtbnM6IFsnY2FzZV9udW1iZXInLCAnc3ViamVjdCcsICdjcm1fYWNjb3VudCcsICdwcmlvcml0eScsICdvd25lcl9pZCddLFxuICAgICAgfSxcbiAgICAgIGZpbHRlcjogW3sgZmllbGQ6ICdpc19jbG9zZWQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiBmYWxzZSB9XSxcbiAgICAgIG5hdmlnYXRpb246IHsgbW9kZTogJ2RyYXdlcicsIHdpZHRoOiAnNjQwcHgnIH0sXG4gICAgfSxcblxuICAgIC8qKiBTTEEgY2FsZW5kYXIgKi9cbiAgICBzbGFfY2FsZW5kYXI6IHtcbiAgICAgIG5hbWU6ICdzbGFfY2FsZW5kYXInLFxuICAgICAgdHlwZTogJ2NhbGVuZGFyJyxcbiAgICAgIGxhYmVsOiAnU0xBIENhbGVuZGFyJyxcbiAgICAgIGRhdGEsXG4gICAgICBjb2x1bW5zOiBbJ2Nhc2VfbnVtYmVyJywgJ3N1YmplY3QnLCAncHJpb3JpdHknXSxcbiAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnc2xhX2R1ZV9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ3N1YmplY3QnLFxuICAgICAgICBjb2xvckZpZWxkOiAncHJpb3JpdHknLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLyoqIENocm9ub2xvZ2ljYWwgY2FzZSBzdHJlYW0gKi9cbiAgICBjYXNlX3RpbWVsaW5lOiB7XG4gICAgICBuYW1lOiAnY2FzZV90aW1lbGluZScsXG4gICAgICB0eXBlOiAndGltZWxpbmUnLFxuICAgICAgbGFiZWw6ICdDYXNlIFRpbWVsaW5lJyxcbiAgICAgIGRhdGEsXG4gICAgICBjb2x1bW5zOiBbJ2Nhc2VfbnVtYmVyJywgJ3N1YmplY3QnXSxcbiAgICAgIHRpbWVsaW5lOiB7XG4gICAgICAgIC8vIGBjcmVhdGVkX2F0YCwgdGhlIHBsYXRmb3JtJ3Mgb3duIGNyZWF0aW9uIHN0YW1wIFx1MjAxNCB0aGUgb2JqZWN0J3NcbiAgICAgICAgLy8gZHVwbGljYXRlIGBjcmVhdGVkX2RhdGVgIHdhcyByZW1vdmVkIGluICMxOTkyIGJlY2F1c2Ugbm90aGluZyB3cm90ZVxuICAgICAgICAvLyBpdCBvbiBhIHJlYWwgY2FzZSwgc28gZXZlcnkgdXNlci1jcmVhdGVkIGNhc2Ugc3RhcnRlZCBpdHMgYmFyIGF0XG4gICAgICAgIC8vIG51bGwuIFNhbWUgc3BlbGxpbmcgYXMgYGRlYWxfdGltZWxpbmVgIG9uIGNybV9vcHBvcnR1bml0eSAoIzU3NSBCMikuXG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnY3JlYXRlZF9hdCcsXG4gICAgICAgIGVuZERhdGVGaWVsZDogJ2Nsb3NlZF9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ3N1YmplY3QnLFxuICAgICAgICBncm91cEJ5RmllbGQ6ICdvd25lcl9pZCcsXG4gICAgICAgIGNvbG9yRmllbGQ6ICdzdGF0dXMnLFxuICAgICAgICBzY2FsZTogJ2RheScsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWdlbnQncyBwZXJzb25hbCBxdWV1ZTogdGhlIGNhc2VzIHRoZW1zZWx2ZXMsIG9uZSByb3cgZWFjaC4gSXRzXG4gICAgICogYWdncmVnYXRlIGNvdW50ZXJwYXJ0IGlzIHNlcnZpY2VfZGFzaGJvYXJkJ3MgXCJNeSBPcGVuIENhc2VzIGJ5XG4gICAgICogUHJpb3JpdHlcIiAoIzUxMCkgXHUyMDE0IGEgZGFzaGJvYXJkIHdpZGdldCBjb3VudHMsIGl0IGNhbm5vdCBsaXN0LlxuICAgICAqL1xuICAgIG15X29wZW5fY2FzZXM6IHtcbiAgICAgIG5hbWU6ICdteV9vcGVuX2Nhc2VzJyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnTXkgT3BlbiBDYXNlcycsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhLFxuICAgICAgY29sdW1uczogWydjYXNlX251bWJlcicsICdzdWJqZWN0JywgJ2NybV9hY2NvdW50JywgJ3ByaW9yaXR5JywgJ3N0YXR1cycsICdzbGFfZHVlX2RhdGUnXSxcbiAgICAgIC8vIFx1MjZBMFx1RkUwRiBgc3RhdHVzIG5vdF9pbiBDTE9TRURfQ0FTRV9TVEFUVVNFU2AsIE5PVCBgaXNfY2xvc2VkID09IGZhbHNlYDogdGhlXG4gICAgICAvLyBmbGFnIGlzIGRlcml2ZWQgYXMgYGVmZlN0YXR1cyA9PT0gJ2Nsb3NlZCdgIGFuZCBuZXZlciBmbGlwcyBvblxuICAgICAgLy8gYHJlc29sdmVkYCwgc28gdGhlIGZsYWcgc3BlbGxpbmcgbGlzdGVkIGV2ZXJ5IFJFU09MVkVEIGNhc2UgdW5kZXIgYSB0YWJcbiAgICAgIC8vIGxhYmVsbGVkIFwiTXkgT3BlbiBDYXNlc1wiIFx1MjAxNCBtZWFzdXJlZCBvbiB0aGUgc2VlZGVkIGRlbW8gcG9wdWxhdGlvbiwgdGhlXG4gICAgICAvLyBmbGFnIHJldHVybmVkIDMwIG9mIDM4IGNhc2VzIGFuZCA3IG9mIHRob3NlIDMwIHdlcmUgcmVzb2x2ZWQuIEEgcmVzb2x2ZWRcbiAgICAgIC8vIGNhc2UgaXMgZmluaXNoZWQgd29yayBhd2FpdGluZyBjbG9zdXJlLCBub3QgYW4gb3BlbiBxdWV1ZSwgYW5kIHRoZVxuICAgICAgLy8gbWFpbnN0cmVhbSBzZXJ2aWNlLWNsb3VkIHJlYWRpbmcgb2YgXCJvcGVuXCIgZXhjbHVkZXMgaXQgKFplbmRlc2sncyBvcGVuXG4gICAgICAvLyBzZXQgb21pdHMgU29sdmVkOyBTZXJ2aWNlTm93J3MgT09UQiBPcGVuIGZpbHRlciBpc1xuICAgICAgLy8gYHN0YXRlIG5vdCBpbiAoUmVzb2x2ZWQsIENsb3NlZCwgQ2FuY2VsbGVkKWApLiBSdWxlZCAyMDI2LTA4LTMxOyBwaW5uZWQgYnlcbiAgICAgIC8vIGB0ZXN0L2xpdmUtd29yay1wcmVkaWNhdGUtcGFyaXR5LnRlc3QudHNgICgjMTE0NSksIHdob3NlIGNvbnN1bWVyIHJvc3RlclxuICAgICAgLy8gdGhpcyB2aWV3IGpvaW5lZCBpbiB0aGUgc2FtZSBjaGFuZ2UuXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgeyBmaWVsZDogJ293bmVyX2lkJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ3tjdXJyZW50X3VzZXJfaWR9JyB9LFxuICAgICAgICB7IGZpZWxkOiAnc3RhdHVzJywgb3BlcmF0b3I6ICdub3RfaW4nLCB2YWx1ZTogWydyZXNvbHZlZCcsICdjbG9zZWQnXSB9LFxuICAgICAgXSxcbiAgICAgIHNvcnQ6IFtcbiAgICAgICAgeyBmaWVsZDogJ3ByaW9yaXR5X3JhbmsnLCBvcmRlcjogJ2Rlc2MnIH0sXG4gICAgICAgIHsgZmllbGQ6ICdzbGFfZHVlX2RhdGUnLCBvcmRlcjogJ2FzYycgfSxcbiAgICAgIF0sXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVuYXNzaWduZWQgXHUyMDE0IHRyaWFnZSAoIzU5NikuIFRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgcXVldWUgc3Vic3RpdHV0ZS5cbiAgICAgKlxuICAgICAqIGBjYXNlX2F1dG9fYXNzaWduYCAoYHNyYy9zZXJ2aWNlL29iamVjdHMvX2Nhc2UtYXNzaWdubWVudC50c2ApIGlzIGEgTk8tT1Agd2hlbmV2ZXJcbiAgICAgKiB0aGUgYHNlcnZpY2VfYWdlbnRgIHBvb2wgaXMgZW1wdHksIGFuZCBhbiBlbXB0eSBwb29sIGlzIHRoZSBGSVJTVC1JTlNUQUxMXG4gICAgICogTk9STSByYXRoZXIgdGhhbiBhbiBlZGdlIGNhc2U6IGBzeXNfdXNlcl9wb3NpdGlvbmAgbWVtYmVyc2hpcCBpcyBydW50aW1lXG4gICAgICogZGF0YSwgc28gb24gYSBmcmVzaCBvcmcgXHUyMDE0IGFuZCBhbnkgdGltZSBldmVyeSBhZ2VudCBoYXMgYmVlbiB1bmFzc2lnbmVkXG4gICAgICogZnJvbSB0aGUgcG9zaXRpb24gXHUyMDE0IGFuIGluYm91bmQgd2ViLXRvLWNhc2UgbGFuZHMgb3duZXJsZXNzLiBCZXN0LWVmZm9ydFxuICAgICAqIGFzc2lnbm1lbnQgYWxzbyBzdGFuZHMgZG93biBvbiBhIHBlcm1pc3Npb24gZGVuaWFsICh0aGUgYW5vbnltb3VzXG4gICAgICogcHVibGljLWZvcm0gY29udGV4dCBjYW5ub3QgcmVhZCBgc3lzX3VzZXJfcG9zaXRpb25gIGF0IGFsbCkuXG4gICAgICpcbiAgICAgKiBUaG9zZSBjYXNlcyB1c2VkIHRvIGJlIGludmlzaWJsZTogbm8gdmlldyBmaWx0ZXJlZCBvbiB0aGUgYWJzZW5jZSBvZiBhblxuICAgICAqIG93bmVyLCBzbyBhbiB1bm93bmVkIGNhc2UgYXBwZWFyZWQgaW4gYEFsbCBDYXNlc2Agd2l0aCBhIGJsYW5rIE93bmVyXG4gICAgICogY29sdW1uIGFuZCBub3RoaW5nIGRpc3Rpbmd1aXNoZWQgaXQgZnJvbSB0aGUgcmVzdC4gVGhpcyB2aWV3IGlzIHRoZVxuICAgICAqIHN0YW5kaW5nIGFuc3dlciBcdTIwMTQgc2lsZW5jZSByZXBsYWNlZCBieSBhIHBpbm5lZCB0YWIgd2hvc2Ugcm93IGNvdW50IElTIHRoZVxuICAgICAqIGludGFrZSBiYWNrbG9nLlxuICAgICAqXG4gICAgICogYGlzX251bGxgIG9uIGBvd25lcl9pZGAsIG5vdCBgZXF1YWxzOiBudWxsYDogdGhlIG93bmVybGVzcyBzaGFwZSBpcyBhblxuICAgICAqIEFCU0VOVCBjb2x1bW4gb24gZHJpdmVyLW1lbW9yeSAoc2VlIHRoZSB0b3RhbGl0eSBub3RlIGluXG4gICAgICogYGNhc2UtZXNjYWxhdGlvbi5mbG93LnRzYCwgd2hlcmUgYHJlY29yZC5lc2NhbGF0ZWRfZGF0ZSA9PSBudWxsYCBhYm9ydGVkXG4gICAgICogd2l0aCBgTm8gc3VjaCBrZXlgKSBhcyB3ZWxsIGFzIGEgTlVMTCBvbmUgb24gU1FMLCBhbmQgb25seSB0aGUgb3BlcmF0b3JcbiAgICAgKiBmb3JtIGFuc3dlcnMgdGhlIHNhbWUgd2F5IGZvciBib3RoLlxuICAgICAqXG4gICAgICogVGhlIHByZWRpY2F0ZSBmb3IgXCJubyBsb25nZXIgbGl2ZSB3b3JrXCIgaXMgYHN0YXR1cyBub3RfaW4gWydyZXNvbHZlZCcsXG4gICAgICogJ2Nsb3NlZCddYCwgTk9UIGBpc19jbG9zZWQgPT0gZmFsc2VgLiBgaXNfY2xvc2VkYCBpcyBkZXJpdmVkIGJ5XG4gICAgICogYGNhc2Vfc2xhX2RlZmF1bHRzYCBhcyBgZWZmU3RhdHVzID09PSAnY2xvc2VkJ2AsIHNvIGl0IG5ldmVyIGZsaXBzIG9uXG4gICAgICogYHJlc29sdmVkYCBcdTIwMTQgYW5kIGEgcmVzb2x2ZWQgb3duZXJsZXNzIGNhc2Ugc2F0aXNmaWVkIGJvdGggb2YgdGhpcyB2aWV3J3NcbiAgICAgKiBvbGQgZmlsdGVycyBhbmQgc2F0IGhlcmUgZm9yZXZlciwgd2hpY2ggaXMgbmVpdGhlciBcImFycml2ZXMgd2l0aCBub1xuICAgICAqIG93bmVyXCIgbm9yIFwid29yayB3YWl0aW5nIGZvciBhIGh1bWFuXCIuIGBub3RfaW5gIGxvd2VycyB0byB0aGUgYCRuaW5gIHRoZVxuICAgICAqIGxvYWQtYmFsYW5jaW5nIGhvb2tzIGFuZCBgY2FzZV9zbGFfbW9uaXRvcmAgYWxyZWFkeSB1c2UgZm9yIHRoZSBzYW1lXG4gICAgICogY29uY2VwdCwgc28gdGhlIGZvdXIgY29uc3VtZXJzIG5vdyBzdGF0ZSBvbmUgcHJlZGljYXRlOyB0aGUgcm9zdGVyIHRoYXRcbiAgICAgKiBob2xkcyB0aGVtIHRvZ2V0aGVyIGJ5IE5BTUUgaXMgYHRlc3QvbGl2ZS13b3JrLXByZWRpY2F0ZS1wYXJpdHkudGVzdC50c2AuXG4gICAgICogYGNsb3NlZGAgc3RheXMgZXhjbHVkZWQgZm9yIHRoZSByZWFzb24gaXQgYWx3YXlzIHdhczogaGlzdG9yeSwgbm90XG4gICAgICogYmFja2xvZy5cbiAgICAgKlxuICAgICAqIFx1MjZBMFx1RkUwRiBXSE8gQUNUVUFMTFkgU0VFUyBST1dTIEhFUkUgaXMgZGVjaWRlZCBieSByZWNvcmQtbGV2ZWwgYWNjZXNzLCBub3QgYnlcbiAgICAgKiB0aGlzIHZpZXcsIGFuZCB0aGUgYW5zd2VyIHRvZGF5IGlzIG5hcnJvd2VyIHRoYW4gdGhlIHRhYiBzdWdnZXN0cy4gQVxuICAgICAqIHZpZXcgdGFiIGNhcnJpZXMgbm8gcm9sZSBzY29waW5nIFx1MjAxNCBgVmlld1RhYlNjaGVtYWAgaGFzIGBwaW5uZWRgLFxuICAgICAqIGBpc0RlZmF1bHRgIGFuZCBhIGJvb2xlYW4gYHZpc2libGVgLCBhbmQgbm90aGluZyBwZXItcHJvZmlsZSBcdTIwMTQgc28gdGhpcyBpc1xuICAgICAqIHBpbm5lZCBmb3IgZXZlcnlvbmUgd2hvIGNhbiBvcGVuIENhc2VzLCB3aGlsZSB0aGUgUk9XUyByZXNvbHZlIHBlclxuICAgICAqIHByb2ZpbGU6XG4gICAgICpcbiAgICAgKiAgIC0gYHN5c3RlbV9hZG1pbmAgXHUyMDE0IGB2aWV3QWxsUmVjb3Jkc2AsIHNvIHRoZSBmdWxsIGJhY2tsb2cuIFRoaXMgaXMgdGhlXG4gICAgICogICAgIHBlcnNvbmEgdGhlIGVtcHR5LXBvb2wgc3RhdGUgaXMgRk9SOiBhbiBlbXB0eSBgc2VydmljZV9hZ2VudGAgcG9vbCBpc1xuICAgICAqICAgICBmaXhlZCBieSBzdGFmZmluZyBgc3lzX3VzZXJfcG9zaXRpb25gLCB3aGljaCBvbmx5IGFuIGFkbWluIGNhbiBkby5cbiAgICAgKiAgIC0gYHNhbGVzX21hbmFnZXJgIFx1MjAxNCBgdmlld0FsbFJlY29yZHNgLCByZWFkLW9ubHkuXG4gICAgICogICAtIGEgc2VydmljZSBtYW5hZ2VyIC8gZGlyZWN0b3IgXHUyMDE0IHRoZSBjcml0aWNhbCwgb3BlbiBzbGljZSBvbmx5LCB2aWEgdGhlXG4gICAgICogICAgIGV4aXN0aW5nIGBjYXNlX2VzY2FsYXRpb25fc2hhcmluZ2AgLyBgY2FzZV9kaXJlY3Rvcl9zaGFyaW5nYCBjcml0ZXJpYVxuICAgICAqICAgICBydWxlcyAoYHNyYy9zZXJ2aWNlL3NoYXJpbmcvY2FzZS5zaGFyaW5nLnRzYCkuXG4gICAgICogICAtIGBzZXJ2aWNlX2FnZW50YCBcdTIwMTQgYHJlYWRTY29wZTogJ293bidgIG9uIGBjcm1fY2FzZWAsIGFuZCBhbiB1bm93bmVkXG4gICAgICogICAgIHJvdyBpcyBvd25lZCBieSBub2JvZHksIHNvICoqYW4gYWdlbnQncyB0cmlhZ2UgdGFiIGlzIGVtcHR5KiouXG4gICAgICpcbiAgICAgKiBUaGUgbGFzdCBsaW5lIGlzIGEgcmVhbCBnYXAgZm9yIHRoZSBcImFnZW50IHB1bGxzIGZyb20gdGhlIHF1ZXVlXCIgc3RvcnlcbiAgICAgKiBhbmQgaXMgZGVsaWJlcmF0ZWx5IE5PVCBjbG9zZWQgaGVyZTogZ3JhbnRpbmcgc2VydmljZSByb2xlcyBzaWdodCBvZlxuICAgICAqIHVub3duZWQgY2FzZXMgaXMgYSBzaGFyaW5nLW1vZGVsIGNoYW5nZSAoYSBuZXcgY3JpdGVyaWEgcnVsZSwgb3IgYVxuICAgICAqIGByZWFkU2NvcGVgIHdpZGVuaW5nKSwgd2hpY2ggaXMgb3V0c2lkZSB0aGlzIGNhcmQncyBmaWxlIHN1cmZhY2UgYW5kIGlzXG4gICAgICogZXhhY3RseSB0aGUga2luZCBvZiBxdWlldCBwZXJtaXNzaW9uIHdpZGVuaW5nIHRoZSAjNTk2IHJ1bGluZyBydWxlcyBvdXQuXG4gICAgICogRmlsZWQgYXMgIzEwOTYgZm9yIGEgZGVjaXNpb24sIHdpdGggdGhlIHJlYWNoIHRhYmxlIGFib3ZlIGFuZCB0aGUgdGhyZWVcbiAgICAgKiBvcHRpb25zIHByaWNlZC5cbiAgICAgKi9cbiAgICB1bmFzc2lnbmVkX3RyaWFnZToge1xuICAgICAgbmFtZTogJ3VuYXNzaWduZWRfdHJpYWdlJyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnVW5hc3NpZ25lZCBcdTIwMTQgdHJpYWdlJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGEsXG4gICAgICBjb2x1bW5zOiBbJ2Nhc2VfbnVtYmVyJywgJ3N1YmplY3QnLCAnY3JtX2FjY291bnQnLCAnY3JtX2NvbnRhY3QnLCAncHJpb3JpdHknLCAnc3RhdHVzJywgJ29yaWdpbicsICdzbGFfZHVlX2RhdGUnXSxcbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAnb3duZXJfaWQnLCBvcGVyYXRvcjogJ2lzX251bGwnIH0sXG4gICAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCBvcGVyYXRvcjogJ25vdF9pbicsIHZhbHVlOiBbJ3Jlc29sdmVkJywgJ2Nsb3NlZCddIH0sXG4gICAgICBdLFxuICAgICAgLy8gU2FtZSBvcmRlcmluZyBhcyB0aGUgbWFpbiBxdWV1ZTogdXJnZW5jeSBmaXJzdCAob24gdGhlIG1hdGVyaWFsaXNlZFxuICAgICAgLy8gb3JkaW5hbCwgbmV2ZXIgdGhlIHJhdyBzZWxlY3QpLCB0aGVuIHNvb25lc3QgZGVhZGxpbmUuXG4gICAgICBzb3J0OiBbXG4gICAgICAgIHsgZmllbGQ6ICdwcmlvcml0eV9yYW5rJywgb3JkZXI6ICdkZXNjJyB9LFxuICAgICAgICB7IGZpZWxkOiAnc2xhX2R1ZV9kYXRlJywgb3JkZXI6ICdhc2MnIH0sXG4gICAgICBdLFxuICAgICAgcm93Q29sb3I6IHtcbiAgICAgICAgZmllbGQ6ICdwcmlvcml0eScsXG4gICAgICAgIGNvbG9yczogeyBjcml0aWNhbDogJ3JlZCcsIGhpZ2g6ICdvcmFuZ2UnLCBtZWRpdW06ICd5ZWxsb3cnLCBsb3c6ICdzbGF0ZScgfSxcbiAgICAgIH0sXG4gICAgICAvLyBUaGUgZW1wdHkgc3RhdGUgY2FycmllcyB0aGUgb3BlcmF0aW9uYWwgaW5zdHJ1Y3Rpb24sIGJlY2F1c2UgXCJubyByb3dzXCJcbiAgICAgIC8vIGhlcmUgaXMgYW1iaWd1b3VzIG9uIGl0cyBvd246IGl0IG1lYW5zIGVpdGhlciBcInRoZSByb3VuZC1yb2JpbiBwbGFjZWRcbiAgICAgIC8vIGV2ZXJ5dGhpbmdcIiAoZ29vZCkgb3IgXCJubyBjYXNlIGhhcyBhcnJpdmVkIHlldFwiIChhbHNvIGZpbmUpIFx1MjAxNCBhbmQgdGhlXG4gICAgICAvLyByZWFkZXIgbW9zdCBsaWtlbHkgdG8gYmUgbG9va2luZyBpcyBzb21lb25lIHdobyBqdXN0IGZvdW5kIHRoZSB0YWJcbiAgICAgIC8vIGZ1bGwgYW5kIG5lZWRzIHRvIGtub3cgd2h5LlxuICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICB0aXRsZTogJ05vdGhpbmcgd2FpdGluZyBmb3IgdHJpYWdlJyxcbiAgICAgICAgbWVzc2FnZTogJ0V2ZXJ5IGNhc2UgaGFzIGFuIG93bmVyLiBDYXNlcyBhcHBlYXIgaGVyZSB3aGVuIHRoZXkgYXJyaXZlIHdpdGggbm8gb3duZXIgXHUyMDE0IHR5cGljYWxseSBhIHdlYi10by1jYXNlIHN1Ym1pc3Npb24gdGhhdCBhcnJpdmVkIHdoaWxlIG5vYm9keSBoZWxkIHRoZSBTZXJ2aWNlIEFnZW50IHBvc2l0aW9uLicsXG4gICAgICAgIGljb246ICdpbmJveCcsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBlc2NhbGF0ZWRfY2FzZXM6IHtcbiAgICAgIG5hbWU6ICdlc2NhbGF0ZWRfY2FzZXMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdFc2NhbGF0ZWQgQ2FzZXMnLFxuICAgICAgdXNlckFjdGlvbnM6IHsgZWRpdElubGluZTogdHJ1ZSB9LFxuICAgICAgZGF0YSxcbiAgICAgIGNvbHVtbnM6IFsnY2FzZV9udW1iZXInLCAnc3ViamVjdCcsICdjcm1fYWNjb3VudCcsICdwcmlvcml0eScsICdzbGFfZHVlX2RhdGUnLCAnb3duZXJfaWQnXSxcbiAgICAgIGZpbHRlcjogW3sgZmllbGQ6ICdpc19lc2NhbGF0ZWQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiB0cnVlIH1dLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICdwcmlvcml0eV9yYW5rJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU0xBLWF0LXJpc2s6IG9wZW4gY2FzZXMgYXQgSGlnaCBvciBDcml0aWNhbCBwcmlvcml0eSBuZWVkaW5nIGF0dGVudGlvbi5cbiAgICAgKlxuICAgICAqIFx1MjZBMFx1RkUwRiBOYW1lcyB3aGF0IHRoZSBmaWx0ZXIgYmVsb3cgYWN0dWFsbHkgc2VsZWN0cy4gVGhpcyByZWFkXG4gICAgICogXCJoaWdoL3VyZ2VudFwiIHVudGlsICMxMzMzIFx1MjAxNCBidXQgYGNybV9jYXNlLnByaW9yaXR5YCBpc1xuICAgICAqIGxvdy9tZWRpdW0vaGlnaC9jcml0aWNhbCAoYGNhc2Uub2JqZWN0LnRzOjEzOC0xNDJgKSBhbmQgaGFzIE5PIGB1cmdlbnRgO1xuICAgICAqIHRoYXQgdmFsdWUgYmVsb25ncyB0byBgY3JtX3Rhc2tgLiBUaGUgbWlycm9yLWltYWdlIGNyb3NzaW5nIGFscmVhZHlcbiAgICAgKiBzaGlwcGVkIGEgcmVhbCBkZWZlY3Qgb25jZSAoYHRhc2sudmlldy50czozNWAgXHUyMDE0IENhc2UgY29sb3VyIGtleXMgb24gdGhlXG4gICAgICogdGFzayB2aWV3IGxlZnQgZXZlcnkgdXJnZW50IGFuZCBub3JtYWwgcm93IHVuY29sb3VyZWQpLCBhbmQgdGhlXG4gICAgICogZGlyZWN0aW9uIHRoYXQgY29zdCBzb21ldGhpbmcgd2FzIHRoZSBvbmUgd2hlcmUgdGhlIGNvbW1lbnQgd2FzXG4gICAgICogYmVsaWV2ZWQuIFR3byBvdmVybGFwcGluZy1idXQtdW5lcXVhbCB2b2NhYnVsYXJpZXM6IGtlZXAgdGhlbSBhcGFydC5cbiAgICAgKi9cbiAgICBzbGFfYXRfcmlzazoge1xuICAgICAgbmFtZTogJ3NsYV9hdF9yaXNrJyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnXHUyM0YwIFNMQSBhdCBSaXNrJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGEsXG4gICAgICBjb2x1bW5zOiBbJ2Nhc2VfbnVtYmVyJywgJ3N1YmplY3QnLCAnY3JtX2FjY291bnQnLCAncHJpb3JpdHknLCAnc2xhX2R1ZV9kYXRlJywgJ293bmVyX2lkJ10sXG4gICAgICAvLyBPcGVyYXRvci1vbmx5IGZpbHRlciBcdTIwMTQgc29ydCBieSBTTEEgZHVlIGRhdGUgYXNjZW5kaW5nIHNvIHRoZSBzb29uZXN0XG4gICAgICAvLyBzdXJmYWNlIGZpcnN0LiAoVGhlIHZpZXcgcnVudGltZSBkb2VzIG5vdCBpbnRlcnBvbGF0ZSBge05PVygpICsgNGh9YC4pXG4gICAgICAvL1xuICAgICAgLy8gXHUyNkEwXHVGRTBGIGBzdGF0dXMgbm90X2luIENMT1NFRF9DQVNFX1NUQVRVU0VTYCwgTk9UIGBpc19jbG9zZWQgPT0gZmFsc2VgOiB0aGVcbiAgICAgIC8vIGZsYWcgaXMgZGVyaXZlZCBhcyBgZWZmU3RhdHVzID09PSAnY2xvc2VkJ2AgYW5kIG5ldmVyIGZsaXBzIG9uXG4gICAgICAvLyBgcmVzb2x2ZWRgLCBzbyB0aGUgZmxhZyBzcGVsbGluZyBsaXN0ZWQgcmVzb2x2ZWQgY2FzZXMgYXMgYXQgcmlzayB3aGlsZVxuICAgICAgLy8gYGNhc2Vfc2xhX21vbml0b3JgIFx1MjAxNCB0aGUgYXV0b21hdGlvbiB0aGF0IE9XTlMgU0xBIFx1MjAxNCBoYWQgYWxyZWFkeVxuICAgICAgLy8gZXhjbHVkZWQgdGhlbSAoYHN0YXR1czogeyAkbmluOiBbJ3Jlc29sdmVkJywgJ2Nsb3NlZCddIH1gKS4gVGhlIHRhYiBhXG4gICAgICAvLyBodW1hbiByZWFkcyBhbmQgdGhlIHN3ZWVwIHRoYXQgYWN0cyBtdXN0IGFuc3dlciB0aGlzIG9uZSBxdWVzdGlvbiB0aGVcbiAgICAgIC8vIHNhbWUgd2F5LiBQaW5uZWQgYnkgYHRlc3QvbGl2ZS13b3JrLXByZWRpY2F0ZS1wYXJpdHkudGVzdC50c2AgKCMxMTQ1KS5cbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAnc3RhdHVzJywgb3BlcmF0b3I6ICdub3RfaW4nLCB2YWx1ZTogWydyZXNvbHZlZCcsICdjbG9zZWQnXSB9LFxuICAgICAgICB7IGZpZWxkOiAncHJpb3JpdHknLCBvcGVyYXRvcjogJ2luJywgdmFsdWU6IFsnaGlnaCcsICdjcml0aWNhbCddIH0sXG4gICAgICBdLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICdzbGFfZHVlX2RhdGUnLCBvcmRlcjogJ2FzYycgfV0sXG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogVGhlIHJlY29yZCBmb3JtIFx1MjAxNCBhbmQsIGJlY2F1c2UgdGhlIHBsYXRmb3JtIGhhcyBPTkUsIHRoZSBDUkVBVEUgZm9ybSB0b28uXG4gICAqXG4gICAqICMjIFx1MjZBMFx1RkUwRiBUaGlzIG9iamVjdCdzIGBmb3JtYCBJUyB0aGUgY3JlYXRlIGRpYWxvZyAoIzEyMTQgaXRlbSAzKVxuICAgKlxuICAgKiBNZWFzdXJlZCBhZ2FpbnN0IHRoZSBjb25zb2xlIHRoaXMgYXBwIHNoaXBwZWQgYXQgdGhhdCB0YWtpbmdcbiAgICogKGBAb2JqZWN0c3RhY2svY29uc29sZWAgMTcuMS4wLCBgZGlzdC9hc3NldHMvYDsgdGhpcyBidW5kbGUgcmVhZCB3YXMgXHUyNkQ0IE5PVFxuICAgKiByZS10YWtlbiBvbiBhbnkgbGF0ZXIgcGluKSwgQk9USFxuICAgKiBlbnRyeSBwb2ludHMgdGhhdCBvcGVuIGEgY2FzZSBmb3JtIHJlc29sdmVcbiAgICogaXQgdGhlIHNhbWUgd2F5IGFuZCBuZWl0aGVyIHRha2VzIGEgY3JlYXRlL2VkaXQgYXJndW1lbnQ6XG4gICAqXG4gICAqICAgUmVjb3JkRm9ybVBhZ2UgKGAve29iamVjdH0vbmV3YCwgYC97b2JqZWN0fS9yZWNvcmQve2lkfS9lZGl0YClcbiAgICogICAgICAgdmlldy5mb3JtID8/IHZpZXcuZm9ybVZpZXdzPy5kZWZhdWx0XG4gICAqICAgdXNlQWN0aW9uTW9kYWwgKHRoZSBgKyBOZXdgIG1vZGFsIG9mZiBhIGxpc3QgdmlldylcbiAgICogICAgICAgdmlldy5mb3JtID8/IHZpZXcuZm9ybVZpZXdzPy5kZWZhdWx0XG4gICAqXG4gICAqIFx1MjFEMiBUaGVyZSBpcyBubyBjcmVhdGUtb25seSBmb3JtIHRvIGF1dGhvci4gYExpc3RWaWV3U2NoZW1hLmFkZFJlY29yZGBcbiAgICogY2FycmllcyBhIGBmb3JtVmlld2Aga2V5IGluIGBAb2JqZWN0c3RhY2svc3BlY2AsIGJ1dCBOTyBjb25zb2xlIGNvZGUgcGF0aFxuICAgKiByZWFkcyBpdCAodGhlIHN0cmluZyBhcHBlYXJzIG9ubHkgaW4gdGhlIHZpZXcgZGVzaWduZXIncyBvd24gaTE4biB0YWJsZSksXG4gICAqIHNvIHBvaW50aW5nIGl0IGF0IGEgc2Vjb25kIGZvcm0gdmlldyB3b3VsZCBzaGlwIGFuIEFEUi0wMDQ5XG4gICAqIGRlY2xhcmVkLWJ1dC11bmVuZm9yY2VkIHNoYXBlIGFuZCBjaGFuZ2Ugbm90aGluZyBvbiBzY3JlZW4uXG4gICAqXG4gICAqIFx1MjFEMiBUaGVyZWZvcmUgdGhlIGNyZWF0ZS1zYWZlIGZpZWxkIHNldCBoYXMgdG8gQkUgdGhpcyBmb3JtJ3MgZmllbGQgc2V0LlxuICAgKiBUaGF0IGlzIHdoeSB0aGUgU0xBIGFuZCBSZXNvbHV0aW9uIHNlY3Rpb25zIGFyZSBnb25lIHJhdGhlciB0aGFuIGdhdGVkLlxuICAgKlxuICAgKiAjIyBcdTI2RDQgV2h5IHRoZSB0YWIgc3RyaXAgd2FzIG5vdCB0aGUgb2JqZWN0J3MgYGZpZWxkR3JvdXBzYFxuICAgKlxuICAgKiBgY3JtX2Nhc2UuZmllbGRHcm91cHNgIGRlY2xhcmVzIFNJWCBncm91cHMgKENhc2UgSW5mb3JtYXRpb24gLyBPcmlnaW4gJlxuICAgKiBSb3V0aW5nIC8gU0xBICYgUHJpb3JpdHkgLyBSZXNvbHV0aW9uIC8gRXNjYWxhdGlvbiAvIFN5c3RlbSkgYW5kIHRoZVxuICAgKiBkaWFsb2cgc2hvd2VkIFRIUkVFIHRhYnMgXHUyMDE0IHRoZXNlIHNlY3Rpb25zLiBUaGUgcmVuZGVyZXIgb25seSByZWFjaGVzIGZvclxuICAgKiBgZmllbGRHcm91cHNgIG9uIGl0cyBBVVRPLURFUklWRUQgcGF0aCwgdGFrZW4gd2hlbiBhIGZvcm0gYXV0aG9ycyBub1xuICAgKiBgc2VjdGlvbnNgIGF0IGFsbDsgYW4gYXV0aG9yZWQgYHNlY3Rpb25zYCBhcnJheSB3aW5zIG91dHJpZ2h0LiBTb1xuICAgKiBgc3JjL3NlcnZpY2Uvb2JqZWN0cy9jYXNlLm9iamVjdC50c2AgaXMgbm90IHBhcnQgb2YgdGhpcyBzdXJmYWNlLlxuICAgKlxuICAgKiAjIyBcdTI2QTBcdUZFMEYgQXV0aG9yaW5nIGBzZWN0aW9uc2AgT1BUUyBPVVQgb2YgdGhlIGNyZWF0ZS1tb2RlIGZpZWxkIHN0cmlwXG4gICAqXG4gICAqIFRoYXQgYXV0by1kZXJpdmVkIHBhdGggYWxzbyBydW5zIHR3byBmaWx0ZXJzIHRoZSBhdXRob3JlZCBwYXRoIG5ldmVyIHNlZXNcbiAgICogKGBwbHVnaW4tZm9ybWA6IGBRZWAgXHUyMTkyIGBxZWAgZHJvcHMgYHJlYWRvbmx5YC9gaGlkZGVuYCBmaWVsZHMsIGFuZCBvblxuICAgKiBgbW9kZSA9PT0gJ2NyZWF0ZSdgIGBKZWAgYWRkaXRpb25hbGx5IGRyb3BzIGZvcm11bGEgLyBzdW1tYXJ5IC8gYXV0b251bWJlclxuICAgKiBmaWVsZHMpLiBBbiBhdXRob3JlZCBzZWN0aW9uIHJlbmRlcnMgaXRzIGxpc3QgVkVSQkFUSU0uIFRoYXQgaXMgdGhlIHdob2xlXG4gICAqIG1lY2hhbmlzbSBiZWhpbmQgdGhpcyBkZWZlY3Q6IHRoZSBwbGF0Zm9ybSB3b3VsZCBoYXZlIGhpZGRlblxuICAgKiBgY3JlYXRlZF9kYXRlYCAocmV0aXJlZCBpbiAjMTk5MiksIGBjbG9zZWRfZGF0ZWAsIGByZXNvbHV0aW9uX3RpbWVfaG91cnNgXG4gICAqIGFuZCBgaXNfY2xvc2VkYCBmcm9tIGEgY3JlYXRvciBieSBpdHNlbGYsIGFuZCBuYW1pbmcgdGhlbSBpbiBhIHNlY3Rpb24gcHV0XG4gICAqIHRoZW0gYmFjay5cbiAgICpcbiAgICogIyMgXHUyNkQ0IFdoeSBub3QgZ2F0ZSB0aGUgb2xkIHNlY3Rpb25zIG9uIGEgcHJlZGljYXRlIGluc3RlYWRcbiAgICpcbiAgICogQSBzZWN0aW9uLWxldmVsIGB2aXNpYmxlV2hlbmAgaXMgcGFyc2VkIGJ5IGBGb3JtU2VjdGlvblNjaGVtYWAgYW5kIHJlYWQgYnlcbiAgICogTk9USElORyBpbiB0aGUgZm9ybSByZW5kZXJlciAob25seSBGSUVMRC1sZXZlbCBgdmlzaWJsZVdoZW5gIGlzXG4gICAqIGV2YWx1YXRlZCksIHNvIGl0IHdvdWxkIGhpZGUgbm90aGluZy4gQW5kIGZpZWxkLWxldmVsIHByZWRpY2F0ZSBldmFsdWF0aW9uXG4gICAqIEZBSUxTIE9QRU4gXHUyMDE0IGFuIHVuZXZhbHVhYmxlIHByZWRpY2F0ZSByZW5kZXJzIHRoZSBmaWVsZCB2aXNpYmxlLCB3aXRoIG5vXG4gICAqIGRpYWdub3N0aWMgKHRoZSBob3VzZSBydWxlIGF0IHRoZSB0b3Agb2YgYGxlYWQudmlldy50c2AsIHVwc3RyZWFtXG4gICAqIG9iamVjdHN0YWNrLWFpL29iamVjdHN0YWNrIzUxNDkpLiBBIGdhdGUgdGhhdCBmYWlscyBvcGVuIGlzIG5vdCBhIGdhdGUgZm9yXG4gICAqIGEgZGF0YS1pbnRlZ3JpdHkgY29udHJvbCwgd2hpY2ggaXMgd2hhdCB0aGlzIG9uZSBpcy5cbiAgICpcbiAgICogIyMgV2hhdCBhIGNyZWF0b3IgbWF5IGF1dGhvciBoZXJlLCBhbmQgd2h5IHRoZSByZXN0IGxlZnRcbiAgICpcbiAgICogRXZlcnl0aGluZyBiZWxvdyBpcyBhIGZhY3QgdGhlIHBlcnNvbiByYWlzaW5nIHRoZSBjYXNlIEhBUyBhdCBpbnRha2UuXG4gICAqIGBjYXNlX251bWJlcmAgc3RheXMgYmVjYXVzZSBpdCBpcyBgcmVhZG9ubHk6IHRydWVgIG9uIHRoZSBvYmplY3QsIHNvIHRoZVxuICAgKiByZW5kZXJlciBkaXNhYmxlcyBpdCBcdTIwMTQgaXQgaXMgc2hvd24sIG5ldmVyIGF1dGhvcmVkLlxuICAgKlxuICAgKiBUaGUgcmVtb3ZlZCBmaWVsZHMgYXJlIGFsbCB3cml0dGVuIGJ5IHRoZSBsaWZlY3ljbGUsIGFuZCBldmVyeSBvbmUgb2YgdGhlbVxuICAgKiBzdGlsbCBoYXMgdGhlIHN1cmZhY2UgaXQgYmVsb25ncyBvbiAocGlubmVkIGluXG4gICAqIGB0ZXN0L2Nhc2UtY3JlYXRlLWZvcm0tbmFycm93aW5nLnRlc3QudHNgLCBib3RoIGRpcmVjdGlvbnMpOlxuICAgKlxuICAgKiAgIGNsb3NlZF9kYXRlICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OyBgY2FzZV90aW1lbGluZWAgZW5kXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0cyBzdGFydCBpcyB0aGUgcGxhdGZvcm0nc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBjcmVhdGVkX2F0YDsgYGNyZWF0ZWRfZGF0ZWAgd2FzXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0aXJlZCBpbiAjMTk5MilcbiAgICogICBzbGFfZHVlX2RhdGUgICAgICAgICAgICAgICAgICAgICBgY2FzZS5ob29rLnRzYCBzdGFtcHMgaXQgZnJvbSB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSBcdTAwRDcgdGllciBtYXRyaXg7IGxpc3QgY29sdW1uLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQga2V5LCBgc2xhX2NhbGVuZGFyLnN0YXJ0RGF0ZUZpZWxkYCxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWwtcGFnZSBoaWdobGlnaHRzXG4gICAqICAgZmlyc3RfcmVzcG9uc2VfZGF0ZSAgICAgICAgICAgICAgYGV2ZW50Lmhvb2sudHNgIGlzIGl0cyBTSU5HTEUgd3JpdGVyXG4gICAqICAgcmVzb2x1dGlvbl90aW1lX2hvdXJzICAgICAgICAgICAgcmVhZG9ubHk7IGRlcml2ZWQgYXQgY2xvc2U7IGRldGFpbCBwYWdlXG4gICAqICAgaXNfc2xhX3Zpb2xhdGVkICAgICAgICAgICAgICAgICAgbGlzdCBjb2x1bW4gKyBkZXRhaWwtcGFnZSBoaWdobGlnaHRzXG4gICAqICAgaXNfZXNjYWxhdGVkLCBlc2NhbGF0aW9uX3JlYXNvbiAgd3JpdHRlbiBieSBgY2FzZV9lc2NhbGF0aW9uYCAvXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGNhc2Vfc2xhX21vbml0b3JgIC8gYGVzY2FsYXRlX2Nhc2VgO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbCBwYWdlJ3MgU3RhdHVzICYgU0xBIHNlY3Rpb25cbiAgICogICByZXNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWwgcGFnZSdzIERlc2NyaXB0aW9uIHNlY3Rpb25cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlIGByZXNvbHV0aW9uX3JlcXVpcmVkX29uX2Nsb3NlYFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb24gc3RpbGwgaGFzIGl0cyBzdXJmYWNlKVxuICAgKiAgIGlzX2Nsb3NlZCAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OyBkZXJpdmVkIGZyb20gYHN0YXR1c2BcbiAgICpcbiAgICogXHUyNkEwXHVGRTBGIGBpbnRlcm5hbF9ub3Rlc2AsIGBjdXN0b21lcl9yYXRpbmdgIGFuZCBgY3VzdG9tZXJfZmVlZGJhY2tgIGxlZnQgd2l0aFxuICAgKiB0aGUgUmVzb2x1dGlvbiBzZWN0aW9uIGFuZCBoYWQgTk8gb3RoZXIgYXV0aG9yaW5nIHN1cmZhY2UgYXQgYWxsLiAjMTQyOFxuICAgKiBzZXR0bGVkIGJvdGggaGFsdmVzIG9mIHRoYXQsIGFuZCBuZWl0aGVyIGFuc3dlciB3YXMgXCJwdXQgdGhlbSBiYWNrIGhlcmVcIjpcbiAgICpcbiAgICogICBpbnRlcm5hbF9ub3RlcyAgICAgICAgICAgICAgICAgICBgY2FzZV9kZXRhaWwucGFnZS50c2AncyBEZXNjcmlwdGlvblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIGF1dGhvcmVkIGJ5IGlubGluZSBlZGl0IFx1MjAxNFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWZmIHByb3NlIGFuIGFnZW50IHdyaXRlcyB3aGlsZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUktJTkcgYSBjYXNlLCB3aGljaCBpcyB3aHkgaXQgZGlkIG5vdFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWUgYmFjayB0byB0aGlzIGZvcm0uIFRoZSBndWVzdFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaCBvZiBgY2FzZS5ob29rLnRzYCBudWxscyB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gb24gYW5vbnltb3VzIGludGFrZSwgc28gYW5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRha2Ugc3VyZmFjZSBmb3IgaXQgd291bGQgYmUgYVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UgZm9yIGEgdmFsdWUgdGhlIGFwcCBkaXNjYXJkcy5cbiAgICpcbiAgICogICBjdXN0b21lcl9yYXRpbmcsICAgICAgICAgICAgICAgICBSRVRJUkVEIHVuZGVyIEFEUi0wMDQ5IGVuZm9yY2Utb3ItcmVtb3ZlXG4gICAqICAgY3VzdG9tZXJfZmVlZGJhY2sgICAgICAgICAgICAgICAgKG1haW50YWluZXIgcnVsaW5nLCBkZWNpc2lvbiBiYXRjaCAjMjEsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAyNi0wOS0wMykuIE5laXRoZXIgY29sdW1uIGV4aXN0cyBvblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBjcm1fY2FzZWAgYW55IG1vcmUsIHNvIHRoZXJlIGlzIG5vdGhpbmdcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlIHRvIG9taXQgYW5kIG5vdGhpbmcgYW55d2hlcmUgdG9cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3IuXG4gICAqXG4gICAqIFx1MjZENCBEbyBub3QgcmUtaW50cm9kdWNlIGVpdGhlciBmaWVsZCwgaGVyZSBvciBlbHNld2hlcmUuIFRoZSBydWxpbmcgd2FzIG5vdFxuICAgKiBcIm5vIHJvb20gb24gdGhpcyBmb3JtXCI6IGEgc2F0aXNmYWN0aW9uIHNjb3JlIHR5cGVkIGJ5IHRoZSBwZXJzb24gYmVpbmdcbiAgICogc2NvcmVkIGlzIG5vdCB0aGUgc2FtZSBmYWN0IGFzIG9uZSB0aGUgY3VzdG9tZXIgZ2F2ZSwgYW5kIG5laXRoZXIgZmllbGQgd2FzXG4gICAqIG5hbWVkIGluIEFOWSBwcm9maWxlJ3MgYGZpZWxkc2AgbWFwIFx1MjAxNCB3aGljaCBvbiB0aGlzIHBsYXRmb3JtIG1lYW5zXG4gICAqIHVucmVzdHJpY3RlZCwgbm90IHJlc3RyaWN0ZWQuIGBjYXNlX2NzYXRfZm9sbG93dXBgLCB3aG9zZSBvbmx5IHB1cnBvc2Ugd2FzXG4gICAqIHRvIG5vdGlmeSB0aGUgY2FzZSBvd25lciB0byBsb2cgYSByYXRpbmcsIHdhcyByZXRpcmVkIGluIHRoZSBzYW1lIGNoYW5nZS5cbiAgICogQSBjdXN0b21lci1hbnN3ZXJlZCBzdXJ2ZXkgaXMgYSBmZWF0dXJlIGFuZCB3b3VsZCBhcnJpdmUgYXMgaXRzIG93biBjYXJkLFxuICAgKiBub3QgYXMgdHdvIGlucHV0cyBhZGRlZCBiYWNrIGhlcmUuXG4gICAqXG4gICAqIGB0eXBlOiAnc2ltcGxlJ2AsIG5vdCBgJ3RhYmJlZCdgOiBvbmUgc2VjdGlvbiBpcyBub3QgYSB0YWIgc3RyaXAuXG4gICAqL1xuICBmb3JtOiB7XG4gICAgdHlwZTogJ3NpbXBsZScsXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2Nhc2UnLFxuICAgICAgICBsYWJlbDogJ0Nhc2UnLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAnY2FzZV9udW1iZXInLFxuICAgICAgICAgIHsgZmllbGQ6ICdzdWJqZWN0JywgcmVxdWlyZWQ6IHRydWUsIHNwYW46ICdmdWxsJyB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdjcm1fYWNjb3VudCcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgICAgJ2NybV9jb250YWN0JyxcbiAgICAgICAgICB7IGZpZWxkOiAnc3RhdHVzJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICAncHJpb3JpdHknLFxuICAgICAgICAgICdvcmlnaW4nLFxuICAgICAgICAgICdvd25lcl9pZCcsXG4gICAgICAgICAgLy8gUmVxdWlyZWQgb24gdGhlIG9iamVjdCB3aXRoIG5vIGRlZmF1bHQgXHUyMDE0IGEgZm9ybSB3aXRob3V0IGl0IGNvdWxkXG4gICAgICAgICAgLy8gbmV2ZXIgc2F2ZSBhIG5ldyBjYXNlLlxuICAgICAgICAgIHsgZmllbGQ6ICdkZXNjcmlwdGlvbicsIHJlcXVpcmVkOiB0cnVlLCBzcGFuOiAnZnVsbCcgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBuYW1lZCBmb3JtIHZpZXdzLlxuICAgKlxuICAgKiBgd2ViX3RvX2Nhc2VgIGlzIGEgUFVCTElDIC8gQU5PTllNT1VTIHN1cHBvcnQgZm9ybSAoU2FsZXNmb3JjZVxuICAgKiBXZWItdG8tQ2FzZSBlcXVpdmFsZW50KS4gSG9zdGVkIGF0IGAvZm9ybXMvc3VwcG9ydGAgYW5kIGVtYmVkZGFibGUgaW5cbiAgICogYSBoZWxwIGNlbnRlci4gR3Vlc3RzIGNhbiBPTkxZIHN1Ym1pdCBcdTIwMTQgdGhlIGBndWVzdF9wb3J0YWxgIHByb2ZpbGVcbiAgICogZGVuaWVzIHJlYWQvZWRpdC9kZWxldGUgb24gYGNybV9jYXNlYC4gSW50ZXJuYWwgZmllbGRzIChzdGF0dXMsIG9yaWdpbixcbiAgICogb3duZXJfaWQsIFNMQSkgYXJlIHN0YW1wZWQgYnkgYGNhc2UuaG9vay50c2AgYWZ0ZXIgYSBndWVzdCBzdWJtaXNzaW9uLlxuICAgKiBgcHJpb3JpdHlgIGlzIE5PVCBvbmUgb2YgdGhlbTogdGhpcyBmb3JtIGFza3MgdGhlIGd1ZXN0IGZvciBpdCwgYW5kIGFuXG4gICAqIHVuc2V0IG9uZSBpcyBmaWxsZWQgYnkgdGhlIGBsb3dgIG9wdGlvbiBgY3JtX2Nhc2UucHJpb3JpdHlgIGRlY2xhcmVzXG4gICAqIGBkZWZhdWx0OiB0cnVlYC4gRmllbGQgZGVmYXVsdHMgYXJlIGFwcGxpZWQgYmVmb3JlIGBiZWZvcmVJbnNlcnRgLCBzbyB0aGVcbiAgICogaG9vayBvbmx5IGV2ZXIgcmVhZHMgYHByaW9yaXR5YCAodG8gZGVyaXZlIGBwcmlvcml0eV9yYW5rYCkuXG4gICAqL1xuICBmb3JtVmlld3M6IHtcbiAgICB3ZWJfdG9fY2FzZToge1xuICAgICAgdHlwZTogJ3NpbXBsZScsXG4gICAgICBkYXRhLFxuICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdob3dfY2FuX3dlX2hlbHAnLFxuICAgICAgICAgIGxhYmVsOiAnSG93IGNhbiB3ZSBoZWxwPycsXG4gICAgICAgICAgY29sdW1uczogMSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdzdWJqZWN0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnU2hvcnQgc3VtbWFyeSBvZiB0aGUgaXNzdWUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ1N0ZXBzIHRvIHJlcHJvZHVjZSwgZXJyb3IgbWVzc2FnZXMsIHNjcmVlbnNob3RzLi4uJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAndHlwZScsXG4gICAgICAgICAgICAgIGhlbHBUZXh0OiAnUGljayB0aGUgb3B0aW9uIHRoYXQgYmVzdCBtYXRjaGVzIHlvdXIgaXNzdWUuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAncHJpb3JpdHknLFxuICAgICAgICAgICAgICBoZWxwVGV4dDogJ0NyaXRpY2FsIGlzc3VlcyBzaG91bGQgYWxzbyBiZSByZXBvcnRlZCB2aWEgcGhvbmUuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBzaGFyaW5nOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGFsbG93QW5vbnltb3VzOiB0cnVlLFxuICAgICAgICBwdWJsaWNMaW5rOiAnL2Zvcm1zL3N1cHBvcnQnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3ZpZXdzL2tub3dsZWRnZV9hcnRpY2xlLnZpZXcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS92aWV3c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3ZpZXdzL2tub3dsZWRnZV9hcnRpY2xlLnZpZXcudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZVZpZXcgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogS25vd2xlZGdlIEFydGljbGUgVmlld3NcbiAqXG4gKiAgIFx1MjAyMiBncmlkICAgICAgXHUyMDE0IGFnZW50LWZhY2luZyBhcnRpY2xlIHF1ZXVlIChzdGF0dXMgLyBjYXRlZ29yeSAvIGF1ZGllbmNlKVxuICogICBcdTIwMjIgcHVibGlzaGVkIFx1MjAxNCBwdWJsaWMgYXJ0aWNsZXMgb25seVxuICogICBcdTIwMjIgbXkgZHJhZnRzIFx1MjAxNCB0aGUgYXV0aG9yJ3Mgb3duIGRyYWZ0cyBhbmQgaW4tcmV2aWV3IGFydGljbGVzXG4gKlxuICogQSBmb3VydGggdGFiLCBgc3RhbGVfYXJ0aWNsZXNgICgnUmV2aWV3IFF1ZXVlIFx1MDBCNyBPbGRlc3QgRmlyc3QnKSwgc2hpcHBlZCBoZXJlXG4gKiB1bnRpbCAjNzgxIGFuZCBpcyBkZWxpYmVyYXRlbHkgYWJzZW50OiB0aGUgbWFpbnRhaW5lciBydWxlZCB0aGUga25vd2xlZGdlXG4gKiByZXZpZXcgcXVldWUgb3V0IG9mIHRoZSBwcm9kdWN0IHJhdGhlciB0aGFuIHNldHRsaW5nIHdoZXRoZXIgaXQgc2hvdWxkIGhhdmVcbiAqIGJlY29tZSBhIHJlYWwgMTgwLWRheSBjdXQuIFx1MjZENCBEbyBub3QgcmVpbnN0YXRlIGl0IGFzIGEgcmFua2luZyBlaXRoZXIgXHUyMDE0IHRoZVxuICogcnVsaW5nIHJlbW92ZWQgdGhlIEZFQVRVUkUsIG5vdCBqdXN0IHRoZSB3aW5kb3cgcXVlc3Rpb24uXG4gKlxuICogYGxhc3RfcmV2aWV3ZWRfYXRgIGlzIHVudG91Y2hlZCBieSB0aGF0IHJlbW92YWwgYW5kIHN0YXlzIGEgZGF0YS1sYXllclxuICogZmllbGQ6IHRoZSBwdWJsaXNoIGhvb2sgc3RpbGwgc3RhbXBzIGl0LCBhbmQgdGhlIEVuZ2FnZW1lbnQgZm9ybSBzZWN0aW9uXG4gKiBiZWxvdyBzdGlsbCBzaG93cyBpdC4gV2hldGhlciB0aGUgZmllbGQgaXRzZWxmIHNob3VsZCByZXRpcmUgaXMgYSBzZXBhcmF0ZVxuICogcXVlc3Rpb24gYW5kIGlzIG5vdCBhbnN3ZXJlZCBoZXJlLlxuICovXG5leHBvcnQgY29uc3QgS25vd2xlZGdlQXJ0aWNsZVZpZXdzID0gZGVmaW5lVmlldyh7XG4gIGxpc3Q6IHtcbiAgICB0eXBlOiAnZ3JpZCcsXG4gICAgbmFtZTogJ2FsbF9hcnRpY2xlcycsXG4gICAgbGFiZWw6ICdBbGwgQXJ0aWNsZXMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2tub3dsZWRnZV9hcnRpY2xlJyB9LFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICdhcnRpY2xlX251bWJlcicsIHdpZHRoOiAxMjAsIGxpbms6IHRydWUsIHBpbm5lZDogJ2xlZnQnLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ3RpdGxlJywgICAgICAgICAgd2lkdGg6IDMyMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdjYXRlZ29yeScsICAgICAgIHdpZHRoOiAxNjAgfSxcbiAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCAgICAgICAgIHdpZHRoOiAxMzAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAnYXVkaWVuY2UnLCAgICAgICB3aWR0aDogMTEwIH0sXG4gICAgICB7IGZpZWxkOiAnbGFuZ3VhZ2UnLCAgICAgICB3aWR0aDogMTEwIH0sXG4gICAgICB7IGZpZWxkOiAnb3duZXJfaWQnLCAgICAgICAgICB3aWR0aDogMTUwIH0sXG4gICAgICB7IGZpZWxkOiAncHVibGlzaGVkX2F0JywgICB3aWR0aDogMTYwLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ2hlbHBmdWxfY291bnQnLCAgd2lkdGg6IDExMCwgYWxpZ246ICdyaWdodCcsIHN1bW1hcnk6ICdzdW0nIH0sXG4gICAgXSxcbiAgICBzb3J0OiBbeyBmaWVsZDogJ3B1Ymxpc2hlZF9hdCcsIG9yZGVyOiAnZGVzYycgfV0sXG4gICAgZ3JvdXBpbmc6IHsgZmllbGRzOiBbeyBmaWVsZDogJ2NhdGVnb3J5Jywgb3JkZXI6ICdhc2MnIH1dIH0sXG4gICAgc2VsZWN0aW9uOiB7IHR5cGU6ICdtdWx0aXBsZScgfSxcbiAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiA1MCB9LFxuICAgIHJvd0NvbG9yOiB7XG4gICAgICBmaWVsZDogJ3N0YXR1cycsXG4gICAgICBjb2xvcnM6IHsgZHJhZnQ6ICdzbGF0ZScsIGluX3JldmlldzogJ2FtYmVyJywgcHVibGlzaGVkOiAnZW1lcmFsZCcsIGFyY2hpdmVkOiAnZ3JheScgfSxcbiAgICB9LFxuICAgIGFwcGVhcmFuY2U6IHtcbiAgICAgIHNob3dEZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGFsbG93ZWRWaXN1YWxpemF0aW9uczogWydncmlkJywgJ2thbmJhbiddLFxuICAgIH0sXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgcHVibGlzaGVkX2FydGljbGVzOiB7XG4gICAgICBuYW1lOiAncHVibGlzaGVkX2FydGljbGVzJyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnUHVibGlzaGVkJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fa25vd2xlZGdlX2FydGljbGUnIH0sXG4gICAgICBjb2x1bW5zOiBbJ2FydGljbGVfbnVtYmVyJywgJ3RpdGxlJywgJ2NhdGVnb3J5JywgJ2F1ZGllbmNlJywgJ2hlbHBmdWxfY291bnQnLCAnbm90X2hlbHBmdWxfY291bnQnLCAncHVibGlzaGVkX2F0J10sXG4gICAgICBmaWx0ZXI6IFt7IGZpZWxkOiAnc3RhdHVzJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ3B1Ymxpc2hlZCcgfV0sXG4gICAgICBzb3J0OiBbeyBmaWVsZDogJ2hlbHBmdWxfY291bnQnLCBvcmRlcjogJ2Rlc2MnIH1dLFxuICAgIH0sXG4gICAgbXlfZHJhZnRzOiB7XG4gICAgICBuYW1lOiAnbXlfZHJhZnRzJyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnTXkgRHJhZnRzJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fa25vd2xlZGdlX2FydGljbGUnIH0sXG4gICAgICBjb2x1bW5zOiBbJ2FydGljbGVfbnVtYmVyJywgJ3RpdGxlJywgJ2NhdGVnb3J5JywgJ3N0YXR1cycsICd1cGRhdGVkX2F0J10sXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgeyBmaWVsZDogJ3N0YXR1cycsIG9wZXJhdG9yOiAnaW4nLCAgICAgdmFsdWU6IFsnZHJhZnQnLCAnaW5fcmV2aWV3J10gfSxcbiAgICAgICAgLy8gYHtjdXJyZW50X3VzZXJfaWR9YCBpcyB0aGUgb25seSB1c2VyIHRva2VuIHRoZSB2aWV3IHJ1bnRpbWUgcmVzb2x2ZXMuXG4gICAgICAgIHsgZmllbGQ6ICdvd25lcl9pZCcsICBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiAne2N1cnJlbnRfdXNlcl9pZH0nIH0sXG4gICAgICBdLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICd1cGRhdGVkX2F0Jywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICB9LFxuICB9LFxuXG4gIGZvcm06IHtcbiAgICB0eXBlOiAnc2ltcGxlJyxcbiAgICBzZWN0aW9uczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnYXJ0aWNsZScsXG4gICAgICAgIGxhYmVsOiAnQXJ0aWNsZScsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICdhcnRpY2xlX251bWJlcicsXG4gICAgICAgICAgeyBmaWVsZDogJ3RpdGxlJywgcmVxdWlyZWQ6IHRydWUsIHNwYW46ICdmdWxsJyB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdzdW1tYXJ5Jywgc3BhbjogJ2Z1bGwnIH0sXG4gICAgICAgICAgJ2NhdGVnb3J5JyxcbiAgICAgICAgICAndGFncycsXG4gICAgICAgICAgJ3N0YXR1cycsXG4gICAgICAgICAgJ2F1ZGllbmNlJyxcbiAgICAgICAgICAnbGFuZ3VhZ2UnLFxuICAgICAgICAgICdvd25lcl9pZCcsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnY29udGVudCcsXG4gICAgICAgIGxhYmVsOiAnQ29udGVudCcsXG4gICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgIGZpZWxkczogWydib2R5J10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBgbmFtZWAgYWxvbmdzaWRlIGBsYWJlbGAgKCMxMTAwKTogYSBmb3JtIHNlY3Rpb24gZGVjbGFyaW5nIG9ubHkgYVxuICAgICAgICAvLyBsYWJlbCByZW5kZXJzIGl0cyBFTkdMSVNIIGxhYmVsIHVuZGVyIGV2ZXJ5IGxvY2FsZSwgYW5kIG5laXRoZXIgdGhlXG4gICAgICAgIC8vIGV4aXN0aW5nIGkxOG4gdGVzdHMgbm9yIHRoZSBgaTE4bi9taXNzaW5nLSpgIGdhdGUgY2FuIHNlZSBpdCBcdTIwMTQgdGhlXG4gICAgICAgIC8vIGhlYWRpbmcgaGFzIG5vIGtleSBmb3IgYSB0cmFuc2xhdG9yIHRvIG1pc3MuIFRoaXMgc2VjdGlvbiBpcyBuYW1lZFxuICAgICAgICAvLyBiZWNhdXNlIHRoaXMgY2hhbmdlIGVkaXRzIGl0IChgdmlld19jb3VudGAgd2FzIHJlbW92ZWQgZnJvbSBpdCwgIzYwMSk7XG4gICAgICAgIC8vIHRoZSBhcHAtd2lkZSBzd2VlcCBvZiB0aGUgb3RoZXIgaGVhZGluZ3MgaXMgIzExMDAncyBqb2IsIGhlbGQgYmVoaW5kXG4gICAgICAgIC8vIHRoaXMgY2FyZCBwcmVjaXNlbHkgc28gdGhlIHR3byBkbyBub3QgY29sbGlkZSBpbiB0aGUgbG9jYWxlIHBhY2tzLlxuICAgICAgICBuYW1lOiAnZW5nYWdlbWVudCcsXG4gICAgICAgIGxhYmVsOiAnRW5nYWdlbWVudCcsXG4gICAgICAgIGNvbHVtbnM6IDMsXG4gICAgICAgIGZpZWxkczogWydoZWxwZnVsX2NvdW50JywgJ25vdF9oZWxwZnVsX2NvdW50JywgJ3B1Ymxpc2hlZF9hdCcsICdsYXN0X3Jldmlld2VkX2F0JywgJ3JlbGF0ZWRfdG9fY2FzZSddLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHMvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBSZXZlbnVlIG9iamVjdCBiYXJyZWwuXG4gKlxuICogUmUtZXhwb3J0cyB0aGlzIHBhY2thZ2UncyAqLm9iamVjdC50cyBkZWZpbml0aW9uczsgdGhlIGAqLmhvb2sudHNgIGZpbGVzXG4gKiBiZXNpZGUgdGhlbSByZWdpc3RlciB0aHJvdWdoIGAuL2hvb2tzLnRzYC4gVGhlIGNhbm9uaWNhbCBub3RlIG9uIHRoZVxuICogY29sbGFib3JhdGlvbiBjYXBhYmlsaXRpZXMgKGBlbmFibGUuZmlsZXNgLCBgZW5hYmxlLmZlZWRzYCkgdGhhdCBldmVyeVxuICogb2JqZWN0IGluIHRoaXMgYXBwIHBvaW50cyBhdCBpcyB3cml0dGVuIG9uY2UsIGluXG4gKiBgc3JjL3NhbGVzL29iamVjdHMvaW5kZXgudHNgLlxuICovXG5cbmV4cG9ydCB7IENvbnRyYWN0IH0gZnJvbSAnLi9jb250cmFjdC5vYmplY3QnO1xuZXhwb3J0IHsgT3Bwb3J0dW5pdHlMaW5lSXRlbSB9IGZyb20gJy4vb3Bwb3J0dW5pdHlfbGluZV9pdGVtLm9iamVjdCc7XG5leHBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi9wcm9kdWN0Lm9iamVjdCc7XG5leHBvcnQgeyBRdW90ZSB9IGZyb20gJy4vcXVvdGUub2JqZWN0JztcbmV4cG9ydCB7IFF1b3RlTGluZUl0ZW0gfSBmcm9tICcuL3F1b3RlX2xpbmVfaXRlbS5vYmplY3QnO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL2NvbnRyYWN0Lm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL2NvbnRyYWN0Lm9iamVjdC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgT2JqZWN0U2NoZW1hLCBGaWVsZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgUCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB7IFBBWU1FTlRfVEVSTVNfT1BUSU9OUyB9IGZyb20gJy4uLy4uL3NhbGVzL29iamVjdHMvX3BpY2tsaXN0cyc7XG5cbi8qKlxuICogQ29udHJhY3QgT2JqZWN0XG4gKiBSZXByZXNlbnRzIGxlZ2FsIGNvbnRyYWN0cyB3aXRoIGN1c3RvbWVyc1xuICovXG5leHBvcnQgY29uc3QgQ29udHJhY3QgPSBPYmplY3RTY2hlbWEuY3JlYXRlKHtcbiAgbmFtZTogJ2NybV9jb250cmFjdCcsXG4gIGxhYmVsOiAnQ29udHJhY3QnLFxuICBwbHVyYWxMYWJlbDogJ0NvbnRyYWN0cycsXG4gIGljb246ICdmaWxlLXBlbi1saW5lJyxcbiAgZGVzY3JpcHRpb246ICdMZWdhbCBjb250cmFjdHMgYW5kIGFncmVlbWVudHMnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIE1hc3Rlci1kZXRhaWwgY2hpbGQgb2ZcbiAgLy8gY3JtX2FjY291bnQgXHUyMDE0IGEgY29udHJhY3QgSVMgYWNjb3VudCBkYXRhOiByZWFjaGFibGUgYnkgd2hvZXZlciBjYW4gcmVhY2hcbiAgLy8gdGhlIGFjY291bnQsIGVkaXRhYmxlIGJ5IHdob2V2ZXIgY2FuIGVkaXQgaXQgKCM1NDksIHJ1bGluZyAyMDI2LTA4LTMxKS5cbiAgc2hhcmluZ01vZGVsOiAnY29udHJvbGxlZF9ieV9wYXJlbnQnLFxuICAvLyBBRFItMDA3OTogcmVuZGVyLW9ubHkgYHRpdGxlRm9ybWF0YCByZXRpcmVkIGluIGZhdm9yIG9mIGBuYW1lRmllbGRgLlxuICAvLyBPcmlnaW5hbCB0ZW1wbGF0ZSB3YXMgJ3tjb250cmFjdF9udW1iZXJ9IC0ge2NybV9hY2NvdW50Lm5hbWV9Jy4gVGhlXG4gIC8vIGBjcm1fYWNjb3VudC5uYW1lYCBzZWdtZW50IGlzIGEgbG9va3VwIERPVC1XQUxLLCB3aGljaCBhIGZvcm11bGEgZmllbGRcbiAgLy8gY2Fubm90IHJlZmVyZW5jZSAoQURSLTAwNzIpLCBzbyBpdCBpcyBEUk9QUEVELiBPbmx5IHRoZSBsb2NhbFxuICAvLyBgY29udHJhY3RfbnVtYmVyYCAoYXV0b251bWJlcikgcmVtYWlucywgc28gbm8gZm9ybXVsYSBpcyBuZWVkZWQgXHUyMDE0IHBvaW50XG4gIC8vIGBuYW1lRmllbGRgIHN0cmFpZ2h0IGF0IGl0LlxuICBuYW1lRmllbGQ6ICdjb250cmFjdF9udW1iZXInLFxuICBoaWdobGlnaHRGaWVsZHM6IFsnY29udHJhY3RfbnVtYmVyJywgJ2NybV9hY2NvdW50JywgJ3N0YXR1cycsICdzdGFydF9kYXRlJywgJ2VuZF9kYXRlJ10sXG5cbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2Jhc2ljJywgICAgIGxhYmVsOiAnQ29udHJhY3QgSW5mb3JtYXRpb24nLCBpY29uOiAnaW5mbycgfSxcbiAgICB7IGtleTogJ3BhcnRpZXMnLCAgIGxhYmVsOiAnUGFydGllcycsICAgICAgICAgICAgICBpY29uOiAndXNlcnMnIH0sXG4gICAgeyBrZXk6ICd0ZXJtcycsICAgICBsYWJlbDogJ1Rlcm1zICYgRGF0ZXMnLCAgICAgICAgaWNvbjogJ2NhbGVuZGFyJyB9LFxuICAgIHsga2V5OiAndmFsdWUnLCAgICAgbGFiZWw6ICdDb250cmFjdCBWYWx1ZScsICAgICAgIGljb246ICdkb2xsYXItc2lnbicgfSxcbiAgICB7IGtleTogJ3N0YXR1cycsICAgIGxhYmVsOiAnU3RhdHVzICYgQXBwcm92YWwnLCAgICBpY29uOiAnY2hlY2stY2lyY2xlJyB9LFxuICAgIHsga2V5OiAncmVuZXdhbCcsICAgbGFiZWw6ICdSZW5ld2FsJywgICAgICAgICAgICAgIGljb246ICdyZWZyZXNoLWNjdycsIGNvbGxhcHNlOiAnY29sbGFwc2VkJyB9LFxuICBdLFxuXG4gIGZpZWxkczoge1xuICAgIC8vIFBsYXRmb3JtIG93bmVyc2hpcCBhbmNob3IgXHUyMDE0IGNhbm9uaWNhbCBub3RlIGluIGBhY2NvdW50Lm9iamVjdC50c2AgKCM1NDgpLlxuICAgIG93bmVyX2lkOiBGaWVsZC5sb29rdXAoJ3N5c191c2VyJywge1xuICAgICAgbGFiZWw6ICdDb250cmFjdCBPd25lcicsXG4gICAgICBncm91cDogJ3BhcnRpZXMnLFxuICAgICAgc3lzdGVtOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IGZhbHNlLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgLy8gQXV0b051bWJlciBmaWVsZFxuICAgIGNvbnRyYWN0X251bWJlcjogRmllbGQuYXV0b251bWJlcih7XG4gICAgICBsYWJlbDogJ0NvbnRyYWN0IE51bWJlcicsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGZvcm1hdDogJ0NUUi17MDAwMH0nLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFJlbGF0aW9uc2hpcHMgXHUyMDE0IHRoZSBtYXN0ZXIgdGhlIE9XRCBkZXJpdmVzIGZyb20uIEF1dGhvcmVkIGFzXG4gICAgLy8gbWFzdGVyLWRldGFpbCBzbyB0aGUgbWFzdGVyIGlzIG5vdCBkZWNpZGVkIGJ5IGRlY2xhcmF0aW9uIG9yZGVyIGFnYWluc3RcbiAgICAvLyB0aGUgcmVxdWlyZWQgYGNybV9jb250YWN0YCBsb29rdXAgYmVsb3cgKG9iamVjdHN0YWNrIzE0NzQ3KS5cbiAgICBjcm1fYWNjb3VudDogRmllbGQubWFzdGVyRGV0YWlsKCdjcm1fYWNjb3VudCcsIHtcbiAgICAgIGxhYmVsOiAnQWNjb3VudCcsXG4gICAgICBncm91cDogJ3BhcnRpZXMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZScsXG4gICAgfSksXG4gICAgXG4gICAgY3JtX2NvbnRhY3Q6IEZpZWxkLmxvb2t1cCgnY3JtX2NvbnRhY3QnLCB7XG4gICAgICBsYWJlbDogJ1ByaW1hcnkgQ29udGFjdCcsXG4gICAgICBncm91cDogJ3BhcnRpZXMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIC8vIEBvYmplY3RzdGFjayAxMjogc3RyaW5nW10gYHJlZmVyZW5jZUZpbHRlcnNgIGlzIGRlYWQgKG5vdCByZWFkIGJ5IHRoZVxuICAgICAgLy8gcGlja2VyKTsgYGRlcGVuZHNPbmAgaXMgdGhlIGxpdmUgY2FzY2FkaW5nLWxvb2t1cCBmb3JtIFx1MjAxNCBzY29wZXMgY29udGFjdHNcbiAgICAgIC8vIHRvIHRoZSBjb250cmFjdCdzIGBjcm1fYWNjb3VudGAgKEFEUi0wMDQ5KS5cbiAgICAgIGRlcGVuZHNPbjogWydjcm1fYWNjb3VudCddLFxuICAgIH0pLFxuXG4gICAgY3JtX29wcG9ydHVuaXR5OiBGaWVsZC5sb29rdXAoJ2NybV9vcHBvcnR1bml0eScsIHtcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBPcHBvcnR1bml0eScsXG4gICAgICBncm91cDogJ3BhcnRpZXMnLFxuICAgICAgLy8gU2NvcGUgb3Bwb3J0dW5pdGllcyB0byB0aGUgY29udHJhY3QncyBhY2NvdW50ICh3YXMgZGVhZCByZWZlcmVuY2VGaWx0ZXJzKS5cbiAgICAgIGRlcGVuZHNPbjogWydjcm1fYWNjb3VudCddLFxuICAgIH0pLFxuICAgIFxuXG4gICAgLy8gU3RhdHVzXG4gICAgc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgZ3JvdXA6ICdzdGF0dXMnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnRHJhZnQnLCB2YWx1ZTogJ2RyYWZ0JywgY29sb3I6ICcjOTk5OTk5JywgZGVmYXVsdDogdHJ1ZSB9LFxuICAgICAgICB7IGxhYmVsOiAnSW4gQXBwcm92YWwnLCB2YWx1ZTogJ2luX2FwcHJvdmFsJywgY29sb3I6ICcjRkZBNTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQWN0aXZhdGVkJywgdmFsdWU6ICdhY3RpdmF0ZWQnLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFeHBpcmVkJywgdmFsdWU6ICdleHBpcmVkJywgY29sb3I6ICcjRkYwMDAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnVGVybWluYXRlZCcsIHZhbHVlOiAndGVybWluYXRlZCcsIGNvbG9yOiAnIzY2NjY2NicgfSxcbiAgICAgIF0sXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIENvbnRyYWN0IFRlcm1zXG4gICAgY29udHJhY3RfdGVybV9tb250aHM6IEZpZWxkLm51bWJlcih7XG4gICAgICBsYWJlbDogJ0NvbnRyYWN0IFRlcm0gKE1vbnRocyknLFxuICAgICAgZ3JvdXA6ICd0ZXJtcycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgbWluOiAxLFxuICAgIH0pLFxuICAgIFxuICAgIHN0YXJ0X2RhdGU6IEZpZWxkLmRhdGUoe1xuICAgICAgbGFiZWw6ICdTdGFydCBEYXRlJyxcbiAgICAgIGdyb3VwOiAndGVybXMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICB9KSxcbiAgICBcbiAgICBlbmRfZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBsYWJlbDogJ0VuZCBEYXRlJyxcbiAgICAgIGdyb3VwOiAndGVybXMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBGaW5hbmNpYWxcbiAgICBjb250cmFjdF92YWx1ZTogRmllbGQuY3VycmVuY3koeyBcbiAgICAgIGxhYmVsOiAnQ29udHJhY3QgVmFsdWUnLFxuICAgICAgZ3JvdXA6ICd2YWx1ZScsXG4gICAgICBtaW46IDAsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgIH0pLFxuICAgIFxuICAgIGJpbGxpbmdfZnJlcXVlbmN5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdCaWxsaW5nIEZyZXF1ZW5jeScsXG4gICAgICBncm91cDogJ3ZhbHVlJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ01vbnRobHknLCB2YWx1ZTogJ21vbnRobHknLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdRdWFydGVybHknLCB2YWx1ZTogJ3F1YXJ0ZXJseScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0FubnVhbGx5JywgdmFsdWU6ICdhbm51YWxseScgfSxcbiAgICAgICAgeyBsYWJlbDogJ09uZS10aW1lJywgdmFsdWU6ICdvbmVfdGltZScgfSxcbiAgICAgIF1cbiAgICB9KSxcbiAgICBcbiAgICBwYXltZW50X3Rlcm1zOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdQYXltZW50IFRlcm1zJyxcbiAgICAgIGdyb3VwOiAndmFsdWUnLFxuICAgICAgLy8gQ2Fub25pY2FsIHNldCBzaGFyZWQgd2l0aCBRdW90ZTogYW4gYWNjZXB0ZWQgcXVvdGUncyB0ZXJtcyAoaW5jbC5cbiAgICAgIC8vIGR1ZV9vbl9yZWNlaXB0KSBtdXN0IHN1cnZpdmUgdGhlIGNvcHkgb250byB0aGUgY29udHJhY3QuIFRoYXQgY29weSBpc1xuICAgICAgLy8gYHF1b3RlX2FjY2VwdGVkX2NvbnRyYWN0X2RyYWZ0YCAoc3JjL3JldmVudWUvb2JqZWN0cy9xdW90ZS5ob29rLnRzKS4gVGhpcyBmaWVsZCdzIGBuZXRfMzBgXG4gICAgICAvLyBvcHRpb24gZGVmYXVsdCBhcHBsaWVzIG9ubHkgd2hlbiB0aGUgcXVvdGUgaXRzZWxmIGNhcnJpZWQgbm8gdGVybSxcbiAgICAgIC8vIHdoaWNoIGlzIHRoZSBpbnRlbmRlZCBmYWxsLXRocm91Z2gsIG5vdCBhIGdhcC5cbiAgICAgIG9wdGlvbnM6IFsuLi5QQVlNRU5UX1RFUk1TX09QVElPTlNdLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFJlbmV3YWxcbiAgICBhdXRvX3JlbmV3YWw6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdBdXRvIFJlbmV3YWwnLFxuICAgICAgZ3JvdXA6ICdyZW5ld2FsJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgfSksXG4gICAgXG4gICAgcmVuZXdhbF9ub3RpY2VfZGF5czogRmllbGQubnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnUmVuZXdhbCBOb3RpY2UgKERheXMpJyxcbiAgICAgIGdyb3VwOiAncmVuZXdhbCcsXG4gICAgICBtaW46IDAsXG4gICAgICBkZWZhdWx0VmFsdWU6IDMwLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIExlZ2FsXG4gICAgY29udHJhY3RfdHlwZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnQ29udHJhY3QgVHlwZScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ1N1YnNjcmlwdGlvbicsIHZhbHVlOiAnc3Vic2NyaXB0aW9uJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU2VydmljZSBBZ3JlZW1lbnQnLCB2YWx1ZTogJ3NlcnZpY2UnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdMaWNlbnNlJywgdmFsdWU6ICdsaWNlbnNlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUGFydG5lcnNoaXAnLCB2YWx1ZTogJ3BhcnRuZXJzaGlwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnTkRBJywgdmFsdWU6ICduZGEnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdNU0EnLCB2YWx1ZTogJ21zYScgfSxcbiAgICAgIF1cbiAgICB9KSxcbiAgICBcbiAgICBzaWduZWRfZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBsYWJlbDogJ1NpZ25lZCBEYXRlJyxcbiAgICAgIGdyb3VwOiAnc3RhdHVzJyxcbiAgICB9KSxcbiAgICBcbiAgICBzaWduZWRfYnk6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdTaWduZWQgQnknLFxuICAgICAgZ3JvdXA6ICdzdGF0dXMnLFxuICAgICAgbWF4TGVuZ3RoOiAyNTUsXG4gICAgfSksXG4gICAgXG4gICAgZG9jdW1lbnRfdXJsOiBGaWVsZC51cmwoe1xuICAgICAgbGFiZWw6ICdDb250cmFjdCBEb2N1bWVudCcsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBUZXJtcyAmIENvbmRpdGlvbnNcbiAgICBzcGVjaWFsX3Rlcm1zOiBGaWVsZC5tYXJrZG93bih7XG4gICAgICBsYWJlbDogJ1NwZWNpYWwgVGVybXMnLFxuICAgICAgZ3JvdXA6ICd0ZXJtcycsXG4gICAgfSksXG4gICAgXG4gICAgZGVzY3JpcHRpb246IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGxhYmVsOiAnRGVzY3JpcHRpb24nLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG4gICAgXG4gICAgLy8gQmlsbGluZyBBZGRyZXNzXG4gICAgYmlsbGluZ19hZGRyZXNzOiBGaWVsZC5hZGRyZXNzKHtcbiAgICAgIGxhYmVsOiAnQmlsbGluZyBBZGRyZXNzJyxcbiAgICAgIGdyb3VwOiAndmFsdWUnLFxuICAgIH0pLFxuICB9LFxuICBcbiAgLy8gRGF0YWJhc2UgaW5kZXhlc1xuICBpbmRleGVzOiBbXG4gICAgeyBmaWVsZHM6IFsnY3JtX2FjY291bnQnXSB9LFxuICAgIHsgZmllbGRzOiBbJ3N0YXR1cyddIH0sXG4gICAgeyBmaWVsZHM6IFsnc3RhcnRfZGF0ZSddIH0sXG4gICAgeyBmaWVsZHM6IFsnZW5kX2RhdGUnXSB9LFxuICAgIHsgZmllbGRzOiBbJ293bmVyX2lkJ10gfSxcbiAgXSxcbiAgXG4gIC8vIEVuYWJsZSBhZHZhbmNlZCBmZWF0dXJlc1xuICAvLyBBUEkgc3VyZmFjZS4gSGlzdG9yeSBcdTIxOTIgRmllbGQudHJhY2tIaXN0b3J5IChBRFItMDA1MikuXG4gIGVuYWJsZToge1xuICAgIGFwaUVuYWJsZWQ6IHRydWUsXG4gICAgYXBpTWV0aG9kczogWydnZXQnLCAnbGlzdCcsICdjcmVhdGUnLCAndXBkYXRlJywgJ2RlbGV0ZSddLFxuICAgIC8vICM2MDIgXHUyMDE0IHRoZSBleGVjdXRlZCBjb250cmFjdCBpdHNlbGYuIGBkb2N1bWVudF91cmxgIHJlbWFpbnMgdGhlIHBvaW50ZXJcbiAgICAvLyB0byBhbiBleHRlcm5hbCBETVMgY29weTsgdGhpcyBpcyB3aGVyZSB0aGUgZmlsZSBhY3R1YWxseSBsaXZlcy5cbiAgICAvLyBTZWUgdGhlIGNhbm9uaWNhbCBjYXBhYmlsaXR5IG5vdGUgaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYC5cbiAgICBmaWxlczogdHJ1ZSxcbiAgfSxcbiAgXG4gIC8vIFZhbGlkYXRpb24gUnVsZXNcbiAgLy9cbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnZW5kX2FmdGVyX3N0YXJ0JyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRW5kIERhdGUgbXVzdCBiZSBhZnRlciBTdGFydCBEYXRlJyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmVuZF9kYXRlKSAmJiByZWNvcmQuZW5kX2RhdGUgIT0gbnVsbCAmJiBoYXMocmVjb3JkLnN0YXJ0X2RhdGUpICYmIHJlY29yZC5zdGFydF9kYXRlICE9IG51bGwgJiYgcmVjb3JkLmVuZF9kYXRlIDw9IHJlY29yZC5zdGFydF9kYXRlYCxcbiAgICB9LFxuICAgIC8vIE5PVEU6IHRoZSBgdmFsaWRfY29udHJhY3RfdGVybWAgd2FybmluZyAobW9udGhzLWJldHdlZW4gdGVybSBjaGVjaykgd2FzXG4gICAgLy8gZHJvcHBlZCBpbiB0aGUgOS44LjAgdXBncmFkZSBcdTIwMTQgaXRzIENFTCBwcmVkaWNhdGUgdXNlZCBgbW9udGhzQmV0d2VlbigpYCxcbiAgICAvLyB3aGljaCA5LjguMCdzIGFsaWduZWQgQ0VMIHN0ZGxpYiAoQURSLTAwMzIpIG5vIGxvbmdlciBwcm92aWRlcy4gSXQgd2FzIGFcbiAgICAvLyBub24tYmxvY2tpbmcgd2FybmluZzsgdGhlIGhhcmQgZW5kLWRhdGU+c3RhcnQtZGF0ZSBydWxlIGFib3ZlIHJlbWFpbnMuXG4gICAge1xuICAgICAgLy8gIzU3NSBCNC4gTGlrZSBgY3JtX3F1b3RlYCwgdGhpcyBvYmplY3Qgc2hpcHBlZCBhIGxpZmVjeWNsZSB2b2NhYnVsYXJ5XG4gICAgICAvLyB3aXRoIG5vIHRyYW5zaXRpb24gY29uc3RyYWludCBhbmQgbm8gc3RhdHVzIGd1YXJkIGluIGBjb250cmFjdC5ob29rLnRzYFxuICAgICAgLy8gXHUyMDE0IHNvIGBkcmFmdCBcdTIxOTIgYWN0aXZhdGVkYCB3YXMgYSBsZWdhbCBtb3ZlLCBhY3RpdmF0aW5nIGFuIGFncmVlbWVudCB0aGF0XG4gICAgICAvLyBuZXZlciBwYXNzZWQgYXBwcm92YWwuIEFjdGl2YXRpb24gaXMgdGhlIGNvbnNlcXVlbnRpYWwgZWRnZSBoZXJlOlxuICAgICAgLy8gYGNvbnRyYWN0X29uX2FjdGl2YXRpb25gIHN0YW1wcyBgc2lnbmVkX2RhdGVgLCBwcm9tb3RlcyB0aGUgYWNjb3VudCB0b1xuICAgICAgLy8gYGN1c3RvbWVyYCwgYW5kIHRoZSByZW5ld2FsIGZsb3cgc3RhcnRzIGNvdW50aW5nIGZyb20gaXQuXG4gICAgICBuYW1lOiAnY29udHJhY3Rfc3RhdHVzX3Byb2dyZXNzaW9uJyxcbiAgICAgIHR5cGU6ICdzdGF0ZV9tYWNoaW5lJyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiAnSW52YWxpZCBjb250cmFjdCBzdGF0dXMgdHJhbnNpdGlvbicsXG4gICAgICBmaWVsZDogJ3N0YXR1cycsXG4gICAgICB0cmFuc2l0aW9uczoge1xuICAgICAgICBkcmFmdDogWydpbl9hcHByb3ZhbCcsICd0ZXJtaW5hdGVkJ10sXG4gICAgICAgIC8vIEFwcHJvdmFsIGVpdGhlciBsYW5kcyAoYGFjdGl2YXRlZGApIG9yIHNlbmRzIHRoZSBwYXBlcndvcmsgYmFjay5cbiAgICAgICAgaW5fYXBwcm92YWw6IFsnZHJhZnQnLCAnYWN0aXZhdGVkJywgJ3Rlcm1pbmF0ZWQnXSxcbiAgICAgICAgLy8gYFx1MjE5MiBleHBpcmVkYCBpcyB0aGUgY29udHJhY3RfZXhwaXJhdGlvbiBmbG93LCB3aG9zZSBvd24gc3dlZXAgZmlsdGVyXG4gICAgICAgIC8vIGlzIGBzdGF0dXM6ICdhY3RpdmF0ZWQnYCBcdTIwMTQgbm90aGluZyBlbHNlIGFnZXMgb3V0LlxuICAgICAgICBhY3RpdmF0ZWQ6IFsnZXhwaXJlZCcsICd0ZXJtaW5hdGVkJ10sXG4gICAgICAgIC8vIEJvdGggZW5kcyBhcmUgdGVybWluYWw6IGEgcmVuZXdhbCBpcyBhIE5FVyBjb250cmFjdCAodGhlXG4gICAgICAgIC8vIGNvbnRyYWN0X3JlbmV3YWwgZmxvdyBmaWxlcyBhIHRhc2ssIGl0IGRvZXMgbm90IHJldml2ZSB0aGUgb2xkIHJvdykuXG4gICAgICAgIGV4cGlyZWQ6IFtdLFxuICAgICAgICB0ZXJtaW5hdGVkOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgXSxcbiAgXG4gIC8vIFdvcmtmbG93IFJ1bGVzXG4gIC8vIFx1MjZBMFx1RkUwRiBObyBgd29ya2Zsb3dzW11gIGhlcmUsIGFuZCBub25lIGlzIHBvc3NpYmxlOiBvYmplY3QgYHdvcmtmbG93c1tdYCB3ZXJlXG4gIC8vIHJlbW92ZWQgZnJvbSB0aGUgcGxhdGZvcm0uIEZpZWxkIHVwZGF0ZXMgbGl2ZSBpbiB0aGlzIG9iamVjdCdzIGAqLmhvb2sudHNgO1xuICAvLyBzY2hlZHVsZWQgc3RhdHVzIGZsaXBzIGFuZCBub3RpZmljYXRpb25zIGxpdmUgaW4gYHNyYy8qL2Zsb3dzLyouZmxvdy50c2AuXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9vcHBvcnR1bml0eV9saW5lX2l0ZW0ub2JqZWN0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHMvb3Bwb3J0dW5pdHlfbGluZV9pdGVtLm9iamVjdC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgT2JqZWN0U2NoZW1hLCBGaWVsZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgRiwgUCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcblxuLyoqXG4gKiBPcHBvcnR1bml0eSBMaW5lIEl0ZW1cbiAqXG4gKiBJbmRpdmlkdWFsIHByb2R1Y3Qvc2VydmljZSBlbnRyeSBvbiBhbiBPcHBvcnR1bml0eS4gVG9nZXRoZXIsIGFsbCBsaW5lIGl0ZW1zXG4gKiByb2xsIHVwIHRvIHRoZSBPcHBvcnR1bml0eSBhbW91bnQuIFJlcXVpcmVkIGZvciBhbnkgcmVhbGlzdGljIHNhbGVzIHByb2Nlc3NcbiAqIHdoZXJlIHRoZSBkZWFsIHZhbHVlIGNvbWVzIGZyb20gYSBjb25maWd1cmVkIHNldCBvZiBwcm9kdWN0cyByYXRoZXIgdGhhblxuICogYSBzaW5nbGUgdHlwZWQtaW4gdG90YWwuXG4gKi9cbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eUxpbmVJdGVtID0gT2JqZWN0U2NoZW1hLmNyZWF0ZSh7XG4gIG5hbWU6ICdjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtJyxcbiAgbGFiZWw6ICdPcHBvcnR1bml0eSBMaW5lIEl0ZW0nLFxuICBwbHVyYWxMYWJlbDogJ09wcG9ydHVuaXR5IExpbmUgSXRlbXMnLFxuICBpY29uOiAncGFja2FnZScsXG4gIGRlc2NyaXB0aW9uOiAnQSBzaW5nbGUgcHJvZHVjdCBsaW5lIG9uIGFuIE9wcG9ydHVuaXR5JyxcblxuICAvLyBBRFItMDA5MCBEMS9ENzogT1dEIGlzIGFuIGF1dGhvcmVkIGRlY2lzaW9uLiBBIGxpbmUgaXRlbSBoYXMgbm8gbWVhbmluZ1xuICAvLyBhcGFydCBmcm9tIGl0cyBkZWFsLCBzbyBpdHMgcmVjb3JkIGFjY2VzcyBERVJJVkVTIGZyb20gdGhlIG9wcG9ydHVuaXR5XG4gIC8vIChBRFItMDA1NSksIGFuZCBhcyBvZiAxNy4wLjAtcmMuNCB0aGF0IGRlcml2YXRpb24gbWVhbnMgd2hhdCBpdCBzYXlzLlxuICAvL1xuICAvLyBcdTI2QTBcdUZFMEYgUmVhZHMgQVJFIGZpbHRlcmVkIHRvIGxpbmUgaXRlbXMgd2hvc2UgYGNybV9vcHBvcnR1bml0eWAgdGhlIGNhbGxlciBjYW5cbiAgLy8gcmVhZCwgYW5kIG1hc3RlciBhY2Nlc3NpYmlsaXR5IHJlc29sdmVzIHRocm91Z2ggdGhlIHNhbWUgcGF0aHMgYSBkaXJlY3RcbiAgLy8gcmVhZCBvZiB0aGUgb3Bwb3J0dW5pdHkgdGFrZXMgXHUyMDE0IG93bmVyc2hpcCBhbmQgYHN5c19yZWNvcmRfc2hhcmVgIGdyYW50c1xuICAvLyBpbmNsdWRlZCwgTk9UIHRoZSBtYXN0ZXIncyByb3ctbGV2ZWwgc2VjdXJpdHkgcG9saWNpZXMgYWxvbmUuIFNvIGEgcmVwXG4gIC8vIHJlYWRzIHRoZSBsaW5lcyBvZiB0aGUgZGVhbHMgaW4gdGhlaXIgb3duIGJvb2sgcGx1cyBhbnl0aGluZyBzaGFyZWQgdG9cbiAgLy8gdGhlbSwgYW5kIHRoZSBwcml2YXRlLWRlYWwgUkxTIGZpbHRlciBjYXJyaWVkIGJ5IHRoZSBgc2FsZXNfbWFuYWdlcmAgYW5kXG4gIC8vIGBtYXJrZXRpbmdfdXNlcmAgc2V0cyBuYXJyb3dzIG9uIHRvcCBvZiB0aGF0IHJhdGhlciB0aGFuIGJlaW5nIHRoZSBvbmx5XG4gIC8vIHRoaW5nIHRoYXQgbmFycm93cy4gVGhlIHBhcmVudC13cml0ZSBnYXRlIGRlcml2ZXMgdGhlIHNhbWUgd2F5OiBhIGxpbmVcbiAgLy8gd2hvc2Ugb3Bwb3J0dW5pdHkgdGhlIGNhbGxlciBjYW5ub3QgZWRpdCBpcyByZWZ1c2VkLlxuICAvL1xuICAvLyBgdGVzdC9wYXJlbnQtZGVyaXZlZC1yZWFjaC50ZXN0LnRzYCBwaW5zIHRoZSBuYXJyb3cgc2VtYW50aWNzIGFuZCB3YXNcbiAgLy8gd3JpdHRlbiB0byBnbyByZWQgdGhlIGRheSB0aGUgcGxhdGZvcm0gd2lkZW5zIHRoZW06IHdpdGggdGhlIG1hc3RlciBzZXRcbiAgLy8gcmVzb2x2ZWQgZnJvbSBSTFMgcG9saWNpZXMgYWxvbmUsIGFueSBjYWxsZXIgd2l0aG91dCB0aGUgcHJpdmF0ZS1kZWFsXG4gIC8vIHBvbGljeSBcdTIwMTQgYHNhbGVzX3JlcGAgaW5jbHVkZWQgXHUyMDE0IHJlYWNoZXMgRVZFUlkgb3Bwb3J0dW5pdHkncyBsaW5lcy5cbiAgLy8gQURSLTAwNTUncyByZWxhdGlvbiByZXNvbHZlciBhY2NlcHRzIGEgUkVRVUlSRUQgTE9PS1VQIGFzIHRoZSBwYXJlbnQsIHNvXG4gIC8vIHRoaXMgd29ya3Mgd2l0aG91dCBjb252ZXJ0aW5nIHRoZSByZWxhdGlvbnNoaXAgdG8gbWFzdGVyLWRldGFpbC5cbiAgLy9cbiAgLy8gXHUyNkQ0IE5vdCBgcHJpdmF0ZWA6IHRoaXMgb2JqZWN0IGhhcyBubyBvd25lciBvZiBpdHMgb3duLCBzbyBgcHJpdmF0ZWAgZmFsbHNcbiAgLy8gYmFjayB0byB0aGUgcGxhdGZvcm0ncyBhdXRvLXN0YW1wZWQgYG93bmVyX2lkYCAod2hvZXZlciBpbnNlcnRlZCB0aGUgcm93KSBcdTIwMTRcbiAgLy8gYW5kIHRoZSByZXAgd2hvIG93bnMgdGhlIGRlYWwgdGhlbiBjYW5ub3Qgc2VlIGEgbGluZSB0aGUgcXVvdGUtZ2VuZXJhdGlvblxuICAvLyBmbG93IG9yIHRoZWlyIG1hbmFnZXIgYWRkZWQgdG8gaXQuXG4gIHNoYXJpbmdNb2RlbDogJ2NvbnRyb2xsZWRfYnlfcGFyZW50JyxcblxuICAvLyBQZXItZmllbGQgaGlzdG9yeSBpcyBvcHQtaW4gdmlhIGBGaWVsZC50cmFja0hpc3RvcnlgIChBRFItMDA1MiksIHNldCBvblxuICAvLyBxdWFudGl0eS91bml0X3ByaWNlL2Rpc2NvdW50IGJlbG93LiBNYXN0ZXItZGV0YWlsIGNoaWxkcmVuIHN0aWxsIGluaGVyaXRcbiAgLy8gdGhlIG1hc3RlcidzIHNoYXJpbmcgYXV0b21hdGljYWxseS5cblxuICBoaWdobGlnaHRGaWVsZHM6IFsnY3JtX3Byb2R1Y3QnLCAncXVhbnRpdHknLCAndW5pdF9wcmljZScsICd0b3RhbF9wcmljZSddLFxuXG4gIC8vIFR3byBncm91cHMsIGRlcml2ZWQgZnJvbSB0aGUgbmluZSBmaWVsZHMgdGhpcyBvYmplY3QgYWN0dWFsbHkgZGVjbGFyZXNcbiAgLy8gcmF0aGVyIHRoYW4gY29waWVkIG9mZiBhIG5laWdoYm91ciAoIzE0NTMpLiBUaGUgc3BsaXQgaXMgdGhlIG9uZSB0aGVcbiAgLy8gYXJpdGhtZXRpYyBhbHJlYWR5IG1ha2VzOiBldmVyeXRoaW5nIGB0b3RhbF9wcmljZWAgbXVsdGlwbGllcyB0b2dldGhlciBpc1xuICAvLyBgcHJpY2luZ2AsIGV2ZXJ5dGhpbmcgdGhhdCBzYXlzIFdISUNIIGxpbmUgdGhpcyBpcyBpcyBgYmFzaWNgLlxuICAvL1xuICAvLyBgcXVhbnRpdHlgIGlzIGEgcHJpY2luZyBmaWVsZCBoZXJlLCBub3QgYW4gaWRlbnRpdHkgb25lIFx1MjAxNCBpdCBpcyBhIGZhY3RvciBpblxuICAvLyBgdG90YWxfcHJpY2VgLCBhbmQgc2VwYXJhdGluZyBpdCBmcm9tIHRoZSBwcmljZSBpdCBtdWx0aXBsaWVzIHdvdWxkIHB1dCB0aGVcbiAgLy8gdHdvIGhhbHZlcyBvZiBvbmUgcHJvZHVjdCBvbiB0d28gc2VjdGlvbnMuIGBjcm1fcXVvdGVfbGluZV9pdGVtYCB0YWtlcyB0aGVcbiAgLy8gc2FtZSBzcGxpdCBvdmVyIGl0cyB0ZW4gZmllbGRzLCBhbmQgdGhlIHBhcmVudHMgYWdyZWU6IGBjcm1fcXVvdGVgIGFuZFxuICAvLyBgY3JtX3Byb2R1Y3RgIGJvdGgga2VlcCBldmVyeSBtb25leSBmaWVsZCBpbiBgcHJpY2luZ2AgXHUyMDE0IGBjcm1fcXVvdGVgJ3NcbiAgLy8gYHRheGAgaW5jbHVkZWQgXHUyMDE0IGFuZCBib3RoIGtlZXAgYGRlc2NyaXB0aW9uYCBpbiBgYmFzaWNgLlxuICAvL1xuICAvLyBcdTI2QTBcdUZFMEYgTmVpdGhlciBncm91cCBtYXkgYmUgYSBzdWJzZXQgb2YgdGhlIGhpZ2hsaWdodCBzdHJpcDogYSBzeW50aGVzaXplZFxuICAvLyBkZXRhaWwgcGFnZSBob2lzdHMgdGhlIHRpdGxlIHBsdXMgdGhlIGZpcnN0IGZvdXIgYGhpZ2hsaWdodEZpZWxkc2Agb3V0IG9mXG4gIC8vIHRoZSBib2R5LCBzbyBhbiBhbGwtaG9pc3RlZCBncm91cCByZW5kZXJzIG9uIGZvcm1zIGFuZCBub3doZXJlIGVsc2VcbiAgLy8gKGBmaWVsZC1ncm91cC1zaGFkb3dlZGA7IGBwbnBtIGxpbnRgIFx1MjAxNCBgb3MgbGludCAtLXN0cmljdGAgXHUyMDE0IGZhaWxzIG9uIGl0KS5cbiAgLy8gYGJhc2ljYCBrZWVwcyBjcm1fb3Bwb3J0dW5pdHkvZGVzY3JpcHRpb24vbGluZV9udW1iZXIgYW5kIGBwcmljaW5nYCBrZWVwc1xuICAvLyBsaXN0X3ByaWNlL2Rpc2NvdW50IG91dHNpZGUgdGhhdCBzdHJpcCwgc28gYm90aCBzdXJ2aXZlIHRoZSBob2lzdC5cbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2Jhc2ljJywgICBsYWJlbDogJ0xpbmUgSXRlbScsIGljb246ICdwYWNrYWdlJyB9LFxuICAgIHsga2V5OiAncHJpY2luZycsIGxhYmVsOiAnUHJpY2luZycsICAgaWNvbjogJ2RvbGxhci1zaWduJyB9LFxuICBdLFxuXG4gIGZpZWxkczoge1xuICAgIC8vIFRoZSBwYXJlbnQgbGluaywgYW5kIHRoZSBPTkUgZmllbGQgb24gdGhpcyBvYmplY3QgdGhhdCBkZWNpZGVzIHdoZXRoZXIgdGhlXG4gICAgLy8gZGVhbCBpdCBiZWxvbmdzIHRvIGNhbiBiZSBkZWxldGVkIGF0IGFsbCAoIzcyNykuXG4gICAgLy9cbiAgICAvLyBEZWNsYXJpbmcgbm90aGluZyBoZXJlIGRvZXMgbm90IG1lYW4gXCJubyBvcGluaW9uXCI6IGBGaWVsZC5sb29rdXBgIHJlc29sdmVzXG4gICAgLy8gYGRlbGV0ZUJlaGF2aW9yYCB0byB0aGUgc3BlYyBkZWZhdWx0IGBzZXRfbnVsbGAsIGFuZCB0aGUgZW5naW5lJ3NcbiAgICAvLyBgY2FzY2FkZURlbGV0ZVJlbGF0aW9uc2AgZXNjYWxhdGVzIGEgYHNldF9udWxsYCBkZWZhdWx0IG9uIGEgUkVRVUlSRURcbiAgICAvLyBsb29rdXAgdG8gYHJlc3RyaWN0YCBcdTIwMTQgYSBOT1QgTlVMTCBjb2x1bW4gY2Fubm90IGJlIGNsZWFyZWQuIFNvIHRoZSBzaWxlbnRcbiAgICAvLyBkZWZhdWx0IG1hZGUgZXZlcnkgaXRlbWlzZWQgb3Bwb3J0dW5pdHkgdW5kZWxldGFibGUsIHdpdGggYSBtZXNzYWdlIHRoYXRcbiAgICAvLyB0b2xkIHRoZSBBUEkgY2FsbGVyIHRvIGBzZXQgZGVsZXRlQmVoYXZpb3I6J2Nhc2NhZGUnYCBvbiB0aGlzIHZlcnkgZmllbGQ6XG4gICAgLy9cbiAgICAvLyAgICAgREVMRVRFIC9hcGkvdjEvZGF0YS9jcm1fb3Bwb3J0dW5pdHkvPGlkPlxuICAgIC8vICAgICBcdTIxOTIgNDA5IERFTEVURV9SRVNUUklDVEVEIFwiXHUyMDI2MSBkZXBlbmRlbnQgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbVxuICAgIC8vICAgICAgIHJlY29yZChzKSByZWZlcmVuY2UgaXQgdmlhIGNybV9vcHBvcnR1bml0eVx1MjAyNlwiXG4gICAgLy9cbiAgICAvLyBgY2FzY2FkZWAgaXMgdGhlIHNlbWFudGljcyB0aGlzIG9iamVjdCBhbHJlYWR5IGNsYWltcyB0d2ljZSBvdmVyOiB0aGVcbiAgICAvLyBoZWFkZXIgY29tbWVudCBzYXlzIGEgbGluZSBoYXMgbm8gbWVhbmluZyBhcGFydCBmcm9tIGl0cyBkZWFsLCBhbmRcbiAgICAvLyBgb3Bwb3J0dW5pdHlfbGluZV9pdGVtLmhvb2sudHNgIGRlcml2ZXMgYGNybV9vcHBvcnR1bml0eS5hbW91bnRgIEZST00gdGhlXG4gICAgLy8gbGluZSBzZXQuIEEgcmVjb3JkIHdob3NlIHBhcmVudCBpcyBnb25lIGRlbm90ZXMgbm90aGluZyBhbmQgd291bGQga2VlcCBhXG4gICAgLy8gZGVhZCBkZWFsJ3MgcmV2ZW51ZSBpbiB0aGUgbGluZS1sZXZlbCByZXBvcnRzLlxuICAgIC8vXG4gICAgLy8gVGhpcyBpcyBkZWxpYmVyYXRlbHkgTk9UIHRoZSBjYW1wYWlnbi9ldmVudCBhbnN3ZXIgKCM2OTYsICM3MTEga2VwdFxuICAgIC8vIGBjcm1fY2FtcGFpZ25fbWVtYmVyLmNybV9jYW1wYWlnbmAgYW5kIGBjcm1fZXZlbnRfYXR0ZW5kZWUuY3JtX2V2ZW50YCBvblxuICAgIC8vIHRoZSByZXN0cmljdGluZyBkZWZhdWx0KTogYSBtZW1iZXIgbGlzdCBpcyBhIGNhbXBhaWduJ3MgaGlzdG9yaWNhbCByZWNvcmRcbiAgICAvLyBhbmQgc3Vydml2ZXMgb24gaXRzIG93biB0ZXJtcy4gQSBwcmljZSBsaW5lIGRvZXMgbm90LlxuICAgIGNybV9vcHBvcnR1bml0eTogRmllbGQubWFzdGVyRGV0YWlsKCdjcm1fb3Bwb3J0dW5pdHknLCB7XG4gICAgICBsYWJlbDogJ09wcG9ydHVuaXR5JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZScsXG4gICAgfSksXG5cbiAgICAvLyBEZWxpYmVyYXRlbHkgbGVmdCBvbiB0aGUgZGVmYXVsdCwgd2hpY2ggdGhlIHNhbWUgZXNjYWxhdGlvbiB0dXJucyBpbnRvXG4gICAgLy8gYHJlc3RyaWN0YDogZGVsZXRpbmcgYSBjYXRhbG9nIHByb2R1Y3QgbXVzdCBOT1Qgc2hyZWQgdGhlIHByaWNlZCBoaXN0b3J5XG4gICAgLy8gb2YgZGVhbHMgdGhhdCBzb2xkIGl0LiBgcHJvZHVjdC5ob29rLnRzYCdzIG93biBgYmVmb3JlRGVsZXRlYCBzYXlzIHRoZVxuICAgIC8vIHNhbWUgdGhpbmcgaW4gd29yZHMgKFwiU2V0IGlzX2FjdGl2ZT1mYWxzZSB0byByZXRpcmUgaW5zdGVhZFwiKS5cbiAgICBjcm1fcHJvZHVjdDogRmllbGQubG9va3VwKCdjcm1fcHJvZHVjdCcsIHtcbiAgICAgIGxhYmVsOiAnUHJvZHVjdCcsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgfSksXG5cbiAgICBkZXNjcmlwdGlvbjogRmllbGQudGV4dCh7XG4gICAgICBsYWJlbDogJ0Rlc2NyaXB0aW9uJyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbWF4TGVuZ3RoOiA1MDAsXG4gICAgfSksXG5cbiAgICBxdWFudGl0eTogRmllbGQubnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnUXVhbnRpdHknLFxuICAgICAgZ3JvdXA6ICdwcmljaW5nJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBzY2FsZTogMixcbiAgICAgIG1pbjogMCxcbiAgICAgIGRlZmF1bHRWYWx1ZTogMSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIGxpc3RfcHJpY2U6IEZpZWxkLmN1cnJlbmN5KHtcbiAgICAgIGxhYmVsOiAnTGlzdCBQcmljZScsXG4gICAgICBncm91cDogJ3ByaWNpbmcnLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjogXCJBdXRvLXBvcHVsYXRlZCBmcm9tIHRoZSBwcm9kdWN0J3MgTGlzdCBQcmljZS5cIixcbiAgICB9KSxcblxuICAgIHVuaXRfcHJpY2U6IEZpZWxkLmN1cnJlbmN5KHtcbiAgICAgIGxhYmVsOiAnU2FsZXMgUHJpY2UnLFxuICAgICAgZ3JvdXA6ICdwcmljaW5nJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBkZXNjcmlwdGlvbjogJ05lZ290aWF0ZWQgdW5pdCBwcmljZSAobWF5IGRpZmZlciBmcm9tIGxpc3QgcHJpY2UpJyxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIGRpc2NvdW50OiBGaWVsZC5wZXJjZW50KHtcbiAgICAgIGxhYmVsOiAnRGlzY291bnQgJScsXG4gICAgICBncm91cDogJ3ByaWNpbmcnLFxuICAgICAgc2NhbGU6IDIsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEwMCxcbiAgICAgIGRlZmF1bHRWYWx1ZTogMCxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIHRvdGFsX3ByaWNlOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnVG90YWwnLFxuICAgICAgZ3JvdXA6ICdwcmljaW5nJyxcbiAgICAgIGV4cHJlc3Npb246IEZgcmVjb3JkLnF1YW50aXR5ICogcmVjb3JkLnVuaXRfcHJpY2UgKiAoMSAtIHJlY29yZC5kaXNjb3VudCAvIDEwMClgLFxuICAgIH0pLFxuXG4gICAgbGluZV9udW1iZXI6IEZpZWxkLm51bWJlcih7XG4gICAgICBsYWJlbDogJ0xpbmUgIycsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIHNjYWxlOiAwLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgfSksXG4gIH0sXG5cbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAndW5pdF9wcmljZV9wb3NpdGl2ZScsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ1NhbGVzIHByaWNlIGNhbm5vdCBiZSBuZWdhdGl2ZScsXG4gICAgICAvLyBCb3RoIGd1YXJkcyBhcmUgbG9hZC1iZWFyaW5nLCBub3QgZGVmZW5zaXZlIG5vaXNlLiBgaGFzKC4uLilgIGFuc3dlcnNcbiAgICAgIC8vIFwiaXMgdGhlIGtleSBwcmVzZW50IGF0IGFsbFwiOiBvbiB1cGRhdGUgdGhlIHByZWRpY2F0ZSBzZWVzXG4gICAgICAvLyBgey4uLnByZXZpb3VzLCAuLi5kYXRhfWAsIGFuZCBhIGRyaXZlciB0aGF0IHN0b3JlcyBvbmx5IHdyaXR0ZW4gY29sdW1uc1xuICAgICAgLy8gcmV0dXJucyBubyBrZXksIHdoaWNoIGFib3J0cyB0aGUgd2hvbGUgcHJlZGljYXRlIGFuZCBzaWxlbnRseSBza2lwcyB0aGVcbiAgICAgIC8vIHJ1bGUgKCM2MzApLiBgIT0gbnVsbGAgYW5zd2VycyBcImRvZXMgaXQgaG9sZCBhIHZhbHVlXCI6IHN0cmljdCBDRUxcbiAgICAgIC8vIEFCT1JUUyBvbiBgbnVsbCA8IDBgIGluc3RlYWQgb2YgZXZhbHVhdGluZyBpdCBmYWxzZSwgc28gdGhlIHVuZ3VhcmRlZFxuICAgICAgLy8gZm9ybSBsZWZ0IHRoaXMgcnVsZSBpbmVydCBvbiBhIGJsYW5rIHByaWNlIFx1MjAxNCBpdCBuZXZlciBmaXJlZCBhdCBhbGwsXG4gICAgICAvLyB3aGljaCBpcyB0aGUgb3Bwb3NpdGUgb2Ygd2hhdCBhIHZhbGlkYXRpb24gaXMgZm9yLiBUaGUgYG51bGxgIGhhemFyZCBpc1xuICAgICAgLy8gd3JpdHRlbiB1cCBhdCBgYWNjb3VudC5vYmplY3QudHM6MjQ0LTI0NWA7IHRoZSBzYW1lLW5hbWVkIHJ1bGUgaW5cbiAgICAgIC8vIGBxdW90ZV9saW5lX2l0ZW0ub2JqZWN0LnRzYCBoYXMgY2FycmllZCB0aGF0IGd1YXJkIGFsbCBhbG9uZy5cbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnVuaXRfcHJpY2UpICYmIHJlY29yZC51bml0X3ByaWNlICE9IG51bGwgJiYgcmVjb3JkLnVuaXRfcHJpY2UgPCAwYCxcbiAgICB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHMvcHJvZHVjdC5vYmplY3QudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9wcm9kdWN0Lm9iamVjdC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgT2JqZWN0U2NoZW1hLCBGaWVsZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgRiwgUCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcblxuLyoqXG4gKiBQcm9kdWN0IE9iamVjdFxuICogUmVwcmVzZW50cyBwcm9kdWN0cy9zZXJ2aWNlcyBvZmZlcmVkIGJ5IHRoZSBjb21wYW55XG4gKi9cbmV4cG9ydCBjb25zdCBQcm9kdWN0ID0gT2JqZWN0U2NoZW1hLmNyZWF0ZSh7XG4gIG5hbWU6ICdjcm1fcHJvZHVjdCcsXG4gIGxhYmVsOiAnUHJvZHVjdCcsXG4gIHBsdXJhbExhYmVsOiAnUHJvZHVjdHMnLFxuICBpY29uOiAnYm94JyxcbiAgZGVzY3JpcHRpb246ICdQcm9kdWN0cyBhbmQgc2VydmljZXMgb2ZmZXJlZCBieSB0aGUgY29tcGFueScsXG5cbiAgLy8gQURSLTAwOTAgRDEvRDc6IE9XRCBpcyBhbiBhdXRob3JlZCBkZWNpc2lvbi4gUHJvZHVjdCBjYXRhbG9nIGlzIG9yZy12aXNpYmxlOyBvbmx5IG93bmVycyBlZGl0LlxuICBzaGFyaW5nTW9kZWw6ICdwdWJsaWNfcmVhZCcsXG4gIC8vIEFEUi0wMDc5OiByZW5kZXItb25seSBgdGl0bGVGb3JtYXRgIHJldGlyZWQgaW4gZmF2b3Igb2YgYG5hbWVGaWVsZGAsXG4gIC8vIHdoaWNoIG5hbWVzIGEgcmVhbCBmaWVsZC4gVGhlIGZvcm1lciB0ZW1wbGF0ZSBjb21wb3NlZCB0d28gbG9jYWwgZmllbGRzLCBzb1xuICAvLyBhIGBkaXNwbGF5X3RpdGxlYCBmb3JtdWxhIGZpZWxkIHJlcHJvZHVjZXMgaXQgZm9yIHRoZSByZWNvcmQgdGl0bGUuXG4gIG5hbWVGaWVsZDogJ2Rpc3BsYXlfdGl0bGUnLFxuICAvLyBFeHBsaWNpdCBzZWFyY2ggdGFyZ2V0cyAoQURSLTAwNjEpLiBSRVFVSVJFRCBiZWNhdXNlIG5hbWVGaWVsZCBpcyBhXG4gIC8vIEZPUk1VTEEgKGRpc3BsYXlfdGl0bGUvZnVsbF9uYW1lKTogd2l0aG91dCB0aGlzLCAkc2VhcmNoIGF1dG8tZGVmYXVsdHMgdG9cbiAgLy8gdGhlIGZvcm11bGEgZmllbGQsIHdoaWNoIGlzbid0IGEgcmVhbCBjb2x1bW4sIHNvIHRoZSBsb29rdXAgcGlja2VyICsgZ2xvYmFsXG4gIC8vIHNlYXJjaCBzaWxlbnRseSByZXR1cm4gemVyby4gVGhlc2UgYXJlIHJlYWwsIGluZGV4ZWQgY29sdW1ucy5cbiAgc2VhcmNoYWJsZUZpZWxkczogWyduYW1lJywgJ3Byb2R1Y3RfY29kZScsICdza3UnXSxcbiAgaGlnaGxpZ2h0RmllbGRzOiBbJ3Byb2R1Y3RfY29kZScsICduYW1lJywgJ2NhdGVnb3J5JywgJ2lzX2FjdGl2ZSddLFxuXG4gIGZpZWxkR3JvdXBzOiBbXG4gICAgeyBrZXk6ICdiYXNpYycsICAgIGxhYmVsOiAnUHJvZHVjdCBJbmZvcm1hdGlvbicsIGljb246ICdpbmZvJyB9LFxuICAgIHsga2V5OiAncHJpY2luZycsICBsYWJlbDogJ1ByaWNpbmcnLCAgICAgICAgICAgICBpY29uOiAnZG9sbGFyLXNpZ24nIH0sXG4gICAgeyBrZXk6ICdtZXRhZGF0YScsIGxhYmVsOiAnUmVzb3VyY2VzJywgICAgICAgICAgIGljb246ICdsaW5rJywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gQXV0b051bWJlciBmaWVsZCAtIFVuaXF1ZSBwcm9kdWN0IGlkZW50aWZpZXJcbiAgICBwcm9kdWN0X2NvZGU6IEZpZWxkLmF1dG9udW1iZXIoe1xuICAgICAgbGFiZWw6ICdQcm9kdWN0IENvZGUnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBmb3JtYXQ6ICdQUkQtezAwMDB9JyxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBCYXNpYyBJbmZvcm1hdGlvblxuICAgIG5hbWU6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdQcm9kdWN0IE5hbWUnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG1heExlbmd0aDogMjU1LFxuICAgIH0pLFxuXG4gICAgLy8gQURSLTAwNzkgcmVjb3JkIHRpdGxlICh3YXMgdGl0bGVGb3JtYXQgJ3twcm9kdWN0X2NvZGV9IC0ge25hbWV9JykuXG4gICAgZGlzcGxheV90aXRsZTogRmllbGQuZm9ybXVsYSh7XG4gICAgICBsYWJlbDogJ0Rpc3BsYXkgVGl0bGUnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBleHByZXNzaW9uOiBGYHJlY29yZC5wcm9kdWN0X2NvZGUgKyBcIiAtIFwiICsgcmVjb3JkLm5hbWVgLFxuICAgIH0pLFxuXG4gICAgZGVzY3JpcHRpb246IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGxhYmVsOiAnRGVzY3JpcHRpb24nLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICAvLyBDYXRlZ29yaXphdGlvblxuICAgIGNhdGVnb3J5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdDYXRlZ29yeScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ1NvZnR3YXJlJywgdmFsdWU6ICdzb2Z0d2FyZScsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ0hhcmR3YXJlJywgdmFsdWU6ICdoYXJkd2FyZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1NlcnZpY2UnLCB2YWx1ZTogJ3NlcnZpY2UnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdWJzY3JpcHRpb24nLCB2YWx1ZTogJ3N1YnNjcmlwdGlvbicgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1cHBvcnQnLCB2YWx1ZTogJ3N1cHBvcnQnIH0sXG4gICAgICBdXG4gICAgfSksXG4gICAgXG4gICAgZmFtaWx5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdQcm9kdWN0IEZhbWlseScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0VudGVycHJpc2UgU29sdXRpb25zJywgdmFsdWU6ICdlbnRlcnByaXNlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU01CIFNvbHV0aW9ucycsIHZhbHVlOiAnc21iJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUHJvZmVzc2lvbmFsIFNlcnZpY2VzJywgdmFsdWU6ICdzZXJ2aWNlcycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0Nsb3VkIFNlcnZpY2VzJywgdmFsdWU6ICdjbG91ZCcgfSxcbiAgICAgIF1cbiAgICB9KSxcbiAgICBcbiAgICAvLyBQcmljaW5nXG4gICAgbGlzdF9wcmljZTogRmllbGQuY3VycmVuY3koeyBcbiAgICAgIGxhYmVsOiAnTGlzdCBQcmljZScsXG4gICAgICBncm91cDogJ3ByaWNpbmcnLFxuICAgICAgbWluOiAwLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICB9KSxcbiAgICBcbiAgICBjb3N0OiBGaWVsZC5jdXJyZW5jeSh7IFxuICAgICAgbGFiZWw6ICdDb3N0JyxcbiAgICAgIGdyb3VwOiAncHJpY2luZycsXG4gICAgICBtaW46IDAsXG4gICAgfSksXG4gICAgXG4gICAgLy8gU0tVXG4gICAgLy9cbiAgICAvLyBgcXVhbnRpdHlfb25faGFuZGAgLyBgcmVvcmRlcl9wb2ludGAgd2VyZSByZW1vdmVkIHdpdGggdGhlIHJlc3Qgb2YgdGhlXG4gICAgLy8gaW52ZW50b3J5IHN1cmZhY2U6IG5vdGhpbmcgaW4gdGhpcyBhcHAgZGVjcmVtZW50ZWQgc3RvY2ssIGFuZCB0aGUgXCJMb3dcbiAgICAvLyBTdG9ja1wiIHZpZXcgdGhleSBmZWQgY29tcGFyZWQgYWdhaW5zdCBhIGhhcmRjb2RlZCAxMCByYXRoZXIgdGhhbiB0aGVcbiAgICAvLyByZW9yZGVyIHBvaW50IGJlc2lkZSBpdC4gSG90Q1JNIHNlbGxzIGZyb20gYSBjYXRhbG9nOyB3YXJlaG91c2Ugc3RhdGVcbiAgICAvLyBiZWxvbmdzIHRvIHRoZSBzeXN0ZW0gb2YgcmVjb3JkIHRoYXQgb3ducyBpdC5cbiAgICBza3U6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdTS1UnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBtYXhMZW5ndGg6IDUwLFxuICAgICAgdW5pcXVlOiB0cnVlLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFN0YXR1c1xuICAgIGlzX2FjdGl2ZTogRmllbGQuYm9vbGVhbih7XG4gICAgICBsYWJlbDogJ0FjdGl2ZScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogdHJ1ZSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBSZWxhdGlvbnNoaXBzXG4gICAgcHJvZHVjdF9tYW5hZ2VyOiBGaWVsZC5sb29rdXAoJ3N5c191c2VyJywge1xuICAgICAgbGFiZWw6ICdQcm9kdWN0IE1hbmFnZXInLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG4gICAgXG4gICAgLy8gSW1hZ2VzIGFuZCBBc3NldHNcbiAgICAvLyBgYWNjZXB0YCAvIGBtYXhTaXplYCBhcmUgZGVjbGFyYWJsZSBBTkQgc2VydmVyLWVuZm9yY2VkIGZyb21cbiAgICAvLyBAb2JqZWN0c3RhY2sgMTcgKEFEUi0wMTA0IEQzIHdhdmUgMikuIEJlZm9yZSB0aGF0IHRoZSB1cGxvYWQgd2lkZ2V0IHJlYWRcbiAgICAvLyB0aGVtIGJ1dCBgRmllbGRTY2hlbWFgIGRyb3BwZWQgdGhlbSBhdCBwYXJzZSwgc28gdGhlIGNvbnN0cmFpbnQgZXhpc3RlZFxuICAgIC8vIG9ubHkgaW4gdGhlIGJyb3dzZXIgYW5kIGFueSBkaXJlY3QgQVBJIGNhbGxlciB3YWxrZWQgcGFzdCBpdC5cbiAgICBpbWFnZTogRmllbGQuaW1hZ2Uoe1xuICAgICAgbGFiZWw6ICdQcm9kdWN0IEltYWdlJyxcbiAgICAgIGdyb3VwOiAnbWV0YWRhdGEnLFxuICAgICAgYWNjZXB0OiBbJ2ltYWdlL3BuZycsICdpbWFnZS9qcGVnJywgJ2ltYWdlL3dlYnAnXSxcbiAgICAgIG1heFNpemU6IDUgKiAxMDI0ICogMTAyNCxcbiAgICB9KSxcblxuICAgIGRhdGFzaGVldDogRmllbGQuZmlsZSh7XG4gICAgICBsYWJlbDogJ0RhdGFzaGVldCcsXG4gICAgICBncm91cDogJ21ldGFkYXRhJyxcbiAgICAgIGFjY2VwdDogWydhcHBsaWNhdGlvbi9wZGYnXSxcbiAgICAgIG1heFNpemU6IDIwICogMTAyNCAqIDEwMjQsXG4gICAgfSksXG5cbiAgICAvLyBgYmlsbGluZ190eXBlYCBhbmQgYHVuaXRfb2ZfbWVhc3VyZWAgd2VyZSByZW1vdmVkIHdpdGggdGhlIHRheCBmbGFnOiBib3RoXG4gICAgLy8gd2VyZSBzZWVkZWQgb24gYWxsIDEzIGNhdGFsb2cgcHJvZHVjdHMgYW5kIHJlYWQgYnkgbm90aGluZyBcdTIwMTQgbm8gcXVvdGVcbiAgICAvLyB0b3RhbCwgbm8gcmV2ZW51ZS1yZWNvZ25pdGlvbiByZXBvcnQgYW5kIG5vIGxpbmUtaXRlbSBiZWhhdmlvdXIgZXZlclxuICAgIC8vIGNvbnN1bHRlZCBlaXRoZXIuIEEgcGlja2xpc3QgdGhhdCBvbmx5IGV2ZXIgcmVuZGVycyBpdHNlbGYgaXMgYVxuICAgIC8vIG1haW50ZW5hbmNlIG9ibGlnYXRpb24gKGZvdXIgbG9jYWxlcywgYW4gaW1wb3J0IGNvbHVtbiwgZXZlcnkgZnV0dXJlXG4gICAgLy8gbWlncmF0aW9uKSBjaGFyZ2VkIGFnYWluc3QgYSBjYXBhYmlsaXR5IHRoYXQgZG9lcyBub3QgZXhpc3QuXG4gIH0sXG4gIFxuICAvLyBEYXRhYmFzZSBpbmRleGVzXG4gIC8vXG4gIC8vIE5vIGB7IGZpZWxkczogWydza3UnXSwgdW5pcXVlOiB0cnVlIH1gIGhlcmU6IHRoZSBmaWVsZC1sZXZlbCBgdW5pcXVlOiB0cnVlYFxuICAvLyBhbHJlYWR5IGJ1aWxkcyB0aGUgdGVuYW50IGNvbXBvc2l0ZSBgKG9yZ2FuaXphdGlvbl9pZCwgc2t1KWAgc2luY2VcbiAgLy8gZnJhbWV3b3JrICMzNjk2LiBEZWNsYXJpbmcgdGhlIHNpbmdsZS1jb2x1bW4gaW5kZXggdG9vIG1hZGUgdGhlXG4gIC8vIHBsYXRmb3JtLXdpZGUgY29uc3RyYWludCB3aW4gYW5kIGxlZnQgdGhlIHBlci10ZW5hbnQgb25lIHVucmVhY2hhYmxlXG4gIC8vIChmcmFtZXdvcmsjMzk5MSkgXHUyMDE0IGFuIFNLVSBpcyB1bmlxdWUgaW5zaWRlIGEgY2F0YWxvZ3VlLCBhbmQgdHdvXG4gIC8vIG9yZ2FuaXphdGlvbnMgbWF5IGxlZ2l0aW1hdGVseSBib3RoIHN0b2NrIFwiQUJDLTEyM1wiLlxuICBpbmRleGVzOiBbXG4gICAgeyBmaWVsZHM6IFsnbmFtZSddIH0sXG4gICAgeyBmaWVsZHM6IFsnY2F0ZWdvcnknXSB9LFxuICAgIHsgZmllbGRzOiBbJ2lzX2FjdGl2ZSddIH0sXG4gIF0sXG4gIFxuICAvLyBFbmFibGUgYWR2YW5jZWQgZmVhdHVyZXNcbiAgLy8gQVBJIHN1cmZhY2UuIEhpc3RvcnkgXHUyMTkyIEZpZWxkLnRyYWNrSGlzdG9yeSAoQURSLTAwNTIpLlxuICBlbmFibGU6IHtcbiAgICBhcGlFbmFibGVkOiB0cnVlLFxuICAgIGFwaU1ldGhvZHM6IFsnZ2V0JywgJ2xpc3QnLCAnY3JlYXRlJywgJ3VwZGF0ZScsICdkZWxldGUnXSxcbiAgfSxcbiAgXG4gIC8vIFZhbGlkYXRpb24gUnVsZXNcbiAgLy9cbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAncHJpY2VfcG9zaXRpdmUnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdMaXN0IFByaWNlIG11c3QgYmUgcG9zaXRpdmUnLFxuICAgICAgLy8gVHdvIGRpc3RpbmN0IGd1YXJkcywgYm90aCByZXF1aXJlZC4gYGhhcyguLi4pYCBhbnN3ZXJzIFwiaXMgdGhlIGtleVxuICAgICAgLy8gdGhlcmUgYXQgYWxsXCIgXHUyMDE0IG9uIHVwZGF0ZSB0aGUgbWVyZ2VkIHJlY29yZCBpcyBgey4uLnByZXZpb3VzLCAuLi5kYXRhfWBcbiAgICAgIC8vIGFuZCBhIGRyaXZlciB0aGF0IHN0b3JlcyBvbmx5IHdyaXR0ZW4gY29sdW1ucyBoYW5kcyBiYWNrIG5vIGtleSwgd2hpY2hcbiAgICAgIC8vIGFib3J0cyB0aGUgd2hvbGUgcHJlZGljYXRlICgjNjMwKS4gYCE9IG51bGxgIHRoZW4gYW5zd2VycyBcImRvZXMgaXQgaG9sZFxuICAgICAgLy8gYSB2YWx1ZVwiIFx1MjAxNCBzdHJpY3QgQ0VMIGNhbm5vdCBjb21wYXJlIGR5bjxudWxsPiA8IGludCwgdGhlIGhhemFyZFxuICAgICAgLy8gd3JpdHRlbiB1cCBvbiBgYWNjb3VudC5vYmplY3QudHNgLiBgbGlzdF9wcmljZWAgaXMgYHJlcXVpcmVkYCwgYnV0IHRoZVxuICAgICAgLy8gcnVsZSBhbHNvIHJ1bnMgb24gcGFydGlhbCB1cGRhdGVzIHRoYXQgb21pdCBpdC5cbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmxpc3RfcHJpY2UpICYmIHJlY29yZC5saXN0X3ByaWNlICE9IG51bGwgJiYgcmVjb3JkLmxpc3RfcHJpY2UgPCAwYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdjb3N0X2xlc3NfdGhhbl9wcmljZScsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiAnQ29zdCBzaG91bGQgYmUgbGVzcyB0aGFuIExpc3QgUHJpY2UnLFxuICAgICAgLy8gQm90aCBvcGVyYW5kcyBuZWVkIGJvdGggZ3VhcmRzOiBgY29zdGAgaXMgb3B0aW9uYWwgYW5kIGFic2VudCBvbiBldmVyeVxuICAgICAgLy8gc2VlZGVkIHByb2R1Y3QsIHNvIHRoaXMgd2FybmluZyBoYXMgbmV2ZXIgb25jZSBldmFsdWF0ZWQuXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5jb3N0KSAmJiByZWNvcmQuY29zdCAhPSBudWxsICYmIGhhcyhyZWNvcmQubGlzdF9wcmljZSkgJiYgcmVjb3JkLmxpc3RfcHJpY2UgIT0gbnVsbCAmJiByZWNvcmQuY29zdCA+PSByZWNvcmQubGlzdF9wcmljZWAsXG4gICAgfSxcbiAgXSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL3F1b3RlLm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL3F1b3RlLm9iamVjdC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgT2JqZWN0U2NoZW1hLCBGaWVsZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgRiwgUCwgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgUEFZTUVOVF9URVJNU19PUFRJT05TIH0gZnJvbSAnLi4vLi4vc2FsZXMvb2JqZWN0cy9fcGlja2xpc3RzJztcbmltcG9ydCB7IFFVT1RFX0RJU0NPVU5UX0NFSUxJTkcgfSBmcm9tICcuLi8uLi9zYWxlcy9vYmplY3RzL190aHJlc2hvbGRzJztcblxuLyoqXG4gKiBRdW90ZSBPYmplY3RcbiAqIFJlcHJlc2VudHMgcHJpY2UgcXVvdGVzIHNlbnQgdG8gY3VzdG9tZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBRdW90ZSA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX3F1b3RlJyxcbiAgbGFiZWw6ICdRdW90ZScsXG4gIHBsdXJhbExhYmVsOiAnUXVvdGVzJyxcbiAgaWNvbjogJ2ZpbGUtdGV4dCcsXG4gIGRlc2NyaXB0aW9uOiAnUHJpY2UgcXVvdGVzIGZvciBjdXN0b21lcnMnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIE1hc3Rlci1kZXRhaWwgY2hpbGQgb2ZcbiAgLy8gY3JtX2FjY291bnQgXHUyMDE0IGEgcXVvdGUgaXMgcmVhY2hhYmxlIGJ5IHdob2V2ZXIgY2FuIHJlYWNoIGl0cyBhY2NvdW50LCBhbmRcbiAgLy8gaXRzIGxpbmUgaXRlbXMgZGVyaXZlIG9uZSBsZXZlbCBmdXJ0aGVyICgjNTQ5LCBydWxpbmcgMjAyNi0wOC0zMSkuXG4gIHNoYXJpbmdNb2RlbDogJ2NvbnRyb2xsZWRfYnlfcGFyZW50JyxcbiAgLy8gQURSLTAwNzk6IHJlbmRlci1vbmx5IGB0aXRsZUZvcm1hdGAgcmV0aXJlZCBpbiBmYXZvciBvZiBgbmFtZUZpZWxkYCxcbiAgLy8gd2hpY2ggbmFtZXMgYSByZWFsIGZpZWxkLiBUaGUgZm9ybWVyIHRlbXBsYXRlIGNvbXBvc2VkIHR3byBsb2NhbCBmaWVsZHMsIHNvXG4gIC8vIGEgYGRpc3BsYXlfdGl0bGVgIGZvcm11bGEgZmllbGQgcmVwcm9kdWNlcyBpdCBmb3IgdGhlIHJlY29yZCB0aXRsZS5cbiAgbmFtZUZpZWxkOiAnZGlzcGxheV90aXRsZScsXG4gIC8vIEV4cGxpY2l0IHNlYXJjaCB0YXJnZXRzIChBRFItMDA2MSkuIFJFUVVJUkVEIGJlY2F1c2UgbmFtZUZpZWxkIGlzIGFcbiAgLy8gRk9STVVMQSAoZGlzcGxheV90aXRsZS9mdWxsX25hbWUpOiB3aXRob3V0IHRoaXMsICRzZWFyY2ggYXV0by1kZWZhdWx0cyB0b1xuICAvLyB0aGUgZm9ybXVsYSBmaWVsZCwgd2hpY2ggaXNuJ3QgYSByZWFsIGNvbHVtbiwgc28gdGhlIGxvb2t1cCBwaWNrZXIgKyBnbG9iYWxcbiAgLy8gc2VhcmNoIHNpbGVudGx5IHJldHVybiB6ZXJvLiBUaGVzZSBhcmUgcmVhbCwgaW5kZXhlZCBjb2x1bW5zLlxuICBzZWFyY2hhYmxlRmllbGRzOiBbJ25hbWUnLCAncXVvdGVfbnVtYmVyJ10sXG4gIGhpZ2hsaWdodEZpZWxkczogWydxdW90ZV9udW1iZXInLCAnbmFtZScsICdjcm1fYWNjb3VudCcsICdzdGF0dXMnLCAndG90YWxfcHJpY2UnXSxcblxuICBmaWVsZEdyb3VwczogW1xuICAgIHsga2V5OiAnYmFzaWMnLCAgICAgbGFiZWw6ICdRdW90ZSBJbmZvcm1hdGlvbicsIGljb246ICdpbmZvJyB9LFxuICAgIHsga2V5OiAncHJpY2luZycsICAgbGFiZWw6ICdQcmljaW5nJywgICAgICAgICAgIGljb246ICdkb2xsYXItc2lnbicgfSxcbiAgICB7IGtleTogJ3Rlcm1zJywgICAgIGxhYmVsOiAnVGVybXMgJiBWYWxpZGl0eScsICBpY29uOiAnY2FsZW5kYXInIH0sXG4gICAgeyBrZXk6ICdhZGRyZXNzJywgICBsYWJlbDogJ0FkZHJlc3NlcycsICAgICAgICAgaWNvbjogJ21hcC1waW4nLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ3N5c3RlbScsICAgIGxhYmVsOiAnU3lzdGVtJywgICAgICAgICAgICBpY29uOiAnZGF0YWJhc2UnLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgXSxcblxuICBmaWVsZHM6IHtcbiAgICAvLyBQbGF0Zm9ybSBvd25lcnNoaXAgYW5jaG9yIFx1MjAxNCBjYW5vbmljYWwgbm90ZSBpbiBgYWNjb3VudC5vYmplY3QudHNgICgjNTQ4KS5cbiAgICBvd25lcl9pZDogRmllbGQubG9va3VwKCdzeXNfdXNlcicsIHtcbiAgICAgIGxhYmVsOiAnUXVvdGUgT3duZXInLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBzeXN0ZW06IHRydWUsXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBBdXRvTnVtYmVyIGZpZWxkXG4gICAgcXVvdGVfbnVtYmVyOiBGaWVsZC5hdXRvbnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnUXVvdGUgTnVtYmVyJyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgZm9ybWF0OiAnUVRFLXswMDAwfScsXG4gICAgfSksXG4gICAgXG4gICAgLy8gQmFzaWMgSW5mb3JtYXRpb25cbiAgICBuYW1lOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnUXVvdGUgTmFtZScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgbWF4TGVuZ3RoOiAyNTUsXG4gICAgfSksXG5cbiAgICAvLyBBRFItMDA3OSByZWNvcmQgdGl0bGUgKHdhcyB0aXRsZUZvcm1hdCAne3F1b3RlX251bWJlcn0gLSB7bmFtZX0nKS5cbiAgICBkaXNwbGF5X3RpdGxlOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnRGlzcGxheSBUaXRsZScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGV4cHJlc3Npb246IEZgcmVjb3JkLnF1b3RlX251bWJlciArIFwiIC0gXCIgKyByZWNvcmQubmFtZWAsXG4gICAgfSksXG5cbiAgICAvLyBSZWxhdGlvbnNoaXBzIFx1MjAxNCB0aGUgbWFzdGVyIHRoZSBPV0QgZGVyaXZlcyBmcm9tIChhdXRob3JlZCwgbm90IHBvc2l0aW9uYWwpLlxuICAgIGNybV9hY2NvdW50OiBGaWVsZC5tYXN0ZXJEZXRhaWwoJ2NybV9hY2NvdW50Jywge1xuICAgICAgbGFiZWw6ICdBY2NvdW50JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZScsXG4gICAgfSksXG4gICAgXG4gICAgY3JtX2NvbnRhY3Q6IEZpZWxkLmxvb2t1cCgnY3JtX2NvbnRhY3QnLCB7XG4gICAgICBsYWJlbDogJ0NvbnRhY3QnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICAvLyBPcHRpb25hbCBBVCBEUkFGVCBUSU1FLCByZXF1aXJlZCBmcm9tIGBwcmVzZW50ZWRgIG9uICgjMTAxNykuXG4gICAgICAvL1xuICAgICAgLy8gcXVvdGVfZ2VuZXJhdGlvbiBtYXBzIHRoZSBvcHBvcnR1bml0eSdzIGBwcmltYXJ5X2NvbnRhY3RgLCB3aGljaCBpc1xuICAgICAgLy8gaXRzZWxmIG9wdGlvbmFsIFx1MjAxNCBhIGZsYXQgYHJlcXVpcmVkOiB0cnVlYCBoZXJlIG1lYW50IGNvbnRhY3QtbGVzc1xuICAgICAgLy8gb3Bwb3J0dW5pdGllcyBjb3VsZCBuZXZlciBkcmFmdCBhIHF1b3RlIGF0IGFsbC4gU28gdGhlIHJlY2lwaWVudCBpc1xuICAgICAgLy8gbmFpbGVkIGRvd24gYnkgdGhlIHRpbWUgYSBxdW90ZSBpcyBQUkVTRU5URUQsIG5vdCB3aGVuIGl0IGlzIGRyYWZ0ZWQuXG4gICAgICAvLyBUaGF0IHNlbnRlbmNlIHNhdCBpbiB0aGlzIGNvbW1lbnQgZm9yIHRoZSBmaWVsZCdzIHdob2xlIGxpZmUgd2l0aFxuICAgICAgLy8gbm90aGluZyBlbmZvcmNpbmcgaXQ6IG5vIHJ1bGUgc3RvcHBlZCBhIGNvbnRhY3QtbGVzcyBxdW90ZSByZWFjaGluZ1xuICAgICAgLy8gYHByZXNlbnRlZGAgb3IgYGFjY2VwdGVkYCwgYW5kIHRoZSBiaWxsIGNhbWUgZHVlIG9uZSBvYmplY3Qgb3Zlci5cbiAgICAgIC8vIGBjcm1fY29udHJhY3QuY3JtX2NvbnRhY3RgIGlzIGByZXF1aXJlZGAgKyBgbm90TnVsbGAsIHNvIGFjY2VwdGluZyBzdWNoXG4gICAgICAvLyBhIHF1b3RlIG1hZGUgYHF1b3RlX29uX2FjY2VwdGVkYCBmYWlsIHRvIGRyYWZ0IHRoZSBjb250cmFjdCBcdTIwMTQgc2luY2VcbiAgICAgIC8vICM3MTQvIzEwMTMgdGhhdCBmYWlsdXJlIGlzIGhvbmVzdCBhbmQgbm8gbG9uZ2VyIHN3YWxsb3dzIHRoZSBjbG9zZS13b25cbiAgICAgIC8vIGxlZywgYnV0IHRoZSBob29rIGlzIGBhc3luY2AgKyBgb25FcnJvcjogJ2xvZydgLCBzbyB0aGUgYWNjZXB0aW5nIHdyaXRlXG4gICAgICAvLyBzdGlsbCBhbnN3ZXJzIDIwMCBhbmQgdGhlIG9ubHkgZXZpZGVuY2UgaXMgYSBzZXJ2ZXIgbG9nIG5vYm9keSByZWFkcy5cbiAgICAgIC8vIGByZXF1aXJlZFdoZW5gIG1vdmVzIHRoZSBzYW1lIHJlZnVzYWwgdG8gdGhlIHN5bmNocm9ub3VzLCBzb21lb25lLWlzLVxuICAgICAgLy8gd2F0Y2hpbmcgbW9tZW50OiB0aGUgcmVwIGlzIHRvbGQgb24gdGhlIHdyaXRlIHRoYXQgdHVybnMgdGhlIHF1b3RlXG4gICAgICAvLyBvdXR3YXJkLCBhZ2FpbnN0IHRoZSBmaWVsZCwgd2l0aCB0aGUgcXVvdGUgc3RpbGwgZWRpdGFibGUuXG4gICAgICAvL1xuICAgICAgLy8gV0hZIEVYQUNUTFkgYHByZXNlbnRlZGAgKyBgYWNjZXB0ZWRgLCBhbmQgbm90IHRoZSBvdGhlciB0d28gdGVybWluYWxcbiAgICAgIC8vIHN0YXRlcy4gQm90aCBvZiB0aG9zZSBhcmUgcmVhY2hhYmxlIFdJVEhPVVQgdGhlIHF1b3RlIGV2ZXIgYmVpbmcgc2VudFxuICAgICAgLy8gKHNlZSB0aGUgYHF1b3RlX3N0YXR1c19wcm9ncmVzc2lvbmAgdHJhbnNpdGlvbnMgYmVsb3cpOlxuICAgICAgLy8gICBcdTIwMjIgYGV4cGlyZWRgIFx1MjAxNCB0aGUgYHF1b3RlX2V4cGlyYXRpb25gIGZsb3cgc3dlZXBzIG9uIGBleHBpcmF0aW9uX2RhdGVgXG4gICAgICAvLyAgICAgYWxvbmUgYW5kIGV4cGlyZXMgbmV2ZXItc2VudCBkcmFmdHMgYXMgcmVhZGlseSBhcyBwcmVzZW50ZWQgb25lcy5cbiAgICAgIC8vICAgICBSZXF1aXJpbmcgYSByZWNpcGllbnQgdGhlcmUgd291bGQgbWFrZSBhIG5pZ2h0bHkgc3lzdGVtIHdyaXRlIGZhaWxcbiAgICAgIC8vICAgICBvbiBleGFjdGx5IHRoZSBxdW90ZXMgdGhhdCBoYXZlIG5vIHJlY2lwaWVudCBCRUNBVVNFIG5vYm9keSBzZW50XG4gICAgICAvLyAgICAgdGhlbSwgYW5kIHRoZSBzd2VlcCdzIGBydW5BczogJ3N5c3RlbSdgIHdvdWxkIG5vdCBleGVtcHQgaXQgXHUyMDE0IHRoZVxuICAgICAgLy8gICAgIGdhdGUgYXBwbGllcyBvbiB3cml0ZSwgbm90IG9uIGFjdG9yLlxuICAgICAgLy8gICBcdTIwMjIgYHJlamVjdGVkYCBcdTIwMTQgbGVnYWwgc3RyYWlnaHQgZnJvbSBgaW5fcmV2aWV3YCwgaS5lLiBhIHF1b3RlIGtpbGxlZFxuICAgICAgLy8gICAgIGludGVybmFsbHkgYmVmb3JlIGFueW9uZSBzYXcgaXQuIERlbWFuZGluZyBhIGNvbnRhY3QgdG8gZmlsZSB0aGF0XG4gICAgICAvLyAgICAgdmVyZGljdCBhc2tzIGZvciBhIHJlY2lwaWVudCB0aGUgcXVvdGUgbmV2ZXIgaGFkLlxuICAgICAgLy8gTmVpdGhlciBzdGF0ZSBwYXNzZXMgYW55dGhpbmcgb24gdG8gYSBjb250cmFjdCwgc28gbmVpdGhlciBuZWVkcyBvbmUuXG4gICAgICAvL1xuICAgICAgLy8gXHUyNkEwXHVGRTBGIGBoYXMocmVjb3JkLnN0YXR1cylgIGlzIGxvYWQtYmVhcmluZywgbm90IGRlY29yYXRpb24gXHUyMDE0IHRoZSBzYW1lIHRyYXBcbiAgICAgIC8vIGRvY3VtZW50ZWQgYXQgYGxlYWQub2JqZWN0LnRzYCdzIGR1cGxpY2F0ZSBsb29rdXBzOiBhIGJhcmVcbiAgICAgIC8vIGByZWNvcmQuc3RhdHVzID09IFwicHJlc2VudGVkXCJgIGFib3J0cyB3aXRoIGBObyBzdWNoIGtleWAgb24gYW55IG1lcmdlZFxuICAgICAgLy8gcmVjb3JkIHRoYXQgc2ltcGx5IG9taXRzIHRoZSBjb2x1bW4sIGFuZCB0aGUgZW5naW5lJ3MgYW5zd2VyIHRvIGFcbiAgICAgIC8vIHByZWRpY2F0ZSB0aGF0IGZhaWxzIHRvIGV2YWx1YXRlIGlzIHRvIFNLSVAgaXQgKFwicmVxdWlyZWRXaGVuIGZvclxuICAgICAgLy8gJ2NybV9jb250YWN0JyBmYWlsZWQgdG8gZXZhbHVhdGUgXHUyMDE0IHNraXBwZWRcIikuIFRoZSBydWxlIHdvdWxkIHRoZW4gcmVhZFxuICAgICAgLy8gYXMgZW5mb3JjZWQgYW5kIHJlcXVpcmUgbm90aGluZyBhdCBhbGwuXG4gICAgICAvL1xuICAgICAgLy8gQG9iamVjdHN0YWNrIDEyOiBzdHJpbmdbXSBgcmVmZXJlbmNlRmlsdGVyc2AgaXMgZGVhZCAobm90IHJlYWQgYnkgdGhlXG4gICAgICAvLyBwaWNrZXIpOyBgZGVwZW5kc09uYCBpcyB0aGUgbGl2ZSBjYXNjYWRpbmcgZm9ybSBcdTIwMTQgc2NvcGVzIGNvbnRhY3RzIHRvIHRoZVxuICAgICAgLy8gcXVvdGUncyBgY3JtX2FjY291bnRgIChBRFItMDA0OSkuXG4gICAgICBkZXBlbmRzT246IFsnY3JtX2FjY291bnQnXSxcbiAgICAgIHJlcXVpcmVkV2hlbjogUGBoYXMocmVjb3JkLnN0YXR1cykgJiYgKHJlY29yZC5zdGF0dXMgPT0gXCJwcmVzZW50ZWRcIiB8fCByZWNvcmQuc3RhdHVzID09IFwiYWNjZXB0ZWRcIilgLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdSZXF1aXJlZCBvbmNlIHRoZSBxdW90ZSBpcyBQcmVzZW50ZWQgb3IgQWNjZXB0ZWQgXHUyMDE0IHRoZSBkcmFmdGVkIGNvbnRyYWN0IHRha2VzIGl0cyBQcmltYXJ5IENvbnRhY3QgZnJvbSBoZXJlLicsXG4gICAgfSksXG5cbiAgICBjcm1fb3Bwb3J0dW5pdHk6IEZpZWxkLmxvb2t1cCgnY3JtX29wcG9ydHVuaXR5Jywge1xuICAgICAgbGFiZWw6ICdPcHBvcnR1bml0eScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIC8vIFNjb3BlIG9wcG9ydHVuaXRpZXMgdG8gdGhlIHF1b3RlJ3MgYWNjb3VudCAod2FzIGRlYWQgcmVmZXJlbmNlRmlsdGVycykuXG4gICAgICBkZXBlbmRzT246IFsnY3JtX2FjY291bnQnXSxcbiAgICB9KSxcblxuXG4gICAgLy8gU3RhdHVzXG4gICAgc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdEcmFmdCcsIHZhbHVlOiAnZHJhZnQnLCBjb2xvcjogJyM5OTk5OTknLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdJbiBSZXZpZXcnLCB2YWx1ZTogJ2luX3JldmlldycsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1ByZXNlbnRlZCcsIHZhbHVlOiAncHJlc2VudGVkJywgY29sb3I6ICcjNDE2OUUxJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQWNjZXB0ZWQnLCB2YWx1ZTogJ2FjY2VwdGVkJywgY29sb3I6ICcjMDBBQTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUmVqZWN0ZWQnLCB2YWx1ZTogJ3JlamVjdGVkJywgY29sb3I6ICcjRkYwMDAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRXhwaXJlZCcsIHZhbHVlOiAnZXhwaXJlZCcsIGNvbG9yOiAnIzY2NjY2NicgfSxcbiAgICAgIF0sXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIERhdGVzXG4gICAgcXVvdGVfZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBsYWJlbDogJ1F1b3RlIERhdGUnLFxuICAgICAgZ3JvdXA6ICd0ZXJtcycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgZGVmYXVsdFZhbHVlOiBjZWxgdG9kYXkoKWAsXG4gICAgfSksXG4gICAgXG4gICAgZXhwaXJhdGlvbl9kYXRlOiBGaWVsZC5kYXRlKHtcbiAgICAgIGxhYmVsOiAnRXhwaXJhdGlvbiBEYXRlJyxcbiAgICAgIGdyb3VwOiAndGVybXMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBQcmljaW5nXG4gICAgLy8gc3VidG90YWwvZGlzY291bnRfYW1vdW50L3RvdGFsX3ByaWNlIGFyZSBOT1QgYHJlYWRvbmx5YCwgYW5kIHRoZSB3cml0ZXJcbiAgICAvLyB0aGF0IGRlY2lkZXMgaXQgaXMgdGhlIExJTkUtSVRFTSBST0xMVVAgXHUyMDE0IG5vdCB0aGUgZmxvdyB0aGlzIG5vdGUgdXNlZCB0b1xuICAgIC8vIG5hbWUuIGBxdW90ZV90b3RhbF9yb2xsdXBgIChgcXVvdGVfbGluZV9pdGVtLmhvb2sudHNgKSByZWNvbXB1dGVzIGFsbFxuICAgIC8vIHRocmVlIG9uIGV2ZXJ5IGxpbmUgaW5zZXJ0L3VwZGF0ZS9kZWxldGUgdGhyb3VnaFxuICAgIC8vIGBhcGkub2JqZWN0KCdjcm1fcXVvdGUnKS51cGRhdGUoLi4uKWA6IGEgY3Jvc3MtcmVjb3JkIHdyaXRlIHZpYSBgY3R4LmFwaWAsXG4gICAgLy8gd2hpY2ggaXMgYSBgU2NvcGVkQ29udGV4dGAgb3ZlciB0aGUgQUNUSU5HIFVTRVIncyBjb250ZXh0LiBUaGUga2V5cyBhcmVcbiAgICAvLyB0aGVyZWZvcmUgQ0FMTEVSLXN1cHBsaWVkIHRvIGEgbm9uLWBpc1N5c3RlbWAgVVBEQVRFLCBleGFjdGx5IHdoYXRcbiAgICAvLyBgc3RyaXBSZWFkb25seUZpZWxkc2AgZGVsZXRlcyBcdTIwMTQgd2l0aCBgcmVhZG9ubHlgIG9uLCBhIHF1b3RlJ3MgdG90YWxzIHdvdWxkXG4gICAgLy8gZnJlZXplIGF0IHdoYXRldmVyIHRoZSBmbG93IGZpcnN0IHNlZWRlZCBhbmQgbmV2ZXIgdHJhY2sgaXRzIGxpbmVzIGFnYWluLlxuICAgIC8vIFx1MjZBMFx1RkUwRiBgcXVvdGVfZ2VuZXJhdGlvbmAgd3JpdGVzIHRoZW0gdG9vLCBidXQgYXQgQ1JFQVRFIHRpbWUsIGFuZCB0aGUgc3RyaXBcbiAgICAvLyBpcyBhbiBVUERBVEUtcGF0aCBydWxlIFx1MjAxNCB0aGF0IHdyaXRlIHdvdWxkIHN1cnZpdmUgYHJlYWRvbmx5YCB1bnRvdWNoZWQuXG4gICAgLy8gVGhlIHJldGlyZWQgMTYueCBjbGFpbSByZXN0ZWQgb24gdGhhdCBjcmVhdGUtdGltZSB3cml0ZSwgd2hpY2ggaXMgaG93IHRoaXNcbiAgICAvLyBub3RlIHJlYWNoZWQgYSByaWdodCBjb25jbHVzaW9uIGZyb20gdGhlIHdyb25nIHdyaXRlci5cbiAgICAvLyBNZWFzdXJlZCBpbiBgdGVzdC9yZWFkb25seS13cml0ZS1zZW1hbnRpY3MudGVzdC50c2AgKGluc2VydCBpcyBleGVtcHQpIGFuZFxuICAgIC8vIGB0ZXN0L2FjdGl2aXR5LXJlY2VuY3kudGVzdC50c2AgKHRoZSBgY3R4LmFwaWAgc3RyaXAsIG9uIHRoZSByZWFsIGVuZ2luZSkuXG4gICAgc3VidG90YWw6IEZpZWxkLmN1cnJlbmN5KHsgXG4gICAgICBsYWJlbDogJ1N1YnRvdGFsJyxcbiAgICAgIGdyb3VwOiAncHJpY2luZycsXG4gICAgfSksXG4gICAgXG4gICAgZGlzY291bnQ6IEZpZWxkLnBlcmNlbnQoe1xuICAgICAgbGFiZWw6ICdEaXNjb3VudCAlJyxcbiAgICAgIGdyb3VwOiAncHJpY2luZycsXG4gICAgICBzY2FsZTogMixcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogMTAwLFxuICAgIH0pLFxuICAgIFxuICAgIGRpc2NvdW50X2Ftb3VudDogRmllbGQuY3VycmVuY3koeyBcbiAgICAgIGxhYmVsOiAnRGlzY291bnQgQW1vdW50JyxcbiAgICAgIGdyb3VwOiAncHJpY2luZycsXG4gICAgfSksXG4gICAgXG4gICAgdGF4OiBGaWVsZC5jdXJyZW5jeSh7IFxuICAgICAgbGFiZWw6ICdUYXgnLFxuICAgICAgZ3JvdXA6ICdwcmljaW5nJyxcbiAgICB9KSxcbiAgICBcbiAgICBzaGlwcGluZ19oYW5kbGluZzogRmllbGQuY3VycmVuY3koeyBcbiAgICAgIGxhYmVsOiAnU2hpcHBpbmcgJiBIYW5kbGluZycsXG4gICAgICBncm91cDogJ3ByaWNpbmcnLFxuICAgIH0pLFxuICAgIFxuICAgIHRvdGFsX3ByaWNlOiBGaWVsZC5jdXJyZW5jeSh7IFxuICAgICAgbGFiZWw6ICdUb3RhbCBQcmljZScsXG4gICAgICBncm91cDogJ3ByaWNpbmcnLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFRlcm1zXG4gICAgcGF5bWVudF90ZXJtczogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnUGF5bWVudCBUZXJtcycsXG4gICAgICBncm91cDogJ3Rlcm1zJyxcbiAgICAgIC8vIENhbm9uaWNhbCBzZXQgc2hhcmVkIHdpdGggQ29udHJhY3QgKCM0OTApIFx1MjAxNCBzZWUgX3BpY2tsaXN0cy50cy5cbiAgICAgIG9wdGlvbnM6IFsuLi5QQVlNRU5UX1RFUk1TX09QVElPTlNdLFxuICAgIH0pLFxuICAgIFxuICAgIHNoaXBwaW5nX3Rlcm1zOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnU2hpcHBpbmcgVGVybXMnLFxuICAgICAgZ3JvdXA6ICd0ZXJtcycsXG4gICAgICBtYXhMZW5ndGg6IDI1NSxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBCaWxsaW5nICYgU2hpcHBpbmcgQWRkcmVzc1xuICAgIGJpbGxpbmdfYWRkcmVzczogRmllbGQuYWRkcmVzcyh7XG4gICAgICBsYWJlbDogJ0JpbGxpbmcgQWRkcmVzcycsXG4gICAgICBncm91cDogJ2FkZHJlc3MnLFxuICAgIH0pLFxuXG4gICAgc2hpcHBpbmdfYWRkcmVzczogRmllbGQuYWRkcmVzcyh7XG4gICAgICBsYWJlbDogJ1NoaXBwaW5nIEFkZHJlc3MnLFxuICAgICAgZ3JvdXA6ICdhZGRyZXNzJyxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBOb3Rlc1xuICAgIGRlc2NyaXB0aW9uOiBGaWVsZC5tYXJrZG93bih7XG4gICAgICBsYWJlbDogJ0Rlc2NyaXB0aW9uJyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuICAgIFxuICAgIGludGVybmFsX25vdGVzOiBGaWVsZC50ZXh0YXJlYSh7XG4gICAgICBsYWJlbDogJ0ludGVybmFsIE5vdGVzJyxcbiAgICAgIGdyb3VwOiAnc3lzdGVtJyxcbiAgICB9KSxcbiAgfSxcbiAgXG4gIC8vIERhdGFiYXNlIGluZGV4ZXNcbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ2NybV9hY2NvdW50J10gfSxcbiAgICB7IGZpZWxkczogWydjcm1fb3Bwb3J0dW5pdHknXSB9LFxuICAgIHsgZmllbGRzOiBbJ293bmVyX2lkJ10gfSxcbiAgICB7IGZpZWxkczogWydzdGF0dXMnXSB9LFxuICAgIHsgZmllbGRzOiBbJ3F1b3RlX2RhdGUnXSB9LFxuICBdLFxuICBcbiAgLy8gRW5hYmxlIGFkdmFuY2VkIGZlYXR1cmVzXG4gIC8vIEFQSSBzdXJmYWNlLiBIaXN0b3J5IFx1MjE5MiBGaWVsZC50cmFja0hpc3RvcnkgKEFEUi0wMDUyKS5cbiAgZW5hYmxlOiB7XG4gICAgYXBpRW5hYmxlZDogdHJ1ZSxcbiAgICBhcGlNZXRob2RzOiBbJ2dldCcsICdsaXN0JywgJ2NyZWF0ZScsICd1cGRhdGUnLCAnZGVsZXRlJ10sXG4gICAgLy8gIzYwMiBcdTIwMTQgdGhlIGdlbmVyYXRlZCBxdW90ZSBQREYgYW5kIHRoZSBjdXN0b21lcidzIGNvdW50ZXJzaWduZWQgY29weS5cbiAgICAvLyBTZWUgdGhlIGNhbm9uaWNhbCBjYXBhYmlsaXR5IG5vdGUgaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYC5cbiAgICBmaWxlczogdHJ1ZSxcbiAgfSxcbiAgXG4gIC8vIFZhbGlkYXRpb24gUnVsZXNcbiAgLy9cbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnZXhwaXJhdGlvbl9hZnRlcl9xdW90ZScsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0V4cGlyYXRpb24gRGF0ZSBtdXN0IGJlIGFmdGVyIFF1b3RlIERhdGUnLFxuICAgICAgY29uZGl0aW9uOiBQYGhhcyhyZWNvcmQuZXhwaXJhdGlvbl9kYXRlKSAmJiByZWNvcmQuZXhwaXJhdGlvbl9kYXRlICE9IG51bGwgJiYgaGFzKHJlY29yZC5xdW90ZV9kYXRlKSAmJiByZWNvcmQucXVvdGVfZGF0ZSAhPSBudWxsICYmIHJlY29yZC5leHBpcmF0aW9uX2RhdGUgPD0gcmVjb3JkLnF1b3RlX2RhdGVgLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gIzU5OS4gVGhlIG9ubHkgZGlzY291bnQgY29uc3RyYWludCB0aGlzIG9iamVjdCBldmVyIGhhZCB3YXMgdGhlIGZpZWxkJ3NcbiAgICAgIC8vIG93biBgbWF4OiAxMDBgIFx1MjAxNCB0aGUgYXJpdGhtZXRpYyBkb21haW4gb2YgYSBwZXJjZW50YWdlIFx1MjAxNCBzbyBhIHJlcCBjb3VsZFxuICAgICAgLy8gcHV0IDkwJSBvZmYgYSAkOTlLIGRlYWwgb24gYSBxdW90ZSBhbmQgbm90aGluZyBhbnl3aGVyZSBvYmplY3RlZDogdGhlXG4gICAgICAvLyBhcHByb3ZhbCBmbG93IGtleXMgb24gdGhlIG9wcG9ydHVuaXR5J3MgQU1PVU5ULCBhbmQgJDk5SyBpcyB1bmRlciB0aGVcbiAgICAgIC8vIGxhcmdlLWRlYWwgbGluZS4gVGhpcyBpcyB0aGUgcG9saWN5IGNlaWxpbmcgdGhhdCBjb25zdHJhaW50IG5ldmVyIHdhcy5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgQSBwcmVkaWNhdGUgb2YgYHJlY29yZC5kaXNjb3VudCA+IDEwMGAgaGVyZSB3b3VsZCBiZSBERUFEOiBmaWVsZC1sZXZlbFxuICAgICAgLy8gYm91bmRzIGFyZSBldmFsdWF0ZWQgQkVGT1JFIG9iamVjdCB2YWxpZGF0aW9ucywgc28gYGRpc2NvdW50OiAxNTBgIGlzXG4gICAgICAvLyBhbHJlYWR5IHJlZnVzZWQgYnkgYG1heDogMTAwYCB3aXRoIGBjb2RlOiAnbWF4X3ZhbHVlJ2AgYW5kIHRoZSBtZXNzYWdlXG4gICAgICAvLyBcIkRpc2NvdW50ICUgbXVzdCBiZSBcdTIyNjQgMTAwXCIsIGFuZCB0aGUgcnVsZSdzIG93biBtZXNzYWdlIGlzIHVucmVhY2hhYmxlIG9uXG4gICAgICAvLyBldmVyeSBpbnB1dCB0aGF0IGNvdWxkIHJlYWNoIGl0LlxuICAgICAgLy9cbiAgICAgIC8vICMjIyBXaHkgYSBzY3JpcHQgdmFsaWRhdGlvbiBhbmQgbm90IGEgbG93ZXIgYG1heGAgb24gdGhlIGZpZWxkXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBpcyBhbiBJTlZBUklBTlQgXHUyMDE0IFwiYSBxdW90ZSdzIGRpc2NvdW50IG1heSBuZXZlciBleGNlZWQgdGhlXG4gICAgICAvLyBjZWlsaW5nXCIgXHUyMDE0IG5vdCBhIHRyYW5zaXRpb24gY29uZGl0aW9uLCBhbmQgIzEwNjkgaXMgb3BlbiBvbiBleGFjdGx5XG4gICAgICAvLyB0aGF0IGRpc3RpbmN0aW9uIGZvciBgcmVxdWlyZWRXaGVuYC4gQm90aCBpbnN0cnVtZW50cyB3ZXJlIG1lYXN1cmVkXG4gICAgICAvLyBhZ2FpbnN0IGEgcm93IHN0b3JlZCBhYm92ZSB0aGUgY2VpbGluZyBiZWZvcmUgdGhlIHJ1bGUgZXhpc3RlZFxuICAgICAgLy8gKGB0ZXN0L3F1b3RlLWRpc2NvdW50LWNlaWxpbmcudGVzdC50c2AgcnVucyB0aGUgbWVhc3VyZW1lbnQpOlxuICAgICAgLy9cbiAgICAgIC8vICAgRmllbGQucGVyY2VudCh7IG1heDogNjAgfSkgICBsZWdhY3kgcm93LCB1bnJlbGF0ZWQgZWRpdCBcdTIxOTIgQURNSVRURURcbiAgICAgIC8vICAgdGhpcyBydWxlICAgICAgICAgICAgICAgICAgICBsZWdhY3kgcm93LCB1bnJlbGF0ZWQgZWRpdCBcdTIxOTIgUkVGVVNFRFxuICAgICAgLy9cbiAgICAgIC8vIEEgZmllbGQgYm91bmQgY2hlY2tzIHRoZSB2YWx1ZSBiZWluZyBXUklUVEVOOyBhIHNjcmlwdCB2YWxpZGF0aW9uIGlzXG4gICAgICAvLyBldmFsdWF0ZWQgYWdhaW5zdCB0aGUgTUVSR0VEIHJlY29yZCBvbiBldmVyeSB3cml0ZS4gU28gYG1heGAgY2Fycmllc1xuICAgICAgLy8gdGhlIHNhbWUgc2lsZW50IGxlZ2FjeSBob2xlICMxMDY5IGRlc2NyaWJlcywgaW4gYSBzZWNvbmQgaW5zdHJ1bWVudCxcbiAgICAgIC8vIGFuZCB0aGUgcnVsZSBkb2VzIG5vdC4gVGhlIGNvc3Qgb2YgdGhlIGludmFyaWFudCwgc3RhdGVkIHJhdGhlciB0aGFuXG4gICAgICAvLyBoaWRkZW46IGFuIG92ZXItY2VpbGluZyByb3cgaXMgZnJvemVuIHRvIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSByZXBhaXIgXHUyMDE0XG4gICAgICAvLyBicmluZ2luZyB0aGUgZGlzY291bnQgYmFjayB1bmRlciB0aGUgY2VpbGluZyBpcyBhZG1pdHRlZCwgYW5kIGlzIGFuXG4gICAgICAvLyBvcmRpbmFyeSBlZGl0LiBIb3RDUk0gc2hpcHMgbm8gc3VjaCByb3cgKGRlZXBlc3Qgc2VlZGVkIGRpc2NvdW50OiAyMCUpLlxuICAgICAgLy9cbiAgICAgIC8vIGBtYXg6IDEwMGAgc3RheXMgb24gdGhlIGZpZWxkIGFzIHRoZSBkb21haW4gb2YgYSBwZXJjZW50YWdlLiBUaGUgcG9saWN5XG4gICAgICAvLyBudW1iZXIgbGl2ZXMgaW4gYF90aHJlc2hvbGRzLnRzYCwgaW50ZXJwb2xhdGVkIGludG8gYm90aCB0aGUgcHJlZGljYXRlXG4gICAgICAvLyBhbmQgdGhlIG1lc3NhZ2Ugc28gdGhlIHR3byBjYW5ub3QgZGlzYWdyZWUuXG4gICAgICBuYW1lOiAnZGlzY291bnRfd2l0aGluX2NlaWxpbmcnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6IGBEaXNjb3VudCBjYW5ub3QgZXhjZWVkICR7UVVPVEVfRElTQ09VTlRfQ0VJTElOR30lYCxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmRpc2NvdW50KSAmJiByZWNvcmQuZGlzY291bnQgIT0gbnVsbCAmJiByZWNvcmQuZGlzY291bnQgPiAke1FVT1RFX0RJU0NPVU5UX0NFSUxJTkd9YCxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vICM1NzUgQjQuIGBjcm1fcXVvdGVgIGhhZCBhIGZ1bGwgbGlmZWN5Y2xlIHZvY2FidWxhcnkgYW5kIG5vIHRyYW5zaXRpb25cbiAgICAgIC8vIGNvbnN0cmFpbnQgd2hhdHNvZXZlciBcdTIwMTQgbm9yIGEgc3RhdHVzIGd1YXJkIGluIGBxdW90ZS5ob29rLnRzYCBcdTIwMTQgc28gYVxuICAgICAgLy8gcXVvdGUgY291bGQgZ28gc3RyYWlnaHQgZnJvbSBgZHJhZnRgIHRvIGBhY2NlcHRlZGAsIHdoaWNoIGluIENQUSB0ZXJtc1xuICAgICAgLy8gaXMgYSBzaWduZWQgbnVtYmVyIG5vYm9keSByZXZpZXdlZCBvciBzZW50LiBgd2FybmluZ2Agc2V2ZXJpdHkgbWF0Y2hlc1xuICAgICAgLy8gdGhlIGxlYWQgLyBvcHBvcnR1bml0eSAvIGNhc2UgbWFjaGluZXM6IGl0IGZsYWdzIHRoZSBqdW1wIG9uIHRoZSByZWNvcmRcbiAgICAgIC8vIHdpdGhvdXQgYmxvY2tpbmcgYSBzdXBwb3J0LWRyaXZlbiBjb3JyZWN0aW9uLlxuICAgICAgbmFtZTogJ3F1b3RlX3N0YXR1c19wcm9ncmVzc2lvbicsXG4gICAgICB0eXBlOiAnc3RhdGVfbWFjaGluZScsXG4gICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgbWVzc2FnZTogJ0ludmFsaWQgcXVvdGUgc3RhdHVzIHRyYW5zaXRpb24nLFxuICAgICAgZmllbGQ6ICdzdGF0dXMnLFxuICAgICAgdHJhbnNpdGlvbnM6IHtcbiAgICAgICAgLy8gYFx1MjE5MiBleHBpcmVkYCBpcyBsZWdhbCBmcm9tIGV2ZXJ5IFVOU0VUVExFRCBzdGF0ZTogdGhlIHF1b3RlX2V4cGlyYXRpb25cbiAgICAgICAgLy8gZmxvdyBzd2VlcHMgb24gYGV4cGlyYXRpb25fZGF0ZWAgYWxvbmUgYW5kIGV4cGlyZXMgZHJhZnRzIHRoYXQgd2VyZVxuICAgICAgICAvLyBuZXZlciBzZW50IGFzIHJlYWRpbHkgYXMgcHJlc2VudGVkIG9uZXMuXG4gICAgICAgIGRyYWZ0OiBbJ2luX3JldmlldycsICdleHBpcmVkJ10sXG4gICAgICAgIGluX3JldmlldzogWydkcmFmdCcsICdwcmVzZW50ZWQnLCAncmVqZWN0ZWQnLCAnZXhwaXJlZCddLFxuICAgICAgICBwcmVzZW50ZWQ6IFsnYWNjZXB0ZWQnLCAncmVqZWN0ZWQnLCAnZXhwaXJlZCddLFxuICAgICAgICAvLyBgYWNjZXB0ZWRgIGFuZCBgZXhwaXJlZGAgYXJlIHRlcm1pbmFsLCBhbmQgbm90IG9ubHkgYnkgY29udmVudGlvbiBcdTIwMTRcbiAgICAgICAgLy8gYHF1b3RlX3ByaWNpbmdfZ3VhcmRgIGluIHF1b3RlLmhvb2sudHMgZnJlZXplcyBib3RoLCBhbGxvd2luZyBlZGl0c1xuICAgICAgICAvLyB0byBgaW50ZXJuYWxfbm90ZXNgIGFuZCBub3RoaW5nIGVsc2UuXG4gICAgICAgIGFjY2VwdGVkOiBbXSxcbiAgICAgICAgZXhwaXJlZDogW10sXG4gICAgICAgIC8vIEEgcmVqZWN0ZWQgcXVvdGUgaXMgbm90IGZyb3plbjogdGhlIHJlcCByZXZpc2VzIHRoZSBudW1iZXJzIGFuZFxuICAgICAgICAvLyByZS1pc3N1ZXMsIHdoaWNoIHN0YXJ0cyBhZ2FpbiBhdCBgZHJhZnRgLlxuICAgICAgICByZWplY3RlZDogWydkcmFmdCddLFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxuICBcbiAgLy8gV29ya2Zsb3cgUnVsZXNcbiAgLy8gXHUyNkEwXHVGRTBGIE5vIGB3b3JrZmxvd3NbXWAgaGVyZSwgYW5kIG5vbmUgaXMgcG9zc2libGU6IG9iamVjdCBgd29ya2Zsb3dzW11gIHdlcmVcbiAgLy8gcmVtb3ZlZCBmcm9tIHRoZSBwbGF0Zm9ybS4gRmllbGQgdXBkYXRlcyBsaXZlIGluIHRoaXMgb2JqZWN0J3MgYCouaG9vay50c2A7XG4gIC8vIHNjaGVkdWxlZCBzdGF0dXMgZmxpcHMgYW5kIG5vdGlmaWNhdGlvbnMgbGl2ZSBpbiBgc3JjLyovZmxvd3MvKi5mbG93LnRzYC5cbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0cy9fdGhyZXNob2xkcy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvX3RocmVzaG9sZHMudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogQ29tbWVyY2lhbCBnb3Zlcm5hbmNlIHRocmVzaG9sZHMgXHUyMDE0IHRoZSBtb25leSBsaW5lcyB0aGlzIGFwcCBkcmF3cywgYXV0aG9yZWRcbiAqIE9OQ0UuXG4gKlxuICogXCJXaGF0IGNvdW50cyBhcyBhIGxhcmdlIGRlYWxcIiBpcyBvbmUgYnVzaW5lc3MgcXVlc3Rpb24gd2l0aCBmb3VyIGNvbnN1bWVyczpcbiAqIHRoZSBhcHByb3ZhbCBlbnRyeSBnYXRlIGFuZCB0aGUgd29uLWRlYWwgYWxlcnQgKGBzcmMvc2FsZXMvZmxvd3MvYCksIGFuZCB0aGVcbiAqIHNhbGVzLWRpcmVjdG9yIGFuZCBleGVjdXRpdmUgcnVsZXMgKGBzcmMvc2FsZXMvc2hhcmluZy9vcHBvcnR1bml0eS5zaGFyaW5nLnRzYCkuXG4gKiBFYWNoIGludGVycG9sYXRlcyB0aGUgY29uc3RhbnQgYmVsb3csIGFuZCBlYWNoIGN1dHMgYXQgYD49YC5cbiAqXG4gKiBcdTI2RDQgQm90aCBoYWx2ZXMgYXJlIGxvYWQtYmVhcmluZywgYW5kIG5laXRoZXIgbWF5IGRyaWZ0LiBGb3VyIGluZGVwZW5kZW50XG4gKiBsaXRlcmFscyBtZWFuIGEgZGVwbG95bWVudCB0aGF0IHJhaXNlcyB0aGUgYmFyIGluIG9uZSBwbGFjZSBzaGlwcyBhIHByb2R1Y3RcbiAqIHdoZXJlIGEgZGVhbCBpcyBsYXJnZSBlbm91Z2ggZm9yIHRoZSBkaXJlY3RvciB0byAqc2VlKiBhbmQgbm90IGxhcmdlIGVub3VnaFxuICogdG8gKmFwcHJvdmUqIFx1MjAxNCBnb3Zlcm5hbmNlIG5hcnJvd2VyIHRoYW4gdmlzaWJpbGl0eSwgd2hpY2ggaXMgdGhlXG4gKiBjb3VudGVyLWludHVpdGl2ZSBkaXJlY3Rpb24gdGhlIG5leHQgYXV0aG9yIHdpbGwgYXNzdW1lIHRoZSByZXZlcnNlIG9mLlxuICogTWFpbnRhaW5lciBydWxpbmc6ICoqYSBkZWFsIGF0IHRoZSBsaW5lIGlzIGEgbGFyZ2UgZGVhbCoqLCBzbyBldmVyeSBzaXRlIGN1dHNcbiAqIGF0IGA+PWAgcmF0aGVyIHRoYW4gYD5gLiBgdGVzdC9kZWFsLXRocmVzaG9sZC1wYXJpdHkudGVzdC50c2AgcmVhZHMgdGhlXG4gKiBjb21waWxlZCBDRUwgb2YgZXZlcnkgZmxvdyBjb25kaXRpb24gYW5kIHNoYXJpbmcgcnVsZSBiYWNrIG91dCBvZiB0aGUgc2hpcHBlZFxuICogbWV0YWRhdGEgYW5kIGZhaWxzIGlmIGFueSBzaXRlIHN0b3BzIGFncmVlaW5nIG9uIHRoZSBudW1iZXIgT1IgdGhlIG9wZXJhdG9yLlxuICpcbiAqIElmIGEgcmVhc29uIGV2ZXIgYXBwZWFycyBmb3IgbGVhZGVyc2hpcCB0byBzZWUgYSBkZWFsIHRoYXQgbmVlZHMgbm8gYXBwcm92YWwsXG4gKiB0aGF0IHJlYXNvbiBiZWxvbmdzICoqaGVyZSoqLCBuZXh0IHRvIHRoZSBjb25zdGFudCwgYW5kIHRoZSBzcGxpdCBiZWNvbWVzIGFcbiAqIGRlc2lnbiBpbnN0ZWFkIG9mIGRyaWZ0LiBOb3RoaW5nIGluIHRoaXMgcmVwbyBtYWtlcyB0aGF0IGFyZ3VtZW50IHRvZGF5LlxuICpcbiAqIGBISUdIX1ZBTFVFX0RFQUxfQU1PVU5UYCBiZWxvdyBpcyBkZWxpYmVyYXRlbHkgTk9UIHBhcnQgb2YgdGhhdCBndWFyYW50ZWU6XG4gKiBpdHMgYD5gIGFuZCBgPD1gIGhhbHZlcyBhcmUgb25lIGJyYW5jaCBzdGF0ZWQgaW4gY29tcGxlbWVudGFyeSBwb2xhcml0eSxcbiAqIHdoaWNoIG11c3QgUEFSVElUSU9OIHJhdGhlciB0aGFuIGFncmVlLiBUd28gb3BlcmF0b3JzIHRoZXJlIGFyZSB0aGUgZGVzaWduLlxuICovXG5cbi8qKlxuICogQSBcImxhcmdlIGRlYWxcIiBcdTIwMTQgdGhlIGFtb3VudCBhdCB3aGljaCBhbiBvcHBvcnR1bml0eSBzdG9wcyBiZWluZyByb3V0aW5lLlxuICpcbiAqIENvbnN1bWVkIGJ5IHRoZSBhcHByb3ZhbCBlbnRyeSBnYXRlLCB0aGUgd29uLWRlYWwgYWxlcnQgYW5kIGJvdGggbGFyZ2UtZGVhbFxuICogc2hhcmluZyBydWxlcy4gYHNyYy9kb2NzL2NybV9zYWxlcy5tZGAgYW5kIGBzcmMvZG9jcy9jcm1fYWRtaW4ubWRgIHB1Ymxpc2hcbiAqIHRoaXMgbnVtYmVyIHRvIHVzZXJzLCBhbmQgYHRlc3QvZG9jcy1kcmlmdC50ZXN0LnRzYCBmYWlscyBpZiB0aGV5IGRyaWZ0IGZyb21cbiAqIHdoYXQgdGhlIGZsb3dzIGFjdHVhbGx5IHNoaXAuXG4gKi9cbmV4cG9ydCBjb25zdCBMQVJHRV9ERUFMX0FNT1VOVCA9IDEwMF8wMDA7XG5cbi8qKlxuICogVGhlIHNlY29uZCBhcHByb3ZhbCB0aWVyIFx1MjAxNCBhYm92ZSB0aGlzIGEgU2FsZXMgRGlyZWN0b3Igc2lnbnMgb2ZmIGFzIHdlbGwgYXNcbiAqIHRoZSBtYW5hZ2VyLiBDb25zdW1lZCBieSB0aGUgYGNoZWNrX2hpZ2hfdmFsdWVgIGJyYW5jaCBvZlxuICogYG9wcG9ydHVuaXR5LWFwcHJvdmFsLmZsb3cudHNgLCBpbiBib3RoIHBvbGFyaXRpZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBISUdIX1ZBTFVFX0RFQUxfQU1PVU5UID0gNTAwXzAwMDtcblxuLyoqXG4gKiBUaGUgaGFyZCBjZWlsaW5nIG9uIGEgZGlzY291bnQgcGVyY2VudGFnZSwgaW4gcGVyY2VudCBcdTIwMTQgb24gYSBxdW90ZSwgYW5kIG9uXG4gKiBlYWNoIG9mIGl0cyBsaW5lIGl0ZW1zLlxuICpcbiAqICMjIyBPbmUgbnVtYmVyLCB0d28gcnVsZXMsIGJlY2F1c2UgYSBxdW90ZSdzIHRvdGFsIGhhcyB0d28gbXVsdGlwbGllcnNcbiAqXG4gKiBgY3JtX3F1b3RlLmRpc2NvdW50X3dpdGhpbl9jZWlsaW5nYCBhbmRcbiAqIGBjcm1fcXVvdGVfbGluZV9pdGVtLmRpc2NvdW50X3dpdGhpbl9jZWlsaW5nYCBib3RoIGludGVycG9sYXRlIHRoaXMgY29uc3RhbnQuXG4gKiBUaGUgc2Vjb25kIGlzIG5vdCBhIGNvcHkgZm9yIHN5bW1ldHJ5J3Mgc2FrZTogdGhlIHF1b3RlLWxldmVsIHBlcmNlbnRhZ2UgYW5kXG4gKiB0aGUgcGVyLWxpbmUgcGVyY2VudGFnZSBhcmUgSU5ERVBFTkRFTlQgaW5wdXRzIHRvIHRoZSBzYW1lIHRvdGFsXG4gKiAoYHF1b3RlX3RvdGFsX3JvbGx1cGAgZGlzY291bnRzIGVhY2ggbGluZSwgc3VtcywgdGhlbiBhcHBsaWVzIHRoZSBxdW90ZSdzXG4gKiBwZXJjZW50YWdlIHRvIHRoZSBzdW0pLCBzbyBhIHF1b3RlIGF0IGBkaXNjb3VudDogMGAgd2l0aCBldmVyeSBsaW5lIGF0IDkwJVxuICogY2xlYXJzIHRoZSBxdW90ZS1sZXZlbCBydWxlIG91dHJpZ2h0IGFuZCBzdGlsbCBwcmljZXMgOTAlIGJlbG93IGxpc3QuXG4gKiBDZWlsaW5nIG9uZSBtdWx0aXBsaWVyIGFuZCB0aGUgb3RoZXIgaXMgdGhlIHdheSBhcm91bmQgaXQuXG4gKlxuICogXHUyNkEwXHVGRTBGIFdoYXQgdGhpcyBjb25zdGFudCBkb2VzIE5PVCBzZXR0bGUgaXMgd2hhdCB0aGUgY2VpbGluZyBtZWFucyBvbmNlIHRoZSB0d29cbiAqIG11bHRpcGxpZXJzIENPTVBPVU5EIFx1MjAxNCA2MCUgcGVyIGxpbmUgYW5kIDYwJSBvbiB0aGUgcXVvdGUgaXMgfjg0JSBlZmZlY3RpdmUuXG4gKiBUaGF0IGlzIGFuIG9wZW4gYnVzaW5lc3MtcG9saWN5IHF1ZXN0aW9uLCBhbmQgbmVpdGhlciBydWxlIHByZXRlbmRzIHRvIGFuc3dlclxuICogaXQuXG4gKlxuICogIyMjIFdoeSA2MCwgYW5kIHdoeSBvbmx5IG9uZSBudW1iZXJcbiAqXG4gKiBUaGUgY2VpbGluZyBpcyBBQlNPTFVURSBcdTIwMTQgdGhlcmUgaXMgbm8gYXBwcm92YWwgcGF0aCB0byB1bmJsb2NrIGEgcXVvdGUgYWJvdmVcbiAqIGl0LiBBIGJsb2NraW5nIHJ1bGUgd2l0aCBubyBvdmVycmlkZSBoYXMgdG8gc2l0IHdoZXJlIHJlZnVzaW5nIGlzXG4gKiB1bmFtYmlndW91c2x5IHJpZ2h0LCBub3Qgd2hlcmUgcmV2aWV3aW5nIHdvdWxkIGJlIHVzZWZ1bC4gMzAlIHdvdWxkIHJlZnVzZVxuICogYWdncmVzc2l2ZS1idXQtcmVhbCBjb21tZXJjaWFsIGRlYWxzIG91dHJpZ2h0IGFuZCBsZWF2ZSB0aGUgcmVwIG5vdGhpbmcgdG8gZG9cbiAqIGFib3V0IGl0OyA2MCUgcmVmdXNlcyBcImEgcmVwIGNhbiBnaXZlIDkwJSBvZmYgYSAkOTlLIGRlYWwgYW5kIG5vdGhpbmcgcmV2aWV3c1xuICogaXRcIiB3aGlsZSBsZWF2aW5nIGdlbnVpbmUgc3RyYXRlZ2ljIHByaWNpbmcgYWxvbmUuIFRoZSBzdG9jayBjYXRhbG9ndWVcbiAqIGFncmVlczogdGhlIGRlZXBlc3QgZGlzY291bnQgSG90Q1JNIHNlZWRzIGFueXdoZXJlIGlzIDIwJVxuICogKGBzcmMvPHBrZz4vZGF0YS8qLnNlZWQudHNgKS5cbiAqXG4gKiBcdTI2RDQgVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIFNPRlQgY2VpbGluZyBjb25zdGFudCBiZXNpZGUgaXQuIEEgc29mdCB0aWVyIGhhc1xuICogZXhhY3RseSBvbmUgcG9zc2libGUgY29uc3VtZXIgXHUyMDE0IGRpc2NvdW50LXRyaWdnZXJlZCBhcHByb3ZhbCByb3V0aW5nIFx1MjAxNCB3aGljaFxuICogZG9lcyBub3QgZXhpc3QgeWV0LCBhbmQgXHUyNkEwXHVGRTBGIGEgYHNldmVyaXR5OiAnd2FybmluZydgIHNjcmlwdCB2YWxpZGF0aW9uIGlzXG4gKiBhZG1pdHRlZCBieSB0aGlzIHBsYXRmb3JtIHdpdGggKm5vIG9ic2VydmFibGUgc3VyZmFjZSBhdCBhbGwqOiBubyB3YXJuaW5nIG9uXG4gKiB0aGUgcmVzdWx0LCBub3RoaW5nIGluIHRoZSBlbnZlbG9wZS4gRGVjbGFyaW5nIHRoZSBudW1iZXIgbm93IHdvdWxkIGFkZCBhXG4gKiBzaXh0aCBlbnRyeSB0byB0aGUgXCJkZWNsYXJlZCBhbmQgdGhlbiBub3QgYXBwbGllZFwiIHRhYmxlIGluXG4gKiBgdGVzdC93aW4tbG9zcy1jYXB0dXJlLnRlc3QudHNgLiBUaGUgc29mdCB0aWVyIHJldHVybnMgd2l0aCB0aGUgcm91dGluZyB0aGF0XG4gKiBnaXZlcyBpdCBhIGpvYi5cbiAqXG4gKiAjIyMgV2h5IHRoaXMgaXMgYSB2YWxpZGF0aW9uIHJ1bGUgYW5kIG5vdCBgRmllbGQucGVyY2VudCh7IG1heCB9KWBcbiAqXG4gKiBcdTI2QTBcdUZFMEYgUGxhdGZvcm0gY29uc3RyYWludCwgbWVhc3VyZWQgYm90aCB3YXlzIG9uIGEgbGVnYWN5IHJvdyBhbHJlYWR5IGFib3ZlIHRoZVxuICogY2VpbGluZyAoYHRlc3QvcXVvdGUtZGlzY291bnQtY2VpbGluZy50ZXN0LnRzYCk6IGEgZmllbGQtbGV2ZWwgYG1heGBcbiAqIHZhbGlkYXRlcyB0aGUgV1JJVFRFTiBWQUxVRSBvbmx5LCBzbyBhIHJvdyBzdG9yZWQgYWJvdmUgdGhlIGNlaWxpbmcgYmVmb3JlXG4gKiB0aGUgcnVsZSBleGlzdGVkIGtlZXBzIGFjY2VwdGluZyBlZGl0cyBmb3JldmVyIFx1MjAxNCB0aGUgc2FtZSBzaWxlbnQgbGVnYWN5IGhvbGVcbiAqIGByZXF1aXJlZFdoZW5gIGhhcy4gQSBgdHlwZTogJ3NjcmlwdCdgIHZhbGlkYXRpb24gaXMgZXZhbHVhdGVkIGFnYWluc3QgdGhlXG4gKiBNRVJHRUQgcmVjb3JkIG9uIGV2ZXJ5IHdyaXRlLCBzbyBpdCBpcyBhIHRydWUgaW52YXJpYW50LiBCb3RoIGZpZWxkcyBrZWVwXG4gKiBgbWF4OiAxMDBgIGFzIHRoZSBhcml0aG1ldGljIGRvbWFpbiBvZiBhIHBlcmNlbnRhZ2U7IHRoZSBwb2xpY3kgbGluZSBsaXZlcyBpblxuICogdGhlIHJ1bGVzLlxuICovXG5leHBvcnQgY29uc3QgUVVPVEVfRElTQ09VTlRfQ0VJTElORyA9IDYwO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL3F1b3RlX2xpbmVfaXRlbS5vYmplY3QudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9xdW90ZV9saW5lX2l0ZW0ub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBPYmplY3RTY2hlbWEsIEZpZWxkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBGLCBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgUVVPVEVfRElTQ09VTlRfQ0VJTElORyB9IGZyb20gJy4uLy4uL3NhbGVzL29iamVjdHMvX3RocmVzaG9sZHMnO1xuXG4vKipcbiAqIFF1b3RlIExpbmUgSXRlbVxuICpcbiAqIEluZGl2aWR1YWwgbGluZSBvbiBhIFF1b3RlLiBRdW90ZXMgZ2VuZXJhdGVkIGZyb20gYW4gT3Bwb3J0dW5pdHkgdHlwaWNhbGx5XG4gKiBjbG9uZSBpdHMgT3Bwb3J0dW5pdHlMaW5lSXRlbXMgaW50byBRdW90ZUxpbmVJdGVtcyBzbyBwcmljaW5nIGNhbiBkaXZlcmdlXG4gKiBhZnRlciB0aGUgcXVvdGUgaXMgc2VudCB3aXRob3V0IGFmZmVjdGluZyB0aGUgdW5kZXJseWluZyBvcHBvcnR1bml0eS5cbiAqL1xuZXhwb3J0IGNvbnN0IFF1b3RlTGluZUl0ZW0gPSBPYmplY3RTY2hlbWEuY3JlYXRlKHtcbiAgbmFtZTogJ2NybV9xdW90ZV9saW5lX2l0ZW0nLFxuICBsYWJlbDogJ1F1b3RlIExpbmUgSXRlbScsXG4gIHBsdXJhbExhYmVsOiAnUXVvdGUgTGluZSBJdGVtcycsXG4gIGljb246ICdwYWNrYWdlJyxcbiAgZGVzY3JpcHRpb246ICdBIHNpbmdsZSBwcm9kdWN0IGxpbmUgb24gYSBRdW90ZScsXG5cbiAgLy8gT1dEIGlzIGFuIGF1dGhvcmVkIGRlY2lzaW9uIChBRFItMDA5MCBEMS9ENykuIFJlY29yZCBhY2Nlc3MgREVSSVZFUyBmcm9tXG4gIC8vIHRoZSBxdW90ZSAoQURSLTAwNTUpLlxuICAvL1xuICAvLyBcdTI2QTBcdUZFMEYgUmVhZHMgQVJFIGZpbHRlcmVkIHRvIGxpbmVzIHdob3NlIGBjcm1fcXVvdGVgIHRoZSBjYWxsZXIgY2FuIHJlYWQsIGFuZFxuICAvLyBcImNhbiByZWFkXCIgcmVzb2x2ZXMgdGhyb3VnaCB0aGUgc2FtZSBwYXRocyBhIGRpcmVjdCByZWFkIG9mIHRoZSBxdW90ZSB0YWtlc1xuICAvLyBcdTIwMTQgb3duZXIgc2NvcGUgYW5kIGBzeXNfcmVjb3JkX3NoYXJlYCBncmFudHMgaW5jbHVkZWQsIE5PVCB0aGUgbWFzdGVyJ3NcbiAgLy8gcm93LWxldmVsIHNlY3VyaXR5IHBvbGljaWVzIGFsb25lLiBBIHJlcCB3aG8gb3ducyBvbmUgcXVvdGUgcmVhZHMgdGhhdFxuICAvLyBxdW90ZSdzIGxpbmVzIGFuZCBubyBvdGhlcnMuIFRoZSBwYXJlbnQtd3JpdGUgZ2F0ZSBkZXJpdmVzIHRoZSBzYW1lIHdheTogYVxuICAvLyBsaW5lIHdob3NlIHF1b3RlIHRoZSBjYWxsZXIgY2Fubm90IGVkaXQgaXMgcmVmdXNlZCB3aXRoIGFcbiAgLy8gYFBlcm1pc3Npb25EZW5pZWRFcnJvcmAgbmFtaW5nIHRoZSBtYXN0ZXIuXG4gIC8vXG4gIC8vIGB0ZXN0L3BhcmVudC1kZXJpdmVkLXJlYWNoLnRlc3QudHNgIHBpbnMgdGhvc2Ugc2VtYW50aWNzIHdpdGggcG9zaXRpdmVcbiAgLy8gY29udHJvbHMsIHNvIGEgcmVncmVzc2lvbiBpcyBjYXVnaHQgaW4gZWl0aGVyIGRpcmVjdGlvbiBcdTIwMTQgaXQgd2FzIHdyaXR0ZW4gdG9cbiAgLy8gZ28gcmVkIHRoZSBkYXkgdGhlIHBsYXRmb3JtIHdpZGVucyB0aGVtOiB3aXRoIHRoZSBkZXJpdmF0aW9uIGNvbnN1bHRpbmdcbiAgLy8gbWFzdGVyIFJMUyBwb2xpY2llcyBvbmx5LCB1bmRlciBhIFNZU1RFTSBjb250ZXh0LCBhbmQgbm8gcG9saWN5IGF1dGhvcmVkIG9uXG4gIC8vIGBjcm1fcXVvdGVgLCB0aGUgbWFzdGVyIHNldCBpcyBFVkVSWSBxdW90ZSBhbmQgYSBsaW5lIGl0ZW0gaXMgcmVhZGFibGUgXHUyMDE0XG4gIC8vIGFuZCB3cml0YWJsZSBcdTIwMTQgYnkgZXZlcnkgaG9sZGVyIG9mIG9iamVjdC1sZXZlbCByZWFkIG9uIHRoaXMgb2JqZWN0LiBUaGVcbiAgLy8gcmVsYXRpb24gcmVzb2x2ZXIgYWNjZXB0cyBhIFJFUVVJUkVEIExPT0tVUCBhcyB0aGUgcGFyZW50LCBzbyBub1xuICAvLyBtYXN0ZXItZGV0YWlsIGNvbnZlcnNpb24gaXMgbmVlZGVkLlxuICAvL1xuICAvLyBcdTI2RDQgTm90IGBwcml2YXRlYDogd2l0aCBubyBvd25lciBmaWVsZCBvbiB0aGlzIG9iamVjdCB0aGF0IHJlc29sdmVzIHRvIHRoZVxuICAvLyBwbGF0Zm9ybSdzIGF1dG8tc3RhbXBlZCBgb3duZXJfaWRgIFx1MjAxNCB0aGUgcm93J3MgaW5zZXJ0ZXIgXHUyMDE0IHNvIGxpbmVzIGNsb25lZFxuICAvLyBvbnRvIGEgcXVvdGUgYnkgdGhlIGBxdW90ZV9nZW5lcmF0aW9uYCBmbG93IGFyZSBpbnZpc2libGUgdG8gdGhlIHJlcCB3aG9cbiAgLy8gb3ducyB0aGUgcXVvdGUuXG4gIHNoYXJpbmdNb2RlbDogJ2NvbnRyb2xsZWRfYnlfcGFyZW50JyxcblxuICAvLyBQZXItZmllbGQgaGlzdG9yeSBpcyBvcHQtaW4gdmlhIGBGaWVsZC50cmFja0hpc3RvcnlgIChBRFItMDA1MiksIHNldCBvblxuICAvLyBxdWFudGl0eS91bml0X3ByaWNlL2Rpc2NvdW50IGJlbG93LiBNYXN0ZXItZGV0YWlsIGNoaWxkcmVuIHN0aWxsIGluaGVyaXRcbiAgLy8gdGhlIG1hc3RlcidzIHNoYXJpbmcgYXV0b21hdGljYWxseS5cblxuICBoaWdobGlnaHRGaWVsZHM6IFsnY3JtX3Byb2R1Y3QnLCAncXVhbnRpdHknLCAndW5pdF9wcmljZScsICd0b3RhbF9wcmljZSddLFxuXG4gIC8vIFRoZSBzYW1lIHR3by1ncm91cCBzcGxpdCBhcyBgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbWAgKCMxNDUzKSwgZGVyaXZlZFxuICAvLyBmcm9tIHRoZSB0ZW4gZmllbGRzIGRlY2xhcmVkIGhlcmU6IGV2ZXJ5IGZhY3RvciBgdG90YWxfcHJpY2VgIG11bHRpcGxpZXNcbiAgLy8gaXMgYHByaWNpbmdgLCBldmVyeXRoaW5nIHRoYXQgc2F5cyBXSElDSCBsaW5lIHRoaXMgaXMgaXMgYGJhc2ljYC5cbiAgLy9cbiAgLy8gXHUyNkEwXHVGRTBGIE5laXRoZXIgZ3JvdXAgbWF5IGJlIGEgc3Vic2V0IG9mIHRoZSBoaWdobGlnaHQgc3RyaXAgXHUyMDE0IHNlZSB0aGUgdHdpblxuICAvLyBvYmplY3QgZm9yIHRoZSBob2lzdGluZyBydWxlIHRoaXMgc2F0aXNmaWVzLlxuICBmaWVsZEdyb3VwczogW1xuICAgIHsga2V5OiAnYmFzaWMnLCAgIGxhYmVsOiAnTGluZSBJdGVtJywgaWNvbjogJ3BhY2thZ2UnIH0sXG4gICAgeyBrZXk6ICdwcmljaW5nJywgbGFiZWw6ICdQcmljaW5nJywgICBpY29uOiAnZG9sbGFyLXNpZ24nIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gVGhlIHBhcmVudCBsaW5rIFx1MjAxNCBzYW1lIGRlY2lzaW9uLCBzYW1lIHJlYXNvbmluZywgYXNcbiAgICAvLyBgb3Bwb3J0dW5pdHlfbGluZV9pdGVtLmNybV9vcHBvcnR1bml0eWAgKCM3MjcpOyByZWFkIHRoZSBsb25nIG5vdGUgdGhlcmUuXG4gICAgLy8gSW4gc2hvcnQ6IGRlY2xhcmluZyBub3RoaW5nIHJlc29sdmVzIHRvIHRoZSBzcGVjIGRlZmF1bHQgYHNldF9udWxsYCwgd2hpY2hcbiAgICAvLyB0aGUgZW5naW5lIGVzY2FsYXRlcyB0byBgcmVzdHJpY3RgIG9uIGEgUkVRVUlSRUQgbG9va3VwLCBzbyBldmVyeSBxdW90ZVxuICAgIC8vIHRoYXQgaGFkIGJlZW4gaXRlbWlzZWQgcmVmdXNlZCB0byBkZWxldGUgd2l0aCBhIDQwOSBxdW90aW5nIHRoaXMgZmllbGQuXG4gICAgLy8gQSBxdW90ZSBsaW5lIGlzIHN1Ym9yZGluYXRlIHRvIGl0cyBxdW90ZSAoYHF1b3RlX2xpbmVfaXRlbS5ob29rLnRzYCByb2xsc1xuICAgIC8vIHRoZSBxdW90ZSdzIHN1YnRvdGFsL3RvdGFsIFVQIGZyb20gdGhlc2Ugcm93cyksIHNvIGl0IGdvZXMgd2l0aCBpdC5cbiAgICBjcm1fcXVvdGU6IEZpZWxkLm1hc3RlckRldGFpbCgnY3JtX3F1b3RlJywge1xuICAgICAgbGFiZWw6ICdRdW90ZScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBkZWxldGVCZWhhdmlvcjogJ2Nhc2NhZGUnLFxuXG4gICAgICAvLyBDdXJhdGVzIHRoZSBsaW5lLWl0ZW1zIHBhbmVsIG9uIGEgcXVvdGUncyBkZXRhaWwgcGFnZSAoIzExOTkpIFx1MjAxNCB0aGVcbiAgICAgIC8vIG1lY2hhbmlzbSB0aGF0IHBhbmVsIHJlYWRzIGZpcnN0ICgjOTQ0OyB0aGUgbG9uZyBub3RlIGlzIG9uXG4gICAgICAvLyBgY3JtX2NhbXBhaWduX21lbWJlci5jcm1fY2FtcGFpZ25gKS4gQSBTVVBFUlNFVCBvZiB0aGUgZmFsbGJhY2sgaXRcbiAgICAgIC8vIHJlcGxhY2VzIChgaGlnaGxpZ2h0RmllbGRzYCBtaW51cyB0aGlzIGxvb2t1cDogUHJvZHVjdCAvIFF1YW50aXR5IC9cbiAgICAgIC8vIFNhbGVzIFByaWNlIC8gVG90YWwpIHBsdXMgYHN1YnRvdGFsYCwgdGhlIGxpbmUncyBwcmljZSBhZnRlciBpdHMgb3duXG4gICAgICAvLyBkaXNjb3VudCBcdTIwMTQgdGhlIGZvcm11bGEgd2FzIGV2YWx1YXRlZCBvbiBldmVyeSByZWFkIGFuZCBzaG93biBpbiBubyBsaXN0LlxuICAgICAgLy9cbiAgICAgIC8vIFx1MjZENCBOb3QgYWRkZWQgdG8gYGhpZ2hsaWdodEZpZWxkc2A6IHRoZSBkZXRhaWwgcGFnZSBob2lzdHMgdGhlIGZpcnN0XG4gICAgICAvLyBmb3VyIG9mIHRoYXQgc3RyaXAsIHNvIGEgZmlmdGggZW50cnkgbmV2ZXIgcmVhY2hlcyB0aGUgc3RyaXAsIGFuZFxuICAgICAgLy8gcmVvcmRlcmluZyBpdCB3b3VsZCBldmljdCBgdG90YWxfcHJpY2VgIGZyb20gdGhlIHJlY29yZCdzIGhlYWRlci5cbiAgICAgIHJlbGF0ZWRMaXN0Q29sdW1uczogWydjcm1fcHJvZHVjdCcsICdxdWFudGl0eScsICd1bml0X3ByaWNlJywgJ3N1YnRvdGFsJywgJ3RvdGFsX3ByaWNlJ10sXG4gICAgfSksXG5cbiAgICAvLyBMZWZ0IG9uIHRoZSByZXN0cmljdGluZyBkZWZhdWx0IG9uIHB1cnBvc2UgXHUyMDE0IHNlZSB0aGUgdHdpbiBvYmplY3Q6IGFcbiAgICAvLyBwcm9kdWN0J3MgY2F0YWxvZyBlbnRyeSBtdXN0IG5vdCB0YWtlIHByaWNlZCBxdW90ZSBoaXN0b3J5IHdpdGggaXQuXG4gICAgY3JtX3Byb2R1Y3Q6IEZpZWxkLmxvb2t1cCgnY3JtX3Byb2R1Y3QnLCB7XG4gICAgICBsYWJlbDogJ1Byb2R1Y3QnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgIH0pLFxuXG4gICAgZGVzY3JpcHRpb246IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdEZXNjcmlwdGlvbicsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIG1heExlbmd0aDogNTAwLFxuICAgIH0pLFxuXG4gICAgcXVhbnRpdHk6IEZpZWxkLm51bWJlcih7XG4gICAgICBsYWJlbDogJ1F1YW50aXR5JyxcbiAgICAgIGdyb3VwOiAncHJpY2luZycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgc2NhbGU6IDIsXG4gICAgICBtaW46IDAsXG4gICAgICBkZWZhdWx0VmFsdWU6IDEsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICBsaXN0X3ByaWNlOiBGaWVsZC5jdXJyZW5jeSh7XG4gICAgICBsYWJlbDogJ0xpc3QgUHJpY2UnLFxuICAgICAgZ3JvdXA6ICdwcmljaW5nJyxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgdW5pdF9wcmljZTogRmllbGQuY3VycmVuY3koe1xuICAgICAgbGFiZWw6ICdTYWxlcyBQcmljZScsXG4gICAgICBncm91cDogJ3ByaWNpbmcnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIGRpc2NvdW50OiBGaWVsZC5wZXJjZW50KHtcbiAgICAgIGxhYmVsOiAnRGlzY291bnQgJScsXG4gICAgICBncm91cDogJ3ByaWNpbmcnLFxuICAgICAgc2NhbGU6IDIsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEwMCxcbiAgICAgIGRlZmF1bHRWYWx1ZTogMCxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIHN1YnRvdGFsOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnU3VidG90YWwnLFxuICAgICAgZ3JvdXA6ICdwcmljaW5nJyxcbiAgICAgIGV4cHJlc3Npb246IEZgcmVjb3JkLnF1YW50aXR5ICogcmVjb3JkLnVuaXRfcHJpY2UgKiAoMSAtIHJlY29yZC5kaXNjb3VudCAvIDEwMClgLFxuICAgIH0pLFxuXG4gICAgLy8gQSBsaW5lIGNhcnJpZXMgbm8gdGF4OiB0YXggaXMgdGhlIHF1b3RlJ3Mgb3duIGFtb3VudCAoIzIwNjkpLCBzbyBUb3RhbCBpc1xuICAgIC8vIGBzdWJ0b3RhbGAncyBleHByZXNzaW9uLCBub3QgYSByZWFkIG9mIGBzdWJ0b3RhbGAgXHUyMDE0IGEgZm9ybXVsYSByZWFkaW5nIGFcbiAgICAvLyBmb3JtdWxhIGRlcGVuZHMgb24gaHlkcmF0aW9uIG9yZGVyIChgbGVhZC5vYmplY3QudHM6NjEtNjRgKS5cbiAgICB0b3RhbF9wcmljZTogRmllbGQuZm9ybXVsYSh7XG4gICAgICBsYWJlbDogJ1RvdGFsJyxcbiAgICAgIGdyb3VwOiAncHJpY2luZycsXG4gICAgICBleHByZXNzaW9uOiBGYHJlY29yZC5xdWFudGl0eSAqIHJlY29yZC51bml0X3ByaWNlICogKDEgLSByZWNvcmQuZGlzY291bnQgLyAxMDApYCxcbiAgICB9KSxcblxuICAgIGxpbmVfbnVtYmVyOiBGaWVsZC5udW1iZXIoe1xuICAgICAgbGFiZWw6ICdMaW5lICMnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBzY2FsZTogMCxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgIH0pLFxuICB9LFxuXG4gIC8vIFByZWRpY2F0ZXMgYmVsb3cgYXJlIFRPVEFMOiBldmVyeSBgcmVjb3JkLnhgIHJlYWQgaXMgYGhhcygpYC1ndWFyZGVkLCBzbyB0aGVcbiAgLy8gcnVsZSByZXR1cm5zIGEgdmVyZGljdCBldmVuIHdoZW4gdGhlIG1lcmdlZCByZWNvcmQgaGFzIG5vIHN1Y2gga2V5LiBTZWVcbiAgLy8gQUdFTlRTLm1kIFwiVmFsaWRhdGlvbiBwcmVkaWNhdGVzIG11c3QgYmUgVE9UQUxcIiBhbmRcbiAgLy8gdGVzdC9vYmplY3QtdmFsaWRhdGlvbi1wcmVkaWNhdGVzLnRlc3QudHMsIHdoaWNoIGZhaWxzIHRoZSBidWlsZCBvdGhlcndpc2UuXG4gIHZhbGlkYXRpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ3VuaXRfcHJpY2VfcG9zaXRpdmUnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdTYWxlcyBwcmljZSBjYW5ub3QgYmUgbmVnYXRpdmUnLFxuICAgICAgY29uZGl0aW9uOiBQYGhhcyhyZWNvcmQudW5pdF9wcmljZSkgJiYgcmVjb3JkLnVuaXRfcHJpY2UgIT0gbnVsbCAmJiByZWNvcmQudW5pdF9wcmljZSA8IDBgLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gIzEwODYuIFRoZSBvdGhlciBoYWxmIG9mICM1OTkncyBjZWlsaW5nLCBhbmQgdGhlIHJlYXNvbiB0aGF0IGNhcmQncyBvd25cbiAgICAgIC8vIGFjY2VwdGFuY2UgY3JpdGVyaW9uIFx1MjAxNCBcImEgcXVvdGUgd2l0aCBhIDkwJSBsaW5lIGRpc2NvdW50IGNhbm5vdCByZWFjaFxuICAgICAgLy8gYHByZXNlbnRlZGBcIiBcdTIwMTQgd2FzIG5vdCBtZXQgYnkgdGhlIHF1b3RlLWxldmVsIHJ1bGUgYWxvbmUuXG4gICAgICAvL1xuICAgICAgLy8gIyMjIFRoZSB3YWxrLWFyb3VuZCB0aGlzIGNsb3Nlc1xuICAgICAgLy9cbiAgICAgIC8vIEEgcXVvdGUncyB0b3RhbCBoYXMgVFdPIGluZGVwZW5kZW50IGRpc2NvdW50IG11bHRpcGxpZXJzLCBhbmRcbiAgICAgIC8vIGBxdW90ZV90b3RhbF9yb2xsdXBgIGNvbXBvc2VzIHRoZW06XG4gICAgICAvL1xuICAgICAgLy8gICBzdWJ0b3RhbCAgICAgICAgPSBcdTAzQTMgbGluZSAocXVhbnRpdHkgXHUwMEQ3IHVuaXRfcHJpY2UgXHUwMEQ3ICgxIFx1MjIxMiBMSU5FIGRpc2NvdW50LzEwMCkpXG4gICAgICAvLyAgIGRpc2NvdW50X2Ftb3VudCA9IHN1YnRvdGFsIFx1MDBENyBRVU9URSBkaXNjb3VudCVcbiAgICAgIC8vXG4gICAgICAvLyAjNTk5IHB1dCBhIGNlaWxpbmcgb24gdGhlIHNlY29uZCBvbmUgb25seS4gU28gYSBxdW90ZSBhdFxuICAgICAgLy8gYGRpc2NvdW50OiAwYCBcdTIwMTQgd2hpY2ggY2xlYXJzIGBkaXNjb3VudF93aXRoaW5fY2VpbGluZ2Agb24gYGNybV9xdW90ZWBcbiAgICAgIC8vIG91dHJpZ2h0IFx1MjAxNCB3aXRoIGV2ZXJ5IGxpbmUgYXQgYGRpc2NvdW50OiA5MGAgcHJpY2VzIDkwJSBiZWxvdyBsaXN0LCBhbmRcbiAgICAgIC8vIG5vdGhpbmcgb2JqZWN0ZWQ6IHRoaXMgb2JqZWN0J3Mgb25seSBkaXNjb3VudCBjb25zdHJhaW50IHdhcyB0aGVcbiAgICAgIC8vIGZpZWxkJ3Mgb3duIGBtYXg6IDEwMGAsIHRoZSBhcml0aG1ldGljIGRvbWFpbiBvZiBhIHBlcmNlbnRhZ2UuIEFuXG4gICAgICAvLyBpbnZhcmlhbnQgd2l0aCBhIGRvY3VtZW50ZWQgd2Fsay1hcm91bmQgaXMgd29yc2UgdGhhbiBubyBpbnZhcmlhbnQsXG4gICAgICAvLyBiZWNhdXNlIGEgcmVhZGVyIChodW1hbiBvciBBSSkgY2l0ZXMgdGhlIHJ1bGUgYXMgdGhlIGd1YXJhbnRlZS5cbiAgICAgIC8vXG4gICAgICAvLyAjIyMgU2FtZSBjb25zdGFudCwgc2FtZSBpbnN0cnVtZW50LCBkZWxpYmVyYXRlbHlcbiAgICAgIC8vXG4gICAgICAvLyBUaGUgbnVtYmVyIGlzIGBRVU9URV9ESVNDT1VOVF9DRUlMSU5HYCBcdTIwMTQgaW1wb3J0ZWQsIG5ldmVyIHJldHlwZWQsIHNvIHRoZVxuICAgICAgLy8gdHdvIGNlaWxpbmdzIGFyZSBvbmUgcG9saWN5IGFuZCBjYW5ub3QgZHJpZnQgaW50byB0d28uIFRoZSBpbnN0cnVtZW50IGlzXG4gICAgICAvLyBhIGB0eXBlOiAnc2NyaXB0J2AgdmFsaWRhdGlvbiBmb3IgdGhlIHJlYXNvbiAjNTk5IG1lYXN1cmVkIG9uIHRoZSBxdW90ZVxuICAgICAgLy8gKGFuZCB0aGlzIGNhcmQgcmUtbWVhc3VyZWQgb24gdGhpcyBvYmplY3QsIGluXG4gICAgICAvLyBgdGVzdC9xdW90ZS1kaXNjb3VudC1jZWlsaW5nLnRlc3QudHNgKTogYSBmaWVsZC1sZXZlbCBgbWF4YCB2YWxpZGF0ZXNcbiAgICAgIC8vIG9ubHkgdGhlIHZhbHVlIGJlaW5nIFdSSVRURU4sIHNvIGEgbGluZSBzdG9yZWQgYWJvdmUgdGhlIGNlaWxpbmcgYmVmb3JlXG4gICAgICAvLyB0aGUgcnVsZSBleGlzdGVkIGtlZXBzIGFjY2VwdGluZyBlZGl0cyBmb3JldmVyLCB3aGlsZSBhIHNjcmlwdFxuICAgICAgLy8gdmFsaWRhdGlvbiBpcyBldmFsdWF0ZWQgYWdhaW5zdCB0aGUgTUVSR0VEIHJlY29yZCBvbiBldmVyeSB3cml0ZSBhbmQgaXNcbiAgICAgIC8vIHRoZXJlZm9yZSBhIHRydWUgaW52YXJpYW50LiBgbWF4OiAxMDBgIHN0YXlzIG9uIHRoZSBmaWVsZCBhcyB0aGUgZG9tYWluXG4gICAgICAvLyBvZiBhIHBlcmNlbnRhZ2U7IHRoZSBwb2xpY3kgbGluZSBsaXZlcyBoZXJlLlxuICAgICAgLy9cbiAgICAgIC8vICMjIyBXaGF0IHRoaXMgcnVsZSBkb2VzIE5PVCBkZWNpZGVcbiAgICAgIC8vXG4gICAgICAvLyA2MCUgcGVyIGxpbmUgQU5EIDYwJSBvbiB0aGUgcXVvdGUgc3RpbGwgY29tcG91bmRzIHRvIH44NCUgRUZGRUNUSVZFLlxuICAgICAgLy8gV2hldGhlciB0aGUgY2VpbGluZyBzaG91bGQgYmUgcmVhZCBhZ2FpbnN0IHRoZSBlZmZlY3RpdmUgZGlzY291bnQgaXMgYVxuICAgICAgLy8gYnVzaW5lc3MtcG9saWN5IHF1ZXN0aW9uIHdpdGggbm8gYW5zd2VyIGluIHRoaXMgY29kZWJhc2UsIGFuZCBpdCBpc1xuICAgICAgLy8gb3BlbiBhcyAjMTEwOSBcdTIwMTQgZGVsaWJlcmF0ZWx5IG5vdCBndWVzc2VkIGhlcmUuIEEgcGVyLWxpbmUgY2VpbGluZyBpc1xuICAgICAgLy8gY29ycmVjdCB1bmRlciBlaXRoZXIgYW5zd2VyOiBpdCBpcyB0aGUgd2hvbGUgcG9saWN5IGlmIHRoZSBhbnN3ZXIgaXNcbiAgICAgIC8vIHBlci1saW5lLCBhbmQgYSBjb21wb25lbnQgb2YgaXQgaWYgdGhlIGFuc3dlciBpcyBlZmZlY3RpdmUuXG4gICAgICBuYW1lOiAnZGlzY291bnRfd2l0aGluX2NlaWxpbmcnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIC8vIE5hbWVzIHRoZSBMSU5FLCBiZWNhdXNlIHRoZSBxdW90ZSBjYXJyaWVzIGEgc2FtZS1uYW1lZCBydWxlIHdpdGggaXRzXG4gICAgICAvLyBvd24gbWVzc2FnZTogb24gYSByZWZ1c2VkIHNhdmUgdGhlIHJlcCBtdXN0IGJlIGFibGUgdG8gdGVsbCB3aGljaCBvZlxuICAgICAgLy8gdGhlIHR3byBudW1iZXJzIHRoZSBwbGF0Zm9ybSBpcyBvYmplY3RpbmcgdG8uXG4gICAgICBtZXNzYWdlOiBgTGluZSBkaXNjb3VudCBjYW5ub3QgZXhjZWVkICR7UVVPVEVfRElTQ09VTlRfQ0VJTElOR30lYCxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmRpc2NvdW50KSAmJiByZWNvcmQuZGlzY291bnQgIT0gbnVsbCAmJiByZWNvcmQuZGlzY291bnQgPiAke1FVT1RFX0RJU0NPVU5UX0NFSUxJTkd9YCxcbiAgICB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0cy9pbmRleC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0cy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBNYXJrZXRpbmcgb2JqZWN0IGJhcnJlbC5cbiAqXG4gKiBSZS1leHBvcnRzIHRoaXMgcGFja2FnZSdzICoub2JqZWN0LnRzIGRlZmluaXRpb25zOyB0aGUgYCouaG9vay50c2AgZmlsZXNcbiAqIGJlc2lkZSB0aGVtIHJlZ2lzdGVyIHRocm91Z2ggYC4vaG9va3MudHNgLiBUaGUgY2Fub25pY2FsIG5vdGUgb24gdGhlXG4gKiBjb2xsYWJvcmF0aW9uIGNhcGFiaWxpdGllcyAoYGVuYWJsZS5maWxlc2AsIGBlbmFibGUuZmVlZHNgKSB0aGF0IGV2ZXJ5XG4gKiBvYmplY3QgaW4gdGhpcyBhcHAgcG9pbnRzIGF0IGlzIHdyaXR0ZW4gb25jZSwgaW5cbiAqIGBzcmMvc2FsZXMvb2JqZWN0cy9pbmRleC50c2AuXG4gKi9cblxuZXhwb3J0IHsgQ2FtcGFpZ24gfSBmcm9tICcuL2NhbXBhaWduLm9iamVjdCc7XG5leHBvcnQgeyBDYW1wYWlnbk1lbWJlciB9IGZyb20gJy4vY2FtcGFpZ25fbWVtYmVyLm9iamVjdCc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbi5vYmplY3QudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL29iamVjdHMvY2FtcGFpZ24ub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBPYmplY3RTY2hlbWEsIEZpZWxkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBGLCBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuXG4vKipcbiAqIENhbXBhaWduIE9iamVjdFxuICogUmVwcmVzZW50cyBtYXJrZXRpbmcgY2FtcGFpZ25zXG4gKi9cbmV4cG9ydCBjb25zdCBDYW1wYWlnbiA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX2NhbXBhaWduJyxcbiAgbGFiZWw6ICdDYW1wYWlnbicsXG4gIHBsdXJhbExhYmVsOiAnQ2FtcGFpZ25zJyxcbiAgaWNvbjogJ21lZ2FwaG9uZScsXG4gIGRlc2NyaXB0aW9uOiAnTWFya2V0aW5nIGNhbXBhaWducyBhbmQgaW5pdGlhdGl2ZXMnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIENhbXBhaWduIGNhdGFsb2cgaXMgb3JnLXZpc2libGU7IG9ubHkgb3duZXJzIGVkaXQuXG4gIHNoYXJpbmdNb2RlbDogJ3B1YmxpY19yZWFkJyxcbiAgLy8gQURSLTAwNzk6IHJlbmRlci1vbmx5IGB0aXRsZUZvcm1hdGAgcmV0aXJlZCBpbiBmYXZvciBvZiBgbmFtZUZpZWxkYCxcbiAgLy8gd2hpY2ggbmFtZXMgYSByZWFsIGZpZWxkLiBUaGUgZm9ybWVyIHRlbXBsYXRlIGNvbXBvc2VkIHR3byBsb2NhbCBmaWVsZHMsIHNvXG4gIC8vIGEgYGRpc3BsYXlfdGl0bGVgIGZvcm11bGEgZmllbGQgcmVwcm9kdWNlcyBpdCBmb3IgdGhlIHJlY29yZCB0aXRsZS5cbiAgbmFtZUZpZWxkOiAnZGlzcGxheV90aXRsZScsXG4gIC8vIEV4cGxpY2l0IHNlYXJjaCB0YXJnZXRzIChBRFItMDA2MSkuIFJFUVVJUkVEIGJlY2F1c2UgbmFtZUZpZWxkIGlzIGFcbiAgLy8gRk9STVVMQSAoZGlzcGxheV90aXRsZS9mdWxsX25hbWUpOiB3aXRob3V0IHRoaXMsICRzZWFyY2ggYXV0by1kZWZhdWx0cyB0b1xuICAvLyB0aGUgZm9ybXVsYSBmaWVsZCwgd2hpY2ggaXNuJ3QgYSByZWFsIGNvbHVtbiwgc28gdGhlIGxvb2t1cCBwaWNrZXIgKyBnbG9iYWxcbiAgLy8gc2VhcmNoIHNpbGVudGx5IHJldHVybiB6ZXJvLiBUaGVzZSBhcmUgcmVhbCwgaW5kZXhlZCBjb2x1bW5zLlxuICBzZWFyY2hhYmxlRmllbGRzOiBbJ25hbWUnLCAnY2FtcGFpZ25fY29kZSddLFxuICBoaWdobGlnaHRGaWVsZHM6IFsnY2FtcGFpZ25fY29kZScsICduYW1lJywgJ3R5cGUnLCAnc3RhdHVzJywgJ3N0YXJ0X2RhdGUnXSxcblxuICAvLyBFdmVyeSBvdGhlciBidXNpbmVzcyBvYmplY3Qgd2l0aCBhIGRldGFpbCBwYWdlIGdyb3VwcyBpdHMgZmllbGRzOyBjYW1wYWlnblxuICAvLyB3YXMgb25lIG9mIHRoZSB0d28gdGhhdCBkaWQgbm90LCBzbyBpdHMgZGV0YWlsIHBhZ2UgZmVsbCBiYWNrIHRvIG9uZSBmbGF0XG4gIC8vIDMwLWZpZWxkIGdyaWQgd2l0aCB0aGUgUk9JIGZvcm11bGFzIHNpdHRpbmcgbmV4dCB0byB0aGUgY2FtcGFpZ24gbmFtZS4gVGhlXG4gIC8vIGxhYmVscyBtaXJyb3IgdGhlIHNlY3Rpb25zIHRoZSBjYW1wYWlnbiBmb3JtIHVzZXMgKENhbXBhaWduIEluZm9ybWF0aW9uIC9cbiAgLy8gU2NoZWR1bGUgLyBCdWRnZXQgJiBST0kgLyBQZXJmb3JtYW5jZSkgc28gdGhlIHR3byBzdXJmYWNlcyBhZ3JlZSBcdTIwMTQgdGhlXG4gIC8vIGZvcm0ncyBvbGQgdGhyZWUtc2VjdGlvbiBzaGFwZSBidXJpZWQgdGhlIHR3byBtYW51YWwtZW50cnkgY29zdCBmaWVsZHMgaW4gYVxuICAvLyBjb21iaW5lZCBcIlNjaGVkdWxlICYgQnVkZ2V0XCIgcm93IGFuZCB3YXMgc3BsaXQgdG8gbWF0Y2ggdGhpcyBvbmUgKCM1OTcpLlxuICBmaWVsZEdyb3VwczogW1xuICAgIHsga2V5OiAnYmFzaWMnLCAgICAgIGxhYmVsOiAnQ2FtcGFpZ24gSW5mb3JtYXRpb24nLCBpY29uOiAnbWVnYXBob25lJyB9LFxuICAgIHsga2V5OiAnc2NoZWR1bGUnLCAgIGxhYmVsOiAnU2NoZWR1bGUnLCAgICAgICAgICAgICBpY29uOiAnY2FsZW5kYXInIH0sXG4gICAgeyBrZXk6ICdidWRnZXQnLCAgICAgbGFiZWw6ICdCdWRnZXQgJiBST0knLCAgICAgICAgIGljb246ICdkb2xsYXItc2lnbicgfSxcbiAgICB7IGtleTogJ21ldHJpY3MnLCAgICBsYWJlbDogJ1BlcmZvcm1hbmNlJywgICAgICAgICAgaWNvbjogJ2Jhci1jaGFydCcgfSxcbiAgICB7IGtleTogJ2Fzc2lnbm1lbnQnLCBsYWJlbDogJ093bmVyc2hpcCcsICAgICAgICAgICAgaWNvbjogJ3VzZXInIH0sXG4gICAgeyBrZXk6ICdhc3NldHMnLCAgICAgbGFiZWw6ICdDYW1wYWlnbiBBc3NldHMnLCAgICAgIGljb246ICdsaW5rJywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gUGxhdGZvcm0gb3duZXJzaGlwIGFuY2hvciBcdTIwMTQgY2Fub25pY2FsIG5vdGUgaW4gYGFjY291bnQub2JqZWN0LnRzYCAoIzU0OCkuXG4gICAgb3duZXJfaWQ6IEZpZWxkLmxvb2t1cCgnc3lzX3VzZXInLCB7XG4gICAgICBsYWJlbDogJ0NhbXBhaWduIE93bmVyJyxcbiAgICAgIGdyb3VwOiAnYXNzaWdubWVudCcsXG4gICAgICBzeXN0ZW06IHRydWUsXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBBdXRvTnVtYmVyIGZpZWxkXG4gICAgY2FtcGFpZ25fY29kZTogRmllbGQuYXV0b251bWJlcih7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnQ2FtcGFpZ24gQ29kZScsXG4gICAgICBmb3JtYXQ6ICdDUEctezAwMDB9JyxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBCYXNpYyBJbmZvcm1hdGlvblxuICAgIG5hbWU6IEZpZWxkLnRleHQoe1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ0NhbXBhaWduIE5hbWUnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBtYXhMZW5ndGg6IDI1NSxcbiAgICB9KSxcblxuICAgIC8vIEFEUi0wMDc5IHJlY29yZCB0aXRsZSAod2FzIHRpdGxlRm9ybWF0ICd7Y2FtcGFpZ25fY29kZX0gLSB7bmFtZX0nKS5cbiAgICBkaXNwbGF5X3RpdGxlOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbGFiZWw6ICdEaXNwbGF5IFRpdGxlJyxcbiAgICAgIGV4cHJlc3Npb246IEZgcmVjb3JkLmNhbXBhaWduX2NvZGUgKyBcIiAtIFwiICsgcmVjb3JkLm5hbWVgLFxuICAgIH0pLFxuXG4gICAgZGVzY3JpcHRpb246IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbGFiZWw6ICdEZXNjcmlwdGlvbicsXG4gICAgfSksXG4gICAgXG4gICAgLy8gVHlwZSAmIENoYW5uZWxcbiAgICB0eXBlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ0NhbXBhaWduIFR5cGUnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnRW1haWwnLCB2YWx1ZTogJ2VtYWlsJywgZGVmYXVsdDogdHJ1ZSB9LFxuICAgICAgICB7IGxhYmVsOiAnV2ViaW5hcicsIHZhbHVlOiAnd2ViaW5hcicgfSxcbiAgICAgICAgeyBsYWJlbDogJ1RyYWRlIFNob3cnLCB2YWx1ZTogJ3RyYWRlX3Nob3cnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDb25mZXJlbmNlJywgdmFsdWU6ICdjb25mZXJlbmNlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRGlyZWN0IE1haWwnLCB2YWx1ZTogJ2RpcmVjdF9tYWlsJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU29jaWFsIE1lZGlhJywgdmFsdWU6ICdzb2NpYWxfbWVkaWEnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDb250ZW50IE1hcmtldGluZycsIHZhbHVlOiAnY29udGVudCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1BhcnRuZXIgTWFya2V0aW5nJywgdmFsdWU6ICdwYXJ0bmVyJyB9LFxuICAgICAgXVxuICAgIH0pLFxuICAgIFxuICAgIGNoYW5uZWw6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnUHJpbWFyeSBDaGFubmVsJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0RpZ2l0YWwnLCB2YWx1ZTogJ2RpZ2l0YWwnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTb2NpYWwnLCB2YWx1ZTogJ3NvY2lhbCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0VtYWlsJywgdmFsdWU6ICdlbWFpbCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0V2ZW50cycsIHZhbHVlOiAnZXZlbnRzJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUGFydG5lcicsIHZhbHVlOiAncGFydG5lcicgfSxcbiAgICAgIF1cbiAgICB9KSxcbiAgICBcbiAgICAvLyBTdGF0dXNcbiAgICBzdGF0dXM6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnU3RhdHVzJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ1BsYW5uaW5nJywgdmFsdWU6ICdwbGFubmluZycsIGNvbG9yOiAnIzk5OTk5OScsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ0luIFByb2dyZXNzJywgdmFsdWU6ICdpbl9wcm9ncmVzcycsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0NvbXBsZXRlZCcsIHZhbHVlOiAnY29tcGxldGVkJywgY29sb3I6ICcjMDBBQTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQWJvcnRlZCcsIHZhbHVlOiAnYWJvcnRlZCcsIGNvbG9yOiAnI0ZGMDAwMCcgfSxcbiAgICAgIF0sXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIERhdGVzXG4gICAgc3RhcnRfZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBncm91cDogJ3NjaGVkdWxlJyxcbiAgICAgIGxhYmVsOiAnU3RhcnQgRGF0ZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgIH0pLFxuICAgIFxuICAgIGVuZF9kYXRlOiBGaWVsZC5kYXRlKHtcbiAgICAgIGdyb3VwOiAnc2NoZWR1bGUnLFxuICAgICAgbGFiZWw6ICdFbmQgRGF0ZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgIH0pLFxuICAgIFxuICAgIC8vIEJ1ZGdldCAmIFJPSVxuICAgIGJ1ZGdldGVkX2Nvc3Q6IEZpZWxkLmN1cnJlbmN5KHsgXG4gICAgICBncm91cDogJ2J1ZGdldCcsXG4gICAgICBsYWJlbDogJ0J1ZGdldGVkIENvc3QnLFxuICAgICAgbWluOiAwLFxuICAgIH0pLFxuICAgIFxuICAgIGFjdHVhbF9jb3N0OiBGaWVsZC5jdXJyZW5jeSh7IFxuICAgICAgZ3JvdXA6ICdidWRnZXQnLFxuICAgICAgbGFiZWw6ICdBY3R1YWwgQ29zdCcsXG4gICAgICBtaW46IDAsXG4gICAgfSksXG4gICAgXG4gICAgZXhwZWN0ZWRfcmV2ZW51ZTogRmllbGQuY3VycmVuY3koeyBcbiAgICAgIGdyb3VwOiAnYnVkZ2V0JyxcbiAgICAgIGxhYmVsOiAnRXhwZWN0ZWQgUmV2ZW51ZScsXG4gICAgICBtaW46IDAsXG4gICAgfSksXG4gICAgXG4gICAgLy8gXHUyNkQ0IE5PVCBgcmVhZG9ubHlgIChoZXJlIGFuZCBvbiB0aGUgbnVtXyogc25hcHNob3QgZmllbGRzIGJlbG93KSwgYW5kIHRoZVxuICAgIC8vIHJlYXNvbiBob2xkcyBvbiB0aGUgcGlubmVkIGVuZ2luZSByYXRoZXIgdGhhbiBvbiB0aGUgcmV0aXJlZCAxNi54IGNsYWltXG4gICAgLy8gdGhpcyBub3RlIHVzZWQgdG8gY2FycnkuIFRoZSBtZXRyaWMgYmxvY2sgXHUyMDE0IGBDQU1QQUlHTl9NRVRSSUNfRklFTERTYCBpblxuICAgIC8vIGBjYW1wYWlnbi5ob29rLnRzYCBcdTIwMTQgaXMgd3JpdHRlbiBieSBGT1VSIHJlZnJlc2ggaG9va3MsIG5vdCBieSB0aGVcbiAgICAvLyBsb25nLXJldGlyZWQgYGNhbXBhaWduX3NuYXBzaG90X21ldHJpY3NgOiBgY2FtcGFpZ25fbWV0cmljc19yZWZyZXNoYCxcbiAgICAvLyBgY2FtcGFpZ25fYXR0cmlidXRpb25fcmVmcmVzaGAsIGBjYW1wYWlnbl9sZWFkX2NvbnZlcnNpb25fcmVmcmVzaGAgYW5kXG4gICAgLy8gYGNhbXBhaWduX21lbWJlcl9tZXRyaWNzX3JlZnJlc2hgLiBFdmVyeSBvbmUgb2YgdGhlbSB3cml0ZXNcbiAgICAvLyBgYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduJykudXBkYXRlKC4uLilgLCBhbmQgbm9uZSBkZWNsYXJlcyBgSG9vay5ydW5Bc2AsXG4gICAgLy8gd2hpY2ggZGVmYXVsdHMgdG8gYCdpbmhlcml0J2AgXHUyMDE0IHNvIGBjdHguYXBpYCBpcyBhIGBTY29wZWRDb250ZXh0YCBvdmVyIHRoZVxuICAgIC8vIEFDVElORyBVU0VSJ3MgY29udGV4dCwgYW5kIHRoZSBrZXlzIGFyZSBDQUxMRVItc3VwcGxpZWQgdG8gYVxuICAgIC8vIG5vbi1gaXNTeXN0ZW1gIFVQREFURSwgZXhhY3RseSB3aGF0IGBzdHJpcFJlYWRvbmx5RmllbGRzYCBkZWxldGVzLiBUaGVpclxuICAgIC8vIGxlYXN0LXByaXZpbGVnZWQgdHJpZ2dlciBpcyBhbiBvcmRpbmFyeSB1c2VyIGVkaXQgXHUyMDE0IGEgcmVwIG1vdmluZyBhXG4gICAgLy8gY2FtcGFpZ24ncyBzdGF0dXMsIHNhdmluZyBhbiBvcHBvcnR1bml0eSwgZW5yb2xsaW5nIGEgbWVtYmVyIFx1MjAxNCBzb1xuICAgIC8vIGByZWFkb25seWAgaGVyZSB3b3VsZCBmcmVlemUgdGhlIHdob2xlIGJsb2NrIGF0IGl0cyBzZWVkZWQgdmFsdWVzLlxuICAgIC8vIE1lYXN1cmVkIGluIGB0ZXN0L2FjdGl2aXR5LXJlY2VuY3kudGVzdC50c2AsIHdoaWNoIHJ1bnMgdGhpcyBzYW1lXG4gICAgLy8gYGN0eC5hcGlgIHNoYXBlIHRocm91Z2ggdGhlIHJlYWwgZW5naW5lIHVuZGVyIGEgcGxhaW4gdXNlciBjb250ZXh0LlxuICAgIGFjdHVhbF9yZXZlbnVlOiBGaWVsZC5jdXJyZW5jeSh7IFxuICAgICAgZ3JvdXA6ICdidWRnZXQnLFxuICAgICAgbGFiZWw6ICdBY3R1YWwgUmV2ZW51ZScsXG4gICAgICBtaW46IDAsXG4gICAgfSksXG4gICAgXG4gICAgLy8gTWV0cmljc1xuICAgIHRhcmdldF9zaXplOiBGaWVsZC5udW1iZXIoe1xuICAgICAgZ3JvdXA6ICdtZXRyaWNzJyxcbiAgICAgIGxhYmVsOiAnVGFyZ2V0IFNpemUnLFxuICAgICAgZGVzY3JpcHRpb246ICdUYXJnZXQgbnVtYmVyIG9mIGxlYWRzL2NvbnRhY3RzJyxcbiAgICAgIG1pbjogMCxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBOT1QgYHJlYWRvbmx5YDogd3JpdHRlbiBieSB0aGUgc2FtZSBmb3VyIHJlZnJlc2ggaG9va3MsIGFuZCBmb3IgdGhlIHNhbWVcbiAgICAvLyByZWFzb24gXHUyMDE0IHNlZSB0aGUgbm90ZSBvbiBgYWN0dWFsX3JldmVudWVgIGFib3ZlLlxuICAgIC8vIERlZmluaXRpb246IHRvdGFsIG1lbWJlcnMgZW5yb2xsZWQuXG4gICAgbnVtX3NlbnQ6IEZpZWxkLm51bWJlcih7XG4gICAgICBncm91cDogJ21ldHJpY3MnLFxuICAgICAgbGFiZWw6ICdOdW1iZXIgU2VudCcsXG4gICAgICBtaW46IDAsXG4gICAgfSksXG4gICAgXG4gICAgbnVtX3Jlc3BvbnNlczogRmllbGQubnVtYmVyKHtcbiAgICAgIGdyb3VwOiAnbWV0cmljcycsXG4gICAgICBsYWJlbDogJ051bWJlciBvZiBSZXNwb25zZXMnLFxuICAgICAgbWluOiAwLFxuICAgIH0pLFxuICAgIFxuICAgIG51bV9sZWFkczogRmllbGQubnVtYmVyKHtcbiAgICAgIGdyb3VwOiAnbWV0cmljcycsXG4gICAgICBsYWJlbDogJ051bWJlciBvZiBMZWFkcycsXG4gICAgICBtaW46IDAsXG4gICAgfSksXG4gICAgXG4gICAgbnVtX2NvbnZlcnRlZF9sZWFkczogRmllbGQubnVtYmVyKHtcbiAgICAgIGdyb3VwOiAnbWV0cmljcycsXG4gICAgICBsYWJlbDogJ0NvbnZlcnRlZCBMZWFkcycsXG4gICAgICBtaW46IDAsXG4gICAgfSksXG4gICAgXG4gICAgbnVtX29wcG9ydHVuaXRpZXM6IEZpZWxkLm51bWJlcih7XG4gICAgICBncm91cDogJ21ldHJpY3MnLFxuICAgICAgbGFiZWw6ICdPcHBvcnR1bml0aWVzIENyZWF0ZWQnLFxuICAgICAgbWluOiAwLFxuICAgIH0pLFxuICAgIFxuICAgIG51bV93b25fb3Bwb3J0dW5pdGllczogRmllbGQubnVtYmVyKHtcbiAgICAgIGdyb3VwOiAnbWV0cmljcycsXG4gICAgICBsYWJlbDogJ1dvbiBPcHBvcnR1bml0aWVzJyxcbiAgICAgIG1pbjogMCxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBDYWxjdWxhdGVkIE1ldHJpY3MgKEZvcm11bGEgRmllbGRzKVxuICAgIHJlc3BvbnNlX3JhdGU6IEZpZWxkLmZvcm11bGEoe1xuICAgICAgZ3JvdXA6ICdtZXRyaWNzJyxcbiAgICAgIGxhYmVsOiAnUmVzcG9uc2UgUmF0ZSAlJyxcbiAgICAgIGV4cHJlc3Npb246IEZgY29hbGVzY2UocmVjb3JkLm51bV9zZW50LCAwKSA+IDAgPyAoY29hbGVzY2UocmVjb3JkLm51bV9yZXNwb25zZXMsIDApICogMTAwLjApIC8gcmVjb3JkLm51bV9zZW50IDogMC4wYCxcbiAgICAgIHNjYWxlOiAyLFxuICAgIH0pLFxuICAgIFxuICAgIHJvaTogRmllbGQuZm9ybXVsYSh7XG4gICAgICBncm91cDogJ2J1ZGdldCcsXG4gICAgICBsYWJlbDogJ1JPSSAlJyxcbiAgICAgIGV4cHJlc3Npb246IEZgY29hbGVzY2UocmVjb3JkLmFjdHVhbF9jb3N0LCAwKSA+IDAgPyAoKGNvYWxlc2NlKHJlY29yZC5hY3R1YWxfcmV2ZW51ZSwgMCkgLSByZWNvcmQuYWN0dWFsX2Nvc3QpICogMTAwLjApIC8gcmVjb3JkLmFjdHVhbF9jb3N0IDogMC4wYCxcbiAgICAgIHNjYWxlOiAyLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIE5vIGBwYXJlbnRfY2FtcGFpZ25gLiBDYW1wYWlnbiBoaWVyYXJjaHkgd2FzIGRlY2xhcmVkIGFuZCBuZXZlciB1c2VkOiBub1xuICAgIC8vIHBhZ2UsIGRvYyBvciByZXBvcnQgbWVudGlvbmVkIGl0LCBhbmQgdGhlIGhvbmVzdCBjb25zdW1lciBmb3IgaXQgXHUyMDE0IGFcbiAgICAvLyByb2xsZWQtdXAgUk9JIFx1MjAxNCBjYW5ub3QgYmUgb25lIGRlY2xhcmF0aW9uLiBgcm9pYCBoZXJlIGlzIGEgZm9ybXVsYSBvdmVyXG4gICAgLy8gdGhpcyBjYW1wYWlnbidzIE9XTiBgYWN0dWFsX2Nvc3RgIC8gYGFjdHVhbF9yZXZlbnVlYCwgc28gYSBoaWVyYXJjaHkgUk9JXG4gICAgLy8gd291bGQgcHV0IGEgc2Vjb25kLCBkaWZmZXJlbnRseS1zY29wZWQgUk9JIG9uIHRoZSBzYW1lIHJlY29yZCBhbmQgbGVhdmVcbiAgICAvLyBldmVyeSByZWFkZXIgdG8gZ3Vlc3Mgd2hpY2ggb25lIHRoZXkgd2VyZSBsb29raW5nIGF0LlxuICAgIFxuICAgIC8vIENhbXBhaWduIEFzc2V0c1xuICAgIGxhbmRpbmdfcGFnZV91cmw6IEZpZWxkLnVybCh7XG4gICAgICBncm91cDogJ2Fzc2V0cycsXG4gICAgICBsYWJlbDogJ0xhbmRpbmcgUGFnZScsXG4gICAgfSksXG4gICAgXG4gICAgaXNfYWN0aXZlOiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGdyb3VwOiAnYXNzZXRzJyxcbiAgICAgIGxhYmVsOiAnQWN0aXZlJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogdHJ1ZSxcbiAgICB9KSxcbiAgfSxcbiAgXG4gIC8vIERhdGFiYXNlIGluZGV4ZXNcbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ25hbWUnXSB9LFxuICAgIHsgZmllbGRzOiBbJ3R5cGUnXSB9LFxuICAgIHsgZmllbGRzOiBbJ3N0YXR1cyddIH0sXG4gICAgeyBmaWVsZHM6IFsnc3RhcnRfZGF0ZSddIH0sXG4gICAgeyBmaWVsZHM6IFsnb3duZXJfaWQnXSB9LFxuICBdLFxuICBcbiAgLy8gRW5hYmxlIGFkdmFuY2VkIGZlYXR1cmVzXG4gIC8vIEFQSSBzdXJmYWNlLiBIaXN0b3J5IFx1MjE5MiBGaWVsZC50cmFja0hpc3RvcnkgKEFEUi0wMDUyKS5cbiAgZW5hYmxlOiB7XG4gICAgYXBpRW5hYmxlZDogdHJ1ZSxcbiAgICBhcGlNZXRob2RzOiBbJ2dldCcsICdsaXN0JywgJ2NyZWF0ZScsICd1cGRhdGUnLCAnZGVsZXRlJ10sXG4gIH0sXG4gIFxuICAvLyBWYWxpZGF0aW9uIFJ1bGVzXG4gIC8vXG4gIC8vIFByZWRpY2F0ZXMgYmVsb3cgYXJlIFRPVEFMOiBldmVyeSBgcmVjb3JkLnhgIHJlYWQgaXMgYGhhcygpYC1ndWFyZGVkLCBzbyB0aGVcbiAgLy8gcnVsZSByZXR1cm5zIGEgdmVyZGljdCBldmVuIHdoZW4gdGhlIG1lcmdlZCByZWNvcmQgaGFzIG5vIHN1Y2gga2V5LiBTZWVcbiAgLy8gQUdFTlRTLm1kIFwiVmFsaWRhdGlvbiBwcmVkaWNhdGVzIG11c3QgYmUgVE9UQUxcIiBhbmRcbiAgLy8gdGVzdC9vYmplY3QtdmFsaWRhdGlvbi1wcmVkaWNhdGVzLnRlc3QudHMsIHdoaWNoIGZhaWxzIHRoZSBidWlsZCBvdGhlcndpc2UuXG4gIHZhbGlkYXRpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2VuZF9hZnRlcl9zdGFydCcsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0VuZCBEYXRlIG11c3QgYmUgYWZ0ZXIgU3RhcnQgRGF0ZScsXG4gICAgICAvLyBgPD1gLCBub3QgYDxgOiB0aGUgbWVzc2FnZSBwcm9taXNlcyBcImFmdGVyXCIsIHNvIGEgY2FtcGFpZ24gdGhhdCBlbmRzXG4gICAgICAvLyB0aGUgZGF5IGl0IHN0YXJ0cyBpcyBhIHZpb2xhdGlvbi4gTWF0Y2hlcyBgY3JtX2NvbnRyYWN0YCdzIHR3aW4gcnVsZVxuICAgICAgLy8gYW5kIGBjcm1fZm9yZWNhc3QucGVyaW9kX2VuZF9hZnRlcl9zdGFydGAgKCM1MTQgaXRlbSAxMikuXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5lbmRfZGF0ZSkgJiYgcmVjb3JkLmVuZF9kYXRlICE9IG51bGwgJiYgaGFzKHJlY29yZC5zdGFydF9kYXRlKSAmJiByZWNvcmQuc3RhcnRfZGF0ZSAhPSBudWxsICYmIHJlY29yZC5lbmRfZGF0ZSA8PSByZWNvcmQuc3RhcnRfZGF0ZWAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnYWN0dWFsX2Nvc3Rfd2l0aGluX2J1ZGdldCcsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiAnQWN0dWFsIENvc3QgZXhjZWVkcyBCdWRnZXRlZCBDb3N0JyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmFjdHVhbF9jb3N0KSAmJiByZWNvcmQuYWN0dWFsX2Nvc3QgIT0gbnVsbCAmJiBoYXMocmVjb3JkLmJ1ZGdldGVkX2Nvc3QpICYmIHJlY29yZC5idWRnZXRlZF9jb3N0ICE9IG51bGwgJiYgcmVjb3JkLmFjdHVhbF9jb3N0ID4gcmVjb3JkLmJ1ZGdldGVkX2Nvc3RgLFxuICAgIH0sXG4gIF0sXG4gIFxuICAvLyBXb3JrZmxvdyBSdWxlc1xuICAvLyBcdTI2QTBcdUZFMEYgTm8gYHdvcmtmbG93c1tdYCBoZXJlLCBhbmQgbm9uZSBpcyBwb3NzaWJsZTogb2JqZWN0IGB3b3JrZmxvd3NbXWAgd2VyZVxuICAvLyByZW1vdmVkIGZyb20gdGhlIHBsYXRmb3JtLiBGaWVsZCB1cGRhdGVzIGxpdmUgaW4gdGhpcyBvYmplY3QncyBgKi5ob29rLnRzYDtcbiAgLy8gc2NoZWR1bGVkIHN0YXR1cyBmbGlwcyBhbmQgbm90aWZpY2F0aW9ucyBsaXZlIGluIGBzcmMvKi9mbG93cy8qLmZsb3cudHNgLlxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbl9tZW1iZXIub2JqZWN0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9vYmplY3RzL2NhbXBhaWduX21lbWJlci5vYmplY3QudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IE9iamVjdFNjaGVtYSwgRmllbGQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB7IFAgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogQ2FtcGFpZ24gTWVtYmVyIE9iamVjdFxuICpcbiAqIExpbmtzIGEgTGVhZCBPUiBDb250YWN0IHRvIGEgQ2FtcGFpZ24gYW5kIHRyYWNrcyB0aGUgcmVzcG9uc2VcbiAqIGxpZmVjeWNsZSBgc2VudCBcdTIxOTIgcmVzcG9uZGVkIC8gY29udmVydGVkIC8gdW5zdWJzY3JpYmVkYC5cbiAqIFVzZWQgYnkgdGhlIGNhbXBhaWduLWVucm9sbG1lbnQgZmxvdyBhbmQgYnkgUk9JIGRhc2hib2FyZHMuXG4gKlxuICogXHUyNkEwXHVGRTBGIFRoZSBsaWZlY3ljbGUgc3RvcHMgd2hlcmUgdGhlIHBsYXRmb3JtJ3Mgd3JpdGVycyBzdG9wICgjNTk3KS4gSXQgdXNlZCB0b1xuICogcmVhZCBgU2VudCBcdTIxOTIgT3BlbmVkIFx1MjE5MiBDbGlja2VkIFx1MjE5MiBSZXNwb25kZWQgXHUyMTkyIENvbnZlcnRlZGAgd2l0aCBgYm91bmNlZGAgYmVzaWRlXG4gKiBpdCwgcGx1cyBgZmlyc3Rfb3BlbmVkX2RhdGVgIC8gYGZpcnN0X2NsaWNrZWRfZGF0ZWAgc3RhbXBzIFx1MjAxNCBzaXggdmFsdWVzIGFuZFxuICogdHdvIGNvbHVtbnMgdGhhdCBOT1RISU5HIGluIHRoaXMgYXBwIG9yIG9uIHRoZSBwbGF0Zm9ybSBjb3VsZCBldmVyIHdyaXRlLlxuICogYEBvYmplY3RzdGFjay9wbHVnaW4tZW1haWxgIGlzIFwidHJhbnNwb3J0LXBsdWdnYWJsZSBPVVRCT1VORCBkZWxpdmVyeSB3aXRoXG4gKiBzeXNfZW1haWwgcGVyc2lzdGVuY2VcIjogaXRzIGBzeXNfZW1haWwuc3RhdHVzYCB2b2NhYnVsYXJ5IGlzXG4gKiBgcXVldWVkIHwgc2VudCB8IGZhaWxlZGAsIHRoZXJlIGlzIG5vIG9wZW4vY2xpY2sgd2ViaG9vaywgbm8gYm91bmNlXG4gKiBpbmdlc3Rpb24sIGFuZCBubyB0cmFja2luZyBwaXhlbCBhbnl3aGVyZSBpbiB0aGUgaW5zdGFsbGVkIHBsYXRmb3JtXG4gKiAobWVhc3VyZWQgb24gMTcuMC4wLXJjLjYpLiBTbyBhbiBhdXRob3IgcmVhZGluZyB0aGlzIG9iamVjdCB3YXMgcHJvbWlzZWRcbiAqIGVuZ2FnZW1lbnQgdHJhY2tpbmcgdGhlIHByb2R1Y3QgY2Fubm90IGRlbGl2ZXIsIGFuZCBldmVyeSBvbmUgb2YgdGhvc2VcbiAqIHZhbHVlcyB3b3VsZCBoYXZlIHN0YXllZCBhdCBpdHMgZGVmYXVsdCBmb3JldmVyLlxuICpcbiAqIFJlbW92ZWQgcmF0aGVyIHRoYW4gd2lyZWQsIHBlciBBRFItMDA0OSdzIGVuZm9yY2Utb3ItcmVtb3ZlIHNwaXJpdDogdGhleVxuICogY29tZSBiYWNrIHRoZSBkYXkgYSByZWFsIHRyYWNraW5nIGludGVncmF0aW9uIGV4aXN0cyB0byB3cml0ZSB0aGVtLCBhbmQgbm90XG4gKiBiZWZvcmUuIFdoYXQgc3Vydml2ZXMgaXMgdGhlIHBhcnQgd2l0aCBhIHJlYWwgd3JpdGVyIFx1MjAxNCBzZWUgdGhlIHdyaXRlciB0YWJsZVxuICogYmVzaWRlIGVhY2ggZmllbGQgYmVsb3cuXG4gKi9cbmV4cG9ydCBjb25zdCBDYW1wYWlnbk1lbWJlciA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX2NhbXBhaWduX21lbWJlcicsXG4gIGxhYmVsOiAnQ2FtcGFpZ24gTWVtYmVyJyxcbiAgcGx1cmFsTGFiZWw6ICdDYW1wYWlnbiBNZW1iZXJzJyxcbiAgaWNvbjogJ3VzZXItcGx1cycsXG4gIGRlc2NyaXB0aW9uOiAnTWVtYmVyc2hpcCBhbmQgcmVzcG9uc2UgdHJhY2tpbmcgZm9yIG1hcmtldGluZyBjYW1wYWlnbnMnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIE1lbWJlcnNoaXAgaXMgYW4gYXR0cmlidXRlIG9mXG4gIC8vIHRoZSBjYW1wYWlnbiwgc28gcmVjb3JkIGFjY2VzcyBERVJJVkVTIGZyb20gaXQgKEFEUi0wMDU1KS4gVGhlIHJlbGF0aW9uXG4gIC8vIHJlc29sdmVyIGFjY2VwdHMgdGhlIFJFUVVJUkVEIGBjcm1fY2FtcGFpZ25gIExPT0tVUCBhcyB0aGUgcGFyZW50LCBzbyBub1xuICAvLyBtYXN0ZXItZGV0YWlsIGNvbnZlcnNpb24gaXMgbmVlZGVkLlxuICAvL1xuICAvLyBUaGUgZGVyaXZhdGlvbiBkZWxpdmVycyBleGFjdGx5IFwibWVtYmVycyB3aG9zZSBgY3JtX2NhbXBhaWduYCB0aGUgY2FsbGVyXG4gIC8vIGNhbiByZWFkXCIuIFx1MjZBMFx1RkUwRiBNYXN0ZXIgYWNjZXNzaWJpbGl0eSByZXNvbHZlcyB0aHJvdWdoIHRoZSBzYW1lIHBhdGhzIGEgZGlyZWN0XG4gIC8vIHJlYWQgb2YgdGhlIGNhbXBhaWduIHRha2VzIFx1MjAxNCBvd25lcnNoaXAgYW5kIGBzeXNfcmVjb3JkX3NoYXJlYCBncmFudHMgZm9sZGVkXG4gIC8vIGluIEFMT05HU0lERSB0aGUgbWFzdGVyJ3Mgcm93LWxldmVsIHNlY3VyaXR5IHBvbGljaWVzLCBub3QgdGhlIHBvbGljaWVzXG4gIC8vIGFsb25lLiBgdGVzdC9wYXJlbnQtZGVyaXZlZC1yZWFjaC50ZXN0LnRzYCBwaW5zIHRoYXQsIGFuZCB3YXMgd3JpdHRlbiB0byBnb1xuICAvLyByZWQgdGhlIGRheSB0aGUgcGxhdGZvcm0gY2hhbmdlcyBpdDogYW4gZWFybGllciB2ZXJzaW9uIGNvbnN1bHRlZCBtYXN0ZXJcbiAgLy8gUkxTIE9OTFksIHVuZGVyIGEgU1lTVEVNIGNvbnRleHQsIHNvIHdpdGggbm8gcG9saWN5IG5hcnJvd2luZyBhIFNFTEVDVCBvblxuICAvLyBgY3JtX2NhbXBhaWduYCBhIG1lbWJlciByb3cgd2FzIHJlYWRhYmxlIGJ5IGV2ZXJ5IGhvbGRlciBvZiBvYmplY3QtbGV2ZWxcbiAgLy8gcmVhZCBvbiB0aGlzIG9iamVjdC5cbiAgLy9cbiAgLy8gXHUyNkEwXHVGRTBGIFRoZSB3cml0ZSBzaWRlIHJlYWNoZXMgZnVydGhlciB0aGFuIHJlYWRzOiB0aGUgcGxhdGZvcm0nc1xuICAvLyBgbWVtYmVyX2RlZmF1bHRgIHNldCBjYXJyaWVzIGFuIG93bmVyLW9ubHktd3JpdGVzIFJMUyBwb2xpY3kgb24gdXBkYXRlcyxcbiAgLy8gYW5kIGJlY2F1c2UgdGhlIGRlcml2YXRpb24gZm9sZHMgbWFzdGVyIFJMUyBpbiwgdGhhdCBwb2xpY3kgcmVhY2hlcyB0aHJvdWdoXG4gIC8vIHRvIG1lbWJlciB3cml0ZXMgXHUyMDE0IHNlZSB0aGUgYG1hcmtldGluZ19jYW1wYWlnbl91cGRhdGVzYCBub3RlIGluXG4gIC8vIGBzcmMvc2FsZXMvcHJvZmlsZXMvbWFya2V0aW5nLXVzZXIucHJvZmlsZS50c2AuXG4gIC8vXG4gIC8vIFx1MjZENCBOb3QgYHByaXZhdGVgOiB3aXRoIG5vIG93bmVyIGZpZWxkIG9uIHRoZSBqdW5jdGlvbiByb3cgdGhhdCByZXNvbHZlcyB0b1xuICAvLyBcIndob2V2ZXIgaW5zZXJ0ZWQgaXRcIiwgd2hpY2ggaXMgbm9ib2R5J3MgaWRlYSBvZiBjYW1wYWlnbiBtZW1iZXJzaGlwIGFuZFxuICAvLyBoaWRlcyByb3dzIHdyaXR0ZW4gYnkgdGhlIGVucm9sbG1lbnQgZmxvdy5cbiAgc2hhcmluZ01vZGVsOiAnY29udHJvbGxlZF9ieV9wYXJlbnQnLFxuXG4gIC8vIFBlci1maWVsZCBoaXN0b3J5IGlzIG9wdC1pbiB2aWEgYEZpZWxkLnRyYWNrSGlzdG9yeWAgKEFEUi0wMDUyKSwgc2V0IG9uXG4gIC8vIGBzdGF0dXNgIGJlbG93IFx1MjAxNCB0aGVyZSBpcyBubyBvYmplY3QtbGV2ZWwgaGlzdG9yeSBmbGFnLlxuXG4gIC8vIEFEUi0wMDc5OiBqdW5jdGlvbiByb3dzIGhhdmUgbm8gZGVyaXZhYmxlIHRleHQgdGl0bGU7IHBvaW50IHRoZSBjYW5vbmljYWxcbiAgLy8gbmFtZUZpZWxkIGF0IHRoZSBzdG9yZWQgYXV0b251bWJlciBleHBsaWNpdGx5IChhdXRvbnVtYmVyIGlzIG5vdCBpbiB0aGVcbiAgLy8gYXV0by1kZXJpdmF0aW9uIHdoaXRlbGlzdCkuXG4gIG5hbWVGaWVsZDogJ21lbWJlcl9udW1iZXInLFxuXG4gIC8vIExvYWQtYmVhcmluZyBvbiBUV08gc3VyZmFjZXMsIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyB3aHkgdGhpcyBsaXN0IGlzIG5vdFxuICAvLyB0aGUgc2lkZSB0aGF0IGdhdmUgd2F5IHRvIGZpeCBgZmllbGQtZ3JvdXAtc2hhZG93ZWRgIGJlbG93ICgjNzE1KS4gQmVzaWRlcyB0aGVcbiAgLy8gZGV0YWlsIGhpZ2hsaWdodCBzdHJpcCwgaXQgaXMgd2hhdCBjdXJhdGVzIHRoZSBtZW1iZXJzIHBhbmVsIG9uIGFcbiAgLy8gY2FtcGFpZ24ncyBkZXRhaWwgcGFnZTogYSByZWxhdGVkIGxpc3QgdGFrZXMgaXRzIGNvbHVtbnMgZnJvbSB0aGUgY2hpbGQnc1xuICAvLyBgaGlnaGxpZ2h0RmllbGRzYCBtaW51cyB0aGUgbG9va3VwIGl0IGlzIHNjb3BlZCBieSwgYW5kIHRoaXMgb2JqZWN0IHNoaXBzXG4gIC8vIG5vIHZpZXcgYXQgYWxsLCBzbyBkcm9wcGluZyBgY3JtX2xlYWRgL2Bjcm1fY29udGFjdGAgaGVyZSB3b3VsZCBsZWF2ZSB0aGF0XG4gIC8vIHBhbmVsIHNob3dpbmcgU3RhdHVzIC8gUmVzcG9uc2UgRGF0ZSBhbmQgbm8gcGVyc29uIFx1MjAxNCBtZWFzdXJlZCBhbmQgcGlubmVkIGluXG4gIC8vIGB0ZXN0L3ZpZXctcmVmZXJlbmNlcy50ZXN0LnRzYCAoIzk0NCkuXG4gIGhpZ2hsaWdodEZpZWxkczogWydjcm1fY2FtcGFpZ24nLCAnY3JtX2xlYWQnLCAnY3JtX2NvbnRhY3QnLCAnc3RhdHVzJywgJ3Jlc3BvbnNlX2RhdGUnXSxcblxuICAvLyBCb3RoIGdyb3VwcyByZW5kZXIgb24gZGV0YWlsIHBhZ2VzIGFzIHdlbGwgYXMgb24gZm9ybXMsIGFuZCBrZWVwaW5nIHRoZW1cbiAgLy8gdGhhdCB3YXkgaXMgYSBjb25zdHJhaW50IG9uIHRoZSB0d28gbGlzdHMgYWJvdmUsIG5vdCBhIGZyZWUgY2hvaWNlICgjNzE1KS5cbiAgLy8gQSBzeW50aGVzaXplZCBkZXRhaWwgcGFnZSBob2lzdHMgdGhlIHJlY29yZCB0aXRsZSBwbHVzIHRoZSBmaXJzdCBmb3VyXG4gIC8vIGhpZ2hsaWdodEZpZWxkcyBvdXQgb2YgdGhlIGJvZHksIHNvIGEgZ3JvdXAgd2hvc2UgZXZlcnkgZmllbGQgaXMgaG9pc3RlZFxuICAvLyBrZWVwcyBpdHMgaGVhZGluZyBvbiBmb3JtcyBhbmQgc2lsZW50bHkgZGlzYXBwZWFycyBmcm9tIGRldGFpbCBwYWdlc1xuICAvLyAoYGZpZWxkLWdyb3VwLXNoYWRvd2VkYCkuXG4gIC8vIGBiYXNpY2Agd2FzIGV4YWN0bHkgdGhhdDogbWVtYmVyX251bWJlciBpcyB0aGUgdGl0bGUsIGFuZCBjYW1wYWlnbi9sZWFkL1xuICAvLyBjb250YWN0IGFyZSB0aGUgZmlyc3QgdGhyZWUgb2YgdGhlIHN0cmlwLiBgYWRkZWRfZGF0ZWAgXHUyMDE0IHRoZSBlbnJvbGxtZW50XG4gIC8vIHN0YW1wLCB3aGljaCBkZXNjcmliZXMgdGhlIE1FTUJFUlNISVAgcmF0aGVyIHRoYW4gdGhlIHBlcnNvbidzIHJlc3BvbnNlIFx1MjAxNFxuICAvLyBzaXRzIGhlcmUgcmF0aGVyIHRoYW4gdW5kZXIgYHJlc3BvbnNlYCBzbyB0aGUgZ3JvdXAgaGFzIHNvbWV0aGluZyBvZiBpdHNcbiAgLy8gb3duIHRvIHNob3cuIFNhbWUgcmVzb2x1dGlvbiBhcyBgY3JtX3Rhc2tgJ3Mgc2hhZG93ZWQgYGFzc2lnbm1lbnRgIGdyb3VwXG4gIC8vICgjNTgyKTogbW92ZSB0aGUgZmllbGQgdG8gdGhlIGdyb3VwIGl0IHJlYWRzIHVuZGVyLCBsZWF2ZSB0aGUgc3RyaXAgYWxvbmUuXG4gIGZpZWxkR3JvdXBzOiBbXG4gICAgeyBrZXk6ICdiYXNpYycsICAgIGxhYmVsOiAnQmFzaWMgSW5mb3JtYXRpb24nLCBpY29uOiAnaW5mbycgfSxcbiAgICB7IGtleTogJ3Jlc3BvbnNlJywgbGFiZWw6ICdSZXNwb25zZSBUcmFja2luZycsIGljb246ICdhY3Rpdml0eScgfSxcbiAgXSxcblxuICBmaWVsZHM6IHtcbiAgICBtZW1iZXJfbnVtYmVyOiBGaWVsZC5hdXRvbnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnTWVtYmVyIE51bWJlcicsXG4gICAgICBmb3JtYXQ6ICdDTS17MDAwMDB9JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuXG4gICAgY3JtX2NhbXBhaWduOiBGaWVsZC5sb29rdXAoJ2NybV9jYW1wYWlnbicsIHtcbiAgICAgIGxhYmVsOiAnQ2FtcGFpZ24nLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuXG4gICAgICAvLyBDdXJhdGVzIHRoZSBtZW1iZXJzIHBhbmVsIG9uIGEgY2FtcGFpZ24gXHUyMDE0IGFuZCBpdCBpcyB0aGUgT05FIG1lY2hhbmlzbVxuICAgICAgLy8gdGhhdCBhY3R1YWxseSByZWFjaGVzIHRoYXQgcGFuZWwuIE1lYXN1cmVkIGluICM5NDQgYW5kIHJlc3RhdGVkIGluXG4gICAgICAvLyBgdGVzdC92aWV3LXJlZmVyZW5jZXMudGVzdC50c2A6IGEgZGV0YWlsLXBhZ2UgcmVsYXRlZCBsaXN0IHJlYWRzXG4gICAgICAvLyBgcmVsYXRlZExpc3RDb2x1bW5zYCBvbiB0aGUgQ0hJTEQncyBsb29rdXAgZmlyc3QsIGFuZCBvbmx5IHdpdGhvdXQgaXRcbiAgICAgIC8vIGZhbGxzIGJhY2sgdG8gdGhlIGNoaWxkJ3MgYGhpZ2hsaWdodEZpZWxkc2AgbWludXMgdGhpcyBsb29rdXAuIFRoZVxuICAgICAgLy8gY2hpbGQncyBgbGlzdGAgdmlldyBpcyBuZXZlciBjb25zdWx0ZWQsIHdoaWNoIGlzIHdoeSBhdXRob3Jpbmcgb25lXG4gICAgICAvLyBoZXJlIHdvdWxkIG5vdCBoYXZlIHNob3duIGFueXRoaW5nLlxuICAgICAgLy9cbiAgICAgIC8vIEl0IGlzIGEgU1VQRVJTRVQgb2YgdGhlIGZhbGxiYWNrIGl0IHJlcGxhY2VzIFx1MjAxNCBMZWFkIC8gQ29udGFjdCAvXG4gICAgICAvLyBTdGF0dXMgLyBSZXNwb25zZSBEYXRlLCBpbiB0aGF0IG9yZGVyIFx1MjAxNCBwbHVzIHRoZSBvbmUgY29sdW1uIHRoZSBwYW5lbFxuICAgICAgLy8gd2FzIG1pc3NpbmcuIGBhZGRlZF9kYXRlYCBpcyB0aGUgZW5yb2xsbWVudCBzdGFtcDogYHJlYWRvbmx5OiB0cnVlYFxuICAgICAgLy8gKCMxNjY3KSBhbmQgd3JpdHRlbiBvbiBldmVyeSBlbnJvbGxtZW50IGJ5IHRoZSB0d28gZWxldmF0ZWQgc3ViLWZsb3dzXG4gICAgICAvLyAjMTgwNyBidWlsdCBmb3IgaXQsIHNvIGEgbWFya2V0ZXIgY291bGQgc2VlIFdIRU4gYSBtZW1iZXIgcmVzcG9uZGVkXG4gICAgICAvLyBidXQgbm90IHdoZW4gdGhleSB3ZXJlIGFkZGVkLCBvbiBhIHJlZ2lzdGVyIHdob3NlIHdob2xlIHN1YmplY3QgaXNcbiAgICAgIC8vIHRoZSBlbnJvbGxtZW50LiBJdCBzaXRzIGFmdGVyIHRoZSBwZXJzb24gYW5kIGJlZm9yZSB0aGUgcmVzcG9uc2VcbiAgICAgIC8vIGxpZmVjeWNsZSwgd2hpY2ggaXMgdGhlIG9yZGVyIHRoZSByb3cgaGFwcGVucyBpbi5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2RDQgRGVsaWJlcmF0ZWx5IE5PVCBzb2x2ZWQgYnkgYWRkaW5nIGBhZGRlZF9kYXRlYCB0b1xuICAgICAgLy8gYGhpZ2hsaWdodEZpZWxkc2A6IHRoYXQgc3RyaXAgaXMgaG9pc3RlZCBvdXQgb2YgdGhlIGRldGFpbCBib2R5LCBhbmRcbiAgICAgIC8vIGBhZGRlZF9kYXRlYCBpcyB0aGUgb25seSBmaWVsZCBpbiB0aGUgYGJhc2ljYCBncm91cCB0aGF0IGlzIG5laXRoZXJcbiAgICAgIC8vIHRoZSByZWNvcmQgdGl0bGUgbm9yIGFscmVhZHkgaW4gdGhlIHN0cmlwIFx1MjAxNCBob2lzdGluZyBpdCB3b3VsZCBsZWF2ZVxuICAgICAgLy8gdGhlIGdyb3VwIHdpdGggbm90aGluZyBvZiBpdHMgb3duIGFuZCBzaWxlbnRseSB2YW5pc2ggaXRzIGhlYWRpbmdcbiAgICAgIC8vIGZyb20gZXZlcnkgZGV0YWlsIHBhZ2UgKGBmaWVsZC1ncm91cC1zaGFkb3dlZGAsIHRoZSB0cmFwIHRoZSBub3RlXG4gICAgICAvLyBhYm92ZSB0aGlzIG9iamVjdCdzIGBmaWVsZEdyb3Vwc2AgcmVjb3JkcyBiZWluZyByZXNjdWVkIGZyb20pLlxuICAgICAgcmVsYXRlZExpc3RDb2x1bW5zOiBbJ2NybV9sZWFkJywgJ2NybV9jb250YWN0JywgJ2FkZGVkX2RhdGUnLCAnc3RhdHVzJywgJ3Jlc3BvbnNlX2RhdGUnXSxcbiAgICB9KSxcblxuICAgIC8vIGBkZWxldGVCZWhhdmlvcjogJ2Nhc2NhZGUnYCBvbiBCT1RIIHBhcnR5IGxvb2t1cHMgKCM2OTYpLiBBIGxvb2t1cFxuICAgIC8vIGRlZmF1bHRzIHRvIGBzZXRfbnVsbGAsIGFuZCB0aGF0IGRlZmF1bHQgbWFkZSBldmVyeSBlbnJvbGxlZCBwZXJzb25cbiAgICAvLyBwZXJtYW5lbnRseSB1bmRlbGV0YWJsZTogZGVsZXRpbmcgdGhlIGxlYWQgY2xlYXJlZCB0aGlzIGNvbHVtbiwgdGhlXG4gICAgLy8gY2xlYXJlZCByb3cgaW5zdGFudGx5IHZpb2xhdGVkIGBsZWFkX29yX2NvbnRhY3RfcmVxdWlyZWRgIGJlbG93LCBhbmQgdGhlXG4gICAgLy8gd2hvbGUgZGVsZXRlIHJvbGxlZCBiYWNrIHdpdGggYSA0MDAgbmFtaW5nIGFuIG9iamVjdCB0aGUgY2FsbGVyIG5ldmVyXG4gICAgLy8gdG91Y2hlZCAoXCJBIGNhbXBhaWduIG1lbWJlciBtdXN0IHJlZmVyZW5jZSBlaXRoZXIgYSBMZWFkIG9yIGEgQ29udGFjdFwiLFxuICAgIC8vIGBcIm9iamVjdFwiOlwiY3JtX2xlYWRcImApLiBBIEdEUFIgXCJkZWxldGUgdGhpcyBwZXJzb25cIiByZXF1ZXN0IGNvdWxkIG5vdCBiZVxuICAgIC8vIHNlcnZlZCB0aHJvdWdoIHRoZSBBUEkgb3IgdGhlIFVJLlxuICAgIC8vXG4gICAgLy8gQ2FzY2FkZSByYXRoZXIgdGhhbiBgcmVzdHJpY3RgOiB0aGlzIGlzIGEgSlVOQ1RJT04gcm93IHdob3NlIGVudGlyZVxuICAgIC8vIG1lYW5pbmcgaXMgXCJ0aGlzIHBlcnNvbiBpcyBlbnJvbGxlZCBpbiB0aGlzIGNhbXBhaWduXCIuIE9uY2UgdGhlIHBlcnNvbiBpc1xuICAgIC8vIGdvbmUgdGhlIHJvdyBkZW5vdGVzIG5vdGhpbmcsIHNvIGtlZXBpbmcgaXQgKHJlc3RyaWN0KSB3b3VsZCBvbmx5IHRyYWRlXG4gICAgLy8gb25lIHVuZGVsZXRhYmxlIHBlcnNvbiBmb3IgYSBtYW51YWwgdW4tZW5yb2wgY2hvcmUsIGFuZCB0aGUgaW1wYWN0IHRoaXNcbiAgICAvLyBmaXhlcyBpcyB1bmRlbGV0YWJsZSBwZW9wbGUsIG5vdCBhIGNvbmZ1c2luZyBtZXNzYWdlLiBDYXNjYWRlIGFsc28gbWFrZXNcbiAgICAvLyB0aGUgb2JqZWN0J3Mgb3duIHJ1bGUgdW5mYWxzaWZpYWJsZSBieSBjb25zdHJ1Y3Rpb246IHRoZXJlIGlzIG5vIGxvbmdlciBhXG4gICAgLy8gcmVhY2hhYmxlIHN0YXRlIGluIHdoaWNoIGEgc3RvcmVkIG1lbWJlciByb3cgYnJlYWtzIGl0LlxuICAgIGNybV9sZWFkOiBGaWVsZC5sb29rdXAoJ2NybV9sZWFkJywge1xuICAgICAgbGFiZWw6ICdMZWFkJyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgZGVsZXRlQmVoYXZpb3I6ICdjYXNjYWRlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2V0IHdoZW4gdGhlIG1lbWJlciB3YXMgYSBMZWFkIGF0IGVucm9sbG1lbnQgdGltZScsXG4gICAgfSksXG5cbiAgICBjcm1fY29udGFjdDogRmllbGQubG9va3VwKCdjcm1fY29udGFjdCcsIHtcbiAgICAgIGxhYmVsOiAnQ29udGFjdCcsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NldCB3aGVuIHRoZSBtZW1iZXIgaXMgYW4gZXhpc3RpbmcgQ29udGFjdCcsXG4gICAgfSksXG5cbiAgICAvLyBcdTJCNTAgYHJlYWRvbmx5OiB0cnVlYCBcdTIwMTQgREVDTEFSRUQsIGFuZCBpdCBzdGlsbCBjb3N0cyBubyB3cml0ZXIgaXRzIHdyaXRlLFxuICAgIC8vIGJ1dCB0aGUgcmVhc29uIENIQU5HRUQgb24gdGhlIEBvYmplY3RzdGFjay8qIDE3LjQuMCBtaWdyYXRpb24uIEl0IHVzZWQgdG9cbiAgICAvLyBiZSBcInRoZSBzdHJpcCBpcyBhbiBVUERBVEUtcGF0aCBydWxlIGFuZCBldmVyeSB3cml0ZXIgaGVyZSBpcyBhbiBJTlNFUlRcIi5cbiAgICAvLyBvYmplY3RxbCAxNy40LjAgcmV0aXJlZCB0aGF0OiBhIHN0YXRpYyByZWFkb25seSBmaWVsZCBpcyBub3cgc3RyaXBwZWQgZnJvbVxuICAgIC8vIGEgTk9OLVNZU1RFTSBjYWxsZXIncyBJTlNFUlQgcGF5bG9hZCBpbnNpZGUgYGVuZ2luZS5pbnNlcnRgIHRvbywgc28gYW5cbiAgICAvLyBvcmRpbmFyeSB1c2VyLWNvbnRleHQgY3JlYXRlIG5vIGxvbmdlciBzZWVkcyB0aGlzIGNvbHVtbi5cbiAgICAvL1xuICAgIC8vIEV2ZXJ5IHdyaXRlciBpcyB0aGVyZWZvcmUgZWxldmF0ZWQgbm93LCBhbmQgdGhlIGVsZXZhdGlvbiBpcyBzY29wZWQgYXNcbiAgICAvLyBuYXJyb3dseSBhcyBBR0VOVFMubWQgaG91c2UgcnVsZSA5IHJlcXVpcmVzIFx1MjAxNCB0aGUgYGNhbXBhaWduX2Vucm9sbG1lbnRgXG4gICAgLy8gU0NSRUVOIGZsb3cgc3RheXMgYHJ1bkFzOiAndXNlcidgIGFuZCBoYW5kcyBvbmx5IHRoZSBpbnNlcnQgdG9cbiAgICAvLyBgY2FtcGFpZ25fbGVhZF9tZW1iZXJfZW5yb2xsYCAvIGBjYW1wYWlnbl9jb250YWN0X21lbWJlcl9lbnJvbGxgXG4gICAgLy8gKGBydW5BczogJ3N5c3RlbSdgLCBvbmUgYGNyZWF0ZV9yZWNvcmRgIGVhY2gpOyB0aGUgbWFya2V0aW5nIHNlZWQgaXMgYVxuICAgIC8vIHN5c3RlbSB3cml0ZSBhbHJlYWR5LiBOb3RoaW5nIHVwZGF0ZXMgaXQ6IHRoZXJlIGlzIG5vIGB1cGRhdGVfcmVjb3JkYFxuICAgIC8vIG5vZGUsIG5vIGhvb2sgYW5kIG5vIGFjdGlvbiB0aGF0IHdyaXRlcyBgYWRkZWRfZGF0ZWAuIFRoaXMgY29sdW1uJ3Mgb3duXG4gICAgLy8gdHdvIGhhbHZlcyBhcmUgcGlubmVkIGluIGB0ZXN0L2F1ZGl0LXN0YW1wLXJlYWRvbmx5LnRlc3QudHNgIFx1MjAxNCB0aGVcbiAgICAvLyBlbnJvbGxtZW50IHdyaXRlcnMgc3RpbGwgc3RhbXAgaXQsIGFuZCBhIHVzZXItY29udGV4dCBVUERBVEUgaXMgc3RyaXBwZWQuXG4gICAgLy8gUnVsZWQgIzE2NjcgKGRpcmVjdG9yIHNlYXQsIGRlY2lzaW9uIGJhdGNoICM3NCwgMjAyNi0wOS0wNyk6IGFuXG4gICAgLy8gZW5yb2xsbWVudCBzdGFtcCBub2JvZHkgaXMgbWVhbnQgdG8gaGFuZC1lZGl0IGdldHMgdGhlIGRlY2xhcmF0aW9uIHRoYXRcbiAgICAvLyBzYXlzIHNvLiBcdTI2RDQgVGhlIDE2LnggY2xhaW0gdGhpcyBub3RlIHVzZWQgdG8gY2FycnkgKFwiZXZlcnkgbWVtYmVyIGxhbmRlZFxuICAgIC8vIHdpdGggYSBudWxsIEFkZGVkIERhdGUgd2hpbGUgdGhlIGZsYWcgd2FzIG9uXCIpIGRlc2NyaWJlZCBhbiBlbmdpbmUgdGhpc1xuICAgIC8vIHJlcG8gbm8gbG9uZ2VyIHJ1bnM7IFx1MjZENCBkbyBub3QgcmVzdXJyZWN0IGl0IGFzIGEgcmVhc29uIHRvIG9wZW4gdGhlXG4gICAgLy8gY29sdW1uIGJhY2sgdXAuXG4gICAgLy9cbiAgICAvLyBHcm91cGVkIHVuZGVyIGBiYXNpY2AsIG5vdCBgcmVzcG9uc2VgICgjNzE1KTogaXQgcmVjb3JkcyB3aGVuIHRoZVxuICAgIC8vIG1lbWJlcnNoaXAgd2FzIGNyZWF0ZWQsIHdoaWNoIGlzIGEgZmFjdCBhYm91dCB0aGUgZW5yb2xsbWVudCwgbm90IGEgc3RlcFxuICAgIC8vIGluIHRoZSByZXNwb25zZSBsaWZlY3ljbGUgdGhlIG90aGVyIHN0YW1wcyB0cmFjay5cbiAgICBhZGRlZF9kYXRlOiBGaWVsZC5kYXRldGltZSh7XG4gICAgICBsYWJlbDogJ0FkZGVkIERhdGUnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIC8vIFdyaXRlcnMsIG9uZSBwZXIgc3Vydml2aW5nIHZhbHVlICgjNTk3KTpcbiAgICAvLyAgIHNlbnQgICAgICAgICBcdTIwMTQgY2FtcGFpZ25fZW5yb2xsbWVudCBmbG93LCBgY3JlYXRlX2NhbXBhaWduYCAobGVhZHMpIGFuZFxuICAgIC8vICAgICAgICAgICAgICAgICAgYGFkZF9jb250YWN0X3RvX2NhbXBhaWduYCAoY29udGFjdHMpIHN0YW1wIGl0IG9uIGluc2VydC5cbiAgICAvLyAgIHJlc3BvbmRlZCAgICBcdTIwMTQgdGhlIGBtYXJrX3Jlc3BvbmRlZGAgYWN0aW9uIChzcmMvbWFya2V0aW5nL2FjdGlvbnMvY2FtcGFpZ24uYWN0aW9ucy50cykuXG4gICAgLy8gICBjb252ZXJ0ZWQgICAgXHUyMDE0IHRoZSBtZW1iZXIncyBsZWFkIGNvbnZlcnRpbmc7IGBjYW1wYWlnbl9sZWFkX2NvbnZlcnNpb25fcmVmcmVzaGBcbiAgICAvLyAgICAgICAgICAgICAgICAgIChzcmMvc2FsZXMvb2JqZWN0cy9sZWFkLmNhbXBhaWduLW1ldHJpY3MuaG9vay50cykgcHJvbW90ZXNcbiAgICAvLyAgICAgICAgICAgICAgICAgIHRoZSByb3cgd2hlbiBgY3JtX2xlYWQuaXNfY29udmVydGVkYCBmbGlwcy5cbiAgICAvLyAgIHVuc3Vic2NyaWJlZCBcdTIwMTQgc2V0IGJ5IGEgcmVwIChvciBhbiBvcHQtb3V0IHJlcXVlc3QpIG9uIHRoZSBtZW1iZXIgcm93O1xuICAgIC8vICAgICAgICAgICAgICAgICAgYGNhbXBhaWduX21lbWJlcl9vcHRvdXRfc3luY2Agcm91bmQtdHJpcHMgaXQgdG8gdGhlXG4gICAgLy8gICAgICAgICAgICAgICAgICBsZWFkL2NvbnRhY3QncyBgZW1haWxfb3B0X291dGAsIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlXG4gICAgLy8gICAgICAgICAgICAgICAgICBlbnJvbGxtZW50IGZsb3cncyBvcHQtb3V0IGZpbHRlciBob25vdXIgaXQgbmV4dCBydW4uXG4gICAgLy9cbiAgICAvLyBgb3BlbmVkYCAvIGBjbGlja2VkYCAvIGBib3VuY2VkYCB3ZXJlIHJlbW92ZWQgaGVyZSBcdTIwMTQgc2VlIHRoZSBvYmplY3RcbiAgICAvLyBkb2NibG9jay4gTm90aGluZyBvbiB0aGUgcGxhdGZvcm0gY2FuIHByb2R1Y2UgdGhlbS5cbiAgICBzdGF0dXM6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ1N0YXR1cycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgZ3JvdXA6ICdyZXNwb25zZScsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdTZW50JywgICAgICB2YWx1ZTogJ3NlbnQnLCAgICAgIGRlZmF1bHQ6IHRydWUsIGNvbG9yOiAnI0EwQTBBMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1Jlc3BvbmRlZCcsIHZhbHVlOiAncmVzcG9uZGVkJywgY29sb3I6ICcjMDBBQTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQ29udmVydGVkJywgdmFsdWU6ICdjb252ZXJ0ZWQnLCBjb2xvcjogJyM3QzNBRUQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdVbnN1YnNjcmliZWQnLCB2YWx1ZTogJ3Vuc3Vic2NyaWJlZCcsIGNvbG9yOiAnI0ZGMDAwMCcgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICAvLyBXcml0dGVuIGJ5IHRoZSBgbWFya19yZXNwb25kZWRgIGFjdGlvbiwgYW5kIGJ5XG4gICAgLy8gYGNhbXBhaWduX21lbWJlcl9saWZlY3ljbGVgIHdoZW4gaXQgYmFjay1maWxscyBhIG1lbWJlciB3aG9zZSByZXNwb25zZVxuICAgIC8vIHdhcyByZWNvcmRlZCBieSBmbGlwcGluZyBgc3RhdHVzYCBkaXJlY3RseS5cbiAgICByZXNwb25zZV9kYXRlOiBGaWVsZC5kYXRldGltZSh7XG4gICAgICBsYWJlbDogJ1Jlc3BvbnNlIERhdGUnLFxuICAgICAgZ3JvdXA6ICdyZXNwb25zZScsXG4gICAgfSksXG5cbiAgICAvLyBLZXB0IGluIGxvY2tzdGVwIHdpdGggYHN0YXR1cyA9PSBcInJlc3BvbmRlZFwiYCBieVxuICAgIC8vIGBjYW1wYWlnbl9tZW1iZXJfbGlmZWN5Y2xlYCAoYmVmb3JlSW5zZXJ0L2JlZm9yZVVwZGF0ZSkgXHUyMDE0IGEgYm9vbGVhbiB0aGF0XG4gICAgLy8gZGlzYWdyZWVzIHdpdGggdGhlIHN0YXR1cyBpdCBzdW1tYXJpc2VzIGlzIHRoZSBzaGFwZSB0aGUgcmVzcG9uc2VcbiAgICAvLyBzdXJmYWNlcyBjYW5ub3QgcmVuZGVyLCBhbmQgaXQgaXMgd2hhdCBgdGVzdC9zZWVkLWNvbnNpc3RlbmN5LnRlc3QudHNgXG4gICAgLy8gYWxyZWFkeSBwaW5zIG9uIHRoZSBzZWVkIHNpZGUuXG4gICAgaGFzX3Jlc3BvbmRlZDogRmllbGQuYm9vbGVhbih7XG4gICAgICBsYWJlbDogJ0hhcyBSZXNwb25kZWQnLFxuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGdyb3VwOiAncmVzcG9uc2UnLFxuICAgIH0pLFxuICB9LFxuXG4gIC8vIFByZWRpY2F0ZXMgYmVsb3cgYXJlIFRPVEFMOiBldmVyeSBgcmVjb3JkLnhgIHJlYWQgaXMgYGhhcygpYC1ndWFyZGVkLCBzbyB0aGVcbiAgLy8gcnVsZSByZXR1cm5zIGEgdmVyZGljdCBldmVuIHdoZW4gdGhlIG1lcmdlZCByZWNvcmQgaGFzIG5vIHN1Y2gga2V5LiBTZWVcbiAgLy8gQUdFTlRTLm1kIFwiVmFsaWRhdGlvbiBwcmVkaWNhdGVzIG11c3QgYmUgVE9UQUxcIiBhbmRcbiAgLy8gdGVzdC9vYmplY3QtdmFsaWRhdGlvbi1wcmVkaWNhdGVzLnRlc3QudHMsIHdoaWNoIGZhaWxzIHRoZSBidWlsZCBvdGhlcndpc2UuXG4gIHZhbGlkYXRpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2xlYWRfb3JfY29udGFjdF9yZXF1aXJlZCcsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0EgY2FtcGFpZ24gbWVtYmVyIG11c3QgcmVmZXJlbmNlIGVpdGhlciBhIExlYWQgb3IgYSBDb250YWN0JyxcbiAgICAgIGNvbmRpdGlvbjogUGAoIWhhcyhyZWNvcmQuY3JtX2xlYWQpIHx8IGlzQmxhbmsocmVjb3JkLmNybV9sZWFkKSkgJiYgKCFoYXMocmVjb3JkLmNybV9jb250YWN0KSB8fCBpc0JsYW5rKHJlY29yZC5jcm1fY29udGFjdCkpYCxcbiAgICB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9hY3Rpb25zL2luZGV4LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FjdGlvbnNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvYWN0aW9ucy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBBY3Rpb24gRGVmaW5pdGlvbnMgQmFycmVsXG4gKlxuICogRXhwb3J0cyBDUk0gYWN0aW9uIG1ldGFkYXRhLiBFdmVyeSBhY3Rpb24gc2hpcHMgYW4gaW5saW5lIG1ldGFkYXRhXG4gKiBgYm9keWAgKHNhbmRib3hlZCBKUykgc28gdGhlIEFwcFBsdWdpbiBhdXRvLWJpbmRzIHRoZSBoYW5kbGVyIGF0XG4gKiBib290IFx1MjAxNCBubyBpbXBlcmF0aXZlIGBlbmdpbmUucmVnaXN0ZXJBY3Rpb24oLi4uKWAgd2lyaW5nIGlzIG5lZWRlZC5cbiAqXG4gKiBgQ29udmVydExlYWRBY3Rpb25gIGlzIHRoZSBvbmx5IGV4Y2VwdGlvbjogaXQgaXMgYSBgZmxvd2AtdHlwZWRcbiAqIGFjdGlvbiBhbmQgdGhlIHNjcmVlbiBmbG93IHVuZGVyIGBzcmMvc2FsZXMvZmxvd3MvbGVhZC1jb252ZXJzaW9uLmZsb3cudHNgXG4gKiBjYXJyaWVzIHRoZSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IHsgQWRkQ29udGFjdFRvQ2FtcGFpZ25BY3Rpb24sIE1hcmtQcmltYXJ5Q29udGFjdEFjdGlvbiwgU2VuZEVtYWlsQWN0aW9uIH0gZnJvbSAnLi9jb250YWN0LmFjdGlvbnMnO1xuLy8gQWN0aXZpdHkgbG9nZ2luZzogb25lIHJlZ2lzdHJhdGlvbiBwZXIgKGtpbmQgXHUwMEQ3IG9iamVjdCkuIEV2ZXJ5IGV4cG9ydFxuLy8gZm9yd2FyZGVkIGZyb20gaGVyZSBtdXN0IGJlIE9ORSBBY3Rpb24gXHUyMDE0IHRoZSBzdGFjayBpcyBidWlsdCBmcm9tXG4vLyBgT2JqZWN0LnZhbHVlcyhhY3Rpb25zKWAsIHNvIGFuIGV4cG9ydGVkIGFycmF5IGFycml2ZXMgYXMgYSBuZXN0ZWQgbGlzdCBhbmRcbi8vIGZhaWxzIHRoZSBzY2hlbWEgcGFyc2UuIFx1MjZENCBOZXZlciByZS1leHBvcnQgYGFjdGl2aXR5QWN0aW9uc0ZvcmAgKHRoZSBmYWN0b3J5KVxuLy8gZnJvbSBoZXJlOyB0aGUgYGNybV9jYXNlYCB0cmlwbGUgaXQgYWxzbyBidWlsZHMgaXMgc2VydmljZSdzIGFuZCBpcyBmb3J3YXJkZWRcbi8vIGJ5IGBzcmMvc2VydmljZS9hY3Rpb25zL2luZGV4LnRzYC5cbmV4cG9ydCB7XG4gIExlYWRMb2dDYWxsQWN0aW9uLCBMZWFkTG9nTWVldGluZ0FjdGlvbiwgTGVhZFNjaGVkdWxlTWVldGluZ0FjdGlvbixcbiAgQ29udGFjdExvZ0NhbGxBY3Rpb24sIENvbnRhY3RMb2dNZWV0aW5nQWN0aW9uLCBDb250YWN0U2NoZWR1bGVNZWV0aW5nQWN0aW9uLFxuICBBY2NvdW50TG9nQ2FsbEFjdGlvbiwgQWNjb3VudExvZ01lZXRpbmdBY3Rpb24sIEFjY291bnRTY2hlZHVsZU1lZXRpbmdBY3Rpb24sXG4gIE9wcG9ydHVuaXR5TG9nQ2FsbEFjdGlvbiwgT3Bwb3J0dW5pdHlMb2dNZWV0aW5nQWN0aW9uLCBPcHBvcnR1bml0eVNjaGVkdWxlTWVldGluZ0FjdGlvbixcbn0gZnJvbSAnLi9hY3Rpdml0eS1hY3Rpb25zJztcbmV4cG9ydCB7IENvbnZlcnRMZWFkQWN0aW9uLCBDcmVhdGVDYW1wYWlnbkFjdGlvbiwgU2NoZWR1bGVGb2xsb3dVcEFjdGlvbiB9IGZyb20gJy4vbGVhZC5hY3Rpb25zJztcbmV4cG9ydCB7IENsb25lT3Bwb3J0dW5pdHlBY3Rpb24sIE1hc3NVcGRhdGVTdGFnZUFjdGlvbiwgR2VuZXJhdGVRdW90ZUFjdGlvbiB9IGZyb20gJy4vb3Bwb3J0dW5pdHkuYWN0aW9ucyc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9hY3Rpb25zL2NvbnRhY3QuYWN0aW9ucy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9hY3Rpb25zXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FjdGlvbnMvY29udGFjdC5hY3Rpb25zLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEFjdGlvbiB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcbmltcG9ydCB7IFAgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgeyBBQ1RPUl9OQU1FX1JFU09MVVRJT05fU09VUkNFIH0gZnJvbSAnLi9hY3Rpdml0eS1hY3Rpb25zJztcblxuLyoqXG4gKiBNYXJrIENvbnRhY3QgYXMgUHJpbWFyeS5cbiAqXG4gKiBEZW1vbnN0cmF0ZXMgdGhlIEwyIG1ldGFkYXRhLWJvZHkgYWN0aW9uIHNoYXBlLiBUaGUgYGJvZHkuc291cmNlYCBydW5zXG4gKiBpbiB0aGUgUXVpY2tKUyBzYW5kYm94IHZpYSBgYWN0aW9uQm9keVJ1bm5lckZhY3RvcnlgLiBUaGUgc2NyaXB0IHJlY2VpdmVzXG4gKiBgKGlucHV0LCBjdHgpYCB3aGVyZSBgY3R4LnJlY29yZElkYCBpcyB0aGUgY29udGFjdCBpZCBmcm9tIHRoZSBhY3Rpb25cbiAqIFVSTCBhbmQgYGN0eC5hcGkub2JqZWN0KCdjcm1fY29udGFjdCcpLnVwZGF0ZSguLi4pYCBpcyBnYXRlZCBieSBgYXBpLndyaXRlYC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1hcmtQcmltYXJ5Q29udGFjdEFjdGlvbjogQWN0aW9uID0ge1xuICBuYW1lOiAnbWFya19wcmltYXJ5JyxcbiAgbGFiZWw6ICdNYXJrIGFzIFByaW1hcnkgQ29udGFjdCcsXG4gIG9iamVjdE5hbWU6ICdjcm1fY29udGFjdCcsXG4gIGljb246ICdzdGFyJyxcbiAgdHlwZTogJ3NjcmlwdCcsXG4gIGJvZHk6IHtcbiAgICBsYW5ndWFnZTogJ2pzJyxcbiAgICBzb3VyY2U6IGBcbiAgICAgIGNvbnN0IGlkID0gY3R4LnJlY29yZElkO1xuICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKCdtYXJrX3ByaW1hcnkgcmVxdWlyZXMgYSByZWNvcmRJZCcpO1xuICAgICAgYXdhaXQgY3R4LmFwaS5vYmplY3QoJ2NybV9jb250YWN0JykudXBkYXRlKHsgaWQsIGlzX3ByaW1hcnk6IHRydWUgfSwgeyB3aGVyZTogeyBpZCB9IH0pO1xuICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIGlkLCBpc19wcmltYXJ5OiB0cnVlIH07XG4gICAgYCxcbiAgICBjYXBhYmlsaXRpZXM6IFsnYXBpLndyaXRlJ10sXG4gICAgdGltZW91dE1zOiAyMDAwLFxuICB9LFxuICBsb2NhdGlvbnM6IFsncmVjb3JkX2hlYWRlcicsICdsaXN0X2l0ZW0nXSxcbiAgdmlzaWJsZTogUGBoYXMocmVjb3JkLmlzX3ByaW1hcnkpICYmIHJlY29yZC5pc19wcmltYXJ5ID09IGZhbHNlYCxcbiAgY29uZmlybVRleHQ6ICdNYXJrIHRoaXMgY29udGFjdCBhcyB0aGUgcHJpbWFyeSBjb250YWN0IGZvciB0aGUgYWNjb3VudD8nLFxuICBzdWNjZXNzTWVzc2FnZTogJ0NvbnRhY3QgbWFya2VkIGFzIHByaW1hcnkhJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcblxuLyoqXG4gKiBBZGQgc2VsZWN0ZWQgY29udGFjdHMgdG8gYSBDYW1wYWlnbi5cbiAqXG4gKiBUaGUgY29udGFjdC1zaWRlIG1pcnJvciBvZiBgY3JlYXRlX2NhbXBhaWduYCBvbiBgY3JtX2xlYWRgLCBhbmQgdGhlIG9ubHlcbiAqIHdyaXRlciBvZiBgY3JtX2NhbXBhaWduX21lbWJlci5jcm1fY29udGFjdGAgXHUyMDE0IHRoZSBsb29rdXAgdGhhdCBsZXRzIGEgY2FtcGFpZ25cbiAqIHJlYWNoIGV4aXN0aW5nIGN1c3RvbWVycyBhbmQgbm90IG9ubHkgbGVhZHMuIEV2ZXJ5IGRlc2lnbiBkZWNpc2lvbiBiZWxvdyBpc1xuICogY29waWVkIGRlbGliZXJhdGVseSBmcm9tIHRoZSBsZWFkIGFjdGlvbiByYXRoZXIgdGhhbiByZS1kZXJpdmVkLCBzbyB0aGUgdHdvXG4gKiBwYXRocyBjYW5ub3QgZHJpZnQ6XG4gKlxuICogICAtIFBFUi1SRUNPUkQgZGlzcGF0Y2guIGBzcmMvc2FsZXMvdmlld3MvY29udGFjdC52aWV3LnRzYCB3aXJlcyB0aGlzIGFzIHRoZVxuICogICAgIEJBUkUtU1RSSU5HIGZvcm0gKGBidWxrQWN0aW9uczogWydhZGRfY29udGFjdF90b19jYW1wYWlnbiddYCksIHdoaWNoIHRoZVxuICogICAgIHJlbmRlcmVyIGZhbnMgb3V0IG9uY2UgcGVyIHNlbGVjdGVkIHJvdyB3aXRoIHRoYXQgcm93J3MgYHJlY29yZElkYCBhbmQgTk9cbiAqICAgICBzZWxlY3Rpb24gYXJyYXkuIFRoZSBib2R5IHJlYWRzIGBjdHgucmVjb3JkSWRgIGFuZCBub3RoaW5nIGVsc2UuIFx1MjZENCBOZXZlclxuICogICAgIGFkZCBhbiBgaW5wdXQuc2VsZWN0ZWRJZHNgIHJlYWQ6IG9ubHkgdGhlIGFnZ3JlZ2F0ZSBjb250cmFjdCBpbmplY3RzIHRoZVxuICogICAgIHVuZGVyc2NvcmUtcHJlZml4ZWQgYnVpbHRpbiwgYW5kIHRoZSBzdHJpY3QgcGFyYW1zIGdhdGUgKEFEUi0wMTA0KVxuICogICAgIHJlZnVzZXMgYW4gdW5kZWNsYXJlZCBgc2VsZWN0ZWRJZHNgIHBhcmFtIG91dHJpZ2h0LlxuICogICAtIGB0eXBlOiAnc2NyaXB0J2AgKyBgcGFyYW1zYCwgbmV2ZXIgYHR5cGU6ICdtb2RhbCdgIFx1MjAxNCBhIG1vZGFsIGFjdGlvbiBoYXNcbiAqICAgICBubyBzZXJ2ZXIgZGlzcGF0Y2gsIHNvIGl0cyBib2R5IG5ldmVyIHJ1bnMuXG4gKiAgIC0gVGhlIGNhbXBhaWduIHBhcmFtIGlzIEZJRUxELUJBQ0tFRCAoYGZpZWxkYCArIGBvYmplY3RPdmVycmlkZWApIHNvIHRoZVxuICogICAgIGNvbnNvbGUgcmVzb2x2ZXMgYSByZWNvcmQgcGlja2VyIGZyb21cbiAqICAgICBgY3JtX2NhbXBhaWduX21lbWJlci5jcm1fY2FtcGFpZ25gLiBBIGJhcmUgYHsgdHlwZTogJ2xvb2t1cCcgfWAgY2Fubm90XG4gKiAgICAgcmVzb2x2ZSBhIHRhcmdldCBvYmplY3QgYW5kIGRlZ3JhZGVzIHRvIGEgcGFzdGUtdGhlLUlEIHRleHRib3guXG4gKlxuICogT25lIGRlbGliZXJhdGUgZGlmZmVyZW5jZTogdGhlIGRlZHVwZSByZWFkIHNjb3BlcyBvbiBgY3JtX2NvbnRhY3RgLCBzbyBhXG4gKiBwZXJzb24gZW5yb2xsZWQgYXMgYSBMRUFEIGFuZCBhZ2FpbiBhcyBhIENPTlRBQ1QgaXMgbm90IHRyZWF0ZWQgYXMgYVxuICogZHVwbGljYXRlLiBUaG9zZSBhcmUgdHdvIGRpZmZlcmVudCByZWNvcmRzIG9mIHR3byBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyxcbiAqIGFuZCBgY3JtX2NhbXBhaWduX21lbWJlcmAga2V5cyB0aGVtIHNlcGFyYXRlbHkgKHNlZSB0aGUgdHdvIHNlZWQgZGF0YXNldHMgaW5cbiAqIGBzcmMvbWFya2V0aW5nL2RhdGEvbWFya2V0aW5nLnNlZWQudHNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFkZENvbnRhY3RUb0NhbXBhaWduQWN0aW9uOiBBY3Rpb24gPSB7XG4gIG5hbWU6ICdhZGRfY29udGFjdF90b19jYW1wYWlnbicsXG4gIGxhYmVsOiAnQWRkIHRvIENhbXBhaWduJyxcbiAgb2JqZWN0TmFtZTogJ2NybV9jb250YWN0JyxcbiAgaWNvbjogJ3NlbmQnLFxuICB0eXBlOiAnc2NyaXB0JyxcbiAgYm9keToge1xuICAgIGxhbmd1YWdlOiAnanMnLFxuICAgIHNvdXJjZTogYFxuICAgICAgLy8gVmFsdWUga2V5ID0gdGhlIHBhcmFtJ3MgZmllbGQgbmFtZSAoJ2NybV9jYW1wYWlnbicpIHNpbmNlIHRoZSBwYXJhbVxuICAgICAgLy8gb21pdHMgYW4gZXhwbGljaXQgJ25hbWUnLiBJbnNlcnQgdXNlcyB0aGUgUkVBTCBsb29rdXAgZmllbGQgbmFtZXMgb25cbiAgICAgIC8vIGNybV9jYW1wYWlnbl9tZW1iZXIgKGNybV9jYW1wYWlnbiAvIGNybV9jb250YWN0KS5cbiAgICAgIGNvbnN0IGNhbXBhaWduSWQgPSBpbnB1dC5jcm1fY2FtcGFpZ24gPz8gbnVsbDtcbiAgICAgIGlmICghY2FtcGFpZ25JZCkgdGhyb3cgbmV3IEVycm9yKCdhZGRfY29udGFjdF90b19jYW1wYWlnbiByZXF1aXJlcyBhIGNhbXBhaWduIGlkJyk7XG4gICAgICBjb25zdCBpZHMgPSBjdHgucmVjb3JkSWQgPyBbY3R4LnJlY29yZElkXSA6IFtdO1xuICAgICAgaWYgKCFpZHMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2FkZF9jb250YWN0X3RvX2NhbXBhaWduOiBubyBjb250YWN0IHNlbGVjdGVkJyk7XG4gICAgICBjb25zdCByYXcgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduX21lbWJlcicpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGNhbXBhaWduSWQgfSxcbiAgICAgICAgZmllbGRzOiBbJ2NybV9jb250YWN0J10sXG4gICAgICAgIHRvcDogNTAwMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZXhpc3RpbmdSb3dzID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3IDogKHJhdz8ucmVjb3JkcyA/PyBbXSk7XG4gICAgICBjb25zdCBleGlzdGluZyA9IG5ldyBTZXQoZXhpc3RpbmdSb3dzLm1hcCgocikgPT4gci5jcm1fY29udGFjdCkpO1xuICAgICAgY29uc3QgaW5zZXJ0ZWQgPSBbXTtcbiAgICAgIGxldCBza2lwcGVkID0gMDtcbiAgICAgIGZvciAoY29uc3QgY29udGFjdElkIG9mIGlkcykge1xuICAgICAgICBpZiAoZXhpc3RpbmcuaGFzKGNvbnRhY3RJZCkpIHsgc2tpcHBlZCsrOyBjb250aW51ZTsgfVxuICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduX21lbWJlcicpLmluc2VydCh7XG4gICAgICAgICAgY3JtX2NhbXBhaWduOiBjYW1wYWlnbklkLFxuICAgICAgICAgIGNybV9jb250YWN0OiBjb250YWN0SWQsXG4gICAgICAgICAgc3RhdHVzOiAnc2VudCcsXG4gICAgICAgIH0pO1xuICAgICAgICBpbnNlcnRlZC5wdXNoKHJvdz8uaWQgPz8gbnVsbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjYW1wYWlnbklkLCBjb3VudDogaW5zZXJ0ZWQubGVuZ3RoLCBza2lwcGVkLCBpZHM6IGluc2VydGVkIH07XG4gICAgYCxcbiAgICBjYXBhYmlsaXRpZXM6IFsnYXBpLnJlYWQnLCAnYXBpLndyaXRlJ10sXG4gICAgdGltZW91dE1zOiAxMDAwMCxcbiAgfSxcbiAgbG9jYXRpb25zOiBbJ2xpc3RfdG9vbGJhcicsICdsaXN0X2l0ZW0nXSxcbiAgcGFyYW1zOiBbXG4gICAge1xuICAgICAgZmllbGQ6ICdjcm1fY2FtcGFpZ24nLFxuICAgICAgb2JqZWN0T3ZlcnJpZGU6ICdjcm1fY2FtcGFpZ25fbWVtYmVyJyxcbiAgICAgIGxhYmVsOiAnQ2FtcGFpZ24nLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgLy8gQW4gb3B0ZWQtb3V0IGNvbnRhY3QgbXVzdCBub3QgYmUgYWRkZWQgdG8gYSBjYW1wYWlnbiBieSBoYW5kIGVpdGhlciBcdTIwMTQgdGhlXG4gIC8vIGVucm9sbG1lbnQgZmxvdyBhbHJlYWR5IGZpbHRlcnMgdGhlbSBvdXQsIGFuZCBhIG1hbnVhbCBhZGQtdG8tY2FtcGFpZ24gaXNcbiAgLy8gdGhlIG9idmlvdXMgd2F5IGFyb3VuZCBhIGZpbHRlciBub2JvZHkgcmVtZW1iZXJzIGlzIHRoZXJlLiBTYW1lIHByZWRpY2F0ZVxuICAvLyB0aGUgYHNlbmRfZW1haWxgIGFjdGlvbiB1c2VzLlxuICB2aXNpYmxlOiBQYGhhcyhyZWNvcmQuZW1haWxfb3B0X291dCkgJiYgcmVjb3JkLmVtYWlsX29wdF9vdXQgPT0gZmFsc2VgLFxuICBzdWNjZXNzTWVzc2FnZTogJ0NvbnRhY3RzIGFkZGVkIHRvIGNhbXBhaWduIScsXG4gIHJlZnJlc2hBZnRlcjogdHJ1ZSxcbn07XG5cbi8qKlxuICogU2VuZCBFbWFpbCB0byBDb250YWN0LlxuICpcbiAqIE1vZGFsLXR5cGVkIGFjdGlvbjogY29sbGVjdHMgc3ViamVjdCArIGJvZHksIHRoZW4gbG9ncyBhbiBgYWN0aXZpdHlgXG4gKiByZWNvcmQgdmlhIHRoZSBtZXRhZGF0YSBib2R5LiBSdW5zIHNhbmRib3hlZCB1bmRlciBgYXBpLndyaXRlYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNlbmRFbWFpbEFjdGlvbjogQWN0aW9uID0ge1xuICBuYW1lOiAnc2VuZF9lbWFpbCcsXG4gIGxhYmVsOiAnU2VuZCBFbWFpbCcsXG4gIG9iamVjdE5hbWU6ICdjcm1fY29udGFjdCcsXG4gIGljb246ICdtYWlsJyxcbiAgLy8gc2NyaXB0LCBub3QgbW9kYWw6IG1vZGFsIHN1Ym1pdHMgZGllIG9uIEdFVCAvYXBpL3YxL21ldGEvb2JqZWN0Lzx0YXJnZXQ+XG4gIC8vIFx1MjE5MiA0MDAgaW4gMTYuMS4wOyBzY3JpcHQgYWN0aW9ucyBQT1NUIC9hcGkvdjEvYWN0aW9ucy8uLi4gYW5kIGV4ZWN1dGUuXG4gIHR5cGU6ICdzY3JpcHQnLFxuICBib2R5OiB7XG4gICAgbGFuZ3VhZ2U6ICdqcycsXG4gICAgc291cmNlOiBgXG4gICAgICBjb25zdCByZWNvcmQgPSBjdHgucmVjb3JkID8/IHt9O1xuICAgICAgY29uc3QgcmVjaXBpZW50SWQgPSBjdHgucmVjb3JkSWQgPz8gcmVjb3JkLmlkID8/IG51bGw7XG4gICAgICBjb25zdCB0byA9IHJlY29yZC5lbWFpbCA/IFN0cmluZyhyZWNvcmQuZW1haWwpIDogJyc7XG4gICAgICBjb25zdCBmcm9tID0gY3R4LnVzZXI/LmVtYWlsID8/ICdub3JlcGx5QGhvdGNybS5sb2NhbCc7XG4gICAgICBjb25zdCB1c2VySWQgPSBjdHgudXNlcj8uaWQgPz8gbnVsbDtcbiAgICAgIGNvbnN0IHN1YmplY3QgPSBpbnB1dC5zdWJqZWN0ID8gU3RyaW5nKGlucHV0LnN1YmplY3QpIDogKCdFbWFpbCB0byAnICsgdG8pO1xuICAgICAgY29uc3QgYm9keSA9IGlucHV0LmJvZHkgPyBTdHJpbmcoaW5wdXQuYm9keSkgOiAnJztcbiAgICAgIGNvbnN0IGVtYWlsID0gYXdhaXQgY3R4LmFwaS5vYmplY3QoJ3N5c19lbWFpbCcpLmluc2VydCh7XG4gICAgICAgIGZyb21fYWRkcmVzczogZnJvbSxcbiAgICAgICAgdG9fYWRkcmVzc2VzOiB0byxcbiAgICAgICAgc3ViamVjdCxcbiAgICAgICAgYm9keV90ZXh0OiBib2R5LFxuICAgICAgICBzdGF0dXM6ICdxdWV1ZWQnLFxuICAgICAgICByZWxhdGVkX29iamVjdDogJ2NybV9jb250YWN0JyxcbiAgICAgICAgcmVsYXRlZF9pZDogcmVjaXBpZW50SWQsXG4gICAgICAgIHNlbnRfYnk6IHVzZXJJZCxcbiAgICAgIH0pO1xuXG4gICAgICAke0FDVE9SX05BTUVfUkVTT0xVVElPTl9TT1VSQ0V9XG5cbiAgICAgIC8vIFN1cmZhY2UgdGhlIGVtYWlsIG9uIHRoZSBjb250YWN0J3MgdW5pZmllZCBhY3Rpdml0eSB0aW1lbGluZVxuICAgICAgLy8gKHRoZSBhdWRpdCB3cml0ZXIgb25seSBsb2dzIGdlbmVyaWMgQ1JVRDsgdGhpcyBpcyB0aGUgc2VtYW50aWMgZXZlbnQpLlxuICAgICAgY29uc3QgYWN0aXZpdHkgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnc3lzX2FjdGl2aXR5JykuaW5zZXJ0KHtcbiAgICAgICAgdHlwZTogJ2NvbXBsZXRlZCcsXG4gICAgICAgIHN1bW1hcnk6ICdFbWFpbDogJyArIHN1YmplY3QsXG4gICAgICAgIGFjdG9yX2lkOiB1c2VySWQsXG4gICAgICAgIGFjdG9yX25hbWU6IGFjdG9yTmFtZSxcbiAgICAgICAgb2JqZWN0X25hbWU6ICdjcm1fY29udGFjdCcsXG4gICAgICAgIHJlY29yZF9pZDogcmVjaXBpZW50SWQsXG4gICAgICAgIHJlY29yZF9sYWJlbDogcmVjb3JkLmZ1bGxfbmFtZSA/PyByZWNvcmQubmFtZSA/PyB0byxcbiAgICAgICAgLy8gQURSLTAwNTIgQWN0aXZpdHlQb2ludGVyOiBzdHJ1Y3R1cmVkIHBvaW50ZXIgdG8gdGhlIHJpY2ggc291cmNlIGVudGl0eVxuICAgICAgICAvLyAodGhlIHN5c19lbWFpbCByb3cpIHNvIHRoZSB0aW1lbGluZSByZW5kZXJzIGEgXCJWaWV3IHNvdXJjZSBcdTIxOTJcIiBkcmlsbCB0b1xuICAgICAgICAvLyB0aGUgZnVsbCBlbWFpbCBcdTIwMTQgdGhlIHF1ZXJ5YWJsZSByZXBsYWNlbWVudCBmb3Igc3Rhc2hpbmcgdGhlIGlkIGluIG1ldGFkYXRhLlxuICAgICAgICBzb3VyY2Vfb2JqZWN0OiAnc3lzX2VtYWlsJyxcbiAgICAgICAgc291cmNlX2lkOiBlbWFpbD8uaWQgPz8gbnVsbCxcbiAgICAgICAgbWV0YWRhdGE6IEpTT04uc3RyaW5naWZ5KHsga2luZDogJ2VtYWlsJywgdG8sIHN1YmplY3QgfSksXG4gICAgICB9KTtcbiAgICAgIC8vICM1OTIgc2NvcGUgaXRlbSAzOiBldmVyeSBhY3Rpdml0eSB3cml0ZXIgYnVtcHMgaW50ZXJhY3Rpb24gcmVjZW5jeS5cbiAgICAgIC8vIEFuIGVtYWlsIGlzIGFuIGludGVyYWN0aW9uIGJ1dCBOT1QgYSBjYWxlbmRhciBzbG90LCBzbyBpdCB3cml0ZXMgbm9cbiAgICAgIC8vIFxcYGNybV9ldmVudFxcYCBcdTIwMTQgd2hpY2ggbWVhbnMgaXQgY2Fubm90IHJpZGUgdGhlIGV2ZW50IGhvb2sncyBidWJibGUgYW5kXG4gICAgICAvLyBoYXMgdG8gc3RhbXAgdGhlIHR3byB0aW1lc3RhbXBzIGl0c2VsZi4gQm90aCBjb2x1bW5zIGFyZSBkZWxpYmVyYXRlbHlcbiAgICAgIC8vIG5vbi1yZWFkb25seSAoc2VlIGNybV9hY2NvdW50Lmxhc3RfYWN0aXZpdHlfZGF0ZSdzIG5vdGUpOiBhIHJlYWRvbmx5XG4gICAgICAvLyBmaWVsZCBpcyBzdHJpcHBlZCBmcm9tIGFueSBub24tc3lzdGVtIHdyaXRlIHdob3NlIGNhbGxlciBzdXBwbGllZCB0aGVcbiAgICAgIC8vIGtleSAoIzI5NDgpLCBhbmQgYW4gYWN0aW9uIGJvZHkgcnVucyB1bmRlciB0aGUgc2VuZGluZyByZXAncyBjb250ZXh0LlxuICAgICAgaWYgKHJlY2lwaWVudElkKSB7XG4gICAgICAgIGNvbnN0IG5vd0lzbyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2NvbnRhY3QnKS51cGRhdGUoXG4gICAgICAgICAgICB7IGlkOiByZWNpcGllbnRJZCwgbGFzdF9jb250YWN0ZWRfZGF0ZTogbm93SXNvIH0sXG4gICAgICAgICAgICB7IHdoZXJlOiB7IGlkOiByZWNpcGllbnRJZCB9IH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyAvKiBiZXN0LWVmZm9ydCByZWNlbmN5OyBuZXZlciBmYWlsIHRoZSBzZW5kICovIH1cbiAgICAgICAgY29uc3QgYWNjb3VudElkID0gcmVjb3JkLmNybV9hY2NvdW50ID8gU3RyaW5nKHJlY29yZC5jcm1fYWNjb3VudCkgOiBudWxsO1xuICAgICAgICBpZiAoYWNjb3VudElkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGN0eC5hcGkub2JqZWN0KCdjcm1fYWNjb3VudCcpLnVwZGF0ZShcbiAgICAgICAgICAgICAgeyBpZDogYWNjb3VudElkLCBsYXN0X2FjdGl2aXR5X2RhdGU6IG5vd0lzby5zbGljZSgwLCAxMCkgfSxcbiAgICAgICAgICAgICAgeyB3aGVyZTogeyBpZDogYWNjb3VudElkIH0gfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkgeyAvKiBiZXN0LWVmZm9ydCByZWNlbmN5OyBuZXZlciBmYWlsIHRoZSBzZW5kICovIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZW1haWxJZDogZW1haWw/LmlkLCBhY3Rpdml0eUlkOiBhY3Rpdml0eT8uaWQgfTtcbiAgICBgLFxuICAgIGNhcGFiaWxpdGllczogWydhcGkucmVhZCcsICdhcGkud3JpdGUnXSxcbiAgICB0aW1lb3V0TXM6IDUwMDAsXG4gIH0sXG4gIGxvY2F0aW9uczogWydyZWNvcmRfaGVhZGVyJywgJ2xpc3RfaXRlbSddLFxuICB2aXNpYmxlOiBQYGhhcyhyZWNvcmQuZW1haWxfb3B0X291dCkgJiYgcmVjb3JkLmVtYWlsX29wdF9vdXQgPT0gZmFsc2VgLFxuICBwYXJhbXM6IFtcbiAgICB7IG5hbWU6ICdzdWJqZWN0JywgbGFiZWw6ICdTdWJqZWN0JywgdHlwZTogJ3RleHQnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHsgbmFtZTogJ2JvZHknLCBsYWJlbDogJ0JvZHknLCB0eXBlOiAndGV4dGFyZWEnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICBdLFxuICByZWZyZXNoQWZ0ZXI6IGZhbHNlLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FjdGlvbnMvbGVhZC5hY3Rpb25zLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FjdGlvbnNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvYWN0aW9ucy9sZWFkLmFjdGlvbnMudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgQWN0aW9uIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuaW1wb3J0IHsgUCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcblxuLyoqXG4gKiBDb252ZXJ0IExlYWQgdG8gQWNjb3VudCwgQ29udGFjdCwgYW5kIE9wcG9ydHVuaXR5LlxuICpcbiAqIEZsb3ctdHlwZWQgYWN0aW9uOiBpbnZvY2F0aW9uIGlzIGRlbGVnYXRlZCB0byB0aGUgYGxlYWRfY29udmVyc2lvbmBcbiAqIGZsb3cgZGVmaW5lZCB1bmRlciBgc3JjL3NhbGVzL2Zsb3dzL2AuIFRoZSBmbG93IGVuZ2luZSBoYW5kbGVzIHRoZSBzY3JlZW5cbiAqICsgc2VydmVyIHN0ZXBzOyBubyBtZXRhZGF0YSBib2R5IGlzIHJlcXVpcmVkIGhlcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBDb252ZXJ0TGVhZEFjdGlvbjogQWN0aW9uID0ge1xuICBuYW1lOiAnY29udmVydF9sZWFkJyxcbiAgbGFiZWw6ICdDb252ZXJ0IExlYWQnLFxuICBvYmplY3ROYW1lOiAnY3JtX2xlYWQnLFxuICBpY29uOiAnYXJyb3ctcmlnaHQtY2lyY2xlJyxcbiAgdHlwZTogJ2Zsb3cnLFxuICB0YXJnZXQ6ICdsZWFkX2NvbnZlcnNpb24nLFxuICBsb2NhdGlvbnM6IFsncmVjb3JkX2hlYWRlcicsICdsaXN0X2l0ZW0nXSxcbiAgLy8gQ29udmVydCBpcyB0aGUgbGVhZCdzIG1vc3QgYmFzaWMgb3V0Y29tZSBcdTIwMTQgc3VyZmFjZSBpdCBvbiBBTlkgb3BlbiBsZWFkXG4gIC8vIChuZXcgLyBjb250YWN0ZWQgLyBxdWFsaWZpZWQpLCBub3QganVzdCBxdWFsaWZpZWQuIEdhdGluZyB0byBxdWFsaWZpZWQtb25seVxuICAvLyBoaWQgdGhlIGJ1dHRvbiBvbiBtb3N0IHNlZWRlZCBsZWFkcywgc28gaXQgcmVhZCBhcyBcImNvbnZlcnNpb24gaXMgbWlzc2luZ1wiLlxuICAvLyBPbmx5IGFscmVhZHktY29udmVydGVkIG9yIGRpc3F1YWxpZmllZCBsZWFkcyBoaWRlIGl0LlxuICAvL1xuICAvLyBUT1RBTElUWSAoQUdFTlRTLm1kIFx1MjE5MiBcIlZhbGlkYXRpb24gcHJlZGljYXRlcyBtdXN0IGJlIFRPVEFMXCIsICM2MzApOiBldmVyeVxuICAvLyBgcmVjb3JkLnhgIHJlYWQgY2FycmllcyBhIGBoYXMocmVjb3JkLngpYCwgYW5kIHRoZSBndWFyZHMgYXJlIGFycmFuZ2VkIHRvXG4gIC8vIGZhaWwgQ0xPU0VEIFx1MjAxNCBhbiB1bmtub3duIHJlY29yZCBoaWRlcyB0aGUgYnV0dG9uLiBUaGF0IGFycmFuZ2VtZW50IGlzIGFcbiAgLy8gTUVBU1VSRU1FTlQsIG5vdCBhIHByZWZlcmVuY2UuIE1lYXN1cmVkIGluIHRoZSBicm93c2VyIG9uIGNvbnNvbGUgMTcuNC4wIGJ5XG4gIC8vIGluc3RydW1lbnRpbmcgdGhlIHNoaXBwZWQgcHJlZGljYXRlIGV2YWx1YXRvcjogdGhlIHJlY29yZCBwYWdlIGV2YWx1YXRlcyB0aGlzXG4gIC8vIHByZWRpY2F0ZSB0d2ljZSBhZ2FpbnN0IGFuIEVNUFRZIHJlY29yZCAoYHJlY29yZGAgaXMgYHt9YCwgemVybyBrZXlzKSBiZWZvcmVcbiAgLy8gdGhlIHJvdyBsYW5kcywgdGhlbiByZS1ldmFsdWF0ZXMgaXQgYWdhaW5zdCB0aGUgZnVsbCByb3cuIFNvIGFuIGFic2VudFxuICAvLyBgc3RhdHVzYCBoZXJlIG1lYW5zIFwibm8gcmVjb3JkIHlldFwiLCBuZXZlciBcImEgbGVhZCB3aXRoIG5vIHN0YXR1c1wiIFx1MjAxNCBhIGxlYWRcbiAgLy8gd2l0aCBubyBzdGF0dXMgY2Fubm90IGV4aXN0LCBzaW5jZSBgc3RhdHVzYCBpcyBgcmVxdWlyZWRgIHdpdGhcbiAgLy8gYHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9YCBhbmQgYGRlZmF1bHRWYWx1ZTogJ25ldydgIChzcmMvc2FsZXMvb2JqZWN0cy9sZWFkLm9iamVjdC50cyksXG4gIC8vIGFuZCB0aGUgUkVTVCBwYXlsb2FkIHRoaXMgc3VyZmFjZSByZWFkcyBjYXJyaWVzIGV2ZXJ5IGRlY2xhcmVkIGNvbHVtbi5cbiAgLy8gRmFpbC1vcGVuIChgIWhhcyhyZWNvcmQuc3RhdHVzKSB8fCBcdTIwMjZgKSB3b3VsZCB0aGVyZWZvcmUgYnV5IG5vdGhpbmcgYW5kIGNvc3RcbiAgLy8gc29tZXRoaW5nIHJlYWw6IENvbnZlcnQgd291bGQgZmxhc2ggb24gYSBkaXNxdWFsaWZpZWQgbGVhZCBmb3IgdGhlXG4gIC8vIHByZS1oeWRyYXRpb24gYmVhdCwgb24gYW4gSVJSRVZFUlNJQkxFIGFjdGlvbi5cbiAgLy8gVW5ndWFyZGVkLCBzdHJpY3QgQ0VMIGFib3J0ZWQgdGhlIHdob2xlIHByZWRpY2F0ZSBvbiB0aG9zZSB0d28gcmVuZGVyc1xuICAvLyAoYFtydW50aW1lXSBObyBzdWNoIGtleTogc3RhdHVzYCkgYW5kIG9iamVjdC11aSBmZWxsIGJhY2sgdG8gaXRzIG93blxuICAvLyBgZmFsbGJhY2s6IGZhbHNlYCwgc28gdGhpcyBzcGVsbGluZyBzdGF0ZXMgdGhlIHBvbGljeSB0aGUgZXJyb3IgcGF0aCB3YXNcbiAgLy8gYWxyZWFkeSBhcHBseWluZyBcdTIwMTQgbWludXMgdGhlIGNvbnNvbGUgd2FybmluZyBvbiBldmVyeSBsZWFkIHBhZ2UgbG9hZC4gKCMxODkwKVxuICAvL1xuICAvLyBcdTI2QTBcdUZFMEYgVGhlIGFwcHJvdmFsIHRlcm0gaXMgdGhlIE9ORSBmYWlsLU9QRU4gcmVhZCBpbiB0aGlzIHByZWRpY2F0ZSwgYW5kIHRoZVxuICAvLyBhc3ltbWV0cnkgaXMgZGVsaWJlcmF0ZSByYXRoZXIgdGhhbiBhbiBvdmVyc2lnaHQgaW4gYW4gb3RoZXJ3aXNlXG4gIC8vIGZhaWwtY2xvc2VkIGFycmFuZ2VtZW50IChSRVEtMDAwNSBzdGVwIDcpLiBUaGUgdHdvIHRlcm1zIGFib3ZlIGZhaWwgY2xvc2VkXG4gIC8vIGJlY2F1c2UgYW4gYWJzZW50IGBzdGF0dXNgIG1lYW5zIFwibm8gcmVjb3JkIHlldFwiIFx1MjAxNCBhIGxlYWQgd2l0aCBubyBzdGF0dXNcbiAgLy8gY2Fubm90IGV4aXN0LCBzaW5jZSBgc3RhdHVzYCBpcyBgcmVxdWlyZWRgIHdpdGggYSBgZGVmYXVsdFZhbHVlYC4gQW4gYWJzZW50XG4gIC8vIGBjb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1c2AgbWVhbnMgc29tZXRoaW5nIGVsc2UgZW50aXJlbHk6IGEgbGVhZCB3cml0dGVuXG4gIC8vIGJlZm9yZSB0aGUgY29sdW1uIGV4aXN0ZWQsIHdoaWNoIG11c3QgY29udmVydCB0aGUgd2F5IGl0IGFsd2F5cyBkaWQuIEFuZFxuICAvLyB0aGUgc2hpcHBlZCBgbm90X3JlcXVpcmVkYCBkZWZhdWx0IGlzIHRoZSBnYXRlJ3MgT0ZGIHBvc2l0aW9uLCBzbyB0cmVhdGluZ1xuICAvLyBcIm5vdCBvbmUgb2YgdGhlIHR3byByZWZ1c2luZyB2ZXJkaWN0c1wiIGFzIGNvbnZlcnRpYmxlIGlzIHdoYXQgbWFrZXMgdGhlXG4gIC8vIGRlZmF1bHQgaW5zdGFsbCBiZWhhdmUgZXhhY3RseSBhcyBpdCBkaWQgYmVmb3JlIHRoaXMgZmllbGQuIGBsZWFkLmhvb2sudHNgXG4gIC8vIGFuZCBgbGVhZC1jb252ZXJzaW9uLmZsb3cudHNgJ3MgYGRlY2lzaW9uX2FwcHJvdmFsYCBjYXJyeSB0aGUgc2FtZSBwb2xhcml0eVxuICAvLyBcdTIwMTQgdGhlIHRocmVlIHN1cmZhY2VzIGhhdmUgdG8gYWdyZWUgYWJvdXQgd2hhdCBcIm9mZlwiIG1lYW5zLCBvciB0aGUgYnV0dG9uXG4gIC8vIGRpc2FwcGVhcnMgb24gbGVhZHMgdGhlIHdyaXRlIHBhdGggd291bGQgaGFwcGlseSBjb252ZXJ0LlxuICAvL1xuICAvLyBcdTI2RDQgSGlkaW5nIHRoaXMgYnV0dG9uIGlzIE5PVCB0aGUgZ2F0ZS4gSXQgaXMgdGhlIGNvdXJ0ZXN5IGhhbGY7IHRoZSBjb250cm9sXG4gIC8vIGlzIHRoZSBgYmVmb3JlVXBkYXRlYCByZWZ1c2FsIGluIGBsZWFkLmhvb2sudHNgLCB3aGljaCBhIFJFU1QgY2FsbGVyIGNhbm5vdFxuICAvLyByb3V0ZSBhcm91bmQuXG4gIHZpc2libGU6IFBgaGFzKHJlY29yZC5pc19jb252ZXJ0ZWQpICYmIHJlY29yZC5pc19jb252ZXJ0ZWQgPT0gZmFsc2UgJiYgaGFzKHJlY29yZC5zdGF0dXMpICYmIHJlY29yZC5zdGF0dXMgIT0gXCJ1bnF1YWxpZmllZFwiICYmIHJlY29yZC5zdGF0dXMgIT0gXCJjb252ZXJ0ZWRcIlxuICAgICYmICghaGFzKHJlY29yZC5jb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1cykgfHwgKHJlY29yZC5jb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1cyAhPSBcInBlbmRpbmdcIiAmJiByZWNvcmQuY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXMgIT0gXCJyZWplY3RlZFwiKSlgLFxuICAvLyBOTyBgY29uZmlybVRleHRgLiBBIHNjcmVlbiBmbG93IElTIHRoZSBjb25maXJtYXRpb24sIGFuZCB0aGlzIG9uZSBvcGVuc1xuICAvLyBgQ29udmVyc2lvbiBEZXRhaWxzYCBcdTIwMTQgYSBzY3JlZW4gY2FycnlpbmcgdGhlIGRlY2lzaW9uIChgQ3JlYXRlXG4gIC8vIE9wcG9ydHVuaXR5P2AsIGFuZCB0aGUgZGVhbCdzIG5hbWUgYW5kIGFtb3VudCksIGEgQ2FuY2VsIGJ1dHRvbiwgYW5kIHRoZVxuICAvLyBzdXNwZWN0ZWQtZHVwbGljYXRlIHdhcm5pbmcgdGhhdCBzYXlzIHNvbWV0aGluZyBUUlVFIGFib3V0IFRISVMgbGVhZC4gQVxuICAvLyBkaWFsb2cgaW4gZnJvbnQgb2YgaXQgY29zdHMgZXZlcnkgY29udmVyc2lvbiBvbmUgZXh0cmEgY2xpY2sgdG8gYW5zd2VyIGFcbiAgLy8gcXVlc3Rpb24gaXQgY2Fubm90IGhlbHAgYW55b25lIGFuc3dlci4gQ29uZmlybXMgYXJlIGZvciBERVNUUlVDVElWRSBhY3Rpb25zXG4gIC8vIHdpdGggbm8gZm9sbG93LXVwIFVJIFx1MjAxNCBgY2xvc2VfY2FzZWAgLyBgZXNjYWxhdGVfY2FzZWAgaW4gYGNhc2UuYWN0aW9ucy50c2BcbiAgLy8gYXJlIHRoZSBzaGFwZSB0aGF0IHN0aWxsIGVhcm5zIG9uZS5cbiAgLy9cbiAgLy8gTWVjaGFuaXNtLCBtZWFzdXJlZCBvbiB0aGUgY29uc29sZSB0aGlzIGFwcCBwaW5uZWQgYXQgdGhhdCB0YWtpbmdcbiAgLy8gKEBvYmplY3RzdGFjay9jb25zb2xlIDE3LjMuMCwgYGRpc3QvYXNzZXRzL2A7IHRoaXMgYnVuZGxlIHJlYWQgd2FzIFx1MjZENCBOT1RcbiAgLy8gcmUtdGFrZW4gb24gYW55IGxhdGVyIHBpbiBcdTIwMTQgMTcuNC4wLCBQUiAjMTgxNCwgb3IgMTcuNS4wKSByYXRoZXIgdGhhblxuICAvLyBhc3N1bWVkOiB0aGUgcnVubmVyIGdhdGVzIHRoZSBkaWFsb2cgb25cbiAgLy8gdGhlIGtleSdzIHByZXNlbmNlIGFsb25lIFx1MjAxNFxuICAvLyAgICAgaWYgKGFjdGlvbi5jb25maXJtVGV4dCAmJiAhYXdhaXQgY29uZmlybUhhbmRsZXIoZXZhbHVhdGUoYWN0aW9uLmNvbmZpcm1UZXh0KSkpXG4gIC8vICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnQWN0aW9uIGNhbmNlbGxlZCBieSB1c2VyJyB9O1xuICAvLyBcdTIwMTQgc28gUkVNT1ZJTkcgdGhlIGtleSBpcyB3aGF0IHJlbW92ZXMgdGhlIGRpYWxvZzsgdGhlcmUgaXMgbm8gYGNvbmZpcm06XG4gIC8vIGZhbHNlYCB0byB3cml0ZSwgYW5kIG5vIG90aGVyIGtleSByZS1yYWlzZXMgaXQuXG4gIHN1Y2Nlc3NNZXNzYWdlOiAnTGVhZCBjb252ZXJ0ZWQgc3VjY2Vzc2Z1bGx5IScsXG4gIHJlZnJlc2hBZnRlcjogdHJ1ZSxcbiAgLy8gQURSLTAwMTEgXHUyMDE0IG9wdCB0aGlzIEFjdGlvbiBpbiB0byBBSSwgd2hpY2ggbWF0ZXJpYWxpc2VzIHRoZVxuICAvLyBgYWN0aW9uX2NvbnZlcnRfbGVhZGAgdG9vbCB0aGUgYGxlYWRfcXVhbGlmaWNhdGlvbmAgc2tpbGwgcmVmZXJlbmNlcy5cbiAgLy8gRmxvdy10eXBlZCB3aXRoIGEgdGFyZ2V0LCBzbyBpdCBoYXMgYSBoZWFkbGVzcyBwYXRoLiBgcmVxdWlyZXNDb25maXJtYXRpb25gXG4gIC8vIGlzIHRoZSBvbmx5IGtleSB0aGUgQUkgcGF0aCByZWFkczogYGFjdGlvbkxvb2tzRGVzdHJ1Y3RpdmVgIGNvbnN1bHRzXG4gIC8vIGBhaS5yZXF1aXJlc0NvbmZpcm1hdGlvbmAgYW5kIG5vdGhpbmcgZWxzZSwgYW5kIHRoZSBjb25zb2xlJ3NcbiAgLy8gY29uZmlybS1kaWFsb2cgc3RyaW5nIHJlYWNoZWQgbm8gQUkgY29kZSBcdTIwMTQgc28gZHJvcHBpbmcgYGNvbmZpcm1UZXh0YCBhYm92ZVxuICAvLyBsZWF2ZXMgdGhlIEFJIGFwcHJvdmFsIHNpZ25hbCBleGFjdGx5IHdoZXJlIGl0IHdhcy4gVGhlIGZsYWcgaXMgU1VSRkFDRUQsXG4gIC8vIG5vdCBlbmZvcmNlZCBcdTIwMTQgYGxpc3RfYWN0aW9uc2AgcmVwb3J0cyBgcmVxdWlyZXNDb25maXJtYXRpb246IHRydWVgIGFuZCB0aGVcbiAgLy8gY2FsbGluZyBjbGllbnQgZGVjaWRlcyB3aGF0IHRvIGRvIHdpdGggaXQsIHdoaWxlIGBydW5fYWN0aW9uYCBkaXNwYXRjaGVzXG4gIC8vIHRoZSBmbG93IHdpdGggbm8gc2VydmVyLXNpZGUgcGF1c2UuIEl0IHdhcm5zIHRoZSBjYWxsZXIgdGhhdCB0aGlzIGlzXG4gIC8vIGlycmV2ZXJzaWJsZTsgaXQgaXMgbm90IGEgbG9jay5cbiAgYWk6IHtcbiAgICBleHBvc2VkOiB0cnVlLFxuICAgIHJlcXVpcmVzQ29uZmlybWF0aW9uOiB0cnVlLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0NvbnZlcnRzIGEgcXVhbGlmaWVkIGxlYWQgaW50byBhbiBhY2NvdW50LCBjb250YWN0IGFuZCBvcHBvcnR1bml0eS4gSXJyZXZlcnNpYmxlIFx1MjAxNCByZXF1aXJlcyBodW1hbiBhcHByb3ZhbCBiZWZvcmUgaXQgcnVucy4nLFxuICB9LFxufTtcblxuLyoqXG4gKiBTY2hlZHVsZSB0aGUgbmV4dCBmb2xsb3ctdXAgb24gYSBsZWFkLlxuICpcbiAqIFRoZSBnYXAgdGhpcyBmaWxsczogYGxvZ19jYWxsYCAvIGBsb2dfbWVldGluZ2AgcmVjb3JkIHdoYXQgYWxyZWFkeSBoYXBwZW5lZFxuICogKGEgYHN5c19hY3Rpdml0eWAgdGltZWxpbmUgZW50cnkpLCBidXQgbm90aGluZyBwdXQgdGhlIE5FWFQgdG91Y2ggb24gdGhlXG4gKiByZXAncyBsaXN0LiBGaWxpbmcgdGhhdCBmb2xsb3ctdXAgbWVhbnQgbGVhdmluZyB0aGUgbGVhZCwgb3BlbmluZyB0aGVcbiAqIFJlbGF0ZWQgdGFiLCBmaW5kaW5nIHRoZSBUYXNrcyBibG9jaywgYW5kIGhhbmQtcGlja2luZyB0aGUgbGVhZCBiYWNrIGFzIHRoZVxuICogcGFyZW50IFx1MjAxNCBmb3VyIHN0ZXBzIGZvciB0aGUgc2luZ2xlIG1vc3QgY29tbW9uIHRoaW5nIGEgcmVwIGRvZXMgYWZ0ZXIgYSBjYWxsLlxuICpcbiAqIEZsb3ctdHlwZWQsIG5vdCBgdHlwZTogJ21vZGFsJ2A6IG1vZGFsIGFjdGlvbnMgYXJlIG5vbi1mdW5jdGlvbmFsIGluIDE2LjEuMFxuICogKHRoZSBjb25zb2xlIHJlc29sdmVzIHRoZSBhY3Rpb24ncyBgdGFyZ2V0YCBhcyBhbiBvYmplY3QgbmFtZSwgc28gc3VibWl0dGluZ1xuICogb25lIGRpZXMgb24gYEdFVCAvYXBpL3YxL21ldGEvb2JqZWN0Lzx0YXJnZXQ+YCBcdTIxOTIgNDAwIFx1MjAxNCByZXByb2R1Y2libGUgb24gdGhlXG4gKiBwcmUtZXhpc3RpbmcgYGxvZ19jYWxsYCB0b28pLiBUaGUgc2NyZWVuIGZsb3cgdW5kZXJcbiAqIGBzcmMvc2FsZXMvZmxvd3Mvc2NoZWR1bGUtZm9sbG93dXAuZmxvdy50c2AgY29sbGVjdHMgdGhlIHNhbWUgZmllbGRzIGFuZCBkb2VzIHRoZVxuICogd3JpdGU7IHRoYXQgbWVjaGFuaXNtIGlzIHByb3ZlbiBieSBgY29udmVydF9sZWFkYCBhYm92ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNjaGVkdWxlRm9sbG93VXBBY3Rpb246IEFjdGlvbiA9IHtcbiAgbmFtZTogJ3NjaGVkdWxlX2ZvbGxvd3VwJyxcbiAgbGFiZWw6ICdTY2hlZHVsZSBGb2xsb3ctdXAnLFxuICBvYmplY3ROYW1lOiAnY3JtX2xlYWQnLFxuICBpY29uOiAnY2FsZW5kYXItcGx1cycsXG4gIHR5cGU6ICdmbG93JyxcbiAgdGFyZ2V0OiAnc2NoZWR1bGVfZm9sbG93dXAnLFxuICBsb2NhdGlvbnM6IFsncmVjb3JkX2hlYWRlcicsICdsaXN0X2l0ZW0nXSxcbiAgLy8gQSBjb252ZXJ0ZWQgb3IgZGlzcXVhbGlmaWVkIGxlYWQgaGFzIG5vIG5leHQgdG91Y2ggdG8gc2NoZWR1bGUuXG4gIHZpc2libGU6IFBgaGFzKHJlY29yZC5pc19jb252ZXJ0ZWQpICYmIHJlY29yZC5pc19jb252ZXJ0ZWQgPT0gZmFsc2UgJiYgaGFzKHJlY29yZC5zdGF0dXMpICYmIHJlY29yZC5zdGF0dXMgIT0gXCJ1bnF1YWxpZmllZFwiICYmIHJlY29yZC5zdGF0dXMgIT0gXCJjb252ZXJ0ZWRcImAsXG4gIHN1Y2Nlc3NNZXNzYWdlOiAnRm9sbG93LXVwIHNjaGVkdWxlZC4nLFxuICByZWZyZXNoQWZ0ZXI6IHRydWUsXG4gIC8vIEFEUi0wMDExIFx1MjAxNCBtYXRlcmlhbGlzZXMgYGFjdGlvbl9zY2hlZHVsZV9mb2xsb3d1cGAgZm9yIHRoZVxuICAvLyBgbGVhZF9xdWFsaWZpY2F0aW9uYCBza2lsbC4gQWRkaXRpdmUgYW5kIHJldmVyc2libGUsIHNvIG5vIGFwcHJvdmFsIGdhdGUuXG4gIGFpOiB7XG4gICAgZXhwb3NlZDogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdTY2hlZHVsZXMgdGhlIG5leHQgZm9sbG93LXVwIHRhc2sgb24gYSBsZWFkLCBhc3NpZ25lZCB0byBpdHMgb3duZXIsIHNvIHRoZSBuZXh0IHRvdWNoIGxhbmRzIG9uIHRoZSByZXAgbGlzdC4nLFxuICB9LFxufTtcblxuLyoqXG4gKiBBZGQgc2VsZWN0ZWQgbGVhZHMgdG8gYSBDYW1wYWlnbi5cbiAqXG4gKiBTY3JpcHQtdHlwZWQgYWN0aW9uOiBjb2xsZWN0cyBhIGNhbXBhaWduIGlkIChwYXJhbSBkaWFsb2cpIHRoZW4gd3JpdGVzIG9uZVxuICogYGNybV9jYW1wYWlnbl9tZW1iZXJgIHJlY29yZCBmb3IgdGhlIGRpc3BhdGNoZWQgbGVhZCwgc2tpcHBpbmcgbGVhZHMgYWxyZWFkeVxuICogb24gdGhlIGNhbXBhaWduLiBUaGUgY2hvc2VuIGNhbXBhaWduIGFycml2ZXMgYXMgYGlucHV0LmNybV9jYW1wYWlnbmA7IHRoZVxuICogbGVhZCBhcnJpdmVzIGFzIGBjdHgucmVjb3JkSWRgLlxuICpcbiAqIFBFUi1SRUNPUkQgZGlzcGF0Y2gsIGRlbGliZXJhdGVseS4gYHNyYy9zYWxlcy92aWV3cy9sZWFkLnZpZXcudHNgIHdpcmVzIHRoaXMgYXMgdGhlXG4gKiBCQVJFLVNUUklORyBmb3JtIFx1MjAxNCBgYnVsa0FjdGlvbnM6IFsnY3JlYXRlX2NhbXBhaWduJ11gIFx1MjAxNCBhbmQgdGhhdCBzdHJpbmcgaXMgYVxuICogZGlzcGF0Y2ggY29udHJhY3QsIG5vdCBhIHNwZWxsaW5nIG9mIHRoZSBvdGhlciBvbmU6XG4gKlxuICogICAtIGJhcmUgc3RyaW5nICAgIFx1MjE5MiB0aGUgcmVuZGVyZXIgcHJvbW90ZXMgdGhlIGFjdGlvbiB0byBhIGRlZiBjYXJyeWluZyBpdHNcbiAqICAgICBvd24gbGFiZWwgLyBpY29uIC8gcGFyYW1zIC8gYHZpc2libGVgIGFuZCBkaXNwYXRjaGVzIGl0IE9OQ0UgUEVSIHNlbGVjdGVkXG4gKiAgICAgcm93LCBlYWNoIGNhbGwgY2FycnlpbmcgdGhhdCByb3cncyBgcmVjb3JkSWRgIGFuZCBOTyBzZWxlY3Rpb24gYXJyYXkuIEFcbiAqICAgICAxMC1sZWFkIHNlbGVjdGlvbiBpcyAxMCBkaXNwYXRjaGVzIHRocm91Z2ggdGhpcyBib2R5LCBvbmUgbGVhZCBlYWNoLlxuICogICAtIGBidWxrQWN0aW9uRGVmc2AgKyBgZXhlY3V0aW9uOiAnYWdncmVnYXRlJ2AgXHUyMTkyIE9ORSBkaXNwYXRjaCBmb3IgdGhlIHdob2xlXG4gKiAgICAgc2VsZWN0aW9uLCBldmVyeSBpZCBpbiB0aGUgYnVpbHRpbiBgcGFyYW1zLl9zZWxlY3RlZElkc2AgYW5kIG5vXG4gKiAgICAgYHJlY29yZElkYCAoc2VlIGBtYXNzX3VwZGF0ZV9zdGFnZWAgaW4gYG9wcG9ydHVuaXR5LmFjdGlvbnMudHNgKS5cbiAqXG4gKiBTbyBtdWx0aS1zZWxlY3QgZW5yb2xsbWVudCBhbHJlYWR5IHdvcmtzIGhlcmUgXHUyMDE0IGl0IGp1c3QgYXJyaXZlcyBvbmUgbGVhZCBhdCBhXG4gKiB0aW1lLiBUaGlzIGJvZHkgcmVhZHMgYGN0eC5yZWNvcmRJZGAgYW5kIG5vdGhpbmcgZWxzZSwgd2hpY2ggaXMgZXhhY3RseSB3aGF0XG4gKiB0aGUgZmFuLW91dCBkZWxpdmVycy5cbiAqXG4gKiBcdTI2RDQgTmV2ZXIgYWRkIGFuIGBpbnB1dC5zZWxlY3RlZElkc2AgcmVhZCAobm8gdW5kZXJzY29yZSkuIE5vdGhpbmcgY2FuIGRlbGl2ZXJcbiAqIHRoYXQga2V5IG9uIGVpdGhlciBjb250cmFjdCwgc28gaXQgaXMgZGVhZCBjb2RlIGFuZCBub3QgYSBmYWxsYmFjazogYVxuICogdG9wLWxldmVsIGBzZWxlY3RlZElkc2AgaXMgbmV2ZXIgbWVyZ2VkIGludG8gdGhlIHBhcmFtcyBiYWcsIGFuZCBhXG4gKiBgcGFyYW1zLnNlbGVjdGVkSWRzYCBpcyByZWZ1c2VkIGJ5IHRoZSBzdHJpY3QgcGFyYW1zIGdhdGUgKEFEUi0wMTA0KSB3aXRoXG4gKiBgVW5rbm93biBhY3Rpb24gcGFyYW0gXCJzZWxlY3RlZElkc1wiIFx1MjAxNCBub3QgZGVjbGFyZWQgb24gdGhpcyBhY3Rpb25gLiBUaGUgb25seVxuICogc2VsZWN0aW9uIGNoYW5uZWwgaXMgdGhlIHVuZGVyc2NvcmUtcHJlZml4ZWQgYnVpbHRpbiwgYW5kIG9ubHkgdGhlIGFnZ3JlZ2F0ZVxuICogY29udHJhY3QgaW5qZWN0cyBpdCAoYEBvYmplY3RzdGFjay9zcGVjYCBgdWkvYWN0aW9uLXBhcmFtcy56b2QudHNgLFxuICogYEFDVElPTl9QQVJBTV9CVUlMVElOX0tFWVNgKS5cbiAqXG4gKiBTd2l0Y2hpbmcgdGhpcyBhY3Rpb24gdG8gdGhlIGFnZ3JlZ2F0ZSBjb250cmFjdCB3b3VsZCBiZSBhIFBST0RVQ1QgY2hhbmdlIFx1MjAxNFxuICogb25lIGF1ZGl0IGVudHJ5IGFuZCBvbmUgZGVkdXBlIHJlYWQgcGVyIHJ1biBpbnN0ZWFkIG9mIHBlciBsZWFkLCBhbmRcbiAqIGFsbC1vci1ub3RoaW5nIGZhaWx1cmUgc2VtYW50aWNzIFx1MjAxNCBzbyBpdCBuZWVkcyBgbGVhZC52aWV3LnRzYCBjaGFuZ2VkIHdpdGggaXRcbiAqIGFuZCBpcyBkZWxpYmVyYXRlbHkgbm90IGRvbmUgaGVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IENyZWF0ZUNhbXBhaWduQWN0aW9uOiBBY3Rpb24gPSB7XG4gIG5hbWU6ICdjcmVhdGVfY2FtcGFpZ24nLFxuICBsYWJlbDogJ0FkZCB0byBDYW1wYWlnbicsXG4gIG9iamVjdE5hbWU6ICdjcm1fbGVhZCcsXG4gIGljb246ICdzZW5kJyxcbiAgLy8gc2NyaXB0LCBub3QgbW9kYWwgXHUyMDE0IGEgYHR5cGU6ICdtb2RhbCdgIGFjdGlvbiBoYXMgTk8gc2VydmVyIGRpc3BhdGNoIGF0IGFsbDpcbiAgLy8gdGhlIHJlbmRlcmVyIGp1c3Qgb3BlbnMgaXRzIGB0YXJnZXRgLCBhbmQgdGhlIHJ1bnRpbWUgcmVmdXNlcyBpdCBvdmVyIFJFU1RcbiAgLy8gKGBoZWFkbGVzc0FjdGlvblR5cGVFcnJvcmAsIDQwMCBcImEgY2xpZW50LXNpZGUgYWN0aW9uIHdpdGggbm8gc2VydmVyXG4gIC8vIGRpc3BhdGNoXCIpLCBzbyBpdHMgYGJvZHlgIG5ldmVyIHJ1bnMuIFRvIGNvbGxlY3QgaW5wdXQgYW5kIHRoZW4gcnVuXG4gIC8vIHNlcnZlci1zaWRlLCB0aGUgc2hhcGUgaXMgYHR5cGU6ICdzY3JpcHQnYCArIGBwYXJhbXNgIFx1MjAxNCB0aGUgcnVubmVyIGNvbGxlY3RzXG4gIC8vIHRoZSBzYW1lIGRpYWxvZy4gU2VlIFNjaGVkdWxlRm9sbG93VXBBY3Rpb24uXG4gIHR5cGU6ICdzY3JpcHQnLFxuICBib2R5OiB7XG4gICAgbGFuZ3VhZ2U6ICdqcycsXG4gICAgc291cmNlOiBgXG4gICAgICAvLyBWYWx1ZSBrZXkgPSB0aGUgcGFyYW0ncyBmaWVsZCBuYW1lICgnY3JtX2NhbXBhaWduJykgc2luY2UgdGhlIHBhcmFtXG4gICAgICAvLyBvbWl0cyBhbiBleHBsaWNpdCAnbmFtZScuIEluc2VydCB1c2VzIHRoZSBSRUFMIGxvb2t1cCBmaWVsZCBuYW1lcyBvblxuICAgICAgLy8gY3JtX2NhbXBhaWduX21lbWJlciAoY3JtX2NhbXBhaWduIC8gY3JtX2xlYWQpIFx1MjAxNCBub3QgdGhlIGdlbmVyaWNcbiAgICAgIC8vIGNhbXBhaWduX2lkIC8gbGVhZF9pZCBhbiBlYXJsaWVyIHJldmlzaW9uIG9mIHRoZSBkb2MgZXhhbXBsZSB0YXVnaHQsXG4gICAgICAvLyB3aGljaCBkb24ndCBleGlzdCBoZXJlIGFuZCBsZWZ0IGNybV9jYW1wYWlnbiBudWxsIFx1MjE5MiAnQ2FtcGFpZ24gcmVxdWlyZWQnXG4gICAgICAvLyB2YWxpZGF0aW9uIGZhaWx1cmUuXG4gICAgICBjb25zdCBjYW1wYWlnbklkID0gaW5wdXQuY3JtX2NhbXBhaWduID8/IG51bGw7XG4gICAgICBpZiAoIWNhbXBhaWduSWQpIHRocm93IG5ldyBFcnJvcignY3JlYXRlX2NhbXBhaWduIHJlcXVpcmVzIGEgY2FtcGFpZ24gaWQnKTtcbiAgICAgIC8vIE9uZSBsZWFkIHBlciBkaXNwYXRjaCBcdTIwMTQgdGhlIGJhcmUtc3RyaW5nIFxcYGJ1bGtBY3Rpb25zXFxgIHdpcmluZyBmYW5zIHRoaXNcbiAgICAgIC8vIGJvZHkgb3V0IG9uY2UgcGVyIHNlbGVjdGVkIHJvdyAoc2VlIHRoZSBub3RlIGFib3ZlKS4gXFxgaWRzXFxgIHN0YXlzIGFcbiAgICAgIC8vIGxpc3Qgc28gdGhlIGRlZHVwZSArIHNraXAgbG9vcCBiZWxvdyByZWFkcyB0aGUgc2FtZSBvbiBib3RoIGNvbnRyYWN0cyxcbiAgICAgIC8vIHNob3VsZCB0aGlzIGFjdGlvbiBldmVyIG1vdmUgdG8gYW4gYWdncmVnYXRlIGRlZi5cbiAgICAgIGNvbnN0IGlkcyA9IGN0eC5yZWNvcmRJZCA/IFtjdHgucmVjb3JkSWRdIDogW107XG4gICAgICBpZiAoIWlkcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignY3JlYXRlX2NhbXBhaWduOiBubyBsZWFkIHNlbGVjdGVkJyk7XG4gICAgICAvLyBTa2lwIGxlYWRzIGFscmVhZHkgb24gdGhpcyBjYW1wYWlnbiBcdTIwMTQgdGhlIG1vZGFsIGNvcHkgcHJvbWlzZXNcbiAgICAgIC8vIGR1cGxpY2F0ZXMgYXJlIHNraXBwZWQsIGFuZCByZS1ydW5uaW5nIHRoZSBhY3Rpb24gb24gdGhlIHNhbWVcbiAgICAgIC8vIHNlbGVjdGlvbiBtdXN0IG5vdCBkb3VibGUtY291bnQgbWFya2V0aW5nIHRvdWNoZXMuXG4gICAgICBjb25zdCByYXcgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduX21lbWJlcicpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGNhbXBhaWduSWQgfSxcbiAgICAgICAgZmllbGRzOiBbJ2NybV9sZWFkJ10sXG4gICAgICAgIHRvcDogNTAwMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZXhpc3RpbmdSb3dzID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3IDogKHJhdz8ucmVjb3JkcyA/PyBbXSk7XG4gICAgICBjb25zdCBleGlzdGluZyA9IG5ldyBTZXQoZXhpc3RpbmdSb3dzLm1hcCgocikgPT4gci5jcm1fbGVhZCkpO1xuICAgICAgY29uc3QgaW5zZXJ0ZWQgPSBbXTtcbiAgICAgIGxldCBza2lwcGVkID0gMDtcbiAgICAgIGZvciAoY29uc3QgbGVhZElkIG9mIGlkcykge1xuICAgICAgICBpZiAoZXhpc3RpbmcuaGFzKGxlYWRJZCkpIHsgc2tpcHBlZCsrOyBjb250aW51ZTsgfVxuICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduX21lbWJlcicpLmluc2VydCh7XG4gICAgICAgICAgY3JtX2NhbXBhaWduOiBjYW1wYWlnbklkLFxuICAgICAgICAgIGNybV9sZWFkOiBsZWFkSWQsXG4gICAgICAgICAgc3RhdHVzOiAnc2VudCcsXG4gICAgICAgIH0pO1xuICAgICAgICBpbnNlcnRlZC5wdXNoKHJvdz8uaWQgPz8gbnVsbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjYW1wYWlnbklkLCBjb3VudDogaW5zZXJ0ZWQubGVuZ3RoLCBza2lwcGVkLCBpZHM6IGluc2VydGVkIH07XG4gICAgYCxcbiAgICBjYXBhYmlsaXRpZXM6IFsnYXBpLnJlYWQnLCAnYXBpLndyaXRlJ10sXG4gICAgdGltZW91dE1zOiAxMDAwMCxcbiAgfSxcbiAgLy8gbGlzdF9pdGVtIGdpdmVzIGV2ZXJ5IHJvdyBhIHdvcmtpbmcgcmVjb3JkLXNjb3BlZCBlbnRyeSBwb2ludC4gVGhlXG4gIC8vIGxpc3RfdG9vbGJhciBidXR0b24gaXMgc2luZ2xlLXJlY29yZCBieSBjb25zdHJ1Y3Rpb246IHdpdGggbm8gYF9zZWxlY3RlZElkc2BcbiAgLy8gaW4gdGhlIGJhZyB0aGUgZGlzcGF0Y2hlciByZXNvbHZlcyBhIHJlY29yZElkIGZyb20gdGhlIGdyaWQgc2VsZWN0aW9uLCBhbmQgYVxuICAvLyBtdWx0aS1yb3cgc2VsZWN0aW9uIHRoZXJlIGlzIGFtYmlndW91cywgc28gaXQgaXMgcmVmdXNlZCBjbGllbnQtc2lkZSB3aXRoXG4gIC8vIFwiVGhpcyBhY3Rpb24gcnVucyBvbiBhIHNpbmdsZSByZWNvcmQgXHUyMDE0IHNlbGVjdCBleGFjdGx5IG9uZSByb3cuXCJcbiAgLy8gTXVsdGktbGVhZCBlbnJvbGxtZW50IGlzIHRoZSBTRUxFQ1RJT04tQkFSIGJ1dHRvbiBpbnN0ZWFkLCB3aGljaCB0aGUgdmlldydzXG4gIC8vIGBidWxrQWN0aW9uczogWydjcmVhdGVfY2FtcGFpZ24nXWAgcHJvZHVjZXMgYW5kIHdoaWNoIGZhbnMgb3V0IHBlciByb3cuXG4gIGxvY2F0aW9uczogWydsaXN0X3Rvb2xiYXInLCAnbGlzdF9pdGVtJ10sXG4gIHBhcmFtczogW1xuICAgIC8vIEZpZWxkLWJhY2tlZCBwYXJhbTogYGZpZWxkYCArIGBvYmplY3RPdmVycmlkZWAgbWFrZSB0aGUgY29uc29sZSByZXNvbHZlXG4gICAgLy8gdGhlIHdpZGdldCBmcm9tIGNybV9jYW1wYWlnbl9tZW1iZXIuY3JtX2NhbXBhaWduIChhIGxvb2t1cCBcdTIxOTIgY3JtX2NhbXBhaWduKSxcbiAgICAvLyByZW5kZXJpbmcgYSBSRUNPUkQgUElDS0VSLiBBIGJhcmUgYHsgdHlwZTonbG9va3VwJyB9YCB3aXRoIG5vIGZpZWxkIGNhbid0XG4gICAgLy8gcmVzb2x2ZSBhIHRhcmdldCBvYmplY3QgYW5kIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gYSBwYXN0ZS10aGUtSUQgdGV4dGJveC5cbiAgICB7XG4gICAgICBmaWVsZDogJ2NybV9jYW1wYWlnbicsXG4gICAgICBvYmplY3RPdmVycmlkZTogJ2NybV9jYW1wYWlnbl9tZW1iZXInLFxuICAgICAgbGFiZWw6ICdDYW1wYWlnbicsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9XG4gIF0sXG4gIHN1Y2Nlc3NNZXNzYWdlOiAnTGVhZHMgYWRkZWQgdG8gY2FtcGFpZ24hJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FjdGlvbnMvb3Bwb3J0dW5pdHkuYWN0aW9ucy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9hY3Rpb25zXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FjdGlvbnMvb3Bwb3J0dW5pdHkuYWN0aW9ucy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBBY3Rpb24gfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5pbXBvcnQgeyBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgT1BQT1JUVU5JVFlfU1RBR0VfT1BUSU9OUywgcGxhaW5PcHRpb25zIH0gZnJvbSAnLi4vb2JqZWN0cy9fcGlja2xpc3RzJztcblxuLyoqXG4gKiBDbG9uZSBPcHBvcnR1bml0eS5cbiAqXG4gKiBTY3JpcHQtdHlwZWQgYWN0aW9uOiBjbG9uZXMgdGhlIGN1cnJlbnQgcmVjb3JkIGludG8gYSBuZXdcbiAqIGBwcm9zcGVjdGluZ2Atc3RhZ2Ugb3Bwb3J0dW5pdHkuIFJ1bnMgc2FuZGJveGVkIHVuZGVyIGBhcGkucmVhZGBcbiAqICh0byBmZXRjaCB0aGUgc291cmNlKSBhbmQgYGFwaS53cml0ZWAgKHRvIHdyaXRlIHRoZSBjb3B5KS5cbiAqL1xuZXhwb3J0IGNvbnN0IENsb25lT3Bwb3J0dW5pdHlBY3Rpb246IEFjdGlvbiA9IHtcbiAgbmFtZTogJ2Nsb25lX29wcG9ydHVuaXR5JyxcbiAgbGFiZWw6ICdDbG9uZSBPcHBvcnR1bml0eScsXG4gIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICBpY29uOiAnY29weScsXG4gIHR5cGU6ICdzY3JpcHQnLFxuICBib2R5OiB7XG4gICAgbGFuZ3VhZ2U6ICdqcycsXG4gICAgc291cmNlOiBgXG4gICAgICBjb25zdCBpZCA9IGN0eC5yZWNvcmRJZDtcbiAgICAgIGlmICghaWQpIHRocm93IG5ldyBFcnJvcignY2xvbmVfb3Bwb3J0dW5pdHkgcmVxdWlyZXMgYSByZWNvcmRJZCcpO1xuICAgICAgLy8gUmVhZCB0aGUgc291cmNlIGZyb20gY3R4LnJlY29yZCAoc2VlZGVkIGJ5IHRoZSBydW5uZXIgZm9yIHJlY29yZC1zY29wZWRcbiAgICAgIC8vIGFjdGlvbnMgXHUyMDE0IHNhbWUgc291cmNlIHNlbmRfZW1haWwgdXNlcykuIFRoaXMgYXZvaWRzIHRoZSBpbi1zYW5kYm94XG4gICAgICAvLyBmaW5kKCkgdGhhdCBwcmV2aW91c2x5IGZhdWx0ZWQsIFdISUxFIHN0aWxsIGNvcHlpbmcgdGhlIFJFUVVJUkVEIGZpZWxkc1xuICAgICAgLy8gKGNybV9hY2NvdW50IC8gYW1vdW50IC8gY2xvc2VfZGF0ZSkuIFRoZSBvbGQgbWluaW1hbCBpbnNlcnQgc2V0IG9ubHlcbiAgICAgIC8vIG5hbWUrc3RhZ2UsIHNvIGV2ZXJ5IGNsb25lIGZhaWxlZCB0aGUgb2JqZWN0J3MgcmVxdWlyZWQtZmllbGQgKyBhbW91bnQ+MFxuICAgICAgLy8gdmFsaWRhdGlvbnMgYXQgcnVudGltZSBhbmQgbm8gb3Bwb3J0dW5pdHkgd2FzIGV2ZXIgY3JlYXRlZC5cbiAgICAgIGNvbnN0IHNyYyA9IGN0eC5yZWNvcmQgPz8ge307XG4gICAgICBpZiAoIXNyYy5jcm1fYWNjb3VudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nsb25lX29wcG9ydHVuaXR5OiBzb3VyY2UgYWNjb3VudCBub3QgbG9hZGVkOyBjYW5ub3QgY2xvbmUuJyk7XG4gICAgICB9XG4gICAgICAvLyBHaXZlIHRoZSBjbG9uZSBhIGZyZXNoIDkwLWRheSBjbG9zZSBob3Jpem9uIHNvIGEgY29waWVkIHBhc3QgZGF0ZSBjYW4ndFxuICAgICAgLy8gdHJpcCB0aGUgXCJjbG9zZSBkYXRlIGluIHRoZSBwYXN0XCIgdmFsaWRhdGlvbiBvbiBhIG5ldyBwcm9zcGVjdGluZyBkZWFsLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBzdGVwIGlzIG9uIHRoZSBVVEMgY2FsZW5kYXIgYmVjYXVzZSB0aGUgcmVuZGVyIGJlbG93IGlzXG4gICAgICAvLyAoXFxgdG9JU09TdHJpbmcoKVxcYCkuIFRoZSBiYXNlIGlzIFxcYG5ldyBEYXRlKClcXGAgXHUyMDE0IGFuIGluc3RhbnQsIG5vdCBhXG4gICAgICAvLyBzdG9yZWQgXFxgWVlZWS1NTS1ERFxcYCBcdTIwMTQgc28gdW5saWtlIHF1b3RlLmhvb2svdGFzay5ob29rIHRoZXJlIGlzIG5vXG4gICAgICAvLyBVVEMtbWlkbmlnaHQgYW5jaG9yIGJlaW5nIHJlYWQgYmFjayBvbiB0aGUgd3JvbmcgY2FsZW5kYXIgaGVyZTsgdGhlXG4gICAgICAvLyBvbmx5IG1peHR1cmUgd2FzIHRoZSBzdGVwIGl0c2VsZi4gQSBsb2NhbCBcXGBnZXREYXRlXFxgL1xcYHNldERhdGVcXGAgc3RlcFxuICAgICAgLy8gcHJlc2VydmVzIFdBTEwtQ0xPQ0sgdGltZSwgc28gYSA5MC1kYXkgd2luZG93IGNvbnRhaW5pbmcgYSBEU1RcbiAgICAgIC8vIHRyYW5zaXRpb24gaXMgMjMgaCBvciAyNSBoIGxvbmcgYW5kIHRoZSByZW5kZXJlZCBVVEMgZGF5IGxhbmRzIG9uZSBvZmZcbiAgICAgIC8vIHdoZW5ldmVyIHRoZSBjbG9uZSBpbnN0YW50IGlzIHdpdGhpbiBhbiBob3VyIG9mIGEgVVRDIGRheSBib3VuZGFyeS5cbiAgICAgIGNvbnN0IGhvcml6b24gPSBuZXcgRGF0ZSgpO1xuICAgICAgaG9yaXpvbi5zZXRVVENEYXRlKGhvcml6b24uZ2V0VVRDRGF0ZSgpICsgOTApO1xuICAgICAgY29uc3QgaW5zZXJ0ZWQgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykuaW5zZXJ0KHtcbiAgICAgICAgbmFtZTogJ0NvcHkgb2YgJyArIChzcmMubmFtZSA/PyAoJ29wcG9ydHVuaXR5ICcgKyBpZCkpLFxuICAgICAgICBjcm1fYWNjb3VudDogc3JjLmNybV9hY2NvdW50LFxuICAgICAgICBwcmltYXJ5X2NvbnRhY3Q6IHNyYy5wcmltYXJ5X2NvbnRhY3QgPz8gbnVsbCxcbiAgICAgICAgYW1vdW50OiBzcmMuYW1vdW50ID8/IDEsXG4gICAgICAgIHN0YWdlOiAncHJvc3BlY3RpbmcnLFxuICAgICAgICBwcm9iYWJpbGl0eTogMTAsXG4gICAgICAgIGNsb3NlX2RhdGU6IGhvcml6b24udG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCksXG4gICAgICAgIHR5cGU6IHNyYy50eXBlID8/IG51bGwsXG4gICAgICAgIGxlYWRfc291cmNlOiBzcmMubGVhZF9zb3VyY2UgPz8gbnVsbCxcbiAgICAgICAgY3JtX2NhbXBhaWduOiBzcmMuY3JtX2NhbXBhaWduID8/IG51bGwsXG4gICAgICAgIC8vIEV4cGxpY2l0IGJlY2F1c2UgYW4gYWN0aW9uIGJvZHkgcnVucyBcXGBpc1N5c3RlbVxcYCwgc28gbm90aGluZyBzdGFtcHNcbiAgICAgICAgLy8gXFxgb3duZXJfaWRcXGAgZm9yIGl0IFx1MjAxNCBzZWUgdGhlIG5vdGUgaW4gYWN0aXZpdHktYWN0aW9ucy50cyAoIzU0OCkuXG4gICAgICAgIG93bmVyX2lkOiBjdHgudXNlcj8uaWQgPz8gbnVsbCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgaWQ6IGluc2VydGVkPy5pZCA/PyBudWxsIH07XG4gICAgYCxcbiAgICBjYXBhYmlsaXRpZXM6IFsnYXBpLnJlYWQnLCAnYXBpLndyaXRlJ10sXG4gICAgdGltZW91dE1zOiA1MDAwLFxuICB9LFxuICBsb2NhdGlvbnM6IFsncmVjb3JkX2hlYWRlcicsICdyZWNvcmRfbW9yZSddLFxuICBzdWNjZXNzTWVzc2FnZTogJ09wcG9ydHVuaXR5IGNsb25lZCBzdWNjZXNzZnVsbHkhJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcblxuLyoqXG4gKiBNYXNzIFVwZGF0ZSBPcHBvcnR1bml0eSBTdGFnZS5cbiAqXG4gKiBCb3RoIGludm9jYXRpb24gaGFsdmVzIHdvcms6XG4gKlxuICogICAtIFNJTkdMRSByZWNvcmQgKHJvdyBzZWxlY3Rpb24gLyB0b29sYmFyIHdpdGggb25lIHJvdyk6IHRoZSBjb25zb2xlIFBPU1RzXG4gKiAgICAgYHsgcmVjb3JkSWQsIHBhcmFtczogeyBzdGFnZSB9IH1gIGFuZCB0aGUgYm9keSByZWFkcyBgY3R4LnJlY29yZElkYC5cbiAqICAgLSBNVUxUSSByZWNvcmQ6IHRoZSBzZWxlY3Rpb24gYXJyaXZlcyBpbiB0aGUgQlVJTFQtSU4gYF9zZWxlY3RlZElkc2BcbiAqICAgICBwYXJhbSBcdTIwMTQgbGVhZGluZyB1bmRlcnNjb3JlIFx1MjAxNCBpbmplY3RlZCBieSB0aGUgZ3JpZCByZW5kZXJlciBmb3IgdGhlXG4gKiAgICAgdmlldydzIGBidWxrQWN0aW9uRGVmc2AgZW50cnkgd2l0aCBgZXhlY3V0aW9uOiAnYWdncmVnYXRlJ2AsIHdoaWNoXG4gKiAgICAgZGlzcGF0Y2hlcyB0aGlzIGFjdGlvbiBPTkNFIGZvciB0aGUgd2hvbGUgc2VsZWN0aW9uIChubyBgcmVjb3JkSWRgKS5cbiAqXG4gKiBUaGF0IHVuZGVyc2NvcmUgaXMgdGhlIHdob2xlIG9mIHRoZSBjb250cmFjdC4gQSBzY3JpcHQgYm9keSdzIGBpbnB1dGAgSVMgdGhlXG4gKiBhY3Rpb24ncyBwYXJhbXMgYmFnIChgQG9iamVjdHN0YWNrL3J1bnRpbWVgIGBzYW5kYm94L2JvZHktcnVubmVyLnRzOjMzOGApLCBhbmRcbiAqIGBfc2VsZWN0ZWRJZHNgIGlzIG9uZSBvZiB0aGUgcGFyYW1zIGdhdGUncyBidWlsdGluIGtleXMgKGBAb2JqZWN0c3RhY2svc3BlY2BcbiAqIGB1aS9hY3Rpb24tcGFyYW1zLnpvZC50czo3MGAsIGFsb25nc2lkZSBgcmVjb3JkSWRgIC8gYG9iamVjdE5hbWVgKS4gRXZlcnlcbiAqIG90aGVyIHNoYXBlIGlzIHVuZGVjbGFyZWQgYW5kIGNhbm5vdCBhcnJpdmU6IGEgdG9wLWxldmVsIGBzZWxlY3RlZElkc2AgaXNcbiAqIG5ldmVyIG1lcmdlZCBpbnRvIHRoZSBiYWcsIGFuZCBhIGBwYXJhbXMuc2VsZWN0ZWRJZHNgIHdpdGhvdXQgdGhlIHVuZGVyc2NvcmVcbiAqIGlzIHJlZnVzZWQgYnkgdGhlIHN0cmljdCBwYXJhbXMgZ2F0ZSAoQURSLTAxMDQpLiBUaGUgY29uc29sZSdzIG93biBcInNlbGVjdFxuICogZXhhY3RseSBvbmUgcm93XCIgdG9hc3QgZmlyZXMgcHJlY2lzZWx5IHdoZW4gYF9zZWxlY3RlZElkc2Agd2FzIE5PVCBpbmplY3RlZCxcbiAqIHdoaWNoIGlzIHdoYXQgaGFwcGVucyB0byBhIHZpZXcgY2Fycnlpbmcgbm8gYnVsayBkZWNsYXJhdGlvbiBhdCBhbGwgXHUyMDE0IHJlYWRcbiAqIHRoYXQgdG9hc3QgYXMgYSBtaXNzaW5nIGRlY2xhcmF0aW9uIG9uIHRoZSB2aWV3LCBuZXZlciBhcyBhIHBsYXRmb3JtIGxpbWl0LlxuICpcbiAqIFx1MjZENCBEbyBOT1QgZGVjbGFyZSBgX3NlbGVjdGVkSWRzYCBpbiBgcGFyYW1zYCBiZWxvdzogYnVpbHRpbiBrZXlzIGFyZSBpbmplY3RlZFxuICogYnkgdGhlIHJlbmRlcmVyLCBhbmQgdGhlIGdhdGUgYWRtaXRzIHRoZW0gd2l0aG91dCBhIGRlY2xhcmF0aW9uIChkZWNsYXJpbmcgb25lXG4gKiBpcyBub3QgYSBzdXBwb3J0ZWQgYXV0aG9yaW5nIG1vdmUpLiBcdTI2RDQgRG8gTk9UIHJlLWFkZCBhIG5vLXVuZGVyc2NvcmVcbiAqIGBpbnB1dC5zZWxlY3RlZElkc2AgcmVhZCBlaXRoZXIgXHUyMDE0IG5vdGhpbmcgY2FuIGRlbGl2ZXIgdGhhdCBrZXksIHNvIGl0IHdvdWxkXG4gKiBiZSBhIGxpbWIgdGhhdCBvbmx5IGV2ZXIgcmVhZHMgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBjb25zdCBNYXNzVXBkYXRlU3RhZ2VBY3Rpb246IEFjdGlvbiA9IHtcbiAgbmFtZTogJ21hc3NfdXBkYXRlX3N0YWdlJyxcbiAgbGFiZWw6ICdVcGRhdGUgU3RhZ2UnLFxuICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgaWNvbjogJ2xheWVycycsXG4gIHR5cGU6ICdzY3JpcHQnLFxuICBib2R5OiB7XG4gICAgbGFuZ3VhZ2U6ICdqcycsXG4gICAgc291cmNlOiBgXG4gICAgICBjb25zdCBuZXdTdGFnZSA9IGlucHV0LnN0YWdlID8/IG51bGw7XG4gICAgICBpZiAoIW5ld1N0YWdlKSB0aHJvdyBuZXcgRXJyb3IoJ21hc3NfdXBkYXRlX3N0YWdlIHJlcXVpcmVzIGEgc3RhZ2UnKTtcbiAgICAgIC8vIFNlbGVjdGlvbiBmaXJzdCwgc2luZ2xlIHJlY29yZCBhcyB0aGUgZmFsbGJhY2suIEFuIGFnZ3JlZ2F0ZSBkaXNwYXRjaFxuICAgICAgLy8gY2FycmllcyB0aGUgd2hvbGUgc2VsZWN0aW9uIGluIFxcYF9zZWxlY3RlZElkc1xcYCBhbmQgTk8gcmVjb3JkSWQ7IGFcbiAgICAgIC8vIHNpbmdsZS1yZWNvcmQgZGlzcGF0Y2ggY2FycmllcyByZWNvcmRJZCBhbmQgbm8gc2VsZWN0aW9uLiBUaGUgdHdvIGFyZVxuICAgICAgLy8gbmV2ZXIgYm90aCBwcmVzZW50LCBzbyB0aGUgb3JkZXIgb25seSBkZWNpZGVzIHdoaWNoIHNoYXBlIHdpbnMgaWYgdGhlXG4gICAgICAvLyBwbGF0Zm9ybSBldmVyIHNlbmRzIGJvdGguXG4gICAgICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmlzQXJyYXkoaW5wdXQuX3NlbGVjdGVkSWRzKSA/IGlucHV0Ll9zZWxlY3RlZElkcyA6IFtdO1xuICAgICAgY29uc3QgaWRzID0gc2VsZWN0ZWQubGVuZ3RoID8gc2VsZWN0ZWQgOiAoY3R4LnJlY29yZElkID8gW2N0eC5yZWNvcmRJZF0gOiBbXSk7XG4gICAgICBpZiAoIWlkcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignbWFzc191cGRhdGVfc3RhZ2U6IG5vIG9wcG9ydHVuaXR5IHNlbGVjdGVkJyk7XG4gICAgICBjb25zdCBtaXNzZWQgPSBbXTtcbiAgICAgIGxldCBmaXJzdENhdXNlID0gJyc7XG4gICAgICBsZXQgdXBkYXRlZCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAvLyBcXGB1cGRhdGUoZGF0YSwgb3B0aW9ucylcXGAgXHUyMDE0IFxcYGN0eC5hcGlcXGAgaXMgdGhlIGVuZ2luZSByZXBvIGZhY2FkZSwgd2hvc2VcbiAgICAgICAgLy8gdXBkYXRlIHRha2VzIGEgRE9DVU1FTlQsIG5vdCBhbiBpZC4gXFxgdXBkYXRlQnlJZChpZCwgZGF0YSlcXGAgZXhpc3RzIG9uXG4gICAgICAgIC8vIE9iamVjdFJlcG9zaXRvcnkgYnV0IE5PVCBvbiB0aGUgZmFjYWRlIHRoZSBydW50aW1lIGJ1aWxkcyB3aGVuIGl0IGhhc1xuICAgICAgICAvLyBubyBzY29wZWQgY29udGV4dCwgc28gdGhpcyBzcGVsbGluZyBpcyB0aGUgb25seSBvbmUgbGl2ZSBvbiBib3RoLlxuICAgICAgICAvL1xuICAgICAgICAvLyBBbiBpZCB0aGF0IG1hdGNoZXMgbm8gcm93IGlzIGEgTUlTUywgbm90IGFuIGFib3J0LCBhbmQgdGhlIGVuZ2luZSBoYXNcbiAgICAgICAgLy8gYW5zd2VyZWQgaXQgYm90aCB3YXlzOiB0aHJvdWdoIEBvYmplY3RzdGFjay8qIDE3LjAuMC1yYy42IFxcYHVwZGF0ZVxcYFxuICAgICAgICAvLyBSRVNPTFZFRCBXSVRIIE5VTEwsIGFuZCBmcm9tIDE3LjAuMCBpdCBSRUpFQ1RTIChSRUNPUkRfTk9UX0ZPVU5EIC9cbiAgICAgICAgLy8gNDA0KS4gQm90aCBhcmUgaGFuZGxlZCBoZXJlLCBhbmQgbmVpdGhlciBtYXkgZW5kIHRoZSBsb29wIFx1MjAxNCBhblxuICAgICAgICAvLyB1bmNhdWdodCByZWplY3Rpb24gb24gdGhlIGZpcnN0IHN0YWxlIGlkIHdvdWxkIGxlYXZlIGV2ZXJ5IGlkIGFmdGVyXG4gICAgICAgIC8vIGl0IHVuYXR0ZW1wdGVkLCBzbyByZS1ydW5uaW5nIHRoZSBhY3Rpb24gb3ZlciB0aGUgc2FtZSBzZWxlY3Rpb25cbiAgICAgICAgLy8gd291bGQgZmFpbCBhdCB0aGUgc2FtZSByb3cgZm9yZXZlciBhbmQgdGhlIGxpdmUgcm93cyBiZWhpbmQgaXQgY291bGRcbiAgICAgICAgLy8gbmV2ZXIgYmUgY292ZXJlZC4gVGhhdCBpcyBzdHJpY3RseSB3b3JzZSB0aGFuIHRoZSBzaWxlbnQtc3VjY2Vzc1xuICAgICAgICAvLyBmYWlsdXJlICM1ODggcHVsbGVkIHRoaXMgYnV0dG9uIGZvciwgYmVjYXVzZSBpdCBpcyB1bnJlY292ZXJhYmxlXG4gICAgICAgIC8vIGZyb20gdGhlIFVJLiBDb2xsZWN0IHRoZSBtaXNzLCBrZWVwIGdvaW5nLCByZWplY3Qgb25jZSBhdCB0aGUgZW5kLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGUgY2F0Y2ggaXMgZGVsaWJlcmF0ZWx5IGNhdXNlLUFHTk9TVElDIFx1MjAxNCBidXQgTk9UIGJlY2F1c2UgdGhlIGNhdXNlXG4gICAgICAgIC8vIGlzIGludmlzaWJsZS4gUmVhZCBvbiAxNy40LjAgKFxcYGhvc3RFcnJvclRvVm1cXGA7IG5vdCByZS1yZWFkIG9uIDE3LjUuMCksIGEgaG9zdFxuICAgICAgICAvLyByZWplY3Rpb24gcmVhY2hlcyBhIGJvZHkgYXMgXFxgbmFtZVxcYCBhbmQgXFxgbWVzc2FnZVxcYCBwbHVzLCB3aGVuIHRoZSBob3N0XG4gICAgICAgIC8vIGVycm9yIGNhcnJpZXMgdGhlbSwgXFxgY29kZVxcYCwgXFxgc3RhdHVzXFxgLCBcXGBmaWVsZHNcXGAgYW5kIFxcYHVzZXJNZXNzYWdlXFxgIFx1MjAxNFxuICAgICAgICAvLyBub3RoaW5nIGVsc2UsIHNvIGEgc3RhbGUgaWQgYXJyaXZlcyBicmFuY2hhYmxlIGFzXG4gICAgICAgIC8vIFxcYGNvZGUgPT09ICdSRUNPUkRfTk9UX0ZPVU5EJ1xcYCB3aGlsZSBcXGBkZXRhaWxzXFxgIHJlYWxseSBpcyBkcm9wcGVkLiBUaGVcbiAgICAgICAgLy8gYnJhbmNoIGlzIG5vdCB0YWtlbiBiZWNhdXNlIGV2ZXJ5IGNhdXNlIGhhcyB0aGUgc2FtZSBvdXRjb21lIGhlcmUgXHUyMDE0XG4gICAgICAgIC8vIHRoZSByb3cgZGlkIG5vdCBtb3ZlLCBzbyBjb2xsZWN0IGl0IGFuZCBrZWVwIGdvaW5nIFx1MjAxNCBhbmQgbmFycm93aW5nXG4gICAgICAgIC8vIHRoZSBjYXRjaCB0byBhIHJvc3RlciBvZiBrbm93biBjb2RlcyB3b3VsZCBsZXQgYW4gdW5saXN0ZWQgY2F1c2VcbiAgICAgICAgLy8gYWJvcnQgdGhlIGxvb3AsIHRoZSBmYWlsdXJlIHRoZSBwYXJhZ3JhcGggYWJvdmUgZm9yYmlkcy4gTWVzc2FnZSB0ZXh0XG4gICAgICAgIC8vIGlzIGVuZ2luZSB3b3JkaW5nIGFuZCBub3QgY29udHJhY3QsIHNvIFxcYGZpcnN0Q2F1c2VcXGAgaXMgY2FycmllZFxuICAgICAgICAvLyB2ZXJiYXRpbSBhbmQgbmV2ZXIgcGFyc2VkLlxuICAgICAgICBsZXQgcm93ID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByb3cgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykudXBkYXRlKFxuICAgICAgICAgICAgeyBpZDogaWQsIHN0YWdlOiBuZXdTdGFnZSB9LFxuICAgICAgICAgICAgeyB3aGVyZTogeyBpZDogaWQgfSB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJvdyA9IG51bGw7XG4gICAgICAgICAgaWYgKCFmaXJzdENhdXNlKSBmaXJzdENhdXNlID0gKGVyciAmJiBlcnIubWVzc2FnZSkgPyBTdHJpbmcoZXJyLm1lc3NhZ2UpIDogU3RyaW5nKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ291bnQgb25seSB3aGF0IGNhbWUgYmFjazogY291bnRpbmcgdGhlIEFUVEVNUFQgaXMgaG93IGEgc3RhbGUgb3JcbiAgICAgICAgLy8gaW52aXNpYmxlIGlkIHR1cm5zIGludG8gYSBzdWNjZXNzIHRvYXN0IGZvciBhIHdyaXRlIHRoYXQgbmV2ZXJcbiAgICAgICAgLy8gaGFwcGVuZWQgKCM1ODgpLlxuICAgICAgICBpZiAocm93KSB7IHVwZGF0ZWQrKzsgfSBlbHNlIHsgbWlzc2VkLnB1c2goaWQpOyB9XG4gICAgICB9XG4gICAgICAvLyBBZ2dyZWdhdGUgZGlzcGF0Y2ggaXMgYWxsLW9yLW5vdGhpbmcgKG9iamVjdHVpIzMxMzkpOiBhIGhhbmRsZXIgdGhhdFxuICAgICAgLy8gY2Fubm90IGNvdmVyIHRoZSB3aG9sZSBzZWxlY3Rpb24gbXVzdCByZWplY3QgcmF0aGVyIHRoYW4gcmVwb3J0IHBhcnRpYWxcbiAgICAgIC8vIHdvcmssIGJlY2F1c2UgdGhlIGJhciBvZmZlcnMgbm8gcGVyLXJvdyByZXRyeSBcdTIwMTQgdGhlIHJldHJ5IElTIHJlLXJ1bm5pbmdcbiAgICAgIC8vIHRoZSBhY3Rpb24gb3ZlciB0aGUgc2VsZWN0aW9uLCB3aGljaCBpcyBzYWZlIGhlcmUgc2luY2Ugc2V0dGluZyBhIHN0YWdlXG4gICAgICAvLyBpcyBpZGVtcG90ZW50LiBSb3dzIGFscmVhZHkgbW92ZWQgaW4gdGhpcyBydW4ga2VlcCB0aGUgbmV3IHN0YWdlOyB0aGVcbiAgICAgIC8vIGVycm9yIG5hbWVzIHRoZSBvbmVzIHRoYXQgZGlkIG5vdCBzbyB0aGUgcmVwIGNhbiBzZWUgdGhlIGRpZmZlcmVuY2UuXG4gICAgICBpZiAobWlzc2VkLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ21hc3NfdXBkYXRlX3N0YWdlOiAnICsgbWlzc2VkLmxlbmd0aCArICcgb2YgJyArIGlkcy5sZW5ndGhcbiAgICAgICAgICArICcgc2VsZWN0ZWQgb3Bwb3J0dW5pdGllcyBjb3VsZCBub3QgYmUgdXBkYXRlZCAoJyArIG1pc3NlZC5qb2luKCcsICcpXG4gICAgICAgICAgKyAnKS4gUmUtcnVuIHRoZSBhY3Rpb24gb24gdGhlIHNlbGVjdGlvbiB0byByZXRyeS4nXG4gICAgICAgICAgKyAoZmlyc3RDYXVzZSA/ICcgRmlyc3QgY2F1c2U6ICcgKyBmaXJzdENhdXNlIDogJycpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBzdGFnZTogbmV3U3RhZ2UsIHVwZGF0ZWQgfTtcbiAgICBgLFxuICAgIGNhcGFiaWxpdGllczogWydhcGkud3JpdGUnXSxcbiAgICB0aW1lb3V0TXM6IDEwMDAwLFxuICB9LFxuICBsb2NhdGlvbnM6IFsnbGlzdF90b29sYmFyJ10sXG4gIHBhcmFtczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdzdGFnZScsXG4gICAgICBsYWJlbDogJ05ldyBTdGFnZScsXG4gICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgLy8gTWlycm9ycyBjcm1fb3Bwb3J0dW5pdHkuc3RhZ2UgZXhhY3RseSBcdTIwMTQgc2VlIF9waWNrbGlzdHMudHMuXG4gICAgICBvcHRpb25zOiBwbGFpbk9wdGlvbnMoT1BQT1JUVU5JVFlfU1RBR0VfT1BUSU9OUyksXG4gICAgfVxuICBdLFxuICBzdWNjZXNzTWVzc2FnZTogJ09wcG9ydHVuaXRpZXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkhJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIFF1b3RlIGZyb20gdGhpcyBPcHBvcnR1bml0eS5cbiAqXG4gKiBGbG93LXR5cGVkIGFjdGlvbjogbGF1bmNoZXMgdGhlIGBxdW90ZV9nZW5lcmF0aW9uYCBzY3JlZW4gZmxvdyAobmFtZSxcbiAqIHZhbGlkaXR5LCBkaXNjb3VudCkgd2hpY2ggY3JlYXRlcyB0aGUgZHJhZnQgY3JtX3F1b3RlIGFuZCBtb3ZlcyB0aGUgZGVhbFxuICogdG8gYHByb3Bvc2FsYC4gV2l0aG91dCB0aGlzIGFjdGlvbiB0aGUgZmxvdyB3YXMgdW5yZWFjaGFibGUgZnJvbSB0aGUgVUkgXHUyMDE0XG4gKiB0aGUgQ1BRIGxlZyAob3Bwb3J0dW5pdHkgXHUyMTkyIHF1b3RlKSBoYWQgbm8gZW50cnkgcG9pbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5lcmF0ZVF1b3RlQWN0aW9uOiBBY3Rpb24gPSB7XG4gIG5hbWU6ICdnZW5lcmF0ZV9xdW90ZScsXG4gIGxhYmVsOiAnR2VuZXJhdGUgUXVvdGUnLFxuICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgaWNvbjogJ3JlY2VpcHQnLFxuICB0eXBlOiAnZmxvdycsXG4gIHRhcmdldDogJ3F1b3RlX2dlbmVyYXRpb24nLFxuICAvLyBNaXJyb3IgY2xvbmVfb3Bwb3J0dW5pdHkncyBwbGFjZW1lbnQgKGhlYWRlciArIG92ZXJmbG93IG1lbnUpIHNvIHRoZSBhY3Rpb25cbiAgLy8gaXMgcmVhY2hhYmxlIGJvdGggYXMgYSBwcmltYXJ5IGJ1dHRvbiBhbmQgZnJvbSB0aGUgXCJcdTIwMjZcIiBtZW51IG9uIG5hcnJvd1xuICAvLyB2aWV3cG9ydHMgd2hlcmUgdGhlIGhlYWRlciBjb2xsYXBzZXMuXG4gIGxvY2F0aW9uczogWydyZWNvcmRfaGVhZGVyJywgJ3JlY29yZF9tb3JlJywgJ2xpc3RfaXRlbSddLFxuICB2aXNpYmxlOiBQYGhhcyhyZWNvcmQuc3RhZ2UpICYmIHJlY29yZC5zdGFnZSAhPSBcImNsb3NlZF93b25cIiAmJiByZWNvcmQuc3RhZ2UgIT0gXCJjbG9zZWRfbG9zdFwiYCxcbiAgc3VjY2Vzc01lc3NhZ2U6ICdRdW90ZSBjcmVhdGVkIGZyb20gb3Bwb3J0dW5pdHkhJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9hY3Rpb25zL2luZGV4LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9hY3Rpb25zXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9hY3Rpb25zL2luZGV4LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIE1hcmtldGluZyBhY3Rpb24gYmFycmVsLlxuICpcbiAqIFRoZSBkb2N0cmluZSBmb3IgdGhpcyBtZXRhZGF0YSB0eXBlIGlzIHdyaXR0ZW4gb25jZSwgaW5cbiAqIGBzcmMvc2FsZXMvYWN0aW9ucy9pbmRleC50c2A7IHRoaXMgZmlsZSBpcyB0aGUgbWFya2V0aW5nIHBhY2thZ2UncyBoYWxmIG9mXG4gKiB0aGUgc2FtZSBmaWxlLWJ5LWZpbGUgcmVnaXN0cmF0aW9uLlxuICovXG5leHBvcnQgeyBFbnJvbGxMZWFkc0FjdGlvbiwgTWFya1Jlc3BvbmRlZEFjdGlvbiB9IGZyb20gJy4vY2FtcGFpZ24uYWN0aW9ucyc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvYWN0aW9ucy9jYW1wYWlnbi5hY3Rpb25zLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9hY3Rpb25zXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9hY3Rpb25zL2NhbXBhaWduLmFjdGlvbnMudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgQWN0aW9uIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuaW1wb3J0IHsgUCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcblxuLyoqXG4gKiBFbnJvbGwgbGVhZHMgb3IgY29udGFjdHMgaW50byB0aGlzIGNhbXBhaWduLlxuICpcbiAqIEZsb3ctdHlwZWQgYWN0aW9uOiBsYXVuY2hlcyB0aGUgYGNhbXBhaWduX2Vucm9sbG1lbnRgIHNjcmVlbiBmbG93IChwaWNrIHRoZVxuICogbWVtYmVyIHNpZGUgYW5kIGl0cyBzZWdtZW50LCBlbnJvbGwgZXZlcnlvbmUgZWxpZ2libGUpLiBUaGlzIGFjdGlvbiBpcyB0aGVcbiAqIGZsb3cncyBlbnRyeSBwb2ludCwgZm9sbG93aW5nIHRoZSBwcm92ZW4gYGNvbnZlcnRfbGVhZGAgLyBgZ2VuZXJhdGVfcXVvdGVgXG4gKiBwYXR0ZXJuIFx1MjAxNCB0aGUgY29uc29sZSdzIGZsb3ctYWN0aW9uIHRyaWdnZXIgc2VuZHMgYHsgcmVjb3JkSWQsIG9iamVjdE5hbWUgfWAuXG4gKlxuICogXHUyNkQ0IE5ldmVyIHJlbmFtZSBgZW5yb2xsX2xlYWRzYCB0byBtYXRjaCB0aGUgXCJFbnJvbGwgTWVtYmVyc1wiIGxhYmVsLiBBbiBhY3Rpb25cbiAqIG5hbWUgaXMgYSBkaXNwYXRjaCBpZGVudGlmaWVyIHRoYXQgdmlld3MsIGRvY3MgYW5kIHRoZSBhdWRpdCB0cmFpbCByZWZlcmVuY2VcbiAqIGJ5IHN0cmluZzsgdGhlIGxhYmVsIGFscmVhZHkgY2FycmllcyB0aGUgd29yZCBjb3JyZWN0bHkuXG4gKi9cbmV4cG9ydCBjb25zdCBFbnJvbGxMZWFkc0FjdGlvbjogQWN0aW9uID0ge1xuICBuYW1lOiAnZW5yb2xsX2xlYWRzJyxcbiAgbGFiZWw6ICdFbnJvbGwgTWVtYmVycycsXG4gIG9iamVjdE5hbWU6ICdjcm1fY2FtcGFpZ24nLFxuICBpY29uOiAndXNlci1wbHVzJyxcbiAgdHlwZTogJ2Zsb3cnLFxuICB0YXJnZXQ6ICdjYW1wYWlnbl9lbnJvbGxtZW50JyxcbiAgbG9jYXRpb25zOiBbJ3JlY29yZF9oZWFkZXInLCAncmVjb3JkX21vcmUnXSxcbiAgLy8gRW5yb2xsbWVudCBvbmx5IG1ha2VzIHNlbnNlIHdoaWxlIHRoZSBjYW1wYWlnbiBpcyBvcGVuIFx1MjAxNCB0aGUgZmxvd1xuICAvLyBkb3VibGUtY2hlY2tzIHRoaXMgc2VydmVyLXNpZGUuXG4gIHZpc2libGU6IFBgaGFzKHJlY29yZC5zdGF0dXMpICYmIChyZWNvcmQuc3RhdHVzID09IFwicGxhbm5pbmdcIiB8fCByZWNvcmQuc3RhdHVzID09IFwiaW5fcHJvZ3Jlc3NcIilgLFxuICBzdWNjZXNzTWVzc2FnZTogJ0VsaWdpYmxlIG1lbWJlcnMgZW5yb2xsZWQgaW4gY2FtcGFpZ24uJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcblxuLyoqXG4gKiBNYXJrIGEgY2FtcGFpZ24gbWVtYmVyIGFzIGhhdmluZyByZXNwb25kZWQuXG4gKlxuICogVGhlIHdyaXRlciBmb3IgdGhlIGByZXNwb25kZWRgIHN0YXR1cywgb24gdGhlIG1lbWJlciByb3cgcmF0aGVyIHRoYW4gb24gdGhlXG4gKiBjYW1wYWlnbjogYSByZXAgaGVhcnMgYmFjayBmcm9tIG9uZSBwZXJzb24sIGFuZCBvbmUgbWVtYmVyc2hpcCBjaGFuZ2VzLlxuICogYG51bV9yZXNwb25zZXNgIGFuZCBgcmVzcG9uc2VfcmF0ZWAgYXJlIGNvbXB1dGVkIG9mZiB0aGF0IHN0YXR1cywgc28gYW4gYXBwXG4gKiB3aXRoIG5vIHdyaXRlciBmb3IgaXQgcmVwb3J0cyBhIHN0cnVjdHVyYWwgemVybyBvbiBldmVyeSBjYW1wYWlnbi5cbiAqXG4gKiBUaGUgYm9keSBzdGFtcHMgYWxsIHRocmVlIHJlc3BvbnNlIGZpZWxkcyB0b2dldGhlciwgcmF0aGVyIHRoYW4gcmVseWluZyBvblxuICogYGNhbXBhaWduX21lbWJlcl9saWZlY3ljbGVgIHRvIGJhY2stZmlsbCB0d28gb2YgdGhlbS4gQm90aCBwYXRocyBhcmVcbiAqIGV4ZXJjaXNlZCAoYSByZXAgY2FuIGFsc28gZmxpcCBgc3RhdHVzYCBvbiB0aGUgcmVjb3JkIGl0c2VsZiwgd2hpY2ggdGhlIGhvb2tcbiAqIGNhdGNoZXMpIGJ1dCBhbiBhY3Rpb24gdGhhdCB3cml0ZXMgYSBzdGF0dXMgYW5kIGxlYXZlcyB0aGUgcmVjb3JkIGludGVybmFsbHlcbiAqIGluY29uc2lzdGVudCBmb3IgdGhlIGxlbmd0aCBvZiBhIGhvb2sgZGlzcGF0Y2ggaXMgYSBzaGFwZSB0aGUgZGV0YWlsIHBhZ2UgY2FuXG4gKiByZW5kZXIgbWlkLWZsaWdodCwgYW5kIHRoaXMgb25lIGlzIGNoZWFwIHRvIGdldCByaWdodCBhdCB0aGUgc291cmNlLlxuICpcbiAqIGByZWNvcmRfaGVhZGVyYCArIGBsaXN0X2l0ZW1gOiBgY3JtX2NhbXBhaWduX21lbWJlcmAgc2hpcHMgbm8gdmlldyBvZiBpdHNcbiAqIG93biBcdTIwMTQgaXRzIHJvd3MgYXJlIHN1cmZhY2VkIGJ5IHRoZSBtZW1iZXJzIHJlbGF0ZWQgbGlzdCBvbiBhIGNhbXBhaWduJ3NcbiAqIGRldGFpbCBwYWdlIChjb2x1bW5zIGNvbWUgZnJvbSBgaGlnaGxpZ2h0RmllbGRzYCksIGFuZCBgbGlzdF9pdGVtYCBpcyB0aGVcbiAqIHBlci1yb3cgZW50cnkgcG9pbnQgdGhlcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBNYXJrUmVzcG9uZGVkQWN0aW9uOiBBY3Rpb24gPSB7XG4gIG5hbWU6ICdtYXJrX3Jlc3BvbmRlZCcsXG4gIGxhYmVsOiAnTWFyayBSZXNwb25kZWQnLFxuICBvYmplY3ROYW1lOiAnY3JtX2NhbXBhaWduX21lbWJlcicsXG4gIGljb246ICdyZXBseScsXG4gIC8vIHNjcmlwdCwgbm90IG1vZGFsIFx1MjAxNCBhIGB0eXBlOiAnbW9kYWwnYCBhY3Rpb24gaGFzIG5vIHNlcnZlciBkaXNwYXRjaCBhdCBhbGxcbiAgLy8gYW5kIGl0cyBib2R5IG5ldmVyIHJ1bnMgKHNlZSBgY3JlYXRlX2NhbXBhaWduYCdzIG5vdGUgaW4gbGVhZC5hY3Rpb25zLnRzKS5cbiAgdHlwZTogJ3NjcmlwdCcsXG4gIGJvZHk6IHtcbiAgICBsYW5ndWFnZTogJ2pzJyxcbiAgICBzb3VyY2U6IGBcbiAgICAgIGNvbnN0IGlkID0gY3R4LnJlY29yZElkO1xuICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKCdtYXJrX3Jlc3BvbmRlZCByZXF1aXJlcyBhIHJlY29yZElkJyk7XG4gICAgICBjb25zdCByZXNwb25kZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgIGF3YWl0IGN0eC5hcGkub2JqZWN0KCdjcm1fY2FtcGFpZ25fbWVtYmVyJykudXBkYXRlKFxuICAgICAgICB7IGlkLCBzdGF0dXM6ICdyZXNwb25kZWQnLCBoYXNfcmVzcG9uZGVkOiB0cnVlLCByZXNwb25zZV9kYXRlOiByZXNwb25kZWRBdCB9LFxuICAgICAgICB7IHdoZXJlOiB7IGlkIH0gfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyBpZCwgc3RhdHVzOiAncmVzcG9uZGVkJywgcmVzcG9uc2VfZGF0ZTogcmVzcG9uZGVkQXQgfTtcbiAgICBgLFxuICAgIGNhcGFiaWxpdGllczogWydhcGkud3JpdGUnXSxcbiAgICB0aW1lb3V0TXM6IDUwMDAsXG4gIH0sXG4gIGxvY2F0aW9uczogWydyZWNvcmRfaGVhZGVyJywgJ2xpc3RfaXRlbSddLFxuICAvLyBBbHJlYWR5LXJlc3BvbmRlZCBhbmQgY29udmVydGVkIG1lbWJlcnMgaGF2ZSBub3RoaW5nIHRvIHJlY29yZDsgYW5cbiAgLy8gdW5zdWJzY3JpYmVkIG1lbWJlciBtdXN0IG5vdCBiZSBkcmFnZ2VkIGJhY2sgaW50byB0aGUgZnVubmVsIGJ5IGFcbiAgLy8gbWlzLWNsaWNrIChgY2FtcGFpZ25fbWVtYmVyX29wdG91dF9zeW5jYCBoYXMgYWxyZWFkeSBvcHRlZCB0aGF0IHBlcnNvbiBvdXRcbiAgLy8gb2YgZW1haWwsIGFuZCB0aGlzIGFjdGlvbiB3b3VsZCBub3QgdW5kbyB0aGF0IFx1MjAxNCBsZWF2aW5nIHRoZSB0d28gcmVjb3Jkc1xuICAvLyBkaXNhZ3JlZWluZyBhYm91dCB0aGUgc2FtZSBwZXJzb24pLlxuICB2aXNpYmxlOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwic2VudFwiYCxcbiAgc3VjY2Vzc01lc3NhZ2U6ICdSZXNwb25zZSByZWNvcmRlZCBvbiB0aGlzIGNhbXBhaWduIG1lbWJlci4nLFxuICByZWZyZXNoQWZ0ZXI6IHRydWUsXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGFzaGJvYXJkcy9pbmRleC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXNoYm9hcmRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Rhc2hib2FyZHMvaW5kZXgudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogRGFzaGJvYXJkIERlZmluaXRpb25zIEJhcnJlbFxuICpcbiAqICMjIFR3byBpMThuIHN1cmZhY2VzIG9uIGEgZGFzaGJvYXJkLCBhbmQgb25seSBvbmUgb2YgdGhlbSByZXNvbHZlcyAoIzE4MjIpXG4gKlxuICogYEBvYmplY3RzdGFjay9zcGVjYCB0eXBlcyBCT1RIIGBHbG9iYWxGaWx0ZXJTY2hlbWEubGFiZWxgIGFuZFxuICogYENoYXJ0QXhpc1NjaGVtYS50aXRsZWAgYXMgYEkxOG5MYWJlbFNjaGVtYWAgXHUyMDE0IGB6LnVuaW9uKFt6LnN0cmluZygpLFxuICogSW5saW5lTG9jYWxlTWFwU2NoZW1hXSlgIFx1MjAxNCBzbyBib3RoIGFjY2VwdCBgeyBlbiwgJ3poLUNOJywgXHUyMDI2IH1gLiBPbmx5IHRoZVxuICogZmlsdGVyIGhhbGYgaXMgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgdmlld2VyJ3MgbG9jYWxlLiBNZWFzdXJlZCBvblxuICogYEBvYmplY3RzdGFjay9jb25zb2xlQDE3LjQuMGAsIGRyaXZpbmcgdGhlIHJlYWwgQ29uc29sZSBpbiBDaHJvbWl1bSwgbm90XG4gKiByZWFkIG9mZiBhIGRvY2Jsb2NrOlxuICpcbiAqICAgLSBGSUxURVIgYGxhYmVsYCBhbmQgc3RhdGljIG9wdGlvbiBgbGFiZWxgIFx1MjE5MiBsb2NhbGUtYXdhcmUuIFRoZSByZW5kZXJlclxuICogICAgIGNhbGxzIHRoZSBpbmxpbmUtbWFwIHJlc29sdmVyIHdpdGggdGhlIGFjdGl2ZSBsYW5ndWFnZSwgc28gYHpoLUNOYFxuICogICAgIHJlbmRlcnMgdGhlIGB6aC1DTmAgdmFsdWUgYW5kIGBqYS1KUGAgdGhlIGBqYS1KUGAgb25lLiBUaGlzIGlzIHRoZVxuICogICAgIHNwZWxsaW5nIGV2ZXJ5IGBnbG9iYWxGaWx0ZXJzW11gIGVudHJ5IGluIHRoaXMgZm9sZGVyIHVzZXMuXG4gKiAgIC0gQVhJUyBgdGl0bGVgIFx1MjE5MiBOT1QgbG9jYWxlLWF3YXJlIG9uIDE3LjQuMCAodGhlIGF4aXMgbm9ybWFsaXNlciB0b29rIHRoZVxuICogICAgIG1hcCdzIEZJUlNUIHZhbHVlLCB3aGF0ZXZlciB0aGUgdmlld2VyJ3MgbG9jYWxlKS4gU2luY2VcbiAqICAgICBgQG9iamVjdHN0YWNrL3NwZWNAMTcuNS4wYCB0aGUgcXVlc3Rpb24gbm8gbG9uZ2VyIGFyaXNlcyBmb3IgdGhpc1xuICogICAgIGZvbGRlcjogYSBkYXRhc2V0LWJvdW5kIHdpZGdldCdzIGBjaGFydENvbmZpZ2AgcmVmdXNlcyBgdHlwZWAsIGB4QXhpc2AsXG4gKiAgICAgYHlBeGlzYCBhbmQgYHNlcmllc2AgKEFEUi0wMDIxIFx1MDBCNyBBRFItMDA0OSBEMikgXHUyMDE0IHRoZSB3aWRnZXQncyBgdHlwZWAsXG4gKiAgICAgYGRpbWVuc2lvbnNgIGFuZCBgdmFsdWVzYCBhcmUgdGhlIG9ubHkgYmluZGluZyBcdTIwMTQgc28gbm8gd2lkZ2V0IGhlcmVcbiAqICAgICBjYXJyaWVzIGFuIGF4aXMgdGl0bGUgYW55IG1vcmUuXG4gKlxuICogXHUyNkEwXHVGRTBGIGBHbG9iYWxGaWx0ZXJTY2hlbWEub2JqZWN0YCBcdTIwMTQgZG9jdW1lbnRlZCB1cHN0cmVhbSBhcyByZXNvbHZpbmcgYVxuICogZmlsdGVyJ3MgZmllbGQgYW5kIG9wdGlvbiBsYWJlbHMgdGhyb3VnaCBgZmllbGRzLjxvYmplY3Q+LjxmaWVsZD5gIFx1MjAxNCBpc1xuICogSU5FUlQgaW4gdGhpcyBDb25zb2xlIGJ1aWxkLiBNZWFzdXJlZDogYSBmaWx0ZXIgY2FycnlpbmcgYG9iamVjdGAgYW5kIG5vXG4gKiBgbGFiZWxgIHJlbmRlcmVkIHRoZSByYXcgZmllbGQgbmFtZSAoYHR5cGVgLCBub3QgXHU3QzdCXHU1NzhCKSBhbmQgbGVmdCBpdHMgb3B0aW9uXG4gKiBsYWJlbHMgRW5nbGlzaC4gVGhlIGRlZmluaXRpb24gYnVpbGRlciBuZXZlciBjb3BpZXMgYG9iamVjdGAgb3V0IG9mIHRoZVxuICogYXV0aG9yZWQgZmlsdGVyLiBcdTI2RDQgRG8gbm90IHJlYWNoIGZvciBpdCBpbnN0ZWFkIG9mIGFuIGlubGluZSBtYXAuXG4gKi9cblxuZXhwb3J0IHsgQWN0aXZpdHlEYXNoYm9hcmQgfSBmcm9tICcuL2FjdGl2aXR5LmRhc2hib2FyZCc7XG5leHBvcnQgeyBDcm1PdmVydmlld0Rhc2hib2FyZCB9IGZyb20gJy4vY3JtLmRhc2hib2FyZCc7XG5leHBvcnQgeyBFeGVjdXRpdmVEYXNoYm9hcmQgfSBmcm9tICcuL2V4ZWN1dGl2ZS5kYXNoYm9hcmQnO1xuZXhwb3J0IHsgU2FsZXNEYXNoYm9hcmQgfSBmcm9tICcuL3NhbGVzLmRhc2hib2FyZCc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXNoYm9hcmRzL2FjdGl2aXR5LmRhc2hib2FyZC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXNoYm9hcmRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Rhc2hib2FyZHMvYWN0aXZpdHkuZGFzaGJvYXJkLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IERhc2hib2FyZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBTYWxlcyBBY3Rpdml0eSAmIEN1c3RvbWVyIEhlYWx0aCBEYXNoYm9hcmQgKCM1OTIpLlxuICpcbiAqIFRoZSBhcHAgaGFkICoqbm8gYWN0aXZpdHkgbWV0cmljIG9mIGFueSBraW5kKio6IGNhbGxzIHBlciByZXAsIG1lZXRpbmdzXG4gKiBib29rZWQgYW5kIGFjdGl2aXR5IHBlciBkZWFsIHdlcmUgdW5hbnN3ZXJhYmxlIGJlY2F1c2UgdGhlIG9ubHkgdHJhY2Ugb2YgYW5cbiAqIGludGVyYWN0aW9uIHdhcyBhIGBzeXNfYWN0aXZpdHlgIHJvdyB3aXRoIHRoZSBpbnRlcmVzdGluZyBwYXJ0IGluc2lkZSBhIEpTT05cbiAqIHN0cmluZywgYW5kIGB0YXNrX21ldHJpY3NgIGhhZCBzaGlwcGVkIHdpdGggbm8gd2lkZ2V0IHVzaW5nIGl0IGF0IGFsbC4gVGhpc1xuICogZGFzaGJvYXJkIGlzIHdoYXQgYGNybV9ldmVudGAgbWFrZXMgcG9zc2libGUsIGFuZCBpdCBpcyB3aGVyZSB0aGUgY2h1cm4gc3RvcnlcbiAqIGZpbmFsbHkgaGFzIG51bWJlcnMgYmVoaW5kIGl0LlxuICpcbiAqICMgTm8gYGRhdGVSYW5nZWAsIGRlbGliZXJhdGVseSBcdTIwMTQgYSBkZXNpZ24gY2hvaWNlLCBub3QgYSBibG9ja2VkIG9uZVxuICpcbiAqIGBjcm1fZXZlbnQuc3RhcnRfZGF0ZXRpbWVgIGlzIGEgYEZpZWxkLmRhdGV0aW1lKClgLCB0aGUgZXhhY3QgY29sdW1uIHNoYXBlXG4gKiB0aGF0IG9uY2UgemVyb2VkIHRoZSBTZXJ2aWNlIGRhc2hib2FyZCAoIzQ2MCk6IGBkcml2ZXItc3FsYCAxNi4xLjAgY29lcmNlZCBhXG4gKiBkYXRldGltZSBmaWx0ZXIgYm91bmQgdG8gZXBvY2gtbWlsbGlzZWNvbmQgSU5URUdFUiB3aGlsZSBldmVyeSBkYXRldGltZSBpblxuICogdGhlIGRhdGFiYXNlIGlzIElTTyBURVhULCBhbmQgU1FMaXRlIG9yZGVycyBldmVyeSBJTlRFR0VSIGJlZm9yZSBldmVyeSBURVhUIFx1MjAxNFxuICogc28gYCRndGVgIG1hdGNoZWQgZXZlcnkgcm93IChubyBmbG9vcikgYW5kIGAkbHRlYCBtYXRjaGVkIG5vbmUgKGVtcHR5XG4gKiBkYXNoYm9hcmQpLiBUaGF0IGlzIGhpc3RvcnksIG5vdCBhIGxpdmUgY29uc3RyYWludC4gQm90aCBuYW1lZCBwcmVjb25kaXRpb25zXG4gKiBhcmUgZml4ZWQgYW5kIHJlbGVhc2VkOiBvYmplY3RzdGFjayMzOTEyICh0aGUgY29lcmNpb24pIGFuZCBvYmplY3RzdGFjayMzNzc3XG4gKiAoYSBiYXJlLWRhdGUgYCRsdGVgIGRyb3BwaW5nIHNhbWUtZGF5IHJvd3MpIFx1MjAxNCBib3RoIHVuZGVyIHRoZSAqKjE3LjAuMCoqXG4gKiBoZWFkaW5nIG9mIHRoZSBpbnN0YWxsZWQgYGRyaXZlci1zcWxgIGFuZCBgc2VydmljZS1hbmFseXRpY3NgIENIQU5HRUxPR3MsXG4gKiBhbmQgZXZlcnkgcGluIHNpbmNlIDE3LjAuMCBjYXJyaWVzIGJvdGguIGBzZXJ2aWNlLmRhc2hib2FyZC50c2AgcmVjb3Jkc1xuICogdGhlIHNhbWUgdHdvXG4gKiBjbG9zdXJlcywgd2hpY2ggaXMgd2h5ICMxMTU3IHJlc3RvcmVkIHRoZSBTZXJ2aWNlIHBpY2tlcjsgdGhlIHR3byBmaWxlc1xuICogYWdyZWUsIGFuZCBuZWl0aGVyIHN0YXRlcyBhbiB1cHN0cmVhbSBmaXggYXMgYW4gdW5tZXQgcHJlY29uZGl0aW9uLlxuICpcbiAqIFRoZSByZWFzb24gdGhpcyBkYXNoYm9hcmQgc3RpbGwgY2FycmllcyBubyBwaWNrZXIgaXMgdGhlcmVmb3JlIGEgUFJPRFVDVFxuICogb25lLCBhbmQgaXQgc3RhbmRzIG9uIGl0cyBvd246IGJvdGggcXVlc3Rpb25zIGEgZGF0ZSByYW5nZSB3b3VsZCBhbnN3ZXIgYXJlXG4gKiBhbHJlYWR5IGFuc3dlcmVkIGhlcmUsIGJ5IHdpZGdldHMgYSBkYXNoYm9hcmQgcmFuZ2Ugd291bGQgbmFycm93IHJhdGhlciB0aGFuXG4gKiBzZXJ2ZSBcdTIwMTQgdGhlIHJ1bnRpbWUgQU5EcyBgZGF0ZVJhbmdlYCBpbnRvIGV2ZXJ5IHdpZGdldCBxdWVyeS5cbiAqXG4gKiAgIC0gVGhlIHRyZW5kIGlzIG9uIGFuIEFYSVMsIG5vdCBpbiBhIGZpbHRlci4gYGFjdGl2aXR5X2J5X3dlZWtgIGdyb3VwcyBvblxuICogICAgIHRoZSBgZXZlbnRfbWV0cmljcy5zdGFydF9kYXRldGltZWAgZGltZW5zaW9uLCB3aGljaCBkZWNsYXJlc1xuICogICAgIGBkYXRlR3JhbnVsYXJpdHk6ICd3ZWVrJ2A7IFwiaXMgdGhlIHRlYW0gc3BlZWRpbmcgdXAgb3IgZ29pbmcgcXVpZXQ/XCIgaXNcbiAqICAgICByZWFkIEFDUk9TUyB0aGUgaGlzdG9yeSwgc28gYSBwaWNrZXIgd291bGQgdHJ1bmNhdGUgdGhlIGF4aXMgdGhhdCBpcyB0aGVcbiAqICAgICB3aG9sZSBwb2ludCBvZiB0aGUgY2hhcnQuXG4gKiAgIC0gUmVjZW5jeSBpcyBhbHJlYWR5IFNFTEYtU0NPUEVELiBUaGUgdGhyZWUgcXVpZXQtYWNjb3VudCB0aWxlcyBlYWNoIGNhcnJ5XG4gKiAgICAgdGhlaXIgb3duIHdpbmRvdyBvbiBgY3JtX2FjY291bnQubGFzdF9hY3Rpdml0eV9kYXRlYCBcdTIwMTQgYCRsdGBcbiAqICAgICBgezMwX2RheXNfYWdvfWAgLyBgezYwX2RheXNfYWdvfWAgLyBgezkwX2RheXNfYWdvfWAgXHUyMDE0IGFuZCBcInF1aWV0IGZvciA5MFxuICogICAgIGRheXNcIiBtZWFucyBuaW5ldHkgZGF5cywgbm90IG5pbmV0eSBkYXlzIHJlLWN1dCBieSB3aGF0ZXZlciB0aGUgcGlja2VyXG4gKiAgICAgc2F5cy4gT24gdGhlIHNpYmxpbmcgZGFzaGJvYXJkcyB0aGF0IERPIGhhdmUgb25lLCB0aGF0IGlzIHNwZWxsZWRcbiAqICAgICBgZmlsdGVyQmluZGluZ3M6IHsgZGF0ZVJhbmdlOiBmYWxzZSB9YDsgaGVyZSBpdCB3b3VsZCBoYXZlIHRvIGJlIHNwZWxsZWRcbiAqICAgICBvbiBldmVyeSB0aWxlIHRoYXQgbWF0dGVycy5cbiAqXG4gKiBcdTIxRDIgQWRkaW5nIGEgcGlja2VyIGlzIGEgcHJvZHVjdCBqdWRnZW1lbnQgdG8gYmUgbWFkZSBvbiBpdHMgbWVyaXRzLCBub3QgYVxuICogcGxhdGZvcm0gdW5ibG9jayB0byBiZSBjb2xsZWN0ZWQuIElmIGl0IGlzIGV2ZXIgbWFkZSwgdGhlIHdvcmsgaXMgYVxuICogYGRhdGVSYW5nZWAgcGx1cyBleHBsaWNpdCBgZmlsdGVyQmluZGluZ3NgIG9wdC1vdXRzIG9uIHRoZSB3aWRnZXRzIGFib3ZlLlxuICpcbiAqIE5vIEtQSSB0aWxlIGRlY2xhcmVzIGEgYHRyZW5kYDogYSBwZXJpb2Qtb3Zlci1wZXJpb2QgZGVsdGEgaXMgYSBtZWFzdXJlbWVudFxuICogYW5kIGhhcyB0byBjb21lIGZyb20gYSByZWFsIGNvbXBhcmlzb24gcXVlcnksIG5vdCBmcm9tIGEgbnVtYmVyIHR5cGVkIGJ5XG4gKiBoYW5kICgjNTAwLCAjNTg3KS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFjdGl2aXR5RGFzaGJvYXJkOiBEYXNoYm9hcmQgPSB7XG4gIG5hbWU6ICdzYWxlc19hY3Rpdml0eV9kYXNoYm9hcmQnLFxuICBsYWJlbDogJ1NhbGVzIEFjdGl2aXR5JyxcbiAgZGVzY3JpcHRpb246ICdXaG8gaXMgdGFsa2luZyB0byBjdXN0b21lcnMsIGhvdyBvZnRlbiwgYW5kIHdoaWNoIGFjY291bnRzIGhhdmUgZ29uZSBxdWlldCcsXG5cbiAgY29sdW1uczogMTIsXG4gIGdhcDogNCxcbiAgcmVmcmVzaEludGVydmFsU2Vjb25kczogMzAwLFxuXG4gIGhlYWRlcjoge1xuICAgIHNob3dUaXRsZTogdHJ1ZSxcbiAgICBzaG93RGVzY3JpcHRpb246IHRydWUsXG4gIH0sXG5cbiAgZ2xvYmFsRmlsdGVyczogW1xuICAgIHtcbiAgICAgIGZpZWxkOiAnb3duZXJfaWQnLFxuICAgICAgbGFiZWw6IHsgZW46ICdSZXAnLCAnemgtQ04nOiAnXHU5NTAwXHU1NTJFXHU0RUUzXHU4ODY4JywgJ2VzLUVTJzogJ1JlcHJlc2VudGFudGUnLCAnamEtSlAnOiAnXHU2MkM1XHU1RjUzXHU4MDA1JyB9LFxuICAgICAgdHlwZTogJ2xvb2t1cCcsXG4gICAgICBzY29wZTogJ2Rhc2hib2FyZCcsXG4gICAgICBvcHRpb25zRnJvbTogeyBvYmplY3Q6ICdzeXNfdXNlcicsIHZhbHVlRmllbGQ6ICdpZCcsIGxhYmVsRmllbGQ6ICduYW1lJyB9LFxuICAgIH0sXG4gIF0sXG5cbiAgd2lkZ2V0czogW1xuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSb3cgMTogd2hhdCBoYXBwZW5lZCwgYW5kIHdoYXQgaXMgYm9va2VkIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGlkOiAnaW50ZXJhY3Rpb25zX2hlbGQnLFxuICAgICAgdGl0bGU6ICdJbnRlcmFjdGlvbnMgTG9nZ2VkJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2FsbHMgYW5kIG1lZXRpbmdzIHRoYXQgYWN0dWFsbHkgaGFwcGVuZWQnLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgc3RhdHVzOiAnaGVsZCcgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ3N1Y2Nlc3MnLFxuICAgICAgZGF0YXNldDogJ2V2ZW50X21ldHJpY3MnLCB2YWx1ZXM6IFsnZXZlbnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAwLCB3OiAzLCBoOiAyIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ21lZXRpbmdzX2Jvb2tlZCcsXG4gICAgICB0aXRsZTogJ01lZXRpbmdzIEJvb2tlZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ01lZXRpbmdzIG9uIHRoZSBjYWxlbmRhciB0aGF0IGhhdmUgbm90IGhhcHBlbmVkIHlldCcsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGZpbHRlcjogeyBzdGF0dXM6ICdwbGFubmVkJywgdHlwZTogJ21lZXRpbmcnIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdibHVlJyxcbiAgICAgIGRhdGFzZXQ6ICdldmVudF9tZXRyaWNzJywgdmFsdWVzOiBbJ2V2ZW50X2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMywgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdjdXN0b21lcl9taW51dGVzJyxcbiAgICAgIHRpdGxlOiAnQ3VzdG9tZXIgTWludXRlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIHRpbWUgc3BlbnQgaW4gZnJvbnQgb2YgY3VzdG9tZXJzJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IHN0YXR1czogJ2hlbGQnIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdwdXJwbGUnLFxuICAgICAgZGF0YXNldDogJ2V2ZW50X21ldHJpY3MnLCB2YWx1ZXM6IFsndG90YWxfbWludXRlcyddLFxuICAgICAgbGF5b3V0OiB7IHg6IDYsIHk6IDAsIHc6IDMsIGg6IDIgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEZpcnN0IHdpZGdldCBpbiB0aGUgYXBwIHRvIHVzZSBgdGFza19tZXRyaWNzYC4gVGhlIGRhdGFzZXQgc2hpcHBlZCB3aXRoXG4gICAgICAvLyB0aGUgXCJNeSBEYXlcIiB3b3JrIGFuZCB0aGVuIGhhZCBubyBjb25zdW1lciBhdCBhbGwgKCM1OTIpIFx1MjAxNCBhIHNlbWFudGljXG4gICAgICAvLyBsYXllciBub2JvZHkgcXVlcmllcyBpcyBhIG1haW50ZW5hbmNlIGNvc3Qgd2l0aCBubyByZWFkZXIuXG4gICAgICBpZDogJ3Rhc2tzX2NvbXBsZXRlZCcsXG4gICAgICB0aXRsZTogJ1Rhc2tzIENvbXBsZXRlZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ZvbGxvdy11cHMgY2xvc2VkIG91dCBcdTIwMTQgdGhlIG90aGVyIGhhbGYgb2YgYWN0aXZpdHknLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgaXNfY29tcGxldGVkOiB0cnVlIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdvcmFuZ2UnLFxuICAgICAgZGF0YXNldDogJ3Rhc2tfbWV0cmljcycsIHZhbHVlczogWyd0YXNrX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogOSwgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgUm93IDI6IHdobywgYW5kIHdoZW4gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgaWQ6ICdhY3Rpdml0eV9ieV9yZXAnLFxuICAgICAgdGl0bGU6ICdBY3Rpdml0eSBieSBSZXAnLFxuICAgICAgZGVzY3JpcHRpb246ICdMb2dnZWQgaW50ZXJhY3Rpb25zIHBlciBvd25lciBcdTIwMTQgdGhlIGNvdmVyYWdlIHF1ZXN0aW9uJyxcbiAgICAgIHR5cGU6ICdiYXInLFxuICAgICAgZmlsdGVyOiB7IHN0YXR1czogJ2hlbGQnIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdzdWNjZXNzJyxcbiAgICAgIGRhdGFzZXQ6ICdldmVudF9tZXRyaWNzJywgZGltZW5zaW9uczogWydvd25lciddLCB2YWx1ZXM6IFsnZXZlbnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAyLCB3OiA2LCBoOiA0IH0sXG4gICAgICBjaGFydENvbmZpZzoge1xuICAgICAgICBzaG93TGVnZW5kOiBmYWxzZSxcbiAgICAgICAgc2hvd0RhdGFMYWJlbHM6IHRydWUsXG4gICAgICAgIGNvbG9yczogWycjMTBCOTgxJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdhY3Rpdml0eV9ieV93ZWVrJyxcbiAgICAgIHRpdGxlOiAnQWN0aXZpdHkgVm9sdW1lIGJ5IFdlZWsnLFxuICAgICAgZGVzY3JpcHRpb246ICdJbnRlcmFjdGlvbnMgcGVyIHdlZWsgXHUyMDE0IGlzIHRoZSB0ZWFtIHNwZWVkaW5nIHVwIG9yIGdvaW5nIHF1aWV0PycsXG4gICAgICB0eXBlOiAnYXJlYScsXG4gICAgICBmaWx0ZXI6IHsgc3RhdHVzOiAnaGVsZCcgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgLy8gVGhlIHdlZWsgYnVja2V0IGxpdmVzIG9uIHRoZSBESU1FTlNJT04sIG5vdCBpbiBhIGZpbHRlciBcdTIwMTQgc2VlIHRoZVxuICAgICAgLy8gaGVhZGVyIG5vdGUgb24gd2h5IHRoZSB0cmVuZCBiZWxvbmdzIG9uIGFuIGF4aXMgaGVyZS4gVGhlIGRhdGV0aW1lXG4gICAgICAvLyBmaWx0ZXIgYm91bmQgaXRzZWxmIHdvcmtzIChvYmplY3RzdGFjayMzOTEyIC8gIzM3NzcsIDE3LjAuMCk7IHB1dHRpbmdcbiAgICAgIC8vIHRoZSB0cmVuZCBpbiBhIGZpbHRlciB3b3VsZCBuYXJyb3cgaXQsIHdoaWNoIGlzIGEgZGlmZmVyZW50IG9iamVjdGlvbi5cbiAgICAgIGRhdGFzZXQ6ICdldmVudF9tZXRyaWNzJywgZGltZW5zaW9uczogWydzdGFydF9kYXRldGltZSddLCB2YWx1ZXM6IFsnZXZlbnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiA2LCB5OiAyLCB3OiA2LCBoOiA0IH0sXG4gICAgICBjaGFydENvbmZpZzoge1xuICAgICAgICBzaG93TGVnZW5kOiBmYWxzZSxcbiAgICAgICAgc2hvd0RhdGFMYWJlbHM6IGZhbHNlLFxuICAgICAgICBjb2xvcnM6IFsnIzBFQTVFOSddLFxuICAgICAgICBpbnRlcmFjdGlvbjogeyB0b29sdGlwczogdHJ1ZSwgYnJ1c2g6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSb3cgMzogd2hhdCB0aGUgYWN0aXZpdHkgaXMgYWJvdXQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgaWQ6ICdhY3Rpdml0eV9taXgnLFxuICAgICAgdGl0bGU6ICdBY3Rpdml0eSBNaXgnLFxuICAgICAgZGVzY3JpcHRpb246ICdDYWxscyB2cyBtZWV0aW5ncyB2cyBkZW1vcycsXG4gICAgICB0eXBlOiAnZG9udXQnLFxuICAgICAgZmlsdGVyOiB7IHN0YXR1czogJ2hlbGQnIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdwdXJwbGUnLFxuICAgICAgZGF0YXNldDogJ2V2ZW50X21ldHJpY3MnLCBkaW1lbnNpb25zOiBbJ3R5cGUnXSwgdmFsdWVzOiBbJ2V2ZW50X2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMCwgeTogNiwgdzogNCwgaDogNCB9LFxuICAgICAgY2hhcnRDb25maWc6IHtcbiAgICAgICAgc2hvd0xlZ2VuZDogdHJ1ZSxcbiAgICAgICAgc2hvd0RhdGFMYWJlbHM6IHRydWUsXG4gICAgICAgIGNvbG9yczogWycjNDE2OUUxJywgJyMxMEI5ODEnLCAnIzhCNUNGNicsICcjRjU5RTBCJywgJyMwRUE1RTknLCAnIzk0QTNCOCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnYWN0aXZpdHlfYnlfcmVjb3JkX3R5cGUnLFxuICAgICAgdGl0bGU6ICdXaGVyZSB0aGUgQWN0aXZpdHkgTGFuZHMnLFxuICAgICAgZGVzY3JpcHRpb246ICdXaGljaCBwYXJ0IG9mIHRoZSBmdW5uZWwgaXMgZ2V0dGluZyBhdHRlbnRpb24nLFxuICAgICAgdHlwZTogJ2JhcicsXG4gICAgICBmaWx0ZXI6IHsgc3RhdHVzOiAnaGVsZCcgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgZGF0YXNldDogJ2V2ZW50X21ldHJpY3MnLCBkaW1lbnNpb25zOiBbJ3JlbGF0ZWRfdG9fdHlwZSddLCB2YWx1ZXM6IFsnZXZlbnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiA0LCB5OiA2LCB3OiA0LCBoOiA0IH0sXG4gICAgICBjaGFydENvbmZpZzoge1xuICAgICAgICBzaG93TGVnZW5kOiBmYWxzZSxcbiAgICAgICAgc2hvd0RhdGFMYWJlbHM6IHRydWUsXG4gICAgICAgIGNvbG9yczogWycjNDE2OUUxJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gXCJBY3Rpdml0eSBwZXIgb3BlbiBkZWFsXCIgYXMgdHdvIGhvbmVzdCBudW1iZXJzIHJhdGhlciB0aGFuIG9uZVxuICAgICAgLy8gZmFicmljYXRlZCByYXRpbzogdGhlIHNlbWFudGljIGxheWVyIGhhcyBubyBjcm9zcy1kYXRhc2V0IGNhbGN1bGF0ZWRcbiAgICAgIC8vIG1lYXN1cmUsIHNvIGEgc2luZ2xlIFwiMS44IGFjdGl2aXRpZXMvZGVhbFwiIHRpbGUgd291bGQgaGF2ZSB0byBiZVxuICAgICAgLy8gY29tcHV0ZWQgYnkgdGhlIHJlbmRlcmVyIG92ZXIgdHdvIGluZGVwZW5kZW50IHF1ZXJpZXMgXHUyMDE0IHdoaWNoIG5vdGhpbmdcbiAgICAgIC8vIGRvZXMgdG9kYXkuIEEgbWFuYWdlciByZWFkcyB0aGUgcGFpcjsgYSBtYWRlLXVwIHF1b3RpZW50IHdvdWxkIHJlYWQgYXNcbiAgICAgIC8vIG1lYXN1cmVkLiBGaWxlZCBhcyBhIGZvbGxvdy11cCByYXRoZXIgdGhhbiBmYWtlZCBoZXJlLlxuICAgICAgaWQ6ICdkZWFsX2FjdGl2aXR5JyxcbiAgICAgIHRpdGxlOiAnSW50ZXJhY3Rpb25zIG9uIERlYWxzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTG9nZ2VkIGludGVyYWN0aW9ucyBsaW5rZWQgdG8gYW4gb3Bwb3J0dW5pdHkgXHUyMDE0IHJlYWQgYWdhaW5zdCBPcGVuIERlYWxzIFx1MjE5MicsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGZpbHRlcjogeyBzdGF0dXM6ICdoZWxkJywgcmVsYXRlZF90b190eXBlOiAnY3JtX29wcG9ydHVuaXR5JyB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnc3VjY2VzcycsXG4gICAgICBkYXRhc2V0OiAnZXZlbnRfbWV0cmljcycsIHZhbHVlczogWydldmVudF9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDgsIHk6IDYsIHc6IDIsIGg6IDQgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnb3Blbl9kZWFsc19mb3JfYWN0aXZpdHknLFxuICAgICAgdGl0bGU6ICdPcGVuIERlYWxzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3Bwb3J0dW5pdGllcyBzdGlsbCBpbiBwbGF5JyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiB7ICRuaW46IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0gfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsnb3BwX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMTAsIHk6IDYsIHc6IDIsIGg6IDQgfSxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyA0OiB0aGUgY2h1cm4gc3RvcnksIG5vdyBiYWNrZWQgYnkgYSByZWFsIHNpZ25hbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvLyBUaGVzZSB3aW5kb3cgYGNybV9hY2NvdW50Lmxhc3RfYWN0aXZpdHlfZGF0ZWAsIHdoaWNoIGlzIGEgYEZpZWxkLmRhdGUoKWBcbiAgICAvLyAoVEVYVCBgWVlZWS1NTS1ERGApIFx1MjAxNCB0aGUgc2FtZSBzaGFwZSBgY3VzdG9tZXJfY2h1cm5fc2lnbmFsc2AgYWxyZWFkeVxuICAgIC8vIGZpbHRlcnMgc2FmZWx5LiBVbnRpbCAjNTkyIHRoZSBjb2x1bW4gd2FzIHdyaXR0ZW4gYnkgbm90aGluZyBhdCBhbGw6IHRoZVxuICAgIC8vIGJ1YmJsZSB0aGF0IGZlZCBpdCB3YXMgc2lsZW50bHkgZGlzY2FyZGVkIG9uIGV2ZXJ5IGludm9jYXRpb24gYmVjYXVzZVxuICAgIC8vIHRoZSBmaWVsZCB3YXMgYHJlYWRvbmx5YCAoIzI5NDgpLiBUaGVzZSB0aHJlZSB0aWxlcyBhcmUgdGhlIHJlYXNvbiB0aGF0XG4gICAgLy8gbWF0dGVyZWQuXG4gICAge1xuICAgICAgaWQ6ICdxdWlldF9hY2NvdW50c18zMCcsXG4gICAgICB0aXRsZTogJ1F1aWV0IDMwKyBEYXlzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQWN0aXZlIGFjY291bnRzIHdpdGggbm8gbG9nZ2VkIGludGVyYWN0aW9uIGluIGEgbW9udGgnLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgaXNfYWN0aXZlOiB0cnVlLCBsYXN0X2FjdGl2aXR5X2RhdGU6IHsgJGx0OiAnezMwX2RheXNfYWdvfScgfSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnd2FybmluZycsXG4gICAgICBkYXRhc2V0OiAnYWNjb3VudF9tZXRyaWNzJywgdmFsdWVzOiBbJ2FjY291bnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAxMCwgdzogNCwgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdxdWlldF9hY2NvdW50c182MCcsXG4gICAgICB0aXRsZTogJ1F1aWV0IDYwKyBEYXlzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVHdvIG1vbnRocyBvZiBzaWxlbmNlIFx1MjAxNCB0aGUgYXQtcmlzayB0aHJlc2hvbGQnLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgaXNfYWN0aXZlOiB0cnVlLCBsYXN0X2FjdGl2aXR5X2RhdGU6IHsgJGx0OiAnezYwX2RheXNfYWdvfScgfSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnb3JhbmdlJyxcbiAgICAgIGRhdGFzZXQ6ICdhY2NvdW50X21ldHJpY3MnLCB2YWx1ZXM6IFsnYWNjb3VudF9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDQsIHk6IDEwLCB3OiA0LCBoOiAyIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ3F1aWV0X2FjY291bnRzXzkwJyxcbiAgICAgIHRpdGxlOiAnUXVpZXQgOTArIERheXMnLFxuICAgICAgZGVzY3JpcHRpb246ICdBIHF1YXJ0ZXIgd2l0aCBubyBjb250YWN0IFx1MjAxNCBpbnRlcnZlbmUgb3Igd3JpdGUgaXQgb2ZmJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IGlzX2FjdGl2ZTogdHJ1ZSwgbGFzdF9hY3Rpdml0eV9kYXRlOiB7ICRsdDogJ3s5MF9kYXlzX2Fnb30nIH0gfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2RhbmdlcicsXG4gICAgICBkYXRhc2V0OiAnYWNjb3VudF9tZXRyaWNzJywgdmFsdWVzOiBbJ2FjY291bnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiA4LCB5OiAxMCwgdzogNCwgaDogMiB9LFxuICAgIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGFzaGJvYXJkcy9zaGFyZWQtd2lkZ2V0cy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXNoYm9hcmRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Rhc2hib2FyZHMvc2hhcmVkLXdpZGdldHMudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRGFzaGJvYXJkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG50eXBlIFdpZGdldCA9IERhc2hib2FyZFsnd2lkZ2V0cyddW251bWJlcl07XG50eXBlIFdpZGdldExheW91dCA9IFdpZGdldFsnbGF5b3V0J107XG5cbi8qKlxuICogV2lkZ2V0cyBzaGFyZWQgdmVyYmF0aW0gYWNyb3NzIGRhc2hib2FyZHMuXG4gKlxuICogVGhlIHBpcGVsaW5lIGZ1bm5lbCBhcHBlYXJlZCB3b3JkLWZvci13b3JkIGluIHRoZSBDUk0sIFNhbGVzIGFuZCBFeGVjdXRpdmVcbiAqIGRhc2hib2FyZHMsIGFuZCB0aGUgYXZnLWRlYWwtc2l6ZSBLUEkgaW4gQ1JNIGFuZCBTYWxlcyBcdTIwMTQgdGhyZWUgY29waWVzIG9mXG4gKiBcIndoYXQgY291bnRzIGFzIG9wZW4gcGlwZWxpbmVcIiB0aGF0IGNvdWxkIChhbmQgZGlkKSBkcmlmdCBpbmRlcGVuZGVudGx5LlxuICogRWFjaCBmYWN0b3J5IG93bnMgdGhlIHNlbWFudGljIGRlZmluaXRpb24gb25jZTsgY2FsbGVycyBwb3NpdGlvbiBpdCB3aXRoXG4gKiBgbGF5b3V0YCBhbmQgbWF5IG5hcnJvdyBwcmVzZW50YXRpb24tb25seSBkZXRhaWxzIHZpYSBgb3ZlcnJpZGVzYC5cbiAqL1xuXG4vKipcbiAqIE9wZW4tcGlwZWxpbmUgZnVubmVsIGJ5IHNhbGVzIHN0YWdlIFx1MjAxNCBpZGVudGljYWwgc2VtYW50aWNzIGV2ZXJ5d2hlcmUuXG4gKlxuICogTm8gYGNoYXJ0Q29uZmlnYDogYSBkYXRhc2V0LWJvdW5kIHdpZGdldCBpcyBwYWludGVkIHdpdGggdGhlIGNvbnNvbGUncyBvd25cbiAqIHRoZW1lIHRva2Vucywgc28gdGhlIHBhbGV0dGUgdGhpcyBmYWN0b3J5IHVzZWQgdG8gZGVjbGFyZSBuZXZlciBhcHBsaWVkLlxuICogVmVyaWZpZWQgaW4gdGhlIGJyb3dzZXIgYWdhaW5zdCAxNi4xLjAgXHUyMDE0IGV2ZXJ5IGZpbGwgaW4gdGhlIHJlbmRlcmVkIGZ1bm5lbCBpc1xuICogYGhzbCh2YXIoLS1jaGFydC0xKSlgIFx1MjAyNiBgaHNsKHZhcigtLWNoYXJ0LTUpKWAsIGFuZCBub25lIG9mIHRoZSBmaXZlIGhleCBjb2xvcnNcbiAqIChgIzBFQTVFOWAgXHUyMDI2IGAjMjJDNTVFYCkgcmVhY2hlcyB0aGUgRE9NLiBLZWVwaW5nIHRoZSBibG9jayB3b3VsZCBsZWF2ZVxuICogZGVjb3JhdGlvbiB0aGF0IHJlYWRzIGFzIGlmIGl0IHdlcmUgaW4gZWZmZWN0ICgjNTAwKS5cbiAqXG4gKiBObyBgY29sb3JWYXJpYW50YCBlaXRoZXIsIG9uIHRoZSBzYW1lIGV2aWRlbmNlOiB0aGUgZXhlY3V0aXZlIGRhc2hib2FyZCdzIEtQSVxuICogdGlsZXMgZGVjbGFyZSBmb3VyIGRpZmZlcmVudCB2YXJpYW50cyAoYHN1Y2Nlc3NgLCBgYmx1ZWAsIGBwdXJwbGVgLCBgb3JhbmdlYClcbiAqIGFuZCByZW5kZXIgd2l0aCBieXRlLWlkZW50aWNhbCBiYWNrZ3JvdW5kLCBib3JkZXIgYW5kIHZhbHVlIGNvbG91cnMuXG4gKi9cbmV4cG9ydCBjb25zdCBwaXBlbGluZUJ5U3RhZ2VGdW5uZWxXaWRnZXQgPSAobGF5b3V0OiBXaWRnZXRMYXlvdXQpOiBXaWRnZXQgPT4gKHtcbiAgaWQ6ICdwaXBlbGluZV9ieV9zdGFnZScsXG4gIHRpdGxlOiAnUGlwZWxpbmUgYnkgU3RhZ2UnLFxuICBkZXNjcmlwdGlvbjogJ09wZW4gb3Bwb3J0dW5pdHkgdmFsdWUgYXQgZWFjaCBzYWxlcyBzdGFnZScsXG4gIHR5cGU6ICdmdW5uZWwnLFxuICBmaWx0ZXI6IHsgc3RhZ2U6IHsgJG5pbjogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfSB9LFxuICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnc3RhZ2UnXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICBsYXlvdXQsXG4gIHN1cHByZXNzV2FybmluZ3M6IFsnY2hhcnQtY29uZmlnLW1pc3NpbmcnXSwgLy8gaW50ZW50aW9uYWwgZGVmYXVsdCByZW5kZXJpbmdcbn0pO1xuXG4vKipcbiAqIEF2Zy1kZWFsLXNpemUgS1BJIG92ZXIgY2xvc2VkLXdvbiBkZWFscy4gVGhlIG1lYXN1cmUgaXMgZml4ZWQ7IHRoZSB0aW1lXG4gKiBzY29waW5nIGxlZ2l0aW1hdGVseSBkaWZmZXJzIHBlciBkYXNoYm9hcmQgKENSTSBmb2xsb3dzIHRoZSBkYXNoYm9hcmQgZGF0ZVxuICogcGlja2VyLCBTYWxlcyBwaW5zIGl0c2VsZiB0byBRVEQpLCBzbyBjYWxsZXJzIHBhc3MgaXQgaW4uXG4gKlxuICogTm8gZHJpbGwtdGhyb3VnaDogYC9yZXBvcnRzL2F2Zy1kZWFsLXNpemVgIG1hdGNoZWQgbm8gcmVnaXN0ZXJlZCByZXBvcnQsIGFuZFxuICogbm8gcmVwb3J0IGNvdmVycyBhdmVyYWdlIGRlYWwgc2l6ZSwgc28gdGhlIGJ1dHRvbiB3YXMgZGVhZCBvbiBldmVyeSBkYXNoYm9hcmRcbiAqIHRoYXQgdXNlZCB0aGlzIGZhY3RvcnkgKCM1MjcpLiBSZS1hZGQgb25lIGhlcmUgd2hlbiBzdWNoIGEgcmVwb3J0IHNoaXBzIFx1MjAxNFxuICogc2hhcmluZyB0aGUgd2lkZ2V0IG1lYW5zIHNoYXJpbmcgdGhlIGZpeC5cbiAqL1xuZXhwb3J0IGNvbnN0IGF2Z0RlYWxTaXplTWV0cmljV2lkZ2V0ID0gKFxuICBsYXlvdXQ6IFdpZGdldExheW91dCxcbiAgb3ZlcnJpZGVzOiBQYXJ0aWFsPFdpZGdldD4gPSB7fSxcbik6IFdpZGdldCA9PiAoe1xuICBpZDogJ2F2Z19kZWFsX3NpemUnLFxuICB0aXRsZTogJ0F2ZyBEZWFsIFNpemUnLFxuICBkZXNjcmlwdGlvbjogJ0F2ZXJhZ2UgdmFsdWUgb2YgY2xvc2VkLXdvbiBkZWFscycsXG4gIHR5cGU6ICdtZXRyaWMnLFxuICBmaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfd29uJyB9LFxuICBjb2xvclZhcmlhbnQ6ICdvcmFuZ2UnLFxuICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIHZhbHVlczogWydhdmdfYW1vdW50J10sXG4gIGxheW91dCxcbiAgLi4ub3ZlcnJpZGVzLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXNoYm9hcmRzL2NybS5kYXNoYm9hcmQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGFzaGJvYXJkc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXNoYm9hcmRzL2NybS5kYXNoYm9hcmQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRGFzaGJvYXJkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuaW1wb3J0IHsgYXZnRGVhbFNpemVNZXRyaWNXaWRnZXQsIHBpcGVsaW5lQnlTdGFnZUZ1bm5lbFdpZGdldCB9IGZyb20gJy4vc2hhcmVkLXdpZGdldHMnO1xuXG4vKipcbiAqIENSTSBPdmVydmlldyBEYXNoYm9hcmRcbiAqXG4gKiBTaW5nbGUtcGFnZSBzbmFwc2hvdCBvZiByZXZlbnVlLCBwaXBlbGluZSwgYW5kIGN1c3RvbWVyIGFjdGl2aXR5LiBEZXNpZ25lZFxuICogdG8gbWlycm9yIHRoZSBwb2xpc2hlZCBDUk0gZGFzaGJvYXJkIHJlZmVyZW5jZSBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL29iamVjdHN0YWNrLWFpL29iamVjdHVpL3RyZWUvbWFpbi9leGFtcGxlcy9jcm0vc3JjL2Rhc2hib2FyZHNcbiAqIFx1MjAxNCBLUEkgdGlsZXMsIGFuIGFyZWEtY2hhcnQgcmV2ZW51ZSB0cmVuZCwgYSBsZWFkLXNvdXJjZSBkb251dCwgYVxuICogcGlwZWxpbmUgZnVubmVsLCBhbmQgYSByZWNlbnQtZGVhbHMgdGFibGUuXG4gKlxuICogVGhpcyBkYXNoYm9hcmQgaW50ZW50aW9uYWxseSB1c2VzIHRoZSBmcmFtZXdvcmsncyBmaXJzdC1jbGFzcyBtZXRhZGF0YSBmaWVsZHNcbiAqIChjb2xvclZhcmlhbnQsIGNoYXJ0Q29uZmlnLCBoZWFkZXIsIGRhdGVSYW5nZSwgZGVzY3JpcHRpb25zLCBhY3Rpb24gYnV0dG9ucylcbiAqIHJhdGhlciB0aGFuIGFkLWhvYyBoZXggc3RyaW5ncyBzdHVmZmVkIGludG8gYG9wdGlvbnMuY29sb3JgLlxuICpcbiAqIE5vIEtQSSB0aWxlIGRlY2xhcmVzIGEgYHRyZW5kYC4gQSBwZXJpb2Qtb3Zlci1wZXJpb2QgZGVsdGEgaXMgYSBtZWFzdXJlbWVudCxcbiAqIHNvIGl0IGhhcyB0byBjb21lIGZyb20gYSByZWFsIGNvbXBhcmlzb24gcXVlcnkgKHdpZGdldCBgY29tcGFyZVRvYCkgb25jZSB0aGVcbiAqIHJlbmRlcmVyIHN1cHBvcnRzIGl0IGZvciBkYXRhc2V0IG1ldHJpY3MgXHUyMDE0IHRoZSBwZXJjZW50YWdlcyB0aGlzIGZpbGUgdXNlZCB0b1xuICogY2Fycnkgd2VyZSB0eXBlZCBieSBoYW5kIGFuZCByZWNvbXB1dGVkIGJ5IG5vdGhpbmcsIHNvIHRoZXkga2VwdCBhc3NlcnRpbmdcbiAqIHRoZSBzYW1lIFwiKzEyLjUlIHZzIGxhc3QgbW9udGhcIiBvbiBhbnkgZGF0YSwgaW5jbHVkaW5nIGFuIGVtcHR5IGRhdGFiYXNlLlxuICogU2FtZSBydWxlIGFzIHRoZSBleGVjdXRpdmUgZGFzaGJvYXJkICgjNTAwLCAjNTg3KS5cbiAqL1xuZXhwb3J0IGNvbnN0IENybU92ZXJ2aWV3RGFzaGJvYXJkOiBEYXNoYm9hcmQgPSB7XG4gIG5hbWU6ICdjcm1fb3ZlcnZpZXdfZGFzaGJvYXJkJyxcbiAgbGFiZWw6ICdDUk0gT3ZlcnZpZXcnLFxuICBkZXNjcmlwdGlvbjogJ1JldmVudWUgbWV0cmljcywgcGlwZWxpbmUgYW5hbHl0aWNzLCBhbmQgZGVhbCBpbnNpZ2h0cycsXG5cbiAgY29sdW1uczogMTIsXG4gIGdhcDogNCxcbiAgcmVmcmVzaEludGVydmFsU2Vjb25kczogMzAwLFxuXG4gIGhlYWRlcjoge1xuICAgIHNob3dUaXRsZTogdHJ1ZSxcbiAgICBzaG93RGVzY3JpcHRpb246IHRydWUsXG4gICAgLy8gSGVhZGVyIGFjdGlvbiBidXR0b25zIHJlbW92ZWQ6IGBjcmVhdGVfb3Bwb3J0dW5pdHlgIC8gYGNyZWF0ZV9sZWFkYCBhcmUgbm90XG4gICAgLy8gZGVmaW5lZCBhY3Rpb25zIGFuZCBgL3JlcG9ydHNgIGlzIG5vdCBhbiBpbi1hcHAgdmlldyByb3V0ZSBcdTIwMTQgYWxsIHRocmVlIHdlcmVcbiAgICAvLyBkZWFkLiBSZS1hZGQgcmVhbCwgd2lyZWQtdXAgYWN0aW9ucyBoZXJlIHdoZW4gYXZhaWxhYmxlLlxuICB9LFxuXG4gIGRhdGVSYW5nZToge1xuICAgIGZpZWxkOiAnY2xvc2VfZGF0ZScsXG4gICAgZGVmYXVsdFJhbmdlOiAndGhpc19xdWFydGVyJyxcbiAgICBhbGxvd0N1c3RvbVJhbmdlOiB0cnVlLFxuICB9LFxuXG4gIGdsb2JhbEZpbHRlcnM6IFtcbiAgICB7XG4gICAgICBmaWVsZDogJ293bmVyX2lkJyxcbiAgICAgIGxhYmVsOiB7IGVuOiAnT3duZXInLCAnemgtQ04nOiAnXHU4RDFGXHU4RDIzXHU0RUJBJywgJ2VzLUVTJzogJ1Jlc3BvbnNhYmxlJywgJ2phLUpQJzogJ1x1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgc2NvcGU6ICdkYXNoYm9hcmQnLFxuICAgICAgb3B0aW9uc0Zyb206IHsgb2JqZWN0OiAnc3lzX3VzZXInLCB2YWx1ZUZpZWxkOiAnaWQnLCBsYWJlbEZpZWxkOiAnbmFtZScgfSxcbiAgICB9LFxuICBdLFxuXG4gIHdpZGdldHM6IFtcbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgS1BJIFJvdyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBpZDogJ3RvdGFsX3JldmVudWUnLFxuICAgICAgdGl0bGU6ICdUb3RhbCBSZXZlbnVlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2xvc2VkLXdvbiByZXZlbnVlIHRoaXMgcGVyaW9kJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiAnY2xvc2VkX3dvbicgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ3N1Y2Nlc3MnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsndG90YWxfYW1vdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMCwgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdhY3RpdmVfZGVhbHMnLFxuICAgICAgdGl0bGU6ICdBY3RpdmUgRGVhbHMnLFxuICAgICAgZGVzY3JpcHRpb246ICdPcGVuIG9wcG9ydHVuaXRpZXMgaW4gdGhlIHBpcGVsaW5lJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiB7ICRuaW46IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0gfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsnb3BwX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMywgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICd3b25fZGVhbHMnLFxuICAgICAgdGl0bGU6ICdXb24gRGVhbHMnLFxuICAgICAgZGVzY3JpcHRpb246ICdDbG9zZWQtd29uIGRlYWxzIHRoaXMgcGVyaW9kJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiAnY2xvc2VkX3dvbicgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ3B1cnBsZScsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIHZhbHVlczogWydvcHBfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiA2LCB5OiAwLCB3OiAzLCBoOiAyIH0sXG4gICAgfSxcbiAgICAvLyBObyBvdmVycmlkZXMgbGVmdCBvbmNlIHRoZSBmYWJyaWNhdGVkIHRyZW5kIGlzIGdvbmUuXG4gICAgYXZnRGVhbFNpemVNZXRyaWNXaWRnZXQoeyB4OiA5LCB5OiAwLCB3OiAzLCBoOiAyIH0pLFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENoYXJ0cyBSb3cgMSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBpZDogJ3JldmVudWVfdHJlbmRzJyxcbiAgICAgIHRpdGxlOiAnUmV2ZW51ZSBUcmVuZHMnLFxuICAgICAgZGVzY3JpcHRpb246ICdDbG9zZWQtd29uIHJldmVudWUgb3ZlciB0aGUgbGFzdCAxMiBtb250aHMnLFxuICAgICAgdHlwZTogJ2FyZWEnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiAnY2xvc2VkX3dvbicsIGNsb3NlX2RhdGU6IHsgJGd0ZTogJ3sxMl9tb250aHNfYWdvfScgfSB9LFxuICAgICAgZmlsdGVyQmluZGluZ3M6IHsgZGF0ZVJhbmdlOiBmYWxzZSB9LCAvLyBzZWxmLXNjb3BlZCB0byAxMiBtb250aHMgXHUyMDE0IHRoZSBkYXRlIHBpY2tlciBtdXN0IG5vdCBuYXJyb3cgaXRcbiAgICAgIGNvbG9yVmFyaWFudDogJ3N1Y2Nlc3MnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCBkaW1lbnNpb25zOiBbJ2Nsb3NlX2RhdGUnXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDIsIHc6IDksIGg6IDQgfSxcbiAgICAgIGNoYXJ0Q29uZmlnOiB7XG4gICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlLFxuICAgICAgICBzaG93RGF0YUxhYmVsczogZmFsc2UsXG4gICAgICAgIGNvbG9yczogWycjMTBCOTgxJ10sXG4gICAgICAgIGludGVyYWN0aW9uOiB7IHRvb2x0aXBzOiB0cnVlLCBicnVzaDogdHJ1ZSB9LFxuICAgICAgfSxcbiAgICAgIG9wdGlvbnM6IHsgZGF0ZUdyYW51bGFyaXR5OiAnbW9udGgnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2xlYWRfc291cmNlJyxcbiAgICAgIHRpdGxlOiAnTGVhZCBTb3VyY2UnLFxuICAgICAgZGVzY3JpcHRpb246ICdQaXBlbGluZSB2YWx1ZSBieSBhY3F1aXNpdGlvbiBjaGFubmVsJyxcbiAgICAgIHR5cGU6ICdkb251dCcsXG4gICAgICBjb2xvclZhcmlhbnQ6ICdwdXJwbGUnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCBkaW1lbnNpb25zOiBbJ2xlYWRfc291cmNlJ10sIHZhbHVlczogWyd0b3RhbF9hbW91bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiA5LCB5OiAyLCB3OiAzLCBoOiA0IH0sXG4gICAgICBjaGFydENvbmZpZzoge1xuICAgICAgICBzaG93TGVnZW5kOiB0cnVlLFxuICAgICAgICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgICAgICAgY29sb3JzOiBbJyM0RjQ2RTUnLCAnIzA2QjZENCcsICcjMTBCOTgxJywgJyNGNTlFMEInLCAnI0VGNDQ0NCcsICcjOEI1Q0Y2J10sXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ2hhcnRzIFJvdyAyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHBpcGVsaW5lQnlTdGFnZUZ1bm5lbFdpZGdldCh7IHg6IDAsIHk6IDYsIHc6IDYsIGg6IDQgfSksXG4gICAge1xuICAgICAgaWQ6ICd0b3BfcHJvZHVjdHMnLFxuICAgICAgdGl0bGU6ICdUb3AgUHJvZHVjdHMnLFxuICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBsaXN0LXByaWNlIHJldmVudWUgYnkgcHJvZHVjdCBjYXRlZ29yeScsXG4gICAgICB0eXBlOiAnYmFyJyxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgLy8gY3JtX3Byb2R1Y3QgaGFzIG5vIGBjbG9zZV9kYXRlYCwgc28gdGhlIGRhdGUgcGlja2VyIHdvdWxkIGZhaWwgaXQgd2l0aFxuICAgICAgLy8gYG5vIHN1Y2ggY29sdW1uYC4gT2JqZWN0U3RhY2sgMTUgKGZyYW1ld29yayMyNTAxKSBpbmplY3RzIGV2ZXJ5IGRhc2hib2FyZFxuICAgICAgLy8gZmlsdGVyIChkYXRlUmFuZ2UgKyBnbG9iYWxGaWx0ZXJzKSBpbnRvIGVhY2ggd2lkZ2V0J3MgcXVlcnkuXG4gICAgICAvLyBUaGUgYG93bmVyX2lkYCBvcHQtb3V0IGlzIFNFTUFOVElDLCBub3Qgc3RydWN0dXJhbDogc2luY2UgIzU0OCBldmVyeVxuICAgICAgLy8gYnVzaW5lc3Mgb2JqZWN0IGNhcnJpZXMgdGhlIGluamVjdGVkIGBvd25lcl9pZGAsIHNvIHRoZSBmaWx0ZXIgd291bGQgbm93XG4gICAgICAvLyByZXNvbHZlIFx1MjAxNCBpdCBqdXN0IG1lYW5zIG5vdGhpbmcgb24gYSBzaGFyZWQgcHJvZHVjdCBjYXRhbG9nLCB3aGVyZSB0aGVcbiAgICAgIC8vIGNvbHVtbiByZWNvcmRzIHdob2V2ZXIgY3JlYXRlZCB0aGUgZW50cnkuXG4gICAgICBmaWx0ZXJCaW5kaW5nczogeyBkYXRlUmFuZ2U6IGZhbHNlLCBvd25lcl9pZDogZmFsc2UgfSxcbiAgICAgIGRhdGFzZXQ6ICdwcm9kdWN0X21ldHJpY3MnLCBkaW1lbnNpb25zOiBbJ2NhdGVnb3J5J10sIHZhbHVlczogWydsaXN0X3ByaWNlX3N1bSddLFxuICAgICAgbGF5b3V0OiB7IHg6IDYsIHk6IDYsIHc6IDYsIGg6IDQgfSxcbiAgICAgIGNoYXJ0Q29uZmlnOiB7XG4gICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlLFxuICAgICAgICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgICAgICAgY29sb3JzOiBbJyM0RjQ2RTUnXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBQaXBlbGluZSBieSBPd25lciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvLyBBIGRhc2hib2FyZCBgdGFibGVgIGJpbmRzIHRvIGFuIGFuYWx5dGljcyBkYXRhc2V0IChhIGN1YmUpLCBzbyBpdCBtdXN0XG4gICAgLy8gYWdncmVnYXRlIFx1MjAxNCBpdCBjYW5ub3QgbGlzdCByYXcgcmVjb3JkcyAoQURSLTAwMjEpLiBUaGUgcHJldmlvdXNcbiAgICAvLyBcIlJlY2VudCBPcHBvcnR1bml0aWVzXCIgdGFibGUgc2VsZWN0ZWQgb25seSB0aGUgYG9wcF9jb3VudGAgbWVhc3VyZSB3aXRoXG4gICAgLy8gbm8gZGltZW5zaW9uLCB3aGljaCByZW5kZXJzIGEgc2luZ2xlIHN1bW1hcnkgcm93LCBub3QgYSBwZXItZGVhbCBsaXN0LlxuICAgIC8vIEZvciBhIHRydWUgcGVyLXJlY29yZCBsaXN0aW5nLCBzdXJmYWNlIGFuIG9iamVjdC1ib3VuZCBMaXN0VmlldyB0aHJvdWdoXG4gICAgLy8gYXBwIG5hdmlnYXRpb24gaW5zdGVhZCAoQURSLTAwMTcpLiBIZXJlIHdlIGdyb3VwIGJ5IG93bmVyIGZvciBhIHJlcFxuICAgIC8vIHBpcGVsaW5lIGJyZWFrZG93biB0aGF0IHJlbmRlcnMgb25lIHJvdyBwZXIgb3duZXIuXG4gICAge1xuICAgICAgaWQ6ICdwaXBlbGluZV9ieV9vd25lcicsXG4gICAgICB0aXRsZTogJ1BpcGVsaW5lIGJ5IE93bmVyJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3BlbiBwaXBlbGluZSB2YWx1ZSBhbmQgZGVhbCBjb3VudCBwZXIgc2FsZXMgcmVwJyxcbiAgICAgIHR5cGU6ICd0YWJsZScsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6IHsgJG5pbjogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnZGVmYXVsdCcsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnb3duZXInXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCcsICdvcHBfY291bnQnLCAnYXZnX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDEwLCB3OiAxMiwgaDogNCB9LFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBzb3J0Qnk6ICd0b3RhbF9hbW91bnQnLFxuICAgICAgICBzb3J0T3JkZXI6ICdkZXNjJyxcbiAgICAgICAgbGltaXQ6IDEwLFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Rhc2hib2FyZHMvZXhlY3V0aXZlLmRhc2hib2FyZC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXNoYm9hcmRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Rhc2hib2FyZHMvZXhlY3V0aXZlLmRhc2hib2FyZC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBEYXNoYm9hcmQsIElubGluZUxvY2FsZU1hcCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcbmltcG9ydCB7IExFQURfU09VUkNFX09QVElPTlMgfSBmcm9tICcuLi9vYmplY3RzL19waWNrbGlzdHMnO1xuaW1wb3J0IHsgcGlwZWxpbmVCeVN0YWdlRnVubmVsV2lkZ2V0IH0gZnJvbSAnLi9zaGFyZWQtd2lkZ2V0cyc7XG5cbi8qKlxuICogYGxlYWRfc291cmNlYCBmaWx0ZXIgb3B0aW9uIGxhYmVscywga2V5ZWQgYnkgdGhlIENBTk9OSUNBTCBzdG9yZWQgdmFsdWUuXG4gKlxuICogT25seSB0aGUgV09SRElORyBpcyB3cml0dGVuIGhlcmUuIFRoZSBST1NURVIgaXMgZGVyaXZlZCBiZWxvdyBmcm9tXG4gKiB7QGxpbmsgTEVBRF9TT1VSQ0VfT1BUSU9OU30gXHUyMDE0IHRoZSBvbmUgY29uc3RhbnQgYGNybV9sZWFkYCwgYGNybV9jb250YWN0YCBhbmRcbiAqIGBjcm1fb3Bwb3J0dW5pdHlgIGVhY2ggc3ByZWFkIGludG8gdGhlaXIgb3duIGBsZWFkX3NvdXJjZWAgZmllbGQgXHUyMDE0IHNvIHRoaXNcbiAqIGNvbnRyb2wgY2FuIG9ubHkgZXZlciBvZmZlciB2YWx1ZXMgYSByZWNvcmQgY2FuIGFjdHVhbGx5IGhvbGQuIEl0IHVzZWQgdG9cbiAqIGhhbmQtY29weSBzaXggb2YgdGhlIHR3ZWx2ZSwgYW5kIG9uZSBvZiB0aG9zZSBzaXggd2FzIHNwZWxsZWQgYGFkdmVydGlzaW5nYFxuICogYWdhaW5zdCBhIGNhbm9uaWNhbCBgYWR2ZXJ0aXNlbWVudGA6IHBpY2tpbmcgaXQgQU5EZWQgYSB0ZXJtIG5vIHJvdyBtYXRjaGVzXG4gKiBpbnRvIGV2ZXJ5IGJvdW5kIHdpZGdldCBhbmQgdGhlIHdob2xlIGRhc2hib2FyZCByZWFkIHplcm8gd2l0aCBubyBlcnJvciBhbmRcbiAqIG5vIGVtcHR5IHN0YXRlICgjMTg0OSkuXG4gKlxuICogQSB2YWx1ZSBhZGRlZCB0byB0aGUgY29uc3RhbnQgd2l0aCBubyByb3cgaGVyZSByZW5kZXJzIGBsYWJlbDogdW5kZWZpbmVkYCxcbiAqIHdoaWNoIGBwbnBtIHZhbGlkYXRlYCByZWplY3RzIGJ5IG5hbWUgXHUyMDE0IHRoZSByb3N0ZXIgY2Fubm90IGRyaWZ0IGJhY2tcbiAqIHNpbGVudGx5LCB3aGljaCBpcyB0aGUgcHJvcGVydHkgYSBzZWNvbmQgaGFuZC1jb3B5IGNvdWxkIG5vdCBoYXZlLlxuICpcbiAqIFRoZSBzdHJpbmdzIGFyZSB0aGUgbGFuZ3VhZ2UgcGFja3MnIG93biwgY29waWVkIGZyb21cbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zLzxsb2NhbGU+L29iamVjdHMucGlwZWxpbmUudHNgXG4gKiAoYGNybV9sZWFkLmZpZWxkcy5sZWFkX3NvdXJjZS5vcHRpb25zYDsgamEtSlAgcmVzb2x2ZXMgdGhlbSB0aHJvdWdoXG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9fc2hhcmVkLnRzYCksIHNvIHRoZSBmaWx0ZXIgYmFyIGRvZXMgbm90IGNvaW4gYVxuICogc2Vjb25kIHZvY2FidWxhcnkgZm9yIGEgdmFsdWUgdGhlIHJlY29yZCBwYWdlIGFscmVhZHkgbGFiZWxzLiBUaGV5IGFyZVxuICogc3BlbGxlZCBpbmxpbmUgcmF0aGVyIHRoYW4gcmVhY2hlZCB0aHJvdWdoIGBHbG9iYWxGaWx0ZXJTY2hlbWEub2JqZWN0YCxcbiAqIHdoaWNoIGlzIGluZXJ0IGluIHRoaXMgQ29uc29sZSBidWlsZCBcdTIwMTQgbWVhc3VyZWQgb24gIzE4MjIsIHNlZSBgLi9pbmRleC50c2AuXG4gKi9cbmNvbnN0IExFQURfU09VUkNFX0ZJTFRFUl9MQUJFTFM6IFJlY29yZDxcbiAgc3RyaW5nLFxuICBJbmxpbmVMb2NhbGVNYXAgJiBSZWNvcmQ8J2VuJyB8ICd6aC1DTicgfCAnZXMtRVMnIHwgJ2phLUpQJywgc3RyaW5nPlxuPiA9IHtcbiAgd2ViOiAgICAgICAgICAgICB7IGVuOiAnV2ViJywgICAgICAgICAgICAgJ3poLUNOJzogJ1x1N0Y1MVx1N0FEOScsICAgICAgJ2VzLUVTJzogJ1dlYicsICAgICAgICAgICAgICAgICdqYS1KUCc6ICdcdTMwQTZcdTMwQTdcdTMwRDYnIH0sXG4gIHJlZmVycmFsOiAgICAgICAgeyBlbjogJ1JlZmVycmFsJywgICAgICAgICd6aC1DTic6ICdcdTYzQThcdTgzNTAnLCAgICAgICdlcy1FUyc6ICdSZWZlcmVuY2lhJywgICAgICAgICAnamEtSlAnOiAnXHU3RDM5XHU0RUNCJyB9LFxuICBldmVudDogICAgICAgICAgIHsgZW46ICdFdmVudCAvIFRyYWRlIFNob3cnLCAnemgtQ04nOiAnXHU2RDNCXHU1MkE4IC8gXHU1QzU1XHU0RjFBJywgJ2VzLUVTJzogJ0V2ZW50byAvIEZlcmlhJywgJ2phLUpQJzogJ1x1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOFx1MzBGQlx1NUM1NVx1NzkzQVx1NEYxQScgfSxcbiAgd2ViaW5hcjogICAgICAgICB7IGVuOiAnV2ViaW5hcicsICAgICAgICAgJ3poLUNOJzogJ1x1N0VCRlx1NEUwQVx1NzgxNFx1OEJBOFx1NEYxQScsICdlcy1FUyc6ICdTZW1pbmFyaW8gV2ViJywgICAgICAnamEtSlAnOiAnXHUzMEE2XHUzMEE3XHUzMEQzXHUzMENBXHUzMEZDJyB9LFxuICBwYXJ0bmVyOiAgICAgICAgIHsgZW46ICdQYXJ0bmVyJywgICAgICAgICAnemgtQ04nOiAnXHU1NDA4XHU0RjVDXHU0RjE5XHU0RjM0JywgICAnZXMtRVMnOiAnU29jaW8nLCAgICAgICAgICAgICAgJ2phLUpQJzogJ1x1MzBEMVx1MzBGQ1x1MzBDOFx1MzBDQVx1MzBGQycgfSxcbiAgYWR2ZXJ0aXNlbWVudDogICB7IGVuOiAnQWR2ZXJ0aXNlbWVudCcsICAgJ3poLUNOJzogJ1x1NUU3Rlx1NTQ0QScsICAgICAgJ2VzLUVTJzogJ1B1YmxpY2lkYWQnLCAgICAgICAgICdqYS1KUCc6ICdcdTVFODNcdTU0NEEnIH0sXG4gIHBhaWRfc2VhcmNoOiAgICAgeyBlbjogJ1BhaWQgU2VhcmNoJywgICAgICd6aC1DTic6ICdcdTRFRDhcdThEMzlcdTY0MUNcdTdEMjInLCAgICdlcy1FUyc6ICdCXHUwMEZBc3F1ZWRhIGRlIFBhZ28nLCAgICdqYS1KUCc6ICdcdTY3MDlcdTY1OTlcdTY5MUNcdTdEMjInIH0sXG4gIHNvY2lhbDogICAgICAgICAgeyBlbjogJ1NvY2lhbCBNZWRpYScsICAgICd6aC1DTic6ICdcdTc5M0VcdTRFQTRcdTVBOTJcdTRGNTMnLCAgICdlcy1FUyc6ICdSZWRlcyBTb2NpYWxlcycsICAgICAnamEtSlAnOiAnXHUzMEJEXHUzMEZDXHUzMEI3XHUzMEUzXHUzMEVCXHUzMEUxXHUzMEM3XHUzMEEzXHUzMEEyJyB9LFxuICBjb250ZW50OiAgICAgICAgIHsgZW46ICdDb250ZW50IC8gQmxvZycsICAnemgtQ04nOiAnXHU1MTg1XHU1QkI5IC8gXHU1MzVBXHU1QkEyJywgJ2VzLUVTJzogJ0NvbnRlbmlkbyAvIEJsb2cnLCAgJ2phLUpQJzogJ1x1MzBCM1x1MzBGM1x1MzBDNlx1MzBGM1x1MzBDNFx1MzBGQlx1MzBENlx1MzBFRFx1MzBCMCcgfSxcbiAgY29sZF9jYWxsOiAgICAgICB7IGVuOiAnQ29sZCBDYWxsJywgICAgICAgJ3poLUNOJzogJ1x1OTY0Q1x1NzUxRlx1NjJEQ1x1OEJCRicsICAgJ2VzLUVTJzogJ0xsYW1hZGEgZW4gRnJcdTAwRURvJywgICAgJ2phLUpQJzogJ1x1MzBCM1x1MzBGQ1x1MzBFQlx1MzBDOVx1MzBCM1x1MzBGQ1x1MzBFQicgfSxcbiAgZW1haWxfY2FtcGFpZ246ICB7IGVuOiAnRW1haWwgQ2FtcGFpZ24nLCAgJ3poLUNOJzogJ1x1OTBBRVx1NEVGNlx1ODQyNVx1OTUwMCcsICAgJ2VzLUVTJzogJ0NhbXBhXHUwMEYxYSBkZSBFbWFpbCcsICAgJ2phLUpQJzogJ1x1MzBFMVx1MzBGQ1x1MzBFQlx1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGMycgfSxcbiAgb3RoZXI6ICAgICAgICAgICB7IGVuOiAnT3RoZXInLCAgICAgICAgICAgJ3poLUNOJzogJ1x1NTE3Nlx1NEVENicsICAgICAgJ2VzLUVTJzogJ090cm8nLCAgICAgICAgICAgICAgICdqYS1KUCc6ICdcdTMwNURcdTMwNkVcdTRFRDYnIH0sXG59O1xuXG4vKipcbiAqIEV4ZWN1dGl2ZSBPdmVydmlldyBEYXNoYm9hcmRcbiAqXG4gKiBIaWdoLWxldmVsIHJldmVudWUsIGN1c3RvbWVyLCBhbmQgcGlwZWxpbmUgS1BJcyBmb3IgY29tcGFueSBsZWFkZXJzaGlwLlxuICpcbiAqIFdpZGdldHMgaGVyZSBhcmUgZGF0YXNldC1ib3VuZCAoQURSLTAwMjEpLCBhbmQgdGhlIGNvbnNvbGUncyBkYXRhc2V0IHdpZGdldFxuICogcmVhZHMgT05MWTogdHlwZSwgZGF0YXNldCwgZGltZW5zaW9ucywgdmFsdWVzLCBmaWx0ZXIsIGZpbHRlckJpbmRpbmdzLCBhbmRcbiAqIGxheW91dC4gSXQgYnVpbGRzIGNoYXJ0cyBhbmQgdGFibGVzIGZyb20gdGhlIGRhdGFzZXQncyBvd24gZmllbGQgbWV0YWRhdGFcbiAqIChsYWJlbHMsIGZvcm1hdHMpLCBzbyBwZXItd2lkZ2V0IGBjaGFydENvbmZpZ2AsIGBjb2xvclZhcmlhbnRgLCB3aWRnZXQtbGV2ZWxcbiAqIGBhY3Rpb24qYCwgYW5kIGZyZWUtZm9ybSBgb3B0aW9uc2AgKGljb25zLCBmb3JtYXRzLCBzdGF0aWMgdHJlbmRzLCB0YWJsZVxuICogY29sdW1uIHNwZWNzKSBhcmUgbmV2ZXIgcmVhZCBcdTIwMTQgZG9uJ3QgcmUtYWRkIHRoZW0uIEluIHBhcnRpY3VsYXIsIG1ldHJpYy10aWxlXG4gKiB0cmVuZCBkZWx0YXMgbXVzdCBjb21lIGZyb20gcmVhbCBjb21wYXJpc29uIHF1ZXJpZXMgKHdpZGdldCBgY29tcGFyZVRvYClcbiAqIG9uY2UgdGhlIHJlbmRlcmVyIHN1cHBvcnRzIHRoZW0gZm9yIGRhdGFzZXQgbWV0cmljczsgaGFyZGNvZGVkIHBlcmNlbnRhZ2VzXG4gKiBwcmV2aW91c2x5IGNhcnJpZWQgaGVyZSB3ZXJlIGZhYnJpY2F0aW9ucyBhbmQgd2VyZSByZW1vdmVkICgjNTAwKS5cbiAqIERhdGUgYnVja2V0aW5nIGlzIGxpa2V3aXNlIHNlcnZlci1zaWRlIChhIGRhdGFzZXQgZGltZW5zaW9uJ3NcbiAqIGBkYXRlR3JhbnVsYXJpdHlgLCBub3Qgd2lkZ2V0IG9wdGlvbnMpIFx1MjAxNCBidXQgc2VlIHRoZSBub3RlIGluXG4gKiBgb3Bwb3J0dW5pdHlfbWV0cmljc2AgZm9yIHdoeSB0aGUgdHJlbmQgd2lkZ2V0cyBzdGlsbCBncm91cCBieSByYXcgZGF0ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBFeGVjdXRpdmVEYXNoYm9hcmQ6IERhc2hib2FyZCA9IHtcbiAgbmFtZTogJ2V4ZWN1dGl2ZV9kYXNoYm9hcmQnLFxuICBsYWJlbDogJ0V4ZWN1dGl2ZSBPdmVydmlldycsXG4gIGRlc2NyaXB0aW9uOiAnSGlnaC1sZXZlbCByZXZlbnVlLCBjdXN0b21lciwgYW5kIHBpcGVsaW5lIEtQSXMgZm9yIGxlYWRlcnNoaXAnLFxuXG4gIGNvbHVtbnM6IDEyLFxuICBnYXA6IDQsXG4gIHJlZnJlc2hJbnRlcnZhbFNlY29uZHM6IDMwMCwgLy8gNSBtaW51dGVzXG5cbiAgaGVhZGVyOiB7XG4gICAgc2hvd1RpdGxlOiB0cnVlLFxuICAgIHNob3dEZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAvLyBIZWFkZXIgYWN0aW9uIGJ1dHRvbnMgcmVtb3ZlZDogdGhleSByZWZlcmVuY2VkIGFjdGlvbnMvcm91dGVzIHRoYXQgd2VyZVxuICAgIC8vIG5ldmVyIGltcGxlbWVudGVkIChgZXhwb3J0X2Rhc2hib2FyZF9wZGZgLCBgc2NoZWR1bGVfZGFzaGJvYXJkX2VtYWlsYCxcbiAgICAvLyBgY3VzdG9taXplX2Rhc2hib2FyZGAgYXJlIG5vdCBkZWZpbmVkIGFueXdoZXJlKSwgc28gdGhleSByZW5kZXJlZCBhcyBkZWFkXG4gICAgLy8gYnV0dG9ucy4gUmUtYWRkIHJlYWwsIHdpcmVkLXVwIGFjdGlvbnMgaGVyZSBpZiB0aGVzZSBmZWF0dXJlcyBsYW5kLlxuICB9LFxuXG4gIGRhdGVSYW5nZToge1xuICAgIGZpZWxkOiAnY2xvc2VfZGF0ZScsXG4gICAgZGVmYXVsdFJhbmdlOiAndGhpc19xdWFydGVyJyxcbiAgICBhbGxvd0N1c3RvbVJhbmdlOiB0cnVlLFxuICB9LFxuXG4gIGdsb2JhbEZpbHRlcnM6IFtcbiAgICB7XG4gICAgICBmaWVsZDogJ293bmVyX2lkJyxcbiAgICAgIGxhYmVsOiB7IGVuOiAnT3duZXInLCAnemgtQ04nOiAnXHU4RDFGXHU4RDIzXHU0RUJBJywgJ2VzLUVTJzogJ1Jlc3BvbnNhYmxlJywgJ2phLUpQJzogJ1x1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgc2NvcGU6ICdkYXNoYm9hcmQnLFxuICAgICAgb3B0aW9uc0Zyb206IHsgb2JqZWN0OiAnc3lzX3VzZXInLCB2YWx1ZUZpZWxkOiAnaWQnLCBsYWJlbEZpZWxkOiAnbmFtZScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZpZWxkOiAnbGVhZF9zb3VyY2UnLFxuICAgICAgbGFiZWw6IHsgZW46ICdMZWFkIFNvdXJjZScsICd6aC1DTic6ICdcdTdFQkZcdTdEMjJcdTY3NjVcdTZFOTAnLCAnZXMtRVMnOiAnT3JpZ2VuIGRlbCBQcm9zcGVjdG8nLCAnamEtSlAnOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMEJEXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICBzY29wZTogJ2Rhc2hib2FyZCcsXG4gICAgICAvLyBSb3N0ZXIgZGVyaXZlZCwgd29yZGluZyBmcm9tIHRoZSBsYW5ndWFnZSBwYWNrcyBcdTIwMTQgc2VlXG4gICAgICAvLyBMRUFEX1NPVVJDRV9GSUxURVJfTEFCRUxTIGFib3ZlLiBPcmRlciBmb2xsb3dzIHRoZSBjYW5vbmljYWwgY29uc3RhbnQuXG4gICAgICBvcHRpb25zOiBMRUFEX1NPVVJDRV9PUFRJT05TLm1hcCgoeyB2YWx1ZSB9KSA9PiAoe1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgbGFiZWw6IExFQURfU09VUkNFX0ZJTFRFUl9MQUJFTFNbU3RyaW5nKHZhbHVlKV0sXG4gICAgICB9KSksXG4gICAgfSxcbiAgXSxcblxuICB3aWRnZXRzOiBbXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyAxOiBIZWFkbGluZSBLUElzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGlkOiAndG90YWxfcmV2ZW51ZV95dGQnLFxuICAgICAgdGl0bGU6ICdUb3RhbCBSZXZlbnVlIChZVEQpJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2xvc2VkLXdvbiByZXZlbnVlIHRoaXMgeWVhcicsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGZpbHRlcjogeyBzdGFnZTogJ2Nsb3NlZF93b24nLCBjbG9zZV9kYXRlOiB7ICRndGU6ICd7Y3VycmVudF95ZWFyX3N0YXJ0fScgfSB9LFxuICAgICAgLy8gU2VsZi1zY29wZWQgdG8gWVREOyB3aXRob3V0IHRoaXMgdGhlIGluamVjdGVkIGRhc2hib2FyZCBkYXRlUmFuZ2VcbiAgICAgIC8vIChkZWZhdWx0IHRoaXNfcXVhcnRlcikgaXMgQU5EZWQgaW4gYW5kIHRoZSB0aWxlIHNob3dzIHF1YXJ0ZXIgcmV2ZW51ZS5cbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UgfSxcbiAgICAgIGRhdGFzZXQ6ICdvcHBvcnR1bml0eV9tZXRyaWNzJywgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDAsIHc6IDMsIGg6IDIgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAndG90YWxfYWNjb3VudHMnLFxuICAgICAgdGl0bGU6ICdBY3RpdmUgQWNjb3VudHMnLFxuICAgICAgZGVzY3JpcHRpb246ICdDdXN0b21lcnMgd2l0aCBhdCBsZWFzdCBvbmUgYWN0aXZlIHJlbGF0aW9uc2hpcCcsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGZpbHRlcjogeyBpc19hY3RpdmU6IHRydWUgfSxcbiAgICAgIC8vIGNybV9hY2NvdW50IGhhcyBuZWl0aGVyIGBjbG9zZV9kYXRlYCBub3IgYGxlYWRfc291cmNlYDsgb3B0IHRoaXMgd2lkZ2V0XG4gICAgICAvLyBvdXQgb2YgYm90aCBkYXNoYm9hcmQgZmlsdGVycyBib3VuZCB0byB0aG9zZSBmaWVsZHMuIE9iamVjdFN0YWNrIDE1XG4gICAgICAvLyAoZnJhbWV3b3JrIzI1MDEpIGluamVjdHMgZXZlcnkgZGFzaGJvYXJkIGZpbHRlciAoZGF0ZVJhbmdlICsgZ2xvYmFsRmlsdGVycylcbiAgICAgIC8vIGludG8gZWFjaCB3aWRnZXQncyBxdWVyeSwgc28gYSB3aWRnZXQgb24gYW4gb2JqZWN0IGxhY2tpbmcgYSBmaWx0ZXIgZmllbGRcbiAgICAgIC8vIGZhaWxzIHdpdGggYG5vIHN1Y2ggY29sdW1uYC4gY3JtX2FjY291bnQgRE9FUyBoYXZlIGBvd25lcl9pZGAgKGluamVjdGVkXG4gICAgICAvLyBpbnRvIGV2ZXJ5IGJ1c2luZXNzIG9iamVjdCwgIzU0OCksIHNvIHRoZSBvd25lciBmaWx0ZXIgaXMgbGVmdCB0byBhcHBseS5cbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UsIGxlYWRfc291cmNlOiBmYWxzZSB9LFxuICAgICAgZGF0YXNldDogJ2FjY291bnRfbWV0cmljcycsIHZhbHVlczogWydhY2NvdW50X2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMywgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICd0b3RhbF9jb250YWN0cycsXG4gICAgICB0aXRsZTogJ1RvdGFsIENvbnRhY3RzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUGVvcGxlIGluIG91ciBhZGRyZXNzIGJvb2snLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXJCaW5kaW5nczogeyBkYXRlUmFuZ2U6IGZhbHNlIH0sIC8vIGNybV9jb250YWN0IGhhcyBubyBjbG9zZV9kYXRlIFx1MjAxNCBvcHQgb3V0IG9mIHRoZSBkYXRlIHBpY2tlclxuICAgICAgZGF0YXNldDogJ2NvbnRhY3RfbWV0cmljcycsIHZhbHVlczogWydjb250YWN0X2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogNiwgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdvcGVuX2xlYWRzJyxcbiAgICAgIHRpdGxlOiAnT3BlbiBMZWFkcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1VuY29udmVydGVkIGxlYWRzIGluIHRoZSBmdW5uZWwnLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgaXNfY29udmVydGVkOiBmYWxzZSB9LFxuICAgICAgZmlsdGVyQmluZGluZ3M6IHsgZGF0ZVJhbmdlOiBmYWxzZSB9LCAvLyBjcm1fbGVhZCBoYXMgbm8gY2xvc2VfZGF0ZSBcdTIwMTQgb3B0IG91dCBvZiB0aGUgZGF0ZSBwaWNrZXJcbiAgICAgIGRhdGFzZXQ6ICdsZWFkX21ldHJpY3MnLCB2YWx1ZXM6IFsnbGVhZF9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDksIHk6IDAsIHc6IDMsIGg6IDIgfSxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyAyOiBSZXZlbnVlIEFuYWx5c2lzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGlkOiAncmV2ZW51ZV90cmVuZCcsXG4gICAgICB0aXRsZTogJ1JldmVudWUgVHJlbmQnLFxuICAgICAgZGVzY3JpcHRpb246ICdDbG9zZWQtd29uIHJldmVudWUgb3ZlciB0aGUgbGFzdCAxMiBtb250aHMnLFxuICAgICAgdHlwZTogJ2FyZWEnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiAnY2xvc2VkX3dvbicsIGNsb3NlX2RhdGU6IHsgJGd0ZTogJ3sxMl9tb250aHNfYWdvfScgfSB9LFxuICAgICAgZmlsdGVyQmluZGluZ3M6IHsgZGF0ZVJhbmdlOiBmYWxzZSB9LCAvLyBzZWxmLXNjb3BlZCB0byAxMiBtb250aHMgXHUyMDE0IHRoZSBkYXRlIHBpY2tlciBtdXN0IG5vdCBuYXJyb3cgaXRcbiAgICAgIGRhdGFzZXQ6ICdvcHBvcnR1bml0eV9tZXRyaWNzJywgZGltZW5zaW9uczogWydjbG9zZV9kYXRlJ10sIHZhbHVlczogWyd0b3RhbF9hbW91bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAyLCB3OiA4LCBoOiA0IH0sXG4gICAgICAvLyBEZWZhdWx0IHJlbmRlcmluZyBpcyBpbnRlbnRpb25hbDogdGhlIGRhdGFzZXQgd2lkZ2V0IHBsb3RzIHRoZSBzZWxlY3RlZFxuICAgICAgLy8gZGltZW5zaW9uIFx1MDBENyB2YWx1ZXMgZGlyZWN0bHk7IGEgY2hhcnRDb25maWcgd291bGQgZHVwbGljYXRlIHRoZW0gaW5lcnRseS5cbiAgICAgIHN1cHByZXNzV2FybmluZ3M6IFsnY2hhcnQtY29uZmlnLW1pc3NpbmcnXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAncmV2ZW51ZV9ieV9pbmR1c3RyeScsXG4gICAgICB0aXRsZTogJ1JldmVudWUgYnkgSW5kdXN0cnknLFxuICAgICAgZGVzY3JpcHRpb246ICdZVEQgY2xvc2VkLXdvbiByZXZlbnVlIHNwbGl0IGJ5IGN1c3RvbWVyIGluZHVzdHJ5JyxcbiAgICAgIHR5cGU6ICdkb251dCcsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfd29uJywgY2xvc2VfZGF0ZTogeyAkZ3RlOiAne2N1cnJlbnRfeWVhcl9zdGFydH0nIH0gfSxcbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UgfSwgLy8gc2VsZi1zY29wZWQgdG8gWVREIFx1MjAxNCB0aGUgZGF0ZSBwaWNrZXIgbXVzdCBub3QgbmFycm93IGl0XG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnYWNjb3VudF9pbmR1c3RyeSddLCB2YWx1ZXM6IFsndG90YWxfYW1vdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogOCwgeTogMiwgdzogNCwgaDogNCB9LFxuICAgICAgc3VwcHJlc3NXYXJuaW5nczogWydjaGFydC1jb25maWctbWlzc2luZyddLCAvLyBpbnRlbnRpb25hbCBkZWZhdWx0IHJlbmRlcmluZyAoc2VlIHJldmVudWVfdHJlbmQpXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSb3cgMzogUGlwZWxpbmUgJiBBY3Rpdml0eSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvLyBUaGUgZnVubmVsIG5vdyBjb21lcyBmcm9tIHRoZSBzaGFyZWQgZmFjdG9yeSAoIzUzOSk7IGl0cyByZW1haW5pbmcgaW5lcnRcbiAgICAvLyBjb25maWcgbGl2ZXMgaW4gc2hhcmVkLXdpZGdldHMudHMgYW5kIGlzIG91dCBvZiB0aGlzIFBSJ3Mgc2NvcGUuXG4gICAgcGlwZWxpbmVCeVN0YWdlRnVubmVsV2lkZ2V0KHsgeDogMCwgeTogNiwgdzogNiwgaDogNCB9KSxcbiAgICB7XG4gICAgICBpZDogJ25ld19hY2NvdW50c19ieV9tb250aCcsXG4gICAgICB0aXRsZTogJ05ldyBBY2NvdW50cycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0FjY291bnQgY3JlYXRpb24gY2FkZW5jZSBcdTIwMTQgbGFzdCA2IG1vbnRocycsXG4gICAgICB0eXBlOiAnYmFyJyxcbiAgICAgIGZpbHRlcjogeyBjcmVhdGVkX2F0OiB7ICRndGU6ICd7Nl9tb250aHNfYWdvfScgfSB9LFxuICAgICAgZmlsdGVyQmluZGluZ3M6IHsgZGF0ZVJhbmdlOiBmYWxzZSwgbGVhZF9zb3VyY2U6IGZhbHNlIH0sIC8vIGNybV9hY2NvdW50IGhhcyBubyBjbG9zZV9kYXRlL2xlYWRfc291cmNlOyBzY29wZXMgaXRzZWxmIGJ5IGNyZWF0ZWRfYXRcbiAgICAgIGRhdGFzZXQ6ICdhY2NvdW50X21ldHJpY3MnLCBkaW1lbnNpb25zOiBbJ2NyZWF0ZWRfYXQnXSwgdmFsdWVzOiBbJ2FjY291bnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiA2LCB5OiA2LCB3OiA2LCBoOiA0IH0sXG4gICAgICBzdXBwcmVzc1dhcm5pbmdzOiBbJ2NoYXJ0LWNvbmZpZy1taXNzaW5nJ10sIC8vIGludGVudGlvbmFsIGRlZmF1bHQgcmVuZGVyaW5nIChzZWUgcmV2ZW51ZV90cmVuZClcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyA0OiBSZXZlbnVlIGJ5IEluZHVzdHJ5IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vIEEgZGFzaGJvYXJkIGB0YWJsZWAgYmluZHMgdG8gYW4gYW5hbHl0aWNzIGN1YmUsIHNvIGl0IGFnZ3JlZ2F0ZXMgcmF0aGVyXG4gICAgLy8gdGhhbiBsaXN0aW5nIHJhdyBhY2NvdW50cyAoQURSLTAwMjEpLiBUaGUgcHJldmlvdXMgXCJUb3AgQWNjb3VudHMgYnlcbiAgICAvLyBSZXZlbnVlXCIgdGFibGUgc2VsZWN0ZWQgb25seSB0aGUgYGFjY291bnRfY291bnRgIG1lYXN1cmUgd2l0aCBub1xuICAgIC8vIGRpbWVuc2lvbiBcdTIwMTQgYSBzaW5nbGUgc3VtbWFyeSByb3csIG5vdCBhIGN1c3RvbWVyIHJhbmtpbmcuIEdyb3VwaW5nIGJ5XG4gICAgLy8gaW5kdXN0cnkgZ2l2ZXMgYSByZWFsIG11bHRpLXJvdyBicmVha2Rvd24gb2YgYm9vay1vZi1idXNpbmVzcyBieSBzZWN0b3I7XG4gICAgLy8gZm9yIGEgcGVyLWFjY291bnQgbGlzdCwgdXNlIGFuIG9iamVjdC1ib3VuZCBMaXN0VmlldyAoQURSLTAwMTcpLlxuICAgIC8vIENvbHVtbiBoZWFkZXJzIGFuZCBudW1iZXIgZm9ybWF0cyBjb21lIGZyb20gdGhlIGRhdGFzZXQncyBkaW1lbnNpb24gYW5kXG4gICAgLy8gbWVhc3VyZSBtZXRhZGF0YS5cbiAgICB7XG4gICAgICBpZDogJ2FjY291bnRzX2J5X2luZHVzdHJ5JyxcbiAgICAgIHRpdGxlOiAnQWNjb3VudHMgYnkgSW5kdXN0cnknLFxuICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBhbm51YWwgcmV2ZW51ZSBhbmQgYWNjb3VudCBjb3VudCBwZXIgaW5kdXN0cnknLFxuICAgICAgdHlwZTogJ3RhYmxlJyxcbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UsIGxlYWRfc291cmNlOiBmYWxzZSB9LCAvLyBjcm1fYWNjb3VudCBoYXMgbm8gY2xvc2VfZGF0ZS9sZWFkX3NvdXJjZSBcdTIwMTQgb3B0IG91dCBvZiBib3RoXG4gICAgICBkYXRhc2V0OiAnYWNjb3VudF9tZXRyaWNzJywgZGltZW5zaW9uczogWydpbmR1c3RyeSddLCB2YWx1ZXM6IFsnYW5udWFsX3JldmVudWVfc3VtJywgJ2FjY291bnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAxMCwgdzogMTIsIGg6IDQgfSxcbiAgICB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Rhc2hib2FyZHMvc2FsZXMuZGFzaGJvYXJkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Rhc2hib2FyZHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGFzaGJvYXJkcy9zYWxlcy5kYXNoYm9hcmQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRGFzaGJvYXJkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuaW1wb3J0IHsgYXZnRGVhbFNpemVNZXRyaWNXaWRnZXQsIHBpcGVsaW5lQnlTdGFnZUZ1bm5lbFdpZGdldCB9IGZyb20gJy4vc2hhcmVkLXdpZGdldHMnO1xuXG4vKipcbiAqIFNhbGVzIFBlcmZvcm1hbmNlIERhc2hib2FyZFxuICpcbiAqIFBpcGVsaW5lIGFuYWx5dGljcywgd2luIHJhdGUgdHJlbmRzLCBhbmQgcmVwIHBlcmZvcm1hbmNlIGZvciB0aGUgc2FsZXMgdGVhbS5cbiAqIE1vZGVsZWQgYWZ0ZXIgdGhlIHBvbGlzaGVkIENSTSBkYXNoYm9hcmQgcmVmZXJlbmNlIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vb2JqZWN0c3RhY2stYWkvb2JqZWN0dWkvdHJlZS9tYWluL2V4YW1wbGVzL2NybS5cbiAqXG4gKiBObyBLUEkgdGlsZSBkZWNsYXJlcyBhIGB0cmVuZGAuIEEgcGVyaW9kLW92ZXItcGVyaW9kIGRlbHRhIGlzIGEgbWVhc3VyZW1lbnQsXG4gKiBzbyBpdCBoYXMgdG8gY29tZSBmcm9tIGEgcmVhbCBjb21wYXJpc29uIHF1ZXJ5ICh3aWRnZXQgYGNvbXBhcmVUb2ApIG9uY2UgdGhlXG4gKiByZW5kZXJlciBzdXBwb3J0cyBpdCBmb3IgZGF0YXNldCBtZXRyaWNzIFx1MjAxNCB0aGUgcGVyY2VudGFnZXMgdGhpcyBmaWxlIHVzZWQgdG9cbiAqIGNhcnJ5IHdlcmUgdHlwZWQgYnkgaGFuZCBhbmQgcmVjb21wdXRlZCBieSBub3RoaW5nLCBzbyB0aGV5IGtlcHQgYXNzZXJ0aW5nXG4gKiB0aGUgc2FtZSBcIis4LjQlIHZzIGxhc3QgcXVhcnRlclwiIG9uIGFueSBkYXRhLCBpbmNsdWRpbmcgYW4gZW1wdHkgZGF0YWJhc2UuXG4gKiBTYW1lIHJ1bGUgYXMgdGhlIGV4ZWN1dGl2ZSBkYXNoYm9hcmQgKCM1MDAsICM1ODcpLlxuICovXG5leHBvcnQgY29uc3QgU2FsZXNEYXNoYm9hcmQ6IERhc2hib2FyZCA9IHtcbiAgbmFtZTogJ3NhbGVzX2Rhc2hib2FyZCcsXG4gIGxhYmVsOiAnU2FsZXMgUGVyZm9ybWFuY2UnLFxuICBkZXNjcmlwdGlvbjogJ1BpcGVsaW5lIGFuYWx5dGljcywgd2luIHJhdGUgdHJlbmRzLCBhbmQgcmVwIHBlcmZvcm1hbmNlJyxcblxuICBjb2x1bW5zOiAxMixcbiAgZ2FwOiA0LFxuICByZWZyZXNoSW50ZXJ2YWxTZWNvbmRzOiAxODAsIC8vIDMgbWludXRlc1xuXG4gIGhlYWRlcjoge1xuICAgIHNob3dUaXRsZTogdHJ1ZSxcbiAgICAvLyBLZWVwIHRoZSBvcGVuaW5nIEtQSSByb3cgaW4gdGhlIGZpcnN0IHZpZXdwb3J0IGZvciBhIGxpdmUgZGVtby4gVGhlXG4gICAgLy8gZGVzY3JpcHRpb24gcmVtYWlucyBhdmFpbGFibGUgaW4gZGFzaGJvYXJkIG1ldGFkYXRhIGFuZCB0cmFuc2xhdGlvbnMuXG4gICAgc2hvd0Rlc2NyaXB0aW9uOiBmYWxzZSxcbiAgICAvLyBIZWFkZXIgYWN0aW9uIGJ1dHRvbnMgcmVtb3ZlZDogYGNyZWF0ZV9vcHBvcnR1bml0eWAgLyBgZXhwb3J0X2Rhc2hib2FyZF9wZGZgXG4gICAgLy8gYXJlIG5vdCBkZWZpbmVkIGFjdGlvbnMsIGFuZCBgL3JlcG9ydHMvZm9yZWNhc3RgIG1hdGNoZXMgbm8gcmVwb3J0IHJvdXRlIFx1MjAxNFxuICAgIC8vIGFsbCB0aHJlZSB3ZXJlIGRlYWQuIFJlLWFkZCByZWFsLCB3aXJlZC11cCBhY3Rpb25zIGhlcmUgd2hlbiBhdmFpbGFibGUuXG4gIH0sXG5cbiAgZGF0ZVJhbmdlOiB7XG4gICAgZmllbGQ6ICdjbG9zZV9kYXRlJyxcbiAgICBkZWZhdWx0UmFuZ2U6ICd0aGlzX3F1YXJ0ZXInLFxuICAgIGFsbG93Q3VzdG9tUmFuZ2U6IHRydWUsXG4gIH0sXG5cbiAgZ2xvYmFsRmlsdGVyczogW1xuICAgIHtcbiAgICAgIGZpZWxkOiAnb3duZXJfaWQnLFxuICAgICAgbGFiZWw6IHsgZW46ICdTYWxlcyBSZXAnLCAnemgtQ04nOiAnXHU5NTAwXHU1NTJFXHU0RUUzXHU4ODY4JywgJ2VzLUVTJzogJ1JlcHJlc2VudGFudGUgZGUgVmVudGFzJywgJ2phLUpQJzogJ1x1NTVCNlx1Njk2RFx1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgc2NvcGU6ICdkYXNoYm9hcmQnLFxuICAgICAgb3B0aW9uc0Zyb206IHsgb2JqZWN0OiAnc3lzX3VzZXInLCB2YWx1ZUZpZWxkOiAnaWQnLCBsYWJlbEZpZWxkOiAnbmFtZScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZpZWxkOiAndHlwZScsXG4gICAgICBsYWJlbDogeyBlbjogJ0RlYWwgVHlwZScsICd6aC1DTic6ICdcdTU1NDZcdTY3M0FcdTdDN0JcdTU3OEInLCAnZXMtRVMnOiAnVGlwbyBkZSBPcG9ydHVuaWRhZCcsICdqYS1KUCc6ICdcdTU1NDZcdThBQzdcdTMwQkZcdTMwQTRcdTMwRDcnIH0sXG4gICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgIHNjb3BlOiAnZGFzaGJvYXJkJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyB2YWx1ZTogJ25ld19idXNpbmVzcycsICAgICAgIGxhYmVsOiB7IGVuOiAnTmV3IEJ1c2luZXNzJywgJ3poLUNOJzogJ1x1NjVCMFx1NEUxQVx1NTJBMScsICdlcy1FUyc6ICdOdWV2byBOZWdvY2lvJywgJ2phLUpQJzogJ1x1NjVCMFx1ODk4Rlx1MzBEM1x1MzBCOFx1MzBDRFx1MzBCOScgfSB9LFxuICAgICAgICB7IHZhbHVlOiAnZXhpc3RpbmdfdXBncmFkZScsICAgbGFiZWw6IHsgZW46ICdFeGlzdGluZyBDdXN0b21lciAtIFVwZ3JhZGUnLCAnemgtQ04nOiAnXHU4MDAxXHU1QkEyXHU2MjM3XHU1MzQ3XHU3RUE3JywgJ2VzLUVTJzogJ0NsaWVudGUgRXhpc3RlbnRlIC0gTWVqb3JhJywgJ2phLUpQJzogJ1x1NjVFMlx1NUI1OFx1OTg2N1x1NUJBMiAtIFx1MzBBMlx1MzBDM1x1MzBEN1x1MzBCMFx1MzBFQ1x1MzBGQ1x1MzBDOScgfSB9LFxuICAgICAgICB7IHZhbHVlOiAnZXhpc3RpbmdfcmVuZXdhbCcsICAgbGFiZWw6IHsgZW46ICdFeGlzdGluZyBDdXN0b21lciAtIFJlbmV3YWwnLCAnemgtQ04nOiAnXHU4MDAxXHU1QkEyXHU2MjM3XHU3RUVEXHU3RUE2JywgJ2VzLUVTJzogJ0NsaWVudGUgRXhpc3RlbnRlIC0gUmVub3ZhY2lcdTAwRjNuJywgJ2phLUpQJzogJ1x1NjVFMlx1NUI1OFx1OTg2N1x1NUJBMiAtIFx1NjZGNFx1NjVCMCcgfSB9LFxuICAgICAgICB7IHZhbHVlOiAnZXhpc3RpbmdfZXhwYW5zaW9uJywgbGFiZWw6IHsgZW46ICdFeGlzdGluZyBDdXN0b21lciAtIEV4cGFuc2lvbicsICd6aC1DTic6ICdcdTgwMDFcdTVCQTJcdTYyMzdcdTYyRDNcdTVDNTUnLCAnZXMtRVMnOiAnQ2xpZW50ZSBFeGlzdGVudGUgLSBFeHBhbnNpXHUwMEYzbicsICdqYS1KUCc6ICdcdTY1RTJcdTVCNThcdTk4NjdcdTVCQTIgLSBcdTYyRTFcdTU5MjcnIH0gfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXSxcblxuICB3aWRnZXRzOiBbXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyAxOiBQaXBlbGluZSBLUElzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGlkOiAndG90YWxfcGlwZWxpbmVfdmFsdWUnLFxuICAgICAgdGl0bGU6ICdUb3RhbCBQaXBlbGluZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1N1bSBvZiBvcGVuIG9wcG9ydHVuaXR5IHZhbHVlJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiB7ICRuaW46IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0gfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsndG90YWxfYW1vdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMCwgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdjbG9zZWRfd29uX3F0ZCcsXG4gICAgICB0aXRsZTogJ0Nsb3NlZCBXb24gKFFURCknLFxuICAgICAgZGVzY3JpcHRpb246ICdSZXZlbnVlIGNsb3NlZCB0aGlzIHF1YXJ0ZXInLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfd29uJywgY2xvc2VfZGF0ZTogeyAkZ3RlOiAne2N1cnJlbnRfcXVhcnRlcl9zdGFydH0nIH0gfSxcbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UgfSwgLy8gc2VsZi1zY29wZWQgdG8gUVREIFx1MjAxNCB0aGUgZGF0ZSBwaWNrZXIgbXVzdCBub3QgcmUtd2luZG93IGl0XG4gICAgICBjb2xvclZhcmlhbnQ6ICdzdWNjZXNzJyxcbiAgICAgIGRhdGFzZXQ6ICdvcHBvcnR1bml0eV9tZXRyaWNzJywgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDMsIHk6IDAsIHc6IDMsIGg6IDIgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnb3Blbl9vcHBvcnR1bml0aWVzJyxcbiAgICAgIHRpdGxlOiAnT3BlbiBPcHBvcnR1bml0aWVzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQWN0aXZlIGRlYWxzIGluIGZsaWdodCcsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGZpbHRlcjogeyBzdGFnZTogeyAkbmluOiBbJ2Nsb3NlZF93b24nLCAnY2xvc2VkX2xvc3QnXSB9IH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdvcmFuZ2UnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsnb3BwX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogNiwgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAgYXZnRGVhbFNpemVNZXRyaWNXaWRnZXQoeyB4OiA5LCB5OiAwLCB3OiAzLCBoOiAyIH0sIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQXZlcmFnZSB2YWx1ZSBvZiBjbG9zZWQtd29uIGRlYWxzIHRoaXMgcXVhcnRlcicsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfd29uJywgY2xvc2VfZGF0ZTogeyAkZ3RlOiAne2N1cnJlbnRfcXVhcnRlcl9zdGFydH0nIH0gfSxcbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UgfSwgLy8gc2VsZi1zY29wZWQgdG8gUVREIFx1MjAxNCB0aGUgZGF0ZSBwaWNrZXIgbXVzdCBub3QgcmUtd2luZG93IGl0XG4gICAgICBjb2xvclZhcmlhbnQ6ICdwdXJwbGUnLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyAyOiBXaW4gLyBMb3NzIEtQSXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBUaGUgcmF0aW8gYW5kIGl0cyB0d28gaW5wdXRzIHNpdCBzaWRlIGJ5IHNpZGUgT04gUFVSUE9TRSAoIzU5MykuIEEgd2luXG4gICAgLy8gcmF0ZSBpcyB0aGUgZmFpbHVyZSBtb2RlICM2MTQgc2hpcHBlZDogYSB3cm9uZyBkZW5vbWluYXRvciByYWlzZXMgbm9cbiAgICAvLyBlcnJvciwgaXQganVzdCBwcmludHMgYSBwbGF1c2libGUgcGVyY2VudGFnZS4gU2hvd2luZyBcIjYyJVwiIG5leHQgdG9cbiAgICAvLyBcIjggd29uXCIgYW5kIFwiNSBsb3N0XCIgbWVhbnMgYSByZWFkZXIgY2FuIGNoZWNrIHRoZSBhcml0aG1ldGljIGF0IGFcbiAgICAvLyBnbGFuY2UsIGFuZCBhIGhhbGYgdGhhdCBzaWxlbnRseSBsb3NlcyBpdHMgZmlsdGVyIHN0b3BzIGJlaW5nIGludmlzaWJsZS5cbiAgICAvL1xuICAgIC8vIEFsbCB0aHJlZSB3aW5kb3dzIGFyZSB0aGUgc2FtZSBzZWxmLXNjb3BlZCAxMiBtb250aHMgKGBkYXRlUmFuZ2U6IGZhbHNlYFxuICAgIC8vIHNvIHRoZSBoZWFkZXIncyBkYXRlIHBpY2tlciBjYW5ub3QgcmUtd2luZG93IG9uZSBvZiB0aGVtIGFuZCBub3QgdGhlXG4gICAgLy8gb3RoZXJzIFx1MjAxNCB0aHJlZSB0aWxlcyBvdmVyIHRocmVlIGRpZmZlcmVudCB3aW5kb3dzIHdvdWxkIGJlIHdvcnNlIHRoYW5cbiAgICAvLyBubyB0aWxlcyBhdCBhbGwpLlxuICAgIHtcbiAgICAgIC8vIE5PVEU6IG5vIGBzdGFnZWAgZmlsdGVyIGhlcmUsIGFuZCB0aGF0IGlzIGRlbGliZXJhdGUuIEJvdGggaGFsdmVzIG9mXG4gICAgICAvLyB0aGUgcmF0aW8gY29tZSBmcm9tIHRoZSBEQVRBU0VUJ3Mgb3duIG1lYXN1cmUgZmlsdGVycyBcdTIwMTQgYHdvbl9jb3VudGBcbiAgICAgIC8vIG92ZXIgY2xvc2VkX3dvbiwgYGRlY2lkZWRfY291bnRgIG92ZXIgY2xvc2VkX3dvbiArIGNsb3NlZF9sb3N0IFx1MjAxNCBzb1xuICAgICAgLy8gb3BlbiBwaXBlbGluZSBpcyBleGNsdWRlZCBieSB0aGUgbWVhc3VyZXMuIEEgd2lkZ2V0LWxldmVsXG4gICAgICAvLyBgc3RhZ2U6IHskaW46IFsuLi5dfWAgZmlsdGVyIHdvdWxkIG5hcnJvdyBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yXG4gICAgICAvLyBhbGlrZSwgd2hpY2ggaXMgaG93IGEgcmF0aW8gcXVpZXRseSBiZWNvbWVzIGEgZGl2aXNpb24gYnkgaXRzZWxmLlxuICAgICAgaWQ6ICd3aW5fcmF0ZV8xMm0nLFxuICAgICAgdGl0bGU6ICdXaW4gUmF0ZSAoMTJNKScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0RlYWxzIHdvbiBhcyBhIHNoYXJlIG9mIGFsbCBkZWFscyBzZXR0bGVkIGluIHRoZSBsYXN0IDEyIG1vbnRocycsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGZpbHRlcjogeyBjbG9zZV9kYXRlOiB7ICRndGU6ICd7MTJfbW9udGhzX2Fnb30nIH0gfSxcbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ3N1Y2Nlc3MnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsnd2luX3JhdGUnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAyLCB3OiA0LCBoOiAyIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ3dvbl9kZWFsc18xMm0nLFxuICAgICAgdGl0bGU6ICdEZWFscyBXb24gKDEyTSknLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgbnVtZXJhdG9yIG9mIHRoZSB3aW4gcmF0ZScsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGZpbHRlcjogeyBjbG9zZV9kYXRlOiB7ICRndGU6ICd7MTJfbW9udGhzX2Fnb30nIH0gfSxcbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsnd29uX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogNCwgeTogMiwgdzogNCwgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdsb3N0X2RlYWxzXzEybScsXG4gICAgICB0aXRsZTogJ0RlYWxzIExvc3QgKDEyTSknLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgb3RoZXIgaGFsZiBvZiB0aGUgd2luLXJhdGUgZGVub21pbmF0b3InLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgY2xvc2VfZGF0ZTogeyAkZ3RlOiAnezEyX21vbnRoc19hZ299JyB9IH0sXG4gICAgICBmaWx0ZXJCaW5kaW5nczogeyBkYXRlUmFuZ2U6IGZhbHNlIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdvcmFuZ2UnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsnbG9zdF9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDgsIHk6IDIsIHc6IDQsIGg6IDIgfSxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyAzOiBQaXBlbGluZSAmIFRyZW5kcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBwaXBlbGluZUJ5U3RhZ2VGdW5uZWxXaWRnZXQoeyB4OiAwLCB5OiA0LCB3OiA2LCBoOiA0IH0pLFxuICAgIHtcbiAgICAgIGlkOiAnbW9udGhseV9yZXZlbnVlX3RyZW5kJyxcbiAgICAgIHRpdGxlOiAnTW9udGhseSBSZXZlbnVlIFRyZW5kJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2xvc2VkLXdvbiByZXZlbnVlLCBsYXN0IDEyIG1vbnRocycsXG4gICAgICB0eXBlOiAnYXJlYScsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfd29uJywgY2xvc2VfZGF0ZTogeyAkZ3RlOiAnezEyX21vbnRoc19hZ299JyB9IH0sXG4gICAgICBmaWx0ZXJCaW5kaW5nczogeyBkYXRlUmFuZ2U6IGZhbHNlIH0sIC8vIHNlbGYtc2NvcGVkIHRvIDEyIG1vbnRocyBcdTIwMTQgdGhlIGRhdGUgcGlja2VyIG11c3Qgbm90IG5hcnJvdyBpdFxuICAgICAgY29sb3JWYXJpYW50OiAnc3VjY2VzcycsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnY2xvc2VfZGF0ZSddLCB2YWx1ZXM6IFsndG90YWxfYW1vdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogNiwgeTogNCwgdzogNiwgaDogNCB9LFxuICAgICAgY2hhcnRDb25maWc6IHtcbiAgICAgICAgc2hvd0xlZ2VuZDogZmFsc2UsXG4gICAgICAgIHNob3dEYXRhTGFiZWxzOiBmYWxzZSxcbiAgICAgICAgY29sb3JzOiBbJyMxMEI5ODEnXSxcbiAgICAgICAgLy8gTm8gcXVvdGEgYW5ub3RhdGlvbiBsaW5lOiBDaGFydEFubm90YXRpb25TY2hlbWEgb25seSB0YWtlcyBhIFNUQVRJQ1xuICAgICAgICAvLyB2YWx1ZSwgYW5kIHRoZSByZWFsIHF1b3RhcyBsaXZlIHBlci1vd25lci9wZXItcGVyaW9kIGluXG4gICAgICAgIC8vIGNybV9mb3JlY2FzdC5xdW90YSAoc2VlZGVkIDUwMGtcdTIwMTMxLjVNIFx1MjAxNCB0aGUgb2xkIGhhcmRjb2RlZCAxMDAwMDAgd2FzXG4gICAgICAgIC8vIGZpY3Rpb24pLiBRdW90YSB2cy4gYWN0dWFsIGlzIHRoZSBxdW90YV9hdHRhaW5tZW50X2J5X3JlcCB0YWJsZVxuICAgICAgICAvLyBiZWxvdywgYm91bmQgdG8gdGhlIGZvcmVjYXN0X21ldHJpY3MgZGF0YXNldC5cbiAgICAgICAgaW50ZXJhY3Rpb246IHsgdG9vbHRpcHM6IHRydWUsIGJydXNoOiB0cnVlIH0sXG4gICAgICB9LFxuICAgICAgb3B0aW9uczogeyBkYXRlR3JhbnVsYXJpdHk6ICdtb250aCcgfSxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyA0OiBQZXJmb3JtYW5jZSBCcmVha2Rvd24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgaWQ6ICdwaXBlbGluZV9ieV9mb3JlY2FzdF9jYXRlZ29yeScsXG4gICAgICB0aXRsZTogJ1BpcGVsaW5lIGJ5IEZvcmVjYXN0IENhdGVnb3J5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3BlbiBwaXBlbGluZSBncm91cGVkIGJ5IHNhbGVzIGZvcmVjYXN0IGNhdGVnb3J5JyxcbiAgICAgIHR5cGU6ICdob3Jpem9udGFsLWJhcicsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6IHsgJG5pbjogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnYmx1ZScsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnZm9yZWNhc3RfY2F0ZWdvcnknXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDgsIHc6IDYsIGg6IDQgfSxcbiAgICAgIGNoYXJ0Q29uZmlnOiB7XG4gICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlLFxuICAgICAgICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgICAgICAgY29sb3JzOiBbJyM0RjQ2RTUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2xlYWRfc291cmNlX2JyZWFrZG93bicsXG4gICAgICB0aXRsZTogJ0xlYWQgU291cmNlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnV2hlcmUgb3VyIHBpcGVsaW5lIGlzIGNvbWluZyBmcm9tJyxcbiAgICAgIHR5cGU6ICdkb251dCcsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6IHsgJG5pbjogWydjbG9zZWRfbG9zdCddIH0gfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ3B1cnBsZScsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnbGVhZF9zb3VyY2UnXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDYsIHk6IDgsIHc6IDYsIGg6IDQgfSxcbiAgICAgIGNoYXJ0Q29uZmlnOiB7XG4gICAgICAgIHNob3dMZWdlbmQ6IHRydWUsXG4gICAgICAgIHNob3dEYXRhTGFiZWxzOiB0cnVlLFxuICAgICAgICBjb2xvcnM6IFsnIzRGNDZFNScsICcjMDZCNkQ0JywgJyMxMEI5ODEnLCAnI0Y1OUUwQicsICcjRUY0NDQ0JywgJyM4QjVDRjYnXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSb3cgNTogUmVwIExlYWRlcmJvYXJkIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vIEEgZGFzaGJvYXJkIGB0YWJsZWAgYmluZHMgdG8gYW4gYW5hbHl0aWNzIGN1YmUgYW5kIGFnZ3JlZ2F0ZXM7IGl0IGNhbm5vdFxuICAgIC8vIGxpc3QgcmF3IGRlYWxzIChBRFItMDAyMSkuIFRoZSBwcmV2aW91cyBcIlRvcCBPcGVuIE9wcG9ydHVuaXRpZXNcIiB0YWJsZVxuICAgIC8vIHNlbGVjdGVkIG9ubHkgYG9wcF9jb3VudGAgd2l0aCBubyBkaW1lbnNpb24gXHUyMDE0IG9uZSBzdW1tYXJ5IHJvdywgbm90IGEgZGVhbFxuICAgIC8vIHJhbmtpbmcuIEdyb3VwaW5nIG9wZW4gcGlwZWxpbmUgYnkgb3duZXIgeWllbGRzIGEgcmVwIGxlYWRlcmJvYXJkIChvbmVcbiAgICAvLyByb3cgcGVyIHJlcCkuIEZvciBhIHBlci1kZWFsIGxpc3QsIHN1cmZhY2UgYW4gb2JqZWN0LWJvdW5kIExpc3RWaWV3XG4gICAgLy8gdGhyb3VnaCBhcHAgbmF2aWdhdGlvbiAoQURSLTAwMTcpLlxuICAgIHtcbiAgICAgIGlkOiAnb3Blbl9waXBlbGluZV9ieV9vd25lcicsXG4gICAgICB0aXRsZTogJ09wZW4gUGlwZWxpbmUgYnkgT3duZXInLFxuICAgICAgZGVzY3JpcHRpb246ICdJbi1mbGlnaHQgcGlwZWxpbmUgdmFsdWUsIGRlYWwgY291bnQgYW5kIGF2ZyB3aW4gcHJvYmFiaWxpdHkgcGVyIHJlcCcsXG4gICAgICB0eXBlOiAndGFibGUnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiB7ICRuaW46IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0gfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2RlZmF1bHQnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCBkaW1lbnNpb25zOiBbJ293bmVyJ10sIHZhbHVlczogWyd0b3RhbF9hbW91bnQnLCAnb3BwX2NvdW50JywgJ2F2Z19wcm9iYWJpbGl0eSddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDEyLCB3OiAxMiwgaDogNCB9LFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBzb3J0Qnk6ICd0b3RhbF9hbW91bnQnLFxuICAgICAgICBzb3J0T3JkZXI6ICdkZXNjJyxcbiAgICAgICAgbGltaXQ6IDEwLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyA2OiBRdW90YSBBdHRhaW5tZW50IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vIFRoZSByZWFsIHBlci1yZXAgcXVvdGEgZGF0YSAoY3JtX2ZvcmVjYXN0LnF1b3RhKSBzdXJmYWNlZCBhcyBhIHRhYmxlOlxuICAgIC8vIGRhc2hib2FyZCBjaGFydCBhbm5vdGF0aW9ucyBjYW5ub3QgcmVmZXJlbmNlIGEgZGF0YXNldCAoc3RhdGljIHZhbHVlc1xuICAgIC8vIG9ubHkpLCBzbyBxdW90YSB2cy4gYWN0dWFsIGdldHMgaXRzIG93biB3aWRnZXQgaW5zdGVhZCBvZiBhIGZha2UgbGluZS5cbiAgICB7XG4gICAgICBpZDogJ3F1b3RhX2F0dGFpbm1lbnRfYnlfcmVwJyxcbiAgICAgIHRpdGxlOiAnUXVvdGEgQXR0YWlubWVudCBieSBSZXAnLFxuICAgICAgZGVzY3JpcHRpb246ICdDdXJyZW50LXF1YXJ0ZXIgcXVvdGEsIGNsb3NlZCByZXZlbnVlIGFuZCBhdHRhaW5tZW50IHBlciByZXAsIGZyb20gZm9yZWNhc3Qgc25hcHNob3RzJyxcbiAgICAgIHR5cGU6ICd0YWJsZScsXG4gICAgICBjb2xvclZhcmlhbnQ6ICdkZWZhdWx0JyxcbiAgICAgIC8vIGNybV9mb3JlY2FzdCBoYXMgbmVpdGhlciBgY2xvc2VfZGF0ZWAgbm9yIGB0eXBlYDsgb3B0IG91dCBvZiB0aGVcbiAgICAgIC8vIGRhc2hib2FyZCBmaWx0ZXJzIGJvdW5kIHRvIHRob3NlIGZpZWxkcyAoZnJhbWV3b3JrIzI1MDEgaW5qZWN0cyBldmVyeVxuICAgICAgLy8gZGFzaGJvYXJkIGZpbHRlciBpbnRvIGVhY2ggd2lkZ2V0IHF1ZXJ5KS4gYG93bmVyYCBleGlzdHMgYW5kIGFwcGxpZXMuXG4gICAgICBmaWx0ZXJCaW5kaW5nczogeyBkYXRlUmFuZ2U6IGZhbHNlLCB0eXBlOiBmYWxzZSB9LFxuICAgICAgLy8gT05FIHBlcmlvZCwgb3IgdGhlIG51bWJlcnMgYXJlIG5vbnNlbnNlICgjNjE0KS4gYGNybV9mb3JlY2FzdGAgaG9sZHMgYVxuICAgICAgLy8gcm93IHBlciBvd25lciBQRVIgUEVSSU9ELCBhbmQgYHF1b3RhX3N1bWAgLyBgY2xvc2VkX3N1bWAgYXJlIHBsYWluXG4gICAgICAvLyBgc3VtYCBtZWFzdXJlcyBcdTIwMTQgc28gYW4gdW5waW5uZWQgcXVlcnkgYWRkcyB0aGlzIHF1YXJ0ZXIncyBxdW90YSB0byB0aGlzXG4gICAgICAvLyBtb250aCdzIHF1b3RhIHRvIGV2ZXJ5IHNldHRsZWQgcXVhcnRlcidzIHF1b3RhIGFuZCBsYWJlbHMgdGhlIHRvdGFsXG4gICAgICAvLyBcIlF1b3RhXCIuIE9uIHRoZSBzaGlwcGVkIHNlZWRzIHRoYXQgdHVybmVkIGEgcmVwJ3MgcmVhbCAxLDUwMCwwMDBcbiAgICAgIC8vIHF1YXJ0ZXJseSBxdW90YSBpbnRvIDcsOTQwLDAwMCwgd2l0aCBhdHRhaW5tZW50IHdyb25nIGJ5IHRoZSBzYW1lXG4gICAgICAvLyBjb25zdHJ1Y3Rpb24gKDg5JSBpbnN0ZWFkIG9mIDU1JSkuXG4gICAgICAvL1xuICAgICAgLy8gQm90aCBoYWx2ZXMgb2YgdGhlIGtleSBhcmUgbmVlZGVkLiBgcGVyaW9kOiAncXVhcnRlcidgIGFsb25lIHN0aWxsIHN1bXNcbiAgICAgIC8vIGV2ZXJ5IHF1YXJ0ZXIgZXZlciBzbmFwc2hvdHRlZDsgYHBlcmlvZF9zdGFydGAgYWxvbmUgc3RpbGwgbWVyZ2VzIHRoZVxuICAgICAgLy8gcXVhcnRlciByb3cgd2l0aCB0aGUgbW9udGggcm93IHRoYXQgb3BlbnMgdGhlIHNhbWUgcXVhcnRlciAoUTMgYW5kIEp1bHlcbiAgICAgIC8vIGJvdGggc3RhcnQgb24gdGhlIDFzdCkuIFRvZ2V0aGVyIHRoZXkgbmFtZSBleGFjdGx5IG9uZSBzbmFwc2hvdCBwZXJcbiAgICAgIC8vIG93bmVyIFx1MjAxNCB0aGUgc2FtZSAob3duZXIsIHBlcmlvZCwgcGVyaW9kX3N0YXJ0KSB0dXBsZSB0aGUgc25hcHNob3Qgc3dlZXBcbiAgICAgIC8vIHVwc2VydHMgb24gYW5kIHRoZSBvYmplY3QgaW5kZXhlcy5cbiAgICAgIC8vXG4gICAgICAvLyBge2N1cnJlbnRfcXVhcnRlcl9zdGFydH1gIGlzIHJlc29sdmVkIGJ5IHRoZSBBTkFMWVRJQ1MgcGF0aCwgdmVyaWZpZWRcbiAgICAgIC8vIHJhdGhlciB0aGFuIGFzc3VtZWQ6IGBxdWVyeURhdGFzZXRgIHJ1bnMgYm90aCB0aGUgZGF0YXNldCBmaWx0ZXIgYW5kIHRoZVxuICAgICAgLy8gd2lkZ2V0J3MgYHJ1bnRpbWVGaWx0ZXJgIHRocm91Z2ggYHJlc29sdmVGaWx0ZXJUb2tlbnNgLCB3aGljaFxuICAgICAgLy8gdW5kZXJzdGFuZHMgYHsoY3VycmVudHxsYXN0fG5leHQpXyh3ZWVrfG1vbnRofHF1YXJ0ZXJ8eWVhcilfKHN0YXJ0fGVuZCl9YFxuICAgICAgLy8gYW5kIHRocm93cyBgRklMVEVSX1RPS0VOX1VOS05PV05gIG9uIGFueXRoaW5nIGVsc2UuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIExJU1QgcGF0aCByZXNvbHZlcyB0aGUgc2FtZSBtYWNyb3MsIGFuZCBoYXMgc2luY2UgMTcuMC4wLXJjLjA6XG4gICAgICAvLyBgcmVzb2x2ZUZpbHRlclRva2VucygpYCB3YXMgd2lyZWQgaW50byB0aGUgT2JqZWN0UUwgUkVBRCBwYXRoIChvYmplY3RxbFxuICAgICAgLy8gYGZlYXQoZmlsdGVycyk6IGV2YWx1YXRlIHtmaWx0ZXItdG9rZW59IHBsYWNlaG9sZGVycyBzZXJ2ZXItc2lkZWAsXG4gICAgICAvLyAjMzU4MikgYWhlYWQgb2YgdGhlIG1pZGRsZXdhcmUgY2hhaW4sIGNvdmVyaW5nIGBmaW5kYCAvIGBmaW5kT25lYCAvXG4gICAgICAvLyBgY291bnRgIC8gYGFnZ3JlZ2F0ZWAgXHUyMDE0IHRoZSBvbmUgZ2F0ZSBldmVyeSBzZXJ2ZXItc2lkZSByZWFkIHBhc3Nlc1xuICAgICAgLy8gdGhyb3VnaCwgc2F2ZWQtdmlldyBmaWx0ZXJzIGluY2x1ZGVkLiBTbyB0aGlzIHdpZGdldCdzIGZpbHRlciBhbmQgYVxuICAgICAgLy8gc2F2ZWQgdmlldydzIGZpbHRlciBub3cgcmVhZCB0aGUgc2FtZSB3YXksIGFuZCB0aGUgc2libGluZ1xuICAgICAgLy8gYHRoaXNfcXVhcnRlcl9mb3JlY2FzdHNgIGluIGBzcmMvc2FsZXMvdmlld3MvZm9yZWNhc3Qudmlldy50c2AgcGlucyB0aGlzIHNhbWVcbiAgICAgIC8vIHF1YXJ0ZXIgd2l0aCB0aGlzIHNhbWUgbWFjcm8uIE1lYXN1cmVkLCBub3QgaW5mZXJyZWQ6XG4gICAgICAvLyBgdGVzdC9mb3JlY2FzdC1jdXJyZW50LXF1YXJ0ZXItdmlldy50ZXN0LnRzYCBydW5zIGJvdGggZmlsdGVyIHNoYXBlcyBcdTIwMTRcbiAgICAgIC8vIHRoZSBgcGVyaW9kX3N0YXJ0YCBlcXVhbGl0eSAoIzczMCkgYW5kIHRoZSBgY2xvc2VfZGF0ZWAgcmFuZ2UgKCM3NDMpIFx1MjAxNFxuICAgICAgLy8gdGhyb3VnaCBhIHJlYWwgZW5naW5lIGFuZCBwaW5zIGEgdGhyZWUtd2F5IG91dGNvbWUgKGN1cnJlbnQgcXVhcnRlclxuICAgICAgLy8gb25seTogbm90IHplcm8gcm93cywgbm90IGV2ZXJ5IHF1YXJ0ZXIpLiBGaXJzdCB0YWtlbiBvbiAxNy4wLjAtcmMuMjtcbiAgICAgIC8vIFJFLVJVTiAyMDI2LTA5LTAzIG9uIDE3LjIuMCAoIzE0NjcpLCBSRS1SVU4gb24gMTcuMy4wICgjMTY3NiwgdGhlIFBSXG4gICAgICAvLyAjMTU3NyBwaW4pIGFuZCBSRS1SVU4gYWdhaW4gb24gMTcuNC4wIChQUiAjMTgxNCwgIzE4MDcpIFx1MjAxNCBncmVlbiBhbGxcbiAgICAgIC8vIGZvdXIgdGltZXMsIHNvIHRoZSBvdXRjb21lIGhlbGQgb24gZXZlcnkgcGluIGl0IHdhcyB0YWtlbiBvbiwgbm90XG4gICAgICAvLyBvbmx5IHRoZSBmaXJzdC4gTm90IHlldCByZS1ydW4gb24gMTcuNS4wLlxuICAgICAgLy9cbiAgICAgIC8vIFdoYXQgc3Rvb2QgaGVyZSBiZWZvcmUgZGVzY3JpYmVkIHRoZSB0d28gcGF0aHMgYXMgYXN5bW1ldHJpYyBhbmQgdG9sZFxuICAgICAgLy8gdGhlIG5leHQgYXV0aG9yIG5vdCB0byBnZW5lcmFsaXNlIGJldHdlZW4gdGhlbS4gVGhhdCB3YXMgdHJ1ZSBvblxuICAgICAgLy8gQG9iamVjdHN0YWNrIDE2LjEuMCBhbmQgZXhwaXJlZCBhdCByYy4wICgjNzQ0KS5cbiAgICAgIC8vXG4gICAgICAvLyBDb3N0IG9mIHBpbm5pbmcgdG8gdGhlIENVUlJFTlQgcXVhcnRlciByYXRoZXIgdGhhbiB0aGUgbGF0ZXN0IG9uZTogZm9yXG4gICAgICAvLyB0aGUgZmV3IGhvdXJzIGJldHdlZW4gYSBxdWFydGVyIGJvdW5kYXJ5IGFuZCB0aGUgMDM6MDAgc3dlZXAgdGhhdCBvcGVuc1xuICAgICAgLy8gdGhlIG5ldyByb3csIHRoZSB0YWJsZSBpcyBlbXB0eS4gRW1wdHkgaXMgdGhlIGhvbmVzdCBzdGF0ZSBcdTIwMTQgdGhlXG4gICAgICAvLyBhbHRlcm5hdGl2ZSByZW5kZXJzIGxhc3QgcXVhcnRlcidzIGF0dGFpbm1lbnQgdW5kZXIgYSBoZWFkZXIgdGhhdCBzYXlzXG4gICAgICAvLyB0aGlzIG9uZS5cbiAgICAgIGZpbHRlcjogeyBwZXJpb2Q6ICdxdWFydGVyJywgcGVyaW9kX3N0YXJ0OiAne2N1cnJlbnRfcXVhcnRlcl9zdGFydH0nIH0sXG4gICAgICBkYXRhc2V0OiAnZm9yZWNhc3RfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnb3duZXInXSwgdmFsdWVzOiBbJ3F1b3RhX3N1bScsICdjbG9zZWRfc3VtJywgJ2F0dGFpbm1lbnQnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAxNiwgdzogMTIsIGg6IDQgfSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgc29ydEJ5OiAnYXR0YWlubWVudCcsXG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuICAgICAgICBsaW1pdDogMTAsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgUm93IDc6IFdpbiAvIExvc3MgYW5hbHlzaXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBUaHJlZSB3aWRnZXRzIG92ZXIgdGhlIHNldHRsZWQgaGFsZiBvZiB0aGUgcGlwZWxpbmUgKCM1OTMpLiBFYWNoIG9mIHRoZVxuICAgIC8vIHR3byB3aW4tcmF0ZSBicmVha2Rvd25zIGlzIGEgVEFCTEUsIG5vdCBhIGJhciBjaGFydCwgYW5kIHRoYXQgaXMgdGhlXG4gICAgLy8gd2hvbGUgZGVzaWduOiBhIGJhciBvZiBcIjY3JVwiIGlzIHVuZmFsc2lmaWFibGUsIHdoZXJlYXMgYSByb3cgcmVhZGluZ1xuICAgIC8vIFwiV29uIDIgXHUwMEI3IExvc3QgMSBcdTAwQjcgU2V0dGxlZCAzIFx1MDBCNyA2NyVcIiBjYXJyaWVzIGl0cyBvd24gcHJvb2YuIFBlcnR1cmIgZWl0aGVyXG4gICAgLy8gaGFsZiBcdTIwMTQgd2luIGEgZGVhbCB0aGF0IHdhcyBsb3N0LCBvciBsb3NlIG9uZSB0aGF0IHdhcyB3b24gXHUyMDE0IGFuZCB0aHJlZSBvZlxuICAgIC8vIHRob3NlIGZvdXIgbnVtYmVycyBtb3ZlLiBgdGVzdC93aW4tbG9zcy1jYXB0dXJlLnRlc3QudHNgIGRvZXMgZXhhY3RseVxuICAgIC8vIHRoYXQgYWdhaW5zdCB0aGUgcmVhbCBkYXRhc2V0IGV4ZWN1dG9yIGFuZCB0aGUgcmVhbCBzZWVkcy5cbiAgICAvL1xuICAgIC8vIEJvdGggdGFibGVzIG9wdCBvdXQgb2YgdGhlIGhlYWRlcidzIGBjbG9zZV9kYXRlYCB3aW5kb3dcbiAgICAvLyAoYGRhdGVSYW5nZTogZmFsc2VgKSBmb3IgdGhlIHJlYXNvbiB0aGUgcXVvdGEgdGFibGUgZG9lczogYSB3aW4gcmF0ZSBvdmVyXG4gICAgLy8gXCJ0aGlzIHF1YXJ0ZXJcIiBvbiBhIGRlbW8gZGF0YWJhc2UgaXMgY29tcHV0ZWQgZnJvbSB3aGljaGV2ZXIgb25lIG9yIHR3b1xuICAgIC8vIGRlYWxzIGhhcHBlbiB0byBoYXZlIHNldHRsZWQgaW5zaWRlIGl0LCB3aGljaCBpcyBub2lzZSB3ZWFyaW5nIHRoZVxuICAgIC8vIGNvc3R1bWUgb2YgYSBLUEkuIFR3ZWx2ZSBtb250aHMgaXMgdGhlIHNhbWUgd2luZG93IHRoZSByb3ctMiB0aWxlcyBhbmRcbiAgICAvLyB0aGUgcmV2ZW51ZSB0cmVuZCB1c2UsIHNvIHRoZSBkYXNoYm9hcmQgdGVsbHMgb25lIGNvbnNpc3RlbnQgc3RvcnkuXG4gICAge1xuICAgICAgaWQ6ICd3aW5fcmF0ZV9ieV9vd25lcicsXG4gICAgICB0aXRsZTogJ1dpbiAvIExvc3MgYnkgUmVwJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGVhbHMgd29uLCBkZWFscyBsb3N0IGFuZCB3aW4gcmF0ZSBwZXIgcmVwIFx1MjAxNCBsYXN0IDEyIG1vbnRocycsXG4gICAgICB0eXBlOiAndGFibGUnLFxuICAgICAgZmlsdGVyOiB7IGNsb3NlX2RhdGU6IHsgJGd0ZTogJ3sxMl9tb250aHNfYWdvfScgfSB9LFxuICAgICAgZmlsdGVyQmluZGluZ3M6IHsgZGF0ZVJhbmdlOiBmYWxzZSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnZGVmYXVsdCcsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsXG4gICAgICBkaW1lbnNpb25zOiBbJ293bmVyJ10sXG4gICAgICB2YWx1ZXM6IFsnd29uX2NvdW50JywgJ2xvc3RfY291bnQnLCAnZGVjaWRlZF9jb3VudCcsICd3aW5fcmF0ZScsICd3b25fYW1vdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMCwgeTogMjAsIHc6IDYsIGg6IDQgfSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgc29ydEJ5OiAnZGVjaWRlZF9jb3VudCcsXG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuICAgICAgICBsaW1pdDogMTAsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICd3aW5fcmF0ZV9ieV9sZWFkX3NvdXJjZScsXG4gICAgICB0aXRsZTogJ1dpbiAvIExvc3MgYnkgTGVhZCBTb3VyY2UnLFxuICAgICAgZGVzY3JpcHRpb246ICdXaGljaCBzb3VyY2VzIHByb2R1Y2UgZGVhbHMgdGhhdCBhY3R1YWxseSBjbG9zZSBcdTIwMTQgbGFzdCAxMiBtb250aHMnLFxuICAgICAgdHlwZTogJ3RhYmxlJyxcbiAgICAgIGZpbHRlcjogeyBjbG9zZV9kYXRlOiB7ICRndGU6ICd7MTJfbW9udGhzX2Fnb30nIH0gfSxcbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2RlZmF1bHQnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLFxuICAgICAgZGltZW5zaW9uczogWydsZWFkX3NvdXJjZSddLFxuICAgICAgdmFsdWVzOiBbJ3dvbl9jb3VudCcsICdsb3N0X2NvdW50JywgJ2RlY2lkZWRfY291bnQnLCAnd2luX3JhdGUnLCAnd29uX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDYsIHk6IDIwLCB3OiA2LCBoOiA0IH0sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHNvcnRCeTogJ2RlY2lkZWRfY291bnQnLFxuICAgICAgICBzb3J0T3JkZXI6ICdkZXNjJyxcbiAgICAgICAgbGltaXQ6IDEyLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSBsb3NzLXJlYXNvbiBicmVha2Rvd24gdGhlIGZpZWxkcyB3ZXJlIGRlY2xhcmVkIGZvciBhbmQgbmV2ZXIgZ290LlxuICAgICAgLy9cbiAgICAgIC8vIGBsb3NzX3JlYXNvbmAgaXMgbWFuZGF0b3J5IG9uIGV2ZXJ5IGBjbG9zZWRfbG9zdGAgcmVjb3JkIChzZWVcbiAgICAgIC8vIGNybV9vcHBvcnR1bml0eSksIHNvIHRoaXMgY2hhcnQgaGFzIG5vIFwidW5hdHRyaWJ1dGVkXCIgc2xpY2UgdG9cbiAgICAgIC8vIGFwb2xvZ2lzZSBmb3IgXHUyMDE0IGFuIGVtcHR5IGNoYXJ0IGhlcmUgbWVhbnMgbm8gbG9zc2VzIGluIHRoZSB3aW5kb3csXG4gICAgICAvLyBuZXZlciBcIm5vYm9keSBmaWxsZWQgdGhlIGZpZWxkIGluXCIuXG4gICAgICAvL1xuICAgICAgLy8gQ291bnRzLCBub3QgYW1vdW50czogdGhlIHF1ZXN0aW9uIGEgbG9zcyByZXZpZXcgYXNrcyBpcyBcImhvdyBvZnRlbiBkaWRcbiAgICAgIC8vIHdlIGxvc2UgZm9yIHRoaXMgcmVhc29uXCIsIGFuZCBvbmUgbGFyZ2UgbG9zdCBkZWFsIHNob3VsZCBub3Qgb3V0d2VpZ2hcbiAgICAgIC8vIGZpdmUgcmVjdXJyaW5nIGZlYXR1cmUgZ2Fwcy4gYGxvc3RfYW1vdW50YCBpcyBkZWNsYXJlZCBvbiB0aGUgZGF0YXNldFxuICAgICAgLy8gZm9yIHRoZSByZXZlbnVlIHZpZXcgb2YgdGhlIHNhbWUgcXVlc3Rpb24uXG4gICAgICBpZDogJ2xvc3NfcmVhc29uX2JyZWFrZG93bicsXG4gICAgICB0aXRsZTogJ1doeSBXZSBMb3NlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTG9zdCBkZWFscyBieSByZWFzb24gXHUyMDE0IGxhc3QgMTIgbW9udGhzJyxcbiAgICAgIHR5cGU6ICdkb251dCcsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfbG9zdCcsIGNsb3NlX2RhdGU6IHsgJGd0ZTogJ3sxMl9tb250aHNfYWdvfScgfSB9LFxuICAgICAgZmlsdGVyQmluZGluZ3M6IHsgZGF0ZVJhbmdlOiBmYWxzZSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnb3JhbmdlJyxcbiAgICAgIGRhdGFzZXQ6ICdvcHBvcnR1bml0eV9tZXRyaWNzJywgZGltZW5zaW9uczogWydsb3NzX3JlYXNvbiddLCB2YWx1ZXM6IFsnb3BwX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMCwgeTogMjQsIHc6IDEyLCBoOiA0IH0sXG4gICAgICBjaGFydENvbmZpZzoge1xuICAgICAgICBzaG93TGVnZW5kOiB0cnVlLFxuICAgICAgICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgICAgICAgY29sb3JzOiBbJyNFRjQ0NDQnLCAnI0Y1OUUwQicsICcjOEI1Q0Y2JywgJyMwNkI2RDQnLCAnIzRGNDZFNScsICcjMTBCOTgxJywgJyM2NDc0OEInXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSb3cgOTogUGl2b3QgXHUyMDE0IFN0YWdlIFx1MDBENyBMZWFkIFNvdXJjZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBpZDogJ3BpcGVsaW5lX3N0YWdlX2J5X3NvdXJjZScsXG4gICAgICB0aXRsZTogJ1BpcGVsaW5lIGJ5IFN0YWdlIFx1MDBENyBMZWFkIFNvdXJjZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0Nyb3NzLXRhYiBvZiBvcGVuIG9wcG9ydHVuaXR5IGFtb3VudCBieSBzdGFnZSBhbmQgc291cmNlJyxcbiAgICAgIHR5cGU6ICdwaXZvdCcsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6IHsgJG5pbjogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnZGVmYXVsdCcsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnc3RhZ2UnLCAnbGVhZF9zb3VyY2UnXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDI4LCB3OiAxMiwgaDogNCB9LFxuICAgIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHMvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHMvaW5kZXgudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKiBBbmFseXRpY3MgZGF0YXNldCBiYXJyZWwgKEFEUi0wMDIxKS4gKi9cblxuZXhwb3J0IHsgT3Bwb3J0dW5pdHlEYXRhc2V0IH0gZnJvbSAnLi9vcHBvcnR1bml0eS5kYXRhc2V0JztcbmV4cG9ydCB7IEFjY291bnREYXRhc2V0IH0gZnJvbSAnLi9hY2NvdW50LmRhdGFzZXQnO1xuZXhwb3J0IHsgQ29udGFjdERhdGFzZXQgfSBmcm9tICcuL2NvbnRhY3QuZGF0YXNldCc7XG5leHBvcnQgeyBMZWFkRGF0YXNldCB9IGZyb20gJy4vbGVhZC5kYXRhc2V0JztcbmV4cG9ydCB7IFRhc2tEYXRhc2V0IH0gZnJvbSAnLi90YXNrLmRhdGFzZXQnO1xuZXhwb3J0IHsgRXZlbnREYXRhc2V0IH0gZnJvbSAnLi9ldmVudC5kYXRhc2V0JztcbmV4cG9ydCB7IEZvcmVjYXN0RGF0YXNldCB9IGZyb20gJy4vZm9yZWNhc3QuZGF0YXNldCc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0cy9vcHBvcnR1bml0eS5kYXRhc2V0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGFzZXRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGFzZXRzL29wcG9ydHVuaXR5LmRhdGFzZXQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZURhdGFzZXQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogT3Bwb3J0dW5pdHkgYW5hbHl0aWNzIGRhdGFzZXQgKEFEUi0wMDIxKS5cbiAqXG4gKiBUaGUgc2luZ2xlIHNlbWFudGljIHNvdXJjZSBvZiB0cnV0aCBmb3IgcGlwZWxpbmUgbWV0cmljcyBhY3Jvc3MgdGhlIFNhbGVzLFxuICogQ1JNIGFuZCBFeGVjdXRpdmUgZGFzaGJvYXJkcy4gV2lkZ2V0cyBiaW5kIHRvIHRoaXMgZGF0YXNldCBhbmQgc2VsZWN0XG4gKiBtZWFzdXJlcyBCWSBOQU1FIChgdG90YWxfYW1vdW50YCwgYGF2Z19hbW91bnRgLCBgb3BwX2NvdW50YCkgc28gXCJwaXBlbGluZVxuICogcmV2ZW51ZVwiIG1lYW5zIHRoZSBzYW1lIHRoaW5nIGV2ZXJ5d2hlcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eURhdGFzZXQgPSBkZWZpbmVEYXRhc2V0KHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X21ldHJpY3MnLFxuICBsYWJlbDogJ09wcG9ydHVuaXR5IE1ldHJpY3MnLFxuICBkZXNjcmlwdGlvbjogJ1NlbWFudGljIGxheWVyIGZvciBzYWxlcy1waXBlbGluZSBjb3VudHMgYW5kIGFtb3VudHMnLFxuICBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknLFxuXG4gIC8vIEluY2x1ZGUgdGhlIGFjY291bnQgcmVsYXRpb25zaGlwIHNvIGRpbWVuc2lvbnMgY2FuIHRyYXZlcnNlIGl0ICh0aGUgam9pbiBpc1xuICAvLyBkZXJpdmVkIGZyb20gdGhlIGBjcm1fYWNjb3VudGAgbG9va3VwIFx1MjAxNCBubyBoYW5kLXdyaXR0ZW4gT04gY2xhdXNlKS5cbiAgaW5jbHVkZTogWydjcm1fYWNjb3VudCddLFxuXG4gIGRpbWVuc2lvbnM6IFtcbiAgICB7IG5hbWU6ICdzdGFnZScsIGxhYmVsOiAnU3RhZ2UnLCBmaWVsZDogJ3N0YWdlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICB7IG5hbWU6ICdsZWFkX3NvdXJjZScsIGxhYmVsOiAnTGVhZCBTb3VyY2UnLCBmaWVsZDogJ2xlYWRfc291cmNlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICB7IG5hbWU6ICdmb3JlY2FzdF9jYXRlZ29yeScsIGxhYmVsOiAnRm9yZWNhc3QgQ2F0ZWdvcnknLCBmaWVsZDogJ2ZvcmVjYXN0X2NhdGVnb3J5JywgdHlwZTogJ3N0cmluZycgfSxcbiAgICB7IG5hbWU6ICd0eXBlJywgbGFiZWw6ICdEZWFsIFR5cGUnLCBmaWVsZDogJ3R5cGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIC8vIFNlbWFudGljIG5hbWUgYG93bmVyYDsgY29sdW1uIGBvd25lcl9pZGAsIHRoZSBwbGF0Zm9ybSBhbmNob3IgKCM1NDgpLlxuICAgIHsgbmFtZTogJ293bmVyJywgbGFiZWw6ICdPd25lcicsIGZpZWxkOiAnb3duZXJfaWQnLCB0eXBlOiAnbG9va3VwJyB9LFxuICAgIC8vIFdpbi9sb3NzIGF0dHJpYnV0aW9uICgjNTkzKS4gQm90aCBjb2x1bW5zIGFyZSBub3cgbWFuZGF0b3J5IGF0IGNsb3NlXG4gICAgLy8gKGByZXF1aXJlZFdoZW5gIG9uIGNybV9vcHBvcnR1bml0eSksIHNvIGdyb3VwaW5nIGJ5IGVpdGhlciBvbmUgb3ZlclxuICAgIC8vIHNldHRsZWQgZGVhbHMgaGFzIG5vIFwidW5hdHRyaWJ1dGVkXCIgYnVja2V0IHRvIGV4cGxhaW4gYXdheS5cbiAgICB7IG5hbWU6ICd3aW5fcmVhc29uJywgbGFiZWw6ICdXaW4gUmVhc29uJywgZmllbGQ6ICd3aW5fcmVhc29uJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICB7IG5hbWU6ICdsb3NzX3JlYXNvbicsIGxhYmVsOiAnTG9zcyBSZWFzb24nLCBmaWVsZDogJ2xvc3NfcmVhc29uJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAvLyB2MTcgZml4ZXMgc2NvcGVkIGFnZ3JlZ2F0ZSBleGVjdXRpb24gYW5kIFNRTGl0ZSdzIGVwb2NoIGJ1Y2tldGluZy5cbiAgICAvLyBUcmVuZHMgYW5kIHF1YXJ0ZXIgY292ZXJhZ2UgbmVlZCBkaWZmZXJlbnQgYnVja2V0cyBvdmVyIHRoZSBzYW1lIGZpZWxkLFxuICAgIC8vIHNvIGVhY2ggb25lIGlzIGl0cyBvd24gc2VtYW50aWMgZGltZW5zaW9uLlxuICAgIHsgbmFtZTogJ2Nsb3NlX2RhdGUnLCBsYWJlbDogJ0Nsb3NlIERhdGUnLCBmaWVsZDogJ2Nsb3NlX2RhdGUnLCB0eXBlOiAnZGF0ZScsIGRhdGVHcmFudWxhcml0eTogJ21vbnRoJyB9LFxuICAgIHsgbmFtZTogJ2Nsb3NlX3F1YXJ0ZXInLCBsYWJlbDogJ0Nsb3NlIFF1YXJ0ZXInLCBmaWVsZDogJ2Nsb3NlX2RhdGUnLCB0eXBlOiAnZGF0ZScsIGRhdGVHcmFudWxhcml0eTogJ3F1YXJ0ZXInIH0sXG4gICAgLy8gQ3Jvc3Mtb2JqZWN0IGRpbWVuc2lvbjogYWNjb3VudCBpbmR1c3RyeSB2aWEgdGhlIGNybV9hY2NvdW50IHJlbGF0aW9uc2hpcC5cbiAgICB7IG5hbWU6ICdhY2NvdW50X2luZHVzdHJ5JywgbGFiZWw6ICdBY2NvdW50IEluZHVzdHJ5JywgZmllbGQ6ICdjcm1fYWNjb3VudC5pbmR1c3RyeScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIF0sXG5cbiAgbWVhc3VyZXM6IFtcbiAgICB7IG5hbWU6ICdvcHBfY291bnQnLCBsYWJlbDogJ09wcG9ydHVuaXRpZXMnLCBhZ2dyZWdhdGU6ICdjb3VudCcgfSxcbiAgICB7IG5hbWU6ICd0b3RhbF9hbW91bnQnLCBsYWJlbDogJ1RvdGFsIEFtb3VudCcsIGFnZ3JlZ2F0ZTogJ3N1bScsIGZpZWxkOiAnYW1vdW50JywgZm9ybWF0OiAnMCwwJyB9LFxuICAgIHsgbmFtZTogJ2F2Z19hbW91bnQnLCBsYWJlbDogJ0F2ZyBEZWFsIFNpemUnLCBhZ2dyZWdhdGU6ICdhdmcnLCBmaWVsZDogJ2Ftb3VudCcsIGZvcm1hdDogJzAsMCcgfSxcbiAgICB7IG5hbWU6ICdhdmdfcHJvYmFiaWxpdHknLCBsYWJlbDogJ0F2ZyBQcm9iYWJpbGl0eScsIGFnZ3JlZ2F0ZTogJ2F2ZycsIGZpZWxkOiAncHJvYmFiaWxpdHknLCBmb3JtYXQ6ICcwJScgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBXaW4gcmF0ZSAoIzU5MykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBBIHJhdGlvIGlzIHRoZSBtb3N0IGRhbmdlcm91cyBraW5kIG9mIG1lYXN1cmU6IGEgd3JvbmcgZGVub21pbmF0b3IgZG9lc1xuICAgIC8vIG5vdCBlcnJvciwgaXQgcmV0dXJucyBhIHBsYXVzaWJsZSBudW1iZXIgKCM2MTQgcmVuZGVyZWQgYSAxLDUwMCwwMDBcbiAgICAvLyBxdW90YSBhcyA3LDk0MCwwMDAgYmVjYXVzZSBhIGZpbHRlciB3YXMgbWlzc2luZyBvbmUgb2YgaXRzIHR3byBoYWx2ZXMpLlxuICAgIC8vIFNvIHRoZSB0d28gaGFsdmVzIGFyZSBkZWNsYXJlZCBoZXJlLCBPTkNFLCBhcyBuYW1lZCBtZWFzdXJlcyBcdTIwMTQgbm90XG4gICAgLy8gaW1wcm92aXNlZCBwZXIgd2lkZ2V0IFx1MjAxNCBhbmQgZXZlcnkgd2lkZ2V0IHRoYXQgc2hvd3MgYHdpbl9yYXRlYCBhbHNvXG4gICAgLy8gc2hvd3MgYHdvbl9jb3VudGAgYW5kIGBsb3N0X2NvdW50YCBiZXNpZGUgaXQsIHNvIHRoZSByZWFkZXIgY2FuIGNoZWNrXG4gICAgLy8gdGhlIGFyaXRobWV0aWMgdGhhdCBwcm9kdWNlZCB0aGUgcGVyY2VudGFnZS5cbiAgICAvL1xuICAgIC8vIEVhY2ggY2FycmllcyBpdHMgT1dOIGBmaWx0ZXJgLCB3aGljaCB0aGUgZXhlY3V0b3IgaG9ub3VycyBieSBydW5uaW5nXG4gICAgLy8gdGhhdCBtZWFzdXJlIGFzIGl0cyBvd24gc3ViLXF1ZXJ5IGFuZCBtZXJnaW5nIHRoZSByZXN1bHQgYmFjayBvbiB0aGVcbiAgICAvLyBzZWxlY3RlZCBkaW1lbnNpb25zLiBUaGF0IGlzIHdoYXQgbGV0cyBvbmUgd2lkZ2V0IHJvdyBob2xkIFwid29uIDIsIGxvc3RcbiAgICAvLyAxLCA2NyVcIiBcdTIwMTQgdGhlIGNvdW50cyBhcmUgb3ZlciBkaWZmZXJlbnQgcm93IHNldHMsIGFuZCBvbmx5IGFcbiAgICAvLyBtZWFzdXJlLWxldmVsIGZpbHRlciBjYW4gc2F5IHNvLiBBIHdpZGdldC1sZXZlbCBgZmlsdGVyYCBjYW5ub3Q6IGl0XG4gICAgLy8gbmFycm93cyB0aGUgd2hvbGUgcm93IHNldCBhdCBvbmNlLCB3aGljaCBpcyBleGFjdGx5IGhvdyB5b3UgZW5kIHVwXG4gICAgLy8gZGl2aWRpbmcgYSBudW1iZXIgYnkgaXRzZWxmLlxuICAgIC8vXG4gICAgLy8gYGRlY2lkZWRfY291bnRgIGlzIGRlbGliZXJhdGVseSBpdHMgb3duIGZpbHRlcmVkIGNvdW50IGFuZCBOT1RcbiAgICAvLyBgZGVyaXZlZDogeyBvcDogJ3N1bScsIG9mOiBbJ3dvbl9jb3VudCcsICdsb3N0X2NvdW50J10gfWAuIE1lYXN1cmVkIG9uXG4gICAgLy8gMTcuMC4wLXJjLjE6IGEgZmlsdGVyZWQgbWVhc3VyZSBjb250cmlidXRlcyBOTyByb3cgZm9yIGEgZ3JvdXAgaXRzXG4gICAgLy8gZmlsdGVyIHNlbGVjdHMgbm90aGluZyBpbiBcdTIwMTQgdGhlIGNvdW50IGNvbWVzIGJhY2sgYWJzZW50LCBub3QgMCBcdTIwMTQgYW5kIGFcbiAgICAvLyBkZXJpdmVkIG1lYXN1cmUgb3ZlciBhbiBhYnNlbnQgaW5wdXQgZXZhbHVhdGVzIHRvIG51bGwuIFN1bW1pbmcgdGhlIHR3b1xuICAgIC8vIHdvdWxkIHRoZXJlZm9yZSBibGFuayB0aGUgd2luIHJhdGUgb2YgYW55IHJlcCB3aG8gaGFzIG5ldmVyIGxvc3QgYSBkZWFsXG4gICAgLy8gKDEwMCUsIHRoZSBncm91cCB5b3UgbGVhc3Qgd2FudCB0byBoaWRlKS4gQ291bnRpbmcgdGhlIHVuaW9uIGRpcmVjdGx5XG4gICAgLy8ga2VlcHMgdGhlIGRlbm9taW5hdG9yIHByZXNlbnQgd2hlbmV2ZXIgdGhlIGdyb3VwIGhhcyBhbnkgc2V0dGxlZCBkZWFsIGF0XG4gICAgLy8gYWxsLiBUaGUgcmVtYWluaW5nIGFzeW1tZXRyeSBcdTIwMTQgYSBncm91cCB3aXRoIGxvc3NlcyBidXQgTk8gd2lucyByZXBvcnRzIGFcbiAgICAvLyBudWxsIHdpbiByYXRlIHJhdGhlciB0aGFuIDAlIFx1MjAxNCBpcyBhIHBsYXRmb3JtIGJlaGF2aW91ciwgbm90IHNvbWV0aGluZyBhXG4gICAgLy8gd2lkZ2V0IGNhbiBwYXBlciBvdmVyOyBpdCBpcyBwaW5uZWQgYnkgYHRlc3Qvd2luLWxvc3MtY2FwdHVyZS50ZXN0LnRzYFxuICAgIC8vIGFuZCBmaWxlZCBhcyAjNjU2LiBUaGUgdGFibGVzIHNob3cgYGxvc3RfY291bnRgIG5leHQgdG8gYHdpbl9yYXRlYFxuICAgIC8vIHByZWNpc2VseSBzbyB0aGF0IGEgYmxhbmsgcmF0ZSByZWFkcyBhcyBcIjAgd2lucyBvdXQgb2YgM1wiLCBub3QgYXNcbiAgICAvLyBcIm5vIGRhdGFcIi5cbiAgICB7IG5hbWU6ICd3b25fY291bnQnLCBsYWJlbDogJ1dvbiBEZWFscycsIGFnZ3JlZ2F0ZTogJ2NvdW50JywgZmlsdGVyOiB7IHN0YWdlOiAnY2xvc2VkX3dvbicgfSB9LFxuICAgIHsgbmFtZTogJ2xvc3RfY291bnQnLCBsYWJlbDogJ0xvc3QgRGVhbHMnLCBhZ2dyZWdhdGU6ICdjb3VudCcsIGZpbHRlcjogeyBzdGFnZTogJ2Nsb3NlZF9sb3N0JyB9IH0sXG4gICAge1xuICAgICAgbmFtZTogJ2RlY2lkZWRfY291bnQnLFxuICAgICAgbGFiZWw6ICdTZXR0bGVkIERlYWxzJyxcbiAgICAgIGFnZ3JlZ2F0ZTogJ2NvdW50JyxcbiAgICAgIGZpbHRlcjogeyBzdGFnZTogeyAkaW46IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0gfSxcbiAgICB9LFxuICAgIHsgbmFtZTogJ3dvbl9hbW91bnQnLCBsYWJlbDogJ1dvbiBSZXZlbnVlJywgYWdncmVnYXRlOiAnc3VtJywgZmllbGQ6ICdhbW91bnQnLCBmaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfd29uJyB9LCBmb3JtYXQ6ICcwLDAnIH0sXG4gICAgeyBuYW1lOiAnbG9zdF9hbW91bnQnLCBsYWJlbDogJ0xvc3QgUmV2ZW51ZScsIGFnZ3JlZ2F0ZTogJ3N1bScsIGZpZWxkOiAnYW1vdW50JywgZmlsdGVyOiB7IHN0YWdlOiAnY2xvc2VkX2xvc3QnIH0sIGZvcm1hdDogJzAsMCcgfSxcbiAgICB7IG5hbWU6ICd3aW5fcmF0ZScsIGxhYmVsOiAnV2luIFJhdGUnLCBkZXJpdmVkOiB7IG9wOiAncmF0aW8nLCBvZjogWyd3b25fY291bnQnLCAnZGVjaWRlZF9jb3VudCddIH0sIGZvcm1hdDogJzAlJyB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0cy9hY2NvdW50LmRhdGFzZXQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHMvYWNjb3VudC5kYXRhc2V0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBkZWZpbmVEYXRhc2V0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKiogQWNjb3VudCBhbmFseXRpY3MgZGF0YXNldCAoQURSLTAwMjEpLiAqL1xuZXhwb3J0IGNvbnN0IEFjY291bnREYXRhc2V0ID0gZGVmaW5lRGF0YXNldCh7XG4gIG5hbWU6ICdhY2NvdW50X21ldHJpY3MnLFxuICBsYWJlbDogJ0FjY291bnQgTWV0cmljcycsXG4gIGRlc2NyaXB0aW9uOiAnU2VtYW50aWMgbGF5ZXIgZm9yIGFjY291bnQgY291bnRzIGJ5IGluZHVzdHJ5IC8gdHlwZScsXG4gIG9iamVjdDogJ2NybV9hY2NvdW50JyxcbiAgZGltZW5zaW9uczogW1xuICAgIHsgbmFtZTogJ2luZHVzdHJ5JywgbGFiZWw6ICdJbmR1c3RyeScsIGZpZWxkOiAnaW5kdXN0cnknLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIHsgbmFtZTogJ3R5cGUnLCBsYWJlbDogJ1R5cGUnLCBmaWVsZDogJ3R5cGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIHsgbmFtZTogJ2NyZWF0ZWRfYXQnLCBsYWJlbDogJ0NyZWF0ZWQnLCBmaWVsZDogJ2NyZWF0ZWRfYXQnLCB0eXBlOiAnZGF0ZScsIGRhdGVHcmFudWxhcml0eTogJ21vbnRoJyB9LFxuICBdLFxuICBtZWFzdXJlczogW1xuICAgIHsgbmFtZTogJ2FjY291bnRfY291bnQnLCBsYWJlbDogJ0FjY291bnRzJywgYWdncmVnYXRlOiAnY291bnQnIH0sXG4gICAgeyBuYW1lOiAnYW5udWFsX3JldmVudWVfc3VtJywgbGFiZWw6ICdBbm51YWwgUmV2ZW51ZScsIGFnZ3JlZ2F0ZTogJ3N1bScsIGZpZWxkOiAnYW5udWFsX3JldmVudWUnLCBmb3JtYXQ6ICcwLDAnIH0sXG4gIF0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGFzZXRzL2NvbnRhY3QuZGF0YXNldC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0cy9jb250YWN0LmRhdGFzZXQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZURhdGFzZXQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKiBDb250YWN0IGFuYWx5dGljcyBkYXRhc2V0IChBRFItMDAyMSkuICovXG5leHBvcnQgY29uc3QgQ29udGFjdERhdGFzZXQgPSBkZWZpbmVEYXRhc2V0KHtcbiAgbmFtZTogJ2NvbnRhY3RfbWV0cmljcycsXG4gIGxhYmVsOiAnQ29udGFjdCBNZXRyaWNzJyxcbiAgZGVzY3JpcHRpb246ICdTZW1hbnRpYyBsYXllciBmb3IgY29udGFjdCBjb3VudHMnLFxuICBvYmplY3Q6ICdjcm1fY29udGFjdCcsXG4gIGRpbWVuc2lvbnM6IFtdLFxuICBtZWFzdXJlczogW3sgbmFtZTogJ2NvbnRhY3RfY291bnQnLCBsYWJlbDogJ0NvbnRhY3RzJywgYWdncmVnYXRlOiAnY291bnQnIH1dLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0cy9sZWFkLmRhdGFzZXQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHMvbGVhZC5kYXRhc2V0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBkZWZpbmVEYXRhc2V0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKiogTGVhZCBhbmFseXRpY3MgZGF0YXNldCAoQURSLTAwMjEpLiAqL1xuZXhwb3J0IGNvbnN0IExlYWREYXRhc2V0ID0gZGVmaW5lRGF0YXNldCh7XG4gIG5hbWU6ICdsZWFkX21ldHJpY3MnLFxuICBsYWJlbDogJ0xlYWQgTWV0cmljcycsXG4gIGRlc2NyaXB0aW9uOiAnU2VtYW50aWMgbGF5ZXIgZm9yIGxlYWQgY291bnRzJyxcbiAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICBkaW1lbnNpb25zOiBbXG4gICAgeyBuYW1lOiAnc3RhdHVzJywgbGFiZWw6ICdTdGF0dXMnLCBmaWVsZDogJ3N0YXR1cycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgeyBuYW1lOiAnbGVhZF9zb3VyY2UnLCBsYWJlbDogJ1NvdXJjZScsIGZpZWxkOiAnbGVhZF9zb3VyY2UnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIHsgbmFtZTogJ2NyZWF0ZWRfYXQnLCBsYWJlbDogJ0NyZWF0ZWQnLCBmaWVsZDogJ2NyZWF0ZWRfYXQnLCB0eXBlOiAnZGF0ZScgfSxcbiAgICB7IG5hbWU6ICdsYXN0X2NvbnRhY3RlZF9kYXRlJywgbGFiZWw6ICdMYXN0IENvbnRhY3RlZCcsIGZpZWxkOiAnbGFzdF9jb250YWN0ZWRfZGF0ZScsIHR5cGU6ICdkYXRlJywgZGF0ZUdyYW51bGFyaXR5OiAnbW9udGgnIH0sXG4gIF0sXG4gIG1lYXN1cmVzOiBbeyBuYW1lOiAnbGVhZF9jb3VudCcsIGxhYmVsOiAnTGVhZHMnLCBhZ2dyZWdhdGU6ICdjb3VudCcgfV0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGFzZXRzL3Rhc2suZGF0YXNldC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0cy90YXNrLmRhdGFzZXQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZURhdGFzZXQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogVGFzayBhbmFseXRpY3MgZGF0YXNldCAoQURSLTAwMjEpLlxuICpcbiAqIEFkZGVkIGZvciB0aGUgXCJNeSBEYXlcIiBkYXNoYm9hcmQgXHUyMDE0IGBjcm1fdGFza2AgaGFkIHZpZXdzLCBzZWVkIGRhdGEgYW5kXG4gKiBhdXRvbWF0aW9uIGJ1dCBubyBzZW1hbnRpYyBsYXllciwgc28gYSByZXAncyBvd24gd29ya2xvYWQgY291bGQgbm90IGJlXG4gKiBjb3VudGVkIG9yIGJyb2tlbiBkb3duIGFueXdoZXJlLlxuICpcbiAqIGBwcmlvcml0eV9yYW5rYCBpcyBleHBvc2VkIGFsb25nc2lkZSBgcHJpb3JpdHlgIHNvIGEgYnJlYWtkb3duIGNhbiBiZVxuICogb3JkZXJlZCBieSB1cmdlbmN5OyBzb3J0aW5nIG9uIHRoZSByYXcgc2VsZWN0IGNvbXBhcmVzIG9wdGlvbiBzdHJpbmdzIGFuZFxuICogaW52ZXJ0cyBpdCAobm9ybWFsID4gbG93ID4gaGlnaCA+IHVyZ2VudCkuXG4gKi9cbmV4cG9ydCBjb25zdCBUYXNrRGF0YXNldCA9IGRlZmluZURhdGFzZXQoe1xuICBuYW1lOiAndGFza19tZXRyaWNzJyxcbiAgbGFiZWw6ICdUYXNrIE1ldHJpY3MnLFxuICBkZXNjcmlwdGlvbjogJ1NlbWFudGljIGxheWVyIGZvciB0YXNrIHdvcmtsb2FkIGFuZCBjb21wbGV0aW9uJyxcbiAgb2JqZWN0OiAnY3JtX3Rhc2snLFxuICBkaW1lbnNpb25zOiBbXG4gICAgeyBuYW1lOiAnc3RhdHVzJywgbGFiZWw6ICdTdGF0dXMnLCBmaWVsZDogJ3N0YXR1cycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgeyBuYW1lOiAncHJpb3JpdHknLCBsYWJlbDogJ1ByaW9yaXR5JywgZmllbGQ6ICdwcmlvcml0eScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgeyBuYW1lOiAncHJpb3JpdHlfcmFuaycsIGxhYmVsOiAnVXJnZW5jeScsIGZpZWxkOiAncHJpb3JpdHlfcmFuaycsIHR5cGU6ICdudW1iZXInIH0sXG4gICAgeyBuYW1lOiAndHlwZScsIGxhYmVsOiAnVHlwZScsIGZpZWxkOiAndHlwZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgeyBuYW1lOiAnZHVlX2RhdGUnLCBsYWJlbDogJ0R1ZSBEYXRlJywgZmllbGQ6ICdkdWVfZGF0ZScsIHR5cGU6ICdkYXRlJyB9LFxuICAgIHsgbmFtZTogJ2lzX292ZXJkdWUnLCBsYWJlbDogJ092ZXJkdWUnLCBmaWVsZDogJ2lzX292ZXJkdWUnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICB7IG5hbWU6ICdpc19jb21wbGV0ZWQnLCBsYWJlbDogJ0NvbXBsZXRlZCcsIGZpZWxkOiAnaXNfY29tcGxldGVkJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gIF0sXG4gIG1lYXN1cmVzOiBbXG4gICAgeyBuYW1lOiAndGFza19jb3VudCcsIGxhYmVsOiAnVGFza3MnLCBhZ2dyZWdhdGU6ICdjb3VudCcgfSxcbiAgICB7IG5hbWU6ICdhdmdfcHJvZ3Jlc3MnLCBsYWJlbDogJ0F2ZyBQcm9ncmVzcycsIGFnZ3JlZ2F0ZTogJ2F2ZycsIGZpZWxkOiAncHJvZ3Jlc3NfcGVyY2VudCcsIGZvcm1hdDogJzAuMCUnIH0sXG4gIF0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGFzZXRzL2V2ZW50LmRhdGFzZXQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHMvZXZlbnQuZGF0YXNldC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lRGF0YXNldCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBFdmVudCBhbmFseXRpY3MgZGF0YXNldCAoQURSLTAwMjEpIFx1MjAxNCB0aGUgc2VtYW50aWMgbGF5ZXIgIzU5MiBuZWVkZWQuXG4gKlxuICogQmVmb3JlIHRoaXMsIHRoZSBhcHAgaGFkIE5PIGFjdGl2aXR5IG1ldHJpYyBvZiBhbnkga2luZDogY2FsbHMgcGVyIHJlcCxcbiAqIG1lZXRpbmdzIGJvb2tlZCBhbmQgYWN0aXZpdHkgcGVyIGRlYWwgd2VyZSBhbGwgdW5hbnN3ZXJhYmxlLCBiZWNhdXNlIHRoZVxuICogb25seSB0cmFjZSBvZiBhbiBpbnRlcmFjdGlvbiB3YXMgYSBgc3lzX2FjdGl2aXR5YCByb3cgd2l0aCB0aGUgaW50ZXJlc3RpbmdcbiAqIHBhcnQgaW5zaWRlIGEgSlNPTiBzdHJpbmcuIGBjcm1fZXZlbnRgIGlzIGEgcmVhbCBvYmplY3QsIHNvIGl0IGdldHMgYSByZWFsXG4gKiBjdWJlLlxuICpcbiAqIGByZWxhdGVkX3RvX3R5cGVgIGlzIGEgZGltZW5zaW9uIGFuZCB0aGUgYHJlbGF0ZWRfdG9fKmAgbG9va3VwcyBhcmUgbm90OlxuICogZ3JvdXBpbmcgYnkgYSBsb29rdXAgaWQgeWllbGRzIGEgY29sdW1uIHBlciByYXcgaWQsIHdoaWNoIHJlYWRzIGFzIG5vaXNlIG9uXG4gKiBhIGNoYXJ0LiBcIldoaWNoIGRlYWxzIGFyZSBzdGFydmVkIG9mIGFjdGl2aXR5XCIgaXMgYW5zd2VyZWQgYnkgZmlsdGVyaW5nIHRvXG4gKiBgcmVsYXRlZF90b190eXBlID0gY3JtX29wcG9ydHVuaXR5YCBhbmQgY291bnRpbmcsIG5vdCBieSBncm91cGluZyBvbiB0aGUgaWQuXG4gKlxuICogYHN0YXJ0X2RhdGV0aW1lYCBkZWNsYXJlcyBgZGF0ZUdyYW51bGFyaXR5OiAnd2VlaydgOiBldmVyeSB3aWRnZXQgYnVpbHQgb25cbiAqIGl0IGFza3MgXCJob3cgbXVjaCBhY3Rpdml0eSBwZXIgd2Vla1wiLCBhbmQgb24gQG9iamVjdHN0YWNrIDE3IGEgYnVja2V0ZWRcbiAqIGRpbWVuc2lvbiBpcyBob25vdXJlZCAoc2VlIGB0ZXN0L2RhdGFzZXQtZ3JhbnVsYXJpdHkudGVzdC50c2AgZm9yIHRoZSAxNi54XG4gKiBoaXN0b3J5IGFuZCB3aHkgdGhlIGJ1Y2tldHMgY291bGQgbm90IGJlIGRlY2xhcmVkIGJlZm9yZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBFdmVudERhdGFzZXQgPSBkZWZpbmVEYXRhc2V0KHtcbiAgbmFtZTogJ2V2ZW50X21ldHJpY3MnLFxuICBsYWJlbDogJ0FjdGl2aXR5IE1ldHJpY3MnLFxuICBkZXNjcmlwdGlvbjogJ1NlbWFudGljIGxheWVyIGZvciBtZWV0aW5ncywgY2FsbHMgYW5kIGludGVyYWN0aW9uIHJlY2VuY3knLFxuICBvYmplY3Q6ICdjcm1fZXZlbnQnLFxuICBkaW1lbnNpb25zOiBbXG4gICAgeyBuYW1lOiAndHlwZScsIGxhYmVsOiAnQWN0aXZpdHkgVHlwZScsIGZpZWxkOiAndHlwZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgeyBuYW1lOiAnc3RhdHVzJywgbGFiZWw6ICdTdGF0dXMnLCBmaWVsZDogJ3N0YXR1cycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgLy8gYG93bmVyYCBpcyB0aGUgU0VNQU5USUMgbmFtZSBldmVyeSB3aWRnZXQvcmVwb3J0IHNlbGVjdHMgYnk7IHRoZSBjb2x1bW5cbiAgICAvLyBiZWhpbmQgaXQgaXMgdGhlIHBsYXRmb3JtIG93bmVyc2hpcCBhbmNob3IgYG93bmVyX2lkYCAoIzU0OCkuXG4gICAgeyBuYW1lOiAnb3duZXInLCBsYWJlbDogJ093bmVyJywgZmllbGQ6ICdvd25lcl9pZCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgeyBuYW1lOiAncmVsYXRlZF90b190eXBlJywgbGFiZWw6ICdSZWxhdGVkIFRvJywgZmllbGQ6ICdyZWxhdGVkX3RvX3R5cGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdzdGFydF9kYXRldGltZScsXG4gICAgICBsYWJlbDogJ0FjdGl2aXR5IFdlZWsnLFxuICAgICAgZmllbGQ6ICdzdGFydF9kYXRldGltZScsXG4gICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICBkYXRlR3JhbnVsYXJpdHk6ICd3ZWVrJyxcbiAgICB9LFxuICBdLFxuICBtZWFzdXJlczogW1xuICAgIHsgbmFtZTogJ2V2ZW50X2NvdW50JywgbGFiZWw6ICdBY3Rpdml0aWVzJywgYWdncmVnYXRlOiAnY291bnQnIH0sXG4gICAge1xuICAgICAgbmFtZTogJ3RvdGFsX21pbnV0ZXMnLFxuICAgICAgbGFiZWw6ICdNaW51dGVzJyxcbiAgICAgIGFnZ3JlZ2F0ZTogJ3N1bScsXG4gICAgICBmaWVsZDogJ2R1cmF0aW9uX21pbnV0ZXMnLFxuICAgICAgZm9ybWF0OiAnMCwwJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdhdmdfbWludXRlcycsXG4gICAgICBsYWJlbDogJ0F2ZyBEdXJhdGlvbicsXG4gICAgICBhZ2dyZWdhdGU6ICdhdmcnLFxuICAgICAgZmllbGQ6ICdkdXJhdGlvbl9taW51dGVzJyxcbiAgICAgIGZvcm1hdDogJzAsMCcsXG4gICAgfSxcbiAgXSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHMvZm9yZWNhc3QuZGF0YXNldC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0cy9mb3JlY2FzdC5kYXRhc2V0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBkZWZpbmVEYXRhc2V0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKipcbiAqIEZvcmVjYXN0IGFuYWx5dGljcyBkYXRhc2V0IChBRFItMDAyMSkuXG4gKlxuICogYGNybV9mb3JlY2FzdGAgY2FycmllcyB0aGUgcmVhbCBwZXItb3duZXIsIHBlci1wZXJpb2QgcXVvdGEgYW5kIGF0dGFpbm1lbnRcbiAqIHNuYXBzaG90cywgYnV0IGhhZCBubyBzZW1hbnRpYyBsYXllciBcdTIwMTQgd2hpY2ggaXMgaG93IHRoZSBTYWxlcyBkYXNoYm9hcmRcbiAqIGVuZGVkIHVwIGFubm90YXRpbmcgaXRzIHJldmVudWUgY2hhcnQgd2l0aCBhIGhhcmRjb2RlZCBxdW90YSBvZiAxMDAwMDBcbiAqIHdoaWxlIHRoZSBzZWVkZWQgcXVvdGFzIHJ1biA1MDBrXHUyMDEzMS41TS4gV2lkZ2V0cyB0aGF0IHRhbGsgYWJvdXQgcXVvdGEgbXVzdFxuICogYmluZCBoZXJlIGluc3RlYWQgb2YgaW52ZW50aW5nIG51bWJlcnMuXG4gKlxuICogIyMgVGhlIG1lYXN1cmVzIGFyZSBOT1QgYWRkaXRpdmUgYWNyb3NzIHBlcmlvZHMgKCM2MTQpXG4gKlxuICogT25lIHJvdyBwZXIgb3duZXIgcGVyIHBlcmlvZCwgYW5kIHRoZSB0YWJsZSBkZWxpYmVyYXRlbHkgaG9sZHMgc2V2ZXJhbFxuICogcGVyaW9kcyBhdCBvbmNlIChhIGN1cnJlbnQgcXVhcnRlciwgYSBjdXJyZW50IG1vbnRoLCBzZXZlcmFsIHNldHRsZWQgb25lcykuXG4gKiBgcXVvdGFfc3VtYCBhbmQgZnJpZW5kcyBhcmUgcGxhaW4gYHN1bWBzLCBzbyBhIHF1ZXJ5IHRoYXQgZG9lcyBub3QgcGluIHRoZVxuICogcGVyaW9kIGFkZHMgYSBxdWFydGVyJ3MgcXVvdGEgdG8gYSBtb250aCdzIHF1b3RhIHRvIGxhc3QgcXVhcnRlcidzIHF1b3RhIGFuZFxuICogY2FsbHMgdGhlIHJlc3VsdCBcIlF1b3RhXCIgXHUyMDE0IHRoZSBkZWZlY3QgdGhhdCBzaGlwcGVkIG9uXG4gKiBgcXVvdGFfYXR0YWlubWVudF9ieV9yZXBgIHVudGlsICM2MTQuXG4gKlxuICogRXZlcnkgY29uc3VtZXIgbXVzdCB0aGVyZWZvcmUgbWFrZSB0aGUgcGVyaW9kIHVuYW1iaWd1b3VzLCBvbmUgb2YgdHdvIHdheXM6XG4gKlxuICogICBcdTIwMjIgZ3JvdXAgYnkgYHBlcmlvZF9sYWJlbGAgKHVuaXF1ZSBwZXIgcGVyaW9kLCBzbyBlYWNoIHJvdyBJUyBvbmUgcGVyaW9kKSBcdTIwMTRcbiAqICAgICB0aGUgc2hhcGUgYSBxdW90YS1vdmVyLXRpbWUgdHJlbmQgd2FudHM7IG9yXG4gKiAgIFx1MjAyMiBmaWx0ZXIgdG8gYSBzaW5nbGUgc25hcHNob3Qgd2l0aCBgcGVyaW9kYCArIGBwZXJpb2Rfc3RhcnRgXG4gKiAgICAgKGB7IHBlcmlvZDogJ3F1YXJ0ZXInLCBwZXJpb2Rfc3RhcnQ6ICd7Y3VycmVudF9xdWFydGVyX3N0YXJ0fScgfWApIFx1MjAxNFxuICogICAgIHRoZSBzaGFwZSBhIFwid2hlcmUgZG8gd2Ugc3RhbmQgcmlnaHQgbm93XCIgc2NvcmVib2FyZCB3YW50cy5cbiAqXG4gKiBgdGVzdC9mb3JlY2FzdC1wZXJpb2Qtc2NvcGUudGVzdC50c2AgZmFpbHMgdGhlIGJ1aWxkIGZvciBhbnkgd2lkZ2V0IG9yIHJlcG9ydFxuICogdGhhdCBkb2VzIG5laXRoZXIsIHNvIHRoZSB0cmFwIGNhbm5vdCBiZSB3YWxrZWQgaW50byB0d2ljZS5cbiAqXG4gKiBUaGlzIGNvbnN0cmFpbnQgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhIGRhdGFzZXQtbGV2ZWwgYGZpbHRlcmAgcGlubmluZyB0aGVcbiAqIGxhdGVzdCBxdWFydGVyLiBBIGRhdGFzZXQgZmlsdGVyIGlzIGludmlzaWJsZSBhdCB0aGUgY2FsbCBzaXRlOiBpdCB3b3VsZCBtYWtlXG4gKiB0aGUgdmVyeSB0cmVuZCB0aGUgYHBlcmlvZGAgLyBgcGVyaW9kX2xhYmVsYCBkaW1lbnNpb25zIGV4aXN0IHRvIHNlcnZlIHJldHVyblxuICogYSBzaW5nbGUgcm93LCB3aXRoIG5vdGhpbmcgb24gdGhlIHdpZGdldCB0byBleHBsYWluIHdoeS4gVGhlIGZhaWx1cmUgbW9kZSBvZlxuICogYSBtaXNzaW5nIHdpZGdldCBmaWx0ZXIgaXMgYSBsb3VkIHRlc3Q7IHRoZSBmYWlsdXJlIG1vZGUgb2YgYSBoaWRkZW4gZGF0YXNldFxuICogZmlsdGVyIGlzIHNpbGVudGx5IG1pc3NpbmcgZGF0YS5cbiAqL1xuZXhwb3J0IGNvbnN0IEZvcmVjYXN0RGF0YXNldCA9IGRlZmluZURhdGFzZXQoe1xuICBuYW1lOiAnZm9yZWNhc3RfbWV0cmljcycsXG4gIGxhYmVsOiAnRm9yZWNhc3QgTWV0cmljcycsXG4gIGRlc2NyaXB0aW9uOiAnU2VtYW50aWMgbGF5ZXIgZm9yIHBlci1vd25lciBxdW90YSwgYXR0YWlubWVudCBhbmQgcGlwZWxpbmUgY292ZXJhZ2UnLFxuICBvYmplY3Q6ICdjcm1fZm9yZWNhc3QnLFxuXG4gIGRpbWVuc2lvbnM6IFtcbiAgICAvLyBTZW1hbnRpYyBuYW1lIGBvd25lcmA7IGNvbHVtbiBgb3duZXJfaWRgLCB0aGUgcGxhdGZvcm0gYW5jaG9yICgjNTQ4KS5cbiAgICB7IG5hbWU6ICdvd25lcicsIGxhYmVsOiAnT3duZXInLCBmaWVsZDogJ293bmVyX2lkJywgdHlwZTogJ2xvb2t1cCcgfSxcbiAgICB7IG5hbWU6ICdwZXJpb2QnLCBsYWJlbDogJ1BlcmlvZCBUeXBlJywgZmllbGQ6ICdwZXJpb2QnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIHsgbmFtZTogJ3BlcmlvZF9sYWJlbCcsIGxhYmVsOiAnUGVyaW9kJywgZmllbGQ6ICdwZXJpb2RfbGFiZWwnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIHsgbmFtZTogJ3BlcmlvZF9zdGFydCcsIGxhYmVsOiAnUGVyaW9kIFN0YXJ0JywgZmllbGQ6ICdwZXJpb2Rfc3RhcnQnLCB0eXBlOiAnZGF0ZScgfSxcbiAgXSxcblxuICBtZWFzdXJlczogW1xuICAgIHsgbmFtZTogJ3F1b3RhX3N1bScsIGxhYmVsOiAnUXVvdGEnLCBhZ2dyZWdhdGU6ICdzdW0nLCBmaWVsZDogJ3F1b3RhJywgZm9ybWF0OiAnMCwwJyB9LFxuICAgIHsgbmFtZTogJ2Nsb3NlZF9zdW0nLCBsYWJlbDogJ0Nsb3NlZCcsIGFnZ3JlZ2F0ZTogJ3N1bScsIGZpZWxkOiAnY2xvc2VkX2Ftb3VudCcsIGZvcm1hdDogJzAsMCcgfSxcbiAgICB7IG5hbWU6ICdwaXBlbGluZV9zdW0nLCBsYWJlbDogJ1BpcGVsaW5lJywgYWdncmVnYXRlOiAnc3VtJywgZmllbGQ6ICdwaXBlbGluZV9hbW91bnQnLCBmb3JtYXQ6ICcwLDAnIH0sXG4gICAgeyBuYW1lOiAnY29tbWl0X3N1bScsIGxhYmVsOiAnQ29tbWl0JywgYWdncmVnYXRlOiAnc3VtJywgZmllbGQ6ICdjb21taXRfYW1vdW50JywgZm9ybWF0OiAnMCwwJyB9LFxuICAgIC8vIERlcml2ZWQgcmF0aW8gKEFEUi0wMDIxIFExKSByYXRoZXIgdGhhbiBhdmcoYXR0YWlubWVudF9wY3QpOiBzdW1taW5nXG4gICAgLy8gY2xvc2VkIGFuZCBxdW90YSBiZWZvcmUgZGl2aWRpbmcgd2VpZ2h0cyBldmVyeSByZXAvcGVyaW9kIGJ5IHF1b3RhXG4gICAgLy8gc2l6ZSwgd2hlcmUgYW4gYXZlcmFnZSBvZiBwZXItcm93IHBlcmNlbnRhZ2VzIHdvdWxkIG5vdC5cbiAgICB7IG5hbWU6ICdhdHRhaW5tZW50JywgbGFiZWw6ICdBdHRhaW5tZW50JywgZGVyaXZlZDogeyBvcDogJ3JhdGlvJywgb2Y6IFsnY2xvc2VkX3N1bScsICdxdW90YV9zdW0nXSB9LCBmb3JtYXQ6ICcwJScgfSxcbiAgXSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9kYXRhc2V0cy9pbmRleC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2RhdGFzZXRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YXNldHMvaW5kZXgudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogUmV2ZW51ZSBkYXRhc2V0cyBiYXJyZWwuXG4gKlxuICogVGhlIGRvY3RyaW5lIGZvciB0aGlzIG1ldGFkYXRhIHR5cGUgaXMgd3JpdHRlbiBvbmNlLCBpblxuICogYHNyYy9zYWxlcy9kYXRhc2V0cy9pbmRleC50c2A7IHRoaXMgZmlsZSBpcyB0aGUgcmV2ZW51ZSBwYWNrYWdlJ3MgaGFsZiBvZlxuICogdGhlIHNhbWUgZmlsZS1ieS1maWxlIHJlZ2lzdHJhdGlvbi5cbiAqL1xuXG5leHBvcnQgeyBQcm9kdWN0RGF0YXNldCB9IGZyb20gJy4vcHJvZHVjdC5kYXRhc2V0JztcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YXNldHMvcHJvZHVjdC5kYXRhc2V0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YXNldHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9kYXRhc2V0cy9wcm9kdWN0LmRhdGFzZXQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZURhdGFzZXQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKiBQcm9kdWN0IGFuYWx5dGljcyBkYXRhc2V0IChBRFItMDAyMSkgXHUyMDE0IGNhdGFsb2cgbGlzdC1wcmljZSByb2xsdXBzLiAqL1xuZXhwb3J0IGNvbnN0IFByb2R1Y3REYXRhc2V0ID0gZGVmaW5lRGF0YXNldCh7XG4gIG5hbWU6ICdwcm9kdWN0X21ldHJpY3MnLFxuICBsYWJlbDogJ1Byb2R1Y3QgTWV0cmljcycsXG4gIGRlc2NyaXB0aW9uOiAnU2VtYW50aWMgbGF5ZXIgZm9yIHByb2R1Y3QgY2F0YWxvZyBjb3VudHMgYW5kIGxpc3QgcHJpY2UnLFxuICBvYmplY3Q6ICdjcm1fcHJvZHVjdCcsXG4gIGRpbWVuc2lvbnM6IFtcbiAgICB7IG5hbWU6ICdjYXRlZ29yeScsIGxhYmVsOiAnQ2F0ZWdvcnknLCBmaWVsZDogJ2NhdGVnb3J5JywgdHlwZTogJ3N0cmluZycgfSxcbiAgXSxcbiAgbWVhc3VyZXM6IFtcbiAgICB7IG5hbWU6ICdwcm9kdWN0X2NvdW50JywgbGFiZWw6ICdQcm9kdWN0cycsIGFnZ3JlZ2F0ZTogJ2NvdW50JyB9LFxuICAgIHsgbmFtZTogJ2xpc3RfcHJpY2Vfc3VtJywgbGFiZWw6ICdUb3RhbCBMaXN0IFByaWNlJywgYWdncmVnYXRlOiAnc3VtJywgZmllbGQ6ICdsaXN0X3ByaWNlJywgZm9ybWF0OiAnMCwwJyB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9yZXBvcnRzL2luZGV4LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3JlcG9ydHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcmVwb3J0cy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBSZXBvcnQgRGVmaW5pdGlvbnMgQmFycmVsXG4gKlxuICogIyMgV2h5IHRoZXNlIGZpbGVzIGFubm90YXRlIHdpdGggYFJlcG9ydGAsIG5vdCBgUmVwb3J0SW5wdXRgXG4gKlxuICogT2JqZWN0U3RhY2sgMTcuMC4wLXJjLjYgcmV0aXJlZCB0aGUgYFJlcG9ydElucHV0YCBleHBvcnQgYW5kIG1vdmVkIHRoZSBiYXJlXG4gKiBuYW1lIG9udG8gdGhlIGF1dGhvcmluZyBzaGFwZSwgdW5kZXIgdGhlIEFEUi0wMTIyIGNvbnZlbnRpb24gdGhhdCBgWGAgaXMgdGhlXG4gKiBJTlBVVCB0eXBlIGFuZCBgWFBhcnNlZGAgdGhlIHBvc3QtcGFyc2Ugb25lIChkZWZhdWx0cyBhcHBsaWVkLCB0cmFuc2Zvcm1zXG4gKiBydW4pLiBUaGUgdW5kZXJseWluZyB0eXBlIGlzIHVuY2hhbmdlZCBcdTIwMTQgYHouaW5wdXQ8dHlwZW9mIFJlcG9ydFNjaGVtYT5gLFxuICogZXhhY3RseSB3aGF0IGBSZXBvcnRJbnB1dGAgbmFtZWQgXHUyMDE0IHNvIHRoZSBhbm5vdGF0aW9ucyBiZWxvdyBzdGlsbCBtZWFuXG4gKiBcImF1dGhvcmluZyBzaGFwZTogb3B0aW9uYWwgZmllbGRzIHdpdGggZGVmYXVsdHMgbWF5IGJlIG9taXR0ZWRcIi5cbiAqXG4gKiBUaGUgcmVuYW1lIGlzIHdvcnRoIHdyaXRpbmcgZG93biBiZWNhdXNlIG9uIHJjLjUgdGhlIG5hbWUgYFJlcG9ydGAgbWVhbnQgdGhlXG4gKiBPUFBPU0lURSAoYHouaW5mZXJgLCB0aGUgcGFyc2VkIHNoYXBlKS4gQW55dGhpbmcgdGhhdCB3YXMgYW5ub3RhdGVkIGBSZXBvcnRgXG4gKiBiZWZvcmUgdGhlIHVwZ3JhZGUgc2lsZW50bHkgY2hhbmdlZCBtZWFuaW5nIGluc3RlYWQgb2YgZmFpbGluZyB0byBjb21waWxlO1xuICogb25seSBgUmVwb3J0SW5wdXRgIFx1MjAxNCByZW1vdmVkIG91dHJpZ2h0IFx1MjAxNCBhbm5vdW5jZWQgaXRzZWxmLCB2aWFcbiAqIGB0c2MgLS1ub0VtaXRgLiBUaGUgc2FtZSBzd2FwIGFwcGxpZXMgdG8gYEFjdGlvbmAsIGBEYXNoYm9hcmRgIGFuZCBgUGFnZWAsXG4gKiB3aGljaCB0aGlzIGFwcCBhbHNvIGltcG9ydHMgZnJvbSBgQG9iamVjdHN0YWNrL3NwZWMvdWlgIGFuZCB3aGljaCBhcmUgYWxsXG4gKiB1c2VkIG9uIGF1dGhvcmluZyBsaXRlcmFscywgaS5lLiB0aGUgc2lkZSB0aGUgc3dhcCBtYWRlIG1vcmUgY29ycmVjdC5cbiAqL1xuXG5leHBvcnQgeyBBY2NvdW50c0J5SW5kdXN0cnlUeXBlUmVwb3J0IH0gZnJvbSAnLi9hY2NvdW50LnJlcG9ydCc7XG5leHBvcnQgeyBMZWFkSW5mbG93QnlNb250aFNvdXJjZVJlcG9ydCB9IGZyb20gJy4vbGVhZC5yZXBvcnQnO1xuZXhwb3J0IHtcbiAgT3Bwb3J0dW5pdGllc0J5U3RhZ2VSZXBvcnQsXG4gIFdvbk9wcG9ydHVuaXRpZXNCeU93bmVyUmVwb3J0LFxuICBQaXBlbGluZUNvdmVyYWdlQnlRdWFydGVyUmVwb3J0LFxuICBPcHBvcnR1bml0eUZ1bm5lbEJ5T3duZXJTdGFnZVJlcG9ydCxcbn0gZnJvbSAnLi9vcHBvcnR1bml0eS5yZXBvcnQnO1xuZXhwb3J0IHsgQ3VzdG9tZXJDaHVyblNpZ25hbHNSZXBvcnQgfSBmcm9tICcuL2NodXJuLnJlcG9ydCc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9yZXBvcnRzL2FjY291bnQucmVwb3J0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3JlcG9ydHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcmVwb3J0cy9hY2NvdW50LnJlcG9ydC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBSZXBvcnQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbmV4cG9ydCBjb25zdCBBY2NvdW50c0J5SW5kdXN0cnlUeXBlUmVwb3J0OiBSZXBvcnQgPSB7XG4gIG5hbWU6ICdhY2NvdW50c19ieV9pbmR1c3RyeV90eXBlJyxcbiAgbGFiZWw6ICdBY2NvdW50cyBieSBJbmR1c3RyeSBhbmQgVHlwZScsXG4gIGRlc2NyaXB0aW9uOiAnTWF0cml4IHJlcG9ydCBzaG93aW5nIGFjY291bnRzIGJ5IGluZHVzdHJ5IGFuZCB0eXBlJyxcbiAgZGF0YXNldDogJ2FjY291bnRfbWV0cmljcycsIHJvd3M6IFsnaW5kdXN0cnknXSwgY29sdW1uczogWyd0eXBlJ10sIHZhbHVlczogWydhY2NvdW50X2NvdW50JywgJ2FubnVhbF9yZXZlbnVlX3N1bSddLFxuICB0eXBlOiAnbWF0cml4JyxcbiAgcnVudGltZUZpbHRlcjogeyBpc19hY3RpdmU6IHRydWUgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9yZXBvcnRzL2xlYWQucmVwb3J0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3JlcG9ydHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcmVwb3J0cy9sZWFkLnJlcG9ydC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBSZXBvcnQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogTGVhZCBlbmdhZ2VtZW50IHRyZW5kIFx1MjAxNCBtYXRyaXggb3ZlciBgbGFzdF9jb250YWN0ZWRfZGF0ZWAgKGEgdXNlci1tYW5hZ2VkXG4gKiBkYXRldGltZSwgc28gaXQgY2FuIGJlIHNldCBpbiBzZWVkIGRhdGEgYW5kIHZhcmllZCBhY3Jvc3MgbW9udGhzIGZvciBhXG4gKiByZWFsaXN0aWMgZGVtbykuIExldHMgYSBtYXJrZXRpbmctb3BzIGxlYWQgc3BvdCB3aGljaCBjaGFubmVscyB3ZSdyZVxuICogYWN0aXZlbHkgd29ya2luZyBtb250aC1vdmVyLW1vbnRoLlxuICpcbiAqIGBsZWFkX21ldHJpY3MubGFzdF9jb250YWN0ZWRfZGF0ZWAgZGVjbGFyZXMgdGhlIG1vbnRoIGJ1Y2tldCwgc28gZWFjaCBjb2x1bW5cbiAqIHJlcHJlc2VudHMgb25lIGNhbGVuZGFyIG1vbnRoIGluc3RlYWQgb2YgYSByYXcgdGltZXN0YW1wLlxuICovXG5leHBvcnQgY29uc3QgTGVhZEluZmxvd0J5TW9udGhTb3VyY2VSZXBvcnQ6IFJlcG9ydCA9IHtcbiAgbmFtZTogJ2xlYWRfaW5mbG93X2J5X21vbnRoX3NvdXJjZScsXG4gIGxhYmVsOiAnTGVhZCBFbmdhZ2VtZW50IGJ5IE1vbnRoIFx1MDBENyBTb3VyY2UnLFxuICBkZXNjcmlwdGlvbjogJ0NvbnRhY3RlZC1sZWFkIHZvbHVtZSBwZXIgbW9udGgsIGJyb2tlbiBkb3duIGJ5IGFjcXVpc2l0aW9uIGNoYW5uZWwnLFxuICBkYXRhc2V0OiAnbGVhZF9tZXRyaWNzJywgcm93czogWydsZWFkX3NvdXJjZSddLCBjb2x1bW5zOiBbJ2xhc3RfY29udGFjdGVkX2RhdGUnXSwgdmFsdWVzOiBbJ2xlYWRfY291bnQnXSxcbiAgdHlwZTogJ21hdHJpeCcsXG4gIC8vIEEgbmV2ZXItY29udGFjdGVkIGxlYWQgaGFzIG5vIGVuZ2FnZW1lbnQgbW9udGgsIGFuZCBncm91cGluZyBpdCBwcm9kdWNlZCBhXG4gIC8vIGhlYWRlcmxlc3MgJ1x1MjAxNCcgY29sdW1uIG5leHQgdG8gdGhlIHJlYWwgb25lcy4gVGhpcyByZXBvcnQgY291bnRzIENPTlRBQ1RFRFxuICAvLyBsZWFkcyAoc2VlIHRoZSBsYWJlbC9kZXNjcmlwdGlvbiksIHNvIHRoZSBlbXB0eSBidWNrZXQgaXMgZXhjbHVkZWQgYXQgdGhlXG4gIC8vIHNvdXJjZSByYXRoZXIgdGhhbiByZW5kZXJlZCBhcyBhIG15c3RlcnkgY29sdW1uLlxuICBydW50aW1lRmlsdGVyOiB7IGxhc3RfY29udGFjdGVkX2RhdGU6IHsgJG5lOiBudWxsIH0gfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9yZXBvcnRzL29wcG9ydHVuaXR5LnJlcG9ydC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9yZXBvcnRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3JlcG9ydHMvb3Bwb3J0dW5pdHkucmVwb3J0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFJlcG9ydCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuZXhwb3J0IGNvbnN0IE9wcG9ydHVuaXRpZXNCeVN0YWdlUmVwb3J0OiBSZXBvcnQgPSB7XG4gIG5hbWU6ICdvcHBvcnR1bml0aWVzX2J5X3N0YWdlJyxcbiAgbGFiZWw6ICdPcHBvcnR1bml0aWVzIGJ5IFN0YWdlJyxcbiAgZGVzY3JpcHRpb246ICdTdW1tYXJ5IG9mIG9wcG9ydHVuaXRpZXMgZ3JvdXBlZCBieSBzdGFnZScsXG4gIGRhdGFzZXQ6ICdvcHBvcnR1bml0eV9tZXRyaWNzJywgcm93czogWydzdGFnZSddLCB2YWx1ZXM6IFsndG90YWxfYW1vdW50JywgJ2F2Z19wcm9iYWJpbGl0eSddLFxuICB0eXBlOiAnc3VtbWFyeScsXG4gIC8vIGB7Y3VycmVudF95ZWFyX3N0YXJ0fWAgaXMgYSBzcGVjIGRhdGUgbWFjcm8gKERBVEVfTUFDUk9fVE9LRU5TKSByZXNvbHZlZFxuICAvLyBwZXItcXVlcnksIHNvIHRoZSBZVEQgd2luZG93IHJvbGxzIHdpdGggdGltZSBpbnN0ZWFkIG9mIGZyZWV6aW5nIHRoZSB5ZWFyXG4gIC8vIHRoZSBhcnRpZmFjdCB3YXMgYnVpbHQgaW50byBkaXN0L29iamVjdHN0YWNrLmpzb24uXG4gIHJ1bnRpbWVGaWx0ZXI6IHsgc3RhZ2U6IHsgJG5lOiAnY2xvc2VkX2xvc3QnIH0sIGNsb3NlX2RhdGU6IHsgJGd0ZTogJ3tjdXJyZW50X3llYXJfc3RhcnR9JyB9IH0sXG4gIGNoYXJ0OiB7IHR5cGU6ICdiYXInLCB0aXRsZTogJ1BpcGVsaW5lIGJ5IFN0YWdlJywgc2hvd0xlZ2VuZDogdHJ1ZSwgeEF4aXM6ICdzdGFnZScsIHlBeGlzOiAndG90YWxfYW1vdW50JyB9XG59O1xuXG5leHBvcnQgY29uc3QgV29uT3Bwb3J0dW5pdGllc0J5T3duZXJSZXBvcnQ6IFJlcG9ydCA9IHtcbiAgbmFtZTogJ3dvbl9vcHBvcnR1bml0aWVzX2J5X293bmVyJyxcbiAgbGFiZWw6ICdXb24gT3Bwb3J0dW5pdGllcyBieSBPd25lcicsXG4gIGRlc2NyaXB0aW9uOiAnQ2xvc2VkIHdvbiBvcHBvcnR1bml0aWVzIGdyb3VwZWQgYnkgb3duZXInLFxuICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIHJvd3M6IFsnb3duZXInXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICB0eXBlOiAnc3VtbWFyeScsXG4gIHJ1bnRpbWVGaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfd29uJyB9LFxuICBjaGFydDogeyB0eXBlOiAnY29sdW1uJywgdGl0bGU6ICdSZXZlbnVlIGJ5IFNhbGVzIFJlcCcsIHNob3dMZWdlbmQ6IGZhbHNlLCB4QXhpczogJ293bmVyJywgeUF4aXM6ICd0b3RhbF9hbW91bnQnIH1cbn07XG5cbi8qKlxuICogUXVhcnRlcmx5IHBpcGVsaW5lIGNvdmVyYWdlIFx1MjAxNCB0aGUgbWF0cml4IHZpZXcgdGhhdCBwb3dlcnMgdGhlIGNsYXNzaWNcbiAqIHNhbGVzLW9wcyBcInBpcGVsaW5lIGNvdmVyYWdlXCIgY29udmVyc2F0aW9uOiBlYWNoIGZvcmVjYXN0IGNhdGVnb3J5IGFnYWluc3RcbiAqIHRoZSBxdWFydGVyIHRoZSBkZWFsIGlzIGV4cGVjdGVkIHRvIGNsb3NlIGluLiBgY2xvc2VfcXVhcnRlcmAgaXMgYSBkZWRpY2F0ZWRcbiAqIHF1YXJ0ZXJseSBkaW1lbnNpb24gb3ZlciB0aGUgc2FtZSBmaWVsZDsgdGhlIHRyZW5kIHdpZGdldHMga2VlcCB0aGVpclxuICogbW9udGhseSBgY2xvc2VfZGF0ZWAgZGltZW5zaW9uLlxuICovXG5leHBvcnQgY29uc3QgUGlwZWxpbmVDb3ZlcmFnZUJ5UXVhcnRlclJlcG9ydDogUmVwb3J0ID0ge1xuICBuYW1lOiAncGlwZWxpbmVfY292ZXJhZ2VfYnlfcXVhcnRlcicsXG4gIGxhYmVsOiAnUGlwZWxpbmUgQ292ZXJhZ2UgYnkgRm9yZWNhc3QgXHUwMEQ3IFF1YXJ0ZXInLFxuICBkZXNjcmlwdGlvbjogJ09wZW4gcGlwZWxpbmUgYW1vdW50IGJ5IGZvcmVjYXN0IGNhdGVnb3J5LCBidWNrZXRlZCBieSBjbG9zZSBxdWFydGVyJyxcbiAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCByb3dzOiBbJ2ZvcmVjYXN0X2NhdGVnb3J5J10sIGNvbHVtbnM6IFsnY2xvc2VfcXVhcnRlciddLCB2YWx1ZXM6IFsndG90YWxfYW1vdW50JywgJ29wcF9jb3VudCddLFxuICB0eXBlOiAnbWF0cml4JyxcbiAgcnVudGltZUZpbHRlcjogeyBzdGFnZTogeyAkbmluOiBbJ2Nsb3NlZF93b24nLCAnY2xvc2VkX2xvc3QnXSB9IH0sXG59O1xuXG4vKipcbiAqIFNhbGVzLXJlcCBmdW5uZWwgXHUyMDE0IHR3by1sZXZlbCBzdW1tYXJ5IHRoYXQgbWlycm9ycyBob3cgcmVwcyBkcmlsbCBpbnRvIHRoZWlyXG4gKiBvd24gYm9vayBvZiBidXNpbmVzcy4gRXhlcmNpc2VzIG11bHRpLWxldmVsIGByb3dzYCBncm91cGluZyAob3duZXIgXHUyMTkyIHN0YWdlKVxuICogb3ZlciB0aGUgZGF0YXNldCdzIG1lYXN1cmVzLlxuICovXG5leHBvcnQgY29uc3QgT3Bwb3J0dW5pdHlGdW5uZWxCeU93bmVyU3RhZ2VSZXBvcnQ6IFJlcG9ydCA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X2Z1bm5lbF9vd25lcl9zdGFnZScsXG4gIGxhYmVsOiAnT3Bwb3J0dW5pdHkgRnVubmVsIGJ5IE93bmVyIFx1MjE5MiBTdGFnZScsXG4gIGRlc2NyaXB0aW9uOiAnUGVyLXJlcCBzdGFnZS1ieS1zdGFnZSBwaXBlbGluZSBmdW5uZWwnLFxuICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIHJvd3M6IFsnb3duZXInLCAnc3RhZ2UnXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCcsICdvcHBfY291bnQnLCAnYXZnX3Byb2JhYmlsaXR5J10sXG4gIHR5cGU6ICdzdW1tYXJ5JyxcbiAgcnVudGltZUZpbHRlcjogeyBzdGFnZTogeyAkbmU6ICdjbG9zZWRfbG9zdCcgfSB9LFxuICBjaGFydDogeyB0eXBlOiAnZnVubmVsJywgdGl0bGU6ICdQaXBlbGluZSBGdW5uZWwnLCBzaG93TGVnZW5kOiBmYWxzZSwgeEF4aXM6ICdzdGFnZScsIHlBeGlzOiAndG90YWxfYW1vdW50JyB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3JlcG9ydHMvY2h1cm4ucmVwb3J0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3JlcG9ydHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcmVwb3J0cy9jaHVybi5yZXBvcnQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgUmVwb3J0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKipcbiAqIEN1c3RvbWVyIENodXJuIFNpZ25hbHMgXHUyMDE0IGEgXCJqb2luZWRcIiByZXBvcnQgdGhhdCBnaXZlcyBhIEN1c3RvbWVyIFN1Y2Nlc3NcbiAqIE1hbmFnZXIgYSBvbmUtc2NyZWVuIHZpZXcgb2YgdGhlIGZvdXIgcG9wdWxhdGlvbnMgdGhhdCBtYXR0ZXIgZm9yXG4gKiBwcm9hY3RpdmUgY2h1cm4gaW50ZXJ2ZW50aW9uOlxuICpcbiAqICAgMS4gQ1NNLUZsYWdnZWQgICAgICAgICAgXHUyMDE0IGFjY291bnRzIGEgaHVtYW4gaGFzIG1hcmtlZCBhdF9yaXNrIC8gY2h1cm5pbmdcbiAqICAgMi4gQXQtUmlzayBBY2NvdW50cyAgICAgXHUyMDE0IGFjdGl2ZSBhY2NvdW50cyB3aXRoIG5vIGFjdGl2aXR5IGluIDYwKyBkYXlzXG4gKiAgIDMuIFNpbGVudCBIaWdoLVZhbHVlICAgIFx1MjAxNCBzdHJhdGVnaWMvZW50ZXJwcmlzZSBhY2NvdW50cyBnb25lIHF1aWV0ICg5MCsgZGF5cylcbiAqICAgNC4gUmVjZW50bHkgQ2xvc2VkLUxvc3QgXHUyMDE0IG9wcG9ydHVuaXRpZXMgbG9zdCBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gKlxuICogRWFjaCBibG9jayBpcyBhbiBpbmRlcGVuZGVudCBzdWItcmVwb3J0OyB0aGUgam9pbmVkIHJlbmRlcmVyIHN0YWNrcyB0aGVtXG4gKiB2ZXJ0aWNhbGx5LiBUaGVyZSBpcyBubyBjb250YWluZXItbGV2ZWwgZmlsdGVyIG9uIHRoaXMgcmVwb3J0IFx1MjAxNCBlYWNoIGJsb2NrXG4gKiBjYXJyaWVzIGl0cyBvd24gc2NvcGUgYmVjYXVzZSB0aGV5IHF1ZXJ5IGRpZmZlcmVudCBvYmplY3RzIChgY3JtX2FjY291bnRgLFxuICogYGNybV9vcHBvcnR1bml0eWApIGF0IGRpZmZlcmVudCB0aW1lIGhvcml6b25zLlxuICpcbiAqIEJsb2NrIDEgaXMgZGVsaWJlcmF0ZWx5IEZJUlNUIGFuZCBkZWxpYmVyYXRlbHkgbm90IHRpbWUtd2luZG93ZWQuIEJsb2NrcyAyLTRcbiAqIGFyZSBhbGwgZGVyaXZlZCBzaWduYWxzOiB0aGUgY2xvY2sgc3RvcHBlZCwgdGhlIHRpZXIgaXMgcXVpZXQsIHRoZSBkZWFsIHdhc1xuICogbG9zdC4gYGNybV9hY2NvdW50LmhlYWx0aF9zY29yZWAgaXMgdGhlIG9ubHkgY2h1cm4gc2lnbmFsIGluIHRoZSBtb2RlbCBhXG4gKiBwZXJzb24gKmFzc2VydHMqIFx1MjAxNCBhIENTTSB3aG8gaGFzIGJlZW4gaW4gdGhlIHJvb20gc2V0cyBgYXRfcmlza2Agb3JcbiAqIGBjaHVybmluZ2AgYnkgaGFuZCBcdTIwMTQgc28gaXQgaXMgdGhlIHN0cm9uZ2VzdCBldmlkZW5jZSBvbiB0aGUgcGFnZSBhbmQgaXQgaXNcbiAqIGluZGVwZW5kZW50IG9mIGV2ZXJ5IHdpbmRvdyBiZWxvdyBpdC4gQW4gYWNjb3VudCB0aGF0IGlzIGJlaW5nIHRhbGtlZCB0b1xuICogZGFpbHkgYW5kIGlzIHN0aWxsIGNodXJuaW5nIGlzIGludmlzaWJsZSB0byBibG9ja3MgMi00IGJ5IGNvbnN0cnVjdGlvbiwgYW5kXG4gKiB0aGF0IGFjY291bnQgaXMgdGhlIHdob2xlIHJlYXNvbiB0aGlzIGJsb2NrIGV4aXN0cyAoIzExODYpLlxuICpcbiAqIFRpbWUgd2luZG93cyB1c2UgdGhlIHNwZWMncyBkYXRlLW1hY3JvIHBsYWNlaG9sZGVycyAoYHs2MF9kYXlzX2Fnb31gLCBcdTIwMjYsXG4gKiBEQVRFX01BQ1JPX1RPS0VOUyBpbiBAb2JqZWN0c3RhY2svc3BlYy9kYXRhKSwgd2hpY2ggcmVzb2x2ZSBwZXItcXVlcnkuXG4gKiBDb21wdXRpbmcgdGhlIGRhdGVzIGF0IG1vZHVsZSBsb2FkIGZyb3plIHRoZW0gaW50byBkaXN0L29iamVjdHN0YWNrLmpzb24sXG4gKiBzbyBldmVyeSB3aW5kb3cgc2lsZW50bHkgc3RvcHBlZCByb2xsaW5nIG9uIHRoZSBkYXkgdGhlIGFydGlmYWN0IHdhcyBidWlsdC5cbiAqXG4gKiBKb2luZWQgUmVwb3J0cyBkZW1vbnN0cmF0ZSB0aGUgc3BlYydzIE0zIGNhcGFiaWxpdHk6IG11bHRpLWJsb2NrIGFuYWx5dGljXG4gKiBzdXJmYWNlcyB3aXRoIHNoYXJlZCBjaHJvbWUgYnV0IGluZGVwZW5kZW50IGRhdGEgYmluZGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IEN1c3RvbWVyQ2h1cm5TaWduYWxzUmVwb3J0OiBSZXBvcnQgPSB7XG4gIG5hbWU6ICdjdXN0b21lcl9jaHVybl9zaWduYWxzJyxcbiAgbGFiZWw6ICdDdXN0b21lciBDaHVybiBTaWduYWxzJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1RocmVlLXBhbmVsIGVhcmx5LXdhcm5pbmcgdmlldzogYXQtcmlzayBjdXN0b21lcnMsIHNpbGVudCBoaWdoLXZhbHVlIGFjY291bnRzLCBhbmQgcmVjZW50bHktbG9zdCBvcHBvcnR1bml0aWVzLicsXG4gIHR5cGU6ICdqb2luZWQnLFxuICBibG9ja3M6IFtcbiAgICB7XG4gICAgICAvLyBOYW1lZCBmb3IgdGhlIEFDVE9SLCBub3QgdGhlIHZhbHVlLCBiZWNhdXNlIGBhdF9yaXNrYCBpcyBhbHNvIGFcbiAgICAgIC8vIGBoZWFsdGhfc2NvcmVgIG9wdGlvbiBhbmQgYGF0X3Jpc2tfYWNjb3VudHNgIGlzIGFscmVhZHkgdGhlIGJsb2NrXG4gICAgICAvLyBiZWxvdyAoYSB0aW1lIHdpbmRvdywgbm90aGluZyB0byBkbyB3aXRoIHRoZSBmaWVsZCkuIFRoZSB0d28gYXJlXG4gICAgICAvLyBhbGxvd2VkIHRvIG92ZXJsYXA6IHRoaXMgb25lIGFza3MgXCJ3aG8gZGlkIGEgaHVtYW4gZmxhZ1wiLCB0aGF0IG9uZVxuICAgICAgLy8gYXNrcyBcIndob3NlIGNsb2NrIHN0b3BwZWRcIi5cbiAgICAgIG5hbWU6ICdjc21fZmxhZ2dlZF9hY2NvdW50cycsXG4gICAgICBsYWJlbDogJ0NTTS1GbGFnZ2VkIEFjY291bnRzJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnQWNjb3VudHMgYSBDU00gaGFzIGhhbmQtZmxhZ2dlZCBhcyBhdC1yaXNrIG9yIGNodXJuaW5nLCBncm91cGVkIGJ5IHR5cGUgXHUyMDE0IGh1bWFuIGp1ZGdlbWVudCwgaW5kZXBlbmRlbnQgb2YgdGhlIGFjdGl2aXR5IGNsb2NrLicsXG4gICAgICB0eXBlOiAnc3VtbWFyeScsXG4gICAgICBkYXRhc2V0OiAnYWNjb3VudF9tZXRyaWNzJywgcm93czogWyd0eXBlJ10sIHZhbHVlczogWydhY2NvdW50X2NvdW50J10sXG4gICAgICAvLyBObyBkYXRlIHRlcm0gb24gcHVycG9zZSAoc2VlIHRoZSBoZWFkZXIpLiBgaXNfYWN0aXZlYCBtYXRjaGVzIHRoZSB0d29cbiAgICAgIC8vIGFjY291bnQgYmxvY2tzIGJlbG93OiBhIGRlYWN0aXZhdGVkIGFjY291bnQgaGFzIGFscmVhZHkgY2h1cm5lZCwgc28gaXRcbiAgICAgIC8vIGlzIG5vdCBhIHJldGVudGlvbiBxdWV1ZSBpdGVtLiBHcm91cGluZyBieSBgdHlwZWAgc2VwYXJhdGVzIGEgZmxhZ2dlZFxuICAgICAgLy8gQ1VTVE9NRVIgKHJldmVudWUgYXQgcmlzayB0b2RheSkgZnJvbSBhIGZsYWdnZWQgcHJvc3BlY3Qgb3IgcGFydG5lcixcbiAgICAgIC8vIHdoaWNoIHRoZSBncmlkIHZpZXcgYGNybV9hY2NvdW50LmF0X3Jpc2tfYWNjb3VudHNgIGNhbm5vdCBzaG93IFx1MjAxNCBpdCBpc1xuICAgICAgLy8gc2NvcGVkIHRvIGB0eXBlOiAnY3VzdG9tZXInYCBiZWZvcmUgYW55dGhpbmcgZWxzZS5cbiAgICAgIHJ1bnRpbWVGaWx0ZXI6IHtcbiAgICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgICAgICBoZWFsdGhfc2NvcmU6IHsgJGluOiBbJ2F0X3Jpc2snLCAnY2h1cm5pbmcnXSB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdhdF9yaXNrX2FjY291bnRzJyxcbiAgICAgIGxhYmVsOiAnQXQtUmlzayBBY2NvdW50cycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBhY2NvdW50cyB3aXRoIG5vIGFjdGl2aXR5IGluIDYwKyBkYXlzLCBncm91cGVkIGJ5IGluZHVzdHJ5LicsXG4gICAgICB0eXBlOiAnc3VtbWFyeScsXG4gICAgICBkYXRhc2V0OiAnYWNjb3VudF9tZXRyaWNzJywgcm93czogWydpbmR1c3RyeSddLCB2YWx1ZXM6IFsnYWNjb3VudF9jb3VudCddLFxuICAgICAgcnVudGltZUZpbHRlcjoge1xuICAgICAgICBpc19hY3RpdmU6IHRydWUsXG4gICAgICAgIGxhc3RfYWN0aXZpdHlfZGF0ZTogeyAkbHQ6ICd7NjBfZGF5c19hZ299JyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdzaWxlbnRfaGlnaF92YWx1ZScsXG4gICAgICBsYWJlbDogJ1NpbGVudCBIaWdoLVZhbHVlIEFjY291bnRzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU3RyYXRlZ2ljIGFuZCBlbnRlcnByaXNlIGFjY291bnRzIGdvbmUgcXVpZXQgZm9yIDkwKyBkYXlzLCBncm91cGVkIGJ5IHR5cGUuJyxcbiAgICAgIHR5cGU6ICdzdW1tYXJ5JyxcbiAgICAgIGRhdGFzZXQ6ICdhY2NvdW50X21ldHJpY3MnLCByb3dzOiBbJ3R5cGUnXSwgdmFsdWVzOiBbJ2FjY291bnRfY291bnQnXSxcbiAgICAgIC8vIFwiSGlnaC12YWx1ZVwiIGlzIHRoZSBhY2NvdW50J3MgdGllciwgbm90IGEgcmV2ZW51ZSB0aHJlc2hvbGQ6IHRoZVxuICAgICAgLy8gc3RyYXRlZ2ljL2VudGVycHJpc2UgdGllcnMgYXJlIGV4YWN0bHkgdGhlIGJvb2sgdGhlIENTTSB0ZWFtIG93bnMuXG4gICAgICBydW50aW1lRmlsdGVyOiB7XG4gICAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgdGllcjogeyAkaW46IFsnc3RyYXRlZ2ljJywgJ2VudGVycHJpc2UnXSB9LFxuICAgICAgICBsYXN0X2FjdGl2aXR5X2RhdGU6IHsgJGx0OiAnezkwX2RheXNfYWdvfScgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAncmVjZW50bHlfY2xvc2VkX2xvc3QnLFxuICAgICAgbGFiZWw6ICdSZWNlbnRseSBMb3N0IE9wcG9ydHVuaXRpZXMnLFxuICAgICAgZGVzY3JpcHRpb246ICdPcHBvcnR1bml0aWVzIGNsb3NlZC1sb3N0IGluIHRoZSBsYXN0IDMwIGRheXMgXHUyMDE0IGludmVzdGlnYXRlIGJlZm9yZSB0aGUgY3VzdG9tZXIgZnVsbHkgY2h1cm5zLicsXG4gICAgICB0eXBlOiAnc3VtbWFyeScsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIHJvd3M6IFsnb3duZXInXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCcsICdvcHBfY291bnQnXSxcbiAgICAgIHJ1bnRpbWVGaWx0ZXI6IHtcbiAgICAgICAgc3RhZ2U6ICdjbG9zZWRfbG9zdCcsXG4gICAgICAgIGNsb3NlX2RhdGU6IHsgJGd0ZTogJ3szMF9kYXlzX2Fnb30nIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3MvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3MvaW5kZXgudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogSW1wb3J0IG1hcHBpbmcgYmFycmVsLlxuICpcbiAqIEVhY2ggZW50cnkgaXMgYSByZXVzYWJsZSwgZ292ZXJuZWQgY29sdW1uXHUyMTkyZmllbGQgcHJvamVjdGlvbiByZWZlcmVuY2VkIGJ5XG4gKiBuYW1lIGZyb20gdGhlIGltcG9ydCBlbmRwb2ludCAoYG1hcHBpbmdOYW1lOiAnY3JtX2FjY291bnRfaW1wb3J0J2ApLCBzbyBhXG4gKiBjdXN0b21lciBsb2FkaW5nIHRoZWlyIG93biBzcHJlYWRzaGVldCBuZXZlciBoYXMgdG8gbWFwIGNvbHVtbnMgYnkgaGFuZC5cbiAqIFRlbXBsYXRlcyB3aXRoIHRoZSBtYXRjaGluZyBoZWFkZXJzIGxpdmUgaW4gYGFzc2V0cy9pbXBvcnQtdGVtcGxhdGVzL2AsIGFuZFxuICogdGhlIGJ1c2luZXNzLWZhY2luZyB3YWxrdGhyb3VnaCBpc1xuICogYGNvbnRlbnQvZG9jcy9ndWlkZXMvaW1wb3J0aW5nLXlvdXItZGF0YS5tZHhgLlxuICovXG5cbmV4cG9ydCB7IEFjY291bnRJbXBvcnRNYXBwaW5nIH0gZnJvbSAnLi9hY2NvdW50X2ltcG9ydC5tYXBwaW5nJztcbmV4cG9ydCB7IENvbnRhY3RJbXBvcnRNYXBwaW5nIH0gZnJvbSAnLi9jb250YWN0X2ltcG9ydC5tYXBwaW5nJztcbmV4cG9ydCB7IExlYWRJbXBvcnRNYXBwaW5nIH0gZnJvbSAnLi9sZWFkX2ltcG9ydC5tYXBwaW5nJztcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL21hcHBpbmdzL2FjY291bnRfaW1wb3J0Lm1hcHBpbmcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3MvYWNjb3VudF9pbXBvcnQubWFwcGluZy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lTWFwcGluZyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgSU5EVVNUUllfU1lOT05ZTVMgfSBmcm9tICcuL19zaGFyZWQnO1xuXG4vKipcbiAqIEFjY291bnQgaW1wb3J0IG1hcHBpbmcgXHUyMDE0IFwiaGVyZSBpcyBteSBhY2NvdW50cyBzcHJlYWRzaGVldCwgbG9hZCBpdFwiLlxuICpcbiAqIFVzZWQgYnkgcGFzc2luZyBgbWFwcGluZ05hbWU6ICdjcm1fYWNjb3VudF9pbXBvcnQnYCB0byB0aGUgaW1wb3J0IGVuZHBvaW50XG4gKiAoYFBPU1QgL2FwaS92MS9kYXRhL2NybV9hY2NvdW50L2ltcG9ydC9qb2JzYCkgaW5zdGVhZCBvZiBoYW5kLWJ1aWxkaW5nIGFcbiAqIHBlci1jb2x1bW4gbWFwcGluZyBpbiB0aGUgcmVxdWVzdC4gVGhlIGNvbHVtbnMgYmVsb3cgYXJlIHRoZSBvbmVzIGEgbm9ybWFsXG4gKiBDUk0vc3ByZWFkc2hlZXQgZXhwb3J0IGNhcnJpZXM7IGBhc3NldHMvaW1wb3J0LXRlbXBsYXRlcy9hY2NvdW50cy5jc3ZgIGlzIGFcbiAqIHJlYWR5LW1hZGUgc2hlZXQgd2l0aCBleGFjdGx5IHRoZXNlIGhlYWRlcnMuXG4gKlxuICogQmVoYXZpb3VyIHdvcnRoIGtub3dpbmcgYmVmb3JlIGNoYW5naW5nIGFueXRoaW5nIGhlcmU6XG4gKlxuICogLSAqKlN0cmljdCBwcm9qZWN0aW9uLioqIEEgbmFtZWQgbWFwcGluZyBlbWl0cyBPTkxZIHRoZSB0YXJnZXRzIGxpc3RlZFxuICogICBiZWxvdyBcdTIwMTQgZXZlcnkgb3RoZXIgY29sdW1uIGluIHRoZSBjdXN0b21lcidzIGZpbGUgaXMgZHJvcHBlZCByYXRoZXIgdGhhblxuICogICBwYXNzZWQgdGhyb3VnaCAoYHBhY2thZ2VzL3Jlc3Qvc3JjL2ltcG9ydC1tYXBwaW5nLnRzYCkuIFRoYXQgaXMgdGhlIHBvaW50OlxuICogICBhbiBleHBvcnQgZnJvbSBhbm90aGVyIHN5c3RlbSBjYXJyaWVzIGRvemVucyBvZiBjb2x1bW5zIHRoYXQgbXVzdCBub3RcbiAqICAgcmVhY2ggdGhlIHdyaXRlIHBhdGguIEl0IGFsc28gbWVhbnMgYSBmaWVsZCB0aGF0IGlzIG5vdCBsaXN0ZWQgaGVyZSBjYW5cbiAqICAgbmV2ZXIgYmUgaW1wb3J0ZWQgdGhyb3VnaCB0aGlzIG1hcHBpbmcuXG4gKiAtICoqVXBzZXJ0IGtleS4qKiBgY3JtX2FjY291bnQubmFtZWAgY2FycmllcyBhIHVuaXF1ZSBpbmRleCwgc28gaXQgaXMgdGhlXG4gKiAgIG5hdHVyYWwgYnVzaW5lc3Mga2V5OiByZS1ydW5uaW5nIHRoZSBzYW1lIGZpbGUgdXBkYXRlcyByYXRoZXIgdGhhblxuICogICBkdXBsaWNhdGVzLiBTb3VyY2UgbmFtZXMgYXJlIG1hdGNoZWQgdmVyYmF0aW0gXHUyMDE0IHRoZSBpbXBvcnQgcGF0aCBoYXMgbm9cbiAqICAgY2FzZS93aGl0ZXNwYWNlIG5vcm1hbGlzYXRpb24gc3RlcCwgc28gXCJBY21lIENvcnBcIiBhbmQgXCJBQ01FIENvcnBcIiBhcmUgdHdvXG4gKiAgIGFjY291bnRzLiBgdHJpbVdoaXRlc3BhY2VgIChvbiBieSBkZWZhdWx0KSByZW1vdmVzIHBhZGRpbmcgb25seS5cbiAqIC0gKipgbW9kZWAgLyBgdXBzZXJ0S2V5YCBhcmUgREVGQVVMVFMuKiogQW4gZXhwbGljaXQgYHdyaXRlTW9kZWAgL1xuICogICBgbWF0Y2hGaWVsZHNgIGluIHRoZSByZXF1ZXN0IHN0aWxsIHdpbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBBY2NvdW50SW1wb3J0TWFwcGluZyA9IGRlZmluZU1hcHBpbmcoe1xuICBuYW1lOiAnY3JtX2FjY291bnRfaW1wb3J0JyxcbiAgbGFiZWw6ICdBY2NvdW50IEltcG9ydCAoQ1NWKScsXG4gIHRhcmdldE9iamVjdDogJ2NybV9hY2NvdW50JyxcbiAgc291cmNlRm9ybWF0OiAnY3N2JywgLy8gYWxzbyBhY2NlcHRlZCBmb3IgLnhsc3ggdXBsb2FkcyBcdTIwMTQgYm90aCBhcmUgdGFidWxhclxuICBtb2RlOiAndXBzZXJ0JyxcbiAgdXBzZXJ0S2V5OiBbJ25hbWUnXSxcblxuICBmaWVsZE1hcHBpbmc6IFtcbiAgICB7IHNvdXJjZTogJ0FjY291bnQgTmFtZScsIHRhcmdldDogJ25hbWUnIH0sXG5cbiAgICB7XG4gICAgICBzb3VyY2U6ICdBY2NvdW50IFR5cGUnLFxuICAgICAgdGFyZ2V0OiAndHlwZScsXG4gICAgICB0cmFuc2Zvcm06ICdtYXAnLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIHZhbHVlTWFwOiB7XG4gICAgICAgICAgJ0NsaWVudCc6ICdjdXN0b21lcicsXG4gICAgICAgICAgJ1Jlc2VsbGVyJzogJ3BhcnRuZXInLFxuICAgICAgICAgICdDaHVybmVkJzogJ2Zvcm1lcicsXG4gICAgICAgICAgJ0xvc3QgQ3VzdG9tZXInOiAnZm9ybWVyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHtcbiAgICAgIHNvdXJjZTogJ0luZHVzdHJ5JyxcbiAgICAgIHRhcmdldDogJ2luZHVzdHJ5JyxcbiAgICAgIHRyYW5zZm9ybTogJ21hcCcsXG4gICAgICBwYXJhbXM6IHsgdmFsdWVNYXA6IElORFVTVFJZX1NZTk9OWU1TIH0sXG4gICAgfSxcblxuICAgIC8vIFRoZSBhY2NvdW50IGhvb2sgcmVqZWN0cyBhIHdlYnNpdGUgdGhhdCBpcyBub3QgaHR0cChzKSBcdTIwMTQga2VlcCBmdWxsIFVSTHNcbiAgICAvLyBpbiB0aGUgc291cmNlIHNoZWV0IChzZWUgYHNyYy9zYWxlcy9vYmplY3RzL2FjY291bnQuaG9vay50c2ApLlxuICAgIHsgc291cmNlOiAnV2Vic2l0ZScsIHRhcmdldDogJ3dlYnNpdGUnIH0sXG4gICAgeyBzb3VyY2U6ICdQaG9uZScsIHRhcmdldDogJ3Bob25lJyB9LFxuICAgIHsgc291cmNlOiAnQW5udWFsIFJldmVudWUnLCB0YXJnZXQ6ICdhbm51YWxfcmV2ZW51ZScgfSxcbiAgICB7IHNvdXJjZTogJ0VtcGxveWVlcycsIHRhcmdldDogJ251bWJlcl9vZl9lbXBsb3llZXMnIH0sXG4gICAgeyBzb3VyY2U6ICdEZXNjcmlwdGlvbicsIHRhcmdldDogJ2Rlc2NyaXB0aW9uJyB9LFxuXG4gICAgLy8gT3duZXIgcmVzb2x1dGlvbi4gVkVSSUZJRUQgYWdhaW5zdCB0aGUgcGxhdGZvcm0gaW1wb3J0IHBhdGhcbiAgICAvLyAoYHBhY2thZ2VzL3Jlc3Qvc3JjL2ltcG9ydC1ydW5uZXIudHNgIFx1MjE5MiBgcmVzb2x2ZVJlZmApOiBhIHJlZmVyZW5jZSBjZWxsXG4gICAgLy8gaXMgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgcmVmZXJlbmNlZCBvYmplY3QgYnkgYGlkYCwgdGhlIGZpZWxkJ3NcbiAgICAvLyBgZGlzcGxheUZpZWxkYCwgdGhlbiBgbmFtZWAgLyBgdGl0bGVgIC8gYGxhYmVsYCAvIGBmdWxsX25hbWVgIC8gYGVtYWlsYCAvXG4gICAgLy8gYHVzZXJuYW1lYC4gYHN5c191c2VyYCBoYXMgYW4gYGVtYWlsYCBjb2x1bW4sIHNvIGFuIG93bmVyLWVtYWlsIGNlbGxcbiAgICAvLyByZXNvbHZlcyB0byB0aGF0IHVzZXIncyBpZCBcdTIwMTQgbm8gc2VwYXJhdGUgcmVzb2x1dGlvbiBzdGVwIGlzIG5lZWRlZCBoZXJlLlxuICAgIC8vIEFuIGFkZHJlc3MgdGhhdCBtYXRjaGVzIG5vIHVzZXIgRkFJTFMgdGhlIHJvdyAoYHJlZmVyZW5jZV9ub3RfZm91bmRgKTtcbiAgICAvLyBsZWF2aW5nIHRoZSBjZWxsIEJMQU5LIGlzIHRoZSBzdXBwb3J0ZWQgZmFsbGJhY2sgXHUyMDE0IHRoZSBzZWN1cml0eVxuICAgIC8vIG1pZGRsZXdhcmUncyBpbnNlcnQtdGltZSBzdGFtcCB0aGVuIG1ha2VzIHRoZSBpbXBvcnRpbmcgdXNlciB0aGUgb3duZXJcbiAgICAvLyAodGhlIGltcG9ydCB3cml0ZSBjYXJyaWVzIHRoZSBpbXBvcnRlcidzIGNvbnRleHQsIG5vdCBgaXNTeXN0ZW1gKS5cbiAgICAvL1xuICAgIC8vIFRoZSB0YXJnZXQgaXMgYG93bmVyX2lkYCwgdGhlIHBsYXRmb3JtIG93bmVyc2hpcCBhbmNob3IgXHUyMDE0ICM1NDggcmV0aXJlZFxuICAgIC8vIHRoZSBhcHAtYXV0aG9yZWQgYG93bmVyYCBsb29rdXAgdGhpcyB1c2VkIHRvIG5hbWUuIEEgcmVzb2x2ZWQgY2VsbCBpc1xuICAgIC8vIHRoZXJlZm9yZSBhbiBvd25lcnNoaXAgVFJBTlNGRVI6IGl0IHBsYW50cyB0aGUgcm93IHVuZGVyIHNvbWVvbmUgb3RoZXJcbiAgICAvLyB0aGFuIHRoZSBpbXBvcnRlciwgd2hpY2ggdGhlICMzMDA0IGd1YXJkIGRlbmllcyB1bmxlc3MgdGhlIGltcG9ydGluZyB1c2VyXG4gICAgLy8gaG9sZHMgYGFsbG93VHJhbnNmZXJgIChzeXN0ZW1fYWRtaW4gLyBzYWxlc19tYW5hZ2VyIGRvKS4gVGhhdCBpcyB0aGVcbiAgICAvLyBpbnRlbmRlZCBwb3N0dXJlIFx1MjAxNCBhIGJ1bGsgZmlsZSB0aGF0IHNpbGVudGx5IHJlYXNzaWducyB0aGUgYm9vayBpc1xuICAgIC8vIGV4YWN0bHkgd2hhdCB0aGUgZ3JhbnQgZXhpc3RzIHRvIGdhdGUuXG4gICAgeyBzb3VyY2U6ICdBY2NvdW50IE93bmVyIEVtYWlsJywgdGFyZ2V0OiAnb3duZXJfaWQnLCB0cmFuc2Zvcm06ICdsb29rdXAnIH0sXG5cbiAgICAvLyBTZWxmLXJlZmVyZW5jZTogYSBwYXJlbnQgbmFtZWQgbGF0ZXIgaW4gdGhlIHNhbWUgZmlsZSBzdGlsbCByZXNvbHZlcyBcdTIwMTRcbiAgICAvLyB0aGUgcnVubmVyIGZsdXNoZXMgYnVmZmVyZWQgY3JlYXRlcyBhbmQgcmV0cmllcyBvbmNlIChmcmFtZXdvcmsjMzE0OCkuXG4gICAgeyBzb3VyY2U6ICdQYXJlbnQgQWNjb3VudCcsIHRhcmdldDogJ3BhcmVudF9hY2NvdW50JywgdHJhbnNmb3JtOiAnbG9va3VwJyB9LFxuXG4gICAgLy8gTk9UIE1BUFBFRCBcdTIwMTQgYGJpbGxpbmdfYWRkcmVzc2AgLyBgb2ZmaWNlX2xvY2F0aW9uYCBhcmUgc3RydWN0dXJlZFxuICAgIC8vIChqc29uLWJhY2tlZCBgYWRkcmVzc2AgLyBgbG9jYXRpb25gKSBmaWVsZHMuIEEgam9pbmVkIHN0cmluZyBpcyBub3QgYVxuICAgIC8vIHdheSBpbjogdGhlIGVuZ2luZSByZWplY3RzIGl0IHBlciByb3cgXHUyMDE0IG1lYXN1cmVkLCBgQmlsbGluZyBBZGRyZXNzIGhhcyBhblxuICAgIC8vIGludmFsaWQgYWRkcmVzcyB2YWx1ZTogSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgb2JqZWN0LCByZWNlaXZlZCBzdHJpbmdgLlxuICAgIC8vIChUaGUgZHJ5IHJ1biBkb2VzIE5PVCBwcmVkaWN0IHRoYXQgcmVqZWN0aW9uOyBpdCByZXBvcnRzIHRoZSByb3cgb2suXG4gICAgLy8gRnJhbWV3b3JrLXNpZGUsIGZpbGVkIGFzIG9iamVjdHN0YWNrLWFpL29iamVjdHN0YWNrIzQ2MzMuKVxuICAgIC8vIEFkZHJlc3MgY29sdW1ucyBhcmUgdGhlcmVmb3JlIGxlZnQgb3V0IG9mIHRoZSBhY2NvdW50IHRlbXBsYXRlLiBBIHRhcmdldFxuICAgIC8vIG1heSBub3cgbmFtZSBhIGRlY2xhcmVkIFBBUlQgb2YgYSBjb21wb3VuZCBmaWVsZCBcdTIwMTQgYGNvbnRhY3RfaW1wb3J0Lm1hcHBpbmcudHNgXG4gICAgLy8gbWFwcyBmaXZlIGNvbHVtbnMgaW50byBgbWFpbGluZ19hZGRyZXNzLnN0cmVldGAgXHUyMDI2IGAuY291bnRyeWAgKCMxODM2KSBcdTIwMTQgc29cbiAgICAvLyBhZGRpbmcgYWRkcmVzcyBjb2x1bW5zIGhlcmUgd291bGQgYmUgYSB0ZW1wbGF0ZSBjaGFuZ2UsIG5vdCBhIHBsYXRmb3JtIGdhcC5cbiAgXSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3MvX3NoYXJlZC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9tYXBwaW5nc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9tYXBwaW5ncy9fc2hhcmVkLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFNoYXJlZCB2YWx1ZSBtYXBzIGZvciB0aGUgaW1wb3J0IG1hcHBpbmdzLlxuICpcbiAqIFRoZSBpbXBvcnQgcGF0aCBhbHJlYWR5IG1hdGNoZXMgYSBwaWNrbGlzdCBjZWxsIGFnYWluc3QgdGhlIGZpZWxkJ3Mgb3B0aW9uXG4gKiBWQUxVRSBleGFjdGx5IGFuZCBpdHMgTEFCRUwgY2FzZS1pbnNlbnNpdGl2ZWx5IChgaW1wb3J0LWNvZXJjZS50c2AgXHUyMTkyXG4gKiBgbWF0Y2hPcHRpb25gKSwgc28gXCJUZWNobm9sb2d5XCIgKGxhYmVsKSBhbmQgXCJ0ZWNobm9sb2d5XCIgKHZhbHVlKSBib3RoIGxhbmRcbiAqIHdpdGhvdXQgYW55IGhlbHAgZnJvbSB1cyBcdTIwMTQgYnV0IGFuIHVwcGVyLWNhc2VkIHZhbHVlIGRvZXMgTk9UOiBcIkhSXCIgaXNcbiAqIG5laXRoZXIgdGhlIHZhbHVlIGBocmAgbm9yIHRoZSBsYWJlbCBcIkh1bWFuIFJlc291cmNlc1wiICgjMTk5OCkuIFRoZXNlIG1hcHNcbiAqIGV4aXN0IG9ubHkgZm9yIHRoZSB2b2NhYnVsYXJ5IGEgc3ByZWFkc2hlZXQgdXNlcyB0aGF0IG1hdGNoZXMgbm8gb3B0aW9uIFx1MjAxNFxuICogdGhlIHdvcmRzIGEgU2FsZXNmb3JjZS9IdWJTcG90L0V4Y2VsIGV4cG9ydCB3cml0ZXMgdGhhdCBIb3RDUk0gaGFzIG5vIG9wdGlvblxuICogZm9yIChcIlNhYVNcIiwgXCJUcmFkZSBTaG93XCIsIFwiQ2xpZW50XCIpLCBhbmQgdGhlIGFiYnJldmlhdGlvbnMgb3VyIG93biBzaGlwcGVkXG4gKiB0ZW1wbGF0ZXMgd3JpdGUgKFwiSFJcIikuIEFueXRoaW5nIG5vdCBsaXN0ZWQgaGVyZSBmYWxscyB0aHJvdWdoXG4gKiB1bnRvdWNoZWQgYW5kIGlzIG1hdGNoZWQgbm9ybWFsbHk7IGFuIHVua25vd24gdmFsdWUgZmFpbHMgaXRzIHJvdyB3aXRoXG4gKiBgaW52YWxpZF9vcHRpb25gIHJhdGhlciB0aGFuIGJlaW5nIHNpbGVudGx5IGRyb3BwZWQuXG4gKlxuICogS2VlcCB0aGVzZSBsaXN0cyBzbWFsbCBhbmQgZGVmZW5zaWJsZS4gVGhleSBhcmUgYSB0cmFuc2xhdGlvbiB0YWJsZSBmb3JcbiAqIGtub3duIHN5bm9ueW1zLCBOT1QgYSBcIm1ha2UgYW55IHNwcmVhZHNoZWV0IHdvcmtcIiBmYWxsYmFjayBcdTIwMTQgZXZlcnkgZW50cnlcbiAqIGhlcmUgaXMgYSB2YWx1ZSBhIHJlYWwgZXhwb3J0IHByb2R1Y2VzLCBhbmQgdGhlIHJvdy1sZXZlbCBlcnJvciBpcyB0aGVcbiAqIGludGVuZGVkIG91dGNvbWUgZm9yIGV2ZXJ5dGhpbmcgZWxzZS5cbiAqL1xuXG4vKiogRm9yZWlnbiBzcGVsbGluZ3MgXHUyMTkyIGBJTkRVU1RSWV9PUFRJT05TYCB2YWx1ZXMgKGBzcmMvc2FsZXMvb2JqZWN0cy9fcGlja2xpc3RzLnRzYCkuICovXG5leHBvcnQgY29uc3QgSU5EVVNUUllfU1lOT05ZTVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdTYWFTJzogJ3NvZnR3YXJlJyxcbiAgJ1NhYXMnOiAnc29mdHdhcmUnLFxuICAnSVQnOiAndGVjaG5vbG9neScsXG4gICdUZWNoJzogJ3RlY2hub2xvZ3knLFxuICAnSW5mb3JtYXRpb24gVGVjaG5vbG9neSc6ICd0ZWNobm9sb2d5JyxcbiAgJ0ZpbmFuY2lhbCBTZXJ2aWNlcyc6ICdmaW5hbmNlJyxcbiAgJ0JhbmtpbmcnOiAnZmluYW5jZScsXG4gICdJbnN1cmFuY2UnOiAnZmluYW5jZScsXG4gICdIZWFsdGggQ2FyZSc6ICdoZWFsdGhjYXJlJyxcbiAgJ1BoYXJtYWNldXRpY2Fscyc6ICdoZWFsdGhjYXJlJyxcbiAgJ0UtY29tbWVyY2UnOiAncmV0YWlsJyxcbiAgJ0Vjb21tZXJjZSc6ICdyZXRhaWwnLFxuICAnQ29uc3VtZXIgR29vZHMnOiAncmV0YWlsJyxcbiAgJ1RyYW5zcG9ydGF0aW9uJzogJ2xvZ2lzdGljcycsXG4gICdVdGlsaXRpZXMnOiAnZW5lcmd5JyxcbiAgJ09pbCAmIEdhcyc6ICdlbmVyZ3knLFxuICAnUHVibGljIFNlY3Rvcic6ICdnb3Zlcm5tZW50JyxcbiAgJ05vbiBQcm9maXQnOiAnbm9ucHJvZml0JyxcbiAgJ05vbi1Qcm9maXQnOiAnbm9ucHJvZml0JyxcbiAgJ05HTyc6ICdub25wcm9maXQnLFxuICAnVHJhdmVsICYgSG9zcGl0YWxpdHknOiAnaG9zcGl0YWxpdHknLFxufTtcblxuLyoqIEZvcmVpZ24gc3BlbGxpbmdzIFx1MjE5MiBgTEVBRF9TT1VSQ0VfT1BUSU9OU2AgdmFsdWVzLiAqL1xuZXhwb3J0IGNvbnN0IExFQURfU09VUkNFX1NZTk9OWU1TOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnV2Vic2l0ZSc6ICd3ZWInLFxuICAnV2ViIFNpdGUnOiAnd2ViJyxcbiAgJ0luYm91bmQnOiAnd2ViJyxcbiAgJ1dvcmQgb2YgbW91dGgnOiAncmVmZXJyYWwnLFxuICAnQ3VzdG9tZXIgUmVmZXJyYWwnOiAncmVmZXJyYWwnLFxuICAnVHJhZGUgU2hvdyc6ICdldmVudCcsXG4gICdDb25mZXJlbmNlJzogJ2V2ZW50JyxcbiAgJ1NlbWluYXInOiAnd2ViaW5hcicsXG4gICdQYXJ0bmVyIFJlZmVycmFsJzogJ3BhcnRuZXInLFxuICAnR29vZ2xlIEFkcyc6ICdwYWlkX3NlYXJjaCcsXG4gICdBZFdvcmRzJzogJ3BhaWRfc2VhcmNoJyxcbiAgJ1NFTSc6ICdwYWlkX3NlYXJjaCcsXG4gICdMaW5rZWRJbic6ICdzb2NpYWwnLFxuICAnRmFjZWJvb2snOiAnc29jaWFsJyxcbiAgJ1gnOiAnc29jaWFsJyxcbiAgJ1R3aXR0ZXInOiAnc29jaWFsJyxcbiAgJ0Jsb2cnOiAnY29udGVudCcsXG4gICdXaGl0ZXBhcGVyJzogJ2NvbnRlbnQnLFxuICAnUGhvbmUgSW5xdWlyeSc6ICdjb2xkX2NhbGwnLFxuICAnT3V0Ym91bmQnOiAnY29sZF9jYWxsJyxcbiAgJ0VtYWlsJzogJ2VtYWlsX2NhbXBhaWduJyxcbiAgJ05ld3NsZXR0ZXInOiAnZW1haWxfY2FtcGFpZ24nLFxufTtcblxuLyoqXG4gKiBTcGVsbGluZ3MgXHUyMTkyIGBjcm1fY29udGFjdC5kZXBhcnRtZW50YCBvcHRpb24gdmFsdWVzLiBUaGUgc2hpcHBlZFxuICogYGFzc2V0cy9pbXBvcnQtdGVtcGxhdGVzL2NvbnRhY3RzLmNzdmAgd3JpdGVzIGVpZ2h0IGRlcGFydG1lbnRzOyBzZXZlbiBhcmVcbiAqIG9wdGlvbiBsYWJlbHMgYW5kIGxhbmQgdW5haWRlZCwgXCJIUlwiIGlzIHRoZSBvbmUgdGhhdCBtYXRjaGVzIG5vdGhpbmcgKCMxOTk4KS5cbiAqIFx1MjZENCBUaGUgdGVtcGxhdGUgaXMgYSBjdXN0b21lci1mYWNpbmcgY29udHJhY3QgKCMxODM2KSBcdTIwMTQgdGhlIGZpeCBsaXZlcyBoZXJlLFxuICogbm90IGluIHRoZSBmaWxlLlxuICovXG5leHBvcnQgY29uc3QgREVQQVJUTUVOVF9TWU5PTllNUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ0hSJzogJ2hyJyxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9tYXBwaW5ncy9jb250YWN0X2ltcG9ydC5tYXBwaW5nLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL21hcHBpbmdzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL21hcHBpbmdzL2NvbnRhY3RfaW1wb3J0Lm1hcHBpbmcudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZU1hcHBpbmcgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB7IERFUEFSVE1FTlRfU1lOT05ZTVMsIExFQURfU09VUkNFX1NZTk9OWU1TIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLyoqXG4gKiBDb250YWN0IGltcG9ydCBtYXBwaW5nIFx1MjAxNCBzZWUgYGFjY291bnRfaW1wb3J0Lm1hcHBpbmcudHNgIGZvciB0aGUgc2hhcmVkXG4gKiBub3RlcyBvbiBzdHJpY3QgcHJvamVjdGlvbiBhbmQgb24gYG1vZGVgIC8gYHVwc2VydEtleWAgYWN0aW5nIGFzIGRlZmF1bHRzLlxuICpcbiAqIENvbnRhY3Qtc3BlY2lmaWMgdGhpbmdzIHRvIGtub3c6XG4gKlxuICogLSAqKkFjY291bnRzIGZpcnN0LioqIGBjcm1fY29udGFjdC5jcm1fYWNjb3VudGAgaXMgYSBSRVFVSVJFRCBtYXN0ZXItZGV0YWlsXG4gKiAgIGxpbmssIHNvIHRoZSBcIkFjY291bnQgTmFtZVwiIGNvbHVtbiBtdXN0IG5hbWUgYW4gYWNjb3VudCB0aGF0IGFscmVhZHlcbiAqICAgZXhpc3RzLiBJbXBvcnQgYWNjb3VudHMgYmVmb3JlIGNvbnRhY3RzOyBhIHJvdyB3aG9zZSBhY2NvdW50IGNhbm5vdCBiZVxuICogICByZXNvbHZlZCBmYWlscyB3aXRoIGByZWZlcmVuY2Vfbm90X2ZvdW5kYCBhbmQgbm90aGluZyBpcyB3cml0dGVuIGZvciBpdC5cbiAqIC0gKipFbWFpbCBpcyB0aGUgYnVzaW5lc3Mga2V5LioqIEl0IGlzIGByZXF1aXJlZGAgKyBgdW5pcXVlYCBvbiB0aGUgb2JqZWN0LFxuICogICBhbmQgYGNybV9jb250YWN0YCdzIGhvb2sgbG93ZXJjYXNlcyBpdCBhbmQgcmVqZWN0cyBhIHNlY29uZCBjb250YWN0IHdpdGhcbiAqICAgdGhlIHNhbWUgYWRkcmVzcyBcdTIwMTQgc28gYHVwc2VydEtleTogWydlbWFpbCddYCBtYXRjaGVzIGhvdyB0aGUgb2JqZWN0XG4gKiAgIGFscmVhZHkgYmVoYXZlcyByYXRoZXIgdGhhbiBpbnZlbnRpbmcgYSBzZWNvbmQgbm90aW9uIG9mIGlkZW50aXR5LlxuICogLSBBZGRyZXNzOiB0aGUgdGVtcGxhdGUncyBmaXZlIGBNYWlsaW5nIFx1MjAyNmAgY29sdW1ucyBzdGF5IGFzIHRoZXkgYXJlLCBhbmRcbiAqICAgZWFjaCBvbmUgdGFyZ2V0cyBhIHBhcnQgb2YgdGhlIHN0cnVjdHVyZWQgYG1haWxpbmdfYWRkcmVzc2AgZmllbGRcbiAqICAgKGBtYWlsaW5nX2FkZHJlc3Muc3RyZWV0YCwgXHUyMDI2KSBcdTIwMTQgdGhlIGN1c3RvbWVyJ3MgZmlsZSBkaWQgbm90IGNoYW5nZSB3aGVuXG4gKiAgIHRoZSBmaXZlIGZsYXQgYG1haWxpbmdfKmAgZmllbGRzIGJlY2FtZSBvbmUgYEZpZWxkLmFkZHJlc3MoKWAgKCMxODM2KS5cbiAqL1xuZXhwb3J0IGNvbnN0IENvbnRhY3RJbXBvcnRNYXBwaW5nID0gZGVmaW5lTWFwcGluZyh7XG4gIG5hbWU6ICdjcm1fY29udGFjdF9pbXBvcnQnLFxuICBsYWJlbDogJ0NvbnRhY3QgSW1wb3J0IChDU1YpJyxcbiAgdGFyZ2V0T2JqZWN0OiAnY3JtX2NvbnRhY3QnLFxuICBzb3VyY2VGb3JtYXQ6ICdjc3YnLFxuICBtb2RlOiAndXBzZXJ0JyxcbiAgdXBzZXJ0S2V5OiBbJ2VtYWlsJ10sXG5cbiAgZmllbGRNYXBwaW5nOiBbXG4gICAgeyBzb3VyY2U6ICdTYWx1dGF0aW9uJywgdGFyZ2V0OiAnc2FsdXRhdGlvbicgfSxcbiAgICB7IHNvdXJjZTogJ0ZpcnN0IE5hbWUnLCB0YXJnZXQ6ICdmaXJzdF9uYW1lJyB9LFxuICAgIHsgc291cmNlOiAnTGFzdCBOYW1lJywgdGFyZ2V0OiAnbGFzdF9uYW1lJyB9LFxuXG4gICAgLy8gUmVxdWlyZWQgbWFzdGVyLWRldGFpbCBwYXJlbnQ7IHJlc29sdmVkIGJ5IGFjY291bnQgbmFtZS5cbiAgICB7IHNvdXJjZTogJ0FjY291bnQgTmFtZScsIHRhcmdldDogJ2NybV9hY2NvdW50JywgdHJhbnNmb3JtOiAnbG9va3VwJyB9LFxuXG4gICAgeyBzb3VyY2U6ICdUaXRsZScsIHRhcmdldDogJ3RpdGxlJyB9LFxuICAgIHtcbiAgICAgIHNvdXJjZTogJ0RlcGFydG1lbnQnLFxuICAgICAgdGFyZ2V0OiAnZGVwYXJ0bWVudCcsXG4gICAgICB0cmFuc2Zvcm06ICdtYXAnLFxuICAgICAgcGFyYW1zOiB7IHZhbHVlTWFwOiBERVBBUlRNRU5UX1NZTk9OWU1TIH0sXG4gICAgfSxcbiAgICB7IHNvdXJjZTogJ0VtYWlsJywgdGFyZ2V0OiAnZW1haWwnIH0sXG4gICAgeyBzb3VyY2U6ICdQaG9uZScsIHRhcmdldDogJ3Bob25lJyB9LFxuICAgIHsgc291cmNlOiAnTW9iaWxlJywgdGFyZ2V0OiAnbW9iaWxlJyB9LFxuXG4gICAgLy8gRml2ZSB0ZW1wbGF0ZSBjb2x1bW5zLCBvbmUgc3RydWN0dXJlZCBmaWVsZDogZWFjaCBjb2x1bW4gbmFtZXMgYSBwYXJ0XG4gICAgLy8gb2YgYG1haWxpbmdfYWRkcmVzc2AsIGFuZCB0aGUgaW1wb3J0IGFzc2VtYmxlcyB0aGUgcGFydHMgb25lIHJvdyBtYXBzXG4gICAgLy8gaW50byB0aGF0IGZpZWxkJ3Mgc2luZ2xlIHZhbHVlLlxuICAgIHsgc291cmNlOiAnTWFpbGluZyBTdHJlZXQnLCB0YXJnZXQ6ICdtYWlsaW5nX2FkZHJlc3Muc3RyZWV0JyB9LFxuICAgIHsgc291cmNlOiAnTWFpbGluZyBDaXR5JywgdGFyZ2V0OiAnbWFpbGluZ19hZGRyZXNzLmNpdHknIH0sXG4gICAgeyBzb3VyY2U6ICdNYWlsaW5nIFN0YXRlJywgdGFyZ2V0OiAnbWFpbGluZ19hZGRyZXNzLnN0YXRlJyB9LFxuICAgIHsgc291cmNlOiAnTWFpbGluZyBQb3N0YWwgQ29kZScsIHRhcmdldDogJ21haWxpbmdfYWRkcmVzcy5wb3N0YWxDb2RlJyB9LFxuICAgIHsgc291cmNlOiAnTWFpbGluZyBDb3VudHJ5JywgdGFyZ2V0OiAnbWFpbGluZ19hZGRyZXNzLmNvdW50cnknIH0sXG5cbiAgICB7XG4gICAgICBzb3VyY2U6ICdMZWFkIFNvdXJjZScsXG4gICAgICB0YXJnZXQ6ICdsZWFkX3NvdXJjZScsXG4gICAgICB0cmFuc2Zvcm06ICdtYXAnLFxuICAgICAgcGFyYW1zOiB7IHZhbHVlTWFwOiBMRUFEX1NPVVJDRV9TWU5PTllNUyB9LFxuICAgIH0sXG5cbiAgICB7IHNvdXJjZTogJ0Rlc2NyaXB0aW9uJywgdGFyZ2V0OiAnZGVzY3JpcHRpb24nIH0sXG5cbiAgICAvLyBPd25lci1lbWFpbCByZXNvbHV0aW9uLCB0aGUgYmxhbmstY2VsbCBmYWxsYmFjaywgYW5kIHdoeSBhIGZpbGxlZCBjZWxsXG4gICAgLy8gbmVlZHMgYGFsbG93VHJhbnNmZXJgOiBzZWUgdGhlIGxvbmcgbm90ZSBpbiBgYWNjb3VudF9pbXBvcnQubWFwcGluZy50c2AuXG4gICAgeyBzb3VyY2U6ICdDb250YWN0IE93bmVyIEVtYWlsJywgdGFyZ2V0OiAnb3duZXJfaWQnLCB0cmFuc2Zvcm06ICdsb29rdXAnIH0sXG4gIF0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL21hcHBpbmdzL2xlYWRfaW1wb3J0Lm1hcHBpbmcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3MvbGVhZF9pbXBvcnQubWFwcGluZy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lTWFwcGluZyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgSU5EVVNUUllfU1lOT05ZTVMsIExFQURfU09VUkNFX1NZTk9OWU1TIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLyoqXG4gKiBMZWFkIGltcG9ydCBtYXBwaW5nIFx1MjAxNCBzZWUgYGFjY291bnRfaW1wb3J0Lm1hcHBpbmcudHNgIGZvciB0aGUgc2hhcmVkIG5vdGVzXG4gKiBvbiBzdHJpY3QgcHJvamVjdGlvbiBhbmQgb24gYG1vZGVgIC8gYHVwc2VydEtleWAgYWN0aW5nIGFzIGRlZmF1bHRzLlxuICpcbiAqIExlYWQtc3BlY2lmaWMgdGhpbmdzIHRvIGtub3c6XG4gKlxuICogLSAqKkVtYWlsIGlzIHRoZSBidXNpbmVzcyBrZXkqKiAoYHJlcXVpcmVkYCBvbiB0aGUgb2JqZWN0KSwgc28gYSByZS1ydW4gb2ZcbiAqICAgdGhlIHNhbWUgZmlsZSB1cGRhdGVzIHRoZSBleGlzdGluZyBsZWFkIGluc3RlYWQgb2YgY3JlYXRpbmcgYSB0d2luLlxuICogLSAqKmBzdGF0dXNgIGhhcyBhIGRlZmF1bHQgb2YgYG5ld2AqKiBcdTIwMTQgbGVhdmUgdGhlIGNvbHVtbiBibGFuayBhbmQgdGhlIGxlYWRcbiAqICAgbGFuZHMgYXMgTmV3LiBgY3JtX2xlYWRgJ3Mgc3RhdGUgbWFjaGluZSBvbmx5IGFjY2VwdHMgYW4gaW5pdGlhbCBzdGF0dXMsXG4gKiAgIHNvIGltcG9ydGluZyBhIG1pZC1saWZlY3ljbGUgc3RhdHVzIGlzIGEgbm9ybWFsIHdyaXRlIGhlcmUsIG5vdCBhXG4gKiAgIHRyYW5zaXRpb24uXG4gKiAtICoqQSBibGFuayBvd25lciBsYW5kcyB3aXRoIHRoZSBJTVBPUlRFUiwgbm90IHdpdGggYXV0by1hc3NpZ25tZW50LioqXG4gKiAgIGBsZWFkX2F1dG9fYXNzaWduYCAoYHNyYy9zYWxlcy9vYmplY3RzL2xlYWQuaG9vay50c2ApIG9ubHkgcm91dGVzIGEgbGVhZCB3aG9zZVxuICogICBgb3duZXJfaWRgIGlzIHN0aWxsIGVtcHR5IHdoZW4gdGhlIGhvb2sgcnVucyBcdTIwMTQgYW5kIHRoZSBpbXBvcnQgd3JpdGUgY2Fycmllc1xuICogICB0aGUgaW1wb3J0ZXIncyBvd24gY29udGV4dCwgc28gdGhlIHNlY3VyaXR5IG1pZGRsZXdhcmUgaGFzIEFMUkVBRFkgc3RhbXBlZFxuICogICBgb3duZXJfaWRgIHRvIHRoZW0gYnkgdGhlIHRpbWUgYGJlZm9yZUluc2VydGAgcnVucyAodGhlIGd1YXJkIGlzIGFuXG4gKiAgIG9wZXJhdGlvbiBtaWRkbGV3YXJlLCBvdXRzaWRlIHRoZSBob29rIHBoYXNlKS4gTWVhc3VyZWQgb24gYSByZWFsIGltcG9ydFxuICogICBiZWZvcmUgIzU0OCwgd2hlbiBhIGZpZWxkIGBkZWZhdWx0VmFsdWVgIHByb2R1Y2VkIHRoZSBzYW1lIG91dGNvbWUgb25lIHN0ZXBcbiAqICAgZWFybGllcjogYWxsIDUwIHRlbXBsYXRlIHJvd3MgbGFuZGVkIG93bmVkIGJ5IHRoZSBpbXBvcnRpbmcgdXNlciwgbm9uZSBieVxuICogICB0aGUgcm91bmQtcm9iaW4uIEZpbGwgXCJMZWFkIE93bmVyIEVtYWlsXCIgd2hlbiB0aGUgc291cmNlIGZpbGUga25vd3Mgd2hvXG4gKiAgIG93bnMgdGhlIGxlYWQ7IG90aGVyd2lzZSByZWFzc2lnbiBhZnRlciB0aGUgaW1wb3J0LlxuICovXG5leHBvcnQgY29uc3QgTGVhZEltcG9ydE1hcHBpbmcgPSBkZWZpbmVNYXBwaW5nKHtcbiAgbmFtZTogJ2NybV9sZWFkX2ltcG9ydCcsXG4gIGxhYmVsOiAnTGVhZCBJbXBvcnQgKENTViknLFxuICB0YXJnZXRPYmplY3Q6ICdjcm1fbGVhZCcsXG4gIHNvdXJjZUZvcm1hdDogJ2NzdicsXG4gIG1vZGU6ICd1cHNlcnQnLFxuICB1cHNlcnRLZXk6IFsnZW1haWwnXSxcblxuICBmaWVsZE1hcHBpbmc6IFtcbiAgICB7IHNvdXJjZTogJ1NhbHV0YXRpb24nLCB0YXJnZXQ6ICdzYWx1dGF0aW9uJyB9LFxuICAgIHsgc291cmNlOiAnRmlyc3QgTmFtZScsIHRhcmdldDogJ2ZpcnN0X25hbWUnIH0sXG4gICAgeyBzb3VyY2U6ICdMYXN0IE5hbWUnLCB0YXJnZXQ6ICdsYXN0X25hbWUnIH0sXG4gICAgeyBzb3VyY2U6ICdDb21wYW55JywgdGFyZ2V0OiAnY29tcGFueScgfSxcbiAgICB7IHNvdXJjZTogJ1RpdGxlJywgdGFyZ2V0OiAndGl0bGUnIH0sXG5cbiAgICB7XG4gICAgICBzb3VyY2U6ICdJbmR1c3RyeScsXG4gICAgICB0YXJnZXQ6ICdpbmR1c3RyeScsXG4gICAgICB0cmFuc2Zvcm06ICdtYXAnLFxuICAgICAgcGFyYW1zOiB7IHZhbHVlTWFwOiBJTkRVU1RSWV9TWU5PTllNUyB9LFxuICAgIH0sXG5cbiAgICB7IHNvdXJjZTogJ0VtYWlsJywgdGFyZ2V0OiAnZW1haWwnIH0sXG4gICAgeyBzb3VyY2U6ICdQaG9uZScsIHRhcmdldDogJ3Bob25lJyB9LFxuICAgIHsgc291cmNlOiAnTW9iaWxlJywgdGFyZ2V0OiAnbW9iaWxlJyB9LFxuICAgIHsgc291cmNlOiAnV2Vic2l0ZScsIHRhcmdldDogJ3dlYnNpdGUnIH0sXG5cbiAgICB7XG4gICAgICBzb3VyY2U6ICdMZWFkIFN0YXR1cycsXG4gICAgICB0YXJnZXQ6ICdzdGF0dXMnLFxuICAgICAgdHJhbnNmb3JtOiAnbWFwJyxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICB2YWx1ZU1hcDoge1xuICAgICAgICAgICdPcGVuJzogJ25ldycsXG4gICAgICAgICAgJ1dvcmtpbmcnOiAnY29udGFjdGVkJyxcbiAgICAgICAgICAnSW4gUHJvZ3Jlc3MnOiAnY29udGFjdGVkJyxcbiAgICAgICAgICAnTnVydHVyaW5nJzogJ2NvbnRhY3RlZCcsXG4gICAgICAgICAgJ0Rpc3F1YWxpZmllZCc6ICd1bnF1YWxpZmllZCcsXG4gICAgICAgICAgJ0Nsb3NlZCAtIE5vdCBDb252ZXJ0ZWQnOiAndW5xdWFsaWZpZWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAge1xuICAgICAgc291cmNlOiAnTGVhZCBTb3VyY2UnLFxuICAgICAgdGFyZ2V0OiAnbGVhZF9zb3VyY2UnLFxuICAgICAgdHJhbnNmb3JtOiAnbWFwJyxcbiAgICAgIHBhcmFtczogeyB2YWx1ZU1hcDogTEVBRF9TT1VSQ0VfU1lOT05ZTVMgfSxcbiAgICB9LFxuXG4gICAgeyBzb3VyY2U6ICdBbm51YWwgUmV2ZW51ZScsIHRhcmdldDogJ2FubnVhbF9yZXZlbnVlJyB9LFxuICAgIHsgc291cmNlOiAnRW1wbG95ZWVzJywgdGFyZ2V0OiAnbnVtYmVyX29mX2VtcGxveWVlcycgfSxcbiAgICB7IHNvdXJjZTogJ0Rlc2NyaXB0aW9uJywgdGFyZ2V0OiAnZGVzY3JpcHRpb24nIH0sXG5cbiAgICAvLyBPd25lci1lbWFpbCByZXNvbHV0aW9uIGFuZCB0aGUgYGFsbG93VHJhbnNmZXJgIGdhdGUgb24gYSBmaWxsZWQgY2VsbDpcbiAgICAvLyBzZWUgdGhlIGxvbmcgbm90ZSBpbiBgYWNjb3VudF9pbXBvcnQubWFwcGluZy50c2AuIFRoZSBibGFuay1jZWxsXG4gICAgLy8gYmVoYXZpb3VyIGRpZmZlcnMgXHUyMDE0IHNlZSB0aGUgaGVhZGVyIGNvbW1lbnQgYWJvdmUuXG4gICAgeyBzb3VyY2U6ICdMZWFkIE93bmVyIEVtYWlsJywgdGFyZ2V0OiAnb3duZXJfaWQnLCB0cmFuc2Zvcm06ICdsb29rdXAnIH0sXG5cbiAgICAvLyBOT1QgTUFQUEVEIFx1MjAxNCBgY3JtX2xlYWQuYWRkcmVzc2AgaXMgYSBzdHJ1Y3R1cmVkIChqc29uLWJhY2tlZCkgYGFkZHJlc3NgXG4gICAgLy8gZmllbGQ7IHRoZSBpbXBvcnQgcGF0aCBjYW5ub3QgY29tcG9zZSBvbmUgZnJvbSBzZXBhcmF0ZSBzdHJlZXQvY2l0eS9cbiAgICAvLyBwb3N0Y29kZSBjb2x1bW5zLCBhbmQgYSBqb2luZWQgc3RyaW5nIGlzIHJlamVjdGVkIHBlciByb3cuIFNhbWVcbiAgICAvLyByZWFzb25pbmcsIGFuZCB0aGUgc2FtZSBtZWFzdXJlbWVudCwgYXMgdGhlIGFjY291bnQgbWFwcGluZy5cbiAgXSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvYXBwcy9pbmRleC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9hcHBzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FwcHMvaW5kZXgudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogQXBwIERlZmluaXRpb25zIEJhcnJlbFxuICovXG5cbmV4cG9ydCB7IENybUFwcCB9IGZyb20gJy4vY3JtLmFwcCc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9hcHBzL2NybS5hcHAudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvYXBwc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9hcHBzL2NybS5hcHAudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IEFwcCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLy8gVGhlIGJyYW5kIG1hcmssIGlubGluZWQgYXMgYSBgZGF0YTpgIFVSSSBvZiBgYXNzZXRzL2ljb24uc3ZnYCAoIzIwNTEpLCBzbyBpdFxuLy8gdHJhdmVscyBpbnNpZGUgdGhlIHB1Ymxpc2hlZCBhcnRpZmFjdC4gVGhlIHBhdGggaXQgcmVwbGFjZXMsXG4vLyBgL3J1bnRpbWUvYXNzZXRzL2ljb24uc3ZnYCAoIzczMSksIHJlc29sdmVzIG9ubHkgdW5kZXIgYG9iamVjdHN0YWNrIHNlcnZlYFxuLy8gcnVuIGZyb20gdGhpcyByZXBvIFx1MjAxNCB0aGUgQ0xJJ3MgYGNyZWF0ZVJ1bnRpbWVBc3NldHNQbHVnaW5gIG1vdW50cyB0aGVcbi8vIHByb2plY3QncyBgYXNzZXRzL2AgdGhlcmUuIEEgaG9zdGVkIGluc3RhbGwgcnVucyB0aGUgYXJ0aWZhY3QsIHdoaWNoIGNhcnJpZWRcbi8vIHRoZSBwYXRoIGJ1dCBub3QgdGhlIGZpbGUsIGFuZCBpdHMgcnVudGltZSBtb3VudHMgbm8gYC9ydW50aW1lL2Fzc2V0cy9gOiB0aGVcbi8vIGxvZ28gYW5zd2VyZWQgNDA0IG9uIGV2ZXJ5IGhvc3RlZCBlbnZpcm9ubWVudC4gVGhlIFNWRydzIG93biBieXRlcywgd2l0aCBvbmx5XG4vLyBgJWAsIGAjYCBhbmQgbGluZSBicmVha3MgcGVyY2VudC1lbmNvZGVkOiBhIHJhdyBgI2Agd291bGQgc3RhcnQgYSBVUkwgZnJhZ21lbnRcbi8vIGFuZCBhIHJhdyBuZXdsaW5lIGlzIHN0cmlwcGVkIGJ5IHRoZSBVUkwgcGFyc2VyLiBgYXNzZXRzL2ljb24uc3ZnYCBzdGF5cyB0aGVcbi8vIHNpbmdsZSBzb3VyY2UgXHUyMDE0IGB0ZXN0L2FwcC1icmFuZGluZy1pY29uLnRlc3QudHNgIGRlY29kZXMgdGhpcyBVUkkgYXMgYSBicm93c2VyXG4vLyBkb2VzIGFuZCByZXF1aXJlcyB0aGUgZmlsZSdzIGV4YWN0IGJ5dGVzIGJhY2ssIHNvIGVkaXQgdGhlIGZpbGUsIHRoZW4gdGhpcy5cbmNvbnN0IEhPVENSTV9JQ09OID1cbiAgJ2RhdGE6aW1hZ2Uvc3ZnK3htbCwnICtcbiAgJzxzdmcgd2lkdGg9XCIyNTZcIiBoZWlnaHQ9XCIyNTZcIiB2aWV3Qm94PVwiMCAwIDI1NiAyNTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiByb2xlPVwiaW1nXCIgYXJpYS1sYWJlbD1cIkhvdENSTVwiPiUwQScgK1xuICAnICA8cmVjdCB4PVwiMTZcIiB5PVwiMTZcIiB3aWR0aD1cIjIyNFwiIGhlaWdodD1cIjIyNFwiIHJ4PVwiNTZcIiBmaWxsPVwiJTIzRUE1ODBDXCIvPiUwQScgK1xuICAnICA8cGF0aCBkPVwiTTc2IDY0aDQwdjUyaDI0VjY0aDQwdjEyOGgtNDB2LTUyaC0yNHY1Mkg3NnpcIiBmaWxsPVwiJTIzRkZGRkZGXCIvPiUwQScgK1xuICAnPC9zdmc+JTBBJztcblxuLyoqXG4gKiBIb3RDUk0gXHUyMDE0IG5hdmlnYXRpb24uXG4gKlxuICogSW50ZW50aW9uYWxseSBuYXJyb3cuIFRoZSBhcHAgc2VsbHMgb25lIHN0b3J5OiBcInRoZSBDUk0gdGhhdCByZXdyaXRlc1xuICogaXRzZWxmIHdoZW4geW91ciBidXNpbmVzcyBjaGFuZ2VzLFwiIGFuZCBgY29udGVudC9kb2NzL3doYXRzLW5ldy5tZHhgXG4gKiBwcm9taXNlcyBhIG5hdiBcImEgbmV3IHVzZXIgY2FuIGZpbmQgdGhlaXIgd2F5IGFyb3VuZCBpbiAzMCBzZWNvbmRzLlwiXG4gKlxuICogIyMgT25lIGVudHJ5IHBlciBkZXN0aW5hdGlvbiwgb25lIGV4ZW1wbGFyIHBlciBuYXYtaXRlbSB0eXBlICgjMTI1OSlcbiAqXG4gKiBUaGUgc2lkZWJhciBoYWQgZ3Jvd24gdG8gNyBncm91cHMgLyAzMSBpdGVtcywgYWxtb3N0IGVudGlyZWx5IHRocm91Z2ggb25lXG4gKiBwYXR0ZXJuOiB0aGUgc2FtZSBvYmplY3Qgc3VyZmFjZWQgYWdhaW4gYW5kIGFnYWluIHRocm91Z2ggaXRzIG93biB2aWV3cyBcdTIwMTRcbiAqIGBjcm1fZXZlbnRgIGhhZCBmb3VyIGVudHJpZXMsIGBjcm1fb3Bwb3J0dW5pdHlgIHRocmVlIFx1MjAxNCB3aGlsZSBldmVyeSBsaXN0XG4gKiBwYWdlIGFscmVhZHkgY2FycmllcyBhIHZpZXctc3dpdGNoZXIgdGFiIHN0cmlwIHRoYXQgcmVhY2hlcyBhbGwgb2YgdGhlbS5cbiAqIFRob3NlIHJlZHVuZGFudCB2aWV3IGVudHJpZXMgYXJlIGdvbmU7IGVhY2ggcmVtb3ZlZCBkZXN0aW5hdGlvbiBzdGF5cyBvbmVcbiAqIGNsaWNrIGF3YXkgb24gaXRzIG9iamVjdCdzIHRhYiBzdHJpcCBcdTIwMTQgd2hpY2ggdGhlIGNvbnNvbGUgYnVpbGRzIGZyb20gdGhlXG4gKiBWSUVXIERFU0NSSVBUT1JTIGluIGBzcmMvPHBrZz4vdmlld3MvKi52aWV3LnRzYDogdGhlIHByaW1hcnkgYGxpc3RgIHBsdXMgZXZlcnlcbiAqIGBsaXN0Vmlld3NgIGVudHJ5LCBvbmUgdGFiIGVhY2gsIGNhcnJ5aW5nIHRoYXQgdmlldydzIG93biBgbGFiZWxgLiBTb1xuICogcmVhY2hhYmlsaXR5IG5lZWRzIG5vdGhpbmcgYXV0aG9yZWQ7IGEgYGxpc3RWaWV3c2AgZW50cnkgaXMgb24gdGhlIHN0cmlwIGJ5XG4gKiBleGlzdGluZy4gV2hhdCBgdGVzdC92aWV3LXJlZmVyZW5jZXMudGVzdC50c2AgXHUyMTkyIFwiZXZlcnkgbmFtZWQgbGlzdCB2aWV3IGlzXG4gKiByZWFjaGFibGVcIiBob2xkcyBpcyB0aGUgaGFsZiB0aGF0IENBTiBkYW5nbGUgXHUyMDE0IGEgbmF2aWdhdGlvbiBlbnRyeSBuYW1pbmcgYVxuICogdmlldyBubyB2aWV3IGZpbGUgZGVmaW5lcy5cbiAqXG4gKiBXaGF0IGlzIE5PVCB0cmltbWVkIGlzIHRoZSBkZW1vbnN0cmF0aW9uLiBUaGlzIGlzIHRoZSBleGVtcGxhciBhcHAsIGFuZFxuICogbmF2IGl0ZW1zIGNvbWUgaW4gc2l4IGtpbmRzIFx1MjAxNCBwbGFpbiBgb2JqZWN0YCwgb2JqZWN0ICsgYHZpZXdOYW1lYCAoYSB2aWV3XG4gKiBlbnRyeSksIGBwYWdlYCwgYGRhc2hib2FyZGAsIGByZXBvcnRgLCBgY29tcG9uZW50YC4gKipFdmVyeSBraW5kIGtlZXBzIGF0XG4gKiBsZWFzdCBvbmUgZW50cnkqKiwgYmVjYXVzZSBzaG93aW5nIGFuIGF1dGhvciB3aGF0IGVhY2gga2luZCBsb29rcyBsaWtlIGlzXG4gKiBwYXJ0IG9mIHdoYXQgdGhpcyBhcHAgaXMgZm9yLiBgdGVzdC9hcHAtbmF2aWdhdGlvbi1zaGFwZS50ZXN0LnRzYCBwaW5zIHRoYXRcbiAqIGZsb29yLCBzbyBhIGZ1dHVyZSBzbGltbWluZyBwYXNzIGNhbm5vdCBkZWxldGUgdGhlIGxhc3QgZXhlbXBsYXIgb2YgYSBraW5kXG4gKiB3aXRob3V0IGdvaW5nIHJlZC5cbiAqXG4gKiBQZXJzb25hbGlzYXRpb24gcmlkZXMgdGhlIHBsYXRmb3JtJ3MgcGluICsgcmVjZW50IG1lY2hhbmlzbXMgcmF0aGVyIHRoYW5cbiAqIHByZS1tYXRlcmlhbGlzaW5nIGV2ZXJ5IHBvc3NpYmxlIGVudHJ5IGZvciBldmVyeSB1c2VyLlxuICovXG5leHBvcnQgY29uc3QgQ3JtQXBwID0gQXBwLmNyZWF0ZSh7XG4gIG5hbWU6ICdjcm1fZW50ZXJwcmlzZScsXG4gIGxhYmVsOiAnSG90Q1JNJyxcbiAgaWNvbjogJ2JyaWVmY2FzZScsXG4gIC8vIEFEUi0wMDYzIFx1MDBBNzEvXHUwMEE3MiBcdTIwMTQgYGRlZmF1bHRBZ2VudGAgaXMgYSBzdXJmYWNlIGJpbmRpbmcsIG5vdCBhIGN1c3RvbS1hZ2VudFxuICAvLyBzbG90OiB0aGUgb25seSByZXNvbHZhYmxlIHZhbHVlcyBhcmUgdGhlIHR3byBQTEFURk9STSBhZ2VudHMsIGBhc2tgIChkYXRhXG4gIC8vIHN1cmZhY2UpIGFuZCBgYnVpbGRgIChhdXRob3Jpbmcgc3VyZmFjZSkuIEhvdENSTSBpcyBhIGRhdGEgc3VyZmFjZSwgc28gaXRcbiAgLy8gYmluZHMgYGFza2A7IHRoZSBhcHAncyBvd24gQUkgY2FwYWJpbGl0eSBzaGlwcyBhcyBza2lsbHMgKGBzcmMvKi9za2lsbHMvYCksXG4gIC8vIHdoaWNoIGF0dGFjaCB0byB0aGUgcGxhdGZvcm0gYWdlbnRzIGJ5IGBzdXJmYWNlYCBhZmZpbml0eS4gVGhlIGFwcC1hdXRob3JlZFxuICAvLyBhZ2VudHMgdGhpcyBrZXkgdXNlZCB0byBuYW1lIHdlcmUgcmV0aXJlZCBpbiAjNTEyLlxuICBkZWZhdWx0QWdlbnQ6ICdhc2snLFxuICAvLyBgbG9nb2AgYW5kIGBmYXZpY29uYCBhcmUgdGhlIGlubGluZWQgYEhPVENSTV9JQ09OYCBhYm92ZSAoIzIwNTEpLCBuZXZlciBhXG4gIC8vIHNlcnZlciBwYXRoOiBhbiBpbnN0YWxsIHNlcnZlcyBvbmx5IHdoYXQgdGhlIGFydGlmYWN0IGNhcnJpZXMuIFRoZSBjb25zb2xlXG4gIC8vIHBhc3NlcyBlYWNoIHZhbHVlIHRocm91Z2ggdW50b3VjaGVkIFx1MjAxNCBgbG9nb2AgYXMgdGhlIHNpZGViYXIncyBgPGltZyBzcmM+YCxcbiAgLy8gYGZhdmljb25gIGFzIHRoZSBmYXZpY29uIGBsaW5rLmhyZWZgIFx1MjAxNCBhbmQgYSBgZGF0YTpgIFVSSSByZW5kZXJzIGluIGJvdGguXG4gIC8vIGBwcmltYXJ5Q29sb3JgIGlzIHRoZSBpY29uJ3MgdGlsZSBmaWxsICgjMjA2Nik6IHRoZSBtYXJrIGFuZCB0aGUgdGhlbWUgYXJlIG9uZSBvcmFuZ2UuXG4gIGJyYW5kaW5nOiB7XG4gICAgcHJpbWFyeUNvbG9yOiAnI0VBNTgwQycsXG4gICAgbG9nbzogSE9UQ1JNX0lDT04sXG4gICAgZmF2aWNvbjogSE9UQ1JNX0lDT04sXG4gIH0sXG5cbiAgbmF2aWdhdGlvbjogW1xuICAgIC8vIFBpbm5lZCBsYW5kaW5nIFx1MjAxNCBzaW5nbGUgZXhlY3V0aXZlIHZpZXcsIHNpbmdsZSBjbGljayBmcm9tIGxhdW5jaGVyLlxuICAgIHtcbiAgICAgIGlkOiAnbmF2X2hvbWUnLFxuICAgICAgdHlwZTogJ2Rhc2hib2FyZCcsXG4gICAgICBkYXNoYm9hcmROYW1lOiAnZXhlY3V0aXZlX2Rhc2hib2FyZCcsXG4gICAgICBsYWJlbDogJ0hvbWUnLFxuICAgICAgaWNvbjogJ2hvbWUnLFxuICAgIH0sXG5cbiAgICB7XG4gICAgICBpZDogJ2dyb3VwX3NhbGVzJyxcbiAgICAgIHR5cGU6ICdncm91cCcsXG4gICAgICBsYWJlbDogJ1NhbGVzJyxcbiAgICAgIGljb246ICdjaGFydC1saW5lJyxcbiAgICAgIGV4cGFuZGVkOiB0cnVlLFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgeyBpZDogJ25hdl9sZWFkJywgICAgICAgIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX2xlYWQnLCAgICAgICAgbGFiZWw6ICdMZWFkcycsICAgICAgICAgaWNvbjogJ3VzZXItcGx1cycgfSxcbiAgICAgICAgeyBpZDogJ25hdl9hY2NvdW50JywgICAgIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX2FjY291bnQnLCAgICAgbGFiZWw6ICdBY2NvdW50cycsICAgICAgaWNvbjogJ2J1aWxkaW5nJyB9LFxuICAgICAgICAvLyBBRFItMDA0NyBpbnRlcmZhY2UgcGFnZSBcdTIwMTQgdGhlIGN1cmF0ZWQgY291bnRlcnBhcnQgdG8gdGhlIEFjY291bnRzXG4gICAgICAgIC8vIG9iamVjdCBlbnRyeSAocXVpY2sgZmlsdGVycyBvbmx5OyBhY3RpdmF0ZXMgd2l0aCBzcGVjID4gOS4yLjApLlxuICAgICAgICB7IGlkOiAnbmF2X2FjY291bnRfd29ya2JlbmNoJywgdHlwZTogJ3BhZ2UnLCBwYWdlTmFtZTogJ2FjY291bnRfd29ya2JlbmNoJywgbGFiZWw6ICdBY2NvdW50IFdvcmtiZW5jaCcsIGljb246ICdzbGlkZXJzLWhvcml6b250YWwnIH0sXG4gICAgICAgIHsgaWQ6ICduYXZfY29udGFjdCcsICAgICB0eXBlOiAnb2JqZWN0Jywgb2JqZWN0TmFtZTogJ2NybV9jb250YWN0JywgICAgIGxhYmVsOiAnQ29udGFjdHMnLCAgICAgIGljb246ICd1c2VyJyB9LFxuICAgICAgICAvLyBObyBzZXBhcmF0ZSBcIlBpcGVsaW5lXCIgZW50cnk6IHRoZSBrYW5iYW4gYm9hcmQgaXMgYW5vdGhlciB0YWIgb25cbiAgICAgICAgLy8gdGhpcyBzYW1lIGxpc3QgcGFnZSBcdTIwMTQgYHBpcGVsaW5lX2thbmJhbmAgaW5cbiAgICAgICAgLy8gYE9wcG9ydHVuaXR5Vmlld3MubGlzdFZpZXdzYCwgd2hpY2ggdGhlIHN3aXRjaGVyIHB1dHMgb24gdGhlIHN0cmlwXG4gICAgICAgIC8vIHVuZGVyIGl0cyBvd24gbGFiZWwsICpTYWxlcyBQaXBlbGluZSogXHUyMDE0IG9uZSBjbGljayBmcm9tIGhlcmUgYW5kXG4gICAgICAgIC8vIHplcm8gY2xpY2tzIGZ1cnRoZXIgdGhhbiBhIHNlY29uZCBzaWRlYmFyIHJvdy4gVGhlXG4gICAgICAgIC8vIHZpZXctZW50cnkgZXhlbXBsYXIgZHV0eSB0aGlzIGl0ZW0gdXNlZCB0byBjYXJyeSBub3cgc2l0cyB3aXRoIHRoZVxuICAgICAgICAvLyBcIk15IFdvcmtcIiBpdGVtcyBiZWxvdywgd2hpY2ggYXJlIGFsbCBvYmplY3QgKyBgdmlld05hbWVgLlxuICAgICAgICB7IGlkOiAnbmF2X29wcG9ydHVuaXR5JywgdHlwZTogJ29iamVjdCcsIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLCBsYWJlbDogJ09wcG9ydHVuaXRpZXMnLCBpY29uOiAndGFyZ2V0JyB9LFxuICAgICAgICB7IGlkOiAnbmF2X3F1b3RlJywgICAgICAgdHlwZTogJ29iamVjdCcsIG9iamVjdE5hbWU6ICdjcm1fcXVvdGUnLCAgICAgICBsYWJlbDogJ1F1b3RlcycsICAgICAgICBpY29uOiAncmVjZWlwdCcgfSxcbiAgICAgICAgLy8gQ29udHJhY3RzIGNsb3NlIHRoZSBzYWxlcyBjeWNsZTogcXVvdGUgXHUyMTkyIHNpZ25lZCBhZ3JlZW1lbnQgXHUyMTkyIHJlbmV3YWwuXG4gICAgICAgIC8vIFRoZSBvYmplY3QsIGl0cyB2aWV3cyBhbmQgaXRzIHJlbmV3YWwgYXV0b21hdGlvbiBhbGwgc2hpcHBlZCwgYnV0XG4gICAgICAgIC8vIHRoZXJlIHdhcyBubyB3YXkgdG8gcmVhY2ggYW55IG9mIGl0IGZyb20gdGhlIGFwcC5cbiAgICAgICAgeyBpZDogJ25hdl9jb250cmFjdCcsICAgIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX2NvbnRyYWN0JywgICAgbGFiZWw6ICdDb250cmFjdHMnLCAgICAgaWNvbjogJ2ZpbGUtc2lnbmF0dXJlJyB9LFxuICAgICAgICAvLyBQcm9kdWN0cyBzaXQgaGVyZSwgbm90IHVuZGVyIE1hcmtldGluZyAoIzEyNTkpOiB0aGV5IGFyZSB0aGVcbiAgICAgICAgLy8gcmV2ZW51ZSBtYXN0ZXIgZGF0YSBldmVyeSBxdW90ZSBsaW5lIGFuZCBvcHBvcnR1bml0eSBsaW5lIGl0ZW1cbiAgICAgICAgLy8gcG9pbnRzIGF0IFx1MjAxNCBhIHNhbGVzIG9iamVjdCB0aGF0IGhhcHBlbmVkIHRvIGJlIGZpbGVkIG5leHQgdG9cbiAgICAgICAgLy8gY2FtcGFpZ25zLlxuICAgICAgICB7IGlkOiAnbmF2X3Byb2R1Y3QnLCAgICAgdHlwZTogJ29iamVjdCcsIG9iamVjdE5hbWU6ICdjcm1fcHJvZHVjdCcsICAgICBsYWJlbDogJ1Byb2R1Y3RzJywgICAgICBpY29uOiAncGFja2FnZScgfSxcbiAgICAgICAgeyBpZDogJ25hdl9zYWxlc19kYXNoYm9hcmQnLCB0eXBlOiAnZGFzaGJvYXJkJywgZGFzaGJvYXJkTmFtZTogJ3NhbGVzX2Rhc2hib2FyZCcsIGxhYmVsOiAnU2FsZXMgUGVyZm9ybWFuY2UnLCBpY29uOiAnY2hhcnQtbGluZScgfSxcbiAgICAgIF0sXG4gICAgfSxcblxuICAgIHtcbiAgICAgIC8vIEV2ZXJ5dGhpbmcgYSByZXAgb3dlcyBzb21lb25lLiBgY3JtX3Rhc2tgIGhhZCB2aWV3cywgc2VlZCBkYXRhLCBhXG4gICAgICAvLyByZWN1cnJlbmNlIGhvb2sgYW5kIHR3byByZW1pbmRlciBmbG93cywgYW5kIG5vIGVudHJ5IHBvaW50IFx1MjAxNCB0aGUgb25seVxuICAgICAgLy8gd2F5IHRvIHNlZSBhIHRhc2sgd2FzIHRvIG9wZW4gdGhlIHJlY29yZCBpdCBodW5nIG9mZi5cbiAgICAgIGlkOiAnZ3JvdXBfd29yaycsXG4gICAgICB0eXBlOiAnZ3JvdXAnLFxuICAgICAgbGFiZWw6ICdNeSBXb3JrJyxcbiAgICAgIGljb246ICdsaXN0LWNoZWNrcycsXG4gICAgICBleHBhbmRlZDogdHJ1ZSxcbiAgICAgIC8vIFRoZXNlIGFyZSBMaXN0Vmlld3M6IHRoZXkgbGlzdCB0aGUgcmVjb3JkcyB0aGVtc2VsdmVzLCB3aGljaCBhXG4gICAgICAvLyBkYXNoYm9hcmQgd2lkZ2V0IChhbiBhZ2dyZWdhdGUgb3ZlciBhIGRhdGFzZXQsIEFEUi0wMDIxKSBjYW5ub3QuIEJvdGhcbiAgICAgIC8vIHN1cmZhY2VzIHJlc29sdmUgYHtjdXJyZW50X3VzZXJfaWR9YCBzaW5jZSBvYmplY3RzdGFjayMxMjIzMCBcdTIwMTQgdGhlXG4gICAgICAvLyBTZXJ2aWNlIGRhc2hib2FyZCdzIFwiTXkgT3BlbiBDYXNlcyBieSBQcmlvcml0eVwiIGlzIHRoZSBhZ2dyZWdhdGVcbiAgICAgIC8vIGNvdW50ZXJwYXJ0IG9mIFwiTXkgQ2FzZXNcIiAoIzUxMCkuXG4gICAgICAvL1xuICAgICAgLy8gRXZlcnkgaXRlbSBoZXJlIGlzIG9iamVjdCArIGB2aWV3TmFtZWAsIHdoaWNoIG1ha2VzIHRoaXMgZ3JvdXAgdGhlXG4gICAgICAvLyBhcHAncyB2aWV3LWVudHJ5IGV4ZW1wbGFyIHNpbmNlICMxMjU5IHJldGlyZWQgdGhlIFwiUGlwZWxpbmVcIiByb3cuXG4gICAgICAvLyBUaGUgb25lIGV4Y2VwdGlvbiBpcyB0aGUgYXBwcm92YWxzIEluYm94IGF0IHRoZSBib3R0b20gXHUyMDE0IGFcbiAgICAgIC8vIGBjb21wb25lbnRgIGVudHJ5LCBhbmQgdGhlIGFwcCdzIG9ubHkgb25lLlxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgeyBpZDogJ25hdl9teV90YXNrcycsIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX3Rhc2snLCB2aWV3TmFtZTogJ215X29wZW5fdGFza3MnLCBsYWJlbDogJ015IFRhc2tzJywgaWNvbjogJ2NpcmNsZS1jaGVjaycgfSxcbiAgICAgICAgeyBpZDogJ25hdl9teV9kZWFscycsIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5Jywgdmlld05hbWU6ICdteV9vcGVuX2RlYWxzJywgbGFiZWw6ICdNeSBEZWFscycsIGljb246ICd0YXJnZXQnIH0sXG4gICAgICAgIHsgaWQ6ICduYXZfbXlfbGVhZHMnLCB0eXBlOiAnb2JqZWN0Jywgb2JqZWN0TmFtZTogJ2NybV9sZWFkJywgdmlld05hbWU6ICdteV9sZWFkcycsIGxhYmVsOiAnTXkgTGVhZHMnLCBpY29uOiAndXNlci1wbHVzJyB9LFxuICAgICAgICAvLyAjNTkyIFx1MjAxNCB0aGUgcmVwJ3Mgb3duIGNhbGVuZGFyOiBhIGxpc3Qgb2YgZXZlbnRzLCBzbyBhIHZpZXcsIG5vdCBhXG4gICAgICAgIC8vIGRhc2hib2FyZC5cbiAgICAgICAgeyBpZDogJ25hdl9teV9jYWxlbmRhcicsIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX2V2ZW50Jywgdmlld05hbWU6ICdteV9ldmVudHMnLCBsYWJlbDogJ015IENhbGVuZGFyJywgaWNvbjogJ2NhbGVuZGFyLWRheXMnIH0sXG4gICAgICAgIC8vIE5vIFwiQWxsIFRhc2tzXCIgZW50cnk6IFwiTXkgVGFza3NcIiBvcGVucyB0aGUgYGNybV90YXNrYCBsaXN0IHBhZ2UsXG4gICAgICAgIC8vIHdob3NlIHRhYiBzdHJpcCBsZWFkcyB3aXRoICpBbGwgVGFza3MqIFx1MjAxNCBgVGFza1ZpZXdzLmxpc3RgLCBuYW1lXG4gICAgICAgIC8vIGBhbGxfdGFza3NgLiBJdCBsZWFkcyBiZWNhdXNlIGl0IGlzIHRoZSBvYmplY3QncyBQUklNQVJZIGxpc3Q6IHRoZVxuICAgICAgICAvLyBzd2l0Y2hlciBtb3ZlcyB0aGUgcHJpbWFyeSB0byB0aGUgZnJvbnQgb2YgdGhlIHN0cmlwIGFuZCBtYXJrcyBpdFxuICAgICAgICAvLyBkZWZhdWx0LCBzbyBub3RoaW5nIGhhcyB0byBiZSBhdXRob3JlZCB0byBzYXkgc28uIFRoZSB3aG9sZSBib29rIGlzXG4gICAgICAgIC8vIG9uZSB0YWIgYXdheSwgYW5kIHRoZSBzaWRlYmFyIGtlZXBzIG9uZSByb3cgcGVyIG9iamVjdCBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIHR3by5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gXHUyNTAwXHUyNTAwIFRoZSBhcHByb3ZhbHMgSW5ib3ggbGl2ZXMgaGVyZSwgbm90IGluIGEgZ3JvdXAgb2YgaXRzIG93biAoIzEyNTkpXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEl0IHVzZWQgdG8gYmUgdGhlIHNpbmdsZSBjaGlsZCBvZiBhbiBcIkFwcHJvdmFsc1wiIGdyb3VwLiBJdHMgY29udGVudFxuICAgICAgICAvLyBpcyBhIHBlcnNvbmFsIHF1ZXVlIFx1MjAxNCB0aGUgdGhpbmdzIHdhaXRpbmcgb24gKnlvdSogXHUyMDE0IHdoaWNoIGlzIHdoYXRcbiAgICAgICAgLy8gdGhpcyBncm91cCBpczsgYSBvbmUtaXRlbSBncm91cCBuZXh0IHRvIGl0IHdhcyBzdHJ1Y3R1cmUgd2l0aG91dCBhXG4gICAgICAgIC8vIGRpc3RpbmN0aW9uLiBEaXNzb2x2aW5nIHRoYXQgZ3JvdXAgaXMgd2h5IHRoaXMgZW50cnkgbW92ZWQsIG5vdCBhbnlcbiAgICAgICAgLy8gcnVsZSBhZ2FpbnN0IHNpbmdsZS1pdGVtIGdyb3VwcyAoTWFya2V0aW5nIGlzIG9uZSBhbmQgc3RheXMgb25lKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gXCJJbmJveFwiICh6aC1DTiBcdTVGODVcdTYyMTFcdTVCQTFcdTYyNzkpIG11c3QgbGFuZCBzb21ld2hlcmUgYW4gYXBwcm92ZXIgY2FuIGFjdHVhbGx5XG4gICAgICAgIC8vIGFwcHJvdmUuIEl0IHVzZWQgdG8gYmUgYHR5cGU6ICdvYmplY3QnYCBvbiBgc3lzX2FwcHJvdmFsX3JlcXVlc3RgIFx1MjAxNFxuICAgICAgICAvLyB0aGUgYXBwcm92YWxzIHBsdWdpbidzIHJhdyByZXF1ZXN0IHRhYmxlLCB3aGljaCBpcyByZWFkLW9ubHk6IG5vIHJvd1xuICAgICAgICAvLyBhY3Rpb25zLCBubyBhcHByb3ZlL3JlamVjdCwgb25seSBTaGFyZSBvbiB0aGUgcmVjb3JkIGRldGFpbC4gVGhlIGxhYmVsXG4gICAgICAgIC8vIHByb21pc2VkIGFuIGFjdGlvbiB0aGUgZGVzdGluYXRpb24gY291bGQgbm90IHBlcmZvcm0gKCMxMTIzKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYGNvbXBvbmVudGAgXHUyMDE0IG5vdCBgdXJsYC4gVGhlIHBsYXRmb3JtJ3MgYXBwcm92YWwgY2VudHJlIGlzIGFcbiAgICAgICAgLy8gZmlyc3QtcGFydHkgY29uc29sZSBzdXJmYWNlIHJlZ2lzdGVyZWQgaW4gdGhlIENvbXBvbmVudFJlZ2lzdHJ5IGFzXG4gICAgICAgIC8vIGBhcHByb3ZhbHM6aW5ib3hgIChyZWdpc3RlcmVkIGJ5IEBvYmplY3RzdGFjay9jb25zb2xlIGl0c2VsZiwgc291cmNlXG4gICAgICAgIC8vIGBAb2JqZWN0LXVpL2NvbnNvbGVgLCByZW5kZXJpbmcgQXBwcm92YWxzSW5ib3hQYWdlKSBcdTIwMTQgZXhhY3RseSB3aGF0IHRoZVxuICAgICAgICAvLyBzcGVjIGRvY3VtZW50cyBgY29tcG9uZW50YCBmb3I6IFwiYSBmaXJzdC1wYXJ0eSBVSSBzaGlwcGVkIHdpdGggdGhlXG4gICAgICAgIC8vIHBsYXRmb3JtIFx1MjAxNCB0eXBpY2FsbHkgYWRtaW4vc2V0dXAgc3VyZmFjZXMgdGhhdCBoYXZlIG5vIHJvdyBpbiBhbnkgZGF0YVxuICAgICAgICAvLyBzdG9yZVwiLiBgdXJsYCBpcyBkb2N1bWVudGVkIGFzIHRoZSAqZXh0ZXJuYWwgbGluayogdHlwZSwgYW5kIHRha2luZyBpdFxuICAgICAgICAvLyB3b3VsZCBtZWFuIGhhcmQtY29kaW5nIGEgY29uc29sZS1pbnRlcm5hbCByb3V0ZSBwbHVzIHRoaXMgYXBwJ3Mgb3duXG4gICAgICAgIC8vIG5hbWUgKGAvYXBwcy9jcm1fZW50ZXJwcmlzZS9zeXN0ZW0vYXBwcm92YWxzYCkgaW50byBtZXRhZGF0YS4gQVxuICAgICAgICAvLyBgY29tcG9uZW50UmVmYCBpbnN0ZWFkIHJlc29sdmVzIGFnYWluc3QgdGhlICpjdXJyZW50KiBhcHAgYmFzZSwgc28gdGhlXG4gICAgICAgIC8vIGVudHJ5IGtlZXBzIHRoZSB1c2VyIGluc2lkZSBIb3RDUk0ncyBzaGVsbCB3aXRob3V0IG5hbWluZyB0aGUgYXBwLCBhbmRcbiAgICAgICAgLy8gYSByZWYgdGhhdCBldmVyIHN0b3BzIHJlc29sdmluZyByZW5kZXJzIGEgbG91ZCBcIkNvbXBvbmVudCBub3RcbiAgICAgICAgLy8gcmVnaXN0ZXJlZFwiIHBhbmVsIHJhdGhlciB0aGFuIHNpbGVudGx5IGJvdW5jaW5nIHRvIHRoZSBjb25zb2xlIGhvbWUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZSByZWFkLW9ubHkgb2JqZWN0IGxpc3QgaXMgbm90IGtlcHQgYXMgYSBzZWNvbmQgXCJoaXN0b3J5XCIgZW50cnk6IHRoZVxuICAgICAgICAvLyBhcHByb3ZhbCBjZW50cmUgYWxyZWFkeSBzdWJzdW1lcyBpdCBcdTIwMTQgTXkgUGVuZGluZyAvIFN1Ym1pdHRlZCBieSBtZSAvXG4gICAgICAgIC8vIEFsbCB0YWJzIHBsdXMgYSBzdGF0dXMgZmlsdGVyIChQZW5kaW5nIC8gQXBwcm92ZWQgLyBSZWplY3RlZCAvXG4gICAgICAgIC8vIFJlY2FsbGVkIC8gUmV0dXJuZWQgZm9yIHJldmlzaW9uKSBcdTIwMTQgc28gYSBzZWNvbmQgZW50cnkgd291bGQgYWRkIGFcbiAgICAgICAgLy8gc3RyaWN0bHkgd2Vha2VyIHZpZXcgb2YgdGhlIHNhbWUgcm93cy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYHJlcXVpcmVzT2JqZWN0YCBpcyByZXRhaW5lZDogaXQgaXMgYSBiYXNlIG5hdi1pdGVtIGZpZWxkIG9uIGV2ZXJ5XG4gICAgICAgIC8vIGl0ZW0gdHlwZSwgc28gdGhlIGVudHJ5IHN0aWxsIGhpZGVzIGl0c2VsZiBvbiBpbnN0YWxscyB3aGVyZVxuICAgICAgICAvLyBAb2JqZWN0c3RhY2svcGx1Z2luLWFwcHJvdmFscyBpcyBhYnNlbnQgYW5kIG5vIGFwcHJvdmFsIGV4aXN0cyB0byBhY3RcbiAgICAgICAgLy8gb24uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZXJlIGlzIG5vIFwiUHJvY2Vzc2VzXCIgaXRlbSBlaXRoZXI6IEBvYmplY3RzdGFjay9wbHVnaW4tYXBwcm92YWxzXG4gICAgICAgIC8vIHJlZ2lzdGVycyBzeXNfYXBwcm92YWxfcmVxdWVzdCAvIHN5c19hcHByb3ZhbF9hY3Rpb24gL1xuICAgICAgICAvLyBzeXNfYXBwcm92YWxfYXBwcm92ZXIgLyBzeXNfYXBwcm92YWxfZGVsZWdhdGlvbiBcdTIwMTQgYnV0IG5laXRoZXIgYSBiYXJlXG4gICAgICAgIC8vIGBzeXNfYXBwcm92YWxgIG5vciBhIGBzeXNfYXBwcm92YWxfcHJvY2Vzc2Agb2JqZWN0IGV4aXN0cyBpbiBhbnlcbiAgICAgICAgLy8gaW5zdGFsbGVkIHBsdWdpbiAobWVhc3VyZWQgb24gdGhlIDE3LjIuMCByb3N0ZXJzKSxcbiAgICAgICAgLy8gc28gdGhlIG9sZCBpdGVtJ3MgcmVxdWlyZXNPYmplY3QgZ3VhcmQgaGlkIGl0IG9uIGV2ZXJ5IGluc3RhbGwsXG4gICAgICAgIC8vIGZvcmV2ZXIuXG4gICAgICAgIHsgaWQ6ICduYXZfYXBwcm92YWxfcmVxdWVzdHMnLCB0eXBlOiAnY29tcG9uZW50JywgY29tcG9uZW50UmVmOiAnYXBwcm92YWxzOmluYm94JywgbGFiZWw6ICdJbmJveCcsIGljb246ICdpbmJveCcsIHJlcXVpcmVzT2JqZWN0OiAnc3lzX2FwcHJvdmFsX3JlcXVlc3QnIH0sXG4gICAgICBdLFxuICAgIH0sXG5cbiAgICB7XG4gICAgICAvLyAjNTkyIFx1MjAxNCBhY3Rpdml0eSB3YXMgdGhlIGFwcCdzIGxhcmdlc3QgYmxpbmQgc3BvdDogYGNybV9ldmVudGAgYW5kIGl0c1xuICAgICAgLy8gYXR0ZW5kZWUgcm93cyBoYWQgbm93aGVyZSB0byBiZSBzZWVuLCBhbmQgbm8gZGFzaGJvYXJkIGFueXdoZXJlIGNvdW50ZWRcbiAgICAgIC8vIGFuIGludGVyYWN0aW9uLiBLZXB0IGFzIGl0cyBvd24gZ3JvdXAgcmF0aGVyIHRoYW4gYnVyaWVkIHVuZGVyIFNhbGVzLFxuICAgICAgLy8gYmVjYXVzZSBcIndoYXQgaGFwcGVuZWQgd2l0aCB0aGlzIGN1c3RvbWVyLCBhbmQgd2hlbj9cIiBpcyB0aGUgcXVlc3Rpb25cbiAgICAgIC8vIHRoZSB3aG9sZSBiYXRjaCB3YXMgYWJvdXQuXG4gICAgICBpZDogJ2dyb3VwX2FjdGl2aXR5JyxcbiAgICAgIHR5cGU6ICdncm91cCcsXG4gICAgICBsYWJlbDogJ0FjdGl2aXR5JyxcbiAgICAgIGljb246ICdjYWxlbmRhci1kYXlzJyxcbiAgICAgIGV4cGFuZGVkOiB0cnVlLFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgLy8gT25lIHJvdyBmb3IgdGhlIG9iamVjdCwgb25lIGZvciB0aGUgZGFzaGJvYXJkLiBUaGUgY2FsZW5kYXIgYW5kIHRoZVxuICAgICAgICAvLyBpbnRlcmFjdGlvbiBoaXN0b3J5IGFyZSB0d28gbW9yZSB0YWJzIG9uIHRoaXMgc2FtZSBsaXN0IHBhZ2UgXHUyMDE0XG4gICAgICAgIC8vIGBldmVudF9jYWxlbmRhcmAgYW5kIGBoZWxkX2V2ZW50c2AgaW4gYEV2ZW50Vmlld3MubGlzdFZpZXdzYCwgd2hpY2hcbiAgICAgICAgLy8gdGhlIHN3aXRjaGVyIHB1dHMgb24gdGhlIHN0cmlwIHVuZGVyIGVhY2ggdmlldydzIG93biBsYWJlbCBcdTIwMTQgIzEyNTlcbiAgICAgICAgLy8gcmVtb3ZlZCB0aGUgc2lkZWJhciBkdXBsaWNhdGVzLCBub3QgdGhlIHN1cmZhY2VzLiBgY3JtX2V2ZW50YCBoYWRcbiAgICAgICAgLy8gZm91ciBzaWRlYmFyIHJvd3M7XG4gICAgICAgIC8vIGl0IHdhcyB0aGUgc2luZ2xlIGxhcmdlc3Qgc291cmNlIG9mIHRoZSBuYXYncyBncm93dGguXG4gICAgICAgIHsgaWQ6ICduYXZfZXZlbnQnLCAgICAgICAgICB0eXBlOiAnb2JqZWN0JywgICAgb2JqZWN0TmFtZTogJ2NybV9ldmVudCcsICAgbGFiZWw6ICdFdmVudHMnLCAgICAgICAgICBpY29uOiAnY2FsZW5kYXItZGF5cycgfSxcbiAgICAgICAgeyBpZDogJ25hdl9hY3Rpdml0eV9kYXNoYm9hcmQnLCB0eXBlOiAnZGFzaGJvYXJkJywgZGFzaGJvYXJkTmFtZTogJ3NhbGVzX2FjdGl2aXR5X2Rhc2hib2FyZCcsIGxhYmVsOiAnU2FsZXMgQWN0aXZpdHknLCBpY29uOiAnYWN0aXZpdHknIH0sXG4gICAgICBdLFxuICAgIH0sXG5cbiAgICB7XG4gICAgICAvLyBDYW1wYWlnbnMgZHJpdmUgbGVhZF9zb3VyY2UgYW5kIHRoZSBjYW1wYWlnbi1tZW1iZXIgcmVjb3JkcyB0aGF0XG4gICAgICAvLyBcIkFkZCB0byBDYW1wYWlnblwiIHdyaXRlcyBcdTIwMTQgd2l0aCBubyBuYXYgZW50cnkgdGhlIG1hcmtldGluZyBoYWxmIG9mXG4gICAgICAvLyB0aGUgZGF0YSBtb2RlbCB3YXMgaW52aXNpYmxlLlxuICAgICAgLy9cbiAgICAgIC8vIEEgc2luZ2xlLWl0ZW0gZ3JvdXAgb24gcHVycG9zZSAoIzEyNTkpLiBNYXJrZXRpbmcgaXMgYSBkb21haW4gb2YgaXRzXG4gICAgICAvLyBvd24sIGFuZCBhIHJlYWRlciBzY2FubmluZyB0aGUgc2lkZWJhciBmb3IgXCJ3aGVyZSBkb2VzIGNhbXBhaWduIHdvcmtcbiAgICAgIC8vIGxpdmVcIiBmaW5kcyBpdCBieSBuYW1lLiBJdGVtLWNvdW50IHN5bW1ldHJ5IGlzIG5vdCB0aGUgZ29hbDsgdGhlXG4gICAgICAvLyBBcHByb3ZhbHMgZ3JvdXAgd2FzIGRpc3NvbHZlZCBiZWNhdXNlIGl0cyBpdGVtICp3YXMqIHBlcnNvbmFsIHdvcmssXG4gICAgICAvLyBub3QgYmVjYXVzZSBvbmUgY2hpbGQgaXMgdG9vIGZldy5cbiAgICAgIGlkOiAnZ3JvdXBfbWFya2V0aW5nJyxcbiAgICAgIHR5cGU6ICdncm91cCcsXG4gICAgICBsYWJlbDogJ01hcmtldGluZycsXG4gICAgICBpY29uOiAnbWVnYXBob25lJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHsgaWQ6ICduYXZfY2FtcGFpZ24nLCB0eXBlOiAnb2JqZWN0Jywgb2JqZWN0TmFtZTogJ2NybV9jYW1wYWlnbicsIGxhYmVsOiAnQ2FtcGFpZ25zJywgaWNvbjogJ21lZ2FwaG9uZScgfSxcbiAgICAgIF0sXG4gICAgfSxcblxuICAgIHtcbiAgICAgIGlkOiAnZ3JvdXBfc2VydmljZScsXG4gICAgICB0eXBlOiAnZ3JvdXAnLFxuICAgICAgbGFiZWw6ICdTZXJ2aWNlJyxcbiAgICAgIGljb246ICdoZWFkc2V0JyxcbiAgICAgIGV4cGFuZGVkOiB0cnVlLFxuICAgICAgLy8gRU1QVFkgT04gUFVSUE9TRSBcdTIwMTQgdGhpcyBncm91cCBpcyBhIENPTlRBSU5FUiwgbm90IGEgbWVudS5cbiAgICAgIC8vXG4gICAgICAvLyBgY3JtX2Nhc2VgLCBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCwgYHNlcnZpY2VfZGFzaGJvYXJkYCBhbmRcbiAgICAgIC8vIGBzbGFfcGVyZm9ybWFuY2VgIGJlbG9uZyB0byBgYXBwLm9iamVjdHN0YWNrLmhvdGNybS5zZXJ2aWNlYCwgYW5kIGFuXG4gICAgICAvLyBhcHAncyBvd24gYG5hdmlnYXRpb25gIG1heSBub3QgbmFtZSBhbm90aGVyIHBhY2thZ2UncyBvYmplY3QgKEFEUi0wMTMwXG4gICAgICAvLyBcdTAwQTcxLjUpOiB0aGUgZW50cnkgZmFpbHMgYXQgYXV0aG9yIHRpbWUgd2l0aCBcInJlZmVyZW5jZXMgb2JqZWN0XG4gICAgICAvLyBgY3JtX2Nhc2VgIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGluIG9iamVjdHNcIi4gVGhlIG1vZHVsZSBwdXRzIGFsbCB0aHJlZVxuICAgICAgLy8gYmFjayB0aHJvdWdoIGBuYXZpZ2F0aW9uQ29udHJpYnV0aW9uc2AgKEFEUi0wMDI5IEQ3KSwgYW5kIGl0IGNhbiBvbmx5XG4gICAgICAvLyBhaW0gYXQgYSBncm91cCB0aGUgYXBwIERFQ0xBUkVTIFx1MjAxNCBhIG1vZHVsZSBjYW5ub3QgY3JlYXRlIG9uZSBpbnNpZGUgYW5cbiAgICAgIC8vIGFwcCBpdCBkb2VzIG5vdCBvd24uIFNvIHRoZSBhcHAgcHVibGlzaGVzIHRoZSBhbmNob3IgYW5kIHRoZSBtb2R1bGVcbiAgICAgIC8vIGZpbGxzIGl0OyBgc3JjL3NlcnZpY2UvaW5kZXgudHNgIGhvbGRzIHRoZSBvdGhlciBoYWxmLCBhbmQgdGhlIHR3b1xuICAgICAgLy8gc2VydmljZSBpdGVtcyBvZiAqTXkgV29yayogYW5kICpJbnNpZ2h0cyogY29tZSBiYWNrIHRoZSBzYW1lIHdheS5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2RDQgRG8gbm90IFwidGlkeVwiIHRoZSBncm91cCBhd2F5OiBkZWxldGluZyBpdCByZWxvY2F0ZXMgYWxsIHRocmVlXG4gICAgICAvLyBjb250cmlidXRlZCBpdGVtcyB0byB0aGUgYXBwJ3MgdG9wIGxldmVsIHdpdGggYVxuICAgICAgLy8gYG5hdl9jb250cmlidXRpb25fZ3JvdXBfbWlzc2luZ2Agd2FybmluZy5cbiAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICB9LFxuXG4gICAge1xuICAgICAgaWQ6ICdncm91cF9pbnNpZ2h0cycsXG4gICAgICB0eXBlOiAnZ3JvdXAnLFxuICAgICAgbGFiZWw6ICdJbnNpZ2h0cycsXG4gICAgICBpY29uOiAnc3BhcmtsZXMnLFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgLy8gVHJpbW1lZCB0byB0aHJlZSBoaWdoLXNpZ25hbCByZXBvcnRzLiBGdWxsIHJlcG9ydCBjYXRhbG9ndWUgc3RpbGxcbiAgICAgICAgLy8gc2hpcHMgYXMgbWV0YWRhdGE7IGFkbWlucyBjYW4gcGluIG1vcmUgZnJvbSB0aGUgcmVwb3J0IHBpY2tlci5cbiAgICAgICAgeyBpZDogJ25hdl9jcm1fZGFzaGJvYXJkJywgICAgICAgICAgICB0eXBlOiAnZGFzaGJvYXJkJywgZGFzaGJvYXJkTmFtZTogJ2NybV9vdmVydmlld19kYXNoYm9hcmQnLCBsYWJlbDogJ0NSTSBPdmVydmlldycsICAgICAgaWNvbjogJ2xheW91dC1kYXNoYm9hcmQnIH0sXG4gICAgICAgIHsgaWQ6ICduYXZfZm9yZWNhc3QnLCAgICAgICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsIG9iamVjdE5hbWU6ICdjcm1fZm9yZWNhc3QnLCAgICAgICAgICAgICAgICAgbGFiZWw6ICdGb3JlY2FzdHMnLCAgICAgICAgIGljb246ICd0cmVuZGluZy11cCcgfSxcbiAgICAgICAgeyBpZDogJ25hdl9yZXBvcnRfcGlwZWxpbmVfY292ZXJhZ2UnLCB0eXBlOiAncmVwb3J0JywgcmVwb3J0TmFtZTogJ3BpcGVsaW5lX2NvdmVyYWdlX2J5X3F1YXJ0ZXInLCBsYWJlbDogJ1BpcGVsaW5lIENvdmVyYWdlJywgaWNvbjogJ2NvbHVtbnMtMycgfSxcbiAgICAgICAgeyBpZDogJ25hdl9yZXBvcnRfbGVhZF9pbmZsb3cnLCAgICAgICB0eXBlOiAncmVwb3J0JywgcmVwb3J0TmFtZTogJ2xlYWRfaW5mbG93X2J5X21vbnRoX3NvdXJjZScsICBsYWJlbDogJ0xlYWQgSW5mbG93JywgICAgICAgaWNvbjogJ3RyZW5kaW5nLXVwJyB9LFxuICAgICAgXSxcbiAgICB9LFxuXG4gIF0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzL2luZGV4LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzL2luZGV4LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFByb2ZpbGUgRGVmaW5pdGlvbnMgQmFycmVsXG4gKlxuICogXHUyNTAwXHUyNTAwXHUyNTAwIGBhbGxvd0V4cG9ydGAgXHUyMDE0IHRoZSBvcHQtaW4gYnVsay1lZ3Jlc3MgYXhpcyAoQG9iamVjdHN0YWNrIDE3LCAjMzU0NCkgXHUyNTAwXHUyNTAwXHUyNTAwXG4gKlxuICogVGhpcyBpcyB0aGUgY2Fub25pY2FsIG5vdGU7IHRoZSBwcm9maWxlcyBwb2ludCBoZXJlLlxuICpcbiAqIEJlZm9yZSAxNy4wIHRoZSBleHBvcnQgYXhpcyB3YXMgYWR2aXNvcnk6IGFuIHVuc2V0IGBhbGxvd0V4cG9ydGAgaW5oZXJpdGVkXG4gKiByZWFkLCBzbyBcImNhbiBsaXN0IFx1MjFEMiBjYW4gZXhwb3J0XCIgYW5kIHRoZSBiaXQgb25seSBldmVyIGhpZCBhIGJ1dHRvbi4gMTcuMFxuICogbWFrZXMgaXQgYSByZWFsIGdhdGUgYW5kIGludmVydHMgdGhlIGRlZmF1bHQgXHUyMDE0IGByZXNvbHZlVXNlckV4cG9ydEFsbG93ZWRgXG4gKiAocGx1Z2luLXNlY3VyaXR5KSByZXR1cm5zIHRydWUgb25seSBmb3IgYW4gZXhwbGljaXQgYGFsbG93RXhwb3J0OiB0cnVlYCwgYW5kXG4gKiBuZWl0aGVyIGB2aWV3QWxsUmVjb3Jkc2Agbm9yIGBtb2RpZnlBbGxSZWNvcmRzYCBzdWJzdGl0dXRlcyBmb3IgaXQuIEFuIHVuc2V0XG4gKiBiaXQgbm93IERFTklFUy5cbiAqXG4gKiBXSEVSRSBpdCBpcyBlbmZvcmNlZCwgbWVhc3VyZWQgb24gYSBydW5uaW5nIGRldiBzZXJ2ZXIgKCM3OTgpLiBPbmUgcm91dGVcbiAqIGNhcnJpZXMgYnVsayBlZ3Jlc3MgaW4gdGhpcyBhcHA6IGBHRVQgL2FwaS92MS9kYXRhLzpvYmplY3QvZXhwb3J0YFxuICogKGBjc3ZgIC8gYHhsc3hgIC8gYGpzb25gKSwgZ2F0ZWQgYnkgYGVuZm9yY2VFeHBvcnRQZXJtaXNzaW9uYCBcdTIxOTJcbiAqIGBzZWN1cml0eS5jYW5FeHBvcnRgIGluIGBAb2JqZWN0c3RhY2svcmVzdGAuIEEgcHJpbmNpcGFsIGhvbGRpbmcgdGhlIGdyYW50XG4gKiBnZXRzIDIwMCBhbmQgdGhlIHJvd3M7IG9uZSB3aXRob3V0IGl0IGdldHMgNDAzIGBFWFBPUlRfTk9UX1BFUk1JVFRFRGAuXG4gKlxuICogQSBsaXN0IHZpZXcncyBgZXhwb3J0T3B0aW9uc2AgaXMgTk9UIGEgc2Vjb25kIGRvb3IgXHUyMDE0IGl0IGRlY2xhcmVzIHdoaWNoXG4gKiBmb3JtYXRzIHRoZSB0b29sYmFyJ3MgRXhwb3J0IGJ1dHRvbiBvZmZlcnMsIGFuZCB0aGF0IGJ1dHRvbiBjYWxscyB0aGUgdmVyeVxuICogc2FtZSByb3V0ZS4gU28gdGhlIGdhdGUgaXMgb2JqZWN0LXdpZGUgYW5kIHJlYWNoYWJsZSB3aXRoIGBjdXJsYCwgd2hpY2ggaXNcbiAqIGV4YWN0bHkgd2h5IGl0IGhhcyB0byBiZSBlbmZvcmNlZCBzZXJ2ZXItc2lkZSByYXRoZXIgdGhhbiBieSBoaWRpbmcgYSBidXR0b24uXG4gKlxuICogU0hBUEUgKEBvYmplY3RzdGFjay9zcGVjIDE3LjAuMCwgIzgwMTAsIG1haW50YWluZXIgcnVsaW5nIDIwMjYtMDgtMTIpOiB0aGVcbiAqIGRlY2xhcmF0aW9uIGlzIHRoZSBPQkpFQ1QgZm9ybSBgZXhwb3J0T3B0aW9uczogeyBmb3JtYXRzOiBbJ2NzdicsICd4bHN4J10gfWAuXG4gKiBUaGUgYmFyZSBhcnJheSB0aGlzIGFwcCB1c2VkIHRocm91Z2ggMTcuMC4wLXJjLjYgaXMgdGhlIGxlZ2FjeSBzcGVsbGluZzsgaXRcbiAqIHN0aWxsIHBhcnNlcyBhbmQgTElGVFMgdG8gYHsgZm9ybWF0czogWy4uLl0gfWAsIHNvIGB6LmlucHV0YCBhY2NlcHRzIGJvdGhcbiAqIHdoaWxlIGB6Lm91dHB1dGAgXHUyMDE0IGV2ZXJ5dGhpbmcgdGhhdCByZWFkcyBsb2FkZWQgbWV0YWRhdGEsIHRoaXMgYXBwJ3Mgb3duXG4gKiBndWFyZHMgaW5jbHVkZWQgXHUyMDE0IG9ubHkgZXZlciBzZWVzIHRoZSBvYmplY3QuIFRoYXQgYXN5bW1ldHJ5IGlzIHdoeSB0aGUgYnVtcFxuICogdG8gMTcuMC4wIGJsaW5kZWQgdGhlIGd1YXJkIGJlbG93IHJhdGhlciB0aGFuIGZhaWxpbmcgaXQ6IHRoZSB2aWV3cyBzdGlsbFxuICogZGVjbGFyZWQgdGhlaXIgc3VyZmFjZXMsIGFuZCBhIHJlYWRlciB0ZXN0aW5nIHRoZSBsZWdhY3kgYXJyYXkncyBgLmxlbmd0aGBcbiAqIHNpbGVudGx5IG1lYXN1cmVkIGB1bmRlZmluZWRgIG9uIGV2ZXJ5IG9uZSBvZiB0aGVtLiBSZWFkIGAuZm9ybWF0c2AuXG4gKiBgJ3BkZidgIGxlZnQgdGhlIGZvcm1hdCBlbnVtIGluIHRoZSBzYW1lIGNoYW5nZSAoIzEzMDEgTk9UX1BMQU5ORUQpOyB0aGlzXG4gKiBhcHAgbmV2ZXIgZGVjbGFyZWQgaXQuXG4gKlxuICogYFJlcG9ydFNlcnZpY2UuYXNzZXJ0RXhwb3J0QWxsb3dlZGAgaXMgYSBnZW51aW5lbHkgc2VwYXJhdGUgZ2F0ZSwgYnV0IGl0XG4gKiBiZWxvbmdzIHRvIHRoZSBgcmVwb3J0c2AgY2FwYWJpbGl0eSAoc2F2ZWQgcmVwb3J0cyArIGVtYWlsZWQgZGlnZXN0cyBvdmVyXG4gKiBgc3lzX3NhdmVkX3JlcG9ydGApLCB3aGljaCB0aGlzIGFwcCBkb2VzIG5vdCByZXF1aXJlIFx1MjAxNCBgL2FwaS92MS9yZXBvcnRzYFxuICogYW5zd2VycyA1MDEgb24gYSBkZWZhdWx0IGJvb3QsIGFuZCB0aGUgQ29uc29sZSdzIHJlcG9ydCBwYWdlIHNoaXBzIG5vIGV4cG9ydFxuICogYWZmb3JkYW5jZSBlaXRoZXIgd2F5LiBJdCBpcyBub3Qgd2hhdCBhbnkgZ3JhbnQgYmVsb3cgbGFuZHMgb24uIERvIG5vdCByZWFkXG4gKiB0aGUgcnVsZSBiZWxvdyBhcyBkZXBlbmRpbmcgb24gaXQ6ICM3OTggd2FzIGZpbGVkIG9uIGV4YWN0bHkgdGhhdCByZWFkaW5nLlxuICpcbiAqIFNvIHRoZSBncmFudHMgYmVsb3cgYXJlIGF1dGhvcmVkLCBub3QgaW5oZXJpdGVkLiBUaGUgcnVsZSwgcGlubmVkIGJ5XG4gKiBgdGVzdC9hdXRob3JpemF0aW9uLWNvdmVyYWdlLnRlc3QudHNgOlxuICpcbiAqICAgYSBwcm9maWxlIGdyYW50cyBgYWxsb3dFeHBvcnRgIG9uIGFuIG9iamVjdCBJRkYgaXQgYWxyZWFkeSBob2xkc1xuICogICBgYWxsb3dSZWFkYCB0aGVyZSBBTkQgdGhlIGFwcCBzaGlwcyBhbiBleHBvcnQgc3VyZmFjZSBmb3IgdGhhdCBvYmplY3QgXHUyMDE0XG4gKiAgIHRoYXQgaXMsIGEgbGlzdCB2aWV3IGRlY2xhcmluZyBgZXhwb3J0T3B0aW9uc2AuXG4gKlxuICogVGhhdCBydWxlIGlzIGFuIEFVVEhPUklORyBESVNDSVBMSU5FIGFib3V0IHdoaWNoIGFmZm9yZGFuY2VzIHRoaXMgYXBwIHNoaXBzLFxuICogbm90IGEgc3RhdGVtZW50IGFib3V0IHJlYWNoYWJpbGl0eTogdGhlIGV4cG9ydCByb3V0ZSBleGlzdHMgZm9yIGV2ZXJ5XG4gKiBBUEktZXhwb3NlZCBvYmplY3QsIHNvIGEgZ3JhbnQgb24gYW55IG9mIHRoZW0gd291bGQgd29yay4gVGhlIGRpc2NpcGxpbmVcbiAqIGtlZXBzIHRoZSBncmFudCBsaXN0IHRvIG9iamVjdHMgYSB1c2VyIGNhbiBhY3R1YWxseSByZWFjaCBhbiBleHBvcnQgZnJvbSxcbiAqIHNvIHRoZSBwZXJtaXNzaW9uIHRhYmxlIHN0YXlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2R1Y3QgcmF0aGVyIHRoYW4gb2ZcbiAqIHRoZSBwbGF0Zm9ybS4gUmVhY2hhYmlsaXR5IGlzIHBpbm5lZCBzZXBhcmF0ZWx5LCBieSB0aGUgYGVuYWJsZWAgZ3VhcmQgYXRcbiAqIHRoZSBlbmQgb2YgdGhhdCBzYW1lIHRlc3QgZmlsZS5cbiAqXG4gKiBUaGF0IHVuaW9uIGlzIGV4YWN0bHkgYGNybV9hY2NvdW50YCwgYGNybV9jYXNlYCwgYGNybV9jb250YWN0YCwgYGNybV9sZWFkYCxcbiAqIGBjcm1fb3Bwb3J0dW5pdHlgIHRvZGF5LCBlYWNoIGJlaGluZCB0aGUgYGV4cG9ydE9wdGlvbnNgIG9uIGl0cyBvd24gbGlzdFxuICogdmlldy4gQWRkaW5nIGBleHBvcnRPcHRpb25zYCB0byBhIHZpZXcgbWVhbnMgYWRkaW5nIHRoZSBtYXRjaGluZyBncmFudCBoZXJlXG4gKiBpbiB0aGUgc2FtZSBjaGFuZ2UgXHUyMDE0IHRoZSBndWFyZCBmYWlscyBvdGhlcndpc2UsIHdoaWNoIGlzIHRoZSBwb2ludDogYVxuICogc3VyZmFjZSBub2JvZHkgY2FuIHVzZSBpcyB0aGUgZmFpbHVyZSB0aGlzIGF4aXMgZXhpc3RzIHRvIG1ha2UgbG91ZCBpbnN0ZWFkXG4gKiBvZiBzaWxlbnQuXG4gKlxuICogQSBSRVBPUlQgSVMgTk9UIEFOIEVYUE9SVCBTVVJGQUNFLiBUaGUgQ29uc29sZSdzIHJlcG9ydCBwYWdlIHJlbmRlcnMgYSBjaGFydFxuICogYW5kIGEgZGF0YSB0YWJsZSBhbmQgb2ZmZXJzIG5vIGRvd25sb2FkIChtZWFzdXJlZCBvbiBhIHJ1bm5pbmcgc2VydmVyIGluXG4gKiAjNzk4KSwgYW5kIGBSZXBvcnRTZXJ2aWNlYCdzIG93biBleHBvcnQgZ2F0ZSBiZWxvbmdzIHRvIHRoZSBgcmVwb3J0c2BcbiAqIGNhcGFiaWxpdHkgYWJvdmUuIFVudGlsICM4MTcgdGhlIGd1YXJkIGNvdW50ZWQgcmVwb3J0cyBhbnl3YXksIGFuZFxuICogYGNybV9jYXNlYCBodW5nIG9mZiB0aGF0IGxlZyBhbG9uZTogdGhlIGdyYW50IHdhcyBsaXZlIGJ1dCByZWFjaGFibGUgb25seSBieVxuICogYGN1cmxgLCBhbmQgZGVsZXRpbmcgdGhlIGNhc2UgcmVwb3J0cyB3b3VsZCBoYXZlIG1hZGUgdGhlIGd1YXJkIGRlbWFuZCB0aGlzXG4gKiB1c2VmdWwgZ3JhbnQgYmUgZGVsZXRlZCB3aXRoIHRoZW0uICM4MTcgZ2F2ZSB0aGUgQ2FzZXMgbGlzdCB2aWV3IGl0cyBvd25cbiAqIGBleHBvcnRPcHRpb25zYCBhbmQgcmV0aXJlZCB0aGUgcmVwb3J0IGxlZywgc28gYSByZXBvcnQgb3ZlciBzb21lIGZ1dHVyZVxuICogZGF0YXNldCBubyBsb25nZXIgY29uanVyZXMgYSBncmFudCByZXF1aXJlbWVudCBvdXQgb2YgYSBwYWdlIHdpdGggbm9cbiAqIGRvd25sb2FkIGJ1dHRvbi5cbiAqXG4gKiBFeHBvcnQgaXMgUkVBRC1ERVJJVkVEIChgZXhwb3J0IFx1MjI4NiBsaXN0YCksIHNvIHRoZSBncmFudCBvcGVucyB0aGUgZG9vciBidXRcbiAqIGRvZXMgbm90IHdpZGVuIHRoZSByb3dzOiByZWNvcmQgc2NvcGUsIFJMUyBhbmQgc2hhcmluZyBzdGlsbCBhcHBseSBvbiB0b3AuIEFcbiAqIGBzYWxlc19yZXBgIGV4cG9ydGluZyBgY3JtX29wcG9ydHVuaXR5YCBnZXRzIHRoZWlyIG93biBib29rLCBub3QgdGhlIG9yZydzLlxuICpcbiAqIGBndWVzdF9wb3J0YWxgIGRlbGliZXJhdGVseSBjYXJyaWVzIG5vbmUuIFBlciBBRFItMDA5MCBEOSBhIHNldCBob2xkaW5nXG4gKiBgYWxsb3dFeHBvcnRgIGlzIGhpZ2gtcHJpdmlsZWdlIGFuZCBjYW5ub3QgYmUgYm91bmQgdG8gdGhlIGBldmVyeW9uZWAgb3JcbiAqIGBndWVzdGAgYW5jaG9ycyBhdCBhbGwgXHUyMDE0IGdyYW50aW5nIGl0IHRoZXJlIHdvdWxkIGJvdGggaGFuZCBhbm9ueW1vdXNcbiAqIHZpc2l0b3JzIGJ1bGsgdGFibGUgZWdyZXNzIGFuZCBtYWtlIHRoZSBzZXQgdW5iaW5kYWJsZS5cbiAqL1xuLyoqXG4gKiBcdTI1MDBcdTI1MDBcdTI1MDAgYGFsbG93VHJhbnNmZXJgIFx1MjAxNCB0aGUgb3duZXJzaGlwLXRyYW5zZmVyIGF4aXMgKCM1NDgpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICpcbiAqIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBub3RlOyB0aGUgcHJvZmlsZXMgcG9pbnQgaGVyZS5cbiAqXG4gKiBIb3RDUk0gaGFzIE9ORSBvd25lciBjb2x1bW46IHRoZSBwbGF0Zm9ybSdzIGBvd25lcl9pZGAsIGluamVjdGVkIGludG8gZXZlcnlcbiAqIGJ1c2luZXNzIG9iamVjdCBieSB0aGUgcmVnaXN0cnkgKGBhcHBseVN5c3RlbUZpZWxkc2ApIGFuZCBhdXRvLXN0YW1wZWQgdG8gdGhlXG4gKiBpbnNlcnRpbmcgdXNlci4gSXQgaXMgdGhlIGNvbHVtbiBPV0QsIHNoYXJpbmcgcnVsZXMsIG93bmVyLXNjb3BlIHdpZGVuaW5nIGFuZFxuICogdGhlIGBpc19wcml2YXRlYCByb3cgZmlsdGVyIGFsbCByZWFkIFx1MjAxNCBzbyB3aG9ldmVyIGNhbiB3cml0ZSBpdCBkZWNpZGVzIHdobyBtYXlcbiAqIHNlZSBhbmQgZWRpdCB0aGUgcm93LlxuICpcbiAqIFRoZSBhcHAgdXNlZCB0byBhdXRob3IgaXRzIG93biBgb3duZXJgIGxvb2t1cCBiZXNpZGUgaXQuIFJlYXNzaWduaW5nIHRoYXRcbiAqIGZpZWxkIG1vdmVkIHRoZSByZWNvcmQgaW4gZXZlcnkgbGlzdCBhbmQgcmVwb3J0IGFuZCBtb3ZlZCBOTyBhY2Nlc3MgYXQgYWxsLFxuICogYW5kIGl0IGRpZCBzbyBmb3IgYW55IHVzZXIgd2l0aCBwbGFpbiBlZGl0IHJpZ2h0cyBcdTIwMTQgYSB0cmFuc2ZlciB3aXRoIG5vbmUgb2ZcbiAqIHRoZSB0cmFuc2ZlciBzZW1hbnRpY3MuICM1NDggcmVtb3ZlZCBpdC5cbiAqXG4gKiBXaXRoIG9uZSBjb2x1bW4sIG93bmVyc2hpcCB3cml0ZXMgZ28gdGhyb3VnaCB0aGUgcGxhdGZvcm0ncyBnYXRlOiBhblxuICogaW5zZXJ0IHBsYW50aW5nIGEgcmVjb3JkIHVuZGVyIGFub3RoZXIgdXNlciwgb3IgYW4gdXBkYXRlIHJlYXNzaWduaW5nIC9cbiAqIGRpc293bmluZyBvbmUsIGlzIERFTklFRCB1bmxlc3MgdGhlIGNhbGxlciBob2xkcyBgYWxsb3dUcmFuc2ZlcmAgXHUyMDE0IGVuZm9yY2VkXG4gKiB0b2RheSB0aHJvdWdoIHRoZSBvcmRpbmFyeSBpbnNlcnQvdXBkYXRlIGRvb3IsIG5vdCBtZXJlbHkgZGVjbGFyZWRcbiAqIChgQG9iamVjdHN0YWNrL3NwZWNgIGBwZXJtaXNzaW9uLnpvZC50c2AsIHRoZSAjMzAwNCBvd25lcl9pZCBndWFyZCkuXG4gKiBgbW9kaWZ5QWxsUmVjb3Jkc2AgaW1wbGllcyBpdC4gVHdvIHdyaXRlcyBhcmUgZGVsaWJlcmF0ZWx5IE5PVCB0cmFuc2ZlcnMgYW5kXG4gKiBuZWVkIG5vIGdyYW50OiBhbiBpbnNlcnQgbGVhdmluZyBgb3duZXJfaWRgIGVtcHR5IChhdXRvLXN0YW1wZWQgdG8gdGhlXG4gKiBjYWxsZXIpIGFuZCBhIGZvcm0gc2F2ZSBlY2hvaW5nIHRoZSB1bmNoYW5nZWQgb3duZXIgYmFjay5cbiAqXG4gKiBUaGUgcnVsZSB0aGUgZ3JhbnRzIGJlbG93IGZvbGxvdywgcGlubmVkIGJ5XG4gKiBgdGVzdC9hdXRob3JpemF0aW9uLWNvdmVyYWdlLnRlc3QudHNgOlxuICpcbiAqICAgYGFsbG93VHJhbnNmZXJgIGlzIGdyYW50ZWQgSUZGIHRoZSBzZXQgYWxyZWFkeSBob2xkcyBgYWxsb3dFZGl0YCBvbiB0aGF0XG4gKiAgIG9iamVjdCwgYW5kIG9ubHkgdG8gYHN5c3RlbV9hZG1pbmAgKGV2ZXJ5IGJ1c2luZXNzIG9iamVjdCkgYW5kXG4gKiAgIGBzYWxlc19tYW5hZ2VyYCAoZXhhY3RseSB0aGUgb2JqZWN0cyBpdCBob2xkcyBgbW9kaWZ5QWxsUmVjb3Jkc2Agb24gXHUyMDE0IHRoZVxuICogICBzYWxlcyBib29rIGl0IG93bnMgdGhlIG51bWJlciBmb3IpLlxuICpcbiAqIE9uIHRob3NlIG9iamVjdHMgYG1vZGlmeUFsbFJlY29yZHNgIGFscmVhZHkgaW1wbGllcyB0aGUgYml0LCBzbyBhdXRob3JpbmcgaXRcbiAqIGdyYW50cyBub3RoaW5nIG5ldy4gSXQgaXMgYXV0aG9yZWQgYW55d2F5LCBmb3IgdGhlIHNhbWUgcmVhc29uIGBhbGxvd0V4cG9ydGBcbiAqIGlzOiB0aGUgY2FwYWJpbGl0eSBhIHBlcnNvbmEgaXMgbWVhbnQgdG8gaGF2ZSBzaG91bGQgYmUgcmVhZGFibGUgaW4gdGhlXG4gKiBwcm9maWxlLCBhbmQgaXQgbXVzdCBzdXJ2aXZlIGEgZnV0dXJlIG5hcnJvd2luZyBvZiBgbW9kaWZ5QWxsUmVjb3Jkc2AgcmF0aGVyXG4gKiB0aGFuIGRpc2FwcGVhcmluZyB3aXRoIGl0LiBSZXBzIGFuZCBzZXJ2aWNlIGFnZW50cyBob2xkIG5vIHRyYW5zZmVyIGdyYW50IFx1MjAxNFxuICogZm9yIHRoZW0gb3duZXJzaGlwIGlzIGFzc2lnbmVkLCBuZXZlciB0YWtlbi5cbiAqL1xuXG5leHBvcnQgeyBHdWVzdFBvcnRhbFByb2ZpbGUgfSBmcm9tICcuL2d1ZXN0LXBvcnRhbC5wcm9maWxlJztcbmV4cG9ydCB7IE1hcmtldGluZ1VzZXJQcm9maWxlIH0gZnJvbSAnLi9tYXJrZXRpbmctdXNlci5wcm9maWxlJztcbmV4cG9ydCB7IFNhbGVzTWFuYWdlclByb2ZpbGUgfSBmcm9tICcuL3NhbGVzLW1hbmFnZXIucHJvZmlsZSc7XG5leHBvcnQgeyBTYWxlc1JlcFByb2ZpbGUgfSBmcm9tICcuL3NhbGVzLXJlcC5wcm9maWxlJztcbmV4cG9ydCB7IFNlcnZpY2VBZ2VudFByb2ZpbGUgfSBmcm9tICcuL3NlcnZpY2UtYWdlbnQucHJvZmlsZSc7XG5leHBvcnQgeyBTZXJ2aWNlTWFuYWdlclByb2ZpbGUgfSBmcm9tICcuL3NlcnZpY2UtYWdlbnQucHJvZmlsZSc7XG5leHBvcnQgeyBTeXN0ZW1BZG1pblByb2ZpbGUgfSBmcm9tICcuL3N5c3RlbS1hZG1pbi5wcm9maWxlJztcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzL2d1ZXN0LXBvcnRhbC5wcm9maWxlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzL2d1ZXN0LXBvcnRhbC5wcm9maWxlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIEd1ZXN0IFBvcnRhbCBQcm9maWxlXG4gKlxuICogUGVybWlzc2lvbiBzZXQgYXBwbGllZCB0byBhbm9ueW1vdXMgKHVuYXV0aGVudGljYXRlZCkgdmlzaXRvcnMgd2hvIHN1Ym1pdFxuICogdGhlIHB1YmxpYyBXZWItdG8tTGVhZCBhbmQgV2ViLXRvLUNhc2UgZm9ybXMuXG4gKlxuICogSVJPTi1DTEFEIFJVTEU6IGd1ZXN0cyBtdXN0IE5FVkVSIGJlIGFibGUgdG8gcmVhZCBleGlzdGluZyBDUk0gZGF0YS5cbiAqIFRoZSBvbmx5IHRoaW5nIHRoZXkgY2FuIGRvIGlzIElOU0VSVCBhIG5ldyBgY3JtX2xlYWRgIG9yIGBjcm1fY2FzZWAgcm93IHRocm91Z2hcbiAqIHRoZSBmb3JtIHZpZXdzIHdob3NlIGBzaGFyaW5nLmFsbG93QW5vbnltb3VzID0gdHJ1ZWAuXG4gKlxuICogQW55IG5ldyBvYmplY3QgYWRkZWQgdG8gdGhlIENSTSBzdGFjayBpcyBpbXBsaWNpdGx5IERFTklFRCBmb3IgZ3Vlc3RzIFx1MjAxNFxuICogcHJvZmlsZSBwZXJtaXNzaW9ucyBhcmUgZXhwbGljaXQtYWxsb3cgb25seS5cbiAqXG4gKiBUaGF0IGluY2x1ZGVzIGV2ZXJ5IG9iamVjdCBncmFudGVkIHRvIGludGVybmFsIHByb2ZpbGVzIGJ5ICM0ODguIEluXG4gKiBwYXJ0aWN1bGFyIGBjcm1fa25vd2xlZGdlX2FydGljbGVgIHN0YXlzIGRlbmllZCBldmVuIHRob3VnaCBpdHMgYGF1ZGllbmNlYFxuICogZmllbGQgbWFya3Mgc29tZSBhcnRpY2xlcyBwdWJsaWM6IGEgY3VzdG9tZXItZmFjaW5nIGFydGljbGUgc3VyZmFjZSB3b3VsZCBiZVxuICogc2VydmVkIGJ5IGEgcG9ydGFsIHZpZXcgd2l0aCBgc2hhcmluZy5hbGxvd0Fub255bW91c2AsIG5ldmVyIGJ5IHdpZGVuaW5nIHRoZVxuICogZ3Vlc3Qgc2V0IHRvIHJlYWQgYSBDUk0gb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgR3Vlc3RQb3J0YWxQcm9maWxlID0ge1xuICBuYW1lOiAnZ3Vlc3RfcG9ydGFsJyxcbiAgbGFiZWw6ICdHdWVzdCAoUHVibGljIEZvcm1zKScsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdBbm9ueW1vdXMgdmlzaXRvcnMgc3VibWl0dGluZyBwdWJsaWMgV2ViLXRvLUxlYWQgLyBXZWItdG8tQ2FzZSBmb3Jtcy4gJyArXG4gICAgJ0lOU0VSVC1vbmx5IG9uIGxlYWQgYW5kIGNhc2U7IG5vIHJlYWQvZWRpdC9kZWxldGUgb24gYW55IG9iamVjdC4nLFxuICAvLyBObyBgYWxsb3dFeHBvcnRgIGFueXdoZXJlIGJlbG93LCBkZWxpYmVyYXRlbHk6IHRoaXMgc2V0IGlzIGJvdW5kIHRvIHRoZVxuICAvLyBgZ3Vlc3RgIGFuY2hvciwgYW5kIEFEUi0wMDkwIEQ5IGNsYXNzZXMgYGFsbG93RXhwb3J0YCBhcyBhIGhpZ2gtcHJpdmlsZWdlXG4gIC8vIGJpdCBubyBhbmNob3IgbWF5IGNvbmZlciBcdTIwMTQgdGhlIHNldCB3b3VsZCBzdG9wIGJpbmRpbmcgYXQgYWxsLCBvbiB0b3Agb2ZcbiAgLy8gaGFuZGluZyBhbm9ueW1vdXMgdmlzaXRvcnMgYnVsayB0YWJsZSBlZ3Jlc3MuIFNlZSBgc3JjL3NhbGVzL3Byb2ZpbGVzL2luZGV4LnRzYC5cbiAgb2JqZWN0czoge1xuICAgIGNybV9sZWFkOiB7XG4gICAgICBhbGxvd0NyZWF0ZTogdHJ1ZSxcbiAgICAgIGFsbG93UmVhZDogZmFsc2UsXG4gICAgICBhbGxvd0VkaXQ6IGZhbHNlLFxuICAgICAgYWxsb3dEZWxldGU6IGZhbHNlLFxuICAgICAgdmlld0FsbFJlY29yZHM6IGZhbHNlLFxuICAgICAgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UsXG4gICAgfSxcbiAgICBjcm1fY2FzZToge1xuICAgICAgYWxsb3dDcmVhdGU6IHRydWUsXG4gICAgICBhbGxvd1JlYWQ6IGZhbHNlLFxuICAgICAgYWxsb3dFZGl0OiBmYWxzZSxcbiAgICAgIGFsbG93RGVsZXRlOiBmYWxzZSxcbiAgICAgIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSxcbiAgICAgIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcHJvZmlsZXMvbWFya2V0aW5nLXVzZXIucHJvZmlsZS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlcy9tYXJrZXRpbmctdXNlci5wcm9maWxlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5leHBvcnQgY29uc3QgTWFya2V0aW5nVXNlclByb2ZpbGUgPSB7XG4gIG5hbWU6ICdtYXJrZXRpbmdfdXNlcicsXG4gIGxhYmVsOiAnTWFya2V0aW5nIFVzZXInLFxuICBvYmplY3RzOiB7XG4gICAgLy8gYGFsbG93RXhwb3J0YCB3aGVyZSBhbiBleHBvcnQgc3VyZmFjZSBleGlzdHMgXHUyMDE0IGNhbm9uaWNhbCBub3RlIGluXG4gICAgLy8gYHNyYy9zYWxlcy9wcm9maWxlcy9pbmRleC50c2AuIExlYWQgYW5kIGNvbnRhY3QgbGlzdCBleHBvcnRzIGFyZSBtYXJrZXRpbmcnc1xuICAgIC8vIGNvcmUgdGFyZ2V0aW5nIHdvcmtmbG93OyBhY2NvdW50L29wcG9ydHVuaXR5IGJhY2sgdGhlIGNhbXBhaWduLVJPSVxuICAgIC8vIHJlcG9ydHMuIE5vIGBjcm1fY2FzZWAgZ3JhbnQgaGVyZSwgc28gbm8gZXhwb3J0IGJpdCBmb3IgaXQgZWl0aGVyLlxuICAgIGNybV9sZWFkOiAgICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IHRydWUsICBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSwgYWxsb3dFeHBvcnQ6IHRydWUgfSxcbiAgICBjcm1fYWNjb3VudDogICAgIHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX2NvbnRhY3Q6ICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCAgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIGNybV9jYW1wYWlnbjogICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IHRydWUsICBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIC8vIE9yZy13aWRlIHJlYWQ6IG1hcmtldGluZyBhdHRyaWJ1dGVzIGNhbXBhaWduIFx1MjE5MiBwaXBlbGluZSBST0ksIHdoaWNoIG5lZWRzXG4gICAgLy8gZXZlcnkgb3Bwb3J0dW5pdHksIG5vdCBqdXN0IHNlbGYtb3duZWQuIHZpZXdBbGxSZWNvcmRzIHdhcyBmYWxzZSBoZXJlXG4gICAgLy8gd2hpbGUgZXZlcnkgb3RoZXIgb2JqZWN0IG9uIHRoaXMgc2V0IGlzIHRydWUgXHUyMDE0IGFuIG92ZXJzaWdodCB0aGF0IGhpZCBhbGxcbiAgICAvLyBwaXBlbGluZSBmcm9tIG1hcmtldGluZyAoYW5kIHRyaXBwZWQgc2VjdXJpdHktcHJpdmF0ZS1uby1yZWFkc2NvcGUpLlxuICAgIGNybV9vcHBvcnR1bml0eTogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogZmFsc2UsIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IHRydWUsICBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSwgYWxsb3dFeHBvcnQ6IHRydWUgfSxcbiAgICAvLyBDYW1wYWlnbiBtZW1iZXJzaGlwIGlzIFRISVMgcHJvZmlsZSdzIGNvcmUgd3JpdGUgc3VyZmFjZTogdGhlXG4gICAgLy8gXCJBZGQgdG8gQ2FtcGFpZ25cIiBhY3Rpb24gKGBzcmMvc2FsZXMvYWN0aW9ucy9sZWFkLmFjdGlvbnMudHNgKSBpbnNlcnRzXG4gICAgLy8gYGNybV9jYW1wYWlnbl9tZW1iZXJgIHJvd3MsIGFuZCBiZWZvcmUgIzQ4OCBubyBwZXJtaXNzaW9uIHNldCBncmFudGVkIHRoZVxuICAgIC8vIG9iamVjdCBcdTIwMTQgdGhlIGFjdGlvbiBmYWlsZWQgZm9yIHRoZSBvbmx5IHBlcnNvbmEgbWVhbnQgdG8gcnVuIGl0LiBSb3dzXG4gICAgLy8gZGVyaXZlIGZyb20gdGhlIGNhbXBhaWduIChjb250cm9sbGVkX2J5X3BhcmVudCksIHNvIHRoZXJlIGlzIG5vIHJlY29yZFxuICAgIC8vIHNjb3BlIHRvIGF1dGhvciBcdTIwMTQgYW5kIGFzIG9mIDE3LjAuMC1yYy40IHRoYXQgZGVyaXZhdGlvbiBkb2VzIGZvbGxvdyB0aGVcbiAgICAvLyBjYW1wYWlnbiBncmFudDogTUVBU1VSRUQgYW5kIHBpbm5lZCBieVxuICAgIC8vIGB0ZXN0L3BhcmVudC1kZXJpdmVkLXJlYWNoLnRlc3QudHNgLCBtYXN0ZXIgYWNjZXNzaWJpbGl0eSByZXNvbHZlcyB0aHJvdWdoXG4gICAgLy8gdGhlIHNhbWUgcGF0aHMgYSBkaXJlY3QgcmVhZCBvZiB0aGUgY2FtcGFpZ24gdGFrZXMsIG93bmVyc2hpcCBhbmRcbiAgICAvLyBgc3lzX3JlY29yZF9zaGFyZWAgZ3JhbnRzIGluY2x1ZGVkLiBGb3IgVEhJUyBwcm9maWxlIHRoZSBkZWx0YSBpcyBzbWFsbCBcdTIwMTRcbiAgICAvLyBgY3JtX2NhbXBhaWduYCBpcyBgcHVibGljX3JlYWRgIGFuZCB0aGlzIHNldCBob2xkcyBvcmctd2lkZSBjYW1wYWlnbiByZWFkLFxuICAgIC8vIHNvIHRoZSByb3dzIGFyZSB0aGUgc2FtZSBlaXRoZXIgd2F5IFx1MjAxNCBidXQgdGhlIGdyYW50IGlzIG5vdyBzY29wZSB0aGF0XG4gICAgLy8gZm9sbG93cyB0aGUgY2FtcGFpZ25zIGFib3ZlLCBub3Qgb3JnLXdpZGUgcmVhZCBpbiBmYWN0IGFzIGl0IHdhcyB0aHJvdWdoXG4gICAgLy8gMTcuMC4wLXJjLjMgKG9iamVjdHN0YWNrLWFpL29iamVjdHN0YWNrIzUzODYsICM2OTQpLlxuICAgIC8vIERlbGV0aW5nIG1lbWJlcnNoaXAgaGlzdG9yeSBzdGF5cyBhIG1hbmFnZXIvYWRtaW4gcHJpdmlsZWdlLCBtYXRjaGluZ1xuICAgIC8vIGV2ZXJ5IG90aGVyIG9iamVjdCBoZXJlLlxuICAgIGNybV9jYW1wYWlnbl9tZW1iZXI6IHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICAvLyBSZWFkLW9ubHkgcmVmZXJlbmNlOiBrbm93bGVkZ2UgYXJ0aWNsZXMgZm9yIGNhbXBhaWduIGNvcHlcbiAgICAvLyAocHVibGljX3JlYWQgY2F0YWxvZykuXG4gICAgLy8gUmVhZHMgdGhlIEtCIGFuZCBtYXkgcmF0ZSBpdDsgY2Fubm90IGF1dGhvciBhcnRpY2xlcyAoIzYwMSkuXG4gICAgY3JtX2FydGljbGVfZmVlZGJhY2s6IHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICAvLyBUaGUgcmVjb3JkIEF0dGFjaG1lbnRzIHBhbmVsLCBSRUFEIG9ubHk6IGNhbm9uaWNhbCBub3RlIG9uIGBlbmFibGUuZmlsZXNgXG4gICAgLy8gaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYCAoIzIwMjkpLiBXaGljaCBhdHRhY2htZW50cyBpdCBsaXN0c1xuICAgIC8vIGRlcml2ZXMgZnJvbSB0aGUgcGFyZW50IHJlY29yZDsgdXBsb2FkIGFuZCBkZWxldGUgd2FpdCB1cHN0cmVhbS5cbiAgICBzeXNfYXR0YWNobWVudDogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gVGhlIHJlY29yZCBEaXNjdXNzaW9uIHBhbmVsLCBjb21tZW50cyBhbmQgYWN0aXZpdHk6IGNhbm9uaWNhbCBub3RlIG9uXG4gICAgLy8gYGVuYWJsZS5mZWVkc2AgaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYCAoIzIwMjkpLiBXaGljaCB0aHJlYWRzIGl0XG4gICAgLy8gcmVhY2hlcyBkZXJpdmVzIGZyb20gdGhlIHBhcmVudCByZWNvcmQ7IGRlbGV0aW5nIGEgY29tbWVudCB3YWl0cyB1cHN0cmVhbS5cbiAgICBzeXNfY29tbWVudDogIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIHN5c19hY3Rpdml0eTogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gIH0sXG4gIGZpZWxkczoge1xuICAgIC8vIE1hcmtldGluZyByZWFkcyBwaXBlbGluZSBmb3IgY2FtcGFpZ24gUk9JIGJ1dCBuZXZlciBwcmljZXMgYSBkZWFsLCBhbmRcbiAgICAvLyBhY2NvdW50IGhlYWx0aCBpcyB0aGUgcmVuZXdhbCB0ZWFtJ3MgY2FsbCBcdTIwMTQgcmVhZCwgbmV2ZXIgd3JpdGUgKCM0ODgpLlxuICAgICdjcm1fb3Bwb3J0dW5pdHkuYW1vdW50JzogICB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2UgfSxcbiAgICAnY3JtX2FjY291bnQuaGVhbHRoX3Njb3JlJzogeyByZWFkYWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlIH0sXG4gIH0sXG4gIC8vIFRoZSBzYW1lIHByaXZhdGUtZGVhbCByb3cgZmlsdGVyIHRoZSBzYWxlc19tYW5hZ2VyIHNldCBjYXJyaWVzOiB0aGlzXG4gIC8vIHByb2ZpbGUgYWxzbyBob2xkcyBvcmctd2lkZSBvcHBvcnR1bml0eSByZWFkLCBzbyBpdCBpcyBvbmUgb2YgdGhlIHJlYWRlcnNcbiAgLy8gYGNybV9vcHBvcnR1bml0eS5pc19wcml2YXRlYCBoYXMgdG8gaG9sZCBiYWNrLiBTZWUgc2FsZXMtbWFuYWdlci5wcm9maWxlLnRzXG4gIC8vIGZvciB0aGUgZnVsbCByYXRpb25hbGUuXG4gIHJvd0xldmVsU2VjdXJpdHk6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnb3Bwb3J0dW5pdHlfcHJpdmF0ZV9vd25lcl9vbmx5X21hcmtldGluZycsXG4gICAgICAvLyBBIGRlYWwgZmxhZ2dlZCBQcml2YXRlIGlzIHZpc2libGUgb25seSB0byBpdHMgb3duZXIsIGV2ZW4gdG8gaG9sZGVycyBvZlxuICAgICAgLy8gb3JnLXdpZGUgb3Bwb3J0dW5pdHkgcmVhZC4gKGByb3dMZXZlbFNlY3VyaXR5W10ubGFiZWxgIC8gYGRlc2NyaXB0aW9uYFxuICAgICAgLy8gYXJlIGRpc3BsYXkgY29weSBcdTIwMTQgdGhlIDE3LjcuMCBsaXZlbmVzcyBsZWRnZXIgbWFya3MgYm90aCBsaXZlOiB0aGVcbiAgICAgIC8vIHBlcm1pc3Npb24gZWRpdG9yIGRyYXdzIHRoZW0gb24gdGhlIHBvbGljeSBjYXJkLiBUaGlzIHBvbGljeSBhdXRob3JzXG4gICAgICAvLyBuZWl0aGVyLCBzbyBpdHMgaW50ZW50IGxpdmVzIGluIHRoaXMgY29tbWVudC4pXG4gICAgICBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgb3BlcmF0aW9uOiAnc2VsZWN0JyBhcyBjb25zdCxcbiAgICAgIHVzaW5nOiAnaXNfcHJpdmF0ZSA9PSBmYWxzZSB8fCBvd25lcl9pZCA9PSBjdXJyZW50X3VzZXIuaWQnLFxuICAgIH0sXG4gICAgLy8gVGhlIHBsYXRmb3JtJ3MgYG1lbWJlcl9kZWZhdWx0YCBzZXQgY2FycmllcyBhIHdpbGRjYXJkIG93bmVyLW9ubHktd3JpdGVzXG4gICAgLy8gcG9saWN5IChgY3JlYXRlZF9ieSA9PSBjdXJyZW50X3VzZXIuaWRgIG9uIHVwZGF0ZSksIGFuZCBSTFMgcG9saWNpZXMgYXJlXG4gICAgLy8gT1ItY29tYmluZWQgXHUyMDE0IHNvIHdpdGhvdXQgYSBwb2xpY3kgb2YgaXRzIG93biwgdGhpcyBzZXQncyBhbGxvd0VkaXQgb25cbiAgICAvLyBjYW1wYWlnbnMgb25seSByZWFjaGVzIGNhbXBhaWducyB0aGUgdXNlciBwZXJzb25hbGx5IGNyZWF0ZWQuIFRoYXQgYWxzb1xuICAgIC8vIHNpbGVudGx5IGJyb2tlIFwiQWRkIHRvIENhbXBhaWduXCI6IGVucm9sbGluZyBhIG1lbWJlciBpcyBhIHdyaXRlIERFUklWRURcbiAgICAvLyBmcm9tIHRoZSBjYW1wYWlnbiAoY29udHJvbGxlZF9ieV9wYXJlbnQpLCBzbyBpdCByZXF1aXJlcyBjYW1wYWlnbiBlZGl0IGF0XG4gICAgLy8gdGhlIHJvdyBsZXZlbC4gVGhpcyBpcyB0aGUgb25lIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgQURSLTAwNTUgZGVyaXZhdGlvblxuICAgIC8vIHJlYWxseSBkb2VzIG5hcnJvdzogYSBtYXN0ZXIgUkxTIHBvbGljeSBpcyBleGFjdGx5IHdoYXQgaXQgZm9sZHMgaW4sIHdoaWxlXG4gICAgLy8gb3duZXJzaGlwIGFuZCBgc3lzX3JlY29yZF9zaGFyZWAgZ3JhbnRzIGFyZSBub3QgKHdoaWNoIGlzIHdoeSB0aGUgUkVBRFxuICAgIC8vIHNpZGUgb2YgdGhlc2UgbWVtYmVyIHJvd3MgaXMgb3JnLXdpZGUgXHUyMDE0IHNlZSB0aGUgYGNybV9jYW1wYWlnbl9tZW1iZXJgXG4gICAgLy8gZ3JhbnQgYWJvdmUgYW5kIG9iamVjdHN0YWNrLWFpL29iamVjdHN0YWNrIzUzODYsICM2OTQpLiBUaGlzIHBvbGljeSB3aWRlbnNcbiAgICAvLyBjYW1wYWlnbiB1cGRhdGVzIHRvIGV2ZXJ5IGhvbGRlciBvZiB0aGUgc2V0IFx1MjAxNCBleGFjdGx5IHdoYXQgdGhlIG9iamVjdFxuICAgIC8vIGdyYW50IGFib3ZlIGFscmVhZHkgZGVjbGFyZXMuIGBpZCAhPSBudWxsYFxuICAgIC8vIGlzIHRoZSBwdXNoZG93bi1zYWZlIFwiYWxsIHJvd3NcIiBwcmVkaWNhdGUgKHZlcmlmaWVkOiBjb21waWxlcyB0b1xuICAgIC8vIGB7aWQ6IHskbnVsbDogZmFsc2V9fWApLlxuICAgIHtcbiAgICAgIG5hbWU6ICdtYXJrZXRpbmdfY2FtcGFpZ25fdXBkYXRlcycsXG4gICAgICAvLyBNYXJrZXRpbmcgdXNlcnMgZWRpdCBhbnkgY2FtcGFpZ24gKGFuZCB0aGVyZWJ5IGVucm9sIG1lbWJlcnMgaW50byBpdCksXG4gICAgICAvLyBub3Qgb25seSBjYW1wYWlnbnMgdGhleSBjcmVhdGVkLlxuICAgICAgb2JqZWN0OiAnY3JtX2NhbXBhaWduJyxcbiAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScgYXMgY29uc3QsXG4gICAgICB1c2luZzogJ2lkICE9IG51bGwnLFxuICAgIH0sXG4gICAgLy8gU2FtZSB3aWRlbmluZyBmb3IgdGhlIG1lbWJlciByb3dzIHRoZW1zZWx2ZXM6IHJlc3BvbnNlIHRyYWNraW5nIG1lYW5zXG4gICAgLy8gdXBkYXRpbmcgcm93cyB0aGUgZW5yb2xsbWVudCBmbG93IChzeXN0ZW0gY29udGV4dCkgY3JlYXRlZCwgd2hpY2ggdGhlXG4gICAgLy8gZGVmYXVsdCBvd25lci1vbmx5LXdyaXRlcyBwb2xpY3kgd291bGQgb3RoZXJ3aXNlIGRlbnkuXG4gICAge1xuICAgICAgbmFtZTogJ21hcmtldGluZ19jYW1wYWlnbl9tZW1iZXJfdXBkYXRlcycsXG4gICAgICAvLyBNYXJrZXRpbmcgdXNlcnMgdXBkYXRlIG1lbWJlciByZXNwb25zZSBzdGF0ZSBvbiByb3dzIHRoZXkgZGlkIG5vdFxuICAgICAgLy8gcGVyc29uYWxseSBjcmVhdGUuXG4gICAgICBvYmplY3Q6ICdjcm1fY2FtcGFpZ25fbWVtYmVyJyxcbiAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScgYXMgY29uc3QsXG4gICAgICB1c2luZzogJ2lkICE9IG51bGwnLFxuICAgIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcHJvZmlsZXMvc2FsZXMtbWFuYWdlci5wcm9maWxlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzL3NhbGVzLW1hbmFnZXIucHJvZmlsZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBTYWxlcyBNYW5hZ2VyIFByb2ZpbGVcbiAqXG4gKiBPcmctd2lkZSBvbiB0aGUgc2FsZXMgc3RhY2s6IGEgbWFuYWdlciBvd25zIHRoZSBudW1iZXIsIHNvIHRoZXkgcmVhZCBhbmRcbiAqIG1vZGlmeSBldmVyeSByZXAncyByZWNvcmQgcmF0aGVyIHRoYW4gb25seSB0aGVpciBvd24uXG4gKi9cbmV4cG9ydCBjb25zdCBTYWxlc01hbmFnZXJQcm9maWxlID0ge1xuICBuYW1lOiAnc2FsZXNfbWFuYWdlcicsXG4gIGxhYmVsOiAnU2FsZXMgTWFuYWdlcicsXG4gIG9iamVjdHM6IHtcbiAgICAvLyBgYWxsb3dUcmFuc2ZlcmAgb24gZXhhY3RseSB0aGUgb2JqZWN0cyB0aGlzIHNldCBob2xkcyBgbW9kaWZ5QWxsUmVjb3Jkc2BcbiAgICAvLyBvbiBcdTIwMTQgdGhlIHNhbGVzIGJvb2sgYSBtYW5hZ2VyIHJlYXNzaWducy4gQ2Fub25pY2FsIG5vdGUgaW5cbiAgICAvLyBgc3JjL3NhbGVzL3Byb2ZpbGVzL2luZGV4LnRzYC5cbiAgICAvLyBgYWxsb3dFeHBvcnRgIHdoZXJlIGFuIGV4cG9ydCBzdXJmYWNlIGV4aXN0cyBcdTIwMTQgY2Fub25pY2FsIG5vdGUgaW5cbiAgICAvLyBgc3JjL3NhbGVzL3Byb2ZpbGVzL2luZGV4LnRzYC4gQSBtYW5hZ2VyIG93bnMgdGhlIG51bWJlciwgc28gdGhlIHBpcGVsaW5lIGFuZFxuICAgIC8vIGJvb2sgZXhwb3J0cyB0aGF0IGZlZWQgb2ZmbGluZSBmb3JlY2FzdGluZyBhcmUgcGFydCBvZiB0aGUgam9iLlxuICAgIGNybV9sZWFkOiAgICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IHRydWUsICB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX2FjY291bnQ6ICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogdHJ1ZSwgIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSwgYWxsb3dFeHBvcnQ6IHRydWUgfSxcbiAgICBjcm1fY29udGFjdDogICAgIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiB0cnVlLCAgdmlld0FsbFJlY29yZHM6IHRydWUsICBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlLCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIGNybV9vcHBvcnR1bml0eTogeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IHRydWUsICB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX3F1b3RlOiAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogdHJ1ZSwgIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIC8vIE5vIHdyaXRlU2NvcGU6IGBjcm1fY29udHJhY3RgIGlzIGBjb250cm9sbGVkX2J5X3BhcmVudGAgdW5kZXJcbiAgICAvLyBgY3JtX2FjY291bnRgICgjNTQ5KSwgc28gYSBzY29wZSBoZXJlIHdvdWxkIGJlIGluZXJ0IFx1MjAxNCB0aGUgd3JpdGUgZ2F0ZVxuICAgIC8vIGFza3MgZm9yIEVESVQgb24gdGhlIGFjY291bnQgaW5zdGVhZCwgd2hpY2ggdGhpcyBzZXQgaG9sZHMgb3JnLXdpZGVcbiAgICAvLyAoYG1vZGlmeUFsbFJlY29yZHNgIGFib3ZlKS4gVGhhdCByZXRpcmVzIHRoZSAjODgwIGdhcCBvbiBCT1RIIGVkaXRpb25zOlxuICAgIC8vIHRoZSBjb250cmFjdCBhbiBhY2NlcHRlZCBxdW90ZSBkcmFmdHMgaGFuZ3MgdW5kZXIgdGhlIHJlcCwgYW5kIHRoZVxuICAgIC8vIG1hbmFnZXIgZWRpdHMgaXQgYmVjYXVzZSB0aGV5IGNhbiBlZGl0IGl0cyBhY2NvdW50LCBub3QgYmVjYXVzZSBvZiBhXG4gICAgLy8gaGllcmFyY2h5IGRlcHRoLiBgb3duX2FuZF9yZXBvcnRzYCB3YXMgdGhlIGFwcCdzIG9ubHkgYXV0aG9yZWQgaGllcmFyY2h5XG4gICAgLy8gc2NvcGU7IGByZXF1aXJlczogWydoaWVyYXJjaHktc2VjdXJpdHknXWAgc3RheXMgZGVjbGFyZWQgKCMxMzc4IHJ1bGluZykuXG4gICAgLy8gYGFsbG93RGVsZXRlOiBmYWxzZWAgbXVzdCBrZWVwIGhvbGRpbmc7IGBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZWAga2VlcHNcbiAgICAvLyB0aGlzIG9mZiB0aGUgc3VwZXItdXNlciBieXBhc3MuIGB0ZXN0L2NvbnRyYWN0LXdyaXRlLWRlcHRoLnRlc3QudHNgLlxuICAgIGNybV9jb250cmFjdDogICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgY3JtX3Byb2R1Y3Q6ICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBjcm1fY2FtcGFpZ246ICAgIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IHRydWUsICBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIGNybV9jYXNlOiAgICAgICAgeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIGNybV90YXNrOiAgICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IHRydWUsICB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUgfSxcbiAgICAvLyBBIG1hbmFnZXIgY29hY2hlcyBvbiBhY3Rpdml0eSwgc28gdGhpcyBpcyBvcmctd2lkZSByZWFkIEFORCB3cml0ZSBvbiBhXG4gICAgLy8gcHJpdmF0ZSBvYmplY3QgXHUyMDE0IHRoZSBzYW1lIHNoYXBlIHRoZWlyIGBjcm1fdGFza2AgZ3JhbnQgYWxyZWFkeSBoYXMuXG4gICAgLy8gYGNybV9ldmVudF9hdHRlbmRlZWAgaXMgYGNvbnRyb2xsZWRfYnlfcGFyZW50YCAoQURSLTAwNTUpOiBubyBzY29wZSB0b1xuICAgIC8vIGF1dGhvciBcdTIwMTQgb25lIHdvdWxkIGJlIGluZXJ0IG1ldGFkYXRhLiBJdCBuYXJyb3dzIHRvIHRoZSBldmVudHMgdGhpcyBzZXRcbiAgICAvLyBjYW4gcmVhZCwgd2hpY2ggaXMgZXZlcnkgZXZlbnQ6IGB2aWV3QWxsUmVjb3Jkc2Agb24gYGNybV9ldmVudGAgYWJvdmUgcHV0c1xuICAgIC8vIHRoZSB3aG9sZSBhY3Rpdml0eSBzdGFjayBpbiByZWFjaCwgc28gdGhlIGRlcml2ZWQgYXR0ZW5kZWUgcm93cyBmb2xsb3cuXG4gICAgLy8gTUVBU1VSRUQgb24gMTcuMC4wLXJjLjQgYW5kIHBpbm5lZCBieSBgdGVzdC9wYXJlbnQtZGVyaXZlZC1yZWFjaC50ZXN0LnRzYCxcbiAgICAvLyBtYXN0ZXIgYWNjZXNzaWJpbGl0eSByZXNvbHZlcyB0aHJvdWdoIHRoZSBzYW1lIHBhdGhzIGEgZGlyZWN0IHJlYWQgb2YgdGhlXG4gICAgLy8gZXZlbnQgdGFrZXMgXHUyMDE0IG93bmVyc2hpcCBhbmQgYHN5c19yZWNvcmRfc2hhcmVgIGdyYW50cyBmb2xkZWQgaW4sIG5vdCB0aGVcbiAgICAvLyBtYXN0ZXIncyByb3ctbGV2ZWwgc2VjdXJpdHkgcG9saWNpZXMgYWxvbmUuIFVudGlsIDE3LjAuMC1yYy4zIHRoaXMgZ3JhbnRcbiAgICAvLyB3YXMgb3JnLXdpZGUgaW4gRkFDVCByYXRoZXIgdGhhbiBieSBkZXJpdmF0aW9uLCB3aGF0ZXZlciB0aGUgZXZlbnQgZ3JhbnRzXG4gICAgLy8gc2FpZCAoIzY5NCk7IG9iamVjdHN0YWNrLWFpL29iamVjdHN0YWNrIzUzODYgZml4ZWQgdGhhdCB1cHN0cmVhbSBhbmQgaXRcbiAgICAvLyBzaGlwcGVkIGluIHJjLjQuIFNhbWUgbm90ZSBpbiBgc2FsZXMtcmVwLnByb2ZpbGUudHNgLlxuICAgIGNybV9ldmVudDogICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IHRydWUsICB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUgfSxcbiAgICBjcm1fZXZlbnRfYXR0ZW5kZWU6IHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogdHJ1ZSwgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIC8vIFRoZSBmb3JlY2FzdCBJUyB0aGUgbWFuYWdlcidzIGpvYjogdGhleSByZWFkIGV2ZXJ5IHJlcCdzIHNuYXBzaG90IGFuZFxuICAgIC8vIGFkanVzdCB0aGUgY29tbWl0dGVkIG51bWJlciwgc28gdGhpcyBpcyBvcmctd2lkZSByZWFkIEFORCB3cml0ZSBvbiBhXG4gICAgLy8gcHJpdmF0ZSBvYmplY3QgKCM0ODggXHUyMDE0IHRoZSBvYmplY3QgaGFkIG5vIGdyYW50IGF0IGFsbCkuXG4gICAgY3JtX2ZvcmVjYXN0OiAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIC8vIEtub3dsZWRnZSBpcyBzZXJ2aWNlLWF1dGhvcmVkOyBzYWxlcyByZWFkcyBpdCAocHVibGljX3JlYWQgT1dEKS5cbiAgICAvLyBSZWFkcyB0aGUgS0IgYW5kIG1heSByYXRlIGl0OyBjYW5ub3QgYXV0aG9yIGFydGljbGVzICgjNjAxKS5cbiAgICBjcm1fYXJ0aWNsZV9mZWVkYmFjazogeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IHRydWUsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgY3JtX2tub3dsZWRnZV9hcnRpY2xlOiB7IGFsbG93Q3JlYXRlOiBmYWxzZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIC8vIEVucm9sbG1lbnQgaXMgbWFya2V0aW5nJ3Mgam9iOyBhIG1hbmFnZXIgb25seSByZWFkcyB0aGUgbWVtYmVyc2hpcCByb3dzXG4gICAgLy8gYmVoaW5kIGNhbXBhaWduIFJPSS4gYGNybV9jYW1wYWlnbl9tZW1iZXJgIGlzIGBjb250cm9sbGVkX2J5X3BhcmVudGAsIHNvXG4gICAgLy8gbm8gcmVhZFNjb3BlL3ZpZXdBbGxSZWNvcmRzIGFwcGxpZXMgKEFEUi0wMDU1KSBcdTIwMTQgYnV0IHRoZSByb3dzIGRvIG5vdFxuICAgIC8vIFwiZm9sbG93IHRoZSBjYW1wYWlnblwiOiB0aGUgZGVyaXZhdGlvbiByZXNvbHZlcyB0aGUgbWFzdGVyIHNldCB0aHJvdWdoIHRoZVxuICAgIC8vIG1hc3RlcidzIFJMUyBwb2xpY2llcyBvbmx5IChub25lIG5hcnJvdyBhIHNlbGVjdCBvbiBgY3JtX2NhbXBhaWduYCksIHNvXG4gICAgLy8gdGhpcyBpcyBvcmctd2lkZSByZWFkIG9uIGV2ZXJ5IG1lbWJlciByb3cuIFRoZSBwcmFjdGljYWwgZGVsdGEgaXMgc21hbGxcbiAgICAvLyBoZXJlIFx1MjAxNCBgY3JtX2NhbXBhaWduYCBpcyBgcHVibGljX3JlYWRgIGFuZCB0aGlzIHNldCByZWFkcyBldmVyeSBjYW1wYWlnblxuICAgIC8vIGFueXdheSBcdTIwMTQgc28gdGhlIGludGVuZGVkIGRlcml2YXRpb24gd291bGQgcmV0dXJuIHRoZSBzYW1lIHJvd3MuIFNlZVxuICAgIC8vIGBjYW1wYWlnbl9tZW1iZXIub2JqZWN0LnRzYCBhbmQgb2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjNTM4NiAoIzY5NCkuXG4gICAgY3JtX2NhbXBhaWduX21lbWJlcjogICB7IGFsbG93Q3JlYXRlOiBmYWxzZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICAvLyBMaW5lIGl0ZW1zOiBmdWxsIENSVUQgc28gYSBtYW5hZ2VyIGNhbiBmaXggcHJpY2luZyBvbiBhbnkgcmVwJ3MgZGVhbCBvclxuICAgIC8vIHF1b3RlLiBCb3RoIG9iamVjdHMgYXJlIGBjb250cm9sbGVkX2J5X3BhcmVudGAsIHNvIHRoZXJlIGlzIG5vIHNjb3BlIHRvXG4gICAgLy8gYXV0aG9yIFx1MjAxNCBidXQgdGhhdCBkZXJpdmF0aW9uIGRvZXMgbm90IG5hcnJvdyB0aGVzZSByb3dzIHRvIHRoZSBkZWFscyBhbmRcbiAgICAvLyBxdW90ZXMgdGhlIG1hbmFnZXIgY2FuIHJlYWQuIE1FQVNVUkVEIChzZWUgdGhlIG5vdGUgaW5cbiAgICAvLyBgc2FsZXMtcmVwLnByb2ZpbGUudHNgIGFuZCBgdGVzdC9wYXJlbnQtZGVyaXZlZC1yZWFjaC50ZXN0LnRzYCk6IHRoZSBtYXN0ZXJcbiAgICAvLyBzZXQgY29tZXMgZnJvbSB0aGUgbWFzdGVyJ3MgUkxTIHBvbGljaWVzIG9ubHksIG5ldmVyIGZyb20gb3duZXJzaGlwIG9yIGFcbiAgICAvLyBzaGFyZS4gVGhpcyBzZXQgYXV0aG9ycyBvbmUgc3VjaCBwb2xpY3kgXHUyMDE0IHRoZSBwcml2YXRlLWRlYWwgZmlsdGVyIG9uXG4gICAgLy8gYGNybV9vcHBvcnR1bml0eWAgYmVsb3cgXHUyMDE0IGFuZCBub25lIG9uIGBjcm1fcXVvdGVgLCBzbyBxdW90ZSBsaW5lcyBhcmVcbiAgICAvLyBvcmctd2lkZSwgYW5kIG9wcG9ydHVuaXR5IGxpbmVzIGFyZSBib3VuZGVkIGJ5IHRoYXQgcG9saWN5IGFuZCBub3RoaW5nXG4gICAgLy8gZWxzZSAodGhlIGd1YXJkIHRlc3QgcGlucyB0aGUgcXVvdGUgY2hhaW47IHRoZSBvcHBvcnR1bml0eSBzaWRlIGZvbGxvd3NcbiAgICAvLyBmcm9tIHRoZSBzYW1lIG1lYXN1cmVkIG1lY2hhbmlzbSkuIFVwc3RyZWFtIGdhcDpcbiAgICAvLyBvYmplY3RzdGFjay1haS9vYmplY3RzdGFjayM1Mzg2ICgjNjk0KS5cbiAgICBjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtOiB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBjcm1fcXVvdGVfbGluZV9pdGVtOiAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICAvLyBUaGUgcmVjb3JkIEF0dGFjaG1lbnRzIHBhbmVsLCBSRUFEIG9ubHk6IGNhbm9uaWNhbCBub3RlIG9uIGBlbmFibGUuZmlsZXNgXG4gICAgLy8gaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYCAoIzIwMjkpLiBXaGljaCBhdHRhY2htZW50cyBpdCBsaXN0c1xuICAgIC8vIGRlcml2ZXMgZnJvbSB0aGUgcGFyZW50IHJlY29yZDsgdXBsb2FkIGFuZCBkZWxldGUgd2FpdCB1cHN0cmVhbS5cbiAgICBzeXNfYXR0YWNobWVudDogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gVGhlIHJlY29yZCBEaXNjdXNzaW9uIHBhbmVsLCBjb21tZW50cyBhbmQgYWN0aXZpdHk6IGNhbm9uaWNhbCBub3RlIG9uXG4gICAgLy8gYGVuYWJsZS5mZWVkc2AgaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYCAoIzIwMjkpLiBXaGljaCB0aHJlYWRzIGl0XG4gICAgLy8gcmVhY2hlcyBkZXJpdmVzIGZyb20gdGhlIHBhcmVudCByZWNvcmQ7IGRlbGV0aW5nIGEgY29tbWVudCB3YWl0cyB1cHN0cmVhbS5cbiAgICBzeXNfY29tbWVudDogIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIHN5c19hY3Rpdml0eTogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gIH0sXG4gIGZpZWxkczoge1xuICAgIC8vIFNlbnNpdGl2ZSBmaWVsZHMgYSBtYW5hZ2VyIG11c3Qgc2VlIGluIGZ1bGwuIEF1dGhvcmVkIGV4cGxpY2l0bHkgcmF0aGVyXG4gICAgLy8gdGhhbiBsZWZ0IGFic2VudDogdGhlc2UgYXJlIHRoZSBmaWVsZHMgb3RoZXIgc2V0cyBtYXNrLCBhbmQgYW4gdW5hdXRob3JlZFxuICAgIC8vIGdyYW50IHJlYWRzIGFzIGFuIG92ZXJzaWdodCBpbnN0ZWFkIG9mIGEgZGVjaXNpb24gKCM0ODgpLlxuICAgICdjcm1fb3Bwb3J0dW5pdHkuYW1vdW50JzogICB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogdHJ1ZSB9LFxuICAgICdjcm1fYWNjb3VudC5oZWFsdGhfc2NvcmUnOiB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogdHJ1ZSB9LFxuICAgICdjcm1fcXVvdGUuaW50ZXJuYWxfbm90ZXMnOiB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogdHJ1ZSB9LFxuICAgIC8vIENhc2UgaW50ZXJuYWwgbm90ZXMgYXJlIHRoZSBzZXJ2aWNlIHRlYW0ncyB3b3JraW5nIG1lbW9yeTogYSBzYWxlc1xuICAgIC8vIG1hbmFnZXIgcmVhZHMgdGhlbSBmb3IgYWNjb3VudCBjb250ZXh0IGJ1dCBuZXZlciBlZGl0cyB0aGVtLlxuICAgICdjcm1fY2FzZS5pbnRlcm5hbF9ub3Rlcyc6ICB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2UgfSxcbiAgfSxcbiAgLy8gQURSLTAwNTg6IGBjcm1fb3Bwb3J0dW5pdHkuaXNfcHJpdmF0ZWAgaXMgc2V0dGFibGUgaW4gdGhlIG9wcG9ydHVuaXR5IGZvcm1cbiAgLy8gKGBvcHBvcnR1bml0eS52aWV3LnRzYCkgYW5kLCBiZWZvcmUgdGhpcyBydWxlLCB3YXMgcmVhZCBieSBub3RoaW5nIFx1MjAxNCBhXG4gIC8vIGNoZWNrYm94IHRoYXQgcHJvbWlzZWQgY29uZmlkZW50aWFsaXR5IGFuZCBkZWxpdmVyZWQgbm9uZS4gT3JnLXdpZGUgcmVhZGVyc1xuICAvLyBhcmUgZXhhY3RseSB3aG8gaXQgaGFzIHRvIGhvbGQgYmFjaywgc28gdGhlIHNldCB0aGF0IGdyYW50c1xuICAvLyBgdmlld0FsbFJlY29yZHNgIG9uIG9wcG9ydHVuaXRpZXMgYWxzbyBjYXJyaWVzIHRoZSByb3cgZmlsdGVyIHRoYXQgaG9ub3Vyc1xuICAvLyBpdC4gQ29tcGlsZXMgdG8gYHsgJG9yOiBbeyBpc19wcml2YXRlOiBmYWxzZSB9LCB7IG93bmVyX2lkOiA8Y2FsbGVyPiB9XSB9YC5cbiAgLy9cbiAgLy8gYG93bmVyX2lkYCwgbm90IHRoZSBhcHAtYXV0aG9yZWQgYG93bmVyYCBsb29rdXAgdGhpcyB1c2VkIHRvIG5hbWU6ICM1NDhcbiAgLy8gcmV0aXJlZCB0aGF0IGZpZWxkLiBUaGUgcHJlZGljYXRlIG5vdyBrZXlzIG9uIHRoZSBTQU1FIGNvbHVtbiB0aGUgT1dEIC9cbiAgLy8gc2hhcmluZyBvd25lci1tYXRjaCByZWFkcywgc28gXCJpdHMgb3duZXJcIiBtZWFucyBvbmUgdGhpbmcgYXBwLXdpZGUuXG4gIHJvd0xldmVsU2VjdXJpdHk6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnb3Bwb3J0dW5pdHlfcHJpdmF0ZV9vd25lcl9vbmx5JyxcbiAgICAgIC8vIEEgZGVhbCBmbGFnZ2VkIFByaXZhdGUgaXMgdmlzaWJsZSBvbmx5IHRvIGl0cyBvd25lciwgZXZlbiB0byBob2xkZXJzIG9mXG4gICAgICAvLyBvcmctd2lkZSBvcHBvcnR1bml0eSByZWFkLiAoYHJvd0xldmVsU2VjdXJpdHlbXS5sYWJlbGAgLyBgZGVzY3JpcHRpb25gXG4gICAgICAvLyBhcmUgZGlzcGxheSBjb3B5IFx1MjAxNCB0aGUgMTcuNy4wIGxpdmVuZXNzIGxlZGdlciBtYXJrcyBib3RoIGxpdmU6IHRoZVxuICAgICAgLy8gcGVybWlzc2lvbiBlZGl0b3IgZHJhd3MgdGhlbSBvbiB0aGUgcG9saWN5IGNhcmQuIFRoaXMgcG9saWN5IGF1dGhvcnNcbiAgICAgIC8vIG5laXRoZXIsIHNvIGl0cyBpbnRlbnQgbGl2ZXMgaW4gdGhpcyBjb21tZW50LilcbiAgICAgIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICBvcGVyYXRpb246ICdzZWxlY3QnIGFzIGNvbnN0LFxuICAgICAgdXNpbmc6ICdpc19wcml2YXRlID09IGZhbHNlIHx8IG93bmVyX2lkID09IGN1cnJlbnRfdXNlci5pZCcsXG4gICAgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlcy9zYWxlcy1yZXAucHJvZmlsZS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlcy9zYWxlcy1yZXAucHJvZmlsZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuZXhwb3J0IGNvbnN0IFNhbGVzUmVwUHJvZmlsZSA9IHtcbiAgbmFtZTogJ3NhbGVzX3JlcCcsXG4gIGxhYmVsOiAnU2FsZXMgUmVwcmVzZW50YXRpdmUnLFxuICAvLyBBIHJlcCdzIGJvb2sgb2YgYnVzaW5lc3MgaXMgcHJpdmF0ZSBieSBkZXNpZ24gKG93biByZWNvcmRzICsgd2hhdGV2ZXIgYVxuICAvLyBzaGFyaW5nIHJ1bGUgb3IgdGVhbSBncmFudCBleHRlbmRzKS4gVGhlIG9iamVjdHMgYmVsb3cgY2FycnkgYW4gZXhwbGljaXRcbiAgLy8gYHJlYWRTY29wZTogJ293bidgIHNvIHRoZSBpbnRlbnQgaXMgYXV0aG9yZWQsIG5vdCBpbmZlcnJlZCBcdTIwMTQgdGhpcyBib3RoXG4gIC8vIHNpbGVuY2VzIHRoZSBgc2VjdXJpdHktcHJpdmF0ZS1uby1yZWFkc2NvcGVgIGxpdmVuZXNzIHdhcm5pbmcgYW5kIHBpbnMgdGhlXG4gIC8vIGJlaGF2aW9yOiB3aXRob3V0IGl0LCBhIHByaXZhdGUtT1dEIG9iamVjdCB3aXRoIGFsbG93UmVhZCBidXQgbm8gc2NvcGUgaXNcbiAgLy8gYW4gdW5kZXItc3BlY2lmaWVkIGdyYW50IHRoZSBlbmdpbmUgcmVhZHMgYXMgXCJvd24gb25seVwiIGFueXdheS5cbiAgLy9cbiAgLy8gV2hhdCB3aWRlbnMgdGhhdCBzY29wZSB0b2RheSBpcyBuYXJyb3dlciB0aGFuIGl0IHNvdW5kczogdGhlIHRlcnJpdG9yeSAvXG4gIC8vIGFjY291bnQtdGVhbSBydWxlcyBhcmUgYXV0aG9yZWQgb24gYGNybV9hY2NvdW50YCBPTkxZLCBhbmQgYSBzaGFyaW5nIHJ1bGVcbiAgLy8gd2lkZW5zIHRoZSBvYmplY3QgaXQgbmFtZXMgXHUyMDE0IG5vdCB0aGUgcmVjb3JkcyBoYW5naW5nIG9mZiBpdC4gU28gYSByZXAgd2hvXG4gIC8vIHJlY2VpdmVzIGFuIGFjY291bnQgdGhyb3VnaCBhIHRlcnJpdG9yeSBydWxlIHJlYWRzIHRoYXQgYWNjb3VudCwgd2hpbGUgdGhlXG4gIC8vIHRhc2tzIG9uIGl0IHN0YXkgb3duLW9ubHkgYW5kIG9wcG9ydHVuaXRpZXMgd2lkZW4gb25seSB0aHJvdWdoIHRoZVxuICAvLyA+PSAkMTAwayBsZWFkZXJzaGlwIHJ1bGVzLiBRdW90ZXMgYW5kIGNvbnRyYWN0cyBhcmUgdGhlIGV4Y2VwdGlvbiBzaW5jZVxuICAvLyAjNTQ5IChydWxpbmcgMjAyNi0wOC0zMSk6IGJvdGggYXJlIGBjb250cm9sbGVkX2J5X3BhcmVudGAgdW5kZXIgdGhlXG4gIC8vIGFjY291bnQsIHNvIHRoZXkgYXJyaXZlIHdpdGggaXQgXHUyMDE0IHRoZSBzYW1lIGRlcml2YXRpb24gYXMgY29udGFjdHMuXG4gIC8vXG4gIC8vIFRoZSBgY29udHJvbGxlZF9ieV9wYXJlbnRgIGdyYW50cyBiZWxvdyByZWFkIGFzIG5hcnJvdywgYW5kIGFzIG9mXG4gIC8vIDE3LjAuMC1yYy40IHRoZXkgQVJFLiBNRUFTVVJFRCBhbmQgcGlubmVkIGJ5XG4gIC8vIGB0ZXN0L3BhcmVudC1kZXJpdmVkLXJlYWNoLnRlc3QudHNgOiB0aGUgQURSLTAwNTUgZGVyaXZhdGlvbiByZXNvbHZlcyBtYXN0ZXJcbiAgLy8gYWNjZXNzaWJpbGl0eSB0aHJvdWdoIHRoZSBzYW1lIHBhdGhzIGEgZGlyZWN0IHJlYWQgb2YgdGhlIG1hc3RlciB0YWtlcyBcdTIwMTRcbiAgLy8gb3duZXIgc2NvcGUgQU5EIGBzeXNfcmVjb3JkX3NoYXJlYCBncmFudHMsIG5vdCB0aGUgbWFzdGVyJ3Mgcm93LWxldmVsXG4gIC8vIHNlY3VyaXR5IHBvbGljaWVzIGFsb25lLiBBIHJlcCBob2xkaW5nIE9ORSBhY2NvdW50IHRocm91Z2ggYSB0ZXJyaXRvcnkgcnVsZVxuICAvLyByZWFkcyB0aGF0IGFjY291bnQncyBjb250YWN0cyBhbmQgbm8gb3RoZXJzLCBhbmQgcmVhZHMgbGluZSBpdGVtcyBvbmx5IHVuZGVyXG4gIC8vIHRoZSBxdW90ZXMgdGhleSBjYW4gcmVhY2guIFdyaXRlcyBkZXJpdmUgdGhlIHNhbWUgd2F5OiBhIGNoaWxkIG9mIGEgbWFzdGVyXG4gIC8vIHRoZSByZXAgY2Fubm90IGVkaXQgaXMgcmVmdXNlZC4gU28gZWFjaCBncmFudCBiZWxvdyBpcyBib3VuZGVkIGJ5IHRoZVxuICAvLyBwYXJlbnQncyBzaGFyaW5nLCB3aGljaCBpcyB3aGF0IGl0IGxvb2tzIGxpa2UuXG4gIC8vXG4gIC8vIFVudGlsIDE3LjAuMC1yYy4zIHRoZSBzYW1lIGdyYW50cyB3ZXJlIG9yZy13aWRlIHJlYWRzIGFuZCB0aGlzIG5vdGUgc2FpZCBzb1xuICAvLyAoIzY5NCk6IHRoZSBkZXJpdmF0aW9uIGNvbnN1bHRlZCBtYXN0ZXIgUkxTIHBvbGljaWVzIG9ubHksIGFuZCBIb3RDUk1cbiAgLy8gYXV0aG9ycyBub25lLCBzbyB0aGUgbWFzdGVyIHNldCB3YXMgZXZlcnkgcmVjb3JkLlxuICAvLyBvYmplY3RzdGFjay1haS9vYmplY3RzdGFjayM1Mzg2IGZpeGVkIHRoYXQgdXBzdHJlYW0gYW5kIGl0IHNoaXBwZWQgaW4gcmMuNC5cbiAgb2JqZWN0czoge1xuICAgIC8vIGBhbGxvd0V4cG9ydGAgd2hlcmUgYW4gZXhwb3J0IHN1cmZhY2UgZXhpc3RzIFx1MjAxNCBjYW5vbmljYWwgbm90ZSBpblxuICAgIC8vIGBzcmMvc2FsZXMvcHJvZmlsZXMvaW5kZXgudHNgLiBTYWZlIGFsb25nc2lkZSBgcmVhZFNjb3BlOiAnb3duJ2A6IGV4cG9ydCBpc1xuICAgIC8vIHJlYWQtZGVyaXZlZCwgc28gYSByZXAncyBDU1YgY2FycmllcyB0aGVpciBvd24gYm9vaywgbm90IHRoZSBvcmcncy5cbiAgICBjcm1fbGVhZDogICAgICAgIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UsIHJlYWRTY29wZTogJ293bicgYXMgY29uc3QsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX2FjY291bnQ6ICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCAgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLCByZWFkU2NvcGU6ICdvd24nIGFzIGNvbnN0LCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIC8vIE5PIHJlYWRTY29wZTogYGNybV9jb250YWN0YCBpcyBgY29udHJvbGxlZF9ieV9wYXJlbnRgIChtYXN0ZXItZGV0YWlsIHRvXG4gICAgLy8gY3JtX2FjY291bnQpLCBzbyBhIGByZWFkU2NvcGVgIGhlcmUgaXMgaW5lcnQgXHUyMDE0IHRoZSBzaGFyaW5nIHNlcnZpY2Ugb25seVxuICAgIC8vIGFwcGxpZXMgb3duZXIgc2NvcGUgdG8gYHByaXZhdGVgIG9iamVjdHMgXHUyMDE0IGFuZCBpdCByZWFkIGFzIGEgcHJvbWlzZSB0aGVcbiAgICAvLyBlbmdpbmUgbmV2ZXIga2VwdDogaXQgc2FpZCBcIm93biBjb250YWN0cyBvbmx5XCIgd2hpbGUgYWNjZXNzIGRlcml2ZWQgZnJvbVxuICAgIC8vIHRoZSBwYXJlbnQgKCM0ODgpLiBUaGF0IGRlcml2YXRpb24gbm93IGRlbGl2ZXJzIGV4YWN0bHkgXCJ0aGUgYWNjb3VudHMgdGhlXG4gICAgLy8gcmVwIGNhbiByZWFkXCI6IG1lYXN1cmVkIG9uIDE3LjAuMC1yYy40LCBhIHJlcCBob2xkaW5nIG9uZSB0ZXJyaXRvcnlcbiAgICAvLyBhY2NvdW50IHJlYWRzIFRIQVQgYWNjb3VudCdzIGNvbnRhY3RzIGFuZCBubyBvdGhlcnMgKHNlZSB0aGUgbm90ZSBhdCB0aGVcbiAgICAvLyB0b3Agb2YgdGhpcyBmaWxlLCAjNjk0KS5cbiAgICBjcm1fY29udGFjdDogICAgIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX29wcG9ydHVuaXR5OiB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCAgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLCByZWFkU2NvcGU6ICdvd24nIGFzIGNvbnN0LCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIC8vIE5PIHJlYWRTY29wZSBvbiBxdW90ZS9jb250cmFjdCBlaXRoZXI6IGJvdGggYXJlIGBjb250cm9sbGVkX2J5X3BhcmVudGBcbiAgICAvLyB1bmRlciBgY3JtX2FjY291bnRgICgjNTQ5KSwgc28gYSBzY29wZSBoZXJlIHdvdWxkIGJlIGluZXJ0LiBBIHJlcCByZWFkc1xuICAgIC8vIHRoZSBxdW90ZXMgYW5kIGNvbnRyYWN0cyBvZiBldmVyeSBhY2NvdW50IHRoZXkgY2FuIHJlYWNoLCBlZGl0cyB0aGVcbiAgICAvLyBxdW90ZXMgb2YgYWNjb3VudHMgdGhleSBjYW4gZWRpdCwgYW5kIG5ldmVyIGVkaXRzIGEgY29udHJhY3QgKG9iamVjdFxuICAgIC8vIGdhdGUpLiBgdGVzdC9wYXJlbnQtZGVyaXZlZC1yZWFjaC50ZXN0LnRzYCBtZWFzdXJlcyBib3RoIGxldmVscy5cbiAgICBjcm1fcXVvdGU6ICAgICAgIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBjcm1fY29udHJhY3Q6ICAgIHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBjcm1fcHJvZHVjdDogICAgIHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBjcm1fY2FtcGFpZ246ICAgIHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBjcm1fY2FzZTogICAgICAgIHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UsIHJlYWRTY29wZTogJ293bicgYXMgY29uc3QsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX3Rhc2s6ICAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCAgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IHRydWUsICB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLCByZWFkU2NvcGU6ICdvd24nIGFzIGNvbnN0IH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQWN0aXZpdHkgKCM1OTIpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vIGBjcm1fZXZlbnRgIGlzIGBwcml2YXRlYCBsaWtlIGBjcm1fdGFza2AgXHUyMDE0IGEgcGVyc29uYWwgYWN0aXZpdHkgcmVjb3JkIFx1MjAxNFxuICAgIC8vIHNvIGFuIGV4cGxpY2l0IHJlY29yZCBzY29wZSBpcyByZXF1aXJlZCBhbG9uZ3NpZGUgYWxsb3dSZWFkIChhbiBvbWl0dGVkXG4gICAgLy8gc2NvcGUgc2lsZW50bHkgbWVhbnMgXCJvd24gb25seVwiIGFuZCByZWFkcyBhcyBhbiB1bm1hZGUgZGVjaXNpb24pLlxuICAgIC8vIGBjcm1fZXZlbnRfYXR0ZW5kZWVgIGlzIGBjb250cm9sbGVkX2J5X3BhcmVudGAsIHNvIGF1dGhvcmluZyBhIHJlYWRTY29wZVxuICAgIC8vIGhlcmUgd291bGQgYmUgaW5lcnQgbWV0YWRhdGEgdGhlIGVuZ2luZSBuZXZlciBhcHBsaWVzLiBJdHMgcm93cyBuYXJyb3cgdG9cbiAgICAvLyB0aGUgZXZlbnRzIHRoZSByZXAgY2FuIHJlYWQgXHUyMDE0IHdoaWNoLCBgY3JtX2V2ZW50YCBiZWluZyBwcml2YXRlIGFuZFxuICAgIC8vIG93bi1zY29wZWQsIGlzIHRoZWlyIG93biBjYWxlbmRhciAoc2VlIHRoZSBub3RlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLFxuICAgIC8vICM2OTQpLlxuICAgIGNybV9ldmVudDogICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiB0cnVlLCAgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSwgcmVhZFNjb3BlOiAnb3duJyBhcyBjb25zdCB9LFxuICAgIGNybV9ldmVudF9hdHRlbmRlZTogeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gUmVmZXJlbmNlIGNhdGFsb2cgKHB1YmxpY19yZWFkIE9XRCk6IHJlcHMgcmVhZCBrbm93bGVkZ2UgYXJ0aWNsZXMsIHdoaWNoXG4gICAgLy8gYXJlIGF1dGhvcmVkIGJ5IHNlcnZpY2UuXG4gICAgLy8gUmVhZHMgdGhlIEtCIGFuZCBtYXkgcmF0ZSBpdDsgY2Fubm90IGF1dGhvciBhcnRpY2xlcyAoIzYwMSkuXG4gICAgY3JtX2FydGljbGVfZmVlZGJhY2s6IHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gRm9yZWNhc3Qgc25hcHNob3RzIGFyZSB3cml0dGVuIGJ5IHRoZSBuaWdodGx5IGBmb3JlY2FzdC5ob29rYCBqb2IgYW5kIHRoZVxuICAgIC8vIGByZXZlbnVlX2ZvcmVjYXN0aW5nYCBza2lsbCwgbmV2ZXIgYnkgaGFuZCBcdTIwMTQgcmVhZC1vbmx5LCBhbmQgb25seSB0aGUgcmVwJ3NcbiAgICAvLyBvd24gc25hcHNob3RzIChwcml2YXRlIE9XRCArIGV4cGxpY2l0IG93biBzY29wZSwgYXMgYWJvdmUpLlxuICAgIGNybV9mb3JlY2FzdDogICAgICAgICAgeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLCByZWFkU2NvcGU6ICdvd24nIGFzIGNvbnN0IH0sXG4gICAgLy8gUHJvZHVjdCBsaW5lcyBvbiBkZWFscyBhbmQgcXVvdGVzLiBCb3RoIG9iamVjdHMgYXJlXG4gICAgLy8gYGNvbnRyb2xsZWRfYnlfcGFyZW50YCwgc28gdGhlcmUgaXMgbm8gcmVhZFNjb3BlIHRvIGF1dGhvciBcdTIwMTQgb25lIHdvdWxkIGJlXG4gICAgLy8gaW5lcnQgbWV0YWRhdGEuIFRoYXQgZGVyaXZhdGlvbiBzY29wZXMgYSByZXAgdG8gdGhlIGxpbmVzIHVuZGVyIHRoZSBkZWFsc1xuICAgIC8vIGFuZCBxdW90ZXMgdGhleSBjYW4gcmVhY2g6IG1lYXN1cmVkIG9uIDE3LjAuMC1yYy40LCBhIHJlcCByZWFkcyB0aGUgbGluZXNcbiAgICAvLyBvZiB0aGUgb25lIHF1b3RlIHRoZXkgb3duIGFuZCBub25lIG9mIHRoZSBvdGhlcnMgKHNlZSB0aGUgbm90ZSBhdCB0aGUgdG9wXG4gICAgLy8gb2YgdGhpcyBmaWxlLCAjNjk0KS4gV2l0aG91dCB0aGVzZSBncmFudHMgdGhlIG9wcG9ydHVuaXR5IFwiUHJvZHVjdHNcIlxuICAgIC8vIHJlbGF0ZWQgbGlzdCBhbmQgdGhlIHdob2xlIENQUSBwYXRoIHdlcmUgZGVuaWVkIGZvciBldmVyeSBub24tYWRtaW4gdXNlclxuICAgIC8vICgjNDg4KS5cbiAgICBjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtOiB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBjcm1fcXVvdGVfbGluZV9pdGVtOiAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICAvLyBXaGljaCBjYW1wYWlnbiBzb3VyY2VkIGEgbGVhZCBcdTIwMTQgcmVhZC1vbmx5IGNvbnRleHQsIGRlcml2ZWQgZnJvbSB0aGVcbiAgICAvLyBjYW1wYWlnbiAoY29udHJvbGxlZF9ieV9wYXJlbnQpLiBFbnJvbGxtZW50IGJlbG9uZ3MgdG8gbWFya2V0aW5nX3VzZXIuXG4gICAgY3JtX2NhbXBhaWduX21lbWJlcjogICAgICAgeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gVGhlIHJlY29yZCBBdHRhY2htZW50cyBwYW5lbCwgUkVBRCBvbmx5OiBjYW5vbmljYWwgbm90ZSBvbiBgZW5hYmxlLmZpbGVzYFxuICAgIC8vIGluIGBzcmMvc2FsZXMvb2JqZWN0cy9pbmRleC50c2AgKCMyMDI5KS4gV2hpY2ggYXR0YWNobWVudHMgaXQgbGlzdHNcbiAgICAvLyBkZXJpdmVzIGZyb20gdGhlIHBhcmVudCByZWNvcmQ7IHVwbG9hZCBhbmQgZGVsZXRlIHdhaXQgdXBzdHJlYW0uXG4gICAgc3lzX2F0dGFjaG1lbnQ6IHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogZmFsc2UsIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIC8vIFRoZSByZWNvcmQgRGlzY3Vzc2lvbiBwYW5lbCwgY29tbWVudHMgYW5kIGFjdGl2aXR5OiBjYW5vbmljYWwgbm90ZSBvblxuICAgIC8vIGBlbmFibGUuZmVlZHNgIGluIGBzcmMvc2FsZXMvb2JqZWN0cy9pbmRleC50c2AgKCMyMDI5KS4gV2hpY2ggdGhyZWFkcyBpdFxuICAgIC8vIHJlYWNoZXMgZGVyaXZlcyBmcm9tIHRoZSBwYXJlbnQgcmVjb3JkOyBkZWxldGluZyBhIGNvbW1lbnQgd2FpdHMgdXBzdHJlYW0uXG4gICAgc3lzX2NvbW1lbnQ6ICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBzeXNfYWN0aXZpdHk6IHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogZmFsc2UsIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICB9LFxuICBmaWVsZHM6IHtcbiAgICAnY3JtX2FjY291bnQuYW5udWFsX3JldmVudWUnOiAgICAgeyByZWFkYWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlIH0sXG4gICAgJ2NybV9hY2NvdW50LmRlc2NyaXB0aW9uJzogICAgICAgIHsgcmVhZGFibGU6IHRydWUsIGVkaXRhYmxlOiB0cnVlIH0sXG4gICAgJ2NybV9vcHBvcnR1bml0eS5hbW91bnQnOiAgICAgICAgIHsgcmVhZGFibGU6IHRydWUsIGVkaXRhYmxlOiB0cnVlIH0sXG4gICAgJ2NybV9vcHBvcnR1bml0eS5wcm9iYWJpbGl0eSc6ICAgIHsgcmVhZGFibGU6IHRydWUsIGVkaXRhYmxlOiB0cnVlIH0sXG4gICAgLy8gSGVhbHRoIHNjb3JlIGRyaXZlcyB0aGUgcmVuZXdhbCBib29rIGFuZCB0aGUgYXQtcmlzayB2aWV3czogcmVwcyBzZWUgaXQsXG4gICAgLy8gdGhlIHJlbmV3YWwvQ1MgcHJvY2VzcyBzZXRzIGl0LiBSZWFkYWJsZSAodGhlIGBhdF9yaXNrX2FjY291bnRzYCB2aWV3XG4gICAgLy8gZmlsdGVycyBhbmQgc29ydHMgb24gaXQsIGFuZCBhIG1hc2tlZCBmaWVsZCBjYW5ub3QgYmUgZmlsdGVyZWQpIGJ1dCBuZXZlclxuICAgIC8vIHJlcC1lZGl0YWJsZSBcdTIwMTQgaXQgd2FzIHByZXZpb3VzbHkgdW5hdXRob3JlZCBvbiBldmVyeSBzZXQgKCM0ODgpLlxuICAgICdjcm1fYWNjb3VudC5oZWFsdGhfc2NvcmUnOiAgICAgICB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2UgfSxcbiAgICAvLyBRdW90ZSBpbnRlcm5hbCBub3RlcyBzdGF5IHJlcC1lZGl0YWJsZTogYHF1b3RlLmhvb2tgIGRlbGliZXJhdGVseSBrZWVwc1xuICAgIC8vIHRoZW0gd3JpdGFibGUgYWZ0ZXIgYSBxdW90ZSBpcyBzZW50LCB3aGVuIG5vdGhpbmcgZWxzZSBpcy5cbiAgICAnY3JtX3F1b3RlLmludGVybmFsX25vdGVzJzogICAgICAgeyByZWFkYWJsZTogdHJ1ZSwgZWRpdGFibGU6IHRydWUgfSxcbiAgICAvLyBDYXNlIGludGVybmFsIG5vdGVzIGFyZSB0aGUgc2VydmljZSB0ZWFtJ3MgcHJpdmF0ZSB3b3JraW5nIG5vdGVzLiBBIHJlcFxuICAgIC8vIHJlYWRzIHRoZSBjYXNlIChvd24gc2NvcGUpIGZvciBhY2NvdW50IGNvbnRleHQ7IHRoZSBhZ2VudC1vbmx5IGNvbW1lbnRhcnlcbiAgICAvLyBpbnNpZGUgaXQgaXMgbWFza2VkIFx1MjAxNCBubyB2aWV3IGZpbHRlcnMgb3Igc29ydHMgb24gdGhpcyBmaWVsZCwgc28gbWFza2luZ1xuICAgIC8vIGNvc3RzIG5vdGhpbmcgYnV0IHRoZSB2YWx1ZSBpdHNlbGYuXG4gICAgJ2NybV9jYXNlLmludGVybmFsX25vdGVzJzogICAgICAgIHsgcmVhZGFibGU6IGZhbHNlLCBlZGl0YWJsZTogZmFsc2UgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlcy9zZXJ2aWNlLWFnZW50LnByb2ZpbGUudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcHJvZmlsZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcHJvZmlsZXMvc2VydmljZS1hZ2VudC5wcm9maWxlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5leHBvcnQgY29uc3QgU2VydmljZUFnZW50UHJvZmlsZSA9IHtcbiAgbmFtZTogJ3NlcnZpY2VfYWdlbnQnLFxuICBsYWJlbDogJ1NlcnZpY2UgQWdlbnQnLFxuICBvYmplY3RzOiB7XG4gICAgLy8gUmVmZXJlbmNlIGNvbnRleHQgYW4gYWdlbnQgbmVlZHMgdG8gd29yayBBTlkgdGlja2V0IFx1MjAxNCBhIGN1c3RvbWVyJ3MgY2FzZXNcbiAgICAvLyBhcmUgbWVhbmluZ2xlc3Mgd2l0aG91dCBzZWVpbmcgdGhlIGFjY291bnQvY29udGFjdCBiZWhpbmQgdGhlbSwgc28gdGhlc2VcbiAgICAvLyBhcmUgb3JnLXZpc2libGUgcmVhZHMgKHZpZXdBbGxSZWNvcmRzOiB0cnVlKSwgTk9UIG93bi1vbmx5LiBUaGlzIHdhcyB0aGVcbiAgICAvLyBzZWN1cml0eS1wcml2YXRlLW5vLXJlYWRzY29wZSB3YXJuaW5nJ3MgcmVhbCBzaWduYWw6IGFsbG93UmVhZCBvbiBhXG4gICAgLy8gcHJpdmF0ZSBvYmplY3Qgd2l0aCBubyBzY29wZSBoYWQgc2lsZW50bHkgbG9ja2VkIGFnZW50cyBvdXQgb2YgZXZlcnlcbiAgICAvLyBhY2NvdW50IHRoZXkgZGlkbid0IHBlcnNvbmFsbHkgb3duLlxuICAgIC8vIGBhbGxvd0V4cG9ydGAgd2hlcmUgYW4gZXhwb3J0IHN1cmZhY2UgZXhpc3RzIFx1MjAxNCBjYW5vbmljYWwgbm90ZSBpblxuICAgIC8vIGBzcmMvc2FsZXMvcHJvZmlsZXMvaW5kZXgudHNgLiBgY3JtX29wcG9ydHVuaXR5YCBjYXJyaWVzIG5vIGV4cG9ydCBiaXQ6IHRoaXNcbiAgICAvLyBzZXQgaGFzIG5vIHJlYWQgb24gaXQgYXQgYWxsLCBhbmQgdGhlIGF4aXMgbmV2ZXIgd2lkZW5zIHJlYWQuXG4gICAgY3JtX2xlYWQ6ICAgICAgICB7IGFsbG93Q3JlYXRlOiBmYWxzZSwgYWxsb3dSZWFkOiB0cnVlLCAgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIGNybV9hY2NvdW50OiAgICAgeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogZmFsc2UsIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IHRydWUsICBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSwgYWxsb3dFeHBvcnQ6IHRydWUgfSxcbiAgICBjcm1fY29udGFjdDogICAgIHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX29wcG9ydHVuaXR5OiB7IGFsbG93Q3JlYXRlOiBmYWxzZSwgYWxsb3dSZWFkOiBmYWxzZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gQ2FzZXMgKyB0YXNrczogYW4gYWdlbnQncyBvd24gcXVldWUgYnkgZGVmYXVsdCAocmVhZFNjb3BlOiAnb3duJykuXG4gICAgLy8gQ3Jvc3MtYWdlbnQgdmlzaWJpbGl0eSBleGlzdHMgZm9yIENBU0VTIG9ubHkgXHUyMDE0IHRoZSBlc2NhbGF0aW9uIHJ1bGVzIHdpZGVuXG4gICAgLy8gb3BlbiBjcml0aWNhbCBjYXNlcyB0byBzZXJ2aWNlX21hbmFnZXIgLyBzZXJ2aWNlX2RpcmVjdG9yLiBgY3JtX3Rhc2tgIGhhc1xuICAgIC8vIG5vIHNoYXJpbmcgcnVsZSBhdCBhbGwsIHNvIGFuIGFnZW50IHJlYWRpbmcgYW4gYWNjb3VudCBvcmctd2lkZSBzdGlsbFxuICAgIC8vIHNlZXMgb25seSB0aGVpciBvd24gdGFza3Mgb24gaXQgKCM1NDkpLlxuICAgIGNybV9jYXNlOiAgICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSwgcmVhZFNjb3BlOiAnb3duJyBhcyBjb25zdCwgYWxsb3dFeHBvcnQ6IHRydWUgfSxcbiAgICAvLyBgYWxsb3dUcmFuc2ZlcmAgb24gYGNybV90YXNrYCBPTkxZIFx1MjAxNCBjYW5vbmljYWwgbm90ZSBpblxuICAgIC8vIGBzcmMvc2FsZXMvcHJvZmlsZXMvaW5kZXgudHNgLiBOYXJyb3cgYW5kIGxvYWQtYmVhcmluZzogZXNjYWxhdGluZyBhIGNhc2UgZmlyZXNcbiAgICAvLyBgY2FzZV9zdGF0dXNfc2lkZV9lZmZlY3RzYCwgd2hpY2ggb3BlbnMgdGhlIGZvbGxvdy11cCB0YXNrIE9XTkVEIEJZIHRoZVxuICAgIC8vIGFjY291bnQgb3duZXIgKGBjYXNlLmhvb2sudHNgKS4gVGhhdCBpbnNlcnQgcnVucyBvbiBgY3R4LmFwaWAgd2l0aCB0aGVcbiAgICAvLyBhZ2VudCdzIG93biBjb250ZXh0LCBzbyBwbGFudGluZyBpdCB1bmRlciBhbm90aGVyIHVzZXIgaXMgYSB0cmFuc2ZlciBhbmRcbiAgICAvLyBpcyBkZW5pZWQgd2l0aG91dCB0aGlzIGJpdCBcdTIwMTQgdGhlIGNhc2UgdXBkYXRlIHdvdWxkIGZhaWwgd2l0aCBpdC4gVGhpcyBpc1xuICAgIC8vIFwiYXNzaWduIHdvcmsgdG8gYSBjb2xsZWFndWVcIiwgbm90IFwicmVhc3NpZ24gdGhlIHRpY2tldFwiOiB0aGUgYWdlbnQgaG9sZHNcbiAgICAvLyBubyB0cmFuc2ZlciBncmFudCBvbiBgY3JtX2Nhc2VgIG9yIGFueSBjdXN0b21lciByZWNvcmQuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgRXNjYWxhdGlvbiBET0VTIG5vdyBtb3ZlIGEgY2FzZSB0byB0aGUgYHNlcnZpY2VfbWFuYWdlcmAgcG9vbCAoIzEwNzApLFxuICAgIC8vIGFuZCBpdCBkb2VzIHNvIHdpdGggbm8gYGNybV9jYXNlYCBncmFudCBoZXJlIFx1MjAxNCBkZWxpYmVyYXRlbHkuIFRoYXRcbiAgICAvLyBoYW5kLW9mZiBydW5zIG9uIHRoZSBgYmVmb3JlVXBkYXRlYCBzZWFtLCB3aGljaCB0aGUgIzMwMDQgZ3VhcmQgY2Fubm90XG4gICAgLy8gc2VlIChtZWFzdXJlZCwgdGhyZWUgcmVhZGluZ3MsIGluIGBfY2FzZS1hc3NpZ25tZW50LnRzYCdzIGhlYWRlciBhbmRcbiAgICAvLyBwaW5uZWQgaW4gYHRlc3QvY2FzZS1hc3NpZ25tZW50LnRlc3QudHNgKSwgc28gdGhlIGNhc2UgbW92ZXMgYXMgcGFydCBvZlxuICAgIC8vIHRoZSBlc2NhbGF0aW9uIHdyaXRlIHRoZSBhdXRvbWF0aW9uIGlzIGFscmVhZHkgcGVyZm9ybWluZyByYXRoZXIgdGhhbiBhc1xuICAgIC8vIGFuIGFnZW50LWluaXRpYXRlZCB0cmFuc2Zlci4gRG9pbmcgaXQgdGhlIG90aGVyIHdheSBcdTIwMTQgYSBgY3R4LmFwaWAgd3JpdGVcbiAgICAvLyBmcm9tIGBhZnRlclVwZGF0ZWAgXHUyMDE0IFdPVUxEIG5lZWQgYGNybV9jYXNlLmFsbG93VHJhbnNmZXJgIGhlcmUsIHdoaWNoXG4gICAgLy8gd291bGQgbGV0IGFuIGFnZW50IHJlYXNzaWduIGFueSBjYXNlIHRoZXkgY2FuIGVkaXQuIFRoYXQgaXMgYVxuICAgIC8vIHBlcm1pc3Npb24tbW9kZWwgZGVjaXNpb24gYW5kIGlzIG5vdCBiZWluZyB0YWtlbiBhcyBhIHNpZGUgZWZmZWN0IG9mIGFcbiAgICAvLyBob29rOiB0aGlzIGxpbmUgc3RheXMgYGNybV90YXNrYCBvbmx5LlxuICAgIGNybV90YXNrOiAgICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiB0cnVlLCAgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSwgcmVhZFNjb3BlOiAnb3duJyBhcyBjb25zdCwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIC8vICM1OTIgXHUyMDE0IGBsb2dfY2FsbGAgLyBgbG9nX21lZXRpbmdgIGFyZSBzY29wZWQgdG8gYGNybV9jYXNlYCB0b28sIGFuZCBhblxuICAgIC8vIGFnZW50IHdobyBjYW5ub3QgSU5TRVJUIGEgYGNybV9ldmVudGAgZ2V0cyBhIGJ1dHRvbiB0aGF0IDQwM3MuIFNhbWVcbiAgICAvLyBvd24tc2NvcGVkIHNoYXBlIGFzIHRoZWlyIHRhc2tzLlxuICAgIGNybV9ldmVudDogICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiB0cnVlLCAgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSwgcmVhZFNjb3BlOiAnb3duJyBhcyBjb25zdCB9LFxuICAgIGNybV9ldmVudF9hdHRlbmRlZTogeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgY3JtX3Byb2R1Y3Q6ICAgICB7IGFsbG93Q3JlYXRlOiBmYWxzZSwgYWxsb3dSZWFkOiB0cnVlLCAgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gVGhlIGtub3dsZWRnZSBiYXNlIGlzIHRoaXMgdGVhbSdzIG93biBzdXJmYWNlOiBhZ2VudHMgZHJhZnQgYW5kIHJldmlzZVxuICAgIC8vIGFydGljbGVzIChkcmFmdCBcdTIxOTIgaW5fcmV2aWV3IFx1MjE5MiBwdWJsaXNoZWQgaXMgZW5mb3JjZWQgYnkgdGhlIEtCIGZsb3csIG5vdCBieVxuICAgIC8vIENSVUQpLCBhbmQgcmVhZCBldmVyeSBwdWJsaXNoZWQgYXJ0aWNsZSByZWdhcmRsZXNzIG9mIGF1dGhvci4gQXJjaGl2aW5nXG4gICAgLy8gaXMgZGVzdHJ1Y3RpdmUtYnktcG9saWN5LCBzbyBkZWxldGlvbiBzdGF5cyB3aXRoIGFkbWlucy4gQmVmb3JlICM0ODggdGhlXG4gICAgLy8gb2JqZWN0IGhhZCBubyBncmFudCBhdCBhbGwgXHUyMDE0IHRoZSBcIktub3dsZWRnZVwiIG5hdiBpdGVtIHdhcyBkZW5pZWQgZm9yXG4gICAgLy8gZXZlcnlvbmUsIGluY2x1ZGluZyB0aGUgYWdlbnRzIGl0IHdhcyBidWlsdCBmb3IuXG4gICAgLy8gQWdlbnRzIHJhdGUgdGhlIGFydGljbGVzIHRoZXkgdXNlIHRvIGNsb3NlIGNhc2VzICgjNjAxKS4gQ3JlYXRlICsgZWRpdFxuICAgIC8vIHRoZWlyIE9XTiByb3cgKGBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZWAga2VlcHMgdGhlbSBvZmYgZXZlcnlvbmUgZWxzZSdzXG4gICAgLy8gdm90ZSk7IG5vIGRlbGV0ZSBcdTIwMTQgYSB3aXRoZHJhd24gb3BpbmlvbiBpcyBhIGNoYW5nZWQgdmVyZGljdCwgbm90IGFuXG4gICAgLy8gZXJhc2VkIG9uZS5cbiAgICBjcm1fYXJ0aWNsZV9mZWVkYmFjazogeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IHRydWUsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgY3JtX2tub3dsZWRnZV9hcnRpY2xlOiB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICAvLyBUaGUgcmVjb3JkIEF0dGFjaG1lbnRzIHBhbmVsLCBSRUFEIG9ubHk6IGNhbm9uaWNhbCBub3RlIG9uIGBlbmFibGUuZmlsZXNgXG4gICAgLy8gaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYCAoIzIwMjkpLiBXaGljaCBhdHRhY2htZW50cyBpdCBsaXN0c1xuICAgIC8vIGRlcml2ZXMgZnJvbSB0aGUgcGFyZW50IHJlY29yZDsgdXBsb2FkIGFuZCBkZWxldGUgd2FpdCB1cHN0cmVhbS5cbiAgICBzeXNfYXR0YWNobWVudDogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gVGhlIHJlY29yZCBEaXNjdXNzaW9uIHBhbmVsLCBjb21tZW50cyBhbmQgYWN0aXZpdHk6IGNhbm9uaWNhbCBub3RlIG9uXG4gICAgLy8gYGVuYWJsZS5mZWVkc2AgaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYCAoIzIwMjkpLiBXaGljaCB0aHJlYWRzIGl0XG4gICAgLy8gcmVhY2hlcyBkZXJpdmVzIGZyb20gdGhlIHBhcmVudCByZWNvcmQ7IGRlbGV0aW5nIGEgY29tbWVudCB3YWl0cyB1cHN0cmVhbS5cbiAgICBzeXNfY29tbWVudDogIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIHN5c19hY3Rpdml0eTogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gIH0sXG4gIGZpZWxkczoge1xuICAgICdjcm1fY2FzZS5pc19zbGFfdmlvbGF0ZWQnOiAgICAgICAgeyByZWFkYWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlIH0sXG4gICAgJ2NybV9jYXNlLnJlc29sdXRpb25fdGltZV9ob3Vycyc6ICB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2UgfSxcbiAgICAvLyBJbnRlcm5hbCBub3RlcyBhcmUgdGhlIGFnZW50J3Mgd29ya2luZyBtZW1vcnkgb24gYSB0aWNrZXQgXHUyMDE0IGZ1bGwgYWNjZXNzXG4gICAgLy8gaGVyZSwgcmVhZC1vbmx5IGZvciBzYWxlc19tYW5hZ2VyLCBtYXNrZWQgZm9yIHNhbGVzX3JlcCAoIzQ4OCkuXG4gICAgJ2NybV9jYXNlLmludGVybmFsX25vdGVzJzogICAgICAgICB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogdHJ1ZSB9LFxuICAgIC8vIEFjY291bnQgaGVhbHRoIGlzIHJlbmV3YWwtdGVhbSBkYXRhIGFuIGFnZW50IHJlYWRzIGZvciBjb250ZXh0IG9ubHkuXG4gICAgJ2NybV9hY2NvdW50LmhlYWx0aF9zY29yZSc6ICAgICAgICB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2UgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogVGhlIFNFUlZJQ0UgTUFOQUdFUiBiaW5kaW5nICgjMTc3OSkgXHUyMDE0IHRoZSBzYW1lIHNldCwgdW5kZXIgdGhlIHBvc2l0aW9uJ3MgbmFtZS5cbiAqXG4gKiAjIyMgV2hhdCB3YXMgcnVsZWRcbiAqXG4gKiBgc2VydmljZV9tYW5hZ2VyYCBpcyBhIGRlY2xhcmVkIHBvc2l0aW9uIChgc3JjL3NhbGVzL3NoYXJpbmcvcG9zaXRpb25zLnRzYCkgdGhhdFxuICogYGNhc2VfZXNjYWxhdGlvbl9zaGFyaW5nYCBuYW1lcyBhbmQgdGhhdCBgY2FzZV9lc2NhbGF0aW9uX3JlYXNzaWduYCByb3V0ZXNcbiAqIGVzY2FsYXRpbmcgY2FzZXMgdG8gXHUyMDE0IG1lYXN1cmVkLCAzNSBvZiB0aGVtIG9uIGEgZGVtbyBib3ggXHUyMDE0IGFuZCBubyBwZXJtaXNzaW9uXG4gKiBzZXQgcmVhY2hlZCBpdCwgc28gdGhlIHBlcnNvbmEgd2FzIGRlbmllZCBldmVyeSBDUk0gb2JqZWN0ICg0MDMpLiBEaXJlY3RvclxuICogc2VhdCwgZGVjaXNpb24gYmF0Y2ggIzkyLCAyMDI2LTA5LTA4LCB1bmRlciB0aGUgbWFpbnRhaW5lcidzIHN0YW5kaW5nXG4gKiBcdTMwMENcdTdFRTdcdTdFRURcdTUxQjNcdTdCNTZcdTMwMEQgZGVsZWdhdGlvbjogYmluZCB0aGUgRVhJU1RJTkcgYHNlcnZpY2VfYWdlbnRgIHNldCB0byB0aGVcbiAqIGBzZXJ2aWNlX21hbmFnZXJgIHBvc2l0aW9uLiBcdTI2RDQgQiAoYXV0aG9yIGEgbWFuYWdlci1zcGVjaWZpYyBwcm9maWxlKSB3YXNcbiAqIHJlZnVzZWQgXHUyMDE0IG5vIG1lYXN1cmVkIHB1bGxlciBmb3IgYSBtYW5hZ2VyLW9ubHkgZ3JhbnQuIFx1MjZENCBDIChyZXJvdXRlIHRoZVxuICogZXNjYWxhdGlvbiBwb29sKSB3YXMgcmVmdXNlZCBcdTIwMTQgaXQgZGVsZXRlcyB0aGUgcGVyc29uYSdzIHJlYXNvbiB0byBleGlzdC5cbiAqXG4gKiAjIyMgV2h5IHRoZSBiaW5kaW5nIGlzIGEgTkFNRSBhbmQgbm90IGEga2V5IFx1MjAxNCBtZWFzdXJlZCwgbm90IGluZmVycmVkXG4gKlxuICogVGhlcmUgaXMgbm8gYXV0aG9yYWJsZSBiaW5kaW5nIG9uIGVpdGhlciBzaWRlLiBgUGVybWlzc2lvblNldFNjaGVtYWAgcmVqZWN0c1xuICogYHByb2ZpbGVzYCAvIGByb2xlc2AgLyBgdXNlcnNgLCBhbmQgYFBvc2l0aW9uU2NoZW1hYCByZWplY3RzIGBwZXJtaXNzaW9uU2V0c2BcbiAqIHdpdGggaXRzIG93biBwcmVzY3JpcHRpb246IGNhcGFiaWxpdHkgcmVhY2hlcyBhIHBvc2l0aW9uIE9OTFkgdGhyb3VnaFxuICogYHN5c19wb3NpdGlvbl9wZXJtaXNzaW9uX3NldGAgcm93cywgXCJjcmVhdGVkIGluIFNldHVwIG9yIGJ5IGFuIGFwcCdzXG4gKiBga2VybmVsOnJlYWR5YCBiaW5kZXJcIiBcdTIwMTQgYW5kIGEgcHVyZS1tZXRhZGF0YSBhcHAgc2hpcHMgbmVpdGhlci5cbiAqXG4gKiBXaGF0IGl0IHNoaXBzIGluc3RlYWQgaXMgYSBuYW1lLiBNZWFzdXJlZCBvbiBhIGZyZXNoIDE3LjMuMCBTUUxpdGUgYm94OlxuICogYHN5c19wb3NpdGlvbl9wZXJtaXNzaW9uX3NldGAgaG9sZHMgZXhhY3RseSBPTkUgcm93IChgZXZlcnlvbmVgIFx1MjE5MlxuICogYG1lbWJlcl9kZWZhdWx0YCwgdGhlIEFEUi0wMDkwIEQ1IGJhc2VsaW5lIHRoZSBwbGF0Zm9ybSBiaW5kcyBpdHNlbGYpLCBhbmRcbiAqIHlldCBgUE9TVCAvYXBpL3YxL3NlY3VyaXR5L2V4cGxhaW5gIGZvciBhIGBzZXJ2aWNlX2FnZW50YCBwb3NpdGlvbiBob2xkZXJcbiAqIGFuc3dlcnMgYHBlcm1pc3Npb25TZXRzOiBbc2VydmljZV9hZ2VudCwgbWVtYmVyX2RlZmF1bHRdYCwgY3JlZGl0aW5nIHRoZVxuICogb2JqZWN0LWxldmVsIGdyYW50IHRvIGBbc2VydmljZV9hZ2VudF1gIGB2aWE6IHBvc2l0aW9uOnNlcnZpY2VfYWdlbnRgLiBUaGVcbiAqIHJlc29sdmVyIGlzIGByZXNvbHZlUGVybWlzc2lvblNldHMoKWAgaW4gYEBvYmplY3RzdGFjay9wbHVnaW4tc2VjdXJpdHlgOiBpdFxuICogbWF0Y2hlcyB0aGUgY2FsbGVyJ3MgUE9TSVRJT04gTkFNRVMgYWdhaW5zdCBkZWNsYXJlZCBgUGVybWlzc2lvblNldC5uYW1lYCxcbiAqIHNvIGEgc2V0IG5hbWVkIGZvciBhIHBvc2l0aW9uIGlzIGJvdW5kIHRvIGl0IHdpdGggbm8gcm93IGF0IGFsbC5cbiAqXG4gKiBcdTIxRDIgRm9yIHRoaXMgYXBwLCBcImJpbmQgc2V0IFggdG8gcG9zaXRpb24gUFwiIGhhcyBleGFjdGx5IG9uZSBzcGVsbGluZzogZGVjbGFyZVxuICogWCdzIGdyYW50cyB1bmRlciB0aGUgbmFtZSBQLiBIZW5jZSB0aGlzIGV4cG9ydCByYXRoZXIgdGhhbiBhIG5ldyBmaWxlLlxuICpcbiAqICMjIyBXaHkgYSBzcHJlYWQgYW5kIG5vdCBhIGNvcHlcbiAqXG4gKiBgb2JqZWN0c2AgYW5kIGBmaWVsZHNgIGFyZSBjYXJyaWVkIGJ5IFJFRkVSRU5DRSwgc28gdGhlIHR3byBwZXJzb25hcyBzaGFyZVxuICogb25lIGdyYW50IHRhYmxlIGFuZCBjYW5ub3QgZHJpZnQ6IG5vdGhpbmcgaGVyZSBjYW4gd2lkZW4gdGhlIGFnZW50J3MgZ3JhbnRzLFxuICogYW5kIGEgZnV0dXJlIGVkaXQgdG8gdGhlbSBsYW5kcyBvbiBib3RoIGF0IG9uY2UuIFRoYXQgaXMgdGhlIHJ1bGluZydzIG93blxuICogZmluZGluZyBcdTIwMTQgZXNjYWxhdGlvbiBoYW5kbGluZyBpcyB0aGUgc2FtZSBvYmplY3QgYWNjZXNzIGFzIHdvcmtpbmcgYSB0aWNrZXQgXHUyMDE0XG4gKiBleHByZXNzZWQgaW4gYSB3YXkgdGhlIG5leHQgcmVhZGVyIGNhbm5vdCBoYWxmLWFwcGx5LiBcdTI2RDQgRG8gbm90IGV4cGFuZCB0aGlzXG4gKiBpbnRvIGEgbGl0ZXJhbCBzZWNvbmQgZ3JhbnQgdGFibGUgdG8gXCJtYWtlIGl0IGV4cGxpY2l0XCI7IHRoYXQgd291bGQgYmVcbiAqIG9wdGlvbiBCLCByZWZ1c2VkLCBhbmQgaXQgd291bGQgbGV0IHRoZSB0d28gc2lsZW50bHkgZGl2ZXJnZS5cbiAqXG4gKiAjIyMgUmV2ZXJzYWwgKHJ1bGluZyBpdGVtIDQpXG4gKlxuICogSWYgYSBjdXN0b21lciBuZWVkcyBhIG1hbmFnZXIgZ3JhbnQgdGhhdCBESUZGRVJTIGZyb20gYW4gYWdlbnQncywgaXQgY29tZXNcbiAqIGJhY2sgYXMgYSBwcm9kdWN0IGNhcmQgd2l0aCB0aGUgcHVsbGVyIG5hbWVkIFx1MjAxNCBhbmQgb25seSB0aGVuIGRvZXMgdGhpcyBiZWNvbWVcbiAqIGFuIGF1dGhvcmVkIHNldCBvZiBpdHMgb3duLlxuICovXG5leHBvcnQgY29uc3QgU2VydmljZU1hbmFnZXJQcm9maWxlID0ge1xuICAuLi5TZXJ2aWNlQWdlbnRQcm9maWxlLFxuICBuYW1lOiAnc2VydmljZV9tYW5hZ2VyJyxcbiAgbGFiZWw6ICdTZXJ2aWNlIE1hbmFnZXInLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzL3N5c3RlbS1hZG1pbi5wcm9maWxlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzL3N5c3RlbS1hZG1pbi5wcm9maWxlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFN5c3RlbSBBZG1pbmlzdHJhdG9yIFByb2ZpbGVcbiAqXG4gKiBUaGUgYWRtaW4gc2V0IG11c3QgY292ZXIgRVZFUlkgYnVzaW5lc3Mgb2JqZWN0IHRoaXMgYXBwIHNoaXBzLiBQZXJtaXNzaW9uXG4gKiBzZXRzIGFyZSBleHBsaWNpdC1hbGxvdyBvbmx5IChzZWUgYGd1ZXN0LXBvcnRhbC5wcm9maWxlLnRzYCksIHNvIGFuIG9iamVjdFxuICogbWlzc2luZyBmcm9tIHRoaXMgbWFwIGlzIHBlcm1pc3Npb24tZGVuaWVkIGZvciBhZG1pbnMgdG9vOiB0aGUgb2JqZWN0LWxldmVsXG4gKiBDUlVEIGdhdGUgcmVqZWN0cyB0aGUgY2FsbCBiZWZvcmUgT1dELCBzaGFyaW5nIG9yIGB2aWV3X2FsbF9kYXRhYCBpcyBldmVyXG4gKiBjb25zdWx0ZWQuIGB0ZXN0L2F1dGhvcml6YXRpb24tY292ZXJhZ2UudGVzdC50c2AgcGlucyB0aGF0IGNvdmVyYWdlIHNvIGEgbmV3XG4gKiBvYmplY3QgY2Fubm90IHNoaXAgd2l0aG91dCBsYW5kaW5nIGhlcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBTeXN0ZW1BZG1pblByb2ZpbGUgPSB7XG4gIG5hbWU6ICdzeXN0ZW1fYWRtaW4nLFxuICBsYWJlbDogJ1N5c3RlbSBBZG1pbmlzdHJhdG9yJyxcbiAgb2JqZWN0czoge1xuICAgIC8vIGBhbGxvd1RyYW5zZmVyYCBvbiBldmVyeSBvYmplY3QgXHUyMDE0IGNhbm9uaWNhbCBub3RlIGluIGBzcmMvc2FsZXMvcHJvZmlsZXMvaW5kZXgudHNgLlxuICAgIC8vIFRoZSBhZG1pbiBpcyB0aGUgcGVyc29uYSB0aGF0IHJlYXNzaWducyBvd25lcnNoaXAgd2hlbiBzb21lb25lIGxlYXZlcy5cbiAgICAvLyBgYWxsb3dFeHBvcnRgIG9uIHRoZSBmaXZlIG9iamVjdHMgd2l0aCBhbiBleHBvcnQgc3VyZmFjZSBcdTIwMTQgc2VlIHRoZVxuICAgIC8vIGNhbm9uaWNhbCBub3RlIGluIGBzcmMvc2FsZXMvcHJvZmlsZXMvaW5kZXgudHNgLiBJdCBpcyBhdXRob3JlZCBldmVuIGhlcmU6XG4gICAgLy8gMTcuMCBnYXRlcyBleHBvcnQgb24gdGhlIGV4cGxpY2l0IGJpdCwgYW5kIGBtb2RpZnlBbGxSZWNvcmRzYCBkb2VzIG5vdFxuICAgIC8vIHN0YW5kIGluIGZvciBpdCwgc28gd2l0aG91dCB0aGVzZSBhbiBhZG1pbiBjYW5ub3QgZXhwb3J0IGVpdGhlci5cbiAgICBjcm1fbGVhZDogICAgICAgIHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogdHJ1ZSwgdmlld0FsbFJlY29yZHM6IHRydWUsIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX2FjY291bnQ6ICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlLCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIGNybV9jb250YWN0OiAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSwgYWxsb3dFeHBvcnQ6IHRydWUgfSxcbiAgICBjcm1fb3Bwb3J0dW5pdHk6IHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogdHJ1ZSwgdmlld0FsbFJlY29yZHM6IHRydWUsIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX3F1b3RlOiAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlIH0sXG4gICAgY3JtX2NvbnRyYWN0OiAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlIH0sXG4gICAgY3JtX3Byb2R1Y3Q6ICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlIH0sXG4gICAgY3JtX2NhbXBhaWduOiAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlIH0sXG4gICAgY3JtX2Nhc2U6ICAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlLCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIGNybV90YXNrOiAgICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIGNybV9ldmVudDogICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIGNybV9ldmVudF9hdHRlbmRlZTogeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIC8vIFRoZSBvYmplY3RzIGJlbG93IHNoaXBwZWQgd2l0aCBuYXZpZ2F0aW9uLCB2aWV3cywgaG9va3MgYW5kIHNlZWQgZGF0YVxuICAgIC8vIGJ1dCBubyBncmFudCBpbiBBTlkgcGVybWlzc2lvbiBzZXQgKCM0ODgpOiBcIktub3dsZWRnZVwiIGFuZCBcIkZvcmVjYXN0c1wiXG4gICAgLy8gd2VyZSBwZXJtaXNzaW9uLWRlbmllZCBuYXYgaXRlbXMgZm9yIGV2ZXJ5IHVzZXIsIGFkbWlucyBpbmNsdWRlZC5cbiAgICBjcm1fZm9yZWNhc3Q6ICAgICAgICAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlIH0sXG4gICAgY3JtX2FydGljbGVfZmVlZGJhY2s6ICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogICAgIHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogdHJ1ZSwgdmlld0FsbFJlY29yZHM6IHRydWUsIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUgfSxcbiAgICAvLyBEZXRhaWwgcm93cy4gVGhlaXIgUkVDT1JELWxldmVsIGFjY2VzcyBkZXJpdmVzIGZyb20gdGhlIG1hc3RlclxuICAgIC8vIChBRFItMDA1NSBgY29udHJvbGxlZF9ieV9wYXJlbnRgKSwgYnV0IG9iamVjdC1sZXZlbCBDUlVEIGlzIGEgc2VwYXJhdGVcbiAgICAvLyBnYXRlIHRoYXQgaXMgbmV2ZXIgZGVyaXZlZCBcdTIwMTQgaXQgaGFzIHRvIGJlIGdyYW50ZWQgZXhwbGljaXRseSBoZXJlLlxuICAgIGNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW06IHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogdHJ1ZSwgdmlld0FsbFJlY29yZHM6IHRydWUsIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUgfSxcbiAgICBjcm1fcXVvdGVfbGluZV9pdGVtOiAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlIH0sXG4gICAgY3JtX2NhbXBhaWduX21lbWJlcjogICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIC8vIFRoZSByZWNvcmQgQXR0YWNobWVudHMgcGFuZWwsIFJFQUQgb25seTogY2Fub25pY2FsIG5vdGUgb24gYGVuYWJsZS5maWxlc2BcbiAgICAvLyBpbiBgc3JjL3NhbGVzL29iamVjdHMvaW5kZXgudHNgICgjMjAyOSkuIFdoaWNoIGF0dGFjaG1lbnRzIGl0IGxpc3RzXG4gICAgLy8gZGVyaXZlcyBmcm9tIHRoZSBwYXJlbnQgcmVjb3JkOyB1cGxvYWQgYW5kIGRlbGV0ZSB3YWl0IHVwc3RyZWFtLlxuICAgIHN5c19hdHRhY2htZW50OiB7IGFsbG93Q3JlYXRlOiBmYWxzZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICAvLyBUaGUgcmVjb3JkIERpc2N1c3Npb24gcGFuZWwsIGNvbW1lbnRzIGFuZCBhY3Rpdml0eTogY2Fub25pY2FsIG5vdGUgb25cbiAgICAvLyBgZW5hYmxlLmZlZWRzYCBpbiBgc3JjL3NhbGVzL29iamVjdHMvaW5kZXgudHNgICgjMjAyOSkuIFdoaWNoIHRocmVhZHMgaXRcbiAgICAvLyByZWFjaGVzIGRlcml2ZXMgZnJvbSB0aGUgcGFyZW50IHJlY29yZDsgZGVsZXRpbmcgYSBjb21tZW50IHdhaXRzIHVwc3RyZWFtLlxuICAgIHN5c19jb21tZW50OiAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgc3lzX2FjdGl2aXR5OiB7IGFsbG93Q3JlYXRlOiBmYWxzZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgfSxcbiAgc3lzdGVtUGVybWlzc2lvbnM6IFtcbiAgICAndmlld19zZXR1cCcsICdtYW5hZ2VfdXNlcnMnLCAnY3VzdG9taXplX2FwcGxpY2F0aW9uJyxcbiAgICAndmlld19hbGxfZGF0YScsICdtb2RpZnlfYWxsX2RhdGEnLCAnbWFuYWdlX3Byb2ZpbGVzJyxcbiAgICAnbWFuYWdlX3JvbGVzJywgJ21hbmFnZV9zaGFyaW5nJyxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBUcmFuc2xhdGlvbiBEZWZpbml0aW9ucyBCYXJyZWxcbiAqL1xuXG5leHBvcnQgeyBDcm1UcmFuc2xhdGlvbnMgfSBmcm9tICcuL2NybS50cmFuc2xhdGlvbic7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vYXBwLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lblwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vYXBwLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbi8qKlxuICogRW5nbGlzaCAoZW4pIFx1MjAxNCBldmVyeSB0cmFuc2xhdGlvbiBuYW1lc3BhY2UgRVhDRVBUIGBvYmplY3RzYDpcbiAqIGBhcHBzYCwgYG1lc3NhZ2VzYCwgYGRhc2hib2FyZHNgLCBgcGFnZXNgLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICogRXZlcnl0aGluZyB0aGF0IGlzIG5vdCBgb2JqZWN0c2AgbGl2ZXMgaW4gYC4vYXBwLnRzYDsgYG9iamVjdHNgIFx1MjAxNCA2OS03OCUgb2ZcbiAqIGV2ZXJ5IGJ1bmRsZSBcdTIwMTQgaXMgb25lIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5LCBhbmQgYSBkZXRhaWwgb2JqZWN0XG4gKiBmb2xsb3dzIGl0cyBtYXN0ZXIuIEEgbmV3IHJvdyBnb2VzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LCBuZXZlciBpblxuICogd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuOiB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0IHRoZSA3MCVcbiAqIGFkdmlzb3J5IGJhbmQgYHBucG0gaHlnaWVuZWAgcHJpbnRzLiBGdWxsIHJ1bGUgYW5kIHJhdGlvbmFsZTpcbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuLnRzYC5cbiAqXG4gKiBBIG5hbWVzcGFjZSBgVHJhbnNsYXRpb25EYXRhYCBnYWlucyBsYXRlciBsYW5kcyBoZXJlIHRvbywgYW5kIHRoZSByb29tIGlzXG4gKiBtZWFzdXJlZDogdGhpcyBmaWxlIGlzIHRoZSBzbWFsbGVyIGhhbGYgb2YgdGhlIGJ1bmRsZSwgYW5kIHRoZSBzY2hlbWEgYm91bmRzXG4gKiBob3cgbWFueSBuYW1lc3BhY2VzIGNhbiBldmVyIGFycml2ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcFN1cmZhY2U6IE9taXQ8VHJhbnNsYXRpb25EYXRhLCAnb2JqZWN0cyc+ID0ge1xuICBhcHBzOiB7XG4gICAgY3JtX2VudGVycHJpc2U6IHtcbiAgICAgIGxhYmVsOiAnSG90Q1JNJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ3VzdG9tZXIgcmVsYXRpb25zaGlwIG1hbmFnZW1lbnQgZm9yIHNhbGVzLCBzZXJ2aWNlLCBhbmQgbWFya2V0aW5nJyxcbiAgICAgIG5hdmlnYXRpb246IHtcbiAgICAgICAgZ3JvdXBfYWN0aXZpdHk6IHsgbGFiZWw6ICdBY3Rpdml0eScgfSxcbiAgICAgICAgZ3JvdXBfc2FsZXM6IHsgbGFiZWw6ICdTYWxlcycgfSxcbiAgICAgICAgZ3JvdXBfc2VydmljZTogeyBsYWJlbDogJ1NlcnZpY2UnIH0sXG4gICAgICAgIGdyb3VwX21hcmtldGluZzogeyBsYWJlbDogJ01hcmtldGluZycgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgbWVzc2FnZXM6IHtcbiAgICAnY29tbW9uLnNhdmUnOiAnU2F2ZScsXG4gICAgJ2NvbW1vbi5jYW5jZWwnOiAnQ2FuY2VsJyxcbiAgICAnY29tbW9uLmRlbGV0ZSc6ICdEZWxldGUnLFxuICAgICdjb21tb24uZWRpdCc6ICdFZGl0JyxcbiAgICAnY29tbW9uLmNyZWF0ZSc6ICdDcmVhdGUnLFxuICAgICdjb21tb24uc2VhcmNoJzogJ1NlYXJjaCcsXG4gICAgJ2NvbW1vbi5maWx0ZXInOiAnRmlsdGVyJyxcbiAgICAnY29tbW9uLmV4cG9ydCc6ICdFeHBvcnQnLFxuICAgICdjb21tb24uYmFjayc6ICdCYWNrJyxcbiAgICAnY29tbW9uLmNvbmZpcm0nOiAnQ29uZmlybScsXG4gICAgJ25hdi5zYWxlcyc6ICdTYWxlcycsXG4gICAgJ25hdi5zZXJ2aWNlJzogJ1NlcnZpY2UnLFxuICAgICduYXYubWFya2V0aW5nJzogJ01hcmtldGluZycsXG4gICAgJ25hdi5wcm9kdWN0cyc6ICdQcm9kdWN0cycsXG4gICAgJ25hdi5hbmFseXRpY3MnOiAnQW5hbHl0aWNzJyxcbiAgICAnc3VjY2Vzcy5zYXZlZCc6ICdSZWNvcmQgc2F2ZWQgc3VjY2Vzc2Z1bGx5JyxcbiAgICAnc3VjY2Vzcy5jb252ZXJ0ZWQnOiAnTGVhZCBjb252ZXJ0ZWQgc3VjY2Vzc2Z1bGx5JyxcbiAgICAnY29uZmlybS5kZWxldGUnOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHJlY29yZD8nLFxuICAgICdjb25maXJtLmNvbnZlcnRfbGVhZCc6ICdDb252ZXJ0IHRoaXMgbGVhZCB0byBhY2NvdW50LCBjb250YWN0LCBhbmQgb3Bwb3J0dW5pdHk/JyxcbiAgICAnZXJyb3IucmVxdWlyZWQnOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcsXG4gICAgJ2Vycm9yLmxvYWRfZmFpbGVkJzogJ0ZhaWxlZCB0byBsb2FkIGRhdGEnLFxuICB9LFxuICBkYXNoYm9hcmRzOiB7XG4gICAgc2FsZXNfYWN0aXZpdHlfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ1NhbGVzIEFjdGl2aXR5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnV2hvIGlzIHRhbGtpbmcgdG8gY3VzdG9tZXJzLCBob3cgb2Z0ZW4sIGFuZCB3aGljaCBhY2NvdW50cyBoYXZlIGdvbmUgcXVpZXQnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICBpbnRlcmFjdGlvbnNfaGVsZDogeyB0aXRsZTogJ0ludGVyYWN0aW9ucyBMb2dnZWQnLCBkZXNjcmlwdGlvbjogJ0NhbGxzIGFuZCBtZWV0aW5ncyB0aGF0IGFjdHVhbGx5IGhhcHBlbmVkJyB9LFxuICAgICAgICBtZWV0aW5nc19ib29rZWQ6IHsgdGl0bGU6ICdNZWV0aW5ncyBCb29rZWQnLCBkZXNjcmlwdGlvbjogJ01lZXRpbmdzIG9uIHRoZSBjYWxlbmRhciB0aGF0IGhhdmUgbm90IGhhcHBlbmVkIHlldCcgfSxcbiAgICAgICAgY3VzdG9tZXJfbWludXRlczogeyB0aXRsZTogJ0N1c3RvbWVyIE1pbnV0ZXMnLCBkZXNjcmlwdGlvbjogJ1RvdGFsIHRpbWUgc3BlbnQgaW4gZnJvbnQgb2YgY3VzdG9tZXJzJyB9LFxuICAgICAgICB0YXNrc19jb21wbGV0ZWQ6IHsgdGl0bGU6ICdUYXNrcyBDb21wbGV0ZWQnLCBkZXNjcmlwdGlvbjogJ0ZvbGxvdy11cHMgY2xvc2VkIG91dCBcdTIwMTQgdGhlIG90aGVyIGhhbGYgb2YgYWN0aXZpdHknIH0sXG4gICAgICAgIGFjdGl2aXR5X2J5X3JlcDogeyB0aXRsZTogJ0FjdGl2aXR5IGJ5IFJlcCcsIGRlc2NyaXB0aW9uOiAnTG9nZ2VkIGludGVyYWN0aW9ucyBwZXIgb3duZXInIH0sXG4gICAgICAgIGFjdGl2aXR5X2J5X3dlZWs6IHsgdGl0bGU6ICdBY3Rpdml0eSBWb2x1bWUgYnkgV2VlaycsIGRlc2NyaXB0aW9uOiAnSW50ZXJhY3Rpb25zIHBlciB3ZWVrJyB9LFxuICAgICAgICBhY3Rpdml0eV9taXg6IHsgdGl0bGU6ICdBY3Rpdml0eSBNaXgnLCBkZXNjcmlwdGlvbjogJ0NhbGxzIHZzIG1lZXRpbmdzIHZzIGRlbW9zJyB9LFxuICAgICAgICBhY3Rpdml0eV9ieV9yZWNvcmRfdHlwZTogeyB0aXRsZTogJ1doZXJlIHRoZSBBY3Rpdml0eSBMYW5kcycsIGRlc2NyaXB0aW9uOiAnV2hpY2ggcGFydCBvZiB0aGUgZnVubmVsIGlzIGdldHRpbmcgYXR0ZW50aW9uJyB9LFxuICAgICAgICBkZWFsX2FjdGl2aXR5OiB7IHRpdGxlOiAnSW50ZXJhY3Rpb25zIG9uIERlYWxzJywgZGVzY3JpcHRpb246ICdMb2dnZWQgaW50ZXJhY3Rpb25zIGxpbmtlZCB0byBhbiBvcHBvcnR1bml0eScgfSxcbiAgICAgICAgb3Blbl9kZWFsc19mb3JfYWN0aXZpdHk6IHsgdGl0bGU6ICdPcGVuIERlYWxzJywgZGVzY3JpcHRpb246ICdPcHBvcnR1bml0aWVzIHN0aWxsIGluIHBsYXknIH0sXG4gICAgICAgIHF1aWV0X2FjY291bnRzXzMwOiB7IHRpdGxlOiAnUXVpZXQgMzArIERheXMnLCBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBhY2NvdW50cyB3aXRoIG5vIGxvZ2dlZCBpbnRlcmFjdGlvbiBpbiBhIG1vbnRoJyB9LFxuICAgICAgICBxdWlldF9hY2NvdW50c182MDogeyB0aXRsZTogJ1F1aWV0IDYwKyBEYXlzJywgZGVzY3JpcHRpb246ICdUd28gbW9udGhzIG9mIHNpbGVuY2UgXHUyMDE0IHRoZSBhdC1yaXNrIHRocmVzaG9sZCcgfSxcbiAgICAgICAgcXVpZXRfYWNjb3VudHNfOTA6IHsgdGl0bGU6ICdRdWlldCA5MCsgRGF5cycsIGRlc2NyaXB0aW9uOiAnQSBxdWFydGVyIHdpdGggbm8gY29udGFjdCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcm1fb3ZlcnZpZXdfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ0NSTSBPdmVydmlldycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1JldmVudWUgbWV0cmljcywgcGlwZWxpbmUgYW5hbHl0aWNzLCBhbmQgZGVhbCBpbnNpZ2h0cycsXG4gICAgICB3aWRnZXRzOiB7XG4gICAgICAgIHRvdGFsX3JldmVudWU6IHsgdGl0bGU6ICdUb3RhbCBSZXZlbnVlJywgZGVzY3JpcHRpb246ICdDbG9zZWQtd29uIHJldmVudWUgdGhpcyBwZXJpb2QnIH0sXG4gICAgICAgIGFjdGl2ZV9kZWFsczogeyB0aXRsZTogJ0FjdGl2ZSBEZWFscycsIGRlc2NyaXB0aW9uOiAnT3BlbiBvcHBvcnR1bml0aWVzIGluIHRoZSBwaXBlbGluZScgfSxcbiAgICAgICAgd29uX2RlYWxzOiB7IHRpdGxlOiAnV29uIERlYWxzJywgZGVzY3JpcHRpb246ICdDbG9zZWQtd29uIGRlYWxzIHRoaXMgcGVyaW9kJyB9LFxuICAgICAgICBhdmdfZGVhbF9zaXplOiB7IHRpdGxlOiAnQXZnIERlYWwgU2l6ZScsIGRlc2NyaXB0aW9uOiAnQXZlcmFnZSB2YWx1ZSBvZiBjbG9zZWQtd29uIGRlYWxzJyB9LFxuICAgICAgICByZXZlbnVlX3RyZW5kczogeyB0aXRsZTogJ1JldmVudWUgVHJlbmRzJywgZGVzY3JpcHRpb246ICdDbG9zZWQtd29uIHJldmVudWUgb3ZlciB0aGUgbGFzdCAxMiBtb250aHMnIH0sXG4gICAgICAgIGxlYWRfc291cmNlOiB7IHRpdGxlOiAnTGVhZCBTb3VyY2UnLCBkZXNjcmlwdGlvbjogJ1BpcGVsaW5lIHZhbHVlIGJ5IGFjcXVpc2l0aW9uIGNoYW5uZWwnIH0sXG4gICAgICAgIHBpcGVsaW5lX2J5X3N0YWdlOiB7IHRpdGxlOiAnUGlwZWxpbmUgYnkgU3RhZ2UnLCBkZXNjcmlwdGlvbjogJ09wZW4gb3Bwb3J0dW5pdHkgdmFsdWUgYXQgZWFjaCBzYWxlcyBzdGFnZScgfSxcbiAgICAgICAgdG9wX3Byb2R1Y3RzOiB7IHRpdGxlOiAnVG9wIFByb2R1Y3RzJywgZGVzY3JpcHRpb246ICdUb3RhbCBsaXN0LXByaWNlIHJldmVudWUgYnkgcHJvZHVjdCBjYXRlZ29yeScgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfb3duZXI6IHsgdGl0bGU6ICdQaXBlbGluZSBieSBPd25lcicsIGRlc2NyaXB0aW9uOiAnT3BlbiBwaXBlbGluZSB2YWx1ZSBhbmQgZGVhbCBjb3VudCBwZXIgc2FsZXMgcmVwJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGV4ZWN1dGl2ZV9kYXNoYm9hcmQ6IHtcbiAgICAgIGxhYmVsOiAnRXhlY3V0aXZlIE92ZXJ2aWV3JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSGlnaC1sZXZlbCByZXZlbnVlLCBjdXN0b21lciwgYW5kIHBpcGVsaW5lIEtQSXMgZm9yIGxlYWRlcnNoaXAnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICB0b3RhbF9yZXZlbnVlX3l0ZDogeyB0aXRsZTogJ1RvdGFsIFJldmVudWUgKFlURCknLCBkZXNjcmlwdGlvbjogJ0Nsb3NlZC13b24gcmV2ZW51ZSB0aGlzIHllYXInIH0sXG4gICAgICAgIHRvdGFsX2FjY291bnRzOiB7IHRpdGxlOiAnQWN0aXZlIEFjY291bnRzJywgZGVzY3JpcHRpb246ICdDdXN0b21lcnMgd2l0aCBhdCBsZWFzdCBvbmUgYWN0aXZlIHJlbGF0aW9uc2hpcCcgfSxcbiAgICAgICAgdG90YWxfY29udGFjdHM6IHsgdGl0bGU6ICdUb3RhbCBDb250YWN0cycsIGRlc2NyaXB0aW9uOiAnUGVvcGxlIGluIG91ciBhZGRyZXNzIGJvb2snIH0sXG4gICAgICAgIG9wZW5fbGVhZHM6IHsgdGl0bGU6ICdPcGVuIExlYWRzJywgZGVzY3JpcHRpb246ICdVbmNvbnZlcnRlZCBsZWFkcyBpbiB0aGUgZnVubmVsJyB9LFxuICAgICAgICByZXZlbnVlX3RyZW5kOiB7IHRpdGxlOiAnUmV2ZW51ZSBUcmVuZCcsIGRlc2NyaXB0aW9uOiAnQ2xvc2VkLXdvbiByZXZlbnVlIG92ZXIgdGhlIGxhc3QgMTIgbW9udGhzJyB9LFxuICAgICAgICByZXZlbnVlX2J5X2luZHVzdHJ5OiB7IHRpdGxlOiAnUmV2ZW51ZSBieSBJbmR1c3RyeScsIGRlc2NyaXB0aW9uOiAnWVREIGNsb3NlZC13b24gcmV2ZW51ZSBzcGxpdCBieSBjdXN0b21lciBpbmR1c3RyeScgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfc3RhZ2U6IHsgdGl0bGU6ICdQaXBlbGluZSBieSBTdGFnZScsIGRlc2NyaXB0aW9uOiAnT3BlbiBvcHBvcnR1bml0eSB2YWx1ZSBhdCBlYWNoIHNhbGVzIHN0YWdlJyB9LFxuICAgICAgICBuZXdfYWNjb3VudHNfYnlfbW9udGg6IHsgdGl0bGU6ICdOZXcgQWNjb3VudHMnLCBkZXNjcmlwdGlvbjogJ0FjY291bnQgY3JlYXRpb24gY2FkZW5jZSBcdTIwMTQgbGFzdCA2IG1vbnRocycgfSxcbiAgICAgICAgYWNjb3VudHNfYnlfaW5kdXN0cnk6IHsgdGl0bGU6ICdBY2NvdW50cyBieSBJbmR1c3RyeScsIGRlc2NyaXB0aW9uOiAnVG90YWwgYW5udWFsIHJldmVudWUgYW5kIGFjY291bnQgY291bnQgcGVyIGluZHVzdHJ5JyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHNhbGVzX2Rhc2hib2FyZDoge1xuICAgICAgbGFiZWw6ICdTYWxlcyBQZXJmb3JtYW5jZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1BpcGVsaW5lIGFuYWx5dGljcywgd2luIHJhdGUgdHJlbmRzLCBhbmQgcmVwIHBlcmZvcm1hbmNlJyxcbiAgICAgIHdpZGdldHM6IHtcbiAgICAgICAgdG90YWxfcGlwZWxpbmVfdmFsdWU6IHsgdGl0bGU6ICdUb3RhbCBQaXBlbGluZScsIGRlc2NyaXB0aW9uOiAnU3VtIG9mIG9wZW4gb3Bwb3J0dW5pdHkgdmFsdWUnIH0sXG4gICAgICAgIGNsb3NlZF93b25fcXRkOiB7IHRpdGxlOiAnQ2xvc2VkIFdvbiAoUVREKScsIGRlc2NyaXB0aW9uOiAnUmV2ZW51ZSBjbG9zZWQgdGhpcyBxdWFydGVyJyB9LFxuICAgICAgICBvcGVuX29wcG9ydHVuaXRpZXM6IHsgdGl0bGU6ICdPcGVuIE9wcG9ydHVuaXRpZXMnLCBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBkZWFscyBpbiBmbGlnaHQnIH0sXG4gICAgICAgIGF2Z19kZWFsX3NpemU6IHsgdGl0bGU6ICdBdmcgRGVhbCBTaXplJywgZGVzY3JpcHRpb246ICdBdmVyYWdlIHZhbHVlIG9mIGNsb3NlZC13b24gZGVhbHMgdGhpcyBxdWFydGVyJyB9LFxuICAgICAgICBwaXBlbGluZV9ieV9zdGFnZTogeyB0aXRsZTogJ1BpcGVsaW5lIGJ5IFN0YWdlJywgZGVzY3JpcHRpb246ICdPcGVuIG9wcG9ydHVuaXR5IHZhbHVlIGF0IGVhY2ggc2FsZXMgc3RhZ2UnIH0sXG4gICAgICAgIG1vbnRobHlfcmV2ZW51ZV90cmVuZDogeyB0aXRsZTogJ01vbnRobHkgUmV2ZW51ZSBUcmVuZCcsIGRlc2NyaXB0aW9uOiAnQ2xvc2VkLXdvbiByZXZlbnVlLCBsYXN0IDEyIG1vbnRocycgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfZm9yZWNhc3RfY2F0ZWdvcnk6IHsgdGl0bGU6ICdQaXBlbGluZSBieSBGb3JlY2FzdCBDYXRlZ29yeScsIGRlc2NyaXB0aW9uOiAnT3BlbiBwaXBlbGluZSBncm91cGVkIGJ5IHNhbGVzIGZvcmVjYXN0IGNhdGVnb3J5JyB9LFxuICAgICAgICBsZWFkX3NvdXJjZV9icmVha2Rvd246IHsgdGl0bGU6ICdMZWFkIFNvdXJjZScsIGRlc2NyaXB0aW9uOiAnV2hlcmUgb3VyIHBpcGVsaW5lIGlzIGNvbWluZyBmcm9tJyB9LFxuICAgICAgICBvcGVuX3BpcGVsaW5lX2J5X293bmVyOiB7IHRpdGxlOiAnT3BlbiBQaXBlbGluZSBieSBPd25lcicsIGRlc2NyaXB0aW9uOiAnSW4tZmxpZ2h0IHBpcGVsaW5lIHZhbHVlLCBkZWFsIGNvdW50IGFuZCBhdmcgd2luIHByb2JhYmlsaXR5IHBlciByZXAnIH0sXG4gICAgICAgIHF1b3RhX2F0dGFpbm1lbnRfYnlfcmVwOiB7IHRpdGxlOiAnUXVvdGEgQXR0YWlubWVudCBieSBSZXAnLCBkZXNjcmlwdGlvbjogJ0N1cnJlbnQtcXVhcnRlciBxdW90YSwgY2xvc2VkIHJldmVudWUgYW5kIGF0dGFpbm1lbnQgcGVyIHJlcCwgZnJvbSBmb3JlY2FzdCBzbmFwc2hvdHMnIH0sXG4gICAgICAgIHBpcGVsaW5lX3N0YWdlX2J5X3NvdXJjZTogeyB0aXRsZTogJ1BpcGVsaW5lIGJ5IFN0YWdlIFx1MDBENyBMZWFkIFNvdXJjZScsIGRlc2NyaXB0aW9uOiAnQ3Jvc3MtdGFiIG9mIG9wZW4gb3Bwb3J0dW5pdHkgYW1vdW50IGJ5IHN0YWdlIGFuZCBzb3VyY2UnIH0sXG4gICAgICAgIHdpbl9yYXRlXzEybTogeyB0aXRsZTogJ1dpbiBSYXRlICgxMk0pJywgZGVzY3JpcHRpb246ICdEZWFscyB3b24gYXMgYSBzaGFyZSBvZiBhbGwgZGVhbHMgc2V0dGxlZCBpbiB0aGUgbGFzdCAxMiBtb250aHMnIH0sXG4gICAgICAgIHdvbl9kZWFsc18xMm06IHsgdGl0bGU6ICdEZWFscyBXb24gKDEyTSknLCBkZXNjcmlwdGlvbjogJ1RoZSBudW1lcmF0b3Igb2YgdGhlIHdpbiByYXRlJyB9LFxuICAgICAgICBsb3N0X2RlYWxzXzEybTogeyB0aXRsZTogJ0RlYWxzIExvc3QgKDEyTSknLCBkZXNjcmlwdGlvbjogJ1RoZSBvdGhlciBoYWxmIG9mIHRoZSB3aW4tcmF0ZSBkZW5vbWluYXRvcicgfSxcbiAgICAgICAgd2luX3JhdGVfYnlfb3duZXI6IHsgdGl0bGU6ICdXaW4gLyBMb3NzIGJ5IFJlcCcsIGRlc2NyaXB0aW9uOiAnRGVhbHMgd29uLCBkZWFscyBsb3N0IGFuZCB3aW4gcmF0ZSBwZXIgcmVwIFx1MjAxNCBsYXN0IDEyIG1vbnRocycgfSxcbiAgICAgICAgd2luX3JhdGVfYnlfbGVhZF9zb3VyY2U6IHsgdGl0bGU6ICdXaW4gLyBMb3NzIGJ5IExlYWQgU291cmNlJywgZGVzY3JpcHRpb246ICdXaGljaCBzb3VyY2VzIHByb2R1Y2UgZGVhbHMgdGhhdCBhY3R1YWxseSBjbG9zZSBcdTIwMTQgbGFzdCAxMiBtb250aHMnIH0sXG4gICAgICAgIGxvc3NfcmVhc29uX2JyZWFrZG93bjogeyB0aXRsZTogJ1doeSBXZSBMb3NlJywgZGVzY3JpcHRpb246ICdMb3N0IGRlYWxzIGJ5IHJlYXNvbiBcdTIwMTQgbGFzdCAxMiBtb250aHMnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgc2VydmljZV9kYXNoYm9hcmQ6IHtcbiAgICAgIGxhYmVsOiAnQ3VzdG9tZXIgU2VydmljZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0Nhc2UgbG9hZCwgU0xBIGhlYWx0aCwgYW5kIHJlc29sdXRpb24gcGVyZm9ybWFuY2UnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICBvcGVuX2Nhc2VzOiB7IHRpdGxlOiAnT3BlbiBDYXNlcycsIGRlc2NyaXB0aW9uOiAnQ2FzZXMgdGhhdCBhcmUgbm90IHlldCBjbG9zZWQnIH0sXG4gICAgICAgIGNyaXRpY2FsX2Nhc2VzOiB7IHRpdGxlOiAnQ3JpdGljYWwgQ2FzZXMnLCBkZXNjcmlwdGlvbjogJ09wZW4gY2FzZXMgbWFya2VkIGFzIGNyaXRpY2FsIHByaW9yaXR5JyB9LFxuICAgICAgICBhdmdfcmVzb2x1dGlvbl90aW1lOiB7IHRpdGxlOiAnQXZnIFJlc29sdXRpb24gVGltZScsIGRlc2NyaXB0aW9uOiAnTWVhbiB0aW1lIHRvIGNsb3NlLCBpbiBob3VycycgfSxcbiAgICAgICAgc2xhX3Zpb2xhdGlvbnM6IHsgdGl0bGU6ICdTTEEgVmlvbGF0aW9ucycsIGRlc2NyaXB0aW9uOiAnQ2FzZXMgdGhhdCBicmVhY2hlZCB0aGVpciBTTEEnIH0sXG4gICAgICAgIGNhc2VzX2J5X3N0YXR1czogeyB0aXRsZTogJ0Nhc2VzIGJ5IFN0YXR1cycsIGRlc2NyaXB0aW9uOiAnV29ya2xvYWQgZGlzdHJpYnV0aW9uIGFjcm9zcyB0aGUgcGlwZWxpbmUnIH0sXG4gICAgICAgIGNhc2VzX2J5X3ByaW9yaXR5OiB7IHRpdGxlOiAnQ2FzZXMgYnkgUHJpb3JpdHknLCBkZXNjcmlwdGlvbjogJ09wZW4gY2FzZSBtaXggYnkgdXJnZW5jeScgfSxcbiAgICAgICAgY2FzZXNfYnlfb3JpZ2luOiB7IHRpdGxlOiAnQ2FzZXMgYnkgT3JpZ2luJywgZGVzY3JpcHRpb246ICdXaGVyZSBvdXIgY2FzZXMgYXJlIGNvbWluZyBmcm9tJyB9LFxuICAgICAgICBkYWlseV9jYXNlX3ZvbHVtZTogeyB0aXRsZTogJ0RhaWx5IENhc2UgVm9sdW1lJywgZGVzY3JpcHRpb246ICdOZXcgY2FzZXMgY3JlYXRlZCBvdmVyIHRoZSBsYXN0IDMwIGRheXMnIH0sXG4gICAgICAgIHNsYV9jb21wbGlhbmNlX2dhdWdlOiB7IHRpdGxlOiAnU0xBIENvbXBsaWFuY2UnLCBkZXNjcmlwdGlvbjogJ1BlcmNlbnQgb2YgY2FzZXMgcmVzb2x2ZWQgd2l0aGluIFNMQSB0aGlzIHBlcmlvZCcgfSxcbiAgICAgICAga2JfZGVmbGVjdGlvbl9yYXRlOiB7IHRpdGxlOiAnS0IgRGVmbGVjdGlvbiBSYXRlJywgZGVzY3JpcHRpb246ICdTaGFyZSBvZiBjbG9zZWQgY2FzZXMgcmVzb2x2ZWQgd2l0aCBhIGtub3dsZWRnZSBhcnRpY2xlJyB9LFxuICAgICAgICBrYl9yZXNvbHZlZF9jYXNlczogeyB0aXRsZTogJ1Jlc29sdmVkIGJ5IEtCJywgZGVzY3JpcHRpb246ICdDbG9zZWQgY2FzZXMgcG9pbnRpbmcgYXQgdGhlIGFydGljbGUgdGhhdCByZXNvbHZlZCB0aGVtJyB9LFxuICAgICAgICBjbG9zZWRfY2FzZXNfdG90YWw6IHsgdGl0bGU6ICdDbG9zZWQgQ2FzZXMnLCBkZXNjcmlwdGlvbjogJ1RoZSBkZW5vbWluYXRvciBiZWhpbmQgdGhlIGRlZmxlY3Rpb24gcmF0ZScgfSxcbiAgICAgICAgdG9wX3Jlc29sdmluZ19hcnRpY2xlczogeyB0aXRsZTogJ1RvcCBSZXNvbHZpbmcgQXJ0aWNsZXMnLCBkZXNjcmlwdGlvbjogJ0tub3dsZWRnZSBhcnRpY2xlcyByYW5rZWQgYnkgdGhlIGNsb3NlZCBjYXNlcyB0aGV5IHJlc29sdmVkJyB9LFxuICAgICAgICBteV9vcGVuX2Nhc2VzX2J5X3ByaW9yaXR5OiB7IHRpdGxlOiAnTXkgT3BlbiBDYXNlcyBieSBQcmlvcml0eScsIGRlc2NyaXB0aW9uOiAnWW91ciBvcGVuIGNhc2VzIGFuZCB0aGVpciBTTEEtdmlvbGF0aW9uIHJhdGUsIGJyb2tlbiBkb3duIGJ5IHByaW9yaXR5JyB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBwYWdlczoge1xuICAgIGFjY291bnRfZGV0YWlsX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBEZXRhaWwnLFxuICAgICAgZGVzY3JpcHRpb246ICdTbG90dGVkIGFjY291bnQgcmVjb3JkIHBhZ2UgXHUyMDE0IGN1c3RvbSBoZWFkZXIgKyBwZXJzaXN0ZW50IGRpc2N1c3Npb24gZmVlZC4nLFxuICAgICAgLy8gUmVxdWlyZWQsIHRob3VnaCBpdCBlcXVhbHMgdGhlIHBhZ2Ugc291cmNlOiBhIG1pc3NpbmcgYHRpdGxlYCBmYWxsc1xuICAgICAgLy8gYmFjayB0byBgbGFiZWxgLCBhbmQgdGhlIGhlYWRlciB0aGVuIHJlYWQgXCJBY2NvdW50IERldGFpbFwiIGluc3RlYWQgb2ZcbiAgICAgIC8vIHRoZSBhY2NvdW50J3MgbmFtZSAoIzIwNDIpLlxuICAgICAgdGl0bGU6ICd7bmFtZX0nLFxuICAgICAgc3VidGl0bGU6ICd7aW5kdXN0cnl9IFx1MDBCNyB7dHlwZX0nLFxuICAgIH0sXG4gICAgYWNjb3VudF93b3JrYmVuY2g6IHtcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBXb3JrYmVuY2gnLFxuICAgICAgZGVzY3JpcHRpb246ICdDdXJhdGVkIGFjY291bnQgbGlzdCBmb3IgdGhlIHNhbGVzIHRlYW06IHF1aWNrIGZpbHRlcnMgb25seSwgbm8gdmlldyBtYW5hZ2VtZW50LicsXG4gICAgfSxcbiAgICBhcHBfbGF1bmNoZXJfcGFnZToge1xuICAgICAgbGFiZWw6ICdBcHAgTGF1bmNoZXInLFxuICAgICAgZGVzY3JpcHRpb246ICdDZW50cmFsIGh1YiBmb3IgYWNjZXNzaW5nIGFsbCBhcHBsaWNhdGlvbnMnLFxuICAgICAgc3VidGl0bGU6ICdTZWxlY3QgYW4gYXBwIHRvIGdldCBzdGFydGVkJyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgYXBwX3NlYXJjaDogeyBsYWJlbDogJ1NlYXJjaCBBcHBzJyB9LFxuICAgICAgICBhcHBfZ3JpZDogeyBsYWJlbDogJ0FwcGxpY2F0aW9uIEdyaWQnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY2FzZV9kZXRhaWxfcGFnZToge1xuICAgICAgbGFiZWw6ICdDYXNlIERldGFpbCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NlcnZpY2UtYWdlbnQgY2FzZSByZWNvcmQ6IGhpZ2hsaWdodHMsIFNMQSBwYXRoLCBkZXRhaWxzIGFuZCBhY3Rpdml0eSB0aW1lbGluZS4nLFxuICAgICAgdGl0bGU6ICd7Y2FzZV9udW1iZXJ9IFx1MDBCNyB7c3ViamVjdH0nLFxuICAgICAgc3VidGl0bGU6ICd7Y3JtX2FjY291bnR9JyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgY2FzZV9oaWdobGlnaHRzOiB7IGxhYmVsOiAnS2V5IEluZm9ybWF0aW9uJyB9LFxuICAgICAgICBjYXNlX3N0YXR1c19wYXRoOiB7IGxhYmVsOiAnQ2FzZSBTdGF0dXMgUGF0aCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsZWFkX2RldGFpbF9wYWdlOiB7XG4gICAgICBsYWJlbDogJ0xlYWQgRGV0YWlsJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ29tcHJlaGVuc2l2ZSBsZWFkIGRldGFpbCBwYWdlIHdpdGggaGlnaGxpZ2h0cywgZGV0YWlscywgYW5kIHJlbGF0ZWQgaW5mb3JtYXRpb24nLFxuICAgICAgdGl0bGU6ICd7Zmlyc3RfbmFtZX0ge2xhc3RfbmFtZX0nLFxuICAgICAgc3VidGl0bGU6ICd7Y29tcGFueX0nLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBsZWFkX2R1cGxpY2F0ZV9hbGVydF9jb25maXJtZWQ6IHsgbGFiZWw6ICdDb25maXJtZWQgRHVwbGljYXRlIEFsZXJ0JyB9LFxuICAgICAgICBsZWFkX2R1cGxpY2F0ZV9hbGVydF9zdXNwZWN0ZWQ6IHsgbGFiZWw6ICdTdXNwZWN0ZWQgRHVwbGljYXRlIEFsZXJ0JyB9LFxuICAgICAgICBsZWFkX2hpZ2hsaWdodHM6IHsgbGFiZWw6ICdLZXkgSW5mb3JtYXRpb24nIH0sXG4gICAgICAgIGxlYWRfcGF0aDogeyBsYWJlbDogJ0xlYWQgU3RhdHVzIFBhdGgnIH0sXG4gICAgICAgIG1haW5fdGFiczogeyBsYWJlbDogJ0xlYWQgSW5mb3JtYXRpb24gVGFicycgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBvcHBvcnR1bml0eV9kZXRhaWxfcGFnZToge1xuICAgICAgbGFiZWw6ICdPcHBvcnR1bml0eSBEZXRhaWwnLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdDb21wcmVoZW5zaXZlIG9wcG9ydHVuaXR5IGRldGFpbCBwYWdlIHdpdGggcGF0aCwgaGlnaGxpZ2h0cywgZGV0YWlscywgYW5kIHJlbGF0ZWQgbGlzdHMnLFxuICAgICAgdGl0bGU6ICd7bmFtZX0nLFxuICAgICAgc3VidGl0bGU6ICd7Y3JtX2FjY291bnR9JyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgb3BwX2hpZ2hsaWdodHM6IHsgbGFiZWw6ICdLZXkgSW5mb3JtYXRpb24nIH0sXG4gICAgICAgIG9wcF9zdGFnZV9wYXRoOiB7IGxhYmVsOiAnT3Bwb3J0dW5pdHkgU3RhZ2UgUGF0aCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzYWxlc19ob21lX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnU2FsZXMgSG9tZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NhbGVzIHRlYW0gaG9tZSBwYWdlIHdpdGgga2V5IG1ldHJpY3MgYW5kIHF1aWNrIGFjdGlvbnMnLFxuICAgICAgdGl0bGU6ICdTYWxlcyBEYXNoYm9hcmQnLFxuICAgICAgc3VidGl0bGU6ICdXZWxjb21lIGJhY2snLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBxdWlja19jcmVhdGU6IHsgdGl0bGU6ICdRdWljayBDcmVhdGUnLCBsYWJlbDogJ1F1aWNrIENyZWF0ZScgfSxcbiAgICAgICAga2V5X21ldHJpY3M6IHsgdGl0bGU6ICdLZXkgUGVyZm9ybWFuY2UgSW5kaWNhdG9ycycsIGxhYmVsOiAnS2V5IE1ldHJpY3MnIH0sXG4gICAgICAgIGhvbWVfdGFiczogeyBsYWJlbDogJ0hvbWUgVGFicycgfSxcbiAgICAgICAgYWlfYnJpZWZpbmc6IHtcbiAgICAgICAgICB0aXRsZTogJ0FzayB0aGUgQUkgQXNzaXN0YW50JyxcbiAgICAgICAgICBsYWJlbDogJ1RvZGF5IHdpdGggdGhlIEFJIEFzc2lzdGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgIHVwY29taW5nX2V2ZW50czogeyB0aXRsZTogJ1VwY29taW5nIEV2ZW50cycsIGxhYmVsOiAnVXBjb21pbmcgRXZlbnRzJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHV0aWxpdHlfYmFyX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnVXRpbGl0eSBCYXInLFxuICAgICAgZGVzY3JpcHRpb246ICdRdWljayBhY2Nlc3MgdXRpbGl0eSBiYXIgd2l0aCBmbG9hdGluZyB0b29scycsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIG5vdGlmaWNhdGlvbnNfcGFuZWw6IHsgbGFiZWw6ICdOb3RpZmljYXRpb25zJyB9LFxuICAgICAgICBxdWlja19ub3RlczogeyB0aXRsZTogJ1F1aWNrIE5vdGVzJywgbGFiZWw6ICdRdWljayBOb3RlcycgfSxcbiAgICAgICAgcXVpY2tfc2VhcmNoOiB7IGxhYmVsOiAnUXVpY2sgU2VhcmNoJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9fc2hhcmVkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lblwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vX3NoYXJlZC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBFbmdsaXNoIChlbikgXHUyMDE0IHZhbHVlcyBzaGFyZWQgYnkgbW9yZSB0aGFuIG9uZSBwYXJ0IG9mIHRoaXMgYnVuZGxlLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICogRXZlcnl0aGluZyB0aGF0IGlzIG5vdCBgb2JqZWN0c2AgbGl2ZXMgaW4gYC4vYXBwLnRzYDsgYG9iamVjdHNgIFx1MjAxNCA2OS03OCUgb2ZcbiAqIGV2ZXJ5IGJ1bmRsZSBcdTIwMTQgaXMgb25lIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5LCBhbmQgYSBkZXRhaWwgb2JqZWN0XG4gKiBmb2xsb3dzIGl0cyBtYXN0ZXIuIEEgbmV3IHJvdyBnb2VzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LCBuZXZlciBpblxuICogd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuOiB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0IHRoZSA3MCVcbiAqIGFkdmlzb3J5IGJhbmQgYHBucG0gaHlnaWVuZWAgcHJpbnRzLiBGdWxsIHJ1bGUgYW5kIHJhdGlvbmFsZTpcbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuLnRzYC5cbiAqXG4gKiBFdmVyeSBjb25zdGFudCBoZXJlIGlzIHNwcmVhZCBpbnRvIG9iamVjdCByb3dzIHRoYXQgbGl2ZSBpbiBNT1JFIFRIQU4gT05FXG4gKiBmYW1pbHkgZmlsZSwgc28gaXQgY2Fubm90IHNpdCBpbiBhbnkgb25lIG9mIHRoZW0uIEEgdmFsdWUgdXNlZCBieSBleGFjdGx5XG4gKiBvbmUgZmFtaWx5IGxpdmVzIGluIHRoYXQgZmFtaWx5J3MgZmlsZSBpbnN0ZWFkIFx1MjAxNCB0aGF0IHNwbGl0IGlzIG1lY2hhbmljYWwsXG4gKiBub3QgYSBqdWRnZW1lbnQgY2FsbC5cbiAqL1xuXG4vKipcbiAqIFRoZSBhY3Rpdml0eSBmYW1pbHkgKCM1OTIpIFx1MjAxNCBgbG9nX2NhbGxgLCBgbG9nX21lZXRpbmdgIGFuZFxuICogYHNjaGVkdWxlX21lZXRpbmdgIGFyZSByZWdpc3RlcmVkIG9uY2UgUEVSIE9CSkVDVCAobGVhZCwgY29udGFjdCwgYWNjb3VudCxcbiAqIG9wcG9ydHVuaXR5LCBjYXNlKSwgYmVjYXVzZSBhIGJvZHkgYWN0aW9uIHdpdGggbm8gYG9iamVjdE5hbWVgIGxhbmRzIHVuZGVyIGFcbiAqIGRpc3BhdGNoZXIga2V5IG5vdGhpbmcgcHJvYmVzICgjNTA5KS4gVGhlIGxhYmVscyBhcmUgaWRlbnRpY2FsIG9uIGV2ZXJ5IG9uZVxuICogb2YgdGhlbSwgc28gdGhleSBhcmUgZGVjbGFyZWQgb25jZSBoZXJlIGFuZCBzcHJlYWQgaW50byBlYWNoIG9iamVjdCdzXG4gKiBgX2FjdGlvbnNgIFx1MjAxNCBmaWZ0ZWVuIGhhbmQtY29waWVkIGJsb2NrcyBwZXIgbG9jYWxlIGlzIGhvdyBhIHRyYW5zbGF0aW9uIHNldFxuICogZHJpZnRzLlxuICovXG5leHBvcnQgY29uc3QgYWN0aXZpdHlBY3Rpb25zID0ge1xuICBsb2dfY2FsbDoge1xuICAgIGxhYmVsOiAnTG9nIGEgQ2FsbCcsXG4gICAgc3VjY2Vzc01lc3NhZ2U6ICdDYWxsIGxvZ2dlZCBzdWNjZXNzZnVsbHkhJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN1YmplY3Q6IHsgbGFiZWw6ICdDYWxsIFN1YmplY3QnIH0sXG4gICAgICBkdXJhdGlvbjogeyBsYWJlbDogJ0R1cmF0aW9uIChtaW51dGVzKScgfSxcbiAgICAgIGF0dGVuZGVlX2NvbnRhY3RzOiB7IGxhYmVsOiAnQ29udGFjdCBBdHRlbmRlZXMnIH0sXG4gICAgICBhdHRlbmRlZV91c2VyczogeyBsYWJlbDogJ0ludGVybmFsIEF0dGVuZGVlcycgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnQ2FsbCBOb3RlcycgfSxcbiAgICB9LFxuICB9LFxuICBsb2dfbWVldGluZzoge1xuICAgIGxhYmVsOiAnTG9nIGEgTWVldGluZycsXG4gICAgc3VjY2Vzc01lc3NhZ2U6ICdNZWV0aW5nIGxvZ2dlZCBzdWNjZXNzZnVsbHkhJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN1YmplY3Q6IHsgbGFiZWw6ICdNZWV0aW5nIFN1YmplY3QnIH0sXG4gICAgICBkdXJhdGlvbjogeyBsYWJlbDogJ0R1cmF0aW9uIChtaW51dGVzKScgfSxcbiAgICAgIGF0dGVuZGVlX2NvbnRhY3RzOiB7IGxhYmVsOiAnQ29udGFjdCBBdHRlbmRlZXMnIH0sXG4gICAgICBhdHRlbmRlZV91c2VyczogeyBsYWJlbDogJ0ludGVybmFsIEF0dGVuZGVlcycgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnTWVldGluZyBOb3RlcycgfSxcbiAgICB9LFxuICB9LFxuICBzY2hlZHVsZV9tZWV0aW5nOiB7XG4gICAgbGFiZWw6ICdTY2hlZHVsZSBhIE1lZXRpbmcnLFxuICAgIHN1Y2Nlc3NNZXNzYWdlOiAnTWVldGluZyBzY2hlZHVsZWQhJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN1YmplY3Q6IHsgbGFiZWw6ICdNZWV0aW5nIFN1YmplY3QnIH0sXG4gICAgICBzdGFydF9kYXRlOiB7IGxhYmVsOiAnU3RhcnQgRGF0ZSAoVVRDKScgfSxcbiAgICAgIHN0YXJ0X3RpbWU6IHsgbGFiZWw6ICdTdGFydCBUaW1lIChVVEMpJyB9LFxuICAgICAgbG9jYXRpb246IHsgbGFiZWw6ICdMb2NhdGlvbicgfSxcbiAgICAgIGR1cmF0aW9uOiB7IGxhYmVsOiAnRHVyYXRpb24gKG1pbnV0ZXMpJyB9LFxuICAgICAgYXR0ZW5kZWVfY29udGFjdHM6IHsgbGFiZWw6ICdDb250YWN0IEF0dGVuZGVlcycgfSxcbiAgICAgIGF0dGVuZGVlX3VzZXJzOiB7IGxhYmVsOiAnSW50ZXJuYWwgQXR0ZW5kZWVzJyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdBZ2VuZGEnIH0sXG4gICAgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vb2JqZWN0cy5jdXN0b21lci50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW5cIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuL29iamVjdHMuY3VzdG9tZXIudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgT2JqZWN0VHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuaW1wb3J0IHsgYWN0aXZpdHlBY3Rpb25zIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLyoqXG4gKiBFbmdsaXNoIChlbikgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBDVVNUT01FUiBmYW1pbHk6XG4gKiB0aGUgY3VzdG9tZXIgcmVjb3JkIGl0c2VsZiBcdTIwMTQgYWNjb3VudHMgYW5kIHRoZSBwZW9wbGUgYXQgdGhlbS5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fYWNjb3VudGAsIGBjcm1fY29udGFjdGAuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4udHNgLlxuICovXG5leHBvcnQgY29uc3QgY3VzdG9tZXI6IFJlY29yZDxzdHJpbmcsIE9iamVjdFRyYW5zbGF0aW9uRGF0YT4gPSB7XG4gIGNybV9hY2NvdW50OiB7XG4gICAgbGFiZWw6ICdBY2NvdW50JyxcbiAgICBwbHVyYWxMYWJlbDogJ0FjY291bnRzJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGFjY291bnRfbnVtYmVyOiB7IGxhYmVsOiAnQWNjb3VudCBOdW1iZXInIH0sXG4gICAgICByZWdpc3RyYXRpb25fbnVtYmVyOiB7XG4gICAgICAgIGxhYmVsOiAnUmVnaXN0cmF0aW9uIE51bWJlcicsXG4gICAgICAgIGhlbHA6IFwiVGhlIGNvdW50ZXJwYXJ0eSdzIHJlZ2lzdGVyZWQgaWRlbnRpdHkgYXMgaXNzdWVkIGJ5IGl0cyBvd24gZ292ZXJubWVudCByZWdpc3RyeS4gTm90IHRoZSBBY2NvdW50IE51bWJlciwgd2hpY2ggd2UgaXNzdWUuXCIsXG4gICAgICB9LFxuICAgICAgY29tbWVyY2lhbF9jYXBhYmlsaXR5OiB7XG4gICAgICAgIGxhYmVsOiAnQ29tbWVyY2lhbCBDYXBhYmlsaXR5JyxcbiAgICAgICAgaGVscDogJ1doZXRoZXIgbmV3IGJ1c2luZXNzIG1heSBiZSBvcGVuZWQgYWdhaW5zdCB0aGlzIGFjY291bnQuIFNldHRsZW1lbnQgT25seSBhY2NvdW50cyBzdGF5IHVzYWJsZSBmb3IgYmlsbGluZyBhbmQgcGF5bWVudCwgYnV0IG5vIG5ldyBvcHBvcnR1bml0eSBtYXkgYmUgbGlua2VkIHRvIHRoZW0uJyxcbiAgICAgICAgb3B0aW9uczogeyBmdWxsOiAnRnVsbCcsIHNldHRsZW1lbnRfb25seTogJ1NldHRsZW1lbnQgT25seScgfSxcbiAgICAgIH0sXG4gICAgICBpbmN1bWJlbnRfdmVuZG9yOiB7IGxhYmVsOiAnSW5jdW1iZW50IFZlbmRvcicsIGhlbHA6ICdUaGUgc3VwcGxpZXIgY3VycmVudGx5IGhvbGRpbmcgdGhpcyBhY2NvdW50IGZvciB0aGUgc3BlbmQgd2UgYXJlIGNoYXNpbmcuJyB9LFxuICAgICAgYW5udWFsX3B1cmNoYXNpbmdfYnVkZ2V0OiB7IGxhYmVsOiAnQW5udWFsIFB1cmNoYXNpbmcgQnVkZ2V0JywgaGVscDogJ1doYXQgdGhpcyBhY2NvdW50IGV4cGVjdHMgdG8gc3BlbmQgd2l0aCB2ZW5kb3JzIHRoaXMgeWVhciBcdTIwMTQgbm90IGl0cyBvd24gcmV2ZW51ZS4nIH0sXG4gICAgICBwYXltZW50X2N5Y2xlOiB7XG4gICAgICAgIGxhYmVsOiAnUGF5bWVudCBDeWNsZScsXG4gICAgICAgIG9wdGlvbnM6IHsgcHJlcGFpZDogJ1ByZXBhaWQnLCBuZXRfMzA6ICdOZXQgMzAnLCBuZXRfNjA6ICdOZXQgNjAnLCBuZXRfOTA6ICdOZXQgOTAnIH0sXG4gICAgICB9LFxuICAgICAgYXBwcm92YWxfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnQXBwcm92YWwgU3RhdHVzJyxcbiAgICAgICAgaGVscDogJ1doZXJlIHRoaXMgYWNjb3VudCBzdGFuZHMgaW4gaXRzIHNpZ24tb2ZmLiBBIG5ldyBhY2NvdW50IHN0YXJ0cyBQZW5kaW5nIGFuZCBpcyBkZWNpZGVkIGluIHRoZSBhcHByb3ZhbCBpbmJveC4nLFxuICAgICAgICBvcHRpb25zOiB7IHBlbmRpbmc6ICdQZW5kaW5nJywgYXBwcm92ZWQ6ICdBcHByb3ZlZCcsIHJlamVjdGVkOiAnUmVqZWN0ZWQnIH0sXG4gICAgICB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ0FjY291bnQgTmFtZScsIGhlbHA6ICdMZWdhbCBuYW1lIG9mIHRoZSBjb21wYW55IG9yIG9yZ2FuaXphdGlvbicgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUeXBlJyxcbiAgICAgICAgb3B0aW9uczogeyBwcm9zcGVjdDogJ1Byb3NwZWN0JywgY3VzdG9tZXI6ICdDdXN0b21lcicsIHBhcnRuZXI6ICdQYXJ0bmVyJywgZm9ybWVyOiAnRm9ybWVyIEN1c3RvbWVyJyB9LFxuICAgICAgfSxcbiAgICAgIGluZHVzdHJ5OiB7XG4gICAgICAgIGxhYmVsOiAnSW5kdXN0cnknLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgdGVjaG5vbG9neTogJ1RlY2hub2xvZ3knLCBzb2Z0d2FyZTogJ1NvZnR3YXJlIC8gU2FhUycsIGZpbmFuY2U6ICdGaW5hbmNlJyxcbiAgICAgICAgICBoZWFsdGhjYXJlOiAnSGVhbHRoY2FyZScsIHJldGFpbDogJ1JldGFpbCcsIG1hbnVmYWN0dXJpbmc6ICdNYW51ZmFjdHVyaW5nJyxcbiAgICAgICAgICBlZHVjYXRpb246ICdFZHVjYXRpb24nLCByZWFsX2VzdGF0ZTogJ1JlYWwgRXN0YXRlJywgbWVkaWE6ICdNZWRpYSAmIEVudGVydGFpbm1lbnQnLFxuICAgICAgICAgIGxvZ2lzdGljczogJ0xvZ2lzdGljcycsIGhvc3BpdGFsaXR5OiAnSG9zcGl0YWxpdHknLCBlbmVyZ3k6ICdFbmVyZ3kgJiBVdGlsaXRpZXMnLFxuICAgICAgICAgIGdvdmVybm1lbnQ6ICdHb3Zlcm5tZW50Jywgbm9ucHJvZml0OiAnTm9uLXByb2ZpdCcsIG90aGVyOiAnT3RoZXInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFubnVhbF9yZXZlbnVlOiB7IGxhYmVsOiAnQW5udWFsIFJldmVudWUnIH0sXG4gICAgICBjaGlsZF9hY2NvdW50X3JldmVudWU6IHsgbGFiZWw6ICdDaGlsZCBBY2NvdW50IFJldmVudWUnLCBoZWxwOiAnU3VtIG9mIHRoZSBhbm51YWwgcmV2ZW51ZSBvZiB0aGUgZGlyZWN0IGNoaWxkcmVuIG9mIHRoaXMgYWNjb3VudC4nIH0sXG4gICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiB7IGxhYmVsOiAnTnVtYmVyIG9mIEVtcGxveWVlcycgfSxcbiAgICAgIHBob25lOiB7IGxhYmVsOiAnUGhvbmUnIH0sXG4gICAgICB3ZWJzaXRlOiB7IGxhYmVsOiAnV2Vic2l0ZScgfSxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBsYWJlbDogJ0JpbGxpbmcgQWRkcmVzcycgfSxcbiAgICAgIGJpbGxpbmdfY291bnRyeToge1xuICAgICAgICBsYWJlbDogJ0JpbGxpbmcgQ291bnRyeScsXG4gICAgICAgIGhlbHA6ICdEZXJpdmVkIGZyb20gQmlsbGluZyBBZGRyZXNzIFx1MjAxNCB0aGUgY291bnRyeSBleGFjdGx5IGFzIGVudGVyZWQsIHRyaW1tZWQgYW5kIHVwcGVyLWNhc2VkLicsXG4gICAgICB9LFxuICAgICAgdGVycml0b3J5OiB7XG4gICAgICAgIGxhYmVsOiAnVGVycml0b3J5JyxcbiAgICAgICAgaGVscDogJ0Rlcml2ZWQgZnJvbSBCaWxsaW5nIEFkZHJlc3MgXHUyMDE0IHRoZSBzYWxlcyB0ZXJyaXRvcnkgdGhlIHNoYXJpbmcgcnVsZXMgbWF0Y2ggb24uIEFjY291bnRzIG91dHNpZGUgdGhlIHN0YWZmZWQgdGVycml0b3JpZXMgYXJlIE90aGVyLicsXG4gICAgICAgIG9wdGlvbnM6IHsgbmE6ICdOb3J0aCBBbWVyaWNhJywgZW1lYTogJ0VNRUEnLCBvdGhlcjogJ090aGVyJyB9LFxuICAgICAgfSxcbiAgICAgIG9mZmljZV9sb2NhdGlvbjogeyBsYWJlbDogJ09mZmljZSBMb2NhdGlvbicgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnQWNjb3VudCBPd25lcicgfSxcbiAgICAgIHBhcmVudF9hY2NvdW50OiB7IGxhYmVsOiAnUGFyZW50IEFjY291bnQnLCBoZWxwOiAnUGFyZW50IGNvbXBhbnkgaW4gaGllcmFyY2h5JyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwdGlvbicgfSxcbiAgICAgIGlzX2FjdGl2ZTogeyBsYWJlbDogJ0FjdGl2ZScgfSxcbiAgICAgIGxhc3RfYWN0aXZpdHlfZGF0ZTogeyBsYWJlbDogJ0xhc3QgQWN0aXZpdHkgRGF0ZScgfSxcbiAgICAgIGJyYW5kX2NvbG9yOiB7IGxhYmVsOiAnQnJhbmQgQ29sb3InIH0sXG4gICAgICBsb2dvOiB7IGxhYmVsOiAnQ29tcGFueSBMb2dvJyB9LFxuICAgICAgdGllcjoge1xuICAgICAgICBsYWJlbDogJ0N1c3RvbWVyIFRpZXInLFxuICAgICAgICBvcHRpb25zOiB7IHN0cmF0ZWdpYzogJ1N0cmF0ZWdpYycsIGVudGVycHJpc2U6ICdFbnRlcnByaXNlJywgbWlkX21hcmtldDogJ01pZC1NYXJrZXQnLCBzbWI6ICdTTUInIH0sXG4gICAgICB9LFxuICAgICAgc2VnbWVudDoge1xuICAgICAgICBsYWJlbDogJ1NlZ21lbnQnLFxuICAgICAgICBvcHRpb25zOiB7IG5ldF9uZXc6ICdOZXQgTmV3JywgZ3Jvd3RoOiAnR3Jvd3RoJywgYXRfcmlzazogJ0F0IFJpc2snLCBzdGFibGU6ICdTdGFibGUnIH0sXG4gICAgICB9LFxuICAgICAgaGVhbHRoX3Njb3JlOiB7XG4gICAgICAgIGxhYmVsOiAnSGVhbHRoIFNjb3JlJyxcbiAgICAgICAgaGVscDogJ0NTTS1tYWludGFpbmVkIGhlYWx0aCBpbmRpY2F0b3InLFxuICAgICAgICBvcHRpb25zOiB7IGhlYWx0aHk6ICdIZWFsdGh5Jywgd2F0Y2hpbmc6ICdXYXRjaGluZycsIGF0X3Jpc2s6ICdBdCBSaXNrJywgY2h1cm5pbmc6ICdDaHVybmluZycgfSxcbiAgICAgIH0sXG4gICAgICBuYW1lX25vcm1hbGl6ZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdBY2NvdW50IE5hbWUgKE5vcm1hbGl6ZWQpJyxcbiAgICAgICAgaGVscDogJ01hdGNoIGtleSBmb3IgbGVhZCBjb252ZXJzaW9uOiBBY2NvdW50IE5hbWUgbG93ZXItY2FzZWQsIHRyaW1tZWQsIHdpdGggaW50ZXJuYWwgd2hpdGVzcGFjZSBjb2xsYXBzZWQuIE1haW50YWluZWQgYnkgdGhlIGFjY291bnRfcHJvdGVjdGlvbiBob29rIFx1MjAxNCBuZXZlciBlZGl0IGRpcmVjdGx5LicsXG4gICAgICB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ0Rpc3BsYXkgVGl0bGUnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9hY2NvdW50czogeyBsYWJlbDogJ0FsbCBBY2NvdW50cycsIGRlc2NyaXB0aW9uOiAnUHJpbWFyeSBhY2NvdW50IGxpc3Qgd2l0aCByZXZlbnVlICYgaW5kdXN0cnkgc3VtbWFyaWVzJyB9LFxuICAgICAgYWNjb3VudF9nYWxsZXJ5OiB7IGxhYmVsOiAnQWNjb3VudCBDYXJkcycsIGRlc2NyaXB0aW9uOiAnQnJhbmRlZCBhY2NvdW50IGNhcmRzIHdpdGggYnJhbmQtY29sb3IgaGlnaGxpZ2h0cycgfSxcbiAgICAgIGFjY291bnRfbWFwOiB7IGxhYmVsOiAnQWNjb3VudHMgYnkgTG9jYXRpb24nLCBkZXNjcmlwdGlvbjogJ0dlb3NwYXRpYWwgZGlzdHJpYnV0aW9uIG9mIGFjY291bnRzJyB9LFxuICAgICAgZW50ZXJwcmlzZV9hY2NvdW50czogeyBsYWJlbDogJ0VudGVycHJpc2UgQWNjb3VudHMnLCBkZXNjcmlwdGlvbjogJ0FjY291bnRzIHdpdGggdGhlIGhpZ2hlc3QgYW5udWFsIHJldmVudWUnIH0sXG4gICAgICBteV9hY2NvdW50czogeyBsYWJlbDogJ015IEFjY291bnRzJywgZGVzY3JpcHRpb246ICdBY2NvdW50cyBvd25lZCBieSB0aGUgY3VycmVudCB1c2VyJyB9LFxuICAgICAgYXRfcmlza19hY2NvdW50czogeyBsYWJlbDogJ1x1MjZBMFx1RkUwRiBBdC1SaXNrIEFjY291bnRzJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0Jhc2ljIEluZm9ybWF0aW9uJyB9LFxuICAgICAgZmluYW5jaWFsczogeyBsYWJlbDogJ0ZpbmFuY2lhbHMnIH0sXG4gICAgICBidXNpbmVzc19wcm9maWxlOiB7IGxhYmVsOiAnQnVzaW5lc3MgUHJvZmlsZScgfSxcbiAgICAgIGNvbnRhY3RfaW5mbzogeyBsYWJlbDogJ0NvbnRhY3QgSW5mb3JtYXRpb24nIH0sXG4gICAgICBvd25lcnNoaXA6IHsgbGFiZWw6ICdPd25lcnNoaXAgJiBTdGF0dXMnIH0sXG4gICAgICBicmFuZGluZzogeyBsYWJlbDogJ0JyYW5kaW5nJyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnU3lzdGVtJyB9LFxuICAgICAgLy8gRm9ybSBzZWN0aW9uIG5hbWVzIG9uIGFjY291bnQudmlldy50cyAoIzExMDApXG4gICAgICBwcm9maWxlOiB7IGxhYmVsOiAnUHJvZmlsZScgfSxcbiAgICAgIGN1c3RvbWVyX3N1Y2Nlc3M6IHsgbGFiZWw6ICdDdXN0b21lciBTdWNjZXNzJyB9LFxuICAgICAgbG9jYXRpb25zOiB7IGxhYmVsOiAnTG9jYXRpb25zJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwdGlvbicgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7IC4uLmFjdGl2aXR5QWN0aW9ucyB9LFxuICB9LFxuICBjcm1fY29udGFjdDoge1xuICAgIGxhYmVsOiAnQ29udGFjdCcsXG4gICAgcGx1cmFsTGFiZWw6ICdDb250YWN0cycsXG4gICAgZmllbGRzOiB7XG4gICAgICBzYWx1dGF0aW9uOiB7XG4gICAgICAgIGxhYmVsOiAnU2FsdXRhdGlvbicsXG4gICAgICAgIG9wdGlvbnM6IHsgbXI6ICdNci4nLCBtczogJ01zLicsIG1yczogJ01ycy4nLCBkcjogJ0RyLicsIHByb2Y6ICdQcm9mLicgfSxcbiAgICAgIH0sXG4gICAgICBmaXJzdF9uYW1lOiB7IGxhYmVsOiAnRmlyc3QgTmFtZScgfSxcbiAgICAgIGxhc3RfbmFtZTogeyBsYWJlbDogJ0xhc3QgTmFtZScgfSxcbiAgICAgIGZ1bGxfbmFtZTogeyBsYWJlbDogJ0Z1bGwgTmFtZScgfSxcbiAgICAgIGNybV9hY2NvdW50OiB7IGxhYmVsOiAnQWNjb3VudCcgfSxcbiAgICAgIGVtYWlsOiB7IGxhYmVsOiAnRW1haWwnIH0sXG4gICAgICBwaG9uZTogeyBsYWJlbDogJ1Bob25lJyB9LFxuICAgICAgbW9iaWxlOiB7IGxhYmVsOiAnTW9iaWxlJyB9LFxuICAgICAgdGl0bGU6IHsgbGFiZWw6ICdUaXRsZScgfSxcbiAgICAgIGRlcGFydG1lbnQ6IHtcbiAgICAgICAgbGFiZWw6ICdEZXBhcnRtZW50JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGV4ZWN1dGl2ZTogJ0V4ZWN1dGl2ZScsIHNhbGVzOiAnU2FsZXMnLCBtYXJrZXRpbmc6ICdNYXJrZXRpbmcnLFxuICAgICAgICAgIGVuZ2luZWVyaW5nOiAnRW5naW5lZXJpbmcnLCBzdXBwb3J0OiAnU3VwcG9ydCcsIGZpbmFuY2U6ICdGaW5hbmNlJyxcbiAgICAgICAgICBocjogJ0h1bWFuIFJlc291cmNlcycsIG9wZXJhdGlvbnM6ICdPcGVyYXRpb25zJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAvLyBCdXlpbmcgY2VudHJlIChSRVEtMDAwNCkgXHUyMDE0IHRoZSBkZWNpc2lvbiBtYXAuIEVuZ2xpc2ggaXMgdGhlIHNvdXJjZVxuICAgICAgLy8gd29yZGluZyBmb3IgdGhlIG9wdGlvbiBWQUxVRVM7IGV2ZXJ5IG90aGVyIHBhY2sgdHJhbnNsYXRlcyB0aGVzZS5cbiAgICAgIGJ1eWluZ19mdW5jdGlvbjoge1xuICAgICAgICBsYWJlbDogJ0J1eWluZyBGdW5jdGlvbicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkZWNpc2lvbl9tYWtlcjogJ0RlY2lzaW9uIE1ha2VyJywgZWNvbm9taWNfYnV5ZXI6ICdFY29ub21pYyBCdXllcicsXG4gICAgICAgICAgdGVjaG5pY2FsX2V2YWx1YXRvcjogJ1RlY2huaWNhbCBFdmFsdWF0b3InLCB1c2VyOiAnVXNlcicsXG4gICAgICAgICAgaW5mbHVlbmNlcjogJ0luZmx1ZW5jZXInLCBnYXRla2VlcGVyOiAnR2F0ZWtlZXBlcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXR0aXR1ZGU6IHtcbiAgICAgICAgbGFiZWw6ICdBdHRpdHVkZSB0byBVcycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjaGFtcGlvbjogJ0NoYW1waW9uJywgc3VwcG9ydGl2ZTogJ1N1cHBvcnRpdmUnLCBuZXV0cmFsOiAnTmV1dHJhbCcsXG4gICAgICAgICAgc2tlcHRpY2FsOiAnU2tlcHRpY2FsJywgYmxvY2tlcjogJ0Jsb2NrZXInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlbGF0aW9uc2hpcF9zdHJlbmd0aDoge1xuICAgICAgICBsYWJlbDogJ1JlbGF0aW9uc2hpcCBTdHJlbmd0aCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkaXN0YW50OiAnRGlzdGFudCcsIGFjcXVhaW50YW5jZTogJ0FjcXVhaW50YW5jZScsIHdvcmtpbmc6ICdXb3JraW5nIFJlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgc3Ryb25nOiAnU3Ryb25nJywgdHJ1c3RlZF9hZHZpc29yOiAnVHJ1c3RlZCBBZHZpc29yJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ0NvbnRhY3QgT3duZXInIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXB0aW9uJyB9LFxuICAgICAgaXNfcHJpbWFyeTogeyBsYWJlbDogJ1ByaW1hcnkgQ29udGFjdCcsIGhlbHA6ICdJcyB0aGlzIHRoZSBtYWluIGNvbnRhY3QgZm9yIHRoZSBhY2NvdW50PycgfSxcbiAgICAgIGF2YXRhcjogeyBsYWJlbDogJ1Byb2ZpbGUgUGljdHVyZScgfSxcbiAgICAgIG1haWxpbmdfYWRkcmVzczogeyBsYWJlbDogJ01haWxpbmcgQWRkcmVzcycgfSxcbiAgICAgIGxlYWRfc291cmNlOiB7XG4gICAgICAgIGxhYmVsOiAnTGVhZCBTb3VyY2UnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgd2ViOiAnV2ViJywgcmVmZXJyYWw6ICdSZWZlcnJhbCcsIGV2ZW50OiAnRXZlbnQgLyBUcmFkZSBTaG93JyxcbiAgICAgICAgICB3ZWJpbmFyOiAnV2ViaW5hcicsIHBhcnRuZXI6ICdQYXJ0bmVyJywgYWR2ZXJ0aXNlbWVudDogJ0FkdmVydGlzZW1lbnQnLFxuICAgICAgICAgIHBhaWRfc2VhcmNoOiAnUGFpZCBTZWFyY2gnLCBzb2NpYWw6ICdTb2NpYWwgTWVkaWEnLCBjb250ZW50OiAnQ29udGVudCAvIEJsb2cnLFxuICAgICAgICAgIGNvbGRfY2FsbDogJ0NvbGQgQ2FsbCcsIGVtYWlsX2NhbXBhaWduOiAnRW1haWwgQ2FtcGFpZ24nLCBvdGhlcjogJ090aGVyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBkb19ub3RfY2FsbDogeyBsYWJlbDogJ0RvIE5vdCBDYWxsJyB9LFxuICAgICAgZW1haWxfb3B0X291dDogeyBsYWJlbDogJ0VtYWlsIE9wdCBPdXQnIH0sXG4gICAgICBsYXN0X2NvbnRhY3RlZF9kYXRlOiB7IGxhYmVsOiAnTGFzdCBDb250YWN0ZWQnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9jb250YWN0czogeyBsYWJlbDogJ0FsbCBDb250YWN0cycgfSxcbiAgICAgIGNvbnRhY3RfZGlyZWN0b3J5OiB7IGxhYmVsOiAnUGVvcGxlIERpcmVjdG9yeScgfSxcbiAgICAgIHByaW1hcnlfY29udGFjdHM6IHsgbGFiZWw6ICdQcmltYXJ5IENvbnRhY3RzJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBpZGVudGl0eTogeyBsYWJlbDogJ0lkZW50aXR5JyB9LFxuICAgICAgYWNjb3VudF9pbmZvOiB7IGxhYmVsOiAnQWNjb3VudCAmIFRpdGxlJyB9LFxuICAgICAgYnV5aW5nX2NlbnRyZTogeyBsYWJlbDogJ0J1eWluZyBDZW50cmUnIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdDb250YWN0IEluZm9ybWF0aW9uJyB9LFxuICAgICAgbWFpbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnTWFpbGluZyBBZGRyZXNzJyB9LFxuICAgICAgYWRkaXRpb25hbDogeyBsYWJlbDogJ0FkZGl0aW9uYWwgSW5mbycgfSxcbiAgICAgIHByZWZlcmVuY2VzOiB7IGxhYmVsOiAnQ29tbXVuaWNhdGlvbiBQcmVmZXJlbmNlcycgfSxcbiAgICAgIC8vIEZvcm0gc2VjdGlvbiBuYW1lcyBvbiBjb250YWN0LnZpZXcudHMgKCMxMTAwKS4gYGNvbnRhY3RfZGV0YWlsc2AgL1xuICAgICAgLy8gYGNvbW1fcHJlZmVyZW5jZXNgLCBub3QgYGNvbnRhY3RfaW5mb2AgLyBgcHJlZmVyZW5jZXNgIFx1MjAxNCB0aG9zZSBhcmVcbiAgICAgIC8vIGFscmVhZHkgZmllbGRHcm91cCBrZXlzIHdpdGggdGhlaXIgb3duIChsb25nZXIpIHdvcmRpbmcgYWJvdmUuXG4gICAgICBjb250YWN0X2RldGFpbHM6IHsgbGFiZWw6ICdDb250YWN0IEluZm8nIH0sXG4gICAgICBjb21tX3ByZWZlcmVuY2VzOiB7IGxhYmVsOiAnUHJlZmVyZW5jZXMnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgbWFya19wcmltYXJ5OiB7XG4gICAgICAgIGxhYmVsOiAnTWFyayBhcyBQcmltYXJ5IENvbnRhY3QnLFxuICAgICAgICBjb25maXJtVGV4dDogJ01hcmsgdGhpcyBjb250YWN0IGFzIHRoZSBwcmltYXJ5IGNvbnRhY3QgZm9yIHRoZSBhY2NvdW50PycsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnQ29udGFjdCBtYXJrZWQgYXMgcHJpbWFyeSEnLFxuICAgICAgfSxcbiAgICAgIHNlbmRfZW1haWw6IHtcbiAgICAgICAgbGFiZWw6ICdTZW5kIEVtYWlsJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1N1YmplY3QnIH0sXG4gICAgICAgICAgYm9keTogeyBsYWJlbDogJ0JvZHknIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYWRkX2NvbnRhY3RfdG9fY2FtcGFpZ246IHtcbiAgICAgICAgbGFiZWw6ICdBZGQgdG8gQ2FtcGFpZ24nLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ0NvbnRhY3RzIGFkZGVkIHRvIGNhbXBhaWduIScsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGNybV9jYW1wYWlnbjogeyBsYWJlbDogJ0NhbXBhaWduJyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9vYmplY3RzLnBpcGVsaW5lLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lblwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vb2JqZWN0cy5waXBlbGluZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG5pbXBvcnQgeyBhY3Rpdml0eUFjdGlvbnMgfSBmcm9tICcuL19zaGFyZWQnO1xuXG4vKipcbiAqIEVuZ2xpc2ggKGVuKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIFBJUEVMSU5FIGZhbWlseTpcbiAqIGRlbWFuZCBhbmQgdGhlIGRlYWxzIGl0IGJlY29tZXMsIHBsdXMgdGhlIHJvbGwtdXAgdGhhdCBmb3JlY2FzdHMgdGhlbS5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fbGVhZGAsIGBjcm1fb3Bwb3J0dW5pdHlgLCBgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbWAsIGBjcm1fZm9yZWNhc3RgLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICogRXZlcnl0aGluZyB0aGF0IGlzIG5vdCBgb2JqZWN0c2AgbGl2ZXMgaW4gYC4vYXBwLnRzYDsgYG9iamVjdHNgIFx1MjAxNCA2OS03OCUgb2ZcbiAqIGV2ZXJ5IGJ1bmRsZSBcdTIwMTQgaXMgb25lIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5LCBhbmQgYSBkZXRhaWwgb2JqZWN0XG4gKiBmb2xsb3dzIGl0cyBtYXN0ZXIuIEEgbmV3IHJvdyBnb2VzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LCBuZXZlciBpblxuICogd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuOiB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0IHRoZSA3MCVcbiAqIGFkdmlzb3J5IGJhbmQgYHBucG0gaHlnaWVuZWAgcHJpbnRzLiBGdWxsIHJ1bGUgYW5kIHJhdGlvbmFsZTpcbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuLnRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHBpcGVsaW5lOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fbGVhZDoge1xuICAgIGxhYmVsOiAnTGVhZCcsXG4gICAgcGx1cmFsTGFiZWw6ICdMZWFkcycsXG4gICAgZmllbGRzOiB7XG4gICAgICBmaXJzdF9uYW1lOiB7IGxhYmVsOiAnRmlyc3QgTmFtZScgfSxcbiAgICAgIGxhc3RfbmFtZTogeyBsYWJlbDogJ0xhc3QgTmFtZScgfSxcbiAgICAgIGNvbXBhbnk6IHsgbGFiZWw6ICdDb21wYW55JyB9LFxuICAgICAgdGl0bGU6IHsgbGFiZWw6ICdUaXRsZScgfSxcbiAgICAgIGVtYWlsOiB7IGxhYmVsOiAnRW1haWwnIH0sXG4gICAgICBwaG9uZTogeyBsYWJlbDogJ1Bob25lJyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnU3RhdHVzJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ldzogJ05ldycsIGNvbnRhY3RlZDogJ0NvbnRhY3RlZCcsIHF1YWxpZmllZDogJ1F1YWxpZmllZCcsXG4gICAgICAgICAgdW5xdWFsaWZpZWQ6ICdVbnF1YWxpZmllZCcsIGNvbnZlcnRlZDogJ0NvbnZlcnRlZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbGVhZF9zb3VyY2U6IHtcbiAgICAgICAgbGFiZWw6ICdMZWFkIFNvdXJjZScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB3ZWI6ICdXZWInLCByZWZlcnJhbDogJ1JlZmVycmFsJywgZXZlbnQ6ICdFdmVudCAvIFRyYWRlIFNob3cnLFxuICAgICAgICAgIHdlYmluYXI6ICdXZWJpbmFyJywgcGFydG5lcjogJ1BhcnRuZXInLCBhZHZlcnRpc2VtZW50OiAnQWR2ZXJ0aXNlbWVudCcsXG4gICAgICAgICAgcGFpZF9zZWFyY2g6ICdQYWlkIFNlYXJjaCcsIHNvY2lhbDogJ1NvY2lhbCBNZWRpYScsIGNvbnRlbnQ6ICdDb250ZW50IC8gQmxvZycsXG4gICAgICAgICAgY29sZF9jYWxsOiAnQ29sZCBDYWxsJywgZW1haWxfY2FtcGFpZ246ICdFbWFpbCBDYW1wYWlnbicsIG90aGVyOiAnT3RoZXInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnTGVhZCBPd25lcicgfSxcbiAgICAgIGlzX2NvbnZlcnRlZDogeyBsYWJlbDogJ0NvbnZlcnRlZCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcHRpb24nIH0sXG4gICAgICBzYWx1dGF0aW9uOiB7XG4gICAgICAgIGxhYmVsOiAnU2FsdXRhdGlvbicsXG4gICAgICAgIG9wdGlvbnM6IHsgbXI6ICdNci4nLCBtczogJ01zLicsIG1yczogJ01ycy4nLCBkcjogJ0RyLicsIHByb2Y6ICdQcm9mLicgfSxcbiAgICAgIH0sXG4gICAgICBmdWxsX25hbWU6IHsgbGFiZWw6ICdGdWxsIE5hbWUnIH0sXG4gICAgICBpbmR1c3RyeToge1xuICAgICAgICBsYWJlbDogJ0luZHVzdHJ5JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHRlY2hub2xvZ3k6ICdUZWNobm9sb2d5Jywgc29mdHdhcmU6ICdTb2Z0d2FyZSAvIFNhYVMnLCBmaW5hbmNlOiAnRmluYW5jZScsXG4gICAgICAgICAgaGVhbHRoY2FyZTogJ0hlYWx0aGNhcmUnLCByZXRhaWw6ICdSZXRhaWwnLCBtYW51ZmFjdHVyaW5nOiAnTWFudWZhY3R1cmluZycsXG4gICAgICAgICAgZWR1Y2F0aW9uOiAnRWR1Y2F0aW9uJywgcmVhbF9lc3RhdGU6ICdSZWFsIEVzdGF0ZScsIG1lZGlhOiAnTWVkaWEgJiBFbnRlcnRhaW5tZW50JyxcbiAgICAgICAgICBsb2dpc3RpY3M6ICdMb2dpc3RpY3MnLCBob3NwaXRhbGl0eTogJ0hvc3BpdGFsaXR5JywgZW5lcmd5OiAnRW5lcmd5ICYgVXRpbGl0aWVzJyxcbiAgICAgICAgICBnb3Zlcm5tZW50OiAnR292ZXJubWVudCcsIG5vbnByb2ZpdDogJ05vbi1wcm9maXQnLCBvdGhlcjogJ090aGVyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtb2JpbGU6IHsgbGFiZWw6ICdNb2JpbGUnIH0sXG4gICAgICB3ZWJzaXRlOiB7IGxhYmVsOiAnV2Vic2l0ZScgfSxcbiAgICAgIHJhdGluZzogeyBsYWJlbDogJ0xlYWQgU2NvcmUnLCBoZWxwOiAnTGVhZCBxdWFsaXR5IHNjb3JlICgxLTUgc3RhcnMpJyB9LFxuICAgICAgY29udmVydGVkX2FjY291bnQ6IHsgbGFiZWw6ICdDb252ZXJ0ZWQgQWNjb3VudCcgfSxcbiAgICAgIGNvbnZlcnRlZF9jb250YWN0OiB7IGxhYmVsOiAnQ29udmVydGVkIENvbnRhY3QnIH0sXG4gICAgICBjb252ZXJ0ZWRfb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdDb252ZXJ0ZWQgT3Bwb3J0dW5pdHknIH0sXG4gICAgICBjb252ZXJ0ZWRfZGF0ZTogeyBsYWJlbDogJ0NvbnZlcnRlZCBEYXRlJyB9LFxuICAgICAgYWRkcmVzczogeyBsYWJlbDogJ0FkZHJlc3MnIH0sXG4gICAgICBhbm51YWxfcmV2ZW51ZTogeyBsYWJlbDogJ0FubnVhbCBSZXZlbnVlJyB9LFxuICAgICAgbnVtYmVyX29mX2VtcGxveWVlczogeyBsYWJlbDogJ051bWJlciBvZiBFbXBsb3llZXMnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ05vdGVzJywgaGVscDogJ1dvcmtpbmcgbm90ZXMgb24gdGhpcyBsZWFkIFx1MjAxNCBzdXBwb3J0cyBmb3JtYXR0aW5nLicgfSxcbiAgICAgIGRvX25vdF9jYWxsOiB7IGxhYmVsOiAnRG8gTm90IENhbGwnIH0sXG4gICAgICBlbWFpbF9vcHRfb3V0OiB7IGxhYmVsOiAnRW1haWwgT3B0IE91dCcgfSxcbiAgICAgIGRpc3F1YWxpZmljYXRpb25fcmVhc29uOiB7XG4gICAgICAgIGxhYmVsOiAnRGlzcXVhbGlmaWNhdGlvbiBSZWFzb24nLFxuICAgICAgICBoZWxwOiAnUmVxdWlyZWQgd2hlbiBzdGF0dXMgaXMgVW5xdWFsaWZpZWQnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbm90X2FfZml0OiAnTm90IGEgRml0Jywgbm9fYnVkZ2V0OiAnTm8gQnVkZ2V0Jywgd3JvbmdfcGVyc29uYTogJ1dyb25nIFBlcnNvbmEnLFxuICAgICAgICAgIHVucmVhY2hhYmxlOiAnVW5yZWFjaGFibGUnLCBkdXBsaWNhdGU6ICdEdXBsaWNhdGUnLCBjb21wZXRpdG9yOiAnQ29tcGV0aXRvcicsXG4gICAgICAgICAgb3RoZXI6ICdPdGhlcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZHVwbGljYXRlX29mX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdEdXBsaWNhdGUgT2YnLFxuICAgICAgICBoZWxwOiAnV2hpY2ggb2JqZWN0IGhvbGRzIHRoZSBzdXJ2aXZpbmcgcmVjb3JkIHRoaXMgbGVhZCByZXBlYXRzLicsXG4gICAgICAgIC8vIGBlcmFzZWRgIGlzIGEgdG9tYnN0b25lLCBub3QgYSBjaG9pY2U6IHRoZSBmb3JtIGRvZXMgbm90IG9mZmVyIGl0XG4gICAgICAgIC8vIChzZWUgYHNyYy9zYWxlcy92aWV3cy9sZWFkLnZpZXcudHNgKSwgYnV0IGEgbGVhZCB3aG9zZSBzdXJ2aXZvciB3YXNcbiAgICAgICAgLy8gZGVsZXRlZCBjYXJyaWVzIGl0LCBzbyBpdCBuZWVkcyBhIGxhYmVsIHdoZXJldmVyIHRoZSByZWNvcmQgaXNcbiAgICAgICAgLy8gUkVBRCBcdTIwMTQgZGV0YWlsIHBhZ2UsIGxpc3QgY29sdW1uLCBleHBvcnQuIFVudHJhbnNsYXRlZCBpdCB3b3VsZFxuICAgICAgICAvLyByZW5kZXIgYXMgdGhlIHJhdyBgZXJhc2VkYC5cbiAgICAgICAgb3B0aW9uczogeyBjcm1fbGVhZDogJ0xlYWQnLCBjcm1fY29udGFjdDogJ0NvbnRhY3QnLCBlcmFzZWQ6ICdFcmFzZWQgUmVjb3JkJyB9LFxuICAgICAgfSxcbiAgICAgIGR1cGxpY2F0ZV9vZl9sZWFkOiB7IGxhYmVsOiAnRHVwbGljYXRlIE9mIExlYWQnIH0sXG4gICAgICBkdXBsaWNhdGVfb2ZfY29udGFjdDogeyBsYWJlbDogJ0R1cGxpY2F0ZSBPZiBDb250YWN0JyB9LFxuICAgICAgZHVwbGljYXRlX3N0YXR1czoge1xuICAgICAgICBsYWJlbDogJ0R1cGxpY2F0ZSBTdGF0dXMnLFxuICAgICAgICBoZWxwOiAnU3VzcGVjdGVkID0gZmxhZ2dlZCBhdXRvbWF0aWNhbGx5IGF0IGludGFrZS4gQ29uZmlybWVkID0gYSBodW1hbiB2ZXJpZmllZCB0aGUgbWF0Y2guJyxcbiAgICAgICAgb3B0aW9uczogeyBzdXNwZWN0ZWQ6ICdTdXNwZWN0ZWQnLCBjb25maXJtZWQ6ICdDb25maXJtZWQnIH0sXG4gICAgICB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ0Rpc3BsYXkgVGl0bGUnIH0sXG4gICAgICBjb21wYW55X25vcm1hbGl6ZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdDb21wYW55IChOb3JtYWxpemVkKScsXG4gICAgICAgIGhlbHA6ICdNYXRjaCBrZXkgZm9yIGxlYWQgY29udmVyc2lvbjogQ29tcGFueSBsb3dlci1jYXNlZCwgdHJpbW1lZCwgd2l0aCBpbnRlcm5hbCB3aGl0ZXNwYWNlIGNvbGxhcHNlZC4gTWFpbnRhaW5lZCBieSB0aGUgbGVhZF9kdXBsaWNhdGVfY2hlY2sgaG9vayBcdTIwMTQgbmV2ZXIgZWRpdCBkaXJlY3RseS4nLFxuICAgICAgfSxcbiAgICAgIG5leHRfZm9sbG93dXBfZGF0ZTogeyBsYWJlbDogJ05leHQgRm9sbG93LXVwIERhdGUnIH0sXG4gICAgICBsYXN0X2NvbnRhY3RlZF9kYXRlOiB7IGxhYmVsOiAnTGFzdCBDb250YWN0ZWQnIH0sXG4gICAgICBuZWVkX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdOZWVkIFR5cGUnLFxuICAgICAgICBoZWxwOiAnV2hhdCB0aGlzIHByb3NwZWN0IGlzIGFza2luZyBmb3IuIFJvdXRpbmcsIHByaW9yaXRpc2F0aW9uIGFuZCBkZW1hbmQgcmVwb3J0aW5nIHJlYWQgdGhpcy4nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbmV3X2ltcGxlbWVudGF0aW9uOiAnTmV3IEltcGxlbWVudGF0aW9uJywgZXhwYW5zaW9uOiAnRXhwYW5zaW9uJyxcbiAgICAgICAgICByZXBsYWNlbWVudDogJ1JlcGxhY2VtZW50JywgcmVuZXdhbDogJ1JlbmV3YWwnLCBjb25zdWx0aW5nOiAnQ29uc3VsdGluZycsXG4gICAgICAgICAgc3VwcG9ydDogJ1N1cHBvcnQgJiBNYWludGVuYW5jZScsIG90aGVyOiAnT3RoZXInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGVzdGltYXRlZF9hbW91bnQ6IHtcbiAgICAgICAgbGFiZWw6ICdFc3RpbWF0ZWQgQW1vdW50JyxcbiAgICAgICAgaGVscDogJ0VzdGltYXRlZCB2YWx1ZSBvZiB0aGlzIGRlbWFuZCwgYmVmb3JlIHF1YWxpZmljYXRpb24uIFByZWZpbGxzIHRoZSBkZWFsIGFtb3VudCBhdCBjb252ZXJzaW9uLicsXG4gICAgICB9LFxuICAgICAgY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdDb252ZXJzaW9uIEFwcHJvdmFsJyxcbiAgICAgICAgaGVscDogJ1doZXRoZXIgdGhpcyBsZWFkIGhhcyBiZWVuIHNpZ25lZCBvZmYgZm9yIGNvbnZlcnNpb24uIE5vdCBSZXF1aXJlZCBtZWFucyBubyBhcHByb3ZhbCBpcyBhc2tlZCBmb3IgXHUyMDE0IHRoZSBzaGlwcGVkIGRlZmF1bHQuJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5vdF9yZXF1aXJlZDogJ05vdCBSZXF1aXJlZCcsIHBlbmRpbmc6ICdQZW5kaW5nJyxcbiAgICAgICAgICBhcHByb3ZlZDogJ0FwcHJvdmVkJywgcmVqZWN0ZWQ6ICdSZWplY3RlZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfbGVhZHM6IHtcbiAgICAgICAgbGFiZWw6ICdBbGwgTGVhZHMnLFxuICAgICAgICBlbXB0eVN0YXRlOiB7IHRpdGxlOiAnTm8gTGVhZHMgWWV0JywgbWVzc2FnZTogJ0dldCBzdGFydGVkIGJ5IGNyZWF0aW5nIHlvdXIgZmlyc3QgbGVhZCcgfSxcbiAgICAgIH0sXG4gICAgICBrYW5iYW5fYnlfc3RhdHVzOiB7IGxhYmVsOiAnTGVhZCBQaXBlbGluZScgfSxcbiAgICAgIGNhbGVuZGFyX2J5X2NyZWF0ZWQ6IHsgbGFiZWw6ICdMZWFkIENhbGVuZGFyJyB9LFxuICAgICAgZ2FsbGVyeV92aWV3OiB7IGxhYmVsOiAnTGVhZCBDYXJkcycgfSxcbiAgICAgIG15X2xlYWRzOiB7IGxhYmVsOiAnTXkgTGVhZHMnIH0sXG4gICAgICBoaWdoX3ByaW9yaXR5OiB7IGxhYmVsOiAnSGlnaCBQcmlvcml0eScgfSxcbiAgICAgIGhvdF9sZWFkczogeyBsYWJlbDogJ1x1RDgzRFx1REQyNSBIb3QgTGVhZHMnIH0sXG4gICAgICBzdXNwZWN0ZWRfZHVwbGljYXRlczoge1xuICAgICAgICBsYWJlbDogJ1N1c3BlY3RlZCBEdXBsaWNhdGVzJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnTm8gU3VzcGVjdGVkIER1cGxpY2F0ZXMnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdOb3RoaW5nIHRvIHJldmlldyBcdTIwMTQgZXZlcnkgcmUtY2FwdHVyZWQgZW1haWwgaGFzIGJlZW4gY2hlY2tlZC4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgaWRlbnRpdHk6IHsgbGFiZWw6ICdJZGVudGl0eScgfSxcbiAgICAgIGNvbXBhbnlfaW5mbzogeyBsYWJlbDogJ0NvbXBhbnkgSW5mb3JtYXRpb24nIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdDb250YWN0IEluZm9ybWF0aW9uJyB9LFxuICAgICAgcXVhbGlmaWNhdGlvbjogeyBsYWJlbDogJ1F1YWxpZmljYXRpb24nIH0sXG4gICAgICBhc3NpZ25tZW50OiB7IGxhYmVsOiAnQXNzaWdubWVudCcgfSxcbiAgICAgIGFkZHJlc3M6IHsgbGFiZWw6ICdBZGRyZXNzJyB9LFxuICAgICAgYWRkaXRpb25hbDogeyBsYWJlbDogJ0FkZGl0aW9uYWwgSW5mbycgfSxcbiAgICAgIHByZWZlcmVuY2VzOiB7IGxhYmVsOiAnQ29tbXVuaWNhdGlvbiBQcmVmZXJlbmNlcycgfSxcbiAgICAgIGNvbnZlcnNpb246IHsgbGFiZWw6ICdDb252ZXJzaW9uJyB9LFxuICAgICAgZHVwbGljYXRlczogeyBsYWJlbDogJ0R1cGxpY2F0ZSBNYW5hZ2VtZW50JyB9LFxuICAgICAgLy8gVGhlIGRldGFpbCBwYWdlJ3Mgc2VjdGlvbnMgcmVmZXJlbmNlIHRoZSBncm91cHMgYWJvdmUgKCM4MDYpLCBzbyBpdFxuICAgICAgLy8gaGFzIG5vIHNlY3Rpb24gbmFtZXMgb2YgaXRzIG93bi5cbiAgICAgIC8vIEZvcm0gc2VjdGlvbiBuYW1lcyBvbiBsZWFkLnZpZXcudHMgKCMxMTAwKS4gVGhlIHNlY3Rpb25zIG9mIHRoZVxuICAgICAgLy8gZGVmYXVsdCBmb3JtIGFuZCBvZiBldmVyeSBuYW1lZCBmb3JtVmlldyBsaXZlIGhlcmUgXHUyMDE0IGFkZCBhIGZvcm1cbiAgICAgIC8vIHRoZXJlLCBhZGQgaXRzIHNlY3Rpb24gbmFtZXMgaGVyZS4gYGFkZHJlc3NgIC8gYHF1YWxpZmljYXRpb25gIGFib3ZlXG4gICAgICAvLyBhcmUgcmV1c2VkIChpZGVudGljYWwgZmllbGRHcm91cCB3b3JkaW5nKTsgZXZlcnkgb3RoZXIgbmFtZSBoZXJlIGlzIG5ldy5cbiAgICAgIGNvbnRhY3RfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdDb250YWN0IEluZm9ybWF0aW9uJyB9LFxuICAgICAgbGVhZF9jbGFzc2lmaWNhdGlvbjogeyBsYWJlbDogJ0xlYWQgQ2xhc3NpZmljYXRpb24nIH0sXG4gICAgICBjb21wYW55X2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnQ29tcGFueSBJbmZvcm1hdGlvbicgfSxcbiAgICAgIGFkZGl0aW9uYWxfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdBZGRpdGlvbmFsIEluZm9ybWF0aW9uJyB9LFxuICAgICAgcHJpdmFjeTogeyBsYWJlbDogJ1ByaXZhY3knIH0sXG4gICAgICBnZW5lcmFsOiB7IGxhYmVsOiAnR2VuZXJhbCcgfSxcbiAgICAgIGRldGFpbHM6IHsgbGFiZWw6ICdEZXRhaWxzJyB9LFxuICAgICAgc3RlcF8xX2NvbnRhY3RfZGV0YWlsczogeyBsYWJlbDogJ1N0ZXAgMTogQ29udGFjdCBEZXRhaWxzJyB9LFxuICAgICAgc3RlcF8yX2NvbXBhbnlfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdTdGVwIDI6IENvbXBhbnkgSW5mb3JtYXRpb24nIH0sXG4gICAgICBzdGVwXzNfcXVhbGlmaWNhdGlvbjogeyBsYWJlbDogJ1N0ZXAgMzogUXVhbGlmaWNhdGlvbicgfSxcbiAgICAgIHN0ZXBfNF9yZXZpZXdfYW5kX2NvbnZlcnQ6IHsgbGFiZWw6ICdTdGVwIDQ6IFJldmlldyAmIENvbnZlcnQnIH0sXG4gICAgICBwcmltYXJ5X2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnUHJpbWFyeSBJbmZvcm1hdGlvbicgfSxcbiAgICAgIGV4dGVuZGVkX2RldGFpbHM6IHsgbGFiZWw6ICdFeHRlbmRlZCBEZXRhaWxzJyB9LFxuICAgICAgcXVpY2tfZWRpdDogeyBsYWJlbDogJ1F1aWNrIEVkaXQnIH0sXG4gICAgICB1cGRhdGVfbGVhZF9zdGF0dXM6IHsgbGFiZWw6ICdVcGRhdGUgTGVhZCBTdGF0dXMnIH0sXG4gICAgICB0ZWxsX3VzX2Fib3V0X3lvdXJzZWxmOiB7IGxhYmVsOiAnVGVsbCB1cyBhYm91dCB5b3Vyc2VsZicgfSxcbiAgICAgIGFib3V0X3lvdXJfY29tcGFueTogeyBsYWJlbDogJ0Fib3V0IHlvdXIgY29tcGFueScgfSxcbiAgICAgIGhvd19jYW5fd2VfaGVscDogeyBsYWJlbDogJ0hvdyBjYW4gd2UgaGVscD8nIH0sXG4gICAgICBsZWFkX2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnTGVhZCBJbmZvcm1hdGlvbicgfSxcbiAgICAgIGFkZHJlc3NfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdBZGRyZXNzIEluZm9ybWF0aW9uJyB9LFxuICAgICAgcHJpdmFjeV9wcmVmZXJlbmNlczogeyBsYWJlbDogJ1ByaXZhY3kgUHJlZmVyZW5jZXMnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgY29udmVydF9sZWFkOiB7XG4gICAgICAgIGxhYmVsOiAnQ29udmVydCBMZWFkJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdMZWFkIGNvbnZlcnRlZCBzdWNjZXNzZnVsbHkhJyxcbiAgICAgIH0sXG4gICAgICBjcmVhdGVfY2FtcGFpZ246IHtcbiAgICAgICAgbGFiZWw6ICdBZGQgdG8gQ2FtcGFpZ24nLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ0xlYWRzIGFkZGVkIHRvIGNhbXBhaWduIScsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGNybV9jYW1wYWlnbjogeyBsYWJlbDogJ0NhbXBhaWduJyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNjaGVkdWxlX2ZvbGxvd3VwOiB7XG4gICAgICAgIGxhYmVsOiAnU2NoZWR1bGUgRm9sbG93LXVwJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdGb2xsb3ctdXAgc2NoZWR1bGVkLicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9vcHBvcnR1bml0eToge1xuICAgIGxhYmVsOiAnT3Bwb3J0dW5pdHknLFxuICAgIHBsdXJhbExhYmVsOiAnT3Bwb3J0dW5pdGllcycsXG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiB7IGxhYmVsOiAnT3Bwb3J0dW5pdHkgTmFtZScgfSxcbiAgICAgIGNybV9hY2NvdW50OiB7IGxhYmVsOiAnQWNjb3VudCcgfSxcbiAgICAgIHByaW1hcnlfY29udGFjdDogeyBsYWJlbDogJ1ByaW1hcnkgQ29udGFjdCcgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnT3Bwb3J0dW5pdHkgT3duZXInIH0sXG4gICAgICBhbW91bnQ6IHsgbGFiZWw6ICdBbW91bnQnIH0sXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiB7IGxhYmVsOiAnRXhwZWN0ZWQgUmV2ZW51ZScgfSxcbiAgICAgIHN0YWdlOiB7XG4gICAgICAgIGxhYmVsOiAnU3RhZ2UnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcHJvc3BlY3Rpbmc6ICdQcm9zcGVjdGluZycsIHF1YWxpZmljYXRpb246ICdRdWFsaWZpY2F0aW9uJyxcbiAgICAgICAgICBuZWVkc19hbmFseXNpczogJ05lZWRzIEFuYWx5c2lzJywgcHJvcG9zYWw6ICdQcm9wb3NhbCcsXG4gICAgICAgICAgbmVnb3RpYXRpb246ICdOZWdvdGlhdGlvbicsIGNsb3NlZF93b246ICdDbG9zZWQgV29uJywgY2xvc2VkX2xvc3Q6ICdDbG9zZWQgTG9zdCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcHJvYmFiaWxpdHk6IHsgbGFiZWw6ICdQcm9iYWJpbGl0eSAoJSknIH0sXG4gICAgICBjbG9zZV9kYXRlOiB7IGxhYmVsOiAnQ2xvc2UgRGF0ZScgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUeXBlJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ld19idXNpbmVzczogJ05ldyBCdXNpbmVzcycsXG4gICAgICAgICAgZXhpc3RpbmdfdXBncmFkZTogJ0V4aXN0aW5nIEN1c3RvbWVyIC0gVXBncmFkZScsXG4gICAgICAgICAgZXhpc3RpbmdfcmVuZXdhbDogJ0V4aXN0aW5nIEN1c3RvbWVyIC0gUmVuZXdhbCcsXG4gICAgICAgICAgZXhpc3RpbmdfZXhwYW5zaW9uOiAnRXhpc3RpbmcgQ3VzdG9tZXIgLSBFeHBhbnNpb24nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiB7XG4gICAgICAgIGxhYmVsOiAnRm9yZWNhc3QgQ2F0ZWdvcnknLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcGlwZWxpbmU6ICdQaXBlbGluZScsIGJlc3RfY2FzZTogJ0Jlc3QgQ2FzZScsXG4gICAgICAgICAgY29tbWl0OiAnQ29tbWl0Jywgb21pdHRlZDogJ09taXR0ZWQnLCBjbG9zZWQ6ICdDbG9zZWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcHRpb24nIH0sXG4gICAgICBuZXh0X3N0ZXA6IHsgbGFiZWw6ICdOZXh0IFN0ZXAnIH0sXG4gICAgICBsZWFkX3NvdXJjZToge1xuICAgICAgICBsYWJlbDogJ0xlYWQgU291cmNlJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHdlYjogJ1dlYicsIHJlZmVycmFsOiAnUmVmZXJyYWwnLCBldmVudDogJ0V2ZW50IC8gVHJhZGUgU2hvdycsXG4gICAgICAgICAgd2ViaW5hcjogJ1dlYmluYXInLCBwYXJ0bmVyOiAnUGFydG5lcicsIGFkdmVydGlzZW1lbnQ6ICdBZHZlcnRpc2VtZW50JyxcbiAgICAgICAgICBwYWlkX3NlYXJjaDogJ1BhaWQgU2VhcmNoJywgc29jaWFsOiAnU29jaWFsIE1lZGlhJywgY29udGVudDogJ0NvbnRlbnQgLyBCbG9nJyxcbiAgICAgICAgICBjb2xkX2NhbGw6ICdDb2xkIENhbGwnLCBlbWFpbF9jYW1wYWlnbjogJ0VtYWlsIENhbXBhaWduJywgb3RoZXI6ICdPdGhlcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnQ2FtcGFpZ24nLCBoZWxwOiAnTWFya2V0aW5nIGNhbXBhaWduIHRoYXQgZ2VuZXJhdGVkIHRoaXMgb3Bwb3J0dW5pdHknIH0sXG4gICAgICBkYXlzX2luX3N0YWdlOiB7IGxhYmVsOiAnRGF5cyBpbiBDdXJyZW50IFN0YWdlJyB9LFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZToge1xuICAgICAgICBsYWJlbDogJ1N0YWdlIEVudHJ5IERhdGUnLFxuICAgICAgICBoZWxwOiAnRGF0ZSB0aGlzIG9wcG9ydHVuaXR5IGVudGVyZWQgaXRzIGN1cnJlbnQgc3RhZ2UuJyxcbiAgICAgIH0sXG4gICAgICBpc19wcml2YXRlOiB7IGxhYmVsOiAnUHJpdmF0ZScgfSxcbiAgICAgIGFwcHJvdmFsX3N0YXR1czoge1xuICAgICAgICBsYWJlbDogJ0FwcHJvdmFsIFN0YXR1cycsXG4gICAgICAgIG9wdGlvbnM6IHsgbm90X3JlcXVpcmVkOiAnTm90IFJlcXVpcmVkJywgcGVuZGluZzogJ1BlbmRpbmcnLCBhcHByb3ZlZDogJ0FwcHJvdmVkJywgcmVqZWN0ZWQ6ICdSZWplY3RlZCcgfSxcbiAgICAgIH0sXG4gICAgICBhcHByb3ZlZF9kYXRlOiB7IGxhYmVsOiAnQXBwcm92ZWQgRGF0ZScgfSxcbiAgICAgIHdpbl9yZWFzb246IHtcbiAgICAgICAgbGFiZWw6ICdXaW4gUmVhc29uJyxcbiAgICAgICAgaGVscDogJ1doeSB0aGlzIGRlYWwgd2FzIHdvbi4gUmVxdWlyZWQgdG8gY2xvc2UgYW4gb3Bwb3J0dW5pdHkgYXMgV29uLicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBiZXR0ZXJfcHJvZHVjdDogJ0JldHRlciBQcm9kdWN0JywgYmV0dGVyX3ByaWNlOiAnQmV0dGVyIFByaWNlJywgcmVsYXRpb25zaGlwOiAnRXhpc3RpbmcgUmVsYXRpb25zaGlwJyxcbiAgICAgICAgICBiZXR0ZXJfc3VwcG9ydDogJ0JldHRlciBTdXBwb3J0JywgYmVzdF9maXQ6ICdCZXN0IEZpdCAvIEZlYXR1cmVzJyxcbiAgICAgICAgICBxdW90ZV9hY2NlcHRlZDogJ1F1b3RlIEFjY2VwdGVkJywgb3RoZXI6ICdPdGhlcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbG9zc19yZWFzb246IHtcbiAgICAgICAgbGFiZWw6ICdMb3NzIFJlYXNvbicsXG4gICAgICAgIGhlbHA6ICdXaHkgdGhpcyBkZWFsIHdhcyBsb3N0LiBSZXF1aXJlZCB0byBjbG9zZSBhbiBvcHBvcnR1bml0eSBhcyBMb3N0LicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwcmljZTogJ1ByaWNlIFRvbyBIaWdoJywgY29tcGV0aXRvcjogJ0xvc3QgdG8gQ29tcGV0aXRvcicsIG5vX2J1ZGdldDogJ05vIEJ1ZGdldCcsXG4gICAgICAgICAgbm9fZGVjaXNpb246ICdObyBEZWNpc2lvbicsIHRpbWluZzogJ0JhZCBUaW1pbmcnLCBmZWF0dXJlczogJ01pc3NpbmcgRmVhdHVyZXMnLCBvdGhlcjogJ090aGVyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBsb3NzX2RldGFpbHM6IHtcbiAgICAgICAgbGFiZWw6ICdMb3NzL1dpbiBEZXRhaWxzJyxcbiAgICAgICAgaGVscDogJ0ZyZWUtdGV4dCBjb250ZXh0IGJlaGluZCB0aGUgd2luIG9yIGxvc3MgcmVhc29uLicsXG4gICAgICB9LFxuICAgICAgLy8gUkVRLTAwMDYgXHUyMDE0IHF1YWxpZmljYXRpb24sIHRoZSBjdXN0b21lcidzIHByb2N1cmVtZW50IGNhbGVuZGFyLCB0aGVcbiAgICAgIC8vIGRlYWwgbmFycmF0aXZlLCB0aGUgYnVzaW5lc3MgbGluZSBhbmQgdGhlIHN0YXR1cy1jaGFuZ2UgZ2F0ZS5cbiAgICAgIHdpbGxfYmlkOiB7XG4gICAgICAgIGxhYmVsOiAnV2lsbCBCaWQnLFxuICAgICAgICBoZWxwOiAnV2hldGhlciB3ZSBpbnRlbmQgdG8gYmlkLiBVbnNldCBtZWFucyB0aGUgZGVjaXNpb24gaXMgb3Blbi4nLFxuICAgICAgfSxcbiAgICAgIGNvbnRyb2xsYWJpbGl0eTogeyBsYWJlbDogJ0NvbnRyb2xsYWJpbGl0eScsIG9wdGlvbnM6IHsgaGlnaDogJ0hpZ2gnLCBtZWRpdW06ICdNZWRpdW0nLCBsb3c6ICdMb3cnIH0gfSxcbiAgICAgIHByaW9yaXR5OiB7IGxhYmVsOiAnUHJpb3JpdHknLCBvcHRpb25zOiB7IGhpZ2g6ICdIaWdoJywgbWVkaXVtOiAnTWVkaXVtJywgbG93OiAnTG93JyB9IH0sXG4gICAgICBkZWFsX2xldmVsOiB7IGxhYmVsOiAnRGVhbCBMZXZlbCcsIG9wdGlvbnM6IHsgc3RyYXRlZ2ljOiAnU3RyYXRlZ2ljJywga2V5OiAnS2V5Jywgc3RhbmRhcmQ6ICdTdGFuZGFyZCcgfSB9LFxuICAgICAgaXNfc3ViY29udHJhY3RlZDogeyBsYWJlbDogJ0ludm9sdmVzIFN1YmNvbnRyYWN0aW5nJyB9LFxuICAgICAgc3ViY29udHJhY3Rpbmdfbm90ZTogeyBsYWJlbDogJ1N1YmNvbnRyYWN0aW5nIE5vdGUnIH0sXG4gICAgICBjdXN0b21lcl9pbml0aWF0aW9uX2RhdGU6IHsgbGFiZWw6ICdDdXN0b21lciBJbml0aWF0aW9uIERhdGUnIH0sXG4gICAgICBleHBlY3RlZF90ZW5kZXJfZGF0ZTogeyBsYWJlbDogJ0V4cGVjdGVkIFRlbmRlciBEYXRlJyB9LFxuICAgICAgZXhwZWN0ZWRfc2lnbmluZ19kYXRlOiB7IGxhYmVsOiAnRXhwZWN0ZWQgU2lnbmluZyBEYXRlJyB9LFxuICAgICAgZXhwZWN0ZWRfdGVuZGVyX2Ftb3VudDogeyBsYWJlbDogJ0V4cGVjdGVkIFRlbmRlciBBbW91bnQnIH0sXG4gICAgICBleHBlY3RlZF9zaWduaW5nX2Ftb3VudDogeyBsYWJlbDogJ0V4cGVjdGVkIFNpZ25pbmcgQW1vdW50JyB9LFxuICAgICAgYnVzaW5lc3NfbGluZToge1xuICAgICAgICBsYWJlbDogJ0J1c2luZXNzIExpbmUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcHJvZHVjdDogJ1Byb2R1Y3QnLCBzZXJ2aWNlczogJ1Byb2Zlc3Npb25hbCBTZXJ2aWNlcycsIGNvbnN1bHRpbmc6ICdDb25zdWx0aW5nJyxcbiAgICAgICAgICBzdXBwb3J0OiAnU3VwcG9ydCAmIE1haW50ZW5hbmNlJywgb3RoZXI6ICdPdGhlcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY3VzdG9tZXJfYmFja2dyb3VuZDogeyBsYWJlbDogJ0N1c3RvbWVyIEJhY2tncm91bmQnIH0sXG4gICAgICBwcm9qZWN0X2JhY2tncm91bmQ6IHsgbGFiZWw6ICdQcm9qZWN0IEJhY2tncm91bmQnIH0sXG4gICAgICByaXNrX2FuYWx5c2lzOiB7IGxhYmVsOiAnUmlzayBBbmFseXNpcycgfSxcbiAgICAgIHBheW1lbnRfdGVybXM6IHsgbGFiZWw6ICdQYXltZW50IFRlcm1zJyB9LFxuICAgICAgcmVxdWVzdGVkX3N0YXR1czogeyBsYWJlbDogJ1JlcXVlc3RlZCBTdGF0dXMnLCBvcHRpb25zOiB7IGNsb3NlZF93b246ICdXb24nLCBjbG9zZWRfbG9zdDogJ0xvc3QnIH0gfSxcbiAgICAgIHN0YXR1c19jaGFuZ2VfYXBwcm92YWxfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnU3RhdHVzIENoYW5nZSBBcHByb3ZhbCcsXG4gICAgICAgIG9wdGlvbnM6IHsgbm90X3JlcXVpcmVkOiAnTm90IFJlcXVpcmVkJywgcGVuZGluZzogJ1BlbmRpbmcnLCBhcHByb3ZlZDogJ0FwcHJvdmVkJywgcmVqZWN0ZWQ6ICdSZWplY3RlZCcgfSxcbiAgICAgIH0sXG4gICAgICAvLyBSRVEtMDAwNiBzdGVwIDExIFx1MjAxNCB0aGUgXHU3QUNCXHU5ODc5IChxdWFsaWZpY2F0aW9uKSBhcHByb3ZhbCBnYXRlLlxuICAgICAgcXVhbGlmaWNhdGlvbl9yZXF1ZXN0ZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdSZXF1ZXN0IFF1YWxpZmljYXRpb24gQXBwcm92YWwnLFxuICAgICAgICBoZWxwOiAnVGljayB0byBzZW5kIHRoaXMgZGVhbCBmb3IgcXVhbGlmaWNhdGlvbiBhcHByb3ZhbC4gQSByZWplY3Rpb24gY2xlYXJzIGl0OyB0aWNrIGl0IGFnYWluIHRvIGFzayBhZ2Fpbi4nLFxuICAgICAgfSxcbiAgICAgIHF1YWxpZmljYXRpb25fYXBwcm92YWxfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnUXVhbGlmaWNhdGlvbiBBcHByb3ZhbCcsXG4gICAgICAgIG9wdGlvbnM6IHsgbm90X3JlcXVpcmVkOiAnTm90IFJlcXVpcmVkJywgcGVuZGluZzogJ1BlbmRpbmcnLCBhcHByb3ZlZDogJ0FwcHJvdmVkJywgcmVqZWN0ZWQ6ICdSZWplY3RlZCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIHRlbmRlcl90aGlzX3F1YXJ0ZXI6IHtcbiAgICAgICAgbGFiZWw6ICdUZW5kZXIgVGhpcyBRdWFydGVyJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnTm8gVGVuZGVycyBFeHBlY3RlZCBUaGlzIFF1YXJ0ZXInLFxuICAgICAgICAgIG1lc3NhZ2U6ICdUaGlzIHRhYiBsaXN0cyBvcGVuIGRlYWxzIHdob3NlIGN1c3RvbWVyLXNpZGUgdGVuZGVyIGRhdGUgZmFsbHMgaW5zaWRlIHRoZSBjdXJyZW50IHF1YXJ0ZXIuIFJlY29yZCBFeHBlY3RlZCBUZW5kZXIgRGF0ZSBvbiBhIGRlYWwgdG8gc2VlIGl0IGhlcmUuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvcGVuX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdPcGVuIERlYWxzJyB9LFxuICAgICAgYWxsX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdBbGwgT3Bwb3J0dW5pdGllcycgfSxcbiAgICAgIHBpcGVsaW5lX2thbmJhbjogeyBsYWJlbDogJ1NhbGVzIFBpcGVsaW5lJyB9LFxuICAgICAgY2xvc2VfZGF0ZV9jYWxlbmRhcjogeyBsYWJlbDogJ0ZvcmVjYXN0IENhbGVuZGFyJyB9LFxuICAgICAgZGVhbF90aW1lbGluZTogeyBsYWJlbDogJ0RlYWwgVGltZWxpbmUnIH0sXG4gICAgICBkZWFsX2dhbGxlcnk6IHsgbGFiZWw6ICdEZWFsIENhcmRzJyB9LFxuICAgICAgbXlfb3Blbl9kZWFsczogeyBsYWJlbDogJ015IE9wZW4gRGVhbHMnIH0sXG4gICAgICBzdGFsZV9vcHBvcnR1bml0aWVzOiB7IGxhYmVsOiAnXHUyNkEwXHVGRTBGIFN0YWxlIE9wcG9ydHVuaXRpZXMgXHUwMEI3IExvbmdlc3QgaW4gU3RhZ2UgRmlyc3QnIH0sXG4gICAgICBjbG9zaW5nX3RoaXNfcXVhcnRlcjoge1xuICAgICAgICBsYWJlbDogJ0Nsb3NpbmcgVGhpcyBRdWFydGVyJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnTm8gRGVhbHMgQ2xvc2luZyBUaGlzIFF1YXJ0ZXInLFxuICAgICAgICAgIG1lc3NhZ2U6ICdUaGlzIHRhYiBsaXN0cyBvcGVuIGNvbW1pdCBhbmQgYmVzdC1jYXNlIGRlYWxzIHdpdGggYSBjbG9zZSBkYXRlIGluc2lkZSB0aGUgY3VycmVudCBxdWFydGVyLiBOb3RoaW5nIG1hdGNoZXMgcmlnaHQgbm93IFx1MjAxNCBkZWFscyBjbG9zaW5nIGxhdGVyIGFyZSBvbiB0aGUgT3BlbiBEZWFscyB0YWIuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnQmFzaWMgSW5mb3JtYXRpb24nIH0sXG4gICAgICBmaW5hbmNpYWxzOiB7IGxhYmVsOiAnRmluYW5jaWFscycgfSxcbiAgICAgIHNhbGVzX3Byb2Nlc3M6IHsgbGFiZWw6ICdTYWxlcyBQcm9jZXNzJyB9LFxuICAgICAgY2xhc3NpZmljYXRpb246IHsgbGFiZWw6ICdDbGFzc2lmaWNhdGlvbicgfSxcbiAgICAgIGNhbXBhaWduOiB7IGxhYmVsOiAnQ2FtcGFpZ25zJyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdOb3RlcyAmIE5leHQgU3RlcHMnIH0sXG4gICAgICBxdWFsaWZpY2F0aW9uOiB7IGxhYmVsOiAnUXVhbGlmaWNhdGlvbicgfSxcbiAgICAgIG5hcnJhdGl2ZTogeyBsYWJlbDogJ0RlYWwgTmFycmF0aXZlJyB9LFxuICAgICAgY3JtX2ZvcmVjYXN0OiB7IGxhYmVsOiAnRm9yZWNhc3QgJiBNZXRyaWNzJyB9LFxuICAgICAgLy8gVGhlIGRldGFpbCBwYWdlJ3Mgc2VjdGlvbnMgcmVmZXJlbmNlIHRoZSBncm91cHMgYWJvdmUgKCMxNDUyKSwgc28gaXRcbiAgICAgIC8vIGhhcyBubyBzZWN0aW9uIG5hbWVzIG9mIGl0cyBvd24uXG4gICAgICAvLyBGb3JtIHNlY3Rpb24gbmFtZXMgb24gb3Bwb3J0dW5pdHkudmlldy50cyAoIzExMDApXG4gICAgICBvdmVydmlldzogeyBsYWJlbDogJ092ZXJ2aWV3JyB9LFxuICAgICAgZm9yZWNhc3Q6IHsgbGFiZWw6ICdGb3JlY2FzdCcgfSxcbiAgICAgIHNhbGVzX3N0cmF0ZWd5OiB7IGxhYmVsOiAnU2FsZXMgU3RyYXRlZ3knIH0sXG4gICAgICB3aW5fbG9zczogeyBsYWJlbDogJ1dpbiAvIExvc3MnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgY2xvbmVfb3Bwb3J0dW5pdHk6IHtcbiAgICAgICAgbGFiZWw6ICdDbG9uZSBPcHBvcnR1bml0eScsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnT3Bwb3J0dW5pdHkgY2xvbmVkIHN1Y2Nlc3NmdWxseSEnLFxuICAgICAgfSxcbiAgICAgIG1hc3NfdXBkYXRlX3N0YWdlOiB7XG4gICAgICAgIGxhYmVsOiAnVXBkYXRlIFN0YWdlJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdPcHBvcnR1bml0aWVzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IScsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHN0YWdlOiB7IGxhYmVsOiAnTmV3IFN0YWdlJyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGdlbmVyYXRlX3F1b3RlOiB7XG4gICAgICAgIGxhYmVsOiAnR2VuZXJhdGUgUXVvdGUnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1F1b3RlIGNyZWF0ZWQgZnJvbSBvcHBvcnR1bml0eSEnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtOiB7XG4gICAgbGFiZWw6ICdPcHBvcnR1bml0eSBMaW5lIEl0ZW0nLFxuICAgIHBsdXJhbExhYmVsOiAnT3Bwb3J0dW5pdHkgTGluZSBJdGVtcycsXG4gICAgZGVzY3JpcHRpb246ICdQZXItcHJvZHVjdCBwcmljaW5nIGxpbmVzIHVuZGVyIGFuIG9wcG9ydHVuaXR5JyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNybV9vcHBvcnR1bml0eTogeyBsYWJlbDogJ09wcG9ydHVuaXR5JyB9LFxuICAgICAgY3JtX3Byb2R1Y3Q6IHsgbGFiZWw6ICdQcm9kdWN0JyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwdGlvbicgfSxcbiAgICAgIHF1YW50aXR5OiB7IGxhYmVsOiAnUXVhbnRpdHknIH0sXG4gICAgICBsaXN0X3ByaWNlOiB7IGxhYmVsOiAnTGlzdCBQcmljZScsIGhlbHA6IFwiQXV0by1wb3B1bGF0ZWQgZnJvbSB0aGUgcHJvZHVjdCdzIExpc3QgUHJpY2UuXCIgfSxcbiAgICAgIHVuaXRfcHJpY2U6IHtcbiAgICAgICAgbGFiZWw6ICdTYWxlcyBQcmljZScsXG4gICAgICAgIGhlbHA6ICdOZWdvdGlhdGVkIHVuaXQgcHJpY2UgKG1heSBkaWZmZXIgZnJvbSBsaXN0IHByaWNlKScsXG4gICAgICB9LFxuICAgICAgZGlzY291bnQ6IHsgbGFiZWw6ICdEaXNjb3VudCAlJyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdUb3RhbCcgfSxcbiAgICAgIGxpbmVfbnVtYmVyOiB7IGxhYmVsOiAnTGluZSAjJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0xpbmUgSXRlbScgfSxcbiAgICAgIHByaWNpbmc6IHsgbGFiZWw6ICdQcmljaW5nJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9mb3JlY2FzdDoge1xuICAgIGxhYmVsOiAnRm9yZWNhc3QnLFxuICAgIHBsdXJhbExhYmVsOiAnRm9yZWNhc3RzJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BlcmlvZGljIHBpcGVsaW5lIHNuYXBzaG90IGJ5IG93bmVyIHVzZWQgZm9yIHJldmVudWUgZm9yZWNhc3RpbmcnLFxuICAgIGZpZWxkczoge1xuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdPd25lcicgfSxcbiAgICAgIHBlcmlvZDogeyBsYWJlbDogJ1BlcmlvZCcsIG9wdGlvbnM6IHsgbW9udGg6ICdNb250aCcsIHF1YXJ0ZXI6ICdRdWFydGVyJyB9IH0sXG4gICAgICBwZXJpb2Rfc3RhcnQ6IHtcbiAgICAgICAgbGFiZWw6ICdQZXJpb2QgU3RhcnQnLFxuICAgICAgICBoZWxwOiAnTXVzdCBiZSB0aGUgZmlyc3QgZGF5IG9mIHRoZSBwZXJpb2QgXHUyMDE0IGUuZy4gMjAyNi0wOC0wMSBmb3IgQXVnIDIwMjYuIEEgcXVhcnRlcmx5IGZvcmVjYXN0IG11c3QgYWRkaXRpb25hbGx5IHN0YXJ0IG9uIGEgcXVhcnRlciBib3VuZGFyeTogSmFudWFyeSAxLCBBcHJpbCAxLCBKdWx5IDEgb3IgT2N0b2JlciAxLicsXG4gICAgICB9LFxuICAgICAgcGVyaW9kX2VuZDoge1xuICAgICAgICBsYWJlbDogJ1BlcmlvZCBFbmQnLFxuICAgICAgICBoZWxwOiAnTm9ybWFsbHkgZGVyaXZlZCBhdXRvbWF0aWNhbGx5IGZyb20gUGVyaW9kIGFuZCBQZXJpb2QgU3RhcnQuIElmIHNldCBieSBoYW5kLCBpdCBtdXN0IGJlIHRoZSBsYXN0IGRheSBvZiB0aGF0IHBlcmlvZCBcdTIwMTQgZS5nLiAyMDI2LTA5LTMwIGZvciBhIHF1YXJ0ZXIgc3RhcnRpbmcgMjAyNi0wNy0wMSwgb3IgMjAyNi0wOC0zMSBmb3IgQXVnIDIwMjYuJyxcbiAgICAgIH0sXG4gICAgICBwZXJpb2RfbGFiZWw6IHsgbGFiZWw6ICdQZXJpb2QnLCBoZWxwOiAnSHVtYW4tZnJpZW5kbHkgbGFiZWwsIGUuZy4gXCJRMyAyMDI2XCIgb3IgXCJBdWcgMjAyNlwiLicgfSxcbiAgICAgIHNuYXBzaG90X2RhdGU6IHsgbGFiZWw6ICdTbmFwc2hvdCBEYXRlJywgaGVscDogJ1RoZSBkYXkgdGhpcyBzbmFwc2hvdCB3YXMgY2FwdHVyZWQuJyB9LFxuICAgICAgc291cmNlOiB7XG4gICAgICAgIGxhYmVsOiAnU291cmNlJyxcbiAgICAgICAgb3B0aW9uczogeyBzY2hlZHVsZWQ6ICdTY2hlZHVsZWQgc25hcHNob3QnLCBhaTogJ0FJIHNraWxsJywgbWFudWFsOiAnTWFudWFsIGVudHJ5JyB9LFxuICAgICAgfSxcbiAgICAgIHF1b3RhOiB7IGxhYmVsOiAnUXVvdGEnIH0sXG4gICAgICBwaXBlbGluZV9hbW91bnQ6IHtcbiAgICAgICAgbGFiZWw6ICdQaXBlbGluZScsXG4gICAgICAgIGhlbHA6ICdTdW0gb2YgYWxsIG9wZW4gb3Bwb3J0dW5pdGllcyBjbG9zaW5nIGluIHRoaXMgcGVyaW9kIChhbnkgc3RhZ2UpLicsXG4gICAgICB9LFxuICAgICAgYmVzdF9jYXNlX2Ftb3VudDoge1xuICAgICAgICBsYWJlbDogJ0Jlc3QgQ2FzZScsXG4gICAgICAgIGhlbHA6ICdPcGVuIG9wcG9ydHVuaXRpZXMgaW4gdGhlIEJlc3QgQ2FzZSBvciBDb21taXQgZm9yZWNhc3QgY2F0ZWdvcnkuJyxcbiAgICAgIH0sXG4gICAgICBjb21taXRfYW1vdW50OiB7XG4gICAgICAgIGxhYmVsOiAnQ29tbWl0JyxcbiAgICAgICAgaGVscDogJ09wZW4gb3Bwb3J0dW5pdGllcyBpbiB0aGUgQ29tbWl0IGZvcmVjYXN0IGNhdGVnb3J5IChvd25lci1jb21taXR0ZWQpLicsXG4gICAgICB9LFxuICAgICAgY2xvc2VkX2Ftb3VudDogeyBsYWJlbDogJ0Nsb3NlZCBXb24nLCBoZWxwOiAnQWxyZWFkeS1jbG9zZWQtd29uIGFtb3VudCBpbiB0aGlzIHBlcmlvZC4nIH0sXG4gICAgICBleHBlY3RlZF9hbW91bnQ6IHtcbiAgICAgICAgbGFiZWw6ICdFeHBlY3RlZCcsXG4gICAgICAgIGhlbHA6ICdDbG9zZWQgV29uICsgQ29tbWl0IFx1MjAxNCB3aGF0IHRoZSBvd25lciByZWFzb25hYmx5IGV4cGVjdHMgdG8gbGFuZC4nLFxuICAgICAgfSxcbiAgICAgIGF0dGFpbm1lbnRfcGN0OiB7IGxhYmVsOiAnQXR0YWlubWVudCAlJywgaGVscDogJ0Nsb3NlZCBXb24gXHUwMEY3IFF1b3RhIFx1MDBENyAxMDAuIFJlYWRzIDAlIHVudGlsIGEgcG9zaXRpdmUgcXVvdGEgaXMgc2V0LicgfSxcbiAgICAgIGNvdmVyYWdlX3JhdGlvOiB7XG4gICAgICAgIGxhYmVsOiAnQ292ZXJhZ2UnLFxuICAgICAgICBoZWxwOiAnUGlwZWxpbmUgXHUwMEY3IChRdW90YSBcdTIyMTIgQ2xvc2VkIFdvbikgXHUyMDE0IHdoZXRoZXIgZW5vdWdoIHBpcGVsaW5lIHJlbWFpbnMgdG8gY292ZXIgdGhlIGdhcC4gUmVhZHMgMCBvbmNlIHRoZSBxdW90YSBpcyBhbHJlYWR5IG1ldC4nLFxuICAgICAgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnTm90ZXMnIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnRGlzcGxheSBUaXRsZScgfSxcbiAgICAgIHNlZWRfa2V5OiB7XG4gICAgICAgIGxhYmVsOiAnU2VlZCBLZXknLFxuICAgICAgICBoZWxwOiAnRGVtby1maXh0dXJlIGlkZW50aXR5LiBXcml0dGVuIG9ubHkgYnkgdGhlIHNlZWQgbG9hZGVyOyBlbXB0eSBvbiBldmVyeSByZWFsIHNuYXBzaG90LicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfZm9yZWNhc3RzOiB7IGxhYmVsOiAnQWxsIEZvcmVjYXN0cycgfSxcbiAgICAgIHRoaXNfcXVhcnRlcl9mb3JlY2FzdHM6IHtcbiAgICAgICAgbGFiZWw6ICdUaGlzIFF1YXJ0ZXInLFxuICAgICAgICBlbXB0eVN0YXRlOiB7XG4gICAgICAgICAgdGl0bGU6ICdUaGlzIFF1YXJ0ZXIgSGFzIE5vIFNuYXBzaG90cyBZZXQnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdRdWFydGVybHkgc25hcHNob3RzIGFyZSB3cml0dGVuIGJ5IHRoZSBuaWdodGx5IGZvcmVjYXN0IHN3ZWVwLiBVbnRpbCBpdCBoYXMgcnVuIG9uY2UgZm9yIHRoZSBjdXJyZW50IHF1YXJ0ZXIgdGhpcyB2aWV3IGlzIGVtcHR5IFx1MjAxNCBzZXR0bGVkIHF1YXJ0ZXJzIGFyZSBvbiB0aGUgQWxsIHRhYi4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG15X2ZvcmVjYXN0OiB7IGxhYmVsOiAnTXkgRm9yZWNhc3QnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnU25hcHNob3QnIH0sXG4gICAgICBhbW91bnRzOiB7IGxhYmVsOiAnQW1vdW50cycgfSxcbiAgICAgIG1ldGE6IHsgbGFiZWw6ICdTb3VyY2UnIH0sXG4gICAgICAvLyBGb3JtIHNlY3Rpb24gbmFtZXMgb24gZm9yZWNhc3Qudmlldy50cyAoIzExMDApLiBgYmFzaWNgJ3MgbGFiZWxcbiAgICAgIC8vIG1hdGNoZXMgXCJTbmFwc2hvdFwiIGJ1dCBpdHMga2V5IGRvZXMgbm90LCBzbyB0aGlzIGZvcm0gc2VjdGlvblxuICAgICAgLy8gbmVlZHMgaXRzIG93biBlbnRyeTsgYG5vdGVzYCBoYXMgbm8gZmllbGRHcm91cCBjb3VudGVycGFydCBhdCBhbGwuXG4gICAgICBzbmFwc2hvdDogeyBsYWJlbDogJ1NuYXBzaG90JyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdOb3RlcycgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9vYmplY3RzLmNvbW1lcmNlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lblwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vb2JqZWN0cy5jb21tZXJjZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG4vKipcbiAqIEVuZ2xpc2ggKGVuKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIENPTU1FUkNFIGZhbWlseTpcbiAqIHdoYXQgZ2V0cyBzb2xkIGFuZCBvbiB3aGF0IHBhcGVyIFx1MjAxNCBxdW90ZXMsIGNvbnRyYWN0cywgcHJvZHVjdHMuXG4gKlxuICogUm9zdGVyOiBgY3JtX3F1b3RlYCwgYGNybV9xdW90ZV9saW5lX2l0ZW1gLCBgY3JtX2NvbnRyYWN0YCwgYGNybV9wcm9kdWN0YC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBjb21tZXJjZTogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX3F1b3RlOiB7XG4gICAgbGFiZWw6ICdRdW90ZScsXG4gICAgcGx1cmFsTGFiZWw6ICdRdW90ZXMnLFxuICAgIGZpZWxkczoge1xuICAgICAgcXVvdGVfbnVtYmVyOiB7IGxhYmVsOiAnUXVvdGUgTnVtYmVyJyB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ1F1b3RlIE5hbWUnIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ0FjY291bnQnIH0sXG4gICAgICBjcm1fY29udGFjdDoge1xuICAgICAgICBsYWJlbDogJ0NvbnRhY3QnLFxuICAgICAgICBoZWxwOiAnUmVxdWlyZWQgb25jZSB0aGUgcXVvdGUgaXMgUHJlc2VudGVkIG9yIEFjY2VwdGVkIFx1MjAxNCB0aGUgZHJhZnRlZCBjb250cmFjdCB0YWtlcyBpdHMgUHJpbWFyeSBDb250YWN0IGZyb20gaGVyZS4nLFxuICAgICAgfSxcbiAgICAgIGNybV9vcHBvcnR1bml0eTogeyBsYWJlbDogJ09wcG9ydHVuaXR5JyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdRdW90ZSBPd25lcicgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1N0YXR1cycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkcmFmdDogJ0RyYWZ0JywgaW5fcmV2aWV3OiAnSW4gUmV2aWV3JywgcHJlc2VudGVkOiAnUHJlc2VudGVkJyxcbiAgICAgICAgICBhY2NlcHRlZDogJ0FjY2VwdGVkJywgcmVqZWN0ZWQ6ICdSZWplY3RlZCcsIGV4cGlyZWQ6ICdFeHBpcmVkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBxdW90ZV9kYXRlOiB7IGxhYmVsOiAnUXVvdGUgRGF0ZScgfSxcbiAgICAgIGV4cGlyYXRpb25fZGF0ZTogeyBsYWJlbDogJ0V4cGlyYXRpb24gRGF0ZScgfSxcbiAgICAgIHN1YnRvdGFsOiB7IGxhYmVsOiAnU3VidG90YWwnIH0sXG4gICAgICBkaXNjb3VudDogeyBsYWJlbDogJ0Rpc2NvdW50ICUnIH0sXG4gICAgICBkaXNjb3VudF9hbW91bnQ6IHsgbGFiZWw6ICdEaXNjb3VudCBBbW91bnQnIH0sXG4gICAgICB0YXg6IHsgbGFiZWw6ICdUYXgnIH0sXG4gICAgICBzaGlwcGluZ19oYW5kbGluZzogeyBsYWJlbDogJ1NoaXBwaW5nICYgSGFuZGxpbmcnIH0sXG4gICAgICB0b3RhbF9wcmljZTogeyBsYWJlbDogJ1RvdGFsIFByaWNlJyB9LFxuICAgICAgcGF5bWVudF90ZXJtczoge1xuICAgICAgICBsYWJlbDogJ1BheW1lbnQgVGVybXMnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbmV0XzE1OiAnTmV0IDE1JywgbmV0XzMwOiAnTmV0IDMwJywgbmV0XzYwOiAnTmV0IDYwJyxcbiAgICAgICAgICBuZXRfOTA6ICdOZXQgOTAnLCBkdWVfb25fcmVjZWlwdDogJ0R1ZSBvbiBSZWNlaXB0JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzaGlwcGluZ190ZXJtczogeyBsYWJlbDogJ1NoaXBwaW5nIFRlcm1zJyB9LFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnQmlsbGluZyBBZGRyZXNzJyB9LFxuICAgICAgc2hpcHBpbmdfYWRkcmVzczogeyBsYWJlbDogJ1NoaXBwaW5nIEFkZHJlc3MnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXB0aW9uJyB9LFxuICAgICAgaW50ZXJuYWxfbm90ZXM6IHsgbGFiZWw6ICdJbnRlcm5hbCBOb3RlcycgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdEaXNwbGF5IFRpdGxlJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfcXVvdGVzOiB7IGxhYmVsOiAnQWxsIFF1b3RlcycgfSxcbiAgICAgIHF1b3RlX3BpcGVsaW5lOiB7IGxhYmVsOiAnUXVvdGUgUGlwZWxpbmUnIH0sXG4gICAgICBxdW90ZV9jYWxlbmRhcjogeyBsYWJlbDogJ1F1b3RlIENhbGVuZGFyJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1F1b3RlIEluZm9ybWF0aW9uJyB9LFxuICAgICAgcHJpY2luZzogeyBsYWJlbDogJ1ByaWNpbmcnIH0sXG4gICAgICB0ZXJtczogeyBsYWJlbDogJ1Rlcm1zICYgVmFsaWRpdHknIH0sXG4gICAgICBhZGRyZXNzOiB7IGxhYmVsOiAnQWRkcmVzc2VzJyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnU3lzdGVtJyB9LFxuICAgICAgLy8gRm9ybSBzZWN0aW9uIG5hbWVzIG9uIHF1b3RlLnZpZXcudHMgKCMxMTAwKS4gYHF1b3RlX3Rlcm1zYCwgbm90XG4gICAgICAvLyBgdGVybXNgIFx1MjAxNCBgdGVybXNgIGlzIGFscmVhZHkgdGhlIGZpZWxkR3JvdXAga2V5IGZvciBcIlRlcm1zICYgVmFsaWRpdHlcIi5cbiAgICAgIHF1b3RlOiB7IGxhYmVsOiAnUXVvdGUnIH0sXG4gICAgICB0b3RhbHM6IHsgbGFiZWw6ICdUb3RhbHMnIH0sXG4gICAgICBxdW90ZV90ZXJtczogeyBsYWJlbDogJ1Rlcm1zJyB9LFxuICAgICAgYWRkcmVzc2VzX2FuZF9ub3RlczogeyBsYWJlbDogJ0FkZHJlc3NlcyAmIE5vdGVzJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9xdW90ZV9saW5lX2l0ZW06IHtcbiAgICBsYWJlbDogJ1F1b3RlIExpbmUgSXRlbScsXG4gICAgcGx1cmFsTGFiZWw6ICdRdW90ZSBMaW5lIEl0ZW1zJyxcbiAgICBkZXNjcmlwdGlvbjogJ1Blci1wcm9kdWN0IHByaWNpbmcgbGluZXMgdW5kZXIgYSBxdW90ZScsXG4gICAgZmllbGRzOiB7XG4gICAgICBjcm1fcXVvdGU6IHsgbGFiZWw6ICdRdW90ZScgfSxcbiAgICAgIGNybV9wcm9kdWN0OiB7IGxhYmVsOiAnUHJvZHVjdCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcHRpb24nIH0sXG4gICAgICBxdWFudGl0eTogeyBsYWJlbDogJ1F1YW50aXR5JyB9LFxuICAgICAgbGlzdF9wcmljZTogeyBsYWJlbDogJ0xpc3QgUHJpY2UnIH0sXG4gICAgICB1bml0X3ByaWNlOiB7IGxhYmVsOiAnU2FsZXMgUHJpY2UnIH0sXG4gICAgICBkaXNjb3VudDogeyBsYWJlbDogJ0Rpc2NvdW50ICUnIH0sXG4gICAgICBzdWJ0b3RhbDogeyBsYWJlbDogJ1N1YnRvdGFsJyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdUb3RhbCcgfSxcbiAgICAgIGxpbmVfbnVtYmVyOiB7IGxhYmVsOiAnTGluZSAjJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0xpbmUgSXRlbScgfSxcbiAgICAgIHByaWNpbmc6IHsgbGFiZWw6ICdQcmljaW5nJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9jb250cmFjdDoge1xuICAgIGxhYmVsOiAnQ29udHJhY3QnLFxuICAgIHBsdXJhbExhYmVsOiAnQ29udHJhY3RzJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNvbnRyYWN0X251bWJlcjogeyBsYWJlbDogJ0NvbnRyYWN0IE51bWJlcicgfSxcbiAgICAgIGNybV9hY2NvdW50OiB7IGxhYmVsOiAnQWNjb3VudCcgfSxcbiAgICAgIGNybV9jb250YWN0OiB7IGxhYmVsOiAnUHJpbWFyeSBDb250YWN0JyB9LFxuICAgICAgY3JtX29wcG9ydHVuaXR5OiB7IGxhYmVsOiAnUmVsYXRlZCBPcHBvcnR1bml0eScgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnQ29udHJhY3QgT3duZXInIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZHJhZnQ6ICdEcmFmdCcsIGluX2FwcHJvdmFsOiAnSW4gQXBwcm92YWwnLCBhY3RpdmF0ZWQ6ICdBY3RpdmF0ZWQnLFxuICAgICAgICAgIGV4cGlyZWQ6ICdFeHBpcmVkJywgdGVybWluYXRlZDogJ1Rlcm1pbmF0ZWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNvbnRyYWN0X3Rlcm1fbW9udGhzOiB7IGxhYmVsOiAnQ29udHJhY3QgVGVybSAoTW9udGhzKScgfSxcbiAgICAgIHN0YXJ0X2RhdGU6IHsgbGFiZWw6ICdTdGFydCBEYXRlJyB9LFxuICAgICAgZW5kX2RhdGU6IHsgbGFiZWw6ICdFbmQgRGF0ZScgfSxcbiAgICAgIGNvbnRyYWN0X3ZhbHVlOiB7IGxhYmVsOiAnQ29udHJhY3QgVmFsdWUnIH0sXG4gICAgICBiaWxsaW5nX2ZyZXF1ZW5jeToge1xuICAgICAgICBsYWJlbDogJ0JpbGxpbmcgRnJlcXVlbmN5JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1vbnRobHk6ICdNb250aGx5JywgcXVhcnRlcmx5OiAnUXVhcnRlcmx5JyxcbiAgICAgICAgICBhbm51YWxseTogJ0FubnVhbGx5Jywgb25lX3RpbWU6ICdPbmUtdGltZScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcGF5bWVudF90ZXJtczoge1xuICAgICAgICBsYWJlbDogJ1BheW1lbnQgVGVybXMnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbmV0XzE1OiAnTmV0IDE1JywgbmV0XzMwOiAnTmV0IDMwJywgbmV0XzYwOiAnTmV0IDYwJyxcbiAgICAgICAgICBuZXRfOTA6ICdOZXQgOTAnLCBkdWVfb25fcmVjZWlwdDogJ0R1ZSBvbiBSZWNlaXB0JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhdXRvX3JlbmV3YWw6IHsgbGFiZWw6ICdBdXRvIFJlbmV3YWwnIH0sXG4gICAgICByZW5ld2FsX25vdGljZV9kYXlzOiB7IGxhYmVsOiAnUmVuZXdhbCBOb3RpY2UgKERheXMpJyB9LFxuICAgICAgY29udHJhY3RfdHlwZToge1xuICAgICAgICBsYWJlbDogJ0NvbnRyYWN0IFR5cGUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uOiAnU3Vic2NyaXB0aW9uJywgc2VydmljZTogJ1NlcnZpY2UgQWdyZWVtZW50JywgbGljZW5zZTogJ0xpY2Vuc2UnLFxuICAgICAgICAgIHBhcnRuZXJzaGlwOiAnUGFydG5lcnNoaXAnLCBuZGE6ICdOREEnLCBtc2E6ICdNU0EnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNpZ25lZF9kYXRlOiB7IGxhYmVsOiAnU2lnbmVkIERhdGUnIH0sXG4gICAgICBzaWduZWRfYnk6IHsgbGFiZWw6ICdTaWduZWQgQnknIH0sXG4gICAgICBkb2N1bWVudF91cmw6IHsgbGFiZWw6ICdDb250cmFjdCBEb2N1bWVudCcgfSxcbiAgICAgIHNwZWNpYWxfdGVybXM6IHsgbGFiZWw6ICdTcGVjaWFsIFRlcm1zJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwdGlvbicgfSxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBsYWJlbDogJ0JpbGxpbmcgQWRkcmVzcycgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2NvbnRyYWN0czogeyBsYWJlbDogJ0FsbCBDb250cmFjdHMnIH0sXG4gICAgICByZW5ld2FsX2NhbGVuZGFyOiB7IGxhYmVsOiAnUmVuZXdhbCBDYWxlbmRhcicgfSxcbiAgICAgIGNvbnRyYWN0X2dhbnR0OiB7IGxhYmVsOiAnQ29udHJhY3QgVGVybXMnIH0sXG4gICAgICBjb250cmFjdF90aW1lbGluZTogeyBsYWJlbDogJ0NvbnRyYWN0IFRpbWVsaW5lJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0NvbnRyYWN0IEluZm9ybWF0aW9uJyB9LFxuICAgICAgcGFydGllczogeyBsYWJlbDogJ1BhcnRpZXMnIH0sXG4gICAgICB0ZXJtczogeyBsYWJlbDogJ1Rlcm1zICYgRGF0ZXMnIH0sXG4gICAgICB2YWx1ZTogeyBsYWJlbDogJ0NvbnRyYWN0IFZhbHVlJyB9LFxuICAgICAgc3RhdHVzOiB7IGxhYmVsOiAnU3RhdHVzICYgQXBwcm92YWwnIH0sXG4gICAgICByZW5ld2FsOiB7IGxhYmVsOiAnUmVuZXdhbCcgfSxcbiAgICAgIC8vIEZvcm0gc2VjdGlvbiBuYW1lcyBvbiBjb250cmFjdC52aWV3LnRzICgjMTEwMCkuIGBjb250cmFjdF90ZXJtc2AsXG4gICAgICAvLyBub3QgYHRlcm1zYCBcdTIwMTQgYHRlcm1zYCBpcyBhbHJlYWR5IHRoZSBmaWVsZEdyb3VwIGtleSBmb3IgXCJUZXJtcyAmIERhdGVzXCIuXG4gICAgICBjb250cmFjdF90ZXJtczogeyBsYWJlbDogJ1Rlcm1zJyB9LFxuICAgICAgc2lnbmluZ19hbmRfZG9jdW1lbnRzOiB7IGxhYmVsOiAnU2lnbmluZyAmIERvY3VtZW50cycgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnTm90ZXMnIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX3Byb2R1Y3Q6IHtcbiAgICBsYWJlbDogJ1Byb2R1Y3QnLFxuICAgIHBsdXJhbExhYmVsOiAnUHJvZHVjdHMnLFxuICAgIGZpZWxkczoge1xuICAgICAgcHJvZHVjdF9jb2RlOiB7IGxhYmVsOiAnUHJvZHVjdCBDb2RlJyB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ1Byb2R1Y3QgTmFtZScgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcHRpb24nIH0sXG4gICAgICBjYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ0NhdGVnb3J5JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHNvZnR3YXJlOiAnU29mdHdhcmUnLCBoYXJkd2FyZTogJ0hhcmR3YXJlJywgc2VydmljZTogJ1NlcnZpY2UnLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbjogJ1N1YnNjcmlwdGlvbicsIHN1cHBvcnQ6ICdTdXBwb3J0JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmYW1pbHk6IHtcbiAgICAgICAgbGFiZWw6ICdQcm9kdWN0IEZhbWlseScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBlbnRlcnByaXNlOiAnRW50ZXJwcmlzZSBTb2x1dGlvbnMnLCBzbWI6ICdTTUIgU29sdXRpb25zJyxcbiAgICAgICAgICBzZXJ2aWNlczogJ1Byb2Zlc3Npb25hbCBTZXJ2aWNlcycsIGNsb3VkOiAnQ2xvdWQgU2VydmljZXMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxpc3RfcHJpY2U6IHsgbGFiZWw6ICdMaXN0IFByaWNlJyB9LFxuICAgICAgY29zdDogeyBsYWJlbDogJ0Nvc3QnIH0sXG4gICAgICBza3U6IHsgbGFiZWw6ICdTS1UnIH0sXG4gICAgICBpc19hY3RpdmU6IHsgbGFiZWw6ICdBY3RpdmUnIH0sXG4gICAgICBwcm9kdWN0X21hbmFnZXI6IHsgbGFiZWw6ICdQcm9kdWN0IE1hbmFnZXInIH0sXG4gICAgICBpbWFnZTogeyBsYWJlbDogJ1Byb2R1Y3QgSW1hZ2UnIH0sXG4gICAgICBkYXRhc2hlZXQ6IHsgbGFiZWw6ICdEYXRhc2hlZXQnIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnRGlzcGxheSBUaXRsZScgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX3Byb2R1Y3RzOiB7IGxhYmVsOiAnQWxsIFByb2R1Y3RzJyB9LFxuICAgICAgcHJvZHVjdF9jYXRhbG9nOiB7IGxhYmVsOiAnUHJvZHVjdCBDYXRhbG9nJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1Byb2R1Y3QgSW5mb3JtYXRpb24nIH0sXG4gICAgICBwcmljaW5nOiB7IGxhYmVsOiAnUHJpY2luZycgfSxcbiAgICAgIG1ldGFkYXRhOiB7IGxhYmVsOiAnUmVzb3VyY2VzJyB9LFxuICAgICAgLy8gRm9ybSBzZWN0aW9uIG5hbWVzIG9uIHByb2R1Y3Qudmlldy50cyAoIzExMDApXG4gICAgICBwcm9kdWN0X2luZm86IHsgbGFiZWw6ICdQcm9kdWN0IEluZm8nIH0sXG4gICAgICBwcmljaW5nX2luZm86IHsgbGFiZWw6ICdQcmljaW5nJyB9LFxuICAgICAgbWVkaWE6IHsgbGFiZWw6ICdNZWRpYScgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9vYmplY3RzLnNlcnZpY2UudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9vYmplY3RzLnNlcnZpY2UudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgT2JqZWN0VHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuaW1wb3J0IHsgYWN0aXZpdHlBY3Rpb25zIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLyoqXG4gKiBFbmdsaXNoIChlbikgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBTRVJWSUNFIGZhbWlseTpcbiAqIHBvc3Qtc2FsZSBzdXBwb3J0IFx1MjAxNCBjYXNlcyBhbmQgdGhlIGtub3dsZWRnZSB0aGF0IGRlZmxlY3RzIHRoZW0uXG4gKlxuICogUm9zdGVyOiBgY3JtX2Nhc2VgLCBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCwgYGNybV9hcnRpY2xlX2ZlZWRiYWNrYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXJ2aWNlOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fY2FzZToge1xuICAgIGxhYmVsOiAnQ2FzZScsXG4gICAgcGx1cmFsTGFiZWw6ICdDYXNlcycsXG4gICAgZmllbGRzOiB7XG4gICAgICBjYXNlX251bWJlcjogeyBsYWJlbDogJ0Nhc2UgTnVtYmVyJyB9LFxuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1N1YmplY3QnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXB0aW9uJyB9LFxuICAgICAgY3JtX2FjY291bnQ6IHsgbGFiZWw6ICdBY2NvdW50JyB9LFxuICAgICAgY3JtX2NvbnRhY3Q6IHsgbGFiZWw6ICdDb250YWN0JyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnU3RhdHVzJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ldzogJ05ldycsIGluX3Byb2dyZXNzOiAnSW4gUHJvZ3Jlc3MnLCB3YWl0aW5nX2N1c3RvbWVyOiAnV2FpdGluZyBvbiBDdXN0b21lcicsXG4gICAgICAgICAgd2FpdGluZ19zdXBwb3J0OiAnV2FpdGluZyBvbiBTdXBwb3J0JywgZXNjYWxhdGVkOiAnRXNjYWxhdGVkJyxcbiAgICAgICAgICByZXNvbHZlZDogJ1Jlc29sdmVkJywgY2xvc2VkOiAnQ2xvc2VkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwcmlvcml0eToge1xuICAgICAgICBsYWJlbDogJ1ByaW9yaXR5JyxcbiAgICAgICAgb3B0aW9uczogeyBsb3c6ICdMb3cnLCBtZWRpdW06ICdNZWRpdW0nLCBoaWdoOiAnSGlnaCcsIGNyaXRpY2FsOiAnQ3JpdGljYWwnIH0sXG4gICAgICB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ0Nhc2UgVHlwZScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBxdWVzdGlvbjogJ1F1ZXN0aW9uJywgcHJvYmxlbTogJ1Byb2JsZW0nLFxuICAgICAgICAgIGZlYXR1cmVfcmVxdWVzdDogJ0ZlYXR1cmUgUmVxdWVzdCcsIGJ1ZzogJ0J1ZycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgb3JpZ2luOiB7XG4gICAgICAgIGxhYmVsOiAnQ2FzZSBPcmlnaW4nLFxuICAgICAgICBvcHRpb25zOiB7IGVtYWlsOiAnRW1haWwnLCBwaG9uZTogJ1Bob25lJywgd2ViOiAnV2ViJywgY2hhdDogJ0NoYXQnLCBzb2NpYWxfbWVkaWE6ICdTb2NpYWwgTWVkaWEnIH0sXG4gICAgICB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdDYXNlIE93bmVyJyB9LFxuICAgICAgY2xvc2VkX2RhdGU6IHsgbGFiZWw6ICdDbG9zZWQgRGF0ZScgfSxcbiAgICAgIGZpcnN0X3Jlc3BvbnNlX2RhdGU6IHsgbGFiZWw6ICdGaXJzdCBSZXNwb25zZSBEYXRlJyB9LFxuICAgICAgcmVzb2x1dGlvbl90aW1lX2hvdXJzOiB7IGxhYmVsOiAnUmVzb2x1dGlvbiBUaW1lIChIb3VycyknIH0sXG4gICAgICBzbGFfZHVlX2RhdGU6IHsgbGFiZWw6ICdTTEEgRHVlIERhdGUnLCBoZWxwOiAnU2V0IGZyb20gdGhlIGNhc2UgcHJpb3JpdHkgYW5kIHRoZSBhY2NvdW50XHUyMDE5cyBDdXN0b21lciBUaWVyLCBpbiBjYWxlbmRhciBob3VyczogbmlnaHRzLCB3ZWVrZW5kcyBhbmQgaG9saWRheXMgY291bnQuJyB9LFxuICAgICAgaXNfc2xhX3Zpb2xhdGVkOiB7IGxhYmVsOiAnU0xBIFZpb2xhdGVkJyB9LFxuICAgICAgaXNfZXNjYWxhdGVkOiB7IGxhYmVsOiAnRXNjYWxhdGVkJyB9LFxuICAgICAgZXNjYWxhdGlvbl9yZWFzb246IHsgbGFiZWw6ICdFc2NhbGF0aW9uIFJlYXNvbicgfSxcbiAgICAgIHJlc29sdXRpb246IHsgbGFiZWw6ICdSZXNvbHV0aW9uJyB9LFxuICAgICAgcmVzb2x2ZWRfYnlfYXJ0aWNsZTogeyBsYWJlbDogJ1Jlc29sdmVkIGJ5IEFydGljbGUnLCBoZWxwOiAnS25vd2xlZGdlIGFydGljbGUgdGhhdCByZXNvbHZlZCB0aGlzIGNhc2UgXHUyMDE0IHRoZSBkZWZsZWN0aW9uIHNpZ25hbC4nIH0sXG4gICAgICBpbnRlcm5hbF9ub3RlczogeyBsYWJlbDogJ0ludGVybmFsIE5vdGVzJywgaGVscDogJ0ludGVybmFsIG5vdGVzOyBub3QgdmlzaWJsZSB0byB0aGUgY3VzdG9tZXIuJyB9LFxuICAgICAgaXNfY2xvc2VkOiB7IGxhYmVsOiAnSXMgQ2xvc2VkJyB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ0Rpc3BsYXkgVGl0bGUnIH0sXG4gICAgICBwcmlvcml0eV9yYW5rOiB7IGxhYmVsOiAnUHJpb3JpdHkgUmFuaycgfSxcbiAgICAgIGVzY2FsYXRlZF9kYXRlOiB7IGxhYmVsOiAnRXNjYWxhdGVkIERhdGUnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9jYXNlczogeyBsYWJlbDogJ0FsbCBDYXNlcycgfSxcbiAgICAgIGNhc2Vfd29ya2Zsb3c6IHsgbGFiZWw6ICdTZXJ2aWNlIFdvcmtmbG93JyB9LFxuICAgICAgc2xhX2NhbGVuZGFyOiB7IGxhYmVsOiAnU0xBIENhbGVuZGFyJyB9LFxuICAgICAgY2FzZV90aW1lbGluZTogeyBsYWJlbDogJ0Nhc2UgVGltZWxpbmUnIH0sXG4gICAgICB1bmFzc2lnbmVkX3RyaWFnZToge1xuICAgICAgICBsYWJlbDogJ1VuYXNzaWduZWQgXHUyMDE0IHRyaWFnZScsXG4gICAgICAgIGVtcHR5U3RhdGU6IHtcbiAgICAgICAgICB0aXRsZTogJ05vdGhpbmcgd2FpdGluZyBmb3IgdHJpYWdlJyxcbiAgICAgICAgICBtZXNzYWdlOiAnRXZlcnkgY2FzZSBoYXMgYW4gb3duZXIuIENhc2VzIGFwcGVhciBoZXJlIHdoZW4gdGhleSBhcnJpdmUgd2l0aCBubyBvd25lciBcdTIwMTQgdHlwaWNhbGx5IGEgd2ViLXRvLWNhc2Ugc3VibWlzc2lvbiB0aGF0IGFycml2ZWQgd2hpbGUgbm9ib2R5IGhlbGQgdGhlIFNlcnZpY2UgQWdlbnQgcG9zaXRpb24uJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlc2NhbGF0ZWRfY2FzZXM6IHsgbGFiZWw6ICdFc2NhbGF0ZWQgQ2FzZXMnIH0sXG4gICAgICBteV9vcGVuX2Nhc2VzOiB7IGxhYmVsOiAnTXkgT3BlbiBDYXNlcycgfSxcbiAgICAgIHNsYV9hdF9yaXNrOiB7IGxhYmVsOiAnXHUyM0YwIFNMQSBhdCBSaXNrJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0Nhc2UgSW5mb3JtYXRpb24nIH0sXG4gICAgICBvcmlnaW46IHsgbGFiZWw6ICdPcmlnaW4gJiBSb3V0aW5nJyB9LFxuICAgICAgc2xhOiB7IGxhYmVsOiAnU0xBICYgUHJpb3JpdHknIH0sXG4gICAgICByZXNvbHV0aW9uOiB7IGxhYmVsOiAnUmVzb2x1dGlvbicgfSxcbiAgICAgIGVzY2FsYXRpb246IHsgbGFiZWw6ICdFc2NhbGF0aW9uJyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnU3lzdGVtJyB9LFxuICAgICAgLy8gVGhlIGRldGFpbCBwYWdlJ3Mgc2VjdGlvbnMgcmVmZXJlbmNlIHRoZSBncm91cHMgYWJvdmUgKCM5NzApLCBzbyBpdFxuICAgICAgLy8gaGFzIG5vIHNlY3Rpb24gbmFtZXMgb2YgaXRzIG93bi5cbiAgICAgIC8vIEZvcm0gc2VjdGlvbiBuYW1lcyBvbiBjYXNlLnZpZXcudHMgKCMxMTAwKS5cbiAgICAgIGNhc2U6IHsgbGFiZWw6ICdDYXNlJyB9LFxuICAgICAgaG93X2Nhbl93ZV9oZWxwOiB7IGxhYmVsOiAnSG93IGNhbiB3ZSBoZWxwPycgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7XG4gICAgICAuLi5hY3Rpdml0eUFjdGlvbnMsXG4gICAgICBlc2NhbGF0ZV9jYXNlOiB7XG4gICAgICAgIGxhYmVsOiAnRXNjYWxhdGUgQ2FzZScsXG4gICAgICAgIGNvbmZpcm1UZXh0OiAnVGhpcyB3aWxsIGVzY2FsYXRlIHRoZSBjYXNlIHRvIHRoZSBlc2NhbGF0aW9uIHRlYW0uIENvbnRpbnVlPycsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnQ2FzZSBlc2NhbGF0ZWQgc3VjY2Vzc2Z1bGx5IScsXG4gICAgICB9LFxuICAgICAgY2xvc2VfY2FzZToge1xuICAgICAgICBsYWJlbDogJ0Nsb3NlIENhc2UnLFxuICAgICAgICBjb25maXJtVGV4dDogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjbG9zZSB0aGlzIGNhc2U/JyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdDYXNlIGNsb3NlZCBzdWNjZXNzZnVsbHkhJyxcbiAgICAgIH0sXG4gICAgICBjbGFpbV9jYXNlOiB7XG4gICAgICAgIGxhYmVsOiAnQ2xhaW0gQ2FzZScsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnQ2FzZSBjbGFpbWVkIFx1MjAxNCBpdCBpcyB5b3VycyBub3cuJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX2tub3dsZWRnZV9hcnRpY2xlOiB7XG4gICAgbGFiZWw6ICdLbm93bGVkZ2UgQXJ0aWNsZScsXG4gICAgcGx1cmFsTGFiZWw6ICdLbm93bGVkZ2UgQmFzZScsXG4gICAgZGVzY3JpcHRpb246ICdSZXVzYWJsZSBhbnN3ZXJzIGFuZCBob3ctdG8gZ3VpZGVzIGZvciBjdXN0b21lcnMgYW5kIGFnZW50cycsXG4gICAgZmllbGRzOiB7XG4gICAgICBhcnRpY2xlX251bWJlcjogeyBsYWJlbDogJ0FydGljbGUgIycgfSxcbiAgICAgIHRpdGxlOiB7IGxhYmVsOiAnVGl0bGUnIH0sXG4gICAgICBzdW1tYXJ5OiB7IGxhYmVsOiAnU3VtbWFyeScsIGhlbHA6ICdPbmUtcGFyYWdyYXBoIFRMO0RSIHNob3duIGluIHNlYXJjaCByZXN1bHRzIGFuZCBBSSBjaXRhdGlvbnMuJyB9LFxuICAgICAgYm9keTogeyBsYWJlbDogJ0JvZHknLCBoZWxwOiAnRnVsbCBhcnRpY2xlIGNvbnRlbnQgKE1hcmtkb3duKS4nIH0sXG4gICAgICBjYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ0NhdGVnb3J5JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGdldHRpbmdfc3RhcnRlZDogJ0dldHRpbmcgU3RhcnRlZCcsIGhvd190bzogJ0hvdy1UbycsXG4gICAgICAgICAgdHJvdWJsZXNob290aW5nOiAnVHJvdWJsZXNob290aW5nJywgYmlsbGluZzogJ0JpbGxpbmcgJiBQcmljaW5nJywgYXBpOiAnQVBJICYgSW50ZWdyYXRpb25zJyxcbiAgICAgICAgICByZWxlYXNlX25vdGVzOiAnUmVsZWFzZSBOb3RlcycsIHBvbGljeTogJ1BvbGljeScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdGFnczoge1xuICAgICAgICBsYWJlbDogJ1RhZ3MnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYXV0aDogJ0F1dGgnLCBzc286ICdTU08nLCBtb2JpbGU6ICdNb2JpbGUnLCBlbWFpbDogJ0VtYWlsJyxcbiAgICAgICAgICByZXBvcnRzOiAnUmVwb3J0cycsIHBlcmZvcm1hbmNlOiAnUGVyZm9ybWFuY2UnLCBkYXRhX2ltcG9ydDogJ0RhdGEgSW1wb3J0JyxcbiAgICAgICAgICB3ZWJob29rczogJ1dlYmhvb2tzJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgICBvcHRpb25zOiB7IGRyYWZ0OiAnRHJhZnQnLCBpbl9yZXZpZXc6ICdJbiBSZXZpZXcnLCBwdWJsaXNoZWQ6ICdQdWJsaXNoZWQnLCBhcmNoaXZlZDogJ0FyY2hpdmVkJyB9LFxuICAgICAgfSxcbiAgICAgIGF1ZGllbmNlOiB7XG4gICAgICAgIGxhYmVsOiAnQXVkaWVuY2UnLFxuICAgICAgICBoZWxwOiAnUHVibGljIGFydGljbGVzIGFyZSB2aXNpYmxlIGluIHRoZSBjdXN0b21lciBwb3J0YWw7IGludGVybmFsIGFydGljbGVzIGFyZSBhZ2VudC1vbmx5LicsXG4gICAgICAgIG9wdGlvbnM6IHsgcHVibGljOiAnUHVibGljJywgaW50ZXJuYWw6ICdJbnRlcm5hbCcgfSxcbiAgICAgIH0sXG4gICAgICBsYW5ndWFnZToge1xuICAgICAgICBsYWJlbDogJ0xhbmd1YWdlJyxcbiAgICAgICAgb3B0aW9uczogeyBlbjogJ0VuZ2xpc2gnLCB6aF9jbjogJ1NpbXBsaWZpZWQgQ2hpbmVzZScsIGVzX2VzOiAnU3BhbmlzaCcsIGphX2pwOiAnSmFwYW5lc2UnIH0sXG4gICAgICB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdPd25lcicgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY2FzZTogeyBsYWJlbDogJ1NvdXJjZSBDYXNlJywgaGVscDogJ0Nhc2UgdGhpcyBhcnRpY2xlIHdhcyBhdXRob3JlZCBmcm9tIChvcHRpb25hbCkuJyB9LFxuICAgICAgcHVibGlzaGVkX2F0OiB7IGxhYmVsOiAnUHVibGlzaGVkIEF0JyB9LFxuICAgICAgbGFzdF9yZXZpZXdlZF9hdDogeyBsYWJlbDogJ0xhc3QgUmV2aWV3ZWQnIH0sXG4gICAgICBoZWxwZnVsX2NvdW50OiB7IGxhYmVsOiAnSGVscGZ1bCcsIGhlbHA6ICdSZWNvdW50ZWQgZnJvbSBjcm1fYXJ0aWNsZV9mZWVkYmFjayBcdTIwMTQgbmV2ZXIgdHlwZWQgaW4uJyB9LFxuICAgICAgbm90X2hlbHBmdWxfY291bnQ6IHsgbGFiZWw6ICdOb3QgSGVscGZ1bCcsIGhlbHA6ICdSZWNvdW50ZWQgZnJvbSBjcm1fYXJ0aWNsZV9mZWVkYmFjayBcdTIwMTQgbmV2ZXIgdHlwZWQgaW4uJyB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ0Rpc3BsYXkgVGl0bGUnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9hcnRpY2xlczogeyBsYWJlbDogJ0FsbCBBcnRpY2xlcycgfSxcbiAgICAgIHB1Ymxpc2hlZF9hcnRpY2xlczogeyBsYWJlbDogJ1B1Ymxpc2hlZCcgfSxcbiAgICAgIG15X2RyYWZ0czogeyBsYWJlbDogJ015IERyYWZ0cycgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdBcnRpY2xlIEluZm9ybWF0aW9uJyB9LFxuICAgICAgY29udGVudDogeyBsYWJlbDogJ0NvbnRlbnQnIH0sXG4gICAgICB0YXhvbm9teTogeyBsYWJlbDogJ0NhdGVnb3JpemF0aW9uJyB9LFxuICAgICAgbWV0cmljczogeyBsYWJlbDogJ0VuZ2FnZW1lbnQnIH0sXG4gICAgICBlbmdhZ2VtZW50OiB7IGxhYmVsOiAnRW5nYWdlbWVudCcgfSxcbiAgICAgIC8vIEZvcm0gc2VjdGlvbiBuYW1lIG9uIGtub3dsZWRnZV9hcnRpY2xlLnZpZXcudHMgKCMxMTAwKVxuICAgICAgYXJ0aWNsZTogeyBsYWJlbDogJ0FydGljbGUnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgbWFya19hcnRpY2xlX2hlbHBmdWw6IHtcbiAgICAgICAgbGFiZWw6ICdIZWxwZnVsJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdUaGFua3MgXHUyMDE0IHJlY29yZGVkIGFzIGhlbHBmdWwuJyxcbiAgICAgIH0sXG4gICAgICBtYXJrX2FydGljbGVfbm90X2hlbHBmdWw6IHtcbiAgICAgICAgbGFiZWw6ICdOb3QgSGVscGZ1bCcsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnVGhhbmtzIFx1MjAxNCByZWNvcmRlZCBhcyBub3QgaGVscGZ1bC4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fYXJ0aWNsZV9mZWVkYmFjazoge1xuICAgIGxhYmVsOiAnQXJ0aWNsZSBGZWVkYmFjaycsXG4gICAgcGx1cmFsTGFiZWw6ICdBcnRpY2xlIEZlZWRiYWNrJyxcbiAgICBkZXNjcmlwdGlvbjogJ09uZSByZWFkZXJcdTIwMTlzIGhlbHBmdWwgLyBub3QtaGVscGZ1bCB2ZXJkaWN0IG9uIGEga25vd2xlZGdlIGFydGljbGUnLFxuICAgIGZpZWxkczoge1xuICAgICAgZmVlZGJhY2tfbnVtYmVyOiB7IGxhYmVsOiAnRmVlZGJhY2sgIycgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnUmVhZGVyJyB9LFxuICAgICAgY3JtX2tub3dsZWRnZV9hcnRpY2xlOiB7IGxhYmVsOiAnQXJ0aWNsZScsIGhlbHA6ICdLbm93bGVkZ2UgYXJ0aWNsZSB0aGlzIGZlZWRiYWNrIGlzIGFib3V0LicgfSxcbiAgICAgIHZlcmRpY3Q6IHtcbiAgICAgICAgbGFiZWw6ICdWZXJkaWN0JyxcbiAgICAgICAgb3B0aW9uczogeyBoZWxwZnVsOiAnSGVscGZ1bCcsIG5vdF9oZWxwZnVsOiAnTm90IEhlbHBmdWwnIH0sXG4gICAgICB9LFxuICAgICAgY29tbWVudDogeyBsYWJlbDogJ0NvbW1lbnQnLCBoZWxwOiAnT3B0aW9uYWwgbm90ZSBleHBsYWluaW5nIHRoZSB2ZXJkaWN0IFx1MjAxNCByZWFkIGJ5IHRoZSBhcnRpY2xlXHUyMDE5cyBhdXRob3IuJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0ZlZWRiYWNrJyB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuL29iamVjdHMuYWN0aXZpdHkudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9vYmplY3RzLmFjdGl2aXR5LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbi8qKlxuICogRW5nbGlzaCAoZW4pIFx1MjAxNCBgb2JqZWN0c2AgdHJhbnNsYXRpb25zIGZvciB0aGUgQUNUSVZJVFkgZmFtaWx5OlxuICogdGhlIGludGVyYWN0aW9uIGxvZyBcdTIwMTQgdGFza3MsIGV2ZW50cywgYW5kIHdobyBhdHRlbmRlZC5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fdGFza2AsIGBjcm1fZXZlbnRgLCBgY3JtX2V2ZW50X2F0dGVuZGVlYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBhY3Rpdml0eTogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX3Rhc2s6IHtcbiAgICBsYWJlbDogJ1Rhc2snLFxuICAgIHBsdXJhbExhYmVsOiAnVGFza3MnLFxuICAgIGZpZWxkczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1N1YmplY3QnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXB0aW9uJyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnU3RhdHVzJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5vdF9zdGFydGVkOiAnTm90IFN0YXJ0ZWQnLCBpbl9wcm9ncmVzczogJ0luIFByb2dyZXNzJywgd2FpdGluZzogJ1dhaXRpbmcnLFxuICAgICAgICAgIGNvbXBsZXRlZDogJ0NvbXBsZXRlZCcsIGRlZmVycmVkOiAnRGVmZXJyZWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHByaW9yaXR5OiB7XG4gICAgICAgIGxhYmVsOiAnUHJpb3JpdHknLFxuICAgICAgICBvcHRpb25zOiB7IGxvdzogJ0xvdycsIG5vcm1hbDogJ05vcm1hbCcsIGhpZ2g6ICdIaWdoJywgdXJnZW50OiAnVXJnZW50JyB9LFxuICAgICAgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUYXNrIFR5cGUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY2FsbDogJ0NhbGwnLCBlbWFpbDogJ0VtYWlsJywgbWVldGluZzogJ01lZXRpbmcnLFxuICAgICAgICAgIGZvbGxvd191cDogJ0ZvbGxvdy11cCcsIGRlbW86ICdEZW1vJywgb3RoZXI6ICdPdGhlcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZHVlX2RhdGU6IHsgbGFiZWw6ICdEdWUgRGF0ZScgfSxcbiAgICAgIHJlbWluZGVyX2RhdGU6IHsgbGFiZWw6ICdSZW1pbmRlciBEYXRlL1RpbWUnIH0sXG4gICAgICBjb21wbGV0ZWRfZGF0ZTogeyBsYWJlbDogJ0NvbXBsZXRlZCBEYXRlJyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdBc3NpZ25lZCBUbycgfSxcbiAgICAgIHJlbGF0ZWRfdG9fdHlwZToge1xuICAgICAgICBsYWJlbDogJ1JlbGF0ZWQgVG8gVHlwZScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjcm1fYWNjb3VudDogJ0FjY291bnQnLCBjcm1fY29udGFjdDogJ0NvbnRhY3QnLCBjcm1fb3Bwb3J0dW5pdHk6ICdPcHBvcnR1bml0eScsXG4gICAgICAgICAgY3JtX2xlYWQ6ICdMZWFkJywgY3JtX2Nhc2U6ICdDYXNlJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZWxhdGVkX3RvX2FjY291bnQ6IHsgbGFiZWw6ICdSZWxhdGVkIEFjY291bnQnIH0sXG4gICAgICByZWxhdGVkX3RvX2NvbnRhY3Q6IHsgbGFiZWw6ICdSZWxhdGVkIENvbnRhY3QnIH0sXG4gICAgICByZWxhdGVkX3RvX29wcG9ydHVuaXR5OiB7IGxhYmVsOiAnUmVsYXRlZCBPcHBvcnR1bml0eScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fbGVhZDogeyBsYWJlbDogJ1JlbGF0ZWQgTGVhZCcgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY2FzZTogeyBsYWJlbDogJ1JlbGF0ZWQgQ2FzZScgfSxcbiAgICAgIGlzX3JlY3VycmluZzogeyBsYWJlbDogJ1JlY3VycmluZyBUYXNrJyB9LFxuICAgICAgcmVjdXJyZW5jZV90eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnUmVjdXJyZW5jZSBUeXBlJyxcbiAgICAgICAgb3B0aW9uczogeyBkYWlseTogJ0RhaWx5Jywgd2Vla2x5OiAnV2Vla2x5JywgbW9udGhseTogJ01vbnRobHknLCB5ZWFybHk6ICdZZWFybHknIH0sXG4gICAgICB9LFxuICAgICAgcmVjdXJyZW5jZV9pbnRlcnZhbDogeyBsYWJlbDogJ1JlY3VycmVuY2UgSW50ZXJ2YWwnIH0sXG4gICAgICByZWN1cnJlbmNlX2VuZF9kYXRlOiB7IGxhYmVsOiAnUmVjdXJyZW5jZSBFbmQgRGF0ZScgfSxcbiAgICAgIGlzX2NvbXBsZXRlZDogeyBsYWJlbDogJ0lzIENvbXBsZXRlZCcgfSxcbiAgICAgIGlzX292ZXJkdWU6IHsgbGFiZWw6ICdJcyBPdmVyZHVlJyB9LFxuICAgICAgcHJvZ3Jlc3NfcGVyY2VudDogeyBsYWJlbDogJ1Byb2dyZXNzICglKScgfSxcbiAgICAgIHByaW9yaXR5X3Jhbms6IHsgbGFiZWw6ICdQcmlvcml0eSBSYW5rJyB9LFxuICAgICAgcmVtaW5kZXJfc2VudDogeyBsYWJlbDogJ1JlbWluZGVyIFNlbnQnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF90YXNrczogeyBsYWJlbDogJ0FsbCBUYXNrcycgfSxcbiAgICAgIHRhc2tfYm9hcmQ6IHsgbGFiZWw6ICdUYXNrIEJvYXJkJyB9LFxuICAgICAgdGFza19jYWxlbmRhcjogeyBsYWJlbDogJ1Rhc2sgU2NoZWR1bGUnIH0sXG4gICAgICB0YXNrX2dhbnR0OiB7IGxhYmVsOiAnRXhlY3V0aW9uIFBsYW4nIH0sXG4gICAgICB0YXNrX3RpbWVsaW5lOiB7IGxhYmVsOiAnV29ya2xvZyBUaW1lbGluZScgfSxcbiAgICAgIG15X29wZW5fdGFza3M6IHsgbGFiZWw6ICdNeSBPcGVuIFRhc2tzJyB9LFxuICAgICAgdG9kYXlzX3Rhc2tzOiB7IGxhYmVsOiAnXHVEODNEXHVEQ0M1IE15IFByaW9yaXR5IFRhc2tzJyB9LFxuICAgICAgb3ZlcmR1ZV90YXNrczogeyBsYWJlbDogJ1x1MjNGMCBPcGVuIFRhc2tzIFx1MDBCNyBNb3N0IE92ZXJkdWUgRmlyc3QnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnVGFzayBJbmZvcm1hdGlvbicgfSxcbiAgICAgIHNjaGVkdWxpbmc6IHsgbGFiZWw6ICdTY2hlZHVsaW5nJyB9LFxuICAgICAgcmVsYXRlZDogeyBsYWJlbDogJ1JlbGF0ZWQgUmVjb3JkcycgfSxcbiAgICAgIHJlY3VycmVuY2U6IHsgbGFiZWw6ICdSZWN1cnJlbmNlJyB9LFxuICAgICAgZWZmb3J0OiB7IGxhYmVsOiAnUHJvZ3Jlc3MgJiBFZmZvcnQnIH0sXG4gICAgICBzeXN0ZW06IHsgbGFiZWw6ICdTeXN0ZW0nIH0sXG4gICAgICAvLyBGb3JtIHNlY3Rpb24gbmFtZXMgb24gdGFzay52aWV3LnRzICgjMTEwMClcbiAgICAgIHRhc2s6IHsgbGFiZWw6ICdUYXNrJyB9LFxuICAgICAgcmVsYXRlZF9yZWNvcmRzOiB7IGxhYmVsOiAnUmVsYXRlZCBSZWNvcmRzJyB9LFxuICAgICAgcmVjdXJyZW5jZV9hbmRfZWZmb3J0OiB7IGxhYmVsOiAnUmVjdXJyZW5jZSAmIEVmZm9ydCcgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fZXZlbnQ6IHtcbiAgICBsYWJlbDogJ0V2ZW50JyxcbiAgICBwbHVyYWxMYWJlbDogJ0V2ZW50cycsXG4gICAgZGVzY3JpcHRpb246ICdNZWV0aW5ncywgY2FsbHMgYW5kIG90aGVyIHNjaGVkdWxlZCBpbnRlcmFjdGlvbnMgd2l0aCBjdXN0b21lcnMnLFxuICAgIGZpZWxkczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1N1YmplY3QnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXB0aW9uJyB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ0V2ZW50IFR5cGUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWVldGluZzogJ01lZXRpbmcnLCBjYWxsOiAnQ2FsbCcsIGRlbW86ICdEZW1vJyxcbiAgICAgICAgICB3ZWJpbmFyOiAnV2ViaW5hcicsIG9uc2l0ZV92aXNpdDogJ09uc2l0ZSBWaXNpdCcsIG90aGVyOiAnT3RoZXInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1N0YXR1cycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwbGFubmVkOiAnUGxhbm5lZCcsIGhlbGQ6ICdIZWxkJywgY2FuY2VsbGVkOiAnQ2FuY2VsbGVkJywgbm9fc2hvdzogJ05vIFNob3cnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnQXNzaWduZWQgVG8nIH0sXG4gICAgICBzdGFydF9kYXRldGltZTogeyBsYWJlbDogJ1N0YXJ0JyB9LFxuICAgICAgZW5kX2RhdGV0aW1lOiB7IGxhYmVsOiAnRW5kJyB9LFxuICAgICAgYWxsX2RheTogeyBsYWJlbDogJ0FsbCBEYXkgRXZlbnQnIH0sXG4gICAgICBkdXJhdGlvbl9taW51dGVzOiB7IGxhYmVsOiAnRHVyYXRpb24gKG1pbnV0ZXMpJyB9LFxuICAgICAgbG9jYXRpb246IHsgbGFiZWw6ICdMb2NhdGlvbicsIGhlbHA6ICdSb29tLCBhZGRyZXNzLCBvciBtZWV0aW5nIGxpbmsnIH0sXG4gICAgICByZWxhdGVkX3RvX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdSZWxhdGVkIFRvIFR5cGUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY3JtX2FjY291bnQ6ICdBY2NvdW50JywgY3JtX2NvbnRhY3Q6ICdDb250YWN0JywgY3JtX29wcG9ydHVuaXR5OiAnT3Bwb3J0dW5pdHknLFxuICAgICAgICAgIGNybV9sZWFkOiAnTGVhZCcsIGNybV9jYXNlOiAnQ2FzZScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmVsYXRlZF90b19hY2NvdW50OiB7IGxhYmVsOiAnUmVsYXRlZCBBY2NvdW50JyB9LFxuICAgICAgcmVsYXRlZF90b19jb250YWN0OiB7IGxhYmVsOiAnUmVsYXRlZCBDb250YWN0JyB9LFxuICAgICAgcmVsYXRlZF90b19vcHBvcnR1bml0eTogeyBsYWJlbDogJ1JlbGF0ZWQgT3Bwb3J0dW5pdHknIH0sXG4gICAgICByZWxhdGVkX3RvX2xlYWQ6IHsgbGFiZWw6ICdSZWxhdGVkIExlYWQnIH0sXG4gICAgICByZWxhdGVkX3RvX2Nhc2U6IHsgbGFiZWw6ICdSZWxhdGVkIENhc2UnIH0sXG4gICAgICBvdXRjb21lX25vdGVzOiB7IGxhYmVsOiAnT3V0Y29tZSBOb3RlcycsIGhlbHA6ICdXaGF0IHdhcyBhZ3JlZWQsIGFuZCB3aGF0IGhhcHBlbnMgbmV4dCcgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2V2ZW50czogeyBsYWJlbDogJ0FsbCBFdmVudHMnIH0sXG4gICAgICBldmVudF9jYWxlbmRhcjogeyBsYWJlbDogJ0V2ZW50IENhbGVuZGFyJyB9LFxuICAgICAgZXZlbnRfdGltZWxpbmU6IHsgbGFiZWw6ICdUZWFtIFNjaGVkdWxlJyB9LFxuICAgICAgbXlfZXZlbnRzOiB7IGxhYmVsOiAnTXkgQ2FsZW5kYXInIH0sXG4gICAgICB1cGNvbWluZ19ldmVudHM6IHsgbGFiZWw6ICdcdUQ4M0RcdURDQzUgVXBjb21pbmcgXHUwMEI3IFNvb25lc3QgRmlyc3QnIH0sXG4gICAgICBoZWxkX2V2ZW50czogeyBsYWJlbDogJ1x1MjcwNSBJbnRlcmFjdGlvbiBIaXN0b3J5JyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0V2ZW50IEluZm9ybWF0aW9uJyB9LFxuICAgICAgc2NoZWR1bGU6IHsgbGFiZWw6ICdTY2hlZHVsZScgfSxcbiAgICAgIHJlbGF0ZWQ6IHsgbGFiZWw6ICdSZWxhdGVkIFJlY29yZHMnIH0sXG4gICAgICBvdXRjb21lOiB7IGxhYmVsOiAnT3V0Y29tZScgfSxcbiAgICAgIC8vIEZvcm0gc2VjdGlvbiBuYW1lcyBvbiBldmVudC52aWV3LnRzICgjMTEwMCkuIGByZWxhdGVkX3JlY29yZHNgLFxuICAgICAgLy8gbm90IGByZWxhdGVkYCBcdTIwMTQgYHJlbGF0ZWRgIGlzIGFscmVhZHkgdGhlIGZpZWxkR3JvdXAga2V5IGFib3ZlLlxuICAgICAgZXZlbnQ6IHsgbGFiZWw6ICdFdmVudCcgfSxcbiAgICAgIHJlbGF0ZWRfcmVjb3JkczogeyBsYWJlbDogJ1JlbGF0ZWQgUmVjb3JkcycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fZXZlbnRfYXR0ZW5kZWU6IHtcbiAgICBsYWJlbDogJ0V2ZW50IEF0dGVuZGVlJyxcbiAgICBwbHVyYWxMYWJlbDogJ0V2ZW50IEF0dGVuZGVlcycsXG4gICAgZGVzY3JpcHRpb246ICdBIHBlcnNvbiBpbnZpdGVkIHRvIG9yIHByZXNlbnQgYXQgYW4gZXZlbnQnLFxuICAgIGZpZWxkczoge1xuICAgICAgYXR0ZW5kZWVfbnVtYmVyOiB7IGxhYmVsOiAnQXR0ZW5kZWUgTnVtYmVyJyB9LFxuICAgICAgY3JtX2V2ZW50OiB7IGxhYmVsOiAnRXZlbnQnIH0sXG4gICAgICBhdHRlbmRlZV90eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnQXR0ZW5kZWUgVHlwZScsXG4gICAgICAgIG9wdGlvbnM6IHsgY29udGFjdDogJ0NvbnRhY3QnLCBsZWFkOiAnTGVhZCcsIHVzZXI6ICdVc2VyJywgZXh0ZXJuYWw6ICdFeHRlcm5hbCcgfSxcbiAgICAgIH0sXG4gICAgICBjcm1fY29udGFjdDogeyBsYWJlbDogJ0NvbnRhY3QnLCBoZWxwOiAnU2V0IHdoZW4gdGhlIGF0dGVuZGVlIGlzIGFuIGV4aXN0aW5nIGN1c3RvbWVyIGNvbnRhY3QnIH0sXG4gICAgICBjcm1fbGVhZDogeyBsYWJlbDogJ0xlYWQnLCBoZWxwOiAnU2V0IHdoZW4gdGhlIGF0dGVuZGVlIGlzIHN0aWxsIGFuIHVuY29udmVydGVkIGxlYWQnIH0sXG4gICAgICBzeXNfdXNlcjogeyBsYWJlbDogJ1VzZXInLCBoZWxwOiAnU2V0IHdoZW4gdGhlIGF0dGVuZGVlIGlzIGEgY29sbGVhZ3VlJyB9LFxuICAgICAgZXh0ZXJuYWxfbmFtZToge1xuICAgICAgICBsYWJlbDogJ0V4dGVybmFsIEF0dGVuZGVlJyxcbiAgICAgICAgaGVscDogJ05hbWUgb2YgYW4gYXR0ZW5kZWUgd2hvIGlzIGluIG5vIENSTSBvYmplY3QgXHUyMDE0IHNldCB3aGVuIEF0dGVuZGVlIFR5cGUgaXMgRXh0ZXJuYWwnLFxuICAgICAgfSxcbiAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgIGxhYmVsOiAnUmVzcG9uc2UnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbm9fcmVzcG9uc2U6ICdObyBSZXNwb25zZScsIGFjY2VwdGVkOiAnQWNjZXB0ZWQnLFxuICAgICAgICAgIGRlY2xpbmVkOiAnRGVjbGluZWQnLCB0ZW50YXRpdmU6ICdUZW50YXRpdmUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGlzX29yZ2FuaXplcjogeyBsYWJlbDogJ09yZ2FuaXplcicgfSxcbiAgICAgIGludml0ZWRfZGF0ZTogeyBsYWJlbDogJ0ludml0ZWQnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9ldmVudF9hdHRlbmRlZXM6IHsgbGFiZWw6ICdFdmVudCBBdHRlbmRlZXMnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnQXR0ZW5kZWUnIH0sXG4gICAgICByZXNwb25zZTogeyBsYWJlbDogJ0ludml0YXRpb24nIH0sXG4gICAgICAvLyBGb3JtIHNlY3Rpb24gbmFtZXMgb24gZXZlbnRfYXR0ZW5kZWUudmlldy50cyAoIzExMDApIFx1MjAxNCBzYW1lIEVuZ2xpc2hcbiAgICAgIC8vIHRleHQgYXMgdGhlIGZpZWxkR3JvdXBzIGFib3ZlLCBidXQgYSBkaXN0aW5jdCBrZXk6IGBhdHRlbmRlZWAgL1xuICAgICAgLy8gYGludml0YXRpb25gIGFyZSBub3QgYGJhc2ljYCAvIGByZXNwb25zZWAuXG4gICAgICBhdHRlbmRlZTogeyBsYWJlbDogJ0F0dGVuZGVlJyB9LFxuICAgICAgaW52aXRhdGlvbjogeyBsYWJlbDogJ0ludml0YXRpb24nIH0sXG4gICAgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vb2JqZWN0cy5tYXJrZXRpbmcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9vYmplY3RzLm1hcmtldGluZy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG4vKipcbiAqIEVuZ2xpc2ggKGVuKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIE1BUktFVElORyBmYW1pbHk6XG4gKiBkZW1hbmQgZ2VuZXJhdGlvbiBcdTIwMTQgY2FtcGFpZ25zIGFuZCB0aGVpciBtZW1iZXJzaGlwLlxuICpcbiAqIFJvc3RlcjogYGNybV9jYW1wYWlnbmAsIGBjcm1fY2FtcGFpZ25fbWVtYmVyYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBtYXJrZXRpbmc6IFJlY29yZDxzdHJpbmcsIE9iamVjdFRyYW5zbGF0aW9uRGF0YT4gPSB7XG4gIGNybV9jYW1wYWlnbjoge1xuICAgIGxhYmVsOiAnQ2FtcGFpZ24nLFxuICAgIHBsdXJhbExhYmVsOiAnQ2FtcGFpZ25zJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNhbXBhaWduX2NvZGU6IHsgbGFiZWw6ICdDYW1wYWlnbiBDb2RlJyB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ0NhbXBhaWduIE5hbWUnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXB0aW9uJyB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ0NhbXBhaWduIFR5cGUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZW1haWw6ICdFbWFpbCcsIHdlYmluYXI6ICdXZWJpbmFyJywgdHJhZGVfc2hvdzogJ1RyYWRlIFNob3cnLFxuICAgICAgICAgIGNvbmZlcmVuY2U6ICdDb25mZXJlbmNlJywgZGlyZWN0X21haWw6ICdEaXJlY3QgTWFpbCcsIHNvY2lhbF9tZWRpYTogJ1NvY2lhbCBNZWRpYScsXG4gICAgICAgICAgY29udGVudDogJ0NvbnRlbnQgTWFya2V0aW5nJywgcGFydG5lcjogJ1BhcnRuZXIgTWFya2V0aW5nJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjaGFubmVsOiB7XG4gICAgICAgIGxhYmVsOiAnUHJpbWFyeSBDaGFubmVsJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGRpZ2l0YWw6ICdEaWdpdGFsJywgc29jaWFsOiAnU29jaWFsJywgZW1haWw6ICdFbWFpbCcsXG4gICAgICAgICAgZXZlbnRzOiAnRXZlbnRzJywgcGFydG5lcjogJ1BhcnRuZXInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1N0YXR1cycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwbGFubmluZzogJ1BsYW5uaW5nJywgaW5fcHJvZ3Jlc3M6ICdJbiBQcm9ncmVzcycsXG4gICAgICAgICAgY29tcGxldGVkOiAnQ29tcGxldGVkJywgYWJvcnRlZDogJ0Fib3J0ZWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0YXJ0X2RhdGU6IHsgbGFiZWw6ICdTdGFydCBEYXRlJyB9LFxuICAgICAgZW5kX2RhdGU6IHsgbGFiZWw6ICdFbmQgRGF0ZScgfSxcbiAgICAgIGJ1ZGdldGVkX2Nvc3Q6IHsgbGFiZWw6ICdCdWRnZXRlZCBDb3N0JyB9LFxuICAgICAgYWN0dWFsX2Nvc3Q6IHsgbGFiZWw6ICdBY3R1YWwgQ29zdCcgfSxcbiAgICAgIGV4cGVjdGVkX3JldmVudWU6IHsgbGFiZWw6ICdFeHBlY3RlZCBSZXZlbnVlJyB9LFxuICAgICAgYWN0dWFsX3JldmVudWU6IHsgbGFiZWw6ICdBY3R1YWwgUmV2ZW51ZScgfSxcbiAgICAgIHRhcmdldF9zaXplOiB7IGxhYmVsOiAnVGFyZ2V0IFNpemUnLCBoZWxwOiAnVGFyZ2V0IG51bWJlciBvZiBsZWFkcy9jb250YWN0cycgfSxcbiAgICAgIG51bV9zZW50OiB7IGxhYmVsOiAnTnVtYmVyIFNlbnQnIH0sXG4gICAgICBudW1fcmVzcG9uc2VzOiB7IGxhYmVsOiAnTnVtYmVyIG9mIFJlc3BvbnNlcycgfSxcbiAgICAgIG51bV9sZWFkczogeyBsYWJlbDogJ051bWJlciBvZiBMZWFkcycgfSxcbiAgICAgIG51bV9jb252ZXJ0ZWRfbGVhZHM6IHsgbGFiZWw6ICdDb252ZXJ0ZWQgTGVhZHMnIH0sXG4gICAgICBudW1fb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ09wcG9ydHVuaXRpZXMgQ3JlYXRlZCcgfSxcbiAgICAgIG51bV93b25fb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ1dvbiBPcHBvcnR1bml0aWVzJyB9LFxuICAgICAgcmVzcG9uc2VfcmF0ZTogeyBsYWJlbDogJ1Jlc3BvbnNlIFJhdGUgJScgfSxcbiAgICAgIHJvaTogeyBsYWJlbDogJ1JPSSAlJyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdDYW1wYWlnbiBPd25lcicgfSxcbiAgICAgIGxhbmRpbmdfcGFnZV91cmw6IHsgbGFiZWw6ICdMYW5kaW5nIFBhZ2UnIH0sXG4gICAgICBpc19hY3RpdmU6IHsgbGFiZWw6ICdBY3RpdmUnIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnRGlzcGxheSBUaXRsZScgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2NhbXBhaWduczogeyBsYWJlbDogJ0FsbCBDYW1wYWlnbnMnIH0sXG4gICAgICBjYW1wYWlnbl9nYW50dDogeyBsYWJlbDogJ0NhbXBhaWduIFNjaGVkdWxlJyB9LFxuICAgICAgY2FtcGFpZ25fY2FsZW5kYXI6IHsgbGFiZWw6ICdMYXVuY2ggQ2FsZW5kYXInIH0sXG4gICAgICBjYW1wYWlnbl90aW1lbGluZTogeyBsYWJlbDogJ01hcmtldGluZyBUaW1lbGluZScgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdDYW1wYWlnbiBJbmZvcm1hdGlvbicgfSxcbiAgICAgIHNjaGVkdWxlOiB7IGxhYmVsOiAnU2NoZWR1bGUnIH0sXG4gICAgICBidWRnZXQ6IHsgbGFiZWw6ICdCdWRnZXQgJiBST0knIH0sXG4gICAgICBtZXRyaWNzOiB7IGxhYmVsOiAnUGVyZm9ybWFuY2UnIH0sXG4gICAgICBhc3NpZ25tZW50OiB7IGxhYmVsOiAnT3duZXJzaGlwJyB9LFxuICAgICAgYXNzZXRzOiB7IGxhYmVsOiAnQ2FtcGFpZ24gQXNzZXRzJyB9LFxuICAgIH0sXG4gICAgX2FjdGlvbnM6IHtcbiAgICAgIGVucm9sbF9sZWFkczoge1xuICAgICAgICBsYWJlbDogJ0Vucm9sbCBNZW1iZXJzJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdFbGlnaWJsZSBtZW1iZXJzIGVucm9sbGVkIGluIGNhbXBhaWduLicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9jYW1wYWlnbl9tZW1iZXI6IHtcbiAgICBsYWJlbDogJ0NhbXBhaWduIE1lbWJlcicsXG4gICAgcGx1cmFsTGFiZWw6ICdDYW1wYWlnbiBNZW1iZXJzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0xlYWRzIGFuZCBjb250YWN0cyB0b3VjaGVkIGJ5IGEgY2FtcGFpZ24sIHdpdGggcmVzcG9uc2Ugc3RhdHVzJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIG1lbWJlcl9udW1iZXI6IHsgbGFiZWw6ICdNZW1iZXIgTnVtYmVyJyB9LFxuICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnQ2FtcGFpZ24nIH0sXG4gICAgICBjcm1fbGVhZDogeyBsYWJlbDogJ0xlYWQnLCBoZWxwOiAnU2V0IHdoZW4gdGhlIG1lbWJlciB3YXMgYSBMZWFkIGF0IGVucm9sbG1lbnQgdGltZScgfSxcbiAgICAgIGNybV9jb250YWN0OiB7IGxhYmVsOiAnQ29udGFjdCcsIGhlbHA6ICdTZXQgd2hlbiB0aGUgbWVtYmVyIGlzIGFuIGV4aXN0aW5nIENvbnRhY3QnIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgc2VudDogJ1NlbnQnLCByZXNwb25kZWQ6ICdSZXNwb25kZWQnLFxuICAgICAgICAgIGNvbnZlcnRlZDogJ0NvbnZlcnRlZCcsIHVuc3Vic2NyaWJlZDogJ1Vuc3Vic2NyaWJlZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYWRkZWRfZGF0ZTogeyBsYWJlbDogJ0FkZGVkIERhdGUnIH0sXG4gICAgICByZXNwb25zZV9kYXRlOiB7IGxhYmVsOiAnUmVzcG9uc2UgRGF0ZScgfSxcbiAgICAgIGhhc19yZXNwb25kZWQ6IHsgbGFiZWw6ICdIYXMgUmVzcG9uZGVkJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0Jhc2ljIEluZm9ybWF0aW9uJyB9LFxuICAgICAgcmVzcG9uc2U6IHsgbGFiZWw6ICdSZXNwb25zZSBUcmFja2luZycgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7XG4gICAgICBtYXJrX3Jlc3BvbmRlZDoge1xuICAgICAgICBsYWJlbDogJ01hcmsgUmVzcG9uZGVkJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdSZXNwb25zZSByZWNvcmRlZCBvbiB0aGlzIGNhbXBhaWduIG1lbWJlci4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IGFwcFN1cmZhY2UgfSBmcm9tICcuL2VuL2FwcCc7XG5pbXBvcnQgeyBjdXN0b21lciB9IGZyb20gJy4vZW4vb2JqZWN0cy5jdXN0b21lcic7XG5pbXBvcnQgeyBwaXBlbGluZSB9IGZyb20gJy4vZW4vb2JqZWN0cy5waXBlbGluZSc7XG5pbXBvcnQgeyBjb21tZXJjZSB9IGZyb20gJy4vZW4vb2JqZWN0cy5jb21tZXJjZSc7XG5pbXBvcnQgeyBzZXJ2aWNlIH0gZnJvbSAnLi9lbi9vYmplY3RzLnNlcnZpY2UnO1xuaW1wb3J0IHsgYWN0aXZpdHkgfSBmcm9tICcuL2VuL29iamVjdHMuYWN0aXZpdHknO1xuaW1wb3J0IHsgbWFya2V0aW5nIH0gZnJvbSAnLi9lbi9vYmplY3RzLm1hcmtldGluZyc7XG5cbi8qKlxuICogRW5nbGlzaCAoZW4pIFx1MjAxNCBDUk0gQXBwIFRyYW5zbGF0aW9uc1xuICpcbiAqIFBlci1sb2NhbGUgZmlsZTogb25lIGZpbGUgcGVyIGxhbmd1YWdlLCBmb2xsb3dpbmcgdGhlIGBwZXJfbG9jYWxlYCBjb252ZW50aW9uLlxuICogRWFjaCBmaWxlIGV4cG9ydHMgYSBzaW5nbGUgYFRyYW5zbGF0aW9uRGF0YWAgb2JqZWN0IGZvciBpdHMgbG9jYWxlLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICpcbiAqIFRoaXMgYnVuZGxlIHdhcyBvbmUgZmlsZSBhbmQgaXQgaGFkIHJlYWNoZWQgODguNiUgb2YgdGhlIDEwMEtCIHNvdXJjZSBjYXBcbiAqIGBwbnBtIGh5Z2llbmVgIGVuZm9yY2VzLCBncm93aW5nIH4xLjJLQiBhIGRheS4gSXQgaXMgbm93IGFzc2VtYmxlZCBmcm9tXG4gKiBgLi88bG9jYWxlPi9gLCBvbiBhbiBheGlzIG1lYXN1cmVkIHJhdGhlciB0aGFuIGd1ZXNzZWQ6XG4gKlxuICogICAtIGV2ZXJ5IG5hbWVzcGFjZSB0aGF0IGlzIE5PVCBgb2JqZWN0c2AgXHUyMDE0IGBhcHBzYCwgYG1lc3NhZ2VzYCxcbiAqICAgICBgZGFzaGJvYXJkc2AsIGBkYXRhc2V0c2AsIGBwYWdlc2AsIGFuZCBhbnkgbmFtZXNwYWNlIGBUcmFuc2xhdGlvbkRhdGFgXG4gKiAgICAgZ2FpbnMgbGF0ZXIgXHUyMDE0IGxpdmVzIGluIGBhcHAudHNgLiBNZWFzdXJlZDogdGhvc2UgbmFtZXNwYWNlcyB0b2dldGhlclxuICogICAgIGFyZSB1bmRlciBhIHF1YXJ0ZXIgb2YgdGhlIGJ1bmRsZSwgYW5kIHRoZSBzY2hlbWEgYm91bmRzIGhvdyBtYW55IGNhblxuICogICAgIGV2ZXIgYXJyaXZlLCBzbyBvbmUgZmlsZSBob2xkcyB0aGVtIHdpdGggcm9vbSBsZWZ0O1xuICogICAtIGBvYmplY3RzYCBpcyA2OS03OCUgb2YgZXZlcnkgYnVuZGxlLCBzbyBpdCBpcyBwYXJ0aXRpb25lZCBhZ2Fpbiwgb25lXG4gKiAgICAgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHkgXHUyMDE0IGBjdXN0b21lcmAsIGBwaXBlbGluZWAsIGBjb21tZXJjZWAsXG4gKiAgICAgYHNlcnZpY2VgLCBgYWN0aXZpdHlgLCBgbWFya2V0aW5nYCBcdTIwMTQgYW5kIGEgREVUQUlMIG9iamVjdCBmb2xsb3dzIGl0c1xuICogICAgIG1hc3RlcjogbGluZSBpdGVtcyBmb2xsb3cgdGhlaXIgcXVvdGUgb3Igb3Bwb3J0dW5pdHksXG4gKiAgICAgYGNybV9ldmVudF9hdHRlbmRlZWAgZm9sbG93cyBgY3JtX2V2ZW50YCwgYGNybV9jYW1wYWlnbl9tZW1iZXJgXG4gKiAgICAgZm9sbG93cyBgY3JtX2NhbXBhaWduYCwgYGNybV9hcnRpY2xlX2ZlZWRiYWNrYCBmb2xsb3dzXG4gKiAgICAgYGNybV9rbm93bGVkZ2VfYXJ0aWNsZWAuXG4gKlxuICogQSBuYW1lc3BhY2UgYXhpcyBBTE9ORSB3YXMgbWVhc3VyZWQgYW5kIHJlamVjdGVkOiBpdCBsZWF2ZXMgYG9iamVjdHNgIGF0XG4gKiA2NS43S0IsIDMuOUtCIHVuZGVyIHRoZSBhZHZpc29yeSBiYW5kLCB3aGljaCBgb2JqZWN0c2AgZ3Jvd3RoIGNyb3NzZXMgaW5cbiAqIGFib3V0IG5pbmUgZGF5cy4gVGhlIGZhbWlseSBheGlzIHB1dHMgdGhlIGxhcmdlc3QgcGFydCBhdCAyNC4yJSBvZiB0aGUgY2FwLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBBIG5ldyBvYmplY3QgdHJhbnNsYXRpb24gYmVsb25ncyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseS4gRG8gbm90IGFkZFxuICogaXQgdG8gd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuIFx1MjAxNCB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0XG4gKiB0aGUgYmFuZCwgd2hpY2ggaXMgd2hhdCBzcGxpdCB0aGlzIGJ1bmRsZSBpbiB0aGUgZmlyc3QgcGxhY2UuXG4gKlxuICogXHUyNkEwXHVGRTBGIEEgdmFsdWUgdXNlZCBieSBtb3JlIHRoYW4gb25lIGZhbWlseSBsaXZlcyBpbiBgPGxvY2FsZT4vX3NoYXJlZC50c2AuIEFcbiAqIHZhbHVlIHVzZWQgYnkgZXhhY3RseSBvbmUgZmFtaWx5IGxpdmVzIGluIHRoYXQgZmFtaWx5J3MgZmlsZS5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgVGhlIGtleSBvcmRlciBiZWxvdyBpcyBMT0FELUJFQVJJTkcsIG5vdCBjb3NtZXRpYy4gYG9iamVjdHN0YWNrIGJ1aWxkYFxuICogc2VyaWFsaXNlcyB0aGlzIG9iamVjdCBpbnRvIGBkaXN0L29iamVjdHN0YWNrLmpzb25gIGluIGluc2VydGlvbiBvcmRlciBhbmRcbiAqIG5ldmVyIHNvcnRzIGl0LCBzbyBsaXN0aW5nIHRoZSByb3dzIGhlcmUgXHUyMDE0IHJhdGhlciB0aGFuIHNwcmVhZGluZyB0aGUgZmFtaWx5XG4gKiBmaWxlcyBcdTIwMTQgaXMgd2hhdCBrZWVwcyB0aGUgYnVpbHQgYXJ0aWZhY3QgYnl0ZS1pZGVudGljYWwgYWNyb3NzIHRoZSBzcGxpdC5cbiAqIFRoZSBvcmRlciBpcyB0aGlzIGJ1bmRsZSdzIG93biBoaXN0b3JpY2FsIGFjY3JldGlvbiBvcmRlciBhbmQgZGlmZmVyc1xuICogYmV0d2VlbiBsb2NhbGVzOyByZW9yZGVyaW5nIGl0IHJld3JpdGVzIHRoZSBhcnRpZmFjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVuOiBUcmFuc2xhdGlvbkRhdGEgPSB7XG4gIG9iamVjdHM6IHtcbiAgICBjcm1fYWNjb3VudDogY3VzdG9tZXIuY3JtX2FjY291bnQsXG4gICAgY3JtX2NvbnRhY3Q6IGN1c3RvbWVyLmNybV9jb250YWN0LFxuICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogc2VydmljZS5jcm1fa25vd2xlZGdlX2FydGljbGUsXG4gICAgY3JtX2ZvcmVjYXN0OiBwaXBlbGluZS5jcm1fZm9yZWNhc3QsXG4gICAgY3JtX2xlYWQ6IHBpcGVsaW5lLmNybV9sZWFkLFxuICAgIGNybV9vcHBvcnR1bml0eTogcGlwZWxpbmUuY3JtX29wcG9ydHVuaXR5LFxuICAgIGNybV9jYXNlOiBzZXJ2aWNlLmNybV9jYXNlLFxuICAgIGNybV9jb250cmFjdDogY29tbWVyY2UuY3JtX2NvbnRyYWN0LFxuICAgIGNybV9wcm9kdWN0OiBjb21tZXJjZS5jcm1fcHJvZHVjdCxcbiAgICBjcm1fcXVvdGU6IGNvbW1lcmNlLmNybV9xdW90ZSxcbiAgICBjcm1fdGFzazogYWN0aXZpdHkuY3JtX3Rhc2ssXG4gICAgY3JtX2NhbXBhaWduOiBtYXJrZXRpbmcuY3JtX2NhbXBhaWduLFxuICAgIGNybV9ldmVudDogYWN0aXZpdHkuY3JtX2V2ZW50LFxuICAgIGNybV9ldmVudF9hdHRlbmRlZTogYWN0aXZpdHkuY3JtX2V2ZW50X2F0dGVuZGVlLFxuICAgIGNybV9hcnRpY2xlX2ZlZWRiYWNrOiBzZXJ2aWNlLmNybV9hcnRpY2xlX2ZlZWRiYWNrLFxuICAgIGNybV9jYW1wYWlnbl9tZW1iZXI6IG1hcmtldGluZy5jcm1fY2FtcGFpZ25fbWVtYmVyLFxuICAgIGNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW06IHBpcGVsaW5lLmNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW0sXG4gICAgY3JtX3F1b3RlX2xpbmVfaXRlbTogY29tbWVyY2UuY3JtX3F1b3RlX2xpbmVfaXRlbSxcbiAgfSxcbiAgLi4uYXBwU3VyZmFjZSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vYXBwLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTlwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vYXBwLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IFFVT1RFX0RJU0NPVU5UX0NFSUxJTkcgfSBmcm9tICcuLi8uLi9vYmplY3RzL190aHJlc2hvbGRzJztcblxuLyoqXG4gKiBcdTdCODBcdTRGNTNcdTRFMkRcdTY1ODcgKHpoLUNOKSBcdTIwMTQgZXZlcnkgdHJhbnNsYXRpb24gbmFtZXNwYWNlIEVYQ0VQVCBgb2JqZWN0c2A6XG4gKiBgYXBwc2AsIGBtZXNzYWdlc2AsIGBkYXNoYm9hcmRzYCwgYGRhdGFzZXRzYCwgYHBhZ2VzYCwgYGZsb3dzYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi50c2AuXG4gKlxuICogQSBuYW1lc3BhY2UgYFRyYW5zbGF0aW9uRGF0YWAgZ2FpbnMgbGF0ZXIgbGFuZHMgaGVyZSB0b28sIGFuZCB0aGUgcm9vbSBpc1xuICogbWVhc3VyZWQ6IHRoaXMgZmlsZSBpcyB0aGUgc21hbGxlciBoYWxmIG9mIHRoZSBidW5kbGUsIGFuZCB0aGUgc2NoZW1hIGJvdW5kc1xuICogaG93IG1hbnkgbmFtZXNwYWNlcyBjYW4gZXZlciBhcnJpdmUuXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBTdXJmYWNlOiBPbWl0PFRyYW5zbGF0aW9uRGF0YSwgJ29iamVjdHMnPiA9IHtcbiAgYXBwczoge1xuICAgIGNybV9lbnRlcnByaXNlOiB7XG4gICAgICBsYWJlbDogJ0hvdENSTScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1NkRCNVx1NzZENlx1OTUwMFx1NTUyRVx1MzAwMVx1NjcwRFx1NTJBMVx1NTQ4Q1x1NUUwMlx1NTczQVx1ODQyNVx1OTUwMFx1NzY4NFx1NUJBMlx1NjIzN1x1NTE3M1x1N0NGQlx1N0JBMVx1NzQwNlx1N0NGQlx1N0VERicsXG4gICAgICAvLyBLZXllZCBieSBuYXZpZ2F0aW9uLW5vZGUgYGlkYCAoYSBmbGF0IGtleXNwYWNlIHJlZ2FyZGxlc3Mgb2YgZGVwdGgpLlxuICAgICAgbmF2aWdhdGlvbjoge1xuICAgICAgICBncm91cF9hY3Rpdml0eTogeyBsYWJlbDogJ1x1NkQzQlx1NTJBOCcgfSxcbiAgICAgICAgbmF2X2V2ZW50OiB7IGxhYmVsOiAnXHU2RDNCXHU1MkE4JyB9LFxuICAgICAgICBuYXZfYWN0aXZpdHlfZGFzaGJvYXJkOiB7IGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU2RDNCXHU1MkE4JyB9LFxuICAgICAgICBuYXZfbXlfY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTYyMTFcdTc2ODRcdTY1RTVcdTUzODYnIH0sXG4gICAgICAgIG5hdl9ob21lOiB7IGxhYmVsOiAnXHU5OTk2XHU5ODc1JyB9LFxuXG4gICAgICAgIGdyb3VwX3NhbGVzOiB7IGxhYmVsOiAnXHU5NTAwXHU1NTJFJyB9LFxuICAgICAgICBuYXZfbGVhZDogeyBsYWJlbDogJ1x1N0VCRlx1N0QyMicgfSxcbiAgICAgICAgbmF2X2FjY291bnQ6IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzcnIH0sXG4gICAgICAgIG5hdl9hY2NvdW50X3dvcmtiZW5jaDogeyBsYWJlbDogJ1x1NUJBMlx1NjIzN1x1NURFNVx1NEY1Q1x1NTNGMCcgfSxcbiAgICAgICAgbmF2X2NvbnRhY3Q6IHsgbGFiZWw6ICdcdTgwNTRcdTdDRkJcdTRFQkEnIH0sXG4gICAgICAgIG5hdl9vcHBvcnR1bml0eTogeyBsYWJlbDogJ1x1NTU0Nlx1NjczQScgfSxcbiAgICAgICAgbmF2X3F1b3RlOiB7IGxhYmVsOiAnXHU2MkE1XHU0RUY3JyB9LFxuICAgICAgICBuYXZfY29udHJhY3Q6IHsgbGFiZWw6ICdcdTU0MDhcdTU0MEMnIH0sXG4gICAgICAgIG5hdl9wcm9kdWN0OiB7IGxhYmVsOiAnXHU0RUE3XHU1NEMxJyB9LFxuICAgICAgICBuYXZfc2FsZXNfZGFzaGJvYXJkOiB7IGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU0RTFBXHU3RUU5JyB9LFxuXG4gICAgICAgIGdyb3VwX3dvcms6IHsgbGFiZWw6ICdcdTYyMTFcdTc2ODRcdTVERTVcdTRGNUMnIH0sXG4gICAgICAgIG5hdl9teV90YXNrczogeyBsYWJlbDogJ1x1NjIxMVx1NzY4NFx1NEVGQlx1NTJBMScgfSxcbiAgICAgICAgbmF2X215X2RlYWxzOiB7IGxhYmVsOiAnXHU2MjExXHU3Njg0XHU1NTQ2XHU2NzNBJyB9LFxuICAgICAgICBuYXZfbXlfbGVhZHM6IHsgbGFiZWw6ICdcdTYyMTFcdTc2ODRcdTdFQkZcdTdEMjInIH0sXG4gICAgICAgIG5hdl9teV9jYXNlczogeyBsYWJlbDogJ1x1NjIxMVx1NzY4NFx1NURFNVx1NTM1NScgfSxcbiAgICAgICAgbmF2X2FwcHJvdmFsX3JlcXVlc3RzOiB7IGxhYmVsOiAnXHU1Rjg1XHU2MjExXHU1QkExXHU2Mjc5JyB9LFxuXG4gICAgICAgIGdyb3VwX21hcmtldGluZzogeyBsYWJlbDogJ1x1NUUwMlx1NTczQVx1ODQyNVx1OTUwMCcgfSxcbiAgICAgICAgbmF2X2NhbXBhaWduOiB7IGxhYmVsOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4JyB9LFxuXG4gICAgICAgIGdyb3VwX3NlcnZpY2U6IHsgbGFiZWw6ICdcdTY3MERcdTUyQTEnIH0sXG4gICAgICAgIG5hdl9jYXNlOiB7IGxhYmVsOiAnXHU1REU1XHU1MzU1JyB9LFxuICAgICAgICBuYXZfa25vd2xlZGdlOiB7IGxhYmVsOiAnXHU3N0U1XHU4QkM2XHU1RTkzJyB9LFxuICAgICAgICBuYXZfc2VydmljZV9kYXNoYm9hcmQ6IHsgbGFiZWw6ICdcdTY3MERcdTUyQTFcdTY5ODJcdTg5QzgnIH0sXG5cbiAgICAgICAgZ3JvdXBfaW5zaWdodHM6IHsgbGFiZWw6ICdcdTY1NzBcdTYzNkVcdTZEMUVcdTVCREYnIH0sXG4gICAgICAgIG5hdl9jcm1fZGFzaGJvYXJkOiB7IGxhYmVsOiAnQ1JNIFx1NjAzQlx1ODlDOCcgfSxcbiAgICAgICAgbmF2X2ZvcmVjYXN0OiB7IGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU5ODg0XHU2RDRCJyB9LFxuICAgICAgICBuYXZfcmVwb3J0X3BpcGVsaW5lX2NvdmVyYWdlOiB7IGxhYmVsOiAnXHU3QkExXHU5MDUzXHU4OTg2XHU3NkQ2XHU3Mzg3JyB9LFxuICAgICAgICBuYXZfcmVwb3J0X2xlYWRfaW5mbG93OiB7IGxhYmVsOiAnXHU3RUJGXHU3RDIyXHU2RDQxXHU1MTY1JyB9LFxuICAgICAgICBuYXZfcmVwb3J0X3NsYTogeyBsYWJlbDogJ1NMQSBcdThGQkVcdTYyMTAnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIG1lc3NhZ2VzOiB7XG4gICAgJ2NvbW1vbi5zYXZlJzogJ1x1NEZERFx1NUI1OCcsXG4gICAgJ2NvbW1vbi5jYW5jZWwnOiAnXHU1M0Q2XHU2RDg4JyxcbiAgICAnY29tbW9uLmRlbGV0ZSc6ICdcdTUyMjBcdTk2NjQnLFxuICAgICdjb21tb24uZWRpdCc6ICdcdTdGMTZcdThGOTEnLFxuICAgICdjb21tb24uY3JlYXRlJzogJ1x1NjVCMFx1NUVGQScsXG4gICAgJ2NvbW1vbi5zZWFyY2gnOiAnXHU2NDFDXHU3RDIyJyxcbiAgICAnY29tbW9uLmZpbHRlcic6ICdcdTdCNUJcdTkwMDknLFxuICAgICdjb21tb24uZXhwb3J0JzogJ1x1NUJGQ1x1NTFGQScsXG4gICAgJ2NvbW1vbi5iYWNrJzogJ1x1OEZENFx1NTZERScsXG4gICAgJ2NvbW1vbi5jb25maXJtJzogJ1x1Nzg2RVx1OEJBNCcsXG4gICAgJ25hdi5zYWxlcyc6ICdcdTk1MDBcdTU1MkUnLFxuICAgICduYXYuc2VydmljZSc6ICdcdTY3MERcdTUyQTEnLFxuICAgICduYXYubWFya2V0aW5nJzogJ1x1ODQyNVx1OTUwMCcsXG4gICAgJ25hdi5wcm9kdWN0cyc6ICdcdTRFQTdcdTU0QzEnLFxuICAgICduYXYuYW5hbHl0aWNzJzogJ1x1NjU3MFx1NjM2RVx1NTIwNlx1Njc5MCcsXG4gICAgJ3N1Y2Nlc3Muc2F2ZWQnOiAnXHU4QkIwXHU1RjU1XHU0RkREXHU1QjU4XHU2MjEwXHU1MjlGJyxcbiAgICAnc3VjY2Vzcy5jb252ZXJ0ZWQnOiAnXHU3RUJGXHU3RDIyXHU4RjZDXHU1MzE2XHU2MjEwXHU1MjlGJyxcbiAgICAnY29uZmlybS5kZWxldGUnOiAnXHU3ODZFXHU1QjlBXHU4OTgxXHU1MjIwXHU5NjY0XHU2QjY0XHU4QkIwXHU1RjU1XHU1NDE3XHVGRjFGJyxcbiAgICAnY29uZmlybS5jb252ZXJ0X2xlYWQnOiAnXHU1QzA2XHU2QjY0XHU3RUJGXHU3RDIyXHU4RjZDXHU1MzE2XHU0RTNBXHU1QkEyXHU2MjM3XHUzMDAxXHU4MDU0XHU3Q0ZCXHU0RUJBXHU1NDhDXHU1NTQ2XHU2NzNBXHVGRjFGJyxcbiAgICAnZXJyb3IucmVxdWlyZWQnOiAnXHU2QjY0XHU1QjU3XHU2QkI1XHU0RTNBXHU1RkM1XHU1ODZCXHU5ODc5JyxcbiAgICAnZXJyb3IubG9hZF9mYWlsZWQnOiAnXHU2NTcwXHU2MzZFXHU1MkEwXHU4RjdEXHU1OTMxXHU4RDI1JyxcbiAgfSxcbiAgZGFzaGJvYXJkczoge1xuICAgIHNhbGVzX2FjdGl2aXR5X2Rhc2hib2FyZDoge1xuICAgICAgbGFiZWw6ICdcdTk1MDBcdTU1MkVcdTZEM0JcdTUyQTgnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdThDMDFcdTU3MjhcdTU0OENcdTVCQTJcdTYyMzdcdTZDOUZcdTkwMUFcdTMwMDFcdTk4OTFcdTczODdcdTU5ODJcdTRGNTVcdUZGMENcdTRFRTVcdTUzQ0FcdTU0RUFcdTRFOUJcdTVCQTJcdTYyMzdcdTVERjJcdTdFQ0ZcdTZDODlcdTlFRDgnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICBpbnRlcmFjdGlvbnNfaGVsZDogeyB0aXRsZTogJ1x1NURGMlx1OEJCMFx1NUY1NVx1NEU5Mlx1NTJBOCcsIGRlc2NyaXB0aW9uOiAnXHU3NzFGXHU1QjlFXHU1M0QxXHU3NTFGXHU4RkM3XHU3Njg0XHU5MDFBXHU4QkREXHU0RTBFXHU0RjFBXHU4QkFFJyB9LFxuICAgICAgICBtZWV0aW5nc19ib29rZWQ6IHsgdGl0bGU6ICdcdTVERjJcdTk4ODRcdTdFQTZcdTRGMUFcdThCQUUnLCBkZXNjcmlwdGlvbjogJ1x1NURGMlx1NjM5Mlx1NTE2NVx1NjVFNVx1NTM4Nlx1NEY0Nlx1NUMxQVx1NjcyQVx1NEUzRVx1ODg0Q1x1NzY4NFx1NEYxQVx1OEJBRScgfSxcbiAgICAgICAgY3VzdG9tZXJfbWludXRlczogeyB0aXRsZTogJ1x1NUJBMlx1NjIzN1x1NjNBNVx1ODlFNlx1NTIwNlx1OTQ5Rlx1NjU3MCcsIGRlc2NyaXB0aW9uOiAnXHU5NzYyXHU1NDExXHU1QkEyXHU2MjM3XHU3Njg0XHU2MDNCXHU2NUY2XHU5NTdGJyB9LFxuICAgICAgICB0YXNrc19jb21wbGV0ZWQ6IHsgdGl0bGU6ICdcdTVERjJcdTVCOENcdTYyMTBcdTRFRkJcdTUyQTEnLCBkZXNjcmlwdGlvbjogJ1x1NURGMlx1OTVFRFx1NzNBRlx1NzY4NFx1OERERlx1OEZEQlx1NEU4Qlx1OTg3OVx1MjAxNFx1MjAxNFx1NkQzQlx1NTJBOFx1NzY4NFx1NTNFNlx1NEUwMFx1NTM0QScgfSxcbiAgICAgICAgYWN0aXZpdHlfYnlfcmVwOiB7IHRpdGxlOiAnXHU2MzA5XHU5NTAwXHU1NTJFXHU0RUUzXHU4ODY4XHU3RURGXHU4QkExXHU3Njg0XHU2RDNCXHU1MkE4JywgZGVzY3JpcHRpb246ICdcdTZCQ0ZcdTRGNERcdThEMUZcdThEMjNcdTRFQkFcdThCQjBcdTVGNTVcdTc2ODRcdTRFOTJcdTUyQThcdTY1NzAnIH0sXG4gICAgICAgIGFjdGl2aXR5X2J5X3dlZWs6IHsgdGl0bGU6ICdcdTZCQ0ZcdTU0NjhcdTZEM0JcdTUyQThcdTkxQ0YnLCBkZXNjcmlwdGlvbjogJ1x1NkJDRlx1NTQ2OFx1NEU5Mlx1NTJBOFx1NjU3MCcgfSxcbiAgICAgICAgYWN0aXZpdHlfbWl4OiB7IHRpdGxlOiAnXHU2RDNCXHU1MkE4XHU2Nzg0XHU2MjEwJywgZGVzY3JpcHRpb246ICdcdTkwMUFcdThCRERcdTMwMDFcdTRGMUFcdThCQUVcdTRFMEVcdTZGMTRcdTc5M0FcdTc2ODRcdTUzNjBcdTZCRDQnIH0sXG4gICAgICAgIGFjdGl2aXR5X2J5X3JlY29yZF90eXBlOiB7IHRpdGxlOiAnXHU2RDNCXHU1MkE4XHU4NDNEXHU1NzI4XHU1NEVBXHU5MUNDJywgZGVzY3JpcHRpb246ICdcdTZGMEZcdTY1OTdcdTc2ODRcdTU0RUFcdTRFMkFcdTczQUZcdTgyODJcdTgzQjdcdTVGOTdcdTRFODZcdTUxNzNcdTZDRTgnIH0sXG4gICAgICAgIGRlYWxfYWN0aXZpdHk6IHsgdGl0bGU6ICdcdTU1NDZcdTY3M0FcdTRFMEFcdTc2ODRcdTRFOTJcdTUyQTgnLCBkZXNjcmlwdGlvbjogJ1x1NTE3M1x1ODA1NFx1NTIzMFx1NTU0Nlx1NjczQVx1NzY4NFx1NURGMlx1OEJCMFx1NUY1NVx1NEU5Mlx1NTJBOCcgfSxcbiAgICAgICAgb3Blbl9kZWFsc19mb3JfYWN0aXZpdHk6IHsgdGl0bGU6ICdcdThGREJcdTg4NENcdTRFMkRcdTc2ODRcdTU1NDZcdTY3M0EnLCBkZXNjcmlwdGlvbjogJ1x1NEVDRFx1NTcyOFx1NjNBOFx1OEZEQlx1NzY4NFx1NTU0Nlx1NjczQVx1NjU3MCcgfSxcbiAgICAgICAgcXVpZXRfYWNjb3VudHNfMzA6IHsgdGl0bGU6ICdcdTZDODlcdTlFRDggMzAgXHU1OTI5XHU0RUU1XHU0RTBBJywgZGVzY3JpcHRpb246ICdcdTRFMDBcdTRFMkFcdTY3MDhcdTUxODVcdTZDQTFcdTY3MDlcdTRFRkJcdTRGNTVcdTRFOTJcdTUyQThcdThCQjBcdTVGNTVcdTc2ODRcdTZEM0JcdThEQzNcdTVCQTJcdTYyMzcnIH0sXG4gICAgICAgIHF1aWV0X2FjY291bnRzXzYwOiB7IHRpdGxlOiAnXHU2Qzg5XHU5RUQ4IDYwIFx1NTkyOVx1NEVFNVx1NEUwQScsIGRlc2NyaXB0aW9uOiAnXHU0RTI0XHU0RTJBXHU2NzA4XHU2NUUwXHU4MDU0XHU3Q0ZCXHUyMDE0XHUyMDE0XHU5OENFXHU5NjY5XHU5NjA4XHU1MDNDJyB9LFxuICAgICAgICBxdWlldF9hY2NvdW50c185MDogeyB0aXRsZTogJ1x1NkM4OVx1OUVEOCA5MCBcdTU5MjlcdTRFRTVcdTRFMEEnLCBkZXNjcmlwdGlvbjogJ1x1NjU3NFx1NjU3NFx1NEUwMFx1NEUyQVx1NUI2M1x1NUVBNlx1NkNBMVx1NjcwOVx1ODA1NFx1N0NGQicgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcm1fb3ZlcnZpZXdfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ0NSTSBcdTYwM0JcdTg5QzgnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTY1MzZcdTUxNjVcdTYzMDdcdTY4MDdcdTMwMDFcdTdCQTFcdTkwNTNcdTUyMDZcdTY3OTBcdTRFMEVcdTU1NDZcdTY3M0FcdTZEMUVcdTVCREYnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICB0b3RhbF9yZXZlbnVlOiB7IHRpdGxlOiAnXHU2MDNCXHU2NTM2XHU1MTY1JywgZGVzY3JpcHRpb246ICdcdTY3MkNcdTY3MUZcdTVERjJcdTYyMTBcdTRFQTRcdTY1MzZcdTUxNjUnIH0sXG4gICAgICAgIGFjdGl2ZV9kZWFsczogeyB0aXRsZTogJ1x1NkQzQlx1OERDM1x1NTU0Nlx1NjczQScsIGRlc2NyaXB0aW9uOiAnXHU3QkExXHU5MDUzXHU0RTJEXHU4RkRCXHU4ODRDXHU0RTJEXHU3Njg0XHU1NTQ2XHU2NzNBJyB9LFxuICAgICAgICB3b25fZGVhbHM6IHsgdGl0bGU6ICdcdThENjJcdTUzNTVcdTY1NzAnLCBkZXNjcmlwdGlvbjogJ1x1NjcyQ1x1NjcxRlx1NURGMlx1N0VEM1x1Njg0OFx1NTU0Nlx1NjczQVx1NEUyRFx1OEQ2Mlx1NTM1NVx1NzY4NFx1NjAzQlx1NjU3MCcgfSxcbiAgICAgICAgYXZnX2RlYWxfc2l6ZTogeyB0aXRsZTogJ1x1NUU3M1x1NTc0N1x1OEJBMlx1NTM1NVx1OTFEMVx1OTg5RCcsIGRlc2NyaXB0aW9uOiAnXHU1REYyXHU2MjEwXHU0RUE0XHU1NTQ2XHU2NzNBXHU3Njg0XHU1RTczXHU1NzQ3XHU5MUQxXHU5ODlEJyB9LFxuICAgICAgICByZXZlbnVlX3RyZW5kczogeyB0aXRsZTogJ1x1NjUzNlx1NTE2NVx1OEQ4Qlx1NTJCRicsIGRlc2NyaXB0aW9uOiAnXHU4RkM3XHU1M0JCIDEyIFx1NEUyQVx1NjcwOFx1NzY4NFx1NURGMlx1NjIxMFx1NEVBNFx1NjUzNlx1NTE2NScgfSxcbiAgICAgICAgbGVhZF9zb3VyY2U6IHsgdGl0bGU6ICdcdTdFQkZcdTdEMjJcdTY3NjVcdTZFOTAnLCBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1ODNCN1x1NUJBMlx1NkUyMFx1OTA1M1x1N0VERlx1OEJBMVx1NzY4NFx1N0JBMVx1OTA1M1x1OTFEMVx1OTg5RCcgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfc3RhZ2U6IHsgdGl0bGU6ICdcdTk2MzZcdTZCQjVcdTdCQTFcdTkwNTNcdTUyMDZcdTVFMDMnLCBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1OTYzNlx1NkJCNVx1N0VERlx1OEJBMVx1NzY4NFx1OEZEQlx1ODg0Q1x1NEUyRFx1NTU0Nlx1NjczQVx1OTFEMVx1OTg5RCcgfSxcbiAgICAgICAgdG9wX3Byb2R1Y3RzOiB7IHRpdGxlOiAnXHU3MEVEXHU5NUU4XHU0RUE3XHU1NEMxJywgZGVzY3JpcHRpb246ICdcdTYzMDlcdTRFQTdcdTU0QzFcdTdDN0JcdTUyMkJcdTdFREZcdThCQTFcdTc2ODRcdTc2RUVcdTVGNTVcdTRFRjdcdTY1MzZcdTUxNjUnIH0sXG4gICAgICAgIHBpcGVsaW5lX2J5X293bmVyOiB7IHRpdGxlOiAnXHU2MzA5XHU4RDFGXHU4RDIzXHU0RUJBXHU3RURGXHU4QkExXHU3QkExXHU5MDUzJywgZGVzY3JpcHRpb246ICdcdTU0MDRcdTk1MDBcdTU1MkVcdThEMUZcdThEMjNcdTRFQkFcdTc2ODRcdThGREJcdTg4NENcdTRFMkRcdTdCQTFcdTkwNTNcdTkxRDFcdTk4OURcdTRFMEVcdTU1NDZcdTY3M0FcdTY1NzAnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZXhlY3V0aXZlX2Rhc2hib2FyZDoge1xuICAgICAgbGFiZWw6ICdcdTlBRDhcdTdCQTFcdTYwM0JcdTg5QzgnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTk3NjJcdTU0MTFcdTdCQTFcdTc0MDZcdTVDNDJcdTc2ODRcdTY1MzZcdTUxNjVcdTMwMDFcdTVCQTJcdTYyMzdcdTRFMEVcdTdCQTFcdTkwNTNcdTlBRDhcdTk2MzZcdTYzMDdcdTY4MDcnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICB0b3RhbF9yZXZlbnVlX3l0ZDogeyB0aXRsZTogJ1x1NUU3NFx1NUVBNlx1N0QyRlx1OEJBMVx1NjUzNlx1NTE2NScsIGRlc2NyaXB0aW9uOiAnXHU2NzJDXHU1RTc0XHU1RUE2XHU1REYyXHU2MjEwXHU0RUE0XHU2NTM2XHU1MTY1JyB9LFxuICAgICAgICB0b3RhbF9hY2NvdW50czogeyB0aXRsZTogJ1x1NkQzQlx1OERDM1x1NUJBMlx1NjIzNycsIGRlc2NyaXB0aW9uOiAnXHU4MUYzXHU1QzExXHU1QjU4XHU1NzI4XHU0RTAwXHU5ODc5XHU2RDNCXHU4REMzXHU1MTczXHU3Q0ZCXHU3Njg0XHU1QkEyXHU2MjM3JyB9LFxuICAgICAgICB0b3RhbF9jb250YWN0czogeyB0aXRsZTogJ1x1ODA1NFx1N0NGQlx1NEVCQVx1NjAzQlx1NjU3MCcsIGRlc2NyaXB0aW9uOiAnXHU5MDFBXHU4QkFGXHU1RjU1XHU0RTJEXHU3Njg0XHU4MDU0XHU3Q0ZCXHU0RUJBJyB9LFxuICAgICAgICBvcGVuX2xlYWRzOiB7IHRpdGxlOiAnXHU2NzJBXHU4RjZDXHU1MzE2XHU3RUJGXHU3RDIyJywgZGVzY3JpcHRpb246ICdcdTZGMEZcdTY1OTdcdTRFMkRcdTVDMUFcdTY3MkFcdThGNkNcdTUzMTZcdTc2ODRcdTdFQkZcdTdEMjInIH0sXG4gICAgICAgIHJldmVudWVfdHJlbmQ6IHsgdGl0bGU6ICdcdTY1MzZcdTUxNjVcdThEOEJcdTUyQkYnLCBkZXNjcmlwdGlvbjogJ1x1OEZDN1x1NTNCQiAxMiBcdTRFMkFcdTY3MDhcdTc2ODRcdTVERjJcdTYyMTBcdTRFQTRcdTY1MzZcdTUxNjUnIH0sXG4gICAgICAgIHJldmVudWVfYnlfaW5kdXN0cnk6IHsgdGl0bGU6ICdcdTg4NENcdTRFMUFcdTY1MzZcdTUxNjVcdTUyMDZcdTVFMDMnLCBkZXNjcmlwdGlvbjogJ1x1NjcyQ1x1NUU3NFx1NUVBNlx1NURGMlx1NjIxMFx1NEVBNFx1NjUzNlx1NTE2NVx1NjMwOVx1NUJBMlx1NjIzN1x1ODg0Q1x1NEUxQVx1NjJDNlx1NTIwNicgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfc3RhZ2U6IHsgdGl0bGU6ICdcdTk2MzZcdTZCQjVcdTdCQTFcdTkwNTNcdTUyMDZcdTVFMDMnLCBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1OTYzNlx1NkJCNVx1N0VERlx1OEJBMVx1NzY4NFx1OEZEQlx1ODg0Q1x1NEUyRFx1NTU0Nlx1NjczQVx1OTFEMVx1OTg5RCcgfSxcbiAgICAgICAgbmV3X2FjY291bnRzX2J5X21vbnRoOiB7IHRpdGxlOiAnXHU2NUIwXHU1ODlFXHU1QkEyXHU2MjM3JywgZGVzY3JpcHRpb246ICdcdThGQzdcdTUzQkIgNiBcdTRFMkFcdTY3MDhcdTc2ODRcdTVCQTJcdTYyMzdcdTUyMUJcdTVFRkFcdTgyODJcdTU5NEYnIH0sXG4gICAgICAgIGFjY291bnRzX2J5X2luZHVzdHJ5OiB7IHRpdGxlOiAnXHU2MzA5XHU4ODRDXHU0RTFBXHU3RURGXHU4QkExXHU1QkEyXHU2MjM3JywgZGVzY3JpcHRpb246ICdcdTU0MDRcdTg4NENcdTRFMUFcdTc2ODRcdTVFNzRcdTg0MjVcdTY1MzZcdTYwM0JcdTk4OURcdTRFMEVcdTVCQTJcdTYyMzdcdTY1NzAnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgc2FsZXNfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ1x1OTUwMFx1NTUyRVx1NEUxQVx1N0VFOScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1N0JBMVx1OTA1M1x1NTIwNlx1Njc5MFx1MzAwMVx1OEQ2Mlx1NzM4N1x1OEQ4Qlx1NTJCRlx1NTNDQVx1OTUwMFx1NTUyRVx1NEVFM1x1ODg2OFx1N0VFOVx1NjU0OCcsXG4gICAgICB3aWRnZXRzOiB7XG4gICAgICAgIHRvdGFsX3BpcGVsaW5lX3ZhbHVlOiB7IHRpdGxlOiAnXHU3QkExXHU5MDUzXHU2MDNCXHU5ODlEJywgZGVzY3JpcHRpb246ICdcdTYyNDBcdTY3MDlcdThGREJcdTg4NENcdTRFMkRcdTU1NDZcdTY3M0FcdTkxRDFcdTk4OURcdTU0MDhcdThCQTEnIH0sXG4gICAgICAgIGNsb3NlZF93b25fcXRkOiB7IHRpdGxlOiAnXHU2NzJDXHU1QjYzXHU1RUE2XHU1REYyXHU2MjEwXHU0RUE0JywgZGVzY3JpcHRpb246ICdcdTY3MkNcdTVCNjNcdTVFQTZcdTVERjJcdThENjJcdTVGOTdcdTc2ODRcdTY1MzZcdTUxNjUnIH0sXG4gICAgICAgIG9wZW5fb3Bwb3J0dW5pdGllczogeyB0aXRsZTogJ1x1OEZEQlx1ODg0Q1x1NEUyRFx1NTU0Nlx1NjczQScsIGRlc2NyaXB0aW9uOiAnXHU2QjYzXHU1NzI4XHU2M0E4XHU4RkRCXHU3Njg0XHU2RDNCXHU4REMzXHU1NTQ2XHU2NzNBJyB9LFxuICAgICAgICBhdmdfZGVhbF9zaXplOiB7IHRpdGxlOiAnXHU1RTczXHU1NzQ3XHU4QkEyXHU1MzU1XHU5MUQxXHU5ODlEJywgZGVzY3JpcHRpb246ICdcdTY3MkNcdTVCNjNcdTVFQTZcdTVERjJcdTYyMTBcdTRFQTRcdTU1NDZcdTY3M0FcdTc2ODRcdTVFNzNcdTU3NDdcdTkxRDFcdTk4OUQnIH0sXG4gICAgICAgIHBpcGVsaW5lX2J5X3N0YWdlOiB7IHRpdGxlOiAnXHU5NjM2XHU2QkI1XHU3QkExXHU5MDUzXHU1MjA2XHU1RTAzJywgZGVzY3JpcHRpb246ICdcdTYzMDlcdTk2MzZcdTZCQjVcdTdFREZcdThCQTFcdTc2ODRcdThGREJcdTg4NENcdTRFMkRcdTU1NDZcdTY3M0FcdTkxRDFcdTk4OUQnIH0sXG4gICAgICAgIG1vbnRobHlfcmV2ZW51ZV90cmVuZDogeyB0aXRsZTogJ1x1NjcwOFx1NUVBNlx1NjUzNlx1NTE2NVx1OEQ4Qlx1NTJCRicsIGRlc2NyaXB0aW9uOiAnXHU4RkM3XHU1M0JCIDEyIFx1NEUyQVx1NjcwOFx1NzY4NFx1NURGMlx1NjIxMFx1NEVBNFx1NjUzNlx1NTE2NScgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfZm9yZWNhc3RfY2F0ZWdvcnk6IHsgdGl0bGU6ICdcdTk4ODRcdTZENEJcdTdDN0JcdTUyMkJcdTdCQTFcdTkwNTNcdTUyMDZcdTVFMDMnLCBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1OTg4NFx1NkQ0Qlx1N0M3Qlx1NTIyQlx1N0VERlx1OEJBMVx1NzY4NFx1OEZEQlx1ODg0Q1x1NEUyRFx1N0JBMVx1OTA1M1x1OTFEMVx1OTg5RCcgfSxcbiAgICAgICAgbGVhZF9zb3VyY2VfYnJlYWtkb3duOiB7IHRpdGxlOiAnXHU3RUJGXHU3RDIyXHU2NzY1XHU2RTkwXHU1MjA2XHU1RTAzJywgZGVzY3JpcHRpb246ICdcdTYzMDlcdTY3NjVcdTZFOTBcdTdFREZcdThCQTFcdTc2ODRcdTdFQkZcdTdEMjJcdTY1NzBcdTkxQ0YnIH0sXG4gICAgICAgIG9wZW5fcGlwZWxpbmVfYnlfb3duZXI6IHsgdGl0bGU6ICdcdTYzMDlcdThEMUZcdThEMjNcdTRFQkFcdTdFREZcdThCQTFcdThGREJcdTg4NENcdTRFMkRcdTdCQTFcdTkwNTMnLCBkZXNjcmlwdGlvbjogJ1x1NTQwNFx1OTUwMFx1NTUyRVx1OEQxRlx1OEQyM1x1NEVCQVx1NzY4NFx1OEZEQlx1ODg0Q1x1NEUyRFx1N0JBMVx1OTA1M1x1OTFEMVx1OTg5RFx1MzAwMVx1NTU0Nlx1NjczQVx1NjU3MFx1NEUwRVx1NUU3M1x1NTc0N1x1OEQ2Mlx1NTM1NVx1Njk4Mlx1NzM4NycgfSxcbiAgICAgICAgcXVvdGFfYXR0YWlubWVudF9ieV9yZXA6IHsgdGl0bGU6ICdcdTYzMDlcdTk1MDBcdTU1MkVcdTRFRTNcdTg4NjhcdTdFREZcdThCQTFcdTkxNERcdTk4OURcdThGQkVcdTYyMTAnLCBkZXNjcmlwdGlvbjogJ1x1Njc2NVx1ODFFQVx1OTg4NFx1NkQ0Qlx1NUZFQlx1NzE2N1x1NzY4NFx1NTQwNFx1OTUwMFx1NTUyRVx1NEVFM1x1ODg2OFx1NjcyQ1x1NUI2M1x1NUVBNlx1OTE0RFx1OTg5RFx1MzAwMVx1NURGMlx1NjIxMFx1NEVBNFx1NjUzNlx1NTE2NVx1NEUwRVx1OEZCRVx1NjIxMFx1NzM4NycgfSxcbiAgICAgICAgcGlwZWxpbmVfc3RhZ2VfYnlfc291cmNlOiB7IHRpdGxlOiAnXHU5NjM2XHU2QkI1IFx1MDBENyBcdTdFQkZcdTdEMjJcdTY3NjVcdTZFOTAnLCBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1OTYzNlx1NkJCNVx1NTQ4Q1x1Njc2NVx1NkU5MFx1NEVBNFx1NTNDOVx1N0VERlx1OEJBMVx1OEZEQlx1ODg0Q1x1NEUyRFx1NTU0Nlx1NjczQVx1OTFEMVx1OTg5RCcgfSxcbiAgICAgICAgd2luX3JhdGVfMTJtOiB7IHRpdGxlOiAnXHU4RDYyXHU3Mzg3XHVGRjA4XHU4RkQxIDEyIFx1NEUyQVx1NjcwOFx1RkYwOScsIGRlc2NyaXB0aW9uOiAnXHU4RkQxIDEyIFx1NEUyQVx1NjcwOFx1NURGMlx1N0VEM1x1NTM1NVx1NTU0Nlx1NjczQVx1NEUyRFx1OEQ2Mlx1NTM1NVx1NjI0MFx1NTM2MFx1NzY4NFx1NkJENFx1NEY4QicgfSxcbiAgICAgICAgd29uX2RlYWxzXzEybTogeyB0aXRsZTogJ1x1OEQ2Mlx1NTM1NVx1NjU3MFx1RkYwOFx1OEZEMSAxMiBcdTRFMkFcdTY3MDhcdUZGMDknLCBkZXNjcmlwdGlvbjogJ1x1OEQ2Mlx1NzM4N1x1NzY4NFx1NTIwNlx1NUI1MCcgfSxcbiAgICAgICAgbG9zdF9kZWFsc18xMm06IHsgdGl0bGU6ICdcdTRFMjJcdTUzNTVcdTY1NzBcdUZGMDhcdThGRDEgMTIgXHU0RTJBXHU2NzA4XHVGRjA5JywgZGVzY3JpcHRpb246ICdcdThENjJcdTczODdcdTUyMDZcdTZCQ0RcdTc2ODRcdTUzRTZcdTRFMDBcdTUzNEEnIH0sXG4gICAgICAgIHdpbl9yYXRlX2J5X293bmVyOiB7IHRpdGxlOiAnXHU2MzA5XHU5NTAwXHU1NTJFXHU0RUUzXHU4ODY4XHU3RURGXHU4QkExXHU4RDYyL1x1NEUyMlx1NTM1NScsIGRlc2NyaXB0aW9uOiAnXHU4RkQxIDEyIFx1NEUyQVx1NjcwOFx1NTQwNFx1OTUwMFx1NTUyRVx1NEVFM1x1ODg2OFx1NzY4NFx1OEQ2Mlx1NTM1NVx1NjU3MFx1MzAwMVx1NEUyMlx1NTM1NVx1NjU3MFx1NEUwRVx1OEQ2Mlx1NzM4NycgfSxcbiAgICAgICAgd2luX3JhdGVfYnlfbGVhZF9zb3VyY2U6IHsgdGl0bGU6ICdcdTYzMDlcdTdFQkZcdTdEMjJcdTY3NjVcdTZFOTBcdTdFREZcdThCQTFcdThENjIvXHU0RTIyXHU1MzU1JywgZGVzY3JpcHRpb246ICdcdThGRDEgMTIgXHU0RTJBXHU2NzA4XHU1NEVBXHU0RTlCXHU2NzY1XHU2RTkwXHU1RTI2XHU2NzY1XHU3Njg0XHU1NTQ2XHU2NzNBXHU3NzFGXHU2QjYzXHU2MjEwXHU0RUE0JyB9LFxuICAgICAgICBsb3NzX3JlYXNvbl9icmVha2Rvd246IHsgdGl0bGU6ICdcdTRFMjJcdTUzNTVcdTUzOUZcdTU2RTBcdTUyMDZcdTY3OTAnLCBkZXNjcmlwdGlvbjogJ1x1OEZEMSAxMiBcdTRFMkFcdTY3MDhcdTRFMjJcdTUzNTVcdTYzMDlcdTUzOUZcdTU2RTBcdTUyMDZcdTVFMDMnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgc2VydmljZV9kYXNoYm9hcmQ6IHtcbiAgICAgIGxhYmVsOiAnXHU1QkEyXHU2MjM3XHU2NzBEXHU1MkExJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU1REU1XHU1MzU1XHU4RDFGXHU4RjdEXHUzMDAxU0xBIFx1NTA2NVx1NUVCN1x1NUVBNlx1NEUwRVx1NTkwNFx1NzQwNlx1N0VFOVx1NjU0OCcsXG4gICAgICB3aWRnZXRzOiB7XG4gICAgICAgIG9wZW5fY2FzZXM6IHsgdGl0bGU6ICdcdTY3MkFcdTUxNzNcdTk1RURcdTVERTVcdTUzNTUnLCBkZXNjcmlwdGlvbjogJ1x1NUMxQVx1NjcyQVx1NTE3M1x1OTVFRFx1NzY4NFx1NURFNVx1NTM1NScgfSxcbiAgICAgICAgY3JpdGljYWxfY2FzZXM6IHsgdGl0bGU6ICdcdTRFMjVcdTkxQ0RcdTVERTVcdTUzNTUnLCBkZXNjcmlwdGlvbjogJ1x1NjgwN1x1OEJCMFx1NEUzQVx1NEUyNVx1OTFDRFx1NEYxOFx1NTE0OFx1N0VBN1x1NzY4NFx1NjcyQVx1NTE3M1x1OTVFRFx1NURFNVx1NTM1NScgfSxcbiAgICAgICAgYXZnX3Jlc29sdXRpb25fdGltZTogeyB0aXRsZTogJ1x1NUU3M1x1NTc0N1x1ODlFM1x1NTFCM1x1NjVGNlx1OTU3RicsIGRlc2NyaXB0aW9uOiAnXHU1MTczXHU5NUVEXHU1REU1XHU1MzU1XHU3Njg0XHU1RTczXHU1NzQ3XHU1OTA0XHU3NDA2XHU2NUY2XHU5NTdGXHVGRjA4XHU1QzBGXHU2NUY2XHVGRjA5JyB9LFxuICAgICAgICBzbGFfdmlvbGF0aW9uczogeyB0aXRsZTogJ1NMQSBcdThGRERcdTdFQTYnLCBkZXNjcmlwdGlvbjogJ1x1NURGMlx1OEQ4NVx1NTFGQSBTTEEgXHU3Njg0XHU1REU1XHU1MzU1JyB9LFxuICAgICAgICBjYXNlc19ieV9zdGF0dXM6IHsgdGl0bGU6ICdcdTYzMDlcdTcyQjZcdTYwMDFcdTUyMDZcdTVFMDMnLCBkZXNjcmlwdGlvbjogJ1x1NURFNVx1NTM1NVx1NTcyOFx1NTQwNFx1NTkwNFx1NzQwNlx1OTYzNlx1NkJCNVx1NzY4NFx1NTIwNlx1NUUwMycgfSxcbiAgICAgICAgY2FzZXNfYnlfcHJpb3JpdHk6IHsgdGl0bGU6ICdcdTYzMDlcdTRGMThcdTUxNDhcdTdFQTdcdTUyMDZcdTVFMDMnLCBkZXNjcmlwdGlvbjogJ1x1NjcyQVx1NTE3M1x1OTVFRFx1NURFNVx1NTM1NVx1NjMwOVx1N0QyN1x1NjAyNVx1N0EwQlx1NUVBNlx1NzY4NFx1NTIwNlx1NUUwMycgfSxcbiAgICAgICAgY2FzZXNfYnlfb3JpZ2luOiB7IHRpdGxlOiAnXHU2MzA5XHU2NzY1XHU2RTkwXHU1MjA2XHU1RTAzJywgZGVzY3JpcHRpb246ICdcdTVERTVcdTUzNTVcdTc2ODRcdTY3NjVcdTZFOTBcdTZFMjBcdTkwNTMnIH0sXG4gICAgICAgIGRhaWx5X2Nhc2Vfdm9sdW1lOiB7IHRpdGxlOiAnXHU2QkNGXHU2NUU1XHU1REU1XHU1MzU1XHU5MUNGJywgZGVzY3JpcHRpb246ICdcdThGQzdcdTUzQkIgMzAgXHU1OTI5XHU3Njg0XHU2NUIwXHU1RUZBXHU1REU1XHU1MzU1JyB9LFxuICAgICAgICBzbGFfY29tcGxpYW5jZV9nYXVnZTogeyB0aXRsZTogJ1NMQSBcdThGQkVcdTYyMTBcdTczODcnLCBkZXNjcmlwdGlvbjogJ1x1NjcyQ1x1NjcxRiBTTEEgXHU1MTg1XHU4OUUzXHU1MUIzXHU1REU1XHU1MzU1XHU3Njg0XHU1MzYwXHU2QkQ0JyB9LFxuICAgICAgICBrYl9kZWZsZWN0aW9uX3JhdGU6IHsgdGl0bGU6ICdcdTc3RTVcdThCQzZcdTVFOTNcdThGNkNcdTc5RkJcdTczODcnLCBkZXNjcmlwdGlvbjogJ1x1NURGMlx1NTE3M1x1OTVFRFx1NURFNVx1NTM1NVx1NEUyRFx1NzUzMVx1NzdFNVx1OEJDNlx1NjU4N1x1N0FFMFx1ODlFM1x1NTFCM1x1NzY4NFx1NTM2MFx1NkJENCcgfSxcbiAgICAgICAga2JfcmVzb2x2ZWRfY2FzZXM6IHsgdGl0bGU6ICdcdTc3RTVcdThCQzZcdTVFOTNcdTg5RTNcdTUxQjNcdTY1NzAnLCBkZXNjcmlwdGlvbjogJ1x1NURGMlx1NTE3M1x1ODA1NFx1ODlFM1x1NTFCM1x1NjU4N1x1N0FFMFx1NzY4NFx1NURGMlx1NTE3M1x1OTVFRFx1NURFNVx1NTM1NScgfSxcbiAgICAgICAgY2xvc2VkX2Nhc2VzX3RvdGFsOiB7IHRpdGxlOiAnXHU1REYyXHU1MTczXHU5NUVEXHU1REU1XHU1MzU1JywgZGVzY3JpcHRpb246ICdcdThGNkNcdTc5RkJcdTczODdcdTc2ODRcdTUyMDZcdTZCQ0QnIH0sXG4gICAgICAgIHRvcF9yZXNvbHZpbmdfYXJ0aWNsZXM6IHsgdGl0bGU6ICdcdTg5RTNcdTUxQjNcdTVERTVcdTUzNTVcdTY3MDBcdTU5MUFcdTc2ODRcdTY1ODdcdTdBRTAnLCBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1ODlFM1x1NTFCM1x1NzY4NFx1NURGMlx1NTE3M1x1OTVFRFx1NURFNVx1NTM1NVx1NjU3MFx1NjM5Mlx1NTQwRFx1NzY4NFx1NzdFNVx1OEJDNlx1NjU4N1x1N0FFMCcgfSxcbiAgICAgICAgbXlfb3Blbl9jYXNlc19ieV9wcmlvcml0eTogeyB0aXRsZTogJ1x1NjIxMVx1NzY4NFx1NjcyQVx1NTE3M1x1OTVFRFx1NURFNVx1NTM1NVx1RkYwOFx1NjMwOVx1NEYxOFx1NTE0OFx1N0VBN1x1RkYwOScsIGRlc2NyaXB0aW9uOiAnXHU0RjYwXHU3Njg0XHU2NzJBXHU1MTczXHU5NUVEXHU1REU1XHU1MzU1XHU1M0NBXHU1MTc2IFNMQSBcdThGRERcdTdFQTZcdTczODdcdUZGMENcdTYzMDlcdTRGMThcdTUxNDhcdTdFQTdcdTdFQzZcdTUyMDYnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIC8vIGB0aXRsZWAgLyBgc3VidGl0bGVgIHRyYW5zbGF0ZSB0aGUgcGFnZSdzIGBwYWdlOmhlYWRlcmA7IGB0aXRsZWAgZmFsbHMgYmFja1xuICAvLyB0byBgbGFiZWxgIHdoZW4gb21pdHRlZCwgc28gaXQgaXMgYXV0aG9yZWQgb25seSB3aGVyZSB0aGUgdHdvIGRpZmZlci5cbiAgLy8gSGVhZGVyIHN0cmluZ3MgY2FycnlpbmcgYHtmaWVsZH1gIHRva2VucyBrZWVwIHRoZSB0b2tlbiBzcGVsbGluZyB2ZXJiYXRpbSBcdTIwMTRcbiAgLy8gdGhlIGNvbnNvbGUgc3Vic3RpdHV0ZXMgb24gdGhlIHJhdyBrZXksIHNvIGEgdHJhbnNsYXRlZCB0b2tlbiByZXNvbHZlcyB0b1xuICAvLyBub3RoaW5nIGFuZCB0aGUgaGVhZGVyIHJlbmRlcnMgYmxhbmsuXG4gIGRhdGFzZXRzOiB7XG4gICAgYWNjb3VudF9tZXRyaWNzOiB7XG4gICAgICBsYWJlbDogJ1x1NUJBMlx1NjIzN1x1NjMwN1x1NjgwNycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1ODg0Q1x1NEUxQVx1NEUwRVx1N0M3Qlx1NTc4Qlx1N0VERlx1OEJBMVx1NUJBMlx1NjIzN1x1NjU3MFx1OTFDRlx1NzY4NFx1OEJFRFx1NEU0OVx1NUM0MicsXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIGluZHVzdHJ5OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTg4NENcdTRFMUEnLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTdDN0JcdTU3OEInLFxuICAgICAgICB9LFxuICAgICAgICBjcmVhdGVkX2F0OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTUyMUJcdTVFRkFcdTY1RjZcdTk1RjQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGFjY291bnRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NUJBMlx1NjIzN1x1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICAgIGFubnVhbF9yZXZlbnVlX3N1bToge1xuICAgICAgICAgIGxhYmVsOiAnXHU1RTc0XHU4NDI1XHU2NTM2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjYXNlX21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnXHU1REU1XHU1MzU1XHU2MzA3XHU2ODA3JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU3RURGXHU4QkExXHU1REU1XHU1MzU1XHU2NTcwXHU5MUNGXHUzMDAxXHU4OUUzXHU1MUIzXHU2NUY2XHU5NTdGXHU0RTBFIFNMQSBcdTc2ODRcdThCRURcdTRFNDlcdTVDNDInLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBjcmVhdGVkX2F0OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTUyMUJcdTVFRkFcdTY1RjZcdTk1RjQnLFxuICAgICAgICB9LFxuICAgICAgICBvcmlnaW46IHtcbiAgICAgICAgICBsYWJlbDogJ1x1Njc2NVx1NkU5MCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByaW9yaXR5OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTRGMThcdTUxNDhcdTdFQTcnLFxuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlZF9hcnRpY2xlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTg5RTNcdTUxQjNcdTc1MjhcdTc3RTVcdThCQzZcdTY1ODdcdTdBRTAnLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXM6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NzJCNlx1NjAwMScsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1N0M3Qlx1NTc4QicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbWVhc3VyZXM6IHtcbiAgICAgICAgYXZnX3Jlc29sdXRpb246IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NUU3M1x1NTc0N1x1ODlFM1x1NTFCM1x1NjVGNlx1OTU3Rlx1RkYwOFx1NUMwRlx1NjVGNlx1RkYwOScsXG4gICAgICAgIH0sXG4gICAgICAgIGF2Z19zbGFfdmlvbGF0ZWQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1NMQSBcdThGRERcdTdFQTZcdTczODcnLFxuICAgICAgICB9LFxuICAgICAgICBjYXNlX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVERTVcdTUzNTVcdTY1NzAnLFxuICAgICAgICB9LFxuICAgICAgICBjbG9zZWRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NURGMlx1NTE3M1x1OTVFRFx1NURFNVx1NTM1NScsXG4gICAgICAgIH0sXG4gICAgICAgIGtiX2RlZmxlY3Rpb25fcmF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU3N0U1XHU4QkM2XHU1RTkzXHU4MUVBXHU1MkE5XHU4OUUzXHU1MUIzXHU3Mzg3JyxcbiAgICAgICAgfSxcbiAgICAgICAga2JfcmVzb2x2ZWRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NzdFNVx1OEJDNlx1NUU5M1x1ODlFM1x1NTFCM1x1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICAgIHNsYV9jb21wbGlhbmNlX3JhdGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1NMQSBcdThGQkVcdTY4MDdcdTczODcnLFxuICAgICAgICB9LFxuICAgICAgICBzbGFfbWV0X2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdTTEEgXHU4RkJFXHU2ODA3XHU1REU1XHU1MzU1JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb250YWN0X21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnXHU4MDU0XHU3Q0ZCXHU0RUJBXHU2MzA3XHU2ODA3JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU3RURGXHU4QkExXHU4MDU0XHU3Q0ZCXHU0RUJBXHU2NTcwXHU5MUNGXHU3Njg0XHU4QkVEXHU0RTQ5XHU1QzQyJyxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGNvbnRhY3RfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEVCQVx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZXZlbnRfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdcdTZEM0JcdTUyQThcdTYzMDdcdTY4MDcnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTdFREZcdThCQTFcdTRGMUFcdThCQUVcdTMwMDFcdTkwMUFcdThCRERcdTRFMEVcdTRFOTJcdTUyQThcdTY1QjBcdThGRDFcdTVFQTZcdTc2ODRcdThCRURcdTRFNDlcdTVDNDInLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBvd25lcjoge1xuICAgICAgICAgIGxhYmVsOiAnXHU4RDFGXHU4RDIzXHU0RUJBJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRlZF90b190eXBlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTVCRjlcdThDNjEnLFxuICAgICAgICB9LFxuICAgICAgICBzdGFydF9kYXRldGltZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU2RDNCXHU1MkE4XHU1NDY4JyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTcyQjZcdTYwMDEnLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTZEM0JcdTUyQThcdTdDN0JcdTU3OEInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGF2Z19taW51dGVzOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVFNzNcdTU3NDdcdTY1RjZcdTk1N0YnLFxuICAgICAgICB9LFxuICAgICAgICBldmVudF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU2RDNCXHU1MkE4XHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgdG90YWxfbWludXRlczoge1xuICAgICAgICAgIGxhYmVsOiAnXHU2MDNCXHU1MjA2XHU5NDlGXHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBmb3JlY2FzdF9tZXRyaWNzOiB7XG4gICAgICBsYWJlbDogJ1x1OTUwMFx1NTUyRVx1OTg4NFx1NkQ0Qlx1NjMwN1x1NjgwNycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1OEQxRlx1OEQyM1x1NEVCQVx1N0VERlx1OEJBMVx1OTE0RFx1OTg5RFx1MzAwMVx1OEZCRVx1NjIxMFx1NzM4N1x1NEUwRVx1N0JBMVx1OTA1M1x1ODk4Nlx1NzZENlx1NTAwRFx1NjU3MFx1NzY4NFx1OEJFRFx1NEU0OVx1NUM0MicsXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIG93bmVyOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdThEMUZcdThEMjNcdTRFQkEnLFxuICAgICAgICB9LFxuICAgICAgICBwZXJpb2Q6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTQ2OFx1NjcxRlx1N0M3Qlx1NTc4QicsXG4gICAgICAgIH0sXG4gICAgICAgIHBlcmlvZF9sYWJlbDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1NDY4XHU2NzFGJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGVyaW9kX3N0YXJ0OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTU0NjhcdTY3MUZcdTVGMDBcdTU5Q0InLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGF0dGFpbm1lbnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1OEZCRVx1NjIxMFx1NzM4NycsXG4gICAgICAgIH0sXG4gICAgICAgIGNsb3NlZF9zdW06IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NURGMlx1NjIxMFx1NEVBNCcsXG4gICAgICAgIH0sXG4gICAgICAgIGNvbW1pdF9zdW06IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NjI3Rlx1OEJGQScsXG4gICAgICAgIH0sXG4gICAgICAgIHBpcGVsaW5lX3N1bToge1xuICAgICAgICAgIGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU3QkExXHU5MDUzJyxcbiAgICAgICAgfSxcbiAgICAgICAgcXVvdGFfc3VtOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTkxNERcdTk4OUQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxlYWRfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdcdTdFQkZcdTdEMjJcdTYzMDdcdTY4MDcnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTdFREZcdThCQTFcdTdFQkZcdTdEMjJcdTY1NzBcdTkxQ0ZcdTc2ODRcdThCRURcdTRFNDlcdTVDNDInLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBjcmVhdGVkX2F0OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTUyMUJcdTVFRkFcdTY1RjZcdTk1RjQnLFxuICAgICAgICB9LFxuICAgICAgICBsYXN0X2NvbnRhY3RlZF9kYXRlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTY3MDBcdThGRDFcdTgwNTRcdTdDRkInLFxuICAgICAgICB9LFxuICAgICAgICBsZWFkX3NvdXJjZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU2NzY1XHU2RTkwJyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTcyQjZcdTYwMDEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGxlYWRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgb3Bwb3J0dW5pdHlfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdcdTU1NDZcdTY3M0FcdTYzMDdcdTY4MDcnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTdFREZcdThCQTFcdTk1MDBcdTU1MkVcdTdCQTFcdTkwNTNcdTY1NzBcdTkxQ0ZcdTRFMEVcdTkxRDFcdTk4OURcdTc2ODRcdThCRURcdTRFNDlcdTVDNDInLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBhY2NvdW50X2luZHVzdHJ5OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTg4NENcdTRFMUEnLFxuICAgICAgICB9LFxuICAgICAgICBjbG9zZV9kYXRlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTk4ODRcdThCQTFcdTYyMTBcdTRFQTRcdTY1RTUnLFxuICAgICAgICB9LFxuICAgICAgICBjbG9zZV9xdWFydGVyOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTYyMTBcdTRFQTRcdTVCNjNcdTVFQTYnLFxuICAgICAgICB9LFxuICAgICAgICBmb3JlY2FzdF9jYXRlZ29yeToge1xuICAgICAgICAgIGxhYmVsOiAnXHU5ODg0XHU2RDRCXHU3QzdCXHU1MjJCJyxcbiAgICAgICAgfSxcbiAgICAgICAgbGVhZF9zb3VyY2U6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1Njc2NVx1NkU5MCcsXG4gICAgICAgIH0sXG4gICAgICAgIGxvc3NfcmVhc29uOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTU5MzFcdTUzNTVcdTUzOUZcdTU2RTAnLFxuICAgICAgICB9LFxuICAgICAgICBvd25lcjoge1xuICAgICAgICAgIGxhYmVsOiAnXHU4RDFGXHU4RDIzXHU0RUJBJyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhZ2U6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1OTYzNlx1NkJCNScsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1N0M3Qlx1NTc4QicsXG4gICAgICAgIH0sXG4gICAgICAgIHdpbl9yZWFzb246IHtcbiAgICAgICAgICBsYWJlbDogJ1x1OEQ2Mlx1NTM1NVx1NTM5Rlx1NTZFMCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbWVhc3VyZXM6IHtcbiAgICAgICAgYXZnX2Ftb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1RTczXHU1NzQ3XHU1MzU1XHU3QjE0XHU5MUQxXHU5ODlEJyxcbiAgICAgICAgfSxcbiAgICAgICAgYXZnX3Byb2JhYmlsaXR5OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVFNzNcdTU3NDdcdThENjJcdTUzNTVcdTY5ODJcdTczODcnLFxuICAgICAgICB9LFxuICAgICAgICBkZWNpZGVkX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVERjJcdTVCOUFcdTVDNDBcdTU1NDZcdTY3M0EnLFxuICAgICAgICB9LFxuICAgICAgICBsb3N0X2Ftb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1OTMxXHU1MzU1XHU5MUQxXHU5ODlEJyxcbiAgICAgICAgfSxcbiAgICAgICAgbG9zdF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1OTMxXHU1MzU1XHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgb3BwX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTU1NDZcdTY3M0FcdTY1NzAnLFxuICAgICAgICB9LFxuICAgICAgICB0b3RhbF9hbW91bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NjAzQlx1OTFEMVx1OTg5RCcsXG4gICAgICAgIH0sXG4gICAgICAgIHdpbl9yYXRlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdThENjJcdTUzNTVcdTczODcnLFxuICAgICAgICB9LFxuICAgICAgICB3b25fYW1vdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdThENjJcdTUzNTVcdTkxRDFcdTk4OUQnLFxuICAgICAgICB9LFxuICAgICAgICB3b25fY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1OEQ2Mlx1NTM1NVx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgcHJvZHVjdF9tZXRyaWNzOiB7XG4gICAgICBsYWJlbDogJ1x1NEVBN1x1NTRDMVx1NjMwN1x1NjgwNycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1N0VERlx1OEJBMVx1NEVBN1x1NTRDMVx1NzZFRVx1NUY1NVx1NjU3MFx1OTFDRlx1NEUwRVx1NjgwN1x1NEVGN1x1NzY4NFx1OEJFRFx1NEU0OVx1NUM0MicsXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIGNhdGVnb3J5OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTdDN0JcdTUyMkInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGxpc3RfcHJpY2Vfc3VtOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTY4MDdcdTRFRjdcdTU0MDhcdThCQTEnLFxuICAgICAgICB9LFxuICAgICAgICBwcm9kdWN0X2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTRFQTdcdTU0QzFcdTY1NzAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHRhc2tfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdcdTRFRkJcdTUyQTFcdTYzMDdcdTY4MDcnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTdFREZcdThCQTFcdTRFRkJcdTUyQTFcdTVERTVcdTRGNUNcdTkxQ0ZcdTRFMEVcdTVCOENcdTYyMTBcdTYwQzVcdTUxQjVcdTc2ODRcdThCRURcdTRFNDlcdTVDNDInLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBkdWVfZGF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU2MjJBXHU2QjYyXHU2NUU1XHU2NzFGJyxcbiAgICAgICAgfSxcbiAgICAgICAgaXNfY29tcGxldGVkOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVERjJcdTVCOENcdTYyMTAnLFxuICAgICAgICB9LFxuICAgICAgICBpc19vdmVyZHVlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVERjJcdTkwM0VcdTY3MUYnLFxuICAgICAgICB9LFxuICAgICAgICBwcmlvcml0eToge1xuICAgICAgICAgIGxhYmVsOiAnXHU0RjE4XHU1MTQ4XHU3RUE3JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJpb3JpdHlfcmFuazoge1xuICAgICAgICAgIGxhYmVsOiAnXHU3RDI3XHU2MDI1XHU1RUE2JyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTcyQjZcdTYwMDEnLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTdDN0JcdTU3OEInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGF2Z19wcm9ncmVzczoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1RTczXHU1NzQ3XHU4RkRCXHU1RUE2JyxcbiAgICAgICAgfSxcbiAgICAgICAgdGFza19jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU0RUZCXHU1MkExXHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcGFnZXM6IHtcbiAgICBhY2NvdW50X2RldGFpbF9wYWdlOiB7XG4gICAgICBsYWJlbDogJ1x1NUJBMlx1NjIzN1x1OEJFNlx1NjBDNScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1NjNEMlx1NjlGRFx1NUYwRlx1NUJBMlx1NjIzN1x1OEJCMFx1NUY1NVx1OTg3NVx1MjAxNFx1MjAxNFx1ODFFQVx1NUI5QVx1NEU0OVx1OTg3NVx1NTkzNCArIFx1NUUzOFx1OUE3Qlx1OEJBOFx1OEJCQVx1NTMzQVx1MzAwMicsXG4gICAgICB0aXRsZTogJ3tuYW1lfScsXG4gICAgICBzdWJ0aXRsZTogJ3tpbmR1c3RyeX0gXHUwMEI3IHt0eXBlfScsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIGFjY291bnRfY2hhdHRlcjogeyBsYWJlbDogJ1x1OEJBOFx1OEJCQScgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhY2NvdW50X3dvcmtiZW5jaDoge1xuICAgICAgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTVERTVcdTRGNUNcdTUzRjAnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTk3NjJcdTU0MTFcdTk1MDBcdTU1MkVcdTU2RTJcdTk2MUZcdTc2ODRcdTdDQkVcdTkwMDlcdTVCQTJcdTYyMzdcdTUyMTdcdTg4NjhcdUZGMUFcdTRFQzVcdTYzRDBcdTRGOUJcdTVGRUJcdTYzNzdcdTdCNUJcdTkwMDlcdUZGMENcdTRFMERcdTU0MkJcdTg5QzZcdTU2RkVcdTdCQTFcdTc0MDZcdTMwMDInLFxuICAgIH0sXG4gICAgYXBwX2xhdW5jaGVyX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnXHU1RTk0XHU3NTI4XHU0RTJEXHU1RkMzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU4QkJGXHU5NUVFXHU1MTY4XHU5MEU4XHU1RTk0XHU3NTI4XHU3Njg0XHU3RURGXHU0RTAwXHU1MTY1XHU1M0UzJyxcbiAgICAgIHN1YnRpdGxlOiAnXHU5MDA5XHU2MkU5XHU0RTAwXHU0RTJBXHU1RTk0XHU3NTI4XHU1RjAwXHU1OUNCXHU0RjdGXHU3NTI4JyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgYXBwX3NlYXJjaDogeyBsYWJlbDogJ1x1NjQxQ1x1N0QyMlx1NUU5NFx1NzUyOCcgfSxcbiAgICAgICAgYXBwX2dyaWQ6IHsgbGFiZWw6ICdcdTVFOTRcdTc1MjhcdTdGNTFcdTY4M0MnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY2FzZV9kZXRhaWxfcGFnZToge1xuICAgICAgbGFiZWw6ICdcdTVERTVcdTUzNTVcdThCRTZcdTYwQzUnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTVCQTJcdTY3MERcdTVERTVcdTUzNTVcdThCQjBcdTVGNTVcdTk4NzVcdUZGMUFcdTUxNzNcdTk1MkVcdTRGRTFcdTYwNkZcdTMwMDFTTEEgXHU4RkRCXHU1RUE2XHUzMDAxXHU2NjBFXHU3RUM2XHU0RTBFXHU2RDNCXHU1MkE4XHU2NUY2XHU5NUY0XHU3RUJGXHUzMDAyJyxcbiAgICAgIHRpdGxlOiAne2Nhc2VfbnVtYmVyfSBcdTAwQjcge3N1YmplY3R9JyxcbiAgICAgIHN1YnRpdGxlOiAne2NybV9hY2NvdW50fScsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIGNhc2VfaGlnaGxpZ2h0czogeyBsYWJlbDogJ1x1NTE3M1x1OTUyRVx1NEZFMVx1NjA2RicgfSxcbiAgICAgICAgY2FzZV9zdGF0dXNfcGF0aDogeyBsYWJlbDogJ1x1NURFNVx1NTM1NVx1NzJCNlx1NjAwMVx1OEZEQlx1NUVBNicgfSxcbiAgICAgICAgY2FzZV9kZXRhaWxzOiB7IGxhYmVsOiAnXHU1REU1XHU1MzU1XHU2NjBFXHU3RUM2JyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxlYWRfZGV0YWlsX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnXHU3RUJGXHU3RDIyXHU4QkU2XHU2MEM1JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU1QjhDXHU2NTc0XHU3Njg0XHU3RUJGXHU3RDIyXHU4QkU2XHU2MEM1XHU5ODc1XHVGRjBDXHU1MzA1XHU1NDJCXHU1MTczXHU5NTJFXHU0RkUxXHU2MDZGXHUzMDAxXHU2NjBFXHU3RUM2XHU0RTBFXHU3NkY4XHU1MTczXHU4QkIwXHU1RjU1XHUzMDAyJyxcbiAgICAgIHRpdGxlOiAne2ZpcnN0X25hbWV9IHtsYXN0X25hbWV9JyxcbiAgICAgIHN1YnRpdGxlOiAne2NvbXBhbnl9JyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgbGVhZF9kdXBsaWNhdGVfYWxlcnRfY29uZmlybWVkOiB7IGxhYmVsOiAnXHU1REYyXHU3ODZFXHU4QkE0XHU5MUNEXHU1OTBEXHU2M0QwXHU5MTkyJyB9LFxuICAgICAgICBsZWFkX2R1cGxpY2F0ZV9hbGVydF9zdXNwZWN0ZWQ6IHsgbGFiZWw6ICdcdTc1OTFcdTRGM0NcdTkxQ0RcdTU5MERcdTYzRDBcdTkxOTInIH0sXG4gICAgICAgIGxlYWRfaGlnaGxpZ2h0czogeyBsYWJlbDogJ1x1NTE3M1x1OTUyRVx1NEZFMVx1NjA2RicgfSxcbiAgICAgICAgbGVhZF9wYXRoOiB7IGxhYmVsOiAnXHU3RUJGXHU3RDIyXHU3MkI2XHU2MDAxXHU4RkRCXHU1RUE2JyB9LFxuICAgICAgICBtYWluX3RhYnM6IHsgbGFiZWw6ICdcdTdFQkZcdTdEMjJcdTRGRTFcdTYwNkZcdTY4MDdcdTdCN0VcdTk4NzUnIH0sXG4gICAgICAgIGxlYWRfZGV0YWlsczogeyBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1NjYwRVx1N0VDNicgfSxcbiAgICAgICAgcmVsYXRlZF9hY2NvcmRpb246IHsgbGFiZWw6ICdcdTc2RjhcdTUxNzNcdThCQjBcdTVGNTUnIH0sXG4gICAgICAgIHJlbGF0ZWRfdGFza3M6IHsgdGl0bGU6ICdcdTVGODVcdTUyOUVcdTRFRkJcdTUyQTEnLCBsYWJlbDogJ1x1NEVGQlx1NTJBMScgfSxcbiAgICAgICAgbGVhZF9hY3Rpdml0eTogeyBsYWJlbDogJ1x1NkQzQlx1NTJBOFx1NjVGNlx1OTVGNFx1N0VCRicgfSxcbiAgICAgICAgbGVhZF9oaXN0b3J5OiB7IGxhYmVsOiAnXHU1QjU3XHU2QkI1XHU1Mzg2XHU1M0YyJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG9wcG9ydHVuaXR5X2RldGFpbF9wYWdlOiB7XG4gICAgICBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1OEJFNlx1NjBDNScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1NUI4Q1x1NjU3NFx1NzY4NFx1NTU0Nlx1NjczQVx1OEJFNlx1NjBDNVx1OTg3NVx1RkYwQ1x1NTMwNVx1NTQyQlx1OTYzNlx1NkJCNVx1OEZEQlx1NUVBNlx1MzAwMVx1NTE3M1x1OTUyRVx1NEZFMVx1NjA2Rlx1MzAwMVx1NjYwRVx1N0VDNlx1NEUwRVx1NzZGOFx1NTE3M1x1NTIxN1x1ODg2OFx1MzAwMicsXG4gICAgICB0aXRsZTogJ3tuYW1lfScsXG4gICAgICBzdWJ0aXRsZTogJ3tjcm1fYWNjb3VudH0nLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBvcHBfaGlnaGxpZ2h0czogeyBsYWJlbDogJ1x1NTE3M1x1OTUyRVx1NEZFMVx1NjA2RicgfSxcbiAgICAgICAgb3BwX3N0YWdlX3BhdGg6IHsgbGFiZWw6ICdcdTU1NDZcdTY3M0FcdTk2MzZcdTZCQjVcdThGREJcdTVFQTYnIH0sXG4gICAgICAgIG9wcF9kZXRhaWxzOiB7IGxhYmVsOiAnXHU1NTQ2XHU2NzNBXHU2NjBFXHU3RUM2JyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHNhbGVzX2hvbWVfcGFnZToge1xuICAgICAgbGFiZWw6ICdcdTk1MDBcdTU1MkVcdTRFM0JcdTk4NzUnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTk1MDBcdTU1MkVcdTU2RTJcdTk2MUZcdTRFM0JcdTk4NzVcdUZGMENcdTZDNDdcdTYwM0JcdTUxNzNcdTk1MkVcdTYzMDdcdTY4MDdcdTRFMEVcdTVGRUJcdTYzNzdcdTY0Q0RcdTRGNUMnLFxuICAgICAgdGl0bGU6ICdcdTk1MDBcdTU1MkVcdTc3MEJcdTY3N0YnLFxuICAgICAgc3VidGl0bGU6ICdcdTZCMjJcdThGQ0VcdTU2REVcdTY3NjUnLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBrcGlfcmV2ZW51ZV93b246IHtcbiAgICAgICAgICBsYWJlbDogJ1x1OEQ2Mlx1NTM1NVx1ODQyNVx1NjUzNicsXG4gICAgICAgIH0sXG4gICAgICAgIGtwaV9kZWFsc193b246IHtcbiAgICAgICAgICBsYWJlbDogJ1x1OEQ2Mlx1NTM1NVx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICAgIGtwaV9waXBlbGluZV92YWx1ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU3QkExXHU5MDUzXHU5MUQxXHU5ODlEJyxcbiAgICAgICAgfSxcbiAgICAgICAga3BpX29wZW5fbGVhZHM6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NUYwMFx1NjUzRVx1N0VCRlx1N0QyMicsXG4gICAgICAgIH0sXG4gICAgICAgIGhvbWVfdXBjb21pbmdfZXZlbnRzOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdUQ4M0RcdURDQzUgXHU1MzczXHU1QzA2XHU1RjAwXHU1OUNCIFx1MDBCNyBcdTY3MDBcdThGRDFcdTRGMThcdTUxNDgnLFxuICAgICAgICB9LFxuICAgICAgICBxdWlja19jcmVhdGU6IHsgdGl0bGU6ICdcdTVGRUJcdTkwMUZcdTUyMUJcdTVFRkEnLCBsYWJlbDogJ1x1NUZFQlx1OTAxRlx1NTIxQlx1NUVGQScgfSxcbiAgICAgICAga2V5X21ldHJpY3M6IHsgdGl0bGU6ICdcdTUxNzNcdTk1MkVcdTdFRTlcdTY1NDhcdTYzMDdcdTY4MDcnLCBsYWJlbDogJ1x1NTE3M1x1OTUyRVx1NjMwN1x1NjgwNycgfSxcbiAgICAgICAgaG9tZV90YWJzOiB7IGxhYmVsOiAnXHU0RTNCXHU5ODc1XHU2ODA3XHU3QjdFXHU5ODc1JyB9LFxuICAgICAgICBob21lX215X2xlYWRzOiB7IGxhYmVsOiAnXHU2MjExXHU3Njg0XHU3RUJGXHU3RDIyJyB9LFxuICAgICAgICBob21lX215X2RlYWxzOiB7IGxhYmVsOiAnXHU2MjExXHU3Njg0XHU4RkRCXHU4ODRDXHU0RTJEXHU1NTQ2XHU2NzNBJyB9LFxuICAgICAgICBob21lX215X3Rhc2tzOiB7IGxhYmVsOiAnXHU2MjExXHU3Njg0XHU1Rjg1XHU1MjlFXHU0RUZCXHU1MkExJyB9LFxuICAgICAgICBhaV9icmllZmluZzoge1xuICAgICAgICAgIHRpdGxlOiAnXHU4QkUyXHU5NUVFIEFJIFx1NTJBOVx1NjI0QicsXG4gICAgICAgICAgbGFiZWw6ICdBSSBcdTUyQTlcdTYyNEJcdTRFQ0FcdTY1RTVcdTkwMUZcdTg5QzgnLFxuICAgICAgICB9LFxuICAgICAgICB1cGNvbWluZ19ldmVudHM6IHsgdGl0bGU6ICdcdTUzNzNcdTVDMDZcdTVGMDBcdTU5Q0JcdTc2ODRcdTZEM0JcdTUyQTgnLCBsYWJlbDogJ1x1NTM3M1x1NUMwNlx1NUYwMFx1NTlDQlx1NzY4NFx1NkQzQlx1NTJBOCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB1dGlsaXR5X2Jhcl9wYWdlOiB7XG4gICAgICBsYWJlbDogJ1x1NURFNVx1NTE3N1x1NjgwRicsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1NjBBQ1x1NkQ2RVx1NURFNVx1NTE3N1x1NzY4NFx1NUZFQlx1NjM3N1x1OEJCRlx1OTVFRVx1NjgwRicsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIG5vdGlmaWNhdGlvbnNfcGFuZWw6IHsgbGFiZWw6ICdcdTkwMUFcdTc3RTUnIH0sXG4gICAgICAgIHF1aWNrX25vdGVzOiB7IHRpdGxlOiAnXHU1RkVCXHU5MDFGXHU3QjE0XHU4QkIwJywgbGFiZWw6ICdcdTVGRUJcdTkwMUZcdTdCMTRcdThCQjAnIH0sXG4gICAgICAgIHF1aWNrX3NlYXJjaDogeyBsYWJlbDogJ1x1NUZFQlx1OTAxRlx1NjQxQ1x1N0QyMicgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgLy8gU2NyZWVuLWZsb3cgY29weSAoIzEyMTAsICMxOTc1KS4gS2V5ZWQgYGZsb3dzLjxmbG93Pi5sYWJlbGAsXG4gIC8vIGBzY3JlZW5zLjxub2RlPi50aXRsZWAgYW5kIGBzY3JlZW5zLjxub2RlPi5maWVsZHMuPGZpZWxkPi57bGFiZWwscGxhY2Vob2xkZXJ9YFxuICAvLyBcdTIwMTQgdGhlIGtleXMgYG9zIGxpbnRgJ3MgYGkxOG4vbWlzc2luZy1mbG93YCBuYW1lcywgcmVhZCBieSB0aGUgY29uc29sZSdzXG4gIC8vIGZsb3cgcnVubmVyIHNpbmNlIEBvYmplY3RzdGFjayAxNy43LjAgKHRoZSBzcGVjJ3MgYGZsb3dzYCBsaXZlbmVzcyByb3cgaXNcbiAgLy8gYGxpdmVgIHRoZXJlKS4gQSBzY3JlZW4gd2l0aCBubyBhdXRob3JlZCBgdGl0bGVgIHNob3dzIGl0cyBmbG93J3MgbGFiZWwgaW5cbiAgLy8gZXZlcnkgbG9jYWxlLCBzbyBlYWNoIGBzY3JlZW5fMS50aXRsZWAgcmVwZWF0cyB0aGUgZmxvdyBsYWJlbC4gU2luY2VcbiAgLy8gMTguMC4wLW5leHQuMCB0aHJlZSBtb3JlIHN1cmZhY2VzIGFyZSBrZXlzIHRoZSBlbmdpbmUgcmVhZHMgaW4gdGhlIHJ1bidzXG4gIC8vIGxvY2FsZSwgYW5kIGBpMThuL21pc3NpbmctZmxvd2AgbmFtZXMgZWFjaCBtaXNzaW5nIG9uZTogYSBzZWxlY3QgZmllbGQnc1xuICAvLyBgb3B0aW9ucy48dmFsdWU+YCAod29yZGVkIGFzIHRoZSBvYmplY3QgZmllbGQncyBvd24gb3B0aW9uIGluIHRoaXMgcGFjayksXG4gIC8vIGFuIGF1dGhvcmVkIHNjcmVlbiBgZGVzY3JpcHRpb25gLCBhbmQgYSByZWZ1c2luZyBgZW5kYCBub2RlJ3NcbiAgLy8gYHJlZnVzYWxzLjxub2RlPi5tZXNzYWdlYC4gQSB0cmFuc2xhdGVkIGRlc2NyaXB0aW9uIG9yIG1lc3NhZ2UgaXMgYSB0ZXh0XG4gIC8vIHNsb3QgbGlrZSB0aGUgb25lIGl0IHRyYW5zbGF0ZXMsIHNvIGEgaG9sZSBpbiBpdCBpcyBge3sgfX1gLlxuICAvLyBUaGUgZGlzY291bnQgY2VpbGluZyBpcyBpbnRlcnBvbGF0ZWQgZnJvbSBgUVVPVEVfRElTQ09VTlRfQ0VJTElOR2AsIG5ldmVyXG4gIC8vIHJldHlwZWQ6IHRoZSBudW1iZXIgbGl2ZXMgaW4gYF90aHJlc2hvbGRzLnRzYCBhbG9uZSAoIzE3MTEpLlxuICBmbG93czoge1xuICAgIGNhbXBhaWduX2Vucm9sbG1lbnQ6IHtcbiAgICAgIGxhYmVsOiAnXHU1QzA2XHU2MjEwXHU1NDU4XHU1MkEwXHU1MTY1XHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4JyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1NUMwNlx1NjIxMFx1NTQ1OFx1NTJBMFx1NTE2NVx1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCcsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBtZW1iZXJTb3VyY2U6IHsgbGFiZWw6ICdcdTUyQTBcdTUxNjVcdTc2ODRcdTYyMTBcdTU0NThcdTdDN0JcdTU3OEInLCBvcHRpb25zOiB7IGxlYWRzOiAnXHU3RUJGXHU3RDIyJywgY29udGFjdHM6ICdcdTgwNTRcdTdDRkJcdTRFQkEnIH0gfSxcbiAgICAgICAgICAgIGxlYWRTdGF0dXM6IHsgbGFiZWw6ICdcdTUyQTBcdTUxNjVcdTRFRTVcdTRFMEJcdTcyQjZcdTYwMDFcdTc2ODRcdTdFQkZcdTdEMjInLCBvcHRpb25zOiB7IG5ldzogJ1x1NjVCMFx1NUVGQScsIGNvbnRhY3RlZDogJ1x1NURGMlx1ODA1NFx1N0NGQicsIHF1YWxpZmllZDogJ1x1NURGMlx1Nzg2RVx1OEJBNCcgfSB9LFxuICAgICAgICAgICAgY29udGFjdERlcGFydG1lbnQ6IHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdcdTUyQTBcdTUxNjVcdTRFRTVcdTRFMEJcdTkwRThcdTk1RThcdTc2ODRcdTgwNTRcdTdDRkJcdTRFQkEnLFxuICAgICAgICAgICAgICBvcHRpb25zOiB7IGV4ZWN1dGl2ZTogJ1x1N0JBMVx1NzQwNlx1NUM0MicsIHNhbGVzOiAnXHU5NTAwXHU1NTJFXHU5MEU4JywgbWFya2V0aW5nOiAnXHU1RTAyXHU1NzNBXHU5MEU4JywgZW5naW5lZXJpbmc6ICdcdTVERTVcdTdBMEJcdTkwRTgnLCBzdXBwb3J0OiAnXHU2NTJGXHU2MzAxXHU5MEU4JywgZmluYW5jZTogJ1x1OEQyMlx1NTJBMVx1OTBFOCcsIGhyOiAnXHU0RUJBXHU1MjlCXHU4RDQ0XHU2RTkwJywgb3BlcmF0aW9uczogJ1x1OEZEMFx1ODQyNVx1OTBFOCcgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBlc2NhbGF0ZV9jYXNlOiB7XG4gICAgICBsYWJlbDogJ1x1NTM0N1x1N0VBN1x1NURFNVx1NTM1NScsXG4gICAgICBzY3JlZW5zOiB7IHNjcmVlbl8xOiB7IHRpdGxlOiAnXHU1MzQ3XHU3RUE3XHU1REU1XHU1MzU1JywgZmllbGRzOiB7IHJlYXNvbjogeyBsYWJlbDogJ1x1NTM0N1x1N0VBN1x1NTM5Rlx1NTZFMCcgfSB9IH0gfSxcbiAgICB9LFxuICAgIGNsb3NlX2Nhc2U6IHtcbiAgICAgIGxhYmVsOiAnXHU1MTczXHU5NUVEXHU1REU1XHU1MzU1JyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1NTE3M1x1OTVFRFx1NURFNVx1NTM1NScsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICByZXNvbHV0aW9uOiB7IGxhYmVsOiAnXHU4OUUzXHU1MUIzXHU2NUI5XHU2ODQ4JyB9LFxuICAgICAgICAgICAgcmVzb2x2ZWRfYnlfYXJ0aWNsZTogeyBsYWJlbDogJ1x1OTAxQVx1OEZDN1x1NzdFNVx1OEJDNlx1NjU4N1x1N0FFMFx1ODlFM1x1NTFCM1x1RkYwOFx1NTNFRlx1OTAwOVx1RkYwOScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNsYWltX2Nhc2U6IHtcbiAgICAgIGxhYmVsOiAnXHU4QkE0XHU5ODg2XHU1REU1XHU1MzU1JyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1OEJBNFx1OTg4Nlx1NURFNVx1NTM1NScsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBjbGFpbVN0YXR1czoge1xuICAgICAgICAgICAgICBsYWJlbDogJ1x1NTkwNFx1NzQwNlx1NzJCNlx1NjAwMScsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHsgaW5fcHJvZ3Jlc3M6ICdcdTU5MDRcdTc0MDZcdTRFMkQnLCB3YWl0aW5nX2N1c3RvbWVyOiAnXHU3QjQ5XHU1Rjg1XHU1QkEyXHU2MjM3XHU1NkRFXHU1OTBEJywgd2FpdGluZ19zdXBwb3J0OiAnXHU3QjQ5XHU1Rjg1XHU2NTJGXHU2MzAxXHU1NkRFXHU1OTBEJyB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxlYWRfY29udmVyc2lvbjoge1xuICAgICAgbGFiZWw6ICdcdTdFQkZcdTdEMjJcdThGNkNcdTUzMTZcdTZENDFcdTdBMEInLFxuICAgICAgc2NyZWVuczoge1xuICAgICAgICBzY3JlZW5fMToge1xuICAgICAgICAgIHRpdGxlOiAnXHU3RUJGXHU3RDIyXHU4RjZDXHU1MzE2XHU2RDQxXHU3QTBCJyxcbiAgICAgICAgICAvLyBUaGUgZHVwbGljYXRlIHdhcm5pbmcncyB0ZXh0IGlzIGEgdmFyaWFibGUgdGhlIGZsb3cgYXNzaWduczsgdGhpc1xuICAgICAgICAgIC8vIGtleSBjYW4gb25seSBjYXJyeSB0aGUgaG9sZSB0aGF0IHNob3dzIGl0LlxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAne3tkdXBsaWNhdGVXYXJuaW5nfX0nLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgY3JlYXRlT3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdcdTY2MkZcdTU0MjZcdTUyMUJcdTVFRkFcdTU1NDZcdTY3M0FcdUZGMUYnIH0sXG4gICAgICAgICAgICBvcHBvcnR1bml0eU5hbWU6IHsgbGFiZWw6ICdcdTU1NDZcdTY3M0FcdTU0MERcdTc5RjAnIH0sXG4gICAgICAgICAgICBvcHBvcnR1bml0eUFtb3VudDogeyBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1OTFEMVx1OTg5RCcgfSxcbiAgICAgICAgICAgIGNsb3NlRGF0ZTogeyBsYWJlbDogJ1x1OTg4NFx1OEJBMVx1NjIxMFx1NEVBNFx1NjVFNVx1NjcxRicgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByZWZ1c2VfY29uZmlybWVkX2R1cGxpY2F0ZToge1xuICAgICAgICAgIHRpdGxlOiAnXHU4RjZDXHU1MzE2XHU4OEFCXHU2MkQyXHU3RUREJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdcdThCRTVcdTdFQkZcdTdEMjJcdTc2ODRcdTMwMENcdTkxQ0RcdTU5MERcdTcyQjZcdTYwMDFcdTMwMERcdTRFM0FcdTMwMENcdTVERjJcdTc4NkVcdThCQTRcdTkxQ0RcdTU5MERcdTMwMERcdUZGMUFcdTVCQTFcdTY4MzhcdTRFQkFcdTVERjJcdTVDMDZcdTUxNzZcdTRFMEVcdTczQjBcdTY3MDlcdThCQjBcdTVGNTVcdTZCRDRcdTVCRjlcdUZGMENcdTVFNzZcdThCQjBcdTVGNTVcdTRFM0FcdTkxQ0RcdTU5MERcdTMwMDJcdThGNkNcdTUzMTZcdTRGMUFcdTRFM0FcdTU0MENcdTRFMDBcdTRFNzBcdTVCQjZcdTUxOERcdTUyMUJcdTVFRkFcdTRFMDBcdTRFMkFcdTVCQTJcdTYyMzdcdTMwMDFcdTgwNTRcdTdDRkJcdTRFQkFcdTU0OENcdTU1NDZcdTY3M0FcdTMwMDJcdTY3MkNcdTdFQkZcdTdEMjJcdTc2ODRcdTMwMENcdTkxQ0RcdTU5MERcdTdFQkZcdTdEMjJcdTdCQTFcdTc0MDZcdTMwMERcdTkwRThcdTUyMDZcdTUyMTdcdTUxRkFcdTRFODZcdTRGRERcdTc1NTlcdTc2ODRcdThCQjBcdTVGNTVcdUZGMUJcdThCRjdcdTY1MzlcdTRFM0FcdTRFRTVcdTkxQ0RcdTU5MERcdTRFM0FcdTc1MzFcdTVDMDZcdTZCNjRcdTdFQkZcdTdEMjJcdThCQkVcdTRFM0FcdTMwMENcdTY3MkFcdTkwMUFcdThGQzdcdTMwMERcdTMwMDJcdTUzRUFcdTY3MDlcdTVCQTFcdTY4MzhcdTRFQkFcdTRGRUVcdTY1MzlcdThCRTVcdTdFRDNcdThCQkFcdTU0MEVcdTYyNERcdTgwRkRcdTkxQ0RcdTY1QjBcdThGNkNcdTUzMTZcdTMwMDInLFxuICAgICAgICB9LFxuICAgICAgICByZWZ1c2VfdW5hcHByb3ZlZDoge1xuICAgICAgICAgIHRpdGxlOiAnXHU4RjZDXHU1MzE2XHU4OEFCXHU2MkQyXHU3RUREJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdcdThCRTVcdTdFQkZcdTdEMjJcdTVDMUFcdTY3MkFcdTgzQjdcdTUxQzZcdThGNkNcdTUzMTZcdTMwMDJcdTVGQzVcdTk4N0JcdTc1MzFcdTVCQTFcdTYyNzlcdTRFQkFcdTYyNzlcdTUxQzZcdTU0MEVcdUZGMENcdTYyNERcdTgwRkRcdThGNkNcdTUzMTZcdTRFM0FcdTVCQTJcdTYyMzdcdTMwMDFcdTgwNTRcdTdDRkJcdTRFQkFcdTU0OENcdTU1NDZcdTY3M0FcdUZGMUJcdTdFQkZcdTdEMjJcdTRFMEFcdTc2ODRcdTMwMENcdThGNkNcdTUzMTZcdTVCQTFcdTYyNzlcdTMwMERcdTVCNTdcdTZCQjVcdTY2M0VcdTc5M0FcdThCRTVcdTUxQjNcdTVCOUFcdTRFQ0RcdTU3MjhcdTVGODVcdTVCQTFcdTYyNzlcdThGRDhcdTY2MkZcdTVERjJcdTg4QUJcdTlBNzNcdTU2REVcdTMwMDJcdTU3MjhcdTZCNjRcdTY3MUZcdTk1RjRcdThCRjdcdTdFRTdcdTdFRURcdThEREZcdThGREJcdThCRTVcdTdFQkZcdTdEMjJcdTIwMTRcdTIwMTRcdTVCODNcdTc2ODRcdTRFRkJcdTRGNTVcdTUxODVcdTVCQjlcdTkwRkRcdTZDQTFcdTY3MDlcdTg4QUJcdTUxQkJcdTdFRDNcdTMwMDInLFxuICAgICAgICB9LFxuICAgICAgICByZWZ1c2Vfbm9fbWF0Y2hfa2V5OiB7XG4gICAgICAgICAgdGl0bGU6ICdcdThGNkNcdTUzMTZcdTg4QUJcdTYyRDJcdTdFREQnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ1x1OEJFNVx1N0VCRlx1N0QyMlx1NzY4NFx1NTE2Q1x1NTNGOFx1NkNBMVx1NjcwOVx1NTMzOVx1OTE0RFx1OTUyRVx1RkYwQ1x1NTZFMFx1NkI2NFx1OEY2Q1x1NTMxNlx1NjVFMFx1NkNENVx1NTIyNFx1NjVBRFx1NUI4M1x1NUM1RVx1NEU4RVx1NTRFQVx1NEUyQVx1NUJBMlx1NjIzN1x1RkYwQ1x1NEU1Rlx1NEUwRFx1NEYxQVx1NTNCQlx1NzMxQ1x1NkQ0Qlx1RkYxQVx1NzMxQ1x1NkQ0Qlx1NTNFRlx1ODBGRFx1NEYxQVx1NjI4QVx1ODA1NFx1N0NGQlx1NEVCQVx1NTQ4Q1x1NTU0Nlx1NjczQVx1NUY1Mlx1NTIzMFx1NTNFNlx1NEUwMFx1NEUyQVx1NUJBMlx1NjIzN1x1NTQwRFx1NEUwQlx1MzAwMlx1NEZERFx1NUI1OFx1N0VCRlx1N0QyMlx1NzY4NFx1MzAwQ1x1NTE2Q1x1NTNGOFx1MzAwRFx1NEYxQVx1OTFDRFx1NjVCMFx1NzUxRlx1NjIxMFx1NTMzOVx1OTE0RFx1OTUyRVx1RkYwQ1x1OEJGN1x1OTFDRFx1NjVCMFx1NEZERFx1NUI1OFx1NTQwRVx1NTE4RFx1OEY2Q1x1NTMxNlx1MzAwMlx1NUMxQVx1NjcyQVx1NTIxQlx1NUVGQVx1NEVGQlx1NEY1NVx1OEJCMFx1NUY1NVx1MzAwMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgc2NoZWR1bGVfZm9sbG93dXA6IHtcbiAgICAgIGxhYmVsOiAnXHU1Qjg5XHU2MzkyXHU4RERGXHU4RkRCJyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1NUI4OVx1NjM5Mlx1OERERlx1OEZEQicsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU0RTBCXHU0RTAwXHU2QjY1XHU1MDVBXHU0RUMwXHU0RTQ4XHVGRjFGJyB9LFxuICAgICAgICAgICAgZHVlRGF0ZTogeyBsYWJlbDogJ1x1NjIyQVx1NkI2Mlx1NjVFNVx1NjcxRicgfSxcbiAgICAgICAgICAgIGFjdGl2aXR5VHlwZToge1xuICAgICAgICAgICAgICBsYWJlbDogJ1x1NkQzQlx1NTJBOFx1N0M3Qlx1NTc4QicsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHsgY2FsbDogJ1x1NzUzNVx1OEJERCcsIGVtYWlsOiAnXHU5MEFFXHU0RUY2JywgbWVldGluZzogJ1x1NEYxQVx1OEJBRScsIGZvbGxvd191cDogJ1x1OERERlx1OEZEQicsIGRlbW86ICdcdTZGMTRcdTc5M0EnLCBvdGhlcjogJ1x1NTE3Nlx1NEVENicgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmlvcml0eTogeyBsYWJlbDogJ1x1NEYxOFx1NTE0OFx1N0VBNycsIG9wdGlvbnM6IHsgbG93OiAnXHU0RjRFJywgbm9ybWFsOiAnXHU2NjZFXHU5MDFBJywgaGlnaDogJ1x1OUFEOCcsIHVyZ2VudDogJ1x1N0QyN1x1NjAyNScgfSB9LFxuICAgICAgICAgICAgbm90ZXM6IHsgbGFiZWw6ICdcdTU5MDdcdTZDRTgnIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBxdW90ZV9nZW5lcmF0aW9uOiB7XG4gICAgICBsYWJlbDogJ1x1NEVDRVx1NTU0Nlx1NjczQVx1NzUxRlx1NjIxMFx1NjJBNVx1NEVGN1x1NTM1NScsXG4gICAgICByZWZ1c2FsczogeyByZWZ1c2VfaGVsZDogeyBtZXNzYWdlOiAnXHU5NzAwXHU1MTQ4XHU1QjhDXHU2MjEwXHU3QUNCXHU5ODc5XHU1QkExXHU2Mjc5XHVGRjFBXHU4QkY3XHU1MkZFXHU5MDA5XHUzMDBDXHU3NTMzXHU4QkY3XHU3QUNCXHU5ODc5XHU1QkExXHU2Mjc5XHUzMDBEXHUzMDAyXHU1QzFBXHU2NzJBXHU1MjFCXHU1RUZBXHU0RUZCXHU0RjU1XHU1MTg1XHU1QkI5XHUzMDAyJyB9IH0sXG4gICAgICBzY3JlZW5zOiB7XG4gICAgICAgIHNjcmVlbl8xOiB7XG4gICAgICAgICAgdGl0bGU6ICdcdTRFQ0VcdTU1NDZcdTY3M0FcdTc1MUZcdTYyMTBcdTYyQTVcdTRFRjdcdTUzNTUnLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgcXVvdGVOYW1lOiB7IGxhYmVsOiAnXHU2MkE1XHU0RUY3XHU1NDBEXHU3OUYwJyB9LFxuICAgICAgICAgICAgZXhwaXJhdGlvbkRheXM6IHsgbGFiZWw6ICdcdTY3MDlcdTY1NDhcdTY3MUZcdUZGMDhcdTU5MjlcdUZGMDknIH0sXG4gICAgICAgICAgICBkaXNjb3VudDogeyBsYWJlbDogYFx1NjI5OFx1NjI2MyAlIChcdTIyNjQgJHtRVU9URV9ESVNDT1VOVF9DRUlMSU5HfSlgLCBwbGFjZWhvbGRlcjogYDAtJHtRVU9URV9ESVNDT1VOVF9DRUlMSU5HfWAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9fc2hhcmVkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTlwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vX3NoYXJlZC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBcdTdCODBcdTRGNTNcdTRFMkRcdTY1ODcgKHpoLUNOKSBcdTIwMTQgdmFsdWVzIHNoYXJlZCBieSBtb3JlIHRoYW4gb25lIHBhcnQgb2YgdGhpcyBidW5kbGUuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04udHNgLlxuICpcbiAqIEV2ZXJ5IGNvbnN0YW50IGhlcmUgaXMgc3ByZWFkIGludG8gb2JqZWN0IHJvd3MgdGhhdCBsaXZlIGluIE1PUkUgVEhBTiBPTkVcbiAqIGZhbWlseSBmaWxlLCBzbyBpdCBjYW5ub3Qgc2l0IGluIGFueSBvbmUgb2YgdGhlbS4gQSB2YWx1ZSB1c2VkIGJ5IGV4YWN0bHlcbiAqIG9uZSBmYW1pbHkgbGl2ZXMgaW4gdGhhdCBmYW1pbHkncyBmaWxlIGluc3RlYWQgXHUyMDE0IHRoYXQgc3BsaXQgaXMgbWVjaGFuaWNhbCxcbiAqIG5vdCBhIGp1ZGdlbWVudCBjYWxsLlxuICovXG5cbi8qKlxuICogXHU2RDNCXHU1MkE4XHU1MkE4XHU0RjVDXHU2NUNGXHVGRjA4IzU5Mlx1RkYwOVx1RkYxQWBsb2dfY2FsbGAgLyBgbG9nX21lZXRpbmdgIC8gYHNjaGVkdWxlX21lZXRpbmdgIFx1NTcyOFxuICogXHU3RUJGXHU3RDIyXHUzMDAxXHU4MDU0XHU3Q0ZCXHU0RUJBXHUzMDAxXHU1QkEyXHU2MjM3XHUzMDAxXHU1NTQ2XHU2NzNBXHUzMDAxXHU1REU1XHU1MzU1XHU0RTBBXHU1NDA0XHU2Q0U4XHU1MThDXHU0RTAwXHU2QjIxXHVGRjA4XHU2NUUwIGBvYmplY3ROYW1lYCBcdTc2ODRcdTgxMUFcdTY3MkNcdTUyQThcdTRGNUNcdTRGMUFcdTg0M0RcdTUyMzBcbiAqIFx1OEMwM1x1NUVBNlx1NTY2OFx1NEVDRVx1NEUwRFx1NjNBMlx1NkQ0Qlx1NzY4NFx1OTUyRVx1NEUwQVx1MjAxNFx1MjAxNFx1ODlDMSAjNTA5XHVGRjA5XHUzMDAyXHU0RTk0XHU0RTJBXHU1QkY5XHU4QzYxXHU3Njg0XHU2NTg3XHU2ODQ4XHU1QjhDXHU1MTY4XHU3NkY4XHU1NDBDXHVGRjBDXHU1NkUwXHU2QjY0XHU1NzI4XHU2QjY0XHU1OEYwXHU2NjBFXHU0RTAwXHU2QjIxXHU1RTc2XG4gKiBcdTVDNTVcdTVGMDBcdTUyMzBcdTU0MDRcdTVCRjlcdThDNjFcdTc2ODQgYF9hY3Rpb25zYFx1RkYxQVx1NkJDRlx1NEUyQVx1OEJFRFx1OEEwMFx1NjI0Qlx1NjI4NFx1NTM0MVx1NEU5NFx1NEVGRFx1NkI2M1x1NjYyRlx1OEJEMVx1NjU4N1x1OEQ3MFx1NjgzN1x1NzY4NFx1NUYwMFx1N0FFRlx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgYWN0aXZpdHlBY3Rpb25zID0ge1xuICBsb2dfY2FsbDoge1xuICAgIGxhYmVsOiAnXHU4QkIwXHU1RjU1XHU5MDFBXHU4QkREJyxcbiAgICBzdWNjZXNzTWVzc2FnZTogJ1x1OTAxQVx1OEJERFx1OEJCMFx1NUY1NVx1NjIxMFx1NTI5Rlx1RkYwMScsXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU5MDFBXHU4QkREXHU0RTNCXHU5ODk4JyB9LFxuICAgICAgZHVyYXRpb246IHsgbGFiZWw6ICdcdTY1RjZcdTk1N0ZcdUZGMDhcdTUyMDZcdTk0OUZcdUZGMDknIH0sXG4gICAgICBhdHRlbmRlZV9jb250YWN0czogeyBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEVCQVx1NTNDMlx1NEUwRVx1ODAwNScgfSxcbiAgICAgIGF0dGVuZGVlX3VzZXJzOiB7IGxhYmVsOiAnXHU1MTg1XHU5MEU4XHU1M0MyXHU0RTBFXHU4MDA1JyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdcdTkwMUFcdThCRERcdThCQjBcdTVGNTUnIH0sXG4gICAgfSxcbiAgfSxcbiAgbG9nX21lZXRpbmc6IHtcbiAgICBsYWJlbDogJ1x1OEJCMFx1NUY1NVx1NEYxQVx1OEJBRScsXG4gICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTRGMUFcdThCQUVcdThCQjBcdTVGNTVcdTYyMTBcdTUyOUZcdUZGMDEnLFxuICAgIHBhcmFtczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1x1NEYxQVx1OEJBRVx1NEUzQlx1OTg5OCcgfSxcbiAgICAgIGR1cmF0aW9uOiB7IGxhYmVsOiAnXHU2NUY2XHU5NTdGXHVGRjA4XHU1MjA2XHU5NDlGXHVGRjA5JyB9LFxuICAgICAgYXR0ZW5kZWVfY29udGFjdHM6IHsgbGFiZWw6ICdcdTgwNTRcdTdDRkJcdTRFQkFcdTUzQzJcdTRGMUFcdTRFQkEnIH0sXG4gICAgICBhdHRlbmRlZV91c2VyczogeyBsYWJlbDogJ1x1NTE4NVx1OTBFOFx1NTNDMlx1NEYxQVx1NEVCQScgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHU0RjFBXHU4QkFFXHU3RUFBXHU4OTgxJyB9LFxuICAgIH0sXG4gIH0sXG4gIHNjaGVkdWxlX21lZXRpbmc6IHtcbiAgICBsYWJlbDogJ1x1NUI4OVx1NjM5Mlx1NEYxQVx1OEJBRScsXG4gICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTRGMUFcdThCQUVcdTVERjJcdTVCODlcdTYzOTJcdUZGMDEnLFxuICAgIHBhcmFtczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1x1NEYxQVx1OEJBRVx1NEUzQlx1OTg5OCcgfSxcbiAgICAgIHN0YXJ0X2RhdGU6IHsgbGFiZWw6ICdcdTVGMDBcdTU5Q0JcdTY1RTVcdTY3MUZcdUZGMDhVVENcdUZGMDknIH0sXG4gICAgICBzdGFydF90aW1lOiB7IGxhYmVsOiAnXHU1RjAwXHU1OUNCXHU2NUY2XHU5NUY0XHVGRjA4VVRDXHVGRjA5JyB9LFxuICAgICAgbG9jYXRpb246IHsgbGFiZWw6ICdcdTU3MzBcdTcwQjknIH0sXG4gICAgICBkdXJhdGlvbjogeyBsYWJlbDogJ1x1NjVGNlx1OTU3Rlx1RkYwOFx1NTIwNlx1OTQ5Rlx1RkYwOScgfSxcbiAgICAgIGF0dGVuZGVlX2NvbnRhY3RzOiB7IGxhYmVsOiAnXHU4MDU0XHU3Q0ZCXHU0RUJBXHU1M0MyXHU0RjFBXHU0RUJBJyB9LFxuICAgICAgYXR0ZW5kZWVfdXNlcnM6IHsgbGFiZWw6ICdcdTUxODVcdTkwRThcdTUzQzJcdTRGMUFcdTRFQkEnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ1x1NEYxQVx1OEJBRVx1OEJBRVx1N0EwQicgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9vYmplY3RzLmN1c3RvbWVyLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTlwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vb2JqZWN0cy5jdXN0b21lci50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG5pbXBvcnQgeyBhY3Rpdml0eUFjdGlvbnMgfSBmcm9tICcuL19zaGFyZWQnO1xuXG4vKipcbiAqIFx1N0I4MFx1NEY1M1x1NEUyRFx1NjU4NyAoemgtQ04pIFx1MjAxNCBgb2JqZWN0c2AgdHJhbnNsYXRpb25zIGZvciB0aGUgQ1VTVE9NRVIgZmFtaWx5OlxuICogdGhlIGN1c3RvbWVyIHJlY29yZCBpdHNlbGYgXHUyMDE0IGFjY291bnRzIGFuZCB0aGUgcGVvcGxlIGF0IHRoZW0uXG4gKlxuICogUm9zdGVyOiBgY3JtX2FjY291bnRgLCBgY3JtX2NvbnRhY3RgLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICogRXZlcnl0aGluZyB0aGF0IGlzIG5vdCBgb2JqZWN0c2AgbGl2ZXMgaW4gYC4vYXBwLnRzYDsgYG9iamVjdHNgIFx1MjAxNCA2OS03OCUgb2ZcbiAqIGV2ZXJ5IGJ1bmRsZSBcdTIwMTQgaXMgb25lIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5LCBhbmQgYSBkZXRhaWwgb2JqZWN0XG4gKiBmb2xsb3dzIGl0cyBtYXN0ZXIuIEEgbmV3IHJvdyBnb2VzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LCBuZXZlciBpblxuICogd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuOiB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0IHRoZSA3MCVcbiAqIGFkdmlzb3J5IGJhbmQgYHBucG0gaHlnaWVuZWAgcHJpbnRzLiBGdWxsIHJ1bGUgYW5kIHJhdGlvbmFsZTpcbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOLnRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGN1c3RvbWVyOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fYWNjb3VudDoge1xuICAgIGxhYmVsOiAnXHU1QkEyXHU2MjM3JyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1NUJBMlx1NjIzNycsXG4gICAgZGVzY3JpcHRpb246ICdcdTRFMEVcdTYyMTFcdTRFRUNcdTY3MDlcdTRFMUFcdTUyQTFcdTVGODBcdTY3NjVcdTc2ODRcdTUxNkNcdTUzRjhcdTU0OENcdTdFQzRcdTdFQzcnLFxuICAgIGZpZWxkczoge1xuICAgICAgYWNjb3VudF9udW1iZXI6IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTdGMTZcdTUzRjcnIH0sXG4gICAgICByZWdpc3RyYXRpb25fbnVtYmVyOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3NjdCXHU4QkIwXHU4QkMxXHU0RUY2XHU1M0Y3JyxcbiAgICAgICAgaGVscDogJ1x1NUJGOVx1NjVCOVx1NTcyOFx1NTE3Nlx1NjI0MFx1NUM1RVx1NjUzRlx1NUU5Q1x1NzY3Qlx1OEJCMFx1NjczQVx1NTE3M1x1NTNENlx1NUY5N1x1NzY4NFx1NzY3Qlx1OEJCMFx1NjgwN1x1OEJDNlx1MzAwMlx1NEUwRFx1NTQwQ1x1NEU4RVx1NzUzMVx1NjIxMVx1NjVCOVx1NTNEMVx1NjUzRVx1NzY4NFx1NUJBMlx1NjIzN1x1N0YxNlx1NTNGN1x1MzAwMicsXG4gICAgICB9LFxuICAgICAgY29tbWVyY2lhbF9jYXBhYmlsaXR5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU1NTQ2XHU1MkExXHU4MEZEXHU1MjlCJyxcbiAgICAgICAgaGVscDogJ1x1OEJFNVx1NUJBMlx1NjIzN1x1NjYyRlx1NTQyNlx1NTNFRlx1NEVFNVx1NjI3Rlx1NjNBNVx1NjVCMFx1NEUxQVx1NTJBMVx1MzAwMlx1NEVDNVx1N0VEM1x1N0I5N1x1N0M3Qlx1NUJBMlx1NjIzN1x1NEY5RFx1NzEzNlx1NTNFRlx1NzUyOFx1NEU4RVx1NUYwMFx1Nzk2OFx1NEUwRVx1NjUzNlx1NEVEOFx1NkIzRVx1RkYwQ1x1NEY0Nlx1NEUwRFx1ODBGRFx1NTE3M1x1ODA1NFx1NjVCMFx1NzY4NFx1NTU0Nlx1NjczQVx1MzAwMicsXG4gICAgICAgIG9wdGlvbnM6IHsgZnVsbDogJ1x1NUI4Q1x1NjU3NCcsIHNldHRsZW1lbnRfb25seTogJ1x1NEVDNVx1N0VEM1x1N0I5NycgfSxcbiAgICAgIH0sXG4gICAgICBpbmN1bWJlbnRfdmVuZG9yOiB7IGxhYmVsOiAnXHU3M0IwXHU2NzA5XHU0RjlCXHU1RTk0XHU1NTQ2JywgaGVscDogJ1x1NUY1M1x1NTI0RFx1NjI3Rlx1NjNBNVx1OEJFNVx1NUJBMlx1NjIzN1x1OEZEOVx1OTBFOFx1NTIwNlx1NjUyRlx1NTFGQVx1NzY4NFx1NEY5Qlx1NUU5NFx1NTU0Nlx1MzAwMicgfSxcbiAgICAgIGFubnVhbF9wdXJjaGFzaW5nX2J1ZGdldDogeyBsYWJlbDogJ1x1NUU3NFx1NUVBNlx1OTFDN1x1OEQyRFx1OTg4NFx1N0I5NycsIGhlbHA6ICdcdThCRTVcdTVCQTJcdTYyMzdcdTY3MkNcdTVFNzRcdTVFQTZcdTk4ODRcdThCQTFcdTU0MTFcdTRGOUJcdTVFOTRcdTU1NDZcdTY1MkZcdTUxRkFcdTc2ODRcdTkxRDFcdTk4OURcdUZGMENcdTgwMENcdTk3NUVcdTUxNzZcdTgxRUFcdThFQUJcdTg0MjVcdTY1MzZcdTMwMDInIH0sXG4gICAgICBwYXltZW50X2N5Y2xlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RUQ4XHU2QjNFXHU1NDY4XHU2NzFGJyxcbiAgICAgICAgb3B0aW9uczogeyBwcmVwYWlkOiAnXHU5ODg0XHU0RUQ4JywgbmV0XzMwOiAnMzAgXHU1OTI5JywgbmV0XzYwOiAnNjAgXHU1OTI5JywgbmV0XzkwOiAnOTAgXHU1OTI5JyB9LFxuICAgICAgfSxcbiAgICAgIGFwcHJvdmFsX3N0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1NUJBMVx1NjI3OVx1NzJCNlx1NjAwMScsXG4gICAgICAgIGhlbHA6ICdcdThCRTVcdTVCQTJcdTYyMzdcdTc2ODRcdTVCQTFcdTYyNzlcdThGREJcdTVDNTVcdTMwMDJcdTY1QjBcdTVFRkFcdTVCQTJcdTYyMzdcdTUyMURcdTU5Q0JcdTRFM0FcdTVGODVcdTVCQTFcdTYyNzlcdUZGMENcdTVFNzZcdTU3MjhcdTVCQTFcdTYyNzlcdTY1MzZcdTRFRjZcdTdCQjFcdTRFMkRcdTg4QzFcdTVCOUFcdTMwMDInLFxuICAgICAgICBvcHRpb25zOiB7IHBlbmRpbmc6ICdcdTVGODVcdTVCQTFcdTYyNzknLCBhcHByb3ZlZDogJ1x1NURGMlx1OTAxQVx1OEZDNycsIHJlamVjdGVkOiAnXHU1REYyXHU5QTczXHU1NkRFJyB9LFxuICAgICAgfSxcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTU0MERcdTc5RjAnLCBoZWxwOiAnXHU1MTZDXHU1M0Y4XHU2MjE2XHU3RUM0XHU3RUM3XHU3Njg0XHU2Q0Q1XHU1QjlBXHU1NDBEXHU3OUYwJyB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ1x1N0M3Qlx1NTc4QicsXG4gICAgICAgIG9wdGlvbnM6IHsgcHJvc3BlY3Q6ICdcdTZGNUNcdTU3MjhcdTVCQTJcdTYyMzcnLCBjdXN0b21lcjogJ1x1NkI2M1x1NUYwRlx1NUJBMlx1NjIzNycsIHBhcnRuZXI6ICdcdTU0MDhcdTRGNUNcdTRGMTlcdTRGMzQnLCBmb3JtZXI6ICdcdTUyNERcdTVCQTJcdTYyMzcnIH0sXG4gICAgICB9LFxuICAgICAgaW5kdXN0cnk6IHtcbiAgICAgICAgbGFiZWw6ICdcdTg4NENcdTRFMUEnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgdGVjaG5vbG9neTogJ1x1NzlEMVx1NjI4MCcsIHNvZnR3YXJlOiAnXHU4RjZGXHU0RUY2IC8gU2FhUycsIGZpbmFuY2U6ICdcdTkxRDFcdTg3OEQnLFxuICAgICAgICAgIGhlYWx0aGNhcmU6ICdcdTUzM0JcdTc1OTcnLCByZXRhaWw6ICdcdTk2RjZcdTU1MkUnLCBtYW51ZmFjdHVyaW5nOiAnXHU1MjM2XHU5MDIwJyxcbiAgICAgICAgICBlZHVjYXRpb246ICdcdTY1NTlcdTgwQjInLCByZWFsX2VzdGF0ZTogJ1x1NjIzRlx1NTczMFx1NEVBNycsIG1lZGlhOiAnXHU0RjIwXHU1QTkyXHU1QTMxXHU0RTUwJyxcbiAgICAgICAgICBsb2dpc3RpY3M6ICdcdTcyNjlcdTZENDEnLCBob3NwaXRhbGl0eTogJ1x1OTE1Mlx1NUU5N1x1NjVDNVx1NkUzOCcsIGVuZXJneTogJ1x1ODBGRFx1NkU5MFx1NTE2Q1x1NzUyOFx1NEU4Qlx1NEUxQScsXG4gICAgICAgICAgZ292ZXJubWVudDogJ1x1NjUzRlx1NUU5QycsIG5vbnByb2ZpdDogJ1x1OTc1RVx1ODQyNVx1NTIyOScsIG90aGVyOiAnXHU1MTc2XHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhbm51YWxfcmV2ZW51ZTogeyBsYWJlbDogJ1x1NUU3NFx1ODQyNVx1NjUzNicgfSxcbiAgICAgIGNoaWxkX2FjY291bnRfcmV2ZW51ZTogeyBsYWJlbDogJ1x1NUI1MFx1NTE2Q1x1NTNGOFx1NUU3NFx1ODQyNVx1NjUzNlx1NTQwOFx1OEJBMScsIGhlbHA6ICdcdTY3MkNcdTVCQTJcdTYyMzdcdTc2RjRcdTVDNUVcdTVCNTBcdTUxNkNcdTUzRjhcdTc2ODRcdTVFNzRcdTg0MjVcdTY1MzZcdTU0MDhcdThCQTFcdTMwMDInIH0sXG4gICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiB7IGxhYmVsOiAnXHU1NDU4XHU1REU1XHU0RUJBXHU2NTcwJyB9LFxuICAgICAgcGhvbmU6IHsgbGFiZWw6ICdcdTc1MzVcdThCREQnIH0sXG4gICAgICB3ZWJzaXRlOiB7IGxhYmVsOiAnXHU3RjUxXHU3QUQ5JyB9LFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnXHU4RDI2XHU1MzU1XHU1NzMwXHU1NzQwJyB9LFxuICAgICAgYmlsbGluZ19jb3VudHJ5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU4RDI2XHU1MzU1XHU1NkZEXHU1QkI2JyxcbiAgICAgICAgaGVscDogJ1x1NzUzMVx1OEQyNlx1NTM1NVx1NTczMFx1NTc0MFx1NjNBOFx1NUJGQ1x1MjAxNFx1MjAxNFx1NjMwOVx1NUY1NVx1NTE2NVx1NTM5Rlx1NjgzN1x1NTNCQlx1OTY2NFx1OTk5Nlx1NUMzRVx1N0E3QVx1NjgzQ1x1NUU3Nlx1OEY2Q1x1NEUzQVx1NTkyN1x1NTE5OVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgdGVycml0b3J5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU1MzNBXHU1N0RGJyxcbiAgICAgICAgaGVscDogJ1x1NzUzMVx1OEQyNlx1NTM1NVx1NTczMFx1NTc0MFx1NjNBOFx1NUJGQ1x1MjAxNFx1MjAxNFx1NTMzQVx1NTdERlx1NTE3MVx1NEVBQlx1ODlDNFx1NTIxOVx1NjM2RVx1NkI2NFx1NTMzOVx1OTE0RFx1MzAwMlx1NEUwRFx1NUM1RVx1NEU4RVx1NURGMlx1OTE0RFx1N0Y2RVx1NTMzQVx1NTdERlx1NzY4NFx1NUJBMlx1NjIzN1x1NEUzQVx1MjAxQ1x1NTE3Nlx1NEVENlx1MjAxRFx1MzAwMicsXG4gICAgICAgIG9wdGlvbnM6IHsgbmE6ICdcdTUzMTdcdTdGOEUnLCBlbWVhOiAnXHU2QjI3XHU2RDMyXHUzMDAxXHU0RTJEXHU0RTFDXHU0RTBFXHU5NzVFXHU2RDMyJywgb3RoZXI6ICdcdTUxNzZcdTRFRDYnIH0sXG4gICAgICB9LFxuICAgICAgb2ZmaWNlX2xvY2F0aW9uOiB7IGxhYmVsOiAnXHU1MjlFXHU1MTZDXHU1NzMwXHU3MEI5JyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdThEMUZcdThEMjNcdTRFQkEnIH0sXG4gICAgICBwYXJlbnRfYWNjb3VudDogeyBsYWJlbDogJ1x1NkJDRFx1NTE2Q1x1NTNGOCcsIGhlbHA6ICdcdTVDNDJcdTdFQTdcdTdFRDNcdTY3ODRcdTRFMkRcdTc2ODRcdTZCQ0RcdTUxNkNcdTUzRjgnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ1x1NjNDRlx1OEZGMCcgfSxcbiAgICAgIGlzX2FjdGl2ZTogeyBsYWJlbDogJ1x1NjYyRlx1NTQyNlx1NkQzQlx1OERDMycgfSxcbiAgICAgIGxhc3RfYWN0aXZpdHlfZGF0ZTogeyBsYWJlbDogJ1x1NjcwMFx1OEZEMVx1NkQzQlx1NTJBOFx1NjVFNVx1NjcxRicgfSxcbiAgICAgIGJyYW5kX2NvbG9yOiB7IGxhYmVsOiAnXHU1NEMxXHU3MjRDXHU4MjcyJyB9LFxuICAgICAgbG9nbzogeyBsYWJlbDogJ1x1NTE2Q1x1NTNGOFx1NjgwN1x1OEJDNicgfSxcbiAgICAgIHRpZXI6IHtcbiAgICAgICAgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTUyMDZcdTVDNDInLFxuICAgICAgICBvcHRpb25zOiB7IHN0cmF0ZWdpYzogJ1x1NjIxOFx1NzU2NVx1NUJBMlx1NjIzNycsIGVudGVycHJpc2U6ICdcdTRGMDFcdTRFMUFcdTVCQTJcdTYyMzcnLCBtaWRfbWFya2V0OiAnXHU0RTJEXHU1NzhCXHU1QkEyXHU2MjM3Jywgc21iOiAnXHU0RTJEXHU1QzBGXHU1QkEyXHU2MjM3JyB9LFxuICAgICAgfSxcbiAgICAgIHNlZ21lbnQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTdFQzZcdTUyMDYnLFxuICAgICAgICBvcHRpb25zOiB7IG5ldF9uZXc6ICdcdTUxNjhcdTY1QjBcdTVCQTJcdTYyMzcnLCBncm93dGg6ICdcdTU4OUVcdTk1N0ZcdTVCQTJcdTYyMzcnLCBhdF9yaXNrOiAnXHU5OENFXHU5NjY5XHU1QkEyXHU2MjM3Jywgc3RhYmxlOiAnXHU3QTMzXHU1QjlBXHU1QkEyXHU2MjM3JyB9LFxuICAgICAgfSxcbiAgICAgIGhlYWx0aF9zY29yZToge1xuICAgICAgICBsYWJlbDogJ1x1NTA2NVx1NUVCN1x1NUVBNicsXG4gICAgICAgIGhlbHA6ICdcdTVCQTJcdTYyMzdcdTYyMTBcdTUyOUZcdTdFQ0ZcdTc0MDZcdTdFRjRcdTYyQTRcdTc2ODRcdTUwNjVcdTVFQjdcdTVFQTZcdTYzMDdcdTY4MDcnLFxuICAgICAgICBvcHRpb25zOiB7IGhlYWx0aHk6ICdcdTUwNjVcdTVFQjcnLCB3YXRjaGluZzogJ1x1NTE3M1x1NkNFOCcsIGF0X3Jpc2s6ICdcdTk4Q0VcdTk2NjknLCBjaHVybmluZzogJ1x1NkQ0MVx1NTkzMVx1NEUyRCcgfSxcbiAgICAgIH0sXG4gICAgICBuYW1lX25vcm1hbGl6ZWQ6IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTU0MERcdTc5RjBcdUZGMDhcdTg5QzRcdTgzMDNcdTUzMTZcdUZGMDknLCBoZWxwOiAnXHU3RUJGXHU3RDIyXHU4RjZDXHU1MzE2XHU3Njg0XHU1MzM5XHU5MTREXHU5NTJFXHVGRjFBXHU1QkEyXHU2MjM3XHU1NDBEXHU3OUYwXHU4RjZDXHU1QzBGXHU1MTk5XHUzMDAxXHU1M0JCXHU5NjY0XHU5OTk2XHU1QzNFXHU3QTdBXHU2ODNDXHUzMDAxXHU1MTg1XHU5MEU4XHU4RkRFXHU3RUVEXHU3QTdBXHU3NjdEXHU1NDA4XHU1RTc2XHU0RTNBXHU0RTAwXHU0RTJBXHU3QTdBXHU2ODNDXHUzMDAyXHU3NTMxIGFjY291bnRfcHJvdGVjdGlvbiBcdTk0QTlcdTVCNTBcdTdFRjRcdTYyQTRcdTIwMTRcdTIwMTRcdThCRjdcdTUyRkZcdTc2RjRcdTYzQTVcdTdGMTZcdThGOTFcdTMwMDInIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnXHU2NjNFXHU3OTNBXHU1NDBEXHU3OUYwJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfYWNjb3VudHM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTUxNjhcdTkwRThcdTVCQTJcdTYyMzcnLCBkZXNjcmlwdGlvbjogJ1x1NUJBMlx1NjIzN1x1NEUzQlx1NTIxN1x1ODg2OFx1RkYwQ1x1NTMwNVx1NTQyQlx1ODQyNVx1NjUzNlx1NEUwRVx1ODg0Q1x1NEUxQVx1NjQ1OFx1ODk4MScsXG4gICAgICAgIGJ1bGtBY3Rpb25zOiB7XG4gICAgICAgICAgZGVsZXRlOiB7XG4gICAgICAgICAgICBsYWJlbDogJ1x1NTIyMFx1OTY2NCcsXG4gICAgICAgICAgICBjb25maXJtTGFiZWw6ICdcdTUyMjBcdTk2NjQnLFxuICAgICAgICAgICAgY29uZmlybVRleHQ6ICdcdTc4NkVcdTVCOUFcdTg5ODFcdTZDMzhcdTRFNDVcdTUyMjBcdTk2NjQge3tjb3VudH19IFx1NEUyQVx1NUJBMlx1NjIzN1x1NTQxN1x1RkYxRlx1NkI2NFx1NjRDRFx1NEY1Q1x1NjVFMFx1NkNENVx1NjRBNFx1OTUwMFx1MzAwMicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cmFuc2Zlcl9vd25lcjoge1xuICAgICAgICAgICAgbGFiZWw6ICdcdThGNkNcdTc5RkJcdThEMUZcdThEMjNcdTRFQkEnLFxuICAgICAgICAgICAgY29uZmlybVRleHQ6ICdcdTc4NkVcdTVCOUFcdTg5ODFcdThGNkNcdTc5RkIge3tjb3VudH19IFx1NEUyQVx1NUJBMlx1NjIzN1x1NzY4NFx1OEQxRlx1OEQyM1x1NEVCQVx1NTQxN1x1RkYxRicsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgb3duZXJfaWQ6IHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1x1NjVCMFx1OEQxRlx1OEQyM1x1NEVCQScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBkYXRlX3RpZXI6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnXHU2NkY0XHU2NUIwXHU1QkEyXHU2MjM3XHU3QjQ5XHU3RUE3JyxcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiAnXHU3ODZFXHU1QjlBXHU4OTgxXHU1QzA2IHt7Y291bnR9fSBcdTRFMkFcdTVCQTJcdTYyMzdcdTc2ODRcdTdCNDlcdTdFQTdcdTY2RjRcdTY1QjBcdTRFM0Ege3t0aWVyfX0gXHU1NDE3XHVGRjFGJyxcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICB0aWVyOiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTdCNDlcdTdFQTcnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFjY291bnRfZ2FsbGVyeTogeyBsYWJlbDogJ1x1NUJBMlx1NjIzN1x1NTM2MVx1NzI0NycsIGRlc2NyaXB0aW9uOiAnXHU0RjdGXHU3NTI4XHU1NEMxXHU3MjRDXHU4MjcyXHU5QUQ4XHU0RUFFXHU3Njg0XHU1QkEyXHU2MjM3XHU1MzYxXHU3MjQ3XHU4OUM2XHU1NkZFJyB9LFxuICAgICAgYWNjb3VudF9tYXA6IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTU3MzBcdTU2RkUnLCBkZXNjcmlwdGlvbjogJ1x1NUJBMlx1NjIzN1x1NzY4NFx1NTczMFx1NzQwNlx1NTIwNlx1NUUwMycgfSxcbiAgICAgIGVudGVycHJpc2VfYWNjb3VudHM6IHsgbGFiZWw6ICdcdTRGMDFcdTRFMUFcdTVCQTJcdTYyMzcnLCBkZXNjcmlwdGlvbjogJ1x1NUU3NFx1ODQyNVx1NjUzNlx1NjcwMFx1OUFEOFx1NzY4NFx1NTkyN1x1NUJBMlx1NjIzNycgfSxcbiAgICAgIG15X2FjY291bnRzOiB7IGxhYmVsOiAnXHU2MjExXHU3Njg0XHU1QkEyXHU2MjM3JywgZGVzY3JpcHRpb246ICdcdTc1MzFcdTVGNTNcdTUyNERcdTc1MjhcdTYyMzdcdThEMUZcdThEMjNcdTc2ODRcdTVCQTJcdTYyMzcnIH0sXG4gICAgICBhdF9yaXNrX2FjY291bnRzOiB7IGxhYmVsOiAnXHUyNkEwXHVGRTBGIFx1OThDRVx1OTY2OVx1NUJBMlx1NjIzNycgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTU3RkFcdTY3MkNcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBmaW5hbmNpYWxzOiB7IGxhYmVsOiAnXHU4RDIyXHU1MkExXHU0RkUxXHU2MDZGJyB9LFxuICAgICAgYnVzaW5lc3NfcHJvZmlsZTogeyBsYWJlbDogJ1x1NEUxQVx1NTJBMVx1NEZFMVx1NjA2RicgfSxcbiAgICAgIGNvbnRhY3RfaW5mbzogeyBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEZFMVx1NjA2RicgfSxcbiAgICAgIG93bmVyc2hpcDogeyBsYWJlbDogJ1x1NUY1Mlx1NUM1RVx1NEUwRVx1NzJCNlx1NjAwMScgfSxcbiAgICAgIGJyYW5kaW5nOiB7IGxhYmVsOiAnXHU1NEMxXHU3MjRDJyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnXHU3Q0ZCXHU3RURGJyB9LFxuICAgICAgLy8gYWNjb3VudC52aWV3LnRzIFx1ODg2OFx1NTM1NVx1NTMzQVx1NTc1N1x1NTQwRFx1NzlGMCAoIzExMDApXG4gICAgICBwcm9maWxlOiB7IGxhYmVsOiAnXHU4RDQ0XHU2NTk5JyB9LFxuICAgICAgY3VzdG9tZXJfc3VjY2VzczogeyBsYWJlbDogJ1x1NUJBMlx1NjIzN1x1NjIxMFx1NTI5RicgfSxcbiAgICAgIGxvY2F0aW9uczogeyBsYWJlbDogJ1x1NTczMFx1NTc0MFx1NEZFMVx1NjA2RicgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU2M0NGXHU4RkYwJyB9LFxuICAgIH0sXG4gICAgX2FjdGlvbnM6IHsgLi4uYWN0aXZpdHlBY3Rpb25zIH0sXG4gIH0sXG4gIGNybV9jb250YWN0OiB7XG4gICAgbGFiZWw6ICdcdTgwNTRcdTdDRkJcdTRFQkEnLFxuICAgIHBsdXJhbExhYmVsOiAnXHU4MDU0XHU3Q0ZCXHU0RUJBJyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1NUJBMlx1NjIzN1x1NEUwRVx1NTU0Nlx1NjczQVx1NzY4NFx1NTE3M1x1OTUyRVx1NEVCQVx1NzI2OVx1ODA1NFx1N0NGQlx1NEVCQScsXG4gICAgZmllbGRzOiB7XG4gICAgICBzYWx1dGF0aW9uOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3OUYwXHU4QzEzJyxcbiAgICAgICAgb3B0aW9uczogeyBtcjogJ1x1NTE0OFx1NzUxRicsIG1zOiAnXHU1OTczXHU1OEVCJywgbXJzOiAnXHU1OTJCXHU0RUJBJywgZHI6ICdcdTUzNUFcdTU4RUInLCBwcm9mOiAnXHU2NTU5XHU2Mzg4JyB9LFxuICAgICAgfSxcbiAgICAgIGZpcnN0X25hbWU6IHsgbGFiZWw6ICdcdTU0MEQnIH0sXG4gICAgICBsYXN0X25hbWU6IHsgbGFiZWw6ICdcdTU5RDMnIH0sXG4gICAgICBmdWxsX25hbWU6IHsgbGFiZWw6ICdcdTUxNjhcdTU0MEQnIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ1x1NjI0MFx1NUM1RVx1NUJBMlx1NjIzNycgfSxcbiAgICAgIGVtYWlsOiB7IGxhYmVsOiAnXHU5MEFFXHU3QkIxJyB9LFxuICAgICAgcGhvbmU6IHsgbGFiZWw6ICdcdTc1MzVcdThCREQnIH0sXG4gICAgICBtb2JpbGU6IHsgbGFiZWw6ICdcdTYyNEJcdTY3M0EnIH0sXG4gICAgICB0aXRsZTogeyBsYWJlbDogJ1x1ODA0Q1x1NEY0RCcgfSxcbiAgICAgIGRlcGFydG1lbnQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTkwRThcdTk1RTgnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZXhlY3V0aXZlOiAnXHU3QkExXHU3NDA2XHU1QzQyJywgc2FsZXM6ICdcdTk1MDBcdTU1MkVcdTkwRTgnLCBtYXJrZXRpbmc6ICdcdTVFMDJcdTU3M0FcdTkwRTgnLFxuICAgICAgICAgIGVuZ2luZWVyaW5nOiAnXHU1REU1XHU3QTBCXHU5MEU4Jywgc3VwcG9ydDogJ1x1NjUyRlx1NjMwMVx1OTBFOCcsIGZpbmFuY2U6ICdcdThEMjJcdTUyQTFcdTkwRTgnLFxuICAgICAgICAgIGhyOiAnXHU0RUJBXHU1MjlCXHU4RDQ0XHU2RTkwJywgb3BlcmF0aW9uczogJ1x1OEZEMFx1ODQyNVx1OTBFOCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLy8gXHU5MUM3XHU4RDJEXHU1MUIzXHU3QjU2XHU1NzA4IChSRVEtMDAwNClcdTMwMDJcdTgyRjFcdTY1ODdcdTY4MDdcdTdCN0VcdTY2MkYgJ0J1eWluZyBGdW5jdGlvbicgXHU4MDBDXHU5NzVFICdCdXlpbmcgUm9sZSdcdUZGMUFcbiAgICAgIC8vIFx1NUU3M1x1NTNGMFx1NzY4NCBzZWN1cml0eS1yb2xlLXdvcmQgXHU4OUM0XHU1MjE5XHU1NzI4XHU1QkY5XHU4QzYxXHU1OEYwXHU2NjBFXHU0RTBBXHU0RkREXHU3NTU5XHU0RTg2XHU4MkYxXHU2NTg3IHJvbGUgXHU0RTAwXHU4QkNEXHVGRjA4QURSLTAwOTAgRDNcdUZGMDlcdTMwMDJcbiAgICAgIC8vIFx1OEJFNVx1ODlDNFx1NTIxOVx1NTNFQVx1NTMzOVx1OTE0RFx1ODJGMVx1NjU4N1x1RkYwQ1x1NEUwRFx1OEJGQlx1OEJFRFx1OEEwMFx1NTMwNVx1RkYwQ1x1NjI0MFx1NEVFNVx1NEUyRFx1NjU4N1x1OEZEOVx1OTFDQ1x1NzUyOFx1NjcyQ1x1NTczMFx1OEJGQlx1ODAwNVx1NzcxRlx1NkI2M1x1NTcyOFx1OEJGNFx1NzY4NFx1OEJDRFx1MzAwMlxuICAgICAgYnV5aW5nX2Z1bmN0aW9uOiB7XG4gICAgICAgIGxhYmVsOiAnXHU5MUM3XHU4RDJEXHU4OUQyXHU4MjcyJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGRlY2lzaW9uX21ha2VyOiAnXHU1MUIzXHU3QjU2XHU4MDA1JywgZWNvbm9taWNfYnV5ZXI6ICdcdTk4ODRcdTdCOTdcdTUxQjNcdTdCNTZcdTRFQkEnLFxuICAgICAgICAgIHRlY2huaWNhbF9ldmFsdWF0b3I6ICdcdTYyODBcdTY3MkZcdThCQzRcdTRGMzBcdTRFQkEnLCB1c2VyOiAnXHU0RjdGXHU3NTI4XHU4MDA1JyxcbiAgICAgICAgICBpbmZsdWVuY2VyOiAnXHU1RjcxXHU1NENEXHU4MDA1JywgZ2F0ZWtlZXBlcjogJ1x1NUI4OFx1OTVFOFx1NEVCQScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXR0aXR1ZGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTVCRjlcdTYyMTFcdTUzRjhcdTYwMDFcdTVFQTYnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY2hhbXBpb246ICdcdTYyRTVcdTYyQTRcdTgwMDUnLCBzdXBwb3J0aXZlOiAnXHU2NTJGXHU2MzAxJywgbmV1dHJhbDogJ1x1NEUyRFx1N0FDQicsXG4gICAgICAgICAgc2tlcHRpY2FsOiAnXHU1QjU4XHU3NTkxJywgYmxvY2tlcjogJ1x1NTNDRFx1NUJGOVx1ODAwNScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmVsYXRpb25zaGlwX3N0cmVuZ3RoOiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RTBFXHU5NTAwXHU1NTJFXHU1MTczXHU3Q0ZCXHU1RjNBXHU1RUE2JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGRpc3RhbnQ6ICdcdTc1OEZcdThGREMnLCBhY3F1YWludGFuY2U6ICdcdTRFMDBcdTgyMkNcdThCQTRcdThCQzYnLCB3b3JraW5nOiAnXHU1REU1XHU0RjVDXHU1RjgwXHU2NzY1JyxcbiAgICAgICAgICBzdHJvbmc6ICdcdTUxNzNcdTdDRkJcdTdEMjdcdTVCQzYnLCB0cnVzdGVkX2Fkdmlzb3I6ICdcdTUzRUZcdTRGRTFcdTk4N0VcdTk1RUUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnXHU4MDU0XHU3Q0ZCXHU0RUJBXHU4RDFGXHU4RDIzXHU0RUJBJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdTYzQ0ZcdThGRjAnIH0sXG4gICAgICBpc19wcmltYXJ5OiB7IGxhYmVsOiAnXHU0RTNCXHU4OTgxXHU4MDU0XHU3Q0ZCXHU0RUJBJywgaGVscDogJ1x1NjYyRlx1NTQyNlx1NEUzQVx1OEJFNVx1NUJBMlx1NjIzN1x1NzY4NFx1NEUzQlx1ODk4MVx1ODA1NFx1N0NGQlx1NEVCQVx1RkYxRicgfSxcbiAgICAgIG1haWxpbmdfYWRkcmVzczogeyBsYWJlbDogJ1x1OTBBRVx1NUJDNFx1NTczMFx1NTc0MCcgfSxcbiAgICAgIGxlYWRfc291cmNlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3RUJGXHU3RDIyXHU2NzY1XHU2RTkwJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHdlYjogJ1x1N0Y1MVx1N0FEOScsIHJlZmVycmFsOiAnXHU2M0E4XHU4MzUwJywgZXZlbnQ6ICdcdTZEM0JcdTUyQTggLyBcdTVDNTVcdTRGMUEnLFxuICAgICAgICAgIHdlYmluYXI6ICdcdTdFQkZcdTRFMEFcdTc4MTRcdThCQThcdTRGMUEnLCBwYXJ0bmVyOiAnXHU1NDA4XHU0RjVDXHU0RjE5XHU0RjM0JywgYWR2ZXJ0aXNlbWVudDogJ1x1NUU3Rlx1NTQ0QScsXG4gICAgICAgICAgcGFpZF9zZWFyY2g6ICdcdTRFRDhcdThEMzlcdTY0MUNcdTdEMjInLCBzb2NpYWw6ICdcdTc5M0VcdTRFQTRcdTVBOTJcdTRGNTMnLCBjb250ZW50OiAnXHU1MTg1XHU1QkI5IC8gXHU1MzVBXHU1QkEyJyxcbiAgICAgICAgICBjb2xkX2NhbGw6ICdcdTk2NENcdTc1MUZcdTYyRENcdThCQkYnLCBlbWFpbF9jYW1wYWlnbjogJ1x1OTBBRVx1NEVGNlx1ODQyNVx1OTUwMCcsIG90aGVyOiAnXHU1MTc2XHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBkb19ub3RfY2FsbDogeyBsYWJlbDogJ1x1Nzk4MVx1NkI2Mlx1ODFGNFx1NzUzNScgfSxcbiAgICAgIGVtYWlsX29wdF9vdXQ6IHsgbGFiZWw6ICdcdTYyRDJcdTdFRERcdTkwQUVcdTRFRjYnIH0sXG4gICAgICBsYXN0X2NvbnRhY3RlZF9kYXRlOiB7IGxhYmVsOiAnXHU2NzAwXHU4RkQxXHU4MDU0XHU3Q0ZCXHU2NUY2XHU5NUY0JyB9LFxuICAgICAgYXZhdGFyOiB7IGxhYmVsOiAnXHU1OTM0XHU1MENGJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfY29udGFjdHM6IHsgbGFiZWw6ICdcdTUxNjhcdTkwRThcdTgwNTRcdTdDRkJcdTRFQkEnIH0sXG4gICAgICBjb250YWN0X2RpcmVjdG9yeTogeyBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEVCQVx1NzZFRVx1NUY1NScgfSxcbiAgICAgIHByaW1hcnlfY29udGFjdHM6IHsgbGFiZWw6ICdcdTRFM0JcdTg5ODFcdTgwNTRcdTdDRkJcdTRFQkEnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgbWFya19wcmltYXJ5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU4QkJFXHU0RTNBXHU0RTNCXHU4OTgxXHU4MDU0XHU3Q0ZCXHU0RUJBJyxcbiAgICAgICAgY29uZmlybVRleHQ6ICdcdTY2MkZcdTU0MjZcdTVDMDZcdTZCNjRcdTgwNTRcdTdDRkJcdTRFQkFcdThCQkVcdTRFM0FcdThCRTVcdTVCQTJcdTYyMzdcdTc2ODRcdTRFM0JcdTg5ODFcdTgwNTRcdTdDRkJcdTRFQkFcdUZGMUYnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1NURGMlx1OEJCRVx1NEUzQVx1NEUzQlx1ODk4MVx1ODA1NFx1N0NGQlx1NEVCQVx1RkYwMScsXG4gICAgICB9LFxuICAgICAgc2VuZF9lbWFpbDoge1xuICAgICAgICBsYWJlbDogJ1x1NTNEMVx1OTAwMVx1OTBBRVx1NEVGNicsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHN1YmplY3Q6IHsgbGFiZWw6ICdcdTRFM0JcdTk4OTgnIH0sXG4gICAgICAgICAgYm9keTogeyBsYWJlbDogJ1x1NkI2M1x1NjU4NycgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhZGRfY29udGFjdF90b19jYW1wYWlnbjoge1xuICAgICAgICBsYWJlbDogJ1x1NTJBMFx1NTE2NVx1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCcsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU4MDU0XHU3Q0ZCXHU0RUJBXHU1REYyXHU1MkEwXHU1MTY1XHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4XHVGRjAxJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4JyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgaWRlbnRpdHk6IHsgbGFiZWw6ICdcdThFQUJcdTRFRkRcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBhY2NvdW50X2luZm86IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTRFMEVcdTgwNENcdTUyQTEnIH0sXG4gICAgICBidXlpbmdfY2VudHJlOiB7IGxhYmVsOiAnXHU5MUM3XHU4RDJEXHU1MUIzXHU3QjU2XHU1NzA4JyB9LFxuICAgICAgY29udGFjdF9pbmZvOiB7IGxhYmVsOiAnXHU4MDU0XHU3Q0ZCXHU2NUI5XHU1RjBGJyB9LFxuICAgICAgbWFpbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnXHU5MEFFXHU1QkM0XHU1NzMwXHU1NzQwJyB9LFxuICAgICAgYWRkaXRpb25hbDogeyBsYWJlbDogJ1x1OTY0NFx1NTJBMFx1NEZFMVx1NjA2RicgfSxcbiAgICAgIHByZWZlcmVuY2VzOiB7IGxhYmVsOiAnXHU2QzlGXHU5MDFBXHU1MDRGXHU1OTdEJyB9LFxuICAgICAgLy8gY29udGFjdC52aWV3LnRzIFx1ODg2OFx1NTM1NVx1NTMzQVx1NTc1N1x1NTQwRFx1NzlGMCAoIzExMDApXG4gICAgICBjb250YWN0X2RldGFpbHM6IHsgbGFiZWw6ICdcdTgwNTRcdTdDRkJcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBjb21tX3ByZWZlcmVuY2VzOiB7IGxhYmVsOiAnXHU1MDRGXHU1OTdEXHU4QkJFXHU3RjZFJyB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOL29iamVjdHMucGlwZWxpbmUudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9vYmplY3RzLnBpcGVsaW5lLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IGFjdGl2aXR5QWN0aW9ucyB9IGZyb20gJy4vX3NoYXJlZCc7XG5cbi8qKlxuICogXHU3QjgwXHU0RjUzXHU0RTJEXHU2NTg3ICh6aC1DTikgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBQSVBFTElORSBmYW1pbHk6XG4gKiBkZW1hbmQgYW5kIHRoZSBkZWFscyBpdCBiZWNvbWVzLCBwbHVzIHRoZSByb2xsLXVwIHRoYXQgZm9yZWNhc3RzIHRoZW0uXG4gKlxuICogUm9zdGVyOiBgY3JtX2xlYWRgLCBgY3JtX29wcG9ydHVuaXR5YCwgYGNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW1gLCBgY3JtX2ZvcmVjYXN0YC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBwaXBlbGluZTogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX2xlYWQ6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGRpc3F1YWxpZmljYXRpb25fcmVhc29uX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTdFQkZcdTdEMjJcdTY4MDdcdThCQjBcdTRFM0FcdTRFMERcdTU0MDhcdTY4M0NcdTY1RjZcdTVGQzVcdTk4N0JcdTU4NkJcdTUxOTlcdTUzRDZcdTZEODhcdThENDRcdTY4M0NcdTUzOUZcdTU2RTAnLFxuICAgICAgfSxcbiAgICAgIGR1cGxpY2F0ZV9kaXNxdWFsaWZpY2F0aW9uX3JlcXVpcmVzX3N1cnZpdm9yOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTRFRTVcdTkxQ0RcdTU5MERcdTRFM0FcdTc1MzFcdTUzRDZcdTZEODhcdTdFQkZcdTdEMjJcdThENDRcdTY4M0NcdTY1RjZcdUZGMENcdTVGQzVcdTk4N0JcdTYzMDdcdTY2MEVcdTRGRERcdTc1NTlcdTc2ODRcdThCQjBcdTVGNTVcdTVFNzZcdTVDMDZcdTkxQ0RcdTU5MERcdTcyQjZcdTYwMDFcdThCQkVcdTRFM0FcdTVERjJcdTc4NkVcdThCQTQnLFxuICAgICAgfSxcbiAgICAgIGVtYWlsX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTc1MzVcdTVCNTBcdTkwQUVcdTRFRjZcdTRFM0FcdTVGQzVcdTU4NkJcdTk4NzknLFxuICAgICAgfSxcbiAgICAgIGxlYWRfc3RhdHVzX3Byb2dyZXNzaW9uOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTY1RTBcdTY1NDhcdTc2ODRcdTdFQkZcdTdEMjJcdTcyQjZcdTYwMDFcdTZENDFcdThGNkMnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU3RUJGXHU3RDIyJyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1N0VCRlx1N0QyMicsXG4gICAgZGVzY3JpcHRpb246ICdcdTVDMUFcdTY3MkFcdTc4NkVcdThCQTRcdTc2ODRcdTZGNUNcdTU3MjhcdTVCQTJcdTYyMzcnLFxuICAgIGZpZWxkczoge1xuICAgICAgc2FsdXRhdGlvbjoge1xuICAgICAgICBsYWJlbDogJ1x1NzlGMFx1OEMxMycsXG4gICAgICAgIG9wdGlvbnM6IHsgbXI6ICdcdTUxNDhcdTc1MUYnLCBtczogJ1x1NTk3M1x1NThFQicsIG1yczogJ1x1NTkyQlx1NEVCQScsIGRyOiAnXHU1MzVBXHU1OEVCJywgcHJvZjogJ1x1NjU1OVx1NjM4OCcgfSxcbiAgICAgIH0sXG4gICAgICBmaXJzdF9uYW1lOiB7IGxhYmVsOiAnXHU1NDBEJyB9LFxuICAgICAgbGFzdF9uYW1lOiB7IGxhYmVsOiAnXHU1OUQzJyB9LFxuICAgICAgZnVsbF9uYW1lOiB7IGxhYmVsOiAnXHU1MTY4XHU1NDBEJyB9LFxuICAgICAgY29tcGFueTogeyBsYWJlbDogJ1x1NTE2Q1x1NTNGOCcgfSxcbiAgICAgIHRpdGxlOiB7IGxhYmVsOiAnXHU4MDRDXHU0RjREJyB9LFxuICAgICAgZW1haWw6IHsgbGFiZWw6ICdcdTkwQUVcdTdCQjEnIH0sXG4gICAgICBwaG9uZTogeyBsYWJlbDogJ1x1NzUzNVx1OEJERCcgfSxcbiAgICAgIGluZHVzdHJ5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU4ODRDXHU0RTFBJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHRlY2hub2xvZ3k6ICdcdTc5RDFcdTYyODAnLCBzb2Z0d2FyZTogJ1x1OEY2Rlx1NEVGNiAvIFNhYVMnLCBmaW5hbmNlOiAnXHU5MUQxXHU4NzhEJyxcbiAgICAgICAgICBoZWFsdGhjYXJlOiAnXHU1MzNCXHU3NTk3JywgcmV0YWlsOiAnXHU5NkY2XHU1NTJFJywgbWFudWZhY3R1cmluZzogJ1x1NTIzNlx1OTAyMCcsXG4gICAgICAgICAgZWR1Y2F0aW9uOiAnXHU2NTU5XHU4MEIyJywgcmVhbF9lc3RhdGU6ICdcdTYyM0ZcdTU3MzBcdTRFQTcnLCBtZWRpYTogJ1x1NEYyMFx1NUE5Mlx1NUEzMVx1NEU1MCcsXG4gICAgICAgICAgbG9naXN0aWNzOiAnXHU3MjY5XHU2RDQxJywgaG9zcGl0YWxpdHk6ICdcdTkxNTJcdTVFOTdcdTY1QzVcdTZFMzgnLCBlbmVyZ3k6ICdcdTgwRkRcdTZFOTBcdTUxNkNcdTc1MjhcdTRFOEJcdTRFMUEnLFxuICAgICAgICAgIGdvdmVybm1lbnQ6ICdcdTY1M0ZcdTVFOUMnLCBub25wcm9maXQ6ICdcdTk3NUVcdTg0MjVcdTUyMjknLCBvdGhlcjogJ1x1NTE3Nlx1NEVENicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3MkI2XHU2MDAxJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIC8vIFx1NURGMlx1Nzg2RVx1OEJBNCAvIFx1NjcyQVx1OTAxQVx1OEZDNyBcdTY2MkZcdTU0MENcdTRFMDBcdTRFMkFcdTUyQThcdTRGNUMoXHU3RUJGXHU3RDIyXHU3ODZFXHU4QkE0KVx1NzY4NFx1NkI2M1x1NTNDRFx1NEUyNFx1OTc2MjtcdTUzOUZcdTUxNDhcdTc2ODRcbiAgICAgICAgICAvLyBcdTVERjJcdTc4NkVcdThCQTQgLyBcdTRFMERcdTU0MDhcdTY4M0MgXHU1MUZBXHU4MUVBXHU0RTI0XHU1OTU3XHU4QkY0XHU2Q0Q1LFx1NTcyOFx1NzJCNlx1NjAwMVx1Njc2MVx1NEUwQVx1NUU3Nlx1NjM5Mlx1NjVGNlx1OEJGQlx1OEQ3N1x1Njc2NVx1NEUwRFx1NjIxMFx1NUJGOVx1MzAwMlxuICAgICAgICAgIG5ldzogJ1x1NjVCMFx1NUVGQScsIGNvbnRhY3RlZDogJ1x1NURGMlx1ODA1NFx1N0NGQicsIHF1YWxpZmllZDogJ1x1NURGMlx1Nzg2RVx1OEJBNCcsXG4gICAgICAgICAgdW5xdWFsaWZpZWQ6ICdcdTY3MkFcdTkwMUFcdThGQzcnLCBjb252ZXJ0ZWQ6ICdcdTVERjJcdThGNkNcdTUzMTYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxlYWRfc291cmNlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3RUJGXHU3RDIyXHU2NzY1XHU2RTkwJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHdlYjogJ1x1N0Y1MVx1N0FEOScsIHJlZmVycmFsOiAnXHU2M0E4XHU4MzUwJywgZXZlbnQ6ICdcdTZEM0JcdTUyQTggLyBcdTVDNTVcdTRGMUEnLFxuICAgICAgICAgIHdlYmluYXI6ICdcdTdFQkZcdTRFMEFcdTc4MTRcdThCQThcdTRGMUEnLCBwYXJ0bmVyOiAnXHU1NDA4XHU0RjVDXHU0RjE5XHU0RjM0JywgYWR2ZXJ0aXNlbWVudDogJ1x1NUU3Rlx1NTQ0QScsXG4gICAgICAgICAgcGFpZF9zZWFyY2g6ICdcdTRFRDhcdThEMzlcdTY0MUNcdTdEMjInLCBzb2NpYWw6ICdcdTc5M0VcdTRFQTRcdTVBOTJcdTRGNTMnLCBjb250ZW50OiAnXHU1MTg1XHU1QkI5IC8gXHU1MzVBXHU1QkEyJyxcbiAgICAgICAgICBjb2xkX2NhbGw6ICdcdTk2NENcdTc1MUZcdTYyRENcdThCQkYnLCBlbWFpbF9jYW1wYWlnbjogJ1x1OTBBRVx1NEVGNlx1ODQyNVx1OTUwMCcsIG90aGVyOiAnXHU1MTc2XHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1OEQxRlx1OEQyM1x1NEVCQScgfSxcbiAgICAgIGlzX2NvbnZlcnRlZDogeyBsYWJlbDogJ1x1NURGMlx1OEY2Q1x1NTMxNicgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU2M0NGXHU4RkYwJyB9LFxuICAgICAgbW9iaWxlOiB7IGxhYmVsOiAnXHU2MjRCXHU2NzNBJyB9LFxuICAgICAgd2Vic2l0ZTogeyBsYWJlbDogJ1x1N0Y1MVx1N0FEOScgfSxcbiAgICAgIHJhdGluZzogeyBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1OEJDNFx1NTIwNicsIGhlbHA6ICdcdTdFQkZcdTdEMjJcdThEMjhcdTkxQ0ZcdThCQzRcdTUyMDZcdUZGMDgxLTUgXHU2NjFGXHVGRjA5JyB9LFxuICAgICAgY29udmVydGVkX2FjY291bnQ6IHsgbGFiZWw6ICdcdThGNkNcdTUzMTZcdTVCQTJcdTYyMzcnIH0sXG4gICAgICBjb252ZXJ0ZWRfY29udGFjdDogeyBsYWJlbDogJ1x1OEY2Q1x1NTMxNlx1ODA1NFx1N0NGQlx1NEVCQScgfSxcbiAgICAgIGNvbnZlcnRlZF9vcHBvcnR1bml0eTogeyBsYWJlbDogJ1x1OEY2Q1x1NTMxNlx1NTU0Nlx1NjczQScgfSxcbiAgICAgIGNvbnZlcnRlZF9kYXRlOiB7IGxhYmVsOiAnXHU4RjZDXHU1MzE2XHU2NUU1XHU2NzFGJyB9LFxuICAgICAgYWRkcmVzczogeyBsYWJlbDogJ1x1NTczMFx1NTc0MCcgfSxcbiAgICAgIGFubnVhbF9yZXZlbnVlOiB7IGxhYmVsOiAnXHU1RTc0XHU4NDI1XHU2NTM2JyB9LFxuICAgICAgbnVtYmVyX29mX2VtcGxveWVlczogeyBsYWJlbDogJ1x1NTQ1OFx1NURFNVx1NEVCQVx1NjU3MCcgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHU1OTA3XHU2Q0U4JywgaGVscDogJ1x1NjcyQ1x1N0VCRlx1N0QyMlx1NzY4NFx1NURFNVx1NEY1Q1x1NTkwN1x1NkNFOFx1MjAxNFx1MjAxNFx1NjUyRlx1NjMwMVx1NjgzQ1x1NUYwRlx1NjM5Mlx1NzI0OFx1MzAwMicgfSxcbiAgICAgIGRvX25vdF9jYWxsOiB7IGxhYmVsOiAnXHU3OTgxXHU2QjYyXHU4MUY0XHU3NTM1JyB9LFxuICAgICAgZW1haWxfb3B0X291dDogeyBsYWJlbDogJ1x1NjJEMlx1NjUzNlx1OTBBRVx1NEVGNicgfSxcbiAgICAgIGRpc3F1YWxpZmljYXRpb25fcmVhc29uOiB7XG4gICAgICAgIC8vIFx1NzJCNlx1NjAwMVx1OTFDQ1x1NzY4NCB1bnF1YWxpZmllZCBcdThCRDFcdTRGNUNcdTMwMENcdTY3MkFcdTkwMUFcdThGQzdcdTMwMEQsXHU2MjQwXHU0RUU1XHU4RkQ5XHU5MUNDXHU4RERGXHU3NzQwXHU1M0VCXHUzMDBDXHU2NzJBXHU5MDFBXHU4RkM3XHU1MzlGXHU1NkUwXHUzMDBEXG4gICAgICAgIC8vIFx1ODAwQ1x1NEUwRFx1NjYyRlx1MzAwQ1x1NTNENlx1NkQ4OFx1OEQ0NFx1NjgzQ1x1NTM5Rlx1NTZFMFx1MzAwRFx1MjAxNFx1MjAxNCBcdTRFMjRcdTRFMkFcdTVCNTdcdTZCQjVcdTU3MjhcdTU0MENcdTRFMDBcdTVGMjBcdTg4NjhcdTUzNTVcdTRFMEFcdTRFMEJcdTc2RjhcdTkwQkIsXHU3NTI4XHU4QkNEXHU1RkM1XHU5ODdCXHU2MjEwXHU1QkY5XHUzMDAyXG4gICAgICAgIGxhYmVsOiAnXHU2NzJBXHU5MDFBXHU4RkM3XHU1MzlGXHU1NkUwJyxcbiAgICAgICAgaGVscDogJ1x1NzJCNlx1NjAwMVx1NEUzQVx1MzAwQ1x1NjcyQVx1OTAxQVx1OEZDN1x1MzAwRFx1NjVGNlx1NUZDNVx1NTg2QicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBub3RfYV9maXQ6ICdcdTk3MDBcdTZDNDJcdTRFMERcdTUzMzlcdTkxNEQnLCBub19idWRnZXQ6ICdcdTk4ODRcdTdCOTdcdTRFMERcdThEQjMnLCB3cm9uZ19wZXJzb25hOiAnXHU4MDU0XHU3Q0ZCXHU0RUJBXHU4OUQyXHU4MjcyXHU0RTBEXHU3QjI2JyxcbiAgICAgICAgICB1bnJlYWNoYWJsZTogJ1x1NjVFMFx1NkNENVx1ODA1NFx1N0NGQicsIGR1cGxpY2F0ZTogJ1x1OTFDRFx1NTkwRFx1N0VCRlx1N0QyMicsIGNvbXBldGl0b3I6ICdcdTkwMDlcdTYyRTlcdTRFODZcdTdBREVcdTRFODlcdTVCRjlcdTYyNEInLFxuICAgICAgICAgIG90aGVyOiAnXHU1MTc2XHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBkdXBsaWNhdGVfb2ZfdHlwZToge1xuICAgICAgICBoZWxwOiAnXHU0RkREXHU3NTU5XHU0RTBCXHU2NzY1XHU3Njg0XHU5MEEzXHU2NzYxXHU4QkIwXHU1RjU1XHU2MjQwXHU1QzVFXHU3Njg0XHU1QkY5XHU4QzYxXHU3QzdCXHU1NzhCXHUzMDAyJyxcbiAgICAgICAgbGFiZWw6ICdcdTkxQ0RcdTU5MERcdTRFOEUnLFxuICAgICAgICAvLyBgZXJhc2VkYCBcdTY2MkZcdTU4OTNcdTc4OTFcdTUwM0NcdUZGMENcdTRFMERcdTY2MkZcdTUzRUZcdTkwMDlcdTk4NzlcdUZGMUFcdTg4NjhcdTUzNTVcdTRFMERcdTYzRDBcdTRGOUJcdTVCODNcdUZGMDhcdTg5QzFcbiAgICAgICAgLy8gYHNyYy9zYWxlcy92aWV3cy9sZWFkLnZpZXcudHNgXHVGRjA5XHVGRjBDXHU0RjQ2XHU1RTc4XHU1QjU4XHU4QkIwXHU1RjU1XHU4OEFCXHU1MjIwXHU5NjY0XHU1NDBFXHU3RUJGXHU3RDIyXHU0RjFBXHU1RTI2XHU3NzQwXHU1QjgzXHVGRjBDXG4gICAgICAgIC8vIFx1NjI0MFx1NEVFNVx1NTFFMVx1NjYyRlx1OEJGQlx1NTNENlx1OEJCMFx1NUY1NVx1NzY4NFx1NTczMFx1NjVCOVx1OTBGRFx1OTcwMFx1ODk4MVx1NjgwN1x1N0I3RVx1RkYwQ1x1NTQyNlx1NTIxOVx1NEYxQVx1NjYzRVx1NzkzQVx1NTM5Rlx1NTlDQlx1NTAzQyBgZXJhc2VkYFx1MzAwMlxuICAgICAgICBvcHRpb25zOiB7IGNybV9sZWFkOiAnXHU3RUJGXHU3RDIyJywgY3JtX2NvbnRhY3Q6ICdcdTgwNTRcdTdDRkJcdTRFQkEnLCBlcmFzZWQ6ICdcdThCQjBcdTVGNTVcdTVERjJcdTUyMjBcdTk2NjQnIH0sXG4gICAgICB9LFxuICAgICAgZHVwbGljYXRlX29mX2xlYWQ6IHsgbGFiZWw6ICdcdTkxQ0RcdTU5MERcdTc2ODRcdTdFQkZcdTdEMjInIH0sXG4gICAgICBkdXBsaWNhdGVfb2ZfY29udGFjdDogeyBsYWJlbDogJ1x1OTFDRFx1NTkwRFx1NzY4NFx1ODA1NFx1N0NGQlx1NEVCQScgfSxcbiAgICAgIGR1cGxpY2F0ZV9zdGF0dXM6IHtcbiAgICAgICAgaGVscDogJ1x1NzU5MVx1NEYzQyA9IFx1NUY1NVx1NTE2NVx1NjVGNlx1ODFFQVx1NTJBOFx1NjgwN1x1OEJCMFx1RkYxQlx1NURGMlx1Nzg2RVx1OEJBNCA9IFx1NEVCQVx1NURFNVx1NjgzOFx1NUI5RVx1OEZDN1x1NTMzOVx1OTE0RFx1MzAwMicsXG4gICAgICAgIC8vIFx1NzU5MVx1NEYzQyA9IFx1NUY1NVx1NTE2NVx1NjVGNlx1ODFFQVx1NTJBOFx1NjgwN1x1OEJCMDtcdTVERjJcdTc4NkVcdThCQTQgPSBcdTRFQkFcdTVERTVcdTY4MzhcdTVCRjlcdTU0MEVcdTc2ODRcdTUyMjRcdTVCOUFcdTMwMDJcdTRFMjRcdTgwMDVcdTY2MkZcdTU0MENcdTRFMDBcbiAgICAgICAgLy8gXHU1MjI0XHU2NUFEXHU3Njg0XHU0RTI0XHU0RTJBXHU5NjM2XHU2QkI1LFx1NjI0MFx1NEVFNVx1NTE3MVx1NzUyOFx1NEUwMFx1NEUyQVx1NUI1N1x1NkJCNVx1ODAwQ1x1NEUwRFx1NjYyRlx1NTQwNFx1NTM2MFx1NEUwMFx1NTk1N1x1OTRGRVx1NjNBNVx1NUI1N1x1NkJCNVx1MzAwMlxuICAgICAgICBsYWJlbDogJ1x1OTFDRFx1NTkwRFx1NzJCNlx1NjAwMScsXG4gICAgICAgIG9wdGlvbnM6IHsgc3VzcGVjdGVkOiAnXHU3NTkxXHU0RjNDXHU5MUNEXHU1OTBEJywgY29uZmlybWVkOiAnXHU1REYyXHU3ODZFXHU4QkE0XHU5MUNEXHU1OTBEJyB9LFxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTY2M0VcdTc5M0FcdTU0MERcdTc5RjAnIH0sXG4gICAgICBjb21wYW55X25vcm1hbGl6ZWQ6IHsgbGFiZWw6ICdcdTUxNkNcdTUzRjhcdTU0MERcdTc5RjBcdUZGMDhcdTg5QzRcdTgzMDNcdTUzMTZcdUZGMDknLCBoZWxwOiAnXHU3RUJGXHU3RDIyXHU4RjZDXHU1MzE2XHU3Njg0XHU1MzM5XHU5MTREXHU5NTJFXHVGRjFBXHU1MTZDXHU1M0Y4XHU1NDBEXHU3OUYwXHU4RjZDXHU1QzBGXHU1MTk5XHUzMDAxXHU1M0JCXHU5NjY0XHU5OTk2XHU1QzNFXHU3QTdBXHU2ODNDXHUzMDAxXHU1MTg1XHU5MEU4XHU4RkRFXHU3RUVEXHU3QTdBXHU3NjdEXHU1NDA4XHU1RTc2XHU0RTNBXHU0RTAwXHU0RTJBXHU3QTdBXHU2ODNDXHUzMDAyXHU3NTMxIGxlYWRfZHVwbGljYXRlX2NoZWNrIFx1OTRBOVx1NUI1MFx1N0VGNFx1NjJBNFx1MjAxNFx1MjAxNFx1OEJGN1x1NTJGRlx1NzZGNFx1NjNBNVx1N0YxNlx1OEY5MVx1MzAwMicgfSxcbiAgICAgIG5leHRfZm9sbG93dXBfZGF0ZTogeyBsYWJlbDogJ1x1NEUwQlx1NkIyMVx1OERERlx1OEZEQlx1NjVFNVx1NjcxRicgfSxcbiAgICAgIGxhc3RfY29udGFjdGVkX2RhdGU6IHsgbGFiZWw6ICdcdTY3MDBcdThGRDFcdTgwNTRcdTdDRkJcdTY1RjZcdTk1RjQnIH0sXG4gICAgICBuZWVkX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTk3MDBcdTZDNDJcdTdDN0JcdTU3OEInLFxuICAgICAgICBoZWxwOiAnXHU1QkEyXHU2MjM3XHU2MEYzXHU4OTgxXHU0RUMwXHU0RTQ4XHUzMDAyXHU3RUJGXHU3RDIyXHU1MjA2XHU2RDNFXHUzMDAxXHU0RjE4XHU1MTQ4XHU3RUE3XHU2MzkyXHU1RThGXHU1NDhDXHU5NzAwXHU2QzQyXHU1MjA2XHU2NzkwXHU5MEZEXHU4QkZCXHU4RkQ5XHU0RTJBXHU1QjU3XHU2QkI1XHUzMDAyJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ld19pbXBsZW1lbnRhdGlvbjogJ1x1NjVCMFx1NUVGQVx1NUI5RVx1NjVCRCcsIGV4cGFuc2lvbjogJ1x1NjI2OVx1NUJCOVx1NTg5RVx1OEQyRCcsXG4gICAgICAgICAgcmVwbGFjZW1lbnQ6ICdcdTY2RkZcdTYzNjJcdThGQzFcdTc5RkInLCByZW5ld2FsOiAnXHU3RUVEXHU3RUE2JywgY29uc3VsdGluZzogJ1x1NTRBOFx1OEJFMlx1NjcwRFx1NTJBMScsXG4gICAgICAgICAgc3VwcG9ydDogJ1x1OEZEMFx1N0VGNFx1NjUyRlx1NjMwMScsIG90aGVyOiAnXHU1MTc2XHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlc3RpbWF0ZWRfYW1vdW50OiB7XG4gICAgICAgIGxhYmVsOiAnXHU5ODg0XHU4QkExXHU5MUQxXHU5ODlEJyxcbiAgICAgICAgaGVscDogJ1x1OEQ0NFx1NjgzQ1x1NTIyNFx1NUI5QVx1NEU0Qlx1NTI0RFx1NUJGOVx1OEJFNVx1OTcwMFx1NkM0Mlx1OTFEMVx1OTg5RFx1NzY4NFx1NEYzMFx1N0I5N1x1MzAwMlx1OEY2Q1x1NTMxNlx1NjVGNlx1NzUyOFx1NEU4RVx1OTg4NFx1NTg2Qlx1NTU0Nlx1NjczQVx1OTFEMVx1OTg5RFx1MzAwMicsXG4gICAgICB9LFxuICAgICAgY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdThGNkNcdTUzMTZcdTVCQTFcdTYyNzknLFxuICAgICAgICBoZWxwOiAnXHU4QkU1XHU3RUJGXHU3RDIyXHU2NjJGXHU1NDI2XHU1REYyXHU4M0I3XHU1MUM2XHU4RjZDXHU1MzE2XHUzMDAyXHUzMDBDXHU2NUUwXHU5NzAwXHU1QkExXHU2Mjc5XHUzMDBEXHU4ODY4XHU3OTNBXHU0RTBEXHU4RDcwXHU1QkExXHU2Mjc5XHU2RDQxXHU3QTBCXHUyMDE0XHUyMDE0XHU4RkQ5XHU2NjJGXHU0RUE3XHU1NEMxXHU3Njg0XHU1MUZBXHU1MzgyXHU5RUQ4XHU4QkE0XHU1MDNDXHUzMDAyJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5vdF9yZXF1aXJlZDogJ1x1NjVFMFx1OTcwMFx1NUJBMVx1NjI3OScsIHBlbmRpbmc6ICdcdTVGODVcdTVCQTFcdTYyNzknLFxuICAgICAgICAgIGFwcHJvdmVkOiAnXHU1QkExXHU2Mjc5XHU5MDFBXHU4RkM3JywgcmVqZWN0ZWQ6ICdcdTVCQTFcdTYyNzlcdTlBNzNcdTU2REUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2xlYWRzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1MTY4XHU5MEU4XHU3RUJGXHU3RDIyJyxcbiAgICAgICAgZW1wdHlTdGF0ZTogeyB0aXRsZTogJ1x1OEZEOFx1NkNBMVx1NjcwOVx1N0VCRlx1N0QyMicsIG1lc3NhZ2U6ICdcdTUyMUJcdTVFRkFcdTdCMkNcdTRFMDBcdTY3NjFcdTdFQkZcdTdEMjJcdUZGMENcdTRFQ0VcdThGRDlcdTkxQ0NcdTVGMDBcdTU5Q0InIH0sXG4gICAgICB9LFxuICAgICAga2FuYmFuX2J5X3N0YXR1czogeyBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1NkQ0MVx1NkMzNFx1N0VCRicgfSxcbiAgICAgIGNhbGVuZGFyX2J5X2NyZWF0ZWQ6IHsgbGFiZWw6ICdcdTdFQkZcdTdEMjJcdTY1RTVcdTUzODYnIH0sXG4gICAgICBnYWxsZXJ5X3ZpZXc6IHsgbGFiZWw6ICdcdTdFQkZcdTdEMjJcdTUzNjFcdTcyNDcnIH0sXG4gICAgICBteV9sZWFkczogeyBsYWJlbDogJ1x1NjIxMVx1NzY4NFx1N0VCRlx1N0QyMicgfSxcbiAgICAgIGhpZ2hfcHJpb3JpdHk6IHsgbGFiZWw6ICdcdTlBRDhcdTRGMThcdTUxNDhcdTdFQTcnIH0sXG4gICAgICBob3RfbGVhZHM6IHsgbGFiZWw6ICdcdUQ4M0RcdUREMjUgXHU5QUQ4XHU3MEVEXHU1RUE2XHU3RUJGXHU3RDIyJyB9LFxuICAgICAgc3VzcGVjdGVkX2R1cGxpY2F0ZXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTc1OTFcdTRGM0NcdTkxQ0RcdTU5MERcdTdFQkZcdTdEMjInLFxuICAgICAgICBlbXB0eVN0YXRlOiB7IHRpdGxlOiAnXHU2Q0ExXHU2NzA5XHU3NTkxXHU0RjNDXHU5MUNEXHU1OTBEJywgbWVzc2FnZTogJ1x1NjVFMFx1OTcwMFx1NTkwRFx1NjgzOFx1MjAxNFx1MjAxNFx1NkJDRlx1NEUyQVx1OTFDRFx1NTkwRFx1NUY1NVx1NTE2NVx1NzY4NFx1OTBBRVx1N0JCMVx1OTBGRFx1NURGMlx1NjhDMFx1NjdFNVx1OEZDN1x1MzAwMicgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIC8vIE9iamVjdC1sZXZlbCBzZWN0aW9uIGtleXMgKGxlYWQub2JqZWN0LnRzKSwgdXNlZCBieSByZWNvcmQgZm9ybXMgYW5kXG4gICAgICAvLyBieSB0aGUgZGV0YWlsIHBhZ2UsIHdob3NlIHNlY3Rpb25zIHJlZmVyZW5jZSB0aGVzZSBncm91cHMgKCM4MDYpXG4gICAgICBhZGRyZXNzOiB7IGxhYmVsOiAnXHU1NzMwXHU1NzQwJyB9LFxuICAgICAgaWRlbnRpdHk6IHsgbGFiZWw6ICdcdThFQUJcdTRFRkRcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBjb21wYW55X2luZm86IHsgbGFiZWw6ICdcdTUxNkNcdTUzRjhcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdcdTgwNTRcdTdDRkJcdTY1QjlcdTVGMEYnIH0sXG4gICAgICBxdWFsaWZpY2F0aW9uOiB7IGxhYmVsOiAnXHU4RDQ0XHU2ODNDXHU4QkM0XHU0RjMwJyB9LFxuICAgICAgYXNzaWdubWVudDogeyBsYWJlbDogJ1x1NTIwNlx1OTE0RCcgfSxcbiAgICAgIGFkZGl0aW9uYWw6IHsgbGFiZWw6ICdcdTk2NDRcdTUyQTBcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBwcmVmZXJlbmNlczogeyBsYWJlbDogJ1x1NkM5Rlx1OTAxQVx1NTA0Rlx1NTk3RCcgfSxcbiAgICAgIGNvbnZlcnNpb246IHsgbGFiZWw6ICdcdThGNkNcdTUzMTYnIH0sXG4gICAgICBkdXBsaWNhdGVzOiB7IGxhYmVsOiAnXHU5MUNEXHU1OTBEXHU3RUJGXHU3RDIyXHU3QkExXHU3NDA2JyB9LFxuICAgICAgLy8gbGVhZC52aWV3LnRzIFx1ODg2OFx1NTM1NVx1NTMzQVx1NTc1N1x1NTQwRFx1NzlGMCAoIzExMDApIFx1MjAxNFx1MjAxNCBcdTlFRDhcdThCQTRcdTg4NjhcdTUzNTVcdTRFMEVcdTZCQ0ZcdTRFMDBcdTRFMkFcdTUxNzdcdTU0MEQgZm9ybVZpZXdcbiAgICAgIC8vIFx1NzY4NFx1NTMzQVx1NTc1N1x1NTQwRFx1NUI1N1x1OTBGRFx1NEY0Rlx1NTcyOFx1OEZEOVx1OTFDQ1x1RkYxQVx1OTBBM1x1OEZCOVx1NjVCMFx1NTg5RVx1NEUwMFx1NEUyQVx1ODg2OFx1NTM1NVx1RkYwQ1x1OEZEOVx1OTFDQ1x1NUMzMVx1ODg2NVx1NEUwQVx1NUI4M1x1NzY4NFx1NTMzQVx1NTc1N1x1NTQwRFx1MzAwMlxuICAgICAgY29udGFjdF9pbmZvcm1hdGlvbjogeyBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEZFMVx1NjA2RicgfSxcbiAgICAgIGxlYWRfY2xhc3NpZmljYXRpb246IHsgbGFiZWw6ICdcdTdFQkZcdTdEMjJcdTUyMDZcdTdDN0InIH0sXG4gICAgICBjb21wYW55X2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnXHU1MTZDXHU1M0Y4XHU0RkUxXHU2MDZGJyB9LFxuICAgICAgYWRkaXRpb25hbF9pbmZvcm1hdGlvbjogeyBsYWJlbDogJ1x1OTY0NFx1NTJBMFx1NEZFMVx1NjA2RicgfSxcbiAgICAgIHByaXZhY3k6IHsgbGFiZWw6ICdcdTk2OTBcdTc5QzEnIH0sXG4gICAgICBnZW5lcmFsOiB7IGxhYmVsOiAnXHU1RTM4XHU4OUM0XHU0RkUxXHU2MDZGJyB9LFxuICAgICAgZGV0YWlsczogeyBsYWJlbDogJ1x1OEJFNlx1NjBDNScgfSxcbiAgICAgIHN0ZXBfMV9jb250YWN0X2RldGFpbHM6IHsgbGFiZWw6ICdcdTdCMkNcdTRFMDBcdTZCNjVcdUZGMUFcdTgwNTRcdTdDRkJcdTY1QjlcdTVGMEYnIH0sXG4gICAgICBzdGVwXzJfY29tcGFueV9pbmZvcm1hdGlvbjogeyBsYWJlbDogJ1x1N0IyQ1x1NEU4Q1x1NkI2NVx1RkYxQVx1NTE2Q1x1NTNGOFx1NEZFMVx1NjA2RicgfSxcbiAgICAgIHN0ZXBfM19xdWFsaWZpY2F0aW9uOiB7IGxhYmVsOiAnXHU3QjJDXHU0RTA5XHU2QjY1XHVGRjFBXHU4RDQ0XHU4RDI4XHU1QkExXHU2ODM4JyB9LFxuICAgICAgc3RlcF80X3Jldmlld19hbmRfY29udmVydDogeyBsYWJlbDogJ1x1N0IyQ1x1NTZEQlx1NkI2NVx1RkYxQVx1NUJBMVx1NjgzOFx1NUU3Nlx1OEY2Q1x1NTMxNicgfSxcbiAgICAgIHByaW1hcnlfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdcdTRFM0JcdTg5ODFcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBleHRlbmRlZF9kZXRhaWxzOiB7IGxhYmVsOiAnXHU2MjY5XHU1QzU1XHU0RkUxXHU2MDZGJyB9LFxuICAgICAgcXVpY2tfZWRpdDogeyBsYWJlbDogJ1x1NUZFQlx1OTAxRlx1N0YxNlx1OEY5MScgfSxcbiAgICAgIHVwZGF0ZV9sZWFkX3N0YXR1czogeyBsYWJlbDogJ1x1NjZGNFx1NjVCMFx1N0VCRlx1N0QyMlx1NzJCNlx1NjAwMScgfSxcbiAgICAgIHRlbGxfdXNfYWJvdXRfeW91cnNlbGY6IHsgbGFiZWw6ICdcdThCRjdcdTRFQ0JcdTdFQ0RcdTRFMDBcdTRFMEJcdTYwQThcdTgxRUFcdTVERjEnIH0sXG4gICAgICBhYm91dF95b3VyX2NvbXBhbnk6IHsgbGFiZWw6ICdcdTYwQThcdTc2ODRcdTUxNkNcdTUzRjhcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBob3dfY2FuX3dlX2hlbHA6IHsgbGFiZWw6ICdcdTYyMTFcdTRFRUNcdTgwRkRcdTVFMkVcdTYwQThcdTRFQzBcdTRFNDhcdUZGMUYnIH0sXG4gICAgICBsZWFkX2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnXHU3RUJGXHU3RDIyXHU0RkUxXHU2MDZGJyB9LFxuICAgICAgYWRkcmVzc19pbmZvcm1hdGlvbjogeyBsYWJlbDogJ1x1NTczMFx1NTc0MFx1NEZFMVx1NjA2RicgfSxcbiAgICAgIHByaXZhY3lfcHJlZmVyZW5jZXM6IHsgbGFiZWw6ICdcdTk2OTBcdTc5QzFcdTUwNEZcdTU5N0QnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgY29udmVydF9sZWFkOiB7XG4gICAgICAgIGxhYmVsOiAnXHU4RjZDXHU1MzE2XHU3RUJGXHU3RDIyJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTdFQkZcdTdEMjJcdThGNkNcdTUzMTZcdTYyMTBcdTUyOUZcdUZGMDEnLFxuICAgICAgfSxcbiAgICAgIGNyZWF0ZV9jYW1wYWlnbjoge1xuICAgICAgICBsYWJlbDogJ1x1NTJBMFx1NTE2NVx1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCcsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1REYyXHU1QzA2XHU3RUJGXHU3RDIyXHU1MkEwXHU1MTY1XHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4XHVGRjAxJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4JyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNjaGVkdWxlX2ZvbGxvd3VwOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1Qjg5XHU2MzkyXHU4RERGXHU4RkRCJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdThEREZcdThGREJcdTRFRkJcdTUyQTFcdTVERjJcdTUyMUJcdTVFRkFcdTMwMDInLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fb3Bwb3J0dW5pdHk6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGFtb3VudF9wb3NpdGl2ZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU5MUQxXHU5ODlEXHU1RkM1XHU5ODdCXHU1OTI3XHU0RThFXHU5NkY2JyxcbiAgICAgIH0sXG4gICAgICBjbG9zZV9kYXRlX2Z1dHVyZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU5NjY0XHU5NzVFXHU1NTQ2XHU2NzNBXHU1REYyXHU3RUQzXHU2NzVGXHVGRjBDXHU1NDI2XHU1MjE5XHU5ODg0XHU4QkExXHU2MjEwXHU0RUE0XHU2NUU1XHU0RTBEXHU1RTk0XHU2NUU5XHU0RThFXHU0RUNBXHU1OTI5JyxcbiAgICAgIH0sXG4gICAgICBvcHBvcnR1bml0eV9zdGFnZV9wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU2NUUwXHU2NTQ4XHU3Njg0XHU1NTQ2XHU2NzNBXHU5NjM2XHU2QkI1XHU2RDQxXHU4RjZDJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NTU0Nlx1NjczQScsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTU1NDZcdTY3M0EnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU5NTAwXHU1NTJFXHU2RDQxXHU3QTBCXHU0RTJEXHU3Njg0XHU1NTQ2XHU2NzNBXHU0RTBFXHU0RUE0XHU2NjEzJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdcdTU1NDZcdTY3M0FcdTU0MERcdTc5RjAnIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ1x1NjI0MFx1NUM1RVx1NUJBMlx1NjIzNycgfSxcbiAgICAgIHByaW1hcnlfY29udGFjdDogeyBsYWJlbDogJ1x1NEUzQlx1ODk4MVx1ODA1NFx1N0NGQlx1NEVCQScgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnXHU1NTQ2XHU2NzNBXHU4RDFGXHU4RDIzXHU0RUJBJyB9LFxuICAgICAgYW1vdW50OiB7IGxhYmVsOiAnXHU5MUQxXHU5ODlEJyB9LFxuICAgICAgZXhwZWN0ZWRfcmV2ZW51ZTogeyBsYWJlbDogJ1x1OTg4NFx1NjcxRlx1NjUzNlx1NTE2NScgfSxcbiAgICAgIHN0YWdlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU5NjM2XHU2QkI1JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHByb3NwZWN0aW5nOiAnXHU1QkZCXHU2MjdFXHU1QkEyXHU2MjM3JywgcXVhbGlmaWNhdGlvbjogJ1x1OEQ0NFx1NjgzQ1x1NUJBMVx1NjdFNScsXG4gICAgICAgICAgbmVlZHNfYW5hbHlzaXM6ICdcdTk3MDBcdTZDNDJcdTUyMDZcdTY3OTAnLCBwcm9wb3NhbDogJ1x1NjNEMFx1Njg0OCcsXG4gICAgICAgICAgbmVnb3RpYXRpb246ICdcdThDMDhcdTUyMjQnLCBjbG9zZWRfd29uOiAnXHU2MjEwXHU0RUE0JywgY2xvc2VkX2xvc3Q6ICdcdTU5MzFcdThEMjUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHByb2JhYmlsaXR5OiB7IGxhYmVsOiAnXHU2MjEwXHU0RUE0XHU2OTgyXHU3Mzg3ICglKScgfSxcbiAgICAgIGNsb3NlX2RhdGU6IHsgbGFiZWw6ICdcdTk4ODRcdThCQTFcdTYyMTBcdTRFQTRcdTY1RTVcdTY3MUYnIH0sXG4gICAgICB0eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3QzdCXHU1NzhCJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ld19idXNpbmVzczogJ1x1NjVCMFx1NEUxQVx1NTJBMScsXG4gICAgICAgICAgZXhpc3RpbmdfdXBncmFkZTogJ1x1ODAwMVx1NUJBMlx1NjIzN1x1NTM0N1x1N0VBNycsXG4gICAgICAgICAgZXhpc3RpbmdfcmVuZXdhbDogJ1x1ODAwMVx1NUJBMlx1NjIzN1x1N0VFRFx1N0VBNicsXG4gICAgICAgICAgZXhpc3RpbmdfZXhwYW5zaW9uOiAnXHU4MDAxXHU1QkEyXHU2MjM3XHU2MkQzXHU1QzU1JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ1x1OTg4NFx1NkQ0Qlx1N0M3Qlx1NTIyQicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwaXBlbGluZTogJ1x1N0JBMVx1OTA1MycsIGJlc3RfY2FzZTogJ1x1NjcwMFx1NEY3M1x1NjBDNVx1NTFCNScsXG4gICAgICAgICAgY29tbWl0OiAnXHU2MjdGXHU4QkZBJywgb21pdHRlZDogJ1x1NURGMlx1NjM5Mlx1OTY2NCcsIGNsb3NlZDogJ1x1NURGMlx1NTE3M1x1OTVFRCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdTYzQ0ZcdThGRjAnIH0sXG4gICAgICBuZXh0X3N0ZXA6IHsgbGFiZWw6ICdcdTRFMEJcdTRFMDBcdTZCNjUnIH0sXG4gICAgICBsZWFkX3NvdXJjZToge1xuICAgICAgICBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1Njc2NVx1NkU5MCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB3ZWI6ICdcdTdGNTFcdTdBRDknLCByZWZlcnJhbDogJ1x1NjNBOFx1ODM1MCcsIGV2ZW50OiAnXHU2RDNCXHU1MkE4IC8gXHU1QzU1XHU0RjFBJyxcbiAgICAgICAgICB3ZWJpbmFyOiAnXHU3RUJGXHU0RTBBXHU3ODE0XHU4QkE4XHU0RjFBJywgcGFydG5lcjogJ1x1NTQwOFx1NEY1Q1x1NEYxOVx1NEYzNCcsIGFkdmVydGlzZW1lbnQ6ICdcdTVFN0ZcdTU0NEEnLFxuICAgICAgICAgIHBhaWRfc2VhcmNoOiAnXHU0RUQ4XHU4RDM5XHU2NDFDXHU3RDIyJywgc29jaWFsOiAnXHU3OTNFXHU0RUE0XHU1QTkyXHU0RjUzJywgY29udGVudDogJ1x1NTE4NVx1NUJCOSAvIFx1NTM1QVx1NUJBMicsXG4gICAgICAgICAgY29sZF9jYWxsOiAnXHU5NjRDXHU3NTFGXHU2MkRDXHU4QkJGJywgZW1haWxfY2FtcGFpZ246ICdcdTkwQUVcdTRFRjZcdTg0MjVcdTk1MDAnLCBvdGhlcjogJ1x1NTE3Nlx1NEVENicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4JywgaGVscDogJ1x1NUUyNlx1Njc2NVx1NkI2NFx1NTU0Nlx1NjczQVx1NzY4NFx1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCcgfSxcbiAgICAgIGRheXNfaW5fc3RhZ2U6IHsgbGFiZWw6ICdcdTVGNTNcdTUyNERcdTk2MzZcdTZCQjVcdTU5MjlcdTY1NzAnIH0sXG4gICAgICBzdGFnZV9lbnRyeV9kYXRlOiB7IGxhYmVsOiAnXHU4RkRCXHU1MTY1XHU1RjUzXHU1MjREXHU5NjM2XHU2QkI1XHU2NUU1XHU2NzFGJywgaGVscDogJ1x1NjcyQ1x1NTU0Nlx1NjczQVx1OEZEQlx1NTE2NVx1NUY1M1x1NTI0RFx1OTYzNlx1NkJCNVx1NzY4NFx1NjVFNVx1NjcxRlx1MzAwMicgfSxcbiAgICAgIGlzX3ByaXZhdGU6IHsgbGFiZWw6ICdcdTc5QzFcdTVCQzYnIH0sXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTVCQTFcdTYyNzlcdTcyQjZcdTYwMDEnLFxuICAgICAgICBvcHRpb25zOiB7IG5vdF9yZXF1aXJlZDogJ1x1NjVFMFx1OTcwMFx1NUJBMVx1NjI3OScsIHBlbmRpbmc6ICdcdTVCQTFcdTYyNzlcdTRFMkQnLCBhcHByb3ZlZDogJ1x1NURGMlx1NjI3OVx1NTFDNicsIHJlamVjdGVkOiAnXHU1REYyXHU5QTczXHU1NkRFJyB9LFxuICAgICAgfSxcbiAgICAgIGFwcHJvdmVkX2RhdGU6IHsgbGFiZWw6ICdcdTYyNzlcdTUxQzZcdTY1RjZcdTk1RjQnIH0sXG4gICAgICB3aW5fcmVhc29uOiB7XG4gICAgICAgIGhlbHA6ICdcdThENjJcdTUzNTVcdTUzOUZcdTU2RTBcdTMwMDJcdTVDMDZcdTU1NDZcdTY3M0FcdTUxNzNcdTk1RURcdTRFM0FcIlx1NjIxMFx1NEVBNFwiXHU2NUY2XHU1RkM1XHU1ODZCXHUzMDAyJyxcbiAgICAgICAgbGFiZWw6ICdcdThENjJcdTUzNTVcdTUzOUZcdTU2RTAnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYmV0dGVyX3Byb2R1Y3Q6ICdcdTRFQTdcdTU0QzFcdTY2RjRcdTRGMTgnLCBiZXR0ZXJfcHJpY2U6ICdcdTRFRjdcdTY4M0NcdTY2RjRcdTRGMTgnLCByZWxhdGlvbnNoaXA6ICdcdTVCQTJcdTYyMzdcdTUxNzNcdTdDRkInLFxuICAgICAgICAgIGJldHRlcl9zdXBwb3J0OiAnXHU2NTJGXHU2MzAxXHU2NkY0XHU1OTdEJywgYmVzdF9maXQ6ICdcdTY3MDBcdTRGNzNcdTU5NTFcdTU0MDgnLFxuICAgICAgICAgIHF1b3RlX2FjY2VwdGVkOiAnXHU2MkE1XHU0RUY3XHU4OEFCXHU2M0E1XHU1M0Q3Jywgb3RoZXI6ICdcdTUxNzZcdTRFRDYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxvc3NfcmVhc29uOiB7XG4gICAgICAgIGhlbHA6ICdcdTRFMjJcdTUzNTVcdTUzOUZcdTU2RTBcdTMwMDJcdTVDMDZcdTU1NDZcdTY3M0FcdTUxNzNcdTk1RURcdTRFM0FcIlx1NTkzMVx1OEQyNVwiXHU2NUY2XHU1RkM1XHU1ODZCXHUzMDAyJyxcbiAgICAgICAgbGFiZWw6ICdcdTRFMjJcdTUzNTVcdTUzOUZcdTU2RTAnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcHJpY2U6ICdcdTRFRjdcdTY4M0NcdThGQzdcdTlBRDgnLCBjb21wZXRpdG9yOiAnXHU4RjkzXHU3RUQ5XHU3QURFXHU0RTg5XHU1QkY5XHU2MjRCJywgbm9fYnVkZ2V0OiAnXHU2NUUwXHU5ODg0XHU3Qjk3JyxcbiAgICAgICAgICBub19kZWNpc2lvbjogJ1x1NjcyQVx1NTFCM1x1N0I1NicsIHRpbWluZzogJ1x1NjVGNlx1NjczQVx1NEUwRFx1NTQwOFx1OTAwMicsIGZlYXR1cmVzOiAnXHU1MjlGXHU4MEZEXHU3RjNBXHU1OTMxJywgb3RoZXI6ICdcdTUxNzZcdTRFRDYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxvc3NfZGV0YWlsczogeyBsYWJlbDogJ1x1OEQ2Mi9cdTRFMjJcdTUzNTVcdThCRTZcdTYwQzUnLCBoZWxwOiAnXHU4RDYyXHU1MzU1XHU2MjE2XHU0RTIyXHU1MzU1XHU1MzlGXHU1NkUwXHU3Njg0XHU4ODY1XHU1MTQ1XHU4QkY0XHU2NjBFXHUzMDAyJyB9LFxuICAgICAgLy8gUkVRLTAwMDYgXHUyMDE0IFx1OEQ0NFx1NjgzQ1x1OEJDNFx1NEYzMFx1MzAwMVx1NUJBMlx1NjIzN1x1NEZBN1x1OTFDN1x1OEQyRFx1NjVFNVx1N0EwQlx1MzAwMVx1NTU0Nlx1NjczQVx1NTNEOVx1OEZGMFx1MzAwMVx1NEUxQVx1NTJBMVx1N0VCRlx1NEUwRVx1NzJCNlx1NjAwMVx1NTNEOFx1NjZGNFx1NUJBMVx1NjI3OVx1MzAwMlxuICAgICAgd2lsbF9iaWQ6IHsgbGFiZWw6ICdcdTY2MkZcdTU0MjZcdTYyOTVcdTY4MDcnLCBoZWxwOiAnXHU2MjExXHU2NUI5XHU2NjJGXHU1NDI2XHU2MjUzXHU3Qjk3XHU2Mjk1XHU2ODA3XHUzMDAyXHU3NTU5XHU3QTdBXHU4ODY4XHU3OTNBXHU1QzFBXHU2NzJBXHU1MUIzXHU1QjlBXHUzMDAyJyB9LFxuICAgICAgY29udHJvbGxhYmlsaXR5OiB7IGxhYmVsOiAnXHU1M0VGXHU2M0E3XHU2MDI3Jywgb3B0aW9uczogeyBoaWdoOiAnXHU5QUQ4JywgbWVkaXVtOiAnXHU0RTJEJywgbG93OiAnXHU0RjRFJyB9IH0sXG4gICAgICBwcmlvcml0eTogeyBsYWJlbDogJ1x1NEYxOFx1NTE0OFx1N0VBNycsIG9wdGlvbnM6IHsgaGlnaDogJ1x1OUFEOCcsIG1lZGl1bTogJ1x1NEUyRCcsIGxvdzogJ1x1NEY0RScgfSB9LFxuICAgICAgZGVhbF9sZXZlbDogeyBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1N0VBN1x1NTIyQicsIG9wdGlvbnM6IHsgc3RyYXRlZ2ljOiAnXHU2MjE4XHU3NTY1XHU3RUE3Jywga2V5OiAnXHU5MUNEXHU3MEI5Jywgc3RhbmRhcmQ6ICdcdTY2NkVcdTkwMUEnIH0gfSxcbiAgICAgIGlzX3N1YmNvbnRyYWN0ZWQ6IHsgbGFiZWw6ICdcdTZEODlcdTUzQ0FcdTUyMDZcdTUzMDUnIH0sXG4gICAgICBzdWJjb250cmFjdGluZ19ub3RlOiB7IGxhYmVsOiAnXHU1MjA2XHU1MzA1XHU4QkY0XHU2NjBFJyB9LFxuICAgICAgY3VzdG9tZXJfaW5pdGlhdGlvbl9kYXRlOiB7IGxhYmVsOiAnXHU1QkEyXHU2MjM3XHU3QUNCXHU5ODc5XHU2NUU1XHU2NzFGJyB9LFxuICAgICAgZXhwZWN0ZWRfdGVuZGVyX2RhdGU6IHsgbGFiZWw6ICdcdTk4ODRcdThCQTFcdTYyREJcdTY4MDdcdTY1RTVcdTY3MUYnIH0sXG4gICAgICBleHBlY3RlZF9zaWduaW5nX2RhdGU6IHsgbGFiZWw6ICdcdTk4ODRcdThCQTFcdTdCN0VcdTdFQTZcdTY1RTVcdTY3MUYnIH0sXG4gICAgICBleHBlY3RlZF90ZW5kZXJfYW1vdW50OiB7IGxhYmVsOiAnXHU5ODg0XHU4QkExXHU2MkRCXHU2ODA3XHU5MUQxXHU5ODlEJyB9LFxuICAgICAgZXhwZWN0ZWRfc2lnbmluZ19hbW91bnQ6IHsgbGFiZWw6ICdcdTk4ODRcdThCQTFcdTdCN0VcdTdFQTZcdTkxRDFcdTk4OUQnIH0sXG4gICAgICBidXNpbmVzc19saW5lOiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RTFBXHU1MkExXHU3RUJGJyxcbiAgICAgICAgb3B0aW9uczogeyBwcm9kdWN0OiAnXHU0RUE3XHU1NEMxJywgc2VydmljZXM6ICdcdTRFMTNcdTRFMUFcdTY3MERcdTUyQTEnLCBjb25zdWx0aW5nOiAnXHU1NEE4XHU4QkUyXHU2NzBEXHU1MkExJywgc3VwcG9ydDogJ1x1OEZEMFx1N0VGNFx1NjUyRlx1NjMwMScsIG90aGVyOiAnXHU1MTc2XHU0RUQ2JyB9LFxuICAgICAgfSxcbiAgICAgIGN1c3RvbWVyX2JhY2tncm91bmQ6IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTdCODBcdTRFQ0InIH0sXG4gICAgICBwcm9qZWN0X2JhY2tncm91bmQ6IHsgbGFiZWw6ICdcdTk4NzlcdTc2RUVcdTgwQ0NcdTY2NkYnIH0sXG4gICAgICByaXNrX2FuYWx5c2lzOiB7IGxhYmVsOiAnXHU5OENFXHU5NjY5XHU1MjA2XHU2NzkwJyB9LFxuICAgICAgcGF5bWVudF90ZXJtczogeyBsYWJlbDogJ1x1NEVEOFx1NkIzRVx1Njc2MVx1NkIzRScgfSxcbiAgICAgIHJlcXVlc3RlZF9zdGF0dXM6IHsgbGFiZWw6ICdcdTc1MzNcdThCRjdcdTUzRDhcdTY2RjRcdTcyQjZcdTYwMDEnLCBvcHRpb25zOiB7IGNsb3NlZF93b246ICdcdThENjJcdTUzNTUnLCBjbG9zZWRfbG9zdDogJ1x1NEUyMlx1NTM1NScgfSB9LFxuICAgICAgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTcyQjZcdTYwMDFcdTUzRDhcdTY2RjRcdTVCQTFcdTYyNzknLFxuICAgICAgICBvcHRpb25zOiB7IG5vdF9yZXF1aXJlZDogJ1x1NjVFMFx1OTcwMFx1NUJBMVx1NjI3OScsIHBlbmRpbmc6ICdcdTVCQTFcdTYyNzlcdTRFMkQnLCBhcHByb3ZlZDogJ1x1NURGMlx1NjI3OVx1NTFDNicsIHJlamVjdGVkOiAnXHU1REYyXHU5QTczXHU1NkRFJyB9LFxuICAgICAgfSxcbiAgICAgIC8vIFJFUS0wMDA2IFx1N0IyQyAxMSBcdTZCNjUgXHUyMDE0IFx1N0FDQlx1OTg3OVx1NUJBMVx1NjI3OVx1MzAwMlxuICAgICAgcXVhbGlmaWNhdGlvbl9yZXF1ZXN0ZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTc1MzNcdThCRjdcdTdBQ0JcdTk4NzlcdTVCQTFcdTYyNzknLFxuICAgICAgICBoZWxwOiAnXHU1MkZFXHU5MDA5XHU1NDBFXHU2M0QwXHU0RUE0XHU3QUNCXHU5ODc5XHU1QkExXHU2Mjc5XHUzMDAyXHU1QkExXHU2Mjc5XHU4OEFCXHU5QTczXHU1NkRFXHU2NUY2XHU0RjFBXHU4MUVBXHU1MkE4XHU1M0Q2XHU2RDg4XHU1MkZFXHU5MDA5XHVGRjFCXHU1MThEXHU2QjIxXHU1MkZFXHU5MDA5XHU1MzczXHU1M0VGXHU5MUNEXHU2NUIwXHU3NTMzXHU4QkY3XHUzMDAyJyxcbiAgICAgIH0sXG4gICAgICBxdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1N0FDQlx1OTg3OVx1NUJBMVx1NjI3OScsXG4gICAgICAgIG9wdGlvbnM6IHsgbm90X3JlcXVpcmVkOiAnXHU2NUUwXHU5NzAwXHU1QkExXHU2Mjc5JywgcGVuZGluZzogJ1x1NUJBMVx1NjI3OVx1NEUyRCcsIGFwcHJvdmVkOiAnXHU1REYyXHU2Mjc5XHU1MUM2JywgcmVqZWN0ZWQ6ICdcdTVERjJcdTlBNzNcdTU2REUnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICB0ZW5kZXJfdGhpc19xdWFydGVyOiB7XG4gICAgICAgIGxhYmVsOiAnXHU2NzJDXHU1QjYzXHU1RUE2XHU5ODg0XHU4QkExXHU2MkRCXHU2ODA3JyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnXHU2NzJDXHU1QjYzXHU1RUE2XHU2NjgyXHU2NUUwXHU5ODg0XHU4QkExXHU2MkRCXHU2ODA3XHU3Njg0XHU1NTQ2XHU2NzNBJyxcbiAgICAgICAgICBtZXNzYWdlOiAnXHU2NzJDXHU2ODA3XHU3QjdFXHU5ODc1XHU1MjE3XHU1MUZBXHU1QkEyXHU2MjM3XHU0RkE3XHU5ODg0XHU4QkExXHU2MkRCXHU2ODA3XHU2NUU1XHU2NzFGXHU4NDNEXHU1NzI4XHU1RjUzXHU1MjREXHU1QjYzXHU1RUE2XHU1MTg1XHU3Njg0XHU4RkRCXHU4ODRDXHU0RTJEXHU1NTQ2XHU2NzNBXHUzMDAyXHU1NzI4XHU1NTQ2XHU2NzNBXHU0RTBBXHU1ODZCXHU1MTk5XHUyMDFDXHU5ODg0XHU4QkExXHU2MkRCXHU2ODA3XHU2NUU1XHU2NzFGXHUyMDFEXHU1NDBFXHVGRjBDXHU1QjgzXHU1QzMxXHU0RjFBXHU1MUZBXHU3M0IwXHU1NzI4XHU4RkQ5XHU5MUNDXHUzMDAyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvcGVuX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdcdThGREJcdTg4NENcdTRFMkRcdTU1NDZcdTY3M0EnIH0sXG4gICAgICBhbGxfb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ1x1NTE2OFx1OTBFOFx1NTU0Nlx1NjczQScgfSxcbiAgICAgIHBpcGVsaW5lX2thbmJhbjogeyBsYWJlbDogJ1x1OTUwMFx1NTUyRVx1NkQ0MVx1NkMzNFx1N0VCRicgfSxcbiAgICAgIGNsb3NlX2RhdGVfY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTk4ODRcdTZENEJcdTY1RTVcdTUzODYnIH0sXG4gICAgICBkZWFsX3RpbWVsaW5lOiB7IGxhYmVsOiAnXHU1NTQ2XHU2NzNBXHU2NUY2XHU5NUY0XHU3RUJGJyB9LFxuICAgICAgZGVhbF9nYWxsZXJ5OiB7IGxhYmVsOiAnXHU1NTQ2XHU2NzNBXHU1MzYxXHU3MjQ3JyB9LFxuICAgICAgbXlfb3Blbl9kZWFsczogeyBsYWJlbDogJ1x1NjIxMVx1NzY4NFx1OEZEQlx1ODg0Q1x1NEUyRFx1NTU0Nlx1NjczQScgfSxcbiAgICAgIHN0YWxlX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdcdTI2QTBcdUZFMEYgXHU1MDVDXHU2RURFXHU1NTQ2XHU2NzNBIFx1MDBCNyBcdTYzMDlcdTk2MzZcdTZCQjVcdTUwNUNcdTc1NTlcdTY1RjZcdTk1RjRcdTYzOTJcdTVFOEYnIH0sXG4gICAgICBjbG9zaW5nX3RoaXNfcXVhcnRlcjoge1xuICAgICAgICBsYWJlbDogJ1x1NjcyQ1x1NUI2M1x1NUVBNlx1NUY4NVx1NjIxMFx1NEVBNFx1NTU0Nlx1NjczQScsXG4gICAgICAgIGVtcHR5U3RhdGU6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1NjcyQ1x1NUI2M1x1NUVBNlx1NjY4Mlx1NjVFMFx1NUY4NVx1NjIxMFx1NEVBNFx1NTU0Nlx1NjczQScsXG4gICAgICAgICAgbWVzc2FnZTogJ1x1NjcyQ1x1NjgwN1x1N0I3RVx1OTg3NVx1NTIxN1x1NTFGQVx1OTg4NFx1OEJBMVx1NjIxMFx1NEVBNFx1NjVFNVx1NjcxRlx1ODQzRFx1NTcyOFx1NUY1M1x1NTI0RFx1NUI2M1x1NUVBNlx1NTE4NVx1MzAwMVx1NEUxNFx1NTkwNFx1NEU4RVx1NjI3Rlx1OEJGQVx1RkYwOENvbW1pdFx1RkYwOVx1NjIxNlx1NjcwMFx1NEY3M1x1NTNFRlx1ODBGRFx1RkYwOEJlc3QgQ2FzZVx1RkYwOVx1NzY4NFx1OEZEQlx1ODg0Q1x1NEUyRFx1NTU0Nlx1NjczQVx1MzAwMlx1NUY1M1x1NTI0RFx1NkNBMVx1NjcwOVx1N0IyNlx1NTQwOFx1Njc2MVx1NEVGNlx1NzY4NFx1OEJCMFx1NUY1NVx1MjAxNFx1MjAxNFx1OTg4NFx1OEJBMVx1NjIxMFx1NEVBNFx1NjVFNVx1NjcxRlx1NjZGNFx1NjY1QVx1NzY4NFx1NTU0Nlx1NjczQVx1OEJGN1x1ODlDMVx1MjAxQ1x1OEZEQlx1ODg0Q1x1NEUyRFx1NTU0Nlx1NjczQVx1MjAxRFx1NjgwN1x1N0I3RVx1OTg3NVx1MzAwMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICAvLyBPYmplY3QtbGV2ZWwgc2VjdGlvbiBrZXlzIChvcHBvcnR1bml0eS5vYmplY3QudHMpLCB1c2VkIGJ5IHJlY29yZCBmb3Jtc1xuICAgICAgLy8gYW5kIGJ5IHRoZSBkZXRhaWwgcGFnZSwgd2hvc2Ugc2VjdGlvbnMgcmVmZXJlbmNlIHRoZXNlIGdyb3VwcyAoIzE0NTIpXG4gICAgICBjcm1fZm9yZWNhc3Q6IHsgbGFiZWw6ICdcdTk2MzZcdTZCQjVcdTRFMEVcdTk4ODRcdTZENEInIH0sXG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1NTdGQVx1NjcyQ1x1NEZFMVx1NjA2RicgfSxcbiAgICAgIGZpbmFuY2lhbHM6IHsgbGFiZWw6ICdcdThEMjJcdTUyQTFcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBzYWxlc19wcm9jZXNzOiB7IGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU2RDQxXHU3QTBCJyB9LFxuICAgICAgY2xhc3NpZmljYXRpb246IHsgbGFiZWw6ICdcdTUyMDZcdTdDN0InIH0sXG4gICAgICBjYW1wYWlnbjogeyBsYWJlbDogJ1x1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCcgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHU1OTA3XHU2Q0U4XHU0RTBFXHU0RTBCXHU0RTAwXHU2QjY1JyB9LFxuICAgICAgcXVhbGlmaWNhdGlvbjogeyBsYWJlbDogJ1x1OEQ0NFx1NjgzQ1x1OEJDNFx1NEYzMCcgfSxcbiAgICAgIG5hcnJhdGl2ZTogeyBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1NTNEOVx1OEZGMCcgfSxcbiAgICAgIC8vIG9wcG9ydHVuaXR5LnZpZXcudHMgXHU4ODY4XHU1MzU1XHU1MzNBXHU1NzU3XHU1NDBEXHU3OUYwICgjMTEwMClcbiAgICAgIG92ZXJ2aWV3OiB7IGxhYmVsOiAnXHU2OTgyXHU4OUM4JyB9LFxuICAgICAgZm9yZWNhc3Q6IHsgbGFiZWw6ICdcdTk4ODRcdTZENEInIH0sXG4gICAgICBzYWxlc19zdHJhdGVneTogeyBsYWJlbDogJ1x1OTUwMFx1NTUyRVx1N0I1Nlx1NzU2NScgfSxcbiAgICAgIHdpbl9sb3NzOiB7IGxhYmVsOiAnXHU4RDYyXHU1MzU1L1x1OEY5M1x1NTM1NScgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7XG4gICAgICAuLi5hY3Rpdml0eUFjdGlvbnMsXG4gICAgICBjbG9uZV9vcHBvcnR1bml0eToge1xuICAgICAgICBsYWJlbDogJ1x1NTE0Qlx1OTY4Nlx1NTU0Nlx1NjczQScsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1NTQ2XHU2NzNBXHU1MTRCXHU5Njg2XHU2MjEwXHU1MjlGXHVGRjAxJyxcbiAgICAgIH0sXG4gICAgICBnZW5lcmF0ZV9xdW90ZToge1xuICAgICAgICBsYWJlbDogJ1x1NzUxRlx1NjIxMFx1NjJBNVx1NEVGN1x1NTM1NScsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1REYyXHU2ODM5XHU2MzZFXHU1NTQ2XHU2NzNBXHU1MjFCXHU1RUZBXHU2MkE1XHU0RUY3XHU1MzU1XHVGRjAxJyxcbiAgICAgIH0sXG4gICAgICBtYXNzX3VwZGF0ZV9zdGFnZToge1xuICAgICAgICBsYWJlbDogJ1x1NjZGNFx1NjVCMFx1OTYzNlx1NkJCNScsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1NTQ2XHU2NzNBXHU5NjM2XHU2QkI1XHU1REYyXHU2NkY0XHU2NUIwXHVGRjAxJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgc3RhZ2U6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnXHU2NUIwXHU5NjM2XHU2QkI1JyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgcHJvc3BlY3Rpbmc6ICdcdTVCRkJcdTYyN0VcdTVCQTJcdTYyMzcnLCBxdWFsaWZpY2F0aW9uOiAnXHU4RDQ0XHU2ODNDXHU1QkExXHU2N0U1JyxcbiAgICAgICAgICAgICAgbmVlZHNfYW5hbHlzaXM6ICdcdTk3MDBcdTZDNDJcdTUyMDZcdTY3OTAnLCBwcm9wb3NhbDogJ1x1NjNEMFx1Njg0OCcsXG4gICAgICAgICAgICAgIG5lZ290aWF0aW9uOiAnXHU4QzA4XHU1MjI0JywgY2xvc2VkX3dvbjogJ1x1NjIxMFx1NEVBNCcsIGNsb3NlZF9sb3N0OiAnXHU1OTMxXHU4RDI1JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgdW5pdF9wcmljZV9wb3NpdGl2ZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU5NTAwXHU1NTJFXHU0RUY3XHU2ODNDXHU0RTBEXHU4MEZEXHU0RTNBXHU4RDFGXHU2NTcwJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1NEVBN1x1NTRDMVx1NjYwRVx1N0VDNicsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTU1NDZcdTY3M0FcdTRFQTdcdTU0QzFcdTY2MEVcdTdFQzYnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU1NTQ2XHU2NzNBXHU0RTBCXHU2MzA5XHU0RUE3XHU1NEMxXHU2MkM2XHU1MjA2XHU3Njg0XHU2MkE1XHU0RUY3XHU4ODRDJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNybV9vcHBvcnR1bml0eTogeyBsYWJlbDogJ1x1NTE3M1x1ODA1NFx1NTU0Nlx1NjczQScgfSxcbiAgICAgIGNybV9wcm9kdWN0OiB7IGxhYmVsOiAnXHU0RUE3XHU1NEMxJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdTYzQ0ZcdThGRjAnIH0sXG4gICAgICBxdWFudGl0eTogeyBsYWJlbDogJ1x1NjU3MFx1OTFDRicgfSxcbiAgICAgIGxpc3RfcHJpY2U6IHsgbGFiZWw6ICdcdTY4MDdcdTRFRjcnLCBoZWxwOiAnXHU4MUVBXHU1MkE4XHU1M0Q2XHU4MUVBXHU0RUE3XHU1NEMxXHU3Njg0XHU3NkVFXHU1RjU1XHU0RUY3JyB9LFxuICAgICAgdW5pdF9wcmljZTogeyBsYWJlbDogJ1x1OTUwMFx1NTUyRVx1NTM1NVx1NEVGNycsIGhlbHA6ICdcdTUzNEZcdTU1NDZcdTU0MEVcdTc2ODRcdTUzNTVcdTRFRjdcdUZGMDhcdTUzRUZcdTRFMEVcdTc2RUVcdTVGNTVcdTRFRjdcdTRFMERcdTU0MENcdUZGMDknIH0sXG4gICAgICBkaXNjb3VudDogeyBsYWJlbDogJ1x1NjI5OFx1NjI2M1x1RkYwOCVcdUZGMDknIH0sXG4gICAgICB0b3RhbF9wcmljZTogeyBsYWJlbDogJ1x1NjAzQlx1OEJBMScgfSxcbiAgICAgIGxpbmVfbnVtYmVyOiB7IGxhYmVsOiAnXHU4ODRDXHU1M0Y3JyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1NjYwRVx1N0VDNlx1ODg0QycgfSxcbiAgICAgIHByaWNpbmc6IHsgbGFiZWw6ICdcdTRFRjdcdTY4M0MnIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX2ZvcmVjYXN0OiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBwZXJpb2RfZW5kX2FmdGVyX3N0YXJ0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTU0NjhcdTY3MUZcdTdFRDNcdTY3NUZcdTVGQzVcdTk4N0JcdTY2NUFcdTRFOEVcdTU0NjhcdTY3MUZcdTVGMDBcdTU5Q0JcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIHBlcmlvZF9lbmRfbWF0Y2hlc19jYWxlbmRhcl9wZXJpb2Q6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NTQ2OFx1NjcxRlx1N0VEM1x1Njc1Rlx1NUZDNVx1OTg3Qlx1NjYyRlx1OEJFNVx1NTQ2OFx1NjcxRlx1NzY4NFx1NjcwMFx1NTQwRVx1NEUwMFx1NTkyOVx1MjAxNFx1MjAxNFx1NEY4Qlx1NTk4Mlx1NEVFNSAyMDI2LTA3LTAxIFx1NUYwMFx1NTlDQlx1NzY4NFx1NUI2M1x1NUVBNlx1NUJGOVx1NUU5NCAyMDI2LTA5LTMwXHVGRjBDMjAyNiBcdTVFNzQgOCBcdTY3MDhcdTVCRjlcdTVFOTQgMjAyNi0wOC0zMVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgcGVyaW9kX3N0YXJ0X2ZpcnN0X29mX3BlcmlvZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU1NDY4XHU2NzFGXHU1RjAwXHU1OUNCXHU1RkM1XHU5ODdCXHU2NjJGXHU4QkU1XHU1NDY4XHU2NzFGXHU3Njg0XHU3QjJDXHU0RTAwXHU1OTI5XHUyMDE0XHUyMDE0XHU0RjhCXHU1OTgyIDIwMjYgXHU1RTc0IDggXHU2NzA4XHU1QkY5XHU1RTk0IDIwMjYtMDgtMDFcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIHF1YXJ0ZXJfc3RhcnRzX29uX3F1YXJ0ZXJfYm91bmRhcnk6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NUI2M1x1NUVBNlx1OTg4NFx1NkQ0Qlx1NUZDNVx1OTg3Qlx1NEVDRVx1NUI2M1x1NUVBNlx1OEZCOVx1NzU0Q1x1NUYwMFx1NTlDQlx1MjAxNFx1MjAxNDEgXHU2NzA4IDEgXHU2NUU1XHUzMDAxNCBcdTY3MDggMSBcdTY1RTVcdTMwMDE3IFx1NjcwOCAxIFx1NjVFNVx1NjIxNiAxMCBcdTY3MDggMSBcdTY1RTVcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIHNuYXBzaG90X2Ftb3VudHNfbm9uX25lZ2F0aXZlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTVGRUJcdTcxNjdcdTkxRDFcdTk4OURcdTRFMERcdTgwRkRcdTRFM0FcdThEMUZcdTY1NzBcdTMwMDInLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU5ODg0XHU2RDRCJyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1OTUwMFx1NTUyRVx1OTg4NFx1NkQ0QicsXG4gICAgZGVzY3JpcHRpb246ICdcdTYzMDlcdTk1MDBcdTU1MkVcdThEMUZcdThEMjNcdTRFQkFcdTVCOUFcdTY3MUZcdThCQjBcdTVGNTVcdTc2ODRcdTdCQTFcdTkwNTNcdTVGRUJcdTcxNjdcdUZGMENcdTc1MjhcdTRFOEVcdTY1MzZcdTUxNjVcdTk4ODRcdTZENEInLFxuICAgIGZpZWxkczoge1xuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdThEMUZcdThEMjNcdTRFQkEnIH0sXG4gICAgICBwZXJpb2Q6IHsgbGFiZWw6ICdcdTU0NjhcdTY3MUYnLCBvcHRpb25zOiB7IG1vbnRoOiAnXHU2NzA4XHU1RUE2JywgcXVhcnRlcjogJ1x1NUI2M1x1NUVBNicgfSB9LFxuICAgICAgcGVyaW9kX3N0YXJ0OiB7XG4gICAgICAgIGxhYmVsOiAnXHU1NDY4XHU2NzFGXHU4RDc3XHU1OUNCJyxcbiAgICAgICAgaGVscDogJ1x1NUZDNVx1OTg3Qlx1NjYyRlx1NjI0MFx1NTcyOFx1NTQ2OFx1NjcxRlx1NzY4NFx1N0IyQ1x1NEUwMFx1NTkyOVx1MjAxNFx1MjAxNFx1NEY4Qlx1NTk4MiAyMDI2IFx1NUU3NCA4IFx1NjcwOFx1NUJGOVx1NUU5NCAyMDI2LTA4LTAxXHUzMDAyXHU1QjYzXHU1RUE2XHU5ODg0XHU2RDRCXHU4RkQ4XHU1RkM1XHU5ODdCXHU4NDNEXHU1NzI4XHU1QjYzXHU1RUE2XHU4RkI5XHU3NTRDXHU0RTBBXHVGRjFBMSBcdTY3MDggMSBcdTY1RTVcdTMwMDE0IFx1NjcwOCAxIFx1NjVFNVx1MzAwMTcgXHU2NzA4IDEgXHU2NUU1XHU2MjE2IDEwIFx1NjcwOCAxIFx1NjVFNVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgcGVyaW9kX2VuZDoge1xuICAgICAgICBsYWJlbDogJ1x1NTQ2OFx1NjcxRlx1NjIyQVx1NkI2MicsXG4gICAgICAgIGhlbHA6ICdcdTkwMUFcdTVFMzhcdTY4MzlcdTYzNkVcIlx1NTQ2OFx1NjcxRlwiXHU1NDhDXCJcdTU0NjhcdTY3MUZcdThENzdcdTU5Q0JcIlx1ODFFQVx1NTJBOFx1NjNBOFx1N0I5N1x1MzAwMlx1NTk4Mlx1NjI0Qlx1NTJBOFx1NTg2Qlx1NTE5OVx1RkYwQ1x1NUZDNVx1OTg3Qlx1NjYyRlx1OEJFNVx1NTQ2OFx1NjcxRlx1NzY4NFx1NjcwMFx1NTQwRVx1NEUwMFx1NTkyOVx1MjAxNFx1MjAxNFx1NEY4Qlx1NTk4Mlx1OEQ3N1x1NTlDQlx1NEUzQSAyMDI2LTA3LTAxIFx1NzY4NFx1NUI2M1x1NUVBNlx1NUJGOVx1NUU5NCAyMDI2LTA5LTMwXHVGRjBDMjAyNiBcdTVFNzQgOCBcdTY3MDhcdTVCRjlcdTVFOTQgMjAyNi0wOC0zMVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgcGVyaW9kX2xhYmVsOiB7IGxhYmVsOiAnXHU1NDY4XHU2NzFGXHU2ODA3XHU3QjdFJywgaGVscDogJ1x1NjYxM1x1OEJGQlx1NzY4NFx1NTQ2OFx1NjcxRlx1NjgwN1x1N0I3RVx1RkYwQ1x1NEY4Qlx1NTk4MlwiMjAyNiBcdTVFNzRcdTdCMkNcdTRFMDlcdTVCNjNcdTVFQTZcIlx1NjIxNlwiMjAyNiBcdTVFNzQgOCBcdTY3MDhcIlx1MzAwMicgfSxcbiAgICAgIHNuYXBzaG90X2RhdGU6IHsgbGFiZWw6ICdcdTVGRUJcdTcxNjdcdTY1RTVcdTY3MUYnLCBoZWxwOiAnXHU2NzJDXHU2QjIxXHU1RkVCXHU3MTY3XHU3Njg0XHU5MUM3XHU5NkM2XHU2NUU1XHU2NzFGXHUzMDAyJyB9LFxuICAgICAgc291cmNlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU2NzY1XHU2RTkwJyxcbiAgICAgICAgb3B0aW9uczogeyBzY2hlZHVsZWQ6ICdcdTVCOUFcdTY1RjZcdTVGRUJcdTcxNjcnLCBhaTogJ0FJIFx1NjI4MFx1ODBGRCcsIG1hbnVhbDogJ1x1NjI0Qlx1NURFNVx1NUY1NVx1NTE2NScgfSxcbiAgICAgIH0sXG4gICAgICBxdW90YTogeyBsYWJlbDogJ1x1OTE0RFx1OTg5RCcgfSxcbiAgICAgIHBpcGVsaW5lX2Ftb3VudDogeyBsYWJlbDogJ1x1N0JBMVx1OTA1M1x1OTFEMVx1OTg5RCcsIGhlbHA6ICdcdTY3MkNcdTU0NjhcdTY3MUZcdTUxODVcdTYyNDBcdTY3MDlcdTk4ODRcdThCQTFcdTdFRDNcdTUzNTVcdTc2ODRcdThGREJcdTg4NENcdTRFMkRcdTU1NDZcdTY3M0FcdTkxRDFcdTk4OURcdTU0MDhcdThCQTFcdUZGMDhcdTRFMERcdTk2NTBcdTk2MzZcdTZCQjVcdUZGMDlcdTMwMDInIH0sXG4gICAgICBiZXN0X2Nhc2VfYW1vdW50OiB7IGxhYmVsOiAnXHU2NzAwXHU0RjczXHU2MEM1XHU1MUI1JywgaGVscDogJ1x1OTg4NFx1NkQ0Qlx1N0M3Qlx1NTIyQlx1NEUzQVwiXHU2NzAwXHU0RjczXHU2MEM1XHU1MUI1XCJcdTYyMTZcIlx1NjI3Rlx1OEJGQVwiXHU3Njg0XHU4RkRCXHU4ODRDXHU0RTJEXHU1NTQ2XHU2NzNBXHUzMDAyJyB9LFxuICAgICAgY29tbWl0X2Ftb3VudDogeyBsYWJlbDogJ1x1NjI3Rlx1OEJGQVx1OTFEMVx1OTg5RCcsIGhlbHA6ICdcdTk4ODRcdTZENEJcdTdDN0JcdTUyMkJcdTRFM0FcIlx1NjI3Rlx1OEJGQVwiXHU3Njg0XHU4RkRCXHU4ODRDXHU0RTJEXHU1NTQ2XHU2NzNBXHVGRjA4XHU4RDFGXHU4RDIzXHU0RUJBXHU1REYyXHU2MjdGXHU4QkZBXHVGRjA5XHUzMDAyJyB9LFxuICAgICAgY2xvc2VkX2Ftb3VudDogeyBsYWJlbDogJ1x1NURGMlx1NjIxMFx1NEVBNFx1OTFEMVx1OTg5RCcsIGhlbHA6ICdcdTY3MkNcdTU0NjhcdTY3MUZcdTUxODVcdTVERjJcdThENjJcdTUzNTVcdTc2ODRcdTkxRDFcdTk4OURcdTMwMDInIH0sXG4gICAgICBleHBlY3RlZF9hbW91bnQ6IHsgbGFiZWw6ICdcdTk4ODRcdTY3MUZcdTkxRDFcdTk4OUQnLCBoZWxwOiAnXHU1REYyXHU2MjEwXHU0RUE0ICsgXHU2MjdGXHU4QkZBXHUyMDE0XHUyMDE0XHU4RDFGXHU4RDIzXHU0RUJBXHU1NDA4XHU3NDA2XHU5ODg0XHU2NzFGXHU4MEZEXHU2MkZGXHU0RTBCXHU3Njg0XHU5MUQxXHU5ODlEXHUzMDAyJyB9LFxuICAgICAgYXR0YWlubWVudF9wY3Q6IHsgbGFiZWw6ICdcdThGQkVcdTYyMTBcdTczODdcdUZGMDglXHVGRjA5JywgaGVscDogJ1x1NURGMlx1NjIxMFx1NEVBNCBcdTAwRjcgXHU5MTREXHU5ODlEIFx1MDBENyAxMDBcdTMwMDJcdTkxNERcdTk4OURcdTRFM0FcdTZCNjNcdTY1NzBcdTRFNEJcdTUyNERcdTY2M0VcdTc5M0EgMCVcdTMwMDInIH0sXG4gICAgICBjb3ZlcmFnZV9yYXRpbzogeyBsYWJlbDogJ1x1ODk4Nlx1NzZENlx1NTAwRFx1NjU3MCcsIGhlbHA6ICdcdTdCQTFcdTkwNTNcdTkxRDFcdTk4OUQgXHUwMEY3XHVGRjA4XHU5MTREXHU5ODlEIFx1MjIxMiBcdTVERjJcdTYyMTBcdTRFQTRcdUZGMDlcdTIwMTRcdTIwMTRcdTUyMjRcdTY1QURcdTUyNjlcdTRGNTlcdTdGM0FcdTUzRTNcdTY2MkZcdTU0MjZcdTY3MDlcdThEQjNcdTU5MUZcdTdCQTFcdTkwNTNcdTg5ODZcdTc2RDZcdTMwMDJcdTkxNERcdTk4OURcdTVERjJcdThGQkVcdTYyMTBcdTY1RjZcdTY2M0VcdTc5M0EgMFx1MzAwMicgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHU1OTA3XHU2Q0U4JyB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ1x1NjYzRVx1NzkzQVx1NTQwRFx1NzlGMCcgfSxcbiAgICAgIHNlZWRfa2V5OiB7IGxhYmVsOiAnXHU3OUNEXHU1QjUwXHU2ODA3XHU4QkM2JywgaGVscDogJ1x1NkYxNFx1NzkzQVx1NjU3MFx1NjM2RVx1NjgwN1x1OEJDNlx1MzAwMlx1NEVDNVx1NzUzMVx1NzlDRFx1NUI1MFx1NTJBMFx1OEY3RFx1NTY2OFx1NTE5OVx1NTE2NVx1RkYxQlx1NzcxRlx1NUI5RVx1NUZFQlx1NzE2N1x1NEUwQVx1NTlDQlx1N0VDOFx1NEUzQVx1N0E3QVx1MzAwMicgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2ZvcmVjYXN0czogeyBsYWJlbDogJ1x1NTE2OFx1OTBFOFx1OTg4NFx1NkQ0QicgfSxcbiAgICAgIHRoaXNfcXVhcnRlcl9mb3JlY2FzdHM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY3MkNcdTVCNjNcdTVFQTYnLFxuICAgICAgICBlbXB0eVN0YXRlOiB7XG4gICAgICAgICAgdGl0bGU6ICdcdTY3MkNcdTVCNjNcdTVFQTZcdTVDMUFcdTY1RTBcdTVGRUJcdTcxNjcnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdcdTVCNjNcdTVFQTZcdTVGRUJcdTcxNjdcdTc1MzFcdTZCQ0ZcdTY2NUFcdTc2ODRcdTk4ODRcdTZENEJcdTYyNkJcdTYzQ0ZcdTRFRkJcdTUyQTFcdTUxOTlcdTUxNjVcdTMwMDJcdTU3MjhcdTVCODNcdTRFM0FcdTVGNTNcdTUyNERcdTVCNjNcdTVFQTZcdTk5OTZcdTZCMjFcdThERDFcdTVCOENcdTRFNEJcdTUyNERcdUZGMENcdTY3MkNcdTg5QzZcdTU2RkVcdTRFM0FcdTdBN0FcdTIwMTRcdTIwMTRcdTVERjJcdTdFRDNcdTY3NUZcdTc2ODRcdTVCNjNcdTVFQTZcdThCRjdcdTg5QzFcdTIwMUNcdTUxNjhcdTkwRThcdTIwMURcdTY4MDdcdTdCN0VcdTk4NzVcdTMwMDInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG15X2ZvcmVjYXN0OiB7IGxhYmVsOiAnXHU2MjExXHU3Njg0XHU5ODg0XHU2RDRCJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1NUZFQlx1NzE2NycgfSxcbiAgICAgIGFtb3VudHM6IHsgbGFiZWw6ICdcdTkxRDFcdTk4OUQnIH0sXG4gICAgICBtZXRhOiB7IGxhYmVsOiAnXHU2NzY1XHU2RTkwJyB9LFxuICAgICAgLy8gZm9yZWNhc3Qudmlldy50cyBcdTg4NjhcdTUzNTVcdTUzM0FcdTU3NTdcdTU0MERcdTc5RjAgKCMxMTAwKVxuICAgICAgc25hcHNob3Q6IHsgbGFiZWw6ICdcdTVGRUJcdTcxNjcnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ1x1NTkwN1x1NkNFOCcgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9vYmplY3RzLmNvbW1lcmNlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTlwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vb2JqZWN0cy5jb21tZXJjZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG4vKipcbiAqIFx1N0I4MFx1NEY1M1x1NEUyRFx1NjU4NyAoemgtQ04pIFx1MjAxNCBgb2JqZWN0c2AgdHJhbnNsYXRpb25zIGZvciB0aGUgQ09NTUVSQ0UgZmFtaWx5OlxuICogd2hhdCBnZXRzIHNvbGQgYW5kIG9uIHdoYXQgcGFwZXIgXHUyMDE0IHF1b3RlcywgY29udHJhY3RzLCBwcm9kdWN0cy5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fcXVvdGVgLCBgY3JtX3F1b3RlX2xpbmVfaXRlbWAsIGBjcm1fY29udHJhY3RgLCBgY3JtX3Byb2R1Y3RgLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICogRXZlcnl0aGluZyB0aGF0IGlzIG5vdCBgb2JqZWN0c2AgbGl2ZXMgaW4gYC4vYXBwLnRzYDsgYG9iamVjdHNgIFx1MjAxNCA2OS03OCUgb2ZcbiAqIGV2ZXJ5IGJ1bmRsZSBcdTIwMTQgaXMgb25lIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5LCBhbmQgYSBkZXRhaWwgb2JqZWN0XG4gKiBmb2xsb3dzIGl0cyBtYXN0ZXIuIEEgbmV3IHJvdyBnb2VzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LCBuZXZlciBpblxuICogd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuOiB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0IHRoZSA3MCVcbiAqIGFkdmlzb3J5IGJhbmQgYHBucG0gaHlnaWVuZWAgcHJpbnRzLiBGdWxsIHJ1bGUgYW5kIHJhdGlvbmFsZTpcbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOLnRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbW1lcmNlOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fcXVvdGU6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGRpc2NvdW50X3dpdGhpbl9jZWlsaW5nOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTYyOThcdTYyNjNcdTRFMERcdTgwRkRcdThEODVcdThGQzcgNjAlJyxcbiAgICAgIH0sXG4gICAgICBleHBpcmF0aW9uX2FmdGVyX3F1b3RlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTU5MzFcdTY1NDhcdTY1RTVcdTY3MUZcdTVGQzVcdTk4N0JcdTY2NUFcdTRFOEVcdTYyQTVcdTRFRjdcdTY1RTVcdTY3MUYnLFxuICAgICAgfSxcbiAgICAgIHF1b3RlX3N0YXR1c19wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU2NUUwXHU2NTQ4XHU3Njg0XHU2MkE1XHU0RUY3XHU1MzU1XHU3MkI2XHU2MDAxXHU2RDQxXHU4RjZDJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NjJBNVx1NEVGN1x1NTM1NScsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTYyQTVcdTRFRjdcdTUzNTUnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU1M0QxXHU5MDAxXHU3RUQ5XHU1QkEyXHU2MjM3XHU3Njg0XHU0RUY3XHU2ODNDXHU2MkE1XHU0RUY3JyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIHF1b3RlX251bWJlcjogeyBsYWJlbDogJ1x1NjJBNVx1NEVGN1x1NTM1NVx1N0YxNlx1NTNGNycgfSxcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdcdTYyQTVcdTRFRjdcdTU0MERcdTc5RjAnIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ1x1NjI0MFx1NUM1RVx1NUJBMlx1NjIzNycgfSxcbiAgICAgIGNybV9vcHBvcnR1bml0eTogeyBsYWJlbDogJ1x1NTE3M1x1ODA1NFx1NTU0Nlx1NjczQScgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1NzJCNlx1NjAwMScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkcmFmdDogJ1x1ODM0OVx1N0EzRicsIGluX3JldmlldzogJ1x1NUJBMVx1NjgzOFx1NEUyRCcsIHByZXNlbnRlZDogJ1x1NURGMlx1NjNEMFx1NEVBNCcsIGFjY2VwdGVkOiAnXHU1REYyXHU2M0E1XHU1M0Q3JyxcbiAgICAgICAgICByZWplY3RlZDogJ1x1NURGMlx1NjJEMlx1N0VERCcsIGV4cGlyZWQ6ICdcdTVERjJcdThGQzdcdTY3MUYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRvdGFsX3ByaWNlOiB7IGxhYmVsOiAnXHU2MDNCXHU5MUQxXHU5ODlEJyB9LFxuICAgICAgZGlzY291bnQ6IHsgbGFiZWw6ICdcdTYyOThcdTYyNjMgKCUpJyB9LFxuICAgICAgZXhwaXJhdGlvbl9kYXRlOiB7IGxhYmVsOiAnXHU1MjMwXHU2NzFGXHU2NUU1XHU2NzFGJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdTYzQ0ZcdThGRjAnIH0sXG4gICAgICBjcm1fY29udGFjdDoge1xuICAgICAgICBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEVCQScsXG4gICAgICAgIGhlbHA6ICdcdTYyQTVcdTRFRjdcdThGREJcdTUxNjVcdTMwMENcdTVERjJcdTYzRDBcdTRFQTRcdTMwMERcdTYyMTZcdTMwMENcdTVERjJcdTYzQTVcdTUzRDdcdTMwMERcdTU0MEVcdTVGQzVcdTU4NkIgXHUyMDE0XHUyMDE0IFx1OEQ3N1x1ODM0OVx1NzY4NFx1NTQwOFx1NTQwQ1x1NEVDRVx1OEZEOVx1OTFDQ1x1NTNENlx1NEUzQlx1ODk4MVx1ODA1NFx1N0NGQlx1NEVCQVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdTYyQTVcdTRFRjdcdThEMUZcdThEMjNcdTRFQkEnIH0sXG4gICAgICBxdW90ZV9kYXRlOiB7IGxhYmVsOiAnXHU2MkE1XHU0RUY3XHU2NUU1XHU2NzFGJyB9LFxuICAgICAgc3VidG90YWw6IHsgbGFiZWw6ICdcdTVDMEZcdThCQTEnIH0sXG4gICAgICBkaXNjb3VudF9hbW91bnQ6IHsgbGFiZWw6ICdcdTYyOThcdTYyNjNcdTkxRDFcdTk4OUQnIH0sXG4gICAgICB0YXg6IHsgbGFiZWw6ICdcdTdBMEVcdTk4OUQnIH0sXG4gICAgICBzaGlwcGluZ19oYW5kbGluZzogeyBsYWJlbDogJ1x1OEZEMFx1OEQzOVx1NTNDQVx1NjI0Qlx1N0VFRFx1OEQzOScgfSxcbiAgICAgIHBheW1lbnRfdGVybXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTRFRDhcdTZCM0VcdTY3NjFcdTZCM0UnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbmV0XzE1OiAnMTUgXHU1OTI5XHU4RDI2XHU2NzFGJywgbmV0XzMwOiAnMzAgXHU1OTI5XHU4RDI2XHU2NzFGJywgbmV0XzYwOiAnNjAgXHU1OTI5XHU4RDI2XHU2NzFGJyxcbiAgICAgICAgICBuZXRfOTA6ICc5MCBcdTU5MjlcdThEMjZcdTY3MUYnLCBkdWVfb25fcmVjZWlwdDogJ1x1OEQyN1x1NTIzMFx1NEVEOFx1NkIzRScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc2hpcHBpbmdfdGVybXM6IHsgbGFiZWw6ICdcdThGRDBcdThGOTNcdTY3NjFcdTZCM0UnIH0sXG4gICAgICBiaWxsaW5nX2FkZHJlc3M6IHsgbGFiZWw6ICdcdThEMjZcdTUzNTVcdTU3MzBcdTU3NDAnIH0sXG4gICAgICBzaGlwcGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnXHU2NTM2XHU4RDI3XHU1NzMwXHU1NzQwJyB9LFxuICAgICAgaW50ZXJuYWxfbm90ZXM6IHsgbGFiZWw6ICdcdTUxODVcdTkwRThcdTU5MDdcdTZDRTgnIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnXHU2NjNFXHU3OTNBXHU1NDBEXHU3OUYwJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfcXVvdGVzOiB7IGxhYmVsOiAnXHU1MTY4XHU5MEU4XHU2MkE1XHU0RUY3XHU1MzU1JyB9LFxuICAgICAgcXVvdGVfcGlwZWxpbmU6IHsgbGFiZWw6ICdcdTYyQTVcdTRFRjdcdTZENDFcdTZDMzRcdTdFQkYnIH0sXG4gICAgICBxdW90ZV9jYWxlbmRhcjogeyBsYWJlbDogJ1x1NjJBNVx1NEVGN1x1NjVFNVx1NTM4NicgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTYyQTVcdTRFRjdcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBwcmljaW5nOiB7IGxhYmVsOiAnXHU0RUY3XHU2ODNDJyB9LFxuICAgICAgdGVybXM6IHsgbGFiZWw6ICdcdTY3NjFcdTZCM0VcdTRFMEVcdTY3MDlcdTY1NDhcdTY3MUYnIH0sXG4gICAgICBhZGRyZXNzOiB7IGxhYmVsOiAnXHU1NzMwXHU1NzQwJyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnXHU3Q0ZCXHU3RURGJyB9LFxuICAgICAgLy8gcXVvdGUudmlldy50cyBcdTg4NjhcdTUzNTVcdTUzM0FcdTU3NTdcdTU0MERcdTc5RjAgKCMxMTAwKVxuICAgICAgcXVvdGU6IHsgbGFiZWw6ICdcdTYyQTVcdTRFRjdcdTUzNTUnIH0sXG4gICAgICB0b3RhbHM6IHsgbGFiZWw6ICdcdTU0MDhcdThCQTEnIH0sXG4gICAgICBxdW90ZV90ZXJtczogeyBsYWJlbDogJ1x1Njc2MVx1NkIzRScgfSxcbiAgICAgIGFkZHJlc3Nlc19hbmRfbm90ZXM6IHsgbGFiZWw6ICdcdTU3MzBcdTU3NDBcdTRFMEVcdTU5MDdcdTZDRTgnIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX3F1b3RlX2xpbmVfaXRlbToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgZGlzY291bnRfd2l0aGluX2NlaWxpbmc6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1ODg0Q1x1NjI5OFx1NjI2M1x1NEUwRFx1ODBGRFx1OEQ4NVx1OEZDNyA2MCUnLFxuICAgICAgfSxcbiAgICAgIHVuaXRfcHJpY2VfcG9zaXRpdmU6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1OTUwMFx1NTUyRVx1NEVGN1x1NjgzQ1x1NEUwRFx1ODBGRFx1NEUzQVx1OEQxRlx1NjU3MCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdcdTYyQTVcdTRFRjdcdTUzNTVcdTY2MEVcdTdFQzYnLFxuICAgIHBsdXJhbExhYmVsOiAnXHU2MkE1XHU0RUY3XHU1MzU1XHU2NjBFXHU3RUM2JyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1NjJBNVx1NEVGN1x1NTM1NVx1NEUwQlx1NjMwOVx1NEVBN1x1NTRDMVx1NjJDNlx1NTIwNlx1NzY4NFx1NjJBNVx1NEVGN1x1ODg0QycsXG4gICAgZmllbGRzOiB7XG4gICAgICBjcm1fcXVvdGU6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTYyQTVcdTRFRjdcdTUzNTUnIH0sXG4gICAgICBjcm1fcHJvZHVjdDogeyBsYWJlbDogJ1x1NEVBN1x1NTRDMScgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU2M0NGXHU4RkYwJyB9LFxuICAgICAgcXVhbnRpdHk6IHsgbGFiZWw6ICdcdTY1NzBcdTkxQ0YnIH0sXG4gICAgICBsaXN0X3ByaWNlOiB7IGxhYmVsOiAnXHU2ODA3XHU0RUY3JyB9LFxuICAgICAgdW5pdF9wcmljZTogeyBsYWJlbDogJ1x1OTUwMFx1NTUyRVx1NTM1NVx1NEVGNycgfSxcbiAgICAgIGRpc2NvdW50OiB7IGxhYmVsOiAnXHU2Mjk4XHU2MjYzXHVGRjA4JVx1RkYwOScgfSxcbiAgICAgIHN1YnRvdGFsOiB7IGxhYmVsOiAnXHU1QzBGXHU4QkExJyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdcdTYwM0JcdThCQTEnIH0sXG4gICAgICBsaW5lX251bWJlcjogeyBsYWJlbDogJ1x1ODg0Q1x1NTNGNycgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTY2MEVcdTdFQzZcdTg4NEMnIH0sXG4gICAgICBwcmljaW5nOiB7IGxhYmVsOiAnXHU0RUY3XHU2ODNDJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9jb250cmFjdDoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgZW5kX2FmdGVyX3N0YXJ0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTdFRDNcdTY3NUZcdTY1RTVcdTY3MUZcdTVGQzVcdTk4N0JcdTY2NUFcdTRFOEVcdTVGMDBcdTU5Q0JcdTY1RTVcdTY3MUYnLFxuICAgICAgfSxcbiAgICAgIGNvbnRyYWN0X3N0YXR1c19wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU2NUUwXHU2NTQ4XHU3Njg0XHU1NDA4XHU1NDBDXHU3MkI2XHU2MDAxXHU2RDQxXHU4RjZDJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NTQwOFx1NTQwQycsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTU0MDhcdTU0MEMnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU0RTBFXHU1QkEyXHU2MjM3XHU3QjdFXHU3RjcyXHU3Njg0XHU2Q0Q1XHU1RjhCXHU1NDA4XHU1NDBDJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNvbnRyYWN0X251bWJlcjogeyBsYWJlbDogJ1x1NTQwOFx1NTQwQ1x1N0YxNlx1NTNGNycgfSxcbiAgICAgIGNybV9hY2NvdW50OiB7IGxhYmVsOiAnXHU2MjQwXHU1QzVFXHU1QkEyXHU2MjM3JyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3MkI2XHU2MDAxJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGRyYWZ0OiAnXHU4MzQ5XHU3QTNGJywgaW5fYXBwcm92YWw6ICdcdTVCQTFcdTYyNzlcdTRFMkQnLCBhY3RpdmF0ZWQ6ICdcdTVERjJcdTZGQzBcdTZEM0InLFxuICAgICAgICAgIGV4cGlyZWQ6ICdcdTVERjJcdThGQzdcdTY3MUYnLCB0ZXJtaW5hdGVkOiAnXHU1REYyXHU3RUM4XHU2QjYyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGFydF9kYXRlOiB7IGxhYmVsOiAnXHU1RjAwXHU1OUNCXHU2NUU1XHU2NzFGJyB9LFxuICAgICAgZW5kX2RhdGU6IHsgbGFiZWw6ICdcdTdFRDNcdTY3NUZcdTY1RTVcdTY3MUYnIH0sXG4gICAgICBjb250cmFjdF92YWx1ZTogeyBsYWJlbDogJ1x1NTQwOFx1NTQwQ1x1OTFEMVx1OTg5RCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU2M0NGXHU4RkYwJyB9LFxuICAgICAgY3JtX2NvbnRhY3Q6IHsgbGFiZWw6ICdcdTRFM0JcdTg5ODFcdTgwNTRcdTdDRkJcdTRFQkEnIH0sXG4gICAgICBjcm1fb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTU1NDZcdTY3M0EnIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1NTQwOFx1NTQwQ1x1OEQxRlx1OEQyM1x1NEVCQScgfSxcbiAgICAgIGNvbnRyYWN0X3Rlcm1fbW9udGhzOiB7IGxhYmVsOiAnXHU1NDA4XHU1NDBDXHU2NzFGXHU5NjUwXHVGRjA4XHU2NzA4XHVGRjA5JyB9LFxuICAgICAgYmlsbGluZ19mcmVxdWVuY3k6IHtcbiAgICAgICAgbGFiZWw6ICdcdThCQTFcdThEMzlcdTU0NjhcdTY3MUYnLFxuICAgICAgICBvcHRpb25zOiB7IG1vbnRobHk6ICdcdTYzMDlcdTY3MDgnLCBxdWFydGVybHk6ICdcdTYzMDlcdTVCNjNcdTVFQTYnLCBhbm51YWxseTogJ1x1NjMwOVx1NUU3NCcsIG9uZV90aW1lOiAnXHU0RTAwXHU2QjIxXHU2MDI3JyB9LFxuICAgICAgfSxcbiAgICAgIHBheW1lbnRfdGVybXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTRFRDhcdTZCM0VcdTY3NjFcdTZCM0UnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbmV0XzE1OiAnMTUgXHU1OTI5XHU4RDI2XHU2NzFGJywgbmV0XzMwOiAnMzAgXHU1OTI5XHU4RDI2XHU2NzFGJywgbmV0XzYwOiAnNjAgXHU1OTI5XHU4RDI2XHU2NzFGJyxcbiAgICAgICAgICBuZXRfOTA6ICc5MCBcdTU5MjlcdThEMjZcdTY3MUYnLCBkdWVfb25fcmVjZWlwdDogJ1x1OEQyN1x1NTIzMFx1NEVEOFx1NkIzRScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXV0b19yZW5ld2FsOiB7IGxhYmVsOiAnXHU4MUVBXHU1MkE4XHU3RUVEXHU3RUE2JyB9LFxuICAgICAgcmVuZXdhbF9ub3RpY2VfZGF5czogeyBsYWJlbDogJ1x1N0VFRFx1N0VBNlx1OTAxQVx1NzdFNVx1RkYwOFx1NTkyOVx1RkYwOScgfSxcbiAgICAgIGNvbnRyYWN0X3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTU0MDhcdTU0MENcdTdDN0JcdTU3OEInLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uOiAnXHU4QkEyXHU5NjA1XHU1NDA4XHU1NDBDJywgc2VydmljZTogJ1x1NjcwRFx1NTJBMVx1NTM0Rlx1OEJBRScsIGxpY2Vuc2U6ICdcdTYzODhcdTY3NDNcdThCQjhcdTUzRUYnLFxuICAgICAgICAgIHBhcnRuZXJzaGlwOiAnXHU1NDA4XHU0RjVDXHU1MzRGXHU4QkFFJywgbmRhOiAnXHU0RkREXHU1QkM2XHU1MzRGXHU4QkFFJywgbXNhOiAnXHU0RTNCXHU2NzBEXHU1MkExXHU1MzRGXHU4QkFFJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzaWduZWRfZGF0ZTogeyBsYWJlbDogJ1x1N0I3RVx1N0Y3Mlx1NjVFNVx1NjcxRicgfSxcbiAgICAgIHNpZ25lZF9ieTogeyBsYWJlbDogJ1x1N0I3RVx1N0Y3Mlx1NEVCQScgfSxcbiAgICAgIGRvY3VtZW50X3VybDogeyBsYWJlbDogJ1x1NTQwOFx1NTQwQ1x1NjU4N1x1Njg2MycgfSxcbiAgICAgIHNwZWNpYWxfdGVybXM6IHsgbGFiZWw6ICdcdTcyNzlcdTZCOEFcdTY3NjFcdTZCM0UnIH0sXG4gICAgICBiaWxsaW5nX2FkZHJlc3M6IHsgbGFiZWw6ICdcdThEMjZcdTUzNTVcdTU3MzBcdTU3NDAnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9jb250cmFjdHM6IHsgbGFiZWw6ICdcdTUxNjhcdTkwRThcdTU0MDhcdTU0MEMnIH0sXG4gICAgICByZW5ld2FsX2NhbGVuZGFyOiB7IGxhYmVsOiAnXHU3RUVEXHU3RUE2XHU2NUU1XHU1Mzg2JyB9LFxuICAgICAgY29udHJhY3RfZ2FudHQ6IHsgbGFiZWw6ICdcdTU0MDhcdTU0MENcdTY3NjFcdTZCM0UnIH0sXG4gICAgICBjb250cmFjdF90aW1lbGluZTogeyBsYWJlbDogJ1x1NTQwOFx1NTQwQ1x1NjVGNlx1OTVGNFx1N0VCRicgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTU0MDhcdTU0MENcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBwYXJ0aWVzOiB7IGxhYmVsOiAnXHU3QjdFXHU3RUE2XHU2NUI5JyB9LFxuICAgICAgdGVybXM6IHsgbGFiZWw6ICdcdTY3NjFcdTZCM0VcdTRFMEVcdTY1RTVcdTY3MUYnIH0sXG4gICAgICB2YWx1ZTogeyBsYWJlbDogJ1x1NTQwOFx1NTQwQ1x1OTFEMVx1OTg5RCcgfSxcbiAgICAgIHN0YXR1czogeyBsYWJlbDogJ1x1NzJCNlx1NjAwMVx1NEUwRVx1NUJBMVx1NjI3OScgfSxcbiAgICAgIHJlbmV3YWw6IHsgbGFiZWw6ICdcdTdFRURcdTdFQTYnIH0sXG4gICAgICAvLyBjb250cmFjdC52aWV3LnRzIFx1ODg2OFx1NTM1NVx1NTMzQVx1NTc1N1x1NTQwRFx1NzlGMCAoIzExMDApXG4gICAgICBjb250cmFjdF90ZXJtczogeyBsYWJlbDogJ1x1Njc2MVx1NkIzRScgfSxcbiAgICAgIHNpZ25pbmdfYW5kX2RvY3VtZW50czogeyBsYWJlbDogJ1x1N0I3RVx1N0Y3Mlx1NEUwRVx1NjU4N1x1NEVGNicgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHU1OTA3XHU2Q0U4JyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9wcm9kdWN0OiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBjb3N0X2xlc3NfdGhhbl9wcmljZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU2MjEwXHU2NzJDXHU1RTk0XHU0RjRFXHU0RThFXHU2ODA3XHU0RUY3JyxcbiAgICAgIH0sXG4gICAgICBwcmljZV9wb3NpdGl2ZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU2ODA3XHU0RUY3XHU1RkM1XHU5ODdCXHU0RTNBXHU2QjYzXHU2NTcwJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NEVBN1x1NTRDMScsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTRFQTdcdTU0QzEnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU1MTZDXHU1M0Y4XHU2M0QwXHU0RjlCXHU3Njg0XHU0RUE3XHU1NEMxXHU0RTBFXHU2NzBEXHU1MkExJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIHByb2R1Y3RfY29kZTogeyBsYWJlbDogJ1x1NEVBN1x1NTRDMVx1NEVFM1x1NzgwMScgfSxcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdcdTRFQTdcdTU0QzFcdTU0MERcdTc5RjAnIH0sXG4gICAgICBjYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ1x1NEVBN1x1NTRDMVx1N0M3Qlx1NTIyQicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBzb2Z0d2FyZTogJ1x1OEY2Rlx1NEVGNicsIGhhcmR3YXJlOiAnXHU3ODZDXHU0RUY2Jywgc2VydmljZTogJ1x1NjcwRFx1NTJBMScsXG4gICAgICAgICAgc3Vic2NyaXB0aW9uOiAnXHU4QkEyXHU5NjA1Jywgc3VwcG9ydDogJ1x1NjUyRlx1NjMwMVx1NjcwRFx1NTJBMScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29zdDogeyBsYWJlbDogJ1x1NjIxMFx1NjcyQycgfSxcbiAgICAgIGlzX2FjdGl2ZTogeyBsYWJlbDogJ1x1NjYyRlx1NTQyNlx1NTQyRlx1NzUyOCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU2M0NGXHU4RkYwJyB9LFxuICAgICAgZmFtaWx5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RUE3XHU1NEMxXHU3Q0ZCXHU1MjE3JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGVudGVycHJpc2U6ICdcdTRGMDFcdTRFMUFcdTdFQTdcdTY1QjlcdTY4NDgnLCBzbWI6ICdcdTRFMkRcdTVDMEZcdTRGMDFcdTRFMUFcdTY1QjlcdTY4NDgnLFxuICAgICAgICAgIHNlcnZpY2VzOiAnXHU0RTEzXHU0RTFBXHU2NzBEXHU1MkExJywgY2xvdWQ6ICdcdTRFOTFcdTY3MERcdTUyQTEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxpc3RfcHJpY2U6IHsgbGFiZWw6ICdcdTY4MDdcdTRFRjcnIH0sXG4gICAgICBza3U6IHsgbGFiZWw6ICdTS1UnIH0sXG4gICAgICBwcm9kdWN0X21hbmFnZXI6IHsgbGFiZWw6ICdcdTRFQTdcdTU0QzFcdTdFQ0ZcdTc0MDYnIH0sXG4gICAgICBpbWFnZTogeyBsYWJlbDogJ1x1NEVBN1x1NTRDMVx1NTZGRVx1NzI0NycgfSxcbiAgICAgIGRhdGFzaGVldDogeyBsYWJlbDogJ1x1ODlDNFx1NjgzQ1x1NEU2NicgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTY2M0VcdTc5M0FcdTU0MERcdTc5RjAnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9wcm9kdWN0czogeyBsYWJlbDogJ1x1NTE2OFx1OTBFOFx1NEVBN1x1NTRDMScgfSxcbiAgICAgIHByb2R1Y3RfY2F0YWxvZzogeyBsYWJlbDogJ1x1NEVBN1x1NTRDMVx1NzZFRVx1NUY1NScgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTRFQTdcdTU0QzFcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBwcmljaW5nOiB7IGxhYmVsOiAnXHU0RUY3XHU2ODNDJyB9LFxuICAgICAgbWV0YWRhdGE6IHsgbGFiZWw6ICdcdThENDRcdTZFOTAnIH0sXG4gICAgICAvLyBwcm9kdWN0LnZpZXcudHMgXHU4ODY4XHU1MzU1XHU1MzNBXHU1NzU3XHU1NDBEXHU3OUYwICgjMTEwMClcbiAgICAgIHByb2R1Y3RfaW5mbzogeyBsYWJlbDogJ1x1NEVBN1x1NTRDMVx1NEZFMVx1NjA2RicgfSxcbiAgICAgIHByaWNpbmdfaW5mbzogeyBsYWJlbDogJ1x1NUI5QVx1NEVGNycgfSxcbiAgICAgIG1lZGlhOiB7IGxhYmVsOiAnXHU1QTkyXHU0RjUzJyB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOL29iamVjdHMuc2VydmljZS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ05cIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOL29iamVjdHMuc2VydmljZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG5pbXBvcnQgeyBhY3Rpdml0eUFjdGlvbnMgfSBmcm9tICcuL19zaGFyZWQnO1xuXG4vKipcbiAqIFx1N0I4MFx1NEY1M1x1NEUyRFx1NjU4NyAoemgtQ04pIFx1MjAxNCBgb2JqZWN0c2AgdHJhbnNsYXRpb25zIGZvciB0aGUgU0VSVklDRSBmYW1pbHk6XG4gKiBwb3N0LXNhbGUgc3VwcG9ydCBcdTIwMTQgY2FzZXMgYW5kIHRoZSBrbm93bGVkZ2UgdGhhdCBkZWZsZWN0cyB0aGVtLlxuICpcbiAqIFJvc3RlcjogYGNybV9jYXNlYCwgYGNybV9rbm93bGVkZ2VfYXJ0aWNsZWAsIGBjcm1fYXJ0aWNsZV9mZWVkYmFja2AuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04udHNgLlxuICovXG5leHBvcnQgY29uc3Qgc2VydmljZTogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX2Nhc2U6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIHJlc29sdXRpb25fcmVxdWlyZWRfZm9yX2Nsb3NlZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU1MTczXHU5NUVEXHU1REU1XHU1MzU1XHU2NUY2XHU1RkM1XHU5ODdCXHU1ODZCXHU1MTk5XHU4OUUzXHU1MUIzXHU2NUI5XHU2ODQ4JyxcbiAgICAgIH0sXG4gICAgICBlc2NhbGF0aW9uX3JlYXNvbl9yZXF1aXJlZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU1MzQ3XHU3RUE3XHU1REU1XHU1MzU1XHU2NUY2XHU1RkM1XHU5ODdCXHU1ODZCXHU1MTk5XHU1MzQ3XHU3RUE3XHU1MzlGXHU1NkUwJyxcbiAgICAgIH0sXG4gICAgICBjYXNlX3N0YXR1c19wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU2NUUwXHU2NTQ4XHU3Njg0XHU3MkI2XHU2MDAxXHU2RDQxXHU4RjZDJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NURFNVx1NTM1NScsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTVERTVcdTUzNTUnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU1QkEyXHU2MjM3XHU2NTJGXHU2MzAxXHU1REU1XHU1MzU1XHU0RTBFXHU2NzBEXHU1MkExXHU4QkY3XHU2QzQyJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNhc2VfbnVtYmVyOiB7IGxhYmVsOiAnXHU1REU1XHU1MzU1XHU3RjE2XHU1M0Y3JyB9LFxuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1x1NEUzQlx1OTg5OCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU2M0NGXHU4RkYwJyB9LFxuICAgICAgY3JtX2FjY291bnQ6IHsgbGFiZWw6ICdcdTYyNDBcdTVDNUVcdTVCQTJcdTYyMzcnIH0sXG4gICAgICBjcm1fY29udGFjdDogeyBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEVCQScgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1NzJCNlx1NjAwMScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBuZXc6ICdcdTY1QjBcdTVFRkEnLCBpbl9wcm9ncmVzczogJ1x1NTkwNFx1NzQwNlx1NEUyRCcsXG4gICAgICAgICAgd2FpdGluZ19jdXN0b21lcjogJ1x1N0I0OVx1NUY4NVx1NUJBMlx1NjIzN1x1NTZERVx1NTkwRCcsIHdhaXRpbmdfc3VwcG9ydDogJ1x1N0I0OVx1NUY4NVx1NjUyRlx1NjMwMVx1NTZERVx1NTkwRCcsXG4gICAgICAgICAgZXNjYWxhdGVkOiAnXHU1REYyXHU1MzQ3XHU3RUE3JywgcmVzb2x2ZWQ6ICdcdTVERjJcdTg5RTNcdTUxQjMnLCBjbG9zZWQ6ICdcdTVERjJcdTUxNzNcdTk1RUQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHByaW9yaXR5OiB7XG4gICAgICAgIC8vIGBjcml0aWNhbGAgTVVTVCBOT1QgcmVuZGVyIFx1N0QyN1x1NjAyNSBcdTIwMTQgdGhhdCB3b3JkIGJlbG9uZ3MgdG9cbiAgICAgICAgLy8gYGNybV90YXNrLnByaW9yaXR5LnVyZ2VudGAsIGFuZCB0aGUgdHdvIHZvY2FidWxhcmllcyBhcmUgZGlmZmVyZW50XG4gICAgICAgIC8vIHNldHMgKGNhc2U6IGxvdy9tZWRpdW0vaGlnaC9jcml0aWNhbCBcdTAwQjcgdGFzazogbG93L25vcm1hbC9oaWdoL3VyZ2VudCkuXG4gICAgICAgIC8vIFdoZW4gYm90aCByZW5kZXJlZCBcdTdEMjdcdTYwMjUgdGhlIHNjcmVlbiBzaG93ZWQgb25lIHdvcmQgZm9yIHR3byB2YWx1ZXMgdGhlXG4gICAgICAgIC8vIG1vZGVsIHRyZWF0cyBhcyBkaXN0aW5jdCwgd2hpY2ggaXMgaG93IGEgY2FzZSB2YWx1ZSBlbmRzIHVwIGluIGEgdGFza1xuICAgICAgICAvLyBwcmVkaWNhdGUgKGBzcmMvc2FsZXMvdmlld3MvdGFzay52aWV3LnRzYCBjYXJyaWVzIHRoZSB0b21ic3RvbmUgb2YgdGhhdFxuICAgICAgICAvLyBjcm9zc2luZykuIE1haW50YWluZXIgcnVsaW5nIDIwMjYtMDgtMzEsICMxMzQyOiBjYXNlIGBjcml0aWNhbGAgaXNcbiAgICAgICAgLy8gXHU0RTI1XHU5MUNELCB0YXNrIGB1cmdlbnRgIGtlZXBzIFx1N0QyN1x1NjAyNS4gZW4vZXMtRVMvamEtSlAgYWxyZWFkeSBzZXBhcmF0ZSB0aGVtXG4gICAgICAgIC8vIChDcml0aWNhbC9VcmdlbnQgXHUwMEI3IENyXHUwMEVEdGljYS9VcmdlbnRlIFx1MDBCNyBcdTkxQ0RcdTU5MjcvXHU3RENBXHU2MDI1KTsgemgtQ04gd2FzIHRoZSBvdXRsaWVyLlxuICAgICAgICBsYWJlbDogJ1x1NEYxOFx1NTE0OFx1N0VBNycsXG4gICAgICAgIG9wdGlvbnM6IHsgbG93OiAnXHU0RjRFJywgbWVkaXVtOiAnXHU0RTJEJywgaGlnaDogJ1x1OUFEOCcsIGNyaXRpY2FsOiAnXHU0RTI1XHU5MUNEJyB9LFxuICAgICAgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTdDN0JcdTU3OEInLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcXVlc3Rpb246ICdcdTU0QThcdThCRTInLCBwcm9ibGVtOiAnXHU2NTQ1XHU5NjlDJywgZmVhdHVyZV9yZXF1ZXN0OiAnXHU1MjlGXHU4MEZEXHU5NzAwXHU2QzQyJywgYnVnOiAnXHU3RjNBXHU5Njc3JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1OEQxRlx1OEQyM1x1NEVCQScgfSxcbiAgICAgIG9yaWdpbjoge1xuICAgICAgICBsYWJlbDogJ1x1NURFNVx1NTM1NVx1Njc2NVx1NkU5MCcsXG4gICAgICAgIG9wdGlvbnM6IHsgZW1haWw6ICdcdTkwQUVcdTRFRjYnLCBwaG9uZTogJ1x1NzUzNVx1OEJERCcsIHdlYjogJ1x1N0Y1MVx1N0FEOScsIGNoYXQ6ICdcdTU3MjhcdTdFQkZcdTVCQTJcdTY3MEQnLCBzb2NpYWxfbWVkaWE6ICdcdTc5M0VcdTRFQTRcdTVBOTJcdTRGNTMnIH0sXG4gICAgICB9LFxuICAgICAgY2xvc2VkX2RhdGU6IHsgbGFiZWw6ICdcdTUxNzNcdTk1RURcdTY1RTVcdTY3MUYnIH0sXG4gICAgICBmaXJzdF9yZXNwb25zZV9kYXRlOiB7IGxhYmVsOiAnXHU5OTk2XHU2QjIxXHU1NENEXHU1RTk0XHU2NUU1XHU2NzFGJyB9LFxuICAgICAgcmVzb2x1dGlvbl90aW1lX2hvdXJzOiB7IGxhYmVsOiAnXHU4OUUzXHU1MUIzXHU4MDE3XHU2NUY2XHVGRjA4XHU1QzBGXHU2NUY2XHVGRjA5JyB9LFxuICAgICAgc2xhX2R1ZV9kYXRlOiB7IGxhYmVsOiAnU0xBIFx1NTIzMFx1NjcxRicsIGhlbHA6ICdcdTYzMDlcdTVERTVcdTUzNTVcdTRGMThcdTUxNDhcdTdFQTdcdTRFMEVcdTYyNDBcdTVDNUVcdTVCQTJcdTYyMzdcdTc2ODRcdTVCQTJcdTYyMzdcdTUyMDZcdTVDNDJcdThCQkVcdTVCOUFcdUZGMENcdTRFRTVcdTY1RTVcdTUzODZcdTVDMEZcdTY1RjZcdThCQTFcdUZGMUFcdTU5MUNcdTk1RjRcdTMwMDFcdTU0NjhcdTY3MkJcdTRFMEVcdTgyODJcdTUwNDdcdTY1RTVcdTkwRkRcdThCQTFcdTUxNjVcdTMwMDInIH0sXG4gICAgICBpc19zbGFfdmlvbGF0ZWQ6IHsgbGFiZWw6ICdTTEEgXHU4RkREXHU1M0NEJyB9LFxuICAgICAgaXNfZXNjYWxhdGVkOiB7IGxhYmVsOiAnXHU1REYyXHU1MzQ3XHU3RUE3JyB9LFxuICAgICAgZXNjYWxhdGlvbl9yZWFzb246IHsgbGFiZWw6ICdcdTUzNDdcdTdFQTdcdTUzOUZcdTU2RTAnIH0sXG4gICAgICByZXNvbHV0aW9uOiB7IGxhYmVsOiAnXHU4OUUzXHU1MUIzXHU2NUI5XHU2ODQ4JyB9LFxuICAgICAgcmVzb2x2ZWRfYnlfYXJ0aWNsZTogeyBsYWJlbDogJ1x1ODlFM1x1NTFCM1x1OEJFNVx1NURFNVx1NTM1NVx1NzY4NFx1NzdFNVx1OEJDNlx1NjU4N1x1N0FFMCcsIGhlbHA6ICdcdTg5RTNcdTUxQjNcdTZCNjRcdTVERTVcdTUzNTVcdTc2ODRcdTc3RTVcdThCQzZcdTVFOTNcdTY1ODdcdTdBRTAgXHUyMDE0XHUyMDE0IFx1OEY2Q1x1NzlGQlx1NzM4N1x1NzY4NFx1N0VERlx1OEJBMVx1NTNFM1x1NUY4NFx1MzAwMicgfSxcbiAgICAgIGludGVybmFsX25vdGVzOiB7IGxhYmVsOiAnXHU1MTg1XHU5MEU4XHU1OTA3XHU2Q0U4JywgaGVscDogJ1x1NTE4NVx1OTBFOFx1NTkwN1x1NkNFOFx1RkYwQ1x1NUJBMlx1NjIzN1x1NEUwRFx1NTNFRlx1ODlDMScgfSxcbiAgICAgIGlzX2Nsb3NlZDogeyBsYWJlbDogJ1x1NjYyRlx1NTQyNlx1NTE3M1x1OTVFRCcgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTY2M0VcdTc5M0FcdTU0MERcdTc5RjAnIH0sXG4gICAgICBwcmlvcml0eV9yYW5rOiB7IGxhYmVsOiAnXHU0RjE4XHU1MTQ4XHU3RUE3XHU2MzkyXHU1RThGJyB9LFxuICAgICAgZXNjYWxhdGVkX2RhdGU6IHsgbGFiZWw6ICdcdTUzNDdcdTdFQTdcdTY1RTVcdTY3MUYnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9jYXNlczogeyBsYWJlbDogJ1x1NTE2OFx1OTBFOFx1NURFNVx1NTM1NScgfSxcbiAgICAgIGNhc2Vfd29ya2Zsb3c6IHsgbGFiZWw6ICdcdTY3MERcdTUyQTFcdTZENDFcdThGNkMnIH0sXG4gICAgICBzbGFfY2FsZW5kYXI6IHsgbGFiZWw6ICdTTEEgXHU2NUU1XHU1Mzg2JyB9LFxuICAgICAgY2FzZV90aW1lbGluZTogeyBsYWJlbDogJ1x1NURFNVx1NTM1NVx1NjVGNlx1OTVGNFx1N0VCRicgfSxcbiAgICAgIHVuYXNzaWduZWRfdHJpYWdlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU2NzJBXHU1MjA2XHU2RDNFIFx1MjAxNCBcdTVGODVcdTUyMDZcdThCQ0EnLFxuICAgICAgICBlbXB0eVN0YXRlOiB7XG4gICAgICAgICAgdGl0bGU6ICdcdTZDQTFcdTY3MDlcdTVGODVcdTUyMDZcdThCQ0FcdTc2ODRcdTVERTVcdTUzNTUnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdcdTYyNDBcdTY3MDlcdTVERTVcdTUzNTVcdTkwRkRcdTY3MDlcdThEMUZcdThEMjNcdTRFQkFcdTMwMDJcdTVGNTNcdTVERTVcdTUzNTVcdTUyMzBcdThGQkVcdTY1RjZcdTZDQTFcdTY3MDlcdThEMUZcdThEMjNcdTRFQkFcdUZGMENcdTVDMzFcdTRGMUFcdTUxRkFcdTczQjBcdTU3MjhcdThGRDlcdTkxQ0MgXHUyMDE0XHUyMDE0IFx1OTAxQVx1NUUzOFx1NjYyRlx1NTcyOFx1NjVFMFx1NEVCQVx1NjJDNVx1NEVGQlx1MzAwQ1x1NUJBMlx1NjcwRFx1NEUxM1x1NTQ1OFx1MzAwRFx1ODA0Q1x1NEY0RFx1NjcxRlx1OTVGNFx1NjNEMFx1NEVBNFx1NzY4NFx1N0Y1MVx1OTg3NVx1OEY2Q1x1NURFNVx1NTM1NVx1MzAwMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZXNjYWxhdGVkX2Nhc2VzOiB7IGxhYmVsOiAnXHU1REYyXHU1MzQ3XHU3RUE3XHU1REU1XHU1MzU1JyB9LFxuICAgICAgbXlfb3Blbl9jYXNlczogeyBsYWJlbDogJ1x1NjIxMVx1NzY4NFx1NUY4NVx1NTkwNFx1NzQwNlx1NURFNVx1NTM1NScgfSxcbiAgICAgIHNsYV9hdF9yaXNrOiB7IGxhYmVsOiAnXHUyM0YwIFNMQSBcdTk4Q0VcdTk2NjlcdTk4ODRcdThCNjYnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgZXNjYWxhdGVfY2FzZToge1xuICAgICAgICBsYWJlbDogJ1x1NTM0N1x1N0VBN1x1NURFNVx1NTM1NScsXG4gICAgICAgIGNvbmZpcm1UZXh0OiAnXHU2QjY0XHU2NENEXHU0RjVDXHU0RjFBXHU1QzA2XHU1REU1XHU1MzU1XHU1MzQ3XHU3RUE3XHU1MjMwXHU1MzQ3XHU3RUE3XHU1OTA0XHU3NDA2XHU1NkUyXHU5NjFGXHVGRjBDXHU2NjJGXHU1NDI2XHU3RUU3XHU3RUVEXHVGRjFGJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTVERTVcdTUzNTVcdTUzNDdcdTdFQTdcdTYyMTBcdTUyOUZcdUZGMDEnLFxuICAgICAgfSxcbiAgICAgIGNsb3NlX2Nhc2U6IHtcbiAgICAgICAgbGFiZWw6ICdcdTUxNzNcdTk1RURcdTVERTVcdTUzNTUnLFxuICAgICAgICBjb25maXJtVGV4dDogJ1x1Nzg2RVx1NUI5QVx1ODk4MVx1NTE3M1x1OTVFRFx1NkI2NFx1NURFNVx1NTM1NVx1NTQxN1x1RkYxRicsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1REU1XHU1MzU1XHU1REYyXHU2MjEwXHU1MjlGXHU1MTczXHU5NUVEXHVGRjAxJyxcbiAgICAgIH0sXG4gICAgICBjbGFpbV9jYXNlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU4QkE0XHU5ODg2XHU1REU1XHU1MzU1JyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTVERTVcdTUzNTVcdTVERjJcdThCQTRcdTk4ODZcdUZGMENcdTczQjBcdTU3MjhcdTVGNTJcdTRGNjBcdThEMUZcdThEMjNcdTMwMDInLFxuICAgICAgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgLy8gY2FzZS52aWV3LnRzIFx1ODg2OFx1NTM1NVx1NTMzQVx1NTc1N1x1NTQwRFx1NzlGMCAoIzExMDApXHUzMDAyXG4gICAgICBjYXNlOiB7IGxhYmVsOiAnXHU1REU1XHU1MzU1JyB9LFxuICAgICAgaG93X2Nhbl93ZV9oZWxwOiB7IGxhYmVsOiAnXHU2MjExXHU0RUVDXHU4MEZEXHU1RTJFXHU2MEE4XHU0RUMwXHU0RTQ4XHVGRjFGJyB9LFxuICAgICAgLy8gT2JqZWN0LWxldmVsIHNlY3Rpb24ga2V5cyAoY2FzZS5vYmplY3QudHMpLCB1c2VkIGJ5IHJlY29yZCBmb3JtcyBhbmRcbiAgICAgIC8vIGJ5IHRoZSBkZXRhaWwgcGFnZSwgd2hvc2Ugc2VjdGlvbnMgcmVmZXJlbmNlIHRoZXNlIGdyb3VwcyAoIzk3MClcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnXHU1REU1XHU1MzU1XHU0RkUxXHU2MDZGJyB9LFxuICAgICAgb3JpZ2luOiB7IGxhYmVsOiAnXHU2NzY1XHU2RTkwXHU0RTBFXHU4REVGXHU3NTMxJyB9LFxuICAgICAgc2xhOiB7IGxhYmVsOiAnU0xBIFx1NEUwRVx1NEYxOFx1NTE0OFx1N0VBNycgfSxcbiAgICAgIHJlc29sdXRpb246IHsgbGFiZWw6ICdcdTg5RTNcdTUxQjNcdTY1QjlcdTY4NDgnIH0sXG4gICAgICBlc2NhbGF0aW9uOiB7IGxhYmVsOiAnXHU1MzQ3XHU3RUE3JyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnXHU3Q0ZCXHU3RURGJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9rbm93bGVkZ2VfYXJ0aWNsZToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgcHVibGlzaGVkX3JlcXVpcmVzX2JvZHk6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NkNBMVx1NjcwOVx1NkI2M1x1NjU4N1x1NzY4NFx1NjU4N1x1N0FFMFx1NjVFMFx1NkNENVx1NTNEMVx1NUUwM1x1MzAwMicsXG4gICAgICB9LFxuICAgICAgcHVibGlzaGVkX3JlcXVpcmVzX3N1bW1hcnk6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NURGMlx1NTNEMVx1NUUwM1x1NzY4NFx1NjU4N1x1N0FFMFx1NUU5NFx1NTg2Qlx1NTE5OVx1NjQ1OFx1ODk4MVx1RkYwQ1x1NEY5Qlx1NjQxQ1x1N0QyMlx1N0VEM1x1Njc5Q1x1NEUwRSBBSSBcdTVGMTVcdTc1MjhcdTRGN0ZcdTc1MjhcdTMwMDInLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU3N0U1XHU4QkM2XHU2NTg3XHU3QUUwJyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1NzdFNVx1OEJDNlx1NUU5MycsXG4gICAgZGVzY3JpcHRpb246ICdcdTk3NjJcdTU0MTFcdTVCQTJcdTYyMzdcdTU0OENcdTU3NTBcdTVFMkRcdTc2ODRcdTUzRUZcdTU5MERcdTc1MjhcdTk1RUVcdTdCNTRcdTRFMEVcdTY0Q0RcdTRGNUNcdTYzMDdcdTUzNTcnLFxuICAgIGZpZWxkczoge1xuICAgICAgYXJ0aWNsZV9udW1iZXI6IHsgbGFiZWw6ICdcdTY1ODdcdTdBRTBcdTdGMTZcdTUzRjcnIH0sXG4gICAgICB0aXRsZTogeyBsYWJlbDogJ1x1NjgwN1x1OTg5OCcgfSxcbiAgICAgIHN1bW1hcnk6IHsgbGFiZWw6ICdcdTY0NThcdTg5ODEnLCBoZWxwOiAnXHU0RTAwXHU2QkI1XHU4QkREXHU2NDU4XHU4OTgxXHVGRjBDXHU2NjNFXHU3OTNBXHU1NzI4XHU2NDFDXHU3RDIyXHU3RUQzXHU2NzlDXHU1NDhDIEFJIFx1NUYxNVx1NzUyOFx1NEUyRFx1MzAwMicgfSxcbiAgICAgIGJvZHk6IHsgbGFiZWw6ICdcdTZCNjNcdTY1ODcnLCBoZWxwOiAnXHU2NTg3XHU3QUUwXHU2QjYzXHU2NTg3XHVGRjA4TWFya2Rvd25cdUZGMDlcdTMwMDInIH0sXG4gICAgICBjYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ1x1NTIwNlx1N0M3QicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQ6ICdcdTUxNjVcdTk1RThcdTYzMDdcdTUzNTcnLCBob3dfdG86ICdcdTY0Q0RcdTRGNUNcdTYzMDdcdTUzNTcnLFxuICAgICAgICAgIHRyb3VibGVzaG9vdGluZzogJ1x1NjU0NVx1OTY5Q1x1NjM5Mlx1NjdFNScsIGJpbGxpbmc6ICdcdThEMjZcdTUyQTFcdTRFMEVcdTRFRjdcdTY4M0MnLCBhcGk6ICdBUEkgXHU0RTBFXHU5NkM2XHU2MjEwJyxcbiAgICAgICAgICByZWxlYXNlX25vdGVzOiAnXHU3MjQ4XHU2NzJDXHU4QkY0XHU2NjBFJyxcbiAgICAgICAgICBwb2xpY3k6ICdcdTY1M0ZcdTdCNTZcdTUyMzZcdTVFQTYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY4MDdcdTdCN0UnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYXV0aDogJ1x1OEVBQlx1NEVGRFx1OEJBNFx1OEJDMScsIHNzbzogJ1x1NTM1NVx1NzBCOVx1NzY3Qlx1NUY1NScsIG1vYmlsZTogJ1x1NzlGQlx1NTJBOFx1N0FFRicsIGVtYWlsOiAnXHU5MEFFXHU0RUY2JyxcbiAgICAgICAgICByZXBvcnRzOiAnXHU2MkE1XHU4ODY4JywgcGVyZm9ybWFuY2U6ICdcdTYwMjdcdTgwRkQnLCBkYXRhX2ltcG9ydDogJ1x1NjU3MFx1NjM2RVx1NUJGQ1x1NTE2NScsIHdlYmhvb2tzOiAnV2ViaG9vaycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3MkI2XHU2MDAxJyxcbiAgICAgICAgb3B0aW9uczogeyBkcmFmdDogJ1x1ODM0OVx1N0EzRicsIGluX3JldmlldzogJ1x1NUJBMVx1NjgzOFx1NEUyRCcsIHB1Ymxpc2hlZDogJ1x1NURGMlx1NTNEMVx1NUUwMycsIGFyY2hpdmVkOiAnXHU1REYyXHU1RjUyXHU2ODYzJyB9LFxuICAgICAgfSxcbiAgICAgIGF1ZGllbmNlOiB7IGxhYmVsOiAnXHU1M0Q3XHU0RjE3Jywgb3B0aW9uczogeyBwdWJsaWM6ICdcdTUxNkNcdTVGMDAnLCBpbnRlcm5hbDogJ1x1NEVDNVx1NTE4NVx1OTBFOCcgfSwgaGVscDogJ1x1NTE2Q1x1NUYwMFx1NjU4N1x1N0FFMFx1NTcyOFx1NUJBMlx1NjIzN1x1OTVFOFx1NjIzN1x1NTNFRlx1ODlDMVx1RkYxQlx1NTE4NVx1OTBFOFx1NjU4N1x1N0FFMFx1NEVDNVx1NUJBMlx1NjcwRFx1NTNFRlx1ODlDMVx1MzAwMicgfSxcbiAgICAgIGxhbmd1YWdlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU4QkVEXHU4QTAwJyxcbiAgICAgICAgb3B0aW9uczogeyBlbjogJ1x1ODJGMVx1OEJFRCcsIHpoX2NuOiAnXHU3QjgwXHU0RjUzXHU0RTJEXHU2NTg3JywgZXNfZXM6ICdcdTg5N0ZcdTczRURcdTcyNTlcdThCRUQnLCBqYV9qcDogJ1x1NjVFNVx1OEJFRCcgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1OEQxRlx1OEQyM1x1NEVCQScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY2FzZTogeyBsYWJlbDogJ1x1Njc2NVx1NkU5MFx1NURFNVx1NTM1NScsIGhlbHA6ICdcdTY3MkNcdTY1ODdcdTYyNDBcdTRGOURcdTYzNkVcdTc2ODRcdTVERTVcdTUzNTVcdUZGMDhcdTUzRUZcdTkwMDlcdUZGMDlcdTMwMDInIH0sXG4gICAgICBwdWJsaXNoZWRfYXQ6IHsgbGFiZWw6ICdcdTUzRDFcdTVFMDNcdTY1RjZcdTk1RjQnIH0sXG4gICAgICBsYXN0X3Jldmlld2VkX2F0OiB7IGxhYmVsOiAnXHU2NzAwXHU4RkQxXHU1OTBEXHU2ODM4JyB9LFxuICAgICAgaGVscGZ1bF9jb3VudDogeyBsYWJlbDogJ1x1NjcwOVx1NzUyOCcsIGhlbHA6ICdcdTc1MzEgY3JtX2FydGljbGVfZmVlZGJhY2sgXHU5MUNEXHU2NUIwXHU3RURGXHU4QkExXHU1Rjk3XHU1MUZBXHVGRjBDXHU0RTBEXHU1M0VGXHU2MjRCXHU1REU1XHU1ODZCXHU1MTk5XHUzMDAyJyB9LFxuICAgICAgbm90X2hlbHBmdWxfY291bnQ6IHsgbGFiZWw6ICdcdTZDQTFcdTc1MjgnLCBoZWxwOiAnXHU3NTMxIGNybV9hcnRpY2xlX2ZlZWRiYWNrIFx1OTFDRFx1NjVCMFx1N0VERlx1OEJBMVx1NUY5N1x1NTFGQVx1RkYwQ1x1NEUwRFx1NTNFRlx1NjI0Qlx1NURFNVx1NTg2Qlx1NTE5OVx1MzAwMicgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTY2M0VcdTc5M0FcdTU0MERcdTc5RjAnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9hcnRpY2xlczogeyBsYWJlbDogJ1x1NTE2OFx1OTBFOFx1NjU4N1x1N0FFMCcgfSxcbiAgICAgIHB1Ymxpc2hlZF9hcnRpY2xlczogeyBsYWJlbDogJ1x1NURGMlx1NTNEMVx1NUUwMycgfSxcbiAgICAgIG15X2RyYWZ0czogeyBsYWJlbDogJ1x1NjIxMVx1NzY4NFx1ODM0OVx1N0EzRicgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTY1ODdcdTdBRTBcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBjb250ZW50OiB7IGxhYmVsOiAnXHU1MTg1XHU1QkI5JyB9LFxuICAgICAgdGF4b25vbXk6IHsgbGFiZWw6ICdcdTUyMDZcdTdDN0InIH0sXG4gICAgICBtZXRyaWNzOiB7IGxhYmVsOiAnXHU0RTkyXHU1MkE4XHU2NTcwXHU2MzZFJyB9LFxuICAgICAgZW5nYWdlbWVudDogeyBsYWJlbDogJ1x1NEU5Mlx1NTJBOFx1NjU3MFx1NjM2RScgfSxcbiAgICAgIC8vIGtub3dsZWRnZV9hcnRpY2xlLnZpZXcudHMgXHU4ODY4XHU1MzU1XHU1MzNBXHU1NzU3XHU1NDBEXHU3OUYwICgjMTEwMClcbiAgICAgIGFydGljbGU6IHsgbGFiZWw6ICdcdTY1ODdcdTdBRTAnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgbWFya19hcnRpY2xlX2hlbHBmdWw6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY3MDlcdTc1MjgnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1NURGMlx1OEJCMFx1NUY1NVx1NEUzQVx1MzAwQ1x1NjcwOVx1NzUyOFx1MzAwRFx1RkYwQ1x1OEMyMlx1OEMyMlx1NTNDRFx1OTk4OFx1MzAwMicsXG4gICAgICB9LFxuICAgICAgbWFya19hcnRpY2xlX25vdF9oZWxwZnVsOiB7XG4gICAgICAgIGxhYmVsOiAnXHU2Q0ExXHU3NTI4JyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTVERjJcdThCQjBcdTVGNTVcdTRFM0FcdTMwMENcdTZDQTFcdTc1MjhcdTMwMERcdUZGMENcdThDMjJcdThDMjJcdTUzQ0RcdTk5ODhcdTMwMDInLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fYXJ0aWNsZV9mZWVkYmFjazoge1xuICAgIGxhYmVsOiAnXHU2NTg3XHU3QUUwXHU1M0NEXHU5OTg4JyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1NjU4N1x1N0FFMFx1NTNDRFx1OTk4OCcsXG4gICAgZGVzY3JpcHRpb246ICdcdThCRkJcdTgwMDVcdTVCRjlcdTY3RDBcdTdCQzdcdTc3RTVcdThCQzZcdTY1ODdcdTdBRTBcdTc2ODRcdTMwMENcdTY3MDlcdTc1MjggLyBcdTZDQTFcdTc1MjhcdTMwMERcdThCQzRcdTRFRjcnLFxuICAgIGZpZWxkczoge1xuICAgICAgZmVlZGJhY2tfbnVtYmVyOiB7IGxhYmVsOiAnXHU1M0NEXHU5OTg4XHU3RjE2XHU1M0Y3JyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdThCRkJcdTgwMDUnIH0sXG4gICAgICBjcm1fa25vd2xlZGdlX2FydGljbGU6IHsgbGFiZWw6ICdcdTY1ODdcdTdBRTAnLCBoZWxwOiAnXHU2NzJDXHU2NzYxXHU1M0NEXHU5OTg4XHU5NDg4XHU1QkY5XHU3Njg0XHU3N0U1XHU4QkM2XHU2NTg3XHU3QUUwXHUzMDAyJyB9LFxuICAgICAgdmVyZGljdDoge1xuICAgICAgICBsYWJlbDogJ1x1OEJDNFx1NEVGNycsXG4gICAgICAgIG9wdGlvbnM6IHsgaGVscGZ1bDogJ1x1NjcwOVx1NzUyOCcsIG5vdF9oZWxwZnVsOiAnXHU2Q0ExXHU3NTI4JyB9LFxuICAgICAgfSxcbiAgICAgIGNvbW1lbnQ6IHsgbGFiZWw6ICdcdTU5MDdcdTZDRTgnLCBoZWxwOiAnXHU1M0VGXHU5MDA5XHU4QkY0XHU2NjBFXHVGRjBDXHU0RjVDXHU4MDA1XHU1M0VGXHU4OUMxXHUzMDAyJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1NTNDRFx1OTk4OCcgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9vYmplY3RzLmFjdGl2aXR5LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTlwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vb2JqZWN0cy5hY3Rpdml0eS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG4vKipcbiAqIFx1N0I4MFx1NEY1M1x1NEUyRFx1NjU4NyAoemgtQ04pIFx1MjAxNCBgb2JqZWN0c2AgdHJhbnNsYXRpb25zIGZvciB0aGUgQUNUSVZJVFkgZmFtaWx5OlxuICogdGhlIGludGVyYWN0aW9uIGxvZyBcdTIwMTQgdGFza3MsIGV2ZW50cywgYW5kIHdobyBhdHRlbmRlZC5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fdGFza2AsIGBjcm1fZXZlbnRgLCBgY3JtX2V2ZW50X2F0dGVuZGVlYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBhY3Rpdml0eTogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX3Rhc2s6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGNvbXBsZXRlZF9kYXRlX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTcyQjZcdTYwMDFcdTRFM0FcdTVERjJcdTVCOENcdTYyMTBcdTY1RjZcdTVGQzVcdTk4N0JcdTU4NkJcdTUxOTlcdTVCOENcdTYyMTBcdTY1RTVcdTY3MUYnLFxuICAgICAgfSxcbiAgICAgIHJlY3VycmVuY2VfZmllbGRzX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTkxQ0RcdTU5MERcdTRFRkJcdTUyQTFcdTVGQzVcdTk4N0JcdTU4NkJcdTUxOTlcdTkxQ0RcdTU5MERcdTdDN0JcdTU3OEInLFxuICAgICAgfSxcbiAgICAgIHJlbGF0ZWRfdG9fcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1ODFGM1x1NUMxMVx1OTcwMFx1ODk4MVx1OTAwOVx1NjJFOVx1NEUwMFx1Njc2MVx1NTE3M1x1ODA1NFx1OEJCMFx1NUY1NScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdcdTRFRkJcdTUyQTEnLFxuICAgIHBsdXJhbExhYmVsOiAnXHU0RUZCXHU1MkExJyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1NkQzQlx1NTJBOFx1NEUwRVx1NUY4NVx1NTI5RVx1NEU4Qlx1OTg3OScsXG4gICAgZmllbGRzOiB7XG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU0RTNCXHU5ODk4JyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdTYzQ0ZcdThGRjAnIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTcyQjZcdTYwMDEnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbm90X3N0YXJ0ZWQ6ICdcdTY3MkFcdTVGMDBcdTU5Q0InLCBpbl9wcm9ncmVzczogJ1x1OEZEQlx1ODg0Q1x1NEUyRCcsIHdhaXRpbmc6ICdcdTdCNDlcdTVGODVcdTRFMkQnLFxuICAgICAgICAgIGNvbXBsZXRlZDogJ1x1NURGMlx1NUI4Q1x1NjIxMCcsIGRlZmVycmVkOiAnXHU1REYyXHU2M0E4XHU4RkRGJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwcmlvcml0eToge1xuICAgICAgICAvLyBgdXJnZW50YCBLRUVQUyBcdTdEMjdcdTYwMjUsIGFuZCBcdTI2RDQgbm90aGluZyBtYXkgcmUtcG9pbnQgaXQgYXQgYGNybV9jYXNlYCdzXG4gICAgICAgIC8vIHRvcCB2YWx1ZTogdGhlIHR3byB2b2NhYnVsYXJpZXMgYXJlIGRpZmZlcmVudCBzZXRzICh0YXNrOlxuICAgICAgICAvLyBsb3cvbm9ybWFsL2hpZ2gvdXJnZW50IFx1MDBCNyBjYXNlOiBsb3cvbWVkaXVtL2hpZ2gvY3JpdGljYWwpLCBzbyB0aGUgdHdvXG4gICAgICAgIC8vIHpoLUNOIHdvcmRzIG11c3Qgc3RheSBkaWZmZXJlbnQgb3IgdGhlIHNjcmVlbiBzdG9wcyBkaXN0aW5ndWlzaGluZ1xuICAgICAgICAvLyB0d28gdmFsdWVzIHRoZSBtb2RlbCB0cmVhdHMgYXMgZGlzdGluY3QgXHUyMDE0IHRoZSBjcm9zc2luZ1xuICAgICAgICAvLyBgc3JjL3NhbGVzL3ZpZXdzL3Rhc2sudmlldy50c2AgY2FycmllcyB0aGUgdG9tYnN0b25lIG9mLiBNYWludGFpbmVyIHJ1bGluZ1xuICAgICAgICAvLyAyMDI2LTA4LTMxLCAjMTM0MjogXHU3RDI3XHU2MDI1IHN0YXlzIGhlcmUgKHVyZ2VudCBpcyB0aGlzIG9iamVjdCdzIGxpdGVyYWxcbiAgICAgICAgLy8gd29yZCkgYW5kIGNhc2UgYGNyaXRpY2FsYCBtb3ZlZCB0byBcdTRFMjVcdTkxQ0QuXG4gICAgICAgIGxhYmVsOiAnXHU0RjE4XHU1MTQ4XHU3RUE3JyxcbiAgICAgICAgb3B0aW9uczogeyBsb3c6ICdcdTRGNEUnLCBub3JtYWw6ICdcdTY2NkVcdTkwMUEnLCBoaWdoOiAnXHU5QUQ4JywgdXJnZW50OiAnXHU3RDI3XHU2MDI1JyB9LFxuICAgICAgfSxcbiAgICAgIGR1ZV9kYXRlOiB7IGxhYmVsOiAnXHU2MjJBXHU2QjYyXHU2NUU1XHU2NzFGJyB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ1x1NEVGQlx1NTJBMVx1N0M3Qlx1NTc4QicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjYWxsOiAnXHU3NTM1XHU4QkREJywgZW1haWw6ICdcdTkwQUVcdTRFRjYnLCBtZWV0aW5nOiAnXHU0RjFBXHU4QkFFJyxcbiAgICAgICAgICBmb2xsb3dfdXA6ICdcdThEREZcdThGREInLCBkZW1vOiAnXHU2RjE0XHU3OTNBJywgb3RoZXI6ICdcdTUxNzZcdTRFRDYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlbWluZGVyX2RhdGU6IHsgbGFiZWw6ICdcdTYzRDBcdTkxOTJcdTY1RjZcdTk1RjQnIH0sXG4gICAgICBjb21wbGV0ZWRfZGF0ZTogeyBsYWJlbDogJ1x1NUI4Q1x1NjIxMFx1NjVFNVx1NjcxRicgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnXHU4RDFGXHU4RDIzXHU0RUJBJyB9LFxuICAgICAgcmVsYXRlZF90b190eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1MTczXHU4MDU0XHU1QkY5XHU4QzYxXHU3QzdCXHU1NzhCJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGNybV9hY2NvdW50OiAnXHU1QkEyXHU2MjM3JywgY3JtX2NvbnRhY3Q6ICdcdTgwNTRcdTdDRkJcdTRFQkEnLCBjcm1fb3Bwb3J0dW5pdHk6ICdcdTU1NDZcdTY3M0EnLFxuICAgICAgICAgIGNybV9sZWFkOiAnXHU3RUJGXHU3RDIyJywgY3JtX2Nhc2U6ICdcdTVERTVcdTUzNTUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlbGF0ZWRfdG9fYWNjb3VudDogeyBsYWJlbDogJ1x1NTE3M1x1ODA1NFx1NUJBMlx1NjIzNycgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY29udGFjdDogeyBsYWJlbDogJ1x1NTE3M1x1ODA1NFx1ODA1NFx1N0NGQlx1NEVCQScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTU1NDZcdTY3M0EnIH0sXG4gICAgICByZWxhdGVkX3RvX2xlYWQ6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTdFQkZcdTdEMjInIH0sXG4gICAgICByZWxhdGVkX3RvX2Nhc2U6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTVERTVcdTUzNTUnIH0sXG4gICAgICBpc19yZWN1cnJpbmc6IHsgbGFiZWw6ICdcdTkxQ0RcdTU5MERcdTRFRkJcdTUyQTEnIH0sXG4gICAgICByZWN1cnJlbmNlX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTkxQ0RcdTU5MERcdTdDN0JcdTU3OEInLFxuICAgICAgICBvcHRpb25zOiB7IGRhaWx5OiAnXHU2QkNGXHU2NUU1Jywgd2Vla2x5OiAnXHU2QkNGXHU1NDY4JywgbW9udGhseTogJ1x1NkJDRlx1NjcwOCcsIHllYXJseTogJ1x1NkJDRlx1NUU3NCcgfSxcbiAgICAgIH0sXG4gICAgICByZWN1cnJlbmNlX2ludGVydmFsOiB7IGxhYmVsOiAnXHU5MUNEXHU1OTBEXHU5NUY0XHU5Njk0JyB9LFxuICAgICAgcmVjdXJyZW5jZV9lbmRfZGF0ZTogeyBsYWJlbDogJ1x1OTFDRFx1NTkwRFx1N0VEM1x1Njc1Rlx1NjVFNVx1NjcxRicgfSxcbiAgICAgIGlzX2NvbXBsZXRlZDogeyBsYWJlbDogJ1x1NjYyRlx1NTQyNlx1NUI4Q1x1NjIxMCcgfSxcbiAgICAgIGlzX292ZXJkdWU6IHsgbGFiZWw6ICdcdTY2MkZcdTU0MjZcdTkwM0VcdTY3MUYnIH0sXG4gICAgICBwcm9ncmVzc19wZXJjZW50OiB7IGxhYmVsOiAnXHU4RkRCXHU1RUE2XHVGRjA4JVx1RkYwOScgfSxcbiAgICAgIHByaW9yaXR5X3Jhbms6IHsgbGFiZWw6ICdcdTRGMThcdTUxNDhcdTdFQTdcdTYzOTJcdTVFOEYnIH0sXG4gICAgICByZW1pbmRlcl9zZW50OiB7IGxhYmVsOiAnXHU2M0QwXHU5MTkyXHU1REYyXHU1M0QxXHU5MDAxJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1NEVGQlx1NTJBMVx1NEZFMVx1NjA2RicgfSxcbiAgICAgIHNjaGVkdWxpbmc6IHsgbGFiZWw6ICdcdTY1RTVcdTdBMEJcdTVCODlcdTYzOTInIH0sXG4gICAgICByZWxhdGVkOiB7IGxhYmVsOiAnXHU1MTczXHU4MDU0XHU4QkIwXHU1RjU1JyB9LFxuICAgICAgcmVjdXJyZW5jZTogeyBsYWJlbDogJ1x1OTFDRFx1NTkwRFx1ODlDNFx1NTIxOScgfSxcbiAgICAgIHN5c3RlbTogeyBsYWJlbDogJ1x1N0NGQlx1N0VERicgfSxcbiAgICAgIGVmZm9ydDogeyBsYWJlbDogJ1x1OEZEQlx1NUVBNlx1NEUwRVx1NURFNVx1NjVGNicgfSxcbiAgICAgIC8vIHRhc2sudmlldy50cyBcdTg4NjhcdTUzNTVcdTUzM0FcdTU3NTdcdTU0MERcdTc5RjAgKCMxMTAwKVxuICAgICAgdGFzazogeyBsYWJlbDogJ1x1NEVGQlx1NTJBMScgfSxcbiAgICAgIHJlbGF0ZWRfcmVjb3JkczogeyBsYWJlbDogJ1x1NTE3M1x1ODA1NFx1OEJCMFx1NUY1NScgfSxcbiAgICAgIHJlY3VycmVuY2VfYW5kX2VmZm9ydDogeyBsYWJlbDogJ1x1OTFDRFx1NTkwRFx1NEUwRVx1NURFNVx1NjVGNicgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX3Rhc2tzOiB7IGxhYmVsOiAnXHU1MTY4XHU5MEU4XHU0RUZCXHU1MkExJyB9LFxuICAgICAgdGFza19ib2FyZDogeyBsYWJlbDogJ1x1NEVGQlx1NTJBMVx1NzcwQlx1Njc3RicgfSxcbiAgICAgIHRhc2tfY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTRFRkJcdTUyQTFcdTY1RTVcdTdBMEInIH0sXG4gICAgICB0YXNrX2dhbnR0OiB7IGxhYmVsOiAnXHU2MjY3XHU4ODRDXHU4QkExXHU1MjEyJyB9LFxuICAgICAgdGFza190aW1lbGluZTogeyBsYWJlbDogJ1x1NURFNVx1NjVGNlx1NjVGNlx1OTVGNFx1N0VCRicgfSxcbiAgICAgIG15X29wZW5fdGFza3M6IHsgbGFiZWw6ICdcdTYyMTFcdTc2ODRcdTVGODVcdTUyOUVcdTRFRkJcdTUyQTEnIH0sXG4gICAgICB0b2RheXNfdGFza3M6IHsgbGFiZWw6ICdcdUQ4M0RcdURDQzUgXHU2MjExXHU3Njg0XHU0RjE4XHU1MTQ4XHU0RUZCXHU1MkExJyB9LFxuICAgICAgb3ZlcmR1ZV90YXNrczogeyBsYWJlbDogJ1x1MjNGMCBcdTVGODVcdTUyOUVcdTRFRkJcdTUyQTEgXHUwMEI3IFx1NjMwOVx1OTAzRVx1NjcxRlx1NjVGNlx1OTU3Rlx1NjM5Mlx1NUU4RicgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fZXZlbnQ6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGVuZF9hZnRlcl9zdGFydDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU3RUQzXHU2NzVGXHU2NUY2XHU5NUY0XHU1RkM1XHU5ODdCXHU2NjVBXHU0RThFXHU1RjAwXHU1OUNCXHU2NUY2XHU5NUY0JyxcbiAgICAgIH0sXG4gICAgICByZWxhdGVkX3RvX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTgxRjNcdTVDMTFcdTk3MDBcdTg5ODFcdTkwMDlcdTYyRTlcdTRFMDBcdTY3NjFcdTUxNzNcdTgwNTRcdThCQjBcdTVGNTUnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU2RDNCXHU1MkE4JyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1NkQzQlx1NTJBOCcsXG4gICAgZGVzY3JpcHRpb246ICdcdTRFMEVcdTVCQTJcdTYyMzdcdTc2ODRcdTRGMUFcdThCQUVcdTMwMDFcdTkwMUFcdThCRERcdTUzQ0FcdTUxNzZcdTRFRDZcdTVERjJcdTVCODlcdTYzOTJcdTc2ODRcdTRFOTJcdTUyQTgnLFxuICAgIGZpZWxkczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1x1NEUzQlx1OTg5OCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU2M0NGXHU4RkYwJyB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ1x1NkQzQlx1NTJBOFx1N0M3Qlx1NTc4QicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtZWV0aW5nOiAnXHU0RjFBXHU4QkFFJywgY2FsbDogJ1x1NzUzNVx1OEJERCcsIGRlbW86ICdcdTZGMTRcdTc5M0EnLFxuICAgICAgICAgIHdlYmluYXI6ICdcdTdFQkZcdTRFMEFcdTc4MTRcdThCQThcdTRGMUEnLCBvbnNpdGVfdmlzaXQ6ICdcdTRFMEFcdTk1RThcdTYyRENcdThCQkYnLCBvdGhlcjogJ1x1NTE3Nlx1NEVENicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3MkI2XHU2MDAxJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHBsYW5uZWQ6ICdcdTVERjJcdThCQTFcdTUyMTInLCBoZWxkOiAnXHU1REYyXHU0RTNFXHU4ODRDJywgY2FuY2VsbGVkOiAnXHU1REYyXHU1M0Q2XHU2RDg4Jywgbm9fc2hvdzogJ1x1NUJBMlx1NjIzN1x1NjcyQVx1NTIzMCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdThEMUZcdThEMjNcdTRFQkEnIH0sXG4gICAgICBzdGFydF9kYXRldGltZTogeyBsYWJlbDogJ1x1NUYwMFx1NTlDQlx1NjVGNlx1OTVGNCcgfSxcbiAgICAgIGVuZF9kYXRldGltZTogeyBsYWJlbDogJ1x1N0VEM1x1Njc1Rlx1NjVGNlx1OTVGNCcgfSxcbiAgICAgIGFsbF9kYXk6IHsgbGFiZWw6ICdcdTUxNjhcdTU5MjlcdTZEM0JcdTUyQTgnIH0sXG4gICAgICBkdXJhdGlvbl9taW51dGVzOiB7IGxhYmVsOiAnXHU2NUY2XHU5NTdGXHVGRjA4XHU1MjA2XHU5NDlGXHVGRjA5JyB9LFxuICAgICAgbG9jYXRpb246IHsgbGFiZWw6ICdcdTU3MzBcdTcwQjknLCBoZWxwOiAnXHU0RjFBXHU4QkFFXHU1QkE0XHUzMDAxXHU1NzMwXHU1NzQwXHU2MjE2XHU0RjFBXHU4QkFFXHU5NEZFXHU2M0E1JyB9LFxuICAgICAgcmVsYXRlZF90b190eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1MTczXHU4MDU0XHU1QkY5XHU4QzYxXHU3QzdCXHU1NzhCJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGNybV9hY2NvdW50OiAnXHU1QkEyXHU2MjM3JywgY3JtX2NvbnRhY3Q6ICdcdTgwNTRcdTdDRkJcdTRFQkEnLCBjcm1fb3Bwb3J0dW5pdHk6ICdcdTU1NDZcdTY3M0EnLFxuICAgICAgICAgIGNybV9sZWFkOiAnXHU3RUJGXHU3RDIyJywgY3JtX2Nhc2U6ICdcdTVERTVcdTUzNTUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlbGF0ZWRfdG9fYWNjb3VudDogeyBsYWJlbDogJ1x1NTE3M1x1ODA1NFx1NUJBMlx1NjIzNycgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY29udGFjdDogeyBsYWJlbDogJ1x1NTE3M1x1ODA1NFx1ODA1NFx1N0NGQlx1NEVCQScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTU1NDZcdTY3M0EnIH0sXG4gICAgICByZWxhdGVkX3RvX2xlYWQ6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTdFQkZcdTdEMjInIH0sXG4gICAgICByZWxhdGVkX3RvX2Nhc2U6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTVERTVcdTUzNTUnIH0sXG4gICAgICBvdXRjb21lX25vdGVzOiB7IGxhYmVsOiAnXHU0RjFBXHU1NDBFXHU3RUFBXHU4OTgxJywgaGVscDogJ1x1OEZCRVx1NjIxMFx1NEU4Nlx1NEVDMFx1NEU0OFx1NTE3MVx1OEJDNlx1RkYwQ1x1NEUwQlx1NEUwMFx1NkI2NVx1NTA1QVx1NEVDMFx1NEU0OCcgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTZEM0JcdTUyQThcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBzY2hlZHVsZTogeyBsYWJlbDogJ1x1NjVFNVx1N0EwQlx1NUI4OVx1NjM5MicgfSxcbiAgICAgIHJlbGF0ZWQ6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdThCQjBcdTVGNTUnIH0sXG4gICAgICBvdXRjb21lOiB7IGxhYmVsOiAnXHU3RUQzXHU2NzlDJyB9LFxuICAgICAgLy8gZXZlbnQudmlldy50cyBcdTg4NjhcdTUzNTVcdTUzM0FcdTU3NTdcdTU0MERcdTc5RjAgKCMxMTAwKVxuICAgICAgZXZlbnQ6IHsgbGFiZWw6ICdcdTZEM0JcdTUyQTgnIH0sXG4gICAgICByZWxhdGVkX3JlY29yZHM6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdThCQjBcdTVGNTUnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9ldmVudHM6IHsgbGFiZWw6ICdcdTUxNjhcdTkwRThcdTZEM0JcdTUyQTgnIH0sXG4gICAgICBldmVudF9jYWxlbmRhcjogeyBsYWJlbDogJ1x1NkQzQlx1NTJBOFx1NjVFNVx1NTM4NicgfSxcbiAgICAgIGV2ZW50X3RpbWVsaW5lOiB7IGxhYmVsOiAnXHU1NkUyXHU5NjFGXHU2NUU1XHU3QTBCJyB9LFxuICAgICAgbXlfZXZlbnRzOiB7IGxhYmVsOiAnXHU2MjExXHU3Njg0XHU2NUU1XHU1Mzg2JyB9LFxuICAgICAgdXBjb21pbmdfZXZlbnRzOiB7IGxhYmVsOiAnXHVEODNEXHVEQ0M1IFx1NTM3M1x1NUMwNlx1NUYwMFx1NTlDQiBcdTAwQjcgXHU2MzA5XHU2NUY2XHU5NUY0XHU1MzQ3XHU1RThGJyB9LFxuICAgICAgaGVsZF9ldmVudHM6IHsgbGFiZWw6ICdcdTI3MDUgXHU0RTkyXHU1MkE4XHU1Mzg2XHU1M0YyJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9ldmVudF9hdHRlbmRlZToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgYXR0ZW5kZWVfcmVzb2x2ZXM6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NTNDMlx1NEUwRVx1ODAwNVx1NUZDNVx1OTg3Qlx1NTg2Qlx1NTE5OVx1NTE3Nlx1NTNDMlx1NEUwRVx1ODAwNVx1N0M3Qlx1NTc4Qlx1NjI0MFx1NjMwN1x1NzY4NFx1NEUwMFx1NjVCOVx1MjAxNFx1MjAxNFx1ODA1NFx1N0NGQlx1NEVCQVx1N0M3Qlx1NTc4Qlx1OTcwMFx1ODk4MVx1NTg2Qlx1NTE5OVx1ODA1NFx1N0NGQlx1NEVCQVx1RkYwQ1x1NTkxNlx1OTBFOFx1N0M3Qlx1NTc4Qlx1OTcwMFx1ODk4MVx1NTg2Qlx1NTE5OVx1NTkxNlx1OTBFOFx1NTNDMlx1NEUwRVx1ODAwNVx1NTlEM1x1NTQwRCcsXG4gICAgICB9LFxuICAgICAgYXR0ZW5kZWVfdHlwZV9leGNsdXNpdmU6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NTNDMlx1NEUwRVx1ODAwNVx1NTNFQVx1ODBGRFx1NjMwN1x1NUI5QVx1NEUwMFx1NjVCOVx1MjAxNFx1MjAxNFx1OEJGN1x1NkUwNVx1N0E3QVx1NTE3Nlx1NTNDMlx1NEUwRVx1ODAwNVx1N0M3Qlx1NTc4Qlx1NjcyQVx1NjMwN1x1NjYwRVx1NzY4NFx1NjI0MFx1NjcwOVx1NUI1N1x1NkJCNScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdcdTZEM0JcdTUyQThcdTUzQzJcdTRFMEVcdTgwMDUnLFxuICAgIHBsdXJhbExhYmVsOiAnXHU2RDNCXHU1MkE4XHU1M0MyXHU0RTBFXHU4MDA1JyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1NTNEN1x1OTA4MFx1NTNDMlx1NTJBMFx1NjIxNlx1NUI5RVx1OTY0NVx1NTFGQVx1NUUyRFx1NkQzQlx1NTJBOFx1NzY4NFx1NEVCQVx1NTQ1OCcsXG4gICAgZmllbGRzOiB7XG4gICAgICBhdHRlbmRlZV9udW1iZXI6IHsgbGFiZWw6ICdcdTUzQzJcdTRFMEVcdTgwMDVcdTdGMTZcdTUzRjcnIH0sXG4gICAgICBjcm1fZXZlbnQ6IHsgbGFiZWw6ICdcdTZEM0JcdTUyQTgnIH0sXG4gICAgICBhdHRlbmRlZV90eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1M0MyXHU0RTBFXHU4MDA1XHU3QzdCXHU1NzhCJyxcbiAgICAgICAgb3B0aW9uczogeyBjb250YWN0OiAnXHU4MDU0XHU3Q0ZCXHU0RUJBJywgbGVhZDogJ1x1N0VCRlx1N0QyMicsIHVzZXI6ICdcdTUxODVcdTkwRThcdTc1MjhcdTYyMzcnLCBleHRlcm5hbDogJ1x1NTkxNlx1OTBFOFx1Njc2NVx1NUJCRScgfSxcbiAgICAgIH0sXG4gICAgICBjcm1fY29udGFjdDogeyBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEVCQScsIGhlbHA6ICdcdTUzQzJcdTRFMEVcdTgwMDVcdTY2MkZcdTVERjJcdTY3MDlcdTVCQTJcdTYyMzdcdTgwNTRcdTdDRkJcdTRFQkFcdTY1RjZcdTU4NkJcdTUxOTknIH0sXG4gICAgICBjcm1fbGVhZDogeyBsYWJlbDogJ1x1N0VCRlx1N0QyMicsIGhlbHA6ICdcdTUzQzJcdTRFMEVcdTgwMDVcdTRFQ0RcdTY2MkZcdTY3MkFcdThGNkNcdTUzMTZcdTdFQkZcdTdEMjJcdTY1RjZcdTU4NkJcdTUxOTknIH0sXG4gICAgICBzeXNfdXNlcjogeyBsYWJlbDogJ1x1NTE4NVx1OTBFOFx1NzUyOFx1NjIzNycsIGhlbHA6ICdcdTUzQzJcdTRFMEVcdTgwMDVcdTY2MkZcdTU0MENcdTRFOEJcdTY1RjZcdTU4NkJcdTUxOTknIH0sXG4gICAgICBleHRlcm5hbF9uYW1lOiB7IGxhYmVsOiAnXHU1OTE2XHU5MEU4XHU1M0MyXHU0RTBFXHU4MDA1JywgaGVscDogJ1x1NEUwRFx1NTcyOFx1NEVGQlx1NEY1NSBDUk0gXHU1QkY5XHU4QzYxXHU0RTJEXHU3Njg0XHU1M0MyXHU0RTBFXHU4MDA1XHU1OUQzXHU1NDBEXHUyMDE0XHUyMDE0XHU1M0MyXHU0RTBFXHU4MDA1XHU3QzdCXHU1NzhCXHU0RTNBXHUzMDBDXHU1OTE2XHU5MEU4XHU2NzY1XHU1QkJFXHUzMDBEXHU2NUY2XHU1ODZCXHU1MTk5JyB9LFxuICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgbGFiZWw6ICdcdTU2REVcdTU5MEQnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbm9fcmVzcG9uc2U6ICdcdTY3MkFcdTU2REVcdTU5MEQnLCBhY2NlcHRlZDogJ1x1NURGMlx1NjNBNVx1NTNENycsXG4gICAgICAgICAgZGVjbGluZWQ6ICdcdTVERjJcdTYyRDJcdTdFREQnLCB0ZW50YXRpdmU6ICdcdTVGODVcdTVCOUEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGlzX29yZ2FuaXplcjogeyBsYWJlbDogJ1x1N0VDNFx1N0VDN1x1ODAwNScgfSxcbiAgICAgIGludml0ZWRfZGF0ZTogeyBsYWJlbDogJ1x1OTA4MFx1OEJGN1x1NjVGNlx1OTVGNCcgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTUzQzJcdTRFMEVcdTgwMDUnIH0sXG4gICAgICByZXNwb25zZTogeyBsYWJlbDogJ1x1OTA4MFx1OEJGNycgfSxcbiAgICAgIC8vIGV2ZW50X2F0dGVuZGVlLnZpZXcudHMgXHU4ODY4XHU1MzU1XHU1MzNBXHU1NzU3XHU1NDBEXHU3OUYwICgjMTEwMClcbiAgICAgIGF0dGVuZGVlOiB7IGxhYmVsOiAnXHU1M0MyXHU0RTBFXHU4MDA1JyB9LFxuICAgICAgaW52aXRhdGlvbjogeyBsYWJlbDogJ1x1OTA4MFx1OEJGNycgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2V2ZW50X2F0dGVuZGVlczogeyBsYWJlbDogJ1x1NkQzQlx1NTJBOFx1NTNDMlx1NEUwRVx1ODAwNScgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9vYmplY3RzLm1hcmtldGluZy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ05cIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOL29iamVjdHMubWFya2V0aW5nLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbi8qKlxuICogXHU3QjgwXHU0RjUzXHU0RTJEXHU2NTg3ICh6aC1DTikgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBNQVJLRVRJTkcgZmFtaWx5OlxuICogZGVtYW5kIGdlbmVyYXRpb24gXHUyMDE0IGNhbXBhaWducyBhbmQgdGhlaXIgbWVtYmVyc2hpcC5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fY2FtcGFpZ25gLCBgY3JtX2NhbXBhaWduX21lbWJlcmAuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04udHNgLlxuICovXG5leHBvcnQgY29uc3QgbWFya2V0aW5nOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fY2FtcGFpZ246IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGVuZF9hZnRlcl9zdGFydDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU3RUQzXHU2NzVGXHU2NUU1XHU2NzFGXHU1RkM1XHU5ODdCXHU2NjVBXHU0RThFXHU1RjAwXHU1OUNCXHU2NUU1XHU2NzFGJyxcbiAgICAgIH0sXG4gICAgICBhY3R1YWxfY29zdF93aXRoaW5fYnVkZ2V0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTVCOUVcdTk2NDVcdTYyMTBcdTY3MkNcdThEODVcdTUxRkFcdTk4ODRcdTdCOTdcdTYyMTBcdTY3MkMnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4JyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCcsXG4gICAgZGVzY3JpcHRpb246ICdcdTVFMDJcdTU3M0FcdTg0MjVcdTk1MDBcdTZEM0JcdTUyQThcdTRFMEVcdTYzQThcdTVFN0YnLFxuICAgIGZpZWxkczoge1xuICAgICAgY2FtcGFpZ25fY29kZTogeyBsYWJlbDogJ1x1NkQzQlx1NTJBOFx1NEVFM1x1NzgwMScgfSxcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdcdTZEM0JcdTUyQThcdTU0MERcdTc5RjAnIH0sXG4gICAgICB0eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3QzdCXHU1NzhCJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGVtYWlsOiAnXHU5MEFFXHU0RUY2XHU4NDI1XHU5NTAwJywgd2ViaW5hcjogJ1x1N0VCRlx1NEUwQVx1NzgxNFx1OEJBOFx1NEYxQScsIHRyYWRlX3Nob3c6ICdcdTVDNTVcdTRGMUEnLFxuICAgICAgICAgIGNvbmZlcmVuY2U6ICdcdTg4NENcdTRFMUFcdTRGMUFcdThCQUUnLCBkaXJlY3RfbWFpbDogJ1x1NzZGNFx1OTBBRScsIHNvY2lhbF9tZWRpYTogJ1x1NzkzRVx1NEVBNFx1NUE5Mlx1NEY1MycsXG4gICAgICAgICAgY29udGVudDogJ1x1NTE4NVx1NUJCOVx1ODQyNVx1OTUwMCcsIHBhcnRuZXI6ICdcdTRGMTlcdTRGMzRcdTgwNTRcdTU0MDhcdTg0MjVcdTk1MDAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1NzJCNlx1NjAwMScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwbGFubmluZzogJ1x1ODlDNFx1NTIxMlx1NEUyRCcsIGluX3Byb2dyZXNzOiAnXHU4RkRCXHU4ODRDXHU0RTJEJyxcbiAgICAgICAgICBjb21wbGV0ZWQ6ICdcdTVERjJcdTVCOENcdTYyMTAnLCBhYm9ydGVkOiAnXHU1REYyXHU0RTJEXHU2QjYyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGFydF9kYXRlOiB7IGxhYmVsOiAnXHU1RjAwXHU1OUNCXHU2NUU1XHU2NzFGJyB9LFxuICAgICAgZW5kX2RhdGU6IHsgbGFiZWw6ICdcdTdFRDNcdTY3NUZcdTY1RTVcdTY3MUYnIH0sXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiB7IGxhYmVsOiAnXHU5ODg0XHU2NzFGXHU2NTM2XHU1MTY1JyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdTYzQ0ZcdThGRjAnIH0sXG4gICAgICBjaGFubmVsOiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RTNCXHU4OTgxXHU2RTIwXHU5MDUzJyxcbiAgICAgICAgb3B0aW9uczogeyBkaWdpdGFsOiAnXHU2NTcwXHU1QjU3XHU2RTIwXHU5MDUzJywgc29jaWFsOiAnXHU3OTNFXHU0RUE0XHU1QTkyXHU0RjUzJywgZW1haWw6ICdcdTkwQUVcdTRFRjYnLCBldmVudHM6ICdcdTdFQkZcdTRFMEJcdTZEM0JcdTUyQTgnLCBwYXJ0bmVyOiAnXHU1NDA4XHU0RjVDXHU0RjE5XHU0RjM0JyB9LFxuICAgICAgfSxcbiAgICAgIGJ1ZGdldGVkX2Nvc3Q6IHsgbGFiZWw6ICdcdTk4ODRcdTdCOTdcdTYyMTBcdTY3MkMnIH0sXG4gICAgICBhY3R1YWxfY29zdDogeyBsYWJlbDogJ1x1NUI5RVx1OTY0NVx1NjIxMFx1NjcyQycgfSxcbiAgICAgIGFjdHVhbF9yZXZlbnVlOiB7IGxhYmVsOiAnXHU1QjlFXHU5NjQ1XHU2NTM2XHU1MTY1JyB9LFxuICAgICAgdGFyZ2V0X3NpemU6IHsgbGFiZWw6ICdcdTc2RUVcdTY4MDdcdTRFQkFcdTY1NzAnLCBoZWxwOiAnXHU3NkVFXHU2ODA3XHU3RUJGXHU3RDIyL1x1ODA1NFx1N0NGQlx1NEVCQVx1NjU3MFx1OTFDRicgfSxcbiAgICAgIG51bV9zZW50OiB7IGxhYmVsOiAnXHU1M0QxXHU5MDAxXHU2NTcwXHU5MUNGJyB9LFxuICAgICAgbnVtX3Jlc3BvbnNlczogeyBsYWJlbDogJ1x1NTRDRFx1NUU5NFx1NjU3MFx1OTFDRicgfSxcbiAgICAgIG51bV9sZWFkczogeyBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1NjU3MFx1OTFDRicgfSxcbiAgICAgIG51bV9jb252ZXJ0ZWRfbGVhZHM6IHsgbGFiZWw6ICdcdTVERjJcdThGNkNcdTUzMTZcdTdFQkZcdTdEMjJcdTY1NzAnIH0sXG4gICAgICBudW1fb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ1x1NURGMlx1NTIxQlx1NUVGQVx1NTU0Nlx1NjczQVx1NjU3MCcgfSxcbiAgICAgIG51bV93b25fb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ1x1NURGMlx1OEQ2Mlx1NUY5N1x1NTU0Nlx1NjczQScgfSxcbiAgICAgIHJlc3BvbnNlX3JhdGU6IHsgbGFiZWw6ICdcdTU0Q0RcdTVFOTRcdTczODdcdUZGMDglXHVGRjA5JyB9LFxuICAgICAgcm9pOiB7IGxhYmVsOiAnXHU2Mjk1XHU4RDQ0XHU1NkRFXHU2MkE1XHU3Mzg3XHVGRjA4JVx1RkYwOScgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnXHU2RDNCXHU1MkE4XHU4RDFGXHU4RDIzXHU0RUJBJyB9LFxuICAgICAgbGFuZGluZ19wYWdlX3VybDogeyBsYWJlbDogJ1x1Nzc0MFx1OTY0Nlx1OTg3NScgfSxcbiAgICAgIGlzX2FjdGl2ZTogeyBsYWJlbDogJ1x1NjYyRlx1NTQyNlx1NTQyRlx1NzUyOCcgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTY2M0VcdTc5M0FcdTU0MERcdTc5RjAnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnXHU2RDNCXHU1MkE4XHU0RkUxXHU2MDZGJyB9LFxuICAgICAgc2NoZWR1bGU6IHsgbGFiZWw6ICdcdTY1RTVcdTdBMEJcdTVCODlcdTYzOTInIH0sXG4gICAgICBidWRnZXQ6IHsgbGFiZWw6ICdcdTk4ODRcdTdCOTdcdTRFMEVcdTYyOTVcdThENDRcdTU2REVcdTYyQTUnIH0sXG4gICAgICBtZXRyaWNzOiB7IGxhYmVsOiAnXHU2NTQ4XHU2NzlDXHU2NTcwXHU2MzZFJyB9LFxuICAgICAgYXNzaWdubWVudDogeyBsYWJlbDogJ1x1NUY1Mlx1NUM1RScgfSxcbiAgICAgIGFzc2V0czogeyBsYWJlbDogJ1x1NkQzQlx1NTJBOFx1N0QyMFx1Njc1MCcgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2NhbXBhaWduczogeyBsYWJlbDogJ1x1NTE2OFx1OTBFOFx1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCcgfSxcbiAgICAgIGNhbXBhaWduX2dhbnR0OiB7IGxhYmVsOiAnXHU2RDNCXHU1MkE4XHU2MzkyXHU2NzFGJyB9LFxuICAgICAgY2FtcGFpZ25fY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTZEM0JcdTUyQThcdTY1RTVcdTUzODYnIH0sXG4gICAgICBjYW1wYWlnbl90aW1lbGluZTogeyBsYWJlbDogJ1x1ODQyNVx1OTUwMFx1NjVGNlx1OTVGNFx1N0VCRicgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7XG4gICAgICBlbnJvbGxfbGVhZHM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTYyNzlcdTkxQ0ZcdTUyQTBcdTUxNjVcdTYyMTBcdTU0NTgnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1N0IyNlx1NTQwOFx1Njc2MVx1NEVGNlx1NzY4NFx1NjIxMFx1NTQ1OFx1NURGMlx1NTJBMFx1NTE2NVx1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOFx1MzAwMicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9jYW1wYWlnbl9tZW1iZXI6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGxlYWRfb3JfY29udGFjdF9yZXF1aXJlZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4XHU2MjEwXHU1NDU4XHU1RkM1XHU5ODdCXHU1MTczXHU4MDU0XHU3RUJGXHU3RDIyXHU2MjE2XHU4MDU0XHU3Q0ZCXHU0RUJBXHU0RTRCXHU0RTAwJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBcdTMwMENcdTg0MjVcdTk1MDBcdTZEM0JcdTUyQThcdTYyMTBcdTU0NThcdTMwMEQsIG5vdCBcdTMwMENcdTZEM0JcdTUyQThcdTYyMTBcdTU0NThcdTMwMEQ6IHRoaXMgb2JqZWN0J3MgbWFzdGVyIGlzIGBjcm1fY2FtcGFpZ25gXG4gICAgLy8gKFx1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCksIHdoaWxlIFx1MzAwQ1x1NkQzQlx1NTJBOFx1MzAwRCBpcyBhbHJlYWR5IHRoaXMgcGFjaydzIGxhYmVsIGZvciBgY3JtX2V2ZW50YCBhbmRcbiAgICAvLyBcdTMwMENcdTZEM0JcdTUyQThcdTUzQzJcdTRFMEVcdTgwMDVcdTMwMEQgaXRzIGNoaWxkIGBjcm1fZXZlbnRfYXR0ZW5kZWVgLiBEcm9wcGluZyBcdTMwMENcdTg0MjVcdTk1MDBcdTMwMEQgcHV0IGFcbiAgICAvLyBtYXJrZXRpbmcgb2JqZWN0IGluc2lkZSB0aGUgY2FsZW5kYXIgZmFtaWx5J3MgbmFtZSBzcGFjZSAoIzgxMCkuXG4gICAgbGFiZWw6ICdcdTg0MjVcdTk1MDBcdTZEM0JcdTUyQThcdTYyMTBcdTU0NTgnLFxuICAgIHBsdXJhbExhYmVsOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4XHU2MjEwXHU1NDU4JyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOFx1NjI0MFx1ODlFNlx1OEZCRVx1NzY4NFx1N0VCRlx1N0QyMlx1NEUwRVx1ODA1NFx1N0NGQlx1NEVCQVx1NTNDQVx1NTE3Nlx1NTRDRFx1NUU5NFx1NzJCNlx1NjAwMScsXG4gICAgZmllbGRzOiB7XG4gICAgICBtZW1iZXJfbnVtYmVyOiB7IGxhYmVsOiAnXHU2MjEwXHU1NDU4XHU3RjE2XHU1M0Y3JyB9LFxuICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4JyB9LFxuICAgICAgY3JtX2xlYWQ6IHsgbGFiZWw6ICdcdTdFQkZcdTdEMjInLCBoZWxwOiAnXHU2MjEwXHU1NDU4XHU1MkEwXHU1MTY1XHU2NUY2XHU4RUFCXHU0RUZEXHU0RTNBXHU3RUJGXHU3RDIyXHU3Njg0XHVGRjBDXHU4QkIwXHU1RjU1XHU1NzI4XHU2QjY0JyB9LFxuICAgICAgY3JtX2NvbnRhY3Q6IHsgbGFiZWw6ICdcdTgwNTRcdTdDRkJcdTRFQkEnLCBoZWxwOiAnXHU2MjEwXHU1NDU4XHU0RTNBXHU1REYyXHU2NzA5XHU4MDU0XHU3Q0ZCXHU0RUJBXHU3Njg0XHVGRjBDXHU4QkIwXHU1RjU1XHU1NzI4XHU2QjY0JyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3MkI2XHU2MDAxJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHNlbnQ6ICdcdTVERjJcdTUzRDFcdTkwMDEnLCByZXNwb25kZWQ6ICdcdTVERjJcdTU0Q0RcdTVFOTQnLFxuICAgICAgICAgIGNvbnZlcnRlZDogJ1x1NURGMlx1OEY2Q1x1NTMxNicsIHVuc3Vic2NyaWJlZDogJ1x1NURGMlx1OTAwMFx1OEJBMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYWRkZWRfZGF0ZTogeyBsYWJlbDogJ1x1NTJBMFx1NTE2NVx1NjVGNlx1OTVGNCcgfSxcbiAgICAgIHJlc3BvbnNlX2RhdGU6IHsgbGFiZWw6ICdcdTU0Q0RcdTVFOTRcdTY1RjZcdTk1RjQnIH0sXG4gICAgICBoYXNfcmVzcG9uZGVkOiB7IGxhYmVsOiAnXHU1REYyXHU1NENEXHU1RTk0JyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1NTdGQVx1NjcyQ1x1NEZFMVx1NjA2RicgfSxcbiAgICAgIHJlc3BvbnNlOiB7IGxhYmVsOiAnXHU1NENEXHU1RTk0XHU4RERGXHU4RTJBJyB9LFxuICAgIH0sXG4gICAgX2FjdGlvbnM6IHtcbiAgICAgIG1hcmtfcmVzcG9uZGVkOiB7XG4gICAgICAgIGxhYmVsOiAnXHU2ODA3XHU4QkIwXHU0RTNBXHU1REYyXHU1NENEXHU1RTk0JyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTVERjJcdThCQjBcdTVGNTVcdThCRTVcdTg0MjVcdTk1MDBcdTZEM0JcdTUyQThcdTYyMTBcdTU0NThcdTc2ODRcdTU0Q0RcdTVFOTRcdTMwMDInLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IGFwcFN1cmZhY2UgfSBmcm9tICcuL3poLUNOL2FwcCc7XG5pbXBvcnQgeyBjdXN0b21lciB9IGZyb20gJy4vemgtQ04vb2JqZWN0cy5jdXN0b21lcic7XG5pbXBvcnQgeyBwaXBlbGluZSB9IGZyb20gJy4vemgtQ04vb2JqZWN0cy5waXBlbGluZSc7XG5pbXBvcnQgeyBjb21tZXJjZSB9IGZyb20gJy4vemgtQ04vb2JqZWN0cy5jb21tZXJjZSc7XG5pbXBvcnQgeyBzZXJ2aWNlIH0gZnJvbSAnLi96aC1DTi9vYmplY3RzLnNlcnZpY2UnO1xuaW1wb3J0IHsgYWN0aXZpdHkgfSBmcm9tICcuL3poLUNOL29iamVjdHMuYWN0aXZpdHknO1xuaW1wb3J0IHsgbWFya2V0aW5nIH0gZnJvbSAnLi96aC1DTi9vYmplY3RzLm1hcmtldGluZyc7XG5cbi8qKlxuICogXHU3QjgwXHU0RjUzXHU0RTJEXHU2NTg3ICh6aC1DTikgXHUyMDE0IENSTSBBcHAgVHJhbnNsYXRpb25zXG4gKlxuICogUGVyLWxvY2FsZSBmaWxlOiBvbmUgZmlsZSBwZXIgbGFuZ3VhZ2UsIGZvbGxvd2luZyB0aGUgYHBlcl9sb2NhbGVgIGNvbnZlbnRpb24uXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKlxuICogVGhpcyBidW5kbGUgd2FzIG9uZSBmaWxlIGFuZCBpdCBoYWQgcmVhY2hlZCA4OC42JSBvZiB0aGUgMTAwS0Igc291cmNlIGNhcFxuICogYHBucG0gaHlnaWVuZWAgZW5mb3JjZXMsIGdyb3dpbmcgfjEuMktCIGEgZGF5LiBJdCBpcyBub3cgYXNzZW1ibGVkIGZyb21cbiAqIGAuLzxsb2NhbGU+L2AsIG9uIGFuIGF4aXMgbWVhc3VyZWQgcmF0aGVyIHRoYW4gZ3Vlc3NlZDpcbiAqXG4gKiAgIC0gZXZlcnkgbmFtZXNwYWNlIHRoYXQgaXMgTk9UIGBvYmplY3RzYCBcdTIwMTQgYGFwcHNgLCBgbWVzc2FnZXNgLFxuICogICAgIGBkYXNoYm9hcmRzYCwgYGRhdGFzZXRzYCwgYHBhZ2VzYCwgYW5kIGFueSBuYW1lc3BhY2UgYFRyYW5zbGF0aW9uRGF0YWBcbiAqICAgICBnYWlucyBsYXRlciBcdTIwMTQgbGl2ZXMgaW4gYGFwcC50c2AuIE1lYXN1cmVkOiB0aG9zZSBuYW1lc3BhY2VzIHRvZ2V0aGVyXG4gKiAgICAgYXJlIHVuZGVyIGEgcXVhcnRlciBvZiB0aGUgYnVuZGxlLCBhbmQgdGhlIHNjaGVtYSBib3VuZHMgaG93IG1hbnkgY2FuXG4gKiAgICAgZXZlciBhcnJpdmUsIHNvIG9uZSBmaWxlIGhvbGRzIHRoZW0gd2l0aCByb29tIGxlZnQ7XG4gKiAgIC0gYG9iamVjdHNgIGlzIDY5LTc4JSBvZiBldmVyeSBidW5kbGUsIHNvIGl0IGlzIHBhcnRpdGlvbmVkIGFnYWluLCBvbmVcbiAqICAgICBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSBcdTIwMTQgYGN1c3RvbWVyYCwgYHBpcGVsaW5lYCwgYGNvbW1lcmNlYCxcbiAqICAgICBgc2VydmljZWAsIGBhY3Rpdml0eWAsIGBtYXJrZXRpbmdgIFx1MjAxNCBhbmQgYSBERVRBSUwgb2JqZWN0IGZvbGxvd3MgaXRzXG4gKiAgICAgbWFzdGVyOiBsaW5lIGl0ZW1zIGZvbGxvdyB0aGVpciBxdW90ZSBvciBvcHBvcnR1bml0eSxcbiAqICAgICBgY3JtX2V2ZW50X2F0dGVuZGVlYCBmb2xsb3dzIGBjcm1fZXZlbnRgLCBgY3JtX2NhbXBhaWduX21lbWJlcmBcbiAqICAgICBmb2xsb3dzIGBjcm1fY2FtcGFpZ25gLCBgY3JtX2FydGljbGVfZmVlZGJhY2tgIGZvbGxvd3NcbiAqICAgICBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYC5cbiAqXG4gKiBBIG5hbWVzcGFjZSBheGlzIEFMT05FIHdhcyBtZWFzdXJlZCBhbmQgcmVqZWN0ZWQ6IGl0IGxlYXZlcyBgb2JqZWN0c2AgYXRcbiAqIDY1LjdLQiwgMy45S0IgdW5kZXIgdGhlIGFkdmlzb3J5IGJhbmQsIHdoaWNoIGBvYmplY3RzYCBncm93dGggY3Jvc3NlcyBpblxuICogYWJvdXQgbmluZSBkYXlzLiBUaGUgZmFtaWx5IGF4aXMgcHV0cyB0aGUgbGFyZ2VzdCBwYXJ0IGF0IDI0LjIlIG9mIHRoZSBjYXAuXG4gKlxuICogXHUyNkEwXHVGRTBGIEEgbmV3IG9iamVjdCB0cmFuc2xhdGlvbiBiZWxvbmdzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LiBEbyBub3QgYWRkXG4gKiBpdCB0byB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW4gXHUyMDE0IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3RcbiAqIHRoZSBiYW5kLCB3aGljaCBpcyB3aGF0IHNwbGl0IHRoaXMgYnVuZGxlIGluIHRoZSBmaXJzdCBwbGFjZS5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgQSB2YWx1ZSB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUgZmFtaWx5IGxpdmVzIGluIGA8bG9jYWxlPi9fc2hhcmVkLnRzYC4gQVxuICogdmFsdWUgdXNlZCBieSBleGFjdGx5IG9uZSBmYW1pbHkgbGl2ZXMgaW4gdGhhdCBmYW1pbHkncyBmaWxlLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBUaGUga2V5IG9yZGVyIGJlbG93IGlzIExPQUQtQkVBUklORywgbm90IGNvc21ldGljLiBgb2JqZWN0c3RhY2sgYnVpbGRgXG4gKiBzZXJpYWxpc2VzIHRoaXMgb2JqZWN0IGludG8gYGRpc3Qvb2JqZWN0c3RhY2suanNvbmAgaW4gaW5zZXJ0aW9uIG9yZGVyIGFuZFxuICogbmV2ZXIgc29ydHMgaXQsIHNvIGxpc3RpbmcgdGhlIHJvd3MgaGVyZSBcdTIwMTQgcmF0aGVyIHRoYW4gc3ByZWFkaW5nIHRoZSBmYW1pbHlcbiAqIGZpbGVzIFx1MjAxNCBpcyB3aGF0IGtlZXBzIHRoZSBidWlsdCBhcnRpZmFjdCBieXRlLWlkZW50aWNhbCBhY3Jvc3MgdGhlIHNwbGl0LlxuICogVGhlIG9yZGVyIGlzIHRoaXMgYnVuZGxlJ3Mgb3duIGhpc3RvcmljYWwgYWNjcmV0aW9uIG9yZGVyIGFuZCBkaWZmZXJzXG4gKiBiZXR3ZWVuIGxvY2FsZXM7IHJlb3JkZXJpbmcgaXQgcmV3cml0ZXMgdGhlIGFydGlmYWN0LlxuICovXG5leHBvcnQgY29uc3QgemhDTjogVHJhbnNsYXRpb25EYXRhID0ge1xuICBvYmplY3RzOiB7XG4gICAgY3JtX2FjY291bnQ6IGN1c3RvbWVyLmNybV9hY2NvdW50LFxuICAgIGNybV9jb250YWN0OiBjdXN0b21lci5jcm1fY29udGFjdCxcbiAgICBjcm1fa25vd2xlZGdlX2FydGljbGU6IHNlcnZpY2UuY3JtX2tub3dsZWRnZV9hcnRpY2xlLFxuICAgIGNybV9mb3JlY2FzdDogcGlwZWxpbmUuY3JtX2ZvcmVjYXN0LFxuICAgIGNybV9sZWFkOiBwaXBlbGluZS5jcm1fbGVhZCxcbiAgICBjcm1fcXVvdGU6IGNvbW1lcmNlLmNybV9xdW90ZSxcbiAgICBjcm1fY29udHJhY3Q6IGNvbW1lcmNlLmNybV9jb250cmFjdCxcbiAgICBjcm1fY2FzZTogc2VydmljZS5jcm1fY2FzZSxcbiAgICBjcm1fdGFzazogYWN0aXZpdHkuY3JtX3Rhc2ssXG4gICAgY3JtX2NhbXBhaWduOiBtYXJrZXRpbmcuY3JtX2NhbXBhaWduLFxuICAgIGNybV9wcm9kdWN0OiBjb21tZXJjZS5jcm1fcHJvZHVjdCxcbiAgICBjcm1fb3Bwb3J0dW5pdHk6IHBpcGVsaW5lLmNybV9vcHBvcnR1bml0eSxcbiAgICBjcm1fZXZlbnQ6IGFjdGl2aXR5LmNybV9ldmVudCxcbiAgICBjcm1fZXZlbnRfYXR0ZW5kZWU6IGFjdGl2aXR5LmNybV9ldmVudF9hdHRlbmRlZSxcbiAgICBjcm1fYXJ0aWNsZV9mZWVkYmFjazogc2VydmljZS5jcm1fYXJ0aWNsZV9mZWVkYmFjayxcbiAgICBjcm1fY2FtcGFpZ25fbWVtYmVyOiBtYXJrZXRpbmcuY3JtX2NhbXBhaWduX21lbWJlcixcbiAgICBjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtOiBwaXBlbGluZS5jcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtLFxuICAgIGNybV9xdW90ZV9saW5lX2l0ZW06IGNvbW1lcmNlLmNybV9xdW90ZV9saW5lX2l0ZW0sXG4gIH0sXG4gIC4uLmFwcFN1cmZhY2UsXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQL2FwcC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlBcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQL2FwcC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG5pbXBvcnQgeyBRVU9URV9ESVNDT1VOVF9DRUlMSU5HIH0gZnJvbSAnLi4vLi4vb2JqZWN0cy9fdGhyZXNob2xkcyc7XG5cbi8qKlxuICogXHU2NUU1XHU2NzJDXHU4QTlFIChqYS1KUCkgXHUyMDE0IGV2ZXJ5IHRyYW5zbGF0aW9uIG5hbWVzcGFjZSBFWENFUFQgYG9iamVjdHNgOlxuICogYGFwcHNgLCBgbWVzc2FnZXNgLCBgZGFzaGJvYXJkc2AsIGBkYXRhc2V0c2AsIGBwYWdlc2AsIGBmbG93c2AuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAudHNgLlxuICpcbiAqIEEgbmFtZXNwYWNlIGBUcmFuc2xhdGlvbkRhdGFgIGdhaW5zIGxhdGVyIGxhbmRzIGhlcmUgdG9vLCBhbmQgdGhlIHJvb20gaXNcbiAqIG1lYXN1cmVkOiB0aGlzIGZpbGUgaXMgdGhlIHNtYWxsZXIgaGFsZiBvZiB0aGUgYnVuZGxlLCBhbmQgdGhlIHNjaGVtYSBib3VuZHNcbiAqIGhvdyBtYW55IG5hbWVzcGFjZXMgY2FuIGV2ZXIgYXJyaXZlLlxuICovXG5leHBvcnQgY29uc3QgYXBwU3VyZmFjZTogT21pdDxUcmFuc2xhdGlvbkRhdGEsICdvYmplY3RzJz4gPSB7XG4gIGFwcHM6IHtcbiAgICBjcm1fZW50ZXJwcmlzZToge1xuICAgICAgbGFiZWw6ICdIb3RDUk0nLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTU1QjZcdTY5NkRcdTMwRkJcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjlcdTMwRkJcdTMwREVcdTMwRkNcdTMwQjFcdTMwQzZcdTMwQTNcdTMwRjNcdTMwQjBcdTU0MTFcdTMwNTFcdTk4NjdcdTVCQTJcdTk1QTJcdTRGQzJcdTdCQTFcdTc0MDZcdTMwQjdcdTMwQjlcdTMwQzZcdTMwRTAnLFxuICAgICAgLy8gS2V5ZWQgYnkgbmF2aWdhdGlvbi1ub2RlIGBpZGAgKGEgZmxhdCBrZXlzcGFjZSByZWdhcmRsZXNzIG9mIGRlcHRoKS5cbiAgICAgIG5hdmlnYXRpb246IHtcbiAgICAgICAgbmF2X2hvbWU6IHsgbGFiZWw6ICdcdTMwREJcdTMwRkNcdTMwRTAnIH0sXG5cbiAgICAgICAgZ3JvdXBfc2FsZXM6IHsgbGFiZWw6ICdcdTU1QjZcdTY5NkQnIH0sXG4gICAgICAgIG5hdl9sZWFkOiB7IGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5JyB9LFxuICAgICAgICBuYXZfYWNjb3VudDogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OCcgfSxcbiAgICAgICAgbmF2X2FjY291bnRfd29ya2JlbmNoOiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMEVGXHUzMEZDXHUzMEFGXHUzMEQ5XHUzMEYzXHUzMEMxJyB9LFxuICAgICAgICBuYXZfY29udGFjdDogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNScgfSxcbiAgICAgICAgbmF2X29wcG9ydHVuaXR5OiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3JyB9LFxuICAgICAgICBuYXZfcXVvdGU6IHsgbGFiZWw6ICdcdTg5OEJcdTdBNEQnIH0sXG4gICAgICAgIG5hdl9jb250cmFjdDogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNCcgfSxcbiAgICAgICAgbmF2X3Byb2R1Y3Q6IHsgbGFiZWw6ICdcdTg4RkRcdTU0QzEnIH0sXG4gICAgICAgIG5hdl9zYWxlc19kYXNoYm9hcmQ6IHsgbGFiZWw6ICdcdTU1QjZcdTY5NkRcdTVCOUZcdTdFM0UnIH0sXG5cbiAgICAgICAgZ3JvdXBfd29yazogeyBsYWJlbDogJ1x1MzBERVx1MzBBNFx1MzBFRlx1MzBGQ1x1MzBBRicgfSxcbiAgICAgICAgbmF2X215X3Rhc2tzOiB7IGxhYmVsOiAnXHU3OUMxXHUzMDZFXHUzMEJGXHUzMEI5XHUzMEFGJyB9LFxuICAgICAgICBuYXZfbXlfZGVhbHM6IHsgbGFiZWw6ICdcdTc5QzFcdTMwNkVcdTU1NDZcdThBQzcnIH0sXG4gICAgICAgIG5hdl9teV9sZWFkczogeyBsYWJlbDogJ1x1NzlDMVx1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOScgfSxcbiAgICAgICAgbmF2X215X2Nhc2VzOiB7IGxhYmVsOiAnXHU3OUMxXHUzMDZFXHUzMEIxXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgICBuYXZfbXlfY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTMwREVcdTMwQTRcdTMwQUJcdTMwRUNcdTMwRjNcdTMwQzBcdTMwRkMnIH0sXG4gICAgICAgIG5hdl9hcHByb3ZhbF9yZXF1ZXN0czogeyBsYWJlbDogJ1x1NTNEN1x1NEZFMVx1MzBDOFx1MzBFQ1x1MzBBNCcgfSxcblxuICAgICAgICBncm91cF9hY3Rpdml0eTogeyBsYWJlbDogJ1x1NkQzQlx1NTJENScgfSxcbiAgICAgICAgbmF2X2V2ZW50OiB7IGxhYmVsOiAnXHUzMEE0XHUzMEQ5XHUzMEYzXHUzMEM4JyB9LFxuICAgICAgICBuYXZfYWN0aXZpdHlfZGFzaGJvYXJkOiB7IGxhYmVsOiAnXHU1NUI2XHU2OTZEXHU2RDNCXHU1MkQ1JyB9LFxuXG4gICAgICAgIGdyb3VwX21hcmtldGluZzogeyBsYWJlbDogJ1x1MzBERVx1MzBGQ1x1MzBCMVx1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMCcgfSxcbiAgICAgICAgbmF2X2NhbXBhaWduOiB7IGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzJyB9LFxuXG4gICAgICAgIGdyb3VwX3NlcnZpY2U6IHsgbGFiZWw6ICdcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjknIH0sXG4gICAgICAgIG5hdl9jYXNlOiB7IGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgICBuYXZfa25vd2xlZGdlOiB7IGxhYmVsOiAnXHUzMENBXHUzMEVDXHUzMEMzXHUzMEI4XHUzMEQ5XHUzMEZDXHUzMEI5JyB9LFxuICAgICAgICBuYXZfc2VydmljZV9kYXNoYm9hcmQ6IHsgbGFiZWw6ICdcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjlcdTY5ODJcdTg5ODEnIH0sXG5cbiAgICAgICAgZ3JvdXBfaW5zaWdodHM6IHsgbGFiZWw6ICdcdTMwQTRcdTMwRjNcdTMwQjVcdTMwQTRcdTMwQzgnIH0sXG4gICAgICAgIG5hdl9jcm1fZGFzaGJvYXJkOiB7IGxhYmVsOiAnQ1JNIFx1Njk4Mlx1ODk4MScgfSxcbiAgICAgICAgbmF2X2ZvcmVjYXN0OiB7IGxhYmVsOiAnXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEFEXHUzMEUzXHUzMEI5XHUzMEM4JyB9LFxuICAgICAgICBuYXZfcmVwb3J0X3BpcGVsaW5lX2NvdmVyYWdlOiB7IGxhYmVsOiAnXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHUzMEFCXHUzMEQwXHUzMEVDXHUzMEMzXHUzMEI4JyB9LFxuICAgICAgICBuYXZfcmVwb3J0X2xlYWRfaW5mbG93OiB7IGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU2RDQxXHU1MTY1JyB9LFxuICAgICAgICBuYXZfcmVwb3J0X3NsYTogeyBsYWJlbDogJ1NMQSBcdTVCOUZcdTdFM0UnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIG1lc3NhZ2VzOiB7XG4gICAgJ2NvbW1vbi5zYXZlJzogJ1x1NEZERFx1NUI1OCcsXG4gICAgJ2NvbW1vbi5jYW5jZWwnOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMEJCXHUzMEVCJyxcbiAgICAnY29tbW9uLmRlbGV0ZSc6ICdcdTUyNEFcdTk2NjQnLFxuICAgICdjb21tb24uZWRpdCc6ICdcdTdERThcdTk2QzYnLFxuICAgICdjb21tb24uY3JlYXRlJzogJ1x1NjVCMFx1ODk4Rlx1NEY1Q1x1NjIxMCcsXG4gICAgJ2NvbW1vbi5zZWFyY2gnOiAnXHU2OTFDXHU3RDIyJyxcbiAgICAnY29tbW9uLmZpbHRlcic6ICdcdTMwRDVcdTMwQTNcdTMwRUJcdTMwQkZcdTMwRkMnLFxuICAgICdjb21tb24uZXhwb3J0JzogJ1x1MzBBOFx1MzBBRlx1MzBCOVx1MzBERFx1MzBGQ1x1MzBDOCcsXG4gICAgJ2NvbW1vbi5iYWNrJzogJ1x1NjIzQlx1MzA4QicsXG4gICAgJ2NvbW1vbi5jb25maXJtJzogJ1x1NzhCQVx1OEE4RCcsXG4gICAgJ25hdi5zYWxlcyc6ICdcdTU1QjZcdTY5NkQnLFxuICAgICduYXYuc2VydmljZSc6ICdcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjknLFxuICAgICduYXYubWFya2V0aW5nJzogJ1x1MzBERVx1MzBGQ1x1MzBCMVx1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMCcsXG4gICAgJ25hdi5wcm9kdWN0cyc6ICdcdTg4RkRcdTU0QzEnLFxuICAgICduYXYuYW5hbHl0aWNzJzogJ1x1MzBBMlx1MzBDQVx1MzBFQVx1MzBDNlx1MzBBM1x1MzBBRlx1MzBCOScsXG4gICAgJ3N1Y2Nlc3Muc2F2ZWQnOiAnXHUzMEVDXHUzMEIzXHUzMEZDXHUzMEM5XHUzMDkyXHU0RkREXHU1QjU4XHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGJyxcbiAgICAnc3VjY2Vzcy5jb252ZXJ0ZWQnOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDkyXHU1OTA5XHU2M0RCXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGJyxcbiAgICAnY29uZmlybS5kZWxldGUnOiAnXHUzMDUzXHUzMDZFXHUzMEVDXHUzMEIzXHUzMEZDXHUzMEM5XHUzMDkyXHU1MjRBXHU5NjY0XHUzMDU3XHUzMDY2XHUzMDgyXHUzMDg4XHUzMDhEXHUzMDU3XHUzMDQ0XHUzMDY3XHUzMDU5XHUzMDRCXHVGRjFGJyxcbiAgICAnY29uZmlybS5jb252ZXJ0X2xlYWQnOiAnXHUzMDUzXHUzMDZFXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDkyXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMEZCXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMEZCXHU1NTQ2XHU4QUM3XHUzMDZCXHU1OTA5XHU2M0RCXHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGJyxcbiAgICAnZXJyb3IucmVxdWlyZWQnOiAnXHUzMDUzXHUzMDZFXHU5ODA1XHU3NkVFXHUzMDZGXHU1RkM1XHU5ODA4XHUzMDY3XHUzMDU5JyxcbiAgICAnZXJyb3IubG9hZF9mYWlsZWQnOiAnXHUzMEM3XHUzMEZDXHUzMEJGXHUzMDZFXHU4QUFEXHUzMDdGXHU4RkJDXHUzMDdGXHUzMDZCXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGJyxcbiAgfSxcbiAgZGFzaGJvYXJkczoge1xuICAgIHNhbGVzX2FjdGl2aXR5X2Rhc2hib2FyZDoge1xuICAgICAgbGFiZWw6ICdcdTU1QjZcdTY5NkRcdTZEM0JcdTUyRDUnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdThBQjBcdTMwNENcdTMwNjlcdTMwOENcdTMwNjBcdTMwNTFcdTk4NjdcdTVCQTJcdTMwNjhcdThBNzFcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOEJcdTMwNEJcdTMwMDFcdTMwNjlcdTMwNkVcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNENcdTZDODhcdTlFRDlcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOEJcdTMwNEInLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICBpbnRlcmFjdGlvbnNfaGVsZDogeyB0aXRsZTogJ1x1OEExOFx1OTMzMlx1NkUwOFx1MzA3Rlx1MzA2RVx1NUJGRVx1OEE3MScsIGRlc2NyaXB0aW9uOiAnXHU1QjlGXHU5NjlCXHUzMDZCXHU4ODRDXHUzMDhGXHUzMDhDXHUzMDVGXHU5NkZCXHU4QTcxXHUzMDY4XHU0RjFBXHU4QjcwJyB9LFxuICAgICAgICBtZWV0aW5nc19ib29rZWQ6IHsgdGl0bGU6ICdcdThBMkRcdTVCOUFcdTZFMDhcdTMwN0ZcdTMwNkVcdTRGMUFcdThCNzAnLCBkZXNjcmlwdGlvbjogJ1x1MzBBQlx1MzBFQ1x1MzBGM1x1MzBDMFx1MzBGQ1x1NEUwQVx1MzA2Qlx1MzA0Mlx1MzA4QVx1NjcyQVx1NUI5Rlx1NjVCRFx1MzA2RVx1NEYxQVx1OEI3MCcgfSxcbiAgICAgICAgY3VzdG9tZXJfbWludXRlczogeyB0aXRsZTogJ1x1OTg2N1x1NUJBMlx1NjNBNVx1ODlFNlx1NjY0Mlx1OTU5M1x1RkYwOFx1NTIwNlx1RkYwOScsIGRlc2NyaXB0aW9uOiAnXHU5ODY3XHU1QkEyXHUzMDY4XHU1NDExXHUzMDREXHU1NDA4XHUzMDYzXHUzMDVGXHU3RENGXHU2NjQyXHU5NTkzJyB9LFxuICAgICAgICB0YXNrc19jb21wbGV0ZWQ6IHsgdGl0bGU6ICdcdTVCOENcdTRFODZcdTMwQkZcdTMwQjlcdTMwQUYnLCBkZXNjcmlwdGlvbjogJ1x1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1MzA1N1x1MzA1Rlx1MzBENVx1MzBBOVx1MzBFRFx1MzBGQ1x1MzBBMlx1MzBDM1x1MzBENycgfSxcbiAgICAgICAgYWN0aXZpdHlfYnlfcmVwOiB7IHRpdGxlOiAnXHU2MkM1XHU1RjUzXHU4MDA1XHU1MjI1XHUzMDZFXHU2RDNCXHU1MkQ1JywgZGVzY3JpcHRpb246ICdcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNTRcdTMwNjhcdTMwNkVcdThBMThcdTkzMzJcdTZFMDhcdTMwN0ZcdTVCRkVcdThBNzFcdTY1NzAnIH0sXG4gICAgICAgIGFjdGl2aXR5X2J5X3dlZWs6IHsgdGl0bGU6ICdcdTkwMzFcdTZCMjFcdTMwNkVcdTZEM0JcdTUyRDVcdTkxQ0YnLCBkZXNjcmlwdGlvbjogJ1x1OTAzMVx1MzA0Mlx1MzA1Rlx1MzA4QVx1MzA2RVx1NUJGRVx1OEE3MVx1NjU3MCcgfSxcbiAgICAgICAgYWN0aXZpdHlfbWl4OiB7IHRpdGxlOiAnXHU2RDNCXHU1MkQ1XHUzMDZFXHU1MTg1XHU4QTMzJywgZGVzY3JpcHRpb246ICdcdTk2RkJcdThBNzFcdTMwRkJcdTRGMUFcdThCNzBcdTMwRkJcdTMwQzdcdTMwRTJcdTMwNkVcdTZCRDRcdTczODcnIH0sXG4gICAgICAgIGFjdGl2aXR5X2J5X3JlY29yZF90eXBlOiB7IHRpdGxlOiAnXHU2RDNCXHU1MkQ1XHUzMDZFXHU1QkZFXHU4QzYxJywgZGVzY3JpcHRpb246ICdcdTMwRDVcdTMwQTFcdTMwQ0RcdTMwRUJcdTMwNkVcdTMwNjlcdTMwNTNcdTMwNkJcdTZDRThcdTUyOUJcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOEJcdTMwNEInIH0sXG4gICAgICAgIGRlYWxfYWN0aXZpdHk6IHsgdGl0bGU6ICdcdTU1NDZcdThBQzdcdTRFMEFcdTMwNkVcdTVCRkVcdThBNzEnLCBkZXNjcmlwdGlvbjogJ1x1NTU0Nlx1OEFDN1x1MzA2Qlx1N0QxMFx1MzA2NVx1MzA0Rlx1OEExOFx1OTMzMlx1NkUwOFx1MzA3Rlx1NUJGRVx1OEE3MScgfSxcbiAgICAgICAgb3Blbl9kZWFsc19mb3JfYWN0aXZpdHk6IHsgdGl0bGU6ICdcdTMwQUFcdTMwRkNcdTMwRDdcdTMwRjNcdTU1NDZcdThBQzcnLCBkZXNjcmlwdGlvbjogJ1x1OTAzMlx1ODg0Q1x1NEUyRFx1MzA2RVx1NTU0Nlx1OEFDN1x1NjU3MCcgfSxcbiAgICAgICAgcXVpZXRfYWNjb3VudHNfMzA6IHsgdGl0bGU6ICczMCBcdTY1RTVcdTRFRTVcdTRFMEFcdTZDODhcdTlFRDknLCBkZXNjcmlwdGlvbjogJzEgXHUzMDRCXHU2NzA4XHU5NTkzXHU1QkZFXHU4QTcxXHU4QTE4XHU5MzMyXHUzMDZFXHUzMDZBXHUzMDQ0XHUzMEEyXHUzMEFGXHUzMEM2XHUzMEEzXHUzMEQ2XHU1M0Q2XHU1RjE1XHU1MTQ4JyB9LFxuICAgICAgICBxdWlldF9hY2NvdW50c182MDogeyB0aXRsZTogJzYwIFx1NjVFNVx1NEVFNVx1NEUwQVx1NkM4OFx1OUVEOScsIGRlc2NyaXB0aW9uOiAnMiBcdTMwNEJcdTY3MDhcdTMwNkVcdTZDODhcdTlFRDkgXHUyMDE0IFx1MzBFQVx1MzBCOVx1MzBBRlx1OTVCRVx1NTAyNCcgfSxcbiAgICAgICAgcXVpZXRfYWNjb3VudHNfOTA6IHsgdGl0bGU6ICc5MCBcdTY1RTVcdTRFRTVcdTRFMEFcdTZDODhcdTlFRDknLCBkZXNjcmlwdGlvbjogJ1x1NTZEQlx1NTM0QVx1NjcxRlx1MzA2Qlx1MzA4Rlx1MzA1Rlx1MzA4QVx1NjNBNVx1ODlFNlx1MzA2QVx1MzA1NycgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcm1fb3ZlcnZpZXdfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ0NSTSBcdTY5ODJcdTg5ODEnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTU4RjJcdTRFMEFcdTYzMDdcdTZBMTlcdTMwMDFcdTMwRDFcdTMwQTRcdTMwRDdcdTMwRTlcdTMwQTRcdTMwRjNcdTUyMDZcdTY3OTBcdTMwMDFcdTU1NDZcdThBQzdcdTMwQTRcdTMwRjNcdTMwQjVcdTMwQTRcdTMwQzgnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICB0b3RhbF9yZXZlbnVlOiB7IHRpdGxlOiAnXHU3RENGXHU1OEYyXHU0RTBBJywgZGVzY3JpcHRpb246ICdcdTVGNTNcdTY3MUZcdTMwNkVcdTYyMTBcdTdBQ0JcdTZFMDhcdTMwN0ZcdTU4RjJcdTRFMEEnIH0sXG4gICAgICAgIGFjdGl2ZV9kZWFsczogeyB0aXRsZTogJ1x1OTAzMlx1ODg0Q1x1NEUyRFx1MzA2RVx1NTU0Nlx1OEFDNycsIGRlc2NyaXB0aW9uOiAnXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHU0RTBBXHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHU1NTQ2XHU4QUM3JyB9LFxuICAgICAgICB3b25fZGVhbHM6IHsgdGl0bGU6ICdcdTYyMTBcdTdBQ0JcdTU1NDZcdThBQzdcdTY1NzAnLCBkZXNjcmlwdGlvbjogJ1x1NUY1M1x1NjcxRlx1MzA2Qlx1NjIxMFx1N0FDQlx1MzA1N1x1MzA1Rlx1NTU0Nlx1OEFDN1x1MzA2RVx1N0RDRlx1NjU3MCcgfSxcbiAgICAgICAgYXZnX2RlYWxfc2l6ZTogeyB0aXRsZTogJ1x1NUU3M1x1NTc0N1x1NTU0Nlx1OEFDN1x1ODk4Rlx1NkEyMScsIGRlc2NyaXB0aW9uOiAnXHU2MjEwXHU3QUNCXHU2RTA4XHUzMDdGXHU1NTQ2XHU4QUM3XHUzMDZFXHU1RTczXHU1NzQ3XHU5MUQxXHU5ODREJyB9LFxuICAgICAgICByZXZlbnVlX3RyZW5kczogeyB0aXRsZTogJ1x1NThGMlx1NEUwQVx1MzBDOFx1MzBFQ1x1MzBGM1x1MzBDOScsIGRlc2NyaXB0aW9uOiAnXHU5MDRFXHU1M0JCMTJcdTMwNEJcdTY3MDhcdTMwNkVcdTYyMTBcdTdBQ0JcdTZFMDhcdTMwN0ZcdTU4RjJcdTRFMEEnIH0sXG4gICAgICAgIGxlYWRfc291cmNlOiB7IHRpdGxlOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMEJEXHUzMEZDXHUzMEI5JywgZGVzY3JpcHRpb246ICdcdTczNzJcdTVGOTdcdTMwQzFcdTMwRTNcdTMwQ0RcdTMwRUJcdTUyMjVcdTMwNkVcdTMwRDFcdTMwQTRcdTMwRDdcdTMwRTlcdTMwQTRcdTMwRjNcdTkxRDFcdTk4NEQnIH0sXG4gICAgICAgIHBpcGVsaW5lX2J5X3N0YWdlOiB7IHRpdGxlOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4XHU1MjI1XHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzJywgZGVzY3JpcHRpb246ICdcdTU0MDRcdTU1QjZcdTY5NkRcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjhcdTMwNkVcdTMwQUFcdTMwRkNcdTMwRDdcdTMwRjNcdTU1NDZcdThBQzdcdTkxRDFcdTk4NEQnIH0sXG4gICAgICAgIHRvcF9wcm9kdWN0czogeyB0aXRsZTogJ1x1NThGMlx1MzA4Q1x1N0I0Qlx1ODhGRFx1NTRDMScsIGRlc2NyaXB0aW9uOiAnXHU4OEZEXHU1NEMxXHUzMEFCXHUzMEM2XHUzMEI0XHUzMEVBXHU1MjI1XHUzMDZFXHU1QjlBXHU0RkExXHUzMEQ5XHUzMEZDXHUzMEI5XHU1OEYyXHU0RTBBJyB9LFxuICAgICAgICBwaXBlbGluZV9ieV9vd25lcjogeyB0aXRsZTogJ1x1NjJDNVx1NUY1M1x1ODAwNVx1NTIyNVx1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycsIGRlc2NyaXB0aW9uOiAnXHU1NUI2XHU2OTZEXHU2MkM1XHU1RjUzXHU4MDA1XHUzMDU0XHUzMDY4XHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHU5MUQxXHU5ODREXHUzMDY4XHU1NTQ2XHU4QUM3XHU2NTcwJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGV4ZWN1dGl2ZV9kYXNoYm9hcmQ6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEE4XHUzMEIwXHUzMEJDXHUzMEFGXHUzMEM2XHUzMEEzXHUzMEQ2XHU2OTgyXHU4OTgxJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU3RDRDXHU1NUI2XHU1QzY0XHU1NDExXHUzMDUxXHUzMDZFXHU1OEYyXHU0RTBBXHUzMEZCXHU5ODY3XHU1QkEyXHUzMEZCXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHUzMDZFXHU0RTNCXHU4OTgxS1BJJyxcbiAgICAgIHdpZGdldHM6IHtcbiAgICAgICAgdG90YWxfcmV2ZW51ZV95dGQ6IHsgdGl0bGU6ICdcdTVFNzRcdTVFQTZcdTdEMkZcdThBMDhcdTU4RjJcdTRFMEEnLCBkZXNjcmlwdGlvbjogJ1x1NjcyQ1x1NUU3NFx1NUVBNlx1MzA2RVx1NjIxMFx1N0FDQlx1NkUwOFx1MzA3Rlx1NThGMlx1NEUwQScgfSxcbiAgICAgICAgdG90YWxfYWNjb3VudHM6IHsgdGl0bGU6ICdcdTMwQTJcdTMwQUZcdTMwQzZcdTMwQTNcdTMwRDZcdTUzRDZcdTVGMTVcdTUxNDgnLCBkZXNjcmlwdGlvbjogJ1x1NUMxMVx1MzA2QVx1MzA0Rlx1MzA2OFx1MzA4MjFcdTMwNjRcdTMwNkVcdTY3MDlcdTUyQjlcdTMwNkFcdTk1QTJcdTRGQzJcdTMwOTJcdTYzMDFcdTMwNjRcdTk4NjdcdTVCQTInIH0sXG4gICAgICAgIHRvdGFsX2NvbnRhY3RzOiB7IHRpdGxlOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHU2NTcwJywgZGVzY3JpcHRpb246ICdcdTU0MERcdTdDM0ZcdTMwNkJcdTc2N0JcdTkzMzJcdTMwNTVcdTMwOENcdTMwNUZcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDUnIH0sXG4gICAgICAgIG9wZW5fbGVhZHM6IHsgdGl0bGU6ICdcdTMwQUFcdTMwRkNcdTMwRDdcdTMwRjNcdTMwRUFcdTMwRkNcdTMwQzknLCBkZXNjcmlwdGlvbjogJ1x1NjcyQVx1NTkwOVx1NjNEQlx1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOScgfSxcbiAgICAgICAgcmV2ZW51ZV90cmVuZDogeyB0aXRsZTogJ1x1NThGMlx1NEUwQVx1MzBDOFx1MzBFQ1x1MzBGM1x1MzBDOScsIGRlc2NyaXB0aW9uOiAnXHU5MDRFXHU1M0JCMTJcdTMwNEJcdTY3MDhcdTMwNkVcdTYyMTBcdTdBQ0JcdTZFMDhcdTMwN0ZcdTU4RjJcdTRFMEEnIH0sXG4gICAgICAgIHJldmVudWVfYnlfaW5kdXN0cnk6IHsgdGl0bGU6ICdcdTY5NkRcdTdBMkVcdTUyMjVcdTU4RjJcdTRFMEEnLCBkZXNjcmlwdGlvbjogJ1x1NjcyQ1x1NUU3NFx1NUVBNlx1MzA2RVx1NjIxMFx1N0FDQlx1NkUwOFx1MzA3Rlx1NThGMlx1NEUwQVx1MzA5Mlx1Njk2RFx1N0EyRVx1NTIyNVx1MzA2Qlx1NTIwNlx1OTg1RScgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfc3RhZ2U6IHsgdGl0bGU6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjhcdTUyMjVcdTMwRDFcdTMwQTRcdTMwRDdcdTMwRTlcdTMwQTRcdTMwRjMnLCBkZXNjcmlwdGlvbjogJ1x1NTQwNFx1NTVCNlx1Njk2RFx1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCOFx1MzA2RVx1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1NTU0Nlx1OEFDN1x1OTFEMVx1OTg0RCcgfSxcbiAgICAgICAgbmV3X2FjY291bnRzX2J5X21vbnRoOiB7IHRpdGxlOiAnXHU2NUIwXHU4OThGXHU1M0Q2XHU1RjE1XHU1MTQ4JywgZGVzY3JpcHRpb246ICdcdTkwNEVcdTUzQkI2XHUzMDRCXHU2NzA4XHUzMDZFXHU1M0Q2XHU1RjE1XHU1MTQ4XHU0RjVDXHU2MjEwXHUzMERBXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgICBhY2NvdW50c19ieV9pbmR1c3RyeTogeyB0aXRsZTogJ1x1Njk2RFx1N0EyRVx1NTIyNVx1NTNENlx1NUYxNVx1NTE0OCcsIGRlc2NyaXB0aW9uOiAnXHU2OTZEXHU3QTJFXHUzMDU0XHUzMDY4XHUzMDZFXHU1RTc0XHU5NTkzXHU1OEYyXHU0RTBBXHU1NDA4XHU4QTA4XHUzMDY4XHU1M0Q2XHU1RjE1XHU1MTQ4XHU2NTcwJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHNhbGVzX2Rhc2hib2FyZDoge1xuICAgICAgbGFiZWw6ICdcdTU1QjZcdTY5NkRcdTVCOUZcdTdFM0UnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTMwRDFcdTMwQTRcdTMwRDdcdTMwRTlcdTMwQTRcdTMwRjNcdTUyMDZcdTY3OTBcdTMwMDFcdTUyRERcdTczODdcdTMwQzhcdTMwRUNcdTMwRjNcdTMwQzlcdTMwMDFcdTYyQzVcdTVGNTNcdTgwMDVcdTUyMjVcdTMwRDFcdTMwRDVcdTMwQTlcdTMwRkNcdTMwREVcdTMwRjNcdTMwQjknLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICB0b3RhbF9waXBlbGluZV92YWx1ZTogeyB0aXRsZTogJ1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGM1x1NTQwOFx1OEEwOCcsIGRlc2NyaXB0aW9uOiAnXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHU1NTQ2XHU4QUM3XHU5MUQxXHU5ODREXHUzMDZFXHU1NDA4XHU4QTA4JyB9LFxuICAgICAgICBjbG9zZWRfd29uX3F0ZDogeyB0aXRsZTogJ1x1NEVDQVx1NTZEQlx1NTM0QVx1NjcxRlx1NjIxMFx1N0FDQlx1OTg0RCcsIGRlc2NyaXB0aW9uOiAnXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHUzMDZCXHU2MjEwXHU3QUNCXHUzMDU3XHUzMDVGXHU1OEYyXHU0RTBBJyB9LFxuICAgICAgICBvcGVuX29wcG9ydHVuaXRpZXM6IHsgdGl0bGU6ICdcdTMwQUFcdTMwRkNcdTMwRDdcdTMwRjNcdTU1NDZcdThBQzcnLCBkZXNjcmlwdGlvbjogJ1x1OTAzMlx1ODg0Q1x1NEUyRFx1MzA2RVx1MzBBMlx1MzBBRlx1MzBDNlx1MzBBM1x1MzBENlx1NTU0Nlx1OEFDNycgfSxcbiAgICAgICAgYXZnX2RlYWxfc2l6ZTogeyB0aXRsZTogJ1x1NUU3M1x1NTc0N1x1NTU0Nlx1OEFDN1x1ODk4Rlx1NkEyMScsIGRlc2NyaXB0aW9uOiAnXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHUzMDZFXHU2MjEwXHU3QUNCXHU2RTA4XHUzMDdGXHU1NTQ2XHU4QUM3XHUzMDZFXHU1RTczXHU1NzQ3XHU5MUQxXHU5ODREJyB9LFxuICAgICAgICBwaXBlbGluZV9ieV9zdGFnZTogeyB0aXRsZTogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCOFx1NTIyNVx1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycsIGRlc2NyaXB0aW9uOiAnXHU1NDA0XHU1NUI2XHU2OTZEXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4XHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHU1NTQ2XHU4QUM3XHU5MUQxXHU5ODREJyB9LFxuICAgICAgICBtb250aGx5X3JldmVudWVfdHJlbmQ6IHsgdGl0bGU6ICdcdTY3MDhcdTZCMjFcdTU4RjJcdTRFMEFcdTMwQzhcdTMwRUNcdTMwRjNcdTMwQzknLCBkZXNjcmlwdGlvbjogJ1x1OTA0RVx1NTNCQjEyXHUzMDRCXHU2NzA4XHUzMDZFXHU2MjEwXHU3QUNCXHU2RTA4XHUzMDdGXHU1OEYyXHU0RTBBJyB9LFxuICAgICAgICBwaXBlbGluZV9ieV9mb3JlY2FzdF9jYXRlZ29yeTogeyB0aXRsZTogJ1x1NEU4OFx1NkUyQ1x1MzBBQlx1MzBDNlx1MzBCNFx1MzBFQVx1NTIyNVx1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycsIGRlc2NyaXB0aW9uOiAnXHU1OEYyXHU0RTBBXHU0RTg4XHU2RTJDXHUzMEFCXHUzMEM2XHUzMEI0XHUzMEVBXHU1MjI1XHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHU5MUQxXHU5ODREJyB9LFxuICAgICAgICBsZWFkX3NvdXJjZV9icmVha2Rvd246IHsgdGl0bGU6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwQkRcdTMwRkNcdTMwQjknLCBkZXNjcmlwdGlvbjogJ1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGM1x1MzA2RVx1NkQ0MVx1NTE2NVx1NTE0MycgfSxcbiAgICAgICAgb3Blbl9waXBlbGluZV9ieV9vd25lcjogeyB0aXRsZTogJ1x1NjJDNVx1NUY1M1x1ODAwNVx1NTIyNVx1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycsIGRlc2NyaXB0aW9uOiAnXHU1NUI2XHU2OTZEXHU2MkM1XHU1RjUzXHU4MDA1XHUzMDU0XHUzMDY4XHUzMDZFXHU5MDMyXHU4ODRDXHU0RTJEXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHU5MUQxXHU5ODREXHUzMEZCXHU1NTQ2XHU4QUM3XHU2NTcwXHUzMEZCXHU1RTczXHU1NzQ3XHU1MkREXHU3Mzg3JyB9LFxuICAgICAgICBxdW90YV9hdHRhaW5tZW50X2J5X3JlcDogeyB0aXRsZTogJ1x1NjJDNVx1NUY1M1x1ODAwNVx1NTIyNVx1MzBDRVx1MzBFQlx1MzBERVx1OTA1NFx1NjIxMFx1NzJCNlx1NkNDMScsIGRlc2NyaXB0aW9uOiAnXHU0RTg4XHU2RTJDXHUzMEI5XHUzMENBXHUzMEMzXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEMzXHUzMEM4XHUzMDZCXHU1N0ZBXHUzMDY1XHUzMDRGXHU2MkM1XHU1RjUzXHU4MDA1XHU1MjI1XHUzMDZFXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHUzMENFXHUzMEVCXHUzMERFXHUzMEZCXHU2MjEwXHU3RDA0XHU1M0NFXHU3NkNBXHUzMEZCXHU5MDU0XHU2MjEwXHU3Mzg3JyB9LFxuICAgICAgICBwaXBlbGluZV9zdGFnZV9ieV9zb3VyY2U6IHsgdGl0bGU6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjggXHUwMEQ3IFx1MzBFQVx1MzBGQ1x1MzBDOVx1MzBCRFx1MzBGQ1x1MzBCOScsIGRlc2NyaXB0aW9uOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4XHUzMDY4XHUzMEJEXHUzMEZDXHUzMEI5XHU1MjI1XHUzMDZFXHU5MDMyXHU4ODRDXHU0RTJEXHU1NTQ2XHU4QUM3XHU5MUQxXHU5ODREXHUzMDZFXHUzMEFGXHUzMEVEXHUzMEI5XHU5NkM2XHU4QTA4JyB9LFxuICAgICAgICB3aW5fcmF0ZV8xMm06IHsgdGl0bGU6ICdcdTUyRERcdTczODdcdUZGMDhcdTc2RjRcdThGRDExMlx1MzA0Qlx1NjcwOFx1RkYwOScsIGRlc2NyaXB0aW9uOiAnXHU3NkY0XHU4RkQxMTJcdTMwNEJcdTY3MDhcdTMwNkJcdTZDN0FcdTc3NDBcdTMwNTdcdTMwNUZcdTU1NDZcdThBQzdcdTMwNkVcdTMwNDZcdTMwNjFcdTYyMTBcdTdBQ0JcdTMwNTdcdTMwNUZcdTUyNzJcdTU0MDgnIH0sXG4gICAgICAgIHdvbl9kZWFsc18xMm06IHsgdGl0bGU6ICdcdTYyMTBcdTdBQ0JcdTU1NDZcdThBQzdcdTY1NzBcdUZGMDhcdTc2RjRcdThGRDExMlx1MzA0Qlx1NjcwOFx1RkYwOScsIGRlc2NyaXB0aW9uOiAnXHU1MkREXHU3Mzg3XHUzMDZFXHU1MjA2XHU1QjUwJyB9LFxuICAgICAgICBsb3N0X2RlYWxzXzEybTogeyB0aXRsZTogJ1x1NTkzMVx1NkNFOFx1NTU0Nlx1OEFDN1x1NjU3MFx1RkYwOFx1NzZGNFx1OEZEMTEyXHUzMDRCXHU2NzA4XHVGRjA5JywgZGVzY3JpcHRpb246ICdcdTUyRERcdTczODdcdTMwNkVcdTUyMDZcdTZCQ0RcdTMwNkVcdTMwODJcdTMwNDZcdTUzNEFcdTUyMDYnIH0sXG4gICAgICAgIHdpbl9yYXRlX2J5X293bmVyOiB7IHRpdGxlOiAnXHU2MkM1XHU1RjUzXHU4MDA1XHU1MjI1IFx1NTNEN1x1NkNFOFx1RkYwRlx1NTkzMVx1NkNFOCcsIGRlc2NyaXB0aW9uOiAnXHU3NkY0XHU4RkQxMTJcdTMwNEJcdTY3MDhcdTMwNkVcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNTRcdTMwNjhcdTMwNkVcdTYyMTBcdTdBQ0JcdTY1NzBcdTMwRkJcdTU5MzFcdTZDRThcdTY1NzBcdTMwRkJcdTUyRERcdTczODcnIH0sXG4gICAgICAgIHdpbl9yYXRlX2J5X2xlYWRfc291cmNlOiB7IHRpdGxlOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMEJEXHUzMEZDXHUzMEI5XHU1MjI1IFx1NTNEN1x1NkNFOFx1RkYwRlx1NTkzMVx1NkNFOCcsIGRlc2NyaXB0aW9uOiAnXHU1QjlGXHU5NjlCXHUzMDZCXHU2MjEwXHU3QUNCXHUzMDZCXHUzMDY0XHUzMDZBXHUzMDRDXHUzMDhCXHUzMDZFXHUzMDZGXHUzMDY5XHUzMDZFXHUzMEJEXHUzMEZDXHUzMEI5XHUzMDRCIFx1MjAxNCBcdTc2RjRcdThGRDExMlx1MzA0Qlx1NjcwOCcgfSxcbiAgICAgICAgbG9zc19yZWFzb25fYnJlYWtkb3duOiB7IHRpdGxlOiAnXHU1OTMxXHU2Q0U4XHUzMDZFXHU3NDA2XHU3NTMxJywgZGVzY3JpcHRpb246ICdcdTc2RjRcdThGRDExMlx1MzA0Qlx1NjcwOFx1MzA2RVx1NTkzMVx1NkNFOFx1NTU0Nlx1OEFDN1x1MzA5Mlx1NzQwNlx1NzUzMVx1NTIyNVx1MzA2Qlx1OTZDNlx1OEEwOCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzZXJ2aWNlX2Rhc2hib2FyZDoge1xuICAgICAgbGFiZWw6ICdcdTMwQUJcdTMwQjlcdTMwQkZcdTMwREVcdTMwRkNcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjknLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTMwQjFcdTMwRkNcdTMwQjlcdThDQTBcdTgzNzdcdTMwMDFTTEFcdTUwNjVcdTUxNjhcdTYwMjdcdTMwMDFcdTg5RTNcdTZDN0FcdTMwRDFcdTMwRDVcdTMwQTlcdTMwRkNcdTMwREVcdTMwRjNcdTMwQjknLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICBvcGVuX2Nhc2VzOiB7IHRpdGxlOiAnXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHUzMEIxXHUzMEZDXHUzMEI5JywgZGVzY3JpcHRpb246ICdcdTMwN0VcdTMwNjBcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTMwNTVcdTMwOENcdTMwNjZcdTMwNDRcdTMwNkFcdTMwNDRcdTMwQjFcdTMwRkNcdTMwQjknIH0sXG4gICAgICAgIGNyaXRpY2FsX2Nhc2VzOiB7IHRpdGxlOiAnXHU5MUNEXHU1OTI3XHUzMEIxXHUzMEZDXHUzMEI5JywgZGVzY3JpcHRpb246ICdcdTUxMkFcdTUxNDhcdTVFQTZcdTMwMENcdTkxQ0RcdTU5MjdcdTMwMERcdTMwNkVcdTMwQUFcdTMwRkNcdTMwRDdcdTMwRjNcdTMwQjFcdTMwRkNcdTMwQjknIH0sXG4gICAgICAgIGF2Z19yZXNvbHV0aW9uX3RpbWU6IHsgdGl0bGU6ICdcdTVFNzNcdTU3NDdcdTg5RTNcdTZDN0FcdTY2NDJcdTk1OTMnLCBkZXNjcmlwdGlvbjogJ1x1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1MzA3RVx1MzA2N1x1MzA2RVx1NUU3M1x1NTc0N1x1NjY0Mlx1OTU5M1x1RkYwOFx1NjY0Mlx1RkYwOScgfSxcbiAgICAgICAgc2xhX3Zpb2xhdGlvbnM6IHsgdGl0bGU6ICdTTEEgXHU5MDU1XHU1M0NEJywgZGVzY3JpcHRpb246ICdTTEEgXHUzMDkyXHU4RDg1XHU5MDRFXHUzMDU3XHUzMDVGXHUzMEIxXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgICBjYXNlc19ieV9zdGF0dXM6IHsgdGl0bGU6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjlcdTUyMjVcdTMwQjFcdTMwRkNcdTMwQjknLCBkZXNjcmlwdGlvbjogJ1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGM1x1NTE2OFx1NEY1M1x1MzA2RVx1MzBFRlx1MzBGQ1x1MzBBRlx1MzBFRFx1MzBGQ1x1MzBDOVx1NTIwNlx1NUUwMycgfSxcbiAgICAgICAgY2FzZXNfYnlfcHJpb3JpdHk6IHsgdGl0bGU6ICdcdTUxMkFcdTUxNDhcdTVFQTZcdTUyMjVcdTMwQjFcdTMwRkNcdTMwQjknLCBkZXNjcmlwdGlvbjogJ1x1N0RDQVx1NjAyNVx1NUVBNlx1NTIyNVx1MzA2RVx1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1MzBCMVx1MzBGQ1x1MzBCOVx1NjlDQlx1NjIxMCcgfSxcbiAgICAgICAgY2FzZXNfYnlfb3JpZ2luOiB7IHRpdGxlOiAnXHU3NjdBXHU3NTFGXHU2RTkwXHU1MjI1XHUzMEIxXHUzMEZDXHUzMEI5JywgZGVzY3JpcHRpb246ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTMwNkVcdTZENDFcdTUxNjVcdTMwQzFcdTMwRTNcdTMwQ0RcdTMwRUInIH0sXG4gICAgICAgIGRhaWx5X2Nhc2Vfdm9sdW1lOiB7IHRpdGxlOiAnXHU2NUU1XHU2QjIxXHUzMEIxXHUzMEZDXHUzMEI5XHU0RUY2XHU2NTcwJywgZGVzY3JpcHRpb246ICdcdTkwNEVcdTUzQkIzMFx1NjVFNVx1OTU5M1x1MzA2RVx1NjVCMFx1ODk4Rlx1MzBCMVx1MzBGQ1x1MzBCOScgfSxcbiAgICAgICAgc2xhX2NvbXBsaWFuY2VfZ2F1Z2U6IHsgdGl0bGU6ICdTTEEgXHU5MDU0XHU2MjEwXHU3Mzg3JywgZGVzY3JpcHRpb246ICdcdTVGNTNcdTY3MUYgU0xBIFx1NTE4NVx1MzA2Qlx1ODlFM1x1NkM3QVx1MzA1N1x1MzA1Rlx1MzBCMVx1MzBGQ1x1MzBCOVx1MzA2RVx1NTI3Mlx1NTQwOCcgfSxcbiAgICAgICAga2JfZGVmbGVjdGlvbl9yYXRlOiB7IHRpdGxlOiAnXHUzMENBXHUzMEVDXHUzMEMzXHUzMEI4XHU4OUUzXHU2QzdBXHU3Mzg3JywgZGVzY3JpcHRpb246ICdcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTMwNTdcdTMwNUZcdTMwQjFcdTMwRkNcdTMwQjlcdTMwNkVcdTMwNDZcdTMwNjFcdTMwQ0FcdTMwRUNcdTMwQzNcdTMwQjhcdThBMThcdTRFOEJcdTMwNjdcdTg5RTNcdTZDN0FcdTMwNTdcdTMwNUZcdTUyNzJcdTU0MDgnIH0sXG4gICAgICAgIGtiX3Jlc29sdmVkX2Nhc2VzOiB7IHRpdGxlOiAnXHUzMENBXHUzMEVDXHUzMEMzXHUzMEI4XHUzMDY3XHU4OUUzXHU2QzdBJywgZGVzY3JpcHRpb246ICdcdTg5RTNcdTZDN0FcdTMwNTdcdTMwNUZcdThBMThcdTRFOEJcdTMwNENcdTdEMTBcdTMwNjVcdTMwNEZcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTZFMDhcdTMwN0ZcdTMwQjFcdTMwRkNcdTMwQjknIH0sXG4gICAgICAgIGNsb3NlZF9jYXNlc190b3RhbDogeyB0aXRsZTogJ1x1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1NkUwOFx1MzA3Rlx1MzBCMVx1MzBGQ1x1MzBCOScsIGRlc2NyaXB0aW9uOiAnXHUzMENBXHUzMEVDXHUzMEMzXHUzMEI4XHU4OUUzXHU2QzdBXHU3Mzg3XHUzMDZFXHU1MjA2XHU2QkNEJyB9LFxuICAgICAgICB0b3BfcmVzb2x2aW5nX2FydGljbGVzOiB7IHRpdGxlOiAnXHU4OUUzXHU2QzdBXHU0RUY2XHU2NTcwXHUzMDZFXHU1OTFBXHUzMDQ0XHU4QTE4XHU0RThCJywgZGVzY3JpcHRpb246ICdcdTg5RTNcdTZDN0FcdTMwNTdcdTMwNUZcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTZFMDhcdTMwN0ZcdTMwQjFcdTMwRkNcdTMwQjlcdTY1NzBcdTMwNjdcdTRFMjZcdTMwNzlcdTMwNUZcdTMwQ0FcdTMwRUNcdTMwQzNcdTMwQjhcdThBMThcdTRFOEInIH0sXG4gICAgICAgIG15X29wZW5fY2FzZXNfYnlfcHJpb3JpdHk6IHsgdGl0bGU6ICdcdTUxMkFcdTUxNDhcdTVFQTZcdTUyMjVcdTMwNkVcdTc5QzFcdTMwNkVcdTMwQUFcdTMwRkNcdTMwRDdcdTMwRjNcdTMwQjFcdTMwRkNcdTMwQjknLCBkZXNjcmlwdGlvbjogJ1x1MzA0Mlx1MzA2QVx1MzA1Rlx1MzA2RVx1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA2OFx1MzA1RFx1MzA2RVNMQVx1OTA1NVx1NTNDRFx1NzM4N1x1MzA5Mlx1NTEyQVx1NTE0OFx1NUVBNlx1NTIyNVx1MzA2Qlx1OTZDNlx1OEEwOCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgLy8gYHRpdGxlYCAvIGBzdWJ0aXRsZWAgdHJhbnNsYXRlIHRoZSBwYWdlJ3MgYHBhZ2U6aGVhZGVyYDsgYHRpdGxlYCBmYWxscyBiYWNrXG4gIC8vIHRvIGBsYWJlbGAgd2hlbiBvbWl0dGVkLCBzbyBpdCBpcyBhdXRob3JlZCBvbmx5IHdoZXJlIHRoZSB0d28gZGlmZmVyLlxuICAvLyBIZWFkZXIgc3RyaW5ncyBjYXJyeWluZyBge2ZpZWxkfWAgdG9rZW5zIGtlZXAgdGhlIHRva2VuIHNwZWxsaW5nIHZlcmJhdGltIFx1MjAxNFxuICAvLyB0aGUgY29uc29sZSBzdWJzdGl0dXRlcyBvbiB0aGUgcmF3IGtleSwgc28gYSB0cmFuc2xhdGVkIHRva2VuIHJlc29sdmVzIHRvXG4gIC8vIG5vdGhpbmcgYW5kIHRoZSBoZWFkZXIgcmVuZGVycyBibGFuay5cbiAgZGF0YXNldHM6IHtcbiAgICBhY2NvdW50X21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU2MzA3XHU2QTE5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU2OTZEXHU3QTJFXHUzMEZCXHU3QTJFXHU1MjI1XHUzMDU0XHUzMDY4XHUzMDZCXHU1M0Q2XHU1RjE1XHU1MTQ4XHU2NTcwXHUzMDkyXHU5NkM2XHU4QTA4XHUzMDU5XHUzMDhCXHUzMEJCXHUzMERFXHUzMEYzXHUzMEM2XHUzMEEzXHUzMEMzXHUzMEFGXHUzMEVDXHUzMEE0XHUzMEU0XHUzMEZDJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgaW5kdXN0cnk6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1Njk2RFx1N0EyRScsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1N0EyRVx1NTIyNScsXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWF0ZWRfYXQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NEY1Q1x1NjIxMFx1NjVFNScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbWVhc3VyZXM6IHtcbiAgICAgICAgYWNjb3VudF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgYW5udWFsX3JldmVudWVfc3VtOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVFNzRcdTk1OTNcdTU4RjJcdTRFMEEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNhc2VfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTYzMDdcdTZBMTknLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTY1NzBcdTMwRkJcdTg5RTNcdTZDN0FcdTY2NDJcdTk1OTNcdTMwRkJTTEEgXHUzMDkyXHU5NkM2XHU4QTA4XHUzMDU5XHUzMDhCXHUzMEJCXHUzMERFXHUzMEYzXHUzMEM2XHUzMEEzXHUzMEMzXHUzMEFGXHUzMEVDXHUzMEE0XHUzMEU0XHUzMEZDJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgY3JlYXRlZF9hdDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU0RjVDXHU2MjEwXHU2NUU1JyxcbiAgICAgICAgfSxcbiAgICAgICAgb3JpZ2luOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTc2N0FcdTc1MUZcdTUxNDMnLFxuICAgICAgICB9LFxuICAgICAgICBwcmlvcml0eToge1xuICAgICAgICAgIGxhYmVsOiAnXHU1MTJBXHU1MTQ4XHU1RUE2JyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZWRfYXJ0aWNsZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU4OUUzXHU2QzdBXHUzMDZCXHU0RjdGXHU3NTI4XHUzMDU3XHUzMDVGXHUzMENBXHUzMEVDXHUzMEMzXHUzMEI4XHU4QTE4XHU0RThCJyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTdBMkVcdTUyMjUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGF2Z19yZXNvbHV0aW9uOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVFNzNcdTU3NDdcdTg5RTNcdTZDN0FcdTY2NDJcdTk1OTNcdUZGMDhcdTY2NDJcdTk1OTNcdUZGMDknLFxuICAgICAgICB9LFxuICAgICAgICBhdmdfc2xhX3Zpb2xhdGVkOiB7XG4gICAgICAgICAgbGFiZWw6ICdTTEEgXHU5MDU1XHU1M0NEXHU3Mzg3JyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FzZV9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VkX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTZFMDhcdTMwN0ZcdTMwQjFcdTMwRkNcdTMwQjknLFxuICAgICAgICB9LFxuICAgICAgICBrYl9kZWZsZWN0aW9uX3JhdGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1MzBDQVx1MzBFQ1x1MzBDM1x1MzBCOFx1MzBEOVx1MzBGQ1x1MzBCOVx1ODFFQVx1NURGMVx1ODlFM1x1NkM3QVx1NzM4NycsXG4gICAgICAgIH0sXG4gICAgICAgIGtiX3Jlc29sdmVkX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwQ0FcdTMwRUNcdTMwQzNcdTMwQjhcdTMwRDlcdTMwRkNcdTMwQjlcdTMwNjdcdTg5RTNcdTZDN0FcdTMwNTdcdTMwNUZcdTRFRjZcdTY1NzAnLFxuICAgICAgICB9LFxuICAgICAgICBzbGFfY29tcGxpYW5jZV9yYXRlOiB7XG4gICAgICAgICAgbGFiZWw6ICdTTEEgXHU5MDc1XHU1Qjg4XHU3Mzg3JyxcbiAgICAgICAgfSxcbiAgICAgICAgc2xhX21ldF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnU0xBIFx1MzA5Mlx1NkU4MFx1MzA1Rlx1MzA1N1x1MzA1Rlx1MzBCMVx1MzBGQ1x1MzBCOScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29udGFjdF9tZXRyaWNzOiB7XG4gICAgICBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNVx1NjMwN1x1NkExOScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNVx1NjU3MFx1MzA5Mlx1OTZDNlx1OEEwOFx1MzA1OVx1MzA4Qlx1MzBCQlx1MzBERVx1MzBGM1x1MzBDNlx1MzBBM1x1MzBDM1x1MzBBRlx1MzBFQ1x1MzBBNFx1MzBFNFx1MzBGQycsXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBjb250YWN0X2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTY1NzAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGV2ZW50X21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnXHU2RDNCXHU1MkQ1XHU2MzA3XHU2QTE5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU0RjFBXHU4QjcwXHUzMEZCXHU5MDFBXHU4QTcxXHUzMEZCXHU2M0E1XHU4OUU2XHUzMDZFXHU2NUIwXHUzMDU3XHUzMDU1XHUzMDkyXHU5NkM2XHU4QTA4XHUzMDU5XHUzMDhCXHUzMEJCXHUzMERFXHUzMEYzXHUzMEM2XHUzMEEzXHUzMEMzXHUzMEFGXHUzMEVDXHUzMEE0XHUzMEU0XHUzMEZDJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgb3duZXI6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NjI0MFx1NjcwOVx1ODAwNScsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0ZWRfdG9fdHlwZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU5NUEyXHU5MDIzXHU1MTQ4JyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhcnRfZGF0ZXRpbWU6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NkQzQlx1NTJENVx1OTAzMScsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1czoge1xuICAgICAgICAgIGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5JyxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU2RDNCXHU1MkQ1XHU3QTJFXHU1MjI1JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBhdmdfbWludXRlczoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1RTczXHU1NzQ3XHU2MjQwXHU4OTgxXHU2NjQyXHU5NTkzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NkQzQlx1NTJENVx1NEVGNlx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICAgIHRvdGFsX21pbnV0ZXM6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTQwOFx1OEEwOFx1NTIwNlx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZm9yZWNhc3RfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdcdTMwRDVcdTMwQTlcdTMwRkNcdTMwQURcdTMwRTNcdTMwQjlcdTMwQzhcdTYzMDdcdTZBMTknLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNTRcdTMwNjhcdTMwNkVcdTc2RUVcdTZBMTlcdTMwRkJcdTkwNTRcdTYyMTBcdTczODdcdTMwRkJcdTMwRDFcdTMwQTRcdTMwRDdcdTMwRTlcdTMwQTRcdTMwRjNcdTMwQUJcdTMwRDBcdTMwRUNcdTMwQzNcdTMwQjhcdTMwOTJcdTk2QzZcdThBMDhcdTMwNTlcdTMwOEJcdTMwQkJcdTMwREVcdTMwRjNcdTMwQzZcdTMwQTNcdTMwQzNcdTMwQUZcdTMwRUNcdTMwQTRcdTMwRTRcdTMwRkMnLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBvd25lcjoge1xuICAgICAgICAgIGxhYmVsOiAnXHU2MjQwXHU2NzA5XHU4MDA1JyxcbiAgICAgICAgfSxcbiAgICAgICAgcGVyaW9kOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTY3MUZcdTk1OTNcdTdBMkVcdTUyMjUnLFxuICAgICAgICB9LFxuICAgICAgICBwZXJpb2RfbGFiZWw6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NjcxRlx1OTU5MycsXG4gICAgICAgIH0sXG4gICAgICAgIHBlcmlvZF9zdGFydDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU2NzFGXHU5NTkzXHU5NThCXHU1OUNCJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBhdHRhaW5tZW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTkwNTRcdTYyMTBcdTczODcnLFxuICAgICAgICB9LFxuICAgICAgICBjbG9zZWRfc3VtOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTZFMDhcdTMwN0YnLFxuICAgICAgICB9LFxuICAgICAgICBjb21taXRfc3VtOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwQjNcdTMwREZcdTMwQzNcdTMwQzgnLFxuICAgICAgICB9LFxuICAgICAgICBwaXBlbGluZV9zdW06IHtcbiAgICAgICAgICBsYWJlbDogJ1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycsXG4gICAgICAgIH0sXG4gICAgICAgIHF1b3RhX3N1bToge1xuICAgICAgICAgIGxhYmVsOiAnXHU3NkVFXHU2QTE5JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsZWFkX21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU2MzA3XHU2QTE5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU2NTcwXHUzMDkyXHU5NkM2XHU4QTA4XHUzMDU5XHUzMDhCXHUzMEJCXHUzMERFXHUzMEYzXHUzMEM2XHUzMEEzXHUzMEMzXHUzMEFGXHUzMEVDXHUzMEE0XHUzMEU0XHUzMEZDJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgY3JlYXRlZF9hdDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU0RjVDXHU2MjEwXHU2NUU1JyxcbiAgICAgICAgfSxcbiAgICAgICAgbGFzdF9jb250YWN0ZWRfZGF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU2NzAwXHU3RDQyXHU2M0E1XHU4OUU2XHU2NUU1JyxcbiAgICAgICAgfSxcbiAgICAgICAgbGVhZF9zb3VyY2U6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1MzBCRFx1MzBGQ1x1MzBCOScsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1czoge1xuICAgICAgICAgIGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBsZWFkX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTY1NzAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG9wcG9ydHVuaXR5X21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHU2MzA3XHU2QTE5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU1NUI2XHU2OTZEXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHUzMDZFXHU0RUY2XHU2NTcwXHUzMDY4XHU5MUQxXHU5ODREXHUzMDkyXHU5NkM2XHU4QTA4XHUzMDU5XHUzMDhCXHUzMEJCXHUzMERFXHUzMEYzXHUzMEM2XHUzMEEzXHUzMEMzXHUzMEFGXHUzMEVDXHUzMEE0XHUzMEU0XHUzMEZDJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgYWNjb3VudF9pbmR1c3RyeToge1xuICAgICAgICAgIGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZFXHU2OTZEXHU3QTJFJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VfZGF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU1QjhDXHU0RTg2XHU0RTg4XHU1QjlBXHU2NUU1JyxcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VfcXVhcnRlcjoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1QjhDXHU0RTg2XHU1NkRCXHU1MzRBXHU2NzFGJyxcbiAgICAgICAgfSxcbiAgICAgICAgZm9yZWNhc3RfY2F0ZWdvcnk6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1MzBENVx1MzBBOVx1MzBGQ1x1MzBBRFx1MzBFM1x1MzBCOVx1MzBDOFx1NTMzQVx1NTIwNicsXG4gICAgICAgIH0sXG4gICAgICAgIGxlYWRfc291cmNlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwQkRcdTMwRkNcdTMwQjknLFxuICAgICAgICB9LFxuICAgICAgICBsb3NzX3JlYXNvbjoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1OTMxXHU2Q0U4XHU3NDA2XHU3NTMxJyxcbiAgICAgICAgfSxcbiAgICAgICAgb3duZXI6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NjI0MFx1NjcwOVx1ODAwNScsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YWdlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjgnLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTU1NDZcdThBQzdcdTdBMkVcdTUyMjUnLFxuICAgICAgICB9LFxuICAgICAgICB3aW5fcmVhc29uOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTUzRDdcdTZDRThcdTc0MDZcdTc1MzEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGF2Z19hbW91bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NUU3M1x1NTc0N1x1NTU0Nlx1OEFDN1x1OTFEMVx1OTg0RCcsXG4gICAgICAgIH0sXG4gICAgICAgIGF2Z19wcm9iYWJpbGl0eToge1xuICAgICAgICAgIGxhYmVsOiAnXHU1RTczXHU1NzQ3XHU3OEJBXHU1RUE2JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVjaWRlZF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU2QzdBXHU3NzQwXHUzMDU3XHUzMDVGXHU1NTQ2XHU4QUM3JyxcbiAgICAgICAgfSxcbiAgICAgICAgbG9zdF9hbW91bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTkzMVx1NkNFOFx1OTFEMVx1OTg0RCcsXG4gICAgICAgIH0sXG4gICAgICAgIGxvc3RfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTkzMVx1NkNFOFx1NEVGNlx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICAgIG9wcF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgdG90YWxfYW1vdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTU0MDhcdThBMDhcdTkxRDFcdTk4NEQnLFxuICAgICAgICB9LFxuICAgICAgICB3aW5fcmF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU1M0Q3XHU2Q0U4XHU3Mzg3JyxcbiAgICAgICAgfSxcbiAgICAgICAgd29uX2Ftb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1M0Q3XHU2Q0U4XHU5MUQxXHU5ODREJyxcbiAgICAgICAgfSxcbiAgICAgICAgd29uX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTUzRDdcdTZDRThcdTRFRjZcdTY1NzAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHByb2R1Y3RfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdcdTg4RkRcdTU0QzFcdTYzMDdcdTZBMTknLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTg4RkRcdTU0QzFcdTMwQUJcdTMwQkZcdTMwRURcdTMwQjBcdTMwNkVcdTRFRjZcdTY1NzBcdTMwNjhcdTVCOUFcdTRGQTFcdTMwOTJcdTk2QzZcdThBMDhcdTMwNTlcdTMwOEJcdTMwQkJcdTMwREVcdTMwRjNcdTMwQzZcdTMwQTNcdTMwQzNcdTMwQUZcdTMwRUNcdTMwQTRcdTMwRTRcdTMwRkMnLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBjYXRlZ29yeToge1xuICAgICAgICAgIGxhYmVsOiAnXHUzMEFCXHUzMEM2XHUzMEI0XHUzMEVBJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBsaXN0X3ByaWNlX3N1bToge1xuICAgICAgICAgIGxhYmVsOiAnXHU1QjlBXHU0RkExXHU1NDA4XHU4QTA4JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJvZHVjdF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU4OEZEXHU1NEMxXHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB0YXNrX21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEJGXHUzMEI5XHUzMEFGXHU2MzA3XHU2QTE5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHUzMEJGXHUzMEI5XHUzMEFGXHUzMDZFXHU0RjVDXHU2OTZEXHU5MUNGXHUzMDY4XHU1QjhDXHU0RTg2XHU3MkI2XHU2Q0MxXHUzMDkyXHU5NkM2XHU4QTA4XHUzMDU5XHUzMDhCXHUzMEJCXHUzMERFXHUzMEYzXHUzMEM2XHUzMEEzXHUzMEMzXHUzMEFGXHUzMEVDXHUzMEE0XHUzMEU0XHUzMEZDJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgZHVlX2RhdGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NjcxRlx1OTY1MCcsXG4gICAgICAgIH0sXG4gICAgICAgIGlzX2NvbXBsZXRlZDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1QjhDXHU0RTg2XHU2RTA4XHUzMDdGJyxcbiAgICAgICAgfSxcbiAgICAgICAgaXNfb3ZlcmR1ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU2NzFGXHU5NjUwXHU4RDg1XHU5MDRFJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJpb3JpdHk6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTEyQVx1NTE0OFx1NUVBNicsXG4gICAgICAgIH0sXG4gICAgICAgIHByaW9yaXR5X3Jhbms6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1N0RDQVx1NjAyNVx1NUVBNicsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1czoge1xuICAgICAgICAgIGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5JyxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU3QTJFXHU1MjI1JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBhdmdfcHJvZ3Jlc3M6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NUU3M1x1NTc0N1x1OTAzMlx1NjM1NycsXG4gICAgICAgIH0sXG4gICAgICAgIHRhc2tfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1MzBCRlx1MzBCOVx1MzBBRlx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHBhZ2VzOiB7XG4gICAgYWNjb3VudF9kZXRhaWxfcGFnZToge1xuICAgICAgbGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdThBNzNcdTdEMzAnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTMwQjlcdTMwRURcdTMwQzNcdTMwQzhcdTY5Q0JcdTYyMTBcdTMwNkVcdTUzRDZcdTVGMTVcdTUxNDhcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzlcdTMwREFcdTMwRkNcdTMwQjggXHUyMDE0IFx1MzBBQlx1MzBCOVx1MzBCRlx1MzBFMFx1MzBEOFx1MzBDM1x1MzBDMFx1MzBGQ1x1MzA2OFx1NUUzOFx1OEEyRFx1MzA2RVx1MzBDN1x1MzBBM1x1MzBCOVx1MzBBQlx1MzBDM1x1MzBCN1x1MzBFN1x1MzBGM1x1MzBENVx1MzBBM1x1MzBGQ1x1MzBDOVx1MzAwMicsXG4gICAgICB0aXRsZTogJ3tuYW1lfScsXG4gICAgICBzdWJ0aXRsZTogJ3tpbmR1c3RyeX0gXHUwMEI3IHt0eXBlfScsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIGFjY291bnRfY2hhdHRlcjogeyBsYWJlbDogJ1x1MzBDN1x1MzBBM1x1MzBCOVx1MzBBQlx1MzBDM1x1MzBCN1x1MzBFN1x1MzBGMycgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhY2NvdW50X3dvcmtiZW5jaDoge1xuICAgICAgbGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdTMwRUZcdTMwRkNcdTMwQUZcdTMwRDlcdTMwRjNcdTMwQzEnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTU1QjZcdTY5NkRcdTMwQzFcdTMwRkNcdTMwRTBcdTU0MTFcdTMwNTFcdTMwNkJcdTUzQjNcdTkwNzhcdTMwNTdcdTMwNUZcdTUzRDZcdTVGMTVcdTUxNDhcdTMwRUFcdTMwQjlcdTMwQzhcdTMwMDJcdTMwQUZcdTMwQTRcdTMwQzNcdTMwQUZcdTMwRDVcdTMwQTNcdTMwRUJcdTMwQkZcdTMwRkNcdTMwNkVcdTMwN0ZcdTMwNjdcdTMwMDFcdTMwRDNcdTMwRTVcdTMwRkNcdTdCQTFcdTc0MDZcdTMwNkZcdTg4NENcdTMwNDRcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDInLFxuICAgIH0sXG4gICAgYXBwX2xhdW5jaGVyX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEEyXHUzMEQ3XHUzMEVBXHUzMEU5XHUzMEYzXHUzMEMxXHUzMEUzXHUzMEZDJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZFXHUzMEEyXHUzMEQ3XHUzMEVBXHUzMEIxXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzXHUzMDZCXHUzMEEyXHUzMEFGXHUzMEJCXHUzMEI5XHUzMDU5XHUzMDhCXHUzMDVGXHUzMDgxXHUzMDZFXHU3RDcxXHU1NDA4XHUzMENGXHUzMEQ2JyxcbiAgICAgIHN1YnRpdGxlOiAnXHU5NThCXHU1OUNCXHUzMDU5XHUzMDhCXHUzMEEyXHUzMEQ3XHUzMEVBXHUzMDkyXHU5MDc4XHU2MjlFXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0JyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgYXBwX3NlYXJjaDogeyBsYWJlbDogJ1x1MzBBMlx1MzBEN1x1MzBFQVx1MzA5Mlx1NjkxQ1x1N0QyMicgfSxcbiAgICAgICAgYXBwX2dyaWQ6IHsgbGFiZWw6ICdcdTMwQTJcdTMwRDdcdTMwRUFcdTMwQjBcdTMwRUFcdTMwQzNcdTMwQzknIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY2FzZV9kZXRhaWxfcGFnZToge1xuICAgICAgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdThBNzNcdTdEMzAnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjlcdTYyQzVcdTVGNTNcdTgwMDVcdTU0MTFcdTMwNTFcdTMwNkVcdTMwQjFcdTMwRkNcdTMwQjlcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzlcdTMwREFcdTMwRkNcdTMwQjhcdUZGMUFcdTMwQ0ZcdTMwQTRcdTMwRTlcdTMwQTRcdTMwQzhcdTMwMDFTTEEgXHUzMEQxXHUzMEI5XHUzMDAxXHU4QTczXHU3RDMwXHUzMDAxXHU2RDNCXHU1MkQ1XHUzMEJGXHUzMEE0XHUzMEUwXHUzMEU5XHUzMEE0XHUzMEYzXHUzMDAyJyxcbiAgICAgIHRpdGxlOiAne2Nhc2VfbnVtYmVyfSBcdTAwQjcge3N1YmplY3R9JyxcbiAgICAgIHN1YnRpdGxlOiAne2NybV9hY2NvdW50fScsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIGNhc2VfaGlnaGxpZ2h0czogeyBsYWJlbDogJ1x1OTFDRFx1ODk4MVx1NjBDNVx1NTgzMScgfSxcbiAgICAgICAgY2FzZV9zdGF0dXNfcGF0aDogeyBsYWJlbDogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOVx1MzA2RVx1OTAzMlx1NjM1NycgfSxcbiAgICAgICAgY2FzZV9kZXRhaWxzOiB7IGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHU4QTczXHU3RDMwXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxlYWRfZGV0YWlsX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU4QTczXHU3RDMwJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHUzMENGXHUzMEE0XHUzMEU5XHUzMEE0XHUzMEM4XHUzMEZCXHU4QTczXHU3RDMwXHUzMEZCXHU5NUEyXHU5MDIzXHU2MEM1XHU1ODMxXHUzMDkyXHU1MDk5XHUzMDQ4XHUzMDVGXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDZFXHU3RENGXHU1NDA4XHU4QTczXHU3RDMwXHUzMERBXHUzMEZDXHUzMEI4XHUzMDAyJyxcbiAgICAgIHRpdGxlOiAne2ZpcnN0X25hbWV9IHtsYXN0X25hbWV9JyxcbiAgICAgIHN1YnRpdGxlOiAne2NvbXBhbnl9JyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgbGVhZF9kdXBsaWNhdGVfYWxlcnRfY29uZmlybWVkOiB7IGxhYmVsOiAnXHU5MUNEXHU4OTA3XHU3OEJBXHU1QjlBXHUzMDZFXHU4QjY2XHU1NDRBJyB9LFxuICAgICAgICBsZWFkX2R1cGxpY2F0ZV9hbGVydF9zdXNwZWN0ZWQ6IHsgbGFiZWw6ICdcdTkxQ0RcdTg5MDdcdTMwNkVcdTc1OTFcdTMwNDRcdTMwNkVcdThCNjZcdTU0NEEnIH0sXG4gICAgICAgIGxlYWRfaGlnaGxpZ2h0czogeyBsYWJlbDogJ1x1OTFDRFx1ODk4MVx1NjBDNVx1NTgzMScgfSxcbiAgICAgICAgbGVhZF9wYXRoOiB7IGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHUzMDZFXHU5MDMyXHU2MzU3JyB9LFxuICAgICAgICBtYWluX3RhYnM6IHsgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTYwQzVcdTU4MzFcdTMwQkZcdTMwRDYnIH0sXG4gICAgICAgIGxlYWRfZGV0YWlsczogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1OEE3M1x1N0QzMFx1NjBDNVx1NTgzMScgfSxcbiAgICAgICAgcmVsYXRlZF9hY2NvcmRpb246IHsgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzknIH0sXG4gICAgICAgIHJlbGF0ZWRfdGFza3M6IHsgdGl0bGU6ICdcdTY3MkFcdTVCOENcdTRFODZcdTMwNkVcdTMwQkZcdTMwQjlcdTMwQUYnLCBsYWJlbDogJ1x1MzBCRlx1MzBCOVx1MzBBRicgfSxcbiAgICAgICAgbGVhZF9hY3Rpdml0eTogeyBsYWJlbDogJ1x1NkQzQlx1NTJENVx1MzBCRlx1MzBBNFx1MzBFMFx1MzBFOVx1MzBBNFx1MzBGMycgfSxcbiAgICAgICAgbGVhZF9oaXN0b3J5OiB7IGxhYmVsOiAnXHU5ODA1XHU3NkVFXHU1QzY1XHU2Qjc0JyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG9wcG9ydHVuaXR5X2RldGFpbF9wYWdlOiB7XG4gICAgICBsYWJlbDogJ1x1NTU0Nlx1OEFDN1x1OEE3M1x1N0QzMCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCOFx1MzBEMVx1MzBCOVx1MzBGQlx1MzBDRlx1MzBBNFx1MzBFOVx1MzBBNFx1MzBDOFx1MzBGQlx1OEE3M1x1N0QzMFx1MzBGQlx1OTVBMlx1OTAyM1x1MzBFQVx1MzBCOVx1MzBDOFx1MzA5Mlx1NTA5OVx1MzA0OFx1MzA1Rlx1NTU0Nlx1OEFDN1x1MzA2RVx1N0RDRlx1NTQwOFx1OEE3M1x1N0QzMFx1MzBEQVx1MzBGQ1x1MzBCOFx1MzAwMicsXG4gICAgICB0aXRsZTogJ3tuYW1lfScsXG4gICAgICBzdWJ0aXRsZTogJ3tjcm1fYWNjb3VudH0nLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBvcHBfaGlnaGxpZ2h0czogeyBsYWJlbDogJ1x1OTFDRFx1ODk4MVx1NjBDNVx1NTgzMScgfSxcbiAgICAgICAgb3BwX3N0YWdlX3BhdGg6IHsgbGFiZWw6ICdcdTU1NDZcdThBQzdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjhcdTMwNkVcdTkwMzJcdTYzNTcnIH0sXG4gICAgICAgIG9wcF9kZXRhaWxzOiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHU4QTczXHU3RDMwXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHNhbGVzX2hvbWVfcGFnZToge1xuICAgICAgbGFiZWw6ICdcdTU1QjZcdTY5NkRcdTMwREJcdTMwRkNcdTMwRTAnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTRFM0JcdTg5ODFcdTYzMDdcdTZBMTlcdTMwNjhcdTMwQUZcdTMwQTRcdTMwQzNcdTMwQUZcdTMwQTJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTMwOTJcdTMwN0VcdTMwNjhcdTMwODFcdTMwNUZcdTU1QjZcdTY5NkRcdTMwQzFcdTMwRkNcdTMwRTBcdTMwNkVcdTMwREJcdTMwRkNcdTMwRTBcdTMwREFcdTMwRkNcdTMwQjgnLFxuICAgICAgdGl0bGU6ICdcdTU1QjZcdTY5NkRcdTMwQzBcdTMwQzNcdTMwQjdcdTMwRTVcdTMwRENcdTMwRkNcdTMwQzknLFxuICAgICAgc3VidGl0bGU6ICdcdTMwNEFcdTMwNEJcdTMwNDhcdTMwOEFcdTMwNkFcdTMwNTVcdTMwNDQnLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBrcGlfcmV2ZW51ZV93b246IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTNEN1x1NkNFOFx1NThGMlx1NEUwQScsXG4gICAgICAgIH0sXG4gICAgICAgIGtwaV9kZWFsc193b246IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTNEN1x1NkNFOFx1NEVGNlx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICAgIGtwaV9waXBlbGluZV92YWx1ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHU5MUQxXHU5ODREJyxcbiAgICAgICAgfSxcbiAgICAgICAga3BpX29wZW5fbGVhZHM6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1MzBFQVx1MzBGQ1x1MzBDOScsXG4gICAgICAgIH0sXG4gICAgICAgIGhvbWVfdXBjb21pbmdfZXZlbnRzOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdUQ4M0RcdURDQzUgXHU5NThCXHU1MEFDXHU0RTg4XHU1QjlBIFx1MDBCNyBcdTc2RjRcdThGRDFcdTk4MDYnLFxuICAgICAgICB9LFxuICAgICAgICBxdWlja19jcmVhdGU6IHsgdGl0bGU6ICdcdTMwQUZcdTMwQTRcdTMwQzNcdTMwQUZcdTRGNUNcdTYyMTAnLCBsYWJlbDogJ1x1MzBBRlx1MzBBNFx1MzBDM1x1MzBBRlx1NEY1Q1x1NjIxMCcgfSxcbiAgICAgICAga2V5X21ldHJpY3M6IHsgdGl0bGU6ICdcdTRFM0JcdTg5ODFcdTY5NkRcdTdFM0VcdThBNTVcdTRGQTFcdTYzMDdcdTZBMTknLCBsYWJlbDogJ1x1NEUzQlx1ODk4MVx1NjMwN1x1NkExOScgfSxcbiAgICAgICAgaG9tZV90YWJzOiB7IGxhYmVsOiAnXHUzMERCXHUzMEZDXHUzMEUwXHUzMEJGXHUzMEQ2JyB9LFxuICAgICAgICBob21lX215X2xlYWRzOiB7IGxhYmVsOiAnXHU3OUMxXHUzMDZFXHUzMEVBXHUzMEZDXHUzMEM5JyB9LFxuICAgICAgICBob21lX215X2RlYWxzOiB7IGxhYmVsOiAnXHU3OUMxXHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHU1NTQ2XHU4QUM3JyB9LFxuICAgICAgICBob21lX215X3Rhc2tzOiB7IGxhYmVsOiAnXHU3OUMxXHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHUzMEJGXHUzMEI5XHUzMEFGJyB9LFxuICAgICAgICBhaV9icmllZmluZzoge1xuICAgICAgICAgIHRpdGxlOiAnQUkgXHUzMEEyXHUzMEI3XHUzMEI5XHUzMEJGXHUzMEYzXHUzMEM4XHUzMDZCXHU4Q0VBXHU1NTRGJyxcbiAgICAgICAgICBsYWJlbDogJ1x1NEVDQVx1NjVFNVx1MzA2RSBBSSBcdTMwQTJcdTMwQjdcdTMwQjlcdTMwQkZcdTMwRjNcdTMwQzgnLFxuICAgICAgICB9LFxuICAgICAgICB1cGNvbWluZ19ldmVudHM6IHsgdGl0bGU6ICdcdTRFQ0FcdTVGOENcdTMwNkVcdTRFODhcdTVCOUEnLCBsYWJlbDogJ1x1NEVDQVx1NUY4Q1x1MzA2RVx1NEU4OFx1NUI5QScgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB1dGlsaXR5X2Jhcl9wYWdlOiB7XG4gICAgICBsYWJlbDogJ1x1MzBFNlx1MzBGQ1x1MzBDNlx1MzBBM1x1MzBFQVx1MzBDNlx1MzBBM1x1MzBEMFx1MzBGQycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1MzBENVx1MzBFRFx1MzBGQ1x1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMFx1MzBDNFx1MzBGQ1x1MzBFQlx1MzA3OFx1MzA2RVx1MzBBRlx1MzBBNFx1MzBDM1x1MzBBRlx1MzBBMlx1MzBBRlx1MzBCQlx1MzBCOVx1MzBEMFx1MzBGQycsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIG5vdGlmaWNhdGlvbnNfcGFuZWw6IHsgbGFiZWw6ICdcdTkwMUFcdTc3RTUnIH0sXG4gICAgICAgIHF1aWNrX25vdGVzOiB7IHRpdGxlOiAnXHUzMEFGXHUzMEE0XHUzMEMzXHUzMEFGXHUzMEUxXHUzMEUyJywgbGFiZWw6ICdcdTMwQUZcdTMwQTRcdTMwQzNcdTMwQUZcdTMwRTFcdTMwRTInIH0sXG4gICAgICAgIHF1aWNrX3NlYXJjaDogeyBsYWJlbDogJ1x1MzBBRlx1MzBBNFx1MzBDM1x1MzBBRlx1NjkxQ1x1N0QyMicgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgLy8gU2NyZWVuLWZsb3cgY29weSAoIzEyMTAsICMxOTc1KS4gS2V5ZWQgYGZsb3dzLjxmbG93Pi5sYWJlbGAsXG4gIC8vIGBzY3JlZW5zLjxub2RlPi50aXRsZWAgYW5kIGBzY3JlZW5zLjxub2RlPi5maWVsZHMuPGZpZWxkPi57bGFiZWwscGxhY2Vob2xkZXJ9YFxuICAvLyBcdTIwMTQgdGhlIGtleXMgYG9zIGxpbnRgJ3MgYGkxOG4vbWlzc2luZy1mbG93YCBuYW1lcywgcmVhZCBieSB0aGUgY29uc29sZSdzXG4gIC8vIGZsb3cgcnVubmVyIHNpbmNlIEBvYmplY3RzdGFjayAxNy43LjAgKHRoZSBzcGVjJ3MgYGZsb3dzYCBsaXZlbmVzcyByb3cgaXNcbiAgLy8gYGxpdmVgIHRoZXJlKS4gQSBzY3JlZW4gd2l0aCBubyBhdXRob3JlZCBgdGl0bGVgIHNob3dzIGl0cyBmbG93J3MgbGFiZWwgaW5cbiAgLy8gZXZlcnkgbG9jYWxlLCBzbyBlYWNoIGBzY3JlZW5fMS50aXRsZWAgcmVwZWF0cyB0aGUgZmxvdyBsYWJlbC4gU2luY2VcbiAgLy8gMTguMC4wLW5leHQuMCB0aHJlZSBtb3JlIHN1cmZhY2VzIGFyZSBrZXlzIHRoZSBlbmdpbmUgcmVhZHMgaW4gdGhlIHJ1bidzXG4gIC8vIGxvY2FsZSwgYW5kIGBpMThuL21pc3NpbmctZmxvd2AgbmFtZXMgZWFjaCBtaXNzaW5nIG9uZTogYSBzZWxlY3QgZmllbGQnc1xuICAvLyBgb3B0aW9ucy48dmFsdWU+YCAod29yZGVkIGFzIHRoZSBvYmplY3QgZmllbGQncyBvd24gb3B0aW9uIGluIHRoaXMgcGFjayksXG4gIC8vIGFuIGF1dGhvcmVkIHNjcmVlbiBgZGVzY3JpcHRpb25gLCBhbmQgYSByZWZ1c2luZyBgZW5kYCBub2RlJ3NcbiAgLy8gYHJlZnVzYWxzLjxub2RlPi5tZXNzYWdlYC4gQSB0cmFuc2xhdGVkIGRlc2NyaXB0aW9uIG9yIG1lc3NhZ2UgaXMgYSB0ZXh0XG4gIC8vIHNsb3QgbGlrZSB0aGUgb25lIGl0IHRyYW5zbGF0ZXMsIHNvIGEgaG9sZSBpbiBpdCBpcyBge3sgfX1gLlxuICAvLyBUaGUgZGlzY291bnQgY2VpbGluZyBpcyBpbnRlcnBvbGF0ZWQgZnJvbSBgUVVPVEVfRElTQ09VTlRfQ0VJTElOR2AsIG5ldmVyXG4gIC8vIHJldHlwZWQ6IHRoZSBudW1iZXIgbGl2ZXMgaW4gYF90aHJlc2hvbGRzLnRzYCBhbG9uZSAoIzE3MTEpLlxuICBmbG93czoge1xuICAgIGNhbXBhaWduX2Vucm9sbG1lbnQ6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHUzMDZCXHUzMEUxXHUzMEYzXHUzMEQwXHUzMEZDXHUzMDkyXHU3NjdCXHU5MzMyJyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzA2Qlx1MzBFMVx1MzBGM1x1MzBEMFx1MzBGQ1x1MzA5Mlx1NzY3Qlx1OTMzMicsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBtZW1iZXJTb3VyY2U6IHsgbGFiZWw6ICdcdTc2N0JcdTkzMzJcdTMwNTlcdTMwOEJcdTMwRTFcdTMwRjNcdTMwRDBcdTMwRkNcdTMwNkVcdTdBMkVcdTk4NUUnLCBvcHRpb25zOiB7IGxlYWRzOiAnXHUzMEVBXHUzMEZDXHUzMEM5JywgY29udGFjdHM6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDUnIH0gfSxcbiAgICAgICAgICAgIGxlYWRTdGF0dXM6IHsgbGFiZWw6ICdcdTc2N0JcdTkzMzJcdTMwNTlcdTMwOEJcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkVcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLCBvcHRpb25zOiB7IG5ldzogJ1x1NjVCMFx1ODk4RicsIGNvbnRhY3RlZDogJ1x1MzBCM1x1MzBGM1x1MzBCRlx1MzBBRlx1MzBDOFx1NkUwOFx1MzA3RicsIHF1YWxpZmllZDogJ1x1OTA2OVx1NjgzQycgfSB9LFxuICAgICAgICAgICAgY29udGFjdERlcGFydG1lbnQ6IHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdcdTc2N0JcdTkzMzJcdTMwNTlcdTMwOEJcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTMwNkVcdTkwRThcdTk1ODAnLFxuICAgICAgICAgICAgICBvcHRpb25zOiB7IGV4ZWN1dGl2ZTogJ1x1N0Q0Q1x1NTVCNlx1NUM2NCcsIHNhbGVzOiAnXHU1NUI2XHU2OTZEXHU5MEU4JywgbWFya2V0aW5nOiAnXHUzMERFXHUzMEZDXHUzMEIxXHUzMEM2XHUzMEEzXHUzMEYzXHUzMEIwXHU5MEU4JywgZW5naW5lZXJpbmc6ICdcdTMwQThcdTMwRjNcdTMwQjhcdTMwQ0JcdTMwQTJcdTMwRUFcdTMwRjNcdTMwQjBcdTkwRTgnLCBzdXBwb3J0OiAnXHUzMEI1XHUzMEREXHUzMEZDXHUzMEM4XHU5MEU4JywgZmluYW5jZTogJ1x1N0Q0Q1x1NzQwNlx1OTBFOCcsIGhyOiAnXHU0RUJBXHU0RThCXHU5MEU4Jywgb3BlcmF0aW9uczogJ1x1MzBBQVx1MzBEQVx1MzBFQ1x1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGM1x1OTBFOCcgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBlc2NhbGF0ZV9jYXNlOiB7XG4gICAgICBsYWJlbDogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA5Mlx1MzBBOFx1MzBCOVx1MzBBQlx1MzBFQ1x1MzBGQ1x1MzBDOCcsXG4gICAgICBzY3JlZW5zOiB7IHNjcmVlbl8xOiB7IHRpdGxlOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDkyXHUzMEE4XHUzMEI5XHUzMEFCXHUzMEVDXHUzMEZDXHUzMEM4JywgZmllbGRzOiB7IHJlYXNvbjogeyBsYWJlbDogJ1x1MzBBOFx1MzBCOVx1MzBBQlx1MzBFQ1x1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGM1x1NzQwNlx1NzUzMScgfSB9IH0gfSxcbiAgICB9LFxuICAgIGNsb3NlX2Nhc2U6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDkyXHUzMEFGXHUzMEVEXHUzMEZDXHUzMEJBJyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA5Mlx1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQScsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICByZXNvbHV0aW9uOiB7IGxhYmVsOiAnXHU4OUUzXHU2QzdBXHU1MTg1XHU1QkI5JyB9LFxuICAgICAgICAgICAgcmVzb2x2ZWRfYnlfYXJ0aWNsZTogeyBsYWJlbDogJ1x1ODlFM1x1NkM3QVx1MzA2Qlx1NEY3Rlx1MzA2M1x1MzA1Rlx1MzBDQVx1MzBFQ1x1MzBDM1x1MzBCOFx1OEExOFx1NEU4Qlx1RkYwOFx1NEVGQlx1NjEwRlx1RkYwOScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNsYWltX2Nhc2U6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDkyXHU1RjE1XHUzMDREXHU1M0Q3XHUzMDUxXHUzMDhCJyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA5Mlx1NUYxNVx1MzA0RFx1NTNEN1x1MzA1MVx1MzA4QicsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBjbGFpbVN0YXR1czoge1xuICAgICAgICAgICAgICBsYWJlbDogJ1x1NUJGRVx1NUZEQ1x1NzJCNlx1NkNDMScsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHsgaW5fcHJvZ3Jlc3M6ICdcdTVCRkVcdTVGRENcdTRFMkQnLCB3YWl0aW5nX2N1c3RvbWVyOiAnXHU5ODY3XHU1QkEyXHUzMDZFXHU1NkRFXHU3QjU0XHU1Rjg1XHUzMDYxJywgd2FpdGluZ19zdXBwb3J0OiAnXHUzMEI1XHUzMEREXHUzMEZDXHUzMEM4XHUzMDZFXHU1NkRFXHU3QjU0XHU1Rjg1XHUzMDYxJyB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxlYWRfY29udmVyc2lvbjoge1xuICAgICAgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTU5MDlcdTYzREJcdTMwRDdcdTMwRURcdTMwQkJcdTMwQjknLFxuICAgICAgc2NyZWVuczoge1xuICAgICAgICBzY3JlZW5fMToge1xuICAgICAgICAgIHRpdGxlOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU1OTA5XHU2M0RCXHUzMEQ3XHUzMEVEXHUzMEJCXHUzMEI5JyxcbiAgICAgICAgICAvLyBUaGUgZHVwbGljYXRlIHdhcm5pbmcncyB0ZXh0IGlzIGEgdmFyaWFibGUgdGhlIGZsb3cgYXNzaWduczsgdGhpc1xuICAgICAgICAgIC8vIGtleSBjYW4gb25seSBjYXJyeSB0aGUgaG9sZSB0aGF0IHNob3dzIGl0LlxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAne3tkdXBsaWNhdGVXYXJuaW5nfX0nLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgY3JlYXRlT3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdcdTU1NDZcdThBQzdcdTMwOTJcdTRGNUNcdTYyMTBcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdUZGMUYnIH0sXG4gICAgICAgICAgICBvcHBvcnR1bml0eU5hbWU6IHsgbGFiZWw6ICdcdTU1NDZcdThBQzdcdTU0MEQnIH0sXG4gICAgICAgICAgICBvcHBvcnR1bml0eUFtb3VudDogeyBsYWJlbDogJ1x1NTU0Nlx1OEFDN1x1OTFEMVx1OTg0RCcgfSxcbiAgICAgICAgICAgIGNsb3NlRGF0ZTogeyBsYWJlbDogJ1x1NUI4Q1x1NEU4Nlx1NEU4OFx1NUI5QVx1NjVFNScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByZWZ1c2VfY29uZmlybWVkX2R1cGxpY2F0ZToge1xuICAgICAgICAgIHRpdGxlOiAnXHU1OTA5XHU2M0RCXHUzMDZGXHU2MkQyXHU1NDI2XHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU3XHUzMDVGJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdcdTMwNTNcdTMwNkVcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkVcdTkxQ0RcdTg5MDdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjlcdTMwNkZcdTMwMENcdTkxQ0RcdTg5MDdcdTc4QkFcdTVCOUFcdTMwMERcdTMwNjdcdTMwNTlcdTMwMDJcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkNcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNENcdTY1RTJcdTVCNThcdTMwNkVcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzlcdTMwNjhcdTcxNjdcdTU0MDhcdTMwNTdcdTMwMDFcdTkxQ0RcdTg5MDdcdTMwNjdcdTMwNDJcdTMwOEJcdTMwNjhcdThBMThcdTkzMzJcdTMwNTdcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDJcdTU5MDlcdTYzREJcdTMwNTlcdTMwOEJcdTMwNjhcdTMwMDFcdTU0MENcdTMwNThcdThDRkNcdTUxNjVcdTgwMDVcdTMwNkJcdTVCRkVcdTMwNTdcdTMwNjZcdTUzRDZcdTVGMTVcdTUxNDhcdTMwRkJcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTMwRkJcdTU1NDZcdThBQzdcdTMwNENcdTMwODJcdTMwNDYgMSBcdTRFRjZcdTMwNUFcdTMwNjRcdTRGNUNcdTYyMTBcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTlcdTMwMDJcdTZCOEJcdTMwNTlcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzlcdTMwNkZcdTMwNTNcdTMwNkVcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkVcdTMwMENcdTkxQ0RcdTg5MDdcdTdCQTFcdTc0MDZcdTMwMERcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTMwNkJcdTg4NjhcdTc5M0FcdTMwNTVcdTMwOENcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNTlcdTMwMDJcdTRFRTNcdTMwOEZcdTMwOEFcdTMwNkJcdTMwMDFcdTMwNTNcdTMwNkVcdTMwRUFcdTMwRkNcdTMwQzlcdTMwOTJcdTkxQ0RcdTg5MDdcdTMwNjhcdTMwNTdcdTMwNjZcdTRFMERcdTkwNjlcdTY4M0NcdTMwNkJcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDJcdTU5MDlcdTYzREJcdTMwOTJcdTUxOERcdTMwNzNcdTUzRUZcdTgwRkRcdTMwNkJcdTMwNjdcdTMwNERcdTMwOEJcdTMwNkVcdTMwNkZcdTMwMDFcdTMwNURcdTMwNkVcdTUyMjRcdTVCOUFcdTMwOTJcdTg5OEJcdTc2RjRcdTMwNTlcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkNcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNjBcdTMwNTFcdTMwNjdcdTMwNTlcdTMwMDInLFxuICAgICAgICB9LFxuICAgICAgICByZWZ1c2VfdW5hcHByb3ZlZDoge1xuICAgICAgICAgIHRpdGxlOiAnXHU1OTA5XHU2M0RCXHUzMDZGXHU2MkQyXHU1NDI2XHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU3XHUzMDVGJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdcdTMwNTNcdTMwNkVcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkZcdTMwN0VcdTMwNjBcdTU5MDlcdTYzREJcdTMwNkVcdTYyN0ZcdThBOERcdTMwOTJcdTVGOTdcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDJcdTUzRDZcdTVGMTVcdTUxNDhcdTMwRkJcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTMwRkJcdTU1NDZcdThBQzdcdTMwNkJcdTU5MDlcdTYzREJcdTMwNTlcdTMwOEJcdTMwNkJcdTMwNkZcdTMwMDFcdTUxNDhcdTMwNkJcdTYyN0ZcdThBOERcdTgwMDVcdTMwNkVcdTYyN0ZcdThBOERcdTMwNENcdTVGQzVcdTg5ODFcdTMwNjdcdTMwNTlcdTMwMDJcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkVcdTMwMENcdTMwQjNcdTMwRjNcdTMwRDBcdTMwRkNcdTMwQjhcdTMwRTdcdTMwRjNcdTYyN0ZcdThBOERcdTMwMERcdTk4MDVcdTc2RUVcdTMwNjdcdTMwMDFcdTUyMjRcdTY1QURcdTMwNENcdTMwN0VcdTMwNjBcdTYyN0ZcdThBOERcdTVGODVcdTMwNjFcdTMwNEJcdTMwMDFcdTUzNzRcdTRFMEJcdTMwNTVcdTMwOENcdTMwNUZcdTMwNEJcdTMwOTJcdTc4QkFcdThBOERcdTMwNjdcdTMwNERcdTMwN0VcdTMwNTlcdTMwMDJcdTMwNURcdTMwOENcdTMwN0VcdTMwNjdcdTMwNkVcdTk1OTNcdTMwODJcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNzhcdTMwNkVcdTVCRkVcdTVGRENcdTMwNkZcdTdEOUFcdTMwNTFcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDJcdTUxQ0RcdTdENTBcdTMwNTVcdTMwOENcdTMwOEJcdTMwODJcdTMwNkVcdTMwNkZcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDInLFxuICAgICAgICB9LFxuICAgICAgICByZWZ1c2Vfbm9fbWF0Y2hfa2V5OiB7XG4gICAgICAgICAgdGl0bGU6ICdcdTU5MDlcdTYzREJcdTMwNkZcdTYyRDJcdTU0MjZcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUYnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ1x1MzA1M1x1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2RVx1NEYxQVx1NzkzRVx1NTQwRFx1MzA2Qlx1MzA2Rlx1NzE2N1x1NTQwOFx1MzBBRFx1MzBGQ1x1MzA0Q1x1MzA2QVx1MzA0NFx1MzA1Rlx1MzA4MVx1MzAwMVx1NTkwOVx1NjNEQlx1MzA2N1x1MzA2Rlx1MzA2OVx1MzA2RVx1NTNENlx1NUYxNVx1NTE0OFx1MzA2Qlx1NUM1RVx1MzA1OVx1MzA4Qlx1MzA0Qlx1MzA5Mlx1NTIyNFx1NjVBRFx1MzA2N1x1MzA0RFx1MzA1QVx1MzAwMVx1NjNBOFx1NkUyQ1x1MzA4Mlx1MzA1N1x1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMlx1NjNBOFx1NkUyQ1x1MzA1OVx1MzA4Qlx1MzA2OFx1MzAwMVx1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNVx1MzA2OFx1NTU0Nlx1OEFDN1x1MzA0Q1x1NTIyNVx1MzA2RVx1OTg2N1x1NUJBMlx1MzA2RVx1NEUwQlx1MzA2Qlx1NzY3Qlx1OTMzMlx1MzA1NVx1MzA4Q1x1MzA4Qlx1MzA0QVx1MzA1RFx1MzA4Q1x1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVx1MzAwMlx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2RVx1MzAwQ1x1NEYxQVx1NzkzRVx1NTQwRFx1MzAwRFx1MzA5Mlx1NEZERFx1NUI1OFx1MzA1OVx1MzA4Qlx1MzA2OFx1MzBBRFx1MzBGQ1x1MzA0Q1x1NTE4RFx1NEY1Q1x1NjIxMFx1MzA1NVx1MzA4Q1x1MzA4Qlx1MzA2RVx1MzA2N1x1MzAwMVx1MzA4Mlx1MzA0Nlx1NEUwMFx1NUVBNlx1NEZERFx1NUI1OFx1MzA1N1x1MzA2Nlx1MzA0Qlx1MzA4OVx1NTkwOVx1NjNEQlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlx1NEY1NVx1MzA4Mlx1NEY1Q1x1NjIxMFx1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgc2NoZWR1bGVfZm9sbG93dXA6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEQ1XHUzMEE5XHUzMEVEXHUzMEZDXHUzMEEyXHUzMEMzXHUzMEQ3XHUzMDkyXHU4QTJEXHU1QjlBJyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1MzBENVx1MzBBOVx1MzBFRFx1MzBGQ1x1MzBBMlx1MzBDM1x1MzBEN1x1MzA5Mlx1OEEyRFx1NUI5QScsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU2QjIxXHUzMDZFXHUzMEI5XHUzMEM2XHUzMEMzXHUzMEQ3XHUzMDZGXHVGRjFGJyB9LFxuICAgICAgICAgICAgZHVlRGF0ZTogeyBsYWJlbDogJ1x1NjcxRlx1OTY1MCcgfSxcbiAgICAgICAgICAgIGFjdGl2aXR5VHlwZToge1xuICAgICAgICAgICAgICBsYWJlbDogJ1x1NkQzQlx1NTJENVx1N0EyRVx1NTIyNScsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHsgY2FsbDogJ1x1OTZGQlx1OEE3MScsIGVtYWlsOiAnXHUzMEUxXHUzMEZDXHUzMEVCJywgbWVldGluZzogJ1x1NEYxQVx1OEI3MCcsIGZvbGxvd191cDogJ1x1MzBENVx1MzBBOVx1MzBFRFx1MzBGQ1x1MzBBMlx1MzBDM1x1MzBENycsIGRlbW86ICdcdTMwQzdcdTMwRTInLCBvdGhlcjogJ1x1MzA1RFx1MzA2RVx1NEVENicgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmlvcml0eTogeyBsYWJlbDogJ1x1NTEyQVx1NTE0OFx1NUVBNicsIG9wdGlvbnM6IHsgbG93OiAnXHU0RjRFJywgbm9ybWFsOiAnXHU5MDFBXHU1RTM4JywgaGlnaDogJ1x1OUFEOCcsIHVyZ2VudDogJ1x1N0RDQVx1NjAyNScgfSB9LFxuICAgICAgICAgICAgbm90ZXM6IHsgbGFiZWw6ICdcdTMwRTFcdTMwRTInIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBxdW90ZV9nZW5lcmF0aW9uOiB7XG4gICAgICBsYWJlbDogJ1x1NTU0Nlx1OEFDN1x1MzA0Qlx1MzA4OVx1ODk4Qlx1N0E0RFx1MzA5Mlx1NEY1Q1x1NjIxMCcsXG4gICAgICByZWZ1c2FsczogeyByZWZ1c2VfaGVsZDogeyBtZXNzYWdlOiAnXHU1MTQ4XHUzMDZCXHU2ODQ4XHU0RUY2XHU1MzE2XHU2MjdGXHU4QThEXHUzMDRDXHU1RkM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyXHUzMDBDXHU2ODQ4XHU0RUY2XHU1MzE2XHU2MjdGXHU4QThEXHUzMDkyXHU3NTMzXHU4QUNCXHUzMDBEXHUzMDZCXHUzMEMxXHUzMEE3XHUzMEMzXHUzMEFGXHUzMDkyXHU1MTY1XHUzMDhDXHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyXHU0RjU1XHUzMDgyXHU0RjVDXHU2MjEwXHUzMDU1XHUzMDhDXHUzMDY2XHUzMDQ0XHUzMDdFXHUzMDVCXHUzMDkzXHUzMDAyJyB9IH0sXG4gICAgICBzY3JlZW5zOiB7XG4gICAgICAgIHNjcmVlbl8xOiB7XG4gICAgICAgICAgdGl0bGU6ICdcdTU1NDZcdThBQzdcdTMwNEJcdTMwODlcdTg5OEJcdTdBNERcdTMwOTJcdTRGNUNcdTYyMTAnLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgcXVvdGVOYW1lOiB7IGxhYmVsOiAnXHU4OThCXHU3QTREXHU1NDBEJyB9LFxuICAgICAgICAgICAgZXhwaXJhdGlvbkRheXM6IHsgbGFiZWw6ICdcdTY3MDlcdTUyQjlcdTY3MUZcdTk1OTNcdUZGMDhcdTY1RTVcdUZGMDknIH0sXG4gICAgICAgICAgICBkaXNjb3VudDogeyBsYWJlbDogYFx1NTI3Mlx1NUYxNVx1NzM4NyAlIChcdTIyNjQgJHtRVU9URV9ESVNDT1VOVF9DRUlMSU5HfSlgLCBwbGFjZWhvbGRlcjogYDAtJHtRVU9URV9ESVNDT1VOVF9DRUlMSU5HfWAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9fc2hhcmVkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUFwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvX3NoYXJlZC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBcdTY1RTVcdTY3MkNcdThBOUUgKGphLUpQKSBcdTIwMTQgdmFsdWVzIHNoYXJlZCBieSBtb3JlIHRoYW4gb25lIHBhcnQgb2YgdGhpcyBidW5kbGUuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAudHNgLlxuICpcbiAqIEV2ZXJ5IGNvbnN0YW50IGhlcmUgaXMgc3ByZWFkIGludG8gb2JqZWN0IHJvd3MgdGhhdCBsaXZlIGluIE1PUkUgVEhBTiBPTkVcbiAqIGZhbWlseSBmaWxlLCBzbyBpdCBjYW5ub3Qgc2l0IGluIGFueSBvbmUgb2YgdGhlbS4gQSB2YWx1ZSB1c2VkIGJ5IGV4YWN0bHlcbiAqIG9uZSBmYW1pbHkgbGl2ZXMgaW4gdGhhdCBmYW1pbHkncyBmaWxlIGluc3RlYWQgXHUyMDE0IHRoYXQgc3BsaXQgaXMgbWVjaGFuaWNhbCxcbiAqIG5vdCBhIGp1ZGdlbWVudCBjYWxsLlxuICovXG5cbi8qKlxuICogXHU2RDNCXHU1MkQ1XHUzMEEyXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHU3RkE0XHVGRjA4IzU5Mlx1RkYwOTogYGxvZ19jYWxsYCAvIGBsb2dfbWVldGluZ2AgLyBgc2NoZWR1bGVfbWVldGluZ2AgXHUzMDZGXG4gKiBcdTMwRUFcdTMwRkNcdTMwQzlcdTMwRkJcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTMwRkJcdTUzRDZcdTVGMTVcdTUxNDhcdTMwRkJcdTU1NDZcdThBQzdcdTMwRkJcdTMwQjFcdTMwRkNcdTMwQjlcdTMwNkVcdTU0MDRcdTMwQUFcdTMwRDZcdTMwQjhcdTMwQTdcdTMwQUZcdTMwQzhcdTMwNTRcdTMwNjhcdTMwNkJcdTc2N0JcdTkzMzJcdTMwNTVcdTMwOENcdTMwOEJcbiAqIFx1RkYwOGBvYmplY3ROYW1lYCBcdTMwOTJcdTYzMDFcdTMwNUZcdTMwNkFcdTMwNDRcdTMwQjlcdTMwQUZcdTMwRUFcdTMwRDdcdTMwQzhcdTMwQTJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTMwNkZcdTMwQzdcdTMwQTNcdTMwQjlcdTMwRDFcdTMwQzNcdTMwQzFcdTMwRTNcdTMwNENcdTUzQzJcdTcxNjdcdTMwNTdcdTMwNkFcdTMwNDRcbiAqIFx1MzBBRFx1MzBGQ1x1MzA2Qlx1NzY3Qlx1OTMzMlx1MzA1NVx1MzA4Q1x1MzA4Qlx1MzA1Rlx1MzA4MSBcdTIwMTQgIzUwOVx1RkYwOVx1MzAwMlx1NjU4N1x1OEEwMFx1MzA2RiA1IFx1MzBBQVx1MzBENlx1MzBCOFx1MzBBN1x1MzBBRlx1MzBDOFx1MzA2N1x1NTQwQ1x1NEUwMFx1MzA2QVx1MzA2RVx1MzA2N1x1MzAwMVx1MzA1M1x1MzA1M1x1MzA2N1xuICogXHU0RTAwXHU1RUE2XHUzMDYwXHUzMDUxXHU1QjlBXHU3RkE5XHUzMDU3XHUzMDY2XHU1NDA0IGBfYWN0aW9uc2AgXHUzMDZCXHU1QzU1XHU5NThCXHUzMDU5XHUzMDhCXHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBhY3Rpdml0eUFjdGlvbnMgPSB7XG4gIGxvZ19jYWxsOiB7XG4gICAgbGFiZWw6ICdcdTk2RkJcdThBNzFcdTMwOTJcdThBMThcdTkzMzInLFxuICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU5NkZCXHU4QTcxXHUzMDkyXHU4QTE4XHU5MzMyXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHVGRjAxJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN1YmplY3Q6IHsgbGFiZWw6ICdcdTk2RkJcdThBNzFcdTMwNkVcdTRFRjZcdTU0MEQnIH0sXG4gICAgICBkdXJhdGlvbjogeyBsYWJlbDogJ1x1NjI0MFx1ODk4MVx1NjY0Mlx1OTU5M1x1RkYwOFx1NTIwNlx1RkYwOScgfSxcbiAgICAgIGF0dGVuZGVlX2NvbnRhY3RzOiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDZFXHU1M0MyXHU1MkEwXHU4MDA1JyB9LFxuICAgICAgYXR0ZW5kZWVfdXNlcnM6IHsgbGFiZWw6ICdcdTc5M0VcdTUxODVcdTUzQzJcdTUyQTBcdTgwMDUnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ1x1OTAxQVx1OEE3MVx1MzBFMVx1MzBFMicgfSxcbiAgICB9LFxuICB9LFxuICBsb2dfbWVldGluZzoge1xuICAgIGxhYmVsOiAnXHU0RjFBXHU4QjcwXHUzMDkyXHU4QTE4XHU5MzMyJyxcbiAgICBzdWNjZXNzTWVzc2FnZTogJ1x1NEYxQVx1OEI3MFx1MzA5Mlx1OEExOFx1OTMzMlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1RkYwMScsXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU0RjFBXHU4QjcwXHUzMDZFXHU0RUY2XHU1NDBEJyB9LFxuICAgICAgZHVyYXRpb246IHsgbGFiZWw6ICdcdTYyNDBcdTg5ODFcdTY2NDJcdTk1OTNcdUZGMDhcdTUyMDZcdUZGMDknIH0sXG4gICAgICBhdHRlbmRlZV9jb250YWN0czogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNVx1MzA2RVx1NTNDMlx1NTJBMFx1ODAwNScgfSxcbiAgICAgIGF0dGVuZGVlX3VzZXJzOiB7IGxhYmVsOiAnXHU3OTNFXHU1MTg1XHU1M0MyXHU1MkEwXHU4MDA1JyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdcdThCNzBcdTRFOEJcdTMwRTFcdTMwRTInIH0sXG4gICAgfSxcbiAgfSxcbiAgc2NoZWR1bGVfbWVldGluZzoge1xuICAgIGxhYmVsOiAnXHU0RjFBXHU4QjcwXHUzMDkyXHU4QTJEXHU1QjlBJyxcbiAgICBzdWNjZXNzTWVzc2FnZTogJ1x1NEYxQVx1OEI3MFx1MzA5Mlx1OEEyRFx1NUI5QVx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1RkYwMScsXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU0RjFBXHU4QjcwXHUzMDZFXHU0RUY2XHU1NDBEJyB9LFxuICAgICAgc3RhcnRfZGF0ZTogeyBsYWJlbDogJ1x1OTU4Qlx1NTlDQlx1NjVFNSAoVVRDKScgfSxcbiAgICAgIHN0YXJ0X3RpbWU6IHsgbGFiZWw6ICdcdTk1OEJcdTU5Q0JcdTY2NDJcdTUyM0IgKFVUQyknIH0sXG4gICAgICBsb2NhdGlvbjogeyBsYWJlbDogJ1x1NTgzNFx1NjI0MCcgfSxcbiAgICAgIGR1cmF0aW9uOiB7IGxhYmVsOiAnXHU2MjQwXHU4OTgxXHU2NjQyXHU5NTkzXHVGRjA4XHU1MjA2XHVGRjA5JyB9LFxuICAgICAgYXR0ZW5kZWVfY29udGFjdHM6IHsgbGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTMwNkVcdTUzQzJcdTUyQTBcdTgwMDUnIH0sXG4gICAgICBhdHRlbmRlZV91c2VyczogeyBsYWJlbDogJ1x1NzkzRVx1NTE4NVx1NTNDMlx1NTJBMFx1ODAwNScgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHUzMEEyXHUzMEI4XHUzMEE3XHUzMEYzXHUzMEMwJyB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIFx1NTE3MVx1NjcwOVx1MzBENFx1MzBDM1x1MzBBRlx1MzBFQVx1MzBCOVx1MzBDOFx1RkYwOGBfcGlja2xpc3RzLnRzYFx1RkYwOVx1MzA2Rlx1ODkwN1x1NjU3MFx1MzBBQVx1MzBENlx1MzBCOFx1MzBBN1x1MzBBRlx1MzBDOFx1MzA2N1x1NTQwQ1x1NEUwMFx1MzA2RVx1NTAyNFx1OTZDNlx1NTQwOFx1MzA5Mlx1NjMwMVx1MzA2NFx1MzAwMlxuICogXHU4QTMzXHU4QTlFXHUzMDRDXHUzMEFBXHUzMEQ2XHUzMEI4XHUzMEE3XHUzMEFGXHUzMEM4XHUzMDU0XHUzMDY4XHUzMDZCXHUzMDc2XHUzMDhDXHUzMDhCXHUzMDY4XHUzMDAxXHU1NDBDXHUzMDU4XHUzMEQ0XHUzMEMzXHUzMEFGXHUzMEVBXHUzMEI5XHUzMEM4XHUzMDRDXHU3NTNCXHU5NzYyXHUzMDZCXHUzMDg4XHUzMDYzXHUzMDY2XHU1MjI1XHUzMDZFXHU4QTAwXHU4NDQ5XHUzMDY3XG4gKiBcdTg4NjhcdTc5M0FcdTMwNTVcdTMwOENcdTMwOEJcdTRFMERcdTUxNzdcdTU0MDhcdTMwNkJcdTMwNkFcdTMwOEJcdUZGMDgjNDk0XHVGRjA5XHUzMDAyXHUzMDUzXHUzMDUzXHUzMDY3XHU0RTAwXHU1RUE2XHUzMDYwXHUzMDUxXHU1QjlBXHU3RkE5XHUzMDU3XHUzMDY2XHU1NDA0XHU2MjQwXHUzMDZCXHU1QzU1XHU5NThCXHUzMDU5XHUzMDhCXHUzMDAyXG4gKiBcdTMwQURcdTMwRkNcdTMwNkZcdTg4NjhcdTc5M0FcdTMwRTlcdTMwRDlcdTMwRUJcdTMwNjdcdTMwNkZcdTMwNkFcdTMwNEYgKipcdTRGRERcdTVCNThcdTUwMjQqKiBcdTMwNjdcdTMwNDJcdTMwOEJcdTMwNTNcdTMwNjhcdTMwNkJcdTZDRThcdTYxMEZcdUZGMDgjNDk0IFx1MzA2RVx1NEUzQlx1NTZFMFx1RkYwOVx1MzAwMlxuICovXG5leHBvcnQgY29uc3Qgc2FsdXRhdGlvbk9wdGlvbnMgPSB7IG1yOiAnTXIuJywgbXM6ICdNcy4nLCBtcnM6ICdNcnMuJywgZHI6ICdcdTUzNUFcdTU4RUInLCBwcm9mOiAnXHU2NTU5XHU2Mzg4JyB9O1xuXG5leHBvcnQgY29uc3QgaW5kdXN0cnlPcHRpb25zID0ge1xuICB0ZWNobm9sb2d5OiAnXHUzMEM2XHUzMEFGXHUzMENFXHUzMEVEXHUzMEI4XHUzMEZDJywgc29mdHdhcmU6ICdcdTMwQkRcdTMwRDVcdTMwQzhcdTMwQTZcdTMwQTdcdTMwQTIgLyBTYWFTJywgZmluYW5jZTogJ1x1OTFEMVx1ODc4RCcsXG4gIGhlYWx0aGNhcmU6ICdcdTMwRDhcdTMwRUJcdTMwQjlcdTMwQjFcdTMwQTInLCByZXRhaWw6ICdcdTVDMEZcdTU4RjInLCBtYW51ZmFjdHVyaW5nOiAnXHU4OEZEXHU5MDIwJyxcbiAgZWR1Y2F0aW9uOiAnXHU2NTU5XHU4MEIyJywgcmVhbF9lc3RhdGU6ICdcdTRFMERcdTUyRDVcdTc1MjMnLCBtZWRpYTogJ1x1MzBFMVx1MzBDN1x1MzBBM1x1MzBBMlx1MzBGQlx1MzBBOFx1MzBGM1x1MzBCRlx1MzBFMScsXG4gIGxvZ2lzdGljczogJ1x1NzI2OVx1NkQ0MScsIGhvc3BpdGFsaXR5OiAnXHUzMERCXHUzMEI5XHUzMEQ0XHUzMEJGXHUzMEVBXHUzMEM2XHUzMEEzJywgZW5lcmd5OiAnXHUzMEE4XHUzMENEXHUzMEVCXHUzMEFFXHUzMEZDXHUzMEZCXHU1MTZDXHU3NkNBJyxcbiAgZ292ZXJubWVudDogJ1x1NjUzRlx1NUU5Q1x1MzBGQlx1ODg0Q1x1NjUzRicsIG5vbnByb2ZpdDogJ1x1OTc1RVx1NTVCNlx1NTIyOScsIG90aGVyOiAnXHUzMDVEXHUzMDZFXHU0RUQ2Jyxcbn07XG5cbmV4cG9ydCBjb25zdCBsZWFkU291cmNlT3B0aW9ucyA9IHtcbiAgd2ViOiAnXHUzMEE2XHUzMEE3XHUzMEQ2JywgcmVmZXJyYWw6ICdcdTdEMzlcdTRFQ0InLCBldmVudDogJ1x1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOFx1MzBGQlx1NUM1NVx1NzkzQVx1NEYxQScsXG4gIHdlYmluYXI6ICdcdTMwQTZcdTMwQTdcdTMwRDNcdTMwQ0FcdTMwRkMnLCBwYXJ0bmVyOiAnXHUzMEQxXHUzMEZDXHUzMEM4XHUzMENBXHUzMEZDJywgYWR2ZXJ0aXNlbWVudDogJ1x1NUU4M1x1NTQ0QScsXG4gIHBhaWRfc2VhcmNoOiAnXHU2NzA5XHU2NTk5XHU2OTFDXHU3RDIyJywgc29jaWFsOiAnXHUzMEJEXHUzMEZDXHUzMEI3XHUzMEUzXHUzMEVCXHUzMEUxXHUzMEM3XHUzMEEzXHUzMEEyJywgY29udGVudDogJ1x1MzBCM1x1MzBGM1x1MzBDNlx1MzBGM1x1MzBDNFx1MzBGQlx1MzBENlx1MzBFRFx1MzBCMCcsXG4gIGNvbGRfY2FsbDogJ1x1MzBCM1x1MzBGQ1x1MzBFQlx1MzBDOVx1MzBCM1x1MzBGQ1x1MzBFQicsIGVtYWlsX2NhbXBhaWduOiAnXHUzMEUxXHUzMEZDXHUzMEVCXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzJywgb3RoZXI6ICdcdTMwNURcdTMwNkVcdTRFRDYnLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9vYmplY3RzLmN1c3RvbWVyLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUFwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5jdXN0b21lci50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG5pbXBvcnQgeyBhY3Rpdml0eUFjdGlvbnMsIHNhbHV0YXRpb25PcHRpb25zLCBpbmR1c3RyeU9wdGlvbnMsIGxlYWRTb3VyY2VPcHRpb25zIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLyoqXG4gKiBcdTY1RTVcdTY3MkNcdThBOUUgKGphLUpQKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIENVU1RPTUVSIGZhbWlseTpcbiAqIHRoZSBjdXN0b21lciByZWNvcmQgaXRzZWxmIFx1MjAxNCBhY2NvdW50cyBhbmQgdGhlIHBlb3BsZSBhdCB0aGVtLlxuICpcbiAqIFJvc3RlcjogYGNybV9hY2NvdW50YCwgYGNybV9jb250YWN0YC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBjdXN0b21lcjogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX2FjY291bnQ6IHtcbiAgICBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OCcsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDgnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU1RjUzXHU3OTNFXHUzMDY4XHU1M0Q2XHU1RjE1XHUzMDZFXHUzMDQyXHUzMDhCXHU0RjAxXHU2OTZEXHUzMEZCXHU3RDQ0XHU3RTU0JyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGFjY291bnRfbnVtYmVyOiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU3NTZBXHU1M0Y3JyB9LFxuICAgICAgcmVnaXN0cmF0aW9uX251bWJlcjoge1xuICAgICAgICBsYWJlbDogJ1x1NzY3Qlx1OEExOFx1NzU2QVx1NTNGNycsXG4gICAgICAgIGhlbHA6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNENcdTgxRUFcdTU2RkRcdTMwNkVcdTc2N0JcdThBMThcdTZBNUZcdTk1QTJcdTMwNEJcdTMwODlcdTRFQTRcdTRFRDhcdTMwNTVcdTMwOENcdTMwNUZcdTc2N0JcdThBMThcdTRFMEFcdTMwNkVcdThCNThcdTUyMjVcdTc1NkFcdTUzRjdcdTMwMDJcdTVGNTNcdTc5M0VcdTMwNENcdTYzQTFcdTc1NkFcdTMwNTlcdTMwOEJcdTUzRDZcdTVGMTVcdTUxNDhcdTc1NkFcdTUzRjdcdTMwNjhcdTMwNkZcdTc1NzBcdTMwNkFcdTMwOEFcdTMwN0VcdTMwNTlcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIGNvbW1lcmNpYWxfY2FwYWJpbGl0eToge1xuICAgICAgICBsYWJlbDogJ1x1NTU0Nlx1OEFDN1x1NTNFRlx1NTQyNlx1NTMzQVx1NTIwNicsXG4gICAgICAgIGhlbHA6ICdcdTMwNTNcdTMwNkVcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNkJcdTVCRkVcdTMwNTdcdTMwNjZcdTY1QjBcdTg5OEZcdTMwNkVcdTU1NDZcdThBQzdcdTMwOTJcdTk1OEJcdTU5Q0JcdTMwNjdcdTMwNERcdTMwOEJcdTMwNEJcdTMwNjlcdTMwNDZcdTMwNEJcdTMwMDJcdTZDN0FcdTZFMDhcdTMwNkVcdTMwN0ZcdTMwNkVcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNkZcdThBQ0JcdTZDNDJcdTMwRkJcdTUxNjVcdTkxRDFcdTMwNkJcdTMwNkZcdTVGMTVcdTMwNERcdTdEOUFcdTMwNERcdTUyMjlcdTc1MjhcdTMwNjdcdTMwNERcdTMwN0VcdTMwNTlcdTMwNENcdTMwMDFcdTY1QjBcdTg5OEZcdTU1NDZcdThBQzdcdTMwOTJcdTk1QTJcdTkwMjNcdTRFRDhcdTMwNTFcdTMwOEJcdTMwNTNcdTMwNjhcdTMwNkZcdTMwNjdcdTMwNERcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDInLFxuICAgICAgICBvcHRpb25zOiB7IGZ1bGw6ICdcdTUyMzZcdTk2NTBcdTMwNkFcdTMwNTcnLCBzZXR0bGVtZW50X29ubHk6ICdcdTZDN0FcdTZFMDhcdTMwNkVcdTMwN0YnIH0sXG4gICAgICB9LFxuICAgICAgaW5jdW1iZW50X3ZlbmRvcjogeyBsYWJlbDogJ1x1NzNGRVx1ODg0Q1x1MzBEOVx1MzBGM1x1MzBDMFx1MzBGQycsIGhlbHA6ICdcdTVGNTNcdTc5M0VcdTMwNENcdTcyRDlcdTMwNjNcdTMwNjZcdTMwNDRcdTMwOEJcdTY1MkZcdTUxRkFcdTMwOTJcdTczRkVcdTU3MjhcdTUzRDdcdTZDRThcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOEJcdTMwRDlcdTMwRjNcdTMwQzBcdTMwRkNcdTMwMDInIH0sXG4gICAgICBhbm51YWxfcHVyY2hhc2luZ19idWRnZXQ6IHsgbGFiZWw6ICdcdTVFNzRcdTk1OTNcdThBQkZcdTkwNTRcdTRFODhcdTdCOTcnLCBoZWxwOiAnXHUzMDUzXHUzMDZFXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDRDXHU0RUNBXHU1RTc0XHU1RUE2XHUzMEQ5XHUzMEYzXHUzMEMwXHUzMEZDXHUzMDZCXHU2NTJGXHU1MUZBXHUzMDU5XHUzMDhCXHU4OThCXHU4RkJDXHUzMDdGXHU5ODREXHUzMDY3XHUzMDQyXHUzMDhBXHUzMDAxXHU4MUVBXHU3OTNFXHUzMDZFXHU1OEYyXHU0RTBBXHU5QUQ4XHUzMDY3XHUzMDZGXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDAyJyB9LFxuICAgICAgcGF5bWVudF9jeWNsZToge1xuICAgICAgICBsYWJlbDogJ1x1NjUyRlx1NjI1NVx1MzBCNVx1MzBBNFx1MzBBRlx1MzBFQicsXG4gICAgICAgIG9wdGlvbnM6IHsgcHJlcGFpZDogJ1x1NTI0RFx1NjI1NVx1MzA0NCcsIG5ldF8zMDogJzMwXHU2NUU1JywgbmV0XzYwOiAnNjBcdTY1RTUnLCBuZXRfOTA6ICc5MFx1NjVFNScgfSxcbiAgICAgIH0sXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTYyN0ZcdThBOERcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLFxuICAgICAgICBoZWxwOiAnXHUzMDUzXHUzMDZFXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZFXHU2MjdGXHU4QThEXHU3MkI2XHU2Q0MxXHUzMDAyXHU2NUIwXHU4OThGXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZGXHU2MjdGXHU4QThEXHU1Rjg1XHUzMDYxXHUzMDY3XHU0RjVDXHU2MjEwXHUzMDU1XHUzMDhDXHUzMDAxXHU2MjdGXHU4QThEXHUzMEM4XHUzMEVDXHUzMEE0XHUzMDY3XHU1MjI0XHU2NUFEXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU5XHUzMDAyJyxcbiAgICAgICAgb3B0aW9uczogeyBwZW5kaW5nOiAnXHU2MjdGXHU4QThEXHU1Rjg1XHUzMDYxJywgYXBwcm92ZWQ6ICdcdTYyN0ZcdThBOERcdTZFMDhcdTMwN0YnLCByZWplY3RlZDogJ1x1NTM3NFx1NEUwQicgfSxcbiAgICAgIH0sXG4gICAgICBuYW1lOiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU1NDBEJywgaGVscDogJ1x1NEYxQVx1NzkzRVx1MzA3RVx1MzA1Rlx1MzA2Rlx1N0Q0NFx1N0U1NFx1MzA2RVx1NkI2M1x1NUYwRlx1NTQwRFx1NzlGMCcgfSxcbiAgICAgIG5hbWVfbm9ybWFsaXplZDoge1xuICAgICAgICBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1NTQwRFx1RkYwOFx1NkI2M1x1ODk4Rlx1NTMxNlx1RkYwOScsXG4gICAgICAgIGhlbHA6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTU5MDlcdTYzREJcdTMwNkVcdTcxNjdcdTU0MDhcdTMwQURcdTMwRkNcdTMwMDJcdTUzRDZcdTVGMTVcdTUxNDhcdTU0MERcdTMwOTJcdTVDMEZcdTY1ODdcdTVCNTdcdTUzMTZcdTMwNTdcdTMwMDFcdTUyNERcdTVGOENcdTMwNkVcdTdBN0FcdTc2N0RcdTMwOTJcdTk2NjRcdTUzQkJcdTMwNTdcdTMwNjZcdTMwMDFcdTUxODVcdTkwRThcdTMwNkVcdTkwMjNcdTdEOUFcdTMwNTlcdTMwOEJcdTdBN0FcdTc2N0RcdTMwOTIgMSBcdTMwNjRcdTMwNkJcdTMwN0VcdTMwNjhcdTMwODFcdTMwNUZcdTMwODJcdTMwNkVcdTMwMDJhY2NvdW50X3Byb3RlY3Rpb24gXHUzMEQ1XHUzMEMzXHUzMEFGXHUzMDRDXHU4MUVBXHU1MkQ1XHUzMDY3XHU3REFEXHU2MzAxXHUzMDU3XHUzMDdFXHUzMDU5IFx1MjAxNCBcdTc2RjRcdTYzQTVcdTdERThcdTk2QzZcdTMwNTdcdTMwNkFcdTMwNDRcdTMwNjdcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTg4NjhcdTc5M0FcdTU0MEQnIH0sXG4gICAgICB0eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEJGXHUzMEE0XHUzMEQ3JyxcbiAgICAgICAgb3B0aW9uczogeyBwcm9zcGVjdDogJ1x1ODk4Qlx1OEZCQ1x1MzA3Rlx1NUJBMicsIGN1c3RvbWVyOiAnXHU5ODY3XHU1QkEyJywgcGFydG5lcjogJ1x1MzBEMVx1MzBGQ1x1MzBDOFx1MzBDQVx1MzBGQycsIGZvcm1lcjogJ1x1OTA0RVx1NTNCQlx1MzA2RVx1NTNENlx1NUYxNVx1NTE0OCcgfSxcbiAgICAgIH0sXG4gICAgICBpbmR1c3RyeToge1xuICAgICAgICBsYWJlbDogJ1x1Njk2RFx1N0EyRScsXG4gICAgICAgIG9wdGlvbnM6IHsgLi4uaW5kdXN0cnlPcHRpb25zIH0sXG4gICAgICB9LFxuICAgICAgYW5udWFsX3JldmVudWU6IHsgbGFiZWw6ICdcdTVFNzRcdTk1OTNcdTU4RjJcdTRFMEEnIH0sXG4gICAgICBjaGlsZF9hY2NvdW50X3JldmVudWU6IHsgbGFiZWw6ICdcdTVCNTBcdTRGMUFcdTc5M0VcdTVFNzRcdTk1OTNcdTU4RjJcdTRFMEFcdTU0MDhcdThBMDgnLCBoZWxwOiAnXHU3NkY0XHU1QzVFXHUzMDZFXHU1QjUwXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZFXHU1RTc0XHU5NTkzXHU1OEYyXHU0RTBBXHUzMDZFXHU1NDA4XHU4QTA4XHUzMDAyJyB9LFxuICAgICAgbnVtYmVyX29mX2VtcGxveWVlczogeyBsYWJlbDogJ1x1NUY5M1x1Njk2RFx1NTRFMVx1NjU3MCcgfSxcbiAgICAgIHBob25lOiB7IGxhYmVsOiAnXHU5NkZCXHU4QTcxXHU3NTZBXHU1M0Y3JyB9LFxuICAgICAgd2Vic2l0ZTogeyBsYWJlbDogJ1dlYlx1MzBCNVx1MzBBNFx1MzBDOCcgfSxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBsYWJlbDogJ1x1OEFDQlx1NkM0Mlx1NTE0OFx1NEY0Rlx1NjI0MCcgfSxcbiAgICAgIGJpbGxpbmdfY291bnRyeToge1xuICAgICAgICBsYWJlbDogJ1x1OEFDQlx1NkM0Mlx1NTE0OFx1NTZGRCcsXG4gICAgICAgIGhlbHA6ICdcdThBQ0JcdTZDNDJcdTUxNDhcdTRGNEZcdTYyNDBcdTMwNEJcdTMwODlcdTVDMEVcdTUxRkEgXHUyMDE0IFx1NTE2NVx1NTI5Qlx1MzA1NVx1MzA4Q1x1MzA1Rlx1NTZGRFx1NTQwRFx1MzA5Mlx1MzA1RFx1MzA2RVx1MzA3RVx1MzA3RVx1MzAwMVx1NTI0RFx1NUY4Q1x1MzA2RVx1N0E3QVx1NzY3RFx1MzA5Mlx1OTY2NFx1NTNCQlx1MzA1N1x1NTkyN1x1NjU4N1x1NUI1N1x1NTMxNlx1MzA1N1x1MzA1Rlx1NTAyNFx1MzAwMicsXG4gICAgICB9LFxuICAgICAgdGVycml0b3J5OiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEM2XHUzMEVBXHUzMEM4XHUzMEVBXHUzMEZDJyxcbiAgICAgICAgaGVscDogJ1x1OEFDQlx1NkM0Mlx1NTE0OFx1NEY0Rlx1NjI0MFx1MzA0Qlx1MzA4OVx1NUMwRVx1NTFGQSBcdTIwMTQgXHUzMEM2XHUzMEVBXHUzMEM4XHUzMEVBXHUzMEZDXHU1MTcxXHU2NzA5XHUzMEVCXHUzMEZDXHUzMEVCXHUzMDRDXHU3MTY3XHU1NDA4XHUzMDU5XHUzMDhCXHU1NUI2XHU2OTZEXHUzMEM2XHUzMEVBXHUzMEM4XHUzMEVBXHUzMEZDXHUzMDAyXHU2MkM1XHU1RjUzXHUzMEMxXHUzMEZDXHUzMEUwXHUzMDZFXHUzMDZBXHUzMDQ0XHUzMEM2XHUzMEVBXHUzMEM4XHUzMEVBXHUzMEZDXHUzMDZFXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZGXHUzMDBDXHUzMDVEXHUzMDZFXHU0RUQ2XHUzMDBEXHUzMDAyJyxcbiAgICAgICAgb3B0aW9uczogeyBuYTogJ1x1NTMxN1x1N0M3MycsIGVtZWE6ICdFTUVBJywgb3RoZXI6ICdcdTMwNURcdTMwNkVcdTRFRDYnIH0sXG4gICAgICB9LFxuICAgICAgb2ZmaWNlX2xvY2F0aW9uOiB7IGxhYmVsOiAnXHUzMEFBXHUzMEQ1XHUzMEEzXHUzMEI5XHU2MjQwXHU1NzI4XHU1NzMwJyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdTYyNDBcdTY3MDlcdTgwMDUnIH0sXG4gICAgICBwYXJlbnRfYWNjb3VudDogeyBsYWJlbDogJ1x1ODlBQVx1NTNENlx1NUYxNVx1NTE0OCcsIGhlbHA6ICdcdTk2OEVcdTVDNjRcdTY5Q0JcdTkwMjBcdTMwNkJcdTMwNEFcdTMwNTFcdTMwOEJcdTg5QUFcdTRGMUFcdTc5M0UnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ1x1OEFBQ1x1NjYwRScgfSxcbiAgICAgIGlzX2FjdGl2ZTogeyBsYWJlbDogJ1x1NjcwOVx1NTJCOScgfSxcbiAgICAgIGxhc3RfYWN0aXZpdHlfZGF0ZTogeyBsYWJlbDogJ1x1NjcwMFx1N0Q0Mlx1NkQzQlx1NTJENVx1NjVFNScgfSxcbiAgICAgIGJyYW5kX2NvbG9yOiB7IGxhYmVsOiAnXHUzMEQ2XHUzMEU5XHUzMEYzXHUzMEM5XHUzMEFCXHUzMEU5XHUzMEZDJyB9LFxuICAgICAgbG9nbzogeyBsYWJlbDogJ1x1NEYxQVx1NzkzRVx1MzBFRFx1MzBCNCcgfSxcbiAgICAgIHRpZXI6IHtcbiAgICAgICAgbGFiZWw6ICdcdTk4NjdcdTVCQTJcdTMwRTlcdTMwRjNcdTMwQUYnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgc3RyYXRlZ2ljOiAnXHU2MjI2XHU3NTY1XHU5ODY3XHU1QkEyJywgZW50ZXJwcmlzZTogJ1x1MzBBOFx1MzBGM1x1MzBCRlx1MzBGQ1x1MzBEN1x1MzBFOVx1MzBBNFx1MzBCQScsXG4gICAgICAgICAgbWlkX21hcmtldDogJ1x1MzBERlx1MzBDM1x1MzBDOVx1MzBERVx1MzBGQ1x1MzBCMVx1MzBDM1x1MzBDOCcsIHNtYjogJ1x1NEUyRFx1NUMwRlx1NEYwMVx1Njk2RCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc2VnbWVudDoge1xuICAgICAgICBsYWJlbDogJ1x1OTg2N1x1NUJBMlx1MzBCQlx1MzBCMFx1MzBFMVx1MzBGM1x1MzBDOCcsXG4gICAgICAgIG9wdGlvbnM6IHsgbmV0X25ldzogJ1x1NjVCMFx1ODk4Rlx1NzM3Mlx1NUY5NycsIGdyb3d0aDogJ1x1NjIxMFx1OTU3NycsIGF0X3Jpc2s6ICdcdTMwRUFcdTMwQjlcdTMwQUZcdTMwNDJcdTMwOEEnLCBzdGFibGU6ICdcdTVCODlcdTVCOUEnIH0sXG4gICAgICB9LFxuICAgICAgaGVhbHRoX3Njb3JlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEQ4XHUzMEVCXHUzMEI5XHUzMEI5XHUzMEIzXHUzMEEyJyxcbiAgICAgICAgaGVscDogJ1x1MzBBQlx1MzBCOVx1MzBCRlx1MzBERVx1MzBGQ1x1MzBCNVx1MzBBRlx1MzBCQlx1MzBCOVx1NjJDNVx1NUY1M1x1RkYwOENTTVx1RkYwOVx1MzA0Q1x1N0JBMVx1NzQwNlx1MzA1OVx1MzA4Qlx1NTA2NVx1NTE2OFx1NjAyN1x1MzA2RVx1NjMwN1x1NkExOScsXG4gICAgICAgIG9wdGlvbnM6IHsgaGVhbHRoeTogJ1x1ODI2Rlx1NTk3RCcsIHdhdGNoaW5nOiAnXHU4OTgxXHU4OUIzXHU1QkRGJywgYXRfcmlzazogJ1x1MzBFQVx1MzBCOVx1MzBBRlx1MzA0Mlx1MzA4QScsIGNodXJuaW5nOiAnXHU4OUUzXHU3RDA0XHU5MDMyXHU4ODRDXHU0RTJEJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2FjY291bnRzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1MTY4XHU1M0Q2XHU1RjE1XHU1MTQ4JywgZGVzY3JpcHRpb246ICdcdTU4RjJcdTRFMEFcdTMwNjhcdTY5NkRcdTdBMkVcdTMwOTJcdTU0MkJcdTMwODBcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNkVcdTRFMDBcdTg5QTcnLFxuICAgICAgICBidWxrQWN0aW9uczoge1xuICAgICAgICAgIGRlbGV0ZToge1xuICAgICAgICAgICAgbGFiZWw6ICdcdTUyNEFcdTk2NjQnLFxuICAgICAgICAgICAgY29uZmlybUxhYmVsOiAnXHU1MjRBXHU5NjY0JyxcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiAne3tjb3VudH19IFx1NEVGNlx1MzA2RVx1NTNENlx1NUYxNVx1NTE0OFx1MzA5Mlx1NUI4Q1x1NTE2OFx1MzA2Qlx1NTI0QVx1OTY2NFx1MzA1N1x1MzA3RVx1MzA1OVx1MzA0Qlx1RkYxRlx1MzA1M1x1MzA2RVx1NjRDRFx1NEY1Q1x1MzA2Rlx1NTNENlx1MzA4QVx1NkQ4OFx1MzA1Qlx1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cmFuc2Zlcl9vd25lcjoge1xuICAgICAgICAgICAgbGFiZWw6ICdcdTYyNDBcdTY3MDlcdTgwMDVcdTMwNkVcdTU5MDlcdTY2RjQnLFxuICAgICAgICAgICAgY29uZmlybVRleHQ6ICd7e2NvdW50fX0gXHU0RUY2XHUzMDZFXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZFXHU2MjQwXHU2NzA5XHU4MDA1XHUzMDkyXHU1OTA5XHU2NkY0XHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGJyxcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICBvd25lcl9pZDoge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnXHU2NUIwXHUzMDU3XHUzMDQ0XHU2MjQwXHU2NzA5XHU4MDA1JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1cGRhdGVfdGllcjoge1xuICAgICAgICAgICAgbGFiZWw6ICdcdTk4NjdcdTVCQTJcdTMwRTlcdTMwRjNcdTMwQUZcdTMwNkVcdTY2RjRcdTY1QjAnLFxuICAgICAgICAgICAgY29uZmlybVRleHQ6ICd7e2NvdW50fX0gXHU0RUY2XHUzMDZFXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZFXHU5ODY3XHU1QkEyXHUzMEU5XHUzMEYzXHUzMEFGXHUzMDkyIHt7dGllcn19IFx1MzA2Qlx1NjZGNFx1NjVCMFx1MzA1N1x1MzA3RVx1MzA1OVx1MzA0Qlx1RkYxRicsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgdGllcjoge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnXHU5ODY3XHU1QkEyXHUzMEU5XHUzMEYzXHUzMEFGJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhY2NvdW50X2dhbGxlcnk6IHsgbGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdTMwQUJcdTMwRkNcdTMwQzknLCBkZXNjcmlwdGlvbjogJ1x1MzBENlx1MzBFOVx1MzBGM1x1MzBDOVx1MzBBQlx1MzBFOVx1MzBGQ1x1NEVEOFx1MzA0RFx1MzA2RVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzBEM1x1MzBFNVx1MzBGQycgfSxcbiAgICAgIGFjY291bnRfbWFwOiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMERFXHUzMEMzXHUzMEQ3JywgZGVzY3JpcHRpb246ICdcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNkVcdTU3MzBcdTc0MDZcdTc2ODRcdTUyMDZcdTVFMDMnIH0sXG4gICAgICBlbnRlcnByaXNlX2FjY291bnRzOiB7IGxhYmVsOiAnXHUzMEE4XHUzMEYzXHUzMEJGXHUzMEZDXHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEJBXHU1M0Q2XHU1RjE1XHU1MTQ4JywgZGVzY3JpcHRpb246ICdcdTVFNzRcdTU1NDZcdTY3MDBcdTRFMEFcdTRGNERcdTMwNkVcdTRFM0JcdTg5ODFcdTk4NjdcdTVCQTInIH0sXG4gICAgICBteV9hY2NvdW50czogeyBsYWJlbDogJ1x1NzlDMVx1MzA2RVx1NTNENlx1NUYxNVx1NTE0OCcsIGRlc2NyaXB0aW9uOiAnXHU4MUVBXHU1MjA2XHUzMDRDXHU2MjQwXHU2NzA5XHUzMDU5XHUzMDhCXHU1M0Q2XHU1RjE1XHU1MTQ4JyB9LFxuICAgICAgYXRfcmlza19hY2NvdW50czogeyBsYWJlbDogJ1x1MjZBMFx1RkUwRiBcdTMwRUFcdTMwQjlcdTMwQUZcdTMwNkVcdTMwNDJcdTMwOEJcdTUzRDZcdTVGMTVcdTUxNDgnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnXHU1N0ZBXHU2NzJDXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgZmluYW5jaWFsczogeyBsYWJlbDogJ1x1OENBMVx1NTJEOVx1NjBDNVx1NTgzMScgfSxcbiAgICAgIGJ1c2luZXNzX3Byb2ZpbGU6IHsgbGFiZWw6ICdcdTMwRDNcdTMwQjhcdTMwQ0RcdTMwQjlcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdcdTkwMjNcdTdENjFcdTUxNDhcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBvd25lcnNoaXA6IHsgbGFiZWw6ICdcdTYyNDBcdTY3MDlcdTgwMDVcdTMwRkJcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknIH0sXG4gICAgICBicmFuZGluZzogeyBsYWJlbDogJ1x1MzBENlx1MzBFOVx1MzBGM1x1MzBDN1x1MzBBM1x1MzBGM1x1MzBCMCcgfSxcbiAgICAgIHN5c3RlbTogeyBsYWJlbDogJ1x1MzBCN1x1MzBCOVx1MzBDNlx1MzBFMCcgfSxcbiAgICAgIC8vIGFjY291bnQudmlldy50cyBcdTMwNkVcdTMwRDVcdTMwQTlcdTMwRkNcdTMwRTBcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTU0MEQgKCMxMTAwKVxuICAgICAgcHJvZmlsZTogeyBsYWJlbDogJ1x1MzBEN1x1MzBFRFx1MzBENVx1MzBBM1x1MzBGQ1x1MzBFQicgfSxcbiAgICAgIGN1c3RvbWVyX3N1Y2Nlc3M6IHsgbGFiZWw6ICdcdTMwQUJcdTMwQjlcdTMwQkZcdTMwREVcdTMwRkNcdTMwQjVcdTMwQUZcdTMwQkJcdTMwQjknIH0sXG4gICAgICBsb2NhdGlvbnM6IHsgbGFiZWw6ICdcdTYyNDBcdTU3MjhcdTU3MzAnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ1x1OEFBQ1x1NjYwRScgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7IC4uLmFjdGl2aXR5QWN0aW9ucyB9LFxuICB9LFxuICBjcm1fY29udGFjdDoge1xuICAgIGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1JyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNScsXG4gICAgZGVzY3JpcHRpb246ICdcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNkJcdTYyNDBcdTVDNUVcdTMwNTlcdTMwOEJcdTYyQzVcdTVGNTNcdTgwMDUnLFxuICAgIGZpZWxkczoge1xuICAgICAgc2FsdXRhdGlvbjogeyBsYWJlbDogJ1x1NjU2Q1x1NzlGMCcsIG9wdGlvbnM6IHsgLi4uc2FsdXRhdGlvbk9wdGlvbnMgfSB9LFxuICAgICAgZmlyc3RfbmFtZTogeyBsYWJlbDogJ1x1NTQwRCcgfSxcbiAgICAgIGxhc3RfbmFtZTogeyBsYWJlbDogJ1x1NTlEMycgfSxcbiAgICAgIGZ1bGxfbmFtZTogeyBsYWJlbDogJ1x1NkMwRlx1NTQwRCcgfSxcbiAgICAgIGNybV9hY2NvdW50OiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4JyB9LFxuICAgICAgZW1haWw6IHsgbGFiZWw6ICdcdTMwRTFcdTMwRkNcdTMwRUInIH0sXG4gICAgICBwaG9uZTogeyBsYWJlbDogJ1x1OTZGQlx1OEE3MScgfSxcbiAgICAgIG1vYmlsZTogeyBsYWJlbDogJ1x1NjQzQVx1NUUyRlx1OTZGQlx1OEE3MScgfSxcbiAgICAgIHRpdGxlOiB7IGxhYmVsOiAnXHU1Rjc5XHU4MDc3JyB9LFxuICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICBsYWJlbDogJ1x1OTBFOFx1OTU4MCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBleGVjdXRpdmU6ICdcdTdENENcdTU1QjZcdTVDNjQnLCBzYWxlczogJ1x1NTVCNlx1Njk2RFx1OTBFOCcsIG1hcmtldGluZzogJ1x1MzBERVx1MzBGQ1x1MzBCMVx1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMFx1OTBFOCcsXG4gICAgICAgICAgZW5naW5lZXJpbmc6ICdcdTMwQThcdTMwRjNcdTMwQjhcdTMwQ0JcdTMwQTJcdTMwRUFcdTMwRjNcdTMwQjBcdTkwRTgnLCBzdXBwb3J0OiAnXHUzMEI1XHUzMEREXHUzMEZDXHUzMEM4XHU5MEU4JywgZmluYW5jZTogJ1x1N0Q0Q1x1NzQwNlx1OTBFOCcsXG4gICAgICAgICAgaHI6ICdcdTRFQkFcdTRFOEJcdTkwRTgnLCBvcGVyYXRpb25zOiAnXHUzMEFBXHUzMERBXHUzMEVDXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzXHU5MEU4JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAvLyBcdTMwRDBcdTMwQTRcdTMwQTRcdTMwRjNcdTMwQjBcdTMwQkJcdTMwRjNcdTMwQkZcdTMwRkMgKFJFUS0wMDA0KSBcdTIwMTQgXHU2MTBGXHU2MDFEXHU2QzdBXHU1QjlBXHUzMDZFXHUzMERFXHUzMEMzXHUzMEQ3XHUzMDAyXHU4MkYxXHU4QTlFXHUzMEU5XHUzMEQ5XHUzMEVCXHUzMDZGXG4gICAgICAvLyAnQnV5aW5nIFJvbGUnIFx1MzA2N1x1MzA2Rlx1MzA2QVx1MzA0RiAnQnV5aW5nIEZ1bmN0aW9uJ1x1RkYxQXNlY3VyaXR5LXJvbGUtd29yZCBcdTMwRUJcdTMwRkNcdTMwRUJcdTMwNENcbiAgICAgIC8vIFx1NUJBM1x1OEEwMFx1NTA3NFx1MzA2N1x1ODJGMVx1NTM1OFx1OEE5RSByb2xlIFx1MzA5Mlx1NEU4OFx1N0QwNFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4QiAoQURSLTAwOTAgRDMpXHUzMDAyXHU1NDBDXHUzMEVCXHUzMEZDXHUzMEVCXHUzMDZGXHU4MkYxXHU4QTlFXHUzMDZFXHUzMDdGXHUzMDkyXG4gICAgICAvLyBcdThBQURcdTMwN0ZcdThBMDBcdThBOUVcdTMwRDFcdTMwQzNcdTMwQUZcdTMwNkJcdTMwNkZcdTUzQ0FcdTMwNzBcdTMwNkFcdTMwNDRcdTMwNUZcdTMwODFcdTMwMDFcdTMwNTNcdTMwNTNcdTMwNjdcdTMwNkZcdTY1RTVcdTY3MkNcdThBOUVcdTMwNjhcdTMwNTdcdTMwNjZcdTgxRUFcdTcxMzZcdTMwNkFcdThBOUVcdTMwOTJcdTRGN0ZcdTMwNDZcdTMwMDJcbiAgICAgIGJ1eWluZ19mdW5jdGlvbjoge1xuICAgICAgICBsYWJlbDogJ1x1OENGQ1x1OENCN1x1NUY3OVx1NTI3MicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkZWNpc2lvbl9tYWtlcjogJ1x1NkM3QVx1ODhDMVx1ODAwNScsIGVjb25vbWljX2J1eWVyOiAnXHU0RTg4XHU3Qjk3XHU2QzdBXHU4OEMxXHU4MDA1JyxcbiAgICAgICAgICB0ZWNobmljYWxfZXZhbHVhdG9yOiAnXHU2MjgwXHU4ODUzXHU4QTU1XHU0RkExXHU4MDA1JywgdXNlcjogJ1x1NTIyOVx1NzUyOFx1ODAwNScsXG4gICAgICAgICAgaW5mbHVlbmNlcjogJ1x1NUY3MVx1OTdGRlx1ODAwNScsIGdhdGVrZWVwZXI6ICdcdTMwQjJcdTMwRkNcdTMwQzhcdTMwQURcdTMwRkNcdTMwRDFcdTMwRkMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGF0dGl0dWRlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU4MUVBXHU3OTNFXHUzMDc4XHUzMDZFXHU2MTRCXHU1RUE2JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGNoYW1waW9uOiAnXHU2M0E4XHU5MDMyXHU4MDA1Jywgc3VwcG9ydGl2ZTogJ1x1NTk3RFx1NjEwRlx1NzY4NCcsIG5ldXRyYWw6ICdcdTRFMkRcdTdBQ0InLFxuICAgICAgICAgIHNrZXB0aWNhbDogJ1x1NjFEMFx1NzU5MVx1NzY4NCcsIGJsb2NrZXI6ICdcdTUzQ0RcdTVCRkVcdTgwMDUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlbGF0aW9uc2hpcF9zdHJlbmd0aDoge1xuICAgICAgICBsYWJlbDogJ1x1OTVBMlx1NEZDMlx1MzA2RVx1NUYzN1x1MzA1NScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkaXN0YW50OiAnXHU3NThFXHU5MDYwJywgYWNxdWFpbnRhbmNlOiAnXHU5ODU0XHU4OThCXHU3N0U1XHUzMDhBJywgd29ya2luZzogJ1x1Njk2RFx1NTJEOVx1NEUwQVx1MzA2RVx1OTVBMlx1NEZDMicsXG4gICAgICAgICAgc3Ryb25nOiAnXHU1RjM3XHUzMDQ0JywgdHJ1c3RlZF9hZHZpc29yOiAnXHU0RkUxXHU5ODNDXHUzMDU1XHUzMDhDXHUzMDhCXHUzMEEyXHUzMEM5XHUzMEQwXHUzMEE0XHUzMEI2XHUzMEZDJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNVx1MzA2RVx1NjI0MFx1NjcwOVx1ODAwNScgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU4QUFDXHU2NjBFJyB9LFxuICAgICAgaXNfcHJpbWFyeTogeyBsYWJlbDogJ1x1NEUzQlx1NjJDNVx1NUY1M1x1ODAwNScsIGhlbHA6ICdcdTMwNTNcdTMwNkVcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNkVcdTRFM0JcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNEJcdTMwNjlcdTMwNDZcdTMwNEInIH0sXG4gICAgICBhdmF0YXI6IHsgbGFiZWw6ICdcdTMwRDdcdTMwRURcdTMwRDVcdTMwQTNcdTMwRkNcdTMwRUJcdTc1M0JcdTUwQ0YnIH0sXG4gICAgICBtYWlsaW5nX2FkZHJlc3M6IHsgbGFiZWw6ICdcdTkwRjVcdTkwMDFcdTUxNDhcdTRGNEZcdTYyNDAnIH0sXG4gICAgICBsZWFkX3NvdXJjZTogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1MzBCRFx1MzBGQ1x1MzBCOScsIG9wdGlvbnM6IHsgLi4ubGVhZFNvdXJjZU9wdGlvbnMgfSB9LFxuICAgICAgZG9fbm90X2NhbGw6IHsgbGFiZWw6ICdcdTk2RkJcdThBNzFcdTYyRDJcdTU0MjYnIH0sXG4gICAgICBlbWFpbF9vcHRfb3V0OiB7IGxhYmVsOiAnXHUzMEUxXHUzMEZDXHUzMEVCXHU5MTREXHU0RkUxXHU1MDVDXHU2QjYyJyB9LFxuICAgICAgbGFzdF9jb250YWN0ZWRfZGF0ZTogeyBsYWJlbDogJ1x1NjcwMFx1N0Q0Mlx1NjNBNVx1ODlFNlx1NjVFNVx1NjY0MicgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2NvbnRhY3RzOiB7IGxhYmVsOiAnXHU1MTY4XHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1JyB9LFxuICAgICAgY29udGFjdF9kaXJlY3Rvcnk6IHsgbGFiZWw6ICdcdThDQUNcdTRFRkJcdTgwMDVcdTMwQzdcdTMwQTNcdTMwRUNcdTMwQUZcdTMwQzhcdTMwRUEnIH0sXG4gICAgICBwcmltYXJ5X2NvbnRhY3RzOiB7IGxhYmVsOiAnXHU0RTNCXHU2MkM1XHU1RjUzXHU4MDA1JyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBpZGVudGl0eTogeyBsYWJlbDogJ1x1NTdGQVx1NjcyQ1x1NjBDNVx1NTgzMScgfSxcbiAgICAgIGFjY291bnRfaW5mbzogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1MzBGQlx1NUY3OVx1ODA3NycgfSxcbiAgICAgIGJ1eWluZ19jZW50cmU6IHsgbGFiZWw6ICdcdTMwRDBcdTMwQTRcdTMwQTRcdTMwRjNcdTMwQjBcdTMwQkJcdTMwRjNcdTMwQkZcdTMwRkMnIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdcdTkwMjNcdTdENjFcdTUxNDhcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBtYWlsaW5nX2FkZHJlc3M6IHsgbGFiZWw6ICdcdTkwRjVcdTkwMDFcdTUxNDhcdTRGNEZcdTYyNDAnIH0sXG4gICAgICBhZGRpdGlvbmFsOiB7IGxhYmVsOiAnXHUzMDVEXHUzMDZFXHU0RUQ2XHUzMDZFXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgcHJlZmVyZW5jZXM6IHsgbGFiZWw6ICdcdTMwQjNcdTMwREZcdTMwRTVcdTMwQ0JcdTMwQjFcdTMwRkNcdTMwQjdcdTMwRTdcdTMwRjNcdThBMkRcdTVCOUEnIH0sXG4gICAgICAvLyBjb250YWN0LnZpZXcudHMgXHUzMDZFXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEUwXHUzMEJCXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHU1NDBEICgjMTEwMClcbiAgICAgIGNvbnRhY3RfZGV0YWlsczogeyBsYWJlbDogJ1x1OTAyM1x1N0Q2MVx1NTE0OFx1NjBDNVx1NTgzMScgfSxcbiAgICAgIGNvbW1fcHJlZmVyZW5jZXM6IHsgbGFiZWw6ICdcdThBMkRcdTVCOUEnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgbWFya19wcmltYXJ5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RTNCXHU2MkM1XHU1RjUzXHU4MDA1XHUzMDZCXHU4QTJEXHU1QjlBJyxcbiAgICAgICAgY29uZmlybVRleHQ6ICdcdTMwNTNcdTMwNkVcdThDQUNcdTRFRkJcdTgwMDVcdTMwOTJcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNkVcdTRFM0JcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNkJcdThBMkRcdTVCOUFcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdUZGMUYnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1NEUzQlx1NjJDNVx1NUY1M1x1ODAwNVx1MzA2Qlx1OEEyRFx1NUI5QVx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1RkYwMScsXG4gICAgICB9LFxuICAgICAgc2VuZF9lbWFpbDoge1xuICAgICAgICBsYWJlbDogJ1x1MzBFMVx1MzBGQ1x1MzBFQlx1OTAwMVx1NEZFMScsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHN1YmplY3Q6IHsgbGFiZWw6ICdcdTRFRjZcdTU0MEQnIH0sXG4gICAgICAgICAgYm9keTogeyBsYWJlbDogJ1x1NjcyQ1x1NjU4NycgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhZGRfY29udGFjdF90b19jYW1wYWlnbjoge1xuICAgICAgICBsYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzA2Qlx1OEZGRFx1NTJBMCcsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDkyXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHUzMDZCXHU4RkZEXHU1MkEwXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHVGRjAxJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzJyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9vYmplY3RzLnBpcGVsaW5lLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUFwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5waXBlbGluZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG5pbXBvcnQgeyBhY3Rpdml0eUFjdGlvbnMsIHNhbHV0YXRpb25PcHRpb25zLCBpbmR1c3RyeU9wdGlvbnMsIGxlYWRTb3VyY2VPcHRpb25zIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLyoqXG4gKiBcdTY1RTVcdTY3MkNcdThBOUUgKGphLUpQKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIFBJUEVMSU5FIGZhbWlseTpcbiAqIGRlbWFuZCBhbmQgdGhlIGRlYWxzIGl0IGJlY29tZXMsIHBsdXMgdGhlIHJvbGwtdXAgdGhhdCBmb3JlY2FzdHMgdGhlbS5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fbGVhZGAsIGBjcm1fb3Bwb3J0dW5pdHlgLCBgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbWAsIGBjcm1fZm9yZWNhc3RgLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICogRXZlcnl0aGluZyB0aGF0IGlzIG5vdCBgb2JqZWN0c2AgbGl2ZXMgaW4gYC4vYXBwLnRzYDsgYG9iamVjdHNgIFx1MjAxNCA2OS03OCUgb2ZcbiAqIGV2ZXJ5IGJ1bmRsZSBcdTIwMTQgaXMgb25lIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5LCBhbmQgYSBkZXRhaWwgb2JqZWN0XG4gKiBmb2xsb3dzIGl0cyBtYXN0ZXIuIEEgbmV3IHJvdyBnb2VzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LCBuZXZlciBpblxuICogd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuOiB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0IHRoZSA3MCVcbiAqIGFkdmlzb3J5IGJhbmQgYHBucG0gaHlnaWVuZWAgcHJpbnRzLiBGdWxsIHJ1bGUgYW5kIHJhdGlvbmFsZTpcbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQLnRzYC5cbiAqL1xuY29uc3Qgb3Bwb3J0dW5pdHlTdGFnZU9wdGlvbnMgPSB7XG4gIHByb3NwZWN0aW5nOiAnXHU4OThCXHU4RkJDXHUzMDdGXHU4QUJGXHU2N0ZCJywgcXVhbGlmaWNhdGlvbjogJ1x1OTA3OFx1NUI5QScsXG4gIG5lZWRzX2FuYWx5c2lzOiAnXHUzMENCXHUzMEZDXHUzMEJBXHU1MjA2XHU2NzkwJywgcHJvcG9zYWw6ICdcdTYzRDBcdTY4NDgnLFxuICBuZWdvdGlhdGlvbjogJ1x1NEVBNFx1NkUwOScsIGNsb3NlZF93b246ICdcdTYyMTBcdTdBQ0InLCBjbG9zZWRfbG9zdDogJ1x1NEUwRFx1NjIxMFx1N0FDQicsXG59O1xuXG5leHBvcnQgY29uc3QgcGlwZWxpbmU6IFJlY29yZDxzdHJpbmcsIE9iamVjdFRyYW5zbGF0aW9uRGF0YT4gPSB7XG4gIGNybV9sZWFkOiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBkaXNxdWFsaWZpY2F0aW9uX3JlYXNvbl9yZXF1aXJlZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDkyXHUzMDBDXHU1QkZFXHU4QzYxXHU1OTE2XHUzMDBEXHUzMDZCXHUzMDU5XHUzMDhCXHU1ODM0XHU1NDA4XHUzMDZGXHU1OTMxXHU2ODNDXHU3NDA2XHU3NTMxXHUzMDRDXHU1RkM1XHU4OTgxXHUzMDY3XHUzMDU5JyxcbiAgICAgIH0sXG4gICAgICBkdXBsaWNhdGVfZGlzcXVhbGlmaWNhdGlvbl9yZXF1aXJlc19zdXJ2aXZvcjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU5MUNEXHU4OTA3XHUzMDkyXHU3NDA2XHU3NTMxXHUzMDZCXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDkyXHU1OTMxXHU2ODNDXHUzMDY4XHUzMDU5XHUzMDhCXHU1ODM0XHU1NDA4XHUzMDZGXHUzMDAxXHU2QjhCXHUzMDU5XHUzMEVDXHUzMEIzXHUzMEZDXHUzMEM5XHUzMDkyXHU2MzA3XHU1QjlBXHUzMDU3XHUzMDAxXHU5MUNEXHU4OTA3XHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHUzMDkyXHUzMDBDXHU3OEJBXHU4QThEXHU2RTA4XHUzMDdGXHUzMDBEXHUzMDZCXHUzMDU5XHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5JyxcbiAgICAgIH0sXG4gICAgICBlbWFpbF9yZXF1aXJlZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHUzMEUxXHUzMEZDXHUzMEVCXHUzMEEyXHUzMEM5XHUzMEVDXHUzMEI5XHUzMDZGXHU1RkM1XHU5ODA4XHUzMDY3XHUzMDU5JyxcbiAgICAgIH0sXG4gICAgICBsZWFkX3N0YXR1c19wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU3MTIxXHU1MkI5XHUzMDZBXHUzMEVBXHUzMEZDXHUzMEM5XHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHU5MDc3XHU3OUZCXHUzMDY3XHUzMDU5JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOScsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzknLFxuICAgIGRlc2NyaXB0aW9uOiAnXHUzMDdFXHUzMDYwXHU5MDY5XHU2ODNDXHU1MjI0XHU1QjlBXHUzMDkyXHU1M0Q3XHUzMDUxXHUzMDY2XHUzMDQ0XHUzMDZBXHUzMDQ0XHU4OThCXHU4RkJDXHUzMDdGXHU1QkEyJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIHNhbHV0YXRpb246IHsgbGFiZWw6ICdcdTY1NkNcdTc5RjAnLCBvcHRpb25zOiB7IC4uLnNhbHV0YXRpb25PcHRpb25zIH0gfSxcbiAgICAgIGZpcnN0X25hbWU6IHsgbGFiZWw6ICdcdTU0MEQnIH0sXG4gICAgICBsYXN0X25hbWU6IHsgbGFiZWw6ICdcdTU5RDMnIH0sXG4gICAgICBmdWxsX25hbWU6IHsgbGFiZWw6ICdcdTZDMEZcdTU0MEQnIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnXHU4ODY4XHU3OTNBXHU1NDBEJyB9LFxuICAgICAgY29tcGFueTogeyBsYWJlbDogJ1x1NEYxQVx1NzkzRVx1NTQwRCcgfSxcbiAgICAgIGNvbXBhbnlfbm9ybWFsaXplZDoge1xuICAgICAgICBsYWJlbDogJ1x1NEYxQVx1NzkzRVx1NTQwRFx1RkYwOFx1NkI2M1x1ODk4Rlx1NTMxNlx1RkYwOScsXG4gICAgICAgIGhlbHA6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTU5MDlcdTYzREJcdTMwNkVcdTcxNjdcdTU0MDhcdTMwQURcdTMwRkNcdTMwMDJcdTRGMUFcdTc5M0VcdTU0MERcdTMwOTJcdTVDMEZcdTY1ODdcdTVCNTdcdTUzMTZcdTMwNTdcdTMwMDFcdTUyNERcdTVGOENcdTMwNkVcdTdBN0FcdTc2N0RcdTMwOTJcdTk2NjRcdTUzQkJcdTMwNTdcdTMwNjZcdTMwMDFcdTUxODVcdTkwRThcdTMwNkVcdTkwMjNcdTdEOUFcdTMwNTlcdTMwOEJcdTdBN0FcdTc2N0RcdTMwOTIgMSBcdTMwNjRcdTMwNkJcdTMwN0VcdTMwNjhcdTMwODFcdTMwNUZcdTMwODJcdTMwNkVcdTMwMDJsZWFkX2R1cGxpY2F0ZV9jaGVjayBcdTMwRDVcdTMwQzNcdTMwQUZcdTMwNENcdTgxRUFcdTUyRDVcdTMwNjdcdTdEQURcdTYzMDFcdTMwNTdcdTMwN0VcdTMwNTkgXHUyMDE0IFx1NzZGNFx1NjNBNVx1N0RFOFx1OTZDNlx1MzA1N1x1MzA2QVx1MzA0NFx1MzA2N1x1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMicsXG4gICAgICB9LFxuICAgICAgdGl0bGU6IHsgbGFiZWw6ICdcdTVGNzlcdTgwNzcnIH0sXG4gICAgICBlbWFpbDogeyBsYWJlbDogJ1x1MzBFMVx1MzBGQ1x1MzBFQicgfSxcbiAgICAgIHBob25lOiB7IGxhYmVsOiAnXHU5NkZCXHU4QTcxJyB9LFxuICAgICAgaW5kdXN0cnk6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY5NkRcdTdBMkUnLFxuICAgICAgICBvcHRpb25zOiB7IC4uLmluZHVzdHJ5T3B0aW9ucyB9LFxuICAgICAgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBuZXc6ICdcdTY1QjBcdTg5OEYnLCBjb250YWN0ZWQ6ICdcdTMwQjNcdTMwRjNcdTMwQkZcdTMwQUZcdTMwQzhcdTZFMDhcdTMwN0YnLCBxdWFsaWZpZWQ6ICdcdTkwNjlcdTY4M0MnLFxuICAgICAgICAgIHVucXVhbGlmaWVkOiAnXHU0RTBEXHU5MDY5XHU2ODNDJywgY29udmVydGVkOiAnXHU1OTA5XHU2M0RCXHU2RTA4XHUzMDdGJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBsZWFkX3NvdXJjZTogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1MzBCRFx1MzBGQ1x1MzBCOScsIG9wdGlvbnM6IHsgLi4ubGVhZFNvdXJjZU9wdGlvbnMgfSB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTYyNDBcdTY3MDlcdTgwMDUnIH0sXG4gICAgICBpc19jb252ZXJ0ZWQ6IHsgbGFiZWw6ICdcdTU5MDlcdTYzREJcdTZFMDhcdTMwN0YnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ1x1OEFBQ1x1NjYwRScgfSxcbiAgICAgIG1vYmlsZTogeyBsYWJlbDogJ1x1NjQzQVx1NUUyRlx1OTZGQlx1OEE3MScgfSxcbiAgICAgIHdlYnNpdGU6IHsgbGFiZWw6ICdXZWJcdTMwQjVcdTMwQTRcdTMwQzgnIH0sXG4gICAgICByYXRpbmc6IHsgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwQjlcdTMwQjNcdTMwQTInLCBoZWxwOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDZFXHU1NEMxXHU4Q0VBXHUzMEI5XHUzMEIzXHUzMEEyXHVGRjA4MVx1MzAxQzUgXHU2QkI1XHU5NjhFXHVGRjA5JyB9LFxuICAgICAgY29udmVydGVkX2FjY291bnQ6IHsgbGFiZWw6ICdcdTU5MDlcdTYzREJcdTVGOENcdTMwNkVcdTUzRDZcdTVGMTVcdTUxNDgnIH0sXG4gICAgICBjb252ZXJ0ZWRfY29udGFjdDogeyBsYWJlbDogJ1x1NTkwOVx1NjNEQlx1NUY4Q1x1MzA2RVx1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNScgfSxcbiAgICAgIGNvbnZlcnRlZF9vcHBvcnR1bml0eTogeyBsYWJlbDogJ1x1NTkwOVx1NjNEQlx1NUY4Q1x1MzA2RVx1NTU0Nlx1OEFDNycgfSxcbiAgICAgIGNvbnZlcnRlZF9kYXRlOiB7IGxhYmVsOiAnXHU1OTA5XHU2M0RCXHU2NUU1JyB9LFxuICAgICAgYWRkcmVzczogeyBsYWJlbDogJ1x1NEY0Rlx1NjI0MCcgfSxcbiAgICAgIGFubnVhbF9yZXZlbnVlOiB7IGxhYmVsOiAnXHU1RTc0XHU5NTkzXHU1OEYyXHU0RTBBJyB9LFxuICAgICAgbnVtYmVyX29mX2VtcGxveWVlczogeyBsYWJlbDogJ1x1NUY5M1x1Njk2RFx1NTRFMVx1NjU3MCcgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHUzMEUxXHUzMEUyJywgaGVscDogJ1x1MzA1M1x1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2Qlx1OTVBMlx1MzA1OVx1MzA4Qlx1NEY1Q1x1Njk2RFx1MzBFMVx1MzBFMiBcdTIwMTQgXHU2NkY4XHU1RjBGXHU4QTJEXHU1QjlBXHUzMDZCXHU1QkZFXHU1RkRDXHUzMDAyJyB9LFxuICAgICAgZG9fbm90X2NhbGw6IHsgbGFiZWw6ICdcdTk2RkJcdThBNzFcdTYyRDJcdTU0MjYnIH0sXG4gICAgICBlbWFpbF9vcHRfb3V0OiB7IGxhYmVsOiAnXHUzMEUxXHUzMEZDXHUzMEVCXHU5MTREXHU0RkUxXHU1MDVDXHU2QjYyJyB9LFxuICAgICAgbmV4dF9mb2xsb3d1cF9kYXRlOiB7IGxhYmVsOiAnXHU2QjIxXHU1NkRFXHUzMEQ1XHUzMEE5XHUzMEVEXHUzMEZDXHUzMEEyXHUzMEMzXHUzMEQ3XHU2NUU1JyB9LFxuICAgICAgbGFzdF9jb250YWN0ZWRfZGF0ZTogeyBsYWJlbDogJ1x1NjcwMFx1N0Q0Mlx1NjNBNVx1ODlFNlx1NjVFNVx1NjY0MicgfSxcbiAgICAgIG5lZWRfdHlwZToge1xuICAgICAgICBsYWJlbDogJ1x1MzBDQlx1MzBGQ1x1MzBCQVx1N0EyRVx1NTIyNScsXG4gICAgICAgIGhlbHA6ICdcdTMwNTNcdTMwNkVcdTg5OEJcdThGQkNcdTVCQTJcdTMwNENcdTRGNTVcdTMwOTJcdTZDNDJcdTMwODFcdTMwNjZcdTMwNDRcdTMwOEJcdTMwNEJcdTMwMDJcdTUyNzJcdTMwOEFcdTVGNTNcdTMwNjZcdTMwRkJcdTUxMkFcdTUxNDhcdTk4MDZcdTRGNERcdTRFRDhcdTMwNTFcdTMwRkJcdTk3MDBcdTg5ODFcdTUyMDZcdTY3OTBcdTMwNENcdTMwNTNcdTMwNkVcdTk4MDVcdTc2RUVcdTMwOTJcdTUzQzJcdTcxNjdcdTMwNTdcdTMwN0VcdTMwNTlcdTMwMDInLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbmV3X2ltcGxlbWVudGF0aW9uOiAnXHU2NUIwXHU4OThGXHU1QzBFXHU1MTY1JywgZXhwYW5zaW9uOiAnXHU2MkUxXHU1RjM1XHUzMEZCXHU4RkZEXHU1MkEwJyxcbiAgICAgICAgICByZXBsYWNlbWVudDogJ1x1NTE2NVx1MzA4Q1x1NjZGRlx1MzA0OFx1MzBGQlx1NzlGQlx1ODg0QycsIHJlbmV3YWw6ICdcdTY2RjRcdTY1QjAnLCBjb25zdWx0aW5nOiAnXHUzMEIzXHUzMEYzXHUzMEI1XHUzMEVCXHUzMEM2XHUzMEEzXHUzMEYzXHUzMEIwJyxcbiAgICAgICAgICBzdXBwb3J0OiAnXHU0RkREXHU1Qjg4XHUzMEZCXHUzMEI1XHUzMEREXHUzMEZDXHUzMEM4Jywgb3RoZXI6ICdcdTMwNURcdTMwNkVcdTRFRDYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGVzdGltYXRlZF9hbW91bnQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTRFODhcdTYwRjNcdTkxRDFcdTk4NEQnLFxuICAgICAgICBoZWxwOiAnXHUzMEFGXHUzMEFBXHUzMEVBXHUzMEQ1XHUzMEEzXHUzMEIxXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzXHU1MjREXHUzMDZFXHU5NzAwXHU4OTgxXHU5MUQxXHU5ODREXHUzMDZFXHU4OThCXHU3QTREXHUzMDhBXHUzMDAyXHUzMEIzXHUzMEYzXHUzMEQwXHUzMEZDXHUzMEI4XHUzMEU3XHUzMEYzXHU2NjQyXHUzMDZCXHU1NTQ2XHU4QUM3XHU5MUQxXHU5ODREXHUzMDc4XHU1MjFEXHU2NzFGXHU1MDI0XHUzMDY4XHUzMDU3XHUzMDY2XHU1MTY1XHUzMDhBXHUzMDdFXHUzMDU5XHUzMDAyJyxcbiAgICAgIH0sXG4gICAgICBjb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1MzBCM1x1MzBGM1x1MzBEMFx1MzBGQ1x1MzBCOFx1MzBFN1x1MzBGM1x1NjI3Rlx1OEE4RCcsXG4gICAgICAgIGhlbHA6ICdcdTMwNTNcdTMwNkVcdTg5OEJcdThGQkNcdTVCQTJcdTMwNENcdTMwQjNcdTMwRjNcdTMwRDBcdTMwRkNcdTMwQjhcdTMwRTdcdTMwRjNcdTMwNkVcdTYyN0ZcdThBOERcdTMwOTJcdTVGOTdcdTMwNjZcdTMwNDRcdTMwOEJcdTMwNEJcdTMwMDJcdTMwMENcdTYyN0ZcdThBOERcdTRFMERcdTg5ODFcdTMwMERcdTMwNkZcdTYyN0ZcdThBOERcdTMwOTJcdTZDNDJcdTMwODFcdTMwNkFcdTMwNDRcdTcyQjZcdTYxNEJcdTMwNjdcdTMwMDFcdTUxRkFcdTgzNzdcdTY2NDJcdTMwNkVcdTY1RTJcdTVCOUFcdTUwMjRcdTMwNjdcdTMwNTlcdTMwMDInLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbm90X3JlcXVpcmVkOiAnXHU2MjdGXHU4QThEXHU0RTBEXHU4OTgxJywgcGVuZGluZzogJ1x1NjI3Rlx1OEE4RFx1NUY4NVx1MzA2MScsXG4gICAgICAgICAgYXBwcm92ZWQ6ICdcdTYyN0ZcdThBOERcdTZFMDhcdTMwN0YnLCByZWplY3RlZDogJ1x1NTM3NFx1NEUwQicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGlzcXVhbGlmaWNhdGlvbl9yZWFzb246IHtcbiAgICAgICAgbGFiZWw6ICdcdTRFMERcdTkwNjlcdTY4M0NcdTc0MDZcdTc1MzEnLFxuICAgICAgICBoZWxwOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHUzMDRDXHUzMDBDXHU0RTBEXHU5MDY5XHU2ODNDXHUzMDBEXHUzMDZFXHU1ODM0XHU1NDA4XHUzMDZGXHU1RkM1XHU5ODA4JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5vdF9hX2ZpdDogJ1x1MzBDQlx1MzBGQ1x1MzBCQVx1MzA0Q1x1NTQwOFx1MzA4Rlx1MzA2QVx1MzA0NCcsIG5vX2J1ZGdldDogJ1x1NEU4OFx1N0I5N1x1MzA2QVx1MzA1NycsIHdyb25nX3BlcnNvbmE6ICdcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNENcdTc1NzBcdTMwNkFcdTMwOEInLFxuICAgICAgICAgIHVucmVhY2hhYmxlOiAnXHU5MDIzXHU3RDYxXHU0RTBEXHU4MEZEJywgZHVwbGljYXRlOiAnXHU5MUNEXHU4OTA3XHUzMEVBXHUzMEZDXHUzMEM5JywgY29tcGV0aXRvcjogJ1x1N0FGNlx1NTQwOFx1NEVENlx1NzkzRVx1MzA2Qlx1NkM3QVx1NUI5QScsXG4gICAgICAgICAgb3RoZXI6ICdcdTMwNURcdTMwNkVcdTRFRDYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGR1cGxpY2F0ZV9vZl90eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU5MUNEXHU4OTA3XHU1QkZFXHU4QzYxJyxcbiAgICAgICAgaGVscDogJ1x1OTFDRFx1ODkwN1x1NTE0M1x1MzA2OFx1MzA1N1x1MzA2Nlx1NkI4Qlx1MzA4Qlx1MzBFQ1x1MzBCM1x1MzBGQ1x1MzBDOVx1MzA0Q1x1NUM1RVx1MzA1OVx1MzA4Qlx1MzBBQVx1MzBENlx1MzBCOFx1MzBBN1x1MzBBRlx1MzBDOFx1MzA2RVx1N0EyRVx1NTIyNVx1MzAwMicsXG4gICAgICAgIC8vIGBlcmFzZWRgIFx1MzA2Rlx1NTg5M1x1Nzg5MVx1NTAyNFx1MzA2N1x1MzA0Mlx1MzA4QVx1OTA3OFx1NjI5RVx1ODBBMlx1MzA2N1x1MzA2Rlx1MzA2QVx1MzA0NFx1MzAwMlx1MzBENVx1MzBBOVx1MzBGQ1x1MzBFMFx1MzA2Qlx1MzA2Rlx1ODg2OFx1NzkzQVx1MzA1N1x1MzA2QVx1MzA0NFxuICAgICAgICAvLyBcdUZGMDhgc3JjL3NhbGVzL3ZpZXdzL2xlYWQudmlldy50c2AgXHUzMDkyXHU1M0MyXHU3MTY3XHVGRjA5XHUzMDRDXHUzMDAxXHU2QjhCXHU1QjU4XHUzMEVDXHUzMEIzXHUzMEZDXHUzMEM5XHUzMDRDXHU1MjRBXHU5NjY0XHUzMDU1XHUzMDhDXHUzMDVGXG4gICAgICAgIC8vIFx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2Rlx1MzA1M1x1MzA2RVx1NTAyNFx1MzA5Mlx1NEZERFx1NjMwMVx1MzA1OVx1MzA4Qlx1MzA1Rlx1MzA4MVx1MzAwMVx1MzBFQ1x1MzBCM1x1MzBGQ1x1MzBDOVx1MzA5Mlx1OEFBRFx1MzA4MFx1NTgzNFx1NjI0MFx1MzA2N1x1MzA2Rlx1MzBFOVx1MzBEOVx1MzBFQlx1MzA0Q1x1ODk4MVx1MzA4Qlx1MzAwMlxuICAgICAgICBvcHRpb25zOiB7IGNybV9sZWFkOiAnXHUzMEVBXHUzMEZDXHUzMEM5JywgY3JtX2NvbnRhY3Q6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDUnLCBlcmFzZWQ6ICdcdTUyNEFcdTk2NjRcdTZFMDhcdTMwN0ZcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzknIH0sXG4gICAgICB9LFxuICAgICAgZHVwbGljYXRlX29mX2xlYWQ6IHsgbGFiZWw6ICdcdTkxQ0RcdTg5MDdcdTMwNTlcdTMwOEJcdTMwRUFcdTMwRkNcdTMwQzknIH0sXG4gICAgICBkdXBsaWNhdGVfb2ZfY29udGFjdDogeyBsYWJlbDogJ1x1OTFDRFx1ODkwN1x1MzA1OVx1MzA4Qlx1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNScgfSxcbiAgICAgIGR1cGxpY2F0ZV9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTkxQ0RcdTg5MDdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLFxuICAgICAgICBoZWxwOiAnXHUzMDBDXHU5MUNEXHU4OTA3XHUzMDZFXHU3NTkxXHUzMDQ0XHUzMDBEPSBcdTc2N0JcdTkzMzJcdTY2NDJcdTMwNkJcdTgxRUFcdTUyRDVcdTMwNjdcdTRFRDhcdTRFMEVcdTMwMDJcdTMwMENcdTkxQ0RcdTg5MDdcdTc4QkFcdTVCOUFcdTMwMEQ9IFx1NjJDNVx1NUY1M1x1ODAwNVx1MzA0Q1x1NEUwMFx1ODFGNFx1MzA5Mlx1NzhCQVx1OEE4RFx1NkUwOFx1MzA3Rlx1MzAwMicsXG4gICAgICAgIG9wdGlvbnM6IHsgc3VzcGVjdGVkOiAnXHU5MUNEXHU4OTA3XHUzMDZFXHU3NTkxXHUzMDQ0JywgY29uZmlybWVkOiAnXHU5MUNEXHU4OTA3XHU3OEJBXHU1QjlBJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2xlYWRzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1MTY4XHUzMEVBXHUzMEZDXHUzMEM5JyxcbiAgICAgICAgZW1wdHlTdGF0ZTogeyB0aXRsZTogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1MzA0Q1x1MzA3RVx1MzA2MFx1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1Qlx1MzA5MycsIG1lc3NhZ2U6ICdcdTY3MDBcdTUyMURcdTMwNkVcdTMwRUFcdTMwRkNcdTMwQzlcdTMwOTJcdTRGNUNcdTYyMTBcdTMwNTdcdTMwNjZcdTU5Q0JcdTMwODFcdTMwN0VcdTMwNTdcdTMwODdcdTMwNDYnIH0sXG4gICAgICB9LFxuICAgICAga2FuYmFuX2J5X3N0YXR1czogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycgfSxcbiAgICAgIGNhbGVuZGFyX2J5X2NyZWF0ZWQ6IHsgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwQUJcdTMwRUNcdTMwRjNcdTMwQzBcdTMwRkMnIH0sXG4gICAgICBnYWxsZXJ5X3ZpZXc6IHsgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwQUJcdTMwRkNcdTMwQzknIH0sXG4gICAgICBteV9sZWFkczogeyBsYWJlbDogJ1x1NzlDMVx1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOScgfSxcbiAgICAgIGhpZ2hfcHJpb3JpdHk6IHsgbGFiZWw6ICdcdTUxMkFcdTUxNDhcdTVFQTZcdTlBRDgnIH0sXG4gICAgICBob3RfbGVhZHM6IHsgbGFiZWw6ICdcdUQ4M0RcdUREMjUgXHUzMERCXHUzMEMzXHUzMEM4XHUzMEVBXHUzMEZDXHUzMEM5JyB9LFxuICAgICAgc3VzcGVjdGVkX2R1cGxpY2F0ZXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTkxQ0RcdTg5MDdcdTMwNkVcdTc1OTFcdTMwNDRcdTMwNENcdTMwNDJcdTMwOEJcdTMwRUFcdTMwRkNcdTMwQzknLFxuICAgICAgICBlbXB0eVN0YXRlOiB7XG4gICAgICAgICAgdGl0bGU6ICdcdTkxQ0RcdTg5MDdcdTMwNkVcdTc1OTFcdTMwNDRcdTMwNkZcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTMnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdcdTc4QkFcdThBOERcdTMwNkZcdTRFMERcdTg5ODFcdTMwNjdcdTMwNTkgXHUyMDE0IFx1NTE4RFx1NzY3Qlx1OTMzMlx1MzA1NVx1MzA4Q1x1MzA1Rlx1MzBFMVx1MzBGQ1x1MzBFQlx1MzBBMlx1MzBDOVx1MzBFQ1x1MzBCOVx1MzA2Rlx1MzA1OVx1MzA3OVx1MzA2Nlx1MzBDMVx1MzBBN1x1MzBDM1x1MzBBRlx1NkUwOFx1MzA3Rlx1MzA2N1x1MzA1OVx1MzAwMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICAvLyBcdTMwQUFcdTMwRDZcdTMwQjhcdTMwQTdcdTMwQUZcdTMwQzhcdTVCOUFcdTdGQTlcdTMwNkVcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTMwQURcdTMwRkNcdUZGMDhsZWFkLm9iamVjdC50c1x1RkYwOVx1MjAxNCBcdTUxNjVcdTUyOUJcdTMwRDVcdTMwQTlcdTMwRkNcdTMwRTBcdTMwNjhcdTMwMDFcbiAgICAgIC8vIFx1MzA1M1x1MzA4Q1x1MzA4OVx1MzA2RVx1MzBCMFx1MzBFQlx1MzBGQ1x1MzBEN1x1MzA5Mlx1NTNDMlx1NzE2N1x1MzA1OVx1MzA4Qlx1OEE3M1x1N0QzMFx1MzBEQVx1MzBGQ1x1MzBCOFx1MzA2RVx1MzBCQlx1MzBBRlx1MzBCN1x1MzBFN1x1MzBGM1x1RkYwOCM4MDZcdUZGMDlcdTMwNjdcdTRGN0ZcdTc1MjhcbiAgICAgIGFkZHJlc3M6IHsgbGFiZWw6ICdcdTRGNEZcdTYyNDAnIH0sXG4gICAgICBpZGVudGl0eTogeyBsYWJlbDogJ1x1NTdGQVx1NjcyQ1x1NjBDNVx1NTgzMScgfSxcbiAgICAgIGNvbXBhbnlfaW5mbzogeyBsYWJlbDogJ1x1NEYxQVx1NzkzRVx1NjBDNVx1NTgzMScgfSxcbiAgICAgIGNvbnRhY3RfaW5mbzogeyBsYWJlbDogJ1x1OTAyM1x1N0Q2MVx1NTE0OFx1NjBDNVx1NTgzMScgfSxcbiAgICAgIHF1YWxpZmljYXRpb246IHsgbGFiZWw6ICdcdTkwNjlcdTY4M0NcdTUyMjRcdTVCOUEnIH0sXG4gICAgICBhc3NpZ25tZW50OiB7IGxhYmVsOiAnXHU2MkM1XHU1RjUzXHU4MDA1JyB9LFxuICAgICAgYWRkaXRpb25hbDogeyBsYWJlbDogJ1x1MzA1RFx1MzA2RVx1NEVENlx1MzA2RVx1NjBDNVx1NTgzMScgfSxcbiAgICAgIHByZWZlcmVuY2VzOiB7IGxhYmVsOiAnXHUzMEIzXHUzMERGXHUzMEU1XHUzMENCXHUzMEIxXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzXHU4QTJEXHU1QjlBJyB9LFxuICAgICAgY29udmVyc2lvbjogeyBsYWJlbDogJ1x1NTkwOVx1NjNEQicgfSxcbiAgICAgIGR1cGxpY2F0ZXM6IHsgbGFiZWw6ICdcdTkxQ0RcdTg5MDdcdTdCQTFcdTc0MDYnIH0sXG4gICAgICAvLyBsZWFkLnZpZXcudHMgXHUzMDZFXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEUwXHUzMEJCXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHU1NDBEICgjMTEwMCkgXHUyMDE0IFx1MzBDN1x1MzBENVx1MzBBOVx1MzBFQlx1MzBDOFx1MzBENVx1MzBBOVx1MzBGQ1x1MzBFMFx1MzA2OFxuICAgICAgLy8gXHU1NDBEXHU1MjREXHU0RUQ4XHUzMDREIGZvcm1WaWV3IFx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2RVx1MzBCQlx1MzBBRlx1MzBCN1x1MzBFN1x1MzBGM1x1NTQwRFx1MzA0Q1x1MzA1M1x1MzA1M1x1MzA2Qlx1OTZDNlx1MzA3RVx1MzA4Qlx1MzAwMlx1MzA0Mlx1MzA2MVx1MzA4OVx1MzA2Qlx1MzBENVx1MzBBOVx1MzBGQ1x1MzBFMFx1MzA5MlxuICAgICAgLy8gXHU4RkZEXHU1MkEwXHUzMDU3XHUzMDVGXHUzMDg5XHUzMDAxXHUzMDVEXHUzMDZFXHUzMEJCXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHU1NDBEXHUzMDkyXHUzMDUzXHUzMDUzXHUzMDZCXHU4RkZEXHU1MkEwXHUzMDU5XHUzMDhCXHUzMDAyXG4gICAgICBjb250YWN0X2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnXHU5MDIzXHU3RDYxXHU1MTQ4XHU2MEM1XHU1ODMxJyB9LFxuICAgICAgbGVhZF9jbGFzc2lmaWNhdGlvbjogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1NTIwNlx1OTg1RScgfSxcbiAgICAgIGNvbXBhbnlfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdcdTRGMUFcdTc5M0VcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBhZGRpdGlvbmFsX2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnXHU4RkZEXHU1MkEwXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgcHJpdmFjeTogeyBsYWJlbDogJ1x1MzBEN1x1MzBFOVx1MzBBNFx1MzBEMFx1MzBCN1x1MzBGQycgfSxcbiAgICAgIGdlbmVyYWw6IHsgbGFiZWw6ICdcdTRFMDBcdTgyMkMnIH0sXG4gICAgICBkZXRhaWxzOiB7IGxhYmVsOiAnXHU4QTczXHU3RDMwJyB9LFxuICAgICAgc3RlcF8xX2NvbnRhY3RfZGV0YWlsczogeyBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBDM1x1MzBENzFcdUZGMUFcdTkwMjNcdTdENjFcdTUxNDhcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBzdGVwXzJfY29tcGFueV9pbmZvcm1hdGlvbjogeyBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBDM1x1MzBENzJcdUZGMUFcdTRGMUFcdTc5M0VcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBzdGVwXzNfcXVhbGlmaWNhdGlvbjogeyBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBDM1x1MzBENzNcdUZGMUFcdThDQzdcdTY4M0NcdThBNTVcdTRGQTEnIH0sXG4gICAgICBzdGVwXzRfcmV2aWV3X2FuZF9jb252ZXJ0OiB7IGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEMzXHUzMEQ3NFx1RkYxQVx1NzhCQVx1OEE4RFx1MzA2OFx1NTkwOVx1NjNEQicgfSxcbiAgICAgIHByaW1hcnlfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdcdTRFM0JcdTg5ODFcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBleHRlbmRlZF9kZXRhaWxzOiB7IGxhYmVsOiAnXHU4QTczXHU3RDMwXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgcXVpY2tfZWRpdDogeyBsYWJlbDogJ1x1MzBBRlx1MzBBNFx1MzBDM1x1MzBBRlx1N0RFOFx1OTZDNicgfSxcbiAgICAgIHVwZGF0ZV9sZWFkX3N0YXR1czogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOVx1MzA5Mlx1NjZGNFx1NjVCMCcgfSxcbiAgICAgIHRlbGxfdXNfYWJvdXRfeW91cnNlbGY6IHsgbGFiZWw6ICdcdTMwNDJcdTMwNkFcdTMwNUZcdTMwNkJcdTMwNjRcdTMwNDRcdTMwNjZcdTY1NTlcdTMwNDhcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQnIH0sXG4gICAgICBhYm91dF95b3VyX2NvbXBhbnk6IHsgbGFiZWw6ICdcdThDQjRcdTc5M0VcdTMwNkJcdTMwNjRcdTMwNDRcdTMwNjYnIH0sXG4gICAgICBob3dfY2FuX3dlX2hlbHA6IHsgbGFiZWw6ICdcdTMwNjlcdTMwNkVcdTMwODhcdTMwNDZcdTMwNkFcdTMwNTRcdTc1MjhcdTRFRjZcdTMwNjdcdTMwNTdcdTMwODdcdTMwNDZcdTMwNEJcdUZGMUYnIH0sXG4gICAgICBsZWFkX2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU2MEM1XHU1ODMxJyB9LFxuICAgICAgYWRkcmVzc19pbmZvcm1hdGlvbjogeyBsYWJlbDogJ1x1NEY0Rlx1NjI0MFx1NjBDNVx1NTgzMScgfSxcbiAgICAgIHByaXZhY3lfcHJlZmVyZW5jZXM6IHsgbGFiZWw6ICdcdTMwRDdcdTMwRTlcdTMwQTRcdTMwRDBcdTMwQjdcdTMwRkNcdThBMkRcdTVCOUEnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgY29udmVydF9sZWFkOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU1OTA5XHU2M0RCJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkVcdTU5MDlcdTYzREJcdTMwNkJcdTYyMTBcdTUyOUZcdTMwNTdcdTMwN0VcdTMwNTdcdTMwNUZcdUZGMDEnLFxuICAgICAgfSxcbiAgICAgIGNyZWF0ZV9jYW1wYWlnbjoge1xuICAgICAgICBsYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzA2Qlx1OEZGRFx1NTJBMCcsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHUzMDZCXHU4RkZEXHU1MkEwXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHVGRjAxJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzJyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNjaGVkdWxlX2ZvbGxvd3VwOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEQ1XHUzMEE5XHUzMEVEXHUzMEZDXHUzMEEyXHUzMEMzXHUzMEQ3XHUzMDkyXHU4QTJEXHU1QjlBJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTMwRDVcdTMwQTlcdTMwRURcdTMwRkNcdTMwQTJcdTMwQzNcdTMwRDdcdTMwOTJcdThBMkRcdTVCOUFcdTMwNTdcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDInLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fb3Bwb3J0dW5pdHk6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGFtb3VudF9wb3NpdGl2ZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU5MUQxXHU5ODREXHUzMDZGIDAgXHUzMDg4XHUzMDhBXHU1OTI3XHUzMDREXHUzMDQ0XHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5JyxcbiAgICAgIH0sXG4gICAgICBjbG9zZV9kYXRlX2Z1dHVyZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU1NTQ2XHU4QUM3XHUzMDRDXHUzMEFGXHUzMEVEXHUzMEZDXHUzMEJBXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhCXHU1ODM0XHU1NDA4XHUzMDkyXHU5NjY0XHUzMDREXHUzMDAxXHU1QjhDXHU0RTg2XHU0RTg4XHU1QjlBXHU2NUU1XHUzMDkyXHU5MDRFXHU1M0JCXHUzMDZCXHU4QTJEXHU1QjlBXHUzMDU5XHUzMDhCXHUzMDUzXHUzMDY4XHUzMDZGXHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzJyxcbiAgICAgIH0sXG4gICAgICBvcHBvcnR1bml0eV9zdGFnZV9wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU3MTIxXHU1MkI5XHUzMDZBXHU1NTQ2XHU4QUM3XHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4XHU5MDc3XHU3OUZCXHUzMDY3XHUzMDU5JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NTU0Nlx1OEFDNycsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTU1NDZcdThBQzcnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHU0RTBBXHUzMDZFXHU1NTQ2XHU4QUM3XHUzMEZCXHU2ODQ4XHU0RUY2JyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdcdTU1NDZcdThBQzdcdTU0MEQnIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OCcgfSxcbiAgICAgIHByaW1hcnlfY29udGFjdDogeyBsYWJlbDogJ1x1NEUzQlx1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHU2MjQwXHU2NzA5XHU4MDA1JyB9LFxuICAgICAgYW1vdW50OiB7IGxhYmVsOiAnXHU5MUQxXHU5ODREJyB9LFxuICAgICAgZXhwZWN0ZWRfcmV2ZW51ZTogeyBsYWJlbDogJ1x1NjcxRlx1NUY4NVx1NTNDRVx1NzZDQScgfSxcbiAgICAgIHN0YWdlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4JyxcbiAgICAgICAgb3B0aW9uczogeyAuLi5vcHBvcnR1bml0eVN0YWdlT3B0aW9ucyB9LFxuICAgICAgfSxcbiAgICAgIHByb2JhYmlsaXR5OiB7IGxhYmVsOiAnXHU3OEJBXHU1RUE2ICglKScgfSxcbiAgICAgIGNsb3NlX2RhdGU6IHsgbGFiZWw6ICdcdTVCOENcdTRFODZcdTRFODhcdTVCOUFcdTY1RTUnIH0sXG4gICAgICB0eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEJGXHUzMEE0XHUzMEQ3JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ld19idXNpbmVzczogJ1x1NjVCMFx1ODk4Rlx1MzBEM1x1MzBCOFx1MzBDRFx1MzBCOScsXG4gICAgICAgICAgZXhpc3RpbmdfdXBncmFkZTogJ1x1NjVFMlx1NUI1OFx1OTg2N1x1NUJBMiAtIFx1MzBBMlx1MzBDM1x1MzBEN1x1MzBCMFx1MzBFQ1x1MzBGQ1x1MzBDOScsXG4gICAgICAgICAgZXhpc3RpbmdfcmVuZXdhbDogJ1x1NjVFMlx1NUI1OFx1OTg2N1x1NUJBMiAtIFx1NjZGNFx1NjVCMCcsXG4gICAgICAgICAgZXhpc3RpbmdfZXhwYW5zaW9uOiAnXHU2NUUyXHU1QjU4XHU5ODY3XHU1QkEyIC0gXHU2MkUxXHU1OTI3JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ1x1NThGMlx1NEUwQVx1NEU4OFx1NkUyQ1x1MzBBQlx1MzBDNlx1MzBCNFx1MzBFQScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwaXBlbGluZTogJ1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycsIGJlc3RfY2FzZTogJ1x1MzBEOVx1MzBCOVx1MzBDOFx1MzBCMVx1MzBGQ1x1MzBCOScsXG4gICAgICAgICAgY29tbWl0OiAnXHUzMEIzXHUzMERGXHUzMEMzXHUzMEM4Jywgb21pdHRlZDogJ1x1OTY2NFx1NTkxNicsIGNsb3NlZDogJ1x1NUI4Q1x1NEU4NicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdThBQUNcdTY2MEUnIH0sXG4gICAgICBuZXh0X3N0ZXA6IHsgbGFiZWw6ICdcdTZCMjFcdTMwNkVcdTMwQjlcdTMwQzZcdTMwQzNcdTMwRDcnIH0sXG4gICAgICBsZWFkX3NvdXJjZTogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1MzBCRFx1MzBGQ1x1MzBCOScsIG9wdGlvbnM6IHsgLi4ubGVhZFNvdXJjZU9wdGlvbnMgfSB9LFxuICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzJywgaGVscDogJ1x1MzA1M1x1MzA2RVx1NTU0Nlx1OEFDN1x1MzA5Mlx1NzUxRlx1MzA3Rlx1NTFGQVx1MzA1N1x1MzA1Rlx1MzBERVx1MzBGQ1x1MzBCMVx1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMFx1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGMycgfSxcbiAgICAgIGRheXNfaW5fc3RhZ2U6IHsgbGFiZWw6ICdcdTczRkVcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjhcdTZFREVcdTU3MjhcdTY1RTVcdTY1NzAnIH0sXG4gICAgICBzdGFnZV9lbnRyeV9kYXRlOiB7IGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4XHU5NThCXHU1OUNCXHU2NUU1JywgaGVscDogJ1x1MzA1M1x1MzA2RVx1NTU0Nlx1OEFDN1x1MzA0Q1x1NzNGRVx1NTcyOFx1MzA2RVx1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCOFx1MzA2Qlx1NTE2NVx1MzA2M1x1MzA1Rlx1NjVFNVx1MzAwMicgfSxcbiAgICAgIGlzX3ByaXZhdGU6IHsgbGFiZWw6ICdcdTk3NUVcdTUxNkNcdTk1OEInIH0sXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTYyN0ZcdThBOERcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLFxuICAgICAgICBvcHRpb25zOiB7IG5vdF9yZXF1aXJlZDogJ1x1NjI3Rlx1OEE4RFx1NEUwRFx1ODk4MScsIHBlbmRpbmc6ICdcdTYyN0ZcdThBOERcdTVGODVcdTMwNjEnLCBhcHByb3ZlZDogJ1x1NjI3Rlx1OEE4RFx1NkUwOFx1MzA3RicsIHJlamVjdGVkOiAnXHU1Mzc0XHU0RTBCJyB9LFxuICAgICAgfSxcbiAgICAgIGFwcHJvdmVkX2RhdGU6IHsgbGFiZWw6ICdcdTYyN0ZcdThBOERcdTY1RTUnIH0sXG4gICAgICAvLyAjNTkzIFx1MjAxNCBcdTU1NDZcdThBQzdcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTY2NDJcdTMwNkJcdTVGQzVcdTk4MDhcdTMwMDJcdTU5MzFcdTZDRThcdTc0MDZcdTc1MzFcdTMwNkZcdTU1QjZcdTY5NkRcdTMwQzBcdTMwQzNcdTMwQjdcdTMwRTVcdTMwRENcdTMwRkNcdTMwQzlcdTMwNkVcbiAgICAgIC8vIFx1NTE4NVx1OEEzM1x1MzBBNlx1MzBBM1x1MzBCOFx1MzBBN1x1MzBDM1x1MzBDOFx1MzA2Qlx1MzA4Mlx1NTFGQVx1MzA4Qlx1MzA1Rlx1MzA4MVx1MzAwMVx1NEZERFx1NUI1OFx1NTAyNFx1MzA0Q1x1MzA1RFx1MzA2RVx1MzA3RVx1MzA3RVx1NzUzQlx1OTc2Mlx1MzA2Qlx1NTFGQVx1MzA2Nlx1MzA2Rlx1MzA0NFx1MzA1MVx1MzA2QVx1MzA0NFx1MzAwMlxuICAgICAgd2luX3JlYXNvbjoge1xuICAgICAgICBsYWJlbDogJ1x1NTNEN1x1NkNFOFx1NzQwNlx1NzUzMScsXG4gICAgICAgIGhlbHA6ICdcdTUzRDdcdTZDRThcdTMwNkJcdTgxRjNcdTMwNjNcdTMwNUZcdTc0MDZcdTc1MzFcdTMwMDJcdTU1NDZcdThBQzdcdTMwOTJcdTMwMENcdTYyMTBcdTdBQ0JcdTMwMERcdTMwNjdcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTMwNTlcdTMwOEJcdTk2OUJcdTMwNkJcdTVGQzVcdTk4MDhcdTMwNjdcdTMwNTlcdTMwMDInLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYmV0dGVyX3Byb2R1Y3Q6ICdcdTg4RkRcdTU0QzFcdTMwNENcdTUxMkFcdTMwOENcdTMwNjZcdTMwNDRcdTMwOEInLCBiZXR0ZXJfcHJpY2U6ICdcdTRGQTFcdTY4M0NcdTMwNENcdTUxMkFcdTMwOENcdTMwNjZcdTMwNDRcdTMwOEInLFxuICAgICAgICAgIHJlbGF0aW9uc2hpcDogJ1x1NjVFMlx1NUI1OFx1MzA2RVx1OTVBMlx1NEZDMicsIGJldHRlcl9zdXBwb3J0OiAnXHUzMEI1XHUzMEREXHUzMEZDXHUzMEM4XHUzMDRDXHU1MTJBXHUzMDhDXHUzMDY2XHUzMDQ0XHUzMDhCJyxcbiAgICAgICAgICBiZXN0X2ZpdDogJ1x1NjcwMFx1OTA2OVx1MzA2QVx1NkE1Rlx1ODBGRFx1MzBGQlx1OTA2OVx1NTQwOFx1NjAyNycsXG4gICAgICAgICAgcXVvdGVfYWNjZXB0ZWQ6ICdcdTg5OEJcdTdBNERcdTYyN0ZcdThBOEQnLCBvdGhlcjogJ1x1MzA1RFx1MzA2RVx1NEVENicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbG9zc19yZWFzb246IHtcbiAgICAgICAgbGFiZWw6ICdcdTU5MzFcdTZDRThcdTc0MDZcdTc1MzEnLFxuICAgICAgICBoZWxwOiAnXHU1OTMxXHU2Q0U4XHUzMDU3XHUzMDVGXHU3NDA2XHU3NTMxXHUzMDAyXHU1NTQ2XHU4QUM3XHUzMDkyXHUzMDBDXHU0RTBEXHU2MjEwXHU3QUNCXHUzMDBEXHUzMDY3XHUzMEFGXHUzMEVEXHUzMEZDXHUzMEJBXHUzMDU5XHUzMDhCXHU5NjlCXHUzMDZCXHU1RkM1XHU5ODA4XHUzMDY3XHUzMDU5XHUzMDAyJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHByaWNlOiAnXHU0RkExXHU2ODNDXHUzMDRDXHU5QUQ4XHUzMDU5XHUzMDRFXHUzMDhCJywgY29tcGV0aXRvcjogJ1x1N0FGNlx1NTQwOFx1NEVENlx1NzkzRVx1MzA2Qlx1NjU1N1x1NTMxNycsXG4gICAgICAgICAgbm9fYnVkZ2V0OiAnXHU0RTg4XHU3Qjk3XHUzMDZBXHUzMDU3Jywgbm9fZGVjaXNpb246ICdcdTYxMEZcdTYwMURcdTZDN0FcdTVCOUFcdTMwNkFcdTMwNTcnLFxuICAgICAgICAgIHRpbWluZzogJ1x1MzBCRlx1MzBBNFx1MzBERlx1MzBGM1x1MzBCMFx1NEUwRFx1OTA2OScsIGZlYXR1cmVzOiAnXHU2QTVGXHU4MEZEXHU0RTBEXHU4REIzJywgb3RoZXI6ICdcdTMwNURcdTMwNkVcdTRFRDYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxvc3NfZGV0YWlsczogeyBsYWJlbDogJ1x1NTNEN1x1NkNFOFx1MzBGQlx1NTkzMVx1NkNFOFx1MzA2RVx1OEE3M1x1N0QzMCcsIGhlbHA6ICdcdTUzRDdcdTZDRThcdTMwRkJcdTU5MzFcdTZDRThcdTc0MDZcdTc1MzFcdTMwNkVcdTg4RENcdThEQjNcdThBQUNcdTY2MEVcdUZGMDhcdTgxRUFcdTc1MzFcdThBMThcdThGRjBcdUZGMDlcdTMwMDInIH0sXG4gICAgICAvLyBSRVEtMDAwNiBcdTIwMTQgXHU5MDY5XHU2ODNDXHU1MjI0XHU1QjlBXHUzMDAxXHU5ODY3XHU1QkEyXHU1MDc0XHUzMDZFXHU4QUJGXHU5MDU0XHUzMEI5XHUzMEIxXHUzMEI4XHUzMEU1XHUzMEZDXHUzMEVCXHUzMDAxXHU1NTQ2XHU4QUM3XHUzMDZFXHU3RDRDXHU3REVGXHUzMDAxXHU0RThCXHU2OTZEXHU1MzNBXHU1MjA2XHUzMDAxXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHU1OTA5XHU2NkY0XHU2MjdGXHU4QThEXHUzMDAyXG4gICAgICB3aWxsX2JpZDogeyBsYWJlbDogJ1x1NTE2NVx1NjcyRFx1NEU4OFx1NUI5QScsIGhlbHA6ICdcdTUxNjVcdTY3MkRcdTMwNTlcdTMwOEJcdTYxMEZcdTU0MTFcdTMwNENcdTMwNDJcdTMwOEJcdTMwNEJcdTMwNjlcdTMwNDZcdTMwNEJcdTMwMDJcdTY3MkFcdThBMkRcdTVCOUFcdTMwNkZcdTUyMjRcdTY1QURcdTMwNENcdTRGRERcdTc1NTlcdTRFMkRcdTMwNjdcdTMwNDJcdTMwOEJcdTMwNTNcdTMwNjhcdTMwOTJcdTc5M0FcdTMwNTdcdTMwN0VcdTMwNTlcdTMwMDInIH0sXG4gICAgICBjb250cm9sbGFiaWxpdHk6IHsgbGFiZWw6ICdcdTMwQjNcdTMwRjNcdTMwQzhcdTMwRURcdTMwRkNcdTMwRUJcdTVFQTYnLCBvcHRpb25zOiB7IGhpZ2g6ICdcdTlBRDgnLCBtZWRpdW06ICdcdTRFMkQnLCBsb3c6ICdcdTRGNEUnIH0gfSxcbiAgICAgIHByaW9yaXR5OiB7IGxhYmVsOiAnXHU1MTJBXHU1MTQ4XHU1RUE2Jywgb3B0aW9uczogeyBoaWdoOiAnXHU5QUQ4JywgbWVkaXVtOiAnXHU0RTJEJywgbG93OiAnXHU0RjRFJyB9IH0sXG4gICAgICBkZWFsX2xldmVsOiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHUzMEU5XHUzMEYzXHUzMEFGJywgb3B0aW9uczogeyBzdHJhdGVnaWM6ICdcdTYyMjZcdTc1NjUnLCBrZXk6ICdcdTkxQ0RcdTcwQjknLCBzdGFuZGFyZDogJ1x1NkExOVx1NkU5NicgfSB9LFxuICAgICAgaXNfc3ViY29udHJhY3RlZDogeyBsYWJlbDogJ1x1NTkxNlx1NkNFOFx1MzA0Mlx1MzA4QScgfSxcbiAgICAgIHN1YmNvbnRyYWN0aW5nX25vdGU6IHsgbGFiZWw6ICdcdTU5MTZcdTZDRThcdTMwRTFcdTMwRTInIH0sXG4gICAgICBjdXN0b21lcl9pbml0aWF0aW9uX2RhdGU6IHsgbGFiZWw6ICdcdTk4NjdcdTVCQTJcdTMwNkVcdTY4NDhcdTRFRjZcdTUzMTZcdTY1RTUnIH0sXG4gICAgICBleHBlY3RlZF90ZW5kZXJfZGF0ZTogeyBsYWJlbDogJ1x1NTE2NVx1NjcyRFx1NEU4OFx1NUI5QVx1NjVFNScgfSxcbiAgICAgIGV4cGVjdGVkX3NpZ25pbmdfZGF0ZTogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1N0RFMFx1N0Q1MFx1NEU4OFx1NUI5QVx1NjVFNScgfSxcbiAgICAgIGV4cGVjdGVkX3RlbmRlcl9hbW91bnQ6IHsgbGFiZWw6ICdcdTUxNjVcdTY3MkRcdTRFODhcdTVCOUFcdTkxRDFcdTk4NEQnIH0sXG4gICAgICBleHBlY3RlZF9zaWduaW5nX2Ftb3VudDogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1NEU4OFx1NUI5QVx1OTFEMVx1OTg0RCcgfSxcbiAgICAgIGJ1c2luZXNzX2xpbmU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTRFOEJcdTY5NkRcdTUzM0FcdTUyMDYnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcHJvZHVjdDogJ1x1ODhGRFx1NTRDMScsIHNlcnZpY2VzOiAnXHUzMEQ3XHUzMEVEXHUzMEQ1XHUzMEE3XHUzMEMzXHUzMEI3XHUzMEU3XHUzMENBXHUzMEVCXHUzMEI1XHUzMEZDXHUzMEQzXHUzMEI5JywgY29uc3VsdGluZzogJ1x1MzBCM1x1MzBGM1x1MzBCNVx1MzBFQlx1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMCcsXG4gICAgICAgICAgc3VwcG9ydDogJ1x1NEZERFx1NUI4OFx1MzBGQlx1MzBCNVx1MzBERFx1MzBGQ1x1MzBDOCcsIG90aGVyOiAnXHUzMDVEXHUzMDZFXHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjdXN0b21lcl9iYWNrZ3JvdW5kOiB7IGxhYmVsOiAnXHU5ODY3XHU1QkEyXHU2OTgyXHU4OTgxJyB9LFxuICAgICAgcHJvamVjdF9iYWNrZ3JvdW5kOiB7IGxhYmVsOiAnXHUzMEQ3XHUzMEVEXHUzMEI4XHUzMEE3XHUzMEFGXHUzMEM4XHU4MENDXHU2NjZGJyB9LFxuICAgICAgcmlza19hbmFseXNpczogeyBsYWJlbDogJ1x1MzBFQVx1MzBCOVx1MzBBRlx1NTIwNlx1Njc5MCcgfSxcbiAgICAgIHBheW1lbnRfdGVybXM6IHsgbGFiZWw6ICdcdTY1MkZcdTYyNTVcdTY3NjFcdTRFRjYnIH0sXG4gICAgICByZXF1ZXN0ZWRfc3RhdHVzOiB7IGxhYmVsOiAnXHU3NTMzXHU4QUNCXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5Jywgb3B0aW9uczogeyBjbG9zZWRfd29uOiAnXHU1M0Q3XHU2Q0U4JywgY2xvc2VkX2xvc3Q6ICdcdTU5MzFcdTZDRTgnIH0gfSxcbiAgICAgIHN0YXR1c19jaGFuZ2VfYXBwcm92YWxfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHU1OTA5XHU2NkY0XHU2MjdGXHU4QThEJyxcbiAgICAgICAgb3B0aW9uczogeyBub3RfcmVxdWlyZWQ6ICdcdTYyN0ZcdThBOERcdTRFMERcdTg5ODEnLCBwZW5kaW5nOiAnXHU2MjdGXHU4QThEXHU1Rjg1XHUzMDYxJywgYXBwcm92ZWQ6ICdcdTYyN0ZcdThBOERcdTZFMDhcdTMwN0YnLCByZWplY3RlZDogJ1x1NTM3NFx1NEUwQicgfSxcbiAgICAgIH0sXG4gICAgICAvLyBSRVEtMDAwNiBcdTMwQjlcdTMwQzZcdTMwQzNcdTMwRDcgMTEgXHUyMDE0IFx1Njg0OFx1NEVGNlx1NTMxNlx1RkYwOFx1N0FDQlx1OTg3OVx1RkYwOVx1NjI3Rlx1OEE4RFx1MzAwMlxuICAgICAgcXVhbGlmaWNhdGlvbl9yZXF1ZXN0ZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY4NDhcdTRFRjZcdTUzMTZcdTYyN0ZcdThBOERcdTMwOTJcdTc1MzNcdThBQ0InLFxuICAgICAgICBoZWxwOiAnXHUzMEMxXHUzMEE3XHUzMEMzXHUzMEFGXHUzMDU5XHUzMDhCXHUzMDY4XHUzMDUzXHUzMDZFXHU1NTQ2XHU4QUM3XHUzMDkyXHU2ODQ4XHU0RUY2XHU1MzE2XHU2MjdGXHU4QThEXHUzMDZCXHU1NkRFXHUzMDU3XHUzMDdFXHUzMDU5XHUzMDAyXHU1Mzc0XHU0RTBCXHUzMDU1XHUzMDhDXHUzMDhCXHUzMDY4XHUzMEMxXHUzMEE3XHUzMEMzXHUzMEFGXHUzMDRDXHU1OTE2XHUzMDhDXHUzMDdFXHUzMDU5XHUzMDAyXHU1MThEXHU1RUE2XHUzMEMxXHUzMEE3XHUzMEMzXHUzMEFGXHUzMDU5XHUzMDhCXHUzMDY4XHU2NTM5XHUzMDgxXHUzMDY2XHU3NTMzXHU4QUNCXHUzMDY3XHUzMDREXHUzMDdFXHUzMDU5XHUzMDAyJyxcbiAgICAgIH0sXG4gICAgICBxdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1Njg0OFx1NEVGNlx1NTMxNlx1NjI3Rlx1OEE4RCcsXG4gICAgICAgIG9wdGlvbnM6IHsgbm90X3JlcXVpcmVkOiAnXHU2MjdGXHU4QThEXHU0RTBEXHU4OTgxJywgcGVuZGluZzogJ1x1NjI3Rlx1OEE4RFx1NUY4NVx1MzA2MScsIGFwcHJvdmVkOiAnXHU2MjdGXHU4QThEXHU2RTA4XHUzMDdGJywgcmVqZWN0ZWQ6ICdcdTUzNzRcdTRFMEInIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICB0ZW5kZXJfdGhpc19xdWFydGVyOiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHUzMDZCXHU1MTY1XHU2NzJEXHU0RTg4XHU1QjlBJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHUzMDZCXHU1MTY1XHU2NzJEXHU0RTg4XHU1QjlBXHUzMDZFXHU1NTQ2XHU4QUM3XHUzMDZGXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzJyxcbiAgICAgICAgICBtZXNzYWdlOiAnXHUzMDUzXHUzMDZFXHUzMEJGXHUzMEQ2XHUzMDZCXHUzMDZGXHUzMDAxXHU5ODY3XHU1QkEyXHU1MDc0XHUzMDZFXHU1MTY1XHU2NzJEXHU0RTg4XHU1QjlBXHU2NUU1XHUzMDRDXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHU1MTg1XHUzMDZCXHUzMDQyXHUzMDhCXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHU1NTQ2XHU4QUM3XHUzMDRDXHU4ODY4XHU3OTNBXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU5XHUzMDAyXHU1NTQ2XHU4QUM3XHUzMDZCXHUzMDBDXHU1MTY1XHU2NzJEXHU0RTg4XHU1QjlBXHU2NUU1XHUzMDBEXHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU5XHUzMDhCXHUzMDY4XHUzMDAxXHUzMDUzXHUzMDUzXHUzMDZCXHU4ODY4XHU3OTNBXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU5XHUzMDAyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvcGVuX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdcdTkwMzJcdTg4NENcdTRFMkRcdTMwNkVcdTU1NDZcdThBQzcnIH0sXG4gICAgICBhbGxfb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ1x1NTE2OFx1NTU0Nlx1OEFDNycgfSxcbiAgICAgIHBpcGVsaW5lX2thbmJhbjogeyBsYWJlbDogJ1x1MzBCQlx1MzBGQ1x1MzBFQlx1MzBCOVx1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycgfSxcbiAgICAgIGNsb3NlX2RhdGVfY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTRFODhcdTZFMkNcdTMwQUJcdTMwRUNcdTMwRjNcdTMwQzBcdTMwRkMnIH0sXG4gICAgICBkZWFsX3RpbWVsaW5lOiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHUzMEJGXHUzMEE0XHUzMEUwXHUzMEU5XHUzMEE0XHUzMEYzJyB9LFxuICAgICAgZGVhbF9nYWxsZXJ5OiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHUzMEFCXHUzMEZDXHUzMEM5JyB9LFxuICAgICAgbXlfb3Blbl9kZWFsczogeyBsYWJlbDogJ1x1NzlDMVx1MzA2RVx1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1NTU0Nlx1OEFDNycgfSxcbiAgICAgIHN0YWxlX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdcdTI2QTBcdUZFMEYgXHU1MDVDXHU2RURFXHU1NTQ2XHU4QUM3IFx1MDBCNyBcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjhcdTZFREVcdTU3MjhcdTMwNENcdTk1NzdcdTMwNDRcdTk4MDYnIH0sXG4gICAgICBjbG9zaW5nX3RoaXNfcXVhcnRlcjoge1xuICAgICAgICBsYWJlbDogJ1x1NEVDQVx1NTZEQlx1NTM0QVx1NjcxRlx1MzA2Qlx1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1NEU4OFx1NUI5QScsXG4gICAgICAgIGVtcHR5U3RhdGU6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1NEVDQVx1NTZEQlx1NTM0QVx1NjcxRlx1MzA2Qlx1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1NEU4OFx1NUI5QVx1MzA2RVx1NTU0Nlx1OEFDN1x1MzA2Rlx1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1Qlx1MzA5MycsXG4gICAgICAgICAgbWVzc2FnZTogJ1x1MzA1M1x1MzA2RVx1MzBCRlx1MzBENlx1MzA2Qlx1MzA2Rlx1MzAwMVx1NUI4Q1x1NEU4Nlx1NEU4OFx1NUI5QVx1NjVFNVx1MzA0Q1x1NEVDQVx1NTZEQlx1NTM0QVx1NjcxRlx1NTE4NVx1MzA2Qlx1MzA0Mlx1MzA4Qlx1MzBCM1x1MzBERlx1MzBDM1x1MzBDOFx1RkYwRlx1MzBEOVx1MzBCOVx1MzBDOFx1MzBCMVx1MzBGQ1x1MzBCOVx1MzA2RVx1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1NTU0Nlx1OEFDN1x1MzA0Q1x1ODg2OFx1NzkzQVx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1OVx1MzAwMlx1NzNGRVx1NTcyOFx1OEE3Mlx1NUY1M1x1MzA1OVx1MzA4Qlx1NTU0Nlx1OEFDN1x1MzA2Rlx1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMlx1MzA1RFx1MzA4Q1x1NEVFNVx1OTY0RFx1MzA2Qlx1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1MzA1OVx1MzA4Qlx1NTU0Nlx1OEFDN1x1MzA2Rlx1MzAwQ1x1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1NTU0Nlx1OEFDN1x1MzAwRFx1MzBCRlx1MzBENlx1MzA2Qlx1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVx1MzAwMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICAvLyBcdTMwQUFcdTMwRDZcdTMwQjhcdTMwQTdcdTMwQUZcdTMwQzhcdTVCOUFcdTdGQTlcdTMwNkVcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTMwQURcdTMwRkNcdUZGMDhvcHBvcnR1bml0eS5vYmplY3QudHNcdUZGMDlcdTIwMTQgXHU1MTY1XHU1MjlCXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEUwXHUzMDY4XHUzMDAxXG4gICAgICAvLyBcdTMwNTNcdTMwOENcdTMwODlcdTMwNkVcdTMwQjBcdTMwRUJcdTMwRkNcdTMwRDdcdTMwOTJcdTUzQzJcdTcxNjdcdTMwNTlcdTMwOEJcdThBNzNcdTdEMzBcdTMwREFcdTMwRkNcdTMwQjhcdTMwNkVcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdUZGMDgjMTQ1Mlx1RkYwOVx1MzA2N1x1NEY3Rlx1NzUyOFxuICAgICAgY3JtX2ZvcmVjYXN0OiB7IGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4XHUzMEZCXHU1OEYyXHU0RTBBXHU0RTg4XHU2RTJDJyB9LFxuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTU3RkFcdTY3MkNcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBmaW5hbmNpYWxzOiB7IGxhYmVsOiAnXHU4Q0ExXHU1MkQ5XHU2MEM1XHU1ODMxJyB9LFxuICAgICAgc2FsZXNfcHJvY2VzczogeyBsYWJlbDogJ1x1NTVCNlx1Njk2RFx1MzBEN1x1MzBFRFx1MzBCQlx1MzBCOScgfSxcbiAgICAgIGNsYXNzaWZpY2F0aW9uOiB7IGxhYmVsOiAnXHU1MjA2XHU5ODVFJyB9LFxuICAgICAgY2FtcGFpZ246IHsgbGFiZWw6ICdcdTMwQURcdTMwRTNcdTMwRjNcdTMwREFcdTMwRkNcdTMwRjMnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ1x1MzBFMVx1MzBFMlx1MzBGQlx1NkIyMVx1MzA2RVx1MzBCOVx1MzBDNlx1MzBDM1x1MzBENycgfSxcbiAgICAgIHF1YWxpZmljYXRpb246IHsgbGFiZWw6ICdcdTkwNjlcdTY4M0NcdTUyMjRcdTVCOUEnIH0sXG4gICAgICBuYXJyYXRpdmU6IHsgbGFiZWw6ICdcdTU1NDZcdThBQzdcdTMwNkVcdTdENENcdTdERUYnIH0sXG4gICAgICAvLyBvcHBvcnR1bml0eS52aWV3LnRzIFx1MzA2RVx1MzBENVx1MzBBOVx1MzBGQ1x1MzBFMFx1MzBCQlx1MzBBRlx1MzBCN1x1MzBFN1x1MzBGM1x1NTQwRCAoIzExMDApXG4gICAgICBvdmVydmlldzogeyBsYWJlbDogJ1x1Njk4Mlx1ODk4MScgfSxcbiAgICAgIGZvcmVjYXN0OiB7IGxhYmVsOiAnXHU0RTg4XHU2RTJDJyB9LFxuICAgICAgc2FsZXNfc3RyYXRlZ3k6IHsgbGFiZWw6ICdcdTU1QjZcdTY5NkRcdTYyMjZcdTc1NjUnIH0sXG4gICAgICB3aW5fbG9zczogeyBsYWJlbDogJ1x1NTNEN1x1NkNFOFx1RkYwRlx1NTkzMVx1NkNFOCcgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7XG4gICAgICAuLi5hY3Rpdml0eUFjdGlvbnMsXG4gICAgICBjbG9uZV9vcHBvcnR1bml0eToge1xuICAgICAgICBsYWJlbDogJ1x1NTU0Nlx1OEFDN1x1MzA5Mlx1ODkwN1x1ODhGRCcsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1NTQ2XHU4QUM3XHUzMDkyXHU4OTA3XHU4OEZEXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHVGRjAxJyxcbiAgICAgIH0sXG4gICAgICBtYXNzX3VwZGF0ZV9zdGFnZToge1xuICAgICAgICBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCOFx1NjZGNFx1NjVCMCcsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1NTQ2XHU4QUM3XHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4XHUzMDkyXHU2NkY0XHU2NUIwXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHVGRjAxJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgc3RhZ2U6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnXHU2NUIwXHUzMDU3XHUzMDQ0XHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4JyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHsgLi4ub3Bwb3J0dW5pdHlTdGFnZU9wdGlvbnMgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGdlbmVyYXRlX3F1b3RlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU4OThCXHU3QTREXHUzMDkyXHU0RjVDXHU2MjEwJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTU1NDZcdThBQzdcdTMwNEJcdTMwODlcdTg5OEJcdTdBNERcdTMwOTJcdTRGNUNcdTYyMTBcdTMwNTdcdTMwN0VcdTMwNTdcdTMwNUZcdUZGMDEnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtOiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICB1bml0X3ByaWNlX3Bvc2l0aXZlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdThDQTlcdTU4RjJcdTRGQTFcdTY4M0NcdTMwOTJcdThDQTBcdTMwNkVcdTUwMjRcdTMwNkJcdTMwNTlcdTMwOEJcdTMwNTNcdTMwNjhcdTMwNkZcdTMwNjdcdTMwNERcdTMwN0VcdTMwNUJcdTMwOTMnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHU1NTQ2XHU1NEMxXHU2NjBFXHU3RDMwJyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1NTU0Nlx1OEFDN1x1NTU0Nlx1NTRDMVx1NjYwRVx1N0QzMCcsXG4gICAgZGVzY3JpcHRpb246ICdcdTU1NDZcdThBQzdcdTkxNERcdTRFMEJcdTMwNkVcdTg4RkRcdTU0QzFcdTUyMjVcdTRGQTFcdTY4M0NcdTY2MEVcdTdEMzBcdTg4NEMnLFxuICAgIGZpZWxkczoge1xuICAgICAgY3JtX29wcG9ydHVuaXR5OiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3JyB9LFxuICAgICAgY3JtX3Byb2R1Y3Q6IHsgbGFiZWw6ICdcdTg4RkRcdTU0QzEnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ1x1OEFBQ1x1NjYwRScgfSxcbiAgICAgIHF1YW50aXR5OiB7IGxhYmVsOiAnXHU2NTcwXHU5MUNGJyB9LFxuICAgICAgbGlzdF9wcmljZTogeyBsYWJlbDogJ1x1NUI5QVx1NEZBMScsIGhlbHA6ICdcdTg4RkRcdTU0QzFcdTMwNkVcdTMwQUJcdTMwQkZcdTMwRURcdTMwQjBcdTRGQTFcdTY4M0NcdTMwNEJcdTMwODlcdTgxRUFcdTUyRDVcdTUxNjVcdTUyOUJcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTknIH0sXG4gICAgICB1bml0X3ByaWNlOiB7IGxhYmVsOiAnXHU4Q0E5XHU1OEYyXHU0RkExXHU2ODNDJywgaGVscDogJ1x1NEVBNFx1NkUwOVx1NUY4Q1x1MzA2RVx1NTM1OFx1NEZBMVx1RkYwOFx1NUI5QVx1NEZBMVx1MzA2OFx1NzU3MFx1MzA2QVx1MzA4Qlx1NTgzNFx1NTQwOFx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVx1RkYwOScgfSxcbiAgICAgIGRpc2NvdW50OiB7IGxhYmVsOiAnXHU1MjcyXHU1RjE1XHU3Mzg3XHVGRjA4JVx1RkYwOScgfSxcbiAgICAgIHRvdGFsX3ByaWNlOiB7IGxhYmVsOiAnXHU1NDA4XHU4QTA4JyB9LFxuICAgICAgbGluZV9udW1iZXI6IHsgbGFiZWw6ICdcdTg4NENcdTc1NkFcdTUzRjcnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnXHU2NjBFXHU3RDMwXHU4ODRDJyB9LFxuICAgICAgcHJpY2luZzogeyBsYWJlbDogJ1x1NEZBMVx1NjgzQycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fZm9yZWNhc3Q6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIHBlcmlvZF9lbmRfYWZ0ZXJfc3RhcnQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NjcxRlx1OTU5M1x1N0Q0Mlx1NEU4Nlx1MzA2Rlx1NjcxRlx1OTU5M1x1OTU4Qlx1NTlDQlx1MzA4OFx1MzA4QVx1NUY4Q1x1MzA2N1x1MzA0Mlx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgcGVyaW9kX2VuZF9tYXRjaGVzX2NhbGVuZGFyX3BlcmlvZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU2NzFGXHU5NTkzXHU3RDQyXHU0RTg2XHUzMDZGXHUzMDVEXHUzMDZFXHU2NzFGXHU5NTkzXHUzMDZFXHU2NzAwXHU3RDQyXHU2NUU1XHUzMDY3XHUzMDQyXHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5XHUzMDAyXHU0RjhCXHVGRjFBMjAyNi0wNy0wMSBcdTk1OEJcdTU5Q0JcdTMwNkVcdTU2REJcdTUzNEFcdTY3MUZcdTMwNkFcdTMwODkgMjAyNi0wOS0zMFx1MzAwMTIwMjYgXHU1RTc0IDggXHU2NzA4XHUzMDZBXHUzMDg5IDIwMjYtMDgtMzFcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIHBlcmlvZF9zdGFydF9maXJzdF9vZl9wZXJpb2Q6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NjcxRlx1OTU5M1x1OTU4Qlx1NTlDQlx1MzA2Rlx1MzA1RFx1MzA2RVx1NjcxRlx1OTU5M1x1MzA2RVx1NTIxRFx1NjVFNVx1MzA2N1x1MzA0Mlx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVx1MzAwMlx1NEY4Qlx1RkYxQTIwMjYgXHU1RTc0IDggXHU2NzA4XHUzMDZBXHUzMDg5IDIwMjYtMDgtMDFcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIHF1YXJ0ZXJfc3RhcnRzX29uX3F1YXJ0ZXJfYm91bmRhcnk6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NTZEQlx1NTM0QVx1NjcxRlx1MzBENVx1MzBBOVx1MzBGQ1x1MzBBRFx1MzBFM1x1MzBCOVx1MzBDOFx1MzA2Rlx1NTZEQlx1NTM0QVx1NjcxRlx1MzA2RVx1NTg4M1x1NzU0Q1x1RkYwODEgXHU2NzA4IDEgXHU2NUU1XHUzMDAxNCBcdTY3MDggMSBcdTY1RTVcdTMwMDE3IFx1NjcwOCAxIFx1NjVFNVx1MzAwMTEwIFx1NjcwOCAxIFx1NjVFNVx1RkYwOVx1MzA0Qlx1MzA4OVx1OTU4Qlx1NTlDQlx1MzA1OVx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgc25hcHNob3RfYW1vdW50c19ub25fbmVnYXRpdmU6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1MzBCOVx1MzBDQVx1MzBDM1x1MzBEN1x1MzBCN1x1MzBFN1x1MzBDM1x1MzBDOFx1OTFEMVx1OTg0RFx1MzA2Rlx1OENBMFx1MzA2RVx1NTAyNFx1MzA2Qlx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdcdTMwRDVcdTMwQTlcdTMwRkNcdTMwQURcdTMwRTNcdTMwQjlcdTMwQzgnLFxuICAgIHBsdXJhbExhYmVsOiAnXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEFEXHUzMEUzXHUzMEI5XHUzMEM4JyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1NjJDNVx1NUY1M1x1ODAwNVx1MzA1NFx1MzA2OFx1MzA2RVx1NUI5QVx1NjcxRlx1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGM1x1MzBCOVx1MzBDQVx1MzBDM1x1MzBEN1x1MzBCN1x1MzBFN1x1MzBDM1x1MzBDOFx1MzA2N1x1NTNDRVx1NzZDQVx1NEU4OFx1NkUyQ1x1MzA2Qlx1NEY3Rlx1NzUyOCcsXG4gICAgZmllbGRzOiB7XG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHBlcmlvZDogeyBsYWJlbDogJ1x1NjcxRlx1OTU5MycsIG9wdGlvbnM6IHsgbW9udGg6ICdcdTY3MDhcdTZCMjEnLCBxdWFydGVyOiAnXHU1NkRCXHU1MzRBXHU2NzFGJyB9IH0sXG4gICAgICBwZXJpb2Rfc3RhcnQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY3MUZcdTk1OTNcdTk1OEJcdTU5Q0InLFxuICAgICAgICBoZWxwOiAnXHU2NzFGXHU5NTkzXHUzMDZFXHU1MjFEXHU2NUU1XHUzMDY3XHUzMDQyXHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5IFx1MjAxNCBcdTRGOEI6IDIwMjYgXHU1RTc0IDggXHU2NzA4XHUzMDZBXHUzMDg5IDIwMjYtMDgtMDFcdTMwMDJcdTU2REJcdTUzNEFcdTY3MUZcdTMwNkVcdTMwRDVcdTMwQTlcdTMwRkNcdTMwQURcdTMwRTNcdTMwQjlcdTMwQzhcdTMwNkZcdTMwNTVcdTMwODlcdTMwNkJcdTU2REJcdTUzNEFcdTY3MUZcdTMwNkVcdTU4ODNcdTc1NENcdUZGMDgxIFx1NjcwOCAxIFx1NjVFNVx1MzBGQjQgXHU2NzA4IDEgXHU2NUU1XHUzMEZCNyBcdTY3MDggMSBcdTY1RTVcdTMwRkIxMCBcdTY3MDggMSBcdTY1RTVcdUZGMDlcdTMwNjdcdTk1OEJcdTU5Q0JcdTMwNTlcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTlcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIHBlcmlvZF9lbmQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY3MUZcdTk1OTNcdTdENDJcdTRFODYnLFxuICAgICAgICBoZWxwOiAnXHU5MDFBXHU1RTM4XHUzMDZGXHUzMDBDXHU2NzFGXHU5NTkzXHUzMDBEXHUzMDY4XHUzMDBDXHU2NzFGXHU5NTkzXHU5NThCXHU1OUNCXHUzMDBEXHUzMDRCXHUzMDg5XHU4MUVBXHU1MkQ1XHU3Njg0XHUzMDZCXHU3Qjk3XHU1MUZBXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU5XHUzMDAyXHU2MjRCXHU1MkQ1XHUzMDY3XHU1MTY1XHU1MjlCXHUzMDU5XHUzMDhCXHU1ODM0XHU1NDA4XHUzMDZGXHUzMDAxXHUzMDVEXHUzMDZFXHU2NzFGXHU5NTkzXHUzMDZFXHU2NzAwXHU3RDQyXHU2NUU1XHUzMDY3XHUzMDQyXHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5IFx1MjAxNCBcdTRGOEI6IDIwMjYtMDctMDEgXHU5NThCXHU1OUNCXHUzMDZFXHU1NkRCXHU1MzRBXHU2NzFGXHUzMDZBXHUzMDg5IDIwMjYtMDktMzBcdTMwMDEyMDI2IFx1NUU3NCA4IFx1NjcwOFx1MzA2QVx1MzA4OSAyMDI2LTA4LTMxXHUzMDAyJyxcbiAgICAgIH0sXG4gICAgICBwZXJpb2RfbGFiZWw6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY3MUZcdTk1OTMnLFxuICAgICAgICBoZWxwOiAnXHUzMDBDMjAyNiBcdTVFNzRcdTdCMkMgMyBcdTU2REJcdTUzNEFcdTY3MUZcdTMwMERcdTMwMEMyMDI2IFx1NUU3NCA4IFx1NjcwOFx1MzAwRFx1MzA2RVx1MzA4OFx1MzA0Nlx1MzA2QVx1OEFBRFx1MzA3Rlx1MzA4NFx1MzA1OVx1MzA0NFx1NjcxRlx1OTU5M1x1MzBFOVx1MzBEOVx1MzBFQlx1MzAwMicsXG4gICAgICB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ1x1ODg2OFx1NzkzQVx1NTQwRCcgfSxcbiAgICAgIHNuYXBzaG90X2RhdGU6IHsgbGFiZWw6ICdcdTMwQjlcdTMwQ0FcdTMwQzNcdTMwRDdcdTMwQjdcdTMwRTdcdTMwQzNcdTMwQzhcdTY1RTUnLCBoZWxwOiAnXHUzMDUzXHUzMDZFXHUzMEI5XHUzMENBXHUzMEMzXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEMzXHUzMEM4XHUzMDkyXHU1M0Q2XHU1Rjk3XHUzMDU3XHUzMDVGXHU2NUU1XHUzMDAyJyB9LFxuICAgICAgc291cmNlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEJEXHUzMEZDXHUzMEI5JyxcbiAgICAgICAgb3B0aW9uczogeyBzY2hlZHVsZWQ6ICdcdTVCOUFcdTY3MUZcdTMwQjlcdTMwQ0FcdTMwQzNcdTMwRDdcdTMwQjdcdTMwRTdcdTMwQzNcdTMwQzgnLCBhaTogJ0FJIFx1MzBCOVx1MzBBRFx1MzBFQicsIG1hbnVhbDogJ1x1NjI0Qlx1NTJENVx1NTE2NVx1NTI5QicgfSxcbiAgICAgIH0sXG4gICAgICBxdW90YTogeyBsYWJlbDogJ1x1MzBBRlx1MzBBOVx1MzBGQ1x1MzBCRicgfSxcbiAgICAgIHBpcGVsaW5lX2Ftb3VudDoge1xuICAgICAgICBsYWJlbDogJ1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycsXG4gICAgICAgIGhlbHA6ICdcdTMwNTNcdTMwNkVcdTY3MUZcdTk1OTNcdTMwNkJcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTRFODhcdTVCOUFcdTMwNkVcdTMwQUFcdTMwRkNcdTMwRDdcdTMwRjNcdTU1NDZcdThBQzdcdTMwNkVcdTU0MDhcdThBMDhcdTkxRDFcdTk4NERcdUZGMDhcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjhcdTMwOTJcdTU1NEZcdTMwOEZcdTMwNkFcdTMwNDRcdUZGMDlcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIGJlc3RfY2FzZV9hbW91bnQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwRDlcdTMwQjlcdTMwQzhcdTMwQjFcdTMwRkNcdTMwQjknLFxuICAgICAgICBoZWxwOiAnXHU1OEYyXHU0RTBBXHU0RTg4XHU2RTJDXHUzMEFCXHUzMEM2XHUzMEI0XHUzMEVBXHUzMDRDXHUzMDBDXHUzMEQ5XHUzMEI5XHUzMEM4XHUzMEIxXHUzMEZDXHUzMEI5XHUzMDBEXHUzMDdFXHUzMDVGXHUzMDZGXHUzMDBDXHUzMEIzXHUzMERGXHUzMEMzXHUzMEM4XHUzMDBEXHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHU1NTQ2XHU4QUM3XHUzMDAyJyxcbiAgICAgIH0sXG4gICAgICBjb21taXRfYW1vdW50OiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEIzXHUzMERGXHUzMEMzXHUzMEM4JyxcbiAgICAgICAgaGVscDogJ1x1NThGMlx1NEUwQVx1NEU4OFx1NkUyQ1x1MzBBQlx1MzBDNlx1MzBCNFx1MzBFQVx1MzA0Q1x1MzAwQ1x1MzBCM1x1MzBERlx1MzBDM1x1MzBDOFx1MzAwRFx1MzA2RVx1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1NTU0Nlx1OEFDN1x1RkYwOFx1NjJDNVx1NUY1M1x1ODAwNVx1MzA0Q1x1MzBCM1x1MzBERlx1MzBDM1x1MzBDOFx1NkUwOFx1MzA3Rlx1RkYwOVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgY2xvc2VkX2Ftb3VudDogeyBsYWJlbDogJ1x1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQScsIGhlbHA6ICdcdTMwNTNcdTMwNkVcdTY3MUZcdTk1OTNcdTMwNkJcdTMwNTlcdTMwNjdcdTMwNkJcdTYyMTBcdTdBQ0JcdTMwNTdcdTMwNUZcdTkxRDFcdTk4NERcdTMwMDInIH0sXG4gICAgICBleHBlY3RlZF9hbW91bnQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTRFODhcdTYwRjMnLFxuICAgICAgICBoZWxwOiAnXHUzMEFGXHUzMEVEXHUzMEZDXHUzMEJBICsgXHUzMEIzXHUzMERGXHUzMEMzXHUzMEM4IFx1MjAxNCBcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNENcdTcxMjFcdTc0MDZcdTMwNkFcdTMwNEZcdTc3NDBcdTU3MzBcdTMwOTJcdTg5OEJcdThGQkNcdTMwODFcdTMwOEJcdTkxRDFcdTk4NERcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIGF0dGFpbm1lbnRfcGN0OiB7XG4gICAgICAgIGxhYmVsOiAnXHU5MDU0XHU2MjEwXHU3Mzg3ICUnLFxuICAgICAgICBoZWxwOiAnXHUzMEFGXHUzMEVEXHUzMEZDXHUzMEJBIFx1MDBGNyBcdTMwQUZcdTMwQTlcdTMwRkNcdTMwQkYgXHUwMEQ3IDEwMFx1MzAwMlx1MzBBRlx1MzBBOVx1MzBGQ1x1MzBCRlx1MzA0Q1x1NkI2M1x1MzA2RVx1NTAyNFx1MzA2Qlx1MzA2QVx1MzA4Qlx1MzA3RVx1MzA2N1x1MzA2RiAwJSBcdTMwNjhcdTg4NjhcdTc5M0FcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTlcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIGNvdmVyYWdlX3JhdGlvOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEFCXHUzMEQwXHUzMEVDXHUzMEMzXHUzMEI4JyxcbiAgICAgICAgaGVscDogJ1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMyBcdTAwRjdcdUZGMDhcdTMwQUZcdTMwQTlcdTMwRkNcdTMwQkYgXHUyMjEyIFx1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1RkYwOVx1MjAxNCBcdTZCOEJcdTMwOEFcdTMwNkVcdTVERUVcdTUyMDZcdTMwOTJcdTU3Q0JcdTMwODFcdTMwOEJcdTMwRDFcdTMwQTRcdTMwRDdcdTMwRTlcdTMwQTRcdTMwRjNcdTMwNENcdTUzNDFcdTUyMDZcdTMwNEJcdTMwNjlcdTMwNDZcdTMwNEJcdTMwMDJcdTMwQUZcdTMwQTlcdTMwRkNcdTMwQkZcdTkwNTRcdTYyMTBcdTZFMDhcdTMwN0ZcdTMwNkVcdTU4MzRcdTU0MDhcdTMwNkYgMCBcdTMwNjhcdTg4NjhcdTc5M0FcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTlcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHUzMEUxXHUzMEUyJyB9LFxuICAgICAgc2VlZF9rZXk6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwQjdcdTMwRkNcdTMwQzlcdTMwQURcdTMwRkMnLFxuICAgICAgICBoZWxwOiAnXHUzMEM3XHUzMEUyXHUzMEM3XHUzMEZDXHUzMEJGXHUzMDZFXHU4QjU4XHU1MjI1XHU1QjUwXHUzMDAyXHUzMEI3XHUzMEZDXHUzMEM5XHUzMEVEXHUzMEZDXHUzMEMwXHUzMEZDXHUzMDYwXHUzMDUxXHUzMDRDXHU2NkY4XHUzMDREXHU4RkJDXHUzMDdGXHUzMDAxXHU1QjlGXHU5NjlCXHUzMDZFXHUzMEI5XHUzMENBXHUzMEMzXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEMzXHUzMEM4XHUzMDY3XHUzMDZGXHU1RTM4XHUzMDZCXHU3QTdBXHUzMDY3XHUzMDU5XHUzMDAyJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9mb3JlY2FzdHM6IHsgbGFiZWw6ICdcdTMwNTlcdTMwNzlcdTMwNjZcdTMwNkVcdTMwRDVcdTMwQTlcdTMwRkNcdTMwQURcdTMwRTNcdTMwQjlcdTMwQzgnIH0sXG4gICAgICB0aGlzX3F1YXJ0ZXJfZm9yZWNhc3RzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHUzMDZFXHUzMEI5XHUzMENBXHUzMEMzXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEMzXHUzMEM4XHUzMDZGXHUzMDdFXHUzMDYwXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzJyxcbiAgICAgICAgICBtZXNzYWdlOiAnXHU1NkRCXHU1MzRBXHU2NzFGXHUzMEI5XHUzMENBXHUzMEMzXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEMzXHUzMEM4XHUzMDZGXHU1OTFDXHU5NTkzXHUzMDZFXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEFEXHUzMEUzXHUzMEI5XHUzMEM4XHU5NkM2XHU4QTA4XHUzMDRDXHU2NkY4XHUzMDREXHU4RkJDXHUzMDdGXHUzMDdFXHUzMDU5XHUzMDAyXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHU1MjA2XHUzMDRDXHU0RTAwXHU1RUE2XHU1QjlGXHU4ODRDXHUzMDU1XHUzMDhDXHUzMDhCXHUzMDdFXHUzMDY3XHUzMDUzXHUzMDZFXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDZGXHU3QTdBXHUzMDY3XHUzMDU5XHUzMDAyXHU3OEJBXHU1QjlBXHU2RTA4XHUzMDdGXHUzMDZFXHU1NkRCXHU1MzRBXHU2NzFGXHUzMDZGXHUzMDBDXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDBEXHUzMEJGXHUzMEQ2XHUzMDZCXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5XHUzMDAyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBteV9mb3JlY2FzdDogeyBsYWJlbDogJ1x1ODFFQVx1NTIwNlx1MzA2RVx1MzBENVx1MzBBOVx1MzBGQ1x1MzBBRFx1MzBFM1x1MzBCOVx1MzBDOCcgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTMwQjlcdTMwQ0FcdTMwQzNcdTMwRDdcdTMwQjdcdTMwRTdcdTMwQzNcdTMwQzgnIH0sXG4gICAgICBhbW91bnRzOiB7IGxhYmVsOiAnXHU5MUQxXHU5ODREJyB9LFxuICAgICAgbWV0YTogeyBsYWJlbDogJ1x1MzBCRFx1MzBGQ1x1MzBCOScgfSxcbiAgICAgIC8vIGZvcmVjYXN0LnZpZXcudHMgXHUzMDZFXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEUwXHUzMEJCXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHU1NDBEICgjMTEwMClcbiAgICAgIHNuYXBzaG90OiB7IGxhYmVsOiAnXHUzMEI5XHUzMENBXHUzMEMzXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEMzXHUzMEM4JyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdcdTMwRTFcdTMwRTInIH0sXG4gICAgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5jb21tZXJjZS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlBcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQL29iamVjdHMuY29tbWVyY2UudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgT2JqZWN0VHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuLyoqXG4gKiBcdTY1RTVcdTY3MkNcdThBOUUgKGphLUpQKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIENPTU1FUkNFIGZhbWlseTpcbiAqIHdoYXQgZ2V0cyBzb2xkIGFuZCBvbiB3aGF0IHBhcGVyIFx1MjAxNCBxdW90ZXMsIGNvbnRyYWN0cywgcHJvZHVjdHMuXG4gKlxuICogUm9zdGVyOiBgY3JtX3F1b3RlYCwgYGNybV9xdW90ZV9saW5lX2l0ZW1gLCBgY3JtX2NvbnRyYWN0YCwgYGNybV9wcm9kdWN0YC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC50c2AuXG4gKi9cbmNvbnN0IHBheW1lbnRUZXJtc09wdGlvbnMgPSB7XG4gIG5ldF8xNTogJzE1IFx1NjVFNVx1NEVFNVx1NTE4NVx1NjI1NVx1MzA0NCcsIG5ldF8zMDogJzMwIFx1NjVFNVx1NEVFNVx1NTE4NVx1NjI1NVx1MzA0NCcsIG5ldF82MDogJzYwIFx1NjVFNVx1NEVFNVx1NTE4NVx1NjI1NVx1MzA0NCcsXG4gIG5ldF85MDogJzkwIFx1NjVFNVx1NEVFNVx1NTE4NVx1NjI1NVx1MzA0NCcsIGR1ZV9vbl9yZWNlaXB0OiAnXHU4QUNCXHU2QzQyXHU2NkY4XHU1M0Q3XHU5ODE4XHU2NjQyXHU2MjU1XHUzMDQ0Jyxcbn07XG5cbmV4cG9ydCBjb25zdCBjb21tZXJjZTogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX3F1b3RlOiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBkaXNjb3VudF93aXRoaW5fY2VpbGluZzoge1xuICAgICAgICBtZXNzYWdlOiAnXHU1MjcyXHU1RjE1XHU3Mzg3XHUzMDZGIDYwJSBcdTMwOTJcdThEODVcdTMwNDhcdTMwODlcdTMwOENcdTMwN0VcdTMwNUJcdTMwOTMnLFxuICAgICAgfSxcbiAgICAgIGV4cGlyYXRpb25fYWZ0ZXJfcXVvdGU6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NjcwOVx1NTJCOVx1NjcxRlx1OTY1MFx1MzA2Rlx1ODk4Qlx1N0E0RFx1NjVFNVx1MzA4OFx1MzA4QVx1NUY4Q1x1MzA2N1x1MzA0Mlx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OScsXG4gICAgICB9LFxuICAgICAgcXVvdGVfc3RhdHVzX3Byb2dyZXNzaW9uOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTcxMjFcdTUyQjlcdTMwNkFcdTg5OEJcdTdBNERcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjlcdTkwNzdcdTc5RkJcdTMwNjdcdTMwNTknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU4OThCXHU3QTREJyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1ODk4Qlx1N0E0RCcsXG4gICAgZGVzY3JpcHRpb246ICdcdTk4NjdcdTVCQTJcdTMwNkJcdTYzRDBcdTc5M0FcdTMwNTlcdTMwOEJcdTRGQTFcdTY4M0NcdTg5OEJcdTdBNEQnLFxuICAgIGZpZWxkczoge1xuICAgICAgcXVvdGVfbnVtYmVyOiB7IGxhYmVsOiAnXHU4OThCXHU3QTREXHU3NTZBXHU1M0Y3JyB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ1x1ODk4Qlx1N0E0RFx1NTQwRCcgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTg4NjhcdTc5M0FcdTU0MEQnIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OCcgfSxcbiAgICAgIGNybV9jb250YWN0OiB7XG4gICAgICAgIGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1JyxcbiAgICAgICAgaGVscDogJ1x1ODk4Qlx1N0E0RFx1MzA0Q1x1MzAwQ1x1NjNEMFx1NzkzQVx1NkUwOFx1MzA3Rlx1MzAwRFx1MzA3RVx1MzA1Rlx1MzA2Rlx1MzAwQ1x1NjI3Rlx1OEE4RFx1NkUwOFx1MzA3Rlx1MzAwRFx1MzA2Qlx1MzA2QVx1MzA2M1x1MzA1Rlx1NjY0Mlx1NzBCOVx1MzA2N1x1NUZDNVx1OTgwOFx1MzA2N1x1MzA1OVx1MzAwMlx1NEY1Q1x1NjIxMFx1MzA1NVx1MzA4Q1x1MzA4Qlx1NTk1MVx1N0QwNFx1MzA2RVx1NEUzQlx1NjJDNVx1NUY1M1x1ODAwNVx1MzA2Rlx1MzA1M1x1MzA1M1x1MzA0Qlx1MzA4OVx1NUYxNVx1MzA0RFx1N0Q5OVx1MzA0Q1x1MzA4Q1x1MzA3RVx1MzA1OVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgY3JtX29wcG9ydHVuaXR5OiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3JyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdTg5OEJcdTdBNERcdTYyQzVcdTVGNTNcdTgwMDUnIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZHJhZnQ6ICdcdTRFMEJcdTY2RjhcdTMwNEQnLCBpbl9yZXZpZXc6ICdcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkNcdTRFMkQnLCBwcmVzZW50ZWQ6ICdcdTYzRDBcdTc5M0FcdTZFMDhcdTMwN0YnLFxuICAgICAgICAgIGFjY2VwdGVkOiAnXHU2MjdGXHU4QThEXHU2RTA4XHUzMDdGJywgcmVqZWN0ZWQ6ICdcdTUzNzRcdTRFMEInLCBleHBpcmVkOiAnXHU2NzFGXHU5NjUwXHU1MjA3XHUzMDhDJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBxdW90ZV9kYXRlOiB7IGxhYmVsOiAnXHU4OThCXHU3QTREXHU2NUU1JyB9LFxuICAgICAgZXhwaXJhdGlvbl9kYXRlOiB7IGxhYmVsOiAnXHU2NzA5XHU1MkI5XHU2NzFGXHU5NjUwJyB9LFxuICAgICAgc3VidG90YWw6IHsgbGFiZWw6ICdcdTVDMEZcdThBMDgnIH0sXG4gICAgICBkaXNjb3VudDogeyBsYWJlbDogJ1x1NTI3Mlx1NUYxNVx1NzM4NyglKScgfSxcbiAgICAgIGRpc2NvdW50X2Ftb3VudDogeyBsYWJlbDogJ1x1NTI3Mlx1NUYxNVx1OTg0RCcgfSxcbiAgICAgIHRheDogeyBsYWJlbDogJ1x1N0EwRVx1OTg0RCcgfSxcbiAgICAgIHNoaXBwaW5nX2hhbmRsaW5nOiB7IGxhYmVsOiAnXHU5MTREXHU5MDAxXHUzMEZCXHU2MjRCXHU2NTcwXHU2NTk5JyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdcdTU0MDhcdThBMDhcdTkxRDFcdTk4NEQnIH0sXG4gICAgICBwYXltZW50X3Rlcm1zOiB7IGxhYmVsOiAnXHU2NTJGXHU2MjU1XHU2NzYxXHU0RUY2Jywgb3B0aW9uczogeyAuLi5wYXltZW50VGVybXNPcHRpb25zIH0gfSxcbiAgICAgIHNoaXBwaW5nX3Rlcm1zOiB7IGxhYmVsOiAnXHU5MTREXHU5MDAxXHU2NzYxXHU0RUY2JyB9LFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnXHU4QUNCXHU2QzQyXHU1MTQ4XHU0RjRGXHU2MjQwJyB9LFxuICAgICAgc2hpcHBpbmdfYWRkcmVzczogeyBsYWJlbDogJ1x1OTE0RFx1OTAwMVx1NTE0OFx1NEY0Rlx1NjI0MCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU4QUFDXHU2NjBFJyB9LFxuICAgICAgaW50ZXJuYWxfbm90ZXM6IHsgbGFiZWw6ICdcdTUxODVcdTkwRThcdTMwRTFcdTMwRTInIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9xdW90ZXM6IHsgbGFiZWw6ICdcdTUxNjhcdTg5OEJcdTdBNEQnIH0sXG4gICAgICBxdW90ZV9waXBlbGluZTogeyBsYWJlbDogJ1x1ODk4Qlx1N0E0RFx1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycgfSxcbiAgICAgIHF1b3RlX2NhbGVuZGFyOiB7IGxhYmVsOiAnXHU4OThCXHU3QTREXHUzMEFCXHUzMEVDXHUzMEYzXHUzMEMwXHUzMEZDJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1ODk4Qlx1N0E0RFx1NjBDNVx1NTgzMScgfSxcbiAgICAgIHByaWNpbmc6IHsgbGFiZWw6ICdcdTRGQTFcdTY4M0MnIH0sXG4gICAgICB0ZXJtczogeyBsYWJlbDogJ1x1Njc2MVx1NEVGNlx1MzBGQlx1NjcwOVx1NTJCOVx1NjcxRlx1OTY1MCcgfSxcbiAgICAgIGFkZHJlc3M6IHsgbGFiZWw6ICdcdTRGNEZcdTYyNDAnIH0sXG4gICAgICBzeXN0ZW06IHsgbGFiZWw6ICdcdTMwQjdcdTMwQjlcdTMwQzZcdTMwRTAnIH0sXG4gICAgICAvLyBxdW90ZS52aWV3LnRzIFx1MzA2RVx1MzBENVx1MzBBOVx1MzBGQ1x1MzBFMFx1MzBCQlx1MzBBRlx1MzBCN1x1MzBFN1x1MzBGM1x1NTQwRCAoIzExMDApXG4gICAgICBxdW90ZTogeyBsYWJlbDogJ1x1ODk4Qlx1N0E0RFx1NjZGOCcgfSxcbiAgICAgIHRvdGFsczogeyBsYWJlbDogJ1x1NTQwOFx1OEEwOCcgfSxcbiAgICAgIHF1b3RlX3Rlcm1zOiB7IGxhYmVsOiAnXHU1OTUxXHU3RDA0XHU2NzYxXHU0RUY2JyB9LFxuICAgICAgYWRkcmVzc2VzX2FuZF9ub3RlczogeyBsYWJlbDogJ1x1NEY0Rlx1NjI0MFx1MzA2OFx1NTA5OVx1ODAwMycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fcXVvdGVfbGluZV9pdGVtOiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBkaXNjb3VudF93aXRoaW5fY2VpbGluZzoge1xuICAgICAgICBtZXNzYWdlOiAnXHU2NjBFXHU3RDMwXHUzMDZFXHU1MjcyXHU1RjE1XHU3Mzg3XHUzMDZGIDYwJSBcdTMwOTJcdThEODVcdTMwNDhcdTMwODlcdTMwOENcdTMwN0VcdTMwNUJcdTMwOTMnLFxuICAgICAgfSxcbiAgICAgIHVuaXRfcHJpY2VfcG9zaXRpdmU6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1OENBOVx1NThGMlx1NEZBMVx1NjgzQ1x1MzA5Mlx1OENBMFx1MzA2RVx1NTAyNFx1MzA2Qlx1MzA1OVx1MzA4Qlx1MzA1M1x1MzA2OFx1MzA2Rlx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1Qlx1MzA5MycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdcdTg5OEJcdTdBNERcdTY2MEVcdTdEMzAnLFxuICAgIHBsdXJhbExhYmVsOiAnXHU4OThCXHU3QTREXHU2NjBFXHU3RDMwJyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1ODk4Qlx1N0E0RFx1OTE0RFx1NEUwQlx1MzA2RVx1ODhGRFx1NTRDMVx1NTIyNVx1NEZBMVx1NjgzQ1x1NjYwRVx1N0QzMFx1ODg0QycsXG4gICAgZmllbGRzOiB7XG4gICAgICBjcm1fcXVvdGU6IHsgbGFiZWw6ICdcdTg5OEJcdTdBNEQnIH0sXG4gICAgICBjcm1fcHJvZHVjdDogeyBsYWJlbDogJ1x1ODhGRFx1NTRDMScgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU4QUFDXHU2NjBFJyB9LFxuICAgICAgcXVhbnRpdHk6IHsgbGFiZWw6ICdcdTY1NzBcdTkxQ0YnIH0sXG4gICAgICBsaXN0X3ByaWNlOiB7IGxhYmVsOiAnXHU1QjlBXHU0RkExJyB9LFxuICAgICAgdW5pdF9wcmljZTogeyBsYWJlbDogJ1x1OENBOVx1NThGMlx1NEZBMVx1NjgzQycgfSxcbiAgICAgIGRpc2NvdW50OiB7IGxhYmVsOiAnXHU1MjcyXHU1RjE1XHU3Mzg3XHVGRjA4JVx1RkYwOScgfSxcbiAgICAgIHN1YnRvdGFsOiB7IGxhYmVsOiAnXHU1QzBGXHU4QTA4JyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdcdTU0MDhcdThBMDgnIH0sXG4gICAgICBsaW5lX251bWJlcjogeyBsYWJlbDogJ1x1ODg0Q1x1NzU2QVx1NTNGNycgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTY2MEVcdTdEMzBcdTg4NEMnIH0sXG4gICAgICBwcmljaW5nOiB7IGxhYmVsOiAnXHU0RkExXHU2ODNDJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9jb250cmFjdDoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgZW5kX2FmdGVyX3N0YXJ0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTdENDJcdTRFODZcdTY1RTVcdTMwNkZcdTk1OEJcdTU5Q0JcdTY1RTVcdTMwODhcdTMwOEFcdTVGOENcdTMwNjdcdTMwNDJcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTknLFxuICAgICAgfSxcbiAgICAgIGNvbnRyYWN0X3N0YXR1c19wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU3MTIxXHU1MkI5XHUzMDZBXHU1OTUxXHU3RDA0XHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHU5MDc3XHU3OUZCXHUzMDY3XHUzMDU5JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NTk1MVx1N0QwNCcsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTU5NTFcdTdEMDQnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU5ODY3XHU1QkEyXHUzMDY4XHU3REUwXHU3RDUwXHUzMDU3XHUzMDVGXHU2Q0Q1XHU3Njg0XHUzMDZBXHU1OTUxXHU3RDA0XHUzMEZCXHU1NDA4XHU2MTBGJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNvbnRyYWN0X251bWJlcjogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1NzU2QVx1NTNGNycgfSxcbiAgICAgIGNybV9hY2NvdW50OiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4JyB9LFxuICAgICAgY3JtX2NvbnRhY3Q6IHsgbGFiZWw6ICdcdTRFM0JcdTYyQzVcdTVGNTNcdTgwMDUnIH0sXG4gICAgICBjcm1fb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTU1NDZcdThBQzcnIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkcmFmdDogJ1x1NEUwQlx1NjZGOFx1MzA0RCcsIGluX2FwcHJvdmFsOiAnXHU2MjdGXHU4QThEXHU0RTJEJywgYWN0aXZhdGVkOiAnXHU2NzA5XHU1MkI5JyxcbiAgICAgICAgICBleHBpcmVkOiAnXHU2NzFGXHU5NjUwXHU1MjA3XHUzMDhDJywgdGVybWluYXRlZDogJ1x1ODlFM1x1N0QwNCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29udHJhY3RfdGVybV9tb250aHM6IHsgbGFiZWw6ICdcdTU5NTFcdTdEMDRcdTY3MUZcdTk1OTNcdUZGMDhcdTY3MDhcdUZGMDknIH0sXG4gICAgICBzdGFydF9kYXRlOiB7IGxhYmVsOiAnXHU5NThCXHU1OUNCXHU2NUU1JyB9LFxuICAgICAgZW5kX2RhdGU6IHsgbGFiZWw6ICdcdTdENDJcdTRFODZcdTY1RTUnIH0sXG4gICAgICBjb250cmFjdF92YWx1ZTogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1OTFEMVx1OTg0RCcgfSxcbiAgICAgIGJpbGxpbmdfZnJlcXVlbmN5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU4QUNCXHU2QzQyXHU5ODNCXHU1RUE2JyxcbiAgICAgICAgb3B0aW9uczogeyBtb250aGx5OiAnXHU2NzA4XHU2QjIxJywgcXVhcnRlcmx5OiAnXHU1NkRCXHU1MzRBXHU2NzFGJywgYW5udWFsbHk6ICdcdTVFNzRcdTZCMjEnLCBvbmVfdGltZTogJ1x1NEUwMFx1NjJFQycgfSxcbiAgICAgIH0sXG4gICAgICBwYXltZW50X3Rlcm1zOiB7IGxhYmVsOiAnXHU2NTJGXHU2MjU1XHU2NzYxXHU0RUY2Jywgb3B0aW9uczogeyAuLi5wYXltZW50VGVybXNPcHRpb25zIH0gfSxcbiAgICAgIGF1dG9fcmVuZXdhbDogeyBsYWJlbDogJ1x1ODFFQVx1NTJENVx1NjZGNFx1NjVCMCcgfSxcbiAgICAgIHJlbmV3YWxfbm90aWNlX2RheXM6IHsgbGFiZWw6ICdcdTY2RjRcdTY1QjBcdTkwMUFcdTc3RTVcdUZGMDhcdTY1RTVcdUZGMDknIH0sXG4gICAgICBjb250cmFjdF90eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1OTUxXHU3RDA0XHU3QTJFXHU1MjI1JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbjogJ1x1MzBCNVx1MzBENlx1MzBCOVx1MzBBRlx1MzBFQVx1MzBEN1x1MzBCN1x1MzBFN1x1MzBGM1x1NTk1MVx1N0QwNCcsIHNlcnZpY2U6ICdcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjlcdTU5NTFcdTdEMDQnLFxuICAgICAgICAgIGxpY2Vuc2U6ICdcdTMwRTlcdTMwQTRcdTMwQkJcdTMwRjNcdTMwQjlcdTU5NTFcdTdEMDQnLCBwYXJ0bmVyc2hpcDogJ1x1MzBEMVx1MzBGQ1x1MzBDOFx1MzBDQVx1MzBGQ1x1MzBCN1x1MzBDM1x1MzBEN1x1NTk1MVx1N0QwNCcsXG4gICAgICAgICAgbmRhOiAnXHU3OUQ4XHU1QkM2XHU0RkREXHU2MzAxXHU1OTUxXHU3RDA0IChOREEpJywgbXNhOiAnXHU1N0ZBXHU2NzJDXHU1OTUxXHU3RDA0IChNU0EpJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzaWduZWRfZGF0ZTogeyBsYWJlbDogJ1x1N0Y3Mlx1NTQwRFx1NjVFNScgfSxcbiAgICAgIHNpZ25lZF9ieTogeyBsYWJlbDogJ1x1N0Y3Mlx1NTQwRFx1ODAwNScgfSxcbiAgICAgIGRvY3VtZW50X3VybDogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1NjZGOFx1OTg1RScgfSxcbiAgICAgIHNwZWNpYWxfdGVybXM6IHsgbGFiZWw6ICdcdTcyNzlcdTdEMDRcdTRFOEJcdTk4MDUnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ1x1OEFBQ1x1NjYwRScgfSxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBsYWJlbDogJ1x1OEFDQlx1NkM0Mlx1NTE0OFx1NEY0Rlx1NjI0MCcgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2NvbnRyYWN0czogeyBsYWJlbDogJ1x1NTE2OFx1NTk1MVx1N0QwNCcgfSxcbiAgICAgIHJlbmV3YWxfY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTY2RjRcdTY1QjBcdTMwQUJcdTMwRUNcdTMwRjNcdTMwQzBcdTMwRkMnIH0sXG4gICAgICBjb250cmFjdF9nYW50dDogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1NjcxRlx1OTU5MycgfSxcbiAgICAgIGNvbnRyYWN0X3RpbWVsaW5lOiB7IGxhYmVsOiAnXHU1OTUxXHU3RDA0XHUzMEJGXHUzMEE0XHUzMEUwXHUzMEU5XHUzMEE0XHUzMEYzJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1NjBDNVx1NTgzMScgfSxcbiAgICAgIHBhcnRpZXM6IHsgbGFiZWw6ICdcdTU5NTFcdTdEMDRcdTVGNTNcdTRFOEJcdTgwMDUnIH0sXG4gICAgICB0ZXJtczogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1Njc2MVx1NEVGNlx1MzBGQlx1NjcxRlx1OTU5MycgfSxcbiAgICAgIHZhbHVlOiB7IGxhYmVsOiAnXHU1OTUxXHU3RDA0XHU5MUQxXHU5ODREJyB9LFxuICAgICAgc3RhdHVzOiB7IGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHUzMEZCXHU2MjdGXHU4QThEJyB9LFxuICAgICAgcmVuZXdhbDogeyBsYWJlbDogJ1x1NjZGNFx1NjVCMCcgfSxcbiAgICAgIC8vIGNvbnRyYWN0LnZpZXcudHMgXHUzMDZFXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEUwXHUzMEJCXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHU1NDBEICgjMTEwMClcbiAgICAgIGNvbnRyYWN0X3Rlcm1zOiB7IGxhYmVsOiAnXHU1OTUxXHU3RDA0XHU2NzYxXHU0RUY2JyB9LFxuICAgICAgc2lnbmluZ19hbmRfZG9jdW1lbnRzOiB7IGxhYmVsOiAnXHU3RjcyXHU1NDBEXHUzMDY4XHU2NkY4XHU5ODVFJyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdcdTUwOTlcdTgwMDMnIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX3Byb2R1Y3Q6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGNvc3RfbGVzc190aGFuX3ByaWNlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTUzOUZcdTRGQTFcdTMwNkZcdTVCOUFcdTRGQTFcdTMwODhcdTMwOEFcdTRGNEVcdTMwNEZcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQnLFxuICAgICAgfSxcbiAgICAgIHByaWNlX3Bvc2l0aXZlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTVCOUFcdTRGQTFcdTMwNkZcdTZCNjNcdTMwNkVcdTUwMjRcdTMwNjdcdTMwNDJcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU4OEZEXHU1NEMxJyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1ODhGRFx1NTRDMScsXG4gICAgZGVzY3JpcHRpb246ICdcdTgxRUFcdTc5M0VcdTMwNENcdTYzRDBcdTRGOUJcdTMwNTlcdTMwOEJcdTg4RkRcdTU0QzFcdTMwRkJcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjknLFxuICAgIGZpZWxkczoge1xuICAgICAgcHJvZHVjdF9jb2RlOiB7IGxhYmVsOiAnXHU4OEZEXHU1NEMxXHUzMEIzXHUzMEZDXHUzMEM5JyB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ1x1ODhGRFx1NTRDMVx1NTQwRCcgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTg4NjhcdTc5M0FcdTU0MEQnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ1x1OEFBQ1x1NjYwRScgfSxcbiAgICAgIGNhdGVnb3J5OiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEFCXHUzMEM2XHUzMEI0XHUzMEVBJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHNvZnR3YXJlOiAnXHUzMEJEXHUzMEQ1XHUzMEM4XHUzMEE2XHUzMEE3XHUzMEEyJywgaGFyZHdhcmU6ICdcdTMwQ0ZcdTMwRkNcdTMwQzlcdTMwQTZcdTMwQTdcdTMwQTInLCBzZXJ2aWNlOiAnXHUzMEI1XHUzMEZDXHUzMEQzXHUzMEI5JyxcbiAgICAgICAgICBzdWJzY3JpcHRpb246ICdcdTMwQjVcdTMwRDZcdTMwQjlcdTMwQUZcdTMwRUFcdTMwRDdcdTMwQjdcdTMwRTdcdTMwRjMnLCBzdXBwb3J0OiAnXHUzMEI1XHUzMEREXHUzMEZDXHUzMEM4JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmYW1pbHk6IHtcbiAgICAgICAgbGFiZWw6ICdcdTg4RkRcdTU0QzFcdTMwRDVcdTMwQTFcdTMwREZcdTMwRUEnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZW50ZXJwcmlzZTogJ1x1MzBBOFx1MzBGM1x1MzBCRlx1MzBGQ1x1MzBEN1x1MzBFOVx1MzBBNFx1MzBCQVx1NTQxMVx1MzA1MVx1MzBCRFx1MzBFQVx1MzBFNVx1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGMycsIHNtYjogJ1x1NEUyRFx1NUMwRlx1NEYwMVx1Njk2RFx1NTQxMVx1MzA1MVx1MzBCRFx1MzBFQVx1MzBFNVx1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGMycsXG4gICAgICAgICAgc2VydmljZXM6ICdcdTMwRDdcdTMwRURcdTMwRDVcdTMwQTdcdTMwQzNcdTMwQjdcdTMwRTdcdTMwQ0FcdTMwRUJcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjknLCBjbG91ZDogJ1x1MzBBRlx1MzBFOVx1MzBBNlx1MzBDOVx1MzBCNVx1MzBGQ1x1MzBEM1x1MzBCOScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbGlzdF9wcmljZTogeyBsYWJlbDogJ1x1NUI5QVx1NEZBMScgfSxcbiAgICAgIGNvc3Q6IHsgbGFiZWw6ICdcdTMwQjNcdTMwQjlcdTMwQzgnIH0sXG4gICAgICBza3U6IHsgbGFiZWw6ICdTS1UnIH0sXG4gICAgICBpc19hY3RpdmU6IHsgbGFiZWw6ICdcdTY3MDlcdTUyQjknIH0sXG4gICAgICBwcm9kdWN0X21hbmFnZXI6IHsgbGFiZWw6ICdcdTMwRDdcdTMwRURcdTMwQzBcdTMwQUZcdTMwQzhcdTMwREVcdTMwQ0RcdTMwRkNcdTMwQjhcdTMwRTNcdTMwRkMnIH0sXG4gICAgICBpbWFnZTogeyBsYWJlbDogJ1x1ODhGRFx1NTRDMVx1NzUzQlx1NTBDRicgfSxcbiAgICAgIGRhdGFzaGVldDogeyBsYWJlbDogJ1x1MzBDN1x1MzBGQ1x1MzBCRlx1MzBCN1x1MzBGQ1x1MzBDOCcgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX3Byb2R1Y3RzOiB7IGxhYmVsOiAnXHU1MTY4XHU4OEZEXHU1NEMxJyB9LFxuICAgICAgcHJvZHVjdF9jYXRhbG9nOiB7IGxhYmVsOiAnXHU4OEZEXHU1NEMxXHUzMEFCXHUzMEJGXHUzMEVEXHUzMEIwJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1ODhGRFx1NTRDMVx1NjBDNVx1NTgzMScgfSxcbiAgICAgIHByaWNpbmc6IHsgbGFiZWw6ICdcdTRGQTFcdTY4M0MnIH0sXG4gICAgICBtZXRhZGF0YTogeyBsYWJlbDogJ1x1OTVBMlx1OTAyM1x1OENDN1x1NjU5OScgfSxcbiAgICAgIC8vIHByb2R1Y3Qudmlldy50cyBcdTMwNkVcdTMwRDVcdTMwQTlcdTMwRkNcdTMwRTBcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTU0MEQgKCMxMTAwKVxuICAgICAgcHJvZHVjdF9pbmZvOiB7IGxhYmVsOiAnXHU4OEZEXHU1NEMxXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgcHJpY2luZ19pbmZvOiB7IGxhYmVsOiAnXHU0RkExXHU2ODNDJyB9LFxuICAgICAgbWVkaWE6IHsgbGFiZWw6ICdcdTMwRTFcdTMwQzdcdTMwQTNcdTMwQTInIH0sXG4gICAgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5zZXJ2aWNlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUFwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5zZXJ2aWNlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IGFjdGl2aXR5QWN0aW9ucyB9IGZyb20gJy4vX3NoYXJlZCc7XG5cbi8qKlxuICogXHU2NUU1XHU2NzJDXHU4QTlFIChqYS1KUCkgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBTRVJWSUNFIGZhbWlseTpcbiAqIHBvc3Qtc2FsZSBzdXBwb3J0IFx1MjAxNCBjYXNlcyBhbmQgdGhlIGtub3dsZWRnZSB0aGF0IGRlZmxlY3RzIHRoZW0uXG4gKlxuICogUm9zdGVyOiBgY3JtX2Nhc2VgLCBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCwgYGNybV9hcnRpY2xlX2ZlZWRiYWNrYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXJ2aWNlOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fY2FzZToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgcmVzb2x1dGlvbl9yZXF1aXJlZF9mb3JfY2xvc2VkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTMwOTJcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTMwNTlcdTMwOEJcdTMwNkJcdTMwNkZcdTg5RTNcdTZDN0FcdTUxODVcdTVCQjlcdTMwNENcdTVGQzVcdTg5ODFcdTMwNjdcdTMwNTknLFxuICAgICAgfSxcbiAgICAgIGVzY2FsYXRpb25fcmVhc29uX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTMwOTJcdTMwQThcdTMwQjlcdTMwQUJcdTMwRUNcdTMwRkNcdTMwQjdcdTMwRTdcdTMwRjNcdTMwNTlcdTMwOEJcdTMwNkJcdTMwNkZcdTc0MDZcdTc1MzFcdTMwNENcdTVGQzVcdTg5ODFcdTMwNjdcdTMwNTknLFxuICAgICAgfSxcbiAgICAgIGNhc2Vfc3RhdHVzX3Byb2dyZXNzaW9uOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTcxMjFcdTUyQjlcdTMwNkFcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjlcdTkwNzdcdTc5RkJcdTMwNjdcdTMwNTknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5JyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1MzBCMVx1MzBGQ1x1MzBCOScsXG4gICAgZGVzY3JpcHRpb246ICdcdTMwQUJcdTMwQjlcdTMwQkZcdTMwREVcdTMwRkNcdTMwQjVcdTMwRERcdTMwRkNcdTMwQzhcdTMwNkVcdTMwQjFcdTMwRkNcdTMwQjlcdTMwNjhcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjlcdTRGOURcdTk4M0MnLFxuICAgIGZpZWxkczoge1xuICAgICAgY2FzZV9udW1iZXI6IHsgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTc1NkFcdTUzRjcnIH0sXG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU0RUY2XHU1NDBEJyB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ1x1ODg2OFx1NzkzQVx1NTQwRCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU4QUFDXHU2NjBFJyB9LFxuICAgICAgY3JtX2FjY291bnQ6IHsgbGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDgnIH0sXG4gICAgICBjcm1fY29udGFjdDogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNScgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBuZXc6ICdcdTY1QjBcdTg5OEYnLCBpbl9wcm9ncmVzczogJ1x1NUJGRVx1NUZEQ1x1NEUyRCcsXG4gICAgICAgICAgd2FpdGluZ19jdXN0b21lcjogJ1x1OTg2N1x1NUJBMlx1MzA2RVx1NTZERVx1N0I1NFx1NUY4NVx1MzA2MScsIHdhaXRpbmdfc3VwcG9ydDogJ1x1MzBCNVx1MzBERFx1MzBGQ1x1MzBDOFx1MzA2RVx1NTZERVx1N0I1NFx1NUY4NVx1MzA2MScsXG4gICAgICAgICAgZXNjYWxhdGVkOiAnXHUzMEE4XHUzMEI5XHUzMEFCXHUzMEVDXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzXHU2RTA4JywgcmVzb2x2ZWQ6ICdcdTg5RTNcdTZDN0FcdTZFMDgnLCBjbG9zZWQ6ICdcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTZFMDgnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHByaW9yaXR5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU1MTJBXHU1MTQ4XHU1RUE2JyxcbiAgICAgICAgb3B0aW9uczogeyBsb3c6ICdcdTRGNEUnLCBtZWRpdW06ICdcdTRFMkQnLCBoaWdoOiAnXHU5QUQ4JywgY3JpdGljYWw6ICdcdTkxQ0RcdTU5MjcnIH0sXG4gICAgICB9LFxuICAgICAgcHJpb3JpdHlfcmFuazogeyBsYWJlbDogJ1x1NTEyQVx1NTE0OFx1NUVBNlx1MzBFOVx1MzBGM1x1MzBBRicgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTdBMkVcdTUyMjUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcXVlc3Rpb246ICdcdTU1NEZcdTMwNDRcdTU0MDhcdTMwOEZcdTMwNUInLCBwcm9ibGVtOiAnXHU0RTBEXHU1MTc3XHU1NDA4JyxcbiAgICAgICAgICBmZWF0dXJlX3JlcXVlc3Q6ICdcdTZBNUZcdTgwRkRcdTg5ODFcdTY3MUInLCBidWc6ICdcdTMwRDBcdTMwQjAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG9yaWdpbjoge1xuICAgICAgICBsYWJlbDogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1NzY3QVx1NzUxRlx1NTE0MycsXG4gICAgICAgIG9wdGlvbnM6IHsgZW1haWw6ICdcdTMwRTFcdTMwRkNcdTMwRUInLCBwaG9uZTogJ1x1OTZGQlx1OEE3MScsIHdlYjogJ1x1MzBBNlx1MzBBN1x1MzBENicsIGNoYXQ6ICdcdTMwQzFcdTMwRTNcdTMwQzNcdTMwQzgnLCBzb2NpYWxfbWVkaWE6ICdcdTMwQkRcdTMwRkNcdTMwQjdcdTMwRTNcdTMwRUJcdTMwRTFcdTMwQzdcdTMwQTNcdTMwQTInIH0sXG4gICAgICB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTYyQzVcdTVGNTNcdTgwMDUnIH0sXG4gICAgICBjbG9zZWRfZGF0ZTogeyBsYWJlbDogJ1x1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1NjVFNScgfSxcbiAgICAgIGZpcnN0X3Jlc3BvbnNlX2RhdGU6IHsgbGFiZWw6ICdcdTUyMURcdTU2REVcdTVGRENcdTdCNTRcdTY1RTUnIH0sXG4gICAgICByZXNvbHV0aW9uX3RpbWVfaG91cnM6IHsgbGFiZWw6ICdcdTg5RTNcdTZDN0FcdTY2NDJcdTk1OTNcdUZGMDhcdTY2NDJcdTk1OTNcdUZGMDknIH0sXG4gICAgICBzbGFfZHVlX2RhdGU6IHsgbGFiZWw6ICdTTEFcdTY3MUZcdTk2NTAnLCBoZWxwOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDZFXHU1MTJBXHU1MTQ4XHU1RUE2XHUzMDY4XHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZFXHU5ODY3XHU1QkEyXHUzMEU5XHUzMEYzXHUzMEFGXHUzMDRCXHUzMDg5XHU4QTJEXHU1QjlBXHUzMDU1XHUzMDhDXHUzMDAxXHU2NkE2XHU2NjQyXHU5NTkzXHUzMDY3XHU2NTcwXHUzMDQ4XHUzMDdFXHUzMDU5XHUzMDAyXHU1OTFDXHU5NTkzXHUzMEZCXHU5MDMxXHU2NzJCXHUzMEZCXHU3OTVEXHU2NUU1XHUzMDgyXHUzMDU5XHUzMDc5XHUzMDY2XHU1NDJCXHUzMDdFXHUzMDhDXHUzMDdFXHUzMDU5XHUzMDAyJyB9LFxuICAgICAgaXNfc2xhX3Zpb2xhdGVkOiB7IGxhYmVsOiAnU0xBXHU5MDU1XHU1M0NEJyB9LFxuICAgICAgaXNfZXNjYWxhdGVkOiB7IGxhYmVsOiAnXHUzMEE4XHUzMEI5XHUzMEFCXHUzMEVDXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzXHU2RTA4JyB9LFxuICAgICAgZXNjYWxhdGVkX2RhdGU6IHsgbGFiZWw6ICdcdTMwQThcdTMwQjlcdTMwQUJcdTMwRUNcdTMwRkNcdTMwQjdcdTMwRTdcdTMwRjNcdTY1RTUnIH0sXG4gICAgICBlc2NhbGF0aW9uX3JlYXNvbjogeyBsYWJlbDogJ1x1MzBBOFx1MzBCOVx1MzBBQlx1MzBFQ1x1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGM1x1NzQwNlx1NzUzMScgfSxcbiAgICAgIHJlc29sdXRpb246IHsgbGFiZWw6ICdcdTg5RTNcdTZDN0FcdTUxODVcdTVCQjknIH0sXG4gICAgICByZXNvbHZlZF9ieV9hcnRpY2xlOiB7IGxhYmVsOiAnXHU4OUUzXHU2QzdBXHUzMDU3XHUzMDVGXHUzMENBXHUzMEVDXHUzMEMzXHUzMEI4XHU4QTE4XHU0RThCJywgaGVscDogJ1x1MzA1M1x1MzA2RVx1MzBCMVx1MzBGQ1x1MzBCOVx1MzA5Mlx1ODlFM1x1NkM3QVx1MzA1N1x1MzA1Rlx1MzBDQVx1MzBFQ1x1MzBDM1x1MzBCOFx1OEExOFx1NEU4QiBcdTIwMTQgXHU5MDM4XHUzMDg5XHUzMDU3XHU3Mzg3XHUzMDZFXHU2MzA3XHU2QTE5XHUzMDAyJyB9LFxuICAgICAgaW50ZXJuYWxfbm90ZXM6IHsgbGFiZWw6ICdcdTUxODVcdTkwRThcdTMwRTFcdTMwRTInLCBoZWxwOiAnXHU5ODY3XHU1QkEyXHUzMDZCXHUzMDZGXHU4ODY4XHU3OTNBXHUzMDU1XHUzMDhDXHUzMDZBXHUzMDQ0XHU3OTNFXHU1MTg1XHU1NDExXHUzMDUxXHUzMEUxXHUzMEUyJyB9LFxuICAgICAgaXNfY2xvc2VkOiB7IGxhYmVsOiAnXHUzMEFGXHUzMEVEXHUzMEZDXHUzMEJBXHU2RTA4JyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfY2FzZXM6IHsgbGFiZWw6ICdcdTUxNjhcdTMwQjFcdTMwRkNcdTMwQjknIH0sXG4gICAgICBjYXNlX3dvcmtmbG93OiB7IGxhYmVsOiAnXHUzMEI1XHUzMEZDXHUzMEQzXHUzMEI5XHUzMEQ1XHUzMEVEXHUzMEZDJyB9LFxuICAgICAgc2xhX2NhbGVuZGFyOiB7IGxhYmVsOiAnU0xBIFx1MzBBQlx1MzBFQ1x1MzBGM1x1MzBDMFx1MzBGQycgfSxcbiAgICAgIGNhc2VfdGltZWxpbmU6IHsgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTMwQkZcdTMwQTRcdTMwRTBcdTMwRTlcdTMwQTRcdTMwRjMnIH0sXG4gICAgICB1bmFzc2lnbmVkX3RyaWFnZToge1xuICAgICAgICBsYWJlbDogJ1x1NjcyQVx1NTI3Mlx1MzA4QVx1NUY1M1x1MzA2NiBcdTIwMTQgXHUzMEM4XHUzMEVBXHUzMEEyXHUzMEZDXHUzMEI4JyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnXHUzMEM4XHUzMEVBXHUzMEEyXHUzMEZDXHUzMEI4XHU1Rjg1XHUzMDYxXHUzMDZGXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzJyxcbiAgICAgICAgICBtZXNzYWdlOiAnXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZFXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDZCXHU2MjQwXHU2NzA5XHU4MDA1XHUzMDRDXHUzMDQ0XHUzMDdFXHUzMDU5XHUzMDAyXHU2MjQwXHU2NzA5XHU4MDA1XHUzMDZFXHUzMDZBXHUzMDQ0XHUzMEIxXHUzMEZDXHUzMEI5XHUzMDZGXHUzMDUzXHUzMDUzXHUzMDZCXHU4ODY4XHU3OTNBXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU5IFx1MjAxNCBcdTkwMUFcdTVFMzhcdTMwNkZcdTMwMDFcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjlcdTMwQThcdTMwRkNcdTMwQjhcdTMwQTdcdTMwRjNcdTMwQzhcdTMwNkVcdTgwNzdcdTRGNERcdTMwOTJcdThBQjBcdTMwODJcdTRGRERcdTYzMDFcdTMwNTdcdTMwNjZcdTMwNDRcdTMwNkFcdTMwNDRcdTk1OTNcdTMwNkJcdTVDNEFcdTMwNDRcdTMwNUYgV2ViLXRvLUNhc2UgXHUzMDZFXHU5MDAxXHU0RkUxXHUzMDY3XHUzMDU5XHUzMDAyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlc2NhbGF0ZWRfY2FzZXM6IHsgbGFiZWw6ICdcdTMwQThcdTMwQjlcdTMwQUJcdTMwRUNcdTMwRkNcdTMwQzhcdTMwNTdcdTMwNUZcdTMwQjFcdTMwRkNcdTMwQjknIH0sXG4gICAgICBteV9vcGVuX2Nhc2VzOiB7IGxhYmVsOiAnXHU3OUMxXHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHUzMEIxXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgc2xhX2F0X3Jpc2s6IHsgbGFiZWw6ICdcdTIzRjAgU0xBIFx1MzBFQVx1MzBCOVx1MzBBRlx1MzA0Mlx1MzA4QScgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgLy8gY2FzZS52aWV3LnRzIFx1MzA2RVx1MzBENVx1MzBBOVx1MzBGQ1x1MzBFMFx1MzBCQlx1MzBBRlx1MzBCN1x1MzBFN1x1MzBGM1x1NTQwRCAoIzExMDApXHUzMDAyXG4gICAgICBjYXNlOiB7IGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgaG93X2Nhbl93ZV9oZWxwOiB7IGxhYmVsOiAnXHUzMDY5XHUzMDZFXHUzMDg4XHUzMDQ2XHUzMDZBXHUzMDU0XHU3NTI4XHU0RUY2XHUzMDY3XHUzMDU3XHUzMDg3XHUzMDQ2XHUzMDRCXHVGRjFGJyB9LFxuICAgICAgLy8gXHUzMEFBXHUzMEQ2XHUzMEI4XHUzMEE3XHUzMEFGXHUzMEM4XHU1QjlBXHU3RkE5XHUzMDZFXHUzMEJCXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHUzMEFEXHUzMEZDXHVGRjA4Y2FzZS5vYmplY3QudHNcdUZGMDlcdTIwMTQgXHU1MTY1XHU1MjlCXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEUwXHUzMDY4XHUzMDAxXG4gICAgICAvLyBcdTMwNTNcdTMwOENcdTMwODlcdTMwNkVcdTMwQjBcdTMwRUJcdTMwRkNcdTMwRDdcdTMwOTJcdTUzQzJcdTcxNjdcdTMwNTlcdTMwOEJcdThBNzNcdTdEMzBcdTMwREFcdTMwRkNcdTMwQjhcdTMwNkVcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdUZGMDgjOTcwXHVGRjA5XHUzMDY3XHU0RjdGXHU3NTI4XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1NjBDNVx1NTgzMScgfSxcbiAgICAgIG9yaWdpbjogeyBsYWJlbDogJ1x1NzY3QVx1NzUxRlx1NTE0M1x1MzBGQlx1NjMyRlx1MzA4QVx1NTIwNlx1MzA1MScgfSxcbiAgICAgIHNsYTogeyBsYWJlbDogJ1NMQVx1MzBGQlx1NTEyQVx1NTE0OFx1NUVBNicgfSxcbiAgICAgIHJlc29sdXRpb246IHsgbGFiZWw6ICdcdTg5RTNcdTZDN0EnIH0sXG4gICAgICBlc2NhbGF0aW9uOiB7IGxhYmVsOiAnXHUzMEE4XHUzMEI5XHUzMEFCXHUzMEVDXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzJyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnXHUzMEI3XHUzMEI5XHUzMEM2XHUzMEUwJyB9LFxuICAgIH0sXG4gICAgX2FjdGlvbnM6IHtcbiAgICAgIC4uLmFjdGl2aXR5QWN0aW9ucyxcbiAgICAgIGVzY2FsYXRlX2Nhc2U6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTMwOTJcdTMwQThcdTMwQjlcdTMwQUJcdTMwRUNcdTMwRkNcdTMwQzgnLFxuICAgICAgICBjb25maXJtVGV4dDogJ1x1MzA1M1x1MzA2RVx1MzBCMVx1MzBGQ1x1MzBCOVx1MzA5Mlx1MzBBOFx1MzBCOVx1MzBBQlx1MzBFQ1x1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGM1x1MzBDMVx1MzBGQ1x1MzBFMFx1MzA3OFx1NUYxNVx1MzA0RFx1N0Q5OVx1MzA0RVx1MzA3RVx1MzA1OVx1MzAwMlx1N0Q5QVx1ODg0Q1x1MzA1N1x1MzA3RVx1MzA1OVx1MzA0Qlx1RkYxRicsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDkyXHUzMEE4XHUzMEI5XHUzMEFCXHUzMEVDXHUzMEZDXHUzMEM4XHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHVGRjAxJyxcbiAgICAgIH0sXG4gICAgICBjbG9zZV9jYXNlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDkyXHUzMEFGXHUzMEVEXHUzMEZDXHUzMEJBJyxcbiAgICAgICAgY29uZmlybVRleHQ6ICdcdTMwNTNcdTMwNkVcdTMwQjFcdTMwRkNcdTMwQjlcdTMwOTJcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTMwNTdcdTMwNjZcdTMwODJcdTMwODhcdTMwOERcdTMwNTdcdTMwNDRcdTMwNjdcdTMwNTlcdTMwNEJcdUZGMUYnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA5Mlx1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1RkYwMScsXG4gICAgICB9LFxuICAgICAgY2xhaW1fY2FzZToge1xuICAgICAgICBsYWJlbDogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA5Mlx1NUYxNVx1MzA0RFx1NTNEN1x1MzA1MVx1MzA4QicsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDkyXHU1RjE1XHUzMDREXHU1M0Q3XHUzMDUxXHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyXHU2MkM1XHU1RjUzXHU4MDA1XHUzMDZGXHUzMDQyXHUzMDZBXHUzMDVGXHUzMDY3XHUzMDU5XHUzMDAyJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX2tub3dsZWRnZV9hcnRpY2xlOiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBwdWJsaXNoZWRfcmVxdWlyZXNfYm9keToge1xuICAgICAgICBtZXNzYWdlOiAnXHU2NzJDXHU2NTg3XHUzMDZFXHUzMDZBXHUzMDQ0XHU4QTE4XHU0RThCXHUzMDZGXHU1MTZDXHU5NThCXHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDAyJyxcbiAgICAgIH0sXG4gICAgICBwdWJsaXNoZWRfcmVxdWlyZXNfc3VtbWFyeToge1xuICAgICAgICBtZXNzYWdlOiAnXHU1MTZDXHU5NThCXHU2RTA4XHUzMDdGXHUzMDZFXHU4QTE4XHU0RThCXHUzMDZCXHUzMDZGXHUzMDAxXHU2OTFDXHU3RDIyXHU3RDUwXHU2NzlDXHUzMDY4IEFJIFx1MzA2RVx1NUYxNVx1NzUyOFx1MzA2RVx1MzA1Rlx1MzA4MVx1MzA2Qlx1Njk4Mlx1ODk4MVx1MzA5Mlx1OEExOFx1OEYwOVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdcdTMwQ0FcdTMwRUNcdTMwQzNcdTMwQjhcdThBMThcdTRFOEInLFxuICAgIHBsdXJhbExhYmVsOiAnXHUzMENBXHUzMEVDXHUzMEMzXHUzMEI4XHUzMEQ5XHUzMEZDXHUzMEI5JyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1OTg2N1x1NUJBMlx1MzA2OFx1MzBBOFx1MzBGQ1x1MzBCOFx1MzBBN1x1MzBGM1x1MzBDOFx1MzA0Q1x1NTE4RFx1NTIyOVx1NzUyOFx1MzA2N1x1MzA0RFx1MzA4Qlx1NTZERVx1N0I1NFx1MzA2OFx1MzBDRlx1MzBBNlx1MzBDNFx1MzBGQ1x1MzBBQ1x1MzBBNFx1MzBDOScsXG4gICAgZmllbGRzOiB7XG4gICAgICBhcnRpY2xlX251bWJlcjogeyBsYWJlbDogJ1x1OEExOFx1NEU4Qlx1NzU2QVx1NTNGNycgfSxcbiAgICAgIHRpdGxlOiB7IGxhYmVsOiAnXHUzMEJGXHUzMEE0XHUzMEM4XHUzMEVCJyB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ1x1ODg2OFx1NzkzQVx1NTQwRCcgfSxcbiAgICAgIHN1bW1hcnk6IHsgbGFiZWw6ICdcdTg5ODFcdTdEMDQnLCBoZWxwOiAnXHU2OTFDXHU3RDIyXHU3RDUwXHU2NzlDXHUzMDg0IEFJIFx1MzA2RVx1NUYxNVx1NzUyOFx1MzA2Qlx1ODg2OFx1NzkzQVx1MzA1NVx1MzA4Q1x1MzA4QiAxIFx1NkJCNVx1ODQzRFx1MzA2RVx1ODk4MVx1N0QwNFx1MzAwMicgfSxcbiAgICAgIGJvZHk6IHsgbGFiZWw6ICdcdTY3MkNcdTY1ODcnLCBoZWxwOiAnXHU4QTE4XHU0RThCXHUzMDZFXHU2NzJDXHU2NTg3XHVGRjA4TWFya2Rvd25cdUZGMDlcdTMwMDInIH0sXG4gICAgICBjYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ1x1MzBBQlx1MzBDNlx1MzBCNFx1MzBFQScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQ6ICdcdTMwNkZcdTMwNThcdTMwODFcdTMwNkInLCBob3dfdG86ICdcdTMwQ0ZcdTMwQTZcdTMwQzRcdTMwRkMnLFxuICAgICAgICAgIHRyb3VibGVzaG9vdGluZzogJ1x1MzBDOFx1MzBFOVx1MzBENlx1MzBFQlx1MzBCN1x1MzBFNVx1MzBGQ1x1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMCcsIGJpbGxpbmc6ICdcdThBQ0JcdTZDNDJcdTMwNjhcdTY1OTlcdTkxRDEnLCBhcGk6ICdBUEkgXHUzMDY4XHU5MDIzXHU2NDNBJyxcbiAgICAgICAgICByZWxlYXNlX25vdGVzOiAnXHUzMEVBXHUzMEVBXHUzMEZDXHUzMEI5XHUzMENFXHUzMEZDXHUzMEM4JywgcG9saWN5OiAnXHUzMEREXHUzMEVBXHUzMEI3XHUzMEZDJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0YWdzOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEJGXHUzMEIwJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGF1dGg6ICdcdThBOERcdThBM0MnLCBzc286ICdTU08nLCBtb2JpbGU6ICdcdTMwRTJcdTMwRDBcdTMwQTRcdTMwRUInLCBlbWFpbDogJ1x1MzBFMVx1MzBGQ1x1MzBFQicsXG4gICAgICAgICAgcmVwb3J0czogJ1x1MzBFQ1x1MzBERFx1MzBGQ1x1MzBDOCcsIHBlcmZvcm1hbmNlOiAnXHUzMEQxXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMERFXHUzMEYzXHUzMEI5JyxcbiAgICAgICAgICBkYXRhX2ltcG9ydDogJ1x1MzBDN1x1MzBGQ1x1MzBCRlx1MzBBNFx1MzBGM1x1MzBERFx1MzBGQ1x1MzBDOCcsIHdlYmhvb2tzOiAnV2ViaG9vaycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5JyxcbiAgICAgICAgb3B0aW9uczogeyBkcmFmdDogJ1x1NEUwQlx1NjZGOFx1MzA0RCcsIGluX3JldmlldzogJ1x1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQ1x1NEUyRCcsIHB1Ymxpc2hlZDogJ1x1NTE2Q1x1OTU4Qlx1NkUwOFx1MzA3RicsIGFyY2hpdmVkOiAnXHUzMEEyXHUzMEZDXHUzMEFCXHUzMEE0XHUzMEQ2JyB9LFxuICAgICAgfSxcbiAgICAgIGF1ZGllbmNlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1QkZFXHU4QzYxJyxcbiAgICAgICAgaGVscDogJ1x1NTE2Q1x1OTU4Qlx1OEExOFx1NEU4Qlx1MzA2Rlx1MzBBQlx1MzBCOVx1MzBCRlx1MzBERVx1MzBGQ1x1MzBERFx1MzBGQ1x1MzBCRlx1MzBFQlx1MzA2Qlx1ODg2OFx1NzkzQVx1MzA1NVx1MzA4Q1x1MzAwMVx1NzkzRVx1NTE4NVx1OEExOFx1NEU4Qlx1MzA2Rlx1MzBBOFx1MzBGQ1x1MzBCOFx1MzBBN1x1MzBGM1x1MzBDOFx1MzA2RVx1MzA3Rlx1MzA0Q1x1OTVCMlx1ODlBN1x1MzA2N1x1MzA0RFx1MzA3RVx1MzA1OVx1MzAwMicsXG4gICAgICAgIG9wdGlvbnM6IHsgcHVibGljOiAnXHU1MTZDXHU5NThCJywgaW50ZXJuYWw6ICdcdTc5M0VcdTUxODUnIH0sXG4gICAgICB9LFxuICAgICAgbGFuZ3VhZ2U6IHtcbiAgICAgICAgbGFiZWw6ICdcdThBMDBcdThBOUUnLFxuICAgICAgICBvcHRpb25zOiB7IGVuOiAnXHU4MkYxXHU4QTlFJywgemhfY246ICdcdTdDMjFcdTRGNTNcdTVCNTdcdTRFMkRcdTU2RkRcdThBOUUnLCBlc19lczogJ1x1MzBCOVx1MzBEQVx1MzBBNFx1MzBGM1x1OEE5RScsIGphX2pwOiAnXHU2NUU1XHU2NzJDXHU4QTlFJyB9LFxuICAgICAgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnXHU2MjQwXHU2NzA5XHU4MDA1JyB9LFxuICAgICAgcmVsYXRlZF90b19jYXNlOiB7IGxhYmVsOiAnXHU1MTQzXHUzMDZFXHUzMEIxXHUzMEZDXHUzMEI5JywgaGVscDogJ1x1MzA1M1x1MzA2RVx1OEExOFx1NEU4Qlx1MzA2RVx1NTE0M1x1MzA2Qlx1MzA2QVx1MzA2M1x1MzA1Rlx1MzBCMVx1MzBGQ1x1MzBCOVx1RkYwOFx1NEVGQlx1NjEwRlx1RkYwOVx1MzAwMicgfSxcbiAgICAgIHB1Ymxpc2hlZF9hdDogeyBsYWJlbDogJ1x1NTE2Q1x1OTU4Qlx1NjVFNVx1NjY0MicgfSxcbiAgICAgIGxhc3RfcmV2aWV3ZWRfYXQ6IHsgbGFiZWw6ICdcdTY3MDBcdTdENDJcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkMnIH0sXG4gICAgICBoZWxwZnVsX2NvdW50OiB7IGxhYmVsOiAnXHU1Rjc5XHUzMDZCXHU3QUNCXHUzMDYzXHUzMDVGJywgaGVscDogJ2NybV9hcnRpY2xlX2ZlZWRiYWNrIFx1MzA0Qlx1MzA4OVx1NTE4RFx1OTZDNlx1OEEwOFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1OVx1MzAwMlx1NjI0Qlx1NTE2NVx1NTI5Qlx1MzA2Rlx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMicgfSxcbiAgICAgIG5vdF9oZWxwZnVsX2NvdW50OiB7IGxhYmVsOiAnXHU1Rjc5XHUzMDZCXHU3QUNCXHUzMDVGXHUzMDZBXHUzMDRCXHUzMDYzXHUzMDVGJywgaGVscDogJ2NybV9hcnRpY2xlX2ZlZWRiYWNrIFx1MzA0Qlx1MzA4OVx1NTE4RFx1OTZDNlx1OEEwOFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1OVx1MzAwMlx1NjI0Qlx1NTE2NVx1NTI5Qlx1MzA2Rlx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMicgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2FydGljbGVzOiB7IGxhYmVsOiAnXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZFXHU4QTE4XHU0RThCJyB9LFxuICAgICAgcHVibGlzaGVkX2FydGljbGVzOiB7IGxhYmVsOiAnXHU1MTZDXHU5NThCXHU2RTA4XHUzMDdGJyB9LFxuICAgICAgbXlfZHJhZnRzOiB7IGxhYmVsOiAnXHU4MUVBXHU1MjA2XHUzMDZFXHU0RTBCXHU2NkY4XHUzMDREJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1OEExOFx1NEU4Qlx1NjBDNVx1NTgzMScgfSxcbiAgICAgIGNvbnRlbnQ6IHsgbGFiZWw6ICdcdTMwQjNcdTMwRjNcdTMwQzZcdTMwRjNcdTMwQzQnIH0sXG4gICAgICB0YXhvbm9teTogeyBsYWJlbDogJ1x1NTIwNlx1OTg1RScgfSxcbiAgICAgIG1ldHJpY3M6IHsgbGFiZWw6ICdcdTUyMjlcdTc1MjhcdTcyQjZcdTZDQzEnIH0sXG4gICAgICBlbmdhZ2VtZW50OiB7IGxhYmVsOiAnXHU1MjI5XHU3NTI4XHU3MkI2XHU2Q0MxJyB9LFxuICAgICAgLy8ga25vd2xlZGdlX2FydGljbGUudmlldy50cyBcdTMwNkVcdTMwRDVcdTMwQTlcdTMwRkNcdTMwRTBcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTU0MEQgKCMxMTAwKVxuICAgICAgYXJ0aWNsZTogeyBsYWJlbDogJ1x1OEExOFx1NEU4QicgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7XG4gICAgICBtYXJrX2FydGljbGVfaGVscGZ1bDoge1xuICAgICAgICBsYWJlbDogJ1x1NUY3OVx1MzA2Qlx1N0FDQlx1MzA2M1x1MzA1RicsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUzMDBDXHU1Rjc5XHUzMDZCXHU3QUNCXHUzMDYzXHUzMDVGXHUzMDBEXHUzMDY4XHUzMDU3XHUzMDY2XHU4QTE4XHU5MzMyXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyXHUzMDQyXHUzMDhBXHUzMDRDXHUzMDY4XHUzMDQ2XHUzMDU0XHUzMDU2XHUzMDQ0XHUzMDdFXHUzMDU5XHUzMDAyJyxcbiAgICAgIH0sXG4gICAgICBtYXJrX2FydGljbGVfbm90X2hlbHBmdWw6IHtcbiAgICAgICAgbGFiZWw6ICdcdTVGNzlcdTMwNkJcdTdBQ0JcdTMwNUZcdTMwNkFcdTMwNEJcdTMwNjNcdTMwNUYnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1MzAwQ1x1NUY3OVx1MzA2Qlx1N0FDQlx1MzA1Rlx1MzA2QVx1MzA0Qlx1MzA2M1x1MzA1Rlx1MzAwRFx1MzA2OFx1MzA1N1x1MzA2Nlx1OEExOFx1OTMzMlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMlx1MzA0Mlx1MzA4QVx1MzA0Q1x1MzA2OFx1MzA0Nlx1MzA1NFx1MzA1Nlx1MzA0NFx1MzA3RVx1MzA1OVx1MzAwMicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9hcnRpY2xlX2ZlZWRiYWNrOiB7XG4gICAgbGFiZWw6ICdcdThBMThcdTRFOEJcdTMwRDVcdTMwQTNcdTMwRkNcdTMwQzlcdTMwRDBcdTMwQzNcdTMwQUYnLFxuICAgIHBsdXJhbExhYmVsOiAnXHU4QTE4XHU0RThCXHUzMEQ1XHUzMEEzXHUzMEZDXHUzMEM5XHUzMEQwXHUzMEMzXHUzMEFGJyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1MzBDQVx1MzBFQ1x1MzBDM1x1MzBCOFx1OEExOFx1NEU4Qlx1MzA2Qlx1NUJGRVx1MzA1OVx1MzA4Qlx1OEFBRFx1ODAwNVx1MzA2RVx1MzAwQ1x1NUY3OVx1MzA2Qlx1N0FDQlx1MzA2M1x1MzA1RiAvIFx1NUY3OVx1MzA2Qlx1N0FDQlx1MzA1Rlx1MzA2QVx1MzA0Qlx1MzA2M1x1MzA1Rlx1MzAwRFx1OEE1NVx1NEZBMScsXG4gICAgZmllbGRzOiB7XG4gICAgICBmZWVkYmFja19udW1iZXI6IHsgbGFiZWw6ICdcdTMwRDVcdTMwQTNcdTMwRkNcdTMwQzlcdTMwRDBcdTMwQzNcdTMwQUZcdTc1NkFcdTUzRjcnIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1OEFBRFx1ODAwNScgfSxcbiAgICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogeyBsYWJlbDogJ1x1OEExOFx1NEU4QicsIGhlbHA6ICdcdTMwNTNcdTMwNkVcdTMwRDVcdTMwQTNcdTMwRkNcdTMwQzlcdTMwRDBcdTMwQzNcdTMwQUZcdTMwNkVcdTVCRkVcdThDNjFcdTMwNjhcdTMwNkFcdTMwOEJcdTMwQ0FcdTMwRUNcdTMwQzNcdTMwQjhcdThBMThcdTRFOEJcdTMwMDInIH0sXG4gICAgICB2ZXJkaWN0OiB7XG4gICAgICAgIGxhYmVsOiAnXHU4QTU1XHU0RkExJyxcbiAgICAgICAgb3B0aW9uczogeyBoZWxwZnVsOiAnXHU1Rjc5XHUzMDZCXHU3QUNCXHUzMDYzXHUzMDVGJywgbm90X2hlbHBmdWw6ICdcdTVGNzlcdTMwNkJcdTdBQ0JcdTMwNUZcdTMwNkFcdTMwNEJcdTMwNjNcdTMwNUYnIH0sXG4gICAgICB9LFxuICAgICAgY29tbWVudDogeyBsYWJlbDogJ1x1MzBCM1x1MzBFMVx1MzBGM1x1MzBDOCcsIGhlbHA6ICdcdThBNTVcdTRGQTFcdTMwNkVcdTc0MDZcdTc1MzFcdUZGMDhcdTRFRkJcdTYxMEZcdUZGMDkgXHUyMDE0IFx1OEExOFx1NEU4Qlx1MzA2RVx1NEY1Q1x1NjIxMFx1ODAwNVx1MzA0Q1x1OEFBRFx1MzA3Rlx1MzA3RVx1MzA1OVx1MzAwMicgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTMwRDVcdTMwQTNcdTMwRkNcdTMwQzlcdTMwRDBcdTMwQzNcdTMwQUYnIH0sXG4gICAgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5hY3Rpdml0eS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlBcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQL29iamVjdHMuYWN0aXZpdHkudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgT2JqZWN0VHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuLyoqXG4gKiBcdTY1RTVcdTY3MkNcdThBOUUgKGphLUpQKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIEFDVElWSVRZIGZhbWlseTpcbiAqIHRoZSBpbnRlcmFjdGlvbiBsb2cgXHUyMDE0IHRhc2tzLCBldmVudHMsIGFuZCB3aG8gYXR0ZW5kZWQuXG4gKlxuICogUm9zdGVyOiBgY3JtX3Rhc2tgLCBgY3JtX2V2ZW50YCwgYGNybV9ldmVudF9hdHRlbmRlZWAuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAudHNgLlxuICovXG5jb25zdCByZWxhdGVkVG9UeXBlT3B0aW9ucyA9IHtcbiAgY3JtX2FjY291bnQ6ICdcdTUzRDZcdTVGMTVcdTUxNDgnLCBjcm1fY29udGFjdDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNScsIGNybV9vcHBvcnR1bml0eTogJ1x1NTU0Nlx1OEFDNycsXG4gIGNybV9sZWFkOiAnXHUzMEVBXHUzMEZDXHUzMEM5JywgY3JtX2Nhc2U6ICdcdTMwQjFcdTMwRkNcdTMwQjknLFxufTtcblxuZXhwb3J0IGNvbnN0IGFjdGl2aXR5OiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fdGFzazoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgY29tcGxldGVkX2RhdGVfcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOVx1MzA0Q1x1MzAwQ1x1NUI4Q1x1NEU4Nlx1MzAwRFx1MzA2RVx1NTgzNFx1NTQwOFx1MzA2Rlx1NUI4Q1x1NEU4Nlx1NjVFNVx1MzA0Q1x1NUZDNVx1ODk4MVx1MzA2N1x1MzA1OScsXG4gICAgICB9LFxuICAgICAgcmVjdXJyZW5jZV9maWVsZHNfcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1N0U3MFx1MzA4QVx1OEZENFx1MzA1N1x1MzBCRlx1MzBCOVx1MzBBRlx1MzA2Qlx1MzA2Rlx1N0U3MFx1MzA4QVx1OEZENFx1MzA1N1x1N0EyRVx1NTIyNVx1MzA0Q1x1NUZDNVx1ODk4MVx1MzA2N1x1MzA1OScsXG4gICAgICB9LFxuICAgICAgcmVsYXRlZF90b19yZXF1aXJlZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU5NUEyXHU5MDIzXHUzMEVDXHUzMEIzXHUzMEZDXHUzMEM5XHUzMDkyXHU1QzExXHUzMDZBXHUzMDRGXHUzMDY4XHUzMDgyIDEgXHU0RUY2XHU5MDc4XHU2MjlFXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1MzBCRlx1MzBCOVx1MzBBRicsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTMwQkZcdTMwQjlcdTMwQUYnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU2RDNCXHU1MkQ1XHUzMDY4IFRvRG8nLFxuICAgIGZpZWxkczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1x1NEVGNlx1NTQwRCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU4QUFDXHU2NjBFJyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5vdF9zdGFydGVkOiAnXHU2NzJBXHU3NzQwXHU2MjRCJywgaW5fcHJvZ3Jlc3M6ICdcdTkwMzJcdTg4NENcdTRFMkQnLCB3YWl0aW5nOiAnXHU1Rjg1XHU2QTVGXHU0RTJEJyxcbiAgICAgICAgICBjb21wbGV0ZWQ6ICdcdTVCOENcdTRFODYnLCBkZWZlcnJlZDogJ1x1NEZERFx1NzU1OScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcHJpb3JpdHk6IHtcbiAgICAgICAgbGFiZWw6ICdcdTUxMkFcdTUxNDhcdTVFQTYnLFxuICAgICAgICBvcHRpb25zOiB7IGxvdzogJ1x1NEY0RScsIG5vcm1hbDogJ1x1OTAxQVx1NUUzOCcsIGhpZ2g6ICdcdTlBRDgnLCB1cmdlbnQ6ICdcdTdEQ0FcdTYwMjUnIH0sXG4gICAgICB9LFxuICAgICAgcHJpb3JpdHlfcmFuazogeyBsYWJlbDogJ1x1NTEyQVx1NTE0OFx1NUVBNlx1MzBFOVx1MzBGM1x1MzBBRicgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwQkZcdTMwQjlcdTMwQUZcdTdBMkVcdTUyMjUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY2FsbDogJ1x1OTZGQlx1OEE3MScsIGVtYWlsOiAnXHUzMEUxXHUzMEZDXHUzMEVCJywgbWVldGluZzogJ1x1NEYxQVx1OEI3MCcsXG4gICAgICAgICAgZm9sbG93X3VwOiAnXHUzMEQ1XHUzMEE5XHUzMEVEXHUzMEZDXHUzMEEyXHUzMEMzXHUzMEQ3JywgZGVtbzogJ1x1MzBDN1x1MzBFMicsIG90aGVyOiAnXHUzMDVEXHUzMDZFXHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBkdWVfZGF0ZTogeyBsYWJlbDogJ1x1NjcxRlx1OTY1MCcgfSxcbiAgICAgIHJlbWluZGVyX2RhdGU6IHsgbGFiZWw6ICdcdTMwRUFcdTMwREVcdTMwQTRcdTMwRjNcdTMwQzBcdTMwRkNcdTY1RTVcdTY2NDInIH0sXG4gICAgICByZW1pbmRlcl9zZW50OiB7IGxhYmVsOiAnXHUzMEVBXHUzMERFXHUzMEE0XHUzMEYzXHUzMEMwXHUzMEZDXHU5MDAxXHU0RkUxXHU2RTA4XHUzMDdGJyB9LFxuICAgICAgY29tcGxldGVkX2RhdGU6IHsgbGFiZWw6ICdcdTVCOENcdTRFODZcdTY1RTUnIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fdHlwZToge1xuICAgICAgICBsYWJlbDogJ1x1OTVBMlx1OTAyM1x1MzBBQVx1MzBENlx1MzBCOFx1MzBBN1x1MzBBRlx1MzBDOFx1N0EyRVx1NTIyNScsXG4gICAgICAgIG9wdGlvbnM6IHsgLi4ucmVsYXRlZFRvVHlwZU9wdGlvbnMgfSxcbiAgICAgIH0sXG4gICAgICByZWxhdGVkX3RvX2FjY291bnQ6IHsgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTUzRDZcdTVGMTVcdTUxNDgnIH0sXG4gICAgICByZWxhdGVkX3RvX2NvbnRhY3Q6IHsgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDUnIH0sXG4gICAgICByZWxhdGVkX3RvX29wcG9ydHVuaXR5OiB7IGxhYmVsOiAnXHU5NUEyXHU5MDIzXHU1NTQ2XHU4QUM3JyB9LFxuICAgICAgcmVsYXRlZF90b19sZWFkOiB7IGxhYmVsOiAnXHU5NUEyXHU5MDIzXHUzMEVBXHUzMEZDXHUzMEM5JyB9LFxuICAgICAgcmVsYXRlZF90b19jYXNlOiB7IGxhYmVsOiAnXHU5NUEyXHU5MDIzXHUzMEIxXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgaXNfcmVjdXJyaW5nOiB7IGxhYmVsOiAnXHU3RTcwXHUzMDhBXHU4RkQ0XHUzMDU3XHUzMEJGXHUzMEI5XHUzMEFGJyB9LFxuICAgICAgcmVjdXJyZW5jZV90eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3RTcwXHUzMDhBXHU4RkQ0XHUzMDU3XHU3QTJFXHU1MjI1JyxcbiAgICAgICAgb3B0aW9uczogeyBkYWlseTogJ1x1NkJDRVx1NjVFNScsIHdlZWtseTogJ1x1NkJDRVx1OTAzMScsIG1vbnRobHk6ICdcdTZCQ0VcdTY3MDgnLCB5ZWFybHk6ICdcdTZCQ0VcdTVFNzQnIH0sXG4gICAgICB9LFxuICAgICAgcmVjdXJyZW5jZV9pbnRlcnZhbDogeyBsYWJlbDogJ1x1N0U3MFx1MzA4QVx1OEZENFx1MzA1N1x1OTU5M1x1OTY5NCcgfSxcbiAgICAgIHJlY3VycmVuY2VfZW5kX2RhdGU6IHsgbGFiZWw6ICdcdTdFNzBcdTMwOEFcdThGRDRcdTMwNTdcdTdENDJcdTRFODZcdTY1RTUnIH0sXG4gICAgICBpc19jb21wbGV0ZWQ6IHsgbGFiZWw6ICdcdTVCOENcdTRFODZcdTZFMDgnIH0sXG4gICAgICBpc19vdmVyZHVlOiB7IGxhYmVsOiAnXHU2NzFGXHU5NjUwXHU4RDg1XHU5MDRFJyB9LFxuICAgICAgcHJvZ3Jlc3NfcGVyY2VudDogeyBsYWJlbDogJ1x1OTAzMlx1NjM1N1x1RkYwOCVcdUZGMDknIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF90YXNrczogeyBsYWJlbDogJ1x1NTE2OFx1MzBCRlx1MzBCOVx1MzBBRicgfSxcbiAgICAgIHRhc2tfYm9hcmQ6IHsgbGFiZWw6ICdcdTMwQkZcdTMwQjlcdTMwQUZcdTMwRENcdTMwRkNcdTMwQzknIH0sXG4gICAgICB0YXNrX2NhbGVuZGFyOiB7IGxhYmVsOiAnXHUzMEJGXHUzMEI5XHUzMEFGXHUzMEFCXHUzMEVDXHUzMEYzXHUzMEMwXHUzMEZDJyB9LFxuICAgICAgdGFza19nYW50dDogeyBsYWJlbDogJ1x1NUI5Rlx1ODg0Q1x1OEEwOFx1NzUzQicgfSxcbiAgICAgIHRhc2tfdGltZWxpbmU6IHsgbGFiZWw6ICdcdTVERTVcdTY1NzBcdTMwQkZcdTMwQTRcdTMwRTBcdTMwRTlcdTMwQTRcdTMwRjMnIH0sXG4gICAgICBteV9vcGVuX3Rhc2tzOiB7IGxhYmVsOiAnXHU3OUMxXHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHUzMEJGXHUzMEI5XHUzMEFGJyB9LFxuICAgICAgdG9kYXlzX3Rhc2tzOiB7IGxhYmVsOiAnXHVEODNEXHVEQ0M1IFx1NzlDMVx1MzA2RVx1NTEyQVx1NTE0OFx1MzBCRlx1MzBCOVx1MzBBRicgfSxcbiAgICAgIG92ZXJkdWVfdGFza3M6IHsgbGFiZWw6ICdcdTIzRjAgXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHUzMEJGXHUzMEI5XHUzMEFGIFx1MDBCNyBcdTY3MUZcdTk2NTBcdThEODVcdTkwNEVcdTMwNENcdTk1NzdcdTMwNDRcdTk4MDYnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnXHUzMEJGXHUzMEI5XHUzMEFGXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgc2NoZWR1bGluZzogeyBsYWJlbDogJ1x1MzBCOVx1MzBCMVx1MzBCOFx1MzBFNVx1MzBGQ1x1MzBFQicgfSxcbiAgICAgIHJlbGF0ZWQ6IHsgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzknIH0sXG4gICAgICByZWN1cnJlbmNlOiB7IGxhYmVsOiAnXHU3RTcwXHUzMDhBXHU4RkQ0XHUzMDU3JyB9LFxuICAgICAgZWZmb3J0OiB7IGxhYmVsOiAnXHU5MDMyXHU2MzU3XHUzMEZCXHU1REU1XHU2NTcwJyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnXHUzMEI3XHUzMEI5XHUzMEM2XHUzMEUwJyB9LFxuICAgICAgLy8gdGFzay52aWV3LnRzIFx1MzA2RVx1MzBENVx1MzBBOVx1MzBGQ1x1MzBFMFx1MzBCQlx1MzBBRlx1MzBCN1x1MzBFN1x1MzBGM1x1NTQwRCAoIzExMDApXG4gICAgICB0YXNrOiB7IGxhYmVsOiAnXHUzMEJGXHUzMEI5XHUzMEFGJyB9LFxuICAgICAgcmVsYXRlZF9yZWNvcmRzOiB7IGxhYmVsOiAnXHU5NUEyXHU5MDIzXHUzMEVDXHUzMEIzXHUzMEZDXHUzMEM5JyB9LFxuICAgICAgcmVjdXJyZW5jZV9hbmRfZWZmb3J0OiB7IGxhYmVsOiAnXHU3RTcwXHUzMDhBXHU4RkQ0XHUzMDU3XHUzMDY4XHU1REU1XHU2NTcwJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9ldmVudDoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgZW5kX2FmdGVyX3N0YXJ0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTdENDJcdTRFODZcdTY2NDJcdTUyM0JcdTMwNkZcdTk1OEJcdTU5Q0JcdTY2NDJcdTUyM0JcdTMwODhcdTMwOEFcdTVGOENcdTMwNjdcdTMwNDJcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTknLFxuICAgICAgfSxcbiAgICAgIHJlbGF0ZWRfdG9fcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1OTVBMlx1OTAyM1x1MzBFQ1x1MzBCM1x1MzBGQ1x1MzBDOVx1MzA5Mlx1NUMxMVx1MzA2QVx1MzA0Rlx1MzA2OFx1MzA4MiAxIFx1NEVGNlx1OTA3OFx1NjI5RVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdcdTMwQTRcdTMwRDlcdTMwRjNcdTMwQzgnLFxuICAgIHBsdXJhbExhYmVsOiAnXHUzMEE0XHUzMEQ5XHUzMEYzXHUzMEM4JyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1OTg2N1x1NUJBMlx1MzA2OFx1MzA2RVx1NEYxQVx1OEI3MFx1MzBGQlx1OTZGQlx1OEE3MVx1MzA2QVx1MzA2OVx1MzA2RVx1NEU4OFx1NUI5QVx1MzA1NVx1MzA4Q1x1MzA1Rlx1NUJGRVx1OEE3MScsXG4gICAgZmllbGRzOiB7XG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU0RUY2XHU1NDBEJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdThBQUNcdTY2MEUnIH0sXG4gICAgICB0eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEE0XHUzMEQ5XHUzMEYzXHUzMEM4XHU3QTJFXHU1MjI1JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1lZXRpbmc6ICdcdTRGMUFcdThCNzAnLCBjYWxsOiAnXHU5NkZCXHU4QTcxJywgZGVtbzogJ1x1MzBDN1x1MzBFMicsXG4gICAgICAgICAgd2ViaW5hcjogJ1x1MzBBNlx1MzBBN1x1MzBEM1x1MzBDQVx1MzBGQycsIG9uc2l0ZV92aXNpdDogJ1x1OEEyQVx1NTU0RicsIG90aGVyOiAnXHUzMDVEXHUzMDZFXHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcGxhbm5lZDogJ1x1NEU4OFx1NUI5QScsIGhlbGQ6ICdcdTVCOUZcdTY1QkRcdTZFMDhcdTMwN0YnLCBjYW5jZWxsZWQ6ICdcdTMwQURcdTMwRTNcdTMwRjNcdTMwQkJcdTMwRUInLCBub19zaG93OiAnXHU3MTIxXHU2NUFEXHU2QjIwXHU1RTJEJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHN0YXJ0X2RhdGV0aW1lOiB7IGxhYmVsOiAnXHU5NThCXHU1OUNCJyB9LFxuICAgICAgZW5kX2RhdGV0aW1lOiB7IGxhYmVsOiAnXHU3RDQyXHU0RTg2JyB9LFxuICAgICAgYWxsX2RheTogeyBsYWJlbDogJ1x1N0Q0Mlx1NjVFNVx1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOCcgfSxcbiAgICAgIGR1cmF0aW9uX21pbnV0ZXM6IHsgbGFiZWw6ICdcdTYyNDBcdTg5ODFcdTY2NDJcdTk1OTNcdUZGMDhcdTUyMDZcdUZGMDknIH0sXG4gICAgICBsb2NhdGlvbjogeyBsYWJlbDogJ1x1NTgzNFx1NjI0MCcsIGhlbHA6ICdcdTRGMUFcdThCNzBcdTVCQTRcdTMwRkJcdTRGNEZcdTYyNDBcdTMwRkJcdTRGMUFcdThCNzBcdTMwRUFcdTMwRjNcdTMwQUYnIH0sXG4gICAgICByZWxhdGVkX3RvX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzlcdTdBMkVcdTUyMjUnLFxuICAgICAgICBvcHRpb25zOiB7IC4uLnJlbGF0ZWRUb1R5cGVPcHRpb25zIH0sXG4gICAgICB9LFxuICAgICAgcmVsYXRlZF90b19hY2NvdW50OiB7IGxhYmVsOiAnXHU5NUEyXHU5MDIzXHU1M0Q2XHU1RjE1XHU1MTQ4JyB9LFxuICAgICAgcmVsYXRlZF90b19jb250YWN0OiB7IGxhYmVsOiAnXHU5NUEyXHU5MDIzXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1JyB9LFxuICAgICAgcmVsYXRlZF90b19vcHBvcnR1bml0eTogeyBsYWJlbDogJ1x1OTVBMlx1OTAyM1x1NTU0Nlx1OEFDNycgfSxcbiAgICAgIHJlbGF0ZWRfdG9fbGVhZDogeyBsYWJlbDogJ1x1OTVBMlx1OTAyM1x1MzBFQVx1MzBGQ1x1MzBDOScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY2FzZTogeyBsYWJlbDogJ1x1OTVBMlx1OTAyM1x1MzBCMVx1MzBGQ1x1MzBCOScgfSxcbiAgICAgIG91dGNvbWVfbm90ZXM6IHsgbGFiZWw6ICdcdTdENTBcdTY3OUNcdTMwRTFcdTMwRTInLCBoZWxwOiAnXHU1NDA4XHU2MTBGXHU0RThCXHU5ODA1XHUzMDY4XHU2QjIxXHUzMDZFXHUzMEEyXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfZXZlbnRzOiB7IGxhYmVsOiAnXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZFXHUzMEE0XHUzMEQ5XHUzMEYzXHUzMEM4JyB9LFxuICAgICAgZXZlbnRfY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTMwQTRcdTMwRDlcdTMwRjNcdTMwQzhcdTMwQUJcdTMwRUNcdTMwRjNcdTMwQzBcdTMwRkMnIH0sXG4gICAgICBldmVudF90aW1lbGluZTogeyBsYWJlbDogJ1x1MzBDMVx1MzBGQ1x1MzBFMFx1MzBCOVx1MzBCMVx1MzBCOFx1MzBFNVx1MzBGQ1x1MzBFQicgfSxcbiAgICAgIG15X2V2ZW50czogeyBsYWJlbDogJ1x1MzBERVx1MzBBNFx1MzBBQlx1MzBFQ1x1MzBGM1x1MzBDMFx1MzBGQycgfSxcbiAgICAgIHVwY29taW5nX2V2ZW50czogeyBsYWJlbDogJ1x1RDgzRFx1RENDNSBcdTk1OEJcdTUwQUNcdTRFODhcdTVCOUEgXHUwMEI3IFx1NzZGNFx1OEZEMVx1OTgwNicgfSxcbiAgICAgIGhlbGRfZXZlbnRzOiB7IGxhYmVsOiAnXHUyNzA1IFx1NUJGRVx1OEE3MVx1NUM2NVx1NkI3NCcgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTMwQTRcdTMwRDlcdTMwRjNcdTMwQzhcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBzY2hlZHVsZTogeyBsYWJlbDogJ1x1MzBCOVx1MzBCMVx1MzBCOFx1MzBFNVx1MzBGQ1x1MzBFQicgfSxcbiAgICAgIHJlbGF0ZWQ6IHsgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzknIH0sXG4gICAgICBvdXRjb21lOiB7IGxhYmVsOiAnXHU1QjlGXHU2NUJEXHU3RDUwXHU2NzlDJyB9LFxuICAgICAgLy8gZXZlbnQudmlldy50cyBcdTMwNkVcdTMwRDVcdTMwQTlcdTMwRkNcdTMwRTBcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTU0MEQgKCMxMTAwKVxuICAgICAgZXZlbnQ6IHsgbGFiZWw6ICdcdTMwQTRcdTMwRDlcdTMwRjNcdTMwQzgnIH0sXG4gICAgICByZWxhdGVkX3JlY29yZHM6IHsgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzknIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX2V2ZW50X2F0dGVuZGVlOiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBhdHRlbmRlZV9yZXNvbHZlczoge1xuICAgICAgICBtZXNzYWdlOiAnXHU1M0MyXHU1MkEwXHU4MDA1XHUzMDZGXHU1M0MyXHU1MkEwXHU4MDA1XHU3QTJFXHU1MjI1XHUzMDRDXHU3OTNBXHUzMDU5XHU3NkY4XHU2MjRCXHUzMDkyXHU2MzA3XHU1QjlBXHUzMDU5XHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5XHUzMDAyXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDZFXHU1ODM0XHU1NDA4XHUzMDZGXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDkyXHUzMDAxXHU3OTNFXHU1OTE2XHUzMDZFXHU1ODM0XHU1NDA4XHUzMDZGXHU3OTNFXHU1OTE2XHU1M0MyXHU1MkEwXHU4MDA1XHU1NDBEXHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0JyxcbiAgICAgIH0sXG4gICAgICBhdHRlbmRlZV90eXBlX2V4Y2x1c2l2ZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU1M0MyXHU1MkEwXHU4MDA1XHUzMDRDXHU2MzA3XHU1QjlBXHUzMDY3XHUzMDREXHUzMDhCXHU3NkY4XHU2MjRCXHUzMDZGIDEgXHUzMDY0XHUzMDYwXHUzMDUxXHUzMDY3XHUzMDU5XHUzMDAyXHU1M0MyXHU1MkEwXHU4MDA1XHU3QTJFXHU1MjI1XHUzMDRDXHU3OTNBXHUzMDU1XHUzMDZBXHUzMDQ0XHU5ODA1XHU3NkVFXHUzMDZGXHUzMDU5XHUzMDc5XHUzMDY2XHU3QTdBXHUzMDZCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOFx1NTNDMlx1NTJBMFx1ODAwNScsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTMwQTRcdTMwRDlcdTMwRjNcdTMwQzhcdTUzQzJcdTUyQTBcdTgwMDUnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHUzMEE0XHUzMEQ5XHUzMEYzXHUzMEM4XHUzMDZCXHU2MkRCXHU1Rjg1XHUzMDU1XHUzMDhDXHUzMDVGXHUzMDAxXHUzMDdFXHUzMDVGXHUzMDZGXHU1MUZBXHU1RTJEXHUzMDU3XHUzMDVGXHU0RUJBJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGF0dGVuZGVlX251bWJlcjogeyBsYWJlbDogJ1x1NTNDMlx1NTJBMFx1ODAwNVx1NzU2QVx1NTNGNycgfSxcbiAgICAgIGNybV9ldmVudDogeyBsYWJlbDogJ1x1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOCcgfSxcbiAgICAgIGF0dGVuZGVlX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTUzQzJcdTUyQTBcdTgwMDVcdTdBMkVcdTUyMjUnLFxuICAgICAgICBvcHRpb25zOiB7IGNvbnRhY3Q6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDUnLCBsZWFkOiAnXHUzMEVBXHUzMEZDXHUzMEM5JywgdXNlcjogJ1x1NzkzRVx1NTE4NVx1MzBFNlx1MzBGQ1x1MzBCNlx1MzBGQycsIGV4dGVybmFsOiAnXHU3OTNFXHU1OTE2XHUzMEIyXHUzMEI5XHUzMEM4JyB9LFxuICAgICAgfSxcbiAgICAgIGNybV9jb250YWN0OiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1JywgaGVscDogJ1x1NTNDMlx1NTJBMFx1ODAwNVx1MzA0Q1x1NjVFMlx1NUI1OFx1MzA2RVx1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNVx1MzA2N1x1MzA0Mlx1MzA4Qlx1NTgzNFx1NTQwOFx1MzA2Qlx1OEEyRFx1NUI5QVx1MzA1N1x1MzA3RVx1MzA1OScgfSxcbiAgICAgIGNybV9sZWFkOiB7IGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5JywgaGVscDogJ1x1NTNDMlx1NTJBMFx1ODAwNVx1MzA0Q1x1MzA3RVx1MzA2MFx1NTkwOVx1NjNEQlx1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA2QVx1MzA0NFx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2N1x1MzA0Mlx1MzA4Qlx1NTgzNFx1NTQwOFx1MzA2Qlx1OEEyRFx1NUI5QVx1MzA1N1x1MzA3RVx1MzA1OScgfSxcbiAgICAgIHN5c191c2VyOiB7IGxhYmVsOiAnXHU3OTNFXHU1MTg1XHUzMEU2XHUzMEZDXHUzMEI2XHUzMEZDJywgaGVscDogJ1x1NTNDMlx1NTJBMFx1ODAwNVx1MzA0Q1x1NzkzRVx1NTE4NVx1MzA2RVx1NTQwQ1x1NTBEQVx1MzA2N1x1MzA0Mlx1MzA4Qlx1NTgzNFx1NTQwOFx1MzA2Qlx1OEEyRFx1NUI5QVx1MzA1N1x1MzA3RVx1MzA1OScgfSxcbiAgICAgIGV4dGVybmFsX25hbWU6IHsgbGFiZWw6ICdcdTc5M0VcdTU5MTZcdTUzQzJcdTUyQTBcdTgwMDUnLCBoZWxwOiAnQ1JNIFx1MzA2RVx1MzA2OVx1MzA2RVx1MzBBQVx1MzBENlx1MzBCOFx1MzBBN1x1MzBBRlx1MzBDOFx1MzA2Qlx1MzA4Mlx1NUI1OFx1NTcyOFx1MzA1N1x1MzA2QVx1MzA0NFx1NTNDMlx1NTJBMFx1ODAwNVx1MzA2RVx1NkMwRlx1NTQwRCBcdTIwMTQgXHU1M0MyXHU1MkEwXHU4MDA1XHU3QTJFXHU1MjI1XHUzMDRDXHUzMDBDXHU3OTNFXHU1OTE2XHUzMEIyXHUzMEI5XHUzMEM4XHUzMDBEXHUzMDZFXHUzMDY4XHUzMDREXHUzMDZCXHU4QTJEXHU1QjlBXHUzMDU3XHUzMDdFXHUzMDU5JyB9LFxuICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgbGFiZWw6ICdcdTU2REVcdTdCNTQnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbm9fcmVzcG9uc2U6ICdcdTY3MkFcdTU2REVcdTdCNTQnLCBhY2NlcHRlZDogJ1x1NjI3Rlx1OEFGRScsXG4gICAgICAgICAgZGVjbGluZWQ6ICdcdThGOUVcdTkwMDAnLCB0ZW50YXRpdmU6ICdcdTRFRUVcdTYyN0ZcdThBRkUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGlzX29yZ2FuaXplcjogeyBsYWJlbDogJ1x1NEUzQlx1NTBBQ1x1ODAwNScgfSxcbiAgICAgIGludml0ZWRfZGF0ZTogeyBsYWJlbDogJ1x1NjJEQlx1NUY4NVx1NjVFNVx1NjY0MicgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2V2ZW50X2F0dGVuZGVlczogeyBsYWJlbDogJ1x1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOFx1NTNDMlx1NTJBMFx1ODAwNScgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTUzQzJcdTUyQTBcdTgwMDUnIH0sXG4gICAgICByZXNwb25zZTogeyBsYWJlbDogJ1x1NjJEQlx1NUY4NScgfSxcbiAgICAgIC8vIGV2ZW50X2F0dGVuZGVlLnZpZXcudHMgXHUzMDZFXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEUwXHUzMEJCXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHU1NDBEICgjMTEwMClcbiAgICAgIGF0dGVuZGVlOiB7IGxhYmVsOiAnXHU1M0MyXHU1MkEwXHU4MDA1JyB9LFxuICAgICAgaW52aXRhdGlvbjogeyBsYWJlbDogJ1x1NjJEQlx1NUY4NScgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9vYmplY3RzLm1hcmtldGluZy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlBcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQL29iamVjdHMubWFya2V0aW5nLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbi8qKlxuICogXHU2NUU1XHU2NzJDXHU4QTlFIChqYS1KUCkgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBNQVJLRVRJTkcgZmFtaWx5OlxuICogZGVtYW5kIGdlbmVyYXRpb24gXHUyMDE0IGNhbXBhaWducyBhbmQgdGhlaXIgbWVtYmVyc2hpcC5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fY2FtcGFpZ25gLCBgY3JtX2NhbXBhaWduX21lbWJlcmAuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAudHNgLlxuICovXG5leHBvcnQgY29uc3QgbWFya2V0aW5nOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fY2FtcGFpZ246IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGVuZF9hZnRlcl9zdGFydDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU3RDQyXHU0RTg2XHU2NUU1XHUzMDZGXHU5NThCXHU1OUNCXHU2NUU1XHUzMDg4XHUzMDhBXHU1RjhDXHUzMDY3XHUzMDQyXHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5JyxcbiAgICAgIH0sXG4gICAgICBhY3R1YWxfY29zdF93aXRoaW5fYnVkZ2V0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTVCOUZcdTdFM0VcdTMwQjNcdTMwQjlcdTMwQzhcdTMwNENcdTRFODhcdTdCOTdcdTMwQjNcdTMwQjlcdTMwQzhcdTMwOTJcdThEODVcdTMwNDhcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNTknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzJyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGMycsXG4gICAgZGVzY3JpcHRpb246ICdcdTMwREVcdTMwRkNcdTMwQjFcdTMwQzZcdTMwQTNcdTMwRjNcdTMwQjBcdTMwQURcdTMwRTNcdTMwRjNcdTMwREFcdTMwRkNcdTMwRjNcdTMwNjhcdTY1QkRcdTdCNTYnLFxuICAgIGZpZWxkczoge1xuICAgICAgY2FtcGFpZ25fY29kZTogeyBsYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzBCM1x1MzBGQ1x1MzBDOScgfSxcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdcdTMwQURcdTMwRTNcdTMwRjNcdTMwREFcdTMwRkNcdTMwRjNcdTU0MEQnIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnXHU4ODY4XHU3OTNBXHU1NDBEJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdThBQUNcdTY2MEUnIH0sXG4gICAgICB0eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHU3QTJFXHU1MjI1JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGVtYWlsOiAnXHUzMEUxXHUzMEZDXHUzMEVCJywgd2ViaW5hcjogJ1x1MzBBNlx1MzBBN1x1MzBEM1x1MzBDQVx1MzBGQycsIHRyYWRlX3Nob3c6ICdcdTVDNTVcdTc5M0FcdTRGMUEnLFxuICAgICAgICAgIGNvbmZlcmVuY2U6ICdcdTMwQUJcdTMwRjNcdTMwRDVcdTMwQTFcdTMwRUNcdTMwRjNcdTMwQjknLCBkaXJlY3RfbWFpbDogJ1x1MzBDMFx1MzBBNFx1MzBFQ1x1MzBBRlx1MzBDOFx1MzBFMVx1MzBGQ1x1MzBFQicsXG4gICAgICAgICAgc29jaWFsX21lZGlhOiAnXHUzMEJEXHUzMEZDXHUzMEI3XHUzMEUzXHUzMEVCXHUzMEUxXHUzMEM3XHUzMEEzXHUzMEEyJywgY29udGVudDogJ1x1MzBCM1x1MzBGM1x1MzBDNlx1MzBGM1x1MzBDNFx1MzBERVx1MzBGQ1x1MzBCMVx1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMCcsXG4gICAgICAgICAgcGFydG5lcjogJ1x1MzBEMVx1MzBGQ1x1MzBDOFx1MzBDQVx1MzBGQ1x1MzBERVx1MzBGQ1x1MzBCMVx1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY2hhbm5lbDoge1xuICAgICAgICBsYWJlbDogJ1x1NEUzQlx1ODk4MVx1MzBDMVx1MzBFM1x1MzBDRFx1MzBFQicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkaWdpdGFsOiAnXHUzMEM3XHUzMEI4XHUzMEJGXHUzMEVCJywgc29jaWFsOiAnXHUzMEJEXHUzMEZDXHUzMEI3XHUzMEUzXHUzMEVCJywgZW1haWw6ICdcdTMwRTFcdTMwRkNcdTMwRUInLFxuICAgICAgICAgIGV2ZW50czogJ1x1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOCcsIHBhcnRuZXI6ICdcdTMwRDFcdTMwRkNcdTMwQzhcdTMwQ0FcdTMwRkMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwbGFubmluZzogJ1x1OEEwOFx1NzUzQlx1NEUyRCcsIGluX3Byb2dyZXNzOiAnXHU1QjlGXHU2NUJEXHU0RTJEJyxcbiAgICAgICAgICBjb21wbGV0ZWQ6ICdcdTVCOENcdTRFODYnLCBhYm9ydGVkOiAnXHU0RTJEXHU2QjYyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGFydF9kYXRlOiB7IGxhYmVsOiAnXHU5NThCXHU1OUNCXHU2NUU1JyB9LFxuICAgICAgZW5kX2RhdGU6IHsgbGFiZWw6ICdcdTdENDJcdTRFODZcdTY1RTUnIH0sXG4gICAgICBidWRnZXRlZF9jb3N0OiB7IGxhYmVsOiAnXHU0RTg4XHU3Qjk3XHUzMEIzXHUzMEI5XHUzMEM4JyB9LFxuICAgICAgYWN0dWFsX2Nvc3Q6IHsgbGFiZWw6ICdcdTVCOUZcdTMwQjNcdTMwQjlcdTMwQzgnIH0sXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiB7IGxhYmVsOiAnXHU0RTg4XHU2RTJDXHU1OEYyXHU0RTBBJyB9LFxuICAgICAgYWN0dWFsX3JldmVudWU6IHsgbGFiZWw6ICdcdTVCOUZcdTUzQ0VcdTc2Q0EnIH0sXG4gICAgICB0YXJnZXRfc2l6ZTogeyBsYWJlbDogJ1x1MzBCRlx1MzBGQ1x1MzBCMlx1MzBDM1x1MzBDOFx1ODk4Rlx1NkEyMScsIGhlbHA6ICdcdTVCRkVcdThDNjFcdTMwNjhcdTMwNTlcdTMwOEJcdTMwRUFcdTMwRkNcdTMwQzlcdTMwRkJcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTMwNkVcdTc2RUVcdTZBMTlcdTRFRjZcdTY1NzAnIH0sXG4gICAgICBudW1fc2VudDogeyBsYWJlbDogJ1x1OTAwMVx1NEZFMVx1NjU3MCcgfSxcbiAgICAgIG51bV9yZXNwb25zZXM6IHsgbGFiZWw6ICdcdTVGRENcdTdCNTRcdTY1NzAnIH0sXG4gICAgICBudW1fbGVhZHM6IHsgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTY1NzAnIH0sXG4gICAgICBudW1fY29udmVydGVkX2xlYWRzOiB7IGxhYmVsOiAnXHU1OTA5XHU2M0RCXHU2RTA4XHUzMEVBXHUzMEZDXHUzMEM5XHU2NTcwJyB9LFxuICAgICAgbnVtX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdcdTRGNUNcdTYyMTBcdTZFMDhcdTU1NDZcdThBQzdcdTY1NzAnIH0sXG4gICAgICBudW1fd29uX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdcdTUzRDdcdTZDRThcdTU1NDZcdThBQzcnIH0sXG4gICAgICByZXNwb25zZV9yYXRlOiB7IGxhYmVsOiAnXHU1RkRDXHU3QjU0XHU3Mzg3XHVGRjA4JVx1RkYwOScgfSxcbiAgICAgIHJvaTogeyBsYWJlbDogJ1JPSVx1RkYwOCVcdUZGMDknIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIGxhbmRpbmdfcGFnZV91cmw6IHsgbGFiZWw6ICdcdTMwRTlcdTMwRjNcdTMwQzdcdTMwQTNcdTMwRjNcdTMwQjBcdTMwREFcdTMwRkNcdTMwQjgnIH0sXG4gICAgICBpc19hY3RpdmU6IHsgbGFiZWw6ICdcdTY3MDlcdTUyQjknIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9jYW1wYWlnbnM6IHsgbGFiZWw6ICdcdTUxNjhcdTMwQURcdTMwRTNcdTMwRjNcdTMwREFcdTMwRkNcdTMwRjMnIH0sXG4gICAgICBjYW1wYWlnbl9nYW50dDogeyBsYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1NjVFNVx1N0EwQicgfSxcbiAgICAgIGNhbXBhaWduX2NhbGVuZGFyOiB7IGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHUzMEFCXHUzMEVDXHUzMEYzXHUzMEMwXHUzMEZDJyB9LFxuICAgICAgY2FtcGFpZ25fdGltZWxpbmU6IHsgbGFiZWw6ICdcdTMwREVcdTMwRkNcdTMwQjFcdTMwQzZcdTMwQTNcdTMwRjNcdTMwQjBcdTMwQkZcdTMwQTRcdTMwRTBcdTMwRTlcdTMwQTRcdTMwRjMnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgc2NoZWR1bGU6IHsgbGFiZWw6ICdcdTMwQjlcdTMwQjFcdTMwQjhcdTMwRTVcdTMwRkNcdTMwRUInIH0sXG4gICAgICBidWRnZXQ6IHsgbGFiZWw6ICdcdTRFODhcdTdCOTdcdTMwRkJST0knIH0sXG4gICAgICBtZXRyaWNzOiB7IGxhYmVsOiAnXHU1QjlGXHU3RTNFJyB9LFxuICAgICAgYXNzaWdubWVudDogeyBsYWJlbDogJ1x1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIGFzc2V0czogeyBsYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzBBMlx1MzBCQlx1MzBDM1x1MzBDOCcgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7XG4gICAgICBlbnJvbGxfbGVhZHM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwRTFcdTMwRjNcdTMwRDBcdTMwRkNcdTMwOTJcdTRFMDBcdTYyRUNcdTc2N0JcdTkzMzInLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1NUJGRVx1OEM2MVx1MzBFMVx1MzBGM1x1MzBEMFx1MzBGQ1x1MzA5Mlx1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzA2Qlx1NzY3Qlx1OTMzMlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9jYW1wYWlnbl9tZW1iZXI6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGxlYWRfb3JfY29udGFjdF9yZXF1aXJlZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHUzMEUxXHUzMEYzXHUzMEQwXHUzMEZDXHUzMDZGXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDdFXHUzMDVGXHUzMDZGXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDZFXHUzMDQ0XHUzMDVBXHUzMDhDXHUzMDRCXHUzMDkyXHU1M0MyXHU3MTY3XHUzMDU5XHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzBFMVx1MzBGM1x1MzBEMFx1MzBGQycsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTMwQURcdTMwRTNcdTMwRjNcdTMwREFcdTMwRkNcdTMwRjNcdTMwRTFcdTMwRjNcdTMwRDBcdTMwRkMnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHUzMDZFXHU1QkZFXHU4QzYxXHUzMDY4XHUzMDZBXHUzMDYzXHUzMDVGXHUzMEVBXHUzMEZDXHUzMEM5XHUzMEZCXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDY4XHUzMDVEXHUzMDZFXHU1M0NEXHU1RkRDXHU3MkI2XHU2Q0MxJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIG1lbWJlcl9udW1iZXI6IHsgbGFiZWw6ICdcdTMwRTFcdTMwRjNcdTMwRDBcdTMwRkNcdTc1NkFcdTUzRjcnIH0sXG4gICAgICBjcm1fY2FtcGFpZ246IHsgbGFiZWw6ICdcdTMwQURcdTMwRTNcdTMwRjNcdTMwREFcdTMwRkNcdTMwRjMnIH0sXG4gICAgICBjcm1fbGVhZDogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOScsIGhlbHA6ICdcdTc2N0JcdTkzMzJcdTY2NDJcdTcwQjlcdTMwNjdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNjBcdTMwNjNcdTMwNUZcdTMwRTFcdTMwRjNcdTMwRDBcdTMwRkNcdTMwNkJcdThBMkRcdTVCOUFcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTknIH0sXG4gICAgICBjcm1fY29udGFjdDogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNScsIGhlbHA6ICdcdTY1RTJcdTVCNThcdTMwNkVcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTMwNjdcdTMwNDJcdTMwOEJcdTMwRTFcdTMwRjNcdTMwRDBcdTMwRkNcdTMwNkJcdThBMkRcdTVCOUFcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTknIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgc2VudDogJ1x1OTAwMVx1NEZFMVx1NkUwOCcsIHJlc3BvbmRlZDogJ1x1NUZEQ1x1N0I1NFx1NkUwOCcsXG4gICAgICAgICAgY29udmVydGVkOiAnXHU1OTA5XHU2M0RCXHU2RTA4JywgdW5zdWJzY3JpYmVkOiAnXHU5MTREXHU0RkUxXHU1MDVDXHU2QjYyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhZGRlZF9kYXRlOiB7IGxhYmVsOiAnXHU4RkZEXHU1MkEwXHU2NUU1XHU2NjQyJyB9LFxuICAgICAgcmVzcG9uc2VfZGF0ZTogeyBsYWJlbDogJ1x1NUZEQ1x1N0I1NFx1NjVFNVx1NjY0MicgfSxcbiAgICAgIGhhc19yZXNwb25kZWQ6IHsgbGFiZWw6ICdcdTVGRENcdTdCNTRcdTZFMDgnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnXHU1N0ZBXHU2NzJDXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgcmVzcG9uc2U6IHsgbGFiZWw6ICdcdTUzQ0RcdTVGRENcdTMwQzhcdTMwRTlcdTMwQzNcdTMwQURcdTMwRjNcdTMwQjAnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgbWFya19yZXNwb25kZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTVGRENcdTdCNTRcdTZFMDhcdTMwNkJcdTMwNTlcdTMwOEInLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1MzA1M1x1MzA2RVx1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzBFMVx1MzBGM1x1MzBEMFx1MzBGQ1x1MzA2RVx1NUZEQ1x1N0I1NFx1MzA5Mlx1OEExOFx1OTMzMlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9uc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgVHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuaW1wb3J0IHsgYXBwU3VyZmFjZSB9IGZyb20gJy4vamEtSlAvYXBwJztcbmltcG9ydCB7IGN1c3RvbWVyIH0gZnJvbSAnLi9qYS1KUC9vYmplY3RzLmN1c3RvbWVyJztcbmltcG9ydCB7IHBpcGVsaW5lIH0gZnJvbSAnLi9qYS1KUC9vYmplY3RzLnBpcGVsaW5lJztcbmltcG9ydCB7IGNvbW1lcmNlIH0gZnJvbSAnLi9qYS1KUC9vYmplY3RzLmNvbW1lcmNlJztcbmltcG9ydCB7IHNlcnZpY2UgfSBmcm9tICcuL2phLUpQL29iamVjdHMuc2VydmljZSc7XG5pbXBvcnQgeyBhY3Rpdml0eSB9IGZyb20gJy4vamEtSlAvb2JqZWN0cy5hY3Rpdml0eSc7XG5pbXBvcnQgeyBtYXJrZXRpbmcgfSBmcm9tICcuL2phLUpQL29iamVjdHMubWFya2V0aW5nJztcblxuLyoqXG4gKiBcdTY1RTVcdTY3MkNcdThBOUUgKGphLUpQKSBcdTIwMTQgQ1JNIEFwcCBUcmFuc2xhdGlvbnNcbiAqXG4gKiBQZXItbG9jYWxlIGZpbGU6IG9uZSBmaWxlIHBlciBsYW5ndWFnZSwgZm9sbG93aW5nIHRoZSBgcGVyX2xvY2FsZWAgY29udmVudGlvbi5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqXG4gKiBUaGlzIGJ1bmRsZSB3YXMgb25lIGZpbGUgYW5kIGl0IGhhZCByZWFjaGVkIDg4LjYlIG9mIHRoZSAxMDBLQiBzb3VyY2UgY2FwXG4gKiBgcG5wbSBoeWdpZW5lYCBlbmZvcmNlcywgZ3Jvd2luZyB+MS4yS0IgYSBkYXkuIEl0IGlzIG5vdyBhc3NlbWJsZWQgZnJvbVxuICogYC4vPGxvY2FsZT4vYCwgb24gYW4gYXhpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiBndWVzc2VkOlxuICpcbiAqICAgLSBldmVyeSBuYW1lc3BhY2UgdGhhdCBpcyBOT1QgYG9iamVjdHNgIFx1MjAxNCBgYXBwc2AsIGBtZXNzYWdlc2AsXG4gKiAgICAgYGRhc2hib2FyZHNgLCBgZGF0YXNldHNgLCBgcGFnZXNgLCBhbmQgYW55IG5hbWVzcGFjZSBgVHJhbnNsYXRpb25EYXRhYFxuICogICAgIGdhaW5zIGxhdGVyIFx1MjAxNCBsaXZlcyBpbiBgYXBwLnRzYC4gTWVhc3VyZWQ6IHRob3NlIG5hbWVzcGFjZXMgdG9nZXRoZXJcbiAqICAgICBhcmUgdW5kZXIgYSBxdWFydGVyIG9mIHRoZSBidW5kbGUsIGFuZCB0aGUgc2NoZW1hIGJvdW5kcyBob3cgbWFueSBjYW5cbiAqICAgICBldmVyIGFycml2ZSwgc28gb25lIGZpbGUgaG9sZHMgdGhlbSB3aXRoIHJvb20gbGVmdDtcbiAqICAgLSBgb2JqZWN0c2AgaXMgNjktNzglIG9mIGV2ZXJ5IGJ1bmRsZSwgc28gaXQgaXMgcGFydGl0aW9uZWQgYWdhaW4sIG9uZVxuICogICAgIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5IFx1MjAxNCBgY3VzdG9tZXJgLCBgcGlwZWxpbmVgLCBgY29tbWVyY2VgLFxuICogICAgIGBzZXJ2aWNlYCwgYGFjdGl2aXR5YCwgYG1hcmtldGluZ2AgXHUyMDE0IGFuZCBhIERFVEFJTCBvYmplY3QgZm9sbG93cyBpdHNcbiAqICAgICBtYXN0ZXI6IGxpbmUgaXRlbXMgZm9sbG93IHRoZWlyIHF1b3RlIG9yIG9wcG9ydHVuaXR5LFxuICogICAgIGBjcm1fZXZlbnRfYXR0ZW5kZWVgIGZvbGxvd3MgYGNybV9ldmVudGAsIGBjcm1fY2FtcGFpZ25fbWVtYmVyYFxuICogICAgIGZvbGxvd3MgYGNybV9jYW1wYWlnbmAsIGBjcm1fYXJ0aWNsZV9mZWVkYmFja2AgZm9sbG93c1xuICogICAgIGBjcm1fa25vd2xlZGdlX2FydGljbGVgLlxuICpcbiAqIEEgbmFtZXNwYWNlIGF4aXMgQUxPTkUgd2FzIG1lYXN1cmVkIGFuZCByZWplY3RlZDogaXQgbGVhdmVzIGBvYmplY3RzYCBhdFxuICogNjUuN0tCLCAzLjlLQiB1bmRlciB0aGUgYWR2aXNvcnkgYmFuZCwgd2hpY2ggYG9iamVjdHNgIGdyb3d0aCBjcm9zc2VzIGluXG4gKiBhYm91dCBuaW5lIGRheXMuIFRoZSBmYW1pbHkgYXhpcyBwdXRzIHRoZSBsYXJnZXN0IHBhcnQgYXQgMjQuMiUgb2YgdGhlIGNhcC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgQSBuZXcgb2JqZWN0IHRyYW5zbGF0aW9uIGJlbG9uZ3MgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHkuIERvIG5vdCBhZGRcbiAqIGl0IHRvIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbiBcdTIwMTQgdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdFxuICogdGhlIGJhbmQsIHdoaWNoIGlzIHdoYXQgc3BsaXQgdGhpcyBidW5kbGUgaW4gdGhlIGZpcnN0IHBsYWNlLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBBIHZhbHVlIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSBmYW1pbHkgbGl2ZXMgaW4gYDxsb2NhbGU+L19zaGFyZWQudHNgLiBBXG4gKiB2YWx1ZSB1c2VkIGJ5IGV4YWN0bHkgb25lIGZhbWlseSBsaXZlcyBpbiB0aGF0IGZhbWlseSdzIGZpbGUuXG4gKlxuICogXHUyNkEwXHVGRTBGIFRoZSBrZXkgb3JkZXIgYmVsb3cgaXMgTE9BRC1CRUFSSU5HLCBub3QgY29zbWV0aWMuIGBvYmplY3RzdGFjayBidWlsZGBcbiAqIHNlcmlhbGlzZXMgdGhpcyBvYmplY3QgaW50byBgZGlzdC9vYmplY3RzdGFjay5qc29uYCBpbiBpbnNlcnRpb24gb3JkZXIgYW5kXG4gKiBuZXZlciBzb3J0cyBpdCwgc28gbGlzdGluZyB0aGUgcm93cyBoZXJlIFx1MjAxNCByYXRoZXIgdGhhbiBzcHJlYWRpbmcgdGhlIGZhbWlseVxuICogZmlsZXMgXHUyMDE0IGlzIHdoYXQga2VlcHMgdGhlIGJ1aWx0IGFydGlmYWN0IGJ5dGUtaWRlbnRpY2FsIGFjcm9zcyB0aGUgc3BsaXQuXG4gKiBUaGUgb3JkZXIgaXMgdGhpcyBidW5kbGUncyBvd24gaGlzdG9yaWNhbCBhY2NyZXRpb24gb3JkZXIgYW5kIGRpZmZlcnNcbiAqIGJldHdlZW4gbG9jYWxlczsgcmVvcmRlcmluZyBpdCByZXdyaXRlcyB0aGUgYXJ0aWZhY3QuXG4gKi9cbmV4cG9ydCBjb25zdCBqYUpQOiBUcmFuc2xhdGlvbkRhdGEgPSB7XG4gIG9iamVjdHM6IHtcbiAgICBjcm1fYWNjb3VudDogY3VzdG9tZXIuY3JtX2FjY291bnQsXG4gICAgY3JtX2NvbnRhY3Q6IGN1c3RvbWVyLmNybV9jb250YWN0LFxuICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogc2VydmljZS5jcm1fa25vd2xlZGdlX2FydGljbGUsXG4gICAgY3JtX2ZvcmVjYXN0OiBwaXBlbGluZS5jcm1fZm9yZWNhc3QsXG4gICAgY3JtX2xlYWQ6IHBpcGVsaW5lLmNybV9sZWFkLFxuICAgIGNybV9vcHBvcnR1bml0eTogcGlwZWxpbmUuY3JtX29wcG9ydHVuaXR5LFxuICAgIGNybV9jYXNlOiBzZXJ2aWNlLmNybV9jYXNlLFxuICAgIGNybV9jb250cmFjdDogY29tbWVyY2UuY3JtX2NvbnRyYWN0LFxuICAgIGNybV9wcm9kdWN0OiBjb21tZXJjZS5jcm1fcHJvZHVjdCxcbiAgICBjcm1fcXVvdGU6IGNvbW1lcmNlLmNybV9xdW90ZSxcbiAgICBjcm1fdGFzazogYWN0aXZpdHkuY3JtX3Rhc2ssXG4gICAgY3JtX2NhbXBhaWduOiBtYXJrZXRpbmcuY3JtX2NhbXBhaWduLFxuICAgIGNybV9ldmVudDogYWN0aXZpdHkuY3JtX2V2ZW50LFxuICAgIGNybV9ldmVudF9hdHRlbmRlZTogYWN0aXZpdHkuY3JtX2V2ZW50X2F0dGVuZGVlLFxuICAgIGNybV9hcnRpY2xlX2ZlZWRiYWNrOiBzZXJ2aWNlLmNybV9hcnRpY2xlX2ZlZWRiYWNrLFxuICAgIGNybV9jYW1wYWlnbl9tZW1iZXI6IG1hcmtldGluZy5jcm1fY2FtcGFpZ25fbWVtYmVyLFxuICAgIGNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW06IHBpcGVsaW5lLmNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW0sXG4gICAgY3JtX3F1b3RlX2xpbmVfaXRlbTogY29tbWVyY2UuY3JtX3F1b3RlX2xpbmVfaXRlbSxcbiAgfSxcbiAgLi4uYXBwU3VyZmFjZSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvYXBwLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FU1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvYXBwLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IFFVT1RFX0RJU0NPVU5UX0NFSUxJTkcgfSBmcm9tICcuLi8uLi9vYmplY3RzL190aHJlc2hvbGRzJztcblxuLyoqXG4gKiBFc3BhXHUwMEYxb2wgKGVzLUVTKSBcdTIwMTQgZXZlcnkgdHJhbnNsYXRpb24gbmFtZXNwYWNlIEVYQ0VQVCBgb2JqZWN0c2A6XG4gKiBgYXBwc2AsIGBtZXNzYWdlc2AsIGBkYXNoYm9hcmRzYCwgYGRhdGFzZXRzYCwgYHBhZ2VzYCwgYGZsb3dzYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy50c2AuXG4gKlxuICogQSBuYW1lc3BhY2UgYFRyYW5zbGF0aW9uRGF0YWAgZ2FpbnMgbGF0ZXIgbGFuZHMgaGVyZSB0b28sIGFuZCB0aGUgcm9vbSBpc1xuICogbWVhc3VyZWQ6IHRoaXMgZmlsZSBpcyB0aGUgc21hbGxlciBoYWxmIG9mIHRoZSBidW5kbGUsIGFuZCB0aGUgc2NoZW1hIGJvdW5kc1xuICogaG93IG1hbnkgbmFtZXNwYWNlcyBjYW4gZXZlciBhcnJpdmUuXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBTdXJmYWNlOiBPbWl0PFRyYW5zbGF0aW9uRGF0YSwgJ29iamVjdHMnPiA9IHtcbiAgYXBwczoge1xuICAgIGNybV9lbnRlcnByaXNlOiB7XG4gICAgICBsYWJlbDogJ0hvdENSTScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0dlc3RpXHUwMEYzbiBkZSByZWxhY2lvbmVzIGNvbiBjbGllbnRlcyBwYXJhIHZlbnRhcywgc2VydmljaW8geSBtYXJrZXRpbmcnLFxuICAgICAgLy8gSW5kZXhhZG8gcG9yIGVsIGBpZGAgZGVsIG5vZG8gZGUgbmF2ZWdhY2lcdTAwRjNuIChlc3BhY2lvIGRlIG5vbWJyZXMgcGxhbm8sXG4gICAgICAvLyBzZWEgY3VhbCBzZWEgbGEgcHJvZnVuZGlkYWQgZGVsIG5vZG8pLlxuICAgICAgbmF2aWdhdGlvbjoge1xuICAgICAgICBncm91cF9hY3Rpdml0eTogeyBsYWJlbDogJ0FjdGl2aWRhZCcgfSxcbiAgICAgICAgbmF2X2V2ZW50OiB7IGxhYmVsOiAnRXZlbnRvcycgfSxcbiAgICAgICAgbmF2X2FjdGl2aXR5X2Rhc2hib2FyZDogeyBsYWJlbDogJ0FjdGl2aWRhZCBkZSBWZW50YXMnIH0sXG4gICAgICAgIG5hdl9teV9jYWxlbmRhcjogeyBsYWJlbDogJ01pIENhbGVuZGFyaW8nIH0sXG4gICAgICAgIG5hdl9ob21lOiB7IGxhYmVsOiAnSW5pY2lvJyB9LFxuXG4gICAgICAgIGdyb3VwX3NhbGVzOiB7IGxhYmVsOiAnVmVudGFzJyB9LFxuICAgICAgICBuYXZfbGVhZDogeyBsYWJlbDogJ1Byb3NwZWN0b3MnIH0sXG4gICAgICAgIG5hdl9hY2NvdW50OiB7IGxhYmVsOiAnQ3VlbnRhcycgfSxcbiAgICAgICAgbmF2X2FjY291bnRfd29ya2JlbmNoOiB7IGxhYmVsOiAnTWVzYSBkZSBUcmFiYWpvIGRlIEN1ZW50YXMnIH0sXG4gICAgICAgIG5hdl9jb250YWN0OiB7IGxhYmVsOiAnQ29udGFjdG9zJyB9LFxuICAgICAgICBuYXZfb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdPcG9ydHVuaWRhZGVzJyB9LFxuICAgICAgICBuYXZfcXVvdGU6IHsgbGFiZWw6ICdDb3RpemFjaW9uZXMnIH0sXG4gICAgICAgIG5hdl9jb250cmFjdDogeyBsYWJlbDogJ0NvbnRyYXRvcycgfSxcbiAgICAgICAgbmF2X3Byb2R1Y3Q6IHsgbGFiZWw6ICdQcm9kdWN0b3MnIH0sXG4gICAgICAgIG5hdl9zYWxlc19kYXNoYm9hcmQ6IHsgbGFiZWw6ICdSZW5kaW1pZW50byBkZSBWZW50YXMnIH0sXG5cbiAgICAgICAgZ3JvdXBfd29yazogeyBsYWJlbDogJ01pIFRyYWJham8nIH0sXG4gICAgICAgIG5hdl9teV90YXNrczogeyBsYWJlbDogJ01pcyBUYXJlYXMnIH0sXG4gICAgICAgIG5hdl9teV9kZWFsczogeyBsYWJlbDogJ01pcyBOZWdvY2lvcycgfSxcbiAgICAgICAgbmF2X215X2xlYWRzOiB7IGxhYmVsOiAnTWlzIFByb3NwZWN0b3MnIH0sXG4gICAgICAgIG5hdl9teV9jYXNlczogeyBsYWJlbDogJ01pcyBDYXNvcycgfSxcbiAgICAgICAgbmF2X2FwcHJvdmFsX3JlcXVlc3RzOiB7IGxhYmVsOiAnQmFuZGVqYSBkZSBFbnRyYWRhJyB9LFxuXG4gICAgICAgIGdyb3VwX3NlcnZpY2U6IHsgbGFiZWw6ICdTZXJ2aWNpbycgfSxcbiAgICAgICAgbmF2X2Nhc2U6IHsgbGFiZWw6ICdDYXNvcycgfSxcbiAgICAgICAgbmF2X2tub3dsZWRnZTogeyBsYWJlbDogJ0Nvbm9jaW1pZW50bycgfSxcbiAgICAgICAgbmF2X3NlcnZpY2VfZGFzaGJvYXJkOiB7IGxhYmVsOiAnUmVzdW1lbiBkZSBTZXJ2aWNpbycgfSxcblxuICAgICAgICBncm91cF9tYXJrZXRpbmc6IHsgbGFiZWw6ICdNYXJrZXRpbmcnIH0sXG4gICAgICAgIG5hdl9jYW1wYWlnbjogeyBsYWJlbDogJ0NhbXBhXHUwMEYxYXMnIH0sXG5cbiAgICAgICAgZ3JvdXBfaW5zaWdodHM6IHsgbGFiZWw6ICdBblx1MDBFMWxpc2lzJyB9LFxuICAgICAgICBuYXZfY3JtX2Rhc2hib2FyZDogeyBsYWJlbDogJ1Jlc3VtZW4gQ1JNJyB9LFxuICAgICAgICBuYXZfZm9yZWNhc3Q6IHsgbGFiZWw6ICdQcmV2aXNpb25lcycgfSxcbiAgICAgICAgbmF2X3JlcG9ydF9waXBlbGluZV9jb3ZlcmFnZTogeyBsYWJlbDogJ0NvYmVydHVyYSBkZWwgUGlwZWxpbmUnIH0sXG4gICAgICAgIG5hdl9yZXBvcnRfbGVhZF9pbmZsb3c6IHsgbGFiZWw6ICdFbnRyYWRhIGRlIFByb3NwZWN0b3MnIH0sXG4gICAgICAgIG5hdl9yZXBvcnRfc2xhOiB7IGxhYmVsOiAnQ3VtcGxpbWllbnRvIGRlIFNMQScgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgbWVzc2FnZXM6IHtcbiAgICAnY29tbW9uLnNhdmUnOiAnR3VhcmRhcicsXG4gICAgJ2NvbW1vbi5jYW5jZWwnOiAnQ2FuY2VsYXInLFxuICAgICdjb21tb24uZGVsZXRlJzogJ0VsaW1pbmFyJyxcbiAgICAnY29tbW9uLmVkaXQnOiAnRWRpdGFyJyxcbiAgICAnY29tbW9uLmNyZWF0ZSc6ICdDcmVhcicsXG4gICAgJ2NvbW1vbi5zZWFyY2gnOiAnQnVzY2FyJyxcbiAgICAnY29tbW9uLmZpbHRlcic6ICdGaWx0cmFyJyxcbiAgICAnY29tbW9uLmV4cG9ydCc6ICdFeHBvcnRhcicsXG4gICAgJ2NvbW1vbi5iYWNrJzogJ1ZvbHZlcicsXG4gICAgJ2NvbW1vbi5jb25maXJtJzogJ0NvbmZpcm1hcicsXG4gICAgJ25hdi5zYWxlcyc6ICdWZW50YXMnLFxuICAgICduYXYuc2VydmljZSc6ICdTZXJ2aWNpbycsXG4gICAgJ25hdi5tYXJrZXRpbmcnOiAnTWFya2V0aW5nJyxcbiAgICAnbmF2LnByb2R1Y3RzJzogJ1Byb2R1Y3RvcycsXG4gICAgJ25hdi5hbmFseXRpY3MnOiAnQW5hbFx1MDBFRHRpY2EnLFxuICAgICdzdWNjZXNzLnNhdmVkJzogJ1JlZ2lzdHJvIGd1YXJkYWRvIGV4aXRvc2FtZW50ZScsXG4gICAgJ3N1Y2Nlc3MuY29udmVydGVkJzogJ1Byb3NwZWN0byBjb252ZXJ0aWRvIGV4aXRvc2FtZW50ZScsXG4gICAgJ2NvbmZpcm0uZGVsZXRlJzogJ1x1MDBCRkVzdFx1MDBFMSBzZWd1cm8gZGUgcXVlIGRlc2VhIGVsaW1pbmFyIGVzdGUgcmVnaXN0cm8/JyxcbiAgICAnY29uZmlybS5jb252ZXJ0X2xlYWQnOiAnXHUwMEJGQ29udmVydGlyIGVzdGUgcHJvc3BlY3RvIGVuIGN1ZW50YSwgY29udGFjdG8geSBvcG9ydHVuaWRhZD8nLFxuICAgICdlcnJvci5yZXF1aXJlZCc6ICdFc3RlIGNhbXBvIGVzIG9ibGlnYXRvcmlvJyxcbiAgICAnZXJyb3IubG9hZF9mYWlsZWQnOiAnRXJyb3IgYWwgY2FyZ2FyIGxvcyBkYXRvcycsXG4gIH0sXG4gIGRhc2hib2FyZHM6IHtcbiAgICBzYWxlc19hY3Rpdml0eV9kYXNoYm9hcmQ6IHtcbiAgICAgIGxhYmVsOiAnQWN0aXZpZGFkIGRlIHZlbnRhcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1F1aVx1MDBFOW4gaGFibGEgY29uIGxvcyBjbGllbnRlcywgY29uIHF1XHUwMEU5IGZyZWN1ZW5jaWEgeSBxdVx1MDBFOSBjdWVudGFzIHNlIGhhbiBxdWVkYWRvIGVuIHNpbGVuY2lvJyxcbiAgICAgIHdpZGdldHM6IHtcbiAgICAgICAgaW50ZXJhY3Rpb25zX2hlbGQ6IHsgdGl0bGU6ICdJbnRlcmFjY2lvbmVzIHJlZ2lzdHJhZGFzJywgZGVzY3JpcHRpb246ICdMbGFtYWRhcyB5IHJldW5pb25lcyBxdWUgcmVhbG1lbnRlIG9jdXJyaWVyb24nIH0sXG4gICAgICAgIG1lZXRpbmdzX2Jvb2tlZDogeyB0aXRsZTogJ1JldW5pb25lcyBhZ2VuZGFkYXMnLCBkZXNjcmlwdGlvbjogJ1JldW5pb25lcyBlbiBlbCBjYWxlbmRhcmlvIHF1ZSBhXHUwMEZBbiBubyBvY3VycmVuJyB9LFxuICAgICAgICBjdXN0b21lcl9taW51dGVzOiB7IHRpdGxlOiAnTWludXRvcyBjb24gY2xpZW50ZXMnLCBkZXNjcmlwdGlvbjogJ1RpZW1wbyB0b3RhbCBmcmVudGUgYSBjbGllbnRlcycgfSxcbiAgICAgICAgdGFza3NfY29tcGxldGVkOiB7IHRpdGxlOiAnVGFyZWFzIGNvbXBsZXRhZGFzJywgZGVzY3JpcHRpb246ICdTZWd1aW1pZW50b3MgY2VycmFkb3MgXHUyMDE0IGxhIG90cmEgbWl0YWQgZGUgbGEgYWN0aXZpZGFkJyB9LFxuICAgICAgICBhY3Rpdml0eV9ieV9yZXA6IHsgdGl0bGU6ICdBY3RpdmlkYWQgcG9yIHJlcHJlc2VudGFudGUnLCBkZXNjcmlwdGlvbjogJ0ludGVyYWNjaW9uZXMgcmVnaXN0cmFkYXMgcG9yIHJlc3BvbnNhYmxlJyB9LFxuICAgICAgICBhY3Rpdml0eV9ieV93ZWVrOiB7IHRpdGxlOiAnVm9sdW1lbiBkZSBhY3RpdmlkYWQgcG9yIHNlbWFuYScsIGRlc2NyaXB0aW9uOiAnSW50ZXJhY2Npb25lcyBwb3Igc2VtYW5hJyB9LFxuICAgICAgICBhY3Rpdml0eV9taXg6IHsgdGl0bGU6ICdDb21wb3NpY2lcdTAwRjNuIGRlIGxhIGFjdGl2aWRhZCcsIGRlc2NyaXB0aW9uOiAnTGxhbWFkYXMgdnMgcmV1bmlvbmVzIHZzIGRlbW9zdHJhY2lvbmVzJyB9LFxuICAgICAgICBhY3Rpdml0eV9ieV9yZWNvcmRfdHlwZTogeyB0aXRsZTogJ0RcdTAwRjNuZGUgY2FlIGxhIGFjdGl2aWRhZCcsIGRlc2NyaXB0aW9uOiAnUXVcdTAwRTkgcGFydGUgZGVsIGVtYnVkbyByZWNpYmUgYXRlbmNpXHUwMEYzbicgfSxcbiAgICAgICAgZGVhbF9hY3Rpdml0eTogeyB0aXRsZTogJ0ludGVyYWNjaW9uZXMgZW4gb3BvcnR1bmlkYWRlcycsIGRlc2NyaXB0aW9uOiAnSW50ZXJhY2Npb25lcyB2aW5jdWxhZGFzIGEgdW5hIG9wb3J0dW5pZGFkJyB9LFxuICAgICAgICBvcGVuX2RlYWxzX2Zvcl9hY3Rpdml0eTogeyB0aXRsZTogJ09wb3J0dW5pZGFkZXMgYWJpZXJ0YXMnLCBkZXNjcmlwdGlvbjogJ09wb3J0dW5pZGFkZXMgYVx1MDBGQW4gZW4ganVlZ28nIH0sXG4gICAgICAgIHF1aWV0X2FjY291bnRzXzMwOiB7IHRpdGxlOiAnU2lsZW5jaW8gMzArIGRcdTAwRURhcycsIGRlc2NyaXB0aW9uOiAnQ3VlbnRhcyBhY3RpdmFzIHNpbiBpbnRlcmFjY2lcdTAwRjNuIGVuIHVuIG1lcycgfSxcbiAgICAgICAgcXVpZXRfYWNjb3VudHNfNjA6IHsgdGl0bGU6ICdTaWxlbmNpbyA2MCsgZFx1MDBFRGFzJywgZGVzY3JpcHRpb246ICdEb3MgbWVzZXMgZGUgc2lsZW5jaW8gXHUyMDE0IGVsIHVtYnJhbCBkZSByaWVzZ28nIH0sXG4gICAgICAgIHF1aWV0X2FjY291bnRzXzkwOiB7IHRpdGxlOiAnU2lsZW5jaW8gOTArIGRcdTAwRURhcycsIGRlc2NyaXB0aW9uOiAnVW4gdHJpbWVzdHJlIHNpbiBjb250YWN0bycgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcm1fb3ZlcnZpZXdfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ1Jlc3VtZW4gQ1JNJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTVx1MDBFOXRyaWNhcyBkZSBpbmdyZXNvcywgYW5hbFx1MDBFRHRpY2EgZGUgcGlwZWxpbmUgZSBpbmZvcm1hY2lcdTAwRjNuIGRlIG9wb3J0dW5pZGFkZXMnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICB0b3RhbF9yZXZlbnVlOiB7IHRpdGxlOiAnSW5ncmVzb3MgdG90YWxlcycsIGRlc2NyaXB0aW9uOiAnSW5ncmVzb3MgY2VycmFkb3MgZ2FuYWRvcyBlbiBlc3RlIHBlclx1MDBFRG9kbycgfSxcbiAgICAgICAgYWN0aXZlX2RlYWxzOiB7IHRpdGxlOiAnTmVnb2Npb3MgYWN0aXZvcycsIGRlc2NyaXB0aW9uOiAnT3BvcnR1bmlkYWRlcyBhYmllcnRhcyBlbiBlbCBwaXBlbGluZScgfSxcbiAgICAgICAgd29uX2RlYWxzOiB7IHRpdGxlOiAnTmVnb2Npb3MgZ2FuYWRvcycsIGRlc2NyaXB0aW9uOiAnTmVnb2Npb3MgY2VycmFkb3MgZ2FuYWRvcyBlbiBlc3RlIHBlclx1MDBFRG9kbycgfSxcbiAgICAgICAgYXZnX2RlYWxfc2l6ZTogeyB0aXRsZTogJ1RhbWFcdTAwRjFvIG1lZGlvIGRlbCBuZWdvY2lvJywgZGVzY3JpcHRpb246ICdWYWxvciBtZWRpbyBkZSBsb3MgbmVnb2Npb3MgY2VycmFkb3MgZ2FuYWRvcycgfSxcbiAgICAgICAgcmV2ZW51ZV90cmVuZHM6IHsgdGl0bGU6ICdUZW5kZW5jaWEgZGUgaW5ncmVzb3MnLCBkZXNjcmlwdGlvbjogJ0luZ3Jlc29zIGNlcnJhZG9zIGdhbmFkb3MgZGUgbG9zIFx1MDBGQWx0aW1vcyAxMiBtZXNlcycgfSxcbiAgICAgICAgbGVhZF9zb3VyY2U6IHsgdGl0bGU6ICdPcmlnZW4gZGVsIHByb3NwZWN0bycsIGRlc2NyaXB0aW9uOiAnVmFsb3IgZGVsIHBpcGVsaW5lIHBvciBjYW5hbCBkZSBhZHF1aXNpY2lcdTAwRjNuJyB9LFxuICAgICAgICBwaXBlbGluZV9ieV9zdGFnZTogeyB0aXRsZTogJ1BpcGVsaW5lIHBvciBldGFwYScsIGRlc2NyaXB0aW9uOiAnVmFsb3IgZGUgb3BvcnR1bmlkYWRlcyBhYmllcnRhcyBlbiBjYWRhIGV0YXBhIGRlIHZlbnRhJyB9LFxuICAgICAgICB0b3BfcHJvZHVjdHM6IHsgdGl0bGU6ICdQcm9kdWN0b3MgcHJpbmNpcGFsZXMnLCBkZXNjcmlwdGlvbjogJ0luZ3Jlc29zIGEgcHJlY2lvIGRlIGxpc3RhIHBvciBjYXRlZ29yXHUwMEVEYSBkZSBwcm9kdWN0bycgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfb3duZXI6IHsgdGl0bGU6ICdQaXBlbGluZSBwb3IgcmVzcG9uc2FibGUnLCBkZXNjcmlwdGlvbjogJ1ZhbG9yIGRlbCBwaXBlbGluZSBhYmllcnRvIHkgblx1MDBGQW1lcm8gZGUgbmVnb2Npb3MgcG9yIGNvbWVyY2lhbCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBleGVjdXRpdmVfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ1Zpc3RhIGVqZWN1dGl2YScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0tQSSBkZSBhbHRvIG5pdmVsIHNvYnJlIGluZ3Jlc29zLCBjbGllbnRlcyB5IHBpcGVsaW5lIHBhcmEgbGEgZGlyZWNjaVx1MDBGM24nLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICB0b3RhbF9yZXZlbnVlX3l0ZDogeyB0aXRsZTogJ0luZ3Jlc29zIHRvdGFsZXMgKFlURCknLCBkZXNjcmlwdGlvbjogJ0luZ3Jlc29zIGNlcnJhZG9zIGdhbmFkb3MgZW4gbG8gcXVlIHZhIGRlbCBhXHUwMEYxbycgfSxcbiAgICAgICAgdG90YWxfYWNjb3VudHM6IHsgdGl0bGU6ICdDdWVudGFzIGFjdGl2YXMnLCBkZXNjcmlwdGlvbjogJ0NsaWVudGVzIGNvbiBhbCBtZW5vcyB1bmEgcmVsYWNpXHUwMEYzbiBhY3RpdmEnIH0sXG4gICAgICAgIHRvdGFsX2NvbnRhY3RzOiB7IHRpdGxlOiAnVG90YWwgZGUgY29udGFjdG9zJywgZGVzY3JpcHRpb246ICdQZXJzb25hcyBlbiBudWVzdHJhIGFnZW5kYScgfSxcbiAgICAgICAgb3Blbl9sZWFkczogeyB0aXRsZTogJ1Byb3NwZWN0b3MgYWJpZXJ0b3MnLCBkZXNjcmlwdGlvbjogJ1Byb3NwZWN0b3Mgc2luIGNvbnZlcnRpciBlbiBlbCBlbWJ1ZG8nIH0sXG4gICAgICAgIHJldmVudWVfdHJlbmQ6IHsgdGl0bGU6ICdUZW5kZW5jaWEgZGUgaW5ncmVzb3MnLCBkZXNjcmlwdGlvbjogJ0luZ3Jlc29zIGNlcnJhZG9zIGdhbmFkb3MgZGUgbG9zIFx1MDBGQWx0aW1vcyAxMiBtZXNlcycgfSxcbiAgICAgICAgcmV2ZW51ZV9ieV9pbmR1c3RyeTogeyB0aXRsZTogJ0luZ3Jlc29zIHBvciBpbmR1c3RyaWEnLCBkZXNjcmlwdGlvbjogJ0luZ3Jlc29zIFlURCBnYW5hZG9zIHNlcGFyYWRvcyBwb3IgaW5kdXN0cmlhIGRlbCBjbGllbnRlJyB9LFxuICAgICAgICBwaXBlbGluZV9ieV9zdGFnZTogeyB0aXRsZTogJ1BpcGVsaW5lIHBvciBldGFwYScsIGRlc2NyaXB0aW9uOiAnVmFsb3IgZGUgb3BvcnR1bmlkYWRlcyBhYmllcnRhcyBlbiBjYWRhIGV0YXBhIGRlIHZlbnRhJyB9LFxuICAgICAgICBuZXdfYWNjb3VudHNfYnlfbW9udGg6IHsgdGl0bGU6ICdDdWVudGFzIG51ZXZhcycsIGRlc2NyaXB0aW9uOiAnUml0bW8gZGUgY3JlYWNpXHUwMEYzbiBkZSBjdWVudGFzIGVuIGxvcyBcdTAwRkFsdGltb3MgNiBtZXNlcycgfSxcbiAgICAgICAgYWNjb3VudHNfYnlfaW5kdXN0cnk6IHsgdGl0bGU6ICdDdWVudGFzIHBvciBzZWN0b3InLCBkZXNjcmlwdGlvbjogJ0luZ3Jlc28gYW51YWwgdG90YWwgeSBuXHUwMEZBbWVybyBkZSBjdWVudGFzIHBvciBzZWN0b3InIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgc2FsZXNfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ1JlbmRpbWllbnRvIGRlIHZlbnRhcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0FuYWxcdTAwRUR0aWNhIGRlIHBpcGVsaW5lLCB0ZW5kZW5jaWFzIGRlIHRhc2EgZGUgXHUwMEU5eGl0byB5IHJlbmRpbWllbnRvIGRlIGxvcyByZXByZXNlbnRhbnRlcycsXG4gICAgICB3aWRnZXRzOiB7XG4gICAgICAgIHRvdGFsX3BpcGVsaW5lX3ZhbHVlOiB7IHRpdGxlOiAnUGlwZWxpbmUgdG90YWwnLCBkZXNjcmlwdGlvbjogJ1N1bWEgZGVsIHZhbG9yIGRlIGxhcyBvcG9ydHVuaWRhZGVzIGFiaWVydGFzJyB9LFxuICAgICAgICBjbG9zZWRfd29uX3F0ZDogeyB0aXRsZTogJ0NlcnJhZG8gZ2FuYWRvICh0cmltZXN0cmUpJywgZGVzY3JpcHRpb246ICdJbmdyZXNvcyBjZXJyYWRvcyBlc3RlIHRyaW1lc3RyZScgfSxcbiAgICAgICAgb3Blbl9vcHBvcnR1bml0aWVzOiB7IHRpdGxlOiAnT3BvcnR1bmlkYWRlcyBhYmllcnRhcycsIGRlc2NyaXB0aW9uOiAnTmVnb2Npb3MgYWN0aXZvcyBlbiBjdXJzbycgfSxcbiAgICAgICAgYXZnX2RlYWxfc2l6ZTogeyB0aXRsZTogJ1RhbWFcdTAwRjFvIG1lZGlvIGRlbCBuZWdvY2lvJywgZGVzY3JpcHRpb246ICdWYWxvciBtZWRpbyBkZSBsb3MgbmVnb2Npb3MgY2VycmFkb3MgZ2FuYWRvcyBlc3RlIHRyaW1lc3RyZScgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfc3RhZ2U6IHsgdGl0bGU6ICdQaXBlbGluZSBwb3IgZXRhcGEnLCBkZXNjcmlwdGlvbjogJ1ZhbG9yIGRlIG9wb3J0dW5pZGFkZXMgYWJpZXJ0YXMgZW4gY2FkYSBldGFwYSBkZSB2ZW50YScgfSxcbiAgICAgICAgbW9udGhseV9yZXZlbnVlX3RyZW5kOiB7IHRpdGxlOiAnVGVuZGVuY2lhIG1lbnN1YWwgZGUgaW5ncmVzb3MnLCBkZXNjcmlwdGlvbjogJ0luZ3Jlc29zIGNlcnJhZG9zIGdhbmFkb3MgZGUgbG9zIFx1MDBGQWx0aW1vcyAxMiBtZXNlcycgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfZm9yZWNhc3RfY2F0ZWdvcnk6IHsgdGl0bGU6ICdQaXBlbGluZSBwb3IgY2F0ZWdvclx1MDBFRGEgZGUgcHJvblx1MDBGM3N0aWNvJywgZGVzY3JpcHRpb246ICdQaXBlbGluZSBhYmllcnRvIGFncnVwYWRvIHBvciBjYXRlZ29yXHUwMEVEYSBkZSBwcm9uXHUwMEYzc3RpY28gZGUgdmVudGFzJyB9LFxuICAgICAgICBsZWFkX3NvdXJjZV9icmVha2Rvd246IHsgdGl0bGU6ICdPcmlnZW4gZGVsIHByb3NwZWN0bycsIGRlc2NyaXB0aW9uOiAnRGUgZFx1MDBGM25kZSBwcm92aWVuZSBudWVzdHJvIHBpcGVsaW5lJyB9LFxuICAgICAgICBvcGVuX3BpcGVsaW5lX2J5X293bmVyOiB7IHRpdGxlOiAnUGlwZWxpbmUgYWJpZXJ0byBwb3IgcmVzcG9uc2FibGUnLCBkZXNjcmlwdGlvbjogJ1ZhbG9yIGRlbCBwaXBlbGluZSBlbiBjdXJzbywgblx1MDBGQW1lcm8gZGUgbmVnb2Npb3MgeSBwcm9iYWJpbGlkYWQgbWVkaWEgZGUgY2llcnJlIHBvciBjb21lcmNpYWwnIH0sXG4gICAgICAgIHF1b3RhX2F0dGFpbm1lbnRfYnlfcmVwOiB7IHRpdGxlOiAnQ3VtcGxpbWllbnRvIGRlIGN1b3RhIHBvciByZXByZXNlbnRhbnRlJywgZGVzY3JpcHRpb246ICdDdW90YSBkZWwgdHJpbWVzdHJlIGFjdHVhbCwgaW5ncmVzb3MgY2VycmFkb3MgeSBjdW1wbGltaWVudG8gcG9yIHJlcHJlc2VudGFudGUsIHNlZ1x1MDBGQW4gaW5zdGFudFx1MDBFMW5lYXMgZGUgcHJvblx1MDBGM3N0aWNvJyB9LFxuICAgICAgICBwaXBlbGluZV9zdGFnZV9ieV9zb3VyY2U6IHsgdGl0bGU6ICdQaXBlbGluZSBwb3IgRXRhcGEgXHUwMEQ3IE9yaWdlbicsIGRlc2NyaXB0aW9uOiAnVGFibGEgY3J1emFkYSBkZWwgaW1wb3J0ZSBkZSBvcG9ydHVuaWRhZGVzIGFiaWVydGFzIHBvciBldGFwYSB5IG9yaWdlbicgfSxcbiAgICAgICAgd2luX3JhdGVfMTJtOiB7IHRpdGxlOiAnVGFzYSBkZSBcdTAwRTl4aXRvICgxMk0pJywgZGVzY3JpcHRpb246ICdOZWdvY2lvcyBnYW5hZG9zIGNvbW8gcG9yY2VudGFqZSBkZSB0b2RvcyBsb3MgbmVnb2Npb3MgcmVzdWVsdG9zIGVuIGxvcyBcdTAwRkFsdGltb3MgMTIgbWVzZXMnIH0sXG4gICAgICAgIHdvbl9kZWFsc18xMm06IHsgdGl0bGU6ICdOZWdvY2lvcyBnYW5hZG9zICgxMk0pJywgZGVzY3JpcHRpb246ICdFbCBudW1lcmFkb3IgZGUgbGEgdGFzYSBkZSBcdTAwRTl4aXRvJyB9LFxuICAgICAgICBsb3N0X2RlYWxzXzEybTogeyB0aXRsZTogJ05lZ29jaW9zIHBlcmRpZG9zICgxMk0pJywgZGVzY3JpcHRpb246ICdMYSBvdHJhIG1pdGFkIGRlbCBkZW5vbWluYWRvciBkZSBsYSB0YXNhIGRlIFx1MDBFOXhpdG8nIH0sXG4gICAgICAgIHdpbl9yYXRlX2J5X293bmVyOiB7IHRpdGxlOiAnR2FuYWRvcyAvIHBlcmRpZG9zIHBvciByZXByZXNlbnRhbnRlJywgZGVzY3JpcHRpb246ICdOZWdvY2lvcyBnYW5hZG9zLCBuZWdvY2lvcyBwZXJkaWRvcyB5IHRhc2EgZGUgXHUwMEU5eGl0byBwb3IgcmVwcmVzZW50YW50ZSBcdTIwMTQgXHUwMEZBbHRpbW9zIDEyIG1lc2VzJyB9LFxuICAgICAgICB3aW5fcmF0ZV9ieV9sZWFkX3NvdXJjZTogeyB0aXRsZTogJ0dhbmFkb3MgLyBwZXJkaWRvcyBwb3Igb3JpZ2VuIGRlbCBwcm9zcGVjdG8nLCBkZXNjcmlwdGlvbjogJ1F1XHUwMEU5IG9yXHUwMEVEZ2VuZXMgcHJvZHVjZW4gbmVnb2Npb3MgcXVlIHJlYWxtZW50ZSBzZSBjaWVycmFuIFx1MjAxNCBcdTAwRkFsdGltb3MgMTIgbWVzZXMnIH0sXG4gICAgICAgIGxvc3NfcmVhc29uX2JyZWFrZG93bjogeyB0aXRsZTogJ1BvciBxdVx1MDBFOSBwZXJkZW1vcycsIGRlc2NyaXB0aW9uOiAnTmVnb2Npb3MgcGVyZGlkb3MgcG9yIG1vdGl2byBcdTIwMTQgXHUwMEZBbHRpbW9zIDEyIG1lc2VzJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHNlcnZpY2VfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ1NlcnZpY2lvIGFsIGNsaWVudGUnLFxuICAgICAgZGVzY3JpcHRpb246ICdDYXJnYSBkZSBjYXNvcywgc2FsdWQgZGVsIFNMQSB5IHJlbmRpbWllbnRvIGRlIHJlc29sdWNpXHUwMEYzbicsXG4gICAgICB3aWRnZXRzOiB7XG4gICAgICAgIG9wZW5fY2FzZXM6IHsgdGl0bGU6ICdDYXNvcyBhYmllcnRvcycsIGRlc2NyaXB0aW9uOiAnQ2Fzb3MgcXVlIGFcdTAwRkFuIG5vIHNlIGhhbiBjZXJyYWRvJyB9LFxuICAgICAgICBjcml0aWNhbF9jYXNlczogeyB0aXRsZTogJ0Nhc29zIGNyXHUwMEVEdGljb3MnLCBkZXNjcmlwdGlvbjogJ0Nhc29zIGFiaWVydG9zIG1hcmNhZG9zIGNvbW8gcHJpb3JpZGFkIGNyXHUwMEVEdGljYScgfSxcbiAgICAgICAgYXZnX3Jlc29sdXRpb25fdGltZTogeyB0aXRsZTogJ1RpZW1wbyBtZWRpbyBkZSByZXNvbHVjaVx1MDBGM24nLCBkZXNjcmlwdGlvbjogJ1RpZW1wbyBtZWRpbyBoYXN0YSBlbCBjaWVycmUsIGVuIGhvcmFzJyB9LFxuICAgICAgICBzbGFfdmlvbGF0aW9uczogeyB0aXRsZTogJ0luY3VtcGxpbWllbnRvcyBkZSBTTEEnLCBkZXNjcmlwdGlvbjogJ0Nhc29zIHF1ZSBpbmN1bXBsaWVyb24gc3UgU0xBJyB9LFxuICAgICAgICBjYXNlc19ieV9zdGF0dXM6IHsgdGl0bGU6ICdDYXNvcyBwb3IgZXN0YWRvJywgZGVzY3JpcHRpb246ICdEaXN0cmlidWNpXHUwMEYzbiBkZSBsYSBjYXJnYSBhIGxvIGxhcmdvIGRlbCBwaXBlbGluZScgfSxcbiAgICAgICAgY2FzZXNfYnlfcHJpb3JpdHk6IHsgdGl0bGU6ICdDYXNvcyBwb3IgcHJpb3JpZGFkJywgZGVzY3JpcHRpb246ICdNZXpjbGEgZGUgY2Fzb3MgYWJpZXJ0b3MgcG9yIHVyZ2VuY2lhJyB9LFxuICAgICAgICBjYXNlc19ieV9vcmlnaW46IHsgdGl0bGU6ICdDYXNvcyBwb3Igb3JpZ2VuJywgZGVzY3JpcHRpb246ICdEZSBkXHUwMEYzbmRlIHByb3ZpZW5lbiBudWVzdHJvcyBjYXNvcycgfSxcbiAgICAgICAgZGFpbHlfY2FzZV92b2x1bWU6IHsgdGl0bGU6ICdWb2x1bWVuIGRpYXJpbyBkZSBjYXNvcycsIGRlc2NyaXB0aW9uOiAnQ2Fzb3MgbnVldm9zIGNyZWFkb3MgZW4gbG9zIFx1MDBGQWx0aW1vcyAzMCBkXHUwMEVEYXMnIH0sXG4gICAgICAgIHNsYV9jb21wbGlhbmNlX2dhdWdlOiB7IHRpdGxlOiAnQ3VtcGxpbWllbnRvIGRlIFNMQScsIGRlc2NyaXB0aW9uOiAnUG9yY2VudGFqZSBkZSBjYXNvcyByZXN1ZWx0b3MgZGVudHJvIGRlbCBTTEEgZW4gZXN0ZSBwZXJcdTAwRURvZG8nIH0sXG4gICAgICAgIGtiX2RlZmxlY3Rpb25fcmF0ZTogeyB0aXRsZTogJ1Rhc2EgZGUgRGVzdlx1MDBFRG8gcG9yIEtCJywgZGVzY3JpcHRpb246ICdQcm9wb3JjaVx1MDBGM24gZGUgY2Fzb3MgY2VycmFkb3MgcmVzdWVsdG9zIGNvbiB1biBhcnRcdTAwRURjdWxvIGRlIGxhIGJhc2UgZGUgY29ub2NpbWllbnRvJyB9LFxuICAgICAgICBrYl9yZXNvbHZlZF9jYXNlczogeyB0aXRsZTogJ1Jlc3VlbHRvcyBwb3IgS0InLCBkZXNjcmlwdGlvbjogJ0Nhc29zIGNlcnJhZG9zIHF1ZSBzZVx1MDBGMWFsYW4gZWwgYXJ0XHUwMEVEY3VsbyBxdWUgbG9zIHJlc29sdmlcdTAwRjMnIH0sXG4gICAgICAgIGNsb3NlZF9jYXNlc190b3RhbDogeyB0aXRsZTogJ0Nhc29zIENlcnJhZG9zJywgZGVzY3JpcHRpb246ICdFbCBkZW5vbWluYWRvciBkZSBsYSB0YXNhIGRlIGRlc3ZcdTAwRURvJyB9LFxuICAgICAgICB0b3BfcmVzb2x2aW5nX2FydGljbGVzOiB7IHRpdGxlOiAnQXJ0XHUwMEVEY3Vsb3MgcXVlIE1cdTAwRTFzIFJlc3VlbHZlbicsIGRlc2NyaXB0aW9uOiAnQXJ0XHUwMEVEY3Vsb3MgZGUgbGEgYmFzZSBkZSBjb25vY2ltaWVudG8gb3JkZW5hZG9zIHBvciBsb3MgY2Fzb3MgY2VycmFkb3MgcXVlIHJlc29sdmllcm9uJyB9LFxuICAgICAgICBteV9vcGVuX2Nhc2VzX2J5X3ByaW9yaXR5OiB7IHRpdGxlOiAnTWlzIGNhc29zIGFiaWVydG9zIHBvciBwcmlvcmlkYWQnLCBkZXNjcmlwdGlvbjogJ1R1cyBjYXNvcyBhYmllcnRvcyB5IHN1IHRhc2EgZGUgaW5jdW1wbGltaWVudG8gZGUgU0xBLCBkZXNnbG9zYWRvcyBwb3IgcHJpb3JpZGFkJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAvLyBgdGl0bGVgIC8gYHN1YnRpdGxlYCBzb24gbGFzIHByb3BpZWRhZGVzIGRlbCBjb21wb25lbnRlIGBwYWdlOmhlYWRlcmAuXG4gIC8vIExvcyBtYXJjYWRvcmVzIGB7XHUyMDI2fWAgc2Ugc3VzdGl0dXllbiBzb2JyZSBsYSBjYWRlbmEgVFJBRFVDSURBLCBhc1x1MDBFRCBxdWUgZWxcbiAgLy8gdG9rZW4gZGViZSBjb25zZXJ2YXJzZSB0YWwgY3VhbDogdHJhZHVjaWRvLCBubyByZXN1ZWx2ZSB5IHNlIHZlIHZhY1x1MDBFRG8uXG4gIGRhdGFzZXRzOiB7XG4gICAgYWNjb3VudF9tZXRyaWNzOiB7XG4gICAgICBsYWJlbDogJ01cdTAwRTl0cmljYXMgZGUgY3VlbnRhcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NhcGEgc2VtXHUwMEUxbnRpY2EgcGFyYSBlbCByZWN1ZW50byBkZSBjdWVudGFzIHBvciBzZWN0b3IgeSB0aXBvJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgaW5kdXN0cnk6IHtcbiAgICAgICAgICBsYWJlbDogJ1NlY3RvcicsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1RpcG8nLFxuICAgICAgICB9LFxuICAgICAgICBjcmVhdGVkX2F0OiB7XG4gICAgICAgICAgbGFiZWw6ICdDcmVhZG8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGFjY291bnRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0N1ZW50YXMnLFxuICAgICAgICB9LFxuICAgICAgICBhbm51YWxfcmV2ZW51ZV9zdW06IHtcbiAgICAgICAgICBsYWJlbDogJ0luZ3Jlc29zIGFudWFsZXMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNhc2VfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdNXHUwMEU5dHJpY2FzIGRlIGNhc29zJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2FwYSBzZW1cdTAwRTFudGljYSBwYXJhIGVsIHJlY3VlbnRvIGRlIGNhc29zLCBlbCB0aWVtcG8gZGUgcmVzb2x1Y2lcdTAwRjNuIHkgZWwgU0xBJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgY3JlYXRlZF9hdDoge1xuICAgICAgICAgIGxhYmVsOiAnQ3JlYWRvJyxcbiAgICAgICAgfSxcbiAgICAgICAgb3JpZ2luOiB7XG4gICAgICAgICAgbGFiZWw6ICdPcmlnZW4nLFxuICAgICAgICB9LFxuICAgICAgICBwcmlvcml0eToge1xuICAgICAgICAgIGxhYmVsOiAnUHJpb3JpZGFkJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZWRfYXJ0aWNsZToge1xuICAgICAgICAgIGxhYmVsOiAnQXJ0XHUwMEVEY3VsbyBkZSByZXNvbHVjaVx1MDBGM24nLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXM6IHtcbiAgICAgICAgICBsYWJlbDogJ0VzdGFkbycsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1RpcG8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGF2Z19yZXNvbHV0aW9uOiB7XG4gICAgICAgICAgbGFiZWw6ICdSZXNvbHVjaVx1MDBGM24gbWVkaWEgKGgpJyxcbiAgICAgICAgfSxcbiAgICAgICAgYXZnX3NsYV92aW9sYXRlZDoge1xuICAgICAgICAgIGxhYmVsOiAnVGFzYSBkZSBpbmN1bXBsaW1pZW50byBkZWwgU0xBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FzZV9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnQ2Fzb3MnLFxuICAgICAgICB9LFxuICAgICAgICBjbG9zZWRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0Nhc29zIGNlcnJhZG9zJyxcbiAgICAgICAgfSxcbiAgICAgICAga2JfZGVmbGVjdGlvbl9yYXRlOiB7XG4gICAgICAgICAgbGFiZWw6ICdUYXNhIGRlIGRlc3ZcdTAwRURvIHBvciBiYXNlIGRlIGNvbm9jaW1pZW50bycsXG4gICAgICAgIH0sXG4gICAgICAgIGtiX3Jlc29sdmVkX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdSZXN1ZWx0b3MgcG9yIGJhc2UgZGUgY29ub2NpbWllbnRvJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2xhX2NvbXBsaWFuY2VfcmF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnVGFzYSBkZSBjdW1wbGltaWVudG8gZGVsIFNMQScsXG4gICAgICAgIH0sXG4gICAgICAgIHNsYV9tZXRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0Nhc29zIGRlbnRybyBkZWwgU0xBJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb250YWN0X21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnTVx1MDBFOXRyaWNhcyBkZSBjb250YWN0b3MnLFxuICAgICAgZGVzY3JpcHRpb246ICdDYXBhIHNlbVx1MDBFMW50aWNhIHBhcmEgZWwgcmVjdWVudG8gZGUgY29udGFjdG9zJyxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGNvbnRhY3RfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0NvbnRhY3RvcycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZXZlbnRfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdNXHUwMEU5dHJpY2FzIGRlIGFjdGl2aWRhZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NhcGEgc2VtXHUwMEUxbnRpY2EgcGFyYSByZXVuaW9uZXMsIGxsYW1hZGFzIHkgcmVjZW5jaWEgZGUgaW50ZXJhY2NpXHUwMEYzbicsXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIG93bmVyOiB7XG4gICAgICAgICAgbGFiZWw6ICdQcm9waWV0YXJpbycsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0ZWRfdG9fdHlwZToge1xuICAgICAgICAgIGxhYmVsOiAnUmVsYWNpb25hZG8gY29uJyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhcnRfZGF0ZXRpbWU6IHtcbiAgICAgICAgICBsYWJlbDogJ1NlbWFuYSBkZSBhY3RpdmlkYWQnLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXM6IHtcbiAgICAgICAgICBsYWJlbDogJ0VzdGFkbycsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1RpcG8gZGUgYWN0aXZpZGFkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBhdmdfbWludXRlczoge1xuICAgICAgICAgIGxhYmVsOiAnRHVyYWNpXHUwMEYzbiBtZWRpYScsXG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50X2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdBY3RpdmlkYWRlcycsXG4gICAgICAgIH0sXG4gICAgICAgIHRvdGFsX21pbnV0ZXM6IHtcbiAgICAgICAgICBsYWJlbDogJ01pbnV0b3MnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGZvcmVjYXN0X21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnTVx1MDBFOXRyaWNhcyBkZSBwcmV2aXNpXHUwMEYzbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NhcGEgc2VtXHUwMEUxbnRpY2EgcGFyYSBjdW90YSwgY3VtcGxpbWllbnRvIHkgY29iZXJ0dXJhIGRlIHBpcGVsaW5lIHBvciBwcm9waWV0YXJpbycsXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIG93bmVyOiB7XG4gICAgICAgICAgbGFiZWw6ICdQcm9waWV0YXJpbycsXG4gICAgICAgIH0sXG4gICAgICAgIHBlcmlvZDoge1xuICAgICAgICAgIGxhYmVsOiAnVGlwbyBkZSBwZXJpb2RvJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGVyaW9kX2xhYmVsOiB7XG4gICAgICAgICAgbGFiZWw6ICdQZXJpb2RvJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGVyaW9kX3N0YXJ0OiB7XG4gICAgICAgICAgbGFiZWw6ICdJbmljaW8gZGVsIHBlcmlvZG8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGF0dGFpbm1lbnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0N1bXBsaW1pZW50bycsXG4gICAgICAgIH0sXG4gICAgICAgIGNsb3NlZF9zdW06IHtcbiAgICAgICAgICBsYWJlbDogJ0NlcnJhZG8nLFxuICAgICAgICB9LFxuICAgICAgICBjb21taXRfc3VtOiB7XG4gICAgICAgICAgbGFiZWw6ICdDb21wcm9tZXRpZG8nLFxuICAgICAgICB9LFxuICAgICAgICBwaXBlbGluZV9zdW06IHtcbiAgICAgICAgICBsYWJlbDogJ1BpcGVsaW5lJyxcbiAgICAgICAgfSxcbiAgICAgICAgcXVvdGFfc3VtOiB7XG4gICAgICAgICAgbGFiZWw6ICdDdW90YScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGVhZF9tZXRyaWNzOiB7XG4gICAgICBsYWJlbDogJ01cdTAwRTl0cmljYXMgZGUgcHJvc3BlY3RvcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NhcGEgc2VtXHUwMEUxbnRpY2EgcGFyYSBlbCByZWN1ZW50byBkZSBwcm9zcGVjdG9zJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgY3JlYXRlZF9hdDoge1xuICAgICAgICAgIGxhYmVsOiAnQ3JlYWRvJyxcbiAgICAgICAgfSxcbiAgICAgICAgbGFzdF9jb250YWN0ZWRfZGF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHUwMERBbHRpbW8gY29udGFjdG8nLFxuICAgICAgICB9LFxuICAgICAgICBsZWFkX3NvdXJjZToge1xuICAgICAgICAgIGxhYmVsOiAnT3JpZ2VuJyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgbGFiZWw6ICdFc3RhZG8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGxlYWRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1Byb3NwZWN0b3MnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG9wcG9ydHVuaXR5X21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnTVx1MDBFOXRyaWNhcyBkZSBvcG9ydHVuaWRhZGVzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2FwYSBzZW1cdTAwRTFudGljYSBwYXJhIGVsIHJlY3VlbnRvIHkgbG9zIGltcG9ydGVzIGRlbCBwaXBlbGluZSBkZSB2ZW50YXMnLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBhY2NvdW50X2luZHVzdHJ5OiB7XG4gICAgICAgICAgbGFiZWw6ICdTZWN0b3IgZGUgbGEgY3VlbnRhJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VfZGF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnRmVjaGEgZGUgY2llcnJlJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VfcXVhcnRlcjoge1xuICAgICAgICAgIGxhYmVsOiAnVHJpbWVzdHJlIGRlIGNpZXJyZScsXG4gICAgICAgIH0sXG4gICAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiB7XG4gICAgICAgICAgbGFiZWw6ICdDYXRlZ29yXHUwMEVEYSBkZSBwcmV2aXNpXHUwMEYzbicsXG4gICAgICAgIH0sXG4gICAgICAgIGxlYWRfc291cmNlOiB7XG4gICAgICAgICAgbGFiZWw6ICdPcmlnZW4gZGVsIHByb3NwZWN0bycsXG4gICAgICAgIH0sXG4gICAgICAgIGxvc3NfcmVhc29uOiB7XG4gICAgICAgICAgbGFiZWw6ICdNb3Rpdm8gZGUgcFx1MDBFOXJkaWRhJyxcbiAgICAgICAgfSxcbiAgICAgICAgb3duZXI6IHtcbiAgICAgICAgICBsYWJlbDogJ1Byb3BpZXRhcmlvJyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhZ2U6IHtcbiAgICAgICAgICBsYWJlbDogJ0V0YXBhJyxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgIGxhYmVsOiAnVGlwbyBkZSBuZWdvY2lvJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2luX3JlYXNvbjoge1xuICAgICAgICAgIGxhYmVsOiAnTW90aXZvIGRlIGdhbmFuY2lhJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBhdmdfYW1vdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdUYW1hXHUwMEYxbyBtZWRpbyBkZWwgbmVnb2NpbycsXG4gICAgICAgIH0sXG4gICAgICAgIGF2Z19wcm9iYWJpbGl0eToge1xuICAgICAgICAgIGxhYmVsOiAnUHJvYmFiaWxpZGFkIG1lZGlhJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVjaWRlZF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnTmVnb2Npb3MgcmVzdWVsdG9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgbG9zdF9hbW91bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0luZ3Jlc29zIHBlcmRpZG9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgbG9zdF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnTmVnb2Npb3MgcGVyZGlkb3MnLFxuICAgICAgICB9LFxuICAgICAgICBvcHBfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ09wb3J0dW5pZGFkZXMnLFxuICAgICAgICB9LFxuICAgICAgICB0b3RhbF9hbW91bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0ltcG9ydGUgdG90YWwnLFxuICAgICAgICB9LFxuICAgICAgICB3aW5fcmF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnVGFzYSBkZSBnYW5hbmNpYScsXG4gICAgICAgIH0sXG4gICAgICAgIHdvbl9hbW91bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0luZ3Jlc29zIGdhbmFkb3MnLFxuICAgICAgICB9LFxuICAgICAgICB3b25fY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ05lZ29jaW9zIGdhbmFkb3MnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHByb2R1Y3RfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdNXHUwMEU5dHJpY2FzIGRlIHByb2R1Y3RvcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NhcGEgc2VtXHUwMEUxbnRpY2EgcGFyYSBlbCByZWN1ZW50byBkZWwgY2F0XHUwMEUxbG9nbyB5IGVsIHByZWNpbyBkZSBsaXN0YScsXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIGNhdGVnb3J5OiB7XG4gICAgICAgICAgbGFiZWw6ICdDYXRlZ29yXHUwMEVEYScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbWVhc3VyZXM6IHtcbiAgICAgICAgbGlzdF9wcmljZV9zdW06IHtcbiAgICAgICAgICBsYWJlbDogJ1ByZWNpbyBkZSBsaXN0YSB0b3RhbCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByb2R1Y3RfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1Byb2R1Y3RvcycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgdGFza19tZXRyaWNzOiB7XG4gICAgICBsYWJlbDogJ01cdTAwRTl0cmljYXMgZGUgdGFyZWFzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2FwYSBzZW1cdTAwRTFudGljYSBwYXJhIGxhIGNhcmdhIGRlIHRyYWJham8geSBsYSBmaW5hbGl6YWNpXHUwMEYzbiBkZSB0YXJlYXMnLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBkdWVfZGF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnRmVjaGEgZGUgdmVuY2ltaWVudG8nLFxuICAgICAgICB9LFxuICAgICAgICBpc19jb21wbGV0ZWQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0NvbXBsZXRhZGEnLFxuICAgICAgICB9LFxuICAgICAgICBpc19vdmVyZHVlOiB7XG4gICAgICAgICAgbGFiZWw6ICdWZW5jaWRhJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJpb3JpdHk6IHtcbiAgICAgICAgICBsYWJlbDogJ1ByaW9yaWRhZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByaW9yaXR5X3Jhbms6IHtcbiAgICAgICAgICBsYWJlbDogJ1VyZ2VuY2lhJyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgbGFiZWw6ICdFc3RhZG8nLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgbGFiZWw6ICdUaXBvJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBhdmdfcHJvZ3Jlc3M6IHtcbiAgICAgICAgICBsYWJlbDogJ1Byb2dyZXNvIG1lZGlvJyxcbiAgICAgICAgfSxcbiAgICAgICAgdGFza19jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnVGFyZWFzJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcGFnZXM6IHtcbiAgICBhY2NvdW50X2RldGFpbF9wYWdlOiB7XG4gICAgICBsYWJlbDogJ0RldGFsbGUgZGUgQ3VlbnRhJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUFx1MDBFMWdpbmEgZGUgcmVnaXN0cm8gZGUgY3VlbnRhIHBvciBzbG90czogY2FiZWNlcmEgcGVyc29uYWxpemFkYSArIGZlZWQgZGUgZGlzY3VzaVx1MDBGM24gcGVybWFuZW50ZS4nLFxuICAgICAgdGl0bGU6ICd7bmFtZX0nLFxuICAgICAgc3VidGl0bGU6ICd7aW5kdXN0cnl9IFx1MDBCNyB7dHlwZX0nLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBhY2NvdW50X2NoYXR0ZXI6IHsgbGFiZWw6ICdEaXNjdXNpXHUwMEYzbicgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhY2NvdW50X3dvcmtiZW5jaDoge1xuICAgICAgbGFiZWw6ICdNZXNhIGRlIFRyYWJham8gZGUgQ3VlbnRhcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0xpc3RhIGRlIGN1ZW50YXMgY3VyYWRhIHBhcmEgZWwgZXF1aXBvIGNvbWVyY2lhbDogc29sbyBmaWx0cm9zIHJcdTAwRTFwaWRvcywgc2luIGdlc3RpXHUwMEYzbiBkZSB2aXN0YXMuJyxcbiAgICB9LFxuICAgIGFwcF9sYXVuY2hlcl9wYWdlOiB7XG4gICAgICBsYWJlbDogJ0xhbnphZG9yIGRlIEFwbGljYWNpb25lcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1B1bnRvIGRlIGFjY2VzbyBjZW50cmFsIGEgdG9kYXMgbGFzIGFwbGljYWNpb25lcycsXG4gICAgICBzdWJ0aXRsZTogJ1NlbGVjY2lvbmUgdW5hIGFwbGljYWNpXHUwMEYzbiBwYXJhIGVtcGV6YXInLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBhcHBfc2VhcmNoOiB7IGxhYmVsOiAnQnVzY2FyIEFwbGljYWNpb25lcycgfSxcbiAgICAgICAgYXBwX2dyaWQ6IHsgbGFiZWw6ICdDdWFkclx1MDBFRGN1bGEgZGUgQXBsaWNhY2lvbmVzJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNhc2VfZGV0YWlsX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnRGV0YWxsZSBkZSBDYXNvJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUFx1MDBFMWdpbmEgZGUgY2FzbyBwYXJhIGVsIGFnZW50ZSBkZSBzZXJ2aWNpbzogZGF0b3MgZGVzdGFjYWRvcywgcHJvZ3Jlc28gZGVsIFNMQSwgZGV0YWxsZXMgeSBjcm9ub2xvZ1x1MDBFRGEgZGUgYWN0aXZpZGFkLicsXG4gICAgICB0aXRsZTogJ3tjYXNlX251bWJlcn0gXHUwMEI3IHtzdWJqZWN0fScsXG4gICAgICBzdWJ0aXRsZTogJ3tjcm1fYWNjb3VudH0nLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBjYXNlX2hpZ2hsaWdodHM6IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIENsYXZlJyB9LFxuICAgICAgICBjYXNlX3N0YXR1c19wYXRoOiB7IGxhYmVsOiAnUHJvZ3Jlc28gZGVsIEVzdGFkbyBkZWwgQ2FzbycgfSxcbiAgICAgICAgY2FzZV9kZXRhaWxzOiB7IGxhYmVsOiAnRGV0YWxsZXMgZGVsIENhc28nIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGVhZF9kZXRhaWxfcGFnZToge1xuICAgICAgbGFiZWw6ICdEZXRhbGxlIGRlIFByb3NwZWN0bycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1BcdTAwRTFnaW5hIGNvbXBsZXRhIGRlIGRldGFsbGUgZGVsIHByb3NwZWN0bywgY29uIGRhdG9zIGRlc3RhY2Fkb3MsIGRldGFsbGVzIGUgaW5mb3JtYWNpXHUwMEYzbiByZWxhY2lvbmFkYScsXG4gICAgICB0aXRsZTogJ3tmaXJzdF9uYW1lfSB7bGFzdF9uYW1lfScsXG4gICAgICBzdWJ0aXRsZTogJ3tjb21wYW55fScsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIGxlYWRfZHVwbGljYXRlX2FsZXJ0X2NvbmZpcm1lZDogeyBsYWJlbDogJ0F2aXNvIGRlIGR1cGxpY2FkbyBjb25maXJtYWRvJyB9LFxuICAgICAgICBsZWFkX2R1cGxpY2F0ZV9hbGVydF9zdXNwZWN0ZWQ6IHsgbGFiZWw6ICdBdmlzbyBkZSBkdXBsaWNhZG8gc29zcGVjaG9zbycgfSxcbiAgICAgICAgbGVhZF9oaWdobGlnaHRzOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBDbGF2ZScgfSxcbiAgICAgICAgbGVhZF9wYXRoOiB7IGxhYmVsOiAnUHJvZ3Jlc28gZGVsIEVzdGFkbyBkZWwgUHJvc3BlY3RvJyB9LFxuICAgICAgICBtYWluX3RhYnM6IHsgbGFiZWw6ICdQZXN0YVx1MDBGMWFzIGRlIEluZm9ybWFjaVx1MDBGM24gZGVsIFByb3NwZWN0bycgfSxcbiAgICAgICAgbGVhZF9kZXRhaWxzOiB7IGxhYmVsOiAnRGV0YWxsZXMgZGVsIFByb3NwZWN0bycgfSxcbiAgICAgICAgcmVsYXRlZF9hY2NvcmRpb246IHsgbGFiZWw6ICdSZWdpc3Ryb3MgUmVsYWNpb25hZG9zJyB9LFxuICAgICAgICByZWxhdGVkX3Rhc2tzOiB7IHRpdGxlOiAnVGFyZWFzIEFiaWVydGFzJywgbGFiZWw6ICdUYXJlYXMnIH0sXG4gICAgICAgIGxlYWRfYWN0aXZpdHk6IHsgbGFiZWw6ICdDcm9ub2xvZ1x1MDBFRGEgZGUgQWN0aXZpZGFkJyB9LFxuICAgICAgICBsZWFkX2hpc3Rvcnk6IHsgbGFiZWw6ICdIaXN0b3JpYWwgZGUgQ2FtcG9zJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG9wcG9ydHVuaXR5X2RldGFpbF9wYWdlOiB7XG4gICAgICBsYWJlbDogJ0RldGFsbGUgZGUgT3BvcnR1bmlkYWQnLFxuICAgICAgZGVzY3JpcHRpb246ICdQXHUwMEUxZ2luYSBjb21wbGV0YSBkZSBkZXRhbGxlIGRlIGxhIG9wb3J0dW5pZGFkLCBjb24gcmVjb3JyaWRvIGRlIGV0YXBhcywgZGF0b3MgZGVzdGFjYWRvcywgZGV0YWxsZXMgeSBsaXN0YXMgcmVsYWNpb25hZGFzJyxcbiAgICAgIHRpdGxlOiAne25hbWV9JyxcbiAgICAgIHN1YnRpdGxlOiAne2NybV9hY2NvdW50fScsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIG9wcF9oaWdobGlnaHRzOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBDbGF2ZScgfSxcbiAgICAgICAgb3BwX3N0YWdlX3BhdGg6IHsgbGFiZWw6ICdQcm9ncmVzbyBkZSBFdGFwYSBkZSBsYSBPcG9ydHVuaWRhZCcgfSxcbiAgICAgICAgb3BwX2RldGFpbHM6IHsgbGFiZWw6ICdEZXRhbGxlcyBkZSBsYSBPcG9ydHVuaWRhZCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzYWxlc19ob21lX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnSW5pY2lvIGRlIFZlbnRhcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1BcdTAwRTFnaW5hIGRlIGluaWNpbyBkZWwgZXF1aXBvIGNvbWVyY2lhbCBjb24gbVx1MDBFOXRyaWNhcyBjbGF2ZSB5IGFjY2lvbmVzIHJcdTAwRTFwaWRhcycsXG4gICAgICB0aXRsZTogJ1BhbmVsIGRlIFZlbnRhcycsXG4gICAgICBzdWJ0aXRsZTogJ0JpZW52ZW5pZG8gZGUgbnVldm8nLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBrcGlfcmV2ZW51ZV93b246IHtcbiAgICAgICAgICBsYWJlbDogJ0luZ3Jlc29zIChnYW5hZG9zKScsXG4gICAgICAgIH0sXG4gICAgICAgIGtwaV9kZWFsc193b246IHtcbiAgICAgICAgICBsYWJlbDogJ05lZ29jaW9zIGdhbmFkb3MnLFxuICAgICAgICB9LFxuICAgICAgICBrcGlfcGlwZWxpbmVfdmFsdWU6IHtcbiAgICAgICAgICBsYWJlbDogJ1ZhbG9yIGRlbCBwaXBlbGluZScsXG4gICAgICAgIH0sXG4gICAgICAgIGtwaV9vcGVuX2xlYWRzOiB7XG4gICAgICAgICAgbGFiZWw6ICdQcm9zcGVjdG9zIGFiaWVydG9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgaG9tZV91cGNvbWluZ19ldmVudHM6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1RDgzRFx1RENDNSBQclx1MDBGM3hpbW9zIFx1MDBCNyBNXHUwMEUxcyBjZXJjYW5vcyBwcmltZXJvJyxcbiAgICAgICAgfSxcbiAgICAgICAgcXVpY2tfY3JlYXRlOiB7IHRpdGxlOiAnQ3JlYWNpXHUwMEYzbiBSXHUwMEUxcGlkYScsIGxhYmVsOiAnQ3JlYWNpXHUwMEYzbiBSXHUwMEUxcGlkYScgfSxcbiAgICAgICAga2V5X21ldHJpY3M6IHsgdGl0bGU6ICdJbmRpY2Fkb3JlcyBDbGF2ZSBkZSBSZW5kaW1pZW50bycsIGxhYmVsOiAnTVx1MDBFOXRyaWNhcyBDbGF2ZScgfSxcbiAgICAgICAgaG9tZV90YWJzOiB7IGxhYmVsOiAnUGVzdGFcdTAwRjFhcyBkZSBJbmljaW8nIH0sXG4gICAgICAgIGhvbWVfbXlfbGVhZHM6IHsgbGFiZWw6ICdNaXMgUHJvc3BlY3RvcycgfSxcbiAgICAgICAgaG9tZV9teV9kZWFsczogeyBsYWJlbDogJ01pcyBOZWdvY2lvcyBBYmllcnRvcycgfSxcbiAgICAgICAgaG9tZV9teV90YXNrczogeyBsYWJlbDogJ01pcyBUYXJlYXMgQWJpZXJ0YXMnIH0sXG4gICAgICAgIGFpX2JyaWVmaW5nOiB7XG4gICAgICAgICAgdGl0bGU6ICdQcmVnXHUwMEZBbnRhbGUgYWwgQXNpc3RlbnRlIGRlIElBJyxcbiAgICAgICAgICBsYWJlbDogJ0hveSBjb24gZWwgQXNpc3RlbnRlIGRlIElBJyxcbiAgICAgICAgfSxcbiAgICAgICAgdXBjb21pbmdfZXZlbnRzOiB7IHRpdGxlOiAnUHJcdTAwRjN4aW1vcyBFdmVudG9zJywgbGFiZWw6ICdQclx1MDBGM3hpbW9zIEV2ZW50b3MnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgdXRpbGl0eV9iYXJfcGFnZToge1xuICAgICAgbGFiZWw6ICdCYXJyYSBkZSBVdGlsaWRhZGVzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQmFycmEgZGUgYWNjZXNvIHJcdTAwRTFwaWRvIGNvbiBoZXJyYW1pZW50YXMgZmxvdGFudGVzJyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgbm90aWZpY2F0aW9uc19wYW5lbDogeyBsYWJlbDogJ05vdGlmaWNhY2lvbmVzJyB9LFxuICAgICAgICBxdWlja19ub3RlczogeyB0aXRsZTogJ05vdGFzIFJcdTAwRTFwaWRhcycsIGxhYmVsOiAnTm90YXMgUlx1MDBFMXBpZGFzJyB9LFxuICAgICAgICBxdWlja19zZWFyY2g6IHsgbGFiZWw6ICdCXHUwMEZBc3F1ZWRhIFJcdTAwRTFwaWRhJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAvLyBTY3JlZW4tZmxvdyBjb3B5ICgjMTIxMCwgIzE5NzUpLiBLZXllZCBgZmxvd3MuPGZsb3c+LmxhYmVsYCxcbiAgLy8gYHNjcmVlbnMuPG5vZGU+LnRpdGxlYCBhbmQgYHNjcmVlbnMuPG5vZGU+LmZpZWxkcy48ZmllbGQ+LntsYWJlbCxwbGFjZWhvbGRlcn1gXG4gIC8vIFx1MjAxNCB0aGUga2V5cyBgb3MgbGludGAncyBgaTE4bi9taXNzaW5nLWZsb3dgIG5hbWVzLCByZWFkIGJ5IHRoZSBjb25zb2xlJ3NcbiAgLy8gZmxvdyBydW5uZXIgc2luY2UgQG9iamVjdHN0YWNrIDE3LjcuMCAodGhlIHNwZWMncyBgZmxvd3NgIGxpdmVuZXNzIHJvdyBpc1xuICAvLyBgbGl2ZWAgdGhlcmUpLiBBIHNjcmVlbiB3aXRoIG5vIGF1dGhvcmVkIGB0aXRsZWAgc2hvd3MgaXRzIGZsb3cncyBsYWJlbCBpblxuICAvLyBldmVyeSBsb2NhbGUsIHNvIGVhY2ggYHNjcmVlbl8xLnRpdGxlYCByZXBlYXRzIHRoZSBmbG93IGxhYmVsLiBTaW5jZVxuICAvLyAxOC4wLjAtbmV4dC4wIHRocmVlIG1vcmUgc3VyZmFjZXMgYXJlIGtleXMgdGhlIGVuZ2luZSByZWFkcyBpbiB0aGUgcnVuJ3NcbiAgLy8gbG9jYWxlLCBhbmQgYGkxOG4vbWlzc2luZy1mbG93YCBuYW1lcyBlYWNoIG1pc3Npbmcgb25lOiBhIHNlbGVjdCBmaWVsZCdzXG4gIC8vIGBvcHRpb25zLjx2YWx1ZT5gICh3b3JkZWQgYXMgdGhlIG9iamVjdCBmaWVsZCdzIG93biBvcHRpb24gaW4gdGhpcyBwYWNrKSxcbiAgLy8gYW4gYXV0aG9yZWQgc2NyZWVuIGBkZXNjcmlwdGlvbmAsIGFuZCBhIHJlZnVzaW5nIGBlbmRgIG5vZGUnc1xuICAvLyBgcmVmdXNhbHMuPG5vZGU+Lm1lc3NhZ2VgLiBBIHRyYW5zbGF0ZWQgZGVzY3JpcHRpb24gb3IgbWVzc2FnZSBpcyBhIHRleHRcbiAgLy8gc2xvdCBsaWtlIHRoZSBvbmUgaXQgdHJhbnNsYXRlcywgc28gYSBob2xlIGluIGl0IGlzIGB7eyB9fWAuXG4gIC8vIFRoZSBkaXNjb3VudCBjZWlsaW5nIGlzIGludGVycG9sYXRlZCBmcm9tIGBRVU9URV9ESVNDT1VOVF9DRUlMSU5HYCwgbmV2ZXJcbiAgLy8gcmV0eXBlZDogdGhlIG51bWJlciBsaXZlcyBpbiBgX3RocmVzaG9sZHMudHNgIGFsb25lICgjMTcxMSkuXG4gIGZsb3dzOiB7XG4gICAgY2FtcGFpZ25fZW5yb2xsbWVudDoge1xuICAgICAgbGFiZWw6ICdJbnNjcmliaXIgbWllbWJyb3MgZW4gbGEgY2FtcGFcdTAwRjFhJyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ0luc2NyaWJpciBtaWVtYnJvcyBlbiBsYSBjYW1wYVx1MDBGMWEnLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgbWVtYmVyU291cmNlOiB7IGxhYmVsOiAnVGlwbyBkZSBtaWVtYnJvIGEgaW5zY3JpYmlyJywgb3B0aW9uczogeyBsZWFkczogJ1Byb3NwZWN0b3MnLCBjb250YWN0czogJ0NvbnRhY3RvcycgfSB9LFxuICAgICAgICAgICAgbGVhZFN0YXR1czogeyBsYWJlbDogJ0luc2NyaWJpciBwcm9zcGVjdG9zIGNvbiBlc3RhZG8nLCBvcHRpb25zOiB7IG5ldzogJ051ZXZvJywgY29udGFjdGVkOiAnQ29udGFjdGFkbycsIHF1YWxpZmllZDogJ0NhbGlmaWNhZG8nIH0gfSxcbiAgICAgICAgICAgIGNvbnRhY3REZXBhcnRtZW50OiB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnSW5zY3JpYmlyIGNvbnRhY3RvcyBkZWwgZGVwYXJ0YW1lbnRvJyxcbiAgICAgICAgICAgICAgb3B0aW9uczogeyBleGVjdXRpdmU6ICdFamVjdXRpdm8nLCBzYWxlczogJ1ZlbnRhcycsIG1hcmtldGluZzogJ01hcmtldGluZycsIGVuZ2luZWVyaW5nOiAnSW5nZW5pZXJcdTAwRURhJywgc3VwcG9ydDogJ1NvcG9ydGUnLCBmaW5hbmNlOiAnRmluYW56YXMnLCBocjogJ1JlY3Vyc29zIEh1bWFub3MnLCBvcGVyYXRpb25zOiAnT3BlcmFjaW9uZXMnIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZXNjYWxhdGVfY2FzZToge1xuICAgICAgbGFiZWw6ICdFc2NhbGFyIENhc28nLFxuICAgICAgc2NyZWVuczogeyBzY3JlZW5fMTogeyB0aXRsZTogJ0VzY2FsYXIgQ2FzbycsIGZpZWxkczogeyByZWFzb246IHsgbGFiZWw6ICdNb3Rpdm8gZGUgRXNjYWxhY2lcdTAwRjNuJyB9IH0gfSB9LFxuICAgIH0sXG4gICAgY2xvc2VfY2FzZToge1xuICAgICAgbGFiZWw6ICdDZXJyYXIgQ2FzbycsXG4gICAgICBzY3JlZW5zOiB7XG4gICAgICAgIHNjcmVlbl8xOiB7XG4gICAgICAgICAgdGl0bGU6ICdDZXJyYXIgQ2FzbycsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICByZXNvbHV0aW9uOiB7IGxhYmVsOiAnUmVzb2x1Y2lcdTAwRjNuJyB9LFxuICAgICAgICAgICAgcmVzb2x2ZWRfYnlfYXJ0aWNsZTogeyBsYWJlbDogJ1Jlc3VlbHRvIGNvbiBhcnRcdTAwRURjdWxvIChvcGNpb25hbCknIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjbGFpbV9jYXNlOiB7XG4gICAgICBsYWJlbDogJ1RvbWFyIENhc28nLFxuICAgICAgc2NyZWVuczoge1xuICAgICAgICBzY3JlZW5fMToge1xuICAgICAgICAgIHRpdGxlOiAnVG9tYXIgQ2FzbycsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBjbGFpbVN0YXR1czoge1xuICAgICAgICAgICAgICBsYWJlbDogJ0VzdGFkbyBkZSB0cmFiYWpvJyxcbiAgICAgICAgICAgICAgb3B0aW9uczogeyBpbl9wcm9ncmVzczogJ0VuIEN1cnNvJywgd2FpdGluZ19jdXN0b21lcjogJ0VzcGVyYW5kbyBhbCBDbGllbnRlJywgd2FpdGluZ19zdXBwb3J0OiAnRXNwZXJhbmRvIGEgU29wb3J0ZScgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsZWFkX2NvbnZlcnNpb246IHtcbiAgICAgIGxhYmVsOiAnUHJvY2VzbyBkZSBjb252ZXJzaVx1MDBGM24gZGUgcHJvc3BlY3RvJyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1Byb2Nlc28gZGUgY29udmVyc2lcdTAwRjNuIGRlIHByb3NwZWN0bycsXG4gICAgICAgICAgLy8gVGhlIGR1cGxpY2F0ZSB3YXJuaW5nJ3MgdGV4dCBpcyBhIHZhcmlhYmxlIHRoZSBmbG93IGFzc2lnbnM7IHRoaXNcbiAgICAgICAgICAvLyBrZXkgY2FuIG9ubHkgY2FycnkgdGhlIGhvbGUgdGhhdCBzaG93cyBpdC5cbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ3t7ZHVwbGljYXRlV2FybmluZ319JyxcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIGNyZWF0ZU9wcG9ydHVuaXR5OiB7IGxhYmVsOiAnXHUwMEJGQ3JlYXIgb3BvcnR1bmlkYWQ/JyB9LFxuICAgICAgICAgICAgb3Bwb3J0dW5pdHlOYW1lOiB7IGxhYmVsOiAnTm9tYnJlIGRlIE9wb3J0dW5pZGFkJyB9LFxuICAgICAgICAgICAgb3Bwb3J0dW5pdHlBbW91bnQ6IHsgbGFiZWw6ICdNb250byBkZSBsYSBPcG9ydHVuaWRhZCcgfSxcbiAgICAgICAgICAgIGNsb3NlRGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIENpZXJyZScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByZWZ1c2VfY29uZmlybWVkX2R1cGxpY2F0ZToge1xuICAgICAgICAgIHRpdGxlOiAnQ29udmVyc2lcdTAwRjNuIHJlY2hhemFkYScsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnRWwgRXN0YWRvIGRlbCBEdXBsaWNhZG8gZGUgZXN0ZSBwcm9zcGVjdG8gZXMgQ29uZmlybWFkbzogdW4gcmV2aXNvciBsbyBjb21wYXJcdTAwRjMgY29uIHVuIHJlZ2lzdHJvIGV4aXN0ZW50ZSB5IHJlZ2lzdHJcdTAwRjMgcXVlIGxvIHJlcGl0ZS4gQ29udmVydGlybG8gY3JlYXJcdTAwRURhIHVuYSBzZWd1bmRhIGN1ZW50YSwgY29udGFjdG8geSBvcG9ydHVuaWRhZCBwYXJhIGVsIG1pc21vIGNvbXByYWRvci4gTGEgc2VjY2lcdTAwRjNuIEdlc3RpXHUwMEYzbiBkZSBEdXBsaWNhZG9zIGRlIGVzdGUgcHJvc3BlY3RvIGluZGljYSBlbCByZWdpc3RybyBxdWUgc2UgY29uc2VydmE7IGRlc2NhbGlmaXF1ZSBlc3RlIHByb3NwZWN0byBjb21vIGR1cGxpY2Fkby4gU29sbyB1biByZXZpc29yIHF1ZSBjYW1iaWUgZXNlIHZlcmVkaWN0byB2dWVsdmUgYSBoYWJpbGl0YXIgbGEgY29udmVyc2lcdTAwRjNuLicsXG4gICAgICAgIH0sXG4gICAgICAgIHJlZnVzZV91bmFwcHJvdmVkOiB7XG4gICAgICAgICAgdGl0bGU6ICdDb252ZXJzaVx1MDBGM24gcmVjaGF6YWRhJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdFc3RlIHByb3NwZWN0byBubyBoYSBzaWRvIGFwcm9iYWRvIHBhcmEgbGEgY29udmVyc2lcdTAwRjNuLiBVbiBhcHJvYmFkb3IgZGViZSBkYXJsZSBlbCB2aXN0byBidWVubyBhbnRlcyBkZSBxdWUgcHVlZGEgY29udmVydGlyc2UgZW4gdW5hIGN1ZW50YSwgdW4gY29udGFjdG8geSB1bmEgb3BvcnR1bmlkYWQ7IGVsIGNhbXBvIEFwcm9iYWNpXHUwMEYzbiBkZSBDb252ZXJzaVx1MDBGM24gZGVsIHByb3NwZWN0byBtdWVzdHJhIHNpIGxhIGRlY2lzaVx1MDBGM24gc2lndWUgcGVuZGllbnRlIG8gZnVlIHJlY2hhemFkYS4gTWllbnRyYXMgdGFudG8sIHNpZ2EgdHJhYmFqYW5kbyBlbCBwcm9zcGVjdG86IG5hZGEgZGUgXHUwMEU5bCBxdWVkYSBibG9xdWVhZG8uJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVmdXNlX25vX21hdGNoX2tleToge1xuICAgICAgICAgIHRpdGxlOiAnQ29udmVyc2lcdTAwRjNuIHJlY2hhemFkYScsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnTGEgZW1wcmVzYSBkZSBlc3RlIHByb3NwZWN0byBubyB0aWVuZSBjbGF2ZSBkZSBjb2luY2lkZW5jaWEsIGFzXHUwMEVEIHF1ZSBsYSBjb252ZXJzaVx1MDBGM24gbm8gcHVlZGUgc2FiZXIgYSBxdVx1MDBFOSBjdWVudGEgcGVydGVuZWNlIHkgbm8gbG8gdmEgYSBhZGl2aW5hcjogdW5hIHN1cG9zaWNpXHUwMEYzbiBwb2RyXHUwMEVEYSBhcmNoaXZhciBlbCBjb250YWN0byB5IGxhIG9wb3J0dW5pZGFkIGJham8gb3RybyBjbGllbnRlLiBHdWFyZGFyIGxhIEVtcHJlc2EgZGVsIHByb3NwZWN0byByZWNvbnN0cnV5ZSBsYSBjbGF2ZSwgYXNcdTAwRUQgcXVlIGd1XHUwMEUxcmRlbGEgZGUgbnVldm8geSBsdWVnbyBjb252aVx1MDBFOXJ0YWxvLiBObyBzZSBoYSBjcmVhZG8gbmFkYS4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHNjaGVkdWxlX2ZvbGxvd3VwOiB7XG4gICAgICBsYWJlbDogJ1Byb2dyYW1hciBTZWd1aW1pZW50bycsXG4gICAgICBzY3JlZW5zOiB7XG4gICAgICAgIHNjcmVlbl8xOiB7XG4gICAgICAgICAgdGl0bGU6ICdQcm9ncmFtYXIgU2VndWltaWVudG8nLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1x1MDBCRkN1XHUwMEUxbCBlcyBlbCBzaWd1aWVudGUgcGFzbz8nIH0sXG4gICAgICAgICAgICBkdWVEYXRlOiB7IGxhYmVsOiAnRmVjaGEgTFx1MDBFRG1pdGUnIH0sXG4gICAgICAgICAgICBhY3Rpdml0eVR5cGU6IHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdUaXBvIGRlIEFjdGl2aWRhZCcsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHsgY2FsbDogJ0xsYW1hZGEnLCBlbWFpbDogJ0VtYWlsJywgbWVldGluZzogJ1JldW5pXHUwMEYzbicsIGZvbGxvd191cDogJ1NlZ3VpbWllbnRvJywgZGVtbzogJ0RlbW9zdHJhY2lcdTAwRjNuJywgb3RoZXI6ICdPdHJvJyB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByaW9yaXR5OiB7IGxhYmVsOiAnUHJpb3JpZGFkJywgb3B0aW9uczogeyBsb3c6ICdCYWphJywgbm9ybWFsOiAnTm9ybWFsJywgaGlnaDogJ0FsdGEnLCB1cmdlbnQ6ICdVcmdlbnRlJyB9IH0sXG4gICAgICAgICAgICBub3RlczogeyBsYWJlbDogJ05vdGFzJyB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgcXVvdGVfZ2VuZXJhdGlvbjoge1xuICAgICAgbGFiZWw6ICdHZW5lcmFyIGNvdGl6YWNpXHUwMEYzbiBkZXNkZSBsYSBvcG9ydHVuaWRhZCcsXG4gICAgICByZWZ1c2FsczogeyByZWZ1c2VfaGVsZDogeyBtZXNzYWdlOiAnUHJpbWVybyB2YSBsYSBhcHJvYmFjaVx1MDBGM24gZGUgY2FsaWZpY2FjaVx1MDBGM246IG1hcnF1ZSBTb2xpY2l0YXIgQXByb2JhY2lcdTAwRjNuIGRlIENhbGlmaWNhY2lcdTAwRjNuLiBObyBzZSBjcmVcdTAwRjMgbmFkYS4nIH0gfSxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ0dlbmVyYXIgY290aXphY2lcdTAwRjNuIGRlc2RlIGxhIG9wb3J0dW5pZGFkJyxcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIHF1b3RlTmFtZTogeyBsYWJlbDogJ05vbWJyZSBkZSBDb3RpemFjaVx1MDBGM24nIH0sXG4gICAgICAgICAgICBleHBpcmF0aW9uRGF5czogeyBsYWJlbDogJ1ZcdTAwRTFsaWRhIHBvciAoZFx1MDBFRGFzKScgfSxcbiAgICAgICAgICAgIGRpc2NvdW50OiB7IGxhYmVsOiBgRGVzY3VlbnRvICUgKFx1MjI2NCAke1FVT1RFX0RJU0NPVU5UX0NFSUxJTkd9KWAsIHBsYWNlaG9sZGVyOiBgMC0ke1FVT1RFX0RJU0NPVU5UX0NFSUxJTkd9YCB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL19zaGFyZWQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy9fc2hhcmVkLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIEVzcGFcdTAwRjFvbCAoZXMtRVMpIFx1MjAxNCB2YWx1ZXMgc2hhcmVkIGJ5IG1vcmUgdGhhbiBvbmUgcGFydCBvZiB0aGlzIGJ1bmRsZS5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy50c2AuXG4gKlxuICogRXZlcnkgY29uc3RhbnQgaGVyZSBpcyBzcHJlYWQgaW50byBvYmplY3Qgcm93cyB0aGF0IGxpdmUgaW4gTU9SRSBUSEFOIE9ORVxuICogZmFtaWx5IGZpbGUsIHNvIGl0IGNhbm5vdCBzaXQgaW4gYW55IG9uZSBvZiB0aGVtLiBBIHZhbHVlIHVzZWQgYnkgZXhhY3RseVxuICogb25lIGZhbWlseSBsaXZlcyBpbiB0aGF0IGZhbWlseSdzIGZpbGUgaW5zdGVhZCBcdTIwMTQgdGhhdCBzcGxpdCBpcyBtZWNoYW5pY2FsLFxuICogbm90IGEganVkZ2VtZW50IGNhbGwuXG4gKi9cblxuLyoqXG4gKiBGYW1pbGlhIGRlIGFjY2lvbmVzIGRlIGFjdGl2aWRhZCAoIzU5Mik6IGBsb2dfY2FsbGAsIGBsb2dfbWVldGluZ2AgeVxuICogYHNjaGVkdWxlX21lZXRpbmdgIHNlIHJlZ2lzdHJhbiB1bmEgdmV6IFBPUiBPQkpFVE8gKHByb3NwZWN0bywgY29udGFjdG8sXG4gKiBjdWVudGEsIG9wb3J0dW5pZGFkLCBjYXNvKSwgcG9ycXVlIHVuYSBhY2NpXHUwMEYzbiBkZSBzY3JpcHQgc2luIGBvYmplY3ROYW1lYFxuICogcXVlZGEgYmFqbyB1bmEgY2xhdmUgcXVlIGVsIGRlc3BhY2hhZG9yIG51bmNhIGNvbnN1bHRhICgjNTA5KS4gTG9zIHRleHRvcyBzb25cbiAqIGlkXHUwMEU5bnRpY29zIGVuIGxvcyBjaW5jbywgYXNcdTAwRUQgcXVlIHNlIGRlY2xhcmFuIHVuYSB2ZXogYXF1XHUwMEVELlxuICovXG5leHBvcnQgY29uc3QgYWN0aXZpdHlBY3Rpb25zID0ge1xuICBsb2dfY2FsbDoge1xuICAgIGxhYmVsOiAnUmVnaXN0cmFyIGxsYW1hZGEnLFxuICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUwMEExTGxhbWFkYSByZWdpc3RyYWRhIGV4aXRvc2FtZW50ZSEnLFxuICAgIHBhcmFtczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ0FzdW50byBkZSBsYSBsbGFtYWRhJyB9LFxuICAgICAgZHVyYXRpb246IHsgbGFiZWw6ICdEdXJhY2lcdTAwRjNuIChtaW51dG9zKScgfSxcbiAgICAgIGF0dGVuZGVlX2NvbnRhY3RzOiB7IGxhYmVsOiAnQ29udGFjdG9zIHBhcnRpY2lwYW50ZXMnIH0sXG4gICAgICBhdHRlbmRlZV91c2VyczogeyBsYWJlbDogJ1BhcnRpY2lwYW50ZXMgaW50ZXJub3MnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ05vdGFzIGRlIGxhIGxsYW1hZGEnIH0sXG4gICAgfSxcbiAgfSxcbiAgbG9nX21lZXRpbmc6IHtcbiAgICBsYWJlbDogJ1JlZ2lzdHJhciByZXVuaVx1MDBGM24nLFxuICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUwMEExUmV1bmlcdTAwRjNuIHJlZ2lzdHJhZGEgZXhpdG9zYW1lbnRlIScsXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnQXN1bnRvIGRlIGxhIHJldW5pXHUwMEYzbicgfSxcbiAgICAgIGR1cmF0aW9uOiB7IGxhYmVsOiAnRHVyYWNpXHUwMEYzbiAobWludXRvcyknIH0sXG4gICAgICBhdHRlbmRlZV9jb250YWN0czogeyBsYWJlbDogJ0NvbnRhY3RvcyBwYXJ0aWNpcGFudGVzJyB9LFxuICAgICAgYXR0ZW5kZWVfdXNlcnM6IHsgbGFiZWw6ICdQYXJ0aWNpcGFudGVzIGludGVybm9zJyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdOb3RhcyBkZSBsYSByZXVuaVx1MDBGM24nIH0sXG4gICAgfSxcbiAgfSxcbiAgc2NoZWR1bGVfbWVldGluZzoge1xuICAgIGxhYmVsOiAnUHJvZ3JhbWFyIHJldW5pXHUwMEYzbicsXG4gICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTAwQTFSZXVuaVx1MDBGM24gcHJvZ3JhbWFkYSEnLFxuICAgIHBhcmFtczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ0FzdW50byBkZSBsYSByZXVuaVx1MDBGM24nIH0sXG4gICAgICBzdGFydF9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgaW5pY2lvIChVVEMpJyB9LFxuICAgICAgc3RhcnRfdGltZTogeyBsYWJlbDogJ0hvcmEgZGUgaW5pY2lvIChVVEMpJyB9LFxuICAgICAgbG9jYXRpb246IHsgbGFiZWw6ICdVYmljYWNpXHUwMEYzbicgfSxcbiAgICAgIGR1cmF0aW9uOiB7IGxhYmVsOiAnRHVyYWNpXHUwMEYzbiAobWludXRvcyknIH0sXG4gICAgICBhdHRlbmRlZV9jb250YWN0czogeyBsYWJlbDogJ0NvbnRhY3RvcyBwYXJ0aWNpcGFudGVzJyB9LFxuICAgICAgYXR0ZW5kZWVfdXNlcnM6IHsgbGFiZWw6ICdQYXJ0aWNpcGFudGVzIGludGVybm9zJyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdBZ2VuZGEnIH0sXG4gICAgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvb2JqZWN0cy5jdXN0b21lci50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL29iamVjdHMuY3VzdG9tZXIudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgT2JqZWN0VHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuaW1wb3J0IHsgYWN0aXZpdHlBY3Rpb25zIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLyoqXG4gKiBFc3BhXHUwMEYxb2wgKGVzLUVTKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIENVU1RPTUVSIGZhbWlseTpcbiAqIHRoZSBjdXN0b21lciByZWNvcmQgaXRzZWxmIFx1MjAxNCBhY2NvdW50cyBhbmQgdGhlIHBlb3BsZSBhdCB0aGVtLlxuICpcbiAqIFJvc3RlcjogYGNybV9hY2NvdW50YCwgYGNybV9jb250YWN0YC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBjdXN0b21lcjogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX2FjY291bnQ6IHtcbiAgICBsYWJlbDogJ0N1ZW50YScsXG4gICAgcGx1cmFsTGFiZWw6ICdDdWVudGFzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0VtcHJlc2FzIHkgb3JnYW5pemFjaW9uZXMgY29uIGxhcyBxdWUgbWFudGVuZW1vcyByZWxhY2lcdTAwRjNuIGNvbWVyY2lhbCcsXG4gICAgZmllbGRzOiB7XG4gICAgICBhY2NvdW50X251bWJlcjogeyBsYWJlbDogJ05cdTAwRkFtZXJvIGRlIEN1ZW50YScgfSxcbiAgICAgIHJlZ2lzdHJhdGlvbl9udW1iZXI6IHtcbiAgICAgICAgbGFiZWw6ICdOXHUwMEZBbWVybyBkZSBSZWdpc3RybycsXG4gICAgICAgIGhlbHA6ICdMYSBpZGVudGlkYWQgcmVnaXN0cmFkYSBkZSBsYSBjb250cmFwYXJ0ZSwgZW1pdGlkYSBwb3Igc3UgcHJvcGlvIHJlZ2lzdHJvIGd1YmVybmFtZW50YWwuIE5vIGVzIGVsIE5cdTAwRkFtZXJvIGRlIEN1ZW50YSwgcXVlIGVtaXRpbW9zIG5vc290cm9zLicsXG4gICAgICB9LFxuICAgICAgY29tbWVyY2lhbF9jYXBhYmlsaXR5OiB7XG4gICAgICAgIGxhYmVsOiAnQ2FwYWNpZGFkIENvbWVyY2lhbCcsXG4gICAgICAgIGhlbHA6ICdTaSBzZSBwdWVkZSBhYnJpciBudWV2byBuZWdvY2lvIGNvbiBlc3RhIGN1ZW50YS4gTGFzIGN1ZW50YXMgZGUgU29sbyBMaXF1aWRhY2lcdTAwRjNuIHNpZ3VlbiBzaWVuZG8gdXRpbGl6YWJsZXMgcGFyYSBmYWN0dXJhY2lcdTAwRjNuIHkgcGFnb3MsIHBlcm8gbm8gc2UgbGVzIHB1ZWRlIHZpbmN1bGFyIG5pbmd1bmEgb3BvcnR1bmlkYWQgbnVldmEuJyxcbiAgICAgICAgb3B0aW9uczogeyBmdWxsOiAnQ29tcGxldGEnLCBzZXR0bGVtZW50X29ubHk6ICdTb2xvIExpcXVpZGFjaVx1MDBGM24nIH0sXG4gICAgICB9LFxuICAgICAgaW5jdW1iZW50X3ZlbmRvcjogeyBsYWJlbDogJ1Byb3ZlZWRvciBBY3R1YWwnLCBoZWxwOiAnRWwgcHJvdmVlZG9yIHF1ZSBhY3R1YWxtZW50ZSBhdGllbmRlIGVsIGdhc3RvIHF1ZSBwZXJzZWd1aW1vcyBlbiBlc3RhIGN1ZW50YS4nIH0sXG4gICAgICBhbm51YWxfcHVyY2hhc2luZ19idWRnZXQ6IHsgbGFiZWw6ICdQcmVzdXB1ZXN0byBBbnVhbCBkZSBDb21wcmFzJywgaGVscDogJ0xvIHF1ZSBlc3RhIGN1ZW50YSBlc3BlcmEgZ2FzdGFyIGNvbiBwcm92ZWVkb3JlcyBlc3RlIGFcdTAwRjFvLCBubyBzdXMgcHJvcGlvcyBpbmdyZXNvcy4nIH0sXG4gICAgICBwYXltZW50X2N5Y2xlOiB7XG4gICAgICAgIGxhYmVsOiAnQ2ljbG8gZGUgUGFnbycsXG4gICAgICAgIG9wdGlvbnM6IHsgcHJlcGFpZDogJ1ByZXBhZ28nLCBuZXRfMzA6ICczMCBkXHUwMEVEYXMnLCBuZXRfNjA6ICc2MCBkXHUwMEVEYXMnLCBuZXRfOTA6ICc5MCBkXHUwMEVEYXMnIH0sXG4gICAgICB9LFxuICAgICAgYXBwcm92YWxfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnRXN0YWRvIGRlIEFwcm9iYWNpXHUwMEYzbicsXG4gICAgICAgIGhlbHA6ICdFbiBxdVx1MDBFOSBwdW50byBkZSBzdSBhcHJvYmFjaVx1MDBGM24gZXN0XHUwMEUxIGVzdGEgY3VlbnRhLiBVbmEgY3VlbnRhIG51ZXZhIGNvbWllbnphIFBlbmRpZW50ZSB5IHNlIGRlY2lkZSBlbiBsYSBiYW5kZWphIGRlIGFwcm9iYWNpb25lcy4nLFxuICAgICAgICBvcHRpb25zOiB7IHBlbmRpbmc6ICdQZW5kaWVudGUnLCBhcHByb3ZlZDogJ0Fwcm9iYWRhJywgcmVqZWN0ZWQ6ICdSZWNoYXphZGEnIH0sXG4gICAgICB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ05vbWJyZSBkZSBDdWVudGEnLCBoZWxwOiAnTm9tYnJlIGxlZ2FsIGRlIGxhIGVtcHJlc2EgdSBvcmdhbml6YWNpXHUwMEYzbicgfSxcbiAgICAgIG5hbWVfbm9ybWFsaXplZDoge1xuICAgICAgICBsYWJlbDogJ05vbWJyZSBkZSBDdWVudGEgKE5vcm1hbGl6YWRvKScsXG4gICAgICAgIGhlbHA6ICdDbGF2ZSBkZSBjb2luY2lkZW5jaWEgcGFyYSBsYSBjb252ZXJzaVx1MDBGM24gZGUgcHJvc3BlY3RvczogZWwgTm9tYnJlIGRlIEN1ZW50YSBlbiBtaW5cdTAwRkFzY3VsYXMsIHNpbiBlc3BhY2lvcyBzb2JyYW50ZXMgeSBjb24gbG9zIGVzcGFjaW9zIGludGVybm9zIHJlZHVjaWRvcyBhIHVuby4gTG8gbWFudGllbmUgZWwgaG9vayBhY2NvdW50X3Byb3RlY3Rpb24gXHUyMDE0IG51bmNhIGxvIGVkaXRlIGRpcmVjdGFtZW50ZS4nLFxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdUXHUwMEVEdHVsbyBNb3N0cmFkbycgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvJyxcbiAgICAgICAgLy8gYGZvcm1lcmAgaXMgJ0Zvcm1lciBDdXN0b21lcicgaW4gYWNjb3VudC5vYmplY3QudHM7IHRoZSBgZW5gIGJ1bmRsZVxuICAgICAgICAvLyBoYWQgdHJ1bmNhdGVkIGl0IHRvICdGb3JtZXInLCBhbmQgdHJhbnNsYXRpbmcgdGhhdCB0cnVuY2F0aW9uIGdhdmVcbiAgICAgICAgLy8gYSBiYXJlICdBbnRlcmlvcicgXHUyMDE0IGFuIGFkamVjdGl2ZSB3aXRoIG5vIG5vdW4sIG5leHQgdG8gdGhyZWUgb3B0aW9uXG4gICAgICAgIC8vIGxhYmVscyB0aGF0IGFyZSBhbGwgbm91bnMuXG4gICAgICAgIG9wdGlvbnM6IHsgcHJvc3BlY3Q6ICdQcm9zcGVjdG8nLCBjdXN0b21lcjogJ0NsaWVudGUnLCBwYXJ0bmVyOiAnU29jaW8nLCBmb3JtZXI6ICdDbGllbnRlIEFudGVyaW9yJyB9LFxuICAgICAgfSxcbiAgICAgIGluZHVzdHJ5OiB7XG4gICAgICAgIGxhYmVsOiAnSW5kdXN0cmlhJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHRlY2hub2xvZ3k6ICdUZWNub2xvZ1x1MDBFRGEnLCBzb2Z0d2FyZTogJ1NvZnR3YXJlIC8gU2FhUycsIGZpbmFuY2U6ICdGaW5hbnphcycsXG4gICAgICAgICAgaGVhbHRoY2FyZTogJ1NhbHVkJywgcmV0YWlsOiAnQ29tZXJjaW8nLCBtYW51ZmFjdHVyaW5nOiAnTWFudWZhY3R1cmEnLFxuICAgICAgICAgIGVkdWNhdGlvbjogJ0VkdWNhY2lcdTAwRjNuJywgcmVhbF9lc3RhdGU6ICdJbm1vYmlsaWFyaWEnLCBtZWRpYTogJ01lZGlvcyB5IEVudHJldGVuaW1pZW50bycsXG4gICAgICAgICAgbG9naXN0aWNzOiAnTG9nXHUwMEVEc3RpY2EnLCBob3NwaXRhbGl0eTogJ0hvc3RlbGVyXHUwMEVEYScsIGVuZXJneTogJ0VuZXJnXHUwMEVEYSB5IFNlcnZpY2lvcyBQXHUwMEZBYmxpY29zJyxcbiAgICAgICAgICBnb3Zlcm5tZW50OiAnR29iaWVybm8nLCBub25wcm9maXQ6ICdTaW4gXHUwMEMxbmltbyBkZSBMdWNybycsIG90aGVyOiAnT3RybycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYW5udWFsX3JldmVudWU6IHsgbGFiZWw6ICdJbmdyZXNvcyBBbnVhbGVzJyB9LFxuICAgICAgY2hpbGRfYWNjb3VudF9yZXZlbnVlOiB7IGxhYmVsOiAnSW5ncmVzb3MgZGUgQ3VlbnRhcyBIaWphcycsIGhlbHA6ICdTdW1hIGRlIGxvcyBpbmdyZXNvcyBhbnVhbGVzIGRlIGxhcyBjdWVudGFzIGhpamFzIGRpcmVjdGFzLicgfSxcbiAgICAgIG51bWJlcl9vZl9lbXBsb3llZXM6IHsgbGFiZWw6ICdOXHUwMEZBbWVybyBkZSBFbXBsZWFkb3MnIH0sXG4gICAgICBwaG9uZTogeyBsYWJlbDogJ1RlbFx1MDBFOWZvbm8nIH0sXG4gICAgICB3ZWJzaXRlOiB7IGxhYmVsOiAnU2l0aW8gV2ViJyB9LFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnRGlyZWNjaVx1MDBGM24gZGUgRmFjdHVyYWNpXHUwMEYzbicgfSxcbiAgICAgIGJpbGxpbmdfY291bnRyeToge1xuICAgICAgICBsYWJlbDogJ1BhXHUwMEVEcyBkZSBGYWN0dXJhY2lcdTAwRjNuJyxcbiAgICAgICAgaGVscDogJ0Rlcml2YWRvIGRlIGxhIERpcmVjY2lcdTAwRjNuIGRlIEZhY3R1cmFjaVx1MDBGM24gXHUyMDE0IGVsIHBhXHUwMEVEcyB0YWwgY29tbyBzZSBpbnRyb2R1am8sIHNpbiBlc3BhY2lvcyB5IGVuIG1heVx1MDBGQXNjdWxhcy4nLFxuICAgICAgfSxcbiAgICAgIHRlcnJpdG9yeToge1xuICAgICAgICBsYWJlbDogJ1RlcnJpdG9yaW8nLFxuICAgICAgICBoZWxwOiAnRGVyaXZhZG8gZGUgbGEgRGlyZWNjaVx1MDBGM24gZGUgRmFjdHVyYWNpXHUwMEYzbiBcdTIwMTQgZWwgdGVycml0b3JpbyBkZSB2ZW50YXMgcXVlIHVzYW4gbGFzIHJlZ2xhcyBkZSBjb21wYXJ0aWNpXHUwMEYzbi4gTGFzIGN1ZW50YXMgZnVlcmEgZGUgbG9zIHRlcnJpdG9yaW9zIGNvbiBlcXVpcG8gYXNpZ25hZG8gc29uIE90cm8uJyxcbiAgICAgICAgb3B0aW9uczogeyBuYTogJ05vcnRlYW1cdTAwRTlyaWNhJywgZW1lYTogJ0VNRUEnLCBvdGhlcjogJ090cm8nIH0sXG4gICAgICB9LFxuICAgICAgb2ZmaWNlX2xvY2F0aW9uOiB7IGxhYmVsOiAnVWJpY2FjaVx1MDBGM24gZGUgT2ZpY2luYScgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnUHJvcGlldGFyaW8gZGUgQ3VlbnRhJyB9LFxuICAgICAgcGFyZW50X2FjY291bnQ6IHsgbGFiZWw6ICdDdWVudGEgTWF0cml6JywgaGVscDogJ0VtcHJlc2EgbWF0cml6IGVuIGxhIGplcmFycXVcdTAwRURhJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwY2lcdTAwRjNuJyB9LFxuICAgICAgaXNfYWN0aXZlOiB7IGxhYmVsOiAnQWN0aXZvJyB9LFxuICAgICAgbGFzdF9hY3Rpdml0eV9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgXHUwMERBbHRpbWEgQWN0aXZpZGFkJyB9LFxuICAgICAgYnJhbmRfY29sb3I6IHsgbGFiZWw6ICdDb2xvciBkZSBNYXJjYScgfSxcbiAgICAgIGxvZ286IHsgbGFiZWw6ICdMb2dvIGRlIGxhIEVtcHJlc2EnIH0sXG4gICAgICB0aWVyOiB7XG4gICAgICAgIGxhYmVsOiAnTml2ZWwgZGUgQ2xpZW50ZScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBzdHJhdGVnaWM6ICdFc3RyYXRcdTAwRTlnaWNvJywgZW50ZXJwcmlzZTogJ0dyYW4gRW1wcmVzYScsXG4gICAgICAgICAgbWlkX21hcmtldDogJ01lZGlhbmEgRW1wcmVzYScsIHNtYjogJ1BZTUUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNlZ21lbnQ6IHtcbiAgICAgICAgbGFiZWw6ICdTZWdtZW50bycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBuZXRfbmV3OiAnQ2xpZW50ZSBOdWV2bycsIGdyb3d0aDogJ0NyZWNpbWllbnRvJyxcbiAgICAgICAgICBhdF9yaXNrOiAnRW4gUmllc2dvJywgc3RhYmxlOiAnRXN0YWJsZScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgaGVhbHRoX3Njb3JlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUwMENEbmRpY2UgZGUgU2FsdWQnLFxuICAgICAgICBoZWxwOiAnSW5kaWNhZG9yIGRlIHNhbHVkIG1hbnRlbmlkbyBwb3IgZWwgQ1NNJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGhlYWx0aHk6ICdTYWx1ZGFibGUnLCB3YXRjaGluZzogJ0VuIE9ic2VydmFjaVx1MDBGM24nLFxuICAgICAgICAgIGF0X3Jpc2s6ICdFbiBSaWVzZ28nLCBjaHVybmluZzogJ0VuIEZ1Z2EnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2FjY291bnRzOiB7XG4gICAgICAgIGxhYmVsOiAnVG9kYXMgbGFzIEN1ZW50YXMnLCBkZXNjcmlwdGlvbjogJ0xpc3RhIG1hZXN0cmEgZGUgY3VlbnRhcyBjb24gaW5ncmVzb3MgZSBpbmR1c3RyaWEnLFxuICAgICAgICBidWxrQWN0aW9uczoge1xuICAgICAgICAgIGRlbGV0ZToge1xuICAgICAgICAgICAgbGFiZWw6ICdFbGltaW5hcicsXG4gICAgICAgICAgICBjb25maXJtTGFiZWw6ICdFbGltaW5hcicsXG4gICAgICAgICAgICBjb25maXJtVGV4dDogJ1x1MDBCRkVsaW1pbmFyIHBlcm1hbmVudGVtZW50ZSB7e2NvdW50fX0gY3VlbnRhKHMpPyBFc3RhIGFjY2lcdTAwRjNuIG5vIHNlIHB1ZWRlIGRlc2hhY2VyLicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cmFuc2Zlcl9vd25lcjoge1xuICAgICAgICAgICAgbGFiZWw6ICdUcmFuc2ZlcmlyIHByb3BpZXRhcmlvJyxcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiAnXHUwMEJGVHJhbnNmZXJpciBsYSBwcm9waWVkYWQgZGUge3tjb3VudH19IGN1ZW50YShzKT8nLFxuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgIG93bmVyX2lkOiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdOdWV2byBwcm9waWV0YXJpbycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBkYXRlX3RpZXI6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnQWN0dWFsaXphciBuaXZlbCcsXG4gICAgICAgICAgICBjb25maXJtVGV4dDogJ1x1MDBCRkFjdHVhbGl6YXIgZWwgbml2ZWwgZGUge3tjb3VudH19IGN1ZW50YShzKSBhIHt7dGllcn19PycsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgdGllcjoge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnTml2ZWwgZGUgY2xpZW50ZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYWNjb3VudF9nYWxsZXJ5OiB7IGxhYmVsOiAnR2FsZXJcdTAwRURhIGRlIEN1ZW50YXMnLCBkZXNjcmlwdGlvbjogJ1Zpc3RhIGRlIHRhcmpldGFzIGNvbiBjb2xvcmVzIGRlIG1hcmNhJyB9LFxuICAgICAgYWNjb3VudF9tYXA6IHsgbGFiZWw6ICdNYXBhIGRlIEN1ZW50YXMnLCBkZXNjcmlwdGlvbjogJ0Rpc3RyaWJ1Y2lcdTAwRjNuIGdlb2dyXHUwMEUxZmljYSBkZSBjdWVudGFzJyB9LFxuICAgICAgZW50ZXJwcmlzZV9hY2NvdW50czogeyBsYWJlbDogJ0N1ZW50YXMgRW1wcmVzYXJpYWxlcycsIGRlc2NyaXB0aW9uOiAnQ3VlbnRhcyBjb24gbWF5b3JlcyBpbmdyZXNvcyBhbnVhbGVzJyB9LFxuICAgICAgbXlfYWNjb3VudHM6IHsgbGFiZWw6ICdNaXMgQ3VlbnRhcycsIGRlc2NyaXB0aW9uOiAnQ3VlbnRhcyBhc2lnbmFkYXMgYWwgdXN1YXJpbyBhY3R1YWwnIH0sXG4gICAgICBhdF9yaXNrX2FjY291bnRzOiB7IGxhYmVsOiAnXHUyNkEwXHVGRTBGIEN1ZW50YXMgZW4gUmllc2dvJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gQlx1MDBFMXNpY2EnIH0sXG4gICAgICBmaW5hbmNpYWxzOiB7IGxhYmVsOiAnRGF0b3MgRmluYW5jaWVyb3MnIH0sXG4gICAgICBidXNpbmVzc19wcm9maWxlOiB7IGxhYmVsOiAnUGVyZmlsIGRlIE5lZ29jaW8nIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlIENvbnRhY3RvJyB9LFxuICAgICAgb3duZXJzaGlwOiB7IGxhYmVsOiAnUHJvcGllZGFkIHkgRXN0YWRvJyB9LFxuICAgICAgYnJhbmRpbmc6IHsgbGFiZWw6ICdJZGVudGlkYWQgZGUgTWFyY2EnIH0sXG4gICAgICBzeXN0ZW06IHsgbGFiZWw6ICdTaXN0ZW1hJyB9LFxuICAgICAgLy8gTm9tYnJlcyBkZSBzZWNjaVx1MDBGM24gZGVsIGZvcm11bGFyaW8gZW4gYWNjb3VudC52aWV3LnRzICgjMTEwMClcbiAgICAgIHByb2ZpbGU6IHsgbGFiZWw6ICdQZXJmaWwnIH0sXG4gICAgICBjdXN0b21lcl9zdWNjZXNzOiB7IGxhYmVsOiAnXHUwMEM5eGl0byBkZWwgQ2xpZW50ZScgfSxcbiAgICAgIGxvY2F0aW9uczogeyBsYWJlbDogJ1ViaWNhY2lvbmVzJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwY2lcdTAwRjNuJyB9LFxuICAgIH0sXG4gICAgX2FjdGlvbnM6IHsgLi4uYWN0aXZpdHlBY3Rpb25zIH0sXG4gIH0sXG4gIGNybV9jb250YWN0OiB7XG4gICAgbGFiZWw6ICdDb250YWN0bycsXG4gICAgcGx1cmFsTGFiZWw6ICdDb250YWN0b3MnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGVyc29uYXMgYXNvY2lhZGFzIGEgbGFzIGN1ZW50YXMnLFxuICAgIGZpZWxkczoge1xuICAgICAgLy8gTWlzbW8ganVlZ28gZGUgdmFsb3JlcyBxdWUgYGNybV9sZWFkLnNhbHV0YXRpb25gIFx1MjAxNCB0cmFkXHUwMEZBemNhbnNlIGlndWFsLlxuICAgICAgc2FsdXRhdGlvbjoge1xuICAgICAgICBsYWJlbDogJ1RcdTAwRUR0dWxvJyxcbiAgICAgICAgb3B0aW9uczogeyBtcjogJ1NyLicsIG1zOiAnU3J0YS4nLCBtcnM6ICdTcmEuJywgZHI6ICdEci4nLCBwcm9mOiAnUHJvZi4nIH0sXG4gICAgICB9LFxuICAgICAgZmlyc3RfbmFtZTogeyBsYWJlbDogJ05vbWJyZScgfSxcbiAgICAgIGxhc3RfbmFtZTogeyBsYWJlbDogJ0FwZWxsaWRvJyB9LFxuICAgICAgZnVsbF9uYW1lOiB7IGxhYmVsOiAnTm9tYnJlIENvbXBsZXRvJyB9LFxuICAgICAgY3JtX2FjY291bnQ6IHsgbGFiZWw6ICdDdWVudGEnIH0sXG4gICAgICBlbWFpbDogeyBsYWJlbDogJ0NvcnJlbyBFbGVjdHJcdTAwRjNuaWNvJyB9LFxuICAgICAgcGhvbmU6IHsgbGFiZWw6ICdUZWxcdTAwRTlmb25vJyB9LFxuICAgICAgbW9iaWxlOiB7IGxhYmVsOiAnTVx1MDBGM3ZpbCcgfSxcbiAgICAgIHRpdGxlOiB7IGxhYmVsOiAnQ2FyZ28nIH0sXG4gICAgICBkZXBhcnRtZW50OiB7XG4gICAgICAgIGxhYmVsOiAnRGVwYXJ0YW1lbnRvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGV4ZWN1dGl2ZTogJ0VqZWN1dGl2bycsIHNhbGVzOiAnVmVudGFzJywgbWFya2V0aW5nOiAnTWFya2V0aW5nJyxcbiAgICAgICAgICBlbmdpbmVlcmluZzogJ0luZ2VuaWVyXHUwMEVEYScsIHN1cHBvcnQ6ICdTb3BvcnRlJywgZmluYW5jZTogJ0ZpbmFuemFzJyxcbiAgICAgICAgICBocjogJ1JlY3Vyc29zIEh1bWFub3MnLCBvcGVyYXRpb25zOiAnT3BlcmFjaW9uZXMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIC8vIENlbnRybyBkZSBjb21wcmEgKFJFUS0wMDA0KSBcdTIwMTQgZWwgbWFwYSBkZSBsYSBkZWNpc2lcdTAwRjNuLiBMYSBldGlxdWV0YVxuICAgICAgLy8gaW5nbGVzYSBlcyAnQnV5aW5nIEZ1bmN0aW9uJyB5IG5vICdCdXlpbmcgUm9sZSc6IGxhIHJlZ2xhXG4gICAgICAvLyBzZWN1cml0eS1yb2xlLXdvcmQgcmVzZXJ2YSBsYSBwYWxhYnJhIGluZ2xlc2EgYHJvbGVgIGVuIGxhc1xuICAgICAgLy8gZGVjbGFyYWNpb25lcyAoQURSLTAwOTAgRDMpLiBFc2EgcmVnbGEgc1x1MDBGM2xvIGxlZSBpbmdsXHUwMEU5cyB5IG5vIGFsY2FuemFcbiAgICAgIC8vIGxvcyBwYXF1ZXRlcyBkZSBpZGlvbWEsIGFzXHUwMEVEIHF1ZSBhcXVcdTAwRUQgdmEgZWwgdFx1MDBFOXJtaW5vIG5hdHVyYWwuXG4gICAgICBidXlpbmdfZnVuY3Rpb246IHtcbiAgICAgICAgbGFiZWw6ICdSb2wgZGUgQ29tcHJhJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGRlY2lzaW9uX21ha2VyOiAnRGVjaXNvcicsIGVjb25vbWljX2J1eWVyOiAnQ29tcHJhZG9yIEVjb25cdTAwRjNtaWNvJyxcbiAgICAgICAgICB0ZWNobmljYWxfZXZhbHVhdG9yOiAnRXZhbHVhZG9yIFRcdTAwRTljbmljbycsIHVzZXI6ICdVc3VhcmlvJyxcbiAgICAgICAgICBpbmZsdWVuY2VyOiAnSW5mbHVlbmNpYWRvcicsIGdhdGVrZWVwZXI6ICdHdWFyZGlcdTAwRTFuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhdHRpdHVkZToge1xuICAgICAgICBsYWJlbDogJ0FjdGl0dWQgaGFjaWEgTm9zb3Ryb3MnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY2hhbXBpb246ICdEZWZlbnNvcicsIHN1cHBvcnRpdmU6ICdGYXZvcmFibGUnLCBuZXV0cmFsOiAnTmV1dHJhbCcsXG4gICAgICAgICAgc2tlcHRpY2FsOiAnRXNjXHUwMEU5cHRpY28nLCBibG9ja2VyOiAnQmxvcXVlYWRvcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmVsYXRpb25zaGlwX3N0cmVuZ3RoOiB7XG4gICAgICAgIGxhYmVsOiAnRnVlcnphIGRlIGxhIFJlbGFjaVx1MDBGM24nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZGlzdGFudDogJ0Rpc3RhbnRlJywgYWNxdWFpbnRhbmNlOiAnQ29ub2NpZG8nLCB3b3JraW5nOiAnUmVsYWNpXHUwMEYzbiBkZSBUcmFiYWpvJyxcbiAgICAgICAgICBzdHJvbmc6ICdGdWVydGUnLCB0cnVzdGVkX2Fkdmlzb3I6ICdBc2Vzb3IgZGUgQ29uZmlhbnphJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1Byb3BpZXRhcmlvIGRlIENvbnRhY3RvJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwY2lcdTAwRjNuJyB9LFxuICAgICAgaXNfcHJpbWFyeTogeyBsYWJlbDogJ0NvbnRhY3RvIFByaW5jaXBhbCcsIGhlbHA6ICdcdTAwQkZFcyBlc3RlIGVsIGNvbnRhY3RvIHByaW5jaXBhbCBkZSBsYSBjdWVudGE/JyB9LFxuICAgICAgYXZhdGFyOiB7IGxhYmVsOiAnRm90byBkZSBQZXJmaWwnIH0sXG4gICAgICBtYWlsaW5nX2FkZHJlc3M6IHsgbGFiZWw6ICdEaXJlY2NpXHUwMEYzbiBkZSBDb3JyZW8nIH0sXG4gICAgICAvLyBKdWVnbyBjb21wYXJ0aWRvIGNvbiBgY3JtX2xlYWQubGVhZF9zb3VyY2VgIHlcbiAgICAgIC8vIGBjcm1fb3Bwb3J0dW5pdHkubGVhZF9zb3VyY2VgIFx1MjAxNCBsb3MgdHJlcyBkZWJlbiBjb2luY2lkaXIgbGl0ZXJhbG1lbnRlLlxuICAgICAgbGVhZF9zb3VyY2U6IHtcbiAgICAgICAgbGFiZWw6ICdPcmlnZW4gZGVsIFByb3NwZWN0bycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB3ZWI6ICdXZWInLCByZWZlcnJhbDogJ1JlZmVyZW5jaWEnLCBldmVudDogJ0V2ZW50byAvIEZlcmlhJyxcbiAgICAgICAgICB3ZWJpbmFyOiAnU2VtaW5hcmlvIFdlYicsIHBhcnRuZXI6ICdTb2NpbycsIGFkdmVydGlzZW1lbnQ6ICdQdWJsaWNpZGFkJyxcbiAgICAgICAgICBwYWlkX3NlYXJjaDogJ0JcdTAwRkFzcXVlZGEgZGUgUGFnbycsIHNvY2lhbDogJ1JlZGVzIFNvY2lhbGVzJywgY29udGVudDogJ0NvbnRlbmlkbyAvIEJsb2cnLFxuICAgICAgICAgIGNvbGRfY2FsbDogJ0xsYW1hZGEgZW4gRnJcdTAwRURvJywgZW1haWxfY2FtcGFpZ246ICdDYW1wYVx1MDBGMWEgZGUgRW1haWwnLCBvdGhlcjogJ090cm8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGRvX25vdF9jYWxsOiB7IGxhYmVsOiAnTm8gTGxhbWFyJyB9LFxuICAgICAgZW1haWxfb3B0X291dDogeyBsYWJlbDogJ0V4Y2x1aXIgZGUgQ29ycmVvcycgfSxcbiAgICAgIGxhc3RfY29udGFjdGVkX2RhdGU6IHsgbGFiZWw6ICdcdTAwREFsdGltbyBjb250YWN0bycgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2NvbnRhY3RzOiB7IGxhYmVsOiAnVG9kb3MgbG9zIENvbnRhY3RvcycgfSxcbiAgICAgIGNvbnRhY3RfZGlyZWN0b3J5OiB7IGxhYmVsOiAnRGlyZWN0b3JpbyBkZSBDb250YWN0b3MnIH0sXG4gICAgICBwcmltYXJ5X2NvbnRhY3RzOiB7IGxhYmVsOiAnQ29udGFjdG9zIFByaW5jaXBhbGVzJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBpZGVudGl0eTogeyBsYWJlbDogJ0lkZW50aWRhZCcgfSxcbiAgICAgIGFjY291bnRfaW5mbzogeyBsYWJlbDogJ0N1ZW50YSB5IENhcmdvJyB9LFxuICAgICAgYnV5aW5nX2NlbnRyZTogeyBsYWJlbDogJ0NlbnRybyBkZSBDb21wcmEnIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlIENvbnRhY3RvJyB9LFxuICAgICAgbWFpbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnRGlyZWNjaVx1MDBGM24gZGUgQ29ycmVvJyB9LFxuICAgICAgYWRkaXRpb25hbDogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gQWRpY2lvbmFsJyB9LFxuICAgICAgcHJlZmVyZW5jZXM6IHsgbGFiZWw6ICdQcmVmZXJlbmNpYXMgZGUgQ29tdW5pY2FjaVx1MDBGM24nIH0sXG4gICAgICAvLyBOb21icmVzIGRlIHNlY2NpXHUwMEYzbiBkZWwgZm9ybXVsYXJpbyBlbiBjb250YWN0LnZpZXcudHMgKCMxMTAwKVxuICAgICAgY29udGFjdF9kZXRhaWxzOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBkZSBDb250YWN0bycgfSxcbiAgICAgIGNvbW1fcHJlZmVyZW5jZXM6IHsgbGFiZWw6ICdQcmVmZXJlbmNpYXMnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgbWFya19wcmltYXJ5OiB7XG4gICAgICAgIGxhYmVsOiAnTWFyY2FyIGNvbW8gUHJpbmNpcGFsJyxcbiAgICAgICAgY29uZmlybVRleHQ6ICdcdTAwQkZFc3RhYmxlY2VyIGVzdGUgY29udGFjdG8gY29tbyBjb250YWN0byBwcmluY2lwYWwgZGUgbGEgY3VlbnRhPycsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUwMEExRXN0YWJsZWNpZG8gY29tbyBjb250YWN0byBwcmluY2lwYWwhJyxcbiAgICAgIH0sXG4gICAgICBzZW5kX2VtYWlsOiB7XG4gICAgICAgIGxhYmVsOiAnRW52aWFyIENvcnJlbycsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHN1YmplY3Q6IHsgbGFiZWw6ICdBc3VudG8nIH0sXG4gICAgICAgICAgYm9keTogeyBsYWJlbDogJ0N1ZXJwbycgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhZGRfY29udGFjdF90b19jYW1wYWlnbjoge1xuICAgICAgICBsYWJlbDogJ0FcdTAwRjFhZGlyIGEgQ2FtcGFcdTAwRjFhJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTAwQTFDb250YWN0b3MgYVx1MDBGMWFkaWRvcyBhIGxhIGNhbXBhXHUwMEYxYSEnLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBjcm1fY2FtcGFpZ246IHsgbGFiZWw6ICdDYW1wYVx1MDBGMWEnIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL29iamVjdHMucGlwZWxpbmUudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy9vYmplY3RzLnBpcGVsaW5lLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IGFjdGl2aXR5QWN0aW9ucyB9IGZyb20gJy4vX3NoYXJlZCc7XG5cbi8qKlxuICogRXNwYVx1MDBGMW9sIChlcy1FUykgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBQSVBFTElORSBmYW1pbHk6XG4gKiBkZW1hbmQgYW5kIHRoZSBkZWFscyBpdCBiZWNvbWVzLCBwbHVzIHRoZSByb2xsLXVwIHRoYXQgZm9yZWNhc3RzIHRoZW0uXG4gKlxuICogUm9zdGVyOiBgY3JtX2xlYWRgLCBgY3JtX29wcG9ydHVuaXR5YCwgYGNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW1gLCBgY3JtX2ZvcmVjYXN0YC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBwaXBlbGluZTogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX2xlYWQ6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGRpc3F1YWxpZmljYXRpb25fcmVhc29uX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdFbCBtb3Rpdm8gZGUgZGVzY2FsaWZpY2FjaVx1MDBGM24gZXMgb2JsaWdhdG9yaW8gY3VhbmRvIHVuIHByb3NwZWN0byBubyBlc3RcdTAwRTEgY3VhbGlmaWNhZG8nLFxuICAgICAgfSxcbiAgICAgIGR1cGxpY2F0ZV9kaXNxdWFsaWZpY2F0aW9uX3JlcXVpcmVzX3N1cnZpdm9yOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdEZXNjYWxpZmljYXIgdW4gcHJvc3BlY3RvIGNvbW8gZHVwbGljYWRvIGV4aWdlIG5vbWJyYXIgZWwgcmVnaXN0cm8gc3VwZXJ2aXZpZW50ZSB5IG1hcmNhciBlbCBlc3RhZG8gZGUgZHVwbGljYWRvIGNvbW8gQ29uZmlybWFkbycsXG4gICAgICB9LFxuICAgICAgZW1haWxfcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0VsIGNvcnJlbyBlbGVjdHJcdTAwRjNuaWNvIGVzIG9ibGlnYXRvcmlvJyxcbiAgICAgIH0sXG4gICAgICBsZWFkX3N0YXR1c19wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnVHJhbnNpY2lcdTAwRjNuIGRlIGVzdGFkbyBkZSBwcm9zcGVjdG8gbm8gdlx1MDBFMWxpZGEnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnUHJvc3BlY3RvJyxcbiAgICBwbHVyYWxMYWJlbDogJ1Byb3NwZWN0b3MnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ2xpZW50ZXMgcG90ZW5jaWFsZXMgdG9kYXZcdTAwRURhIHNpbiBjYWxpZmljYXInLFxuICAgIGZpZWxkczoge1xuICAgICAgZmlyc3RfbmFtZTogeyBsYWJlbDogJ05vbWJyZScgfSxcbiAgICAgIGxhc3RfbmFtZTogeyBsYWJlbDogJ0FwZWxsaWRvJyB9LFxuICAgICAgY29tcGFueTogeyBsYWJlbDogJ0VtcHJlc2EnIH0sXG4gICAgICBjb21wYW55X25vcm1hbGl6ZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdFbXByZXNhIChOb3JtYWxpemFkbyknLFxuICAgICAgICBoZWxwOiAnQ2xhdmUgZGUgY29pbmNpZGVuY2lhIHBhcmEgbGEgY29udmVyc2lcdTAwRjNuIGRlIHByb3NwZWN0b3M6IGxhIEVtcHJlc2EgZW4gbWluXHUwMEZBc2N1bGFzLCBzaW4gZXNwYWNpb3Mgc29icmFudGVzIHkgY29uIGxvcyBlc3BhY2lvcyBpbnRlcm5vcyByZWR1Y2lkb3MgYSB1bm8uIExvIG1hbnRpZW5lIGVsIGhvb2sgbGVhZF9kdXBsaWNhdGVfY2hlY2sgXHUyMDE0IG51bmNhIGxvIGVkaXRlIGRpcmVjdGFtZW50ZS4nLFxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdUXHUwMEVEdHVsbyBNb3N0cmFkbycgfSxcbiAgICAgIHRpdGxlOiB7IGxhYmVsOiAnQ2FyZ28nIH0sXG4gICAgICBlbWFpbDogeyBsYWJlbDogJ0NvcnJlbyBFbGVjdHJcdTAwRjNuaWNvJyB9LFxuICAgICAgcGhvbmU6IHsgbGFiZWw6ICdUZWxcdTAwRTlmb25vJyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnRXN0YWRvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ldzogJ051ZXZvJywgY29udGFjdGVkOiAnQ29udGFjdGFkbycsIHF1YWxpZmllZDogJ0NhbGlmaWNhZG8nLFxuICAgICAgICAgIHVucXVhbGlmaWVkOiAnTm8gQ2FsaWZpY2FkbycsIGNvbnZlcnRlZDogJ0NvbnZlcnRpZG8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxlYWRfc291cmNlOiB7XG4gICAgICAgIGxhYmVsOiAnT3JpZ2VuIGRlbCBQcm9zcGVjdG8nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgd2ViOiAnV2ViJywgcmVmZXJyYWw6ICdSZWZlcmVuY2lhJywgZXZlbnQ6ICdFdmVudG8gLyBGZXJpYScsXG4gICAgICAgICAgd2ViaW5hcjogJ1NlbWluYXJpbyBXZWInLCBwYXJ0bmVyOiAnU29jaW8nLCBhZHZlcnRpc2VtZW50OiAnUHVibGljaWRhZCcsXG4gICAgICAgICAgcGFpZF9zZWFyY2g6ICdCXHUwMEZBc3F1ZWRhIGRlIFBhZ28nLCBzb2NpYWw6ICdSZWRlcyBTb2NpYWxlcycsIGNvbnRlbnQ6ICdDb250ZW5pZG8gLyBCbG9nJyxcbiAgICAgICAgICBjb2xkX2NhbGw6ICdMbGFtYWRhIGVuIEZyXHUwMEVEbycsIGVtYWlsX2NhbXBhaWduOiAnQ2FtcGFcdTAwRjFhIGRlIEVtYWlsJywgb3RoZXI6ICdPdHJvJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1Byb3BpZXRhcmlvJyB9LFxuICAgICAgaXNfY29udmVydGVkOiB7IGxhYmVsOiAnQ29udmVydGlkbycgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcGNpXHUwMEYzbicgfSxcbiAgICAgIC8vIE1pc21vIGp1ZWdvIGRlIHZhbG9yZXMgcXVlIGBjcm1fY29udGFjdC5zYWx1dGF0aW9uYCBcdTIwMTQgdHJhZFx1MDBGQXpjYW5zZSBpZ3VhbC5cbiAgICAgIHNhbHV0YXRpb246IHtcbiAgICAgICAgbGFiZWw6ICdUcmF0YW1pZW50bycsXG4gICAgICAgIG9wdGlvbnM6IHsgbXI6ICdTci4nLCBtczogJ1NydGEuJywgbXJzOiAnU3JhLicsIGRyOiAnRHIuJywgcHJvZjogJ1Byb2YuJyB9LFxuICAgICAgfSxcbiAgICAgIGZ1bGxfbmFtZTogeyBsYWJlbDogJ05vbWJyZSBDb21wbGV0bycgfSxcbiAgICAgIC8vIExvcyAxNSB2YWxvcmVzIHNvbiBsb3MgbWlzbW9zIHF1ZSBlbiBgY3JtX2FjY291bnQuaW5kdXN0cnlgIFx1MjAxNCBkZWJlblxuICAgICAgLy8gY29pbmNpZGlyIGxpdGVyYWxtZW50ZSBlbnRyZSBhbWJhcyBwYW50YWxsYXMuXG4gICAgICBpbmR1c3RyeToge1xuICAgICAgICBsYWJlbDogJ0luZHVzdHJpYScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB0ZWNobm9sb2d5OiAnVGVjbm9sb2dcdTAwRURhJywgc29mdHdhcmU6ICdTb2Z0d2FyZSAvIFNhYVMnLCBmaW5hbmNlOiAnRmluYW56YXMnLFxuICAgICAgICAgIGhlYWx0aGNhcmU6ICdTYWx1ZCcsIHJldGFpbDogJ0NvbWVyY2lvJywgbWFudWZhY3R1cmluZzogJ01hbnVmYWN0dXJhJyxcbiAgICAgICAgICBlZHVjYXRpb246ICdFZHVjYWNpXHUwMEYzbicsIHJlYWxfZXN0YXRlOiAnSW5tb2JpbGlhcmlhJywgbWVkaWE6ICdNZWRpb3MgeSBFbnRyZXRlbmltaWVudG8nLFxuICAgICAgICAgIGxvZ2lzdGljczogJ0xvZ1x1MDBFRHN0aWNhJywgaG9zcGl0YWxpdHk6ICdIb3N0ZWxlclx1MDBFRGEnLCBlbmVyZ3k6ICdFbmVyZ1x1MDBFRGEgeSBTZXJ2aWNpb3MgUFx1MDBGQWJsaWNvcycsXG4gICAgICAgICAgZ292ZXJubWVudDogJ0dvYmllcm5vJywgbm9ucHJvZml0OiAnU2luIFx1MDBDMW5pbW8gZGUgTHVjcm8nLCBvdGhlcjogJ090cm8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1vYmlsZTogeyBsYWJlbDogJ01cdTAwRjN2aWwnIH0sXG4gICAgICB3ZWJzaXRlOiB7IGxhYmVsOiAnU2l0aW8gV2ViJyB9LFxuICAgICAgcmF0aW5nOiB7IGxhYmVsOiAnUHVudHVhY2lcdTAwRjNuIGRlIFByb3NwZWN0bycsIGhlbHA6ICdQdW50dWFjaVx1MDBGM24gZGUgY2FsaWRhZCBkZWwgcHJvc3BlY3RvICgxLTUgZXN0cmVsbGFzKScgfSxcbiAgICAgIG5leHRfZm9sbG93dXBfZGF0ZTogeyBsYWJlbDogJ1ByXHUwMEYzeGltYSBGZWNoYSBkZSBTZWd1aW1pZW50bycgfSxcbiAgICAgIGxhc3RfY29udGFjdGVkX2RhdGU6IHsgbGFiZWw6ICdcdTAwREFsdGltbyBDb250YWN0bycgfSxcbiAgICAgIG5lZWRfdHlwZToge1xuICAgICAgICBsYWJlbDogJ1RpcG8gZGUgTmVjZXNpZGFkJyxcbiAgICAgICAgaGVscDogJ1F1XHUwMEU5IGVzdFx1MDBFMSBwaWRpZW5kbyBlc3RlIHByb3NwZWN0by4gTGEgYXNpZ25hY2lcdTAwRjNuLCBsYSBwcmlvcml6YWNpXHUwMEYzbiB5IGxvcyBpbmZvcm1lcyBkZSBkZW1hbmRhIGxlZW4gZXN0ZSBjYW1wby4nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbmV3X2ltcGxlbWVudGF0aW9uOiAnTnVldmEgSW1wbGFudGFjaVx1MDBGM24nLCBleHBhbnNpb246ICdBbXBsaWFjaVx1MDBGM24nLFxuICAgICAgICAgIHJlcGxhY2VtZW50OiAnU3VzdGl0dWNpXHUwMEYzbicsIHJlbmV3YWw6ICdSZW5vdmFjaVx1MDBGM24nLCBjb25zdWx0aW5nOiAnQ29uc3VsdG9yXHUwMEVEYScsXG4gICAgICAgICAgc3VwcG9ydDogJ1NvcG9ydGUgeSBNYW50ZW5pbWllbnRvJywgb3RoZXI6ICdPdHJvJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlc3RpbWF0ZWRfYW1vdW50OiB7XG4gICAgICAgIGxhYmVsOiAnSW1wb3J0ZSBFc3RpbWFkbycsXG4gICAgICAgIGhlbHA6ICdWYWxvciBlc3RpbWFkbyBkZSBlc3RhIG5lY2VzaWRhZCwgYW50ZXMgZGUgbGEgY3VhbGlmaWNhY2lcdTAwRjNuLiBQcmVjYXJnYSBlbCBpbXBvcnRlIGRlIGxhIG9wb3J0dW5pZGFkIGFsIGNvbnZlcnRpci4nLFxuICAgICAgfSxcbiAgICAgIGNvbnZlcnNpb25fYXBwcm92YWxfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnQXByb2JhY2lcdTAwRjNuIGRlIENvbnZlcnNpXHUwMEYzbicsXG4gICAgICAgIGhlbHA6ICdTaSBlc3RlIHByb3NwZWN0byB0aWVuZSBlbCB2aXN0byBidWVubyBwYXJhIGNvbnZlcnRpcnNlLiBcdTAwQUJObyBSZXF1ZXJpZGFcdTAwQkIgc2lnbmlmaWNhIHF1ZSBubyBzZSBwaWRlIGFwcm9iYWNpXHUwMEYzbjogZXMgZWwgdmFsb3IgcHJlZGV0ZXJtaW5hZG8gZGUgZlx1MDBFMWJyaWNhLicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBub3RfcmVxdWlyZWQ6ICdObyBSZXF1ZXJpZGEnLCBwZW5kaW5nOiAnUGVuZGllbnRlJyxcbiAgICAgICAgICBhcHByb3ZlZDogJ0Fwcm9iYWRhJywgcmVqZWN0ZWQ6ICdSZWNoYXphZGEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNvbnZlcnRlZF9hY2NvdW50OiB7IGxhYmVsOiAnQ3VlbnRhIENvbnZlcnRpZGEnIH0sXG4gICAgICBjb252ZXJ0ZWRfY29udGFjdDogeyBsYWJlbDogJ0NvbnRhY3RvIENvbnZlcnRpZG8nIH0sXG4gICAgICBjb252ZXJ0ZWRfb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdPcG9ydHVuaWRhZCBDb252ZXJ0aWRhJyB9LFxuICAgICAgY29udmVydGVkX2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBkZSBDb252ZXJzaVx1MDBGM24nIH0sXG4gICAgICBhZGRyZXNzOiB7IGxhYmVsOiAnRGlyZWNjaVx1MDBGM24nIH0sXG4gICAgICBhbm51YWxfcmV2ZW51ZTogeyBsYWJlbDogJ0luZ3Jlc29zIEFudWFsZXMnIH0sXG4gICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiB7IGxhYmVsOiAnTlx1MDBGQW1lcm8gZGUgRW1wbGVhZG9zJyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdOb3RhcycsIGhlbHA6ICdOb3RhcyBkZSB0cmFiYWpvIHNvYnJlIGVzdGUgY2xpZW50ZSBwb3RlbmNpYWw6IGFkbWl0ZSBmb3JtYXRvLicgfSxcbiAgICAgIGRvX25vdF9jYWxsOiB7IGxhYmVsOiAnTm8gTGxhbWFyJyB9LFxuICAgICAgZW1haWxfb3B0X291dDogeyBsYWJlbDogJ0V4Y2x1aXIgZGUgQ29ycmVvcycgfSxcbiAgICAgIGRpc3F1YWxpZmljYXRpb25fcmVhc29uOiB7XG4gICAgICAgIGxhYmVsOiAnTW90aXZvIGRlIE5vIENhbGlmaWNhY2lcdTAwRjNuJyxcbiAgICAgICAgaGVscDogJ09ibGlnYXRvcmlvIGN1YW5kbyBlbCBlc3RhZG8gZXMgTm8gQ2FsaWZpY2FkbycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBub3RfYV9maXQ6ICdObyBFbmNhamEnLCBub19idWRnZXQ6ICdTaW4gUHJlc3VwdWVzdG8nLCB3cm9uZ19wZXJzb25hOiAnUGVyZmlsIEluY29ycmVjdG8nLFxuICAgICAgICAgIHVucmVhY2hhYmxlOiAnSWxvY2FsaXphYmxlJywgZHVwbGljYXRlOiAnRHVwbGljYWRvJywgY29tcGV0aXRvcjogJ0NvbXBldGlkb3InLFxuICAgICAgICAgIG90aGVyOiAnT3RybycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZHVwbGljYXRlX29mX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdEdXBsaWNhZG8gRGUnLFxuICAgICAgICBoZWxwOiAnUXVcdTAwRTkgb2JqZXRvIGNvbnRpZW5lIGVsIHJlZ2lzdHJvIHN1cGVydml2aWVudGUgcXVlIGVzdGUgcHJvc3BlY3RvIHJlcGl0ZS4nLFxuICAgICAgICAvLyBgZXJhc2VkYCBlcyB1bmEgbFx1MDBFMXBpZGEsIG5vIHVuYSBvcGNpXHUwMEYzbjogZWwgZm9ybXVsYXJpbyBubyBsYSBvZnJlY2VcbiAgICAgICAgLy8gKHZlciBgc3JjL3NhbGVzL3ZpZXdzL2xlYWQudmlldy50c2ApLCBwZXJvIHVuIHByb3NwZWN0byBjdXlvIHN1cGVydml2aWVudGVcbiAgICAgICAgLy8gZnVlIGVsaW1pbmFkbyBsYSBsbGV2YSwgYXNcdTAwRUQgcXVlIG5lY2VzaXRhIGV0aXF1ZXRhIGFsbFx1MDBFRCBkb25kZSBlbFxuICAgICAgICAvLyByZWdpc3RybyBzZSBMRUU7IHNpbiB0cmFkdWNpciBzZSBtb3N0cmFyXHUwMEVEYSBlbCB2YWxvciBjcnVkbyBgZXJhc2VkYC5cbiAgICAgICAgb3B0aW9uczogeyBjcm1fbGVhZDogJ1Byb3NwZWN0bycsIGNybV9jb250YWN0OiAnQ29udGFjdG8nLCBlcmFzZWQ6ICdSZWdpc3RybyBFbGltaW5hZG8nIH0sXG4gICAgICB9LFxuICAgICAgZHVwbGljYXRlX29mX2xlYWQ6IHsgbGFiZWw6ICdQcm9zcGVjdG8gRHVwbGljYWRvJyB9LFxuICAgICAgZHVwbGljYXRlX29mX2NvbnRhY3Q6IHsgbGFiZWw6ICdDb250YWN0byBEdXBsaWNhZG8nIH0sXG4gICAgICBkdXBsaWNhdGVfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnRXN0YWRvIGRlbCBEdXBsaWNhZG8nLFxuICAgICAgICBoZWxwOiAnU29zcGVjaG9zbyA9IG1hcmNhZG8gYXV0b21cdTAwRTF0aWNhbWVudGUgZW4gbGEgY2FwdHVyYS4gQ29uZmlybWFkbyA9IHVuYSBwZXJzb25hIHZlcmlmaWNcdTAwRjMgbGEgY29pbmNpZGVuY2lhLicsXG4gICAgICAgIG9wdGlvbnM6IHsgc3VzcGVjdGVkOiAnU29zcGVjaG9zbycsIGNvbmZpcm1lZDogJ0NvbmZpcm1hZG8nIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfbGVhZHM6IHtcbiAgICAgICAgbGFiZWw6ICdUb2RvcyBsb3MgUHJvc3BlY3RvcycsXG4gICAgICAgIGVtcHR5U3RhdGU6IHsgdGl0bGU6ICdUb2Rhdlx1MDBFRGEgbm8gaGF5IHByb3NwZWN0b3MnLCBtZXNzYWdlOiAnRW1waWVjZSBjcmVhbmRvIHN1IHByaW1lciBwcm9zcGVjdG8nIH0sXG4gICAgICB9LFxuICAgICAga2FuYmFuX2J5X3N0YXR1czogeyBsYWJlbDogJ1BpcGVsaW5lIGRlIFByb3NwZWN0b3MnIH0sXG4gICAgICBjYWxlbmRhcl9ieV9jcmVhdGVkOiB7IGxhYmVsOiAnQ2FsZW5kYXJpbyBkZSBQcm9zcGVjdG9zJyB9LFxuICAgICAgZ2FsbGVyeV92aWV3OiB7IGxhYmVsOiAnR2FsZXJcdTAwRURhIGRlIFByb3NwZWN0b3MnIH0sXG4gICAgICBteV9sZWFkczogeyBsYWJlbDogJ01pcyBQcm9zcGVjdG9zJyB9LFxuICAgICAgaGlnaF9wcmlvcml0eTogeyBsYWJlbDogJ0FsdGEgUHJpb3JpZGFkJyB9LFxuICAgICAgaG90X2xlYWRzOiB7IGxhYmVsOiAnXHVEODNEXHVERDI1IFByb3NwZWN0b3MgQ2FsaWVudGVzJyB9LFxuICAgICAgc3VzcGVjdGVkX2R1cGxpY2F0ZXM6IHtcbiAgICAgICAgbGFiZWw6ICdEdXBsaWNhZG9zIFNvc3BlY2hvc29zJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnU2luIGR1cGxpY2Fkb3Mgc29zcGVjaG9zb3MnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdOYWRhIHF1ZSByZXZpc2FyOiBzZSBoYW4gY29tcHJvYmFkbyB0b2RvcyBsb3MgY29ycmVvcyByZWNhcHR1cmFkb3MuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIC8vIENsYXZlcyBkZSBzZWNjaVx1MDBGM24gZGVsIG9iamV0byAobGVhZC5vYmplY3QudHMpIHF1ZSB1c2FuIGxvc1xuICAgICAgLy8gZm9ybXVsYXJpb3MgZGUgcmVnaXN0cm8geSBsYSBwXHUwMEUxZ2luYSBkZSBkZXRhbGxlLCBjdXlhcyBzZWNjaW9uZXNcbiAgICAgIC8vIGhhY2VuIHJlZmVyZW5jaWEgYSBlc3RvcyBncnVwb3MgKCM4MDYpLlxuICAgICAgYWRkcmVzczogeyBsYWJlbDogJ0RpcmVjY2lcdTAwRjNuJyB9LFxuICAgICAgaWRlbnRpdHk6IHsgbGFiZWw6ICdJZGVudGlkYWQnIH0sXG4gICAgICBjb21wYW55X2luZm86IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlIGxhIEVtcHJlc2EnIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlIENvbnRhY3RvJyB9LFxuICAgICAgcXVhbGlmaWNhdGlvbjogeyBsYWJlbDogJ0NhbGlmaWNhY2lcdTAwRjNuJyB9LFxuICAgICAgYXNzaWdubWVudDogeyBsYWJlbDogJ0FzaWduYWNpXHUwMEYzbicgfSxcbiAgICAgIGNvbnZlcnNpb246IHsgbGFiZWw6ICdDb252ZXJzaVx1MDBGM24nIH0sXG4gICAgICBhZGRpdGlvbmFsOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBBZGljaW9uYWwnIH0sXG4gICAgICBwcmVmZXJlbmNlczogeyBsYWJlbDogJ1ByZWZlcmVuY2lhcyBkZSBDb211bmljYWNpXHUwMEYzbicgfSxcbiAgICAgIGR1cGxpY2F0ZXM6IHsgbGFiZWw6ICdHZXN0aVx1MDBGM24gZGUgRHVwbGljYWRvcycgfSxcbiAgICAgIC8vIE5vbWJyZXMgZGUgc2VjY2lcdTAwRjNuIGRlbCBmb3JtdWxhcmlvIGVuIGxlYWQudmlldy50cyAoIzExMDApIFx1MjAxNCBhcXVcdTAwRURcbiAgICAgIC8vIHZpdmVuIGxhcyBzZWNjaW9uZXMgZGVsIGZvcm11bGFyaW8gcG9yIGRlZmVjdG8geSBsYXMgZGUgY2FkYSBmb3JtVmlld1xuICAgICAgLy8gY29uIG5vbWJyZTogc2kgc2UgYVx1MDBGMWFkZSB1biBmb3JtdWxhcmlvIGFsbFx1MDBFRCwgc2UgYVx1MDBGMWFkZW4gYXF1XHUwMEVEIHN1c1xuICAgICAgLy8gbm9tYnJlcyBkZSBzZWNjaVx1MDBGM24uXG4gICAgICBjb250YWN0X2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBkZSBDb250YWN0bycgfSxcbiAgICAgIGxlYWRfY2xhc3NpZmljYXRpb246IHsgbGFiZWw6ICdDbGFzaWZpY2FjaVx1MDBGM24gZGVsIExlYWQnIH0sXG4gICAgICBjb21wYW55X2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBkZSBsYSBFbXByZXNhJyB9LFxuICAgICAgYWRkaXRpb25hbF9pbmZvcm1hdGlvbjogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gQWRpY2lvbmFsJyB9LFxuICAgICAgcHJpdmFjeTogeyBsYWJlbDogJ1ByaXZhY2lkYWQnIH0sXG4gICAgICBnZW5lcmFsOiB7IGxhYmVsOiAnR2VuZXJhbCcgfSxcbiAgICAgIGRldGFpbHM6IHsgbGFiZWw6ICdEZXRhbGxlcycgfSxcbiAgICAgIHN0ZXBfMV9jb250YWN0X2RldGFpbHM6IHsgbGFiZWw6ICdQYXNvIDE6IERhdG9zIGRlIENvbnRhY3RvJyB9LFxuICAgICAgc3RlcF8yX2NvbXBhbnlfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdQYXNvIDI6IEluZm9ybWFjaVx1MDBGM24gZGUgbGEgRW1wcmVzYScgfSxcbiAgICAgIHN0ZXBfM19xdWFsaWZpY2F0aW9uOiB7IGxhYmVsOiAnUGFzbyAzOiBDYWxpZmljYWNpXHUwMEYzbicgfSxcbiAgICAgIHN0ZXBfNF9yZXZpZXdfYW5kX2NvbnZlcnQ6IHsgbGFiZWw6ICdQYXNvIDQ6IFJldmlzYXIgeSBDb252ZXJ0aXInIH0sXG4gICAgICBwcmltYXJ5X2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBQcmluY2lwYWwnIH0sXG4gICAgICBleHRlbmRlZF9kZXRhaWxzOiB7IGxhYmVsOiAnRGV0YWxsZXMgQW1wbGlhZG9zJyB9LFxuICAgICAgcXVpY2tfZWRpdDogeyBsYWJlbDogJ0VkaWNpXHUwMEYzbiBSXHUwMEUxcGlkYScgfSxcbiAgICAgIHVwZGF0ZV9sZWFkX3N0YXR1czogeyBsYWJlbDogJ0FjdHVhbGl6YXIgRXN0YWRvIGRlbCBMZWFkJyB9LFxuICAgICAgdGVsbF91c19hYm91dF95b3Vyc2VsZjogeyBsYWJlbDogJ0N1XHUwMEU5bnRhbm9zIHNvYnJlIHRpJyB9LFxuICAgICAgYWJvdXRfeW91cl9jb21wYW55OiB7IGxhYmVsOiAnU29icmUgdHUgZW1wcmVzYScgfSxcbiAgICAgIGhvd19jYW5fd2VfaGVscDogeyBsYWJlbDogJ1x1MDBCRkNcdTAwRjNtbyBwb2RlbW9zIGF5dWRhcnRlPycgfSxcbiAgICAgIGxlYWRfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlbCBMZWFkJyB9LFxuICAgICAgYWRkcmVzc19pbmZvcm1hdGlvbjogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gZGUgRGlyZWNjaVx1MDBGM24nIH0sXG4gICAgICBwcml2YWN5X3ByZWZlcmVuY2VzOiB7IGxhYmVsOiAnUHJlZmVyZW5jaWFzIGRlIFByaXZhY2lkYWQnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgY29udmVydF9sZWFkOiB7XG4gICAgICAgIGxhYmVsOiAnQ29udmVydGlyIFByb3NwZWN0bycsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUwMEExUHJvc3BlY3RvIGNvbnZlcnRpZG8gY29uIFx1MDBFOXhpdG8hJyxcbiAgICAgIH0sXG4gICAgICBjcmVhdGVfY2FtcGFpZ246IHtcbiAgICAgICAgbGFiZWw6ICdBZ3JlZ2FyIGEgQ2FtcGFcdTAwRjFhJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTAwQTFQcm9zcGVjdG8gYWdyZWdhZG8gYSBsYSBjYW1wYVx1MDBGMWEhJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnQ2FtcGFcdTAwRjFhJyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNjaGVkdWxlX2ZvbGxvd3VwOiB7XG4gICAgICAgIGxhYmVsOiAnUHJvZ3JhbWFyIFNlZ3VpbWllbnRvJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdTZWd1aW1pZW50byBwcm9ncmFtYWRvLicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9vcHBvcnR1bml0eToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgYW1vdW50X3Bvc2l0aXZlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdFbCBpbXBvcnRlIGRlYmUgc2VyIG1heW9yIHF1ZSBjZXJvJyxcbiAgICAgIH0sXG4gICAgICBjbG9zZV9kYXRlX2Z1dHVyZToge1xuICAgICAgICBtZXNzYWdlOiAnTGEgZmVjaGEgZGUgY2llcnJlIG5vIGRlYmVyXHUwMEVEYSBlc3RhciBlbiBlbCBwYXNhZG8gc2Fsdm8gcXVlIGxhIG9wb3J0dW5pZGFkIGVzdFx1MDBFOSBjZXJyYWRhJyxcbiAgICAgIH0sXG4gICAgICBvcHBvcnR1bml0eV9zdGFnZV9wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnVHJhbnNpY2lcdTAwRjNuIGRlIGV0YXBhIGRlIG9wb3J0dW5pZGFkIG5vIHZcdTAwRTFsaWRhJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ09wb3J0dW5pZGFkJyxcbiAgICBwbHVyYWxMYWJlbDogJ09wb3J0dW5pZGFkZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnT3BvcnR1bmlkYWRlcyBkZSB2ZW50YSB5IG5lZ29jaW9zIGVuIGVsIHBpcGVsaW5lJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdOb21icmUgZGUgT3BvcnR1bmlkYWQnIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ0N1ZW50YScgfSxcbiAgICAgIHByaW1hcnlfY29udGFjdDogeyBsYWJlbDogJ0NvbnRhY3RvIFByaW5jaXBhbCcgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnUHJvcGlldGFyaW8gZGUgT3BvcnR1bmlkYWQnIH0sXG4gICAgICBhbW91bnQ6IHsgbGFiZWw6ICdNb250bycgfSxcbiAgICAgIGV4cGVjdGVkX3JldmVudWU6IHsgbGFiZWw6ICdJbmdyZXNvIEVzcGVyYWRvJyB9LFxuICAgICAgc3RhZ2U6IHtcbiAgICAgICAgbGFiZWw6ICdFdGFwYScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwcm9zcGVjdGluZzogJ1Byb3NwZWNjaVx1MDBGM24nLCBxdWFsaWZpY2F0aW9uOiAnQ2FsaWZpY2FjaVx1MDBGM24nLFxuICAgICAgICAgIG5lZWRzX2FuYWx5c2lzOiAnQW5cdTAwRTFsaXNpcyBkZSBOZWNlc2lkYWRlcycsIHByb3Bvc2FsOiAnUHJvcHVlc3RhJyxcbiAgICAgICAgICBuZWdvdGlhdGlvbjogJ05lZ29jaWFjaVx1MDBGM24nLCBjbG9zZWRfd29uOiAnQ2VycmFkYSBHYW5hZGEnLCBjbG9zZWRfbG9zdDogJ0NlcnJhZGEgUGVyZGlkYScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcHJvYmFiaWxpdHk6IHsgbGFiZWw6ICdQcm9iYWJpbGlkYWQgKCUpJyB9LFxuICAgICAgY2xvc2VfZGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIENpZXJyZScgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ld19idXNpbmVzczogJ051ZXZvIE5lZ29jaW8nLFxuICAgICAgICAgIGV4aXN0aW5nX3VwZ3JhZGU6ICdDbGllbnRlIEV4aXN0ZW50ZSAtIE1lam9yYScsXG4gICAgICAgICAgZXhpc3RpbmdfcmVuZXdhbDogJ0NsaWVudGUgRXhpc3RlbnRlIC0gUmVub3ZhY2lcdTAwRjNuJyxcbiAgICAgICAgICBleGlzdGluZ19leHBhbnNpb246ICdDbGllbnRlIEV4aXN0ZW50ZSAtIEV4cGFuc2lcdTAwRjNuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ0NhdGVnb3JcdTAwRURhIGRlIFByb25cdTAwRjNzdGljbycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwaXBlbGluZTogJ1BpcGVsaW5lJywgYmVzdF9jYXNlOiAnTWVqb3IgQ2FzbycsXG4gICAgICAgICAgY29tbWl0OiAnQ29tcHJvbWlzbycsIG9taXR0ZWQ6ICdPbWl0aWRhJywgY2xvc2VkOiAnQ2VycmFkYScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwY2lcdTAwRjNuJyB9LFxuICAgICAgbmV4dF9zdGVwOiB7IGxhYmVsOiAnUHJcdTAwRjN4aW1vIFBhc28nIH0sXG4gICAgICBsZWFkX3NvdXJjZToge1xuICAgICAgICBsYWJlbDogJ09yaWdlbiBkZWwgUHJvc3BlY3RvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHdlYjogJ1dlYicsIHJlZmVycmFsOiAnUmVmZXJlbmNpYScsIGV2ZW50OiAnRXZlbnRvIC8gRmVyaWEnLFxuICAgICAgICAgIHdlYmluYXI6ICdTZW1pbmFyaW8gV2ViJywgcGFydG5lcjogJ1NvY2lvJywgYWR2ZXJ0aXNlbWVudDogJ1B1YmxpY2lkYWQnLFxuICAgICAgICAgIHBhaWRfc2VhcmNoOiAnQlx1MDBGQXNxdWVkYSBkZSBQYWdvJywgc29jaWFsOiAnUmVkZXMgU29jaWFsZXMnLCBjb250ZW50OiAnQ29udGVuaWRvIC8gQmxvZycsXG4gICAgICAgICAgY29sZF9jYWxsOiAnTGxhbWFkYSBlbiBGclx1MDBFRG8nLCBlbWFpbF9jYW1wYWlnbjogJ0NhbXBhXHUwMEYxYSBkZSBFbWFpbCcsIG90aGVyOiAnT3RybycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnQ2FtcGFcdTAwRjFhJywgaGVscDogJ0NhbXBhXHUwMEYxYSBkZSBtYXJrZXRpbmcgcXVlIGdlbmVyXHUwMEYzIGVzdGEgb3BvcnR1bmlkYWQnIH0sXG4gICAgICBkYXlzX2luX3N0YWdlOiB7IGxhYmVsOiAnRFx1MDBFRGFzIGVuIEV0YXBhIEFjdHVhbCcgfSxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBkZSBFbnRyYWRhIGEgbGEgRXRhcGEnLCBoZWxwOiAnRmVjaGEgZW4gbGEgcXVlIGVzdGEgb3BvcnR1bmlkYWQgZW50clx1MDBGMyBlbiBzdSBldGFwYSBhY3R1YWwuJyB9LFxuICAgICAgaXNfcHJpdmF0ZTogeyBsYWJlbDogJ1ByaXZhZG8nIH0sXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdFc3RhZG8gZGUgQXByb2JhY2lcdTAwRjNuJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5vdF9yZXF1aXJlZDogJ05vIFJlcXVlcmlkYScsIHBlbmRpbmc6ICdQZW5kaWVudGUnLFxuICAgICAgICAgIGFwcHJvdmVkOiAnQXByb2JhZGEnLCByZWplY3RlZDogJ1JlY2hhemFkYScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXBwcm92ZWRfZGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIEFwcm9iYWNpXHUwMEYzbicgfSxcbiAgICAgIC8vICM1OTMgXHUyMDE0IG9ibGlnYXRvcmlhcyBhbCBjZXJyYXIgbGEgb3BvcnR1bmlkYWQsIHkgZWwgZGVzZ2xvc2UgZGVcbiAgICAgIC8vIG1vdGl2b3MgZGUgcFx1MDBFOXJkaWRhIGxhcyBtdWVzdHJhIGVuIGVsIHBhbmVsIGRlIHZlbnRhcywgYXNcdTAwRUQgcXVlIGVsXG4gICAgICAvLyB2YWxvciBhbG1hY2VuYWRvIG51bmNhIGRlYmUgbGxlZ2FyIGNydWRvIGFsIHNlbGVjdG9yLlxuICAgICAgd2luX3JlYXNvbjoge1xuICAgICAgICBsYWJlbDogJ01vdGl2byBkZSBHYW5hbmNpYScsXG4gICAgICAgIGhlbHA6ICdQb3IgcXVcdTAwRTkgc2UgZ2FuXHUwMEYzIGVzdGUgbmVnb2Npby4gT2JsaWdhdG9yaW8gcGFyYSBjZXJyYXIgdW5hIG9wb3J0dW5pZGFkIGNvbW8gR2FuYWRhLicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBiZXR0ZXJfcHJvZHVjdDogJ01lam9yIFByb2R1Y3RvJywgYmV0dGVyX3ByaWNlOiAnTWVqb3IgUHJlY2lvJyxcbiAgICAgICAgICByZWxhdGlvbnNoaXA6ICdSZWxhY2lcdTAwRjNuIEV4aXN0ZW50ZScsIGJldHRlcl9zdXBwb3J0OiAnTWVqb3IgU29wb3J0ZScsXG4gICAgICAgICAgYmVzdF9maXQ6ICdNZWpvciBBanVzdGUgLyBGdW5jaW9uYWxpZGFkZXMnLFxuICAgICAgICAgIHF1b3RlX2FjY2VwdGVkOiAnQ290aXphY2lcdTAwRjNuIEFjZXB0YWRhJywgb3RoZXI6ICdPdHJvJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBsb3NzX3JlYXNvbjoge1xuICAgICAgICBsYWJlbDogJ01vdGl2byBkZSBQXHUwMEU5cmRpZGEnLFxuICAgICAgICBoZWxwOiAnUG9yIHF1XHUwMEU5IHNlIHBlcmRpXHUwMEYzIGVzdGUgbmVnb2Npby4gT2JsaWdhdG9yaW8gcGFyYSBjZXJyYXIgdW5hIG9wb3J0dW5pZGFkIGNvbW8gUGVyZGlkYS4nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcHJpY2U6ICdQcmVjaW8gRGVtYXNpYWRvIEFsdG8nLCBjb21wZXRpdG9yOiAnUGVyZGlkYSBhbnRlIENvbXBldGlkb3InLFxuICAgICAgICAgIG5vX2J1ZGdldDogJ1NpbiBQcmVzdXB1ZXN0bycsIG5vX2RlY2lzaW9uOiAnU2luIERlY2lzaVx1MDBGM24nLFxuICAgICAgICAgIHRpbWluZzogJ01vbWVudG8gSW5hZGVjdWFkbycsIGZlYXR1cmVzOiAnRnVuY2lvbmFsaWRhZGVzIEZhbHRhbnRlcycsIG90aGVyOiAnT3RybycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbG9zc19kZXRhaWxzOiB7XG4gICAgICAgIGxhYmVsOiAnRGV0YWxsZXMgZGUgR2FuYW5jaWEvUFx1MDBFOXJkaWRhJyxcbiAgICAgICAgaGVscDogJ0NvbnRleHRvIGVuIHRleHRvIGxpYnJlIGRldHJcdTAwRTFzIGRlbCBtb3Rpdm8gZGUgZ2FuYW5jaWEgbyBwXHUwMEU5cmRpZGEuJyxcbiAgICAgIH0sXG4gICAgICAvLyBSRVEtMDAwNiBcdTIwMTQgY2FsaWZpY2FjaVx1MDBGM24sIGNhbGVuZGFyaW8gZGUgY29tcHJhIGRlbCBjbGllbnRlLCBuYXJyYXRpdmFcbiAgICAgIC8vIGRlbCBuZWdvY2lvLCBsXHUwMEVEbmVhIGRlIG5lZ29jaW8geSBhcHJvYmFjaVx1MDBGM24gZGVsIGNhbWJpbyBkZSBlc3RhZG8uXG4gICAgICB3aWxsX2JpZDoge1xuICAgICAgICBsYWJlbDogJ1ByZXNlbnRhcmVtb3MgT2ZlcnRhJyxcbiAgICAgICAgaGVscDogJ1NpIHRlbmVtb3MgaW50ZW5jaVx1MDBGM24gZGUgcHJlc2VudGFyIG9mZXJ0YS4gU2luIHZhbG9yIHNpZ25pZmljYSBxdWUgbGEgZGVjaXNpXHUwMEYzbiBzaWd1ZSBhYmllcnRhLicsXG4gICAgICB9LFxuICAgICAgY29udHJvbGxhYmlsaXR5OiB7IGxhYmVsOiAnQ29udHJvbGFiaWxpZGFkJywgb3B0aW9uczogeyBoaWdoOiAnQWx0YScsIG1lZGl1bTogJ01lZGlhJywgbG93OiAnQmFqYScgfSB9LFxuICAgICAgcHJpb3JpdHk6IHsgbGFiZWw6ICdQcmlvcmlkYWQnLCBvcHRpb25zOiB7IGhpZ2g6ICdBbHRhJywgbWVkaXVtOiAnTWVkaWEnLCBsb3c6ICdCYWphJyB9IH0sXG4gICAgICBkZWFsX2xldmVsOiB7IGxhYmVsOiAnTml2ZWwgZGVsIE5lZ29jaW8nLCBvcHRpb25zOiB7IHN0cmF0ZWdpYzogJ0VzdHJhdFx1MDBFOWdpY28nLCBrZXk6ICdDbGF2ZScsIHN0YW5kYXJkOiAnRXN0XHUwMEUxbmRhcicgfSB9LFxuICAgICAgaXNfc3ViY29udHJhY3RlZDogeyBsYWJlbDogJ0luY2x1eWUgU3ViY29udHJhdGFjaVx1MDBGM24nIH0sXG4gICAgICBzdWJjb250cmFjdGluZ19ub3RlOiB7IGxhYmVsOiAnTm90YSBkZSBTdWJjb250cmF0YWNpXHUwMEYzbicgfSxcbiAgICAgIGN1c3RvbWVyX2luaXRpYXRpb25fZGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIEluaWNpbyBkZWwgUHJveWVjdG8gKENsaWVudGUpJyB9LFxuICAgICAgZXhwZWN0ZWRfdGVuZGVyX2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBQcmV2aXN0YSBkZSBMaWNpdGFjaVx1MDBGM24nIH0sXG4gICAgICBleHBlY3RlZF9zaWduaW5nX2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBQcmV2aXN0YSBkZSBGaXJtYScgfSxcbiAgICAgIGV4cGVjdGVkX3RlbmRlcl9hbW91bnQ6IHsgbGFiZWw6ICdJbXBvcnRlIFByZXZpc3RvIGRlIExpY2l0YWNpXHUwMEYzbicgfSxcbiAgICAgIGV4cGVjdGVkX3NpZ25pbmdfYW1vdW50OiB7IGxhYmVsOiAnSW1wb3J0ZSBQcmV2aXN0byBkZSBGaXJtYScgfSxcbiAgICAgIGJ1c2luZXNzX2xpbmU6IHtcbiAgICAgICAgbGFiZWw6ICdMXHUwMEVEbmVhIGRlIE5lZ29jaW8nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcHJvZHVjdDogJ1Byb2R1Y3RvJywgc2VydmljZXM6ICdTZXJ2aWNpb3MgUHJvZmVzaW9uYWxlcycsIGNvbnN1bHRpbmc6ICdDb25zdWx0b3JcdTAwRURhJyxcbiAgICAgICAgICBzdXBwb3J0OiAnU29wb3J0ZSB5IE1hbnRlbmltaWVudG8nLCBvdGhlcjogJ090cm8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGN1c3RvbWVyX2JhY2tncm91bmQ6IHsgbGFiZWw6ICdBbnRlY2VkZW50ZXMgZGVsIENsaWVudGUnIH0sXG4gICAgICBwcm9qZWN0X2JhY2tncm91bmQ6IHsgbGFiZWw6ICdBbnRlY2VkZW50ZXMgZGVsIFByb3llY3RvJyB9LFxuICAgICAgcmlza19hbmFseXNpczogeyBsYWJlbDogJ0FuXHUwMEUxbGlzaXMgZGUgUmllc2dvcycgfSxcbiAgICAgIHBheW1lbnRfdGVybXM6IHsgbGFiZWw6ICdDb25kaWNpb25lcyBkZSBQYWdvJyB9LFxuICAgICAgcmVxdWVzdGVkX3N0YXR1czogeyBsYWJlbDogJ0VzdGFkbyBTb2xpY2l0YWRvJywgb3B0aW9uczogeyBjbG9zZWRfd29uOiAnR2FuYWRhJywgY2xvc2VkX2xvc3Q6ICdQZXJkaWRhJyB9IH0sXG4gICAgICBzdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1czoge1xuICAgICAgICBsYWJlbDogJ0Fwcm9iYWNpXHUwMEYzbiBkZWwgQ2FtYmlvIGRlIEVzdGFkbycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBub3RfcmVxdWlyZWQ6ICdObyBSZXF1ZXJpZGEnLCBwZW5kaW5nOiAnUGVuZGllbnRlJyxcbiAgICAgICAgICBhcHByb3ZlZDogJ0Fwcm9iYWRhJywgcmVqZWN0ZWQ6ICdSZWNoYXphZGEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIC8vIFJFUS0wMDA2IHBhc28gMTEgXHUyMDE0IGxhIGFwcm9iYWNpXHUwMEYzbiBkZSBjYWxpZmljYWNpXHUwMEYzbiAoXHU3QUNCXHU5ODc5KS5cbiAgICAgIHF1YWxpZmljYXRpb25fcmVxdWVzdGVkOiB7XG4gICAgICAgIGxhYmVsOiAnU29saWNpdGFyIEFwcm9iYWNpXHUwMEYzbiBkZSBDYWxpZmljYWNpXHUwMEYzbicsXG4gICAgICAgIGhlbHA6ICdNXHUwMEUxcnF1ZWxvIHBhcmEgZW52aWFyIGVzdGUgbmVnb2NpbyBhIGFwcm9iYWNpXHUwMEYzbiBkZSBjYWxpZmljYWNpXHUwMEYzbi4gVW4gcmVjaGF6byBsbyBkZXNtYXJjYTsgdnVlbHZhIGEgbWFyY2FybG8gcGFyYSBzb2xpY2l0YXJsYSBkZSBudWV2by4nLFxuICAgICAgfSxcbiAgICAgIHF1YWxpZmljYXRpb25fYXBwcm92YWxfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnQXByb2JhY2lcdTAwRjNuIGRlIENhbGlmaWNhY2lcdTAwRjNuJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5vdF9yZXF1aXJlZDogJ05vIFJlcXVlcmlkYScsIHBlbmRpbmc6ICdQZW5kaWVudGUnLFxuICAgICAgICAgIGFwcHJvdmVkOiAnQXByb2JhZGEnLCByZWplY3RlZDogJ1JlY2hhemFkYScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICB0ZW5kZXJfdGhpc19xdWFydGVyOiB7XG4gICAgICAgIGxhYmVsOiAnTGljaXRhY2lvbmVzIGRlIEVzdGUgVHJpbWVzdHJlJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnTm8gaGF5IGxpY2l0YWNpb25lcyBwcmV2aXN0YXMgZXN0ZSB0cmltZXN0cmUnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdFc3RhIHBlc3RhXHUwMEYxYSBtdWVzdHJhIGxvcyBuZWdvY2lvcyBhYmllcnRvcyBjdXlhIGZlY2hhIGRlIGxpY2l0YWNpXHUwMEYzbiBkZWwgY2xpZW50ZSBjYWUgZGVudHJvIGRlbCB0cmltZXN0cmUgYWN0dWFsLiBSZWdpc3RyYSBsYSBGZWNoYSBQcmV2aXN0YSBkZSBMaWNpdGFjaVx1MDBGM24gZW4gdW4gbmVnb2NpbyBwYXJhIHZlcmxvIGFxdVx1MDBFRC4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG9wZW5fb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ09wb3J0dW5pZGFkZXMgQWJpZXJ0YXMnIH0sXG4gICAgICBhbGxfb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ1RvZGFzIGxhcyBPcG9ydHVuaWRhZGVzJyB9LFxuICAgICAgcGlwZWxpbmVfa2FuYmFuOiB7IGxhYmVsOiAnUGlwZWxpbmUgZGUgVmVudGFzJyB9LFxuICAgICAgY2xvc2VfZGF0ZV9jYWxlbmRhcjogeyBsYWJlbDogJ0NhbGVuZGFyaW8gZGUgUHJvblx1MDBGM3N0aWNvJyB9LFxuICAgICAgZGVhbF90aW1lbGluZTogeyBsYWJlbDogJ0xcdTAwRURuZWEgZGUgVGllbXBvJyB9LFxuICAgICAgZGVhbF9nYWxsZXJ5OiB7IGxhYmVsOiAnR2FsZXJcdTAwRURhIGRlIE5lZ29jaW9zJyB9LFxuICAgICAgbXlfb3Blbl9kZWFsczogeyBsYWJlbDogJ01pcyBOZWdvY2lvcyBBYmllcnRvcycgfSxcbiAgICAgIGNsb3NpbmdfdGhpc19xdWFydGVyOiB7XG4gICAgICAgIGxhYmVsOiAnQ2llcnJlcyBkZSBFc3RlIFRyaW1lc3RyZScsXG4gICAgICAgIGVtcHR5U3RhdGU6IHtcbiAgICAgICAgICB0aXRsZTogJ05vIGhheSBuZWdvY2lvcyBxdWUgY2llcnJlbiBlc3RlIHRyaW1lc3RyZScsXG4gICAgICAgICAgbWVzc2FnZTogJ0VzdGEgcGVzdGFcdTAwRjFhIG11ZXN0cmEgbG9zIG5lZ29jaW9zIGFiaWVydG9zIGVuIGNhdGVnb3JcdTAwRURhIENvbXByb21pc28gbyBNZWpvciBDYXNvIGN1eWEgZmVjaGEgZGUgY2llcnJlIGNhZSBkZW50cm8gZGVsIHRyaW1lc3RyZSBhY3R1YWwuIEFob3JhIG1pc21vIG5vIGhheSBuaW5ndW5vOyBsb3MgbmVnb2Npb3MgcXVlIGNpZXJyYW4gbVx1MDBFMXMgYWRlbGFudGUgZXN0XHUwMEUxbiBlbiBsYSBwZXN0YVx1MDBGMWEgTmVnb2Npb3MgQWJpZXJ0b3MuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGFsZV9vcHBvcnR1bml0aWVzOiB7IGxhYmVsOiAnXHUyNkEwXHVGRTBGIE9wb3J0dW5pZGFkZXMgRXN0YW5jYWRhcyBcdTAwQjcgTVx1MDBFMXMgVGllbXBvIGVuIEV0YXBhIFByaW1lcm8nIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIC8vIENsYXZlcyBkZSBzZWNjaVx1MDBGM24gZGVsIG9iamV0byAob3Bwb3J0dW5pdHkub2JqZWN0LnRzKSBxdWUgdXNhbiBsb3NcbiAgICAgIC8vIGZvcm11bGFyaW9zIGRlIHJlZ2lzdHJvIHkgbGEgcFx1MDBFMWdpbmEgZGUgZGV0YWxsZSwgY3V5YXMgc2VjY2lvbmVzXG4gICAgICAvLyBoYWNlbiByZWZlcmVuY2lhIGEgZXN0b3MgZ3J1cG9zICgjMTQ1MikuXG4gICAgICAvL1xuICAgICAgLy8gYGNybV9mb3JlY2FzdGAgZXMgbGEgY2xhdmUgZGVsIGdydXBvIGRlIGNhbXBvcyAoXHUwMEFCRm9yZWNhc3QgJiBNZXRyaWNzXHUwMEJCXG4gICAgICAvLyBlbiBpbmdsXHUwMEU5cykuIEVzdGEgdHJhZHVjY2lcdTAwRjNuIGVzIGFudGVyaW9yIGEgIzE0NTIsIGN1YW5kbyB1bmEgc2VjY2lcdTAwRjNuXG4gICAgICAvLyBkZSBsYSBwXHUwMEUxZ2luYSBkZSBkZXRhbGxlIGNvbiBlbCBtaXNtbyBub21icmUgc2UgdGl0dWxhYmEgXHUwMEFCU3RhZ2UgJlxuICAgICAgLy8gRm9yZWNhc3RcdTAwQkI7IGRlc2RlIGVudG9uY2VzIHNvbG8gbGEgbGVlIGVsIGdydXBvLlxuICAgICAgY3JtX2ZvcmVjYXN0OiB7IGxhYmVsOiAnRXRhcGEgeSBQcmV2aXNpXHUwMEYzbicgfSxcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBCXHUwMEUxc2ljYScgfSxcbiAgICAgIGZpbmFuY2lhbHM6IHsgbGFiZWw6ICdEYXRvcyBGaW5hbmNpZXJvcycgfSxcbiAgICAgIHNhbGVzX3Byb2Nlc3M6IHsgbGFiZWw6ICdQcm9jZXNvIGRlIFZlbnRhJyB9LFxuICAgICAgY2xhc3NpZmljYXRpb246IHsgbGFiZWw6ICdDbGFzaWZpY2FjaVx1MDBGM24nIH0sXG4gICAgICBjYW1wYWlnbjogeyBsYWJlbDogJ0NhbXBhXHUwMEYxYXMnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ05vdGFzIHkgUHJcdTAwRjN4aW1vcyBQYXNvcycgfSxcbiAgICAgIHF1YWxpZmljYXRpb246IHsgbGFiZWw6ICdDYWxpZmljYWNpXHUwMEYzbicgfSxcbiAgICAgIG5hcnJhdGl2ZTogeyBsYWJlbDogJ05hcnJhdGl2YSBkZWwgTmVnb2NpbycgfSxcbiAgICAgIC8vIE5vbWJyZXMgZGUgc2VjY2lcdTAwRjNuIGRlbCBmb3JtdWxhcmlvIGVuIG9wcG9ydHVuaXR5LnZpZXcudHMgKCMxMTAwKVxuICAgICAgb3ZlcnZpZXc6IHsgbGFiZWw6ICdSZXN1bWVuJyB9LFxuICAgICAgZm9yZWNhc3Q6IHsgbGFiZWw6ICdQcmV2aXNpXHUwMEYzbicgfSxcbiAgICAgIHNhbGVzX3N0cmF0ZWd5OiB7IGxhYmVsOiAnRXN0cmF0ZWdpYSBkZSBWZW50YXMnIH0sXG4gICAgICB3aW5fbG9zczogeyBsYWJlbDogJ0dhbmFkYSAvIFBlcmRpZGEnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgY2xvbmVfb3Bwb3J0dW5pdHk6IHtcbiAgICAgICAgbGFiZWw6ICdDbG9uYXIgT3BvcnR1bmlkYWQnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1MDBBMU9wb3J0dW5pZGFkIGNsb25hZGEgY29uIFx1MDBFOXhpdG8hJyxcbiAgICAgIH0sXG4gICAgICBtYXNzX3VwZGF0ZV9zdGFnZToge1xuICAgICAgICBsYWJlbDogJ0FjdHVhbGl6YXIgRXRhcGEnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1MDBBMUV0YXBhIGRlIG9wb3J0dW5pZGFkIGFjdHVhbGl6YWRhIScsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIC8vIE1pc21vcyB2YWxvcmVzIHF1ZSBgZmllbGRzLnN0YWdlYCBcdTIwMTQgZGViZW4gY29pbmNpZGlyIGxpdGVyYWxtZW50ZS5cbiAgICAgICAgICBzdGFnZToge1xuICAgICAgICAgICAgbGFiZWw6ICdOdWV2YSBFdGFwYScsXG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgIHByb3NwZWN0aW5nOiAnUHJvc3BlY2NpXHUwMEYzbicsIHF1YWxpZmljYXRpb246ICdDYWxpZmljYWNpXHUwMEYzbicsXG4gICAgICAgICAgICAgIG5lZWRzX2FuYWx5c2lzOiAnQW5cdTAwRTFsaXNpcyBkZSBOZWNlc2lkYWRlcycsIHByb3Bvc2FsOiAnUHJvcHVlc3RhJyxcbiAgICAgICAgICAgICAgbmVnb3RpYXRpb246ICdOZWdvY2lhY2lcdTAwRjNuJywgY2xvc2VkX3dvbjogJ0NlcnJhZGEgR2FuYWRhJywgY2xvc2VkX2xvc3Q6ICdDZXJyYWRhIFBlcmRpZGEnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGdlbmVyYXRlX3F1b3RlOiB7XG4gICAgICAgIGxhYmVsOiAnR2VuZXJhciBDb3RpemFjaVx1MDBGM24nLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1MDBBMUNvdGl6YWNpXHUwMEYzbiBjcmVhZGEgZGVzZGUgbGEgb3BvcnR1bmlkYWQhJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgdW5pdF9wcmljZV9wb3NpdGl2ZToge1xuICAgICAgICBtZXNzYWdlOiAnRWwgcHJlY2lvIGRlIHZlbnRhIG5vIHB1ZWRlIHNlciBuZWdhdGl2bycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdMXHUwMEVEbmVhIGRlIE9wb3J0dW5pZGFkJyxcbiAgICBwbHVyYWxMYWJlbDogJ0xcdTAwRURuZWFzIGRlIE9wb3J0dW5pZGFkJyxcbiAgICBkZXNjcmlwdGlvbjogJ0xcdTAwRURuZWFzIGRlIHByZWNpbyBwb3IgcHJvZHVjdG8gZGVudHJvIGRlIHVuYSBvcG9ydHVuaWRhZCcsXG4gICAgZmllbGRzOiB7XG4gICAgICBjcm1fb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdPcG9ydHVuaWRhZCcgfSxcbiAgICAgIGNybV9wcm9kdWN0OiB7IGxhYmVsOiAnUHJvZHVjdG8nIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXBjaVx1MDBGM24nIH0sXG4gICAgICBxdWFudGl0eTogeyBsYWJlbDogJ0NhbnRpZGFkJyB9LFxuICAgICAgbGlzdF9wcmljZTogeyBsYWJlbDogJ1ByZWNpbyBkZSBMaXN0YScsIGhlbHA6ICdTZSByZWxsZW5hIGF1dG9tXHUwMEUxdGljYW1lbnRlIGRlc2RlIGVsIFByZWNpbyBkZSBMaXN0YSBkZWwgcHJvZHVjdG8uJyB9LFxuICAgICAgdW5pdF9wcmljZTogeyBsYWJlbDogJ1ByZWNpbyBkZSBWZW50YScsIGhlbHA6ICdQcmVjaW8gdW5pdGFyaW8gbmVnb2NpYWRvIChwdWVkZSBkaWZlcmlyIGRlbCBwcmVjaW8gZGUgbGlzdGEpJyB9LFxuICAgICAgZGlzY291bnQ6IHsgbGFiZWw6ICdEZXNjdWVudG8gKCUpJyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdUb3RhbCcgfSxcbiAgICAgIGxpbmVfbnVtYmVyOiB7IGxhYmVsOiAnTlx1MDBCQSBkZSBMXHUwMEVEbmVhJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0xcdTAwRURuZWEnIH0sXG4gICAgICBwcmljaW5nOiB7IGxhYmVsOiAnUHJlY2lvcycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fZm9yZWNhc3Q6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIHBlcmlvZF9lbmRfYWZ0ZXJfc3RhcnQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0VsIGZpbiBkZWwgcGVyaW9kbyBkZWJlIHNlciBwb3N0ZXJpb3IgYSBzdSBpbmljaW8uJyxcbiAgICAgIH0sXG4gICAgICBwZXJpb2RfZW5kX21hdGNoZXNfY2FsZW5kYXJfcGVyaW9kOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdFbCBmaW4gZGVsIHBlcmlvZG8gZGViZSBzZXIgZWwgXHUwMEZBbHRpbW8gZFx1MDBFRGEgZGVsIHBlcmlvZG86IHAuIGVqLiAyMDI2LTA5LTMwIHBhcmEgdW4gdHJpbWVzdHJlIHF1ZSBlbXBpZXphIGVsIDIwMjYtMDctMDEsIG8gMjAyNi0wOC0zMSBwYXJhIGFnb3N0byBkZSAyMDI2LicsXG4gICAgICB9LFxuICAgICAgcGVyaW9kX3N0YXJ0X2ZpcnN0X29mX3BlcmlvZDoge1xuICAgICAgICBtZXNzYWdlOiAnRWwgaW5pY2lvIGRlbCBwZXJpb2RvIGRlYmUgc2VyIGVsIHByaW1lciBkXHUwMEVEYSBkZWwgcGVyaW9kbzogcC4gZWouIDIwMjYtMDgtMDEgcGFyYSBhZ29zdG8gZGUgMjAyNi4nLFxuICAgICAgfSxcbiAgICAgIHF1YXJ0ZXJfc3RhcnRzX29uX3F1YXJ0ZXJfYm91bmRhcnk6IHtcbiAgICAgICAgbWVzc2FnZTogJ1VuYSBwcmV2aXNpXHUwMEYzbiB0cmltZXN0cmFsIGRlYmUgY29tZW56YXIgZW4gdW4gbFx1MDBFRG1pdGUgZGUgdHJpbWVzdHJlOiAxIGRlIGVuZXJvLCAxIGRlIGFicmlsLCAxIGRlIGp1bGlvIG8gMSBkZSBvY3R1YnJlLicsXG4gICAgICB9LFxuICAgICAgc25hcHNob3RfYW1vdW50c19ub25fbmVnYXRpdmU6IHtcbiAgICAgICAgbWVzc2FnZTogJ0xvcyBpbXBvcnRlcyBkZSBsYSBpbnN0YW50XHUwMEUxbmVhIG5vIHB1ZWRlbiBzZXIgbmVnYXRpdm9zLicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdQcmV2aXNpXHUwMEYzbicsXG4gICAgcGx1cmFsTGFiZWw6ICdQcmV2aXNpb25lcycsXG4gICAgZGVzY3JpcHRpb246ICdJbnN0YW50XHUwMEUxbmVhIHBlcmlcdTAwRjNkaWNhIGRlbCBwaXBlbGluZSBwb3IgcHJvcGlldGFyaW8gcGFyYSBwcmV2aXNpXHUwMEYzbiBkZSBpbmdyZXNvcycsXG4gICAgZmllbGRzOiB7XG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1Byb3BpZXRhcmlvJyB9LFxuICAgICAgcGVyaW9kOiB7IGxhYmVsOiAnUGVyaW9kbycsIG9wdGlvbnM6IHsgbW9udGg6ICdNZXMnLCBxdWFydGVyOiAnVHJpbWVzdHJlJyB9IH0sXG4gICAgICBwZXJpb2Rfc3RhcnQ6IHtcbiAgICAgICAgbGFiZWw6ICdJbmljaW8gZGVsIHBlcmlvZG8nLFxuICAgICAgICBoZWxwOiAnRGViZSBzZXIgZWwgcHJpbWVyIGRcdTAwRURhIGRlbCBwZXJpb2RvIFx1MjAxNCBwLiBlai4gMjAyNi0wOC0wMSBwYXJhIGFnb3N0byBkZSAyMDI2LiBBZGVtXHUwMEUxcywgdW5hIHByZXZpc2lcdTAwRjNuIHRyaW1lc3RyYWwgZGViZSBjb21lbnphciBlbiB1biBsXHUwMEVEbWl0ZSBkZSB0cmltZXN0cmU6IDEgZGUgZW5lcm8sIDEgZGUgYWJyaWwsIDEgZGUganVsaW8gbyAxIGRlIG9jdHVicmUuJyxcbiAgICAgIH0sXG4gICAgICBwZXJpb2RfZW5kOiB7XG4gICAgICAgIGxhYmVsOiAnRmluIGRlbCBwZXJpb2RvJyxcbiAgICAgICAgaGVscDogJ05vcm1hbG1lbnRlIHNlIGNhbGN1bGEgYXV0b21cdTAwRTF0aWNhbWVudGUgYSBwYXJ0aXIgZGUgUGVyaW9kbyBlIEluaWNpbyBkZWwgcGVyaW9kby4gU2kgc2UgaW50cm9kdWNlIGEgbWFubywgZGViZSBzZXIgZWwgXHUwMEZBbHRpbW8gZFx1MDBFRGEgZGUgZXNlIHBlcmlvZG8gXHUyMDE0IHAuIGVqLiAyMDI2LTA5LTMwIHBhcmEgdW4gdHJpbWVzdHJlIHF1ZSBlbXBpZXphIGVsIDIwMjYtMDctMDEsIG8gMjAyNi0wOC0zMSBwYXJhIGFnb3N0byBkZSAyMDI2LicsXG4gICAgICB9LFxuICAgICAgcGVyaW9kX2xhYmVsOiB7IGxhYmVsOiAnUGVyaW9kbycsIGhlbHA6ICdFdGlxdWV0YSBsZWdpYmxlLCBwLiBlai4gXHUwMEFCVDMgMjAyNlx1MDBCQiBvIFx1MDBBQkFnbyAyMDI2XHUwMEJCLicgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdUXHUwMEVEdHVsbyBNb3N0cmFkbycgfSxcbiAgICAgIHNuYXBzaG90X2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBkZSBpbnN0YW50XHUwMEUxbmVhJywgaGVscDogJ0VsIGRcdTAwRURhIGVuIHF1ZSBzZSBjYXB0dXJcdTAwRjMgZXN0YSBpbnN0YW50XHUwMEUxbmVhLicgfSxcbiAgICAgIHNvdXJjZToge1xuICAgICAgICBsYWJlbDogJ09yaWdlbicsXG4gICAgICAgIG9wdGlvbnM6IHsgc2NoZWR1bGVkOiAnSW5zdGFudFx1MDBFMW5lYSBwcm9ncmFtYWRhJywgYWk6ICdTa2lsbCBkZSBJQScsIG1hbnVhbDogJ0VudHJhZGEgbWFudWFsJyB9LFxuICAgICAgfSxcbiAgICAgIHF1b3RhOiB7IGxhYmVsOiAnQ3VvdGEnIH0sXG4gICAgICBwaXBlbGluZV9hbW91bnQ6IHsgbGFiZWw6ICdQaXBlbGluZScsIGhlbHA6ICdTdW1hIGRlIHRvZGFzIGxhcyBvcG9ydHVuaWRhZGVzIGFiaWVydGFzIHF1ZSBjaWVycmFuIGVuIGVzdGUgcGVyaW9kbyAoZW4gY3VhbHF1aWVyIGV0YXBhKS4nIH0sXG4gICAgICBiZXN0X2Nhc2VfYW1vdW50OiB7IGxhYmVsOiAnTWVqb3IgY2FzbycsIGhlbHA6ICdPcG9ydHVuaWRhZGVzIGFiaWVydGFzIGVuIGxhIGNhdGVnb3JcdTAwRURhIGRlIHByb25cdTAwRjNzdGljbyBNZWpvciBjYXNvIG8gQ29tcHJvbWlzby4nIH0sXG4gICAgICBjb21taXRfYW1vdW50OiB7IGxhYmVsOiAnQ29tcHJvbWlzbycsIGhlbHA6ICdPcG9ydHVuaWRhZGVzIGFiaWVydGFzIGVuIGxhIGNhdGVnb3JcdTAwRURhIGRlIHByb25cdTAwRjNzdGljbyBDb21wcm9taXNvIChjb21wcm9tZXRpZGFzIHBvciBlbCBwcm9waWV0YXJpbykuJyB9LFxuICAgICAgY2xvc2VkX2Ftb3VudDogeyBsYWJlbDogJ0NlcnJhZG8nLCBoZWxwOiAnSW1wb3J0ZSB5YSBjZXJyYWRvIGdhbmFkbyBlbiBlc3RlIHBlcmlvZG8uJyB9LFxuICAgICAgZXhwZWN0ZWRfYW1vdW50OiB7IGxhYmVsOiAnRXNwZXJhZG8nLCBoZWxwOiAnQ2VycmFkbyArIENvbXByb21pc286IGxvIHF1ZSBlbCBwcm9waWV0YXJpbyBlc3BlcmEgcmF6b25hYmxlbWVudGUgY2VycmFyLicgfSxcbiAgICAgIGF0dGFpbm1lbnRfcGN0OiB7IGxhYmVsOiAnQ3VtcGxpbWllbnRvICUnLCBoZWxwOiAnQ2VycmFkbyBcdTAwRjcgQ3VvdGEgXHUwMEQ3IDEwMC4gTXVlc3RyYSAwICUgaGFzdGEgcXVlIHNlIGZpamEgdW5hIGN1b3RhIHBvc2l0aXZhLicgfSxcbiAgICAgIGNvdmVyYWdlX3JhdGlvOiB7IGxhYmVsOiAnQ29iZXJ0dXJhJywgaGVscDogJ1BpcGVsaW5lIFx1MDBGNyAoQ3VvdGEgXHUyMjEyIENlcnJhZG8pOiBzaSBxdWVkYSBwaXBlbGluZSBzdWZpY2llbnRlIHBhcmEgY3VicmlyIGxhIGRpZmVyZW5jaWEuIE11ZXN0cmEgMCBjdWFuZG8geWEgc2UgaGEgYWxjYW56YWRvIGxhIGN1b3RhLicgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnTm90YXMnIH0sXG4gICAgICBzZWVkX2tleToge1xuICAgICAgICBsYWJlbDogJ0NsYXZlIGRlIHNlbWlsbGEnLFxuICAgICAgICBoZWxwOiAnSWRlbnRpZGFkIGRlbCBqdWVnbyBkZSBkYXRvcyBkZSBkZW1vc3RyYWNpXHUwMEYzbi4gU29sbyBsYSBlc2NyaWJlIGVsIGNhcmdhZG9yIGRlIHNlbWlsbGFzOyBlc3RcdTAwRTEgdmFjXHUwMEVEYSBlbiBjdWFscXVpZXIgaW5zdGFudFx1MDBFMW5lYSByZWFsLicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfZm9yZWNhc3RzOiB7IGxhYmVsOiAnVG9kYXMgbGFzIHByZXZpc2lvbmVzJyB9LFxuICAgICAgdGhpc19xdWFydGVyX2ZvcmVjYXN0czoge1xuICAgICAgICBsYWJlbDogJ0VzdGUgdHJpbWVzdHJlJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnQVx1MDBGQW4gbm8gaGF5IGluc3RhbnRcdTAwRTFuZWFzIGRlIGVzdGUgdHJpbWVzdHJlJyxcbiAgICAgICAgICBtZXNzYWdlOiAnTGFzIGluc3RhbnRcdTAwRTFuZWFzIHRyaW1lc3RyYWxlcyBsYXMgZXNjcmliZSBlbCBiYXJyaWRvIG5vY3R1cm5vIGRlIHByZXZpc2lvbmVzLiBIYXN0YSBxdWUgc2UgZWplY3V0ZSB1bmEgdmV6IHBhcmEgZWwgdHJpbWVzdHJlIGFjdHVhbCwgZXN0YSB2aXN0YSBlc3RcdTAwRTEgdmFjXHUwMEVEYTsgbG9zIHRyaW1lc3RyZXMgY2VycmFkb3MgZXN0XHUwMEUxbiBlbiBsYSBwZXN0YVx1MDBGMWEgVG9kYXMuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBteV9mb3JlY2FzdDogeyBsYWJlbDogJ01pIHByZXZpc2lcdTAwRjNuJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0luc3RhbnRcdTAwRTFuZWEnIH0sXG4gICAgICBhbW91bnRzOiB7IGxhYmVsOiAnSW1wb3J0ZXMnIH0sXG4gICAgICBtZXRhOiB7IGxhYmVsOiAnT3JpZ2VuJyB9LFxuICAgICAgLy8gTm9tYnJlcyBkZSBzZWNjaVx1MDBGM24gZGVsIGZvcm11bGFyaW8gZW4gZm9yZWNhc3Qudmlldy50cyAoIzExMDApXG4gICAgICBzbmFwc2hvdDogeyBsYWJlbDogJ0luc3RhbnRcdTAwRTFuZWEnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ05vdGFzJyB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL29iamVjdHMuY29tbWVyY2UudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy9vYmplY3RzLmNvbW1lcmNlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbi8qKlxuICogRXNwYVx1MDBGMW9sIChlcy1FUykgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBDT01NRVJDRSBmYW1pbHk6XG4gKiB3aGF0IGdldHMgc29sZCBhbmQgb24gd2hhdCBwYXBlciBcdTIwMTQgcXVvdGVzLCBjb250cmFjdHMsIHByb2R1Y3RzLlxuICpcbiAqIFJvc3RlcjogYGNybV9xdW90ZWAsIGBjcm1fcXVvdGVfbGluZV9pdGVtYCwgYGNybV9jb250cmFjdGAsIGBjcm1fcHJvZHVjdGAuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMudHNgLlxuICovXG5leHBvcnQgY29uc3QgY29tbWVyY2U6IFJlY29yZDxzdHJpbmcsIE9iamVjdFRyYW5zbGF0aW9uRGF0YT4gPSB7XG4gIGNybV9xdW90ZToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgZGlzY291bnRfd2l0aGluX2NlaWxpbmc6IHtcbiAgICAgICAgbWVzc2FnZTogJ0VsIGRlc2N1ZW50byBubyBwdWVkZSBzdXBlcmFyIGVsIDYwICUnLFxuICAgICAgfSxcbiAgICAgIGV4cGlyYXRpb25fYWZ0ZXJfcXVvdGU6IHtcbiAgICAgICAgbWVzc2FnZTogJ0xhIGZlY2hhIGRlIHZlbmNpbWllbnRvIGRlYmUgc2VyIHBvc3RlcmlvciBhIGxhIGRlIGxhIGNvdGl6YWNpXHUwMEYzbicsXG4gICAgICB9LFxuICAgICAgcXVvdGVfc3RhdHVzX3Byb2dyZXNzaW9uOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdUcmFuc2ljaVx1MDBGM24gZGUgZXN0YWRvIGRlIGNvdGl6YWNpXHUwMEYzbiBubyB2XHUwMEUxbGlkYScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdDb3RpemFjaVx1MDBGM24nLFxuICAgIHBsdXJhbExhYmVsOiAnQ290aXphY2lvbmVzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NvdGl6YWNpb25lcyBkZSBwcmVjaW9zIHBhcmEgY2xpZW50ZXMnLFxuICAgIGZpZWxkczoge1xuICAgICAgcXVvdGVfbnVtYmVyOiB7IGxhYmVsOiAnTlx1MDBGQW1lcm8gZGUgQ290aXphY2lcdTAwRjNuJyB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ1RcdTAwRUR0dWxvIE1vc3RyYWRvJyB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ05vbWJyZSBkZSBDb3RpemFjaVx1MDBGM24nIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ0N1ZW50YScgfSxcbiAgICAgIGNybV9jb250YWN0OiB7XG4gICAgICAgIGxhYmVsOiAnQ29udGFjdG8nLFxuICAgICAgICBoZWxwOiAnT2JsaWdhdG9yaW8gZW4gY3VhbnRvIGxhIGNvdGl6YWNpXHUwMEYzbiBwYXNhIGEgUHJlc2VudGFkYSBvIEFjZXB0YWRhOiBlbCBjb250cmF0byBnZW5lcmFkbyB0b21hIGRlIGFxdVx1MDBFRCBzdSBDb250YWN0byBwcmluY2lwYWwuJyxcbiAgICAgIH0sXG4gICAgICBjcm1fb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdPcG9ydHVuaWRhZCcgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnUHJvcGlldGFyaW8gZGUgQ290aXphY2lcdTAwRjNuJyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnRXN0YWRvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGRyYWZ0OiAnQm9ycmFkb3InLCBpbl9yZXZpZXc6ICdFbiBSZXZpc2lcdTAwRjNuJywgcHJlc2VudGVkOiAnUHJlc2VudGFkYScsXG4gICAgICAgICAgYWNjZXB0ZWQ6ICdBY2VwdGFkYScsIHJlamVjdGVkOiAnUmVjaGF6YWRhJywgZXhwaXJlZDogJ0V4cGlyYWRhJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBxdW90ZV9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgQ290aXphY2lcdTAwRjNuJyB9LFxuICAgICAgZXhwaXJhdGlvbl9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgRXhwaXJhY2lcdTAwRjNuJyB9LFxuICAgICAgc3VidG90YWw6IHsgbGFiZWw6ICdTdWJ0b3RhbCcgfSxcbiAgICAgIGRpc2NvdW50OiB7IGxhYmVsOiAnRGVzY3VlbnRvICUnIH0sXG4gICAgICBkaXNjb3VudF9hbW91bnQ6IHsgbGFiZWw6ICdNb250byBkZSBEZXNjdWVudG8nIH0sXG4gICAgICB0YXg6IHsgbGFiZWw6ICdJbXB1ZXN0bycgfSxcbiAgICAgIHNoaXBwaW5nX2hhbmRsaW5nOiB7IGxhYmVsOiAnRW52XHUwMEVEbyB5IE1hbmlwdWxhY2lcdTAwRjNuJyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdQcmVjaW8gVG90YWwnIH0sXG4gICAgICAvLyBNaXNtbyBqdWVnbyBkZSB2YWxvcmVzIHF1ZSBgY3JtX2NvbnRyYWN0LnBheW1lbnRfdGVybXNgIFx1MjAxNCB0cmFkXHUwMEZBemNhbnNlIGlndWFsLlxuICAgICAgcGF5bWVudF90ZXJtczoge1xuICAgICAgICBsYWJlbDogJ1RcdTAwRTlybWlub3MgZGUgUGFnbycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBuZXRfMTU6ICdOZXRvIDE1JywgbmV0XzMwOiAnTmV0byAzMCcsIG5ldF82MDogJ05ldG8gNjAnLCBuZXRfOTA6ICdOZXRvIDkwJyxcbiAgICAgICAgICBkdWVfb25fcmVjZWlwdDogJ1BhZ28gYSBsYSBSZWNlcGNpXHUwMEYzbicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc2hpcHBpbmdfdGVybXM6IHsgbGFiZWw6ICdUXHUwMEU5cm1pbm9zIGRlIEVudlx1MDBFRG8nIH0sXG4gICAgICBiaWxsaW5nX2FkZHJlc3M6IHsgbGFiZWw6ICdEaXJlY2NpXHUwMEYzbiBkZSBGYWN0dXJhY2lcdTAwRjNuJyB9LFxuICAgICAgc2hpcHBpbmdfYWRkcmVzczogeyBsYWJlbDogJ0RpcmVjY2lcdTAwRjNuIGRlIEVudlx1MDBFRG8nIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXBjaVx1MDBGM24nIH0sXG4gICAgICBpbnRlcm5hbF9ub3RlczogeyBsYWJlbDogJ05vdGFzIEludGVybmFzJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfcXVvdGVzOiB7IGxhYmVsOiAnVG9kYXMgbGFzIENvdGl6YWNpb25lcycgfSxcbiAgICAgIHF1b3RlX3BpcGVsaW5lOiB7IGxhYmVsOiAnUGlwZWxpbmUgZGUgQ290aXphY2lvbmVzJyB9LFxuICAgICAgcXVvdGVfY2FsZW5kYXI6IHsgbGFiZWw6ICdDYWxlbmRhcmlvIGRlIENvdGl6YWNpb25lcycgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlIGxhIENvdGl6YWNpXHUwMEYzbicgfSxcbiAgICAgIHByaWNpbmc6IHsgbGFiZWw6ICdQcmVjaW9zJyB9LFxuICAgICAgdGVybXM6IHsgbGFiZWw6ICdUXHUwMEU5cm1pbm9zIHkgVmlnZW5jaWEnIH0sXG4gICAgICBhZGRyZXNzOiB7IGxhYmVsOiAnRGlyZWNjaW9uZXMnIH0sXG4gICAgICBzeXN0ZW06IHsgbGFiZWw6ICdTaXN0ZW1hJyB9LFxuICAgICAgLy8gTm9tYnJlcyBkZSBzZWNjaVx1MDBGM24gZGVsIGZvcm11bGFyaW8gZW4gcXVvdGUudmlldy50cyAoIzExMDApXG4gICAgICBxdW90ZTogeyBsYWJlbDogJ0NvdGl6YWNpXHUwMEYzbicgfSxcbiAgICAgIHRvdGFsczogeyBsYWJlbDogJ1RvdGFsZXMnIH0sXG4gICAgICBxdW90ZV90ZXJtczogeyBsYWJlbDogJ1RcdTAwRTlybWlub3MnIH0sXG4gICAgICBhZGRyZXNzZXNfYW5kX25vdGVzOiB7IGxhYmVsOiAnRGlyZWNjaW9uZXMgeSBOb3RhcycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fcXVvdGVfbGluZV9pdGVtOiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBkaXNjb3VudF93aXRoaW5fY2VpbGluZzoge1xuICAgICAgICBtZXNzYWdlOiAnRWwgZGVzY3VlbnRvIGRlIGxcdTAwRURuZWEgbm8gcHVlZGUgc3VwZXJhciBlbCA2MCAlJyxcbiAgICAgIH0sXG4gICAgICB1bml0X3ByaWNlX3Bvc2l0aXZlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdFbCBwcmVjaW8gZGUgdmVudGEgbm8gcHVlZGUgc2VyIG5lZ2F0aXZvJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ0xcdTAwRURuZWEgZGUgQ290aXphY2lcdTAwRjNuJyxcbiAgICBwbHVyYWxMYWJlbDogJ0xcdTAwRURuZWFzIGRlIENvdGl6YWNpXHUwMEYzbicsXG4gICAgZGVzY3JpcHRpb246ICdMXHUwMEVEbmVhcyBkZSBwcmVjaW8gcG9yIHByb2R1Y3RvIGRlbnRybyBkZSB1bmEgY290aXphY2lcdTAwRjNuJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNybV9xdW90ZTogeyBsYWJlbDogJ0NvdGl6YWNpXHUwMEYzbicgfSxcbiAgICAgIGNybV9wcm9kdWN0OiB7IGxhYmVsOiAnUHJvZHVjdG8nIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXBjaVx1MDBGM24nIH0sXG4gICAgICBxdWFudGl0eTogeyBsYWJlbDogJ0NhbnRpZGFkJyB9LFxuICAgICAgbGlzdF9wcmljZTogeyBsYWJlbDogJ1ByZWNpbyBkZSBMaXN0YScgfSxcbiAgICAgIHVuaXRfcHJpY2U6IHsgbGFiZWw6ICdQcmVjaW8gZGUgVmVudGEnIH0sXG4gICAgICBkaXNjb3VudDogeyBsYWJlbDogJ0Rlc2N1ZW50byAoJSknIH0sXG4gICAgICBzdWJ0b3RhbDogeyBsYWJlbDogJ1N1YnRvdGFsJyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdUb3RhbCcgfSxcbiAgICAgIGxpbmVfbnVtYmVyOiB7IGxhYmVsOiAnTlx1MDBCQSBkZSBMXHUwMEVEbmVhJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0xcdTAwRURuZWEnIH0sXG4gICAgICBwcmljaW5nOiB7IGxhYmVsOiAnUHJlY2lvcycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fY29udHJhY3Q6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGVuZF9hZnRlcl9zdGFydDoge1xuICAgICAgICBtZXNzYWdlOiAnTGEgZmVjaGEgZGUgZmluIGRlYmUgc2VyIHBvc3RlcmlvciBhIGxhIGRlIGluaWNpbycsXG4gICAgICB9LFxuICAgICAgY29udHJhY3Rfc3RhdHVzX3Byb2dyZXNzaW9uOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdUcmFuc2ljaVx1MDBGM24gZGUgZXN0YWRvIGRlIGNvbnRyYXRvIG5vIHZcdTAwRTFsaWRhJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ0NvbnRyYXRvJyxcbiAgICBwbHVyYWxMYWJlbDogJ0NvbnRyYXRvcycsXG4gICAgZGVzY3JpcHRpb246ICdDb250cmF0b3MgeSBhY3VlcmRvcyBsZWdhbGVzJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNvbnRyYWN0X251bWJlcjogeyBsYWJlbDogJ05cdTAwRkFtZXJvIGRlIENvbnRyYXRvJyB9LFxuICAgICAgY3JtX2FjY291bnQ6IHsgbGFiZWw6ICdDdWVudGEnIH0sXG4gICAgICBjcm1fY29udGFjdDogeyBsYWJlbDogJ0NvbnRhY3RvIFByaW5jaXBhbCcgfSxcbiAgICAgIGNybV9vcHBvcnR1bml0eTogeyBsYWJlbDogJ09wb3J0dW5pZGFkIFJlbGFjaW9uYWRhJyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdQcm9waWV0YXJpbyBkZWwgQ29udHJhdG8nIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdFc3RhZG8nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZHJhZnQ6ICdCb3JyYWRvcicsIGluX2FwcHJvdmFsOiAnRW4gQXByb2JhY2lcdTAwRjNuJywgYWN0aXZhdGVkOiAnQWN0aXZhZG8nLFxuICAgICAgICAgIGV4cGlyZWQ6ICdFeHBpcmFkbycsIHRlcm1pbmF0ZWQ6ICdSZXNjaW5kaWRvJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjb250cmFjdF90ZXJtX21vbnRoczogeyBsYWJlbDogJ1BsYXpvIGRlbCBDb250cmF0byAoTWVzZXMpJyB9LFxuICAgICAgc3RhcnRfZGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIEluaWNpbycgfSxcbiAgICAgIGVuZF9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgRmluJyB9LFxuICAgICAgY29udHJhY3RfdmFsdWU6IHsgbGFiZWw6ICdWYWxvciBkZWwgQ29udHJhdG8nIH0sXG4gICAgICBiaWxsaW5nX2ZyZXF1ZW5jeToge1xuICAgICAgICBsYWJlbDogJ0ZyZWN1ZW5jaWEgZGUgRmFjdHVyYWNpXHUwMEYzbicsXG4gICAgICAgIG9wdGlvbnM6IHsgbW9udGhseTogJ01lbnN1YWwnLCBxdWFydGVybHk6ICdUcmltZXN0cmFsJywgYW5udWFsbHk6ICdBbnVhbCcsIG9uZV90aW1lOiAnUGFnbyBcdTAwREFuaWNvJyB9LFxuICAgICAgfSxcbiAgICAgIC8vIE1pc21vIGp1ZWdvIGRlIHZhbG9yZXMgcXVlIGBjcm1fcXVvdGUucGF5bWVudF90ZXJtc2AgXHUyMDE0IHRyYWRcdTAwRkF6Y2Fuc2UgaWd1YWwuXG4gICAgICBwYXltZW50X3Rlcm1zOiB7XG4gICAgICAgIGxhYmVsOiAnVFx1MDBFOXJtaW5vcyBkZSBQYWdvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ldF8xNTogJ05ldG8gMTUnLCBuZXRfMzA6ICdOZXRvIDMwJywgbmV0XzYwOiAnTmV0byA2MCcsIG5ldF85MDogJ05ldG8gOTAnLFxuICAgICAgICAgIGR1ZV9vbl9yZWNlaXB0OiAnUGFnbyBhIGxhIFJlY2VwY2lcdTAwRjNuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhdXRvX3JlbmV3YWw6IHsgbGFiZWw6ICdSZW5vdmFjaVx1MDBGM24gQXV0b21cdTAwRTF0aWNhJyB9LFxuICAgICAgcmVuZXdhbF9ub3RpY2VfZGF5czogeyBsYWJlbDogJ0F2aXNvIGRlIFJlbm92YWNpXHUwMEYzbiAoRFx1MDBFRGFzKScgfSxcbiAgICAgIGNvbnRyYWN0X3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvIGRlIENvbnRyYXRvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbjogJ1N1c2NyaXBjaVx1MDBGM24nLCBzZXJ2aWNlOiAnQWN1ZXJkbyBkZSBTZXJ2aWNpbycsIGxpY2Vuc2U6ICdMaWNlbmNpYScsXG4gICAgICAgICAgcGFydG5lcnNoaXA6ICdBc29jaWFjaVx1MDBGM24nLCBuZGE6ICdBY3VlcmRvIGRlIENvbmZpZGVuY2lhbGlkYWQgKE5EQSknLFxuICAgICAgICAgIG1zYTogJ0FjdWVyZG8gTWFyY28gZGUgU2VydmljaW9zIChNU0EpJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzaWduZWRfZGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIEZpcm1hJyB9LFxuICAgICAgc2lnbmVkX2J5OiB7IGxhYmVsOiAnRmlybWFkbyBQb3InIH0sXG4gICAgICBkb2N1bWVudF91cmw6IHsgbGFiZWw6ICdEb2N1bWVudG8gZGUgQ29udHJhdG8nIH0sXG4gICAgICBzcGVjaWFsX3Rlcm1zOiB7IGxhYmVsOiAnVFx1MDBFOXJtaW5vcyBFc3BlY2lhbGVzJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwY2lcdTAwRjNuJyB9LFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnRGlyZWNjaVx1MDBGM24gZGUgRmFjdHVyYWNpXHUwMEYzbicgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2NvbnRyYWN0czogeyBsYWJlbDogJ1RvZG9zIGxvcyBDb250cmF0b3MnIH0sXG4gICAgICByZW5ld2FsX2NhbGVuZGFyOiB7IGxhYmVsOiAnQ2FsZW5kYXJpbyBkZSBSZW5vdmFjaVx1MDBGM24nIH0sXG4gICAgICBjb250cmFjdF9nYW50dDogeyBsYWJlbDogJ1BsYXpvcyBkZWwgQ29udHJhdG8nIH0sXG4gICAgICBjb250cmFjdF90aW1lbGluZTogeyBsYWJlbDogJ0xcdTAwRURuZWEgZGUgVGllbXBvJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gZGVsIENvbnRyYXRvJyB9LFxuICAgICAgcGFydGllczogeyBsYWJlbDogJ1BhcnRlcycgfSxcbiAgICAgIHRlcm1zOiB7IGxhYmVsOiAnVFx1MDBFOXJtaW5vcyB5IEZlY2hhcycgfSxcbiAgICAgIHZhbHVlOiB7IGxhYmVsOiAnVmFsb3IgZGVsIENvbnRyYXRvJyB9LFxuICAgICAgc3RhdHVzOiB7IGxhYmVsOiAnRXN0YWRvIHkgQXByb2JhY2lcdTAwRjNuJyB9LFxuICAgICAgcmVuZXdhbDogeyBsYWJlbDogJ1Jlbm92YWNpXHUwMEYzbicgfSxcbiAgICAgIC8vIE5vbWJyZXMgZGUgc2VjY2lcdTAwRjNuIGRlbCBmb3JtdWxhcmlvIGVuIGNvbnRyYWN0LnZpZXcudHMgKCMxMTAwKVxuICAgICAgY29udHJhY3RfdGVybXM6IHsgbGFiZWw6ICdUXHUwMEU5cm1pbm9zJyB9LFxuICAgICAgc2lnbmluZ19hbmRfZG9jdW1lbnRzOiB7IGxhYmVsOiAnRmlybWEgeSBEb2N1bWVudG9zJyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdOb3RhcycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fcHJvZHVjdDoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgY29zdF9sZXNzX3RoYW5fcHJpY2U6IHtcbiAgICAgICAgbWVzc2FnZTogJ0VsIGNvc3RlIGRlYmVyXHUwMEVEYSBzZXIgaW5mZXJpb3IgYWwgcHJlY2lvIGRlIGxpc3RhJyxcbiAgICAgIH0sXG4gICAgICBwcmljZV9wb3NpdGl2ZToge1xuICAgICAgICBtZXNzYWdlOiAnRWwgcHJlY2lvIGRlIGxpc3RhIGRlYmUgc2VyIHBvc2l0aXZvJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1Byb2R1Y3RvJyxcbiAgICBwbHVyYWxMYWJlbDogJ1Byb2R1Y3RvcycsXG4gICAgZGVzY3JpcHRpb246ICdQcm9kdWN0b3MgeSBzZXJ2aWNpb3MgcXVlIG9mcmVjZSBsYSBlbXByZXNhJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIHByb2R1Y3RfY29kZTogeyBsYWJlbDogJ0NcdTAwRjNkaWdvIGRlIFByb2R1Y3RvJyB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ1RcdTAwRUR0dWxvIE1vc3RyYWRvJyB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ05vbWJyZSBkZSBQcm9kdWN0bycgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcGNpXHUwMEYzbicgfSxcbiAgICAgIGNhdGVnb3J5OiB7XG4gICAgICAgIGxhYmVsOiAnQ2F0ZWdvclx1MDBFRGEnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgc29mdHdhcmU6ICdTb2Z0d2FyZScsIGhhcmR3YXJlOiAnSGFyZHdhcmUnLCBzZXJ2aWNlOiAnU2VydmljaW8nLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbjogJ1N1c2NyaXBjaVx1MDBGM24nLCBzdXBwb3J0OiAnU29wb3J0ZScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZmFtaWx5OiB7XG4gICAgICAgIGxhYmVsOiAnRmFtaWxpYSBkZSBQcm9kdWN0bycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBlbnRlcnByaXNlOiAnU29sdWNpb25lcyBwYXJhIEdyYW4gRW1wcmVzYScsIHNtYjogJ1NvbHVjaW9uZXMgcGFyYSBQWU1FcycsXG4gICAgICAgICAgc2VydmljZXM6ICdTZXJ2aWNpb3MgUHJvZmVzaW9uYWxlcycsIGNsb3VkOiAnU2VydmljaW9zIGVuIGxhIE51YmUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxpc3RfcHJpY2U6IHsgbGFiZWw6ICdQcmVjaW8gZGUgTGlzdGEnIH0sXG4gICAgICBjb3N0OiB7IGxhYmVsOiAnQ29zdG8nIH0sXG4gICAgICBza3U6IHsgbGFiZWw6ICdTS1UnIH0sXG4gICAgICBpc19hY3RpdmU6IHsgbGFiZWw6ICdBY3Rpdm8nIH0sXG4gICAgICBwcm9kdWN0X21hbmFnZXI6IHsgbGFiZWw6ICdHZXJlbnRlIGRlIFByb2R1Y3RvJyB9LFxuICAgICAgaW1hZ2U6IHsgbGFiZWw6ICdJbWFnZW4gZGUgUHJvZHVjdG8nIH0sXG4gICAgICBkYXRhc2hlZXQ6IHsgbGFiZWw6ICdGaWNoYSBUXHUwMEU5Y25pY2EnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9wcm9kdWN0czogeyBsYWJlbDogJ1RvZG9zIGxvcyBQcm9kdWN0b3MnIH0sXG4gICAgICBwcm9kdWN0X2NhdGFsb2c6IHsgbGFiZWw6ICdDYXRcdTAwRTFsb2dvIGRlIFByb2R1Y3RvcycgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlbCBQcm9kdWN0bycgfSxcbiAgICAgIHByaWNpbmc6IHsgbGFiZWw6ICdQcmVjaW9zJyB9LFxuICAgICAgbWV0YWRhdGE6IHsgbGFiZWw6ICdSZWN1cnNvcycgfSxcbiAgICAgIC8vIE5vbWJyZXMgZGUgc2VjY2lcdTAwRjNuIGRlbCBmb3JtdWxhcmlvIGVuIHByb2R1Y3Qudmlldy50cyAoIzExMDApXG4gICAgICBwcm9kdWN0X2luZm86IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlbCBQcm9kdWN0bycgfSxcbiAgICAgIHByaWNpbmdfaW5mbzogeyBsYWJlbDogJ1ByZWNpb3MnIH0sXG4gICAgICBtZWRpYTogeyBsYWJlbDogJ011bHRpbWVkaWEnIH0sXG4gICAgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvb2JqZWN0cy5zZXJ2aWNlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FU1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvb2JqZWN0cy5zZXJ2aWNlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IGFjdGl2aXR5QWN0aW9ucyB9IGZyb20gJy4vX3NoYXJlZCc7XG5cbi8qKlxuICogRXNwYVx1MDBGMW9sIChlcy1FUykgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBTRVJWSUNFIGZhbWlseTpcbiAqIHBvc3Qtc2FsZSBzdXBwb3J0IFx1MjAxNCBjYXNlcyBhbmQgdGhlIGtub3dsZWRnZSB0aGF0IGRlZmxlY3RzIHRoZW0uXG4gKlxuICogUm9zdGVyOiBgY3JtX2Nhc2VgLCBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCwgYGNybV9hcnRpY2xlX2ZlZWRiYWNrYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXJ2aWNlOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fY2FzZToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgcmVzb2x1dGlvbl9yZXF1aXJlZF9mb3JfY2xvc2VkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdMYSByZXNvbHVjaVx1MDBGM24gZXMgb2JsaWdhdG9yaWEgYWwgY2VycmFyIHVuIGNhc28nLFxuICAgICAgfSxcbiAgICAgIGVzY2FsYXRpb25fcmVhc29uX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdFbCBtb3Rpdm8gZGUgZXNjYWxhZG8gZXMgb2JsaWdhdG9yaW8gYWwgZXNjYWxhciB1biBjYXNvJyxcbiAgICAgIH0sXG4gICAgICBjYXNlX3N0YXR1c19wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnVHJhbnNpY2lcdTAwRjNuIGRlIGVzdGFkbyBubyB2XHUwMEUxbGlkYScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdDYXNvJyxcbiAgICBwbHVyYWxMYWJlbDogJ0Nhc29zJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Nhc29zIGRlIHNvcG9ydGUgeSBzb2xpY2l0dWRlcyBkZSBzZXJ2aWNpbyBkZSBjbGllbnRlcycsXG4gICAgZmllbGRzOiB7XG4gICAgICBjYXNlX251bWJlcjogeyBsYWJlbDogJ05cdTAwRkFtZXJvIGRlIENhc28nIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnVFx1MDBFRHR1bG8gTW9zdHJhZG8nIH0sXG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnQXN1bnRvJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwY2lcdTAwRjNuJyB9LFxuICAgICAgY3JtX2FjY291bnQ6IHsgbGFiZWw6ICdDdWVudGEnIH0sXG4gICAgICBjcm1fY29udGFjdDogeyBsYWJlbDogJ0NvbnRhY3RvJyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnRXN0YWRvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ldzogJ051ZXZvJywgaW5fcHJvZ3Jlc3M6ICdFbiBDdXJzbycsXG4gICAgICAgICAgd2FpdGluZ19jdXN0b21lcjogJ0VzcGVyYW5kbyBhbCBDbGllbnRlJywgd2FpdGluZ19zdXBwb3J0OiAnRXNwZXJhbmRvIGEgU29wb3J0ZScsXG4gICAgICAgICAgZXNjYWxhdGVkOiAnRXNjYWxhZG8nLCByZXNvbHZlZDogJ1Jlc3VlbHRvJywgY2xvc2VkOiAnQ2VycmFkbycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcHJpb3JpdHk6IHtcbiAgICAgICAgbGFiZWw6ICdQcmlvcmlkYWQnLFxuICAgICAgICBvcHRpb25zOiB7IGxvdzogJ0JhamEnLCBtZWRpdW06ICdNZWRpYScsIGhpZ2g6ICdBbHRhJywgY3JpdGljYWw6ICdDclx1MDBFRHRpY2EnIH0sXG4gICAgICB9LFxuICAgICAgcHJpb3JpdHlfcmFuazogeyBsYWJlbDogJ1JhbmdvIGRlIFByaW9yaWRhZCcgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvIGRlIENhc28nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcXVlc3Rpb246ICdDb25zdWx0YScsIHByb2JsZW06ICdQcm9ibGVtYScsXG4gICAgICAgICAgZmVhdHVyZV9yZXF1ZXN0OiAnU29saWNpdHVkIGRlIEZ1bmNpb25hbGlkYWQnLCBidWc6ICdFcnJvcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLy8gYGVtYWlsYCB5IGBjaGF0YCBzZSBkZWphbiBjb21vIHByXHUwMEU5c3RhbW9zOiBzb24gZWwgdFx1MDBFOXJtaW5vIGhhYml0dWFsIGVuXG4gICAgICAvLyBlc3BhXHUwMEYxb2wgZGUgbmVnb2Npb3MgeSBjb25jdWVyZGFuIGNvbiBgY3JtX2NhbXBhaWduLmNoYW5uZWxgLlxuICAgICAgb3JpZ2luOiB7XG4gICAgICAgIGxhYmVsOiAnT3JpZ2VuIGRlbCBDYXNvJyxcbiAgICAgICAgb3B0aW9uczogeyBlbWFpbDogJ0VtYWlsJywgcGhvbmU6ICdUZWxcdTAwRTlmb25vJywgd2ViOiAnV2ViJywgY2hhdDogJ0NoYXQnLCBzb2NpYWxfbWVkaWE6ICdSZWRlcyBTb2NpYWxlcycgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1Byb3BpZXRhcmlvIGRlbCBDYXNvJyB9LFxuICAgICAgY2xvc2VkX2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBkZSBDaWVycmUnIH0sXG4gICAgICBmaXJzdF9yZXNwb25zZV9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgUHJpbWVyYSBSZXNwdWVzdGEnIH0sXG4gICAgICByZXNvbHV0aW9uX3RpbWVfaG91cnM6IHsgbGFiZWw6ICdUaWVtcG8gZGUgUmVzb2x1Y2lcdTAwRjNuIChIb3JhcyknIH0sXG4gICAgICBzbGFfZHVlX2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBMXHUwMEVEbWl0ZSBTTEEnLCBoZWxwOiAnU2UgZmlqYSBzZWdcdTAwRkFuIGxhIHByaW9yaWRhZCBkZWwgY2FzbyB5IGVsIE5pdmVsIGRlIENsaWVudGUgZGUgbGEgY3VlbnRhLCBlbiBob3JhcyBuYXR1cmFsZXM6IGxhcyBub2NoZXMsIGxvcyBmaW5lcyBkZSBzZW1hbmEgeSBsb3MgZmVzdGl2b3MgY3VlbnRhbi4nIH0sXG4gICAgICBpc19zbGFfdmlvbGF0ZWQ6IHsgbGFiZWw6ICdTTEEgSW5jdW1wbGlkbycgfSxcbiAgICAgIGlzX2VzY2FsYXRlZDogeyBsYWJlbDogJ0VzY2FsYWRvJyB9LFxuICAgICAgZXNjYWxhdGVkX2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBkZSBFc2NhbGFjaVx1MDBGM24nIH0sXG4gICAgICBlc2NhbGF0aW9uX3JlYXNvbjogeyBsYWJlbDogJ01vdGl2byBkZSBFc2NhbGFjaVx1MDBGM24nIH0sXG4gICAgICByZXNvbHV0aW9uOiB7IGxhYmVsOiAnUmVzb2x1Y2lcdTAwRjNuJyB9LFxuICAgICAgcmVzb2x2ZWRfYnlfYXJ0aWNsZTogeyBsYWJlbDogJ1Jlc3VlbHRvIHBvciBBcnRcdTAwRURjdWxvJywgaGVscDogJ0FydFx1MDBFRGN1bG8gZGUgbGEgYmFzZSBkZSBjb25vY2ltaWVudG8gcXVlIHJlc29sdmlcdTAwRjMgZXN0ZSBjYXNvIFx1MjAxNCBsYSBzZVx1MDBGMWFsIGRlIGRlc3ZcdTAwRURvLicgfSxcbiAgICAgIGludGVybmFsX25vdGVzOiB7IGxhYmVsOiAnTm90YXMgSW50ZXJuYXMnLCBoZWxwOiAnTm90YXMgaW50ZXJuYXMgbm8gdmlzaWJsZXMgcGFyYSBlbCBjbGllbnRlJyB9LFxuICAgICAgaXNfY2xvc2VkOiB7IGxhYmVsOiAnRXN0XHUwMEUxIENlcnJhZG8nIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9jYXNlczogeyBsYWJlbDogJ1RvZG9zIGxvcyBDYXNvcycgfSxcbiAgICAgIGNhc2Vfd29ya2Zsb3c6IHsgbGFiZWw6ICdGbHVqbyBkZSBTZXJ2aWNpbycgfSxcbiAgICAgIHNsYV9jYWxlbmRhcjogeyBsYWJlbDogJ0NhbGVuZGFyaW8gU0xBJyB9LFxuICAgICAgY2FzZV90aW1lbGluZTogeyBsYWJlbDogJ0xcdTAwRURuZWEgZGUgVGllbXBvIGRlIENhc29zJyB9LFxuICAgICAgdW5hc3NpZ25lZF90cmlhZ2U6IHtcbiAgICAgICAgbGFiZWw6ICdTaW4gYXNpZ25hciBcdTIwMTQgdHJpYWplJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnTmFkYSBwZW5kaWVudGUgZGUgdHJpYWplJyxcbiAgICAgICAgICBtZXNzYWdlOiAnVG9kb3MgbG9zIGNhc29zIHRpZW5lbiBwcm9waWV0YXJpby4gTG9zIGNhc29zIGFwYXJlY2VuIGFxdVx1MDBFRCBjdWFuZG8gbGxlZ2FuIHNpbiBwcm9waWV0YXJpbyBcdTIwMTQgbm9ybWFsbWVudGUgdW4gZW52XHUwMEVEbyB3ZWItYS1jYXNvIHJlY2liaWRvIG1pZW50cmFzIG5hZGllIG9jdXBhYmEgZWwgcHVlc3RvIGRlIEFnZW50ZSBkZSBTZXJ2aWNpby4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGVzY2FsYXRlZF9jYXNlczogeyBsYWJlbDogJ0Nhc29zIEVzY2FsYWRvcycgfSxcbiAgICAgIG15X29wZW5fY2FzZXM6IHsgbGFiZWw6ICdNaXMgQ2Fzb3MgQWJpZXJ0b3MnIH0sXG4gICAgICBzbGFfYXRfcmlzazogeyBsYWJlbDogJ1x1MjNGMCBTTEEgZW4gUmllc2dvJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICAvLyBOb21icmVzIGRlIHNlY2NpXHUwMEYzbiBkZWwgZm9ybXVsYXJpbyBlbiBjYXNlLnZpZXcudHMgKCMxMTAwKS5cbiAgICAgIGNhc2U6IHsgbGFiZWw6ICdDYXNvJyB9LFxuICAgICAgaG93X2Nhbl93ZV9oZWxwOiB7IGxhYmVsOiAnXHUwMEJGQ1x1MDBGM21vIHBvZGVtb3MgYXl1ZGFydGU/JyB9LFxuICAgICAgLy8gQ2xhdmVzIGRlIHNlY2NpXHUwMEYzbiBkZWwgb2JqZXRvIChjYXNlLm9iamVjdC50cykgcXVlIHVzYW4gbG9zXG4gICAgICAvLyBmb3JtdWxhcmlvcyBkZSByZWdpc3RybyB5IGxhIHBcdTAwRTFnaW5hIGRlIGRldGFsbGUsIGN1eWFzIHNlY2Npb25lc1xuICAgICAgLy8gaGFjZW4gcmVmZXJlbmNpYSBhIGVzdG9zIGdydXBvcyAoIzk3MCkuXG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gZGVsIENhc28nIH0sXG4gICAgICBvcmlnaW46IHsgbGFiZWw6ICdPcmlnZW4geSBBc2lnbmFjaVx1MDBGM24nIH0sXG4gICAgICBzbGE6IHsgbGFiZWw6ICdTTEEgeSBQcmlvcmlkYWQnIH0sXG4gICAgICByZXNvbHV0aW9uOiB7IGxhYmVsOiAnUmVzb2x1Y2lcdTAwRjNuJyB9LFxuICAgICAgZXNjYWxhdGlvbjogeyBsYWJlbDogJ0VzY2FsYWNpXHUwMEYzbicgfSxcbiAgICAgIHN5c3RlbTogeyBsYWJlbDogJ1Npc3RlbWEnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgZXNjYWxhdGVfY2FzZToge1xuICAgICAgICBsYWJlbDogJ0VzY2FsYXIgQ2FzbycsXG4gICAgICAgIGNvbmZpcm1UZXh0OiAnRXN0byBlbnZpYXJcdTAwRTEgZWwgY2FzbyBhbCBlcXVpcG8gZGUgZXNjYWxhY2lcdTAwRjNuLiBcdTAwQkZDb250aW51YXI/JyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTAwQTFDYXNvIGVzY2FsYWRvIGNvbiBcdTAwRTl4aXRvIScsXG4gICAgICB9LFxuICAgICAgY2xvc2VfY2FzZToge1xuICAgICAgICBsYWJlbDogJ0NlcnJhciBDYXNvJyxcbiAgICAgICAgY29uZmlybVRleHQ6ICdcdTAwQkZFc3RcdTAwRTEgc2VndXJvIGRlIHF1ZXJlciBjZXJyYXIgZXN0ZSBjYXNvPycsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUwMEExQ2FzbyBjZXJyYWRvIGNvbiBcdTAwRTl4aXRvIScsXG4gICAgICB9LFxuICAgICAgY2xhaW1fY2FzZToge1xuICAgICAgICBsYWJlbDogJ1RvbWFyIENhc28nLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ0Nhc28gdG9tYWRvOiBhaG9yYSBlcyBzdXlvLicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9rbm93bGVkZ2VfYXJ0aWNsZToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgcHVibGlzaGVkX3JlcXVpcmVzX2JvZHk6IHtcbiAgICAgICAgbWVzc2FnZTogJ05vIHNlIHB1ZWRlbiBwdWJsaWNhciBhcnRcdTAwRURjdWxvcyBzaW4gY3VlcnBvLicsXG4gICAgICB9LFxuICAgICAgcHVibGlzaGVkX3JlcXVpcmVzX3N1bW1hcnk6IHtcbiAgICAgICAgbWVzc2FnZTogJ0xvcyBhcnRcdTAwRURjdWxvcyBwdWJsaWNhZG9zIGRlYmVuIHRlbmVyIHVuIHJlc3VtZW4gcGFyYSBsb3MgcmVzdWx0YWRvcyBkZSBiXHUwMEZBc3F1ZWRhIHkgbGFzIGNpdGFzIGRlIElBLicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdBcnRcdTAwRURjdWxvIGRlIENvbm9jaW1pZW50bycsXG4gICAgcGx1cmFsTGFiZWw6ICdCYXNlIGRlIENvbm9jaW1pZW50bycsXG4gICAgZGVzY3JpcHRpb246ICdSZXNwdWVzdGFzIHkgZ3VcdTAwRURhcyByZXV0aWxpemFibGVzIHBhcmEgY2xpZW50ZXMgeSBhZ2VudGVzJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGFydGljbGVfbnVtYmVyOiB7IGxhYmVsOiAnTi5cdTAwQkEgQXJ0XHUwMEVEY3VsbycgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdUXHUwMEVEdHVsbyBNb3N0cmFkbycgfSxcbiAgICAgIHRpdGxlOiB7IGxhYmVsOiAnVFx1MDBFRHR1bG8nIH0sXG4gICAgICBzdW1tYXJ5OiB7IGxhYmVsOiAnUmVzdW1lbicsIGhlbHA6ICdSZXN1bWVuIGRlIHVuIHBcdTAwRTFycmFmbyBxdWUgc2UgbXVlc3RyYSBlbiBsb3MgcmVzdWx0YWRvcyBkZSBiXHUwMEZBc3F1ZWRhIHkgZW4gbGFzIGNpdGFzIGRlIGxhIElBLicgfSxcbiAgICAgIGJvZHk6IHsgbGFiZWw6ICdDb250ZW5pZG8nLCBoZWxwOiAnQ29udGVuaWRvIGNvbXBsZXRvIGRlbCBhcnRcdTAwRURjdWxvIChNYXJrZG93bikuJyB9LFxuICAgICAgY2F0ZWdvcnk6IHtcbiAgICAgICAgbGFiZWw6ICdDYXRlZ29yXHUwMEVEYScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQ6ICdQcmltZXJvcyBwYXNvcycsIGhvd190bzogJ0NcdTAwRjNtbyBoYWNlcmxvJyxcbiAgICAgICAgICB0cm91Ymxlc2hvb3Rpbmc6ICdSZXNvbHVjaVx1MDBGM24gZGUgcHJvYmxlbWFzJywgYmlsbGluZzogJ0ZhY3R1cmFjaVx1MDBGM24nLCBhcGk6ICdBUEkgZSBJbnRlZ3JhY2lvbmVzJyxcbiAgICAgICAgICByZWxlYXNlX25vdGVzOiAnTm90YXMgZGUgdmVyc2lcdTAwRjNuJywgcG9saWN5OiAnUG9sXHUwMEVEdGljYXMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgbGFiZWw6ICdFdGlxdWV0YXMnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYXV0aDogJ0F1dGVudGljYWNpXHUwMEYzbicsIHNzbzogJ1NTTycsIG1vYmlsZTogJ01cdTAwRjN2aWwnLCBlbWFpbDogJ0NvcnJlbycsXG4gICAgICAgICAgcmVwb3J0czogJ0luZm9ybWVzJywgcGVyZm9ybWFuY2U6ICdSZW5kaW1pZW50bycsXG4gICAgICAgICAgZGF0YV9pbXBvcnQ6ICdJbXBvcnRhY2lcdTAwRjNuIGRlIGRhdG9zJywgd2ViaG9va3M6ICdXZWJob29rcycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnRXN0YWRvJyxcbiAgICAgICAgb3B0aW9uczogeyBkcmFmdDogJ0JvcnJhZG9yJywgaW5fcmV2aWV3OiAnRW4gcmV2aXNpXHUwMEYzbicsIHB1Ymxpc2hlZDogJ1B1YmxpY2FkbycsIGFyY2hpdmVkOiAnQXJjaGl2YWRvJyB9LFxuICAgICAgfSxcbiAgICAgIGF1ZGllbmNlOiB7XG4gICAgICAgIGxhYmVsOiAnQXVkaWVuY2lhJyxcbiAgICAgICAgaGVscDogJ0xvcyBhcnRcdTAwRURjdWxvcyBwXHUwMEZBYmxpY29zIHNvbiB2aXNpYmxlcyBlbiBlbCBwb3J0YWwgZGUgY2xpZW50ZXM7IGxvcyBpbnRlcm5vcyBzb2xvIGxvcyB2ZW4gbG9zIGFnZW50ZXMuJyxcbiAgICAgICAgb3B0aW9uczogeyBwdWJsaWM6ICdQXHUwMEZBYmxpY28nLCBpbnRlcm5hbDogJ0ludGVybm8nIH0sXG4gICAgICB9LFxuICAgICAgbGFuZ3VhZ2U6IHtcbiAgICAgICAgbGFiZWw6ICdJZGlvbWEnLFxuICAgICAgICBvcHRpb25zOiB7IGVuOiAnSW5nbFx1MDBFOXMnLCB6aF9jbjogJ0NoaW5vIHNpbXBsaWZpY2FkbycsIGVzX2VzOiAnRXNwYVx1MDBGMW9sJywgamFfanA6ICdKYXBvblx1MDBFOXMnIH0sXG4gICAgICB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdQcm9waWV0YXJpbycgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY2FzZTogeyBsYWJlbDogJ0Nhc28gZGUgb3JpZ2VuJywgaGVscDogJ0Nhc28gYSBwYXJ0aXIgZGVsIGN1YWwgc2UgcmVkYWN0XHUwMEYzIGVzdGUgYXJ0XHUwMEVEY3VsbyAob3BjaW9uYWwpLicgfSxcbiAgICAgIHB1Ymxpc2hlZF9hdDogeyBsYWJlbDogJ1B1YmxpY2FkbyBlbCcgfSxcbiAgICAgIGxhc3RfcmV2aWV3ZWRfYXQ6IHsgbGFiZWw6ICdcdTAwREFsdGltYSByZXZpc2lcdTAwRjNuJyB9LFxuICAgICAgaGVscGZ1bF9jb3VudDogeyBsYWJlbDogJ1x1MDBEQXRpbCcsIGhlbHA6ICdSZWNvbnRhZG8gZGVzZGUgY3JtX2FydGljbGVfZmVlZGJhY2sgXHUyMDE0IG51bmNhIHNlIGVzY3JpYmUgYSBtYW5vLicgfSxcbiAgICAgIG5vdF9oZWxwZnVsX2NvdW50OiB7IGxhYmVsOiAnTm8gXHUwMEZBdGlsJywgaGVscDogJ1JlY29udGFkbyBkZXNkZSBjcm1fYXJ0aWNsZV9mZWVkYmFjayBcdTIwMTQgbnVuY2Egc2UgZXNjcmliZSBhIG1hbm8uJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfYXJ0aWNsZXM6IHsgbGFiZWw6ICdUb2RvcyBsb3MgYXJ0XHUwMEVEY3Vsb3MnIH0sXG4gICAgICBwdWJsaXNoZWRfYXJ0aWNsZXM6IHsgbGFiZWw6ICdQdWJsaWNhZG9zJyB9LFxuICAgICAgbXlfZHJhZnRzOiB7IGxhYmVsOiAnTWlzIGJvcnJhZG9yZXMnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBkZWwgQXJ0XHUwMEVEY3VsbycgfSxcbiAgICAgIGNvbnRlbnQ6IHsgbGFiZWw6ICdDb250ZW5pZG8nIH0sXG4gICAgICB0YXhvbm9teTogeyBsYWJlbDogJ0NhdGVnb3JpemFjaVx1MDBGM24nIH0sXG4gICAgICBtZXRyaWNzOiB7IGxhYmVsOiAnSW50ZXJhY2NpXHUwMEYzbicgfSxcbiAgICAgIGVuZ2FnZW1lbnQ6IHsgbGFiZWw6ICdJbnRlcmFjY2lcdTAwRjNuJyB9LFxuICAgICAgLy8gTm9tYnJlIGRlIHNlY2NpXHUwMEYzbiBkZWwgZm9ybXVsYXJpbyBlbiBrbm93bGVkZ2VfYXJ0aWNsZS52aWV3LnRzICgjMTEwMClcbiAgICAgIGFydGljbGU6IHsgbGFiZWw6ICdBcnRcdTAwRURjdWxvJyB9LFxuICAgIH0sXG4gICAgX2FjdGlvbnM6IHtcbiAgICAgIG1hcmtfYXJ0aWNsZV9oZWxwZnVsOiB7XG4gICAgICAgIGxhYmVsOiAnXHUwMERBdGlsJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdHcmFjaWFzIFx1MjAxNCByZWdpc3RyYWRvIGNvbW8gXHUwMEZBdGlsLicsXG4gICAgICB9LFxuICAgICAgbWFya19hcnRpY2xlX25vdF9oZWxwZnVsOiB7XG4gICAgICAgIGxhYmVsOiAnTm8gXHUwMEZBdGlsJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdHcmFjaWFzIFx1MjAxNCByZWdpc3RyYWRvIGNvbW8gbm8gXHUwMEZBdGlsLicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9hcnRpY2xlX2ZlZWRiYWNrOiB7XG4gICAgbGFiZWw6ICdPcGluaVx1MDBGM24gc29icmUgZWwgQXJ0XHUwMEVEY3VsbycsXG4gICAgcGx1cmFsTGFiZWw6ICdPcGluaW9uZXMgc29icmUgQXJ0XHUwMEVEY3Vsb3MnLFxuICAgIGRlc2NyaXB0aW9uOiAnRWwgdmVyZWRpY3RvIFx1MDBGQXRpbCAvIG5vIFx1MDBGQXRpbCBkZSB1biBsZWN0b3Igc29icmUgdW4gYXJ0XHUwMEVEY3VsbyBkZSBsYSBiYXNlIGRlIGNvbm9jaW1pZW50bycsXG4gICAgZmllbGRzOiB7XG4gICAgICBmZWVkYmFja19udW1iZXI6IHsgbGFiZWw6ICdOLlx1MDBCQSBkZSBPcGluaVx1MDBGM24nIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ0xlY3RvcicgfSxcbiAgICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogeyBsYWJlbDogJ0FydFx1MDBFRGN1bG8nLCBoZWxwOiAnQXJ0XHUwMEVEY3VsbyBkZSBsYSBiYXNlIGRlIGNvbm9jaW1pZW50byBhbCBxdWUgc2UgcmVmaWVyZSBlc3RhIG9waW5pXHUwMEYzbi4nIH0sXG4gICAgICB2ZXJkaWN0OiB7XG4gICAgICAgIGxhYmVsOiAnVmVyZWRpY3RvJyxcbiAgICAgICAgb3B0aW9uczogeyBoZWxwZnVsOiAnXHUwMERBdGlsJywgbm90X2hlbHBmdWw6ICdObyBcdTAwRkF0aWwnIH0sXG4gICAgICB9LFxuICAgICAgY29tbWVudDogeyBsYWJlbDogJ0NvbWVudGFyaW8nLCBoZWxwOiAnTm90YSBvcGNpb25hbCBxdWUgZXhwbGljYSBlbCB2ZXJlZGljdG8gXHUyMDE0IGxhIGxlZSBlbCBhdXRvciBkZWwgYXJ0XHUwMEVEY3Vsby4nIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnT3BpbmlcdTAwRjNuJyB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL29iamVjdHMuYWN0aXZpdHkudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy9vYmplY3RzLmFjdGl2aXR5LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbi8qKlxuICogRXNwYVx1MDBGMW9sIChlcy1FUykgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBBQ1RJVklUWSBmYW1pbHk6XG4gKiB0aGUgaW50ZXJhY3Rpb24gbG9nIFx1MjAxNCB0YXNrcywgZXZlbnRzLCBhbmQgd2hvIGF0dGVuZGVkLlxuICpcbiAqIFJvc3RlcjogYGNybV90YXNrYCwgYGNybV9ldmVudGAsIGBjcm1fZXZlbnRfYXR0ZW5kZWVgLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICogRXZlcnl0aGluZyB0aGF0IGlzIG5vdCBgb2JqZWN0c2AgbGl2ZXMgaW4gYC4vYXBwLnRzYDsgYG9iamVjdHNgIFx1MjAxNCA2OS03OCUgb2ZcbiAqIGV2ZXJ5IGJ1bmRsZSBcdTIwMTQgaXMgb25lIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5LCBhbmQgYSBkZXRhaWwgb2JqZWN0XG4gKiBmb2xsb3dzIGl0cyBtYXN0ZXIuIEEgbmV3IHJvdyBnb2VzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LCBuZXZlciBpblxuICogd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuOiB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0IHRoZSA3MCVcbiAqIGFkdmlzb3J5IGJhbmQgYHBucG0gaHlnaWVuZWAgcHJpbnRzLiBGdWxsIHJ1bGUgYW5kIHJhdGlvbmFsZTpcbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTLnRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFjdGl2aXR5OiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fdGFzazoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgY29tcGxldGVkX2RhdGVfcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0xhIGZlY2hhIGRlIGZpbmFsaXphY2lcdTAwRjNuIGVzIG9ibGlnYXRvcmlhIGN1YW5kbyBlbCBlc3RhZG8gZXMgQ29tcGxldGFkYScsXG4gICAgICB9LFxuICAgICAgcmVjdXJyZW5jZV9maWVsZHNfcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0VsIHRpcG8gZGUgcmVjdXJyZW5jaWEgZXMgb2JsaWdhdG9yaW8gcGFyYSBsYXMgdGFyZWFzIHJlY3VycmVudGVzJyxcbiAgICAgIH0sXG4gICAgICByZWxhdGVkX3RvX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdEZWJlIHNlbGVjY2lvbmFyc2UgYWwgbWVub3MgdW4gcmVnaXN0cm8gcmVsYWNpb25hZG8nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnVGFyZWEnLFxuICAgIHBsdXJhbExhYmVsOiAnVGFyZWFzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0FjdGl2aWRhZGVzIHkgdGFyZWFzIHBlbmRpZW50ZXMnLFxuICAgIGZpZWxkczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ0FzdW50bycgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcGNpXHUwMEYzbicgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ0VzdGFkbycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBub3Rfc3RhcnRlZDogJ05vIEluaWNpYWRhJywgaW5fcHJvZ3Jlc3M6ICdFbiBDdXJzbycsIHdhaXRpbmc6ICdFbiBFc3BlcmEnLFxuICAgICAgICAgIGNvbXBsZXRlZDogJ0NvbXBsZXRhZGEnLCBkZWZlcnJlZDogJ0FwbGF6YWRhJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwcmlvcml0eToge1xuICAgICAgICBsYWJlbDogJ1ByaW9yaWRhZCcsXG4gICAgICAgIG9wdGlvbnM6IHsgbG93OiAnQmFqYScsIG5vcm1hbDogJ05vcm1hbCcsIGhpZ2g6ICdBbHRhJywgdXJnZW50OiAnVXJnZW50ZScgfSxcbiAgICAgIH0sXG4gICAgICBwcmlvcml0eV9yYW5rOiB7IGxhYmVsOiAnUmFuZ28gZGUgUHJpb3JpZGFkJyB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ1RpcG8gZGUgVGFyZWEnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY2FsbDogJ0xsYW1hZGEnLCBlbWFpbDogJ0VtYWlsJywgbWVldGluZzogJ1JldW5pXHUwMEYzbicsXG4gICAgICAgICAgZm9sbG93X3VwOiAnU2VndWltaWVudG8nLCBkZW1vOiAnRGVtb3N0cmFjaVx1MDBGM24nLCBvdGhlcjogJ090cm8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGR1ZV9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgTFx1MDBFRG1pdGUnIH0sXG4gICAgICByZW1pbmRlcl9kYXRlOiB7IGxhYmVsOiAnRmVjaGEvSG9yYSBkZSBSZWNvcmRhdG9yaW8nIH0sXG4gICAgICByZW1pbmRlcl9zZW50OiB7IGxhYmVsOiAnUmVjb3JkYXRvcmlvIEVudmlhZG8nIH0sXG4gICAgICBjb21wbGV0ZWRfZGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIEZpbmFsaXphY2lcdTAwRjNuJyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdBc2lnbmFkbyBBJyB9LFxuICAgICAgLy8gTG9zIHZhbG9yZXMgc29uIG5vbWJyZXMgZGUgb2JqZXRvOiBzZSByZXV0aWxpemFuIGxhcyBldGlxdWV0YXMgeWFcbiAgICAgIC8vIHRyYWR1Y2lkYXMgZGUgY2FkYSBvYmpldG8gZW4gZXN0ZSBtaXNtbyBwYXF1ZXRlIChpZ3VhbCBxdWVcbiAgICAgIC8vIGBjcm1fZXZlbnQucmVsYXRlZF90b190eXBlYCkuXG4gICAgICByZWxhdGVkX3RvX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvIGRlIE9iamV0byBSZWxhY2lvbmFkbycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjcm1fYWNjb3VudDogJ0N1ZW50YScsIGNybV9jb250YWN0OiAnQ29udGFjdG8nLCBjcm1fb3Bwb3J0dW5pdHk6ICdPcG9ydHVuaWRhZCcsXG4gICAgICAgICAgY3JtX2xlYWQ6ICdQcm9zcGVjdG8nLCBjcm1fY2FzZTogJ0Nhc28nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlbGF0ZWRfdG9fYWNjb3VudDogeyBsYWJlbDogJ0N1ZW50YSBSZWxhY2lvbmFkYScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY29udGFjdDogeyBsYWJlbDogJ0NvbnRhY3RvIFJlbGFjaW9uYWRvJyB9LFxuICAgICAgcmVsYXRlZF90b19vcHBvcnR1bml0eTogeyBsYWJlbDogJ09wb3J0dW5pZGFkIFJlbGFjaW9uYWRhJyB9LFxuICAgICAgcmVsYXRlZF90b19sZWFkOiB7IGxhYmVsOiAnUHJvc3BlY3RvIFJlbGFjaW9uYWRvJyB9LFxuICAgICAgcmVsYXRlZF90b19jYXNlOiB7IGxhYmVsOiAnQ2FzbyBSZWxhY2lvbmFkbycgfSxcbiAgICAgIGlzX3JlY3VycmluZzogeyBsYWJlbDogJ1RhcmVhIFJlY3VycmVudGUnIH0sXG4gICAgICByZWN1cnJlbmNlX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvIGRlIFJlY3VycmVuY2lhJyxcbiAgICAgICAgb3B0aW9uczogeyBkYWlseTogJ0RpYXJpYScsIHdlZWtseTogJ1NlbWFuYWwnLCBtb250aGx5OiAnTWVuc3VhbCcsIHllYXJseTogJ0FudWFsJyB9LFxuICAgICAgfSxcbiAgICAgIHJlY3VycmVuY2VfaW50ZXJ2YWw6IHsgbGFiZWw6ICdJbnRlcnZhbG8gZGUgUmVjdXJyZW5jaWEnIH0sXG4gICAgICByZWN1cnJlbmNlX2VuZF9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgRmluIGRlIFJlY3VycmVuY2lhJyB9LFxuICAgICAgaXNfY29tcGxldGVkOiB7IGxhYmVsOiAnRXN0XHUwMEUxIENvbXBsZXRhZG8nIH0sXG4gICAgICBpc19vdmVyZHVlOiB7IGxhYmVsOiAnRXN0XHUwMEUxIFZlbmNpZG8nIH0sXG4gICAgICBwcm9ncmVzc19wZXJjZW50OiB7IGxhYmVsOiAnUHJvZ3Jlc28gKCUpJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfdGFza3M6IHsgbGFiZWw6ICdUb2RhcyBsYXMgVGFyZWFzJyB9LFxuICAgICAgdGFza19ib2FyZDogeyBsYWJlbDogJ1RhYmxlcm8gZGUgVGFyZWFzJyB9LFxuICAgICAgdGFza19jYWxlbmRhcjogeyBsYWJlbDogJ0NhbGVuZGFyaW8gZGUgVGFyZWFzJyB9LFxuICAgICAgdGFza19nYW50dDogeyBsYWJlbDogJ1BsYW4gZGUgRWplY3VjaVx1MDBGM24nIH0sXG4gICAgICB0YXNrX3RpbWVsaW5lOiB7IGxhYmVsOiAnTFx1MDBFRG5lYSBkZSBUaWVtcG8nIH0sXG4gICAgICBteV9vcGVuX3Rhc2tzOiB7IGxhYmVsOiAnTWlzIFRhcmVhcyBBYmllcnRhcycgfSxcbiAgICAgIHRvZGF5c190YXNrczogeyBsYWJlbDogJ1x1RDgzRFx1RENDNSBNaXMgVGFyZWFzIFByaW9yaXRhcmlhcycgfSxcbiAgICAgIG92ZXJkdWVfdGFza3M6IHsgbGFiZWw6ICdcdTIzRjAgVGFyZWFzIEFiaWVydGFzIFx1MDBCNyBNXHUwMEUxcyBWZW5jaWRhcyBQcmltZXJvJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gZGUgbGEgVGFyZWEnIH0sXG4gICAgICBzY2hlZHVsaW5nOiB7IGxhYmVsOiAnUHJvZ3JhbWFjaVx1MDBGM24nIH0sXG4gICAgICByZWxhdGVkOiB7IGxhYmVsOiAnUmVnaXN0cm9zIFJlbGFjaW9uYWRvcycgfSxcbiAgICAgIHJlY3VycmVuY2U6IHsgbGFiZWw6ICdSZWN1cnJlbmNpYScgfSxcbiAgICAgIGVmZm9ydDogeyBsYWJlbDogJ1Byb2dyZXNvIHkgRXNmdWVyem8nIH0sXG4gICAgICBzeXN0ZW06IHsgbGFiZWw6ICdTaXN0ZW1hJyB9LFxuICAgICAgLy8gTm9tYnJlcyBkZSBzZWNjaVx1MDBGM24gZGVsIGZvcm11bGFyaW8gZW4gdGFzay52aWV3LnRzICgjMTEwMClcbiAgICAgIHRhc2s6IHsgbGFiZWw6ICdUYXJlYScgfSxcbiAgICAgIHJlbGF0ZWRfcmVjb3JkczogeyBsYWJlbDogJ1JlZ2lzdHJvcyBSZWxhY2lvbmFkb3MnIH0sXG4gICAgICByZWN1cnJlbmNlX2FuZF9lZmZvcnQ6IHsgbGFiZWw6ICdSZWN1cnJlbmNpYSB5IEVzZnVlcnpvJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9ldmVudDoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgZW5kX2FmdGVyX3N0YXJ0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdMYSBob3JhIGRlIGZpbiBkZWJlIHNlciBwb3N0ZXJpb3IgYSBsYSBkZSBpbmljaW8nLFxuICAgICAgfSxcbiAgICAgIHJlbGF0ZWRfdG9fcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0RlYmUgc2VsZWNjaW9uYXJzZSBhbCBtZW5vcyB1biByZWdpc3RybyByZWxhY2lvbmFkbycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdFdmVudG8nLFxuICAgIHBsdXJhbExhYmVsOiAnRXZlbnRvcycsXG4gICAgZGVzY3JpcHRpb246ICdSZXVuaW9uZXMsIGxsYW1hZGFzIHkgb3RyYXMgaW50ZXJhY2Npb25lcyBwcm9ncmFtYWRhcyBjb24gY2xpZW50ZXMnLFxuICAgIGZpZWxkczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ0FzdW50bycgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcGNpXHUwMEYzbicgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvIGRlIGV2ZW50bycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtZWV0aW5nOiAnUmV1bmlcdTAwRjNuJywgY2FsbDogJ0xsYW1hZGEnLCBkZW1vOiAnRGVtb3N0cmFjaVx1MDBGM24nLFxuICAgICAgICAgIHdlYmluYXI6ICdTZW1pbmFyaW8gd2ViJywgb25zaXRlX3Zpc2l0OiAnVmlzaXRhIHByZXNlbmNpYWwnLCBvdGhlcjogJ090cm8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ0VzdGFkbycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwbGFubmVkOiAnUGxhbmlmaWNhZG8nLCBoZWxkOiAnUmVhbGl6YWRvJywgY2FuY2VsbGVkOiAnQ2FuY2VsYWRvJywgbm9fc2hvdzogJ05vIGFzaXN0aVx1MDBGMycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdBc2lnbmFkbyBhJyB9LFxuICAgICAgc3RhcnRfZGF0ZXRpbWU6IHsgbGFiZWw6ICdJbmljaW8nIH0sXG4gICAgICBlbmRfZGF0ZXRpbWU6IHsgbGFiZWw6ICdGaW4nIH0sXG4gICAgICBhbGxfZGF5OiB7IGxhYmVsOiAnRXZlbnRvIGRlIHRvZG8gZWwgZFx1MDBFRGEnIH0sXG4gICAgICBkdXJhdGlvbl9taW51dGVzOiB7IGxhYmVsOiAnRHVyYWNpXHUwMEYzbiAobWludXRvcyknIH0sXG4gICAgICBsb2NhdGlvbjogeyBsYWJlbDogJ1ViaWNhY2lcdTAwRjNuJywgaGVscDogJ1NhbGEsIGRpcmVjY2lcdTAwRjNuIG8gZW5sYWNlIGRlIGxhIHJldW5pXHUwMEYzbicgfSxcbiAgICAgIHJlbGF0ZWRfdG9fdHlwZToge1xuICAgICAgICBsYWJlbDogJ1RpcG8gZGUgcmVnaXN0cm8gcmVsYWNpb25hZG8nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY3JtX2FjY291bnQ6ICdDdWVudGEnLCBjcm1fY29udGFjdDogJ0NvbnRhY3RvJywgY3JtX29wcG9ydHVuaXR5OiAnT3BvcnR1bmlkYWQnLFxuICAgICAgICAgIGNybV9sZWFkOiAnUHJvc3BlY3RvJywgY3JtX2Nhc2U6ICdDYXNvJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZWxhdGVkX3RvX2FjY291bnQ6IHsgbGFiZWw6ICdDdWVudGEgcmVsYWNpb25hZGEnIH0sXG4gICAgICByZWxhdGVkX3RvX2NvbnRhY3Q6IHsgbGFiZWw6ICdDb250YWN0byByZWxhY2lvbmFkbycgfSxcbiAgICAgIHJlbGF0ZWRfdG9fb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdPcG9ydHVuaWRhZCByZWxhY2lvbmFkYScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fbGVhZDogeyBsYWJlbDogJ1Byb3NwZWN0byByZWxhY2lvbmFkbycgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY2FzZTogeyBsYWJlbDogJ0Nhc28gcmVsYWNpb25hZG8nIH0sXG4gICAgICBvdXRjb21lX25vdGVzOiB7IGxhYmVsOiAnTm90YXMgZGUgcmVzdWx0YWRvJywgaGVscDogJ1F1XHUwMEU5IHNlIGFjb3JkXHUwMEYzIHkgcXVcdTAwRTkgc2lndWUnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9ldmVudHM6IHsgbGFiZWw6ICdUb2RvcyBsb3MgZXZlbnRvcycgfSxcbiAgICAgIGV2ZW50X2NhbGVuZGFyOiB7IGxhYmVsOiAnQ2FsZW5kYXJpbyBkZSBldmVudG9zJyB9LFxuICAgICAgZXZlbnRfdGltZWxpbmU6IHsgbGFiZWw6ICdBZ2VuZGEgZGVsIGVxdWlwbycgfSxcbiAgICAgIG15X2V2ZW50czogeyBsYWJlbDogJ01pIGNhbGVuZGFyaW8nIH0sXG4gICAgICB1cGNvbWluZ19ldmVudHM6IHsgbGFiZWw6ICdcdUQ4M0RcdURDQzUgUHJcdTAwRjN4aW1vcyBcdTAwQjcgTVx1MDBFMXMgY2VyY2Fub3MgcHJpbWVybycgfSxcbiAgICAgIGhlbGRfZXZlbnRzOiB7IGxhYmVsOiAnXHUyNzA1IEhpc3RvcmlhbCBkZSBpbnRlcmFjY2lvbmVzJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gZGVsIEV2ZW50bycgfSxcbiAgICAgIHNjaGVkdWxlOiB7IGxhYmVsOiAnUHJvZ3JhbWFjaVx1MDBGM24nIH0sXG4gICAgICByZWxhdGVkOiB7IGxhYmVsOiAnUmVnaXN0cm9zIFJlbGFjaW9uYWRvcycgfSxcbiAgICAgIG91dGNvbWU6IHsgbGFiZWw6ICdSZXN1bHRhZG8nIH0sXG4gICAgICAvLyBOb21icmVzIGRlIHNlY2NpXHUwMEYzbiBkZWwgZm9ybXVsYXJpbyBlbiBldmVudC52aWV3LnRzICgjMTEwMClcbiAgICAgIGV2ZW50OiB7IGxhYmVsOiAnRXZlbnRvJyB9LFxuICAgICAgcmVsYXRlZF9yZWNvcmRzOiB7IGxhYmVsOiAnUmVnaXN0cm9zIFJlbGFjaW9uYWRvcycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fZXZlbnRfYXR0ZW5kZWU6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGF0dGVuZGVlX3Jlc29sdmVzOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdVbiBhc2lzdGVudGUgZGViZSBpbmRpY2FyIGxhIHBhcnRlIHF1ZSBub21icmEgc3UgdGlwbzogZWwgdGlwbyBDb250YWN0byByZXF1aWVyZSB1biBjb250YWN0byB5IGVsIHRpcG8gRXh0ZXJubyByZXF1aWVyZSB1biBub21icmUgZGUgYXNpc3RlbnRlIGV4dGVybm8nLFxuICAgICAgfSxcbiAgICAgIGF0dGVuZGVlX3R5cGVfZXhjbHVzaXZlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdVbiBhc2lzdGVudGUgbm9tYnJhIGV4YWN0YW1lbnRlIHVuYSBwYXJ0ZTogYm9ycmUgbGFzIGNvbHVtbmFzIHF1ZSBzdSB0aXBvIGRlIGFzaXN0ZW50ZSBubyBub21icmEnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnQXNpc3RlbnRlIGFsIGV2ZW50bycsXG4gICAgcGx1cmFsTGFiZWw6ICdBc2lzdGVudGVzIGFsIGV2ZW50bycsXG4gICAgZGVzY3JpcHRpb246ICdQZXJzb25hIGludml0YWRhIG8gcHJlc2VudGUgZW4gdW4gZXZlbnRvJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGF0dGVuZGVlX251bWJlcjogeyBsYWJlbDogJ05cdTAwRkFtZXJvIGRlIGFzaXN0ZW50ZScgfSxcbiAgICAgIGNybV9ldmVudDogeyBsYWJlbDogJ0V2ZW50bycgfSxcbiAgICAgIGF0dGVuZGVlX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvIGRlIGFzaXN0ZW50ZScsXG4gICAgICAgIG9wdGlvbnM6IHsgY29udGFjdDogJ0NvbnRhY3RvJywgbGVhZDogJ1Byb3NwZWN0bycsIHVzZXI6ICdVc3VhcmlvJywgZXh0ZXJuYWw6ICdFeHRlcm5vJyB9LFxuICAgICAgfSxcbiAgICAgIGNybV9jb250YWN0OiB7IGxhYmVsOiAnQ29udGFjdG8nLCBoZWxwOiAnU2UgcmVsbGVuYSBjdWFuZG8gZWwgYXNpc3RlbnRlIGVzIHVuIGNvbnRhY3RvIGRlIGNsaWVudGUgeWEgZXhpc3RlbnRlJyB9LFxuICAgICAgY3JtX2xlYWQ6IHsgbGFiZWw6ICdQcm9zcGVjdG8nLCBoZWxwOiAnU2UgcmVsbGVuYSBjdWFuZG8gZWwgYXNpc3RlbnRlIHNpZ3VlIHNpZW5kbyB1biBwcm9zcGVjdG8gc2luIGNvbnZlcnRpcicgfSxcbiAgICAgIHN5c191c2VyOiB7IGxhYmVsOiAnVXN1YXJpbycsIGhlbHA6ICdTZSByZWxsZW5hIGN1YW5kbyBlbCBhc2lzdGVudGUgZXMgdW4gY29tcGFcdTAwRjFlcm8gZGUgbGEgZW1wcmVzYScgfSxcbiAgICAgIGV4dGVybmFsX25hbWU6IHsgbGFiZWw6ICdBc2lzdGVudGUgZXh0ZXJubycsIGhlbHA6ICdOb21icmUgZGUgdW4gYXNpc3RlbnRlIHF1ZSBubyBlc3RcdTAwRTEgZW4gbmluZ1x1MDBGQW4gb2JqZXRvIGRlbCBDUk06IHNlIHJlbGxlbmEgY3VhbmRvIGVsIHRpcG8gZGUgYXNpc3RlbnRlIGVzIEV4dGVybm8nIH0sXG4gICAgICByZXNwb25zZToge1xuICAgICAgICBsYWJlbDogJ1Jlc3B1ZXN0YScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBub19yZXNwb25zZTogJ1NpbiByZXNwdWVzdGEnLCBhY2NlcHRlZDogJ0FjZXB0YWRvJyxcbiAgICAgICAgICBkZWNsaW5lZDogJ1JlY2hhemFkbycsIHRlbnRhdGl2ZTogJ1RlbnRhdGl2bycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgaXNfb3JnYW5pemVyOiB7IGxhYmVsOiAnT3JnYW5pemFkb3InIH0sXG4gICAgICBpbnZpdGVkX2RhdGU6IHsgbGFiZWw6ICdJbnZpdGFkbyBlbCcgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2V2ZW50X2F0dGVuZGVlczogeyBsYWJlbDogJ0FzaXN0ZW50ZXMgYWwgZXZlbnRvJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICAvLyBFbCBpbmdsXHUwMEU5cyBlcyBcdTAwQUJBdHRlbmRlZVx1MDBCQiAvIFx1MDBBQkludml0YXRpb25cdTAwQkIsIG5vIGVsIHBhclxuICAgICAgLy8gXHUwMEFCQmFzaWMgSW5mb3JtYXRpb25cdTAwQkIgLyBcdTAwQUJSZXNwb25zZSBUcmFja2luZ1x1MDBCQiBkZSBjcm1fY2FtcGFpZ25fbWVtYmVyLlxuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdBc2lzdGVudGUnIH0sXG4gICAgICByZXNwb25zZTogeyBsYWJlbDogJ0ludml0YWNpXHUwMEYzbicgfSxcbiAgICAgIC8vIE5vbWJyZXMgZGUgc2VjY2lcdTAwRjNuIGRlbCBmb3JtdWxhcmlvIGVuIGV2ZW50X2F0dGVuZGVlLnZpZXcudHMgKCMxMTAwKVxuICAgICAgYXR0ZW5kZWU6IHsgbGFiZWw6ICdBc2lzdGVudGUnIH0sXG4gICAgICBpbnZpdGF0aW9uOiB7IGxhYmVsOiAnSW52aXRhY2lcdTAwRjNuJyB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL29iamVjdHMubWFya2V0aW5nLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FU1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvb2JqZWN0cy5tYXJrZXRpbmcudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgT2JqZWN0VHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuLyoqXG4gKiBFc3BhXHUwMEYxb2wgKGVzLUVTKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIE1BUktFVElORyBmYW1pbHk6XG4gKiBkZW1hbmQgZ2VuZXJhdGlvbiBcdTIwMTQgY2FtcGFpZ25zIGFuZCB0aGVpciBtZW1iZXJzaGlwLlxuICpcbiAqIFJvc3RlcjogYGNybV9jYW1wYWlnbmAsIGBjcm1fY2FtcGFpZ25fbWVtYmVyYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBtYXJrZXRpbmc6IFJlY29yZDxzdHJpbmcsIE9iamVjdFRyYW5zbGF0aW9uRGF0YT4gPSB7XG4gIGNybV9jYW1wYWlnbjoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgZW5kX2FmdGVyX3N0YXJ0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdMYSBmZWNoYSBkZSBmaW4gZGViZSBzZXIgcG9zdGVyaW9yIGEgbGEgZGUgaW5pY2lvJyxcbiAgICAgIH0sXG4gICAgICBhY3R1YWxfY29zdF93aXRoaW5fYnVkZ2V0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdFbCBjb3N0ZSByZWFsIHN1cGVyYSBlbCBjb3N0ZSBwcmVzdXB1ZXN0YWRvJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ0NhbXBhXHUwMEYxYScsXG4gICAgcGx1cmFsTGFiZWw6ICdDYW1wYVx1MDBGMWFzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NhbXBhXHUwMEYxYXMgZSBpbmljaWF0aXZhcyBkZSBtYXJrZXRpbmcnLFxuICAgIGZpZWxkczoge1xuICAgICAgY2FtcGFpZ25fY29kZTogeyBsYWJlbDogJ0NcdTAwRjNkaWdvIGRlIENhbXBhXHUwMEYxYScgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdUXHUwMEVEdHVsbyBNb3N0cmFkbycgfSxcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdOb21icmUgZGUgQ2FtcGFcdTAwRjFhJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwY2lcdTAwRjNuJyB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ1RpcG8gZGUgQ2FtcGFcdTAwRjFhJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGVtYWlsOiAnRW1haWwnLCB3ZWJpbmFyOiAnU2VtaW5hcmlvIFdlYicsIHRyYWRlX3Nob3c6ICdGZXJpYSBDb21lcmNpYWwnLFxuICAgICAgICAgIGNvbmZlcmVuY2U6ICdDb25mZXJlbmNpYScsIGRpcmVjdF9tYWlsOiAnQ29ycmVvIFBvc3RhbCcsIHNvY2lhbF9tZWRpYTogJ1JlZGVzIFNvY2lhbGVzJyxcbiAgICAgICAgICBjb250ZW50OiAnTWFya2V0aW5nIGRlIENvbnRlbmlkb3MnLCBwYXJ0bmVyOiAnTWFya2V0aW5nIGNvbiBTb2Npb3MnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNoYW5uZWw6IHtcbiAgICAgICAgbGFiZWw6ICdDYW5hbCBQcmluY2lwYWwnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZGlnaXRhbDogJ0RpZ2l0YWwnLCBzb2NpYWw6ICdSZWRlcyBTb2NpYWxlcycsIGVtYWlsOiAnRW1haWwnLFxuICAgICAgICAgIGV2ZW50czogJ0V2ZW50b3MnLCBwYXJ0bmVyOiAnU29jaW9zJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdFc3RhZG8nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcGxhbm5pbmc6ICdQbGFuaWZpY2FjaVx1MDBGM24nLCBpbl9wcm9ncmVzczogJ0VuIEN1cnNvJyxcbiAgICAgICAgICBjb21wbGV0ZWQ6ICdDb21wbGV0YWRhJywgYWJvcnRlZDogJ0NhbmNlbGFkYScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3RhcnRfZGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIEluaWNpbycgfSxcbiAgICAgIGVuZF9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgRmluJyB9LFxuICAgICAgYnVkZ2V0ZWRfY29zdDogeyBsYWJlbDogJ0Nvc3RvIFByZXN1cHVlc3RhZG8nIH0sXG4gICAgICBhY3R1YWxfY29zdDogeyBsYWJlbDogJ0Nvc3RvIFJlYWwnIH0sXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiB7IGxhYmVsOiAnSW5ncmVzb3MgUHJldmlzdG9zJyB9LFxuICAgICAgYWN0dWFsX3JldmVudWU6IHsgbGFiZWw6ICdJbmdyZXNvcyBSZWFsZXMnIH0sXG4gICAgICB0YXJnZXRfc2l6ZTogeyBsYWJlbDogJ1RhbWFcdTAwRjFvIE9iamV0aXZvJywgaGVscDogJ05cdTAwRkFtZXJvIG9iamV0aXZvIGRlIHByb3NwZWN0b3MvY29udGFjdG9zJyB9LFxuICAgICAgbnVtX3NlbnQ6IHsgbGFiZWw6ICdDYW50aWRhZCBFbnZpYWRhJyB9LFxuICAgICAgbnVtX3Jlc3BvbnNlczogeyBsYWJlbDogJ05cdTAwRkFtZXJvIGRlIFJlc3B1ZXN0YXMnIH0sXG4gICAgICBudW1fbGVhZHM6IHsgbGFiZWw6ICdOXHUwMEZBbWVybyBkZSBQcm9zcGVjdG9zJyB9LFxuICAgICAgbnVtX2NvbnZlcnRlZF9sZWFkczogeyBsYWJlbDogJ1Byb3NwZWN0b3MgQ29udmVydGlkb3MnIH0sXG4gICAgICBudW1fb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ09wb3J0dW5pZGFkZXMgQ3JlYWRhcycgfSxcbiAgICAgIG51bV93b25fb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ09wb3J0dW5pZGFkZXMgR2FuYWRhcycgfSxcbiAgICAgIHJlc3BvbnNlX3JhdGU6IHsgbGFiZWw6ICdUYXNhIGRlIFJlc3B1ZXN0YSAlJyB9LFxuICAgICAgcm9pOiB7IGxhYmVsOiAnUk9JICUnIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1Byb3BpZXRhcmlvIGRlIENhbXBhXHUwMEYxYScgfSxcbiAgICAgIGxhbmRpbmdfcGFnZV91cmw6IHsgbGFiZWw6ICdQXHUwMEUxZ2luYSBkZSBBdGVycml6YWplJyB9LFxuICAgICAgaXNfYWN0aXZlOiB7IGxhYmVsOiAnQWN0aXZvJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfY2FtcGFpZ25zOiB7IGxhYmVsOiAnVG9kYXMgbGFzIENhbXBhXHUwMEYxYXMnIH0sXG4gICAgICBjYW1wYWlnbl9nYW50dDogeyBsYWJlbDogJ1Byb2dyYW1hY2lcdTAwRjNuIGRlIENhbXBhXHUwMEYxYXMnIH0sXG4gICAgICBjYW1wYWlnbl9jYWxlbmRhcjogeyBsYWJlbDogJ0NhbGVuZGFyaW8gZGUgQ2FtcGFcdTAwRjFhcycgfSxcbiAgICAgIGNhbXBhaWduX3RpbWVsaW5lOiB7IGxhYmVsOiAnTFx1MDBFRG5lYSBkZSBUaWVtcG8gZGUgTWFya2V0aW5nJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gZGUgQ2FtcGFcdTAwRjFhJyB9LFxuICAgICAgc2NoZWR1bGU6IHsgbGFiZWw6ICdQcm9ncmFtYWNpXHUwMEYzbicgfSxcbiAgICAgIGJ1ZGdldDogeyBsYWJlbDogJ1ByZXN1cHVlc3RvIHkgUk9JJyB9LFxuICAgICAgbWV0cmljczogeyBsYWJlbDogJ1JlbmRpbWllbnRvJyB9LFxuICAgICAgLy8gRWwgaW5nbFx1MDBFOXMgZGUgZXN0ZSBncnVwbyBlcyBcdTAwQUJPd25lcnNoaXBcdTAwQkIsIG5vIFx1MDBBQkFzc2lnbm1lbnRcdTAwQkI6IGFncnVwYSBhbFxuICAgICAgLy8gcHJvcGlldGFyaW8gZGUgbGEgY2FtcGFcdTAwRjFhLCBpZ3VhbCBxdWUgYGNybV9hY2NvdW50Lm93bmVyc2hpcGAuXG4gICAgICBhc3NpZ25tZW50OiB7IGxhYmVsOiAnUHJvcGllZGFkJyB9LFxuICAgICAgYXNzZXRzOiB7IGxhYmVsOiAnUmVjdXJzb3MgZGUgQ2FtcGFcdTAwRjFhJyB9LFxuICAgIH0sXG4gICAgX2FjdGlvbnM6IHtcbiAgICAgIGVucm9sbF9sZWFkczoge1xuICAgICAgICBsYWJlbDogJ0luc2NyaWJpciBNaWVtYnJvcycsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnTWllbWJyb3MgZWxlZ2libGVzIGluc2NyaXRvcyBlbiBsYSBjYW1wYVx1MDBGMWEuJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX2NhbXBhaWduX21lbWJlcjoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgbGVhZF9vcl9jb250YWN0X3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdVbiBtaWVtYnJvIGRlIGNhbXBhXHUwMEYxYSBkZWJlIHJlZmVyZW5jaWFyIHVuIHByb3NwZWN0byBvIHVuIGNvbnRhY3RvJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ01pZW1icm8gZGUgQ2FtcGFcdTAwRjFhJyxcbiAgICBwbHVyYWxMYWJlbDogJ01pZW1icm9zIGRlIENhbXBhXHUwMEYxYScsXG4gICAgZGVzY3JpcHRpb246ICdQcm9zcGVjdG9zIHkgY29udGFjdG9zIGFsY2FuemFkb3MgcG9yIHVuYSBjYW1wYVx1MDBGMWEsIGNvbiBzdSBlc3RhZG8gZGUgcmVzcHVlc3RhJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIG1lbWJlcl9udW1iZXI6IHsgbGFiZWw6ICdOXHUwMEZBbWVybyBkZSBNaWVtYnJvJyB9LFxuICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnQ2FtcGFcdTAwRjFhJyB9LFxuICAgICAgY3JtX2xlYWQ6IHsgbGFiZWw6ICdQcm9zcGVjdG8nLCBoZWxwOiAnU2UgcmVsbGVuYSBjdWFuZG8gZWwgbWllbWJybyBlcmEgdW4gUHJvc3BlY3RvIGVuIGVsIG1vbWVudG8gZGUgbGEgaW5zY3JpcGNpXHUwMEYzbicgfSxcbiAgICAgIGNybV9jb250YWN0OiB7IGxhYmVsOiAnQ29udGFjdG8nLCBoZWxwOiAnU2UgcmVsbGVuYSBjdWFuZG8gZWwgbWllbWJybyBlcyB1biBDb250YWN0byBleGlzdGVudGUnIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdFc3RhZG8nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgc2VudDogJ0VudmlhZG8nLCByZXNwb25kZWQ6ICdSZXNwb25kaWRvJyxcbiAgICAgICAgICBjb252ZXJ0ZWQ6ICdDb252ZXJ0aWRvJywgdW5zdWJzY3JpYmVkOiAnRGFkbyBkZSBCYWphJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhZGRlZF9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgQWx0YScgfSxcbiAgICAgIHJlc3BvbnNlX2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBkZSBSZXNwdWVzdGEnIH0sXG4gICAgICBoYXNfcmVzcG9uZGVkOiB7IGxhYmVsOiAnSGEgUmVzcG9uZGlkbycgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIEJcdTAwRTFzaWNhJyB9LFxuICAgICAgcmVzcG9uc2U6IHsgbGFiZWw6ICdTZWd1aW1pZW50byBkZSBSZXNwdWVzdGEnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgbWFya19yZXNwb25kZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdNYXJjYXIgY29tbyBSZXNwb25kaWRvJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdSZXNwdWVzdGEgcmVnaXN0cmFkYSBlbiBlc3RlIG1pZW1icm8gZGUgY2FtcGFcdTAwRjFhLicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9uc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgVHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuaW1wb3J0IHsgYXBwU3VyZmFjZSB9IGZyb20gJy4vZXMtRVMvYXBwJztcbmltcG9ydCB7IGN1c3RvbWVyIH0gZnJvbSAnLi9lcy1FUy9vYmplY3RzLmN1c3RvbWVyJztcbmltcG9ydCB7IHBpcGVsaW5lIH0gZnJvbSAnLi9lcy1FUy9vYmplY3RzLnBpcGVsaW5lJztcbmltcG9ydCB7IGNvbW1lcmNlIH0gZnJvbSAnLi9lcy1FUy9vYmplY3RzLmNvbW1lcmNlJztcbmltcG9ydCB7IHNlcnZpY2UgfSBmcm9tICcuL2VzLUVTL29iamVjdHMuc2VydmljZSc7XG5pbXBvcnQgeyBhY3Rpdml0eSB9IGZyb20gJy4vZXMtRVMvb2JqZWN0cy5hY3Rpdml0eSc7XG5pbXBvcnQgeyBtYXJrZXRpbmcgfSBmcm9tICcuL2VzLUVTL29iamVjdHMubWFya2V0aW5nJztcblxuLyoqXG4gKiBFc3BhXHUwMEYxb2wgKGVzLUVTKSBcdTIwMTQgQ1JNIEFwcCBUcmFuc2xhdGlvbnNcbiAqXG4gKiBQZXItbG9jYWxlIGZpbGU6IG9uZSBmaWxlIHBlciBsYW5ndWFnZSwgZm9sbG93aW5nIHRoZSBgcGVyX2xvY2FsZWAgY29udmVudGlvbi5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqXG4gKiBUaGlzIGJ1bmRsZSB3YXMgb25lIGZpbGUgYW5kIGl0IGhhZCByZWFjaGVkIDg4LjYlIG9mIHRoZSAxMDBLQiBzb3VyY2UgY2FwXG4gKiBgcG5wbSBoeWdpZW5lYCBlbmZvcmNlcywgZ3Jvd2luZyB+MS4yS0IgYSBkYXkuIEl0IGlzIG5vdyBhc3NlbWJsZWQgZnJvbVxuICogYC4vPGxvY2FsZT4vYCwgb24gYW4gYXhpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiBndWVzc2VkOlxuICpcbiAqICAgLSBldmVyeSBuYW1lc3BhY2UgdGhhdCBpcyBOT1QgYG9iamVjdHNgIFx1MjAxNCBgYXBwc2AsIGBtZXNzYWdlc2AsXG4gKiAgICAgYGRhc2hib2FyZHNgLCBgZGF0YXNldHNgLCBgcGFnZXNgLCBhbmQgYW55IG5hbWVzcGFjZSBgVHJhbnNsYXRpb25EYXRhYFxuICogICAgIGdhaW5zIGxhdGVyIFx1MjAxNCBsaXZlcyBpbiBgYXBwLnRzYC4gTWVhc3VyZWQ6IHRob3NlIG5hbWVzcGFjZXMgdG9nZXRoZXJcbiAqICAgICBhcmUgdW5kZXIgYSBxdWFydGVyIG9mIHRoZSBidW5kbGUsIGFuZCB0aGUgc2NoZW1hIGJvdW5kcyBob3cgbWFueSBjYW5cbiAqICAgICBldmVyIGFycml2ZSwgc28gb25lIGZpbGUgaG9sZHMgdGhlbSB3aXRoIHJvb20gbGVmdDtcbiAqICAgLSBgb2JqZWN0c2AgaXMgNjktNzglIG9mIGV2ZXJ5IGJ1bmRsZSwgc28gaXQgaXMgcGFydGl0aW9uZWQgYWdhaW4sIG9uZVxuICogICAgIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5IFx1MjAxNCBgY3VzdG9tZXJgLCBgcGlwZWxpbmVgLCBgY29tbWVyY2VgLFxuICogICAgIGBzZXJ2aWNlYCwgYGFjdGl2aXR5YCwgYG1hcmtldGluZ2AgXHUyMDE0IGFuZCBhIERFVEFJTCBvYmplY3QgZm9sbG93cyBpdHNcbiAqICAgICBtYXN0ZXI6IGxpbmUgaXRlbXMgZm9sbG93IHRoZWlyIHF1b3RlIG9yIG9wcG9ydHVuaXR5LFxuICogICAgIGBjcm1fZXZlbnRfYXR0ZW5kZWVgIGZvbGxvd3MgYGNybV9ldmVudGAsIGBjcm1fY2FtcGFpZ25fbWVtYmVyYFxuICogICAgIGZvbGxvd3MgYGNybV9jYW1wYWlnbmAsIGBjcm1fYXJ0aWNsZV9mZWVkYmFja2AgZm9sbG93c1xuICogICAgIGBjcm1fa25vd2xlZGdlX2FydGljbGVgLlxuICpcbiAqIEEgbmFtZXNwYWNlIGF4aXMgQUxPTkUgd2FzIG1lYXN1cmVkIGFuZCByZWplY3RlZDogaXQgbGVhdmVzIGBvYmplY3RzYCBhdFxuICogNjUuN0tCLCAzLjlLQiB1bmRlciB0aGUgYWR2aXNvcnkgYmFuZCwgd2hpY2ggYG9iamVjdHNgIGdyb3d0aCBjcm9zc2VzIGluXG4gKiBhYm91dCBuaW5lIGRheXMuIFRoZSBmYW1pbHkgYXhpcyBwdXRzIHRoZSBsYXJnZXN0IHBhcnQgYXQgMjQuMiUgb2YgdGhlIGNhcC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgQSBuZXcgb2JqZWN0IHRyYW5zbGF0aW9uIGJlbG9uZ3MgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHkuIERvIG5vdCBhZGRcbiAqIGl0IHRvIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbiBcdTIwMTQgdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdFxuICogdGhlIGJhbmQsIHdoaWNoIGlzIHdoYXQgc3BsaXQgdGhpcyBidW5kbGUgaW4gdGhlIGZpcnN0IHBsYWNlLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBBIHZhbHVlIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSBmYW1pbHkgbGl2ZXMgaW4gYDxsb2NhbGU+L19zaGFyZWQudHNgLiBBXG4gKiB2YWx1ZSB1c2VkIGJ5IGV4YWN0bHkgb25lIGZhbWlseSBsaXZlcyBpbiB0aGF0IGZhbWlseSdzIGZpbGUuXG4gKlxuICogXHUyNkEwXHVGRTBGIFRoZSBrZXkgb3JkZXIgYmVsb3cgaXMgTE9BRC1CRUFSSU5HLCBub3QgY29zbWV0aWMuIGBvYmplY3RzdGFjayBidWlsZGBcbiAqIHNlcmlhbGlzZXMgdGhpcyBvYmplY3QgaW50byBgZGlzdC9vYmplY3RzdGFjay5qc29uYCBpbiBpbnNlcnRpb24gb3JkZXIgYW5kXG4gKiBuZXZlciBzb3J0cyBpdCwgc28gbGlzdGluZyB0aGUgcm93cyBoZXJlIFx1MjAxNCByYXRoZXIgdGhhbiBzcHJlYWRpbmcgdGhlIGZhbWlseVxuICogZmlsZXMgXHUyMDE0IGlzIHdoYXQga2VlcHMgdGhlIGJ1aWx0IGFydGlmYWN0IGJ5dGUtaWRlbnRpY2FsIGFjcm9zcyB0aGUgc3BsaXQuXG4gKiBUaGUgb3JkZXIgaXMgdGhpcyBidW5kbGUncyBvd24gaGlzdG9yaWNhbCBhY2NyZXRpb24gb3JkZXIgYW5kIGRpZmZlcnNcbiAqIGJldHdlZW4gbG9jYWxlczsgcmVvcmRlcmluZyBpdCByZXdyaXRlcyB0aGUgYXJ0aWZhY3QuXG4gKi9cbmV4cG9ydCBjb25zdCBlc0VTOiBUcmFuc2xhdGlvbkRhdGEgPSB7XG4gIG9iamVjdHM6IHtcbiAgICBjcm1fYWNjb3VudDogY3VzdG9tZXIuY3JtX2FjY291bnQsXG4gICAgY3JtX2NvbnRhY3Q6IGN1c3RvbWVyLmNybV9jb250YWN0LFxuICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogc2VydmljZS5jcm1fa25vd2xlZGdlX2FydGljbGUsXG4gICAgY3JtX2ZvcmVjYXN0OiBwaXBlbGluZS5jcm1fZm9yZWNhc3QsXG4gICAgY3JtX2xlYWQ6IHBpcGVsaW5lLmNybV9sZWFkLFxuICAgIGNybV9vcHBvcnR1bml0eTogcGlwZWxpbmUuY3JtX29wcG9ydHVuaXR5LFxuICAgIGNybV9jYXNlOiBzZXJ2aWNlLmNybV9jYXNlLFxuICAgIGNybV9jb250cmFjdDogY29tbWVyY2UuY3JtX2NvbnRyYWN0LFxuICAgIGNybV9wcm9kdWN0OiBjb21tZXJjZS5jcm1fcHJvZHVjdCxcbiAgICBjcm1fcXVvdGU6IGNvbW1lcmNlLmNybV9xdW90ZSxcbiAgICBjcm1fdGFzazogYWN0aXZpdHkuY3JtX3Rhc2ssXG4gICAgY3JtX2NhbXBhaWduOiBtYXJrZXRpbmcuY3JtX2NhbXBhaWduLFxuICAgIGNybV9ldmVudDogYWN0aXZpdHkuY3JtX2V2ZW50LFxuICAgIGNybV9ldmVudF9hdHRlbmRlZTogYWN0aXZpdHkuY3JtX2V2ZW50X2F0dGVuZGVlLFxuICAgIGNybV9hcnRpY2xlX2ZlZWRiYWNrOiBzZXJ2aWNlLmNybV9hcnRpY2xlX2ZlZWRiYWNrLFxuICAgIGNybV9jYW1wYWlnbl9tZW1iZXI6IG1hcmtldGluZy5jcm1fY2FtcGFpZ25fbWVtYmVyLFxuICAgIGNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW06IHBpcGVsaW5lLmNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW0sXG4gICAgY3JtX3F1b3RlX2xpbmVfaXRlbTogY29tbWVyY2UuY3JtX3F1b3RlX2xpbmVfaXRlbSxcbiAgfSxcbiAgLi4uYXBwU3VyZmFjZSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvY3JtLnRyYW5zbGF0aW9uLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9uc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvY3JtLnRyYW5zbGF0aW9uLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFRyYW5zbGF0aW9uQnVuZGxlIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcbmltcG9ydCB7IGVuIH0gZnJvbSAnLi9lbic7XG5pbXBvcnQgeyB6aENOIH0gZnJvbSAnLi96aC1DTic7XG5pbXBvcnQgeyBqYUpQIH0gZnJvbSAnLi9qYS1KUCc7XG5pbXBvcnQgeyBlc0VTIH0gZnJvbSAnLi9lcy1FUyc7XG5cbi8qKlxuICogQ1JNIEFwcCBcdTIwMTQgSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pXG4gKlxuICogRGVtb25zdHJhdGVzICoqcGVyLWxvY2FsZSBmaWxlIHNwbGl0dGluZyoqIGNvbnZlbnRpb246XG4gKiBlYWNoIGxhbmd1YWdlIGlzIGRlZmluZWQgaW4gaXRzIG93biBmaWxlIChgZW4udHNgLCBgemgtQ04udHNgLCBgamEtSlAudHNgLCBgZXMtRVMudHNgKVxuICogYW5kIGFzc2VtYmxlZCBpbnRvIGEgc2luZ2xlIGBUcmFuc2xhdGlvbkJ1bmRsZWAgaGVyZS5cbiAqXG4gKiBFbnRlcnByaXNlLWdyYWRlIG11bHRpLWxhbmd1YWdlIHRyYW5zbGF0aW9ucyBjb3ZlcmluZzpcbiAqIC0gQ29yZSBDUk0gb2JqZWN0czogQWNjb3VudCwgQ29udGFjdCwgTGVhZCwgT3Bwb3J0dW5pdHlcbiAqIC0gU2VsZWN0LWZpZWxkIG9wdGlvbiBsYWJlbHMgZm9yIGVhY2ggb2JqZWN0XG4gKiAtIEFwcCAmIG5hdmlnYXRpb24gZ3JvdXAgbGFiZWxzXG4gKiAtIENvbW1vbiBVSSBtZXNzYWdlcywgdmFsaWRhdGlvbiBtZXNzYWdlc1xuICpcbiAqIFN1cHBvcnRlZCBsb2NhbGVzOiBlbiwgemgtQ04sIGphLUpQLCBlcy1FU1xuICovXG5leHBvcnQgY29uc3QgQ3JtVHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbkJ1bmRsZSA9IHtcbiAgZW4sXG4gICd6aC1DTic6IHpoQ04sXG4gICdqYS1KUCc6IGphSlAsXG4gICdlcy1FUyc6IGVzRVMsXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3MvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3MvaW5kZXgudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogU2FsZXMgKHRoZSBhcHAgcGFja2FnZSkgdmlld3MgYmFycmVsLlxuICpcbiAqIFRoZSBkb2N0cmluZSBmb3IgdGhpcyBtZXRhZGF0YSB0eXBlIGlzIHdyaXR0ZW4gb25jZSwgaW5cbiAqIGBzcmMvc2FsZXMvdmlld3MvaW5kZXgudHNgOyB0aGlzIGZpbGUgaXMgdGhlIHNhbGVzIHBhY2thZ2UncyBoYWxmIG9mXG4gKiB0aGUgc2FtZSBmaWxlLWJ5LWZpbGUgcmVnaXN0cmF0aW9uLlxuICovXG5cbmV4cG9ydCB7IExlYWRWaWV3cyB9IGZyb20gJy4vbGVhZC52aWV3JztcbmV4cG9ydCB7IEFjY291bnRWaWV3cyB9IGZyb20gJy4vYWNjb3VudC52aWV3JztcbmV4cG9ydCB7IENvbnRhY3RWaWV3cyB9IGZyb20gJy4vY29udGFjdC52aWV3JztcbmV4cG9ydCB7IE9wcG9ydHVuaXR5Vmlld3MgfSBmcm9tICcuL29wcG9ydHVuaXR5LnZpZXcnO1xuZXhwb3J0IHsgVGFza1ZpZXdzIH0gZnJvbSAnLi90YXNrLnZpZXcnO1xuZXhwb3J0IHsgRXZlbnRWaWV3cyB9IGZyb20gJy4vZXZlbnQudmlldyc7XG5leHBvcnQgeyBFdmVudEF0dGVuZGVlVmlld3MgfSBmcm9tICcuL2V2ZW50X2F0dGVuZGVlLnZpZXcnO1xuZXhwb3J0IHsgRm9yZWNhc3RWaWV3cyB9IGZyb20gJy4vZm9yZWNhc3Qudmlldyc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy92aWV3cy9sZWFkLnZpZXcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3MvbGVhZC52aWV3LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcbmltcG9ydCB7IERVUExJQ0FURV9PRl9UWVBFX0FVVEhPUkFCTEVfT1BUSU9OUyB9IGZyb20gJy4uL29iamVjdHMvX3BpY2tsaXN0cyc7XG5cbi8qKlxuICogXHUyNTUwXHUyNTUwXHUyNTUwIEhPVVNFIFJVTEU6IGZvcm0gcHJlZGljYXRlcyBhcmUgYHJlY29yZC5gLWJvdW5kIEFORCBUT1RBTCBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcbiAqXG4gKiBFdmVyeSBgdmlzaWJsZU9uYCAvIGB2aXNpYmxlV2hlbmAgYmVsb3cgaXMgYSBDRUwgcHJlZGljYXRlIHRoZSAqcmVuZGVyZXIqXG4gKiBldmFsdWF0ZXMsIGFuZCBpdCBtdXN0IHNhdGlzZnkgdHdvIHByb3BlcnRpZXMuIGB0ZXN0L3ZpZXctcHJlZGljYXRlLWRpYWxlY3QudGVzdC50c2BcbiAqIGVuZm9yY2VzIGJvdGggYWdhaW5zdCB0aGUgY29tcGlsZWQgc3RhY2ssIHNvIHlvdSBkbyBub3QgaGF2ZSB0byByZW1lbWJlciB0aGVtLlxuICpcbiAqIDEuICoqYHJlY29yZC5gLWJvdW5kLioqIFRoZSBldmFsdWF0aW9uIGNvbnRleHQgYmluZHMgZmllbGQgdmFsdWVzIHVuZGVyIHRoZVxuICogICAgYHJlY29yZGAgbmFtZXNwYWNlIChgYnVpbGRTY29wZWAgaW4gYEBvYmplY3RzdGFjay9mb3JtdWxhYCBiaW5kcyBleGFjdGx5XG4gKiAgICBgcmVjb3JkYCAvIGBwcmV2aW91c2AgLyBgaW5wdXRgIC8gYHVzZXJgIC8gYGN1cnJlbnRfdXNlcmAgLyBgY3R4YCAvIGBvc2ApLlxuICogICAgQSBiYXJlIGZpZWxkIG5hbWUgaXMgYW4gdW5ib3VuZCBpZGVudGlmaWVyLCBzbyBpdCBuZXZlciBldmFsdWF0ZXM6XG4gKlxuICogICAgICAgIGV2YWx1YXRlKCdzdGF0dXMgPT0gXCJ1bnF1YWxpZmllZFwiJywgICAgICAgIHsgcmVjb3JkOiB7IHN0YXR1czogJ25ldycgfSB9KVxuICogICAgICAgICAgXHUyMTkyIG9rOmZhbHNlICB0eXBlICBcIlVua25vd24gdmFyaWFibGU6IHN0YXR1c1wiICAgICAgIFx1MjE5MCBmb3IgRVZFUlkgcmVjb3JkXG4gKiAgICAgICAgZXZhbHVhdGUoJ3JlY29yZC5zdGF0dXMgPT0gXCJ1bnF1YWxpZmllZFwiJywgeyByZWNvcmQ6IHsgc3RhdHVzOiAnbmV3JyB9IH0pXG4gKiAgICAgICAgICBcdTIxOTIgb2s6dHJ1ZSAgIGZhbHNlXG4gKlxuICogMi4gKipUT1RBTCoqIFx1MjAxNCB0aGUgc2FtZSBgaGFzKHJlY29yZC54KWAgcnVsZSBBR0VOVFMubWQgc3RhdGVzIGZvclxuICogICAgYHZhbGlkYXRpb25zW10uY29uZGl0aW9uYCAvIGByZXF1aXJlZFdoZW5gIC8gYHJlYWRvbmx5V2hlbmAgLyBgdmlzaWJsZVdoZW5gXG4gKiAgICAoIzYzMCkuIFByZWZpeGluZyBhbG9uZSBpcyBub3QgZW5vdWdoOiBvbiBhICpicmFuZC1uZXcqIHJlY29yZCB0aGUga2V5IGlzXG4gKiAgICBhYnNlbnQsIGFuZCBzdHJpY3QgQ0VMIGFib3J0cyBvbiB0aGUgcmVhZDpcbiAqXG4gKiAgICAgICAgZXZhbHVhdGUoJ3JlY29yZC5kdXBsaWNhdGVfb2ZfdHlwZSA9PSBcImNybV9sZWFkXCInLCAgICAgICAgICAgICAgICB7IHJlY29yZDoge30gfSlcbiAqICAgICAgICAgIFx1MjE5MiBvazpmYWxzZSAgXCJObyBzdWNoIGtleTogZHVwbGljYXRlX29mX3R5cGVcIlxuICogICAgICAgIGV2YWx1YXRlKCdoYXMocmVjb3JkLmR1cGxpY2F0ZV9vZl90eXBlKSAmJiByZWNvcmQuZHVwbGljYXRlX29mX3R5cGUgPT0gXCJjcm1fbGVhZFwiJyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlY29yZDoge30gfSlcbiAqICAgICAgICAgIFx1MjE5MiBvazp0cnVlICAgZmFsc2VcbiAqXG4gKiBXaHkgYm90aCBtYXR0ZXIgaGVyZSBhbmQgbm90IG9ubHkgaW4gdGhlb3J5ICgjNjg4KTogdGhlIGNvbnNvbGUncyBwcmVkaWNhdGVcbiAqIGV2YWx1YXRpb24gKipmYWlscyBPUEVOKiogXHUyMDE0IGFuIHVuZXZhbHVhYmxlIGB2aXNpYmxlV2hlbmAgZGVmYXVsdHMgdGhlIGZpZWxkIHRvXG4gKiAqdmlzaWJsZSosIHdpdGggbm8gZGlhZ25vc3RpYyBcdTIwMTQgYW5kIGEgdmlzaWJsZSBmaWVsZCBjYXJyaWVzIGl0cyBgcmVxdWlyZWQ6IHRydWVgXG4gKiBpbnRvIGNsaWVudC1zaWRlIHN1Ym1pdCB2YWxpZGF0aW9uLiBTbyBhIHByZWRpY2F0ZSB0aGF0IGNhbm5vdCBhbnN3ZXIgZG9lcyBub3RcbiAqIGRlZ3JhZGUgdG8gXCJzaG93biBidXQgb3B0aW9uYWxcIjsgaXQgbWFrZXMgdGhlIGZvcm0gdW5zYXRpc2ZpYWJsZS4gT24gYGNybV9sZWFkYFxuICogdGhpcyByZW5kZXJlZCBhbGwgZml2ZSBjb25kaXRpb25hbCBkaXNxdWFsaWZpY2F0aW9uIGZpZWxkcyBhdCBvbmNlIGFuZCBkZW1hbmRlZFxuICogYSBuZXcgbGVhZCBiZSBhIGR1cGxpY2F0ZSBvZiAqYm90aCogYSBsZWFkIGFuZCBhIGNvbnRhY3QgXHUyMDE0IG11dHVhbGx5IGV4Y2x1c2l2ZSBieVxuICogZGVzaWduIFx1MjAxNCBzbyBubyBsZWFkIGNvdWxkIGJlIGNyZWF0ZWQgdGhyb3VnaCB0aGUgVUkgYXQgYWxsLiBUaGUgZmFpbC1vcGVuIGhhbGZcbiAqIGlzIHRyYWNrZWQgdXBzdHJlYW0gYXQgb2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjNTE0OTsgdGhlc2UgcHJlZGljYXRlcyBhcmUgdGhlXG4gKiBoYWxmIHRoaXMgcmVwbyBvd25zLCBhbmQgdGhleSBtdXN0IGJlIGFibGUgdG8gYW5zd2VyLlxuICpcbiAqIE51bWVyaWMgY29tcGFyaXNvbnMgY2FycnkgYCE9IG51bGxgIG9uIHRvcCBvZiBgaGFzKC4uLilgLCBtYXRjaGluZyB0aGUgb2JqZWN0XG4gKiBmaWxlczogYGhhcyhyZWNvcmQucmF0aW5nKSAmJiByZWNvcmQucmF0aW5nICE9IG51bGwgJiYgcmVjb3JkLnJhdGluZyA+PSA0YC5cbiAqIFN0cmljdCBDRUwgYWJvcnRzIG9uIGBkeW48bnVsbD4gPCBpbnRgLCB3aGljaCBgaGFzKClgIGFsb25lIGRvZXMgbm90IHByZXZlbnQuXG4gKi9cblxuLyoqXG4gKiBUaGUgZHVwbGljYXRlLWxpbmsgYmxvY2sgKCM1OTgpLCBzcHJlYWQgaW50byBldmVyeSBmb3JtIHRoYXQgb2ZmZXJzXG4gKiBgZGlzcXVhbGlmaWNhdGlvbl9yZWFzb25gLlxuICpcbiAqIGBkdXBsaWNhdGVfZGlzcXVhbGlmaWNhdGlvbl9yZXF1aXJlc19zdXJ2aXZvcmAgb24gYGNybV9sZWFkYCByZWplY3RzIGEgbGVhZFxuICogY2xvc2VkIGFzIFwiRHVwbGljYXRlXCIgdGhhdCBkb2VzIG5vdCBuYW1lIHRoZSByZWNvcmQgaXQgZHVwbGljYXRlcyBhbmQgY29uZmlybVxuICogdGhlIG1hdGNoLiBTbyB0aGUgc2FtZSBydWxlIHRoZSBgZGlzcXVhbGlmaWNhdGlvbl9yZWFzb25gIGZpZWxkIGl0c2VsZiBmb2xsb3dzXG4gKiBhcHBsaWVzIG9uZSBsZXZlbCBkb3duOiBhIGZvcm0gdGhhdCBsZXRzIGEgdXNlciBQSUNLIFwiRHVwbGljYXRlXCIgbXVzdCBhbHNvIGxldFxuICogdGhlbSBzYXRpc2Z5IGl0LCBvciB0aGUgc2F2ZSBmYWlscyB3aXRoIGFuIGVycm9yIHRoZSBmb3JtIGdpdmVzIG5vIHdheSB0b1xuICogY2xlYXIuIERlY2xhcmVkIG9uY2UgYW5kIHJldXNlZCByYXRoZXIgdGhhbiByZXR5cGVkIGVpZ2h0IHRpbWVzIFx1MjAxNCB0aGUgY29waWVzXG4gKiB3b3VsZCBkcmlmdCwgYW5kIGEgZm9ybSB0aGF0IHF1aWV0bHkgbG9zdCB0aGUgYmxvY2sgaXMgZXhhY3RseSB0aGUgZmFpbHVyZVxuICogdGhpcyBzaGFwZSBpcyBtZWFudCB0byBtYWtlIGltcG9zc2libGUuXG4gKlxuICogVGhlIHR3byBsb29rdXBzIG1pcnJvciB0aGUgb2JqZWN0J3MgYHJlcXVpcmVkV2hlbmAgcHJlZGljYXRlczogZWFjaCBhcHBlYXJzXG4gKiBvbmx5IHdoZW4gYGR1cGxpY2F0ZV9vZl90eXBlYCBuYW1lcyBpdHMgb2JqZWN0IFx1MjAxNCBhbmQgbm93IHNheXMgc28gaW4gdGhlIHNhbWVcbiAqIHdvcmRzLCBjaGFyYWN0ZXIgZm9yIGNoYXJhY3RlciBhcyB0aGUgYHJlcXVpcmVkV2hlbmAgb24gdGhvc2UgdHdvIGZpZWxkcyBpblxuICogYGxlYWQub2JqZWN0LnRzYCwgc28gdGhlIGZvcm0gc2hvd3MgYSBsb29rdXAgZXhhY3RseSB3aGVuIHRoZSBzZXJ2ZXIgd2lsbFxuICogZGVtYW5kIGl0LiBgdGVzdC92aWV3LXByZWRpY2F0ZS1kaWFsZWN0LnRlc3QudHNgIHBpbnMgdGhlIHR3byB0b2dldGhlci5cbiAqL1xuY29uc3QgRFVQTElDQVRFX0xJTktfRklFTERTID0gW1xuICB7XG4gICAgZmllbGQ6ICdkdXBsaWNhdGVfb2ZfdHlwZScsXG4gICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgLy8gVGhlIHBpY2tlciBvZmZlcnMgdGhlIEFVVEhPUkFCTEUgaGFsZiBvZiB0aGUgdm9jYWJ1bGFyeSBvbmx5ICgjMTE2NCkuXG4gICAgLy8gYGNybV9sZWFkLmR1cGxpY2F0ZV9vZl90eXBlYCBhbHNvIGFjY2VwdHMgYGVyYXNlZGAsIGEgdG9tYnN0b25lXG4gICAgLy8gYGxlYWRfZHVwbGljYXRlX2NoZWNrYCBzdGFtcHMgd2hlbiB0aGUgZW5naW5lJ3MgcmVmZXJlbmNlIGNsZWFudXAgbnVsbHNcbiAgICAvLyB0aGUgcG9pbnRlciBcdTIwMTQgXCJjb25maXJtZWQgZHVwbGljYXRlIG9mIGEgcmVjb3JkIHRoYXQgaGFzIHNpbmNlIGJlZW5cbiAgICAvLyBlcmFzZWRcIi4gTm9ib2R5IGF1dGhvcnMgdGhhdDogaXQgaXMgYW4gb2JzZXJ2YXRpb24gYWJvdXQgYSBkZWxldGlvbiB0aGF0XG4gICAgLy8gYWxyZWFkeSBoYXBwZW5lZCwgYW5kIG9mZmVyaW5nIGl0IHdvdWxkIGxldCBhIHJldmlld2VyIGNsb3NlIGEgbGVhZCBhcyBhXG4gICAgLy8gZHVwbGljYXRlIG9mIG5vdGhpbmcgd2hpbGUgc2F0aXNmeWluZyBldmVyeSBydWxlIHRoYXQgZXhpc3RzIHRvIHN0b3BcbiAgICAvLyBleGFjdGx5IHRoYXQuIE5hcnJvd2luZyBoZXJlIHJhdGhlciB0aGFuIGRlbGV0aW5nIHRoZSB2YWx1ZSBpcyB0aGUgcG9pbnRcbiAgICAvLyBcdTIwMTQgdGhlIHJlY29yZCBjYW4gc3RpbGwgU0FZIGl0LCBhbmQgdGhlIGZpZWxkIGtlZXBzIGl0cyBsYWJlbCBpbiBhbGwgZm91clxuICAgIC8vIGxvY2FsZXMsIHNvIGEgdG9tYnN0b25lZCBsZWFkIHJlYWRzIGFzIFwiRXJhc2VkIFJlY29yZFwiIG9uIHRoZSBkZXRhaWwgcGFnZVxuICAgIC8vIGluc3RlYWQgb2YgYXMgYSByYXcgZW51bSBub2JvZHkgY2FuIGV4cGxhaW4uXG4gICAgLy9cbiAgICAvLyBTcHJlYWQgZnJvbSBgX3BpY2tsaXN0cy50c2AgcmF0aGVyIHRoYW4gcmV0eXBlZDogdGhlIGF1dGhvcmFibGUgc2V0IGlzXG4gICAgLy8gdGhlIHNvdXJjZSBib3RoIGxpc3RzIGRlcml2ZSBmcm9tLCBzbyBhIGZ1dHVyZSBvYmplY3QgdHlwZSBhZGRlZCB0aGVyZVxuICAgIC8vIHJlYWNoZXMgdGhpcyBwaWNrZXIgYXV0b21hdGljYWxseSBhbmQgdGhlIHRvbWJzdG9uZSBuZXZlciBjYW4uXG4gICAgb3B0aW9uczogWy4uLkRVUExJQ0FURV9PRl9UWVBFX0FVVEhPUkFCTEVfT1BUSU9OU10sXG4gICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24pICYmIHJlY29yZC5kaXNxdWFsaWZpY2F0aW9uX3JlYXNvbiA9PSBcImR1cGxpY2F0ZVwiYCxcbiAgfSxcbiAge1xuICAgIGZpZWxkOiAnZHVwbGljYXRlX29mX2xlYWQnLFxuICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIHZpc2libGVPbjogUGBoYXMocmVjb3JkLmR1cGxpY2F0ZV9vZl90eXBlKSAmJiByZWNvcmQuZHVwbGljYXRlX29mX3R5cGUgPT0gXCJjcm1fbGVhZFwiYCxcbiAgfSxcbiAge1xuICAgIGZpZWxkOiAnZHVwbGljYXRlX29mX2NvbnRhY3QnLFxuICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIHZpc2libGVPbjogUGBoYXMocmVjb3JkLmR1cGxpY2F0ZV9vZl90eXBlKSAmJiByZWNvcmQuZHVwbGljYXRlX29mX3R5cGUgPT0gXCJjcm1fY29udGFjdFwiYCxcbiAgfSxcbiAge1xuICAgIGZpZWxkOiAnZHVwbGljYXRlX3N0YXR1cycsXG4gICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24pICYmIHJlY29yZC5kaXNxdWFsaWZpY2F0aW9uX3JlYXNvbiA9PSBcImR1cGxpY2F0ZVwiYCxcbiAgICBoZWxwVGV4dDogJ0NvbmZpcm1lZCBtZWFucyBhIGh1bWFuIGNoZWNrZWQgdGhlIHR3byByZWNvcmRzIGFuZCB0aGV5IGFyZSB0aGUgc2FtZSBwZXJzb24uJyxcbiAgfSxcbl07XG5cbi8qKlxuICogTGVhZCBWaWV3cyAtIENvbXByZWhlbnNpdmUgVUkgU2hvd2Nhc2VcbiAqIFxuICogVGhpcyBmaWxlIGRlbW9uc3RyYXRlczpcbiAqIDEuIEFsbCA2IEZvcm1WaWV3IGxheW91dCB0eXBlcyAoc2ltcGxlLCB0YWJiZWQsIHdpemFyZCwgc3BsaXQsIGRyYXdlciwgbW9kYWwpXG4gKiAyLiBTZWN0aW9uIGZlYXR1cmVzIChjb2xsYXBzaWJsZSwgMS00IGNvbHVtbiBsYXlvdXRzKVxuICogMy4gRmllbGQtbGV2ZWwgY29udHJvbHMgKHJlYWRvbmx5LCByZXF1aXJlZCwgaGlkZGVuLCBzcGFuLCB2aXNpYmxlT24sIGRlcGVuZHNPbiwgY3VzdG9tIHdpZGdldClcbiAqIDQuIE11bHRpcGxlIG5hbWVkIGZvcm1WaWV3cyBmb3IgZGlmZmVyZW50IHNjZW5hcmlvc1xuICogNS4gVmFyaW91cyBsaXN0IHZpZXcgdHlwZXNcbiAqL1xuZXhwb3J0IGNvbnN0IExlYWRWaWV3cyA9IGRlZmluZVZpZXcoe1xuICAvKipcbiAgICogRGVmYXVsdCBMaXN0IFZpZXcgLSBHcmlkIHdpdGggQWR2YW5jZWQgRmVhdHVyZXNcbiAgICovXG4gIGxpc3Q6IHtcbiAgICB0eXBlOiAnZ3JpZCcsXG4gICAgbmFtZTogJ2FsbF9sZWFkcycsXG4gICAgbGFiZWw6ICdBbGwgTGVhZHMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7XG4gICAgICBwcm92aWRlcjogJ29iamVjdCcsXG4gICAgICBvYmplY3Q6ICdjcm1fbGVhZCcsXG4gICAgfSxcbiAgICBcbiAgICAvLyBDb2x1bW4gQ29uZmlndXJhdGlvbiB3aXRoIEVuaGFuY2VkIEZlYXR1cmVzXG4gICAgY29sdW1uczogW1xuICAgICAge1xuICAgICAgICAvLyBPbmUgbmFtZSBjb2x1bW4sIG5vdCB0d28uIFNwbGl0dGluZyBmaXJzdC9sYXN0IHNwZW50IDMwMHB4IHRvIHNheVxuICAgICAgICAvLyB3aGF0IFwiQWxpY2UgTWFydGluZXpcIiBzYXlzIGluIG9uZSwgYW5kIGh1bmcgdGhlIHJlY29yZCBsaW5rIG9mZiB0aGVcbiAgICAgICAgLy8gZ2l2ZW4gbmFtZSBhbG9uZSBcdTIwMTQgc28gb3BlbmluZyBhIHBlcnNvbiBtZWFudCBhaW1pbmcgYXQgdGhlaXIgZmlyc3RcbiAgICAgICAgLy8gbmFtZSBzcGVjaWZpY2FsbHkuXG4gICAgICAgIGZpZWxkOiAnZnVsbF9uYW1lJyxcbiAgICAgICAgbGFiZWw6ICdOYW1lJyxcbiAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICAgIGxpbms6IHRydWUsIC8vIFByaW1hcnkgbmF2aWdhdGlvbiBsaW5rXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBmaWVsZDogJ2NvbXBhbnknLFxuICAgICAgICBsYWJlbDogJ0NvbXBhbnknLFxuICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZpZWxkOiAnZW1haWwnLFxuICAgICAgICBsYWJlbDogJ0VtYWlsJyxcbiAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZpZWxkOiAnc3RhdHVzJyxcbiAgICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgICB3aWR0aDogMTIwLFxuICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZpZWxkOiAncmF0aW5nJyxcbiAgICAgICAgbGFiZWw6ICdTY29yZScsXG4gICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgIGFsaWduOiAnY2VudGVyJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZpZWxkOiAnbGVhZF9zb3VyY2UnLFxuICAgICAgICBsYWJlbDogJ1NvdXJjZScsXG4gICAgICAgIHdpZHRoOiAxMjAsXG4gICAgICB9LFxuICAgICAgLy8gUkVRLTAwMDUgYWNjZXB0YW5jZSAxOiB3aGF0IHRoZSBwcm9zcGVjdCB3YW50cyBhbmQgd2hhdCBpdCBpcyB3b3J0aCxcbiAgICAgIC8vIG9uIHRoZSByb3N0ZXIgYSByZXAgb3BlbnMgZXZlcnkgbW9ybmluZy4gQ29sdW1ucyBhcmUgYWxzbyB3aGF0IHRoZVxuICAgICAgLy8gbGlzdCdzIG93biBmaWx0ZXIgYW5kIGdyb3VwaW5nIGNvbnRyb2xzIG9mZmVyLCB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZVxuICAgICAgLy8gdHdvIEZJTFRFUkFCTEUgYW5kIEdST1VQQUJMRSBoZXJlIHJhdGhlciB0aGFuIG9ubHkgcmVhZGFibGUgXHUyMDE0IHRoZSBzYW1lXG4gICAgICAvLyByZWFkaW5nIGBjb250YWN0LnZpZXcudHNgIHJlY29yZHMgZm9yIHRoZSBidXlpbmctY2VudHJlIGNvbHVtbnMuXG4gICAgICAvLyBgbmVlZF90eXBlYCBpcyBzaW5nbGUtdmFsdWVkIGZvciBleGFjdGx5IHRoYXQgcmVhc29uIChzZWVcbiAgICAgIC8vIGBfcGlja2xpc3RzLnRzYCk6IGEgZ3JvdXBlZCBsaXN0IGFuc3dlcnMgd2l0aCBvbmUgYWdncmVnYXRlIHBlciByYXdcbiAgICAgIC8vIHN0b3JlZCB2YWx1ZSwgc28gYSBtdWx0aS12YWx1ZWQgY29sdW1uIHdvdWxkIGdyb3VwIGJ5IHRoZSBjb21iaW5hdGlvbi5cbiAgICAgIHtcbiAgICAgICAgZmllbGQ6ICduZWVkX3R5cGUnLFxuICAgICAgICBsYWJlbDogJ05lZWQgVHlwZScsXG4gICAgICAgIHdpZHRoOiAxNjAsXG4gICAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmllbGQ6ICdlc3RpbWF0ZWRfYW1vdW50JyxcbiAgICAgICAgbGFiZWw6ICdFc3QuIEFtb3VudCcsXG4gICAgICAgIHdpZHRoOiAxMzAsXG4gICAgICAgIGFsaWduOiAncmlnaHQnLFxuICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZpZWxkOiAnb3duZXJfaWQnLFxuICAgICAgICBsYWJlbDogJ093bmVyJyxcbiAgICAgICAgd2lkdGg6IDE1MCxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBcbiAgICBzb3J0OiBbXG4gICAgICB7IGZpZWxkOiAnY3JlYXRlZF9hdCcsIG9yZGVyOiAnZGVzYycgfVxuICAgIF0sXG4gICAgXG4gICAgLy8gQSByb3cgY2xpY2sgb3BlbnMgdGhlIHJlY29yZCBwYWdlLiBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm9cbiAgICAvLyBgbmF2aWdhdGlvbi52aWV3YCBoZXJlOiBtZWFzdXJlZCBpbiB0aGUgYnJvd3NlciBvbiBjb25zb2xlIDE3LjMuMFxuICAgIC8vICgjMTcxNiksIHRoZSBrZXkgaXMgbm90IHJlc29sdmVkIGFzIGEgZm9ybS12aWV3IG5hbWUuIFRoZSBuYXZpZ2F0aW9uXG4gICAgLy8gaG9vayByZWFkcyBpdCBpbnRvIHRoZSBTRUNPTkQgYXJndW1lbnQgb2YgYG9uTmF2aWdhdGVgIFx1MjAxNCB0aGUgc2xvdCB0aGF0XG4gICAgLy8gb3RoZXJ3aXNlIGNhcnJpZXMgdGhlIGxpdGVyYWwgbW9kZSBzdHJpbmcsIGByKHQsIGQgPz8gJ3ZpZXcnKWAgXHUyMDE0IHNvIGl0XG4gICAgLy8gbmFtZWQgbm90aGluZyBhbmQgc2VsZWN0ZWQgbm90aGluZy4gVGhlIHJlY29yZCBwYWdlIGhlcmUgaXMgcmVuZGVyZWQgYnlcbiAgICAvLyBgbGVhZF9kZXRhaWxfcGFnZWAgKGBzcmMvc2FsZXMvcGFnZXMvbGVhZF9kZXRhaWwucGFnZS50c2ApLCBub3QgYnkgYSBuYW1lZFxuICAgIC8vIGZvcm0gdmlldywgYW5kIGNsaWNraW5nIGEgcm93IGJlaGF2ZWQgaWRlbnRpY2FsbHkgd2l0aCB0aGUga2V5IHByZXNlbnQsXG4gICAgLy8gd2l0aCBpdCBhYnNlbnQsIGFuZCBvbiBhIGxpc3QgdGhhdCBuZXZlciBkZWNsYXJlZCBpdC4gYGRldGFpbF9mb3JtYFxuICAgIC8vIGJlbG93IHN0YXlzOiBpdCBpcyB0aGlzIGZpbGUncyBvbmUgVEFCQkVEIGxheW91dCBleGFtcGxlLCBhbmQgaXQgd2FzXG4gICAgLy8gYWxyZWFkeSByZWFjaGFibGUgYnkgbm8gcGF0aC5cbiAgICBuYXZpZ2F0aW9uOiB7XG4gICAgICBtb2RlOiAncGFnZScsXG4gICAgfSxcbiAgICBcbiAgICAvLyBgY29udmVydF9sZWFkYCAvIGBzY2hlZHVsZV9mb2xsb3d1cGAgZGVjbGFyZSBgbG9jYXRpb25zOiBbJ2xpc3RfaXRlbSddYFxuICAgIC8vIGFuZCBhcmUgYXV0by1pbmplY3RlZCBpbnRvIHRoZSBtZW51LiBEbyBub3QgYWRkIHN0cmluZ3MgaGVyZTogdGhlIGxlZ2FjeVxuICAgIC8vIHJvd0FjdGlvbnMgc3VyZmFjZSBvbmx5IGRpc3BhdGNoZXMgZGVmaW5lZCBzdGFjayBhY3Rpb25zLlxuICAgIC8vIEJ1aWx0LWluIGBleHBvcnRPcHRpb25zYCBjb3ZlcnMgQ1NWIGV4cG9ydDsgbm8gZXhwb3J0IGFjdGlvbiBuZWVkZWQuXG4gICAgYnVsa0FjdGlvbnM6IFsnY3JlYXRlX2NhbXBhaWduJ10sXG4gICAgXG4gICAgLy8gRmVhdHVyZXNcbiAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiAyNSwgcGFnZVNpemVPcHRpb25zOiBbMTAsIDI1LCA1MCwgMTAwXSB9LFxuICAgIHJvd0hlaWdodDogJ21lZGl1bScsXG4gICAgZXhwb3J0T3B0aW9uczogeyBmb3JtYXRzOiBbJ2NzdicsICd4bHN4J10gfSxcbiAgICBcbiAgICAvLyBFbXB0eSBTdGF0ZVxuICAgIGVtcHR5U3RhdGU6IHtcbiAgICAgIHRpdGxlOiAnTm8gTGVhZHMgWWV0JyxcbiAgICAgIG1lc3NhZ2U6ICdHZXQgc3RhcnRlZCBieSBjcmVhdGluZyB5b3VyIGZpcnN0IGxlYWQnLFxuICAgICAgaWNvbjogJ3VzZXItcGx1cycsXG4gICAgfSxcbiAgfSxcbiAgXG4gIC8qKlxuICAgKiBEZWZhdWx0IEZvcm0gVmlldyAtIFNJTVBMRSBMYXlvdXRcbiAgICogQmFzaWMgc2VjdGlvbmVkIGZvcm0gd2l0aCBjb2xsYXBzaWJsZSBzZWN0aW9ucyBhbmQgY29sdW1uIGxheW91dHNcbiAgICovXG4gIGZvcm06IHtcbiAgICB0eXBlOiAnc2ltcGxlJyxcbiAgICBcbiAgICBzZWN0aW9uczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnY29udGFjdF9pbmZvcm1hdGlvbicsXG4gICAgICAgIGxhYmVsOiAnQ29udGFjdCBJbmZvcm1hdGlvbicsXG4gICAgICAgIGNvbGxhcHNpYmxlOiB0cnVlLFxuICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgICAgICBjb2x1bW5zOiAyLCAvLyAyLWNvbHVtbiBsYXlvdXRcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmllbGQ6ICdzYWx1dGF0aW9uJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnZmlyc3RfbmFtZScsXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnbGFzdF9uYW1lJyxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgc3BhbjogJ2Z1bGwnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2NvbXBhbnknLFxuICAgICAgICAgICd0aXRsZScsXG4gICAgICAgICAgJ2VtYWlsJyxcbiAgICAgICAgICAncGhvbmUnLFxuICAgICAgICAgICdtb2JpbGUnLFxuICAgICAgICAgICd3ZWJzaXRlJyxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdsZWFkX2NsYXNzaWZpY2F0aW9uJyxcbiAgICAgICAgbGFiZWw6ICdMZWFkIENsYXNzaWZpY2F0aW9uJyxcbiAgICAgICAgY29sbGFwc2libGU6IHRydWUsXG4gICAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgICAgIGNvbHVtbnM6IDMsIC8vIDMtY29sdW1uIGxheW91dFxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmaWVsZDogJ3N0YXR1cycsXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAncmF0aW5nJyxcbiAgICAgICAgICAgIHdpZGdldDogJ3N0YXJfcmF0aW5nJywgLy8gQ3VzdG9tIHdpZGdldFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2xlYWRfc291cmNlJyxcbiAgICAgICAgICAnaW5kdXN0cnknLFxuICAgICAgICAgIC8vIE9mZmVyZWQsIFx1MjZENCBub3QgYHJlcXVpcmVkYCAoIzIwOTcpOiBhbiBpbnNlcnQgdGhhdCBsZWF2ZXMgaXQgZW1wdHkgaXNcbiAgICAgICAgICAvLyBzdGFtcGVkIHRvIHRoZSBjcmVhdG9yIGJ5IHRoZSBwbGF0Zm9ybSAoc2VlIGBsZWFkLmhvb2sudHNgKSwgc28gYVxuICAgICAgICAgIC8vIHJlcCdzIG5ldyBsZWFkIGlzIHRoZWlycyB3aXRob3V0IGEgcGljaywgYW5kIGEgbWFuYWdlciBjYW4gc3RpbGxcbiAgICAgICAgICAvLyBjaG9vc2UgYW5vdGhlciBvd25lci4gYHJlcXVpcmVkYCBibG9ja2VkIHRoYXQgc2F2ZSBjbGllbnQtc2lkZS5cbiAgICAgICAgICAnb3duZXJfaWQnLFxuICAgICAgICAgIC8vIGBkaXNxdWFsaWZpY2F0aW9uX3JlYXNvbmAgaXMgZW5mb3JjZWQgYnkgdGhlXG4gICAgICAgICAgLy8gYGRpc3F1YWxpZmljYXRpb25fcmVhc29uX3JlcXVpcmVkYCB2YWxpZGF0aW9uIG9uIGNybV9sZWFkLCBzbyBldmVyeVxuICAgICAgICAgIC8vIGZvcm0gdGhhdCBsZXRzIGEgdXNlciBwaWNrIFwiVW5xdWFsaWZpZWRcIiBtdXN0IGFsc28gb2ZmZXIgdGhlIHJlYXNvblxuICAgICAgICAgIC8vIFx1MjAxNCBvdGhlcndpc2UgdGhlIHNhdmUgZmFpbHMgd2l0aCBhbiBlcnJvciB0aGUgZm9ybSBnaXZlcyB5b3Ugbm8gd2F5XG4gICAgICAgICAgLy8gdG8gY2xlYXIuIEhpZGRlbiB1bnRpbCBpdCBhcHBsaWVzLlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24nLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICB2aXNpYmxlT246IFBgaGFzKHJlY29yZC5zdGF0dXMpICYmIHJlY29yZC5zdGF0dXMgPT0gXCJ1bnF1YWxpZmllZFwiYCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIFJFUS0wMDA1IHN0ZXAgNjogXHUzMDBDXHU1ODZCXHU1MTk5XHUyMDI2XHU5NzAwXHU2QzQyXHU3QzdCXHU1NzhCXHUyMDI2XHU5ODg0XHU4QkExXHU5MUQxXHU5ODlEXHUzMDBELiBBIHJlcCB0eXBlcyB0aGVzZSBhdFxuICAgICAgICAgIC8vIGludGFrZSwgc28gdGhleSBuZWVkIGFuIGF1dGhvcmluZyBzdXJmYWNlIFx1MjAxNCBhbmQgdGhpcyBmb3JtIElTIHRoZVxuICAgICAgICAgIC8vIGNyZWF0ZSBkaWFsb2cgKGBSZWNvcmRGb3JtUGFnZWAgYW5kIGB1c2VBY3Rpb25Nb2RhbGAgYm90aCByZXNvbHZlXG4gICAgICAgICAgLy8gYHZpZXcuZm9ybSA/PyB2aWV3LmZvcm1WaWV3cz8uZGVmYXVsdGAsIHNlZSBgY2FzZS52aWV3LnRzYCkuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBcdTI2QTBcdUZFMEYgTmFtZWQgcmF0aGVyIHRoYW4gcmVhY2hlZCB0aHJvdWdoIGEgZ3JvdXAgcmVmZXJlbmNlLCBhbmQgdGhlXG4gICAgICAgICAgLy8gQUdFTlRTLm1kIGxhZGRlcidzIHJ1bmcgMyBhc2tzIGZvciB0aGUgcmVhc29uIGluIHdyaXRpbmcuIEJvdGhcbiAgICAgICAgICAvLyBmaWVsZHMgZGVjbGFyZSBgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJ2Agb24gdGhlIG9iamVjdCwgc28gZXZlcnlcbiAgICAgICAgICAvLyBERVJJVkVEIHN1cmZhY2UgXHUyMDE0IHRoZSBwYWdlIHN5bnRoZXNpemVyLCBhbiBhdXRvLWRlcml2ZWQgZm9ybSBcdTIwMTRcbiAgICAgICAgICAvLyBhbHJlYWR5IGNhcnJpZXMgdGhlbSBmcm9tIGBmaWVsZEdyb3Vwc2AgYWxvbmUgd2l0aCBub3RoaW5nIGF1dGhvcmVkLlxuICAgICAgICAgIC8vIFRoaXMgZm9ybSBpcyBub3Qgb25lIG9mIHRob3NlOiBpdCBhdXRob3JzIGBzZWN0aW9uc2AsIGFuZCBhblxuICAgICAgICAgIC8vIGF1dGhvcmVkIGBzZWN0aW9uc2AgYXJyYXkgd2lucyBvdXRyaWdodCBvdmVyIHRoZSBhdXRvLWRlcml2ZWQgcGF0aC5cbiAgICAgICAgICAvLyBUaGUgcnVuZy0yIGZpeCwgYSBgeyBncm91cDogJ3F1YWxpZmljYXRpb24nIH1gIHNlY3Rpb24sIGNhbm5vdCBiZVxuICAgICAgICAgIC8vIHVzZWQgSEVSRSBzcGVjaWZpY2FsbHk6IHRoaXMgc2VjdGlvbiBpcyBhIENVUkFURUQgY3Jvc3MtZ3JvdXAgc2V0LFxuICAgICAgICAgIC8vIG5vdCBhIG1pcnJvciBvZiB0aGF0IGdyb3VwLiBJdCBhbHJlYWR5IG5hbWVzIGZvdXIgb2YgdGhlIGdyb3VwJ3NcbiAgICAgICAgICAvLyBtZW1iZXJzIHdpdGggcGVyLWZpZWxkIG92ZXJyaWRlcyBhIGdyb3VwIHJlZmVyZW5jZSBjYW5ub3QgY2FycnlcbiAgICAgICAgICAvLyAoYHN0YXR1c2AgcmVxdWlyZWQsIGByYXRpbmdgJ3Mgc3RhciB3aWRnZXQsIGFuZFxuICAgICAgICAgIC8vIGBkaXNxdWFsaWZpY2F0aW9uX3JlYXNvbmAncyBgcmVxdWlyZWRgICsgYHZpc2libGVPbmAgZGlyZWN0bHlcbiAgICAgICAgICAvLyBhYm92ZSksIGFuZCBpdCBib3Jyb3dzIGBpbmR1c3RyeWAgYW5kIGBvd25lcl9pZGAgZnJvbSB0d28gb3RoZXJcbiAgICAgICAgICAvLyBncm91cHMuIEFkZGluZyBhIGdyb3VwIHJlZmVyZW5jZSBiZXNpZGUgaXQgd291bGQgcmVuZGVyIHRob3NlIGZvdXJcbiAgICAgICAgICAvLyBhIHNlY29uZCB0aW1lIGFuZCBwdWxsIGluIGBuZXh0X2ZvbGxvd3VwX2RhdGVgIC9cbiAgICAgICAgICAvLyBgbGFzdF9jb250YWN0ZWRfZGF0ZWAsIHdoaWNoIGFyZSBtYWNoaW5lLXdyaXR0ZW4gYW5kIGRlbGliZXJhdGVseVxuICAgICAgICAgIC8vIGFic2VudCBmcm9tIGV2ZXJ5IGZvcm0uIFx1MjFEMiBUaGUgY3VzdG9tZXIgbmVlZCBpcyByZWFsLCB0aGUgZ3JvdXBcbiAgICAgICAgICAvLyByZWZlcmVuY2UgZ2VudWluZWx5IGNhbm5vdCBleHByZXNzIGl0LCBhbmQgdGhlIHR3byBsaW5lcyBiZWxvdyBhcmVcbiAgICAgICAgICAvLyB3aGF0IHRoYXQgbGVhdmVzLlxuICAgICAgICAgICduZWVkX3R5cGUnLFxuICAgICAgICAgICdlc3RpbWF0ZWRfYW1vdW50JyxcbiAgICAgICAgICAuLi5EVVBMSUNBVEVfTElOS19GSUVMRFMsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnY29tcGFueV9pbmZvcm1hdGlvbicsXG4gICAgICAgIGxhYmVsOiAnQ29tcGFueSBJbmZvcm1hdGlvbicsXG4gICAgICAgIGNvbGxhcHNpYmxlOiB0cnVlLFxuICAgICAgICBjb2xsYXBzZWQ6IHRydWUsIC8vIENvbGxhcHNlZCBieSBkZWZhdWx0XG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICdhbm51YWxfcmV2ZW51ZScsXG4gICAgICAgICAgJ251bWJlcl9vZl9lbXBsb3llZXMnLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2FkZHJlc3MnLFxuICAgICAgICBsYWJlbDogJ0FkZHJlc3MnLFxuICAgICAgICBjb2xsYXBzaWJsZTogdHJ1ZSxcbiAgICAgICAgY29sbGFwc2VkOiB0cnVlLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICAvLyBgY3JtX2xlYWRgIHN0b3JlcyB0aGUgbG9jYXRpb24gaW4gb25lIGNvbXBvc2l0ZSBgRmllbGQuYWRkcmVzc2A7XG4gICAgICAgIC8vIHRoZSBkaXNjcmV0ZSBzdHJlZXQvY2l0eS9zdGF0ZS9wb3N0YWxfY29kZS9jb3VudHJ5IGNvbHVtbnMgdGhpc1xuICAgICAgICAvLyBzZWN0aW9uIHVzZWQgdG8gbGlzdCBkbyBub3QgZXhpc3Qgb24gdGhlIG9iamVjdCwgc28gdGhlIHdob2xlXG4gICAgICAgIC8vIHNlY3Rpb24gcmVuZGVyZWQgYmxhbmsuXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnYWRkcmVzcycsXG4gICAgICAgICAgICBzcGFuOiAnZnVsbCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdhZGRpdGlvbmFsX2luZm9ybWF0aW9uJyxcbiAgICAgICAgbGFiZWw6ICdBZGRpdGlvbmFsIEluZm9ybWF0aW9uJyxcbiAgICAgICAgY29sbGFwc2libGU6IHRydWUsXG4gICAgICAgIGNvbGxhcHNlZDogdHJ1ZSxcbiAgICAgICAgY29sdW1uczogMSwgLy8gU2luZ2xlIGNvbHVtbiBmb3IgdGV4dCBhcmVhc1xuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdub3RlcycsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncHJpdmFjeScsXG4gICAgICAgIGxhYmVsOiAnUHJpdmFjeScsXG4gICAgICAgIGNvbGxhcHNpYmxlOiB0cnVlLFxuICAgICAgICBjb2xsYXBzZWQ6IHRydWUsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICdkb19ub3RfY2FsbCcsXG4gICAgICAgICAgJ2VtYWlsX29wdF9vdXQnLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgTmFtZWQgTGlzdCBWaWV3c1xuICAgKi9cbiAgbGlzdFZpZXdzOiB7XG4gICAgLy8gRGVjbGFyYXRpb24gb3JkZXIgSVMgdGFiIG9yZGVyIGluIHRoZSBjb25zb2xlLiBUaGVzZSB0aHJlZSB3b3JraW5nXG4gICAgLy8gcXVldWVzIHVzZWQgdG8gc2l0IEFGVEVSIHRoZSBrYW5iYW4gLyBjYWxlbmRhciAvIGdhbGxlcnkgdmlld3MsIHdoaWNoXG4gICAgLy8gcHVzaGVkIGFsbCBvZiB0aGVtIGludG8gdGhlIFwiMyBtb3JlXCIgb3ZlcmZsb3cgbWVudSBcdTIwMTQgc28gdGhlIG9uZSBzY3JlZW5cbiAgICAvLyBhIHJlcCBvcGVucyB0aGlzIGxpc3QgZm9yIHdhcyB0aGUgb25lIHRoZXkgaGFkIHRvIGdvIGh1bnRpbmcgZm9yLCB3aGlsZVxuICAgIC8vIHRocmVlIHByZXNlbnRhdGlvbiBtb2RlcyBoZWxkIHRoZSBmcm9udCByb3cuXG5cbiAgICAvKipcbiAgICAgKiBNeSBMZWFkcyBcdTIwMTQgYSByZXAncyBvd24gcXVldWUsIGhvdHRlc3QgZmlyc3QuXG4gICAgICovXG4gICAgbXlfbGVhZHM6IHtcbiAgICAgIG5hbWU6ICdteV9sZWFkcycsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICBsYWJlbDogJ015IExlYWRzJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXI6ICdvYmplY3QnLFxuICAgICAgICBvYmplY3Q6ICdjcm1fbGVhZCcsXG4gICAgICB9LFxuICAgICAgY29sdW1uczogWydmdWxsX25hbWUnLCAnY29tcGFueScsICdlbWFpbCcsICdzdGF0dXMnLCAncmF0aW5nJ10sXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgeyBmaWVsZDogJ293bmVyX2lkJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ3tjdXJyZW50X3VzZXJfaWR9JyB9LFxuICAgICAgXSxcbiAgICAgIHNvcnQ6IFtcbiAgICAgICAgeyBmaWVsZDogJ3JhdGluZycsIG9yZGVyOiAnZGVzYycgfSxcbiAgICAgICAgeyBmaWVsZDogJ2NyZWF0ZWRfYXQnLCBvcmRlcjogJ2Rlc2MnIH1cbiAgICAgIF0sXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhvdCBMZWFkcyBcdTIwMTQgdGhlIHdvcmtpbmcgcXVldWUgZm9yIHRoZSBsZWFkcyByb3V0aW5nIGRlY2xhcmVkIEhPVC5cbiAgICAgKlxuICAgICAqIFwiSG90XCIgaXMgZGVmaW5lZCBpbiBleGFjdGx5IE9ORSBwbGFjZTogdGhlIGBsZWFkX2Fzc2lnbm1lbnRgIGZsb3cnc1xuICAgICAqIGBjaGVja19ob3RgIGRlY2lzaW9uIChlZGdlIGBlMmAsIGByZWNvcmQucmF0aW5nID49IDRgKS4gQ3Jvc3NpbmcgdGhhdFxuICAgICAqIGxpbmUgaXMgd2hhdCBzdGFtcHMgdGhlIDEtZGF5IGZvbGxvdy11cCBTTEEgYW5kIGZpcmVzIHRoZSBcIkhvdCBsZWFkIFx1MjAxNFxuICAgICAqIGFzc2lnbiB3aXRoaW4gMjRoXCIgYWxlcnQgYXQgdGhlIG93bmVyLCBzbyB0aGlzIHF1ZXVlIG11c3QgaG9sZCBwcmVjaXNlbHlcbiAgICAgKiB0aGUgbGVhZHMgdGhhdCBhbGVydCBpcyBhYm91dC4gKEFuIGVhcmxpZXIgY29tbWVudCBoZXJlIGNyZWRpdGVkIGFcbiAgICAgKiBmbGFnZ2luZyB3b3JrZmxvdyB0aGF0IGhhcyBuZXZlciBleGlzdGVkIGluIHRoaXMgcmVwbyBcdTIwMTQgZGVhZCBuYW1lXG4gICAgICogcmVtb3ZlZCwgdGhlIHJvdXRpbmcgZmxvdyBpcyB0aGUgcHJvZHVjZXIuKVxuICAgICAqXG4gICAgICogVGhlIGN1dCB3YXMgYHJhdGluZyA+PSA0LjVgICgjNzY2KS4gYHJhdGluZ2AgaXMgYSBXSE9MRS1zdGFyIGZpZWxkIFx1MjAxNFxuICAgICAqIGBsZWFkLmhvb2sudHNgIHJvdW5kcyBpdHMgY29tcHV0ZWQgc2NvcmUgKFwicm91bmQgdG8gV0hPTEUgc3RhcnNcIiksIHRoZVxuICAgICAqIGBzdGFyX3JhdGluZ2Agd2lkZ2V0IG9mZmVycyBub3RoaW5nIGZpbmVyLCBhbmQgdGhlIG9uZSBzZWVkZWQgNC41IHdhc1xuICAgICAqIGRlbGV0ZWQgZm9yIHRoZSBzYW1lIHJlYXNvbiAoIzU5MSkgXHUyMDE0IHNvIGA+PSA0LjVgIG1lYW50IGA9PSA1YCBvbiBldmVyeVxuICAgICAqIHJvdyB0aGF0IGNhbiBhY3R1YWxseSBleGlzdC4gQSA0LXN0YXIgbGVhZCB3YXMgcm91dGVkIGhvdCwgYWxlcnRlZCBvbixcbiAgICAgKiBhbmQgdGhlbiBtaXNzaW5nIGZyb20gdGhlIHF1ZXVlIGl0cyBvd25lciB3YXMgc2VudCB0by5cbiAgICAgKlxuICAgICAqIFNoYXJpbmcgdGhlIHBvcHVsYXRpb24gd2l0aCBcIkhpZ2ggUHJpb3JpdHlcIiBpcyB0aGUgZGVsaWJlcmF0ZSBjb3N0IG9mXG4gICAgICogaGF2aW5nIG9uZSBkZWZpbml0aW9uIG9mIGhvdCwgbm90IGFuIG92ZXJzaWdodDogYm90aCB2aWV3cyBub3cgc2hvd1xuICAgICAqIHJhdGluZyA+PSA0LCBzdGlsbCBOZXcgb3IgQ29udGFjdGVkLiBXaGF0IGRpZmZlcnMgaXMgd2hhdCB0aGV5IGFyZSBGT1IuXG4gICAgICogSG90IExlYWRzIGlzIHRoZSB3b3JrIG9yZGVyIFx1MjAxNCBzb3J0ZWQgYnkgbmV4dC1mb2xsb3ctdXAgKHRoZSBTTEEgdGhhdFxuICAgICAqIHJvdXRpbmcganVzdCBzdGFtcGVkKSwgd2l0aCBwaG9uZSwgZW1haWwgYW5kIG93bmVyIG9uIHRoZSByb3cgc28gaXQgY2FuXG4gICAgICogYmUgZGlhbGxlZCB0b3AgdG8gYm90dG9tLiBIaWdoIFByaW9yaXR5IGlzIHRoZSBzY2FuIGxpc3QgXHUyMDE0IHNjb3JlLXRpbnRlZFxuICAgICAqIHJvd3MgYW5kIGxlYWQgc291cmNlLCBubyBTTEEgY29sdW1uLCBubyB0aW1lIG9yZGVyaW5nLiBBIDUtc3Rhci1vbmx5XG4gICAgICogcXVldWUsIGlmIGl0IGlzIGV2ZXIgYSByZWFsIG5lZWQsIGdldHMgaXRzIG93biB2aWV3IHVuZGVyIGl0cyBvd24gbmFtZVxuICAgICAqIGluc3RlYWQgb2Ygc3F1YXR0aW5nIG9uIFwiSG90XCIuXG4gICAgICpcbiAgICAgKiBgdGVzdC9ob3QtbGVhZC10aHJlc2hvbGQtcGFyaXR5LnRlc3QudHNgIGRlcml2ZXMgdGhpcyB0aHJlc2hvbGQgYW5kIHRoZVxuICAgICAqIGZsb3cncyBmcm9tIHRoZSBtZXRhZGF0YSBhbmQgZmFpbHMgaWYgdGhleSBkcmlmdCBhcGFydCBhZ2Fpbi5cbiAgICAgKi9cbiAgICBob3RfbGVhZHM6IHtcbiAgICAgIG5hbWU6ICdob3RfbGVhZHMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdcdUQ4M0RcdUREMjUgSG90IExlYWRzJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fbGVhZCcgfSxcbiAgICAgIGNvbHVtbnM6IFsnZnVsbF9uYW1lJywgJ2NvbXBhbnknLCAncGhvbmUnLCAnZW1haWwnLCAncmF0aW5nJywgJ25leHRfZm9sbG93dXBfZGF0ZScsICdvd25lcl9pZCddLFxuICAgICAgLy8gU2FtZSByYXRpbmcgY3V0IGFzIHRoZSBgbGVhZF9hc3NpZ25tZW50YCBob3QgYnJhbmNoLCBzY29wZWQgdG8gdGhlXG4gICAgICAvLyBzdGF0dXNlcyBzdGlsbCB3b3J0aCB3b3JraW5nLiAoT3BlcmF0b3Itb25seSBmaWx0ZXJzOyB0aGUgdmlldyBydW50aW1lXG4gICAgICAvLyBkb2VzIG5vdCByZXNvbHZlIGRhdGUgdGVtcGxhdGUgc3RyaW5ncy4pXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgeyBmaWVsZDogJ3JhdGluZycsIG9wZXJhdG9yOiAnZ3JlYXRlcl90aGFuX29yX2VxdWFsJywgdmFsdWU6IDQgfSxcbiAgICAgICAgeyBmaWVsZDogJ3N0YXR1cycsIG9wZXJhdG9yOiAnaW4nLCB2YWx1ZTogWyduZXcnLCAnY29udGFjdGVkJ10gfSxcbiAgICAgIF0sXG4gICAgICBzb3J0OiBbeyBmaWVsZDogJ25leHRfZm9sbG93dXBfZGF0ZScsIG9yZGVyOiAnYXNjJyB9XSxcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSGlnaCBQcmlvcml0eSBMZWFkc1xuICAgICAqL1xuICAgIGhpZ2hfcHJpb3JpdHk6IHtcbiAgICAgIG5hbWU6ICdoaWdoX3ByaW9yaXR5JyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnSGlnaCBQcmlvcml0eScsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyOiAnb2JqZWN0JyxcbiAgICAgICAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICAgICAgfSxcbiAgICAgIGNvbHVtbnM6IFsnZnVsbF9uYW1lJywgJ2NvbXBhbnknLCAnZW1haWwnLCAnc3RhdHVzJywgJ3JhdGluZycsICdsZWFkX3NvdXJjZSddLFxuICAgICAgZmlsdGVyOiBbXG4gICAgICAgIHsgZmllbGQ6ICdyYXRpbmcnLCBvcGVyYXRvcjogJ2dyZWF0ZXJfdGhhbl9vcl9lcXVhbCcsIHZhbHVlOiA0IH0sXG4gICAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCBvcGVyYXRvcjogJ2luJywgdmFsdWU6IFsnbmV3JywgJ2NvbnRhY3RlZCddIH0sXG4gICAgICBdLFxuICAgICAgcm93Q29sb3I6IHtcbiAgICAgICAgZmllbGQ6ICdyYXRpbmcnLFxuICAgICAgICBjb2xvcnM6IHtcbiAgICAgICAgICAnNSc6ICdncmVlbicsXG4gICAgICAgICAgJzQnOiAnb3JhbmdlJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN1c3BlY3RlZCBEdXBsaWNhdGVzIFx1MjAxNCB0aGUgcmV2aWV3IHF1ZXVlIGJlaGluZCB0aGUgaW50YWtlIGZsYWcgKCM1OTgpLlxuICAgICAqXG4gICAgICogYGxlYWRfZHVwbGljYXRlX2NoZWNrYCBtYXJrcyBhIHJlLWNhcHR1cmVkIGVtYWlsIGBzdXNwZWN0ZWRgIGFuZCBsaW5rcyBpdFxuICAgICAqIHRvIHRoZSByZWNvcmQgaXQgcmVwZWF0cy4gV2l0aG91dCBhIHBsYWNlIHRvIFNFRSB0aGF0IHNldCwgdGhlIGZsYWcgd291bGRcbiAgICAgKiBiZSBhIGNvbHVtbiBub2JvZHkgcmVhZHM6IHRoZSByZXZpZXdlciBvcGVucyB0aGlzIHF1ZXVlLCBjb21wYXJlcyB0aGUgdHdvXG4gICAgICogcmVjb3JkcywgYW5kIGVpdGhlciBjbGVhcnMgdGhlIGZsYWcgb3IgZGlzcXVhbGlmaWVzIHRoZSBsZWFkIGFzIGFcbiAgICAgKiBjb25maXJtZWQgZHVwbGljYXRlLiBgY29uZmlybWVkYCByb3dzIGRyb3Agb3V0IG9mIHRoZSBxdWV1ZSwgc28gaXQgZHJhaW5zLlxuICAgICAqL1xuICAgIHN1c3BlY3RlZF9kdXBsaWNhdGVzOiB7XG4gICAgICBuYW1lOiAnc3VzcGVjdGVkX2R1cGxpY2F0ZXMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdTdXNwZWN0ZWQgRHVwbGljYXRlcycsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2xlYWQnIH0sXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgICdmdWxsX25hbWUnLCAnY29tcGFueScsICdlbWFpbCcsXG4gICAgICAgICdkdXBsaWNhdGVfb2ZfdHlwZScsICdkdXBsaWNhdGVfb2ZfbGVhZCcsICdkdXBsaWNhdGVfb2ZfY29udGFjdCcsXG4gICAgICAgICdzdGF0dXMnLCAnb3duZXJfaWQnLFxuICAgICAgXSxcbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAnZHVwbGljYXRlX3N0YXR1cycsIG9wZXJhdG9yOiAnZXF1YWxzJywgdmFsdWU6ICdzdXNwZWN0ZWQnIH0sXG4gICAgICBdLFxuICAgICAgLy8gT2xkZXN0IHN1c3BpY2lvbiBmaXJzdDogYW4gdW5yZXZpZXdlZCBkdXBsaWNhdGUgaXMgYSBzZWNvbmQgcmVwIHdvcmtpbmdcbiAgICAgIC8vIHRoZSBzYW1lIHBlcnNvbiwgc28gdGhlIHF1ZXVlIGlzIHdvcmtlZCBmcm9udCB0byBiYWNrLlxuICAgICAgc29ydDogW3sgZmllbGQ6ICdjcmVhdGVkX2F0Jywgb3JkZXI6ICdhc2MnIH1dLFxuICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICB0aXRsZTogJ05vIFN1c3BlY3RlZCBEdXBsaWNhdGVzJyxcbiAgICAgICAgbWVzc2FnZTogJ05vdGhpbmcgdG8gcmV2aWV3IFx1MjAxNCBldmVyeSByZS1jYXB0dXJlZCBlbWFpbCBoYXMgYmVlbiBjaGVja2VkLicsXG4gICAgICAgIGljb246ICdjb3B5JyxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEthbmJhbiBCb2FyZCBWaWV3XG4gICAgICovXG4gICAga2FuYmFuX2J5X3N0YXR1czoge1xuICAgICAgbmFtZTogJ2thbmJhbl9ieV9zdGF0dXMnLFxuICAgICAgdHlwZTogJ2thbmJhbicsXG4gICAgICBsYWJlbDogJ0xlYWQgUGlwZWxpbmUnLFxuICAgICAgZGF0YToge1xuICAgICAgICBwcm92aWRlcjogJ29iamVjdCcsXG4gICAgICAgIG9iamVjdDogJ2NybV9sZWFkJyxcbiAgICAgIH0sXG4gICAgICBjb2x1bW5zOiBbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgJ2NvbXBhbnknLCAnZW1haWwnXSxcbiAgICAgIGthbmJhbjoge1xuICAgICAgICBncm91cEJ5RmllbGQ6ICdzdGF0dXMnLFxuICAgICAgICBzdW1tYXJpemVGaWVsZDogJ2FubnVhbF9yZXZlbnVlJyxcbiAgICAgICAgY29sdW1uczogWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsICdjb21wYW55JywgJ3JhdGluZyddLFxuICAgICAgfSxcbiAgICAgIG5hdmlnYXRpb246IHtcbiAgICAgICAgbW9kZTogJ2RyYXdlcicsIC8vIE9wZW4gaW4gZHJhd2VyIGluc3RlYWQgb2YgbmV3IHBhZ2VcbiAgICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQ2FsZW5kYXIgVmlld1xuICAgICAqL1xuICAgIGNhbGVuZGFyX2J5X2NyZWF0ZWQ6IHtcbiAgICAgIG5hbWU6ICdjYWxlbmRhcl9ieV9jcmVhdGVkJyxcbiAgICAgIHR5cGU6ICdjYWxlbmRhcicsXG4gICAgICBsYWJlbDogJ0xlYWQgQ2FsZW5kYXInLFxuICAgICAgZGF0YToge1xuICAgICAgICBwcm92aWRlcjogJ29iamVjdCcsXG4gICAgICAgIG9iamVjdDogJ2NybV9sZWFkJyxcbiAgICAgIH0sXG4gICAgICBjb2x1bW5zOiBbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgJ2NvbXBhbnknXSxcbiAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnY3JlYXRlZF9hdCcsXG4gICAgICAgIHRpdGxlRmllbGQ6ICdjb21wYW55JyxcbiAgICAgICAgY29sb3JGaWVsZDogJ3N0YXR1cycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogR2FsbGVyeS9DYXJkIFZpZXdcbiAgICAgKi9cbiAgICBnYWxsZXJ5X3ZpZXc6IHtcbiAgICAgIG5hbWU6ICdnYWxsZXJ5X3ZpZXcnLFxuICAgICAgdHlwZTogJ2dhbGxlcnknLFxuICAgICAgbGFiZWw6ICdMZWFkIENhcmRzJyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXI6ICdvYmplY3QnLFxuICAgICAgICBvYmplY3Q6ICdjcm1fbGVhZCcsXG4gICAgICB9LFxuICAgICAgY29sdW1uczogWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsICdjb21wYW55JywgJ2VtYWlsJywgJ3N0YXR1cyddLFxuICAgICAgZ2FsbGVyeToge1xuICAgICAgICBjYXJkU2l6ZTogJ21lZGl1bScsXG4gICAgICAgIHRpdGxlRmllbGQ6ICdjb21wYW55JyxcbiAgICAgICAgdmlzaWJsZUZpZWxkczogWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsICdlbWFpbCcsICdwaG9uZScsICdzdGF0dXMnLCAncmF0aW5nJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgXG4gIH0sXG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgTmFtZWQgRm9ybSBWaWV3cyAtIERlbW9uc3RyYXRpbmcgQWxsIDYgTGF5b3V0IFR5cGVzXG4gICAqXG4gICAqIE9uZSBleGFtcGxlIHBlciBsYXlvdXQgdHlwZS4gVGhlIFNJTVBMRSBvbmUgaXMgdGhlIGRlZmF1bHQgYGZvcm1gXG4gICAqIGFib3ZlLCBzbyB0aGlzIGJsb2NrIGNhcnJpZXMgdGhlIG90aGVyIGZpdmUsIHBsdXMgdGhlIHB1YmxpYyBhbmQgdGhlXG4gICAqIGNvbmRpdGlvbmFsLXZpc2liaWxpdHkgZXhhbXBsZXMuIEV2ZXJ5IGxheW91dCBpcyBkZW1vbnN0cmF0ZWQgZXhhY3RseVxuICAgKiBvbmNlIGFjcm9zcyB0aGUgZmlsZTogZWFjaCBlbnRyeSBiZWxvdyBpcyB0aGUgb25seSBleGFtcGxlIG9mIGl0cyBvd24uXG4gICAqL1xuICBmb3JtVmlld3M6IHtcbiAgICAvKipcbiAgICAgKiAyLiBUQUJCRUQgTGF5b3V0XG4gICAgICogT3JnYW5pemUgY29tcGxleCBmb3JtcyB3aXRoIHRhYnNcbiAgICAgKi9cbiAgICBkZXRhaWxfZm9ybToge1xuICAgICAgdHlwZTogJ3RhYmJlZCcsXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2dlbmVyYWwnLFxuICAgICAgICAgIGxhYmVsOiAnR2VuZXJhbCcsXG4gICAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICdzYWx1dGF0aW9uJyxcbiAgICAgICAgICAgICdmaXJzdF9uYW1lJyxcbiAgICAgICAgICAgICdsYXN0X25hbWUnLFxuICAgICAgICAgICAgJ2NvbXBhbnknLFxuICAgICAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgICAgICdlbWFpbCcsXG4gICAgICAgICAgICAncGhvbmUnLFxuICAgICAgICAgICAgJ21vYmlsZScsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICAgICAgICBsYWJlbDogJ1F1YWxpZmljYXRpb24nLFxuICAgICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7IGZpZWxkOiAnc3RhdHVzJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHsgZmllbGQ6ICdyYXRpbmcnLCB3aWRnZXQ6ICdzdGFyX3JhdGluZycgfSxcbiAgICAgICAgICAgICdsZWFkX3NvdXJjZScsXG4gICAgICAgICAgICAnaW5kdXN0cnknLFxuICAgICAgICAgICAgJ2FubnVhbF9yZXZlbnVlJyxcbiAgICAgICAgICAgICdudW1iZXJfb2ZfZW1wbG95ZWVzJyxcbiAgICAgICAgICAgIC8vIFNlZSB0aGUgZGVmYXVsdCBmb3JtOiBgdW5xdWFsaWZpZWRgIHJlcXVpcmVzIGEgcmVhc29uLlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWVsZDogJ2Rpc3F1YWxpZmljYXRpb25fcmVhc29uJyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHZpc2libGVPbjogUGBoYXMocmVjb3JkLnN0YXR1cykgJiYgcmVjb3JkLnN0YXR1cyA9PSBcInVucXVhbGlmaWVkXCJgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLkRVUExJQ0FURV9MSU5LX0ZJRUxEUyxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2FkZHJlc3MnLFxuICAgICAgICAgIGxhYmVsOiAnQWRkcmVzcycsXG4gICAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgICAvLyBTaW5nbGUgY29tcG9zaXRlIGBGaWVsZC5hZGRyZXNzYCBcdTIwMTQgc2VlIHRoZSBub3RlIG9uIHRoZSBkZWZhdWx0XG4gICAgICAgICAgLy8gZm9ybSdzIEFkZHJlc3Mgc2VjdGlvbi5cbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHsgZmllbGQ6ICdhZGRyZXNzJywgc3BhbjogJ2Z1bGwnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdkZXRhaWxzJyxcbiAgICAgICAgICBsYWJlbDogJ0RldGFpbHMnLFxuICAgICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgJ25vdGVzJyxcbiAgICAgICAgICAgICdkb19ub3RfY2FsbCcsXG4gICAgICAgICAgICAnZW1haWxfb3B0X291dCcsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiAzLiBXSVpBUkQgTGF5b3V0XG4gICAgICogU3RlcC1ieS1zdGVwIGd1aWRlZCBwcm9jZXNzXG4gICAgICovXG4gICAgbGVhZF9jb252ZXJzaW9uX3dpemFyZDoge1xuICAgICAgdHlwZTogJ3dpemFyZCcsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyOiAnb2JqZWN0JyxcbiAgICAgICAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICAgICAgfSxcbiAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnc3RlcF8xX2NvbnRhY3RfZGV0YWlscycsXG4gICAgICAgICAgbGFiZWw6ICdTdGVwIDE6IENvbnRhY3QgRGV0YWlscycsXG4gICAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHsgZmllbGQ6ICdmaXJzdF9uYW1lJywgcmVxdWlyZWQ6IHRydWUsIHJlYWRvbmx5OiB0cnVlIH0sXG4gICAgICAgICAgICB7IGZpZWxkOiAnbGFzdF9uYW1lJywgcmVxdWlyZWQ6IHRydWUsIHJlYWRvbmx5OiB0cnVlIH0sXG4gICAgICAgICAgICB7IGZpZWxkOiAnZW1haWwnLCByZWFkb25seTogdHJ1ZSwgc3BhbjogJ2Z1bGwnIH0sXG4gICAgICAgICAgICAncGhvbmUnLFxuICAgICAgICAgICAgJ21vYmlsZScsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdzdGVwXzJfY29tcGFueV9pbmZvcm1hdGlvbicsXG4gICAgICAgICAgbGFiZWw6ICdTdGVwIDI6IENvbXBhbnkgSW5mb3JtYXRpb24nLFxuICAgICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7IGZpZWxkOiAnY29tcGFueScsIHJlcXVpcmVkOiB0cnVlLCByZWFkb25seTogdHJ1ZSB9LFxuICAgICAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgICAgICdpbmR1c3RyeScsXG4gICAgICAgICAgICAnYW5udWFsX3JldmVudWUnLFxuICAgICAgICAgICAgJ251bWJlcl9vZl9lbXBsb3llZXMnLFxuICAgICAgICAgICAgJ3dlYnNpdGUnLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnc3RlcF8zX3F1YWxpZmljYXRpb24nLFxuICAgICAgICAgIGxhYmVsOiAnU3RlcCAzOiBRdWFsaWZpY2F0aW9uJyxcbiAgICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgeyBmaWVsZDogJ3N0YXR1cycsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgICAgICAvLyBTZWUgdGhlIGRlZmF1bHQgZm9ybTogYHVucXVhbGlmaWVkYCByZXF1aXJlcyBhIHJlYXNvbi4gVGhlIHN0YXR1c1xuICAgICAgICAgICAgLy8gaXMgZWRpdGFibGUgaW4gdGhpcyBzdGVwLCBzbyB0aGUgd2l6YXJkIGNhbiBsYW5kIHRoZXJlIHRvby5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdkaXNxdWFsaWZpY2F0aW9uX3JlYXNvbicsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICB2aXNpYmxlT246IFBgaGFzKHJlY29yZC5zdGF0dXMpICYmIHJlY29yZC5zdGF0dXMgPT0gXCJ1bnF1YWxpZmllZFwiYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5EVVBMSUNBVEVfTElOS19GSUVMRFMsXG4gICAgICAgICAgICB7IGZpZWxkOiAncmF0aW5nJywgd2lkZ2V0OiAnc3Rhcl9yYXRpbmcnIH0sXG4gICAgICAgICAgICAnbGVhZF9zb3VyY2UnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWVsZDogJ293bmVyX2lkJyxcbiAgICAgICAgICAgICAgLy8gQ29uZGl0aW9uYWwgdmlzaWJpbGl0eS4gYCE9IG51bGxgIG9uIHRvcCBvZiBgaGFzKC4uLilgOiBzdHJpY3RcbiAgICAgICAgICAgICAgLy8gQ0VMIGFib3J0cyBvbiBgZHluPG51bGw+IDwgaW50YCwgd2hpY2ggYGhhcygpYCBhbG9uZSBhbGxvd3MuXG4gICAgICAgICAgICAgIHZpc2libGVPbjogUGBoYXMocmVjb3JkLnJhdGluZykgJiYgcmVjb3JkLnJhdGluZyAhPSBudWxsICYmIHJlY29yZC5yYXRpbmcgPj0gNGAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnc3RlcF80X3Jldmlld19hbmRfY29udmVydCcsXG4gICAgICAgICAgbGFiZWw6ICdTdGVwIDQ6IFJldmlldyAmIENvbnZlcnQnLFxuICAgICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICBoZWxwVGV4dDogJ1JldmlldyBhbGwgaW5mb3JtYXRpb24gYmVmb3JlIGNvbnZlcnRpbmcgdG8gQWNjb3VudCBhbmQgQ29udGFjdCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogNC4gU1BMSVQgTGF5b3V0XG4gICAgICogTWFzdGVyLWRldGFpbCBzcGxpdCB2aWV3XG4gICAgICovXG4gICAgc3BsaXRfZWRpdDoge1xuICAgICAgdHlwZTogJ3NwbGl0JyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXI6ICdvYmplY3QnLFxuICAgICAgICBvYmplY3Q6ICdjcm1fbGVhZCcsXG4gICAgICB9LFxuICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdwcmltYXJ5X2luZm9ybWF0aW9uJyxcbiAgICAgICAgICBsYWJlbDogJ1ByaW1hcnkgSW5mb3JtYXRpb24nLFxuICAgICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAnZmlyc3RfbmFtZScsXG4gICAgICAgICAgICAnbGFzdF9uYW1lJyxcbiAgICAgICAgICAgICdjb21wYW55JyxcbiAgICAgICAgICAgICdlbWFpbCcsXG4gICAgICAgICAgICB7IGZpZWxkOiAnc3RhdHVzJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICAgICdvd25lcl9pZCcsXG4gICAgICAgICAgICAvLyBTZWUgdGhlIGRlZmF1bHQgZm9ybTogYHVucXVhbGlmaWVkYCByZXF1aXJlcyBhIHJlYXNvbi5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdkaXNxdWFsaWZpY2F0aW9uX3JlYXNvbicsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICB2aXNpYmxlT246IFBgaGFzKHJlY29yZC5zdGF0dXMpICYmIHJlY29yZC5zdGF0dXMgPT0gXCJ1bnF1YWxpZmllZFwiYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5EVVBMSUNBVEVfTElOS19GSUVMRFMsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdleHRlbmRlZF9kZXRhaWxzJyxcbiAgICAgICAgICBsYWJlbDogJ0V4dGVuZGVkIERldGFpbHMnLFxuICAgICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAncGhvbmUnLFxuICAgICAgICAgICAgJ21vYmlsZScsXG4gICAgICAgICAgICAndGl0bGUnLFxuICAgICAgICAgICAgJ2luZHVzdHJ5JyxcbiAgICAgICAgICAgICdsZWFkX3NvdXJjZScsXG4gICAgICAgICAgICB7IGZpZWxkOiAncmF0aW5nJywgd2lkZ2V0OiAnc3Rhcl9yYXRpbmcnIH0sXG4gICAgICAgICAgICAnYW5udWFsX3JldmVudWUnLFxuICAgICAgICAgICAgJ251bWJlcl9vZl9lbXBsb3llZXMnLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogNS4gRFJBV0VSIExheW91dFxuICAgICAqIFNpZGUgcGFuZWwgZm9ybSAodHlwaWNhbGx5IG9wZW5lZCBmcm9tIGxpc3QgdmlldylcbiAgICAgKi9cbiAgICBxdWlja19lZGl0X2RyYXdlcjoge1xuICAgICAgdHlwZTogJ2RyYXdlcicsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyOiAnb2JqZWN0JyxcbiAgICAgICAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICAgICAgfSxcbiAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAncXVpY2tfZWRpdCcsXG4gICAgICAgICAgbGFiZWw6ICdRdWljayBFZGl0JyxcbiAgICAgICAgICBjb2x1bW5zOiAxLCAvLyBEcmF3ZXJzIHR5cGljYWxseSB1c2Ugc2luZ2xlIGNvbHVtblxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgeyBmaWVsZDogJ2ZpcnN0X25hbWUnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBmaWVsZDogJ2xhc3RfbmFtZScsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgICAgICAnY29tcGFueScsXG4gICAgICAgICAgICAnZW1haWwnLFxuICAgICAgICAgICAgJ3Bob25lJyxcbiAgICAgICAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBmaWVsZDogJ3JhdGluZycsIHdpZGdldDogJ3N0YXJfcmF0aW5nJyB9LFxuICAgICAgICAgICAgJ2xlYWRfc291cmNlJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdvd25lcl9pZCcsXG4gICAgICAgICAgICAgIC8vIE9ubHkgc2hvdyBvd25lciBhZnRlciBpbml0aWFsIGNvbnRhY3QuIEEgcmVjb3JkIHdpdGggbm8gc3RhdHVzXG4gICAgICAgICAgICAgIC8vIHlldCBoYXMgbm90IGJlZW4gY29udGFjdGVkLCBzbyBgIWlzQmxhbmtgIGtlZXBzIHRoZSBibGFuayBjYXNlXG4gICAgICAgICAgICAgIC8vIG9uIHRoZSBcImhpZGRlblwiIHNpZGUgcmF0aGVyIHRoYW4gbGV0dGluZyBgbnVsbCAhPSBcIm5ld1wiYCBzaG93IGl0LlxuICAgICAgICAgICAgICB2aXNpYmxlT246IFBgaGFzKHJlY29yZC5zdGF0dXMpICYmICFpc0JsYW5rKHJlY29yZC5zdGF0dXMpICYmIHJlY29yZC5zdGF0dXMgIT0gXCJuZXdcImAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gU2VlIHRoZSBkZWZhdWx0IGZvcm06IGB1bnF1YWxpZmllZGAgcmVxdWlyZXMgYSByZWFzb24uXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAnZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24nLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwidW5xdWFsaWZpZWRcImAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uRFVQTElDQVRFX0xJTktfRklFTERTLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogNi4gTU9EQUwgTGF5b3V0XG4gICAgICogRGlhbG9nLWJhc2VkIGZvcm0gZm9yIHF1aWNrIGFjdGlvbnNcbiAgICAgKi9cbiAgICBzdGF0dXNfdXBkYXRlX21vZGFsOiB7XG4gICAgICB0eXBlOiAnbW9kYWwnLFxuICAgICAgZGF0YToge1xuICAgICAgICBwcm92aWRlcjogJ29iamVjdCcsXG4gICAgICAgIG9iamVjdDogJ2NybV9sZWFkJyxcbiAgICAgIH0sXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3VwZGF0ZV9sZWFkX3N0YXR1cycsXG4gICAgICAgICAgbGFiZWw6ICdVcGRhdGUgTGVhZCBTdGF0dXMnLFxuICAgICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7IGZpZWxkOiAnZmlyc3RfbmFtZScsIHJlYWRvbmx5OiB0cnVlIH0sXG4gICAgICAgICAgICB7IGZpZWxkOiAnbGFzdF9uYW1lJywgcmVhZG9ubHk6IHRydWUgfSxcbiAgICAgICAgICAgIHsgZmllbGQ6ICdjb21wYW55JywgcmVhZG9ubHk6IHRydWUgfSxcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIGZpZWxkOiAnc3RhdHVzJywgXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBoZWxwVGV4dDogJ1NlbGVjdCB0aGUgbmV3IHN0YXR1cyBmb3IgdGhpcyBsZWFkJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAncmF0aW5nJyxcbiAgICAgICAgICAgICAgd2lkZ2V0OiAnc3Rhcl9yYXRpbmcnLFxuICAgICAgICAgICAgICAvLyBPbmx5IHNob3cgcmF0aW5nIGZvciBxdWFsaWZpZWQgbGVhZHNcbiAgICAgICAgICAgICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwicXVhbGlmaWVkXCJgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFRoZSByZWFzb24gcGlja2xpc3QsIG5vdCBqdXN0IGZyZWUtdGV4dCBub3RlczogaXQgaXMgd2hhdCB0aGVcbiAgICAgICAgICAgIC8vIGBkaXNxdWFsaWZpY2F0aW9uX3JlYXNvbl9yZXF1aXJlZGAgdmFsaWRhdGlvbiBjaGVja3MsIGFuZCB0aGlzXG4gICAgICAgICAgICAvLyBtb2RhbCBpcyB0aGUgbWFpbiBwbGFjZSBhIHJlcCBmbGlwcyBhIGxlYWQgdG8gVW5xdWFsaWZpZWQuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAnZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24nLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwidW5xdWFsaWZpZWRcImAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uRFVQTElDQVRFX0xJTktfRklFTERTLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWVsZDogJ25vdGVzJyxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdBZGQgbm90ZXMgYWJvdXQgdGhpcyBzdGF0dXMgY2hhbmdlJyxcbiAgICAgICAgICAgICAgLy8gRnJlZS10ZXh0IGNvbnRleHQgYWxvbmdzaWRlIHRoZSByZWFzb25cbiAgICAgICAgICAgICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwidW5xdWFsaWZpZWRcImAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogNy4gUFVCTElDIC8gQU5PTllNT1VTIFx1MjAxNCBcIldlYi10by1MZWFkXCJcbiAgICAgKlxuICAgICAqIEFpcnRhYmxlLXN0eWxlIHB1YmxpYyBmb3JtIGhvc3RlZCBhdCBgL2Zvcm1zL2NvbnRhY3QtdXNgLiBFbWJlZGRhYmxlXG4gICAgICogdmlhIGlmcmFtZSBvbiBhIG1hcmtldGluZyBzaXRlLiBHdWVzdHMgY2FuIE9OTFkgc3VibWl0IChpbnNlcnQpIFx1MjAxNCB0aGVcbiAgICAgKiBgZ3Vlc3RfcG9ydGFsYCBwcm9maWxlIGRlbmllcyByZWFkL2VkaXQvZGVsZXRlIG9uIGBjcm1fbGVhZGAuXG4gICAgICpcbiAgICAgKiBGaWVsZHMgbm90IG9uIHRoZSBmb3JtIChzdGF0dXMsIGxlYWRfc291cmNlLCBvd25lcl9pZCwgcmF0aW5nKSBhcmUgc3RhbXBlZFxuICAgICAqIGJ5IHRoZSBgbGVhZF9hdXRvbWF0aW9uYCBob29rIGluIGBsZWFkLmhvb2sudHNgIGFmdGVyIGEgZ3Vlc3Qgc3VibWlzc2lvbi5cbiAgICAgKi9cbiAgICB3ZWJfdG9fbGVhZDoge1xuICAgICAgdHlwZTogJ3NpbXBsZScsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyOiAnb2JqZWN0JyxcbiAgICAgICAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICAgICAgfSxcbiAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAndGVsbF91c19hYm91dF95b3Vyc2VsZicsXG4gICAgICAgICAgbGFiZWw6ICdUZWxsIHVzIGFib3V0IHlvdXJzZWxmJyxcbiAgICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgeyBmaWVsZDogJ2ZpcnN0X25hbWUnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBmaWVsZDogJ2xhc3RfbmFtZScsICByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBmaWVsZDogJ2VtYWlsJywgICAgICByZXF1aXJlZDogdHJ1ZSwgc3BhbjogJ2Z1bGwnIH0sXG4gICAgICAgICAgICAncGhvbmUnLFxuICAgICAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2Fib3V0X3lvdXJfY29tcGFueScsXG4gICAgICAgICAgbGFiZWw6ICdBYm91dCB5b3VyIGNvbXBhbnknLFxuICAgICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7IGZpZWxkOiAnY29tcGFueScsIHJlcXVpcmVkOiB0cnVlLCBzcGFuOiAnZnVsbCcgfSxcbiAgICAgICAgICAgICd3ZWJzaXRlJyxcbiAgICAgICAgICAgICdpbmR1c3RyeScsXG4gICAgICAgICAgICAnbnVtYmVyX29mX2VtcGxveWVlcycsXG4gICAgICAgICAgICAnYW5udWFsX3JldmVudWUnLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnaG93X2Nhbl93ZV9oZWxwJyxcbiAgICAgICAgICBsYWJlbDogJ0hvdyBjYW4gd2UgaGVscD8nLFxuICAgICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdCcmllZmx5IGRlc2NyaWJlIHdoYXQgeW91IGFyZSBsb29raW5nIGZvci4uLicsXG4gICAgICAgICAgICAgIGhlbHBUZXh0OiAnQSBzYWxlcyByZXByZXNlbnRhdGl2ZSB3aWxsIGdldCBiYWNrIHRvIHlvdSB3aXRoaW4gb25lIGJ1c2luZXNzIGRheS4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHNoYXJpbmc6IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgYWxsb3dBbm9ueW1vdXM6IHRydWUsXG4gICAgICAgIHB1YmxpY0xpbms6ICcvZm9ybXMvY29udGFjdC11cycsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZHZhbmNlZCBFeGFtcGxlOiBDb25kaXRpb25hbCBGaWVsZCBWaXNpYmlsaXR5ICYgRGVwZW5kZW5jaWVzXG4gICAgICovXG4gICAgYWR2YW5jZWRfY29uZGl0aW9uYWw6IHtcbiAgICAgIHR5cGU6ICdzaW1wbGUnLFxuICAgICAgZGF0YToge1xuICAgICAgICBwcm92aWRlcjogJ29iamVjdCcsXG4gICAgICAgIG9iamVjdDogJ2NybV9sZWFkJyxcbiAgICAgIH0sXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2xlYWRfaW5mb3JtYXRpb24nLFxuICAgICAgICAgIGxhYmVsOiAnTGVhZCBJbmZvcm1hdGlvbicsXG4gICAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICdmaXJzdF9uYW1lJyxcbiAgICAgICAgICAgICdsYXN0X25hbWUnLFxuICAgICAgICAgICAgJ2NvbXBhbnknLFxuICAgICAgICAgICAgJ2VtYWlsJyxcbiAgICAgICAgICAgICdzdGF0dXMnLFxuICAgICAgICAgICAgJ2xlYWRfc291cmNlJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdyYXRpbmcnLFxuICAgICAgICAgICAgICB3aWRnZXQ6ICdzdGFyX3JhdGluZycsXG4gICAgICAgICAgICAgIC8vIE9ubHkgc2hvdyBhZnRlciBmaXJzdCBjb250YWN0IFx1MjAxNCBzZWUgdGhlIGRyYXdlciBmb3JtJ3Mgbm90ZSBvblxuICAgICAgICAgICAgICAvLyB3aHkgYmxhbmsgc3RheXMgb24gdGhlIFwiaGlkZGVuXCIgc2lkZS5cbiAgICAgICAgICAgICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiAhaXNCbGFuayhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzICE9IFwibmV3XCJgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdpbmR1c3RyeScsXG4gICAgICAgICAgICAgIGRlcGVuZHNPbjogJ2NvbXBhbnknLCAvLyBJbmR1c3RyeSBvcHRpb25zIGRlcGVuZCBvbiBjb21wYW55XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWVsZDogJ2FubnVhbF9yZXZlbnVlJyxcbiAgICAgICAgICAgICAgLy8gT25seSBmb3IgcXVhbGlmaWVkIGxlYWRzXG4gICAgICAgICAgICAgIHZpc2libGVPbjogUGBoYXMocmVjb3JkLnJhdGluZykgJiYgcmVjb3JkLnJhdGluZyAhPSBudWxsICYmIHJlY29yZC5yYXRpbmcgPj0gM2AsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWVsZDogJ251bWJlcl9vZl9lbXBsb3llZXMnLFxuICAgICAgICAgICAgICB2aXNpYmxlT246IFBgaGFzKHJlY29yZC5yYXRpbmcpICYmIHJlY29yZC5yYXRpbmcgIT0gbnVsbCAmJiByZWNvcmQucmF0aW5nID49IDNgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdvd25lcl9pZCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICB2aXNpYmxlT246IFBgaGFzKHJlY29yZC5zdGF0dXMpICYmIChyZWNvcmQuc3RhdHVzID09IFwiY29udGFjdGVkXCIgfHwgcmVjb3JkLnN0YXR1cyA9PSBcInF1YWxpZmllZFwiKWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gU2VlIHRoZSBkZWZhdWx0IGZvcm06IGB1bnF1YWxpZmllZGAgcmVxdWlyZXMgYSByZWFzb24uXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAnZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24nLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwidW5xdWFsaWZpZWRcImAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uRFVQTElDQVRFX0xJTktfRklFTERTLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWVsZDogJ25vdGVzJyxcbiAgICAgICAgICAgICAgc3BhbjogJ2Z1bGwnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgLy8gUmVxdWlyZSBleHBsYW5hdGlvbiBmb3IgdW5xdWFsaWZpZWRcbiAgICAgICAgICAgICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwidW5xdWFsaWZpZWRcImAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnYWRkcmVzc19pbmZvcm1hdGlvbicsXG4gICAgICAgICAgbGFiZWw6ICdBZGRyZXNzIEluZm9ybWF0aW9uJyxcbiAgICAgICAgICBjb2xsYXBzaWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb2xsYXBzZWQ6IHRydWUsXG4gICAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgICAvLyBTaW5nbGUgY29tcG9zaXRlIGBGaWVsZC5hZGRyZXNzYCBcdTIwMTQgdGhlIGRpc2NyZXRlIHN0cmVldC9jaXR5L3N0YXRlL1xuICAgICAgICAgIC8vIHBvc3RhbF9jb2RlL2NvdW50cnkgY29sdW1ucyBkbyBub3QgZXhpc3Qgb24gY3JtX2xlYWQuXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7IGZpZWxkOiAnYWRkcmVzcycsIHNwYW46ICdmdWxsJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAncHJpdmFjeV9wcmVmZXJlbmNlcycsXG4gICAgICAgICAgbGFiZWw6ICdQcml2YWN5IFByZWZlcmVuY2VzJyxcbiAgICAgICAgICBjb2xsYXBzaWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb2xsYXBzZWQ6IHRydWUsXG4gICAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdkb19ub3RfY2FsbCcsXG4gICAgICAgICAgICAgIGhlbHBUZXh0OiAnQ2hlY2sgaWYgdGhpcyBsZWFkIGhhcyByZXF1ZXN0ZWQgbm90IHRvIGJlIGNhbGxlZCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWVsZDogJ2VtYWlsX29wdF9vdXQnLFxuICAgICAgICAgICAgICBoZWxwVGV4dDogJ0NoZWNrIGlmIHRoaXMgbGVhZCBoYXMgb3B0ZWQgb3V0IG9mIGVtYWlsIGNvbW11bmljYXRpb25zJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3MvYWNjb3VudC52aWV3LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzL2FjY291bnQudmlldy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBBY2NvdW50IFZpZXdzXG4gKlxuICogICBcdTIwMjIgZ3JpZCAgICBcdTIwMTQgcHJpbWFyeSBsaXN0IHdpdGggcmV2ZW51ZSAvIGluZHVzdHJ5IHN1bW1hcmllc1xuICogICBcdTIwMjIgZ2FsbGVyeSBcdTIwMTQgYnJhbmRlZCBhY2NvdW50IGNhcmRzIHdpdGggYnJhbmRfY29sb3IgaGlnaGxpZ2h0c1xuICogICBcdTIwMjIgbWFwICAgICBcdTIwMTQgZ2Vvc3BhdGlhbCBkaXN0cmlidXRpb24gKHVzZXMgb2ZmaWNlX2xvY2F0aW9uKVxuICovXG5leHBvcnQgY29uc3QgQWNjb3VudFZpZXdzID0gZGVmaW5lVmlldyh7XG4gIGxpc3Q6IHtcbiAgICB0eXBlOiAnZ3JpZCcsXG4gICAgbmFtZTogJ2FsbF9hY2NvdW50cycsXG4gICAgbGFiZWw6ICdBbGwgQWNjb3VudHMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2FjY291bnQnIH0sXG4gICAgY29sdW1uczogW1xuICAgICAgeyBmaWVsZDogJ25hbWUnLCB3aWR0aDogMjQwLCBzb3J0YWJsZTogdHJ1ZSwgbGluazogdHJ1ZSwgcGlubmVkOiAnbGVmdCcgfSxcbiAgICAgIHsgZmllbGQ6ICdpbmR1c3RyeScsIHdpZHRoOiAxNDAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAndHlwZScsIHdpZHRoOiAxMzAgfSxcbiAgICAgIHsgZmllbGQ6ICdhbm51YWxfcmV2ZW51ZScsIHdpZHRoOiAxNjAsIGFsaWduOiAncmlnaHQnLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgeyBmaWVsZDogJ251bWJlcl9vZl9lbXBsb3llZXMnLCB3aWR0aDogMTMwLCBhbGlnbjogJ3JpZ2h0Jywgc3VtbWFyeTogJ2F2ZycgfSxcbiAgICAgIHsgZmllbGQ6ICdoZWFsdGhfc2NvcmUnLCB3aWR0aDogMTQwIH0sXG4gICAgXSxcbiAgICBzb3J0OiBbeyBmaWVsZDogJ2FubnVhbF9yZXZlbnVlJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICByb3dDb2xvcjogeyBmaWVsZDogJ2lzX2FjdGl2ZScsIGNvbG9yczogeyB0cnVlOiAnZ3JlZW4nLCBmYWxzZTogJ3NsYXRlJyB9IH0sXG4gICAgc2VsZWN0aW9uOiB7IHR5cGU6ICdtdWx0aXBsZScgfSxcbiAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiA1MCwgcGFnZVNpemVPcHRpb25zOiBbMjUsIDUwLCAxMDBdIH0sXG4gICAgZXhwb3J0T3B0aW9uczogeyBmb3JtYXRzOiBbJ2NzdicsICd4bHN4J10gfSxcbiAgICBjb21wYWN0VG9vbGJhcjogdHJ1ZSxcbiAgICBidWxrQWN0aW9uRGVmczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAndXBkYXRlX3RpZXInLFxuICAgICAgICBsYWJlbDogJ1VwZGF0ZSBUaWVyJyxcbiAgICAgICAgaWNvbjogJ3RhZycsXG4gICAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScsXG4gICAgICAgIHBhcmFtczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICd0aWVyJyxcbiAgICAgICAgICAgIGxhYmVsOiAnQ3VzdG9tZXIgVGllcicsXG4gICAgICAgICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnU3RyYXRlZ2ljJywgIHZhbHVlOiAnc3RyYXRlZ2ljJyAgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0VudGVycHJpc2UnLCB2YWx1ZTogJ2VudGVycHJpc2UnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdNaWQtTWFya2V0JywgdmFsdWU6ICdtaWRfbWFya2V0JyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnU01CJywgICAgICAgIHZhbHVlOiAnc21iJyAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29uZmlybVRleHQ6ICdVcGRhdGUgdGllciBvbiB7e2NvdW50fX0gYWNjb3VudChzKSB0byB7e3RpZXJ9fT8nLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3RyYW5zZmVyX293bmVyJyxcbiAgICAgICAgbGFiZWw6ICdUcmFuc2ZlciBPd25lcicsXG4gICAgICAgIGljb246ICd1c2VyLWNoZWNrJyxcbiAgICAgICAgb3BlcmF0aW9uOiAndXBkYXRlJyxcbiAgICAgICAgcGFyYW1zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ293bmVyX2lkJyxcbiAgICAgICAgICAgIGxhYmVsOiAnTmV3IE93bmVyJyxcbiAgICAgICAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgICAgICAgLy8gVGhlIHBsYXRmb3JtIHJlZ2lzdGVycyBgc3lzX3VzZXJgIFx1MjAxNCBgdXNlcmAgbWF0Y2hlcyBubyBvYmplY3QgYW5kXG4gICAgICAgICAgICAvLyByZW5kZXJlZCBhbiBlbXB0eSBwaWNrZXIuXG4gICAgICAgICAgICBvYmplY3Q6ICdzeXNfdXNlcicsXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBjb25maXJtVGV4dDogJ1RyYW5zZmVyIG93bmVyc2hpcCBvZiB7e2NvdW50fX0gYWNjb3VudChzKT8nLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2RlbGV0ZScsXG4gICAgICAgIGxhYmVsOiAnRGVsZXRlJyxcbiAgICAgICAgaWNvbjogJ3RyYXNoLTInLFxuICAgICAgICB2YXJpYW50OiAnZGFuZ2VyJyxcbiAgICAgICAgb3BlcmF0aW9uOiAnZGVsZXRlJyxcbiAgICAgICAgY29uZmlybVRleHQ6ICdQZXJtYW5lbnRseSBkZWxldGUge3tjb3VudH19IGFjY291bnQocyk/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nLFxuICAgICAgICBjb25maXJtTGFiZWw6ICdEZWxldGUnLFxuICAgICAgfSxcbiAgICBdLFxuICAgIGFwcGVhcmFuY2U6IHtcbiAgICAgIHNob3dEZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGFsbG93ZWRWaXN1YWxpemF0aW9uczogWydncmlkJywgJ2dhbGxlcnknLCAnbWFwJ10sXG4gICAgfSxcbiAgfSxcblxuICBsaXN0Vmlld3M6IHtcbiAgICAvKiogQnJhbmRlZCBhY2NvdW50IGNhcmRzICovXG4gICAgYWNjb3VudF9nYWxsZXJ5OiB7XG4gICAgICBuYW1lOiAnYWNjb3VudF9nYWxsZXJ5JyxcbiAgICAgIHR5cGU6ICdnYWxsZXJ5JyxcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBDYXJkcycsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2FjY291bnQnIH0sXG4gICAgICAvLyBgbG9nb2AgcmlkZXMgaW4gdGhlIHByb2plY3Rpb24gZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgdGltZWxpbmUgdmlld1xuICAgICAgLy8gY2FycmllcyBpdHMgZGF0ZSBmaWVsZHM6IHRoZSBsaXN0IGRhdGEgc291cmNlIHByb2plY3RzIHRoZSBjb25maWd1cmVkXG4gICAgICAvLyBjb2x1bW5zLCBhbmQgYGNvdmVyRmllbGRgIHJlYWRzIG9mZiB0aGF0IHByb2plY3Rpb24uXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnaW5kdXN0cnknLCAnYW5udWFsX3JldmVudWUnLCAncGhvbmUnLCAnbG9nbyddLFxuICAgICAgZ2FsbGVyeToge1xuICAgICAgICAvLyBUaGUgY2FyZCBhcnQgdGhpcyB2aWV3IHdhcyBuYW1lZCBmb3IuIFwiQnJhbmRlZCBhY2NvdW50IGNhcmRzXCIgaGFkIGFcbiAgICAgICAgLy8gYnJhbmQgQ09MT1VSIGFuZCBubyBicmFuZCBJTUFHRSBcdTIwMTQgYGNybV9hY2NvdW50LmxvZ29gIGlzIHRoZSBvYmplY3Qnc1xuICAgICAgICAvLyBvbmx5IGltYWdlIGZpZWxkIGFuZCBub3RoaW5nIGRpc3BsYXllZCBpdCwgc28gZXZlcnkgY2FyZCBkcmV3IHRoZVxuICAgICAgICAvLyBzYW1lIGJsYW5rIGNvdmVyLiBgY292ZXJGaXRgIGlzIGxlZnQgdW5zdGF0ZWQ6IHRoZSBzY2hlbWEncyBkZWZhdWx0XG4gICAgICAgIC8vIGlzIHRoZSBjcm9wIHRoZXNlIGNhcmRzIHdhbnQsIGFuZCBtYXRlcmlhbGlzaW5nIGEgZGVmYXVsdCByZXdyaXRlc1xuICAgICAgICAvLyBcInRoZSBhdXRob3Igc2FpZCBub3RoaW5nXCIgaW50byBcInRoZSBhdXRob3IgYXNrZWQgZm9yIHRoaXNcIi5cbiAgICAgICAgY292ZXJGaWVsZDogJ2xvZ28nLFxuICAgICAgICBjYXJkU2l6ZTogJ21lZGl1bScsXG4gICAgICAgIHRpdGxlRmllbGQ6ICduYW1lJyxcbiAgICAgICAgdmlzaWJsZUZpZWxkczogWydpbmR1c3RyeScsICdhbm51YWxfcmV2ZW51ZScsICdudW1iZXJfb2ZfZW1wbG95ZWVzJywgJ3Bob25lJywgJ3dlYnNpdGUnLCAnb3duZXJfaWQnXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdlb3NwYXRpYWwgZGlzdHJpYnV0aW9uLlxuICAgICAqXG4gICAgICogVGhlIGBtYXBgIGJsb2NrIGlzIHdoYXQgQklORFMgdGhlIHZpZXcgdG8gYSBjb29yZGluYXRlIHNvdXJjZS4gV2l0aG91dCBpdFxuICAgICAqIHRoZSByZW5kZXJlciBmYWxscyBiYWNrIHRvIGxpdGVyYWwgZGVmYXVsdCBmaWVsZCBuYW1lcywgd2hpY2ggcmVzb2x2ZSBvblxuICAgICAqIGBjcm1fYWNjb3VudGAgb25seSBieSBsdWNrIFx1MjAxNCB0aGUgdmlldyBkcmF3cyBubyBtYXJrZXIgd2hpbGUgYXV0aG9yaW5nXG4gICAgICogcmVwb3J0cyBzdWNjZXNzIChgdmlldy9sYXlvdXQtd2l0aG91dC1iaW5kaW5nYCkuIGBvZmZpY2VfbG9jYXRpb25gIGlzIHRoZVxuICAgICAqIG9iamVjdCdzIGBGaWVsZC5sb2NhdGlvbiguLi4pYCwgd2hpY2ggaXMgdGhlIG9uZSBmaWVsZCBvbiBgY3JtX2FjY291bnRgXG4gICAgICogY2FycnlpbmcgY29vcmRpbmF0ZXM7IGBiaWxsaW5nX2FkZHJlc3NgIGlzIGFuIGBhZGRyZXNzYCBmaWVsZCBhbmQgaXMgYVxuICAgICAqIHBvc3RhbCBzaGFwZSwgbm90IGEgY29vcmRpbmF0ZSBvbmUsIHNvIGl0IHN0YXlzIGEgY29sdW1uIHJhdGhlciB0aGFuIHRoZVxuICAgICAqIGJpbmRpbmcuIGB0aXRsZUZpZWxkYCBuYW1lcyB0aGUgbWFya2VyIGxhYmVsIFx1MjAxNCBgbmFtZWAsIG5vdCB0aGUgb2JqZWN0J3NcbiAgICAgKiBgbmFtZUZpZWxkYCAoYGRpc3BsYXlfdGl0bGVgKSwgYmVjYXVzZSB0aGUgbWFwJ3Mgb3duIGBjb2x1bW5zYCBzaG93XG4gICAgICogYG5hbWVgIGFuZCB0aGUgdHdvIHNob3VsZCBhZ3JlZS5cbiAgICAgKi9cbiAgICBhY2NvdW50X21hcDoge1xuICAgICAgbmFtZTogJ2FjY291bnRfbWFwJyxcbiAgICAgIHR5cGU6ICdtYXAnLFxuICAgICAgbGFiZWw6ICdBY2NvdW50cyBieSBMb2NhdGlvbicsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2FjY291bnQnIH0sXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnaW5kdXN0cnknLCAnb2ZmaWNlX2xvY2F0aW9uJywgJ2JpbGxpbmdfYWRkcmVzcyddLFxuICAgICAgbWFwOiB7IGxvY2F0aW9uRmllbGQ6ICdvZmZpY2VfbG9jYXRpb24nLCB0aXRsZUZpZWxkOiAnbmFtZScgfSxcbiAgICB9LFxuXG4gICAgLyoqIFRpZXIgYWNjb3VudHM6IEVudGVycHJpc2UgKD49ICQxME0gQVJSKSAqL1xuICAgIGVudGVycHJpc2VfYWNjb3VudHM6IHtcbiAgICAgIG5hbWU6ICdlbnRlcnByaXNlX2FjY291bnRzJyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnRW50ZXJwcmlzZSBBY2NvdW50cycsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2FjY291bnQnIH0sXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnaW5kdXN0cnknLCAnYW5udWFsX3JldmVudWUnLCAnbnVtYmVyX29mX2VtcGxveWVlcycsICdvd25lcl9pZCddLFxuICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ2FubnVhbF9yZXZlbnVlJywgb3BlcmF0b3I6ICdncmVhdGVyX3RoYW5fb3JfZXF1YWwnLCB2YWx1ZTogMTAwMDAwMDAgfV0sXG4gICAgICBzb3J0OiBbeyBmaWVsZDogJ2FubnVhbF9yZXZlbnVlJywgb3JkZXI6ICdkZXNjJyB9XSxcblxuICAgICAgLy8gQURSLTAwNDcgZW5kLXVzZXIgcXVpY2sgZmlsdGVycyAoQWlydGFibGUgXCJVc2VyIGZpbHRlcnNcIiwgRWxlbWVudHM6XG4gICAgICAvLyBkcm9wZG93bnMpLiBgZWxlbWVudDogJ2Ryb3Bkb3duJ2AsIGRlbGliZXJhdGVseSBcdTIwMTQgb24gYW4gb2JqZWN0IGxpc3RcbiAgICAgIC8vIHRoZSB2aWV3IFNXSVRDSEVSIG93bnMgdGhlIHRhYiBiYXIgKGl0IGJ1aWxkcyBvbmUgZW50cnkgcGVyIGBsaXN0YCAvXG4gICAgICAvLyBgbGlzdFZpZXdzYCBkZXNjcmlwdG9yKSwgc28gYSBxdWljay1maWx0ZXIgYmxvY2sgc2hhcGVkIGFzIHRhYnMgaXNcbiAgICAgIC8vIGRyb3BwZWQgdGhlcmU6IHRoZSBjb25zb2xlIGxvZ3MgYGRlZmluZXMgdXNlckZpbHRlcnMgKGVsZW1lbnQ6XG4gICAgICAvLyBcInRhYnNcIiksIHdoaWNoIGFyZSBpZ25vcmVkIG9uIGFuIG9iamVjdCBsaXN0IHZpZXcgKEFEUi0wMDQ3IFwidmlld3NcIlxuICAgICAgLy8gbW9kZSBcdTIwMTQgdGhlIHZpZXcgc3dpdGNoZXIgb3ducyB0aGUgdGFiIGJhciBoZXJlKWAgYW5kIHJlbmRlcnMgbm90aGluZy5cbiAgICAgIC8vIERyb3Bkb3ducyBzaXQgYmVzaWRlIHRoZSBzd2l0Y2hlciBhbmQgYXJlIHVuYWZmZWN0ZWQuXG4gICAgICAvLyBgb3duZXJfaWRgIGlzIHRoZSBwbGF0Zm9ybSBvd25lcnNoaXAgbG9va3VwICgjNTQ4KSBcdTIwMTQgaXQgcmVuZGVycyBhcyBhXG4gICAgICAvLyByZWNvcmQtcGlja2VyIGRyb3Bkb3duLlxuICAgICAgLy8gTk9URTogcmVxdWlyZXMgQG9iamVjdHN0YWNrL3NwZWMgPiA5LjIuMCAoQURSLTAwNDcgVXNlckZpbHRlcnNTY2hlbWEpO1xuICAgICAgLy8gb24gb2xkZXIgc3BlY3MgZGVmaW5lU3RhY2sgc3RyaXBzIHRoaXMgYmxvY2sgXHUyMDE0IGhhcm1sZXNzIG5vLW9wLlxuICAgICAgLi4uKHtcbiAgICAgICAgdXNlckZpbHRlcnM6IHtcbiAgICAgICAgICBlbGVtZW50OiAnZHJvcGRvd24nLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgeyBmaWVsZDogJ2luZHVzdHJ5Jywgc2hvd0NvdW50OiB0cnVlIH0sXG4gICAgICAgICAgICB7IGZpZWxkOiAndHlwZScgfSxcbiAgICAgICAgICAgIHsgZmllbGQ6ICdvd25lcl9pZCcgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICAvLyB0eXBlZCB2aWEgc3ByZWFkLWFzLWFueSB1bnRpbCBAb2JqZWN0c3RhY2svc3BlYyBzaGlwcyBBRFItMDA0N1xuICAgICAgICAvLyAoVXNlckZpbHRlcnNTY2hlbWEgaXMgaW4gZnJhbWV3b3JrIG1haW4sID4gOS4yLjApXG4gICAgICB9IGFzIGFueSksXG4gICAgfSxcblxuICAgIG15X2FjY291bnRzOiB7XG4gICAgICBuYW1lOiAnbXlfYWNjb3VudHMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdNeSBBY2NvdW50cycsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2FjY291bnQnIH0sXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnaW5kdXN0cnknLCAnYW5udWFsX3JldmVudWUnLCAncGhvbmUnLCAnbGFzdF9hY3Rpdml0eV9kYXRlJ10sXG4gICAgICBmaWx0ZXI6IFt7IGZpZWxkOiAnb3duZXJfaWQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiAne2N1cnJlbnRfdXNlcl9pZH0nIH1dLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICdsYXN0X2FjdGl2aXR5X2RhdGUnLCBvcmRlcjogJ2Rlc2MnIH1dLFxuICAgIH0sXG5cbiAgICAvLyBUaGUgYHJlbmV3YWxzX2R1ZWAgdmlldyBpcyBnb25lIHdpdGggdGhlIGZpZWxkcyBpdCB3YXMgYnVpbHQgb24gKCMxMTgxKTpcbiAgICAvLyBib3RoIGl0cyBgaXNfbm90X251bGxgIGZpbHRlciBhbmQgaXRzIHNvcnQga2V5IHdlcmVcbiAgICAvLyBgY3JtX2FjY291bnQubmV4dF9yZW5ld2FsX2RhdGVgLCBzbyB0aGUgdmlldyBjb3VsZCBub3Qgb3V0bGl2ZSB0aGUgZmllbGQuXG4gICAgLy8gTm90aGluZyBpcyBsb3N0IFx1MjAxNCBgY3JtX2NvbnRyYWN0YCBzaGlwcyB0aGUgcmVuZXdhbHMgcXVldWUgdGhhdCB0aGUgZGFpbHlcbiAgICAvLyBzd2VlcCBhY3R1YWxseSBhY3RzIG9uIChgcmVuZXdhbF9jYWxlbmRhcmAsIG92ZXIgYGVuZF9kYXRlYCkuXG5cbiAgICAvKiogQXQtcmlzayBjdXN0b21lcnMgXHUyMDE0IENTTSBhY3Rpb24gcXVldWUgKi9cbiAgICBhdF9yaXNrX2FjY291bnRzOiB7XG4gICAgICBuYW1lOiAnYXRfcmlza19hY2NvdW50cycsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICBsYWJlbDogJ1x1MjZBMFx1RkUwRiBBdC1SaXNrIEFjY291bnRzJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fYWNjb3VudCcgfSxcbiAgICAgIGNvbHVtbnM6IFsnbmFtZScsICd0aWVyJywgJ2hlYWx0aF9zY29yZScsICdzZWdtZW50JywgJ2xhc3RfYWN0aXZpdHlfZGF0ZSddLFxuICAgICAgZmlsdGVyOiBbXG4gICAgICAgIHsgZmllbGQ6ICd0eXBlJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ2N1c3RvbWVyJyB9LFxuICAgICAgICB7IGZpZWxkOiAnaGVhbHRoX3Njb3JlJywgb3BlcmF0b3I6ICdpbicsIHZhbHVlOiBbJ2F0X3Jpc2snLCAnY2h1cm5pbmcnXSB9LFxuICAgICAgXSxcbiAgICAgIHNvcnQ6IFt7IGZpZWxkOiAnaGVhbHRoX3Njb3JlJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICB9LFxuICB9LFxuXG4gIGZvcm06IHtcbiAgICB0eXBlOiAndGFiYmVkJyxcbiAgICBzZWN0aW9uczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAncHJvZmlsZScsXG4gICAgICAgIGxhYmVsOiAnUHJvZmlsZScsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgZmllbGQ6ICduYW1lJywgcmVxdWlyZWQ6IHRydWUsIHNwYW46ICdmdWxsJyB9LFxuICAgICAgICAgICdhY2NvdW50X251bWJlcicsXG4gICAgICAgICAgLy8gYHR5cGVgIChwcm9zcGVjdCAvIGN1c3RvbWVyIC8gcGFydG5lciBcdTIwMjYpIGRyaXZlcyB0aGUgUmVuZXdhbHMgYW5kXG4gICAgICAgICAgLy8gQXQtUmlzayB2aWV3cycgYHR5cGUgPSBjdXN0b21lcmAgZmlsdGVyIFx1MjAxNCB3aXRoIG5vIGZvcm0gZmllbGQgaXRcbiAgICAgICAgICAvLyBjb3VsZCBuZXZlciBiZSBzZXQsIHNvIHRob3NlIHZpZXdzIG1hdGNoZWQgbm90aGluZy5cbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgJ2luZHVzdHJ5JyxcbiAgICAgICAgICAncGhvbmUnLFxuICAgICAgICAgICd3ZWJzaXRlJyxcbiAgICAgICAgICAnb3duZXJfaWQnLFxuICAgICAgICAgICdwYXJlbnRfYWNjb3VudCcsXG4gICAgICAgICAgJ2lzX2FjdGl2ZScsXG4gICAgICAgICAgJ2JyYW5kX2NvbG9yJyxcbiAgICAgICAgICAvLyBUaGUgb3RoZXIgaGFsZiBvZiB0aGUgYGJyYW5kaW5nYCBncm91cC4gV2l0aG91dCBhIGZvcm0gZmllbGQgdGhlcmVcbiAgICAgICAgICAvLyBpcyBubyB1cGxvYWQgY29udHJvbCBhbnl3aGVyZSBpbiB0aGUgYXBwLCBzbyB0aGUgbG9nbyB0aGUgZ2FsbGVyeVxuICAgICAgICAgIC8vIGNhcmRzIG5vdyBjb3ZlciB3aXRoIGNvdWxkIG5ldmVyIGhhdmUgYmVlbiBzZXQuIEZ1bGwgc3BhbjogYW5cbiAgICAgICAgICAvLyBpbWFnZSBkcm9wIHRhcmdldCBpbiBhIGhhbGYtd2lkdGggY2VsbCBpcyBhIHRodW1ibmFpbC1zaXplZCBvbmUuXG4gICAgICAgICAgeyBmaWVsZDogJ2xvZ28nLCBzcGFuOiAnZnVsbCcgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIGBjaGlsZF9hY2NvdW50X3JldmVudWVgIGlzIGEgcm9sbC11cCB0aGUgZW5naW5lIG1haW50YWlucywgc28gaXQgaXNcbiAgICAgICAgLy8gcmVhZC1vbmx5IG9uIHRoZSBmb3JtIGJ5IGNvbnN0cnVjdGlvbiBcdTIwMTQgaXQgaXMgaGVyZSBiZWNhdXNlIGEgaGllcmFyY2h5XG4gICAgICAgIC8vIG5vYm9keSBjYW4gc2VlIHRoZSBlZmZlY3Qgb2YgaXMgdGhlIGRlY29yYXRpb24gdGhpcyBmaWVsZCByZXBsYWNlZC5cbiAgICAgICAgbmFtZTogJ2ZpbmFuY2lhbHMnLFxuICAgICAgICBsYWJlbDogJ0ZpbmFuY2lhbHMnLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFsnYW5udWFsX3JldmVudWUnLCAnbnVtYmVyX29mX2VtcGxveWVlcycsICdjaGlsZF9hY2NvdW50X3JldmVudWUnXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIFRoZSBjdXN0b21lci1zdWNjZXNzIGZpZWxkcyB0aGUgYXRfcmlza19hY2NvdW50cyB2aWV3IGxpc3RzIGFuZFxuICAgICAgICAvLyBmaWx0ZXJzIG9uLiBUaGV5IGV4aXN0ZWQgb24gdGhlIG9iamVjdCBidXQgbm8gZm9ybSBvZmZlcmVkIHRoZW0sIHNvXG4gICAgICAgIC8vIHRoZSBDUyB3b3JraW5nIHF1ZXVlIHN0YXllZCBwZXJtYW5lbnRseSBlbXB0eS4gKGByZW5ld2FsX293bmVyYCBhbmRcbiAgICAgICAgLy8gYG5leHRfcmVuZXdhbF9kYXRlYCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGlzIHNlY3Rpb24gd2l0aCB0aGUgZmllbGRzXG4gICAgICAgIC8vIHRoZW1zZWx2ZXMgXHUyMDE0ICMxMTgxLilcbiAgICAgICAgbmFtZTogJ2N1c3RvbWVyX3N1Y2Nlc3MnLFxuICAgICAgICBsYWJlbDogJ0N1c3RvbWVyIFN1Y2Nlc3MnLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFsndGllcicsICdzZWdtZW50JywgJ2hlYWx0aF9zY29yZSddLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2xvY2F0aW9ucycsXG4gICAgICAgIGxhYmVsOiAnTG9jYXRpb25zJyxcbiAgICAgICAgY29sdW1uczogMSxcbiAgICAgICAgLy8gYGJpbGxpbmdfY291bnRyeWAgYW5kIGB0ZXJyaXRvcnlgIGFyZSByZWFkb25seSBhbmQgZGVyaXZlZCwgYnV0IGJvdGhcbiAgICAgICAgLy8gYXJlIG9uIHRoZSBmb3JtIG9uIHB1cnBvc2U6IGFuIGFkbWluIGFza2luZyBcIndoeSBkb2VzIHRoZSBOQSB0ZWFtIG5vdFxuICAgICAgICAvLyBzZWUgdGhpcyBhY2NvdW50P1wiIHJlYWRzIHRoZSBhbnN3ZXIgb2ZmIHRoZSByZWNvcmQgaW5zdGVhZCBvZlxuICAgICAgICAvLyBndWVzc2luZyBhdCB0aGUgYWRkcmVzcyBibG9iICgjNjIxKS4gYHRlcnJpdG9yeWAgaXMgd2hhdCB0aGUgcnVsZXNcbiAgICAgICAgLy8gYWN0dWFsbHkgbWF0Y2ggKCM2MzkpIGFuZCBgYmlsbGluZ19jb3VudHJ5YCBpcyB0aGUgaW5wdXQgaXQgd2FzXG4gICAgICAgIC8vIGNsYXNzaWZpZWQgZnJvbSwgc28gdGhlIHR3byB0b2dldGhlciBzaG93IHRoZSB3aG9sZSBkZXJpdmF0aW9uIFx1MjAxNFxuICAgICAgICAvLyBpbmNsdWRpbmcgdGhlIGNhc2UgdGhlIHBpY2tsaXN0IGFsb25lIGNhbm5vdCBleHBsYWluLCBhbiBhY2NvdW50XG4gICAgICAgIC8vIHNpdHRpbmcgaW4gYE90aGVyYCBiZWNhdXNlIGl0cyBjb3VudHJ5IHdhcyB0eXBlZCBpbiBhIHNwZWxsaW5nIHRoZVxuICAgICAgICAvLyBtYXBwaW5nIGRvZXMgbm90IGtub3cuXG4gICAgICAgIGZpZWxkczogWydiaWxsaW5nX2FkZHJlc3MnLCAnYmlsbGluZ19jb3VudHJ5JywgJ3RlcnJpdG9yeScsICdvZmZpY2VfbG9jYXRpb24nXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdkZXNjcmlwdGlvbicsXG4gICAgICAgIGxhYmVsOiAnRGVzY3JpcHRpb24nLFxuICAgICAgICBjb2x1bW5zOiAxLFxuICAgICAgICBmaWVsZHM6IFsnZGVzY3JpcHRpb24nXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3MvY29udGFjdC52aWV3LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzL2NvbnRhY3Qudmlldy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBDb250YWN0IFZpZXdzXG4gKlxuICogICBcdTIwMjIgZ3JpZCAgICBcdTIwMTQgcHJpbWFyeSByb3N0ZXIgd2l0aCBhdmF0YXJcbiAqICAgXHUyMDIyIGdhbGxlcnkgXHUyMDE0IHBlb3BsZSBkaXJlY3RvcnkgY2FyZHMgKGF2YXRhciBhcyBjb3ZlcilcbiAqL1xuZXhwb3J0IGNvbnN0IENvbnRhY3RWaWV3cyA9IGRlZmluZVZpZXcoe1xuICBsaXN0OiB7XG4gICAgdHlwZTogJ2dyaWQnLFxuICAgIG5hbWU6ICdhbGxfY29udGFjdHMnLFxuICAgIGxhYmVsOiAnQWxsIENvbnRhY3RzJyxcbiAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9jb250YWN0JyB9LFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICdhdmF0YXInLCB3aWR0aDogNjQsIGFsaWduOiAnY2VudGVyJyB9LFxuICAgICAgeyBmaWVsZDogJ2ZpcnN0X25hbWUnLCB3aWR0aDogMTQwLCBzb3J0YWJsZTogdHJ1ZSwgbGluazogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ2xhc3RfbmFtZScsIHdpZHRoOiAxNDAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAnY3JtX2FjY291bnQnLCB3aWR0aDogMjAwIH0sXG4gICAgICB7IGZpZWxkOiAndGl0bGUnLCB3aWR0aDogMTgwIH0sXG4gICAgICB7IGZpZWxkOiAnZGVwYXJ0bWVudCcsIHdpZHRoOiAxNDAgfSxcbiAgICAgIC8vIFJFUS0wMDA0IGFjY2VwdGFuY2UgMjogdGhlIHRocmVlIGJ1eWluZy1jZW50cmUgYXR0cmlidXRlcyBhcmUgY29sdW1uc1xuICAgICAgLy8gb24gdGhlIGxhbmRpbmcgcm9zdGVyLCB3aGljaCBpcyBhbHJlYWR5IGdyb3VwZWQgYnkgYWNjb3VudCB3aXRoIHRoZVxuICAgICAgLy8gZ3JvdXBzIGNvbGxhcHNlZCBcdTIwMTQgc28gZXhwYW5kaW5nIG9uZSBhY2NvdW50IHJlYWRzIGFzIGEgTUFQICh3aG9cbiAgICAgIC8vIGRlY2lkZXMsIHdobyBpcyBvbiBvdXIgc2lkZSkgaW5zdGVhZCBvZiBhIGRpcmVjdG9yeS4gQ29sdW1ucyBhcmUgYWxzb1xuICAgICAgLy8gd2hhdCB0aGUgbGlzdCdzIG93biBmaWx0ZXIgYW5kIGdyb3VwaW5nIGNvbnRyb2xzIG9mZmVyLlxuICAgICAgeyBmaWVsZDogJ2J1eWluZ19mdW5jdGlvbicsIHdpZHRoOiAxNjAgfSxcbiAgICAgIHsgZmllbGQ6ICdhdHRpdHVkZScsIHdpZHRoOiAxNDAgfSxcbiAgICAgIHsgZmllbGQ6ICdyZWxhdGlvbnNoaXBfc3RyZW5ndGgnLCB3aWR0aDogMTgwIH0sXG4gICAgICB7IGZpZWxkOiAnZW1haWwnLCB3aWR0aDogMjIwIH0sXG4gICAgICB7IGZpZWxkOiAncGhvbmUnLCB3aWR0aDogMTUwIH0sXG4gICAgICB7IGZpZWxkOiAnb3duZXJfaWQnLCB3aWR0aDogMTUwIH0sXG4gICAgXSxcbiAgICBzb3J0OiBbeyBmaWVsZDogJ2xhc3RfbmFtZScsIG9yZGVyOiAnYXNjJyB9XSxcbiAgICBncm91cGluZzogeyBmaWVsZHM6IFt7IGZpZWxkOiAnY3JtX2FjY291bnQnLCBvcmRlcjogJ2FzYycsIGNvbGxhcHNlZDogdHJ1ZSB9XSB9LFxuICAgIHNlbGVjdGlvbjogeyB0eXBlOiAnbXVsdGlwbGUnIH0sXG4gICAgLy8gVGhlIHNlbGVjdGlvbi1iYXIgZW50cnkgcG9pbnQgZm9yIGNhbXBhaWduaW5nIGF0IGV4aXN0aW5nIGN1c3RvbWVyc1xuICAgIC8vICgjNTk3KSwgbWlycm9yaW5nIGBidWxrQWN0aW9uczogWydjcmVhdGVfY2FtcGFpZ24nXWAgb24gdGhlIGxlYWQgZ3JpZC5cbiAgICAvLyBUaGUgYmFyZS1zdHJpbmcgZm9ybSBmYW5zIHRoZSBhY3Rpb24gb3V0IG9uY2UgcGVyIHNlbGVjdGVkIHJvdzsgZG8gbm90XG4gICAgLy8gYWRkIHN0cmluZ3MgZm9yIGBtYXJrX3ByaW1hcnlgIC8gYHNlbmRfZW1haWxgLCB3aGljaCBkZWNsYXJlXG4gICAgLy8gYGxvY2F0aW9uczogWydsaXN0X2l0ZW0nXWAgYW5kIGFyZSBhdXRvLWluamVjdGVkIGludG8gdGhlIHJvdyBtZW51LlxuICAgIGJ1bGtBY3Rpb25zOiBbJ2FkZF9jb250YWN0X3RvX2NhbXBhaWduJ10sXG4gICAgcGFnaW5hdGlvbjogeyBwYWdlU2l6ZTogNTAsIHBhZ2VTaXplT3B0aW9uczogWzI1LCA1MCwgMTAwXSB9LFxuICAgIGV4cG9ydE9wdGlvbnM6IHsgZm9ybWF0czogWydjc3YnLCAneGxzeCddIH0sXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnLCAnZ2FsbGVyeSddLFxuICAgIH0sXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgLyoqIFBlb3BsZSBkaXJlY3RvcnkgKi9cbiAgICBjb250YWN0X2RpcmVjdG9yeToge1xuICAgICAgbmFtZTogJ2NvbnRhY3RfZGlyZWN0b3J5JyxcbiAgICAgIHR5cGU6ICdnYWxsZXJ5JyxcbiAgICAgIGxhYmVsOiAnUGVvcGxlIERpcmVjdG9yeScsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2NvbnRhY3QnIH0sXG4gICAgICBjb2x1bW5zOiBbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgJ3RpdGxlJywgJ2VtYWlsJ10sXG4gICAgICBnYWxsZXJ5OiB7XG4gICAgICAgIGNvdmVyRmllbGQ6ICdhdmF0YXInLFxuICAgICAgICBjb3ZlckZpdDogJ2NvdmVyJyxcbiAgICAgICAgY2FyZFNpemU6ICdzbWFsbCcsXG4gICAgICAgIHRpdGxlRmllbGQ6ICdsYXN0X25hbWUnLFxuICAgICAgICB2aXNpYmxlRmllbGRzOiBbJ2ZpcnN0X25hbWUnLCAndGl0bGUnLCAnZGVwYXJ0bWVudCcsICdlbWFpbCcsICdwaG9uZScsICdjcm1fYWNjb3VudCddLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgcHJpbWFyeV9jb250YWN0czoge1xuICAgICAgbmFtZTogJ3ByaW1hcnlfY29udGFjdHMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdQcmltYXJ5IENvbnRhY3RzJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fY29udGFjdCcgfSxcbiAgICAgIGNvbHVtbnM6IFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnLCAnY3JtX2FjY291bnQnLCAndGl0bGUnLCAnZW1haWwnLCAncGhvbmUnXSxcbiAgICAgIGZpbHRlcjogW3sgZmllbGQ6ICdpc19wcmltYXJ5Jywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogdHJ1ZSB9XSxcbiAgICAgIHNvcnQ6IFt7IGZpZWxkOiAnY3JtX2FjY291bnQnLCBvcmRlcjogJ2FzYycgfV0sXG4gICAgfSxcbiAgfSxcblxuICBmb3JtOiB7XG4gICAgdHlwZTogJ3RhYmJlZCcsXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2lkZW50aXR5JyxcbiAgICAgICAgbGFiZWw6ICdJZGVudGl0eScsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICdzYWx1dGF0aW9uJyxcbiAgICAgICAgICB7IGZpZWxkOiAnZmlyc3RfbmFtZScsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ2xhc3RfbmFtZScsIHJlcXVpcmVkOiB0cnVlLCBzcGFuOiAnZnVsbCcgfSxcbiAgICAgICAgICB7IGZpZWxkOiAnY3JtX2FjY291bnQnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICd0aXRsZScsXG4gICAgICAgICAgJ2RlcGFydG1lbnQnLFxuICAgICAgICAgICdvd25lcl9pZCcsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBSRVEtMDAwNCBhY2NlcHRhbmNlIDE6IHRoZSBidXlpbmctY2VudHJlIGdyb3VwIGlzIHJlbmRlcmVkIEZST01cbiAgICAgICAgLy8gYGZpZWxkR3JvdXBzYCwgd2l0aCBubyBwZXItZmllbGQgZW51bWVyYXRpb24gYXV0aG9yZWQgYW55d2hlcmUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoaXMgZm9ybSBhdXRob3JzIGBzZWN0aW9uc2AsIGFuZCBhbiBhdXRob3JlZCBgc2VjdGlvbnNgIGFycmF5IHdpbnNcbiAgICAgICAgLy8gb3V0cmlnaHQgb3ZlciB0aGUgcmVuZGVyZXIncyBgZmllbGRHcm91cHNgIGF1dG8tZGVyaXZhdGlvbiAodGhlXG4gICAgICAgIC8vIG1lY2hhbmlzbSBpcyB3cml0dGVuIHVwIGF0IGxlbmd0aCBpbiBgY2FzZS52aWV3LnRzYCksIHNvIGEgZ3JvdXBcbiAgICAgICAgLy8gZGVjbGFyZWQgb24gdGhlIG9iamVjdCBhbG9uZSB3b3VsZCByZWFjaCB0aGUgU1lOVEhFU0laRUQgZGV0YWlsXG4gICAgICAgIC8vIHBhZ2UgYW5kIG5ldmVyIHRoaXMgZm9ybSBcdTIwMTQgd2hpY2ggaXMgYWxzbyB0aGUgY3JlYXRlIGRpYWxvZy4gVGhlXG4gICAgICAgIC8vIGdyb3VwLXJlZmVyZW5jZSBmb3JtIGlzIHJ1bmcgMiBvZiB0aGUgQUdFTlRTLm1kIGxhZGRlciwgZm9yIGV4YWN0bHlcbiAgICAgICAgLy8gdGhpcyBcInBhcnRpYWwgYXJyYW5nZW1lbnQgaXMgZ2VudWluZWx5IG5lZWRlZFwiIGNhc2U6IGBncm91cDpgXG4gICAgICAgIC8vIGluaGVyaXRzIHRoZSBvYmplY3QncyBgYnV5aW5nX2NlbnRyZWAgbWVtYmVycyAoZXZlcnkgZmllbGQgcG9pbnRpbmdcbiAgICAgICAgLy8gYXQgaXQsIGluIGRlY2xhcmF0aW9uIG9yZGVyKSBhbmQgaXRzIHByZXNlbnRhdGlvbiwgc28gYWRkaW5nIGFcbiAgICAgICAgLy8gZm91cnRoIGF0dHJpYnV0ZSB0byB0aGUgZ3JvdXAgbGF0ZXIgcmVhY2hlcyB0aGlzIGZvcm0gYnkgaXRzZWxmLlxuICAgICAgICAvL1xuICAgICAgICAvLyBcdTI2RDQgYGdyb3VwOmAgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGZpZWxkczpgIGFuZCB3aXRoIGV2ZXJ5IGtleVxuICAgICAgICAvLyB0aGUgZ3JvdXAgaXRzZWxmIGRlY2xhcmVzIChgbmFtZWAsIGBsYWJlbGAsIGBkZXNjcmlwdGlvbmAsXG4gICAgICAgIC8vIGB2aXNpYmxlV2hlbmAsIGBjb2xsYXBzaWJsZWAvYGNvbGxhcHNlZDogdHJ1ZWApIFx1MjAxNCBgY29sdW1uc2AgaXMgbm90XG4gICAgICAgIC8vIG9uZSBvZiB0aG9zZSwgYmVjYXVzZSB0aGUgZ3JvdXAgZGVjbGFyZXMgbm90aGluZyBhYm91dCBsYXlvdXQuXG4gICAgICAgIGdyb3VwOiAnYnV5aW5nX2NlbnRyZScsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBOYW1lZCBgY29udGFjdF9kZXRhaWxzYCwgbm90IGBjb250YWN0X2luZm9gIFx1MjAxNCBgY29udGFjdF9pbmZvYCBpc1xuICAgICAgICAvLyBhbHJlYWR5IGEgZGlzdGluY3QgZmllbGRHcm91cCBrZXkgb24gYGNybV9jb250YWN0YCAoXCJDb250YWN0XG4gICAgICAgIC8vIEluZm9ybWF0aW9uXCIpLCBhbmQgcmV1c2luZyBpdCBoZXJlIHdvdWxkIG1ha2UgdGhpcyBzZWN0aW9uJ3NcbiAgICAgICAgLy8gdHJhbnNsYXRlZCBoZWFkaW5nIGZvbGxvdyB0aGF0IGdyb3VwJ3Mgd29yZGluZyBpbnN0ZWFkIG9mIGl0cyBvd25cbiAgICAgICAgLy8gXCJDb250YWN0IEluZm9cIi5cbiAgICAgICAgbmFtZTogJ2NvbnRhY3RfZGV0YWlscycsXG4gICAgICAgIGxhYmVsOiAnQ29udGFjdCBJbmZvJyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbJ2VtYWlsJywgJ3Bob25lJywgJ21vYmlsZScsICdhdmF0YXInXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIE5hbWVkIGBtYWlsaW5nX2FkZHJlc3NgIFx1MjAxNCBkZWxpYmVyYXRlbHkgdGhlIFNBTUUga2V5IGFzIHRoZVxuICAgICAgICAvLyBgbWFpbGluZ19hZGRyZXNzYCBmaWVsZEdyb3VwIG9uIGBjcm1fY29udGFjdGAsIHdoaWNoIGlzIHRoZSBvcHBvc2l0ZVxuICAgICAgICAvLyBjYWxsIGZyb20gdGhlIHR3byBzZWN0aW9ucyBlaXRoZXIgc2lkZSBvZiBpdCBhbmQgZm9yIHRoZSBzYW1lXG4gICAgICAgIC8vIHJlYXNvbi4gUmV1c2luZyBhIGdyb3VwIGtleSBtYWtlcyB0aGUgc2VjdGlvbidzIHRyYW5zbGF0ZWQgaGVhZGluZ1xuICAgICAgICAvLyBmb2xsb3cgdGhhdCBncm91cCdzIHdvcmRpbmc7IGBjb250YWN0X2RldGFpbHNgIGFuZFxuICAgICAgICAvLyBgY29tbV9wcmVmZXJlbmNlc2Agd2FudGVkIHRoZWlyIG93biBzaG9ydGVyIHdvcmRpbmcsIHNvIHRoZXkgaGFkIHRvXG4gICAgICAgIC8vIGF2b2lkIHRoZSBjb2xsaXNpb24uIFRoaXMgc2VjdGlvbiB3YW50cyBleGFjdGx5IHRoZSBncm91cCdzIHdvcmRpbmdcbiAgICAgICAgLy8gKFwiTWFpbGluZyBBZGRyZXNzXCIpLCB3aGljaCBldmVyeSBsb2NhbGUgYWxyZWFkeSBjYXJyaWVzIHVuZGVyXG4gICAgICAgIC8vIGBvYmplY3RzLmNybV9jb250YWN0Ll9zZWN0aW9ucy5tYWlsaW5nX2FkZHJlc3NgLCBzbyB0aGUgY29sbGlzaW9uIGlzXG4gICAgICAgIC8vIHRoZSBmZWF0dXJlOiBvbmUgaGVhZGluZywgb25lIHRyYW5zbGF0aW9uLCBmb3VyIGxvY2FsZXMsIG5vIG5ldyByb3cuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdoeSB0aGUgc2VjdGlvbiBleGlzdHMgYXQgYWxsOiBhbiBhdXRob3JlZCBgc2VjdGlvbnNgIGFycmF5IHdpbnNcbiAgICAgICAgLy8gb3V0cmlnaHQgb3ZlciB0aGUgcmVuZGVyZXIncyBgZmllbGRHcm91cHNgIGF1dG8tZGVyaXZhdGlvbiAodGhlXG4gICAgICAgIC8vIG1lY2hhbmlzbSBpcyB3cml0dGVuIHVwIGF0IGxlbmd0aCBpbiBgY2FzZS52aWV3LnRzYCksIGFuZCB0aGlzIGZvcm1cbiAgICAgICAgLy8gaXMgYWxzbyB0aGUgQ1JFQVRFIGRpYWxvZy4gV2l0aG91dCB0aGlzIHNlY3Rpb24gdGhlIGFkZHJlc3Mgd2FzXG4gICAgICAgIC8vIHJlYWRhYmxlIG9uIHRoZSBTWU5USEVTSVpFRCBkZXRhaWwgcGFnZSBcdTIwMTQgd2hpY2ggZG9lcyBkZXJpdmUgZnJvbVxuICAgICAgICAvLyBgZmllbGRHcm91cHNgIFx1MjAxNCB3aGlsZSBubyBmb3JtIGluIHRoZSBhcHAgY291bGQgZW50ZXIgb3IgZWRpdCBpdCxcbiAgICAgICAgLy8gZXZlbiB0aG91Z2ggYGNvbnRhY3RfaW1wb3J0Lm1hcHBpbmcudHNgIHdyaXRlcyBpdCBmcm9tIHRoZSBzaGlwcGVkXG4gICAgICAgIC8vIENTViB0ZW1wbGF0ZS4gVGhpcyB0YWIgaXMgdGhlIGF1dGhvcmluZyBoYWxmIG9mIHRoZSBpbXBvcnQgcGF0aC5cbiAgICAgICAgbmFtZTogJ21haWxpbmdfYWRkcmVzcycsXG4gICAgICAgIGxhYmVsOiAnTWFpbGluZyBBZGRyZXNzJyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgLy8gT25lIHN0cnVjdHVyZWQgYGFkZHJlc3NgIGZpZWxkOyBmdWxsIHdpZHRoLCBzbyBpdHMgcGFydHMgbGF5IG91dFxuICAgICAgICAgIC8vIGFzIGEgdW5pdCByYXRoZXIgdGhhbiBpbiBoYWxmIGEgZ3JpZCBjb2x1bW4uXG4gICAgICAgICAgeyBmaWVsZDogJ21haWxpbmdfYWRkcmVzcycsIHNwYW46ICdmdWxsJyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gTmFtZWQgYGNvbW1fcHJlZmVyZW5jZXNgLCBub3QgYHByZWZlcmVuY2VzYCBcdTIwMTQgYHByZWZlcmVuY2VzYCBpc1xuICAgICAgICAvLyBhbHJlYWR5IGEgZGlzdGluY3QgZmllbGRHcm91cCBrZXkgb24gYGNybV9jb250YWN0YCAoXCJDb21tdW5pY2F0aW9uXG4gICAgICAgIC8vIFByZWZlcmVuY2VzXCIpLCBhbmQgcmV1c2luZyBpdCBoZXJlIHdvdWxkIG1ha2UgdGhpcyBzZWN0aW9uJ3NcbiAgICAgICAgLy8gdHJhbnNsYXRlZCBoZWFkaW5nIGZvbGxvdyB0aGF0IGdyb3VwJ3Mgd29yZGluZyBpbnN0ZWFkIG9mIGl0cyBvd25cbiAgICAgICAgLy8gXCJQcmVmZXJlbmNlc1wiLlxuICAgICAgICBuYW1lOiAnY29tbV9wcmVmZXJlbmNlcycsXG4gICAgICAgIGxhYmVsOiAnUHJlZmVyZW5jZXMnLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFsnbGVhZF9zb3VyY2UnLCAnaXNfcHJpbWFyeScsICdkb19ub3RfY2FsbCcsICdlbWFpbF9vcHRfb3V0J10sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzL29wcG9ydHVuaXR5LnZpZXcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3Mvb3Bwb3J0dW5pdHkudmlldy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBPcHBvcnR1bml0eSBWaWV3c1xuICpcbiAqIFNhbGVzIHBpcGVsaW5lIGJlbmVmaXRzIGZyb20gbXVsdGlwbGUgdmlzdWFsaXNhdGlvbnM6XG4gKiAgIFx1MjAyMiBncmlkICAgICBcdTIwMTQgZnVsbCBwaXBlbGluZSBicm93c2luZyAmIGlubGluZSBlZGl0c1xuICogICBcdTIwMjIga2FuYmFuICAgXHUyMDE0IGRyYWctYW5kLWRyb3AgcGlwZWxpbmUgc3RhZ2UgbWFuYWdlbWVudCAoZ3JvdXAgYnkgc3RhZ2UpXG4gKiAgIFx1MjAyMiBjYWxlbmRhciBcdTIwMTQgY2xvc2UtZGF0ZSBmb3JlY2FzdGluZyBvbiBhIG1vbnRobHkgdmlld1xuICogICBcdTIwMjIgdGltZWxpbmUgXHUyMDE0IGNocm9ub2xvZ2ljYWwgZGVhbCBmbG93IGdyb3VwZWQgYnkgb3duZXJcbiAqICAgXHUyMDIyIGdhbGxlcnkgIFx1MjAxNCBwaW5ib2FyZCAvIGV4ZWN1dGl2ZSByZXZpZXcgY2FyZHNcbiAqL1xuZXhwb3J0IGNvbnN0IE9wcG9ydHVuaXR5Vmlld3MgPSBkZWZpbmVWaWV3KHtcbiAgLy8gVGhlIGxhbmRpbmcgdmlldyBpcyBPUEVOIGRlYWxzLCBub3QgZXZlcnkgZGVhbCBldmVyIHJlY29yZGVkLlxuICAvL1xuICAvLyBTb3J0ZWQgYnkgY2xvc2VfZGF0ZSBhc2NlbmRpbmcgYW5kIHVuZmlsdGVyZWQsIFwiQWxsIE9wcG9ydHVuaXRpZXNcIiBvcGVuZWRcbiAgLy8gb24gc2V0dGxlZCBoaXN0b3J5OiB0aGUgZmlyc3Qgc2NyZWVuIHdhcyA3IGNsb3NlZC13b24gYW5kIDQgY2xvc2VkLWxvc3RcbiAgLy8gcmVjb3JkcywgYW5kIGEgcmVwIGhhZCB0byBzY3JvbGwgcGFzdCBtb250aHMgb2YgZmluaXNoZWQgYnVzaW5lc3MgdG8gcmVhY2hcbiAgLy8gYW55dGhpbmcgdGhleSBjb3VsZCBzdGlsbCBhY3Qgb24uIFRoZSBmdWxsIHVuZmlsdGVyZWQgbGlzdCBpcyBzdGlsbCBvbmVcbiAgLy8gY2xpY2sgYXdheSBvbiB0aGUgXCJBbGwgT3Bwb3J0dW5pdGllc1wiIHRhYi5cbiAgbGlzdDoge1xuICAgIHR5cGU6ICdncmlkJyxcbiAgICBuYW1lOiAnb3Blbl9vcHBvcnR1bml0aWVzJyxcbiAgICBsYWJlbDogJ09wZW4gRGVhbHMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX29wcG9ydHVuaXR5JyB9LFxuICAgIGZpbHRlcjogW1xuICAgICAgeyBmaWVsZDogJ3N0YWdlJywgb3BlcmF0b3I6ICdub3RfaW4nLCB2YWx1ZTogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfSxcbiAgICBdLFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICduYW1lJywgd2lkdGg6IDIyMCwgc29ydGFibGU6IHRydWUsIGxpbms6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdjcm1fYWNjb3VudCcsIGxhYmVsOiAnQWNjb3VudCcsIHdpZHRoOiAxODAgfSxcbiAgICAgIHsgZmllbGQ6ICdzdGFnZScsIHdpZHRoOiAxNDAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAnYW1vdW50Jywgd2lkdGg6IDE0MCwgYWxpZ246ICdyaWdodCcsIHNvcnRhYmxlOiB0cnVlLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgeyBmaWVsZDogJ3Byb2JhYmlsaXR5Jywgd2lkdGg6IDExMCwgYWxpZ246ICdyaWdodCcgfSxcbiAgICAgIHsgZmllbGQ6ICdleHBlY3RlZF9yZXZlbnVlJywgd2lkdGg6IDE2MCwgYWxpZ246ICdyaWdodCcsIHN1bW1hcnk6ICdzdW0nIH0sXG4gICAgICB7IGZpZWxkOiAnY2xvc2VfZGF0ZScsIHdpZHRoOiAxNDAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgXSxcbiAgICBzb3J0OiBbeyBmaWVsZDogJ2Nsb3NlX2RhdGUnLCBvcmRlcjogJ2FzYycgfV0sXG4gICAgcm93Q29sb3I6IHtcbiAgICAgIGZpZWxkOiAnc3RhZ2UnLFxuICAgICAgY29sb3JzOiB7XG4gICAgICAgIHByb3NwZWN0aW5nOiAnc2xhdGUnLFxuICAgICAgICBxdWFsaWZpY2F0aW9uOiAnc2t5JyxcbiAgICAgICAgLy8gVGVhbCBzaXRzIGJldHdlZW4gdGhlIGNvb2wgcXVhbGlmaWNhdGlvbiBibHVlIGFuZCB0aGUgd2FybSBwcm9wb3NhbFxuICAgICAgICAvLyBhbWJlciwga2VlcGluZyB0aGUgY29vbFx1MjE5Mndhcm0gZnVubmVsIHJhbXAgcmVhZGFibGUuIE5PVCB0aGUgZ29sZFxuICAgICAgICAvLyBgI0ZGRDcwMGAgdGhpcyBvcHRpb24gY2FycmllcyBpbiBgX3BpY2tsaXN0cy50c2A6IGdvbGQgaXMgb25lIGh1ZVxuICAgICAgICAvLyBzdGVwIGZyb20gcHJvcG9zYWwncyBhbWJlciwgc28gdGhlIHR3byBhZGphY2VudCBzdGFnZXMgd291bGQgdGludFxuICAgICAgICAvLyByb3dzIHRoZSBzYW1lLlxuICAgICAgICAvL1xuICAgICAgICAvLyBWYWx1ZXMgYXJlIGNvbG91ciBOQU1FUywgbm90IGhleDogb2JqZWN0dWkncyBgdXNlUm93Q29sb3JgIHJlc29sdmVzXG4gICAgICAgIC8vIG9ubHkgYSBuYW1lIGZyb20gaXRzIG93biB2b2NhYnVsYXJ5IChvciBhIGZ1bGwgYGJnLSpgIGNsYXNzKSBhbmRcbiAgICAgICAgLy8gdHVybnMgYSBoZXggaW50byBubyBjb2xvdXIgYXQgYWxsIFx1MjAxNCBzbyB1bnRpbCAxNy42LjAncyBsaW50IHNhaWQgc28sXG4gICAgICAgIC8vIHRoaXMgbWFwIHRpbnRlZCBub3RoaW5nLlxuICAgICAgICBuZWVkc19hbmFseXNpczogJ3RlYWwnLFxuICAgICAgICBwcm9wb3NhbDogJ2FtYmVyJyxcbiAgICAgICAgbmVnb3RpYXRpb246ICdwdXJwbGUnLFxuICAgICAgICBjbG9zZWRfd29uOiAnZ3JlZW4nLFxuICAgICAgICBjbG9zZWRfbG9zdDogJ3JlZCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAgcGFnaW5hdGlvbjogeyBwYWdlU2l6ZTogMjUsIHBhZ2VTaXplT3B0aW9uczogWzI1LCA1MCwgMTAwXSB9LFxuICAgIHNlbGVjdGlvbjogeyB0eXBlOiAnbXVsdGlwbGUnIH0sXG4gICAgc2hvd1JlY29yZENvdW50OiB0cnVlLFxuICAgIGV4cG9ydE9wdGlvbnM6IHsgZm9ybWF0czogWydjc3YnLCAneGxzeCddIH0sXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnLCAna2FuYmFuJywgJ2NhbGVuZGFyJywgJ3RpbWVsaW5lJywgJ2dhbGxlcnknXSxcbiAgICB9LFxuICAgIC8vIEJpbmRzIHRoZSAnY2FsZW5kYXInIGVudHJ5IGFib3ZlOiB0aGUgc2FtZSBmb3JlY2FzdCBkYXRlcyB0aGUgZGVkaWNhdGVkXG4gICAgLy8gYGNsb3NlX2RhdGVfY2FsZW5kYXJgIHZpZXcgc2hvd3MsIG9uIHRoZSBmaWVsZCB0aGlzIGxpc3Qgc29ydHMgYnkuXG4gICAgLy8gYGNsb3NlX2RhdGVgIGlzIHJlcXVpcmVkICsgbm90TnVsbCBvbiBjcm1fb3Bwb3J0dW5pdHkuXG4gICAgY2FsZW5kYXI6IHtcbiAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnY2xvc2VfZGF0ZScsXG4gICAgICB0aXRsZUZpZWxkOiAnbmFtZScsXG4gICAgICBjb2xvckZpZWxkOiAnc3RhZ2UnLFxuICAgIH0sXG4gICAgLy8gTGlzdC1sZXZlbCBlbnRyeSBwb2ludHM6IGdlbmVyYXRlX3F1b3RlIHJlYWNoZXMgdGhlIHJvdyBtZW51IHZpYSBpdHNcbiAgICAvLyBvd24gYGxvY2F0aW9uczogWydsaXN0X2l0ZW0nXWAuIEJ1aWx0LWluIGBleHBvcnRPcHRpb25zYCBjb3ZlcnMgQ1NWXG4gICAgLy8gZXhwb3J0LlxuICAgIC8vXG4gICAgLy8gYG1hc3NfdXBkYXRlX3N0YWdlYCBpcyB3aXJlZCBhcyBhbiBBR0dSRUdBVEUgYnVsayBkZWYsIG5vdCBhcyBhIGJhcmVcbiAgICAvLyBgYnVsa0FjdGlvbnM6IFsnbWFzc191cGRhdGVfc3RhZ2UnXWAgc3RyaW5nICgjNTA4KS4gVGhlIHR3byBmb3JtcyBhcmVcbiAgICAvLyBkaWZmZXJlbnQgZGlzcGF0Y2ggY29udHJhY3RzLCBhbmQgb25seSB0aGlzIG9uZSBtb3ZlcyBhIHdob2xlIHNlbGVjdGlvbjpcbiAgICAvL1xuICAgIC8vICAgLSBiYXJlIHN0cmluZyAgXHUyMTkyIHBlci1yZWNvcmQgZmFuLW91dDogdGhlIGFjdGlvbiBpcyBkaXNwYXRjaGVkIE9OQ0UgUEVSXG4gICAgLy8gICAgIHNlbGVjdGVkIHJvdyB3aXRoIGByZWNvcmRJZGAgc2V0LiBOIHJlcXVlc3RzLCBOIHN0YWdlIG1vdmVzLlxuICAgIC8vICAgLSBhZ2dyZWdhdGUgZGVmIFx1MjE5MiBPTkUgZGlzcGF0Y2ggZm9yIHRoZSB3aG9sZSBzZWxlY3Rpb24sIGNhcnJ5aW5nIGV2ZXJ5XG4gICAgLy8gICAgIGlkIGluIHRoZSBidWlsdGluIGBwYXJhbXMuX3NlbGVjdGVkSWRzYCBhbmQgbm8gYHJlY29yZElkYC4gT25lXG4gICAgLy8gICAgIHJlcXVlc3QsIE4gc3RhZ2UgbW92ZXMsIG9uZSBhdWRpdCBlbnRyeS5cbiAgICAvL1xuICAgIC8vIEFnZ3JlZ2F0ZSBpcyB0aGUgcmlnaHQgc2hhcGUgaGVyZSBiZWNhdXNlIHRoZSBib2R5IGFscmVhZHkgbG9vcHMgb3ZlciB0aGVcbiAgICAvLyBzZWxlY3Rpb24gaXRzZWxmLCBhbmQgYmVjYXVzZSB0aGUgcnVuIGlzIGFsbC1vci1ub3RoaW5nOiBhIHBhcnRpYWwgcmVzdWx0XG4gICAgLy8gcmVqZWN0cyBpbnN0ZWFkIG9mIGxlYXZpbmcgdGhlIGJhciByZXBvcnRpbmcgcGVyLXJvdyBzdWNjZXNzIGl0IGNhbm5vdFxuICAgIC8vIGhvbm91ciAoc2VlIHRoZSBib2R5IGluIGBzcmMvc2FsZXMvYWN0aW9ucy9vcHBvcnR1bml0eS5hY3Rpb25zLnRzYCkuXG4gICAgLy9cbiAgICAvLyBgZXhlY3V0aW9uOiAnYWdncmVnYXRlJ2AgaXMgUkVRVUlSRUQgb24gYW4gYG9wZXJhdGlvbjogJ2N1c3RvbSdgIGRlZiBhbmRcbiAgICAvLyBpcyBub3QgYm9pbGVycGxhdGU6IGEgY3VzdG9tIGRlZiB3aXRob3V0IGl0IGhhcyBubyBkaXNwYXRjaGVyLCBzbyB0aGVcbiAgICAvLyBidXR0b24gdGlja3MgZ3JlZW4gb25jZSBwZXIgcm93IGFuZCBkb2VzIG5vdGhpbmcgYXQgYWxsLiBUaGUgc3BlYyByZWZ1c2VzXG4gICAgLy8gdGhhdCBzaGFwZSBhdCBwYXJzZSB0aW1lICgjNDQ1NykgXHUyMDE0IHdoaWNoIGlzIGFsc28gd2hhdCBtYWtlcyB0aGlzXG4gICAgLy8gZGVjbGFyYXRpb24gc2FmZSB0byB0cnVzdCByYXRoZXIgdGhhbiBtZXJlbHkgcHJlc2VudC5cbiAgICAvL1xuICAgIC8vIEhpc3Rvcnk6IHRoaXMgbGlzdCBjYXJyaWVkIHRoZSBiYXJlLXN0cmluZyBmb3JtIHVudGlsICM1ODggcmVtb3ZlZCBpdCBhc1xuICAgIC8vIGEgc2lsZW50IG5vLW9wLCBhbmQgdGhlIHJlbW92YWwgd2FzIHJlYWQgYXMgXCJ0aGUgcGxhdGZvcm0gY2Fubm90IGRlbGl2ZXJcbiAgICAvLyBhIHNlbGVjdGlvblwiIGZvciB0d28gcmVsZWFzZSBjYW5kaWRhdGVzLiBJdCBjb3VsZDogdGhlIGNoYW5uZWwgaXNcbiAgICAvLyBgcGFyYW1zLl9zZWxlY3RlZElkc2AsIHRoZSB1bmRlcnNjb3JlIGlzIGxvYWQtYmVhcmluZywgYW5kIG5vdGhpbmcgd2FzXG4gICAgLy8gaW5qZWN0aW5nIGl0IHByZWNpc2VseSBCRUNBVVNFIHRoaXMgZGVjbGFyYXRpb24gd2FzIGdvbmVcbiAgICAvLyAob2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjNTU2OCwgY2xvc2VkIHdvcmtzLWFzLWRlY2xhcmVkKS5cbiAgICAvL1xuICAgIC8vIFRoZSBkZWYgZGVsaWJlcmF0ZWx5IGNhcnJpZXMgb25seSB0aGUgdGhyZWUga2V5cyB0aGF0IGNob29zZSB0aGUgZGlzcGF0Y2hcbiAgICAvLyBjb250cmFjdC4gTGFiZWwsIGljb24sIHBhcmFtcyAodGhlIE5ldyBTdGFnZSBwaWNrZXIpIGFuZCBgdmlzaWJsZWAgYXJlXG4gICAgLy8gcHJvbW90ZWQgZnJvbSB0aGUgYWN0aW9uIGl0c2VsZiBieSB0aGUgcmVuZGVyZXIsIHNvIHRoZSBkaWFsb2cgYW5kIHRoZVxuICAgIC8vIHRvb2xiYXIgYnV0dG9uIGNhbm5vdCBkcmlmdCBhcGFydCBcdTIwMTQgYW5kIHRoZSBsYWJlbCBzdGF5cyBpMThuLXJlc29sdmVkLFxuICAgIC8vIHdoaWNoIGFuIGlubGluZSBgbGFiZWw6YCBoZXJlIHdvdWxkIG5vdCBiZS5cbiAgICBidWxrQWN0aW9uRGVmczogW1xuICAgICAgeyBuYW1lOiAnbWFzc191cGRhdGVfc3RhZ2UnLCBvcGVyYXRpb246ICdjdXN0b20nLCBleGVjdXRpb246ICdhZ2dyZWdhdGUnIH0sXG4gICAgXSxcbiAgfSxcblxuICBsaXN0Vmlld3M6IHtcbiAgICAvKipcbiAgICAgKiBBbGwgT3Bwb3J0dW5pdGllcyBcdTIwMTQgdGhlIHVuZmlsdGVyZWQgYm9vaywgaW5jbHVkaW5nIGNsb3NlZCBidXNpbmVzcy5cbiAgICAgKlxuICAgICAqIERlbW90ZWQgZnJvbSB0aGUgbGFuZGluZyB2aWV3IChzZWUgdGhlIG5vdGUgb24gYGxpc3RgIGFib3ZlKSBidXQga2VwdFxuICAgICAqIHdob2xlOiByZXBvcnRpbmcsIGF1ZGl0cyBhbmQgd2luL2xvc3MgcmV2aWV3cyBhbGwgbmVlZCB0aGUgY2xvc2VkIHJvd3MsXG4gICAgICogYW5kIGEgbWFuYWdlciByZWFjaGVzIHRoaXMgaW4gb25lIGNsaWNrLlxuICAgICAqL1xuICAgIGFsbF9vcHBvcnR1bml0aWVzOiB7XG4gICAgICBuYW1lOiAnYWxsX29wcG9ydHVuaXRpZXMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdBbGwgT3Bwb3J0dW5pdGllcycsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX29wcG9ydHVuaXR5JyB9LFxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7IGZpZWxkOiAnbmFtZScsIHdpZHRoOiAyMjAsIHNvcnRhYmxlOiB0cnVlLCBsaW5rOiB0cnVlIH0sXG4gICAgICAgIHsgZmllbGQ6ICdjcm1fYWNjb3VudCcsIGxhYmVsOiAnQWNjb3VudCcsIHdpZHRoOiAxODAgfSxcbiAgICAgICAgeyBmaWVsZDogJ3N0YWdlJywgd2lkdGg6IDE0MCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgICAgeyBmaWVsZDogJ2Ftb3VudCcsIHdpZHRoOiAxNDAsIGFsaWduOiAncmlnaHQnLCBzb3J0YWJsZTogdHJ1ZSwgc3VtbWFyeTogJ3N1bScgfSxcbiAgICAgICAgeyBmaWVsZDogJ3Byb2JhYmlsaXR5Jywgd2lkdGg6IDExMCwgYWxpZ246ICdyaWdodCcgfSxcbiAgICAgICAgeyBmaWVsZDogJ2V4cGVjdGVkX3JldmVudWUnLCB3aWR0aDogMTYwLCBhbGlnbjogJ3JpZ2h0Jywgc3VtbWFyeTogJ3N1bScgfSxcbiAgICAgICAgeyBmaWVsZDogJ2Nsb3NlX2RhdGUnLCB3aWR0aDogMTQwLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgICB7IGZpZWxkOiAnb3duZXJfaWQnLCB3aWR0aDogMTUwIH0sXG4gICAgICBdLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICdjbG9zZV9kYXRlJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICAgIHNob3dSZWNvcmRDb3VudDogdHJ1ZSxcbiAgICB9LFxuXG4gICAgLyoqIERyYWctYW5kLWRyb3Agc2FsZXMgcGlwZWxpbmUgKi9cbiAgICBwaXBlbGluZV9rYW5iYW46IHtcbiAgICAgIG5hbWU6ICdwaXBlbGluZV9rYW5iYW4nLFxuICAgICAgdHlwZTogJ2thbmJhbicsXG4gICAgICBsYWJlbDogJ1NhbGVzIFBpcGVsaW5lJyxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknIH0sXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnY3JtX2FjY291bnQnLCAnYW1vdW50JywgJ2Nsb3NlX2RhdGUnLCAnb3duZXJfaWQnXSxcbiAgICAgIGthbmJhbjoge1xuICAgICAgICBncm91cEJ5RmllbGQ6ICdzdGFnZScsXG4gICAgICAgIHN1bW1hcml6ZUZpZWxkOiAnYW1vdW50JyxcbiAgICAgICAgY29sdW1uczogWyduYW1lJywgJ2NybV9hY2NvdW50JywgJ2Ftb3VudCcsICdjbG9zZV9kYXRlJ10sXG4gICAgICB9LFxuICAgICAgLy8gVGhlIGJvYXJkIGlzIHRoZSBhY3RpdmUgd29ya2luZyBwaXBlbGluZS4gQ2xvc2VkIGJ1c2luZXNzIHJlbWFpbnMgaW5cbiAgICAgIC8vIHRoZSBmdWxsIGJvb2sgYW5kIHRoZSBkYXNoYm9hcmQsIHdoaWxlIGV4Y2x1ZGluZyBpdCBoZXJlIGtlZXBzIGFsbFxuICAgICAgLy8gZml2ZSBhY3RpdmUgc3RhZ2VzIHZpc2libGUgYXQgYSBwcmVzZW50YXRpb24tZnJpZW5kbHkgd2lkdGguXG4gICAgICBmaWx0ZXI6IFt7IGZpZWxkOiAnc3RhZ2UnLCBvcGVyYXRvcjogJ25vdF9pbicsIHZhbHVlOiBbJ2Nsb3NlZF93b24nLCAnY2xvc2VkX2xvc3QnXSB9XSxcbiAgICAgIHNvcnQ6IFt7IGZpZWxkOiAnY2xvc2VfZGF0ZScsIG9yZGVyOiAnYXNjJyB9XSxcbiAgICAgIG5hdmlnYXRpb246IHsgbW9kZTogJ2RyYXdlcicsIHdpZHRoOiAnNjQwcHgnIH0sXG4gICAgfSxcblxuICAgIC8qKiBDbG9zZS1kYXRlIGZvcmVjYXN0aW5nIGNhbGVuZGFyICovXG4gICAgY2xvc2VfZGF0ZV9jYWxlbmRhcjoge1xuICAgICAgbmFtZTogJ2Nsb3NlX2RhdGVfY2FsZW5kYXInLFxuICAgICAgdHlwZTogJ2NhbGVuZGFyJyxcbiAgICAgIGxhYmVsOiAnRm9yZWNhc3QgQ2FsZW5kYXInLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScgfSxcbiAgICAgIGNvbHVtbnM6IFsnbmFtZScsICdhbW91bnQnLCAnc3RhZ2UnLCAnb3duZXJfaWQnXSxcbiAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnY2xvc2VfZGF0ZScsXG4gICAgICAgIHRpdGxlRmllbGQ6ICduYW1lJyxcbiAgICAgICAgY29sb3JGaWVsZDogJ3N0YWdlJyxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKiBDaHJvbm9sb2dpY2FsIGRlYWwgZmxvdyAqL1xuICAgIGRlYWxfdGltZWxpbmU6IHtcbiAgICAgIG5hbWU6ICdkZWFsX3RpbWVsaW5lJyxcbiAgICAgIHR5cGU6ICd0aW1lbGluZScsXG4gICAgICBsYWJlbDogJ0RlYWwgVGltZWxpbmUnLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScgfSxcbiAgICAgIGNvbHVtbnM6IFsnbmFtZScsICdjcm1fYWNjb3VudCcsICdhbW91bnQnXSxcbiAgICAgIHRpbWVsaW5lOiB7XG4gICAgICAgIC8vIGBjcmVhdGVkX2F0YCwgdGhlIHBsYXRmb3JtJ3Mgb3duIGNyZWF0aW9uIHN0YW1wIFx1MjAxNCB0aGUgb2JqZWN0J3NcbiAgICAgICAgLy8gZHVwbGljYXRlIGBjcmVhdGVkX2RhdGVgIHdhcyByZW1vdmVkIGluICM1NzUgQjIgYmVjYXVzZSBub3RoaW5nIGV2ZXJcbiAgICAgICAgLy8gd3JvdGUgaXQsIHNvIHRoaXMgdGltZWxpbmUgc3RhcnRlZCBldmVyeSBiYXIgYXQgbnVsbC4gU2FtZSBzcGVsbGluZ1xuICAgICAgICAvLyBhcyB0aGUgbGVhZCBhY3Rpdml0eSBjYWxlbmRhci5cbiAgICAgICAgc3RhcnREYXRlRmllbGQ6ICdjcmVhdGVkX2F0JyxcbiAgICAgICAgZW5kRGF0ZUZpZWxkOiAnY2xvc2VfZGF0ZScsXG4gICAgICAgIHRpdGxlRmllbGQ6ICduYW1lJyxcbiAgICAgICAgZ3JvdXBCeUZpZWxkOiAnb3duZXJfaWQnLFxuICAgICAgICBjb2xvckZpZWxkOiAnc3RhZ2UnLFxuICAgICAgICBzY2FsZTogJ21vbnRoJyxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKiBFeGVjdXRpdmUgcmV2aWV3IGNhcmRzICovXG4gICAgZGVhbF9nYWxsZXJ5OiB7XG4gICAgICBuYW1lOiAnZGVhbF9nYWxsZXJ5JyxcbiAgICAgIHR5cGU6ICdnYWxsZXJ5JyxcbiAgICAgIGxhYmVsOiAnRGVhbCBDYXJkcycsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX29wcG9ydHVuaXR5JyB9LFxuICAgICAgY29sdW1uczogWyduYW1lJywgJ2NybV9hY2NvdW50JywgJ2Ftb3VudCcsICdzdGFnZScsICdjbG9zZV9kYXRlJ10sXG4gICAgICBnYWxsZXJ5OiB7XG4gICAgICAgIGNhcmRTaXplOiAnbWVkaXVtJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ25hbWUnLFxuICAgICAgICB2aXNpYmxlRmllbGRzOiBbJ2NybV9hY2NvdW50JywgJ2Ftb3VudCcsICdzdGFnZScsICdwcm9iYWJpbGl0eScsICdjbG9zZV9kYXRlJywgJ293bmVyX2lkJ10sXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvKiogUGVyc29uYWwgcGlwZWxpbmUgKi9cbiAgICBteV9vcGVuX2RlYWxzOiB7XG4gICAgICBuYW1lOiAnbXlfb3Blbl9kZWFscycsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICBsYWJlbDogJ015IE9wZW4gRGVhbHMnLFxuICAgICAgdXNlckFjdGlvbnM6IHsgZWRpdElubGluZTogdHJ1ZSB9LFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScgfSxcbiAgICAgIGNvbHVtbnM6IFsnbmFtZScsICdjcm1fYWNjb3VudCcsICdzdGFnZScsICdhbW91bnQnLCAnY2xvc2VfZGF0ZSddLFxuICAgICAgLy8gXCJPcGVuXCIgaGFzIHRvIGV4Y2x1ZGUgQk9USCBjbG9zZWQgc3RhZ2VzLiBFeGNsdWRpbmcgb25seSBjbG9zZWRfd29uXG4gICAgICAvLyBtZWFudCBhIHJlcCdzIG93biBxdWV1ZSBvcGVuZWQgb24gdGhlaXIgbG9zdCBkZWFscywgc29ydGVkIHRvIHRoZSB0b3BcbiAgICAgIC8vIGJ5IGNsb3NlX2RhdGUgXHUyMDE0IHRoZSBsZWFzdCBhY3Rpb25hYmxlIHJvd3MgaW4gdGhlIHN5c3RlbS5cbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAnb3duZXJfaWQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiAne2N1cnJlbnRfdXNlcl9pZH0nIH0sXG4gICAgICAgIHsgZmllbGQ6ICdzdGFnZScsIG9wZXJhdG9yOiAnbm90X2luJywgdmFsdWU6IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0sXG4gICAgICBdLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICdjbG9zZV9kYXRlJywgb3JkZXI6ICdhc2MnIH1dLFxuICAgIH0sXG5cbiAgICAvKiogU3RhbGUgT3Bwb3J0dW5pdGllcyBcdTIwMTQgc3RpbGwtb3BlbiBkZWFscywgbG9uZ2VzdC1wYXJrZWQgZmlyc3QgKi9cbiAgICBzdGFsZV9vcHBvcnR1bml0aWVzOiB7XG4gICAgICBuYW1lOiAnc3RhbGVfb3Bwb3J0dW5pdGllcycsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICAvLyBIb25lc3QgbGFiZWw6IHRoaXMgdmlldyBkb2VzIG5vdCBhcHBseSB0aGUgMTQtZGF5IGN1dCBpdHMgYXV0b21hdGlvblxuICAgICAgLy8gdHdpbiAoYG9wcG9ydHVuaXR5X3N0YWduYXRpb25gLCBTVEFMRV9USFJFU0hPTERfREFZUyA9IDE0KSB1c2VzLCBhbmRcbiAgICAgIC8vIGRvZXMgbm90IGNsYWltIHRvLiBUd28gaW5kZXBlbmRlbnQgcmVhc29ucyB3ZXJlIHJlY29yZGVkIGZvciB0aGF0OyBvbmVcbiAgICAgIC8vIHN0aWxsIGhvbGRzIGFuZCBvbmUgaGFzIGV4cGlyZWQsIHNvIHRoZXkgYXJlIHNlcGFyYXRlZCBoZXJlLlxuICAgICAgLy9cbiAgICAgIC8vIFNUSUxMIFRSVUUgXHUyMDE0IGBkYXlzX2luX3N0YWdlYCBpcyBhIEZPUk1VTEEgKCM0ODkpLCBldmFsdWF0ZWQgaW4gSlMgYWZ0ZXJcbiAgICAgIC8vIHRoZSBxdWVyeSwgc28gdGhlIGRhdGEgZW5naW5lIGNhbiBuZWl0aGVyIGZpbHRlciBub3Igc29ydCBvbiBpdC4gQW55XG4gICAgICAvLyBmaWx0ZXIgcGhyYXNlZCBpbiB0ZXJtcyBvZiBgZGF5c19pbl9zdGFnZWAgcmVtYWlucyBpbXBvc3NpYmxlLlxuICAgICAgLy9cbiAgICAgIC8vIEVYUElSRUQgKCM3NDQpIFx1MjAxNCB0aGUgc2Vjb25kIHJlYXNvbiBzYWlkIHRoZSBsaXN0IGRhdGEgcGF0aCByZXNvbHZlcyBub1xuICAgICAgLy8gZGF0ZSBtYWNyb3MsIHNvIGBzdGFnZV9lbnRyeV9kYXRlIDwgezE0X2RheXNfYWdvfWAgd291bGQgc2hpcCB0aGUgdG9rZW5cbiAgICAgIC8vIGFzIGEgbGl0ZXJhbCBhbmQgaW52ZXJ0IHRoZSBjb21wYXJpc29uIGxleGljb2dyYXBoaWNhbGx5ICgnMjAyNi1cdTIwMjYnIHNvcnRzXG4gICAgICAvLyBiZWxvdyAneycsIHNvIGV2ZXJ5IHJvdyBtYXRjaGVkKS4gVGhhdCB3YXMgbWVhc3VyZWQgb24gQG9iamVjdHN0YWNrXG4gICAgICAvLyAxNi4xLjAgYW5kIHN0b3BwZWQgYmVpbmcgdHJ1ZSBhdCAxNy4wLjAtcmMuMCwgd2hlbiBgcmVzb2x2ZUZpbHRlclRva2VucygpYFxuICAgICAgLy8gd2FzIHdpcmVkIGludG8gdGhlIE9iamVjdFFMIHJlYWQgcGF0aCAob2JqZWN0cWwgIzM1ODIpLiBgezE0X2RheXNfYWdvfWBcbiAgICAgIC8vIGlzIGEgZmlyc3QtY2xhc3Mgdm9jYWJ1bGFyeSBtZW1iZXIgXHUyMDE0IGl0IG1hdGNoZXMgdGhlIHBhcmFtZXRlcmlzZWRcbiAgICAgIC8vIGdyYW1tYXIgYERBVEVfTUFDUk9fUEFSQU1fUkVgLCBge05fKG1pbnV0ZXN8aG91cnN8ZGF5c3x3ZWVrc3xtb250aHN8XG4gICAgICAvLyB5ZWFycylfKGFnb3xmcm9tX25vdyl9YCBcdTIwMTQgYW5kIGl0IHJlYWNoZXMgdGhlIGRyaXZlciBhbHJlYWR5IHN1YnN0aXR1dGVkXG4gICAgICAvLyBmb3IgYW4gSVNPIGRhdGUuIE1lYXN1cmVkIG9uIDE3LjAuMC1yYy4yLCBSRS1NRUFTVVJFRCAyMDI2LTA5LTAzIG9uXG4gICAgICAvLyAxNy4yLjAgKCMxNDY3KSwgUkUtUlVOIG9uIDE3LjMuMCAoIzE2NzYsIGFmdGVyIHRoZSBQUiAjMTU3NyBidW1wKSBhbmRcbiAgICAgIC8vIFJFLVJVTiBhZ2FpbiBvbiAxNy40LjAgKCMxODgzLCBhZnRlciB0aGUgUFIgIzE4MTQgYnVtcDsgbm90IHlldCBvblxuICAgICAgLy8gMTcuNS4wKSwgdW5jaGFuZ2VkIGF0IGV2ZXJ5IHRha2luZzogb3ZlciBmb3VyIHJvd3MgcGFya2VkXG4gICAgICAvLyAzMGQgLyAxNWQgLyAxM2QgLyAxZCwgYHN0YWdlX2VudHJ5X2RhdGUgPCB7MTRfZGF5c19hZ299YCByZXR1cm5lZCB0aGVcbiAgICAgIC8vIDMwZCBhbmQgMTVkIHJvd3MgXHUyMDE0IHRoZSBzYW1lIHR3byB0aGUgZXF1aXZhbGVudCBkYXktc3RhcnQgbGl0ZXJhbFxuICAgICAgLy8gcmV0dXJucywgYW5kIG5vdCBhbGwgZm91ciwgd2hpY2ggaXMgd2hhdCBhbiB1bnN1YnN0aXR1dGVkIHRva2VuIHdvdWxkXG4gICAgICAvLyBoYXZlIG1hdGNoZWQuIEl0IGlzIHRoZSBzYW1lIHNlYW1cbiAgICAgIC8vIGBjbG9zaW5nX3RoaXNfcXVhcnRlcmAgXHUyMDE0IHRoZSB2ZXJ5IG5leHQgdmlldyBpbiB0aGlzIGZpbGUgXHUyMDE0IHJlbGllcyBvbixcbiAgICAgIC8vIHBpbm5lZCBhZ2FpbnN0IGEgcmVhbCBlbmdpbmUgaW5cbiAgICAgIC8vIGB0ZXN0L2ZvcmVjYXN0LWN1cnJlbnQtcXVhcnRlci12aWV3LnRlc3QudHNgLlxuICAgICAgLy9cbiAgICAgIC8vIENvcnJlY3RpbmcgdGhhdCBoYWxmIG9mIHRoZSBjb21tZW50IGRvZXMgbm90IGRlY2lkZSBhbnl0aGluZyBhYm91dCB0aGVcbiAgICAgIC8vIGZpbHRlciwgYW5kIGlzIGRlbGliZXJhdGVseSBub3QgYSBsaWNlbmNlIHRvIGNoYW5nZSBpdDogZXhwcmVzc2luZyB0aGVcbiAgICAgIC8vIGN1dCBhcyBgc3RhZ2VfZW50cnlfZGF0ZSA8PSB7MTRfZGF5c19hZ299YCB3b3VsZCBkcm9wIGBkYXlzX2luX3N0YWdlYFxuICAgICAgLy8gZnJvbSB0aGUgcXVlc3Rpb24gZW50aXJlbHkgYW5kIGNoYW5nZSB3aGljaCByb3dzIHRoaXMgdmlldyByZXR1cm5zIFx1MjAxNFxuICAgICAgLy8gaGlkaW5nIHRvZGF5J3MgMTMtZGF5LW9sZCBkZWFscyBmcm9tIGEgbWFuYWdlcidzIHF1ZXVlLiBUaGF0IGlzIGFcbiAgICAgIC8vIEJFSEFWSU9VUiBjaGFuZ2Ugd2l0aCBpdHMgb3duIGlzc3VlICgjNzcwKSwgd2hlcmUgdGhlIG9wZW4gcXVlc3Rpb24gaXNcbiAgICAgIC8vIHdoZXRoZXIgdGhpcyBxdWV1ZSBzaG91bGQgYmUgYSBjdXQgb3IgYSByYW5raW5nIGF0IGFsbCBcdTIwMTQgdGhpcyBsYWJlbFxuICAgICAgLy8gcHJvbWlzZXMgYSByYW5raW5nIGFuZCBob25vdXJzIGl0LiBgc3RhbGVfYXJ0aWNsZXNgIGluXG4gICAgICAvLyBgc3JjL3ZpZXdzL2tub3dsZWRnZV9hcnRpY2xlLnZpZXcudHNgIGNhcnJpZWQgdGhlIHNhbWUgZXhwaXJlZCBwcmVtaXNlXG4gICAgICAvLyBhbmQgd2FzIGNvcnJlY3RlZCBpbiB0aGUgc2FtZSBwYXNzICgjNzY5KTsgdGhhdCB0YWIgd2FzIHRoZW4gREVMRVRFRFxuICAgICAgLy8gb3V0cmlnaHQgKCM3ODEsIHRoZSByZXZpZXcgcXVldWUgcnVsZWQgb3V0IG9mIHRoZSBwcm9kdWN0KSwgc28gaXQgaXMgbm9cbiAgICAgIC8vIGxvbmdlciBhIGNvbXBhcmlzb24gYXZhaWxhYmxlIGluIHRoaXMgdHJlZSBcdTIwMTQgdGhlIHN1cnZpdmluZyBwcmVjZWRlbnRcbiAgICAgIC8vIGZvciBcInJhbmtpbmcsIG5vdCBjdXRcIiBpcyB0aGlzIHZpZXcuIE5vdGhpbmcgYmVsb3cgd2FzIHRvdWNoZWQuXG4gICAgICAvL1xuICAgICAgLy8gQXMgc2hpcHBlZDogb3BlcmF0b3Itb25seSBmaWx0ZXIsIG9yZGVyZWQgYnkgdGhlIHN0b3JlZFxuICAgICAgLy8gYHN0YWdlX2VudHJ5X2RhdGVgIGFzY2VuZGluZyBcdTIwMTQgbG9uZ2VzdC1wYXJrZWQgb24gdG9wLCB3aGljaCBpcyB0aGVcbiAgICAgIC8vIHF1ZXVlIGEgbWFuYWdlciB3b3Jrcy4gVGhlIGBkYXlzX2luX3N0YWdlYCBjb2x1bW4gcHV0cyB0aGVcbiAgICAgIC8vIGBvcHBvcnR1bml0eV9zdGFnbmF0aW9uYCB0aHJlc2hvbGQgaW4gcGxhaW4gc2lnaHQgb24gZXZlcnkgcm93LlxuICAgICAgbGFiZWw6ICdcdTI2QTBcdUZFMEYgU3RhbGUgT3Bwb3J0dW5pdGllcyBcdTAwQjcgTG9uZ2VzdCBpbiBTdGFnZSBGaXJzdCcsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX29wcG9ydHVuaXR5JyB9LFxuICAgICAgY29sdW1uczogWyduYW1lJywgJ2NybV9hY2NvdW50JywgJ3N0YWdlJywgJ2Ftb3VudCcsICdzdGFnZV9lbnRyeV9kYXRlJywgJ2RheXNfaW5fc3RhZ2UnLCAnY2xvc2VfZGF0ZScsICdvd25lcl9pZCddLFxuICAgICAgZmlsdGVyOiBbXG4gICAgICAgIHsgZmllbGQ6ICdzdGFnZScsIG9wZXJhdG9yOiAnbm90X2luJywgdmFsdWU6IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0sXG4gICAgICBdLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICdzdGFnZV9lbnRyeV9kYXRlJywgb3JkZXI6ICdhc2MnIH0sIHsgZmllbGQ6ICdjbG9zZV9kYXRlJywgb3JkZXI6ICdhc2MnIH1dLFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUZW5kZXIgZXhwZWN0ZWQgdGhpcyBxdWFydGVyIFx1MjAxNCBSRVEtMDAwNiBhY2NlcHRhbmNlIDIgaW4gb25lIHZpZXcuXG4gICAgICpcbiAgICAgKiBUaGUgcG9pbnQgb2YgdGhlIHZpZXcgaXMgdGhlIHByZWRpY2F0ZTogaXQgd2luZG93c1xuICAgICAqIGBleHBlY3RlZF90ZW5kZXJfZGF0ZWAsIHRoZSBDVVNUT01FUidzIHByb2N1cmVtZW50IGNhbGVuZGFyLCBhbmQgdG91Y2hlc1xuICAgICAqIGBjbG9zZV9kYXRlYCBub3doZXJlIFx1MjAxNCB3aGljaCBpcyB3aGF0IFwicmVwb3J0YWJsZSBpbmRlcGVuZGVudGx5IG9mXG4gICAgICogYGNsb3NlX2RhdGVgXCIgbWVhbnMgYW5kIHdoYXQgYSBzaW5nbGUgZm9yZWNhc3QgZGF0ZSBjb3VsZCBuZXZlciBleHByZXNzLlxuICAgICAqXG4gICAgICogU2FtZSBpbmNsdXNpdmUgYHtjdXJyZW50X3F1YXJ0ZXJfKn1gIGJvdW5kcyBhcyBgY2xvc2luZ190aGlzX3F1YXJ0ZXJgXG4gICAgICogYmVsb3csIGV4YWN0IGZvciB0aGUgc2FtZSBtZWFzdXJlZCByZWFzb246IGJvdGggYm91bmRzIGFyZSBkYXRlIG1hY3Jvc1xuICAgICAqIHJlc29sdmVkIHNlcnZlci1zaWRlLCBhbmQgYGV4cGVjdGVkX3RlbmRlcl9kYXRlYCBpcyBhIGBGaWVsZC5kYXRlKClgXG4gICAgICogc3RvcmVkIGFzIGBZWVlZLU1NLUREYCBURVhULCBzbyB0aGUgaW5jbHVzaXZlIHVwcGVyIGJvdW5kIGRyb3BzIG5vIHJvd3MuXG4gICAgICovXG4gICAgdGVuZGVyX3RoaXNfcXVhcnRlcjoge1xuICAgICAgbmFtZTogJ3RlbmRlcl90aGlzX3F1YXJ0ZXInLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdUZW5kZXIgVGhpcyBRdWFydGVyJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknIH0sXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnY3JtX2FjY291bnQnLCAnZXhwZWN0ZWRfdGVuZGVyX2RhdGUnLCAnZXhwZWN0ZWRfdGVuZGVyX2Ftb3VudCcsICdleHBlY3RlZF9zaWduaW5nX2RhdGUnLCAnc3RhZ2UnLCAnb3duZXJfaWQnXSxcbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAnc3RhZ2UnLCBvcGVyYXRvcjogJ25vdF9pbicsIHZhbHVlOiBbJ2Nsb3NlZF93b24nLCAnY2xvc2VkX2xvc3QnXSB9LFxuICAgICAgICB7IGZpZWxkOiAnZXhwZWN0ZWRfdGVuZGVyX2RhdGUnLCBvcGVyYXRvcjogJ2dyZWF0ZXJfdGhhbl9vcl9lcXVhbCcsIHZhbHVlOiAne2N1cnJlbnRfcXVhcnRlcl9zdGFydH0nIH0sXG4gICAgICAgIHsgZmllbGQ6ICdleHBlY3RlZF90ZW5kZXJfZGF0ZScsIG9wZXJhdG9yOiAnbGVzc190aGFuX29yX2VxdWFsJywgdmFsdWU6ICd7Y3VycmVudF9xdWFydGVyX2VuZH0nIH0sXG4gICAgICBdLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICdleHBlY3RlZF90ZW5kZXJfZGF0ZScsIG9yZGVyOiAnYXNjJyB9XSxcbiAgICAgIC8vIEVtcHR5IGlzIHRoZSBsZWdpdGltYXRlIHN0YXRlIG9uIGEgZnJlc2ggaW5zdGFsbDogbm8gc2VlZCByb3cgY2Fycmllc1xuICAgICAgLy8gYSBjdXN0b21lci1zaWRlIHRlbmRlciBkYXRlLCBzbyB0aGlzIHRhYiBvcGVucyBvbiBub3RoaW5nIHVudGlsIGEgcmVwXG4gICAgICAvLyByZWNvcmRzIG9uZS4gVW5leHBsYWluZWQsIHRoYXQgcmVhZHMgYXMgYnJva2VuLlxuICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICB0aXRsZTogJ05vIFRlbmRlcnMgRXhwZWN0ZWQgVGhpcyBRdWFydGVyJyxcbiAgICAgICAgbWVzc2FnZTogJ1RoaXMgdGFiIGxpc3RzIG9wZW4gZGVhbHMgd2hvc2UgY3VzdG9tZXItc2lkZSB0ZW5kZXIgZGF0ZSBmYWxscyBpbnNpZGUgdGhlIGN1cnJlbnQgcXVhcnRlci4gUmVjb3JkIEV4cGVjdGVkIFRlbmRlciBEYXRlIG9uIGEgZGVhbCB0byBzZWUgaXQgaGVyZS4nLFxuICAgICAgICBpY29uOiAnY2FsZW5kYXItY2xvY2snLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLyoqIENsb3NpbmcgdGhpcyBxdWFydGVyIChjb21taXQgKyBiZXN0X2Nhc2UpIFx1MjAxNCBzYWxlcy1tYW5hZ2VyIGZvcmVjYXN0ICovXG4gICAgY2xvc2luZ190aGlzX3F1YXJ0ZXI6IHtcbiAgICAgIG5hbWU6ICdjbG9zaW5nX3RoaXNfcXVhcnRlcicsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICBsYWJlbDogJ0Nsb3NpbmcgVGhpcyBRdWFydGVyJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknIH0sXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnY3JtX2FjY291bnQnLCAnYW1vdW50JywgJ2ZvcmVjYXN0X2NhdGVnb3J5JywgJ3Byb2JhYmlsaXR5JywgJ2Nsb3NlX2RhdGUnLCAnb3duZXJfaWQnXSxcbiAgICAgIC8vIFRoZSBgY2xvc2VfZGF0ZWAgd2luZG93IGlzIHdoYXQgbWFrZXMgdGhlIGxhYmVsIHRydWUgKCM3NDMpLiBXaXRob3V0XG4gICAgICAvLyBpdCB0aGlzIHZpZXcgcmV0dXJuZWQgRVZFUlkgb3BlbiBjb21taXQvYmVzdC1jYXNlIGRlYWwgd2hlbmV2ZXIgaXRcbiAgICAgIC8vIGNsb3NlZCBcdTIwMTQgYSBkZWFsIHNsYXRlZCBmb3IgbmV4dCBNYXJjaCBzYXQgdW5kZXIgYSBoZWFkaW5nIHRoYXQgc2FpZFxuICAgICAgLy8gXCJDbG9zaW5nIFRoaXMgUXVhcnRlclwiLCBhbmQgc3VtbWluZyB0aGUgQW1vdW50IGNvbHVtbiBnYXZlIGEgbnVtYmVyXG4gICAgICAvLyB0aGF0IHdhcyBub3QgdGhpcyBxdWFydGVyJ3MgY29tbWl0LlxuICAgICAgLy9cbiAgICAgIC8vIEJvdGggYm91bmRzIGFyZSBkYXRlIG1hY3JvcyByZXNvbHZlZCBzZXJ2ZXItc2lkZTogYHJlc29sdmVGaWx0ZXJUb2tlbnMoKWBcbiAgICAgIC8vIHdhcyB3aXJlZCBpbnRvIHRoZSBPYmplY3RRTCByZWFkIHBhdGggaW4gMTcuMC4wLXJjLjAgKG9iamVjdHFsICMzNTgyLFxuICAgICAgLy8gY292ZXJpbmcgZmluZC9maW5kT25lL2NvdW50L2FnZ3JlZ2F0ZSBhaGVhZCBvZiB0aGUgbWlkZGxld2FyZSBjaGFpbiksXG4gICAgICAvLyBzbyBhIHNhdmVkLXZpZXcgZmlsdGVyIHZhbHVlIHJlYWNoZXMgdGhlIGRyaXZlciBhbHJlYWR5IHN1YnN0aXR1dGVkLlxuICAgICAgLy8gTWVhc3VyZWQgb24gMTcuMC4wLXJjLjIsIFJFLU1FQVNVUkVEIDIwMjYtMDktMDMgb24gMTcuMi4wICgjMTQ2NyksXG4gICAgICAvLyBSRS1SVU4gb24gMTcuMy4wICgjMTY3NiwgYWZ0ZXIgdGhlIFBSICMxNTc3IGJ1bXApIGFuZCBSRS1SVU4gYWdhaW4gb25cbiAgICAgIC8vIDE3LjQuMCAoIzE4ODMsIGFmdGVyIHRoZSBQUiAjMTgxNCBidW1wKSwgdW5jaGFuZ2VkIGF0XG4gICAgICAvLyBldmVyeSB0YWtpbmcgXHUyMDE0IHNlZSB0aGUgcnVudGltZSBibG9jayBpblxuICAgICAgLy8gYHRlc3QvZm9yZWNhc3QtY3VycmVudC1xdWFydGVyLXZpZXcudGVzdC50c2AsIHdoaWNoIGlzIHRoYXRcbiAgICAgIC8vIHJlLW1lYXN1cmVtZW50IChub3QgeWV0IHJlLXJ1biBvbiAxNy41LjApLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSB1cHBlciBib3VuZCBpcyBJTkNMVVNJVkUgYWdhaW5zdCBge2N1cnJlbnRfcXVhcnRlcl9lbmR9YCByYXRoZXJcbiAgICAgIC8vIHRoYW4gaGFsZi1vcGVuIGFnYWluc3QgYHtuZXh0X3F1YXJ0ZXJfc3RhcnR9YCwgYW5kIHRoYXQgY2hvaWNlIGlzXG4gICAgICAvLyBkZWxpYmVyYXRlOiBhIGAqX2VuZGAgdG9rZW4gcmVzb2x2ZXMgdG8gdGhlIHBlcmlvZCdzIGxhc3QgY2FsZW5kYXIgREFZXG4gICAgICAvLyAoMjAyNi0wOS0zMCksIHdoaWNoIG9uIGEgYGRhdGV0aW1lYCBjb2x1bW4gd291bGQgc3RvcCBhdCBtaWRuaWdodCBhbmRcbiAgICAgIC8vIHNpbGVudGx5IGRyb3AgdGhhdCBkYXkncyByb3dzIFx1MjAxNCB0aGUgc3BlYyBzYXlzIHRvIHVzZSB0aGUgaGFsZi1vcGVuXG4gICAgICAvLyBmb3JtIHRoZXJlLiBgY2xvc2VfZGF0ZWAgaXMgYEZpZWxkLmRhdGUoKWAsIHN0b3JlZCBhcyBgWVlZWS1NTS1ERGBcbiAgICAgIC8vIFRFWFQgb24gYm90aCBzaWRlcyBvZiB0aGUgY29tcGFyaXNvbiwgc28gdGhlIGluY2x1c2l2ZSBib3VuZCBpcyBleGFjdC5cbiAgICAgIC8vIFRoYXQgaXMgdGhlIHNhbWUgZmllbGQtdHlwZSBwcm9wZXJ0eSBgbWV0YWRhdGEtcmVmZXJlbmNlcy50ZXN0LnRzYFxuICAgICAgLy8gcmVsaWVzIG9uIGZvciB3aHkgdGhlIENSTS9TYWxlcy9FeGVjdXRpdmUgZGFzaGJvYXJkcyBtYXkgd2luZG93XG4gICAgICAvLyBgY2xvc2VfZGF0ZWAgYXQgYWxsICgjNDYwKS4gQm90aCBmb3JtcyB3ZXJlIG1lYXN1cmVkIHRvIHJldHVybiB0aGVcbiAgICAgIC8vIGlkZW50aWNhbCByb3cgc2V0IGhlcmU7IHRoZSBpbmNsdXNpdmUgb25lIHJlYWRzIGFzIHdoYXQgaXQgbWVhbnMuXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgeyBmaWVsZDogJ2ZvcmVjYXN0X2NhdGVnb3J5Jywgb3BlcmF0b3I6ICdpbicsIHZhbHVlOiBbJ2NvbW1pdCcsICdiZXN0X2Nhc2UnXSB9LFxuICAgICAgICB7IGZpZWxkOiAnc3RhZ2UnLCBvcGVyYXRvcjogJ25vdF9pbicsIHZhbHVlOiBbJ2Nsb3NlZF93b24nLCAnY2xvc2VkX2xvc3QnXSB9LFxuICAgICAgICB7IGZpZWxkOiAnY2xvc2VfZGF0ZScsIG9wZXJhdG9yOiAnZ3JlYXRlcl90aGFuX29yX2VxdWFsJywgdmFsdWU6ICd7Y3VycmVudF9xdWFydGVyX3N0YXJ0fScgfSxcbiAgICAgICAgeyBmaWVsZDogJ2Nsb3NlX2RhdGUnLCBvcGVyYXRvcjogJ2xlc3NfdGhhbl9vcl9lcXVhbCcsIHZhbHVlOiAne2N1cnJlbnRfcXVhcnRlcl9lbmR9JyB9LFxuICAgICAgXSxcbiAgICAgIHNvcnQ6IFt7IGZpZWxkOiAnY2xvc2VfZGF0ZScsIG9yZGVyOiAnYXNjJyB9XSxcbiAgICAgIC8vIFNjb3BpbmcgdGhlIGxpc3QgbWFrZXMgXCJlbXB0eVwiIGEgc3RhdGUgYSByZWFsIHVzZXIgbWVldHMsIHNvIGl0IG5lZWRzXG4gICAgICAvLyBjb3B5LiBVbmxpa2UgdGhlIGZvcmVjYXN0IHZpZXcncyAoIzc0NSwgd2hlcmUgdGhlIHN3ZWVwIG93bnMgdGhlXG4gICAgICAvLyB3aW5kb3cgYW5kIGEgZnJlc2ggaW5zdGFsbCBpcyBBTFdBWVMgZW1wdHkgdW50aWwgaXQgcnVucyksIHRoZSBzZWVkc1xuICAgICAgLy8gaGVyZSBkbyBwcm9kdWNlIHJvd3MgZm9yIG1vc3Qgb2YgYSBxdWFydGVyIFx1MjAxNCBzaXggc2VlZGVkIGRlYWxzIHF1YWxpZnlcbiAgICAgIC8vIG9uIGZvcmVjYXN0X2NhdGVnb3J5ICsgc3RhZ2UsIGF0IGBkYXlzRnJvbU5vd2Agb2Zmc2V0cyAxMS8xNC8yNC8zMC8zOC80NS5cbiAgICAgIC8vIEJ1dCBldmVyeSBvbmUgb2YgdGhvc2Ugb2Zmc2V0cyBpcyByZWxhdGl2ZSB0byB0aGUgSU5TVEFMTCBkYXksIHNvIG9uY2VcbiAgICAgIC8vIGZld2VyIHRoYW4gMTEgZGF5cyByZW1haW4gaW4gdGhlIHF1YXJ0ZXIgYWxsIHNpeCBsYW5kIGluIHRoZSBuZXh0IG9uZVxuICAgICAgLy8gYW5kIGEgZnJlc2hseSBzZWVkZWQgZGVtbyBvcGVucyB0aGlzIHRhYiBvbiBub3RoaW5nLiBBIHJlYWwgb3JnIG1lZXRzXG4gICAgICAvLyB0aGUgc2FtZSBzdGF0ZSB3aGVuZXZlciBhIHF1YXJ0ZXIncyBjb21taXQgc2xpcHMgb3V0LiBFbXB0eSBpc1xuICAgICAgLy8gbGVnaXRpbWF0ZSBoZXJlOyB1bmV4cGxhaW5lZCwgaXQgcmVhZHMgYXMgYnJva2VuLlxuICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICB0aXRsZTogJ05vIERlYWxzIENsb3NpbmcgVGhpcyBRdWFydGVyJyxcbiAgICAgICAgbWVzc2FnZTogJ1RoaXMgdGFiIGxpc3RzIG9wZW4gY29tbWl0IGFuZCBiZXN0LWNhc2UgZGVhbHMgd2l0aCBhIGNsb3NlIGRhdGUgaW5zaWRlIHRoZSBjdXJyZW50IHF1YXJ0ZXIuIE5vdGhpbmcgbWF0Y2hlcyByaWdodCBub3cgXHUyMDE0IGRlYWxzIGNsb3NpbmcgbGF0ZXIgYXJlIG9uIHRoZSBPcGVuIERlYWxzIHRhYi4nLFxuICAgICAgICBpY29uOiAnY2FsZW5kYXItY2hlY2snLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuXG4gIGZvcm06IHtcbiAgICB0eXBlOiAndGFiYmVkJyxcbiAgICBzZWN0aW9uczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnb3ZlcnZpZXcnLFxuICAgICAgICBsYWJlbDogJ092ZXJ2aWV3JyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ25hbWUnLCByZXF1aXJlZDogdHJ1ZSwgc3BhbjogJ2Z1bGwnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ2NybV9hY2NvdW50JywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICAncHJpbWFyeV9jb250YWN0JyxcbiAgICAgICAgICB7IGZpZWxkOiAnc3RhZ2UnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdhbW91bnQnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICdwcm9iYWJpbGl0eScsXG4gICAgICAgICAgJ2Nsb3NlX2RhdGUnLFxuICAgICAgICAgICdvd25lcl9pZCcsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnZm9yZWNhc3QnLFxuICAgICAgICBsYWJlbDogJ0ZvcmVjYXN0JyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgJ2V4cGVjdGVkX3JldmVudWUnLFxuICAgICAgICAgICdmb3JlY2FzdF9jYXRlZ29yeScsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdsZWFkX3NvdXJjZScsXG4gICAgICAgICAgJ2NybV9jYW1wYWlnbicsXG4gICAgICAgICAgJ3N0YWdlX2VudHJ5X2RhdGUnLFxuICAgICAgICAgICdkYXlzX2luX3N0YWdlJyxcbiAgICAgICAgICAnaXNfcHJpdmF0ZScsXG4gICAgICAgICAgLy8gUkVRLTAwMDYgc3RlcCA4IFx1MjAxNCB0aGUgY3VzdG9tZXIncyBvd24gcHJvY3VyZW1lbnQgY2FsZW5kYXIuIE5hbWVkXG4gICAgICAgICAgLy8gaGVyZSAoQUdFTlRTLm1kIGxhZGRlciBydW5nIDMpLCBhbmQgdGhlIHJlYXNvbiBpbiB3cml0aW5nOlxuICAgICAgICAgIC8vIGB0ZW5kZXJfdGhpc19xdWFydGVyYCBmaWx0ZXJzIG9uIGBleHBlY3RlZF90ZW5kZXJfZGF0ZWAsIGFuZCBhXG4gICAgICAgICAgLy8gZmlsdGVyZWQgZmllbGQgbm8gZm9ybSBvZmZlcnMgaXMgYSB2aWV3IHRoYXQgY2FuIG5ldmVyIG1hdGNoIGFcbiAgICAgICAgICAvLyBkZWFsIGEgcmVwIGNyZWF0ZWQgdGhyb3VnaCB0aGUgVUkgKGB0ZXN0L21ldGFkYXRhLXJlZmVyZW5jZXNcbiAgICAgICAgICAvLyAudGVzdC50c2ApLiBUaGUgZmllbGRzIGRlY2xhcmUgYGdyb3VwOiAnc2FsZXNfcHJvY2VzcydgLCBzbyBldmVyeVxuICAgICAgICAgIC8vIERFUklWRUQgc3VyZmFjZSBcdTIwMTQgdGhlIHJlY29yZCBwYWdlJ3MgRGV0YWlscyB0YWIgXHUyMDE0IGFscmVhZHkgY2Fycmllc1xuICAgICAgICAgIC8vIHRoZW07IHRoaXMgZm9ybSBhdXRob3JzIGBzZWN0aW9uc2AsIHdoaWNoIHdpbiBvdXRyaWdodCBvdmVyXG4gICAgICAgICAgLy8gZGVyaXZhdGlvbi4gQSBgeyBncm91cDogJ3NhbGVzX3Byb2Nlc3MnIH1gIHJlZmVyZW5jZSBjYW5ub3Qgc3RhbmRcbiAgICAgICAgICAvLyBpbjogaXQgd291bGQgcmVuZGVyIGBzdGFnZWAsIGBwcm9iYWJpbGl0eWAgYW5kIGBjbG9zZV9kYXRlYFxuICAgICAgICAgIC8vIChjdXJhdGVkIGluIE92ZXJ2aWV3LCBgc3RhZ2VgIGByZXF1aXJlZGApIGFuZCBgc3RhZ2VfZW50cnlfZGF0ZWBcbiAgICAgICAgICAvLyAoYWJvdmUpIGEgc2Vjb25kIHRpbWUsIGFuZCBwdWxsIHRoZSBhcHByb3ZhbCB2ZXJkaWN0IGNvbHVtbnMgYW5kXG4gICAgICAgICAgLy8gdGhlIGluZXJ0LWJ5LWRlZmF1bHQgYHJlcXVlc3RlZF9zdGF0dXNgIGludG8gdGhlIGNyZWF0ZSBkaWFsb2cuXG4gICAgICAgICAgJ2N1c3RvbWVyX2luaXRpYXRpb25fZGF0ZScsXG4gICAgICAgICAgJ2V4cGVjdGVkX3RlbmRlcl9kYXRlJyxcbiAgICAgICAgICAnZXhwZWN0ZWRfdGVuZGVyX2Ftb3VudCcsXG4gICAgICAgICAgJ2V4cGVjdGVkX3NpZ25pbmdfZGF0ZScsXG4gICAgICAgICAgJ2V4cGVjdGVkX3NpZ25pbmdfYW1vdW50JyxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICAvLyBSRVEtMDAwNiBhY2NlcHRhbmNlIDEsIEZST00gYGZpZWxkR3JvdXBzYCAoQUdFTlRTLm1kIGxhZGRlciBydW5nIDIpLFxuICAgICAgLy8gdGhlIHdheSBgY29udGFjdC52aWV3LnRzYCByZWZlcmVuY2VzIFJFUS0wMDA0J3MgYnV5aW5nIGNlbnRyZTogdGhpc1xuICAgICAgLy8gZm9ybSBhdXRob3JzIGBzZWN0aW9uc2AsIHdoaWNoIHdpbiBvdXRyaWdodCBvdmVyIHRoZSByZW5kZXJlcidzXG4gICAgICAvLyBgZmllbGRHcm91cHNgIGRlcml2YXRpb24sIHNvIGEgZ3JvdXAgZGVjbGFyZWQgb24gdGhlIG9iamVjdCBhbG9uZVxuICAgICAgLy8gbmV2ZXIgcmVhY2hlcyB0aGlzIGZvcm0gXHUyMDE0IHRoZSBFZGl0IGFuZCBOZXcgZGlhbG9nLiBBIGdyb3VwIHJlZmVyZW5jZVxuICAgICAgLy8gZW51bWVyYXRlcyBub3RoaW5nOyBtZW1iZXJzLCBsYWJlbCBhbmQgaWNvbiBjb21lIGZyb20gdGhlIG9iamVjdC5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgTWVhc3VyZWQgb24gdGhlIDE3LjYuMCBjb25zb2xlOiB0aGUgdGFiYmVkIGRpYWxvZyByZW5kZXJzIE5PIHRhYlxuICAgICAgLy8gZm9yIGEgYHsgZ3JvdXAgfWAgc2VjdGlvbiBcdTIwMTQgdGhpcyBvbmUsIGFuZCB0aGUgY29udGFjdCBmb3JtJ3MgYnV5aW5nXG4gICAgICAvLyBjZW50cmUgb24gYG1haW5gIGFsaWtlLiBUaGF0IGlzIHRoZSBwbGF0Zm9ybSdzIHRvIGZpeCwgYW5kIHRoZXNlIHR3b1xuICAgICAgLy8gbGluZXMgYXJlIHRoZSBjb250cmFjdC1jb3JyZWN0IGZvcm0gd2FpdGluZyBmb3IgaXQgKEFHRU5UUy5tZDogYVxuICAgICAgLy8gcGxhdGZvcm0gZGVmZWN0IGlzIHdhaXRlZCBmb3IsIG5ldmVyIHJvdXRlZCBhcm91bmQpLiBVbnRpbCB0aGVuIGV2ZXJ5XG4gICAgICAvLyBSRVEtMDAwNiBmaWVsZCBpcyBlZGl0ZWQgdGhyb3VnaCB0aGUgRGV0YWlscyB0YWIncyBlZGl0IG1vZGUgXHUyMDE0IHdoaWNoXG4gICAgICAvLyBvZmZlcnMgbm8gbWFya2Rvd24gZWRpdG9yLCB0aGUgcmVhc29uIHRoZSBuYXJyYXRpdmUgZmllbGRzIGFyZVxuICAgICAgLy8gdGV4dGFyZWFzIChzZWUgdGhlIG5vdGUgYWJvdmUgYGN1c3RvbWVyX2JhY2tncm91bmRgKS5cbiAgICAgIHsgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJywgY29sdW1uczogMiB9LFxuICAgICAgeyBncm91cDogJ25hcnJhdGl2ZScsIGNvbHVtbnM6IDEgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NhbGVzX3N0cmF0ZWd5JyxcbiAgICAgICAgbGFiZWw6ICdTYWxlcyBTdHJhdGVneScsXG4gICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgIC8vIGBjb21wZXRpdG9yc2Agc2F0IGhlcmUgdW50aWwgIzEwNjEgcmV0aXJlZCBpdCBcdTIwMTQgdGhpcyBmb3JtIHNlY3Rpb24gd2FzXG4gICAgICAgIC8vIHRoZSBmaWVsZCdzIE9OTFkgc3VyZmFjZSBhbnl3aGVyZSBpbiB0aGUgYXBwIChub3RoaW5nIHJlYWQgaXQgYmFjaykuXG4gICAgICAgIGZpZWxkczogWyduZXh0X3N0ZXAnXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIFdpbi9sb3NzIGNhcHR1cmUgYXQgY2xvc2UgdGltZS4gVGhlIGZpZWxkcyBleGlzdGVkIG9uIHRoZSBvYmplY3QgZm9yXG4gICAgICAgIC8vIHJlcG9ydGluZyBidXQgbm8gZm9ybSBvZmZlcmVkIHRoZW0sIHNvIGV2ZXJ5IGNsb3NlZCBkZWFsIGxvc3QgaXRzXG4gICAgICAgIC8vIHdoeS13ZS13b24gLyB3aHktd2UtbG9zdCBkYXRhLlxuICAgICAgICBuYW1lOiAnd2luX2xvc3MnLFxuICAgICAgICBsYWJlbDogJ1dpbiAvIExvc3MnLFxuICAgICAgICBjb2xsYXBzaWJsZTogdHJ1ZSxcbiAgICAgICAgY29sbGFwc2VkOiB0cnVlLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFsnd2luX3JlYXNvbicsICdsb3NzX3JlYXNvbicsIHsgZmllbGQ6ICdsb3NzX2RldGFpbHMnLCBzcGFuOiAnZnVsbCcgfV0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzL3Rhc2sudmlldy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy92aWV3c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy92aWV3cy90YXNrLnZpZXcudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZVZpZXcgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogVGFzayBWaWV3c1xuICpcbiAqICAgXHUyMDIyIGdyaWQgICAgIFx1MjAxNCB0by1kbyBsaXN0IHdpdGggY29tcGxldGlvbiBjb250cm9sc1xuICogICBcdTIwMjIga2FuYmFuICAgXHUyMDE0IHdvcmsgYm9hcmQgZ3JvdXBlZCBieSBzdGF0dXNcbiAqICAgXHUyMDIyIGNhbGVuZGFyIFx1MjAxNCBzY2hlZHVsZSBieSBkdWVfZGF0ZVxuICogICBcdTIwMjIgZ2FudHQgICAgXHUyMDE0IGV4ZWN1dGlvbiBwbGFuIGZyb20gcmVtaW5kZXJfZGF0ZSBcdTIxOTIgZHVlX2RhdGVcbiAqICAgXHUyMDIyIHRpbWVsaW5lIFx1MjAxNCBjaHJvbm9sb2dpY2FsIHdvcmtsb2cgZ3JvdXBlZCBieSBvd25lclxuICovXG5leHBvcnQgY29uc3QgVGFza1ZpZXdzID0gZGVmaW5lVmlldyh7XG4gIGxpc3Q6IHtcbiAgICB0eXBlOiAnZ3JpZCcsXG4gICAgbmFtZTogJ2FsbF90YXNrcycsXG4gICAgbGFiZWw6ICdBbGwgVGFza3MnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX3Rhc2snIH0sXG4gICAgLy8gTk8gYHByb2dyZXNzX3BlcmNlbnRgIGNvbHVtbiBoZXJlICgjMTIxNCBpdGVtIDUpLiBUaGUgZGVmYXVsdCBncmlkIHVzZWRcbiAgICAvLyB0byByZW5kZXIgY29tcGxldGlvbiBUSFJFRSB0aW1lcyBvbiBvbmUgcm93IFx1MjAxNCBcdTY2MkZcdTU0MjZcdTVCOENcdTYyMTAgKHRpY2spLCBcdTcyQjZcdTYwMDEsIGFuZFxuICAgIC8vIFx1OEZEQlx1NUVBNiglKSBcdTIwMTQgYW5kIHRoZSBwZXJjZW50IHdhcyB0aGUgb25lIHRoYXQgY2FycmllZCBub3RoaW5nLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoZSBjYXJkIGp1c3RpZmllZCB0aGUgcmVtb3ZhbCBhcyBcImV2ZXJ5IHNlZWRlZCByb3cgaXMgMCVcIi4gVGhhdCBpc1xuICAgIC8vIEZBTFNFIGFzIHN0YXRlZCBhbmQgd2FzIHJlLW1lYXN1cmVkIGJlZm9yZSBkZWxldGluZzogdHdvIG9mIHRoZSBzZXZlblxuICAgIC8vIHNlZWRlZCB0YXNrcyBjYXJyeSAxMDAuIFdoYXQgaXMgVFJVRSBpcyB0aGUgY2xhaW0gdW5kZXJuZWF0aCBpdCBcdTIwMTQgbm9ib2R5XG4gICAgLy8gbWFpbnRhaW5zIGEgcGVyY2VudCBwZXIgdGFzayBcdTIwMTQgYW5kIHRoZSBzZWVkIHNob3dzIGl0IG1vcmUgc2hhcnBseSB0aGFuXG4gICAgLy8gdGhlIGNhcmQgZGlkOlxuICAgIC8vICAgXHUwMEI3IGV2ZXJ5IHZhbHVlIHRoYXQgZXhpc3RzIGlzIDEwMCwgYW5kIGV2ZXJ5IG9uZSBvZiB0aG9zZSByb3dzIGlzXG4gICAgLy8gICAgIGBzdGF0dXM6ICdjb21wbGV0ZWQnYCAoYHNlcnZpY2Uuc2VlZC50c2AgbWlycm9ycyB3aGF0IHRoZSBob29rIHdvdWxkXG4gICAgLy8gICAgIHN0YW1wLCBzaW5jZSBob29rcyBkbyBub3QgcnVuIG92ZXIgc2VlZHMpO1xuICAgIC8vICAgXHUwMEI3IGB0YXNrX2NvbXBsZXRpb25gIHN0YW1wcyAxMDAgb24gdGhlIGNvbXBsZXRlZCB0cmFuc2l0aW9uIGFuZCB3cml0ZXNcbiAgICAvLyAgICAgdGhlIGZpZWxkIGF0IG5vIG90aGVyIHRpbWU7XG4gICAgLy8gICBcdTAwQjcgYm90aCBgaW5fcHJvZ3Jlc3NgIHJvd3Mgc2l0IGF0IDAgXHUyMDE0IHRoZSBvbmUgc3RhdHVzIHdoZXJlIGEgcGVyY2VudFxuICAgIC8vICAgICBjb3VsZCBzYXkgc29tZXRoaW5nIGEgc3RhdHVzIGNhbm5vdCwgYW5kIGl0IHNheXMgbm90aGluZy5cbiAgICAvLyBcdTIxRDIgT24gdGhpcyBncmlkIHRoZSBjb2x1bW4gaXMgYHN0YXR1c2AgcmUtcmVuZGVyZWQgYXQgTE9XRVIgcmVzb2x1dGlvbjogaXRcbiAgICAvLyBjYW5ub3QgdGVsbCBgbm90X3N0YXJ0ZWRgIGZyb20gYGluX3Byb2dyZXNzYCAoYm90aCAwKSwgd2hpbGUgdGhlIGBzdGF0dXNgXG4gICAgLy8gY29sdW1uIGJlc2lkZSBpdCBjYW4uIERyb3BwaW5nIGl0IGxvc2VzIG5vIGZhY3QgdGhpcyByb3cgZG9lcyBub3QgYWxyZWFkeVxuICAgIC8vIGNhcnJ5IHR3aWNlLlxuICAgIC8vXG4gICAgLy8gXHUyNkQ0IFRoZSBGSUVMRCBzdGF5cywgYW5kIHNvIGRvZXMgZXZlcnkgb3RoZXIgcmVhZGVyIFx1MjAxNCB0aGlzIGlzIG9uZSBjb2x1bW5cbiAgICAvLyBvbiBvbmUgdmlldywgbm90IGEgcmV0aXJlbWVudDogYHRhc2tfZ2FudHRgIGZpbGxzIGl0cyBiYXJzIGZyb21cbiAgICAvLyBgZ2FudHQucHJvZ3Jlc3NGaWVsZGAsIGB0YXNrX2JvYXJkYCBhbmQgYG15X29wZW5fdGFza3NgIHNob3cgaXQgKG5laXRoZXJcbiAgICAvLyBjYXJyaWVzIGBzdGF0dXNgIEFORCBgaXNfY29tcGxldGVkYCwgc28gdGhlcmUgaXQgaXMgbm90IGEgdGhpcmQgc3BlbGxpbmcpLFxuICAgIC8vIGBhdmdfcHJvZ3Jlc3NgIGluIGB0YXNrLmRhdGFzZXQudHNgIGFnZ3JlZ2F0ZXMgaXQsIGFuZCB0aGUgRWZmb3J0IHNlY3Rpb25cbiAgICAvLyBvZiB0aGlzIGZpbGUncyBmb3JtIHN0aWxsIGxldHMgYSB1c2VyIGF1dGhvciBvbmUuXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgYGlzX2NvbXBsZXRlZGAgU1RBWVMsIGFuZCBpcyBub3QgdGhlIHNlY29uZCBoYWxmIG9mIHRoaXMgY2xlYW51cDogaXQgaXNcbiAgICAvLyBub3QgYW4gaW5kZXBlbmRlbnQgc2hhZG93IHRoYXQgY2FuIGNvbnRyYWRpY3QgYHN0YXR1c2AgXHUyMDE0IGB0YXNrX2NvbXBsZXRpb25gXG4gICAgLy8gcmVjb21wdXRlcyBpdCBmcm9tIHN0YXR1cyBvbiBldmVyeSBpbnNlcnQgYW5kIHVwZGF0ZVxuICAgIC8vIChgaW5wdXQuaXNfY29tcGxldGVkID0gZWZmU3RhdHVzID09PSAnY29tcGxldGVkJ2ApLCB3aGljaCBpcyBwcmVjaXNlbHkgdGhlXG4gICAgLy8gXCJyZW5kZXIgY29tcGxldGlvbiBmcm9tIHN0YXR1c1wiIHRoZSBjYXJkIGFza3MgZm9yLCBhbHJlYWR5IGRvbmUgYXQgdGhlXG4gICAgLy8gZGF0YSBsYXllci4gSXQgaXMgYWxzbyB0aGlzIGxpc3QncyBmaXJzdCBzb3J0IGtleSBhbmQgaXRzIGNvbXBsZXRpb25cbiAgICAvLyBjb250cm9sLlxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICdpc19jb21wbGV0ZWQnLCB3aWR0aDogNjAsIGFsaWduOiAnY2VudGVyJyB9LFxuICAgICAgeyBmaWVsZDogJ3N1YmplY3QnLCB3aWR0aDogMjgwLCBzb3J0YWJsZTogdHJ1ZSwgbGluazogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ3N0YXR1cycsIHdpZHRoOiAxMzAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAncHJpb3JpdHknLCB3aWR0aDogMTEwLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ2R1ZV9kYXRlJywgd2lkdGg6IDE0MCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdvd25lcl9pZCcsIHdpZHRoOiAxNTAgfSxcbiAgICAgIHsgZmllbGQ6ICdpc19vdmVyZHVlJywgd2lkdGg6IDEwMCwgYWxpZ246ICdjZW50ZXInIH0sXG4gICAgXSxcbiAgICBzb3J0OiBbXG4gICAgICB7IGZpZWxkOiAnaXNfY29tcGxldGVkJywgb3JkZXI6ICdhc2MnIH0sXG4gICAgICB7IGZpZWxkOiAnZHVlX2RhdGUnLCBvcmRlcjogJ2FzYycgfSxcbiAgICBdLFxuICAgIHJvd0NvbG9yOiB7XG4gICAgICAvLyBUYXNrIHByaW9yaXR5IGlzIGxvdy9ub3JtYWwvaGlnaC91cmdlbnQgXHUyMDE0IHRoZSBwcmV2aW91cyBjcml0aWNhbC9tZWRpdW1cbiAgICAgIC8vIGtleXMgd2VyZSBDYXNlIHZhbHVlcywgc28gdXJnZW50IGFuZCBub3JtYWwgcm93cyBnb3Qgbm8gY29sb3IgYXQgYWxsLlxuICAgICAgLy8gQ29sb3JzIG1pcnJvciB0aGUgb3B0aW9uIGNvbG9ycyBvbiBjcm1fdGFzay5wcmlvcml0eS5cbiAgICAgIGZpZWxkOiAncHJpb3JpdHknLFxuICAgICAgY29sb3JzOiB7IHVyZ2VudDogJ3JlZCcsIGhpZ2g6ICdvcmFuZ2UnLCBub3JtYWw6ICdncmVlbicsIGxvdzogJ3NsYXRlJyB9LFxuICAgIH0sXG4gICAgc2VsZWN0aW9uOiB7IHR5cGU6ICdtdWx0aXBsZScgfSxcbiAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiA1MCB9LFxuICAgIGFwcGVhcmFuY2U6IHtcbiAgICAgIHNob3dEZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGFsbG93ZWRWaXN1YWxpemF0aW9uczogWydncmlkJywgJ2thbmJhbicsICdjYWxlbmRhcicsICdnYW50dCcsICd0aW1lbGluZSddLFxuICAgIH0sXG4gICAgLy8gQmluZHMgdGhlICdjYWxlbmRhcicgZW50cnkgYWJvdmU6IHRoZSBzYW1lIHNjaGVkdWxlIHRoZSBkZWRpY2F0ZWRcbiAgICAvLyBgdGFza19jYWxlbmRhcmAgdmlldyBzaG93cywgb24gdGhlIGZpZWxkIHRoaXMgbGlzdCBzb3J0cyBieS4gYGR1ZV9kYXRlYFxuICAgIC8vIGlzIG9wdGlvbmFsIFx1MjAxNCBhbiB1bmRhdGVkIHRhc2sgc3RheXMgb2ZmIHRoZSBjYWxlbmRhciBpbnN0ZWFkIG9mIGJlaW5nXG4gICAgLy8gZHJvcHBlZCBvbiB0b2RheSBieSBhIGd1ZXNzZWQgZmllbGQuXG4gICAgY2FsZW5kYXI6IHtcbiAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnZHVlX2RhdGUnLFxuICAgICAgdGl0bGVGaWVsZDogJ3N1YmplY3QnLFxuICAgICAgY29sb3JGaWVsZDogJ3ByaW9yaXR5JyxcbiAgICB9LFxuICB9LFxuXG4gIGxpc3RWaWV3czoge1xuICAgIC8qKiBXb3JrIGJvYXJkICovXG4gICAgdGFza19ib2FyZDoge1xuICAgICAgbmFtZTogJ3Rhc2tfYm9hcmQnLFxuICAgICAgdHlwZTogJ2thbmJhbicsXG4gICAgICBsYWJlbDogJ1Rhc2sgQm9hcmQnLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV90YXNrJyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3ByaW9yaXR5JywgJ2R1ZV9kYXRlJywgJ293bmVyX2lkJ10sXG4gICAgICBrYW5iYW46IHtcbiAgICAgICAgZ3JvdXBCeUZpZWxkOiAnc3RhdHVzJyxcbiAgICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3ByaW9yaXR5JywgJ2R1ZV9kYXRlJywgJ3Byb2dyZXNzX3BlcmNlbnQnXSxcbiAgICAgIH0sXG4gICAgICBmaWx0ZXI6IFt7IGZpZWxkOiAnaXNfY29tcGxldGVkJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogZmFsc2UgfV0sXG4gICAgICBuYXZpZ2F0aW9uOiB7IG1vZGU6ICdkcmF3ZXInLCB3aWR0aDogJzUyMHB4JyB9LFxuICAgIH0sXG5cbiAgICAvKiogU2NoZWR1bGUgdmlldyAqL1xuICAgIHRhc2tfY2FsZW5kYXI6IHtcbiAgICAgIG5hbWU6ICd0YXNrX2NhbGVuZGFyJyxcbiAgICAgIHR5cGU6ICdjYWxlbmRhcicsXG4gICAgICBsYWJlbDogJ1Rhc2sgU2NoZWR1bGUnLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV90YXNrJyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3ByaW9yaXR5JywgJ293bmVyX2lkJ10sXG4gICAgICBjYWxlbmRhcjoge1xuICAgICAgICBzdGFydERhdGVGaWVsZDogJ2R1ZV9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ3N1YmplY3QnLFxuICAgICAgICBjb2xvckZpZWxkOiAncHJpb3JpdHknLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLyoqIEV4ZWN1dGlvbiBwbGFuICovXG4gICAgdGFza19nYW50dDoge1xuICAgICAgbmFtZTogJ3Rhc2tfZ2FudHQnLFxuICAgICAgdHlwZTogJ2dhbnR0JyxcbiAgICAgIGxhYmVsOiAnRXhlY3V0aW9uIFBsYW4nLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV90YXNrJyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ293bmVyX2lkJywgJ3Byb2dyZXNzX3BlcmNlbnQnXSxcbiAgICAgIGdhbnR0OiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAncmVtaW5kZXJfZGF0ZScsXG4gICAgICAgIGVuZERhdGVGaWVsZDogJ2R1ZV9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ3N1YmplY3QnLFxuICAgICAgICBwcm9ncmVzc0ZpZWxkOiAncHJvZ3Jlc3NfcGVyY2VudCcsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvKiogV29ya2xvZyB0aW1lbGluZSAqL1xuICAgIHRhc2tfdGltZWxpbmU6IHtcbiAgICAgIG5hbWU6ICd0YXNrX3RpbWVsaW5lJyxcbiAgICAgIHR5cGU6ICd0aW1lbGluZScsXG4gICAgICBsYWJlbDogJ1dvcmtsb2cgVGltZWxpbmUnLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV90YXNrJyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3N0YXR1cyddLFxuICAgICAgdGltZWxpbmU6IHtcbiAgICAgICAgc3RhcnREYXRlRmllbGQ6ICdyZW1pbmRlcl9kYXRlJyxcbiAgICAgICAgZW5kRGF0ZUZpZWxkOiAnZHVlX2RhdGUnLFxuICAgICAgICB0aXRsZUZpZWxkOiAnc3ViamVjdCcsXG4gICAgICAgIGdyb3VwQnlGaWVsZDogJ293bmVyX2lkJyxcbiAgICAgICAgY29sb3JGaWVsZDogJ3N0YXR1cycsXG4gICAgICAgIHNjYWxlOiAnd2VlaycsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBteV9vcGVuX3Rhc2tzOiB7XG4gICAgICBuYW1lOiAnbXlfb3Blbl90YXNrcycsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICBsYWJlbDogJ015IE9wZW4gVGFza3MnLFxuICAgICAgdXNlckFjdGlvbnM6IHsgZWRpdElubGluZTogdHJ1ZSB9LFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV90YXNrJyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3ByaW9yaXR5JywgJ2R1ZV9kYXRlJywgJ3Byb2dyZXNzX3BlcmNlbnQnXSxcbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAnb3duZXJfaWQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiAne2N1cnJlbnRfdXNlcl9pZH0nIH0sXG4gICAgICAgIHsgZmllbGQ6ICdpc19jb21wbGV0ZWQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiBmYWxzZSB9LFxuICAgICAgXSxcbiAgICAgIHNvcnQ6IFt7IGZpZWxkOiAnZHVlX2RhdGUnLCBvcmRlcjogJ2FzYycgfV0sXG4gICAgfSxcblxuICAgIC8qKiBNeSBvcGVuIHByaW9yaXR5IHRhc2tzIFx1MjAxNCBkYWlseSBtb3JuaW5nIHF1ZXVlICovXG4gICAgdG9kYXlzX3Rhc2tzOiB7XG4gICAgICBuYW1lOiAndG9kYXlzX3Rhc2tzJyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnXHVEODNEXHVEQ0M1IE15IFByaW9yaXR5IFRhc2tzJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fdGFzaycgfSxcbiAgICAgIGNvbHVtbnM6IFsnc3ViamVjdCcsICdwcmlvcml0eScsICdzdGF0dXMnLCAnZHVlX2RhdGUnLCAncmVsYXRlZF90b190eXBlJywgJ293bmVyX2lkJ10sXG4gICAgICAvLyBPcGVyYXRvci1vbmx5IGZpbHRlciBcdTIwMTQgcHJpb3JpdHkgYW5kIHN0YXR1cywgbm8gdG9rZW5zIFx1MjAxNCBhbmQgdGhlIHJlYXNvblxuICAgICAgLy8gcmVjb3JkZWQgaGVyZSBmb3IgdGhhdCBoYXMgZXhwaXJlZCAoIzc4MikuIFR3byBjbGFpbXMgc3Rvb2QgaGVyZTsgYm90aFxuICAgICAgLy8gd2VyZSB3cm9uZyBhbHJlYWR5IG9uIDE3LjAuMC1yYy4yIFx1MjAxNCB0aGUgdmVyc2lvbiB0aGlzIHJlcG8gcGlubmVkIEFUXG4gICAgICAvLyBUSEUgVElNRSB0aGV5IHdlcmUgbWVhc3VyZWQsIG5vdCB0aGUgY3VycmVudCBwaW4gXHUyMDE0IGluIGRpZmZlcmVudFxuICAgICAgLy8gd2F5cy4gXCJXcm9uZ1wiIGlzIGFib3V0IHRob3NlIHR3b1xuICAgICAgLy8gcmV0aXJlZCBjbGFpbXMsIG5vdCBhYm91dCB0aGUgZW5naW5lOiBub3RoaW5nIGluIHRoaXMgYmxvY2sgcmVwb3J0c1xuICAgICAgLy8gYnJva2VuIHBsYXRmb3JtIGJlaGF2aW91ci5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgUkVBRCBUSEUgVkVSU0lPTiBPTiBFQUNIIFJFQURJTkcgQkVMT1cuIFRoZXkgd2VyZSB0YWtlbiBhdFxuICAgICAgLy8gc2V2ZXJhbCBkaWZmZXJlbnQgcGlucyBhbmQgYXJlIGxhYmVsbGVkIGluZGl2aWR1YWxseTsgYSByZWFkaW5nXG4gICAgICAvLyBsYWJlbGxlZCAxNy4yLjAgd2FzIHRha2VuIHRoZXJlIGFuZCBoYXMgTk9UIGJlZW4gcmUtdGFrZW4gb24gYW55IGxhdGVyXG4gICAgICAvLyBwaW4gdW5sZXNzIGl0IHNheXMgc28uXG4gICAgICAvL1xuICAgICAgLy8gYHtjdXJyZW50X3VzZXJfaWR9YCBET0VTIGludGVycG9sYXRlLiBgcmVzb2x2ZUZpbHRlclRva2VucygpYCB3YXMgd2lyZWRcbiAgICAgIC8vIGludG8gdGhlIE9iamVjdFFMIFJFQUQgcGF0aCBhdCAxNy4wLjAtcmMuMCAob2JqZWN0cWwgIzM1ODIpIGFoZWFkIG9mXG4gICAgICAvLyB0aGUgbWlkZGxld2FyZSBjaGFpbiwgY292ZXJpbmcgYGZpbmRgIC8gYGZpbmRPbmVgIC8gYGNvdW50YCAvXG4gICAgICAvLyBgYWdncmVnYXRlYCBcdTIwMTQgc2F2ZWQtdmlldyBmaWx0ZXJzIGluY2x1ZGVkLiBgbXlfb3Blbl90YXNrc2AsIHRoZSB2aWV3XG4gICAgICAvLyBkaXJlY3RseSBhYm92ZSwgc2hpcHMgdGhhdCBleGFjdCB0b2tlbi4gTWVhc3VyZWQgaW4gIzc4NCB3aXRoIHR3byBwcm9iZXNcbiAgICAgIC8vIHRoYXQgc2VwYXJhdGUgdGhlIHRocmVlIHBvc3NpYmxlIG91dGNvbWVzOiBgb3duZXJfaWQgPVxuICAgICAgLy8ge2N1cnJlbnRfb3JnX2lkfWAgcmV0dXJuZWQgMCByb3dzICh0aGUgZmlsdGVyIGlzIG5vdCBiZWluZyBkcm9wcGVkKVxuICAgICAgLy8gd2hpbGUgYG93bmVyX2lkID0ge2N1cnJlbnRfdXNlcl9pZH1gIHJldHVybmVkIGV2ZXJ5IHNlZWRlZCB0YXNrIChub3QgYVxuICAgICAgLy8gbGl0ZXJhbC1zdHJpbmcgY29tcGFyZSBlaXRoZXIgXHUyMDE0IHRoZSBsaXRlcmFsIG1hdGNoZXMgbm8gb3duZXIgYXQgYWxsKS5cbiAgICAgIC8vIFJFLU1FQVNVUkVEIDIwMjYtMDktMDMgb24gMTcuMi4wICgjMTQ2NyksIHVuY2hhbmdlZDogYm90aCBwcm9iZXNcbiAgICAgIC8vIHJlcG9ydGVkIGV4YWN0bHkgdGhvc2UgcmVzdWx0cyB0aGVyZS4gTk9UIHJlLXJ1biBvbiAxNy4zLjAgKCMxNjc2KSBcdTIwMTRcbiAgICAgIC8vIHRoZSB0d28tcHJvYmUgcmVzdWx0IGlzIGEgMTcuMi4wIHJlYWRpbmcsIGFuZCB0aGUgc2VhbSBpdCByZXN0cyBvblxuICAgICAgLy8gKGByZXNvbHZlRmlsdGVyVG9rZW5zKClgIG9uIHRoZSByZWFkIHBhdGgpIHdhcyByZS1jb25maXJtZWQgb24gMTcuNC4wXG4gICAgICAvLyBieSBgdGVzdC9mbG93LWZpbHRlci10b2RheS10b2tlbi50ZXN0LnRzYCAobm90IHlldCByZS1ydW4gb24gMTcuNS4wKS5cbiAgICAgIC8vXG4gICAgICAvLyBge1RPREFZKCl9YCBpcyBub3QgYSBzcGVsbGluZyBvZiBhbnl0aGluZyBhbmQgbmV2ZXIgd2FzLiBUaGUgdm9jYWJ1bGFyeVxuICAgICAgLy8gaXMgYHt0b2RheX1gIC8gYHt5ZXN0ZXJkYXl9YCAvIGB7dG9tb3Jyb3d9YCAvIGB7bm93fWAsIHRoZSBwZXJpb2RcbiAgICAgIC8vIHRva2VucywgYW5kIHRoZSBwYXJhbWV0ZXJpc2VkIGB7Tl9kYXlzX2Fnb31gIGZhbWlseS5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgV0hBVCBDSEFOR0VEIGJldHdlZW4gcmMuMiBhbmQgMTcuNC4wIFx1MjAxNCB0aGUgb25lIHJlYWRpbmcgaW5cbiAgICAgIC8vIHRoaXMgYmxvY2sgdGhhdCBkaWQgTk9UIHN1cnZpdmUgcmUtbWVhc3VyZW1lbnQsIGFuZCB0aGUgcmVhc29uIHRoZVxuICAgICAgLy8gdmVyc2lvbiBxdWFsaWZpZXJzIGhlcmUgYXJlIGxvYWQtYmVhcmluZyByYXRoZXIgdGhhbiBib29ra2VlcGluZy4gT25cbiAgICAgIC8vIHJjLjIgYHtUT0RBWSgpfWAgd2FzIG5vdCBSRUpFQ1RFRCBlaXRoZXI6IHRoZSBwbGFjZWhvbGRlciBncmFtbWFyIHdhc1xuICAgICAgLy8gYC9eXFwkP1xceyhbYS16QS1aMC05X10rKVxcfSQvYCwgcGFyZW50aGVzZXMgZmVsbCBvdXRzaWRlIGl0LFxuICAgICAgLy8gYGNsYXNzaWZ5RmlsdGVyVG9rZW4oJ3tUT0RBWSgpfScpYCByZXR1cm5lZCBudWxsLCBhbmQgdGhlIHN0cmluZ1xuICAgICAgLy8gcmVhY2hlZCB0aGUgZHJpdmVyIHZlcmJhdGltIGFuZCBjb21wYXJlZCBhcyB0ZXh0LiBGcm9tIDE3LjIuMCBvbiBcdTIwMTRcbiAgICAgIC8vIHJlLWNvbmZpcm1lZCBvbiAxNy4zLjAgKCMxNjc2KSBhbmQgYWdhaW4gb24gMTcuNC4wXG4gICAgICAvLyAoIzE4ODMpIGJ5IHRoZSBQUkVNSVNFIGNhc2UgaW5cbiAgICAgIC8vIGB0ZXN0L2Zsb3ctZmlsdGVyLXRvZGF5LXRva2VuLnRlc3QudHNgLCB3aGljaCBkcml2ZXMgYSByZWFsIGVuZ2luZSBcdTIwMTRcbiAgICAgIC8vIHRoYXQgaXMgRkFMU0U6IGBGSUxURVJfVE9LRU5fV1JBUFBFRF9SRWAgaW4gYEBvYmplY3RzdGFjay9zcGVjL2RhdGFgXG4gICAgICAvLyBub3cgcmVhZHMgYC9eXFwkP1xceyhbXnt9XSspXFx9JC9gLCB3aGljaCBET0VTIG1hdGNoIGBUT0RBWSgpYCwgc28gaXRcbiAgICAgIC8vIGNsYXNzaWZpZXMgYXMgYGtpbmQ6ICd1bmtub3duJ2AgYW5kIGByZXNvbHZlRmlsdGVyVG9rZW5zKClgIHRocm93c1xuICAgICAgLy8gYFVua25vd25GaWx0ZXJUb2tlbkVycm9yYCAoYEZJTFRFUl9UT0tFTl9VTktOT1dOYCwgSFRUUCA0MDApIFx1MjAxNCB0aGUgc2FtZVxuICAgICAgLy8gZW52ZWxvcGUgYHtUT0RBWX1gIGdldHMuIFRoZSBjaGFuZ2UgbGFuZGVkIGF0IDE3LjAuMC1yYy42IGFuZCB0aGlzIHJlcG9cbiAgICAgIC8vIGFscmVhZHkgcGlucyBpdCBlbHNld2hlcmU6IGB0ZXN0L2Zsb3ctZmlsdGVyLXRvZGF5LXRva2VuLnRlc3QudHNgXG4gICAgICAvLyAoIzExMDcpLiBUaGF0IGlzIGFsc28gd2h5IHRoZSBgc3JjLyovZmxvd3NgIHN3ZWVwcyB0aGF0IHN0aWxsIHNwZWxsXG4gICAgICAvLyBge1RPREFZKCl9YCB3b3JrIFx1MjAxNCBgaW50ZXJwb2xhdGVGaWx0ZXIoKWAgcmVzb2x2ZXMgaXQgYmVmb3JlIE9iamVjdFFMXG4gICAgICAvLyBzZWVzIHRoZSBmaWx0ZXIgYXQgYWxsLlxuICAgICAgLy9cbiAgICAgIC8vIE1lYXN1cmVkIG9uIHJjLjIgb3ZlciBhIGZvdXItcm93IGBjcm1fdGFza2AgZml4dHVyZSAoZHVlIDMwZCBhZ28gLyAxZFxuICAgICAgLy8gYWdvIC8gdG9kYXkgLyBpbiA3ZCksIGFuZCBSRS1NRUFTVVJFRCAyMDI2LTA5LTAzIG9uIDE3LjIuMCAoIzE0NjcpXG4gICAgICAvLyBvdmVyIHRoZSBzYW1lIGZpeHR1cmUgXHUyMDE0IHRocmVlIHJvd3MgdW5jaGFuZ2VkLCB0aGUgZm91cnRoIG5vdC4gXHUyNkQ0IFRoZVxuICAgICAgLy8gcm93IENPVU5UUyBiZWxvdyBhcmUgYSAxNy4yLjAgcmVhZGluZyBhbmQgd2VyZSBOT1QgcmUtdGFrZW4gb24gMTcuMy4wXG4gICAgICAvLyAoIzE2NzYpOyB3aGF0IFdBUyByZS1jb25maXJtZWQgdGhlcmUgaXMgdGhlIHRocm93L3Jlc29sdmUgdmVyZGljdCBpblxuICAgICAgLy8gdGhlIHJpZ2h0LWhhbmQgY29sdW1uLCBieSBgdGVzdC9mbG93LWZpbHRlci10b2RheS10b2tlbi50ZXN0LnRzYDpcbiAgICAgIC8vXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYy4yICAgICAgICAgICAgICAgMTcuMi4wXG4gICAgICAvLyAgICAgZHVlX2RhdGUgPCAgJ3t0b2RheX0nICAgIC0+ICAyIHJvd3MgKHBhc3QtZHVlKSAgMiByb3dzXG4gICAgICAvLyAgICAgZHVlX2RhdGUgPD0gJ3t0b2RheX0nICAgIC0+ICAzIHJvd3MgICAgICAgICAgICAgMyByb3dzXG4gICAgICAvLyAgICAgZHVlX2RhdGUgPCAgJ3tUT0RBWX0nICAgIC0+ICB0aHJvd3MgICAgICAgICAgICAgdGhyb3dzXG4gICAgICAvLyAgICAgZHVlX2RhdGUgPCAgJ3tUT0RBWSgpfScgIC0+ICBBTEwgNCByb3dzICAgICAgICAgdGhyb3dzXG4gICAgICAvL1xuICAgICAgLy8gKEJvdGggdGhyb3dzIGFyZSBgVW5rbm93bkZpbHRlclRva2VuRXJyb3JgLCBgRklMVEVSX1RPS0VOX1VOS05PV05gLilcbiAgICAgIC8vXG4gICAgICAvLyBTbyB0aGUgIzc0NCBsZXhpY29ncmFwaGljIGludmVyc2lvbiAoJzIwMjYtXHUyMDI2JyBzb3J0cyBiZWxvdyAneycpIGlzIE5PVFxuICAgICAgLy8gc3RpbGwgbGl2ZSBvbiB0aGlzIHBhdGgsIGFuZCBcdTI2RDQgbm90aGluZyBoZXJlIHNob3VsZCBjYXJyeSBhIHdvcmthcm91bmRcbiAgICAgIC8vIGZvciBpdDogb24gcmMuMiBpdCByZWFjaGVkIGV2ZXJ5IHNwZWxsaW5nIHRoZSBncmFtbWFyIGNvdWxkIG5vdCBzZWUsXG4gICAgICAvLyBhbmQgdGhlIDE3LjIuMCBncmFtbWFyIHNlZXMgdGhlbSBhbGwuIFRoZSBhdXRob3ItdGltZSBndWFyZCBpblxuICAgICAgLy8gYHRlc3QvbWV0YWRhdGEtcmVmZXJlbmNlcy50ZXN0LnRzYCBcdTIwMTQgaXQgc2NhbnMgdGhlIGJyb2FkZXJcbiAgICAgIC8vIGAvXFx7KFtee31dKylcXH0vYCBhbmQgcmVqZWN0cyBhbnkgdG9rZW4gbmVpdGhlciBwYXRoIHJlc29sdmVzIFx1MjAxNCBzdGlsbFxuICAgICAgLy8gZWFybnMgaXRzIGtlZXAsIGJ5IGZhaWxpbmcgYXQgYXV0aG9yaW5nIHRpbWUgcmF0aGVyIHRoYW4gYXMgYSA0MDAgaW4gYVxuICAgICAgLy8gdXNlcidzIGZhY2UsIGFuZCBieSBjb3ZlcmluZyB0aGUgYW5hbHl0aWNzIHBhdGggdGhlIGVuZ2luZSBnYXRlIGRvZXNcbiAgICAgIC8vIG5vdC5cbiAgICAgIC8vXG4gICAgICAvLyBDb3JyZWN0aW5nIHRoZSBjb21tZW50IGlzIG5vdCBhIGxpY2VuY2UgdG8gY2hhbmdlIHRoZSBmaWx0ZXIuIFdoZXRoZXJcbiAgICAgIC8vIHRoaXMgdmlldyBzaG91bGQgY2FycnkgYSBkYXRlIGJvdW5kIGF0IGFsbCBcdTIwMTQgYW5kIHdoZXRoZXIgYSBsYWJlbFxuICAgICAgLy8gcmVhZGluZyBcIk15IFByaW9yaXR5IFRhc2tzXCIgb3ZlciBhIGZpbHRlciB3aXRoIG5vIG93bmVyIGNvbmRpdGlvbiBpc1xuICAgICAgLy8gdGhlIHJpZ2h0IG5hbWUgXHUyMDE0IGFyZSBCRUhBVklPVVIgZGVjaXNpb25zIG9uICM3NzAncyBsaW5lIGZvciB0aGUgdGFza1xuICAgICAgLy8gdmlld3MsIG5vdCB0aGlzIG9uZSdzLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBzb3J0IGJlbG93IGlzIGR1ZV9kYXRlLU1BSk9SLCBub3QgcHJpb3JpdHktbWFqb3I6IGBwcmlvcml0eV9yYW5rXG4gICAgICAvLyBkZXNjYCBvbmx5IGJyZWFrcyB0aWVzIGluc2lkZSBhIHNpbmdsZSBkdWUgZGF0ZSwgc28gYSBoaWdoIHRhc2sgZHVlXG4gICAgICAvLyB0b21vcnJvdyBvdXRyYW5rcyBhbiB1cmdlbnQgb25lIGR1ZSBuZXh0IHdlZWsuIE1lYXN1cmVkIG9uIHJjLjIgd2l0aFxuICAgICAgLy8gdGhlIHNoaXBwZWQgc29ydCBvdmVyIGZvdXIgcm93cyBcdTIwMTQgc29vbi91cmdlbnQsIHNvb24vaGlnaCwgbGF0ZXIvdXJnZW50LFxuICAgICAgLy8gbGF0ZXIvaGlnaCwgaW4gdGhhdCBvcmRlci4gV2hhdCBzdG9vZCBoZXJlIHNhaWQgdGhlIHNvcnQgXCJwdXRzIHVyZ2VudFxuICAgICAgLy8gYXQgdG9wXCIsIHdoaWNoIGlzIHdoYXQgdGhlIE9USEVSIGtleSBvcmRlciB3b3VsZCBkby5cbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAnc3RhdHVzJywgb3BlcmF0b3I6ICdpbicsIHZhbHVlOiBbJ25vdF9zdGFydGVkJywgJ2luX3Byb2dyZXNzJ10gfSxcbiAgICAgICAgeyBmaWVsZDogJ3ByaW9yaXR5Jywgb3BlcmF0b3I6ICdpbicsIHZhbHVlOiBbJ2hpZ2gnLCAndXJnZW50J10gfSxcbiAgICAgIF0sXG4gICAgICBzb3J0OiBbeyBmaWVsZDogJ2R1ZV9kYXRlJywgb3JkZXI6ICdhc2MnIH0sIHsgZmllbGQ6ICdwcmlvcml0eV9yYW5rJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICB9LFxuXG4gICAgLyoqIE92ZXJkdWUgLyBvcGVuIHRhc2tzIGFjcm9zcyB0aGUgdGVhbSBcdTIwMTQgc29ydGVkIG9sZGVzdC1kdWUgZmlyc3QgKi9cbiAgICBvdmVyZHVlX3Rhc2tzOiB7XG4gICAgICBuYW1lOiAnb3ZlcmR1ZV90YXNrcycsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICAvLyBIb25lc3QgbGFiZWwuIFR3byBpbmRlcGVuZGVudCByZWFzb25zIHdlcmUgcmVjb3JkZWQgZm9yIGl0OyBvbmUgc3RpbGxcbiAgICAgIC8vIGhvbGRzIGFuZCBvbmUgaGFzIGV4cGlyZWQgKCM3ODIpLCBzbyB0aGV5IGFyZSBzZXBhcmF0ZWQgaGVyZS5cbiAgICAgIC8vXG4gICAgICAvLyBTVElMTCBUUlVFIFx1MjAxNCBgaXNfb3ZlcmR1ZWAgaXMgYSBXUklURS1USU1FIHNuYXBzaG90LiBgdGFzay5ob29rLnRzOjY4YFxuICAgICAgLy8gc3RhbXBzIGl0IGluIGBiZWZvcmVTYXZlYCBvZmYgdGhhdCBtb21lbnQncyBjbG9jayAoYGVmZkR1ZSA8IHRvZGF5U3RyYFxuICAgICAgLy8gYW5kIG5vdCBjb21wbGV0ZWQpIGFuZCBub3RoaW5nIHJlLXN0YW1wcyBpdCBhZnRlcndhcmRzLCBzbyBhIHRhc2sgdGhhdFxuICAgICAgLy8gd2FzIG9uIHRpbWUgd2hlbiBpdCB3YXMgbGFzdCBzYXZlZCBzdGlsbCByZWFkcyBgaXNfb3ZlcmR1ZSA9IGZhbHNlYCB0aGVcbiAgICAgIC8vIGRheSBhZnRlciBpdHMgZHVlIGRhdGUgcGFzc2VzLiBBIGZpbHRlciBvbiB0aGF0IGNvbHVtbiB3b3VsZCBoYW5kIGJhY2tcbiAgICAgIC8vIHRoZSB3cm9uZyByb3dzLCBhbmQgaXQgd291bGQgZ28gd3Jvbmcgc2lsZW50bHkuXG4gICAgICAvL1xuICAgICAgLy8gRVhQSVJFRCBcdTIwMTQgdGhlIG90aGVyIHJlYXNvbiBzYWlkIHRoZSB2aWV3IGxheWVyIGNhbm5vdCByZXNvbHZlXG4gICAgICAvLyBgZHVlX2RhdGUgPCB7VE9EQVkoKX1gLCBhbmQgdGhhdCBvbmx5IGB7Y3VycmVudF91c2VyX2lkfWAgaW50ZXJwb2xhdGVzLlxuICAgICAgLy8gQm90aCBoYWx2ZXMgd2VyZSB3cm9uZyBhbHJlYWR5IG9uIDE3LjAuMC1yYy4yIFx1MjAxNCB0aGUgdmVyc2lvbiB0aGlzIHJlcG9cbiAgICAgIC8vIHBpbm5lZCBBVCBUSEUgVElNRSB0aGV5IHdlcmUgbWVhc3VyZWQsIG5vdCB0aGUgY3VycmVudCBwaW4gXHUyMDE0IGFuZCB0aGVcbiAgICAgIC8vIGZpbGUgc2FpZCB0aGUgb3Bwb3NpdGUgb2ZcbiAgICAgIC8vIGl0c2VsZjogdGhlIG5vdGUgb24gYHRvZGF5c190YXNrc2AgYWJvdmUgYXNzZXJ0ZWQgdGhhdFxuICAgICAgLy8gYHtjdXJyZW50X3VzZXJfaWR9YCBkb2VzIE5PVCBpbnRlcnBvbGF0ZS4gSXQgZG9lcy5cbiAgICAgIC8vIFRoYXQgY29tbWVudCBjYXJyaWVzIHRoZSBtZWFzdXJlbWVudHMgd2l0aCB0aGVpciB2ZXJzaW9ucywgSU5DTFVESU5HXG4gICAgICAvLyB0aGUgb25lIHRoYXQgbW92ZWQ6IGB7VE9EQVkoKX1gIGlzIFJFSkVDVEVEIGZyb20gMTcuMi4wIG9uXG4gICAgICAvLyAoYEZJTFRFUl9UT0tFTl9VTktOT1dOYCwgcmUtY29uZmlybWVkIG9uIDE3LjMuMCBhbmQgYWdhaW4gb25cbiAgICAgIC8vIDE3LjQuMCBieVxuICAgICAgLy8gYHRlc3QvZmxvdy1maWx0ZXItdG9kYXktdG9rZW4udGVzdC50c2ApIHdoZXJlIG9uIHJjLjIgaXQgc2hpcHBlZCB0b1xuICAgICAgLy8gdGhlIGRyaXZlciBhcyB0ZXh0LCBzbyBcImNhbm5vdCByZXNvbHZlIGB7VE9EQVkoKX1gXCIgaXMgd3Jvbmcgb24gdGhlXG4gICAgICAvLyBjdXJyZW50IHBpbiBmb3IgYSBkaWZmZXJlbnQgcmVhc29uIHRoYW4gaXQgd2FzIHdyb25nIG9uIHJjLjIuIFRoZVxuICAgICAgLy8gY2Fub25pY2FsIGB7dG9kYXl9YCByZXNvbHZlcyBvbiB0aGUgcmVhZCBwYXRoIGVpdGhlciB3YXksIHNvIGFcbiAgICAgIC8vIHN0cmljdGx5IHBhc3QtZHVlIGZpbHRlciBJUyBleHByZXNzaWJsZTogYGR1ZV9kYXRlIDwgJ3t0b2RheX0nYFxuICAgICAgLy8gc2VsZWN0ZWQgZXhhY3RseSB0aGUgcGFzdC1kdWUgcm93cyBvdXQgb2YgZm91ciBvbiByYy4yLCBhbmQgZGlkIGFnYWluXG4gICAgICAvLyBvbiAxNy4yLjAgKFJFLU1FQVNVUkVEIDIwMjYtMDktMDM7IHRoYXQgcm93IGNvdW50IHdhcyBub3QgcmUtdGFrZW4gb25cbiAgICAgIC8vIDE3LjMuMCwgd2hlcmUgdGhlIHRva2VuJ3MgcmVzb2x1dGlvbiBpcyByZS1jb25maXJtZWQgYnkgdGhlIHRlc3QgZmlsZVxuICAgICAgLy8gbmFtZWQgYWJvdmUpLlxuICAgICAgLy9cbiAgICAgIC8vIFNvIHRoZSBob25lc3Qgc3RhdGVtZW50IGlzIG5hcnJvd2VyIHRoYW4gdGhlIG9uZSB0aGF0IHN0b29kIGhlcmU6IHRoaXNcbiAgICAgIC8vIHZpZXcgQ0FOIGJlIGdpdmVuIGEgc3RyaWN0bHkgcGFzdC1kdWUgY3V0IHRocm91Z2ggYHt0b2RheX1gLCBhbmQgaXMgbm90XG4gICAgICAvLyBnaXZlbiBvbmUuIEFkZGluZyBpdCBpcyBhIEJFSEFWSU9VUiBjaGFuZ2UsIG5vdCBhIGNvbW1lbnQgY29ycmVjdGlvbiBcdTIwMTRcbiAgICAgIC8vIGl0IHdvdWxkIGRyb3AgdG9kYXkncyBkdWUtdG9kYXkgd29yayBvdXQgb2YgdGhlIHF1ZXVlIGFuZCB0dXJuIGFuXG4gICAgICAvLyBcIk9wZW4gVGFza3NcIiBiYWNrbG9nIGludG8gYSBzdHJpY3Qgb3ZlcmR1ZSBsaXN0LCB3aGljaCBpcyB0aGVcbiAgICAgIC8vIGN1dC12ZXJzdXMtcmFua2luZyBxdWVzdGlvbiBhbHJlYWR5IG9wZW4gb24gIzc3MCBmb3IgdGhlIHRhc2sgdmlld3MuXG4gICAgICAvLyBUaGF0IGFsc28gcmV0aXJlcyB0aGUgZm9sbG93LXVwIHRoaXMgY29tbWVudCB1c2VkIHRvIGVuZCBvbjogYW4gaG91cmx5XG4gICAgICAvLyBmbG93IHJlLXN0YW1waW5nIGBpc19vdmVyZHVlYCB3YXMgcHJvcG9zZWQgYXMgdGhlIE9OTFkgcm91dGUgdG8gYVxuICAgICAgLy8gdHJ1bHktb3ZlcmR1ZSBnYXVnZSwgYmVjYXVzZSB0aGUgZmlsdGVyIHJvdXRlIHdhcyBiZWxpZXZlZCBjbG9zZWQuXG4gICAgICAvLyBUaGVyZSBhcmUgdHdvIHJvdXRlcyBub3csIGFuZCBjaG9vc2luZyBiZXR3ZWVuIHRoZW0gYmVsb25ncyB0byAjNzcwLlxuICAgICAgLy9cbiAgICAgIC8vIEFzIHNoaXBwZWQ6IHRoZSBvcGVuLXRhc2sgYmFja2xvZyBvcmRlcmVkIG1vc3Qtb3ZlcmR1ZS1maXJzdCAob2xkZXN0XG4gICAgICAvLyBkdWUgZGF0ZSBvbiB0b3ApLCB3aGljaCBpcyB0aGUgYWN0aW9uYWJsZSBxdWV1ZSBhIG1hbmFnZXIgd29ya3MuXG4gICAgICBsYWJlbDogJ1x1MjNGMCBPcGVuIFRhc2tzIFx1MDBCNyBNb3N0IE92ZXJkdWUgRmlyc3QnLFxuICAgICAgdXNlckFjdGlvbnM6IHsgZWRpdElubGluZTogdHJ1ZSB9LFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV90YXNrJyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3ByaW9yaXR5JywgJ3N0YXR1cycsICdkdWVfZGF0ZScsICdvd25lcl9pZCddLFxuICAgICAgZmlsdGVyOiBbXG4gICAgICAgIHsgZmllbGQ6ICdpc19jb21wbGV0ZWQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiBmYWxzZSB9LFxuICAgICAgXSxcbiAgICAgIHNvcnQ6IFt7IGZpZWxkOiAnZHVlX2RhdGUnLCBvcmRlcjogJ2FzYycgfV0sXG4gICAgfSxcbiAgfSxcblxuICBmb3JtOiB7XG4gICAgdHlwZTogJ3NpbXBsZScsXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3Rhc2snLFxuICAgICAgICBsYWJlbDogJ1Rhc2snLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICAvLyBgdHlwZWAgKGNhbGwgLyBlbWFpbCAvIG1lZXRpbmcgLyBkZW1vKSBpcyB3aGF0IG1ha2VzIGFuIGFjdGl2aXR5XG4gICAgICAgIC8vIGhpc3RvcnkgcmVhZGFibGUgYW5kIGlzIHRoZSBmaXJzdCB0aGluZyBhIHJlcCByZWFjaGVzIGZvciBhZnRlciB0aGVcbiAgICAgICAgLy8gc3ViamVjdCBcdTIwMTQgaXQgd2FzIG1pc3NpbmcgZW50aXJlbHkuIGBkZXNjcmlwdGlvbmAgY2FwdHVyZXMgd2hhdCB3YXNcbiAgICAgICAgLy8gYWN0dWFsbHkgc2FpZCBvbiB0aGUgY2FsbC4gYHByb2dyZXNzX3BlcmNlbnRgIG1vdmVkIHRvIHRoZSBFZmZvcnRcbiAgICAgICAgLy8gc2VjdGlvbjogYSB0YXNrIGJlaW5nIGZpbGVkIGlzIDAlIGJ5IGRlZmluaXRpb24sIHNvIGEgcGVyY2VudGFnZVxuICAgICAgICAvLyBzbGlkZXIgb24gdGhlIGNyZWF0ZSBmb3JtIGlzIG5vaXNlLlxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IGZpZWxkOiAnc3ViamVjdCcsIHJlcXVpcmVkOiB0cnVlLCBzcGFuOiAnZnVsbCcgfSxcbiAgICAgICAgICB7IGZpZWxkOiAndHlwZScsIHJlcXVpcmVkOiBmYWxzZSB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICdwcmlvcml0eScsXG4gICAgICAgICAgJ2R1ZV9kYXRlJyxcbiAgICAgICAgICAnb3duZXJfaWQnLFxuICAgICAgICAgICdyZW1pbmRlcl9kYXRlJyxcbiAgICAgICAgICB7IGZpZWxkOiAnZGVzY3JpcHRpb24nLCBzcGFuOiAnZnVsbCcgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdyZWxhdGVkX3JlY29yZHMnLFxuICAgICAgICBsYWJlbDogJ1JlbGF0ZWQgUmVjb3JkcycsXG4gICAgICAgIGNvbGxhcHNpYmxlOiB0cnVlLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAncmVsYXRlZF90b19hY2NvdW50JyxcbiAgICAgICAgICAncmVsYXRlZF90b19jb250YWN0JyxcbiAgICAgICAgICAncmVsYXRlZF90b19vcHBvcnR1bml0eScsXG4gICAgICAgICAgJ3JlbGF0ZWRfdG9fbGVhZCcsXG4gICAgICAgICAgJ3JlbGF0ZWRfdG9fY2FzZScsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncmVjdXJyZW5jZV9hbmRfZWZmb3J0JyxcbiAgICAgICAgbGFiZWw6ICdSZWN1cnJlbmNlICYgRWZmb3J0JyxcbiAgICAgICAgY29sbGFwc2libGU6IHRydWUsXG4gICAgICAgIGNvbGxhcHNlZDogdHJ1ZSxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgJ2lzX3JlY3VycmluZycsXG4gICAgICAgICAgJ3JlY3VycmVuY2VfdHlwZScsXG4gICAgICAgICAgJ3JlY3VycmVuY2VfaW50ZXJ2YWwnLFxuICAgICAgICAgICdyZWN1cnJlbmNlX2VuZF9kYXRlJyxcbiAgICAgICAgICAncHJvZ3Jlc3NfcGVyY2VudCcsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzL2V2ZW50LnZpZXcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3MvZXZlbnQudmlldy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBFdmVudCBWaWV3cyAoIzU5MilcbiAqXG4gKiAgIFx1MjAyMiBncmlkICAgICBcdTIwMTQgZXZlcnkgaW50ZXJhY3Rpb24sIG1vc3QgcmVjZW50IGZpcnN0XG4gKiAgIFx1MjAyMiBjYWxlbmRhciBcdTIwMTQgdGhlIHNjaGVkdWxlLCBzdGFydCBcdTIxOTIgZW5kICh0aGUgcGxhdGZvcm0gdmlldyB0eXBlIHRoZSBpc3N1ZSBhc2tzIGZvcilcbiAqICAgXHUyMDIyIHRpbWVsaW5lIFx1MjAxNCB0aGUgc2FtZSByb3dzIGxhaWQgb3V0IHBlciByZXBcbiAqICAgXHUyMDIyIG1pbmUgICAgIFx1MjAxNCBteSBjYWxlbmRhclxuICogICBcdTIwMjIgdXBjb21pbmcgXHUyMDE0IHdoYXQgaXMgYm9va2VkIGJ1dCBoYXMgbm90IGhhcHBlbmVkIHlldFxuICogICBcdTIwMjIgaGVsZCAgICAgXHUyMDE0IHdoYXQgYWN0dWFsbHkgaGFwcGVuZWQsIHRoZSBpbnRlcmFjdGlvbiBoaXN0b3J5XG4gKlxuICogIyBXaHkgbm8gXCJwYXN0IGV2ZW50c1wiIGZpbHRlciBvbiBhIGRhdGVcbiAqXG4gKiBUaGUgbGlzdC12aWV3IGRhdGEgcGF0aCByZXNvbHZlcyBPTkxZIHRoZSB1c2VyIHRva2VucyAoYHtjdXJyZW50X3VzZXJfaWR9YCk7XG4gKiBkYXRlIG1hY3JvcyBzaGlwIHRvIHRoZSBzZXJ2ZXIgYXMgbGl0ZXJhbCBzdHJpbmdzLCBhbmQgYmVjYXVzZVxuICogYCcyMDI2LVx1MjAyNicgPCAne1x1MjAyNidgIGlzIGxleGljb2dyYXBoaWNhbGx5IHRydWUsIGEgYHN0YXJ0X2RhdGV0aW1lIDwge3RvZGF5fWBcbiAqIGZpbHRlciBtYXRjaGVzIHRoZSBGVVRVUkUgcm93cyBpbnN0ZWFkIG9mIHRoZSBwYXN0IG9uZXMgXHUyMDE0IGludmVydGVkLCBub3RcbiAqIG1lcmVseSBlbXB0eSAodGhlIHNhbWUgdHJhcCBgb3ZlcmR1ZV90YXNrc2AgZG9jdW1lbnRzKS4gU28gdGhlIHBhc3QvZnV0dXJlXG4gKiBzcGxpdCBpcyBleHByZXNzZWQgd2l0aCBgc3RhdHVzYCwgd2hpY2ggaXMgYXV0aG9yZWQgYW5kIGRvZXMgbm90IGRlY2F5LCBhbmRcbiAqIHRoZSBvcmRlcmluZyBkb2VzIHRoZSByZXN0LlxuICovXG5leHBvcnQgY29uc3QgRXZlbnRWaWV3cyA9IGRlZmluZVZpZXcoe1xuICBsaXN0OiB7XG4gICAgdHlwZTogJ2dyaWQnLFxuICAgIG5hbWU6ICdhbGxfZXZlbnRzJyxcbiAgICBsYWJlbDogJ0FsbCBFdmVudHMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2V2ZW50JyB9LFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICdzdWJqZWN0Jywgd2lkdGg6IDI4MCwgc29ydGFibGU6IHRydWUsIGxpbms6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICd0eXBlJywgd2lkdGg6IDEyMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCB3aWR0aDogMTIwLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ3N0YXJ0X2RhdGV0aW1lJywgd2lkdGg6IDE4MCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdkdXJhdGlvbl9taW51dGVzJywgd2lkdGg6IDEyMCwgYWxpZ246ICdyaWdodCcgfSxcbiAgICAgIHsgZmllbGQ6ICdsb2NhdGlvbicsIHdpZHRoOiAxODAgfSxcbiAgICAgIHsgZmllbGQ6ICdvd25lcl9pZCcsIHdpZHRoOiAxNTAgfSxcbiAgICBdLFxuICAgIHNvcnQ6IFt7IGZpZWxkOiAnc3RhcnRfZGF0ZXRpbWUnLCBvcmRlcjogJ2Rlc2MnIH1dLFxuICAgIHJvd0NvbG9yOiB7XG4gICAgICAvLyBNaXJyb3JzIHRoZSBvcHRpb24gY29sb3JzIG9uIGNybV9ldmVudC5zdGF0dXMuXG4gICAgICBmaWVsZDogJ3N0YXR1cycsXG4gICAgICBjb2xvcnM6IHsgcGxhbm5lZDogJ2JsdWUnLCBoZWxkOiAnZ3JlZW4nLCBjYW5jZWxsZWQ6ICdzbGF0ZScsIG5vX3Nob3c6ICdvcmFuZ2UnIH0sXG4gICAgfSxcbiAgICBzZWxlY3Rpb246IHsgdHlwZTogJ211bHRpcGxlJyB9LFxuICAgIHBhZ2luYXRpb246IHsgcGFnZVNpemU6IDUwIH0sXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnLCAnY2FsZW5kYXInLCAndGltZWxpbmUnLCAna2FuYmFuJ10sXG4gICAgfSxcbiAgICAvLyBCaW5kcyB0aGUgJ2NhbGVuZGFyJyBlbnRyeSBhYm92ZTogdGhlIHNhbWUgc3BhbiB0aGUgZGVkaWNhdGVkXG4gICAgLy8gYGV2ZW50X2NhbGVuZGFyYCB2aWV3IHNob3dzLiBgc3RhcnRfZGF0ZXRpbWVgIGlzIHJlcXVpcmVkICsgbm90TnVsbDtcbiAgICAvLyBgZW5kX2RhdGV0aW1lYCBpcyBvcHRpb25hbCwgc28gYW4gZXZlbnQgd2l0aG91dCBvbmUgc3RheXMgYSBzaW5nbGUgcG9pbnRcbiAgICAvLyBpbiB0aW1lIHJhdGhlciB0aGFuIGJvcnJvd2luZyBhIG5laWdoYm91cidzIGVuZC5cbiAgICBjYWxlbmRhcjoge1xuICAgICAgc3RhcnREYXRlRmllbGQ6ICdzdGFydF9kYXRldGltZScsXG4gICAgICBlbmREYXRlRmllbGQ6ICdlbmRfZGF0ZXRpbWUnLFxuICAgICAgdGl0bGVGaWVsZDogJ3N1YmplY3QnLFxuICAgICAgY29sb3JGaWVsZDogJ3R5cGUnLFxuICAgIH0sXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgLyoqIFRoZSBjYWxlbmRhciB0aGUgaXNzdWUgYXNrcyBmb3IgXHUyMDE0IHN0YXJ0IFx1MjE5MiBlbmQsIGNvbG91cmVkIGJ5IGtpbmQuICovXG4gICAgZXZlbnRfY2FsZW5kYXI6IHtcbiAgICAgIG5hbWU6ICdldmVudF9jYWxlbmRhcicsXG4gICAgICB0eXBlOiAnY2FsZW5kYXInLFxuICAgICAgbGFiZWw6ICdFdmVudCBDYWxlbmRhcicsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2V2ZW50JyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3R5cGUnLCAnb3duZXJfaWQnXSxcbiAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnc3RhcnRfZGF0ZXRpbWUnLFxuICAgICAgICBlbmREYXRlRmllbGQ6ICdlbmRfZGF0ZXRpbWUnLFxuICAgICAgICB0aXRsZUZpZWxkOiAnc3ViamVjdCcsXG4gICAgICAgIGNvbG9yRmllbGQ6ICd0eXBlJyxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKiBXaG8gaXMgYm9va2VkIHdoZW4gXHUyMDE0IG9uZSBsYW5lIHBlciByZXAuICovXG4gICAgZXZlbnRfdGltZWxpbmU6IHtcbiAgICAgIG5hbWU6ICdldmVudF90aW1lbGluZScsXG4gICAgICB0eXBlOiAndGltZWxpbmUnLFxuICAgICAgbGFiZWw6ICdUZWFtIFNjaGVkdWxlJyxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fZXZlbnQnIH0sXG4gICAgICBjb2x1bW5zOiBbJ3N1YmplY3QnLCAnc3RhdHVzJ10sXG4gICAgICB0aW1lbGluZToge1xuICAgICAgICBzdGFydERhdGVGaWVsZDogJ3N0YXJ0X2RhdGV0aW1lJyxcbiAgICAgICAgZW5kRGF0ZUZpZWxkOiAnZW5kX2RhdGV0aW1lJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ3N1YmplY3QnLFxuICAgICAgICBncm91cEJ5RmllbGQ6ICdvd25lcl9pZCcsXG4gICAgICAgIGNvbG9yRmllbGQ6ICd0eXBlJyxcbiAgICAgICAgc2NhbGU6ICdkYXknLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgbXlfZXZlbnRzOiB7XG4gICAgICBuYW1lOiAnbXlfZXZlbnRzJyxcbiAgICAgIHR5cGU6ICdjYWxlbmRhcicsXG4gICAgICBsYWJlbDogJ015IENhbGVuZGFyJyxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fZXZlbnQnIH0sXG4gICAgICBjb2x1bW5zOiBbJ3N1YmplY3QnLCAndHlwZScsICdsb2NhdGlvbiddLFxuICAgICAgLy8gYHtjdXJyZW50X3VzZXJfaWR9YCBpcyB0aGUgb25lIHRva2VuIHRoZSBsaXN0LXZpZXcgZGF0YSBwYXRoIHJlYWxseVxuICAgICAgLy8gaW50ZXJwb2xhdGVzIChzZWUgY3JtLmFwcC50cydzIFwiTXkgV29ya1wiIG5vdGUpLlxuICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ293bmVyX2lkJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ3tjdXJyZW50X3VzZXJfaWR9JyB9XSxcbiAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnc3RhcnRfZGF0ZXRpbWUnLFxuICAgICAgICBlbmREYXRlRmllbGQ6ICdlbmRfZGF0ZXRpbWUnLFxuICAgICAgICB0aXRsZUZpZWxkOiAnc3ViamVjdCcsXG4gICAgICAgIGNvbG9yRmllbGQ6ICd0eXBlJyxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKiBCb29rZWQsIG5vdCB5ZXQgaGVsZCBcdTIwMTQgc29vbmVzdCBmaXJzdC4gKi9cbiAgICB1cGNvbWluZ19ldmVudHM6IHtcbiAgICAgIG5hbWU6ICd1cGNvbWluZ19ldmVudHMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdcdUQ4M0RcdURDQzUgVXBjb21pbmcgXHUwMEI3IFNvb25lc3QgRmlyc3QnLFxuICAgICAgdXNlckFjdGlvbnM6IHsgZWRpdElubGluZTogdHJ1ZSB9LFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9ldmVudCcgfSxcbiAgICAgIGNvbHVtbnM6IFsnc3ViamVjdCcsICd0eXBlJywgJ3N0YXJ0X2RhdGV0aW1lJywgJ2xvY2F0aW9uJywgJ3JlbGF0ZWRfdG9fdHlwZScsICdvd25lcl9pZCddLFxuICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ3N0YXR1cycsIG9wZXJhdG9yOiAnZXF1YWxzJywgdmFsdWU6ICdwbGFubmVkJyB9XSxcbiAgICAgIHNvcnQ6IFt7IGZpZWxkOiAnc3RhcnRfZGF0ZXRpbWUnLCBvcmRlcjogJ2FzYycgfV0sXG4gICAgfSxcblxuICAgIC8qKiBXaGF0IGFjdHVhbGx5IGhhcHBlbmVkIFx1MjAxNCB0aGUgaW50ZXJhY3Rpb24gaGlzdG9yeSB0aGUgQ1JNIGNvdWxkIG5vdCBzaG93LiAqL1xuICAgIGhlbGRfZXZlbnRzOiB7XG4gICAgICBuYW1lOiAnaGVsZF9ldmVudHMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdcdTI3MDUgSW50ZXJhY3Rpb24gSGlzdG9yeScsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2V2ZW50JyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3R5cGUnLCAnc3RhcnRfZGF0ZXRpbWUnLCAnZHVyYXRpb25fbWludXRlcycsICdyZWxhdGVkX3RvX3R5cGUnLCAnb3duZXJfaWQnXSxcbiAgICAgIGZpbHRlcjogW3sgZmllbGQ6ICdzdGF0dXMnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiAnaGVsZCcgfV0sXG4gICAgICBzb3J0OiBbeyBmaWVsZDogJ3N0YXJ0X2RhdGV0aW1lJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICB9LFxuICB9LFxuXG4gIGZvcm06IHtcbiAgICB0eXBlOiAnc2ltcGxlJyxcbiAgICBzZWN0aW9uczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnZXZlbnQnLFxuICAgICAgICBsYWJlbDogJ0V2ZW50JyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ3N1YmplY3QnLCByZXF1aXJlZDogdHJ1ZSwgc3BhbjogJ2Z1bGwnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ3R5cGUnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICdvd25lcl9pZCcsXG4gICAgICAgICAgJ2xvY2F0aW9uJyxcbiAgICAgICAgICB7IGZpZWxkOiAnZGVzY3JpcHRpb24nLCBzcGFuOiAnZnVsbCcgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzY2hlZHVsZScsXG4gICAgICAgIGxhYmVsOiAnU2NoZWR1bGUnLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IGZpZWxkOiAnc3RhcnRfZGF0ZXRpbWUnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICdlbmRfZGF0ZXRpbWUnLFxuICAgICAgICAgICdhbGxfZGF5JyxcbiAgICAgICAgICAnZHVyYXRpb25fbWludXRlcycsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncmVsYXRlZF9yZWNvcmRzJyxcbiAgICAgICAgbGFiZWw6ICdSZWxhdGVkIFJlY29yZHMnLFxuICAgICAgICBjb2xsYXBzaWJsZTogdHJ1ZSxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgJ3JlbGF0ZWRfdG9fYWNjb3VudCcsXG4gICAgICAgICAgJ3JlbGF0ZWRfdG9fY29udGFjdCcsXG4gICAgICAgICAgJ3JlbGF0ZWRfdG9fb3Bwb3J0dW5pdHknLFxuICAgICAgICAgICdyZWxhdGVkX3RvX2xlYWQnLFxuICAgICAgICAgICdyZWxhdGVkX3RvX2Nhc2UnLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ291dGNvbWUnLFxuICAgICAgICBsYWJlbDogJ091dGNvbWUnLFxuICAgICAgICBjb2xsYXBzaWJsZTogdHJ1ZSxcbiAgICAgICAgY29sbGFwc2VkOiB0cnVlLFxuICAgICAgICBjb2x1bW5zOiAxLFxuICAgICAgICBmaWVsZHM6IFsnb3V0Y29tZV9ub3RlcyddLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy92aWV3cy9ldmVudF9hdHRlbmRlZS52aWV3LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzL2V2ZW50X2F0dGVuZGVlLnZpZXcudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZVZpZXcgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogRXZlbnQgQXR0ZW5kZWUgVmlld3MgKCM1OTIpXG4gKlxuICogQSBqdW5jdGlvbiBvYmplY3QgaXMgbm9ybWFsbHkgZWRpdGVkIGluc2lkZSBpdHMgcGFyZW50J3MgcmVsYXRlZCBsaXN0LCBhbmRcbiAqIGBjcm1fZXZlbnRfYXR0ZW5kZWVgIGlzIG5vIGV4Y2VwdGlvbi4gSXQgY2FycmllcyBubyBuYXZpZ2F0aW9uIGVudHJ5OiBhblxuICogYXR0ZW5kZWUgaXMgbmV2ZXIgc29tZXRoaW5nIHlvdSBnbyBsb29raW5nIGZvciBvbiBpdHMgb3duLCB5b3UgcmVhY2ggaXRcbiAqIHRocm91Z2ggdGhlIG1lZXRpbmcuXG4gKlxuICogIyBXaGF0IGVhY2ggaGFsZiBvZiB0aGlzIGJ1bmRsZSBhY3R1YWxseSByZW5kZXJzIFx1MjAxNCBtZWFzdXJlZCAoIzk0NClcbiAqXG4gKiBUaGlzIGhlYWRlciB1c2VkIHRvIGp1c3RpZnkgYm90aCBoYWx2ZXMgaW4gb25lIHNlbnRlbmNlOiB0aGUgcmVsYXRlZCBsaXN0XG4gKiByZW5kZXJzIFRISVMgdmlldydzIGNvbHVtbnMsIHRoZSBxdWljay1jcmVhdGUgbW9kYWwgcmVuZGVycyBUSElTIGZvcm0sIGFuZFxuICogd2l0aG91dCB0aGVtIHRoZSBwYW5lbCBmYWxscyBiYWNrIHRvIGV2ZXJ5IGNvbHVtbiBpbiBkZWNsYXJhdGlvbiBvcmRlciB3aGlsZVxuICogdGhlIG1vZGFsIG9mZmVycyB0aGUgcmF3IGF1dG9udW1iZXIgXHUyMDE0IFwiZm9yIHRoZSBzYW1lIHJlYXNvblxuICogYGNybV9jYW1wYWlnbl9tZW1iZXJgIGhhcyB0aGVtXCIuIGBjcm1fY2FtcGFpZ25fbWVtYmVyYCBoYXMgbm8gdmlldyBtZXRhZGF0YVxuICogYXQgYWxsLCB3aGljaCBpcyB3aGF0IHNlbnQgIzk0NCBsb29raW5nOyByZS1tZWFzdXJpbmcgdGhlIHBhcmFncmFwaCBhZ2FpbnN0XG4gKiB0aGUgc2hpcHBlZCBDb25zb2xlICgxNy4wLjAtcmMuMykgbGVmdCBvbmx5IHRoZSBmb3JtIGhhbGYgc3RhbmRpbmcuXG4gKlxuICogKipgZm9ybWAgXHUyMDE0IGxpdmUuKiogVGhlIENvbnNvbGUgbWVyZ2VzIGEgdmlldyBidW5kbGUncyBgZm9ybWAgb250byB0aGUgb2JqZWN0XG4gKiBkZWZpbml0aW9uIGl0IGhvbGRzLCBhbmQgdGhlIHJlY29yZCBkcmF3ZXIgYSByZWxhdGVkIGxpc3Qgb3BlbnMgKFwiTmV3XCIgb25cbiAqIHRoZSBwYW5lbCwgZWRpdCBvbiBhIHJvdykgcmVuZGVycyB0aGF0IGZvcm0ncyBgc2VjdGlvbnNgLiBXaGF0IHRoZSBhdXRob3JlZFxuICogZm9ybSBidXlzIGlzIHRoZSBzZWN0aW9uIHNwbGl0IGFuZCB0aGUgZmllbGQgb3JkZXIgXHUyMDE0IG5vdCByZXNjdWUgZnJvbSBhIHJhd1xuICogYXV0b251bWJlciwgYmVjYXVzZSB0aGUgbm8tZm9ybSBmYWxsYmFjayBpcyBub3QgcmF3IGVpdGhlcjogaW4gYGNyZWF0ZWAgbW9kZVxuICogdGhlIGRyYXdlciBkcm9wcyBgYXV0b251bWJlcmAsIGBmb3JtdWxhYCBhbmQgYHN1bW1hcnlgIGZpZWxkcyAoYW5kIGFueXRoaW5nXG4gKiBoaWRkZW4gb3IgcmVhZG9ubHkpIGFuZCBzZWN0aW9ucyB3aGF0ZXZlciBpcyBsZWZ0IGJ5IHRoZSBvYmplY3QncyBvd25cbiAqIGBmaWVsZEdyb3Vwc2AuIGBhdHRlbmRlZV9udW1iZXJgIHdhcyBuZXZlciBvbiBvZmZlci5cbiAqXG4gKiAqKmBsaXN0YCBcdTIwMTQgbm90IHdoYXQgdGhlIHJlbGF0ZWQgbGlzdCByZWFkcy4qKiBBIGRldGFpbC1wYWdlIHJlbGF0ZWQgbGlzdFxuICogdGFrZXMgaXRzIGNvbHVtbnMgZnJvbSB0aGUgQ0hJTEQncyBsb29rdXAgZmllbGQgXHUyMDE0IGByZWxhdGVkTGlzdENvbHVtbnNgIG9uXG4gKiBgY3JtX2V2ZW50YCwgd2hpY2ggdGhpcyBhcHAgYXV0aG9ycyBub3doZXJlIFx1MjAxNCBhbmQgZmFsbHMgYmFjayB0byB0aGUgY2hpbGRcbiAqIG9iamVjdCdzIGBoaWdobGlnaHRGaWVsZHNgIG1pbnVzIHRoZSBwYXJlbnQgbG9va3VwLCBjYXBwZWQgYXQgc2l4LCB3aXRoXG4gKiBjb2x1bW5zIHRoYXQgYXJlIGVtcHR5IG9uIGV2ZXJ5IGZldGNoZWQgcm93IGRyb3BwZWQuIE9ubHkgYW4gb2JqZWN0IHdpdGggbm9cbiAqIGBoaWdobGlnaHRGaWVsZHNgIHJlYWNoZXMgdGhlIGxhc3QgcmVzb3J0LCBhbmQgdGhhdCBpcyBhIGhldXJpc3RpYyBvdmVyIHRoZVxuICogZmllbGQgbWFwICh0aXRsZS1pc2ggbmFtZXMgZmlyc3QsIGF1ZGl0IGNvbHVtbnMgbGFzdCwgYHJpY2hfdGV4dGAgLyBgaHRtbGAgL1xuICogYGpzb25gIGV4Y2x1ZGVkKSBcdTIwMTQgbm90IGRlY2xhcmF0aW9uIG9yZGVyLCBhbmQgbmV2ZXIgdGhpcyB2aWV3LiBTbyB0aGVcbiAqIGF0dGVuZGVlIHBhbmVsIG9uIGEgbWVldGluZyBzaG93cyBgYXR0ZW5kZWVfdHlwZWAsIGByZXNwb25zZWAgYW5kXG4gKiBgaXNfb3JnYW5pemVyYCwgc3RyYWlnaHQgb2ZmIGBjcm1fZXZlbnRfYXR0ZW5kZWUuaGlnaGxpZ2h0RmllbGRzYCwgd2hhdGV2ZXJcbiAqIHRoZSBjb2x1bW5zIGJlbG93IHNheS5cbiAqXG4gKiBUaGUgZ3JpZCBpcyB0aGVyZWZvcmUgcmVhY2hhYmxlIG9ubHkgYXQgdGhpcyBvYmplY3QncyBvd24gbGlzdCBVUkwsIHdoaWNoIG5vXG4gKiBuYXZpZ2F0aW9uIGVudHJ5IGxpbmtzIHRvLiBJdCBpcyBrZXB0IGFzIHRoZSBjdXJhdGVkIGFuc3dlciB0byBcIndoYXQgZG8geW91XG4gKiBzaG93IGFib3V0IGFuIGF0dGVuZGVlXCIsIGFuZCBpdCBpcyB3aGF0IGEgZnV0dXJlIGByZWxhdGVkTGlzdENvbHVtbnNgIHdvdWxkXG4gKiBiZSBjb3BpZWQgZnJvbSBcdTIwMTQgYnV0IG5vdGhpbmcgaW4gdGhpcyByZXBvIG1heSBjaXRlIGl0IGFzIHdoYXQgbWFrZXMgYVxuICogcmVsYXRlZCBsaXN0IHJlYWRhYmxlLiBUaGUgbG9hZC1iZWFyaW5nIG1ldGFkYXRhIGlzIGBoaWdobGlnaHRGaWVsZHNgLCBhbmRcbiAqIGB0ZXN0L3ZpZXctcmVmZXJlbmNlcy50ZXN0LnRzYCBwaW5zIGl0IGZvciBldmVyeSBvYmplY3QgcmVhY2hlZCBvbmx5IHRocm91Z2hcbiAqIGEgcGFyZW50OiBzdHJpcCBpdCBhbmQgdGhlIHBhbmVsIHJlYWxseSBkb2VzIGZhbGwgdG8gdGhlIGhldXJpc3RpYywgd2hpY2hcbiAqIGxlYWRzIHdpdGggdGhlIGF1dG9udW1iZXIgdGhlc2Ugb2JqZWN0cyB1c2UgYXMgdGhlaXIgYG5hbWVGaWVsZGAuXG4gKi9cbmV4cG9ydCBjb25zdCBFdmVudEF0dGVuZGVlVmlld3MgPSBkZWZpbmVWaWV3KHtcbiAgbGlzdDoge1xuICAgIHR5cGU6ICdncmlkJyxcbiAgICBuYW1lOiAnYWxsX2V2ZW50X2F0dGVuZGVlcycsXG4gICAgbGFiZWw6ICdFdmVudCBBdHRlbmRlZXMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2V2ZW50X2F0dGVuZGVlJyB9LFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICdhdHRlbmRlZV90eXBlJywgd2lkdGg6IDEyMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdjcm1fY29udGFjdCcsIHdpZHRoOiAyMDAgfSxcbiAgICAgIHsgZmllbGQ6ICdjcm1fbGVhZCcsIHdpZHRoOiAyMDAgfSxcbiAgICAgIHsgZmllbGQ6ICdzeXNfdXNlcicsIHdpZHRoOiAyMDAgfSxcbiAgICAgIHsgZmllbGQ6ICdleHRlcm5hbF9uYW1lJywgd2lkdGg6IDIwMCB9LFxuICAgICAgeyBmaWVsZDogJ3Jlc3BvbnNlJywgd2lkdGg6IDE0MCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdpc19vcmdhbml6ZXInLCB3aWR0aDogMTAwLCBhbGlnbjogJ2NlbnRlcicgfSxcbiAgICBdLFxuICAgIHNvcnQ6IFt7IGZpZWxkOiAnaXNfb3JnYW5pemVyJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICByb3dDb2xvcjoge1xuICAgICAgLy8gTWlycm9ycyB0aGUgb3B0aW9uIGNvbG9ycyBvbiBjcm1fZXZlbnRfYXR0ZW5kZWUucmVzcG9uc2UuXG4gICAgICBmaWVsZDogJ3Jlc3BvbnNlJyxcbiAgICAgIGNvbG9yczogeyBhY2NlcHRlZDogJ2dyZWVuJywgZGVjbGluZWQ6ICdyZWQnLCB0ZW50YXRpdmU6ICdvcmFuZ2UnLCBub19yZXNwb25zZTogJ3NsYXRlJyB9LFxuICAgIH0sXG4gICAgcGFnaW5hdGlvbjogeyBwYWdlU2l6ZTogMjUgfSxcbiAgfSxcblxuICBmb3JtOiB7XG4gICAgdHlwZTogJ3NpbXBsZScsXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2F0dGVuZGVlJyxcbiAgICAgICAgbGFiZWw6ICdBdHRlbmRlZScsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgZmllbGQ6ICdjcm1fZXZlbnQnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdhdHRlbmRlZV90eXBlJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICAnY3JtX2NvbnRhY3QnLFxuICAgICAgICAgICdjcm1fbGVhZCcsXG4gICAgICAgICAgJ3N5c191c2VyJyxcbiAgICAgICAgICAnZXh0ZXJuYWxfbmFtZScsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaW52aXRhdGlvbicsXG4gICAgICAgIGxhYmVsOiAnSW52aXRhdGlvbicsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydyZXNwb25zZScsICdpc19vcmdhbml6ZXInLCAnaW52aXRlZF9kYXRlJ10sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzL2ZvcmVjYXN0LnZpZXcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3MvZm9yZWNhc3Qudmlldy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBGb3JlY2FzdCBWaWV3c1xuICpcbiAqICAgXHUyMDIyIGdyaWQgICAgICAgICAgICBcdTIwMTQgZXZlcnkgc25hcHNob3RcbiAqICAgXHUyMDIyIGN1cnJlbnRfcXVhcnRlciBcdTIwMTQgb3duZXJzIFx1MDBENyB0aGlzLXF1YXJ0ZXIgcm93XG4gKiAgIFx1MjAyMiBteV9mb3JlY2FzdCAgICAgXHUyMDE0IGN1cnJlbnQgdXNlcidzIHNuYXBzaG90c1xuICovXG5leHBvcnQgY29uc3QgRm9yZWNhc3RWaWV3cyA9IGRlZmluZVZpZXcoe1xuICBsaXN0OiB7XG4gICAgdHlwZTogJ2dyaWQnLFxuICAgIG5hbWU6ICdhbGxfZm9yZWNhc3RzJyxcbiAgICBsYWJlbDogJ0FsbCBGb3JlY2FzdHMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2ZvcmVjYXN0JyB9LFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICdvd25lcl9pZCcsICAgICAgICAgICAgd2lkdGg6IDE2MCwgcGlubmVkOiAnbGVmdCcsIGxpbms6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdwZXJpb2RfbGFiZWwnLCAgICAgd2lkdGg6IDEzMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdwZXJpb2Rfc3RhcnQnLCAgICAgd2lkdGg6IDEzMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdzbmFwc2hvdF9kYXRlJywgICAgd2lkdGg6IDEzMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdxdW90YScsICAgICAgICAgICAgd2lkdGg6IDEzMCwgYWxpZ246ICdyaWdodCcsIHN1bW1hcnk6ICdzdW0nIH0sXG4gICAgICB7IGZpZWxkOiAnY2xvc2VkX2Ftb3VudCcsICAgIHdpZHRoOiAxNDAsIGFsaWduOiAncmlnaHQnLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgeyBmaWVsZDogJ2NvbW1pdF9hbW91bnQnLCAgICB3aWR0aDogMTQwLCBhbGlnbjogJ3JpZ2h0Jywgc3VtbWFyeTogJ3N1bScgfSxcbiAgICAgIHsgZmllbGQ6ICdiZXN0X2Nhc2VfYW1vdW50Jywgd2lkdGg6IDE0MCwgYWxpZ246ICdyaWdodCcsIHN1bW1hcnk6ICdzdW0nIH0sXG4gICAgICB7IGZpZWxkOiAncGlwZWxpbmVfYW1vdW50JywgIHdpZHRoOiAxNDAsIGFsaWduOiAncmlnaHQnLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgLy8gTm8gdG90YWwgaGVyZTogYSBmb3JtdWxhIGhhcyBubyBzdG9yZWQgY29sdW1uIHRvIGFnZ3JlZ2F0ZSwgc28gdGhlIHNwZWMgcmVmdXNlcyBgc3VtYCBvbiBhIGBmb3JtdWxhYCBmaWVsZCAoIzE5ODApLlxuICAgICAgeyBmaWVsZDogJ2V4cGVjdGVkX2Ftb3VudCcsICB3aWR0aDogMTQwLCBhbGlnbjogJ3JpZ2h0JyB9LFxuICAgICAgeyBmaWVsZDogJ2F0dGFpbm1lbnRfcGN0JywgICB3aWR0aDogMTMwLCBhbGlnbjogJ3JpZ2h0JyB9LFxuICAgICAgeyBmaWVsZDogJ2NvdmVyYWdlX3JhdGlvJywgICB3aWR0aDogMTMwLCBhbGlnbjogJ3JpZ2h0JyB9LFxuICAgICAgeyBmaWVsZDogJ3NvdXJjZScsICAgICAgICAgICB3aWR0aDogMTMwIH0sXG4gICAgXSxcbiAgICBzb3J0OiBbXG4gICAgICB7IGZpZWxkOiAncGVyaW9kX3N0YXJ0JywgIG9yZGVyOiAnZGVzYycgfSxcbiAgICAgIHsgZmllbGQ6ICdvd25lcl9pZCcsICAgICAgICAgb3JkZXI6ICdhc2MnIH0sXG4gICAgXSxcbiAgICBncm91cGluZzogeyBmaWVsZHM6IFt7IGZpZWxkOiAncGVyaW9kX2xhYmVsJywgb3JkZXI6ICdkZXNjJyB9XSB9LFxuICAgIHBhZ2luYXRpb246IHsgcGFnZVNpemU6IDUwIH0sXG4gICAgYXBwZWFyYW5jZTogeyBhbGxvd2VkVmlzdWFsaXphdGlvbnM6IFsnZ3JpZCddIH0sXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgdGhpc19xdWFydGVyX2ZvcmVjYXN0czoge1xuICAgICAgbmFtZTogJ3RoaXNfcXVhcnRlcl9mb3JlY2FzdHMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgLy8gVGhlIGxhYmVsIHByb21pc2VzIHRoZSBDVVJSRU5UIHF1YXJ0ZXIsIGFuZCB0aGUgZmlsdGVyIGRlbGl2ZXJzIGl0LlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSByZXN0cmljdGlvbiB3YXMgZHJvcHBlZCBpbiAjNTE1IG9uIHRoZSBtZWFzdXJlbWVudCB0aGF0IFwidGhlIGxpc3RcbiAgICAgIC8vIGRhdGEgcGF0aCByZXNvbHZlcyBubyBkYXRlIG1hY3JvXCIuIFRoYXQgbWVhc3VyZW1lbnQgd2FzIHRha2VuIG9uXG4gICAgICAvLyBAb2JqZWN0c3RhY2sgMTYuMS4wIGFuZCBoYXMgc2luY2UgZXhwaXJlZDogYHJlc29sdmVGaWx0ZXJUb2tlbnMoKWAgd2FzXG4gICAgICAvLyB3aXJlZCBpbnRvIHRoZSBPYmplY3RRTCBSRUFEIHBhdGggaW4gMTcuMC4wLXJjLjAgKG9iamVjdHFsXG4gICAgICAvLyBgZmVhdChmaWx0ZXJzKTogZXZhbHVhdGUge2ZpbHRlci10b2tlbn0gcGxhY2Vob2xkZXJzIHNlcnZlci1zaWRlYCxcbiAgICAgIC8vICMzNTgyKSBcdTIwMTQgYGZpbmRgL2BmaW5kT25lYC9gY291bnRgL2BhZ2dyZWdhdGVgLCBhaGVhZCBvZiB0aGUgbWlkZGxld2FyZVxuICAgICAgLy8gY2hhaW4sIHdoaWNoIGlzIHRoZSBvbmUgZ2F0ZSBldmVyeSBzZXJ2ZXItc2lkZSByZWFkIHBhc3NlcyB0aHJvdWdoLFxuICAgICAgLy8gc2F2ZWQtdmlldyBmaWx0ZXJzIGluY2x1ZGVkLiBNZWFzdXJlZCByYXRoZXIgdGhhbiBpbmZlcnJlZDtcbiAgICAgIC8vIGB0ZXN0L2ZvcmVjYXN0LWN1cnJlbnQtcXVhcnRlci12aWV3LnRlc3QudHNgIHJ1bnMgVEhJUyBmaWx0ZXIgdGhyb3VnaCBhXG4gICAgICAvLyByZWFsIGVuZ2luZSBhbmQgcGlucyB0aGUgdGhyZWUtd2F5IG91dGNvbWUgKG9uZSBxdWFydGVyIHNlbGVjdGVkLCBub3RcbiAgICAgIC8vIHplcm8gYW5kIG5vdCBhbGwgb2YgdGhlbSkuIEZpcnN0IHRha2VuIG9uIDE3LjAuMC1yYy4yLCBSRS1SVU5cbiAgICAgIC8vIDIwMjYtMDktMDMgb24gMTcuMi4wICgjMTQ2NyksIFJFLVJVTiBvbiAxNy4zLjAgKCMxNjc2LCBhZnRlciB0aGUgUFJcbiAgICAgIC8vICMxNTc3IGJ1bXApIGFuZCBSRS1SVU4gYWdhaW4gb24gMTcuNC4wICgjMTg4MywgYWZ0ZXIgdGhlIFBSICMxODE0XG4gICAgICAvLyBidW1wKSwgZ3JlZW4gYWxsIGZvdXIgdGltZXMuIE5vdCB5ZXQgcmUtcnVuIG9uIDE3LjUuMDsgdGhlIHRlc3QgaXNcbiAgICAgIC8vIHdoYXQgcmUtdGFrZXMgdGhlIHJlYWRpbmcgb24gZWFjaCBuZXcgcGluLlxuICAgICAgLy9cbiAgICAgIC8vIEJvdGggaGFsdmVzIG9mIHRoZSBrZXkgYXJlIGxvYWQtYmVhcmluZywgc2FtZSBhcyB0aGUgcXVvdGEtYXR0YWlubWVudFxuICAgICAgLy8gd2lkZ2V0IGluIGBzcmMvc2FsZXMvZGFzaGJvYXJkcy9zYWxlcy5kYXNoYm9hcmQudHNgOiBgcGVyaW9kOiAncXVhcnRlcidgXG4gICAgICAvLyBhbG9uZSByZXR1cm5zIGV2ZXJ5IHF1YXJ0ZXIgZXZlciBzbmFwc2hvdHRlZCAodGhlICM3MzAgZGVmZWN0KSwgYW5kXG4gICAgICAvLyBgcGVyaW9kX3N0YXJ0YCBhbG9uZSBtZXJnZXMgdGhlIHF1YXJ0ZXIgcm93IHdpdGggdGhlIE1PTlRIIHJvdyB0aGF0XG4gICAgICAvLyBvcGVucyB0aGUgc2FtZSBxdWFydGVyIFx1MjAxNCBRMyBhbmQgSnVseSBib3RoIHN0YXJ0IG9uIHRoZSAxc3QuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIG9sZCBge3RoaXNfcXVhcnRlcl9zdGFydH1gIHNwZWxsaW5nIGlzIG5vdCBtZXJlbHkgdW5yZXNvbHZlZCBub3csXG4gICAgICAvLyBpdCBpcyByZWplY3RlZDogdGhlIHJlc29sdmVyIHRocm93cyBgVW5yZXNvbHZhYmxlIGZpbHRlciBwbGFjZWhvbGRlcmBcbiAgICAgIC8vIGFuZCBuYW1lcyBge2N1cnJlbnRfcXVhcnRlcl9zdGFydH1gIGFzIHRoZSBmaXgsIHNvIHRoZSBzaWxlbnQtZW1wdHlcbiAgICAgIC8vIGZhaWx1cmUgbW9kZSB0aGF0IHJlbW92YWwgd2FzIHJlYWN0aW5nIHRvIGlzIG5vIGxvbmdlciByZWFjaGFibGUuXG4gICAgICBsYWJlbDogJ1RoaXMgUXVhcnRlcicsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2ZvcmVjYXN0JyB9LFxuICAgICAgY29sdW1uczogWydvd25lcl9pZCcsICdxdW90YScsICdjbG9zZWRfYW1vdW50JywgJ2NvbW1pdF9hbW91bnQnLCAnYmVzdF9jYXNlX2Ftb3VudCcsICdwaXBlbGluZV9hbW91bnQnLCAnYXR0YWlubWVudF9wY3QnLCAnY292ZXJhZ2VfcmF0aW8nXSxcbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAncGVyaW9kJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ3F1YXJ0ZXInIH0sXG4gICAgICAgIHsgZmllbGQ6ICdwZXJpb2Rfc3RhcnQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiAne2N1cnJlbnRfcXVhcnRlcl9zdGFydH0nIH0sXG4gICAgICBdLFxuICAgICAgLy8gT25lIHNvcnQga2V5LCBiZWNhdXNlIHRoZSBmaWx0ZXIgcGlucyBgcGVyaW9kX3N0YXJ0YCB0byBhIHNpbmdsZSB2YWx1ZVxuICAgICAgLy8gXHUyMDE0IHRoZSBgcGVyaW9kX3N0YXJ0IGRlc2NgIGtleSB0aGF0IHJhbmtlZCBxdWFydGVycyBhZ2FpbnN0IGVhY2ggb3RoZXJcbiAgICAgIC8vIGV4aXN0ZWQgb25seSB0byBmbG9hdCB0aGUgY3VycmVudCBxdWFydGVyIHRvIHRoZSB0b3Agb2YgYW4gdW5zY29wZWRcbiAgICAgIC8vIGxpc3QsIGFuZCBpcyBwcm92YWJseSBpbmVydCBub3cgdGhhdCB0aGUgbGlzdCBob2xkcyBvbmUgcXVhcnRlci5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgdGllYnJlYWtlciBpcyBOT1QgYGF0dGFpbm1lbnRfcGN0IGRlc2NgLCB3aGljaCBpcyBhIEZPUk1VTEEgXHUyMDE0IHRoZVxuICAgICAgLy8gZW5naW5lIGNvbXB1dGVzIGl0IGluIEpTIGFmdGVyIHRoZSBxdWVyeSwgc28gdGhlIGRhdGEgZW5naW5lIG5ldmVyIHNhd1xuICAgICAgLy8gdGhhdCBzb3J0IGtleSBhbmQgdGhlIG9yZGVyaW5nIHdpdGhpbiBhIHF1YXJ0ZXIgd2FzIGFyYml0cmFyeSAoc2FtZVxuICAgICAgLy8gY2xhc3Mgb2YgZGVmZWN0IGFzICM0ODkncyBgZGF5c19pbl9zdGFnZWAgZmlsdGVyKS4gYGNsb3NlZF9hbW91bnRgIGlzXG4gICAgICAvLyB0aGUgc3RvcmVkIG51bWVyYXRvciBiZWhpbmQgYXR0YWlubWVudCBhbmQgcmFua3MgdGhlIHNhbWUgZGlyZWN0aW9uLlxuICAgICAgc29ydDogW1xuICAgICAgICB7IGZpZWxkOiAnY2xvc2VkX2Ftb3VudCcsIG9yZGVyOiAnZGVzYycgfSxcbiAgICAgIF0sXG4gICAgICAvLyBFbXB0eSBpcyB0aGUgaG9uZXN0IHN0YXRlLCBhbmQgaXQgbmVlZHMgdG8gc2F5IHNvLiBUaGUgc2VlZHMgc2hpcCBub1xuICAgICAgLy8gY3VycmVudC1xdWFydGVyIHJvdyBvbiBwdXJwb3NlICgjNzAyIFx1MjAxNCB0aGUgc3dlZXAgb3ducyB0aGF0IHdpbmRvdywgYW5kXG4gICAgICAvLyB0d28gcHJvZHVjZXJzIGluIG9uZSB3aW5kb3cgaXMgd2hhdCBsZWZ0IGEgcGhhbnRvbSBvd25lcmxlc3NcbiAgICAgIC8vIGR1cGxpY2F0ZSksIHNvIG9uIGEgZnJlc2ggaW5zdGFsbCB0aGlzIHZpZXcgaXMgZW1wdHkgdW50aWwgdGhlIDAzOjAwXG4gICAgICAvLyBgZm9yZWNhc3Rfc25hcHNob3RgIHN3ZWVwIGhhcyBydW4gb25jZS4gVGhhdCBpcyB0aGUgc2FtZSB0cmFkZSB0aGVcbiAgICAgIC8vIHF1b3RhLWF0dGFpbm1lbnQgd2lkZ2V0IGFscmVhZHkgdGFrZXM7IHdpdGhvdXQgdGhpcyBjb3B5IHRoZSB1c2VyXG4gICAgICAvLyBjYW5ub3QgdGVsbCBpdCBhcGFydCBmcm9tIGEgYnJva2VuIHZpZXcuXG4gICAgICBlbXB0eVN0YXRlOiB7XG4gICAgICAgIHRpdGxlOiAnVGhpcyBRdWFydGVyIEhhcyBObyBTbmFwc2hvdHMgWWV0JyxcbiAgICAgICAgbWVzc2FnZTogJ1F1YXJ0ZXJseSBzbmFwc2hvdHMgYXJlIHdyaXR0ZW4gYnkgdGhlIG5pZ2h0bHkgZm9yZWNhc3Qgc3dlZXAuIFVudGlsIGl0IGhhcyBydW4gb25jZSBmb3IgdGhlIGN1cnJlbnQgcXVhcnRlciB0aGlzIHZpZXcgaXMgZW1wdHkgXHUyMDE0IHNldHRsZWQgcXVhcnRlcnMgYXJlIG9uIHRoZSBBbGwgdGFiLicsXG4gICAgICAgIGljb246ICdjYWxlbmRhcicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbXlfZm9yZWNhc3Q6IHtcbiAgICAgIG5hbWU6ICdteV9mb3JlY2FzdCcsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICBsYWJlbDogJ015IEZvcmVjYXN0JyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fZm9yZWNhc3QnIH0sXG4gICAgICBjb2x1bW5zOiBbJ3BlcmlvZF9sYWJlbCcsICdzbmFwc2hvdF9kYXRlJywgJ3F1b3RhJywgJ2Nsb3NlZF9hbW91bnQnLCAnY29tbWl0X2Ftb3VudCcsICdwaXBlbGluZV9hbW91bnQnLCAnYXR0YWlubWVudF9wY3QnXSxcbiAgICAgIC8vIGB7Y3VycmVudF91c2VyX2lkfWAgaXMgdGhlIG9ubHkgdXNlciB0b2tlbiB0aGUgdmlldyBydW50aW1lIHJlc29sdmVzXG4gICAgICAvLyAoYHtjdXJyZW50X3VzZXJ9YCBzaWxlbnRseSBuZXZlciBtYXRjaGVzKS5cbiAgICAgIGZpbHRlcjogW3sgZmllbGQ6ICdvd25lcl9pZCcsIG9wZXJhdG9yOiAnZXF1YWxzJywgdmFsdWU6ICd7Y3VycmVudF91c2VyX2lkfScgfV0sXG4gICAgICBzb3J0OiBbeyBmaWVsZDogJ3BlcmlvZF9zdGFydCcsIG9yZGVyOiAnZGVzYycgfV0sXG4gICAgfSxcbiAgfSxcblxuICBmb3JtOiB7XG4gICAgdHlwZTogJ3NpbXBsZScsXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NuYXBzaG90JyxcbiAgICAgICAgbGFiZWw6ICdTbmFwc2hvdCcsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydvd25lcl9pZCcsICdwZXJpb2QnLCAncGVyaW9kX3N0YXJ0JywgJ3BlcmlvZF9lbmQnLCAncGVyaW9kX2xhYmVsJywgJ3NuYXBzaG90X2RhdGUnLCAnc291cmNlJ10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnYW1vdW50cycsXG4gICAgICAgIGxhYmVsOiAnQW1vdW50cycsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydxdW90YScsICdjbG9zZWRfYW1vdW50JywgJ2NvbW1pdF9hbW91bnQnLCAnYmVzdF9jYXNlX2Ftb3VudCcsICdwaXBlbGluZV9hbW91bnQnLCAnZXhwZWN0ZWRfYW1vdW50JywgJ2F0dGFpbm1lbnRfcGN0JywgJ2NvdmVyYWdlX3JhdGlvJ10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnbm90ZXMnLFxuICAgICAgICBsYWJlbDogJ05vdGVzJyxcbiAgICAgICAgY29sdW1uczogMSxcbiAgICAgICAgZmllbGRzOiBbJ25vdGVzJ10sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvdmlld3MvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS92aWV3c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL3ZpZXdzL2luZGV4LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFJldmVudWUgdmlld3MgYmFycmVsLlxuICpcbiAqIFRoZSBkb2N0cmluZSBmb3IgdGhpcyBtZXRhZGF0YSB0eXBlIGlzIHdyaXR0ZW4gb25jZSwgaW5cbiAqIGBzcmMvc2FsZXMvdmlld3MvaW5kZXgudHNgOyB0aGlzIGZpbGUgaXMgdGhlIHJldmVudWUgcGFja2FnZSdzIGhhbGYgb2ZcbiAqIHRoZSBzYW1lIGZpbGUtYnktZmlsZSByZWdpc3RyYXRpb24uXG4gKi9cblxuZXhwb3J0IHsgQ29udHJhY3RWaWV3cyB9IGZyb20gJy4vY29udHJhY3Qudmlldyc7XG5leHBvcnQgeyBQcm9kdWN0Vmlld3MgfSBmcm9tICcuL3Byb2R1Y3Qudmlldyc7XG5leHBvcnQgeyBRdW90ZVZpZXdzIH0gZnJvbSAnLi9xdW90ZS52aWV3JztcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvdmlld3MvY29udHJhY3Qudmlldy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL3ZpZXdzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvdmlld3MvY29udHJhY3Qudmlldy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBDb250cmFjdCBWaWV3c1xuICpcbiAqICAgXHUyMDIyIGdyaWQgICAgIFx1MjAxNCBjb250cmFjdCByZWdpc3RlciB3aXRoIHJlbmV3YWwgaW5mb1xuICogICBcdTIwMjIgY2FsZW5kYXIgXHUyMDE0IHN0YXJ0L2VuZCBkYXRlc1xuICogICBcdTIwMjIgZ2FudHQgICAgXHUyMDE0IGNvbnRyYWN0IHRlcm1zIHRpbWVsaW5lXG4gKiAgIFx1MjAyMiB0aW1lbGluZSBcdTIwMTQgY2hyb25vbG9naWNhbCBjb250cmFjdCBzdHJlYW1cbiAqL1xuZXhwb3J0IGNvbnN0IENvbnRyYWN0Vmlld3MgPSBkZWZpbmVWaWV3KHtcbiAgbGlzdDoge1xuICAgIHR5cGU6ICdncmlkJyxcbiAgICBuYW1lOiAnYWxsX2NvbnRyYWN0cycsXG4gICAgbGFiZWw6ICdBbGwgQ29udHJhY3RzJyxcbiAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9jb250cmFjdCcgfSxcbiAgICBjb2x1bW5zOiBbXG4gICAgICB7IGZpZWxkOiAnY29udHJhY3RfbnVtYmVyJywgd2lkdGg6IDE1MCwgbGluazogdHJ1ZSwgcGlubmVkOiAnbGVmdCcgfSxcbiAgICAgIHsgZmllbGQ6ICdjcm1fYWNjb3VudCcsIHdpZHRoOiAyMDAgfSxcbiAgICAgIHsgZmllbGQ6ICdjcm1fb3Bwb3J0dW5pdHknLCB3aWR0aDogMjAwIH0sXG4gICAgICB7IGZpZWxkOiAnc3RhdHVzJywgd2lkdGg6IDEzMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdjb250cmFjdF92YWx1ZScsIHdpZHRoOiAxNDAsIGFsaWduOiAncmlnaHQnLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgeyBmaWVsZDogJ2NvbnRyYWN0X3Rlcm1fbW9udGhzJywgd2lkdGg6IDEzMCwgYWxpZ246ICdyaWdodCcgfSxcbiAgICAgIHsgZmllbGQ6ICdzdGFydF9kYXRlJywgd2lkdGg6IDEzMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdlbmRfZGF0ZScsIHdpZHRoOiAxMzAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAnYXV0b19yZW5ld2FsJywgd2lkdGg6IDExMCwgYWxpZ246ICdjZW50ZXInIH0sXG4gICAgICB7IGZpZWxkOiAnb3duZXJfaWQnLCB3aWR0aDogMTUwIH0sXG4gICAgXSxcbiAgICBzb3J0OiBbeyBmaWVsZDogJ2VuZF9kYXRlJywgb3JkZXI6ICdhc2MnIH1dLFxuICAgIHBhZ2luYXRpb246IHsgcGFnZVNpemU6IDI1IH0sXG4gICAgc2VsZWN0aW9uOiB7IHR5cGU6ICdtdWx0aXBsZScgfSxcbiAgICBhcHBlYXJhbmNlOiB7XG4gICAgICBhbGxvd2VkVmlzdWFsaXphdGlvbnM6IFsnZ3JpZCcsICdjYWxlbmRhcicsICdnYW50dCcsICd0aW1lbGluZSddLFxuICAgIH0sXG4gICAgLy8gQmluZHMgdGhlICdjYWxlbmRhcicgZW50cnkgYWJvdmU6IHJlbmV3YWwgZGF0ZXMsIHNhbWUgYXMgdGhlIGRlZGljYXRlZFxuICAgIC8vIGByZW5ld2FsX2NhbGVuZGFyYCB2aWV3IGFuZCB0aGUgZmllbGQgdGhpcyBsaXN0IHNvcnRzIGJ5LiBBIGNvbnRyYWN0XG4gICAgLy8gY2FsZW5kYXIgYW5zd2VycyBcIndoYXQgcmVuZXdzIHdoZW5cIiBcdTIwMTQgdGhlIHN0YXJ0IC0+IGVuZCB0ZXJtIFNQQU4gaXNcbiAgICAvLyBhbHJlYWR5IGNhcnJpZWQgYnkgYGNvbnRyYWN0X2dhbnR0YCBhbmQgYGNvbnRyYWN0X3RpbWVsaW5lYCwgd2hpY2ggaXNcbiAgICAvLyB3aHkgYGVuZF9kYXRlYCBpcyB0aGUgc3RhcnQgb2YgdGhlIGV2ZW50IGhlcmUgcmF0aGVyIHRoYW4gYW4gZW5kLlxuICAgIGNhbGVuZGFyOiB7XG4gICAgICBzdGFydERhdGVGaWVsZDogJ2VuZF9kYXRlJyxcbiAgICAgIHRpdGxlRmllbGQ6ICdjb250cmFjdF9udW1iZXInLFxuICAgICAgY29sb3JGaWVsZDogJ3N0YXR1cycsXG4gICAgfSxcbiAgfSxcblxuICBsaXN0Vmlld3M6IHtcbiAgICAvKiogUmVuZXdhbCBjYWxlbmRhciAoaGlnaGxpZ2h0cyB1cGNvbWluZyBlbmQgZGF0ZXMpICovXG4gICAgcmVuZXdhbF9jYWxlbmRhcjoge1xuICAgICAgbmFtZTogJ3JlbmV3YWxfY2FsZW5kYXInLFxuICAgICAgdHlwZTogJ2NhbGVuZGFyJyxcbiAgICAgIGxhYmVsOiAnUmVuZXdhbCBDYWxlbmRhcicsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2NvbnRyYWN0JyB9LFxuICAgICAgY29sdW1uczogWydjb250cmFjdF9udW1iZXInLCAnY3JtX2FjY291bnQnLCAnc3RhdHVzJ10sXG4gICAgICBjYWxlbmRhcjoge1xuICAgICAgICBzdGFydERhdGVGaWVsZDogJ2VuZF9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ2NvbnRyYWN0X251bWJlcicsXG4gICAgICAgIGNvbG9yRmllbGQ6ICdzdGF0dXMnLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLyoqIENvbnRyYWN0IHRlcm1zIGdhbnR0ICovXG4gICAgY29udHJhY3RfZ2FudHQ6IHtcbiAgICAgIG5hbWU6ICdjb250cmFjdF9nYW50dCcsXG4gICAgICB0eXBlOiAnZ2FudHQnLFxuICAgICAgbGFiZWw6ICdDb250cmFjdCBUZXJtcycsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2NvbnRyYWN0JyB9LFxuICAgICAgY29sdW1uczogWydjb250cmFjdF9udW1iZXInLCAnY3JtX2FjY291bnQnLCAnY29udHJhY3RfdmFsdWUnXSxcbiAgICAgIGdhbnR0OiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnc3RhcnRfZGF0ZScsXG4gICAgICAgIGVuZERhdGVGaWVsZDogJ2VuZF9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ2NvbnRyYWN0X251bWJlcicsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvKiogQ2hyb25vbG9naWNhbCB0aW1lbGluZSAqL1xuICAgIGNvbnRyYWN0X3RpbWVsaW5lOiB7XG4gICAgICBuYW1lOiAnY29udHJhY3RfdGltZWxpbmUnLFxuICAgICAgdHlwZTogJ3RpbWVsaW5lJyxcbiAgICAgIGxhYmVsOiAnQ29udHJhY3QgVGltZWxpbmUnLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9jb250cmFjdCcgfSxcbiAgICAgIGNvbHVtbnM6IFsnY29udHJhY3RfbnVtYmVyJywgJ2NybV9hY2NvdW50J10sXG4gICAgICB0aW1lbGluZToge1xuICAgICAgICBzdGFydERhdGVGaWVsZDogJ3N0YXJ0X2RhdGUnLFxuICAgICAgICBlbmREYXRlRmllbGQ6ICdlbmRfZGF0ZScsXG4gICAgICAgIHRpdGxlRmllbGQ6ICdjb250cmFjdF9udW1iZXInLFxuICAgICAgICBncm91cEJ5RmllbGQ6ICdjcm1fYWNjb3VudCcsXG4gICAgICAgIGNvbG9yRmllbGQ6ICdzdGF0dXMnLFxuICAgICAgICBzY2FsZTogJ3F1YXJ0ZXInLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuXG4gIGZvcm06IHtcbiAgICB0eXBlOiAndGFiYmVkJyxcbiAgICBzZWN0aW9uczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAncGFydGllcycsXG4gICAgICAgIGxhYmVsOiAnUGFydGllcycsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydjb250cmFjdF9udW1iZXInLCAnY3JtX2FjY291bnQnLCAnY3JtX2NvbnRhY3QnLCAnY3JtX29wcG9ydHVuaXR5JywgJ293bmVyX2lkJywgJ3N0YXR1cyddLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gTmFtZWQgYGNvbnRyYWN0X3Rlcm1zYCwgbm90IGB0ZXJtc2AgXHUyMDE0IGB0ZXJtc2AgaXMgYWxyZWFkeSBhIGRpc3RpbmN0XG4gICAgICAgIC8vIGZpZWxkR3JvdXAga2V5IG9uIGBjcm1fY29udHJhY3RgIChcIlRlcm1zICYgRGF0ZXNcIiksIGFuZCByZXVzaW5nIGl0XG4gICAgICAgIC8vIGhlcmUgd291bGQgbWFrZSB0aGlzIHNlY3Rpb24ncyB0cmFuc2xhdGVkIGhlYWRpbmcgZm9sbG93IHRoYXRcbiAgICAgICAgLy8gZ3JvdXAncyB3b3JkaW5nIGluc3RlYWQgb2YgaXRzIG93biBcIlRlcm1zXCIuXG4gICAgICAgIG5hbWU6ICdjb250cmFjdF90ZXJtcycsXG4gICAgICAgIGxhYmVsOiAnVGVybXMnLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAnY29udHJhY3RfdGVybV9tb250aHMnLFxuICAgICAgICAgICdzdGFydF9kYXRlJyxcbiAgICAgICAgICAnZW5kX2RhdGUnLFxuICAgICAgICAgICdjb250cmFjdF92YWx1ZScsXG4gICAgICAgICAgJ2JpbGxpbmdfZnJlcXVlbmN5JyxcbiAgICAgICAgICAncGF5bWVudF90ZXJtcycsXG4gICAgICAgICAgJ2F1dG9fcmVuZXdhbCcsXG4gICAgICAgICAgJ3JlbmV3YWxfbm90aWNlX2RheXMnLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NpZ25pbmdfYW5kX2RvY3VtZW50cycsXG4gICAgICAgIGxhYmVsOiAnU2lnbmluZyAmIERvY3VtZW50cycsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydzaWduZWRfZGF0ZScsICdzaWduZWRfYnknLCAnZG9jdW1lbnRfdXJsJ10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBUaGUgY29udHJhY3QncyB0d28gbWFya2Rvd24gYm9kaWVzLCB0b2dldGhlciBhbmQgaW4gdGhlIG9yZGVyIGFcbiAgICAgICAgLy8gcmVhZGVyIG5lZWRzIHRoZW0gXHUyMDE0IHRoZSBxdWVzdGlvbiAjMTgyNiBhc2tlZCB0aGlzIGZvcm0gdG8gYW5zd2VyLlxuICAgICAgICAvLyBUaGV5IGFyZSBub3QgcmVkdW5kYW50LCBhbmQgYGNvbnRlbnQvZG9jcy9yZXZlbnVlL2NvbnRyYWN0cy5tZHhgXG4gICAgICAgIC8vIGFscmVhZHkgcnVsZXMgd2hpY2ggaXMgd2hpY2g6ICoqRGVzY3JpcHRpb24qKiBpcyB0aGUgcGxhaW4gc3VtbWFyeVxuICAgICAgICAvLyBvZiB3aGF0IHRoaXMgY29udHJhY3QgaXMgKGRlY2xhcmVkIG9uIHRoZSBgYmFzaWNgIGdyb3VwLCBsaXN0ZWRcbiAgICAgICAgLy8gdGhlcmUgdW5kZXIgXCJDb250cmFjdCBJbmZvcm1hdGlvblwiKSwgd2hpbGUgKipTcGVjaWFsIFRlcm1zKiogaXNcbiAgICAgICAgLy8gd2hlcmUgZXZlcnkgZnJlZS10ZXh0IFRFUk0gZ29lcyBcdTIwMTQgdGhlIGRvYyBzZW5kcyByZW5ld2FsXG4gICAgICAgIC8vIGluc3RydWN0aW9ucywgYW4gdW5saXN0ZWQgYmlsbGluZyBjYWRlbmNlIGFuZCBhbiB1bmxpc3RlZCBwYXltZW50XG4gICAgICAgIC8vIGFycmFuZ2VtZW50IHRvIFNwZWNpYWwgVGVybXMgYnkgbmFtZSwgdGhyZWUgc2VwYXJhdGUgdGltZXMuXG4gICAgICAgIC8vIERlc2NyaXB0aW9uIHdhcyB0aGUgb25lIGZpZWxkIGluIHRoYXQgaW52ZW50b3J5IG5vIGZvcm0gb2ZmZXJlZCwgc29cbiAgICAgICAgLy8gdGhlIHN1bW1hcnkgYSByZWFkZXIgd2FzIHRvbGQgdGhlIHJlY29yZCBjYXJyaWVzIGNvdWxkIG5vdCBiZVxuICAgICAgICAvLyB3cml0dGVuLiBPbmUgY29sdW1uLCBiZWNhdXNlIGJvdGggYXJlIGxvbmctZm9ybS5cbiAgICAgICAgbmFtZTogJ25vdGVzJyxcbiAgICAgICAgbGFiZWw6ICdOb3RlcycsXG4gICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgIGZpZWxkczogWydkZXNjcmlwdGlvbicsICdzcGVjaWFsX3Rlcm1zJywgJ2JpbGxpbmdfYWRkcmVzcyddLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL3ZpZXdzL3Byb2R1Y3Qudmlldy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL3ZpZXdzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvdmlld3MvcHJvZHVjdC52aWV3LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBkZWZpbmVWaWV3IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKipcbiAqIFByb2R1Y3QgVmlld3NcbiAqXG4gKiAgIFx1MjAyMiBncmlkICAgIFx1MjAxNCBjYXRhbG9nIGxpc3RpbmdcbiAqICAgXHUyMDIyIGdhbGxlcnkgXHUyMDE0IHZpc3VhbCBwcm9kdWN0IGNhdGFsb2cgKGBpbWFnZWAgYXMgY292ZXIpXG4gKlxuICogVGhlIGBsb3dfc3RvY2tgIHZpZXcgd2FzIHJlbW92ZWQgd2l0aCB0aGUgaW52ZW50b3J5IGZpZWxkcyBpdCB3YXMgYnVpbHQgb246XG4gKiBpdHMgY29sdW1ucywgaXRzIGZpbHRlciBhbmQgaXRzIHNvcnQga2V5IHdlcmUgYWxsIGBxdWFudGl0eV9vbl9oYW5kYCAvXG4gKiBgcmVvcmRlcl9wb2ludGAsIHNvIGl0IGNvdWxkIG5vdCBvdXRsaXZlIHRoZW0uIEl0IHdhcyBuZXZlciB0aGUgc3RvY2sgcmVwb3J0XG4gKiBpdCBsb29rZWQgbGlrZSBlaXRoZXIgXHUyMDE0IHRoZSBmaWx0ZXIgY29tcGFyZWQgYWdhaW5zdCBhIGhhcmRjb2RlZCAxMCByYXRoZXJcbiAqIHRoYW4gZWFjaCBwcm9kdWN0J3Mgb3duIHJlb3JkZXIgcG9pbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBQcm9kdWN0Vmlld3MgPSBkZWZpbmVWaWV3KHtcbiAgbGlzdDoge1xuICAgIHR5cGU6ICdncmlkJyxcbiAgICBuYW1lOiAnYWxsX3Byb2R1Y3RzJyxcbiAgICBsYWJlbDogJ0FsbCBQcm9kdWN0cycsXG4gICAgdXNlckFjdGlvbnM6IHsgZWRpdElubGluZTogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fcHJvZHVjdCcgfSxcbiAgICBjb2x1bW5zOiBbXG4gICAgICB7IGZpZWxkOiAncHJvZHVjdF9jb2RlJywgd2lkdGg6IDE0MCwgbGluazogdHJ1ZSwgcGlubmVkOiAnbGVmdCcgfSxcbiAgICAgIHsgZmllbGQ6ICduYW1lJywgd2lkdGg6IDI0MCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdjYXRlZ29yeScsIHdpZHRoOiAxNDAgfSxcbiAgICAgIHsgZmllbGQ6ICdmYW1pbHknLCB3aWR0aDogMTQwIH0sXG4gICAgICB7IGZpZWxkOiAnc2t1Jywgd2lkdGg6IDE0MCB9LFxuICAgICAgeyBmaWVsZDogJ2xpc3RfcHJpY2UnLCB3aWR0aDogMTMwLCBhbGlnbjogJ3JpZ2h0Jywgc3VtbWFyeTogJ2F2ZycgfSxcbiAgICAgIHsgZmllbGQ6ICdjb3N0Jywgd2lkdGg6IDEzMCwgYWxpZ246ICdyaWdodCcgfSxcbiAgICAgIHsgZmllbGQ6ICdpc19hY3RpdmUnLCB3aWR0aDogMTAwLCBhbGlnbjogJ2NlbnRlcicgfSxcbiAgICBdLFxuICAgIHNvcnQ6IFt7IGZpZWxkOiAnbmFtZScsIG9yZGVyOiAnYXNjJyB9XSxcbiAgICBncm91cGluZzogeyBmaWVsZHM6IFt7IGZpZWxkOiAnY2F0ZWdvcnknLCBvcmRlcjogJ2FzYycgfV0gfSxcbiAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiA1MCB9LFxuICAgIHNlbGVjdGlvbjogeyB0eXBlOiAnbXVsdGlwbGUnIH0sXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnLCAnZ2FsbGVyeSddLFxuICAgIH0sXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgLyoqIFZpc3VhbCBjYXRhbG9nICovXG4gICAgcHJvZHVjdF9jYXRhbG9nOiB7XG4gICAgICBuYW1lOiAncHJvZHVjdF9jYXRhbG9nJyxcbiAgICAgIHR5cGU6ICdnYWxsZXJ5JyxcbiAgICAgIGxhYmVsOiAnUHJvZHVjdCBDYXRhbG9nJyxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fcHJvZHVjdCcgfSxcbiAgICAgIGNvbHVtbnM6IFsnbmFtZScsICdjYXRlZ29yeScsICdsaXN0X3ByaWNlJ10sXG4gICAgICBnYWxsZXJ5OiB7XG4gICAgICAgIGNvdmVyRmllbGQ6ICdpbWFnZScsXG4gICAgICAgIGNvdmVyRml0OiAnY292ZXInLFxuICAgICAgICBjYXJkU2l6ZTogJ21lZGl1bScsXG4gICAgICAgIHRpdGxlRmllbGQ6ICduYW1lJyxcbiAgICAgICAgdmlzaWJsZUZpZWxkczogWydwcm9kdWN0X2NvZGUnLCAnY2F0ZWdvcnknLCAnZmFtaWx5JywgJ2xpc3RfcHJpY2UnLCAnc2t1J10sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG5cbiAgZm9ybToge1xuICAgIHR5cGU6ICdzaW1wbGUnLFxuICAgIHNlY3Rpb25zOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcm9kdWN0X2luZm8nLFxuICAgICAgICBsYWJlbDogJ1Byb2R1Y3QgSW5mbycsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICdwcm9kdWN0X2NvZGUnLFxuICAgICAgICAgIHsgZmllbGQ6ICduYW1lJywgcmVxdWlyZWQ6IHRydWUsIHNwYW46ICdmdWxsJyB9LFxuICAgICAgICAgICdjYXRlZ29yeScsXG4gICAgICAgICAgJ2ZhbWlseScsXG4gICAgICAgICAgJ3NrdScsXG4gICAgICAgICAgJ3Byb2R1Y3RfbWFuYWdlcicsXG4gICAgICAgICAgJ2lzX2FjdGl2ZScsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncHJpY2luZ19pbmZvJyxcbiAgICAgICAgbGFiZWw6ICdQcmljaW5nJyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbJ2xpc3RfcHJpY2UnLCAnY29zdCddLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ21lZGlhJyxcbiAgICAgICAgbGFiZWw6ICdNZWRpYScsXG4gICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgIGZpZWxkczogWydpbWFnZScsICdkYXRhc2hlZXQnLCAnZGVzY3JpcHRpb24nXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS92aWV3cy9xdW90ZS52aWV3LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvdmlld3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS92aWV3cy9xdW90ZS52aWV3LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBkZWZpbmVWaWV3IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKipcbiAqIFF1b3RlIFZpZXdzXG4gKlxuICogICBcdTIwMjIgZ3JpZCAgICAgXHUyMDE0IHF1b3RlIHJlZ2lzdGVyIHdpdGggdG90YWxzXG4gKiAgIFx1MjAyMiBrYW5iYW4gICBcdTIwMTQgcXVvdGUgd29ya2Zsb3cgZ3JvdXBlZCBieSBzdGF0dXNcbiAqICAgXHUyMDIyIGNhbGVuZGFyIFx1MjAxNCBxdW90ZS1kYXRlIGNhbGVuZGFyXG4gKi9cbmV4cG9ydCBjb25zdCBRdW90ZVZpZXdzID0gZGVmaW5lVmlldyh7XG4gIGxpc3Q6IHtcbiAgICB0eXBlOiAnZ3JpZCcsXG4gICAgbmFtZTogJ2FsbF9xdW90ZXMnLFxuICAgIGxhYmVsOiAnQWxsIFF1b3RlcycsXG4gICAgdXNlckFjdGlvbnM6IHsgZWRpdElubGluZTogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fcXVvdGUnIH0sXG4gICAgY29sdW1uczogW1xuICAgICAgeyBmaWVsZDogJ3F1b3RlX251bWJlcicsIHdpZHRoOiAxNDAsIGxpbms6IHRydWUsIHBpbm5lZDogJ2xlZnQnIH0sXG4gICAgICB7IGZpZWxkOiAnY3JtX2FjY291bnQnLCB3aWR0aDogMjAwIH0sXG4gICAgICB7IGZpZWxkOiAnY3JtX29wcG9ydHVuaXR5Jywgd2lkdGg6IDIwMCB9LFxuICAgICAgeyBmaWVsZDogJ3N0YXR1cycsIHdpZHRoOiAxMzAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAncXVvdGVfZGF0ZScsIHdpZHRoOiAxMzAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAnZXhwaXJhdGlvbl9kYXRlJywgd2lkdGg6IDE0MCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdzdWJ0b3RhbCcsIHdpZHRoOiAxMzAsIGFsaWduOiAncmlnaHQnLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgeyBmaWVsZDogJ2Rpc2NvdW50Jywgd2lkdGg6IDExMCwgYWxpZ246ICdyaWdodCcgfSxcbiAgICAgIHsgZmllbGQ6ICd0YXgnLCB3aWR0aDogMTEwLCBhbGlnbjogJ3JpZ2h0Jywgc3VtbWFyeTogJ3N1bScgfSxcbiAgICAgIHsgZmllbGQ6ICd0b3RhbF9wcmljZScsIHdpZHRoOiAxNDAsIGFsaWduOiAncmlnaHQnLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgeyBmaWVsZDogJ293bmVyX2lkJywgd2lkdGg6IDE1MCB9LFxuICAgIF0sXG4gICAgc29ydDogW3sgZmllbGQ6ICdxdW90ZV9kYXRlJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiAyNSB9LFxuICAgIHNlbGVjdGlvbjogeyB0eXBlOiAnbXVsdGlwbGUnIH0sXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnLCAna2FuYmFuJywgJ2NhbGVuZGFyJ10sXG4gICAgfSxcbiAgICAvLyBCaW5kcyB0aGUgJ2NhbGVuZGFyJyBlbnRyeSBhYm92ZTogdGhlIHNhbWUgc3BhbiB0aGUgZGVkaWNhdGVkXG4gICAgLy8gYHF1b3RlX2NhbGVuZGFyYCB2aWV3IHNob3dzLiBgcXVvdGVfZGF0ZWAgYW5kIGBleHBpcmF0aW9uX2RhdGVgIGFyZSBib3RoXG4gICAgLy8gcmVxdWlyZWQgKyBub3ROdWxsIG9uIGNybV9xdW90ZSwgc28gZXZlcnkgcXVvdGUgbGFuZHMgb24gYSByZWFsIHdpbmRvdy5cbiAgICBjYWxlbmRhcjoge1xuICAgICAgc3RhcnREYXRlRmllbGQ6ICdxdW90ZV9kYXRlJyxcbiAgICAgIGVuZERhdGVGaWVsZDogJ2V4cGlyYXRpb25fZGF0ZScsXG4gICAgICB0aXRsZUZpZWxkOiAncXVvdGVfbnVtYmVyJyxcbiAgICAgIGNvbG9yRmllbGQ6ICdzdGF0dXMnLFxuICAgIH0sXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgLyoqIFF1b3RlIHdvcmtmbG93IGJvYXJkICovXG4gICAgcXVvdGVfcGlwZWxpbmU6IHtcbiAgICAgIG5hbWU6ICdxdW90ZV9waXBlbGluZScsXG4gICAgICB0eXBlOiAna2FuYmFuJyxcbiAgICAgIGxhYmVsOiAnUXVvdGUgUGlwZWxpbmUnLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9xdW90ZScgfSxcbiAgICAgIGNvbHVtbnM6IFsncXVvdGVfbnVtYmVyJywgJ2NybV9hY2NvdW50JywgJ3RvdGFsX3ByaWNlJywgJ2V4cGlyYXRpb25fZGF0ZSddLFxuICAgICAga2FuYmFuOiB7XG4gICAgICAgIGdyb3VwQnlGaWVsZDogJ3N0YXR1cycsXG4gICAgICAgIHN1bW1hcml6ZUZpZWxkOiAndG90YWxfcHJpY2UnLFxuICAgICAgICBjb2x1bW5zOiBbJ3F1b3RlX251bWJlcicsICdjcm1fYWNjb3VudCcsICd0b3RhbF9wcmljZScsICdleHBpcmF0aW9uX2RhdGUnXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKiBRdW90ZS1kYXRlIGNhbGVuZGFyICovXG4gICAgcXVvdGVfY2FsZW5kYXI6IHtcbiAgICAgIG5hbWU6ICdxdW90ZV9jYWxlbmRhcicsXG4gICAgICB0eXBlOiAnY2FsZW5kYXInLFxuICAgICAgbGFiZWw6ICdRdW90ZSBDYWxlbmRhcicsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX3F1b3RlJyB9LFxuICAgICAgY29sdW1uczogWydxdW90ZV9udW1iZXInLCAnY3JtX2FjY291bnQnLCAndG90YWxfcHJpY2UnXSxcbiAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAncXVvdGVfZGF0ZScsXG4gICAgICAgIGVuZERhdGVGaWVsZDogJ2V4cGlyYXRpb25fZGF0ZScsXG4gICAgICAgIHRpdGxlRmllbGQ6ICdxdW90ZV9udW1iZXInLFxuICAgICAgICBjb2xvckZpZWxkOiAnc3RhdHVzJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcblxuICBmb3JtOiB7XG4gICAgdHlwZTogJ3RhYmJlZCcsXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3F1b3RlJyxcbiAgICAgICAgbGFiZWw6ICdRdW90ZScsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIC8vIGBuYW1lYCBpcyByZXF1aXJlZCBvbiBjcm1fcXVvdGUgd2l0aCBubyBkZWZhdWx0IFx1MjAxNCBvbWl0dGluZyBpdCBtYWRlXG4gICAgICAgIC8vIHF1b3RlIGNyZWF0aW9uIHRocm91Z2ggdGhpcyBmb3JtIGltcG9zc2libGUuXG4gICAgICAgIGZpZWxkczogW3sgZmllbGQ6ICduYW1lJywgcmVxdWlyZWQ6IHRydWUsIHNwYW46ICdmdWxsJyB9LCAncXVvdGVfbnVtYmVyJywgJ2NybV9hY2NvdW50JywgJ2NybV9jb250YWN0JywgJ2NybV9vcHBvcnR1bml0eScsICdvd25lcl9pZCcsICdzdGF0dXMnLCAncXVvdGVfZGF0ZScsICdleHBpcmF0aW9uX2RhdGUnXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd0b3RhbHMnLFxuICAgICAgICBsYWJlbDogJ1RvdGFscycsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydzdWJ0b3RhbCcsICdkaXNjb3VudCcsICdkaXNjb3VudF9hbW91bnQnLCAndGF4JywgJ3NoaXBwaW5nX2hhbmRsaW5nJywgJ3RvdGFsX3ByaWNlJ10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBOYW1lZCBgcXVvdGVfdGVybXNgLCBub3QgYHRlcm1zYCBcdTIwMTQgYHRlcm1zYCBpcyBhbHJlYWR5IGEgZGlzdGluY3RcbiAgICAgICAgLy8gZmllbGRHcm91cCBrZXkgb24gYGNybV9xdW90ZWAgKFwiVGVybXMgJiBWYWxpZGl0eVwiKSwgYW5kIHJldXNpbmcgaXRcbiAgICAgICAgLy8gaGVyZSB3b3VsZCBtYWtlIHRoaXMgc2VjdGlvbidzIHRyYW5zbGF0ZWQgaGVhZGluZyBmb2xsb3cgdGhhdFxuICAgICAgICAvLyBncm91cCdzIHdvcmRpbmcgaW5zdGVhZCBvZiBpdHMgb3duIFwiVGVybXNcIi5cbiAgICAgICAgbmFtZTogJ3F1b3RlX3Rlcm1zJyxcbiAgICAgICAgbGFiZWw6ICdUZXJtcycsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydwYXltZW50X3Rlcm1zJywgJ3NoaXBwaW5nX3Rlcm1zJ10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnYWRkcmVzc2VzX2FuZF9ub3RlcycsXG4gICAgICAgIGxhYmVsOiAnQWRkcmVzc2VzICYgTm90ZXMnLFxuICAgICAgICBjb2x1bW5zOiAxLFxuICAgICAgICBmaWVsZHM6IFsnYmlsbGluZ19hZGRyZXNzJywgJ3NoaXBwaW5nX2FkZHJlc3MnLCAnaW50ZXJuYWxfbm90ZXMnXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL3ZpZXdzL2luZGV4LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy92aWV3c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvdmlld3MvaW5kZXgudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogTWFya2V0aW5nIHZpZXdzIGJhcnJlbC5cbiAqXG4gKiBUaGUgZG9jdHJpbmUgZm9yIHRoaXMgbWV0YWRhdGEgdHlwZSBpcyB3cml0dGVuIG9uY2UsIGluXG4gKiBgc3JjL3NhbGVzL3ZpZXdzL2luZGV4LnRzYDsgdGhpcyBmaWxlIGlzIHRoZSBtYXJrZXRpbmcgcGFja2FnZSdzIGhhbGYgb2ZcbiAqIHRoZSBzYW1lIGZpbGUtYnktZmlsZSByZWdpc3RyYXRpb24uXG4gKi9cblxuZXhwb3J0IHsgQ2FtcGFpZ25WaWV3cyB9IGZyb20gJy4vY2FtcGFpZ24udmlldyc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvdmlld3MvY2FtcGFpZ24udmlldy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvdmlld3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL3ZpZXdzL2NhbXBhaWduLnZpZXcudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZVZpZXcgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogQ2FtcGFpZ24gVmlld3NcbiAqXG4gKiAgIFx1MjAyMiBncmlkICAgICBcdTIwMTQgcGVyZm9ybWFuY2UgZ3JpZCB3aXRoIGFnZ3JlZ2F0ZWQgS1BJc1xuICogICBcdTIwMjIgZ2FudHQgICAgXHUyMDE0IGNhbXBhaWduIHNjaGVkdWxlIChzdGFydF9kYXRlIFx1MjE5MiBlbmRfZGF0ZSlcbiAqICAgXHUyMDIyIGNhbGVuZGFyIFx1MjAxNCBsYXVuY2ggY2FsZW5kYXJcbiAqICAgXHUyMDIyIHRpbWVsaW5lIFx1MjAxNCBtdWx0aS1jYW1wYWlnbiBjaHJvbm9sb2dpY2FsIHZpZXdcbiAqL1xuZXhwb3J0IGNvbnN0IENhbXBhaWduVmlld3MgPSBkZWZpbmVWaWV3KHtcbiAgbGlzdDoge1xuICAgIHR5cGU6ICdncmlkJyxcbiAgICBuYW1lOiAnYWxsX2NhbXBhaWducycsXG4gICAgbGFiZWw6ICdBbGwgQ2FtcGFpZ25zJyxcbiAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9jYW1wYWlnbicgfSxcbiAgICBjb2x1bW5zOiBbXG4gICAgICB7IGZpZWxkOiAnbmFtZScsIHdpZHRoOiAyNDAsIHNvcnRhYmxlOiB0cnVlLCBsaW5rOiB0cnVlLCBwaW5uZWQ6ICdsZWZ0JyB9LFxuICAgICAgeyBmaWVsZDogJ2NoYW5uZWwnLCB3aWR0aDogMTMwIH0sXG4gICAgICB7IGZpZWxkOiAnc3RhdHVzJywgd2lkdGg6IDEzMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdzdGFydF9kYXRlJywgd2lkdGg6IDEzMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdlbmRfZGF0ZScsIHdpZHRoOiAxMzAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAnYnVkZ2V0ZWRfY29zdCcsIHdpZHRoOiAxNDAsIGFsaWduOiAncmlnaHQnLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgeyBmaWVsZDogJ2V4cGVjdGVkX3JldmVudWUnLCB3aWR0aDogMTYwLCBhbGlnbjogJ3JpZ2h0Jywgc3VtbWFyeTogJ3N1bScgfSxcbiAgICBdLFxuICAgIHNvcnQ6IFt7IGZpZWxkOiAnc3RhcnRfZGF0ZScsIG9yZGVyOiAnYXNjJyB9XSxcbiAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiAyNSB9LFxuICAgIHNlbGVjdGlvbjogeyB0eXBlOiAnbXVsdGlwbGUnIH0sXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnLCAnZ2FudHQnLCAnY2FsZW5kYXInLCAndGltZWxpbmUnXSxcbiAgICB9LFxuICAgIC8vIEJpbmRzIHRoZSAnY2FsZW5kYXInIGVudHJ5IGFib3ZlOiB0aGUgc3dpdGNoZXIgb3BlbnMgdGhlIHNhbWUgc2NoZWR1bGVcbiAgICAvLyB0aGUgZGVkaWNhdGVkIGBjYW1wYWlnbl9jYWxlbmRhcmAgdmlldyBzaG93cy4gQm90aCBkYXRlcyBhcmUgcmVxdWlyZWQgK1xuICAgIC8vIG5vdE51bGwgb24gY3JtX2NhbXBhaWduLCBzbyBldmVyeSBjYW1wYWlnbiBzcGFucyBhIHRydXRoZnVsIHJhbmdlLlxuICAgIGNhbGVuZGFyOiB7XG4gICAgICBzdGFydERhdGVGaWVsZDogJ3N0YXJ0X2RhdGUnLFxuICAgICAgZW5kRGF0ZUZpZWxkOiAnZW5kX2RhdGUnLFxuICAgICAgdGl0bGVGaWVsZDogJ25hbWUnLFxuICAgICAgY29sb3JGaWVsZDogJ2NoYW5uZWwnLFxuICAgIH0sXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgLyoqIENhbXBhaWduIHNjaGVkdWxlICovXG4gICAgY2FtcGFpZ25fZ2FudHQ6IHtcbiAgICAgIG5hbWU6ICdjYW1wYWlnbl9nYW50dCcsXG4gICAgICB0eXBlOiAnZ2FudHQnLFxuICAgICAgbGFiZWw6ICdDYW1wYWlnbiBTY2hlZHVsZScsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2NhbXBhaWduJyB9LFxuICAgICAgY29sdW1uczogWyduYW1lJywgJ2NoYW5uZWwnXSxcbiAgICAgIGdhbnR0OiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnc3RhcnRfZGF0ZScsXG4gICAgICAgIGVuZERhdGVGaWVsZDogJ2VuZF9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ25hbWUnLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLyoqIExhdW5jaCBjYWxlbmRhciAqL1xuICAgIGNhbXBhaWduX2NhbGVuZGFyOiB7XG4gICAgICBuYW1lOiAnY2FtcGFpZ25fY2FsZW5kYXInLFxuICAgICAgdHlwZTogJ2NhbGVuZGFyJyxcbiAgICAgIGxhYmVsOiAnTGF1bmNoIENhbGVuZGFyJyxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fY2FtcGFpZ24nIH0sXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnY2hhbm5lbCcsICdzdGF0dXMnXSxcbiAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnc3RhcnRfZGF0ZScsXG4gICAgICAgIGVuZERhdGVGaWVsZDogJ2VuZF9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ25hbWUnLFxuICAgICAgICBjb2xvckZpZWxkOiAnY2hhbm5lbCcsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvKiogTWFya2V0aW5nIHRpbWVsaW5lICovXG4gICAgY2FtcGFpZ25fdGltZWxpbmU6IHtcbiAgICAgIG5hbWU6ICdjYW1wYWlnbl90aW1lbGluZScsXG4gICAgICB0eXBlOiAndGltZWxpbmUnLFxuICAgICAgbGFiZWw6ICdNYXJrZXRpbmcgVGltZWxpbmUnLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9jYW1wYWlnbicgfSxcbiAgICAgIC8vIFRoZSBsaXN0IGRhdGEgc291cmNlIHByb2plY3RzIGNvbmZpZ3VyZWQgY29sdW1ucy4gS2VlcCB0aGUgZGF0ZVxuICAgICAgLy8gZmllbGRzIGluIHRoYXQgcHJvamVjdGlvbiBzbyB0aGUgdGltZWxpbmUgcmVuZGVyZXIgY2FuIGJ1Y2tldCBhbmRcbiAgICAgIC8vIG9yZGVyIGNhbXBhaWducyBmcm9tIHRoZSBzYW1lIHNjaGVkdWxlIGRhdGEgYXMgdGhlIGNhbGVuZGFyL0dhbnR0LlxuICAgICAgY29sdW1uczogWyduYW1lJywgJ2NoYW5uZWwnLCAnc3RhcnRfZGF0ZScsICdlbmRfZGF0ZSddLFxuICAgICAgdGltZWxpbmU6IHtcbiAgICAgICAgc3RhcnREYXRlRmllbGQ6ICdzdGFydF9kYXRlJyxcbiAgICAgICAgZW5kRGF0ZUZpZWxkOiAnZW5kX2RhdGUnLFxuICAgICAgICB0aXRsZUZpZWxkOiAnbmFtZScsXG4gICAgICAgIGdyb3VwQnlGaWVsZDogJ2NoYW5uZWwnLFxuICAgICAgICBjb2xvckZpZWxkOiAnc3RhdHVzJyxcbiAgICAgICAgc2NhbGU6ICdtb250aCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG5cbiAgZm9ybToge1xuICAgIHR5cGU6ICd0YWJiZWQnLFxuICAgIHNlY3Rpb25zOiBbXG4gICAgICB7XG4gICAgICAgIC8vIEV2ZXJ5IGZvcm0gc2VjdGlvbiBoZXJlIGNhcnJpZXMgYSBgbmFtZWAgbWF0Y2hpbmcgdGhlIG9iamVjdCdzXG4gICAgICAgIC8vIGZpZWxkR3JvdXAga2V5LCBzbyB0aGUgaGVhZGluZyByZXNvbHZlcyB0aHJvdWdoXG4gICAgICAgIC8vIGBvYmplY3RzLmNybV9jYW1wYWlnbi5fc2VjdGlvbnMuPG5hbWU+LmxhYmVsYCBpbiBhbGwgZm91ciBwYWNrcy4gQVxuICAgICAgICAvLyBuYW1lbGVzcyBzZWN0aW9uIGhhcyBubyBrZXkgYSBidW5kbGUgY2FuIGNhcnJ5IGFuZCByZW5kZXJzIGl0c1xuICAgICAgICAvLyBFbmdsaXNoIGxhYmVsIGluIGV2ZXJ5IGxvY2FsZSBcdTIwMTQgdGhlIHBsYXRmb3JtIHdhcm5zIGFib3V0IGV4YWN0bHkgdGhpc1xuICAgICAgICAvLyBkdXJpbmcgYG9iamVjdHN0YWNrIHZhbGlkYXRlYCwgYW5kIHRoaXMgZm9ybSB3YXMgY2FycnlpbmcgZm91ciBvZlxuICAgICAgICAvLyB0aG9zZSB3YXJuaW5ncyBiZWZvcmUgdGhlICM1OTcgcmVzdHJ1Y3R1cmUgZ2F2ZSBpdCBhIHJlYXNvbiB0byBtb3ZlLlxuICAgICAgICBuYW1lOiAnYmFzaWMnLFxuICAgICAgICBsYWJlbDogJ0NhbXBhaWduIEluZm9ybWF0aW9uJyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ25hbWUnLCByZXF1aXJlZDogdHJ1ZSwgc3BhbjogJ2Z1bGwnIH0sXG4gICAgICAgICAgJ2NhbXBhaWduX2NvZGUnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAnY2hhbm5lbCcsXG4gICAgICAgICAgeyBmaWVsZDogJ3N0YXR1cycsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgICAgJ293bmVyX2lkJyxcbiAgICAgICAgICAnaXNfYWN0aXZlJyxcbiAgICAgICAgICAnbGFuZGluZ19wYWdlX3VybCcsXG4gICAgICAgICAgLy8gVGhlIG1hcmtkb3duIGJvZHkgb2YgdGhlIGNhbXBhaWduIGJyaWVmLiBEZWNsYXJlZCBvbiB0aGUgYGJhc2ljYFxuICAgICAgICAgIC8vIGdyb3VwIGFuZCBmaWxsZWQgYnkgc2V2ZW4gb2YgdGhlIHNlZWQgY2FtcGFpZ25zLCBidXQgb21pdHRlZCBmcm9tXG4gICAgICAgICAgLy8gdGhpcyBlbnVtZXJhdGlvbiBcdTIwMTQgc28gdGhlIG9ubHkgc3VyZmFjZSB0aGF0IGNvdWxkIHNob3cgaXQgZGlkIG5vdCxcbiAgICAgICAgICAvLyBhbmQgYSBtYXJrZXRlciBjb3VsZCBuZWl0aGVyIHJlYWQgbm9yIHdyaXRlIHRoZSBicmllZiB0aGV5IHdyb3RlLlxuICAgICAgICAgIHsgZmllbGQ6ICdkZXNjcmlwdGlvbicsIHNwYW46ICdmdWxsJyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NjaGVkdWxlJyxcbiAgICAgICAgbGFiZWw6ICdTY2hlZHVsZScsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydzdGFydF9kYXRlJywgJ2VuZF9kYXRlJ10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvKipcbiAgICAgICAgICogQnVkZ2V0ICYgUk9JIFx1MjAxNCBhIFNFQ1RJT04gT0YgSVRTIE9XTiwgZGVsaWJlcmF0ZWx5ICgjNTk3KS5cbiAgICAgICAgICpcbiAgICAgICAgICogYGJ1ZGdldGVkX2Nvc3RgIGFuZCBgYWN0dWFsX2Nvc3RgIGFyZSB0aGUgb25seSB0d28gY2FtcGFpZ24gbnVtYmVyc1xuICAgICAgICAgKiB0aGF0IGFyZSBtYW51YWwtZW50cnkgYnkgZGVzaWduOiBub3RoaW5nIG9uIHRoZSBwbGF0Zm9ybSBrbm93cyB3aGF0IGFcbiAgICAgICAgICogdHJhZGUtc2hvdyBib290aCBjb3N0LiBUaGV5IHVzZWQgdG8gc2l0IHNldmVudGggYW5kIGVpZ2h0aCBpbiBhXG4gICAgICAgICAqIHNldmVuLWZpZWxkIFwiU2NoZWR1bGUgJiBCdWRnZXRcIiByb3csIGJlbG93IHRoZSBkYXRlcyBhbmQgYmVzaWRlIHR3b1xuICAgICAgICAgKiByZXZlbnVlIGZpZ3VyZXMgb25lIG9mIHdoaWNoIHRoZSBtZXRyaWMgaG9va3Mgb3duIFx1MjAxNCBzbyB0aGUgdHdvIGZpZWxkc1xuICAgICAgICAgKiBhIG1hcmtldGVyIG11c3QgdHlwZSB3ZXJlIHRoZSBsZWFzdCB2aXNpYmxlIHRoaW5ncyBvbiB0aGUgZm9ybSwgYW5kXG4gICAgICAgICAqIGBhY3R1YWxfY29zdGAgaW4gcGFydGljdWxhciB3ZW50IHVudHlwZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoYXQgaXMgbm90IGEgY29zbWV0aWMgY29tcGxhaW50OiBgcm9pYCBkaXZpZGVzIGJ5IGBhY3R1YWxfY29zdGAsIGFuZFxuICAgICAgICAgKiBpdHMgZm9ybXVsYSBhbnN3ZXJzIGEgZmxhdCBgMC4wYCBmb3IgYW55IGNhbXBhaWduIHdoZXJlIHRoYXQgZmllbGQgaXNcbiAgICAgICAgICogYmxhbmsuIEFuIGVtcHR5IGNvc3QgZmllbGQgcmVuZGVycyBhcyAwJSBST0kgb24gZXZlcnkgY2FtcGFpZ24gXHUyMDE0IHRoZVxuICAgICAgICAgKiBvbmUgbnVtYmVyIHRoZSB3aG9sZSBQZXJmb3JtYW5jZSBzZWN0aW9uIGV4aXN0cyB0byBwcm9kdWNlLCByZWFkaW5nXG4gICAgICAgICAqIGFzIGEgcmVhbCBtZWFzdXJlbWVudCByYXRoZXIgdGhhbiBhcyBtaXNzaW5nIGlucHV0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBTbyB0aGUgY29zdHMgZ2V0IHRoZWlyIG93biBoZWFkaW5nLCBhbmQgYHJvaWAgaXMgZGlzcGxheWVkIEhFUkUgd2l0aFxuICAgICAgICAgKiB0aGVtIHJhdGhlciB0aGFuIGF0IHRoZSBib3R0b20gb2YgUGVyZm9ybWFuY2UsIHdoZXJlIGl0cyBkZXBlbmRlbmN5XG4gICAgICAgICAqIG9uIHR3byBmaWVsZHMgdGhyZWUgc2VjdGlvbnMgYXdheSB3YXMgaW52aXNpYmxlLiBUaGUgaGVhZGluZyBtYXRjaGVzXG4gICAgICAgICAqIHRoZSBvYmplY3QncyBgYnVkZ2V0YCBmaWVsZEdyb3VwLCBzbyB0aGUgZm9ybSBhbmQgdGhlIGRldGFpbCBwYWdlXG4gICAgICAgICAqIGFncmVlIG9uIHdoYXQgdGhpcyBncm91cCBpcyBjYWxsZWQuXG4gICAgICAgICAqL1xuICAgICAgICBuYW1lOiAnYnVkZ2V0JyxcbiAgICAgICAgbGFiZWw6ICdCdWRnZXQgJiBST0knLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFsnYnVkZ2V0ZWRfY29zdCcsICdhY3R1YWxfY29zdCcsICdleHBlY3RlZF9yZXZlbnVlJywgJ2FjdHVhbF9yZXZlbnVlJywgJ3JvaSddLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ21ldHJpY3MnLFxuICAgICAgICBsYWJlbDogJ1BlcmZvcm1hbmNlJyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgJ3RhcmdldF9zaXplJyxcbiAgICAgICAgICAnbnVtX3NlbnQnLFxuICAgICAgICAgICdudW1fcmVzcG9uc2VzJyxcbiAgICAgICAgICAnbnVtX2xlYWRzJyxcbiAgICAgICAgICAnbnVtX2NvbnZlcnRlZF9sZWFkcycsXG4gICAgICAgICAgJ251bV9vcHBvcnR1bml0aWVzJyxcbiAgICAgICAgICAnbnVtX3dvbl9vcHBvcnR1bml0aWVzJyxcbiAgICAgICAgICAncmVzcG9uc2VfcmF0ZScsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL2luZGV4LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL2luZGV4LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFNhbGVzICh0aGUgYXBwIHBhY2thZ2UpIHBhZ2VzIGJhcnJlbC5cbiAqXG4gKiBUaGUgZG9jdHJpbmUgZm9yIHRoaXMgbWV0YWRhdGEgdHlwZSBpcyB3cml0dGVuIG9uY2UsIGluXG4gKiBgc3JjL3NhbGVzL3BhZ2VzL2luZGV4LnRzYDsgdGhpcyBmaWxlIGlzIHRoZSBzYWxlcyBwYWNrYWdlJ3MgaGFsZiBvZlxuICogdGhlIHNhbWUgZmlsZS1ieS1maWxlIHJlZ2lzdHJhdGlvbi5cbiAqL1xuXG5leHBvcnQgeyBMZWFkRGV0YWlsUGFnZSB9IGZyb20gJy4vbGVhZF9kZXRhaWwucGFnZSc7XG5leHBvcnQgeyBPcHBvcnR1bml0eURldGFpbFBhZ2UgfSBmcm9tICcuL29wcG9ydHVuaXR5X2RldGFpbC5wYWdlJztcbmV4cG9ydCB7IEFjY291bnREZXRhaWxQYWdlIH0gZnJvbSAnLi9hY2NvdW50X2RldGFpbC5wYWdlJztcbmV4cG9ydCB7IEFjY291bnRXb3JrYmVuY2hQYWdlIH0gZnJvbSAnLi9hY2NvdW50X3dvcmtiZW5jaC5wYWdlJztcbmV4cG9ydCB7IFNhbGVzSG9tZVBhZ2UgfSBmcm9tICcuL2hvbWUucGFnZSc7XG5leHBvcnQgeyBBcHBMYXVuY2hlclBhZ2UgfSBmcm9tICcuL2FwcF9sYXVuY2hlci5wYWdlJztcbmV4cG9ydCB7IFV0aWxpdHlCYXJQYWdlIH0gZnJvbSAnLi91dGlsaXR5X2Jhci5wYWdlJztcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL2xlYWRfZGV0YWlsLnBhZ2UudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXMvbGVhZF9kZXRhaWwucGFnZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUGFnZSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcbmltcG9ydCB7IFAgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogTGVhZCBEZXRhaWwgUmVjb3JkIFBhZ2VcbiAqXG4gKiBEZW1vbnN0cmF0ZXMgYSBjb21wcmVoZW5zaXZlIHJlY29yZCBwYWdlIGxheW91dCBzaW1pbGFyIHRvIFNhbGVzZm9yY2UgTGlnaHRuaW5nIFJlY29yZCBQYWdlLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBUZW1wbGF0ZS1iYXNlZCBsYXlvdXQgd2l0aCBuYW1lZCByZWdpb25zXG4gKiAtIFJpY2ggY29tcG9uZW50IGNvbXBvc2l0aW9uIChkZXRhaWxzLCBoaWdobGlnaHRzLCByZWxhdGVkIGxpc3RzKVxuICogLSBDb21wb25lbnQgdmlzaWJpbGl0eSBydWxlc1xuICogLSBQcm9maWxlLWJhc2VkIHBhZ2UgYXNzaWdubWVudFxuICovXG5leHBvcnQgY29uc3QgTGVhZERldGFpbFBhZ2U6IFBhZ2UgPSB7XG4gIG5hbWU6ICdsZWFkX2RldGFpbF9wYWdlJyxcbiAgbGFiZWw6ICdMZWFkIERldGFpbCcsXG4gIGRlc2NyaXB0aW9uOiAnQ29tcHJlaGVuc2l2ZSBsZWFkIGRldGFpbCBwYWdlIHdpdGggaGlnaGxpZ2h0cywgZGV0YWlscywgYW5kIHJlbGF0ZWQgaW5mb3JtYXRpb24nLFxuXG4gIHR5cGU6ICdyZWNvcmQnLFxuICBvYmplY3Q6ICdjcm1fbGVhZCcsXG5cbiAgLy8gVGVtcGxhdGUgZGVmaW5lcyB0aGUgb3ZlcmFsbCBsYXlvdXQgc3RydWN0dXJlLiBXZSB1c2UgYGZ1bGwtd2lkdGhgXG4gIC8vIChzaW5nbGUgY29sdW1uKSBiZWNhdXNlIHRoZSBwcmV2aW91cyBgaGVhZGVyLXNpZGViYXItbWFpbmAgbGF5b3V0XG4gIC8vIHNhbmR3aWNoZWQgdGhlIGhpZ2hsaWdodHMgc3RyaXAgaW50byBhIGNyYW1wZWQgc2lkZWJhciB3aXRoIG5vIG90aGVyXG4gIC8vIG1lYW5pbmdmdWwgc2lkZWJhciBjb250ZW50IFx1MjAxNCBTYWxlc2ZvcmNlIExpZ2h0bmluZyByZWNvcmQgcGFnZXNcbiAgLy8gc2ltaWxhcmx5IGRlZmF1bHQgdG8gYSBzdGFja2VkIGNvbHVtbiBmb3IgbWVkaXVtLWRlbnNpdHkgb2JqZWN0cy5cbiAgdGVtcGxhdGU6ICdmdWxsLXdpZHRoJyxcbiAga2luZDogJ2Z1bGwnLFxuICAvLyBQYWdlLWxldmVsIHN0YXRlIHZhcmlhYmxlc1xuICB2YXJpYWJsZXM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnc2hvd0hpc3RvcnknLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdhY3RpdmVUYWInLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0VmFsdWU6ICdkZXRhaWxzJyxcbiAgICB9LFxuICBdLFxuXG4gIC8vIFJlZ2lvbnMgY29ycmVzcG9uZCB0byBzbG90cyBpbiB0aGUgdGVtcGxhdGVcbiAgcmVnaW9uczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdoZWFkZXInLFxuICAgICAgd2lkdGg6ICdmdWxsJyxcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgLy8gVGl0bGUgKyBzdWJ0aXRsZSArIGljb24sIHdpdGggcmVjb3JkLWxldmVsIGFjdGlvbnMgcmVuZGVyZWRcbiAgICAgICAgLy8gaW5saW5lIGluIHRoZSBoZWFkZXIncyBhY3Rpb24gc2xvdCB2aWEgdGhlIGZpcnN0LWNsYXNzXG4gICAgICAgIC8vIGBhY3Rpb25zYCBwcm9wZXJ0eSAobm8gc2libGluZyBub2RlLCBubyB2aXN1YWwgb2Zmc2V0IGhhY2spLlxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BhZ2U6aGVhZGVyJyxcbiAgICAgICAgICBpZDogJ2xlYWRfaGVhZGVyJyxcbiAgICAgICAgICBsYWJlbDogJ0xlYWQgSW5mb3JtYXRpb24nLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRpdGxlOiAne2ZpcnN0X25hbWV9IHtsYXN0X25hbWV9JyxcbiAgICAgICAgICAgIHN1YnRpdGxlOiAne2NvbXBhbnl9JyxcbiAgICAgICAgICAgIC8vIGBpY29uYCByZW1vdmVkIGZyb20gYHBhZ2U6aGVhZGVyYCBpbiBAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjBcbiAgICAgICAgICAgIC8vICgjNjk0NiwgQURSLTAwODcgRDIpIFx1MjAxNCBkZWxldGVkLCBub3QgcmVuYW1lZC4gU2VlIHRoZSBmdWxsIG5vdGUgb25cbiAgICAgICAgICAgIC8vIGBhY2NvdW50X2RldGFpbC5wYWdlLnRzYDsgbm90aGluZyBldmVyIGRyZXcgaXQuXG4gICAgICAgICAgICAvLyBgYnJlYWRjcnVtYmAgcmV0aXJlZCBmcm9tIGBwYWdlOmhlYWRlcmAgaW4gQG9iamVjdHN0YWNrL3NwZWMgMTcuNi4wXG4gICAgICAgICAgICAvLyAoIzIwNzg1LCBgcGFnZS1oZWFkZXItYnJlYWRjcnVtYi1yZW1vdmVkYCkgXHUyMDE0IGRlbGV0ZWQ6IG5vIHJlbmRlcmVyXG4gICAgICAgICAgICAvLyBldmVyIGRyZXcgYSB0cmFpbCBmb3IgaXQ7IHRoZSBhcHAgc2hlbGwncyBvd24gdHJhaWwgaXMgdW5jaGFuZ2VkLlxuICAgICAgICAgICAgLy8gQ29udmVydCBpcyB0aGUgb3V0Y29tZTsgc2NoZWR1bGluZyB0aGUgbmV4dCB0b3VjaCBpcyB0aGUgZGFpbHlcbiAgICAgICAgICAgIC8vIGFjdC4gQm90aCBiZWxvbmcgaW4gdGhlIGhlYWRlciBcdTIwMTQgdGhlIGZvbGxvdy11cCB1c2VkIHRvIGJlIGZvdXJcbiAgICAgICAgICAgIC8vIGNsaWNrcyBkZWVwIGluIHRoZSBSZWxhdGVkIHRhYi5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGUgdGhyZWUgYWN0aXZpdHkgYWN0aW9ucyBhcmUgbGlzdGVkIEVYUExJQ0lUTFkgKCM1OTIpOiBhIGN1c3RvbVxuICAgICAgICAgICAgLy8gcmVjb3JkIHBhZ2UgcmVwbGFjZXMgdGhlIHN5bnRoZXNpemVkIGhlYWRlciwgc28gYW4gb2JqZWN0LXNjb3BlZFxuICAgICAgICAgICAgLy8gYWN0aW9uIHRoYXQgaXMgbm90IG5hbWVkIGhlcmUgaXMgdW5yZWFjaGFibGUgZnJvbSB0aGUgcmVjb3JkIFx1MjAxNFxuICAgICAgICAgICAgLy8gb25seSB0aGUgbGlzdC1yb3cgXHUyMkVFIG1lbnUgY2FuIGZpcmUgaXQuIExvZ2dpbmcgdGhlIGNhbGwgeW91IGp1c3RcbiAgICAgICAgICAgIC8vIG1hZGUgaXMgdGhlIHNpbmdsZSBtb3N0IGZyZXF1ZW50IHRoaW5nIGEgcmVwIGRvZXMgb24gYSBsZWFkLCBhbmRcbiAgICAgICAgICAgIC8vIGl0IHdhcyB0d28gbmF2aWdhdGlvbnMgYXdheS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBBY3Rpb24gSURzLCBub3QgYEFjdGlvbkRlZmAgb2JqZWN0czogYFBhZ2VIZWFkZXJQcm9wcy5hY3Rpb25zYCBpc1xuICAgICAgICAgICAgLy8gYHouYXJyYXkoei5zdHJpbmcoKSlgIChcIkFjdGlvbiBJRHMgdG8gc2hvdyBpbiBoZWFkZXJcIikgaW5cbiAgICAgICAgICAgIC8vIEBvYmplY3RzdGFjay9zcGVjIDE3LjMuMCwgYW5kIHRoaXMgcmVwbyBhdXRob3JzIGFnYWluc3QgdGhlXG4gICAgICAgICAgICAvLyBwcm90b2NvbCAoIzE2NTMpLiBFYWNoIGlkIGlzIHRoZSBgbmFtZWAgb2YgYSBjcm1fbGVhZC1zY29wZWRcbiAgICAgICAgICAgIC8vIGFjdGlvbiBcdTIwMTQgYGNvbnZlcnRfbGVhZGAgLyBgc2NoZWR1bGVfZm9sbG93dXBgIGluXG4gICAgICAgICAgICAvLyBgc3JjL3NhbGVzL2FjdGlvbnMvbGVhZC5hY3Rpb25zLnRzYCwgdGhlIGFjdGl2aXR5IHRyaW8gaW5cbiAgICAgICAgICAgIC8vIGBzcmMvc2FsZXMvYWN0aW9ucy9hY3Rpdml0eS1hY3Rpb25zLnRzYC5cbiAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ2NvbnZlcnRfbGVhZCcsXG4gICAgICAgICAgICAgICdzY2hlZHVsZV9mb2xsb3d1cCcsXG4gICAgICAgICAgICAgICdsb2dfY2FsbCcsXG4gICAgICAgICAgICAgICdsb2dfbWVldGluZycsXG4gICAgICAgICAgICAgICdzY2hlZHVsZV9tZWV0aW5nJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gRHVwbGljYXRlIGJhbm5lcnMgXHUyMDE0IE9ORSBQRVIgVkVSRElDVCAoIzEyMDcgXHUwMEI3IHdpZGVuZWQgYnkgIzEyODkgXHUwMEI3XG4gICAgICAgIC8vIHNwbGl0IGJ5ICMxNjI4KS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYGxlYWRfZHVwbGljYXRlX2NoZWNrYCAobGVhZC5ob29rLnRzLCBqb2IgMikgYWxyZWFkeSB3cml0ZXNcbiAgICAgICAgLy8gYGR1cGxpY2F0ZV9zdGF0dXM6ICdzdXNwZWN0ZWQnYCBhbmQgbGlua3MgdGhlIHJlY29yZCB0aGUgbGVhZCByZXBlYXRzXG4gICAgICAgIC8vIFx1MjAxNCB0aGUgZmxhZyBleGlzdGVkLCBhbmQgdGhpcyBwYWdlIG5ldmVyIHJlYWQgaXQuIEEgcmVwIG9wZW5lZCBhXG4gICAgICAgIC8vIGZsYWdnZWQgbGVhZCwgc2F3IGEgcGFnZSBpZGVudGljYWwgdG8gYSBjbGVhbiBvbmUsIGFuZCBjb252ZXJ0ZWQgaXRcbiAgICAgICAgLy8gaW50byBhIHNlY29uZCBhY2NvdW50LCBjb250YWN0IGFuZCBvcHBvcnR1bml0eS4gVGhlc2UgYmFubmVycyBhbmQgdGhlXG4gICAgICAgIC8vIGBkdXBsaWNhdGVzYCBzZWN0aW9uIG9uIHRoZSBEZXRhaWxzIHRhYiBhcmUgdGhlIHJlY29yZC1wYWdlIGhhbGYgb2ZcbiAgICAgICAgLy8gdGhhdCBmaXggXHUyMDE0IHRoZSBiYW5uZXIgaXMgdGhlIGFsYXJtLCB0aGUgc2VjdGlvbiBpcyB0aGUgbGluayB0b1xuICAgICAgICAvLyBjb21wYXJlIGFnYWluc3Q7IHRoZSBjb252ZXJzaW9uIHNjcmVlbiBjYXJyaWVzIHRoZSBvdGhlciBoYWxmLlxuICAgICAgICAvL1xuICAgICAgICAvLyAjIyBXaHkgdGhlcmUgYXJlIFRXTyBvZiB0aGVtICgjMTYyOClcbiAgICAgICAgLy9cbiAgICAgICAgLy8gIzEyMDcgc2hpcHBlZCBvbmUgYmFubmVyIGdhdGVkIG9uIGA9PSBcInN1c3BlY3RlZFwiYCwgd2hpY2ggbGVmdCB0aGVcbiAgICAgICAgLy8gU1RST05HRVIgc3RhdGUgc2lsZW50LiAjMTI4OSB3aWRlbmVkIHRoZSBwcmVkaWNhdGUgdG8gZXZlcnkgdmVyZGljdFxuICAgICAgICAvLyBhbmQsIGJlaW5nIG9uZSBjb21wb25lbnQsIGhhZCB0byBwaWNrIGNvcHkgdGhhdCBuYW1lZCBORUlUSEVSIHN0YXRlOlxuICAgICAgICAvLyBhIGByZWNvcmQ6YWxlcnRgIGNhcnJpZXMgYSBzaW5nbGUgYHZpc2libGVgIGFuZCBhIHNpbmdsZSB0aXRsZS9ib2R5XG4gICAgICAgIC8vIHBhaXIsIGFuZCBgcGlja0xvY2FsaXplZGAgcGlja3MgYnkgTEFOR1VBR0UsIG5vdCBieSByb3cgXHUyMDE0IHNvIG5hbWluZ1xuICAgICAgICAvLyBvbmUgdmVyZGljdCB3b3VsZCBoYXZlIG1pc2xhYmVsbGVkIGV2ZXJ5IGxlYWQgaW4gdGhlIG90aGVyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGF0IHdhcyBjb3JyZWN0IGZvciBvbmUgYmFubmVyLCBhbmQgaXQgaXMgd2h5IG9uZSBiYW5uZXIgaXMgbm90XG4gICAgICAgIC8vIGVub3VnaC4gU2luY2UgIzEyODggdGhlIHR3byB2ZXJkaWN0cyBoYXZlIE9QUE9TSVRFIG5leHQgc3RlcHM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgc3VzcGVjdGVkIFx1MjAxNCB0aGUgaW50YWtlIGhvb2sncyBndWVzcy4gQ29udmVyc2lvbiBQUk9DRUVEUzsgdGhlIHJlcFxuICAgICAgICAvLyAgICAgICAgICAgICAgIHNob3VsZCBjb21wYXJlIGFnYWluc3QgdGhlIGxpbmtlZCByZWNvcmQgZmlyc3QuXG4gICAgICAgIC8vICAgY29uZmlybWVkIFx1MjAxNCBhIHJldmlld2VyJ3MgdmVyZGljdC4gQ29udmVyc2lvbiBpcyBSRUZVU0VEIG91dHJpZ2h0XG4gICAgICAgIC8vICAgICAgICAgICAgICAgKGBsZWFkLWNvbnZlcnNpb24uZmxvdy50c2AsIGByZWZ1c2VfY29uZmlybWVkX2R1cGxpY2F0ZWApLlxuICAgICAgICAvL1xuICAgICAgICAvLyBPbmUgc2VudGVuY2UgY2Fubm90IHN0YXRlIGVpdGhlciB3aXRob3V0IGJlaW5nIGZhbHNlIGZvciB0aGUgb3RoZXIsXG4gICAgICAgIC8vIHNvIGl0IHN0YXRlZCBuZWl0aGVyLCBhbmQgdGhlIHJlcCBoYWQgdG8gc2Nyb2xsIHRvIHRoZSBEdXBsaWNhdGVcbiAgICAgICAgLy8gU3RhdHVzIGNoaXAgdG8gbGVhcm4gd2hpY2ggc2l0dWF0aW9uIHRoZXkgd2VyZSBpbi4gQSBiYW5uZXIgdGhhdFxuICAgICAgICAvLyBhbm5vdW5jZXMgc29tZXRoaW5nIGlzIHdyb25nIGJ1dCBub3Qgd2hhdCB0byBkbyBpcyBub3QgZG9pbmcgdGhlIG9uZVxuICAgICAgICAvLyBqb2IgYSBiYW5uZXIgaGFzLiBUd28gY29tcG9uZW50cywgdHdvIHByZWRpY2F0ZXMsIHR3byBuZXh0IHN0ZXBzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBcdTI2QTBcdUZFMEYgVHdvIHNpYmxpbmcgYHJlY29yZDphbGVydGAgbm9kZXMgcmVhbGx5IGRvIEJPVEggcmVuZGVyOiBhIHJlZ2lvblxuICAgICAgICAvLyByZW5kZXJzIGFzIGBjb21wb25lbnRzLm1hcCgobm9kZSwgaSkgPT4gPFNjaGVtYVJlbmRlcmVyIGtleT17bm9kZT8uaWRcbiAgICAgICAgLy8gfHwgZmFsbGJhY2t9IFx1MjAyNj4pYCBcdTIwMTQgcmVhZCBvdXQgb2YgdGhlIHNoaXBwZWQgY29uc29sZSBidW5kbGUgYXQgdGhlXG4gICAgICAgIC8vIGAub2JqZWN0dWktc2hhYCBwaW4gXHUyMDE0IHNvIGVhY2ggaXMgbW91bnRlZCBzZXBhcmF0ZWx5IGFuZCBldmFsdWF0ZXMgaXRzXG4gICAgICAgIC8vIG93biBgdmlzaWJsZWAgYWdhaW5zdCB0aGUgc2FtZSByb3cuIFRoZWlyIGBpZGBzIGFyZSB0aGVpciBSZWFjdCBrZXlzLFxuICAgICAgICAvLyB3aGljaCBpcyB3aHkgdGhlIHR3byBpZHMgZGlmZmVyIHJhdGhlciB0aGFuIHNoYXJpbmcgb25lLlxuICAgICAgICAvL1xuICAgICAgICAvLyBcdTI2QTBcdUZFMEYgYHZpc2libGVgIGlzIHRoZSBPTkUgcmVjb3JkIGNvbXBvbmVudCB3aG9zZSBQUk9QUyBjYXJyeSBhIHJlYWwgcm93XG4gICAgICAgIC8vIHByZWRpY2F0ZTogYHJlY29yZC1hbGVydC50c3hgIGV2YWx1YXRlcyBgcHJvcGVydGllcy52aXNpYmxlYCB0aHJvdWdoXG4gICAgICAgIC8vIGB0b1ByZWRpY2F0ZUlucHV0YCArIGB1c2VDb25kaXRpb25gIGFnYWluc3QgdGhlIHJvd1xuICAgICAgICAvLyAoYHVzZVByZWRpY2F0ZVJlY29yZENvbnRleHRgKSwgdGhlIHNhbWUgcGlwZWxpbmUgYXMgYW4gYWN0aW9uIGJ1dHRvbi5cbiAgICAgICAgLy8gQSBub2RlLWxldmVsIGB2aXNpYmxlV2hlbmAgaXMgYSBkaWZmZXJlbnQgZ2F0ZSBvbmUgdGllciB1cCxcbiAgICAgICAgLy8gZXZhbHVhdGVkIGJ5IGBTY2hlbWFSZW5kZXJlcmAsIGFuZCB0aGUgdHdvIGNvbXBvc2UgYXMgQU5ELiBNZWFzdXJlZFxuICAgICAgICAvLyBvbiB0aGUgMTcuNi4wIHBpbiAoIzE4ODcpLCB0aGF0IHRpZXIgYmluZHMgdGhlIHBhZ2UncyByb3cgYXNcbiAgICAgICAgLy8gYHJlY29yZGAgdG9vIChvYmplY3R1aSM1NDU0KTogdGhpcyBzYW1lIHByZWRpY2F0ZSwgbW92ZWQgdGhlcmUsXG4gICAgICAgIC8vIGdhdGVkIGNvcnJlY3RseSBpbiBib3RoIGRpcmVjdGlvbnMuIGB2aXNpYmxlYCBzdGF5cyBiZWNhdXNlIGl0IGlzXG4gICAgICAgIC8vIHRoZSBnYXRlIGByZWNvcmQ6YWxlcnRgIGRlY2xhcmVzIGluIGl0cyBvd24gcHJvcHMuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFx1MjZBMFx1RkUwRiBgaGFzKClgIGlzIGxvYWQtYmVhcmluZywgYW5kIHRoaXMgc3VyZmFjZSBpcyB0aGUgV09SU1Qgb2YgdGhlIGZvdXJcbiAgICAgICAgLy8gdGhpcyByZXBvIG1lYXN1cmVzIChjZi4gYHRlc3Qvdmlldy1wcmVkaWNhdGUtZGlhbGVjdC50ZXN0LnRzYCk6IHRoZVxuICAgICAgICAvLyByZW5kZXJlcidzIGNhbGwgc2l0ZSBpcyBGQUlMLVNPRlQgXHUyMDE0IGFuIHVuZXZhbHVhYmxlIHByZWRpY2F0ZSBhbnN3ZXJzXG4gICAgICAgIC8vIFNIT1dOLiBTbyBhIGJhcmUgYHJlY29yZC5kdXBsaWNhdGVfc3RhdHVzID09IFwic3VzcGVjdGVkXCJgIHdvdWxkIGFib3J0XG4gICAgICAgIC8vIHdpdGggYE5vIHN1Y2gga2V5YCBvbiBldmVyeSBjbGVhbiBsZWFkIHdob3NlIGRyaXZlciBvbWl0cyB0aGUgY29sdW1uXG4gICAgICAgIC8vIChgZHJpdmVyLW1lbW9yeWAgLyBgZHJpdmVyLW1vbmdvZGJgOyBgZHJpdmVyLXNxbGAgcmV0dXJucyBpdCBhcyBudWxsKVxuICAgICAgICAvLyBhbmQgcHV0IGEgZHVwbGljYXRlIHdhcm5pbmcgb24gbGVhZHMgdGhhdCBhcmUgbm90IGR1cGxpY2F0ZXMuIFRoZVxuICAgICAgICAvLyBndWFyZCBpcyB3aGF0IG1ha2VzIHRoZSBwcmVkaWNhdGUgYW5zd2VyIGBmYWxzZWAgaW5zdGVhZCBvZiBmYXVsdGluZy5cbiAgICAgICAgLy8gUGlubmVkIG9uIHRoZSByZWFsIGVuZ2luZSBpbiBgdGVzdC9sZWFkLWR1cGxpY2F0ZS12aXNpYmlsaXR5LnRlc3QudHNgLlxuICAgICAgICAvL1xuICAgICAgICAvLyBcdTI2RDQgQW5kIHRoZSBndWFyZCBpcyBOT1QgdGhlIHdob2xlIHByZWRpY2F0ZSBcdTIwMTQgYGhhcygpYCBBTE9ORSBpcyB3cm9uZ1xuICAgICAgICAvLyBoZXJlLCBpbiBlaXRoZXIgc2hhcGUuIEl0IGlzIFRSVUUgZm9yIGEga2V5IHRoYXQgaXMgUFJFU0VOVCBBTkQgTlVMTCxcbiAgICAgICAgLy8gd2hpY2ggaXMgcHJlY2lzZWx5IHdoYXQgYGRyaXZlci1zcWxgIGhhbmRzIGJhY2sgZm9yIGEgY2xlYW4gbGVhZFxuICAgICAgICAvLyAobWVhc3VyZWQ6IGBoYXMocmVjb3JkLmR1cGxpY2F0ZV9zdGF0dXMpYCBhZ2FpbnN0XG4gICAgICAgIC8vIGB7IGR1cGxpY2F0ZV9zdGF0dXM6IG51bGwgfWAgYW5zd2VycyBgeyBvazogdHJ1ZSwgdmFsdWU6IHRydWUgfWApLCBzb1xuICAgICAgICAvLyB0aGUgZ3VhcmQgbmVlZHMgYSBjb21wYXJpc29uIGJlc2lkZSBpdCBvciB0aGUgYmFubmVyIGNyaWVzIHdvbGYgb25cbiAgICAgICAgLy8gZXZlcnkgY2xlYW4gbGVhZC4gIzEyODksIGNvdmVyaW5nIGJvdGggdmVyZGljdHMgYXQgb25jZSwgc3BlbGxlZCB0aGF0XG4gICAgICAgIC8vIGNvbXBhcmlzb24gYCYmIFx1MjAyNiAhPSBudWxsYC4gQSBwZXItdmVyZGljdCBiYW5uZXIgc3BlbGxzIGl0IHdpdGggdGhlXG4gICAgICAgIC8vIEVRVUFMSVRZLCB3aGljaCBpcyBzdHJpY3RseSBuYXJyb3dlciBhbmQgc3Vic3VtZXMgaXQ6IG1lYXN1cmVkIG9uXG4gICAgICAgIC8vIHRoaXMgZW5naW5lLCBgbnVsbCA9PSBcInN1c3BlY3RlZFwiYCBpcyBhIGNsZWFuIGBmYWxzZWAsIG5vdCBhIGZhdWx0LFxuICAgICAgICAvLyBhbmQgdGhlIHR3byBzcGVsbGluZ3MgYWdyZWUgb24gZXZlcnkgcmVjb3JkIHNoYXBlIGEgZHJpdmVyIGNhblxuICAgICAgICAvLyBwcm9kdWNlLiBCb3RoIGhhbHZlcyBvZiB0aGUgc2hhcGUgIzEyODkgcnVsZWQgZm9yIGFyZSBpbnRhY3QgXHUyMDE0IHRoZVxuICAgICAgICAvLyBgaGFzKClgIGd1YXJkIHZlcmJhdGltLCBhbmQgYSBjb21wYXJpc29uIHRoYXQgbWFrZXMgXCJzZXRcIiBtZWFuIHNldCBcdTIwMTRcbiAgICAgICAgLy8gYW5kIHRoZSBjb21wYXJpc29uIGdvdCBTVFJJQ1RFUiwgd2hpY2ggaXMgdGhlIHBvaW50IG9mIHRoZSBzcGxpdC4gVGhlXG4gICAgICAgIC8vIHNhbWUgc3BlbGxpbmcgYWxyZWFkeSBzaGlwcyBvbmUgZmlsZSBvdmVyLCBvbiB0aGlzIHNhbWUgZmllbGQ6IHRoZVxuICAgICAgICAvLyBjb252ZXJzaW9uIGZsb3cncyBgZTIxYCAvIGBlMjVgIGVkZ2VzICgjMTI4OCkgcmVhZFxuICAgICAgICAvLyBgaGFzKHZhcnMubGVhZFJlY29yZC5kdXBsaWNhdGVfc3RhdHVzKSAmJiBcdTIwMjYgPT0gXCJzdXNwZWN0ZWRcImAuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFx1MjZENCBOZWl0aGVyIGhhbGYgbWF5IGJlIHNpbXBsaWZpZWQgYXdheS4gQm90aCBhcmUgcGlubmVkLCBzaGFwZSBieVxuICAgICAgICAvLyBzaGFwZSwgaW5jbHVkaW5nIHRoZSByZXZlcnNlIHBpbiB0aGF0IHRoZSB1bmd1YXJkZWQgdGFpbCByZWFsbHkgZG9lc1xuICAgICAgICAvLyBmYXVsdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYFBgIFx1MjAxNCBhbiBleHBsaWNpdCBgeyBkaWFsZWN0OiAnY2VsJyB9YCBlbnZlbG9wZSBcdTIwMTQgaXMgbm90IGRlY29yYXRpb25cbiAgICAgICAgLy8gZWl0aGVyOiBgRXhwcmVzc2lvbkV2YWx1YXRvci5ldmFsdWF0ZUNvbmRpdGlvbmAgcm91dGVzIE9OTFkgdGhlXG4gICAgICAgIC8vIGVudmVsb3BlIHRvIGBAb2JqZWN0c3RhY2svZm9ybXVsYWAncyBDRUwgZW5naW5lLCB3aGVyZSBgaGFzKClgIGlzIGFcbiAgICAgICAgLy8gcmVhbCBmdW5jdGlvbjsgYSBiYXJlIHN0cmluZyB0YWtlcyB0aGUgbGVnYWN5IEpTIHBhdGgsIHdob3NlXG4gICAgICAgIC8vIGBGb3JtdWxhRnVuY3Rpb25zYCBoYXMgbm8gQ0VMIGBoYXMoKWAsIHNvIHRoZSBndWFyZCB3b3VsZCBpdHNlbGYgYmVcbiAgICAgICAgLy8gdGhlIGZhdWx0IHRoYXQgZmFpbHMgc29mdCB0byB2aXNpYmxlLlxuICAgICAgICAvL1xuICAgICAgICAvLyBgdGl0bGVgIC8gYGJvZHlgIGNhcnJ5IGlubGluZSBsb2NhbGUgbWFwcyByYXRoZXIgdGhhbiBwbGFpbiBzdHJpbmdzOlxuICAgICAgICAvLyB0aGlzIHJlbmRlcmVyIHJlc29sdmVzIGJvdGggdGhyb3VnaCBgcGlja0xvY2FsaXplZChcdTIwMjYsIGxhbmd1YWdlKWBcbiAgICAgICAgLy8gKHRoZSBzYW1lIGNhcGFiaWxpdHkgYG9wcG9ydHVuaXR5X2RldGFpbC5wYWdlLnRzYCByZWNvcmRzIHVuZGVyXG4gICAgICAgIC8vICM5NzIpLCBhbmQgYGJvZHlgIGhhcyBubyBvdGhlciBjaGFubmVsIFx1MjAxNCB0aGUgaTE4biBleHRyYWN0b3Inc1xuICAgICAgICAvLyBwZXItY29tcG9uZW50IGNvcHkga2V5cyAoYFBBR0VfQ09NUE9ORU5UX0NPUFlfS0VZU2AsIHJlYWQgb24gMTcuNi4wKVxuICAgICAgICAvLyBhcmUgdGl0bGUvZGVzY3JpcHRpb24vbGFiZWwvcGxhY2Vob2xkZXIvZW1wdHlUZXh0LCBzbyBhIHBsYWluLXN0cmluZ1xuICAgICAgICAvLyBgYm9keWAgd291bGQgc2hpcCBFbmdsaXNoIHRvIGFsbCBmb3VyIGxvY2FsZXMuIEtlZXBpbmcgYm90aCBoYWx2ZXMgb2Ygb25lIGJhbm5lcidzIGNvcHkgaW4gb25lXG4gICAgICAgIC8vIHBsYWNlIGJlYXRzIHNwbGl0dGluZyBgdGl0bGVgIGludG8gdGhlIGxvY2FsZSBwYWNrcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gXHUyQjUwIEVhY2ggYmFubmVyJ3MgY29weSBOQU1FUyBJVFMgT1dOIFZFUkRJQ1QsIGluIHRoZSB2b2NhYnVsYXJ5IHRoZVxuICAgICAgICAvLyBgZHVwbGljYXRlX3N0YXR1c2AgY2hpcCBiZWxvdyBwdWJsaXNoZXMsIGFuZCBuZXZlciB0aGUgb3RoZXIgb25lIFx1MjAxNFxuICAgICAgICAvLyBwaW5uZWQgYWdhaW5zdCB0aGUgb3B0aW9uIGxhYmVscyByZWFkIG91dCBvZiB0aGUgbG9jYWxlIHBhY2tzIGluXG4gICAgICAgIC8vIGB0ZXN0L2xlYWQtZHVwbGljYXRlLXZpc2liaWxpdHkudGVzdC50c2AsIHNvIHJlbmFtaW5nIGFuIG9wdGlvblxuICAgICAgICAvLyByZS1haW1zIHRoZSBhc3NlcnRpb24gcmF0aGVyIHRoYW4gcmV0aXJpbmcgaXQuXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncmVjb3JkOmFsZXJ0JyxcbiAgICAgICAgICBpZDogJ2xlYWRfZHVwbGljYXRlX2FsZXJ0X3N1c3BlY3RlZCcsXG4gICAgICAgICAgbGFiZWw6ICdTdXNwZWN0ZWQgRHVwbGljYXRlIEFsZXJ0JyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAvLyBgd2FybmluZ2AsIG5vdCBgZXJyb3JgOiBjb252ZXJzaW9uIHN0aWxsIFBST0NFRURTIG9uIHRoaXNcbiAgICAgICAgICAgIC8vIHZlcmRpY3QsIGFuZCB0aGUgcmVuZGVyZXIgbWFwcyBgZXJyb3JgIHRvIGByb2xlPVwiYWxlcnRcImAgL1xuICAgICAgICAgICAgLy8gYGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiYCBcdTIwMTQgYW4gaW50ZXJydXB0aW9uIHRoaXMgc3RhdGUgaGFzIG5vdFxuICAgICAgICAgICAgLy8gZWFybmVkLlxuICAgICAgICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgICAgICAgIHZpc2libGU6IFBgaGFzKHJlY29yZC5kdXBsaWNhdGVfc3RhdHVzKSAmJiByZWNvcmQuZHVwbGljYXRlX3N0YXR1cyA9PSBcInN1c3BlY3RlZFwiYCxcbiAgICAgICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICAgIGVuOiAnU3VzcGVjdGVkIGR1cGxpY2F0ZSBcdTIwMTQgY29tcGFyZSBiZWZvcmUgeW91IGNvbnZlcnQnLFxuICAgICAgICAgICAgICAnemgtQ04nOiAnXHU3NTkxXHU0RjNDXHU5MUNEXHU1OTBEXHUyMDE0XHUyMDE0XHU4RjZDXHU2MzYyXHU1MjREXHU4QkY3XHU1MTQ4XHU2QkQ0XHU1QkY5JyxcbiAgICAgICAgICAgICAgJ2phLUpQJzogJ1x1OTFDRFx1ODkwN1x1MzA2RVx1NzU5MVx1MzA0NCBcdTIwMTQgXHU1OTA5XHU2M0RCXHUzMDU5XHUzMDhCXHU1MjREXHUzMDZCXHU3MTY3XHU1NDA4XHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0JyxcbiAgICAgICAgICAgICAgJ2VzLUVTJzogJ0R1cGxpY2FkbyBTb3NwZWNob3NvOiBjb21wYXJlIGFudGVzIGRlIGNvbnZlcnRpcicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICBlbjpcbiAgICAgICAgICAgICAgICAnSW50YWtlIG1hdGNoZWQgdGhpcyBsZWFkIHRvIGEgcmVjb3JkIHRoaXMgYXBwIGFscmVhZHkgaGFzLiBEdXBsaWNhdGUgJ1xuICAgICAgICAgICAgICAgICsgJ01hbmFnZW1lbnQgYmVsb3cgbGlua3MgdGhhdCByZWNvcmQgXHUyMDE0IG9wZW4gaXQgYW5kIGNvbXBhcmUuIFlvdSBjYW4gc3RpbGwgJ1xuICAgICAgICAgICAgICAgICsgJ2NvbnZlcnQgdGhpcyBsZWFkOiB0aGlzIGlzIHRoZSBtYXRjaCBpbnRha2UgZ3Vlc3NlZCBhdCwgbm90IGEgcmV2aWV3ZXJcXCdzICdcbiAgICAgICAgICAgICAgICArICdkZWNpc2lvbi4gQnV0IGlmIGl0IGlzIHRoZSBzYW1lIGJ1eWVyLCBkaXNxdWFsaWZ5IGl0IGluc3RlYWQsIGJlY2F1c2UgJ1xuICAgICAgICAgICAgICAgICsgJ2NvbnZlcnRpbmcgY3JlYXRlcyBhIHNlY29uZCBhY2NvdW50LCBjb250YWN0IGFuZCBvcHBvcnR1bml0eSBmb3IgdGhlbS4nLFxuICAgICAgICAgICAgICAnemgtQ04nOlxuICAgICAgICAgICAgICAgICdcdTVGNTVcdTUxNjVcdTY1RjZcdTUzRDFcdTczQjBcdThCRTVcdTdFQkZcdTdEMjJcdTRFMEVcdTdDRkJcdTdFREZcdTRFMkRcdTVERjJcdTY3MDlcdThCQjBcdTVGNTVcdTUzMzlcdTkxNERcdTMwMDJcdTRFMEJcdTY1QjlcdTMwMENcdTkxQ0RcdTU5MERcdTdFQkZcdTdEMjJcdTdCQTFcdTc0MDZcdTMwMERcdTRFMkRcdTY2MkZcdTVCODNcdTkxQ0RcdTU5MERcdTc2ODRcdTkwQTNcdTY3NjFcdThCQjBcdTVGNTVcdUZGMEMnXG4gICAgICAgICAgICAgICAgKyAnXHU4QkY3XHU1MTQ4XHU2MjUzXHU1RjAwXHU2QkQ0XHU1QkY5XHUzMDAyXHU4QkU1XHU3RUJGXHU3RDIyXHU0RUNEXHU3MTM2XHU1M0VGXHU0RUU1XHU4RjZDXHU2MzYyXHVGRjFBXHU4RkQ5XHU2NjJGXHU1RjU1XHU1MTY1XHU2NUY2XHU3Njg0XHU4MUVBXHU1MkE4XHU1MjI0XHU2NUFEXHVGRjBDXHU0RTBEXHU2NjJGXHU1QkExXHU2ODM4XHU0RUJBXHU3Njg0XHU3RUQzXHU4QkJBXHUzMDAyJ1xuICAgICAgICAgICAgICAgICsgJ1x1NEY0Nlx1ODJFNVx1Nzg2RVx1NUM1RVx1NTQwQ1x1NEUwMFx1NUJBMlx1NjIzN1x1RkYwQ1x1OEJGN1x1NjUzOVx1NEUzQVx1NTNENlx1NkQ4OFx1OEQ0NFx1NjgzQ1x1MjAxNFx1MjAxNFx1OEY2Q1x1NjM2Mlx1NEYxQVx1NEUzQVx1NTQwQ1x1NEUwMFx1NUJBMlx1NjIzN1x1NTE4RFx1NTIxQlx1NUVGQVx1NEUwMFx1NTk1N1x1NUJBMlx1NjIzN1x1MzAwMVx1ODA1NFx1N0NGQlx1NEVCQVx1NTQ4Q1x1NTU0Nlx1NjczQVx1MzAwMicsXG4gICAgICAgICAgICAgICdqYS1KUCc6XG4gICAgICAgICAgICAgICAgJ1x1NzY3Qlx1OTMzMlx1NjY0Mlx1MzA2Qlx1MzAwMVx1MzA1M1x1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA0Q1x1NjVFMlx1NUI1OFx1MzBFQ1x1MzBCM1x1MzBGQ1x1MzBDOVx1MzA2OFx1NEUwMFx1ODFGNFx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMlx1NEUwQlx1MzA2RVx1MzAwQ1x1OTFDRFx1ODkwN1x1N0JBMVx1NzQwNlx1MzAwRFx1MzA2Qlx1OTFDRFx1ODkwN1x1NTE0OFx1MzA2RSdcbiAgICAgICAgICAgICAgICArICdcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzlcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTlcdTMwMDJcdTMwN0VcdTMwNUFcdTk1OEJcdTMwNDRcdTMwNjZcdTcxNjdcdTU0MDhcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDJcdTMwNTNcdTMwNkVcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkZcdTMwN0VcdTMwNjBcdTU5MDlcdTYzREJcdTMwNjdcdTMwNERcdTMwN0VcdTMwNTlcdTMwMDInXG4gICAgICAgICAgICAgICAgKyAnXHUzMDUzXHUzMDhDXHUzMDZGXHU3NjdCXHU5MzMyXHU2NjQyXHUzMDZFXHU4MUVBXHU1MkQ1XHU1MjI0XHU1QjlBXHUzMDY3XHUzMDQyXHUzMDhBXHUzMDAxXHU2MkM1XHU1RjUzXHU4MDA1XHUzMDZFXHU3RDUwXHU4QUQ2XHUzMDY3XHUzMDZGXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDAyXHUzMDVGXHUzMDYwXHUzMDU3XHU1NDBDXHUzMDU4XHU3NkY4XHU2MjRCXHUzMDY3J1xuICAgICAgICAgICAgICAgICsgJ1x1MzA0Mlx1MzA4Q1x1MzA3MFx1MzAwMVx1NTkwOVx1NjNEQlx1MzA1Qlx1MzA1QVx1NEUwRFx1OTA2OVx1NjgzQ1x1MzA2Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlx1NTkwOVx1NjNEQlx1MzA1OVx1MzA4Qlx1MzA2OFx1NTQwQ1x1MzA1OFx1NzZGOFx1NjI0Qlx1MzA2Qlx1NTNENlx1NUYxNVx1NTE0OFx1MzBGQlx1NTNENlx1NUYxNVx1NTE0OCdcbiAgICAgICAgICAgICAgICArICdcdThDQUNcdTRFRkJcdTgwMDVcdTMwRkJcdTU1NDZcdThBQzdcdTMwNENcdTMwODJcdTMwNDZcdTRFMDBcdTdENDRcdTRGNUNcdTYyMTBcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTlcdTMwMDInLFxuICAgICAgICAgICAgICAnZXMtRVMnOlxuICAgICAgICAgICAgICAgICdMYSBjYXB0dXJhIGVuY29udHJcdTAwRjMgcXVlIGVzdGUgcHJvc3BlY3RvIGNvaW5jaWRlIGNvbiB1biByZWdpc3RybyBxdWUgeWEgJ1xuICAgICAgICAgICAgICAgICsgJ2V4aXN0ZS4gR2VzdGlcdTAwRjNuIGRlIER1cGxpY2Fkb3MsIG1cdTAwRTFzIGFiYWpvLCBlbmxhemEgZXNlIHJlZ2lzdHJvOiBcdTAwRTFicmFsbyB5ICdcbiAgICAgICAgICAgICAgICArICdjb21wXHUwMEUxcmVsby4gVG9kYXZcdTAwRURhIHB1ZWRlIGNvbnZlcnRpciBlc3RlIHByb3NwZWN0bywgcG9ycXVlIHNlIHRyYXRhIGRlIHVuYSAnXG4gICAgICAgICAgICAgICAgKyAnY29pbmNpZGVuY2lhIGF1dG9tXHUwMEUxdGljYSBkZSBsYSBjYXB0dXJhIHkgbm8gZGVsIHZlcmVkaWN0byBkZSB1bmEgcGVyc29uYS4gJ1xuICAgICAgICAgICAgICAgICsgJ1Blcm8gc2kgZXMgZWwgbWlzbW8gY29tcHJhZG9yLCBkZXNjYWxpZlx1MDBFRHF1ZWxvIGVuIHN1IGx1Z2FyOiBjb252ZXJ0aXJsbyAnXG4gICAgICAgICAgICAgICAgKyAnY3JlYSB1bmEgc2VndW5kYSBjdWVudGEsIGNvbnRhY3RvIHkgb3BvcnR1bmlkYWQgcGFyYSBcdTAwRTlsLicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncmVjb3JkOmFsZXJ0JyxcbiAgICAgICAgICBpZDogJ2xlYWRfZHVwbGljYXRlX2FsZXJ0X2NvbmZpcm1lZCcsXG4gICAgICAgICAgbGFiZWw6ICdDb25maXJtZWQgRHVwbGljYXRlIEFsZXJ0JyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAvLyBgZXJyb3JgLCBhbmQgdGhlIGxldmVsIGlzIHRoZSBtZXNzYWdlOiB0aGlzIGlzIHRoZSBzdGF0ZSBvbiB3aGljaFxuICAgICAgICAgICAgLy8gdGhlIGFwcCBSRUZVU0VTIHRoZSByZXAncyBuZXh0IGNsaWNrLCBhbmQgdGhlIHJlbmRlcmVyIGdpdmVzXG4gICAgICAgICAgICAvLyBgZXJyb3JgIGByb2xlPVwiYWxlcnRcImAgLyBgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCJgIHJhdGhlciB0aGFuIHRoZVxuICAgICAgICAgICAgLy8gcG9saXRlIGByb2xlPVwic3RhdHVzXCJgIGV2ZXJ5IG90aGVyIGxldmVsIGdldHMuIFx1MjZENCBUaGUgc2V2ZXJpdHkgaXNcbiAgICAgICAgICAgIC8vIHByZXNlbnRhdGlvbiBvbmx5IFx1MjAxNCB3aGF0IHRoZSBhcHAgcmVmdXNlcyB3YXMgcnVsZWQgYnkgIzEyODggYW5kXG4gICAgICAgICAgICAvLyBzaGlwcGVkIGJ5IFBSICMxNTU1LCBhbmQgbm90aGluZyBoZXJlIGNoYW5nZXMgaXQuXG4gICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgIHZpc2libGU6IFBgaGFzKHJlY29yZC5kdXBsaWNhdGVfc3RhdHVzKSAmJiByZWNvcmQuZHVwbGljYXRlX3N0YXR1cyA9PSBcImNvbmZpcm1lZFwiYCxcbiAgICAgICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICAgIGVuOiAnQ29uZmlybWVkIGR1cGxpY2F0ZSBcdTIwMTQgY29udmVyc2lvbiB3aWxsIGJlIHJlZnVzZWQnLFxuICAgICAgICAgICAgICAnemgtQ04nOiAnXHU1REYyXHU3ODZFXHU4QkE0XHU5MUNEXHU1OTBEXHUyMDE0XHUyMDE0XHU4RjZDXHU2MzYyXHU1QzA2XHU4OEFCXHU2MkQyXHU3RUREJyxcbiAgICAgICAgICAgICAgJ2phLUpQJzogJ1x1OTFDRFx1ODkwN1x1NzhCQVx1NUI5QSBcdTIwMTQgXHU1OTA5XHU2M0RCXHUzMDZGXHU2MkQyXHU1NDI2XHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU5JyxcbiAgICAgICAgICAgICAgJ2VzLUVTJzogJ0R1cGxpY2FkbyBDb25maXJtYWRvOiBsYSBjb252ZXJzaVx1MDBGM24gc2VyXHUwMEUxIHJlY2hhemFkYScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAvLyBcdTJCNTAgVGhlIG9ubHkgcGxhY2UgYSByZXAgbGVhcm5zIHRoZSBDb252ZXJ0IGJ1dHRvbiB3aWxsIHJlZnVzZVxuICAgICAgICAgICAgICAvLyB0aGVtIEJFRk9SRSB0aGV5IHByZXNzIGl0IFx1MjAxNCB1bnRpbCB0aGlzIGJhbm5lciwgdGhlIHJlZnVzYWxcbiAgICAgICAgICAgICAgLy8gZGlhbG9nIHdhcyB0aGUgZmlyc3QgdGhleSBoZWFyZCBvZiBpdC5cbiAgICAgICAgICAgICAgZW46XG4gICAgICAgICAgICAgICAgJ0EgcmV2aWV3ZXIgY2hlY2tlZCB0aGlzIGxlYWQgYW5kIHJlY29yZGVkIHRoYXQgaXQgcmVwZWF0cyBhIHJlY29yZCB0aGlzIGFwcCAnXG4gICAgICAgICAgICAgICAgKyAnYWxyZWFkeSBoYXMsIHNvIENvbnZlcnQgTGVhZCByZWZ1c2VzIGl0IFx1MjAxNCB0aGlzIGJhbm5lciBpcyB0aGUgb25seSB3YXJuaW5nICdcbiAgICAgICAgICAgICAgICArICd5b3UgZ2V0IGJlZm9yZSB5b3UgcHJlc3MgdGhlIGJ1dHRvbi4gRGlzcXVhbGlmeSB0aGlzIGxlYWQgaW5zdGVhZCwgbmFtaW5nICdcbiAgICAgICAgICAgICAgICArICd0aGUgc3Vydml2aW5nIHJlY29yZCBmcm9tIER1cGxpY2F0ZSBNYW5hZ2VtZW50IGJlbG93LiBJZiB0aGUgdmVyZGljdCBpcyAnXG4gICAgICAgICAgICAgICAgKyAnd3JvbmcsIGEgcmV2aWV3ZXIgcmV2aXNlcyBEdXBsaWNhdGUgU3RhdHVzOyB0aGVyZSBpcyBubyBvdmVycmlkZSBoZXJlLicsXG4gICAgICAgICAgICAgICd6aC1DTic6XG4gICAgICAgICAgICAgICAgJ1x1NUJBMVx1NjgzOFx1NEVCQVx1NURGMlx1NjgzOFx1NUI5RVx1OEJFNVx1N0VCRlx1N0QyMlx1NEUwRVx1N0NGQlx1N0VERlx1NEUyRFx1NURGMlx1NjcwOVx1OEJCMFx1NUY1NVx1OTFDRFx1NTkwRFx1RkYwQ1x1NTZFMFx1NkI2NFx1MzAwQ1x1OEY2Q1x1NjM2Mlx1N0VCRlx1N0QyMlx1MzAwRFx1NEYxQVx1NjJEMlx1N0VERFx1NjI2N1x1ODg0Q1x1MjAxNFx1MjAxNCdcbiAgICAgICAgICAgICAgICArICdcdTY3MkNcdTYzRDBcdTc5M0FcdTY2MkZcdTRGNjBcdTYzMDlcdTRFMEJcdTYzMDlcdTk0QUVcdTUyNERcdTU1MkZcdTRFMDBcdTc2ODRcdTk4ODRcdThCNjZcdTMwMDJcdThCRjdcdTY1MzlcdTRFM0FcdTUzRDZcdTZEODhcdThCRTVcdTdFQkZcdTdEMjJcdTc2ODRcdThENDRcdTY4M0NcdUZGMENcdTVFNzZcdTU3MjhcdTRFMEJcdTY1QjknXG4gICAgICAgICAgICAgICAgKyAnXHUzMDBDXHU5MUNEXHU1OTBEXHU3RUJGXHU3RDIyXHU3QkExXHU3NDA2XHUzMDBEXHU0RTJEXHU2Q0U4XHU2NjBFXHU0RkREXHU3NTU5XHU3Njg0XHU5MEEzXHU2NzYxXHU4QkIwXHU1RjU1XHUzMDAyXHU4MkU1XHU1MjI0XHU1QjlBXHU2NzA5XHU4QkVGXHVGRjBDXHU1RTk0XHU3NTMxXHU1QkExXHU2ODM4XHU0RUJBXHU0RkVFXHU2NTM5J1xuICAgICAgICAgICAgICAgICsgJ1x1MzAwQ1x1OTFDRFx1NTkwRFx1NzJCNlx1NjAwMVx1MzAwRFx1RkYwQ1x1NkI2NFx1NTkwNFx1NEUwRFx1NjNEMFx1NEY5Qlx1NUYzQVx1NTIzNlx1OEY2Q1x1NjM2Mlx1NzY4NFx1NTE2NVx1NTNFM1x1MzAwMicsXG4gICAgICAgICAgICAgICdqYS1KUCc6XG4gICAgICAgICAgICAgICAgJ1x1NjJDNVx1NUY1M1x1ODAwNVx1MzA0Q1x1NzhCQVx1OEE4RFx1MzA1N1x1MzAwMVx1MzA1M1x1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2Rlx1NjVFMlx1NUI1OFx1MzBFQ1x1MzBCM1x1MzBGQ1x1MzBDOVx1MzA2RVx1OTFDRFx1ODkwN1x1MzA2N1x1MzA0Mlx1MzA4Qlx1MzA2OFx1OEExOFx1OTMzMlx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMidcbiAgICAgICAgICAgICAgICArICdcdTMwNURcdTMwNkVcdTMwNUZcdTMwODFcdTMwMENcdTMwRUFcdTMwRkNcdTMwQzlcdTU5MDlcdTYzREJcdTMwMERcdTMwNkZcdTYyRDJcdTU0MjZcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTlcdTMwMDJcdTMwNTNcdTMwNkVcdTkwMUFcdTc3RTVcdTMwNENcdTMwMDFcdTMwRENcdTMwQkZcdTMwRjNcdTMwOTJcdTYyQkNcdTMwNTlcdTUyNERcdTMwNkJcdTVGOTdcdTMwODlcdTMwOENcdTMwOEInXG4gICAgICAgICAgICAgICAgKyAnXHU1NTJGXHU0RTAwXHUzMDZFXHU4QjY2XHU1NDRBXHUzMDY3XHUzMDU5XHUzMDAyXHUzMDUzXHUzMDZFXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDZGXHU0RTBEXHU5MDY5XHU2ODNDXHUzMDZCXHUzMDU3XHUzMDVGXHUzMDQ2XHUzMDQ4XHUzMDY3XHUzMDAxXHU0RTBCXHUzMDZFXHUzMDBDXHU5MUNEXHU4OTA3XHU3QkExXHU3NDA2XHUzMDBEXHUzMDY3XHU2QjhCXHUzMDU5J1xuICAgICAgICAgICAgICAgICsgJ1x1MzBFQ1x1MzBCM1x1MzBGQ1x1MzBDOVx1MzA5Mlx1NjYwRVx1OEExOFx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlx1NTIyNFx1NUI5QVx1MzA0Q1x1OEFBNFx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA4Qlx1NTgzNFx1NTQwOFx1MzA2Rlx1NjJDNVx1NUY1M1x1ODAwNVx1MzA0Q1x1MzAwQ1x1OTFDRFx1ODkwN1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOVx1MzAwRCdcbiAgICAgICAgICAgICAgICArICdcdTMwOTJcdTRGRUVcdTZCNjNcdTMwNTdcdTMwN0VcdTMwNTlcdTMwMDJcdTMwNTNcdTMwNTNcdTMwNkJcdTVGMzdcdTUyMzZcdTU5MDlcdTYzREJcdTMwNkVcdTYyNEJcdTZCQjVcdTMwNkZcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDInLFxuICAgICAgICAgICAgICAnZXMtRVMnOlxuICAgICAgICAgICAgICAgICdVbmEgcGVyc29uYSB2ZXJpZmljXHUwMEYzIHF1ZSBlc3RlIHByb3NwZWN0byByZXBpdGUgdW4gcmVnaXN0cm8gcXVlIHlhIGV4aXN0ZSwgJ1xuICAgICAgICAgICAgICAgICsgJ3BvciBsbyBxdWUgQ29udmVydGlyIFByb3NwZWN0byBsbyByZWNoYXphclx1MDBFMTogZXN0ZSBhdmlzbyBlcyBsYSBcdTAwRkFuaWNhICdcbiAgICAgICAgICAgICAgICArICdhZHZlcnRlbmNpYSBhbnRlcyBkZSBwdWxzYXIgZWwgYm90XHUwMEYzbi4gRGVzY2FsaWZpcXVlIGVsIHByb3NwZWN0byBlIGluZGlxdWUgJ1xuICAgICAgICAgICAgICAgICsgJ2VsIHJlZ2lzdHJvIHF1ZSBzb2JyZXZpdmUgZGVzZGUgR2VzdGlcdTAwRjNuIGRlIER1cGxpY2Fkb3MsIG1cdTAwRTFzIGFiYWpvLiBTaSBlbCAnXG4gICAgICAgICAgICAgICAgKyAndmVyZWRpY3RvIGVzIGluY29ycmVjdG8sIHVuYSBwZXJzb25hIGRlYmUgY2FtYmlhciBlbCBFc3RhZG8gZGVsIER1cGxpY2FkbzsgJ1xuICAgICAgICAgICAgICAgICsgJ2FxdVx1MDBFRCBubyBoYXkgZm9ybWEgZGUgZm9yemFyIGxhIGNvbnZlcnNpXHUwMEYzbi4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAvLyBTYWxlc2ZvcmNlLXN0eWxlIEhpZ2hsaWdodHMgUGFuZWw6IGEgaG9yaXpvbnRhbCBzdHJpcCBvZiB0aGVcbiAgICAgICAgLy8gbW9zdC1pbXBvcnRhbnQga2V5IGZhY3RzIGRpcmVjdGx5IHVuZGVyIHRoZSBoZWFkZXIuIFB1bGxlZCBvdXRcbiAgICAgICAgLy8gb2YgdGhlIHNpZGViYXIgc28gaXQgY2FuIHVzZSB0aGUgZnVsbCBwYWdlIHdpZHRoLlxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3JlY29yZDpoaWdobGlnaHRzJyxcbiAgICAgICAgICBpZDogJ2xlYWRfaGlnaGxpZ2h0cycsXG4gICAgICAgICAgbGFiZWw6ICdLZXkgSW5mb3JtYXRpb24nLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGZpZWxkczogWydzdGF0dXMnLCAncmF0aW5nJywgJ2xlYWRfc291cmNlJywgJ293bmVyX2lkJywgJ2VtYWlsJywgJ3Bob25lJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6cGF0aCcsXG4gICAgICAgICAgaWQ6ICdsZWFkX3BhdGgnLFxuICAgICAgICAgIGxhYmVsOiAnTGVhZCBTdGF0dXMgUGF0aCcsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgc3RhdHVzRmllbGQ6ICdzdGF0dXMnLFxuICAgICAgICAgICAgLy8gYGNvbnZlcnRlZGAgaXMgdGhlIHRlcm1pbmFsIFdJTiBzdGF0ZSBhbmQgbXVzdCBiZSBvbiB0aGUgcGF0aCBcdTIwMTRcbiAgICAgICAgICAgIC8vIHdpdGhvdXQgaXQgdGhlIHN0cmlwIHJlYWRzIGFzIGlmIFwiVW5xdWFsaWZpZWRcIiB3ZXJlIHRoZSBnb2FsLCBhbmRcbiAgICAgICAgICAgIC8vIGEgY29udmVydGVkIGxlYWQgaGFkIG5vIHN0YWdlIHRvIGxpZ2h0IHVwIGF0IGFsbC5cbiAgICAgICAgICAgIHN0YWdlczogW1xuICAgICAgICAgICAgICB7IHZhbHVlOiAnbmV3JywgbGFiZWw6ICdOZXcnIH0sXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICdjb250YWN0ZWQnLCBsYWJlbDogJ0NvbnRhY3RlZCcgfSxcbiAgICAgICAgICAgICAgeyB2YWx1ZTogJ3F1YWxpZmllZCcsIGxhYmVsOiAnUXVhbGlmaWVkJyB9LFxuICAgICAgICAgICAgICB7IHZhbHVlOiAnY29udmVydGVkJywgbGFiZWw6ICdDb252ZXJ0ZWQnIH0sXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICd1bnF1YWxpZmllZCcsIGxhYmVsOiAnVW5xdWFsaWZpZWQnIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG5cbiAgICB7XG4gICAgICBuYW1lOiAnbWFpbicsXG4gICAgICB3aWR0aDogJ2xhcmdlJyxcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwYWdlOnRhYnMnLFxuICAgICAgICAgIGlkOiAnbWFpbl90YWJzJyxcbiAgICAgICAgICBsYWJlbDogJ0xlYWQgSW5mb3JtYXRpb24gVGFicycsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgLy8gYHR5cGVgIFx1MjE5MiBgdGFiU3R5bGVgIChAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjAsICM2Nzc2LCBBRFItMDA4N1xuICAgICAgICAgICAgLy8gRDIpLiBTYW1lIHRocmVlIHZhbHVlczsgc2VlIHRoZSBmdWxsIG5vdGUgb24gYGhvbWUucGFnZS50c2AuXG4gICAgICAgICAgICB0YWJTdHlsZTogJ2xpbmUnLFxuICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnRGV0YWlscycsXG4gICAgICAgICAgICAgICAgaWNvbjogJ2luZm8tY2lyY2xlJyxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVjb3JkOmRldGFpbHMnLFxuICAgICAgICAgICAgICAgICAgICBpZDogJ2xlYWRfZGV0YWlscycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnTGVhZCBEZXRhaWxzJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgbGF5b3V0YCB3YXMgUkVNT1ZFRCBmcm9tIGByZWNvcmQ6ZGV0YWlsc2AgaW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjAgKCM2OTQ2LCBBRFItMDA4NyBEMikgYW5kIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlZCB3aXRoIG5vIHN1Y2Nlc3NvcjogaXRzIGBhdXRvYCB8IGBjdXN0b21gXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2VtYW50aWNzIHdlcmUgbmV2ZXIgaW1wbGVtZW50ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBzZWN0aW9uIGlzIGEgR1JPVVAgUkVGRVJFTkNFICgjODA2LCBtYWludGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVsaW5nIEMsIGRlY2lzaW9uIGJhdGNoICMyMSwgMjAyNi0wOS0wMykuIGB7IGdyb3VwIH1gXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbmFtZXMgb25lIG9mIGNybV9sZWFkJ3MgYGZpZWxkR3JvdXBzYCwgYW5kIHRoZSByZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcml2ZXMgdGhhdCBzZWN0aW9uJ3MgbWVtYmVycywgbGFiZWwsIGljb24gYW5kIGNvbGxhcHNlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGUgZnJvbSB0aGUgb2JqZWN0IChgZGVyaXZlRmllbGRHcm91cExheW91dGAsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQURSLTAwODUgXHUwMEE3NSkuIE1lbWJlcnNoaXAgaGFzIE9ORSBkZWNsYXJhdGlvbiBzaXRlIFx1MjAxNCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgZ3JvdXA6YCBvbiBlYWNoIGZpZWxkIGluIGxlYWQub2JqZWN0LnRzIFx1MjAxNCBhbmQgdGhpcyBwYWdlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY3VyYXRlcyBvbmx5IHRoZSBPUkRFUiwgc28gYSBmaWVsZCBhZGRlZCB0byBhIGdyb3VwIHNob3dzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdXAgaGVyZSB3aXRoIG5vIGVkaXQgdG8gdGhpcyBmaWxlLiBcdTI2RDQgRG8gbm90IGVudW1lcmF0ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBmaWVsZHM6YCBhZ2FpbiwgYW5kIGRvIG5vdCByZXN0YXRlIGEga2V5IHRoZSBncm91cCBvd25zXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKGBuYW1lYCAvIGBsYWJlbGAgLyBgaWNvbmAgLyBgY29sbGFwc2libGVgIC9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBgZGVmYXVsdENvbGxhcHNlZGApIGJlc2lkZSBgZ3JvdXBgOiB0aGUgc3BlYyByZWZ1c2VzIGJvdGguXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBcdTI2RDQgYHNlY3Rpb25zYCBzdGF5cyBsb2FkLWJlYXJpbmcuIE9taXR0aW5nIGl0IHJlbmRlcnMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBFTVBUWSBEZXRhaWxzIHRhYiwgbm90IGEgYGZpZWxkR3JvdXBzYCBmYWxsYmFjayAoIzgwNiBSMjhcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvbiAxNy4yLjAsICMxNTIxKTsgZGVyaXZhdGlvbiBpcyBwZXIgc2VjdGlvbiwgdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBncm91cDpgLCBuZXZlciBwYWdlLWxldmVsLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTWVhc3VyZWQgb24gQG9iamVjdHN0YWNrL2NvbnNvbGUgMTcuNi4wICgjODA2IFI3MCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkbGVzcyBDaHJvbWl1bSwgd2l0aCBhIGNvbnRyb2wgbGVnOyBvbiAxNy40LjAgUjYxXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZWQgdGhpcyBmb3JtIGNyYXNoaW5nIHRoZSBjb21wb25lbnQpLiBXaGF0IGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBncm91cCBzZWN0aW9uIGRvZXMgdGhlcmUgaXMgdGhlIHJlbmRlcmVyJ3MsIG5vdCBvdXJzOlxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBpdCBsYXlzIG91dCBpdHMgb3duIGNvbHVtbiBjb3VudCAodGhlIHBhZ2UtbGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYGNvbHVtbnNgIGFib3ZlIGRvZXMgbm90IHJlYWNoIGl0KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIC0gYSBncm91cCB3aG9zZSBtZW1iZXJzIGFyZSBhbGwgZW1wdHkgcmVuZGVycyBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgIChgZHVwbGljYXRlc2Agb24gYSBjbGVhbiBsZWFkKSwgdW5sZXNzIHRoZSBzZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHNheXMgYGhpZGVFbXB0eTogZmFsc2VgO1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBtZW1iZXJzIHRoZSBoaWdobGlnaHRzIHN0cmlwIHJlZ2lzdGVyZWQgYXJlIGRyb3BwZWQsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHNvIGBhc3NpZ25tZW50YCAob25seSBgb3duZXJfaWRgKSByZW5kZXJzIG5vdGhpbmcgb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcyBwYWdlIFx1MjAxNCB0aGUgb3duZXIgaXMgaW4gdGhlIHN0cmlwO1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBhIGdyb3VwIGRlY2xhcmVkIGBjb2xsYXBzZTogJ2NvbGxhcHNlZCdgIHN0YXJ0c1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb2xsYXBzZWQ7IGNoYW5naW5nIHRoYXQgaXMgYSBgZmllbGRHcm91cHNgIGRlY2lzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGluIGxlYWQub2JqZWN0LnRzLCBub3QgYSBrZXkgb24gdGhpcyBwYWdlLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYGhpZGVFbXB0eTogZmFsc2VgICgjMjAwMywgdGhlICMxMjExIHJlYXNvbmluZykgc2l0cyBvblxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBncm91cHMgd2hvc2UgZXZlcnkgbWVtYmVyIGEgcmVwIHR5cGVzIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybSBhc2tzIGZvcjogYGNvbnRhY3RfaW5mb2AgKGBtb2JpbGVgIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGB3ZWJzaXRlYCBvbmNlIHRoZSBzdHJpcCB0YWtlcyBgZW1haWxgIGFuZCBgcGhvbmVgKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgYWRkcmVzc2AsIGFuZCBgYWRkaXRpb25hbGAgKHJldmVudWUsIGhlYWRjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdGlvbiwgbm90ZXMpLiBXaXRob3V0IGl0IGFsbCB0aHJlZSB2YW5pc2ggb24gYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZyZXNoIGxlYWQsIHNvIGEgcmVwIGNhbm5vdCBzZWUgd2hhdCBpcyBsZWZ0IHRvIGZpbGwuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTm90IG9uIGBhc3NpZ25tZW50YDogaXRzIGRlcml2ZWQgbGlzdCBpcyBlbXB0eSwgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcmVyIGRyYXdzIG5vdGhpbmcgZm9yIGFuIGVtcHR5IGxpc3Qgd2hhdGV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgaGlkZUVtcHR5YCBzYXlzLiBOb3Qgb24gYGR1cGxpY2F0ZXNgOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgbGVhZF9kdXBsaWNhdGVfY2hlY2tgIGhvb2sgd3JpdGVzIGl0LlxuICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGdyb3VwOiAnaWRlbnRpdHknIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGdyb3VwOiAnY29tcGFueV9pbmZvJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ2NvbnRhY3RfaW5mbycsIGhpZGVFbXB0eTogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIE5vdCBDYWxsIC8gRW1haWwgT3B0IE91dCwgcmlnaHQgdW5kZXIgdGhlIG51bWJlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcmVwIGlzIGFib3V0IHRvIGRpYWwgKCM4MDYpLlxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ3ByZWZlcmVuY2VzJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ3F1YWxpZmljYXRpb24nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGdyb3VwOiAnYXNzaWdubWVudCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZ3JvdXA6ICdhZGRyZXNzJywgaGlkZUVtcHR5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ2NvbnZlcnNpb24nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgTElOSyBoYWxmIG9mIHRoZSBkdXBsaWNhdGUgYmFubmVycyAoIzEyMDcpOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdyb3VwIGNhcnJpZXMgYm90aCBzdXJ2aXZvciBsb29rdXBzLCBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgbGVhZF9kdXBsaWNhdGVfY2hlY2tgIG1hdGNoZXMgY29udGFjdHMgYmVmb3JlIGxlYWRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT24gYSBjbGVhbiBsZWFkIGV2ZXJ5IG1lbWJlciBpcyBlbXB0eSwgc28gdGhlIHNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcnMgbm90aGluZy4gXHUyNkEwXHVGRTBGIE5vdCB0aGUgaGlnaGxpZ2h0cyBzdHJpcDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGByZWNvcmQ6aGlnaGxpZ2h0c2AgY2FwcyBgZmllbGRzYCBhdCA3IGFuZCBob2xkcyA2LlxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ2R1cGxpY2F0ZXMnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXNjcmlwdGlvbiBhbmQgTm90ZXMgXHUyMDE0IGtlcHQgbGFzdCwgd2hlcmUgdGhlIHBhZ2Unc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVzY3JpcHRpb24gc2VjdGlvbiBhbHdheXMgc2F0LlxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ2FkZGl0aW9uYWwnLCBoaWRlRW1wdHk6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnUmVsYXRlZCcsXG4gICAgICAgICAgICAgICAgaWNvbjogJ2xpbmsnLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwYWdlOmFjY29yZGlvbicsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAncmVsYXRlZF9hY2NvcmRpb24nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1JlbGF0ZWQgUmVjb3JkcycsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBhbGxvd011bHRpcGxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnVGFza3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnbGlzdC1jaGVja3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6cmVsYXRlZF9saXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAncmVsYXRlZF90YXNrcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1Rhc2tzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV90YXNrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JtX3Rhc2sgbGlua3MgYmFjayB0aHJvdWdoIHRoZSBwb2x5bW9ycGhpY1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgcmVsYXRlZF90b19sZWFkYCBsb29rdXA7IHRoZXJlIGlzIG5vIGBsZWFkX2lkYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2x1bW4sIHNvIHRoZSBvbGQgYmluZGluZyBtYXRjaGVkIG5vdGhpbmcgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbGlzdCByZWFkIFwiMFwiIG5vIG1hdHRlciBob3cgbWFueSBmb2xsb3ctdXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXAgaGFkIGZpbGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBGaWVsZDogJ3JlbGF0ZWRfdG9fbGVhZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6IFsnc3ViamVjdCcsICdzdGF0dXMnLCAncHJpb3JpdHknLCAnZHVlX2RhdGUnLCAnb3duZXJfaWQnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdkdWVfZGF0ZScsIG9yZGVyOiAnYXNjJyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdPcGVuIFRhc2tzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ3N0YXR1cycsIG9wZXJhdG9yOiAnbm90X2VxdWFscycsIHZhbHVlOiAnY29tcGxldGVkJyB9XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1ZpZXdBbGw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FjdGl2aXR5JyxcbiAgICAgICAgICAgICAgICBpY29uOiAnY2xvY2snLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6YWN0aXZpdHknLFxuICAgICAgICAgICAgICAgICAgICBpZDogJ2xlYWRfYWN0aXZpdHknLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0FjdGl2aXR5IFRpbWVsaW5lJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGB0eXBlc2AgaXMga2V5ZWQgb24gRkVFRCBJVEVNIEtJTkQsIG5ldmVyIG9uIG9iamVjdCBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKCMxMjA5KS4gVGhlIG9sZCBgWydjcm1fdGFzayddYCB3YXMgbm90IG9uZSBvZiB0aGUga2luZHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvcCBhY2NlcHRzLCBhbmQgbm90aGluZyBhbnl3aGVyZSBlbmZvcmNlZCB0aGF0OiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwYWdlIHNjaGVtYSdzIGBwcm9wZXJ0aWVzYCBpcyBhbiBvcGVuIGJhZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIChgei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpYCkgc28gdGhlIHZhbHVlIHdhc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlZCB2ZXJiYXRpbSwgYW5kIHRoZSByZW5kZXJlcidzIG93biBzYW5pdGlzZXIgZHJvcHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBtZW1iZXJzIGl0IGRvZXMgbm90IHJlY29nbmlzZSBhbmQgdGhlbiByZWFkcyB0aGUgRU1QVFlcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZW1haW5kZXIgYXMgXCJubyBmaWx0ZXIgYXV0aG9yZWRcIiBcdTIwMTQgbWVhc3VyZWQgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2hpcHBlZCBidW5kbGUsIGB0eXBlczogWydjcm1fdGFzayddYCwgYHR5cGVzOiBbXWAgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb21pdHRpbmcgYHR5cGVzYCBhbGwgcmVuZGVyIHRoZSBzYW1lIHVuZmlsdGVyZWQgc3RyZWFtLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoYXQgaXMgd2h5IHRoZSB0YWIgc2hvd2VkIGBDcmVhdGVkIExlYWRgIC8gYFVwZGF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBMZWFkYCBhdWRpdCByb3dzLCB3aGljaCB0aGUgSGlzdG9yeSB0YWIgYWxyZWFkeSBjb3ZlcnMuXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBXaGF0IHRoaXMgY29tcG9uZW50IGNhbiBhY3R1YWxseSBzaG93IGlzIGBzeXNfYWN0aXZpdHlgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2NvcGVkIHRvIHRoZSByZWNvcmQsIHRocm91Z2ggdGhlIHJlbmRlcmVyJ3Mgb3duXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBtYXAgXHUyMDE0IG1lYXN1cmVkLCBub3QgaW5mZXJyZWQ6XG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIHN5c19hY3Rpdml0eS50eXBlICAgICAgZmVlZCBraW5kICAgICAgd3JpdHRlbiBieVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgY3JlYXRlZC91cGRhdGVkL1x1MjAyNiAgICAgIGZpZWxkX2NoYW5nZSAgIHBsYXRmb3JtIGF1ZGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBzeXN0ZW0gICAgICAgICAgICAgICAgIHN5c3RlbSAgICAgICAgIHBsYXRmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBjb21wbGV0ZWQgICAgICAgICAgICAgIHRhc2sgICAgICAgICAgIGxvZ19jYWxsIC9cbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21lZXRpbmcgL1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX2VtYWlsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBzY2hlZHVsZWQgICAgICAgICAgICAgIChkcm9wcGVkKSAgICAgIHNjaGVkdWxlX21lZXRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFNvIGB0YXNrYCBpcyB0aGUga2luZCB0aGF0IGNhcnJpZXMgYSByZXAncyBsb2dnZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcmFjdGlvbnMsIGFuZCBpdCBpcyB0aGUgb25seSByZWFjaGFibGUgb25lIHdvcnRoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmlsdGVyaW5nIHRvLiBgZXZlbnRgIGlzIE5PVCBhZGRlZDogaXQgaXMgYSBsZWdhbCBraW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3AgYWNjZXB0cyBidXQgbm8gYHN5c19hY3Rpdml0eS50eXBlYCBtYXBzIHRvIGl0LFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIGl0IHdvdWxkIGJlIGEgZGVjbGFyZWQgdmFsdWUgZW5mb3JjZWQgYnkgbm90aGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBgc2NoZWR1bGVkYCByb3dzIGZhbGwgb3V0IG9mIHRoZSBtYXAgdXBzdHJlYW0gXHUyMDE0IGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwbGF0Zm9ybSBnYXAsIG5vdCBzb21ldGhpbmcgdG8gd29yayBhcm91bmQgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlczogWyd0YXNrJ10sXG4gICAgICAgICAgICAgICAgICAgICAgbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIExvYWQtYmVhcmluZywgbm90IGNvc21ldGljOiB0aGUgcmVuZGVyZXIgc3RyaXBzIGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYHRhc2tgIGl0ZW0gQkVGT1JFIHRoZSBgdHlwZXNgIGZpbHRlciBydW5zIHVubGVzcyB0aGlzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSwgYW5kIGB0YXNrYCBpdGVtcyBhcmUgZXhhY3RseSB0aGUgYGNvbXBsZXRlZGAgcm93cy5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBgdHlwZXM6IFsndGFzayddYCB3aXRoIHRoZSBvbGQgYHNob3dDb21wbGV0ZWQ6IGZhbHNlYFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcnMgYW4gZW1wdHkgdGFiLlxuICAgICAgICAgICAgICAgICAgICAgIHNob3dDb21wbGV0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0hpc3RvcnknLFxuICAgICAgICAgICAgICAgIGljb246ICdoaXN0b3J5JyxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBgcmVjb3JkOmhpc3RvcnlgIGlzIHRoZSBwbGF0Zm9ybSdzIG93biBhdWRpdCBmZWVkIG92ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkcyBtYXJrZWQgYHRyYWNrSGlzdG9yeWAgKHN0YXR1cyAvIHJhdGluZykuIE93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlZCB0byB0aGUgcGxhdGZvcm0ncyBgb3duZXJfaWRgIGluICM1NDgsIHdoaWNoIGNhcnJpZXMgbm9cbiAgICAgICAgICAgICAgICAgICAgLy8gYHRyYWNrSGlzdG9yeWAgZmxhZyBcdTIwMTQgdHJhbnNmZXJzIGxhbmQgaW4gdGhlIGNvbXBsaWFuY2UgYXVkaXRcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nLCBub3Qgb24gdGhpcyBmZWVkLlxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaGFuZC1yb2xsZWQgdmVyc2lvbiBxdWVyaWVkIGFuIG9iamVjdCBuYW1lZFxuICAgICAgICAgICAgICAgICAgICAvLyBgZmllbGRfaGlzdG9yeWAsIHdoaWNoIHRoaXMgYXBwIGRvZXMgbm90IGRlZmluZSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHRhYiBjb3VsZCBvbmx5IGV2ZXIgcmVuZGVyIGVtcHR5LlxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVjb3JkOmhpc3RvcnknLFxuICAgICAgICAgICAgICAgICAgICBpZDogJ2xlYWRfaGlzdG9yeScsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnRmllbGQgSGlzdG9yeScsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBsaW1pdDogMjUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIF0sXG5cbiAgLy8gTWFrZSB0aGlzIHRoZSBkZWZhdWx0IHBhZ2UgZm9yIGxlYWRzXG4gIGlzRGVmYXVsdDogdHJ1ZSxcblxuICAvLyBBUklBIGFjY2Vzc2liaWxpdHlcbiAgYXJpYToge1xuICAgIGFyaWFMYWJlbDogJ0xlYWQgRGV0YWlsIFBhZ2UnLFxuICAgIGFyaWFEZXNjcmliZWRCeTogJ0RldGFpbGVkIHZpZXcgb2YgbGVhZCBpbmZvcm1hdGlvbiB3aXRoIHJlbGF0ZWQgcmVjb3JkcyBhbmQgYWN0aXZpdHknLFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL29wcG9ydHVuaXR5X2RldGFpbC5wYWdlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL29wcG9ydHVuaXR5X2RldGFpbC5wYWdlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQYWdlIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKipcbiAqIE9wcG9ydHVuaXR5IERldGFpbCBSZWNvcmQgUGFnZVxuICpcbiAqIFNhbGVzZm9yY2UgTGlnaHRuaW5nLXN0eWxlIHJlY29yZCBwYWdlIGZvciB0aGUgYGNybV9vcHBvcnR1bml0eWAgb2JqZWN0LlxuICogTWlycm9ycyB0aGUgbGVhZF9kZXRhaWwgYmx1ZXByaW50OiBzaW5nbGUtY29sdW1uIGZ1bGwtd2lkdGggbGF5b3V0IHdpdGhcbiAqIGEgTGlnaHRuaW5nLXN0eWxlIGhlYWRlciBjaGlwLCBwcmltYXJ5IGFjdGlvbiwga2V5IGhpZ2hsaWdodHMgc3RyaXAgYW5kXG4gKiBzdGF0dXMgcGF0aCwgdGhlbiBhIHRhYiBzdHJpcCBiZWxvdy4gTm8gc2lkZWJhciBcdTIwMTQgc2Vjb25kYXJ5IHdpZGdldHMgc3VjaFxuICogYXMgdGhlIEFJIGFzc2lzdGFudCBsaXZlIGluIHRoZSBmbG9hdGluZyBjb25zb2xlIGNoYXQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9wcG9ydHVuaXR5RGV0YWlsUGFnZTogUGFnZSA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X2RldGFpbF9wYWdlJyxcbiAgbGFiZWw6ICdPcHBvcnR1bml0eSBEZXRhaWwnLFxuICBkZXNjcmlwdGlvbjogJ0NvbXByZWhlbnNpdmUgb3Bwb3J0dW5pdHkgZGV0YWlsIHBhZ2Ugd2l0aCBwYXRoLCBoaWdobGlnaHRzLCBkZXRhaWxzLCBhbmQgcmVsYXRlZCBsaXN0cycsXG5cbiAgdHlwZTogJ3JlY29yZCcsXG4gIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScsXG5cbiAgdGVtcGxhdGU6ICdmdWxsLXdpZHRoJyxcbiAga2luZDogJ2Z1bGwnLFxuICB2YXJpYWJsZXM6IFtcbiAgICB7IG5hbWU6ICdhY3RpdmVUYWInLCB0eXBlOiAnc3RyaW5nJywgZGVmYXVsdFZhbHVlOiAnZGV0YWlscycgfSxcbiAgXSxcblxuICByZWdpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2hlYWRlcicsXG4gICAgICB3aWR0aDogJ2Z1bGwnLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BhZ2U6aGVhZGVyJyxcbiAgICAgICAgICBpZDogJ29wcF9oZWFkZXInLFxuICAgICAgICAgIGxhYmVsOiAnT3Bwb3J0dW5pdHkgSW5mb3JtYXRpb24nLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRpdGxlOiAne25hbWV9JyxcbiAgICAgICAgICAgIC8vIFRoZSBsb29rdXAgZmllbGQgaXMgYGNybV9hY2NvdW50YCBcdTIwMTQgYHthY2NvdW50fWAgbWF0Y2hlZCBub3RoaW5nXG4gICAgICAgICAgICAvLyBhbmQgdGhlIHN1YnRpdGxlIHJlbmRlcmVkIGJsYW5rLlxuICAgICAgICAgICAgc3VidGl0bGU6ICd7Y3JtX2FjY291bnR9JyxcbiAgICAgICAgICAgIC8vIGBpY29uYCByZW1vdmVkIGZyb20gYHBhZ2U6aGVhZGVyYCBpbiBAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjBcbiAgICAgICAgICAgIC8vICgjNjk0NiwgQURSLTAwODcgRDIpIFx1MjAxNCBkZWxldGVkLCBub3QgcmVuYW1lZC4gU2VlIHRoZSBmdWxsIG5vdGUgb25cbiAgICAgICAgICAgIC8vIGBhY2NvdW50X2RldGFpbC5wYWdlLnRzYDsgbm90aGluZyBldmVyIGRyZXcgaXQuXG4gICAgICAgICAgICAvLyBgYnJlYWRjcnVtYmAgcmV0aXJlZCBmcm9tIGBwYWdlOmhlYWRlcmAgaW4gQG9iamVjdHN0YWNrL3NwZWMgMTcuNi4wXG4gICAgICAgICAgICAvLyAoIzIwNzg1LCBgcGFnZS1oZWFkZXItYnJlYWRjcnVtYi1yZW1vdmVkYCkgXHUyMDE0IGRlbGV0ZWQ6IG5vIHJlbmRlcmVyXG4gICAgICAgICAgICAvLyBldmVyIGRyZXcgYSB0cmFpbCBmb3IgaXQ7IHRoZSBhcHAgc2hlbGwncyBvd24gdHJhaWwgaXMgdW5jaGFuZ2VkLlxuICAgICAgICAgICAgLy8gZ2VuZXJhdGVfcXVvdGUgaXMgdGhlIENQUSBlbnRyeSBwb2ludCAob3Bwb3J0dW5pdHkgXHUyMTkyIHF1b3RlKTsgYVxuICAgICAgICAgICAgLy8gY3VzdG9tIHJlY29yZCBwYWdlIHJlcGxhY2VzIHRoZSBkZWZhdWx0IGhlYWRlciwgc28gdGhlIGFjdGlvblxuICAgICAgICAgICAgLy8gbXVzdCBiZSBsaXN0ZWQgaGVyZSBleHBsaWNpdGx5IG9yIGl0IGlzIHVucmVhY2hhYmxlLiBUaGUgc2FtZVxuICAgICAgICAgICAgLy8gc2VudGVuY2UgaXMgd2h5IHRoZSB0aHJlZSBhY3Rpdml0eSBhY3Rpb25zIGFyZSBuYW1lZCBoZXJlICgjNTkyKTpcbiAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhlbSBhIHJlcCBjYW4gbG9nIGEgY2FsbCBvbiB0aGUgZGVhbCBvbmx5IGZyb20gdGhlIGxpc3RcbiAgICAgICAgICAgIC8vIHJvdydzIFx1MjJFRSBtZW51LCBuZXZlciBmcm9tIHRoZSBkZWFsIGl0c2VsZi5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBBY3Rpb24gSURzLCBub3QgYEFjdGlvbkRlZmAgb2JqZWN0czogYFBhZ2VIZWFkZXJQcm9wcy5hY3Rpb25zYCBpc1xuICAgICAgICAgICAgLy8gYHouYXJyYXkoei5zdHJpbmcoKSlgIChcIkFjdGlvbiBJRHMgdG8gc2hvdyBpbiBoZWFkZXJcIikgaW5cbiAgICAgICAgICAgIC8vIEBvYmplY3RzdGFjay9zcGVjIDE3LjMuMCwgYW5kIHRoaXMgcmVwbyBhdXRob3JzIGFnYWluc3QgdGhlXG4gICAgICAgICAgICAvLyBwcm90b2NvbCAoIzE2NTMpLiBFYWNoIGlkIGlzIHRoZSBgbmFtZWAgb2YgYVxuICAgICAgICAgICAgLy8gY3JtX29wcG9ydHVuaXR5LXNjb3BlZCBhY3Rpb24gXHUyMDE0IGBnZW5lcmF0ZV9xdW90ZWAgL1xuICAgICAgICAgICAgLy8gYGNsb25lX29wcG9ydHVuaXR5YCBpbiBgc3JjL3NhbGVzL2FjdGlvbnMvb3Bwb3J0dW5pdHkuYWN0aW9ucy50c2AsIHRoZVxuICAgICAgICAgICAgLy8gYWN0aXZpdHkgdHJpbyBpbiBgc3JjL3NhbGVzL2FjdGlvbnMvYWN0aXZpdHktYWN0aW9ucy50c2AuXG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICdnZW5lcmF0ZV9xdW90ZScsXG4gICAgICAgICAgICAgICdjbG9uZV9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICdsb2dfY2FsbCcsXG4gICAgICAgICAgICAgICdsb2dfbWVldGluZycsXG4gICAgICAgICAgICAgICdzY2hlZHVsZV9tZWV0aW5nJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6aGlnaGxpZ2h0cycsXG4gICAgICAgICAgaWQ6ICdvcHBfaGlnaGxpZ2h0cycsXG4gICAgICAgICAgbGFiZWw6ICdLZXkgSW5mb3JtYXRpb24nLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGZpZWxkczogWydhbW91bnQnLCAnY2xvc2VfZGF0ZScsICdwcm9iYWJpbGl0eScsICdleHBlY3RlZF9yZXZlbnVlJywgJ293bmVyX2lkJywgJ2NybV9hY2NvdW50J10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6cGF0aCcsXG4gICAgICAgICAgaWQ6ICdvcHBfc3RhZ2VfcGF0aCcsXG4gICAgICAgICAgbGFiZWw6ICdPcHBvcnR1bml0eSBTdGFnZSBQYXRoJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBzdGF0dXNGaWVsZDogJ3N0YWdlJyxcbiAgICAgICAgICAgIC8vIEV2ZXJ5IGNhbm9uaWNhbCB2YWx1ZSBvZiBgc3RhZ2VgIG11c3QgYXBwZWFyIGhlcmUsIGluIGZ1bm5lbFxuICAgICAgICAgICAgLy8gb3JkZXIgXHUyMDE0IHRoZSBwYXRoIGlzIHRoZSBvbmx5IHBsYWNlIGEgcmVwIHJlYWRzIFwid2hlcmUgaXMgdGhpc1xuICAgICAgICAgICAgLy8gZGVhbFwiLiBgbmVlZHNfYW5hbHlzaXNgIHdhcyBtaXNzaW5nLCBzbyBhIGRlYWwgc2l0dGluZyBpbiB0aGF0XG4gICAgICAgICAgICAvLyBzdGFnZSBsaXQgdXAgTk8gc3RlcCBhdCBhbGwgYW5kIHRoZSBzdHJpcCByZWFkIGFzIGlmIHRoZSBkZWFsXG4gICAgICAgICAgICAvLyBoYWQgc2tpcHBlZCBmcm9tIFF1YWxpZmljYXRpb24gdG8gUHJvcG9zYWwuIFRoZSB0d28gdGVybWluYWxcbiAgICAgICAgICAgIC8vIHN0YWdlcyBzdGF5IGxhc3QgKHdvbiBiZWZvcmUgbG9zdCksIG1hdGNoaW5nIGxlYWRfZGV0YWlsJ3NcbiAgICAgICAgICAgIC8vIGNvbnZlcnRlZC91bnF1YWxpZmllZCB0YWlsLlxuICAgICAgICAgICAgc3RhZ2VzOiBbXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICdwcm9zcGVjdGluZycsIGxhYmVsOiAnUHJvc3BlY3RpbmcnIH0sXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICdxdWFsaWZpY2F0aW9uJywgbGFiZWw6ICdRdWFsaWZpY2F0aW9uJyB9LFxuICAgICAgICAgICAgICB7IHZhbHVlOiAnbmVlZHNfYW5hbHlzaXMnLCBsYWJlbDogJ05lZWRzIEFuYWx5c2lzJyB9LFxuICAgICAgICAgICAgICB7IHZhbHVlOiAncHJvcG9zYWwnLCBsYWJlbDogJ1Byb3Bvc2FsJyB9LFxuICAgICAgICAgICAgICB7IHZhbHVlOiAnbmVnb3RpYXRpb24nLCBsYWJlbDogJ05lZ290aWF0aW9uJyB9LFxuICAgICAgICAgICAgICB7IHZhbHVlOiAnY2xvc2VkX3dvbicsIGxhYmVsOiAnQ2xvc2VkIFdvbicgfSxcbiAgICAgICAgICAgICAgeyB2YWx1ZTogJ2Nsb3NlZF9sb3N0JywgbGFiZWw6ICdDbG9zZWQgTG9zdCcgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnbWFpbicsXG4gICAgICB3aWR0aDogJ2xhcmdlJyxcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwYWdlOnRhYnMnLFxuICAgICAgICAgIGlkOiAnb3BwX21haW5fdGFicycsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgLy8gYHR5cGVgIFx1MjE5MiBgdGFiU3R5bGVgIChAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjAsICM2Nzc2LCBBRFItMDA4N1xuICAgICAgICAgICAgLy8gRDIpLiBTYW1lIHRocmVlIHZhbHVlczsgc2VlIHRoZSBmdWxsIG5vdGUgb24gYGhvbWUucGFnZS50c2AuXG4gICAgICAgICAgICB0YWJTdHlsZTogJ2xpbmUnLFxuICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIFRhYiBpdGVtIGBrZXlgIFx1MjE5MiBgdmFsdWVgICgjMTI2OSk6IGB2YWx1ZWAgaXMgdGhlIHN0YWJsZVxuICAgICAgICAgICAgICAgIC8vIGA/dGFiPWAgVVJMIHRva2VuIHRoZSByZW5kZXJlciByZWFkcywgYGtleWAgaXMgcmVhZCBieVxuICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcuIFNlZSB0aGUgZnVsbCBub3RlIG9uIGBjYXNlX2RldGFpbC5wYWdlLnRzYC5cbiAgICAgICAgICAgICAgICB2YWx1ZTogJ2RldGFpbHMnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnRGV0YWlscycsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlY29yZDpkZXRhaWxzJyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdvcHBfZGV0YWlscycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnT3Bwb3J0dW5pdHkgRGV0YWlscycsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgY29sdW1uc2AgaXMgYSBTVFJJTkcgZW51bSAoJzEnfCcyJ3wnMyd8JzQnKSBpblxuICAgICAgICAgICAgICAgICAgICAgIC8vIEBvYmplY3RzdGFjay9zcGVjIDE3LiBgbGF5b3V0YCBpcyBnb25lIChyZW1vdmVkIGluIHNwZWNcbiAgICAgICAgICAgICAgICAgICAgICAvLyAxNy4wLjAsICM2OTQ2IC8gQURSLTAwODcgRDIpLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBzZWN0aW9uIHJlZmVyZW5jZXMgb25lIG9mIGNybV9vcHBvcnR1bml0eSdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYGZpZWxkR3JvdXBzYCAoIzE0NTIsIHRoZSAjODA2IGNsYXNzIHJ1bGluZyBDKTogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyZXIgZGVyaXZlcyBtZW1iZXJzLCBsYWJlbCwgaWNvbiBhbmQgY29sbGFwc2Ugc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBvYmplY3QsIHNvIHRoaXMgcGFnZSBjdXJhdGVzIG9ubHkgdGhlIG9yZGVyLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmdWxsIG5vdGUgXHUyMDE0IHdoYXQgYSBncm91cCBzZWN0aW9uIGRvZXMgb24gMTcuNi4wIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdoYXQgbWF5IG5vdCBzaXQgYmVzaWRlIGBncm91cGAgXHUyMDE0IGlzIG9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYGxlYWRfZGV0YWlsLnBhZ2UudHNgLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGhpZ2hsaWdodHMgc3RyaXAgc3RpbGwgd2lucyAoIzEyMTEpOiB0aGUgcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wcyBldmVyeSBmaWVsZCBgcmVjb3JkOmhpZ2hsaWdodHNgIHJlZ2lzdGVyZWQsIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgdGl0bGUsIGZyb20gdGhlIGRlcml2ZWQgbWVtYmVycy4gU28gYGJhc2ljYCBzaG93c1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGBwcmltYXJ5X2NvbnRhY3RgIG9ubHksIGFuZCBgZmluYW5jaWFsc2AgKGBhbW91bnRgLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBleHBlY3RlZF9yZXZlbnVlYCwgYm90aCBpbiB0aGUgc3RyaXApIHJlbmRlcnMgbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgXHUyMDE0IGl0IHN0YXlzIHJlZmVyZW5jZWQgc28gdGhhdCBhIGZpZWxkIGFkZGVkIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGdyb3VwIHJlYWNoZXMgdGhpcyB0YWIgd2l0aG91dCBhbiBlZGl0IHRvIHRoaXMgZmlsZS5cbiAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGBoaWRlRW1wdHk6IGZhbHNlYCBrZWVwcyBhbiBBTEwtZW1wdHkgc2VjdGlvbiBvbiBzY3JlZW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyAoIzEyMTEpLiBUaGUgcGxhdGZvcm0gZGVmYXVsdCAob2JqZWN0dWkjODYwMyBydWxpbmcgQSlcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXJzIHN1Y2ggYSBzZWN0aW9uIGFzIG5vdGhpbmcgYXQgYWxsLCBzbyBvbiBhIGRlYWxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIG9ubHkgaXRzIHJlcXVpcmVkIGZpZWxkcyB0aGUgZGVhbCdzIHR5cGUgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc291cmNlIChgY2xhc3NpZmljYXRpb25gKSwgaXRzIGNhbXBhaWduIChgY2FtcGFpZ25gKVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBpdHMgZGVzY3JpcHRpb24gYW5kIG5leHQgc3RlcCAoYG5vdGVzYCkgdmFuaXNoZWQgXHUyMDE0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHZlcnkgZmllbGRzIGEgc2VsbGVyIGZpbGxzIGluIGxhdGVyLiBLZXB0LCB0aGV5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyBhcyBsYWJlbGxlZCBlbXB0eSByb3dzIHRvIGZpbGwuIE1lYXN1cmVkIG9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gMTcuNi4wIG9uIHN1Y2ggYSBkZWFsOiAyIHNlY3Rpb25zIHJlbmRlciB3aXRob3V0IGl0LCA1XG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBpdC4gTm90IG9uIGBiYXNpY2AgKGl0cyBvbmx5IG1lbWJlciBvdXRzaWRlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRpdGxlIGFuZCB0aGUgc3RyaXAgaXMgYHByaW1hcnlfY29udGFjdGApLCBub3Igb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBgZmluYW5jaWFsc2A6IGJvdGggbWVtYmVycyBzaXQgaW4gdGhlIHN0cmlwLCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmVkIGxpc3QgaXMgZW1wdHksIGFuZCB0aGUgcmVuZGVyZXIgZHJhd3Mgbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhbiBlbXB0eSBsaXN0IHdoYXRldmVyIGBoaWRlRW1wdHlgIHNheXMuXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBgcXVhbGlmaWNhdGlvbmAgYW5kIGBuYXJyYXRpdmVgIChSRVEtMDAwNikgc2l0IHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgYHNhbGVzX3Byb2Nlc3NgLCB0aGUgb3JkZXIgdGhlIG9iamVjdCBkZWNsYXJlc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW0gaW4sIGFuZCBib3RoIGtlZXAgYGhpZGVFbXB0eTogZmFsc2VgIG9uIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVhc29uaW5nOiBldmVyeSBtZW1iZXIgaXMgYSBqdWRnZW1lbnQgb3IgYSBwaWVjZSBvZlxuICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3NlIHRoZSBzZWxsZXIgaXMgZXhwZWN0ZWQgdG8gd3JpdGUgKGJpZCAvIG5vLWJpZCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb250cm9sbGFiaWxpdHksIHByaW9yaXR5LCBkZWFsIGxldmVsLCBzdWJjb250cmFjdGluZztcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZm91ciBuYXJyYXRpdmUgZmllbGRzKSwgbm9uZSBzaXRzIGluIHRoZSBzdHJpcCwgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZGVhbCB0aGF0IHByZWRhdGVzIFJFUS0wMDA2IGNhcnJpZXMgYW55IG9mIHRoZW0gXHUyMDE0IHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCB0aGUga2V5IGJvdGggc2VjdGlvbnMgdmFuaXNoIG9uIGV2ZXJ5IGV4aXN0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVhbCwgd2hpY2ggaXMgZXhhY3RseSB3aGVyZSBhIHNlbGxlciB3b3VsZCBmaWxsIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZ3JvdXA6ICdiYXNpYycgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZ3JvdXA6ICdmaW5hbmNpYWxzJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ2NsYXNzaWZpY2F0aW9uJywgaGlkZUVtcHR5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ2NhbXBhaWduJywgaGlkZUVtcHR5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ3NhbGVzX3Byb2Nlc3MnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGdyb3VwOiAncXVhbGlmaWNhdGlvbicsIGhpZGVFbXB0eTogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZ3JvdXA6ICduYXJyYXRpdmUnLCBoaWRlRW1wdHk6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGdyb3VwOiAnY3JtX2ZvcmVjYXN0JyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ25vdGVzJywgaGlkZUVtcHR5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ3JlbGF0ZWQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnUmVsYXRlZCcsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3BhZ2U6YWNjb3JkaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdvcHBfcmVsYXRlZF9hY2NvcmRpb24nLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW9uIGl0ZW0gYGtleWAgaXMgREVMRVRFRCwgbm90IHJlbmFtZWQgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHZhbHVlYCBcdTIwMTQgdGhlIG9wcG9zaXRlIHZlcmRpY3QgdG8gdGhlIHRhYiBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhYm92ZSwgYmVjYXVzZSB0aGlzIHJlbmRlcmVyIG92ZXJ3cml0ZXMgYHZhbHVlYCB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBwYW5lbC08aW5kZXg+YC4gU2VlIHRoZSBmdWxsIG5vdGUgb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGNhc2VfZGV0YWlsLnBhZ2UudHNgLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1F1b3RlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QRU4gb24gYXJyaXZhbCAoIzEyMTQgaXRlbSA2KS4gQWxsIHRocmVlIHBhbmVsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VkIHRvIHN0YXJ0IHNodXQsIHNvIHRoZSBSZWxhdGVkIHRhYiBvcGVuZWQgb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWUgY2xvc2VkIGJhcnMgd2hvc2UgaGVhZGVycyBhbHJlYWR5IGNhcnJpZWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50cyBcdTIwMTQgdGhlIGNsaWNrIGJvdWdodCB0aGUgdXNlciBub3RoaW5nIHRoZSBwYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhZCBub3QgYWxyZWFkeSB0b2xkIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBjb2xsYXBzZWQ6IGZhbHNlYCBpcyB0aGUgd2hvbGUgbWVjaGFuaXNtLCBhbmQgaXQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZGVkIGV2ZW4gdGhvdWdoIHRoZSBzY2hlbWEgREVGQVVMVFMgaXQgdG8gZmFsc2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZW5kZXJlciBvcGVucyB0aGUgcGFuZWxzIGl0IGZpbmRzIGJ5IHN0cmljdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZGVudGl0eSBcdTIwMTQgYGl0ZW1zLmZpbHRlcihpID0+IGkuY29sbGFwc2VkID09PSBmYWxzZSlgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFx1MjAxNCBzbyBhbiBpdGVtIHRoYXQgc2ltcGx5IG9taXRzIHRoZSBrZXkgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHVuZGVmaW5lZGAsIG5vdCBgZmFsc2VgLCBhbmQgc3RheXMgc2h1dC4gTWVhc3VyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gdGhlIEBvYmplY3RzdGFjay9jb25zb2xlIDE3LjMuMCBidW5kbGUgXHUyMDE0IHRoZSBwaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhhdCB0YWtpbmcsIFx1MjZENCBOT1QgcmUtdGFrZW4gb24gMTcuNC4wXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vICgjMTgxNCwgIzE4MDcpIG9yIDE3LjUuMCBcdTIwMTRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBjb21wb25lbnQncyBvd24gZGVzaWduZXIgdGV4dCBzYXlzIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChcImNvbGxhcHNlZDogZmFsc2Ugb3BlbnMgYSBwYW5lbCBieSBkZWZhdWx0XCIpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBcdTI2QTBcdUZFMEYgT05MWSB0aGUgZmlyc3QgcGFuZWwsIGFuZCB0aGF0IGlzIHRoZSByZW5kZXJlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNob2ljZSByYXRoZXIgdGhhbiBhIHByZWZlcmVuY2U6IHdpdGggYGFsbG93TXVsdGlwbGVgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFic2VudCAoaXQgZGVmYXVsdHMgZmFsc2UpIHRoZSBhY2NvcmRpb24gbW91bnRzIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGB0eXBlPVwic2luZ2xlXCJgIGFuZCB0YWtlcyBgZGVmYXVsdFZhbHVlPXtvcGVuWzBdfWAgXHUyMDE0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uZSBwYW5lbCwgdGhlIGZpcnN0IGluIGRlY2xhcmF0aW9uIG9yZGVyLiBNYXJraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2R1Y3RzIG9yIE9wZW4gVGFza3MgdG9vIHdvdWxkIGNoYW5nZSBub3RoaW5nIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjcmVlbi4gT3BlbmluZyBtb3JlIHRoYW4gb25lIG1lYW5zIGRlY2xhcmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgYWxsb3dNdWx0aXBsZTogdHJ1ZWAsIHdoaWNoIGNoYW5nZXMgdGhlIGludGVyYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGVsIChwYW5lbHMgc3RvcCBjbG9zaW5nIGVhY2ggb3RoZXIpIGFuZCBpcyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjYXJkJ3MgYXNrLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBcdTI2RDQgTk9UIFwiZGVmYXVsdC1vcGVuIHRoZSBzZWN0aW9ucyB0aGF0IGhhdmUgcm93c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB0aGUgY2FyZCBhc2tlZCBmb3IgZmlyc3Q6IHRoYXQgaXMgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3NpYmxlIGhlcmUuIGBjb2xsYXBzZWRgIGlzIGEgc3RhdGljIGJvb2xlYW4gb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBzdHJpY3QgaXRlbSBzaGFwZSAoYGxhYmVsYCAvIGBpY29uYCAvIGBjb2xsYXBzZWRgIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGNoaWxkcmVuYCBcdTIwMTQgbm90aGluZyBlbHNlIHBhcnNlcyksIHRoZSBwYWdlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1dGhvcmVkIG1ldGFkYXRhIGV2YWx1YXRlZCBiZWZvcmUgYW55IHJvdyBpcyByZWFkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIHJlbGF0ZWQgbGlzdHMgYmVsb3cgZmV0Y2ggdGhlaXIgb3duIHJvd3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgbW91bnQuIFJlcG9ydGVkIHJhdGhlciB0aGFuIHdvcmtlZCBhcm91bmQ7IFx1MjZENFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29tcG9uZW50IGlzIG5vdCB0aGlzIHJlcG8ncyB0byBjaGFuZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlY29yZDpyZWxhdGVkX2xpc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdvcHBfcXVvdGVzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9xdW90ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcEZpZWxkOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogWydxdW90ZV9udW1iZXInLCAnbmFtZScsICdzdGF0dXMnLCAndG90YWxfcHJpY2UnLCAnZXhwaXJhdGlvbl9kYXRlJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUHJvZHVjdHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6cmVsYXRlZF9saXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnb3BwX3Byb2R1Y3RzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eV9saW5lX2l0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBGaWVsZDogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6IFsnY3JtX3Byb2R1Y3QnLCAncXVhbnRpdHknLCAndW5pdF9wcmljZScsICd0b3RhbF9wcmljZSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdDogMTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlbnRyeSBwb2ludCB0aGF0IHdhcyBtaXNzaW5nICgjMTczMSkuIEV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9USEVSIHN1cmZhY2UgYWxyZWFkeSB0cmVhdGVkIGxpbmUgaXRlbXMgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGl2ZSBcdTIwMTQgdGhyZWUgcHJvZmlsZXMgZ3JhbnQgYGFsbG93Q3JlYXRlYCwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvY3MgZGVzY3JpYmUgdGhlIGFtb3VudCByb2xsaW5nIHVwIGZyb20gdGhlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGBiaWxsaW5nLWhhbmRvZmYuZmxvdy50c2Anc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgbG9hZF9saW5lX2l0ZW1zYCByZWFkcyB0aGVtIG9uIGV2ZXJ5IHdvbiBkZWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFx1MjAxNCB3aGlsZSBub3RoaW5nIGluIHRoZSBhcHAgY291bGQgY3JlYXRlIG9uZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gYWN0aW9uLCBubyBsaXN0IHZpZXcsIG5vIG5hdmlnYXRpb24gZW50cnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNlZWQuIEEgcmVwIHdobyB3YW50ZWQgdG8gaXRlbWlzZSBhIGRlYWwgaGFkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHR5cGUgdGhlIEFtb3VudCBieSBoYW5kLiBEZWNsYXJlZCBzdXJmYWNlIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFjaGFibGUgc3VyZmFjZSBub3cgY29pbmNpZGUgYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoYXQgYGFkZGAgd3JpdGVzIGlzIHRoZSB3aG9sZSByZWFzb24gYSBwaWNrZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc3VmZmljaWVudCBoZXJlLiBJdCBjcmVhdGVzIGEgcm93IGNhcnJ5aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4YWN0bHkgdHdvIGF1dGhvcmVkIGtleXMgXHUyMDE0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGB7IFtyZWxhdGlvbnNoaXBGaWVsZF06IDxvcHBvcnR1bml0eUlkPixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgW2xpbmtGaWVsZF06IDxwaWNrZWRQcm9kdWN0SWQ+IH1gIFx1MjAxNCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBlbHNlLiBPbiB0aGlzIG9iamVjdCB0aGF0IHdvdWxkIGxlYXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBxdWFudGl0eWAgYW5kIGB1bml0X3ByaWNlYCB1bnNldCwgYW5kIGJvdGggYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGByZXF1aXJlZGAgKyBgc3RvcmFnZS5ub3ROdWxsYCwgc28gdGhlIGluc2VydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSByZWZ1c2VkLiBJdCBpcyBub3QsIGJlY2F1c2UgdGhlIHR3b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnYXBzIGFyZSBhbHJlYWR5IGZpbGxlZCBieSBtYWNoaW5lcnkgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVkYXRlcyB0aGlzIGxpc3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgcXVhbnRpdHkgICAtPiB0aGUgZmllbGQncyBvd24gYGRlZmF1bHRWYWx1ZTogMWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB1bml0X3ByaWNlIC0+IGBfbGluZS1pdGVtLXByaWNlLWZpbGwudHNgLCB3aGljaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgb24gYGJlZm9yZUluc2VydGAgc3RhbXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBgbGlzdF9wcmljZWAgZnJvbSB0aGUgY2hvc2VuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBwcm9kdWN0IGFuZCBkZWZhdWx0cyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIG5lZ290aWF0ZWQgYHVuaXRfcHJpY2VgIHRvIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZGlzY291bnQgICAtPiB0aGUgZmllbGQncyBvd24gYGRlZmF1bHRWYWx1ZTogMGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0b3RhbF9wcmljZS0+IHRoZSBmb3JtdWxhIG92ZXIgdGhlIHRocmVlIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBgY3JtX3Byb2R1Y3QubGlzdF9wcmljZWAgaXMgaXRzZWxmIGByZXF1aXJlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKyBgbm90TnVsbGAsIHNvIHRoZSBob29rIGNhbiBuZXZlciBmYWlsIHRvIGZpbmQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3VyY2UuIE1lYXN1cmVkIGVuZC10by1lbmQsIG5vdCByZWFzb25lZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHRlc3Qvb3Bwb3J0dW5pdHktbGluZS1pdGVtLWFkZC1waWNrZXIudGVzdC50c2BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0cyB0aGUgcGlja2VyJ3MgZXhhY3QgdHdvLWtleSBzaGFwZSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzZXJ0cyB0aGUgY29tcGxldGUgcHJpY2VkIHJvdywgd2l0aCBhbiBhYmxhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHVuYmluZHMgdGhlIGhvb2sgYW5kIHNob3dzIHRoZSBzYW1lIGluc2VydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWplY3RlZCBhcyBcIlNhbGVzIFByaWNlIGlzIHJlcXVpcmVkXCIgXHUyMDE0IHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3NlcnRpb24gY2Fubm90IHBhc3MgdmFjdW91c2x5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBcdTI2RDQgRG8gbm90IGFkZCBhIGBsYWJlbGAuIFRoZSBidXR0b24gZmFsbHMgYmFjayB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcGxhdGZvcm0ncyBvd24gbG9jYWxpemVkIFwiQWRkXCI7IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2xhdGlvbiBidW5kbGVzIHJlYWNoIGEgcGFnZSBjb21wb25lbnQgdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgcGFnZXMuPHBhZ2U+LmNvbXBvbmVudHMuPGlkPmAsIHdoaWNoIGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGxhYmVsYC9gdGl0bGVgL2BkZXNjcmlwdGlvbmAgZm9yIHRoZSBDT01QT05FTlRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGhhcyBubyByb3V0ZSB0byBhIG5lc3RlZCBgYWRkLmxhYmVsYC4gQVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kLWF1dGhvcmVkIHN0cmluZyBoZXJlIHdvdWxkIHNoaXAgRW5nbGlzaCBpbnRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB6aC1DTiAvIGVzLUVTIC8gamEtSlAgYnVuZGxlcyB3aXRoIG5vIGtleSB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2xhdGUgaXQgdW5kZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGB2YWx1ZUZpZWxkYCBhbmQgYGxhYmVsRmllbGRgIGFyZSBib3RoIG9taXR0ZWQgb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHVycG9zZSByYXRoZXIgdGhhbiByZXN0YXRlZDogYHZhbHVlRmllbGRgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHRzIHRvIGBpZGAsIHdoaWNoIGlzIHdoYXQgdGhlIGBjcm1fcHJvZHVjdGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9va3VwIHN0b3JlcywgYW5kIGBsYWJlbEZpZWxkYCBkZWZhdWx0cyB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGlja2VkIG9iamVjdCdzIG93biB0aXRsZSBmaWVsZCBcdTIwMTQgYGNybV9wcm9kdWN0YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNsYXJlcyBgbmFtZUZpZWxkOiAnZGlzcGxheV90aXRsZSdgIChBRFItMDA3OSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSBwaWNrZXIgbGFiZWxzIHJvd3MgXCJQUkQtMDAwMSAtIFdpZGdldFwiIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyBPTkUgc291cmNlIG9mIHRydXRoIGZvciBhIHByb2R1Y3QncyB0aXRsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhhdCBmb3JtdWxhIHRpdGxlIGlzIHNlYXJjaGFibGUgb25seSBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYmplY3QgYWxzbyBkZWNsYXJlcyBgc2VhcmNoYWJsZUZpZWxkc2AsIHdoaWNoIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZG9lcyBmb3IgZXhhY3RseSB0aGlzIHJlYXNvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja2VyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6ICdjcm1fcHJvZHVjdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHJldGlyZWQgcHJvZHVjdCBtdXN0IG5vdCBiZSBzZWxsYWJsZSBvbnRvIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBkZWFsLiBgcHJvZHVjdC5ob29rLnRzYCdzIGBiZWZvcmVEZWxldGVgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmVzIHJldGlyZW1lbnQgYXMgcHJlY2lzZWx5IHRoaXMgZmxhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFwiU2V0IGlzX2FjdGl2ZT1mYWxzZSB0byByZXRpcmUgaW5zdGVhZFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSBjYXRhbG9nJ3Mgb3duIHJldGlyZW1lbnQgbWVjaGFuaXNtIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGF0IHNjb3BlcyB0aGUgcGlja2VyLiBBbGwgMTMgc2VlZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9kdWN0cyBjYXJyeSBgaXNfYWN0aXZlOiB0cnVlYCwgc28gdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFycm93cyB3aXRob3V0IGVtcHR5aW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ2lzX2FjdGl2ZScsIG9wZXJhdG9yOiAnZXF1YWxzJywgdmFsdWU6IHRydWUgfV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rRmllbGQ6ICdjcm1fcHJvZHVjdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ09wZW4gVGFza3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6cmVsYXRlZF9saXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnb3BwX3Rhc2tzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV90YXNrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwRmllbGQ6ICdyZWxhdGVkX3RvX29wcG9ydHVuaXR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3N0YXR1cycsICdwcmlvcml0eScsICdkdWVfZGF0ZScsICdvd25lcl9pZCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IFt7IGZpZWxkOiAnc3RhdHVzJywgb3BlcmF0b3I6ICdub3RfZXF1YWxzJywgdmFsdWU6ICdjb21wbGV0ZWQnIH1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdDogMTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ2FjdGl2aXR5JyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FjdGl2aXR5JyxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVjb3JkOmFjdGl2aXR5JyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdvcHBfYWN0aXZpdHknLFxuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogYGZpbHRlcnNgIGlzIGRlbGV0ZWQgd2l0aCBub3RoaW5nIHB1dCBpbiBpdHMgcGxhY2UsIGFuZFxuICAgICAgICAgICAgICAgICAgICAgKiB0aGF0IGlzIHRoZSB3aG9sZSBmaW5kaW5nICgjMTI2OSkuXG4gICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAqIEl0IHVzZWQgdG8gcmVhZCBgWydhbGwnLCAndGFza3MnLCAnbWVldGluZ3MnLCAnY2FsbHMnLFxuICAgICAgICAgICAgICAgICAgICAgKiAnZW1haWxzJ11gIFx1MjAxNCBhIHZvY2FidWxhcnkgdGhhdCBleGlzdHMgbm93aGVyZSBpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICogY29udHJhY3QuIGBSZWNvcmRBY3Rpdml0eVByb3BzYCBoYXMgZXhhY3RseSB0d28gZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAqIGNoYW5uZWxzIGFuZCBuZWl0aGVyIHRha2VzIHRoYXQgbGlzdDpcbiAgICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAgICogICBgdHlwZXNgICAgICAgXHUyMDE0IGFuIGFycmF5IG9mIEZFRUQgSVRFTSBLSU5EU1xuICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgIChgY29tbWVudGAgfCBgZmllbGRfY2hhbmdlYCB8IGB0YXNrYCB8XG4gICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgYGV2ZW50YCB8IGBlbWFpbGAgfCBgY2FsbGAgfCBcdTIwMjYpLiBOb3RcbiAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICB0aGVzZSB2YWx1ZXM6IGBhbGxgIGlzIG5vdCBhIGtpbmQgYW5kXG4gICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgYG1lZXRpbmdzYCBpcyBub3Qgb25lIGVpdGhlciAodGhlIGtpbmRcbiAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICBpcyBgZXZlbnRgKSwgYW5kIGFsbCBmaXZlIGFyZSBwbHVyYWxcbiAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICB3aGVyZSB0aGUgZW51bSBpcyBzaW5ndWxhci5cbiAgICAgICAgICAgICAgICAgICAgICogICBgZmlsdGVyTW9kZWAgXHUyMDE0IE9ORSBkZWZhdWx0IGZvciB0aGUgcGFuZWwncyBkcm9wZG93bixcbiAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICBmcm9tIGBhbGxgIHwgYGNvbW1lbnRzX29ubHlgIHxcbiAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICBgY2hhbmdlc19vbmx5YCB8IGB0YXNrc19vbmx5YC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgZHJvcGRvd24ncyBvcHRpb24gbGlzdCBpcyB0aGUgcmVuZGVyZXIncyxcbiAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICBub3QgYXV0aG9yYWJsZS5cbiAgICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAgICogU28gdGhlIGxpc3Qgd2FzIHJlYWNoaW5nIGZvciBhIHRoaXJkIHRoaW5nIFx1MjAxNCBcIm9mZmVyIHRoZXNlXG4gICAgICAgICAgICAgICAgICAgICAqIGZpbHRlciBjaGlwc1wiIFx1MjAxNCB0aGF0IHRoZSBjb21wb25lbnQgZG9lcyBub3QgZXhwb3NlLiBXaGF0XG4gICAgICAgICAgICAgICAgICAgICAqIGl0IHdhbnRlZCBpcyBhbHJlYWR5IGRlbGl2ZXJlZDogYHNob3dGaWx0ZXJUb2dnbGVgXG4gICAgICAgICAgICAgICAgICAgICAqIGRlZmF1bHRzIG9uLCBzbyB0aGUgcGFuZWwgcmVuZGVycyBpdHMgZmlsdGVyIGRyb3Bkb3duLCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICogYGZpbHRlck1vZGVgIGRlZmF1bHRzIHRvIGBhbGxgLCBzbyBpdCBvcGVucyB1bmZpbHRlcmVkLlxuICAgICAgICAgICAgICAgICAgICAgKiBOZWl0aGVyIGlzIHJlc3RhdGVkIGhlcmUsIGJlY2F1c2UgbWF0ZXJpYWxpemluZyBhIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICogdHVybnMgXCJ0aGUgYXV0aG9yIHNhaWQgbm90aGluZ1wiIGludG8gXCJ0aGUgYXV0aG9yIGFza2VkIGZvclxuICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZGVmYXVsdFwiIFx1MjAxNCBhIGRpZmZlcmVudCBmYWN0LCBhbmQgdGhlIG9uZSBhIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAqIGxpdmVuZXNzIGF1ZGl0IHJlYWRzLlxuICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgKiBNYXBwaW5nIGl0IG9udG8gYHR5cGVzYCBpbnN0ZWFkIHdhcyBjb25zaWRlcmVkIGFuZFxuICAgICAgICAgICAgICAgICAgICAgKiByZWplY3RlZDogIzEyMDkgY29ycmVjdGVkIGV4YWN0bHkgdGhhdCBtaXN0YWtlIG9uZSBwYWdlXG4gICAgICAgICAgICAgICAgICAgICAqIG92ZXIgKHRoZSBsZWFkIHRpbWVsaW5lJ3MgYHR5cGVzOiBbJ2NybV90YXNrJ11gKSwgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgKiByZW5kZXJlciBzYW5pdGlzZXMgb3V0LW9mLWVudW0gbWVtYmVycyB0aGVuIHJlYWRzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgKiBFTVBUWSByZW1haW5kZXIgYXMgXCJubyBmaWx0ZXIgYXV0aG9yZWRcIiBcdTIwMTQgc28gYSBiYWQgYHR5cGVzYFxuICAgICAgICAgICAgICAgICAgICAgKiBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG5vIGB0eXBlc2Agb24gc2NyZWVuIHdoaWxlXG4gICAgICAgICAgICAgICAgICAgICAqIGNsYWltaW5nIG90aGVyd2lzZSBpbiBzb3VyY2UuIEEgYHR5cGVzYCBoZXJlIHdvdWxkIGFsc29cbiAgICAgICAgICAgICAgICAgICAgICogYmUgYSBORVcgcmVzdHJpY3Rpb24gbm9ib2R5IGFza2VkIGZvcjogaXQgd291bGQgZHJvcFxuICAgICAgICAgICAgICAgICAgICAgKiBjb21tZW50cyBhbmQgZmllbGQgY2hhbmdlcyBmcm9tIGEgdGltZWxpbmUgdGhhdCBzaG93cyB0aGVtXG4gICAgICAgICAgICAgICAgICAgICAqIHRvZGF5LlxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiAyNSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkLWJlYXJpbmcgKCMyMDcxKTogYSBjYWxsIG9yIG1lZXRpbmcgbG9nZ2VkIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYWwgaXMgYSBgc3lzX2FjdGl2aXR5YCByb3cgb2YgdHlwZSBgY29tcGxldGVkYCAodGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYHRhc2tgIGZlZWQga2luZCksIGFuZCB0aGUgcmVuZGVyZXIgZHJvcHMgZXZlcnkgc3VjaFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJvdyB1bmxlc3MgdGhpcyBpcyB0cnVlIFx1MjAxNCBzbyBhIHJlcCdzIGxvZ2dlZCBjYWxsIG5ldmVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVhY2hlZCB0aGlzIHRhYi4gVGhlIGRlYWwncyBvdGhlciBgY29tcGxldGVkYCB3cml0ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIGl0cyBvd24gd29uIC8gbG9zdCBtaWxlc3RvbmVzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKGBvcHBvcnR1bml0eS5vYmplY3QudHNgKSwgd2hpY2ggYmVsb25nIGhlcmUgdG9vLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlZCBjcm1fdGFzayByb3dzIGRvIE5PVCBhcnJpdmU6IHRoZWlyIGF1ZGl0IHJvd3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUga2V5ZWQgdG8gdGhlIHRhc2ssIGFuZCB0aGlzIGZlZWQgcmVhZHMgb25seSByb3dzXG4gICAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZWQgdG8gdGhlIGRlYWwuIE5vciBpcyB0aGlzIHRoZSBgdHlwZXNgIHJlc3RyaWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5vdGUgYWJvdmUgcmVmdXNlczogaXQgYWRkcyByb3dzIGFuZCBmaWx0ZXJzIG5vbmUuXG4gICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbXBsZXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnYXNpZGUnLFxuICAgICAgd2lkdGg6ICdzbWFsbCcsXG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncmVjb3JkOnJlZmVyZW5jZV9yYWlsJyxcbiAgICAgICAgICBpZDogJ29wcF9yZWZlcmVuY2VfcmFpbCcsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBObyBlbnRyeSBkZWNsYXJlcyBhIGB0aXRsZWAgXHUyMDE0IGRlbGliZXJhdGVseSAoIzk3MikuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogVGhlIHJhaWwgcmVzb2x2ZXMgYSBjYXJkJ3MgaGVhZGluZyBhc1xuICAgICAgICAgICAgICogYGVudHJ5LnRpdGxlIHx8IGkxOG4ub2JqZWN0TGFiZWwoeyBuYW1lOiBvYmplY3ROYW1lLCBcdTIwMjYgfSlgLCBzbyBhXG4gICAgICAgICAgICAgKiBsaXRlcmFsIGB0aXRsZWAgZG9lcyBub3QgbWVyZWx5IHByb3ZpZGUgYSBkZWZhdWx0OiBpdCBXSU5TLCBhbmRcbiAgICAgICAgICAgICAqIHRoZSBsb2NhbGUgYnVuZGxlIGlzIG5ldmVyIGNvbnN1bHRlZC4gVGhlIHRocmVlIGxpdGVyYWxzIHRoYXRcbiAgICAgICAgICAgICAqIHVzZWQgdG8gc2l0IGhlcmUgKGBRdW90ZXNgIC8gYFByb2R1Y3RzYCAvIGBPcGVuIFRhc2tzYCkgdGhlcmVmb3JlXG4gICAgICAgICAgICAgKiBwcmludGVkIEVuZ2xpc2ggaW50byBldmVyeSBvbmUgb2YgdGhlIGZvdXIgbG9jYWxlcyB0aGlzIGFwcFxuICAgICAgICAgICAgICogc2hpcHMsIG9uIHRvcCBvZiBgb2JqZWN0cy48bmFtZT4ubGFiZWxgIGFscmVhZHkgYmVpbmcgdHJhbnNsYXRlZFxuICAgICAgICAgICAgICogaW4gYWxsIG9mIHRoZW0uIERyb3BwaW5nIHRoZW0gaGFuZHMgdGhlIGhlYWRpbmcgYmFjayB0byB0aGVcbiAgICAgICAgICAgICAqIHRyYW5zbGF0aW9uIGJ1bmRsZSBcdTIwMTQgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHdoYXQgYW5cbiAgICAgICAgICAgICAqIG9iamVjdCBpcyBjYWxsZWQgXHUyMDE0IHNvIGEgbG9jYWxlIGFkZGVkIGxhdGVyIGlzIGNvdmVyZWQgZm9yIGZyZWUuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQSB0cmFuc2xhdGVkIGxpdGVyYWwgaXMgbm90IGF2YWlsYWJsZSBhcyBhbiBhbHRlcm5hdGl2ZTogdW5saWtlXG4gICAgICAgICAgICAgKiBgcmVjb3JkOmFsZXJ0YCwgd2hvc2UgYHRpdGxlYCBpcyBydW4gdGhyb3VnaCB0aGUgaW5saW5lXG4gICAgICAgICAgICAgKiB0cmFuc2xhdGlvbi1tYXAgcmVzb2x2ZXIsIHRoZSByYWlsIHJlbmRlcnMgYGVudHJ5LnRpdGxlYCBhcyBhXG4gICAgICAgICAgICAgKiByYXcgUmVhY3QgY2hpbGQuIEFuIGB7IGVuLCAnemgtQ04nIH1gIG1hcCBoZXJlIHdvdWxkIG5vdCBiZVxuICAgICAgICAgICAgICogcmVzb2x2ZWQgXHUyMDE0IGl0IHdvdWxkIGJlIGhhbmRlZCB0byBSZWFjdCBhcyBhbiBvYmplY3QuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogVGhlIHRoaXJkIGNhcmQgbG9zaW5nIHRoZSB3b3JkIFwiT3BlblwiIGlzIGEgY29ycmVjdGlvbiwgbm90IGFcbiAgICAgICAgICAgICAqIGNhc3VhbHR5LiBBIHJhaWwgZW50cnkgaGFzIG5vIGZpbHRlciBhdCBhbGwgXHUyMDE0IHRoZSByYWlsIHF1ZXJpZXNcbiAgICAgICAgICAgICAqIGB7ICRmaWx0ZXI6IHsgW3JlbGF0aW9uc2hpcEZpZWxkXTogcGFyZW50SWQgfSwgJHRvcDogbGltaXQgfWAgYW5kXG4gICAgICAgICAgICAgKiByZWFkcyBub3RoaW5nIGVsc2UgXHUyMDE0IHNvIHRoYXQgY2FyZCBhbHdheXMgY291bnRlZCBhbmQgbGlzdGVkIHRoaXNcbiAgICAgICAgICAgICAqIGRlYWwncyB0YXNrcyB3aGF0ZXZlciB0aGVpciBzdGF0dXMuIFRoZSBoZWFkaW5nIGNsYWltZWQgYSBmaWx0ZXJcbiAgICAgICAgICAgICAqIHRoZSBjb21wb25lbnQgY2Fubm90IGFwcGx5LiBUaGUgZ2VudWluZWx5IGZpbHRlcmVkIHZpZXcgaXMgdGhlXG4gICAgICAgICAgICAgKiBgb3BwX3Rhc2tzYCByZWxhdGVkIGxpc3Qgb24gdGhlICpSZWxhdGVkKiB0YWIgYWJvdmUsIHdoaWNoIGRvZXNcbiAgICAgICAgICAgICAqIGNhcnJ5IGBzdGF0dXMgbmVxIGNvbXBsZXRlZGAuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogUGlubmVkIGJ5IGB0ZXN0L21ldGFkYXRhLXJlZmVyZW5jZXMudGVzdC50c2AgKGVudHJpZXMgcmVzb2x2ZSxcbiAgICAgICAgICAgICAqIG5vIGxpdGVyYWwgdGl0bGVzKSBhbmQgYHRlc3QvaTE4bi1yZWZlcmVuY2VzLnRlc3QudHNgIChldmVyeVxuICAgICAgICAgICAgICogcmFpbCBvYmplY3QgaGFzIGEgYGxhYmVsYCBpbiBldmVyeSBsb2NhbGUsIHNvIHRoZSBmYWxsYmFja1xuICAgICAgICAgICAgICogbGFuZHMgb24gYSB0cmFuc2xhdGlvbiByYXRoZXIgdGhhbiBvbiBhIGh1bWFuaXplZCBvYmplY3QgbmFtZSkuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGVudHJpZXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fcXVvdGUnLFxuICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcEZpZWxkOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgICAgICAgICAgICBsaW1pdDogMyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtJyxcbiAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBGaWVsZDogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICAgbGltaXQ6IDMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX3Rhc2snLFxuICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcEZpZWxkOiAncmVsYXRlZF90b19vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICAgbGltaXQ6IDMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIF0sXG5cbiAgaXNEZWZhdWx0OiB0cnVlLFxuXG4gIGFyaWE6IHtcbiAgICBhcmlhTGFiZWw6ICdPcHBvcnR1bml0eSBEZXRhaWwgUGFnZScsXG4gICAgYXJpYURlc2NyaWJlZEJ5OiAnRGV0YWlsZWQgdmlldyBvZiBvcHBvcnR1bml0eSBpbmZvcm1hdGlvbiB3aXRoIHJlbGF0ZWQgcmVjb3JkcyBhbmQgYWN0aXZpdHknLFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL2FjY291bnRfZGV0YWlsLnBhZ2UudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXMvYWNjb3VudF9kZXRhaWwucGFnZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKipcbiAqIEFjY291bnQgRGV0YWlsIFx1MjAxNCBzbG90dGVkIHJlY29yZCBwYWdlLlxuICpcbiAqIFdlIHVzZSBPYmplY3RVSSdzICoqc2xvdHRlZCBwYWdlKiogcGF0dGVybjogdGhlIGRlZmF1bHQtcGFnZVxuICogc3ludGhlc2l6ZXIgb3ducyBsYXlvdXQgKGhlYWRlciwgaGlnaGxpZ2h0cywgcGF0aCwgdGFicyB3aXRoXG4gKiBEZXRhaWxzL1JlbGF0ZWQvQWN0aXZpdHkvSGlzdG9yeSwgcmVmZXJlbmNlIHJhaWwpLiBXZSBvdmVycmlkZVxuICogdHdvIHNsb3RzOlxuICpcbiAqICAgaGVhZGVyICAgXHUwMEI3IEN1c3RvbSBgcGFnZTpoZWFkZXJgIHdpdGggdGl0bGUgYW5kIHN1YnRpdGxlLiBJdCB1c2VkIHRvXG4gKiAgICAgICAgICAgICAgY2xhaW0gYW4gQUNDT1VOVCBleWVicm93LCBhIGJ1aWxkaW5nIGljb24gYW5kIGEgYnJlYWRjcnVtYlxuICogICAgICAgICAgICAgIGJhY2sgdG8gdGhlIGxpc3Q7IG5vbmUgb2YgdGhlbSBldmVyIGRyZXcgYW55dGhpbmcgKCMxMjY5IGFuZFxuICogICAgICAgICAgICAgIHRoZSBwcm9wcyBub3RlcyBiZWxvdyBcdTIwMTQgYGJyZWFkY3J1bWJgIHJldGlyZWQgaW4gMTcuNi4wKS5cbiAqXG4gKiAgIGRpc2N1c3Npb24gXHUwMEI3IGByZWNvcmQ6Y2hhdHRlcmAgaXMgYWxyZWFkeSBhdXRvLWVtaXR0ZWQsIGJ1dCB3ZVxuICogICAgICAgICAgICAgIHJlLXN0YXRlIGl0IHNvIGl0IEFMV0FZUyBhcHBlYXJzIFx1MjAxNCBldmVuIG9uIGFjY291bnRzXG4gKiAgICAgICAgICAgICAgd2l0aCBubyByZWxhdGVkIGxpc3RzICh0aGUgYXV0by1lbWl0dGVyIHNvbWV0aW1lc1xuICogICAgICAgICAgICAgIHNraXBzIGNoYXR0ZXIgZm9yIGxlYW4gb2JqZWN0cykuIERpc2N1c3Npb24gaXMgY29yZVxuICogICAgICAgICAgICAgIHRvIHRoZSBjaGF0LWZpcnN0IHZpYmUsIGFuZCBpdCBpcyB0aGUgYWNjb3VudCdzXG4gKiAgICAgICAgICAgICAgYWN0aXZpdHkgdGltZWxpbmU6IGl0cyBvbmUgYGZlZWRgIHR1cm5zIG9uIHRoZVxuICogICAgICAgICAgICAgIGNvbXBsZXRlZCByb3dzIGEgbG9nZ2VkIGNhbGwgb3IgbWVldGluZyB3cml0ZXNcbiAqICAgICAgICAgICAgICAoc2VlIHRoZSBzbG90J3Mgbm90ZSkuXG4gKlxuICogV2h5IG5vdCBlbWJlZCBhbiBpbmxpbmUgY2hhdCBwYW5lbD8gYGFpOmNoYXRfd2luZG93YCB3YXMgZHJvcHBlZFxuICogZnJvbSBvYmplY3R1aSAoc2VlIEBvYmplY3QtdWkvbGF5b3V0IENIQU5HRUxPRyA1LngpLiBUaGUgc3VwcG9ydGVkXG4gKiBzdXJmYWNlIGlzIHRoZSBnbG9iYWwgZmxvYXRpbmcgY2hhdGJvdCBtb3VudGVkIGJ5IGFwcC1zaGVsbCwgd2hpY2hcbiAqIHBpY2tzIHVwIGBkZWZhdWx0QWdlbnQ6ICdhc2snYCBmcm9tIHRoaXMgYXBwIGFuZCBpcyBsYXVuY2hlZCBmcm9tXG4gKiB0aGUgRkFCIGF0IHRoZSBib3R0b20tcmlnaHQuXG4gKi9cbmV4cG9ydCBjb25zdCBBY2NvdW50RGV0YWlsUGFnZSA9IHtcbiAgbmFtZTogJ2FjY291bnRfZGV0YWlsX3BhZ2UnLFxuICBsYWJlbDogJ0FjY291bnQgRGV0YWlsJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1Nsb3R0ZWQgYWNjb3VudCByZWNvcmQgcGFnZSBcdTIwMTQgY3VzdG9tIGhlYWRlciArIHBlcnNpc3RlbnQgZGlzY3Vzc2lvbiBmZWVkLicsXG5cbiAgdHlwZTogJ3JlY29yZCcsXG4gIG9iamVjdDogJ2NybV9hY2NvdW50JyxcblxuICBraW5kOiAnc2xvdHRlZCcsXG4gIHJlZ2lvbnM6IFtdLFxuXG4gIHNsb3RzOiB7XG4gICAgaGVhZGVyOiB7XG4gICAgICB0eXBlOiAncGFnZTpoZWFkZXInLFxuICAgICAgaWQ6ICdhY2NvdW50X2hlYWRlcl9zbG90dGVkJyxcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBIZWFkZXIgKHNsb3R0ZWQpJyxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgdGl0bGU6ICd7bmFtZX0nLFxuICAgICAgICBzdWJ0aXRsZTogJ3tpbmR1c3RyeX0gXHUwMEI3IHt0eXBlfScsXG4gICAgICAgIC8vIGBpY29uYCBhbmQgYGV5ZWJyb3dgIGFyZSBHT05FLCBhbmQgZm9yIHR3byBkaWZmZXJlbnQgcmVhc29ucyBcdTIwMTQgYm90aFxuICAgICAgICAvLyBtZWFzdXJlZCBhZ2FpbnN0IHRoZSBjb250cmFjdCByYXRoZXIgdGhhbiBpbmZlcnJlZCBmcm9tIHRoZSB3YXJuaW5nXG4gICAgICAgIC8vIHRleHQgKCMxMjY5KS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYGljb25gIHdhcyBSRU1PVkVEIGZyb20gYHBhZ2U6aGVhZGVyYCBpbiBAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjBcbiAgICAgICAgLy8gKCM2OTQ2LCBBRFItMDA4NyBEMikuIEl0IGlzIGRlbGV0ZWQgcmF0aGVyIHRoYW4gcmVuYW1lZCBiZWNhdXNlIG5vXG4gICAgICAgIC8vIHJlbmRlcmVyIGV2ZXIgcmVhZCBpdDogb2JqZWN0dWkgcmVzb2x2ZXMgYGljb25gIHBlciBoZWFkZXIgQUNUSU9OXG4gICAgICAgIC8vIChgYWN0aW9uLmljb25gKSBhbmQgbmV2ZXIgb2ZmIHRoZSBoZWFkZXIncyBvd24gcHJvcHMgYmFnLCBhbmQgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCByZWdpc3RyeSBuZXZlciBwdWJsaXNoZWQgaXQgYXMgYW4gaW5wdXQgXHUyMDE0IHdoaWNoIGlzIHdoYXQgcHV0XG4gICAgICAgIC8vIHRoZSBrZXkgaW4gb2JqZWN0dWkncyBgVU5QVUJMSVNIRURfRVhFTVBUSU9OU2AgYXMgYSBcInNwZWMgZGVjbGFyZXMgaXQsXG4gICAgICAgIC8vIE5PIHJlbmRlcmVyIHJlYWQgcG9pbnRcIiBlbnRyeS4gVGhlIGhlYWRlcidzIG93biBpZGVudGl0eSBjb21lcyBmcm9tXG4gICAgICAgIC8vIHRoZSByZWNvcmQgY2hyb21lIChgcmVjb3JkQ2hyb21lYCwgb24gYnkgZGVmYXVsdCkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGBleWVicm93YCB3YXMgbmV2ZXIgZGVjbGFyZWQgYnkgYW55dGhpbmcuIEl0IGlzIG5vdCBpblxuICAgICAgICAvLyBgUGFnZUhlYWRlclByb3BzYCwgaXQgaGFzIG5vIGFsaWFzIG9yIHRvbWJzdG9uZSB0aGVyZSwgYW5kIHRoZSBzdHJpbmdcbiAgICAgICAgLy8gXCJleWVicm93XCIgZG9lcyBub3Qgb2NjdXIgYW55d2hlcmUgaW4gb2JqZWN0dWkgXHUyMDE0IG5vIHNjaGVtYSwgbm9cbiAgICAgICAgLy8gcmVnaXN0cnkgaW5wdXQsIG5vIHJlbmRlcmVyLiBTbyB0aGUgQUNDT1VOVCBraWNrZXIgdGhpcyBwYWdlJ3NcbiAgICAgICAgLy8gZG9jYmxvY2sgdXNlZCB0byBwcm9taXNlIGhhcyBuZXZlciByZWFjaGVkIGEgc2NyZWVuOiB0aGUgcHJvcHMgYmFnIGlzXG4gICAgICAgIC8vIGB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSlgLCBzbyB0aGUga2V5IHdhcyBjYXJyaWVkIGludG8gdGhlXG4gICAgICAgIC8vIGFydGlmYWN0IGFuZCBkcm9wcGVkIGF0IHJlbmRlci4gRGVsZXRpbmcgaXQgY2hhbmdlcyBub3RoaW5nIGEgdXNlclxuICAgICAgICAvLyBzZWVzOyBpdCBvbmx5IHN0b3BzIHRoZSBzb3VyY2UgY2xhaW1pbmcgYSBraWNrZXIgZXhpc3RzLlxuICAgICAgICAvLyBgYnJlYWRjcnVtYmAgcmV0aXJlZCBmcm9tIGBwYWdlOmhlYWRlcmAgaW4gQG9iamVjdHN0YWNrL3NwZWMgMTcuNi4wXG4gICAgICAgIC8vICgjMjA3ODUsIGBwYWdlLWhlYWRlci1icmVhZGNydW1iLXJlbW92ZWRgKSBcdTIwMTQgZGVsZXRlZDogbm8gcmVuZGVyZXJcbiAgICAgICAgLy8gZXZlciBkcmV3IGEgdHJhaWwgZm9yIGl0OyB0aGUgYXBwIHNoZWxsJ3Mgb3duIHRyYWlsIGlzIHVuY2hhbmdlZC5cbiAgICAgICAgLy8gT3ZlcnJpZGluZyB0aGUgYGhlYWRlcmAgc2xvdCBSRVBMQUNFUyB0aGUgc3ludGhlc2l6ZWQgaGVhZGVyLCBhY3Rpb25zXG4gICAgICAgIC8vIGFuZCBhbGwgXHUyMDE0IHNvIHRoaXMgc2xvdCBoYXMgdG8gcmUtc3RhdGUgZXZlcnkgYWN0aW9uIGl0IHdhbnRzIHRvIGtlZXAuXG4gICAgICAgIC8vIEJlZm9yZSAjNTkyIGl0IG5hbWVkIG5vbmUsIHdoaWNoIGlzIHdoeSBhbiBhY2NvdW50IHJlY29yZCBzaG93ZWQgbm9cbiAgICAgICAgLy8gYWN0aXZpdHkgYnV0dG9ucyBhdCBhbGwgd2hpbGUgdGhlIGxpc3Qgcm93J3MgXHUyMkVFIG1lbnUgc2hvd2VkIHRocmVlLlxuICAgICAgICAvL1xuICAgICAgICAvLyBBY3Rpb24gSURzLCBub3QgYEFjdGlvbkRlZmAgb2JqZWN0czogYFBhZ2VIZWFkZXJQcm9wcy5hY3Rpb25zYCBpc1xuICAgICAgICAvLyBgei5hcnJheSh6LnN0cmluZygpKWAgKFwiQWN0aW9uIElEcyB0byBzaG93IGluIGhlYWRlclwiKSBpblxuICAgICAgICAvLyBAb2JqZWN0c3RhY2svc3BlYyAxNy4zLjAsIGFuZCB0aGlzIHJlcG8gYXV0aG9ycyBhZ2FpbnN0IHRoZSBwcm90b2NvbFxuICAgICAgICAvLyAoIzE2NTMpLiBFYWNoIGlkIGlzIHRoZSBgbmFtZWAgb2YgYSBjcm1fYWNjb3VudC1zY29wZWQgYWN0aW9uIGluXG4gICAgICAgIC8vIGBzcmMvc2FsZXMvYWN0aW9ucy9hY3Rpdml0eS1hY3Rpb25zLnRzYC5cbiAgICAgICAgYWN0aW9uczogWydsb2dfY2FsbCcsICdsb2dfbWVldGluZycsICdzY2hlZHVsZV9tZWV0aW5nJ10sXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBkaXNjdXNzaW9uOiB7XG4gICAgICB0eXBlOiAncmVjb3JkOmNoYXR0ZXInLFxuICAgICAgaWQ6ICdhY2NvdW50X2NoYXR0ZXInLFxuICAgICAgbGFiZWw6ICdEaXNjdXNzaW9uJyxcbiAgICAgIC8qKlxuICAgICAgICogT25lIGBmZWVkYCwgZm9yIG9uZSByZWFzb246IGBzaG93Q29tcGxldGVkYCAoIzIwNzEpLlxuICAgICAgICpcbiAgICAgICAqIFRoaXMgZmVlZCBJUyB0aGUgYWNjb3VudCdzIGFjdGl2aXR5IHRpbWVsaW5lIFx1MjAxNCB0aGUgc2xvdHRlZCBwYWdlXG4gICAgICAgKiBzeW50aGVzaXplcyBubyBBY3Rpdml0eSB0YWIsIHNvIHRoZSBwYW5lbCdzIFwiQWxsIEFjdGl2aXR5XCIgc3RyZWFtIGlzXG4gICAgICAgKiB3aGVyZSBhbiBhY2NvdW50J3MgYHN5c19hY3Rpdml0eWAgcm93cyBzdXJmYWNlLiBBIGNhbGwgb3IgbWVldGluZ1xuICAgICAgICogbG9nZ2VkIG9uIHRoZSBhY2NvdW50IGlzIGEgcm93IG9mIHR5cGUgYGNvbXBsZXRlZGAgKHRoZSBgdGFza2AgZmVlZFxuICAgICAgICoga2luZCksIGFuZCB0aGUgdGltZWxpbmUgZHJvcHMgZXZlcnkgc3VjaCByb3cgdW5sZXNzXG4gICAgICAgKiBgZmVlZC5zaG93Q29tcGxldGVkYCBpcyB0cnVlIFx1MjAxNCBzbyBMb2cgYSBDYWxsIC8gTG9nIGEgTWVldGluZyBvbiBhblxuICAgICAgICogYWNjb3VudCB3cm90ZSBhIHJvdyB0aGF0IGFwcGVhcmVkIG5vd2hlcmUgb24gdGhlIGFjY291bnQuXG4gICAgICAgKlxuICAgICAgICogQXV0aG9yaW5nIGEgYGZlZWRgIGNvc3RzIHR3byBtb3JlIGtleXMsIGFuZCB0aGV5IGFyZSBzdGF0ZWQgcmF0aGVyXG4gICAgICAgKiB0aGFuIGxlZnQgb3V0LiBgUmVjb3JkQ2hhdHRlclJlbmRlcmVyYCBidWlsZHMgYHsgcG9zaXRpb246ICdib3R0b20nLFxuICAgICAgICogY29sbGFwc2libGU6IGZhbHNlLCBmZWVkOiB7IGVuYWJsZVJlYWN0aW9uczogdHJ1ZSwgZW5hYmxlVGhyZWFkaW5nOlxuICAgICAgICogdHJ1ZSwgc2hvd0NvbW1lbnRJbnB1dDogdHJ1ZSB9LCAuLi5zY2hlbWEgfWAgXHUyMDE0IG9uZSBzaGFsbG93IHNwcmVhZCBcdTIwMTQgc29cbiAgICAgICAqIGEgYGZlZWRgIG9mIG91ciBvd24gUkVQTEFDRVMgdGhhdCBkZWZhdWx0IG9iamVjdCB3aG9sZXNhbGUsIGFuZFxuICAgICAgICogYFJlY29yZEFjdGl2aXR5VGltZWxpbmVgIHJlYWRzIGBlbmFibGVSZWFjdGlvbnMgPz8gZmFsc2VgIGFuZFxuICAgICAgICogYGVuYWJsZVRocmVhZGluZyA/PyBmYWxzZWAgb2ZmIHdoYXQgaXMgbGVmdC4gV2l0aG91dCB0aGUgdHdvIGtleXNcbiAgICAgICAqIGJlbG93LCByZWFjdGlvbnMgYW5kIHRocmVhZGluZyB3b3VsZCBzaWxlbnRseSBzd2l0Y2ggb2ZmLlxuICAgICAgICogYHNob3dDb21tZW50SW5wdXRgIG5lZWRzIG5vIHJlc3RhdGluZzogdGhlIHRpbWVsaW5lIHJlYWRzIGl0IGFzXG4gICAgICAgKiBgIT09IGZhbHNlYC5cbiAgICAgICAqXG4gICAgICAgKiBgZmVlZC5lbmFibGVNZW50aW9uc2AgbmVlZHMgbm9uZSBlaXRoZXI6IHRoZSByZW5kZXJlciByZWFkcyBpdCBhc1xuICAgICAgICogYCE9PSBmYWxzZWAgdG9vLiBBbmQgdGhlIG9sZGVyIG5vdGUgc3RpbGwgaG9sZHMgKCMxMjY5KTpcbiAgICAgICAqIGBlbmFibGVDb21tZW50c2AgYW5kIGEgdG9wLWxldmVsIGBlbmFibGVSZWFjdGlvbnNgIC8gYGVuYWJsZU1lbnRpb25zYFxuICAgICAgICogYXJlIG5vdCBgcmVjb3JkOmNoYXR0ZXJgIGtleXMgXHUyMDE0IGBSZWNvcmRDaGF0dGVyUHJvcHNgIGRlY2xhcmVzXG4gICAgICAgKiBgcG9zaXRpb25gLCBgd2lkdGhgLCBgY29sbGFwc2libGVgLCBgZGVmYXVsdENvbGxhcHNlZGAsIGBmZWVkYCBhbmRcbiAgICAgICAqIGBhcmlhYCwgbm90aGluZyBlbHNlLlxuICAgICAgICovXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGZlZWQ6IHtcbiAgICAgICAgICBzaG93Q29tcGxldGVkOiB0cnVlLFxuICAgICAgICAgIGVuYWJsZVJlYWN0aW9uczogdHJ1ZSxcbiAgICAgICAgICBlbmFibGVUaHJlYWRpbmc6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIHVua25vd24gYXMgUGFnZTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL2FjY291bnRfd29ya2JlbmNoLnBhZ2UudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXMvYWNjb3VudF93b3JrYmVuY2gucGFnZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUGFnZSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBBY2NvdW50IFdvcmtiZW5jaCBcdTIwMTQgQURSLTAwNDcgaW50ZXJmYWNlIHBhZ2UgKEFpcnRhYmxlIEludGVyZmFjZXMgcGFyaXR5KS5cbiAqXG4gKiBUaGUgYXV0aG9yLWN1cmF0ZWQgY291bnRlcnBhcnQgdG8gdGhlIEFjY291bnRzIG9iamVjdCBuYXYgZW50cnkuIFdoZXJlXG4gKiB0aGUgb2JqZWN0IGVudHJ5IChkYXRhIG1vZGUpIHNob3dzIGV2ZXJ5IGxpc3QgdmlldyBhcyBzd2l0Y2hlciB0YWJzIGFuZFxuICogb2ZmZXJzIHRoZSBmdWxsIHRvb2xiYXIsIHRoaXMgcGFnZSBpcyBkZWxpYmVyYXRlbHkgY2xvc2VkOlxuICpcbiAqICAgXHUyMDIyIGl0IFJFRkVSRU5DRVMgdGhlIGFjY291bnQgZGVmYXVsdCB2aWV3IChgc291cmNlVmlld2ApIFx1MjAxNCBjb2x1bW5zLFxuICogICAgIGJhc2UgZmlsdGVyIGFuZCBzb3J0IGFyZSBpbmhlcml0ZWQsIG5ldmVyIHJlc3RhdGVkICh0aGUgaXJvbiBydWxlKTtcbiAqICAgXHUyMDIyIGVuZCB1c2VycyBnZXQgZXhhY3RseSB0aHJlZSBxdWljayBmaWx0ZXJzOiBpbmR1c3RyeSAod2l0aCByZWNvcmRcbiAqICAgICBjb3VudHMpLCBjdXN0b21lciB0eXBlLCBhbmQgb3duZXJfaWQgKHRoZSBwbGF0Zm9ybSBvd25lcnNoaXAgbG9va3VwIFx1MjAxNFxuICogICAgIHJlbmRlcnMgYXMgYVxuICogICAgIHJlY29yZC1waWNrZXIgZHJvcGRvd24pO1xuICogICBcdTIwMjIgdGhlIHZpc3VhbGl6YXRpb24gaXMgbG9ja2VkIHRvIGdyaWQgKHNpbmdsZS1lbnRyeSB3aGl0ZWxpc3QpO1xuICogICBcdTIwMjIgYWR2YW5jZWQgZmlsdGVyaW5nIC8gdmlldyBtYW5hZ2VtZW50IGFyZSBub3Qgb2ZmZXJlZC5cbiAqXG4gKiBGaWx0ZXIgc2VsZWN0aW9ucyBwZXJzaXN0IGFzIGB1Zl8qYCBVUkwgcGFyYW1zIFx1MjAxNCByZWxvYWQtc2FmZSwgc2hhcmVhYmxlLlxuICpcbiAqIE5PVEU6IGBpbnRlcmZhY2VDb25maWcudXNlckZpbHRlcnNgIHJlcXVpcmVzIEBvYmplY3RzdGFjay9zcGVjID4gOS4yLjBcbiAqIChBRFItMDA0NykuIE9uIG9sZGVyIHNwZWNzIGRlZmluZVN0YWNrIHN0cmlwcyB0aGUgdW5rbm93biBrZXlzIGFuZCB0aGVcbiAqIHBhZ2UgcmVuZGVycyB3aXRob3V0IHRoZSBmaWx0ZXIgYmFyIFx1MjAxNCBhIGhhcm1sZXNzIG5vLW9wIHVudGlsIHRoZVxuICogZGVwZW5kZW5jeSBidW1wIGFjdGl2YXRlcyBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFjY291bnRXb3JrYmVuY2hQYWdlOiBQYWdlID0ge1xuICBuYW1lOiAnYWNjb3VudF93b3JrYmVuY2gnLFxuICBsYWJlbDogJ0FjY291bnQgV29ya2JlbmNoJyxcbiAgZGVzY3JpcHRpb246ICdDdXJhdGVkIGFjY291bnQgbGlzdCBmb3IgdGhlIHNhbGVzIHRlYW06IHF1aWNrIGZpbHRlcnMgb25seSwgbm8gdmlldyBtYW5hZ2VtZW50LicsXG4gIHR5cGU6ICdsaXN0JyxcbiAgb2JqZWN0OiAnY3JtX2FjY291bnQnLFxuICBraW5kOiAnZnVsbCcsXG4gIHRlbXBsYXRlOiAnZGVmYXVsdCcsXG4gIGlzRGVmYXVsdDogZmFsc2UsXG4gIC8vIEludGVyZmFjZSBwYWdlcyBjYXJyeSBubyByZWdpb25zIFx1MjAxNCB0aGUgbGlzdCBzdXJmYWNlIGlzIGdlbmVyYXRlZCBmcm9tXG4gIC8vIGBpbnRlcmZhY2VDb25maWdgIChBRFItMDA0NyksIG5vdCBjb21wb3NlZCBmcm9tIGNvbXBvbmVudHMuXG4gIHJlZ2lvbnM6IFtdLFxuICBpbnRlcmZhY2VDb25maWc6IHtcbiAgICBzb3VyY2U6ICdjcm1fYWNjb3VudCcsXG4gICAgc291cmNlVmlldzogJ2FsbF9hY2NvdW50cycsXG5cbiAgICAuLi4oe1xuICAgICAgdXNlckZpbHRlcnM6IHtcbiAgICAgICAgZWxlbWVudDogJ2Ryb3Bkb3duJyxcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ2luZHVzdHJ5Jywgc2hvd0NvdW50OiB0cnVlIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ3R5cGUnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ293bmVyX2lkJyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIC8vIHR5cGVkIHZpYSBzcHJlYWQtYXMtYW55IHVudGlsIEBvYmplY3RzdGFjay9zcGVjIHNoaXBzIEFEUi0wMDQ3XG4gICAgICAvLyAoVXNlckZpbHRlcnNTY2hlbWEgaXMgaW4gZnJhbWV3b3JrIG1haW4sID4gOS4yLjApXG4gICAgfSBhcyBhbnkpLFxuXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnXSxcbiAgICB9LFxuXG4gICAgdXNlckFjdGlvbnM6IHtcbiAgICAgIHNvcnQ6IHRydWUsXG4gICAgICBzZWFyY2g6IHRydWUsXG4gICAgICBmaWx0ZXI6IGZhbHNlLFxuICAgICAgcm93SGVpZ2h0OiBmYWxzZSxcbiAgICAgIGFkZFJlY29yZEZvcm06IGZhbHNlLFxuICAgIH0sXG5cbiAgICBzaG93UmVjb3JkQ291bnQ6IHRydWUsXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXMvaG9tZS5wYWdlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL2hvbWUucGFnZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUGFnZSwgUGFnZUNvbXBvbmVudCwgVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcbmltcG9ydCB7IEV2ZW50Vmlld3MgfSBmcm9tICcuLi92aWV3cy9ldmVudC52aWV3JztcbmltcG9ydCB7IExlYWRWaWV3cyB9IGZyb20gJy4uL3ZpZXdzL2xlYWQudmlldyc7XG5pbXBvcnQgeyBPcHBvcnR1bml0eVZpZXdzIH0gZnJvbSAnLi4vdmlld3Mvb3Bwb3J0dW5pdHkudmlldyc7XG5pbXBvcnQgeyBUYXNrVmlld3MgfSBmcm9tICcuLi92aWV3cy90YXNrLnZpZXcnO1xuXG4vKipcbiAqIEVtYmVkIG9uZSBvZiBhbiBvYmplY3QncyBPV04gc2F2ZWQgbGlzdCB2aWV3cyBpbiBhIHBhZ2UgcmVnaW9uLlxuICpcbiAqIFRoZSBob21lIHRhYnMgdXNlZCB0byBob2xkIGEgYmFyZSBgeyB0eXBlOiAncGFnZTpzZWN0aW9uJywgcHJvcGVydGllczoge30gfWBcbiAqIGVhY2gsIHdoaWNoIHJlbmRlcnMgYW4gZW1wdHkgYDxzZWN0aW9uPmAgXHUyMDE0IHRocmVlIHRhYiBuYW1lcyBwcm9taXNpbmcgY29udGVudFxuICogb3ZlciB0aHJlZSBibGFuayBwYW5lbHMuIFNhbWUgbGVzc29uIGFzIHRoZSBgcmVjb3JkOmhpZ2hsaWdodHNgIGNhcmQgYmVsb3c6XG4gKiBhIGNvbXBvbmVudCB3aXRoIG5vIGJpbmRpbmcgcmVuZGVycyBub3RoaW5nLCBzaWxlbnRseS5cbiAqXG4gKiBgbGlzdC12aWV3YCBpcyB0aGUgYmxvY2sgdGhhdCByZW5kZXJzIGFuIG9iamVjdCBsaXN0IGluc2lkZSBhIHBhZ2UgKGl0IGlzIGluXG4gKiB0aGUgcGxhdGZvcm0ncyBwdWJsaWMgYmxvY2sgY29udHJhY3QsIEFEUi0wMDgwKSwgYW5kIGl0IHRha2VzIGl0cyBjb2x1bW5zIC9cbiAqIGZpbHRlciAvIHNvcnQgaW5saW5lIFx1MjAxNCB0aGVyZSBpcyBubyB3YXkgZm9yIGEgcGFnZSBjb21wb25lbnQgdG8gbmFtZSBhIHNhdmVkXG4gKiB2aWV3LCBzbyB0aG9zZSB0aHJlZSBrZXlzIGFyZSBSRUFEIE9GRiB0aGUgc2F2ZWQgdmlldyBoZXJlIHJhdGhlciB0aGFuXG4gKiByZXR5cGVkLiBUaGF0IGlzIHRoZSBzYW1lIGlyb24gcnVsZSBgYWNjb3VudF93b3JrYmVuY2gucGFnZS50c2Agc3RhdGVzIGZvclxuICogaW50ZXJmYWNlIHBhZ2VzOiBjb2x1bW5zLCBiYXNlIGZpbHRlciBhbmQgc29ydCBhcmUgaW5oZXJpdGVkLCBuZXZlciByZXN0YXRlZC5cbiAqIFJldHlwaW5nIHRoZW0gd291bGQgaGF2ZSBjcmVhdGVkIGEgc2Vjb25kIGRlZmluaXRpb24gb2YgXCJteSBsZWFkc1wiIHRoYXRcbiAqIGRyaWZ0cyBmcm9tIGBzcmMvc2FsZXMvdmlld3MvbGVhZC52aWV3LnRzYCB0aGUgZmlyc3QgdGltZSBlaXRoZXIgc2lkZSBpcyBlZGl0ZWQuXG4gKlxuICogYHtjdXJyZW50X3VzZXJfaWR9YCBpbiBhIHNhdmVkIHZpZXcncyBmaWx0ZXIgcmVzb2x2ZXMgb24gdGhpcyBwYXRoICh0aGVcbiAqIE9iamVjdFFMIHJlYWQgcGF0aCBydW5zIGByZXNvbHZlRmlsdGVyVG9rZW5zKClgIHNpbmNlIDE3LjAuMC1yYy4wKSwgc29cbiAqIFwibWluZVwiIHJlYWxseSBkb2VzIG1lYW4gbWluZSBoZXJlIFx1MjAxNCBtZWFzdXJlZCB0YWIgYnkgdGFiIGluIHRoZSBicm93c2VyLCBzZWVcbiAqIHRoZSBQUi4gVGhlIG5hdidzIE15IFdvcmsgZ3JvdXAgcmVhY2hlcyB0aGUgU0FNRSB2aWV3cyBieSBuYW1lXG4gKiAoYHNyYy9zYWxlcy9hcHBzL2NybS5hcHAudHNgKTsgdGhlc2UgdGFicyBhcmUgdGhlIGxhbmRpbmctcGFnZSBzaG9ydGN1dCB0byB0aGVtLlxuICovXG5jb25zdCBlbWJlZGRlZExpc3RWaWV3ID0gKGlkOiBzdHJpbmcsIG9iamVjdE5hbWU6IHN0cmluZywgdmlld3M6IFZpZXcsIHZpZXdLZXk6IHN0cmluZyk6IFBhZ2VDb21wb25lbnQgPT4ge1xuICBjb25zdCB2aWV3ID0gdmlld3MubGlzdFZpZXdzPy5bdmlld0tleV07XG4gIC8vIExvdWQsIGF0IGJ1aWxkIHRpbWU6IGEgcmVuYW1lZCBvciBkZWxldGVkIHZpZXcgbXVzdCBub3QgZGVncmFkZSBiYWNrIGludG9cbiAgLy8gYSBibGFuayB0YWIgXHUyMDE0IHRoYXQgaXMgdGhlIGRlZmVjdCB0aGlzIHdob2xlIGNvbXBvbmVudCByZXBsYWNlcy5cbiAgaWYgKCF2aWV3KSB0aHJvdyBuZXcgRXJyb3IoYGhvbWUucGFnZS50czogbm8gc2F2ZWQgdmlldyBcIiR7dmlld0tleX1cIiBvbiAke29iamVjdE5hbWV9YCk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2xpc3QtdmlldycsXG4gICAgaWQsXG4gICAgbGFiZWw6IHZpZXcubGFiZWwsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgb2JqZWN0TmFtZSxcbiAgICAgIHZpZXdUeXBlOiAnZ3JpZCcsXG4gICAgICBjb2x1bW5zOiB2aWV3LmNvbHVtbnMsXG4gICAgICBmaWx0ZXI6IHZpZXcuZmlsdGVyLFxuICAgICAgc29ydDogdmlldy5zb3J0LFxuICAgIH0sXG4gIH07XG59O1xuXG4vKipcbiAqIFNhbGVzIEhvbWUgUGFnZVxuICpcbiAqIERlbW9uc3RyYXRlcyBhIGhvbWUgcGFnZSBsYXlvdXQgd2l0aCBkYXNoYm9hcmRzIGFuZCBxdWljayBhY2Nlc3Mgd2lkZ2V0cy5cbiAqIFNpbWlsYXIgdG8gU2FsZXNmb3JjZSBMaWdodG5pbmcgSG9tZSBQYWdlLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBEYXNoYm9hcmQtc3R5bGUgbGF5b3V0XG4gKiAtIE11bHRpcGxlIGNvbXBvbmVudCByZWdpb25zXG4gKiAtIEdsb2JhbCBzZWFyY2ggYW5kIG5vdGlmaWNhdGlvbnNcbiAqIC0gUXVpY2sgYWN0aW9uIGNhcmRzXG4gKi9cbmV4cG9ydCBjb25zdCBTYWxlc0hvbWVQYWdlOiBQYWdlID0ge1xuICBuYW1lOiAnc2FsZXNfaG9tZV9wYWdlJyxcbiAgbGFiZWw6ICdTYWxlcyBIb21lJyxcbiAgZGVzY3JpcHRpb246ICdTYWxlcyB0ZWFtIGhvbWUgcGFnZSB3aXRoIGtleSBtZXRyaWNzIGFuZCBxdWljayBhY3Rpb25zJyxcbiAgXG4gIHR5cGU6ICdob21lJyxcbiAgXG4gIHRlbXBsYXRlOiAndGhyZWUtY29sdW1uJyxcbiAga2luZDogJ2Z1bGwnLCAgXG4gIHZhcmlhYmxlczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdzZWxlY3RlZFBlcmlvZCcsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogJ3RoaXNfbW9udGgnLFxuICAgIH0sXG4gIF0sXG4gIFxuICByZWdpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2hlYWRlcicsXG4gICAgICB3aWR0aDogJ2Z1bGwnLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BhZ2U6aGVhZGVyJyxcbiAgICAgICAgICBpZDogJ2hvbWVfaGVhZGVyJyxcbiAgICAgICAgICBsYWJlbDogJ1NhbGVzIEhvbWUgSGVhZGVyJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB0aXRsZTogJ1NhbGVzIERhc2hib2FyZCcsXG4gICAgICAgICAgICAvLyBXYXMgYFdlbGNvbWUgYmFjaywge2N1cnJlbnRfdXNlci5maXJzdF9uYW1lfWAsIHdoaWNoIHJlbmRlcmVkIGFzXG4gICAgICAgICAgICAvLyBcIldlbGNvbWUgYmFjaywgXCIgXHUyMDE0IHRoZSBuYW1lIHdhcyBuZXZlciBnb2luZyB0byBhcnJpdmUsIGJlY2F1c2VcbiAgICAgICAgICAgIC8vIHRoYXQgb25lIHN0cmluZyBtaXhlcyB0aHJlZSB2b2NhYnVsYXJpZXMgdGhhdCBkbyBub3QgY29tcG9zZTpcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgMS4gYHN1YnRpdGxlYCBpcyBhbiBgSTE4bkxhYmVsYCAoYENvbXBvbmVudFByb3BzTWFwYCxcbiAgICAgICAgICAgIC8vICAgICBgQG9iamVjdHN0YWNrL3NwZWMvdWlgKSBcdTIwMTQgYSBkaXNwbGF5IHN0cmluZyBvciBhbiBpbmxpbmVcbiAgICAgICAgICAgIC8vICAgICBsb2NhbGUgbWFwLCByZXNvbHZlZCBieSBgcmVzb2x2ZUkxOG5MYWJlbGAuIFRoZSBmaWVsZCBoYXMgbm9cbiAgICAgICAgICAgIC8vICAgICB0b2tlbiBwYXNzIGFuZCBubyBleHByZXNzaW9uIHBhc3Mgb2YgaXRzIG93bi5cbiAgICAgICAgICAgIC8vICAyLiBCcmFjZXMgRE8gcmVzb2x2ZSBpbiBhIHBhZ2UgaGVhZGVyLCBidXQgdGhlIHZvY2FidWxhcnkgaXMgdGhlXG4gICAgICAgICAgICAvLyAgICAgQk9VTkQgUkVDT1JEJ3Mgb3duIGZpZWxkcyBcdTIwMTQgYGNhc2VfZGV0YWlsLnBhZ2UudHNgIHJlY29yZHMgdGhlXG4gICAgICAgICAgICAvLyAgICAgbWVhc3VyZW1lbnQsIHdoZXJlIGB7YWNjb3VudH1gIG1hdGNoZWQgbm8gZmllbGQgYW5kIHRoZVxuICAgICAgICAgICAgLy8gICAgIHN1YnRpdGxlIHJlbmRlcmVkIGJsYW5rIHVudGlsIGl0IHdhcyBzcGVsbGVkIGB7Y3JtX2FjY291bnR9YC5cbiAgICAgICAgICAgIC8vICAgICBBIGB0eXBlOiAnaG9tZSdgIHBhZ2UgaGFzIG5vIHJlY29yZCwgc28gbm8gYnJhY2UgdG9rZW4gY2FuXG4gICAgICAgICAgICAvLyAgICAgZXZlciByZXNvbHZlIGhlcmUuXG4gICAgICAgICAgICAvLyAgMy4gYGN1cnJlbnRfdXNlci5maXJzdF9uYW1lYCBpcyBhIENFTCBwYXRoLCBhbmQgQ0VMIGlzIHdyaXR0ZW5cbiAgICAgICAgICAgIC8vICAgICBiYXJlLCBuZXZlciBpbnNpZGUgYHtcdTIwMjZ9YC4gVGhlIG9uZSByZXNvbHZhYmxlIGJyYWNlIHRva2VuIGluXG4gICAgICAgICAgICAvLyAgICAgdGhlIGZpbHRlciB2b2NhYnVsYXJ5IGlzIGB7Y3VycmVudF91c2VyX2lkfWAgb24gaXRzIG93bi5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBBIGdyZWV0aW5nIHRoYXQgbmFtZXMgdGhlIHVzZXIgaXMgbm90IGV4cHJlc3NpYmxlIG9uIGFcbiAgICAgICAgICAgIC8vIHRyYW5zbGF0YWJsZSBsYWJlbCwgc28gdGhlIGxhYmVsIG5vdyBzYXlzIHRoZSBwYXJ0IHRoYXQgaXMgdHJ1ZVxuICAgICAgICAgICAgLy8gaW4gZXZlcnkgbG9jYWxlIGFuZCB0aGUgZm91ciBidW5kbGVzIGNhcnJ5IHRoZSB0cmFuc2xhdGlvbnNcbiAgICAgICAgICAgIC8vIChgcGFnZXMuc2FsZXNfaG9tZV9wYWdlLnN1YnRpdGxlYCkuIFBlcnNvbmFsaXNpbmcgaXQgd291bGQgbmVlZCBhXG4gICAgICAgICAgICAvLyBjb21wb25lbnQgdGhhdCB0YWtlcyB1c2VyIGRhdGEgXHUyMDE0IG5vIHNoaXBwZWQgY29tcG9uZW50IGRvZXNcbiAgICAgICAgICAgIC8vIChgdXNlcjpwcm9maWxlYCBhbmQgaXRzIG5laWdoYm91cnMgYXJlIGBlbXB0eVByb3BzYCByb3dzKSwgc29cbiAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzdGF0aWMgZ3JlZXRpbmcgcmF0aGVyIHRoYW4gYSB3aWRlbmVkIGFjY2VwdCBzdXJmYWNlLlxuICAgICAgICAgICAgc3VidGl0bGU6ICdXZWxjb21lIGJhY2snLFxuICAgICAgICAgICAgLy8gYGljb25gIHJlbW92ZWQgZnJvbSBgcGFnZTpoZWFkZXJgIGluIEBvYmplY3RzdGFjay9zcGVjIDE3LjAuMFxuICAgICAgICAgICAgLy8gKCM2OTQ2LCBBRFItMDA4NyBEMikgXHUyMDE0IGRlbGV0ZWQsIG5vdCByZW5hbWVkLiBTZWUgdGhlIGZ1bGwgbm90ZSBvblxuICAgICAgICAgICAgLy8gYGFjY291bnRfZGV0YWlsLnBhZ2UudHNgOyBub3RoaW5nIGV2ZXIgZHJldyBpdC5cbiAgICAgICAgICAgIC8vIGBicmVhZGNydW1iYCByZXRpcmVkIGZyb20gYHBhZ2U6aGVhZGVyYCBpbiBAb2JqZWN0c3RhY2svc3BlYyAxNy42LjBcbiAgICAgICAgICAgIC8vICgjMjA3ODUsIGBwYWdlLWhlYWRlci1icmVhZGNydW1iLXJlbW92ZWRgKSBcdTIwMTQgZGVsZXRlZDogbm8gcmVuZGVyZXJcbiAgICAgICAgICAgIC8vIGV2ZXIgZHJldyBhIHRyYWlsIGZvciBpdDsgdGhlIGFwcCBzaGVsbCdzIG93biB0cmFpbCBpcyB1bmNoYW5nZWQuXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBcbiAgICB7XG4gICAgICBuYW1lOiAnbGVmdF9zaWRlYmFyJyxcbiAgICAgIHdpZHRoOiAnc21hbGwnLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BhZ2U6Y2FyZCcsXG4gICAgICAgICAgaWQ6ICdxdWlja19jcmVhdGUnLFxuICAgICAgICAgIGxhYmVsOiAnUXVpY2sgQ3JlYXRlJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB0aXRsZTogJ1F1aWNrIENyZWF0ZScsXG4gICAgICAgICAgICBib3JkZXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnbmF2Om1lbnUnLFxuICAgICAgICAgICAgICAgIGlkOiAnY3JlYXRlX21lbnUnLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAvLyBUaGVyZSBpcyBubyBgUmVjZW50IEl0ZW1zYCBjYXJkIGhlcmUgYW55IG1vcmUsIGFuZCByZS1hZGRpbmcgb25lXG4gICAgICAgIC8vIG5lZWRzIGEgZGF0YSBzb3VyY2UgdGhhdCBkb2VzIG5vdCBleGlzdCB5ZXQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEl0IHNoaXBwZWQgYXMgYSBgcGFnZTpjYXJkYCB3aXRoIGEgdGl0bGUgYW5kIG5vIGJvZHk6IGEgYm9yZGVyZWQgYm94XG4gICAgICAgIC8vIHdpdGggdGhlIHdvcmRzIFwiUmVjZW50IEl0ZW1zXCIgYW5kIG5vdGhpbmcgdW5kZXIgdGhlbSwgb24gdGhlIGxhbmRpbmdcbiAgICAgICAgLy8gcGFnZSBvZiBldmVyeSBgc2FsZXNfcmVwYCAvIGBzYWxlc19tYW5hZ2VyYC4gXCJSZWNlbnRcIiBpcyBwZXItdXNlclxuICAgICAgICAvLyBhY2Nlc3MgaGlzdG9yeSBhY3Jvc3Mgb2JqZWN0cywgYW5kIHRoZSBwbGF0Zm9ybSBwdWJsaXNoZXMgbm8gc291cmNlXG4gICAgICAgIC8vIGZvciBpdCBvbiAxNy4xLjAgXHUyMDE0IGBDb21wb25lbnRQcm9wc01hcGAgaGFzIG5vIHJlY2VudC1yZWNvcmRzXG4gICAgICAgIC8vIGNvbXBvbmVudCwgYW5kIHRoZSB0d28gdGhhdCBzb3VuZCBsaWtlIG9uZSAoYHJlY29yZDphY3Rpdml0eWAsXG4gICAgICAgIC8vIGByZWNvcmQ6aGlzdG9yeWApIGJvdGggcmVhZCB0aGUgcGFnZSdzIEJPVU5EIFJFQ09SRCwgd2hpY2ggYSBob21lXG4gICAgICAgIC8vIHBhZ2UgZG9lcyBub3QgaGF2ZS4gQmluZGluZyBpdCB0byBvbmUgb2JqZWN0J3MgbGlzdCB2aWV3IGluc3RlYWRcbiAgICAgICAgLy8gd291bGQgaGF2ZSBtYWRlIHRoZSB0aXRsZSBsaWUsIHdoaWNoIGlzIHRoZSBkZWZlY3QgIzc3MSBleGlzdHMgdG9cbiAgICAgICAgLy8gcHJldmVudCwgc28gdGhlIGNhcmQgaXMgcmVtb3ZlZCByYXRoZXIgdGhhbiBmaWxsZWQgd2l0aCBzb21ldGhpbmdcbiAgICAgICAgLy8gdGhhdCBpcyBub3QgcmVjZW5jeS4gUmVjb3JkZWQgYXMgIzEyMTc7IHdoZW4gdGhlIHBsYXRmb3JtIHNoaXBzIGFcbiAgICAgICAgLy8gcmVjZW50LXJlY29yZHMgc291cmNlLCB0aGlzIGlzIHdoZXJlIHRoZSBjYXJkIGdvZXMgYmFjay5cbiAgICAgIF0sXG4gICAgfSxcbiAgICBcbiAgICB7XG4gICAgICBuYW1lOiAnbWFpbicsXG4gICAgICB3aWR0aDogJ2xhcmdlJyxcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwYWdlOmNhcmQnLFxuICAgICAgICAgIGlkOiAna2V5X21ldHJpY3MnLFxuICAgICAgICAgIGxhYmVsOiAnS2V5IE1ldHJpY3MnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRpdGxlOiAnS2V5IFBlcmZvcm1hbmNlIEluZGljYXRvcnMnLFxuICAgICAgICAgICAgYm9yZGVyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgLy8gYHJlY29yZDpoaWdobGlnaHRzYCBuZWVkcyBhIGJvdW5kIHJlY29yZCBhbmQgcmVhbCBmaWVsZHM7IGEgaG9tZVxuICAgICAgICAgICAgLy8gcGFnZSBoYXMgbmVpdGhlciwgYW5kIHRoZSBmb3VyIG5hbWVzIGl0IGxpc3RlZCAodG90YWxfcmV2ZW51ZSxcbiAgICAgICAgICAgIC8vIGRlYWxzX3dvbiwgXHUyMDI2KSBleGlzdCBvbiBubyBvYmplY3QgXHUyMDE0IHRoZSBjYXJkIHJlbmRlcmVkIGJsYW5rLlxuICAgICAgICAgICAgLy8gYG9iamVjdC1tZXRyaWNgIHdpZGdldHMgYWdncmVnYXRlIGxpdmUgZGF0YSBpbnN0ZWFkLlxuICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QtbWV0cmljJyxcbiAgICAgICAgICAgICAgICBpZDogJ2twaV9yZXZlbnVlX3dvbicsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICAgICBsYWJlbDogJ1JldmVudWUgKFdvbiknLFxuICAgICAgICAgICAgICAgICAgaWNvbjogJ2RvbGxhci1zaWduJyxcbiAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZTogeyBmaWVsZDogJ2Ftb3VudCcsIGZ1bmN0aW9uOiAnc3VtJyB9LFxuICAgICAgICAgICAgICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ3N0YWdlJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ2Nsb3NlZF93b24nIH1dLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2JqZWN0LW1ldHJpYycsXG4gICAgICAgICAgICAgICAgaWQ6ICdrcGlfZGVhbHNfd29uJyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiAnRGVhbHMgV29uJyxcbiAgICAgICAgICAgICAgICAgIGljb246ICd0cm9waHknLFxuICAgICAgICAgICAgICAgICAgYWdncmVnYXRlOiB7IGZpZWxkOiAnaWQnLCBmdW5jdGlvbjogJ2NvdW50JyB9LFxuICAgICAgICAgICAgICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ3N0YWdlJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ2Nsb3NlZF93b24nIH1dLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2JqZWN0LW1ldHJpYycsXG4gICAgICAgICAgICAgICAgaWQ6ICdrcGlfcGlwZWxpbmVfdmFsdWUnLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgICAgICAgICAgICAgbGFiZWw6ICdQaXBlbGluZSBWYWx1ZScsXG4gICAgICAgICAgICAgICAgICBpY29uOiAnYnJpZWZjYXNlJyxcbiAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZTogeyBmaWVsZDogJ2Ftb3VudCcsIGZ1bmN0aW9uOiAnc3VtJyB9LFxuICAgICAgICAgICAgICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ3N0YWdlJywgb3BlcmF0b3I6ICdub3RfaW4nLCB2YWx1ZTogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfV0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QtbWV0cmljJyxcbiAgICAgICAgICAgICAgICBpZDogJ2twaV9vcGVuX2xlYWRzJyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2xlYWQnLFxuICAgICAgICAgICAgICAgICAgbGFiZWw6ICdPcGVuIExlYWRzJyxcbiAgICAgICAgICAgICAgICAgIGljb246ICd1c2VyLXBsdXMnLFxuICAgICAgICAgICAgICAgICAgYWdncmVnYXRlOiB7IGZpZWxkOiAnaWQnLCBmdW5jdGlvbjogJ2NvdW50JyB9LFxuICAgICAgICAgICAgICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ2lzX2NvbnZlcnRlZCcsIG9wZXJhdG9yOiAnZXF1YWxzJywgdmFsdWU6IGZhbHNlIH1dLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncGFnZTp0YWJzJyxcbiAgICAgICAgICBpZDogJ2hvbWVfdGFicycsXG4gICAgICAgICAgbGFiZWw6ICdIb21lIFRhYnMnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogYHR5cGVgIFx1MjE5MiBgdGFiU3R5bGVgIChAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjAsICM2Nzc2LCBBRFItMDA4N1xuICAgICAgICAgICAgICogRDIpLiBUaGUgY29uY2VwdCBhbmQgdGhlIHZhbHVlIHZvY2FidWxhcnkgKGBsaW5lYCB8IGBjYXJkYCB8XG4gICAgICAgICAgICAgKiBgcGlsbGApIGFyZSB1bmNoYW5nZWQ7IG9ubHkgdGhlIHNwZWxsaW5nIG1vdmVkLCBiZWNhdXNlIGEgcHJvcHNcbiAgICAgICAgICAgICAqIGtleSBuYW1lZCBgdHlwZWAgY29sbGlkZXMgd2l0aCB0aGUgcGFnZSBjb21wb25lbnQncyBvd24gZGlzcGF0Y2hcbiAgICAgICAgICAgICAqIGtleTogb2JqZWN0dWkncyBgU2NoZW1hUmVuZGVyZXJgIGhvaXN0cyBgcHJvcGVydGllc2Agb250byB0aGUgbm9kZVxuICAgICAgICAgICAgICogYnV0IGRlbGliZXJhdGVseSBza2lwcyBgdHlwZWAgYW5kIGBpZGAgKG9yIHRoZSBpbm5lciB2YWx1ZSB3b3VsZFxuICAgICAgICAgICAgICogc2hhZG93IHdoaWNoIHJlbmRlcmVyIHRvIGRpc3BhdGNoIHRvKSwgYW5kIGBzZHVpLXBhcnNlcmAgbGlzdHNcbiAgICAgICAgICAgICAqIGB0eXBlYCBpbiBgQkFTRV9QUk9QU2AsIHNvIGEgbWFuaWZlc3QgaW5wdXQgYnkgdGhhdCBuYW1lIGlzIG5ldmVyXG4gICAgICAgICAgICAgKiB2YWxpZGF0ZWQgYXQgYWxsLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIFJlbmFtaW5nIGlzIGJlaGF2aW91ci1wcmVzZXJ2aW5nIG9uIHRoaXMgcGFnZSBhbmQgb24gdGhlIHRocmVlXG4gICAgICAgICAgICAgKiByZWNvcmQgcGFnZXM6IHRoZSByZW5kZXJlciByZXNvbHZlc1xuICAgICAgICAgICAgICogYHNjaGVtYT8ucHJvcGVydGllcz8udHlwZSB8fCBzY2hlbWE/LnRhYlN0eWxlIHx8ICdsaW5lJ2AsIHNvIGl0XG4gICAgICAgICAgICAgKiBoYXMgYmVlbiBob25vdXJpbmcgdGhlIHJldGlyZWQgc3BlbGxpbmcgYXMgYSBiYWNrLWNvbXBhdCByZWFkIGFsbFxuICAgICAgICAgICAgICogYWxvbmcgYW5kIHBpY2tzIHVwIHRoZSBjYW5vbmljYWwgb25lIHRocm91Z2ggdGhlIHNhbWUgaG9pc3QuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRhYlN0eWxlOiAnY2FyZCcsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXG4gICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdNeSBMZWFkcycsXG4gICAgICAgICAgICAgICAgaWNvbjogJ3VzZXItcGx1cycsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtlbWJlZGRlZExpc3RWaWV3KCdob21lX215X2xlYWRzJywgJ2NybV9sZWFkJywgTGVhZFZpZXdzLCAnbXlfbGVhZHMnKV0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBXYXMgXCJNeSBPcHBvcnR1bml0aWVzXCIsIHdoaWNoIHByb21pc2VzIGV2ZXJ5IGRlYWwgSSBvd247IHRoZVxuICAgICAgICAgICAgICAgIC8vIHZpZXcgYmVoaW5kIGl0IGlzIHRoZSBvcGVuLXBpcGVsaW5lIG9uZSAodGhlIG5hdidzIE15IFdvcmsgPlxuICAgICAgICAgICAgICAgIC8vIE15IERlYWxzIG9wZW5zIHRoZSBzYW1lIGBteV9vcGVuX2RlYWxzYCkuIFRoZSB0YWIgbmFtZSBub3dcbiAgICAgICAgICAgICAgICAvLyBzYXlzIHdoYXQgdGhlIHBhbmVsIHNob3dzLlxuICAgICAgICAgICAgICAgIGxhYmVsOiAnTXkgT3BlbiBEZWFscycsXG4gICAgICAgICAgICAgICAgaWNvbjogJ2RvbGxhci1zaWduJyxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW2VtYmVkZGVkTGlzdFZpZXcoJ2hvbWVfbXlfZGVhbHMnLCAnY3JtX29wcG9ydHVuaXR5JywgT3Bwb3J0dW5pdHlWaWV3cywgJ215X29wZW5fZGVhbHMnKV0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBTYW1lIGNvcnJlY3Rpb246IGBteV9vcGVuX3Rhc2tzYCBleGNsdWRlcyBjb21wbGV0ZWQgdGFza3MuXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdNeSBPcGVuIFRhc2tzJyxcbiAgICAgICAgICAgICAgICBpY29uOiAnbGlzdC1jaGVja3MnLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbZW1iZWRkZWRMaXN0VmlldygnaG9tZV9teV90YXNrcycsICdjcm1fdGFzaycsIFRhc2tWaWV3cywgJ215X29wZW5fdGFza3MnKV0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgXG4gICAge1xuICAgICAgbmFtZTogJ3JpZ2h0X3NpZGViYXInLFxuICAgICAgd2lkdGg6ICdtZWRpdW0nLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BhZ2U6Y2FyZCcsXG4gICAgICAgICAgaWQ6ICdhaV9icmllZmluZycsXG4gICAgICAgICAgLy8gVGhlIGFzc2lzdGFudCBpcyB0aGUgUExBVEZPUk0ncyAoYGFza2ApLCBub3QgYW4gYXBwLW93bmVkIHBlcnNvbmE6XG4gICAgICAgICAgLy8gSG90Q1JNIGNvbnRyaWJ1dGVzIHNraWxscywgdGhlIGFnZW50IGxpdmVzIGluIHRoZSBjbG91ZCBzaWRlXG4gICAgICAgICAgLy8gKG1haW50YWluZXIgcnVsaW5nIG9uICM2MTIsIDIwMjYtMDgtMDQpLiBUaGUgcmV0aXJlZCBgc2FsZXNfY29waWxvdGBcbiAgICAgICAgICAvLyBhZ2VudCAoIzUxMiwgQURSLTAwNjMgXHUwMEE3MikgbXVzdCBub3QgYmUgbmFtZWQgaW4gbGl2ZSBVSSBjb3B5IFx1MjAxNCBhbmRcbiAgICAgICAgICAvLyB0aGUgZW50cnkgcG9pbnQgaXMgdGhlIGFzc2lzdGFudCBwYW5lbCB0aGUgcGxhdGZvcm0gb3BlbnMgZnJvbSB0aGVcbiAgICAgICAgICAvLyByaWdodCBlZGdlIG9mIGV2ZXJ5IHBhZ2UsIHdoaWNoIGlzIHRoZSB3b3JkaW5nXG4gICAgICAgICAgLy8gYGNvbnRlbnQvZG9jcy9haS1jb3BpbG90L2luZGV4Lm1keGAgbGFuZGVkIGluICM2MTEvUFIgIzEwMDEuXG4gICAgICAgICAgbGFiZWw6ICdUb2RheSB3aXRoIHRoZSBBSSBBc3Npc3RhbnQnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRpdGxlOiAnQXNrIHRoZSBBSSBBc3Npc3RhbnQnLFxuICAgICAgICAgICAgYm9yZGVyZWQ6IHRydWUsXG4gICAgICAgICAgICAvLyBUaGUgcGFyYWdyYXBoIGlzIGFuIGBlbGVtZW50OnRleHRgIGNoaWxkICgjMTU4MSkuIEl0IHVzZWQgdG8gYmVcbiAgICAgICAgICAgIC8vIGBwcm9wZXJ0aWVzLmRlc2NyaXB0aW9uYCwgd2hpY2ggYHBhZ2U6Y2FyZGAgZG9lcyBub3QgZGVjbGFyZSwgc29cbiAgICAgICAgICAgIC8vIHRoZSBjYXJkIHJlbmRlcmVkIGFzIGEgdGl0bGUgb3ZlciBub3RoaW5nLiBgY29udGVudGAgaXMgbm90IG9uXG4gICAgICAgICAgICAvLyB0aGUgbG9jYWxlIHBhY2sncyBwYWdlLWNvbXBvbmVudCBmYWNlLCBzbyB0aGUgZm91ciBsYW5ndWFnZXNcbiAgICAgICAgICAgIC8vIGxpdmUgaGVyZSBhcyBhbiBpbmxpbmUgbG9jYWxlIG1hcCwgdGhlIHNwZWMncyByb3V0ZSBmb3IgcGFnZVxuICAgICAgICAgICAgLy8gcHJvc2UuIFRoZSAjMTAwMiBwZXJzb25hIGd1YXJkIGluXG4gICAgICAgICAgICAvLyBgdGVzdC9tZXRhZGF0YS1yZWZlcmVuY2VzLnRlc3QudHNgIHJlYWRzIHRoaXMgY2hpbGQuXG4gICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2VsZW1lbnQ6dGV4dCcsXG4gICAgICAgICAgICAgICAgaWQ6ICdhaV9icmllZmluZ190ZXh0JyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIGVuOiAnT3BlbiB0aGUgYXNzaXN0YW50IHBhbmVsIGZyb20gdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHBhZ2UgYW5kIGFzayBcIndoYXQgc2hvdWxkIEkgZm9jdXMgb24gdG9kYXk/XCIgXHUyMDE0IGl0IHNlZXMgeW91ciBsaXZlIHBpcGVsaW5lLCBzY2hlbWEsIGFuZCBhY2NvdW50cy4nLFxuICAgICAgICAgICAgICAgICAgICAnemgtQ04nOlxuICAgICAgICAgICAgICAgICAgICAgICdcdTRFQ0VcdTk4NzVcdTk3NjJcdTUzRjNcdTRGQTdcdTYyNTNcdTVGMDBcdTUyQTlcdTYyNEJcdTk3NjJcdTY3N0ZcdUZGMENcdThCRTJcdTk1RUVcIlx1NjIxMVx1NEVDQVx1NTkyOVx1NUU5NFx1OEJFNVx1NTE3M1x1NkNFOFx1NEVDMFx1NEU0OFx1RkYxRlwiXHUyMDE0XHUyMDE0XHU1QjgzXHU1M0VGXHU0RUU1XHU1QjlFXHU2NUY2XHU2N0U1XHU3NzBCXHU2MEE4XHU3Njg0XHU5NTAwXHU1NTJFXHU3QkExXHU5MDUzXHUzMDAxXHU2N0I2XHU2Nzg0XHU0RTBFXHU1QkEyXHU2MjM3XHU0RkUxXHU2MDZGXHUzMDAyJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VzLUVTJzpcbiAgICAgICAgICAgICAgICAgICAgICAnQWJyYSBlbCBwYW5lbCBkZWwgYXNpc3RlbnRlIGRlc2RlIGVsIGJvcmRlIGRlcmVjaG8gZGUgbGEgcFx1MDBFMWdpbmEgeSBwcmVndW50ZSBcIlx1MDBCRmVuIHF1XHUwMEU5IGRlYmVyXHUwMEVEYSBjb25jZW50cmFybWUgaG95P1wiIFx1MjAxNCB2ZSBzdSBmbHVqbyBkZSB2ZW50YXMsIGVzcXVlbWEgeSBjdWVudGFzIGVuIHRpZW1wbyByZWFsLicsXG4gICAgICAgICAgICAgICAgICAgICdqYS1KUCc6XG4gICAgICAgICAgICAgICAgICAgICAgJ1x1MzBEQVx1MzBGQ1x1MzBCOFx1NTNGM1x1N0FFRlx1MzA0Qlx1MzA4OVx1MzBBMlx1MzBCN1x1MzBCOVx1MzBCRlx1MzBGM1x1MzBDOFx1MzBEMVx1MzBDRFx1MzBFQlx1MzA5Mlx1OTU4Qlx1MzA0RFx1MzAwMVx1MzAwQ1x1NEVDQVx1NjVFNVx1MzA2Rlx1NEY1NVx1MzA2Qlx1OTZDNlx1NEUyRFx1MzA1OVx1MzA3OVx1MzA0RFx1MzA0Qlx1RkYxRlx1MzAwRFx1MzA2OFx1NUMwQlx1MzA2RFx1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NCBcdTIwMTQgXHUzMEVBXHUzMEEyXHUzMEVCXHUzMEJGXHUzMEE0XHUzMEUwXHUzMDZFXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHUzMDAxXHUzMEI5XHUzMEFEXHUzMEZDXHUzMERFXHUzMDAxXHU1M0Q2XHU1RjE1XHU1MTQ4XHU2MEM1XHU1ODMxXHUzMDkyXHU2MjhBXHU2M0UxXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdFXHUzMDU5XHUzMDAyJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwYWdlOmNhcmQnLFxuICAgICAgICAgIGlkOiAndXBjb21pbmdfZXZlbnRzJyxcbiAgICAgICAgICAvLyBXYXMgYENhbGVuZGFyYCAvIFwiVG9kYXkncyBTY2hlZHVsZVwiIG92ZXIgYW4gZW1wdHkgYm9yZGVyZWQgYm94IFx1MjAxNFxuICAgICAgICAgIC8vIHRoZSBjYXJkIGRlY2xhcmVkIG5vIGJvZHksIHNvIHRoZSByZW5kZXJlciBoYWQgbm90aGluZyB0byBkcmF3LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSXQgaXMgYm91bmQgdG8gYGNybV9ldmVudGAncyBzYXZlZCBgdXBjb21pbmdfZXZlbnRzYCB2aWV3LCByZWFkIG9mZlxuICAgICAgICAgIC8vIHRoZSB2aWV3IGV4YWN0bHkgbGlrZSB0aGUgdGFicyBhYm92ZSwgYW5kIHRoZSBuYW1lIG5vdyBtYXRjaGVzIHdoYXRcbiAgICAgICAgICAvLyB0aGUgcGFuZWwgc2hvd3MuIFwiVG9kYXkncyBTY2hlZHVsZVwiIGlzIE5PVCB3aGF0IGFueSBleGlzdGluZyB2aWV3XG4gICAgICAgICAgLy8gc2F5czogYG15X2V2ZW50c2AgaXMgc2NvcGVkIHRvIHRoZSBjdXJyZW50IHVzZXIgYnV0IGNhcnJpZXMgbm8gZGF0ZVxuICAgICAgICAgIC8vIGZpbHRlciwgbm8gc29ydCBhbmQgbm8gZGF0ZSBjb2x1bW4gKDI3IHNlZWRlZCByb3dzLCBtb3N0bHkgYGhlbGRgXG4gICAgICAgICAgLy8gaW50ZXJhY3Rpb25zIGZyb20gdGhlIHBhc3QpLCB3aGlsZSBgdXBjb21pbmdfZXZlbnRzYCBpc1xuICAgICAgICAgIC8vIGBzdGF0dXM6ICdwbGFubmVkJ2Agc29ydGVkIGJ5IGBzdGFydF9kYXRldGltZWAgYXNjZW5kaW5nIHdpdGggdGhlXG4gICAgICAgICAgLy8gZGF0ZSBvbiB0aGUgcm93LiBOYXJyb3dpbmcgZWl0aGVyIG9uZSB0byB0b2RheSB3b3VsZCBtZWFuIHJldHlwaW5nXG4gICAgICAgICAgLy8gYSBmaWx0ZXIgaW4gdGhpcyBwYWdlIFx1MjAxNCB0aGUgc2Vjb25kIGRlZmluaXRpb24gdGhlIGhlbHBlciBhYm92ZVxuICAgICAgICAgIC8vIGV4aXN0cyB0byBwcmV2ZW50IFx1MjAxNCBzbyB0aGUgdGl0bGUgc2F5cyBcInVwY29taW5nXCIgaW5zdGVhZCBvZlxuICAgICAgICAgIC8vIHByb21pc2luZyBhIGRheSB0aGlzIHBhZ2UgY2Fubm90IGNvbXB1dGUuXG4gICAgICAgICAgbGFiZWw6ICdVcGNvbWluZyBFdmVudHMnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRpdGxlOiAnVXBjb21pbmcgRXZlbnRzJyxcbiAgICAgICAgICAgIGJvcmRlcmVkOiB0cnVlLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtlbWJlZGRlZExpc3RWaWV3KCdob21lX3VwY29taW5nX2V2ZW50cycsICdjcm1fZXZlbnQnLCBFdmVudFZpZXdzLCAndXBjb21pbmdfZXZlbnRzJyldLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIF0sXG4gIFxuICBpc0RlZmF1bHQ6IHRydWUsXG4gIFxuICBhcmlhOiB7XG4gICAgYXJpYUxhYmVsOiAnU2FsZXMgSG9tZSBQYWdlJyxcbiAgICBhcmlhRGVzY3JpYmVkQnk6ICdTYWxlcyB0ZWFtIGhvbWUgcGFnZSB3aXRoIG1ldHJpY3MsIGxlYWRzLCBhbmQgcXVpY2sgYWN0aW9ucycsXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXMvYXBwX2xhdW5jaGVyLnBhZ2UudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXMvYXBwX2xhdW5jaGVyLnBhZ2UudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IFBhZ2UgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogQXBwIExhdW5jaGVyIFBhZ2VcbiAqIFxuICogRGVtb25zdHJhdGVzIGFuIGFwcGxpY2F0aW9uIGxhdW5jaGVyIHBhZ2Ugc2ltaWxhciB0byBTYWxlc2ZvcmNlIEFwcCBMYXVuY2hlci5cbiAqIFxuICogRmVhdHVyZXM6XG4gKiAtIEdyaWQtYmFzZWQgYXBwIGljb24gbGF5b3V0XG4gKiAtIEdsb2JhbCBzZWFyY2hcbiAqIC0gUXVpY2sgYWNjZXNzIHRvIGFsbCBhcHBzXG4gKi9cbmV4cG9ydCBjb25zdCBBcHBMYXVuY2hlclBhZ2U6IFBhZ2UgPSB7XG4gIG5hbWU6ICdhcHBfbGF1bmNoZXJfcGFnZScsXG4gIGxhYmVsOiAnQXBwIExhdW5jaGVyJyxcbiAgZGVzY3JpcHRpb246ICdDZW50cmFsIGh1YiBmb3IgYWNjZXNzaW5nIGFsbCBhcHBsaWNhdGlvbnMnLFxuICBcbiAgdHlwZTogJ2FwcCcsXG4gIFxuICB0ZW1wbGF0ZTogJ2NlbnRlcmVkJyxcbiAga2luZDogJ2Z1bGwnLCAgXG4gIHJlZ2lvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnaGVhZGVyJyxcbiAgICAgIHdpZHRoOiAnZnVsbCcsXG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2xvYmFsOnNlYXJjaCcsXG4gICAgICAgICAgaWQ6ICdhcHBfc2VhcmNoJyxcbiAgICAgICAgICBsYWJlbDogJ1NlYXJjaCBBcHBzJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBcbiAgICB7XG4gICAgICBuYW1lOiAnbWFpbicsXG4gICAgICB3aWR0aDogJ2xhcmdlJyxcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwYWdlOmhlYWRlcicsXG4gICAgICAgICAgaWQ6ICdsYXVuY2hlcl9oZWFkZXInLFxuICAgICAgICAgIGxhYmVsOiAnQXBwIExhdW5jaGVyIEhlYWRlcicsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgdGl0bGU6ICdBcHAgTGF1bmNoZXInLFxuICAgICAgICAgICAgc3VidGl0bGU6ICdTZWxlY3QgYW4gYXBwIHRvIGdldCBzdGFydGVkJyxcbiAgICAgICAgICAgIC8vIGBpY29uYCByZW1vdmVkIGZyb20gYHBhZ2U6aGVhZGVyYCBpbiBAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjBcbiAgICAgICAgICAgIC8vICgjNjk0NiwgQURSLTAwODcgRDIpIFx1MjAxNCBkZWxldGVkLCBub3QgcmVuYW1lZC4gU2VlIHRoZSBmdWxsIG5vdGUgb25cbiAgICAgICAgICAgIC8vIGBhY2NvdW50X2RldGFpbC5wYWdlLnRzYDsgbm90aGluZyBldmVyIGRyZXcgaXQuXG4gICAgICAgICAgICAvLyBgYnJlYWRjcnVtYmAgcmV0aXJlZCBmcm9tIGBwYWdlOmhlYWRlcmAgaW4gQG9iamVjdHN0YWNrL3NwZWMgMTcuNi4wXG4gICAgICAgICAgICAvLyAoIzIwNzg1LCBgcGFnZS1oZWFkZXItYnJlYWRjcnVtYi1yZW1vdmVkYCkgXHUyMDE0IGRlbGV0ZWQ6IG5vIHJlbmRlcmVyXG4gICAgICAgICAgICAvLyBldmVyIGRyZXcgYSB0cmFpbCBmb3IgaXQ7IHRoZSBhcHAgc2hlbGwncyBvd24gdHJhaWwgaXMgdW5jaGFuZ2VkLlxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYXBwOmxhdW5jaGVyJyxcbiAgICAgICAgICBpZDogJ2FwcF9ncmlkJyxcbiAgICAgICAgICBsYWJlbDogJ0FwcGxpY2F0aW9uIEdyaWQnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICBdLFxuICBcbiAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgXG4gIGFyaWE6IHtcbiAgICBhcmlhTGFiZWw6ICdBcHAgTGF1bmNoZXIgUGFnZScsXG4gICAgYXJpYURlc2NyaWJlZEJ5OiAnQ2VudHJhbCBhcHBsaWNhdGlvbiBsYXVuY2hlciBmb3IgYWNjZXNzaW5nIGFsbCBhcHBzJyxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wYWdlcy91dGlsaXR5X2Jhci5wYWdlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL3V0aWxpdHlfYmFyLnBhZ2UudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IFBhZ2UgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogVXRpbGl0eSBCYXIgUGFnZVxuICogXG4gKiBEZW1vbnN0cmF0ZXMgYSB1dGlsaXR5IGJhciBwYWdlIGZvciBmbG9hdGluZyBwYW5lbHMgYW5kIHF1aWNrIGFjY2VzcyB0b29scy5cbiAqIFNpbWlsYXIgdG8gU2FsZXNmb3JjZSBMaWdodG5pbmcgVXRpbGl0eSBCYXIuXG4gKiBcbiAqIEZlYXR1cmVzOlxuICogLSBGbG9hdGluZyB1dGlsaXR5IHBhbmVsc1xuICogLSBRdWljayBub3Rlc1xuICogLSBDaGF0L21lc3NhZ2luZ1xuICogLSBOb3RpZmljYXRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBVdGlsaXR5QmFyUGFnZTogUGFnZSA9IHtcbiAgbmFtZTogJ3V0aWxpdHlfYmFyX3BhZ2UnLFxuICBsYWJlbDogJ1V0aWxpdHkgQmFyJyxcbiAgZGVzY3JpcHRpb246ICdRdWljayBhY2Nlc3MgdXRpbGl0eSBiYXIgd2l0aCBmbG9hdGluZyB0b29scycsXG4gIFxuICB0eXBlOiAndXRpbGl0eScsXG4gIFxuICB0ZW1wbGF0ZTogJ3V0aWxpdHktYmFyJyxcbiAga2luZDogJ2Z1bGwnLFxuICByZWdpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ3V0aWxpdGllcycsXG4gICAgICB3aWR0aDogJ2Z1bGwnLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dsb2JhbDpub3RpZmljYXRpb25zJyxcbiAgICAgICAgICBpZDogJ25vdGlmaWNhdGlvbnNfcGFuZWwnLFxuICAgICAgICAgIGxhYmVsOiAnTm90aWZpY2F0aW9ucycsXG4gICAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncGFnZTpjYXJkJyxcbiAgICAgICAgICBpZDogJ3F1aWNrX25vdGVzJyxcbiAgICAgICAgICBsYWJlbDogJ1F1aWNrIE5vdGVzJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB0aXRsZTogJ1F1aWNrIE5vdGVzJyxcbiAgICAgICAgICAgIGJvcmRlcmVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2xvYmFsOnNlYXJjaCcsXG4gICAgICAgICAgaWQ6ICdxdWlja19zZWFyY2gnLFxuICAgICAgICAgIGxhYmVsOiAnUXVpY2sgU2VhcmNoJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXSxcbiAgXG4gIGlzRGVmYXVsdDogZmFsc2UsXG4gIFxuICBhcmlhOiB7XG4gICAgYXJpYUxhYmVsOiAnVXRpbGl0eSBCYXInLFxuICAgIGFyaWFEZXNjcmliZWRCeTogJ1F1aWNrIGFjY2VzcyB1dGlsaXR5IGJhciB3aXRoIGZsb2F0aW5nIHRvb2xzIGFuZCBub3RpZmljYXRpb25zJyxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBTYWxlcyBlbWFpbC10ZW1wbGF0ZSBiYXJyZWwuXG4gKlxuICogQW4gZW1haWwgdGVtcGxhdGUgbGl2ZXMgd2l0aCB0aGUgb2JqZWN0IGl0cyBgbm90aWZ5YCBub2RlIGlzIGF1dGhvcmVkXG4gKiBhZ2FpbnN0IChBR0VOVFMubWQgbGF5b3V0IHJ1bGUgMyksIHNvIHRoZSBwYWNrYWdlcyB0aGF0IG93biBub3RpZnlpbmcgZmxvd3NcbiAqIGVhY2ggY2FycnkgdGhlaXIgb3duIGRpcmVjdG9yeS4gYF9idW5kbGUudHNgIGlzIHRoZSBzaGFyZWQgc291cmNlIHRoZSBvdGhlclxuICogdHdvIHJlYWQgYWxvbmcgdGhlaXIgZWRnZSBpbnRvIHNhbGVzLlxuICovXG5leHBvcnQgeyBTYWxlc0VtYWlsVGVtcGxhdGVzIH0gZnJvbSAnLi9jcm0uZW1haWwtdGVtcGxhdGUnO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzL2VuLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvZW4udHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZVBhY2sgfSBmcm9tICcuL19idW5kbGUnO1xuXG4vKipcbiAqIEVuZ2xpc2ggKGVuLVVTKSBcdTIwMTQgdGhlIHNhbGVzIHBhY2thZ2UncyBub3RpZmljYXRpb24gdGVtcGxhdGVzLlxuICpcbiAqIFBlci1sb2NhbGUgZmlsZSwgb25lIGxhbmd1YWdlIGVhY2gsIGFzc2VtYmxlZCBpbiBgY3JtLmVtYWlsLXRlbXBsYXRlLnRzYCBcdTIwMTRcbiAqIHRoZSBzYW1lIGNvbnZlbnRpb24gYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvYCBhbHJlYWR5IGZvbGxvd3MgZm9yIHRoZSBVSVxuICogbG9jYWxlIHBhY2tzLlxuICpcbiAqIEV2ZXJ5IHN0cmluZyBoZXJlIGlzIHRoZSB0ZXh0IGl0cyBgbm90aWZ5YCBub2RlIGFscmVhZHkgc2VudCwgd2l0aCB0aGVcbiAqIGZsb3cncyBge3Zhci5wYXRofWAgaW50ZXJwb2xhdGlvbnMgcmUtZXhwcmVzc2VkIGFzIHRoZSBge3trZXl9fWAgaG9sZXMgdGhlXG4gKiByZW5kZXJlciBmaWxscyBmcm9tIHRoYXQgbm9kZSdzIGB0ZW1wbGF0ZURhdGFgLiBBIGNvbnZlcnNpb24sIG5vdCBhIHJld3JpdGU6XG4gKiBubyBub3RpZmljYXRpb24gc2F5cyBhbnl0aGluZyBuZXcuXG4gKlxuICogXHUyNkEwXHVGRTBGIFJlZ2lzdGVyZWQgdW5kZXIgYGVuLVVTYCwgbm90IGBlbmAgXHUyMDE0IHNlZSB0aGUgbGFkZGVyIG5vdGUgb24gYGJ1bmRsZSgpYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVuOiBFbWFpbFRlbXBsYXRlUGFjayA9IHtcbiAgJ2NybS5hY2NvdW50X2FwcHJvdmVkJzoge1xuICAgIGxhYmVsOiAnQWNjb3VudCBBcHByb3ZlZCcsXG4gICAgc3ViamVjdDogJ0FjY291bnQgYXBwcm92ZWQ6IHt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlRoaXMgYWNjb3VudCBoYXMgYmVlbiBzaWduZWQgb2ZmIGFuZCBpcyBub3cgZXN0YWJsaXNoZWQgZGF0YS48L3A+JyxcbiAgfSxcbiAgJ2NybS5hY2NvdW50X3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnQWNjb3VudCBOb3QgQXBwcm92ZWQnLFxuICAgIHN1YmplY3Q6ICdBY2NvdW50IG5vdCBhcHByb3ZlZDoge3tuYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+VGhpcyBhY2NvdW50IHdhcyBub3Qgc2lnbmVkIG9mZi4gQ29ycmVjdCBpdHMgZGV0YWlscyBhbmQgYXNrIGZvciBhbm90aGVyIHJldmlldy48L3A+JyxcbiAgfSxcbiAgJ2NybS5jb250YWN0X3dlbGNvbWUnOiB7XG4gICAgbGFiZWw6ICdOZXcgQ29udGFjdCcsXG4gICAgc3ViamVjdDogJ05ldyBjb250YWN0OiB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPnt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0gd2FzIGFkZGVkIGFzIGEgY29udGFjdC4gUmVhY2ggb3V0IHRvIHdlbGNvbWUgdGhlbS48L3A+JyxcbiAgfSxcbiAgJ2NybS5kZWFsX3N0YWxsZWQnOiB7XG4gICAgbGFiZWw6ICdTdGFsbGVkIERlYWwnLFxuICAgIHN1YmplY3Q6ICdTdGFsbGVkIGRlYWw6IHt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPk9wcG9ydHVuaXR5IHt7bmFtZX19IGhhcyBzYXQgaW4ge3tzdGFnZX19IGZvciB7e2RheXNfaW5fc3RhZ2V9fSBkYXlzLiBUaW1lIHRvIGFkdmFuY2Ugb3IgcmUtcXVhbGlmeSBpdC48L3A+JyxcbiAgfSxcbiAgJ2NybS5sYXJnZV9kZWFsX3dvbic6IHtcbiAgICBsYWJlbDogJ0xhcmdlIERlYWwgV29uJyxcbiAgICBzdWJqZWN0OiAnTGFyZ2UgZGVhbCB3b246IHt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPnt7bmFtZX19IGNsb3NlZCBhdCB7e2Ftb3VudH19LiBDb25ncmF0dWxhdGlvbnMgdG8gdGhlIHRlYW0uPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9jb252ZXJzaW9uX2FwcHJvdmVkJzoge1xuICAgIGxhYmVsOiAnTGVhZCBBcHByb3ZlZCBmb3IgQ29udmVyc2lvbicsXG4gICAgc3ViamVjdDogJ0xlYWQgYXBwcm92ZWQgZm9yIGNvbnZlcnNpb246IHt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+VGhpcyBsZWFkIGhhcyBiZWVuIHNpZ25lZCBvZmYuIFlvdSBjYW4gY29udmVydCBpdCBpbnRvIGFuIGFjY291bnQsIGNvbnRhY3QgYW5kIG9wcG9ydHVuaXR5LjwvcD4nLFxuICB9LFxuICAnY3JtLmxlYWRfY29udmVyc2lvbl9yZWplY3RlZCc6IHtcbiAgICBsYWJlbDogJ0xlYWQgTm90IEFwcHJvdmVkJyxcbiAgICBzdWJqZWN0OiAnTGVhZCBub3QgYXBwcm92ZWQ6IHt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+Q29udmVyc2lvbiBvZiB0aGlzIGxlYWQgd2FzIG5vdCBhcHByb3ZlZC4gS2VlcCB3b3JraW5nIGl0LCBvciBkaXNxdWFsaWZ5IGl0IHdpdGggYSByZWFzb24uPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9jb252ZXJ0ZWQnOiB7XG4gICAgbGFiZWw6ICdMZWFkIENvbnZlcnRlZCcsXG4gICAgc3ViamVjdDogJ0xlYWQgY29udmVydGVkOiB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPkxlYWQge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fSB3YXMgY29udmVydGVkIGludG8gYW4gYWNjb3VudCBhbmQgY29udGFjdC48L3A+JyxcbiAgfSxcbiAgJ2NybS5sZWFkX3JvdXRpbmdfaG90Jzoge1xuICAgIGxhYmVsOiAnSG90IExlYWQgUm91dGluZycsXG4gICAgc3ViamVjdDogJ0hvdCBsZWFkIFx1MjAxNCBhc3NpZ24gd2l0aGluIDI0aDoge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD57e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19IGZyb20ge3tjb21wYW55fX0gKHJhdGluZyB7e3JhdGluZ319KSBuZWVkcyBhbiBvd25lciB0b2RheS48L3A+JyxcbiAgfSxcbiAgJ2NybS5sZWFkX3JvdXRpbmdfbmV3Jzoge1xuICAgIGxhYmVsOiAnTmV3IExlYWQgUm91dGluZycsXG4gICAgc3ViamVjdDogJ05ldyBsZWFkIHRvIGFzc2lnbjoge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD57e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19IGZyb20ge3tjb21wYW55fX0gaXMgYXdhaXRpbmcgYXNzaWdubWVudC48L3A+JyxcbiAgfSxcbiAgJ2NybS5vcHBvcnR1bml0eV9hcHByb3ZlZCc6IHtcbiAgICBsYWJlbDogJ0RlYWwgQXBwcm92ZWQnLFxuICAgIHN1YmplY3Q6ICdEZWFsIGFwcHJvdmVkOiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5Zb3VyIG9wcG9ydHVuaXR5IHt7bmFtZX19IGhhcyBiZWVuIGFwcHJvdmVkLjwvcD4nLFxuICB9LFxuICAnY3JtLm9wcG9ydHVuaXR5X3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnRGVhbCBSZWplY3RlZCcsXG4gICAgc3ViamVjdDogJ0RlYWwgcmVqZWN0ZWQ6IHt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPllvdXIgb3Bwb3J0dW5pdHkge3tuYW1lfX0gd2FzIG5vdCBhcHByb3ZlZC4gUmV2aWV3IGFuZCByZXZpc2UgYmVmb3JlIHJlc3VibWl0dGluZy48L3A+JyxcbiAgfSxcbiAgJ2NybS50YXNrX3JlbWluZGVyJzoge1xuICAgIGxhYmVsOiAnVGFzayBSZW1pbmRlcicsXG4gICAgc3ViamVjdDogJ1Rhc2sgcmVtaW5kZXI6IHt7c3ViamVjdH19JyxcbiAgICBib2R5SHRtbDogJzxwPllvdXIgdGFzayBcInt7c3ViamVjdH19XCIgaXMgZHVlIChyZW1pbmRlciBzZXQgZm9yIHt7cmVtaW5kZXJfZGF0ZX19KS48L3A+JyxcbiAgfSxcbiAgJ2NybS51cmdlbnRfdGFzayc6IHtcbiAgICBsYWJlbDogJ1VyZ2VudCBUYXNrJyxcbiAgICBzdWJqZWN0OiAnVXJnZW50IHRhc2s6IHt7c3ViamVjdH19JyxcbiAgICBib2R5SHRtbDogJzxwPkFuIHVyZ2VudCB0YXNrIFwie3tzdWJqZWN0fX1cIiB3YXMgYXNzaWduZWQgdG8geW91IGFuZCBuZWVkcyBhdHRlbnRpb24uPC9wPicsXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzL3poLUNOLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvemgtQ04udHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZVBhY2sgfSBmcm9tICcuL19idW5kbGUnO1xuXG4vKiogXHU3QjgwXHU0RjUzXHU0RTJEXHU2NTg3ICh6aC1DTikgXHUyMDE0IHRoZSBzYWxlcyBwYWNrYWdlJ3Mgbm90aWZpY2F0aW9uIHRlbXBsYXRlcy4gU2VlIGBlbi50c2AuICovXG5leHBvcnQgY29uc3QgemhDTjogRW1haWxUZW1wbGF0ZVBhY2sgPSB7XG4gICdjcm0uYWNjb3VudF9hcHByb3ZlZCc6IHtcbiAgICBsYWJlbDogJ1x1NUJBMlx1NjIzN1x1NUJBMVx1NjI3OVx1OTAxQVx1OEZDNycsXG4gICAgc3ViamVjdDogJ1x1NUJBMlx1NjIzN1x1NURGMlx1NUJBMVx1NjI3OVx1OTAxQVx1OEZDN1x1RkYxQXt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1OEJFNVx1NUJBMlx1NjIzN1x1NURGMlx1NUJBMVx1NjI3OVx1OTAxQVx1OEZDN1x1RkYwQ1x1NzNCMFx1NEUzQVx1NkI2M1x1NUYwRlx1NjU3MFx1NjM2RVx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLmFjY291bnRfcmVqZWN0ZWQnOiB7XG4gICAgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTVCQTFcdTYyNzlcdTY3MkFcdTkwMUFcdThGQzcnLFxuICAgIHN1YmplY3Q6ICdcdTVCQTJcdTYyMzdcdTY3MkFcdTkwMUFcdThGQzdcdTVCQTFcdTYyNzlcdUZGMUF7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5cdThCRTVcdTVCQTJcdTYyMzdcdTY3MkFcdTkwMUFcdThGQzdcdTVCQTFcdTYyNzlcdTMwMDJcdThCRjdcdTRGRUVcdTZCNjNcdTUxNzZcdTRGRTFcdTYwNkZcdTU0MEVcdTUxOERcdTZCMjFcdTYzRDBcdTRFQTRcdTVCQTFcdTY4MzhcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5jb250YWN0X3dlbGNvbWUnOiB7XG4gICAgbGFiZWw6ICdcdTY1QjBcdTgwNTRcdTdDRkJcdTRFQkEnLFxuICAgIHN1YmplY3Q6ICdcdTY1QjBcdTgwNTRcdTdDRkJcdTRFQkFcdUZGMUF7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPnt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0gXHU1REYyXHU2REZCXHU1MkEwXHU0RTNBXHU4MDU0XHU3Q0ZCXHU0RUJBXHUzMDAyXHU4QkY3XHU0RTNCXHU1MkE4XHU4MDU0XHU3Q0ZCXHU1RTc2XHU4ODY4XHU3OTNBXHU2QjIyXHU4RkNFXHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0uZGVhbF9zdGFsbGVkJzoge1xuICAgIGxhYmVsOiAnXHU1NTQ2XHU2NzNBXHU1MDVDXHU2RURFJyxcbiAgICBzdWJqZWN0OiAnXHU1MDVDXHU2RURFXHU1NTQ2XHU2NzNBXHVGRjFBe3tuYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHU1NTQ2XHU2NzNBIHt7bmFtZX19IFx1NURGMlx1NTcyOFx1MjAxQ3t7c3RhZ2V9fVx1MjAxRFx1OTYzNlx1NkJCNVx1NTA1Q1x1NzU1OSB7e2RheXNfaW5fc3RhZ2V9fSBcdTU5MjlcdTMwMDJcdThCRjdcdTYzQThcdThGREJcdTYyMTZcdTkxQ0RcdTY1QjBcdThCQzRcdTRGMzBcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5sYXJnZV9kZWFsX3dvbic6IHtcbiAgICBsYWJlbDogJ1x1NTkyN1x1OTg5RFx1NTU0Nlx1NjczQVx1OEQ2Mlx1NTM1NScsXG4gICAgc3ViamVjdDogJ1x1NTkyN1x1OTg5RFx1NTU0Nlx1NjczQVx1OEQ2Mlx1NTM1NVx1RkYxQXt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPnt7bmFtZX19IFx1NEVFNSB7e2Ftb3VudH19IFx1NjIxMFx1NEVBNFx1MzAwMlx1NjA2RFx1NTU5Q1x1NTZFMlx1OTYxRlx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLmxlYWRfY29udmVyc2lvbl9hcHByb3ZlZCc6IHtcbiAgICBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1OEY2Q1x1NjM2Mlx1NURGMlx1NjI3OVx1NTFDNicsXG4gICAgc3ViamVjdDogJ1x1N0VCRlx1N0QyMlx1OEY2Q1x1NjM2Mlx1NURGMlx1NjI3OVx1NTFDNlx1RkYxQXt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHU4QkU1XHU3RUJGXHU3RDIyXHU1REYyXHU1QkExXHU2Mjc5XHU5MDFBXHU4RkM3XHUzMDAyXHU2MEE4XHU1M0VGXHU0RUU1XHU1QzA2XHU1MTc2XHU4RjZDXHU2MzYyXHU0RTNBXHU1QkEyXHU2MjM3XHUzMDAxXHU4MDU0XHU3Q0ZCXHU0RUJBXHU1NDhDXHU1NTQ2XHU2NzNBXHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9jb252ZXJzaW9uX3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnXHU3RUJGXHU3RDIyXHU4RjZDXHU2MzYyXHU2NzJBXHU2Mjc5XHU1MUM2JyxcbiAgICBzdWJqZWN0OiAnXHU3RUJGXHU3RDIyXHU2NzJBXHU5MDFBXHU4RkM3XHU1QkExXHU2Mjc5XHVGRjFBe3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5cdThCRTVcdTdFQkZcdTdEMjJcdTc2ODRcdThGNkNcdTYzNjJcdTY3MkFcdTgzQjdcdTYyNzlcdTUxQzZcdTMwMDJcdThCRjdcdTdFRTdcdTdFRURcdThEREZcdThGREJcdUZGMENcdTYyMTZcdTZDRThcdTY2MEVcdTUzOUZcdTU2RTBcdTVDMDZcdTUxNzZcdTUzRDZcdTZEODhcdThENDRcdTY4M0NcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5sZWFkX2NvbnZlcnRlZCc6IHtcbiAgICBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1NURGMlx1OEY2Q1x1NjM2MicsXG4gICAgc3ViamVjdDogJ1x1N0VCRlx1N0QyMlx1NURGMlx1OEY2Q1x1NjM2Mlx1RkYxQXt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHU3RUJGXHU3RDIyIHt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0gXHU1REYyXHU4RjZDXHU2MzYyXHU0RTNBXHU1QkEyXHU2MjM3XHU1NDhDXHU4MDU0XHU3Q0ZCXHU0RUJBXHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9yb3V0aW5nX2hvdCc6IHtcbiAgICBsYWJlbDogJ1x1NzBFRFx1OTVFOFx1N0VCRlx1N0QyMlx1NTIwNlx1OTE0RCcsXG4gICAgc3ViamVjdDogJ1x1NzBFRFx1OTVFOFx1N0VCRlx1N0QyMiBcdTIwMTQgMjQgXHU1QzBGXHU2NUY2XHU1MTg1XHU1MjA2XHU5MTREXHVGRjFBe3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5cdTY3NjVcdTgxRUEge3tjb21wYW55fX0gXHU3Njg0IHt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX1cdUZGMDhcdThCQzRcdTUyMDYge3tyYXRpbmd9fVx1RkYwOVx1OTcwMFx1ODk4MVx1NEVDQVx1NTkyOVx1NUMzMVx1NjMwN1x1NUI5QVx1OEQxRlx1OEQyM1x1NEVCQVx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLmxlYWRfcm91dGluZ19uZXcnOiB7XG4gICAgbGFiZWw6ICdcdTY1QjBcdTdFQkZcdTdEMjJcdTUyMDZcdTkxNEQnLFxuICAgIHN1YmplY3Q6ICdcdTVGODVcdTUyMDZcdTkxNERcdTY1QjBcdTdFQkZcdTdEMjJcdUZGMUF7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1Njc2NVx1ODFFQSB7e2NvbXBhbnl9fSBcdTc2ODQge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fSBcdTZCNjNcdTU3MjhcdTdCNDlcdTVGODVcdTUyMDZcdTkxNERcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5vcHBvcnR1bml0eV9hcHByb3ZlZCc6IHtcbiAgICBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1NUJBMVx1NjI3OVx1OTAxQVx1OEZDNycsXG4gICAgc3ViamVjdDogJ1x1NTU0Nlx1NjczQVx1NURGMlx1NjI3OVx1NTFDNlx1RkYxQXt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NjBBOFx1NzY4NFx1NTU0Nlx1NjczQSB7e25hbWV9fSBcdTVERjJcdTgzQjdcdTYyNzlcdTUxQzZcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5vcHBvcnR1bml0eV9yZWplY3RlZCc6IHtcbiAgICBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1NUJBMVx1NjI3OVx1NjcyQVx1OTAxQVx1OEZDNycsXG4gICAgc3ViamVjdDogJ1x1NTU0Nlx1NjczQVx1NjcyQVx1NjI3OVx1NTFDNlx1RkYxQXt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NjBBOFx1NzY4NFx1NTU0Nlx1NjczQSB7e25hbWV9fSBcdTY3MkFcdTgzQjdcdTYyNzlcdTUxQzZcdTMwMDJcdThCRjdcdTY4QzBcdTY3RTVcdTVFNzZcdTRGRUVcdTY1MzlcdTU0MEVcdTkxQ0RcdTY1QjBcdTYzRDBcdTRFQTRcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS50YXNrX3JlbWluZGVyJzoge1xuICAgIGxhYmVsOiAnXHU0RUZCXHU1MkExXHU2M0QwXHU5MTkyJyxcbiAgICBzdWJqZWN0OiAnXHU0RUZCXHU1MkExXHU2M0QwXHU5MTkyXHVGRjFBe3tzdWJqZWN0fX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHU2MEE4XHU3Njg0XHU0RUZCXHU1MkExXHUyMDFDe3tzdWJqZWN0fX1cdTIwMURcdTVERjJcdTUyMzBcdTY3MUZcdUZGMDhcdTYzRDBcdTkxOTJcdTY1RjZcdTk1RjQge3tyZW1pbmRlcl9kYXRlfX1cdUZGMDlcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS51cmdlbnRfdGFzayc6IHtcbiAgICBsYWJlbDogJ1x1N0QyN1x1NjAyNVx1NEVGQlx1NTJBMScsXG4gICAgc3ViamVjdDogJ1x1N0QyN1x1NjAyNVx1NEVGQlx1NTJBMVx1RkYxQXt7c3ViamVjdH19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NEUwMFx1OTg3OVx1N0QyN1x1NjAyNVx1NEVGQlx1NTJBMVx1MjAxQ3t7c3ViamVjdH19XHUyMDFEXHU1REYyXHU1MjA2XHU5MTREXHU3RUQ5XHU2MEE4XHVGRjBDXHU5NzAwXHU4OTgxXHU1QzNEXHU1RkVCXHU1OTA0XHU3NDA2XHUzMDAyPC9wPicsXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzL2phLUpQLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvamEtSlAudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZVBhY2sgfSBmcm9tICcuL19idW5kbGUnO1xuXG4vKiogXHU2NUU1XHU2NzJDXHU4QTlFIChqYS1KUCkgXHUyMDE0IHRoZSBzYWxlcyBwYWNrYWdlJ3Mgbm90aWZpY2F0aW9uIHRlbXBsYXRlcy4gU2VlIGBlbi50c2AuICovXG5leHBvcnQgY29uc3QgamFKUDogRW1haWxUZW1wbGF0ZVBhY2sgPSB7XG4gICdjcm0uYWNjb3VudF9hcHByb3ZlZCc6IHtcbiAgICBsYWJlbDogJ1x1MzBBMlx1MzBBQlx1MzBBNlx1MzBGM1x1MzBDOFx1NjI3Rlx1OEE4RFx1NkUwOFx1MzA3RicsXG4gICAgc3ViamVjdDogJ1x1MzBBMlx1MzBBQlx1MzBBNlx1MzBGM1x1MzBDOFx1MzA0Q1x1NjI3Rlx1OEE4RFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1Rjoge3tuYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHUzMDUzXHUzMDZFXHUzMEEyXHUzMEFCXHUzMEE2XHUzMEYzXHUzMEM4XHUzMDZGXHU2MjdGXHU4QThEXHUzMDU1XHUzMDhDXHUzMDAxXHU2QjYzXHU1RjBGXHUzMDZBXHUzMEM3XHUzMEZDXHUzMEJGXHUzMDZCXHUzMDZBXHUzMDhBXHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0uYWNjb3VudF9yZWplY3RlZCc6IHtcbiAgICBsYWJlbDogJ1x1MzBBMlx1MzBBQlx1MzBBNlx1MzBGM1x1MzBDOFx1NjcyQVx1NjI3Rlx1OEE4RCcsXG4gICAgc3ViamVjdDogJ1x1MzBBMlx1MzBBQlx1MzBBNlx1MzBGM1x1MzBDOFx1MzA0Q1x1NjI3Rlx1OEE4RFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1Qlx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Rjoge3tuYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHUzMDUzXHUzMDZFXHUzMEEyXHUzMEFCXHUzMEE2XHUzMEYzXHUzMEM4XHUzMDZGXHU2MjdGXHU4QThEXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGXHUzMDAyXHU1MTg1XHU1QkI5XHUzMDkyXHU0RkVFXHU2QjYzXHUzMDZFXHUzMDQ2XHUzMDQ4XHUzMDAxXHU1MThEXHU1RUE2XHU2MjdGXHU4QThEXHUzMDkyXHU0RjlEXHU5ODNDXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0uY29udGFjdF93ZWxjb21lJzoge1xuICAgIGxhYmVsOiAnXHU2NUIwXHU4OThGXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1JyxcbiAgICBzdWJqZWN0OiAnXHU2NUIwXHUzMDU3XHUzMDQ0XHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1OiB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPnt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0gXHUzMDRDXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDY4XHUzMDU3XHUzMDY2XHU4RkZEXHU1MkEwXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyXHUzMDU0XHU2MzI4XHU2MkY2XHUzMDZFXHU5MDIzXHU3RDYxXHUzMDkyXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0uZGVhbF9zdGFsbGVkJzoge1xuICAgIGxhYmVsOiAnXHU1MDVDXHU2RURFXHU0RTJEXHUzMDZFXHU1NTQ2XHU4QUM3JyxcbiAgICBzdWJqZWN0OiAnXHU1MDVDXHU2RURFXHU0RTJEXHUzMDZFXHU1NTQ2XHU4QUM3OiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5cdTU1NDZcdThBQzcge3tuYW1lfX0gXHUzMDZGXHUzMDBDe3tzdGFnZX19XHUzMDBEXHUzMDZCIHt7ZGF5c19pbl9zdGFnZX19IFx1NjVFNVx1OTU5M1x1NzU1OVx1MzA3RVx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1OVx1MzAwMlx1NkIyMVx1MzA2RVx1NkJCNVx1OTY4RVx1MzA2Qlx1OTAzMlx1MzA4MVx1MzA4Qlx1MzA0Qlx1MzAwMVx1NTE4RFx1OEE1NVx1NEZBMVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLmxhcmdlX2RlYWxfd29uJzoge1xuICAgIGxhYmVsOiAnXHU1OTI3XHU1NzhCXHU1NTQ2XHU4QUM3XHUzMDZFXHU1M0Q3XHU2Q0U4JyxcbiAgICBzdWJqZWN0OiAnXHU1OTI3XHU1NzhCXHU1NTQ2XHU4QUM3XHUzMDkyXHU1M0Q3XHU2Q0U4OiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD57e25hbWV9fSBcdTMwNEMge3thbW91bnR9fSBcdTMwNjdcdTYyMTBcdTdEMDRcdTMwNTdcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDJcdTMwQzFcdTMwRkNcdTMwRTBcdTMwNkVcdTc2ODZcdTMwNTVcdTMwOTNcdTMwMDFcdTMwNEFcdTMwODFcdTMwNjdcdTMwNjhcdTMwNDZcdTMwNTRcdTMwNTZcdTMwNDRcdTMwN0VcdTMwNTlcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5sZWFkX2NvbnZlcnNpb25fYXBwcm92ZWQnOiB7XG4gICAgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTU5MDlcdTYzREJcdTMwNkVcdTYyN0ZcdThBOEQnLFxuICAgIHN1YmplY3Q6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkVcdTU5MDlcdTYzREJcdTMwNENcdTYyN0ZcdThBOERcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUY6IHt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHUzMDUzXHUzMDZFXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDZGXHU2MjdGXHU4QThEXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDAxXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDAxXHU1NTQ2XHU4QUM3XHUzMDZCXHU1OTA5XHU2M0RCXHUzMDY3XHUzMDREXHUzMDdFXHUzMDU5XHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9jb252ZXJzaW9uX3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU2NzJBXHU2MjdGXHU4QThEJyxcbiAgICBzdWJqZWN0OiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDRDXHU2MjdGXHU4QThEXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGOiB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1MzA1M1x1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2RVx1NTkwOVx1NjNEQlx1MzA2Rlx1NjI3Rlx1OEE4RFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1Qlx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Rlx1MzAwMlx1NUYxNVx1MzA0RFx1N0Q5QVx1MzA0RFx1NUJGRVx1NUZEQ1x1MzA1OVx1MzA4Qlx1MzA0Qlx1MzAwMVx1NzQwNlx1NzUzMVx1MzA5Mlx1NEVEOFx1MzA1MVx1MzA2Nlx1NUJGRVx1OEM2MVx1NTkxNlx1MzA2Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLmxlYWRfY29udmVydGVkJzoge1xuICAgIGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU1OTA5XHU2M0RCXHU2RTA4XHUzMDdGJyxcbiAgICBzdWJqZWN0OiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDkyXHU1OTA5XHU2M0RCXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGOiB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1MzBFQVx1MzBGQ1x1MzBDOSB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19IFx1MzA5Mlx1NTNENlx1NUYxNVx1NTE0OFx1MzA2OFx1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNVx1MzA2Qlx1NTkwOVx1NjNEQlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLmxlYWRfcm91dGluZ19ob3QnOiB7XG4gICAgbGFiZWw6ICdcdTMwREJcdTMwQzNcdTMwQzhcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkVcdTUyNzJcdTMwOEFcdTVGNTNcdTMwNjYnLFxuICAgIHN1YmplY3Q6ICdcdTMwREJcdTMwQzNcdTMwQzhcdTMwRUFcdTMwRkNcdTMwQzkgXHUyMDE0IDI0IFx1NjY0Mlx1OTU5M1x1NEVFNVx1NTE4NVx1MzA2Qlx1NTI3Mlx1MzA4QVx1NUY1M1x1MzA2Njoge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD57e2NvbXBhbnl9fSBcdTMwNkUge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fVx1RkYwOFx1OEE1NVx1NEZBMSB7e3JhdGluZ319XHVGRjA5XHUzMDZCXHU2NzJDXHU2NUU1XHU0RTJEXHUzMDZCXHU2MkM1XHU1RjUzXHU4MDA1XHUzMDkyXHU1MjcyXHUzMDhBXHU1RjUzXHUzMDY2XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9yb3V0aW5nX25ldyc6IHtcbiAgICBsYWJlbDogJ1x1NjVCMFx1ODk4Rlx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2RVx1NTI3Mlx1MzA4QVx1NUY1M1x1MzA2NicsXG4gICAgc3ViamVjdDogJ1x1NTI3Mlx1MzA4QVx1NUY1M1x1MzA2Nlx1NUY4NVx1MzA2MVx1MzA2RVx1NjVCMFx1ODk4Rlx1MzBFQVx1MzBGQ1x1MzBDOToge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD57e2NvbXBhbnl9fSBcdTMwNkUge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fSBcdTMwNENcdTUyNzJcdTMwOEFcdTVGNTNcdTMwNjZcdTMwOTJcdTVGODVcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNTlcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5vcHBvcnR1bml0eV9hcHByb3ZlZCc6IHtcbiAgICBsYWJlbDogJ1x1NTU0Nlx1OEFDN1x1NjI3Rlx1OEE4RFx1NkUwOFx1MzA3RicsXG4gICAgc3ViamVjdDogJ1x1NTU0Nlx1OEFDN1x1MzA0Q1x1NjI3Rlx1OEE4RFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1Rjoge3tuYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHU1NTQ2XHU4QUM3IHt7bmFtZX19IFx1MzA0Q1x1NjI3Rlx1OEE4RFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLm9wcG9ydHVuaXR5X3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHU2NzJBXHU2MjdGXHU4QThEJyxcbiAgICBzdWJqZWN0OiAnXHU1NTQ2XHU4QUM3XHUzMDRDXHU2MjdGXHU4QThEXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGOiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5cdTU1NDZcdThBQzcge3tuYW1lfX0gXHUzMDZGXHU2MjdGXHU4QThEXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGXHUzMDAyXHU1MTg1XHU1QkI5XHUzMDkyXHU3OEJBXHU4QThEXHUzMEZCXHU0RkVFXHU2QjYzXHUzMDZFXHUzMDQ2XHUzMDQ4XHUzMDAxXHU1MThEXHU3NTMzXHU4QUNCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0udGFza19yZW1pbmRlcic6IHtcbiAgICBsYWJlbDogJ1RvRG8gXHUzMEVBXHUzMERFXHUzMEE0XHUzMEYzXHUzMEMwXHUzMEZDJyxcbiAgICBzdWJqZWN0OiAnVG9EbyBcdTMwNkVcdTMwRUFcdTMwREVcdTMwQTRcdTMwRjNcdTMwQzBcdTMwRkM6IHt7c3ViamVjdH19JyxcbiAgICBib2R5SHRtbDogJzxwPlRvRG9cdTMwMEN7e3N1YmplY3R9fVx1MzAwRFx1MzA0Q1x1NjcxRlx1OTY1MFx1MzA5Mlx1OEZDRVx1MzA0OFx1MzA3RVx1MzA1N1x1MzA1Rlx1RkYwOFx1MzBFQVx1MzBERVx1MzBBNFx1MzBGM1x1MzBDMFx1MzBGQ1x1OEEyRFx1NUI5QToge3tyZW1pbmRlcl9kYXRlfX1cdUZGMDlcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS51cmdlbnRfdGFzayc6IHtcbiAgICBsYWJlbDogJ1x1N0RDQVx1NjAyNSBUb0RvJyxcbiAgICBzdWJqZWN0OiAnXHU3RENBXHU2MDI1XHUzMDZFIFRvRG86IHt7c3ViamVjdH19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1N0RDQVx1NjAyNVx1MzA2RSBUb0RvXHUzMDBDe3tzdWJqZWN0fX1cdTMwMERcdTMwNENcdTUyNzJcdTMwOEFcdTVGNTNcdTMwNjZcdTMwODlcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDJcdTVCRkVcdTVGRENcdTMwOTJcdTMwNEFcdTk4NThcdTMwNDRcdTMwNTdcdTMwN0VcdTMwNTlcdTMwMDI8L3A+JyxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvZXMtRVMudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9lcy1FUy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBFbWFpbFRlbXBsYXRlUGFjayB9IGZyb20gJy4vX2J1bmRsZSc7XG5cbi8qKiBFc3BhXHUwMEYxb2wgKGVzLUVTKSBcdTIwMTQgdGhlIHNhbGVzIHBhY2thZ2UncyBub3RpZmljYXRpb24gdGVtcGxhdGVzLiBTZWUgYGVuLnRzYC4gKi9cbmV4cG9ydCBjb25zdCBlc0VTOiBFbWFpbFRlbXBsYXRlUGFjayA9IHtcbiAgJ2NybS5hY2NvdW50X2FwcHJvdmVkJzoge1xuICAgIGxhYmVsOiAnQ3VlbnRhIGFwcm9iYWRhJyxcbiAgICBzdWJqZWN0OiAnQ3VlbnRhIGFwcm9iYWRhOiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5Fc3RhIGN1ZW50YSBoYSBzaWRvIGFwcm9iYWRhIHkgeWEgZXMgdW4gZGF0byBjb25zb2xpZGFkby48L3A+JyxcbiAgfSxcbiAgJ2NybS5hY2NvdW50X3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnQ3VlbnRhIG5vIGFwcm9iYWRhJyxcbiAgICBzdWJqZWN0OiAnQ3VlbnRhIG5vIGFwcm9iYWRhOiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5Fc3RhIGN1ZW50YSBubyBmdWUgYXByb2JhZGEuIENvcnJpZ2Ugc3VzIGRhdG9zIHkgc29saWNpdGEgb3RyYSByZXZpc2lcdTAwRjNuLjwvcD4nLFxuICB9LFxuICAnY3JtLmNvbnRhY3Rfd2VsY29tZSc6IHtcbiAgICBsYWJlbDogJ051ZXZvIGNvbnRhY3RvJyxcbiAgICBzdWJqZWN0OiAnTnVldm8gY29udGFjdG86IHt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+e3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fSBzZSBoYSBhXHUwMEYxYWRpZG8gY29tbyBjb250YWN0by4gUG9udGUgZW4gY29udGFjdG8gcGFyYSBkYXJsZSBsYSBiaWVudmVuaWRhLjwvcD4nLFxuICB9LFxuICAnY3JtLmRlYWxfc3RhbGxlZCc6IHtcbiAgICBsYWJlbDogJ09wb3J0dW5pZGFkIGVzdGFuY2FkYScsXG4gICAgc3ViamVjdDogJ09wb3J0dW5pZGFkIGVzdGFuY2FkYToge3tuYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+TGEgb3BvcnR1bmlkYWQge3tuYW1lfX0gbGxldmEge3tkYXlzX2luX3N0YWdlfX0gZFx1MDBFRGFzIGVuIHt7c3RhZ2V9fS4gRXMgaG9yYSBkZSBhdmFuemFybGEgbyB2b2x2ZXIgYSBjdWFsaWZpY2FybGEuPC9wPicsXG4gIH0sXG4gICdjcm0ubGFyZ2VfZGVhbF93b24nOiB7XG4gICAgbGFiZWw6ICdHcmFuIG9wZXJhY2lcdTAwRjNuIGdhbmFkYScsXG4gICAgc3ViamVjdDogJ0dyYW4gb3BlcmFjaVx1MDBGM24gZ2FuYWRhOiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD57e25hbWV9fSBzZSBjZXJyXHUwMEYzIHBvciB7e2Ftb3VudH19LiBFbmhvcmFidWVuYSBhbCBlcXVpcG8uPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9jb252ZXJzaW9uX2FwcHJvdmVkJzoge1xuICAgIGxhYmVsOiAnQ2xpZW50ZSBwb3RlbmNpYWwgYXByb2JhZG8gcGFyYSBjb252ZXJzaVx1MDBGM24nLFxuICAgIHN1YmplY3Q6ICdDbGllbnRlIHBvdGVuY2lhbCBhcHJvYmFkbyBwYXJhIGNvbnZlcnNpXHUwMEYzbjoge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5Fc3RlIGNsaWVudGUgcG90ZW5jaWFsIGhhIHNpZG8gYXByb2JhZG8uIFB1ZWRlcyBjb252ZXJ0aXJsbyBlbiBjdWVudGEsIGNvbnRhY3RvIHkgb3BvcnR1bmlkYWQuPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9jb252ZXJzaW9uX3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnQ2xpZW50ZSBwb3RlbmNpYWwgbm8gYXByb2JhZG8nLFxuICAgIHN1YmplY3Q6ICdDbGllbnRlIHBvdGVuY2lhbCBubyBhcHJvYmFkbzoge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5MYSBjb252ZXJzaVx1MDBGM24gZGUgZXN0ZSBjbGllbnRlIHBvdGVuY2lhbCBubyBmdWUgYXByb2JhZGEuIFNpZ3VlIHRyYWJhalx1MDBFMW5kb2xvIG8gZGVzY2FsaWZcdTAwRURjYWxvIGluZGljYW5kbyB1biBtb3Rpdm8uPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9jb252ZXJ0ZWQnOiB7XG4gICAgbGFiZWw6ICdDbGllbnRlIHBvdGVuY2lhbCBjb252ZXJ0aWRvJyxcbiAgICBzdWJqZWN0OiAnQ2xpZW50ZSBwb3RlbmNpYWwgY29udmVydGlkbzoge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5FbCBjbGllbnRlIHBvdGVuY2lhbCB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19IHNlIGNvbnZpcnRpXHUwMEYzIGVuIGN1ZW50YSB5IGNvbnRhY3RvLjwvcD4nLFxuICB9LFxuICAnY3JtLmxlYWRfcm91dGluZ19ob3QnOiB7XG4gICAgbGFiZWw6ICdBc2lnbmFjaVx1MDBGM24gZGUgY2xpZW50ZSBwb3RlbmNpYWwgY2FsaWVudGUnLFxuICAgIHN1YmplY3Q6ICdDbGllbnRlIHBvdGVuY2lhbCBjYWxpZW50ZSBcdTIwMTQgYXNpZ25hciBlbiAyNCBoOiB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPnt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0gZGUge3tjb21wYW55fX0gKHB1bnR1YWNpXHUwMEYzbiB7e3JhdGluZ319KSBuZWNlc2l0YSBwcm9waWV0YXJpbyBob3kuPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9yb3V0aW5nX25ldyc6IHtcbiAgICBsYWJlbDogJ0FzaWduYWNpXHUwMEYzbiBkZSBjbGllbnRlIHBvdGVuY2lhbCcsXG4gICAgc3ViamVjdDogJ051ZXZvIGNsaWVudGUgcG90ZW5jaWFsIHBvciBhc2lnbmFyOiB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPnt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0gZGUge3tjb21wYW55fX0gZXN0XHUwMEUxIHBlbmRpZW50ZSBkZSBhc2lnbmFjaVx1MDBGM24uPC9wPicsXG4gIH0sXG4gICdjcm0ub3Bwb3J0dW5pdHlfYXBwcm92ZWQnOiB7XG4gICAgbGFiZWw6ICdPcG9ydHVuaWRhZCBhcHJvYmFkYScsXG4gICAgc3ViamVjdDogJ09wb3J0dW5pZGFkIGFwcm9iYWRhOiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5UdSBvcG9ydHVuaWRhZCB7e25hbWV9fSBoYSBzaWRvIGFwcm9iYWRhLjwvcD4nLFxuICB9LFxuICAnY3JtLm9wcG9ydHVuaXR5X3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnT3BvcnR1bmlkYWQgcmVjaGF6YWRhJyxcbiAgICBzdWJqZWN0OiAnT3BvcnR1bmlkYWQgcmVjaGF6YWRhOiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5UdSBvcG9ydHVuaWRhZCB7e25hbWV9fSBubyBmdWUgYXByb2JhZGEuIFJldlx1MDBFRHNhbGEgeSBjb3JyXHUwMEVEZ2VsYSBhbnRlcyBkZSB2b2x2ZXIgYSBlbnZpYXJsYS48L3A+JyxcbiAgfSxcbiAgJ2NybS50YXNrX3JlbWluZGVyJzoge1xuICAgIGxhYmVsOiAnUmVjb3JkYXRvcmlvIGRlIHRhcmVhJyxcbiAgICBzdWJqZWN0OiAnUmVjb3JkYXRvcmlvIGRlIHRhcmVhOiB7e3N1YmplY3R9fScsXG4gICAgYm9keUh0bWw6ICc8cD5UdSB0YXJlYSBcInt7c3ViamVjdH19XCIgdmVuY2UgKHJlY29yZGF0b3JpbyBmaWphZG8gcGFyYSB7e3JlbWluZGVyX2RhdGV9fSkuPC9wPicsXG4gIH0sXG4gICdjcm0udXJnZW50X3Rhc2snOiB7XG4gICAgbGFiZWw6ICdUYXJlYSB1cmdlbnRlJyxcbiAgICBzdWJqZWN0OiAnVGFyZWEgdXJnZW50ZToge3tzdWJqZWN0fX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+U2UgdGUgaGEgYXNpZ25hZG8gdW5hIHRhcmVhIHVyZ2VudGUgXCJ7e3N1YmplY3R9fVwiIHF1ZSByZXF1aWVyZSBhdGVuY2lcdTAwRjNuLjwvcD4nLFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9jcm0uZW1haWwtdGVtcGxhdGUudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9jcm0uZW1haWwtdGVtcGxhdGUudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZURlZmluaXRpb24gfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuaW1wb3J0IHsgYnVuZGxlIH0gZnJvbSAnLi9fYnVuZGxlJztcbmltcG9ydCB7IGVuIH0gZnJvbSAnLi9lbic7XG5pbXBvcnQgeyB6aENOIH0gZnJvbSAnLi96aC1DTic7XG5pbXBvcnQgeyBqYUpQIH0gZnJvbSAnLi9qYS1KUCc7XG5pbXBvcnQgeyBlc0VTIH0gZnJvbSAnLi9lcy1FUyc7XG5cbi8qKlxuICogU2FsZXMgXHUyMDE0IGV2ZXJ5IGBzeXNfZW1haWxfdGVtcGxhdGVgIHJvdyB0aGlzIHBhY2thZ2UncyBgbm90aWZ5YCBub2RlcyBuYW1lLlxuICpcbiAqIEZvdXIgbG9jYWxlIHBhY2tzIGNyb3NzZWQgd2l0aCBmb3VydGVlbiB0ZW1wbGF0ZSBuYW1lczogdGhlIHJvd3MgYVxuICogcmVjaXBpZW50J3Mgb3duIGBzeXNfdXNlci5sb2NhbGVgIGlzIHJlc29sdmVkIGFnYWluc3QsIHBlciByZWNpcGllbnQsIGFmdGVyXG4gKiBmYW4tb3V0LiBBc3NlbWJsZWQgaGVyZSB0aGUgd2F5IGB0cmFuc2xhdGlvbnMvY3JtLnRyYW5zbGF0aW9uLnRzYCBhc3NlbWJsZXNcbiAqIHRoZSBVSSBsb2NhbGUgcGFja3MgXHUyMDE0IG9uZSBmaWxlIHBlciBsYW5ndWFnZSwgb25lIGZpbGUgdGhhdCBjb2xsZWN0cyB0aGVtLlxuICovXG5leHBvcnQgY29uc3QgU2FsZXNFbWFpbFRlbXBsYXRlczogRW1haWxUZW1wbGF0ZURlZmluaXRpb25bXSA9IGJ1bmRsZSh7XG4gICdlbi1VUyc6IGVuLFxuICAnemgtQ04nOiB6aENOLFxuICAnamEtSlAnOiBqYUpQLFxuICAnZXMtRVMnOiBlc0VTLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlcy9pbmRleC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlcy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqIFJldmVudWUgZW1haWwtdGVtcGxhdGUgYmFycmVsLiAqL1xuZXhwb3J0IHsgUmV2ZW51ZUVtYWlsVGVtcGxhdGVzIH0gZnJvbSAnLi9jcm0uZW1haWwtdGVtcGxhdGUnO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXMvZW4udHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXMvZW4udHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZVBhY2sgfSBmcm9tICcuLi8uLi9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvX2J1bmRsZSc7XG5cbi8qKlxuICogRW5nbGlzaCAoZW4tVVMpIFx1MjAxNCB0aGUgcmV2ZW51ZSBwYWNrYWdlJ3Mgbm90aWZpY2F0aW9uIHRlbXBsYXRlcy5cbiAqXG4gKiBFdmVyeSBzdHJpbmcgaXMgdGhlIHRleHQgaXRzIGBub3RpZnlgIG5vZGUgYWxyZWFkeSBzZW50LCB3aXRoIHRoZSBmbG93J3NcbiAqIGB7dmFyLnBhdGh9YCBpbnRlcnBvbGF0aW9ucyByZS1leHByZXNzZWQgYXMgdGhlIGB7e2tleX19YCBob2xlcyB0aGUgcmVuZGVyZXJcbiAqIGZpbGxzIGZyb20gdGhhdCBub2RlJ3MgYHRlbXBsYXRlRGF0YWAuIFx1MjZBMFx1RkUwRiBUYWdnZWQgYGVuLVVTYCwgbm90IGBlbmAgXHUyMDE0IHNlZSB0aGVcbiAqIHJlc29sdXRpb24tbGFkZGVyIG5vdGUgb24gYGJ1bmRsZSgpYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVuOiBFbWFpbFRlbXBsYXRlUGFjayA9IHtcbiAgJ2NybS5jb250cmFjdF9leHBpcmVkJzoge1xuICAgIGxhYmVsOiAnQ29udHJhY3QgRXhwaXJlZCcsXG4gICAgc3ViamVjdDogJ0NvbnRyYWN0IGV4cGlyZWQ6IHt7Y29udHJhY3RfbnVtYmVyfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+Q29udHJhY3Qge3tjb250cmFjdF9udW1iZXJ9fSByZWFjaGVkIGl0cyBlbmQgZGF0ZSBhbmQgaGFzIGJlZW4gbWFya2VkIGV4cGlyZWQuPC9wPicsXG4gIH0sXG4gICdjcm0uY29udHJhY3RfcmVuZXdhbCc6IHtcbiAgICBsYWJlbDogJ0NvbnRyYWN0IFJlbmV3YWwgRHVlJyxcbiAgICBzdWJqZWN0OiAnQ29udHJhY3QgcmVuZXdhbCBkdWU6IHt7Y29udHJhY3RfbnVtYmVyfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+Q29udHJhY3Qge3tjb250cmFjdF9udW1iZXJ9fSBlbmRzIG9uIHt7ZW5kX2RhdGV9fS4gU3RhcnQgdGhlIHJlbmV3YWwgY29udmVyc2F0aW9uIG5vdy48L3A+JyxcbiAgfSxcbiAgJ2NybS5xdW90ZV9jcmVhdGVkJzoge1xuICAgIGxhYmVsOiAnUXVvdGUgQ3JlYXRlZCcsXG4gICAgc3ViamVjdDogJ1F1b3RlIGNyZWF0ZWQ6IHt7cXVvdGVfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPllvdXIgcXVvdGUge3txdW90ZV9uYW1lfX0gaGFzIGJlZW4gY3JlYXRlZCBmcm9tIHRoaXMgb3Bwb3J0dW5pdHkuPC9wPicsXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXMvemgtQ04udHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXMvemgtQ04udHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZVBhY2sgfSBmcm9tICcuLi8uLi9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvX2J1bmRsZSc7XG5cbi8qKiBcdTdCODBcdTRGNTNcdTRFMkRcdTY1ODcgKHpoLUNOKSBcdTIwMTQgdGhlIHJldmVudWUgcGFja2FnZSdzIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZXMuIFNlZSBgZW4udHNgLiAqL1xuZXhwb3J0IGNvbnN0IHpoQ046IEVtYWlsVGVtcGxhdGVQYWNrID0ge1xuICAnY3JtLmNvbnRyYWN0X2V4cGlyZWQnOiB7XG4gICAgbGFiZWw6ICdcdTU0MDhcdTU0MENcdTVERjJcdTUyMzBcdTY3MUYnLFxuICAgIHN1YmplY3Q6ICdcdTU0MDhcdTU0MENcdTVERjJcdTUyMzBcdTY3MUZcdUZGMUF7e2NvbnRyYWN0X251bWJlcn19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NTQwOFx1NTQwQyB7e2NvbnRyYWN0X251bWJlcn19IFx1NURGMlx1NTIzMFx1OEZCRVx1N0VEM1x1Njc1Rlx1NjVFNVx1NjcxRlx1RkYwQ1x1NUU3Nlx1NURGMlx1NjgwN1x1OEJCMFx1NEUzQVx1NTIzMFx1NjcxRlx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLmNvbnRyYWN0X3JlbmV3YWwnOiB7XG4gICAgbGFiZWw6ICdcdTU0MDhcdTU0MENcdTdFRURcdTdFQTZcdTYzRDBcdTkxOTInLFxuICAgIHN1YmplY3Q6ICdcdTU0MDhcdTU0MENcdTVGODVcdTdFRURcdTdFQTZcdUZGMUF7e2NvbnRyYWN0X251bWJlcn19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NTQwOFx1NTQwQyB7e2NvbnRyYWN0X251bWJlcn19IFx1NUMwNlx1NEU4RSB7e2VuZF9kYXRlfX0gXHU3RUQzXHU2NzVGXHUzMDAyXHU4QkY3XHU3QUNCXHU1MzczXHU1NDJGXHU1MkE4XHU3RUVEXHU3RUE2XHU2QzlGXHU5MDFBXHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0ucXVvdGVfY3JlYXRlZCc6IHtcbiAgICBsYWJlbDogJ1x1NjJBNVx1NEVGN1x1NTM1NVx1NURGMlx1NTIxQlx1NUVGQScsXG4gICAgc3ViamVjdDogJ1x1NjJBNVx1NEVGN1x1NTM1NVx1NURGMlx1NTIxQlx1NUVGQVx1RkYxQXt7cXVvdGVfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NjBBOFx1NzY4NFx1NjJBNVx1NEVGN1x1NTM1NSB7e3F1b3RlX25hbWV9fSBcdTVERjJcdTRFQ0VcdThCRTVcdTU1NDZcdTY3M0FcdTUyMUJcdTVFRkFcdTMwMDI8L3A+JyxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlcy9qYS1KUC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlcy9qYS1KUC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBFbWFpbFRlbXBsYXRlUGFjayB9IGZyb20gJy4uLy4uL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9fYnVuZGxlJztcblxuLyoqIFx1NjVFNVx1NjcyQ1x1OEE5RSAoamEtSlApIFx1MjAxNCB0aGUgcmV2ZW51ZSBwYWNrYWdlJ3Mgbm90aWZpY2F0aW9uIHRlbXBsYXRlcy4gU2VlIGBlbi50c2AuICovXG5leHBvcnQgY29uc3QgamFKUDogRW1haWxUZW1wbGF0ZVBhY2sgPSB7XG4gICdjcm0uY29udHJhY3RfZXhwaXJlZCc6IHtcbiAgICBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1MzA2RVx1NkU4MFx1NEU4NicsXG4gICAgc3ViamVjdDogJ1x1NTk1MVx1N0QwNFx1MzA0Q1x1NkU4MFx1NEU4Nlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rjoge3tjb250cmFjdF9udW1iZXJ9fScsXG4gICAgYm9keUh0bWw6ICc8cD5cdTU5NTFcdTdEMDQge3tjb250cmFjdF9udW1iZXJ9fSBcdTMwNkZcdTdENDJcdTRFODZcdTY1RTVcdTMwNkJcdTkwNTRcdTMwNTdcdTMwMDFcdTZFODBcdTRFODZcdTMwNjhcdTMwNTdcdTMwNjZcdThBMThcdTkzMzJcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5jb250cmFjdF9yZW5ld2FsJzoge1xuICAgIGxhYmVsOiAnXHU1OTUxXHU3RDA0XHU2NkY0XHU2NUIwXHUzMDZFXHU2NjQyXHU2NzFGJyxcbiAgICBzdWJqZWN0OiAnXHU1OTUxXHU3RDA0XHUzMDZFXHU2NkY0XHU2NUIwXHU2NjQyXHU2NzFGXHUzMDY3XHUzMDU5OiB7e2NvbnRyYWN0X251bWJlcn19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NTk1MVx1N0QwNCB7e2NvbnRyYWN0X251bWJlcn19IFx1MzA2RiB7e2VuZF9kYXRlfX0gXHUzMDZCXHU3RDQyXHU0RTg2XHUzMDU3XHUzMDdFXHUzMDU5XHUzMDAyXHU2NkY0XHU2NUIwXHUzMDZFXHU3NkY4XHU4QUM3XHUzMDkyXHU1OUNCXHUzMDgxXHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0ucXVvdGVfY3JlYXRlZCc6IHtcbiAgICBsYWJlbDogJ1x1ODk4Qlx1N0E0RFx1MzA2RVx1NEY1Q1x1NjIxMCcsXG4gICAgc3ViamVjdDogJ1x1ODk4Qlx1N0E0RFx1MzA5Mlx1NEY1Q1x1NjIxMFx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rjoge3txdW90ZV9uYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHUzMDUzXHUzMDZFXHU1NTQ2XHU4QUM3XHUzMDRCXHUzMDg5XHU4OThCXHU3QTREIHt7cXVvdGVfbmFtZX19IFx1MzA0Q1x1NEY1Q1x1NjIxMFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMjwvcD4nLFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZW1haWwtdGVtcGxhdGVzL2VzLUVTLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZW1haWwtdGVtcGxhdGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZW1haWwtdGVtcGxhdGVzL2VzLUVTLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEVtYWlsVGVtcGxhdGVQYWNrIH0gZnJvbSAnLi4vLi4vc2FsZXMvZW1haWwtdGVtcGxhdGVzL19idW5kbGUnO1xuXG4vKiogRXNwYVx1MDBGMW9sIChlcy1FUykgXHUyMDE0IHRoZSByZXZlbnVlIHBhY2thZ2UncyBub3RpZmljYXRpb24gdGVtcGxhdGVzLiBTZWUgYGVuLnRzYC4gKi9cbmV4cG9ydCBjb25zdCBlc0VTOiBFbWFpbFRlbXBsYXRlUGFjayA9IHtcbiAgJ2NybS5jb250cmFjdF9leHBpcmVkJzoge1xuICAgIGxhYmVsOiAnQ29udHJhdG8gdmVuY2lkbycsXG4gICAgc3ViamVjdDogJ0NvbnRyYXRvIHZlbmNpZG86IHt7Y29udHJhY3RfbnVtYmVyfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+RWwgY29udHJhdG8ge3tjb250cmFjdF9udW1iZXJ9fSBhbGNhbnpcdTAwRjMgc3UgZmVjaGEgZGUgZmluIHkgc2UgaGEgbWFyY2FkbyBjb21vIHZlbmNpZG8uPC9wPicsXG4gIH0sXG4gICdjcm0uY29udHJhY3RfcmVuZXdhbCc6IHtcbiAgICBsYWJlbDogJ1Jlbm92YWNpXHUwMEYzbiBkZSBjb250cmF0byBwZW5kaWVudGUnLFxuICAgIHN1YmplY3Q6ICdSZW5vdmFjaVx1MDBGM24gZGUgY29udHJhdG8gcGVuZGllbnRlOiB7e2NvbnRyYWN0X251bWJlcn19JyxcbiAgICBib2R5SHRtbDogJzxwPkVsIGNvbnRyYXRvIHt7Y29udHJhY3RfbnVtYmVyfX0gZmluYWxpemEgZWwge3tlbmRfZGF0ZX19LiBJbmljaWEgeWEgbGEgY29udmVyc2FjaVx1MDBGM24gZGUgcmVub3ZhY2lcdTAwRjNuLjwvcD4nLFxuICB9LFxuICAnY3JtLnF1b3RlX2NyZWF0ZWQnOiB7XG4gICAgbGFiZWw6ICdQcmVzdXB1ZXN0byBjcmVhZG8nLFxuICAgIHN1YmplY3Q6ICdQcmVzdXB1ZXN0byBjcmVhZG86IHt7cXVvdGVfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlR1IHByZXN1cHVlc3RvIHt7cXVvdGVfbmFtZX19IHNlIGhhIGNyZWFkbyBhIHBhcnRpciBkZSBlc3RhIG9wb3J0dW5pZGFkLjwvcD4nLFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZW1haWwtdGVtcGxhdGVzL2NybS5lbWFpbC10ZW1wbGF0ZS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlcy9jcm0uZW1haWwtdGVtcGxhdGUudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZURlZmluaXRpb24gfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuaW1wb3J0IHsgYnVuZGxlIH0gZnJvbSAnLi4vLi4vc2FsZXMvZW1haWwtdGVtcGxhdGVzL19idW5kbGUnO1xuaW1wb3J0IHsgZW4gfSBmcm9tICcuL2VuJztcbmltcG9ydCB7IHpoQ04gfSBmcm9tICcuL3poLUNOJztcbmltcG9ydCB7IGphSlAgfSBmcm9tICcuL2phLUpQJztcbmltcG9ydCB7IGVzRVMgfSBmcm9tICcuL2VzLUVTJztcblxuLyoqXG4gKiBSZXZlbnVlIFx1MjAxNCBldmVyeSBgc3lzX2VtYWlsX3RlbXBsYXRlYCByb3cgdGhpcyBwYWNrYWdlJ3MgYG5vdGlmeWAgbm9kZXMgbmFtZS5cbiAqXG4gKiBGb3VyIGxvY2FsZSBwYWNrcyBjcm9zc2VkIHdpdGggdGhyZWUgdGVtcGxhdGUgbmFtZXMuIGBidW5kbGUoKWAgaXMgaW1wb3J0ZWRcbiAqIGFsb25nIHRoaXMgbW9kdWxlJ3MgZWRnZSBpbnRvIHNhbGVzLCB0aGUgb25lIGRldGVybWluaXN0aWMgaG9tZSBmb3IgYSBzb3VyY2VcbiAqIG1vcmUgdGhhbiBvbmUgcGFja2FnZSBuZWVkcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFJldmVudWVFbWFpbFRlbXBsYXRlczogRW1haWxUZW1wbGF0ZURlZmluaXRpb25bXSA9IGJ1bmRsZSh7XG4gICdlbi1VUyc6IGVuLFxuICAnemgtQ04nOiB6aENOLFxuICAnamEtSlAnOiBqYUpQLFxuICAnZXMtRVMnOiBlc0VTLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlcy90ZW5hbnQtYWRtaW4ucHJvZmlsZS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlcy90ZW5hbnQtYWRtaW4ucHJvZmlsZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNiBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgU3lzdGVtQWRtaW5Qcm9maWxlIH0gZnJvbSAnLi9zeXN0ZW0tYWRtaW4ucHJvZmlsZSc7XG5cbi8qKlxuICogVGVuYW50IEFkbWluaXN0cmF0b3IgXHUyMDE0IHRoZSBhZG1pbiBwZXJzb25hIG9mIHRoZSBTYWFTIC8gbXVsdGktb3JnIGNvbXBvc2l0aW9uXG4gKiAoIzEzNjEpLiBSZWdpc3RlcmVkIE9OTFkgYnkgdGhhdCBjb21wb3NpdGlvbjsgdGhlIGNvbW11bml0eSBhcHAgc2hpcHNcbiAqIGBzeXN0ZW1fYWRtaW5gIGV4YWN0bHkgYXMgaXQgYWx3YXlzIGhhcyBhbmQgdGhpcyBmaWxlIGlzIG5vdCBpbiBpdHMgYXJ0aWZhY3QuXG4gKlxuICogIyMjIFdoeSBhIHNlY29uZCBhZG1pbiBzZXQgaW5zdGVhZCBvZiBuYXJyb3dpbmcgdGhlIGZpcnN0XG4gKlxuICogVGhlIHR3byBhZG1pbnMgYXJlIGRpZmZlcmVudCBwZW9wbGUuIGBzeXN0ZW1fYWRtaW5gIGlzIHRoZSBvcGVyYXRvciBvZiBhXG4gKiBzaW5nbGUtb3JnIGluc3RhbGw6IHRoZSBvbmUgd2hvIG93bnMgdGhlIGRlcGxveW1lbnQuIEEgdGVuYW50IGFkbWluIG93bnMgYW5cbiAqIE9SR0FOSVpBVElPTiBpbnNpZGUgc29tZWJvZHkgZWxzZSdzIGRlcGxveW1lbnQsIGFuZCB1bmRlciBhbiBgaXNvbGF0ZWRgXG4gKiBwb3N0dXJlIGV2ZXJ5IG90aGVyIG9yZ2FuaXphdGlvbiBpbiB0aGF0IGRhdGFiYXNlIGlzIG5vbmUgb2YgdGhlaXIgYnVzaW5lc3MuXG4gKiBBIHByb2ZpbGUgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHBlcnNvbmEsIHNvIHdoZXJlIHRoZSBwZXJzb25hIGRpZmZlcnMgdGhlXG4gKiBwcm9maWxlIGRvZXMgXHUyMDE0IG5hcnJvd2luZyBgc3lzdGVtX2FkbWluYCBpbiBwbGFjZSB3b3VsZCBoYXZlIGNoYW5nZWQgdGhlXG4gKiBjb21tdW5pdHkgYXBwJ3MgbWVhbmluZyB0byBkZXNjcmliZSBhIGN1c3RvbWVyIGl0IGRvZXMgbm90IGhhdmUuXG4gKlxuICogIyMjIFRoZSBPQkpFQ1QgZ3JhbnRzIGFyZSBzaGFyZWQsIG9uIHB1cnBvc2UgYW5kIGJ5IHJlZmVyZW5jZVxuICpcbiAqIEEgdGVuYW50IGFkbWluIGFkbWluaXN0ZXJzIHRoZWlyIG93biBvcmcncyByZWNvcmRzIHdpdGggZXhhY3RseSB0aGUgYXV0aG9yaXR5XG4gKiBgc3lzdGVtX2FkbWluYCBoYXMgb3ZlciBhIHNpbmdsZS1vcmcgaW5zdGFsbCdzIHJlY29yZHMgXHUyMDE0IHNhbWUgb2JqZWN0cywgc2FtZVxuICogQ1JVRCwgc2FtZSBhbGwtcmVjb3JkcyBkZXB0aCwgc2FtZSB0cmFuc2ZlciBhbmQgZXhwb3J0IGJpdHMuIFNvIHRoZSBtYXAgaXNcbiAqIERFUklWRUQgZnJvbSBgU3lzdGVtQWRtaW5Qcm9maWxlLm9iamVjdHNgIHJhdGhlciB0aGFuIHRyYW5zY3JpYmVkLlxuICpcbiAqIFRoYXQgaXMgdGhlIGxvYWQtYmVhcmluZyBoYWxmLiBQZXJtaXNzaW9uIHNldHMgYXJlIGV4cGxpY2l0LWFsbG93IG9ubHksIHNvIGFuXG4gKiBvYmplY3QgbWlzc2luZyBmcm9tIHRoZSBtYXAgaXMgcGVybWlzc2lvbi1kZW5pZWQgZm9yIHRlbmFudCBhZG1pbnMgdG9vLCBhbmQgYVxuICogdHJhbnNjcmliZWQgY29weSB3b3VsZCBkcmlmdCB0aGUgZmlyc3QgdGltZSBhbiBvYmplY3Qgc2hpcHBlZCBcdTIwMTQgdGhlIGV4YWN0XG4gKiBkZWZlY3QgYHRlc3QvYXV0aG9yaXphdGlvbi1jb3ZlcmFnZS50ZXN0LnRzYCBleGlzdHMgdG8gY2F0Y2ggb24gdGhlIGNvbW11bml0eVxuICogc2V0ICgjNDg4OiBvYmplY3RzIHRoYXQgc2hpcHBlZCB3aXRoIG5hdmlnYXRpb24sIHZpZXdzLCBob29rcyBhbmQgc2VlZHMgYnV0IGFcbiAqIGdyYW50IGluIG5vIHNldCBhdCBhbGwpLiBEZXJpdmluZyBtZWFucyBhIG5ldyBvYmplY3QgbGFuZHMgaW4gYm90aCBhZG1pbnMgdGhlXG4gKiBkYXkgaXQgbGFuZHMgaW4gb25lLCB3aXRoIG5vdGhpbmcgdG8gcmVtZW1iZXIuXG4gKlxuICogIyMjIFdoYXQgY2hhbmdlczogYG1hbmFnZV91c2Vyc2AgXHUyMTkyIGBtYW5hZ2Vfb3JnX3VzZXJzYFxuICpcbiAqIGBtYW5hZ2VfdXNlcnNgIGlzIGBzY29wZTogJ3BsYXRmb3JtJ2AgaW4gdGhlIHBsYXRmb3JtJ3Mgb3duIGNhcGFiaWxpdHlcbiAqIHJlZ2lzdHJ5IFx1MjAxNCBcIkNyZWF0ZSwgZWRpdCwgYW5kIGRlYWN0aXZhdGUgdXNlcnMgYWNyb3NzIHRoZSBwbGF0Zm9ybVwiLiBIYW5kaW5nXG4gKiB0aGF0IHRvIGEgdGVuYW50IGlzIGhhbmRpbmcgdGhlbSBldmVyeSBvdGhlciB0ZW5hbnQncyBwZW9wbGUuIEl0cyBvcmctc2NvcGVkXG4gKiBzaWJsaW5nLCBgbWFuYWdlX29yZ191c2Vyc2AgKFwiTWFuYWdlIG1lbWJlcnMgd2l0aGluIHRoZSBjYWxsZXInc1xuICogb3JnYW5pemF0aW9uXCIpLCBpcyB0aGUgbWVtYmVyLW1hbmFnZW1lbnQgYXV0aG9yaXR5IGEgdGVuYW50IGFkbWluIHNob3VsZCBob2xkLFxuICogYW5kIGl0IGlzIGRlY2xhcmVkIGluIHRoZSByZWxlYXNlZCBgQG9iamVjdHN0YWNrL3NwZWNgIDE3LjEuMCB0aGlzIGFwcCBkZXBlbmRzXG4gKiBvbiAodmVyaWZpZWQgYWdhaW5zdCB0aGUgaW5zdGFsbGVkIGBQTEFURk9STV9DQVBBQklMSVRJRVNgLCBub3QgYWdhaW5zdCBhXG4gKiBuZXdlciBwbGF0Zm9ybSBjaGVja291dCBcdTIwMTQgYW4gYXBwIG9uIGEgcmVsZWFzZWQgbGluZSBjYW5ub3QgZ3JhbnQgYSBjYXBhYmlsaXR5XG4gKiB0aGF0IGxpbmUgaGFzIG5vdCBzaGlwcGVkKS5cbiAqXG4gKiBCb3RoIGFyZSBERUNMQVJBVElPTlMgaGVyZSwgbm90IGVuZm9yY2VtZW50OiBtZWFzdXJlZCBhZ2FpbnN0IHRoZSBpbnN0YWxsZWRcbiAqIDE3LjEuMCBwYWNrYWdlcywgYG1hbmFnZV91c2Vyc2AgYXBwZWFycyBpbiBhIHNpbmdsZSBjb21tZW50IGFuZCBub3RoaW5nIHJlYWRzXG4gKiBlaXRoZXIgbmFtZSBcdTIwMTQgdGhlIG1lbWJlci1tYW5hZ2VtZW50IGRvb3IgaXMgdGhlIGVudGVycHJpc2Ugb3JnYW5pemF0aW9uc1xuICogcnVudGltZSdzLCBhbmQgaXQgaXMgdGhlIGVkaXRpb24gdGhhdCBzdXBwbGllcyB0aGUgZ2F0ZS4gVGhhdCBpcyB0aGUgc2hhcGUgdGhlXG4gKiBtYWludGFpbmVyJ3MgMjAyNi0wOC0xMSBydWxpbmcgYXNrcyBmb3IgYW5kIHRoZSBhcHAgcGFja2FnZSdzIGByZXF1aXJlc2BcbiAqIChgc3JjL3NhbGVzL2luZGV4LnRzYCkgYWxyZWFkeSBmb2xsb3dzIGZvciBgaGllcmFyY2h5LXNlY3VyaXR5YDogXHUzMDBDXHU2NzJDXHU5ODc5XHU3NkVFXHU2NjJGXHU1MTQzXHU2NTcwXHU2MzZFYXBwXHVGRjBDXHU1NzI4XHU0RjAxXHU0RTFBXHU3MjQ4XHU4RkQwXHU4ODRDXHU1QzMxXHU1MTc3XHU1OTA3XHU0RjAxXHU0RTFBXHU3MjQ4XG4gKiBcdTc2RjhcdTUxNzNcdTc2ODRcdTgwRkRcdTUyOUJcdUZGMENcdTRFMERcdTkxQ0RcdTU5MERcdTVGMDBcdTUzRDFcdTMwMDJcdTMwMEQgVGhlIGFwcCBzdGF0ZXMgd2hhdCBpdCBNRUFOUzsgdGhlIGVkaXRpb24gZW5mb3JjZXMuXG4gKlxuICogIyMjIFdoYXQgYHZpZXdfYWxsX2RhdGFgIC8gYG1vZGlmeV9hbGxfZGF0YWAgbWVhbiB1bmRlciB0aGUgd2FsbCBcdTIwMTQgdGhlIGF1ZGl0XG4gKlxuICogVGhleSBhcmUgS0VQVCwgYW5kIHRoZXkgYXJlIGJvdW5kZWQgYnkgdGhlIG9yZ2FuaXphdGlvbiwgbm90IGJ5IHRoZW0uXG4gKlxuICogVHdvIG1lYXN1cmVtZW50cywgYm90aCBhZ2FpbnN0IHRoZSAxNy4xLjAgbGluZSBcdTIwMTQgdGhlIHZlcnNpb25cbiAqIGluc3RhbGxlZCBBVCBUSEUgVElNRSB0aGV5IHdlcmUgdGFrZW4sIG5vdCB0aGUgY3VycmVudCBwaW4gKG5laXRoZXIgd2FzXG4gKiByZS10YWtlbiBvbiAxNy4zLjAsIDE3LjQuMCBvciAxNy41LjApLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBUaGUgemVyby1vY2N1cnJlbmNlIHJlc3VsdCBpbiAxIFx1MjAxNCB0aGUgbG9hZC1iZWFyaW5nIGhhbGYgXHUyMDE0IHJlcHJvZHVjZWQgb25cbiAqIDE3LjIuMCBhbmQgaGFzIG5vdCBiZWVuIHJlLXJ1biBzaW5jZSAoIzE2NzYpLiBUaGUgdGhyZWUgQ09OVFJPTCBjb3VudHMgaW5cbiAqIGl0IGRvIE5PVCByZXByb2R1Y2U6IHRoZXkgYXJlXG4gKiBhcy1tZWFzdXJlZC10aGVuIGZpZ3VyZXMgYW5kIGhhdmUgc2luY2UgbW92ZWQuIFRoZXkgYXJlIGtlcHQgYXQgdGhlaXJcbiAqIG1lYXN1cmVkIHZhbHVlcyBvbiBwdXJwb3NlIHJhdGhlciB0aGFuIHJlZnJlc2hlZCwgYmVjYXVzZSB3aGF0IHRoZXkgYXJlXG4gKiBldmlkZW5jZSBGT1IgaXMgdGhhdCB0aGUgc3dlZXAgY2FuIGZpbmQgYSBuYW1lIGl0IGxvb2tzIGZvciBcdTIwMTQgbmV2ZXIgYVxuICogY3VycmVudCB0b3RhbC4gXHUyNkQ0IERvIG5vdCBjaXRlIHRoZW0gYXMgb25lLCBhbmQgXHUyNkQ0IGRvIG5vdCBcImZpeFwiIHRoZW0gYnlcbiAqIHBhc3RpbmcgdG9kYXkncyBudW1iZXJzIG92ZXIgYSAxNy4xLjAgbWVhc3VyZW1lbnQuXG4gKlxuICogIDEuICoqTmVpdGhlciBzdHJpbmcgaXMgcmVhZCBieSBhbnl0aGluZy4qKiBgdmlld19hbGxfZGF0YWAgYW5kXG4gKiAgICAgYG1vZGlmeV9hbGxfZGF0YWAgb2NjdXIgaW4gWkVSTyBpbnN0YWxsZWQgYEBvYmplY3RzdGFjay8qYCBKYXZhU2NyaXB0XG4gKiAgICAgZmlsZXMgKGNvbnRyb2wgcHJvYmVzIGluIHRoZSBzYW1lIHN3ZWVwOiBgbWFuYWdlX3NoYXJpbmdgIDE1IGZpbGVzLFxuICogICAgIGBtYW5hZ2VfbWV0YWRhdGFgIDI1LCBgc2V0dXAuYWNjZXNzYCAzMiBcdTIwMTQgc28gdGhlIHN3ZWVwIGNhbiBmaW5kIGEgbmFtZSBpdFxuICogICAgIGlzIGxvb2tpbmcgZm9yKS4gVGhleSBhcmUgYXBwLWRlY2xhcmVkIHZvY2FidWxhcnkuIFRoZSBhdXRob3JpdHkgdGhhdCBpc1xuICogICAgIHJlYWxseSBlbmZvcmNlZCBpcyB0aGUgUEVSLU9CSkVDVCBgdmlld0FsbFJlY29yZHNgIC8gYG1vZGlmeUFsbFJlY29yZHNgXG4gKiAgICAgYml0cyBpbiB0aGUgbWFwIGFib3ZlLCB3aGljaCB0aGUgc2hhcmluZyBsYXllciByZWFkcyBvbiBldmVyeSByZXF1ZXN0LlxuICogIDIuICoqVGhlIG9yZ2FuaXphdGlvbiBwcmVkaWNhdGUgaXMgbm90IHBhcnQgb2YgdGhhdCBsYXllci4qKiBBIHRlbmFudC1zY29wZWRcbiAqICAgICByZWFkIGlzIGNvbXBpbGVkIGJ5IHRoZSBEUklWRVIgZnJvbSB0aGUgZXhlY3V0aW9uIGNvbnRleHQncyB0ZW5hbnQgaWQsXG4gKiAgICAgdW5kZXJuZWF0aCBwZXJtaXNzaW9ucyBhbmQgc2hhcmluZyBlbnRpcmVseS4gTWVhc3VyZWQgb24gYSByZWFsIGVuZ2luZTogYVxuICogICAgIGNhbGxlciBpbiBgb3JnX2FgIHJlYWRpbmcgYGNybV9hY2NvdW50YCBzZWVzIDEgb2YgdGhlIDIgcm93cyBpbiB0aGUgdGFibGVcbiAqICAgICBcdTIwMTQgYW5kIHN0aWxsIHNlZXMgMSBvZiAyIHdpdGggdGhlIHRlbmFuY3kgcG9zdHVyZSBmbGlwcGVkIHRvIGBzaW5nbGVgLFxuICogICAgIHdoaWNoIGlzIHdoYXQgc2hvd3MgdGhlIGJvdW5kYXJ5IGJlbG9uZ3MgdG8gdGhlIGRyaXZlciBhbmQgdGhlIGNvbnRleHRcbiAqICAgICByYXRoZXIgdGhhbiB0byBhIGRlcGxveW1lbnQga25vYiBhIHByb2ZpbGUgbWlnaHQgaG9wZSB0byBvdXQtcmFuay5cbiAqXG4gKiBTbyBcImFsbCBkYXRhXCIgYW5zd2VycyBhIHF1ZXN0aW9uIGFib3V0IERFUFRIIGluc2lkZSBvbmUgb3JnYW5pemF0aW9uIFx1MjAxNCBhbGxcbiAqIHJvd3MgcmVnYXJkbGVzcyBvZiBvd25lciBcdTIwMTQgYW5kIG5vIHBlcm1pc3Npb24tc2V0IGJpdCBjYW4gd2lkZW4gaXQgcGFzdCB0aGVcbiAqIHdhbGwsIGJlY2F1c2UgdGhlIHdhbGwgaXMgbm90IGFwcGxpZWQgYnkgdGhlIHBlcm1pc3Npb24gc2V0LiBUaGUgb25lIGNvbnRleHRcbiAqIHRoYXQgZG9lcyBjcm9zcyBpdCBpcyBhIHN5c3RlbSBjb250ZXh0IChgaXNTeXN0ZW1gKSwgd2hpY2ggbm8gcHJvZmlsZSBncmFudHNcbiAqIGFuZCBubyBzZXNzaW9uIHByb2R1Y2VzLiBLZWVwaW5nIHRoZSB0d28gZ3JhbnRzIHRoZXJlZm9yZSBzYXlzIHRoZSB0cnVlXG4gKiB0aGluZyBhYm91dCBhIHRlbmFudCBhZG1pbjogaW5zaWRlIHRoZWlyIG9yZywgdGhleSBzZWUgYW5kIGVkaXQgZXZlcnl0aGluZy5cbiAqXG4gKiAjIyMgV2hhdCBhIHRlbmFudCBhZG1pbiBtYXkgQVVUSE9SOiBub3RoaW5nLCBzaW5jZSAxOC4wLjAtbmV4dC4wXG4gKlxuICogVGhyb3VnaCAxNy43LjAgdGhpcyBzZXQgaGVsZCBgbWFuYWdlX29yZ19wcmVzZW50YXRpb25gLCB0aGUgcGxhdGZvcm0nc1xuICogYHNjb3BlOiAnb3JnJ2AgY2FwYWJpbGl0eSAob2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjMTI3MDIpIHRoYXQgYWRtaXR0ZWRcbiAqIGAvbWV0YWAgd3JpdGVzIG9mIHRoZSBgYWxsb3dPcmdPdmVycmlkZTogdHJ1ZWAgdHlwZXMgXHUyMDE0IHZpZXcsIGRhc2hib2FyZCxcbiAqIHJlcG9ydCwgdHJhbnNsYXRpb24sIGVtYWlsX3RlbXBsYXRlIFx1MjAxNCBhcyBvdmVybGF5cyBpbiB0aGUgY2FsbGVyJ3Mgb3duXG4gKiBvcmdhbml6YXRpb24uIDE4LjAuMC1uZXh0LjAgUkVUSVJFUyBpdCB3aXRoIHRoZSBwZXItb3JnYW5pemF0aW9uIG92ZXJsYXlcbiAqIGF4aXMgKEFEUi0wMTMxIEQ2LCB0aGUgc3BlYydzIGBtYW5hZ2Utb3JnLXByZXNlbnRhdGlvbi1yZXRpcmVkYCBlbnRyeSk6IGl0IGlzXG4gKiBubyBsb25nZXIgaW4gYFBMQVRGT1JNX0NBUEFCSUxJVElFU2AsIG5vdGhpbmcgY29uc3VsdHMgaXQsIGFuZCB0aGUgZW50cnknc1xuICogcmVtZWR5IGlzIHRvIGRlbGV0ZSBpdCBmcm9tIGV2ZXJ5IHNldC4gVGhlcmUgaXMgbm8gb3JnYW5pemF0aW9uLWJvdW5kZWRcbiAqIGF1dGhvcmluZyBjYXBhYmlsaXR5IGxlZnQ7IHRoZSBvbmx5IGtleSB0aGF0IGFkbWl0cyB0aG9zZSB3cml0ZXMgaXNcbiAqIGBtYW5hZ2VfbWV0YWRhdGFgLCB3aG9zZSB3cml0ZXMgbGFuZCBlbnZpcm9ubWVudC13aWRlLCBzbyBpdCBzdGF5c1xuICogdW5ncmFudGVkIGZvciB0aGUgcmVhc29uIGJlbG93LlxuICpcbiAqIGBjdXN0b21pemVfYXBwbGljYXRpb25gLCBgbWFuYWdlX3Byb2ZpbGVzYCBhbmQgYG1hbmFnZV9yb2xlc2Agc3RheVxuICogdW5ncmFudGVkLiBUaGV5IGRlc2NyaWJlIGF1dGhvcmluZyB0aGUgYXBwJ3Mgc3RydWN0dXJlIGFuZCBzZWN1cml0eSBtb2RlbCBcdTIwMTRcbiAqIG9iamVjdHMsIGFwcHMsIHBhZ2VzLCBwZXJtaXNzaW9uIHNldHMsIHBvc2l0aW9ucyBcdTIwMTQgYW5kIHRoZSByZWdpc3RyeSBkZWNsYXJlc1xuICogZXZlcnkgb25lIG9mIHRob3NlIHR5cGVzIGBhbGxvd09yZ092ZXJyaWRlOiBmYWxzZWAsIHNvIHRoZSBvbmx5IGtleSB0aGF0XG4gKiBhZG1pdHMgdGhvc2Ugd3JpdGVzIGlzIHN0aWxsIGBtYW5hZ2VfbWV0YWRhdGFgOiBgc2NvcGU6ICdwbGF0Zm9ybSdgLCByZWFjaFxuICogYWNyb3NzIGV2ZXJ5IG9yZ2FuaXphdGlvbiBpbiB0aGUgZGVwbG95bWVudC4gR3JhbnRpbmcgdGhlIHRocmVlIHdvdWxkXG4gKiBkZXNjcmliZSBhbiBhdXRob3JpdHkgdGhlIGRlcGxveW1lbnQgY2Fubm90IHNhZmVseSBnaXZlLlxuICpcbiAqIGBtYW5hZ2Vfc2hhcmluZ2AgSVMgZ3JhbnRlZDogdGhlIHBsYXRmb3JtIGRlY2xhcmVzIGl0IGBzY29wZTogJ29yZydgXG4gKiAoXCJBZG1pbmlzdGVyIHJlY29yZCBzaGFyaW5nIFx1MjAyNiBiZXlvbmQgb25lJ3Mgb3duIHJlY29yZHNcIiksIHdoaWNoIGlzIHByZWNpc2VseVxuICogYSB0ZW5hbnQgYWRtaW4ncyBqb2Igb3ZlciB0aGVpciBvd24gb3JnJ3MgcmVjb3Jkcy5cbiAqXG4gKiBgdmlld19zZXR1cGAgaXMga2VwdCBmb3IgcGFyaXR5IHdpdGggdGhlIGNvbW11bml0eSBhZG1pbiBcdTIwMTQgaXQgaXMgdGhpcyBhcHAnc1xuICogb3duIFNldHVwLWVudHJ5IHZvY2FidWxhcnkgYW5kLCBsaWtlIHRoZSB0d28gYWJvdmUsIGhhcyBubyBwbGF0Zm9ybSBjb25zdW1lclxuICogb24gdGhpcyBsaW5lLiAoVGhlIHBsYXRmb3JtJ3Mgb3duIGBzZXR1cC5hY2Nlc3NgIGlzIGBzY29wZTogJ3BsYXRmb3JtJ2AgYW5kXG4gKiBpcyBub3QgZ3JhbnRlZCBoZXJlIGZvciB0aGUgc2FtZSByZWFzb24gYG1hbmFnZV91c2Vyc2AgaXMgbm90LilcbiAqL1xuZXhwb3J0IGNvbnN0IFRlbmFudEFkbWluUHJvZmlsZSA9IHtcbiAgbmFtZTogJ3RlbmFudF9hZG1pbicsXG4gIGxhYmVsOiAnVGVuYW50IEFkbWluaXN0cmF0b3InLFxuICAvLyBEZXJpdmVkLCBuZXZlciB0cmFuc2NyaWJlZCBcdTIwMTQgc2VlIHRoZSBub3RlIGFib3ZlLiBTcHJlYWQgcmF0aGVyIHRoYW5cbiAgLy8gYWxpYXNlZCBzbyB0aGUgdHdvIHNldHMgYXJlIGluZGVwZW5kZW50IHZhbHVlcyBpbiB0aGUgYnVpbHQgYXJ0aWZhY3QuXG4gIG9iamVjdHM6IHsgLi4uU3lzdGVtQWRtaW5Qcm9maWxlLm9iamVjdHMgfSxcbiAgc3lzdGVtUGVybWlzc2lvbnM6IFtcbiAgICAndmlld19zZXR1cCcsXG4gICAgLy8gVGhlIG9uZSBzdWJzdGl0dXRpb24gdGhpcyBwcm9maWxlIGV4aXN0cyBmb3I6IG9yZy1zY29wZWQgbWVtYmVyXG4gICAgLy8gbWFuYWdlbWVudCBpbnN0ZWFkIG9mIHBsYXRmb3JtLXdpZGUgdXNlciBtYW5hZ2VtZW50LlxuICAgICdtYW5hZ2Vfb3JnX3VzZXJzJyxcbiAgICAvLyBPcmctYm91bmRlZCBieSB0aGUgZHJpdmVyJ3MgdGVuYW50IHByZWRpY2F0ZSBcdTIwMTQgc2VlIHRoZSBhdWRpdCBhYm92ZS5cbiAgICAndmlld19hbGxfZGF0YScsICdtb2RpZnlfYWxsX2RhdGEnLFxuICAgICdtYW5hZ2Vfc2hhcmluZycsXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0cy9hY2NvdW50Lmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2FjY291bnQuaG9vay50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBIb29rLCBIb29rQ29udGV4dCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHR5cGUgeyBIb29rQXBpIH0gZnJvbSAnLi9faG9vay1hcGknO1xuXG4vKipcbiAqIEFjY291bnQgcHJvdGVjdGlvbiBob29rLlxuICpcbiAqIC0gVmFsaWRhdGVzIGB3ZWJzaXRlYCBmb3JtYXQgYW5kIGBhbm51YWxfcmV2ZW51ZWAgbm9uLW5lZ2F0aXZlLlxuICogLSBQcm9qZWN0cyBgYmlsbGluZ19hZGRyZXNzLmNvdW50cnlgIG9udG8gdGhlIGZsYXQgYGJpbGxpbmdfY291bnRyeWAgY29sdW1uXG4gKiAgICgjNjIxKSBhbmQgY2xhc3NpZmllcyBpdCBpbnRvIHRoZSBgdGVycml0b3J5YCBzZWxlY3QgdGhlIHRlcnJpdG9yeSBzaGFyaW5nXG4gKiAgIHJ1bGVzIGZpbHRlciBvbiAoIzYzOSkuXG4gKiAtIEZvbGRzIGBuYW1lYCBpbnRvIHRoZSBgbmFtZV9ub3JtYWxpemVkYCBjb2x1bW4gbGVhZCBjb252ZXJzaW9uIG1hdGNoZXNcbiAqICAgYWNjb3VudHMgb24gKCM2MjYpLlxuICogLSBSZWZ1c2VzIHRvIGRlbGV0ZSBhIGBjdXN0b21lcmAgYWNjb3VudCB0aGF0IHN0aWxsIGhhcyBvcHBvcnR1bml0aWVzIFx1MjAxNFxuICogICBvcGVuIG9yIGNsb3NlZCwgdGhlIGFjY291bnQncyBzYWxlcyBoaXN0b3J5ICgjMjAxOSkgXHUyMDE0IG9yIGFjdGl2YXRlZFxuICogICBjb250cmFjdHMgXHUyMDE0IGNvbnRyYWN0cyBjYXNjYWRlIHdpdGggdGhlIGFjY291bnQgc2luY2UgIzU0OS5cbiAqL1xuY29uc3QgYWNjb3VudEhvb2s6IEhvb2sgPSB7XG4gIG5hbWU6ICdhY2NvdW50X3Byb3RlY3Rpb24nLFxuICBvYmplY3Q6ICdjcm1fYWNjb3VudCcsXG4gIGV2ZW50czogWydiZWZvcmVJbnNlcnQnLCAnYmVmb3JlVXBkYXRlJywgJ2JlZm9yZURlbGV0ZSddLFxuICBwcmlvcml0eTogMjAwLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnVmFsaWRhdGUgYWNjb3VudCBmaWVsZHMgYW5kIHByb3RlY3QgY3VzdG9tZXIgYWNjb3VudHMgd2l0aCBvcHBvcnR1bml0aWVzIG9yIGFjdGl2YXRlZCBjb250cmFjdHMgZnJvbSBkZWxldGlvbi4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIC8vIFRoZSByZWZ1c2FsIGVudmVsb3BlICgjMTA3NSkuIE1pcnJvcmVkIGZyb20gYC4vX3JlZnVzYWwudHNgIGJlY2F1c2UgYVxuICAgIC8vIGxvd2VyZWQgYm9keSBoYXMgbm8gbW9kdWxlIHNjb3BlIGFuZCBgZXh0cmFjdEhvb2tCb2R5YCBUSFJPV1Mgb24gYW5cbiAgICAvLyBpbXBvcnQ7IGB0ZXN0L3JlZnVzYWwtZW52ZWxvcGUudGVzdC50c2AgcGlucyBldmVyeSBjb3B5IGFnYWluc3QgaXQuXG4gICAgZnVuY3Rpb24gcmVmdXNlKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29kZTogc3RyaW5nLFxuICAgICAgc3RhdHVzOiBudW1iZXIsXG4gICAgICB1c2VyTWVzc2FnZTogc3RyaW5nID0gbWVzc2FnZSxcbiAgICApOiBFcnJvciB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSkgYXMgRXJyb3IgJiB7XG4gICAgICAgIGNvZGU6IHN0cmluZztcbiAgICAgICAgc3RhdHVzOiBudW1iZXI7XG4gICAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmc7XG4gICAgICB9O1xuICAgICAgZXJyLmNvZGUgPSBjb2RlO1xuICAgICAgZXJyLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgIGVyci51c2VyTWVzc2FnZSA9IHVzZXJNZXNzYWdlO1xuICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG4gICAgY29uc3QgeyBldmVudCwgaW5wdXQgfSA9IGN0eDtcblxuICAgIGlmIChldmVudCA9PT0gJ2JlZm9yZUluc2VydCcgfHwgZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnKSB7XG4gICAgICBpZiAodHlwZW9mIGlucHV0LndlYnNpdGUgPT09ICdzdHJpbmcnICYmIGlucHV0LndlYnNpdGUubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoIS9eaHR0cHM/OlxcL1xcLy9pLnRlc3QoaW5wdXQud2Vic2l0ZSkpIHtcbiAgICAgICAgICB0aHJvdyByZWZ1c2UoJ1dlYnNpdGUgbXVzdCBzdGFydCB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly8nLCAnVkFMSURBVElPTl9GQUlMRUQnLCA0MDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGlucHV0LmFubnVhbF9yZXZlbnVlID09PSAnbnVtYmVyJyAmJiBpbnB1dC5hbm51YWxfcmV2ZW51ZSA8IDApIHtcbiAgICAgICAgdGhyb3cgcmVmdXNlKCdBbm51YWwgUmV2ZW51ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwJywgJ1ZBTElEQVRJT05fRkFJTEVEJywgNDAwKTtcbiAgICAgIH1cblxuICAgICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFRlcnJpdG9yeSAoIzYyMSBzdG9yYWdlIGxvY2F0aW9uLCAjNjM5IGNsYXNzaWZpY2F0aW9uKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAgIC8vXG4gICAgICAvLyBUd28gZGVyaXZlZCBjb2x1bW5zLCBvbmUgaW5wdXQuIGBiaWxsaW5nX2NvdW50cnlgIGlzIHRoZSBmbGF0XG4gICAgICAvLyBwcm9qZWN0aW9uIG9mIGBiaWxsaW5nX2FkZHJlc3MuY291bnRyeWA7IGB0ZXJyaXRvcnlgIGlzIHRoZSBDTEFTU0lGSUVEXG4gICAgICAvLyB2YWx1ZSB0aGUgdHdvIHRlcnJpdG9yeSBzaGFyaW5nIHJ1bGVzIG5vdyBmaWx0ZXIgb24uIFRoaXMgYmxvY2sgaXMgdGhlXG4gICAgICAvLyBvbmx5IHdyaXRlciBvZiBib3RoLlxuICAgICAgLy9cbiAgICAgIC8vIGBiaWxsaW5nX2NvdW50cnlgIGJlY2FtZSBhIGZsYXQgY29sdW1uIGJlY2F1c2UgYSBzaGFyaW5nIHJ1bGUncyBDRUxcbiAgICAgIC8vIGNvbmRpdGlvbiBpcyBjb21waWxlZCBpbnRvIGEgcHVzaGRvd24tYWJsZSBxdWVyeSBmaWx0ZXIsIGFuZCB0aGF0XG4gICAgICAvLyBjb21waWxlciByZWplY3RzIGFueSBwYXRoIHJlYWNoaW5nIElOU0lERSBhIGNvbXBvc2l0ZSBgYWRkcmVzc2AgdmFsdWVcbiAgICAgIC8vIFx1MjAxNCBgcmVjb3JkLmJpbGxpbmdfYWRkcmVzcy5jb3VudHJ5IGluIFsuLi5dYCBpcyBub3QgdHJhbnNsYXRhYmxlLCBzb1xuICAgICAgLy8gcGx1Z2luLXNoYXJpbmcgZHJvcHBlZCBib3RoIHJ1bGVzIG9uIGV2ZXJ5IGJvb3QgYW5kIGBuYV9zYWxlc190ZWFtYCAvXG4gICAgICAvLyBgZXVfc2FsZXNfdGVhbWAgZ290IG5vdGhpbmcgYXQgYWxsICgjNjIxKS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGF0IGZpeGVkIFdIRVJFIHRoZSBjb3VudHJ5IGlzIHJlYWQgZnJvbSBhbmQgbGVmdCBXSEFUIHRoZSBydWxlc1xuICAgICAgLy8gbWF0Y2ggb24gdW5maXhlZDogYSBmcmVlLXRleHQgY291bnRyeS4gYFVuaXRlZCBTdGF0ZXNgIG1hdGNoZWQgbm9cbiAgICAgIC8vIHRlcnJpdG9yeSwgc2lsZW50bHksIGFuZCB0aGUgc2FtZSBjb3VudHJ5IGxpc3RzIHdlcmUgcmVzdGF0ZWQgaW4gdHdvXG4gICAgICAvLyBDRUwgc3RyaW5ncyBhbmQgc2l4IGRvY3VtZW50YXRpb24gZmlsZXMuICM2MzkgcmVwbGFjZWQgdGhlIG1hdGNoaW5nXG4gICAgICAvLyB3aXRoIGB0ZXJyaXRvcnlgLCBhIGRlY2xhcmVkIHNlbGVjdCBcdTIwMTQgc2VlIGAuL190ZXJyaXRvcnkudHNgIGZvciB0aGVcbiAgICAgIC8vIHdob2xlIGFyZ3VtZW50IGFuZCBmb3IgdGhlIGF1dGhvcmVkIHRhYmxlcyB0aGlzIHRhYmxlIGlzIGRlcml2ZWQgZnJvbS5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI1MDBcdTI1MDAgVHdvIGRpZmZlcmVudCByZWNvbXB1dGUgcnVsZXMsIG9uIHB1cnBvc2UgXHUyNTAwXHUyNTAwXG4gICAgICAvL1xuICAgICAgLy8gYGJpbGxpbmdfY291bnRyeWAgTUlSUk9SUyB0aGUgYWRkcmVzcywgc28gaXQgaXMgcmV3cml0dGVuIG9ubHkgd2hlblxuICAgICAgLy8gdGhlIHdyaXRlIGNhcnJpZXMgb25lOiBhIHBhcnRpYWwgdXBkYXRlIHRoYXQgbmV2ZXIgbWVudGlvbnNcbiAgICAgIC8vIGBiaWxsaW5nX2FkZHJlc3NgIG11c3QgbGVhdmUgaXQgYWxvbmUsIG9yIGV2ZXJ5IHVucmVsYXRlZCBlZGl0IHdvdWxkXG4gICAgICAvLyBibGFuayB0aGUgY29sdW1uLiBBIHdyaXRlIHRoYXQgQ0xFQVJTIHRoZSBhZGRyZXNzXG4gICAgICAvLyAoYGJpbGxpbmdfYWRkcmVzczogbnVsbGApIGRvZXMgY2xlYXIgaXQgXHUyMDE0IHRoZSBrZXkgaXMgcHJlc2VudCwgdGhlXG4gICAgICAvLyB2YWx1ZSBpcyBlbXB0eS5cbiAgICAgIC8vXG4gICAgICAvLyBgdGVycml0b3J5YCBpcyBhIENMQVNTSUZJQ0FUSU9OLCBhbmQgIzYzOSBkZWNpZGVkIGl0IGlzIGFsd2F5cyBhXG4gICAgICAvLyBzdGF0ZWQgZmFjdCByYXRoZXIgdGhhbiBhIGJsYW5rIChcImJlbG9uZ3MgdG8gbm8gdGVycml0b3J5XCIgYW5kIFwibm9ib2R5XG4gICAgICAvLyBmaWxsZWQgaXQgaW5cIiBtdXN0IG5vdCBsb29rIGFsaWtlKS4gU28gaXQgaXMgYWxzbyBzdGF0ZWQgb24gYW4gaW5zZXJ0XG4gICAgICAvLyB0aGF0IGNhcnJpZXMgbm8gYWRkcmVzcyBhdCBhbGwsIHdoZXJlIGl0IGlzIGBvdGhlcmAuIE9uIGFuIHVwZGF0ZSB0aGF0XG4gICAgICAvLyBkb2VzIG5vdCBtZW50aW9uIHRoZSBhZGRyZXNzIGl0IGlzIGxlZnQgYWxvbmUsIGV4YWN0bHkgbGlrZSB0aGVcbiAgICAgIC8vIHByb2plY3Rpb24gXHUyMDE0IGFuIHVucmVsYXRlZCBlZGl0IG11c3Qgbm90IHJlLWRlcml2ZSBpdC5cbiAgICAgIC8vXG4gICAgICAvLyBPbmx5IGBjb3VudHJ5YCBpcyByZWFkLiBgY291bnRyeUNvZGVgIGlzIHRoZSBJU08gMzE2Ni0xIGFscGhhLTIgc2xvdFxuICAgICAgLy8gYW5kIHdvdWxkIGJlIHRoZSBiZXR0ZXIgaW5wdXQsIGJ1dCBpdCBpcyBvcHRpb25hbCBhbmQgbW9zdGx5IGVtcHR5IGluXG4gICAgICAvLyB0aGlzIGFwcCdzIGRhdGE7IHJlYWRpbmcgaXQgaW4gcHJlZmVyZW5jZSB3b3VsZCBtb3ZlIHdoaWNoIHNsb3QgZGVjaWRlc1xuICAgICAgLy8gYW4gYWNjb3VudCdzIHRlcnJpdG9yeSwgd2hpY2ggIzYzOSBkaWQgbm90IGFzayBmb3IuIGBVS2AgdnMgYEdCYCBpc1xuICAgICAgLy8gaGFuZGxlZCBpbiB0aGUgbWFwcGluZyBpbnN0ZWFkIChib3RoIGFyZSBgZW1lYWApLCB3aGljaCBpcyB3aHkgbm90aGluZ1xuICAgICAgLy8gaGFkIHRvIG1pZ3JhdGUuXG4gICAgICAvL1xuICAgICAgLy8gXHUyNTAwXHUyNTAwIFdoeSB0aGUgbWFwIGlzIElOTElORSByYXRoZXIgdGhhbiBpbXBvcnRlZCBcdTI1MDBcdTI1MDBcbiAgICAgIC8vXG4gICAgICAvLyBBIGhvb2sgaGFuZGxlciBpcyBsb3dlcmVkIHRvIGEgbWV0YWRhdGEtb25seSBgYm9keS5zb3VyY2VgIGFuZFxuICAgICAgLy8gZXZhbHVhdGVkIGluc2lkZSBRdWlja0pTIHdpdGggbm8gbW9kdWxlIHNjb3BlLCBzbyBhbiBpbXBvcnQgaXMgYVxuICAgICAgLy8gYFJlZmVyZW5jZUVycm9yYCBhdCBydW50aW1lLCBub3QgYSBjbG9zdXJlOyBgZXh0cmFjdEhvb2tCb2R5YCByZWplY3RzXG4gICAgICAvLyBzdWNoIGEgaGFuZGxlciBhbmQgYHRlc3QvYWN0aW9uLXNhbmRib3gudGVzdC50c2AgcnVucyB0aGF0IHNhbWVcbiAgICAgIC8vIGxvd2VyaW5nIHBhc3Mgb3ZlciBldmVyeSByZWdpc3RlcmVkIGhvb2suIFRoZSB0YWJsZSB0aGVyZWZvcmUgY2Fubm90IGJlXG4gICAgICAvLyByZWFkIGZyb20gYC4vX3RlcnJpdG9yeS50c2AgaGVyZS4gSXQgaXMgbm90IHRydXN0ZWQgdG8gc3RheSBpbiBzdGVwXG4gICAgICAvLyBlaXRoZXI6IGB0ZXN0L3RlcnJpdG9yeS1zaW5nbGUtc291cmNlLnRlc3QudHNgIHBhcnNlcyB0aGlzIGxpdGVyYWwgb3V0XG4gICAgICAvLyBvZiB0aGUgTE9XRVJFRCBib2R5IGFuZCBhc3NlcnRzIGRlZXAgZXF1YWxpdHkgd2l0aCB0aGUgbW9kdWxlJ3MgZGVyaXZlZFxuICAgICAgLy8gbWFwLCBzbyBhIGNvdW50cnkgYWRkZWQgdG8gZWl0aGVyIHNpZGUgYWxvbmUgZmFpbHMuXG4gICAgICBpZiAoJ2JpbGxpbmdfYWRkcmVzcycgaW4gaW5wdXQgfHwgZXZlbnQgPT09ICdiZWZvcmVJbnNlcnQnKSB7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSBpbnB1dC5iaWxsaW5nX2FkZHJlc3M7XG4gICAgICAgIGNvbnN0IGNvdW50cnkgPVxuICAgICAgICAgIGFkZHJlc3MgIT09IG51bGwgJiYgdHlwZW9mIGFkZHJlc3MgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGFkZHJlc3MpXG4gICAgICAgICAgICA/IChhZGRyZXNzIGFzIHsgY291bnRyeT86IHVua25vd24gfSkuY291bnRyeVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFRoZSBvbmUgbm9ybWFsaXNhdGlvbiBydWxlLCBtaXJyb3JlZCBmcm9tIGBub3JtYWxpemVDb3VudHJ5YDogdHJpbSxcbiAgICAgICAgLy8gY29sbGFwc2UgaW50ZXJuYWwgd2hpdGVzcGFjZSwgdXBwZXItY2FzZS4gRXZlcnkga2V5IGJlbG93IGlzIHdyaXR0ZW5cbiAgICAgICAgLy8gaW4gdGhhdCBmb3JtLCBzbyB0aGUgbG9va3VwIGlzIGEgcGxhaW4gcHJvcGVydHkgcmVhZCByYXRoZXIgdGhhbiBhXG4gICAgICAgIC8vIHBpbGUgb2YgdG9sZXJhbnQgY29tcGFyaXNvbnMuXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPVxuICAgICAgICAgIHR5cGVvZiBjb3VudHJ5ID09PSAnc3RyaW5nJyA/IGNvdW50cnkudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKS50b1VwcGVyQ2FzZSgpIDogJyc7XG5cbiAgICAgICAgaWYgKCdiaWxsaW5nX2FkZHJlc3MnIGluIGlucHV0KSB7XG4gICAgICAgICAgaW5wdXQuYmlsbGluZ19jb3VudHJ5ID0gbm9ybWFsaXplZCA9PT0gJycgPyBudWxsIDogbm9ybWFsaXplZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEEgQ09QWSBvZiB0aGUgbWFwIGRlcml2ZWQgaW4gYC4vX3RlcnJpdG9yeS50c2AsIGtlcHQgaGVyZSBiZWNhdXNlIGFcbiAgICAgICAgLy8gc2FuZGJveGVkIGJvZHkgY2Fubm90IGltcG9ydCBpdCAoc2VlIGFib3ZlKS4gRWRpdCBgX3RlcnJpdG9yeS50c2BcbiAgICAgICAgLy8gYW5kIG1pcnJvciB0aGUgcmVzdWx0IGhlcmUgXHUyMDE0IGB0ZXN0L3RlcnJpdG9yeS1zaW5nbGUtc291cmNlLnRlc3QudHNgXG4gICAgICAgIC8vIHJlYWRzIHRoaXMgbGl0ZXJhbCBiYWNrIG91dCBvZiB0aGUgbG93ZXJlZCBib2R5IGFuZCBmYWlscyBpZiB0aGUgdHdvXG4gICAgICAgIC8vIGRpc2FncmVlLCBzbyB0aGUgbWlycm9yaW5nIGlzIGVuZm9yY2VkIHJhdGhlciB0aGFuIHJlbWVtYmVyZWQuXG4gICAgICAgIGNvbnN0IFRFUlJJVE9SWV9CWV9DT1VOVFJZOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgIFwiVVNcIjogXCJuYVwiLCBcIkNBXCI6IFwibmFcIiwgXCJNWFwiOiBcIm5hXCIsXG4gICAgICAgICAgXCJHQlwiOiBcImVtZWFcIiwgXCJERVwiOiBcImVtZWFcIiwgXCJGUlwiOiBcImVtZWFcIiwgXCJJVFwiOiBcImVtZWFcIiwgXCJFU1wiOiBcImVtZWFcIixcbiAgICAgICAgICBcIlVOSVRFRCBTVEFURVNcIjogXCJuYVwiLCBcIlVOSVRFRCBTVEFURVMgT0YgQU1FUklDQVwiOiBcIm5hXCIsIFwiVVNBXCI6IFwibmFcIixcbiAgICAgICAgICBcIkNBTkFEQVwiOiBcIm5hXCIsIFwiTUVYSUNPXCI6IFwibmFcIixcbiAgICAgICAgICBcIlVLXCI6IFwiZW1lYVwiLCBcIlVOSVRFRCBLSU5HRE9NXCI6IFwiZW1lYVwiLCBcIkdSRUFUIEJSSVRBSU5cIjogXCJlbWVhXCIsXG4gICAgICAgICAgXCJHRVJNQU5ZXCI6IFwiZW1lYVwiLCBcIkZSQU5DRVwiOiBcImVtZWFcIiwgXCJJVEFMWVwiOiBcImVtZWFcIiwgXCJTUEFJTlwiOiBcImVtZWFcIlxuICAgICAgICB9O1xuICAgICAgICBpbnB1dC50ZXJyaXRvcnkgPSBURVJSSVRPUllfQllfQ09VTlRSWVtub3JtYWxpemVkXSB8fCAnb3RoZXInO1xuICAgICAgfVxuXG4gICAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQWNjb3VudC1uYW1lIG1hdGNoIGtleSAoIzYyNikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgICAvL1xuICAgICAgLy8gYG5hbWVfbm9ybWFsaXplZGAgaXMgdGhlIGNvbHVtbiBgbGVhZF9jb252ZXJzaW9uYCBtYXRjaGVzIGFjY291bnRzIG9uLFxuICAgICAgLy8gYW5kIHRoaXMgYmxvY2sgaXMgaXRzIG9ubHkgd3JpdGVyLiBJdCBleGlzdHMgYmVjYXVzZSB0aGUgZmxvdyB0aGF0XG4gICAgICAvLyByZWFkcyBpdCBjYW5ub3QgY29tcHV0ZSBpdDogYHNlcnZpY2UtYXV0b21hdGlvbmAncyB0ZW1wbGF0ZSByZXNvbHZlclxuICAgICAgLy8ga25vd3Mgb25lIGZ1bmN0aW9uIGZvcm0gKGBOT1coKWAgLyBgVE9EQVkoKWApLCBzbyBge0xPV0VSKHgpfWAsXG4gICAgICAvLyBge1RSSU0oeCl9YCBhbmQgYHt4LnRvTG93ZXJDYXNlKCl9YCBhbGwgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBcdTIwMTQgYW5kIGFcbiAgICAgIC8vIGZvcm11bGEgZmllbGQgaGFzIG5vIHBoeXNpY2FsIGNvbHVtbiB0byBmaWx0ZXIgb25cbiAgICAgIC8vIChgZmllbGRIYXNDb2x1bW4oZm9ybXVsYSkgPT09IGZhbHNlYCkuIFRoZSBjYW5vbmljYWwgZm9ybSB0aGVyZWZvcmUgaGFzXG4gICAgICAvLyB0byBiZSBlc3RhYmxpc2hlZCBIRVJFLCBieSB0aGUgcHJvZHVjZXIsIGV4YWN0bHkgYXMgYGNybV9sZWFkLmVtYWlsYFxuICAgICAgLy8gYW5kIGBjcm1fY29udGFjdC5lbWFpbGAgYXJlLlxuICAgICAgLy9cbiAgICAgIC8vIGxvd2VyICsgdHJpbSArIGNvbGxhcHNlIGludGVybmFsIHdoaXRlc3BhY2UsIHNvIFwiQWNtZSBDb3JwXCIsXG4gICAgICAvLyBcIkFDTUUgIENvcnBcIiBhbmQgXCIgYWNtZSBjb3JwIFwiIGFsbCBsYW5kIG9uIGBhY21lIGNvcnBgLiBUaGF0IGlzIHRoZVxuICAgICAgLy8gd2hvbGUgdHJhbnNmb3JtOiBub3JtYWxpemUtdGhlbi1FWEFDVC4gRnV6enkgbWF0Y2hpbmcgaXMgb3V0IG9mIHNjb3BlXG4gICAgICAvLyAoc2VlIHRoZSBmaWVsZCdzIGRvYyBjb21tZW50IG9uIGBjcm1fYWNjb3VudGApLlxuICAgICAgLy9cbiAgICAgIC8vIFJlY29tcHV0ZSBPTkxZIHdoZW4gdGhlIHdyaXRlIGNhcnJpZXMgdGhlIG5hbWUgXHUyMDE0IGEgcGFydGlhbCB1cGRhdGUgdGhhdFxuICAgICAgLy8gbmV2ZXIgbWVudGlvbnMgYG5hbWVgIG11c3QgbGVhdmUgdGhlIGtleSBhbG9uZSwgb3IgZXZlcnkgdW5yZWxhdGVkIGVkaXRcbiAgICAgIC8vIHdvdWxkIGJsYW5rIGl0IGFuZCBtYWtlIHRoZSBhY2NvdW50IGludmlzaWJsZSB0byBjb252ZXJzaW9uLiBgbmFtZWAgaXNcbiAgICAgIC8vIHJlcXVpcmVkICsgbm90TnVsbCwgc28gb24gaW5zZXJ0IGl0IGlzIGFsd2F5cyBwcmVzZW50OyB0aGUgbnVsbCBicmFuY2hcbiAgICAgIC8vIGlzIGZvciBhIHdoaXRlc3BhY2Utb25seSB2YWx1ZSB0aGUgdmFsaWRhdG9yIHdvdWxkIHJlamVjdCBhbnl3YXkuXG4gICAgICAvL1xuICAgICAgLy8gV3JpdHRlbiBpbmxpbmUsIG5vdCBhcyBhIG1vZHVsZS1zY29wZSBoZWxwZXIsIGZvciB0aGUgc2FtZSByZWFzb24gYXNcbiAgICAgIC8vIHRoZSBibG9jayBhYm92ZTogaG9vayBib2RpZXMgbG93ZXIgdG8gbWV0YWRhdGEtb25seSAobm8gZnJlZVxuICAgICAgLy8gaWRlbnRpZmllcnMpLCB3aGljaCBgdGVzdC9hY3Rpb24tc2FuZGJveC50ZXN0LnRzYCBlbmZvcmNlcy5cbiAgICAgIGlmICgnbmFtZScgaW4gaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcmF3TmFtZSA9IGlucHV0Lm5hbWU7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID1cbiAgICAgICAgICB0eXBlb2YgcmF3TmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gcmF3TmFtZS50cmltKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICcgJylcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIGlucHV0Lm5hbWVfbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWROYW1lID09PSAnJyA/IG51bGwgOiBub3JtYWxpemVkTmFtZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdGFtcCBsYXN0X2FjdGl2aXR5X2RhdGUgd2hlbiBvd25lcnNoaXAgb3IgdHlwZSBjaGFuZ2VzLlxuICAgIC8vIFVTRVIgd3JpdGVzIG9ubHkgKGBjdHgudXNlcj8uaWRgIFx1MjAxNCB0aGlzIHJlcG8ncyBzeXN0ZW0td3JpdGUgc2lnbmFsLCBjZi5cbiAgICAvLyBvcHBvcnR1bml0eS9xdW90ZSBob29rcyk6IHRoZSBwbGF0Zm9ybSdzIHNlZWQtb3duZXJzaGlwIGNsYWltIHJlLW93bnNcbiAgICAvLyBvd25lcmxlc3Mgc2VlZGVkIGFjY291bnRzIGFzIGEgc3lzdGVtIHdyaXRlICh0aGUgcmV0aXJlZCBgZGVtb19ib290c3RyYXBgXG4gICAgLy8gc3dlZXAgZGlkIHRoZSBzYW1lIGV2ZXJ5IDEwIG1pbnV0ZXMpLCBhbmQgc3RhbXBpbmcgdGhvc2UgZmxhdHRlbmVkIGV2ZXJ5XG4gICAgLy8gc2VlZGVkIGFjdGl2aXR5IGRhdGUgdG8gXCJ0b2RheVwiLCBlbXB0eWluZyB0aGUgY2h1cm4gcmVwb3J0IGJ1Y2tldHMuXG4gICAgLy8gRDMgc3RhbmQtZG93biBvbiB0aGUgcHJlZGljYXRlIHBhdGggKGBmb3JlY2FzdC5ob29rLnRzYCk6IGBvd25lckNoYW5nZWRgXG4gICAgLy8gLyBgdHlwZUNoYW5nZWRgIGFyZSBkZWNpZGVkIGFnYWluc3QgVEhJUyByb3cncyBgcHJldmlvdXNgLCBzbyB0aGUgc3RhbXBcbiAgICAvLyB3b3VsZCBzcHJlYWQgdG8gZXZlcnkgbWF0Y2hlZCByb3cuIFRoZSBgYmlsbGluZ19jb3VudHJ5YCAvIGB0ZXJyaXRvcnlgIC9cbiAgICAvLyBgbmFtZV9ub3JtYWxpemVkYCBub3JtYWxpc2F0aW9uIGFib3ZlIHJlYWRzIG9ubHkgdGhlIHBheWxvYWQgYW5kIHN0YXlzLlxuICAgIGlmIChldmVudCA9PT0gJ2JlZm9yZVVwZGF0ZScgJiYgY3R4LnVzZXI/LmlkICYmIGN0eC5kaXNwYXRjaD8ubW9kZSAhPT0gJ3Blci1yb3cnKSB7XG4gICAgICBjb25zdCBwcmV2ID0gY3R4LnByZXZpb3VzID8/IHt9O1xuICAgICAgY29uc3Qgb3duZXJDaGFuZ2VkID0gdHlwZW9mIGlucHV0Lm93bmVyX2lkICE9PSAndW5kZWZpbmVkJyAmJiBpbnB1dC5vd25lcl9pZCAhPT0gcHJldi5vd25lcl9pZDtcbiAgICAgIGNvbnN0IHR5cGVDaGFuZ2VkID0gdHlwZW9mIGlucHV0LnR5cGUgIT09ICd1bmRlZmluZWQnICYmIGlucHV0LnR5cGUgIT09IHByZXYudHlwZTtcbiAgICAgIGlmIChvd25lckNoYW5nZWQgfHwgdHlwZUNoYW5nZWQpIHtcbiAgICAgICAgaW5wdXQubGFzdF9hY3Rpdml0eV9kYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVEZWxldGUnKSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICAgIGlmICghcHJldmlvdXMgfHwgcHJldmlvdXMudHlwZSAhPT0gJ2N1c3RvbWVyJykgcmV0dXJuO1xuICAgICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFhcGkpIHJldHVybjtcbiAgICAgIC8vIEVWRVJZIG9wcG9ydHVuaXR5LCBjbG9zZWQgb25lcyBpbmNsdWRlZCAoIzIwMTkpLiBBIGNsb3NlZCBkZWFsIGlzIHRoZVxuICAgICAgLy8gYWNjb3VudCdzIHNhbGVzIGhpc3RvcnkgXHUyMDE0IHRoZSB3b24gYW5kIGxvc3QgYW1vdW50cyBpdHMgcm9sbHVwcyxcbiAgICAgIC8vIGZvcmVjYXN0cyBhbmQgd2luIHJhdGVzIGFyZSByZWFkIGZyb20gXHUyMDE0IGFuZCB0aGUgYXBwIGtlZXBzIGl0OiB0aGVcbiAgICAgIC8vIGBjcm1fb3Bwb3J0dW5pdHkuY3JtX2FjY291bnRgIGxvb2t1cCBpcyByZXF1aXJlZCBhbmQgZG9lcyBub3QgY2FzY2FkZSxcbiAgICAgIC8vIHNvIHRoZSBlbmdpbmUgcmVmdXNlcyB0aGUgZGVsZXRlIHdoaWxlIEFOWSBkZWFsIG5hbWVzIHRoZSBhY2NvdW50LCBhbmRcbiAgICAgIC8vIGBvcHBvcnR1bml0eV9saWZlY3ljbGVgIGZyZWV6ZXMgYSBjbG9zZWQgZGVhbCBhZ2FpbnN0IGJlaW5nIG1vdmVkIHRvXG4gICAgICAvLyBhbm90aGVyIGFjY291bnQuIFRoaXMgZ3VhcmQgdXNlZCB0byBjb3VudCBvcGVuIGRlYWxzIG9ubHkgYW5kIHRlbGwgdGhlXG4gICAgICAvLyB1c2VyIHRvIFwiQ2xvc2Ugb3IgcmVhc3NpZ24gaXQgZmlyc3RcIjsgY2xvc2luZyBpdCB3YXMgYW5zd2VyZWQgYnkgdGhlXG4gICAgICAvLyBlbmdpbmUncyBvd24gcmVmdXNhbCBhbGwgdGhlIHNhbWUuIFNvIHRoZSBjb3VudCBpcyB0aGUgZW5naW5lJ3MsIGFuZFxuICAgICAgLy8gdGhlIHNlbnRlbmNlIG5hbWVzIHdoYXQgZnJlZXMgdGhlIGFjY291bnQgZm9yIGV2ZXJ5IGRlYWwgaXQgY291bnRzIFx1MjAxNFxuICAgICAgLy8gZGVsZXRpbmcgaXQgKGFuIG9wZW4gZGVhbCBjb3VsZCBhbHNvIGJlIG1vdmVkOyBhIGNsb3NlZCBvbmUgY2Fubm90KSBcdTIwMTRcbiAgICAgIC8vIGFuZCB0aGUgd2F5IHRvIHJldGlyZSBhIGN1c3RvbWVyIHRoYXQga2VlcHMgaXRzIGhpc3Rvcnk6IHRoZSBhY2NvdW50XG4gICAgICAvLyBnb2VzIGluYWN0aXZlLCBhcyBgcHJvZHVjdF9jYXRhbG9nYCByZXRpcmVzIGEgcHJvZHVjdCB3aXRoIGEgaGlzdG9yeS5cbiAgICAgIGNvbnN0IG9wcG9ydHVuaXRpZXMgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fb3Bwb3J0dW5pdHknKS5jb3VudCh7XG4gICAgICAgIHdoZXJlOiB7IGNybV9hY2NvdW50OiBwcmV2aW91cy5pZCB9LFxuICAgICAgfSk7XG4gICAgICBpZiAob3Bwb3J0dW5pdGllcyA+IDApIHtcbiAgICAgICAgLy8gV2hvbGUgc2VudGVuY2UgcGVyIGJyYW5jaCwgbm90IGEgc3RpdGNoZWQtdG9nZXRoZXIgbm91biAoIzcyMSkuIFRoZVxuICAgICAgICAvLyBjb3VudCBzd2l0Y2hlZCB0aGUgTk9VTiBvbmx5IChgb3Bwb3J0dW5pdHt5LGllc31gKSB3aGlsZSB0aGUgdmVyYiBhbmRcbiAgICAgICAgLy8gdGhlIGNsb3NpbmcgcHJvbm91biBzdGF5ZWQgcGx1cmFsLCBzbyB0aGUgc2luZ3VsYXIgY2FzZSByZWFkXG4gICAgICAgIC8vIFwiMSBvcGVuIG9wcG9ydHVuaXR5IHN0aWxsIHJlZmVyZW5jZSBpdC4gQ2xvc2Ugb3IgcmVhc3NpZ24gdGhlbVxuICAgICAgICAvLyBmaXJzdC5cIiBBZ3JlZW1lbnQgcnVucyBhY3Jvc3MgdGhyZWUgd29yZHMgaGVyZSBcdTIwMTQgbm91biwgdmVyYiBhbmRcbiAgICAgICAgLy8gcHJvbm91biBcdTIwMTQgYW5kIHRoZSB0d28gcmVhZGFibGUgc2VudGVuY2VzIGFyZSBjaGVhcGVyIHRvIGtlZXAgY29ycmVjdFxuICAgICAgICAvLyAoYW5kIHRvIGdyZXAgZm9yKSB0aGFuIHRocmVlIGludGVybG9ja2luZyBjb25kaXRpb25hbHMuXG4gICAgICAgIHRocm93IHJlZnVzZShcbiAgICAgICAgICBvcHBvcnR1bml0aWVzID09PSAxXG4gICAgICAgICAgICA/ICdDYW5ub3QgZGVsZXRlIGN1c3RvbWVyIGFjY291bnQ6IDEgb3Bwb3J0dW5pdHksIG9wZW4gb3IgY2xvc2VkLCBzdGlsbCByZWZlcmVuY2VzIGl0LiBEZWxldGUgdGhlIG9wcG9ydHVuaXR5IGZpcnN0LCBvciBtYXJrIHRoZSBhY2NvdW50IGluYWN0aXZlIHRvIHJldGlyZSBpdCBpbnN0ZWFkLidcbiAgICAgICAgICAgIDogYENhbm5vdCBkZWxldGUgY3VzdG9tZXIgYWNjb3VudDogJHtvcHBvcnR1bml0aWVzfSBvcHBvcnR1bml0aWVzLCBvcGVuIG9yIGNsb3NlZCwgc3RpbGwgcmVmZXJlbmNlIGl0LiBEZWxldGUgdGhlIG9wcG9ydHVuaXRpZXMgZmlyc3QsIG9yIG1hcmsgdGhlIGFjY291bnQgaW5hY3RpdmUgdG8gcmV0aXJlIGl0IGluc3RlYWQuYCxcbiAgICAgICAgICAnREVMRVRFX1JFU1RSSUNURUQnLFxuICAgICAgICAgIDQwOSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIGBjcm1fY29udHJhY3RgIGlzIG1hc3Rlci1kZXRhaWwgdW5kZXIgdGhlIGFjY291bnQgKCM1NDkpLCBzbyBhIGRlbGV0ZVxuICAgICAgLy8gd291bGQgY2FzY2FkZSB0aGUgc2lnbmVkIGFncmVlbWVudHMgYXdheS4gQWN0aXZhdGVkID0gbGl2ZSAodGhlIHNhbWVcbiAgICAgIC8vIGRlZmluaXRpb24gYGNvbnRhY3RfaW50ZWdyaXR5YCB1c2VzKTsgZHJhZnRzIGFuZCBlbmRlZCBjb250cmFjdHMgZ28uXG4gICAgICBjb25zdCBhY3RpdmVDb250cmFjdHMgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fY29udHJhY3QnKS5jb3VudCh7XG4gICAgICAgIHdoZXJlOiB7IGNybV9hY2NvdW50OiBwcmV2aW91cy5pZCwgc3RhdHVzOiAnYWN0aXZhdGVkJyB9LFxuICAgICAgfSk7XG4gICAgICBpZiAoYWN0aXZlQ29udHJhY3RzID4gMCkge1xuICAgICAgICB0aHJvdyByZWZ1c2UoXG4gICAgICAgICAgYWN0aXZlQ29udHJhY3RzID09PSAxXG4gICAgICAgICAgICA/ICdDYW5ub3QgZGVsZXRlIGN1c3RvbWVyIGFjY291bnQ6IDEgYWN0aXZhdGVkIGNvbnRyYWN0IHN0aWxsIHJlZmVyZW5jZXMgaXQuIFRlcm1pbmF0ZSBvciByZWFzc2lnbiBpdCBmaXJzdC4nXG4gICAgICAgICAgICA6IGBDYW5ub3QgZGVsZXRlIGN1c3RvbWVyIGFjY291bnQ6ICR7YWN0aXZlQ29udHJhY3RzfSBhY3RpdmF0ZWQgY29udHJhY3RzIHN0aWxsIHJlZmVyZW5jZSBpdC4gVGVybWluYXRlIG9yIHJlYXNzaWduIHRoZW0gZmlyc3QuYCxcbiAgICAgICAgICAnREVMRVRFX1JFU1RSSUNURUQnLFxuICAgICAgICAgIDQwOSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBhY2NvdW50SG9vaztcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvY29udGFjdC5ob29rLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0cy9jb250YWN0Lmhvb2sudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB0eXBlIHsgSG9va0FwaSB9IGZyb20gJy4vX2hvb2stYXBpJztcblxuLyoqXG4gKiBDb250YWN0IGludGVncml0eSBob29rLlxuICpcbiAqIC0gT24gaW5zZXJ0L3VwZGF0ZSwgZGVkdXBlcyBieSBgZW1haWxgIFdJVEhJTiBUSEUgT1JHQU5JWkFUSU9OIFx1MjAxNCBtYXRjaGluZ1xuICogICB0aGUgY29uc3RyYWludCB0aGUgc2NoZW1hIGFjdHVhbGx5IGRlY2xhcmVzLiBgY3JtX2NvbnRhY3QuZW1haWxgIGNhcnJpZXNcbiAqICAgZmllbGQtbGV2ZWwgYHVuaXF1ZTogdHJ1ZWAsIHdoaWNoIG1hdGVyaWFsaXplcyBhcyB0aGUgdGVuYW50IGNvbXBvc2l0ZVxuICogICBgKG9yZ2FuaXphdGlvbl9pZCwgZW1haWwpYCAoZnJhbWV3b3JrIzM2OTYpLCBzbyB0aGUgYWRkcmVzcyBpcyB1bmlxdWVcbiAqICAgYWNyb3NzIGV2ZXJ5IGFjY291bnQgb2Ygb25lIG9yZ2FuaXphdGlvbiBhbmQgdHdvIG9yZ2FuaXphdGlvbnMgbWF5IGVhY2hcbiAqICAga25vdyB0aGUgc2FtZSBwZXJzb24uIFRoZSBsb29rdXAgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhY2NvdW50LXNjb3BlZCAodGhlXG4gKiAgIG9sZCBwZXItYWNjb3VudCBsb29rdXAgbGV0IGEgY3Jvc3MtYWNjb3VudCBkdXBsaWNhdGUgc2FpbCBwYXN0IHRoZVxuICogICBmcmllbmRseSBjaGVjayBhbmQgZXhwbG9kZSBvbiB0aGUgREIgaW5kZXggaW5zdGVhZCwgbWlkLWNvbnZlcnNpb24pIFx1MjAxNCBidXRcbiAqICAgaXQgbXVzdCBub3QgcmVhY2ggQUNST1NTIG9yZ2FuaXphdGlvbnMgZWl0aGVyLlxuICpcbiAqICAgIyMgV2hhdCBhbiB1bnNjb3BlZCBsb29rdXAgY29zdCwgYXMgbWVhc3VyZWRcbiAqXG4gKiAgIGBjdHguYXBpYCByZWFkcyBhcmUgbm90IG9yZ2FuaXphdGlvbi1zY29wZWQgZm9yIGV2ZXJ5IGNhbGxlcjogdGhlIHNlZWRcbiAqICAgbG9hZGVyIHJlcGxheXMgYSBkYXRhc2V0IHBlciBvcmdhbml6YXRpb24gYXMgYSBTWVNURU0gd3JpdGUsIGFuZCBhblxuICogICB1bnNjb3BlZCBgZmluZE9uZSh7IHdoZXJlOiB7IGVtYWlsIH0gfSlgIGZyb20gaW5zaWRlIHRoYXQgcmVwbGF5IG1lZXRzIHRoZVxuICogICBGSVJTVCBvcmdhbml6YXRpb24ncyBjb250YWN0cy4gT24gdGhlIGRlcGxveW1lbnQgc2hhcGUgd2hlcmUgbWFueVxuICogICBvcmdhbml6YXRpb25zIHNoYXJlIG9uZSBkYXRhYmFzZSwgdGhlIHNlY29uZCBvcmdhbml6YXRpb24ncyByZXBsYXkgd2FzXG4gKiAgIHJlZnVzZWQgcm93IGJ5IHJvdyBcdTIwMTQgYEFub3RoZXIgY29udGFjdCAoXHUyMDI2KSB3aXRoIGVtYWlsXG4gKiAgIGpvaG4uc21pdGhAYWNtZS5leGFtcGxlLmNvbSBhbHJlYWR5IGV4aXN0cy5gIFx1MjAxNCBsYW5kaW5nIDAgb2YgOSBjb250YWN0c1xuICogICBhbmQsIGJlY2F1c2UgYGNybV9jb250cmFjdGAgcmVxdWlyZXMgb25lLCAwIG9mIDQgY29udHJhY3RzLCBwbHVzXG4gKiAgIGhhbGYtcG9wdWxhdGVkIHF1b3RlcywgcXVvdGUgbGluZSBpdGVtcywgY2FtcGFpZ24gbWVtYmVycyBhbmQgZXZlbnRcbiAqICAgYXR0ZW5kZWVzLiBOb3RoaW5nIGxlYWtlZDsgdGhlIHRlbmFudCB3YWxsIGhlbGQuIFRoZSBkYXRhIG5ldmVyIGFycml2ZWQuXG4gKlxuICogICBUaGUgb3JnYW5pemF0aW9uIGlzIHRoZXJlZm9yZSByZXNvbHZlZCBiZWZvcmUgdGhlIGxvb2t1cCwgaW4gdGhlIGJsZXNzZWRcbiAqICAgb3JkZXI6IHRoZSBhY3RpbmcgdXNlcidzIGFjdGl2ZSBvcmdhbml6YXRpb24gZmlyc3QgKGB1c2VyLm9yZ2FuaXphdGlvbklkYFxuICogICA9PT0gYHNlc3Npb24ub3JnYW5pemF0aW9uSWRgID09PSB0aGUgYG9yZ2FuaXphdGlvbl9pZGAgY29sdW1uID09PSBSTFMnc1xuICogICBgY3VycmVudF91c2VyLm9yZ2FuaXphdGlvbklkYCksIHRoZW4gdGhlIHJvdydzIG93biBzdGFtcCwgd2hpY2ggaXMgd2hhdCBhXG4gKiAgIHN5c3RlbSB3cml0ZSBjYXJyaWVzIHdoZW4gbm8gc2Vzc2lvbiBkb2VzLiBSZXNvbHZlZDogc2NvcGUgdGhlIGxvb2t1cC5cbiAqICAgVW5yZXNvbHZhYmxlIG9uIGEgc3lzdGVtIHdyaXRlOiBza2lwIHRoZSBmcmllbmRseSBndWFyZCBhbmQgbGV0IHRoZVxuICogICBgKG9yZ2FuaXphdGlvbl9pZCwgZW1haWwpYCBpbmRleCBlbmZvcmNlLiBVbnJlc29sdmFibGUgZm9yIGEgVVNFUiB3cml0ZTpcbiAqICAgYW4gdW50ZW5hbnRlZCAoY29tbXVuaXR5KSBpbnN0YWxsLCB3aGVyZSB0aGUgb2xkIGdsb2JhbCBsb29rdXAgaXMgcmlnaHQuXG4gKiAtIE9uIGRlbGV0ZSwgcmVmdXNlcyBpZiB0aGUgY29udGFjdCBpcyByZWZlcmVuY2VkIGJ5IGFuIGFjdGl2ZSBvcHBvcnR1bml0eSxcbiAqICAgb3BlbiBxdW90ZSBvciBhY3RpdmUgY29udHJhY3QuXG4gKlxuICogXHUyNkQ0IE5vIGVtYWlsL3Bob25lIHByb3BhZ2F0aW9uIHRvIG9wcG9ydHVuaXRpZXM6IGBjcm1fb3Bwb3J0dW5pdHlgIGhhcyBub1xuICogYGNvbnRhY3RfZW1haWxgIC8gYGNvbnRhY3RfcGhvbmVgIGNvbHVtbnMsIGFuZCBhIHJvbGx1cCB3cml0aW5nIG5vbmV4aXN0ZW50XG4gKiBmaWVsZHMgaXMgc2lsZW50bHkgc3dhbGxvd2VkLiBPcHBvcnR1bml0aWVzIHJlYWNoIHRoZSBsaXZlIHZhbHVlcyB0aHJvdWdoXG4gKiB0aGVpciBgcHJpbWFyeV9jb250YWN0YCBsb29rdXAuXG4gKi9cblxuY29uc3QgY29udGFjdEhvb2s6IEhvb2sgPSB7XG4gIG5hbWU6ICdjb250YWN0X2ludGVncml0eScsXG4gIG9iamVjdDogJ2NybV9jb250YWN0JyxcbiAgZXZlbnRzOiBbJ2JlZm9yZUluc2VydCcsICdiZWZvcmVVcGRhdGUnLCAnYmVmb3JlRGVsZXRlJ10sXG4gIHByaW9yaXR5OiAyMDAsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdEZWR1cGUgY29udGFjdHMgYnkgZW1haWwgYW5kIHByb3RlY3QgcmVmZXJlbmNlZCBjb250YWN0cyBmcm9tIGRlbGV0aW9uLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgLy8gVGhlIHJlZnVzYWwgZW52ZWxvcGUgKCMxMDc1KS4gTWlycm9yZWQgZnJvbSBgLi9fcmVmdXNhbC50c2AgYmVjYXVzZSBhXG4gICAgLy8gbG93ZXJlZCBib2R5IGhhcyBubyBtb2R1bGUgc2NvcGUgYW5kIGBleHRyYWN0SG9va0JvZHlgIFRIUk9XUyBvbiBhblxuICAgIC8vIGltcG9ydDsgYHRlc3QvcmVmdXNhbC1lbnZlbG9wZS50ZXN0LnRzYCBwaW5zIGV2ZXJ5IGNvcHkgYWdhaW5zdCBpdC5cbiAgICBmdW5jdGlvbiByZWZ1c2UoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb2RlOiBzdHJpbmcsXG4gICAgICBzdGF0dXM6IG51bWJlcixcbiAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmcgPSBtZXNzYWdlLFxuICAgICk6IEVycm9yIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29kZTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZztcbiAgICAgIH07XG4gICAgICBlcnIuY29kZSA9IGNvZGU7XG4gICAgICBlcnIuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgZXJyLnVzZXJNZXNzYWdlID0gdXNlck1lc3NhZ2U7XG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjb25zdCB7IGV2ZW50LCBpbnB1dCB9ID0gY3R4O1xuICAgIGNvbnN0IGFwaSA9IGN0eC5hcGkgYXMgSG9va0FwaSB8IHVuZGVmaW5lZDtcblxuICAgIGlmICgoZXZlbnQgPT09ICdiZWZvcmVJbnNlcnQnIHx8IGV2ZW50ID09PSAnYmVmb3JlVXBkYXRlJykgJiYgYXBpKSB7XG4gICAgICBjb25zdCBlbWFpbCA9IHR5cGVvZiBpbnB1dC5lbWFpbCA9PT0gJ3N0cmluZycgPyBpbnB1dC5lbWFpbC50b0xvd2VyQ2FzZSgpIDogJyc7XG4gICAgICBpZiAoZW1haWwpIHtcbiAgICAgICAgaW5wdXQuZW1haWwgPSBlbWFpbDtcbiAgICAgICAgLy8gU2NvcGUgdGhlIGd1YXJkIHRvIHRoZSBvcmdhbml6YXRpb24gdGhlIHdyaXRlIGJlbG9uZ3MgdG8sIHNvIGl0IGlzXG4gICAgICAgIC8vIGV4YWN0bHkgYXMgc3RyaWN0IGFzIHRoZSBgKG9yZ2FuaXphdGlvbl9pZCwgZW1haWwpYCBpbmRleCBpdCBmaXJlc1xuICAgICAgICAvLyBhaGVhZCBvZiBcdTIwMTQgbm8gc3RyaWN0ZXIuIEFuIHVucmVzb2x2YWJsZSBvcmdhbml6YXRpb24gb24gYSBTWVNURU1cbiAgICAgICAgLy8gd3JpdGUgKG5vIGBjdHgudXNlcmApIG1lYW5zIHRoZSBjYWxsZXIgaXMgdGhlIHNlZWQgbG9hZGVyIG9yIGFcbiAgICAgICAgLy8gYmFja2ZpbGw6IHNraXAgdGhlIGZyaWVuZGx5IGd1YXJkIHJhdGhlciB0aGFuIHJ1biBpdCB1bnNjb3BlZCwgYW5kXG4gICAgICAgIC8vIGxldCB0aGUgZGF0YWJhc2UgY29uc3RyYWludCBiZSB0aGUgZW5mb3JjZW1lbnQuIFJ1bm5pbmcgaXQgdW5zY29wZWRcbiAgICAgICAgLy8gdGhlcmUgaXMgd2hhdCBzdGFydmVkIGV2ZXJ5IG9yZ2FuaXphdGlvbiBhZnRlciB0aGUgZmlyc3Qgb2YgaXRzXG4gICAgICAgIC8vIGNvbnRhY3RzLlxuICAgICAgICBjb25zdCBvcmdhbml6YXRpb25JZCA9IFtcbiAgICAgICAgICBjdHgudXNlcj8ub3JnYW5pemF0aW9uSWQsXG4gICAgICAgICAgY3R4LnNlc3Npb24/Lm9yZ2FuaXphdGlvbklkLFxuICAgICAgICAgIGlucHV0Lm9yZ2FuaXphdGlvbl9pZCxcbiAgICAgICAgICBjdHgucHJldmlvdXM/Lm9yZ2FuaXphdGlvbl9pZCxcbiAgICAgICAgXS5maW5kKChjYW5kaWRhdGUpOiBjYW5kaWRhdGUgaXMgc3RyaW5nID0+IHR5cGVvZiBjYW5kaWRhdGUgPT09ICdzdHJpbmcnICYmIGNhbmRpZGF0ZSAhPT0gJycpO1xuICAgICAgICBpZiAob3JnYW5pemF0aW9uSWQgfHwgY3R4LnVzZXI/LmlkKSB7XG4gICAgICAgICAgY29uc3QgZHVwID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2NvbnRhY3QnKS5maW5kT25lKHtcbiAgICAgICAgICAgIHdoZXJlOiBvcmdhbml6YXRpb25JZCA/IHsgb3JnYW5pemF0aW9uX2lkOiBvcmdhbml6YXRpb25JZCwgZW1haWwgfSA6IHsgZW1haWwgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBkdXBSb3cgPSBkdXAgYXNcbiAgICAgICAgICAgIHwgeyBpZD86IHN0cmluZzsgZmlyc3RfbmFtZT86IHVua25vd247IGxhc3RfbmFtZT86IHVua25vd24gfVxuICAgICAgICAgICAgfCBudWxsO1xuICAgICAgICAgIGNvbnN0IGR1cElkID0gZHVwUm93Py5pZDtcbiAgICAgICAgICBjb25zdCBzZWxmSWQgPSBjdHgucHJldmlvdXM/LmlkID8/IGlucHV0LmlkO1xuICAgICAgICAgIGlmIChkdXAgJiYgZHVwSWQgIT09IHNlbGZJZCkge1xuICAgICAgICAgICAgLy8gTmFtZSB0aGUgY29sbGlkaW5nIGNvbnRhY3QsIG5vdCBpdHMgcHJpbWFyeSBrZXkgKCMxMjQzLCB0aGUgc2FtZVxuICAgICAgICAgICAgLy8gY2xhc3MgIzEyMDggY2xvc2VkIG9uIHRoZSBlc2NhbGF0aW9uIHRhc2spLiBUaGlzIHJlZnVzYWwgaXMgcmVhZFxuICAgICAgICAgICAgLy8gYnkgYSByZXAgaW4gYSBkaWFsb2cgYXQgdGhlIG1vbWVudCB0aGVpciBzYXZlIGlzIGJsb2NrZWQsIGFuZCB0aGVcbiAgICAgICAgICAgIC8vIG9uZSBhY3Rpb25hYmxlIHRoaW5nIGl0IGNhbiBzYXkgaXMgV0hPU0UgcmVjb3JkIGFscmVhZHkgaG9sZHMgdGhlXG4gICAgICAgICAgICAvLyBhZGRyZXNzLiBUaGUgaWQgd2FzIHRoZSBvcHBvc2l0ZSBvZiB0aGF0OiBhIDE2LWNoYXJhY3RlciBzdHJpbmdcbiAgICAgICAgICAgIC8vIHRoYXQgYXBwZWFycyBvbiBubyBzY3JlZW4gaW4gdGhpcyBhcHAgYW5kIGNhbm5vdCBiZSBwYXN0ZWQgaW50b1xuICAgICAgICAgICAgLy8gc2VhcmNoLiBgZnVsbF9uYW1lYCBpcyBgY3JtX2NvbnRhY3QubmFtZUZpZWxkYCwgYW5kIGl0IGlzIGNvbXBvc2VkXG4gICAgICAgICAgICAvLyBmcm9tIHRoZSBzYW1lIHR3byBzdG9yZWQgY29sdW1ucyBoZXJlIFx1MjAxNCBhIGxvd2VyZWQgaG9vayBib2R5IGNhbm5vdFxuICAgICAgICAgICAgLy8gcmVhZCBhIGZvcm11bGEgZmllbGQuIE5vIHNlY29uZCByZWFkIHBheXMgZm9yIGl0OiB0aGUgYGZpbmRPbmVgXG4gICAgICAgICAgICAvLyBhYm92ZSBjYXJyaWVzIG5vIHByb2plY3Rpb24sIHNvIHRoZSB3aG9sZSByb3cgaXMgYWxyZWFkeSBpbiBoYW5kLlxuICAgICAgICAgICAgY29uc3QgZHVwTmFtZSA9IFtkdXBSb3c/LmZpcnN0X25hbWUsIGR1cFJvdz8ubGFzdF9uYW1lXVxuICAgICAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiB0eXBlb2YgcGFydCA9PT0gJ3N0cmluZycgJiYgcGFydC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAuam9pbignICcpO1xuICAgICAgICAgICAgdGhyb3cgcmVmdXNlKFxuICAgICAgICAgICAgICBkdXBOYW1lXG4gICAgICAgICAgICAgICAgPyBgQW5vdGhlciBjb250YWN0ICgke2R1cE5hbWV9KSB3aXRoIGVtYWlsICR7ZW1haWx9IGFscmVhZHkgZXhpc3RzLmBcbiAgICAgICAgICAgICAgICA6IGBBbm90aGVyIGNvbnRhY3Qgd2l0aCBlbWFpbCAke2VtYWlsfSBhbHJlYWR5IGV4aXN0cy5gLFxuICAgICAgICAgICAgICAnRFVQTElDQVRFX1ZBTFVFJyxcbiAgICAgICAgICAgICAgNDA5LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVEZWxldGUnICYmIGFwaSkge1xuICAgICAgY29uc3QgaWQgPSBjdHgucHJldmlvdXM/LmlkO1xuICAgICAgaWYgKCFpZCkgcmV0dXJuO1xuICAgICAgY29uc3QgW29wZW5PcHBzLCBvcGVuUXVvdGVzLCBhY3RpdmVDb250cmFjdHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBhcGkub2JqZWN0KCdjcm1fb3Bwb3J0dW5pdHknKS5jb3VudCh7XG4gICAgICAgICAgd2hlcmU6IHsgcHJpbWFyeV9jb250YWN0OiBpZCwgc3RhZ2U6IHsgJG5pbjogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfSB9LFxuICAgICAgICB9KSxcbiAgICAgICAgYXBpLm9iamVjdCgnY3JtX3F1b3RlJykuY291bnQoe1xuICAgICAgICAgIHdoZXJlOiB7IGNybV9jb250YWN0OiBpZCwgc3RhdHVzOiB7ICRuaW46IFsncmVqZWN0ZWQnLCAnZXhwaXJlZCddIH0gfSxcbiAgICAgICAgfSksXG4gICAgICAgIGFwaS5vYmplY3QoJ2NybV9jb250cmFjdCcpLmNvdW50KHtcbiAgICAgICAgICB3aGVyZTogeyBjcm1fY29udGFjdDogaWQsIHN0YXR1czogJ2FjdGl2YXRlZCcgfSxcbiAgICAgICAgfSksXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IHRvdGFsID0gb3Blbk9wcHMgKyBvcGVuUXVvdGVzICsgYWN0aXZlQ29udHJhY3RzO1xuICAgICAgaWYgKHRvdGFsID4gMCkge1xuICAgICAgICAvLyBQaHJhc2UgdGhlIHJlZnVzYWwgYXMgdGhlIEJMT0NLSU5HIFJFTEFUSU9OU0hJUCwgbm90IGFzIHRoZSBjYWxsZXInc1xuICAgICAgICAvLyBvcGVyYXRpb24gKCM2OTMpLiBUaGlzIGhvb2sgZmlyZXMgb24gYSBkaXJlY3RcbiAgICAgICAgLy8gYERFTEVURSAvY3JtX2NvbnRhY3QvPGlkPmAgQU5EIGFzIGEgY2FzY2FkZSBjaGlsZCBvZlxuICAgICAgICAvLyBgREVMRVRFIC9jcm1fYWNjb3VudC88aWQ+YCAoYGNybV9jb250YWN0LmNybV9hY2NvdW50YCBpcyBhXG4gICAgICAgIC8vIG1hc3Rlci1kZXRhaWwgd2l0aCBgZGVsZXRlQmVoYXZpb3I6ICdjYXNjYWRlJ2ApLCBhbmQgdGhlIGhvb2sgY29udGV4dFxuICAgICAgICAvLyBjYXJyaWVzIG5vdGhpbmcgdGhhdCBkaXN0aW5ndWlzaGVzIHRoZSB0d28gXHUyMDE0IG1lYXN1cmVkIG9uIDE3LjAuMC1yYy4yLFxuICAgICAgICAvLyBhIGNhc2NhZGVkIGBiZWZvcmVEZWxldGVgIGN0eCBob2xkcyBleGFjdGx5XG4gICAgICAgIC8vIHthcGksZXZlbnQsaW5wdXQsb2JqZWN0LHByZXZpb3VzLHByb3ZlbmFuY2UscWwsc2Vzc2lvbix0cmFuc2FjdGlvbix1c2VyfVxuICAgICAgICAvLyB3aXRoIG5vIGNhc2NhZGUgbWFya2VyLiBTbyBcIkNhbm5vdCBkZWxldGUgY29udGFjdFwiIHRvbGQgYW4gYWNjb3VudFxuICAgICAgICAvLyBkZWxldGVyIHRoYXQgdGhleSBoYWQgYXNrZWQgdG8gZGVsZXRlIGEgY29udGFjdCwgYW5kIHNlbnQgdGhlbVxuICAgICAgICAvLyBsb29raW5nIGZvciB0aGUgd3JvbmcgcmVjb3JkLiBOYW1pbmcgdGhlIGNvbnRhY3QgYW5kIGJvdGhcbiAgICAgICAgLy8gY29uc2VxdWVuY2VzIGlzIHRydWUgaW4gZWl0aGVyIGNvbnRleHQuXG4gICAgICAgIGNvbnN0IG5hbWUgPSBbY3R4LnByZXZpb3VzPy5maXJzdF9uYW1lLCBjdHgucHJldmlvdXM/Lmxhc3RfbmFtZV1cbiAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiB0eXBlb2YgcGFydCA9PT0gJ3N0cmluZycgJiYgcGFydC50cmltKCkgIT09ICcnKVxuICAgICAgICAgIC5qb2luKCcgJyk7XG4gICAgICAgIC8vIE5hbWVkLCBuZXZlciBrZXllZCAoIzEyNDMpLiBgaWRgIHN0aWxsIGRvZXMgdGhlIHdvcmsgaXQgaXMgZ29vZCBhdCBcdTIwMTRcbiAgICAgICAgLy8gaXQgaXMgd2hhdCB0aGUgdGhyZWUgY291bnRzIGFib3ZlIHdlcmUgcXVlcmllZCBieSBcdTIwMTQgYnV0IHRoZSBzZW50ZW5jZVxuICAgICAgICAvLyB0aGUgdXNlciByZWFkcyBuYW1lcyB0aGUgY29udGFjdCB0aGUgd2F5IGBuYW1lRmllbGRgIGRvZXMuIEEgY29udGFjdFxuICAgICAgICAvLyB3aXRoIG5vIG5hbWUgYXQgYWxsIGlzIHJlZmVycmVkIHRvLCBub3QgaWRlbnRpZmllZDogYSBiYXJlIGlkIHRvbGRcbiAgICAgICAgLy8gdGhlIHJlYWRlciBub3RoaW5nIHRoZXkgY291bGQgbG9vayB1cCBlaXRoZXIuXG4gICAgICAgIGNvbnN0IHN1YmplY3QgPSBuYW1lID8gYENvbnRhY3QgJHtuYW1lfWAgOiAnVGhpcyBjb250YWN0JztcbiAgICAgICAgLy8gV2hhdCBmcmVlcyB0aGUgY29udGFjdCBpcyBub3QgdGhlIHNhbWUgZm9yIHRoZSB0aHJlZSAoIzIwMTkpLiBBblxuICAgICAgICAvLyBvcHBvcnR1bml0eSdzIGBwcmltYXJ5X2NvbnRhY3RgIGFuZCBhIHF1b3RlJ3MgYGNybV9jb250YWN0YCBhcmVcbiAgICAgICAgLy8gb3B0aW9uYWwsIHNvIG9uY2UgdGhlIGRlYWwgb3IgcXVvdGUgaXMgc2V0dGxlZCB0aGUgZW5naW5lIGNsZWFycyB0aGVcbiAgICAgICAgLy8gbGluayBhbmQgdGhlIGRlbGV0ZSBsYW5kcy4gQSBjb250cmFjdCdzIGBjcm1fY29udGFjdGAgaXMgUkVRVUlSRUQ6IGFcbiAgICAgICAgLy8gY29udHJhY3Qga2VlcHMgaXRzIHByaW1hcnkgY29udGFjdCBmb3IgaXRzIHdob2xlIGxpZmUsIGVuZGVkIG9yIG5vdFxuICAgICAgICAvLyBcdTIwMTQgaXQgaXMgdGhlIGFjY291bnQncyBzaWduZWQgcmVjb3JkIGFuZCBpcyBrZXB0LCBzbyB0aGUgZW5naW5lXG4gICAgICAgIC8vIHJlZnVzZXMgdGhlIGRlbGV0ZSB3aGlsZSBBTlkgY29udHJhY3QgbmFtZXMgdGhlIGNvbnRhY3QuIFRoZSBvbGRcbiAgICAgICAgLy8gY2xvc2luZyBcIkNsb3NlIG9yIHJlYXNzaWduIHRob3NlIHJlY29yZHMgZmlyc3RcIiBzZW50IHRoZSB1c2VyIHRvXG4gICAgICAgIC8vIHRlcm1pbmF0ZSB0aGUgY29udHJhY3QsIGFmdGVyIHdoaWNoIHRoZSBlbmdpbmUgcmVmdXNlZCBhbGwgdGhlIHNhbWUuXG4gICAgICAgIC8vIFNvIHRoZSBzZW50ZW5jZSBzYXlzIHdoYXQgZnJlZXMgdGhlIGNvbnRhY3QgZnJvbSBhIGNvbnRyYWN0OiBhbm90aGVyXG4gICAgICAgIC8vIHByaW1hcnkgY29udGFjdCBvbiBpdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gXHUyNkQ0IFRoZSBDT1VOVCBzdGF5cyBgYWN0aXZhdGVkYCwgYW5kIHRoYXQgaXMgZGVsaWJlcmF0ZS4gVGhpcyBndWFyZCBhbHNvXG4gICAgICAgIC8vIHJ1bnMgaW5zaWRlIGFuIGFjY291bnQgZGVsZXRlICh0aGUgY2FzY2FkZSBhYm92ZSkgYW5kIGNhbm5vdCB0ZWxsIHRoZVxuICAgICAgICAvLyB0d28gYXBhcnQsIGFuZCBhbiBhY2NvdW50IGRlbGV0ZSB0YWtlcyBpdHMgZHJhZnQgYW5kIGVuZGVkIGNvbnRyYWN0c1xuICAgICAgICAvLyB3aXRoIGl0ICgjNTQ5LCBgYWNjb3VudF9wcm90ZWN0aW9uYCkuIENvdW50aW5nIHRob3NlIGhlcmUgd291bGQgbWFrZVxuICAgICAgICAvLyB0aGlzIGd1YXJkIHJlZnVzZSB0aGF0IGFjY291bnQgZGVsZXRlIGl0c2VsZiBcdTIwMTQgdG9kYXkgdGhlIGVuZ2luZVxuICAgICAgICAvLyBhbHJlYWR5IHJlZnVzZXMgaXQgb24gdGhlIGNhc2NhZGUncyBvcmRlciAob2JqZWN0c3RhY2sjMjIzMDUsIHBpbm5lZFxuICAgICAgICAvLyBpbiBgdGVzdC9ob29rcy1ydW50aW1lLXNhbGVzLnRlc3QudHNgKSwgYW5kIHRoYXQgaXMgdGhlIHBsYXRmb3JtJ3MgdG9cbiAgICAgICAgLy8gZml4LiBBbiBlbmRlZCBjb250cmFjdCBvbiBhIERJUkVDVCBjb250YWN0IGRlbGV0ZSBpcyByZWZ1c2VkIGJ5IHRoZVxuICAgICAgICAvLyBlbmdpbmUsIGluIGl0cyBvd24gd29yZHMgbmFtaW5nIHRoZSBjb250cmFjdC5cbiAgICAgICAgdGhyb3cgcmVmdXNlKFxuICAgICAgICAgIGAke3N1YmplY3R9IGlzIHN0aWxsIHJlZmVyZW5jZWQgYnkgJHtvcGVuT3Bwc30gb3BlbiBvcHBvcnR1bml0eShpZXMpLCAke29wZW5RdW90ZXN9IGFjdGl2ZSBxdW90ZShzKSwgJHthY3RpdmVDb250cmFjdHN9IGFjdGl2ZSBjb250cmFjdChzKSwgc28gaXQgY2Fubm90IGJlIGRlbGV0ZWQgXHUyMDE0IGFuZCBuZWl0aGVyIGNhbiBpdHMgYWNjb3VudCwgYmVjYXVzZSBkZWxldGluZyBhbiBhY2NvdW50IGRlbGV0ZXMgaXRzIGNvbnRhY3RzLiBDbG9zZSBvciByZWFzc2lnbiB0aGUgb3Bwb3J0dW5pdGllcyBhbmQgcXVvdGVzIGZpcnN0LCBhbmQgZ2l2ZSBlYWNoIGNvbnRyYWN0IGFub3RoZXIgcHJpbWFyeSBjb250YWN0OiBhIGNvbnRyYWN0IGtlZXBzIGl0cyBwcmltYXJ5IGNvbnRhY3QgZXZlbiBhZnRlciBpdCBlbmRzLmAsXG4gICAgICAgICAgJ0RFTEVURV9SRVNUUklDVEVEJyxcbiAgICAgICAgICA0MDksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29udGFjdEhvb2s7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2V2ZW50Lmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2V2ZW50Lmhvb2sudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB0eXBlIHsgSG9va0FwaSB9IGZyb20gJy4vX2hvb2stYXBpJztcblxuLyoqXG4gKiBFdmVudCBsaWZlY3ljbGUgaG9va3MgKCM1OTIpLlxuICpcbiAqIC0gYGV2ZW50X3NjaGVkdWxlX2Rlcml2ZWAga2VlcHMgYHN0YXJ0X2RhdGV0aW1lYCAvIGBlbmRfZGF0ZXRpbWVgIC9cbiAqICAgYGR1cmF0aW9uX21pbnV0ZXNgIG11dHVhbGx5IGNvbnNpc3RlbnQsIHNvIGEgY2FsZW5kYXIgdmlldyBhbmQgYSBkdXJhdGlvblxuICogICByZXBvcnQgY2Fubm90IGRpc2FncmVlIGFib3V0IHRoZSBzYW1lIHJvdy5cbiAqIC0gYGV2ZW50X2FjdGl2aXR5X2J1YmJsZWAgaXMgdGhlIGFwcCdzIFBSSU1BUlkgd3JpdGVyIG9mIGludGVyYWN0aW9uXG4gKiAgIHJlY2VuY3k6IGEgYGhlbGRgIGV2ZW50IHN0YW1wcyBgY3JtX2FjY291bnQubGFzdF9hY3Rpdml0eV9kYXRlYCxcbiAqICAgYGNybV9sZWFkLmxhc3RfY29udGFjdGVkX2RhdGVgIGFuZCBgY3JtX2NvbnRhY3QubGFzdF9jb250YWN0ZWRfZGF0ZWAsXG4gKiAgIHdhbGtpbmcgVVAgZnJvbSBhbiBvcHBvcnR1bml0eSAvIGNhc2UgLyBjb250YWN0IHRvIHRoZSBhY2NvdW50IGl0IGhhbmdzXG4gKiAgIG9mZi4gU2luY2UgIzU5NSBpdCBpcyBhbHNvIHRoZSBTSU5HTEUgd3JpdGVyIG9mXG4gKiAgIGBjcm1fY2FzZS5maXJzdF9yZXNwb25zZV9kYXRlYCAoc2VlIHRoZSBibG9jayBhdCB0aGUgZW5kIG9mIHRoZSBoYW5kbGVyKS5cbiAqXG4gKiAjIFdoeSB0aGUgd2Fsay11cCBtYXR0ZXJzXG4gKlxuICogYGF0X3Jpc2tfYWNjb3VudHNgIGFuZCBgY3VzdG9tZXJfY2h1cm5fc2lnbmFsc2AgYXJlIGJ1aWx0IG9uXG4gKiBgY3JtX2FjY291bnQubGFzdF9hY3Rpdml0eV9kYXRlYCwgYnV0IGEgcmVwIGxvZ3MgYSBjYWxsIG9uIHRoZSBPUFBPUlRVTklUWSBvclxuICogdGhlIENPTlRBQ1QgXHUyMDE0IGFsbW9zdCBuZXZlciBvbiB0aGUgYWNjb3VudCByb3cgaXRzZWxmLiBcdTI2RDQgQnViYmxpbmcgb25seSB0byB0aGVcbiAqIGRpcmVjdGx5LW5hbWVkIHJlY29yZCBsZWF2ZXMgdGhlIGFjY291bnQgY2xvY2sgdW50b3VjaGVkIHRocm91Z2ggYW4gZW50aXJlXG4gKiBzYWxlcyBjeWNsZSwgYW5kIHRoZSBjaHVybiByZXBvcnQgdGhlbiBjb3VudHMgYSBidXN5IGN1c3RvbWVyIGFzIHNpbGVudC4gVGhlXG4gKiB3YWxrLXVwIGlzIHRoZSB3aG9sZSByZWFzb24gdGhlIHNpZ25hbCBiZWNvbWVzIHJlYWwuXG4gKi9cblxuY29uc3QgZXZlbnRTY2hlZHVsZURlcml2ZTogSG9vayA9IHtcbiAgbmFtZTogJ2V2ZW50X3NjaGVkdWxlX2Rlcml2ZScsXG4gIG9iamVjdDogJ2NybV9ldmVudCcsXG4gIGV2ZW50czogWydiZWZvcmVJbnNlcnQnLCAnYmVmb3JlVXBkYXRlJ10sXG4gIHByaW9yaXR5OiAyMDAsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdLZWVwIHN0YXJ0L2VuZC9kdXJhdGlvbiBjb2hlcmVudDogZGVyaXZlIHdoaWNoZXZlciBvZiBlbmRfZGF0ZXRpbWUgb3IgZHVyYXRpb25fbWludXRlcyB3YXMgbm90IHN1cHBsaWVkLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgLy8gRDMgc3RhbmQtZG93bjogYSBwcmVkaWNhdGUgdXBkYXRlIGhhcyBPTkUgcGF5bG9hZCBmb3IgZXZlcnkgbWF0Y2hlZCByb3csXG4gICAgLy8gc28gdGhlIGBjdHgucHJldmlvdXNgLWNvbmRpdGlvbmVkIHdyaXRlcyBiZWxvdyB3b3VsZCBsYW5kIG9uIHJvd3MgdGhhdFxuICAgIC8vIGRpZCBub3QgZWFybiB0aGVtIFx1MjAxNCByZWZ1c2VkIGFzIGEgZGl2ZXJnaW5nIGtleSBzZXQsIG9yIHN0b3JlZCBzaWxlbnRseVxuICAgIC8vIGZyb20gdGhlIGxhc3Qgcm93LiBGdWxsIGFjY291bnQgYW5kIHRoZSBtZWFzdXJlbWVudDogYGZvcmVjYXN0Lmhvb2sudHNgLlxuICAgIGlmIChjdHguZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIGN0eC5kaXNwYXRjaD8ubW9kZSA9PT0gJ3Blci1yb3cnKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG5cbiAgICBjb25zdCBlZmZlY3RpdmUgPSAoa2V5OiBzdHJpbmcpOiB1bmtub3duID0+XG4gICAgICBpbnB1dFtrZXldICE9PSB1bmRlZmluZWQgJiYgaW5wdXRba2V5XSAhPT0gbnVsbCA/IGlucHV0W2tleV0gOiBwcmV2aW91cz8uW2tleV07XG5cbiAgICBjb25zdCBzdGFydCA9IGVmZmVjdGl2ZSgnc3RhcnRfZGF0ZXRpbWUnKTtcbiAgICBjb25zdCBlbmQgPSBlZmZlY3RpdmUoJ2VuZF9kYXRldGltZScpO1xuICAgIGNvbnN0IGR1cmF0aW9uUmF3ID0gZWZmZWN0aXZlKCdkdXJhdGlvbl9taW51dGVzJyk7XG5cbiAgICBjb25zdCBzdGFydE1zID0gdHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJyB8fCBzdGFydCBpbnN0YW5jZW9mIERhdGUgPyBuZXcgRGF0ZShzdGFydCBhcyBzdHJpbmcpLmdldFRpbWUoKSA6IE5hTjtcbiAgICBjb25zdCBlbmRNcyA9IHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnIHx8IGVuZCBpbnN0YW5jZW9mIERhdGUgPyBuZXcgRGF0ZShlbmQgYXMgc3RyaW5nKS5nZXRUaW1lKCkgOiBOYU47XG4gICAgY29uc3QgZHVyYXRpb24gPSB0eXBlb2YgZHVyYXRpb25SYXcgPT09ICdudW1iZXInICYmIGlzRmluaXRlKGR1cmF0aW9uUmF3KSA/IGR1cmF0aW9uUmF3IDogTmFOO1xuXG4gICAgLy8gQW4gYWxsLWRheSBldmVudCBoYXMgbm8gbWVhbmluZ2Z1bCBtaW51dGUgY291bnQ7IGxlYXZlIGR1cmF0aW9uIGFsb25lIHNvXG4gICAgLy8gYSByZXBvcnQgY2FuIHRlbGwgXCJhbGwgZGF5XCIgYXBhcnQgZnJvbSBcIndlIGZvcmdvdCB0byBmaWxsIGl0IGluXCIuXG4gICAgY29uc3QgYWxsRGF5ID0gZWZmZWN0aXZlKCdhbGxfZGF5JykgPT09IHRydWU7XG5cbiAgICBpZiAoIWlzTmFOKHN0YXJ0TXMpICYmICFpc05hTihlbmRNcykpIHtcbiAgICAgIC8vIEJvdGggZW5kcyBrbm93biBcdTIwMTQgdGhlIGR1cmF0aW9uIGlzIGEgTUVBU1VSRU1FTlQsIHNvIGl0IGlzIHJlY29tcHV0ZWRcbiAgICAgIC8vIGV2ZW4gd2hlbiB0aGUgY2FsbGVyIHN1cHBsaWVkIG9uZS4gQSBzdG9yZWQgZHVyYXRpb24gdGhhdCBkaXNhZ3JlZXNcbiAgICAgIC8vIHdpdGggaXRzIG93biB0aW1lc3RhbXBzIGlzIHRoZSBraW5kIG9mIG1ldGFkYXRhIGEgcmVwb3J0IHF1aWV0bHlcbiAgICAgIC8vIGF2ZXJhZ2VzIGludG8gbm9uc2Vuc2UuXG4gICAgICBpZiAoIWFsbERheSkgaW5wdXQuZHVyYXRpb25fbWludXRlcyA9IE1hdGgubWF4KDAsIE1hdGgucm91bmQoKGVuZE1zIC0gc3RhcnRNcykgLyA2MDAwMCkpO1xuICAgIH0gZWxzZSBpZiAoIWlzTmFOKHN0YXJ0TXMpICYmIGlzTmFOKGVuZE1zKSAmJiAhaXNOYU4oZHVyYXRpb24pICYmIGR1cmF0aW9uID4gMCkge1xuICAgICAgLy8gRHVyYXRpb24tb25seSwgdGhlIHNoYXBlIGBsb2dfY2FsbGAgc3VibWl0cyAoXCJhIDIwLW1pbnV0ZSBjYWxsLCBub3dcIikuXG4gICAgICAvLyBNYXRlcmlhbGlzaW5nIHRoZSBlbmQgdGltZXN0YW1wIGlzIHdoYXQgcHV0cyB0aGUgcm93IG9uIGEgY2FsZW5kYXIuXG4gICAgICBpbnB1dC5lbmRfZGF0ZXRpbWUgPSBuZXcgRGF0ZShzdGFydE1zICsgZHVyYXRpb24gKiA2MDAwMCkudG9JU09TdHJpbmcoKTtcbiAgICB9XG5cbiAgICAvLyBBIGNhbmNlbGxlZCBvciBuby1zaG93IG1lZXRpbmcgb2NjdXBpZXMgbm8gb25lJ3MgdGltZS4gWmVyb2luZyBpdCBrZWVwc1xuICAgIC8vIFwibWVldGluZyBtaW51dGVzIHRoaXMgd2Vla1wiIGhvbmVzdCB3aXRob3V0IGRlbGV0aW5nIHRoZSByb3csIHdoaWNoIGlzXG4gICAgLy8gc3RpbGwgZXZpZGVuY2UgdGhhdCB0aGUgaW50ZXJhY3Rpb24gd2FzIGF0dGVtcHRlZC5cbiAgICBjb25zdCBzdGF0dXMgPSBlZmZlY3RpdmUoJ3N0YXR1cycpO1xuICAgIGlmIChzdGF0dXMgPT09ICdjYW5jZWxsZWQnIHx8IHN0YXR1cyA9PT0gJ25vX3Nob3cnKSBpbnB1dC5kdXJhdGlvbl9taW51dGVzID0gMDtcbiAgfSxcbn07XG5cbi8qKlxuICogVGhlIGFjdGl2aXR5IGJ1YmJsZSBcdTIwMTQgdGhlIGNhbm9uaWNhbCBjb3B5IChgdGFza19hY3Rpdml0eV9idWJibGVgIGNhcnJpZXMgYVxuICogdmVyYmF0aW0gdHdpbikuXG4gKlxuICogIyMgYHJ1bkFzOiAnc3lzdGVtJ2AgKCMyMDE0LCBBR0VOVFMubWQgcnVsZSA5KVxuICpcbiAqIFRoZSBjbG9ja3MgaXQgc3RhbXBzIGJlbG9uZyB0byB0aGUgcmVjb3JkcyB0aGUgaW50ZXJhY3Rpb24gd2FzIFdJVEggXHUyMDE0IHRoZVxuICogYWNjb3VudCwgY29udGFjdCBhbmQgbGVhZCBcdTIwMTQgYW5kIHRvIHRoZSBjYXNlIGl0IGFuc3dlcmVkLCBub3QgdG8gdGhlIHBlcnNvblxuICogd2hvIGxvZ2dlZCBpdC4gQXMgdGhlIGNhbGxlciwgZXZlcnkgb25lIG9mIHRob3NlIHdyaXRlcyAoYW5kIHRoZSB3YWxrLXVwXG4gKiByZWFkcykgbWV0IHRoZSBjYWxsZXIncyBncmFudHM6IGEgc2VydmljZSBhZ2VudCBob2xkcyBubyBlZGl0IHJpZ2h0IG9uXG4gKiBhY2NvdW50cywgYW5kIGEgcmVwIG5lZWQgbm90IG93biB0aGUgYWNjb3VudCBvciBjb250YWN0IHRoZWlyIG93biBkZWFsIGhhbmdzXG4gKiBvZmYuIEVhY2ggcmVmdXNhbCB3YXMgc3dhbGxvd2VkIGJlc3QtZWZmb3J0LCBzbyB0aGUgY2xvY2tzIG5ldmVyIG1vdmVkXG4gKiAobWVhc3VyZWQgb24gMTcuNy4wOiBhIHNlcnZpY2UgYWdlbnQncyBoZWxkIGNhbGwgb24gdGhlaXIgb3duIGNhc2UgbGVmdCB0aGVcbiAqIGNhc2UgYWNjb3VudCdzIGBsYXN0X2FjdGl2aXR5X2RhdGVgIGVtcHR5IHdoaWxlIGFuIGFkbWluJ3MgaWRlbnRpY2FsIGNhbGxcbiAqIHN0YW1wZWQgaXQ7IHRoZSB0YXNrIHR3aW4gdGhlIHNhbWUsIGFuZCBhIHJlcCdzIGNvbXBsZXRlZCB0YXNrIG9uIHRoZWlyIG93blxuICogZGVhbCByZWFjaGVkIG5laXRoZXIgdGhlIGFjY291bnQgbm9yIHRoZSBjb250YWN0IGEgbWFuYWdlciBvd25zKS4gU28gdGhlXG4gKiBob29rIGVsZXZhdGVzLiBJdCB3cml0ZXMgbm90aGluZyB0aGUgY2FsbGVyIGNob3NlIGJleW9uZCB0aGUgbGlua3MgYWxyZWFkeSBvblxuICogdGhlIGV2ZW50LCBhbmQgb25seSB0aGUgcmVjZW5jeSBkYXRlcyBhbmQgdGhlIGNhc2UncyBmaXJzdC1yZXNwb25zZSBzdGFtcDtcbiAqIGVsZXZhdGlvbiBpcyBub3QgYW5vbnltaXR5IFx1MjAxNCBgdXBkYXRlZF9ieWAgc3RpbGwgbmFtZXMgdGhlIHBlcnNvbi5cbiAqXG4gKiAjIyBPcmdhbml6YXRpb24gKEFHRU5UUy5tZCBydWxlIDEwKVxuICpcbiAqIEV2ZXJ5IHJlYWQgYW5kIGV2ZXJ5IHdyaXRlIGlzIHBpbm5lZCB0byB0aGUgdHJpZ2dlcmluZyBldmVudCdzIG93blxuICogYG9yZ2FuaXphdGlvbl9pZGAgd2hlbiBpdCBjYXJyaWVzIG9uZTogdGhlIHdhbGstdXAgcmVhZHMgY2FycnkgdGhlIHByZWRpY2F0ZSxcbiAqIGFuZCBiZWNhdXNlIGEgYnktaWQgdXBkYXRlIGNhbm5vdCAodGhlIGVuZ2luZSByZWZ1c2VzIGFuIGV4dHJhIGB3aGVyZWAga2V5IG9uXG4gKiB0aGUgYnktaWQgcGF0aCksIGVhY2ggd3JpdGUgdGFyZ2V0IGlzIGZpcnN0IGNvbmZpcm1lZCBpbnNpZGUgdGhlXG4gKiBvcmdhbml6YXRpb24gYnkgb25lIHBpbm5lZCByZWFkIHBlciBvYmplY3QuIEEgcGVyc29uJ3MgZWxldmF0ZWQgY29udGV4dFxuICogYWxyZWFkeSBrZWVwcyB0aGVpciB0ZW5hbnQ7IHRoZSBwaW4gaXMgd2hhdCBob2xkcyB0aGUgd2FsbCBmb3IgYSB0cmlnZ2VyXG4gKiB0aGF0IGNhcnJpZXMgbm9uZSAoYSBzeXN0ZW0gd3JpdGUsIHdoaWNoIHJ1bnMgdW5zY29wZWQpLiBBbiBldmVudCB3aXRoIG5vXG4gKiBvcmdhbml6YXRpb24gKGEgc2luZ2xlLW9yZ2FuaXphdGlvbiBpbnN0YWxsKSBoYXMgbm8gd2FsbCwgYW5kIGlzIG5vdCBwaW5uZWQuXG4gKi9cbmNvbnN0IGV2ZW50QWN0aXZpdHlCdWJibGU6IEhvb2sgPSB7XG4gIG5hbWU6ICdldmVudF9hY3Rpdml0eV9idWJibGUnLFxuICBvYmplY3Q6ICdjcm1fZXZlbnQnLFxuICBldmVudHM6IFsnYWZ0ZXJJbnNlcnQnLCAnYWZ0ZXJVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDgwMCxcbiAgYXN5bmM6IHRydWUsXG4gIG9uRXJyb3I6ICdsb2cnLFxuICBydW5BczogJ3N5c3RlbScsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdBIGhlbGQgZXZlbnQgc3RhbXBzIGludGVyYWN0aW9uIHJlY2VuY3kgb24gdGhlIHJlbGF0ZWQgYWNjb3VudCAod2Fsa2luZyB1cCBmcm9tIGNvbnRhY3Qvb3Bwb3J0dW5pdHkvY2FzZSksIGxlYWQgYW5kIGNvbnRhY3QsIGFuZCB0aGUgZmlyc3QtcmVzcG9uc2UgdGltZSBvbiBhIHJlbGF0ZWQgY2FzZS4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcblxuICAgIGNvbnN0IHI6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLihwcmV2aW91cyA/PyB7fSksIC4uLmlucHV0IH07XG5cbiAgICAvLyBPbmx5IGFuIGludGVyYWN0aW9uIHRoYXQgSEFQUEVORUQgcmVzZXRzIHRoZSByZWNlbmN5IGNsb2NrLiBBIG1lZXRpbmdcbiAgICAvLyBib29rZWQgZm9yIG5leHQgcXVhcnRlciBpcyBub3QgY29udGFjdDsgbGV0dGluZyBgcGxhbm5lZGAgYnViYmxlIHdvdWxkXG4gICAgLy8gbWFrZSBhbiBhY2NvdW50IGxvb2sgZnJlc2hseS10b3VjaGVkIHRoZSBtb21lbnQgc29tZW9uZSBwdXQgYSBwbGFjZWhvbGRlclxuICAgIC8vIG9uIHRoZSBjYWxlbmRhciwgd2hpY2ggaXMgdGhlIGV4YWN0IGZhaWx1cmUgbW9kZSB0aGUgY2h1cm4gcmVwb3J0IGV4aXN0c1xuICAgIC8vIHRvIGF2b2lkLlxuICAgIGlmIChyLnN0YXR1cyAhPT0gJ2hlbGQnKSByZXR1cm47XG4gICAgLy8gRmlyZSBvbmNlLCBvbiB0aGUgdHJhbnNpdGlvbiBpbnRvIGBoZWxkYCAoYWZ0ZXJJbnNlcnQgaGFzIG5vIGBwcmV2aW91c2ApLlxuICAgIGlmIChwcmV2aW91cyAmJiBwcmV2aW91cy5zdGF0dXMgPT09ICdoZWxkJykgcmV0dXJuO1xuXG4gICAgY29uc3Qgbm93SXNvID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIC8vIGBjcm1fYWNjb3VudC5sYXN0X2FjdGl2aXR5X2RhdGVgIGlzIGEgREFURSBjb2x1bW47IHRoZSB0d28gY29udGFjdFxuICAgIC8vIHRpbWVzdGFtcHMgYXJlIGRhdGV0aW1lcy4gUGFzc2luZyBhbiBJU08gaW5zdGFudCB0byBhIGRhdGUgY29sdW1uIGlzIHdoYXRcbiAgICAvLyBzdG9yZXMgJzIwMjYtMDgtMDRUXHUyMDI2JyBpbiBhIGZpZWxkIGV2ZXJ5IGZpbHRlciBjb21wYXJlcyBhcyAnWVlZWS1NTS1ERCcuXG4gICAgY29uc3QgdG9kYXkgPSBub3dJc28uc2xpY2UoMCwgMTApO1xuXG4gICAgY29uc3QgaWRPZiA9IChrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PlxuICAgICAgdHlwZW9mIHJba2V5XSA9PT0gJ3N0cmluZycgJiYgcltrZXldLmxlbmd0aCA+IDAgPyAocltrZXldIGFzIHN0cmluZykgOiB1bmRlZmluZWQ7XG4gICAgLy8gVGhlIHJ1bGUtMTAgcGluIFx1MjAxNCBzZWUgdGhlIGhvb2sncyBub3RlLlxuICAgIGNvbnN0IG9yZyA9IGlkT2YoJ29yZ2FuaXphdGlvbl9pZCcpO1xuICAgIGNvbnN0IGluT3JnOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gb3JnID8geyBvcmdhbml6YXRpb25faWQ6IG9yZyB9IDoge307XG5cbiAgICBjb25zdCBhY2NvdW50SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgY29udGFjdElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGxlYWRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IGRpcmVjdCA9IGlkT2YoJ3JlbGF0ZWRfdG9fYWNjb3VudCcpO1xuICAgIGlmIChkaXJlY3QpIGFjY291bnRJZHMuYWRkKGRpcmVjdCk7XG4gICAgY29uc3QgY29udGFjdElkID0gaWRPZigncmVsYXRlZF90b19jb250YWN0Jyk7XG4gICAgaWYgKGNvbnRhY3RJZCkgY29udGFjdElkcy5hZGQoY29udGFjdElkKTtcbiAgICBjb25zdCBsZWFkSWQgPSBpZE9mKCdyZWxhdGVkX3RvX2xlYWQnKTtcbiAgICBpZiAobGVhZElkKSBsZWFkSWRzLmFkZChsZWFkSWQpO1xuXG4gICAgLy8gV2FsayBVUCB0byB0aGUgYWNjb3VudC4gRXZlcnkgb25lIG9mIHRoZXNlIG9iamVjdHMgbmFtZXMgaXRzIHBhcmVudFxuICAgIC8vIGBjcm1fYWNjb3VudGAsIHNvIG9uZSBsb29wIGNvdmVycyBhbGwgdGhyZWUuIGBmaW5kKC4uLiB0b3A6IDEpYCByYXRoZXJcbiAgICAvLyB0aGFuIGBmaW5kT25lYDogdGhlIHR3byBhZ3JlZSBoZXJlLCBhbmQgYGZpbmRgIGlzIHRoZSBzaGFwZSB0aGUgcmVzdCBvZlxuICAgIC8vIHRoZSBhcHAncyBob29rcyByZWFkIHdpdGguXG4gICAgY29uc3QgcGFyZW50TG9va3VwczogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gPSBbXG4gICAgICBbJ3JlbGF0ZWRfdG9fY29udGFjdCcsICdjcm1fY29udGFjdCddLFxuICAgICAgWydyZWxhdGVkX3RvX29wcG9ydHVuaXR5JywgJ2NybV9vcHBvcnR1bml0eSddLFxuICAgICAgWydyZWxhdGVkX3RvX2Nhc2UnLCAnY3JtX2Nhc2UnXSxcbiAgICBdO1xuICAgIGZvciAoY29uc3QgW2ZpZWxkLCBvYmplY3RdIG9mIHBhcmVudExvb2t1cHMpIHtcbiAgICAgIGNvbnN0IGlkID0gaWRPZihmaWVsZCk7XG4gICAgICBpZiAoIWlkKSBjb250aW51ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdzogYW55ID0gYXdhaXQgYXBpLm9iamVjdChvYmplY3QpLmZpbmQoe1xuICAgICAgICAgIHdoZXJlOiB7IGlkLCAuLi5pbk9yZyB9LFxuICAgICAgICAgIGZpZWxkczogWydjcm1fYWNjb3VudCddLFxuICAgICAgICAgIHRvcDogMSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXcgOiAocmF3Py5yZWNvcmRzID8/IFtdKTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gcm93cy5sZW5ndGggPyByb3dzWzBdLmNybV9hY2NvdW50IDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAodHlwZW9mIHBhcmVudCA9PT0gJ3N0cmluZycgJiYgcGFyZW50Lmxlbmd0aCA+IDApIGFjY291bnRJZHMuYWRkKHBhcmVudCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQmVzdC1lZmZvcnQ6IGEgcGFyZW50IHRoYXQgY2Fubm90IGJlIHJlYWQgaXMgbm90IGJ1YmJsZWQgdGhyb3VnaC5cbiAgICAgICAgLy8gTm8gYGNvbnNvbGVgIGluIHRoZSBMMiBob29rIHNhbmRib3ggXHUyMDE0IGxvZ2dpbmcgaGVyZSB3b3VsZCB0aHJvdyBpdHNcbiAgICAgICAgLy8gb3duIFJlZmVyZW5jZUVycm9yIChjZi4gIzQ3MSkuXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0czogQXJyYXk8W3N0cmluZywgU2V0PHN0cmluZz4sIFJlY29yZDxzdHJpbmcsIGFueT5dPiA9IFtcbiAgICAgIFsnY3JtX2FjY291bnQnLCBhY2NvdW50SWRzLCB7IGxhc3RfYWN0aXZpdHlfZGF0ZTogdG9kYXkgfV0sXG4gICAgICBbJ2NybV9jb250YWN0JywgY29udGFjdElkcywgeyBsYXN0X2NvbnRhY3RlZF9kYXRlOiBub3dJc28gfV0sXG4gICAgICBbJ2NybV9sZWFkJywgbGVhZElkcywgeyBsYXN0X2NvbnRhY3RlZF9kYXRlOiBub3dJc28gfV0sXG4gICAgXTtcbiAgICBmb3IgKGNvbnN0IFtvYmplY3QsIGlkcywgZG9jXSBvZiB0YXJnZXRzKSB7XG4gICAgICBsZXQgaW5zaWRlID0gWy4uLmlkc107XG4gICAgICBpZiAob3JnICYmIGluc2lkZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmF3OiBhbnkgPSBhd2FpdCBhcGkub2JqZWN0KG9iamVjdCkuZmluZCh7IHdoZXJlOiB7IGlkOiB7ICRpbjogaW5zaWRlIH0sIC4uLmluT3JnIH0sIGZpZWxkczogWydpZCddLCB0b3A6IGluc2lkZS5sZW5ndGggfSk7XG4gICAgICAgICAgaW5zaWRlID0gKEFycmF5LmlzQXJyYXkocmF3KSA/IHJhdyA6IChyYXc/LnJlY29yZHMgPz8gW10pKS5tYXAoKHJvdzogYW55KSA9PiBTdHJpbmcocm93LmlkKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGluc2lkZSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGlkIG9mIGluc2lkZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGB1cGRhdGUoZG9jdW1lbnQsIG9wdGlvbnMpYCBcdTIwMTQgYGN0eC5hcGlgIGlzIHRoZSBlbmdpbmUgcmVwbyBmYWNhZGUsXG4gICAgICAgICAgLy8gd2hvc2UgdXBkYXRlIHRha2VzIGEgRE9DVU1FTlQsIG5vdCBhbiBpZCAoIzYxNjsgcGlubmVkIGJ5XG4gICAgICAgICAgLy8gdGVzdC9ob29rLXdyaXRlLXNoYXBlLnRlc3QudHMgYWdhaW5zdCBhIHJlYWwga2VybmVsKS5cbiAgICAgICAgICBhd2FpdCBhcGkub2JqZWN0KG9iamVjdCkudXBkYXRlKHsgLi4uZG9jLCBpZCB9LCB7IHdoZXJlOiB7IGlkIH0gfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IGFjdGl2aXR5IGJ1YmJsZTsgbmV2ZXIgYnJlYWsgdGhlIHBhcmVudCB3cml0ZS5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCBGaXJzdCByZXNwb25zZSBvbiBhIGNhc2UgKCM1OTUpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gXHUyNkQ0IFRoZSBTSU5HTEUgd3JpdGVyIG9mIGBjcm1fY2FzZS5maXJzdF9yZXNwb25zZV9kYXRlYCwgYW5kIGl0IGJlbG9uZ3NcbiAgICAvLyBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSBgbG9nX2NhbGxgIC8gYGxvZ19tZWV0aW5nYCBhY3Rpb24gYm9kaWVzOiBzdGFtcGluZ1xuICAgIC8vIGl0IHBlci1idXR0b24gY292ZXJzIG9ubHkgaW50ZXJhY3Rpb25zIHJlY29yZGVkIHRocm91Z2ggdGhvc2UgdHdvXG4gICAgLy8gYnV0dG9ucywgYW5kIGFuIGV2ZW50IGNyZWF0ZWQgYW55IG90aGVyIHdheSAodGhlIEFjdGl2aXR5IHRhYiwgYW4gaW1wb3J0LFxuICAgIC8vIGFuIGludGVncmF0aW9uLCBhIGZ1dHVyZSBhY3Rpb24pIGxlYXZlcyB0aGUgbW9zdCBzdGFuZGFyZCBTTEEgbWV0cmljIGFcbiAgICAvLyBzZXJ2aWNlIGRlc2sgcmVwb3J0cyBwZXJtYW5lbnRseSBudWxsLiBUaGUgcnVsZSB0aG9zZSBhY3Rpb25zIGV4cHJlc3MgaXNcbiAgICAvLyB0aGUgb25lIHRoaXMgaG9vayBhbHJlYWR5IGNvbXB1dGVzIGZvciByZWNlbmN5IFx1MjAxNCBhbiBpbnRlcmFjdGlvbiB0aGF0XG4gICAgLy8gSEFQUEVORUQgXHUyMDE0IHNvIGl0IGxpdmVzIG9uY2UsIHdoZXJlIGV2ZXJ5IHdyaXRlciBvZiBhIGhlbGQgZXZlbnQgcGFzc2VzXG4gICAgLy8gdGhyb3VnaCBpdC4gU2FtZSBhcmd1bWVudCB0aGF0IG1ha2VzIHRoaXMgaG9vayB0aGUgc2luZ2xlIHdyaXRlciBvZlxuICAgIC8vIHJlY2VuY3ksIGFuZCBgY2FzZV9zdGF0dXNfc2lkZV9lZmZlY3RzYCB0aGUgc2luZ2xlIG93bmVyIG9mIGVzY2FsYXRpb25cbiAgICAvLyBmb2xsb3ctdXAgdGFza3MuXG4gICAgLy9cbiAgICAvLyBBIHN0YXR1cyBjaGFuZ2UgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhIGZpcnN0IHJlc3BvbnNlOiBhbiBhZ2VudCBjYW4gbW92ZSBhXG4gICAgLy8gY2FzZSB0byBcImluIHByb2dyZXNzXCIgYW5kIGludmVzdGlnYXRlXG4gICAgLy8gZm9yIGFuIGhvdXIgd2hpbGUgdGhlIGN1c3RvbWVyIGhlYXJzIG5vdGhpbmcsIHNvIGEgc3RhdHVzLWRlcml2ZWQgbnVtYmVyXG4gICAgLy8gd291bGQgcmVwb3J0IGEgcmVzcG9uc2UgdGhhdCBuZXZlciBoYXBwZW5lZC4gTmVpdGhlciBpcyBhIG1lZXRpbmcgbWVyZWx5XG4gICAgLy8gQk9PS0VEIFx1MjAxNCB0aGF0IGlzIHRoZSBgaGVsZGAgZ2F0ZSBhYm92ZSwgd2hpY2ggdGhpcyBibG9jayBzaXRzIHVuZGVyLlxuICAgIGNvbnN0IHJlc3BvbnNlQ2FzZUlkID0gaWRPZigncmVsYXRlZF90b19jYXNlJyk7XG4gICAgaWYgKHJlc3BvbnNlQ2FzZUlkKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBSZWFkIHRoZSBTVE9SRUQgdmFsdWUgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgdGhlIGV2ZW50J3Mgb3duIHBheWxvYWQ6XG4gICAgICAgIC8vIFwiZmlyc3QgcmVzcG9uc2VcIiBpcyBhIHByb3BlcnR5IG9mIHRoZSBjYXNlLCBzbyB0aGUgc2Vjb25kIGhlbGQgZXZlbnRcbiAgICAgICAgLy8gb24gYSBjYXNlIG11c3QgZmluZCB0aGUgZmlyc3Qgb25lJ3Mgc3RhbXAgYW5kIGxlYXZlIGl0IGFsb25lLiBBXG4gICAgICAgIC8vIHJlLXN0YW1wIHdvdWxkIHNpbGVudGx5IHR1cm4gdGhlIG1ldHJpYyBpbnRvIFwibGFzdCByZXNwb25zZVwiLlxuICAgICAgICAvLyBQaW5uZWQgbGlrZSB0aGUgYnViYmxlLCBhbmQgd3JpdHRlbiBvbmx5IHdoZW4gdGhlIHJlYWQgRk9VTkQgdGhlXG4gICAgICAgIC8vIGNhc2U6IHVuZGVyIGVsZXZhdGlvbiBhbiBlbXB0eSByZWFkIG1lYW5zIFwibm90IHRoaXMgb3JnYW5pemF0aW9uJ3NcIlxuICAgICAgICAvLyAob3IgZ29uZSksIG5ldmVyIFwibm90IHN0YW1wZWQgeWV0XCIuXG4gICAgICAgIGNvbnN0IHJhdzogYW55ID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2Nhc2UnKS5maW5kKHtcbiAgICAgICAgICB3aGVyZTogeyBpZDogcmVzcG9uc2VDYXNlSWQsIC4uLmluT3JnIH0sXG4gICAgICAgICAgZmllbGRzOiBbJ2ZpcnN0X3Jlc3BvbnNlX2RhdGUnXSxcbiAgICAgICAgICB0b3A6IDEsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByb3dzID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3IDogKHJhdz8ucmVjb3JkcyA/PyBbXSk7XG4gICAgICAgIGlmIChyb3dzLmxlbmd0aCA+IDAgJiYgIXJvd3NbMF0uZmlyc3RfcmVzcG9uc2VfZGF0ZSkge1xuICAgICAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV9jYXNlJykudXBkYXRlKFxuICAgICAgICAgICAgeyBpZDogcmVzcG9uc2VDYXNlSWQsIGZpcnN0X3Jlc3BvbnNlX2RhdGU6IG5vd0lzbyB9LFxuICAgICAgICAgICAgeyB3aGVyZTogeyBpZDogcmVzcG9uc2VDYXNlSWQgfSB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBCZXN0LWVmZm9ydCwgbGlrZSB0aGUgYnViYmxlIGFib3ZlOiBuZXZlciBicmVhayB0aGUgZXZlbnQgd3JpdGUuXG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBgZG9fbm90X2NhbGxgIFx1MjAxNCB0aGUgY2FsZW5kYXIgaGFsZiBvZiB0aGUgc2FtZSBwcm9taXNlLlxuICpcbiAqIGBjcm1fdGFza2AgY2FycmllcyB0aGUgZm9sbG93LXVwIGEgcmVwIE9XRVM7IGBjcm1fZXZlbnRgIGNhcnJpZXMgdGhlIHNsb3QgYVxuICogcmVwIEJPT0tTLiBBIGBwbGFubmVkYCBldmVudCBvZiB0eXBlIGBjYWxsYCBpcyBhIGJvb2tlZCBvdXRib3VuZCBwaG9uZSBjYWxsLFxuICogc28gaXQgaXMgcmVmdXNlZCBhZ2FpbnN0IGEgcGVyc29uIGZsYWdnZWQgYGRvX25vdF9jYWxsYCBmb3IgZXhhY3RseSB0aGVcbiAqIHJlYXNvbnMgc3RhdGVkIG9uIGB0YXNrX2RvX25vdF9jYWxsX2d1YXJkYCBpbiBgc3JjL3NhbGVzL29iamVjdHMvdGFzay5ob29rLnRzYFxuICogKHJlYWQgdGhhdCBibG9jayBmaXJzdCBcdTIwMTQgaXQgY2FycmllcyB0aGUgZnVsbCByYXRpb25hbGUgZm9yIGVuZm9yY2luZyBvbiB0aGVcbiAqIHdyaXRlIHJhdGhlciB0aGFuIG9uIGEgYnV0dG9uLCBhbmQgZm9yIHNjb3BpbmcgdG8gdGhlIHBob25lKS5cbiAqXG4gKiBUaGUgc3RhdHVzIHNwbGl0IGlzIHdoYXQgbWFrZXMgdGhpcyBndWFyZCBob25lc3QsIGFuZCBpdCBpcyB0aGUgd2hvbGUgcmVhc29uXG4gKiBgbG9nX2NhbGxgIG5lZWRzIG5vIGdhdGUgb2YgaXRzIG93bjpcbiAqXG4gKiAgIC0gYHN0YXR1czogJ2hlbGQnYCAgIFx1MjAxNCB0aGUgY2FsbCBIQVBQRU5FRC4gQWxsb3dlZCwgYWx3YXlzLiBUaGlzIGlzIHdoYXRcbiAqICAgICBgbG9nX2NhbGxgIHdyaXRlcywgYW5kIHJlZnVzaW5nIGl0IHdvdWxkIGhpZGUgZXZpZGVuY2Ugb2YgYSBjYWxsIHJhdGhlclxuICogICAgIHRoYW4gcHJldmVudCBvbmUuXG4gKiAgIC0gYHN0YXR1czogJ3BsYW5uZWQnYCBcdTIwMTQgdGhlIGNhbGwgaXMgQk9PS0VELiBSZWZ1c2VkLlxuICpcbiAqIGBzY2hlZHVsZV9tZWV0aW5nYCBpcyBkZWxpYmVyYXRlbHkgTk9UIGNhdWdodCBoZXJlOiBpdCBoYXJkY29kZXNcbiAqIGB0eXBlOiAnbWVldGluZydgLCBhbmQgYSBwZXJzb24gd2hvIGRvZXMgbm90IHdhbnQgcGhvbmUgY2FsbHMgbWF5IHN0aWxsIGJlXG4gKiBtZXQgaW4gcGVyc29uIG9yIG92ZXIgdmlkZW8uIEdhdGluZyBpdCB3b3VsZCB3aWRlbiBgZG9fbm90X2NhbGxgIGludG9cbiAqIGBkb19ub3RfY29udGFjdGAuXG4gKi9cbmNvbnN0IGV2ZW50RG9Ob3RDYWxsR3VhcmQ6IEhvb2sgPSB7XG4gIG5hbWU6ICdldmVudF9kb19ub3RfY2FsbF9ndWFyZCcsXG4gIG9iamVjdDogJ2NybV9ldmVudCcsXG4gIGV2ZW50czogWydiZWZvcmVJbnNlcnQnLCAnYmVmb3JlVXBkYXRlJ10sXG4gIHByaW9yaXR5OiAxNTAsXG4gIGRlc2NyaXB0aW9uOiAnUmVmdXNlIHRvIGJvb2sgYSBwbGFubmVkIENhbGwgZXZlbnQgYWdhaW5zdCBhIGxlYWQvY29udGFjdCBmbGFnZ2VkIERvIE5vdCBDYWxsLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgLy8gVGhlIHJlZnVzYWwgZW52ZWxvcGUgKCMxMDc1KS4gTWlycm9yZWQgZnJvbSBgLi9fcmVmdXNhbC50c2AgYmVjYXVzZSBhXG4gICAgLy8gbG93ZXJlZCBib2R5IGhhcyBubyBtb2R1bGUgc2NvcGUgYW5kIGBleHRyYWN0SG9va0JvZHlgIFRIUk9XUyBvbiBhblxuICAgIC8vIGltcG9ydDsgYHRlc3QvcmVmdXNhbC1lbnZlbG9wZS50ZXN0LnRzYCBwaW5zIGV2ZXJ5IGNvcHkgYWdhaW5zdCBpdC5cbiAgICBmdW5jdGlvbiByZWZ1c2UoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb2RlOiBzdHJpbmcsXG4gICAgICBzdGF0dXM6IG51bWJlcixcbiAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmcgPSBtZXNzYWdlLFxuICAgICk6IEVycm9yIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29kZTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZztcbiAgICAgIH07XG4gICAgICBlcnIuY29kZSA9IGNvZGU7XG4gICAgICBlcnIuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgZXJyLnVzZXJNZXNzYWdlID0gdXNlck1lc3NhZ2U7XG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXBpKSByZXR1cm47XG5cbiAgICBjb25zdCBlZmZlY3RpdmUgPSAoa2V5OiBzdHJpbmcpOiB1bmtub3duID0+XG4gICAgICBpbnB1dFtrZXldICE9PSB1bmRlZmluZWQgJiYgaW5wdXRba2V5XSAhPT0gbnVsbCA/IGlucHV0W2tleV0gOiBwcmV2aW91cz8uW2tleV07XG5cbiAgICBpZiAoZWZmZWN0aXZlKCd0eXBlJykgIT09ICdjYWxsJykgcmV0dXJuO1xuICAgIC8vIE9ubHkgYSBib29raW5nLiBgaGVsZGAgKHdoYXQgYGxvZ19jYWxsYCB3cml0ZXMpIGFuZCBldmVyeSBvdGhlciBzdGF0dXNcbiAgICAvLyBkZXNjcmliZSBhIGNhbGwgdGhhdCBpcyBubyBsb25nZXIgcHJldmVudGFibGUuXG4gICAgaWYgKGVmZmVjdGl2ZSgnc3RhdHVzJykgIT09ICdwbGFubmVkJykgcmV0dXJuO1xuXG4gICAgY29uc3QgbGVhZElkID0gZWZmZWN0aXZlKCdyZWxhdGVkX3RvX2xlYWQnKTtcbiAgICBjb25zdCBjb250YWN0SWQgPSBlZmZlY3RpdmUoJ3JlbGF0ZWRfdG9fY29udGFjdCcpO1xuXG4gICAgY29uc3QgdGFyZ2V0czogQXJyYXk8eyBvYmplY3Q6IHN0cmluZzsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiA9IFtdO1xuICAgIGlmICh0eXBlb2YgbGVhZElkID09PSAnc3RyaW5nJyAmJiBsZWFkSWQpIHtcbiAgICAgIHRhcmdldHMucHVzaCh7IG9iamVjdDogJ2NybV9sZWFkJywgaWQ6IGxlYWRJZCwgbGFiZWw6ICdsZWFkJyB9KTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb250YWN0SWQgPT09ICdzdHJpbmcnICYmIGNvbnRhY3RJZCkge1xuICAgICAgdGFyZ2V0cy5wdXNoKHsgb2JqZWN0OiAnY3JtX2NvbnRhY3QnLCBpZDogY29udGFjdElkLCBsYWJlbDogJ2NvbnRhY3QnIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdCBvZiB0YXJnZXRzKSB7XG4gICAgICAvLyBgZmluZCguLi4gdG9wOiAxKWAsIG5vcm1hbGlzZWQgZm9yIGJvdGggZHJpdmVyIHNoYXBlcyBcdTIwMTQgc2FtZSByZWFzb25pbmdcbiAgICAgIC8vIGFzIGBldmVudF9hY3Rpdml0eV9idWJibGVgIGJlbG93LlxuICAgICAgY29uc3QgcmF3OiBhbnkgPSBhd2FpdCBhcGkub2JqZWN0KHQub2JqZWN0KS5maW5kKHtcbiAgICAgICAgd2hlcmU6IHsgaWQ6IHQuaWQgfSxcbiAgICAgICAgZmllbGRzOiBbJ2lkJywgJ2RvX25vdF9jYWxsJ10sXG4gICAgICAgIHRvcDogMSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgcm93cyA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhdyA6IChyYXc/LnJlY29yZHMgPz8gW10pO1xuICAgICAgY29uc3QgcGVyc29uID0gcm93c1swXTtcbiAgICAgIC8vIGA9PT0gdHJ1ZWA6IGFic2VudCAvIG51bGwgLyBmYWxzZSBhcmUgYWxsIFwibm90IGZsYWdnZWRcIi5cbiAgICAgIGlmIChwZXJzb24/LmRvX25vdF9jYWxsID09PSB0cnVlKSB7XG4gICAgICAgIHRocm93IHJlZnVzZShcbiAgICAgICAgICBgVGhpcyAke3QubGFiZWx9IGlzIGZsYWdnZWQgRG8gTm90IENhbGwsIHNvIGEgY2FsbCBjYW5ub3QgYmUgc2NoZWR1bGVkIGFnYWluc3QgdGhlbS4gYCArXG4gICAgICAgICAgICAnTG9nIHRoZSBjYWxsIGFzIGhlbGQgaWYgaXQgYWxyZWFkeSBoYXBwZW5lZCwgYm9vayBhIG1lZXRpbmcgaW5zdGVhZCwgJyArXG4gICAgICAgICAgICAnb3IgY2xlYXIgRG8gTm90IENhbGwgb24gdGhlIHJlY29yZCBmaXJzdC4nLFxuICAgICAgICAgICdGT1JCSURERU4nLFxuICAgICAgICAgIDQwMyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBbZXZlbnRTY2hlZHVsZURlcml2ZSwgZXZlbnREb05vdENhbGxHdWFyZCwgZXZlbnRBY3Rpdml0eUJ1YmJsZV07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2ZvcmVjYXN0Lmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2ZvcmVjYXN0Lmhvb2sudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcblxuLyoqXG4gKiBGb3JlY2FzdCBsaWZlY3ljbGUgaG9vay5cbiAqXG4gKiBBdXRvLWRlcml2ZXMgdGhlIHdob2xlIHBlcmlvZCBmYW1pbHkgXHUyMDE0IGBwZXJpb2Rfc3RhcnRgLCBgcGVyaW9kX2VuZGAgYW5kXG4gKiBgcGVyaW9kX2xhYmVsYCBcdTIwMTQgZnJvbSBgcGVyaW9kYCAoKyBgcGVyaW9kX3N0YXJ0YCwgd2hlbiB0aGUgY2FsbGVyIHN1cHBsaWVzXG4gKiBvbmUpIHNvIGNhbGxlcnMgKFVJLCBBSSBza2lsbCwgdGhlIGBmb3JlY2FzdF9zbmFwc2hvdGAgc2NoZWR1bGVkIGZsb3cpIGRvbid0XG4gKiBoYXZlIHRvIGNvbXB1dGUgdGhlbS4gQWxzbyBzdGFtcHMgYHNuYXBzaG90X2RhdGVgIHRvIHRvZGF5IG9uIGluc2VydCBpZlxuICogdW5zZXQuXG4gKlxuICogV2h5IGBwZXJpb2Rfc3RhcnRgIGlzIGRlcml2ZWQgaGVyZSBhbmQgbm93aGVyZSBlbHNlOiBhIGZsb3cgdGVtcGxhdGUgY2FuXG4gKiBleHByZXNzIGB7VE9EQVkoKX1gIGFuZCBkYXkgb2Zmc2V0cywgYnV0IGl0IGhhcyBubyB3YXkgdG8gc2F5IFwidGhlIGZpcnN0IGRheVxuICogb2YgdGhlIGNhbGVuZGFyIHF1YXJ0ZXIgY29udGFpbmluZyB0b2RheVwiLiBJZiBlYWNoIHdyaXRlciBjb21wdXRlZCBpdHMgb3duXG4gKiBib3VuZGFyeSB3ZSB3b3VsZCBnZXQgZXhhY3RseSB0aGUgZHJpZnQgIzUzMCBwaW5uZWQgaW4gdGhlIHNlZWRzIFx1MjAxNCBzbmFwc2hvdHNcbiAqIGxhYmVsbGVkICdRMyAyMDI2JyB3aG9zZSBgcGVyaW9kX3N0YXJ0YCBpcyBzb21lIG1pZC1xdWFydGVyIGRhdGUsIHNvIGV2ZXJ5XG4gKiBcInRoaXMgcXVhcnRlclwiIGVxdWFscy1maWx0ZXIgbWlzc2VzLiBPbmUgZGVyaXZhdGlvbiwgb25lIGRlZmluaXRpb246IGdpdmVcbiAqIHRoZSBvYmplY3QgYSBgcGVyaW9kYCBhbmQgaXQgbGFuZHMgb24gYSBjYWxlbmRhci10cnVlIGJvdW5kYXJ5IG9yIG5vdCBhdCBhbGwuXG4gKlxuICogTk9URTogYWxsIGhlbHBlcnMgYXJlIGlubGluZWQgaW50byBgaGFuZGxlcmAgYmVjYXVzZSB0aGUgYnVpbGQgcGlwZWxpbmVcbiAqIGxvd2VycyBpbmxpbmUgaGFuZGxlcnMgXHUyMDE0IG1vZHVsZS1zY29wZSBoZWxwZXJzIHdvdWxkIG5vdCBzdXJ2aXZlIGxvd2VyaW5nLlxuICovXG5jb25zdCBmb3JlY2FzdERlcml2ZTogSG9vayA9IHtcbiAgbmFtZTogJ2ZvcmVjYXN0X2Rlcml2ZV9wZXJpb2QnLFxuICBvYmplY3Q6ICdjcm1fZm9yZWNhc3QnLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICBwcmlvcml0eTogMjAwLFxuICBkZXNjcmlwdGlvbjogJ0Rlcml2ZSBwZXJpb2Rfc3RhcnQsIHBlcmlvZF9lbmQgYW5kIHBlcmlvZF9sYWJlbCBmcm9tIHBlcmlvZCAoKyBzbmFwc2hvdF9kYXRlKS4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIC8vIFx1MjZENCBBIFBSRURJQ0FURSBVUERBVEUgREVSSVZFUyBOT1RISU5HIEhFUkUgXHUyMDE0IEFEUi0wMDU4IEFkZGVuZHVtIElJIEQzLlxuICAgIC8vXG4gICAgLy8gYHVwZGF0ZShvYmosIHBheWxvYWQsIHsgbXVsdGk6IHRydWUsIHdoZXJlIH0pYCBzZW5kcyBPTkUgYFNFVGAgY2xhdXNlIGZvclxuICAgIC8vIGFsbCBOIG1hdGNoZWQgcm93cywgYW5kIHRoZSBlbmdpbmUgaGFuZHMgZXZlcnkgcm93J3MgYGJlZm9yZVVwZGF0ZWAgVEhBVFxuICAgIC8vIHBheWxvYWQgcmF0aGVyIHRoYW4gYSBwZXItcm93IGNvcHkuIEEgcGF5bG9hZCB3cml0ZSB3aG9zZSB2YWx1ZSBcdTIwMTQgb3JcbiAgICAvLyB3aG9zZSBpZi1ndWFyZCBcdTIwMTQgcmVhZHMgYGN0eC5wcmV2aW91c2AgdGhlcmVmb3JlIGRvZXMgbm90IHNjb3BlIGl0c2VsZiB0b1xuICAgIC8vIHRoZSByb3cgaXQgd2FzIGRlY2lkZWQgb24uIEJvdGggb3V0Y29tZXMgYXJlIG1lYXN1cmVkIG9uXG4gICAgLy8gMTcuNC4wLCBpbiB0aGlzIGFwcCwgb24gYSBmcmVzaCBgcG5wbSBkZXZgOlxuICAgIC8vXG4gICAgLy8gIC0ga2V5cyB3cml0dGVuIGZvciBTT01FIHJvd3Mgb25seSBcdTIxRDIgdGhlIGVuZ2luZSByZWZ1c2VzIHRoZSB3aG9sZSBiYXRjaFxuICAgIC8vICAgIChgTVVMVElfVVBEQVRFX0hPT0tfS0VZX0RJVkVSR0VOQ0VgKSBhbmQgd3JpdGVzIG5vdGhpbmcuIFRoaXMgaG9vaydzXG4gICAgLy8gICAgb3duIGBpZiAoIWlucHV0LnBlcmlvZF9lbmQpYCBkaWQgZXhhY3RseSB0aGF0IHVuZGVyIHRoZSBwbGF0Zm9ybSdzXG4gICAgLy8gICAgc2VlZC1vd25lcnNoaXAgY2xhaW06IHJvdyAwIHN0YW1wZWQgYHBlcmlvZF9lbmRgIC8gYHBlcmlvZF9sYWJlbGBcbiAgICAvLyAgICBpbnRvIHRoZSBzaGFyZWQgcGF5bG9hZCwgcm93cyAxLTYgdGhlbiBzYXcgdGhlbSBhbHJlYWR5IHNldCBhbmRcbiAgICAvLyAgICBzdGFtcGVkIG5vdGhpbmcsIHNvIGFsbCA3IHNlZWRlZCBmb3JlY2FzdHMgc3RheWVkIG93bmVybGVzcyAoIzE4MDQpLlxuICAgIC8vICAtIHRoZSBTQU1FIGtleSBvbiBFVkVSWSByb3cgXHUyMUQyIG5vdGhpbmcgZGl2ZXJnZXMsIHRoZSBiYXRjaCByZXNvbHZlcywgYW5kXG4gICAgLy8gICAgdGhlIExBU1Qgcm93J3MgdmFsdWUgaXMgc3RvcmVkIGZvciBhbGwgb2YgdGhlbSwgaW4gc2lsZW5jZS4gVGhhdCBpc1xuICAgIC8vICAgIHdoYXQgbGVmdCBgcHJvYmFiaWxpdHk6IDgwYCBvbiBjbG9zZWQtbG9zdCBvcHBvcnR1bml0aWVzICgjMTI3NSkuXG4gICAgLy9cbiAgICAvLyBgY3R4LnByZXZpb3VzYCBvbiB0aGlzIHBhdGggaXMgc3VwcGxpZWQgc28gYSBndWFyZCBjYW4gUkVGVVNFIGEgd3JpdGUsXG4gICAgLy8gbmV2ZXIgc28gYSByZXdyaXRlIGNhbiBiZSBhaW1lZC4gRGVyaXZpbmcgaXMgcGVyLXJlY29yZCB3b3JrLCBzbyBpdFxuICAgIC8vIHN0YW5kcyBkb3duIGhlcmUgYW5kIHN0aWxsIGhhcHBlbnMgb24gdGhlIHBlci1yZWNvcmQgcGF0aCBcdTIwMTQgd2hpY2ggaXNcbiAgICAvLyBldmVyeSB3cml0ZXIgdGhpcyBhcHAgaGFzOiBhbGwgMTkgYHVwZGF0ZV9yZWNvcmRgIGZsb3cgbm9kZXMgYW5kIGV2ZXJ5XG4gICAgLy8gYWN0aW9uIGFuZCBob29rIHdyaXRlIHRocm91Z2ggYGN0eC5hcGlgLCBhbGwgb2YgdGhlbSBieSBpZC4gVGhlIHBsYXRmb3JtJ3NcbiAgICAvLyBzZWVkLW93bmVyc2hpcCBjbGFpbSBpcyBhIHByZWRpY2F0ZSB3cml0ZSwgYW5kIGl0IHdyaXRlcyBvbmx5IGBvd25lcl9pZGAsXG4gICAgLy8gd2hpY2ggZGVyaXZlcyBub3RoaW5nLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoZSBgY3R4LmV2ZW50YCBoYWxmIGlzIGxvYWQtYmVhcmluZywgbm90IGNlcmVtb255OiBhIEJBVENIIElOU0VSVFxuICAgIC8vIGFsc28gcmVwb3J0cyBgZGlzcGF0Y2gubW9kZSA9PT0gJ3Blci1yb3cnYCwgYW5kIHRoZXJlIGVhY2ggcm93IGNhcnJpZXNcbiAgICAvLyBpdHMgT1dOIHBheWxvYWQgXHUyMDE0IGRyb3BwaW5nIHRoYXQgaGFsZiB3b3VsZCBzdG9wIHRoZSBzZWVkcyBkZXJpdmluZyB0aGVpclxuICAgIC8vIHBlcmlvZHMgYXQgYWxsLlxuICAgIGlmIChjdHguZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIGN0eC5kaXNwYXRjaD8ubW9kZSA9PT0gJ3Blci1yb3cnKSByZXR1cm47XG5cbiAgICBjb25zdCBwYWQgPSAobjogbnVtYmVyKSA9PiBTdHJpbmcobikucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBpc29EYXRlID0gKGQ6IERhdGUpID0+XG4gICAgICBgJHtkLmdldFVUQ0Z1bGxZZWFyKCl9LSR7cGFkKGQuZ2V0VVRDTW9udGgoKSArIDEpfS0ke3BhZChkLmdldFVUQ0RhdGUoKSl9YDtcbiAgICBjb25zdCBNT05USFMgPSBbJ0phbicsJ0ZlYicsJ01hcicsJ0FwcicsJ01heScsJ0p1bicsJ0p1bCcsJ0F1ZycsJ1NlcCcsJ09jdCcsJ05vdicsJ0RlYyddO1xuICAgIGNvbnN0IGVuZE9mTW9udGggPSAoc3RhcnQ6IERhdGUpID0+XG4gICAgICBuZXcgRGF0ZShEYXRlLlVUQyhzdGFydC5nZXRVVENGdWxsWWVhcigpLCBzdGFydC5nZXRVVENNb250aCgpICsgMSwgMCkpO1xuICAgIC8vIFwic3RhcnQgKyBvbmUgcGVyaW9kXCIsIGEgUk9MTElORyB3aW5kb3cgXHUyMDE0IGNhbGVuZGFyLXRydWUgb25seSBiZWNhdXNlIGFcbiAgICAvLyBoYW5kLWZpbGxlZCBgcGVyaW9kX3N0YXJ0YCBvZmYgYSBjYWxlbmRhciBib3VuZGFyeSBpcyBub3cgUkVGVVNFRCBieVxuICAgIC8vIGBwZXJpb2Rfc3RhcnRfZmlyc3Rfb2ZfcGVyaW9kYCAvIGBxdWFydGVyX3N0YXJ0c19vbl9xdWFydGVyX2JvdW5kYXJ5YCBpblxuICAgIC8vIGBmb3JlY2FzdC5vYmplY3QudHNgICgjMTAwOCkuIEJlZm9yZSB0aGF0IHJ1bGUsIGAyMDI2LTA4LTE1YCArIGBxdWFydGVyYFxuICAgIC8vIGRlcml2ZWQgYDIwMjYtMTAtMzFgIHVuZGVyIHRoZSBsYWJlbCBgUTMgMjAyNmAuXG4gICAgY29uc3QgZW5kT2ZRdWFydGVyID0gKHN0YXJ0OiBEYXRlKSA9PlxuICAgICAgbmV3IERhdGUoRGF0ZS5VVEMoc3RhcnQuZ2V0VVRDRnVsbFllYXIoKSwgc3RhcnQuZ2V0VVRDTW9udGgoKSArIDMsIDApKTtcbiAgICAvLyBGaXJzdCBkYXkgb2YgdGhlIGNhbGVuZGFyIHBlcmlvZCBDT05UQUlOSU5HIGBkYCBcdTIwMTQgdGhlIGludmVyc2Ugb2YgdGhlXG4gICAgLy8gdHdvIGhlbHBlcnMgYWJvdmUsIGFuZCB0aGUgcGllY2UgYSBmbG93IHRlbXBsYXRlIGNhbm5vdCBleHByZXNzLlxuICAgIGNvbnN0IHN0YXJ0T2ZQZXJpb2QgPSAocGVyaW9kOiBzdHJpbmcsIGQ6IERhdGUpID0+XG4gICAgICBuZXcgRGF0ZShEYXRlLlVUQyhcbiAgICAgICAgZC5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgICBwZXJpb2QgPT09ICdxdWFydGVyJyA/IE1hdGguZmxvb3IoZC5nZXRVVENNb250aCgpIC8gMykgKiAzIDogZC5nZXRVVENNb250aCgpLFxuICAgICAgICAxLFxuICAgICAgKSk7XG4gICAgY29uc3QgbGFiZWxGb3IgPSAocGVyaW9kOiBzdHJpbmcsIHN0YXJ0OiBEYXRlKSA9PiB7XG4gICAgICBpZiAocGVyaW9kID09PSAncXVhcnRlcicpIHtcbiAgICAgICAgY29uc3QgcSA9IE1hdGguZmxvb3Ioc3RhcnQuZ2V0VVRDTW9udGgoKSAvIDMpICsgMTtcbiAgICAgICAgcmV0dXJuIGBRJHtxfSAke3N0YXJ0LmdldFVUQ0Z1bGxZZWFyKCl9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtNT05USFNbc3RhcnQuZ2V0VVRDTW9udGgoKV19ICR7c3RhcnQuZ2V0VVRDRnVsbFllYXIoKX1gO1xuICAgIH07XG5cbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgY29uc3QgcGVyaW9kID1cbiAgICAgICh0eXBlb2YgaW5wdXQucGVyaW9kID09PSAnc3RyaW5nJyAmJiBpbnB1dC5wZXJpb2QpIHx8XG4gICAgICAodHlwZW9mIHByZXZpb3VzPy5wZXJpb2QgPT09ICdzdHJpbmcnICYmIChwcmV2aW91cy5wZXJpb2QgYXMgc3RyaW5nKSkgfHxcbiAgICAgICdtb250aCc7XG4gICAgbGV0IHN0YXJ0U3RyID1cbiAgICAgICh0eXBlb2YgaW5wdXQucGVyaW9kX3N0YXJ0ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5wZXJpb2Rfc3RhcnQpIHx8XG4gICAgICAodHlwZW9mIHByZXZpb3VzPy5wZXJpb2Rfc3RhcnQgPT09ICdzdHJpbmcnICYmIChwcmV2aW91cy5wZXJpb2Rfc3RhcnQgYXMgc3RyaW5nKSkgfHxcbiAgICAgIHVuZGVmaW5lZDtcblxuICAgIC8vIE5vIHBlcmlvZF9zdGFydCBhbnl3aGVyZSBcdTIxRDIgc25hcHNob3QgdGhlIHBlcmlvZCB0aGF0IGNvbnRhaW5zIHRoZVxuICAgIC8vIHNuYXBzaG90IGRheSAoZmFsbGluZyBiYWNrIHRvIHRvZGF5KS4gYHBlcmlvZF9zdGFydGAgaXMgcmVxdWlyZWQgK1xuICAgIC8vIG5vdE51bGwsIHNvIGJlZm9yZSB0aGlzIHRoZSB3cml0ZSBzaW1wbHkgZmFpbGVkOyBkZXJpdmluZyBpdCBpcyB3aGF0XG4gICAgLy8gbWFrZXMgYHsgcGVyaW9kOiAncXVhcnRlcicgfWAgYSBjb21wbGV0ZSwgY2FsZW5kYXItdHJ1ZSBzbmFwc2hvdFxuICAgIC8vIHJlcXVlc3QgXHUyMDE0IHRoZSBvbmx5IHNoYXBlIGFuIGF1dG9tYXRlZCB3cml0ZXIgY2FuIGV4cHJlc3MuXG4gICAgaWYgKCFzdGFydFN0cikge1xuICAgICAgY29uc3QgYW5jaG9yU3RyID1cbiAgICAgICAgKHR5cGVvZiBpbnB1dC5zbmFwc2hvdF9kYXRlID09PSAnc3RyaW5nJyAmJiBpbnB1dC5zbmFwc2hvdF9kYXRlKSB8fFxuICAgICAgICAodHlwZW9mIHByZXZpb3VzPy5zbmFwc2hvdF9kYXRlID09PSAnc3RyaW5nJyAmJiAocHJldmlvdXMuc25hcHNob3RfZGF0ZSBhcyBzdHJpbmcpKSB8fFxuICAgICAgICBpc29EYXRlKG5ldyBEYXRlKCkpO1xuICAgICAgY29uc3QgYW5jaG9yID0gbmV3IERhdGUoYCR7YW5jaG9yU3RyLnNsaWNlKDAsIDEwKX1UMDA6MDA6MDBaYCk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihhbmNob3IuZ2V0VGltZSgpKSkge1xuICAgICAgICBzdGFydFN0ciA9IGlzb0RhdGUoc3RhcnRPZlBlcmlvZChwZXJpb2QsIGFuY2hvcikpO1xuICAgICAgICBpbnB1dC5wZXJpb2Rfc3RhcnQgPSBzdGFydFN0cjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhcnRTdHIpIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoYCR7c3RhcnRTdHJ9VDAwOjAwOjAwWmApO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oc3RhcnQuZ2V0VGltZSgpKSkge1xuICAgICAgICBjb25zdCBlbmQgPSBwZXJpb2QgPT09ICdxdWFydGVyJyA/IGVuZE9mUXVhcnRlcihzdGFydCkgOiBlbmRPZk1vbnRoKHN0YXJ0KTtcbiAgICAgICAgaWYgKCFpbnB1dC5wZXJpb2RfZW5kKSBpbnB1dC5wZXJpb2RfZW5kID0gaXNvRGF0ZShlbmQpO1xuICAgICAgICBpZiAoIWlucHV0LnBlcmlvZF9sYWJlbCkgaW5wdXQucGVyaW9kX2xhYmVsID0gbGFiZWxGb3IocGVyaW9kLCBzdGFydCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbnB1dC5zbmFwc2hvdF9kYXRlICYmICFwcmV2aW91cz8uc25hcHNob3RfZGF0ZSkge1xuICAgICAgaW5wdXQuc25hcHNob3RfZGF0ZSA9IGlzb0RhdGUobmV3IERhdGUoKSk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZm9yZWNhc3REZXJpdmU7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2xlYWQuaG9vay50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvbGVhZC5ob29rLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tDb250ZXh0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEhvb2tBcGkgfSBmcm9tICcuL19ob29rLWFwaSc7XG5cbi8qKlxuICogTGVhZCBhdXRvbWF0aW9uIGhvb2suXG4gKlxuICogLSBBdXRvLXNjb3JlcyBpbmNvbWluZyBsZWFkcyBpbnRvIGByYXRpbmdgICgxLTUpIHVzaW5nIGluZHVzdHJ5L3RpdGxlL2VtYWlsL3Bob25lIHdlaWdodHMuXG4gKiAtIFJlZnVzZXMgZWRpdHMgdG8gYSBjb252ZXJ0ZWQgbGVhZCBcdTIwMTQgYnV0IG5vdCB0aGUgZW5naW5lJ3MgcmVmZXJlbmNlIGNsZWFudXAsXG4gKiAgIHNvIGEgY29udmVydGVkIGxlYWQgbmV2ZXIgbWFrZXMgaXRzIGNvbnZlcnNpb24gcHJvZHVjdHMgdW5kZWxldGFibGUuXG4gKiAtIFdoZW4gc3RhdHVzIGZsaXBzIHRvIGBxdWFsaWZpZWRgLCBzY2hlZHVsZXMgYSBmb2xsb3ctdXAgYGNybV90YXNrYCBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAqIC0gTm9ybWFsaXplcyBgZW1haWxgIGFuZCBmbGFncyBhIHJlLWNhcHR1cmVkIGFkZHJlc3MgYXMgYSBzdXNwZWN0ZWQgZHVwbGljYXRlLlxuICovXG5cbi8vIFx1MjZBMFx1RkUwRiBUaGUgc2NvcmluZyBjb25zdGFudHMgYW5kIGBjb21wdXRlUmF0aW5nYCBsaXZlIElOU0lERSBgbGVhZF9hdXRvbWF0aW9uYCdzXG4vLyBoYW5kbGVyOiBMMiBob29rIGJvZGllcyBydW4gYm9keS1vbmx5IGluIHRoZSBRdWlja0pTIHNhbmRib3gsIHNvIG1vZHVsZSBzY29wZVxuLy8gaXMgbm90IHJlYWNoYWJsZSBhdCBydW50aW1lLiBUdW5lIHRoZSB3ZWlnaHRzIGluIHRoZSBoYW5kbGVyIFx1MjAxNCBhIG1vZHVsZS1sZXZlbFxuLy8gY29weSBpcyBkZWFkIGNvZGUgdGhhdCBzaWxlbnRseSBkaXZlcmdlcyBmcm9tIHRoZSBjb3B5IHRoYXQgYWN0dWFsbHkgcnVucy5cblxuLyoqXG4gKiBMZWFkIGF1dG8tYXNzaWdubWVudCAobG9hZC1iYWxhbmNlZCByb3VuZC1yb2JpbikuXG4gKlxuICogQSBsZWFkIGNyZWF0ZWQgd2l0aG91dCBhbiBvd25lciAoQ1NWIGltcG9ydCwgd2ViLXRvLWxlYWQsIEFQSSBjYXB0dXJlKSBpc1xuICogYXNzaWduZWQgdG8gdGhlIHNhbGVzIHJlcCB3aXRoIHRoZSBGRVdFU1Qgb3BlbiBsZWFkcyBcdTIwMTQgYSBzZWxmLWJhbGFuY2luZ1xuICogcm91bmQtcm9iaW4gdGhhdCBuZWVkcyBubyByb3RhdGlvbiBjb3VudGVyLiBJdCB3cml0ZXMgYG93bmVyX2lkYCwgdGhlIHBsYXRmb3JtXG4gKiBvd25lcnNoaXAgYW5jaG9yIHRoYXQgT1dELCBzaGFyaW5nIGFuZCB0aGUgXCJNeSBMZWFkc1wiIHZpZXcgYWxsIHJlYWQsIHNvIHRoZVxuICogYXNzaWduZWQgcmVwIHJlYWxseSBvd25zIHRoZSBsZWFkIHJhdGhlciB0aGFuIG1lcmVseSBiZWluZyBuYW1lZCBvbiBpdC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgV3JpdGluZyBhIEZPUkVJR04gb3duZXIgaXMgbm9ybWFsbHkgYW4gb3duZXJzaGlwIHRyYW5zZmVyLCBkZW5pZWQgd2l0aG91dFxuICogYGFsbG93VHJhbnNmZXJgICgjMzAwNCkuIEl0IHBhc3NlcyBoZXJlIGJlY2F1c2Ugb2YgV0hFUkUgdGhpcyBydW5zLCBub3Qgd2hhdFxuICogaXQgaXMgZ3JhbnRlZDogYSBgYmVmb3JlSW5zZXJ0YCBob29rIG11dGF0ZXMgYG9wQ3R4LmRhdGFgIElOU0lERSB0aGUgb3BlcmF0aW9uXG4gKiB0aGUgc2VjdXJpdHkgbWlkZGxld2FyZSBhbHJlYWR5IHdyYXBwZWQsIHNvIHRoZSBndWFyZCByZWFkIChhbmQgc3RhbXBlZCkgdGhlXG4gKiBwYXlsb2FkIGJlZm9yZSB0aGlzIGxpbmUgY2hhbmdlZCBpdC4gYHRlc3Qvb3duZXJzaGlwLW1vZGVsLnRlc3QudHNgIHBpbnMgdGhhdFxuICogb3JkZXJpbmcgYWdhaW5zdCBhIHJlYWwgT2JqZWN0UUwgXHUyMDE0IGFuIGFzc3VtcHRpb24gaGVyZSB3b3VsZCBiZSB0aGUgZGlmZmVyZW5jZVxuICogYmV0d2VlbiByb3VuZC1yb2JpbiB3b3JraW5nIGFuZCBldmVyeSB3ZWItdG8tbGVhZCBzdWJtaXNzaW9uIDQwMy1pbmcuXG4gKlxuICogVGhlIHJlcCBwb29sIGlzIHdob2V2ZXIgaG9sZHMgdGhlIGBzYWxlc19yZXBgIHBvc2l0aW9uIChgc3lzX3VzZXJfcG9zaXRpb25gKS5cbiAqIFdoZW4gdGhhdCBwb29sIGlzIGVtcHR5IChhIGZyZXNoIG9yZyBiZWZvcmUgcG9zaXRpb25zIGFyZSBhc3NpZ25lZCkgdGhlIGhvb2tcbiAqIGlzIGEgTk8tT1AgYW5kIHRoZSBsZWFkIGtlZXBzIHdoYXRldmVyIG93bmVyIGl0IGhhZCBcdTIwMTQgaXQgbmV2ZXIgYmxvY2tzIGxlYWRcbiAqIGNyZWF0aW9uLiBVSS1jcmVhdGVkIGxlYWRzIGFscmVhZHkgY2FycnkgYG93bmVyX2lkYCA9IGNyZWF0b3IgKHRoZVxuICogbWlkZGxld2FyZSdzIGluc2VydC10aW1lIHN0YW1wKSwgc28gdGhpcyBvbmx5IGZpcmVzIG9uIGdlbnVpbmVseSBvd25lcmxlc3NcbiAqIGludGFrZS5cbiAqXG4gKiBSdW5zIGJlZm9yZUluc2VydCBzbyB0aGUgZG93bnN0cmVhbSBgbGVhZF9hc3NpZ25tZW50YCBmbG93IChhZnRlckluc2VydCkgc2Vlc1xuICogdGhlIGFzc2lnbmVkIG93bmVyIGFuZCByb3V0ZXMgaXRzIFNMQSBhbGVydCB0byB0aGF0IHJlcC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgUHJpb3JpdHkgMjUwIFx1MjAxNCBob29rcyBydW4gaW4gQVNDRU5ESU5HIHByaW9yaXR5IG9yZGVyLCBzbyB0aGlzIG11c3QgcnVuXG4gKiBBRlRFUiBgbGVhZF9hdXRvbWF0aW9uYCAoMjAwKSwgd2hvc2UgZ3Vlc3QgYnJhbmNoIHN0cmlwcyBhIGNsaWVudC1zcG9vZmVkXG4gKiBgb3duZXJfaWRgIGZyb20gYW5vbnltb3VzIFdlYi10by1MZWFkIHN1Ym1pc3Npb25zLiBBc3NpZ25pbmcgZmlyc3QgYW5kIGJlaW5nXG4gKiBzdHJpcHBlZCBhZnRlcndhcmRzIGxhbmRzIGV2ZXJ5IHdlYi10by1sZWFkIG93bmVybGVzcyBcdTIwMTQgdGhlIGV4YWN0IGNhc2UgdGhpc1xuICogaG9vayBleGlzdHMgZm9yLlxuICovXG5jb25zdCBsZWFkQXV0b0Fzc2lnbkhvb2s6IEhvb2sgPSB7XG4gIG5hbWU6ICdsZWFkX2F1dG9fYXNzaWduJyxcbiAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0J10sXG4gIHByaW9yaXR5OiAyNTAsXG4gIGRlc2NyaXB0aW9uOiAnQXNzaWduIG93bmVybGVzcyBuZXcgbGVhZHMgdG8gdGhlIGxlYXN0LWxvYWRlZCBzYWxlcyByZXAuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgLy8gUmVzcGVjdCBhbiBleHBsaWNpdCAvIGNyZWF0b3ItYXNzaWduZWQgb3duZXIuIE9uIGEgd3JpdGUgdGhhdCBjYXJyaWVzIGFcbiAgICAvLyB1c2VyIHRoZSBzZWN1cml0eSBtaWRkbGV3YXJlIGhhcyBBTFJFQURZIHN0YW1wZWQgYG93bmVyX2lkYCB0byB0aGF0IHVzZXJcbiAgICAvLyBieSB0aGUgdGltZSB0aGlzIHJ1bnMsIHNvIHRoaXMgaXMgYWxzbyB3aGF0IG1ha2VzIHRoZSBob29rIGEgbm8tb3AgZm9yXG4gICAgLy8gb3JkaW5hcnkgVUkgY3JlYXRpb24gXHUyMDE0IG9ubHkgZ2VudWluZWx5IG93bmVybGVzcyBpbnRha2UgZmFsbHMgdGhyb3VnaC5cbiAgICBpZiAodHlwZW9mIGlucHV0Lm93bmVyX2lkID09PSAnc3RyaW5nJyAmJiBpbnB1dC5vd25lcl9pZCkgcmV0dXJuO1xuICAgIGNvbnN0IGFwaSA9IGN0eC5hcGkgYXMgSG9va0FwaSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFwaSkgcmV0dXJuO1xuXG4gICAgLy8gQXV0by1hc3NpZ25tZW50IGlzIGEgYmVzdC1lZmZvcnQgRU5IQU5DRU1FTlQgXHUyMDE0IGl0IG11c3QgTkVWRVIgYmxvY2sgbGVhZFxuICAgIC8vIGNyZWF0aW9uLiBJbiBwYXJ0aWN1bGFyIGFuIGFub255bW91cyBXZWItdG8tTGVhZCBzdWJtaXNzaW9uIHJ1bnMgdW5kZXIgdGhlXG4gICAgLy8gcHVibGljLWZvcm0gZ3JhbnQsIHdoaWNoIHBlcm1pdHMgb25seSBjcmVhdGUvcmVhZC1iYWNrIG9uIGNybV9sZWFkIGFuZFxuICAgIC8vIERFTklFUyBgZmluZGAgb24gc3lzX3VzZXJfcG9zaXRpb247IGxldHRpbmcgdGhhdCBkZW5pYWwgcHJvcGFnYXRlIHdvdWxkXG4gICAgLy8gcmVqZWN0IHRoZSB3aG9sZSBpbnNlcnQgYW5kIGJyZWFrIHRoZSBwdWJsaWMgZm9ybS4gU28gdGhlIHBvb2wgbG9va3VwICtcbiAgICAvLyBsb2FkIGJhbGFuY2luZyBhcmUgd3JhcHBlZDogb24gQU5ZIGVycm9yIChwZXJtaXNzaW9uLCBldGMuKSB3ZSBsb2cgYW5kXG4gICAgLy8gbGVhdmUgdGhlIGxlYWQgb3duZXJsZXNzIChhIG1hbmFnZXIgLyB0aGUgbGVhZF9hc3NpZ25tZW50IGZsb3cgcm91dGVzIGl0KS5cbiAgICB0cnkge1xuICAgICAgLy8gUmVwIHBvb2wgPSBob2xkZXJzIG9mIHRoZSBzYWxlc19yZXAgcG9zaXRpb24uXG4gICAgICBjb25zdCBob2xkZXJzID0gYXdhaXQgYXBpLm9iamVjdCgnc3lzX3VzZXJfcG9zaXRpb24nKS5maW5kKHtcbiAgICAgICAgd2hlcmU6IHsgcG9zaXRpb246ICdzYWxlc19yZXAnIH0sIGZpZWxkczogWyd1c2VyX2lkJ10sIHRvcDogMTAwMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVwSWRzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChcbiAgICAgICAgICAoaG9sZGVycyA/PyBbXSlcbiAgICAgICAgICAgIC5tYXAoKHIpID0+ICh0eXBlb2Ygci51c2VyX2lkID09PSAnc3RyaW5nJyA/IHIudXNlcl9pZCA6ICcnKSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbiksXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgaWYgKHJlcElkcy5sZW5ndGggPT09IDApIHJldHVybjsgLy8gbm8gcG9vbCBcdTIxOTIgbGVhdmUgb3duZXJsZXNzIChuby1vcClcblxuICAgICAgLy8gUGljayB0aGUgcmVwIHdpdGggdGhlIGZld2VzdCBPUEVOIChub24tY29udmVydGVkKSBsZWFkcy5cbiAgICAgIGxldCBiZXN0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgYmVzdENvdW50ID0gSW5maW5pdHk7XG4gICAgICBmb3IgKGNvbnN0IHJlcElkIG9mIHJlcElkcykge1xuICAgICAgICBjb25zdCBvcGVuQ291bnQgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fbGVhZCcpLmNvdW50KHtcbiAgICAgICAgICB3aGVyZTogeyBvd25lcl9pZDogcmVwSWQsIGlzX2NvbnZlcnRlZDogZmFsc2UgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvcGVuQ291bnQgPCBiZXN0Q291bnQpIHtcbiAgICAgICAgICBiZXN0Q291bnQgPSBvcGVuQ291bnQ7XG4gICAgICAgICAgYmVzdCA9IHJlcElkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYmVzdCkgaW5wdXQub3duZXJfaWQgPSBiZXN0O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3dhbGxvdzogYXV0by1hc3NpZ25tZW50IG11c3QgbmV2ZXIgYmxvY2sgdGhlIGluc2VydC4gQ29tbW9uIGNhc2UgaXMgdGhlXG4gICAgICAvLyBhbm9ueW1vdXMgcHVibGljLWZvcm0gY29udGV4dCwgd2hpY2ggY2FuJ3QgcmVhZCBzeXNfdXNlcl9wb3NpdGlvbiBcdTIwMTQgdGhlXG4gICAgICAvLyBsZWFkIGlzIHN0aWxsIGNhcHR1cmVkLCBvd25lcmxlc3MsIGZvciBkb3duc3RyZWFtIHJvdXRpbmcuIChObyBgY29uc29sZWBcbiAgICAgIC8vIGhlcmUgXHUyMDE0IHRoZSBMMiBob29rIHNhbmRib3ggZG9lc24ndCBkZWZpbmUgaXQuKVxuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGxlYWRIb29rOiBIb29rID0ge1xuICBuYW1lOiAnbGVhZF9hdXRvbWF0aW9uJyxcbiAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZScsICdhZnRlclVwZGF0ZSddLFxuICBwcmlvcml0eTogMjAwLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnU2NvcmUgbmV3IGxlYWRzLCBsb2NrIGNvbnZlcnRlZCBsZWFkcywgYW5kIGNyZWF0ZSBmb2xsb3ctdXAgdGFzayBvbiBxdWFsaWZpY2F0aW9uLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgLy8gVGhlIHJlZnVzYWwgZW52ZWxvcGUgKCMxMDc1KS4gTWlycm9yZWQgZnJvbSBgLi9fcmVmdXNhbC50c2AgYmVjYXVzZSBhXG4gICAgLy8gbG93ZXJlZCBib2R5IGhhcyBubyBtb2R1bGUgc2NvcGUgYW5kIGBleHRyYWN0SG9va0JvZHlgIFRIUk9XUyBvbiBhblxuICAgIC8vIGltcG9ydDsgYHRlc3QvcmVmdXNhbC1lbnZlbG9wZS50ZXN0LnRzYCBwaW5zIGV2ZXJ5IGNvcHkgYWdhaW5zdCBpdC5cbiAgICBmdW5jdGlvbiByZWZ1c2UoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb2RlOiBzdHJpbmcsXG4gICAgICBzdGF0dXM6IG51bWJlcixcbiAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmcgPSBtZXNzYWdlLFxuICAgICk6IEVycm9yIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29kZTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZztcbiAgICAgIH07XG4gICAgICBlcnIuY29kZSA9IGNvZGU7XG4gICAgICBlcnIuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgZXJyLnVzZXJNZXNzYWdlID0gdXNlck1lc3NhZ2U7XG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjb25zdCB7IGV2ZW50LCBpbnB1dCB9ID0gY3R4O1xuXG4gICAgY29uc3QgSElHSF9WQUxVRV9JTkRVU1RSSUVTID0gbmV3IFNldChbJ3RlY2hub2xvZ3knLCAnZmluYW5jZScsICdoZWFsdGhjYXJlJ10pO1xuICAgIGNvbnN0IFNFTklPUl9USVRMRV9QQVRURVJOID0gL1xcYihjZW98Y3RvfGNmb3xjaW98Y29vfGZvdW5kZXJ8dnB8dmljZSBwcmVzaWRlbnR8ZGlyZWN0b3J8aGVhZCBvZilcXGIvaTtcbiAgICBmdW5jdGlvbiBjb21wdXRlUmF0aW5nKGlucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IG51bWJlciB7XG4gICAgICBsZXQgc2NvcmUgPSAwO1xuICAgICAgY29uc3QgZW1haWwgPSB0eXBlb2YgaW5wdXQuZW1haWwgPT09ICdzdHJpbmcnID8gaW5wdXQuZW1haWwgOiAnJztcbiAgICAgIGNvbnN0IHBob25lID0gdHlwZW9mIGlucHV0LnBob25lID09PSAnc3RyaW5nJyA/IGlucHV0LnBob25lIDogJyc7XG4gICAgICBjb25zdCB0aXRsZSA9IHR5cGVvZiBpbnB1dC50aXRsZSA9PT0gJ3N0cmluZycgPyBpbnB1dC50aXRsZSA6ICcnO1xuICAgICAgY29uc3QgaW5kdXN0cnkgPSB0eXBlb2YgaW5wdXQuaW5kdXN0cnkgPT09ICdzdHJpbmcnID8gaW5wdXQuaW5kdXN0cnkgOiAnJztcbiAgICAgIGNvbnN0IGVtcGxveWVlcyA9IHR5cGVvZiBpbnB1dC5udW1iZXJfb2ZfZW1wbG95ZWVzID09PSAnbnVtYmVyJyA/IGlucHV0Lm51bWJlcl9vZl9lbXBsb3llZXMgOiAwO1xuICAgICAgY29uc3QgcmV2ZW51ZSA9IHR5cGVvZiBpbnB1dC5hbm51YWxfcmV2ZW51ZSA9PT0gJ251bWJlcicgPyBpbnB1dC5hbm51YWxfcmV2ZW51ZSA6IDA7XG4gICAgICBpZiAoZW1haWwgJiYgIS8oZ21haWx8eWFob298aG90bWFpbHxvdXRsb29rfHFxfDE2MylcXC5jb20kL2kudGVzdChlbWFpbCkpIHNjb3JlICs9IDE7XG4gICAgICBpZiAocGhvbmUubGVuZ3RoID4gMCkgc2NvcmUgKz0gMC41O1xuICAgICAgaWYgKFNFTklPUl9USVRMRV9QQVRURVJOLnRlc3QodGl0bGUpKSBzY29yZSArPSAxLjU7XG4gICAgICBpZiAoSElHSF9WQUxVRV9JTkRVU1RSSUVTLmhhcyhpbmR1c3RyeSkpIHNjb3JlICs9IDE7XG4gICAgICBpZiAoZW1wbG95ZWVzID49IDIwMCkgc2NvcmUgKz0gMC41O1xuICAgICAgaWYgKHJldmVudWUgPj0gMTBfMDAwXzAwMCkgc2NvcmUgKz0gMC41O1xuICAgICAgLy8gQ2FwIGF0IDUsIGZsb29yIGF0IDEsIHJvdW5kIHRvIFdIT0xFIHN0YXJzIFx1MjAxNCBgcmF0aW5nYCBpcyBhIDEtNSBzdGFyXG4gICAgICAvLyBmaWVsZDsgaGFsZiB2YWx1ZXMgcmVuZGVyZWQgaW5jb25zaXN0ZW50bHkgaW4gdGhlIHN0YXIgd2lkZ2V0LlxuICAgICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWF4KDEsIE1hdGgubWluKDUsIHNjb3JlKSk7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChjbGFtcGVkKTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVJbnNlcnQnKSB7XG4gICAgICAvLyBXZWItdG8tTGVhZDogYW5vbnltb3VzIHN1Ym1pc3Npb25zIGZyb20gdGhlIHB1YmxpYyBmb3JtIGdldCBzZW5zaWJsZVxuICAgICAgLy8gZGVmYXVsdHMgc3RhbXBlZCBzZXJ2ZXItc2lkZSBzbyB0aGV5IGNhbm5vdCBiZSBzcG9vZmVkIGJ5IHRoZSBjbGllbnQuXG4gICAgICAvLyBHdWVzdHMgYXJlIHVuYXV0aGVudGljYXRlZCwgc28gd2UgaWRlbnRpZnkgdGhlbSBieSB0aGUgYWJzZW5jZSBvZlxuICAgICAgLy8gYGN0eC51c2VyPy5pZGAuIChUaGUgYGd1ZXN0X3BvcnRhbGAgcHJvZmlsZSBhbHJlYWR5IHJlc3RyaWN0cyB0aGVtIHRvXG4gICAgICAvLyBJTlNFUlQtb25seSBvbiBgY3JtX2xlYWRgLilcbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgYCFjdHguc2Vzc2lvbj8uaXNTeXN0ZW1gIGlzIHJlcXVpcmVkLCBub3QgZGVjb3JhdGlvbjogYSBTWVNURU0gd3JpdGVcbiAgICAgIC8vIChzZWVkIGxvYWQsIGJhY2tmaWxsLCBzZWVkLW93bmVyc2hpcCBjbGFpbSkgYWxzbyBhcnJpdmVzIHdpdGggbm8gdXNlciBpZCwgYW5kXG4gICAgICAvLyB0aGUgc3RyaXAgYmVsb3cgd291bGQgb3RoZXJ3aXNlIGJsYW5rIHRoZSBvd25lciBhbmQgY29udmVyc2lvbiBzdGF0ZSBvZlxuICAgICAgLy8gZXZlcnkgc3lzdGVtLXdyaXR0ZW4gbGVhZC4gVGhlIGNvbnZlcnRlZC1sZWFkIGxvY2sgZnVydGhlciBkb3duIHJlYWRzXG4gICAgICAvLyB0aGF0IHNhbWUgYWJzZW5jZSBhcyB0aGUgc3lzdGVtLXdyaXRlIHNpZ25hbCwgc28gdGhlIHR3byByZWFkaW5ncyBoYXZlXG4gICAgICAvLyB0byBhZ3JlZS4gYGNhc2UuaG9vay50c2AncyBndWVzdCBicmFuY2ggY2FycmllcyB0aGUgc2FtZSBjb3JyZWN0aW9uLlxuICAgICAgY29uc3QgaXNHdWVzdFN1Ym1pc3Npb24gPSAhY3R4LnVzZXI/LmlkICYmICFjdHguc2Vzc2lvbj8uaXNTeXN0ZW07XG4gICAgICBpZiAoaXNHdWVzdFN1Ym1pc3Npb24pIHtcbiAgICAgICAgaWYgKCFpbnB1dC5sZWFkX3NvdXJjZSkgaW5wdXQubGVhZF9zb3VyY2UgPSAnd2ViJztcbiAgICAgICAgaWYgKCFpbnB1dC5zdGF0dXMpICAgICAgaW5wdXQuc3RhdHVzICAgICAgPSAnbmV3JztcbiAgICAgICAgLy8gTmV2ZXIgdHJ1c3QgY2xpZW50LXN1cHBsaWVkIGNvbnZlcnNpb24gLyBvd25lcnNoaXAgZmllbGRzIG9uIGEgcHVibGljXG4gICAgICAgIC8vIGZvcm0gXHUyMDE0IE9WRVJXUklURSB0aGVtIHdpdGggYSBzYWZlIHZhbHVlLlxuICAgICAgICAvL1xuICAgICAgICAvLyBcdTI3MDUgSElTVE9SWSwgUkVTT0xWRUQgXHUyMDE0IGFuZCB0aGUgY29uY2x1c2lvbiBpcyB1bmNoYW5nZWQuIFRocm91Z2hcbiAgICAgICAgLy8gMTcuMi4wLCBgZGVsZXRlIGlucHV0LnhgIGluIGEgaG9vayB3YXMgYSBTSUxFTlQgTk8tT1A6IE9iamVjdFFMJ3NcbiAgICAgICAgLy8gZmxhdC1yZWNvcmQgaW5wdXQgUHJveHkgaGFkIG5vIGBkZWxldGVQcm9wZXJ0eWAgdHJhcCwgc28gdGhlIGtleVxuICAgICAgICAvLyBzdXJ2aXZlZCB0aGUgZGVsZXRlIGFuZCByZWFjaGVkIHN0b3JhZ2UsIHdoaWxlIGFuIEFTU0lHTk1FTlQgdG8gdGhlXG4gICAgICAgIC8vIHNhbWUga2V5IG9uIHRoZSBzYW1lIGBpbnB1dGAgbGFuZGVkIG5vcm1hbGx5LiBUaGlzIGJsb2NrIHdhcyB0ZW5cbiAgICAgICAgLy8gYGRlbGV0ZWAgc3RhdGVtZW50cyBhbmQgZXZlcnkgb25lIG9mIHRoZW0gZGlkIG5vdGhpbmc7IHRoZSBzeW1wdG9tIHdhc1xuICAgICAgICAvLyBhIGd1ZXN0IGluc2VydCBzdG9yaW5nIGBpc19jb252ZXJ0ZWQ6IHRydWVgIGFuZCBhbiBgb3duZXJfaWRgIGl0XG4gICAgICAgIC8vIHN1cHBsaWVkIGl0c2VsZi4gQXNzaWdubWVudCBpcyB3aGF0IHRoaXMgYmxvY2sgdXNlcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVXBzdHJlYW0gb2JqZWN0c3RhY2sjMTIyNzcgc2hpcHBlZCBpbiAqKjE3LjMuMCoqLCBzbyBldmVyeSBsYXRlclxuICAgICAgICAvLyBwaW4gY2FycmllcyB0aGUgZml4IGFuZCBgZGVsZXRlYCBpcyBlZmZlY3RpdmUgb24gYm90aCBleGVjdXRpb24gcGF0aHMuXG4gICAgICAgIC8vIFx1MjZENCBUaGF0IGlzIHN0aWxsIG5vdCBhIGxpY2VuY2UgdG8gc3BlbGwgdGhpcyBibG9jayB3aXRoIGBkZWxldGVgOiB0aGVcbiAgICAgICAgLy8gYXNzaWdubWVudHMgYXJlIGxvYWQtYmVhcmluZyBhcyBXUklURVMgXHUyMDE0IGBsZWFkX2R1cGxpY2F0ZV9jaGVja2Agc3RhbmRzXG4gICAgICAgIC8vIGRvd24gb25seSBvbiBhIE5PTi1CTEFOSyB2ZXJkaWN0LCBzbyB0aGVzZSBjb2x1bW5zIG11c3QgYXJyaXZlIGBudWxsYFxuICAgICAgICAvLyByYXRoZXIgdGhhbiBBQlNFTlQuIGBjYXNlLmhvb2sudHNgJ3MgY29weSBjYXJyaWVzIHRoZSBmdWxsIG5vdGUgYW5kXG4gICAgICAgIC8vIHRoZSBtZWFzdXJlbWVudDsgYHRlc3QvaG9vay1pbnB1dC1zaGFwZS50ZXN0LnRzYCBwaW5zIHRoZSBuZXcgY29udHJhY3QuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGBudWxsYCBpcyB0aGUgbm8tdmFsdWUgc3BlbGxpbmcgdGhyb3VnaG91dCwgYW5kIGl0IGlzIGxvYWQtYmVhcmluZ1xuICAgICAgICAvLyB0d2ljZSBvdmVyOiBgbGVhZF9hdXRvX2Fzc2lnbmAgc3RhbmRzIGRvd24gb25seSBvbiBhIG5vbi1lbXB0eSBTVFJJTkdcbiAgICAgICAgLy8gYG93bmVyX2lkYCwgYW5kIGBsZWFkX2R1cGxpY2F0ZV9jaGVja2Agc3RhbmRzIGRvd24gb25seSBvbiBhIE5PTi1CTEFOS1xuICAgICAgICAvLyBgZHVwbGljYXRlX3N0YXR1c2AgLyBgZHVwbGljYXRlX29mX3R5cGVgIFx1MjAxNCB3aGVyZSBpdHMgb3duIGBpc0JsYW5rYFxuICAgICAgICAvLyBjb3VudHMgYG51bGxgIGFzIGJsYW5rLiBCb3RoIHRoZXJlZm9yZSBzdGlsbCBydW4gb24gYSBzYW5pdGlzZWQgZ3Vlc3RcbiAgICAgICAgLy8gc3VibWlzc2lvbiwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHRoZSByZW1vdmVkIGRlbGV0ZXMgd2VyZSBmb3IuXG4gICAgICAgIGlucHV0LmlzX2NvbnZlcnRlZCAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgaW5wdXQuY29udmVydGVkX2FjY291bnQgICAgICA9IG51bGw7XG4gICAgICAgIGlucHV0LmNvbnZlcnRlZF9jb250YWN0ICAgICAgPSBudWxsO1xuICAgICAgICBpbnB1dC5jb252ZXJ0ZWRfb3Bwb3J0dW5pdHkgID0gbnVsbDtcbiAgICAgICAgaW5wdXQuY29udmVydGVkX2RhdGUgICAgICAgICA9IG51bGw7XG4gICAgICAgIGlucHV0Lm93bmVyX2lkICAgICAgICAgICAgICAgPSBudWxsO1xuICAgICAgICAvLyBTYW1lIHJlYXNvbmluZyBmb3IgdGhlIGR1cGxpY2F0ZSBsaW5rOiBhIHN1Ym1pdHRlciB3aG8gY2FuIHBvc3RcbiAgICAgICAgLy8gYGR1cGxpY2F0ZV9zdGF0dXM6ICdjb25maXJtZWQnYCBjYW4gc3dpdGNoIE9GRiB0aGUgaW50YWtlIGRlZHVwZSBmb3JcbiAgICAgICAgLy8gdGhlaXIgb3duIHN1Ym1pc3Npb24gKGBsZWFkX2R1cGxpY2F0ZV9jaGVja2Agc3RhbmRzIGRvd24gb24gYSByZWNvcmRcbiAgICAgICAgLy8gdGhhdCBhbHJlYWR5IGNhcnJpZXMgYSB2ZXJkaWN0KSBhbmQgcGFyayBhIGxpbmsgdG8gYW55IHJlY29yZCBpZCB0aGV5XG4gICAgICAgIC8vIGNhcmUgdG8gZ3Vlc3MuIEd1ZXN0cyBzdGF0ZSBmYWN0cyBhYm91dCB0aGVtc2VsdmVzLCBuZXZlciBhYm91dCB0aGVcbiAgICAgICAgLy8gcGlwZWxpbmUuXG4gICAgICAgIGlucHV0LmR1cGxpY2F0ZV9vZl90eXBlICAgICAgPSBudWxsO1xuICAgICAgICBpbnB1dC5kdXBsaWNhdGVfb2ZfbGVhZCAgICAgID0gbnVsbDtcbiAgICAgICAgaW5wdXQuZHVwbGljYXRlX29mX2NvbnRhY3QgICA9IG51bGw7XG4gICAgICAgIGlucHV0LmR1cGxpY2F0ZV9zdGF0dXMgICAgICAgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGlucHV0LnJhdGluZyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgaW5wdXQucmF0aW5nID0gY29tcHV0ZVJhdGluZyhpbnB1dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFRoZSBjb252ZXJzaW9uIGFwcHJvdmFsIGdhdGUgKFJFUS0wMDA1IHN0ZXAgNykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBcdTMwMENcdTdFQkZcdTdEMjJcdTVCRjlcdTVFOTRcdTVCQTFcdTYyNzlcdTZENDFcdTdBMEJcdUZGMENcdTVCQTFcdTYyNzlcdTkwMUFcdThGQzdcdTU0MEVcdTY1QjlcdTUzRUZcdThGNkNcdTUzMTZcdTRFM0FcdTZCNjNcdTVGMEZcdTU1NDZcdTY3M0FcdTMwMEQuIFRoaXMgaXMgdGhlIFdSSVRFLVBBVEhcbiAgICAvLyBoYWxmIG9mIHRoZSBnYXRlOyBgY29udmVydF9sZWFkYCdzIGB2aXNpYmxlYCBwcmVkaWNhdGUgaXMgdGhlIG90aGVyLCBhbmRcbiAgICAvLyBpdCBvbmx5IGhpZGVzIGEgYnV0dG9uLiBIaWRpbmcgYSBidXR0b24gaXMgbm90IGEgY29udHJvbDogdGhlIGNvbnZlcnNpb25cbiAgICAvLyBzY3JlZW4gZmxvdyBpcyByZWFjaGFibGUgb3ZlciBSRVNUIChgUE9TVCAvYXV0b21hdGlvbi9sZWFkX2NvbnZlcnNpb24vXG4gICAgLy8gdHJpZ2dlcmApLCBhbmQgc28gaXMgYSBiYXJlIGBQQVRDSGAgdGhhdCBzZXRzIGBpc19jb252ZXJ0ZWRgIGl0c2VsZi4gQm90aFxuICAgIC8vIGxhbmQgSEVSRSwgYmVjYXVzZSBib3RoIGFyZSBhbiB1cGRhdGUgdG8gYGNybV9sZWFkYC5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBBIFRSQU5TSVRJT04gR0FURSwgbm90IGFuIGludmFyaWFudCAoQUdFTlRTLm1kIG1ldGFkYXRhIHNlbWFudGljcyBydWxlXG4gICAgLy8gNyksIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgYCF3YXNDb252ZXJ0ZWRgIHRlcm0gcmF0aGVyIHRoYW4gYSBjb21tZW50XG4gICAgLy8gY2xhaW1pbmcgaXQuIFRoZSByZWZ1c2FsIGlzIGNvbmRpdGlvbmVkIG9uIHRoZSByZWNvcmQgQ1JPU1NJTkcgaW50b1xuICAgIC8vIGNvbnZlcnRlZCBvbiBUSElTIHdyaXRlOyBhIGxlYWQgdGhhdCB3YXMgYWxyZWFkeSBjb252ZXJ0ZWQgYmVmb3JlIHRoZVxuICAgIC8vIGdhdGUgZXhpc3RlZCBpcyB1bnRvdWNoZWQgYnkgaXQgZm9yZXZlciwgd2hhdGV2ZXIgaXRzIGFwcHJvdmFsIGNvbHVtblxuICAgIC8vIHNheXMgKFJFUS0wMDA1IGFjY2VwdGFuY2UgNCkuIFx1MjZENCBOZXZlciByZXN0YXRlIHRoaXMgYXMgYSBgdmFsaWRhdGlvbnNbXWBcbiAgICAvLyBzY3JpcHQ6IGEgdmFsaWRhdGlvbiBpcyBldmFsdWF0ZWQgYWdhaW5zdCBgey4uLnByZXZpb3VzLCAuLi5kYXRhfWAsIHdoZXJlXG4gICAgLy8gXCJhbHJlYWR5IGNvbnZlcnRlZFwiIGFuZCBcImNvbnZlcnRpbmcgbm93XCIgYXJlIHRoZSBzYW1lIHN0YXRlLCBzbyBpdCB3b3VsZFxuICAgIC8vIGJyaWNrIGV2ZXJ5IGxhdGVyIHdyaXRlIHRvIGV2ZXJ5IGhpc3RvcmljYWwgY29udmVydGVkIGxlYWQuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgVGhlIHZlcmRpY3QgaXMgcmVhZCBvZmYgYHByZXZpb3VzYCwgbmV2ZXIgb2ZmIGBpbnB1dGAuIFRoZSBhcHByb3ZhbFxuICAgIC8vIGNvbHVtbiBpcyBgcmVhZG9ubHk6IHRydWVgLCBzbyBhIGNhbGxlci1zdXBwbGllZCB2YWx1ZSBpcyBzdHJpcHBlZCBiZWZvcmVcbiAgICAvLyBzdG9yYWdlIG9uIHRoZSBub24tc3lzdGVtIHBhdGggXHUyMDE0IGJ1dCBgc3RyaXBSZWFkb25seUZpZWxkc2AgaXMgbm90IGEgdGhpbmdcbiAgICAvLyB0aGlzIGd1YXJkIG1heSBsZWFuIG9uIChpdCBkb2VzIG5vdCBydW4gb24gaW5zZXJ0cywgbm9yIGZvciBhIHN5c3RlbVxuICAgIC8vIHdyaXRlKSwgYW5kIHJlYWRpbmcgdGhlIFNUT1JFRCB2ZXJkaWN0IGlzIHRoZSBjb3JyZWN0IHNlbWFudGljcyBhbnl3YXk6XG4gICAgLy8gd2hhdCBtYXkgY29udmVydCBhIGxlYWQgaXMgd2hhdCBhbiBhcHByb3ZlciBkZWNpZGVkLCBub3Qgd2hhdCB0aGUgd3JpdGVyXG4gICAgLy8gYXR0YWNoZWQgdG8gdGhlIHJlcXVlc3QuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgRmFpbCBPUEVOIG9uIGFuIGFic2VudCBvciB1bnJlY29nbmlzZWQgdmVyZGljdCwgYW5kIHRoYXQgaXMgdGhlIGdhdGUnc1xuICAgIC8vIG9mZiBzd2l0Y2gsIG5vdCBhbiBvdmVyc2lnaHQuIFdpdGggdGhlIGdhdGUgb2ZmIFx1MjAxNCB0aGUgc2hpcHBlZCBkZWZhdWx0IFx1MjAxNFxuICAgIC8vIGV2ZXJ5IGxlYWQgY2FycmllcyBgbm90X3JlcXVpcmVkYCwgYW5kIGEgbGVhZCB0aGF0IHByZWRhdGVzIHRoZSBjb2x1bW5cbiAgICAvLyBjYXJyaWVzIG5vdGhpbmcgYXQgYWxsOyBib3RoIG11c3QgY29udmVydCBleGFjdGx5IGFzIHRoZXkgZGlkIGJlZm9yZSB0aGlzXG4gICAgLy8gZmllbGQgZXhpc3RlZC4gU28gb25seSB0aGUgdHdvIHZlcmRpY3RzIGEgbGl2ZSBhcHByb3ZhbCBhY3R1YWxseSB3cml0ZXNcbiAgICAvLyByZWZ1c2UuIChgY29udmVydF9sZWFkYCdzIHByZWRpY2F0ZSBjYXJyaWVzIHRoZSBzYW1lIHBvbGFyaXR5IGFuZCB0aGVcbiAgICAvLyBzYW1lIHJlYXNvbiwgYWdhaW5zdCBpdHMgb3duIGZhaWwtQ0xPU0VEIG5laWdoYm91cnMuKVxuICAgIGlmIChldmVudCA9PT0gJ2JlZm9yZVVwZGF0ZScpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gY3R4LnByZXZpb3VzO1xuICAgICAgY29uc3Qgd2FzQ29udmVydGVkID0gcHJldmlvdXM/LmlzX2NvbnZlcnRlZCA9PT0gdHJ1ZSB8fCBwcmV2aW91cz8uc3RhdHVzID09PSAnY29udmVydGVkJztcbiAgICAgIGNvbnN0IGlzQ29udmVydGluZyA9XG4gICAgICAgICF3YXNDb252ZXJ0ZWQgJiYgKGlucHV0LmlzX2NvbnZlcnRlZCA9PT0gdHJ1ZSB8fCBpbnB1dC5zdGF0dXMgPT09ICdjb252ZXJ0ZWQnKTtcbiAgICAgIGNvbnN0IHZlcmRpY3QgPSBwcmV2aW91cz8uY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXM7XG4gICAgICBpZiAoaXNDb252ZXJ0aW5nICYmICh2ZXJkaWN0ID09PSAncGVuZGluZycgfHwgdmVyZGljdCA9PT0gJ3JlamVjdGVkJykpIHtcbiAgICAgICAgLy8gTmFtZSB0aGUgbGVhZCB0aGUgd2F5IGBkaXNwbGF5X3RpdGxlYCBkb2VzIFx1MjAxNCBzZWUgdGhlIGNvbnZlcnRlZC1sZWFkXG4gICAgICAgIC8vIGxvY2sgYmVsb3cgZm9yIHdoeSBhbiBpZCBuZXZlciBhcHBlYXJzIGluIGEgc2VudGVuY2UgYSB1c2VyIHJlYWRzLlxuICAgICAgICBjb25zdCBwZXJzb24gPSBbcHJldmlvdXM/LmZpcnN0X25hbWUsIHByZXZpb3VzPy5sYXN0X25hbWVdXG4gICAgICAgICAgLmZpbHRlcigocGFydCkgPT4gdHlwZW9mIHBhcnQgPT09ICdzdHJpbmcnICYmIHBhcnQudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAuam9pbignICcpO1xuICAgICAgICBjb25zdCBjb21wYW55ID1cbiAgICAgICAgICB0eXBlb2YgcHJldmlvdXM/LmNvbXBhbnkgPT09ICdzdHJpbmcnID8gcHJldmlvdXMuY29tcGFueS50cmltKCkgOiAnJztcbiAgICAgICAgY29uc3QgbGFiZWwgPSBbcGVyc29uLCBjb21wYW55XS5maWx0ZXIoQm9vbGVhbikuam9pbignIC0gJyk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdmVyZGljdCA9PT0gJ3JlamVjdGVkJyA/ICd3YXMgcmVqZWN0ZWQnIDogJ2lzIHN0aWxsIGF3YWl0aW5nIGFwcHJvdmFsJztcbiAgICAgICAgdGhyb3cgcmVmdXNlKFxuICAgICAgICAgIGBDYW5ub3QgY29udmVydCAke2xhYmVsID8gYGxlYWQgJHtsYWJlbH1gIDogJ3RoaXMgbGVhZCd9OiBpdHMgY29udmVyc2lvbiAke3N0YXRlfS4gQ29udmVyc2lvbiBvcGVucyBvbmNlIGFuIGFwcHJvdmVyIHNpZ25zIGl0IG9mZiBcdTIwMTQgdGhlIENvbnZlcnNpb24gQXBwcm92YWwgZmllbGQgb24gdGhlIGxlYWQgc2hvd3Mgd2hlcmUgaXQgc3RhbmRzLmAsXG4gICAgICAgICAgJ1JFQ09SRF9MT0NLRUQnLFxuICAgICAgICAgIDQwOSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0ZWQtbGVhZCBsb2NrIFx1MjAxNCBVU0VSIGVkaXRzIG9ubHkgKGBjdHgudXNlcj8uaWRgIGlzIHRoaXMgcmVwbydzXG4gICAgLy8gc3lzdGVtLXdyaXRlIHNpZ25hbCwgY2YuIG9wcG9ydHVuaXR5L3F1b3RlL2FjY291bnQgaG9va3MpOiBhIGJsYW5rZXRcbiAgICAvLyB0aHJvdyBhbHNvIHJlamVjdGVkIHN5c3RlbSB3cml0ZXMgKHNlZWQtb3duZXJzaGlwIGNsYWltcywgZmxvd1xuICAgIC8vIGJhY2tmaWxscykuIE5hcnJhdGl2ZSBub3RlcyBhbmQgZnJhbWV3b3JrLW1hbmFnZWQgY29sdW1ucyBzdGF5IGVkaXRhYmxlO1xuICAgIC8vIGlkZW50aXR5IGFuZCBjb252ZXJzaW9uIGZpZWxkcyBzdGF5IGxvY2tlZC5cbiAgICAvL1xuICAgIC8vIFRoaXMgaXMgdGhlIE9OTFkgY29udmVydGVkLWxlYWQgZ3VhcmQgXHUyMDE0IHRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBzZWNvbmQsXG4gICAgLy8gZnJpZW5kbGllciBzY3JpcHQgdmFsaWRhdGlvbiBvdmVyIHRoZSBzYW1lIGZvdXIgaWRlbnRpdHkgZmllbGRzLCBiZWNhdXNlXG4gICAgLy8gdGhpcyB0aHJvdyBhbHdheXMgd29uIHRoZSByYWNlIGFuZCBhIHNlY29uZCBsYXllciBjb3VsZCBvbmx5IGRyaWZ0LiBUaGVcbiAgICAvLyBtZXNzYWdlIGJlbG93IHRoZXJlZm9yZSBoYXMgdG8gY2FycnkgdGhlIHdob2xlIHN0b3J5LCBoZW5jZSB0aGVcbiAgICAvLyBhdHRlbXB0ZWQtZmllbGQgbGlzdC5cbiAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIGN0eC51c2VyPy5pZCkge1xuICAgICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgICBjb25zdCB3YXNDb252ZXJ0ZWQgPSBwcmV2aW91cz8uaXNfY29udmVydGVkID09PSB0cnVlIHx8IHByZXZpb3VzPy5zdGF0dXMgPT09ICdjb252ZXJ0ZWQnO1xuICAgICAgaWYgKHdhc0NvbnZlcnRlZCkge1xuICAgICAgICBjb25zdCBBTExPV0VEID0gbmV3IFNldChbXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJywgJ25vdGVzJyxcbiAgICAgICAgICAvLyBGcmFtZXdvcmstbWFuYWdlZCAvIHN5c3RlbSBjb2x1bW5zIChjZi4gb3Bwb3J0dW5pdHkuaG9vay50cykuXG4gICAgICAgICAgJ2lkJywgJ293bmVyX2lkJywgJ2NyZWF0ZWRfYXQnLCAndXBkYXRlZF9hdCcsXG4gICAgICAgICAgJ2NyZWF0ZWRfYnknLCAndXBkYXRlZF9ieScsICdzcGFjZV9pZCcsICdvcmdhbml6YXRpb25faWQnLCAnb3JnX2lkJywgJ3ZlcnNpb24nLFxuICAgICAgICBdKTtcbiAgICAgICAgY29uc3QgdmlvbGF0aW5nID0gT2JqZWN0LmtleXMoaW5wdXQpLmZpbHRlcihcbiAgICAgICAgICAoaykgPT4gIUFMTE9XRUQuaGFzKGspICYmIGlucHV0W2tdICE9PSBwcmV2aW91cz8uW2tdLFxuICAgICAgICApO1xuICAgICAgICBpZiAodmlvbGF0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBFdmVyeSBsb29rdXAgb24gYGNybV9sZWFkYCBhIHJlZmVyZW50aWFsIGNsZWFyIGNhbiBhdHRhY2suXG4gICAgICAgICAgY29uc3QgUkVGRVJFTkNFX0ZJRUxEUyA9IG5ldyBTZXQoW1xuICAgICAgICAgICAgJ2NvbnZlcnRlZF9hY2NvdW50JywgJ2NvbnZlcnRlZF9jb250YWN0JywgJ2NvbnZlcnRlZF9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAnZHVwbGljYXRlX29mX2xlYWQnLCAnZHVwbGljYXRlX29mX2NvbnRhY3QnLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCB0aGUgcmVmZXJlbmNlLWNsZWFudXAgeWllbGQgXHUyNTAwXHUyNTAwXG4gICAgICAgICAgLy8gIzcyMC4gVGhlIGVuZ2luZSBpbXBsZW1lbnRzIGBkZWxldGVCZWhhdmlvcjogJ3NldF9udWxsJ2AgYnkgVVBEQVRJTkdcbiAgICAgICAgICAvLyB0aGUgcm93IHRoYXQgSE9MRFMgdGhlIGxvb2t1cCwgc28gZGVsZXRpbmcgdGhlIGFjY291bnQgLyBjb250YWN0IC9cbiAgICAgICAgICAvLyBvcHBvcnR1bml0eSBhIGNvbnZlcnRlZCBsZWFkIHBvaW50cyBhdCAob3IgdGhlIGxlYWQgLyBjb250YWN0IGl0IHdhc1xuICAgICAgICAgIC8vIGZsYWdnZWQgYXMgYSBkdXBsaWNhdGUgb2YpIGFycml2ZXMgaGVyZSBhcyBhbiBvcmRpbmFyeSB1c2VyXG4gICAgICAgICAgLy8gYGJlZm9yZVVwZGF0ZWAgXHUyMDE0IGFuZCB0aGlzIGxvY2sgcmVmdXNlZCBpdCwgd2hpY2ggbWFkZSBhIGNvbnZlcnRlZFxuICAgICAgICAgIC8vIGxlYWQgYWJsZSB0byBrZWVwIGFsbCB0aHJlZSBvZiBpdHMgY29udmVyc2lvbiBwcm9kdWN0cyB1bmRlbGV0YWJsZVxuICAgICAgICAgIC8vIGZvcmV2ZXIgKGEgR0RQUiBlcmFzdXJlIHRoYXQgY2Fubm90IGJlIGNhcnJpZWQgb3V0KS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIE1lYXN1cmVkIG9uIDE3LjEuMCBcdTIwMTQgdGhlIHZlcnNpb24gdGhpcyByZXBvIHBpbm5lZCBBVCBUSEUgVElNRSBvZlxuICAgICAgICAgIC8vIHRoZSBtZWFzdXJlbWVudCwgbm90IHRoZSBjdXJyZW50IHBpbiAodGhlIGNhc2NhZGUgc2hhcGUgYmVsb3cgaGFzXG4gICAgICAgICAgLy8gTk9UIGJlZW4gcmUtbWVhc3VyZWQgb24gYW55IGxhdGVyIHBpbiBcdTIwMTQgbm90IDE3LjMuMCwgIzE2NzYsIG5vdFxuICAgICAgICAgIC8vIDE3LjQuMCwgUFIgIzE4MTQsIGFuZCBub3QgMTcuNS4wKSBcdTIwMTQgd2l0aCBhIHByb2JlIGhvb2sgYXQgcHJpb3JpdHkgMTk5IGltbWVkaWF0ZWx5XG4gICAgICAgICAgLy8gYWhlYWQgb2YgZWFjaCBndWFyZCwgbm90IGFzc3VtZWQuXG4gICAgICAgICAgLy8gVGhlIGVuZ2luZSBidWlsZHMgaXRzIGNsZWFudXAgd3JpdGUgb24gdGhlIENBTExFUidzIG93biBjb250ZXh0XG4gICAgICAgICAgLy8gcGx1cyB0d28gZW5naW5lIGtleXMsIHNvIG9uIHRoZSBwYXRoIGEgUkVTVCBgREVMRVRFYCB0YWtlcywgdGhlXG4gICAgICAgICAgLy8gY2FzY2FkZSBhbmQgYSB1c2VyJ3MgaGFuZC1jbGVhciBvZiB0aGUgc2FtZSBsb29rdXAgYXJlIGlkZW50aWNhbFxuICAgICAgICAgIC8vIGV2ZXJ5d2hlcmUgYSBndWFyZCBjYW4gbG9vazogcGF5bG9hZFxuICAgICAgICAgIC8vIGB7IGlkLCA8bGluaz46IG51bGwsIHVwZGF0ZWRfYXQsIHVwZGF0ZWRfYnkgfWAsIGBjdHgudXNlcmAgdGhlXG4gICAgICAgICAgLy8gQ0FMTEVSLCBgY3R4LnNlc3Npb25gIHRoZSBjYWxsZXIncyBvd24gYHsgdXNlcklkLCBpc1N5c3RlbSB9YC5cbiAgICAgICAgICAvLyAoQm90aCBgdXBkYXRlZF9ieWAgYW5kIHRoZSBpZGVudGl0eSBkcm9wIG91dCB0b2dldGhlciB3aGVuIHRoZVxuICAgICAgICAgIC8vIERFTEVURSBpdHNlbGYgY2FycmllZCBubyBgdXNlcklkYCBcdTIwMTQgYSByaWcgYXJ0ZWZhY3QsIG5vdCB0aGlzIGFwcCdzXG4gICAgICAgICAgLy8gcGF0aC4pIFNvIHRoZSBXUklURSBTSEFQRSBpcyBub3QgYSBkaXNjcmltaW5hdG9yLCBhbmQgdGhlIHlpZWxkXG4gICAgICAgICAgLy8gYmVsb3cgaXMgbm90IG9uZSBlaXRoZXI6IGl0IGxldHMgQU5ZIGNhbGxlciBjbGVhciBhIGRlY2xhcmVkIGxpbmtcbiAgICAgICAgICAvLyBvbiBhIHNldHRsZWQgcmVjb3JkLiBUaGF0IGlzIHRoZSB0cmFkZSAjNzIwIGFjY2VwdGVkLCBub3QgYSBzaWRlXG4gICAgICAgICAgLy8gZWZmZWN0IG9mIGl0LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gXHUyNkEwXHVGRTBGIEEgbWFya2VyIERPRVMgcmVhY2ggYSBob29rIFx1MjAxNCBhbmQgaXMgZGVsaWJlcmF0ZWx5IG5vdCByZWFkLiBBblxuICAgICAgICAgIC8vIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGlzIG5vdGUgY29uY2x1ZGVkIFwibm8gbWFya2VyIHJlYWNoZXMgYSBob29rLFxuICAgICAgICAgIC8vIGFuZCB0aGUgV1JJVEUgU0hBUEUgaXMgdGhlIG9ubHkgZXZpZGVuY2UgdGhlcmUgaXNcIjsgaXQgcmVhc29uZWRcbiAgICAgICAgICAvLyBvbmx5IGFib3V0IGBjdHguc2Vzc2lvbmAsIHdob3NlIGFsbG93LWxpc3QgcmVhbGx5IGRvZXMgb21pdFxuICAgICAgICAgIC8vIGBfX2AtcHJlZml4ZWQgb3BlcmF0aW9uLXByaXZhdGUga2V5cywgYW5kIG1pc3NlZCB0aGUgb3RoZXIgcm91dGVcbiAgICAgICAgICAvLyBpbnRvIHRoZSBjb250ZXh0LiBgT2JqZWN0UUwuY2FzY2FkZURlbGV0ZVJlbGF0aW9uc2AgYnVpbGRzXG4gICAgICAgICAgLy8gYHsgLi4uY29udGV4dCwgX19yZWZlcmVudGlhbEZpZWxkQ2xlYXI6IHRydWUgfWAsIHJlYWRhYmxlIGF0XG4gICAgICAgICAgLy8gYGN0eC5hcGkuZXhlY3V0aW9uQ29udGV4dC5fX3JlZmVyZW50aWFsRmllbGRDbGVhcmA6IG1lYXN1cmVkIGB0cnVlYFxuICAgICAgICAgIC8vIG9uIGV2ZXJ5IGNhc2NhZGUgaW50byBgY3JtX29wcG9ydHVuaXR5YCwgYGNybV9xdW90ZWAgYW5kXG4gICAgICAgICAgLy8gYGNybV9sZWFkYCwgYHVuZGVmaW5lZGAgb24gZXZlcnkgaGFuZC1jbGVhciAoIzExNjUsICMxNDEyKS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFx1MjZENCBUaGUgIzExNjUgcnVsaW5nICgyMDI2LTA4LTI1KSByZXZpZXdlZCB0aGF0IGFuZCB1cGhlbGQgTk9UXG4gICAgICAgICAgLy8gcmVhZGluZyBpdCwgb24gdHdvIGdyb3VuZHMuIEl0IGlzIGFuIG9wZXJhdGlvbi1wcml2YXRlIGtleSBcdTIwMTQgYW5cbiAgICAgICAgICAvLyB1bmRlY2xhcmVkIGRlcGVuZGVuY3kgdGhhdCBjYW4gdmFuaXNoIGluIGEgcGF0Y2ggcmVsZWFzZS4gQW5kXG4gICAgICAgICAgLy8gcmVhY2hhYmlsaXR5IHRocm91Z2ggdGhlIFNISVBQRUQgcGF0aCBpcyB1bnByb3ZlbjogYSBob29rIGJvZHkgcnVuc1xuICAgICAgICAgIC8vIGJvZHktb25seSBpbiBRdWlja0pTLCB3aGVyZSBgYnVpbGRTYW5kYm94QXBpYCBwYXNzZXMgYGVuZ2luZUN0eC5hcGlgXG4gICAgICAgICAgLy8gb25seSB3aGVuIHRoYXQgZXhwb3NlcyBgb2JqZWN0KClgLCBhbmQgb3RoZXJ3aXNlIGEgc2hpbSB3aXRoIG5vXG4gICAgICAgICAgLy8gYGV4ZWN1dGlvbkNvbnRleHRgIGF0IGFsbC4gR3JlZW4gaW4gYSBrZXJuZWwgcmlnIGFuZCBzaWxlbnRseSBmYWxzZVxuICAgICAgICAgIC8vIGluIHByb2R1Y3Rpb24gaXMgdGhlIHdvcnN0IG91dGNvbWUgYSBndWFyZCBjYW4gaGF2ZS4gVGhlIGRlY2xhcmVkXG4gICAgICAgICAgLy8gcmVwbGFjZW1lbnQgYGN0eC5yZWZlcmVudGlhbEZpZWxkQ2xlYXJgIGlzIGFza2VkIGZvciB1cHN0cmVhbSBhc1xuICAgICAgICAgIC8vIG9iamVjdHN0YWNrLWFpL29iamVjdHN0YWNrIzEzNjQ0LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gXHUyNkQ0IEtlZXAgdGhpcyBuYXJyb3cgKG1haW50YWluZXIncyBydWxpbmcgb24gIzcyMCwgT3B0aW9uIEEpOiBhIHdyaXRlXG4gICAgICAgICAgLy8geWllbGRzIE9OTFkgd2hlbiBldmVyeSBvbmUgb2YgaXRzIG5vbi1zeXN0ZW0gY2hhbmdlcyBpcyBhIERFQ0xBUkVEXG4gICAgICAgICAgLy8gbGluayBnb2luZyBmcm9tIGEgdmFsdWUgdG8gYG51bGxgLiBPbmUgYnVzaW5lc3MgZmllbGQgYWxvbmdzaWRlIGl0LFxuICAgICAgICAgIC8vIG9yIGEgbGluayByZXBvaW50ZWQgdG8gYSBORVcgdmFsdWUsIGFuZCB0aGUgcmVmdXNhbCBiZWxvdyBzdGlsbFxuICAgICAgICAgIC8vIGZpcmVzLiBUaGUgdGhyZWUgZnJlZXplIGd1YXJkcyBzaGFyZSB0aGlzIGJsb2NrIHZlcmJhdGltIFx1MjAxNCBzaGFyaW5nXG4gICAgICAgICAgLy8gaXQgYXMgYW4gaW1wb3J0ZWQgaGVscGVyIGlzIG5vdCBwb3NzaWJsZSAoaG9vayBib2RpZXMgcnVuIGJvZHktb25seVxuICAgICAgICAgIC8vIGluIHRoZSBzYW5kYm94IGFuZCBjYW5ub3QgcmVhY2ggbW9kdWxlIHNjb3BlKSwgc29cbiAgICAgICAgICAvLyBgdGVzdC9mcmVlemUtZ3VhcmQtcmVmZXJlbmNlLWNsZWFudXAudGVzdC50c2AgcGlucyB0aGUgdGhyZWUgY29waWVzXG4gICAgICAgICAgLy8gYXMgaWRlbnRpY2FsIHRleHQgYW5kIHBpbnMgYm90aCBkaXJlY3Rpb25zIG9mIHRoZSBuYXJyb3duZXNzLlxuICAgICAgICAgIGNvbnN0IGlzUmVmZXJlbmNlQ2xlYW51cCA9IHZpb2xhdGluZy5ldmVyeShcbiAgICAgICAgICAgIChrKSA9PiBSRUZFUkVOQ0VfRklFTERTLmhhcyhrKSAmJiBpbnB1dFtrXSA9PT0gbnVsbCAmJiBwcmV2aW91cz8uW2tdICE9IG51bGwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoaXNSZWZlcmVuY2VDbGVhbnVwKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBOYW1lIHRoZSBsZWFkIHRoZSB3YXkgYGNybV9sZWFkLmRpc3BsYXlfdGl0bGVgIGRvZXMgXHUyMDE0IHRoZSBwZXJzb25cbiAgICAgICAgICAvLyBhbmQgdGhlIGNvbXBhbnksIGpvaW5lZCBcdTIwMTQgcmF0aGVyIHRoYW4gYXBwZW5kaW5nIHRoZSByZWNvcmQgaWQsXG4gICAgICAgICAgLy8gd2hpY2ggaXMgdW5tYXRjaGFibGUgYWdhaW5zdCBldmVyeSBsZWFkIHN1cmZhY2UgaW4gdGhpcyBhcHAgKHJlY29yZFxuICAgICAgICAgIC8vIHBhZ2UsIGxpc3QgdmlldywgYnJlYWRjcnVtYiwgbG9va3VwIHBpY2tlciksIGFsbCBvZiB3aGljaCB0aXRsZSBhXG4gICAgICAgICAgLy8gbGVhZCBgQWRhIExvdmVsYWNlIC0gQWNtZWAuIENvbXBvc2VkIGZyb20gdGhlIHR3byBzdG9yZWQgY29sdW1uc1xuICAgICAgICAgIC8vIGJlY2F1c2UgYSBsb3dlcmVkIGhvb2sgYm9keSBjYW5ub3QgcmVhZCB0aGUgYGRpc3BsYXlfdGl0bGVgIGZvcm11bGEuXG4gICAgICAgICAgY29uc3QgcGVyc29uID0gW3ByZXZpb3VzPy5maXJzdF9uYW1lLCBwcmV2aW91cz8ubGFzdF9uYW1lXVxuICAgICAgICAgICAgLmZpbHRlcigocGFydCkgPT4gdHlwZW9mIHBhcnQgPT09ICdzdHJpbmcnICYmIHBhcnQudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgIC5qb2luKCcgJyk7XG4gICAgICAgICAgY29uc3QgY29tcGFueSA9XG4gICAgICAgICAgICB0eXBlb2YgcHJldmlvdXM/LmNvbXBhbnkgPT09ICdzdHJpbmcnID8gcHJldmlvdXMuY29tcGFueS50cmltKCkgOiAnJztcbiAgICAgICAgICBjb25zdCBsYWJlbCA9IFtwZXJzb24sIGNvbXBhbnldLmZpbHRlcihCb29sZWFuKS5qb2luKCcgLSAnKTtcblxuICAgICAgICAgIHRocm93IHJlZnVzZShcbiAgICAgICAgICAgIGBDYW5ub3QgZWRpdCAke2xhYmVsID8gYGNvbnZlcnRlZCBsZWFkICR7bGFiZWx9YCA6ICdhIGNvbnZlcnRlZCBsZWFkJ30gKGF0dGVtcHRlZDogJHt2aW9sYXRpbmcuam9pbignLCAnKX0pLiBNYWtlIGNoYW5nZXMgb24gdGhlIGNvbnZlcnRlZCByZWNvcmRzIGluc3RlYWQuYCxcbiAgICAgICAgICAgICdSRUNPUkRfTE9DS0VEJyxcbiAgICAgICAgICAgIDQwOSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ID09PSAnYWZ0ZXJVcGRhdGUnKSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICAgIGNvbnN0IGJlY2FtZVF1YWxpZmllZCA9XG4gICAgICAgIGlucHV0LnN0YXR1cyA9PT0gJ3F1YWxpZmllZCcgJiYgcHJldmlvdXM/LnN0YXR1cyAhPT0gJ3F1YWxpZmllZCc7XG4gICAgICBpZiAoIWJlY2FtZVF1YWxpZmllZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWFwaSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBsZWFkSWQgPVxuICAgICAgICAodHlwZW9mIGlucHV0LmlkID09PSAnc3RyaW5nJyAmJiBpbnB1dC5pZCkgfHxcbiAgICAgICAgKHR5cGVvZiBwcmV2aW91cz8uaWQgPT09ICdzdHJpbmcnICYmIHByZXZpb3VzLmlkKSB8fFxuICAgICAgICB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBvd25lcklkID1cbiAgICAgICAgKHR5cGVvZiBpbnB1dC5vd25lcl9pZCA9PT0gJ3N0cmluZycgJiYgaW5wdXQub3duZXJfaWQpIHx8XG4gICAgICAgICh0eXBlb2YgcHJldmlvdXM/Lm93bmVyX2lkID09PSAnc3RyaW5nJyAmJiBwcmV2aW91cy5vd25lcl9pZCkgfHxcbiAgICAgICAgY3R4LnVzZXI/LmlkO1xuXG4gICAgICAvLyBPTkUgY2FsZW5kYXIsIGFuZCBpdCBpcyBVVEMgXHUyMDE0IHRoZSBkYXkgc3RlcCBpcyB0YWtlbiB3aXRoIGBzZXRVVENEYXRlYFxuICAgICAgLy8gYmVjYXVzZSB0aGUgcmVzdWx0IGlzIHJlbmRlcmVkIHdpdGggYHRvSVNPU3RyaW5nKClgIGJlbG93LiBgc2V0RGF0ZWBcbiAgICAgIC8vIHJlYWRzIGFuZCB3cml0ZXMgdGhlIExPQ0FMIGNhbGVuZGFyIGFuZCBwcmVzZXJ2ZXMgd2FsbC1jbG9jayB0aW1lLCBzb1xuICAgICAgLy8gaW4gYSBEU1Qtb2JzZXJ2aW5nIGRlcGxveW1lbnQgYSB0d28tZGF5IHN0ZXAgYWNyb3NzIGEgc3ByaW5nLWZvcndhcmRcbiAgICAgIC8vIGFkdmFuY2VzIDQ3IGgsIG5vdCA0OCwgYW5kIHRoZSByZW5kZXJlZCBVVEMgZGF5IGlzIG9uZSBzaG9ydC4gSXQgaXNcbiAgICAgIC8vIGludmlzaWJsZSBhdCBgVFo9VVRDYCwgd2hlcmUgdGhlIHR3byBjYWxlbmRhcnMgY29pbmNpZGUuXG4gICAgICBjb25zdCBkdWVEYXRlID0gbmV3IERhdGUoKTtcbiAgICAgIGR1ZURhdGUuc2V0VVRDRGF0ZShkdWVEYXRlLmdldFVUQ0RhdGUoKSArIDIpO1xuXG4gICAgICAvLyBUaXRsZSB0aGUgdGFzayB3aXRoIHRoZSBsZWFkJ3MgbmFtZSwgbm90IGl0cyByZWNvcmQgaWQuICoqQWxsIFRhc2tzKipcbiAgICAgIC8vIGlzIHdoZXJlIGEgcmVwIHN0YXJ0cyB0aGUgZGF5OyBhIHF1ZXVlIG9mIHJvd3MgcmVhZGluZyBgRm9sbG93IHVwIHdpdGhcbiAgICAgIC8vIHF1YWxpZmllZCBsZWFkIChFTXRtYVNjb2EzSS11WUZHKWAgaXMgYSBxdWV1ZSBub2JvZHkgY2FuIHRyaWFnZSwgYW5kXG4gICAgICAvLyB0aGUga2V5IG1hdGNoZXMgbm90aGluZyBvbiBhbnkgbGVhZCBwYWdlIG9yIGluIHNlYXJjaC4gQm90aCBoYWx2ZXNcbiAgICAgIC8vIHByZWZlciB0aGUgdmFsdWUgVEhJUyB3cml0ZSBpcyBzZXR0aW5nLCBzaW5jZSBhIHF1YWxpZnlpbmcgd3JpdGUgbWF5IGJlXG4gICAgICAvLyByZW5hbWluZyB0aGUgbGVhZCBpbiB0aGUgc2FtZSBwYXlsb2FkLlxuICAgICAgLy9cbiAgICAgIC8vIFx1MjZBMFx1RkUwRiBUaGUgMjU1IGNhcCBpcyBsb2FkLWJlYXJpbmcsIGV4YWN0bHkgYXMgaW4gYGNhc2UuaG9vay50c2A6XG4gICAgICAvLyBgY3JtX3Rhc2suc3ViamVjdGAgZGVjbGFyZXMgYG1heExlbmd0aDogMjU1YCBhbmQgdGhlIGVuZ2luZSBlbmZvcmNlc1xuICAgICAgLy8gaXQsIHdoaWxlIGBjcm1fbGVhZC5jb21wYW55YCBhbG9uZSBhbGxvd3MgMjU1IFx1MjAxNCBzbyBhbiB1bmNhcHBlZCB0aXRsZSBpc1xuICAgICAgLy8gcmVqZWN0ZWQsIGFuZCB0aGUgYGNhdGNoYCBiZWxvdyBzd2FsbG93cyB0aGF0IHJlamVjdGlvbiwgbGVhdmluZyBub1xuICAgICAgLy8gZm9sbG93LXVwIHRhc2sgYW5kIG5vIHRyYWNlLiBUcnVuY2F0aW5nIHRoZSBUQUlMIGtlZXBzIHRoZVxuICAgICAgLy8gZGlzY3JpbWluYXRpbmcgaGVhZCBpbnRhY3QuXG4gICAgICBjb25zdCBwZXJzb24gPSBbXG4gICAgICAgICh0eXBlb2YgaW5wdXQuZmlyc3RfbmFtZSA9PT0gJ3N0cmluZycgJiYgaW5wdXQuZmlyc3RfbmFtZSkgfHwgcHJldmlvdXM/LmZpcnN0X25hbWUsXG4gICAgICAgICh0eXBlb2YgaW5wdXQubGFzdF9uYW1lID09PSAnc3RyaW5nJyAmJiBpbnB1dC5sYXN0X25hbWUpIHx8IHByZXZpb3VzPy5sYXN0X25hbWUsXG4gICAgICBdXG4gICAgICAgIC5maWx0ZXIoKHBhcnQpID0+IHR5cGVvZiBwYXJ0ID09PSAnc3RyaW5nJyAmJiBwYXJ0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgIC5qb2luKCcgJyk7XG4gICAgICBjb25zdCBjb21wYW55ID1cbiAgICAgICAgKHR5cGVvZiBpbnB1dC5jb21wYW55ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jb21wYW55LnRyaW0oKSkgfHxcbiAgICAgICAgKHR5cGVvZiBwcmV2aW91cz8uY29tcGFueSA9PT0gJ3N0cmluZycgJiYgcHJldmlvdXMuY29tcGFueS50cmltKCkpIHx8XG4gICAgICAgICcnO1xuICAgICAgY29uc3QgbGFiZWwgPSBbcGVyc29uLCBjb21wYW55XS5maWx0ZXIoQm9vbGVhbikuam9pbignIC0gJyk7XG4gICAgICBjb25zdCB0aXRsZWQgPSBsYWJlbFxuICAgICAgICA/IGBGb2xsb3cgdXAgd2l0aCBxdWFsaWZpZWQgbGVhZDogJHtsYWJlbH1gXG4gICAgICAgIDogJ0ZvbGxvdyB1cCB3aXRoIHF1YWxpZmllZCBsZWFkJztcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX3Rhc2snKS5pbnNlcnQoe1xuICAgICAgICAgIHN1YmplY3Q6IHRpdGxlZC5sZW5ndGggPiAyNTUgPyBgJHt0aXRsZWQuc2xpY2UoMCwgMjU0KX1cdTIwMjZgIDogdGl0bGVkLFxuICAgICAgICAgIHN0YXR1czogJ25vdF9zdGFydGVkJyxcbiAgICAgICAgICBwcmlvcml0eTogJ2hpZ2gnLFxuICAgICAgICAgIHR5cGU6ICdmb2xsb3dfdXAnLFxuICAgICAgICAgIGR1ZV9kYXRlOiBkdWVEYXRlLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApLFxuICAgICAgICAgIC8vIFVubGlrZSBgbGVhZF9hdXRvX2Fzc2lnbmAgYWJvdmUsIHRoaXMgaXMgYSBTRVBBUkFURSBpbnNlcnQgb25cbiAgICAgICAgICAvLyBgY3R4LmFwaWAgXHUyMDE0IGEgbmV3IG9wZXJhdGlvbiBjYXJyeWluZyB0aGUgY2FsbGVyJ3MgY29udGV4dCwgc28gdGhlXG4gICAgICAgICAgLy8gIzMwMDQgdHJhbnNmZXIgZ3VhcmQgZG9lcyBhcHBseSB0byBpdC4gV2hlbiB0aGUgcXVhbGlmaWVyIGlzIHRoZVxuICAgICAgICAgIC8vIGxlYWQncyBvd24gcmVwIChgb3duZXJfaWRgID09IGNhbGxlcikgaXQgaXMgbm90IGEgdHJhbnNmZXIgYXQgYWxsO1xuICAgICAgICAgIC8vIGEgbWFuYWdlciBxdWFsaWZ5aW5nIGEgcmVwJ3MgbGVhZCBob2xkcyBgYWxsb3dUcmFuc2ZlcmAuIEFueSBvdGhlclxuICAgICAgICAgIC8vIGNhbGxlciBpcyBkZW5pZWQgYW5kIHRoZSBjYXRjaCBiZWxvdyBkcm9wcyB0aGUgdGFzayByYXRoZXIgdGhhblxuICAgICAgICAgIC8vIGxhbmRpbmcgaXQgb24gdGhlIHdyb25nIGRlc2suXG4gICAgICAgICAgb3duZXJfaWQ6IG93bmVySWQsXG4gICAgICAgICAgcmVsYXRlZF90b190eXBlOiAnY3JtX2xlYWQnLFxuICAgICAgICAgIHJlbGF0ZWRfdG9fbGVhZDogbGVhZElkLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBTaWRlLWVmZmVjdCBmYWlsdXJlIG11c3Qgbm90IGJyZWFrIHRoZSBwYXJlbnQgdHJhbnNhY3Rpb24uIE5vXG4gICAgICAgIC8vIGBjb25zb2xlYCBpbiB0aGUgTDIgaG9vayBzYW5kYm94IFx1MjAxNCBsb2dnaW5nIHdvdWxkIHRocm93IGl0cyBvd25cbiAgICAgICAgLy8gUmVmZXJlbmNlRXJyb3IgYW5kIG1hc2sgdGhlIHJlYWwgZmFpbHVyZSAoY2YuICM0NzEpLlxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogU29mdCBsZWFkIGRlZHVwZS5cbiAqXG4gKiBBIHByb3NwZWN0IHdobyBlbnF1aXJlcyB0d2ljZSBtdXN0IG5vdCBiZSBSRUpFQ1RFRCBcdTIwMTQgYSByZS1jYXB0dXJlZCBhZGRyZXNzIGlzXG4gKiByZWNvcmRlZCBhcyBhIGZhY3QgaW5zdGVhZCBvZiByZWZ1c2VkLCBzbyB0aGUgcHVibGljIFdlYi10by1MZWFkIGZvcm0gbmV2ZXJcbiAqIGFuc3dlcnMgYSByZXR1cm5pbmcgdmlzaXRvciB3aXRoIGEgc2F2ZSBlcnJvci5cbiAqXG4gKiBGb3VyIGpvYnMsIGFsbCBgYmVmb3JlYC1waGFzZSBzbyB0aGUgdmFsdWVzIGxhbmQgaW4gdGhlIHNhbWUgd3JpdGU6XG4gKlxuICogMS4gKipOb3JtYWxpemUgYGVtYWlsYCoqICh0cmltICsgbG93ZXJjYXNlKSwgZXhhY3RseSBhcyBgY29udGFjdF9pbnRlZ3JpdHlgXG4gKiAgICBkb2VzIG9uIGBjcm1fY29udGFjdGAuIFx1MjZBMFx1RkUwRiBUaGlzIGlzIHdoYXQgbWFrZXMgdGhlIGRlZHVwZSBsb29rdXAgYmVsb3cgYVxuICogICAgcGxhaW4gZXF1YWxpdHkgbWF0Y2g6IHRoZXJlIGlzIG5vIGNhc2UtaW5zZW5zaXRpdmUgcHJlZGljYXRlIHRvIGxlYW4gb24gXHUyMDE0XG4gKiAgICBPYmplY3RRTCdzIGAkcmVnZXhgIGNvbXBpbGVzIHRvIGEgTElLRSAqc3Vic3RyaW5nKiBvbiBTUUwsIHdoaWNoIHdvdWxkXG4gKiAgICBtYXRjaCBgYUBiLmNvbWAgaW5zaWRlIGB4YUBiLmNvbWAgXHUyMDE0IHNvIHRoZSBjYW5vbmljYWwgZm9ybSBoYXMgdG8gYmVcbiAqICAgIGVzdGFibGlzaGVkIGJ5IHRoZSBQUk9EVUNFUiBhdCB3cml0ZSB0aW1lIHJhdGhlciB0aGFuIHdvcmtlZCBhcm91bmQgYnlcbiAqICAgIGV2ZXJ5IHJlYWRlci4gQWxzbyBvbiB1cGRhdGU6IGFuIGVkaXQgcmVpbnRyb2R1Y2luZyBtaXhlZCBjYXNlIHdvdWxkXG4gKiAgICBzaWxlbnRseSBtYWtlIHRoZSByZWNvcmQgaW52aXNpYmxlIHRvIGV2ZXJ5IGxhdGVyIGRlZHVwZS5cbiAqXG4gKiAxYi4gKipGb2xkIGBjb21wYW55YCBpbnRvIGBjb21wYW55X25vcm1hbGl6ZWRgKiogXHUyMDE0IGEgU0VQQVJBVEUgY29sdW1uLCBub3QgYW5cbiAqICAgIGluLXBsYWNlIHJld3JpdGUsIGJlY2F1c2UgYGNvbXBhbnlgIGlzIHRoZSBkaXNwbGF5IHZhbHVlIHRoZSBjb252ZXJzaW9uXG4gKiAgICBmbG93IGNvcGllcyBvbnRvIHRoZSBhY2NvdW50IGl0IGNyZWF0ZXMuIEl0IGlzIHRoZSBsZWFkIGhhbGYgb2YgdGhlIHBhaXJcbiAqICAgIGBjcm1fYWNjb3VudC5uYW1lX25vcm1hbGl6ZWRgIGNvbXBsZXRlcywgYW5kIGl0IGV4aXN0cyBmb3IgdGhlIHNhbWUgcmVhc29uXG4gKiAgICBhcyB0aGUgZW1haWwgZm9sZDogdGhlIHJlYWRlciAoYSBmbG93IHRlbXBsYXRlKSBjYW4gY29tcGFyZSB0d28gc3RvcmVkXG4gKiAgICBjb2x1bW5zIGJ1dCBjYW5ub3QgY29tcHV0ZSBlaXRoZXIgb25lLlxuICpcbiAqIDIuICoqTGluayBhIHJlcGVhdGVkIGFkZHJlc3MgdG8gdGhlIHJlY29yZCBpdCByZXBlYXRzKiogXHUyMDE0IG9uIGluc2VydCBvbmx5LlxuICogICAgQW4gZXhpc3RpbmcgYGNybV9jb250YWN0YCB3aW5zIG92ZXIgYW4gb3BlbiBsZWFkOiB0aGUgcHJvc3BlY3Qgd2hvIGFscmVhZHlcbiAqICAgIGJlY2FtZSBhIGNvbnRhY3QgaXMgdGhlIGZ1cnRoZXItYWxvbmcgcmVjb3JkLCBhbmQgdGhlIG9uZSB0aGUgY29udmVyc2lvblxuICogICAgZmxvdyB3b3VsZCByZXVzZSBhbnl3YXkuIFdpdGhpbiBhIGtpbmQgdGhlIE9MREVTVCByZWNvcmQgd2lucywgc28gYSBjbHVzdGVyXG4gKiAgICBvZiBmaXZlIHJlLXN1Ym1pc3Npb25zIGFsbCBwb2ludCBhdCB0aGUgc2FtZSBvcmlnaW4gaW5zdGVhZCBvZiBjaGFpbmluZy5cbiAqXG4gKiAzLiAqKlJldGlyZSB0aGUgd2hvbGUgY2xhaW0gd2hlbiB0aGUgcmVjb3JkIGl0IG5hbWVkIGlzIGdvbmUqKiBcdTIwMTQgb24gdXBkYXRlXG4gKiAgICBvbmx5LCBhbmQgdGhlIGV4YWN0IG1pcnJvciBvZiBqb2IgMjogdGhlIGhvb2sgdGhhdCBzdGFtcHMgYSBkdXBsaWNhdGUgbGlua1xuICogICAgaXMgdGhlIG9uZSB0aGF0IHRha2VzIGl0IGJhY2sgZG93bi4gU2VlIHRoZSBub3RlIGF0IHRoZSBibG9jayBpdHNlbGYuXG4gKlxuICogVGhlIHdyaXRlIGlzIGBkdXBsaWNhdGVfc3RhdHVzOiAnc3VzcGVjdGVkJ2AgXHUyMDE0IGEgbWFjaGluZSdzIGd1ZXNzLCBleHBsaWNpdGx5XG4gKiBkaXN0aW5ndWlzaGVkIGZyb20gdGhlIGBjb25maXJtZWRgIHZlcmRpY3QgYSBodW1hbiByZWNvcmRzIHdoZW4gZGlzcXVhbGlmeWluZ1xuICogYXMgYSBkdXBsaWNhdGUuIFRoZSBob29rIHN0YW5kcyBkb3duIG9uIGFueSByZWNvcmQgdGhhdCBhbHJlYWR5IGNhcnJpZXMgYVxuICogdmVyZGljdCwgc28gYGNvbmZpcm1lZGAgY2FuIG5ldmVyIGJlIHJldmVydGVkIHRvIGBzdXNwZWN0ZWRgIGJ5IGEgbGF0ZXJcbiAqIHdyaXRlLCBhbmQgb24gYW55IHJlY29yZCB0aGF0IGFscmVhZHkgbmFtZXMgYSBzdXJ2aXZvci5cbiAqXG4gKiBEZXRlY3Rpb24gaXMgSU5TRVJULW9ubHkgYnkgZGVzaWduOiBhIGxhdGVyIGVkaXQgcmUtc2Nhbm5pbmcgd291bGQgcmUtb3BlbiBhXG4gKiBxdWVzdGlvbiBhIGh1bWFuIG1heSBoYXZlIGFscmVhZHkgY2xvc2VkLCBhbmQgdGhlIHJldmlldyBxdWV1ZVxuICogKGBzdXNwZWN0ZWRfZHVwbGljYXRlc2ApIGlzIHRoZSBhZmZvcmRhbmNlIGZvciBhbnl0aGluZyBpbnRha2UgbWlzc2VkLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBQcmlvcml0eSAzMDAgXHUyMDE0IGFmdGVyIGBsZWFkX2F1dG9tYXRpb25gICgyMDApLCB3aG9zZSBndWVzdCBicmFuY2ggc3RyaXBzXG4gKiBjbGllbnQtc3VwcGxpZWQgYGR1cGxpY2F0ZV8qYCBmcm9tIGFub255bW91cyBzdWJtaXNzaW9ucy4gUnVubmluZyBlYXJsaWVyXG4gKiB3b3VsZCBsZXQgYSBzcG9vZmVkIGBkdXBsaWNhdGVfc3RhdHVzYCBzd2l0Y2ggdGhpcyBob29rIG9mZi5cbiAqL1xuY29uc3QgbGVhZER1cGxpY2F0ZUNoZWNrSG9vazogSG9vayA9IHtcbiAgbmFtZTogJ2xlYWRfZHVwbGljYXRlX2NoZWNrJyxcbiAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICBwcmlvcml0eTogMzAwLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnTm9ybWFsaXplIGxlYWQgZW1haWwgYW5kIGNvbXBhbnkgbWF0Y2gga2V5OyBmbGFnIGEgcmUtY2FwdHVyZWQgYWRkcmVzcyBhcyBhIHN1c3BlY3RlZCBkdXBsaWNhdGUgb2YgdGhlIHJlY29yZCBpdCByZXBlYXRzLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgY29uc3QgeyBldmVudCwgaW5wdXQgfSA9IGN0eDtcblxuICAgIC8vIEEgZHVwbGljYXRlIGNsdXN0ZXIgbGFyZ2VyIHRoYW4gdGhpcyBpcyBwYXRob2xvZ2ljYWw7IGV2ZXJ5IG1lbWJlciBwb2ludHNcbiAgICAvLyBhdCB0aGUgc2FtZSBvcmlnaW4gZWl0aGVyIHdheSwgc28gdGhlIHNjYW4gaXMgYm91bmRlZCByYXRoZXIgdGhhbiBwYWdlZC5cbiAgICBjb25zdCBTQ0FOX0xJTUlUID0gNTA7XG5cbiAgICAvKiogQWJzZW50LCBudWxsIG9yIHdoaXRlc3BhY2UgXHUyMDE0IHRoZSBzaGFwZSBgaXNCbGFua2AgdGVzdHMgaW4gQ0VMLiAqL1xuICAgIGNvbnN0IGlzQmxhbmsgPSAodmFsdWU6IHVua25vd24pOiBib29sZWFuID0+XG4gICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKSA9PT0gJycpO1xuXG4gICAgLy8gMS4gQ2Fub25pY2FsIGVtYWlsLiBgaW5wdXQuZW1haWxgIGlzIGFic2VudCBvbiBhIHBhcnRpYWwgdXBkYXRlOyBsZWF2ZSBpdFxuICAgIC8vICAgIGFsb25lIHRoZW4gcmF0aGVyIHRoYW4gd3JpdGluZyBhbiBlbXB0eSBzdHJpbmcgb3ZlciBhIHJlYWwgYWRkcmVzcy5cbiAgICBpZiAodHlwZW9mIGlucHV0LmVtYWlsID09PSAnc3RyaW5nJykge1xuICAgICAgaW5wdXQuZW1haWwgPSBpbnB1dC5lbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgY29uc3QgZW1haWwgPSB0eXBlb2YgaW5wdXQuZW1haWwgPT09ICdzdHJpbmcnID8gaW5wdXQuZW1haWwgOiAnJztcblxuICAgIC8vIDFiLiBDYW5vbmljYWwgQ09NUEFOWSwgaW50byBpdHMgb3duIGNvbHVtbiAoIzYyNikuIFNhbWUgZG9jdHJpbmUgYXMgdGhlXG4gICAgLy8gICAgIGVtYWlsIGFib3ZlIFx1MjAxNCB0aGUgY2Fub25pY2FsIGZvcm0gaXMgZXN0YWJsaXNoZWQgYnkgdGhlIHByb2R1Y2VyIGF0XG4gICAgLy8gICAgIHdyaXRlIHRpbWUgXHUyMDE0IGJ1dCBpdCBjYW5ub3QgYmUgZG9uZSBpbiBwbGFjZTogYGNvbXBhbnlgIGlzIHRoZSBkaXNwbGF5XG4gICAgLy8gICAgIHZhbHVlIGFuZCBpcyBjb3BpZWQgdmVyYmF0aW0gb250byB0aGUgYWNjb3VudCBgbGVhZF9jb252ZXJzaW9uYFxuICAgIC8vICAgICBjcmVhdGVzLCBzbyBmb2xkaW5nIGl0IHdvdWxkIHNoaXAgXCJhY21lIGNvcnBcIiBhcyB0aGUgYWNjb3VudCBuYW1lLlxuICAgIC8vICAgICBgY3JtX2FjY291bnQubmFtZV9ub3JtYWxpemVkYCBpcyB0aGUgb3RoZXIgaGFsZiBvZiB0aGUgcGFpcjsgdGhlIGZsb3dcbiAgICAvLyAgICAgY29tcGFyZXMgdGhlIHR3byBjb2x1bW5zIGJlY2F1c2UgaXQgY2FuIGNvbXB1dGUgbmVpdGhlclxuICAgIC8vICAgICAoYHJlc29sdmVUb2tlbmAga25vd3Mgb25seSBgTk9XKClgIC8gYFRPREFZKClgKS5cbiAgICAvL1xuICAgIC8vICAgICBSdW5zIGJlZm9yZSB0aGUgaW5zZXJ0LW9ubHkgZWFybHkgcmV0dXJuIGJlbG93LCBzbyBhbiBlZGl0IHRoYXRcbiAgICAvLyAgICAgcmV3cml0ZXMgYGNvbXBhbnlgIHJlLWZvbGRzIHRoZSBrZXkgaW5zdGVhZCBvZiBsZWF2aW5nIGEgc3RhbGUgb25lLlxuICAgIC8vICAgICBBYnNlbnQga2V5IFx1MjFEMiB1bnRvdWNoZWQ6IGEgcGFydGlhbCB1cGRhdGUgdGhhdCBuZXZlciBtZW50aW9uc1xuICAgIC8vICAgICBgY29tcGFueWAgbXVzdCBub3QgYmxhbmsgdGhlIG1hdGNoIGtleS5cbiAgICBpZiAoJ2NvbXBhbnknIGluIGlucHV0KSB7XG4gICAgICBjb25zdCByYXdDb21wYW55ID0gaW5wdXQuY29tcGFueTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDb21wYW55ID1cbiAgICAgICAgdHlwZW9mIHJhd0NvbXBhbnkgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyByYXdDb21wYW55LnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJyAnKVxuICAgICAgICAgIDogJyc7XG4gICAgICBpbnB1dC5jb21wYW55X25vcm1hbGl6ZWQgPSBub3JtYWxpemVkQ29tcGFueSA9PT0gJycgPyBudWxsIDogbm9ybWFsaXplZENvbXBhbnk7XG4gICAgfVxuXG4gICAgLy8gMWMuIFJldGlyZSBhIGR1cGxpY2F0ZSBjbGFpbSBvbmNlIHRoZSByZWNvcmQgaXQgbmFtZWQgaXMgZ29uZS5cbiAgICAvL1xuICAgIC8vICAgICBcdTI2QTBcdUZFMEYgUGxhdGZvcm0gY29uc3RyYWludC4gYGR1cGxpY2F0ZV9vZl90eXBlYCBpcyBhIERJU0NSSU1JTkFUT1IsIGFuZFxuICAgIC8vICAgICBgbGVhZC5vYmplY3QudHNgIHBhaXJzIGl0IHdpdGggdGhlIGxvb2t1cCBpdCBuYW1lcyB0aHJvdWdoXG4gICAgLy8gICAgIGByZXF1aXJlZFdoZW5gIFx1MjAxNCBzbyBcInRoZSB0eXBlIGlzIHNldFwiIGFuZCBcInRoYXQgbG9va3VwIGlzIHBvcHVsYXRlZFwiXG4gICAgLy8gICAgIGFyZSBPTkUgZmFjdCBzdGF0ZWQgaW4gdHdvIGNvbHVtbnMuIE5laXRoZXIgbG9va3VwIGRlY2xhcmVzIGFcbiAgICAvLyAgICAgYGRlbGV0ZUJlaGF2aW9yYCwgc28gYm90aCB0YWtlIHRoZSBzcGVjIGRlZmF1bHQgYHNldF9udWxsYCwgYW5kIHRoZVxuICAgIC8vICAgICBlbmdpbmUgaW1wbGVtZW50cyBgc2V0X251bGxgIGJ5IFVQREFUSU5HIHRoZSByb3cgdGhhdCBIT0xEUyB0aGVcbiAgICAvLyAgICAgbG9va3VwLiBEZWxldGluZyB0aGUgY29udGFjdCAob3IgbGVhZCkgYSBsZWFkIHdhcyBmbGFnZ2VkIGFnYWluc3RcbiAgICAvLyAgICAgdGhlcmVmb3JlIGFycml2ZXMgaGVyZSBhcyBgeyBpZCwgZHVwbGljYXRlX29mXzx4PjogbnVsbCwgXHUyMDI2IH1gLCBudWxsc1xuICAgIC8vICAgICBvbmUgaGFsZiBvZiB0aGUgcGFpciwgYW5kIHRoZSByb3cgaW5zdGFudGx5IGJyZWFrcyBpdHMgb3duIHJ1bGUgXHUyMDE0IHNvXG4gICAgLy8gICAgIHRoZSB3aG9sZSBkZWxldGUgcm9sbHMgYmFjayB3aXRoIGBEdXBsaWNhdGUgT2YgQ29udGFjdCBpcyByZXF1aXJlZGAsXG4gICAgLy8gICAgIGFuIGVycm9yIG5hbWluZyBhIGZpZWxkIG9uIGFuIG9iamVjdCB0aGUgY2FsbGVyIG5ldmVyIGFkZHJlc3NlZC5cbiAgICAvL1xuICAgIC8vICAgICBUaGUgYmxhc3QgcmFkaXVzIGlzIHdoeSB0aGlzIG1hdHRlcnM6IHRoZSBmbGFnIGlzIHN0YW1wZWRcbiAgICAvLyAgICAgYXV0b21hdGljYWxseSBhdCBpbnRha2Ugb24gYW55IE9QRU4gbGVhZCB0aGF0IG1lcmVseSByZS11c2VzIGFcbiAgICAvLyAgICAgY29udGFjdCdzIGVtYWlsLCBzbyBhbiBvcmRpbmFyeSBkdXBsaWNhdGUgbWFrZXMgdGhhdCBDT05UQUNUXG4gICAgLy8gICAgIHVuZGVsZXRhYmxlIFx1MjAxNCBhbmQgYmVjYXVzZSBgY3JtX2NvbnRhY3QuY3JtX2FjY291bnRgIGlzIGFcbiAgICAvLyAgICAgbWFzdGVyLWRldGFpbCB3aXRoIGBkZWxldGVCZWhhdmlvcjogJ2Nhc2NhZGUnYCwgdGhlIEFDQ09VTlQgYWJvdmUgaXRcbiAgICAvLyAgICAgdG9vLiBBIEdEUFIgXCJkZWxldGUgdGhpcyBwZXJzb25cIiByZXF1ZXN0IHdpdGggbm8gd2F5IHRvIGNhcnJ5IGl0IG91dC5cbiAgICAvL1xuICAgIC8vICAgICBUaGUgcnVsZSByZXN0b3JlZCBoZXJlIGlzIG9uZSBsaW5lOiAqKnRoZSBkaXNjcmltaW5hdG9yIG1heSBub3RcbiAgICAvLyAgICAgb3V0bGl2ZSB0aGUgbG9va3VwIGl0IG5hbWVzLioqIFdoZW4gYSB3cml0ZSBsZWF2ZXMgdGhhdCBsb29rdXAgYmxhbmssXG4gICAgLy8gICAgIHRoZSBjbGFpbSBpcyByZXRpcmVkIFdIT0xFIFx1MjAxNCB0eXBlIGFuZCBzdGF0dXMgZ28gd2l0aCB0aGUgbGluayBcdTIwMTQgYW5kXG4gICAgLy8gICAgIHRoZSBsZWFkIHNpbXBseSBzdG9wcyBzYXlpbmcgaXQgZHVwbGljYXRlcyBzb21ldGhpbmcuXG4gICAgLy9cbiAgICAvLyAgICAgXHUyNkEwXHVGRTBGIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhIHNlY29uZCBzcGVsbGluZyBvZiAjNzIwJ3MgXCJpcyB0aGlzIHdyaXRlXG4gICAgLy8gICAgIHRoZSBlbmdpbmUncyByZWZlcmVuY2UgY2xlYW51cD9cIiBwcmVkaWNhdGUgaW4gYGxlYWRfYXV0b21hdGlvbmAgYWJvdmUuXG4gICAgLy8gICAgIFJlLW1lYXN1cmVkIG9uIDE3LjEuMCB3aXRoIGEgcHJvYmUgaG9vayBhdCBwcmlvcml0eSAxOTk6IHRoZSBlbmdpbmUnc1xuICAgIC8vICAgICBjbGVhbnVwIHdyaXRlIGFuZCBhIHVzZXIncyBoYW5kLWNsZWFyIG9mIHRoZSBzYW1lIGxvb2t1cCBhcmUgaWRlbnRpY2FsXG4gICAgLy8gICAgIGluIGV2ZXJ5dGhpbmcgdGhpcyBibG9jayBjb3VsZCByZWFkIFx1MjAxNCBpZGVudGljYWwgYGlucHV0YFxuICAgIC8vICAgICAoYHsgaWQsIDxsaW5rPjogbnVsbCwgdXBkYXRlZF9hdCwgdXBkYXRlZF9ieSB9YCksIGlkZW50aWNhbFxuICAgIC8vICAgICBgY3R4LnVzZXJgLCBpZGVudGljYWwgYGN0eC5zZXNzaW9uYCBcdTIwMTQgYmVjYXVzZSB0aGUgZW5naW5lIGJ1aWxkcyB0aGVcbiAgICAvLyAgICAgY2xlYW51cCBvbiB0aGUgQ0FMTEVSJ3Mgb3duIGNvbnRleHQuIFRoZXkgYXJlIG5vdCBpbmRpc3Rpbmd1aXNoYWJsZVxuICAgIC8vICAgICBvdXRyaWdodCwgdGhvdWdoOiBhIG1hcmtlciBpcyByZWFjaGFibGUgYXRcbiAgICAvLyAgICAgYGN0eC5hcGkuZXhlY3V0aW9uQ29udGV4dC5fX3JlZmVyZW50aWFsRmllbGRDbGVhcmAsIGB0cnVlYCBvbiB0aGVcbiAgICAvLyAgICAgY2FzY2FkZSBhbmQgYHVuZGVmaW5lZGAgb24gdGhlIGhhbmQtY2xlYXIuIFRoZSAjMTE2NSBydWxpbmcgb2ZcbiAgICAvLyAgICAgMjAyNi0wOC0yNSB1cGhlbGQgTk9UIHJlYWRpbmcgaXQgXHUyMDE0IGFuIG9wZXJhdGlvbi1wcml2YXRlIGtleSBpcyBhblxuICAgIC8vICAgICB1bmRlY2xhcmVkIGRlcGVuZGVuY3ksIGFuZCBhIGhvb2sgYm9keSBpbiBRdWlja0pTIGNhbiBiZSBoYW5kZWQgYW5cbiAgICAvLyAgICAgYXBpIHNoaW0gd2l0aCBubyBgZXhlY3V0aW9uQ29udGV4dGAgYXQgYWxsICgjMTQxMjsgdGhlIGRlY2xhcmVkXG4gICAgLy8gICAgIHJlcGxhY2VtZW50IGlzIGFza2VkIGZvciBhcyBvYmplY3RzdGFjay1haS9vYmplY3RzdGFjayMxMzY0NCkuXG4gICAgLy8gICAgIE5vbmUgb2Ygd2hpY2ggY2hhbmdlcyB0aGlzIGJsb2NrLCBhbmQgdGhhdCBpcyB0aGUgcG9pbnQ6IGFza2luZyBcImlzXG4gICAgLy8gICAgIHRoZSBwYWlyIHN0aWxsIHdob2xlP1wiIG5lZWRzIG5vIHByb3ZlbmFuY2UgYXQgYWxsLCBhbmQgYW5zd2VycyBib3RoXG4gICAgLy8gICAgIGNhbGxlcnMgdGhlIHNhbWUgY29ycmVjdCB3YXkgXHUyMDE0IGEgbGVhZCB3aG9zZSBsaW5rIHlvdSByZW1vdmVkIG5vXG4gICAgLy8gICAgIGxvbmdlciBkdXBsaWNhdGVzIGFueXRoaW5nLCBob3dldmVyIHRoZSByZW1vdmFsIHdhcyBzcGVsbGVkLlxuICAgIC8vXG4gICAgLy8gICAgIEl0IGRvZXMgTk9UIGxvb3NlbiB0aGUgcGFpcmluZywgd2hpY2ggaXMgdGhlIHRoaW5nIHRvIGNoZWNrIHdoZW5cbiAgICAvLyAgICAgcmVhZGluZyB0aGlzOiBhIHdyaXRlIHRoYXQgU1RBVEVTIGEgdHlwZSB3aXRob3V0IG5hbWluZyBhIHJlY29yZCBpc1xuICAgIC8vICAgICBzdGlsbCByZWZ1c2VkIGJ5IGByZXF1aXJlZFdoZW5gLCBvbiBpbnNlcnQgYW5kIG9uIHVwZGF0ZS4gVGhhdCBpcyB3aGF0XG4gICAgLy8gICAgIHRoZSBgcmVzdGF0ZWRgIGd1YXJkIGJlbG93IHByb3RlY3RzIFx1MjAxNCBhIHBheWxvYWQgY2FycnlpbmcgaXRzIG93blxuICAgIC8vICAgICBub24tYmxhbmsgYGR1cGxpY2F0ZV9vZl90eXBlYCBpcyBhbiBhdXRob3IncyBjbGFpbSwgc28gaXQgaXMgbGVmdCBmb3JcbiAgICAvLyAgICAgdGhlIHJ1bGUgdG8ganVkZ2UgaW5zdGVhZCBvZiBiZWluZyBxdWlldGx5IGRlbGV0ZWQuXG4gICAgLy9cbiAgICAvLyAgICAgXHUyNkEwXHVGRTBGIFByaW9yaXR5IDMwMCBpcyBsb2FkLWJlYXJpbmcgaGVyZSwgbm90IGp1c3QgZm9yIGpvYiAyOlxuICAgIC8vICAgICBgbGVhZF9hdXRvbWF0aW9uYCAoMjAwKSBtdXN0IHNlZSB0aGUgQ0FMTEVSJ3MgcGF5bG9hZCBiZWZvcmUgdGhlc2UgdHdvXG4gICAgLy8gICAgIG51bGxzIGFyZSBhZGRlZCB0byBpdC4gSXRzIHJlZmVyZW5jZS1jbGVhbnVwIHlpZWxkIHBhc3NlcyBhIHdyaXRlIG9ubHlcbiAgICAvLyAgICAgd2hlbiBldmVyeSBub24tc3lzdGVtIGNoYW5nZSBpcyBhIGRlY2xhcmVkIExPT0tVUCBnb2luZyB2YWx1ZVx1MjE5Mm51bGwsXG4gICAgLy8gICAgIGFuZCBgZHVwbGljYXRlX29mX3R5cGVgIC8gYGR1cGxpY2F0ZV9zdGF0dXNgIGFyZSBuZWl0aGVyIFx1MjAxNCBzbyBhdCBhXG4gICAgLy8gICAgIGxvd2VyIHByaW9yaXR5IHRoaXMgYmxvY2sgd291bGQgbWFrZSB0aGUgY29udmVydGVkLWxlYWQgbG9jayByZWZ1c2VcbiAgICAvLyAgICAgdGhlIHZlcnkgY2xlYW51cCB0aGF0IHlpZWxkIGV4aXN0cyB0byBhbGxvdy5cbiAgICAvLyBEMyBzdGFuZC1kb3duIG9uIHRoZSBwcmVkaWNhdGUgcGF0aCBcdTIwMTQgdGhlIGBlbWFpbGAgLyBgY29tcGFueV9ub3JtYWxpemVkYFxuICAgIC8vIG5vcm1hbGlzYXRpb24gYWJvdmUgcmVhZHMgb25seSB0aGUgcGF5bG9hZCwgc28gaXQgaXMgYmF0Y2gtc2NvcGVkIGJ5XG4gICAgLy8gY29uc3RydWN0aW9uIGFuZCBrZWVwcyBydW5uaW5nLiBUaGlzIGJsb2NrIGlzIG5vdDogc2VlIGBmb3JlY2FzdC5ob29rLnRzYC5cbiAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIGN0eC5kaXNwYXRjaD8ubW9kZSAhPT0gJ3Blci1yb3cnKSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICAgIGNvbnN0IExJTktfT0ZfVFlQRTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgY3JtX2xlYWQ6ICdkdXBsaWNhdGVfb2ZfbGVhZCcsXG4gICAgICAgIGNybV9jb250YWN0OiAnZHVwbGljYXRlX29mX2NvbnRhY3QnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3RhdGVkID0gJ2R1cGxpY2F0ZV9vZl90eXBlJyBpbiBpbnB1dCAmJiAhaXNCbGFuayhpbnB1dC5kdXBsaWNhdGVfb2ZfdHlwZSk7XG4gICAgICBjb25zdCBkZWNsYXJlZCA9IHByZXZpb3VzPy5kdXBsaWNhdGVfb2ZfdHlwZTtcbiAgICAgIGNvbnN0IGxpbmsgPSB0eXBlb2YgZGVjbGFyZWQgPT09ICdzdHJpbmcnID8gTElOS19PRl9UWVBFW2RlY2xhcmVkXSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICghcmVzdGF0ZWQgJiYgbGluayAmJiBsaW5rIGluIGlucHV0ICYmIGlzQmxhbmsoaW5wdXRbbGlua10pKSB7XG4gICAgICAgIC8vIFR3byBvdXRjb21lcywgYW5kIHdoaWNoIGFwcGxpZXMgdHVybnMgb24gT05FIHF1ZXN0aW9uOiBkaWQgYSBodW1hblxuICAgICAgICAvLyBldmVyIGxvb2sgYXQgdGhlc2UgdHdvIHJlY29yZHMgYW5kIGFncmVlPyBgZHVwbGljYXRlX3N0YXR1c2AgYWxyZWFkeVxuICAgICAgICAvLyByZWNvcmRzIGV4YWN0bHkgdGhhdCwgc28gdGhlIHF1ZXN0aW9uIGlzIGFuc3dlcmVkIGZyb20gdGhlIHJlY29yZCdzXG4gICAgICAgIC8vIG93biB2b2NhYnVsYXJ5IHJhdGhlciB0aGFuIGZyb20gYSBzZWNvbmQgcnVsZSByZXN0YXRlZCBoZXJlLlxuICAgICAgICAvL1xuICAgICAgICAvLyAgIGBjb25maXJtZWRgIFx1MjAxNCBhIHBlcnNvbiBjb21wYXJlZCB0aGUgdHdvIHJlY29yZHMgYW5kIHNhaWQgeWVzLiBUaGVcbiAgICAgICAgLy8gICAgIHJlY29yZCBpdCBuYW1lZCBpcyBnb25lLCBidXQgdGhlIFZFUkRJQ1QgaXMgYWJvdXQgd2hhdCB0aGVcbiAgICAgICAgLy8gICAgIHJldmlld2VyIGZvdW5kLCBub3QgYWJvdXQgdGhlIHBvaW50ZXIuIFNvIHRoZSBjbGFpbSBpc1xuICAgICAgICAvLyAgICAgVE9NQlNUT05FRDogdGhlIGRpc2NyaW1pbmF0b3IgbW92ZXMgdG8gYGVyYXNlZGAgYW5kIHRoZSBzdGF0dXNcbiAgICAgICAgLy8gICAgIHN0YW5kcywgYW5kIHRoZSBsZWFkIGdvZXMgb24gc2F5aW5nIFwiY29uZmlybWVkIGR1cGxpY2F0ZSBvZiBhXG4gICAgICAgIC8vICAgICByZWNvcmQgdGhhdCBoYXMgc2luY2UgYmVlbiBlcmFzZWRcIi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICBhbnl0aGluZyBlbHNlIFx1MjAxNCB0aGUgbWFjaGluZSdzIGBzdXNwZWN0ZWRgIGd1ZXNzLCBvciBubyBvcGluaW9uIGF0XG4gICAgICAgIC8vICAgICBhbGwuIFJldGlyZWQgV0hPTEU7IHRoZXJlIGlzIG5vIGh1bWFuIHZlcmRpY3QgdG8gcHJlc2VydmUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFx1MjZBMFx1RkUwRiBgJ2VyYXNlZCdgIGlzIHNwZWxsZWQgSU5MSU5FIG9uIHB1cnBvc2UuIEwyIGhvb2sgYm9kaWVzIHJ1blxuICAgICAgICAvLyBib2R5LW9ubHkgaW4gdGhlIFF1aWNrSlMgc2FuZGJveCwgc28gYERVUExJQ0FURV9PRl9UWVBFX0VSQVNFRGAgZnJvbVxuICAgICAgICAvLyBgX3BpY2tsaXN0cy50c2Agd291bGQgcmVzb2x2ZSBhdCBhdXRob3JpbmcgdGltZSBhbmQgYXJyaXZlIGFzXG4gICAgICAgIC8vIGB1bmRlZmluZWRgLiBUaGUgY2Fub25pY2FsIGNvbnN0YW50IGlzIHRoZSBvbmUgaW4gYF9waWNrbGlzdHMudHNgO1xuICAgICAgICAvLyBgdGVzdC9sZWFkLWR1cGxpY2F0ZS1tYW5hZ2VtZW50LnRlc3QudHNgIHBpbnMgdGhpcyBsaXRlcmFsIHRvIGl0IGFuZFxuICAgICAgICAvLyBwaW5zIHRoaXMgYmxvY2sgYXMgaXRzIG9ubHkgd3JpdGVyLCBzbyB0aGUgdHdvIGNhbm5vdCBkcmlmdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIHZlcmRpY3QgaXMgcmVhZCBmcm9tIGBwcmV2aW91c2AsIGFuZCB0aGUgd3JpdGUgbXVzdCBiZSBTSUxFTlRcbiAgICAgICAgLy8gYWJvdXQgaXQgXHUyMDE0IGAnZHVwbGljYXRlX3N0YXR1cycgaW4gaW5wdXRgIGRpc3F1YWxpZmllcyB0aGUgdG9tYnN0b25lLlxuICAgICAgICAvLyBUaGF0IGtlZXBzIHRoZSB0b21ic3RvbmUgb24gdGhlIGVyYXN1cmUgcGF0aCBhbmQgb2ZmIGV2ZXJ5IG90aGVyIG9uZTpcbiAgICAgICAgLy8gdGhlIGVuZ2luZSdzIGBzZXRfbnVsbGAgY2xlYW51cCBuZXZlciBtZW50aW9ucyB0aGUgc3RhdHVzLCB3aGlsZSBhXG4gICAgICAgIC8vIGNhbGxlciB0aGF0IERPRVMgbWVudGlvbiBpdCBpcyBtYW5hZ2luZyB0aGUgY2xhaW0gYnkgaGFuZCwgYW5kIGFcbiAgICAgICAgLy8gaGFuZC1ibGFua2VkIHBvaW50ZXIgaXMgbm90IGFuIGVyYXN1cmUuIEl0IGFsc28gbWVhbnMgbm8gcGF5bG9hZCBjYW5cbiAgICAgICAgLy8gbWFudWZhY3R1cmUgYSB0b21ic3RvbmUgYnkgc3VwcGx5aW5nIGl0cyBvd24gYGNvbmZpcm1lZGAuXG4gICAgICAgIGlmICghKCdkdXBsaWNhdGVfc3RhdHVzJyBpbiBpbnB1dCkgJiYgcHJldmlvdXM/LmR1cGxpY2F0ZV9zdGF0dXMgPT09ICdjb25maXJtZWQnKSB7XG4gICAgICAgICAgaW5wdXQuZHVwbGljYXRlX29mX3R5cGUgPSAnZXJhc2VkJztcbiAgICAgICAgICAvLyBgZHVwbGljYXRlX3N0YXR1c2AgZGVsaWJlcmF0ZWx5IFVOVE9VQ0hFRCBcdTIwMTQgaXQgc3RheXMgYGNvbmZpcm1lZGAsXG4gICAgICAgICAgLy8gd2hpY2ggaXMgd2hhdCBrZWVwcyB0aGUgc3Vydml2aW5nIHN0YXRlIHJlYWRhYmxlIGFzIGEgdmVyZGljdC5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnB1dC5kdXBsaWNhdGVfb2ZfdHlwZSA9IG51bGw7XG4gICAgICAgICAgLy8gYGR1cGxpY2F0ZV9zdGF0dXNgIGdvZXMgd2l0aCBpdC4gSXRzIHJlYWRlcnMgaW4gdGhpcyBhcHAgYXJlIHRoZVxuICAgICAgICAgIC8vIGBzdXNwZWN0ZWRfZHVwbGljYXRlc2AgcmV2aWV3IHF1ZXVlIChgc3JjL3NhbGVzL3ZpZXdzL2xlYWQudmlldy50c2ApLFxuICAgICAgICAgIC8vIHdob3NlIHdob2xlIHdvcmtmbG93IGlzIFwib3BlbiB0aGUgdHdvIHJlY29yZHMgYW5kIGNvbXBhcmUgdGhlbVwiO1xuICAgICAgICAgIC8vIHRoZSBgZHVwbGljYXRlX2Rpc3F1YWxpZmljYXRpb25fcmVxdWlyZXNfc3Vydml2b3JgIHZhbGlkYXRpb24sXG4gICAgICAgICAgLy8gd2hpY2ggZGVtYW5kcyBhIE5BTUVEIHN1cnZpdm9yOyB0aGUgZHVwbGljYXRlIGZvcm0gYmxvY2s7IGFuZCB0aGlzXG4gICAgICAgICAgLy8gaG9vaydzIG93biBpbnNlcnQtdGltZSBzdGFuZC1kb3duLCB3aGljaCByZWFkcyB0aGUgcGF5bG9hZCBhbmRcbiAgICAgICAgICAvLyBuZXZlciB0aGUgc3RvcmVkIHJvdy4gV2l0aCBubyBsaW5rIGxlZnQsIG5vbmUgb2YgdGhlbSBjYW4gYWN0IG9uXG4gICAgICAgICAgLy8gYHN1c3BlY3RlZGAsIGFuZCBsZWF2aW5nIGl0IHdvdWxkIHBhcmsgYSBwZXJtYW5lbnRseSB1bndvcmthYmxlIHJvd1xuICAgICAgICAgIC8vIGluIHRoYXQgcXVldWUuIFRoZSB2ZXJkaWN0IGlzIG5vdCBsb3N0OiBgZHVwbGljYXRlX3N0YXR1c2AgZGVjbGFyZXNcbiAgICAgICAgICAvLyBgdHJhY2tIaXN0b3J5OiB0cnVlYCwgc28gd2hvIGRlY2lkZWQgd2hhdCwgYW5kIHdoZW4sIHN0YXlzIG9uIHRoZVxuICAgICAgICAgIC8vIHJlY29yZCdzIGZpZWxkIGhpc3RvcnkuXG4gICAgICAgICAgaW5wdXQuZHVwbGljYXRlX3N0YXR1cyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgIT09ICdiZWZvcmVJbnNlcnQnIHx8ICFlbWFpbCkgcmV0dXJuO1xuXG4gICAgLy8gMi4gTmV2ZXIgb3ZlcndyaXRlIGFuIG9waW5pb24gdGhlIHJlY29yZCBhbHJlYWR5IGNhcnJpZXMuIFRoZVxuICAgIC8vICAgIGBkdXBsaWNhdGVfc3RhdHVzYCBoYWxmIGlzIHRoZSBsb2FkLWJlYXJpbmcgb25lOiBpdCBpcyB3aGF0IGtlZXBzIGFcbiAgICAvLyAgICBodW1hbidzIGBjb25maXJtZWRgIHZlcmRpY3Qgc2FmZSBmcm9tIGFueSBsYXRlciBhdXRvbWF0aWMgd3JpdGUuXG4gICAgaWYgKCFpc0JsYW5rKGlucHV0LmR1cGxpY2F0ZV9zdGF0dXMpIHx8ICFpc0JsYW5rKGlucHV0LmR1cGxpY2F0ZV9vZl90eXBlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXBpKSByZXR1cm47XG5cbiAgICAvKiogT2xkZXN0IHJvdyB3aW5zOyBhbiB1bmRhdGVkIHJvdyBvbmx5IHdpbnMgaWYgbm90aGluZyBkYXRlZCBpcyBwcmVzZW50LiAqL1xuICAgIGNvbnN0IG9yaWdpbmFsID0gKHJvd3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBsZXQgYmVzdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IGJlc3RLZXkgPSBJbmZpbml0eTtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgY29uc3QgaWQgPSB0eXBlb2Ygcm93LmlkID09PSAnc3RyaW5nJyA/IHJvdy5pZCA6ICcnO1xuICAgICAgICBpZiAoIWlkKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcmF3ID0gcm93LmNyZWF0ZWRfYXQ7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9XG4gICAgICAgICAgdHlwZW9mIHJhdyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHJhdyA9PT0gJ251bWJlcicgfHwgcmF3IGluc3RhbmNlb2YgRGF0ZVxuICAgICAgICAgICAgPyBuZXcgRGF0ZShyYXcgYXMgc3RyaW5nKS5nZXRUaW1lKClcbiAgICAgICAgICAgIDogTnVtYmVyLk5hTjtcbiAgICAgICAgY29uc3Qga2V5ID0gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgPyBwYXJzZWQgOiBJbmZpbml0eTtcbiAgICAgICAgaWYgKGJlc3QgPT09IHVuZGVmaW5lZCB8fCBrZXkgPCBiZXN0S2V5KSB7XG4gICAgICAgICAgYmVzdCA9IGlkO1xuICAgICAgICAgIGJlc3RLZXkgPSBrZXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBiZXN0O1xuICAgIH07XG5cbiAgICAvLyBCZXN0LWVmZm9ydCBFTkhBTkNFTUVOVCwgbmV2ZXIgYSBnYXRlIG9uIHRoZSB3cml0ZSBcdTIwMTQgaWRlbnRpY2FsIHRvXG4gICAgLy8gYGxlYWRfYXV0b19hc3NpZ25gIGFib3ZlLiBBbiBhbm9ueW1vdXMgV2ViLXRvLUxlYWQgc3VibWlzc2lvbiBydW5zIHVuZGVyXG4gICAgLy8gdGhlIGBndWVzdF9wb3J0YWxgIGdyYW50LCB3aGljaCBpcyBJTlNFUlQtb25seSBvbiBgY3JtX2xlYWRgIGFuZCBkZW5pZXNcbiAgICAvLyByZWFkcyBvdXRyaWdodDsgbGV0dGluZyB0aGF0IGRlbmlhbCBwcm9wYWdhdGUgd291bGQgcmVqZWN0IHRoZSB2ZXJ5XG4gICAgLy8gc3VibWlzc2lvbiB0aGlzIGZlYXR1cmUgZXhpc3RzIHRvIGFjY2VwdC4gQSBndWVzdCdzIGR1cGxpY2F0ZSB0aGVyZWZvcmVcbiAgICAvLyBsYW5kcyB1bmZsYWdnZWQgcmF0aGVyIHRoYW4gbm90IGxhbmRpbmcgYXQgYWxsLlxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250YWN0cyA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9jb250YWN0JykuZmluZCh7XG4gICAgICAgIHdoZXJlOiB7IGVtYWlsIH0sXG4gICAgICAgIGZpZWxkczogWydpZCcsICdjcmVhdGVkX2F0J10sXG4gICAgICAgIHRvcDogU0NBTl9MSU1JVCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY29udGFjdElkID0gb3JpZ2luYWwoY29udGFjdHMgPz8gW10pO1xuICAgICAgaWYgKGNvbnRhY3RJZCkge1xuICAgICAgICBpbnB1dC5kdXBsaWNhdGVfb2ZfdHlwZSA9ICdjcm1fY29udGFjdCc7XG4gICAgICAgIGlucHV0LmR1cGxpY2F0ZV9vZl9jb250YWN0ID0gY29udGFjdElkO1xuICAgICAgICBpbnB1dC5kdXBsaWNhdGVfc3RhdHVzID0gJ3N1c3BlY3RlZCc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gT3BlbiBsZWFkcyBvbmx5LiBBIHByZWRlY2Vzc29yIHRoYXQgYWxyZWFkeSBjb252ZXJ0ZWQgaXMgcmVwcmVzZW50ZWQgYnlcbiAgICAgIC8vIHRoZSBjb250YWN0IGl0IGNyZWF0ZWQsIHdoaWNoIHRoZSBicmFuY2ggYWJvdmUgbWF0Y2hlcyBvbiB0aGUgc2FtZVxuICAgICAgLy8gYWRkcmVzcyBcdTIwMTQgcG9pbnRpbmcgYXQgdGhlIGxvY2tlZCBsZWFkIGluc3RlYWQgd291bGQgbmFtZSBhIHJlY29yZFxuICAgICAgLy8gbm9ib2R5IGNhbiB3b3JrLlxuICAgICAgY29uc3QgbGVhZHMgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fbGVhZCcpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBlbWFpbCwgaXNfY29udmVydGVkOiBmYWxzZSB9LFxuICAgICAgICBmaWVsZHM6IFsnaWQnLCAnY3JlYXRlZF9hdCddLFxuICAgICAgICB0b3A6IFNDQU5fTElNSVQsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxlYWRJZCA9IG9yaWdpbmFsKGxlYWRzID8/IFtdKTtcbiAgICAgIGlmIChsZWFkSWQpIHtcbiAgICAgICAgaW5wdXQuZHVwbGljYXRlX29mX3R5cGUgPSAnY3JtX2xlYWQnO1xuICAgICAgICBpbnB1dC5kdXBsaWNhdGVfb2ZfbGVhZCA9IGxlYWRJZDtcbiAgICAgICAgaW5wdXQuZHVwbGljYXRlX3N0YXR1cyA9ICdzdXNwZWN0ZWQnO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3dhbGxvdzogc2VlIGFib3ZlLiAoTm8gYGNvbnNvbGVgIGluIHRoZSBMMiBob29rIHNhbmRib3guKVxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFtsZWFkQXV0b0Fzc2lnbkhvb2ssIGxlYWRIb29rLCBsZWFkRHVwbGljYXRlQ2hlY2tIb29rXTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvbGVhZC5jYW1wYWlnbi1tZXRyaWNzLmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2xlYWQuY2FtcGFpZ24tbWV0cmljcy5ob29rLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tDb250ZXh0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEhvb2tBcGkgfSBmcm9tICcuL19ob29rLWFwaSc7XG5cbi8qKlxuICogQ2FtcGFpZ24gbWV0cmljIHJlZnJlc2gsIHRyaWdnZXJlZCBieSBhIExFQUQgY29udmVyc2lvbi5cbiAqXG4gKiBBdHRhY2hlZCB0byBgY3JtX2xlYWRgLCB3aGljaCB0aGUgc2FsZXMgcGFja2FnZSBvd25zLCBzbyBpdCBsaXZlcyBoZXJlXG4gKiBiZXNpZGUgdGhhdCBvYmplY3QgcmF0aGVyIHRoYW4gd2l0aCB0aGUgY2FtcGFpZ24gbWV0YWRhdGEgaXQgbWFpbnRhaW5zXG4gKiAocGxhbiBpdGVtIDY6IGEgaG9vayBzaXRzIGJlc2lkZSBpdHMgb2JqZWN0LCB3aGljaCBpcyB3aGF0IGVuZm9yY2VzIFI0KS5cbiAqIEl0cyB0aHJlZSBzaWJsaW5nczogYGNhbXBhaWduX3ZhbGlkYXRpb25gIGFuZCBgY2FtcGFpZ25fbWV0cmljc19yZWZyZXNoYCBvblxuICogYGNybV9jYW1wYWlnbmAgaW4gYHNyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbi5ob29rLnRzYCwgYW5kXG4gKiBgY2FtcGFpZ25fYXR0cmlidXRpb25fcmVmcmVzaGAgb24gYGNybV9vcHBvcnR1bml0eWAgbmV4dCBkb29yIGluXG4gKiBgb3Bwb3J0dW5pdHkuY2FtcGFpZ24tbWV0cmljcy5ob29rLnRzYC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgV0hZIFRIRSBSRUNPTVBVVEUgSVMgV1JJVFRFTiBPVVQgRk9VUiBUSU1FUy5cbiAqXG4gKiBMMiBob29rIGJvZGllcyBhcmUgbG93ZXJlZCB0byBtZXRhZGF0YSBhbmQgZXZhbHVhdGVkIEJPRFktT05MWSBpbiB0aGUgUXVpY2tKU1xuICogc2FuZGJveDogYSBoYW5kbGVyIGNhbm5vdCByZWFjaCBtb2R1bGUgc2NvcGUgYXQgcnVudGltZSwgc28gYSBzaGFyZWRcbiAqIGByZWZyZXNoQ2FtcGFpZ25NZXRyaWNzKClgIGltcG9ydCB3b3VsZCBiZSBhIGZyZWUgaWRlbnRpZmllciBcdTIwMTQgdGhlIENMSSBidWlsZFxuICogc2lsZW50bHkgZGVjbGluZXMgdG8gbG93ZXIgdGhlIGhhbmRsZXIsIGtlZXBzIGl0IGluIGEgYnVuZGxlZCBydW50aW1lIGZpbGUsXG4gKiBhbmQgdGhlIGhvb2sgc3RvcHMgYmVpbmcgZGVwbG95YWJsZSBhcyBwdXJlIG1ldGFkYXRhICh0aGUgYnVpbGQgc2F5cyBzbyBpblxuICogb25lIGxpbmUgbm9ib2R5IHJlYWRzKS4gYHRlc3QvYWN0aW9uLXNhbmRib3gudGVzdC50c2AgaXMgd2hhdCBjYXRjaGVzIGl0LlxuICpcbiAqIFNvIHRoZSBhcml0aG1ldGljIGlzIGlubGluZWQgcGVyIGhhbmRsZXIuIFRoZSBkdXBsaWNhdGlvbiBpcyBOT1QgdHJ1c3RlZDpcbiAqIGB0ZXN0L2NhbXBhaWduLW1lbWJlci1saWZlY3ljbGUudGVzdC50c2AgbG93ZXJzIGFsbCBmb3VyIGJvZGllcyBhbmQgYXNzZXJ0c1xuICogdGhlIHJlY29tcHV0ZSBibG9jayBpcyBjaGFyYWN0ZXItaWRlbnRpY2FsIGFjcm9zcyB0aGVtLCBzbyBhIGZpeCBsYW5kaW5nIG9uXG4gKiBvbmUgY29weSBhbmQgc2tpcHBpbmcgdGhyZWUgZmFpbHMgYSB0ZXN0IGluc3RlYWQgb2Ygc2hpcHBpbmcgZm91ciBkZWZpbml0aW9uc1xuICogb2YgYG51bV9zZW50YC4gU3BsaXR0aW5nIHRoZSBmb3VyIGFjcm9zcyB0aHJlZSBmaWxlcyBieSBvd25pbmcgb2JqZWN0IGNoYW5nZWRcbiAqIG5vbmUgb2YgdGhhdCBcdTIwMTQgdGhlIHN1aXRlIHJlYWRzIHRoZW0gYnkgaG9vayBuYW1lLCBub3QgYnkgZmlsZS5cbiAqL1xuXG4vKipcbiAqIFByb21vdGUgdGhlIG1lbWJlciByb3dzIG9mIGEgY29udmVydGluZyBsZWFkLCB0aGVuIHJlY29tcHV0ZS5cbiAqXG4gKiBUaGlzIGhvb2sgaXMgYGNvbnZlcnRlZGAncyBPTkxZIHdyaXRlciwgYW5kIHdpdGhvdXQgaXQgdGhhdCBzdGF0dXMgb3B0aW9uXG4gKiB3b3VsZCBiZSBleGFjdGx5IHRoZSBraW5kIG9mIGluZXJ0IHZvY2FidWxhcnkgIzU5NyByZW1vdmVkIHRoZSB0cmFja2VyIHN0YXRlc1xuICogZm9yIFx1MjAxNCBhIHZhbHVlIHRoZSBwaWNrbGlzdCBvZmZlcnMsIHRoZSBST0kgc3VyZmFjZXMgc2VnbWVudCBieSwgYW5kIG5vdGhpbmdcbiAqIHByb2R1Y2VzLiBDb252ZXJzaW9uIGlzIHRoZSBvbmUgY2FtcGFpZ24gb3V0Y29tZSB0aGUgYXBwIGNhbiBvYnNlcnZlIGJ5XG4gKiBpdHNlbGY6IGBjcm1fbGVhZC5pc19jb252ZXJ0ZWRgIGZsaXBzICh0aGUgYGxlYWRfY29udmVyc2lvbmAgZmxvdywgb3IgdGhlXG4gKiBjb252ZXJ0IGFjdGlvbiksIGFuZCBldmVyeSBjYW1wYWlnbiB0aGF0IGxlYWQgd2FzIGVucm9sbGVkIGluIGhhcyBqdXN0XG4gKiByZWNvcmRlZCBhIGNvbnZlcnNpb24uXG4gKlxuICogT25seSBtZW1iZXJzIHN0aWxsIGBzZW50YCBvciBgcmVzcG9uZGVkYCBhcmUgcHJvbW90ZWQuIEFuIGB1bnN1YnNjcmliZWRgXG4gKiBtZW1iZXIgaXMgTk9UOiB0aGF0IHBlcnNvbiBhc2tlZCB0byBiZSBsZWZ0IGFsb25lLCBhbmQgb3ZlcndyaXRpbmcgdGhlaXJcbiAqIG9wdC1vdXQgc3RhdGUgd2l0aCBhIG1hcmtldGluZyBvdXRjb21lIGlzIHByZWNpc2VseSB0aGUga2luZCBvZiBxdWlldCByZXdyaXRlXG4gKiBgY2FtcGFpZ25fbWVtYmVyX29wdG91dF9zeW5jYCBleGlzdHMgdG8gcHJldmVudC5cbiAqXG4gKiBgbnVtX2NvbnZlcnRlZF9sZWFkc2AgYWxzbyBjb3VudHMgYGNybV9sZWFkLmlzX2NvbnZlcnRlZGAgYWNyb3NzIHRoZVxuICogbWVtYmVyc2hpcCwgc28gdGhpcyBzYW1lIGV2ZW50IGlzIHRoZSBtZXRyaWMncyB0cmlnZ2VyIFx1MjAxNCBhIGxlYWQgY2FuIHNpdCBpblxuICogc2V2ZXJhbCBjYW1wYWlnbnMgYW5kIGV2ZXJ5IG9uZSBvZiB0aGVtIGlzIHJlZnJlc2hlZC5cbiAqXG4gKiBgcnVuQXM6ICdzeXN0ZW0nYCAoIzIwMTQsIEFHRU5UUy5tZCBydWxlIDkpLiBDb252ZXJzaW9ucyBhcmUgYSByZXAncyBhY3QsXG4gKiBhbmQgYSByZXAgbWF5IGVkaXQgbmVpdGhlciBjYW1wYWlnbiBtZW1iZXJzIG5vciBjYW1wYWlnbnMsIHNvIHRoZSBwcm9tb3Rpb25cbiAqIHdhcyByZWZ1c2VkLCBsb2dnZWQgYW5kIHN3YWxsb3dlZDogdGhlIGxlYWQgY29udmVydGVkIGFuZCBpdHMgbWVtYmVyc2hpcHNcbiAqIHN0YXllZCB3aGVyZSB0aGV5IHdlcmUuIFRoZSBwcm9tb3Rpb24gYW5kIHRoZSByZWNvbXB1dGUgYXJlIG1hcmtldGluZydzXG4gKiByZWNvcmQgb2YgdGhlIG91dGNvbWUsIG5vdCB0aGUgcmVwJ3Mgd3JpdGUsIHNvIHRoZSBob29rIGVsZXZhdGVzOyB0aGUgbGVhZFxuICogd3JpdGUgc3RheXMgdGhlIGNhbGxlcidzLiBPcmdhbml6YXRpb24gKHJ1bGUgMTApOiBldmVyeSByZWFkIGlzIGtleWVkIHRvIHRoZVxuICogdHJpZ2dlcmluZyBsZWFkJ3Mgb3duIG1lbWJlcnNoaXBzIGFuZCB0aGVpciBjYW1wYWlnbnMsIGFuZCB0aGUgZWxldmF0ZWRcbiAqIGBjdHguYXBpYCBrZWVwcyB0aGUgdHJpZ2dlcidzIHRlbmFudC5cbiAqL1xuY29uc3QgY2FtcGFpZ25MZWFkQ29udmVyc2lvblJlZnJlc2g6IEhvb2sgPSB7XG4gIG5hbWU6ICdjYW1wYWlnbl9sZWFkX2NvbnZlcnNpb25fcmVmcmVzaCcsXG4gIG9iamVjdDogJ2NybV9sZWFkJyxcbiAgZXZlbnRzOiBbJ2FmdGVyVXBkYXRlJ10sXG4gIHByaW9yaXR5OiA4MTAsXG4gIGFzeW5jOiB0cnVlLFxuICBvbkVycm9yOiAnbG9nJyxcbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICBkZXNjcmlwdGlvbjogJ1Byb21vdGUgY2FtcGFpZ24gbWVtYmVycyBvZiBhIGNvbnZlcnRpbmcgbGVhZCBhbmQgcmVjb21wdXRlIGNhbXBhaWduIG1ldHJpY3MuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgaWYgKGlucHV0Py5pc19jb252ZXJ0ZWQgIT09IHRydWUpIHJldHVybjtcbiAgICBpZiAocHJldmlvdXM/LmlzX2NvbnZlcnRlZCA9PT0gdHJ1ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGxlYWRJZCA9XG4gICAgICAodHlwZW9mIGlucHV0Py5pZCA9PT0gJ3N0cmluZycgJiYgaW5wdXQuaWQpIHx8XG4gICAgICAodHlwZW9mIHByZXZpb3VzPy5pZCA9PT0gJ3N0cmluZycgPyAocHJldmlvdXMuaWQgYXMgc3RyaW5nKSA6ICcnKTtcbiAgICBpZiAoIWxlYWRJZCkgcmV0dXJuO1xuICAgIC8vIGBpZGAgaXMgcHJvamVjdGVkIGJlY2F1c2UgdGhlIHByb21vdGlvbiBiZWxvdyB1cGRhdGVzIGVhY2ggcm93IGJ5IGl0OlxuICAgIC8vIHRoZSBTUUwgZGF0YXNvdXJjZSByZXR1cm5zIGV4YWN0bHkgdGhlIGNvbHVtbnMgYSByZWFkIG5hbWVzICgjMjAxOCkuXG4gICAgY29uc3QgbWVtYmVyc2hpcHMgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fY2FtcGFpZ25fbWVtYmVyJykuZmluZCh7XG4gICAgICB3aGVyZTogeyBjcm1fbGVhZDogbGVhZElkIH0sIGZpZWxkczogWydpZCcsICdjcm1fY2FtcGFpZ24nLCAnc3RhdHVzJ10sIHRvcDogNTAwLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3QgbSBvZiBtZW1iZXJzaGlwcykge1xuICAgICAgY29uc3QgbWVtYmVySWQgPSB0eXBlb2YgbS5pZCA9PT0gJ3N0cmluZycgPyBtLmlkIDogJyc7XG4gICAgICBpZiAoIW1lbWJlcklkKSBjb250aW51ZTtcbiAgICAgIGlmIChtLnN0YXR1cyAhPT0gJ3NlbnQnICYmIG0uc3RhdHVzICE9PSAncmVzcG9uZGVkJykgY29udGludWU7XG4gICAgICBhd2FpdCBhcGkub2JqZWN0KCdjcm1fY2FtcGFpZ25fbWVtYmVyJykudXBkYXRlKFxuICAgICAgICB7IGlkOiBtZW1iZXJJZCwgc3RhdHVzOiAnY29udmVydGVkJyB9LFxuICAgICAgICB7IHdoZXJlOiB7IGlkOiBtZW1iZXJJZCB9IH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBjYW1wYWlnbklkcyA9IEFycmF5LmZyb20obmV3IFNldChcbiAgICAgIG1lbWJlcnNoaXBzLm1hcCgobSkgPT4gKHR5cGVvZiBtLmNybV9jYW1wYWlnbiA9PT0gJ3N0cmluZycgPyBtLmNybV9jYW1wYWlnbiA6ICcnKSkuZmlsdGVyKEJvb2xlYW4pLFxuICAgICkpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgY2FtcGFpZ25JZHMpIHtcbiAgICAgIC8vIFx1MjUwMFx1MjUwMCByZWNvbXB1dGUgXHUyNTAwXHUyNTAwIGlkZW50aWNhbCBpbiBhbGwgZm91ciByZWZyZXNoIGhvb2tzOyBzZWUgdGhlIGhlYWRlci5cbiAgICAgIGNvbnN0IG1lbWJlclJvd3MgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fY2FtcGFpZ25fbWVtYmVyJykuZmluZCh7XG4gICAgICAgIHdoZXJlOiB7IGNybV9jYW1wYWlnbjogaWQgfSwgZmllbGRzOiBbJ2NybV9sZWFkJywgJ3N0YXR1cyddLCB0b3A6IDUwMDAsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxlYWRJZHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoXG4gICAgICAgIG1lbWJlclJvd3MubWFwKChyKSA9PiAodHlwZW9mIHIuY3JtX2xlYWQgPT09ICdzdHJpbmcnID8gci5jcm1fbGVhZCA6ICcnKSkuZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgKSk7XG4gICAgICBjb25zdCBjb252ZXJ0ZWRMZWFkcyA9IGxlYWRJZHMubGVuZ3RoID4gMFxuICAgICAgICA/IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9sZWFkJykuY291bnQoeyB3aGVyZTogeyBpZDogeyAkaW46IGxlYWRJZHMgfSwgaXNfY29udmVydGVkOiB0cnVlIH0gfSlcbiAgICAgICAgOiAwO1xuICAgICAgY29uc3QgbnVtT3Bwb3J0dW5pdGllcyA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9vcHBvcnR1bml0eScpLmNvdW50KHsgd2hlcmU6IHsgY3JtX2NhbXBhaWduOiBpZCB9IH0pO1xuICAgICAgY29uc3QgbnVtV29uID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykuY291bnQoeyB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGlkLCBzdGFnZTogJ2Nsb3NlZF93b24nIH0gfSk7XG4gICAgICBjb25zdCB3b25Sb3dzID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykuZmluZCh7XG4gICAgICAgIHdoZXJlOiB7IGNybV9jYW1wYWlnbjogaWQsIHN0YWdlOiAnY2xvc2VkX3dvbicgfSwgZmllbGRzOiBbJ2Ftb3VudCddLCB0b3A6IDUwMDAsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGFjdHVhbFJldmVudWUgPSB3b25Sb3dzLnJlZHVjZShcbiAgICAgICAgKHN1bSwgcm93KSA9PiBzdW0gKyAodHlwZW9mIHJvdy5hbW91bnQgPT09ICdudW1iZXInID8gcm93LmFtb3VudCA6IE51bWJlcihyb3cuYW1vdW50KSB8fCAwKSwgMCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBhcGkub2JqZWN0KCdjcm1fY2FtcGFpZ24nKS51cGRhdGUoe1xuICAgICAgICBpZCxcbiAgICAgICAgbnVtX3NlbnQ6IG1lbWJlclJvd3MubGVuZ3RoLFxuICAgICAgICBudW1fcmVzcG9uc2VzOiBtZW1iZXJSb3dzLmZpbHRlcigocikgPT4gci5zdGF0dXMgPT09ICdyZXNwb25kZWQnIHx8IHIuc3RhdHVzID09PSAnY29udmVydGVkJykubGVuZ3RoLFxuICAgICAgICBudW1fbGVhZHM6IGxlYWRJZHMubGVuZ3RoLFxuICAgICAgICBudW1fY29udmVydGVkX2xlYWRzOiBjb252ZXJ0ZWRMZWFkcyxcbiAgICAgICAgbnVtX29wcG9ydHVuaXRpZXM6IG51bU9wcG9ydHVuaXRpZXMsXG4gICAgICAgIG51bV93b25fb3Bwb3J0dW5pdGllczogbnVtV29uLFxuICAgICAgICBhY3R1YWxfcmV2ZW51ZTogYWN0dWFsUmV2ZW51ZSxcbiAgICAgIH0sIHsgd2hlcmU6IHsgaWQgfSB9KTtcbiAgICAgIC8vIFx1MjUwMFx1MjUwMCAvcmVjb21wdXRlIFx1MjUwMFx1MjUwMFxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFtjYW1wYWlnbkxlYWRDb252ZXJzaW9uUmVmcmVzaF07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL29wcG9ydHVuaXR5Lmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL29wcG9ydHVuaXR5Lmhvb2sudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB0eXBlIHsgSG9va0FwaSB9IGZyb20gJy4vX2hvb2stYXBpJztcblxuLyoqXG4gKiBPcHBvcnR1bml0eSBsaWZlY3ljbGUgaG9vay5cbiAqXG4gKiAtIFJlLWRlcml2ZXMgYGV4cGVjdGVkX3JldmVudWVgIGZyb20gYGFtb3VudCAqIHN0YWdlUHJvYmFiaWxpdHlgIHdoZW4gZWl0aGVyIGNoYW5nZXMuXG4gKiAtIFN0YW1wcyBgc3RhZ2VfZW50cnlfZGF0ZWAgb24gaW5zZXJ0IGFuZCBvbiBldmVyeSBzdGFnZSBjaGFuZ2UgXHUyMDE0IHRoZSBzdG9yZWRcbiAqICAgY2xvY2sgYmVoaW5kIHRoZSBgZGF5c19pbl9zdGFnZWAgZm9ybXVsYSBhbmQgdGhlIHN0YWduYXRpb24gc3dlZXAgKCM0ODkpLlxuICogLSBGcmVlemVzIG1vc3QgZmllbGRzIGFmdGVyIHN0YWdlIGlzIGNsb3NlZCAod29uL2xvc3QpIFx1MjAxNCBvbmx5IG5hcnJhdGl2ZSBmaWVsZHNcbiAqICAgZWRpdGFibGUuIFRoZSBmcmVlemUgeWllbGRzIHRvIHRoZSBlbmdpbmUncyByZWZlcmVuY2UgY2xlYW51cCwgc28gYSBjbG9zZWRcbiAqICAgZGVhbCBuZXZlciBtYWtlcyB0aGUgcmVjb3JkcyBpdCBwb2ludHMgYXQgdW5kZWxldGFibGUgKCM3MjApLlxuICogLSBPbiBgY2xvc2VkX3dvbmA6IHN0YW1wcyBgY2xvc2VfZGF0ZT10b2RheWAsIHByb21vdGVzIHRoZSBwYXJlbnQgYWNjb3VudCB0byBgY3VzdG9tZXJgLFxuICogICBhbmQgYXN5bmNocm9ub3VzbHkgc2NoZWR1bGVzIGFuIFwiQWN0aXZhdGUgY3VzdG9tZXJcIiB0YXNrLlxuICovXG5cbmNvbnN0IG9wcG9ydHVuaXR5VmFsaWRhdGlvbkhvb2s6IEhvb2sgPSB7XG4gIG5hbWU6ICdvcHBvcnR1bml0eV9saWZlY3ljbGUnLFxuICBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICBwcmlvcml0eTogMjAwLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnUmVjb21wdXRlIGV4cGVjdGVkX3JldmVudWUsIGZyZWV6ZSBjbG9zZWQgb3Bwb3J0dW5pdGllcyBleGNlcHQgbmFycmF0aXZlIGZpZWxkcy4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIC8vIFRoZSByZWZ1c2FsIGVudmVsb3BlICgjMTA3NSkuIE1pcnJvcmVkIGZyb20gYC4vX3JlZnVzYWwudHNgIGJlY2F1c2UgYVxuICAgIC8vIGxvd2VyZWQgYm9keSBoYXMgbm8gbW9kdWxlIHNjb3BlIGFuZCBgZXh0cmFjdEhvb2tCb2R5YCBUSFJPV1Mgb24gYW5cbiAgICAvLyBpbXBvcnQ7IGB0ZXN0L3JlZnVzYWwtZW52ZWxvcGUudGVzdC50c2AgcGlucyBldmVyeSBjb3B5IGFnYWluc3QgaXQuXG4gICAgZnVuY3Rpb24gcmVmdXNlKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29kZTogc3RyaW5nLFxuICAgICAgc3RhdHVzOiBudW1iZXIsXG4gICAgICB1c2VyTWVzc2FnZTogc3RyaW5nID0gbWVzc2FnZSxcbiAgICApOiBFcnJvciB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSkgYXMgRXJyb3IgJiB7XG4gICAgICAgIGNvZGU6IHN0cmluZztcbiAgICAgICAgc3RhdHVzOiBudW1iZXI7XG4gICAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmc7XG4gICAgICB9O1xuICAgICAgZXJyLmNvZGUgPSBjb2RlO1xuICAgICAgZXJyLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgIGVyci51c2VyTWVzc2FnZSA9IHVzZXJNZXNzYWdlO1xuICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG4gICAgLy8gTk9URTogTDIgaG9vayBib2RpZXMgcnVuICpib2R5LW9ubHkqIGluIGEgc2FuZGJveCAoUXVpY2tKUykgXHUyMDE0IG1vZHVsZS1sZXZlbFxuICAgIC8vIGNvbnN0YW50cyBhcmUgTk9UIGluIHNjb3BlIGF0IHJ1bnRpbWUuIFRoZXNlIE1VU1QgYmUgZGVjbGFyZWQgaW5zaWRlIHRoZVxuICAgIC8vIGhhbmRsZXIgb3IgdGhlIGJvZHkgdGhyb3dzIGBSZWZlcmVuY2VFcnJvcmAgb24gZXZlcnkgd3JpdGUuIChTZWUgQURSIG9uXG4gICAgLy8gc2FuZGJveGVkIGhvb2tzOyBzYW1lIHBhdHRlcm4gYXMgbGVhZC5ob29rLnRzLilcbiAgICBjb25zdCBTVEFHRV9QUk9CQUJJTElUWTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgICAgIHByb3NwZWN0aW5nOiAxMCxcbiAgICAgIHF1YWxpZmljYXRpb246IDI1LFxuICAgICAgbmVlZHNfYW5hbHlzaXM6IDQwLFxuICAgICAgcHJvcG9zYWw6IDYwLFxuICAgICAgbmVnb3RpYXRpb246IDgwLFxuICAgICAgY2xvc2VkX3dvbjogMTAwLFxuICAgICAgY2xvc2VkX2xvc3Q6IDAsXG4gICAgfTtcbiAgICBjb25zdCBOQVJSQVRJVkVfRklFTERTID0gbmV3IFNldChbJ2Rlc2NyaXB0aW9uJywgJ25leHRfc3RlcCcsICdub3RlcyddKTtcbiAgICAvLyBGcmFtZXdvcmstbWFuYWdlZCBjb2x1bW5zIGFyZSByZS1zdGFtcGVkIGJ5IHRoZSBydW50aW1lIGl0c2VsZiAob3duZXJzaGlwXG4gICAgLy8gcmVhc3NpZ25tZW50LCBhdWRpdCB0aW1lc3RhbXBzKSBcdTIwMTQgaW5jbHVkaW5nIGR1cmluZyBwb3N0LXNlZWQgb3duZXJzaGlwXG4gICAgLy8gYXNzaWdubWVudCBpbnRyb2R1Y2VkIGluIE9iamVjdFN0YWNrIDkueC4gVGhlIFwiZnJlZXplIGNsb3NlZCByZWNvcmRcIiBndWFyZFxuICAgIC8vIG11c3QgbmV2ZXIgcmVqZWN0IHRoZXNlIHN5c3RlbSB3cml0ZXMsIG9ubHkgdXNlciBlZGl0cyB0byBidXNpbmVzcyBmaWVsZHMuXG4gICAgLy8gKERlY2xhcmVkIGluLWhhbmRsZXI6IHNhbmRib3hlZCBib2RpZXMgaGF2ZSBubyBtb2R1bGUgc2NvcGUuKVxuICAgIGNvbnN0IFNZU1RFTV9GSUVMRFMgPSBuZXcgU2V0KFtcbiAgICAgICdpZCcsICdvd25lcl9pZCcsICdjcmVhdGVkX2F0JywgJ3VwZGF0ZWRfYXQnLFxuICAgICAgJ2NyZWF0ZWRfYnknLCAndXBkYXRlZF9ieScsICdzcGFjZV9pZCcsICdvcmdhbml6YXRpb25faWQnLCAnb3JnX2lkJywgJ3ZlcnNpb24nLFxuICAgIF0pO1xuICAgIC8vIEFwcHJvdmFsIHZlcmRpY3RzIG11c3QgYmUgYWxsb3dlZCB0byBsYW5kIGV2ZW4gaWYgdGhlIGRlYWwgY2xvc2VzIHdoaWxlXG4gICAgLy8gdGhlIHJlcXVlc3QgaXMgaW4gZmxpZ2h0IFx1MjAxNCByZWplY3RpbmcgdGhlbSBsZWZ0IHRoZSByZWNvcmQgbG9ja2VkIHdpdGggYVxuICAgIC8vIHBlcm1hbmVudGx5IHBlbmRpbmcgYXBwcm92YWwuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgV2h5IHRoaXMgZXhlbXB0aW9uIGlzIHN0aWxsIG5lZWRlZCBldmVuIHRob3VnaCBgb3Bwb3J0dW5pdHlfYXBwcm92YWxgXG4gICAgLy8gZGVjbGFyZXMgYHJ1bkFzOiAnc3lzdGVtJ2AsIGFuZCB3aHkgdGhhdCBpcyBub3QgYSBjb250cmFkaWN0aW9uOlxuICAgIC8vIEVMRVZBVElPTiBJUyBOT1QgQU5PTllNSVRZIChvYmplY3RzdGFjayM1NDk0KS4gYHJlc29sdmVSdW5EYXRhQ29udGV4dGBcbiAgICAvLyByZXR1cm5zIGB7IGlzU3lzdGVtOiB0cnVlLCBhY3RvciwgLi4udXNlcklkIH1gIGZvciBhIGBydW5BczogJ3N5c3RlbSdgXG4gICAgLy8gcnVuIFx1MjAxNCBpdCBjYXJyaWVzIHRoZSB0cmlnZ2VyaW5nIHVzZXIgdGhyb3VnaCByYXRoZXIgdGhhbiBlcmFzaW5nIHRoZW0uXG4gICAgLy8gU28gT05FIGFwcHJvdmFsIHdyaXRlIGlzIHNlZW4gYnkgVFdPIGd1YXJkcyBrZXllZCBvbiBESUZGRVJFTlQgaGFsdmVzIG9mXG4gICAgLy8gdGhhdCBjb250ZXh0LCBhbmQgYm90aCBmaXJlIGFzIGRlc2lnbmVkOlxuICAgIC8vICAgXHUyMDIyIHRoaXMgZnJlZXplIGd1YXJkIGtleXMgb24gYGN0eC51c2VyPy5pZGAsIHdoaWNoIGlzIFBSRVNFTlQgXHUyMUQyIHRoZVxuICAgIC8vICAgICB3cml0ZSBpcyBqdWRnZWQgYXMgYSB1c2VyIGVkaXQgYW5kIHdvdWxkIGJlIHJlamVjdGVkIG9uIGEgY2xvc2VkXG4gICAgLy8gICAgIGRlYWwgXHUyMDE0IGhlbmNlIHRoaXMgYWxsb3ctbGlzdC5cbiAgICAvLyAgIFx1MjAyMiB0aGUgZW5naW5lJ3MgcmVhZG9ubHkgc3RyaXAga2V5cyBvbiBgaXNTeXN0ZW1gLCB3aGljaCBpcyBUUlVFIFx1MjFEMiB0aGVcbiAgICAvLyAgICAgc3RyaXAgYnJhbmNoIChgaWYgKCFvcEN0eC5jb250ZXh0Py5pc1N5c3RlbSlgKSBpcyBza2lwcGVkLCBzbyB0aGVcbiAgICAvLyAgICAgc3RhbXBzIGxhbmQgZXZlbiB0aG91Z2ggYm90aCBjb2x1bW5zIGFyZSBkZWNsYXJlZCBgcmVhZG9ubHk6IHRydWVgXG4gICAgLy8gICAgICgjMTY2NikuXG4gICAgLy8gXHUyNkQ0IE5laXRoZXIgbWVjaGFuaXNtIG5lZWRzIGNoYW5naW5nLCBhbmQgbmVpdGhlciBpcyBhIHN1YnN0aXR1dGUgZm9yIHRoZVxuICAgIC8vIG90aGVyOiBkcm9wcGluZyB0aGlzIGFsbG93LWxpc3QgcmUtbG9ja3MgaW4tZmxpZ2h0IGFwcHJvdmFscywgYW5kIHRoZVxuICAgIC8vIHJlYWRvbmx5IGRlY2xhcmF0aW9uIGlzIHdoYXQga2VlcHMgYSBoYW5kLWVkaXQgb3V0LiBNZWFzdXJlZCBpblxuICAgIC8vIGB0ZXN0L3JlYWRvbmx5LXdyaXRlLXNlbWFudGljcy50ZXN0LnRzYCBhbmQgcGlubmVkIGZvciB0aGVzZSB0d28gY29sdW1uc1xuICAgIC8vIGluIGB0ZXN0L2F1ZGl0LXN0YW1wLXJlYWRvbmx5LnRlc3QudHNgLlxuICAgIC8vIGBzdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1c2AgYW5kIGByZXF1ZXN0ZWRfc3RhdHVzYCBqb2luIHRoZVxuICAgIC8vIGFsbG93LWxpc3QgZm9yIHRoZSBzYW1lIHJlYXNvbiBhbmQgYnkgdGhlIHNhbWUgbWVjaGFuaXNtOiB0aGUgUkVRLTAwMDZcbiAgICAvLyBnYXRlJ3MgZmxvdyBzdGFtcHMgaXRzIHZlcmRpY3QgYW5kIGNsZWFycyB0aGUgcmVxdWVzdCBBRlRFUiB0aGUgZGVhbCBoYXNcbiAgICAvLyByZWFjaGVkIGEgY2xvc2VkIHN0YWdlLCBhbmQgZWxldmF0aW9uIGlzIG5vdCBhbm9ueW1pdHkgXHUyMDE0IHRoZSBmcmVlemVcbiAgICAvLyBndWFyZCBiZWxvdyB3b3VsZCBqdWRnZSB0aG9zZSB3cml0ZXMgYXMgdXNlciBlZGl0cyBvbiBhIGNsb3NlZCByZWNvcmRcbiAgICAvLyBhbmQgcmUtbG9jayBhbiBpbi1mbGlnaHQgYXBwcm92YWwuXG4gICAgLy8gYHF1YWxpZmljYXRpb25fYXBwcm92YWxfc3RhdHVzYCBhbmQgYHF1YWxpZmljYXRpb25fcmVxdWVzdGVkYCAodGhlXG4gICAgLy8gUkVRLTAwMDYgc3RlcC0xMSBcdTdBQ0JcdTk4NzkgZ2F0ZSkgam9pbiBmb3IgdGhlIHNhbWUgcmVhc29uIGFuZCBieSB0aGUgc2FtZVxuICAgIC8vIG1lY2hhbmlzbS4gVGhlaXIgZmxvdyBzdGFtcHMgdGhlIHZlcmRpY3QsIGFuZCBvbiBhIHJlamVjdGlvbiBjbGVhcnMgdGhlXG4gICAgLy8gcmVxdWVzdCwgdW5kZXIgdGhlIHRyaWdnZXJpbmcgdXNlcjsgYSBkZWFsIGEgd3JpdGUgdGhpcyBob29rIGRvZXMgbm90XG4gICAgLy8ganVkZ2UgKGEgc3lzdGVtIHdyaXRlLCBubyB1c2VyKSBjbG9zZWQgd2hpbGUgdGhlIFx1N0FDQlx1OTg3OSByZXF1ZXN0IHdhcyBvcGVuXG4gICAgLy8gd291bGQgb3RoZXJ3aXNlIHJlZnVzZSB0aGF0IHN0YW1wIGFuZCBsZWF2ZSB0aGUgYXBwcm92YWwgZGVjaWRlZCBidXRcbiAgICAvLyBuZXZlciByZWNvcmRlZC5cbiAgICBjb25zdCBBUFBST1ZBTF9GSUVMRFMgPSBuZXcgU2V0KFtcbiAgICAgICdhcHByb3ZhbF9zdGF0dXMnLCAnYXBwcm92ZWRfZGF0ZScsXG4gICAgICAnc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXMnLCAncmVxdWVzdGVkX3N0YXR1cycsXG4gICAgICAncXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXMnLCAncXVhbGlmaWNhdGlvbl9yZXF1ZXN0ZWQnLFxuICAgIF0pO1xuICAgIC8vIFN0YWdlIFx1MjE5MiBmb3JlY2FzdCBjYXRlZ29yeS5cbiAgICBjb25zdCBTVEFHRV9GT1JFQ0FTVDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIHByb3NwZWN0aW5nOiAncGlwZWxpbmUnLFxuICAgICAgcXVhbGlmaWNhdGlvbjogJ3BpcGVsaW5lJyxcbiAgICAgIG5lZWRzX2FuYWx5c2lzOiAnYmVzdF9jYXNlJyxcbiAgICAgIHByb3Bvc2FsOiAnY29tbWl0JyxcbiAgICAgIG5lZ290aWF0aW9uOiAnY29tbWl0JyxcbiAgICAgIGNsb3NlZF93b246ICdjbG9zZWQnLFxuICAgICAgY2xvc2VkX2xvc3Q6ICdvbWl0dGVkJyxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBldmVudCwgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBcdTdBQ0JcdTk4NzkgKHF1YWxpZmljYXRpb24pIGdhdGUgKFJFUS0wMDA2IHN0ZXAgMTEpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gXHUzMDBDXHU2NUIwXHU1ODlFXHU1NTQ2XHU2NzNBXHU1M0VGXHU4RERGXHU4RkRCXHVGRjBDXHU3QUNCXHU5ODc5XHU5MDFBXHU4RkM3XHU1NDBFXHU2NUI5XHU1M0VGXHU2NkY0XHU2NUIwXHU5NjM2XHU2QkI1XHUzMDAxXHU2Mjk1XHU2ODA3XHUzMDAxXHU4RDYyXHU0RTIyXHU1MzU1XHU2NENEXHU0RjVDXHUzMDAyXHUzMDBEIFVudGlsIFx1N0FDQlx1OTg3OSBpc1xuICAgIC8vIGFwcHJvdmVkLCB0d28gYWN0cyBhcmUgcmVmdXNlZCBhbmQgZXZlcnkgb3RoZXIgZWRpdCBzdGF5cyBvcGVuOlxuICAgIC8vICAgXHUyMDIyIGFueSBjaGFuZ2Ugb2YgYHN0YWdlYCBcdTIwMTQgXHU2NkY0XHU2NUIwXHU5NjM2XHU2QkI1LCB3aGljaCBpbmNsdWRlcyBhIGRpcmVjdCBjbG9zZVxuICAgIC8vICAgICAoXHU4RDYyXHU0RTIyXHU1MzU1KTtcbiAgICAvLyAgIFx1MjAyMiBhIE5FVyBgcmVxdWVzdGVkX3N0YXR1c2AgXHUyMDE0IHRoZSB3b24vbG9zdCByZXF1ZXN0IChcdThENjJcdTRFMjJcdTUzNTUpIHRoZSBzdGVwLTE0XG4gICAgLy8gICAgIGdhdGUgb3BlbnMuIFNvIHdpdGggYm90aCBnYXRlcyBhcm1lZCBcdTdBQ0JcdTk4NzkgY29tZXMgRklSU1Q6IGFuIHVucXVhbGlmaWVkXG4gICAgLy8gICAgIGRlYWwgY2Fubm90IGV2ZW4gYXNrIGZvciBhIHN0YXR1cyBjaGFuZ2UuXG4gICAgLy8gYHdpbGxfYmlkYCAoXHU2NjJGXHU1NDI2XHU2Mjk1XHU2ODA3KSBpcyBkZWxpYmVyYXRlbHkgTk9UIGhlbGQgKCMyMDA0LCBydWxlZCk6IHN0ZXAgOCBoYXNcbiAgICAvLyB0aGUgcmVwIGZpbGwgaXQgYXMgSU5QVVQgdG8gXHU3QUNCXHU5ODc5LCBmb3IgdGhlIGFwcHJvdmVyIHRvIHJlYWQsIHNvIGhvbGRpbmcgaXRcbiAgICAvLyB1bnRpbCBhcHByb3ZhbCB3b3VsZCBoYXZlIHRoZSBhcHByb3ZlciBkZWNpZGUgd2l0aG91dCBpdC4gU3RlcCAxMSdzIFx1NjI5NVx1NjgwN1xuICAgIC8vIGlzIHRoZSBhY3Qgb2YgYmlkZGluZywgd2hpY2ggSG90Q1JNIGRvZXMgbm90IG1vZGVsLlxuICAgIC8vIEJ1aWx0IG9uIHRoZSBzdGVwLTE0IGdhdGUgYmVsb3cgYW5kIGRlbGliZXJhdGVseSB0aGUgc2FtZSBpbiBldmVyeVxuICAgIC8vIGxvYWQtYmVhcmluZyB0ZXJtOlxuICAgIC8vICAgXHUyMDIyIGEgVFJBTlNJVElPTiBHQVRFLCBub3QgYW4gaW52YXJpYW50IChBR0VOVFMubWQgbWV0YWRhdGEgc2VtYW50aWNzXG4gICAgLy8gICAgIHJ1bGUgNykgXHUyMDE0IGluZXJ0IHVubGVzcyB0aGUgaW5zdGFsbCBhcm1zIGl0LCBzaW5jZVxuICAgIC8vICAgICBgcXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXNgIHNoaXBzIGBub3RfcmVxdWlyZWRgO1xuICAgIC8vICAgXHUyMDIyIHRoZSB2ZXJkaWN0IGlzIHJlYWQgSU5QVVQtRklSU1QsIHNvIGEgd3JpdGUgdGhhdCBjYXJyaWVzIHRoZVxuICAgIC8vICAgICBhcHByb3ZlZCB2ZXJkaWN0IGlzIGp1ZGdlZCBhcyBhcHByb3ZlZC4gVGhpcyBnYXRlJ3Mgb3duIGZsb3cgd3JpdGVzXG4gICAgLy8gICAgIG9ubHkgdGhlIHZlcmRpY3QgKGFuZCBvbiBhIHJlamVjdGlvbiB0aGUgcmVxdWVzdCksIHNvIGl0IG5ldmVyIG5lZWRzXG4gICAgLy8gICAgIHRoYXQ7IGl0IGtlZXBzIHRoZSBzaWJsaW5nJ3MgcmVhZGluZywgYW5kIGEgaGFuZC1zdXBwbGllZCB2ZXJkaWN0IGlzXG4gICAgLy8gICAgIHN0cmlwcGVkIGJlZm9yZSB0aGlzIGhvb2sgcnVucyAoc2VlIHRoZSBmaWVsZCk7XG4gICAgLy8gICBcdTIwMjIgYHJlamVjdGVkYCByZWZ1c2VzIGFzIGBwZW5kaW5nYCBkb2VzIFx1MjAxNCBhbiBhcHByb3ZlcidzIFwibm9cIiBpcyBub3QgYVxuICAgIC8vICAgICByZWxlYXNlOyB0aGUgd2F5IG9uIGlzIGEgbmV3IHJlcXVlc3Q7XG4gICAgLy8gICBcdTIwMjIgVVNFUiB3cml0ZXMgb25seSAoYGN0eC51c2VyPy5pZGApLCB0aGUgYm91bmRhcnkgYm90aCBvdGhlciBndWFyZHMgaW5cbiAgICAvLyAgICAgdGhpcyBob29rIGRyYXc7XG4gICAgLy8gICBcdTIwMjIgUkVDT1JEX0xPQ0tFRCAvIDQwOSAoYFJFRlVTQUxfQ09ERVMubG9ja2VkYCkuXG4gICAgLy8gSXQgc2l0cyBBQk9WRSB0aGUgc3RlcC0xNCBibG9jayBzbyBhbiB1bnF1YWxpZmllZCBkZWFsJ3MgZGlyZWN0IGNsb3NlXG4gICAgLy8gbmFtZXMgdGhlIGdhdGUgdGhhdCBjb21lcyBmaXJzdC5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBCT1VOREFSWSwgcmVjb3JkZWQgcmF0aGVyIHRoYW4gaGlkZGVuOiBgYmVmb3JlSW5zZXJ0YCBpcyBub3QganVkZ2VkLlxuICAgIC8vIENyZWF0aW5nIGEgZGVhbCBpcyBcdTY1QjBcdTU4OUVcdTU1NDZcdTY3M0EsIHdoaWNoIHN0ZXAgMTEgbGVhdmVzIG9wZW4gKHN0ZXAgOCBoYXMgdGhlIHJlcFxuICAgIC8vIGZpbGwgXHU2NjJGXHU1NDI2XHU2Mjk1XHU2ODA3IG9uIHRoZSBuZXctZGVhbCBmb3JtKSBcdTIwMTQgdGhlIGxpbmUgdGhlIHN0ZXAtMTQgZ2F0ZSBkcmF3cyB0b28uXG4gICAgaWYgKGV2ZW50ID09PSAnYmVmb3JlVXBkYXRlJyAmJiBwcmV2aW91cyAmJiBjdHgudXNlcj8uaWQpIHtcbiAgICAgIGNvbnN0IHF1YWxpZmljYXRpb24gPSAoaW5wdXQucXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXMgPz8gcHJldmlvdXMucXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXMpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChxdWFsaWZpY2F0aW9uID09PSAncGVuZGluZycgfHwgcXVhbGlmaWNhdGlvbiA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICBjb25zdCBoZWxkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0LnN0YWdlID09PSAnc3RyaW5nJyAmJiBpbnB1dC5zdGFnZSAhPT0gcHJldmlvdXMuc3RhZ2UpIGhlbGQucHVzaCgnU3RhZ2UnKTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dC5yZXF1ZXN0ZWRfc3RhdHVzID09PSAnc3RyaW5nJyAmJiBpbnB1dC5yZXF1ZXN0ZWRfc3RhdHVzICE9PSAnJyAmJiBpbnB1dC5yZXF1ZXN0ZWRfc3RhdHVzICE9PSBwcmV2aW91cy5yZXF1ZXN0ZWRfc3RhdHVzKSB7XG4gICAgICAgICAgaGVsZC5wdXNoKCdSZXF1ZXN0ZWQgU3RhdHVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlbGQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRocm93IHJlZnVzZShcbiAgICAgICAgICAgIGBUaGlzIGRlYWwgbmVlZHMgcXVhbGlmaWNhdGlvbiBhcHByb3ZhbCBmaXJzdDogdGljayBSZXF1ZXN0IFF1YWxpZmljYXRpb24gQXBwcm92YWwuICR7aGVsZC5qb2luKCcgYW5kICcpfSBjYW4gY2hhbmdlIG9uY2UgaXQgaXMgYXBwcm92ZWQuYCxcbiAgICAgICAgICAgICdSRUNPUkRfTE9DS0VEJyxcbiAgICAgICAgICAgIDQwOSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFN0YXR1cy1jaGFuZ2UgZ2F0ZSAoUkVRLTAwMDYgc3RlcHMgMTMtMTQpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gQSBUUkFOU0lUSU9OIEdBVEUsIG5vdCBhbiBpbnZhcmlhbnQgKEFHRU5UUy5tZCBtZXRhZGF0YSBzZW1hbnRpY3MgcnVsZVxuICAgIC8vIDcpOiBpdCByZWZ1c2VzIHRoZSBuZXh0IG1vdmUsIGFuZCBldmVyeSBkZWFsIGFscmVhZHkgc2l0dGluZyBpbiBhIGNsb3NlZFxuICAgIC8vIHN0YWdlIGtlZXBzIGl0LiBJbmVydCB1bmxlc3MgdGhlIGluc3RhbGwgYXJtcyB0aGUgZ2F0ZSBcdTIwMTQgc2hpcHBlZCxcbiAgICAvLyBgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXNgIGRlZmF1bHRzIHRvIGBub3RfcmVxdWlyZWRgIGFuZCB0aGlzXG4gICAgLy8gY29uZGl0aW9uIGlzIGZhbHNlIGZvciBldmVyeSByZWNvcmQgdGhhdCBoYXMgZXZlciBleGlzdGVkLCB3aGljaCBpcyB3aGF0XG4gICAgLy8ga2VlcHMgUkVRLTAwMDYgYWNjZXB0YW5jZSAzJ3MgXCJiaXQtZm9yLWJpdCB3aGF0IGl0IGlzIHRvZGF5XCIgdHJ1ZS5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBUaGUgZ2F0ZSB2YWx1ZSBpcyByZWFkIElOUFVULUZJUlNULCBhbmQgdGhhdCBpcyBsb2FkLWJlYXJpbmcuIFRoZVxuICAgIC8vIGFwcHJvdmluZyBmbG93IHdyaXRlcyBgc3RhZ2VgIGFuZCBgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXM6XG4gICAgLy8gJ2FwcHJvdmVkJ2AgaW4gT05FIHBheWxvYWQ7IHJlYWRpbmcgYHByZXZpb3VzYCBmaXJzdCB3b3VsZCBzZWUgYHBlbmRpbmdgXG4gICAgLy8gYW5kIHJlZnVzZSB0aGUgZmxvdydzIG93biB3cml0ZS4gYHJ1bkFzOiAnc3lzdGVtJ2AgZG9lcyBub3QgaGVscCBcdTIwMTRcbiAgICAvLyBlbGV2YXRpb24gaXMgbm90IGFub255bWl0eSwgc28gYGN0eC51c2VyPy5pZGAgaXMgcHJlc2VudCBpbiB0aGF0IHJ1blxuICAgIC8vIGV4YWN0bHkgYXMgdGhlIEFQUFJPVkFMX0ZJRUxEUyBub3RlIGFib3ZlIHJlY29yZHMuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgYHJlamVjdGVkYCByZWZ1c2VzIHRvbywgZXhhY3RseSBhcyBgbGVhZF9hdXRvbWF0aW9uYCByZWZ1c2VzIGFcbiAgICAvLyBjb252ZXJzaW9uIGluIGJvdGggYHBlbmRpbmdgIGFuZCBgcmVqZWN0ZWRgLiBBbiBhcHByb3ZlcidzIFwibm9cIiBpcyBub3QgYVxuICAgIC8vIHJlbGVhc2U6IGlmIG9ubHkgYHBlbmRpbmdgIHJlZnVzZWQsIGEgc2luZ2xlIHJlamVjdGlvbiB3b3VsZCBkaXNhcm0gdGhlXG4gICAgLy8gZ2F0ZSBvbiB0aGF0IGRlYWwgZm9yIGdvb2QsIGFuZCB0aGUgcmVwIGNvdWxkIHRoZW4gY2xvc2UgaXQgZGlyZWN0bHkgd2l0aFxuICAgIC8vIG5vIGFwcHJvdmFsIGF0IGFsbC4gRnJvbSBgcmVqZWN0ZWRgIHRoZSB3YXkgZm9yd2FyZCBpcyBhIE5FVyByZXF1ZXN0IFx1MjAxNCB0aGVcbiAgICAvLyBmbG93J3Mgc3RhcnQgY29uZGl0aW9uIHJlLW9wZW5zIG9uIGl0IFx1MjAxNCBuZXZlciBhIGRpcmVjdCBzdGFnZSB3cml0ZS5cbiAgICAvL1xuICAgIC8vIFJFQ09SRF9MT0NLRUQgLyA0MDkgKGBSRUZVU0FMX0NPREVTLmxvY2tlZGApOiB3aGlsZSB0aGUgZ2F0ZSBob2xkcywgdGhlXG4gICAgLy8gZGVhbCdzIG93biBzdGF0ZSBmcmVlemVzIGBzdGFnZWAgYWdhaW5zdCBhIG1vdmUgaW50byBhIGNsb3NlZCBzdGFnZSBcdTIwMTQgdGhlXG4gICAgLy8gc2FtZSBjbGFzcyB0aGUgbGVhZCBzaWJsaW5nIGFuc3dlcnMgd2l0aC5cbiAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIHByZXZpb3VzICYmIGN0eC51c2VyPy5pZCkge1xuICAgICAgY29uc3QgZ2F0ZSA9IChpbnB1dC5zdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1cyA/PyBwcmV2aW91cy5zdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1cykgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgbmV4dCA9IGlucHV0LnN0YWdlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGNsb3NpbmcgPSAobmV4dCA9PT0gJ2Nsb3NlZF93b24nIHx8IG5leHQgPT09ICdjbG9zZWRfbG9zdCcpICYmIG5leHQgIT09IHByZXZpb3VzLnN0YWdlO1xuICAgICAgaWYgKGNsb3NpbmcgJiYgKGdhdGUgPT09ICdwZW5kaW5nJyB8fCBnYXRlID09PSAncmVqZWN0ZWQnKSkge1xuICAgICAgICB0aHJvdyByZWZ1c2UoXG4gICAgICAgICAgJ1RoaXMgZGVhbFxcJ3Mgc3RhdHVzIGNoYW5nZSBuZWVkcyBhcHByb3ZhbDogc2V0IFJlcXVlc3RlZCBTdGF0dXMgKGFuZCB0aGUgd2luL2xvc3MgcmVhc29uKSBpbnN0ZWFkLiBUaGUgc3RhZ2UgdGFrZXMgZWZmZWN0IHdoZW4gdGhlIHJlcXVlc3QgaXMgYXBwcm92ZWQuJyxcbiAgICAgICAgICAnUkVDT1JEX0xPQ0tFRCcsXG4gICAgICAgICAgNDA5LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZyZWV6ZSBjbG9zZWQgb3Bwb3J0dW5pdGllcyBcdTIwMTQgYnV0IGd1YXJkIE9OTFkgZ2VudWluZSBVU0VSIGVkaXRzLiBBIHdyaXRlXG4gICAgLy8gd2l0aCBubyBhdXRoZW50aWNhdGVkIHVzZXIgKGBjdHgudXNlcj8uaWRgIGFic2VudCkgaXMgYSBzeXN0ZW0gLyBzZWVkIC9cbiAgICAvLyBiYWNrZmlsbCB3cml0ZSBhbmQgbXVzdCBwYXNzOiB0aGUgc2VlZCdzIGBjbG9zZV9kYXRlOiBkYXlzQWdvKDE1KWBcbiAgICAvLyByZS1ldmFsdWF0ZXMgdG8gYSBuZXcgZGF0ZSBvbiBldmVyeSByZWJvb3QsIHNvIGEgcmUtc2VlZCBsZWdpdGltYXRlbHlcbiAgICAvLyBjaGFuZ2VzIGNsb3NlX2RhdGUgb24gYWxyZWFkeS1jbG9zZWQgb3Bwcy4gR3VhcmRpbmcgdGhvc2UgdGhyZXcgMjNcbiAgICAvLyBib290LXRpbWUgQm9keVJ1bm5lciBlcnJvcnMgQU5EIGJsb2NrZWQgdGhlIHNlZWQgZnJvbSBjb3JyZWN0aW5nXG4gICAgLy8gY2xvc2VkLXdvbiBgcHJvYmFiaWxpdHlgIHRvIDEwMCAoIzQ1OSkuIGBjdHgudXNlcj8uaWRgIGlzIHRoaXMgcmVwbydzXG4gICAgLy8gc3lzdGVtLXdyaXRlIHNpZ25hbCAoY2YuIGNhc2UvbGVhZC9xdW90ZSBob29rcykgYW5kIG1hdGNoZXMgdGhlXG4gICAgLy8gU1lTVEVNX0ZJRUxEUyBpbnRlbnQgYWJvdmUgKFwib25seSB1c2VyIGVkaXRzIHRvIGJ1c2luZXNzIGZpZWxkc1wiKS5cbiAgICAvLyBTdGlsbCBydW5zIGJlZm9yZSB0aGUgZGVyaXZlZC1maWVsZCByZWNvbXB1dGUgYmVsb3cgc28gYSBnZW51aW5lIHVzZXJcbiAgICAvLyBlZGl0IGlzIGp1ZGdlZCBvbiB0aGUgY2FsbGVyJ3Mgb3duIGZpZWxkcywgbm90IGluamVjdGVkIG9uZXMuXG4gICAgaWYgKGV2ZW50ID09PSAnYmVmb3JlVXBkYXRlJyAmJiBwcmV2aW91cyAmJiBjdHgudXNlcj8uaWQpIHtcbiAgICAgIGNvbnN0IHByZXZTdGFnZSA9IHByZXZpb3VzLnN0YWdlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGlzQ2xvc2VkID0gcHJldlN0YWdlID09PSAnY2xvc2VkX3dvbicgfHwgcHJldlN0YWdlID09PSAnY2xvc2VkX2xvc3QnO1xuICAgICAgaWYgKGlzQ2xvc2VkKSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGluZyA9IE9iamVjdC5rZXlzKGlucHV0KS5maWx0ZXIoXG4gICAgICAgICAgKGspID0+ICFOQVJSQVRJVkVfRklFTERTLmhhcyhrKSAmJiAhU1lTVEVNX0ZJRUxEUy5oYXMoaykgJiYgIUFQUFJPVkFMX0ZJRUxEUy5oYXMoaykgJiYgaW5wdXRba10gIT09IHByZXZpb3VzW2tdLFxuICAgICAgICApO1xuICAgICAgICBpZiAodmlvbGF0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBFdmVyeSBsb29rdXAgb24gYGNybV9vcHBvcnR1bml0eWAgYSByZWZlcmVudGlhbCBjbGVhciBjYW4gYXR0YWNrLlxuICAgICAgICAgIGNvbnN0IFJFRkVSRU5DRV9GSUVMRFMgPSBuZXcgU2V0KFsnY3JtX2FjY291bnQnLCAncHJpbWFyeV9jb250YWN0JywgJ2NybV9jYW1wYWlnbiddKTtcbiAgICAgICAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgdGhlIHJlZmVyZW5jZS1jbGVhbnVwIHlpZWxkIFx1MjUwMFx1MjUwMFxuICAgICAgICAgIC8vICM3MjAuIFRoZSBlbmdpbmUgaW1wbGVtZW50cyBgZGVsZXRlQmVoYXZpb3I6ICdzZXRfbnVsbCdgIGJ5IFVQREFUSU5HXG4gICAgICAgICAgLy8gdGhlIHJvdyB0aGF0IEhPTERTIHRoZSBsb29rdXAsIHNvIGRlbGV0aW5nIGEgY29udGFjdCBvciBhIGNhbXBhaWduIGFcbiAgICAgICAgICAvLyBDTE9TRUQgb3Bwb3J0dW5pdHkgcmVmZXJlbmNlcyBhcnJpdmVzIGhlcmUgYXMgYW4gb3JkaW5hcnkgdXNlclxuICAgICAgICAgIC8vIGBiZWZvcmVVcGRhdGVgIFx1MjAxNCBhbmQgdGhpcyBmcmVlemUgcmVmdXNlZCBpdCwgd2hpY2ggbWFkZSB0aGUgZnJvemVuXG4gICAgICAgICAgLy8gb3Bwb3J0dW5pdHkgYWJsZSB0byBrZWVwIGEgcGVyc29uIHVuZGVsZXRhYmxlIGZvcmV2ZXIgKGFuZCwgdGhyb3VnaFxuICAgICAgICAgIC8vIHRoZSBtYXN0ZXItZGV0YWlsIGNhc2NhZGUsIHRoYXQgcGVyc29uJ3MgYWNjb3VudCB0b28gXHUyMDE0IGEgR0RQUlxuICAgICAgICAgIC8vIGVyYXN1cmUgdGhhdCBjYW5ub3QgYmUgY2FycmllZCBvdXQpLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gTWVhc3VyZWQgb24gMTcuMS4wIFx1MjAxNCB0aGUgdmVyc2lvbiB0aGlzIHJlcG8gcGlubmVkIEFUIFRIRSBUSU1FIG9mXG4gICAgICAgICAgLy8gdGhlIG1lYXN1cmVtZW50LCBub3QgdGhlIGN1cnJlbnQgcGluICh0aGUgY2FzY2FkZSBzaGFwZSBiZWxvdyBoYXNcbiAgICAgICAgICAvLyBOT1QgYmVlbiByZS1tZWFzdXJlZCBvbiBhbnkgbGF0ZXIgcGluIFx1MjAxNCBub3QgMTcuMy4wLCAjMTY3Niwgbm90XG4gICAgICAgICAgLy8gMTcuNC4wLCBQUiAjMTgxNCwgYW5kIG5vdCAxNy41LjApIFx1MjAxNCB3aXRoIGEgcHJvYmUgaG9vayBhdCBwcmlvcml0eSAxOTkgaW1tZWRpYXRlbHlcbiAgICAgICAgICAvLyBhaGVhZCBvZiBlYWNoIGd1YXJkLCBub3QgYXNzdW1lZC5cbiAgICAgICAgICAvLyBUaGUgZW5naW5lIGJ1aWxkcyBpdHMgY2xlYW51cCB3cml0ZSBvbiB0aGUgQ0FMTEVSJ3Mgb3duIGNvbnRleHRcbiAgICAgICAgICAvLyBwbHVzIHR3byBlbmdpbmUga2V5cywgc28gb24gdGhlIHBhdGggYSBSRVNUIGBERUxFVEVgIHRha2VzLCB0aGVcbiAgICAgICAgICAvLyBjYXNjYWRlIGFuZCBhIHVzZXIncyBoYW5kLWNsZWFyIG9mIHRoZSBzYW1lIGxvb2t1cCBhcmUgaWRlbnRpY2FsXG4gICAgICAgICAgLy8gZXZlcnl3aGVyZSBhIGd1YXJkIGNhbiBsb29rOiBwYXlsb2FkXG4gICAgICAgICAgLy8gYHsgaWQsIDxsaW5rPjogbnVsbCwgdXBkYXRlZF9hdCwgdXBkYXRlZF9ieSB9YCwgYGN0eC51c2VyYCB0aGVcbiAgICAgICAgICAvLyBDQUxMRVIsIGBjdHguc2Vzc2lvbmAgdGhlIGNhbGxlcidzIG93biBgeyB1c2VySWQsIGlzU3lzdGVtIH1gLlxuICAgICAgICAgIC8vIChCb3RoIGB1cGRhdGVkX2J5YCBhbmQgdGhlIGlkZW50aXR5IGRyb3Agb3V0IHRvZ2V0aGVyIHdoZW4gdGhlXG4gICAgICAgICAgLy8gREVMRVRFIGl0c2VsZiBjYXJyaWVkIG5vIGB1c2VySWRgIFx1MjAxNCBhIHJpZyBhcnRlZmFjdCwgbm90IHRoaXMgYXBwJ3NcbiAgICAgICAgICAvLyBwYXRoLikgU28gdGhlIFdSSVRFIFNIQVBFIGlzIG5vdCBhIGRpc2NyaW1pbmF0b3IsIGFuZCB0aGUgeWllbGRcbiAgICAgICAgICAvLyBiZWxvdyBpcyBub3Qgb25lIGVpdGhlcjogaXQgbGV0cyBBTlkgY2FsbGVyIGNsZWFyIGEgZGVjbGFyZWQgbGlua1xuICAgICAgICAgIC8vIG9uIGEgc2V0dGxlZCByZWNvcmQuIFRoYXQgaXMgdGhlIHRyYWRlICM3MjAgYWNjZXB0ZWQsIG5vdCBhIHNpZGVcbiAgICAgICAgICAvLyBlZmZlY3Qgb2YgaXQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBcdTI2QTBcdUZFMEYgQSBtYXJrZXIgRE9FUyByZWFjaCBhIGhvb2sgXHUyMDE0IGFuZCBpcyBkZWxpYmVyYXRlbHkgbm90IHJlYWQuIEFuXG4gICAgICAgICAgLy8gZWFybGllciB2ZXJzaW9uIG9mIHRoaXMgbm90ZSBjb25jbHVkZWQgXCJubyBtYXJrZXIgcmVhY2hlcyBhIGhvb2ssXG4gICAgICAgICAgLy8gYW5kIHRoZSBXUklURSBTSEFQRSBpcyB0aGUgb25seSBldmlkZW5jZSB0aGVyZSBpc1wiOyBpdCByZWFzb25lZFxuICAgICAgICAgIC8vIG9ubHkgYWJvdXQgYGN0eC5zZXNzaW9uYCwgd2hvc2UgYWxsb3ctbGlzdCByZWFsbHkgZG9lcyBvbWl0XG4gICAgICAgICAgLy8gYF9fYC1wcmVmaXhlZCBvcGVyYXRpb24tcHJpdmF0ZSBrZXlzLCBhbmQgbWlzc2VkIHRoZSBvdGhlciByb3V0ZVxuICAgICAgICAgIC8vIGludG8gdGhlIGNvbnRleHQuIGBPYmplY3RRTC5jYXNjYWRlRGVsZXRlUmVsYXRpb25zYCBidWlsZHNcbiAgICAgICAgICAvLyBgeyAuLi5jb250ZXh0LCBfX3JlZmVyZW50aWFsRmllbGRDbGVhcjogdHJ1ZSB9YCwgcmVhZGFibGUgYXRcbiAgICAgICAgICAvLyBgY3R4LmFwaS5leGVjdXRpb25Db250ZXh0Ll9fcmVmZXJlbnRpYWxGaWVsZENsZWFyYDogbWVhc3VyZWQgYHRydWVgXG4gICAgICAgICAgLy8gb24gZXZlcnkgY2FzY2FkZSBpbnRvIGBjcm1fb3Bwb3J0dW5pdHlgLCBgY3JtX3F1b3RlYCBhbmRcbiAgICAgICAgICAvLyBgY3JtX2xlYWRgLCBgdW5kZWZpbmVkYCBvbiBldmVyeSBoYW5kLWNsZWFyICgjMTE2NSwgIzE0MTIpLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gXHUyNkQ0IFRoZSAjMTE2NSBydWxpbmcgKDIwMjYtMDgtMjUpIHJldmlld2VkIHRoYXQgYW5kIHVwaGVsZCBOT1RcbiAgICAgICAgICAvLyByZWFkaW5nIGl0LCBvbiB0d28gZ3JvdW5kcy4gSXQgaXMgYW4gb3BlcmF0aW9uLXByaXZhdGUga2V5IFx1MjAxNCBhblxuICAgICAgICAgIC8vIHVuZGVjbGFyZWQgZGVwZW5kZW5jeSB0aGF0IGNhbiB2YW5pc2ggaW4gYSBwYXRjaCByZWxlYXNlLiBBbmRcbiAgICAgICAgICAvLyByZWFjaGFiaWxpdHkgdGhyb3VnaCB0aGUgU0hJUFBFRCBwYXRoIGlzIHVucHJvdmVuOiBhIGhvb2sgYm9keSBydW5zXG4gICAgICAgICAgLy8gYm9keS1vbmx5IGluIFF1aWNrSlMsIHdoZXJlIGBidWlsZFNhbmRib3hBcGlgIHBhc3NlcyBgZW5naW5lQ3R4LmFwaWBcbiAgICAgICAgICAvLyBvbmx5IHdoZW4gdGhhdCBleHBvc2VzIGBvYmplY3QoKWAsIGFuZCBvdGhlcndpc2UgYSBzaGltIHdpdGggbm9cbiAgICAgICAgICAvLyBgZXhlY3V0aW9uQ29udGV4dGAgYXQgYWxsLiBHcmVlbiBpbiBhIGtlcm5lbCByaWcgYW5kIHNpbGVudGx5IGZhbHNlXG4gICAgICAgICAgLy8gaW4gcHJvZHVjdGlvbiBpcyB0aGUgd29yc3Qgb3V0Y29tZSBhIGd1YXJkIGNhbiBoYXZlLiBUaGUgZGVjbGFyZWRcbiAgICAgICAgICAvLyByZXBsYWNlbWVudCBgY3R4LnJlZmVyZW50aWFsRmllbGRDbGVhcmAgaXMgYXNrZWQgZm9yIHVwc3RyZWFtIGFzXG4gICAgICAgICAgLy8gb2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjMTM2NDQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBcdTI2RDQgS2VlcCB0aGlzIG5hcnJvdyAobWFpbnRhaW5lcidzIHJ1bGluZyBvbiAjNzIwLCBPcHRpb24gQSk6IGEgd3JpdGVcbiAgICAgICAgICAvLyB5aWVsZHMgT05MWSB3aGVuIGV2ZXJ5IG9uZSBvZiBpdHMgbm9uLXN5c3RlbSBjaGFuZ2VzIGlzIGEgREVDTEFSRURcbiAgICAgICAgICAvLyBsaW5rIGdvaW5nIGZyb20gYSB2YWx1ZSB0byBgbnVsbGAuIE9uZSBidXNpbmVzcyBmaWVsZCBhbG9uZ3NpZGUgaXQsXG4gICAgICAgICAgLy8gb3IgYSBsaW5rIHJlcG9pbnRlZCB0byBhIE5FVyB2YWx1ZSwgYW5kIHRoZSByZWZ1c2FsIGJlbG93IHN0aWxsXG4gICAgICAgICAgLy8gZmlyZXMuIFRoZSB0aHJlZSBmcmVlemUgZ3VhcmRzIHNoYXJlIHRoaXMgYmxvY2sgdmVyYmF0aW0gXHUyMDE0IHNoYXJpbmdcbiAgICAgICAgICAvLyBpdCBhcyBhbiBpbXBvcnRlZCBoZWxwZXIgaXMgbm90IHBvc3NpYmxlIChob29rIGJvZGllcyBydW4gYm9keS1vbmx5XG4gICAgICAgICAgLy8gaW4gdGhlIHNhbmRib3ggYW5kIGNhbm5vdCByZWFjaCBtb2R1bGUgc2NvcGUpLCBzb1xuICAgICAgICAgIC8vIGB0ZXN0L2ZyZWV6ZS1ndWFyZC1yZWZlcmVuY2UtY2xlYW51cC50ZXN0LnRzYCBwaW5zIHRoZSB0aHJlZSBjb3BpZXNcbiAgICAgICAgICAvLyBhcyBpZGVudGljYWwgdGV4dCBhbmQgcGlucyBib3RoIGRpcmVjdGlvbnMgb2YgdGhlIG5hcnJvd25lc3MuXG4gICAgICAgICAgY29uc3QgaXNSZWZlcmVuY2VDbGVhbnVwID0gdmlvbGF0aW5nLmV2ZXJ5KFxuICAgICAgICAgICAgKGspID0+IFJFRkVSRU5DRV9GSUVMRFMuaGFzKGspICYmIGlucHV0W2tdID09PSBudWxsICYmIHByZXZpb3VzPy5ba10gIT0gbnVsbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChpc1JlZmVyZW5jZUNsZWFudXApIHJldHVybjtcblxuICAgICAgICAgIC8vIGBjcm1fb3Bwb3J0dW5pdHkubmFtZUZpZWxkYCBJUyBgbmFtZWAsIHNvIHRoZSBuYW1lIG9uIGl0cyBvd24gaXNcbiAgICAgICAgICAvLyBleGFjdGx5IGhvdyBldmVyeSBvdGhlciBzdXJmYWNlIHRpdGxlcyB0aGlzIHJlY29yZC4gXHUyNkQ0IE5ldmVyIGFwcGVuZFxuICAgICAgICAgIC8vIHRoZSByZWNvcmQgaWQgXHUyMDE0IGl0IG1hdGNoZXMgbm9uZSBvZiB0aGVtLlxuICAgICAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcHJldmlvdXMubmFtZSA9PT0gJ3N0cmluZycgPyBwcmV2aW91cy5uYW1lLnRyaW0oKSA6ICcnO1xuICAgICAgICAgIGNvbnN0IHN1YmplY3QgPSBuYW1lID8gYE9wcG9ydHVuaXR5ICR7bmFtZX1gIDogJ09wcG9ydHVuaXR5JztcbiAgICAgICAgICB0aHJvdyByZWZ1c2UoXG4gICAgICAgICAgICBgJHtzdWJqZWN0fSBpcyBjbG9zZWQgKCR7cHJldlN0YWdlfSk7IG9ubHkgJHtbLi4uTkFSUkFUSVZFX0ZJRUxEU10uam9pbignLCAnKX0gbWF5IGJlIGVkaXRlZC4gQXR0ZW1wdGVkOiAke3Zpb2xhdGluZy5qb2luKCcsICcpfS5gLFxuICAgICAgICAgICAgJ1JFQ09SRF9MT0NLRUQnLFxuICAgICAgICAgICAgNDA5LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEMyBzdGFuZC1kb3duOiBhIHByZWRpY2F0ZSB1cGRhdGUgaGFzIE9ORSBwYXlsb2FkIGZvciBldmVyeSBtYXRjaGVkIHJvdyxcbiAgICAvLyBzbyB0aGUgYGN0eC5wcmV2aW91c2AtY29uZGl0aW9uZWQgcmVjb21wdXRlcyBiZWxvdyB3b3VsZCBsYW5kIG9uIHJvd3MgdGhhdFxuICAgIC8vIGRpZCBub3QgZWFybiB0aGVtIFx1MjAxNCByZWZ1c2VkIGFzIGEgZGl2ZXJnaW5nIGtleSBzZXQsIG9yIHN0b3JlZCBzaWxlbnRseVxuICAgIC8vIGZyb20gdGhlIGxhc3Qgcm93LiBGdWxsIGFjY291bnQgYW5kIHRoZSBtZWFzdXJlbWVudDogYGZvcmVjYXN0Lmhvb2sudHNgLlxuICAgIC8vIFRoZSBjbG9zZWQtcmVjb3JkIFJFRlVTQUwgYWJvdmUgZGVsaWJlcmF0ZWx5IHNpdHMgYmVmb3JlIHRoaXMgbGluZTpcbiAgICAvLyByZWFkaW5nIGBwcmV2aW91c2AgdG8gdGhyb3cgaXMgd2hhdCBEMyBzdXBwbGllcyBpdCBmb3IsIGFuZCBhIGJhdGNoIHRoYXRcbiAgICAvLyB0b3VjaGVzIGEgY2xvc2VkIGRlYWwgbXVzdCBzdGlsbCBiZSByZWZ1c2VkLlxuICAgIGlmIChjdHguZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIGN0eC5kaXNwYXRjaD8ubW9kZSA9PT0gJ3Blci1yb3cnKSByZXR1cm47XG5cbiAgICAvLyBSZWNvbXB1dGUgZXhwZWN0ZWRfcmV2ZW51ZVxuICAgIGNvbnN0IGFtb3VudCA9XG4gICAgICB0eXBlb2YgaW5wdXQuYW1vdW50ID09PSAnbnVtYmVyJ1xuICAgICAgICA/IGlucHV0LmFtb3VudFxuICAgICAgICA6IHR5cGVvZiBwcmV2aW91cz8uYW1vdW50ID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gKHByZXZpb3VzLmFtb3VudCBhcyBudW1iZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3RhZ2UgPVxuICAgICAgdHlwZW9mIGlucHV0LnN0YWdlID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGlucHV0LnN0YWdlXG4gICAgICAgIDogdHlwZW9mIHByZXZpb3VzPy5zdGFnZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IChwcmV2aW91cy5zdGFnZSBhcyBzdHJpbmcpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBhbW91bnQgPT09ICdudW1iZXInICYmIHN0YWdlICYmIFNUQUdFX1BST0JBQklMSVRZW3N0YWdlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbnB1dC5leHBlY3RlZF9yZXZlbnVlID0gTWF0aC5yb3VuZChhbW91bnQgKiBTVEFHRV9QUk9CQUJJTElUWVtzdGFnZV0pIC8gMTAwO1xuICAgIH1cbiAgICBpZiAoc3RhZ2UgJiYgU1RBR0VfUFJPQkFCSUxJVFlbc3RhZ2VdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEFsd2F5cyBzeW5jIHByb2JhYmlsaXR5IHdpdGggc3RhZ2UgKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggPSBzdGFnZSkuXG4gICAgICBpbnB1dC5wcm9iYWJpbGl0eSA9IFNUQUdFX1BST0JBQklMSVRZW3N0YWdlXTtcbiAgICB9XG4gICAgLy8gU3luYyBmb3JlY2FzdF9jYXRlZ29yeSB3aXRoIHN0YWdlIG9uIGluc2VydCBhbmQgd2hlbmV2ZXIgc3RhZ2UgY2hhbmdlcy5cbiAgICBpZiAoc3RhZ2UgJiYgU1RBR0VfRk9SRUNBU1Rbc3RhZ2VdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHN0YWdlQ2hhbmdlZCA9IGV2ZW50ID09PSAnYmVmb3JlSW5zZXJ0JyB8fCAodHlwZW9mIGlucHV0LnN0YWdlID09PSAnc3RyaW5nJyAmJiBpbnB1dC5zdGFnZSAhPT0gcHJldmlvdXM/LnN0YWdlKTtcbiAgICAgIGlmIChzdGFnZUNoYW5nZWQpIGlucHV0LmZvcmVjYXN0X2NhdGVnb3J5ID0gU1RBR0VfRk9SRUNBU1Rbc3RhZ2VdO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IHRoZSBzdGFnZS1hZ2UgY2xvY2sgYXQgY3JlYXRpb24uIFdpdGhvdXQgdGhpcyB0aGUgcm93IGxhbmRzIHdpdGggYVxuICAgIC8vIG51bGwgYHN0YWdlX2VudHJ5X2RhdGVgLCBgZGF5c19pbl9zdGFnZWAgcmVhZHMgbnVsbCBpbnN0ZWFkIG9mIDAsIGFuZCB0aGVcbiAgICAvLyBkZWFsIGlzIGludmlzaWJsZSB0byB0aGUgc3RhZ25hdGlvbiBzd2VlcCB1bnRpbCBpdHMgZmlyc3Qgc3RhZ2UgY2hhbmdlIFx1MjAxNFxuICAgIC8vIGV4YWN0bHkgYmFja3dhcmRzLCBzaW5jZSBhIGRlYWwgdGhhdCBuZXZlciBtb3ZlcyBpcyB0aGUgc3RhbGxlZCBvbmUuXG4gICAgaWYgKGV2ZW50ID09PSAnYmVmb3JlSW5zZXJ0JyAmJiAhaW5wdXQuc3RhZ2VfZW50cnlfZGF0ZSkge1xuICAgICAgaW5wdXQuc3RhZ2VfZW50cnlfZGF0ZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ID09PSAnYmVmb3JlVXBkYXRlJyAmJiBwcmV2aW91cykge1xuICAgICAgLy8gU3RhbXAgY2xvc2VfZGF0ZSB3aGVuIHRyYW5zaXRpb25pbmcgaW50byBjbG9zZWRfd29uXG4gICAgICBpZiAoaW5wdXQuc3RhZ2UgPT09ICdjbG9zZWRfd29uJyAmJiBwcmV2aW91cy5zdGFnZSAhPT0gJ2Nsb3NlZF93b24nICYmICFpbnB1dC5jbG9zZV9kYXRlKSB7XG4gICAgICAgIGlucHV0LmNsb3NlX2RhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApO1xuICAgICAgfVxuICAgICAgLy8gUmVzdGFydCB0aGUgc3RhZ2UtYWdlIGNsb2NrIG9uIGFueSBzdGFnZSBjaGFuZ2Ugc28gYSBkZWFsIHRoYXRcbiAgICAgIC8vIGFkdmFuY2VzIHN0b3BzIG1hdGNoaW5nIHRoZSBzdGFnbmF0aW9uIHN3ZWVwLiBgZGF5c19pbl9zdGFnZWAgaXMgYVxuICAgICAgLy8gZm9ybXVsYSBvdmVyIHRoaXMgY29sdW1uLCBzbyB0aGlzIG9uZSB3cml0ZSBJUyB0aGUgcmVzZXQgXHUyMDE0IGl0IHVzZWQgdG9cbiAgICAgIC8vIHNldCBgZGF5c19pbl9zdGFnZSA9IDBgIGFnYWluc3QgYSBjb3VudGVyIG5vdGhpbmcgZXZlciBpbmNyZW1lbnRlZC5cbiAgICAgIC8vIChSZWFkb25seSBmaWVsZHMgYXJlIHdyaXRhYmxlIGZyb20gYmVmb3JlLWhvb2tzIHZpYSBpbnB1dCBtdXRhdGlvbjpcbiAgICAgIC8vIHJlYWRvbmx5IHN0cmlwcGluZyBvbmx5IGRyb3BzIGtleXMgdGhlIENBTExFUiBzdXBwbGllZC4pXG4gICAgICBpZiAodHlwZW9mIGlucHV0LnN0YWdlID09PSAnc3RyaW5nJyAmJiBpbnB1dC5zdGFnZSAhPT0gcHJldmlvdXMuc3RhZ2UpIHtcbiAgICAgICAgaW5wdXQuc3RhZ2VfZW50cnlfZGF0ZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBPbiBjbG9zZS13b246IHByb21vdGUgdGhlIGFjY291bnQgdG8gYGN1c3RvbWVyYCBhbmQgc2NoZWR1bGUgdGhlIGFjdGl2YXRpb25cbiAqIHRhc2sgZm9yIHRoZSBkZWFsJ3Mgb3duZXIuXG4gKlxuICogYHJ1bkFzOiAnc3lzdGVtJ2AgKCMyMDE0LCBBR0VOVFMubWQgcnVsZSA5KS4gVGhlIHRyaWdnZXIgaXMgYSByZXAgd2lubmluZ1xuICogdGhlaXIgb3duIGRlYWwsIGFuZCB0aGUgYWNjb3VudCBuZWVkIG5vdCBiZSB0aGVpcnM6IGFzIHRoZSBjYWxsZXIsIGEgcmVhZCBvZlxuICogYW4gYWNjb3VudCB0aGUgcmVwIGNhbm5vdCBzZWUgY2FtZSBiYWNrIGVtcHR5IGFuZCB0aGUgcHJvbW90aW9uIHdhcyBza2lwcGVkXG4gKiB3aXRob3V0IGEgd29yZCAobWVhc3VyZWQ6IGEgcmVwJ3Mgd2luIG9uIGFuIGFjY291bnQgYW5vdGhlciB1c2VyIG93bnMgbGVmdFxuICogaXQgYSBgcHJvc3BlY3RgKS4gVGhhdCBhbiBhY2NvdW50IGhhcyBhIHdvbiBkZWFsIGlzIHRoZSBhY2NvdW50J3MgZmFjdCwgbm90XG4gKiB0aGUgcmVwJ3MgZWRpdCwgc28gdGhlIGhvb2sgZWxldmF0ZXM7IHRoZSBkZWFsIHdyaXRlIHN0YXlzIHRoZSBjYWxsZXIncy5cbiAqIEVsZXZhdGlvbiBpcyBub3QgYW5vbnltaXR5OiBgY3R4LnVzZXJgIGFuZCB0aGUgYXVkaXQgc3RhbXBzIHN0aWxsIG5hbWUgdGhlXG4gKiByZXAuIE9yZ2FuaXphdGlvbiAocnVsZSAxMCk6IGl0IHJlYWRzIGFuZCB3cml0ZXMgb25seSB0aGUgYWNjb3VudCB0aGVcbiAqIHRyaWdnZXJpbmcgZGVhbCBuYW1lcywgYW5kIHRoZSBlbGV2YXRlZCBgY3R4LmFwaWAga2VlcHMgdGhlIHRyaWdnZXIncyB0ZW5hbnQuXG4gKi9cbmNvbnN0IG9wcG9ydHVuaXR5V29uSG9vazogSG9vayA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X3Byb21vdGVfYWNjb3VudCcsXG4gIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScsXG4gIGV2ZW50czogWydhZnRlclVwZGF0ZSddLFxuICBwcmlvcml0eTogODAwLFxuICBhc3luYzogdHJ1ZSxcbiAgb25FcnJvcjogJ2xvZycsXG4gIHJ1bkFzOiAnc3lzdGVtJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ09uIGNsb3NlZF93b246IHByb21vdGUgbGlua2VkIGFjY291bnQgdG8gY3VzdG9tZXIgYW5kIGNyZWF0ZSBhY3RpdmF0aW9uIHRhc2suJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgY29uc3QgYmVjYW1lV29uID0gaW5wdXQuc3RhZ2UgPT09ICdjbG9zZWRfd29uJyAmJiBwcmV2aW91cz8uc3RhZ2UgIT09ICdjbG9zZWRfd29uJztcbiAgICBpZiAoIWJlY2FtZVdvbikgcmV0dXJuO1xuICAgIGNvbnN0IGFwaSA9IGN0eC5hcGkgYXMgSG9va0FwaSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFwaSkgcmV0dXJuO1xuXG4gICAgY29uc3QgYWNjb3VudElkID1cbiAgICAgICh0eXBlb2YgaW5wdXQuY3JtX2FjY291bnQgPT09ICdzdHJpbmcnICYmIGlucHV0LmNybV9hY2NvdW50KSB8fFxuICAgICAgKHR5cGVvZiBwcmV2aW91cz8uY3JtX2FjY291bnQgPT09ICdzdHJpbmcnICYmIHByZXZpb3VzLmNybV9hY2NvdW50KSB8fFxuICAgICAgdW5kZWZpbmVkO1xuICAgIGlmICghYWNjb3VudElkKSByZXR1cm47XG5cbiAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2FjY291bnQnKS5maW5kT25lKHsgd2hlcmU6IHsgaWQ6IGFjY291bnRJZCB9IH0pO1xuICAgIGlmIChhY2NvdW50ICYmIGFjY291bnQudHlwZSAhPT0gJ2N1c3RvbWVyJykge1xuICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX2FjY291bnQnKS51cGRhdGUoXG4gICAgICAgIHsgaWQ6IGFjY291bnRJZCwgdHlwZTogJ2N1c3RvbWVyJyB9LFxuICAgICAgICB7IHdoZXJlOiB7IGlkOiBhY2NvdW50SWQgfSB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHBJZCA9ICh0eXBlb2YgaW5wdXQuaWQgPT09ICdzdHJpbmcnICYmIGlucHV0LmlkKSB8fCBwcmV2aW91cz8uaWQ7XG4gICAgY29uc3Qgb3duZXJJZCA9XG4gICAgICAodHlwZW9mIGlucHV0Lm93bmVyX2lkID09PSAnc3RyaW5nJyAmJiBpbnB1dC5vd25lcl9pZCkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXM/Lm93bmVyX2lkID09PSAnc3RyaW5nJyAmJiBwcmV2aW91cy5vd25lcl9pZCkgfHxcbiAgICAgIGN0eC51c2VyPy5pZDtcbiAgICAvLyBVVEMgY2FsZW5kYXIgZm9yIHRoZSBzdGVwLCBtYXRjaGluZyB0aGUgYHRvSVNPU3RyaW5nKClgIHJlbmRlciBiZWxvdyBcdTIwMTRcbiAgICAvLyBzZWUgdGhlIG5vdGUgb24gdGhlIHNhbWUgc2hhcGUgaW4gYGxlYWQuaG9vay50c2AuIEEgbG9jYWwgYHNldERhdGVgIHN0ZXBcbiAgICAvLyBwcmVzZXJ2ZXMgd2FsbC1jbG9jayB0aW1lLCBzbyBhY3Jvc3MgYSBzcHJpbmctZm9yd2FyZCB0aGUgYWN0aXZhdGlvbiB0YXNrXG4gICAgLy8gaXMgZmlsZWQgYSBkYXkgZWFybHkgaW4gZXZlcnkgbm9uLVVUQyBkZXBsb3ltZW50LlxuICAgIGNvbnN0IGR1ZSA9IG5ldyBEYXRlKCk7XG4gICAgZHVlLnNldFVUQ0RhdGUoZHVlLmdldFVUQ0RhdGUoKSArIDMpO1xuXG4gICAgLy8gVGl0bGUgdGhlIHRhc2sgd2l0aCB0aGUgb3Bwb3J0dW5pdHkncyBOQU1FICgjMTI0MykuIFRoaXMgaXMgb25lIG9mIHRoZVxuICAgIC8vIHR3byByb3dzIGEgd2Fsa3Rocm91Z2ggb2YgY3VycmVudCBtYWluIHN0aWxsIHdyaXRlcyB3aXRoIGEgcmF3IGtleSBpbiBpdCxcbiAgICAvLyBhbmQgaXQgbGFuZHMgaW4gKipBbGwgVGFza3MqKiBuZXh0IHRvIHRoZSBlc2NhbGF0aW9uIHJvd3MgIzEyMDggYWxyZWFkeVxuICAgIC8vIGZpeGVkLiBgY3JtX29wcG9ydHVuaXR5Lm5hbWVgIGlzIHJlcXVpcmVkICsgbm90TnVsbCwgc28gdGhlIGJhcmUgZmFsbGJhY2tcbiAgICAvLyBpcyBhIHNoYXBlIHRoZSBzY2hlbWEgZG9lcyBub3QgcGVybWl0IHJhdGhlciB0aGFuIGFuIGV4cGVjdGVkIGNhc2UgXHUyMDE0IGl0XG4gICAgLy8gZXhpc3RzIHNvIGEgcHJlLWltYWdlIHRoYXQgYXJyaXZlZCB3aXRob3V0IHRoZSBjb2x1bW4gc3RpbGwgcHJvZHVjZXMgYVxuICAgIC8vIHNlbnRlbmNlIGluc3RlYWQgb2YgYSBkYW5nbGluZyBvbmUuIFRoZSAyNTUgY2FwIGlzIHRoZSBzYW1lIG9uZVxuICAgIC8vIGBjYXNlLmhvb2sudHNgIGRvY3VtZW50czogYGNybV90YXNrLnN1YmplY3RgIGVuZm9yY2VzIGl0LCBhbmQgdGhpcyBob29rIGlzXG4gICAgLy8gYGFzeW5jOiB0cnVlYCArIGBvbkVycm9yOiAnbG9nJ2AsIHNvIGEgcmVqZWN0ZWQgaW5zZXJ0IHdvdWxkIHN1cmZhY2VcbiAgICAvLyBub3doZXJlIGF0IGFsbC5cbiAgICBjb25zdCBvcHBOYW1lID1cbiAgICAgICh0eXBlb2YgaW5wdXQubmFtZSA9PT0gJ3N0cmluZycgJiYgaW5wdXQubmFtZS50cmltKCkpIHx8XG4gICAgICAodHlwZW9mIHByZXZpb3VzPy5uYW1lID09PSAnc3RyaW5nJyAmJiBwcmV2aW91cy5uYW1lLnRyaW0oKSkgfHxcbiAgICAgICcnO1xuICAgIGNvbnN0IHRpdGxlZCA9IG9wcE5hbWVcbiAgICAgID8gYEFjdGl2YXRlIG5ldyBjdXN0b21lciBmb3Igb3Bwb3J0dW5pdHkgJHtvcHBOYW1lfWBcbiAgICAgIDogJ0FjdGl2YXRlIG5ldyBjdXN0b21lcic7XG4gICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX3Rhc2snKS5pbnNlcnQoe1xuICAgICAgc3ViamVjdDogdGl0bGVkLmxlbmd0aCA+IDI1NSA/IGAke3RpdGxlZC5zbGljZSgwLCAyNTQpfVx1MjAyNmAgOiB0aXRsZWQsXG4gICAgICBzdGF0dXM6ICdub3Rfc3RhcnRlZCcsXG4gICAgICBwcmlvcml0eTogJ2hpZ2gnLFxuICAgICAgdHlwZTogJ2ZvbGxvd191cCcsXG4gICAgICBkdWVfZGF0ZTogZHVlLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApLFxuICAgICAgb3duZXJfaWQ6IG93bmVySWQsXG4gICAgICByZWxhdGVkX3RvX3R5cGU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgcmVsYXRlZF90b19vcHBvcnR1bml0eTogb3BwSWQsXG4gICAgICByZWxhdGVkX3RvX2FjY291bnQ6IGFjY291bnRJZCxcbiAgICB9KTtcbiAgfSxcbn07XG5cblxuLyoqXG4gKiBUaGUgY2FwYWJpbGl0eSBnYXRlIFx1MjAxNCBhbiBhY2NvdW50IHdob3NlIGBjb21tZXJjaWFsX2NhcGFiaWxpdHlgIGlzXG4gKiBgc2V0dGxlbWVudF9vbmx5YCBtYXkgbm90IGhhdmUgYSBORVcgb3Bwb3J0dW5pdHkgb3BlbmVkIGFnYWluc3QgaXQuXG4gKlxuICogUkVRLTAwMDMncyBtb3N0IHZhbHVhYmxlIHByaW1pdGl2ZTogKnNvbWUgY291bnRlcnBhcnRpZXMgYXJlIHBheWFibGUgYnV0IG5vdFxuICogc2VsbGFibGUqIFx1MjAxNCBcdTMwMENcdTYyREJcdTY4MDdcdTRFRTNcdTc0MDZcdTUzQ0FcdTUxNzZcdTRFRDZcdTdDN0JcdTVCQTJcdTYyMzdcdTRFQzVcdTUzRUZcdTc1MjhcdTRFOEVcdTRFRDhcdTZCM0VcdTU2REVcdTZCM0VcdUZGMENcdTY1RTBcdTZDRDVcdTUzRDFcdThENzdcdTU1NDZcdTY3M0FcdTMwMEQuIFRoZSBjYXRlZ29yeSBsaXZlcyBvblxuICogYGNybV9hY2NvdW50YDsgdGhpcyBpcyB0aGUgcnVsZSB0aGF0IHJlYWRzIGl0LCBhbmQgd2l0aG91dCBhIHJlYWRlciB0aGVcbiAqIGNhdGVnb3J5IHdvdWxkIGJlIHByb3NlIChSRVEtMDAwMyAqRGlzcG9zaXRpb24gJiByYXRpb25hbGUqKS5cbiAqXG4gKiAjIyBcdTI2QTBcdUZFMEYgYGJlZm9yZUluc2VydGAgT05MWSBcdTIwMTQgYSB0cmFuc2l0aW9uIGdhdGUsIG5vdCBhbiBpbnZhcmlhbnRcbiAqXG4gKiBNYWludGFpbmVyIHJ1bGluZywgMjAyNi0wOS0xNiAodmVyYmF0aW0sIGtlcHQgdW50cmFuc2xhdGVkKTpcbiAqXG4gKiAgIFx1MzAwQ1x1OTVGOFx1OTVFOFx1OEQ3MCBgb3Bwb3J0dW5pdHkuaG9vay50c2AgXHU3Njg0IGBiZWZvcmVJbnNlcnRgXHVGRjBDXHU3NTI4IGhvb2sgXHU3Njg0IGBjdHguYXBpYCBcdThCRkJcdTVCQTJcdTYyMzdcdTdDN0JcdTUyMkJcdTMwMDJcbiAqICAgIFJFUS0wMDAzIFx1N0IyQyAxMjggXHU4ODRDXHU3Njg0IGB2YWxpZGF0aW9uc1tdYCBcdTRFMEVcdThCRTVcdThCQjBcdTVGNTVcdTgxRUFcdTVERjFcdTc2ODRcdTlBOENcdTY1MzZcdTdCMkMgMiBcdTY3NjFcdTUxQjJcdTdBODFcdUZGMENcdTRFRTVcdTlBOENcdTY1MzZcdTRFM0FcdTUxQzZcdTMwMDJcdTMwMERcbiAqXG4gKiBUaGUgZXZlbnQgbGlzdCBJUyB0aGUgdHJhbnNpdGlvbiBnYXRlIChBR0VOVFMubWQgbWV0YWRhdGEgc2VtYW50aWNzIHJ1bGUgNyksXG4gKiBhbmQgaXQgaXMgdGhlIGNvbnN0cnVjdCByYXRoZXIgdGhhbiBhIGNvbW1lbnQgY2xhaW1pbmcgdGhlIHByb3BlcnR5LiBBblxuICogb3Bwb3J0dW5pdHkgdGhhdCBhbHJlYWR5IHBvaW50cyBhdCBhbiBhY2NvdW50IHJlc3RyaWN0ZWQgbGF0ZXIgaXMgbmV2ZXJcbiAqIHJlLWV2YWx1YXRlZDogaXQga2VlcHMgd29ya2luZyBhbmQga2VlcHMgYmVpbmcgZWRpdGFibGUsIHdoaWNoIFJFUS0wMDAzXG4gKiBhY2NlcHRhbmNlIDIgZGVtYW5kcyBpbiBhcyBtYW55IHdvcmRzLiBcdTI2RDQgTmV2ZXIgcmVzdGF0ZSB0aGlzIGFzIGFcbiAqIGB2YWxpZGF0aW9uc1tdYCBzY3JpcHQgXHUyMDE0IGEgdmFsaWRhdGlvbiBpcyBldmFsdWF0ZWQgYWdhaW5zdFxuICogYHsuLi5wcmV2aW91cywgLi4uZGF0YX1gIG9uIGV2ZXJ5IHdyaXRlLCB3aGVyZSBcImFscmVhZHkgbGlua2VkXCIgYW5kIFwibGlua2luZ1xuICogbm93XCIgYXJlIHRoZSBzYW1lIHN0YXRlLCBzbyBpdCB3b3VsZCByZWZ1c2UgZXZlcnkgbGF0ZXIgZWRpdCB0byBldmVyeVxuICogaGlzdG9yaWNhbCBvcHBvcnR1bml0eS4gVGhlIHdob2xlIG1lYXN1cmVtZW50LCBpbmNsdWRpbmcgd2h5IGEgcHJlZGljYXRlXG4gKiBjYW5ub3QgcmVhZCB0aGUgYWNjb3VudCBhdCBhbGwsIGlzIG9uIGBjcm1fYWNjb3VudC5jb21tZXJjaWFsX2NhcGFiaWxpdHlgLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBCT1VOREFSWSwgcmVjb3JkZWQgcmF0aGVyIHRoYW4gaGlkZGVuOiBhbiBVUERBVEUgdGhhdCByZS1wb2ludHMgYW5cbiAqIEVYSVNUSU5HIG9wcG9ydHVuaXR5IG9udG8gYSByZXN0cmljdGVkIGFjY291bnQgaXMgbm90IHJlZnVzZWQuIFRoYXQgaXMgdGhlXG4gKiBydWxpbmcncyBjb25zdHJ1Y3QgYW5kIGl0IGlzIGFsc28gd2hhdCBhY2NlcHRhbmNlIDIgYXNrcyBmb3IgXHUyMDE0IHRoZSByZWZ1c2FsIGlzXG4gKiBzY29wZWQgdG8gXCJsaW5rZWQgdG8gYSBORVcgb3Bwb3J0dW5pdHlcIi4gV2lkZW5pbmcgdG8gYGJlZm9yZVVwZGF0ZWAgaXMgbm90IGFcbiAqIGZyZWUgd2luIGVpdGhlcjogdGhlIHVwZGF0ZSBwYXlsb2FkIHdvdWxkIGhhdmUgdG8gYmUganVkZ2VkIGFnYWluc3RcbiAqIGBwcmV2aW91c2AgdG8gdGVsbCBhIHJlLXBvaW50IGZyb20gYW4gb3JkaW5hcnkgZWRpdCwgd2hpY2ggaXMgdGhlIHN0YXRlXG4gKiBjb25mdXNpb24gdGhpcyBldmVudCBsaXN0IGV4aXN0cyB0byBhdm9pZC4gQSBnYXRlIG9uIHJlLXBvaW50aW5nIGlzIGFcbiAqIHNlcGFyYXRlIGRlY2lzaW9uLCBub3QgYSB0aWR5LXVwLlxuICpcbiAqICMjIEZhaWxzIE9QRU4sIG9uIHB1cnBvc2VcbiAqXG4gKiBPbmx5IHRoZSBvbmUgdmVyZGljdCBhIHBlcnNvbiB3cm90ZSBkb3duIHJlZnVzZXMgKEFHRU5UUy5tZCBtZXRhZGF0YVxuICogc2VtYW50aWNzIHJ1bGUgOCkuIEFuIGFjY291bnQgdGhhdCBwcmVkYXRlcyB0aGUgY29sdW1uLCBhbiBhY2NvdW50IHRoYXRcbiAqIGNhbm5vdCBiZSBmb3VuZCwgYW4gYWJzZW50IGBjdHguYXBpYCBhbmQgYW4gdW5yZWNvZ25pc2VkIHZhbHVlIGFsbCBsZXQgdGhlXG4gKiB3cml0ZSB0aHJvdWdoOiB0aGUgc2hpcHBlZCBkZWZhdWx0IGlzIGBmdWxsYCwgYW5kIGFuIGFjY291bnQgY3JlYXRlZCBiZWZvcmVcbiAqIHRoaXMgZmllbGQgZXhpc3RlZCBjYXJyaWVzIG5vdGhpbmcgYXQgYWxsIFx1MjAxNCBib3RoIG11c3Qgb3BlbiBkZWFscyBleGFjdGx5IGFzXG4gKiB0aGV5IGRpZCBiZWZvcmUgdGhlIGdhdGUgZXhpc3RlZC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgQSByZWFkIHRoYXQgVEhST1dTIGlzIG5vdCBpbiB0aGF0IGxpc3QgYW5kIGlzIGRlbGliZXJhdGVseSBub3QgY2F1Z2h0LiBBXG4gKiBicm9rZW4gcmVhZCBpcyBub3QgZXZpZGVuY2UgdGhhdCB0aGUgYWNjb3VudCBpcyBzZWxsYWJsZTsgc3dhbGxvd2luZyBpdFxuICogd291bGQgbWFrZSB0aGUgZ2F0ZSBzaWxlbnRseSBhYnNlbnQgZXhhY3RseSB3aGVuIHRoZSBwbGF0Zm9ybSBjYW5ub3QgYW5zd2VyLlxuICpcbiAqICMjIGBydW5BczogJ3N5c3RlbSdgLCBhbmQgYSByZWZ1c2FsIHRoYXQgbmFtZXMgbm8gYWNjb3VudCAoIzIwMTQpXG4gKlxuICogQXMgdGhlIGNhbGxlciwgdGhlIHZlcmRpY3Qgd2FzIHJlYWQgdW5kZXIgdGhlIGNhbGxlcidzIHJlY29yZCBhY2Nlc3MgXHUyMDE0IGFuZCBhXG4gKiByZXAgd2hvIGNhbm5vdCByZWFkIHRoZSBhY2NvdW50IGlzIG5vdCByZWZ1c2VkIHRoYXQgcmVhZDogcmVjb3JkLWxldmVsXG4gKiBhY2Nlc3MgRklMVEVSUyBpdCwgYGZpbmRPbmVgIGFuc3dlcnMgYG51bGxgLCB0aGUgZ2F0ZSB0b29rIHRoYXQgZm9yIFwiY2Fubm90XG4gKiBiZSBmb3VuZFwiIGFuZCBzdG9vZCBkb3duLCBhbmQgdGhlIGVuZ2luZSdzIHJlZmVyZW5jZSBjaGVjayBhY2NlcHRlZCB0aGUgbGlua1xuICogKG1lYXN1cmVkIG9uIDE3LjcuMDogYW4gb3V0c2lkZXIgb3BlbmVkIGEgZGVhbCBvbiBhIFNldHRsZW1lbnQgT25seSBhY2NvdW50XG4gKiB0aGV5IGNhbm5vdCByZWFkKS4gV2hldGhlciBhbiBhY2NvdW50IGlzIHNlbGxhYmxlIGlzIHRoZSBhY2NvdW50J3NcbiAqIGNvbW1lcmNpYWwgZmFjdCwgbm90IGEgcHJpdmlsZWdlIG9mIHdob2V2ZXIgbmFtZXMgaXQsIHNvIHRoZSBnYXRlIHJlYWRzIGl0XG4gKiBlbGV2YXRlZCAoQUdFTlRTLm1kIHJ1bGUgOSBcdTIwMTQgdGhlIHJlYWQgaXMgdGhlIG9uZSB0aGluZyBlbGV2YXRlZDsgdGhlIGRlYWxcbiAqIHdyaXRlIHN0YXlzIHRoZSBjYWxsZXIncykuXG4gKlxuICogV2hhdCBlbGV2YXRpb24gcmVhZHMgbXVzdCBub3QgbGVhayBiYWNrIHRocm91Z2ggdGhlIHJlZnVzYWwuIE1haW50YWluZXJcbiAqIHJ1bGluZyBvbiAjMjAxNCAob3B0aW9uIEIpOiB0aGUgcmVmdXNhbCBzYXlzIFwidGhpcyBhY2NvdW50XCIgYW5kIG5hbWVzIG5vbmUgXHUyMDE0XG4gKiBubyBudW1iZXIsIG5vIG5hbWUsIG5vIGlkIFx1MjAxNCBhbmQgc3RhdGVzIG5vdGhpbmcgaXQgcmVhZCBiZXlvbmQgdGhlIG9uZSBmYWN0XG4gKiB0aGF0IGJsb2NrcyB0aGUgZGVhbCwgdGhlIFNldHRsZW1lbnQgT25seSB2ZXJkaWN0LiBJdCBzdXBlcnNlZGVzICMxMjQzJ3NcbiAqIFwibmFtZSB0aGUgYWNjb3VudCB0aGUgd2F5IHRoZSBVSSBkb2VzXCIgb24gdGhpcyBvbmUgcGF0aDogdGhlIGNhbGxlciBjaG9zZVxuICogdGhlIGFjY291bnQgb24gdGhlIHZlcnkgZm9ybSB0aGUgcmVmdXNhbCBhbnN3ZXJzLCBzbyB0aGUgZGlhbG9nIHN0YXlzIGNsZWFyXG4gKiB3aXRob3V0IGVjaG9pbmcgYW4gYWNjb3VudCB0aGUgY2FsbGVyIG1heSBub3QgYmUgYWxsb3dlZCB0byByZWFkLiBTbyB0aGUgcmVhZFxuICogYXNrcyBmb3IgYGNvbW1lcmNpYWxfY2FwYWJpbGl0eWAgYW5kIG5vdGhpbmcgZWxzZS5cbiAqXG4gKiBPcmdhbml6YXRpb24gKEFHRU5UUy5tZCBydWxlIDEwKTogdGhlIHJlYWQgaXMgcGlubmVkIHRvIHRoZSBuZXcgZGVhbCdzIG93blxuICogYG9yZ2FuaXphdGlvbl9pZGAgd2hlbiBpdCBjYXJyaWVzIG9uZSwgc28gYW4gZWxldmF0ZWQgdmVyZGljdCBpcyBuZXZlciByZWFkXG4gKiBmcm9tIGFub3RoZXIgb3JnYW5pemF0aW9uJ3MgYWNjb3VudDsgYSBkZWFsIHdpdGggbm8gb3JnYW5pemF0aW9uIChhXG4gKiBzaW5nbGUtb3JnYW5pemF0aW9uIGluc3RhbGwpIGhhcyBubyB3YWxsIHRvIHN0YXkgaW5zaWRlLCBhbmQgaXMgbm90IHBpbm5lZC5cbiAqIEFuIGFjY291bnQgb3V0c2lkZSB0aGUgZGVhbCdzIG9yZ2FuaXphdGlvbiB0aGVuIHJlYWRzIGFzIFwiY2Fubm90IGJlIGZvdW5kXCJcbiAqIGFuZCB0aGUgZ2F0ZSBzdGFuZHMgZG93biBcdTIwMTQgdGhlIHNhbWUgYW5zd2VyIGEgcGVyc29uJ3MgdGVuYW50LXNjb3BlZCByZWFkXG4gKiBhbHJlYWR5IGdpdmVzLlxuICpcbiAqIFx1MjZENCBObyBzeXN0ZW0td3JpdGUgZXhlbXB0aW9uLCBkZWxpYmVyYXRlbHksIGFuZCBpdCBpcyB0aGUgc2FtZSByZWFkaW5nIHRoZVxuICogdHdvIGFwcHJvdmFsIGZsb3dzIHJlY29yZDogYSBjb250cm9sIHRoYXQgZW5nYWdlcyBvbmx5IGZvciB3cml0ZXJzIGNhcnJ5aW5nIGFcbiAqIHNlc3Npb24gaXMgbm90IGEgY29udHJvbCwgc2luY2UgYSBgcnVuQXM6ICdzeXN0ZW0nYCBpbXBvcnRlciB3b3VsZCBzaW1wbHlcbiAqIGJ5cGFzcyBpdC5cbiAqXG4gKiBQcmlvcml0eSAxNTAgcnVucyBpdCBBSEVBRCBvZiBgb3Bwb3J0dW5pdHlfbGlmZWN5Y2xlYCAoMjAwKTogYSByZWZ1c2VkIHdyaXRlXG4gKiBzaG91bGQgbm90IGZpcnN0IHBheSBmb3IgdGhlIGRlcml2ZWQtZmllbGQgcmVjb21wdXRlLlxuICovXG5jb25zdCBvcHBvcnR1bml0eUFjY291bnRDYXBhYmlsaXR5SG9vazogSG9vayA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X2FjY291bnRfY2FwYWJpbGl0eScsXG4gIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScsXG4gIGV2ZW50czogWydiZWZvcmVJbnNlcnQnXSxcbiAgcHJpb3JpdHk6IDE1MCxcbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnUmVmdXNlIGEgTkVXIG9wcG9ydHVuaXR5IGxpbmtlZCB0byBhbiBhY2NvdW50IHdob3NlIGNvbW1lcmNpYWwgY2FwYWJpbGl0eSBpcyBzZXR0bGVtZW50IG9ubHkuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvLyBUaGUgcmVmdXNhbCBlbnZlbG9wZSAoIzEwNzUpLiBNaXJyb3JlZCBmcm9tIGAuL19yZWZ1c2FsLnRzYCBiZWNhdXNlIGFcbiAgICAvLyBsb3dlcmVkIGJvZHkgaGFzIG5vIG1vZHVsZSBzY29wZSBhbmQgYGV4dHJhY3RIb29rQm9keWAgVEhST1dTIG9uIGFuXG4gICAgLy8gaW1wb3J0OyBgdGVzdC9yZWZ1c2FsLWVudmVsb3BlLnRlc3QudHNgIHBpbnMgZXZlcnkgY29weSBhZ2FpbnN0IGl0LlxuICAgIGZ1bmN0aW9uIHJlZnVzZShcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvZGU6IHN0cmluZyxcbiAgICAgIHN0YXR1czogbnVtYmVyLFxuICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZyA9IG1lc3NhZ2UsXG4gICAgKTogRXJyb3Ige1xuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpIGFzIEVycm9yICYge1xuICAgICAgICBjb2RlOiBzdHJpbmc7XG4gICAgICAgIHN0YXR1czogbnVtYmVyO1xuICAgICAgICB1c2VyTWVzc2FnZTogc3RyaW5nO1xuICAgICAgfTtcbiAgICAgIGVyci5jb2RlID0gY29kZTtcbiAgICAgIGVyci5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICBlcnIudXNlck1lc3NhZ2UgPSB1c2VyTWVzc2FnZTtcbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGNvbnN0IGFwaSA9IGN0eC5hcGkgYXMgSG9va0FwaSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFwaSkgcmV0dXJuO1xuICAgIGNvbnN0IGFjY291bnRJZCA9IGN0eC5pbnB1dC5jcm1fYWNjb3VudDtcbiAgICBpZiAodHlwZW9mIGFjY291bnRJZCAhPT0gJ3N0cmluZycgfHwgYWNjb3VudElkID09PSAnJykgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3JnID0gY3R4LmlucHV0Lm9yZ2FuaXphdGlvbl9pZDtcbiAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2FjY291bnQnKS5maW5kT25lKHtcbiAgICAgIHdoZXJlOiB7IGlkOiBhY2NvdW50SWQsIC4uLih0eXBlb2Ygb3JnID09PSAnc3RyaW5nJyAmJiBvcmcgPyB7IG9yZ2FuaXphdGlvbl9pZDogb3JnIH0gOiB7fSkgfSxcbiAgICAgIGZpZWxkczogWydjb21tZXJjaWFsX2NhcGFiaWxpdHknXSxcbiAgICB9KTtcbiAgICBpZiAoIWFjY291bnQgfHwgYWNjb3VudC5jb21tZXJjaWFsX2NhcGFiaWxpdHkgIT09ICdzZXR0bGVtZW50X29ubHknKSByZXR1cm47XG5cbiAgICAvLyBcdTI2RDQgXCJ0aGlzIGFjY291bnRcIiwgbmV2ZXIgYSBudW1iZXIsIGEgbmFtZSBvciBhbiBpZCBcdTIwMTQgc2VlIHRoZSBub3RlIGFib3ZlLlxuICAgIHRocm93IHJlZnVzZShcbiAgICAgICdDYW5ub3Qgb3BlbiBhbiBvcHBvcnR1bml0eSBhZ2FpbnN0IHRoaXMgYWNjb3VudDogaXRzIENvbW1lcmNpYWwgQ2FwYWJpbGl0eSBpcyBTZXR0bGVtZW50IE9ubHksIHNvIGl0IGlzIGF2YWlsYWJsZSBmb3IgYmlsbGluZyBhbmQgcGF5bWVudCBidXQgbm8gbmV3IGJ1c2luZXNzIG1heSBiZSBib29rZWQgYWdhaW5zdCBpdC4gUGljayBhIGRpZmZlcmVudCBhY2NvdW50LCBvciBoYXZlIHRoZSBhY2NvdW50IHJlY2xhc3NpZmllZCB0byBGdWxsIGZpcnN0LicsXG4gICAgICAnVkFMSURBVElPTl9GQUlMRUQnLFxuICAgICAgNDAwLFxuICAgICk7XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBbXG4gIG9wcG9ydHVuaXR5QWNjb3VudENhcGFiaWxpdHlIb29rLFxuICBvcHBvcnR1bml0eVZhbGlkYXRpb25Ib29rLFxuICBvcHBvcnR1bml0eVdvbkhvb2ssXG5dO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0cy9vcHBvcnR1bml0eS5jYW1wYWlnbi1tZXRyaWNzLmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL29wcG9ydHVuaXR5LmNhbXBhaWduLW1ldHJpY3MuaG9vay50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBIb29rLCBIb29rQ29udGV4dCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHR5cGUgeyBIb29rQXBpIH0gZnJvbSAnLi9faG9vay1hcGknO1xuXG4vKipcbiAqIENhbXBhaWduIG1ldHJpYyByZWZyZXNoLCB0cmlnZ2VyZWQgYnkgYW4gT1BQT1JUVU5JVFkgd3JpdGUuXG4gKlxuICogVGhlIGhvb2sgaXMgY2FtcGFpZ24gYXJpdGhtZXRpYywgYnV0IGl0IGlzIGF0dGFjaGVkIHRvIGBjcm1fb3Bwb3J0dW5pdHlgLFxuICogd2hpY2ggdGhlIHNhbGVzIHBhY2thZ2Ugb3ducyBcdTIwMTQgYW5kIHNpbmNlIHRoZSBBRFItMDEzMCBsYXlvdXQgYSBob29rIGxpdmVzXG4gKiBiZXNpZGUgdGhlIG9iamVjdCBpdCBuYW1lcyAocGxhbiBpdGVtIDY6IFI0IGlzIGVuZm9yY2VkIGJ5IGNvLWxvY2F0aW9uXG4gKiByYXRoZXIgdGhhbiBieSByZWFkaW5nKS4gSXRzIHRocmVlIHNpYmxpbmdzOiBgY2FtcGFpZ25fdmFsaWRhdGlvbmAgYW5kXG4gKiBgY2FtcGFpZ25fbWV0cmljc19yZWZyZXNoYCBvbiBgY3JtX2NhbXBhaWduYCBpblxuICogYHNyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbi5ob29rLnRzYCwgYW5kXG4gKiBgY2FtcGFpZ25fbGVhZF9jb252ZXJzaW9uX3JlZnJlc2hgIG9uIGBjcm1fbGVhZGAgbmV4dCBkb29yIGluXG4gKiBgbGVhZC5jYW1wYWlnbi1tZXRyaWNzLmhvb2sudHNgLiBUaGUgbWVtYmVyc2hpcCBzaWRlIG9mIHRoZSBzYW1lIHJlY29tcHV0ZVxuICogaXMgYHNyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbl9tZW1iZXIuaG9vay50c2AuXG4gKlxuICogXHUyNkEwXHVGRTBGIFdIWSBUSEUgUkVDT01QVVRFIElTIFdSSVRURU4gT1VUIEZPVVIgVElNRVMuXG4gKlxuICogTDIgaG9vayBib2RpZXMgYXJlIGxvd2VyZWQgdG8gbWV0YWRhdGEgYW5kIGV2YWx1YXRlZCBCT0RZLU9OTFkgaW4gdGhlIFF1aWNrSlNcbiAqIHNhbmRib3g6IGEgaGFuZGxlciBjYW5ub3QgcmVhY2ggbW9kdWxlIHNjb3BlIGF0IHJ1bnRpbWUsIHNvIGEgc2hhcmVkXG4gKiBgcmVmcmVzaENhbXBhaWduTWV0cmljcygpYCBpbXBvcnQgd291bGQgYmUgYSBmcmVlIGlkZW50aWZpZXIgXHUyMDE0IHRoZSBDTEkgYnVpbGRcbiAqIHNpbGVudGx5IGRlY2xpbmVzIHRvIGxvd2VyIHRoZSBoYW5kbGVyLCBrZWVwcyBpdCBpbiBhIGJ1bmRsZWQgcnVudGltZSBmaWxlLFxuICogYW5kIHRoZSBob29rIHN0b3BzIGJlaW5nIGRlcGxveWFibGUgYXMgcHVyZSBtZXRhZGF0YSAodGhlIGJ1aWxkIHNheXMgc28gaW5cbiAqIG9uZSBsaW5lIG5vYm9keSByZWFkcykuIGB0ZXN0L2FjdGlvbi1zYW5kYm94LnRlc3QudHNgIGlzIHdoYXQgY2F0Y2hlcyBpdC5cbiAqXG4gKiBTbyB0aGUgYXJpdGhtZXRpYyBpcyBpbmxpbmVkIHBlciBoYW5kbGVyLiBUaGUgZHVwbGljYXRpb24gaXMgTk9UIHRydXN0ZWQ6XG4gKiBgdGVzdC9jYW1wYWlnbi1tZW1iZXItbGlmZWN5Y2xlLnRlc3QudHNgIGxvd2VycyBhbGwgZm91ciBib2RpZXMgYW5kIGFzc2VydHNcbiAqIHRoZSByZWNvbXB1dGUgYmxvY2sgaXMgY2hhcmFjdGVyLWlkZW50aWNhbCBhY3Jvc3MgdGhlbSwgc28gYSBmaXggbGFuZGluZyBvblxuICogb25lIGNvcHkgYW5kIHNraXBwaW5nIHRocmVlIGZhaWxzIGEgdGVzdCBpbnN0ZWFkIG9mIHNoaXBwaW5nIGZvdXIgZGVmaW5pdGlvbnNcbiAqIG9mIGBudW1fc2VudGAuIFNwbGl0dGluZyB0aGUgZm91ciBhY3Jvc3MgdGhyZWUgZmlsZXMgYnkgb3duaW5nIG9iamVjdCBjaGFuZ2VkXG4gKiBub25lIG9mIHRoYXQgXHUyMDE0IHRoZSBzdWl0ZSByZWFkcyB0aGVtIGJ5IGhvb2sgbmFtZSwgbm90IGJ5IGZpbGUuXG4gKi9cblxuLyoqXG4gKiBSZWNvbXB1dGUgd2hlbiBhbiBvcHBvcnR1bml0eSdzIGNhbXBhaWduIGF0dHJpYnV0aW9uIGNoYW5nZXMuXG4gKlxuICogYG51bV9vcHBvcnR1bml0aWVzYCwgYG51bV93b25fb3Bwb3J0dW5pdGllc2AgYW5kIGBhY3R1YWxfcmV2ZW51ZWAgZGVyaXZlIGZyb21cbiAqIG9wcG9ydHVuaXRpZXMsIG5vdCBmcm9tIG1lbWJlcnMgXHUyMDE0IHNvIHRoZSBtZW1iZXJzaGlwIHRyaWdnZXIgYWxvbmUgd291bGQgbGVhdmVcbiAqIGV4YWN0bHkgdGhlIHRocmVlIG1ldHJpY3MgYHJvaWAgaXMgYnVpbHQgb24gc3RhbGUuIEluc2VydCAvIHVwZGF0ZSAvIGRlbGV0ZSxcbiAqIGFuZCBib3RoIHNpZGVzIG9mIGEgcmUtYXR0cmlidXRpb24gKG9sZCBhbmQgbmV3IGNhbXBhaWduKSwgdGhlIHNhbWUgd2F5IHRoZVxuICogbGluZS1pdGVtIHJvbGx1cCBoYW5kbGVzIHJlLXBhcmVudGluZy5cbiAqXG4gKiBEZWNsYXJlZCBoZXJlIHJhdGhlciB0aGFuIGluIGBvcHBvcnR1bml0eS5ob29rLnRzYCBvbiBwdXJwb3NlOiBpdCBpcyBjYW1wYWlnblxuICogYXJpdGhtZXRpYyB0aGF0IGhhcHBlbnMgdG8gYmUgdHJpZ2dlcmVkIGJ5IGFuIG9wcG9ydHVuaXR5IHdyaXRlLCBhbmQgdGhlXG4gKiBob29rcyBiYXJyZWwgZmxhdHRlbnMgZWFjaCBgKi5ob29rLnRzYCBkZWZhdWx0IGV4cG9ydCByZWdhcmRsZXNzIG9mIHdoaWNoXG4gKiBvYmplY3QgZWFjaCBlbnRyeSBuYW1lcy5cbiAqXG4gKiBgcnVuQXM6ICdzeXN0ZW0nYCAoIzIwMTQsIEFHRU5UUy5tZCBydWxlIDkpLiBUaGUgdHJpZ2dlciBpcyBhIHNhbGVzIHdyaXRlIFx1MjAxNFxuICogYSByZXAgd2lubmluZyB0aGVpciBvd24gZGVhbCwgYSBtYW5hZ2VyIHdpbm5pbmcgb25lIG9uIGEgbWFya2V0aW5nLW93bmVkXG4gKiBjYW1wYWlnbiBcdTIwMTQgYW5kIG5laXRoZXIgbWF5IGVkaXQgdGhlIGNhbXBhaWduLCBzbyB0aGUgbWV0cmljIHdyaXRlIHdhc1xuICogcmVmdXNlZCwgbG9nZ2VkIGFuZCBzd2FsbG93ZWQ6IHRoZSBkZWFsIHdhcyB3b24gYW5kIHRoZSBjYW1wYWlnbidzIHJldmVudWVcbiAqIHN0YXllZCAwLiBUaGUgcmVjb21wdXRlIGlzIHRoZSBjYW1wYWlnbidzIHdyaXRlciwgbm90IHRoZSByZXAncywgc28gdGhlXG4gKiBob29rIGVsZXZhdGVzOyB0aGUgb3Bwb3J0dW5pdHkgd3JpdGUgc3RheXMgdGhlIGNhbGxlcidzLiBPcmdhbml6YXRpb25cbiAqIChydWxlIDEwKTogZXZlcnkgcmVhZCBpcyBrZXllZCB0byB0aGUgdHJpZ2dlcmluZyBkZWFsJ3MgY2FtcGFpZ24gKGFuZCB0aGVcbiAqIGxlYWRzIGl0cyBtZW1iZXJzIG5hbWUpLCBhbmQgdGhlIGVsZXZhdGVkIGBjdHguYXBpYCBrZWVwcyB0aGUgdHJpZ2dlcidzXG4gKiB0ZW5hbnQuXG4gKi9cbmNvbnN0IGNhbXBhaWduQXR0cmlidXRpb25SZWZyZXNoOiBIb29rID0ge1xuICBuYW1lOiAnY2FtcGFpZ25fYXR0cmlidXRpb25fcmVmcmVzaCcsXG4gIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScsXG4gIGV2ZW50czogWydhZnRlckluc2VydCcsICdhZnRlclVwZGF0ZScsICdhZnRlckRlbGV0ZSddLFxuICBwcmlvcml0eTogODEwLFxuICBhc3luYzogdHJ1ZSxcbiAgb25FcnJvcjogJ2xvZycsXG4gIHJ1bkFzOiAnc3lzdGVtJyxcbiAgZGVzY3JpcHRpb246ICdSZWNvbXB1dGUgY2FtcGFpZ24gbWV0cmljcyB3aGVuIGFuIG9wcG9ydHVuaXR5XHUyMDE5cyBjYW1wYWlnbiBhdHRyaWJ1dGlvbiBjaGFuZ2VzLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXBpKSByZXR1cm47XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gY3R4O1xuICAgIGNvbnN0IHByZXZpb3VzID0gY3R4LnByZXZpb3VzO1xuICAgIGNvbnN0IGNhbXBhaWduSWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFtcbiAgICAgIHR5cGVvZiBpbnB1dD8uY3JtX2NhbXBhaWduID09PSAnc3RyaW5nJyA/IGlucHV0LmNybV9jYW1wYWlnbiA6ICcnLFxuICAgICAgdHlwZW9mIHByZXZpb3VzPy5jcm1fY2FtcGFpZ24gPT09ICdzdHJpbmcnID8gKHByZXZpb3VzLmNybV9jYW1wYWlnbiBhcyBzdHJpbmcpIDogJycsXG4gICAgXS5maWx0ZXIoQm9vbGVhbikpKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIGNhbXBhaWduSWRzKSB7XG4gICAgICAvLyBcdTI1MDBcdTI1MDAgcmVjb21wdXRlIFx1MjUwMFx1MjUwMCBpZGVudGljYWwgaW4gYWxsIGZvdXIgcmVmcmVzaCBob29rczsgc2VlIHRoZSBoZWFkZXIuXG4gICAgICBjb25zdCBtZW1iZXJSb3dzID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduX21lbWJlcicpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGlkIH0sIGZpZWxkczogWydjcm1fbGVhZCcsICdzdGF0dXMnXSwgdG9wOiA1MDAwLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsZWFkSWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFxuICAgICAgICBtZW1iZXJSb3dzLm1hcCgocikgPT4gKHR5cGVvZiByLmNybV9sZWFkID09PSAnc3RyaW5nJyA/IHIuY3JtX2xlYWQgOiAnJykpLmZpbHRlcihCb29sZWFuKSxcbiAgICAgICkpO1xuICAgICAgY29uc3QgY29udmVydGVkTGVhZHMgPSBsZWFkSWRzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhd2FpdCBhcGkub2JqZWN0KCdjcm1fbGVhZCcpLmNvdW50KHsgd2hlcmU6IHsgaWQ6IHsgJGluOiBsZWFkSWRzIH0sIGlzX2NvbnZlcnRlZDogdHJ1ZSB9IH0pXG4gICAgICAgIDogMDtcbiAgICAgIGNvbnN0IG51bU9wcG9ydHVuaXRpZXMgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fb3Bwb3J0dW5pdHknKS5jb3VudCh7IHdoZXJlOiB7IGNybV9jYW1wYWlnbjogaWQgfSB9KTtcbiAgICAgIGNvbnN0IG51bVdvbiA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9vcHBvcnR1bml0eScpLmNvdW50KHsgd2hlcmU6IHsgY3JtX2NhbXBhaWduOiBpZCwgc3RhZ2U6ICdjbG9zZWRfd29uJyB9IH0pO1xuICAgICAgY29uc3Qgd29uUm93cyA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9vcHBvcnR1bml0eScpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGlkLCBzdGFnZTogJ2Nsb3NlZF93b24nIH0sIGZpZWxkczogWydhbW91bnQnXSwgdG9wOiA1MDAwLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBhY3R1YWxSZXZlbnVlID0gd29uUm93cy5yZWR1Y2UoXG4gICAgICAgIChzdW0sIHJvdykgPT4gc3VtICsgKHR5cGVvZiByb3cuYW1vdW50ID09PSAnbnVtYmVyJyA/IHJvdy5hbW91bnQgOiBOdW1iZXIocm93LmFtb3VudCkgfHwgMCksIDAsXG4gICAgICApO1xuICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduJykudXBkYXRlKHtcbiAgICAgICAgaWQsXG4gICAgICAgIG51bV9zZW50OiBtZW1iZXJSb3dzLmxlbmd0aCxcbiAgICAgICAgbnVtX3Jlc3BvbnNlczogbWVtYmVyUm93cy5maWx0ZXIoKHIpID0+IHIuc3RhdHVzID09PSAncmVzcG9uZGVkJyB8fCByLnN0YXR1cyA9PT0gJ2NvbnZlcnRlZCcpLmxlbmd0aCxcbiAgICAgICAgbnVtX2xlYWRzOiBsZWFkSWRzLmxlbmd0aCxcbiAgICAgICAgbnVtX2NvbnZlcnRlZF9sZWFkczogY29udmVydGVkTGVhZHMsXG4gICAgICAgIG51bV9vcHBvcnR1bml0aWVzOiBudW1PcHBvcnR1bml0aWVzLFxuICAgICAgICBudW1fd29uX29wcG9ydHVuaXRpZXM6IG51bVdvbixcbiAgICAgICAgYWN0dWFsX3JldmVudWU6IGFjdHVhbFJldmVudWUsXG4gICAgICB9LCB7IHdoZXJlOiB7IGlkIH0gfSk7XG4gICAgICAvLyBcdTI1MDBcdTI1MDAgL3JlY29tcHV0ZSBcdTI1MDBcdTI1MDBcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBbY2FtcGFpZ25BdHRyaWJ1dGlvblJlZnJlc2hdO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0cy90YXNrLmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL3Rhc2suaG9vay50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBIb29rLCBIb29rQ29udGV4dCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHR5cGUgeyBIb29rQXBpIH0gZnJvbSAnLi9faG9vay1hcGknO1xuXG4vKipcbiAqIFRhc2sgbGlmZWN5Y2xlIGhvb2suXG4gKlxuICogLSBPbiBgY29tcGxldGVkYCB0cmFuc2l0aW9uLCBzdGFtcHMgYGNvbXBsZXRlZF9kYXRlYCBhbmQgYHByb2dyZXNzX3BlcmNlbnQ9MTAwYC5cbiAqIC0gV2FybnMgd2hlbiBgcmVtaW5kZXJfZGF0ZWAgaXMgYWZ0ZXIgYGR1ZV9kYXRlYC5cbiAqIC0gQnViYmxlcyBhY3Rpdml0eSB0byB0aGUgcG9seW1vcnBoaWMgcGFyZW50IChhY2NvdW50IGBsYXN0X2FjdGl2aXR5X2RhdGVgLFxuICogICBsZWFkIGBsYXN0X2NvbnRhY3RlZF9kYXRlYCkuXG4gKiAtIFJlZnVzZXMgdG8gU0NIRURVTEUgYSBwaG9uZSB0b3VjaCBhZ2FpbnN0IGEgcGVyc29uIGZsYWdnZWQgYGRvX25vdF9jYWxsYFxuICogICAoc2VlIHtAbGluayB0YXNrRG9Ob3RDYWxsR3VhcmR9KS5cbiAqL1xuXG5jb25zdCB0YXNrVmFsaWRhdGlvbjogSG9vayA9IHtcbiAgbmFtZTogJ3Rhc2tfY29tcGxldGlvbicsXG4gIG9iamVjdDogJ2NybV90YXNrJyxcbiAgZXZlbnRzOiBbJ2JlZm9yZUluc2VydCcsICdiZWZvcmVVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDIwMCxcbiAgZGVzY3JpcHRpb246ICdTdGFtcCBjb21wbGV0ZWQvb3ZlcmR1ZSBmbGFncyArIGRhdGVzIG9uIGNvbXBsZXRpb24gYW5kIHZhbGlkYXRlIHJlbWluZGVyIHRpbWluZy4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIC8vIEQzIHN0YW5kLWRvd246IGEgcHJlZGljYXRlIHVwZGF0ZSBoYXMgT05FIHBheWxvYWQgZm9yIGV2ZXJ5IG1hdGNoZWQgcm93LFxuICAgIC8vIHNvIHRoZSBgY3R4LnByZXZpb3VzYC1jb25kaXRpb25lZCB3cml0ZXMgYmVsb3cgd291bGQgbGFuZCBvbiByb3dzIHRoYXRcbiAgICAvLyBkaWQgbm90IGVhcm4gdGhlbSBcdTIwMTQgcmVmdXNlZCBhcyBhIGRpdmVyZ2luZyBrZXkgc2V0LCBvciBzdG9yZWQgc2lsZW50bHlcbiAgICAvLyBmcm9tIHRoZSBsYXN0IHJvdy4gRnVsbCBhY2NvdW50IGFuZCB0aGUgbWVhc3VyZW1lbnQ6IGBmb3JlY2FzdC5ob29rLnRzYC5cbiAgICBpZiAoY3R4LmV2ZW50ID09PSAnYmVmb3JlVXBkYXRlJyAmJiBjdHguZGlzcGF0Y2g/Lm1vZGUgPT09ICdwZXItcm93JykgcmV0dXJuO1xuXG4gICAgLy8gVGhlIHJlZnVzYWwgZW52ZWxvcGUgKCMxMDc1KS4gTWlycm9yZWQgZnJvbSBgLi9fcmVmdXNhbC50c2AgYmVjYXVzZSBhXG4gICAgLy8gbG93ZXJlZCBib2R5IGhhcyBubyBtb2R1bGUgc2NvcGUgYW5kIGBleHRyYWN0SG9va0JvZHlgIFRIUk9XUyBvbiBhblxuICAgIC8vIGltcG9ydDsgYHRlc3QvcmVmdXNhbC1lbnZlbG9wZS50ZXN0LnRzYCBwaW5zIGV2ZXJ5IGNvcHkgYWdhaW5zdCBpdC5cbiAgICBmdW5jdGlvbiByZWZ1c2UoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb2RlOiBzdHJpbmcsXG4gICAgICBzdGF0dXM6IG51bWJlcixcbiAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmcgPSBtZXNzYWdlLFxuICAgICk6IEVycm9yIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29kZTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZztcbiAgICAgIH07XG4gICAgICBlcnIuY29kZSA9IGNvZGU7XG4gICAgICBlcnIuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgZXJyLnVzZXJNZXNzYWdlID0gdXNlck1lc3NhZ2U7XG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG5cbiAgICAvLyBMYW5kIGByZW1pbmRlcl9zZW50YCBhcyBhIHJlYWwgYm9vbGVhbiBvbiBpbnNlcnQsIG5ldmVyIE5VTEwuIFRoZVxuICAgIC8vIHRhc2tfZHVlX3JlbWluZGVyIHN3ZWVwIGRlLWR1cHMgb24gYHJlbWluZGVyX2RhdGVgIChjbGVhcmVkIGFmdGVyIGVhY2hcbiAgICAvLyBzZW5kKSwgbm90IG9uIHRoaXMgZmxhZyBcdTIwMTQgYnV0IGtlZXAgaXQgYSByZWFsIGJvb2xlYW4gc28gdGhlIGF1ZGl0IHRyYWlsXG4gICAgLy8gYW5kIGFueSBmdXR1cmUgYCE9IHRydWVgIGZpbHRlciBiZWhhdmUgdW5kZXIgU1FMIHRocmVlLXZhbHVlZCBsb2dpYy5cbiAgICBpZiAoIXByZXZpb3VzICYmIGlucHV0LnJlbWluZGVyX3NlbnQgPT0gbnVsbCkge1xuICAgICAgaW5wdXQucmVtaW5kZXJfc2VudCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE1hdGVyaWFsaXNlIHRoZSB1cmdlbmN5IG9yZGluYWwgc28gdGhlIHRvLWRvIHF1ZXVlIGNhbiBzb3J0IGJ5IGl0IFx1MjAxNFxuICAgIC8vIHNvcnRpbmcgb24gYHByaW9yaXR5YCBpdHNlbGYgY29tcGFyZXMgcmF3IHN0cmluZ3MgYW5kIGludmVydHMgdXJnZW5jeS5cbiAgICBjb25zdCBlZmZQcmlvcml0eSA9XG4gICAgICAodHlwZW9mIGlucHV0LnByaW9yaXR5ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5wcmlvcml0eSkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXM/LnByaW9yaXR5ID09PSAnc3RyaW5nJyAmJiAocHJldmlvdXMucHJpb3JpdHkgYXMgc3RyaW5nKSkgfHxcbiAgICAgIHVuZGVmaW5lZDtcbiAgICAvL1xuICAgIC8vIElubGluZSBhbmQgZHVwbGljYXRlZCBpbiBjYXNlLmhvb2sudHMgb24gcHVycG9zZSBcdTIwMTQgTDIgaG9vayBib2RpZXMgcnVuXG4gICAgLy8gYm9keS1vbmx5IGluIHRoZSBRdWlja0pTIHNhbmRib3gsIHNvIGEgc2hhcmVkIG1vZHVsZSBjb25zdGFudCByZXNvbHZlcyBhdFxuICAgIC8vIGF1dGhvcmluZyB0aW1lIGFuZCBhcnJpdmVzIGFzIGB1bmRlZmluZWRgIChzZWUgX2xpbmUtaXRlbS1wcmljZS1maWxsLnRzKS5cbiAgICAvLyBUaGUgdm9jYWJ1bGFyaWVzIGRpZmZlciAobm9ybWFsIHZzIG1lZGl1bSksIGJ1dCB0aGUgVU5LTk9XTiBmYWxsYmFjayBtdXN0XG4gICAgLy8gbWF0Y2ggY3JtX2Nhc2U6IGAwYCwgdGhlIHVucmFua2VkIHNlbnRpbmVsIHRoYXQgc29ydHMgYmVsb3cgZXZlcnkgcmVhbFxuICAgIC8vIHJhbmsuIGB0ZXN0L3ByaW9yaXR5LXJhbmstcGFyaXR5LnRlc3QudHNgIHBpbnMgdGhhdCBhZ3JlZW1lbnQuXG4gICAgaWYgKGVmZlByaW9yaXR5KSB7XG4gICAgICBjb25zdCByYW5rOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0geyBsb3c6IDEsIG5vcm1hbDogMiwgaGlnaDogMywgdXJnZW50OiA0IH07XG4gICAgICBpbnB1dC5wcmlvcml0eV9yYW5rID0gcmFua1tlZmZQcmlvcml0eV0gPz8gMDtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXQuc3RhdHVzID09PSAnY29tcGxldGVkJyAmJiBwcmV2aW91cz8uc3RhdHVzICE9PSAnY29tcGxldGVkJykge1xuICAgICAgLy8gXHUyNkEwXHVGRTBGIGAhaW5wdXQuY29tcGxldGVkX2RhdGVgIEFMT05FIHdhcyB0aGUgZGVmZWN0LCBhbmQgYHx8ICFjdHguc2Vzc2lvbj8uaXNTeXN0ZW1gXG4gICAgICAvLyBpcyB0aGUgZml4IFx1MjAxNCBcdTI2RDQgZG8gbm90IHRpZHkgdGhlIHNlY29uZCBoYWxmIGF3YXkuIGBjb21wbGV0ZWRfZGF0ZWAgaXNcbiAgICAgIC8vIGByZWFkb25seTogdHJ1ZWAsIGFuZCBzaW5jZSBgQG9iamVjdHN0YWNrL29iamVjdHFsQDE3LjQuMGAgdGhlIGVuZ2luZSBzdHJpcHMgYVxuICAgICAgLy8gc3RhdGljIHJlYWRvbmx5IGZpZWxkIGZyb20gYSBOT04tU1lTVEVNIGNhbGxlcidzIElOU0VSVCB0b28sIG5vdCBqdXN0IHRoZWlyXG4gICAgICAvLyBVUERBVEUgKHRoZSByZXRpcmVkLXBpbiBub3RlIGluIGB0ZXN0L3JlYWRvbmx5LXdyaXRlLXNlbWFudGljcy50ZXN0LnRzYCBjYXJyaWVzXG4gICAgICAvLyB0aGF0IG1pZ3JhdGlvbikuIE1lYXN1cmVkIGFnYWluc3QgYSBydW5uaW5nIHNlcnZlciBvbiB0aGUgMTcuNC4wIHBpbjogdGhpc1xuICAgICAgLy8gaGFuZGxlciBzdGlsbCBTRUVTIHRoZSBjYWxsZXIncyB2YWx1ZSBcdTIwMTQgdGhlIHN0cmlwIHJ1bnMgYWZ0ZXIgYGJlZm9yZUluc2VydGBcbiAgICAgIC8vIHJldHVybnMgXHUyMDE0IGFuZCB0aGUgdmFsdWUgVEhJUyBsaW5lIHdyaXRlcyBzdXJ2aXZlcyBpdCwgYmVjYXVzZSBhIGhvb2std3JpdHRlblxuICAgICAgLy8ga2V5IGlzIG5vdCBjYWxsZXItc3VwcGxpZWQuXG4gICAgICAvL1xuICAgICAgLy8gU28gZGVmZXJyaW5nIHRvIGEgc3VwcGxpZWQgdmFsdWUgaW52ZXJ0ZWQgdGhlIHJ1bGUgYmVsb3cgaXQ6IGEgY2FsbGVyIHdobyBzZW50XG4gICAgICAvLyBgY29tcGxldGVkX2RhdGVgIHN1cHByZXNzZWQgdGhlIG9ubHkgc3RhbXAgdGhlcmUgd2FzLCB0aGUgZW5naW5lIHRoZW4gZGVsZXRlZFxuICAgICAgLy8gd2hhdCB0aGV5IHNlbnQsIGFuZCBgY29tcGxldGVkX2RhdGVfcmVxdWlyZWRgIHJlamVjdGVkIHRoZSBvbmUgY2FsbCB0aGF0IGhhZFxuICAgICAgLy8gYWN0dWFsbHkgc3VwcGxpZWQgdGhlIGZpZWxkIFx1MjAxNCB3aGlsZSBvbWl0dGluZyBpdCBzdWNjZWVkZWQuIFRoZSBlcnJvciBuYW1lZCB0aGVcbiAgICAgIC8vIGZpZWxkIHdob3NlIFBSRVNFTkNFIGNhdXNlZCBpdCwgc28gYW4gYWdlbnQgcmV0cmllZCBieSBzZW5kaW5nIGl0IGFnYWluLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBgaXNTeXN0ZW1gIGhhbGYgaXMgbm90IGRlY29yYXRpb246IG5vdGhpbmcgc3RyaXBzIGEgc3lzdGVtIHdyaXRlLCBhbmRcbiAgICAgIC8vIGBzcmMvc2FsZXMvZGF0YS9hY3Rpdml0eS5zZWVkLnRzYCBiYWNrLWRhdGVzIGNvbXBsZXRpb25zIHdpdGggYGRheXNBZ28oMylgIC9cbiAgICAgIC8vIGBkYXlzQWdvKDIpYC4gU3RhbXBpbmcgb3ZlciB0aG9zZSB3b3VsZCByZXBsYXkgdGhlIGRlbW8gYm9vayB3aXRoIGV2ZXJ5XG4gICAgICAvLyBjb21wbGV0aW9uIGRhdGVkIHRvZGF5LlxuICAgICAgaWYgKCFpbnB1dC5jb21wbGV0ZWRfZGF0ZSB8fCAhY3R4LnNlc3Npb24/LmlzU3lzdGVtKSB7XG4gICAgICAgIGlucHV0LmNvbXBsZXRlZF9kYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBpbnB1dC5wcm9ncmVzc19wZXJjZW50ICE9PSAnbnVtYmVyJykgaW5wdXQucHJvZ3Jlc3NfcGVyY2VudCA9IDEwMDtcbiAgICB9XG5cbiAgICAvLyBEZXJpdmVkIGZsYWdzLlxuICAgIGNvbnN0IGVmZlN0YXR1cyA9XG4gICAgICAodHlwZW9mIGlucHV0LnN0YXR1cyA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3RhdHVzKSB8fFxuICAgICAgKHR5cGVvZiBwcmV2aW91cz8uc3RhdHVzID09PSAnc3RyaW5nJyAmJiAocHJldmlvdXMuc3RhdHVzIGFzIHN0cmluZykpIHx8XG4gICAgICB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBlZmZTdGF0dXMgPT09ICdzdHJpbmcnKSBpbnB1dC5pc19jb21wbGV0ZWQgPSBlZmZTdGF0dXMgPT09ICdjb21wbGV0ZWQnO1xuICAgIGNvbnN0IGVmZkR1ZSA9XG4gICAgICAodHlwZW9mIGlucHV0LmR1ZV9kYXRlID09PSAnc3RyaW5nJyAmJiBpbnB1dC5kdWVfZGF0ZSkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXM/LmR1ZV9kYXRlID09PSAnc3RyaW5nJyAmJiAocHJldmlvdXMuZHVlX2RhdGUgYXMgc3RyaW5nKSkgfHxcbiAgICAgIHVuZGVmaW5lZDtcbiAgICBjb25zdCB0b2RheVN0ciA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gICAgaW5wdXQuaXNfb3ZlcmR1ZSA9ICEhZWZmRHVlICYmIGVmZkR1ZS5zbGljZSgwLCAxMCkgPCB0b2RheVN0ciAmJiBpbnB1dC5pc19jb21wbGV0ZWQgIT09IHRydWU7XG5cbiAgICBjb25zdCByZW1pbmRlciA9XG4gICAgICAodHlwZW9mIGlucHV0LnJlbWluZGVyX2RhdGUgPT09ICdzdHJpbmcnICYmIGlucHV0LnJlbWluZGVyX2RhdGUpIHx8XG4gICAgICAodHlwZW9mIHByZXZpb3VzPy5yZW1pbmRlcl9kYXRlID09PSAnc3RyaW5nJyAmJiAocHJldmlvdXMucmVtaW5kZXJfZGF0ZSBhcyBzdHJpbmcpKSB8fFxuICAgICAgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGR1ZSA9XG4gICAgICAodHlwZW9mIGlucHV0LmR1ZV9kYXRlID09PSAnc3RyaW5nJyAmJiBpbnB1dC5kdWVfZGF0ZSkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXM/LmR1ZV9kYXRlID09PSAnc3RyaW5nJyAmJiAocHJldmlvdXMuZHVlX2RhdGUgYXMgc3RyaW5nKSkgfHxcbiAgICAgIHVuZGVmaW5lZDtcbiAgICBpZiAocmVtaW5kZXIgJiYgZHVlICYmIHJlbWluZGVyLnNsaWNlKDAsIDEwKSA+IGR1ZS5zbGljZSgwLCAxMCkpIHtcbiAgICAgIHRocm93IHJlZnVzZShcbiAgICAgICAgYFJlbWluZGVyICgke3JlbWluZGVyfSkgaXMgYWZ0ZXIgdGhlIGR1ZSBkYXRlICgke2R1ZX0pOyByZW1pbmRlcnMgc2hvdWxkIGZpcmUgYmVmb3JlIHRoZSBkZWFkbGluZS5gLFxuICAgICAgICAnVkFMSURBVElPTl9GQUlMRUQnLFxuICAgICAgICA0MDAsXG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogUmVjdXJyaW5nLXRhc2sgZ2VuZXJhdG9yLlxuICpcbiAqIFRoZSBzY2hlbWEgY2FycmllcyBgaXNfcmVjdXJyaW5nYCAvIGByZWN1cnJlbmNlX3R5cGVgIC8gYHJlY3VycmVuY2VfaW50ZXJ2YWxgXG4gKiAvIGByZWN1cnJlbmNlX2VuZF9kYXRlYCwgYnV0IG5vdGhpbmcgZXZlciBzcGF3bmVkIHRoZSBuZXh0IG9jY3VycmVuY2UgXHUyMDE0IHNvIGFcbiAqIFwicmVjdXJyaW5nXCIgdGFzayB3YXMgcmVjdXJyaW5nIGluIG5hbWUgb25seS4gT24gdGhlIGNvbXBsZXRpbmcgdHJhbnNpdGlvbiBvZiBhXG4gKiByZWN1cnJpbmcgdGFzaywgdGhpcyBjbG9uZXMgaXQgd2l0aCBgZHVlX2RhdGVgIChhbmQgYHJlbWluZGVyX2RhdGVgKSBhZHZhbmNlZFxuICogYnkgYHJlY3VycmVuY2VfdHlwZSBcdTAwRDcgaW50ZXJ2YWxgLCB1bnRpbCBgcmVjdXJyZW5jZV9lbmRfZGF0ZWAgaXMgcGFzc2VkLlxuICpcbiAqIERvbmUgaW4gYSBob29rIChub3QgYSBmbG93KSBiZWNhdXNlIHRoZSBuZXh0IGR1ZSBkYXRlIG5lZWRzIHJlYWwgY2FsZW5kYXIgbWF0aFxuICogKG1vbnRoL3llYXIgcm9sbG92ZXIpOyB0aGUgZmxvdyBydW50aW1lJ3MgYHtOT1coKStufWAgb25seSBkb2VzIGRheSBvZmZzZXRzIGFuZFxuICogaGFzIG5vIGBEQVRFQUREYC4gVGhlIHNwYXduZWQgdGFzayBpcyBgbm90X3N0YXJ0ZWRgLCBzbyBpdCBuZXZlciByZS10cmlnZ2Vyc1xuICogdGhpcyBjb21wbGV0aW9uIGhvb2sgKG5vIHJlY3Vyc2lvbikuXG4gKi9cbmNvbnN0IHRhc2tSZWN1cnJlbmNlOiBIb29rID0ge1xuICBuYW1lOiAndGFza19yZWN1cnJlbmNlJyxcbiAgb2JqZWN0OiAnY3JtX3Rhc2snLFxuICBldmVudHM6IFsnYWZ0ZXJVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDcwMCxcbiAgYXN5bmM6IHRydWUsXG4gIG9uRXJyb3I6ICdsb2cnLFxuICBkZXNjcmlwdGlvbjogJ09uIGNvbXBsZXRpb24gb2YgYSByZWN1cnJpbmcgdGFzaywgc3Bhd24gdGhlIG5leHQgb2NjdXJyZW5jZSAoZGF0ZXMgYWR2YW5jZWQgYnkgcmVjdXJyZW5jZV90eXBlIFx1MDBENyBpbnRlcnZhbCkuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvKipcbiAgICAgKiBBZHZhbmNlIGEgZGF0ZSBieSBgaW50ZXJ2YWxgIHVuaXRzIG9mIHRoZSBnaXZlbiByZWN1cnJlbmNlIHR5cGUuXG4gICAgICpcbiAgICAgKiBEZWNsYXJlZCBJTlNJREUgdGhlIGhhbmRsZXIsIG1hdGNoaW5nIGV2ZXJ5IG90aGVyIGhvb2sgaW4gdGhpcyBkaXJlY3Rvcnk6XG4gICAgICogTDIgaG9vayBib2RpZXMgcnVuIGJvZHktb25seSBpbiB0aGUgUXVpY2tKUyBzYW5kYm94LCB3aGVyZSBtb2R1bGUgc2NvcGVcbiAgICAgKiBpcyBub3QgYXZhaWxhYmxlIChjZi4gb3Bwb3J0dW5pdHkuaG9vay50cyAvIGxlYWQuaG9vay50cykuIFRoaXMgd2FzIHRoZVxuICAgICAqIG9uZSBtb2R1bGUtbGV2ZWwgaGVscGVyIGxlZnQgaW4gdGhlIHRyZWUuXG4gICAgICpcbiAgICAgKiBNb250aCBhbmQgeWVhciBzdGVwcyBDTEFNUCB0byB0aGUgbGFzdCB2YWxpZCBkYXkgb2YgdGhlIHRhcmdldCBtb250aFxuICAgICAqIGluc3RlYWQgb2Ygb3ZlcmZsb3dpbmcuIGBEYXRlLnNldE1vbnRoYCByb2xscyBhIGRheSB0aGF0IGRvZXMgbm90IGV4aXN0XG4gICAgICogZm9yd2FyZCBpbnRvIHRoZSBuZXh0IG1vbnRoIFx1MjAxNCBKYW4gMzEgKyAxIG1vbnRoIGxhbmRlZCBvbiBNYXIgMywgc28gYVxuICAgICAqIG1vbnRoLWVuZCByZWN1cnJpbmcgdGFzayB3YWxrZWQgZnVydGhlciBpbnRvIHRoZSBmb2xsb3dpbmcgbW9udGggb24gZXZlcnlcbiAgICAgKiBvY2N1cnJlbmNlIGFuZCwgZm9yIHRoZSAzMXN0LCBza2lwcGVkIEZlYnJ1YXJ5IGVudGlyZWx5LlxuICAgICAqXG4gICAgICogXHUyNkEwXHVGRTBGIEV2ZXJ5IHJlYWQgYW5kIHdyaXRlIGJlbG93IGlzIG9uIHRoZSBVVEMgY2FsZW5kYXIsIGFuZCB0aGF0IGlzIHRoZVxuICAgICAqIHdob2xlIHBvaW50IG9mIHRoZSBzcGVsbGluZyByYXRoZXIgdGhhbiBhIHN0eWxlIGNob2ljZS4gVGhlIGJhc2UgaXMgdGhlXG4gICAgICogc3RvcmVkIGBkdWVfZGF0ZWAgXHUyMDE0IGEgYmFyZSBgWVlZWS1NTS1ERGAsIHdoaWNoIHRoZSBzcGVjJ3MgZGF0ZS1vbmx5IGZvcm1cbiAgICAgKiBhbmNob3JzIGF0IFVUQyBtaWRuaWdodCBcdTIwMTQgYW5kIHRoZSByZXN1bHQgaXMgcmVuZGVyZWQgd2l0aFxuICAgICAqIGB0b0lTT1N0cmluZygpYC4gQSBsb2NhbCBgZ2V0RGF0ZWAvYHNldERhdGVgL2BzZXRNb250aGAgc3RlcCBpbiBiZXR3ZWVuXG4gICAgICogcmVhZHMgdGhhdCBVVEMgYW5jaG9yIG9uIGEgZGlmZmVyZW50IGNhbGVuZGFyICh3ZXN0IG9mIEdyZWVud2ljaCBpdCBpc1xuICAgICAqIHRoZSBwcmV2aW91cyBldmVuaW5nLCBzbyBgZ2V0RGF0ZSgpYCBvbiBgMjAyNi0wMS0xNWAgYW5zd2VycyAxNCkgYW5kXG4gICAgICogcHJlc2VydmVzIHdhbGwtY2xvY2sgdGltZSBhY3Jvc3MgYSBEU1QgdHJhbnNpdGlvbiwgd2hpY2ggaXMgYSAyMyBoIG9yXG4gICAgICogMjUgaCBkYXkuIEJvdGggZXJyb3JzIHJlbmRlciBhcyBhIGRheSB0aGUgc2VyaWVzIG5ldmVyIHJlY292ZXJzIGZyb206XG4gICAgICogZWFjaCBvY2N1cnJlbmNlIGlzIGNvbXB1dGVkIGZyb20gdGhlIHByZXZpb3VzIG9uZS5cbiAgICAgKlxuICAgICAqIFRoZSBjbGFtcCBwcm9iZSBpcyBidWlsdCB3aXRoIGBEYXRlLlVUQ2AgZm9yIHRoZSBzYW1lIHJlYXNvbiBcdTIwMTQgYVxuICAgICAqIGBuZXcgRGF0ZSh5LCBtLCBkKWAgY29uc3RydWN0b3IgcmVhZHMgaXRzIGFyZ3VtZW50cyBhcyBMT0NBTCBmaWVsZHMsIHNvXG4gICAgICogaXQgd291bGQgYW5zd2VyIHRoZSBsZW5ndGggb2YgdGhlIHdyb25nIG1vbnRoIGF0IGVpdGhlciBlbmQgb2YgdGhlIHllYXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWR2YW5jZURhdGUoZDogRGF0ZSwgdHlwZTogc3RyaW5nLCBpbnRlcnZhbDogbnVtYmVyKTogRGF0ZSB7XG4gICAgICBjb25zdCBuZXh0ID0gbmV3IERhdGUoZCk7XG4gICAgICBpZiAodHlwZSA9PT0gJ2RhaWx5Jykge1xuICAgICAgICBuZXh0LnNldFVUQ0RhdGUobmV4dC5nZXRVVENEYXRlKCkgKyBpbnRlcnZhbCk7XG4gICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09ICd3ZWVrbHknKSB7XG4gICAgICAgIG5leHQuc2V0VVRDRGF0ZShuZXh0LmdldFVUQ0RhdGUoKSArIDcgKiBpbnRlcnZhbCk7XG4gICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgfVxuICAgICAgY29uc3QgbW9udGhzID0gdHlwZSA9PT0gJ21vbnRobHknID8gaW50ZXJ2YWwgOiB0eXBlID09PSAneWVhcmx5JyA/IDEyICogaW50ZXJ2YWwgOiAwO1xuICAgICAgaWYgKG1vbnRocyA9PT0gMCkgcmV0dXJuIG5leHQ7XG5cbiAgICAgIGNvbnN0IGRheSA9IG5leHQuZ2V0VVRDRGF0ZSgpO1xuICAgICAgLy8gTW92ZSB0byB0aGUgMXN0IGZpcnN0IHNvIHRoZSBtb250aCBhcml0aG1ldGljIGNhbiBuZXZlciBvdmVyZmxvdywgdGhlblxuICAgICAgLy8gY2xhbXAgdGhlIGRheSB0byB0aGUgdGFyZ2V0IG1vbnRoJ3MgbGVuZ3RoLlxuICAgICAgbmV4dC5zZXRVVENEYXRlKDEpO1xuICAgICAgbmV4dC5zZXRVVENNb250aChuZXh0LmdldFVUQ01vbnRoKCkgKyBtb250aHMpO1xuICAgICAgY29uc3QgbGFzdERheU9mVGFyZ2V0TW9udGggPSBuZXcgRGF0ZShEYXRlLlVUQyhcbiAgICAgICAgbmV4dC5nZXRVVENGdWxsWWVhcigpLCBuZXh0LmdldFVUQ01vbnRoKCkgKyAxLCAwLFxuICAgICAgKSkuZ2V0VVRDRGF0ZSgpO1xuICAgICAgbmV4dC5zZXRVVENEYXRlKE1hdGgubWluKGRheSwgbGFzdERheU9mVGFyZ2V0TW9udGgpKTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH1cblxuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcblxuICAgIC8vIEZpcmUgb25seSBvbiB0aGUgdHJhbnNpdGlvbiBJTlRPIGNvbXBsZXRlZCAobm90IG9uIGxhdGVyIGVkaXRzIG9mIGFuXG4gICAgLy8gYWxyZWFkeS1jb21wbGV0ZWQgdGFzaykuXG4gICAgY29uc3Qgbm93RG9uZSA9IGlucHV0LnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcgfHwgaW5wdXQuaXNfY29tcGxldGVkID09PSB0cnVlO1xuICAgIGNvbnN0IHdhc0RvbmUgPSBwcmV2aW91cz8uc3RhdHVzID09PSAnY29tcGxldGVkJyB8fCBwcmV2aW91cz8uaXNfY29tcGxldGVkID09PSB0cnVlO1xuICAgIGlmICghbm93RG9uZSB8fCB3YXNEb25lKSByZXR1cm47XG5cbiAgICBjb25zdCByOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0geyAuLi4ocHJldmlvdXMgPz8ge30pLCAuLi5pbnB1dCB9O1xuICAgIGlmIChyLmlzX3JlY3VycmluZyAhPT0gdHJ1ZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiByLnJlY3VycmVuY2VfdHlwZSA9PT0gJ3N0cmluZycgPyByLnJlY3VycmVuY2VfdHlwZSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIXR5cGUgfHwgIVsnZGFpbHknLCAnd2Vla2x5JywgJ21vbnRobHknLCAneWVhcmx5J10uaW5jbHVkZXModHlwZSkpIHJldHVybjtcbiAgICBjb25zdCBpbnRlcnZhbCA9IE51bWJlcihyLnJlY3VycmVuY2VfaW50ZXJ2YWwpID4gMCA/IE51bWJlcihyLnJlY3VycmVuY2VfaW50ZXJ2YWwpIDogMTtcblxuICAgIGNvbnN0IGJhc2VEdWUgPSByLmR1ZV9kYXRlID8gbmV3IERhdGUoci5kdWVfZGF0ZSkgOiBuZXcgRGF0ZSgpO1xuICAgIGlmIChpc05hTihiYXNlRHVlLmdldFRpbWUoKSkpIHJldHVybjtcbiAgICBjb25zdCBuZXh0RHVlID0gYWR2YW5jZURhdGUoYmFzZUR1ZSwgdHlwZSwgaW50ZXJ2YWwpO1xuXG4gICAgLy8gU3RvcCB0aGUgc2VyaWVzIG9uY2UgdGhlIG5leHQgb2NjdXJyZW5jZSB3b3VsZCBmYWxsIHBhc3QgdGhlIGVuZCBkYXRlLlxuICAgIGlmIChyLnJlY3VycmVuY2VfZW5kX2RhdGUpIHtcbiAgICAgIGNvbnN0IGVuZCA9IG5ldyBEYXRlKHIucmVjdXJyZW5jZV9lbmRfZGF0ZSk7XG4gICAgICBpZiAoIWlzTmFOKGVuZC5nZXRUaW1lKCkpICYmIG5leHREdWUgPiBlbmQpIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkb2M6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICBzdWJqZWN0OiByLnN1YmplY3QsXG4gICAgICBkZXNjcmlwdGlvbjogci5kZXNjcmlwdGlvbiA/PyBudWxsLFxuICAgICAgcHJpb3JpdHk6IHIucHJpb3JpdHksXG4gICAgICB0eXBlOiByLnR5cGUgPz8gbnVsbCxcbiAgICAgIG93bmVyX2lkOiByLm93bmVyX2lkID8/IG51bGwsXG4gICAgICBzdGF0dXM6ICdub3Rfc3RhcnRlZCcsXG4gICAgICBpc19jb21wbGV0ZWQ6IGZhbHNlLFxuICAgICAgcmVtaW5kZXJfc2VudDogZmFsc2UsXG4gICAgICBkdWVfZGF0ZTogbmV4dER1ZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKSxcbiAgICAgIGlzX3JlY3VycmluZzogdHJ1ZSxcbiAgICAgIHJlY3VycmVuY2VfdHlwZTogdHlwZSxcbiAgICAgIHJlY3VycmVuY2VfaW50ZXJ2YWw6IGludGVydmFsLFxuICAgICAgcmVjdXJyZW5jZV9lbmRfZGF0ZTogci5yZWN1cnJlbmNlX2VuZF9kYXRlID8/IG51bGwsXG4gICAgICByZWxhdGVkX3RvX3R5cGU6IHIucmVsYXRlZF90b190eXBlID8/IG51bGwsXG4gICAgICByZWxhdGVkX3RvX2FjY291bnQ6IHIucmVsYXRlZF90b19hY2NvdW50ID8/IG51bGwsXG4gICAgICByZWxhdGVkX3RvX2NvbnRhY3Q6IHIucmVsYXRlZF90b19jb250YWN0ID8/IG51bGwsXG4gICAgICByZWxhdGVkX3RvX29wcG9ydHVuaXR5OiByLnJlbGF0ZWRfdG9fb3Bwb3J0dW5pdHkgPz8gbnVsbCxcbiAgICAgIHJlbGF0ZWRfdG9fbGVhZDogci5yZWxhdGVkX3RvX2xlYWQgPz8gbnVsbCxcbiAgICAgIHJlbGF0ZWRfdG9fY2FzZTogci5yZWxhdGVkX3RvX2Nhc2UgPz8gbnVsbCxcbiAgICB9O1xuICAgIGlmIChyLnJlbWluZGVyX2RhdGUpIHtcbiAgICAgIGNvbnN0IGJhc2VSZW0gPSBuZXcgRGF0ZShyLnJlbWluZGVyX2RhdGUpO1xuICAgICAgaWYgKCFpc05hTihiYXNlUmVtLmdldFRpbWUoKSkpIGRvYy5yZW1pbmRlcl9kYXRlID0gYWR2YW5jZURhdGUoYmFzZVJlbSwgdHlwZSwgaW50ZXJ2YWwpLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV90YXNrJykuaW5zZXJ0KGRvYyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBCZXN0LWVmZm9ydDsgbmV2ZXIgYnJlYWsgdGhlIHBhcmVudCB3cml0ZS4gTm8gYGNvbnNvbGVgIGluIHRoZSBMMiBob29rXG4gICAgICAvLyBzYW5kYm94IFx1MjAxNCBsb2dnaW5nIGhlcmUgd291bGQgdGhyb3cgaXRzIG93biBSZWZlcmVuY2VFcnJvciAoY2YuICM0NzEpLlxuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogVGhlIGFjdGl2aXR5IGJ1YmJsZSdzIHRhc2sgdHdpbi5cbiAqXG4gKiBgcnVuQXM6ICdzeXN0ZW0nYCAoIzIwMTQsIEFHRU5UUy5tZCBydWxlIDkpIGFuZCB0aGUgb3JnYW5pemF0aW9uIHBpbiAocnVsZVxuICogMTApIGZvciB0aGUgcmVhc29ucyBgZXZlbnRfYWN0aXZpdHlfYnViYmxlYCByZWNvcmRzIFx1MjAxNCByZWFkIHRoYXQgbm90ZS4gVGhlXG4gKiBtZWFzdXJlbWVudCB0aGF0IHB1dCB0aGlzIGNvcHkgb24gdGhlIGNhcmQ6IGEgc2VydmljZSBhZ2VudCBjb21wbGV0aW5nIGFcbiAqIHRhc2sgb24gdGhlaXIgb3duIGNhc2UgbGVmdCB0aGUgY2FzZSBhY2NvdW50J3MgYGxhc3RfYWN0aXZpdHlfZGF0ZWAgZW1wdHksXG4gKiB3aGlsZSBhbiBhZG1pbidzIGlkZW50aWNhbCBjb21wbGV0aW9uIHN0YW1wZWQgaXQgKDE3LjcuMCk7IGEgcmVwJ3NcbiAqIGNvbXBsZXRlZCB0YXNrIG9uIHRoZWlyIG93biBkZWFsIHJlYWNoZWQgbmVpdGhlciB0aGUgYWNjb3VudCBub3IgdGhlXG4gKiBjb250YWN0IGEgbWFuYWdlciBvd25zLlxuICovXG5jb25zdCB0YXNrQnViYmxlOiBIb29rID0ge1xuICBuYW1lOiAndGFza19hY3Rpdml0eV9idWJibGUnLFxuICBvYmplY3Q6ICdjcm1fdGFzaycsXG4gIGV2ZW50czogWydhZnRlclVwZGF0ZSddLFxuICBwcmlvcml0eTogODAwLFxuICBhc3luYzogdHJ1ZSxcbiAgb25FcnJvcjogJ2xvZycsXG4gIHJ1bkFzOiAnc3lzdGVtJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ0EgY29tcGxldGVkIHRhc2sgc3RhbXBzIGludGVyYWN0aW9uIHJlY2VuY3kgb24gdGhlIHJlbGF0ZWQgYWNjb3VudCAod2Fsa2luZyB1cCBmcm9tIGNvbnRhY3Qvb3Bwb3J0dW5pdHkvY2FzZSksIGxlYWQgYW5kIGNvbnRhY3QuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvKlxuICAgICAqIFRoZSBhY3Rpdml0eSBidWJibGUsIHNlY29uZCBjb3B5LiBgc3JjL3NhbGVzL29iamVjdHMvZXZlbnQuaG9vay50c2AgY2FycmllcyB0aGVcbiAgICAgKiBjYW5vbmljYWwgb25lIGFuZCB0aGUgcmF0aW9uYWxlOyB0aGlzIGlzIGEgZGVsaWJlcmF0ZSB2ZXJiYXRpbSBkdXBsaWNhdGUsXG4gICAgICogbm90IGRyaWZ0IFx1MjAxNCBhbiBMMiBob29rIGJvZHkgc2hpcHMgYm9keS1vbmx5IGludG8gdGhlIFF1aWNrSlMgc2FuZGJveCwgc28gYVxuICAgICAqIHNoYXJlZCBtb2R1bGUgaGVscGVyIHJlc29sdmVzIGF0IGF1dGhvcmluZyB0aW1lIGFuZCBhcnJpdmVzIGB1bmRlZmluZWRgIGF0XG4gICAgICogcnVudGltZSAoc2FtZSBjb25zdHJhaW50IGFzIGBfbGluZS1pdGVtLXByaWNlLWZpbGwudHNgIGFuZCB0aGVcbiAgICAgKiBgcHJpb3JpdHlfcmFua2AgdGFibGUgYWJvdmUpLiBgdGVzdC9hY3Rpdml0eS1yZWNlbmN5LnRlc3QudHNgIHJ1bnMgQk9USFxuICAgICAqIGNvcGllcyB0aHJvdWdoIHRoZSBzYW1lIGNhc2VzIHNvIHRoZXkgY2Fubm90IGRpdmVyZ2Ugc2lsZW50bHkuXG4gICAgICpcbiAgICAgKiBcdTI2RDQgVHdvIHByb3BlcnRpZXMgdGhpcyBtdXN0IGtlZXA6XG4gICAgICpcbiAgICAgKiAgIDEuIEl0IGRvZXMgTk9UIGtleSBvZmYgYHJlbGF0ZWRfdG9fdHlwZWAuIFRoYXQgZGlzY3JpbWluYXRvciBpcyBhXG4gICAgICogICAgICBkaXNwbGF5IGhpbnQgYSByZXAgY2FuIGxlYXZlIGJsYW5rLCBhbmQgYSB0YXNrIHdpdGggYSBwZXJmZWN0bHkgZ29vZFxuICAgICAqICAgICAgYHJlbGF0ZWRfdG9fYWNjb3VudGAgdGhlbiBidWJibGVzIHRvIG5vdGhpbmcgYXQgYWxsLlxuICAgICAqICAgMi4gSXQgV0FMS1MgVVAgdG8gdGhlIGFjY291bnQuIEEgcmVwIGNvbXBsZXRlcyBhIHRhc2sgb24gdGhlXG4gICAgICogICAgICBvcHBvcnR1bml0eSwgbm90IG9uIHRoZSBhY2NvdW50IHJvdywgc28gYnViYmxpbmcgb25seSB0byB0aGUgbmFtZWRcbiAgICAgKiAgICAgIHJlY29yZCBsZWF2ZXMgYGNybV9hY2NvdW50Lmxhc3RfYWN0aXZpdHlfZGF0ZWAgdW50b3VjaGVkIHRocm91Z2ggYW5cbiAgICAgKiAgICAgIGVudGlyZSBkZWFsIFx1MjAxNCBhbmQgYGF0X3Jpc2tfYWNjb3VudHNgIHRoZW4gbGlzdHMgYWN0aXZlIGN1c3RvbWVycy5cbiAgICAgKi9cbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXBpKSByZXR1cm47XG5cbiAgICAvLyBSZWNlbmN5IG1lYW5zIHRoZSBpbnRlcmFjdGlvbiBIQVBQRU5FRC4gQW4gb3BlbiB0YXNrIGlzIGEgcHJvbWlzZSwgbm90XG4gICAgLy8gY29udGFjdDsgb25seSB0aGUgY29tcGxldGluZyB0cmFuc2l0aW9uIGJ1YmJsZXMuXG4gICAgY29uc3Qgbm93RG9uZSA9IGlucHV0LnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcgfHwgaW5wdXQuaXNfY29tcGxldGVkID09PSB0cnVlO1xuICAgIGNvbnN0IHdhc0RvbmUgPSBwcmV2aW91cz8uc3RhdHVzID09PSAnY29tcGxldGVkJyB8fCBwcmV2aW91cz8uaXNfY29tcGxldGVkID09PSB0cnVlO1xuICAgIGlmICghbm93RG9uZSB8fCB3YXNEb25lKSByZXR1cm47XG5cbiAgICBjb25zdCByOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0geyAuLi4ocHJldmlvdXMgPz8ge30pLCAuLi5pbnB1dCB9O1xuXG4gICAgY29uc3Qgbm93SXNvID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIC8vIGBjcm1fYWNjb3VudC5sYXN0X2FjdGl2aXR5X2RhdGVgIGlzIGEgREFURSBjb2x1bW47IHRoZSB0d28gY29udGFjdFxuICAgIC8vIHRpbWVzdGFtcHMgYXJlIGRhdGV0aW1lcy5cbiAgICBjb25zdCB0b2RheSA9IG5vd0lzby5zbGljZSgwLCAxMCk7XG5cbiAgICBjb25zdCBpZE9mID0gKGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+XG4gICAgICB0eXBlb2YgcltrZXldID09PSAnc3RyaW5nJyAmJiByW2tleV0ubGVuZ3RoID4gMCA/IChyW2tleV0gYXMgc3RyaW5nKSA6IHVuZGVmaW5lZDtcbiAgICAvLyBUaGUgcnVsZS0xMCBwaW4gXHUyMDE0IHNlZSBgZXZlbnRfYWN0aXZpdHlfYnViYmxlYCdzIG5vdGUuXG4gICAgY29uc3Qgb3JnID0gaWRPZignb3JnYW5pemF0aW9uX2lkJyk7XG4gICAgY29uc3QgaW5Pcmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSBvcmcgPyB7IG9yZ2FuaXphdGlvbl9pZDogb3JnIH0gOiB7fTtcblxuICAgIGNvbnN0IGFjY291bnRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBjb250YWN0SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgbGVhZElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgZGlyZWN0ID0gaWRPZigncmVsYXRlZF90b19hY2NvdW50Jyk7XG4gICAgaWYgKGRpcmVjdCkgYWNjb3VudElkcy5hZGQoZGlyZWN0KTtcbiAgICBjb25zdCBjb250YWN0SWQgPSBpZE9mKCdyZWxhdGVkX3RvX2NvbnRhY3QnKTtcbiAgICBpZiAoY29udGFjdElkKSBjb250YWN0SWRzLmFkZChjb250YWN0SWQpO1xuICAgIGNvbnN0IGxlYWRJZCA9IGlkT2YoJ3JlbGF0ZWRfdG9fbGVhZCcpO1xuICAgIGlmIChsZWFkSWQpIGxlYWRJZHMuYWRkKGxlYWRJZCk7XG5cbiAgICBjb25zdCBwYXJlbnRMb29rdXBzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtcbiAgICAgIFsncmVsYXRlZF90b19jb250YWN0JywgJ2NybV9jb250YWN0J10sXG4gICAgICBbJ3JlbGF0ZWRfdG9fb3Bwb3J0dW5pdHknLCAnY3JtX29wcG9ydHVuaXR5J10sXG4gICAgICBbJ3JlbGF0ZWRfdG9fY2FzZScsICdjcm1fY2FzZSddLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBbZmllbGQsIG9iamVjdF0gb2YgcGFyZW50TG9va3Vwcykge1xuICAgICAgY29uc3QgaWQgPSBpZE9mKGZpZWxkKTtcbiAgICAgIGlmICghaWQpIGNvbnRpbnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmF3OiBhbnkgPSBhd2FpdCBhcGkub2JqZWN0KG9iamVjdCkuZmluZCh7XG4gICAgICAgICAgd2hlcmU6IHsgaWQsIC4uLmluT3JnIH0sXG4gICAgICAgICAgZmllbGRzOiBbJ2NybV9hY2NvdW50J10sXG4gICAgICAgICAgdG9wOiAxLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgcm93cyA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhdyA6IChyYXc/LnJlY29yZHMgPz8gW10pO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSByb3dzLmxlbmd0aCA/IHJvd3NbMF0uY3JtX2FjY291bnQgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgcGFyZW50ID09PSAnc3RyaW5nJyAmJiBwYXJlbnQubGVuZ3RoID4gMCkgYWNjb3VudElkcy5hZGQocGFyZW50KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBCZXN0LWVmZm9ydDogYSBwYXJlbnQgdGhhdCBjYW5ub3QgYmUgcmVhZCBpcyBub3QgYnViYmxlZCB0aHJvdWdoLlxuICAgICAgICAvLyBObyBgY29uc29sZWAgaW4gdGhlIEwyIGhvb2sgc2FuZGJveCAoY2YuICM0NzEpLlxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHM6IEFycmF5PFtzdHJpbmcsIFNldDxzdHJpbmc+LCBSZWNvcmQ8c3RyaW5nLCBhbnk+XT4gPSBbXG4gICAgICBbJ2NybV9hY2NvdW50JywgYWNjb3VudElkcywgeyBsYXN0X2FjdGl2aXR5X2RhdGU6IHRvZGF5IH1dLFxuICAgICAgWydjcm1fY29udGFjdCcsIGNvbnRhY3RJZHMsIHsgbGFzdF9jb250YWN0ZWRfZGF0ZTogbm93SXNvIH1dLFxuICAgICAgWydjcm1fbGVhZCcsIGxlYWRJZHMsIHsgbGFzdF9jb250YWN0ZWRfZGF0ZTogbm93SXNvIH1dLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBbb2JqZWN0LCBpZHMsIGRvY10gb2YgdGFyZ2V0cykge1xuICAgICAgbGV0IGluc2lkZSA9IFsuLi5pZHNdO1xuICAgICAgaWYgKG9yZyAmJiBpbnNpZGUubGVuZ3RoID4gMCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJhdzogYW55ID0gYXdhaXQgYXBpLm9iamVjdChvYmplY3QpLmZpbmQoeyB3aGVyZTogeyBpZDogeyAkaW46IGluc2lkZSB9LCAuLi5pbk9yZyB9LCBmaWVsZHM6IFsnaWQnXSwgdG9wOiBpbnNpZGUubGVuZ3RoIH0pO1xuICAgICAgICAgIGluc2lkZSA9IChBcnJheS5pc0FycmF5KHJhdykgPyByYXcgOiAocmF3Py5yZWNvcmRzID8/IFtdKSkubWFwKChyb3c6IGFueSkgPT4gU3RyaW5nKHJvdy5pZCkpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBpbnNpZGUgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBpZCBvZiBpbnNpZGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhcGkub2JqZWN0KG9iamVjdCkudXBkYXRlKHsgLi4uZG9jLCBpZCB9LCB7IHdoZXJlOiB7IGlkIH0gfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IGFjdGl2aXR5IGJ1YmJsZTsgbmV2ZXIgYnJlYWsgdGhlIHBhcmVudCB3cml0ZS5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogYGRvX25vdF9jYWxsYCBcdTIwMTQgcmVmdXNlIHRvIFNDSEVEVUxFIGEgcGhvbmUgdG91Y2gsIG5ldmVyIHRvIHJlY29yZCBvbmUuXG4gKlxuICogIyBXaHkgdGhpcyBpcyBhIGhvb2sgYW5kIG5vdCBhbiBhY3Rpb24gcHJlZGljYXRlXG4gKlxuICogVGhlIG9idmlvdXMgbWlycm9yIG9mIHRoZSBgZW1haWxfb3B0X291dGAgdHJlYXRtZW50IGlzXG4gKiBgdmlzaWJsZTogUFxcYHJlY29yZC5kb19ub3RfY2FsbCA9PSBmYWxzZVxcYGAgb24gYSBidXR0b24sIHRoZSB3YXlcbiAqIGBzZW5kX2VtYWlsYCBhbmQgYGFkZF9jb250YWN0X3RvX2NhbXBhaWduYCBhcmUgZ2F0ZWQgaW5cbiAqIGBzcmMvc2FsZXMvYWN0aW9ucy9jb250YWN0LmFjdGlvbnMudHNgLiBUaGF0IGlzIGEgUkVOREVSSU5HIGhpbnQsIGFuZCBpdCBpcyB0aGVcbiAqIHdob2xlIG9mIHdoYXQgdGhvc2UgdHdvIGRvOiBpdCBoaWRlcyBhIGJ1dHRvbiBpbiB0aGUgQ29uc29sZSBhbmQgbGVhdmVzIHRoZVxuICogYWN0aW9uIHJlYWNoYWJsZSBvdmVyIFJFU1QsIGZyb20gYW4gQUkgdG9vbCBjYWxsLCBmcm9tIGEgZmxvdywgYW5kIGZyb20gYW5cbiAqIGltcG9ydC4gRm9yIGVtYWlsIHRoYXQgaXMgb25seSBoYWxmIGEgcHJvbWlzZSB0b28gXHUyMDE0IGJ1dCB0aGUgZW1haWwgaGFsZiBpc1xuICogYmFja2VkIGJ5IHJlYWwgZW5mb3JjZW1lbnQgZWxzZXdoZXJlIChgY2FtcGFpZ24tZW5yb2xsbWVudC5mbG93LnRzYCBmaWx0ZXJzXG4gKiBvbiB0aGUgZmxhZywgYGNhbXBhaWduX21lbWJlci5ob29rLnRzYCB3cml0ZXMgaXQpLiBgZG9fbm90X2NhbGxgIGhhZCBubyBzdWNoXG4gKiBiYWNraW5nLCBzbyBhIHByZWRpY2F0ZSBhbG9uZSB3b3VsZCBoYXZlIG1vdmVkIHRoZSBmaWVsZCBmcm9tIFwiZGVjbGFyZWQgYW5kXG4gKiB1bmVuZm9yY2VkXCIgdG8gXCJkZWNsYXJlZCBhbmQgdW5lbmZvcmNlZCB1bmxlc3MgeW91IHVzZSB0aGUgbW91c2VcIi5cbiAqXG4gKiBFbmZvcmNpbmcgb24gdGhlIFdSSVRFIGluc3RlYWQgY292ZXJzIGV2ZXJ5IGVudHJ5IHBvaW50IGF0IG9uY2UgXHUyMDE0IHRoZVxuICogYHNjaGVkdWxlX2ZvbGxvd3VwYCBzY3JlZW4gZmxvdywgYSBoYW5kLWNyZWF0ZWQgdGFzaywgYW4gaW1wb3J0LCBhbiBBSSBhZ2VudFxuICogY2FsbGluZyB0aGUgZGF0YSBBUEkgXHUyMDE0IHdoaWNoIGlzIHRoZSBzYW1lIFwib25lIHdyaXRlciwgbm90IG9uZSBwZXIgZW50cnlcbiAqIHBvaW50XCIgcmVhc29uaW5nIGBzcmMvc2FsZXMvYWN0aW9ucy9hY3Rpdml0eS1hY3Rpb25zLnRzYCBnaXZlcyBmb3Iga2VlcGluZyB0aGVcbiAqIHJlY2VuY3kgYnViYmxlIG9uIGBjcm1fZXZlbnRgJ3MgaG9vayByYXRoZXIgdGhhbiBpbiBlYWNoIGJ1dHRvbidzIGJvZHkuXG4gKlxuICogIyBXaHkgYHR5cGU6ICdjYWxsJ2AgYW5kIG5vdCBcImFueSBmb3J3YXJkLWxvb2tpbmcgb3V0cmVhY2hcIlxuICpcbiAqIGBkb19ub3RfY2FsbGAgaXMgYSBwcm9taXNlIGFib3V0IHRoZSBQSE9ORS4gSXQgaXMgbm90IGBkb19ub3RfY29udGFjdGA6XG4gKiB0aGlzIHBlcnNvbiBtYXkgc3RpbGwgYmUgZW1haWxlZCAodGhhdCBpcyBgZW1haWxfb3B0X291dGAncyBzZXBhcmF0ZSBmbGFnKSxcbiAqIG1ldCwgb3IgZGVtb2VkIHRvLiBSZWZ1c2luZyBhIGBtZWV0aW5nYCB0YXNrIGhlcmUgd291bGQgc2lsZW50bHkgd2lkZW4gYVxuICogZGVjbGFyZWQgZmllbGQgaW50byBhIHByb21pc2UgdGhlIGFwcCBuZXZlciBtYWRlIFx1MjAxNCB0aGUgbWlycm9yIGltYWdlIG9mIHRoZVxuICogZGVmZWN0IHRoaXMgZ3VhcmQgY2xvc2VzLlxuICpcbiAqICMgV2h5IGEgY29tcGxldGVkIHRhc2sgaXMgYWxsb3dlZCB0aHJvdWdoXG4gKlxuICogQSBgY29tcGxldGVkYCBDYWxsIHRhc2sgaXMgYSBSRUNPUkQgb2YgYSBjYWxsIHRoYXQgYWxyZWFkeSBoYXBwZW5lZCwgbm90IGFcbiAqIHBsYW4gdG8gcGxhY2Ugb25lLiBSZWZ1c2luZyBpdCB3b3VsZCBkZWxldGUgdGhlIGV2aWRlbmNlIHJhdGhlciB0aGFuIHByZXZlbnRcbiAqIHRoZSBjYWxsIFx1MjAxNCBhbmQgd291bGQgbWFrZSB0aGUgZmxhZyBhY3RpdmVseSBoYXJtZnVsLCBiZWNhdXNlIHRoZSBob25lc3QgcmVwXG4gKiB3aG8gbG9ncyB0aGUgY2FsbCB0aGV5IHNob3VsZCBub3QgaGF2ZSBtYWRlIGlzIHRoZSBvbmUgd2hvIGdldHMgYmxvY2tlZC4gVGhlXG4gKiBzYW1lIHJlYXNvbmluZyBrZWVwcyB0aGUgYGxvZ19jYWxsYCBhY3Rpb24gcmVhY2hhYmxlIGFuZCB1bmdhdGVkLlxuICovXG5jb25zdCB0YXNrRG9Ob3RDYWxsR3VhcmQ6IEhvb2sgPSB7XG4gIG5hbWU6ICd0YXNrX2RvX25vdF9jYWxsX2d1YXJkJyxcbiAgb2JqZWN0OiAnY3JtX3Rhc2snLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICBwcmlvcml0eTogMTUwLFxuICBkZXNjcmlwdGlvbjogJ1JlZnVzZSB0byBzY2hlZHVsZSBhbiBvcGVuIENhbGwgdGFzayBhZ2FpbnN0IGEgbGVhZC9jb250YWN0IGZsYWdnZWQgRG8gTm90IENhbGwuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvLyBUaGUgcmVmdXNhbCBlbnZlbG9wZSAoIzEwNzUpLiBNaXJyb3JlZCBmcm9tIGAuL19yZWZ1c2FsLnRzYCBiZWNhdXNlIGFcbiAgICAvLyBsb3dlcmVkIGJvZHkgaGFzIG5vIG1vZHVsZSBzY29wZSBhbmQgYGV4dHJhY3RIb29rQm9keWAgVEhST1dTIG9uIGFuXG4gICAgLy8gaW1wb3J0OyBgdGVzdC9yZWZ1c2FsLWVudmVsb3BlLnRlc3QudHNgIHBpbnMgZXZlcnkgY29weSBhZ2FpbnN0IGl0LlxuICAgIGZ1bmN0aW9uIHJlZnVzZShcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvZGU6IHN0cmluZyxcbiAgICAgIHN0YXR1czogbnVtYmVyLFxuICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZyA9IG1lc3NhZ2UsXG4gICAgKTogRXJyb3Ige1xuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpIGFzIEVycm9yICYge1xuICAgICAgICBjb2RlOiBzdHJpbmc7XG4gICAgICAgIHN0YXR1czogbnVtYmVyO1xuICAgICAgICB1c2VyTWVzc2FnZTogc3RyaW5nO1xuICAgICAgfTtcbiAgICAgIGVyci5jb2RlID0gY29kZTtcbiAgICAgIGVyci5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICBlcnIudXNlck1lc3NhZ2UgPSB1c2VyTWVzc2FnZTtcbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcblxuICAgIC8vIFRoZSB2YWx1ZSB0aGUgcm93IHdpbGwgSEFWRSBhZnRlciB0aGlzIHdyaXRlLCBub3QgdGhlIHZhbHVlIHRoZSB3cml0ZVxuICAgIC8vIGhhcHBlbnMgdG8gbWVudGlvbjogZmxpcHBpbmcgYHR5cGVgIHRvIGBjYWxsYCBvbiBhbiBleGlzdGluZyB0YXNrIGFuZFxuICAgIC8vIHJlLXBhcmVudGluZyBhbiBleGlzdGluZyBDYWxsIHRhc2sgYXJlIGJvdGggd2F5cyBpbiwgYW5kIGVhY2ggb25seVxuICAgIC8vIHN1cHBsaWVzIG9uZSBvZiB0aGUgdHdvIGtleXMuXG4gICAgY29uc3QgZWZmZWN0aXZlID0gKGtleTogc3RyaW5nKTogdW5rbm93biA9PlxuICAgICAgaW5wdXRba2V5XSAhPT0gdW5kZWZpbmVkICYmIGlucHV0W2tleV0gIT09IG51bGwgPyBpbnB1dFtrZXldIDogcHJldmlvdXM/LltrZXldO1xuXG4gICAgaWYgKGVmZmVjdGl2ZSgndHlwZScpICE9PSAnY2FsbCcpIHJldHVybjtcbiAgICBpZiAoZWZmZWN0aXZlKCdzdGF0dXMnKSA9PT0gJ2NvbXBsZXRlZCcpIHJldHVybjtcblxuICAgIGNvbnN0IGxlYWRJZCA9IGVmZmVjdGl2ZSgncmVsYXRlZF90b19sZWFkJyk7XG4gICAgY29uc3QgY29udGFjdElkID0gZWZmZWN0aXZlKCdyZWxhdGVkX3RvX2NvbnRhY3QnKTtcblxuICAgIC8vIEJvdGggYnJhbmNoZXMgcnVuIHJhdGhlciB0aGFuIGFuIGlmL2Vsc2U6IGByZWxhdGVkX3RvX3JlcXVpcmVkYCBvbiB0aGVcbiAgICAvLyBvYmplY3QgZ3VhcmFudGVlcyBhdCBsZWFzdCBvbmUgcGFyZW50LCBhbmQgYSByb3cgdGhhdCBzb21laG93IGNhcnJpZXNcbiAgICAvLyBib3RoIG11c3QgYmUgY2hlY2tlZCBhZ2FpbnN0IGJvdGggcGVvcGxlLCBub3QgYWdhaW5zdCB3aGljaGV2ZXIgdGhlXG4gICAgLy8gYXV0aG9yIGxpc3RlZCBmaXJzdC5cbiAgICBjb25zdCB0YXJnZXRzOiBBcnJheTx7IG9iamVjdDogc3RyaW5nOyBpZDogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+ID0gW107XG4gICAgaWYgKHR5cGVvZiBsZWFkSWQgPT09ICdzdHJpbmcnICYmIGxlYWRJZCkge1xuICAgICAgdGFyZ2V0cy5wdXNoKHsgb2JqZWN0OiAnY3JtX2xlYWQnLCBpZDogbGVhZElkLCBsYWJlbDogJ2xlYWQnIH0pO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbnRhY3RJZCA9PT0gJ3N0cmluZycgJiYgY29udGFjdElkKSB7XG4gICAgICB0YXJnZXRzLnB1c2goeyBvYmplY3Q6ICdjcm1fY29udGFjdCcsIGlkOiBjb250YWN0SWQsIGxhYmVsOiAnY29udGFjdCcgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB0IG9mIHRhcmdldHMpIHtcbiAgICAgIC8vIGBmaW5kKC4uLiB0b3A6IDEpYCByYXRoZXIgdGhhbiBgZmluZE9uZWAsIG1hdGNoaW5nXG4gICAgICAvLyBgZXZlbnRfYWN0aXZpdHlfYnViYmxlYCBpbiBgc3JjL3NhbGVzL29iamVjdHMvZXZlbnQuaG9vay50c2AgYW5kIHRoZSBzaGFwZVxuICAgICAgLy8gdGhlIHJlc3Qgb2YgdGhlIGFwcCdzIGhvb2tzIHJlYWQgd2l0aC4gVGhlIHJlc3VsdCBpcyBub3JtYWxpc2VkIGZvclxuICAgICAgLy8gYm90aCBkcml2ZXIgc2hhcGVzIChiYXJlIGFycmF5IC8gYHsgcmVjb3JkcyB9YCkuXG4gICAgICBjb25zdCByYXc6IGFueSA9IGF3YWl0IGFwaS5vYmplY3QodC5vYmplY3QpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBpZDogdC5pZCB9LFxuICAgICAgICBmaWVsZHM6IFsnaWQnLCAnZG9fbm90X2NhbGwnXSxcbiAgICAgICAgdG9wOiAxLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByb3dzID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3IDogKHJhdz8ucmVjb3JkcyA/PyBbXSk7XG4gICAgICBjb25zdCBwZXJzb24gPSByb3dzWzBdO1xuICAgICAgLy8gYD09PSB0cnVlYCBvbiBwdXJwb3NlOiBhbiBhYnNlbnQga2V5LCBgbnVsbGAsIGFuZCBgZmFsc2VgIGFyZSBhbGwgXCJub3RcbiAgICAgIC8vIGZsYWdnZWRcIi4gQSBkcml2ZXIgdGhhdCBzdG9yZXMgb25seSB3cml0dGVuIGNvbHVtbnMgaGFuZHMgYmFjayB0aGUga2V5XG4gICAgICAvLyBBQlNFTlQgKHNlZSBBR0VOVFMubWQgb24gcHJlZGljYXRlIHRvdGFsaXR5KSwgYW5kIHRyZWF0aW5nIHRoYXQgYXNcbiAgICAgIC8vIHRydXRoeSB3b3VsZCBibG9jayBldmVyeSBvcmRpbmFyeSBjYWxsIHRhc2sgaW4gdGhlIGFwcC5cbiAgICAgIGlmIChwZXJzb24/LmRvX25vdF9jYWxsID09PSB0cnVlKSB7XG4gICAgICAgIHRocm93IHJlZnVzZShcbiAgICAgICAgICBgVGhpcyAke3QubGFiZWx9IGlzIGZsYWdnZWQgRG8gTm90IENhbGwsIHNvIGEgQ2FsbCB0YXNrIGNhbm5vdCBiZSBzY2hlZHVsZWQgYWdhaW5zdCB0aGVtLiBgICtcbiAgICAgICAgICAgICdMb2cgYSBjb21wbGV0ZWQgY2FsbCBpZiBvbmUgYWxyZWFkeSBoYXBwZW5lZCwgY2hvb3NlIGEgbm9uLXBob25lIGFjdGl2aXR5IHR5cGUsICcgK1xuICAgICAgICAgICAgJ29yIGNsZWFyIERvIE5vdCBDYWxsIG9uIHRoZSByZWNvcmQgZmlyc3QuJyxcbiAgICAgICAgICAnRk9SQklEREVOJyxcbiAgICAgICAgICA0MDMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgW3Rhc2tWYWxpZGF0aW9uLCB0YXNrRG9Ob3RDYWxsR3VhcmQsIHRhc2tSZWN1cnJlbmNlLCB0YXNrQnViYmxlXTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9jb250cmFjdC5ob29rLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHMvY29udHJhY3QuaG9vay50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBIb29rLCBIb29rQ29udGV4dCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHR5cGUgeyBIb29rQXBpIH0gZnJvbSAnLi4vLi4vc2FsZXMvb2JqZWN0cy9faG9vay1hcGknO1xuXG4vKipcbiAqIENvbnRyYWN0IGxpZmVjeWNsZSBob29rLlxuICpcbiAqIC0gVmFsaWRhdGVzIGBlbmRfZGF0ZWAgXHUyMjQ4IGBzdGFydF9kYXRlICsgY29udHJhY3RfdGVybV9tb250aHNgLlxuICogLSBSZWplY3RzIHNocmlua2luZyBgZW5kX2RhdGVgIGFmdGVyIGFjdGl2YXRpb24uXG4gKiAtIE9uIGBhY3RpdmF0ZWRgOiBzdGFtcHMgYHNpZ25lZF9kYXRlYCAoaWYgbWlzc2luZykgYW5kIHByb21vdGVzIHRoZSBhY2NvdW50XG4gKiAgIHRvIGBjdXN0b21lcmAuIFJlbmV3YWwgcmVtaW5kZXJzIGFyZSBvd25lZCBieSB0aGUgYGNvbnRyYWN0X3JlbmV3YWxgIGZsb3cuXG4gKi9cblxuLy8gTkI6IGhlbHBlcnMgdXNlZCBieSBoYW5kbGVycyBhcmUgZGVjbGFyZWQgSU5TSURFIGVhY2ggaGFuZGxlciBcdTIwMTQgTDIgaG9va1xuLy8gYm9kaWVzIHJ1biBib2R5LW9ubHkgaW4gdGhlIFF1aWNrSlMgc2FuZGJveCwgc28gbW9kdWxlIHNjb3BlIGlzIG5vdFxuLy8gYXZhaWxhYmxlIGF0IHJ1bnRpbWUgKGNmLiBvcHBvcnR1bml0eS5ob29rLnRzKS4gTW9kdWxlLWxldmVsIGNvcGllcyB3ZXJlXG4vLyBkZWFkIGNvZGUgdGhhdCBpbnZpdGVkIHNpbGVudCBkaXZlcmdlbmNlLlxuXG5jb25zdCBjb250cmFjdFZhbGlkYXRpb246IEhvb2sgPSB7XG4gIG5hbWU6ICdjb250cmFjdF92YWxpZGF0aW9uJyxcbiAgb2JqZWN0OiAnY3JtX2NvbnRyYWN0JyxcbiAgZXZlbnRzOiBbJ2JlZm9yZUluc2VydCcsICdiZWZvcmVVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDIwMCxcbiAgZGVzY3JpcHRpb246ICdFbmZvcmNlIGNvbnRyYWN0IHRlcm0gbWF0aCBhbmQgcHJldmVudCBzaHJpbmtpbmcgZW5kX2RhdGUgb25jZSBhY3RpdmF0ZWQuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvLyBUaGUgcmVmdXNhbCBlbnZlbG9wZSAoIzEwNzUpLiBNaXJyb3JlZCBmcm9tIGBzcmMvc2FsZXMvb2JqZWN0cy9fcmVmdXNhbC50c2AgYmVjYXVzZSBhXG4gICAgLy8gbG93ZXJlZCBib2R5IGhhcyBubyBtb2R1bGUgc2NvcGUgYW5kIGBleHRyYWN0SG9va0JvZHlgIFRIUk9XUyBvbiBhblxuICAgIC8vIGltcG9ydDsgYHRlc3QvcmVmdXNhbC1lbnZlbG9wZS50ZXN0LnRzYCBwaW5zIGV2ZXJ5IGNvcHkgYWdhaW5zdCBpdC5cbiAgICBmdW5jdGlvbiByZWZ1c2UoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb2RlOiBzdHJpbmcsXG4gICAgICBzdGF0dXM6IG51bWJlcixcbiAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmcgPSBtZXNzYWdlLFxuICAgICk6IEVycm9yIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29kZTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZztcbiAgICAgIH07XG4gICAgICBlcnIuY29kZSA9IGNvZGU7XG4gICAgICBlcnIuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgZXJyLnVzZXJNZXNzYWdlID0gdXNlck1lc3NhZ2U7XG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjb25zdCB7IGV2ZW50LCBpbnB1dCwgcHJldmlvdXMgfSA9IGN0eDtcblxuICAgIC8vIEJvdGggb3BlcmFuZHMgYXJlIHN0b3JlZCBgWVlZWS1NTS1ERGAgdmFsdWVzLCB3aGljaCB0aGUgZGF0ZS1vbmx5IHBhcnNlXG4gICAgLy8gYW5jaG9ycyBhdCBVVEMgTUlETklHSFQgXHUyMDE0IHNvIHRoZXkgYXJlIHJlYWQgaGVyZSBvbiB0aGUgY2FsZW5kYXIgdGhleSB3ZXJlXG4gICAgLy8gd3JpdHRlbiBvbi4gVGhlIGxvY2FsIGFjY2Vzc29ycyBhcmUgb25lIGRheSBlYXJsaWVyIHdlc3Qgb2YgR3JlZW53aWNoXG4gICAgLy8gKGBuZXcgRGF0ZSgnMjAyNi0wMS0wMScpLmdldERhdGUoKWAgYW5zd2VycyAzMSBpbiBgQW1lcmljYS9OZXdfWW9ya2AsIDEgaW5cbiAgICAvLyBgRXVyb3BlL0JlcmxpbmApLCBhbmQgdGhpcyBjb3VudCBmZWVkcyBhIGhhcmQgcmVmdXNhbCB0aGF0IHRoZSArLy0xIG1vbnRoXG4gICAgLy8gdG9sZXJhbmNlIGRvZXMgbm90IGFic29yYiBhdCB0aGUgYm91bmRhcnk6IGEgbGVnYWwgY29udHJhY3Qgc3Bhbm5pbmdcbiAgICAvLyBgdGVybSArIDFgIG1vbnRocyBtZWFzdXJlZCBgdGVybSArIDJgIGFuZCB0aGUgc2F2ZSB3YXMgcmVqZWN0ZWQsIHF1b3RpbmcgYVxuICAgIC8vIG1vbnRoIGNvdW50IGl0cyBvd24gZGF0ZXMgZG8gbm90IGhhdmUuXG4gICAgZnVuY3Rpb24gbW9udGhzQmV0d2VlbihzdGFydElTTzogc3RyaW5nLCBlbmRJU086IHN0cmluZyk6IG51bWJlciB7XG4gICAgICBjb25zdCBzID0gbmV3IERhdGUoc3RhcnRJU08pO1xuICAgICAgY29uc3QgZSA9IG5ldyBEYXRlKGVuZElTTyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoZS5nZXRVVENGdWxsWWVhcigpIC0gcy5nZXRVVENGdWxsWWVhcigpKSAqIDEyICtcbiAgICAgICAgKGUuZ2V0VVRDTW9udGgoKSAtIHMuZ2V0VVRDTW9udGgoKSkgK1xuICAgICAgICAvLyBVbmNoYW5nZWQgaW50ZW50OiBoYXMgdGhlIGVuZCBkYXktb2YtbW9udGggcmVhY2hlZCB0aGUgc3RhcnQncyB5ZXQ/XG4gICAgICAgIC8vIElmIG5vdCwgdGhlIGxhc3QgbW9udGggaXMgbm90IGNvbXBsZXRlIGFuZCBkb2VzIG5vdCBjb3VudC5cbiAgICAgICAgKGUuZ2V0VVRDRGF0ZSgpID49IHMuZ2V0VVRDRGF0ZSgpID8gMCA6IC0xKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcGF0Y2gncyB2YWx1ZSwgZWxzZSB0aGUgc3RvcmVkIG9uZTsgYW4gZW1wdHkgc3RyaW5nIG9yIGEgMCAvIE5hTlxuICAgIC8vIHRlcm0gY291bnRzIGFzIGFic2VudCwgc28gdGhlIGNoZWNrIGJlbG93IHN0YW5kcyBkb3duLlxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IFtpbnB1dC5zdGFydF9kYXRlLCBwcmV2aW91cz8uc3RhcnRfZGF0ZV0uZmluZCgodik6IHYgaXMgc3RyaW5nID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2ICE9PSAnJyk7XG4gICAgY29uc3QgZW5kRGF0ZSA9IFtpbnB1dC5lbmRfZGF0ZSwgcHJldmlvdXM/LmVuZF9kYXRlXS5maW5kKCh2KTogdiBpcyBzdHJpbmcgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYgIT09ICcnKTtcbiAgICBjb25zdCB0ZXJtID0gW2lucHV0LmNvbnRyYWN0X3Rlcm1fbW9udGhzLCBwcmV2aW91cz8uY29udHJhY3RfdGVybV9tb250aHNdLmZpbmQoKHYpOiB2IGlzIG51bWJlciA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicgJiYgISF2KTtcblxuICAgIGlmIChzdGFydERhdGUgJiYgZW5kRGF0ZSAmJiB0ZXJtKSB7XG4gICAgICBjb25zdCBjYWxjID0gbW9udGhzQmV0d2VlbihzdGFydERhdGUsIGVuZERhdGUpO1xuICAgICAgaWYgKE1hdGguYWJzKGNhbGMgLSB0ZXJtKSA+IDEpIHtcbiAgICAgICAgdGhyb3cgcmVmdXNlKFxuICAgICAgICAgIGBDb250cmFjdCB0ZXJtICgke3Rlcm19IG1vbnRocykgZG9lcyBub3QgbWF0Y2ggZGF0ZSByYW5nZSAoJHtjYWxjfSBtb250aHMgZnJvbSAke3N0YXJ0RGF0ZX0gdG8gJHtlbmREYXRlfSkuYCxcbiAgICAgICAgICAnVkFMSURBVElPTl9GQUlMRUQnLFxuICAgICAgICAgIDQwMCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIHByZXZpb3VzPy5zdGF0dXMgPT09ICdhY3RpdmF0ZWQnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBpbnB1dC5lbmRfZGF0ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdHlwZW9mIHByZXZpb3VzLmVuZF9kYXRlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICBpbnB1dC5lbmRfZGF0ZSA8IHByZXZpb3VzLmVuZF9kYXRlXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgcmVmdXNlKFxuICAgICAgICAgIGBDYW5ub3Qgc2hyaW5rIGVuZF9kYXRlICgke3ByZXZpb3VzLmVuZF9kYXRlIGFzIHN0cmluZ30gXHUyMTkyICR7aW5wdXQuZW5kX2RhdGV9KSBhZnRlciBhY3RpdmF0aW9uLiBVc2UgYSB0ZXJtaW5hdGlvbi9hbWVuZG1lbnQgd29ya2Zsb3cgaW5zdGVhZC5gLFxuICAgICAgICAgICdSRUNPUkRfTE9DS0VEJyxcbiAgICAgICAgICA0MDksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY29udHJhY3RBY3RpdmF0aW9uOiBIb29rID0ge1xuICBuYW1lOiAnY29udHJhY3Rfb25fYWN0aXZhdGlvbicsXG4gIG9iamVjdDogJ2NybV9jb250cmFjdCcsXG4gIGV2ZW50czogWydhZnRlclVwZGF0ZSddLFxuICBwcmlvcml0eTogODAwLFxuICBhc3luYzogdHJ1ZSxcbiAgb25FcnJvcjogJ2xvZycsXG4gIGRlc2NyaXB0aW9uOiAnT24gYWN0aXZhdGlvbjogc3RhbXAgc2lnbmVkX2RhdGUsIHByb21vdGUgYWNjb3VudC4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXQsIHByZXZpb3VzIH0gPSBjdHg7XG4gICAgaWYgKGlucHV0LnN0YXR1cyAhPT0gJ2FjdGl2YXRlZCcgfHwgcHJldmlvdXM/LnN0YXR1cyA9PT0gJ2FjdGl2YXRlZCcpIHJldHVybjtcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcblxuICAgIGNvbnN0IGlkID0gW2lucHV0LmlkLCBwcmV2aW91cz8uaWRdLmZpbmQoKHYpOiB2IGlzIHN0cmluZyA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdiAhPT0gJycpO1xuICAgIGNvbnN0IGFjY291bnRJZCA9IFtpbnB1dC5jcm1fYWNjb3VudCwgcHJldmlvdXM/LmNybV9hY2NvdW50XS5maW5kKCh2KTogdiBpcyBzdHJpbmcgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYgIT09ICcnKTtcblxuICAgIGlmIChpZCAmJiAhaW5wdXQuc2lnbmVkX2RhdGUgJiYgIXByZXZpb3VzPy5zaWduZWRfZGF0ZSkge1xuICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX2NvbnRyYWN0JykudXBkYXRlKFxuICAgICAgICB7IGlkLCBzaWduZWRfZGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKSB9LFxuICAgICAgICB7IHdoZXJlOiB7IGlkIH0gfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGFjY291bnRJZCkge1xuICAgICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9hY2NvdW50JykuZmluZE9uZSh7IHdoZXJlOiB7IGlkOiBhY2NvdW50SWQgfSB9KTtcbiAgICAgIGlmIChhY2NvdW50ICYmIGFjY291bnQudHlwZSAhPT0gJ2N1c3RvbWVyJykge1xuICAgICAgICBhd2FpdCBhcGkub2JqZWN0KCdjcm1fYWNjb3VudCcpLnVwZGF0ZShcbiAgICAgICAgICB7IGlkOiBhY2NvdW50SWQsIHR5cGU6ICdjdXN0b21lcicgfSxcbiAgICAgICAgICB7IHdoZXJlOiB7IGlkOiBhY2NvdW50SWQgfSB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vIHJlbmV3YWwgdGFzayBoZXJlOiByZW5ld2FsIHJlbWluZGVycyBhcmUgb3duZWQgYnkgdGhlXG4gICAgLy8gYGNvbnRyYWN0X3JlbmV3YWxgIHNjaGVkdWxlZCBmbG93LCB3aGljaCBob25vdXJzIHRoZSBwZXItY29udHJhY3RcbiAgICAvLyBgcmVuZXdhbF9ub3RpY2VfZGF5c2AuIFRoZSBhY3RpdmF0aW9uLXRpbWUgdGFzayB0aGlzIGhvb2sgdXNlZCB0b1xuICAgIC8vIGNyZWF0ZSBoYXJkY29kZWQgYSA2MC1kYXkgbm90aWNlIGFuZCBkdXBsaWNhdGVkIHRoZSBmbG93J3MgdGFzay5cbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFtjb250cmFjdFZhbGlkYXRpb24sIGNvbnRyYWN0QWN0aXZhdGlvbl07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHMvX2xpbmUtaXRlbS1wcmljZS1maWxsLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHMvX2xpbmUtaXRlbS1wcmljZS1maWxsLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tDb250ZXh0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEhvb2tBcGkgfSBmcm9tICcuLi8uLi9zYWxlcy9vYmplY3RzL19ob29rLWFwaSc7XG5cbi8qKlxuICogU2hhcmVkIGxpbmUtaXRlbSBwcmljZSBmaWxsLlxuICpcbiAqIGBsaXN0X3ByaWNlYCBvbiBib3RoIGxpbmUtaXRlbSBvYmplY3RzIGlzIGRvY3VtZW50ZWQgYXMgXCJhdXRvLXBvcHVsYXRlZCBmcm9tXG4gKiBwcm9kdWN0Lmxpc3RfcHJpY2VcIiwgYW5kIG5vdGhpbmcgaW1wbGVtZW50ZWQgaXQgdW50aWwgdGhpcyBob29rLiBPbiB3cml0ZSxcbiAqIHdoZW4gYSBwcm9kdWN0IGlzIHBhcnQgb2YgVEhJUyBjaGFuZ2UsIGl0IHN0YW1wcyB0aGUgY2F0YWxvZyBgbGlzdF9wcmljZWA7XG4gKiBvbiBJTlNFUlQgaXQgYWxzbyBkZWZhdWx0cyB0aGUgbmVnb3RpYXRlZCBgdW5pdF9wcmljZWAgdG8gdGhlIGxpc3QgcHJpY2Ugd2hlblxuICogdGhlIHJlcCBsZWZ0IGl0IGJsYW5rICh0aGV5IGNhbiBzdGlsbCBvdmVycmlkZSkuIE9uIHVwZGF0ZSB0aGUgbmVnb3RpYXRlZFxuICogYHVuaXRfcHJpY2VgIGlzIGxlZnQgYWxvbmUsIHNvIGEgcmUtc3luY2VkIGNhdGFsb2cgcHJpY2UgbmV2ZXIgY2xvYmJlcnMgYVxuICogcHJpY2Ugc29tZW9uZSBhY3R1YWxseSBuZWdvdGlhdGVkLlxuICpcbiAqIFdoeSBpdCBsaXZlcyBoZXJlIHJhdGhlciB0aGFuIHR3aWNlOiBgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbWAgYW5kXG4gKiBgY3JtX3F1b3RlX2xpbmVfaXRlbWAgY2FycmllZCBuZWFyLXZlcmJhdGltIGNvcGllcyBvZiB0aGlzIGhhbmRsZXIgdGhhdFxuICogZGlmZmVyZWQgb25seSBpbiBjb21tZW50cyBcdTIwMTQgdGhlIHNoYXBlIHRoYXQgbGV0cyBhIGZpeCBsYW5kIG9uIG9uZSBvYmplY3QgYW5kXG4gKiBzaWxlbnRseSBza2lwIHRoZSBvdGhlci4gT25seSB0aGUgcHJpY2UgZmlsbCBpcyBzaGFyZWQ7IHRoZSB0d28gUk9MTFVQIGhvb2tzXG4gKiBuZXh0IGRvb3IgbG9vayBhbGlrZSBidXQgY29tcHV0ZSBnZW51aW5lbHkgZGlmZmVyZW50IHRvdGFscywgc28gdGhleSBzdGF5XG4gKiBzZXBhcmF0ZS5cbiAqXG4gKiBTYW5kYm94IG5vdGU6IEwyIGhvb2sgYm9kaWVzIHJ1biBCT0RZLU9OTFkgaW4gdGhlIFF1aWNrSlMgc2FuZGJveCwgc28gYVxuICogaGFuZGxlciBjYW5ub3QgcmVhY2ggbW9kdWxlIHNjb3BlIGF0IHJ1bnRpbWUuIFRoaXMgZmFjdG9yeSBpcyBzdGlsbCBzYWZlXG4gKiBiZWNhdXNlIHRoZSBzaGFyaW5nIGhhcHBlbnMgYXQgYXV0aG9yaW5nIHRpbWUgXHUyMDE0IGBvYmplY3ROYW1lYC9gaG9va05hbWVgIGFyZVxuICogcGxhaW4gbWV0YWRhdGEgb24gdGhlIHJldHVybmVkIEhvb2ssIGFuZCB0aGUgaGFuZGxlciBib2R5IGJlbG93IGNsb3NlcyBvdmVyXG4gKiBOT1RISU5HIGJ1dCBpdHMgb3duIGBjdHhgLiBOZXZlciBtb3ZlIGEgdmFsdWUgdGhlIGJvZHkgcmVhZHMgaW50byB0aGlzXG4gKiBmYWN0b3J5J3MgcGFyYW1ldGVyczsgaXQgd291bGQgcmVzb2x2ZSBoZXJlIGFuZCBiZSB1bmRlZmluZWQgaW4gdGhlIHNhbmRib3guXG4gKlxuICogVGhhdCBydWxlIGlzIGVuZm9yY2VkLCBub3QganVzdCBkb2N1bWVudGVkOiBgdGVzdC9hY3Rpb24tc2FuZGJveC50ZXN0LnRzYFxuICogbG93ZXJzIHRoaXMgaGFuZGxlciB3aXRoIHRoZSBDTEkgYnVpbGQncyBvd24gZXh0cmFjdGlvbiBwYXNzICh3aGljaCByZWplY3RzIGFcbiAqIGJvZHkgcmVmZXJlbmNpbmcgYW55dGhpbmcgb3V0IG9mIHNjb3BlKSBhbmQgcnVucyB0aGUgcmVzdWx0IHVuZGVyIHRoZSByZWFsXG4gKiBRdWlja0pTIHJ1bm5lciwgd2l0aCBhIG5lZ2F0aXZlIGNvbnRyb2wgdGhhdCBzaG93cyB0aGUgZ3VhcmQgc3RpbGwgYml0ZXMuXG4gKiBXb3J0aCBrbm93aW5nIHdoeSBhIHRlc3QgaGFzIHRvOiB3aGVuIGV4dHJhY3Rpb24gZmFpbHMgdGhlIGJ1aWxkIGRvZXMgbm90LFxuICogaXQgc2lsZW50bHkga2VlcHMgdGhlIGhhbmRsZXIgaW4gaXRzIGJ1bmRsZWQgZm9ybSBhbmQgdGhlIGhvb2sgc3RvcHMgYmVpbmdcbiAqIGRlcGxveWFibGUgYXMgcHVyZSBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxpbmVJdGVtUHJpY2VGaWxsKG9iamVjdE5hbWU6IHN0cmluZywgaG9va05hbWU6IHN0cmluZyk6IEhvb2sge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGhvb2tOYW1lLFxuICAgIG9iamVjdDogb2JqZWN0TmFtZSxcbiAgICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICAgIHByaW9yaXR5OiAxMDAsXG4gICAgZGVzY3JpcHRpb246ICdEZWZhdWx0IGxpc3RfcHJpY2UgLyB1bml0X3ByaWNlIGZyb20gdGhlIGNob3NlbiBwcm9kdWN0LicsXG4gICAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHsgZXZlbnQsIGlucHV0IH0gPSBjdHg7XG4gICAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWFwaSkgcmV0dXJuO1xuICAgICAgLy8gT25seSBhY3Qgd2hlbiBhIHByb2R1Y3QgcmVmZXJlbmNlIGlzIHBhcnQgb2YgVEhJUyB3cml0ZS5cbiAgICAgIGNvbnN0IHByb2R1Y3RJZCA9IHR5cGVvZiBpbnB1dC5jcm1fcHJvZHVjdCA9PT0gJ3N0cmluZycgPyBpbnB1dC5jcm1fcHJvZHVjdCA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICghcHJvZHVjdElkKSByZXR1cm47XG4gICAgICBjb25zdCBwcm9kdWN0ID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX3Byb2R1Y3QnKS5maW5kT25lKHtcbiAgICAgICAgd2hlcmU6IHsgaWQ6IHByb2R1Y3RJZCB9LCBmaWVsZHM6IFsnaWQnLCAnbGlzdF9wcmljZSddLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsaXN0UHJpY2UgPSBwcm9kdWN0ICYmIHR5cGVvZiBwcm9kdWN0Lmxpc3RfcHJpY2UgPT09ICdudW1iZXInID8gcHJvZHVjdC5saXN0X3ByaWNlIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGxpc3RQcmljZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAvLyBDYXRhbG9nIHJlZmVyZW5jZSBhbHdheXMgdHJhY2tzIHRoZSBwcm9kdWN0LlxuICAgICAgaW5wdXQubGlzdF9wcmljZSA9IGxpc3RQcmljZTtcbiAgICAgIC8vIE5lZ290aWF0ZWQgcHJpY2UgZGVmYXVsdHMgdG8gbGlzdCBvbiBjcmVhdGUgd2hlbiBsZWZ0IGJsYW5rOyBuZXZlclxuICAgICAgLy8gb3ZlcndyaXR0ZW4gb24gdXBkYXRlIChyZXNwZWN0IGEgcmVwJ3MgbmVnb3RpYXRlZCBmaWd1cmUpLlxuICAgICAgaWYgKGV2ZW50ID09PSAnYmVmb3JlSW5zZXJ0JyAmJiBpbnB1dC51bml0X3ByaWNlID09IG51bGwpIHtcbiAgICAgICAgaW5wdXQudW5pdF9wcmljZSA9IGxpc3RQcmljZTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFNoYXJlZCBsaW5lLW51bWJlciBhc3NpZ25lciAoIzE4MjgpIFx1MjAxNCBgbGluZV9udW1iZXJgIGlzIGByZWFkb25seWAsIHNvIHRoaXMgaXNcbiAqIGl0cyBvbmUgd3JpdGVyLiBJbnNlcnQ6IGBtYXggdW5kZXIgdGhlIHBhcmVudCArIDFgLiBVcGRhdGUgb2YgYSByb3cgdGhhdCBzdGlsbFxuICogaGFzIG5vbmUgKGNyZWF0ZWQgYmVmb3JlIHRoaXMgaG9vayBcdTIwMTQgYHNjcmlwdHMvYmFja2ZpbGwtbGluZS1udW1iZXIudHNgIHRvdWNoZXNcbiAqIGVhY2ggb25jZSk6IHNhbWUgc3RhbXAuIEFuIGV4aXN0aW5nIG9yZGluYWwgaXMgbmV2ZXIgcmVudW1iZXJlZC4gVGhlIGVuZ2luZVxuICoga2VlcHMgYSBwYXlsb2FkIGtleSBhIGhvb2sgd3JvdGUgdGhyb3VnaCBpdHMgcmVhZG9ubHkgc3RyaXAsIHNvIGEgdXNlciB3cml0ZVxuICogbGFuZHMgdGhlIHN0YW1wIGFuZCBhIHVzZXItc3VwcGxpZWQgdmFsdWUgaXMgb3ZlcndyaXR0ZW47IG9ubHkgYSBuby11c2VyXG4gKiBzeXN0ZW0gd3JpdGUgdGhhdCBzdXBwbGllcyBvbmUgKHRoZSBzZWVkLCBhbmQgaXRzIHJlcGxheSkga2VlcHMgaXRzIG93bi4gYHJ1bkFzOiAnc3lzdGVtJ2BcbiAqIGVsZXZhdGVzIHRoZSBzaWJsaW5nIHJlYWQgYW5kIG5vdGhpbmcgZWxzZS4gQm9keS1vbmx5IHJ1bGUgYXMgYWJvdmU6IHRoZVxuICogcGFyZW50IGtleSBjb21lcyBmcm9tIGBjdHgub2JqZWN0YCwgbmV2ZXIgYSBmYWN0b3J5IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxpbmVJdGVtTnVtYmVyaW5nKG9iamVjdE5hbWU6IHN0cmluZywgaG9va05hbWU6IHN0cmluZyk6IEhvb2sge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGhvb2tOYW1lLFxuICAgIG9iamVjdDogb2JqZWN0TmFtZSxcbiAgICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICAgIHByaW9yaXR5OiAxMTAsXG4gICAgcnVuQXM6ICdzeXN0ZW0nLFxuICAgIGRlc2NyaXB0aW9uOiAnQXNzaWduIGxpbmVfbnVtYmVyID0gKG1heCB1bmRlciB0aGUgcGFyZW50KSArIDEuJyxcbiAgICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgeyBldmVudCwgaW5wdXQgfSA9IGN0eDtcbiAgICAgIGNvbnN0IHByZXYgPSBjdHgucHJldmlvdXM7XG4gICAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWFwaSkgcmV0dXJuO1xuICAgICAgaWYgKCFjdHgudXNlcj8uaWQgJiYgdHlwZW9mIGlucHV0LmxpbmVfbnVtYmVyID09PSAnbnVtYmVyJykgcmV0dXJuO1xuICAgICAgLy8gRDM6IGEgcHJlZGljYXRlIHVwZGF0ZSBoYXMgT05FIHBheWxvYWQgZm9yIGV2ZXJ5IHJvdyAoZm9yZWNhc3QuaG9vay50cykuXG4gICAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIChjdHguZGlzcGF0Y2g/Lm1vZGUgPT09ICdwZXItcm93JyB8fCB0eXBlb2YgcHJldj8ubGluZV9udW1iZXIgPT09ICdudW1iZXInKSkgcmV0dXJuO1xuICAgICAgY29uc3QgcGFyZW50S2V5ID0gY3R4Lm9iamVjdCA9PT0gJ2NybV9xdW90ZV9saW5lX2l0ZW0nID8gJ2NybV9xdW90ZScgOiAnY3JtX29wcG9ydHVuaXR5JztcbiAgICAgIGNvbnN0IHBhcmVudElkID0gaW5wdXRbcGFyZW50S2V5XSA/PyBwcmV2Py5bcGFyZW50S2V5XTtcbiAgICAgIGlmICh0eXBlb2YgcGFyZW50SWQgIT09ICdzdHJpbmcnIHx8ICFwYXJlbnRJZCkgcmV0dXJuO1xuICAgICAgY29uc3Qgc2libGluZ3MgPSBhd2FpdCBhcGkub2JqZWN0KGN0eC5vYmplY3QpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBbcGFyZW50S2V5XTogcGFyZW50SWQgfSwgZmllbGRzOiBbJ2xpbmVfbnVtYmVyJ10sIHRvcDogNTAwMCxcbiAgICAgIH0pO1xuICAgICAgbGV0IG1heCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygc2libGluZ3MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzLmxpbmVfbnVtYmVyID09PSAnbnVtYmVyJyAmJiBzLmxpbmVfbnVtYmVyID4gbWF4KSBtYXggPSBzLmxpbmVfbnVtYmVyO1xuICAgICAgfVxuICAgICAgLy8gQSBiYXRjaCBpbnNlcnQgcnVucyBldmVyeSByb3cncyBiZWZvcmVJbnNlcnQgYmVmb3JlIHN0b3JpbmcgYW55IHJvdy5cbiAgICAgIGNvbnN0IG9mZnNldCA9IGV2ZW50ID09PSAnYmVmb3JlSW5zZXJ0JyAmJiBjdHguZGlzcGF0Y2g/Lm1vZGUgPT09ICdwZXItcm93JyA/IGN0eC5kaXNwYXRjaC5pbmRleCA6IDA7XG4gICAgICBpbnB1dC5saW5lX251bWJlciA9IG1heCArIDEgKyBvZmZzZXQ7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9vcHBvcnR1bml0eV9saW5lX2l0ZW0uaG9vay50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL29wcG9ydHVuaXR5X2xpbmVfaXRlbS5ob29rLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tDb250ZXh0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEhvb2tBcGkgfSBmcm9tICcuLi8uLi9zYWxlcy9vYmplY3RzL19ob29rLWFwaSc7XG5pbXBvcnQgeyBjcmVhdGVMaW5lSXRlbU51bWJlcmluZywgY3JlYXRlTGluZUl0ZW1QcmljZUZpbGwgfSBmcm9tICcuL19saW5lLWl0ZW0tcHJpY2UtZmlsbCc7XG5cbi8qKlxuICogT3Bwb3J0dW5pdHkgYW1vdW50IHJvbGx1cC5cbiAqXG4gKiBLZWVwcyBgY3JtX29wcG9ydHVuaXR5LmFtb3VudGAgaW4gc3luYyB3aXRoIHRoZSBzdW0gb2YgaXRzIGxpbmUgaXRlbXMnXG4gKiBleHRlbmRlZCBwcmljZS4gRmlyZXMgYWZ0ZXIgYSBsaW5lIGl0ZW0gaXMgaW5zZXJ0ZWQgLyB1cGRhdGVkIC8gZGVsZXRlZCAodGhlXG4gKiBjb25zb2xlIHN1cmZhY2VzIHRoZXNlIGFzIHRoZSBvcHBvcnR1bml0eSdzIFwiUHJvZHVjdHNcIiByZWxhdGVkIGxpc3QpIGFuZFxuICogcmVjb21wdXRlcyB0aGUgcGFyZW50IG9wcG9ydHVuaXR5J3MgYW1vdW50IGZyb20gdGhlIGN1cnJlbnQgbGluZSBzZXQuXG4gKlxuICogV2h5IHRoaXMgZXhpc3RzOiBgYW1vdW50YCB3YXMgYSBmcmVlLXR5cGVkIGN1cnJlbmN5IGZpZWxkIHdpdGggbm8gbGluayB0b1xuICogYGNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW1gLCBzbyBpdGVtaXNpbmcgYSBkZWFsIGFuZCBpdHMgaGVhZGxpbmUgbnVtYmVyXG4gKiBjb3VsZCBkcmlmdCBhcGFydC4gT25jZSBhIGRlYWwgaXMgaXRlbWlzZWQsIHRoZSBsaW5lIHN1bSBpcyBhdXRob3JpdGF0aXZlLlxuICpcbiAqIERlc2lnbiBkZWNpc2lvbnM6XG4gKiAtIFJlY29tcHV0ZXMgZnJvbSByYXcgYHF1YW50aXR5ICogdW5pdF9wcmljZSAqICgxIC0gZGlzY291bnQvMTAwKWAgcmF0aGVyIHRoYW5cbiAqICAgcmVhZGluZyB0aGUgYHRvdGFsX3ByaWNlYCBGT1JNVUxBIGZpZWxkLCBzbyBpdCBkb2Vzbid0IGRlcGVuZCBvbiBmb3JtdWxhXG4gKiAgIGh5ZHJhdGlvbiBpbnNpZGUgdGhlIHNhbmRib3hlZCBob29rIGJvZHkuXG4gKiAtIElmIHRoZSBvcHBvcnR1bml0eSBoYXMgTk8gbGluZSBpdGVtcyAoZS5nLiB0aGUgbGFzdCBvbmUgd2FzIGp1c3QgZGVsZXRlZCksXG4gKiAgIGBhbW91bnRgIGlzIGxlZnQgdW50b3VjaGVkIFx1MjAxNCB6ZXJvaW5nIGl0IHdvdWxkIHRyaXAgdGhlIGBhbW91bnQgPiAwYFxuICogICB2YWxpZGF0aW9uIGFuZCB3aXBlIHRoZSBtYW51YWxseS1lbnRlcmVkIGZpZ3VyZSBvbiBvcHBvcnR1bml0aWVzIHRoYXQgbmV2ZXJcbiAqICAgdXNlZCBsaW5lIGl0ZW1zIGF0IGFsbC5cbiAqIC0gYGFzeW5jOiB0cnVlYCArIGBvbkVycm9yOiAnbG9nJ2AgXHUyMDE0IHRoZSByb2xsdXAgaXMgYSBkZXJpdmVkIGNvbnZlbmllbmNlOyBhXG4gKiAgIGZhaWx1cmUgbXVzdCBuZXZlciBibG9jayB0aGUgbGluZS1pdGVtIHdyaXRlLiBVcGRhdGluZyB0aGUgcGFyZW50IGRvZXMgbm90XG4gKiAgIHJlLXRyaWdnZXIgdGhpcyBob29rIChkaWZmZXJlbnQgb2JqZWN0KSwgc28gdGhlcmUncyBubyBsb29wLlxuICogLSBPbiByZS1wYXJlbnRpbmcgKHVwZGF0ZSB0aGF0IG1vdmVzIGEgbGluZSB0byBhbm90aGVyIG9wcG9ydHVuaXR5KSwgQk9USCB0aGVcbiAqICAgb2xkIGFuZCBuZXcgcGFyZW50cyBhcmUgcmVjb21wdXRlZC5cbiAqL1xuLyoqXG4gKiBMaW5lLWl0ZW0gcHJpY2UgZmlsbCBcdTIwMTQgb25lIGltcGxlbWVudGF0aW9uIHNoYXJlZCB3aXRoIHRoZSBxdW90ZSBsaW5lIGl0ZW07XG4gKiBzZWUgYF9saW5lLWl0ZW0tcHJpY2UtZmlsbC50c2AgZm9yIHRoZSBiZWhhdmlvdXIgYW5kIHRoZSBzYW5kYm94IGNhdmVhdC5cbiAqL1xuY29uc3Qgb3Bwb3J0dW5pdHlMaW5lSXRlbVByaWNlRmlsbDogSG9vayA9IGNyZWF0ZUxpbmVJdGVtUHJpY2VGaWxsKFxuICAnY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbScsXG4gICdvcHBvcnR1bml0eV9saW5lX2l0ZW1fcHJpY2VfZmlsbCcsXG4pO1xuXG4vKiogYGxpbmVfbnVtYmVyYCBhc3NpZ25lciBcdTIwMTQgc2VlIGBfbGluZS1pdGVtLXByaWNlLWZpbGwudHNgICgjMTgyOCkuICovXG5jb25zdCBvcHBvcnR1bml0eUxpbmVJdGVtTnVtYmVyaW5nOiBIb29rID0gY3JlYXRlTGluZUl0ZW1OdW1iZXJpbmcoXG4gICdjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtJyxcbiAgJ29wcG9ydHVuaXR5X2xpbmVfaXRlbV9saW5lX251bWJlcicsXG4pO1xuXG5jb25zdCBvcHBvcnR1bml0eUFtb3VudFJvbGx1cDogSG9vayA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X2Ftb3VudF9yb2xsdXAnLFxuICBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtJyxcbiAgZXZlbnRzOiBbJ2FmdGVySW5zZXJ0JywgJ2FmdGVyVXBkYXRlJywgJ2FmdGVyRGVsZXRlJ10sXG4gIHByaW9yaXR5OiAzMDAsXG4gIGFzeW5jOiB0cnVlLFxuICBvbkVycm9yOiAnbG9nJyxcbiAgZGVzY3JpcHRpb246ICdSZWNvbXB1dGUgcGFyZW50IG9wcG9ydHVuaXR5LmFtb3VudCBmcm9tIHRoZSBzdW0gb2YgaXRzIGxpbmUgaXRlbXMuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcbiAgICBjb25zdCB7IGlucHV0LCBwcmV2aW91cyB9ID0gY3R4O1xuICAgIGNvbnN0IG51bSA9ICh2OiB1bmtub3duKTogbnVtYmVyID0+ICh0eXBlb2YgdiA9PT0gJ251bWJlcicgPyB2IDogMCk7XG5cbiAgICAvLyBFdmVyeSBwYXJlbnQgb3Bwb3J0dW5pdHkgdG91Y2hlZCBieSB0aGlzIGNoYW5nZSAob2xkICsgbmV3IGhhbmRsZXMgdGhlXG4gICAgLy8gcmUtcGFyZW50aW5nIGNhc2Ugb24gdXBkYXRlKS5cbiAgICBjb25zdCBvcHBJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHYgb2YgW2lucHV0Py5jcm1fb3Bwb3J0dW5pdHksIHByZXZpb3VzPy5jcm1fb3Bwb3J0dW5pdHldKSB7XG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYpIG9wcElkcy5hZGQodik7XG4gICAgfVxuICAgIGlmIChvcHBJZHMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBvcHBJZCBvZiBvcHBJZHMpIHtcbiAgICAgIC8vIFNraXAgY2xvc2VkIGRlYWxzLiBUaGUgcm9sbHVwIHJ1bnMgaW4gYSBzeXN0ZW0gY29udGV4dCAobm8gY3R4LnVzZXIpLFxuICAgICAgLy8gd2hpY2ggQllQQVNTRVMgdGhlIG9wcG9ydHVuaXR5IGZyZWV6ZSBndWFyZCBcdTIwMTQgc28gd2l0aG91dCB0aGlzIGNoZWNrLFxuICAgICAgLy8gZWRpdGluZyBhIGxpbmUgaXRlbSB3b3VsZCBzaWxlbnRseSByZXdyaXRlIGEgY2xvc2VkLXdvbiBkZWFsJ3MgcmVjb3JkZWRcbiAgICAgIC8vIGFtb3VudC4gQSBjbG9zZWQgZGVhbCdzIHZhbHVlIGlzIHNldHRsZWQ7IGxlYXZlIGl0LlxuICAgICAgY29uc3Qgb3BwID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykuZmluZE9uZSh7XG4gICAgICAgIHdoZXJlOiB7IGlkOiBvcHBJZCB9LCBmaWVsZHM6IFsnaWQnLCAnc3RhZ2UnXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3RhZ2UgPSBvcHAgJiYgdHlwZW9mIG9wcC5zdGFnZSA9PT0gJ3N0cmluZycgPyBvcHAuc3RhZ2UgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoc3RhZ2UgPT09ICdjbG9zZWRfd29uJyB8fCBzdGFnZSA9PT0gJ2Nsb3NlZF9sb3N0JykgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGxpbmVzID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbScpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fb3Bwb3J0dW5pdHk6IG9wcElkIH0sXG4gICAgICAgIGZpZWxkczogWydxdWFudGl0eScsICd1bml0X3ByaWNlJywgJ2Rpc2NvdW50J10sXG4gICAgICAgIHRvcDogNTAwMCxcbiAgICAgIH0pO1xuICAgICAgLy8gTm8gbGluZXMgbGVmdCBcdTIxOTIgbGVhdmUgdGhlIGV4aXN0aW5nIGFtb3VudCBhcy1pcyAoc2VlIGRlc2lnbiBub3RlKS5cbiAgICAgIGlmICghbGluZXMgfHwgbGluZXMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGwgb2YgbGluZXMpIHN1bSArPSBudW0obC5xdWFudGl0eSkgKiBudW0obC51bml0X3ByaWNlKSAqICgxIC0gbnVtKGwuZGlzY291bnQpIC8gMTAwKTtcbiAgICAgIHN1bSA9IE1hdGgucm91bmQoc3VtICogMTAwKSAvIDEwMDtcbiAgICAgIGlmIChzdW0gPiAwKSB7XG4gICAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV9vcHBvcnR1bml0eScpLnVwZGF0ZShcbiAgICAgICAgICB7IGlkOiBvcHBJZCwgYW1vdW50OiBzdW0gfSxcbiAgICAgICAgICB7IHdoZXJlOiB7IGlkOiBvcHBJZCB9IH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgW29wcG9ydHVuaXR5TGluZUl0ZW1QcmljZUZpbGwsIG9wcG9ydHVuaXR5TGluZUl0ZW1OdW1iZXJpbmcsIG9wcG9ydHVuaXR5QW1vdW50Um9sbHVwXTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9wcm9kdWN0Lmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9wcm9kdWN0Lmhvb2sudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB0eXBlIHsgSG9va0FwaSB9IGZyb20gJy4uLy4uL3NhbGVzL29iamVjdHMvX2hvb2stYXBpJztcblxuLyoqXG4gKiBQcm9kdWN0IGNhdGFsb2cgaG9vay5cbiAqXG4gKiAtIEVuZm9yY2VzIGBsaXN0X3ByaWNlID49IGNvc3RgLlxuICogLSBOb3JtYWxpemVzIGBza3VgIHRvIHVwcGVyY2FzZS5cbiAqIC0gUmVmdXNlcyBkZWxldGUgd2hlbiB0aGUgcHJvZHVjdCBpcyByZWZlcmVuY2VkIGJ5IEFOWSBvcHBvcnR1bml0eSBvciBxdW90ZVxuICogICBsaW5lIGl0ZW0gKGhpc3RvcmljYWwgaW5jbHVkZWQgXHUyMDE0IGRlYWxzIGtlZXAgdGhlaXIgbGluZSBoaXN0b3J5KTsgc3VnZ2VzdHNcbiAqICAgZGVhY3RpdmF0aW5nIChgaXNfYWN0aXZlPWZhbHNlYCkgaW5zdGVhZC5cbiAqL1xuXG5jb25zdCBwcm9kdWN0SG9vazogSG9vayA9IHtcbiAgbmFtZTogJ3Byb2R1Y3RfY2F0YWxvZycsXG4gIG9iamVjdDogJ2NybV9wcm9kdWN0JyxcbiAgZXZlbnRzOiBbJ2JlZm9yZUluc2VydCcsICdiZWZvcmVVcGRhdGUnLCAnYmVmb3JlRGVsZXRlJ10sXG4gIHByaW9yaXR5OiAyMDAsXG4gIGRlc2NyaXB0aW9uOiAnUHJpY2luZyBzYW5pdHksIFNLVSBub3JtYWxpemF0aW9uLCBhbmQgcHJvdGVjdCByZWZlcmVuY2VkIHByb2R1Y3RzIGZyb20gZGVsZXRpb24uJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvLyBUaGUgcmVmdXNhbCBlbnZlbG9wZSAoIzEwNzUpLiBNaXJyb3JlZCBmcm9tIGBzcmMvc2FsZXMvb2JqZWN0cy9fcmVmdXNhbC50c2AgYmVjYXVzZSBhXG4gICAgLy8gbG93ZXJlZCBib2R5IGhhcyBubyBtb2R1bGUgc2NvcGUgYW5kIGBleHRyYWN0SG9va0JvZHlgIFRIUk9XUyBvbiBhblxuICAgIC8vIGltcG9ydDsgYHRlc3QvcmVmdXNhbC1lbnZlbG9wZS50ZXN0LnRzYCBwaW5zIGV2ZXJ5IGNvcHkgYWdhaW5zdCBpdC5cbiAgICBmdW5jdGlvbiByZWZ1c2UoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb2RlOiBzdHJpbmcsXG4gICAgICBzdGF0dXM6IG51bWJlcixcbiAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmcgPSBtZXNzYWdlLFxuICAgICk6IEVycm9yIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29kZTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZztcbiAgICAgIH07XG4gICAgICBlcnIuY29kZSA9IGNvZGU7XG4gICAgICBlcnIuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgZXJyLnVzZXJNZXNzYWdlID0gdXNlck1lc3NhZ2U7XG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjb25zdCB7IGV2ZW50LCBpbnB1dCwgcHJldmlvdXMgfSA9IGN0eDtcblxuICAgIGlmIChldmVudCA9PT0gJ2JlZm9yZUluc2VydCcgfHwgZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnKSB7XG4gICAgICAvLyBUaGUgcGF0Y2gncyB2YWx1ZSwgZWxzZSB0aGUgc3RvcmVkIG9uZSBcdTIwMTQgdGhlIGZpcnN0IHRoYXQgaXMgYSBudW1iZXIuXG4gICAgICBjb25zdCBsaXN0UHJpY2UgPSBbaW5wdXQubGlzdF9wcmljZSwgcHJldmlvdXM/Lmxpc3RfcHJpY2VdLmZpbmQoKHYpOiB2IGlzIG51bWJlciA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicpO1xuICAgICAgY29uc3QgY29zdCA9IFtpbnB1dC5jb3N0LCBwcmV2aW91cz8uY29zdF0uZmluZCgodik6IHYgaXMgbnVtYmVyID0+IHR5cGVvZiB2ID09PSAnbnVtYmVyJyk7XG4gICAgICBpZiAodHlwZW9mIGxpc3RQcmljZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGNvc3QgPT09ICdudW1iZXInICYmIGxpc3RQcmljZSA8IGNvc3QpIHtcbiAgICAgICAgdGhyb3cgcmVmdXNlKFxuICAgICAgICAgIGBMaXN0IFByaWNlICgke2xpc3RQcmljZX0pIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIENvc3QgKCR7Y29zdH0pLmAsXG4gICAgICAgICAgJ1ZBTElEQVRJT05fRkFJTEVEJyxcbiAgICAgICAgICA0MDAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGlucHV0LnNrdSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaW5wdXQuc2t1ID0gaW5wdXQuc2t1LnRvVXBwZXJDYXNlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ID09PSAnYmVmb3JlRGVsZXRlJykge1xuICAgICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaWQgPSBwcmV2aW91cz8uaWQ7XG4gICAgICBpZiAoIWFwaSB8fCAhaWQpIHJldHVybjtcbiAgICAgIGNvbnN0IFtvcHBSZWZzLCBxdW90ZVJlZnNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBhcGkub2JqZWN0KCdjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtJykuY291bnQoeyB3aGVyZTogeyBjcm1fcHJvZHVjdDogaWQgfSB9KS5jYXRjaCgoKSA9PiAwKSxcbiAgICAgICAgYXBpLm9iamVjdCgnY3JtX3F1b3RlX2xpbmVfaXRlbScpLmNvdW50KHsgd2hlcmU6IHsgY3JtX3Byb2R1Y3Q6IGlkIH0gfSkuY2F0Y2goKCkgPT4gMCksXG4gICAgICBdKTtcbiAgICAgIGlmIChvcHBSZWZzICsgcXVvdGVSZWZzID4gMCkge1xuICAgICAgICB0aHJvdyByZWZ1c2UoXG4gICAgICAgICAgYENhbm5vdCBkZWxldGUgcHJvZHVjdDogcmVmZXJlbmNlZCBieSAke29wcFJlZnN9IG9wcG9ydHVuaXR5KGllcykgYW5kICR7cXVvdGVSZWZzfSBxdW90ZShzKS4gU2V0IGlzX2FjdGl2ZT1mYWxzZSB0byByZXRpcmUgaW5zdGVhZC5gLFxuICAgICAgICAgICdERUxFVEVfUkVTVFJJQ1RFRCcsXG4gICAgICAgICAgNDA5LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHByb2R1Y3RIb29rO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL3F1b3RlLmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9xdW90ZS5ob29rLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tDb250ZXh0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEhvb2tBcGkgfSBmcm9tICcuLi8uLi9zYWxlcy9vYmplY3RzL19ob29rLWFwaSc7XG5cbi8qKlxuICogUXVvdGUgd29ya2Zsb3cgaG9vay5cbiAqXG4gKiAtIERlZmF1bHRzIGBleHBpcmF0aW9uX2RhdGVgIHRvIGBxdW90ZV9kYXRlICsgMzAgZGF5c2Agd2hlbiBtaXNzaW5nLlxuICogLSBGcmVlemVzIHF1b3RlcyBvbmNlIGBhY2NlcHRlZGAgb3IgYGV4cGlyZWRgIFx1MjAxNCBhZ2FpbnN0IFVTRVIgZWRpdHMgb25seTogYVxuICogICB3cml0ZSB0aGF0IGlzIHB1cmVseSB0aGUgZW5naW5lIGNsZWFyaW5nIGEgbGluayBpcyBsZXQgdGhyb3VnaC4gVGhlXG4gKiAgIGZyZWV6ZSBjb3ZlcnMgdGhlIHF1b3RlJ3MgTElORSBJVEVNUyB0b28gKCMyMDYwKTogYSB1c2VyIG1heSBuZWl0aGVyIGFkZFxuICogICBhIGxpbmUgdG8gYSBzZXR0bGVkIHF1b3RlIG5vciBjaGFuZ2Ugb25lIG9mIGl0cyBsaW5lcy5cbiAqIC0gUmVmdXNlcyBhIHVzZXIncyBhY2NlcHRhbmNlIHdoaWxlIHRoZSBsaW5rZWQgb3Bwb3J0dW5pdHkgaXMgaGVsZCBieSBhblxuICogICBhcHByb3ZhbCwgYmVjYXVzZSBhY2NlcHRhbmNlIGNsb3NlcyB0aGF0IGRlYWwgYXMgd29uICgjMjAxNCkuXG4gKiAtIE9uIGBhY2NlcHRlZGAsIGRyYWZ0cyBhIGNvbnRyYWN0IFx1MjAxNCBjYXJyeWluZyB0aGUgcXVvdGUncyBuZWdvdGlhdGVkXG4gKiAgIGBwYXltZW50X3Rlcm1zYCBvbnRvIGl0LCBhbmQgZmlsbGluZyB3aGF0IHRoZSBxdW90ZSBjYW5ub3QgZXhwcmVzcyBmcm9tXG4gKiAgIGBEUkFGVF9DT05UUkFDVF9ERUZBVUxUU2AsIGRlY2xhcmVkIHBsYWNlaG9sZGVycyByYXRoZXIgdGhhbiBkZWNpc2lvbnNcbiAqICAgKCMxMTI5KSBcdTIwMTQgYW5kIHB1c2hlcyB0aGUgbGlua2VkIG9wcG9ydHVuaXR5IHRvIGBjbG9zZWRfd29uYC4gVHdvIGhvb2tzLFxuICogICBgcXVvdGVfYWNjZXB0ZWRfY29udHJhY3RfZHJhZnRgIGFuZCBgcXVvdGVfb25fYWNjZXB0ZWRgLCBiZWNhdXNlIG9ubHkgdGhlXG4gKiAgIGRyYWZ0IGlzIGVsZXZhdGVkICgjMjAxNDsgc2VlIGl0cyBub3RlKS5cbiAqL1xuXG4vLyBcdTI2QTBcdUZFMEYgSGVscGVycyB1c2VkIGJ5IGhhbmRsZXJzIGFyZSBkZWNsYXJlZCBJTlNJREUgZWFjaCBoYW5kbGVyIFx1MjAxNCBMMiBob29rIGJvZGllc1xuLy8gcnVuIGJvZHktb25seSBpbiB0aGUgUXVpY2tKUyBzYW5kYm94LCBzbyBtb2R1bGUgc2NvcGUgaXMgbm90IGF2YWlsYWJsZSBhdFxuLy8gcnVudGltZSAoY2YuIG9wcG9ydHVuaXR5Lmhvb2sudHMpLlxuXG5jb25zdCBxdW90ZVZhbGlkYXRpb246IEhvb2sgPSB7XG4gIG5hbWU6ICdxdW90ZV93b3JrZmxvdycsXG4gIC8vIFx1MjZBMFx1RkUwRiBUd28gb2JqZWN0cywgZGVsaWJlcmF0ZWx5ICgjMjA2MCk6IHRoZSBmcmVlemUgYmVsb3cgaXMgT05FIGZyZWV6ZSBcdTIwMTQgdGhlXG4gIC8vIHF1b3RlJ3MgYW5kIGl0cyBsaW5lcycgXHUyMDE0IHNvIGl0IGxpdmVzIGluIG9uZSBwbGFjZSwganVkZ2VkIGJ5IG9uZSB1c2VyL3N5c3RlbVxuICAvLyBib3VuZGFyeSBhbmQgY2FycmllZCBieSBvbmUgZW52ZWxvcGUsIHJhdGhlciB0aGFuIGEgc2Vjb25kIGNvcHkgb2YgYm90aCBvblxuICAvLyB0aGUgbGluZS4gYHRlc3QvcGFja2FnZS1vd25lcnNoaXAudGVzdC50c2AgcmVhZHMgZXZlcnkgbmFtZSBpbiB0aGUgbGlzdC5cbiAgb2JqZWN0OiBbJ2NybV9xdW90ZScsICdjcm1fcXVvdGVfbGluZV9pdGVtJ10sXG4gIGV2ZW50czogWydiZWZvcmVJbnNlcnQnLCAnYmVmb3JlVXBkYXRlJ10sXG4gIHByaW9yaXR5OiAyMDAsXG4gIGRlc2NyaXB0aW9uOiAnRGVmYXVsdCBleHBpcmF0aW9uIGRhdGU7IGZyZWV6ZSBhY2NlcHRlZC9leHBpcmVkIHF1b3RlcyBhbmQgdGhlaXIgbGluZXMuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvLyBUaGUgcmVmdXNhbCBlbnZlbG9wZS4gXHUyNkEwXHVGRTBGIE1pcnJvcmVkIGZyb20gYHNyYy9zYWxlcy9vYmplY3RzL19yZWZ1c2FsLnRzYCBiZWNhdXNlIGEgbG93ZXJlZFxuICAgIC8vIGJvZHkgaGFzIG5vIG1vZHVsZSBzY29wZSBhbmQgYGV4dHJhY3RIb29rQm9keWAgVEhST1dTIG9uIGFuIGltcG9ydDtcbiAgICAvLyBgdGVzdC9yZWZ1c2FsLWVudmVsb3BlLnRlc3QudHNgIHBpbnMgZXZlcnkgY29weSBhZ2FpbnN0IGl0LlxuICAgIGZ1bmN0aW9uIHJlZnVzZShcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvZGU6IHN0cmluZyxcbiAgICAgIHN0YXR1czogbnVtYmVyLFxuICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZyA9IG1lc3NhZ2UsXG4gICAgKTogRXJyb3Ige1xuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpIGFzIEVycm9yICYge1xuICAgICAgICBjb2RlOiBzdHJpbmc7XG4gICAgICAgIHN0YXR1czogbnVtYmVyO1xuICAgICAgICB1c2VyTWVzc2FnZTogc3RyaW5nO1xuICAgICAgfTtcbiAgICAgIGVyci5jb2RlID0gY29kZTtcbiAgICAgIGVyci5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICBlcnIudXNlck1lc3NhZ2UgPSB1c2VyTWVzc2FnZTtcbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGNvbnN0IHsgZXZlbnQsIGlucHV0LCBwcmV2aW91cyB9ID0gY3R4O1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEEgc2V0dGxlZCBxdW90ZSdzIExJTkVTIGFyZSBmcm96ZW4gd2l0aCBpdCAoIzIwNjAgaXRlbSAxLCBCLTA5KSBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIE1lYXN1cmVkIG9uIDE3LjcuMCBiZWZvcmUgdGhpcyBicmFuY2g6IGEgcmVwIGFkZGVkIGEgbGluZSB0byBhbiBhY2NlcHRlZFxuICAgIC8vIHF1b3RlICgyMDApLCBgcXVvdGVfdG90YWxfcm9sbHVwYCByaWdodGx5IGxlZnQgdGhlIHNldHRsZWQgdG90YWxzIGFsb25lLFxuICAgIC8vIGFuZCB0aGUgcXVvdGUncyBsaW5lcyBzdG9wcGVkIHN1bW1pbmcgdG8gdGhlbS4gVGhlIGRvYyBwcm9taXNlcyB0aGVcbiAgICAvLyBvcHBvc2l0ZSAoYGNvbnRlbnQvZG9jcy9zYWxlcy9xdW90ZXMubWR4YCwgXCJ0aGUgcXVvdGUgaXMgZnJvemVuXCIpLlxuICAgIC8vXG4gICAgLy8gVGhlIGZyZWV6ZSdzIG93biBib3VuZGFyeSwgbm90IGEgc2Vjb25kIG9uZTogVVNFUiB3cml0ZXMgb25seSAoYSBzZWVkIG9yXG4gICAgLy8gaW1wb3J0IGNhcnJpZXMgbm8gdXNlciBhbmQgaXMgbGV0IHRocm91Z2gsIGFzIGJlbG93KSwgYW5kIGFuIHVwZGF0ZSBpc1xuICAgIC8vIGp1ZGdlZCBieSB3aGF0IGl0IENIQU5HRVMsIGxpa2UgYHZpb2xhdGluZ2AgYmVsb3cgXHUyMDE0IGBpZGAgYWRkcmVzc2VzIHRoZVxuICAgIC8vIHJvdywgYHVwZGF0ZWRfYXRgIC8gYHVwZGF0ZWRfYnlgIGFyZSB0aGUgZW5naW5lJ3Mgc3RhbXBzIChtZWFzdXJlZCBvbiBldmVyeVxuICAgIC8vIHVzZXIgdXBkYXRlKSwgYW5kIGBsaW5lX251bWJlcmAgaXMgdGhlIHJlYWQtb25seSBwbGF0Zm9ybSBvcmRpbmFsLCB3aGljaFxuICAgIC8vIHRoZSA0LjAuMCBvbmUtdGltZSBiYWNrLWZpbGwgdG91Y2hlcyB3aXRoIGB7IGxpbmVfbnVtYmVyOiBudWxsIH1gIG9uIGV2ZXJ5XG4gICAgLy8gdW5udW1iZXJlZCBsaW5lLCBzZXR0bGVkIHF1b3RlcyBpbmNsdWRlZC4gQm90aCBwYXJlbnRzIGFyZSBqdWRnZWQsIHNvIGFcbiAgICAvLyBsaW5lIG1vdmVzIG5laXRoZXIgb250byBhIHNldHRsZWQgcXVvdGUgbm9yIG9mZiBvbmUuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgREVMRVRFIGlzIG5vdCBndWFyZGVkLCBwZW5kaW5nIGEgZGVjaXNpb24gb24gIzIwNjA6IGRlbGV0aW5nIGEgcXVvdGUsXG4gICAgLy8gb3IgdGhlIGFjY291bnQgaXQgY2FzY2FkZXMgZnJvbSwgZGVsZXRlcyBpdHMgbGluZXMgQVMgVEhFIERFTEVUSU5HIFVTRVJcbiAgICAvLyAobWVhc3VyZWQ6IGVhY2ggbGluZSdzIGBiZWZvcmVEZWxldGVgIHNlZXMgdGhhdCB1c2VyKSwgYW5kIG5vIGRlY2xhcmVkXG4gICAgLy8gaG9vay1jb250ZXh0IGtleSB0ZWxscyB0aGF0IGNhc2NhZGUgZnJvbSBhIGhhbmQgZGVsZXRlIG9mIG9uZSBsaW5lIFx1MjAxNCBzbyBhXG4gICAgLy8gZGVsZXRlIGd1YXJkIHdvdWxkIG1ha2UgZXZlcnkgc2V0dGxlZCBxdW90ZSB3aXRoIGxpbmVzIHVuZGVsZXRhYmxlLlxuICAgIGlmIChjdHgub2JqZWN0ID09PSAnY3JtX3F1b3RlX2xpbmVfaXRlbScpIHtcbiAgICAgIGNvbnN0IGNoYW5nZWQgPSBPYmplY3Qua2V5cyhpbnB1dCkuc29tZSgoaykgPT4gIVsnaWQnLCAndXBkYXRlZF9hdCcsICd1cGRhdGVkX2J5JywgJ2xpbmVfbnVtYmVyJ10uaW5jbHVkZXMoaykgJiYgaW5wdXRba10gIT09IHByZXZpb3VzPy5ba10pO1xuICAgICAgZm9yIChjb25zdCBpZCBvZiBuZXcgU2V0KFtpbnB1dC5jcm1fcXVvdGUsIHByZXZpb3VzPy5jcm1fcXVvdGVdKSkge1xuICAgICAgICBjb25zdCBxID0gY2hhbmdlZCAmJiBjdHgudXNlcj8uaWQgJiYgdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZFxuICAgICAgICAgID8gYXdhaXQgKGN0eC5hcGkgYXMgSG9va0FwaSB8IHVuZGVmaW5lZCk/Lm9iamVjdCgnY3JtX3F1b3RlJykuZmluZE9uZSh7IHdoZXJlOiB7IGlkIH0sIGZpZWxkczogWydxdW90ZV9udW1iZXInLCAnbmFtZScsICdzdGF0dXMnXSB9KVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgaWYgKHE/LnN0YXR1cyA9PT0gJ2FjY2VwdGVkJyB8fCBxPy5zdGF0dXMgPT09ICdleHBpcmVkJykge1xuICAgICAgICAgIHRocm93IHJlZnVzZShgUXVvdGUgJHtTdHJpbmcocS5xdW90ZV9udW1iZXIpfSAtICR7U3RyaW5nKHEubmFtZSl9IGlzICR7cS5zdGF0dXN9LCBzbyBpdHMgbGluZSBpdGVtcyBjYW4gbm8gbG9uZ2VyIGJlIGFkZGVkIG9yIGNoYW5nZWQuYCwgJ1JFQ09SRF9MT0NLRUQnLCA0MDkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIHF1b3RlIGFzIGV2ZXJ5IHF1b3RlIHN1cmZhY2UgdGl0bGVzIGl0LiBgY3JtX3F1b3RlLmRpc3BsYXlfdGl0bGVgIGlzXG4gICAgLy8gYHF1b3RlX251bWJlciAtIG5hbWVgOyBjb21wb3NlIHRoZSBzYW1lIHBhaXIgZnJvbSB0aGUgdHdvIHN0b3JlZCBjb2x1bW5zXG4gICAgLy8gcmF0aGVyIHRoYW4gYXBwZW5kaW5nIHRoZSByZWNvcmQgaWQuIEEgbG93ZXJlZCBob29rIGJvZHkgY2Fubm90IHJlYWQgdGhlXG4gICAgLy8gZm9ybXVsYSBmaWVsZCBpdHNlbGYsIGFuZCBib3RoIG9mIGl0cyBzb3VyY2VzIGFyZSBhbHJlYWR5IG9uIHRoZVxuICAgIC8vIHByZS1pbWFnZSBcdTIwMTQgdGhlIG51bWJlciBpcyBhbiBlbmdpbmUtaXNzdWVkIGF1dG9udW1iZXIsIHNvIGl0IGlzIHJlYWQgZnJvbVxuICAgIC8vIGBwcmV2aW91c2Agb25seS4gQm90aCByZWZ1c2FscyBiZWxvdyBuYW1lIHRoZSBxdW90ZSB3aXRoIGl0LlxuICAgIGZ1bmN0aW9uIHN1YmplY3QoKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gW3ByZXZpb3VzPy5xdW90ZV9udW1iZXIsIHByZXZpb3VzPy5uYW1lXS5tYXAoKHYpID0+ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB2LnRyaW0oKSA6ICcnKSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAtICcpO1xuICAgICAgcmV0dXJuIGxhYmVsID8gYFF1b3RlICR7bGFiZWx9YCA6ICdRdW90ZSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYGlzb2AgKyBgZGF5c2AsIG9uIE9ORSBjYWxlbmRhciBcdTIwMTQgVVRDLCBlbmQgdG8gZW5kLlxuICAgICAqXG4gICAgICogVGhlIGJhc2UgaXMgbm90IGFuIGluc3RhbnQgaGVyZSwgaXQgaXMgYSBzdG9yZWQgREFURTogYSBiYXJlXG4gICAgICogYFlZWVktTU0tRERgIGlzIHBhcnNlZCBieSB0aGUgZGF0ZS1vbmx5IGZvcm0gb2YgdGhlIHNwZWMsIHdoaWNoIGFuY2hvcnNcbiAgICAgKiBpdCBhdCBVVEMgbWlkbmlnaHQgKG1lYXN1cmVkOiBgbmV3IERhdGUoJzIwMjYtMDEtMDEnKWAgaXNcbiAgICAgKiBgMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaYCBpbiBldmVyeSB6b25lKS4gU28gdGhlIGFuY2hvciB3YXMgYWxyZWFkeVxuICAgICAqIFVUQyBhbmQgb25seSB0aGUgYXJpdGhtZXRpYyB3YXMgbm90IFx1MjAxNCBhbmQgcmVhZGluZyBhIFVUQy1taWRuaWdodCBhbmNob3JcbiAgICAgKiBvbiB0aGUgTE9DQUwgY2FsZW5kYXIgaXMgb2ZmIGJ5IGEgd2hvbGUgZGF5IHdlc3Qgb2YgR3JlZW53aWNoLCB3aGVyZVxuICAgICAqIHRoYXQgaW5zdGFudCBpcyB0aGUgcHJldmlvdXMgZXZlbmluZyAoYGdldERhdGUoKWAgb24gdGhlIHZhbHVlIGFib3ZlXG4gICAgICogYW5zd2VycyAzMSwgbm90IDEpLlxuICAgICAqXG4gICAgICogVGhhdCBpcyB3aHkgdGhpcyBzaXRlJ3MgZXhwb3N1cmUgaXMgbm90IHRoZSBvbmUtaG91ciB3aW5kb3cgdGhlXG4gICAgICogXCJhZHZhbmNlIG5vdyBieSBOIGRheXNcIiBob29rcyBoYXZlOiB0aGUgYW5jaG9yIGRvZXMgbm90IG1vdmUgd2l0aCB0aGVcbiAgICAgKiBjbG9jaywgc28gZXZlcnkgcXVvdGUgd2hvc2UgW3F1b3RlX2RhdGUsIHF1b3RlX2RhdGUgKyBkYXlzXSBzcGFuIGNyb3NzZXNcbiAgICAgKiBhIERTVCB0cmFuc2l0aW9uIHRvb2sgYSAyMyBoIGRheSBhbmQgcmVuZGVyZWQgYSBkYXkgc2hvcnQgXHUyMDE0IG1lYXN1cmVkIGF0XG4gICAgICogNjAgb2YgNzMwIGNvbnNlY3V0aXZlIGJhc2UgZGF0ZXMgaW4gYEFtZXJpY2EvTmV3X1lvcmtgLCBgRXVyb3BlL0JlcmxpbmAsXG4gICAgICogYEFtZXJpY2EvU2FudGlhZ29gLCBgQXVzdHJhbGlhL1N5ZG5leWAgYW5kIGBQYWNpZmljL0F1Y2tsYW5kYCBhbGlrZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZGREYXlzKGlzbzogc3RyaW5nLCBkYXlzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGlzbyk7XG4gICAgICBkLnNldFVUQ0RhdGUoZC5nZXRVVENEYXRlKCkgKyBkYXlzKTtcbiAgICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApO1xuICAgIH1cblxuICAgIGlmIChldmVudCA9PT0gJ2JlZm9yZUluc2VydCcgJiYgIWlucHV0LmV4cGlyYXRpb25fZGF0ZSkge1xuICAgICAgY29uc3QgYmFzZSA9IHR5cGVvZiBpbnB1dC5xdW90ZV9kYXRlID09PSAnc3RyaW5nJyA/IGlucHV0LnF1b3RlX2RhdGUgOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApO1xuICAgICAgaW5wdXQuZXhwaXJhdGlvbl9kYXRlID0gYWRkRGF5cyhiYXNlLCAzMCk7XG4gICAgfVxuXG4gICAgLy8gXHUyNkEwXHVGRTBGIEd1YXJkIE9OTFkgZ2VudWluZSBVU0VSIGVkaXRzIChgY3R4LnVzZXI/LmlkYCBwcmVzZW50KS4gU3lzdGVtIC8gc2VlZCAvXG4gICAgLy8gYmFja2ZpbGwgd3JpdGVzIGNhcnJ5IG5vIHVzZXIgYW5kIGxlZ2l0aW1hdGVseSByZS1hcHBseSBidXNpbmVzcyBmaWVsZHNcbiAgICAvLyAodGhlIHNlZWQncyBxdW90ZV9kYXRlL2V4cGlyYXRpb25fZGF0ZSByZS1ldmFsdWF0ZSBvbiBldmVyeSByZWJvb3QpLCBzb1xuICAgIC8vIGd1YXJkaW5nIHRoZW0gdGhyb3dzIGJvb3QtdGltZSBCb2R5UnVubmVyIGVycm9ycy4gTWF0Y2hlcyB0aGUgc3lzdGVtLXdyaXRlXG4gICAgLy8gY29udmVudGlvbiB1c2VkIGFjcm9zcyB0aGUgY2FzZS9sZWFkL29wcG9ydHVuaXR5IGhvb2tzLlxuICAgIGlmIChldmVudCA9PT0gJ2JlZm9yZVVwZGF0ZScgJiYgcHJldmlvdXMgJiYgY3R4LnVzZXI/LmlkKSB7XG4gICAgICBjb25zdCBmcm96ZW4gPSBwcmV2aW91cy5zdGF0dXMgPT09ICdhY2NlcHRlZCcgfHwgcHJldmlvdXMuc3RhdHVzID09PSAnZXhwaXJlZCc7XG4gICAgICBpZiAoZnJvemVuKSB7XG4gICAgICAgIGNvbnN0IGFsbG93ZWQgPSBuZXcgU2V0KFsnaW50ZXJuYWxfbm90ZXMnXSk7XG4gICAgICAgIC8vIEZyYW1ld29yay1tYW5hZ2VkIGNvbHVtbnMgKG93bmVyc2hpcCwgYXVkaXQgdGltZXN0YW1wcykgYXJlIHJlLXN0YW1wZWRcbiAgICAgICAgLy8gYnkgdGhlIDkueCBydW50aW1lIFx1MjAxNCBuZXZlciB0cmVhdCB0aG9zZSBzeXN0ZW0gd3JpdGVzIGFzIGVkaXRzIHRvIGFcbiAgICAgICAgLy8gZnJvemVuIHF1b3RlLCBvbmx5IHVzZXIgY2hhbmdlcyB0byBidXNpbmVzcyBmaWVsZHMuXG4gICAgICAgIGNvbnN0IFNZU1RFTV9GSUVMRFMgPSBuZXcgU2V0KFtcbiAgICAgICAgICAnaWQnLCAnb3duZXJfaWQnLCAnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ2NyZWF0ZWRfYnknLCAndXBkYXRlZF9ieScsICdzcGFjZV9pZCcsICdvcmdhbml6YXRpb25faWQnLCAnb3JnX2lkJywgJ3ZlcnNpb24nLFxuICAgICAgICBdKTtcbiAgICAgICAgLy8gXHUyNkEwXHVGRTBGIGB2aW9sYXRpbmdgIHJhdGhlciB0aGFuIGBjaGFuZ2VkYDogdGhlIHRocmVlIGZyZWV6ZSBndWFyZHMgc2hhcmVcbiAgICAgICAgLy8gb25lIHJlZmVyZW5jZS1jbGVhbnVwIHByZWRpY2F0ZSB2ZXJiYXRpbSwgYW5kIGEgc2hhcmVkIGJsb2NrIGNhbiBvbmx5XG4gICAgICAgIC8vIGJlIHNoYXJlZCBpZiBpdCByZWFkcyB0aGUgc2FtZSB2YXJpYWJsZSBpbiBhbGwgdGhyZWUuXG4gICAgICAgIGNvbnN0IHZpb2xhdGluZyA9IE9iamVjdC5rZXlzKGlucHV0KS5maWx0ZXIoXG4gICAgICAgICAgKGspID0+ICFhbGxvd2VkLmhhcyhrKSAmJiAhU1lTVEVNX0ZJRUxEUy5oYXMoaykgJiYgaW5wdXRba10gIT09IHByZXZpb3VzW2tdLFxuICAgICAgICApO1xuICAgICAgICBpZiAodmlvbGF0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBFdmVyeSBsb29rdXAgb24gYGNybV9xdW90ZWAgYSByZWZlcmVudGlhbCBjbGVhciBjYW4gYXR0YWNrLlxuICAgICAgICAgIGNvbnN0IFJFRkVSRU5DRV9GSUVMRFMgPSBuZXcgU2V0KFsnY3JtX2FjY291bnQnLCAnY3JtX2NvbnRhY3QnLCAnY3JtX29wcG9ydHVuaXR5J10pO1xuICAgICAgICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCB0aGUgcmVmZXJlbmNlLWNsZWFudXAgeWllbGQgXHUyNTAwXHUyNTAwXG4gICAgICAgICAgLy8gIzcyMC4gVGhlIGVuZ2luZSBpbXBsZW1lbnRzIGBkZWxldGVCZWhhdmlvcjogJ3NldF9udWxsJ2AgYnkgVVBEQVRJTkdcbiAgICAgICAgICAvLyB0aGUgcm93IHRoYXQgSE9MRFMgdGhlIGxvb2t1cCwgc28gZGVsZXRpbmcgdGhlIG9wcG9ydHVuaXR5IChvciB0aGVcbiAgICAgICAgICAvLyBjb250YWN0KSBhbiBBQ0NFUFRFRCBxdW90ZSByZWZlcmVuY2VzIGFycml2ZXMgaGVyZSBhcyBhbiBvcmRpbmFyeVxuICAgICAgICAgIC8vIHVzZXIgYGJlZm9yZVVwZGF0ZWAgXHUyMDE0IGFuZCB0aGlzIGZyZWV6ZSByZWZ1c2VkIGl0LCB3aGljaCBtYWRlIGFcbiAgICAgICAgICAvLyBzZXR0bGVkIHF1b3RlIGFibGUgdG8ga2VlcCBhIGRlYWwsIGEgcGVyc29uIGFuZCAodGhyb3VnaCB0aGVcbiAgICAgICAgICAvLyBtYXN0ZXItZGV0YWlsIGNhc2NhZGUpIHRoYXQgcGVyc29uJ3MgYWNjb3VudCB1bmRlbGV0YWJsZSBmb3JldmVyLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gTWVhc3VyZWQgb24gMTcuMS4wIFx1MjAxNCB0aGUgdmVyc2lvbiB0aGlzIHJlcG8gcGlubmVkIEFUIFRIRSBUSU1FIG9mXG4gICAgICAgICAgLy8gdGhlIG1lYXN1cmVtZW50LCBub3QgdGhlIGN1cnJlbnQgcGluICh0aGUgY2FzY2FkZSBzaGFwZSBiZWxvdyBoYXNcbiAgICAgICAgICAvLyBOT1QgYmVlbiByZS1tZWFzdXJlZCBvbiBhbnkgbGF0ZXIgcGluIFx1MjAxNCBub3QgMTcuMy4wLCAjMTY3Niwgbm90XG4gICAgICAgICAgLy8gMTcuNC4wLCBQUiAjMTgxNCwgYW5kIG5vdCAxNy41LjApIFx1MjAxNCB3aXRoIGEgcHJvYmUgaG9vayBhdCBwcmlvcml0eSAxOTkgaW1tZWRpYXRlbHlcbiAgICAgICAgICAvLyBhaGVhZCBvZiBlYWNoIGd1YXJkLCBub3QgYXNzdW1lZC5cbiAgICAgICAgICAvLyBUaGUgZW5naW5lIGJ1aWxkcyBpdHMgY2xlYW51cCB3cml0ZSBvbiB0aGUgQ0FMTEVSJ3Mgb3duIGNvbnRleHRcbiAgICAgICAgICAvLyBwbHVzIHR3byBlbmdpbmUga2V5cywgc28gb24gdGhlIHBhdGggYSBSRVNUIGBERUxFVEVgIHRha2VzLCB0aGVcbiAgICAgICAgICAvLyBjYXNjYWRlIGFuZCBhIHVzZXIncyBoYW5kLWNsZWFyIG9mIHRoZSBzYW1lIGxvb2t1cCBhcmUgaWRlbnRpY2FsXG4gICAgICAgICAgLy8gZXZlcnl3aGVyZSBhIGd1YXJkIGNhbiBsb29rOiBwYXlsb2FkXG4gICAgICAgICAgLy8gYHsgaWQsIDxsaW5rPjogbnVsbCwgdXBkYXRlZF9hdCwgdXBkYXRlZF9ieSB9YCwgYGN0eC51c2VyYCB0aGVcbiAgICAgICAgICAvLyBDQUxMRVIsIGBjdHguc2Vzc2lvbmAgdGhlIGNhbGxlcidzIG93biBgeyB1c2VySWQsIGlzU3lzdGVtIH1gLlxuICAgICAgICAgIC8vIChCb3RoIGB1cGRhdGVkX2J5YCBhbmQgdGhlIGlkZW50aXR5IGRyb3Agb3V0IHRvZ2V0aGVyIHdoZW4gdGhlXG4gICAgICAgICAgLy8gREVMRVRFIGl0c2VsZiBjYXJyaWVkIG5vIGB1c2VySWRgIFx1MjAxNCBhIHJpZyBhcnRlZmFjdCwgbm90IHRoaXMgYXBwJ3NcbiAgICAgICAgICAvLyBwYXRoLikgU28gdGhlIFdSSVRFIFNIQVBFIGlzIG5vdCBhIGRpc2NyaW1pbmF0b3IsIGFuZCB0aGUgeWllbGRcbiAgICAgICAgICAvLyBiZWxvdyBpcyBub3Qgb25lIGVpdGhlcjogaXQgbGV0cyBBTlkgY2FsbGVyIGNsZWFyIGEgZGVjbGFyZWQgbGlua1xuICAgICAgICAgIC8vIG9uIGEgc2V0dGxlZCByZWNvcmQuIFRoYXQgaXMgdGhlIHRyYWRlICM3MjAgYWNjZXB0ZWQsIG5vdCBhIHNpZGVcbiAgICAgICAgICAvLyBlZmZlY3Qgb2YgaXQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBcdTI2QTBcdUZFMEYgQSBtYXJrZXIgRE9FUyByZWFjaCBhIGhvb2sgXHUyMDE0IGFuZCBpcyBkZWxpYmVyYXRlbHkgbm90IHJlYWQuIEFuXG4gICAgICAgICAgLy8gZWFybGllciB2ZXJzaW9uIG9mIHRoaXMgbm90ZSBjb25jbHVkZWQgXCJubyBtYXJrZXIgcmVhY2hlcyBhIGhvb2ssXG4gICAgICAgICAgLy8gYW5kIHRoZSBXUklURSBTSEFQRSBpcyB0aGUgb25seSBldmlkZW5jZSB0aGVyZSBpc1wiOyBpdCByZWFzb25lZFxuICAgICAgICAgIC8vIG9ubHkgYWJvdXQgYGN0eC5zZXNzaW9uYCwgd2hvc2UgYWxsb3ctbGlzdCByZWFsbHkgZG9lcyBvbWl0XG4gICAgICAgICAgLy8gYF9fYC1wcmVmaXhlZCBvcGVyYXRpb24tcHJpdmF0ZSBrZXlzLCBhbmQgbWlzc2VkIHRoZSBvdGhlciByb3V0ZVxuICAgICAgICAgIC8vIGludG8gdGhlIGNvbnRleHQuIGBPYmplY3RRTC5jYXNjYWRlRGVsZXRlUmVsYXRpb25zYCBidWlsZHNcbiAgICAgICAgICAvLyBgeyAuLi5jb250ZXh0LCBfX3JlZmVyZW50aWFsRmllbGRDbGVhcjogdHJ1ZSB9YCwgcmVhZGFibGUgYXRcbiAgICAgICAgICAvLyBgY3R4LmFwaS5leGVjdXRpb25Db250ZXh0Ll9fcmVmZXJlbnRpYWxGaWVsZENsZWFyYDogbWVhc3VyZWQgYHRydWVgXG4gICAgICAgICAgLy8gb24gZXZlcnkgY2FzY2FkZSBpbnRvIGBjcm1fb3Bwb3J0dW5pdHlgLCBgY3JtX3F1b3RlYCBhbmRcbiAgICAgICAgICAvLyBgY3JtX2xlYWRgLCBgdW5kZWZpbmVkYCBvbiBldmVyeSBoYW5kLWNsZWFyICgjMTE2NSwgIzE0MTIpLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gXHUyNkQ0IFRoZSAjMTE2NSBydWxpbmcgKDIwMjYtMDgtMjUpIHJldmlld2VkIHRoYXQgYW5kIHVwaGVsZCBOT1RcbiAgICAgICAgICAvLyByZWFkaW5nIGl0LCBvbiB0d28gZ3JvdW5kcy4gSXQgaXMgYW4gb3BlcmF0aW9uLXByaXZhdGUga2V5IFx1MjAxNCBhblxuICAgICAgICAgIC8vIHVuZGVjbGFyZWQgZGVwZW5kZW5jeSB0aGF0IGNhbiB2YW5pc2ggaW4gYSBwYXRjaCByZWxlYXNlLiBBbmRcbiAgICAgICAgICAvLyByZWFjaGFiaWxpdHkgdGhyb3VnaCB0aGUgU0hJUFBFRCBwYXRoIGlzIHVucHJvdmVuOiBhIGhvb2sgYm9keSBydW5zXG4gICAgICAgICAgLy8gYm9keS1vbmx5IGluIFF1aWNrSlMsIHdoZXJlIGBidWlsZFNhbmRib3hBcGlgIHBhc3NlcyBgZW5naW5lQ3R4LmFwaWBcbiAgICAgICAgICAvLyBvbmx5IHdoZW4gdGhhdCBleHBvc2VzIGBvYmplY3QoKWAsIGFuZCBvdGhlcndpc2UgYSBzaGltIHdpdGggbm9cbiAgICAgICAgICAvLyBgZXhlY3V0aW9uQ29udGV4dGAgYXQgYWxsLiBHcmVlbiBpbiBhIGtlcm5lbCByaWcgYW5kIHNpbGVudGx5IGZhbHNlXG4gICAgICAgICAgLy8gaW4gcHJvZHVjdGlvbiBpcyB0aGUgd29yc3Qgb3V0Y29tZSBhIGd1YXJkIGNhbiBoYXZlLiBUaGUgZGVjbGFyZWRcbiAgICAgICAgICAvLyByZXBsYWNlbWVudCBgY3R4LnJlZmVyZW50aWFsRmllbGRDbGVhcmAgaXMgYXNrZWQgZm9yIHVwc3RyZWFtIGFzXG4gICAgICAgICAgLy8gb2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjMTM2NDQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBcdTI2RDQgS2VlcCB0aGlzIG5hcnJvdyAobWFpbnRhaW5lcidzIHJ1bGluZyBvbiAjNzIwLCBPcHRpb24gQSk6IGEgd3JpdGVcbiAgICAgICAgICAvLyB5aWVsZHMgT05MWSB3aGVuIGV2ZXJ5IG9uZSBvZiBpdHMgbm9uLXN5c3RlbSBjaGFuZ2VzIGlzIGEgREVDTEFSRURcbiAgICAgICAgICAvLyBsaW5rIGdvaW5nIGZyb20gYSB2YWx1ZSB0byBgbnVsbGAuIE9uZSBidXNpbmVzcyBmaWVsZCBhbG9uZ3NpZGUgaXQsXG4gICAgICAgICAgLy8gb3IgYSBsaW5rIHJlcG9pbnRlZCB0byBhIE5FVyB2YWx1ZSwgYW5kIHRoZSByZWZ1c2FsIGJlbG93IHN0aWxsXG4gICAgICAgICAgLy8gZmlyZXMuIFRoZSB0aHJlZSBmcmVlemUgZ3VhcmRzIHNoYXJlIHRoaXMgYmxvY2sgdmVyYmF0aW0gXHUyMDE0IHNoYXJpbmdcbiAgICAgICAgICAvLyBpdCBhcyBhbiBpbXBvcnRlZCBoZWxwZXIgaXMgbm90IHBvc3NpYmxlIChob29rIGJvZGllcyBydW4gYm9keS1vbmx5XG4gICAgICAgICAgLy8gaW4gdGhlIHNhbmRib3ggYW5kIGNhbm5vdCByZWFjaCBtb2R1bGUgc2NvcGUpLCBzb1xuICAgICAgICAgIC8vIGB0ZXN0L2ZyZWV6ZS1ndWFyZC1yZWZlcmVuY2UtY2xlYW51cC50ZXN0LnRzYCBwaW5zIHRoZSB0aHJlZSBjb3BpZXNcbiAgICAgICAgICAvLyBhcyBpZGVudGljYWwgdGV4dCBhbmQgcGlucyBib3RoIGRpcmVjdGlvbnMgb2YgdGhlIG5hcnJvd25lc3MuXG4gICAgICAgICAgY29uc3QgaXNSZWZlcmVuY2VDbGVhbnVwID0gdmlvbGF0aW5nLmV2ZXJ5KFxuICAgICAgICAgICAgKGspID0+IFJFRkVSRU5DRV9GSUVMRFMuaGFzKGspICYmIGlucHV0W2tdID09PSBudWxsICYmIHByZXZpb3VzPy5ba10gIT0gbnVsbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChpc1JlZmVyZW5jZUNsZWFudXApIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IHdoYXQgPSBgJHtzdWJqZWN0KCl9IGlzICR7cHJldmlvdXMuc3RhdHVzIGFzIHN0cmluZ31gO1xuICAgICAgICAgIHRocm93IHJlZnVzZShgJHt3aGF0fTsgb25seSBpbnRlcm5hbF9ub3RlcyBtYXkgYmUgZWRpdGVkLiBBdHRlbXB0ZWQ6ICR7dmlvbGF0aW5nLmpvaW4oJywgJyl9LmAsICdSRUNPUkRfTE9DS0VEJywgNDA5KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQW4gYWNjZXB0YW5jZSB0aGUgbGlua2VkIGRlYWwncyBhcHByb3ZhbCBob2xkcyAoIzIwMTQpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgICAgLy9cbiAgICAgIC8vIEFjY2VwdGluZyBhIHF1b3RlIGNsb3NlcyBpdHMgb3Bwb3J0dW5pdHkgYXMgd29uIChgcXVvdGVfb25fYWNjZXB0ZWRgLFxuICAgICAgLy8gYXMgdGhlIENBTExFUikuIFdoaWxlIGFuIGFwcHJvdmFsIGhvbGRzIHRoYXQgZGVhbCwgdGhhdCBjbG9zZSBpc1xuICAgICAgLy8gcmVmdXNlZCBcdTIwMTQgYW5kIGl0IHVzZWQgdG8gYmUgcmVmdXNlZCBvbmUgd3JpdGUgdG9vIGxhdGU6IHRoZSBhY2NlcHRhbmNlXG4gICAgICAvLyB3YXMgYWRtaXR0ZWQsIHRoZSBjbG9zZS13b24gbWV0IHRoZSByZWZ1c2FsIGluc2lkZSBhbiBgYXN5bmNgIGhvb2ssXG4gICAgICAvLyBgb25FcnJvcjogJ2xvZydgIHN3YWxsb3dlZCBpdCwgYW5kIGFuIGFjY2VwdGVkICh0aGVyZWZvcmUgZnJvemVuKSBxdW90ZVxuICAgICAgLy8gc2F0IG9uIGFuIG9wZW4gZGVhbCBpdCBjb3VsZCBuZXZlciBjbG9zZSBhZ2FpbiAobWVhc3VyZWQgb24gMTcuNy4wOiBhXG4gICAgICAvLyBzYWxlcyByZXAsIGEgZGVhbCBwZW5kaW5nIGl0cyBMYXJnZSBEZWFsIEFwcHJvdmFsKS4gTWFpbnRhaW5lciBydWxpbmdcbiAgICAgIC8vIG9uICMyMDE0IChvcHRpb24gQyk6IHJlZnVzZSB0aGUgQUNDRVBUQU5DRSwgYXQgdGhlIG1vbWVudCBpdCBpcyBtYWRlLFxuICAgICAgLy8gc28gYW4gYXBwcm92YWwgc3RheXMgYW4gYXBwcm92YWwgYW5kIHRoZSByZXAgbGVhcm5zIHdoeS5cbiAgICAgIC8vXG4gICAgICAvLyBcIkhlbGRcIiBpcyBleGFjdGx5IHdoYXQgbWFrZXMgdGhhdCBjbG9zZS13b24gZmFpbCwgbWVhc3VyZWQgcGVyIHN0YXRlXG4gICAgICAvLyBvbiAxNy43LjAgd2l0aCBhIHJlcCdzIGRpcmVjdCBjbG9zZSBcdTIwMTQgbm8gd2lkZXI6XG4gICAgICAvLyAgIFx1MjAyMiBgYXBwcm92YWxfc3RhdHVzYCBgcGVuZGluZ2A6IHRoZSBMYXJnZSBEZWFsIEFwcHJvdmFsJ3MgcmVxdWVzdCBpc1xuICAgICAgLy8gICAgIG9wZW4sIGFuZCBpdHMgYXBwcm92YWwgbm9kZSBsb2NrcyB0aGUgcmVjb3JkIChgbG9ja1JlY29yZDogdHJ1ZWApXG4gICAgICAvLyAgICAgXHUyMTkyIHRoZSBwbGF0Zm9ybSdzIFJFQ09SRF9MT0NLRUQuIFRoZSBjb2x1bW4gaXMgdGhlIG5vZGUncyBvd25cbiAgICAgIC8vICAgICBtaXJyb3Igb2YgdGhlIGxpdmUgcmVxdWVzdCAoYGFwcHJvdmFsU3RhdHVzRmllbGRgKTsgYSByZWNhbGxlZCBvclxuICAgICAgLy8gICAgIGRlY2lkZWQgcmVxdWVzdCBsZWF2ZXMgaXQgYHJlamVjdGVkYCAvIGBhcHByb3ZlZGAsIGFuZCBuZWl0aGVyXG4gICAgICAvLyAgICAgaG9sZHMgdGhlIGRlYWwgKHRoZSBjbG9zZSBnb2VzIHRocm91Z2ggb24gYm90aCk7XG4gICAgICAvLyAgIFx1MjAyMiBgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXNgIGBwZW5kaW5nYCBvciBgcmVqZWN0ZWRgIChSRVEtMDAwNixcbiAgICAgIC8vICAgICBvbmNlIGFuIGluc3RhbGwgYXJtcyBpdCkgXHUyMTkyIGBvcHBvcnR1bml0eV9saWZlY3ljbGVgJ3MgcmVmdXNhbCBvZiBhXG4gICAgICAvLyAgICAgZGlyZWN0IGNsb3NlOyB3aXRoIGEgcmVxdWVzdCBvcGVuIHRoZSBwbGF0Zm9ybSBsb2NrIGhvbGRzIHRvbztcbiAgICAgIC8vICAgXHUyMDIyIGBxdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1c2AgYHBlbmRpbmdgIG9yIGByZWplY3RlZGAgKHRoZSBcdTdBQ0JcdTk4NzlcbiAgICAgIC8vICAgICBnYXRlLCBvbmNlIGFybWVkKSBcdTIxOTIgYG9wcG9ydHVuaXR5X2xpZmVjeWNsZWAncyByZWZ1c2FsIG9mIGFueSBzdGFnZVxuICAgICAgLy8gICAgIG1vdmUuIEl0cyBhcHByb3ZhbCBub2RlIGRvZXMgTk9UIGxvY2sgdGhlIHJlY29yZCAoYGxvY2tSZWNvcmQ6XG4gICAgICAvLyAgICAgZmFsc2VgKTsgdGhlIHJlZnVzYWwgaXMgdGhlIGFwcCdzIGdhdGUsIGFuZCBpdCBpcyBtaXJyb3JlZCBmb3IgdGhhdC5cbiAgICAgIC8vIEEgY2xvc2VkIGRlYWwgaXMgbmV2ZXIgY2xvc2Utd29uIGFnYWluLCBzbyBpdCBob2xkcyBub3RoaW5nIGhlcmUuXG4gICAgICAvL1xuICAgICAgLy8gXHUyNkEwXHVGRTBGIEJPVU5EQVJJRVMsIHJlY29yZGVkIHJhdGhlciB0aGFuIGhpZGRlbi4gUmVhZCBhcyB0aGUgQ0FMTEVSOiBhIGRlYWxcbiAgICAgIC8vIHRoZSBjYWxsZXIgY2Fubm90IHJlYWQgY2Fubm90IGJlIGNsb3NlZCBieSB0aGVtIGVpdGhlciwgZm9yIGEgcmVhc29uXG4gICAgICAvLyB0aGF0IGlzIG5vdCBhbiBhcHByb3ZhbCwgYW5kIHRoYXQgaXMgbm90IHRoaXMgZ2F0ZSdzIHRvIG5hbWUgXHUyMDE0IHNvIGFuXG4gICAgICAvLyB1bnJlYWRhYmxlIGRlYWwsIG9yIGEgcmVhZCB0aGF0IGZhaWxzLCBzdGFuZHMgZG93bi4gVVNFUiB3cml0ZXMgb25seSxcbiAgICAgIC8vIHRoZSBib3VuZGFyeSB0aGUgZnJlZXplIGFib3ZlIGRyYXdzOiBhIHN5c3RlbSB3cml0ZSdzIGNsb3NlLXdvbiBpcyBub3RcbiAgICAgIC8vIGhlbGQgYnkgdGhlIGxvY2sgb3IgYnkgZWl0aGVyIGFwcCBnYXRlIChib3RoIGp1ZGdlIHVzZXJzKSwgc28gcmVmdXNpbmdcbiAgICAgIC8vIGl0cyBhY2NlcHRhbmNlIHdvdWxkIGJlIHdpZGVyIHRoYW4gdGhlIGNvbmRpdGlvbiBpdCBtaXJyb3JzLlxuICAgICAgaWYgKGlucHV0LnN0YXR1cyA9PT0gJ2FjY2VwdGVkJyAmJiBwcmV2aW91cy5zdGF0dXMgIT09ICdhY2NlcHRlZCcpIHtcbiAgICAgICAgY29uc3QgZGVhbElkID0gW2lucHV0LmNybV9vcHBvcnR1bml0eSwgcHJldmlvdXMuY3JtX29wcG9ydHVuaXR5XS5maW5kKCh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdik7XG4gICAgICAgIGNvbnN0IGRlYWwgPSBkZWFsSWRcbiAgICAgICAgICA/IGF3YWl0IChjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQpPy5vYmplY3QoJ2NybV9vcHBvcnR1bml0eScpLmZpbmRPbmUoe1xuICAgICAgICAgICAgd2hlcmU6IHsgaWQ6IGRlYWxJZCB9LFxuICAgICAgICAgICAgZmllbGRzOiBbJ3N0YWdlJywgJ2FwcHJvdmFsX3N0YXR1cycsICdzdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1cycsICdxdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1cyddLFxuICAgICAgICAgIH0pLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgICAvLyBFYWNoIGhvbGQgaXMgbmFtZWQgYnkgdGhlIGZpZWxkIGxhYmVsIGFuZCB2YWx1ZSB0aGUgcmVwIHNlZXMgb24gdGhlXG4gICAgICAgIC8vIGRlYWwgaXRzZWxmLCBzbyB0aGUgc2VudGVuY2UgcG9pbnRzIGF0IHdoZXJlIHRvIGxvb2suIEEgYHJlamVjdGVkYFxuICAgICAgICAvLyBMYXJnZSBEZWFsIEFwcHJvdmFsIGhvbGRzIG5vdGhpbmcgKG1lYXN1cmVkOiB0aGUgY2xvc2UgZ29lcyB0aHJvdWdoKS5cbiAgICAgICAgY29uc3QgaGVsZCA9IGRlYWwgJiYgIVN0cmluZyhkZWFsLnN0YWdlKS5zdGFydHNXaXRoKCdjbG9zZWRfJylcbiAgICAgICAgICA/IFtbJ2FwcHJvdmFsX3N0YXR1cycsICdBcHByb3ZhbCBTdGF0dXMnXSwgWydzdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1cycsICdTdGF0dXMgQ2hhbmdlIEFwcHJvdmFsJ10sIFsncXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXMnLCAnUXVhbGlmaWNhdGlvbiBBcHByb3ZhbCddXVxuICAgICAgICAgICAgLmZpbHRlcigoW2ZdKSA9PiBkZWFsW2ZdID09PSAncGVuZGluZycgfHwgKGRlYWxbZl0gPT09ICdyZWplY3RlZCcgJiYgZiAhPT0gJ2FwcHJvdmFsX3N0YXR1cycpKVxuICAgICAgICAgICAgLm1hcCgoW2YsIGxhYmVsXSkgPT4gYCR7bGFiZWx9IGlzICR7ZGVhbFtmXSA9PT0gJ3BlbmRpbmcnID8gJ1BlbmRpbmcnIDogJ1JlamVjdGVkJ31gKVxuICAgICAgICAgIDogW107XG4gICAgICAgIC8vIFRoZSBxdW90ZSBoYXMgZXhhY3RseSBvbmUgb3Bwb3J0dW5pdHksIHNvIFwiaXRzIG9wcG9ydHVuaXR5XCIgbmFtZXMgdGhlXG4gICAgICAgIC8vIGRlYWwgdW5hbWJpZ3VvdXNseSBcdTIwMTQgYW5kIFx1MjZENCBuZXZlciBieSBpdHMgcmVjb3JkIGlkLlxuICAgICAgICBpZiAoaGVsZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3Qgd2hhdCA9IGAke3N1YmplY3QoKX0gY2Fubm90IGJlIGFjY2VwdGVkIHdoaWxlIGl0cyBvcHBvcnR1bml0eSBpcyBoZWxkIGJ5IGFuIGFwcHJvdmFsYDtcbiAgICAgICAgICB0aHJvdyByZWZ1c2UoYCR7d2hhdH0gKCR7aGVsZC5qb2luKCc7ICcpfSk6IGFjY2VwdGluZyBpdCB3b3VsZCBjbG9zZSB0aGF0IGRlYWwgYXMgd29uLiBBY2NlcHQgaXQgb25jZSB0aGUgYXBwcm92YWwgaXMgZ3JhbnRlZC5gLCAnUkVDT1JEX0xPQ0tFRCcsIDQwOSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG4vKipcbiAqIE9uIGFjY2VwdGFuY2U6IGRyYWZ0IHRoZSBjb250cmFjdC5cbiAqXG4gKiAjIyBgcnVuQXM6ICdzeXN0ZW0nYCwgYW5kIHdoeSB0aGUgY2xvc2Utd29uIGlzIGEgc2VwYXJhdGUgaG9vayAoIzIwMTQpXG4gKlxuICogQSBzYWxlcyByZXAgaG9sZHMgYGNybV9jb250cmFjdC5hbGxvd0NyZWF0ZTogZmFsc2VgLCBhbmQgYSByZXAgYWNjZXB0aW5nIHRoZVxuICogcXVvdGUgb24gdGhlaXIgb3duIGRlYWwgaXMgdGhlIG9yZGluYXJ5IENQUSBwYXRoIFx1MjAxNCBzbyBhcyB0aGUgY2FsbGVyIHRoZVxuICogZHJhZnQgd2FzIHJlZnVzZWQgKFwiWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb25cIiksIGBvbkVycm9yOiAnbG9nJ2Agc3dhbGxvd2VkXG4gKiBpdCwgYW5kIHRoZSBkZWFsIHdlbnQgYGNsb3NlZF93b25gIHdpdGggbm8gY29udHJhY3QgKG1lYXN1cmVkIG9uIDE3LjcuMCkuXG4gKiBUaGUgZHJhZnQgaXMgdGhlIGJ1c2luZXNzJ3MgcGFwZXJ3b3JrIGZvciBhIHNhbGUgdGhlIHJlcCBpcyBlbnRpdGxlZCB0b1xuICogcmVjb3JkLCBub3QgdGhlIHJlcCBhdXRob3JpbmcgYSBjb250cmFjdCwgc28gdGhpcyBob29rIGVsZXZhdGVzIChBR0VOVFMubWRcbiAqIHJ1bGUgOSk7IHRoZSByZXAgc3RpbGwgY2Fubm90IGNyZWF0ZSBhIGNvbnRyYWN0IGJ5IGhhbmQuIEVsZXZhdGlvbiBpcyBub3RcbiAqIGFub255bWl0eTogdGhlIGNvbnRyYWN0J3MgYGNyZWF0ZWRfYnlgIG5hbWVzIHRoZSBwZXJzb24gd2hvIGFjY2VwdGVkLlxuICpcbiAqIEVsZXZhdGluZyBhcyBsaXR0bGUgYXMgcG9zc2libGUgaXMgd2h5IHRoZSBjbG9zZS13b24gaXMgTk9UIGhlcmUuIGBydW5Bc2AgaXNcbiAqIHBlciBob29rLCBhbmQgYSBzeXN0ZW0gd3JpdGUgaXMgbm90IGhlbGQgYnkgYW4gYXBwcm92YWwncyByZWNvcmQgbG9jazpcbiAqIGVsZXZhdGVkLCBhbiBhY2NlcHRlZCBxdW90ZSB3b3VsZCBjbG9zZSBhIGRlYWwgaXRzIG1hbmFnZXIgaGFzIG5vdCBhcHByb3ZlZC5cbiAqIGBxdW90ZV9vbl9hY2NlcHRlZGAga2VlcHMgdGhhdCB3cml0ZSB0aGUgY2FsbGVyJ3MuIFRoZSB0d28gd2VyZSBhbHJlYWR5XG4gKiBpbmRlcGVuZGVudCBsZWdzICgjNzE0KSBcdTIwMTQgYSBjb250cmFjdCB0aGF0IHdpbGwgbm90IGRyYWZ0IG11c3Qgbm90IGRlY2lkZVxuICogd2hldGhlciB0aGUgZGVhbCBpcyB3b24gXHUyMDE0IGFuZCB0d28gaG9va3MgbWFrZSB0aGF0IHN0cnVjdHVyYWwuXG4gKlxuICogT3JnYW5pemF0aW9uIChBR0VOVFMubWQgcnVsZSAxMCk6IGl0IGlzc3VlcyBubyByZWFkLCBzbyB0aGVyZSBpcyBubyBzY2FuIHRvXG4gKiBwaW47IGl0cyBvbmUgd3JpdGUgaXMgYW4gaW5zZXJ0IGJ1aWx0IGZyb20gdGhlIHRyaWdnZXJpbmcgcXVvdGUncyBvd24gbGlua3MsXG4gKiBhbmQgdGhlIGVuZ2luZSBzdGFtcHMgaXRzIGBvcmdhbml6YXRpb25faWRgIGZyb20gdGhlIHRyaWdnZXIncyBjb250ZXh0LCB3aGljaFxuICogZWxldmF0aW9uIGNhcnJpZXMgdGhyb3VnaCB1bmNoYW5nZWQgKGB3aXRoUnVuQXMoJ3N5c3RlbScpYCBpcyB0aGUgdHJpZ2dlcmluZ1xuICogY29udGV4dCBwbHVzIGBpc1N5c3RlbWApIFx1MjAxNCBwaW5uZWQgb24gYSB3YWxsZWQgZGVwbG95bWVudCBieVxuICogYHRlc3QvaG9vay1vcmctaW5oZXJpdGFuY2UudGVzdC50c2AuXG4gKi9cbmNvbnN0IHF1b3RlQWNjZXB0ZWRDb250cmFjdERyYWZ0OiBIb29rID0ge1xuICBuYW1lOiAncXVvdGVfYWNjZXB0ZWRfY29udHJhY3RfZHJhZnQnLFxuICBvYmplY3Q6ICdjcm1fcXVvdGUnLFxuICBldmVudHM6IFsnYWZ0ZXJVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDgwMCxcbiAgYXN5bmM6IHRydWUsXG4gIG9uRXJyb3I6ICdsb2cnLFxuICBydW5BczogJ3N5c3RlbScsXG4gIGRlc2NyaXB0aW9uOiAnRHJhZnQgdGhlIGFjY2VwdGVkIHF1b3RlXHUyMDE5cyBjb250cmFjdC4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXQsIHByZXZpb3VzIH0gPSBjdHg7XG4gICAgaWYgKGlucHV0LnN0YXR1cyAhPT0gJ2FjY2VwdGVkJyB8fCBwcmV2aW91cz8uc3RhdHVzID09PSAnYWNjZXB0ZWQnKSByZXR1cm47XG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXBpKSByZXR1cm47XG5cbiAgICAvLyBSZWFsIGNhbGVuZGFyIG1vbnRocyBcdTIwMTQgYGRheXMgKiAzMGAgc2hvcnRlZCBhIDEyLW1vbnRoIHRlcm0gYnkgfjUgZGF5c1xuICAgIC8vIGFuZCBvbmx5IHNsaXBwZWQgcGFzdCBjb250cmFjdF92YWxpZGF0aW9uJ3MgXHUwMEIxMS1tb250aCB0b2xlcmFuY2UgYnkgbHVjay5cbiAgICAvL1xuICAgIC8vIE9uIHRoZSBVVEMgY2FsZW5kYXIgdGhyb3VnaG91dCwgZm9yIHRoZSByZWFzb24gYGFkZERheXNgIGRvY3VtZW50cyBpblxuICAgIC8vIHRoZSBzaWJsaW5nIGhvb2sgYWJvdmU6IHRoZSBiYXNlIGlzIGEgVVRDLW1pZG5pZ2h0LWFuY2hvcmVkIGRhdGUgc3RyaW5nLFxuICAgIC8vIHNvIGEgbG9jYWwgYGdldE1vbnRoYC9gc2V0TW9udGhgIHN0ZXAgcmVhZHMgdGhhdCBhbmNob3IgYXMgdGhlIHByZXZpb3VzXG4gICAgLy8gZXZlbmluZyBhbmQgcmVuZGVycyBhIGRheSBzaG9ydCB3aGVuZXZlciB0aGUgb2Zmc2V0IGF0IHRoZSBlbmQgb2YgdGhlXG4gICAgLy8gdGVybSBkaWZmZXJzIGZyb20gdGhlIG9mZnNldCBhdCBpdHMgc3RhcnQuIEEgMTItbW9udGggdGVybSBtYWtlcyB0aGF0XG4gICAgLy8gcmFyZSBidXQgbm90IGFic2VudCBcdTIwMTQgbWVhc3VyZWQgb24gOSBvZiA3MzAgY29uc2VjdXRpdmUgc3RhcnQgZGF0ZXMgaW5cbiAgICAvLyBgQW1lcmljYS9OZXdfWW9ya2AgKGUuZy4gYDIwMjYtMTEtMDJgICsgMTIgbW9udGhzIGFuc3dlcmVkXG4gICAgLy8gYDIwMjctMTEtMDFgKSwgYW5kIGl0IGlzIGBjcm1fY29udHJhY3QuZW5kX2RhdGVgLCBhIGRhdGUgdGhlIGN1c3RvbWVyIGlzXG4gICAgLy8gaW52b2ljZWQgYWdhaW5zdC5cbiAgICBmdW5jdGlvbiBhZGRNb250aHMoaXNvOiBzdHJpbmcsIG1vbnRoczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShpc28pO1xuICAgICAgZC5zZXRVVENNb250aChkLmdldFVUQ01vbnRoKCkgKyBtb250aHMpO1xuICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlyc3QgY2FuZGlkYXRlIHRoYXQgaXMgYSBub24tZW1wdHkgcmVjb3JkIGlkLCBvciBgdW5kZWZpbmVkYCAoIzcxNCkuXG4gICAgICpcbiAgICAgKiBUaGUgaWQgY2hhaW5zIGhlcmUgdXNlZCB0byBiZSB3cml0dGVuIGAodHlwZW9mIGEgPT09ICdzdHJpbmcnICYmIGEpIHx8ICh0eXBlb2ZcbiAgICAgKiBiID09PSAnc3RyaW5nJyAmJiBiKWAsIHdob3NlIHZhbHVlIHdoZW4gTkVJVEhFUiBvcGVyYW5kIGhvbGRzIGlzIGJvb2xlYW5cbiAgICAgKiBgZmFsc2VgIFx1MjAxNCBub3QgYHVuZGVmaW5lZGAuIGBmYWxzZWAgaXMgYSBWQUxVRTogaXQgd2VudCBpbnRvIHRoZSBjb250cmFjdFxuICAgICAqIGRvY3VtZW50IGFzIHRoZSBjb250ZW50IG9mIGEgbG9va3VwLCBhbmQgYSBsb29rdXAgY29sdW1uIHRha2VzIGEgcmVjb3JkIGlkXG4gICAgICogb3Igbm90aGluZyBhdCBhbGwuIFdoYXQgdGhlIGVuZ2luZSBkaWQgd2l0aCBpdCBkZXBlbmRzIG9uIHRoZSBkZXBsb3ltZW50J3NcbiAgICAgKiBBRFItMDEwNCB2YWx1ZS1zaGFwZSBwb3N0dXJlLCBhbmQgYm90aCBvdXRjb21lcyBhcmUgd3Jvbmc6XG4gICAgICpcbiAgICAgKiAgIC0gd2Fybi1maXJzdCAoYSBkZXBsb3ltZW50IHRoYXQgaGFzIG5vdCBydW4gYG9zIG1pZ3JhdGUgdmFsdWUtc2hhcGVzXG4gICAgICogICAgIC0tYXBwbHlgKTogdGhlIHdyaXRlIGlzIEFETUlUVEVEIHdpdGggYSBgW3ZhbHVlLXNoYXBlXSBcdTIwMjYgYWNjZXB0ZWQgZm9yXG4gICAgICogICAgIG5vd2Agd2FybmluZywgYW5kIGBjcm1fY29udGFjdCA9IGZhbHNlYCBpcyBwZXJzaXN0ZWQgaW50byBhIHJlZmVyZW5jZVxuICAgICAqICAgICBjb2x1bW4gXHUyMDE0IGEgcm93IHRoZSB2YWx1ZS1zaGFwZSBzY2FuIHdpbGwgbGF0ZXIgcmVmdXNlIHRvIGNvbnZlcnQ7XG4gICAgICogICAtIHN0cmljdCAoYWZ0ZXIgdGhhdCBnYXRlLCBvciBgT1NfREFUQV9WQUxVRV9TSEFQRV9TVFJJQ1RfRU5BQkxFRD0xYCk6XG4gICAgICogICAgIGBWYWxpZGF0aW9uRXJyb3I6IFByaW1hcnkgQ29udGFjdCBoYXMgYW4gaW52YWxpZCBsb29rdXAgdmFsdWU6IEludmFsaWRcbiAgICAgKiAgICAgaW5wdXQ6IGV4cGVjdGVkIHN0cmluZywgcmVjZWl2ZWQgYm9vbGVhbmAsIHdoaWNoIGFib3J0ZWQgdGhpcyB3aG9sZVxuICAgICAqICAgICBoYW5kbGVyIFx1MjAxNCBzbyBubyBjb250cmFjdCwgYW5kIHRoZSBjbG9zZS13b24gbGVnIGJlbG93IG5ldmVyIHJhbi5cbiAgICAgKlxuICAgICAqIGB1bmRlZmluZWRgIGlzIHRoZSBvbmx5IGNvcnJlY3QgXCJ0aGVyZSBpcyBubyBpZCBoZXJlXCI6IGl0IGRvZXMgbm90IHN1cnZpdmVcbiAgICAgKiB0aGUgSlNPTiBob3AgaW50byB0aGUgZW5naW5lLCBhbmQgdGhlIHdyaXRlcyBiZWxvdyBkcm9wIHRoZSBrZXkgb3V0cmlnaHQsXG4gICAgICogc28gYW4gYWJzZW50IG9wdGlvbmFsIGxpbmsgaXMgYW4gQUJTRU5UIENPTFVNTiByYXRoZXIgdGhhbiBhIGp1bmsgdmFsdWUuXG4gICAgICovXG4gICAgY29uc3QgcGlja0lkID0gKC4uLmNhbmRpZGF0ZXM6IHVua25vd25bXSk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PlxuICAgICAgY2FuZGlkYXRlcy5maW5kKChjKTogYyBpcyBzdHJpbmcgPT4gdHlwZW9mIGMgPT09ICdzdHJpbmcnICYmIGMgIT09ICcnKTtcblxuICAgIGNvbnN0IGFjY291bnRJZCA9IHBpY2tJZChpbnB1dC5jcm1fYWNjb3VudCwgcHJldmlvdXM/LmNybV9hY2NvdW50KTtcbiAgICBjb25zdCBjb250YWN0SWQgPSBwaWNrSWQoaW5wdXQuY3JtX2NvbnRhY3QsIHByZXZpb3VzPy5jcm1fY29udGFjdCk7XG4gICAgY29uc3Qgb3Bwb3J0dW5pdHlJZCA9IHBpY2tJZChpbnB1dC5jcm1fb3Bwb3J0dW5pdHksIHByZXZpb3VzPy5jcm1fb3Bwb3J0dW5pdHkpO1xuICAgIGNvbnN0IG93bmVySWQgPSBwaWNrSWQoaW5wdXQub3duZXJfaWQsIHByZXZpb3VzPy5vd25lcl9pZCwgY3R4LnVzZXI/LmlkKTtcbiAgICBjb25zdCB0b3RhbFByaWNlID0gW2lucHV0LnRvdGFsX3ByaWNlLCBwcmV2aW91cz8udG90YWxfcHJpY2VdLmZpbmQoKHYpID0+IHR5cGVvZiB2ID09PSAnbnVtYmVyJykgPz8gMDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwYXltZW50IHRlcm1zIHRoZSBjdXN0b21lciBhY3R1YWxseSBuZWdvdGlhdGVkLlxuICAgICAqXG4gICAgICogUXVvdGUgYW5kIENvbnRyYWN0IHNoYXJlIG9uZSBgcGF5bWVudF90ZXJtc2Agdm9jYWJ1bGFyeSBiZWNhdXNlIGFuXG4gICAgICogYWNjZXB0ZWQgcXVvdGUncyB0ZXJtcyBjYXJyeSBvdmVyIHRvIHRoZSBjb250cmFjdCBcdTIwMTQgYnV0IG9ubHkgaWYgc29tZXRoaW5nXG4gICAgICogY2FycmllcyB0aGVtLiBXaXRob3V0IHRoaXMgdGhlIGRyYWZ0ZWQgY29udHJhY3QgdGFrZXNcbiAgICAgKiBgY3JtX2NvbnRyYWN0LnBheW1lbnRfdGVybXNgJ3Mgb3duIG9wdGlvbiBkZWZhdWx0IGBuZXRfMzBgIG9uIGV2ZXJ5XG4gICAgICogYWNjZXB0ZWQgcXVvdGUsIGluY2x1ZGluZyBvbmUgbmVnb3RpYXRlZCBhdCBgZHVlX29uX3JlY2VpcHRgOyBhbmQgdGhlXG4gICAgICogY29udHJhY3QncyBgcGF5bWVudF90ZXJtc2AgaXMgb25lIG9mIHRoZSBmaWVsZHNcbiAgICAgKiBgc3JjL3JldmVudWUvZmxvd3MvYmlsbGluZy1oYW5kb2ZmLWNvbnRyYWN0LWFjdGl2YXRlZC5mbG93LnRzYCBQT1NUcyB0b1xuICAgICAqIGJpbGxpbmcgd2hlbiB0aGUgY29udHJhY3QgYWN0aXZhdGVzLCBzbyBhIGRlZmF1bHRlZCB0ZXJtIGJlY29tZXMgYW5cbiAgICAgKiBpbnZvaWNpbmcgdGVybS5cbiAgICAgKlxuICAgICAqIFJlYWQgbGlrZSBgdG90YWxQcmljZWAgYWJvdmU6IHRoZSBwYXRjaCdzIHZhbHVlIHdoZW4gdGhlIGFjY2VwdGluZyB3cml0ZVxuICAgICAqIGNhcnJpZWQgb25lLCBlbHNlIHRoZSB2YWx1ZSBhbHJlYWR5IG9uIHRoZSBxdW90ZSBcdTIwMTQgYHBpY2tJZGAncyBydWxlXG4gICAgICogZXhhY3RseSAodGhlIGZpcnN0IG5vbi1lbXB0eSBzdHJpbmcpLCBzbyBpdCBpcyByZWFkIHdpdGggYHBpY2tJZGAuIEFcbiAgICAgKiBxdW90ZSB0aGF0IG5ldmVyIGNob3NlIGEgdGVybSB5aWVsZHMgYHVuZGVmaW5lZGAsIHdoaWNoIGRyb3BzIHRoZSBrZXkgYW5kXG4gICAgICogbGV0cyB0aGUgY29udHJhY3QncyBvd24gZGVmYXVsdCBhcHBseS5cbiAgICAgKi9cbiAgICBjb25zdCBwYXltZW50VGVybXMgPSBwaWNrSWQoaW5wdXQucGF5bWVudF90ZXJtcywgcHJldmlvdXM/LnBheW1lbnRfdGVybXMpO1xuXG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApO1xuXG4gICAgLyoqXG4gICAgICogUExBQ0VIT0xERVIgREVGQVVMVFMgXHUyMDE0IGRlY2xhcmVkIGFzIGRlZmF1bHRzLCBOT1QgZGVjaWRlZCBhcyBidXNpbmVzc1xuICAgICAqIGZhY3RzICgjMTEyOSBydWxpbmcsIDIwMjYtMDgtMzEpLiBBbiBhdXRvLWRyYWZ0ZWQgY29udHJhY3QgaXMgYSBTVEFSVElOR1xuICAgICAqIERSQUZUIGFuIGFkbWluIGNvbXBsZXRlcywgbm90IGEgZmFpdGhmdWwgdHJhbnNjcmlwdGlvbiBvZiB3aGF0IHdhcyBzb2xkLlxuICAgICAqIGBjcm1fY29udHJhY3RgIHJlcXVpcmVzIGFsbCB0aHJlZSwgYSBxdW90ZSBjYW4gZXhwcmVzcyBub25lIG9mIHRoZW0sIHNvXG4gICAgICogdGhlIGhvb2sgaGFzIHRvIHN1cHBseSBzb21ldGhpbmc7IG5vbmUgb2YgaXQgaXMgZXZpZGVuY2UgYWJvdXQgdGhlIGRlYWw6XG4gICAgICpcbiAgICAgKiAgIC0gYGNvbnRyYWN0X3Rlcm1fbW9udGhzYCBcdTIwMTQgYHJlcXVpcmVkICsgbm90TnVsbCArIG1pbjogMWAgb24gdGhlXG4gICAgICogICAgIGNvbnRyYWN0LCBhbmQgdGhlIHF1b3RlIGhhcyBub3doZXJlIHRvIHJlY29yZCBhIHRlcm0uIDEyIGlzIGEgZ3Vlc3NcbiAgICAgKiAgICAgd2l0aCBub3RoaW5nIGJlaGluZCBpdDtcbiAgICAgKiAgIC0gYGNvbnRyYWN0X3R5cGVgIFx1MjAxNCB0aGUgY29udHJhY3QgZGVjbGFyZXMgc2l4IHZhbHVlcyAoc3Vic2NyaXB0aW9uIC9cbiAgICAgKiAgICAgc2VydmljZSAvIGxpY2Vuc2UgLyBwYXJ0bmVyc2hpcCAvIG5kYSAvIG1zYSkgYW5kIE5PIG9wdGlvbiBkZWZhdWx0LFxuICAgICAqICAgICBzbyB0aGlzIGxpbmUgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBldmVyIHBpY2tzIG9uZTogZXZlcnlcbiAgICAgKiAgICAgYXV0by1kcmFmdGVkIGNvbnRyYWN0IGluIHRoZSBhcHAgaXMgYSBzdWJzY3JpcHRpb24gYW5kIHRoZSBvdGhlclxuICAgICAqICAgICBmaXZlIHR5cGVzIGFyZSB1bnJlYWNoYWJsZSBvbiB0aGlzIHBhdGguIEl0IGRvZXMgbm90IHN0YXkgaGVyZVxuICAgICAqICAgICBlaXRoZXIgXHUyMDE0XG4gICAgICogICAgIGBzcmMvcmV2ZW51ZS9mbG93cy9iaWxsaW5nLWhhbmRvZmYtY29udHJhY3QtYWN0aXZhdGVkLmZsb3cudHNgXG4gICAgICogICAgIFBPU1RzIGBjb250cmFjdF90eXBlYCB0byBiaWxsaW5nIHdoZW4gdGhlIGNvbnRyYWN0IGFjdGl2YXRlcztcbiAgICAgKiAgIC0gYHN0YXJ0X2RhdGVgIFx1MjAxNCB0aGUgb25lIG1lbWJlciB0aGF0IGlzIG5vdCBhIGxpdGVyYWw6IHRoZSBkYXRlIHRoZVxuICAgICAqICAgICBxdW90ZSBoYXBwZW5lZCB0byBiZSBBQ0NFUFRFRCwgd2hpY2ggaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBkYXRlIHRoZVxuICAgICAqICAgICBjdXN0b21lcidzIHRlcm0gYmVnaW5zLiBBIHBsYWNlaG9sZGVyIFJVTEUgcmF0aGVyIHRoYW4gYSBwbGFjZWhvbGRlclxuICAgICAqICAgICB2YWx1ZS4gSXQgc2l0cyBpbiB0aGUgYmxvY2sgYmVjYXVzZSB0aGUgYmxvY2sgaXMgaXRzZWxmIHBlci1kcmFmdDpcbiAgICAgKiAgICAgYW4gTDIgYm9keSBoYXMgbm8gbW9kdWxlIHNjb3BlIGF0IHJ1bnRpbWUgKHNlZSB0aGUgZmlsZSBoZWFkZXIpLCBzb1xuICAgICAqICAgICB0aGVzZSBhcmUgaGFuZGxlci1sb2NhbCBieSBjb25zdHJ1Y3Rpb24sIG5vdCBtb2R1bGUgY29uc3RhbnRzLlxuICAgICAqXG4gICAgICogYGVuZF9kYXRlYCBpcyBub3QgYSBmb3VydGggZGVmYXVsdCBcdTIwMTQgaXQgaXMgREVSSVZFRCBmcm9tIHRoZSB0d28gYWJvdmVcbiAgICAgKiAoYGFkZE1vbnRoc2AsIHJlYWwgY2FsZW5kYXIgbW9udGhzKSwgc28gaXQgaW5oZXJpdHMgdGhlaXIgZ3Vlc3NlcyByYXRoZXJcbiAgICAgKiB0aGFuIGFkZGluZyBvbmUgb2YgaXRzIG93bi5cbiAgICAgKlxuICAgICAqIFx1MjZENCBEbyBub3QgcmVhZCB0aGVzZSBhcyBkZWNpc2lvbnMgYW5kIGRvIG5vdCBxdWlldGx5IHJlLXR1bmUgdGhlbS4gVGhlXG4gICAgICogYWx0ZXJuYXRpdmUgXHUyMDE0IHRoZSBxdW90ZSBjYXJyeWluZyBhIHJlYWwgdGVybSBhbmQgdHlwZSBzbyB0aGUgZHJhZnRcbiAgICAgKiB0cmFuc2NyaWJlcyB3aGF0IHdhcyBzb2xkIFx1MjAxNCBpcyBvcHRpb24gQSBvZiAjMTEyOTogcmVjb3JkZWQsIG5vdFxuICAgICAqIHVuZGVydGFrZW4sIHVuZnJvemVuIG9ubHkgYnkgbWVhc3VyZWQgZXZpZGVuY2UgdGhhdCByZWFsIHNhbGVzIHByb2Nlc3Nlc1xuICAgICAqIGZpeCB0aGUgdGVybSBhbmQgdHlwZSBhdCBhY2NlcHRhbmNlIHRpbWUuIFRoaXMgYmxvY2sgaXMgdGhlbiB0aGUgbGlzdCBvZlxuICAgICAqIHZhbHVlcyB0aGF0IG1vdmUgb250byBgY3JtX3F1b3RlYC4gTGVhdmluZyB0aGVtIHVubWFya2VkIHdhcyBleGNsdWRlZCBieVxuICAgICAqIHRoZSBzYW1lIHJ1bGluZzogYW4gdW5tYXJrZWQgaGFyZGNvZGUgaXMgZXhhY3RseSBob3cgdGhlIGBwYXltZW50X3Rlcm1zYFxuICAgICAqIGRyaWZ0IG9mICM4NzMgaGFwcGVuZWQuXG4gICAgICovXG4gICAgY29uc3QgRFJBRlRfQ09OVFJBQ1RfREVGQVVMVFMgPSB7XG4gICAgICBjb250cmFjdF90ZXJtX21vbnRoczogMTIsXG4gICAgICBjb250cmFjdF90eXBlOiAnc3Vic2NyaXB0aW9uJyxcbiAgICAgIHN0YXJ0X2RhdGU6IHRvZGF5LFxuICAgIH0gYXMgY29uc3Q7XG5cbiAgICAvLyBUaGUgY29udHJhY3QncyBPTkUgZmllbGQgZXhwbGFpbmluZyB3aGVyZSBpdCBjYW1lIGZyb20uIFx1MjZENCBOZXZlciBhIHJlY29yZFxuICAgIC8vIGlkOiBgQXV0by1kcmFmdGVkIGZyb20gYWNjZXB0ZWQgcXVvdGUgTXZOb3BXZ0VEWndtMlQ1TGAgbmFtZXMgYSBzdHJpbmcgbm9cbiAgICAvLyBzdXJmYWNlIGluIHRoaXMgYXBwIGV2ZXIgc2hvd3MsIG9uIGEgcXVvdGUgZXZlcnkgc2NyZWVuIGNhbGxzIGBRVEUtMDAwNmAuXG4gICAgLy8gTmFtZSBpdCB0aGUgd2F5IGBjcm1fcXVvdGUuZGlzcGxheV90aXRsZWAgZG9lcy4gVW5saWtlIHRoZSB0YXNrIHNpdGVzIGluXG4gICAgLy8gdGhpcyBjbGFzcyB0aGVyZSBpcyBubyByZWxhdGlvbnNoaXAgZmllbGQgdG8gaG9sZCB0aGUgaWQgYWZ0ZXJ3YXJkcyBcdTIwMTRcbiAgICAvLyBgY3JtX2NvbnRyYWN0YCBsaW5rcyBhY2NvdW50LCBjb250YWN0IGFuZCBvcHBvcnR1bml0eSBidXQgbm90IHRoZSBxdW90ZSBcdTIwMTRcbiAgICAvLyBzbyB0aGlzIHNlbnRlbmNlIGlzIHRoZSB3aG9sZSBwcm92ZW5hbmNlIHJlY29yZCBhbmQgaGFkIGJldHRlciBiZVxuICAgIC8vIHJlYWRhYmxlLiBgcXVvdGVfbnVtYmVyYCBpcyBhbiBlbmdpbmUtaXNzdWVkIGF1dG9udW1iZXIgYW5kIG5ldmVyIGFwcGVhcnNcbiAgICAvLyBvbiBhbiB1cGRhdGUgcGF5bG9hZCwgc28gaXQgaXMgcmVhZCBmcm9tIHRoZSBwcmUtaW1hZ2UgYWxvbmU7IGBuYW1lYCBjYW5cbiAgICAvLyBiZSBjaGFuZ2luZyBpbiB0aGlzIHZlcnkgd3JpdGUuXG4gICAgY29uc3QgdHJpbW1lZCA9ICh2OiB1bmtub3duKTogc3RyaW5nID0+ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB2LnRyaW0oKSA6ICcnKTtcbiAgICBjb25zdCBxdW90ZUxhYmVsID0gW3RyaW1tZWQocHJldmlvdXM/LnF1b3RlX251bWJlciksIFtpbnB1dC5uYW1lLCBwcmV2aW91cz8ubmFtZV0ubWFwKHRyaW1tZWQpLmZpbmQoQm9vbGVhbildLmZpbHRlcihCb29sZWFuKS5qb2luKCcgLSAnKTtcblxuICAgIC8vIE9ubHkgbG9va3VwcyB3ZSBhY3R1YWxseSBIQVZFIGFyZSB3cml0dGVuLiBBIG1pc3Npbmcgb3B0aW9uYWwgbGluayBpcyBhblxuICAgIC8vIGFic2VudCBrZXkgXHUyMDE0IG5ldmVyIGBmYWxzZWAgKHNlZSBgcGlja0lkYCksIGFuZCBuZXZlciBgbnVsbGAgZWl0aGVyOiBgbnVsbGBcbiAgICAvLyBpcyBhIGxlZ2FsIHNoYXBlIGZvciB0aGUgb3B0aW9uYWwgYGNybV9vcHBvcnR1bml0eWAgYnV0IG5vdCBmb3IgdGhlXG4gICAgLy8gcmVxdWlyZWQgYGNybV9jb250YWN0YCwgYW5kIG9uZSBpZGlvbSBmb3IgYm90aCBpcyB3aGF0IGtlZXBzIHRoaXMgaG9uZXN0LlxuICAgIGNvbnN0IGNvbnRyYWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIC4uLkRSQUZUX0NPTlRSQUNUX0RFRkFVTFRTLFxuICAgICAgc3RhdHVzOiAnZHJhZnQnLFxuICAgICAgZW5kX2RhdGU6IGFkZE1vbnRocyhEUkFGVF9DT05UUkFDVF9ERUZBVUxUUy5zdGFydF9kYXRlLCBEUkFGVF9DT05UUkFDVF9ERUZBVUxUUy5jb250cmFjdF90ZXJtX21vbnRocyksXG4gICAgICBjb250cmFjdF92YWx1ZTogdG90YWxQcmljZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBxdW90ZUxhYmVsID8gYEF1dG8tZHJhZnRlZCBmcm9tIGFjY2VwdGVkIHF1b3RlICR7cXVvdGVMYWJlbH1gIDogJ0F1dG8tZHJhZnRlZCBmcm9tIGFuIGFjY2VwdGVkIHF1b3RlJyxcbiAgICB9O1xuICAgIGlmIChhY2NvdW50SWQpIGNvbnRyYWN0LmNybV9hY2NvdW50ID0gYWNjb3VudElkO1xuICAgIGlmIChjb250YWN0SWQpIGNvbnRyYWN0LmNybV9jb250YWN0ID0gY29udGFjdElkO1xuICAgIGlmIChvcHBvcnR1bml0eUlkKSBjb250cmFjdC5jcm1fb3Bwb3J0dW5pdHkgPSBvcHBvcnR1bml0eUlkO1xuICAgIGlmIChvd25lcklkKSBjb250cmFjdC5vd25lcl9pZCA9IG93bmVySWQ7XG4gICAgLy8gU2FtZSBpZGlvbSBmb3IgdGhlIHNhbWUgcmVhc29uOiB3cml0dGVuIG9ubHkgd2hlbiB0aGUgcXVvdGUgSEFTIGEgdGVybSxcbiAgICAvLyBzbyBcInRoZSBxdW90ZSBjaG9zZSBub3RoaW5nXCIgc3RheXMgYW4gYWJzZW50IGtleSByYXRoZXIgdGhhbiBiZWNvbWluZyBhXG4gICAgLy8gdmFsdWUgdGhlIGNvbnRyYWN0J3MgZGVmYXVsdCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBzdXBwbGllZC5cbiAgICBpZiAocGF5bWVudFRlcm1zKSBjb250cmFjdC5wYXltZW50X3Rlcm1zID0gcGF5bWVudFRlcm1zO1xuXG4gICAgLy8gV2hhdCB0aGUgZHJhZnQgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIGNhcnJ5ICgjMTEyOSBydWxpbmcsIDIwMjYtMDgtMzEpIFx1MjAxNFxuICAgIC8vIERFQ0lERUQsIG5vdCBvdmVybG9va2VkLiBgY3JtX3F1b3RlLnNoaXBwaW5nX3Rlcm1zYCBhbmRcbiAgICAvLyBgY3JtX3F1b3RlLnNoaXBwaW5nX2FkZHJlc3NgIGhhdmUgbm8gY291bnRlcnBhcnQgY29sdW1uIG9uXG4gICAgLy8gYGNybV9jb250cmFjdGAgYXQgYWxsOyBgY3JtX3F1b3RlLmJpbGxpbmdfYWRkcmVzc2AgaGFzIG9uZSBhbmQgaXMgbGVmdFxuICAgIC8vIGZvciB0aGUgYWRtaW4gY29tcGxldGluZyB0aGUgZHJhZnQ7IGFuZCB0aGUgcXVvdGUncyBgZGVzY3JpcHRpb25gIHdvdWxkXG4gICAgLy8gZGlzcGxhY2UgdGhlIHByb3ZlbmFuY2Ugc2VudGVuY2Ugd3JpdHRlbiBhYm92ZSwgd2hpY2ggaXMgdGhpcyBjb250cmFjdCdzXG4gICAgLy8gb25seSByZWNvcmQgb2Ygd2hlcmUgaXQgY2FtZSBmcm9tLiBDb3B5aW5nIGFueSBvZiB0aGVtIGlzIHBhcnQgb2Ygb3B0aW9uXG4gICAgLy8gQSAoZmFpdGhmdWwgdHJhbnNjcmlwdGlvbikgYW5kIHVuZnJlZXplcyB3aXRoIGl0LCBub3QgYmVmb3JlLlxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV9jb250cmFjdCcpLmluc2VydChjb250cmFjdCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBgY3JtX3F1b3RlLmNybV9jb250YWN0YCBpcyBkZWxpYmVyYXRlbHkgb3B0aW9uYWwgd2hpbGVcbiAgICAgIC8vIGBjcm1fY29udHJhY3QuY3JtX2NvbnRhY3RgIGlzIGByZXF1aXJlZCArIG5vdE51bGxgLCBzbyBhIHF1b3RlIGFjY2VwdGVkXG4gICAgICAvLyB3aXRob3V0IGEgcmVjaXBpZW50IGxlZ2l0aW1hdGVseSBsYW5kcyBoZXJlIHdpdGggXCJQcmltYXJ5IENvbnRhY3QgaXNcbiAgICAgIC8vIHJlcXVpcmVkXCIuIFRoYXQgcmVmdXNhbCBpcyB0aGUgZG9jdW1lbnRlZCBiZWhhdmlvdXIsIG5vdCBhIGRlZmVjdCBcdTIwMTRcbiAgICAgIC8vIGBjb250ZW50L2RvY3Mvc2FsZXMvcXVvdGVzLm1keGAgYWxyZWFkeSB0ZWxscyByZXBzIHRvIHB1dCB0aGUgY29udGFjdCBvblxuICAgICAgLy8gdGhlIHF1b3RlIGZpcnN0LCBiZWNhdXNlIFwid2hhdCB0aGUgcXVvdGUgZG9lcyBub3QgY2FycnksIGFjY2VwdGFuY2VcbiAgICAgIC8vIGNhbm5vdCBwYXNzIG9uXCIuIFRoZSByZWZ1c2FsIGlzIHRydXRoZnVsIChhIG5hbWVkIG1pc3NpbmcgZmllbGQsIG5vdFxuICAgICAgLy8gXCJyZWNlaXZlZCBib29sZWFuXCIpLCBhbmQgc2luY2UgdGhlIGNsb3NlLXdvbiBsaXZlcyBpbiBpdHMgb3duIGhvb2sgaXRcbiAgICAgIC8vIGNhbiBubyBsb25nZXIgdGFrZSB0aGF0IGxlZyB3aXRoIGl0LlxuICAgICAgLy9cbiAgICAgIC8vIERFTElCRVJBVEVMWSBCQVJFLCBsaWtlIHRoZSBjbG9zZS13b24gb25lIGluIGBxdW90ZV9vbl9hY2NlcHRlZGA6IGFcbiAgICAgIC8vIGNhc2NhZGUgZmF1bHQgdGhlIGFjY2VwdGluZyB1c2VyIG5laXRoZXIgY2F1c2VkIG5vciBjYW4gYWN0IG9uLCBzbyBhXG4gICAgICAvLyA1MDAsIG5ldmVyIGEgNHh4IHJlZnVzYWwgZW52ZWxvcGUgKCMxMDc1KS4gSXQgbmFtZXMgdGhlIHF1b3RlIHRoZSB3YXlcbiAgICAgIC8vIGV2ZXJ5IHNjcmVlbiBkb2VzIFx1MjAxNCB0aGUgbGFiZWwgY29tcG9zZWQgYWJvdmUgXHUyMDE0IG5ldmVyIGJ5IGl0cyBpZCAoIzEyNDMpLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb3VsZCBub3QgZHJhZnQgdGhlIGNvbnRyYWN0IGZvciBxdW90ZSAke3F1b3RlTGFiZWx9OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBPbiBhY2NlcHRhbmNlOiBwdXNoIHRoZSBsaW5rZWQgb3Bwb3J0dW5pdHkgdG8gYGNsb3NlZF93b25gLlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgZWxldmF0ZWQgXHUyMDE0IHRoZSByZWFzb24gaXMgb24gYHF1b3RlX2FjY2VwdGVkX2NvbnRyYWN0X2RyYWZ0YFxuICogYWJvdmU6IHRoaXMgd3JpdGUgc3RheXMgdGhlIGFjY2VwdGluZyBjYWxsZXIncywgc28gdGhlIG9wcG9ydHVuaXR5J3Mgb3duXG4gKiBndWFyZHMgYW5kIGFuIGFwcHJvdmFsJ3MgcmVjb3JkIGxvY2sganVkZ2UgaXQgYXMgdGhleSBhbHdheXMgaGF2ZS4gQSBkZWFsIGFuXG4gKiBhcHByb3ZhbCBob2xkcyBpcyByZWZ1c2VkIGF0IHRoZSBhY2NlcHRhbmNlIGl0c2VsZiAoYHF1b3RlX3dvcmtmbG93YCksIHNvIHRoaXNcbiAqIHdyaXRlIG5vIGxvbmdlciBtZWV0cyB0aGF0IGxvY2sgb24gYSB1c2VyJ3MgYWNjZXB0YW5jZS5cbiAqL1xuY29uc3QgcXVvdGVBY2NlcHRlZDogSG9vayA9IHtcbiAgbmFtZTogJ3F1b3RlX29uX2FjY2VwdGVkJyxcbiAgb2JqZWN0OiAnY3JtX3F1b3RlJyxcbiAgZXZlbnRzOiBbJ2FmdGVyVXBkYXRlJ10sXG4gIHByaW9yaXR5OiA4MDAsXG4gIGFzeW5jOiB0cnVlLFxuICBvbkVycm9yOiAnbG9nJyxcbiAgZGVzY3JpcHRpb246ICdDbG9zZS13aW4gdGhlIGFjY2VwdGVkIHF1b3RlXHUyMDE5cyBvcHBvcnR1bml0eS4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXQsIHByZXZpb3VzIH0gPSBjdHg7XG4gICAgaWYgKGlucHV0LnN0YXR1cyAhPT0gJ2FjY2VwdGVkJyB8fCBwcmV2aW91cz8uc3RhdHVzID09PSAnYWNjZXB0ZWQnKSByZXR1cm47XG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIC8vIEEgcmVjb3JkIGlkIG9yIG5vdGhpbmcgXHUyMDE0IG5ldmVyIGJvb2xlYW4gYGZhbHNlYCAoIzcxNDsgdGhlIGZ1bGwgbm90ZSBpcyBvblxuICAgIC8vIGBwaWNrSWRgIGluIGBxdW90ZV9hY2NlcHRlZF9jb250cmFjdF9kcmFmdGApLlxuICAgIGNvbnN0IGlkID0gW2lucHV0LmNybV9vcHBvcnR1bml0eSwgcHJldmlvdXM/LmNybV9vcHBvcnR1bml0eV0uZmluZCgodik6IHYgaXMgc3RyaW5nID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2ICE9PSAnJyk7XG4gICAgaWYgKCFhcGkgfHwgIWlkKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3BwID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykuZmluZE9uZSh7IHdoZXJlOiB7IGlkIH0gfSk7XG4gICAgICAvLyBBIGRlYWwgYWxyZWFkeSBjbG9zZWQsIHdvbiBvciBsb3N0LCBpcyBsZWZ0IHdoZXJlIGl0IGlzLlxuICAgICAgaWYgKG9wcCAmJiAhU3RyaW5nKG9wcC5zdGFnZSkuc3RhcnRzV2l0aCgnY2xvc2VkXycpKSB7XG4gICAgICAgIC8vIGBjcm1fb3Bwb3J0dW5pdHkud2luX3JlYXNvbmAgaXMgYHJlcXVpcmVkV2hlbmAgc3RhZ2UgaXMgY2xvc2VkX3dvblxuICAgICAgICAvLyAoIzU5MyksIGFuZCB0aGlzIHdyaXRlIGlzIHRoZSBPTkUgY2xvc2UgcGF0aCB3aXRoIG5vIGh1bWFuIGluIGl0IHRvXG4gICAgICAgIC8vIGF0dHJpYnV0ZSB0aGUgd2luIFx1MjAxNCBzbyB3aXRob3V0IGEgdmFsdWUgaGVyZSB0aGUgQ1BRIGxlZyB3b3VsZCBiZVxuICAgICAgICAvLyByZWplY3RlZCBieSB0aGUgZW5naW5lIG9uIGV2ZXJ5IGFjY2VwdGVkIHF1b3RlLiBgcXVvdGVfYWNjZXB0ZWRgXG4gICAgICAgIC8vIG5hbWVzIHRoZSBhdXRvbWF0ZWQgcGF0aCByYXRoZXIgdGhhbiBndWVzc2luZyBhIHJlcCdzIGFuc3dlcjsga2VlcFxuICAgICAgICAvLyB0aGUgcmVhc29uIHRoZSByZXAgYWxyZWFkeSByZWNvcmRlZCBpZiB0aGVyZSBpcyBvbmUuXG4gICAgICAgIGNvbnN0IHdvbiA9IHsgaWQsIHN0YWdlOiAnY2xvc2VkX3dvbicsIGNsb3NlX2RhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCkgfTtcbiAgICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykudXBkYXRlKHsgLi4ud29uLCAuLi4ob3BwLndpbl9yZWFzb24gPyB7fSA6IHsgd2luX3JlYXNvbjogJ3F1b3RlX2FjY2VwdGVkJyB9KSB9LCB7IHdoZXJlOiB7IGlkIH0gfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBERUxJQkVSQVRFTFkgQkFSRSBcdTIwMTQgb25lIG9mIHRoZSB0d28gdGhyb3dzIGluIHRoaXMgZmlsZSB0aGUgIzEwNzUgc3dlZXBcbiAgICAgIC8vIGxlZnQgYWxvbmUgKHRoZSBvdGhlciBpcyB0aGUgY29udHJhY3QgZHJhZnQncywgYWJvdmUpLiBFdmVyeSBvdGhlclxuICAgICAgLy8gdGhyb3cgaGVyZSBpcyBhIGJ1c2luZXNzIHJlZnVzYWw6IHRoZSB1c2VyIGFza2VkIGZvciBzb21ldGhpbmcgdGhlXG4gICAgICAvLyBydWxlcyBmb3JiaWQsIGFuZCBhbiBlbnZlbG9wZSB0ZWxscyB0aGVpciBjbGllbnQgd2hpY2ggcnVsZS4gVGhpcyBvbmVcbiAgICAgIC8vIGlzIHRoZSBvcHBvc2l0ZS4gSXQgZmlyZXMgZnJvbSBhbiBgYWZ0ZXJVcGRhdGVgIGNhc2NhZGUgd2hlbiBjbG9zZS13b25cbiAgICAgIC8vIGJvb2trZWVwaW5nIEZBSUxFRCBmb3IgcmVhc29ucyB0aGUgdXNlciBkaWQgbm90IGNhdXNlIGFuZCBjYW5ub3QgYWN0XG4gICAgICAvLyBvbiwgc28gaXQgaXMgYSBzZXJ2ZXIgZmF1bHQgYW5kIGJlbG9uZ3MgaW4gdGhlIDV4eCBiYW5kLiBBIGJhcmUgRXJyb3IgaXNcbiAgICAgIC8vIGFscmVhZHkgbWFwcGVkIHRvIGA1MDAgLyBJTlRFUk5BTF9FUlJPUmAgYnkgYHJlc29sdmVUaHJvd25IdHRwRXJyb3JgLFxuICAgICAgLy8gd2hpY2ggaXMgdGhlIGNvcnJlY3QgYW5zd2VyIFx1MjAxNCBkcmVzc2luZyBpdCBpbiBhIDR4eCByZWZ1c2FsIGNvZGUgd291bGRcbiAgICAgIC8vIGZpbGUgYSBicm9rZW4gY2FzY2FkZSBhcyB1c2VyIGVycm9yLiBJdCBuYW1lcyB0aGUgcXVvdGUgYnkgaXRzIG51bWJlcixcbiAgICAgIC8vIHRoZSBlbmdpbmUncyBhdXRvbnVtYmVyIGV2ZXJ5IHNjcmVlbiBzaG93cyBcdTIwMTQgbmV2ZXIgYSByZWNvcmQgaWQgKCMxMjQzKS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgY291bGQgbm90IGNsb3NlLXdvbiB0aGUgb3Bwb3J0dW5pdHkgb2YgcXVvdGUgJHtTdHJpbmcocHJldmlvdXM/LnF1b3RlX251bWJlcil9OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgW3F1b3RlVmFsaWRhdGlvbiwgcXVvdGVBY2NlcHRlZENvbnRyYWN0RHJhZnQsIHF1b3RlQWNjZXB0ZWRdO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL3F1b3RlX2xpbmVfaXRlbS5ob29rLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHMvcXVvdGVfbGluZV9pdGVtLmhvb2sudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB0eXBlIHsgSG9va0FwaSB9IGZyb20gJy4uLy4uL3NhbGVzL29iamVjdHMvX2hvb2stYXBpJztcbmltcG9ydCB7IGNyZWF0ZUxpbmVJdGVtTnVtYmVyaW5nLCBjcmVhdGVMaW5lSXRlbVByaWNlRmlsbCB9IGZyb20gJy4vX2xpbmUtaXRlbS1wcmljZS1maWxsJztcblxuLyoqXG4gKiBRdW90ZSB0b3RhbCByb2xsdXAuXG4gKlxuICogS2VlcHMgYSBxdW90ZSdzIHByaWNpbmcgKGBzdWJ0b3RhbGAgLyBgZGlzY291bnRfYW1vdW50YCAvIGB0b3RhbF9wcmljZWApIGluXG4gKiBzeW5jIHdpdGggdGhlIHN1bSBvZiBpdHMgbGluZSBpdGVtcy4gRmlyZXMgYWZ0ZXIgYSBxdW90ZSBsaW5lIGl0ZW0gaXNcbiAqIGluc2VydGVkIC8gdXBkYXRlZCAvIGRlbGV0ZWQgKHRoZSBjb25zb2xlIHN1cmZhY2VzIHRoZXNlIGFzIHRoZSBxdW90ZSdzXG4gKiBcIkxpbmUgSXRlbXNcIiByZWxhdGVkIGxpc3QpLlxuICpcbiAqIFdoeSB0aGlzIGV4aXN0czogYHF1b3RlX2dlbmVyYXRpb25gIHNlZWRzIHRoZSBxdW90ZSB0b3RhbHMgZnJvbSB0aGUgc291cmNlXG4gKiBvcHBvcnR1bml0eSdzIGFtb3VudCBhdCBjcmVhdGUgdGltZSwgYnV0IG5vdGhpbmcga2VwdCB0aGVtIGluIHN0ZXAgb25jZSBhXG4gKiByZXAgZWRpdGVkIHRoZSBsaW5lIGl0ZW1zIFx1MjAxNCB0aGUgcXVvdGUgdG90YWwgYW5kIGl0cyBpdGVtaXphdGlvbiBjb3VsZCBkcmlmdC5cbiAqXG4gKiBUb3RhbCBtb2RlbCAobWlycm9ycyB0aGUgcXVvdGVfZ2VuZXJhdGlvbiBmbG93KTpcbiAqICAgc3VidG90YWwgICAgICAgID0gXHUwM0EzIGxpbmUgKHF1YW50aXR5IFx1MDBENyB1bml0X3ByaWNlIFx1MDBENyAoMSBcdTIyMTIgbGluZV9kaXNjb3VudC8xMDApKVxuICogICBkaXNjb3VudF9hbW91bnQgPSBzdWJ0b3RhbCBcdTAwRDcgcXVvdGUuZGlzY291bnQlICAgICAgICAgICAgICAocXVvdGUtbGV2ZWwpXG4gKiAgIHRvdGFsX3ByaWNlICAgICA9IHN1YnRvdGFsIFx1MjIxMiBkaXNjb3VudF9hbW91bnQgKyB0YXggKyBzaGlwcGluZ19oYW5kbGluZ1xuICogUXVvdGUtbGV2ZWwgYHRheGAgYW5kIGBzaGlwcGluZ19oYW5kbGluZ2Agc3RheSBtYW51YWw7IG9ubHkgdGhlIGxpbmUtZGVyaXZlZFxuICogZmlndXJlcyBhcmUgcm9sbGVkIHVwLlxuICpcbiAqIERlc2lnbiBkZWNpc2lvbnMgbWlycm9yIG9wcG9ydHVuaXR5X2xpbmVfaXRlbS5ob29rOlxuICogLSByZWNvbXB1dGUgZnJvbSByYXcgYHF1YW50aXR5L3VuaXRfcHJpY2UvZGlzY291bnRgIChub3QgdGhlIGBzdWJ0b3RhbGBcbiAqICAgRk9STVVMQSBmaWVsZCkgc28gaXQgZG9lc24ndCBkZXBlbmQgb24gZm9ybXVsYSBoeWRyYXRpb24gaW4gdGhlIHNhbmRib3g7XG4gKiAtIGxlYXZlIHRvdGFscyB1bnRvdWNoZWQgd2hlbiB0aGVyZSBhcmUgTk8gbGluZXMgKG5ldmVyIHplcm8gYSBxdW90ZSB3aG9zZVxuICogICB0b3RhbHMgY2FtZSBmcm9tIHRoZSBvcHBvcnR1bml0eSk7XG4gKiAtIHNraXAgYWNjZXB0ZWQgLyBleHBpcmVkIHF1b3RlcyBcdTIwMTQgdGhlIHJvbGx1cCBydW5zIHN5c3RlbS1jb250ZXh0IGFuZCB3b3VsZFxuICogICBvdGhlcndpc2UgYnlwYXNzIHRoZSBxdW90ZSBmcmVlemUgZ3VhcmQgYW5kIHJld3JpdGUgYSBzZXR0bGVkIHF1b3RlO1xuICogLSBhc3luYyArIG9uRXJyb3I6J2xvZycgXHUyMDE0IGEgZGVyaXZlZCBjb252ZW5pZW5jZSwgbmV2ZXIgYmxvY2tzIHRoZSBsaW5lIHdyaXRlO1xuICogLSBoYW5kbGVzIHJlLXBhcmVudGluZyAob2xkICsgbmV3IHF1b3RlKS5cbiAqL1xuLyoqXG4gKiBMaW5lLWl0ZW0gcHJpY2UgZmlsbCBcdTIwMTQgb25lIGltcGxlbWVudGF0aW9uIHNoYXJlZCB3aXRoIHRoZSBvcHBvcnR1bml0eSBsaW5lXG4gKiBpdGVtOyBzZWUgYF9saW5lLWl0ZW0tcHJpY2UtZmlsbC50c2AgZm9yIHRoZSBiZWhhdmlvdXIgYW5kIHRoZSBzYW5kYm94IGNhdmVhdC5cbiAqL1xuY29uc3QgcXVvdGVMaW5lSXRlbVByaWNlRmlsbDogSG9vayA9IGNyZWF0ZUxpbmVJdGVtUHJpY2VGaWxsKFxuICAnY3JtX3F1b3RlX2xpbmVfaXRlbScsXG4gICdxdW90ZV9saW5lX2l0ZW1fcHJpY2VfZmlsbCcsXG4pO1xuXG4vKiogYGxpbmVfbnVtYmVyYCBhc3NpZ25lciBcdTIwMTQgc2VlIGBfbGluZS1pdGVtLXByaWNlLWZpbGwudHNgICgjMTgyOCkuICovXG5jb25zdCBxdW90ZUxpbmVJdGVtTnVtYmVyaW5nOiBIb29rID0gY3JlYXRlTGluZUl0ZW1OdW1iZXJpbmcoXG4gICdjcm1fcXVvdGVfbGluZV9pdGVtJyxcbiAgJ3F1b3RlX2xpbmVfaXRlbV9saW5lX251bWJlcicsXG4pO1xuXG5jb25zdCBxdW90ZVRvdGFsUm9sbHVwOiBIb29rID0ge1xuICBuYW1lOiAncXVvdGVfdG90YWxfcm9sbHVwJyxcbiAgb2JqZWN0OiAnY3JtX3F1b3RlX2xpbmVfaXRlbScsXG4gIGV2ZW50czogWydhZnRlckluc2VydCcsICdhZnRlclVwZGF0ZScsICdhZnRlckRlbGV0ZSddLFxuICBwcmlvcml0eTogMzAwLFxuICBhc3luYzogdHJ1ZSxcbiAgb25FcnJvcjogJ2xvZycsXG4gIGRlc2NyaXB0aW9uOiAnUmVjb21wdXRlIHBhcmVudCBxdW90ZSBzdWJ0b3RhbC9kaXNjb3VudC90b3RhbCBmcm9tIGl0cyBsaW5lIGl0ZW1zLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXBpKSByZXR1cm47XG4gICAgY29uc3QgeyBpbnB1dCwgcHJldmlvdXMgfSA9IGN0eDtcbiAgICBjb25zdCBudW0gPSAodjogdW5rbm93bik6IG51bWJlciA9PiAodHlwZW9mIHYgPT09ICdudW1iZXInID8gdiA6IDApO1xuXG4gICAgY29uc3QgcXVvdGVJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHYgb2YgW2lucHV0Py5jcm1fcXVvdGUsIHByZXZpb3VzPy5jcm1fcXVvdGVdKSB7XG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYpIHF1b3RlSWRzLmFkZCh2KTtcbiAgICB9XG4gICAgaWYgKHF1b3RlSWRzLnNpemUgPT09IDApIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgcXVvdGVJZCBvZiBxdW90ZUlkcykge1xuICAgICAgY29uc3QgcXVvdGUgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fcXVvdGUnKS5maW5kT25lKHtcbiAgICAgICAgd2hlcmU6IHsgaWQ6IHF1b3RlSWQgfSxcbiAgICAgICAgZmllbGRzOiBbJ2lkJywgJ3N0YXR1cycsICdkaXNjb3VudCcsICd0YXgnLCAnc2hpcHBpbmdfaGFuZGxpbmcnXSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFxdW90ZSkgY29udGludWU7XG4gICAgICBjb25zdCBzdGF0dXMgPSB0eXBlb2YgcXVvdGUuc3RhdHVzID09PSAnc3RyaW5nJyA/IHF1b3RlLnN0YXR1cyA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChzdGF0dXMgPT09ICdhY2NlcHRlZCcgfHwgc3RhdHVzID09PSAnZXhwaXJlZCcpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBsaW5lcyA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9xdW90ZV9saW5lX2l0ZW0nKS5maW5kKHtcbiAgICAgICAgd2hlcmU6IHsgY3JtX3F1b3RlOiBxdW90ZUlkIH0sXG4gICAgICAgIGZpZWxkczogWydxdWFudGl0eScsICd1bml0X3ByaWNlJywgJ2Rpc2NvdW50J10sXG4gICAgICAgIHRvcDogNTAwMCxcbiAgICAgIH0pO1xuICAgICAgLy8gTm8gbGluZXMgbGVmdCBcdTIxOTIgbGVhdmUgdGhlIGZsb3ctc2VlZGVkIHRvdGFscyBhcy1pcyAoc2VlIGRlc2lnbiBub3RlKS5cbiAgICAgIGlmICghbGluZXMgfHwgbGluZXMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgbGV0IHN1YnRvdGFsID0gMDtcbiAgICAgIGZvciAoY29uc3QgbCBvZiBsaW5lcykgc3VidG90YWwgKz0gbnVtKGwucXVhbnRpdHkpICogbnVtKGwudW5pdF9wcmljZSkgKiAoMSAtIG51bShsLmRpc2NvdW50KSAvIDEwMCk7XG4gICAgICBzdWJ0b3RhbCA9IE1hdGgucm91bmQoc3VidG90YWwgKiAxMDApIC8gMTAwO1xuXG4gICAgICBjb25zdCBkaXNjb3VudEFtb3VudCA9IE1hdGgucm91bmQoc3VidG90YWwgKiAobnVtKHF1b3RlLmRpc2NvdW50KSAvIDEwMCkgKiAxMDApIC8gMTAwO1xuICAgICAgY29uc3QgdG90YWwgPSBNYXRoLnJvdW5kKChzdWJ0b3RhbCAtIGRpc2NvdW50QW1vdW50ICsgbnVtKHF1b3RlLnRheCkgKyBudW0ocXVvdGUuc2hpcHBpbmdfaGFuZGxpbmcpKSAqIDEwMCkgLyAxMDA7XG5cbiAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV9xdW90ZScpLnVwZGF0ZShcbiAgICAgICAgeyBpZDogcXVvdGVJZCwgc3VidG90YWwsIGRpc2NvdW50X2Ftb3VudDogZGlzY291bnRBbW91bnQsIHRvdGFsX3ByaWNlOiB0b3RhbCB9LFxuICAgICAgICB7IHdoZXJlOiB7IGlkOiBxdW90ZUlkIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgW3F1b3RlTGluZUl0ZW1QcmljZUZpbGwsIHF1b3RlTGluZUl0ZW1OdW1iZXJpbmcsIHF1b3RlVG90YWxSb2xsdXBdO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL29iamVjdHMvY2FtcGFpZ24uaG9vay50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbi5ob29rLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tDb250ZXh0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEhvb2tBcGkgfSBmcm9tICcuLi8uLi9zYWxlcy9vYmplY3RzL19ob29rLWFwaSc7XG5cbi8qKlxuICogQ2FtcGFpZ24gbGlmZWN5Y2xlIGhvb2tzLlxuICpcbiAqIC0gYGNhbXBhaWduX3ZhbGlkYXRpb25gIFx1MjAxNCBzdGFydC9lbmQgZGF0ZSBvcmRlcmluZywgYW5kIG5vIGBpbl9wcm9ncmVzc2BcbiAqICAgd2l0aG91dCBib3RoIGRhdGVzLlxuICogLSBgY2FtcGFpZ25fbWV0cmljc19yZWZyZXNoYCBcdTIwMTQgcmVjb21wdXRlIHRoZSBtZXRyaWMgYmxvY2sgd2hlbiB0aGUgY2FtcGFpZ24nc1xuICogICBvd24gc3RhdHVzIG1vdmVzLlxuICogVGhlIG90aGVyIHR3byBob29rcyBvZiB0aGlzIGZhbWlseSBhcmUgYXR0YWNoZWQgdG8gb2JqZWN0cyB0aGUgU0FMRVMgcGFja2FnZVxuICogb3ducywgc28gc2luY2UgdGhlIEFEUi0wMTMwIGxheW91dCB0aGV5IHNpdCBiZXNpZGUgdGhvc2Ugb2JqZWN0cyBpbnN0ZWFkXG4gKiAocGxhbiBpdGVtIDYgXHUyMDE0IGNvLWxvY2F0aW9uIGlzIHdoYXQgZW5mb3JjZXMgUjQpOlxuICpcbiAqIC0gYGNhbXBhaWduX2F0dHJpYnV0aW9uX3JlZnJlc2hgIChgY3JtX29wcG9ydHVuaXR5YCkgXHUyMDE0XG4gKiAgIGBzcmMvc2FsZXMvb2JqZWN0cy9vcHBvcnR1bml0eS5jYW1wYWlnbi1tZXRyaWNzLmhvb2sudHNgXG4gKiAtIGBjYW1wYWlnbl9sZWFkX2NvbnZlcnNpb25fcmVmcmVzaGAgKGBjcm1fbGVhZGApIFx1MjAxNFxuICogICBgc3JjL3NhbGVzL29iamVjdHMvbGVhZC5jYW1wYWlnbi1tZXRyaWNzLmhvb2sudHNgXG4gKlxuICogVGhlIG1lbWJlcnNoaXAgc2lkZSBvZiB0aGUgc2FtZSByZWNvbXB1dGUgbGl2ZXMgaW4gYGNhbXBhaWduX21lbWJlci5ob29rLnRzYC5cbiAqIFRvZ2V0aGVyIHRoZXNlIGFyZSB3aGF0IHJlcGxhY2VkIHRoZSBzaW5nbGUgY29tcGxldGlvbi10aW1lIHNuYXBzaG90ICgjNTk3KTpcbiAqIGV2ZXJ5IGlucHV0IGEgY2FtcGFpZ24gbWV0cmljIGRlcml2ZXMgZnJvbSBub3cgaGFzIGEgdHJpZ2dlciB0aGF0IHJlZnJlc2hlc1xuICogdGhlIG1ldHJpYyB3aGVuIGl0IGNoYW5nZXMsIHNvIGEgTElWRSBjYW1wYWlnbiByZXBvcnRzIGxpdmUgbnVtYmVycyBpbnN0ZWFkXG4gKiBvZiB6ZXJvcyB1bnRpbCB0aGUgZGF5IGl0IGVuZHMuXG4gKlxuICogXHUyNkEwXHVGRTBGIFdIWSBUSEUgUkVDT01QVVRFIElTIFdSSVRURU4gT1VUIEZPVVIgVElNRVMuXG4gKlxuICogTDIgaG9vayBib2RpZXMgYXJlIGxvd2VyZWQgdG8gbWV0YWRhdGEgYW5kIGV2YWx1YXRlZCBCT0RZLU9OTFkgaW4gdGhlIFF1aWNrSlNcbiAqIHNhbmRib3g6IGEgaGFuZGxlciBjYW5ub3QgcmVhY2ggbW9kdWxlIHNjb3BlIGF0IHJ1bnRpbWUsIHNvIGEgc2hhcmVkXG4gKiBgcmVmcmVzaENhbXBhaWduTWV0cmljcygpYCBpbXBvcnQgd291bGQgYmUgYSBmcmVlIGlkZW50aWZpZXIgXHUyMDE0IHRoZSBDTEkgYnVpbGRcbiAqIHNpbGVudGx5IGRlY2xpbmVzIHRvIGxvd2VyIHRoZSBoYW5kbGVyLCBrZWVwcyBpdCBpbiBhIGJ1bmRsZWQgcnVudGltZSBmaWxlLFxuICogYW5kIHRoZSBob29rIHN0b3BzIGJlaW5nIGRlcGxveWFibGUgYXMgcHVyZSBtZXRhZGF0YSAodGhlIGJ1aWxkIHNheXMgc28gaW5cbiAqIG9uZSBsaW5lIG5vYm9keSByZWFkcykuIGB0ZXN0L2FjdGlvbi1zYW5kYm94LnRlc3QudHNgIGlzIHdoYXQgY2F0Y2hlcyBpdC5cbiAqXG4gKiBTbyB0aGUgYXJpdGhtZXRpYyBpcyBpbmxpbmVkIHBlciBoYW5kbGVyLCB0aGUgc2FtZSB3YXkgYGFjY291bnRfcHJvdGVjdGlvbmBcbiAqIGlubGluZXMgdGhlIHRlcnJpdG9yeSB0YWJsZSByYXRoZXIgdGhhbiBpbXBvcnRpbmcgYF90ZXJyaXRvcnkudHNgLiBUaGVcbiAqIGR1cGxpY2F0aW9uIGlzIE5PVCB0cnVzdGVkOiBgdGVzdC9jYW1wYWlnbi1tZW1iZXItbGlmZWN5Y2xlLnRlc3QudHNgIGxvd2Vyc1xuICogYWxsIGZvdXIgYm9kaWVzIGFuZCBhc3NlcnRzIHRoZSByZWNvbXB1dGUgYmxvY2sgaXMgY2hhcmFjdGVyLWlkZW50aWNhbCBhY3Jvc3NcbiAqIHRoZW0sIHNvIGEgZml4IGxhbmRpbmcgb24gb25lIGNvcHkgYW5kIHNraXBwaW5nIHRocmVlIGZhaWxzIGEgdGVzdCBpbnN0ZWFkIG9mXG4gKiBzaGlwcGluZyBmb3VyIGRlZmluaXRpb25zIG9mIGBudW1fc2VudGAuIFNwbGl0dGluZyB0aGUgZm91ciBhY3Jvc3MgdGhyZWVcbiAqIGZpbGVzIGJ5IG93bmluZyBvYmplY3QgY2hhbmdlZCBub25lIG9mIHRoYXQgXHUyMDE0IHRoZSBzdWl0ZSByZWFkcyB0aGVtIGJ5IGhvb2tcbiAqIG5hbWUsIG5vdCBieSBmaWxlLlxuICovXG5cbmNvbnN0IGNhbXBhaWduVmFsaWRhdGlvbjogSG9vayA9IHtcbiAgbmFtZTogJ2NhbXBhaWduX3ZhbGlkYXRpb24nLFxuICBvYmplY3Q6ICdjcm1fY2FtcGFpZ24nLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICBwcmlvcml0eTogMjAwLFxuICBkZXNjcmlwdGlvbjogJ1ZhbGlkYXRlIGNhbXBhaWduIGRhdGUgcmFuZ2UgYW5kIHJlcXVpcmVkIGZpZWxkcyBwZXIgc3RhdHVzLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgLy8gVGhlIHJlZnVzYWwgZW52ZWxvcGUgKCMxMDc1KS4gTWlycm9yZWQgZnJvbSBgc3JjL3NhbGVzL29iamVjdHMvX3JlZnVzYWwudHNgIGJlY2F1c2UgYVxuICAgIC8vIGxvd2VyZWQgYm9keSBoYXMgbm8gbW9kdWxlIHNjb3BlIGFuZCBgZXh0cmFjdEhvb2tCb2R5YCBUSFJPV1Mgb24gYW5cbiAgICAvLyBpbXBvcnQ7IGB0ZXN0L3JlZnVzYWwtZW52ZWxvcGUudGVzdC50c2AgcGlucyBldmVyeSBjb3B5IGFnYWluc3QgaXQuXG4gICAgZnVuY3Rpb24gcmVmdXNlKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29kZTogc3RyaW5nLFxuICAgICAgc3RhdHVzOiBudW1iZXIsXG4gICAgICB1c2VyTWVzc2FnZTogc3RyaW5nID0gbWVzc2FnZSxcbiAgICApOiBFcnJvciB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSkgYXMgRXJyb3IgJiB7XG4gICAgICAgIGNvZGU6IHN0cmluZztcbiAgICAgICAgc3RhdHVzOiBudW1iZXI7XG4gICAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmc7XG4gICAgICB9O1xuICAgICAgZXJyLmNvZGUgPSBjb2RlO1xuICAgICAgZXJyLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgIGVyci51c2VyTWVzc2FnZSA9IHVzZXJNZXNzYWdlO1xuICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gY3R4O1xuICAgIGNvbnN0IHByZXZpb3VzID0gY3R4LnByZXZpb3VzO1xuICAgIGNvbnN0IHN0YXJ0ID1cbiAgICAgICh0eXBlb2YgaW5wdXQuc3RhcnRfZGF0ZSA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3RhcnRfZGF0ZSkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXM/LnN0YXJ0X2RhdGUgPT09ICdzdHJpbmcnICYmIChwcmV2aW91cy5zdGFydF9kYXRlIGFzIHN0cmluZykpIHx8XG4gICAgICB1bmRlZmluZWQ7XG4gICAgY29uc3QgZW5kID1cbiAgICAgICh0eXBlb2YgaW5wdXQuZW5kX2RhdGUgPT09ICdzdHJpbmcnICYmIGlucHV0LmVuZF9kYXRlKSB8fFxuICAgICAgKHR5cGVvZiBwcmV2aW91cz8uZW5kX2RhdGUgPT09ICdzdHJpbmcnICYmIChwcmV2aW91cy5lbmRfZGF0ZSBhcyBzdHJpbmcpKSB8fFxuICAgICAgdW5kZWZpbmVkO1xuICAgIGlmIChzdGFydCAmJiBlbmQgJiYgc3RhcnQgPiBlbmQpIHtcbiAgICAgIHRocm93IHJlZnVzZShgQ2FtcGFpZ24gc3RhcnRfZGF0ZSAoJHtzdGFydH0pIG11c3Qgbm90IGJlIGFmdGVyIGVuZF9kYXRlICgke2VuZH0pLmAsICdWQUxJREFUSU9OX0ZBSUxFRCcsIDQwMCk7XG4gICAgfVxuICAgIGNvbnN0IHN0YXR1cyA9XG4gICAgICAodHlwZW9mIGlucHV0LnN0YXR1cyA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3RhdHVzKSB8fFxuICAgICAgKHR5cGVvZiBwcmV2aW91cz8uc3RhdHVzID09PSAnc3RyaW5nJyAmJiAocHJldmlvdXMuc3RhdHVzIGFzIHN0cmluZykpIHx8XG4gICAgICB1bmRlZmluZWQ7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJyAmJiAoIXN0YXJ0IHx8ICFlbmQpKSB7XG4gICAgICB0aHJvdyByZWZ1c2UoJ0NhbXBhaWduIGNhbm5vdCBtb3ZlIHRvIGluX3Byb2dyZXNzIHdpdGhvdXQgYm90aCBzdGFydF9kYXRlIGFuZCBlbmRfZGF0ZS4nLCAnVkFMSURBVElPTl9GQUlMRUQnLCA0MDApO1xuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogUmVjb21wdXRlIHRoaXMgY2FtcGFpZ24ncyBtZXRyaWNzIHdoZW4gaXRzIG93biBzdGF0dXMgbW92ZXMuXG4gKlxuICogXHUyNkEwXHVGRTBGIFJFQ1VSU0lPTi4gVGhpcyBob29rIHdyaXRlcyB0byB0aGUgb2JqZWN0IGl0IGxpc3RlbnMgb24sIHNvIGl0cyB0cmlnZ2VyXG4gKiBoYXMgdG8gYmUgYSBjb25kaXRpb24gaXRzIG93biB3cml0ZSBjYW5ub3Qgc2F0aXNmeS4gSXQgaXM6IHRoZSB3cml0ZSBjYXJyaWVzXG4gKiB0aGUgbWV0cmljIGJsb2NrIGFuZCBub3RoaW5nIGVsc2UsIGFuZCB0aGlzIGZpcmVzIG9ubHkgb24gYSBgc3RhdHVzYFxuICogVFJBTlNJVElPTiBcdTIwMTQgYGlucHV0LnN0YXR1c2AgcHJlc2VudCBBTkQgZGlmZmVyZW50IGZyb20gYHByZXZpb3VzLnN0YXR1c2AuIEFcbiAqIG1ldHJpYy1vbmx5IHdyaXRlIGhhcyBubyBgc3RhdHVzYCBrZXkgYXQgYWxsLCBzbyB0aGUgcmUtZW50cnkgZW5kcyBhdCB0aGVcbiAqIGZpcnN0IGd1YXJkLiBgQ0FNUEFJR05fTUVUUklDX1dSSVRFX0tFWVNgIGF0IHRoZSBib3R0b20gb2YgdGhpcyBmaWxlIHN0YXRlc1xuICogdGhlIG90aGVyIGhhbGYgb2YgdGhhdCBjb250cmFjdCBhcyBkYXRhIHRoZSBydW50aW1lIHRlc3QgY2hlY2tzIHRoZSByZWNvcmRlZFxuICogd3JpdGUgYWdhaW5zdCwgc28gYSBmdXR1cmUgd3JpdGVyIHRoYXQgYWRkcyBhIG5vbi1tZXRyaWMga2V5IHRvIHRoZSByZWZyZXNoXG4gKiB3cml0ZSBmYWlscyBhIHRlc3QgaW5zdGVhZCBvZiBsb29waW5nIGluIHByb2R1Y3Rpb24uXG4gKlxuICogVGhlIG9sZCBgY2FtcGFpZ25fc25hcHNob3RfbWV0cmljc2AgZmlyZWQgb24gYFx1MjE5MiBjb21wbGV0ZWRgIGFuZCBub3RoaW5nIGVsc2UsXG4gKiB3aGljaCBtZWFudCBhIGNhbXBhaWduIHJlcG9ydGVkIHplcm9zIGZvciBpdHMgZW50aXJlIHVzZWZ1bCBsaWZlIGFuZCBiZWNhbWVcbiAqIGFjY3VyYXRlIG9uIHRoZSBkYXkgZXZlcnlib2R5IHN0b3BwZWQgbG9va2luZyBhdCBpdC4gQ29tcGxldGlvbiBpcyBub3cgc2ltcGx5XG4gKiBvbmUgb2YgdGhlIHRyYW5zaXRpb25zIHRoaXMgY2F0Y2hlcy5cbiAqL1xuY29uc3QgY2FtcGFpZ25NZXRyaWNzUmVmcmVzaDogSG9vayA9IHtcbiAgbmFtZTogJ2NhbXBhaWduX21ldHJpY3NfcmVmcmVzaCcsXG4gIG9iamVjdDogJ2NybV9jYW1wYWlnbicsXG4gIGV2ZW50czogWydhZnRlclVwZGF0ZSddLFxuICBwcmlvcml0eTogODAwLFxuICBhc3luYzogdHJ1ZSxcbiAgb25FcnJvcjogJ2xvZycsXG4gIGRlc2NyaXB0aW9uOiAnUmVjb21wdXRlIHRoZSBjYW1wYWlnbiBtZXRyaWMgYmxvY2sgd2hlbmV2ZXIgdGhlIGNhbXBhaWduIHN0YXR1cyBtb3Zlcy4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICAvLyBUaGUgcmVjdXJzaW9uIGd1YXJkLCBzdGF0ZWQgcG9zaXRpdmVseTogb25seSBhIHN0YXR1cyBUUkFOU0lUSU9OIHJ1bnMuXG4gICAgaWYgKHR5cGVvZiBpbnB1dC5zdGF0dXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG4gICAgaWYgKHByZXZpb3VzICYmIGlucHV0LnN0YXR1cyA9PT0gcHJldmlvdXMuc3RhdHVzKSByZXR1cm47XG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXBpKSByZXR1cm47XG4gICAgY29uc3QgY2FtcGFpZ25JZCA9XG4gICAgICAodHlwZW9mIGlucHV0LmlkID09PSAnc3RyaW5nJyAmJiBpbnB1dC5pZCkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXM/LmlkID09PSAnc3RyaW5nJyA/IChwcmV2aW91cy5pZCBhcyBzdHJpbmcpIDogJycpO1xuICAgIGlmICghY2FtcGFpZ25JZCkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgaWQgb2YgW2NhbXBhaWduSWRdKSB7XG4gICAgICAvLyBcdTI1MDBcdTI1MDAgcmVjb21wdXRlIFx1MjUwMFx1MjUwMCBpZGVudGljYWwgaW4gYWxsIGZvdXIgcmVmcmVzaCBob29rczsgc2VlIHRoZSBoZWFkZXIuXG4gICAgICBjb25zdCBtZW1iZXJSb3dzID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduX21lbWJlcicpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGlkIH0sIGZpZWxkczogWydjcm1fbGVhZCcsICdzdGF0dXMnXSwgdG9wOiA1MDAwLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsZWFkSWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFxuICAgICAgICBtZW1iZXJSb3dzLm1hcCgocikgPT4gKHR5cGVvZiByLmNybV9sZWFkID09PSAnc3RyaW5nJyA/IHIuY3JtX2xlYWQgOiAnJykpLmZpbHRlcihCb29sZWFuKSxcbiAgICAgICkpO1xuICAgICAgY29uc3QgY29udmVydGVkTGVhZHMgPSBsZWFkSWRzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhd2FpdCBhcGkub2JqZWN0KCdjcm1fbGVhZCcpLmNvdW50KHsgd2hlcmU6IHsgaWQ6IHsgJGluOiBsZWFkSWRzIH0sIGlzX2NvbnZlcnRlZDogdHJ1ZSB9IH0pXG4gICAgICAgIDogMDtcbiAgICAgIGNvbnN0IG51bU9wcG9ydHVuaXRpZXMgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fb3Bwb3J0dW5pdHknKS5jb3VudCh7IHdoZXJlOiB7IGNybV9jYW1wYWlnbjogaWQgfSB9KTtcbiAgICAgIGNvbnN0IG51bVdvbiA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9vcHBvcnR1bml0eScpLmNvdW50KHsgd2hlcmU6IHsgY3JtX2NhbXBhaWduOiBpZCwgc3RhZ2U6ICdjbG9zZWRfd29uJyB9IH0pO1xuICAgICAgY29uc3Qgd29uUm93cyA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9vcHBvcnR1bml0eScpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGlkLCBzdGFnZTogJ2Nsb3NlZF93b24nIH0sIGZpZWxkczogWydhbW91bnQnXSwgdG9wOiA1MDAwLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBhY3R1YWxSZXZlbnVlID0gd29uUm93cy5yZWR1Y2UoXG4gICAgICAgIChzdW0sIHJvdykgPT4gc3VtICsgKHR5cGVvZiByb3cuYW1vdW50ID09PSAnbnVtYmVyJyA/IHJvdy5hbW91bnQgOiBOdW1iZXIocm93LmFtb3VudCkgfHwgMCksIDAsXG4gICAgICApO1xuICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduJykudXBkYXRlKHtcbiAgICAgICAgaWQsXG4gICAgICAgIG51bV9zZW50OiBtZW1iZXJSb3dzLmxlbmd0aCxcbiAgICAgICAgbnVtX3Jlc3BvbnNlczogbWVtYmVyUm93cy5maWx0ZXIoKHIpID0+IHIuc3RhdHVzID09PSAncmVzcG9uZGVkJyB8fCByLnN0YXR1cyA9PT0gJ2NvbnZlcnRlZCcpLmxlbmd0aCxcbiAgICAgICAgbnVtX2xlYWRzOiBsZWFkSWRzLmxlbmd0aCxcbiAgICAgICAgbnVtX2NvbnZlcnRlZF9sZWFkczogY29udmVydGVkTGVhZHMsXG4gICAgICAgIG51bV9vcHBvcnR1bml0aWVzOiBudW1PcHBvcnR1bml0aWVzLFxuICAgICAgICBudW1fd29uX29wcG9ydHVuaXRpZXM6IG51bVdvbixcbiAgICAgICAgYWN0dWFsX3JldmVudWU6IGFjdHVhbFJldmVudWUsXG4gICAgICB9LCB7IHdoZXJlOiB7IGlkIH0gfSk7XG4gICAgICAvLyBcdTI1MDBcdTI1MDAgL3JlY29tcHV0ZSBcdTI1MDBcdTI1MDBcbiAgICB9XG4gIH0sXG59O1xuXG4vKipcbiAqIFRoZSBtZXRyaWMgYmxvY2sgdGhlc2UgaG9va3Mgb3duLiBOb3RoaW5nIGVsc2UgbWF5IHdyaXRlIHRoZXNlIGNvbHVtbnMuXG4gKlxuICogTW9kdWxlIHNjb3BlLCBkZWxpYmVyYXRlbHkgT1VUU0lERSBldmVyeSBoYW5kbGVyOiB0aGlzIGlzIHJlYWQgYnkgdGhlIHRlc3RzLFxuICogbmV2ZXIgYnkgYSBzYW5kYm94ZWQgYm9keSBcdTIwMTQgYSBib2R5IHRoYXQgcmVmZXJlbmNlZCBpdCB3b3VsZCBzdG9wIGxvd2VyaW5nXG4gKiAoc2VlIHRoZSBoZWFkZXIpLlxuICovXG5leHBvcnQgY29uc3QgQ0FNUEFJR05fTUVUUklDX0ZJRUxEUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICdudW1fc2VudCcsXG4gICdudW1fcmVzcG9uc2VzJyxcbiAgJ251bV9sZWFkcycsXG4gICdudW1fY29udmVydGVkX2xlYWRzJyxcbiAgJ251bV9vcHBvcnR1bml0aWVzJyxcbiAgJ251bV93b25fb3Bwb3J0dW5pdGllcycsXG4gICdhY3R1YWxfcmV2ZW51ZScsXG5dO1xuXG4vKipcbiAqIFRoZSByZWN1cnNpb24gY29udHJhY3Qgb2YgYGNhbXBhaWduX21ldHJpY3NfcmVmcmVzaGAsIGFzc2VydGVkIHJhdGhlciB0aGFuXG4gKiBkZXNjcmliZWQ6IHRoZSByZWZyZXNoIHdyaXRlIG1heSBjYXJyeSB0aGUgbWV0cmljIGJsb2NrIGFuZCBgaWRgLCBub3RoaW5nXG4gKiBlbHNlLiBBIGNvbW1lbnQgY2Fubm90IGZhaWw7IHRoaXMgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSByZWNvcmRlZCB3cml0ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IENBTVBBSUdOX01FVFJJQ19XUklURV9LRVlTOiByZWFkb25seSBzdHJpbmdbXSA9IFsnaWQnLCAuLi5DQU1QQUlHTl9NRVRSSUNfRklFTERTXTtcblxuZXhwb3J0IGRlZmF1bHQgW2NhbXBhaWduVmFsaWRhdGlvbiwgY2FtcGFpZ25NZXRyaWNzUmVmcmVzaF07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbl9tZW1iZXIuaG9vay50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbl9tZW1iZXIuaG9vay50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBIb29rLCBIb29rQ29udGV4dCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHR5cGUgeyBIb29rQXBpIH0gZnJvbSAnLi4vLi4vc2FsZXMvb2JqZWN0cy9faG9vay1hcGknO1xuXG4vKipcbiAqIENhbXBhaWduIG1lbWJlciBob29rcyBcdTIwMTQgdGhlIHdyaXRlcnMgdGhhdCBtYWtlIHRoZSB0cmltbWVkIGxpZmVjeWNsZSBob25lc3RcbiAqICgjNTk3KS5cbiAqXG4gKiBgY3JtX2NhbXBhaWduX21lbWJlcmAgd2FzIHRoZSBhcHAncyBjbGVhcmVzdCBjYXNlIG9mIGRlY2xhcmVkLWJ1dC1pbmVydFxuICogbWV0YWRhdGE6IGEgc2V2ZW4tdmFsdWUgZW5nYWdlbWVudCBsaWZlY3ljbGUgYW5kIHR3byB0cmFja2VyIHN0YW1wcywgd2l0aCB0aGVcbiAqIGVucm9sbG1lbnQgZmxvdyB3cml0aW5nIGBzZW50YCBhbmQgbm90aGluZyB3cml0aW5nIGFueXRoaW5nIGVsc2UsIGV2ZXIuIFRoZVxuICogb2JqZWN0IHRyaW0gcmVtb3ZlZCB0aGUgdmFsdWVzIG5vIHdyaXRlciBjb3VsZCByZWFjaDsgdGhlc2UgdGhyZWUgaG9va3MgYXJlXG4gKiB0aGUgb3RoZXIgaGFsZiBvZiB0aGF0IHRyYWRlIFx1MjAxNCB0aGV5IGdpdmUgZXZlcnkgdmFsdWUgdGhhdCBTVVJWSVZFRCBhIHdyaXRlclxuICogdGhhdCBhY3R1YWxseSBydW5zLlxuICpcbiAqIC0gYGNhbXBhaWduX21lbWJlcl9saWZlY3ljbGVgIChiZWZvcmUpIFx1MjAxNCBrZWVwcyBgaGFzX3Jlc3BvbmRlZGAgL1xuICogICBgcmVzcG9uc2VfZGF0ZWAgaW4gbG9ja3N0ZXAgd2l0aCBgc3RhdHVzYCwgd2hpY2hldmVyIGVuZCBhIGNhbGxlciB3cml0ZXMuXG4gKiAtIGBjYW1wYWlnbl9tZW1iZXJfb3B0b3V0X3N5bmNgIChhZnRlcikgXHUyMDE0IHJvdW5kLXRyaXBzIGB1bnN1YnNjcmliZWRgIHRvIHRoZVxuICogICBtZW1iZXIncyBsZWFkL2NvbnRhY3QgYGVtYWlsX29wdF9vdXRgLlxuICogLSBgY2FtcGFpZ25fbWVtYmVyX21ldHJpY3NfcmVmcmVzaGAgKGFmdGVyKSBcdTIwMTQgcmVjb21wdXRlcyB0aGUgY2FtcGFpZ24nc1xuICogICBtZXRyaWMgYmxvY2sgb24gZXZlcnkgbWVtYmVyc2hpcCBjaGFuZ2UsIHdoaWNoIGlzIHdoYXQgbWFrZXMgYSBsaXZlXG4gKiAgIGNhbXBhaWduIHNob3cgbGl2ZSBudW1iZXJzLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBUaGUgcmVjb21wdXRlIGJsb2NrIGJlbG93IGlzIHdyaXR0ZW4gb3V0IGhlcmUgYW5kIHRocmVlIG1vcmUgdGltZXMgaW5cbiAqIGBjYW1wYWlnbi5ob29rLnRzYCwgZGVsaWJlcmF0ZWx5OiBhIHNhbmRib3hlZCBob29rIGJvZHkgY2Fubm90IHJlYWNoIG1vZHVsZVxuICogc2NvcGUsIHNvIGEgc2hhcmVkIGltcG9ydCB3b3VsZCBzdG9wIHRoZSBoYW5kbGVyIGxvd2VyaW5nIHRvIG1ldGFkYXRhIChzZWVcbiAqIHRoYXQgZmlsZSdzIGhlYWRlciBmb3IgdGhlIGZ1bGwgcmVhc29uaW5nKS4gQWxsIGZvdXIgY29waWVzIGFyZSBhc3NlcnRlZFxuICogY2hhcmFjdGVyLWlkZW50aWNhbCBieSBgdGVzdC9jYW1wYWlnbi1tZW1iZXItbGlmZWN5Y2xlLnRlc3QudHNgLlxuICovXG5cbi8qKlxuICogS2VlcCB0aGUgcmVzcG9uc2Ugc3VtbWFyeSBmaWVsZHMgaG9uZXN0LCBvbiBldmVyeSB3cml0ZSBwYXRoLlxuICpcbiAqIFRoZXJlIGFyZSB0d28gd2F5cyBhIG1lbWJlciBiZWNvbWVzIFwicmVzcG9uZGVkXCIgYW5kIHRoZXkgbXVzdCBub3QgZGlzYWdyZWU6XG4gKiB0aGUgYG1hcmtfcmVzcG9uZGVkYCBhY3Rpb24gKHdoaWNoIHN0YW1wcyBhbGwgdGhyZWUgZmllbGRzIGl0c2VsZikgYW5kIGEgcmVwXG4gKiBmbGlwcGluZyBgc3RhdHVzYCBvbiB0aGUgcmVjb3JkIGRldGFpbCBwYWdlICh3aGljaCBzdGFtcHMgb25seSBgc3RhdHVzYCkuIFRoZVxuICogc2Vjb25kIHBhdGggaXMgd2h5IHRoaXMgaG9vayBleGlzdHMgXHUyMDE0IHdpdGhvdXQgaXQsIGEgaGFuZC1mbGlwcGVkIG1lbWJlciByZWFkc1xuICogYFJlc3BvbmRlZGAgb24gdGhlIHN0YXR1cyBiYWRnZSBhbmQgYEhhcyBSZXNwb25kZWQ6IGZhbHNlYCB0d28gcm93cyBiZWxvdyBpdCxcbiAqIGFuZCBgdGVzdC9zZWVkLWNvbnNpc3RlbmN5LnRlc3QudHNgJ3MgXCJ0cmFjayB0aGUgcmVzcG9uZGVkIHN0YXR1cyBleGFjdGx5XCJcbiAqIGNvbnRyYWN0IGhvbGRzIGZvciBzZWVkZWQgcm93cyB3aGlsZSBydW50aW1lIHJvd3MgZHJpZnQgb3V0IG9mIGl0LlxuICpcbiAqIGBjb252ZXJ0ZWRgIGNvdW50cyBhcyByZXNwb25kZWQgdG9vOiBhIG1lbWJlciBjYW5ub3QgY29udmVydCB3aXRob3V0IGhhdmluZ1xuICogcmVzcG9uZGVkIGZpcnN0LCBhbmQgYGhhc19yZXNwb25kZWRgIGlzIHRoZSBcImRpZCB0aGlzIHBlcnNvbiBldmVyIGVuZ2FnZVwiXG4gKiBmbGFnIHRoZSByZXNwb25zZSBzdXJmYWNlcyBmaWx0ZXIgb24uXG4gKi9cbmNvbnN0IGNhbXBhaWduTWVtYmVyTGlmZWN5Y2xlOiBIb29rID0ge1xuICBuYW1lOiAnY2FtcGFpZ25fbWVtYmVyX2xpZmVjeWNsZScsXG4gIG9iamVjdDogJ2NybV9jYW1wYWlnbl9tZW1iZXInLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICBwcmlvcml0eTogMjAwLFxuICBkZXNjcmlwdGlvbjogJ0tlZXAgaGFzX3Jlc3BvbmRlZCAvIHJlc3BvbnNlX2RhdGUgaW4gbG9ja3N0ZXAgd2l0aCB0aGUgbWVtYmVyIHN0YXR1cy4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIC8vIEQzIHN0YW5kLWRvd246IGEgcHJlZGljYXRlIHVwZGF0ZSBoYXMgT05FIHBheWxvYWQgZm9yIGV2ZXJ5IG1hdGNoZWQgcm93LFxuICAgIC8vIHNvIHRoZSBgY3R4LnByZXZpb3VzYC1jb25kaXRpb25lZCB3cml0ZXMgYmVsb3cgd291bGQgbGFuZCBvbiByb3dzIHRoYXRcbiAgICAvLyBkaWQgbm90IGVhcm4gdGhlbSBcdTIwMTQgcmVmdXNlZCBhcyBhIGRpdmVyZ2luZyBrZXkgc2V0LCBvciBzdG9yZWQgc2lsZW50bHlcbiAgICAvLyBmcm9tIHRoZSBsYXN0IHJvdy4gRnVsbCBhY2NvdW50IGFuZCB0aGUgbWVhc3VyZW1lbnQ6IGBmb3JlY2FzdC5ob29rLnRzYC5cbiAgICBpZiAoY3R4LmV2ZW50ID09PSAnYmVmb3JlVXBkYXRlJyAmJiBjdHguZGlzcGF0Y2g/Lm1vZGUgPT09ICdwZXItcm93JykgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBpbnB1dCB9ID0gY3R4O1xuICAgIGNvbnN0IHByZXZpb3VzID0gY3R4LnByZXZpb3VzO1xuICAgIGNvbnN0IHN0YXR1cyA9XG4gICAgICAodHlwZW9mIGlucHV0LnN0YXR1cyA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3RhdHVzKSB8fFxuICAgICAgKHR5cGVvZiBwcmV2aW91cz8uc3RhdHVzID09PSAnc3RyaW5nJyA/IChwcmV2aW91cy5zdGF0dXMgYXMgc3RyaW5nKSA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKCFzdGF0dXMpIHJldHVybjtcblxuICAgIC8vIFRoZSByZXNwb25kZWQgc2V0IGlzIHNwZWxsZWQgSU5MSU5FLCBub3QgbGlmdGVkIHRvIGEgbW9kdWxlIGNvbnN0YW50OiBhXG4gICAgLy8gc2FuZGJveGVkIGJvZHkgY2Fubm90IHJlYWNoIG1vZHVsZSBzY29wZSwgYW5kIGEgaGFuZGxlciB0aGF0IHJlYWRzIG9uZVxuICAgIC8vIHN0b3BzIGxvd2VyaW5nIHRvIG1ldGFkYXRhIChzZWUgYGNhbXBhaWduLmhvb2sudHNgJ3MgaGVhZGVyKS5cbiAgICBjb25zdCByZXNwb25kZWQgPSBzdGF0dXMgPT09ICdyZXNwb25kZWQnIHx8IHN0YXR1cyA9PT0gJ2NvbnZlcnRlZCc7XG4gICAgY29uc3QgcHJpb3JTdGF0dXMgPSB0eXBlb2YgcHJldmlvdXM/LnN0YXR1cyA9PT0gJ3N0cmluZycgPyAocHJldmlvdXMuc3RhdHVzIGFzIHN0cmluZykgOiAnJztcbiAgICBjb25zdCB3YXNSZXNwb25kZWQgPSBwcmlvclN0YXR1cyA9PT0gJ3Jlc3BvbmRlZCcgfHwgcHJpb3JTdGF0dXMgPT09ICdjb252ZXJ0ZWQnO1xuXG4gICAgaWYgKHJlc3BvbmRlZCkge1xuICAgICAgaW5wdXQuaGFzX3Jlc3BvbmRlZCA9IHRydWU7XG4gICAgICAvLyBTdGFtcCBhIHJlc3BvbnNlIGRhdGUgb25seSB3aGVuIHRoZSBtZW1iZXIgaXMgQ1JPU1NJTkcgaW50byBhIHJlc3BvbmRlZFxuICAgICAgLy8gc3RhdGUgYW5kIGRvZXMgbm90IGFscmVhZHkgY2Fycnkgb25lLiBSZS1zdGFtcGluZyBvbiBldmVyeSBsYXRlciBlZGl0XG4gICAgICAvLyB3b3VsZCBxdWlldGx5IG1vdmUgdGhlIHJlc3BvbnNlIGRhdGUgZm9yd2FyZCBlYWNoIHRpbWUgc29tZWJvZHkgdG91Y2hlZFxuICAgICAgLy8gdGhlIHJvdywgYW5kIHJlc3BvbnNlLXRpbWUgcmVwb3J0aW5nIHJlYWRzIHRoaXMgY29sdW1uLlxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBpbnB1dC5yZXNwb25zZV9kYXRlID8/IHByZXZpb3VzPy5yZXNwb25zZV9kYXRlO1xuICAgICAgaWYgKCF3YXNSZXNwb25kZWQgJiYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQgfHwgZXhpc3RpbmcgPT09IG51bGwgfHwgZXhpc3RpbmcgPT09ICcnKSkge1xuICAgICAgICBpbnB1dC5yZXNwb25zZV9kYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE1vdmluZyBCQUNLIG91dCBvZiBhIHJlc3BvbmRlZCBzdGF0ZSAoYSBtaXMtY2xpY2sgY29ycmVjdGVkLCBvciBhIG1lbWJlclxuICAgIC8vIHJlc2V0IHRvIGBzZW50YCBmb3IgYSByZS1zZW5kKSBjbGVhcnMgdGhlIHN1bW1hcnkgd2l0aCBpdC4gTGVhdmluZ1xuICAgIC8vIGBoYXNfcmVzcG9uZGVkOiB0cnVlYCBiZWhpbmQgb24gYSBgc2VudGAgbWVtYmVyIGlzIHRoZSBzYW1lIGRpc2FncmVlbWVudFxuICAgIC8vIGluIHRoZSBvdGhlciBkaXJlY3Rpb24sIGFuZCBpdCBpbmZsYXRlcyBub3RoaW5nIHZpc2libGUgXHUyMDE0IHdoaWNoIGlzXG4gICAgLy8gZXhhY3RseSB3aHkgaXQgd291bGQgc3Vydml2ZSByZXZpZXcuXG4gICAgaWYgKHdhc1Jlc3BvbmRlZCAmJiB0eXBlb2YgaW5wdXQuc3RhdHVzID09PSAnc3RyaW5nJykge1xuICAgICAgaW5wdXQuaGFzX3Jlc3BvbmRlZCA9IGZhbHNlO1xuICAgICAgaW5wdXQucmVzcG9uc2VfZGF0ZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdHguZXZlbnQgPT09ICdiZWZvcmVJbnNlcnQnICYmIGlucHV0Lmhhc19yZXNwb25kZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5wdXQuaGFzX3Jlc3BvbmRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogUm91bmQtdHJpcCBgdW5zdWJzY3JpYmVkYCB0byB0aGUgcGVyc29uJ3MgYGVtYWlsX29wdF9vdXRgLlxuICpcbiAqIFRoaXMgY2xvc2VzIGEgbG9vcCB0aGUgYXBwIGFscmVhZHkgaGFkIG9uZSBoYWxmIG9mOiBgY2FtcGFpZ25fZW5yb2xsbWVudGBcbiAqIGZpbHRlcnMgb24gYGVtYWlsX29wdF9vdXQ6IGZhbHNlYCwgYW5kIHRoZSBgc2VuZF9lbWFpbGAgYWN0aW9uIGhpZGVzIGl0c2VsZlxuICogb24gYW4gb3B0ZWQtb3V0IGNvbnRhY3QgXHUyMDE0IGJ1dCBOT1RISU5HIGV2ZXIgc2V0IHRoZSBmbGFnLCBzbyBob25vdXJpbmcgaXQgd2FzXG4gKiBhIHByb21pc2UgYWJvdXQgYSBjb2x1bW4gbm8gdXNlciBhY3Rpb24gY291bGQgcmVhY2guIFVuc3Vic2NyaWJpbmcgYSBtZW1iZXJcbiAqIG1hcmtlZCB0aGUganVuY3Rpb24gcm93IGFuZCBsZWZ0IHRoZSBwZXJzb24gZW5yb2xsYWJsZSBieSB0aGUgdmVyeSBuZXh0XG4gKiBjYW1wYWlnbiwgd2hpY2ggaXMgdGhlIGZhaWx1cmUgbW9kZSBhbiBvcHQtb3V0IGV4aXN0cyB0byBwcmV2ZW50LlxuICpcbiAqIERlbGliZXJhdGVseSBvbmUtZGlyZWN0aW9uYWw6IG1lbWJlciBgdW5zdWJzY3JpYmVkYCBcdTIxRDIgcGVyc29uIG9wdGVkIG91dC5cbiAqIFRoZSByZXZlcnNlIChwZXJzb24gb3B0cyBvdXQgXHUyMUQyIGNsb3NlIHRoZWlyIG9wZW4gbWVtYmVyc2hpcHMpIGlzIE5PVCBkb25lXG4gKiBoZXJlIFx1MjAxNCBhIHBhc3QgY2FtcGFpZ24ncyBtZW1iZXJzaGlwIGlzIGEgaGlzdG9yaWNhbCByZWNvcmQsIGFuZCByZXdyaXRpbmcgaXRcbiAqIHdvdWxkIGZhbHNpZnkgd2hhdCBoYXBwZW5lZCBhdCB0aGUgdGltZS5cbiAqXG4gKiBgYXN5bmNgICsgYG9uRXJyb3I6ICdsb2cnYDogdGhlIG1lbWJlciB3cml0ZSBpcyB0aGUgdXNlcidzIGFjdGlvbiBhbmQgbXVzdFxuICogbm90IGZhaWwgYmVjYXVzZSB0aGUgbGVhZCByb3cgaXMgbG9ja2VkIG9yIGdvbmUuIEEgbWlzc2VkIHN5bmMgaXMgcmVjb3ZlcmVkXG4gKiBieSB0aGUgbmV4dCB1bnN1YnNjcmliZTsgYSByZWplY3RlZCB3cml0ZSBsb3NlcyB0aGUgdW5zdWJzY3JpYmUgaXRzZWxmLlxuICpcbiAqIGBydW5BczogJ3N5c3RlbSdgICgjMjAxNCwgQUdFTlRTLm1kIHJ1bGUgOSkuIE1lbWJlcnMgYXJlIHdvcmtlZCBieVxuICogbWFya2V0aW5nLCBhbmQgYSBjb250YWN0IGlzIGEgbWFzdGVyLWRldGFpbCBjaGlsZCBvZiBpdHMgYWNjb3VudCwgd2hpY2ggYVxuICogbWFya2V0aW5nIHVzZXIgbWF5IG5vdCBlZGl0IFx1MjAxNCBzbyB0aGUgY29udGFjdCB3cml0ZSB3YXMgcmVmdXNlZCAoXCJyZXF1aXJlc1xuICogZWRpdCBhY2Nlc3MgdG8gaXRzIG1hc3RlciByZWNvcmRcIiksIGxvZ2dlZCBhbmQgc3dhbGxvd2VkLCBhbmQgdGhlIHBlcnNvblxuICogc3RheWVkIGVucm9sbGFibGUgYnkgdGhlIG5leHQgY2FtcGFpZ24uIEFuIHVuc3Vic2NyaWJlIGhhcyB0byByZWFjaCB0aGVcbiAqIHBlcnNvbiB3aG9ldmVyIHJlY29yZGVkIGl0LCBzbyB0aGUgaG9vayBlbGV2YXRlczsgdGhlIG1lbWJlciB3cml0ZSBzdGF5cyB0aGVcbiAqIGNhbGxlcidzLCBhbmQgYHVwZGF0ZWRfYnlgIG9uIHRoZSBwZXJzb24gc3RpbGwgbmFtZXMgdGhlbS4gT3JnYW5pemF0aW9uXG4gKiAocnVsZSAxMCk6IGl0IHdyaXRlcyBvbmx5IHRoZSBsZWFkIC8gY29udGFjdCB0aGUgdHJpZ2dlcmluZyBtZW1iZXIgcm93XG4gKiBuYW1lcywgYW5kIHRoZSBlbGV2YXRlZCBgY3R4LmFwaWAga2VlcHMgdGhlIHRyaWdnZXIncyB0ZW5hbnQuXG4gKi9cbmNvbnN0IGNhbXBhaWduTWVtYmVyT3B0T3V0U3luYzogSG9vayA9IHtcbiAgbmFtZTogJ2NhbXBhaWduX21lbWJlcl9vcHRvdXRfc3luYycsXG4gIG9iamVjdDogJ2NybV9jYW1wYWlnbl9tZW1iZXInLFxuICBldmVudHM6IFsnYWZ0ZXJJbnNlcnQnLCAnYWZ0ZXJVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDMwMCxcbiAgYXN5bmM6IHRydWUsXG4gIG9uRXJyb3I6ICdsb2cnLFxuICBydW5BczogJ3N5c3RlbScsXG4gIGRlc2NyaXB0aW9uOiAnU3luYyBhbiB1bnN1YnNjcmliZWQgbWVtYmVyIGJhY2sgdG8gdGhlIGxlYWQvY29udGFjdCBlbWFpbF9vcHRfb3V0IGZsYWcuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgaWYgKGlucHV0Py5zdGF0dXMgIT09ICd1bnN1YnNjcmliZWQnKSByZXR1cm47XG4gICAgLy8gQWxyZWFkeSB1bnN1YnNjcmliZWQgXHUyMUQyIGFscmVhZHkgc3luY2VkLiBSZS1ydW5uaW5nIHdvdWxkIGJlIGhhcm1sZXNzXG4gICAgLy8gKHRoZSB3cml0ZSBpcyBpZGVtcG90ZW50KSBidXQgaXQgd291bGQgYWxzbyByZS1vcGVuIGEgcm93IG9uIGV2ZXJ5XG4gICAgLy8gdW5yZWxhdGVkIGVkaXQgb2YgYW4gdW5zdWJzY3JpYmVkIG1lbWJlci5cbiAgICBpZiAocHJldmlvdXM/LnN0YXR1cyA9PT0gJ3Vuc3Vic2NyaWJlZCcpIHJldHVybjtcblxuICAgIGNvbnN0IGxlYWRJZCA9XG4gICAgICAodHlwZW9mIGlucHV0Py5jcm1fbGVhZCA9PT0gJ3N0cmluZycgJiYgaW5wdXQuY3JtX2xlYWQpIHx8XG4gICAgICAodHlwZW9mIHByZXZpb3VzPy5jcm1fbGVhZCA9PT0gJ3N0cmluZycgPyAocHJldmlvdXMuY3JtX2xlYWQgYXMgc3RyaW5nKSA6IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgY29udGFjdElkID1cbiAgICAgICh0eXBlb2YgaW5wdXQ/LmNybV9jb250YWN0ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jcm1fY29udGFjdCkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXM/LmNybV9jb250YWN0ID09PSAnc3RyaW5nJyA/IChwcmV2aW91cy5jcm1fY29udGFjdCBhcyBzdHJpbmcpIDogdW5kZWZpbmVkKTtcblxuICAgIC8vIEV4YWN0bHkgb25lIG9mIHRoZSB0d28gaXMgc2V0IFx1MjAxNCBgbGVhZF9vcl9jb250YWN0X3JlcXVpcmVkYCBvbiB0aGUgb2JqZWN0XG4gICAgLy8gZ3VhcmFudGVlcyBhdCBsZWFzdCBvbmUsIGFuZCB0aGUgZW5yb2xsbWVudCB3cml0ZXJzIG5ldmVyIHNldCBib3RoLiBCb3RoXG4gICAgLy8gYnJhbmNoZXMgcnVuIGFueXdheSByYXRoZXIgdGhhbiBhbiBpZi9lbHNlLCBzbyBhIHJvdyB0aGF0IHNvbWVob3cgY2Fycmllc1xuICAgIC8vIGJvdGggc3RpbGwgb3B0cyBvdXQgYm90aCBwZW9wbGUgaW5zdGVhZCBvZiBoYWxmIG9mIHRoZW0uXG4gICAgaWYgKGxlYWRJZCkge1xuICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX2xlYWQnKS51cGRhdGUoXG4gICAgICAgIHsgaWQ6IGxlYWRJZCwgZW1haWxfb3B0X291dDogdHJ1ZSB9LFxuICAgICAgICB7IHdoZXJlOiB7IGlkOiBsZWFkSWQgfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGNvbnRhY3RJZCkge1xuICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX2NvbnRhY3QnKS51cGRhdGUoXG4gICAgICAgIHsgaWQ6IGNvbnRhY3RJZCwgZW1haWxfb3B0X291dDogdHJ1ZSB9LFxuICAgICAgICB7IHdoZXJlOiB7IGlkOiBjb250YWN0SWQgfSB9LFxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG4vKipcbiAqIFJlY29tcHV0ZSB0aGUgY2FtcGFpZ24ncyBtZXRyaWMgYmxvY2sgb24gZXZlcnkgbWVtYmVyc2hpcCBjaGFuZ2UuXG4gKlxuICogVEhJUyBpcyB0aGUgaG9vayB0aGUgXCJtZXRyaWNzIGFyZSBsaXZlXCIgYWNjZXB0YW5jZSBjcml0ZXJpb24gcmVzdHMgb246XG4gKiBlbnJvbGxpbmcgYSBtZW1iZXIsIG1hcmtpbmcgb25lIHJlc3BvbmRlZCwgb3IgcmVtb3Zpbmcgb25lIG1vdmVzXG4gKiBgbnVtX3NlbnRgIC8gYG51bV9yZXNwb25zZXNgIC8gYG51bV9sZWFkc2AgLyBgbnVtX2NvbnZlcnRlZF9sZWFkc2BcbiAqIGltbWVkaWF0ZWx5IFx1MjAxNCBubyB3YWl0aW5nIGZvciB0aGUgY2FtcGFpZ24gdG8gcmVhY2ggYGNvbXBsZXRlZGAsIHdoaWNoIGlzXG4gKiB3aGF0IHRoZSByZW1vdmVkIGBjYW1wYWlnbl9zbmFwc2hvdF9tZXRyaWNzYCBtYWRlIGV2ZXJ5b25lIHdhaXQgZm9yLlxuICpcbiAqIEJvdGggc2lkZXMgb24gdXBkYXRlOiBtb3ZpbmcgYSBtZW1iZXIgYmV0d2VlbiBjYW1wYWlnbnMgaGFzIHRvIGRlY3JlbWVudCB0aGVcbiAqIG9sZCBjYW1wYWlnbiBhcyB3ZWxsIGFzIGluY3JlbWVudCB0aGUgbmV3IG9uZS5cbiAqXG4gKiBObyBsb29wOiB0aGlzIHdyaXRlcyBgY3JtX2NhbXBhaWduYCwgYW5kIHRoZSBjYW1wYWlnbi1zaWRlIHJlZnJlc2ggb25seSBmaXJlc1xuICogb24gYSBgc3RhdHVzYCB0cmFuc2l0aW9uLCB3aGljaCBhIG1ldHJpYy1vbmx5IHdyaXRlIGRvZXMgbm90IGNhcnJ5LlxuICpcbiAqIGBydW5BczogJ3N5c3RlbSdgICgjMjAxNCwgQUdFTlRTLm1kIHJ1bGUgOSkuIEEgcm9sbHVwIG11c3Qgbm90IGRlcGVuZCBvbiB3aG9cbiAqIGZpcmVkIGl0LiBSdW4gYXMgYSBtYXJrZXRpbmcgdXNlciwgdGhlIHJlY29tcHV0ZSBjb3VudGVkIG9ubHkgdGhlIGRlYWxzIHRoYXRcbiAqIHVzZXIgbWF5IHNlZSBcdTIwMTQgYSBQcml2YXRlIHdvbiBkZWFsIGlzIGl0cyBvd25lcidzIGFsb25lIFx1MjAxNCBhbmQgd3JvdGUgdGhlXG4gKiBzbWFsbGVyIG51bWJlcnMgb3ZlciB0aGUgcmlnaHQgb25lczogbWVhc3VyZWQsIGBudW1fd29uX29wcG9ydHVuaXRpZXNgIDIgXHUyMTkyIDFcbiAqIGFuZCBgYWN0dWFsX3JldmVudWVgIDEsMTAwIFx1MjE5MiAxMDAgdGhlIG1vbWVudCBhIG1hcmtldGVyIGVucm9sbGVkIGEgbWVtYmVyLlxuICogRWxldmF0ZWQsIGV2ZXJ5IG1lbWJlciB3cml0ZSByZWNvbXB1dGVzIHRoZSBzYW1lIGNhbXBhaWduIHRoZSBzYW1lIHdheTsgdGhlXG4gKiBtZW1iZXIgd3JpdGUgaXRzZWxmIHN0YXlzIHRoZSBjYWxsZXIncy4gT3JnYW5pemF0aW9uIChydWxlIDEwKTogZXZlcnkgcmVhZFxuICogaXMga2V5ZWQgdG8gdGhlIHRyaWdnZXJpbmcgbWVtYmVyJ3MgY2FtcGFpZ24gKGFuZCB0aGUgbGVhZHMgdGhhdCBjYW1wYWlnbidzXG4gKiBtZW1iZXJzIG5hbWUpLCBhbmQgdGhlIGVsZXZhdGVkIGBjdHguYXBpYCBrZWVwcyB0aGUgdHJpZ2dlcidzIHRlbmFudC5cbiAqL1xuY29uc3QgY2FtcGFpZ25NZW1iZXJNZXRyaWNzUmVmcmVzaDogSG9vayA9IHtcbiAgbmFtZTogJ2NhbXBhaWduX21lbWJlcl9tZXRyaWNzX3JlZnJlc2gnLFxuICBvYmplY3Q6ICdjcm1fY2FtcGFpZ25fbWVtYmVyJyxcbiAgZXZlbnRzOiBbJ2FmdGVySW5zZXJ0JywgJ2FmdGVyVXBkYXRlJywgJ2FmdGVyRGVsZXRlJ10sXG4gIHByaW9yaXR5OiA4MDAsXG4gIGFzeW5jOiB0cnVlLFxuICBvbkVycm9yOiAnbG9nJyxcbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICBkZXNjcmlwdGlvbjogJ1JlY29tcHV0ZSB0aGUgY2FtcGFpZ24gbWV0cmljIGJsb2NrIGxpdmUgd2hlbmV2ZXIgaXRzIG1lbWJlcnNoaXAgY2hhbmdlcy4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IGFwaSA9IGN0eC5hcGkgYXMgSG9va0FwaSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFwaSkgcmV0dXJuO1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICBjb25zdCBjYW1wYWlnbklkcyA9IEFycmF5LmZyb20obmV3IFNldChbXG4gICAgICB0eXBlb2YgaW5wdXQ/LmNybV9jYW1wYWlnbiA9PT0gJ3N0cmluZycgPyBpbnB1dC5jcm1fY2FtcGFpZ24gOiAnJyxcbiAgICAgIHR5cGVvZiBwcmV2aW91cz8uY3JtX2NhbXBhaWduID09PSAnc3RyaW5nJyA/IChwcmV2aW91cy5jcm1fY2FtcGFpZ24gYXMgc3RyaW5nKSA6ICcnLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pKSk7XG4gICAgZm9yIChjb25zdCBpZCBvZiBjYW1wYWlnbklkcykge1xuICAgICAgLy8gXHUyNTAwXHUyNTAwIHJlY29tcHV0ZSBcdTI1MDBcdTI1MDAgaWRlbnRpY2FsIGluIGFsbCBmb3VyIHJlZnJlc2ggaG9va3M7IHNlZSB0aGUgaGVhZGVyLlxuICAgICAgY29uc3QgbWVtYmVyUm93cyA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9jYW1wYWlnbl9tZW1iZXInKS5maW5kKHtcbiAgICAgICAgd2hlcmU6IHsgY3JtX2NhbXBhaWduOiBpZCB9LCBmaWVsZHM6IFsnY3JtX2xlYWQnLCAnc3RhdHVzJ10sIHRvcDogNTAwMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbGVhZElkcyA9IEFycmF5LmZyb20obmV3IFNldChcbiAgICAgICAgbWVtYmVyUm93cy5tYXAoKHIpID0+ICh0eXBlb2Ygci5jcm1fbGVhZCA9PT0gJ3N0cmluZycgPyByLmNybV9sZWFkIDogJycpKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgICApKTtcbiAgICAgIGNvbnN0IGNvbnZlcnRlZExlYWRzID0gbGVhZElkcy5sZW5ndGggPiAwXG4gICAgICAgID8gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2xlYWQnKS5jb3VudCh7IHdoZXJlOiB7IGlkOiB7ICRpbjogbGVhZElkcyB9LCBpc19jb252ZXJ0ZWQ6IHRydWUgfSB9KVxuICAgICAgICA6IDA7XG4gICAgICBjb25zdCBudW1PcHBvcnR1bml0aWVzID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykuY291bnQoeyB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGlkIH0gfSk7XG4gICAgICBjb25zdCBudW1Xb24gPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fb3Bwb3J0dW5pdHknKS5jb3VudCh7IHdoZXJlOiB7IGNybV9jYW1wYWlnbjogaWQsIHN0YWdlOiAnY2xvc2VkX3dvbicgfSB9KTtcbiAgICAgIGNvbnN0IHdvblJvd3MgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fb3Bwb3J0dW5pdHknKS5maW5kKHtcbiAgICAgICAgd2hlcmU6IHsgY3JtX2NhbXBhaWduOiBpZCwgc3RhZ2U6ICdjbG9zZWRfd29uJyB9LCBmaWVsZHM6IFsnYW1vdW50J10sIHRvcDogNTAwMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYWN0dWFsUmV2ZW51ZSA9IHdvblJvd3MucmVkdWNlKFxuICAgICAgICAoc3VtLCByb3cpID0+IHN1bSArICh0eXBlb2Ygcm93LmFtb3VudCA9PT0gJ251bWJlcicgPyByb3cuYW1vdW50IDogTnVtYmVyKHJvdy5hbW91bnQpIHx8IDApLCAwLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV9jYW1wYWlnbicpLnVwZGF0ZSh7XG4gICAgICAgIGlkLFxuICAgICAgICBudW1fc2VudDogbWVtYmVyUm93cy5sZW5ndGgsXG4gICAgICAgIG51bV9yZXNwb25zZXM6IG1lbWJlclJvd3MuZmlsdGVyKChyKSA9PiByLnN0YXR1cyA9PT0gJ3Jlc3BvbmRlZCcgfHwgci5zdGF0dXMgPT09ICdjb252ZXJ0ZWQnKS5sZW5ndGgsXG4gICAgICAgIG51bV9sZWFkczogbGVhZElkcy5sZW5ndGgsXG4gICAgICAgIG51bV9jb252ZXJ0ZWRfbGVhZHM6IGNvbnZlcnRlZExlYWRzLFxuICAgICAgICBudW1fb3Bwb3J0dW5pdGllczogbnVtT3Bwb3J0dW5pdGllcyxcbiAgICAgICAgbnVtX3dvbl9vcHBvcnR1bml0aWVzOiBudW1Xb24sXG4gICAgICAgIGFjdHVhbF9yZXZlbnVlOiBhY3R1YWxSZXZlbnVlLFxuICAgICAgfSwgeyB3aGVyZTogeyBpZCB9IH0pO1xuICAgICAgLy8gXHUyNTAwXHUyNTAwIC9yZWNvbXB1dGUgXHUyNTAwXHUyNTAwXG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgW1xuICBjYW1wYWlnbk1lbWJlckxpZmVjeWNsZSxcbiAgY2FtcGFpZ25NZW1iZXJPcHRPdXRTeW5jLFxuICBjYW1wYWlnbk1lbWJlck1ldHJpY3NSZWZyZXNoLFxuXTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL2xlYWQtY29udmVyc2lvbi5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL2xlYWQtY29udmVyc2lvbi5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKiBMZWFkIENvbnZlcnNpb24gXHUyMDE0IG11bHRpLXN0ZXAgc2NyZWVuIGZsb3cgdG8gY29udmVydCBxdWFsaWZpZWQgbGVhZHMgKi9cbmV4cG9ydCBjb25zdCBMZWFkQ29udmVyc2lvbkZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICdsZWFkX2NvbnZlcnNpb24nLFxuICBsYWJlbDogJ0xlYWQgQ29udmVyc2lvbiBQcm9jZXNzJyxcbiAgZGVzY3JpcHRpb246ICdBdXRvbWF0ZWQgZmxvdyB0byBjb252ZXJ0IHF1YWxpZmllZCBsZWFkcyB0byBhY2NvdW50cywgY29udGFjdHMsIGFuZCBvcHBvcnR1bml0aWVzJyxcbiAgdHlwZTogJ3NjcmVlbicsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG5cbiAgdmFyaWFibGVzOiBbXG4gICAgLy8gTmFtZWQgYHJlY29yZElkYCB0byBtYXRjaCB0aGUgY29uc29sZSdzIGZsb3ctYWN0aW9uIGludm9jYXRpb24gY29udHJhY3Q6XG4gICAgLy8gUE9TVCAvYXV0b21hdGlvbi86bmFtZS90cmlnZ2VyIHNlbmRzIHsgcmVjb3JkSWQsIG9iamVjdE5hbWUgfSBhbmQgdGhlXG4gICAgLy8gZGlzcGF0Y2hlciBleHBvc2VzIHRoZW0gYXMgcGFyYW1zLnJlY29yZElkIC8gcGFyYW1zLmNybUxlYWRJZC4gQSBjdXN0b21cbiAgICAvLyBuYW1lIGxpa2UgYGxlYWRJZGAgbmV2ZXIgZ2V0cyBzZWVkZWQgKDE2LnggcnVudGltZSkuXG4gICAgeyBuYW1lOiAncmVjb3JkSWQnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICAgIC8vIFRIRSBhdXRob3JpdHkgZm9yIHRoZSBjb252ZXJzaW9uIGRlZmF1bHQuIGBkZWZhdWx0VmFsdWVgIGlzIHdoYXQgbWFrZXNcbiAgICAvLyBkZWNsYXJlZCBtZWFuIEJPVU5EOiB0aGUgZW5naW5lIHNlZWRzIGV2ZXJ5IGRlY2xhcmVkIHZhcmlhYmxlIHRoYXRcbiAgICAvLyBjYXJyaWVzIG9uZSBiZWZvcmUgdGhlIHJ1biBzdGFydHMsIHNvIGBjcmVhdGVPcHBvcnR1bml0eWAgaXMgYm91bmQgb25cbiAgICAvLyBldmVyeSBwYXRoIFx1MjAxNCBpbmNsdWRpbmcgdGhlIG9uZSB3aGVyZSB0aGUgc2NyZWVuIHJ1bm5lciBwb3N0cyBiYWNrIG9ubHlcbiAgICAvLyB0aGUgZmllbGRzIHRoZSB1c2VyIHRvdWNoZWQuIFRoZSBzY3JlZW4gZmllbGQgYmVsb3cgZGVyaXZlcyBpdHMgcHJlZmlsbFxuICAgIC8vIGZyb20gdGhpcyBsaW5lIHJhdGhlciB0aGFuIHJlc3RhdGluZyBgZmFsc2VgLlxuICAgIC8vXG4gICAgLy8gTWVhc3VyZWQgb24gMTcuMC4wIEdBLCBieSBydW5uaW5nIGZsb3dzIChub3QgYnkgcmVhZGluZyB0aGUgZW5naW5lKTpcbiAgICAvLyAgIFx1MDBCNyBkZWNsYXJlZCArIG5vdGhpbmcgc3VwcGxpZWQgIFx1MjE5MiBib3VuZCB0byBgZmFsc2VgOyBhYmxhdGluZyB0aGlzIGtleVxuICAgIC8vICAgICBmcm9tIHRoZSBkZWNsYXJhdGlvbiByZS1mYWlscyB0aGUgcmVhZCB3aXRoIGBObyBzdWNoIGtleTpcbiAgICAvLyAgICAgY3JlYXRlT3Bwb3J0dW5pdHlgLCBzbyB0aGUgZGVmYXVsdCBpcyB3aGF0IGJpbmRzIGl0O1xuICAgIC8vICAgXHUwMEI3IHNlZWRlZCBCRUZPUkUgdGhlIHN0YXJ0IGNvbmRpdGlvbiBpcyBldmFsdWF0ZWQsIHNvIGEgc3RhcnQgY29uZGl0aW9uXG4gICAgLy8gICAgIGNvdWxkIHJlYWQgaXQgdG9vO1xuICAgIC8vICAgXHUwMEI3IGEgY2FsbGVyLXN1cHBsaWVkIGBjb250ZXh0LnBhcmFtcy5jcmVhdGVPcHBvcnR1bml0eWAgV0lOUyBcdTIwMTQgdGhlXG4gICAgLy8gICAgIGJvdW5kYXJ5IGlzIGAhPT0gdW5kZWZpbmVkYCwgc28gYW4gZXhwbGljaXQgYGZhbHNlYC9gbnVsbGAgaXMgYVxuICAgIC8vICAgICBzdXBwbGllZCBhbnN3ZXIsIGFuZCBvbmx5IGFic2VuY2UgZmFsbHMgdGhyb3VnaCB0byB0aGlzIGRlZmF1bHQuXG4gICAgLy8gXHUyNkQ0IE5ldmVyIHNlZWQgdGhpcyB3aXRoIGFuIGFzc2lnbm1lbnQgbm9kZSBpbnN0ZWFkOiBhbiBhc3NpZ25tZW50IGlzXG4gICAgLy8gdW5jb25kaXRpb25hbCBhbmQgY2xvYmJlcnMgYSBjYWxsZXItc3VwcGxpZWQgdmFsdWUuIEFsbCBvZiB0aGUgYWJvdmUgaXNcbiAgICAvLyBwaW5uZWQgaW4gYHRlc3QvZmxvdy12YXJpYWJsZS1jb25kaXRpb25zLnRlc3QudHNgLlxuICAgIHsgbmFtZTogJ2NyZWF0ZU9wcG9ydHVuaXR5JywgdHlwZTogJ2Jvb2xlYW4nLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UsIGRlZmF1bHRWYWx1ZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6ICdvcHBvcnR1bml0eU5hbWUnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICAgIHsgbmFtZTogJ29wcG9ydHVuaXR5QW1vdW50JywgdHlwZTogJ3RleHQnLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgICAvLyBUaGUgY29udmVyc2lvbidzIGNsb3NlIGRhdGUsIGNvbGxlY3RlZCBvbiB0aGUgc2NyZWVuIGJlbG93XG4gICAgLy8gaW5zdGVhZCBvZiBzdGFtcGVkIGluc2lkZSBgY3JlYXRlX29wcG9ydHVuaXR5YC4gRGVjbGFyZWQgd2l0aCBOT1xuICAgIC8vIGBkZWZhdWx0VmFsdWVgLCBhbmQgdGhhdCBpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiBjaG9zZW46IHRoZSBlbmdpbmVcbiAgICAvLyBiaW5kcyBhIERFQ0xBUkFUSU9OJ3MgZGVmYXVsdCByYXcgXHUyMDE0IGBzZWVkRGVjbGFyZWRWYXJpYWJsZXNgIGRvZXMgYSBwbGFpblxuICAgIC8vIGB2YXJpYWJsZXMuc2V0KG5hbWUsIGRlZmF1bHRWYWx1ZSlgIHdpdGggbm8gYGludGVycG9sYXRlYCBjYWxsIFx1MjAxNCBzb1xuICAgIC8vIGB7VE9EQVkoKSArIDkwfWAgd3JpdHRlbiBoZXJlIHdvdWxkIGJpbmQgdGhhdCBzdHJpbmcgdmVyYmF0aW0gYW5kXG4gICAgLy8gYGNyZWF0ZV9vcHBvcnR1bml0eWAgd291bGQgcG9zdCB0aGUgYnJhY2VzIGludG8gYSBkYXRlIGNvbHVtbi4gTWVhc3VyZWRcbiAgICAvLyBvbiAxNy4zLjAgYnkgcnVubmluZyBhIHByb2JlIGZsb3csIG5vdCBieSByZWFkaW5nIHRoZSBlbmdpbmUuIFRoZSBzY3JlZW5cbiAgICAvLyBmaWVsZCBpcyB0aGVyZWZvcmUgdGhlIG9ubHkgbGF5ZXIgdGhhdCBjYW4gY2FycnkgdGhlIGV4cHJlc3Npb24sIHdoaWNoXG4gICAgLy8gaXMgd2hlcmUgdGhlICs5MCBsaXZlcyBhbmQgd2h5IHRoaXMgbGluZSBpcyBkZWxpYmVyYXRlbHkgYmFyZS5cbiAgICB7IG5hbWU6ICdjbG9zZURhdGUnLCB0eXBlOiAnZGF0ZScsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICBdLFxuXG4gIG5vZGVzOiBbXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCcsIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX2xlYWQnIH0gfSxcbiAgICB7XG4gICAgICBpZDogJ3NjcmVlbl8xJywgdHlwZTogJ3NjcmVlbicsIGxhYmVsOiAnQ29udmVyc2lvbiBEZXRhaWxzJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBUaGUgc3VzcGVjdGVkLWR1cGxpY2F0ZSB3YXJuaW5nLiBgbGVhZF9kdXBsaWNhdGVfY2hlY2tgIGZsYWdzIGFcbiAgICAgICAgLy8gcmUtY2FwdHVyZWQgZW1haWwgYXQgaW50YWtlIGFuZCBsaW5rcyB0aGUgcmVjb3JkIHRoZSBsZWFkIHJlcGVhdHM7XG4gICAgICAgIC8vIHRoZSByZXAgYWJvdXQgdG8gQ09OVkVSVCBpcyB0aGUgbGFzdCBtb21lbnQgdGhhdCBmbGFnIGlzIHdvcnRoXG4gICAgICAgIC8vIGFueXRoaW5nLCBhbmQgd2l0aG91dCBpdCB0aGUgZHVwbGljYXRlIGJlY29tZXMgYSBzZWNvbmQgYWNjb3VudCxcbiAgICAgICAgLy8gY29udGFjdCBhbmQgb3Bwb3J0dW5pdHkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFx1MjZENCBOb3Qgb24gYGNvbnZlcnRfbGVhZGAncyBgY29uZmlybVRleHRgOiB0aGF0IHN0cmluZyBpcyBzdGF0aWMgYW5kXG4gICAgICAgIC8vIHVuY29uZGl0aW9uYWwsIHNvIGl0IHdvdWxkIHdhcm4gaWRlbnRpY2FsbHkgb24gZXZlcnkgY2xlYW4gbGVhZCBcdTIwMTQgdGhlXG4gICAgICAgIC8vIGNyeS13b2xmIHRoYXQgbWFrZXMgYSBjb25maXJtIGRpYWxvZyBmdXJuaXR1cmUuIFRoaXMgc2NyZWVuIGlzIHdoZXJlXG4gICAgICAgIC8vIHRoZSBjb252ZXJzaW9uIGRlY2lzaW9uIGlzIGFjdHVhbGx5IHRha2VuLCBhbmQgdGhlIG9uZSBzdXJmYWNlIHRoYXRcbiAgICAgICAgLy8gY2FuIHNheSBzb21ldGhpbmcgVFJVRSBhYm91dCBUSElTIGxlYWQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE1lY2hhbmlzbTogdGhlIGV4ZWN1dG9yIHJlbmRlcnMgYGNvbmZpZy5kZXNjcmlwdGlvbmAgXHUyMDE0IGEgdGV4dCBzbG90LFxuICAgICAgICAvLyB3cml0dGVuIGFzIGEgYHt7IH19YCBob2xlIHNpbmNlIDE4LjAuMC1uZXh0LjAgXHUyMDE0IGludG8gdGhlIGBTY3JlZW5TcGVjYFxuICAgICAgICAvLyBpdCBwdXRzIG9uIHRoZSB3aXJlLCBhbmQgYEZsb3dSdW5uZXIudHN4YCByZW5kZXJzIGl0IFx1MjAxNFxuICAgICAgICAvLyBge3NjcmVlbi5kZXNjcmlwdGlvbiAmJiA8RGlhbG9nRGVzY3JpcHRpb24+XHUyMDI2fWAuIEEgaG9sZSBvdmVyIGBudWxsYFxuICAgICAgICAvLyByZW5kZXJzIHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIHRoZSBleGVjdXRvcidzIGByZW5kZXJUZXh0U2xvdGBcbiAgICAgICAgLy8gdHVybnMgaW50byBubyBkZXNjcmlwdGlvbiBhdCBhbGwgKHJlYWQgaW4gdGhlIGluc3RhbGxlZFxuICAgICAgICAvLyAxOC4wLjAtbmV4dC4wIGBzZXJ2aWNlLWF1dG9tYXRpb25gOyBvbiB0aGUgMTcuMS4wIGJ1bmRsZXMgaXQgd2FzXG4gICAgICAgIC8vIG1lYXN1cmVkIGFzIGBpbnRlcnBgIG1hcHBpbmcgbnVsbCB0byBgdW5kZWZpbmVkYCksIHNvIHRoZSBjbGVhbi1sZWFkXG4gICAgICAgIC8vIGJyYW5jaCBiZWxvdyAod2hpY2ggYXNzaWducyBgbnVsbGApIHJlbmRlcnMgTk8gZGVzY3JpcHRpb24gcmF0aGVyXG4gICAgICAgIC8vIHRoYW4gYW4gZW1wdHkgcGFyYWdyYXBoLiBUaGF0IGlzIHdoeSB0aGUgY29uZGl0aW9uYWxpdHkgbGl2ZXMgaW4gYW5cbiAgICAgICAgLy8gYXNzaWdubWVudCBhbmQgbm90IGluIHRoZSBjb3B5OiBhIHNjcmVlbiBgZGVzY3JpcHRpb25gIGhhcyBub1xuICAgICAgICAvLyBgdmlzaWJsZVdoZW5gLlxuICAgICAgICBkZXNjcmlwdGlvbjogJ3t7ZHVwbGljYXRlV2FybmluZ319JyxcbiAgICAgICAgLy8gYHZpc2libGVXaGVuYCBvbiBhIHNjcmVlbiBmaWVsZCBpcyBCQVJFIENFTCBvdmVyIHRoZSBzY3JlZW4ncyBvd25cbiAgICAgICAgLy8gZmllbGQgbmFtZXMgXHUyMDE0IG5vdCB0aGUgQ0VMIHZhbHVlIGVudmVsb3BlcyB0aGUgcmVzdCBvZiB0aGlzIGZsb3cgdXNlc1xuICAgICAgICAvLyBmb3IgZmlsdGVycyBhbmQgYHVwZGF0ZV9yZWNvcmRgIGZpZWxkcywgZXZhbHVhdGVkIG9uIHRoZSBzZXJ2ZXIuIFRoZVxuICAgICAgICAvLyBjbGllbnQgcmUtZXZhbHVhdGVzIHRoZSBwcmVkaWNhdGUgYWdhaW5zdCB0aGUgdmFsdWVzIGNvbGxlY3RlZCBzbyBmYXIsXG4gICAgICAgIC8vIHdoaWNoIGlzIHdoeSBpdCBjYW5ub3QgYmUgYSBzZXJ2ZXItZXZhbHVhdGVkIGVudmVsb3BlLlxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAvLyBcdTI2RDQgTkVWRVIgYHJlcXVpcmVkYCBvbiBhIGJvb2xlYW4gc2NyZWVuIGZpZWxkLiBBIGNoZWNrYm94IGhhcyBub1xuICAgICAgICAgIC8vIHVuYW5zd2VyZWQgc3RhdGUgXHUyMDE0IGNsZWFyIElTIGFuIGFuc3dlciwgYW5kIFwiY29udmVydCB0aGlzIGxlYWRcbiAgICAgICAgICAvLyBXSVRIT1VUIGFuIG9wcG9ydHVuaXR5XCIgaXMgdGhlIGNvbW1vbmVzdCBwYXRoLiBgcmVxdWlyZWQ6IHRydWVgXG4gICAgICAgICAgLy8gYmxvY2tzIG9uIGJvdGggc2lkZXMgb2YgdGhlIHdpcmU6IHRoZSBjbGllbnQgY291bnRzIHRoZSB1bnRvdWNoZWRcbiAgICAgICAgICAvLyBib3ggYXMgYW4gdW5hbnN3ZXJlZCBmaWVsZCBhbmQgZGlzYWJsZXMgU3VibWl0LCBhbmQgZnJvbVxuICAgICAgICAgIC8vIDE3LjAuMC1yYy4yIHRoZSBTRVJWRVIgZW5mb3JjZXMgdGhlIHNjcmVlbidzIGRlY2xhcmVkIGNvbnRyYWN0IHRvbyxcbiAgICAgICAgICAvLyByZWZ1c2luZyB0aGUgcmVzdW1lIHdpdGggYElOVkFMSURfU0NSRUVOX0lOUFVUOiBTY3JlZW4gZmllbGRcbiAgICAgICAgICAvLyBcImNyZWF0ZU9wcG9ydHVuaXR5XCIgaXMgcmVxdWlyZWRgIFx1MjAxNCBzbyBhIHJ1bm5lciB0aGF0IHBvc3RzIG9ubHkgd2hhdFxuICAgICAgICAgIC8vIHRoZSB1c2VyIHRvdWNoZWQgY2Fubm90IGNvbnZlcnQgYSBsZWFkIGF0IGFsbC4gVGhlIHZhcmlhYmxlJ3NcbiAgICAgICAgICAvLyBkZWNsYXJlZCBgZGVmYXVsdFZhbHVlYCBpcyB3aGF0IHN1cHBsaWVzIHRoZSBhbnN3ZXIuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBERVJJVkVELCBub3QgcmVzdGF0ZWQuIFRoZSBlbnZlbG9wZSByZWFkcyB0aGUgZmxvdyB2YXJpYWJsZVxuICAgICAgICAgIC8vIGBjcmVhdGVPcHBvcnR1bml0eWAsIHNvIHRoZSBsaXRlcmFsIGBmYWxzZWAgaXMgd3JpdHRlbiBleGFjdGx5IG9uY2UgaW4gdGhpc1xuICAgICAgICAgIC8vIGZpbGUgXHUyMDE0IG9uIHRoZSBkZWNsYXJhdGlvbiBcdTIwMTQgYW5kIHRoZSB3aWRnZXQgcHJlZmlsbCBjYW5ub3QgZHJpZnQgZnJvbVxuICAgICAgICAgIC8vIHRoZSB2YWx1ZSB0aGUgZW5naW5lIGJpbmRzLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gQSBzY3JlZW4gZmllbGQncyBgZGVmYXVsdFZhbHVlYCBpcyBhIENFTCB2YWx1ZSBlbnZlbG9wZSBldmFsdWF0ZWRcbiAgICAgICAgICAvLyBiZWZvcmUgdGhlIGRlc2NyaXB0b3IgZ29lcyBvbiB0aGUgd2lyZSwgc28gdGhlIGNsaWVudCByZWNlaXZlcyB0aGVcbiAgICAgICAgICAvLyB2YWx1ZSwgbmV2ZXIgdGhlIGVudmVsb3BlOiBib29sZWFuIGBmYWxzZWAsIHdoaWNoIGlzIHdoYXQgdGhlXG4gICAgICAgICAgLy8gMTcuMC4wIEdBIHRlbXBsYXRlIHdhcyBtZWFzdXJlZCB0byBzZW5kLiAoYHZpc2libGVXaGVuYCBiZWxvdyBpcyB0aGVcbiAgICAgICAgICAvLyBvcHBvc2l0ZSBjYXNlOiBmb3J3YXJkZWQgcmF3LCBuZXZlciBldmFsdWF0ZWQgb24gdGhlIHNlcnZlci4gU2FtZVxuICAgICAgICAgIC8vIG5vZGUsIHR3byBkaWZmZXJlbnQgZGlhbGVjdHMuKVxuICAgICAgICAgIHsgbmFtZTogJ2NyZWF0ZU9wcG9ydHVuaXR5JywgbGFiZWw6ICdDcmVhdGUgT3Bwb3J0dW5pdHk/JywgdHlwZTogJ2Jvb2xlYW4nLCBkZWZhdWx0VmFsdWU6IGNlbGBjcmVhdGVPcHBvcnR1bml0eWAgfSxcbiAgICAgICAgICAvLyBQUkVGSUxMRUQgRlJPTSBUSEUgTEVBRCAoUkVRLTAwMDUgYWNjZXB0YW5jZSAyKS4gQm90aCBkZWZhdWx0cyBhcmVcbiAgICAgICAgICAvLyBDRUwgZW52ZWxvcGVzIG92ZXIgYGxlYWRSZWNvcmRgLCB3aGljaCBgZ2V0X2xlYWRgIGJvdW5kIGJlZm9yZSB0aGlzXG4gICAgICAgICAgLy8gc2NyZWVuIHdhcyByZWFjaGVkIFx1MjAxNCB0aGUgZmV0Y2ggc2l0cyBBSEVBRCBvZiB0aGUgc2NyZWVuIGZvciB0aGVcbiAgICAgICAgICAvLyBkdXBsaWNhdGUgd2FybmluZywgYW5kIHRoZXNlIHR3byByaWRlIHRoZSBzYW1lIG9yZGVyaW5nLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gXHUyNkEwXHVGRTBGIEVhY2ggZW52ZWxvcGUgaXMgZXZhbHVhdGVkIGJlZm9yZSB0aGUgZGVzY3JpcHRvciBnb2VzIG9uIHRoZVxuICAgICAgICAgIC8vIHdpcmUsIHNvIGBlc3RpbWF0ZWRfYW1vdW50YCBhcnJpdmVzIGFzIGEgTlVNQkVSLiBgY29tcGFueWAgaXNcbiAgICAgICAgICAvLyByZXF1aXJlZCBvbiBhIGxlYWQ7IGBlc3RpbWF0ZWRfYW1vdW50YCBpcyBub3QsIHNvIGl0cyByZWFkIGlzXG4gICAgICAgICAgLy8gZ3VhcmRlZDogYSBsZWFkIHdpdGggbm8gZXN0aW1hdGUgaXMgc2VydmVkIGBudWxsYCB3aGVyZSAxNy54IHNlcnZlZFxuICAgICAgICAgIC8vIG5vdGhpbmcgKHRoZSBtaWdyYXRpb24gZW50cnk6IGEgZmllbGQncyBgZGVmYXVsdFZhbHVlYCBzZWVkcyB0aGVcbiAgICAgICAgICAvLyBmaWVsZCB3aXRoIG51bGwpLCBhbmQgYW4gQUJTRU5UIGNvbHVtbiBvbiBhIHNwYXJzZSBkYXRhc291cmNlIG5vXG4gICAgICAgICAgLy8gbG9uZ2VyIGZhaWxzIHRoZSBydW4gYXQgdGhpcyBzY3JlZW4uXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBcdTI2RDQgVGhlIGFtb3VudCBpcyBwcmVmaWxsZWQsIG5ldmVyIGNvcGllZCBzaWxlbnRseS4gYGVzdGltYXRlZF9hbW91bnRgXG4gICAgICAgICAgLy8gaXMgYSBwcmUtcXVhbGlmaWNhdGlvbiBndWVzcyBhbmQgYGNybV9vcHBvcnR1bml0eS5hbW91bnRgIGlzIGFcbiAgICAgICAgICAvLyBudW1iZXIgYSByZXAgZGVmZW5kcyBpbiBhIGZvcmVjYXN0OyBjb252ZXJzaW9uIGlzIHRoZSBtb21lbnQgYSBodW1hblxuICAgICAgICAgIC8vIHR1cm5zIG9uZSBpbnRvIHRoZSBvdGhlciwgc28gdGhlIGZpZ3VyZSBpcyBzaG93biBpbiBhbiBlZGl0YWJsZSBib3hcbiAgICAgICAgICAvLyBhbmQgdGhlIHJlcCBjb25maXJtcyBpdC4gV3JpdGluZyBpdCBzdHJhaWdodCBpbnRvXG4gICAgICAgICAgLy8gYGNyZWF0ZV9vcHBvcnR1bml0eWAgd291bGQgcHV0IGFuIHVucmV2aWV3ZWQgZXN0aW1hdGUgaW50byB0aGVcbiAgICAgICAgICAvLyBmb3JlY2FzdCBhbmQgbGVhdmUgdGhlIHR3byBmaWVsZHMgbG9va2luZyBsaWtlIGNvcGllcyBvZiBlYWNoIG90aGVyLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gYHJlcXVpcmVkYCBvbiB0aGUgYW1vdW50IG1pcnJvcnMgdGhlIGNvbHVtbiwgZm9yIHRoZSByZWFzb24gZ2l2ZW5cbiAgICAgICAgICAvLyBhdCBgY2xvc2VEYXRlYCBiZWxvdzogYGNybV9vcHBvcnR1bml0eS5hbW91bnRgIGlzIGByZXF1aXJlZGAgK1xuICAgICAgICAgIC8vIGBub3ROdWxsYCwgYW5kIHdpdGhvdXQgdGhpcyBhIHRpY2tlZCBib3ggd2l0aCBubyBhbW91bnQgcmVhY2hlZFxuICAgICAgICAgIC8vIGBjcmVhdGVfb3Bwb3J0dW5pdHlgIGFmdGVyIHRoZSBhY2NvdW50IGFuZCBjb250YWN0IHdlcmUgd3JpdHRlbixcbiAgICAgICAgICAvLyBsZWF2aW5nIHRoZSBsZWFkIGhhbGYtY29udmVydGVkICgjMjA2MCBpdGVtIDIpLiBWaXNpYmxlLW9ubHksIHNvXG4gICAgICAgICAgLy8gYW4gdW50aWNrZWQgYm94IHN0aWxsIGNvbnZlcnRzIHdpdGggbm8gYW1vdW50LlxuICAgICAgICAgIHsgbmFtZTogJ29wcG9ydHVuaXR5TmFtZScsIGxhYmVsOiAnT3Bwb3J0dW5pdHkgTmFtZScsIHR5cGU6ICd0ZXh0JywgcmVxdWlyZWQ6IHRydWUsIGRlZmF1bHRWYWx1ZTogY2VsYGxlYWRSZWNvcmQuY29tcGFueWAsIHZpc2libGVXaGVuOiAnY3JlYXRlT3Bwb3J0dW5pdHkgPT0gdHJ1ZScgfSxcbiAgICAgICAgICB7IG5hbWU6ICdvcHBvcnR1bml0eUFtb3VudCcsIGxhYmVsOiAnT3Bwb3J0dW5pdHkgQW1vdW50JywgdHlwZTogJ2N1cnJlbmN5JywgcmVxdWlyZWQ6IHRydWUsIGRlZmF1bHRWYWx1ZTogY2VsYGhhcyhsZWFkUmVjb3JkLmVzdGltYXRlZF9hbW91bnQpID8gbGVhZFJlY29yZC5lc3RpbWF0ZWRfYW1vdW50IDogbnVsbGAsIHZpc2libGVXaGVuOiAnY3JlYXRlT3Bwb3J0dW5pdHkgPT0gdHJ1ZScgfSxcbiAgICAgICAgICAvLyBUaGUgY2xvc2UgZGF0ZSwgREVGQVVMVEVEIEFORCBWSVNJQkxFLiBgY2xvc2VfZGF0ZWAgaXMgd2hhdCBmaWxlc1xuICAgICAgICAgIC8vIGFuIG9wcG9ydHVuaXR5IGludG8gYSBmb3JlY2FzdCBQRVJJT0QsIHNvIFx1MjZENCBuZXZlciBzdGFtcCBpdCBzaWxlbnRseVxuICAgICAgICAgIC8vIGluc2lkZSBgY3JlYXRlX29wcG9ydHVuaXR5YDogYSBoaWRkZW4gKzkwIGRheXMgZmlsZXMgZXZlcnkgY29udmVydGVkXG4gICAgICAgICAgLy8gZGVhbCBhIHF1YXJ0ZXIgb3V0IGFuZCBtb3ZlcyB0aGUgZm9yZWNhc3Qgd2hlcmUgbm9ib2R5IGNhbiBzZWUgaXQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgKzkwIGlzIHdyaXR0ZW4gSEVSRSBhbmQgbm93aGVyZSBlbHNlLCBhbmQgaGVyZSB0aGUgbGF5ZXIgaXNcbiAgICAgICAgICAvLyBGT1JDRUQgcmF0aGVyIHRoYW4gcHJlZmVycmVkLiBBIHNjcmVlbiBmaWVsZCdzIGBkZWZhdWx0VmFsdWVgIGlzXG4gICAgICAgICAgLy8gZXZhbHVhdGVkIGJlZm9yZSB0aGUgZGVzY3JpcHRvciBnb2VzIG9uIHRoZSB3aXJlIGFuZCBhIGZsb3dcbiAgICAgICAgICAvLyB2YXJpYWJsZSdzIGRlZmF1bHQgaXMgYm91bmQgcmF3IChzZWUgdGhlIGRlY2xhcmF0aW9uIGFib3ZlKSwgc28gdGhpc1xuICAgICAgICAgIC8vIGlzIHRoZSBvbmx5IHBsYWNlIHRoZSBleHByZXNzaW9uIGNhbiBiZSB3cml0dGVuIGF0IGFsbC5cbiAgICAgICAgICAvLyBgaXNvRGF0ZShkYXlzRnJvbU5vdyg5MCkpYCB3cml0ZXMgdGhlIGBZWVlZLU1NLUREYCBzdHJpbmcgOTAgZGF5cyBvdXRcbiAgICAgICAgICAvLyBvbiB0aGUgVVRDIGNhbGVuZGFyIFx1MjAxNCB3aGF0IDE3LjMuMCdzIGB7VE9EQVkoKSArIDkwfWAgd2FzIG1lYXN1cmVkIHRvXG4gICAgICAgICAgLy8gc2VuZCBcdTIwMTQgYW5kIHRoZSB2YWx1ZSB0aGUgcmVwIHNlZXMgaXMgdGhlIHZhbHVlXG4gICAgICAgICAgLy8gYGNyZWF0ZV9vcHBvcnR1bml0eWAgd3JpdGVzLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gYHJlcXVpcmVkYCBtaXJyb3JzIHRoZSBjb2x1bW4gXHUyMDE0IGBjcm1fb3Bwb3J0dW5pdHkuY2xvc2VfZGF0ZWAgaXNcbiAgICAgICAgICAvLyBgcmVxdWlyZWRgICsgYG5vdE51bGxgIFx1MjAxNCBhbmQgaXQgaXMgd2hhdCBrZWVwcyB0aGUgcmVmdXNhbCBhdCB0aGVcbiAgICAgICAgICAvLyBTQ1JFRU4gYm91bmRhcnkuIE1lYXN1cmVkIGJvdGggd2F5cyBhZ2FpbnN0IGEgcmVhbCBPYmplY3RRTCBlbmdpbmU6XG4gICAgICAgICAgLy8gV0lUSE9VVCBpdCwgYSBzdWJtaXNzaW9uIGNhcnJ5aW5nIG5vIGRhdGUgcmVhY2hlc1xuICAgICAgICAgIC8vIGBjcmVhdGVfb3Bwb3J0dW5pdHlgIGFuZCBmYWlscyB0aGVyZSB3aXRoIGBDbG9zZSBEYXRlIGlzIHJlcXVpcmVkYCxcbiAgICAgICAgICAvLyBieSB3aGljaCBwb2ludCB0aGUgYWNjb3VudCBhbmQgdGhlIGNvbnRhY3QgaGF2ZSBhbHJlYWR5IGJlZW5cbiAgICAgICAgICAvLyB3cml0dGVuIGFuZCB0aGUgbGVhZCBpcyBsZWZ0IGhhbGYtY29udmVydGVkOyBXSVRIIGl0IHRoZSByZXN1bWUgaXNcbiAgICAgICAgICAvLyByZWZ1c2VkIGJlZm9yZSBhbnkgbm9kZSBydW5zLCBub3RoaW5nIGlzIHdyaXR0ZW4sIGFuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgIC8vIG5hbWVzIHRoZSBmaWVsZC4gVGhhdCBwYXRoIGlzIG5vdCBoeXBvdGhldGljYWwgXHUyMDE0IGEgcmVwIHdobyBDTEVBUlNcbiAgICAgICAgICAvLyB0aGUgcHJlZmlsbGVkIGRhdGUgcG9zdHMgdGhlIGtleSBlbXB0eSwgYW5kIGBpc1ByZXNlbnQoJycpYCBpc1xuICAgICAgICAgIC8vIGZhbHNlLiBBIGhpZGRlbiBgcmVxdWlyZWRgIG5ldmVyIGZpcmVzOiB0aGUgc2VydmVyIGNvbnRyYWN0IHNraXBzIGl0XG4gICAgICAgICAgLy8gd2hlbiBgdmlzaWJsZVdoZW5gIGV2YWx1YXRlcyBmYWxzZSwgYW5kIHNvIGRvZXMgdGhlIGNvbnNvbGUsIHdoaWNoXG4gICAgICAgICAgLy8gaXMgdGhlIHVudG91Y2hlZC1jaGVja2JveCBwYXRoIHRoaXMgc2NyZWVuIGhhcyBhbHdheXMgaGFkIHRvIGtlZXBcbiAgICAgICAgICAvLyB3b3JraW5nLlxuICAgICAgICAgIHsgbmFtZTogJ2Nsb3NlRGF0ZScsIGxhYmVsOiAnQ2xvc2UgRGF0ZScsIHR5cGU6ICdkYXRlJywgcmVxdWlyZWQ6IHRydWUsIGRlZmF1bHRWYWx1ZTogY2VsYGlzb0RhdGUoZGF5c0Zyb21Ob3coOTApKWAsIHZpc2libGVXaGVuOiAnY3JlYXRlT3Bwb3J0dW5pdHkgPT0gdHJ1ZScgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBcdTI2RDQgVGhpcyBmZXRjaCBtdXN0IHN0YXkgQUhFQUQgb2YgdGhlIHNjcmVlbjogdGhlIGR1cGxpY2F0ZSB3YXJuaW5nXG4gICAgICAvLyByZWFkcyBgbGVhZFJlY29yZGAsIGFuZCBhIHNjcmVlbiB0aGF0IHN1c3BlbmRzIGJlZm9yZSB0aGUgZmV0Y2ggaGFzXG4gICAgICAvLyBub3RoaW5nIHRvIHJlYWQuIFRoZSBmZXRjaCBpdHNlbGYgbmV2ZXIgZGVwZW5kZWQgb24gdGhlIHNjcmVlbiBcdTIwMTRcbiAgICAgIC8vIGByZWNvcmRJZGAgaXMgYW4gaW5wdXQgdmFyaWFibGUsIHNlZWRlZCBiZWZvcmUgdGhlIHJ1biBzdGFydHMuXG4gICAgICBpZDogJ2dldF9sZWFkJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0dldCBMZWFkIFJlY29yZCcsXG4gICAgICBjb25maWc6IHsgb2JqZWN0TmFtZTogJ2NybV9sZWFkJywgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkSWRgIH0sIG91dHB1dFZhcmlhYmxlOiAnbGVhZFJlY29yZCcgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEJyYW5jaGluZyBpcyBvbiBlZGdlcyBgZTIxYCAvIGBlMjJgIC8gYGUyNWAgXHUyMDE0IHNlZSBgZGVjaXNpb25fYWNjb3VudGAuXG4gICAgICAvLyBUaHJlZSB3YXlzIG91dCwgYmVjYXVzZSBgZHVwbGljYXRlX3N0YXR1c2AgY2FycmllcyB0d28gZGlmZmVyZW50IEtJTkRTXG4gICAgICAvLyBvZiBmYWN0IGFuZCB0aGV5IGdldCBkaWZmZXJlbnQgYW5zd2VyczogdGhlIG1hY2hpbmUncyBgc3VzcGVjdGVkYCBndWVzc1xuICAgICAgLy8gd2FybnMgYW5kIGxldHMgdGhlIHJlcCBkZWNpZGUgKGBlMjFgKSwgYSBwZXJzb24ncyBgY29uZmlybWVkYCB2ZXJkaWN0XG4gICAgICAvLyByZWZ1c2VzIG91dHJpZ2h0IChgZTI1YCksIGFuZCBldmVyeXRoaW5nIGVsc2UgY29udmVydHMgc2lsZW50bHkgKGBlMjJgKS5cbiAgICAgIGlkOiAnZGVjaXNpb25fZHVwbGljYXRlJywgdHlwZTogJ2RlY2lzaW9uJywgbGFiZWw6ICdEdXBsaWNhdGUgVmVyZGljdD8nLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gVGhlIHdhcm5pbmcgbmFtZXMgdGhlIHJlY29yZCB0aGUgd2F5IHRoZSBVSSBuYW1lcyBhIHBlcnNvbiBcdTIwMTQgYnkgdGhlXG4gICAgICAvLyBlbWFpbCBhZGRyZXNzIHRoZSB0d28gcmVjb3JkcyBzaGFyZSBcdTIwMTQgYW5kIE5PVCBieVxuICAgICAgLy8gYGR1cGxpY2F0ZV9vZl9sZWFkYCAvIGBkdXBsaWNhdGVfb2ZfY29udGFjdGAsIHdoaWNoIGhvbGQgaWRzLiBUaGF0IGlzXG4gICAgICAvLyB0aGUgaG91c2UgcnVsZSBgdGVzdC9yZWNvcmQtaWQtbm90LWluLXByb3NlLnRlc3QudHNgIHN0YXRlcyBmb3IgZXZlcnlcbiAgICAgIC8vIHNlbnRlbmNlIGEgdXNlciByZWFkczogXCJ0aGUgaWQgZ29lcyBpbiB0aGUgcmVsYXRpb25zaGlwIGZpZWxkIHRoYXRcbiAgICAgIC8vIGV4aXN0cyB0byBjYXJyeSBpdCwgb3Igbm93aGVyZVwiLiBUaGUgbGluayBpdHNlbGYgaXMgb24gdGhlIGxlYWQnc1xuICAgICAgLy8gcmVjb3JkIHBhZ2UgKGBsZWFkX2RldGFpbC5wYWdlLnRzYCksIHdoZXJlIGl0IGNhbiBiZSBjbGlja2VkLlxuICAgICAgLy9cbiAgICAgIC8vIFwiZmxhZ2dlZCBhdCBpbnRha2VcIiBpcyB0aGUgYXBwJ3Mgb3duIHB1Ymxpc2hlZCBkZWZpbml0aW9uIG9mIHRoaXNcbiAgICAgIC8vIHZhbHVlLCBub3QgYSBndWVzcyBhYm91dCBwcm92ZW5hbmNlOiBgZHVwbGljYXRlX3N0YXR1c2AncyBoZWxwIHRleHRcbiAgICAgIC8vIHJlYWRzIFwiU3VzcGVjdGVkID0gZmxhZ2dlZCBhdXRvbWF0aWNhbGx5IGF0IGludGFrZVwiIGluIGFsbCBmb3VyXG4gICAgICAvLyBsb2NhbGVzLCBhbmQgYGxlYWRfZHVwbGljYXRlX2NoZWNrYCBpcyBpbnNlcnQtb25seSBieSBkZXNpZ24uXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyB3YXJuaW5nJ3MgVEVYVCBpcyBFbmdsaXNoLW9ubHk6IGl0IGlzIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLFxuICAgICAgLy8gYW5kIG5vIGxvY2FsZSBwYWNrIHJlYWNoZXMgYSB2YXJpYWJsZSBcdTIwMTQgdGhlIHNjcmVlbidzIHRyYW5zbGF0ZWRcbiAgICAgIC8vIGBkZXNjcmlwdGlvbmAgY2FuIG9ubHkgY2FycnkgdGhlIGB7e2R1cGxpY2F0ZVdhcm5pbmd9fWAgaG9sZSB0aGF0XG4gICAgICAvLyBzaG93cyBpdC4gVGhlIHNjcmVlbnMnIG93biBoZWFkaW5ncyBhbmQgYm9kaWVzIGFyZSBrZXllZCBpbiB0aGUgcGFja3NcbiAgICAgIC8vIChgZmxvd3MubGVhZF9jb252ZXJzaW9uYCBpbiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy88bG9jYWxlPi9hcHAudHNgKSxcbiAgICAgIC8vIGFuZCB0aGUgYmFubmVyIG9uIHRoZSByZWNvcmQgcGFnZSBjYXJyaWVzIHRoZSB3YXJuaW5nIGluIGFsbCBmb3VyLlxuICAgICAgaWQ6ICd3YXJuX2R1cGxpY2F0ZScsIHR5cGU6ICdhc3NpZ25tZW50JywgbGFiZWw6ICdDb21wb3NlIER1cGxpY2F0ZSBXYXJuaW5nJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBhc3NpZ25tZW50czoge1xuICAgICAgICAgIGR1cGxpY2F0ZVdhcm5pbmc6XG4gICAgICAgICAgICBjZWxgJ1N1c3BlY3RlZCBkdXBsaWNhdGUgXHUyMDE0IGludGFrZSBmbGFnZ2VkIHRoaXMgbGVhZCBhcyByZXBlYXRpbmcgYW4gZXhpc3RpbmcgcmVjb3JkIHdpdGggdGhpcyBlbWFpbCBhZGRyZXNzICgnICsgbGVhZFJlY29yZC5lbWFpbCArICcpLiBDb252ZXJ0aW5nIGNyZWF0ZXMgYSBzZWNvbmQgYWNjb3VudCwgY29udGFjdCBhbmQgb3Bwb3J0dW5pdHkgZm9yIHRoZSBzYW1lIGJ1eWVyOyBjb21wYXJlIHRoZSBsaW5rZWQgcmVjb3JkIG9uIHRoZSBsZWFkIHBhZ2UgYmVmb3JlIHlvdSBjb250aW51ZS4nYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBUaGUgb3RoZXIgYnJhbmNoIGFzc2lnbnMgYG51bGxgLCB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSB3YXJuaW5nXG4gICAgICAvLyBDT05ESVRJT05BTDogdGhlIGRlc2NyaXB0aW9uIGhvbGUgcmVuZGVycyBpdCBhcyBubyBkZXNjcmlwdGlvbiBhdFxuICAgICAgLy8gYWxsIChzZWUgYHNjcmVlbl8xYCkuIFNhbWUgc2hhcGUgYXMgYG5vX29wcG9ydHVuaXR5YCBiZWxvdyBcdTIwMTQgYm90aCBicmFuY2hlc1xuICAgICAgLy8gd3JpdGUgdGhlIHZhcmlhYmxlIHNvIG5vIGRvd25zdHJlYW0gcmVhZCBldmVyIG1lZXRzIGFuIHVuc2V0IG9uZS5cbiAgICAgIGlkOiAnbm9fZHVwbGljYXRlX3dhcm5pbmcnLCB0eXBlOiAnYXNzaWdubWVudCcsIGxhYmVsOiAnTm8gRHVwbGljYXRlIFdhcm5pbmcnLFxuICAgICAgY29uZmlnOiB7IGFzc2lnbm1lbnRzOiB7IGR1cGxpY2F0ZVdhcm5pbmc6IG51bGwgfSB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gVGhlIFJFRlVTQUwuIEEgYGNvbmZpcm1lZGAgZHVwbGljYXRlIGlzIGEgcGVyc29uJ3MgdmVyZGljdCwgYW5kIHRoZSBhcHBcbiAgICAgIC8vIHN0b3BzIGNvbnZlcnRpbmcgb24gaXQgXHUyMDE0IHRoZSBydWxlIEFHRU5UUy5tZCBzdGF0ZXMgYXMgXCJpbnRlcmNlcHRpb25cbiAgICAgIC8vIHN0YW5kcyBvbiBhIHBlcnNvbidzIGp1ZGdlbWVudFwiLiBgc3VzcGVjdGVkYCBrZWVwcyB0aGUgd2Fybi1hbmQtYWxsb3dcbiAgICAgIC8vIGFib3ZlOiBhIG1hY2hpbmUncyBndWVzcyBzdGF5cyBhZHZpc29yeSwgYmVjYXVzZSBgbGVhZF9kdXBsaWNhdGVfY2hlY2tgXG4gICAgICAvLyBtYXRjaGVzIG9uIGVtYWlsIEVRVUFMSVRZIGFuZCBhIHNoYXJlZCBpbmJveCAoYGluZm9AYCwgYSBzd2l0Y2hib2FyZFxuICAgICAgLy8gYWRkcmVzcykgZmFsc2UtcG9zaXRpdmVzIGJ5IGNvbnN0cnVjdGlvbi4gXHUyNkQ0IERvIG5vdCBibG9jayBvbiB0aGUgZ3Vlc3MgXHUyMDE0XG4gICAgICAvLyBpdCB3b3VsZCBuZWVkIGFuIG92ZXJyaWRlIGZsYWcgdG8gc3RheSB1c2FibGUsIGFuZCBhbiBvdmVycmlkZSBmbGFnIGlzXG4gICAgICAvLyB0aGUgb25lIHNoYXBlIHRoaXMgZXhoaWJpdCBtdXN0IG5vdCBkZW1vbnN0cmF0ZS5cbiAgICAgIC8vXG4gICAgICAvLyAjIyBXaHkgdGhlIHJlZnVzYWwgaXMgSEVSRSBhbmQgbm90IG9uIGBjb252ZXJ0X2xlYWRgJ3MgcHJlZGljYXRlXG4gICAgICAvL1xuICAgICAgLy8gQSByZWZ1c2FsIG11c3QgTkFNRSB0aGUgdmVyZGljdCBhbmQgdGhlIHN1cnZpdmluZyByZWNvcmQsIGFuZCBtZWFzdXJlZFxuICAgICAgLy8gYWdhaW5zdCBgQG9iamVjdHN0YWNrL3NwZWNgIDE3LjIuMCB0aGUgYWN0aW9uIHByZWRpY2F0ZXMgY2Fubm90OlxuICAgICAgLy8gYHZpc2libGVgIGFuZCBgZGlzYWJsZWRgIGFyZSBlYWNoIGEgYmFyZSBib29sZWFuL0NFTCBlbnZlbG9wZSB3aXRoXG4gICAgICAvLyBub3doZXJlIHRvIHB1dCBhIHNlbnRlbmNlLCBzbyBgdmlzaWJsZWAgaGlkZXMgYSBidXR0b24gdGhhdCBjYW5ub3QgdGhlblxuICAgICAgLy8gZXhwbGFpbiBpdHNlbGYgYW5kIGBkaXNhYmxlZGAgZ3JleXMgb25lIG91dCB3aXRoIG5vIHJlYXNvbiBhdHRhY2hlZC5cbiAgICAgIC8vIGBlcnJvck1lc3NhZ2VgIG9uIHRoZSBBY3Rpb24gaXMgYSBzaW5nbGUgc3RhdGljIHN0cmluZyBcdTIwMTQgd2hhdCB0aGVcbiAgICAgIC8vIGNvbnNvbGUgdG9hc3RzIG9uIGEgRkFJTEVEIHJ1biBcdTIwMTQgYW5kIGNhbm5vdCBzYXkgYW55dGhpbmcgYWJvdXQgVEhJU1xuICAgICAgLy8gbGVhZC4gQSBzY3JlZW4gbm9kZSdzIGBkZXNjcmlwdGlvbmAgaXMgYSB0ZXh0IHNsb3QgcmVuZGVyZWQgcGVyIHJ1blxuICAgICAgLy8gYW5kIHNob3duIGJ5IGBGbG93UnVubmVyYCBhcyB0aGUgZGlhbG9nIGJvZHkuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIGZsb3cgaXMgYWxzbyB0aGUgb25seSBjaG9rZSBwb2ludCBjb3ZlcmluZyBldmVyeSBkb29yOiB0aGVcbiAgICAgIC8vIHJlY29yZC1oZWFkZXIgYnV0dG9uLCB0aGUgbGlzdC1yb3cgYnV0dG9uIGFuZCB0aGUgYGFjdGlvbl9jb252ZXJ0X2xlYWRgXG4gICAgICAvLyBBSSB0b29sIGFsbCBkaXNwYXRjaCBgUE9TVCAvYXV0b21hdGlvbi9sZWFkX2NvbnZlcnNpb24vdHJpZ2dlcmAsIHdoaWxlXG4gICAgICAvLyBgdmlzaWJsZWAgLyBgZGlzYWJsZWRgIGFyZSBjb25zb2xlLXNpZGUgYW5kIHNheSBub3RoaW5nIHRvIHRoZSBvdGhlclxuICAgICAgLy8gdHdvLlxuICAgICAgLy9cbiAgICAgIC8vICMjIFdoYXQgdGhlIHJlcCBzZWVzLCBtZWFzdXJlZCBvbiB0aGUgc2hpcHBlZCBjb25zb2xlIGJ1bmRsZVxuICAgICAgLy9cbiAgICAgIC8vIEEgcnVuIHRoYXQgUEFVU0VTIHJldHVybnMgYHsgc3VjY2VzczogdHJ1ZSwgc2lsZW50OiB0cnVlIH1gIHRvIHRoZVxuICAgICAgLy8gYWN0aW9uIGZyYW1ld29yayAoYFJlY29yZERldGFpbFZpZXdgJ3MgZmxvdyBoYW5kbGVyKSwgYW5kIGBzaWxlbnRgXG4gICAgICAvLyBzdXBwcmVzc2VzIHRoZSBzdWNjZXNzIHRvYXN0IFx1MjAxNCBzbyBgY29udmVydF9sZWFkYCdzXG4gICAgICAvLyBgc3VjY2Vzc01lc3NhZ2U6ICdMZWFkIGNvbnZlcnRlZCBzdWNjZXNzZnVsbHkhJ2AgZG9lcyBOT1QgZmlyZSBiZWhpbmRcbiAgICAgIC8vIHRoaXMgZGlhbG9nLiBTdWJtaXR0aW5nIGl0IHJlc3VtZXMgaW50byBgZW5kYDsgbm90aGluZyBpcyBjcmVhdGVkIGFuZFxuICAgICAgLy8gdGhlIGxlYWQgaXMgdW50b3VjaGVkIG9uIGVpdGhlciBwYXRoLCBiZWNhdXNlIGV2ZXJ5IHdyaXRlIGluIHRoaXMgZmxvd1xuICAgICAgLy8gaXMgZG93bnN0cmVhbSBvZiBgc2NyZWVuXzFgLlxuICAgICAgLy9cbiAgICAgIC8vICMjIFdoYXQgdGhlIGNvcHkgbWF5IGNsYWltXG4gICAgICAvL1xuICAgICAgLy8gXHUyNkQ0IE5PVCB0aGUgc2hhcmVkIGVtYWlsIGFkZHJlc3MsIHdoaWNoIGlzIHdoYXQgYHdhcm5fZHVwbGljYXRlYCBhYm92ZVxuICAgICAgLy8gdXNlcy4gVGhhdCBjbGFpbSBpcyBzYWZlIGZvciBgc3VzcGVjdGVkYCBiZWNhdXNlIG9ubHlcbiAgICAgIC8vIGBsZWFkX2R1cGxpY2F0ZV9jaGVja2Agd3JpdGVzIGl0IGFuZCBpdCBtYXRjaGVzIG9uIGVtYWlsOyBgY29uZmlybWVkYFxuICAgICAgLy8gaXMgd3JpdHRlbiBieSBhIFBFUlNPTiwgYW5kIHRoZSBsZWFkIGZvcm0gbGV0cyBhIHJldmlld2VyIHBvaW50XG4gICAgICAvLyBgZHVwbGljYXRlX29mX3R5cGVgICsgaXRzIGxvb2t1cCBhdCBhbnkgcmVjb3JkIHRoZXkgbGlrZS4gU28gdGhlXG4gICAgICAvLyByZWZ1c2FsIG5hbWVzIHRoZSBzdXJ2aXZvciB0aHJvdWdoIHRoZSByZWxhdGlvbnNoaXAgZmllbGRzIHRoYXQgZXhpc3RcbiAgICAgIC8vIHRvIGNhcnJ5IGl0IChgdGVzdC9yZWNvcmQtaWQtbm90LWluLXByb3NlLnRlc3QudHNgOiBcInRoZSBpZCBnb2VzIGluIHRoZVxuICAgICAgLy8gcmVsYXRpb25zaGlwIGZpZWxkIHRoYXQgZXhpc3RzIHRvIGNhcnJ5IGl0LCBvciBub3doZXJlXCIpLCBuYW1pbmcgdGhlXG4gICAgICAvLyBgZHVwbGljYXRlc2AgZmllbGQgZ3JvdXAgYnkgaXRzIHNoaXBwZWQgbGFiZWwsIFwiRHVwbGljYXRlIE1hbmFnZW1lbnRcIi5cbiAgICAgIC8vIFRoYXQgc2VudGVuY2UgYWxzbyBzdGF5cyB0cnVlIG9uIHRoZSBgZXJhc2VkYCB0b21ic3RvbmUsIHdoZXJlIHRoZVxuICAgICAgLy8gdmVyZGljdCBzdXJ2aXZlcyBpdHMgcG9pbnRlciAoYGxlYWQuaG9vay50c2AsIGpvYiAxYykuXG4gICAgICAvL1xuICAgICAgLy8gXHUyNkQ0IE5ldmVyIHRyYW5zY3JpYmUgdGhlIHZvY2FidWxhcnkgb2YgYGR1cGxpY2F0ZV9vZl90eXBlYCBpbnRvIHRoaXNcbiAgICAgIC8vIHNlbnRlbmNlIChcImFuIGV4aXN0aW5nIExlYWRcIiAvIFwiYW4gZXhpc3RpbmcgQ29udGFjdFwiKS4gVGhvc2UgbGFiZWxzIGFyZVxuICAgICAgLy8gbG9jYWxlLXBhY2sgZmFjdHMgd2l0aCBvbmUgc291cmNlIG9mIHRydXRoLCB0aGUgcmVwIGNhbiBzZWUgdGhlbSBvbiB0aGVcbiAgICAgIC8vIHNlY3Rpb24gdGhpcyBsaW5lIHBvaW50cyBhdCwgYW5kIGEgaGFuZC1jb3BpZWQgbWFjaGluZSBsaXN0IGluIHByb3NlIGlzXG4gICAgICAvLyB0aGUgZHJpZnQgQUdFTlRTLm1kIGRvY3VtZW50YXRpb24gcnVsZSA1IGZvcmJpZHMuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHRpdGxlIGFuZCB0aGUgYm9keSBhcmUgdHJhbnNsYXRlZCBpbiB0aGUgcGFja3NcbiAgICAgIC8vIChgZmxvd3MubGVhZF9jb252ZXJzaW9uLnNjcmVlbnMucmVmdXNlX2NvbmZpcm1lZF9kdXBsaWNhdGVgKS5cbiAgICAgIGlkOiAncmVmdXNlX2NvbmZpcm1lZF9kdXBsaWNhdGUnLCB0eXBlOiAnc2NyZWVuJywgbGFiZWw6ICdDb252ZXJzaW9uIFJlZnVzZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHRpdGxlOiAnQ29udmVyc2lvbiByZWZ1c2VkJyxcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJUaGlzIGxlYWQncyBEdXBsaWNhdGUgU3RhdHVzIGlzIENvbmZpcm1lZDogYSByZXZpZXdlciBjb21wYXJlZCBpdCBhZ2FpbnN0IGFuIGV4aXN0aW5nIHJlY29yZCBhbmQgcmVjb3JkZWQgdGhhdCBpdCByZXBlYXRzIG9uZS4gQ29udmVydGluZyB3b3VsZCBjcmVhdGUgYSBzZWNvbmQgYWNjb3VudCwgY29udGFjdCBhbmQgb3Bwb3J0dW5pdHkgZm9yIHRoZSBzYW1lIGJ1eWVyLiBUaGUgRHVwbGljYXRlIE1hbmFnZW1lbnQgc2VjdGlvbiBvbiB0aGlzIGxlYWQgbmFtZXMgdGhlIHN1cnZpdmluZyByZWNvcmQ7IGRpc3F1YWxpZnkgdGhpcyBsZWFkIGFzIGEgZHVwbGljYXRlIGluc3RlYWQuIE9ubHkgYSByZXZpZXdlciByZXZpc2luZyB0aGF0IHZlcmRpY3QgcmVvcGVucyBjb252ZXJzaW9uLlwiLFxuICAgICAgICAvLyBBIG1lc3NhZ2Utb25seSBzY3JlZW46IG5vIGZpZWxkcywgc28gdGhlIHBhdXNlIGhhcyB0byBiZSBhc2tlZCBmb3IuXG4gICAgICAgIC8vIGB3YWl0Rm9ySW5wdXRgIGlzIHdoYXQgdHVybnMgYSBmaWVsZC1sZXNzIHNjcmVlbiBmcm9tIGEgc2VydmVyLXNpZGVcbiAgICAgICAgLy8gcGFzcy10aHJvdWdoIGludG8gdGhlIGRpYWxvZyB0aGUgcmVwIHJlYWRzICh0aGUgZXhlY3V0b3Inc1xuICAgICAgICAvLyBgc2hvdWxkUGF1c2VgKSwgYW5kIHdpdGhvdXQgaXQgdGhpcyBub2RlIHdvdWxkIGZhbGwgdGhyb3VnaCB0byBgZW5kYFxuICAgICAgICAvLyBpbiBzaWxlbmNlIFx1MjAxNCBhIHJlZnVzYWwgbm9ib2R5IGlzIHRvbGQgYWJvdXQuXG4gICAgICAgIHdhaXRGb3JJbnB1dDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBCcmFuY2hpbmcgaXMgb24gZWRnZXMgYGUyOGAgLyBgZTI5YCBcdTIwMTQgc2VlIGBkZWNpc2lvbl9hY2NvdW50YC5cbiAgICAgIGlkOiAnZGVjaXNpb25fYXBwcm92YWwnLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0FwcHJvdmVkIGZvciBDb252ZXJzaW9uPycsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBUaGUgYXBwcm92YWwgZ2F0ZSwgb24gdGhlIHN1cmZhY2UgYSBSRVNUIGNhbGxlciByZWFjaGVzIChSRVEtMDAwNVxuICAgICAgLy8gYWNjZXB0YW5jZSAzKS4gYGNvbnZlcnRfbGVhZGAncyBgdmlzaWJsZWAgcHJlZGljYXRlIGhpZGVzIHRoZSBidXR0b24gYW5kXG4gICAgICAvLyBgbGVhZC5ob29rLnRzYCByZWZ1c2VzIHRoZSB3cml0ZSwgYnV0IHRoaXMgZmxvdyBoYXMgaXRzIG93biBkb29yIFx1MjAxNFxuICAgICAgLy8gYFBPU1QgL2F1dG9tYXRpb24vbGVhZF9jb252ZXJzaW9uL3RyaWdnZXJgIFx1MjAxNCBhbmQgd2l0aG91dCB0aGlzIGJyYW5jaCBhXG4gICAgICAvLyBjYWxsZXIgdGhyb3VnaCB0aGF0IGRvb3Igd291bGQgcnVuIHRoZSB3aG9sZSBjb252ZXJzaW9uIGFuZCBvbmx5IGJlXG4gICAgICAvLyByZWZ1c2VkIGF0IGBtYXJrX2NvbnZlcnRlZGAsIGJ5IHdoaWNoIHBvaW50IHRoZSBhY2NvdW50LCB0aGUgY29udGFjdCBhbmRcbiAgICAgIC8vIHRoZSBvcHBvcnR1bml0eSBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuIGFuZCB0aGUgbGVhZCBpcyBsZWZ0XG4gICAgICAvLyBoYWxmLWNvbnZlcnRlZC4gUmVmdXNpbmcgSEVSRSwgYWhlYWQgb2YgYHNjcmVlbl8xYCwgaXMgd2hhdCBtYWtlcyB0aGVcbiAgICAgIC8vIGdhdGUgd2hvbGU6IGV2ZXJ5IGNyZWF0ZSBhbmQgdXBkYXRlIGluIHRoaXMgZmxvdyBzaXRzIGJlaGluZCB0aGF0XG4gICAgICAvLyBzY3JlZW4sIGFuZCB0aGlzIHBhdGggbmV2ZXIgcmVhY2hlcyBpdC5cbiAgICAgIGlkOiAncmVmdXNlX3VuYXBwcm92ZWQnLCB0eXBlOiAnc2NyZWVuJywgbGFiZWw6ICdDb252ZXJzaW9uIFJlZnVzZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHRpdGxlOiAnQ29udmVyc2lvbiByZWZ1c2VkJyxcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJUaGlzIGxlYWQgaGFzIG5vdCBiZWVuIGFwcHJvdmVkIGZvciBjb252ZXJzaW9uLiBBbiBhcHByb3ZlciBoYXMgdG8gc2lnbiBpdCBvZmYgYmVmb3JlIGl0IGNhbiBiZWNvbWUgYW4gYWNjb3VudCwgY29udGFjdCBhbmQgb3Bwb3J0dW5pdHk7IHRoZSBDb252ZXJzaW9uIEFwcHJvdmFsIGZpZWxkIG9uIHRoZSBsZWFkIHNob3dzIHdoZXRoZXIgdGhlIGRlY2lzaW9uIGlzIHN0aWxsIHBlbmRpbmcgb3Igd2FzIHJlZnVzZWQuIEtlZXAgd29ya2luZyB0aGUgbGVhZCBpbiB0aGUgbWVhbnRpbWUgXHUyMDE0IG5vdGhpbmcgYWJvdXQgaXQgaXMgZnJvemVuLlwiLFxuICAgICAgICAvLyBGaWVsZC1sZXNzIHNjcmVlbjogYHdhaXRGb3JJbnB1dGAgaXMgd2hhdCB0dXJucyBpdCBmcm9tIGEgc2VydmVyLXNpZGVcbiAgICAgICAgLy8gcGFzcy10aHJvdWdoIGludG8gdGhlIGRpYWxvZyB0aGUgcmVwIHJlYWRzLiBTZWVcbiAgICAgICAgLy8gYHJlZnVzZV9jb25maXJtZWRfZHVwbGljYXRlYCBmb3IgdGhlIG1lY2hhbmlzbS5cbiAgICAgICAgd2FpdEZvcklucHV0OiB0cnVlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEJyYW5jaGluZyBpcyBvbiBlZGdlcyBgZTMxYCAvIGBlMzJgIFx1MjAxNCBzZWUgYGRlY2lzaW9uX2FjY291bnRgLiBUaGVcbiAgICAgIC8vIG1hdGNoLWtleSBndWFyZCBzaXRzIGJldHdlZW4gdGhlIGR1cGxpY2F0ZSB2ZXJkaWN0IGFuZCBgc2NyZWVuXzFgLCBzb1xuICAgICAgLy8gaXQgZG9taW5hdGVzIGBmaW5kX2FjY291bnRgIGFuZCBhIGtleS1sZXNzIGxlYWQgaXMgcmVmdXNlZCBiZWZvcmUgdGhlXG4gICAgICAvLyByZXAgZmlsbHMgaW4gdGhlIGZvcm0gYW5kIGJlZm9yZSBhbnkgd3JpdGUuIEl0IGlzIHRoZSBMQVNUIG9mIHRoZVxuICAgICAgLy8gdGhyZWUgcmVmdXNhbHMgb24gcHVycG9zZTogYW4gdW5hcHByb3ZlZCBsZWFkIG9yIGEgY29uZmlybWVkIGR1cGxpY2F0ZVxuICAgICAgLy8gaXMgdG9sZCB0aGF0IHZlcmRpY3QgZmlyc3QsIGFuZCBhIG1pc3Npbmcga2V5IGlzIGEgcmVwYWlyYWJsZSBkYXRhXG4gICAgICAvLyBnYXAgcmF0aGVyIHRoYW4gYSB2ZXJkaWN0LlxuICAgICAgaWQ6ICdkZWNpc2lvbl9tYXRjaF9rZXknLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0NvbXBhbnkgTWF0Y2ggS2V5PycsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBUaGUgS0VZLUxFU1MgcmVmdXNhbCAoIzIwMTcpLiBXaHkgYGZpbmRfYWNjb3VudGAgbXVzdCBub3QgcnVuIHdpdGhvdXRcbiAgICAgIC8vIGEga2V5IGlzIHJlY29yZGVkIG9uIHRoYXQgbm9kZTsgdGhpcyBpcyB3aGF0IHRoZSByZXAgcmVhZHMgaW5zdGVhZC5cbiAgICAgIC8vXG4gICAgICAvLyBBIHJlZnVzYWwsIG5vdCBhIG5ldyBhY2NvdW50LCBhbmQgdGhhdCBpcyB0aGUgZmxvdydzIG93biBzdGF0ZWQgaW50ZW50XG4gICAgICAvLyByYXRoZXIgdGhhbiBhIGZyZXNoIGNob2ljZTogYSBjb252ZXJzaW9uIHRoYXQgc3RvcHMgaXMgZmFyIGNoZWFwZXIgdG9cbiAgICAgIC8vIGRpYWdub3NlIHRoYW4gb25lIHRoYXQgcXVpZXRseSBhdHRhY2hlcyB0byB0aGUgd3JvbmcgYWNjb3VudCBvclxuICAgICAgLy8gY3JlYXRlcyBhIGR1cGxpY2F0ZSBvbmUsIGFuZCBgc2NyZWVuXzFgIG9mZmVycyB0aGUgcmVwIG5vIGFjY291bnRcbiAgICAgIC8vIGNob2ljZSB0aGF0IGNvdWxkIGNvbmZpcm0gYSBtYXRjaCBieSBoYW5kLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBjb3B5IGNsYWltcyBvbmx5IHdoYXQgaG9sZHMgb24gZXZlcnkgcGF0aCBpbnRvIGl0OiB0aGUga2V5IGlzXG4gICAgICAvLyBkZXJpdmVkIGZyb20gYGNvbXBhbnlgIG9uIGV2ZXJ5IHdyaXRlIHRoYXQgY2FycmllcyBpdFxuICAgICAgLy8gKGBsZWFkX2R1cGxpY2F0ZV9jaGVja2ApLCBhbmQgbm90aGluZyBoYXMgYmVlbiB3cml0dGVuLCBiZWNhdXNlIGV2ZXJ5XG4gICAgICAvLyBjcmVhdGUgYW5kIHVwZGF0ZSBpbiB0aGlzIGZsb3cgc2l0cyBiZWhpbmQgYHNjcmVlbl8xYC4gSXRzIHRpdGxlIGFuZFxuICAgICAgLy8gYm9keSBhcmUgdHJhbnNsYXRlZCBpbiB0aGUgcGFja3MsIGxpa2UgdGhlIG90aGVyIHR3byByZWZ1c2Fscy5cbiAgICAgIC8vXG4gICAgICAvLyBGaWVsZC1sZXNzIHNjcmVlbjogYHdhaXRGb3JJbnB1dGAgaXMgd2hhdCB0dXJucyBpdCBmcm9tIGEgc2VydmVyLXNpZGVcbiAgICAgIC8vIHBhc3MtdGhyb3VnaCBpbnRvIHRoZSBkaWFsb2cgdGhlIHJlcCByZWFkcy4gU2VlXG4gICAgICAvLyBgcmVmdXNlX2NvbmZpcm1lZF9kdXBsaWNhdGVgIGZvciB0aGUgbWVjaGFuaXNtLlxuICAgICAgaWQ6ICdyZWZ1c2Vfbm9fbWF0Y2hfa2V5JywgdHlwZTogJ3NjcmVlbicsIGxhYmVsOiAnQ29udmVyc2lvbiBSZWZ1c2VkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICB0aXRsZTogJ0NvbnZlcnNpb24gcmVmdXNlZCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIFwiVGhpcyBsZWFkJ3MgY29tcGFueSBoYXMgbm8gbWF0Y2gga2V5LCBzbyBjb252ZXJzaW9uIGNhbm5vdCB0ZWxsIHdoaWNoIGFjY291bnQgaXQgYmVsb25ncyB0bywgYW5kIGl0IHdpbGwgbm90IGd1ZXNzOiBhIGd1ZXNzIGNvdWxkIGZpbGUgdGhlIGNvbnRhY3QgYW5kIG9wcG9ydHVuaXR5IHVuZGVyIGFub3RoZXIgY3VzdG9tZXIuIFNhdmluZyB0aGUgbGVhZCdzIENvbXBhbnkgcmVidWlsZHMgdGhlIGtleSwgc28gc2F2ZSBpdCBhZ2FpbiwgdGhlbiBjb252ZXJ0LiBOb3RoaW5nIGhhcyBiZWVuIGNyZWF0ZWQuXCIsXG4gICAgICAgIHdhaXRGb3JJbnB1dDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBBY2NvdW50IGRlZHVwZTogbWF0Y2ggb24gdGhlIE5PUk1BTElaRUQgY29tcGFueSBuYW1lLCBuZXZlciBvbiB0aGUgcmF3XG4gICAgICAvLyBvbmUgXHUyMDE0IFwiQWNtZSBDb3JwXCIgYW5kIFwiQUNNRSAgQ29ycFwiIGFyZSB0aGUgc2FtZSBhY2NvdW50LlxuICAgICAgLy9cbiAgICAgIC8vIEJvdGggc2lkZXMgb2YgdGhpcyBjb21wYXJpc29uIGFyZSBzdG9yZWQsIGhvb2stbWFpbnRhaW5lZCBjb2x1bW5zLCBhbmRcbiAgICAgIC8vIG9uIDE3LnggdGhhdCB3YXMgZm9yY2VkIHJhdGhlciB0aGFuIGNob3NlbjogYSBmbG93IHRlbXBsYXRlIGNvdWxkIG5vdFxuICAgICAgLy8gbm9ybWFsaXplIEFOWVRISU5HLiBgc2VydmljZS1hdXRvbWF0aW9uYCdzIGByZXNvbHZlVG9rZW5gIHJlY29nbmlzZXMgZXhhY3RseSBvbmVcbiAgICAgIC8vIGZ1bmN0aW9uIGZvcm0gXHUyMDE0IGBOT1coKWAgLyBgVE9EQVkoKWAgXHUyMDE0IGFuZCBldmVyeSBiYXJlIGlkZW50aWZpZXIgaW4gdGhlXG4gICAgICAvLyBleHByZXNzaW9uIGZhbGxiYWNrIGlzIHN1YnN0aXR1dGVkIGJlZm9yZSBldmFsdWF0aW9uLCBzbyBubyBzdHJpbmdcbiAgICAgIC8vIG1ldGhvZCBpcyByZWFjaGFibGUgZWl0aGVyOiBge0xPV0VSKHgpfWAsIGB7VFJJTSh4KX1gIGFuZFxuICAgICAgLy8gYHt4LnRvTG93ZXJDYXNlKCl9YCBhbGwgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCwgYW5kIGFuIHVud3JhcHBlZFxuICAgICAgLy8gYExPV0VSKHt4fSlgIGludGVycG9sYXRlcyBsaXRlcmFsbHkgdG8gXCJMT1dFUihBY21lIENvcnApXCIuIEEgZm9ybXVsYVxuICAgICAgLy8gZmllbGQgaXMgbm8gaGVscCBlaXRoZXIgXHUyMDE0IGl0IGhhcyBubyBwaHlzaWNhbCBjb2x1bW4gdG8gZmlsdGVyIG9uLiBTb1xuICAgICAgLy8gdGhlIHByb2R1Y2VyIGNhbm9uaWNhbGl6ZXMgKGBhY2NvdW50X3Byb3RlY3Rpb25gLFxuICAgICAgLy8gYGxlYWRfZHVwbGljYXRlX2NoZWNrYCkgYW5kIHRoaXMgbm9kZSBkb2VzIGEgcGxhaW4sIGluZGV4ZWQgZXF1YWxpdHlcbiAgICAgIC8vIG1hdGNoLiBgdGVzdC9hY2NvdW50LW5hbWUtbm9ybWFsaXplZC1tYXRjaC50ZXN0LnRzYCByZS1tZWFzdXJlcyBhbGwgb2ZcbiAgICAgIC8vIHRoYXQgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgdGhpcyBwYXJhZ3JhcGguXG4gICAgICAvL1xuICAgICAgLy8gTm9ybWFsaXplLXRoZW4tRVhBQ1Qgb25seTogbG93ZXIgKyB0cmltICsgY29sbGFwc2UgaW50ZXJuYWxcbiAgICAgIC8vIHdoaXRlc3BhY2UuIEZ1enp5IG1hdGNoaW5nIHN0YXlzIG91dCBvZiBzY29wZS5cbiAgICAgIC8vXG4gICAgICAvLyBBIGxlYWQgd2l0aCBOTyBgY29tcGFueV9ub3JtYWxpemVkYCBuZXZlciByZWFjaGVzIHRoaXMgbm9kZTpcbiAgICAgIC8vIGBkZWNpc2lvbl9tYXRjaF9rZXlgLCBhaGVhZCBvZiBgc2NyZWVuXzFgLCByZWZ1c2VzIGl0IGZpcnN0LiBUaGUgbm9kZVxuICAgICAgLy8gY2Fubm90IGJlIGxlZnQgdG8gcmVmdXNlIG9uIGl0cyBvd24sIGJlY2F1c2UgXCJubyBrZXlcIiBhcnJpdmVzIGluIHR3b1xuICAgICAgLy8gc2hhcGVzIHRoYXQgYmVoYXZlIGRpZmZlcmVudGx5IChib3RoIG1lYXN1cmVkIG9uIDE3LjcuMCk6XG4gICAgICAvL1xuICAgICAgLy8gICBcdTAwQjcgQUJTRU5UIFx1MjAxNCBhIHNwYXJzZSBkYXRhc291cmNlIChgZHJpdmVyLW1lbW9yeWAgLyBgZHJpdmVyLW1vbmdvZGJgKVxuICAgICAgLy8gICAgIG9uIGEgcm93IG5ldmVyIHdyaXR0ZW4gd2l0aCB0aGUgY29sdW1uLiBUaGUgdG9rZW4gcmVzb2x2ZXMgdG9cbiAgICAgIC8vICAgICBub3RoaW5nIGFuZCBgZ2V0X3JlY29yZGAgcmVmdXNlcyB0byBydW4sIHNvIHRoZSBydW4gRkFJTFNcbiAgICAgIC8vICAgICAoYEZMT1dfRkFJTEVEYCwgXCJyZWZ1c2luZyB0byBydW4gXHUyMDE0IDEgZmlsdGVyIGNvbmRpdGlvbihzKSByZXNvbHZlZFxuICAgICAgLy8gICAgIHRvIG5vdGhpbmcgYW5kIHdlcmUgZHJvcHBlZCBmcm9tIHRoZSBxdWVyeSBcdTIwMjZcIikuXG4gICAgICAvLyAgIFx1MDBCNyBOVUxMIFx1MjAxNCBTUUwsIG9yIGFueSBkYXRhc291cmNlIG9uY2UgdGhlIGNvbHVtbiBpcyB3cml0dGVuIGVtcHR5LFxuICAgICAgLy8gICAgIHdoaWNoIGBsZWFkX2R1cGxpY2F0ZV9jaGVja2AgZG9lcyBvbiBwdXJwb3NlIGZvciBhIGNvbXBhbnkgdGhhdFxuICAgICAgLy8gICAgIGZvbGRzIHRvIG5vdGhpbmcuIFRoZSB0b2tlbiByZXNvbHZlcyB0byBgbnVsbGAsIGFuZCBhIGJhcmUgYG51bGxgXG4gICAgICAvLyAgICAgaW4gYSBmaWx0ZXIgaXMgdGhlIHBsYXRmb3JtJ3MgZG9jdW1lbnRlZCBIQVMtTk8tVkFMVUUgcHJlZGljYXRlXG4gICAgICAvLyAgICAgKGAkZXE6IG51bGxgLCBgQG9iamVjdHN0YWNrL3NwZWNgIGBkYXRhL2ZpbHRlci56b2QudHNgKS4gVGhpc1xuICAgICAgLy8gICAgIGxvb2t1cCB0aGVuIE1BVENIRVMgZXZlcnkgYWNjb3VudCB3aG9zZSBvd24ga2V5IGlzIG51bGwsIGFuZCB0aGVcbiAgICAgIC8vICAgICBsZWFkIGNvbnZlcnRzIG9udG8gYW4gdW5yZWxhdGVkIGN1c3RvbWVyJ3MgYWNjb3VudCAoIzIwMTcpLlxuICAgICAgLy9cbiAgICAgIC8vIEEga2V5LWxlc3MgbGVhZCBpcyBub3Qgb25seSBhIHJvdyB3cml0dGVuIGJlZm9yZSB0aGUgcHJvZHVjZXIgZXhpc3RlZFxuICAgICAgLy8gKHRoZSBiYWNrZmlsbCBpbiBkb2NzL01BSU5URU5BTkNFLm1kIFx1MDBBNzMuMyk6IGEgbm9uLXN0cmluZyBjb21wYW55XG4gICAgICAvLyB3cml0dGVuIHRocm91Z2ggdGhlIHJlY29yZCBBUEkgZm9sZHMgdG8gYG51bGxgIHRvby4gQSBjb252ZXJzaW9uIHRoYXRcbiAgICAgIC8vIHN0b3BzIGlzIGZhciBjaGVhcGVyIHRvIGRpYWdub3NlIHRoYW4gb25lIHRoYXQgcXVpZXRseSBhdHRhY2hlcyB0byB0aGVcbiAgICAgIC8vIHdyb25nIGFjY291bnQgb3IgY3JlYXRlcyBhIGR1cGxpY2F0ZSBvbmUsIHNvIHRoZSBhbnN3ZXIgaXMgdGhlXG4gICAgICAvLyByZWZ1c2FsIHRoZSByZXAgcmVhZHMgaW4gYHJlZnVzZV9ub19tYXRjaF9rZXlgLlxuICAgICAgLy9cbiAgICAgIC8vIFNpbmNlIDE4LjAuMC1uZXh0LjAgdGhlIG9wZXJhbmQgaXMgYSBDRUwgZW52ZWxvcGU6IGFuIGFic2VudCBrZXkgZmFpbHNcbiAgICAgIC8vIHRoZSBydW4gYmVmb3JlIHRoZSBxdWVyeSwgYW5kIGEgbnVsbCBvbmUgcmVmdXNlcyB0aGUgbm9kZSBpbnN0ZWFkIG9mXG4gICAgICAvLyBtYXRjaGluZyAodGhlIHBsYXRmb3JtJ3MgYGZsb3ctdmFsdWUtc2xvdC10ZW1wbGF0ZS1kaWFsZWN0LXJlZnVzZWRgXG4gICAgICAvLyBlbnRyeTsgbm90IHJlLW1lYXN1cmVkIGhlcmUpLiBOZWl0aGVyIHNoYXBlIGNvbnZlcnRzIG9udG8gYW5vdGhlclxuICAgICAgLy8gYWNjb3VudCBhbnkgbW9yZSwgYW5kIGBkZWNpc2lvbl9tYXRjaF9rZXlgIHN0aWxsIHJlZnVzZXMgZmlyc3QsIHdpdGhcbiAgICAgIC8vIGNvcHkgdGhlIHJlcCBjYW4gcmVhZC5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2RDQgTmV2ZXIgcGFwZXIgdGhpcyBvdmVyIHdpdGggYSBzZWNvbmQsIGNhc2Utc2Vuc2l0aXZlIGxvb2t1cCBvbiB0aGVcbiAgICAgIC8vIHJhdyBgbmFtZWA6IGEgbWlzc2luZyBrZXkgbWVhbnMgdGhlIHByb2R1Y2VyIGNvdWxkIG5vdCBkZXJpdmUgb25lLCBhbmRcbiAgICAgIC8vIGEgdG9sZXJhbnQgY29uc3VtZXIgcGF0aCB3b3VsZCBoaWRlIHRoYXQgd2hpbGUgcmVzdG9yaW5nIHRoZSBleGFjdCBidWdcbiAgICAgIC8vIHRoaXMgbm9kZSBleGlzdHMgdG8gZml4LlxuICAgICAgaWQ6ICdmaW5kX2FjY291bnQnLCB0eXBlOiAnZ2V0X3JlY29yZCcsIGxhYmVsOiAnRmluZCBFeGlzdGluZyBBY2NvdW50JyxcbiAgICAgIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX2FjY291bnQnLCBmaWx0ZXI6IHsgbmFtZV9ub3JtYWxpemVkOiBjZWxgbGVhZFJlY29yZC5jb21wYW55X25vcm1hbGl6ZWRgIH0sIG91dHB1dFZhcmlhYmxlOiAnbWF0Y2hlZEFjY291bnQnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBCcmFuY2hpbmcgaXMgb24gZWRnZXMgYGU1YCAvIGBlNmAuIE5vIGBjb25maWcuY29uZGl0aW9uYCBoZXJlOiBhXG4gICAgICAvLyBgZGVjaXNpb25gIG5vZGUncyBzaW5ndWxhciBvbmUgaXMgbmV2ZXIgZXZhbHVhdGVkLlxuICAgICAgaWQ6ICdkZWNpc2lvbl9hY2NvdW50JywgdHlwZTogJ2RlY2lzaW9uJywgbGFiZWw6ICdBY2NvdW50IEFscmVhZHkgRXhpc3RzPycsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBORVctYWNjb3VudCBicmFuY2guIG91dHB1dFZhcmlhYmxlIGlzIGBjcmVhdGVkQWNjb3VudGA7IHRoZSBhc3NpZ25tZW50XG4gICAgICAvLyBiZWxvdyBub3JtYWxpemVzIGJvdGggYnJhbmNoZXMgb250byBhIHNpbmdsZSBgYWNjb3VudElkYCBpZCBzdHJpbmcgc29cbiAgICAgIC8vIGRvd25zdHJlYW0gbm9kZXMgZG9uJ3QgbmVlZCB0byBrbm93IHdoaWNoIHBhdGggcmFuLlxuICAgICAgLy9cbiAgICAgIC8vIGBuYW1lYCBjYXJyaWVzIHRoZSBsZWFkJ3MgY29tcGFueSBWRVJCQVRJTSBcdTIwMTQgdGhlIGRpc3BsYXkgdmFsdWUuIFRoZVxuICAgICAgLy8gbWF0Y2gga2V5IGBuYW1lX25vcm1hbGl6ZWRgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQ6IGl0IGlzIHJlYWRvbmx5IGFuZFxuICAgICAgLy8gaG9vay1vd25lZCwgYW5kIGBhY2NvdW50X3Byb3RlY3Rpb25gIGRlcml2ZXMgaXQgZnJvbSB0aGUgYG5hbWVgIHdyaXR0ZW5cbiAgICAgIC8vIGhlcmUsIHNvIGFuIGFjY291bnQgY3JlYXRlZCBieSB0aGlzIG5vZGUgaXMgaW1tZWRpYXRlbHkgZmluZGFibGUgYnkgdGhlXG4gICAgICAvLyBuZXh0IGNvbnZlcnNpb24uXG4gICAgICBpZDogJ2NyZWF0ZV9hY2NvdW50JywgdHlwZTogJ2NyZWF0ZV9yZWNvcmQnLCBsYWJlbDogJ0NyZWF0ZSBBY2NvdW50JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2FjY291bnQnLFxuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAvLyBgY29tcGFueWAgaXMgcmVxdWlyZWQgb24gYSBsZWFkOyBldmVyeSBvdGhlciBjb3BpZWQgZmFjdCBpc1xuICAgICAgICAgIC8vIG9wdGlvbmFsLCBzbyBpdHMgcmVhZCBpcyBndWFyZGVkIHRvIG51bGwgKGFuIGluc2VydCB0cmVhdHMgbnVsbCBhc1xuICAgICAgICAgIC8vIGl0IHRyZWF0ZWQgdGhlIGtleSB0aGUgdGVtcGxhdGUgbGVmdCBvdXQpLlxuICAgICAgICAgIG5hbWU6IGNlbGBsZWFkUmVjb3JkLmNvbXBhbnlgLCBwaG9uZTogY2VsYGhhcyhsZWFkUmVjb3JkLnBob25lKSA/IGxlYWRSZWNvcmQucGhvbmUgOiBudWxsYCxcbiAgICAgICAgICB3ZWJzaXRlOiBjZWxgaGFzKGxlYWRSZWNvcmQud2Vic2l0ZSkgPyBsZWFkUmVjb3JkLndlYnNpdGUgOiBudWxsYCxcbiAgICAgICAgICBpbmR1c3RyeTogY2VsYGhhcyhsZWFkUmVjb3JkLmluZHVzdHJ5KSA/IGxlYWRSZWNvcmQuaW5kdXN0cnkgOiBudWxsYCxcbiAgICAgICAgICBhbm51YWxfcmV2ZW51ZTogY2VsYGhhcyhsZWFkUmVjb3JkLmFubnVhbF9yZXZlbnVlKSA/IGxlYWRSZWNvcmQuYW5udWFsX3JldmVudWUgOiBudWxsYCxcbiAgICAgICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiBjZWxgaGFzKGxlYWRSZWNvcmQubnVtYmVyX29mX2VtcGxveWVlcykgPyBsZWFkUmVjb3JkLm51bWJlcl9vZl9lbXBsb3llZXMgOiBudWxsYCxcbiAgICAgICAgICBiaWxsaW5nX2FkZHJlc3M6IGNlbGBoYXMobGVhZFJlY29yZC5hZGRyZXNzKSA/IGxlYWRSZWNvcmQuYWRkcmVzcyA6IG51bGxgLFxuICAgICAgICAgIG93bmVyX2lkOiBjZWxgY3VycmVudF91c2VyLmlkYCwgaXNfYWN0aXZlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2NyZWF0ZWRBY2NvdW50JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ3VzZV9uZXdfYWNjb3VudCcsIHR5cGU6ICdhc3NpZ25tZW50JywgbGFiZWw6ICdVc2UgTmV3IEFjY291bnQnLFxuICAgICAgY29uZmlnOiB7IGFzc2lnbm1lbnRzOiB7IGFjY291bnRJZDogY2VsYGNyZWF0ZWRBY2NvdW50LmlkYCB9IH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ3VzZV9leGlzdGluZ19hY2NvdW50JywgdHlwZTogJ2Fzc2lnbm1lbnQnLCBsYWJlbDogJ1JldXNlIEV4aXN0aW5nIEFjY291bnQnLFxuICAgICAgY29uZmlnOiB7IGFzc2lnbm1lbnRzOiB7IGFjY291bnRJZDogY2VsYG1hdGNoZWRBY2NvdW50LmlkYCB9IH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBDb250YWN0IGRlZHVwZSBieSBlbWFpbCBcdTIwMTQgR0xPQkFMLCBub3QgcGVyLWFjY291bnQuIFx1MjZENCBOZXZlciBzY29wZSB0aGlzXG4gICAgICAvLyBsb29rdXAgdG8gdGhlIGFjY291bnQ6IGBjcm1fY29udGFjdGAgY2FycmllcyBhIGdsb2JhbCB1bmlxdWUgaW5kZXggb25cbiAgICAgIC8vIGBlbWFpbGAsIHNvIGFuIGFjY291bnQtc2NvcGVkIGxvb2t1cCBtaXNzZXMgYSBzYW1lLWVtYWlsIGNvbnRhY3QgdW5kZXJcbiAgICAgIC8vIGFub3RoZXIgYWNjb3VudCBhbmQgYGNyZWF0ZV9jb250YWN0YCB0aGVuIGV4cGxvZGVzIG9uIHRoZSBEQiBpbmRleFxuICAgICAgLy8gQUZURVIgdGhlIGFjY291bnQgaGFzIGJlZW4gY3JlYXRlZCwgb3JwaGFuaW5nIGl0LiBMZWFkcyByZXF1aXJlIGFuXG4gICAgICAvLyBlbWFpbCwgc28gdGhlIG1hdGNoIGtleSBpcyByZWxpYWJsZS5cbiAgICAgIGlkOiAnZmluZF9jb250YWN0JywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0ZpbmQgRXhpc3RpbmcgQ29udGFjdCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9jb250YWN0JyxcbiAgICAgICAgZmlsdGVyOiB7IGVtYWlsOiBjZWxgbGVhZFJlY29yZC5lbWFpbGAgfSxcbiAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdtYXRjaGVkQ29udGFjdCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gQnJhbmNoaW5nIGlzIG9uIGVkZ2VzIGBlMTFgIC8gYGUxMmAgXHUyMDE0IHNlZSBgZGVjaXNpb25fYWNjb3VudGAuXG4gICAgICBpZDogJ2RlY2lzaW9uX2NvbnRhY3QnLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0NvbnRhY3QgQWxyZWFkeSBFeGlzdHM/JyxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIGBhY2NvdW50SWRgIGlzIGEgYmFyZSBpZCBzdHJpbmcgZnJvbSB3aGljaGV2ZXIgYWNjb3VudCBicmFuY2ggcmFuLlxuICAgICAgaWQ6ICdjcmVhdGVfY29udGFjdCcsIHR5cGU6ICdjcmVhdGVfcmVjb3JkJywgbGFiZWw6ICdDcmVhdGUgQ29udGFjdCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9jb250YWN0JyxcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgLy8gVGhlIHBlcnNvbidzIG93biBmYWN0cyB0cmF2ZWwgd2l0aCB0aGVtICgjMjA2OCkuIGBjcm1fY29udGFjdGBcbiAgICAgICAgICAvLyBkZWNsYXJlcyBlYWNoIG9mIHRoZXNlIG9uIHRoZSBsZWFkJ3Mgdm9jYWJ1bGFyeSAoYF9waWNrbGlzdHMudHNgXG4gICAgICAgICAgLy8gZm9yIHRoZSB0d28gc2VsZWN0cywgcGlubmVkIGJ5IGB0ZXN0L2FjdGlvbnMtZmxvd3MtaW50ZWdyaXR5YCksIHNvXG4gICAgICAgICAgLy8gYSBzdHJhaWdodCBjb3B5IGlzIGFsd2F5cyBsZWdhbC4gVGhlIHR3byBvcHQtb3V0cyBhcmUgY29waWVkLFxuICAgICAgICAgIC8vIG5ldmVyIGRlZmF1bHRlZDogYSBsZWFkIHRoYXQgb3B0ZWQgb3V0IG11c3Qgbm90IGJlY29tZSBhIGNvbnRhY3RcbiAgICAgICAgICAvLyB0aGF0IGhhcyBub3QgXHUyMDE0IGBlbWFpbF9vcHRfb3V0YCBoaWRlcyBTZW5kIEVtYWlsIGFuZCBzaWxlbmNlc1xuICAgICAgICAgIC8vIGBjb250YWN0X3dlbGNvbWVgLCBgZG9fbm90X2NhbGxgIHJlZnVzZXMgYSBzY2hlZHVsZWQgY2FsbC4gQVxuICAgICAgICAgIC8vIFJFVVNFRCBjb250YWN0IGRvZXMgbm90IGNvbWUgdGhyb3VnaCBoZXJlOiBzZWVcbiAgICAgICAgICAvLyBgZGVjaXNpb25fY29udGFjdF9kb19ub3RfY2FsbGAuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBOYW1lcyBhbmQgZW1haWwgYXJlIHJlcXVpcmVkIG9uIGEgbGVhZCBhbmQgcmVhZCBiYXJlOyB0aGUgcmVzdFxuICAgICAgICAgIC8vIGFyZSBvcHRpb25hbCBhbmQgZ3VhcmRlZCB0byBudWxsLCB3aGljaCBhbiBpbnNlcnQgcmVhZHMgYXMgdGhlXG4gICAgICAgICAgLy8gb21pdHRlZCBrZXkgdGhlIHRlbXBsYXRlIHdyb3RlIChlYWNoIG9wdC1vdXQgdGhlbiB0YWtlcyBpdHNcbiAgICAgICAgICAvLyBgZmFsc2VgIGRlZmF1bHQsIGFzIGJlZm9yZSkuXG4gICAgICAgICAgc2FsdXRhdGlvbjogY2VsYGhhcyhsZWFkUmVjb3JkLnNhbHV0YXRpb24pID8gbGVhZFJlY29yZC5zYWx1dGF0aW9uIDogbnVsbGAsXG4gICAgICAgICAgbW9iaWxlOiBjZWxgaGFzKGxlYWRSZWNvcmQubW9iaWxlKSA/IGxlYWRSZWNvcmQubW9iaWxlIDogbnVsbGAsXG4gICAgICAgICAgbGVhZF9zb3VyY2U6IGNlbGBoYXMobGVhZFJlY29yZC5sZWFkX3NvdXJjZSkgPyBsZWFkUmVjb3JkLmxlYWRfc291cmNlIDogbnVsbGAsXG4gICAgICAgICAgZG9fbm90X2NhbGw6IGNlbGBoYXMobGVhZFJlY29yZC5kb19ub3RfY2FsbCkgPyBsZWFkUmVjb3JkLmRvX25vdF9jYWxsIDogbnVsbGAsXG4gICAgICAgICAgZW1haWxfb3B0X291dDogY2VsYGhhcyhsZWFkUmVjb3JkLmVtYWlsX29wdF9vdXQpID8gbGVhZFJlY29yZC5lbWFpbF9vcHRfb3V0IDogbnVsbGAsXG4gICAgICAgICAgZmlyc3RfbmFtZTogY2VsYGxlYWRSZWNvcmQuZmlyc3RfbmFtZWAsIGxhc3RfbmFtZTogY2VsYGxlYWRSZWNvcmQubGFzdF9uYW1lYCxcbiAgICAgICAgICBlbWFpbDogY2VsYGxlYWRSZWNvcmQuZW1haWxgLCBwaG9uZTogY2VsYGhhcyhsZWFkUmVjb3JkLnBob25lKSA/IGxlYWRSZWNvcmQucGhvbmUgOiBudWxsYCxcbiAgICAgICAgICB0aXRsZTogY2VsYGhhcyhsZWFkUmVjb3JkLnRpdGxlKSA/IGxlYWRSZWNvcmQudGl0bGUgOiBudWxsYCwgY3JtX2FjY291bnQ6IGNlbGBhY2NvdW50SWRgLFxuICAgICAgICAgIGlzX3ByaW1hcnk6IHRydWUsIG93bmVyX2lkOiBjZWxgY3VycmVudF91c2VyLmlkYCxcbiAgICAgICAgfSxcbiAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdjcmVhdGVkQ29udGFjdCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICd1c2VfbmV3X2NvbnRhY3QnLCB0eXBlOiAnYXNzaWdubWVudCcsIGxhYmVsOiAnVXNlIE5ldyBDb250YWN0JyxcbiAgICAgIGNvbmZpZzogeyBhc3NpZ25tZW50czogeyBjb250YWN0SWQ6IGNlbGBjcmVhdGVkQ29udGFjdC5pZGAgfSB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICd1c2VfZXhpc3RpbmdfY29udGFjdCcsIHR5cGU6ICdhc3NpZ25tZW50JywgbGFiZWw6ICdSZXVzZSBFeGlzdGluZyBDb250YWN0JyxcbiAgICAgIGNvbmZpZzogeyBhc3NpZ25tZW50czogeyBjb250YWN0SWQ6IGNlbGBtYXRjaGVkQ29udGFjdC5pZGAgfSB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gXHUyNTAwXHUyNTAwIEEgUkVVU0VEIGNvbnRhY3Qga2VlcHMgdGhlIHN0cmljdGVyIGNvbnNlbnQgKCMyMDY4KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAgIC8vXG4gICAgICAvLyBgY3JlYXRlX2NvbnRhY3RgIGNvcGllcyB0aGUgbGVhZCdzIG9wdC1vdXRzIG9udG8gYSBORVcgY29udGFjdC4gQVxuICAgICAgLy8gcmV1c2VkIGNvbnRhY3QgYWxyZWFkeSBob2xkcyBpdHMgb3duIGFuc3dlciwgYW5kIGFuIG9wdC1vdXQgaXMgYVxuICAgICAgLy8gcHJvbWlzZSB0byBhIHBlcnNvbiB0aGF0IGEgY29udmVyc2lvbiBuZXZlciB0YWtlcyBiYWNrIFx1MjAxNCBzbyB0aGlzIHBhdGhcbiAgICAgIC8vIG9ubHkgZXZlciBSQUlTRVMgYSBmbGFnLCBvbmUgbm9kZSBwZXIgZmxhZywgYW5kIG9ubHkgd2hlbiB0aGUgbGVhZFxuICAgICAgLy8gY2FycmllcyBpdC4gVGhlIGByYWlzZV8qYCBub2RlcyB3cml0ZSB0aGUgbGl0ZXJhbCBgdHJ1ZWAsIFx1MjZENCBuZXZlciBhXG4gICAgICAvLyBjb3B5IG9mIGBsZWFkUmVjb3JkLnhgOiBhIGNvcHkgd291bGQgd3JpdGUgdGhlIGxlYWQncyBgZmFsc2VgIG92ZXIgYSBjb250YWN0XG4gICAgICAvLyB3aG8gaGFkIG9wdGVkIG91dC4gYGNybV9hY2NvdW50YCBjYXJyaWVzIG5laXRoZXIgZmxhZywgc28gdGhlIGFjY291bnRcbiAgICAgIC8vIGhhbGYgb2YgXCJ0aGUgc3RyaWN0ZXIgdmFsdWUgd2luc1wiIGhhcyBub3RoaW5nIHRvIHdyaXRlLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBlZGdlcyByZWFkIHRoZSBMRUFEJ3MgZmxhZyBvbmx5LCBub3Qgd2hldGhlciB0aGUgY29udGFjdCBhbHJlYWR5XG4gICAgICAvLyBob2xkcyBpdC4gUmVhZGluZyBgdmFycy5tYXRjaGVkQ29udGFjdC54YCBuZWVkcyBhXG4gICAgICAvLyBgaGFzKHZhcnMubWF0Y2hlZENvbnRhY3QpYCBndWFyZCwgd2hpY2hcbiAgICAgIC8vIGB0ZXN0L2Zsb3ctdmFyaWFibGUtY29uZGl0aW9ucy50ZXN0LnRzYCBmb3JiaWRzIG9uIHRoaXMgZmxvdyAoYVxuICAgICAgLy8gYGdldF9yZWNvcmRgIGJpbmRzIGl0IG9uIGV2ZXJ5IHBhdGgpIFx1MjAxNCBhbmQgd3JpdGluZyBgdHJ1ZWAgb3ZlciBgdHJ1ZWBcbiAgICAgIC8vIGNoYW5nZXMgbm90aGluZy5cbiAgICAgIC8vXG4gICAgICAvLyBCcmFuY2hpbmcgb24gYGUzNWAgLyBgZTM2YCwgdGhlbiBgZTM4YCAvIGBlMzlgOiBlYWNoIHBhaXIgaXMgVE9UQUwgYW5kXG4gICAgICAvLyBwYXJ0aXRpb25zIGJ5IERlIE1vcmdhbiwgc28gZXhhY3RseSBvbmUgZWRnZSBob2xkcyBvbiBldmVyeSBzaGFwZVxuICAgICAgLy8gYGdldF9sZWFkYCBjYW4gYmluZCBcdTIwMTQgcGlubmVkIGluIGB0ZXN0L2Zsb3ctY29udmVyc2lvbi50ZXN0LnRzYC5cbiAgICAgIGlkOiAnZGVjaXNpb25fY29udGFjdF9kb19ub3RfY2FsbCcsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnTGVhZCBJcyBEby1Ob3QtQ2FsbD8nLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdyYWlzZV9jb250YWN0X2RvX25vdF9jYWxsJywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ0NhcnJ5IERvLU5vdC1DYWxsIHRvIENvbnRhY3QnLFxuICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fY29udGFjdCcsIGZpbHRlcjogeyBpZDogY2VsYGNvbnRhY3RJZGAgfSwgZmllbGRzOiB7IGRvX25vdF9jYWxsOiB0cnVlIH0gfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnZGVjaXNpb25fY29udGFjdF9lbWFpbF9vcHRfb3V0JywgdHlwZTogJ2RlY2lzaW9uJywgbGFiZWw6ICdMZWFkIE9wdGVkIE91dCBvZiBFbWFpbD8nLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdyYWlzZV9jb250YWN0X2VtYWlsX29wdF9vdXQnLCB0eXBlOiAndXBkYXRlX3JlY29yZCcsIGxhYmVsOiAnQ2FycnkgRW1haWwgT3B0LU91dCB0byBDb250YWN0JyxcbiAgICAgIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX2NvbnRhY3QnLCBmaWx0ZXI6IHsgaWQ6IGNlbGBjb250YWN0SWRgIH0sIGZpZWxkczogeyBlbWFpbF9vcHRfb3V0OiB0cnVlIH0gfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEJyYW5jaGluZyBpcyBvbiBlZGdlcyBgZTE2YCAvIGBlMTdgIFx1MjAxNCBzZWUgYGRlY2lzaW9uX2FjY291bnRgLlxuICAgICAgaWQ6ICdkZWNpc2lvbl9vcHBvcnR1bml0eScsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnQ3JlYXRlIE9wcG9ydHVuaXR5PycsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBgY2xvc2VfZGF0ZWAgY29tZXMgZnJvbSB0aGUgc2NyZWVuIGZpZWxkLCB3aGljaCBpcyB0aGUgb25seSBsYXllciB0aGF0XG4gICAgICAvLyBjYW4gY2FycnkgdGhlIGBpc29EYXRlKGRheXNGcm9tTm93KDkwKSlgIGV4cHJlc3Npb24gXHUyMDE0IHNlZSB0aGVcbiAgICAgIC8vIGBjbG9zZURhdGVgIGRlY2xhcmF0aW9uLiBBbiB1bmJvdW5kIGBjbG9zZURhdGVgIGZhaWxzIHRoZSBydW4gYXQgdGhpc1xuICAgICAgLy8gbm9kZSByYXRoZXIgdGhhbiBpbnZlbnRpbmcgYSBxdWFydGVyLCB3aGljaCBpcyB0aGUgZmFpbHVyZSB0aGlzIG5vZGVcbiAgICAgIC8vIGlzIGFsbG93ZWQgdG8gaGF2ZS5cbiAgICAgIGlkOiAnY3JlYXRlX29wcG9ydHVuaXR5JywgdHlwZTogJ2NyZWF0ZV9yZWNvcmQnLCBsYWJlbDogJ0NyZWF0ZSBPcHBvcnR1bml0eScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIG5hbWU6IGNlbGBvcHBvcnR1bml0eU5hbWVgLCBjcm1fYWNjb3VudDogY2VsYGFjY291bnRJZGAsIHByaW1hcnlfY29udGFjdDogY2VsYGNvbnRhY3RJZGAsXG4gICAgICAgICAgYW1vdW50OiBjZWxgb3Bwb3J0dW5pdHlBbW91bnRgLCBzdGFnZTogJ3Byb3NwZWN0aW5nJywgcHJvYmFiaWxpdHk6IDEwLFxuICAgICAgICAgIGxlYWRfc291cmNlOiBjZWxgaGFzKGxlYWRSZWNvcmQubGVhZF9zb3VyY2UpID8gbGVhZFJlY29yZC5sZWFkX3NvdXJjZSA6IG51bGxgLFxuICAgICAgICAgIGNsb3NlX2RhdGU6IGNlbGBjbG9zZURhdGVgLCBvd25lcl9pZDogY2VsYGN1cnJlbnRfdXNlci5pZGAsXG4gICAgICAgIH0sXG4gICAgICAgIG91dHB1dFZhcmlhYmxlOiAnY3JlYXRlZE9wcG9ydHVuaXR5JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBOb3JtYWxpemUgYm90aCBvcHBvcnR1bml0eSBicmFuY2hlcyBvbnRvIGEgc2luZ2xlIGBvcHBvcnR1bml0eUlkYCwgdGhlXG4gICAgICAvLyBzYW1lIHBhdHRlcm4gYXMgYWNjb3VudElkL2NvbnRhY3RJZC4gXHUyNkQ0IE5ldmVyIHJlZmVyZW5jZVxuICAgICAgLy8gYGNyZWF0ZWRPcHBvcnR1bml0eS5pZGAgZG93bnN0cmVhbSBpbnN0ZWFkOiBvbiB0aGUgXCJOb1wiIGJyYW5jaCB0aGVcbiAgICAgIC8vIGNyZWF0ZSBub2RlIG5ldmVyIHJhbiwgYW5kIHRoZSB1bmJvdW5kIHJlYWQgZmFpbHMgdGhlIHJ1biAob24gMTcueCB0aGVcbiAgICAgIC8vIHVucmVzb2x2ZWQgdG9rZW4gaW50ZXJwb2xhdGVkIGludG8gdGhlIGBjb252ZXJ0ZWRfb3Bwb3J0dW5pdHlgIGxvb2t1cFxuICAgICAgLy8gYXMgYSBwbGFjZWhvbGRlcikuXG4gICAgICBpZDogJ3VzZV9uZXdfb3Bwb3J0dW5pdHknLCB0eXBlOiAnYXNzaWdubWVudCcsIGxhYmVsOiAnVXNlIE5ldyBPcHBvcnR1bml0eScsXG4gICAgICBjb25maWc6IHsgYXNzaWdubWVudHM6IHsgb3Bwb3J0dW5pdHlJZDogY2VsYGNyZWF0ZWRPcHBvcnR1bml0eS5pZGAgfSB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdub19vcHBvcnR1bml0eScsIHR5cGU6ICdhc3NpZ25tZW50JywgbGFiZWw6ICdObyBPcHBvcnR1bml0eScsXG4gICAgICBjb25maWc6IHsgYXNzaWdubWVudHM6IHsgb3Bwb3J0dW5pdHlJZDogbnVsbCB9IH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ21hcmtfY29udmVydGVkJywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ01hcmsgTGVhZCBhcyBDb252ZXJ0ZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fbGVhZCcsIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZElkYCB9LFxuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAvLyBgc3RhdHVzOiAnY29udmVydGVkJ2AgcmlkZXMgYWxvbmcgc28gbGlzdCB2aWV3cyBhZ3JlZSB3aXRoIHRoZVxuICAgICAgICAgIC8vIGNvbnZlcnNpb24gZmxhZ3MgKHRoZSBxdWFsaWZpZWQgXHUyMTkyIGNvbnZlcnRlZCB0cmFuc2l0aW9uIGlzIGxlZ2FsXG4gICAgICAgICAgLy8gcGVyIHRoZSBsZWFkX3N0YXR1c19wcm9ncmVzc2lvbiBzdGF0ZSBtYWNoaW5lKS5cbiAgICAgICAgICBpc19jb252ZXJ0ZWQ6IHRydWUsIHN0YXR1czogJ2NvbnZlcnRlZCcsIGNvbnZlcnRlZF9kYXRlOiBjZWxgaXNvRGF0ZXRpbWUobm93KCkpYCxcbiAgICAgICAgICBjb252ZXJ0ZWRfYWNjb3VudDogY2VsYGFjY291bnRJZGAsIGNvbnZlcnRlZF9jb250YWN0OiBjZWxgY29udGFjdElkYCxcbiAgICAgICAgICBjb252ZXJ0ZWRfb3Bwb3J0dW5pdHk6IGNlbGBvcHBvcnR1bml0eUlkYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBBRFItMDAxMjogZGVsaXZlciB2aWEgdGhlIGBub3RpZnlgIG5vZGUgKGluYm94ICsgZW1haWwpLiBUaGUgbGVnYWN5XG4gICAgICAvLyBgc2NyaXB0YCArIGBhY3Rpb25UeXBlOidlbWFpbCdgIHNoYXBlIGlzIGEgbm8tb3Agc3R1YiBpbiA3LjQuXG4gICAgICBpZDogJ3NlbmRfbm90aWZpY2F0aW9uJywgdHlwZTogJ25vdGlmeScsIGxhYmVsOiAnU2VuZCBDb25maXJtYXRpb24nLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtjZWxgY3VycmVudF91c2VyLmlkYF0sXG4gICAgICAgIGNoYW5uZWxzOiBbJ2luYm94JywgJ2VtYWlsJ10sXG4gICAgICAgIHRvcGljOiAnbGVhZF9jb252ZXJ0ZWQnLFxuICAgICAgICB0ZW1wbGF0ZTogJ2NybS5sZWFkX2NvbnZlcnRlZCcsXG4gICAgICAgIHRlbXBsYXRlRGF0YTogeyBmaXJzdF9uYW1lOiBjZWxgbGVhZFJlY29yZC5maXJzdF9uYW1lYCwgbGFzdF9uYW1lOiBjZWxgbGVhZFJlY29yZC5sYXN0X25hbWVgIH0sXG4gICAgICAgIGFjdGlvblVybDogJy9jcm1fYWNjb3VudC97e2FjY291bnRJZH19JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgLy8gXHUyNkQ0IEEgcmV0aXJlZCBlZGdlJ3MgaWQgc3RheXMgVkFDQU5UIGFuZCBldmVyeSBzdXJ2aXZpbmcgZWRnZSBrZWVwcyB0aGUgaWRcbiAgICAvLyBpdCBoYXMgYWx3YXlzIGhhZCBcdTIwMTQgYGUxYCwgYGUzYCBhbmQgYGUxNWAgYXJlIGdhcHMgb24gcHVycG9zZS5cbiAgICAvLyBSZW51bWJlcmluZyB0byBjbG9zZSBhIGdhcCByZXdyaXRlcyBpZHMgdGhhdCBvdGhlciBub3RlcywgdGVzdHMgYW5kIHJ1blxuICAgIC8vIGxvZ3MgcmVmZXIgdG8uXG4gICAgeyBpZDogJ2UwJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdnZXRfbGVhZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIC8vIFx1MjZENCBXaGVuIHlvdSBhZGQgYW4gZWRnZSwgdGFrZSB0aGUgbmV4dCBpZCBBRlRFUiBUSEUgSElHSEVTVCBJTiBVU0UgXHUyMDE0IGRvXG4gICAgLy8gbm90IHJldXNlIGEgdmFjYW50IG9uZSwgYW5kIGRvIG5vdCBhc3N1bWUgYW4gdW51c2VkLWxvb2tpbmcgaWQgaXMgZnJlZS5cbiAgICAvLyBBIGR1cGxpY2F0ZSBpZCBpcyBJTkVSVCAodHJhdmVyc2FsIGZpbHRlcnMgb3V0LWVkZ2VzIGJ5IGBzb3VyY2VgLCBuZXZlclxuICAgIC8vIGJ5IGBpZGApLCBzbyBub3RoaW5nIGZhaWxzIGFuZCB0aGUgY29sbGlzaW9uIHN1cnZpdmVzIHRvIHRyYXAgdGhlIG5leHRcbiAgICAvLyBlZGl0b3IgcGlja2luZyBvdXQgb2YgdGhlIHNlcXVlbmNlLiBgZTFgLCBgZTNgIGFuZCBgZTE1YCBhcmUgdmFjYW50XG4gICAgLy8gcmV0aXJlZCBpZHMgYW5kIHN0YXkgdGhhdCB3YXk7IGBlMjdgIGlzIGFib3ZlIHRoZSBoaWdoZXN0IGxpdmUgaWQsIG5vdFxuICAgIC8vIGEgZ2FwLWZpbGwuXG4gICAgeyBpZDogJ2UyNycsIHNvdXJjZTogJ2dldF9sZWFkJywgdGFyZ2V0OiAnZGVjaXNpb25fYXBwcm92YWwnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAvLyBcdTI1MDBcdTI1MDAgVGhlIGFwcHJvdmFsIGdhdGUgKFJFUS0wMDA1IHN0ZXAgNykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBUaGUgc2FtZSBUT1RBTCwgUEFSVElUSU9OSU5HIHBhaXIgdGhlIGR1cGxpY2F0ZSB2ZXJkaWN0IGJlbG93IGlzIHdyaXR0ZW5cbiAgICAvLyBhcywgYW5kIGZvciB0aGUgc2FtZSBtZWFzdXJlZCByZWFzb246IGEgZGVjaXNpb24gbm9kZSBkZWNsYXJpbmcgbm9cbiAgICAvLyBgY29uZmlnLmNvbmRpdGlvbnNgIHRha2VzIEVWRVJZIG91dC1lZGdlIHdob3NlIGNvbmRpdGlvbiBob2xkcywgaW5cbiAgICAvLyBwYXJhbGxlbCwgc28gdHdvIG92ZXJsYXBwaW5nIGd1YXJkcyB3b3VsZCByZWZ1c2UgdGhlIGNvbnZlcnNpb24gYW5kXG4gICAgLy8gY29udGludWUgaXQgaW4gb25lIHJ1bi4gYGUyOWAgaXMgYGUyOGAgbmVnYXRlZCBieSBEZSBNb3JnYW4uXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgVGhlIHBvbGFyaXR5IGlzIGZhaWwtT1BFTiwgdW5saWtlIHRoZSBkdXBsaWNhdGUgYnJhbmNoLCBhbmQgdGhhdCBpcyB0aGVcbiAgICAvLyBnYXRlJ3Mgb2ZmIHN3aXRjaCByYXRoZXIgdGhhbiBhIHNsaXAuIE9ubHkgdGhlIHR3byB2ZXJkaWN0cyBhIGxpdmVcbiAgICAvLyBhcHByb3ZhbCB3cml0ZXMgcmVmdXNlOyBgbm90X3JlcXVpcmVkYCBcdTIwMTQgdGhlIHNoaXBwZWQgZGVmYXVsdCBcdTIwMTQgYW5kIGFuXG4gICAgLy8gYWJzZW50IGNvbHVtbiAoYSBsZWFkIGZyb20gYmVmb3JlIHRoZSBmaWVsZCBleGlzdGVkKSBib3RoIGNvbnRpbnVlLCBzb1xuICAgIC8vIHdpdGggdGhlIGdhdGUgb2ZmIHRoaXMgcGFpciBpcyBpbnZpc2libGUgYW5kIGNvbnZlcnNpb24gYmVoYXZlcyBleGFjdGx5IGFzXG4gICAgLy8gaXQgZGlkIGJlZm9yZS4gYGxlYWQuaG9vay50c2AgYW5kIGBjb252ZXJ0X2xlYWQudmlzaWJsZWAgY2FycnkgdGhlIHNhbWVcbiAgICAvLyBwb2xhcml0eSwgYmVjYXVzZSB0aGUgdGhyZWUgaGF2ZSB0byBhZ3JlZSBhYm91dCB3aGF0IFwib2ZmXCIgbWVhbnMuXG4gICAgeyBpZDogJ2UyOCcsIHNvdXJjZTogJ2RlY2lzaW9uX2FwcHJvdmFsJywgdGFyZ2V0OiAncmVmdXNlX3VuYXBwcm92ZWQnLCB0eXBlOiAnZGVmYXVsdCcsIGNvbmRpdGlvbjogUGBoYXModmFycy5sZWFkUmVjb3JkKSAmJiBoYXModmFycy5sZWFkUmVjb3JkLmNvbnZlcnNpb25fYXBwcm92YWxfc3RhdHVzKVxuICAgICAgJiYgKHZhcnMubGVhZFJlY29yZC5jb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1cyA9PSBcInBlbmRpbmdcIiB8fCB2YXJzLmxlYWRSZWNvcmQuY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXMgPT0gXCJyZWplY3RlZFwiKWAsIGxhYmVsOiAnTm90IGFwcHJvdmVkJyB9LFxuICAgIHsgaWQ6ICdlMjknLCBzb3VyY2U6ICdkZWNpc2lvbl9hcHByb3ZhbCcsIHRhcmdldDogJ2RlY2lzaW9uX2R1cGxpY2F0ZScsIHR5cGU6ICdkZWZhdWx0JywgY29uZGl0aW9uOiBQYCFoYXModmFycy5sZWFkUmVjb3JkKSB8fCAhaGFzKHZhcnMubGVhZFJlY29yZC5jb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1cylcbiAgICAgIHx8ICh2YXJzLmxlYWRSZWNvcmQuY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXMgIT0gXCJwZW5kaW5nXCIgJiYgdmFycy5sZWFkUmVjb3JkLmNvbnZlcnNpb25fYXBwcm92YWxfc3RhdHVzICE9IFwicmVqZWN0ZWRcIilgLCBsYWJlbDogJ0NsZWFyJyB9LFxuICAgIC8vIFJlam9pbnMgbm90aGluZywgZXhhY3RseSBsaWtlIGBlMjZgOiB0aGUgcmVmdXNhbCBJUyBub3QgcmVhY2hpbmcgYSB3cml0ZXIuXG4gICAgeyBpZDogJ2UzMCcsIHNvdXJjZTogJ3JlZnVzZV91bmFwcHJvdmVkJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gXHUyNkEwXHVGRTBGIEJvdGggY29uZGl0aW9ucyBhcmUgVE9UQUwsIGFuZCBvbiB0aGlzIHN1cmZhY2UgdGhhdCBpcyBub3QgYSBzdHlsZVxuICAgIC8vIHByZWZlcmVuY2U6IGEgZmxvdyBjb25kaXRpb24gaXMgaW50ZXJwcmV0ZWQgc3RyaWN0IENFTCBvbiBldmVyeSBydW4sIGFuZFxuICAgIC8vIGFuIHVuZ3VhcmRlZCBmaWVsZCByZWFkIGFnYWluc3QgYSBkcml2ZXIgdGhhdCBvbWl0cyBhYnNlbnQgY29sdW1uc1xuICAgIC8vIChgZHJpdmVyLW1lbW9yeWAgLyBgZHJpdmVyLW1vbmdvZGJgKSBhYm9ydHMgXHUyMDE0IHdoaWNoIEZBSUxTIFRIRSBSVU4sIHNvIGFuXG4gICAgLy8gdW5ndWFyZGVkIHJlYWQgaGVyZSB3b3VsZCBtYWtlIG9yZGluYXJ5IGxlYWRzIHVuY29udmVydGlibGUuIE1lYXN1cmVkLCBpblxuICAgIC8vIGV4YWN0bHkgdGhhdCBzaGFwZTogYGNvbmRpdGlvbiBmYWlsZWQgdG8gZXZhbHVhdGUgYXMgQ0VMOiBObyBzdWNoIGtleTpcbiAgICAvLyBkdXBsaWNhdGVfc3RhdHVzYC4gVGhlIGZ1bGwgdGFibGUgaXMgaW5cbiAgICAvLyBgdGVzdC9mbG93LWNvbmRpdGlvbi10b3RhbGl0eS50ZXN0LnRzYC5cbiAgICAvL1xuICAgIC8vIFRXTyBndWFyZHMsIGluIHRoZSBzcGVsbGluZyBgdGVzdC9mbG93LXZhcmlhYmxlLWNvbmRpdGlvbnMudGVzdC50c2BcbiAgICAvLyByZXF1aXJlcywgYW5kIHRoZSBvdXRlciBvbmUgaXMgbm90IGRlY29yYXRpb246IGB2YXJzLmxlYWRSZWNvcmRgIGlzIGFcbiAgICAvLyBLRVksIHNvIGEgcGxhaW4gYHZhcnMubGVhZFJlY29yZCAhPSBudWxsYCB3b3VsZCBpdHNlbGYgYWJvcnQgd2l0aFxuICAgIC8vIGBVbmtub3duIHZhcmlhYmxlYCBvbiB0aGUgcnVuIHdoZXJlIGBnZXRfbGVhZGAgYm91bmQgbm90aGluZyBcdTIwMTQgdGhlIGd1YXJkXG4gICAgLy8gd291bGQgYmUgdGhlIGZhdWx0IGl0IHdhcyB3cml0dGVuIHRvIHByZXZlbnQuIGBoYXModmFycy5sZWFkUmVjb3JkKWBcbiAgICAvLyBhbnN3ZXJzIGluc3RlYWQgb2YgcmVhZGluZy5cbiAgICAvL1xuICAgIC8vIFRoZSBUSFJFRSBlZGdlcyBQQVJUSVRJT04gYnkgRGUgTW9yZ2FuIChgIShhICYmIGIgJiYgYylgIHdyaXR0ZW4gb3V0IGFzXG4gICAgLy8gYCFhIHx8ICFiIHx8ICFjYCwgd2l0aCB0aGUgdHdvIHZlcmRpY3QgdGVzdHMgY29uam9pbmVkIHVuZGVyIHRoZSBsYXN0XG4gICAgLy8gdGVybSksIHNvIGV4YWN0bHkgb25lIGlzIHRydWUgZm9yIGV2ZXJ5IHJlY29yZCBzaGFwZSwgaW5jbHVkaW5nIHRoZVxuICAgIC8vIHNoYXBlcyB3aGVyZSB0aGUgY29sdW1uLCB0aGUgcm93IG9yIGJvdGggYXJlIG1pc3NpbmcuXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgYGUyMmAncyB0aGlyZCB0ZXJtIG11c3QgY2FycnkgQk9USCBpbmVxdWFsaXRpZXMuIEEgZGVjaXNpb24gbm9kZSB0aGF0XG4gICAgLy8gZGVjbGFyZXMgbm8gYGNvbmZpZy5jb25kaXRpb25zYCByZXBvcnRzIG5vIGJyYW5jaCwgc28gdHJhdmVyc2FsIHRha2VzXG4gICAgLy8gRVZFUlkgb3V0LWVkZ2Ugd2hvc2UgY29uZGl0aW9uIGhvbGRzLCBJTiBQQVJBTExFTCBcdTIwMTQgd2l0aCBgZTIyYCBsZWZ0IGF0XG4gICAgLy8gYCE9IFwic3VzcGVjdGVkXCJgIGEgY29uZmlybWVkIGxlYWQgc2F0aXNmaWVzIGBlMjJgIEFORCBgZTI1YCwgc2hvd2luZyB0aGVcbiAgICAvLyByZWZ1c2FsIGFuZCBjb252ZXJ0aW5nIHRoZSBsZWFkIGluIHRoZSBzYW1lIHJ1bi4gTWVhc3VyZWQgb25cbiAgICAvLyBgQXV0b21hdGlvbkVuZ2luZS5ldmFsdWF0ZUNvbmRpdGlvbmAgYWNyb3NzIGFsbCBzZXZlbiByZWNvcmQgc2hhcGVzOyB0aGVcbiAgICAvLyBwaW4gaXMgaW4gYHRlc3QvbGVhZC1kdXBsaWNhdGUtdmlzaWJpbGl0eS50ZXN0LnRzYC5cbiAgICB7IGlkOiAnZTIxJywgc291cmNlOiAnZGVjaXNpb25fZHVwbGljYXRlJywgdGFyZ2V0OiAnd2Fybl9kdXBsaWNhdGUnLCB0eXBlOiAnZGVmYXVsdCcsIGNvbmRpdGlvbjogUGBoYXModmFycy5sZWFkUmVjb3JkKSAmJiBoYXModmFycy5sZWFkUmVjb3JkLmR1cGxpY2F0ZV9zdGF0dXMpICYmIHZhcnMubGVhZFJlY29yZC5kdXBsaWNhdGVfc3RhdHVzID09IFwic3VzcGVjdGVkXCJgLCBsYWJlbDogJ1N1c3BlY3RlZCcgfSxcbiAgICB7IGlkOiAnZTI1Jywgc291cmNlOiAnZGVjaXNpb25fZHVwbGljYXRlJywgdGFyZ2V0OiAncmVmdXNlX2NvbmZpcm1lZF9kdXBsaWNhdGUnLCB0eXBlOiAnZGVmYXVsdCcsIGNvbmRpdGlvbjogUGBoYXModmFycy5sZWFkUmVjb3JkKSAmJiBoYXModmFycy5sZWFkUmVjb3JkLmR1cGxpY2F0ZV9zdGF0dXMpICYmIHZhcnMubGVhZFJlY29yZC5kdXBsaWNhdGVfc3RhdHVzID09IFwiY29uZmlybWVkXCJgLCBsYWJlbDogJ0NvbmZpcm1lZCcgfSxcbiAgICB7IGlkOiAnZTIyJywgc291cmNlOiAnZGVjaXNpb25fZHVwbGljYXRlJywgdGFyZ2V0OiAnbm9fZHVwbGljYXRlX3dhcm5pbmcnLCB0eXBlOiAnZGVmYXVsdCcsIGNvbmRpdGlvbjogUGAhaGFzKHZhcnMubGVhZFJlY29yZCkgfHwgIWhhcyh2YXJzLmxlYWRSZWNvcmQuZHVwbGljYXRlX3N0YXR1cykgfHwgKHZhcnMubGVhZFJlY29yZC5kdXBsaWNhdGVfc3RhdHVzICE9IFwic3VzcGVjdGVkXCIgJiYgdmFycy5sZWFkUmVjb3JkLmR1cGxpY2F0ZV9zdGF0dXMgIT0gXCJjb25maXJtZWRcIilgLCBsYWJlbDogJ0NsZWFuJyB9LFxuICAgIC8vIEJvdGggY2xlYXIgZHVwbGljYXRlIGJyYW5jaGVzIHBhc3MgdGhlIG1hdGNoLWtleSBndWFyZCBiZWZvcmUgdGhlIGZvcm0uXG4gICAgeyBpZDogJ2UyMycsIHNvdXJjZTogJ3dhcm5fZHVwbGljYXRlJywgdGFyZ2V0OiAnZGVjaXNpb25fbWF0Y2hfa2V5JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyNCcsIHNvdXJjZTogJ25vX2R1cGxpY2F0ZV93YXJuaW5nJywgdGFyZ2V0OiAnZGVjaXNpb25fbWF0Y2hfa2V5JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gXHUyNTAwXHUyNTAwIFRoZSBtYXRjaC1rZXkgZ3VhcmQgKCMyMDE3KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIFRPVEFMIGFuZCBQQVJUSVRJT05JTkcsIGZvciB0aGUgcmVhc29uIHJlY29yZGVkIGF0IGBlMjhgIC8gYGUyOWA6IGBlMzJgXG4gICAgLy8gaXMgYGUzMWAgbmVnYXRlZCBieSBEZSBNb3JnYW4sIHNvIGV4YWN0bHkgb25lIGhvbGRzIGZvciBldmVyeSBzaGFwZVxuICAgIC8vIGBnZXRfbGVhZGAgY2FuIGJpbmQgXHUyMDE0IHVuYm91bmQsIGEgbnVsbCByb3csIHRoZSBjb2x1bW4gYWJzZW50LCBudWxsLFxuICAgIC8vIGVtcHR5LCBvciBrZXllZC4gYGhhcygpYCBhbG9uZSBpcyBub3QgdGhlIHRlc3Q6IG9uIGEgcm93IHRoYXQgY2Fycmllc1xuICAgIC8vIHRoZSBjb2x1bW4gYXMgbnVsbCBpdCBhbnN3ZXJzIHRydWUsIHNvIHRoZSB2YWx1ZSBuZWVkcyBgaXNCbGFua2AgdG9vLlxuICAgIC8vIEZhaWwtQ0xPU0VELCB1bmxpa2UgdGhlIGFwcHJvdmFsIGdhdGU6IHdpdGhvdXQgYSBrZXkgdGhlcmUgaXMgbm90aGluZyB0b1xuICAgIC8vIG1hdGNoIG9uLCBhbmQgYSBndWVzcyBpcyB0aGUgZGVmZWN0LlxuICAgIHsgaWQ6ICdlMzEnLCBzb3VyY2U6ICdkZWNpc2lvbl9tYXRjaF9rZXknLCB0YXJnZXQ6ICdzY3JlZW5fMScsIHR5cGU6ICdkZWZhdWx0JywgY29uZGl0aW9uOiBQYGhhcyh2YXJzLmxlYWRSZWNvcmQpICYmIGhhcyh2YXJzLmxlYWRSZWNvcmQuY29tcGFueV9ub3JtYWxpemVkKSAmJiAhaXNCbGFuayh2YXJzLmxlYWRSZWNvcmQuY29tcGFueV9ub3JtYWxpemVkKWAsIGxhYmVsOiAnSGFzIG1hdGNoIGtleScgfSxcbiAgICB7IGlkOiAnZTMyJywgc291cmNlOiAnZGVjaXNpb25fbWF0Y2hfa2V5JywgdGFyZ2V0OiAncmVmdXNlX25vX21hdGNoX2tleScsIHR5cGU6ICdkZWZhdWx0JywgY29uZGl0aW9uOiBQYCFoYXModmFycy5sZWFkUmVjb3JkKSB8fCAhaGFzKHZhcnMubGVhZFJlY29yZC5jb21wYW55X25vcm1hbGl6ZWQpIHx8IGlzQmxhbmsodmFycy5sZWFkUmVjb3JkLmNvbXBhbnlfbm9ybWFsaXplZClgLCBsYWJlbDogJ05vIG1hdGNoIGtleScgfSxcbiAgICAvLyBSZWpvaW5zIG5vdGhpbmcsIGV4YWN0bHkgbGlrZSBgZTI2YCAvIGBlMzBgLlxuICAgIHsgaWQ6ICdlMzMnLCBzb3VyY2U6ICdyZWZ1c2Vfbm9fbWF0Y2hfa2V5JywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gVGhlIHJlZnVzYWwgYnJhbmNoIHJlam9pbnMgbm90aGluZzogaXQgZ29lcyBzdHJhaWdodCB0byBgZW5kYCwgc28gbm9cbiAgICAvLyBub2RlIHRoYXQgd3JpdGVzIGlzIGRvd25zdHJlYW0gb2YgaXQuIFRoYXQgaXMgdGhlIHJlZnVzYWwgXHUyMDE0IHRoZSBmbG93J3NcbiAgICAvLyBldmVyeSBjcmVhdGUvdXBkYXRlIHNpdHMgYmVoaW5kIGBzY3JlZW5fMWAsIHdoaWNoIHRoaXMgcGF0aCBuZXZlclxuICAgIC8vIHJlYWNoZXMuXG4gICAgeyBpZDogJ2UyNicsIHNvdXJjZTogJ3JlZnVzZV9jb25maXJtZWRfZHVwbGljYXRlJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAnc2NyZWVuXzEnLCB0YXJnZXQ6ICdmaW5kX2FjY291bnQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTQnLCBzb3VyY2U6ICdmaW5kX2FjY291bnQnLCB0YXJnZXQ6ICdkZWNpc2lvbl9hY2NvdW50JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gRXhpc3RpbmcgYWNjb3VudCBcdTIxOTIgcmV1c2U7IG5vIGFjY291bnQgXHUyMTkyIGNyZWF0ZS4gQm90aCBjb252ZXJnZSBvbiBjcmVhdGVfY29udGFjdC5cbiAgICAvLyBgZmluZF9hY2NvdW50YCBpcyByZWFjaGVkIG9ubHkgd2l0aCBhIG1hdGNoIGtleSAoYGUzMWApLCBzbyBhIG1hdGNoXG4gICAgLy8gaGVyZSBpcyBhbiBlcXVhbGl0eSBvbiBhIHJlYWwga2V5LCBuZXZlciB0aGUgaGFzLW5vLXZhbHVlIHByZWRpY2F0ZS5cbiAgICAvLyBcdTI2RDQgTm8gc2Vjb25kIGNvcHkgb2YgdGhlIGtleSB0ZXN0IG9uIHRoZXNlIHR3byBlZGdlczogaXQgY291bGQgbmV2ZXJcbiAgICAvLyBiZSBmYWxzZSBoZXJlLCBhbmQgYW4gaW5lcnQgcmVzdGF0ZW1lbnQgb2YgYSBsaXZlIHByZWRpY2F0ZSBpcyB0aGVcbiAgICAvLyBzaGFwZSAjNjUwIHJldGlyZWQgZnJvbSB0aGlzIHJlcG8ncyBkZWNpc2lvbiBub2Rlcy5cbiAgICB7IGlkOiAnZTUnLCBzb3VyY2U6ICdkZWNpc2lvbl9hY2NvdW50JywgdGFyZ2V0OiAndXNlX2V4aXN0aW5nX2FjY291bnQnLCB0eXBlOiAnZGVmYXVsdCcsIGNvbmRpdGlvbjogUGB2YXJzLm1hdGNoZWRBY2NvdW50ICE9IG51bGxgLCBsYWJlbDogJ0V4aXN0aW5nJyB9LFxuICAgIHsgaWQ6ICdlNicsIHNvdXJjZTogJ2RlY2lzaW9uX2FjY291bnQnLCB0YXJnZXQ6ICdjcmVhdGVfYWNjb3VudCcsIHR5cGU6ICdkZWZhdWx0JywgY29uZGl0aW9uOiBQYHZhcnMubWF0Y2hlZEFjY291bnQgPT0gbnVsbGAsIGxhYmVsOiAnTmV3JyB9LFxuICAgIHsgaWQ6ICdlNycsIHNvdXJjZTogJ2NyZWF0ZV9hY2NvdW50JywgdGFyZ2V0OiAndXNlX25ld19hY2NvdW50JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gQm90aCBhY2NvdW50IGJyYW5jaGVzIGNvbnZlcmdlIG9uIHRoZSBjb250YWN0LWRlZHVwZSBsb29rdXAuXG4gICAgeyBpZDogJ2U4Jywgc291cmNlOiAndXNlX25ld19hY2NvdW50JywgdGFyZ2V0OiAnZmluZF9jb250YWN0JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U5Jywgc291cmNlOiAndXNlX2V4aXN0aW5nX2FjY291bnQnLCB0YXJnZXQ6ICdmaW5kX2NvbnRhY3QnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTEwJywgc291cmNlOiAnZmluZF9jb250YWN0JywgdGFyZ2V0OiAnZGVjaXNpb25fY29udGFjdCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIC8vIEV4aXN0aW5nIGNvbnRhY3QgXHUyMTkyIHJldXNlOyBub25lIFx1MjE5MiBjcmVhdGUuIEJvdGggY29udmVyZ2Ugb25cbiAgICAvLyBkZWNpc2lvbl9vcHBvcnR1bml0eSwgdGhlIHJldXNlIHBhdGggdGhyb3VnaCB0aGUgY29uc2VudCByYWlzZSBiZWxvdy5cbiAgICB7IGlkOiAnZTExJywgc291cmNlOiAnZGVjaXNpb25fY29udGFjdCcsIHRhcmdldDogJ3VzZV9leGlzdGluZ19jb250YWN0JywgdHlwZTogJ2RlZmF1bHQnLCBjb25kaXRpb246IFBgdmFycy5tYXRjaGVkQ29udGFjdCAhPSBudWxsYCwgbGFiZWw6ICdFeGlzdGluZycgfSxcbiAgICB7IGlkOiAnZTEyJywgc291cmNlOiAnZGVjaXNpb25fY29udGFjdCcsIHRhcmdldDogJ2NyZWF0ZV9jb250YWN0JywgdHlwZTogJ2RlZmF1bHQnLCBjb25kaXRpb246IFBgdmFycy5tYXRjaGVkQ29udGFjdCA9PSBudWxsYCwgbGFiZWw6ICdOZXcnIH0sXG4gICAgeyBpZDogJ2UxMycsIHNvdXJjZTogJ2NyZWF0ZV9jb250YWN0JywgdGFyZ2V0OiAndXNlX25ld19jb250YWN0JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UxNCcsIHNvdXJjZTogJ3VzZV9uZXdfY29udGFjdCcsIHRhcmdldDogJ2RlY2lzaW9uX29wcG9ydHVuaXR5JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gXHUyNTAwXHUyNTAwIFRoZSByZXVzZWQgY29udGFjdCdzIGNvbnNlbnQgcmFpc2UgKCMyMDY4KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIGBlMTVgICh1c2VfZXhpc3RpbmdfY29udGFjdCBcdTIxOTIgZGVjaXNpb25fb3Bwb3J0dW5pdHkpIGlzIFJFVElSRUQgYW5kIHN0YXlzXG4gICAgLy8gdmFjYW50OyBgZTM0YCByZXBsYWNlcyBpdC4gRWFjaCBwYWlyIGJlbG93IGlzIFRPVEFMIGFuZCBQQVJUSVRJT05JTkcsIGFuZFxuICAgIC8vIG9ubHkgYSBmbGFnIHRoZSBsZWFkIGNhcnJpZXMgYXMgYHRydWVgIHRha2VzIHRoZSByYWlzZS5cbiAgICB7IGlkOiAnZTM0Jywgc291cmNlOiAndXNlX2V4aXN0aW5nX2NvbnRhY3QnLCB0YXJnZXQ6ICdkZWNpc2lvbl9jb250YWN0X2RvX25vdF9jYWxsJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UzNScsIHNvdXJjZTogJ2RlY2lzaW9uX2NvbnRhY3RfZG9fbm90X2NhbGwnLCB0YXJnZXQ6ICdyYWlzZV9jb250YWN0X2RvX25vdF9jYWxsJywgdHlwZTogJ2RlZmF1bHQnLCBjb25kaXRpb246IFBgaGFzKHZhcnMubGVhZFJlY29yZCkgJiYgaGFzKHZhcnMubGVhZFJlY29yZC5kb19ub3RfY2FsbCkgJiYgdmFycy5sZWFkUmVjb3JkLmRvX25vdF9jYWxsID09IHRydWVgLCBsYWJlbDogJ0RvIG5vdCBjYWxsJyB9LFxuICAgIHsgaWQ6ICdlMzYnLCBzb3VyY2U6ICdkZWNpc2lvbl9jb250YWN0X2RvX25vdF9jYWxsJywgdGFyZ2V0OiAnZGVjaXNpb25fY29udGFjdF9lbWFpbF9vcHRfb3V0JywgdHlwZTogJ2RlZmF1bHQnLCBjb25kaXRpb246IFBgIWhhcyh2YXJzLmxlYWRSZWNvcmQpIHx8ICFoYXModmFycy5sZWFkUmVjb3JkLmRvX25vdF9jYWxsKSB8fCB2YXJzLmxlYWRSZWNvcmQuZG9fbm90X2NhbGwgIT0gdHJ1ZWAsIGxhYmVsOiAnQ2FsbGFibGUnIH0sXG4gICAgeyBpZDogJ2UzNycsIHNvdXJjZTogJ3JhaXNlX2NvbnRhY3RfZG9fbm90X2NhbGwnLCB0YXJnZXQ6ICdkZWNpc2lvbl9jb250YWN0X2VtYWlsX29wdF9vdXQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTM4Jywgc291cmNlOiAnZGVjaXNpb25fY29udGFjdF9lbWFpbF9vcHRfb3V0JywgdGFyZ2V0OiAncmFpc2VfY29udGFjdF9lbWFpbF9vcHRfb3V0JywgdHlwZTogJ2RlZmF1bHQnLCBjb25kaXRpb246IFBgaGFzKHZhcnMubGVhZFJlY29yZCkgJiYgaGFzKHZhcnMubGVhZFJlY29yZC5lbWFpbF9vcHRfb3V0KSAmJiB2YXJzLmxlYWRSZWNvcmQuZW1haWxfb3B0X291dCA9PSB0cnVlYCwgbGFiZWw6ICdPcHRlZCBvdXQnIH0sXG4gICAgeyBpZDogJ2UzOScsIHNvdXJjZTogJ2RlY2lzaW9uX2NvbnRhY3RfZW1haWxfb3B0X291dCcsIHRhcmdldDogJ2RlY2lzaW9uX29wcG9ydHVuaXR5JywgdHlwZTogJ2RlZmF1bHQnLCBjb25kaXRpb246IFBgIWhhcyh2YXJzLmxlYWRSZWNvcmQpIHx8ICFoYXModmFycy5sZWFkUmVjb3JkLmVtYWlsX29wdF9vdXQpIHx8IHZhcnMubGVhZFJlY29yZC5lbWFpbF9vcHRfb3V0ICE9IHRydWVgLCBsYWJlbDogJ0VtYWlsYWJsZScgfSxcbiAgICB7IGlkOiAnZTQwJywgc291cmNlOiAncmFpc2VfY29udGFjdF9lbWFpbF9vcHRfb3V0JywgdGFyZ2V0OiAnZGVjaXNpb25fb3Bwb3J0dW5pdHknLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTE2Jywgc291cmNlOiAnZGVjaXNpb25fb3Bwb3J0dW5pdHknLCB0YXJnZXQ6ICdjcmVhdGVfb3Bwb3J0dW5pdHknLCB0eXBlOiAnZGVmYXVsdCcsIGNvbmRpdGlvbjogUGB2YXJzLmNyZWF0ZU9wcG9ydHVuaXR5ID09IHRydWVgLCBsYWJlbDogJ1llcycgfSxcbiAgICB7IGlkOiAnZTE3Jywgc291cmNlOiAnZGVjaXNpb25fb3Bwb3J0dW5pdHknLCB0YXJnZXQ6ICdub19vcHBvcnR1bml0eScsIHR5cGU6ICdkZWZhdWx0JywgY29uZGl0aW9uOiBQYHZhcnMuY3JlYXRlT3Bwb3J0dW5pdHkgIT0gdHJ1ZWAsIGxhYmVsOiAnTm8nIH0sXG4gICAgeyBpZDogJ2UxOCcsIHNvdXJjZTogJ2NyZWF0ZV9vcHBvcnR1bml0eScsIHRhcmdldDogJ3VzZV9uZXdfb3Bwb3J0dW5pdHknLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTE4YScsIHNvdXJjZTogJ3VzZV9uZXdfb3Bwb3J0dW5pdHknLCB0YXJnZXQ6ICdtYXJrX2NvbnZlcnRlZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMThiJywgc291cmNlOiAnbm9fb3Bwb3J0dW5pdHknLCB0YXJnZXQ6ICdtYXJrX2NvbnZlcnRlZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMTknLCBzb3VyY2U6ICdtYXJrX2NvbnZlcnRlZCcsIHRhcmdldDogJ3NlbmRfbm90aWZpY2F0aW9uJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyMCcsIHNvdXJjZTogJ3NlbmRfbm90aWZpY2F0aW9uJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3MvbGVhZC1jb252ZXJzaW9uLWFwcHJvdmFsLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3MvbGVhZC1jb252ZXJzaW9uLWFwcHJvdmFsLmZsb3cudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IFAsIGNlbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcbnR5cGUgRmxvdyA9IEF1dG9tYXRpb24uRmxvdztcblxuLyoqXG4gKiBMZWFkIENvbnZlcnNpb24gQXBwcm92YWwgXHUyMDE0IHNpZ24tb2ZmIGJlZm9yZSBhIGxlYWQgbWF5IGJlY29tZSBhIGRlYWwuXG4gKlxuICogUkVRLTAwMDUgc3RlcCA3OiBcdTMwMENcdTdFQkZcdTdEMjJcdTVCRjlcdTVFOTRcdTVCQTFcdTYyNzlcdTZENDFcdTdBMEJcdUZGMENcdTVCQTFcdTYyNzlcdTkwMUFcdThGQzdcdTU0MEVcdTY1QjlcdTUzRUZcdThGNkNcdTUzMTZcdTRFM0FcdTZCNjNcdTVGMEZcdTU1NDZcdTY3M0FcdTMwMEQuIEV4cHJlc3NlZCBhcyBhblxuICogKiphcHByb3ZhbCBub2RlKiogKGB0eXBlOiAnYXBwcm92YWwnYCwgQURSLTAwMTkpLCB0aGUgY29uc3RydWN0XG4gKiBgb3Bwb3J0dW5pdHktYXBwcm92YWwuZmxvdy50c2AgYWxyZWFkeSB1c2VzIFx1MjAxNCBcdTI2RDQgdGhlcmUgaXMgbm8gYHdvcmtmbG93YFxuICogbWV0YWRhdGEgdHlwZSBhbmQgbm8gc3RhbmRhbG9uZSBgQXBwcm92YWxQcm9jZXNzYCB0byBhdXRob3IuXG4gKlxuICogIyMgXHUyNkEwXHVGRTBGIFRoaXMgZmxvdyBpcyBJTkVSVCB1bnRpbCBhbiBpbnN0YWxsIGFybXMgdGhlIGdhdGUsIGFuZCB0aGF0IGlzIGJ5IGRlc2lnblxuICpcbiAqIFJFUS0wMDA1OiBcIlRoZSBnYXRlIG11c3QgYmUgY29uZmlndXJhYmxlIFx1MjAxNCBvZmYgYnkgZGVmYXVsdC4gQSBzaW5nbGUtc2VsbGVyXG4gKiBpbnN0YWxsIG11c3Qgbm90IGJlIGZvcmNlZCB0aHJvdWdoIGFuIGFwcHJvdmFsIHRvIGNvbnZlcnQgYSBsZWFkLlwiXG4gKlxuICogVGhlIHN3aXRjaCBpcyBgY3JtX2xlYWQuY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXNgJ3MgYGRlZmF1bHRWYWx1ZWAsIG5vdCB0aGlzXG4gKiBmbG93J3MgYHN0YXR1c2AuIFNoaXBwZWQsIHRoYXQgZGVmYXVsdCBpcyBgbm90X3JlcXVpcmVkYCwgc28gTk8gbGVhZCBpcyBldmVyXG4gKiBib3JuIGBwZW5kaW5nYCBhbmQgdGhlIHN0YXJ0IGNvbmRpdGlvbiBiZWxvdyBpcyBmYWxzZSBmb3IgZXZlcnkgcmVjb3JkIHRoYXRcbiAqIGhhcyBldmVyIGV4aXN0ZWQgXHUyMDE0IHRoZSBmbG93IHJlZ2lzdGVycywgYmluZHMgaXRzIHRyaWdnZXIsIG9wZW5zIG5vdGhpbmcsIGFuZFxuICogY29zdHMgYSBwcmVkaWNhdGUgZXZhbHVhdGlvbiBwZXIgaW5zZXJ0LiBBbiBpbnN0YWxsIGFybXMgdGhlIGdhdGUgYnkgY2hhbmdpbmdcbiAqIHRoYXQgb25lIHZhbHVlIHRvIGAncGVuZGluZydgOyBmcm9tIHRoZW4gb24gZXZlcnkgTkVXIGxlYWQgZW50ZXJzIGhlcmUsIGFuZFxuICogYGxlYWQuaG9vay50c2AgcmVmdXNlcyBpdHMgY29udmVyc2lvbiB1bnRpbCB0aGlzIGZsb3cgd3JpdGVzIGEgdmVyZGljdC5cbiAqXG4gKiBcdTI2RDQgRG8gTk9UIHJlYWNoIGZvciBgc3RhdHVzOiAnZHJhZnQnYCBhcyB0aGUgb2ZmIHN3aXRjaCBpbnN0ZWFkLiBNZWFzdXJlZCBvblxuICogYEBvYmplY3RzdGFjay9zZXJ2aWNlLWF1dG9tYXRpb25gIDE3LjQuMCwgd2hvc2Ugb3duIHJlZ2lzdHJhdGlvblxuICogZGlhZ25vc3RpYyBzYXlzIGl0IGluIGFzIG1hbnkgd29yZHMgXHUyMDE0IFwiZHJhZnQgZmxvd3Mgc3RpbGwgZmlyZSB0aGVpciB0cmlnZ2VycztcbiAqIHNldCBzdGF0dXM6ICdhY3RpdmUnIHRvIG1ha2UgaW50ZW50IGV4cGxpY2l0LCBvciAnb2Jzb2xldGUnIHRvIGRpc2FibGVcIi4gQW5kXG4gKiBcdTI2RDQgbm90IGAnb2Jzb2xldGUnYCBlaXRoZXI6IGBpc0Zsb3dFbmFibGVkYCBjb21wb3NlcyB0aGUgYXV0aG9yaW5nIHN0YXR1cyB3aXRoXG4gKiB0aGUgaW5zdGFsbGF0aW9uJ3MgYWN0aXZhdGlvbiBsZWRnZXIgc28gdGhhdCBcImVpdGhlciBvbmUgZGlzYXJtczsgbmVpdGhlciBjYW5cbiAqIG92ZXJyaWRlIHRoZSBvdGhlclwiLCB3aGljaCBtYWtlcyBgb2Jzb2xldGVgIGEgZ2F0ZSBubyBpbnN0YWxsIGNhbiBldmVyIHR1cm5cbiAqIE9OIFx1MjAxNCB0aGUgb3Bwb3NpdGUgb2YgY29uZmlndXJhYmxlLiBBIGNvbmRpdGlvbiBubyByZWNvcmQgc2F0aXNmaWVzIGlzIG9mZiBBTkRcbiAqIHN3aXRjaGFibGU7IGEgZGlzYWJsZWQgZmxvdyBpcyBvbmx5IG9mZi5cbiAqXG4gKiAjIyBXaHkgdGhlIHRyaWdnZXIgaXMgaW5zZXJ0LW9ubHlcbiAqXG4gKiBgcGVuZGluZ2AgYXBwZWFycyBhdCBleGFjdGx5IG9uZSBtb21lbnQgXHUyMDE0IHRoZSBmaWVsZCBkZWZhdWx0LCBzdGFtcGVkIGFzIHRoZVxuICogcm93IGlzIHdyaXR0ZW4gXHUyMDE0IHNvIHRoZSByZXF1ZXN0IGlzIG9wZW5lZCB3aGVyZSBpdCBhcHBlYXJzLiBcdTI2RDQgQW4gYWZ0ZXJVcGRhdGVcbiAqIHR3aW4gKHRoZSBzaGFwZSBgb3Bwb3J0dW5pdHlfYXBwcm92YWxgIG5lZWRzLCBiZWNhdXNlIGEgZGVhbCBjYW4gR1JPVyBhY3Jvc3NcbiAqIGl0cyB0aHJlc2hvbGQpIHdvdWxkIHJlLWVudGVyIG9uIGV2ZXJ5IGVkaXQgbWFkZSB3aGlsZSB0aGUgbGVhZCBzYXQgcGVuZGluZ1xuICogYW5kIG9wZW4gYSBzZWNvbmQgcmVxdWVzdCBmb3IgdGhlIHNhbWUgZGVjaXNpb24uXG4gKlxuICogXHUyMUQyIEEgbGVhZCB0aGF0IHByZWRhdGVzIHRoZSBhcm1pbmcga2VlcHMgYG5vdF9yZXF1aXJlZGAgYW5kIG5ldmVyIGVudGVycywgd2hpY2hcbiAqIGlzIFJFUS0wMDA1IGFjY2VwdGFuY2UgNCBob2xkaW5nIGJ5IGNvbnN0cnVjdGlvbjogYXJtaW5nIHRoZSBnYXRlIGludmFsaWRhdGVzXG4gKiBubyBleGlzdGluZyByZWNvcmQuXG4gKi9cbmV4cG9ydCBjb25zdCBMZWFkQ29udmVyc2lvbkFwcHJvdmFsRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2xlYWRfY29udmVyc2lvbl9hcHByb3ZhbCcsXG4gIGxhYmVsOiAnTGVhZCBDb252ZXJzaW9uIEFwcHJvdmFsJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1NpZ24tb2ZmIGEgbGVhZCBuZWVkcyBiZWZvcmUgaXQgbWF5IGJlIGNvbnZlcnRlZC4gSW5lcnQgdW5sZXNzIHRoZSBpbnN0YWxsIGFybXMgdGhlIGdhdGUgb24gY3JtX2xlYWQuY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXMuJyxcbiAgdHlwZTogJ3JlY29yZF9jaGFuZ2UnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBTYW1lIHJlYWRpbmcgYG9wcG9ydHVuaXR5X2FwcHJvdmFsYCByZWNvcmRzLCBhbmQgZm9yIHRoZSBzYW1lIHR3byByZWFzb25zLlxuICAvLyBBIGdhdGUgZXhpc3RzIHRvIENPTlNUUkFJTiB0aGUgc3VibWl0dGVyLCBzbyB0aGUgc3VibWl0dGVyJ3Mgb3duIHNjb3BlIGlzXG4gIC8vIHRoZSB3cm9uZyBpZGVudGl0eSB0byBldmFsdWF0ZSBpdCB1bmRlciBcdTIwMTQgYW5kIGFuIGFwcHJvdmFsIGNvbnRyb2wgdGhhdFxuICAvLyBlbmdhZ2VzIG9ubHkgZm9yIHdyaXRlcnMgY2FycnlpbmcgYSBzZXNzaW9uIGlzIG5vdCBhIGNvbnRyb2wsIHNpbmNlIGFcbiAgLy8gYHJ1bkFzOiAnc3lzdGVtJ2AgaW1wb3J0ZXIgY3JlYXRpbmcgbGVhZHMgd291bGQgc2ltcGx5IGJ5cGFzcyBpdC4gVGhlXG4gIC8vIHZlcmRpY3Qgd3JpdGVzIGJlbG93IGFsc28gbGFuZCBvbiBgY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXNgLCB3aGljaCBpc1xuICAvLyBgcmVhZG9ubHk6IHRydWVgIG9uIHRoZSBvYmplY3QsIHNvIG9ubHkgYSBwbGF0Zm9ybSB3cml0ZSByZWFjaGVzIGl0LlxuICBydW5BczogJ3N5c3RlbScsXG5cbiAgdmFyaWFibGVzOiBbXG4gICAgeyBuYW1lOiAnbGVhZElkJywgdHlwZTogJ3RleHQnLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgXSxcblxuICBub2RlczogW1xuICAgIHtcbiAgICAgIGlkOiAnc3RhcnQnLFxuICAgICAgdHlwZTogJ3N0YXJ0JyxcbiAgICAgIGxhYmVsOiAnU3RhcnQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fbGVhZCcsXG4gICAgICAgIHRyaWdnZXJUeXBlOiAncmVjb3JkLWFmdGVyLWNyZWF0ZScsXG4gICAgICAgIC8vIFRPVEFMSVRZIChBR0VOVFMubWQgXHUyMDE0IHZhbGlkYXRpb24gcHJlZGljYXRlcyBtdXN0IGJlIFRPVEFMKTogYGhhcygpYFxuICAgICAgICAvLyBvbiBldmVyeSByZWFkLiBBIGZsb3cgY29uZGl0aW9uIGlzIHN0cmljdCBDRUwgb24gZXZlcnkgcnVuLCBhbmQgYW5cbiAgICAgICAgLy8gdW5ndWFyZGVkIHJlYWQgYWdhaW5zdCBhIGRyaXZlciB0aGF0IG9taXRzIGFic2VudCBjb2x1bW5zIGFib3J0cyBcdTIwMTRcbiAgICAgICAgLy8gd2hpY2ggZnJvbSAxNy4wLjAtcmMuMiBGQUlMUyBUSEUgUlVOIHJhdGhlciB0aGFuIHNraXBwaW5nIGl0LiBUaGVcbiAgICAgICAgLy8gYWJzZW50IGNhc2UgbXVzdCByZWFkIGFzIFwibm90IGdhdGVkXCI6IGEgbGVhZCB3aXRoIG5vIGFwcHJvdmFsIGNvbHVtblxuICAgICAgICAvLyBhdCBhbGwgaXMgYSBsZWFkIGZyb20gYmVmb3JlIHRoZSBmaWVsZCBleGlzdGVkLCBhbmQgaXQgY29udmVydHMgdGhlXG4gICAgICAgIC8vIHdheSBpdCBhbHdheXMgZGlkLlxuICAgICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5jb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1cykgJiYgcmVjb3JkLmNvbnZlcnNpb25fYXBwcm92YWxfc3RhdHVzID09IFwicGVuZGluZ1wiYCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2dldF9sZWFkJyxcbiAgICAgIHR5cGU6ICdnZXRfcmVjb3JkJyxcbiAgICAgIGxhYmVsOiAnR2V0IExlYWQnLFxuICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fbGVhZCcsIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZC5pZGAgfSwgb3V0cHV0VmFyaWFibGU6ICdsZWFkUmVjb3JkJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdjb252ZXJzaW9uX3JldmlldycsXG4gICAgICB0eXBlOiAnYXBwcm92YWwnLFxuICAgICAgbGFiZWw6ICdMZWFkIENvbnZlcnNpb24gUmV2aWV3JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBUaGUgY3VzdG9tZXIncyBjaGFpbiBpcyBcdTk1MDBcdTU1MkVcdThEMUZcdThEMjNcdTRFQkEgXHUyMTkyIFx1OTUwMFx1NTUyRVx1NjAzQlx1NzZEMTsgdGhlIGdlbmVyaWMgc2hhcGUgY29yZVxuICAgICAgICAvLyBzaGlwcyBpcyB0aGUgbWFuYWdlciBiZW5jaCB0aGlzIGFwcCBhbHJlYWR5IGRlY2xhcmVzIGFwcHJvdmVyc1xuICAgICAgICAvLyBhZ2FpbnN0LiBBIHNlY29uZCB0aWVyLCBvciBhIGRpZmZlcmVudCBwb3NpdGlvbiwgaXMgb3ZlcmxheVxuICAgICAgICAvLyBjb25maWd1cmF0aW9uIFx1MjAxNCB0aGUgc2FtZSBzdGF0dXMgYXMgdGhlIG5lZWQtdHlwZSB2b2NhYnVsYXJ5LlxuICAgICAgICBhcHByb3ZlcnM6IFt7IHR5cGU6ICdwb3NpdGlvbicsIHZhbHVlOiAnc2FsZXNfbWFuYWdlcicgfV0sXG4gICAgICAgIC8vIEV4cGxpY2l0IHRob3VnaCBpdCBpcyB0aGUgc2NoZW1hIGRlZmF1bHQsIGV4YWN0bHkgYXNcbiAgICAgICAgLy8gYG9wcG9ydHVuaXR5X2FwcHJvdmFsYCBhdXRob3JzIGl0OiBhcHByb3ZlcnMgc25hcHNob3QgYXQgcmVxdWVzdFxuICAgICAgICAvLyBjcmVhdGlvbiwgc28gYW4gZW1wdHkgYmVuY2ggd291bGQgb3RoZXJ3aXNlIGxlYXZlIHRoZSByZXF1ZXN0XG4gICAgICAgIC8vIHVuZGVjaWRhYmxlIFx1MjAxNCBhbmQgaGVyZSB0aGF0IG1lYW5zIGEgbGVhZCBub2JvZHkgY2FuIGV2ZXIgY29udmVydC5cbiAgICAgICAgb25FbXB0eUFwcHJvdmVyczogJ2FkbWluX3Jlc2N1ZScsXG4gICAgICAgIGJlaGF2aW9yOiAnZmlyc3RfcmVzcG9uc2UnLFxuICAgICAgICAvLyBcdTI2QTBcdUZFMEYgYGZhbHNlYCwgYW5kIE5PVCB0aGUgc2NoZW1hIGRlZmF1bHQgYHRydWVgIFx1MjAxNCB0aGUgb25lIHBsYWNlIHRoaXNcbiAgICAgICAgLy8gbm9kZSBkZWxpYmVyYXRlbHkgZGlmZmVycyBmcm9tIGl0cyBvcHBvcnR1bml0eSBzaWJsaW5nLiBBIGRlYWwgdW5kZXJcbiAgICAgICAgLy8gcmV2aWV3IGlzIGEgZG9jdW1lbnQgYmVpbmcgbmVnb3RpYXRlZDsgYSBMRUFEIHVuZGVyIHJldmlldyBpcyBhIHBlcnNvblxuICAgICAgICAvLyBhIHJlcCBpcyBzdGlsbCBjYWxsaW5nLiBMb2NraW5nIHRoZSByZWNvcmQgd291bGQgZnJlZXplXG4gICAgICAgIC8vIGBsYXN0X2NvbnRhY3RlZF9kYXRlYCwgYG5leHRfZm9sbG93dXBfZGF0ZWAsIHRoZSBub3RlcyBhbmQgZXZlcnlcbiAgICAgICAgLy8gYWN0aXZpdHkgYnViYmxlIGZvciBhcyBsb25nIGFzIHRoZSBhcHByb3ZlciB0YWtlcywgc28gdGhlIGdhdGUgd291bGRcbiAgICAgICAgLy8gc3RvcCB0aGUgd29yayBpdCBleGlzdHMgdG8gYXV0aG9yaXNlLiBOb3RoaW5nIGlzIGF0IHJpc2sgaW4gbGVhdmluZyBpdFxuICAgICAgICAvLyBvcGVuOiB0aGUgdmVyZGljdCBjb2x1bW4gaXMgYHJlYWRvbmx5OiB0cnVlYCwgc28gdGhlIG9ubHkgZmllbGQgdGhpc1xuICAgICAgICAvLyBub2RlJ3MgZGVjaXNpb24gdG91Y2hlcyBpcyBvbmUgbm8gdXNlciBtYXkgd3JpdGUgYW55d2F5LlxuICAgICAgICBsb2NrUmVjb3JkOiBmYWxzZSxcbiAgICAgICAgYXBwcm92YWxTdGF0dXNGaWVsZDogJ2NvbnZlcnNpb25fYXBwcm92YWxfc3RhdHVzJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ21hcmtfYXBwcm92ZWQnLFxuICAgICAgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLFxuICAgICAgbGFiZWw6ICdNYXJrIEFwcHJvdmVkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2xlYWQnLFxuICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBjb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1czogJ2FwcHJvdmVkJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnbm90aWZ5X2FwcHJvdmVkJyxcbiAgICAgIHR5cGU6ICdub3RpZnknLFxuICAgICAgbGFiZWw6ICdOb3RpZnkgT3duZXIgXHUyMDE0IEFwcHJvdmVkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICByZWNpcGllbnRzOiBbY2VsYGhhcyhsZWFkUmVjb3JkLm93bmVyX2lkKSA/IGxlYWRSZWNvcmQub3duZXJfaWQgOiBudWxsYF0sXG4gICAgICAgIGNoYW5uZWxzOiBbJ2luYm94J10sXG4gICAgICAgIHRvcGljOiAnbGVhZF9jb252ZXJzaW9uX2FwcHJvdmVkJyxcbiAgICAgICAgdGVtcGxhdGU6ICdjcm0ubGVhZF9jb252ZXJzaW9uX2FwcHJvdmVkJyxcbiAgICAgICAgdGVtcGxhdGVEYXRhOiB7IGZpcnN0X25hbWU6IGNlbGBsZWFkUmVjb3JkLmZpcnN0X25hbWVgLCBsYXN0X25hbWU6IGNlbGBsZWFkUmVjb3JkLmxhc3RfbmFtZWAgfSxcbiAgICAgICAgYWN0aW9uVXJsOiAnL2NybV9sZWFkL3t7cmVjb3JkLmlkfX0nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnbWFya19yZWplY3RlZCcsXG4gICAgICB0eXBlOiAndXBkYXRlX3JlY29yZCcsXG4gICAgICBsYWJlbDogJ01hcmsgUmVqZWN0ZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fbGVhZCcsXG4gICAgICAgIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZC5pZGAgfSxcbiAgICAgICAgZmllbGRzOiB7IGNvbnZlcnNpb25fYXBwcm92YWxfc3RhdHVzOiAncmVqZWN0ZWQnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdub3RpZnlfcmVqZWN0ZWQnLFxuICAgICAgdHlwZTogJ25vdGlmeScsXG4gICAgICBsYWJlbDogJ05vdGlmeSBPd25lciBcdTIwMTQgUmVqZWN0ZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtjZWxgaGFzKGxlYWRSZWNvcmQub3duZXJfaWQpID8gbGVhZFJlY29yZC5vd25lcl9pZCA6IG51bGxgXSxcbiAgICAgICAgY2hhbm5lbHM6IFsnaW5ib3gnXSxcbiAgICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgICAgdG9waWM6ICdsZWFkX2NvbnZlcnNpb25fcmVqZWN0ZWQnLFxuICAgICAgICB0ZW1wbGF0ZTogJ2NybS5sZWFkX2NvbnZlcnNpb25fcmVqZWN0ZWQnLFxuICAgICAgICB0ZW1wbGF0ZURhdGE6IHsgZmlyc3RfbmFtZTogY2VsYGxlYWRSZWNvcmQuZmlyc3RfbmFtZWAsIGxhc3RfbmFtZTogY2VsYGxlYWRSZWNvcmQubGFzdF9uYW1lYCB9LFxuICAgICAgICBhY3Rpb25Vcmw6ICcvY3JtX2xlYWQve3tyZWNvcmQuaWR9fScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIHsgaWQ6ICdlMScsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAnZ2V0X2xlYWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdnZXRfbGVhZCcsIHRhcmdldDogJ2NvbnZlcnNpb25fcmV2aWV3JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gQXBwcm92YWwtbm9kZSBicmFuY2ggbGFiZWxzIFx1MjAxNCB0aGUgZW5naW5lIHJlc3VtZXMgZG93biB0aGUgb3V0LWVkZ2Ugd2hvc2VcbiAgICAvLyBgbGFiZWxgIG1hdGNoZXMgdGhlIHJlY29yZGVkIGRlY2lzaW9uLlxuICAgIHsgaWQ6ICdlMycsIHNvdXJjZTogJ2NvbnZlcnNpb25fcmV2aWV3JywgdGFyZ2V0OiAnbWFya19hcHByb3ZlZCcsIHR5cGU6ICdkZWZhdWx0JywgbGFiZWw6ICdhcHByb3ZlJyB9LFxuICAgIHsgaWQ6ICdlNCcsIHNvdXJjZTogJ2NvbnZlcnNpb25fcmV2aWV3JywgdGFyZ2V0OiAnbWFya19yZWplY3RlZCcsIHR5cGU6ICdkZWZhdWx0JywgbGFiZWw6ICdyZWplY3QnIH0sXG4gICAgeyBpZDogJ2U1Jywgc291cmNlOiAnbWFya19hcHByb3ZlZCcsIHRhcmdldDogJ25vdGlmeV9hcHByb3ZlZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlNicsIHNvdXJjZTogJ25vdGlmeV9hcHByb3ZlZCcsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlNycsIHNvdXJjZTogJ21hcmtfcmVqZWN0ZWQnLCB0YXJnZXQ6ICdub3RpZnlfcmVqZWN0ZWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTgnLCBzb3VyY2U6ICdub3RpZnlfcmVqZWN0ZWQnLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9hY2NvdW50LWFwcHJvdmFsLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3MvYWNjb3VudC1hcHByb3ZhbC5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogQWNjb3VudCBBcHByb3ZhbCBcdTIwMTQgdGhlIHNpZ24tb2ZmIGEgbmV3IGFjY291bnQgcmVjb3JkIG5lZWRzIGJlZm9yZSBpdCBjb3VudHNcbiAqIGFzIGVzdGFibGlzaGVkIGRhdGEuXG4gKlxuICogUkVRLTAwMDMgc3RlcCA1OiBcdTMwMENcdTVCQTJcdTYyMzdcdTRGRTFcdTYwNkZcdTYzRDBcdTRFQTRcdTU0MEVcdThGREJcdTUxNjVcdTVCQTFcdTYyNzlcdTZENDFcdUZGMENcdTVCQTFcdTYyNzlcdTkwMUFcdThGQzdcdTU0MEVcdTVCQTJcdTYyMzdcdTZCNjNcdTVGMEZcdTc1MUZcdTY1NDhcdTMwMEQuIEV4cHJlc3NlZCBhcyBhblxuICogKiphcHByb3ZhbCBub2RlKiogKGB0eXBlOiAnYXBwcm92YWwnYCwgQURSLTAwMTkpLCB0aGUgY29uc3RydWN0XG4gKiBgb3Bwb3J0dW5pdHktYXBwcm92YWwuZmxvdy50c2AgYW5kIGBsZWFkLWNvbnZlcnNpb24tYXBwcm92YWwuZmxvdy50c2AgYWxyZWFkeVxuICogdXNlIFx1MjAxNCBcdTI2RDQgdGhlcmUgaXMgbm8gYHdvcmtmbG93YCBtZXRhZGF0YSB0eXBlIGFuZCBubyBzdGFuZGFsb25lXG4gKiBgQXBwcm92YWxQcm9jZXNzYCB0byBhdXRob3IuXG4gKlxuICogIyMgXHUyNkEwXHVGRTBGIFRoaXMgZmxvdyBzaGlwcyBBUk1FRCwgYW5kIHRoYXQgaXMgdGhlIG9uZSBwbGFjZSBpdCBkaWZmZXJzIGZyb20gaXRzXG4gKiAjIyBsZWFkIHNpYmxpbmdcbiAqXG4gKiBgbGVhZC1jb252ZXJzaW9uLWFwcHJvdmFsYCBpcyBpbmVydCB1bnRpbCBhbiBpbnN0YWxsIG9wdHMgaW4sIGJlY2F1c2VcbiAqIFJFUS0wMDA1IGFza2VkIGZvciBhIGdhdGUgdGhhdCBpcyBvZmYgYnkgZGVmYXVsdC4gUkVRLTAwMDMgYXNrcyBmb3IgdGhlXG4gKiBvcHBvc2l0ZSBpbiBhcyBtYW55IHdvcmRzIFx1MjAxNCBhY2NlcHRhbmNlIDQ6IFwiQSBuZXdseSBjcmVhdGVkIGFjY291bnQgc2l0cyBpbiBhXG4gKiBwZW5kaW5nIHN0YXRlLCBhcHBlYXJzIGluIHRoZSBwbGF0Zm9ybSBhcHByb3ZhbCBpbmJveCBIb3RDUk0gYWxyZWFkeSBtb3VudHMsXG4gKiBhbmQgb25seSByZWFjaGVzIHRoZSBhcHByb3ZlZCBzdGF0ZSB0aHJvdWdoIGEgZGVjaXNpb24gb24gdGhhdCByZXF1ZXN0LlwiIFNvXG4gKiBldmVyeSBuZXcgYWNjb3VudCBlbnRlcnMgaGVyZTogYGNybV9hY2NvdW50LmFwcHJvdmFsX3N0YXR1c2Agc2hpcHMgd2l0aCBOT1xuICogZGVmYXVsdCwgYSBuZXcgYWNjb3VudCBpcyBib3JuIGJsYW5rLCBhbmQgdGhlIHN0YXJ0IGNvbmRpdGlvbiBiZWxvdyBmaXJlcyBvblxuICogdGhlIGJsYW5rLlxuICpcbiAqICMjIGBwZW5kaW5nYCBpcyB3cml0dGVuIGJ5IHRoZSByZXF1ZXN0LCBub3QgYnkgdGhlIGZpZWxkIGRlZmF1bHQgKCMyMDY3KVxuICpcbiAqIFRoZSBhcHByb3ZhbCBub2RlJ3MgYGFwcHJvdmFsU3RhdHVzRmllbGRgIG1pcnJvciB3cml0ZXMgYHBlbmRpbmdgIG9udG8gdGhlXG4gKiBhY2NvdW50IHRoZSBtb21lbnQgaXQgb3BlbnMgdGhlIHJlcXVlc3QgKHBsdWdpbi1hcHByb3ZhbHMgYG9wZW5Ob2RlUmVxdWVzdGAsXG4gKiBtZWFzdXJlZCBvbiAxNy43LjApLCBpbnNpZGUgdGhlIGNyZWF0ZSwgc28gd2l0aCBhcHByb3ZhbHMgaW4gdGhlXG4gKiBjb21wb3NpdGlvbiBhY2NlcHRhbmNlIDQgaG9sZHMgZXhhY3RseSBhcyBiZWZvcmUgYW5kIGBwZW5kaW5nYCBhbHdheXMgaGFzIGFcbiAqIHJlcXVlc3QgYmVoaW5kIGl0LiBXaXRob3V0IGFwcHJvdmFscyBubyBleGVjdXRvciBleGlzdHMgZm9yIHRoZSBub2RlLCB0aGVcbiAqIHJ1biBmYWlscyBhdCBpdCAoYE5vIGV4ZWN1dG9yIHJlZ2lzdGVyZWQgZm9yIG5vZGUgdHlwZSAnYXBwcm92YWwnYCksIGFuZFxuICogbm90aGluZyB3cml0ZXMgYHBlbmRpbmdgOiB0aGUgYWNjb3VudCBzdGF5cyBibGFuayBhbmQgZWRpdGFibGUuIEEgc2hpcHBlZFxuICogYHBlbmRpbmdgIGRlZmF1bHQgaGFkIHN0YW1wZWQgZXZlcnkgc3VjaCBhY2NvdW50IGBwZW5kaW5nYCB3aXRoIG5vIHJlcXVlc3RcbiAqIGJlaGluZCBpdCwgYW5kIHRoZSBjb25zb2xlIGRlcml2ZXMgaXRzIGxvY2sgZnJvbSB0aGF0IHZhbHVlLCBzbyBlYWNoIG9uZVxuICogcmVhZCBcImxvY2tlZCBmb3IgYXBwcm92YWxcIiBmb3JldmVyIHdpdGggbm90aGluZyBhYmxlIHRvIGRlY2lkZSBpdC5cbiAqXG4gKiBUaGUgb2ZmIHN3aXRjaCBpcyBzdGlsbCB0aGUgZmllbGQgZGVmYXVsdCwgbm90IHRoaXMgZmxvdydzIGBzdGF0dXNgOiBhblxuICogaW5zdGFsbCB0aGF0IHdhbnRzIG5vIGFjY291bnQgc2lnbi1vZmYgZ2l2ZXMgdGhlIGNvbHVtbiBhIGRlZmF1bHQgb2ZcbiAqIGBhcHByb3ZlZGAsIHRoZSBzdGFydCBjb25kaXRpb24gYmVsb3cgaXMgdGhlbiBmYWxzZSBmb3IgZXZlcnkgcmVjb3JkIHRoYXRcbiAqIHdpbGwgZXZlciBleGlzdCwgYW5kIHRoZSBnYXRlIGlzIG9mZiBBTkQgc3RpbGwgc3dpdGNoYWJsZS4gXHUyNkQ0IERvIE5PVCByZWFjaFxuICogZm9yIGBzdGF0dXM6ICdkcmFmdCdgIG9yIGAnb2Jzb2xldGUnYCBpbnN0ZWFkIFx1MjAxNCBib3RoIHdlcmUgbWVhc3VyZWQgb25cbiAqIGBAb2JqZWN0c3RhY2svc2VydmljZS1hdXRvbWF0aW9uYCAxNy40LjAgYW5kIG5laXRoZXIgaXMgYW4gb2ZmIHN3aXRjaDogZHJhZnRcbiAqIGZsb3dzIHN0aWxsIGZpcmUgdGhlaXIgdHJpZ2dlcnMsIGFuZCBgaXNGbG93RW5hYmxlZGAgY29tcG9zZXMgYXV0aG9yaW5nXG4gKiBzdGF0dXMgd2l0aCB0aGUgaW5zdGFsbGF0aW9uJ3MgYWN0aXZhdGlvbiBsZWRnZXIgc28gdGhhdCBgb2Jzb2xldGVgIGlzIGEgZ2F0ZVxuICogbm8gaW5zdGFsbCBjYW4gZXZlciB0dXJuIGJhY2sgT04uIFRoYXQgbWVhc3VyZW1lbnQgaXMgcmVjb3JkZWQgaW5cbiAqIGBsZWFkLWNvbnZlcnNpb24tYXBwcm92YWwuZmxvdy50c2A7IGl0IGlzIHF1b3RlZCBoZXJlLCBcdTI2RDQgbm90IHJlLWRlcml2ZWQuXG4gKlxuICogIyMgV2h5IHRoZSB0cmlnZ2VyIGlzIGluc2VydC1vbmx5XG4gKlxuICogU3VibWlzc2lvbiBoYXBwZW5zIGF0IGV4YWN0bHkgb25lIG1vbWVudCwgdGhlIGFjY291bnQncyBjcmVhdGlvbiwgc28gdGhhdCBpc1xuICogd2hlcmUgdGhlIHJlcXVlc3QgaXMgb3BlbmVkLiBcdTI2RDQgQW4gYWZ0ZXJVcGRhdGUgdHdpbiB3b3VsZCByZS1lbnRlciBvbiBldmVyeVxuICogZWRpdCBtYWRlIHdoaWxlIHRoZSBhY2NvdW50IHNhdCBibGFuayBvciBwZW5kaW5nIGFuZCBvcGVuIGEgc2Vjb25kIHJlcXVlc3RcbiAqIGZvciB0aGUgc2FtZSBkZWNpc2lvbi4gVGhlIHRyaWdnZXIsIG5vdCB0aGUgY29uZGl0aW9uLCBpcyBhbHNvIHdoYXQga2VlcHMgYW5cbiAqIGFjY291bnQgdGhhdCBwcmVkYXRlcyB0aGlzIGZpZWxkIG91dDogaXQgY2FycmllcyBubyBgYXBwcm92YWxfc3RhdHVzYCwgd2hpY2hcbiAqIHRoZSBjb25kaXRpb24gYmVsb3cgd291bGQgcmVhZCBhcyBibGFuaywgYnV0IGl0IGlzIG5ldmVyIGluc2VydGVkIGFnYWluLCBzb1xuICogaXQgaXMgbmV2ZXIgZHJhZ2dlZCBpbnRvIGFuIGFwcHJvdmFsIGl0IHdhcyBub3QgY3JlYXRlZCB1bmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IEFjY291bnRBcHByb3ZhbEZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICdhY2NvdW50X2FwcHJvdmFsJyxcbiAgbGFiZWw6ICdBY2NvdW50IEFwcHJvdmFsJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1NpZ24tb2ZmIGEgbmV3bHkgY3JlYXRlZCBhY2NvdW50IG5lZWRzIGJlZm9yZSBpdCBjb3VudHMgYXMgZXN0YWJsaXNoZWQgZGF0YS4gU3dpdGNoYWJsZSBmcm9tIGNybV9hY2NvdW50LmFwcHJvdmFsX3N0YXR1cy4nLFxuICB0eXBlOiAncmVjb3JkX2NoYW5nZScsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG4gIC8vIFNhbWUgcmVhZGluZyB0aGUgdHdvIHNpYmxpbmcgYXBwcm92YWwgZmxvd3MgcmVjb3JkLiBBIGdhdGUgZXhpc3RzIHRvXG4gIC8vIENPTlNUUkFJTiB0aGUgc3VibWl0dGVyLCBzbyB0aGUgc3VibWl0dGVyJ3Mgb3duIHNjb3BlIGlzIHRoZSB3cm9uZyBpZGVudGl0eVxuICAvLyB0byBldmFsdWF0ZSBpdCB1bmRlcjsgYW5kIHRoZSB2ZXJkaWN0IHdyaXRlcyBiZWxvdyBsYW5kIG9uXG4gIC8vIGBhcHByb3ZhbF9zdGF0dXNgLCB3aGljaCBpcyBgcmVhZG9ubHk6IHRydWVgIG9uIHRoZSBvYmplY3QsIHNvIG9ubHkgYVxuICAvLyBwbGF0Zm9ybSB3cml0ZSByZWFjaGVzIGl0IGF0IGFsbC5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuXG4gIHZhcmlhYmxlczogW3sgbmFtZTogJ2FjY291bnRJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH1dLFxuXG4gIG5vZGVzOiBbXG4gICAge1xuICAgICAgaWQ6ICdzdGFydCcsXG4gICAgICB0eXBlOiAnc3RhcnQnLFxuICAgICAgbGFiZWw6ICdTdGFydCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9hY2NvdW50JyxcbiAgICAgICAgdHJpZ2dlclR5cGU6ICdyZWNvcmQtYWZ0ZXItY3JlYXRlJyxcbiAgICAgICAgLy8gRmlyZXMgb24gdGhlIEJMQU5LIGEgbmV3IGFjY291bnQgaXMgYm9ybiB3aXRoIChzZWUgdGhlIGhlYWRlcik6XG4gICAgICAgIC8vIGFic2VudCBvbiBhIHNwYXJzZSBkcml2ZXIsIG51bGwgb24gU1FMLiBBIHVzZXIgY2Fubm90IHByZS1maWxsIHRoZVxuICAgICAgICAvLyBjb2x1bW4gKGl0IGlzIGByZWFkb25seWApLCBzbyBvbmx5IGEgc3lzdGVtIHdyaXRlciBvciBhbiBpbnN0YWxsJ3NcbiAgICAgICAgLy8gYGFwcHJvdmVkYCBkZWZhdWx0IGNhbiBtYWtlIGl0IG5vbi1ibGFuayBhdCBpbnNlcnQsIGFuZCBib3RoIG1lYW5cbiAgICAgICAgLy8gXCJub3RoaW5nIHRvIHN1Ym1pdFwiLlxuICAgICAgICAvLyBUT1RBTElUWSAoQUdFTlRTLm1kIFx1MjAxNCB2YWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTCk6IHRoZVxuICAgICAgICAvLyBgKCFoYXMoeCkgfHwgaXNCbGFuayh4KSlgIGZvcm0gaXMgdGhlIFwieCBob2xkcyBubyB2YWx1ZVwiIHJvdyBvZiB0aGF0XG4gICAgICAgIC8vIHRhYmxlLiBBIGZsb3cgY29uZGl0aW9uIGlzIHN0cmljdCBDRUwgb24gZXZlcnkgcnVuLCBhbmQgYW4gdW5ndWFyZGVkXG4gICAgICAgIC8vIHJlYWQgYWdhaW5zdCBhIGRyaXZlciB0aGF0IG9taXRzIGFic2VudCBjb2x1bW5zIGFib3J0cyBcdTIwMTQgd2hpY2ggZnJvbVxuICAgICAgICAvLyAxNy4wLjAtcmMuMiBGQUlMUyBUSEUgUlVOIHJhdGhlciB0aGFuIHNraXBwaW5nIGl0LlxuICAgICAgICBjb25kaXRpb246IFBgIWhhcyhyZWNvcmQuYXBwcm92YWxfc3RhdHVzKSB8fCBpc0JsYW5rKHJlY29yZC5hcHByb3ZhbF9zdGF0dXMpYCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2dldF9hY2NvdW50JyxcbiAgICAgIHR5cGU6ICdnZXRfcmVjb3JkJyxcbiAgICAgIGxhYmVsOiAnR2V0IEFjY291bnQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fYWNjb3VudCcsXG4gICAgICAgIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZC5pZGAgfSxcbiAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdhY2NvdW50UmVjb3JkJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2FjY291bnRfcmV2aWV3JyxcbiAgICAgIHR5cGU6ICdhcHByb3ZhbCcsXG4gICAgICBsYWJlbDogJ0FjY291bnQgUmV2aWV3JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBUaGUgY3VzdG9tZXIncyBjaGFpbiBpcyBcdTk1MDBcdTU1MkVcdThEMUZcdThEMjNcdTRFQkEgXHUyMTkyIFx1OTUwMFx1NTUyRVx1NjAzQlx1NzZEMTsgUkVRLTAwMDMgcnVsZXMgdGhhdCBuYW1lZFxuICAgICAgICAvLyBjaGFpbiAqKkMqKiAob3ZlcmxheSBcdTIwMTQgb25lIGNvbXBhbnkncyBvcmcgY2hhcnQpLCBzbyBjb3JlIHNoaXBzIHRoZVxuICAgICAgICAvLyBvbmUgZ2VuZXJpYyB0aWVyIGFnYWluc3QgdGhlIG1hbmFnZXIgYmVuY2ggdGhpcyBhcHAgYWxyZWFkeSBkZWNsYXJlcy5cbiAgICAgICAgYXBwcm92ZXJzOiBbeyB0eXBlOiAncG9zaXRpb24nLCB2YWx1ZTogJ3NhbGVzX21hbmFnZXInIH1dLFxuICAgICAgICAvLyBFeHBsaWNpdCB0aG91Z2ggaXQgaXMgdGhlIHNjaGVtYSBkZWZhdWx0LCBleGFjdGx5IGFzIGJvdGggc2libGluZ1xuICAgICAgICAvLyBmbG93cyBhdXRob3IgaXQ6IGFwcHJvdmVycyBzbmFwc2hvdCBhdCByZXF1ZXN0IGNyZWF0aW9uLCBzbyBhbiBlbXB0eVxuICAgICAgICAvLyBiZW5jaCB3b3VsZCBvdGhlcndpc2UgbGVhdmUgdGhlIHJlcXVlc3QgdW5kZWNpZGFibGUgXHUyMDE0IGFuZCBoZXJlIHRoYXRcbiAgICAgICAgLy8gbWVhbnMgYW4gYWNjb3VudCBub2JvZHkgY2FuIGV2ZXIgYXBwcm92ZS5cbiAgICAgICAgb25FbXB0eUFwcHJvdmVyczogJ2FkbWluX3Jlc2N1ZScsXG4gICAgICAgIGJlaGF2aW9yOiAnZmlyc3RfcmVzcG9uc2UnLFxuICAgICAgICAvLyBcdTI2QTBcdUZFMEYgYGZhbHNlYCwgbWF0Y2hpbmcgdGhlIGxlYWQgc2libGluZyByYXRoZXIgdGhhbiB0aGUgb3Bwb3J0dW5pdHkgb25lLlxuICAgICAgICAvLyBBbiBhY2NvdW50IHVuZGVyIHJldmlldyBpcyBhIHJlY29yZCBhIHJlcCBpcyBzdGlsbCB3b3JraW5nIFx1MjAxNCBjb250YWN0c1xuICAgICAgICAvLyBhcmUgYmVpbmcgYXR0YWNoZWQsIHRoZSBhZGRyZXNzIGlzIGJlaW5nIGNvcnJlY3RlZCwgYWN0aXZpdHkgaXNcbiAgICAgICAgLy8gbGFuZGluZyBvbiBpdC4gTG9ja2luZyBpdCB3b3VsZCBmcmVlemUgZXhhY3RseSB0aGUgZGF0YS1lbnRyeSB0aGVcbiAgICAgICAgLy8gYXBwcm92YWwgZXhpc3RzIHRvIHJldmlldy4gTm90aGluZyBpcyBhdCByaXNrOiB0aGUgdmVyZGljdCBjb2x1bW4gaXNcbiAgICAgICAgLy8gYHJlYWRvbmx5OiB0cnVlYCwgc28gdGhlIG9ubHkgZmllbGQgdGhpcyBkZWNpc2lvbiB0b3VjaGVzIGlzIG9uZSBub1xuICAgICAgICAvLyB1c2VyIG1heSB3cml0ZSBhbnl3YXkuXG4gICAgICAgIGxvY2tSZWNvcmQ6IGZhbHNlLFxuICAgICAgICBhcHByb3ZhbFN0YXR1c0ZpZWxkOiAnYXBwcm92YWxfc3RhdHVzJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ21hcmtfYXBwcm92ZWQnLFxuICAgICAgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLFxuICAgICAgbGFiZWw6ICdNYXJrIEFwcHJvdmVkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2FjY291bnQnLFxuICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ25vdGlmeV9hcHByb3ZlZCcsXG4gICAgICB0eXBlOiAnbm90aWZ5JyxcbiAgICAgIGxhYmVsOiAnTm90aWZ5IE93bmVyIFx1MjAxNCBBcHByb3ZlZCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgcmVjaXBpZW50czogW2NlbGBoYXMoYWNjb3VudFJlY29yZC5vd25lcl9pZCkgPyBhY2NvdW50UmVjb3JkLm93bmVyX2lkIDogbnVsbGBdLFxuICAgICAgICBjaGFubmVsczogWydpbmJveCddLFxuICAgICAgICB0b3BpYzogJ2FjY291bnRfYXBwcm92ZWQnLFxuICAgICAgICB0ZW1wbGF0ZTogJ2NybS5hY2NvdW50X2FwcHJvdmVkJyxcbiAgICAgICAgdGVtcGxhdGVEYXRhOiB7IG5hbWU6IGNlbGBhY2NvdW50UmVjb3JkLm5hbWVgIH0sXG4gICAgICAgIGFjdGlvblVybDogJy9jcm1fYWNjb3VudC97e3JlY29yZC5pZH19JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ21hcmtfcmVqZWN0ZWQnLFxuICAgICAgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLFxuICAgICAgbGFiZWw6ICdNYXJrIFJlamVjdGVkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2FjY291bnQnLFxuICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBhcHByb3ZhbF9zdGF0dXM6ICdyZWplY3RlZCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ25vdGlmeV9yZWplY3RlZCcsXG4gICAgICB0eXBlOiAnbm90aWZ5JyxcbiAgICAgIGxhYmVsOiAnTm90aWZ5IE93bmVyIFx1MjAxNCBSZWplY3RlZCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgcmVjaXBpZW50czogW2NlbGBoYXMoYWNjb3VudFJlY29yZC5vd25lcl9pZCkgPyBhY2NvdW50UmVjb3JkLm93bmVyX2lkIDogbnVsbGBdLFxuICAgICAgICBjaGFubmVsczogWydpbmJveCddLFxuICAgICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgICB0b3BpYzogJ2FjY291bnRfcmVqZWN0ZWQnLFxuICAgICAgICB0ZW1wbGF0ZTogJ2NybS5hY2NvdW50X3JlamVjdGVkJyxcbiAgICAgICAgdGVtcGxhdGVEYXRhOiB7IG5hbWU6IGNlbGBhY2NvdW50UmVjb3JkLm5hbWVgIH0sXG4gICAgICAgIGFjdGlvblVybDogJy9jcm1fYWNjb3VudC97e3JlY29yZC5pZH19JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdnZXRfYWNjb3VudCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ2dldF9hY2NvdW50JywgdGFyZ2V0OiAnYWNjb3VudF9yZXZpZXcnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAvLyBBcHByb3ZhbC1ub2RlIGJyYW5jaCBsYWJlbHMgXHUyMDE0IHRoZSBlbmdpbmUgcmVzdW1lcyBkb3duIHRoZSBvdXQtZWRnZSB3aG9zZVxuICAgIC8vIGBsYWJlbGAgbWF0Y2hlcyB0aGUgcmVjb3JkZWQgZGVjaXNpb24uXG4gICAgeyBpZDogJ2UzJywgc291cmNlOiAnYWNjb3VudF9yZXZpZXcnLCB0YXJnZXQ6ICdtYXJrX2FwcHJvdmVkJywgdHlwZTogJ2RlZmF1bHQnLCBsYWJlbDogJ2FwcHJvdmUnIH0sXG4gICAgeyBpZDogJ2U0Jywgc291cmNlOiAnYWNjb3VudF9yZXZpZXcnLCB0YXJnZXQ6ICdtYXJrX3JlamVjdGVkJywgdHlwZTogJ2RlZmF1bHQnLCBsYWJlbDogJ3JlamVjdCcgfSxcbiAgICB7IGlkOiAnZTUnLCBzb3VyY2U6ICdtYXJrX2FwcHJvdmVkJywgdGFyZ2V0OiAnbm90aWZ5X2FwcHJvdmVkJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U2Jywgc291cmNlOiAnbm90aWZ5X2FwcHJvdmVkJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U3Jywgc291cmNlOiAnbWFya19yZWplY3RlZCcsIHRhcmdldDogJ25vdGlmeV9yZWplY3RlZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlOCcsIHNvdXJjZTogJ25vdGlmeV9yZWplY3RlZCcsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL3NjaGVkdWxlLWZvbGxvd3VwLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3Mvc2NoZWR1bGUtZm9sbG93dXAuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xuaW1wb3J0IHsgVEFTS19UWVBFX09QVElPTlMsIHBsYWluT3B0aW9ucyB9IGZyb20gJy4uL29iamVjdHMvX3BpY2tsaXN0cyc7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogU2NoZWR1bGUgRm9sbG93LXVwIFx1MjAxNCBvbmUgc2NyZWVuLCBvbmUgdGFzaywgc3RyYWlnaHQgb2ZmIHRoZSBsZWFkIGhlYWRlci5cbiAqXG4gKiBgbG9nX2NhbGxgIC8gYGxvZ19tZWV0aW5nYCByZWNvcmQgd2hhdCBhbHJlYWR5IGhhcHBlbmVkOyB0aGlzIGZsb3cgcHV0cyB0aGVcbiAqIE5FWFQgdG91Y2ggb24gdGhlIHJlcCdzIGxpc3Qgd2l0aG91dCBsZWF2aW5nIHRoZSBsZWFkIFx1MjAxNCB0aGUgc2luZ2xlIG1vc3RcbiAqIGNvbW1vbiB0aGluZyBhIHJlcCBkb2VzIGFmdGVyIGEgY2FsbC5cbiAqXG4gKiBcdTI2RDQgSW1wbGVtZW50ZWQgYXMgYSBTQ1JFRU4gRkxPVywgbmV2ZXIgYSBgdHlwZTogJ21vZGFsJ2AgYWN0aW9uOiBtb2RhbCBhY3Rpb25zXG4gKiBhcmUgbm9uLWZ1bmN0aW9uYWwgaW4gMTYuMS4wIFx1MjAxNCB0aGUgY29uc29sZSByZXNvbHZlcyB0aGUgYWN0aW9uJ3MgYHRhcmdldGAgYXNcbiAqIGFuIG9iamVjdCBuYW1lIGFuZCB0aGUgc3VibWl0IGRpZXMgb24gYEdFVCAvYXBpL3YxL21ldGEvb2JqZWN0Lzx0YXJnZXQ+YCBcdTIxOTJcbiAqIDQwMCwgZXZlbiB0aG91Z2ggdGhlIHNwZWMgZGVmaW5lcyBgdGFyZ2V0YCBmb3IgbW9kYWxzIGFzIFwidGhlIG1vZGFsL3BhZ2UgbmFtZVxuICogdG8gb3BlblwiLiBGbG93LXR5cGVkIGFjdGlvbnMgYXJlIHRoZSBtZWNoYW5pc20gdGhhdCBkZW1vbnN0cmFibHkgd29ya3MgdG9kYXk7XG4gKiBgY29udmVydF9sZWFkYCB1c2VzIGl0LlxuICovXG5leHBvcnQgY29uc3QgU2NoZWR1bGVGb2xsb3dVcEZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICdzY2hlZHVsZV9mb2xsb3d1cCcsXG4gIGxhYmVsOiAnU2NoZWR1bGUgRm9sbG93LXVwJyxcbiAgZGVzY3JpcHRpb246ICdDcmVhdGUgdGhlIG5leHQgZm9sbG93LXVwIHRhc2sgb24gYSBsZWFkLCBhbHJlYWR5IGxpbmtlZCBhbmQgb3duZWQuJyxcbiAgdHlwZTogJ3NjcmVlbicsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG5cbiAgdmFyaWFibGVzOiBbXG4gICAgLy8gTVVTVCBiZSBgcmVjb3JkSWRgIFx1MjAxNCB0aGUgY29uc29sZSdzIGZsb3ctYWN0aW9uIGNvbnRyYWN0IHNlZWRzIG9ubHkgdGhhdFxuICAgIC8vIG5hbWUgKGFuZCBpdHMgY2FtZWxDYXNlIG9iamVjdCBhbGlhcyk7IGEgY3VzdG9tIG5hbWUgYXJyaXZlcyB1bmRlZmluZWQuXG4gICAgeyBuYW1lOiAncmVjb3JkSWQnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICAgIHsgbmFtZTogJ3N1YmplY3QnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICAgIHsgbmFtZTogJ2R1ZURhdGUnLCB0eXBlOiAnZGF0ZScsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICAgIHsgbmFtZTogJ2FjdGl2aXR5VHlwZScsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAncHJpb3JpdHknLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICAgIHsgbmFtZTogJ25vdGVzJywgdHlwZTogJ3RleHQnLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgXSxcblxuICBub2RlczogW1xuICAgIHsgaWQ6ICdzdGFydCcsIHR5cGU6ICdzdGFydCcsIGxhYmVsOiAnU3RhcnQnLCBjb25maWc6IHsgb2JqZWN0TmFtZTogJ2NybV9sZWFkJyB9IH0sXG4gICAge1xuICAgICAgaWQ6ICdzY3JlZW5fMScsIHR5cGU6ICdzY3JlZW4nLCBsYWJlbDogJ1NjaGVkdWxlIEZvbGxvdy11cCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiAnc3ViamVjdCcsIGxhYmVsOiAnV2hhdCBpcyB0aGUgbmV4dCBzdGVwPycsIHR5cGU6ICd0ZXh0JywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICB7IG5hbWU6ICdkdWVEYXRlJywgbGFiZWw6ICdEdWUgRGF0ZScsIHR5cGU6ICdkYXRlJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnYWN0aXZpdHlUeXBlJywgbGFiZWw6ICdBY3Rpdml0eSBUeXBlJywgdHlwZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICAvLyBNaXJyb3JzIGNybV90YXNrLnR5cGUgZXhhY3RseS4gXHUyNkQ0IE5ldmVyIGhhbmQtY29weSB0aGUgc3Vic2V0IFx1MjAxNCBpdFxuICAgICAgICAgICAgLy8gc2lsZW50bHkgZHJvcHMgYW4gb3B0aW9uIChgb3RoZXJgKSBmcm9tIHRoZSBwaWNrZXIuXG4gICAgICAgICAgICBvcHRpb25zOiBwbGFpbk9wdGlvbnMoVEFTS19UWVBFX09QVElPTlMpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ3ByaW9yaXR5JywgbGFiZWw6ICdQcmlvcml0eScsIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnTG93JywgdmFsdWU6ICdsb3cnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdOb3JtYWwnLCB2YWx1ZTogJ25vcm1hbCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0hpZ2gnLCB2YWx1ZTogJ2hpZ2gnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdVcmdlbnQnLCB2YWx1ZTogJ3VyZ2VudCcgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IG5hbWU6ICdub3RlcycsIGxhYmVsOiAnTm90ZXMnLCB0eXBlOiAndGV4dGFyZWEnIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdnZXRfbGVhZCcsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdHZXQgTGVhZCBSZWNvcmQnLFxuICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fbGVhZCcsIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZElkYCB9LCBvdXRwdXRWYXJpYWJsZTogJ2xlYWRSZWNvcmQnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2NyZWF0ZV90YXNrJywgdHlwZTogJ2NyZWF0ZV9yZWNvcmQnLCBsYWJlbDogJ0NyZWF0ZSBGb2xsb3ctdXAgVGFzaycsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV90YXNrJyxcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgc3ViamVjdDogY2VsYHN1YmplY3RgLFxuICAgICAgICAgIGR1ZV9kYXRlOiBjZWxgZHVlRGF0ZWAsXG4gICAgICAgICAgLy8gVGhlIHRocmVlIG9wdGlvbmFsIGFuc3dlcnM6IGEgcmVzdW1lIG1heSBsZWF2ZSBvbmUgdW5ib3VuZCwgd2hpY2hcbiAgICAgICAgICAvLyB0aGUgdGVtcGxhdGUgd3JvdGUgYXMgbm90aGluZyBhbmQgdGhlIGd1YXJkIHdyaXRlcyBhcyBudWxsLiBPbiBhblxuICAgICAgICAgIC8vIGluc2VydCB0aGUgdHdvIGFyZSB0aGUgc2FtZSBcdTIwMTQgdGhlIGVuZ2luZSBhcHBsaWVzIGEgZmllbGQncyBkZWZhdWx0XG4gICAgICAgICAgLy8gdG8gYW4gZXhwbGljaXQgbnVsbCBleGFjdGx5IGFzIHRvIGFuIG9taXR0ZWQga2V5LCBzbyBhbiB1bmFuc3dlcmVkXG4gICAgICAgICAgLy8gcHJpb3JpdHkgc3RpbGwgbGFuZHMgYXMgYG5vcm1hbGAuXG4gICAgICAgICAgdHlwZTogY2VsYGhhcyh2YXJzLmFjdGl2aXR5VHlwZSkgPyBhY3Rpdml0eVR5cGUgOiBudWxsYCxcbiAgICAgICAgICBwcmlvcml0eTogY2VsYGhhcyh2YXJzLnByaW9yaXR5KSA/IHByaW9yaXR5IDogbnVsbGAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGNlbGBoYXModmFycy5ub3RlcykgPyBub3RlcyA6IG51bGxgLFxuICAgICAgICAgIHN0YXR1czogJ25vdF9zdGFydGVkJyxcbiAgICAgICAgICBvd25lcl9pZDogY2VsYGN1cnJlbnRfdXNlci5pZGAsXG4gICAgICAgICAgLy8gUG9seW1vcnBoaWMgcGFyZW50OiBib3RoIGhhbHZlcyBhcmUgcmVxdWlyZWQgZm9yIHRoZSBsZWFkJ3NcbiAgICAgICAgICAvLyBSZWxhdGVkIHRhYiB0byBwaWNrIHRoZSB0YXNrIHVwLlxuICAgICAgICAgIHJlbGF0ZWRfdG9fdHlwZTogJ2NybV9sZWFkJyxcbiAgICAgICAgICByZWxhdGVkX3RvX2xlYWQ6IGNlbGByZWNvcmRJZGAsXG4gICAgICAgIH0sXG4gICAgICAgIG91dHB1dFZhcmlhYmxlOiAnY3JlYXRlZFRhc2snLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEtlZXAgdGhlIGxlYWQncyBvd24gZm9sbG93LXVwIGRhdGUgaW4gc3RlcCB3aXRoIHRoZSB0YXNrIHRoYXQgd2FzIGp1c3RcbiAgICAgIC8vIGZpbGVkLCBzbyB0aGUgSG90IExlYWRzIHZpZXcgKHNvcnRlZCBieSBuZXh0X2ZvbGxvd3VwX2RhdGUpIHJlZmxlY3RzXG4gICAgICAvLyB0aGUgY29tbWl0bWVudCB0aGUgcmVwIGFjdHVhbGx5IG1hZGUuXG4gICAgICBpZDogJ3N0YW1wX2xlYWQnLCB0eXBlOiAndXBkYXRlX3JlY29yZCcsIGxhYmVsOiAnU3RhbXAgTmV4dCBGb2xsb3ctdXAgRGF0ZScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9sZWFkJyxcbiAgICAgICAgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkSWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBuZXh0X2ZvbGxvd3VwX2RhdGU6IGNlbGBkdWVEYXRlYCB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG5cbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ3NjcmVlbl8xJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAnc2NyZWVuXzEnLCB0YXJnZXQ6ICdnZXRfbGVhZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMycsIHNvdXJjZTogJ2dldF9sZWFkJywgdGFyZ2V0OiAnY3JlYXRlX3Rhc2snLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTQnLCBzb3VyY2U6ICdjcmVhdGVfdGFzaycsIHRhcmdldDogJ3N0YW1wX2xlYWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTUnLCBzb3VyY2U6ICdzdGFtcF9sZWFkJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3Mvb3Bwb3J0dW5pdHktYXBwcm92YWwuZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9vcHBvcnR1bml0eS1hcHByb3ZhbC5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG5pbXBvcnQgeyBISUdIX1ZBTFVFX0RFQUxfQU1PVU5ULCBMQVJHRV9ERUFMX0FNT1VOVCB9IGZyb20gJy4uL29iamVjdHMvX3RocmVzaG9sZHMnO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIE9wcG9ydHVuaXR5IEFwcHJvdmFsIFx1MjAxNCB0aWVyZWQgc2lnbi1vZmYgZm9yIGxhcmdlIGRlYWxzLlxuICpcbiAqIEV4cHJlc3NlZCBhcyAqKkFwcHJvdmFsIG5vZGVzKiogKGB0eXBlOiAnYXBwcm92YWwnYCwgQURSLTAwMTkpOiB0aGUgZW5naW5lXG4gKiBvcGVucyBhbiBhcHByb3ZhbCByZXF1ZXN0IG9uIGVudHJ5LCBzdXNwZW5kcyB0aGUgcnVuLCBhbmQgcmVzdW1lcyBkb3duIHRoZVxuICogb3V0LWVkZ2Ugd2hvc2UgYGxhYmVsYCBtYXRjaGVzIHRoZSBkZWNpc2lvbiAoYGFwcHJvdmVgIC8gYHJlamVjdGApLlxuICogTm90aWZpY2F0aW9ucyB1c2UgdGhlICoqYG5vdGlmeWAgbm9kZSoqIChBRFItMDAxMikuIFx1MjZENCBOZWl0aGVyIGFcbiAqIGBjb25uZWN0b3JfYWN0aW9uYCBub3IgYSBzdGFuZGFsb25lIGBBcHByb3ZhbFByb2Nlc3NgIGlzIGF2YWlsYWJsZSBcdTIwMTQgYm90aFxuICogYXV0aG9yaW5nIHN1cmZhY2VzIHdlcmUgcmVtb3ZlZCBpbiBPYmplY3RTdGFjayA3LjQuXG4gKlxuICogVGllcmVkIHBvbGljeSAoc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBcdTIwMTQgbm8gZG91YmxlLWZpcmluZyk6XG4gKiAgIC0gYW1vdW50ID49ICQxMDBLICAgICAgICAgXHUyMTkyIFNhbGVzIE1hbmFnZXIgcmV2aWV3XG4gKiAgIC0gYW1vdW50ID4gJDUwMEsgICAgICAgICAgXHUyMTkyIGFkZGl0aW9uYWxseSBTYWxlcyBEaXJlY3RvciBzaWduLW9mZlxuICpcbiAqIFRoZSBlbnRyeSBnYXRlIGlzIElOQ0xVU0lWRSBhdCB0aGUgbGluZSAoYD49YCkgYW5kIHRoZSBkaXJlY3RvciB0aWVyIGlzXG4gKiBleGNsdXNpdmUgKGA+YCk6IHRob3NlIGFyZSBub3QgdGhlIHNhbWUga2luZCBvZiBudW1iZXIuIGBMQVJHRV9ERUFMX0FNT1VOVGAgaXNcbiAqIHRoZSBvbmUgbGluZSB0aGlzIGFwcCBkcmF3cyBhcm91bmQgXCJsYXJnZSBkZWFsXCIsIGFuZCBldmVyeSBjb25zdW1lciBvZiBpdCBcdTIwMTRcbiAqIHRoaXMgZ2F0ZSwgaXRzIGluc2VydCB0d2luLCB0aGUgd29uLWRlYWwgYWxlcnQgYW5kIGJvdGggc2hhcmluZyBydWxlcyBcdTIwMTQgbXVzdFxuICogY3V0IHRoZSBzYW1lIHdheSwgc28gYSBkZWFsIGF0IGV4YWN0bHkgJDEwMCwwMDAgaXMgbGFyZ2UgZXZlcnl3aGVyZSBvclxuICogbm93aGVyZS4gYEhJR0hfVkFMVUVfREVBTF9BTU9VTlRgIGJlbG93IGlzIGEgbWF0Y2hlZCBQQUlSIChgPiA1MDAwMDBgIC9cbiAqIGA8PSA1MDAwMDBgKSB3aG9zZSB0d28gaGFsdmVzIG11c3QgcGFydGl0aW9uLCB3aGljaCBpcyBhIGRpZmZlcmVudCBwcm9wZXJ0eVxuICogYW5kIGlzIGxlZnQgYWxvbmUuXG4gKlxuICogT24gZnVsbCBhcHByb3ZhbCB0aGUgZGVhbCBpcyBzdGFtcGVkIGBhcHByb3ZhbF9zdGF0dXMgPSBhcHByb3ZlZGAgKCsgZGF0ZSk7XG4gKiBhbnkgcmVqZWN0aW9uIHN0YW1wcyBgYXBwcm92YWxfc3RhdHVzID0gcmVqZWN0ZWRgLiBUaGUgcmVjb3JkIGlzIGxvY2tlZCB3aGlsZVxuICogYSBzdGVwIGlzIHBlbmRpbmcgYW5kIGBhcHByb3ZhbF9zdGF0dXNgIG1pcnJvcnMgdGhlIGxpdmUgcmVxdWVzdCBzdGF0dXMuXG4gKi9cbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eUFwcHJvdmFsRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X2FwcHJvdmFsJyxcbiAgbGFiZWw6ICdMYXJnZSBEZWFsIEFwcHJvdmFsJyxcbiAgZGVzY3JpcHRpb246ICdUaWVyZWQgYXBwcm92YWwgZm9yIG9wcG9ydHVuaXRpZXM6IG1hbmFnZXIgcmV2aWV3IGF0ICQxMDBLIG9yIG1vcmUsIGRpcmVjdG9yIHNpZ24tb2ZmID4gJDUwMEsuJyxcbiAgdHlwZTogJ3JlY29yZF9jaGFuZ2UnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBTYW1lIHVzZXItbGVzcyBleHBvc3VyZSBhcyBldmVyeSByZWNvcmQtY2hhbmdlIGZsb3cgKEFEUi0wMDQ5KSBcdTIwMTQgYW5kIHRoZVxuICAvLyBvbmUgd2l0aCB0ZWV0aC4gTWVhc3VyZWQgb24gMTcuMC4wLXJjLjI6IGEgJDE1MEsgcmVuZXdhbFxuICAvLyBjcmVhdGVkIGJ5IHRoZSBgcnVuQXM6ICdzeXN0ZW0nYCBjb250cmFjdF9yZW5ld2FsIHN3ZWVwIGZpcmVkIHRoaXMgZmxvd1xuICAvLyB3aXRoIG5vIHRyaWdnZXIgdXNlciwgYW5kIHRoZSBydW4gZGllZCBhdCBgZ2V0X29wcG9ydHVuaXR5YC4gVGhlIGRlYWwgc2F0XG4gIC8vIGF0IGBhcHByb3ZhbF9zdGF0dXM6ICdub3RfcmVxdWlyZWQnYCwgdW5sb2NrZWQsIHdpdGggbm8gYXBwcm92YWwgcmVxdWVzdFxuICAvLyBldmVyIG9wZW5lZCBcdTIwMTQgdGhlIGdhdGUgd2FzIGJ5cGFzc2VkIGJ5IHRoZSB3cml0ZXIgc2ltcGx5IG5vdCBjYXJyeWluZyBhXG4gIC8vIHNlc3Npb24uIEFuIGFwcHJvdmFsIGNvbnRyb2wgdGhhdCBvbmx5IGVuZ2FnZXMgZm9yIGxvZ2dlZC1pbiB3cml0ZXJzIGlzXG4gIC8vIG5vdCBhIGNvbnRyb2wuXG4gIC8vXG4gIC8vIEVsZXZhdGluZyB0aGUgVVNFUi1kcml2ZW4gcnVucyB0b28gaXMgbm90IG1lcmVseSBhY2NlcHRhYmxlIGhlcmUsIGl0IGlzXG4gIC8vIHJlcXVpcmVkLiBUaGlzIGdhdGUgZXhpc3RzIHRvIENPTlNUUkFJTiB0aGUgc3VibWl0dGVyLCBzbyB0aGUgc3VibWl0dGVyJ3NcbiAgLy8gb3duIHNjb3BlIGlzIHRoZSB3cm9uZyBpZGVudGl0eSB0byBldmFsdWF0ZSBpdCB1bmRlcjsgYW5kXG4gIC8vIGBtYXJrX2FwcHJvdmVkYCAvIGBtYXJrX3JlamVjdGVkYCBzdGFtcCBgYXBwcm92YWxfc3RhdHVzYCBvbiBhIHJlY29yZCB0aGVcbiAgLy8gYXBwcm92YWwgbm9kZSBob2xkcyBsb2NrZWQgKGBsb2NrUmVjb3JkOiB0cnVlYCksIHdoaWNoIG9ubHkgYSBwbGF0Zm9ybVxuICAvLyB3cml0ZSBtYXkgbGFuZC4gVGhlIGFwcHJvdmFsIG5vZGUgaXRzZWxmIGFscmVhZHkgb3BlbnMgaXRzIHJlcXVlc3QgdW5kZXJcbiAgLy8gdGhlIHBsYXRmb3JtIGlkZW50aXR5IHdoaWxlIHJlLWF0dGFjaGluZyB0aGUgZGVjaWRpbmcgdXNlciBmb3JcbiAgLy8gYXR0cmlidXRpb24sIHNvIHRoaXMgZGVjbGFyYXRpb24gYWxpZ25zIHRoZSBmbG93IHdpdGggdGhlIG5vZGUgaXQgZHJpdmVzLlxuICBydW5BczogJ3N5c3RlbScsXG5cbiAgdmFyaWFibGVzOiBbXG4gICAgeyBuYW1lOiAnb3Bwb3J0dW5pdHlJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gIF0sXG5cbiAgbm9kZXM6IFtcbiAgICB7XG4gICAgICBpZDogJ3N0YXJ0JyxcbiAgICAgIHR5cGU6ICdzdGFydCcsXG4gICAgICBsYWJlbDogJ1N0YXJ0JyxcbiAgICAgIC8vIFRyaWdnZXIgd2lyaW5nICg3LjQpOiBiaW5kIHRvIGFmdGVyVXBkYXRlOyBnYXRlIG9uIGNyb3NzaW5nIHRoZSBlbnRyeVxuICAgICAgLy8gdGhyZXNob2xkIHdoaWxlIG5vdCBhbHJlYWR5IGluIGFuIGFwcHJvdmFsIHN0YXRlLiBUaGUgYG5vdF9yZXF1aXJlZGBcbiAgICAgIC8vIGd1YXJkIHN0b3BzIHRoZSBmbG93J3Mgb3duIGFwcHJvdmFsX3N0YXR1cyB3cml0ZXMgZnJvbSByZS10cmlnZ2VyaW5nIGl0LlxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgICB0cmlnZ2VyVHlwZTogJ3JlY29yZC1hZnRlci11cGRhdGUnLFxuICAgICAgICAvLyBOdWxsLXRvbGVyYW50OiByb3dzIGluc2VydGVkIGJlZm9yZSBhcHByb3ZhbF9zdGF0dXMgaGFkIGEgZmllbGQtbGV2ZWxcbiAgICAgICAgLy8gZGVmYXVsdFZhbHVlIChlLmcuIGZsb3ctY3JlYXRlZCBvcHBvcnR1bml0aWVzKSBjYXJyeSBudWxsLCB3aGljaCBtdXN0XG4gICAgICAgIC8vIHN0aWxsIGVudGVyIGFwcHJvdmFsLlxuICAgICAgICAvLyBTdGFnZSBndWFyZDogYSBzZXR0bGVkIGRlYWwgbXVzdCBuZXZlciAocmUtKWVudGVyIGFwcHJvdmFsIFx1MjAxNCB0aGVcbiAgICAgICAgLy8gZnJlZXplIGhvb2sgcmVqZWN0cyBhcHByb3ZhbC1zdGF0dXMgd3JpdGVzIG9uIGNsb3NlZCByZWNvcmRzLCBzb1xuICAgICAgICAvLyB3aXRob3V0IHRoaXMgZ3VhcmQgdGhlIGZsb3cgb3BlbmVkIGEgbG9ja2VkIGFwcHJvdmFsIHJlcXVlc3QgaXRcbiAgICAgICAgLy8gY291bGQgbmV2ZXIgcmVzb2x2ZSAobG9ja1JlY29yZCBoZWxkIHRoZSBjbG9zZWQgcmVjb3JkIGhvc3RhZ2UpLlxuICAgICAgICAvLyBUT1RBTElUWTogYGhhcyguLi4pYCBvbiBldmVyeSByZWFkLCBwbHVzIGAhPSBudWxsYCBvbiB0aGVcbiAgICAgICAgLy8gb3JkZXJpbmcgY29tcGFyaXNvbiBcdTIwMTQgYGhhcygpYCBwYXNzZXMgYW4gZXhwbGljaXQgbnVsbCBhbmRcbiAgICAgICAgLy8gYHJlY29yZC5hbW91bnQgPj0gMTAwMDAwYCB0aGVuIGFib3J0cyB3aXRoXG4gICAgICAgIC8vIGBubyBzdWNoIG92ZXJsb2FkOiBkeW48bnVsbD4gPj0gaW50YC4gTWVhc3VyZWQgdG90YWwgYXMgYXV0aG9yZWRcbiAgICAgICAgLy8gdG9kYXkgKGFtb3VudC9zdGFnZSBhcmUgcmVxdWlyZWQsIGFwcHJvdmFsX3N0YXR1cyBpcyBkZWZhdWx0ZWQpLCBidXRcbiAgICAgICAgLy8gdGhhdCBpcyBgY3JtX29wcG9ydHVuaXR5YCdzIHNjaGVtYSBkb2luZyB0aGUgd29yaywgbm90IHRoZVxuICAgICAgICAvLyBwcmVkaWNhdGUuIEFuIGFic2VudCBgYXBwcm92YWxfc3RhdHVzYCByZWFkcyB0aGUgc2FtZSBhcyB0aGUgbnVsbFxuICAgICAgICAvLyB0aGlzIGNvbmRpdGlvbiBhbHJlYWR5IHRvbGVyYXRlczsgYW4gYWJzZW50IGBzdGFnZWAgaXMgbm90IGEgc2V0dGxlZFxuICAgICAgICAvLyBzdGFnZSwgc28gaXQgbXVzdCBub3QgYmxvY2sgYXBwcm92YWwuXG4gICAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmFtb3VudCkgJiYgcmVjb3JkLmFtb3VudCAhPSBudWxsICYmIHJlY29yZC5hbW91bnQgPj0gJHtMQVJHRV9ERUFMX0FNT1VOVH1cbiAgICAgICAgICAmJiAoIWhhcyhyZWNvcmQuYXBwcm92YWxfc3RhdHVzKSB8fCByZWNvcmQuYXBwcm92YWxfc3RhdHVzID09IFwibm90X3JlcXVpcmVkXCIgfHwgcmVjb3JkLmFwcHJvdmFsX3N0YXR1cyA9PSBudWxsKVxuICAgICAgICAgICYmICghaGFzKHJlY29yZC5zdGFnZSkgfHwgKHJlY29yZC5zdGFnZSAhPSBcImNsb3NlZF93b25cIiAmJiByZWNvcmQuc3RhZ2UgIT0gXCJjbG9zZWRfbG9zdFwiKSlgLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnZ2V0X29wcG9ydHVuaXR5JyxcbiAgICAgIHR5cGU6ICdnZXRfcmVjb3JkJyxcbiAgICAgIGxhYmVsOiAnR2V0IE9wcG9ydHVuaXR5JyxcbiAgICAgIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JywgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkLmlkYCB9LCBvdXRwdXRWYXJpYWJsZTogJ29wcFJlY29yZCcgfSxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFRpZXIgMTogU2FsZXMgTWFuYWdlciByZXZpZXcgKGFsbCBkZWFscyBhdCAkMTAwSyBvciBtb3JlKSBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBpZDogJ21hbmFnZXJfcmV2aWV3JyxcbiAgICAgIHR5cGU6ICdhcHByb3ZhbCcsXG4gICAgICBsYWJlbDogJ1NhbGVzIE1hbmFnZXIgUmV2aWV3JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBcdTI2RDQgTmV2ZXIgYWRkIGFuIG9yZy1vd25lciBhcHByb3ZlciBhcyBhbiBlbXB0eS1iZW5jaCB3b3JrYXJvdW5kLlxuICAgICAgICAvLyBgb25FbXB0eUFwcHJvdmVyczogJ2FkbWluX3Jlc2N1ZSdgIGlzIHRoZSBub2RlIHBvbGljeSBmb3IgYW4gZW1wdHlcbiAgICAgICAgLy8gcG9zaXRpb24gb24gQG9iamVjdHN0YWNrIDE3IChhcHByb3ZlcnMgc25hcHNob3QgYXQgcmVxdWVzdCBjcmVhdGlvbixcbiAgICAgICAgLy8gc28gYSBwb3NpdGlvbiB3aXRoIG5vIGhvbGRlcnMgd291bGQgb3RoZXJ3aXNlIGxlYXZlIHRoZSByZXF1ZXN0XG4gICAgICAgIC8vIHVuZGVjaWRhYmxlIHdoaWxlIGBsb2NrUmVjb3JkYCBoZWxkIHRoZSByZWNvcmQgaG9zdGFnZSkuIEFuXG4gICAgICAgIC8vIGB7IHR5cGU6ICdvcmdfbWVtYmVyc2hpcF9sZXZlbCcsIHZhbHVlOiAnb3duZXInIH1gIGVudHJ5IG92ZXJzaG9vdHM6XG4gICAgICAgIC8vIHdpdGggYGJlaGF2aW9yOiAnZmlyc3RfcmVzcG9uc2UnYCBpdCBtYWtlcyBhbiBvcmcgb3duZXIgYSByb3V0aW5lXG4gICAgICAgIC8vIGFwcHJvdmVyIGZvciBldmVyeSBkZWFsLCBub3QgYSByZXNjdWUgd2hlbiB0aGUgYmVuY2ggaXMgZW1wdHkuXG4gICAgICAgIGFwcHJvdmVyczogW3sgdHlwZTogJ3Bvc2l0aW9uJywgdmFsdWU6ICdzYWxlc19tYW5hZ2VyJyB9XSxcbiAgICAgICAgLy8gRXhwbGljaXQgZXZlbiB0aG91Z2ggYGFkbWluX3Jlc2N1ZWAgaXMgdGhlIHNjaGVtYSBkZWZhdWx0IFx1MjAxNCB0aGlzIGlzXG4gICAgICAgIC8vIHRoZSBtZWNoYW5pc20gdGhlIG5vZGUgZGVwZW5kcyBvbiwgc28gaXQgaXMgYXV0aG9yZWQsIG5vdCBpbmhlcml0ZWQuXG4gICAgICAgIG9uRW1wdHlBcHByb3ZlcnM6ICdhZG1pbl9yZXNjdWUnLFxuICAgICAgICBiZWhhdmlvcjogJ2ZpcnN0X3Jlc3BvbnNlJyxcbiAgICAgICAgbG9ja1JlY29yZDogdHJ1ZSxcbiAgICAgICAgYXBwcm92YWxTdGF0dXNGaWVsZDogJ2FwcHJvdmFsX3N0YXR1cycsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgVGllciBnYXRlOiBkb2VzIHRoaXMgZGVhbCBhbHNvIG5lZWQgZGlyZWN0b3Igc2lnbi1vZmY/IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIC8vIE5vIGBjb25maWcuY29uZGl0aW9uYCBoZXJlOiB0aGUgYnJhbmNoIGlzIG9uIGVkZ2VzIGBlNWAgLyBgZTZgLCB3aGljaFxuICAgICAgLy8gaXMgd2hlcmUgdGhlIGVuZ2luZSBhY3R1YWxseSByZWFkcyBpdC4gQSBjb3B5IG9uIHRoZSBub2RlIHdvdWxkIGJlXG4gICAgICAvLyBpbmVydCBhbmQgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgbGl2ZSBvbmUgKDE3LjAuMC1yYy4yJ3NcbiAgICAgIC8vIGBmbG93LWluZXJ0LW5vZGUtY29uZGl0aW9uYCkuXG4gICAgICBpZDogJ2NoZWNrX2hpZ2hfdmFsdWUnLFxuICAgICAgdHlwZTogJ2RlY2lzaW9uJyxcbiAgICAgIGxhYmVsOiAnSGlnaCBWYWx1ZSAoPiAkNTAwSyk/JyxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFRpZXIgMjogU2FsZXMgRGlyZWN0b3Igc2lnbi1vZmYgKGRlYWxzID4gJDUwMEsgb25seSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgaWQ6ICdkaXJlY3Rvcl9zaWdub2ZmJyxcbiAgICAgIHR5cGU6ICdhcHByb3ZhbCcsXG4gICAgICBsYWJlbDogJ1NhbGVzIERpcmVjdG9yIFNpZ24tb2ZmJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBTYW1lIG5vZGUgcG9saWN5IGFzIG1hbmFnZXJfcmV2aWV3IFx1MjAxNCBzZWUgdGhlIG5vdGUgdGhlcmUuXG4gICAgICAgIGFwcHJvdmVyczogW3sgdHlwZTogJ3Bvc2l0aW9uJywgdmFsdWU6ICdzYWxlc19kaXJlY3RvcicgfV0sXG4gICAgICAgIG9uRW1wdHlBcHByb3ZlcnM6ICdhZG1pbl9yZXNjdWUnLFxuICAgICAgICBiZWhhdmlvcjogJ2ZpcnN0X3Jlc3BvbnNlJyxcbiAgICAgICAgbG9ja1JlY29yZDogdHJ1ZSxcbiAgICAgICAgYXBwcm92YWxTdGF0dXNGaWVsZDogJ2FwcHJvdmFsX3N0YXR1cycsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgRmluYWwgYXBwcm92ZTogc3RhbXAgc3RhdHVzICsgbm90aWZ5IG93bmVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGlkOiAnbWFya19hcHByb3ZlZCcsXG4gICAgICB0eXBlOiAndXBkYXRlX3JlY29yZCcsXG4gICAgICBsYWJlbDogJ01hcmsgQXBwcm92ZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcsIGFwcHJvdmVkX2RhdGU6IGNlbGBpc29EYXRldGltZShub3coKSlgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdub3RpZnlfYXBwcm92ZWQnLFxuICAgICAgdHlwZTogJ25vdGlmeScsXG4gICAgICBsYWJlbDogJ05vdGlmeSBPd25lciBcdTIwMTQgQXBwcm92ZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtjZWxgaGFzKG9wcFJlY29yZC5vd25lcl9pZCkgPyBvcHBSZWNvcmQub3duZXJfaWQgOiBudWxsYF0sXG4gICAgICAgIGNoYW5uZWxzOiBbJ2luYm94JywgJ2VtYWlsJ10sXG4gICAgICAgIHRvcGljOiAnb3Bwb3J0dW5pdHlfYXBwcm92ZWQnLFxuICAgICAgICB0ZW1wbGF0ZTogJ2NybS5vcHBvcnR1bml0eV9hcHByb3ZlZCcsXG4gICAgICAgIHRlbXBsYXRlRGF0YTogeyBuYW1lOiBjZWxgb3BwUmVjb3JkLm5hbWVgIH0sXG4gICAgICAgIGFjdGlvblVybDogJy9jcm1fb3Bwb3J0dW5pdHkve3tyZWNvcmQuaWR9fScsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgUmVqZWN0aW9uOiBzdGFtcCBzdGF0dXMgKyBub3RpZnkgb3duZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgaWQ6ICdtYXJrX3JlamVjdGVkJyxcbiAgICAgIHR5cGU6ICd1cGRhdGVfcmVjb3JkJyxcbiAgICAgIGxhYmVsOiAnTWFyayBSZWplY3RlZCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZC5pZGAgfSxcbiAgICAgICAgZmllbGRzOiB7IGFwcHJvdmFsX3N0YXR1czogJ3JlamVjdGVkJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnbm90aWZ5X3JlamVjdGVkJyxcbiAgICAgIHR5cGU6ICdub3RpZnknLFxuICAgICAgbGFiZWw6ICdOb3RpZnkgT3duZXIgXHUyMDE0IFJlamVjdGVkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICByZWNpcGllbnRzOiBbY2VsYGhhcyhvcHBSZWNvcmQub3duZXJfaWQpID8gb3BwUmVjb3JkLm93bmVyX2lkIDogbnVsbGBdLFxuICAgICAgICBjaGFubmVsczogWydpbmJveCcsICdlbWFpbCddLFxuICAgICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgICB0b3BpYzogJ29wcG9ydHVuaXR5X3JlamVjdGVkJyxcbiAgICAgICAgdGVtcGxhdGU6ICdjcm0ub3Bwb3J0dW5pdHlfcmVqZWN0ZWQnLFxuICAgICAgICB0ZW1wbGF0ZURhdGE6IHsgbmFtZTogY2VsYG9wcFJlY29yZC5uYW1lYCB9LFxuICAgICAgICBhY3Rpb25Vcmw6ICcvY3JtX29wcG9ydHVuaXR5L3t7cmVjb3JkLmlkfX0nLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIHsgaWQ6ICdlMScsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAnZ2V0X29wcG9ydHVuaXR5JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAnZ2V0X29wcG9ydHVuaXR5JywgdGFyZ2V0OiAnbWFuYWdlcl9yZXZpZXcnLCB0eXBlOiAnZGVmYXVsdCcgfSxcblxuICAgIC8vIE1hbmFnZXIgZGVjaXNpb24gKGFwcHJvdmFsLW5vZGUgYnJhbmNoIGxhYmVscylcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdtYW5hZ2VyX3JldmlldycsIHRhcmdldDogJ2NoZWNrX2hpZ2hfdmFsdWUnLCB0eXBlOiAnZGVmYXVsdCcsIGxhYmVsOiAnYXBwcm92ZScgfSxcbiAgICB7IGlkOiAnZTQnLCBzb3VyY2U6ICdtYW5hZ2VyX3JldmlldycsIHRhcmdldDogJ21hcmtfcmVqZWN0ZWQnLCB0eXBlOiAnZGVmYXVsdCcsIGxhYmVsOiAncmVqZWN0JyB9LFxuXG4gICAgLy8gVGllciBnYXRlIChkZWNpc2lvbi1ub2RlIGNvbmRpdGlvbmFsIGJyYW5jaGVzKS4gVGhlc2UgRURHRVMgYXJlIHRoZSBsaXZlXG4gICAgLy8gc2l0ZXMgXHUyMDE0IHRoZSBlbmdpbmUgbmV2ZXIgZXZhbHVhdGVzIGEgYGRlY2lzaW9uYCBub2RlJ3Mgc2luZ3VsYXJcbiAgICAvLyBgY29uZmlnLmNvbmRpdGlvbmAgXHUyMDE0IGFuZCB0aGV5IG11c3QgUEFSVElUSU9OLCBzbyB0aGUgZ3VhcmRzIGFyZSB3cml0dGVuXG4gICAgLy8gaW4gb3Bwb3NpdGUgcG9sYXJpdHkuIEEgZGVhbCB3aG9zZSBhbW91bnQgY2Fubm90IGJlIHJlYWQgbGFuZHMgb25cbiAgICAvLyBgbWFya19hcHByb3ZlZGA6IHRoZSBtYW5hZ2VyIGhhcyBhbHJlYWR5IGFwcHJvdmVkIGl0LCBhbmQgYW4gdW5yZWFkYWJsZVxuICAgIC8vIGFtb3VudCBtdXN0IG5vdCBzdHJhbmQgYW4gYXBwcm92ZWQgZGVhbCBpbiBhIGxvY2tlZCwgdW5kZWNpZGFibGVcbiAgICAvLyBkaXJlY3RvciBzdGVwLlxuICAgIC8vXG4gICAgLy8gVE9UQUxJVFk6IGBvcHBSZWNvcmRgIGlzIGEgYGdldF9yZWNvcmRgIE9VVFBVVCwgc28gdGhlIHJlYWQgbmVlZHNcbiAgICAvLyBgaGFzKHZhcnMub3BwUmVjb3JkKWAgKHRoZSB2YXJpYWJsZSksIGBoYXModmFycy5vcHBSZWNvcmQuYW1vdW50KWAgKHRoZVxuICAgIC8vIGNvbHVtbiBcdTIwMTQgYGZpbmRPbmVgIGFuc3dlcnMgYSBtaXNzIHdpdGggYG51bGxgLCBhbmQgYSBzcGFyc2UgZHJpdmVyIHJvd1xuICAgIC8vIG9taXRzIGFuIHVud3JpdHRlbiBjb2x1bW4gb3V0cmlnaHQpIGFuZCBgIT0gbnVsbGAgKGFuIGV4cGxpY2l0IG51bGxcbiAgICAvLyBwYXNzZXMgYGhhcygpYCBhbmQgdGhlIG9yZGVyaW5nIGNvbXBhcmlzb24gdGhlbiBhYm9ydHMgd2l0aCBgbm8gc3VjaFxuICAgIC8vIG92ZXJsb2FkOiBkeW48bnVsbD4gPiBpbnRgKS4gTWVhc3VyZWQgdG90YWwgYXMgYXV0aG9yZWQgdG9kYXkgXHUyMDE0IGBhbW91bnRgXG4gICAgLy8gaXMgYHJlcXVpcmVkYCBvbiBgY3JtX29wcG9ydHVuaXR5YCBhbmQgdGhlIGBnZXRfcmVjb3JkYCBpcyBrZXllZCBvbiB0aGVcbiAgICAvLyByb3cgdGhhdCBqdXN0IGZpcmVkIHRoZSB0cmlnZ2VyIFx1MjAxNCBidXQgdGhhdCBpcyB0aGUgbmVpZ2hib3VyaW5nIHNjaGVtYVxuICAgIC8vIGRvaW5nIHRoZSB3b3JrLCBleGFjdGx5IGFzIGluIHRoZSBzdGFydCBjb25kaXRpb24gYWJvdmUuIGB2YXJzLmAtc2NvcGVkXG4gICAgLy8gcmF0aGVyIHRoYW4gYmFyZTogYGhhcyhvcHBSZWNvcmQuYW1vdW50KWAgc3RpbGwgYWJvcnRzIHdpdGggYFVua25vd25cbiAgICAvLyB2YXJpYWJsZTogb3BwUmVjb3JkYCBvbiBhbiB1bmJvdW5kIHZhcmlhYmxlLCBgaGFzKHZhcnMub3BwUmVjb3JkKWBcbiAgICAvLyBhbnN3ZXJzIGBmYWxzZWAgKG1lYXN1cmVkKS4gRnJvbSAxNy4wLjAtcmMuMiBhbiB1bmV2YWx1YWJsZSBjb25kaXRpb25cbiAgICAvLyBBQk9SVFMgdGhlIHN0ZXAgcmF0aGVyIHRoYW4gc2tpcHBpbmcgaXQsIHNvIGEgZ3VhcmQgdGhhdCB3YXNcbiAgICAvLyBiZWx0LWFuZC1icmFjZXMgaXMgbm93IHdoYXQga2VlcHMgdGhlIHJ1biBhbGl2ZS5cbiAgICB7IGlkOiAnZTUnLCBzb3VyY2U6ICdjaGVja19oaWdoX3ZhbHVlJywgdGFyZ2V0OiAnZGlyZWN0b3Jfc2lnbm9mZicsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGBoYXModmFycy5vcHBSZWNvcmQpICYmIGhhcyh2YXJzLm9wcFJlY29yZC5hbW91bnQpXG4gICAgICAmJiB2YXJzLm9wcFJlY29yZC5hbW91bnQgIT0gbnVsbCAmJiB2YXJzLm9wcFJlY29yZC5hbW91bnQgPiAke0hJR0hfVkFMVUVfREVBTF9BTU9VTlR9YCwgbGFiZWw6ICdIaWdoIHZhbHVlICg+ICQ1MDBLKScgfSxcbiAgICB7IGlkOiAnZTYnLCBzb3VyY2U6ICdjaGVja19oaWdoX3ZhbHVlJywgdGFyZ2V0OiAnbWFya19hcHByb3ZlZCcsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGAhaGFzKHZhcnMub3BwUmVjb3JkKSB8fCAhaGFzKHZhcnMub3BwUmVjb3JkLmFtb3VudClcbiAgICAgIHx8IHZhcnMub3BwUmVjb3JkLmFtb3VudCA9PSBudWxsIHx8IHZhcnMub3BwUmVjb3JkLmFtb3VudCA8PSAke0hJR0hfVkFMVUVfREVBTF9BTU9VTlR9YCwgbGFiZWw6ICdTdGFuZGFyZCAoXHUyMjY0ICQ1MDBLKScgfSxcblxuICAgIC8vIERpcmVjdG9yIGRlY2lzaW9uIChhcHByb3ZhbC1ub2RlIGJyYW5jaCBsYWJlbHMpXG4gICAgeyBpZDogJ2U3Jywgc291cmNlOiAnZGlyZWN0b3Jfc2lnbm9mZicsIHRhcmdldDogJ21hcmtfYXBwcm92ZWQnLCB0eXBlOiAnZGVmYXVsdCcsIGxhYmVsOiAnYXBwcm92ZScgfSxcbiAgICB7IGlkOiAnZTgnLCBzb3VyY2U6ICdkaXJlY3Rvcl9zaWdub2ZmJywgdGFyZ2V0OiAnbWFya19yZWplY3RlZCcsIHR5cGU6ICdkZWZhdWx0JywgbGFiZWw6ICdyZWplY3QnIH0sXG5cbiAgICAvLyBUZXJtaW5hbCBicmFuY2hlc1xuICAgIHsgaWQ6ICdlOScsIHNvdXJjZTogJ21hcmtfYXBwcm92ZWQnLCB0YXJnZXQ6ICdub3RpZnlfYXBwcm92ZWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTEwJywgc291cmNlOiAnbm90aWZ5X2FwcHJvdmVkJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UxMScsIHNvdXJjZTogJ21hcmtfcmVqZWN0ZWQnLCB0YXJnZXQ6ICdub3RpZnlfcmVqZWN0ZWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTEyJywgc291cmNlOiAnbm90aWZ5X3JlamVjdGVkJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuXG4vKipcbiAqIEluc2VydC10aW1lIHR3aW4gb2YgYG9wcG9ydHVuaXR5X2FwcHJvdmFsYC4gQSByZWNvcmQtY2hhbmdlIGZsb3cgYmluZHNcbiAqIGV4YWN0bHkgb25lIGhvb2sgZXZlbnQsIHNvIHRoZSBhZnRlclVwZGF0ZSBmbG93IGFib3ZlIG5ldmVyIHNlZXNcbiAqIG9wcG9ydHVuaXRpZXMgQk9STiBvdmVyIHRoZSB0aHJlc2hvbGQgXHUyMDE0IGZsb3ctY3JlYXRlZCBkZWFscyAoY29udHJhY3RcbiAqIHJlbmV3YWxzLCBsZWFkIGNvbnZlcnNpb24pIGFuZCBBUEkgaW5zZXJ0cy4gXHUyNkQ0IERvIG5vdCBkZWxldGUgdGhpcyB0d2luXG4gKiBleHBlY3RpbmcgdGhlIGFmdGVyVXBkYXRlIGZsb3cgdG8gY292ZXIgdGhlbTsgdGhhdCBwb3B1bGF0aW9uIGlzIGV4YWN0bHkgd2hhdFxuICogdGhlIHN0YXJ0IGNvbmRpdGlvbidzIG51bGwtdG9sZXJhbmNlIGlzIHdyaXR0ZW4gZm9yLiBTYW1lIG5vZGVzL2VkZ2VzLCBvbmx5XG4gKiB0aGUgc3RhcnQgbm9kZSBpcyByZWJvdW5kIHRvIGFmdGVySW5zZXJ0IChtaXJyb3JzIGBDYXNlRXNjYWxhdGlvbk9uQ3JlYXRlRmxvd2ApLlxuICogVGhlIHN0YWdlIGd1YXJkIGNhcnJpZXMgb3Zlciwga2VlcGluZyBzZWVkZWQvaW1wb3J0ZWQgY2xvc2VkIGRlYWxzIG91dC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9wcG9ydHVuaXR5QXBwcm92YWxPbkNyZWF0ZUZsb3c6IEZsb3cgPSB7XG4gIC4uLk9wcG9ydHVuaXR5QXBwcm92YWxGbG93LFxuICBuYW1lOiAnb3Bwb3J0dW5pdHlfYXBwcm92YWxfb25fY3JlYXRlJyxcbiAgbGFiZWw6ICdMYXJnZSBEZWFsIEFwcHJvdmFsIChvbiBjcmVhdGUpJyxcbiAgZGVzY3JpcHRpb246ICdBcHByb3ZhbCBpbnRha2UgZm9yIG9wcG9ydHVuaXRpZXMgY3JlYXRlZCBhYm92ZSB0aGUgdGhyZXNob2xkIChpbnNlcnQtdGltZSB0d2luIG9mIG9wcG9ydHVuaXR5X2FwcHJvdmFsKS4nLFxuICBub2RlczogT3Bwb3J0dW5pdHlBcHByb3ZhbEZsb3cubm9kZXMubWFwKChuKSA9PlxuICAgIG4uaWQgPT09ICdzdGFydCdcbiAgICAgID8geyAuLi5uLCBjb25maWc6IHsgLi4ubi5jb25maWcsIHRyaWdnZXJUeXBlOiAncmVjb3JkLWFmdGVyLWNyZWF0ZScgfSB9XG4gICAgICA6IG4sXG4gICksXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3Mvb3Bwb3J0dW5pdHktc3RhdHVzLWNoYW5nZS1hcHByb3ZhbC5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL29wcG9ydHVuaXR5LXN0YXR1cy1jaGFuZ2UtYXBwcm92YWwuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNiBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUCwgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIE9wcG9ydHVuaXR5IFN0YXR1cyBDaGFuZ2UgQXBwcm92YWwgXHUyMDE0IHNpZ24tb2ZmIGJlZm9yZSBhIGRlYWwgaXMgZGVjbGFyZWQgd29uXG4gKiBvciBhYmFuZG9uZWQuXG4gKlxuICogUkVRLTAwMDYgc3RlcHMgMTMgKyAxNDogXHUzMDBDXHU1M0QxXHU4RDc3XHU4RDYyXHU1MzU1XHUzMDAxXHU1RjAzXHU1MzU1XHUyMDI2XHU3MkI2XHU2MDAxXHU1M0Q4XHU2NkY0XHU2NENEXHU0RjVDXHVGRjBDXHU1ODZCXHU1MTk5XHU1M0Q4XHU2NkY0XHU1MzlGXHU1NkUwXHU0RTBFXHU4QkY0XHU2NjBFXHUzMDBEIHRoZW5cbiAqIFx1MzAwQ1x1OTFDRFx1ODk4MVx1NzJCNlx1NjAwMVx1NTNEOFx1NjZGNFx1OTcwMFx1NUJBMVx1NjI3OVx1RkYwQyoqXHU5MDFBXHU4RkM3XHU1NDBFXHU1NTQ2XHU2NzNBXHU3MkI2XHU2MDAxXHU2QjYzXHU1RjBGXHU3NTFGXHU2NTQ4KipcdTMwMEQuIEV4cHJlc3NlZCBhcyBhbiAqKmFwcHJvdmFsIG5vZGUqKlxuICogKGB0eXBlOiAnYXBwcm92YWwnYCwgQURSLTAwMTkpLCB0aGUgY29uc3RydWN0IGBvcHBvcnR1bml0eS1hcHByb3ZhbC5mbG93LnRzYFxuICogYWxyZWFkeSB1c2VzIFx1MjAxNCBcdTI2RDQgdGhlcmUgaXMgbm8gYHdvcmtmbG93YCBtZXRhZGF0YSB0eXBlIGFuZCBubyBzdGFuZGFsb25lXG4gKiBgQXBwcm92YWxQcm9jZXNzYCB0byBhdXRob3IuXG4gKlxuICogIyMgV2h5IHRoZSBTVEFHRSBpcyBub3Qgd2hhdCB0aGUgcmVwIHdyaXRlc1xuICpcbiAqIFJFUS0wMDA2IGFjY2VwdGFuY2UgMzogdGhlIHJlcXVlc3Qgb3BlbnMgXCJhbmQgdGhlIHN0YWdlIGRvZXMgbm90IGNoYW5nZVxuICogdW50aWwgaXQgaXMgZGVjaWRlZFwiLiBBIGByZWNvcmRfY2hhbmdlYCBmbG93IGJpbmRzIGFuIEFGVEVSIGhvb2ssIHNvIGJ5IHRoZVxuICogdGltZSBpdCBydW5zIHRoZSBzdGFnZSBoYXMgYWxyZWFkeSBtb3ZlZCBcdTIwMTQgYW4gYWZ0ZXItZmxvdyBjYW4gbG9jayB0aGUgcmVjb3JkXG4gKiBidXQgaXQgY2Fubm90IHVuLW1vdmUgaXQuIFNvIHRoZSByZXAgd3JpdGVzIHRoZSBSRVFVRVNUXG4gKiAoYHJlcXVlc3RlZF9zdGF0dXNgKSBhbmQgdGhlIGFwcHJvdmVkIGRlY2lzaW9uIHdyaXRlcyB0aGUgU1RBR0UsIHdoaWNoIGlzXG4gKiBhbHNvIGxpdGVyYWxseSB3aGF0IHRoZSBjdXN0b21lcidzIG93biBzdGVwIDE0IHNheXMgKFwiXHU5MDFBXHU4RkM3XHU1NDBFXHUyMDI2XHU2QjYzXHU1RjBGXHU3NTFGXHU2NTQ4XCIpLlxuICogYG9wcG9ydHVuaXR5Lmhvb2sudHNgIHJlZnVzZXMgYSBkaXJlY3QgdXNlciBtb3ZlIGludG8gYSBjbG9zZWQgc3RhZ2Ugd2hpbGVcbiAqIHRoZSBnYXRlIGlzIGFybWVkLCBhbmQgbmFtZXMgdGhpcyBmaWVsZCBpbiB0aGUgcmVmdXNhbC5cbiAqXG4gKiAjIyBcdTI2QTBcdUZFMEYgVGhpcyBmbG93IGlzIElORVJUIHVudGlsIGFuIGluc3RhbGwgYXJtcyB0aGUgZ2F0ZSwgYW5kIHRoYXQgaXMgYnkgZGVzaWduXG4gKlxuICogUkVRLTAwMDYgYWNjZXB0YW5jZSAzIGFnYWluOiBcIndpdGggaXQgb2ZmICh0aGUgZGVmYXVsdCksIHRoZSBleGlzdGluZ1xuICogYW1vdW50LXRpZXJlZCBiZWhhdmlvdXIgb2YgYG9wcG9ydHVuaXR5LWFwcHJvdmFsLmZsb3cudHNgIGlzIGJpdC1mb3ItYml0XG4gKiB3aGF0IGl0IGlzIHRvZGF5LlwiXG4gKlxuICogVGhlIHN3aXRjaCBpcyBgY3JtX29wcG9ydHVuaXR5LnN0YXR1c19jaGFuZ2VfYXBwcm92YWxfc3RhdHVzYCdzXG4gKiBgZGVmYXVsdFZhbHVlYCwgXHUyNkQ0IG5vdCB0aGlzIGZsb3cncyBgc3RhdHVzYC4gU2hpcHBlZCwgdGhhdCBkZWZhdWx0IGlzXG4gKiBgbm90X3JlcXVpcmVkYCwgc28gbm8gZGVhbCBpcyBldmVyIGJvcm4gYHBlbmRpbmdgLCB0aGUgc3RhcnQgY29uZGl0aW9uIGJlbG93XG4gKiBpcyBmYWxzZSBmb3IgZXZlcnkgcmVjb3JkIHRoYXQgaGFzIGV2ZXIgZXhpc3RlZCwgYW5kIHRoaXMgZmxvdyBvcGVucyBub3RoaW5nXG4gKiBcdTIwMTQgaXQgY29zdHMgb25lIHByZWRpY2F0ZSBldmFsdWF0aW9uIHBlciB1cGRhdGUuIEFuIGluc3RhbGwgYXJtcyB0aGUgZ2F0ZSBieVxuICogY2hhbmdpbmcgdGhhdCBvbmUgdmFsdWUgdG8gYCdwZW5kaW5nJ2AuXG4gKlxuICogXHUyNkQ0IERvIE5PVCByZWFjaCBmb3IgYHN0YXR1czogJ2RyYWZ0J2AgYXMgdGhlIG9mZiBzd2l0Y2ggaW5zdGVhZCwgYW5kIFx1MjZENCBub3RcbiAqIGAnb2Jzb2xldGUnYCBlaXRoZXIuIEJvdGggcmVhZGluZ3MgYXJlIG1lYXN1cmVkIGFuZCByZWNvcmRlZCBpblxuICogYGxlYWQtY29udmVyc2lvbi1hcHByb3ZhbC5mbG93LnRzYCdzIGRvY3N0cmluZyBvblxuICogYEBvYmplY3RzdGFjay9zZXJ2aWNlLWF1dG9tYXRpb25gIDE3LjQuMCwgdGhlIHBpbiBhdCB0aGF0IHRha2luZzogZHJhZnQgZmxvd3Mgc3RpbGwgZmlyZSB0aGVpclxuICogdHJpZ2dlcnMsIGFuZCBgaXNGbG93RW5hYmxlZGAgY29tcG9zZXMgYG9ic29sZXRlYCB3aXRoIHRoZSBpbnN0YWxsYXRpb24nc1xuICogYWN0aXZhdGlvbiBsZWRnZXIgaW50byBhIGdhdGUgbm8gaW5zdGFsbCBjYW4gZXZlciB0dXJuIE9OLiBcdTI2RDQgRG8gbm90XG4gKiByZS1kZXJpdmUgaXQgaGVyZS5cbiAqXG4gKiBcdTIxRDIgQSBkZWFsIHRoYXQgcHJlZGF0ZXMgdGhlIGFybWluZyBrZWVwcyBgbm90X3JlcXVpcmVkYCBhbmQgbmV2ZXIgZW50ZXJzLFxuICogc28gYXJtaW5nIHRoZSBnYXRlIGludmFsaWRhdGVzIG5vIGV4aXN0aW5nIHJlY29yZC5cbiAqXG4gKiAjIyBcdTI2QTBcdUZFMEYgSXRzIG93biB2ZXJkaWN0IGNvbHVtbiwgTk9UIGBhcHByb3ZhbF9zdGF0dXNgXG4gKlxuICogYGFwcHJvdmFsX3N0YXR1c2AgYmVsb25ncyB0byB0aGUgYW1vdW50LXRpZXJlZCBmbG93LiBTaGFyaW5nIGl0IHdvdWxkIG1ha2VcbiAqIGVpdGhlciBnYXRlJ3MgdmVyZGljdCBlcmFzZSB0aGUgb3RoZXIncyBcdTIwMTQgYW5kIHdvcnNlLCByZS1hcm0gdGhlIGFtb3VudCBmbG93LFxuICogd2hvc2UgZW50cnkgY29uZGl0aW9uIGZpcmVzIG9uIGBhcHByb3ZhbF9zdGF0dXMgPT0gXCJub3RfcmVxdWlyZWRcImAuXG4gKi9cbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eVN0YXR1c0NoYW5nZUFwcHJvdmFsRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X3N0YXR1c19jaGFuZ2VfYXBwcm92YWwnLFxuICBsYWJlbDogJ09wcG9ydHVuaXR5IFN0YXR1cyBDaGFuZ2UgQXBwcm92YWwnLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnU2lnbi1vZmYgYSBkZWFsIG5lZWRzIGJlZm9yZSBpdCBpcyBkZWNsYXJlZCB3b24gb3IgbG9zdC4gSW5lcnQgdW5sZXNzIHRoZSBpbnN0YWxsIGFybXMgdGhlIGdhdGUgb24gY3JtX29wcG9ydHVuaXR5LnN0YXR1c19jaGFuZ2VfYXBwcm92YWxfc3RhdHVzLicsXG4gIHR5cGU6ICdyZWNvcmRfY2hhbmdlJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gUkVRLTAwMDYgYWNjZXB0YW5jZSA0LCBhbmQgdGhlIHNhbWUgcmVhZGluZyBgb3Bwb3J0dW5pdHlfYXBwcm92YWxgIHJlY29yZHNcbiAgLy8gZnJvbSBpdHMgb3duIG1lYXN1cmVkIGZhaWx1cmU6IGEgZ2F0ZSB0aGF0IGVuZ2FnZXMgb25seSBmb3Igd3JpdGVyc1xuICAvLyBjYXJyeWluZyBhIHNlc3Npb24gaXMgbm90IGEgY29udHJvbCBcdTIwMTQgYSBgcnVuQXM6ICdzeXN0ZW0nYCBzd2VlcCBvciBpbXBvcnRcbiAgLy8gd291bGQgc2ltcGx5IGJ5cGFzcyBpdC4gVGhlIHZlcmRpY3QgYW5kIHRoZSBzdGFnZSB3cml0ZSBiZWxvdyBhbHNvIGxhbmQgb25cbiAgLy8gY29sdW1ucyB0aGUgcmVhZG9ubHkgc3RyaXAgcHJvdGVjdHMsIHdoaWNoIG9ubHkgYSBwbGF0Zm9ybSB3cml0ZSByZWFjaGVzLlxuICBydW5BczogJ3N5c3RlbScsXG5cbiAgdmFyaWFibGVzOiBbXG4gICAgeyBuYW1lOiAnb3Bwb3J0dW5pdHlJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gIF0sXG5cbiAgbm9kZXM6IFtcbiAgICB7XG4gICAgICBpZDogJ3N0YXJ0JyxcbiAgICAgIHR5cGU6ICdzdGFydCcsXG4gICAgICBsYWJlbDogJ1N0YXJ0JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgICAgdHJpZ2dlclR5cGU6ICdyZWNvcmQtYWZ0ZXItdXBkYXRlJyxcbiAgICAgICAgLy8gVE9UQUxJVFkgKEFHRU5UUy5tZCBcdTIwMTQgdmFsaWRhdGlvbiBwcmVkaWNhdGVzIG11c3QgYmUgVE9UQUwpOiBgaGFzKClgXG4gICAgICAgIC8vIG9uIGV2ZXJ5IHJlYWQuIEEgZmxvdyBjb25kaXRpb24gaXMgc3RyaWN0IENFTCBvbiBldmVyeSBydW4gYW5kIGFuXG4gICAgICAgIC8vIHVuZ3VhcmRlZCByZWFkIGFnYWluc3QgYSBkcml2ZXIgdGhhdCBvbWl0cyBhYnNlbnQgY29sdW1ucyBhYm9ydHMsXG4gICAgICAgIC8vIHdoaWNoIGZyb20gMTcuMC4wLXJjLjIgRkFJTFMgVEhFIFJVTiByYXRoZXIgdGhhbiBza2lwcGluZyBpdC4gVGhlXG4gICAgICAgIC8vIGFic2VudCBjYXNlIG11c3QgcmVhZCBhcyBcIm5vdCBnYXRlZFwiOiBhIGRlYWwgd2l0aCBubyBnYXRlIGNvbHVtbiBhdFxuICAgICAgICAvLyBhbGwgcHJlZGF0ZXMgdGhlIGZpZWxkIGFuZCBjbG9zZXMgdGhlIHdheSBpdCBhbHdheXMgZGlkLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaHJlZSBoYWx2ZXM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vIC0gdGhlIGdhdGUgaXMgQVJNRUQ6IGBwZW5kaW5nYCAoYm9ybiBhcm1lZCwgbm8gcmVxdWVzdCBkZWNpZGVkIHlldClcbiAgICAgICAgLy8gICBvciBgcmVqZWN0ZWRgICh0aGUgbGFzdCByZXF1ZXN0IHdhcyByZWZ1c2VkKS4gYHJlamVjdGVkYCByZS1vcGVuc1xuICAgICAgICAvLyAgIG9uIGEgbmV3IHJlcXVlc3QgYmVjYXVzZSBgb3Bwb3J0dW5pdHkuaG9vay50c2AgcmVmdXNlcyBhIGRpcmVjdFxuICAgICAgICAvLyAgIGNsb3NlIGluIGJvdGggc3RhdGVzIFx1MjAxNCBpZiBvbmx5IGBwZW5kaW5nYCBlbnRlcmVkIGhlcmUsIGEgcmVqZWN0ZWRcbiAgICAgICAgLy8gICBkZWFsIGNvdWxkIGJlIG5laXRoZXIgcmVxdWVzdGVkIG5vciBjbG9zZWQsIGV2ZXIuXG4gICAgICAgIC8vIC0gYSByZXF1ZXN0IGlzIHByZXNlbnQ7XG4gICAgICAgIC8vIC0gdGhlIHJlcXVlc3QgaXMgTkVXIG9uIHRoaXMgd3JpdGUuIFRSQU5TSVRJT04sIG5vdCBjdXJyZW50IHZhbHVlIFx1MjAxNFxuICAgICAgICAvLyAgIHRoZSBpZGlvbSBgYmlsbGluZ19oYW5kb2ZmX2Nsb3NlZF93b25gIHJlY29yZHMgZm9yIHRoaXMgb2JqZWN0LlxuICAgICAgICAvLyAgIFdpdGhvdXQgaXQgdGhlIGZsb3cgcmUtZmlyZXMgb24gaXRzIG93biB3cml0ZS1iYWNrIHdoaWxlIHRoZVxuICAgICAgICAvLyAgIHJlcXVlc3QgaXMgc3RpbGwgb3BlbiAodGhlIGFwcHJvdmFsIG5vZGUncyBgcGVuZGluZ2Agc3RhbXAgdGhyb3VnaFxuICAgICAgICAvLyAgIGBhcHByb3ZhbFN0YXR1c0ZpZWxkYCBpcyBhbiB1cGRhdGUgb2YgdGhpcyByZWNvcmQpLiBNZWFzdXJlZCBvblxuICAgICAgICAvLyAgIDE3LjYuMCB3aXRoIHRoaXMgdGVybSBkZWxldGVkOiBvbmUgcmUtZW50cnkgcGVyIHJlcXVlc3QsIGVhY2hcbiAgICAgICAgLy8gICBjYXVnaHQgb25seSBieSB0aGUgZW5naW5lJ3Mgc2VsZi10cmlnZ2VyIGd1YXJkIChcInRoZSBndWFyZCBhc1xuICAgICAgICAvLyAgIGF1dGhvcmVkIGRvZXMgbm90IGV4Y2x1ZGUgdGhlIGZsb3cncyBvd24gd3JpdGUtYmFja1wiKTsgd2l0aCBpdCxcbiAgICAgICAgLy8gICBub25lLiBgcHJldmlvdXMuKmAgaXMgZ3VhcmRlZCBGQUlMLUNMT1NFRDogbm8gdmlzaWJsZSBwcmlvclxuICAgICAgICAvLyAgIHZhbHVlLCBubyB2aXNpYmxlIG5ldyByZXF1ZXN0LlxuICAgICAgICAvL1xuICAgICAgICAvLyBgYXBwbHlfc3RhdHVzYCBsZWF2ZXMgdGhlIGdhdGUgYGFwcHJvdmVkYCAob3V0IG9mIHJlYWNoKSBhbmRcbiAgICAgICAgLy8gYGNsZWFyX3JlcXVlc3RgIGVtcHRpZXMgdGhlIHJlcXVlc3QsIHNvIG5laXRoZXIgcmUtZW50ZXJzLlxuICAgICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5zdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1cylcbiAgICAgICAgICAmJiAocmVjb3JkLnN0YXR1c19jaGFuZ2VfYXBwcm92YWxfc3RhdHVzID09IFwicGVuZGluZ1wiIHx8IHJlY29yZC5zdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1cyA9PSBcInJlamVjdGVkXCIpXG4gICAgICAgICAgJiYgaGFzKHJlY29yZC5yZXF1ZXN0ZWRfc3RhdHVzKSAmJiByZWNvcmQucmVxdWVzdGVkX3N0YXR1cyAhPSBudWxsICYmIHJlY29yZC5yZXF1ZXN0ZWRfc3RhdHVzICE9IFwiXCJcbiAgICAgICAgICAmJiBoYXMocHJldmlvdXMucmVxdWVzdGVkX3N0YXR1cykgJiYgcHJldmlvdXMucmVxdWVzdGVkX3N0YXR1cyAhPSByZWNvcmQucmVxdWVzdGVkX3N0YXR1c2AsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdnZXRfb3Bwb3J0dW5pdHknLFxuICAgICAgdHlwZTogJ2dldF9yZWNvcmQnLFxuICAgICAgbGFiZWw6ICdHZXQgT3Bwb3J0dW5pdHknLFxuICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLCBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sIG91dHB1dFZhcmlhYmxlOiAnb3BwUmVjb3JkJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdzdGF0dXNfcmV2aWV3JyxcbiAgICAgIHR5cGU6ICdhcHByb3ZhbCcsXG4gICAgICBsYWJlbDogJ1N0YXR1cyBDaGFuZ2UgUmV2aWV3JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBUaGUgY3VzdG9tZXIncyBjaGFpbiBpcyBcdTk1MDBcdTU1MkVcdThEMUZcdThEMjNcdTRFQkEgXHUyMTkyIFx1NEU4Qlx1NEUxQVx1OTBFOFx1OEQxRlx1OEQyM1x1NEVCQTsgdGhlIGdlbmVyaWMgc2hhcGUgY29yZVxuICAgICAgICAvLyBzaGlwcyBpcyB0aGUgbWFuYWdlciBiZW5jaCB0aGlzIGFwcCBhbHJlYWR5IGRlY2xhcmVzIGFwcHJvdmVyc1xuICAgICAgICAvLyBhZ2FpbnN0LiBBIHNlY29uZCB0aWVyLCBvciBhIGRpZmZlcmVudCBwb3NpdGlvbiwgaXMgb3ZlcmxheVxuICAgICAgICAvLyBjb25maWd1cmF0aW9uIChSRVEtMDAwNiBhY2NlcHRhbmNlIDUpLlxuICAgICAgICBhcHByb3ZlcnM6IFt7IHR5cGU6ICdwb3NpdGlvbicsIHZhbHVlOiAnc2FsZXNfbWFuYWdlcicgfV0sXG4gICAgICAgIC8vIEV4cGxpY2l0IHRob3VnaCBpdCBpcyB0aGUgc2NoZW1hIGRlZmF1bHQsIGV4YWN0bHkgYXMgYm90aCBzaWJsaW5nXG4gICAgICAgIC8vIGFwcHJvdmFscyBhdXRob3IgaXQ6IGFwcHJvdmVycyBzbmFwc2hvdCBhdCByZXF1ZXN0IGNyZWF0aW9uLCBzbyBhblxuICAgICAgICAvLyBlbXB0eSBiZW5jaCB3b3VsZCBsZWF2ZSB0aGUgcmVxdWVzdCB1bmRlY2lkYWJsZSBcdTIwMTQgYW5kIGhlcmUgdGhhdFxuICAgICAgICAvLyBtZWFucyBhIGRlYWwgbm9ib2R5IGNhbiBldmVyIGNsb3NlLlxuICAgICAgICBvbkVtcHR5QXBwcm92ZXJzOiAnYWRtaW5fcmVzY3VlJyxcbiAgICAgICAgYmVoYXZpb3I6ICdmaXJzdF9yZXNwb25zZScsXG4gICAgICAgIC8vIGB0cnVlYCwgbWF0Y2hpbmcgYG9wcG9ydHVuaXR5X2FwcHJvdmFsYCBhbmQgTk9UIHRoZSBsZWFkIGdhdGU6IGEgZGVhbFxuICAgICAgICAvLyBhd2FpdGluZyBhIHdvbi9sb3N0IHZlcmRpY3QgbXVzdCBub3Qga2VlcCBtb3ZpbmcgdW5kZXJuZWF0aCB0aGVcbiAgICAgICAgLy8gYXBwcm92ZXIuIEl0cyBuYXJyYXRpdmUgZmllbGRzIGFyZSB3aGF0IHRoZSBmcmVlemUgaG9vayBsZWF2ZXMgb3BlblxuICAgICAgICAvLyBhbnl3YXkuXG4gICAgICAgIGxvY2tSZWNvcmQ6IHRydWUsXG4gICAgICAgIGFwcHJvdmFsU3RhdHVzRmllbGQ6ICdzdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1cycsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gVGhlIGFwcHJvdmVkIGRlY2lzaW9uIGlzIHdoYXQgbW92ZXMgdGhlIHN0YWdlIFx1MjAxNCBcIlx1OTAxQVx1OEZDN1x1NTQwRVx1NkI2M1x1NUYwRlx1NzUxRlx1NjU0OFwiLlxuICAgICAgLy9cbiAgICAgIC8vIFx1MjZBMFx1RkUwRiBCb3RoIGZpZWxkcyBpbiBPTkUgd3JpdGUsIGFuZCB0aGF0IGlzIGxvYWQtYmVhcmluZzogdGhlXG4gICAgICAvLyBzdGF0dXMtY2hhbmdlIGd1YXJkIGluIGBvcHBvcnR1bml0eS5ob29rLnRzYCByZWFkcyB0aGUgZ2F0ZSBjb2x1bW5cbiAgICAgIC8vIElOUFVULUZJUlNULCBzbyB0aGlzIHdyaXRlIHByZXNlbnRzIGl0c2VsZiBhcyBhbHJlYWR5LWFwcHJvdmVkIGFuZCB0aGVcbiAgICAgIC8vIGd1YXJkIGxldHMgdGhlIHN0YWdlIHRocm91Z2guIFNwbGl0dGluZyBpdCBpbnRvIHR3byB3cml0ZXMgd291bGQgaGF2ZVxuICAgICAgLy8gdGhlIGd1YXJkIHJlZnVzZSB0aGUgZmxvdydzIG93biB3cml0ZSAoRUxFVkFUSU9OIElTIE5PVCBBTk9OWU1JVFkgXHUyMDE0XG4gICAgICAvLyBgcnVuQXM6ICdzeXN0ZW0nYCBjYXJyaWVzIHRoZSB0cmlnZ2VyaW5nIHVzZXIsIHNvIGBjdHgudXNlcj8uaWRgIGlzXG4gICAgICAvLyBwcmVzZW50IGluIHRoaXMgcnVuKS5cbiAgICAgIC8vXG4gICAgICAvLyBgd2luX3JlYXNvbmAgLyBgbG9zc19yZWFzb25gIGFyZSBgcmVxdWlyZWRXaGVuYCB0aGUgc3RhZ2UgaXMgY2xvc2VkIGFuZFxuICAgICAgLy8gYXJlIGV2YWx1YXRlZCBhZ2FpbnN0IHRoZSBtZXJnZWQgcmVjb3JkLCBzbyB0aGUgdmFsdWVzIHRoZSByZXAgY2FwdHVyZWRcbiAgICAgIC8vIHdoZW4gcmVxdWVzdGluZyBzYXRpc2Z5IHRoZW0gaGVyZS5cbiAgICAgIGlkOiAnYXBwbHlfc3RhdHVzJyxcbiAgICAgIHR5cGU6ICd1cGRhdGVfcmVjb3JkJyxcbiAgICAgIGxhYmVsOiAnQXBwbHkgUmVxdWVzdGVkIFN0YXR1cycsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZC5pZGAgfSxcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgc3RhZ2U6IGNlbGBvcHBSZWNvcmQucmVxdWVzdGVkX3N0YXR1c2AsXG4gICAgICAgICAgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcsXG4gICAgICAgICAgYXBwcm92ZWRfZGF0ZTogY2VsYGlzb0RhdGV0aW1lKG5vdygpKWAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gQSByZWplY3RlZCByZXF1ZXN0IGlzIGNsZWFyZWQsIG5vdCBsZWZ0IHN0YW5kaW5nLCBhbmQgdGhlIHZlcmRpY3Qgc3RheXNcbiAgICAgIC8vIGByZWplY3RlZGAgc28gdGhlIGhvb2sga2VlcHMgcmVmdXNpbmcgYSBkaXJlY3QgY2xvc2U6IHRoZSB3YXkgb24gaXMgYVxuICAgICAgLy8gbmV3IHJlcXVlc3QsIHdoaWNoIHRoZSBzdGFydCBjb25kaXRpb24gb3BlbnMgYXMgYSBmcmVzaCBhcHByb3ZhbC5cbiAgICAgIGlkOiAnY2xlYXJfcmVxdWVzdCcsXG4gICAgICB0eXBlOiAndXBkYXRlX3JlY29yZCcsXG4gICAgICBsYWJlbDogJ0NsZWFyIFJlamVjdGVkIFJlcXVlc3QnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBzdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1czogJ3JlamVjdGVkJywgcmVxdWVzdGVkX3N0YXR1czogbnVsbCB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG5cbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ2dldF9vcHBvcnR1bml0eScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ2dldF9vcHBvcnR1bml0eScsIHRhcmdldDogJ3N0YXR1c19yZXZpZXcnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAvLyBBcHByb3ZhbC1ub2RlIGJyYW5jaCBsYWJlbHMuXG4gICAgeyBpZDogJ2UzJywgc291cmNlOiAnc3RhdHVzX3JldmlldycsIHRhcmdldDogJ2FwcGx5X3N0YXR1cycsIHR5cGU6ICdkZWZhdWx0JywgbGFiZWw6ICdhcHByb3ZlJyB9LFxuICAgIHsgaWQ6ICdlNCcsIHNvdXJjZTogJ3N0YXR1c19yZXZpZXcnLCB0YXJnZXQ6ICdjbGVhcl9yZXF1ZXN0JywgdHlwZTogJ2RlZmF1bHQnLCBsYWJlbDogJ3JlamVjdCcgfSxcbiAgICB7IGlkOiAnZTUnLCBzb3VyY2U6ICdhcHBseV9zdGF0dXMnLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTYnLCBzb3VyY2U6ICdjbGVhcl9yZXF1ZXN0JywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3Mvb3Bwb3J0dW5pdHktcXVhbGlmaWNhdGlvbi1hcHByb3ZhbC5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL29wcG9ydHVuaXR5LXF1YWxpZmljYXRpb24tYXBwcm92YWwuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNiBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUCwgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIE9wcG9ydHVuaXR5IFF1YWxpZmljYXRpb24gQXBwcm92YWwgXHUyMDE0IHRoZSBcdTdBQ0JcdTk4Nzkgc2lnbi1vZmYgYSBuZXcgZGVhbCBuZWVkc1xuICogYmVmb3JlIGl0cyBzdGFnZSBvciBpdHMgd29uL2xvc3QgY2FsbCBtYXkgY2hhbmdlLiBXaWxsIEJpZCAoXHU2NjJGXHU1NDI2XHU2Mjk1XHU2ODA3KSBpc1xuICogbm90IGhlbGQ6IHN0ZXAgOCBtYWtlcyBpdCBpbnB1dCB0byBcdTdBQ0JcdTk4NzksIGZvciB0aGUgYXBwcm92ZXIgdG8gcmVhZCAoIzIwMDQpLlxuICpcbiAqIFJFUS0wMDA2IHN0ZXAgMTE6IFx1MzAwQ1x1OTUwMFx1NTUyRVx1N0FDQlx1OTg3OVx1OTcwMFx1OEQ3MFx1NUJBMVx1NjI3OVx1NkQ0MVx1N0EwQlx1RkYxQlx1NjVCMFx1NTg5RVx1NTU0Nlx1NjczQVx1NTNFRlx1OERERlx1OEZEQlx1RkYwQ1x1N0FDQlx1OTg3OVx1OTAxQVx1OEZDN1x1NTQwRVx1NjVCOVx1NTNFRlx1NjZGNFx1NjVCMFx1OTYzNlx1NkJCNVx1MzAwMVx1NjI5NVx1NjgwN1x1MzAwMVxuICogXHU4RDYyXHU0RTIyXHU1MzU1XHU2NENEXHU0RjVDXHUzMDAyXHUzMDBEIEV4cHJlc3NlZCBhcyBhbiAqKmFwcHJvdmFsIG5vZGUqKiAoYHR5cGU6ICdhcHByb3ZhbCdgLCBBRFItMDAxOSksXG4gKiB0aGUgY29uc3RydWN0IGBvcHBvcnR1bml0eS1hcHByb3ZhbC5mbG93LnRzYCBhbHJlYWR5IHVzZXMgXHUyMDE0IFx1MjZENCB0aGVyZSBpcyBub1xuICogYHdvcmtmbG93YCBtZXRhZGF0YSB0eXBlIGFuZCBubyBzdGFuZGFsb25lIGBBcHByb3ZhbFByb2Nlc3NgIHRvIGF1dGhvci5cbiAqXG4gKiBCdWlsdCBvbiBgb3Bwb3J0dW5pdHktc3RhdHVzLWNoYW5nZS1hcHByb3ZhbC5mbG93LnRzYCAoUkVRLTAwMDYgc3RlcCAxNCkgYW5kXG4gKiBkZWxpYmVyYXRlbHkgdGhlIHNhbWUgaW4gZXZlcnkgbG9hZC1iZWFyaW5nIHRlcm06IHRoZSBzd2l0Y2ggaXMgYSB2ZXJkaWN0XG4gKiBmaWVsZCdzIGBkZWZhdWx0VmFsdWVgLCB0aGUgcmVwIHdyaXRlcyBhIFJFUVVFU1QgYW5kIHRoZSBmbG93IG9wZW5zIG9uZVxuICogYXBwcm92YWwgd2hlbiB0aGUgcmVxdWVzdCBpcyBORVcsIGByZWplY3RlZGAgcmUtb3BlbnMgb24gYSBuZXcgcmVxdWVzdCxcbiAqIGBydW5BczogJ3N5c3RlbSdgLCBgb25FbXB0eUFwcHJvdmVyczogJ2FkbWluX3Jlc2N1ZSdgLiBUaGUgcmVmdXNhbCBvZiB0aGVcbiAqIHR3byBnYXRlZCBhY3RzIGxpdmVzIGJlc2lkZSB0aGUgc3RlcC0xNCByZWZ1c2FsIGluIGBvcHBvcnR1bml0eS5ob29rLnRzYCdzXG4gKiBgb3Bwb3J0dW5pdHlfbGlmZWN5Y2xlYC4gV2hlcmUgaXQgZGlmZmVycywgdGhlIHJlYXNvbiBpcyB3cml0dGVuIGJlc2lkZSBpdFxuICogKGBsb2NrUmVjb3JkYCkuXG4gKlxuICogIyMgXHUyNkEwXHVGRTBGIFRoaXMgZmxvdyBpcyBJTkVSVCB1bnRpbCBhbiBpbnN0YWxsIGFybXMgdGhlIGdhdGUsIGFuZCB0aGF0IGlzIGJ5IGRlc2lnblxuICpcbiAqIFJFUS0wMDA2ICpEaXNwb3NpdGlvbio6IFwiKipCb3RoIGdhdGVzIG11c3QgYmUgY29uZmlndXJhYmxlIFx1MjAxNCBvZmYgYnlcbiAqIGRlZmF1bHQqKiwgc28gZXhpc3RpbmcgaW5zdGFsbHMga2VlcCB0b2RheSdzIGFtb3VudC1vbmx5IGJlaGF2aW91ci5cIlxuICpcbiAqIFRoZSBzd2l0Y2ggaXMgYGNybV9vcHBvcnR1bml0eS5xdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1c2Anc1xuICogYGRlZmF1bHRWYWx1ZWAsIFx1MjZENCBub3QgdGhpcyBmbG93J3MgYHN0YXR1c2AgKGBkcmFmdGAgc3RpbGwgZmlyZXMgdHJpZ2dlcnMgYW5kXG4gKiBgb2Jzb2xldGVgIGlzIGEgZ2F0ZSBubyBpbnN0YWxsIGNhbiB0dXJuIE9OIFx1MjAxNCBtZWFzdXJlZCBhbmQgcmVjb3JkZWQgaW5cbiAqIGBsZWFkLWNvbnZlcnNpb24tYXBwcm92YWwuZmxvdy50c2A7IFx1MjZENCBkbyBub3QgcmUtZGVyaXZlIGl0IGhlcmUpLiBTaGlwcGVkLFxuICogdGhhdCBkZWZhdWx0IGlzIGBub3RfcmVxdWlyZWRgLCBzbyBubyBkZWFsIGlzIGV2ZXIgYm9ybiBgcGVuZGluZ2AsIHRoZSBzdGFydFxuICogY29uZGl0aW9uIGJlbG93IGlzIGZhbHNlIGZvciBldmVyeSByZWNvcmQgdGhhdCBoYXMgZXZlciBleGlzdGVkLCBhbmQgdGhpc1xuICogZmxvdyBvcGVucyBub3RoaW5nIFx1MjAxNCBpdCBjb3N0cyBvbmUgcHJlZGljYXRlIGV2YWx1YXRpb24gcGVyIHVwZGF0ZS4gQW5cbiAqIGluc3RhbGwgYXJtcyB0aGUgZ2F0ZSBieSBjaGFuZ2luZyB0aGF0IG9uZSB2YWx1ZSB0byBgJ3BlbmRpbmcnYC5cbiAqXG4gKiAjIyBXaXRoIHRoZSBzdGF0dXMtY2hhbmdlIGdhdGUgYXJtZWQgdG9vXG4gKlxuICogXHU3QUNCXHU5ODc5IGNvbWVzIGZpcnN0OiB3aGlsZSB0aGlzIHZlcmRpY3QgaXMgYHBlbmRpbmdgIG9yIGByZWplY3RlZGAsXG4gKiBgb3Bwb3J0dW5pdHlfbGlmZWN5Y2xlYCByZWZ1c2VzIGEgbmV3IGByZXF1ZXN0ZWRfc3RhdHVzYCwgc28gbm8gc3RhdHVzLWNoYW5nZVxuICogYXBwcm92YWwgY2FuIGJlIGFza2VkIGZvci4gT25jZSBcdTdBQ0JcdTk4NzkgaXMgYGFwcHJvdmVkYCB0aGlzIGZsb3cgaXMgb3V0IG9mIHJlYWNoXG4gKiBmb3IgZ29vZCwgYW5kIHRoZSBzdGF0dXMtY2hhbmdlIGdhdGUgYmVoYXZlcyBleGFjdGx5IGFzIGl0IGRvZXMgYWxvbmUuIFRoaXNcbiAqIGZsb3cncyBvd24gd3JpdGVzIGNhcnJ5IG5laXRoZXIgYHN0YWdlYCBub3IgYHJlcXVlc3RlZF9zdGF0dXNgLCBzbyB0aGV5IGNhblxuICogdHJpcCBuZWl0aGVyIGdhdGU7IGJvdGggY29sdW1ucyBzaXQgaW4gdGhlIGhvb2sncyBBUFBST1ZBTF9GSUVMRFMgc28gdGhlXG4gKiBjbG9zZWQtZGVhbCBmcmVlemUgY2Fubm90IHJlZnVzZSB0aGVtIGVpdGhlci5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgVGhlIHBsYXRmb3JtIGhvbGRzIE9ORSBwZW5kaW5nIGFwcHJvdmFsIHBlciByZWNvcmQgKGBvcGVuTm9kZVJlcXVlc3RgXG4gKiB0aHJvd3MgYERVUExJQ0FURV9SRVFVRVNUYCBvdGhlcndpc2UsIGBAb2JqZWN0c3RhY2svcGx1Z2luLWFwcHJvdmFsc2BcbiAqIDE3LjYuMCksIHNvIHRoZSBvcHBvcnR1bml0eSBnYXRlcyBuZXZlciBzdGFjayBvbiBvbmUgZGVhbDogYSByZXF1ZXN0IGFcbiAqIHNlY29uZCBnYXRlIHdvdWxkIG9wZW4gd2hpbGUgYW5vdGhlciBpcyBwZW5kaW5nIGlzIHJlZnVzZWQsIG5vdCBxdWV1ZWQuXG4gKiBNZWFzdXJlZCBvbiBhIDE3LjYuMCBib290IHdpdGggdGhpcyBnYXRlIGFybWVkOiBhIGRlYWwgcmFpc2VkIHBhc3RcbiAqIGBMQVJHRV9ERUFMX0FNT1VOVGAgd2hpbGUgaXRzIFx1N0FDQlx1OTg3OSByZXF1ZXN0IHdhaXRlZCBmYWlsZWRcbiAqIGBvcHBvcnR1bml0eV9hcHByb3ZhbGAncyBydW4gd2l0aCB0aGF0IGVycm9yIChsb2dnZWQsIG5vdGhpbmcgb3BlbmVkKTsgdGhlXG4gKiBhbW91bnQgYXBwcm92YWwgb3BlbmVkIG9uIHRoZSBuZXh0IHdyaXRlLCB3aGljaCB3YXMgdGhpcyBmbG93J3Mgb3duIHZlcmRpY3RcbiAqIHN0YW1wLCBiZWNhdXNlIHRoZSBhbW91bnQgZmxvdydzIGVudHJ5IHRlc3RzIHRoZSBjdXJyZW50IHZhbHVlLlxuICovXG5leHBvcnQgY29uc3QgT3Bwb3J0dW5pdHlRdWFsaWZpY2F0aW9uQXBwcm92YWxGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnb3Bwb3J0dW5pdHlfcXVhbGlmaWNhdGlvbl9hcHByb3ZhbCcsXG4gIGxhYmVsOiAnT3Bwb3J0dW5pdHkgUXVhbGlmaWNhdGlvbiBBcHByb3ZhbCcsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdUaGUgXHU3QUNCXHU5ODc5IHNpZ24tb2ZmIGEgZGVhbCBuZWVkcyBiZWZvcmUgaXRzIHN0YWdlIG9yIHdvbi9sb3N0IGNhbGwgbWF5IGNoYW5nZS4gSW5lcnQgdW5sZXNzIHRoZSBpbnN0YWxsIGFybXMgdGhlIGdhdGUgb24gY3JtX29wcG9ydHVuaXR5LnF1YWxpZmljYXRpb25fYXBwcm92YWxfc3RhdHVzLicsXG4gIHR5cGU6ICdyZWNvcmRfY2hhbmdlJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gVGhlIHJlYWRpbmcgYm90aCBzaWJsaW5nIGdhdGVzIHJlY29yZCBmcm9tIGBvcHBvcnR1bml0eV9hcHByb3ZhbGAnc1xuICAvLyBtZWFzdXJlZCBmYWlsdXJlOiBhIGdhdGUgdGhhdCBlbmdhZ2VzIG9ubHkgZm9yIHdyaXRlcnMgY2FycnlpbmcgYSBzZXNzaW9uXG4gIC8vIGlzIG5vdCBhIGNvbnRyb2wuIFRoZSB2ZXJkaWN0IHdyaXRlcyBiZWxvdyBhbHNvIGxhbmQgb24gYSBjb2x1bW4gdGhlXG4gIC8vIHJlYWRvbmx5IHN0cmlwIHByb3RlY3RzLCB3aGljaCBvbmx5IGEgcGxhdGZvcm0gd3JpdGUgcmVhY2hlcy5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuXG4gIHZhcmlhYmxlczogW1xuICAgIHsgbmFtZTogJ29wcG9ydHVuaXR5SWQnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICBdLFxuXG4gIG5vZGVzOiBbXG4gICAge1xuICAgICAgaWQ6ICdzdGFydCcsXG4gICAgICB0eXBlOiAnc3RhcnQnLFxuICAgICAgbGFiZWw6ICdTdGFydCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgIHRyaWdnZXJUeXBlOiAncmVjb3JkLWFmdGVyLXVwZGF0ZScsXG4gICAgICAgIC8vIFRPVEFMSVRZIChBR0VOVFMubWQgXHUyMDE0IHZhbGlkYXRpb24gcHJlZGljYXRlcyBtdXN0IGJlIFRPVEFMKTogYGhhcygpYFxuICAgICAgICAvLyBvbiBldmVyeSByZWFkOyB0aGUgYWJzZW50IGNhc2UgcmVhZHMgYXMgXCJub3QgZ2F0ZWRcIi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhyZWUgaGFsdmVzLCB0aGUgc3RhdHVzLWNoYW5nZSBnYXRlJ3Mgb3duOlxuICAgICAgICAvL1xuICAgICAgICAvLyAtIHRoZSBnYXRlIGlzIEFSTUVEOiBgcGVuZGluZ2Agb3IgYHJlamVjdGVkYC4gYHJlamVjdGVkYCByZS1vcGVucyBvbiBhXG4gICAgICAgIC8vICAgbmV3IHJlcXVlc3QgYmVjYXVzZSB0aGUgaG9vayByZWZ1c2VzIHRoZSBnYXRlZCBhY3RzIGluIGJvdGggc3RhdGVzIFx1MjAxNFxuICAgICAgICAvLyAgIGlmIG9ubHkgYHBlbmRpbmdgIGVudGVyZWQgaGVyZSwgYSByZWplY3RlZCBkZWFsIGNvdWxkIG5ldmVyIHF1YWxpZnkuXG4gICAgICAgIC8vIC0gdGhlIHJlcXVlc3QgaXMgdGlja2VkO1xuICAgICAgICAvLyAtIHRoZSByZXF1ZXN0IGlzIE5FVyBvbiB0aGlzIHdyaXRlLiBUUkFOU0lUSU9OLCBub3QgY3VycmVudCB2YWx1ZTpcbiAgICAgICAgLy8gICB0aGUgYXBwcm92YWwgbm9kZSdzIGBwZW5kaW5nYCBzdGFtcCB0aHJvdWdoIGBhcHByb3ZhbFN0YXR1c0ZpZWxkYCBpc1xuICAgICAgICAvLyAgIGFuIHVwZGF0ZSBvZiB0aGlzIHJlY29yZCB3aGlsZSB0aGUgcmVxdWVzdCBpcyBzdGlsbCB0aWNrZWQsIGFuZCBhXG4gICAgICAgIC8vICAgY3VycmVudC12YWx1ZSB0ZXN0IHJlLWZpcmVzIG9uIGl0LiBNZWFzdXJlZCBvbiBhIDE3LjYuMCBib290IHdpdGhcbiAgICAgICAgLy8gICB0aGlzIHRlcm0gZGVsZXRlZDogb25lIHJlLWVudHJ5IHBlciByZXF1ZXN0LCBjYXVnaHQgb25seSBieSB0aGVcbiAgICAgICAgLy8gICBlbmdpbmUncyBzZWxmLXRyaWdnZXIgZ3VhcmQgKFwidGhlIGd1YXJkIGFzIGF1dGhvcmVkIGRvZXMgbm90XG4gICAgICAgIC8vICAgZXhjbHVkZSB0aGUgZmxvdydzIG93biB3cml0ZS1iYWNrXCIpOyB3aXRoIGl0LCBub25lLiBgcHJldmlvdXMuKmAgaXNcbiAgICAgICAgLy8gICBndWFyZGVkIEZBSUwtQ0xPU0VEOiBubyB2aXNpYmxlIHByaW9yIHZhbHVlLCBubyB2aXNpYmxlIG5ldyByZXF1ZXN0LlxuICAgICAgICAvL1xuICAgICAgICAvLyBgbWFya19xdWFsaWZpZWRgIGxlYXZlcyB0aGUgZ2F0ZSBgYXBwcm92ZWRgIChvdXQgb2YgcmVhY2gpIGFuZFxuICAgICAgICAvLyBgY2xlYXJfcmVxdWVzdGAgdW50aWNrcyB0aGUgcmVxdWVzdCwgc28gbmVpdGhlciByZS1lbnRlcnMuXG4gICAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnF1YWxpZmljYXRpb25fYXBwcm92YWxfc3RhdHVzKVxuICAgICAgICAgICYmIChyZWNvcmQucXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXMgPT0gXCJwZW5kaW5nXCIgfHwgcmVjb3JkLnF1YWxpZmljYXRpb25fYXBwcm92YWxfc3RhdHVzID09IFwicmVqZWN0ZWRcIilcbiAgICAgICAgICAmJiBoYXMocmVjb3JkLnF1YWxpZmljYXRpb25fcmVxdWVzdGVkKSAmJiByZWNvcmQucXVhbGlmaWNhdGlvbl9yZXF1ZXN0ZWQgPT0gdHJ1ZVxuICAgICAgICAgICYmIGhhcyhwcmV2aW91cy5xdWFsaWZpY2F0aW9uX3JlcXVlc3RlZCkgJiYgcHJldmlvdXMucXVhbGlmaWNhdGlvbl9yZXF1ZXN0ZWQgIT0gdHJ1ZWAsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdnZXRfb3Bwb3J0dW5pdHknLFxuICAgICAgdHlwZTogJ2dldF9yZWNvcmQnLFxuICAgICAgbGFiZWw6ICdHZXQgT3Bwb3J0dW5pdHknLFxuICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLCBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sIG91dHB1dFZhcmlhYmxlOiAnb3BwUmVjb3JkJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdxdWFsaWZpY2F0aW9uX3JldmlldycsXG4gICAgICB0eXBlOiAnYXBwcm92YWwnLFxuICAgICAgbGFiZWw6ICdRdWFsaWZpY2F0aW9uIFJldmlldycsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgLy8gVGhlIGN1c3RvbWVyJ3MgY2hhaW4gaXMgXHU5NTAwXHU1NTJFXHU4RDFGXHU4RDIzXHU0RUJBIC8gXHU0RThCXHU0RTFBXHU5MEU4XHU1QkExXHU2Mjc5XHU1Qzk3IFx1MjE5MiBcdTRFOEJcdTRFMUFcdTkwRThcdThEMUZcdThEMjNcdTRFQkE7IHRoZSBnZW5lcmljXG4gICAgICAgIC8vIHNoYXBlIGNvcmUgc2hpcHMgaXMgdGhlIG1hbmFnZXIgYmVuY2ggYm90aCBzaWJsaW5nIGdhdGVzIHJvdXRlIHRvLiBBXG4gICAgICAgIC8vIHNlY29uZCB0aWVyLCBvciBhIGRpZmZlcmVudCBwb3NpdGlvbiwgaXMgb3ZlcmxheSBjb25maWd1cmF0aW9uXG4gICAgICAgIC8vIChSRVEtMDAwNjogdGhlIG5hbWVkIGFwcHJvdmFsIGNoYWlucyBhcmUgQykuXG4gICAgICAgIGFwcHJvdmVyczogW3sgdHlwZTogJ3Bvc2l0aW9uJywgdmFsdWU6ICdzYWxlc19tYW5hZ2VyJyB9XSxcbiAgICAgICAgLy8gRXhwbGljaXQgdGhvdWdoIGl0IGlzIHRoZSBzY2hlbWEgZGVmYXVsdCwgYXMgZXZlcnkgc2libGluZyBhdXRob3JzXG4gICAgICAgIC8vIGl0OiBhbiBlbXB0eSBiZW5jaCB3b3VsZCBsZWF2ZSB0aGUgcmVxdWVzdCB1bmRlY2lkYWJsZSBcdTIwMTQgaGVyZSwgYVxuICAgICAgICAvLyBkZWFsIHRoYXQgY2FuIG5ldmVyIG1vdmUgaXRzIHN0YWdlLlxuICAgICAgICBvbkVtcHR5QXBwcm92ZXJzOiAnYWRtaW5fcmVzY3VlJyxcbiAgICAgICAgYmVoYXZpb3I6ICdmaXJzdF9yZXNwb25zZScsXG4gICAgICAgIC8vIFx1MjZBMFx1RkUwRiBgZmFsc2VgLCBOT1QgdGhlIHN0YXR1cy1jaGFuZ2UgZ2F0ZSdzIGB0cnVlYCBcdTIwMTQgdGhlIG9uZSB0ZXJtIHRoaXNcbiAgICAgICAgLy8gbm9kZSBkZWxpYmVyYXRlbHkgdGFrZXMgZnJvbSB0aGUgTEVBRCBnYXRlIGluc3RlYWQuIFN0ZXAgMTEgc2F5cyBpdFxuICAgICAgICAvLyBpbiBhcyBtYW55IHdvcmRzOiBcdTMwMENcdTY1QjBcdTU4OUVcdTU1NDZcdTY3M0FcdTUzRUZcdThEREZcdThGREJcdTMwMEQuIEEgZGVhbCBhd2FpdGluZyBcdTdBQ0JcdTk4NzkgaXMgc3RpbGwgYmVpbmdcbiAgICAgICAgLy8gd29ya2VkIFx1MjAxNCB0aGUgbmFycmF0aXZlLCB0aGUgY3VzdG9tZXIgY2FsZW5kYXIsIHRoZSBhbW91bnQgYW5kIFdpbGxcbiAgICAgICAgLy8gQmlkIGFyZSB3aGF0IHRoZSBhcHByb3ZlciByZWFkcyBcdTIwMTQgYW5kIGxvY2tpbmcgaXQgd291bGQgc3RvcCB0aGF0IHdvcmtcbiAgICAgICAgLy8gZm9yIGFzIGxvbmcgYXMgdGhlIGFwcHJvdmVyIHRha2VzLiBUaGUgdHdvIGFjdHMgdGhlIGdhdGUgZXhpc3RzIHRvIGhvbGRcbiAgICAgICAgLy8gYXJlIHJlZnVzZWQgYnkgYG9wcG9ydHVuaXR5X2xpZmVjeWNsZWAgd2hldGhlciBvciBub3QgYSByZXF1ZXN0IGlzXG4gICAgICAgIC8vIG9wZW4sIHNvIHRoZSBsb2NrIHdvdWxkIGFkZCBub3RoaW5nIGJ1dCB0aGUgZnJlZXplLlxuICAgICAgICBsb2NrUmVjb3JkOiBmYWxzZSxcbiAgICAgICAgYXBwcm92YWxTdGF0dXNGaWVsZDogJ3F1YWxpZmljYXRpb25fYXBwcm92YWxfc3RhdHVzJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ21hcmtfcXVhbGlmaWVkJyxcbiAgICAgIHR5cGU6ICd1cGRhdGVfcmVjb3JkJyxcbiAgICAgIGxhYmVsOiAnTWFyayBRdWFsaWZpZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBxdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1czogJ2FwcHJvdmVkJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEEgcmVqZWN0ZWQgcmVxdWVzdCBpcyBjbGVhcmVkLCBub3QgbGVmdCBzdGFuZGluZywgYW5kIHRoZSB2ZXJkaWN0IHN0YXlzXG4gICAgICAvLyBgcmVqZWN0ZWRgIHNvIHRoZSBob29rIGtlZXBzIHJlZnVzaW5nIHRoZSBnYXRlZCBhY3RzOiB0aGUgd2F5IG9uIGlzIGFcbiAgICAgIC8vIG5ldyByZXF1ZXN0LCB3aGljaCB0aGUgc3RhcnQgY29uZGl0aW9uIG9wZW5zIGFzIGEgZnJlc2ggYXBwcm92YWwuXG4gICAgICBpZDogJ2NsZWFyX3JlcXVlc3QnLFxuICAgICAgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLFxuICAgICAgbGFiZWw6ICdDbGVhciBSZWplY3RlZCBSZXF1ZXN0JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgICAgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkLmlkYCB9LFxuICAgICAgICBmaWVsZHM6IHsgcXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXM6ICdyZWplY3RlZCcsIHF1YWxpZmljYXRpb25fcmVxdWVzdGVkOiBmYWxzZSB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG5cbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ2dldF9vcHBvcnR1bml0eScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ2dldF9vcHBvcnR1bml0eScsIHRhcmdldDogJ3F1YWxpZmljYXRpb25fcmV2aWV3JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gQXBwcm92YWwtbm9kZSBicmFuY2ggbGFiZWxzLlxuICAgIHsgaWQ6ICdlMycsIHNvdXJjZTogJ3F1YWxpZmljYXRpb25fcmV2aWV3JywgdGFyZ2V0OiAnbWFya19xdWFsaWZpZWQnLCB0eXBlOiAnZGVmYXVsdCcsIGxhYmVsOiAnYXBwcm92ZScgfSxcbiAgICB7IGlkOiAnZTQnLCBzb3VyY2U6ICdxdWFsaWZpY2F0aW9uX3JldmlldycsIHRhcmdldDogJ2NsZWFyX3JlcXVlc3QnLCB0eXBlOiAnZGVmYXVsdCcsIGxhYmVsOiAncmVqZWN0JyB9LFxuICAgIHsgaWQ6ICdlNScsIHNvdXJjZTogJ21hcmtfcXVhbGlmaWVkJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U2Jywgc291cmNlOiAnY2xlYXJfcmVxdWVzdCcsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL29wcG9ydHVuaXR5LXN0YWduYXRpb24uZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9vcHBvcnR1bml0eS1zdGFnbmF0aW9uLmZsb3cudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IFAsIGNlbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcbmltcG9ydCB7IGd1YXJkZWQgfSBmcm9tICcuL19ndWFyZGVkLWl0ZXJhdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogT3Bwb3J0dW5pdHkgU3RhZ25hdGlvbiBcdTIwMTQgc2NoZWR1bGVkIFwiZGVhbC1yb3RcIiBkZXRlY3Rvci5cbiAqXG4gKiBUaGlzIGRhaWx5IHN3ZWVwIGlzIHdoYXQgYWN0cyBvbiBgc3RhZ2VfZW50cnlfZGF0ZWAgKHN0YW1wZWQgYnkgdGhlIGxpZmVjeWNsZVxuICogaG9vayBvbiBpbnNlcnQgYW5kIG9uIGV2ZXJ5IHN0YWdlIGNoYW5nZSk6IGl0IGZpbmRzIG9wZW4gb3Bwb3J0dW5pdGllc1xuICogc3RhbGxlZCBsb25nZXIgdGhhbiB0aGUgdGhyZXNob2xkLCBudWRnZXMgdGhlIG93bmVyIGFuZCBib29rcyBhIGZvbGxvdy11cFxuICogdGFzayBzbyB0aGUgZGVhbCByZS1lbnRlcnMgdGhlIHdvcmtpbmcgc2V0LiBBIGRlYWwgd2l0aCBhblxuICogb3BlbiBzdGFsbCB0YXNrIGlzIHNraXBwZWQgKGlkZW1wb3RlbmN5KSwgc28gZWFjaCBzdGFsbCBlcGlzb2RlIHByb2R1Y2VzXG4gKiBleGFjdGx5IG9uZSBudWRnZTsgY29tcGxldGluZyB0aGUgdGFzayByZS1hcm1zIGl0LlxuICpcbiAqIENhcGFiaWxpdGllcyBleGVyY2lzZWQ6IHNjaGVkdWxlZCB0cmlnZ2VyICsgYGxvb3BgICsgYG5vdGlmeWAgKyB0YXNrXG4gKiBjcmVhdGlvbi4gUGlwZWxpbmUtaHlnaWVuZSBhdXRvbWF0aW9uIGlzIG9uZSBvZiB0aGUgaGlnaGVzdC1ST0kgdXNlcyBvZlxuICogRmxvd3MgaW4gYSBzYWxlcyBvcmcuXG4gKi9cbmNvbnN0IFNUQUxFX1RIUkVTSE9MRF9EQVlTID0gMTQ7XG5cbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eVN0YWduYXRpb25GbG93OiBGbG93ID0ge1xuICBuYW1lOiAnb3Bwb3J0dW5pdHlfc3RhZ25hdGlvbicsXG4gIGxhYmVsOiAnU3RhbGxlZCBEZWFsIEFsZXJ0JyxcbiAgZGVzY3JpcHRpb246ICdEYWlseSBzd2VlcDogbnVkZ2Ugb3duZXJzIGFib3V0IG9wZW4gb3Bwb3J0dW5pdGllcyBzdHVjayBpbi1zdGFnZSBiZXlvbmQgdGhlIHRocmVzaG9sZC4nLFxuICB0eXBlOiAnc2NoZWR1bGUnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBTY2hlZHVsZWQgcnVucyBoYXZlIG5vIHRyaWdnZXIgdXNlciwgc28gdW5kZXIgdGhlIGRlZmF1bHQgcnVuQXM6J3VzZXInIHRoZVxuICAvLyBkYXRhIG5vZGVzIGV4ZWN1dGUgVU5TQ09QRUQgYW55d2F5LiBEZWNsYXJlIHJ1bkFzOidzeXN0ZW0nIHRvIG1ha2UgdGhhdFxuICAvLyBSTFMtYnlwYXNzaW5nIGVsZXZhdGlvbiBleHBsaWNpdCBhbmQgaW50ZW5kZWQgKEFEUi0wMDQ5KS5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuXG4gIHZhcmlhYmxlczogW10sXG5cbiAgbm9kZXM6IFtcbiAgICB7IGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0IChkYWlseSAwNzozMCknLCBjb25maWc6IHsgc2NoZWR1bGU6ICczMCA3ICogKiAqJyB9IH0sXG4gICAge1xuICAgICAgaWQ6ICdxdWVyeV9zdGFsbGVkJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0ZpbmQgU3RhbGxlZCBEZWFscycsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgIC8vIFx1MjZENCBQcmVkaWNhdGUgb24gdGhlIFNUT1JFRCBgc3RhZ2VfZW50cnlfZGF0ZWAsIG5ldmVyIG9uXG4gICAgICAgIC8vIGBkYXlzX2luX3N0YWdlYDogdGhlIGxhdHRlciBpcyBhIGZvcm11bGEsIGNvbXB1dGVkIGFmdGVyIHRoZSBxdWVyeSwgc29cbiAgICAgICAgLy8gYXMgYSBmaWx0ZXIga2V5IGl0IGFkZHJlc3NlcyBhIGNvbHVtbiB0aGF0IGRvZXMgbm90IGV4aXN0LlxuICAgICAgICAvLyBgZW50cnkgPCB0b2RheSBcdTIyMTIgTmBcbiAgICAgICAgLy8gaXMgdGhlIHNhbWUgdGVzdCBhcyBgZGF5c19pbl9zdGFnZSA+IE5gLCBjb21wdXRlZCBieSBhIENFTCB2YWx1ZVxuICAgICAgICAvLyBlbnZlbG9wZSAodGhlIGBpc29EYXRlKGRheXNBZ28obikpYCBzcGVsbGluZzsgY29udHJhY3QtcmVuZXdhbCB1c2VzXG4gICAgICAgIC8vIGl0cyBgZGF5c0Zyb21Ob3dgIHR3aW4pLlxuICAgICAgICAvLyBBIHJvdyB3aXRoIGEgbnVsbCBgc3RhZ2VfZW50cnlfZGF0ZWAgZG9lcyBub3Qgc2F0aXNmeSBgJGx0YCBhbmQgaXNcbiAgICAgICAgLy8gc2tpcHBlZCwgcHJlc2VydmluZyBcIm5vdGhpbmcgaGFzIHN0YWduYXRlZCB5ZXRcIiBmb3IgdW5zdGFtcGVkIHJvd3MuXG4gICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgIHN0YWdlOiB7ICRuaW46IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0sXG4gICAgICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogeyAkbHQ6IGNlbGBpc29EYXRlKGRheXNBZ28oJHtTVEFMRV9USFJFU0hPTERfREFZU30pKWAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbGltaXQ6IDUwMCxcbiAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdvcHBMaXN0JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2xvb3Bfb3BwcycsIHR5cGU6ICdsb29wJywgbGFiZWw6ICdGb3IgRWFjaCBTdGFsbGVkIERlYWwnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGNvbGxlY3Rpb246IGNlbGBvcHBMaXN0YCxcbiAgICAgICAgaXRlcmF0b3JWYXJpYWJsZTogJ2N1cnJlbnRPcHAnLFxuICAgICAgICBib2R5OiBndWFyZGVkKCdvcHAnLCB7XG4gICAgICAgICAgbm9kZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gSWRlbXBvdGVuY3kgZ2F0ZTogYSBzdGlsbC1vcGVuIHN0YWxsIHRhc2sgbWVhbnMgdGhpcyBkZWFsIHdhc1xuICAgICAgICAgICAgICAvLyBhbHJlYWR5IG51ZGdlZC4gXHUyNkQ0IFdpdGhvdXQgaXQgdGhlIGRhaWx5IHN3ZWVwIHJlLW5vdGlmaWVzIGFuZFxuICAgICAgICAgICAgICAvLyByZS1jcmVhdGVzIGFuIGlkZW50aWNhbCB0YXNrIGV2ZXJ5IG1vcm5pbmcgZm9yIGFzIGxvbmcgYXMgdGhlXG4gICAgICAgICAgICAgIC8vIGRlYWwgc3RheXMgc3RhbGxlZCBcdTIwMTQgYW4gdW5ib3VuZGVkIGR1cGxpY2F0ZSBwaWxlLXVwLlxuICAgICAgICAgICAgICBpZDogJ2ZpbmRfZXhpc3RpbmdfdGFzaycsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdBbHJlYWR5IE51ZGdlZD8nLFxuICAgICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX3Rhc2snLFxuICAgICAgICAgICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgICAgICAgICAgcmVsYXRlZF90b19vcHBvcnR1bml0eTogY2VsYGN1cnJlbnRPcHAuaWRgLFxuICAgICAgICAgICAgICAgICAgc3ViamVjdDogY2VsYCdBZHZhbmNlIHN0YWxsZWQgZGVhbDogJyArIGN1cnJlbnRPcHAubmFtZWAsXG4gICAgICAgICAgICAgICAgICBzdGF0dXM6IHsgJG5pbjogWydjb21wbGV0ZWQnXSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdleGlzdGluZ1N0YWxsVGFzaycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBHYXRld2F5IG9ubHkgXHUyMDE0IHRoZSBwcmVkaWNhdGUgbGl2ZXMgb24gdGhlIG91dC1lZGdlLlxuICAgICAgICAgICAgICBpZDogJ2NoZWNrX25vdF9udWRnZWQnLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0ZpcnN0IE51ZGdlPycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBPd25lciBvbmx5OiBge2N1cnJlbnRPcHAub3duZXJfaWQubWFuYWdlcn1gIGNhbm5vdCB0cmF2ZXJzZSBhXG4gICAgICAgICAgICAgIC8vIGxvb2t1cCBpbiBmbG93IHRlbXBsYXRlcyBcdTIwMTQgaXQgaW50ZXJwb2xhdGVzIHRvIHRoZSBsaXRlcmFsXG4gICAgICAgICAgICAgIC8vIFwidW5kZWZpbmVkXCIgKGNmLiBvcHBvcnR1bml0eV93b25fYWxlcnQpLlxuICAgICAgICAgICAgICBpZDogJ25vdGlmeV9vd25lcicsIHR5cGU6ICdub3RpZnknLCBsYWJlbDogJ051ZGdlIE93bmVyJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgcmVjaXBpZW50czogW2NlbGBoYXMoY3VycmVudE9wcC5vd25lcl9pZCkgPyBjdXJyZW50T3BwLm93bmVyX2lkIDogbnVsbGBdLFxuICAgICAgICAgICAgICAgIGNoYW5uZWxzOiBbJ2luYm94JywgJ2VtYWlsJ10sXG4gICAgICAgICAgICAgICAgdG9waWM6ICdkZWFsX3N0YWxsZWQnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnY3JtLmRlYWxfc3RhbGxlZCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVEYXRhOiB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBjZWxgY3VycmVudE9wcC5uYW1lYCwgc3RhZ2U6IGNlbGBjdXJyZW50T3BwLnN0YWdlYCxcbiAgICAgICAgICAgICAgICAgIGRheXNfaW5fc3RhZ2U6IGNlbGBjdXJyZW50T3BwLmRheXNfaW5fc3RhZ2VgLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWN0aW9uVXJsOiAnL2NybV9vcHBvcnR1bml0eS97e2N1cnJlbnRPcHAuaWR9fScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogJ2NyZWF0ZV9mb2xsb3d1cF90YXNrJywgdHlwZTogJ2NyZWF0ZV9yZWNvcmQnLCBsYWJlbDogJ0NyZWF0ZSBGb2xsb3ctdXAgVGFzaycsXG4gICAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fdGFzaycsXG4gICAgICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgICAgICBzdWJqZWN0OiBjZWxgJ0FkdmFuY2Ugc3RhbGxlZCBkZWFsOiAnICsgY3VycmVudE9wcC5uYW1lYCxcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdmb2xsb3dfdXAnLCBwcmlvcml0eTogJ2hpZ2gnLCBzdGF0dXM6ICdub3Rfc3RhcnRlZCcsXG4gICAgICAgICAgICAgICAgICBkdWVfZGF0ZTogY2VsYGlzb0RhdGUoZGF5c0Zyb21Ob3coMikpYCxcbiAgICAgICAgICAgICAgICAgIG93bmVyX2lkOiBjZWxgaGFzKGN1cnJlbnRPcHAub3duZXJfaWQpID8gY3VycmVudE9wcC5vd25lcl9pZCA6IG51bGxgLFxuICAgICAgICAgICAgICAgICAgLy8gT1JHIFBBUlRJVElPTi4gQSBzY2hlZHVsZSB0cmlnZ2VyIGNhcnJpZXMgbm9cbiAgICAgICAgICAgICAgICAgIC8vIG9yZ2FuaXphdGlvbiwgc28gd2l0aG91dCB0aGlzIHRoZSBudWRnZSB0YXNrIGlzIGJvcm5cbiAgICAgICAgICAgICAgICAgIC8vIGBvcmdhbml6YXRpb25faWRgIE5VTEwgXHUyMDE0IG91dHNpZGUgZXZlcnkgb3JnIHBhcnRpdGlvbi5cbiAgICAgICAgICAgICAgICAgIC8vIFVwc3RyZWFtIHJ1bGluZyBvYmplY3RzdGFjayM2MTU1IFEyPUEgYXNzaWducyB0aGUgYW5zd2VyIHRvXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgZmxvdyBhdXRob3I7IHRoZSB0YXNrIGJlbG9uZ3MgdG8gdGhlIG9yZyBvZiB0aGUgZGVhbCBpdFxuICAgICAgICAgICAgICAgICAgLy8gbnVkZ2VzLiBgY3JtX29wcG9ydHVuaXR5YCBjYXJyaWVzIHRoZSBjb2x1bW4sIHNvIHRoZSByZWFkXG4gICAgICAgICAgICAgICAgICAvLyByZXNvbHZlcy4gSXQgaXMgZGVsaWJlcmF0ZWx5IFVOR1VBUkRFRDogb24gMTcueCBhIHNvdXJjZVxuICAgICAgICAgICAgICAgICAgLy8gbGFja2luZyBpdCBpbnRlcnBvbGF0ZWQgdG8gYHVuZGVmaW5lZGAgYW5kIGxhbmRlZCBhcyBOVUxMXG4gICAgICAgICAgICAgICAgICAvLyB3aGlsZSBsb29raW5nIGRlY2xhcmVkOyBDRUwgZmFpbHMgdGhlIGl0ZXJhdGlvbiBpbnN0ZWFkLCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIGEgYGhhcygpYCBndWFyZCB3b3VsZCB3cml0ZSB0aGF0IE5VTEwgYmFjay5cbiAgICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbl9pZDogY2VsYGN1cnJlbnRPcHAub3JnYW5pemF0aW9uX2lkYCxcbiAgICAgICAgICAgICAgICAgIHJlbGF0ZWRfdG9fdHlwZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICAgICByZWxhdGVkX3RvX29wcG9ydHVuaXR5OiBjZWxgY3VycmVudE9wcC5pZGAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBlZGdlczogW1xuICAgICAgICAgICAgeyBpZDogJ2IxJywgc291cmNlOiAnZmluZF9leGlzdGluZ190YXNrJywgdGFyZ2V0OiAnY2hlY2tfbm90X251ZGdlZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgICAgLy8gXCJBbHJlYWR5IG51ZGdlZFwiIGhhcyBubyBlZGdlLCBzbyB0aGUgbG9vcCBtb3ZlcyB0byB0aGUgbmV4dCBpdGVtLlxuICAgICAgICAgICAgLy8gVGhpcyBlZGdlIGlzIHRoZSBPTkxZIHNpdGUgZm9yIHRoZSBwcmVkaWNhdGU6IGEgYGRlY2lzaW9uYFxuICAgICAgICAgICAgLy8gbm9kZSdzIHNpbmd1bGFyIGBjb25maWcuY29uZGl0aW9uYCBpcyBuZXZlciByZWFkLCBzbyBhIG5vZGUgY29weVxuICAgICAgICAgICAgLy8gd291bGQgYmUgaW5lcnQgbWV0YWRhdGEgZnJlZSB0byBkcmlmdCBhd2F5IGZyb20gd2hhdCBydW5zLlxuICAgICAgICAgICAgeyBpZDogJ2IyJywgc291cmNlOiAnY2hlY2tfbm90X251ZGdlZCcsIHRhcmdldDogJ25vdGlmeV9vd25lcicsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGBleGlzdGluZ1N0YWxsVGFzayA9PSBudWxsYCwgbGFiZWw6ICdGaXJzdCBudWRnZScgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiMycsIHNvdXJjZTogJ25vdGlmeV9vd25lcicsIHRhcmdldDogJ2NyZWF0ZV9mb2xsb3d1cF90YXNrJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIHsgaWQ6ICdlMScsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAncXVlcnlfc3RhbGxlZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ3F1ZXJ5X3N0YWxsZWQnLCB0YXJnZXQ6ICdsb29wX29wcHMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdsb29wX29wcHMnLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9mb3JlY2FzdC1zbmFwc2hvdC5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL2ZvcmVjYXN0LXNuYXBzaG90LmZsb3cudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IFAsIGV4cHJlc3Npb24sIGNlbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcbmltcG9ydCB7IGd1YXJkZWQgfSBmcm9tICcuL19ndWFyZGVkLWl0ZXJhdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogRm9yZWNhc3QgU25hcHNob3QgXHUyMDE0IG5pZ2h0bHkgcGVyLW93bmVyIHBpcGVsaW5lIHNuYXBzaG90IGludG8gYGNybV9mb3JlY2FzdGAuXG4gKlxuICogYGZvcmVjYXN0Lmhvb2sudHNgIG9ubHkgREVSSVZFUyBmaWVsZHMgb24gYSByb3cgc29tZW9uZSBlbHNlIGNyZWF0ZXMsIHNvIHRoaXNcbiAqIHN3ZWVwIGlzIHdoYXQgY3JlYXRlcyB0aGVtLiBXaXRob3V0IGl0IHRoZSBmb3JlY2FzdCBvYmplY3QsIGl0c1xuICogYGF0dGFpbm1lbnRfcGN0YCAvIGBjb3ZlcmFnZV9yYXRpb2AgZm9ybXVsYXMsIHRoZSBgZm9yZWNhc3RfbWV0cmljc2AgZGF0YXNldFxuICogYW5kIHRoZSBkYXNoYm9hcmQncyBxdW90YS1hdHRhaW5tZW50IHRhYmxlIGFsbCBydW4gb24gaGFuZC1zZWVkZWQgZGVtbyByb3dzLlxuICpcbiAqICMjIEJ1Y2tldHNcbiAqXG4gKiBBbW91bnRzIGFyZSBhZ2dyZWdhdGVkIGZyb20gYGNybV9vcHBvcnR1bml0eWAgYnkgYGZvcmVjYXN0X2NhdGVnb3J5YCBcdTIwMTQgdGhlXG4gKiBzdG9yZWQsIGluZGV4ZWQgY29sdW1uIHRoZSBvcHBvcnR1bml0eSBsaWZlY3ljbGUgaG9vayBkZXJpdmVzIGZyb20gYHN0YWdlYCxcbiAqIGFuZCB0aGUgc2FtZSBjb2x1bW4gdGhlIFwiQ29tbWl0ICYgQmVzdCBDYXNlXCIgbGlzdCB2aWV3IGFuZCB0aGVcbiAqIGBwaXBlbGluZV9ieV9mb3JlY2FzdF9jYXRlZ29yeWAgZGFzaGJvYXJkIHdpZGdldCBhbHJlYWR5IGdyb3VwIG9uLiBcdTI2RDQgTmV2ZXJcbiAqIHJlYWQgdGhlIHNuYXBzaG90IG9mZiBgcHJvYmFiaWxpdHlgIGluc3RlYWQ6IHRoYXQgY3JlYXRlcyBhIFNFQ09ORCBkZWZpbml0aW9uXG4gKiBvZiBcImNvbW1pdFwiIHRoYXQgc2lsZW50bHkgZGlzYWdyZWVzIHdpdGggdGhvc2Ugc3VyZmFjZXMuXG4gKlxuICogVGhlIGJ1Y2tldHMgYXJlIENVTVVMQVRJVkUsIHRoZSBzdGFuZGFyZCBmb3JlY2FzdCBsYWRkZXIgXHUyMDE0IGFuZCB0aGUgc2hhcGUgdGhlXG4gKiBvYmplY3QncyBvd24gZmllbGRzIGFscmVhZHkgYXNzdW1lIChgcGlwZWxpbmVgIGlzIFwiYWxsIG9wZW4gb3Bwb3J0dW5pdGllc1wiLFxuICogc28gaXQgbmVjZXNzYXJpbHkgY29udGFpbnMgdGhlIG90aGVyIHR3byksIHRoZSBzZWVkZWQgbWFnbml0dWRlcyBzaG93XG4gKiAocGlwZWxpbmUgPiBiZXN0IGNhc2UgPiBjb21taXQpLCBhbmQgdGhlIG9wcG9ydHVuaXR5IGBjbG9zaW5nX3RoaXNfcXVhcnRlcmBcbiAqIHZpZXcgc3BlbGxzIG91dCBieSB0cmVhdGluZyBgWydjb21taXQnLCAnYmVzdF9jYXNlJ11gIGFzIG9uZSBidWNrZXQ6XG4gKlxuICogICBwaXBlbGluZV9hbW91bnQgIFx1MjE5MiBldmVyeSBPUEVOIG9wcG9ydHVuaXR5IGNsb3NpbmcgaW4gdGhlIHBlcmlvZFxuICogICBiZXN0X2Nhc2VfYW1vdW50IFx1MjE5MiBvcGVuLCBmb3JlY2FzdF9jYXRlZ29yeSBcdTIyMDggeyBiZXN0X2Nhc2UsIGNvbW1pdCB9XG4gKiAgIGNvbW1pdF9hbW91bnQgICAgXHUyMTkyIG9wZW4sIGZvcmVjYXN0X2NhdGVnb3J5ID0gY29tbWl0XG4gKiAgIGNsb3NlZF9hbW91bnQgICAgXHUyMTkyIHN0YWdlID0gY2xvc2VkX3dvbiwgY2xvc2luZyBpbiB0aGUgcGVyaW9kXG4gKlxuICogYHF1b3RhYCBpcyBkZWxpYmVyYXRlbHkgbmV2ZXIgd3JpdHRlbjogaXQgaXMgbWFpbnRhaW5lZCBieSBoYW5kIHVudGlsIGFcbiAqIHF1b3RhIG1vZGVsIGV4aXN0cywgYW5kIGEgc3dlZXAgdGhhdCByZXNldCBpdCBldmVyeSBuaWdodCB3b3VsZCBlcmFzZSB0aGVcbiAqIGRlbm9taW5hdG9yIG9mIGBhdHRhaW5tZW50X3BjdGAuXG4gKlxuICogIyMgU2hhcGVcbiAqXG4gKiBQZXIgb3duZXI6IGVuc3VyZSB0aGUgY3VycmVudC1wZXJpb2Qgcm93IGV4aXN0cywgcmUtcmVhZCBpdCwgdGhlbiBzdW0gZm91clxuICogc2NvcGVkIHF1ZXJpZXMgaW50byBpdC4gVHdvIHRoaW5ncyBmb3JjZSB0aGF0IG9yZGVyaW5nLlxuICpcbiAqIDEuIFRoZSBwZXJpb2Qgd2luZG93IGlzIERBVEEsIG5vdCBhcml0aG1ldGljLiBUaGUgMTcueCBmbG93IHRlbXBsYXRlXG4gKiAgICByZXNvbHZlZCBge1RPREFZKCl9YCBhbmQgZGF5IG9mZnNldHMgb25seSBcdTIwMTQgaXQgY291bGQgbm90IHNheSBcInRoZSBmaXJzdFxuICogICAgZGF5IG9mIHRoaXMgY2FsZW5kYXIgcXVhcnRlclwiLiBTbyB0aGUgZmxvdyBzZWxlY3RzIHRoZSByb3cgd2hvc2Ugd2luZG93XG4gKiAgICBDT05UQUlOUyB0b2RheSAoYHBlcmlvZF9zdGFydCA8PSB0b2RheSA8PSBwZXJpb2RfZW5kYCksIGxldHMgYGZvcmVjYXN0Lmhvb2sudHNgXG4gKiAgICBkZXJpdmUgYSBjYWxlbmRhci10cnVlIHdpbmRvdyBvbiBjcmVhdGUsIGFuZCB0aGVuIHJlYWRzIHRoZSBib3VuZGFyaWVzXG4gKiAgICBiYWNrIG9mZiB0aGUgcm93IHRvIHNjb3BlIHRoZSBvcHBvcnR1bml0eSBxdWVyaWVzLiBPbmUgZGVmaW5pdGlvbiBvZiBcInRoZVxuICogICAgY3VycmVudCBwZXJpb2RcIiwgb3duZWQgYnkgdGhlIG9iamVjdC5cbiAqIDIuIFN1bXMgY29tZSBmcm9tIGZvdXIgc2VwYXJhdGUgYGdldF9yZWNvcmRgICsgYGxvb3BgIHBhaXJzIHJhdGhlciB0aGFuIG9uZVxuICogICAgcXVlcnkgd2l0aCBpbi1sb29wIGJyYW5jaGluZy4gQSBmaWx0ZXIgaXMgcGxhaW4gbWV0YWRhdGEsIHNvIHRoZSBidWNrZXRcbiAqICAgIGRlZmluaXRpb25zIHN0YXkgZGVjbGFyYXRpdmUgYW5kIGdyZXBwYWJsZTsgdGhlIGFjY3VtdWxhdG9ycyBzdGF5IHB1cmVcbiAqICAgIENFTCBhcml0aG1ldGljIChzZWUgYHN1bUJ1Y2tldGApLlxuICpcbiAqIElkZW1wb3RlbmN5OiB0aGUgcm93IGlzIGtleWVkIGJ5IChvd25lciwgcGVyaW9kLCBjb250YWluaW5nIHdpbmRvdyksIHNvIGFcbiAqIHJlLXJ1biBmaW5kcyBpdCBhbmQgT1ZFUldSSVRFUyB0aGUgYW1vdW50cyBpbnN0ZWFkIG9mIGluc2VydGluZyBhIHNlY29uZFxuICogcm93IFx1MjAxNCB0aGUgc2FtZSB1cHNlcnQgZGlzY2lwbGluZSBhcyBgY29udHJhY3RfcmVuZXdhbGAgL1xuICogYG9wcG9ydHVuaXR5X3N0YWduYXRpb25gLiBSZS1ydW5uaW5nIGlzIGhvdyBhIHNuYXBzaG90IHN0YXlzIGN1cnJlbnQsIGFuZCBpdFxuICogaXMgdGhlIG9ubHkgd2F5IGFuIGFtb3VudCBldmVyIGRlY3JlYXNlcy5cbiAqXG4gKiAjIyBUd28gcXVlc3Rpb25zLCB0d28gc2NvcGVzIFx1MjAxNCBhIG1hbnVhbCBmb3JlY2FzdCBTVVBQUkVTU0VTIHRoZSBzd2VlcFxuICpcbiAqIFx1MjZENCBOZXZlciBhbnN3ZXIgYm90aCBxdWVzdGlvbnMgd2l0aCBvbmUgZmlsdGVyLiBUaGUgd2luZG93IGFuc3dlcnMgXCJoYXMgdGhpc1xuICogcGVyaW9kIGJlZW4gaGFuZGxlZD9cIiBhbmQgZG9lcyBOT1QgYW5zd2VyIFwid2hpY2ggcm93IGRvIEkgb3duP1wiLiBVc2VkIGZvclxuICogYm90aCwgaXQgZGVzdHJveXMgYSBtYW5hZ2VyJ3MgdHlwZWQgbnVtYmVyczogYHNvdXJjZTogJ21hbnVhbCdgIGlzIG9uZSBvZlxuICogdGhyZWUgZG9jdW1lbnRlZCBvcmlnaW5zLCBhbmQgYSBoYW5kLWVudGVyZWQgY3VycmVudC1xdWFydGVyIHJvdyBzYXRpc2ZpZXMgdGhlXG4gKiB3aW5kb3cgZmlsdGVyIGV4YWN0bHkgYXMgdGhlIHN3ZWVwJ3Mgb3duIHJvdyBkb2VzLCBzaW5jZSBib3RoIGVuZHMgb2YgdGhlXG4gKiB3aW5kb3cgYXJlIHBpbm5lZCB0byB0aGUgY2FsZW5kYXIgcXVhcnRlci4gVGhlIHN3ZWVwIHRoZW4gYWRvcHRzIGl0LFxuICogb3ZlcndyaXRlcyB0aGUgZm91ciBhbW91bnRzLCByZXN0YW1wcyBgc25hcHNob3RfZGF0ZWAgYW5kIGZsaXBzIGBzb3VyY2VgIHRvXG4gKiBgc2NoZWR1bGVkYC4gYHF1b3RhYCBzdXJ2aXZlcyAoaXQgaXMgbmV2ZXIgd3JpdHRlbiksIHNvIGF0dGFpbm1lbnQgc2lsZW50bHlcbiAqIHJlLWJhc2VzIG9udG8gc3dlcHQgbnVtYmVycyBhbmQgdGhlIHJvdyBzdGlsbCBsb29rcyBwbGF1c2libGUuXG4gKlxuICogU28gdGhlIHR3byBqb2JzIHJlYWQgdGhyb3VnaCB0d28gZmlsdGVyczpcbiAqXG4gKiAgIGdhdGUgIChgZmluZF9mb3JlY2FzdGApICAgXHUyMTkyIENVUlJFTlRfUEVSSU9EX0ZJTFRFUiBcdTIwMTQgQU5ZIHJvdyBpbiB0aGUgd2luZG93LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWFsIGluY2x1ZGVkLiBcIkhhbmRsZWRcIiBpcyBhYm91dCB0aGUgcGVyaW9kLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGFib3V0IHdobyBoYW5kbGVkIGl0LlxuICogICB3cml0ZSAoYHJlbG9hZF9mb3JlY2FzdGApIFx1MjE5MiBPV05FRF9QRVJJT0RfRklMVEVSICBcdTIwMTQgb25seSByb3dzIHRoZSBzd2VlcFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JvdGUgKGBzb3VyY2U6ICdzY2hlZHVsZWQnYCkuXG4gKlxuICogYW5kIGBjaGVja19vd25lZGAgdHVybnMgXCJ0aGUgd2luZG93IGlzIGhhbmRsZWQsIGJ1dCBub3QgYnkgYSByb3cgSSBvd25cIiBpbnRvXG4gKiBhIHN0YW5kLWRvd246IG5vIHdyaXRlLCBhbmQgXHUyMDE0IGVxdWFsbHkgbG9hZC1iZWFyaW5nIFx1MjAxNCBubyBzZWNvbmQgcm93LlxuICpcbiAqIFx1MjZENCBOZXZlciByZWFjaCB0aGF0IGJ5IGV4Y2x1ZGluZyBub24tYHNjaGVkdWxlZGAgcm93cyBmcm9tIE9ORSBzaGFyZWQgZmlsdGVyLlxuICogVGhlIHN3ZWVwIHdvdWxkIHN0b3AgZmluZGluZyB0aGUgbWFudWFsIHJvdywgZGVjaWRlIHRoZSBwZXJpb2Qgd2FzIHVuaGFuZGxlZFxuICogYW5kIE9QRU4gYSBkdXBsaWNhdGUgaW4gdGhlIHNhbWUgd2luZG93IFx1MjAxNCBhbmQgYHRoaXNfcXVhcnRlcl9mb3JlY2FzdHNgIGFuZCB0aGVcbiAqIHF1b3RhLWF0dGFpbm1lbnQgd2lkZ2V0IHBpbiBgcGVyaW9kX3N0YXJ0YCBieSBlcXVhbGl0eSwgc28gYm90aCB3b3VsZCBtYXRjaFxuICogdHdvIHJvd3MuXG4gKlxuICogVGhlIHdheSBvdXQgc3RheXMgb3BlbjogZGVsZXRlIHRoZSBtYW51YWwgcm93IGFuZCB0aGUgbmV4dCBzd2VlcCBvcGVucyBpdHNcbiAqIG93biBhZ2Fpbi4gQXV0b21hdGlvbiBhbiBvdmVycmlkZSBjYW5ub3Qgc2lsZW5jZSBpcyBub3QgYW4gb3ZlcnJpZGUuXG4gKlxuICogTm90ZSB0aGUgc2NvcGUgaXMgYHNvdXJjZSA9PSAnc2NoZWR1bGVkJ2AsIG5vdCBgc291cmNlICE9ICdtYW51YWwnYDogYW4gYGFpYFxuICogcm93IGlzIGVxdWFsbHkgbm90IHRoZSBzd2VlcCdzIHRvIG92ZXJ3cml0ZSwgYW5kIGdldHMgdGhlIHNhbWUgZGVmZXJlbmNlLlxuICpcbiAqIFNjb3BlOiBhbiBcImFjdGl2ZSBvcHBvcnR1bml0eSBvd25lclwiIGlzIGEgdXNlciBvd25pbmcgYXQgbGVhc3Qgb25lXG4gKiBvcHBvcnR1bml0eSB0aGF0IGlzIG5vdCBgY2xvc2VkX2xvc3RgLiBVc2VycyB3aXRoIG5vbmUgYXJlIHNraXBwZWQgZW50aXJlbHksXG4gKiBzbyBhIGZyZXNoIGluc3RhbGwgZG9lcyBub3QgbGl0dGVyIGEgemVybyByb3cgcGVyIGVtcGxveWVlLlxuICovXG5cbi8qKlxuICogVGhlIHBlcmlvZCB0aGlzIHN3ZWVwIHNuYXBzaG90cy4gYHF1YXJ0ZXJgIGJlY2F1c2UgdGhhdCBpcyB3aGF0IGV2ZXJ5XG4gKiBjb25zdW1lciByZWFkczogdGhlIGB0aGlzX3F1YXJ0ZXJfZm9yZWNhc3RzYCB2aWV3IGZpbHRlcnMgYHBlcmlvZDogJ3F1YXJ0ZXInYFxuICogYW5kIHRoZSBxdW90YS1hdHRhaW5tZW50IHRhYmxlIGlzIGEgcXVhcnRlcmx5IHNjb3JlYm9hcmQuIEEgbW9udGhseSBjYWRlbmNlXG4gKiB3b3VsZCBiZSBhIHNlY29uZCBmbG93LCBub3QgYSBmbGFnIFx1MjAxNCB0aGUgdXBzZXJ0IGtleSBpcyAob3duZXIsIHBlcmlvZCkuXG4gKi9cbmNvbnN0IFNOQVBTSE9UX1BFUklPRCA9ICdxdWFydGVyJztcblxuLyoqIE9wZW4gPSBub3QgeWV0IHJlc29sdmVkIGVpdGhlciB3YXkuIEJvdGggY2xvc2VkIHN0YWdlcyBsZWF2ZSB0aGUgcGlwZWxpbmUuICovXG5jb25zdCBPUEVOX1NUQUdFUyA9IHsgJG5pbjogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfTtcblxuLyoqXG4gKiBXaW5kb3cgdGhlIGN1cnJlbnQtcGVyaW9kIHJvdzogYHBlcmlvZF9zdGFydCA8PSB0b2RheSA8PSBwZXJpb2RfZW5kYC5cbiAqXG4gKiBUaGUgSURFTVBPVEVOQ1kgc2NvcGUgXHUyMDE0IGRlbGliZXJhdGVseSBzb3VyY2UtYmxpbmQuIFwiSGFzIHRoaXMgcGVyaW9kIGJlZW5cbiAqIGhhbmRsZWQ/XCIgaXMgYSBxdWVzdGlvbiBhYm91dCB0aGUgd2luZG93LCBzbyBhIG1hbnVhbCByb3cgYW5zd2VycyBpdCBqdXN0IGFzXG4gKiBhIHNjaGVkdWxlZCBvbmUgZG9lcywgYW5kIHRoZSBzd2VlcCBvcGVucyBub3RoaW5nIGJlc2lkZSBpdC5cbiAqL1xuY29uc3QgQ1VSUkVOVF9QRVJJT0RfRklMVEVSID0ge1xuICBvd25lcl9pZDogY2VsYGN1cnJlbnRPd25lci5pZGAsXG4gIHBlcmlvZDogU05BUFNIT1RfUEVSSU9ELFxuICBwZXJpb2Rfc3RhcnQ6IHsgJGx0ZTogY2VsYGlzb0RhdGUodG9kYXkoKSlgIH0sXG4gIHBlcmlvZF9lbmQ6IHsgJGd0ZTogY2VsYGlzb0RhdGUodG9kYXkoKSlgIH0sXG59O1xuXG4vKipcbiAqIFRoZSBzYW1lIHdpbmRvdyBuYXJyb3dlZCB0byB0aGUgcm93cyB0aGlzIHN3ZWVwIE9XTlMgXHUyMDE0IGl0cyBXUklURSBzY29wZS5cbiAqXG4gKiBgc291cmNlYCBpcyB3aGF0IHNlcGFyYXRlcyB0aGUgdHdvIGpvYnMuIEFueXRoaW5nIGVsc2UgaW4gdGhlIHdpbmRvd1xuICogYmVsb25ncyB0byBhIGh1bWFuIChgbWFudWFsYCkgb3IgYW4gYWdlbnQgKGBhaWApIGFuZCBpcyB0aGVpcnMgdG8ga2VlcDsgYVxuICogbWlzcyBoZXJlIGlzIHRoZSBzdGFuZC1kb3duIHNpZ25hbCBgY2hlY2tfb3duZWRgIHJlYWRzLCBub3QgYSByZWFzb24gdG9cbiAqIGNyZWF0ZSBhIHNlY29uZCByb3cuIE5hcnJvd2luZyB0aGUgd3JpdGUgc2NvcGUgYWxzbyBtYWtlcyB0aGUgdGFyZ2V0XG4gKiBERVRFUk1JTklTVElDIHdoZW4gYSBtYW5hZ2VyIGFkZHMgYSBtYW51YWwgcm93IGJlc2lkZSBhbiBleGlzdGluZyBzY2hlZHVsZWRcbiAqIG9uZTogYGZpbmRPbmVgIG92ZXIgdGhlIHNoYXJlZCB3aW5kb3cgd291bGQgaGFuZCBiYWNrIHdoaWNoZXZlciByb3cgdGhlXG4gKiBkcml2ZXIgaGFwcGVuZWQgdG8gb3JkZXIgZmlyc3QuXG4gKi9cbmNvbnN0IE9XTkVEX1BFUklPRF9GSUxURVIgPSB7IC4uLkNVUlJFTlRfUEVSSU9EX0ZJTFRFUiwgc291cmNlOiAnc2NoZWR1bGVkJyB9O1xuXG4vKipcbiAqIE9wcG9ydHVuaXRpZXMgb2YgdGhlIG93bmVyIGluIGZsaWdodCBkdXJpbmcgdGhlIHNuYXBzaG90IHdpbmRvdy5cbiAqXG4gKiAjIyBUaGUgb3JnYW5pemF0aW9uIHBpblxuICpcbiAqIGBvd25lcl9pZGAgYW5kIHRoZSBwZXJpb2Qgd2luZG93IGFyZSBib3RoIG9yZ2FuaXphdGlvbi1ORVVUUkFMIHByZWRpY2F0ZXMsXG4gKiBhbmQgdGhpcyBzd2VlcCBydW5zIGBydW5BczogJ3N5c3RlbSdgIFx1MjAxNCB0aGUgb25lIGNvbnRleHQgdGhlIGRyaXZlcidzXG4gKiBvcmdhbml6YXRpb24gcHJlZGljYXRlIGRvZXMgbm90IGNvbnN0cmFpbi4gV2l0aG91dCB0aGUgcGluIGJlbG93LCBhbiBvd25lclxuICogaG9sZGluZyBvcHBvcnR1bml0aWVzIGluIG1vcmUgdGhhbiBvbmUgb3JnYW5pemF0aW9uIGhhcyBldmVyeSBvbmUgb2YgdGhlbVxuICogc3VtbWVkIGludG8gdGhlIHNpbmdsZSByb3cgYENVUlJFTlRfUEVSSU9EX0ZJTFRFUmAgc2VsZWN0czogb25lIHRlbmFudCdzXG4gKiBmb3JlY2FzdCByb3cgcmVwb3J0aW5nIGFub3RoZXIgdGVuYW50J3MgcGlwZWxpbmUuIE5vdGhpbmcgaXMgTlVMTC1wYXJ0aXRpb25lZFxuICogYW5kIG5vIGluZGV4IGlzIHZpb2xhdGVkIFx1MjAxNCB0aGUgbnVtYmVycyBhcmUgc2ltcGx5IHdyb25nLCBhbmQgd3JvbmcgaW4gdGhlXG4gKiBkaXJlY3Rpb24gdGhhdCBsb29rcyBwbGF1c2libGUuIGBzeXNfdXNlcmAgaXMgd2hhdCBtYWtlcyBpdCByZWFjaGFibGU6XG4gKiBpZGVudGl0eSBpcyBHTE9CQUwgYW5kIGRlY2xhcmVzIG5vIGBvcmdhbml6YXRpb25faWRgLCBzbyB0aGUgcGVyLW93bmVyIGxvb3BcbiAqIGl0ZW0gY2Fubm90IG5hcnJvdyBhbnl0aGluZy5cbiAqXG4gKiBUaGUgcGluIGlzIHRoZSB0YXJnZXQgcm93J3Mgb3duIG9yZ2FuaXphdGlvbiwgcmVhZCBiYWNrIG9mZlxuICogYGN1cnJlbnRGb3JlY2FzdGAuIFRoYXQgaXMgdGhlIFNBTUUgXCJwcm92ZSB0aGUgc291cmNlIGNhcnJpZXMgdGhlIHJpZ2h0XG4gKiBvcmdhbml6YXRpb25cIiBtZWNoYW5pc20gYG93bmVyQW55RGVhbC5vcmdhbml6YXRpb25faWRgIGVzdGFibGlzaGVzIG9uXG4gKiBgY3JlYXRlX2ZvcmVjYXN0YCwgaW52ZXJ0ZWQgXHUyMDE0IG5vdCBhIHNlY29uZCBvbmUuIEl0IGlzIGluIHNjb3BlIGJ5XG4gKiBjb25zdHJ1Y3Rpb246IGBjdXJyZW50Rm9yZWNhc3RgIGFscmVhZHkgc3VwcGxpZXMgdGhlIHdpbmRvdyBib3VuZGFyaWVzIGluXG4gKiB0aGlzIHZlcnkgZmlsdGVyLCBhbmQgYHJlbG9hZF9mb3JlY2FzdGAgYmluZHMgaXQgYmVmb3JlIGFueSBidWNrZXQgcnVucy5cbiAqXG4gKiBXaGF0IHRoaXMgZG9lcyBOT1QgZG86IGdpdmUgYSBjcm9zcy1vcmdhbml6YXRpb24gb3duZXIgb25lIHJvdyBwZXJcbiAqIG9yZ2FuaXphdGlvbi4gYGNybV9mb3JlY2FzdGAgaXMgc3RpbGwga2V5ZWQgYnkgKG93bmVyLCBwZXJpb2QpLCBzbyBzdWNoIGFuXG4gKiBvd25lcidzIHNuYXBzaG90IG5vdyByZXBvcnRzIFRISVMgb3JnYW5pemF0aW9uJ3MgbnVtYmVycyBvbmx5IFx1MjAxNCB0cnVlIGJ1dFxuICogaW5jb21wbGV0ZSwgYW5kIHN0cmljdGx5IGJldHRlciB0aGFuIHRoZSBjcm9zcy10ZW5hbnQgdG90YWwgaXQgcmVwbGFjZXMuXG4gKiBXaGV0aGVyIHRoYXQga2V5IHNob3VsZCB3aWRlbiBpcyBhIHByb2R1Y3QgZGVjaXNpb24sIHJlY29yZGVkIG9uICMxMzcyIGFuZFxuICogZGVsaWJlcmF0ZWx5IG5vdCB1bmRlcnRha2VuIGhlcmUuXG4gKi9cbmNvbnN0IGluUGVyaW9kID0gKGV4dHJhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gKHtcbiAgb3duZXJfaWQ6IGNlbGBjdXJyZW50T3duZXIuaWRgLFxuICBvcmdhbml6YXRpb25faWQ6IGNlbGBjdXJyZW50Rm9yZWNhc3Qub3JnYW5pemF0aW9uX2lkYCxcbiAgY2xvc2VfZGF0ZToge1xuICAgICRndGU6IGNlbGBjdXJyZW50Rm9yZWNhc3QucGVyaW9kX3N0YXJ0YCxcbiAgICAkbHRlOiBjZWxgY3VycmVudEZvcmVjYXN0LnBlcmlvZF9lbmRgLFxuICB9LFxuICAuLi5leHRyYSxcbn0pO1xuXG4vKipcbiAqIE9uZSBgZ2V0X3JlY29yZGAgKyBgbG9vcGAgcGFpciB0aGF0IHN1bXMgYGFtb3VudGAgaW50byBgdG90YWxgLlxuICpcbiAqIFRoZSBhY2N1bXVsYXRvciBpcyBhIENFTCB2YWx1ZSBlbnZlbG9wZSwgc28gaXRzIG9wZXJhbmRzIGFyZSBUWVBFRDpcbiAqIGBkb3VibGUoKWAgdHVybnMgYSBjdXJyZW5jeSBzb21lIGRyaXZlcnMgcmV0dXJuIGFzIGEgc3RyaW5nIChgXCI5MDAwMFwiYCkgaW50b1xuICogYSBudW1iZXIsIGFuZCBhIGRlY2ltYWwgYW1vdW50IGtlZXBzIGl0cyBjZW50cy4gXHUyNkQ0IE5ldmVyIGEgYmFyZVxuICogYGRvdWJsZShhbW91bnQpYDogaXQgRVJST1JTIG9uIG51bGwgXHUyMDE0IGBmb3VuZCBubyBtYXRjaGluZyBvdmVybG9hZCBmb3JcbiAqICdkb3VibGUobnVsbCknYCBcdTIwMTQgYW5kIG9uZSBvcHBvcnR1bml0eSB3aXRob3V0IGFuIGFtb3VudCB3b3VsZCBmYWlsIHRoZVxuICogb3duZXIncyB3aG9sZSBzd2VlcC4gVGhlIGBoYXMoKWAgLyBgaXNCbGFuaygpYCBndWFyZCBzdW1zIGEgbnVsbCBvciBhYnNlbnRcbiAqIGFtb3VudCBhcyAwLiBgZXhwcmVzc2lvbigpYCByYXRoZXIgdGhhbiBgUGA6IHRoZSBzb3VyY2Ugc3BsaWNlcyB0aGUgbm9kZSdzXG4gKiB2YXJpYWJsZSBuYW1lcywgd2hpY2ggdGhlIHRhZyB3b3VsZCBKU09OLXF1b3RlLlxuICovXG5jb25zdCBzdW1CdWNrZXQgPSAoa2V5OiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcsIGZpbHRlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHRvdGFsOiBzdHJpbmcsIGl0ZW0gPSBgY3VycmVudF8ke2tleX1gKSA9PiAoe1xuICBmaW5kOiB7XG4gICAgaWQ6IGBmaW5kXyR7a2V5fWAsXG4gICAgdHlwZTogJ2dldF9yZWNvcmQnIGFzIGNvbnN0LFxuICAgIGxhYmVsOiBgRmluZCAke2xhYmVsfWAsXG4gICAgY29uZmlnOiB7XG4gICAgICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgIGZpbHRlcixcbiAgICAgIGxpbWl0OiA1MDAsXG4gICAgICBvdXRwdXRWYXJpYWJsZTogYCR7a2V5fU9wcHNgLFxuICAgIH0sXG4gIH0sXG4gIHN1bToge1xuICAgIGlkOiBgc3VtXyR7a2V5fWAsXG4gICAgdHlwZTogJ2xvb3AnIGFzIGNvbnN0LFxuICAgIGxhYmVsOiBgU3VtICR7bGFiZWx9YCxcbiAgICBjb25maWc6IHtcbiAgICAgIGNvbGxlY3Rpb246IGV4cHJlc3Npb24oYCR7a2V5fU9wcHNgLCAnY2VsJyksXG4gICAgICBpdGVyYXRvclZhcmlhYmxlOiBpdGVtLFxuICAgICAgYm9keToge1xuICAgICAgICBub2RlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBgYWRkXyR7a2V5fWAsXG4gICAgICAgICAgICB0eXBlOiAnYXNzaWdubWVudCcgYXMgY29uc3QsXG4gICAgICAgICAgICBsYWJlbDogYEFkZCB0byAke2xhYmVsfWAsXG4gICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgYXNzaWdubWVudHM6IHtcbiAgICAgICAgICAgICAgICBbdG90YWxdOiBleHByZXNzaW9uKGAke3RvdGFsfSArICghaGFzKCR7aXRlbX0uYW1vdW50KSB8fCBpc0JsYW5rKCR7aXRlbX0uYW1vdW50KSA/IDAuMCA6IGRvdWJsZSgke2l0ZW19LmFtb3VudCkpYCwgJ2NlbCcpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBlZGdlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcblxuY29uc3QgQlVDS0VUUyA9IFtcbiAgc3VtQnVja2V0KCdwaXBlbGluZScsICdPcGVuIFBpcGVsaW5lJywgaW5QZXJpb2QoeyBzdGFnZTogT1BFTl9TVEFHRVMgfSksICdwaXBlbGluZVRvdGFsJyksXG4gIHN1bUJ1Y2tldChcbiAgICAnYmVzdF9jYXNlJyxcbiAgICAnQmVzdCBDYXNlJyxcbiAgICBpblBlcmlvZCh7IHN0YWdlOiBPUEVOX1NUQUdFUywgZm9yZWNhc3RfY2F0ZWdvcnk6IHsgJGluOiBbJ2Jlc3RfY2FzZScsICdjb21taXQnXSB9IH0pLFxuICAgICdiZXN0Q2FzZVRvdGFsJyxcbiAgKSxcbiAgc3VtQnVja2V0KFxuICAgICdjb21taXQnLFxuICAgICdDb21taXQnLFxuICAgIGluUGVyaW9kKHsgc3RhZ2U6IE9QRU5fU1RBR0VTLCBmb3JlY2FzdF9jYXRlZ29yeTogJ2NvbW1pdCcgfSksXG4gICAgJ2NvbW1pdFRvdGFsJyxcbiAgKSxcbiAgc3VtQnVja2V0KCd3b24nLCAnQ2xvc2VkIFdvbicsIGluUGVyaW9kKHsgc3RhZ2U6ICdjbG9zZWRfd29uJyB9KSwgJ2Nsb3NlZFRvdGFsJyksXG5dO1xuXG4vKipcbiAqIFRoZSBwZXItb3duZXIgYm9keSBydW5zIGFzIG9uZSBzdHJhaWdodCBsaW5lIG9uY2UgdGhlIFRIUkVFIGdhdGVzIHBhc3M6XG4gKiByZXNldCBcdTIxOTIgKGZpbmQvc3VtKSBcdTAwRDcgNCBcdTIxOTIgd3JpdGUuXG4gKlxuICogXHUyNkQ0IFRoZSBjaGFpbiBtdXN0IHN0YXJ0IEFGVEVSIHRoZSBgY2hlY2tfb3duZWRgIGdhdGV3YXk6IGV2ZXJ5IGVkZ2UgZGVyaXZlZFxuICogZnJvbSB0aGlzIGxpc3QgaXMgdW5jb25kaXRpb25hbCwgYW5kIGBjaGVja19vd25lZGAncyBvdXQtZWRnZSBpcyBub3QuXG4gKi9cbmNvbnN0IE9XTkVSX0NIQUlOID0gW1xuICAncmVzZXRfdG90YWxzJyxcbiAgLi4uQlVDS0VUUy5mbGF0TWFwKChiKSA9PiBbYi5maW5kLmlkLCBiLnN1bS5pZF0pLFxuICAnd3JpdGVfc25hcHNob3QnLFxuXTtcblxuZXhwb3J0IGNvbnN0IEZvcmVjYXN0U25hcHNob3RGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnZm9yZWNhc3Rfc25hcHNob3QnLFxuICBsYWJlbDogJ0ZvcmVjYXN0IFNuYXBzaG90JyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ05pZ2h0bHkgc3dlZXA6IHVwc2VydCBhIGN1cnJlbnQtcXVhcnRlciBjcm1fZm9yZWNhc3Qgcm93IHBlciBhY3RpdmUgb3Bwb3J0dW5pdHkgb3duZXIgd2l0aCBwaXBlbGluZSwgYmVzdC1jYXNlLCBjb21taXQgYW5kIGNsb3NlZC13b24gdG90YWxzLicsXG4gIHR5cGU6ICdzY2hlZHVsZScsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG4gIC8vIFNjaGVkdWxlZCBydW5zIGhhdmUgbm8gdHJpZ2dlciB1c2VyLCBzbyB1bmRlciB0aGUgZGVmYXVsdCBydW5BczondXNlcicgdGhlXG4gIC8vIGRhdGEgbm9kZXMgZXhlY3V0ZSBVTlNDT1BFRCBhbnl3YXkuIERlY2xhcmUgcnVuQXM6J3N5c3RlbScgdG8gbWFrZSB0aGF0XG4gIC8vIFJMUy1ieXBhc3NpbmcgZWxldmF0aW9uIGV4cGxpY2l0IGFuZCBpbnRlbmRlZCAoQURSLTAwNDkpIFx1MjAxNCBhbmQgaXRcbiAgLy8gaXMgbG9hZC1iZWFyaW5nIGhlcmU6IGBjcm1fZm9yZWNhc3RgIGlzIGBzaGFyaW5nTW9kZWw6ICdwcml2YXRlJ2AsIHNvIGFcbiAgLy8gdXNlci1zY29wZWQgc3dlZXAgY291bGQgb25seSBldmVyIHNlZSBpdHMgb3duIHJvd3MuXG4gIHJ1bkFzOiAnc3lzdGVtJyxcblxuICB2YXJpYWJsZXM6IFtdLFxuXG4gIG5vZGVzOiBbXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCAoZGFpbHkgMDM6MDApJywgY29uZmlnOiB7IHNjaGVkdWxlOiAnMCAzICogKiAqJyB9IH0sXG4gICAge1xuICAgICAgLy8gRXZlcnkgdXNlciBpcyBhIGNhbmRpZGF0ZTsgdGhlIGBoYXNfZGVhbHNgIGdhdGUgYmVsb3cgZGVjaWRlcyB3aG8gaXNcbiAgICAgIC8vIGFjdHVhbGx5IGFuIG9wcG9ydHVuaXR5IG93bmVyLiBGaWx0ZXJpbmcgYHN5c191c2VyYCBoZXJlIGluc3RlYWQgd291bGRcbiAgICAgIC8vIGhhcmQtY29kZSBhbiBhY3Rpdml0eSBmbGFnIHRoaXMgYXBwIGRvZXMgbm90IG93bi5cbiAgICAgIC8vIE5vIGBmaWx0ZXJgIGtleTogYW4gRU1QVFkgZmlsdGVyIG5vZGUgKGB7fWApIHJlZHVjZXMgdG8gVFJVRSBhbmRcbiAgICAgIC8vIG1hdGNoZXMgZXZlcnkgcm93LCBzbyBpdCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIGFic2VudCBrZXkgXHUyMDE0XG4gICAgICAvLyBPYmplY3RTdGFjayAxNy4wLjAtcmMuNiBwcm9tb3RlcyB0aGUgcGFpciB0byBhbiBhdXRob3ItdGltZSBlcnJvclxuICAgICAgLy8gKGBmaWx0ZXItZW1wdHktbm9kZWApIHByZWNpc2VseSBiZWNhdXNlIG9ubHkgdGhlIGFic2VudCBrZXkgU0FZU1xuICAgICAgLy8gXCJldmVyeSB1c2VyIGlzIGEgY2FuZGlkYXRlXCIgdG8gdGhlIG5leHQgcmVhZGVyLiBUaGUgYGhhc19kZWFsc2AgZ2F0ZVxuICAgICAgLy8gYmVsb3cgaXMgd2hhdCBhY3R1YWxseSBuYXJyb3dzIHRoZSBzZXQuXG4gICAgICBpZDogJ3F1ZXJ5X293bmVycycsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdGaW5kIFVzZXJzJyxcbiAgICAgIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnc3lzX3VzZXInLCBsaW1pdDogNTAwLCBvdXRwdXRWYXJpYWJsZTogJ293bmVyTGlzdCcgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnbG9vcF9vd25lcnMnLCB0eXBlOiAnbG9vcCcsIGxhYmVsOiAnRm9yIEVhY2ggT3duZXInLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGNvbGxlY3Rpb246IGNlbGBvd25lckxpc3RgLFxuICAgICAgICBpdGVyYXRvclZhcmlhYmxlOiAnY3VycmVudE93bmVyJyxcbiAgICAgICAgYm9keTogZ3VhcmRlZCgnb3duZXInLCB7XG4gICAgICAgICAgbm9kZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gQ2hlYXAgZmluZE9uZSBnYXRlOiBhIHVzZXIgd2l0aCBubyBsaXZlIG9wcG9ydHVuaXR5IGlzIG5vdCBhXG4gICAgICAgICAgICAgIC8vIGZvcmVjYXN0IG93bmVyLCBhbmQgbXVzdCBub3QgZ2V0IGEgcm93IChhIGZyZXNoIGluc3RhbGwgd291bGRcbiAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGdhaW4gb25lIGVtcHR5IHNuYXBzaG90IHBlciBlbXBsb3llZSkuXG4gICAgICAgICAgICAgIGlkOiAnZmluZF9hbnlfZGVhbCcsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdPd25zIEFueSBMaXZlIERlYWw/JyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7IG93bmVyX2lkOiBjZWxgY3VycmVudE93bmVyLmlkYCwgc3RhZ2U6IHsgJG5pbjogWydjbG9zZWRfbG9zdCddIH0gfSxcbiAgICAgICAgICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ293bmVyQW55RGVhbCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBHYXRld2F5IG9ubHkgXHUyMDE0IHRoZSBwcmVkaWNhdGUgbGl2ZXMgb24gdGhlIG91dC1lZGdlLlxuICAgICAgICAgICAgICBpZDogJ2hhc19kZWFscycsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnQWN0aXZlIE93bmVyPycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBJZGVtcG90ZW5jeSBnYXRlIEFORCBwZXJpb2QgbG9va3VwIGluIG9uZSByZWFkOiB0aGUgcm93IHdob3NlXG4gICAgICAgICAgICAgIC8vIHdpbmRvdyBjb250YWlucyB0b2RheSBJUyB0aGlzIG93bmVyJ3MgY3VycmVudC1wZXJpb2Qgc25hcHNob3QuXG4gICAgICAgICAgICAgIGlkOiAnZmluZF9mb3JlY2FzdCcsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdDdXJyZW50LVBlcmlvZCBTbmFwc2hvdD8nLFxuICAgICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2ZvcmVjYXN0JyxcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IENVUlJFTlRfUEVSSU9EX0ZJTFRFUixcbiAgICAgICAgICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2V4aXN0aW5nRm9yZWNhc3QnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gR2F0ZXdheSBvbmx5IFx1MjAxNCB0aGUgcHJlZGljYXRlIGxpdmVzIG9uIHRoZSBvdXQtZWRnZXMuXG4gICAgICAgICAgICAgIGlkOiAnY2hlY2tfbWlzc2luZycsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnRmlyc3QgU25hcHNob3QgVGhpcyBQZXJpb2Q/JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIE9ubHkgYHBlcmlvZGAgaXMgc3VwcGxpZWQ6IGBmb3JlY2FzdC5ob29rLnRzYCBkZXJpdmVzXG4gICAgICAgICAgICAgIC8vIHBlcmlvZF9zdGFydC9wZXJpb2RfZW5kL3BlcmlvZF9sYWJlbCBzbyB0aGUgYm91bmRhcmllcyBhcmVcbiAgICAgICAgICAgICAgLy8gY2FsZW5kYXItdHJ1ZSB3aXRob3V0IHRoZSBmbG93IGRvaW5nIGRhdGUgYXJpdGhtZXRpYyBpdFxuICAgICAgICAgICAgICAvLyBjYW5ub3QgZG8uIGBxdW90YWAgaXMgb21pdHRlZCBvbiBwdXJwb3NlIFx1MjAxNCBzZWUgdGhlIGhlYWRlci5cbiAgICAgICAgICAgICAgLy8gQSBsZWFmIG5vZGU6IHRoZSB0d28gbXV0dWFsbHktZXhjbHVzaXZlIGVkZ2VzIG91dCBvZlxuICAgICAgICAgICAgICAvLyBgY2hlY2tfbWlzc2luZ2AgYm90aCBjb252ZXJnZSBvbiBgcmVsb2FkX2ZvcmVjYXN0YCwgc28gdGhlXG4gICAgICAgICAgICAgIC8vIGNoYWluIGJlbG93IHJ1bnMgZXhhY3RseSBvbmNlIG9uIGVpdGhlciBwYXRoLlxuICAgICAgICAgICAgICBpZDogJ2NyZWF0ZV9mb3JlY2FzdCcsIHR5cGU6ICdjcmVhdGVfcmVjb3JkJywgbGFiZWw6ICdPcGVuIFNuYXBzaG90IFJvdycsXG4gICAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fZm9yZWNhc3QnLFxuICAgICAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICAgICAgb3duZXJfaWQ6IGNlbGBjdXJyZW50T3duZXIuaWRgLFxuICAgICAgICAgICAgICAgICAgLy8gT1JHIFBBUlRJVElPTi4gQSBzY2hlZHVsZSB0cmlnZ2VyIGNhcnJpZXMgbm9cbiAgICAgICAgICAgICAgICAgIC8vIG9yZ2FuaXphdGlvbiwgc28gd2l0aG91dCB0aGlzIHRoZSBzbmFwc2hvdCByb3cgaXMgYm9yblxuICAgICAgICAgICAgICAgICAgLy8gYG9yZ2FuaXphdGlvbl9pZGAgTlVMTCBcdTIwMTQgb3V0c2lkZSBldmVyeSBvcmcgcGFydGl0aW9uLCB3aGVyZVxuICAgICAgICAgICAgICAgICAgLy8gYW4gYChvcmdhbml6YXRpb25faWQsIFx1MjAyNilgIHVuaXF1ZSBpbmRleCBkb2VzIG5vdCBjb25zdHJhaW5cbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBvcmctc2NvcGVkIHJlYWRzIG5ldmVyIHNlZSBpdC4gVXBzdHJlYW0gcnVsaW5nXG4gICAgICAgICAgICAgICAgICAvLyBvYmplY3RzdGFjayM2MTU1IFEyPUEgYXNzaWducyB0aGUgYW5zd2VyIHRvIHRoZSBmbG93IGF1dGhvci5cbiAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAvLyBUaGUgc291cmNlIGlzIGBvd25lckFueURlYWxgLCBOT1QgYGN1cnJlbnRPd25lcmAuIFRoZSBsb29wXG4gICAgICAgICAgICAgICAgICAvLyBpdGVtIGhlcmUgaXMgYSBgc3lzX3VzZXJgIHJvdywgYW5kIGBzeXNfdXNlcmAgZGVjbGFyZXMgTk9cbiAgICAgICAgICAgICAgICAgIC8vIGBvcmdhbml6YXRpb25faWRgIFx1MjAxNCBpZGVudGl0eSBpcyBnbG9iYWwsIG9yZy1wYXJ0aXRpb25lZCBpdFxuICAgICAgICAgICAgICAgICAgLy8gaXMgbm90IChpdCBjYXJyaWVzIGBwcmltYXJ5X2J1c2luZXNzX3VuaXRfaWRgIGluc3RlYWQpLlxuICAgICAgICAgICAgICAgICAgLy8gT24gMTcueCBge2N1cnJlbnRPd25lci5vcmdhbml6YXRpb25faWR9YCBpbnRlcnBvbGF0ZWQgdG9cbiAgICAgICAgICAgICAgICAgIC8vIGB1bmRlZmluZWRgIGFuZCBsYW5kZWQgYXMgTlVMTDogdGhlIHB1Ymxpc2ggZ3VhcmQsIHdoaWNoIG9ubHlcbiAgICAgICAgICAgICAgICAgIC8vIGNoZWNrcyB0aGF0IHRoZSBrZXkgaXMgZGVjbGFyZWQsIHdlbnQgZ3JlZW4gb3ZlciBhIHJvdyBzdGlsbFxuICAgICAgICAgICAgICAgICAgLy8gYm9ybiBvdXRzaWRlIGV2ZXJ5IHBhcnRpdGlvbiAobWVhc3VyZWQsIG5vdCBhc3N1bWVkKS4gVW5kZXJcbiAgICAgICAgICAgICAgICAgIC8vIENFTCB0aGF0IHJlYWQgZmFpbHMgdGhlIGl0ZXJhdGlvbiBpbnN0ZWFkLlxuICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgIC8vIGBvd25lckFueURlYWxgIGlzIHRoZSBgY3JtX29wcG9ydHVuaXR5YCBmcm9tIGBmaW5kX2FueV9kZWFsYFxuICAgICAgICAgICAgICAgICAgLy8gXHUyMDE0IGl0IGNhcnJpZXMgdGhlIGNvbHVtbiwgYW5kIGVkZ2UgYGIyYCAoYG93bmVyQW55RGVhbCAhPVxuICAgICAgICAgICAgICAgICAgLy8gbnVsbGApIGlzIHRoZSBvbmx5IHJvdXRlIHRvIHRoaXMgbm9kZSwgc28gaXQgaXMgbmV2ZXIgbnVsbFxuICAgICAgICAgICAgICAgICAgLy8gaGVyZS4gU2VtYW50aWNhbGx5IHJpZ2h0IHRvbzogYW4gb3duZXIncyBmb3JlY2FzdCBiZWxvbmdzIHRvXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgb3JnIHRoZWlyIHBpcGVsaW5lIGlzIGluLlxuICAgICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uX2lkOiBjZWxgb3duZXJBbnlEZWFsLm9yZ2FuaXphdGlvbl9pZGAsXG4gICAgICAgICAgICAgICAgICBwZXJpb2Q6IFNOQVBTSE9UX1BFUklPRCxcbiAgICAgICAgICAgICAgICAgIHNuYXBzaG90X2RhdGU6IGNlbGBpc29EYXRlKHRvZGF5KCkpYCxcbiAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ3NjaGVkdWxlZCcsXG4gICAgICAgICAgICAgICAgICBwaXBlbGluZV9hbW91bnQ6IDAsXG4gICAgICAgICAgICAgICAgICBiZXN0X2Nhc2VfYW1vdW50OiAwLFxuICAgICAgICAgICAgICAgICAgY29tbWl0X2Ftb3VudDogMCxcbiAgICAgICAgICAgICAgICAgIGNsb3NlZF9hbW91bnQ6IDAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIFJlLXJlYWQgcmF0aGVyIHRoYW4gcmV1c2UgdGhlIGNyZWF0ZSBvdXRwdXQsIHNvIGJvdGggcGF0aHNcbiAgICAgICAgICAgICAgLy8gKHJvdyBhbHJlYWR5IGV4aXN0ZWQgLyByb3cganVzdCBjcmVhdGVkKSBoYW5kIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAgICAgICAvLyBib2R5IE9ORSB2YXJpYWJsZSBjYXJyeWluZyB0aGUgaG9vay1kZXJpdmVkIHBlcmlvZCB3aW5kb3cuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFx1MjZENCBTY29wZSB0aGlzIHRvIE9XTkVEX1BFUklPRF9GSUxURVIsIG5ldmVyIHRvIHRoZSBnYXRlJ3NcbiAgICAgICAgICAgICAgLy8gd2luZG93OiB0aGlzIHJlYWQgY2hvb3NlcyB0aGUgcm93IHRoYXQgZ2V0cyBXUklUVEVOLCBhbmQgdGhlXG4gICAgICAgICAgICAgIC8vIHN3ZWVwIG9ubHkgZXZlciBvd25zIGl0cyBvd24uIEEgbWlzcyBiaW5kcyBgY3VycmVudEZvcmVjYXN0YCB0b1xuICAgICAgICAgICAgICAvLyBudWxsIFx1MjAxNCBgZ2V0X3JlY29yZGAgYWx3YXlzIGJpbmRzIFx1MjAxNCB3aGljaCBpcyBleGFjdGx5IHdoYXRcbiAgICAgICAgICAgICAgLy8gYGNoZWNrX293bmVkYCBiZWxvdyBpcyB0aGVyZSB0byByZWFkLlxuICAgICAgICAgICAgICBpZDogJ3JlbG9hZF9mb3JlY2FzdCcsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdMb2FkIFNuYXBzaG90IFJvdycsXG4gICAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fZm9yZWNhc3QnLFxuICAgICAgICAgICAgICAgIGZpbHRlcjogT1dORURfUEVSSU9EX0ZJTFRFUixcbiAgICAgICAgICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2N1cnJlbnRGb3JlY2FzdCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBHYXRld2F5IG9ubHkgXHUyMDE0IHRoZSBwcmVkaWNhdGUgbGl2ZXMgb24gdGhlIG91dC1lZGdlLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBUaGUgc3RhbmQtZG93biBnYXRlLiBUaGUgd2luZG93IGlzIGhhbmRsZWQgZWl0aGVyIHdheSBieSB0aGVcbiAgICAgICAgICAgICAgLy8gdGltZSB3ZSBnZXQgaGVyZTsgdGhpcyBhc2tzIHdoZXRoZXIgdGhlIHJvdyBoYW5kbGluZyBpdCBpcyB0aGVcbiAgICAgICAgICAgICAgLy8gc3dlZXAncy4gU2FtZSBzaW5nbGUtb3V0LWVkZ2Ugc2tpcCBzaGFwZSBhcyBgaGFzX2RlYWxzYDogd2hlblxuICAgICAgICAgICAgICAvLyB0aGUgb25seSBjb25kaXRpb25hbCBlZGdlIGRvZXMgbm90IG1hdGNoLCB0aGUgaXRlcmF0aW9uIGVuZHMgYW5kXG4gICAgICAgICAgICAgIC8vIHRoZSBlbmdpbmUgcmVjb3JkcyB0aGUgdW5yZWFjaGVkIG5vZGVzIGFzIGBza2lwcGVkYCB3aXRoIHRoaXNcbiAgICAgICAgICAgICAgLy8gbm9kZSBhcyBgc2tpcHBlZEJ5YCBcdTIwMTQgc28gYSBzdGFuZC1kb3duIGlzIHZpc2libGUgaW4gdGhlIHJ1biBsb2dcbiAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gc2lsZW50LlxuICAgICAgICAgICAgICBpZDogJ2NoZWNrX293bmVkJywgdHlwZTogJ2RlY2lzaW9uJywgbGFiZWw6ICdTd2VlcCBPd25zIFRoaXMgUm93PycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBBY2N1bXVsYXRvcnMgbGl2ZSBpbiB0aGUgZmxvdy13aWRlIHZhcmlhYmxlIG1hcCAoYSBsb29wIGJvZHlcbiAgICAgICAgICAgICAgLy8gc2hhcmVzIHRoZSBlbmNsb3Npbmcgc2NvcGUpLCBzbyB0aGV5IE1VU1QgYmUgemVyb2VkIHBlciBvd25lclxuICAgICAgICAgICAgICAvLyBvciBldmVyeSByZXAgaW5oZXJpdHMgdGhlIHByZXZpb3VzIHJlcCdzIHRvdGFscy5cbiAgICAgICAgICAgICAgaWQ6ICdyZXNldF90b3RhbHMnLCB0eXBlOiAnYXNzaWdubWVudCcsIGxhYmVsOiAnUmVzZXQgVG90YWxzJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgYXNzaWdubWVudHM6IHtcbiAgICAgICAgICAgICAgICAgIHBpcGVsaW5lVG90YWw6IDAsXG4gICAgICAgICAgICAgICAgICBiZXN0Q2FzZVRvdGFsOiAwLFxuICAgICAgICAgICAgICAgICAgY29tbWl0VG90YWw6IDAsXG4gICAgICAgICAgICAgICAgICBjbG9zZWRUb3RhbDogMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLkJVQ0tFVFMuZmxhdE1hcCgoYikgPT4gW2IuZmluZCwgYi5zdW1dKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gRmlsdGVyIGJ5IGlkOiBgdXBkYXRlX3JlY29yZGAgY2FsbHMgYGRhdGEudXBkYXRlYCB3aXRob3V0XG4gICAgICAgICAgICAgIC8vIGBvcHRpb25zLm11bHRpYCwgc28gYSBmaWx0ZXIgbWF0Y2hpbmcgbW9yZSB0aGFuIG9uZSByb3cgZmFpbHNcbiAgICAgICAgICAgICAgLy8gKHNhbWUgY29uc3RyYWludCBhcyBkZW1vX2Jvb3RzdHJhcCAvIGNhc2Vfc2xhX21vbml0b3IpLlxuICAgICAgICAgICAgICBpZDogJ3dyaXRlX3NuYXBzaG90JywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ1dyaXRlIFNuYXBzaG90JyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9mb3JlY2FzdCcsXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7IGlkOiBjZWxgY3VycmVudEZvcmVjYXN0LmlkYCB9LFxuICAgICAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICAgICAgcGlwZWxpbmVfYW1vdW50OiBjZWxgcGlwZWxpbmVUb3RhbGAsXG4gICAgICAgICAgICAgICAgICBiZXN0X2Nhc2VfYW1vdW50OiBjZWxgYmVzdENhc2VUb3RhbGAsXG4gICAgICAgICAgICAgICAgICBjb21taXRfYW1vdW50OiBjZWxgY29tbWl0VG90YWxgLFxuICAgICAgICAgICAgICAgICAgY2xvc2VkX2Ftb3VudDogY2VsYGNsb3NlZFRvdGFsYCxcbiAgICAgICAgICAgICAgICAgIHNuYXBzaG90X2RhdGU6IGNlbGBpc29EYXRlKHRvZGF5KCkpYCxcbiAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ3NjaGVkdWxlZCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBlZGdlczogW1xuICAgICAgICAgICAgLy8gTG9vcC1uZXN0ZWQgY29uZGl0aW9ucyBhcmUgZXhwbGljaXQgQ0VMIGVudmVsb3BlcyAoYFBgKTogdGhlXG4gICAgICAgICAgICAvLyBjb252ZXJzaW9uIHBhc3MgdGhhdCB3cmFwcyBiYXJlIHN0cmluZ3Mgb25seSB3YWxrcyBhIGZsb3cnc1xuICAgICAgICAgICAgLy8gVE9QLUxFVkVMIGVkZ2VzLCBzbyBhIGJhcmUgc3RyaW5nIGluIGhlcmUgd291bGQgZmFsbCB0aHJvdWdoIHRvXG4gICAgICAgICAgICAvLyB0aGUgbGVnYWN5IHRlbXBsYXRlIHBhdGggYW5kIGNvbXBhcmUgYXMgdGV4dCBcdTIwMTQgYSBnYXRlIHRoYXQgbmV2ZXJcbiAgICAgICAgICAgIC8vIG9wZW5zLCBzaWxlbnRseS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGVzZSBlZGdlcyBhcmUgdGhlIE9OTFkgc2l0ZSBmb3IgdGhlaXIgcHJlZGljYXRlczogYVxuICAgICAgICAgICAgLy8gYGRlY2lzaW9uYCBub2RlJ3Mgc2luZ3VsYXIgYGNvbmZpZy5jb25kaXRpb25gIGlzIG5ldmVyIHJlYWQsIHNvIGFcbiAgICAgICAgICAgIC8vIG5vZGUtbGV2ZWwgY29weSB3b3VsZCBiZSBpbmVydCBtZXRhZGF0YSBmcmVlIHRvIGRyaWZ0LlxuICAgICAgICAgICAgeyBpZDogJ2IxJywgc291cmNlOiAnZmluZF9hbnlfZGVhbCcsIHRhcmdldDogJ2hhc19kZWFscycsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgICAgLy8gTm8gbWF0Y2hpbmcgZWRnZSBzaW1wbHkgZW5kcyB0aGlzIGl0ZXJhdGlvbiwgc28gYSB1c2VyIHdpdGggbm9cbiAgICAgICAgICAgIC8vIGxpdmUgZGVhbCBpcyBza2lwcGVkIHdpdGhvdXQgYSBzbmFwc2hvdCByb3cuXG4gICAgICAgICAgICB7IGlkOiAnYjInLCBzb3VyY2U6ICdoYXNfZGVhbHMnLCB0YXJnZXQ6ICdmaW5kX2ZvcmVjYXN0JywgdHlwZTogJ2NvbmRpdGlvbmFsJywgY29uZGl0aW9uOiBQYG93bmVyQW55RGVhbCAhPSBudWxsYCwgbGFiZWw6ICdBY3RpdmUgb3duZXInIH0sXG4gICAgICAgICAgICB7IGlkOiAnYjMnLCBzb3VyY2U6ICdmaW5kX2ZvcmVjYXN0JywgdGFyZ2V0OiAnY2hlY2tfbWlzc2luZycsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgICAgLy8gTXV0dWFsbHkgZXhjbHVzaXZlLCBhbmQgYm90aCByZWFjaCBgcmVsb2FkX2ZvcmVjYXN0YCBcdTIwMTQgbmV2ZXIgYVxuICAgICAgICAgICAgLy8gZGVmYXVsdCBlZGdlIGFsb25nc2lkZSBhIGNvbmRpdGlvbmFsIG9uZSwgd2hpY2ggd291bGQgdHJhdmVyc2VcbiAgICAgICAgICAgIC8vIEJPVEggYW5kIGRvdWJsZS1jb3VudCB0aGUgd2hvbGUgY2hhaW4uXG4gICAgICAgICAgICB7IGlkOiAnYjQnLCBzb3VyY2U6ICdjaGVja19taXNzaW5nJywgdGFyZ2V0OiAnY3JlYXRlX2ZvcmVjYXN0JywgdHlwZTogJ2NvbmRpdGlvbmFsJywgY29uZGl0aW9uOiBQYGV4aXN0aW5nRm9yZWNhc3QgPT0gbnVsbGAsIGxhYmVsOiAnT3BlbiBuZXcgcm93JyB9LFxuICAgICAgICAgICAgeyBpZDogJ2I1Jywgc291cmNlOiAnY2hlY2tfbWlzc2luZycsIHRhcmdldDogJ3JlbG9hZF9mb3JlY2FzdCcsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGBleGlzdGluZ0ZvcmVjYXN0ICE9IG51bGxgLCBsYWJlbDogJ1JlZnJlc2ggZXhpc3Rpbmcgcm93JyB9LFxuICAgICAgICAgICAgeyBpZDogJ2I2Jywgc291cmNlOiAnY3JlYXRlX2ZvcmVjYXN0JywgdGFyZ2V0OiAncmVsb2FkX2ZvcmVjYXN0JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgICAgICAgICB7IGlkOiAnYjcnLCBzb3VyY2U6ICdyZWxvYWRfZm9yZWNhc3QnLCB0YXJnZXQ6ICdjaGVja19vd25lZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgICAgLy8gVGhlIHN0YW5kLWRvd24uIE5vIGNvbXBsZW1lbnRhcnkgZWRnZSwgb24gcHVycG9zZTogdGhlXG4gICAgICAgICAgICAvLyBmYWxzZSBicmFuY2ggaXMgXCJ0aGlzIHdpbmRvdyBiZWxvbmdzIHRvIGEgbWFudWFsL2FpIHJvd1wiLCBhbmQgdGhlXG4gICAgICAgICAgICAvLyB3aG9sZSBwb2ludCBpcyB0aGF0IHRoZSBzd2VlcCB0aGVuIGRvZXMgTk9USElORyBcdTIwMTQgbm8gd3JpdGUsIGFuZFxuICAgICAgICAgICAgLy8gbm8gc2Vjb25kIHJvdy4gQSB2YXJpYWJsZS1yb290IG51bGwgdGVzdCwgc28gbm8gYGhhcygpYCBndWFyZCBpc1xuICAgICAgICAgICAgLy8gbmVlZGVkOiBgcmVsb2FkX2ZvcmVjYXN0YCBpcyBhIGBnZXRfcmVjb3JkYCBhbmQgYmluZHNcbiAgICAgICAgICAgIC8vIGBjdXJyZW50Rm9yZWNhc3RgIHVuY29uZGl0aW9uYWxseSwgdG8gYG51bGxgIG9uIGEgbWlzcy5cbiAgICAgICAgICAgIHsgaWQ6ICdiOCcsIHNvdXJjZTogJ2NoZWNrX293bmVkJywgdGFyZ2V0OiAncmVzZXRfdG90YWxzJywgdHlwZTogJ2NvbmRpdGlvbmFsJywgY29uZGl0aW9uOiBQYGN1cnJlbnRGb3JlY2FzdCAhPSBudWxsYCwgbGFiZWw6ICdTd2VlcCBvd25zIHRoZSByb3cnIH0sXG4gICAgICAgICAgICAuLi5PV05FUl9DSEFJTi5zbGljZSgwLCAtMSkubWFwKChzb3VyY2UsIGkpID0+ICh7XG4gICAgICAgICAgICAgIGlkOiBgYyR7aX1gLFxuICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgIHRhcmdldDogT1dORVJfQ0hBSU5baSArIDFdLFxuICAgICAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcgYXMgY29uc3QsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIHsgaWQ6ICdlMScsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAncXVlcnlfb3duZXJzJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAncXVlcnlfb3duZXJzJywgdGFyZ2V0OiAnbG9vcF9vd25lcnMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdsb29wX293bmVycycsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL2xlYWQtYXNzaWdubWVudC5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL2xlYWQtYXNzaWdubWVudC5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogTGVhZCBBc3NpZ25tZW50ICYgUm91dGluZyBcdTIwMTQgcmVhY3QgdGhlIGluc3RhbnQgYSBuZXcgbGVhZCBsYW5kcy5cbiAqXG4gKiBGaXJlcyBvbiBsZWFkICppbnNlcnQqLCBzZXRzIGEgcmF0aW5nLWJhc2VkIGBuZXh0X2ZvbGxvd3VwX2RhdGVgIFNMQSwgYW5kXG4gKiBhbGVydHMgdGhlIGxlYWQncyBPV05FUiBcdTIwMTQgdGhlIGFjY291bnRhYmxlIHBhcnR5IFx1MjAxNCB0byBmb2xsb3cgdXAuXG4gKlxuICogXHUyNkQ0IE5ldmVyIGFkZHJlc3MgYSBDUk0gcG9zaXRpb24gKGBzYWxlc19tYW5hZ2VyYCBhbmQgZnJpZW5kcykgYXMgYSByZWNpcGllbnQuXG4gKiBQb3NpdGlvbnMgYXJlIG5vdCBhIG1lc3NhZ2luZyBhdWRpZW5jZTogdGhlIG1lc3NhZ2luZyBzZXJ2aWNlIHJlc29sdmVzXG4gKiBgdXNlcjpgIC8gYHJvbGU6YCAoc3lzX21lbWJlcikgLyBgdGVhbTpgIC8gYG93bmVyX29mOmAsIGFuZCBhIGJhcmUgcG9zaXRpb25cbiAqIG5hbWUgaXMgc3RvcmVkIHZlcmJhdGltIGFzIGBzeXNfaW5ib3hfbWVzc2FnZS51c2VyX2lkYCwgbWF0Y2hpbmcgbm8gcmVhbCB1c2VyLFxuICogc28gdGhlIGFsZXJ0IHJlYWNoZXMgbm9ib2R5LiBXaXRoIG5vIHRlcnJpdG9yeSAvIHJvdW5kLXJvYmluIHRhYmxlIG1vZGVsbGVkLFxuICogdGhlIG93bmVyIGlzIHRoZSBjb3JyZWN0IHJlY2lwaWVudC4gKFN3YXAgdG8gYSBgdGVhbTpgL2Byb2xlOmAgYXVkaWVuY2Ugb25jZSBhXG4gKiBtYW5hZ2VyIGdyb3VwIGlzIHNlZWRlZC4pXG4gKlxuICogVHJpZ2dlciB3aXJpbmc6IHRoZSBgc3RhcnRgIG5vZGUgZGVjbGFyZXMgYHRyaWdnZXJUeXBlOiAncmVjb3JkLWFmdGVyLWNyZWF0ZSdgXG4gKiBzbyB0aGUgcmVjb3JkLWNoYW5nZSB0cmlnZ2VyIHByb3ZpZGVyIGJpbmRzIGl0IHRvIHRoZSBPYmplY3RRTCBgYWZ0ZXJJbnNlcnRgXG4gKiBsaWZlY3ljbGUgaG9vay4gRmlyaW5nIG9uIGluc2VydCBvbmx5IG1lYW5zIHRoZSBTTEEgd3JpdGUgZG9lcyBub3QgcmUtdHJpZ2dlclxuICogdGhlIGZsb3cuIFRoZSBmdWxsIHJlY29yZCBpcyBzZWVkZWQgaW50byB0aGUgcnVuLCBzbyBmaWVsZHMgYXJlIHJlYWQgdmlhXG4gKiBgcmVjb3JkLipgIChubyBnZXRfcmVjb3JkIHJvdW5kLXRyaXAgbmVlZGVkKS5cbiAqL1xuZXhwb3J0IGNvbnN0IExlYWRBc3NpZ25tZW50RmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2xlYWRfYXNzaWdubWVudCcsXG4gIGxhYmVsOiAnTmV3IExlYWQgUm91dGluZyAmIFNMQScsXG4gIGRlc2NyaXB0aW9uOiAnT24gbmV3IGxlYWQ6IHNldCBhIHJhdGluZy1iYXNlZCBmb2xsb3ctdXAgU0xBIGFuZCBhbGVydCB0aGUgbGVhZCBvd25lci4nLFxuICB0eXBlOiAncmVjb3JkX2NoYW5nZScsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG4gIC8vIEEgcmVjb3JkLWNoYW5nZSBmbG93IGZpcmVkIGJ5IGEgU1lTVEVNIHdyaXRlIGNhcnJpZXMgbm8gdHJpZ2dlciB1c2VyXG4gIC8vIGVpdGhlciAoQURSLTAwNDkpLiBUaGlzIGlzIHRoZSBwb3B1bGF0aW9uIHRoZSBmbG93IGlzIEZPUjpcbiAgLy8gbGVhZHMgYXJyaXZlIGZyb20gd2ViLXRvLWxlYWQsIGEgQ1NWIGltcG9ydCwgYSBwYXJ0bmVyIGludGVncmF0aW9uIG9yIGFcbiAgLy8gc2VlZCBsb2FkLCBub25lIG9mIHdoaWNoIGNhcnJ5IGEgdXNlciBzZXNzaW9uLiBNZWFzdXJlZCBvbiAxNy4wLjAtcmMuMiwgYVxuICAvLyB1c2VyLWxlc3MgcnVuIHJlZnVzZXMgYHNsYV9ob3RgIC8gYHNsYV9zdGRgIG91dHJpZ2h0LCBzbyB0aGUgbGVhZCBsYW5kc1xuICAvLyB3aXRoIG5vIGZvbGxvdy11cCBTTEEgYW5kIG5vIGFsZXJ0IGF0IGFsbCBcdTIwMTQgc2lsZW50bHksIHNpbmNlIHRoZSByZWZ1c2FsXG4gIC8vIHN1cmZhY2VzIG9ubHkgaW4gdGhlIHNlcnZlciBsb2cuXG4gIC8vXG4gIC8vIEVsZXZhdGluZyB0aGUgVVNFUi1kcml2ZW4gcnVucyB0b28gaXMgY29ycmVjdDogdGhlIFNMQSBzdGFtcCBpcyB0aGVcbiAgLy8gcGxhdGZvcm0ncyByb3V0aW5nIGRlY2lzaW9uIGFib3V0IHRoZSByb3cgdGhhdCBqdXN0IGZpcmVkIHRoZSB0cmlnZ2VyXG4gIC8vIChrZXllZCB0byBge3JlY29yZC5pZH1gKSwgbm90IHRoZSBzdWJtaXR0aW5nIHJlcCdzIG93biBlZGl0LCBhbmQgYSByZXAgd2hvXG4gIC8vIG1heSBjcmVhdGUgYSBsZWFkIGlzIG5vdCB0aGVyZWJ5IGd1YXJhbnRlZWQgZWRpdCByaWdodHMgb24gaXQuXG4gIHJ1bkFzOiAnc3lzdGVtJyxcblxuICB2YXJpYWJsZXM6IFtdLFxuXG4gIG5vZGVzOiBbXG4gICAge1xuICAgICAgaWQ6ICdzdGFydCcsIHR5cGU6ICdzdGFydCcsIGxhYmVsOiAnU3RhcnQgKGxlYWQgY3JlYXRlZCknLFxuICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fbGVhZCcsIHRyaWdnZXJUeXBlOiAncmVjb3JkLWFmdGVyLWNyZWF0ZScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEJyYW5jaGluZyBsaXZlcyBvbiBlZGdlcyBgZTJgIC8gYGUzYCBcdTIwMTQgc2VlIHRoZSB0b3RhbGl0eSBub3RlIHRoZXJlLlxuICAgICAgLy8gVGhpcyBub2RlIGNhcnJpZXMgbm8gYGNvbmZpZy5jb25kaXRpb25gOiB0aGUgZW5naW5lIG5ldmVyIGV2YWx1YXRlcyBhXG4gICAgICAvLyBgZGVjaXNpb25gIG5vZGUncyBzaW5ndWxhciBvbmUsIHNvIGEgY29weSBoZXJlIHdvdWxkIHJlc3RhdGUgdGhlIGdhdGVcbiAgICAgIC8vIHdpdGhvdXQgYmVpbmcgdGhlIGdhdGUgKDE3LjAuMC1yYy4yJ3MgYGZsb3ctaW5lcnQtbm9kZS1jb25kaXRpb25gKS5cbiAgICAgIGlkOiAnY2hlY2tfaG90JywgdHlwZTogJ2RlY2lzaW9uJywgbGFiZWw6ICdIb3QgTGVhZCAocmF0aW5nIFx1MjI2NSA0KT8nLFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgSG90IHBhdGg6IDEtZGF5IFNMQSwgaGlnaC1zZXZlcml0eSBhbGVydCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBpZDogJ3NsYV9ob3QnLCB0eXBlOiAndXBkYXRlX3JlY29yZCcsIGxhYmVsOiAnU2V0IDEtRGF5IFNMQScsXG4gICAgICBjb25maWc6IHsgb2JqZWN0TmFtZTogJ2NybV9sZWFkJywgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkLmlkYCB9LCBmaWVsZHM6IHsgbmV4dF9mb2xsb3d1cF9kYXRlOiBjZWxgaXNvRGF0ZShkYXlzRnJvbU5vdygxKSlgIH0gfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnbm90aWZ5X2hvdCcsIHR5cGU6ICdub3RpZnknLCBsYWJlbDogJ0FsZXJ0IFx1MjAxNCBIb3QgTGVhZCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgLy8gUm91dGUgdG8gdGhlIGxlYWQncyBPV05FUiAoYSByZWFsIHVzZXIgaWQpLiBBIENSTSBwb3NpdGlvbiBsaWtlXG4gICAgICAgIC8vICdzYWxlc19tYW5hZ2VyJyBpcyBOT1QgYSBtZXNzYWdpbmcgYXVkaWVuY2UgXHUyMDE0IHRoZSBtZXNzYWdpbmcgc2VydmljZVxuICAgICAgICAvLyByZXNvbHZlcyB1c2VyOi9yb2xlOihzeXNfbWVtYmVyKS90ZWFtOi9vd25lcl9vZjosIGFuZCBhIGJhcmVcbiAgICAgICAgLy8gJ3NhbGVzX21hbmFnZXInIHdhcyBzdG9yZWQgdmVyYmF0aW0gYXMgc3lzX2luYm94X21lc3NhZ2UudXNlcl9pZCxcbiAgICAgICAgLy8gbWF0Y2hpbmcgbm8gcmVhbCB1c2VyLCBzbyB0aGVzZSBhbGVydHMgcmVhY2hlZCBub2JvZHkuIG93bmVyIGlzIHNldFxuICAgICAgICAvLyBvbiBpbnNlcnQgKGRlZmF1bHRWYWx1ZSBvcy51c2VyLmlkKSBhbmQgaXMgdGhlIGFjY291bnRhYmxlIHBhcnR5LlxuICAgICAgICByZWNpcGllbnRzOiBbY2VsYHJlY29yZC5vd25lcl9pZGBdLFxuICAgICAgICBjaGFubmVsczogWydpbmJveCcsICdlbWFpbCddLFxuICAgICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgICB0b3BpYzogJ2xlYWRfcm91dGluZycsXG4gICAgICAgIHRlbXBsYXRlOiAnY3JtLmxlYWRfcm91dGluZ19ob3QnLFxuICAgICAgICB0ZW1wbGF0ZURhdGE6IHtcbiAgICAgICAgICBmaXJzdF9uYW1lOiBjZWxgcmVjb3JkLmZpcnN0X25hbWVgLCBsYXN0X25hbWU6IGNlbGByZWNvcmQubGFzdF9uYW1lYCxcbiAgICAgICAgICBjb21wYW55OiBjZWxgcmVjb3JkLmNvbXBhbnlgLCByYXRpbmc6IGNlbGByZWNvcmQucmF0aW5nYCxcbiAgICAgICAgfSxcbiAgICAgICAgYWN0aW9uVXJsOiAnL2NybV9sZWFkL3t7cmVjb3JkLmlkfX0nLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFN0YW5kYXJkIHBhdGg6IDMtZGF5IFNMQSwgbm9ybWFsIGFsZXJ0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGlkOiAnc2xhX3N0ZCcsIHR5cGU6ICd1cGRhdGVfcmVjb3JkJywgbGFiZWw6ICdTZXQgMy1EYXkgU0xBJyxcbiAgICAgIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX2xlYWQnLCBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sIGZpZWxkczogeyBuZXh0X2ZvbGxvd3VwX2RhdGU6IGNlbGBpc29EYXRlKGRheXNGcm9tTm93KDMpKWAgfSB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdub3RpZnlfc3RkJywgdHlwZTogJ25vdGlmeScsIGxhYmVsOiAnQWxlcnQgXHUyMDE0IE5ldyBMZWFkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBSb3V0ZSB0byB0aGUgbGVhZCdzIG93bmVyIFx1MjAxNCBzZWUgbm90aWZ5X2hvdCBmb3Igd2h5IGEgYmFyZVxuICAgICAgICAvLyAnc2FsZXNfbWFuYWdlcicgcG9zaXRpb24gbmV2ZXIgcmVhY2hlZCBhbnlvbmUuXG4gICAgICAgIHJlY2lwaWVudHM6IFtjZWxgcmVjb3JkLm93bmVyX2lkYF0sXG4gICAgICAgIGNoYW5uZWxzOiBbJ2luYm94J10sXG4gICAgICAgIHRvcGljOiAnbGVhZF9yb3V0aW5nJyxcbiAgICAgICAgdGVtcGxhdGU6ICdjcm0ubGVhZF9yb3V0aW5nX25ldycsXG4gICAgICAgIHRlbXBsYXRlRGF0YToge1xuICAgICAgICAgIGZpcnN0X25hbWU6IGNlbGByZWNvcmQuZmlyc3RfbmFtZWAsIGxhc3RfbmFtZTogY2VsYHJlY29yZC5sYXN0X25hbWVgLCBjb21wYW55OiBjZWxgcmVjb3JkLmNvbXBhbnlgLFxuICAgICAgICB9LFxuICAgICAgICBhY3Rpb25Vcmw6ICcvY3JtX2xlYWQve3tyZWNvcmQuaWR9fScsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdjaGVja19ob3QnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAvLyBUT1RBTElUWTogdGhlc2UgdHdvIGVkZ2VzIG11c3QgUEFSVElUSU9OIGV2ZXJ5IGxlYWQgXHUyMDE0IGEgcmF0aW5nXG4gICAgLy8gdGhlIHByZWRpY2F0ZSBjYW5ub3QgcmVhZCBoYXMgdG8gZmFsbCBkb3duIG9uZSBicmFuY2gsIG5ldmVyIG5laXRoZXIuXG4gICAgLy8gR3VhcmRpbmcgYm90aCB3aXRoIGBoYXMoLi4uKSAmJmAgd291bGQgaGF2ZSB0cmFkZWQgYSBsb3VkIGFib3J0IGZvciBhXG4gICAgLy8gc2lsZW50IG5vLW9wICh1bnJhdGVkIGxlYWQgXHUyMTkyIG5vIFNMQSwgbm8gYWxlcnQsIG5vIGVycm9yKSwgd2hpY2ggaXMgdGhlXG4gICAgLy8gXCJkZWNsYXJlZCBcdTIyNjAgZW5mb3JjZWRcIiBzaGFwZSB0aGlzIHJlcG8ga2VlcHMgZGVsZXRpbmcgcnVsZXMgb3Zlci4gU28gdGhlXG4gICAgLy8gaG90IGJyYW5jaCBkZW1hbmRzIGEgcmVhZGFibGUgcmF0aW5nIGFuZCB0aGUgc3RhbmRhcmQgYnJhbmNoIGFic29yYnNcbiAgICAvLyBldmVyeXRoaW5nIGVsc2U6IGFuIHVucmF0ZWQgbGVhZCBpcywgY29ycmVjdGx5LCBub3QgYSBob3QgbGVhZC5cbiAgICAvL1xuICAgIC8vIGByYXRpbmdgIGlzIG5laXRoZXIgcmVxdWlyZWQgbm9yIGRlZmF1bHRlZCwgc28gYSBsZWFkIHdyaXR0ZW4gd2l0aG91dCBvbmVcbiAgICAvLyBpcyBzdG9yZWQgd2l0aCBOTyBgcmF0aW5nYCBjb2x1bW4gb24gZHJpdmVyLW1lbW9yeSAvIGRyaXZlci1tb25nb2RiLlxuICAgIC8vIE1lYXN1cmVkIGVuZC10by1lbmQ6IHRoZSB1bmd1YXJkZWQgYHJlY29yZC5yYXRpbmcgPj0gNGAgYWJvcnRlZCB3aXRoIGBOb1xuICAgIC8vIHN1Y2gga2V5OiByYXRpbmdgIGFuZCBhbiB1bnJhdGVkIGxlYWQgZ290IG5vIFNMQSBzdGFtcCBhbmQgbm8gYWxlcnQgYXRcbiAgICAvLyBhbGwuIGBoYXMoKWAgYWxvbmUgaXMgbm90IGVub3VnaCBvbiBhbiBPUkRFUklORyBjb21wYXJpc29uIFx1MjAxNCBhbiBleHBsaWNpdFxuICAgIC8vIGByYXRpbmc6IG51bGxgIHBhc3NlcyBgaGFzKClgIGFuZCB0aGVuIGFib3J0cyB3aXRoIGBubyBzdWNoIG92ZXJsb2FkOlxuICAgIC8vIGR5bjxudWxsPiA+PSBpbnRgIFx1MjAxNCBzbyBib3RoIGd1YXJkcyBhcmUgcmVxdWlyZWQsIGluIHRoaXMgb3JkZXIuXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAnY2hlY2tfaG90JywgdGFyZ2V0OiAnc2xhX2hvdCcsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnJhdGluZykgJiYgcmVjb3JkLnJhdGluZyAhPSBudWxsICYmIHJlY29yZC5yYXRpbmcgPj0gNGAsIGxhYmVsOiAnSG90JyB9LFxuICAgIHsgaWQ6ICdlMycsIHNvdXJjZTogJ2NoZWNrX2hvdCcsIHRhcmdldDogJ3NsYV9zdGQnLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IFBgIWhhcyhyZWNvcmQucmF0aW5nKSB8fCByZWNvcmQucmF0aW5nID09IG51bGwgfHwgcmVjb3JkLnJhdGluZyA8IDRgLCBsYWJlbDogJ1N0YW5kYXJkJyB9LFxuICAgIHsgaWQ6ICdlNCcsIHNvdXJjZTogJ3NsYV9ob3QnLCB0YXJnZXQ6ICdub3RpZnlfaG90JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U1Jywgc291cmNlOiAnbm90aWZ5X2hvdCcsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlNicsIHNvdXJjZTogJ3NsYV9zdGQnLCB0YXJnZXQ6ICdub3RpZnlfc3RkJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U3Jywgc291cmNlOiAnbm90aWZ5X3N0ZCcsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL2NvbnRhY3Qtd2VsY29tZS5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL2NvbnRhY3Qtd2VsY29tZS5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogTmV3LWNvbnRhY3QgYWxlcnQgXHUyMDE0IHJlY29yZC1jaGFuZ2UgZmxvdyBvbiBjb250YWN0IGluc2VydC5cbiAqXG4gKiBcdTI2RDQgTm90aWZpZXMgdGhlIE9XTkVSLCBuZXZlciB0aGUgY29udGFjdC4gYG5vdGlmeWAgYWRkcmVzc2VzIHBsYXRmb3JtIHVzZXJzIFx1MjAxNFxuICogYSByYXcgZW1haWwgYWRkcmVzcyBpcyBzdG9yZWQgdmVyYmF0aW0gYXMgYW4gaW5ib3ggYHVzZXJfaWRgIGFuZCByZWFjaGVzXG4gKiBub2JvZHkuIEEgdHJ1ZSBvdXRib3VuZCB3ZWxjb21lIGVtYWlsIHRvIHRoZSBjb250YWN0IG5lZWRzIGFuIGVtYWlsIGNvbm5lY3RvclxuICogYWN0aW9uLCBub3QgYW4gaW5ib3ggbm90aWZpY2F0aW9uLlxuICpcbiAqIEdhdGVkIG9uIGBlbWFpbF9vcHRfb3V0ICE9IHRydWVgIHNvIGFuIG9wdGVkLW91dCBjb250YWN0IHRyaWdnZXJzIG5vIG91dHJlYWNoXG4gKiBwcm9tcHQsIGFuZCBza2lwcGVkIGVudGlyZWx5IHdoZW4gdGhlcmUgaXMgbm8gb3duZXIgdG8gbm90aWZ5LlxuICovXG5leHBvcnQgY29uc3QgQ29udGFjdFdlbGNvbWVGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnY29udGFjdF93ZWxjb21lJyxcbiAgbGFiZWw6ICdDb250YWN0IFdlbGNvbWUnLFxuICBkZXNjcmlwdGlvbjogJ09uIG5ldyBjb250YWN0OiBwcm9tcHQgdGhlIG93bmVyIHRvIHdlbGNvbWUgdGhlbS4nLFxuICB0eXBlOiAncmVjb3JkX2NoYW5nZScsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG4gIC8vIEEgcmVjb3JkLWNoYW5nZSBmbG93IGZpcmVkIGJ5IGEgU1lTVEVNIHdyaXRlIGNhcnJpZXMgbm8gdHJpZ2dlciB1c2VyXG4gIC8vIGVpdGhlciAoQURSLTAwNDkpIFx1MjAxNCBhbmQgdGhpcyBmbG93IGV4aXN0cyBGT1IgdGhhdFxuICAvLyBwb3B1bGF0aW9uOiB0aGUgc3RhcnQgY29uZGl0aW9uIGJlbG93IGFscmVhZHkgZG9jdW1lbnRzIHRoZSBzZWVkZWQgL1xuICAvLyBpbnRlZ3JhdGlvbi13cml0dGVuIGNvbnRhY3RzIHdob3NlIGBvd25lcl9pZGAgdGhlIHNlY3VyaXR5IG1pZGRsZXdhcmVcbiAgLy8gbmV2ZXIgc3RhbXBlZCBiZWNhdXNlIHRoZSB3cml0ZSBjYXJyaWVkIG5vIHNlc3Npb24uXG4gIC8vXG4gIC8vIE1lYXN1cmVkIGhvbmVzdGx5IG9uIDE3LjAuMC1yYy4yOiB0aGlzIGZsb3cgaGFzIE5PIGRhdGEgbm9kZSB0b2RheSAoc3RhcnRcbiAgLy8gXHUyMTkyIG5vdGlmeSBcdTIxOTIgZW5kKSwgdGhlIHJ1bkFzIHJlZnVzYWwgY292ZXJzIGdldC9jcmVhdGUvdXBkYXRlL2RlbGV0ZSBvbmx5LFxuICAvLyBhbmQgYG5vdGlmeWAgZGlzcGF0Y2hlcyB0aHJvdWdoIHRoZSBtZXNzYWdpbmcgc2VydmljZSB3aXRob3V0IGEgcnVuIGRhdGFcbiAgLy8gY29udGV4dCBcdTIwMTQgc28gYSB1c2VyLWxlc3MgcnVuIGNvbXBsZXRlcyBhbmQgZGVsaXZlcnMgdG9kYXksIGFuZCB0aGlzXG4gIC8vIGRlY2xhcmF0aW9uIGNoYW5nZXMgbm90aGluZyBvYnNlcnZhYmxlIHJpZ2h0IG5vdy4gSXQgaXMgZGVjbGFyZWQgYW55d2F5XG4gIC8vIGJlY2F1c2UgdGhlIGRlY2lzaW9uIGJlaW5nIHJlY29yZGVkIGlzIFwicmVjb3JkLWNoYW5nZSBhdXRvbWF0aW9uIHJ1bnMgYXNcbiAgLy8gdGhlIHBsYXRmb3JtXCIsIG5vdCBcInRoaXMgZmxvdyBjdXJyZW50bHkgaGFwcGVucyB0byBoYXZlIG5vIGRhdGEgbm9kZVwiLlxuICAvLyBUaGUgZGF5IGEgZGF0YSBub2RlIGlzIGFkZGVkIFx1MjAxNCBvciBhIHN0YXJ0LW5vZGUgYGNvbmZpZy5leHBhbmRgLCB3aGljaCBpc1xuICAvLyB0aGUgcmVtZWR5IHRoZSBub3RpZnkgbm9kZSdzIG93biBlcnJvciBtZXNzYWdlIHJlY29tbWVuZHMgYW5kIHdoaWNoIHJlYWRzXG4gIC8vIHRocm91Z2ggdGhlIHNhbWUgZ3VhcmRlZCBwYXRoIFx1MjAxNCB0aGUgZWxldmF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVhc29uZWRcbiAgLy8gYWJvdXQgaGVyZSByYXRoZXIgdGhhbiBkaXNjb3ZlcmVkIGFzIGEgcmVmdXNhbCBpbiBwcm9kdWN0aW9uLiBFbGV2YXRpb24gaXNcbiAgLy8gaGFybWxlc3MgZm9yIHRoZSB1c2VyLWRyaXZlbiBydW5zOiB0aGVyZSBpcyBubyBkYXRhIG9wZXJhdGlvbiB0byBzY29wZS5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICB2YXJpYWJsZXM6IFtdLFxuICBub2RlczogW1xuICAgIHtcbiAgICAgIGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0IChjb250YWN0IGNyZWF0ZWQpJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2NvbnRhY3QnLFxuICAgICAgICB0cmlnZ2VyVHlwZTogJ3JlY29yZC1hZnRlci1jcmVhdGUnLFxuICAgICAgICAvLyBUT1RBTElUWTogZXZlcnkgYHJlY29yZC54YCByZWFkIGNhcnJpZXMgYSBgaGFzKHJlY29yZC54KWBcbiAgICAgICAgLy8gZ3VhcmQgXHUyMDE0IHNlZSB0aGUgaG91c2UtcnVsZSBibG9jayBpblxuICAgICAgICAvLyBgdGVzdC9mbG93LWNvbmRpdGlvbi10b3RhbGl0eS50ZXN0LnRzYC4gVGhlIGFic2VudC1rZXkgY2FzZSBpcyByZWFsXG4gICAgICAgIC8vIGhlcmUsIG5vdCBoeXBvdGhldGljYWw6IGBvd25lcl9pZGAgaXMgYXV0by1zdGFtcGVkIGJ5IHRoZSBzZWN1cml0eVxuICAgICAgICAvLyBtaWRkbGV3YXJlIG9ubHkgb24gd3JpdGVzIHRoYXQgQ0FSUlkgYSB1c2VyLCBhbmQgYSBzeXN0ZW0gd3JpdGUgXHUyMDE0XG4gICAgICAgIC8vIHNlZWQgZGF0YSwgYW4gaW50ZWdyYXRpb24sIGEgYHJ1bkFzOiAnc3lzdGVtJ2AgZmxvdyBcdTIwMTQgc2hvcnQtY2lyY3VpdHNcbiAgICAgICAgLy8gdGhhdCBtaWRkbGV3YXJlIGVudGlyZWx5LiBTdWNoIGEgcm93IHJlYWNoZXMgZHJpdmVyLW1lbW9yeVxuICAgICAgICAvLyB3aXRoIE5PIGBvd25lcl9pZGAgY29sdW1uIGF0IGFsbCwgc28gYHJlY29yZC5vd25lcl9pZCAhPSBudWxsYCBhbG9uZVxuICAgICAgICAvLyBhYm9ydHMgd2l0aCBgTm8gc3VjaCBrZXlgIGFuZCBubyBzZWVkZWQgY29udGFjdCBldmVyIGdldHMgYSB3ZWxjb21lXG4gICAgICAgIC8vIHByb21wdC4gYCE9IG51bGxgIGlzIG5vdCBhIHN1YnN0aXR1dGUgZm9yIGBoYXMoKWA6IG9uIGFuIGFic2VudCBrZXlcbiAgICAgICAgLy8gaXQgYWJvcnRzIGV4YWN0bHkgbGlrZSBgPT0gXCJ2XCJgIGRvZXMuIEFuIGFic2VudCBgZW1haWxfb3B0X291dGBcbiAgICAgICAgLy8gbWVhbnMgdGhlIGNvbnRhY3QgaGFzIG5vdCBvcHRlZCBvdXQuXG4gICAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLm93bmVyX2lkKSAmJiByZWNvcmQub3duZXJfaWQgIT0gbnVsbFxuICAgICAgICAgICYmICghaGFzKHJlY29yZC5lbWFpbF9vcHRfb3V0KSB8fCByZWNvcmQuZW1haWxfb3B0X291dCAhPSB0cnVlKWAsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdzZW5kX3dlbGNvbWUnLCB0eXBlOiAnbm90aWZ5JywgbGFiZWw6ICdQcm9tcHQgT3duZXIgdG8gV2VsY29tZScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgcmVjaXBpZW50czogW2NlbGByZWNvcmQub3duZXJfaWRgXSxcbiAgICAgICAgY2hhbm5lbHM6IFsnaW5ib3gnLCAnZW1haWwnXSxcbiAgICAgICAgdG9waWM6ICdjb250YWN0X3dlbGNvbWUnLFxuICAgICAgICB0ZW1wbGF0ZTogJ2NybS5jb250YWN0X3dlbGNvbWUnLFxuICAgICAgICB0ZW1wbGF0ZURhdGE6IHsgZmlyc3RfbmFtZTogY2VsYHJlY29yZC5maXJzdF9uYW1lYCwgbGFzdF9uYW1lOiBjZWxgcmVjb3JkLmxhc3RfbmFtZWAgfSxcbiAgICAgICAgYWN0aW9uVXJsOiAnL2NybV9jb250YWN0L3t7cmVjb3JkLmlkfX0nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdzZW5kX3dlbGNvbWUnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdzZW5kX3dlbGNvbWUnLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9vcHBvcnR1bml0eS13b24tYWxlcnQuZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9vcHBvcnR1bml0eS13b24tYWxlcnQuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUCwgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xuaW1wb3J0IHsgTEFSR0VfREVBTF9BTU9VTlQgfSBmcm9tICcuLi9vYmplY3RzL190aHJlc2hvbGRzJztcbnR5cGUgRmxvdyA9IEF1dG9tYXRpb24uRmxvdztcblxuLyoqXG4gKiBMYXJnZS1kZWFsLXdvbiBhbGVydCBcdTIwMTQgcmVjb3JkLWNoYW5nZSBmbG93IG9uIG9wcG9ydHVuaXR5IHVwZGF0ZS5cbiAqXG4gKiBXaGVuIGEgZGVhbCBvZiAkMTAwSyBvciBtb3JlIGlzIG1hcmtlZCBjbG9zZWRfd29uLCBub3RpZnkgdGhlIG93bmVyIFx1MjAxNCB0aGVcbiAqIG93bmVyIGFsb25lLCBub3QgdGhlaXIgbWFuYWdlciAoc2VlIHRoZSBub3RpZnkgbm9kZSBmb3Igd2h5IHRoZSBtYW5hZ2VyXG4gKiBjYW5ub3QgYmUgcmVhY2hlZCkuXG4gKlxuICogVGhlIGN1dCBpcyBJTkNMVVNJVkUgKGA+PWApOiBgTEFSR0VfREVBTF9BTU9VTlRgIG11c3QgbWVhbiBvbmUgdGhpbmcgYWNyb3NzXG4gKiB0aGlzIGFsZXJ0LCB0aGUgYXBwcm92YWwgZW50cnkgZ2F0ZSBhbmQgYm90aCBzaGFyaW5nIHJ1bGVzLCBzbyBhIGRlYWwgYXRcbiAqIGV4YWN0bHkgJDEwMCwwMDAgaXMgYW5ub3VuY2VkIG9uIHdpbiBmb3IgdGhlIHNhbWUgcmVhc29uIGl0IGlzIHNoYXJlZCB3aXRoXG4gKiBsZWFkZXJzaGlwLiBcdTI2RDQgTmV2ZXIgbGV0IHRoaXMgc2l0ZSBhbmQgdGhlIHNoYXJpbmcgcnVsZXMgY3V0IGRpZmZlcmVudGx5IFx1MjAxNCBhXG4gKiBkZWFsIG9uIHRoZSBsaW5lIHRoZW4gYmVjb21lcyB2aXNpYmxlIHRvIGxlYWRlcnNoaXAgYW5kIGludmlzaWJsZSB0b1xuICogZ292ZXJuYW5jZS5cbiAqXG4gKiBOQjogYHJlY29yZC5hbW91bnQgPj0gMTAwMDAwYCBpcyBhdXRob3JlZCBhcyBiYXJlIENFTCBhZ2FpbnN0IHRoZVxuICogKHN0cmluZy1zZXJpYWxpemVkKSBjdXJyZW5jeSBmaWVsZCwgd2hpY2ggcmVsaWVzIG9uIHRoZSA3LjcgbnVtZXJpYy1oeWRyYXRpb25cbiAqIGZpeDsgcHJlLTcuNyBpdCB3b3VsZCBoYXZlIG5lZWRlZCBgZG91YmxlKHJlY29yZC5hbW91bnQpYC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9wcG9ydHVuaXR5V29uQWxlcnRGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnb3Bwb3J0dW5pdHlfd29uX2FsZXJ0JyxcbiAgbGFiZWw6ICdMYXJnZSBEZWFsIFdvbiBBbGVydCcsXG4gIGRlc2NyaXB0aW9uOiAnT24gY2xvc2VkX3dvbiBvcHBvcnR1bml0aWVzIG9mICQxMDBLIG9yIG1vcmU6IG5vdGlmeSB0aGUgb3duZXIgXHUyMDE0IHRoZSBvd25lciBhbG9uZSwgbm90IHRoZWlyIG1hbmFnZXIuJyxcbiAgdHlwZTogJ3JlY29yZF9jaGFuZ2UnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBBIHJlY29yZC1jaGFuZ2UgZmxvdyBmaXJlZCBieSBhIFNZU1RFTSB3cml0ZSBjYXJyaWVzIG5vIHRyaWdnZXIgdXNlclxuICAvLyBlaXRoZXIgKEFEUi0wMDQ5KS4gRGVhbHMgcmVhY2ggYGNsb3NlZF93b25gIHRocm91Z2hcbiAgLy8gbWFjaGluZXJ5IGFzIHdlbGwgYXMgdGhyb3VnaCBhIHJlcCdzIG93biBzYXZlIFx1MjAxNCBgbGVhZF9jb252ZXJzaW9uYCBhbmQgdGhlXG4gIC8vIGBjb250cmFjdF9yZW5ld2FsYCBzd2VlcCBib3RoIHdyaXRlIG9wcG9ydHVuaXRpZXMsIGFuZCB0aGUgbGF0dGVyIGlzXG4gIC8vIGl0c2VsZiBgcnVuQXM6ICdzeXN0ZW0nYC5cbiAgLy9cbiAgLy8gTWVhc3VyZWQgaG9uZXN0bHkgb24gMTcuMC4wLXJjLjI6IHRoaXMgZmxvdyBoYXMgTk8gZGF0YSBub2RlIChzdGFydCBcdTIxOTJcbiAgLy8gbm90aWZ5IFx1MjE5MiBlbmQpLCBzbyB0aGUgcmVmdXNhbCBkb2VzIG5vdCByZWFjaCBpdCB0b2RheSBhbmQgZGVjbGFyaW5nXG4gIC8vIGBzeXN0ZW1gIGNoYW5nZXMgbm90aGluZyBvYnNlcnZhYmxlLiBEZWNsYXJlZCBmb3IgdGhlIHNhbWUgcmVhc29uIGFzXG4gIC8vIGBjb250YWN0X3dlbGNvbWVgIFx1MjAxNCBzZWUgdGhlIGZ1bGxlciBub3RlIHRoZXJlLiBOb3RoaW5nIHRvIHNjb3BlLCBzb1xuICAvLyBlbGV2YXRpbmcgdGhlIHVzZXItZHJpdmVuIHJ1bnMgY29zdHMgbm90aGluZy5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICB2YXJpYWJsZXM6IFtdLFxuICBub2RlczogW1xuICAgIHtcbiAgICAgIGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0IChvcHAgdXBkYXRlZCknLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgICB0cmlnZ2VyVHlwZTogJ3JlY29yZC1hZnRlci11cGRhdGUnLFxuICAgICAgICAvLyBgcHJldmlvdXMuc3RhZ2VgIGd1YXJkOiBmaXJlIG9uIHRoZSBUUkFOU0lUSU9OIGludG8gY2xvc2VkX3dvbiBvbmx5LlxuICAgICAgICAvLyBXaXRob3V0IGl0IGV2ZXJ5IGxhdGVyIGVkaXQgb2YgYSB3b24gZGVhbCAoc2VlZC1vd25lcnNoaXBcbiAgICAgICAgLy8gY2xhaW1zLCBhcHByb3ZhbC1zdGF0dXMgc3RhbXBzLCBkZXNjcmlwdGlvbiB0d2Vha3MpIHJlLXNlbnQgdGhlXG4gICAgICAgIC8vIGNvbmdyYXR1bGF0aW9ucyBibGFzdC4gVGhlIHRyaWdnZXIgZm9yd2FyZHMgYHByZXZpb3VzYCBpbnRvIHRoZVxuICAgICAgICAvLyBjb25kaXRpb24gc2NvcGUgKGNmLiB0aGUgZW5naW5lJ3MgcmVjb3JkLWNoYW5nZSBjb250ZXh0KS5cbiAgICAgICAgLy8gVE9UQUxJVFk6IGBoYXMoLi4uKWAgb24gZXZlcnkgcmVhZCwgcGx1cyBgIT0gbnVsbGAgb24gdGhlXG4gICAgICAgIC8vIG9yZGVyaW5nIGNvbXBhcmlzb24gKGBoYXMoKWAgcGFzc2VzIGFuIGV4cGxpY2l0IG51bGwgYW5kXG4gICAgICAgIC8vIGByZWNvcmQuYW1vdW50ID49IDEwMDAwMGAgdGhlbiBhYm9ydHMgd2l0aFxuICAgICAgICAvLyBgbm8gc3VjaCBvdmVybG9hZDogZHluPG51bGw+ID49IGludGApLlxuICAgICAgICAvL1xuICAgICAgICAvLyBgcHJldmlvdXMuc3RhZ2VgIGlzIGd1YXJkZWQgRkFJTC1DTE9TRUQgXHUyMDE0IGBoYXMocHJldmlvdXMuc3RhZ2UpICYmYCxcbiAgICAgICAgLy8gbm90IGAhaGFzKHByZXZpb3VzLnN0YWdlKSB8fGAgXHUyMDE0IHdoaWNoIGlzIHRoZSBvcHBvc2l0ZSBvZiBob3dcbiAgICAgICAgLy8gYHJlY29yZC5zdGFnZWAgaXMgZ3VhcmRlZCwgZGVsaWJlcmF0ZWx5LiBUaGlzIHRlcm0gZXhpc3RzIHNvbGVseSB0b1xuICAgICAgICAvLyBzdXBwcmVzcyBhIHJlLWZpcmUsIGFuZCB0aGUgZmFpbHVyZSBpdCB3YXMgd3JpdHRlbiBmb3IgKGFcbiAgICAgICAgLy8gY29uZ3JhdHVsYXRpb25zIGJsYXN0IHRvIG1hbmFnZW1lbnQgcmUtc2VudCBvbiBldmVyeSBsYXRlciBlZGl0IG9mIGFcbiAgICAgICAgLy8gd29uIGRlYWwpIGlzIHdvcnNlIHRoYW4gYSBtaXNzZWQgb25lLiBXaGVuIHRoZSBlbmdpbmUgY2Fubm90IHNlZVxuICAgICAgICAvLyB3aGF0IHRoZSBwcmlvciBzdGFnZSB3YXMgaXQgY2Fubm90IHNlZSBhIFRSQU5TSVRJT04gZWl0aGVyLCBzbyBpdFxuICAgICAgICAvLyBtdXN0IG5vdCBjbGFpbSBvbmUuIEluIHByYWN0aWNlIGBwcmV2aW91c2AgaXMgYSBmdWxsIHByaW9yIHJvdyBvblxuICAgICAgICAvLyBldmVyeSByZWNvcmQtYWZ0ZXItdXBkYXRlOyB0aGUgc2hhcGUgdGhpcyBjb3ZlcnMgaXMgYSBidWxrXG4gICAgICAgIC8vIGB1cGRhdGVNYW55YCwgd2hlcmUgT2JqZWN0UUwgbmV2ZXIgcmVhZHMgYSBwcmlvciByb3cgYW5kIGBwcmV2aW91c2BcbiAgICAgICAgLy8gYXJyaXZlcyBudWxsIFx1MjAxNCBhbmQgZmlyaW5nIG9uZSBibGFzdCBwZXIgcm93IG9mIGEgYnVsayB1cGRhdGUgaXNcbiAgICAgICAgLy8gZXhhY3RseSB3aGF0IG5vYm9keSB3YW50cy5cbiAgICAgICAgY29uZGl0aW9uOiBQYGhhcyhyZWNvcmQuc3RhZ2UpICYmIHJlY29yZC5zdGFnZSA9PSBcImNsb3NlZF93b25cIlxuICAgICAgICAgICYmIGhhcyhwcmV2aW91cy5zdGFnZSkgJiYgcHJldmlvdXMuc3RhZ2UgIT0gXCJjbG9zZWRfd29uXCJcbiAgICAgICAgICAmJiBoYXMocmVjb3JkLmFtb3VudCkgJiYgcmVjb3JkLmFtb3VudCAhPSBudWxsICYmIHJlY29yZC5hbW91bnQgPj0gJHtMQVJHRV9ERUFMX0FNT1VOVH1gLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSBgbGFiZWxgIG5hbWVzIHdoYXQgdGhpcyBub2RlIGFjdHVhbGx5IGRvZXM6IGl0IG5vdGlmaWVzIHRoZSBvd25lclxuICAgICAgLy8gYW5kIG5vYm9keSBlbHNlLiBUaGUgYGlkYCBrZWVwcyBpdHMgb3JpZ2luYWwgYG5vdGlmeV9tYW5hZ2VtZW50YFxuICAgICAgLy8gc3BlbGxpbmcgb24gcHVycG9zZSBcdTIwMTQgYGVkZ2VzW11gIHJlZmVyZW5jZSBub2RlcyBieSBpZCwgc28gcmVuYW1pbmcgb25lXG4gICAgICAvLyBpcyBhIGJlaGF2aW91ciBjaGFuZ2UsIG5vdCBhIHdvcmRpbmcgZml4LlxuICAgICAgaWQ6ICdub3RpZnlfbWFuYWdlbWVudCcsIHR5cGU6ICdub3RpZnknLCBsYWJlbDogJ05vdGlmeSBPd25lcicsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgLy8gT3duZXIgb25seTogYHtyZWNvcmQub3duZXJfaWQubWFuYWdlcn1gIGNhbm5vdCB0cmF2ZXJzZSBhIGxvb2t1cCBvbiB0aGVcbiAgICAgICAgLy8gcmF3IHRyaWdnZXIgc25hcHNob3QgXHUyMDE0IGl0IGludGVycG9sYXRlcyB0byB0aGUgbGl0ZXJhbCBcInVuZGVmaW5lZFwiXG4gICAgICAgIC8vIGFuZCB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQgdG8gYSBwaGFudG9tIHVzZXIuXG4gICAgICAgIHJlY2lwaWVudHM6IFtjZWxgcmVjb3JkLm93bmVyX2lkYF0sXG4gICAgICAgIGNoYW5uZWxzOiBbJ2luYm94JywgJ2VtYWlsJ10sXG4gICAgICAgIHNldmVyaXR5OiAnaW5mbycsXG4gICAgICAgIHRvcGljOiAnbGFyZ2VfZGVhbF93b24nLFxuICAgICAgICB0ZW1wbGF0ZTogJ2NybS5sYXJnZV9kZWFsX3dvbicsXG4gICAgICAgIHRlbXBsYXRlRGF0YTogeyBuYW1lOiBjZWxgcmVjb3JkLm5hbWVgLCBhbW91bnQ6IGNlbGByZWNvcmQuYW1vdW50YCB9LFxuICAgICAgICBhY3Rpb25Vcmw6ICcvY3JtX29wcG9ydHVuaXR5L3t7cmVjb3JkLmlkfX0nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdub3RpZnlfbWFuYWdlbWVudCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ25vdGlmeV9tYW5hZ2VtZW50JywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3MvdGFzay11cmdlbnQtYWxlcnQuZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy90YXNrLXVyZ2VudC1hbGVydC5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogVXJnZW50IHRhc2sgYWxlcnQgXHUyMDE0IHJlY29yZC1jaGFuZ2UgZmxvdyBvbiB0YXNrIGluc2VydC5cbiAqXG4gKiBXaGVuIGFuIHVyZ2VudCwgbm90LXlldC1jb21wbGV0ZWQgdGFzayBpcyBjcmVhdGVkLCBub3RpZnkgaXRzIG93bmVyLlxuICovXG5leHBvcnQgY29uc3QgVGFza1VyZ2VudEFsZXJ0RmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ3Rhc2tfdXJnZW50X2FsZXJ0JyxcbiAgbGFiZWw6ICdVcmdlbnQgVGFzayBBbGVydCcsXG4gIGRlc2NyaXB0aW9uOiAnT24gbmV3IHVyZ2VudCB0YXNrOiBub3RpZnkgdGhlIG93bmVyLicsXG4gIHR5cGU6ICdyZWNvcmRfY2hhbmdlJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gQSByZWNvcmQtY2hhbmdlIGZsb3cgZmlyZWQgYnkgYSBTWVNURU0gd3JpdGUgY2FycmllcyBubyB0cmlnZ2VyIHVzZXJcbiAgLy8gZWl0aGVyIChBRFItMDA0OSksIGFuZCBtb3N0IHVyZ2VudCB0YXNrcyBpbiB0aGlzIGFwcCBhcmVcbiAgLy8gbWFjaGluZS13cml0dGVuOiBgY2FzZV9zdGF0dXNfc2lkZV9lZmZlY3RzYCBvcGVucyB0aGUgZXNjYWxhdGlvbiBmb2xsb3ctdXBcbiAgLy8gdGFzaywgYW5kIHRoZSBzY2hlZHVsZWQgc3dlZXBzIGNyZWF0ZSB0aGVpciBvd24gXHUyMDE0IG5vbmUgb2YgdGhvc2Ugd3JpdGVzXG4gIC8vIGNhcnJpZXMgYSBzZXNzaW9uLlxuICAvL1xuICAvLyBNZWFzdXJlZCBob25lc3RseSBvbiAxNy4wLjAtcmMuMjogdGhpcyBmbG93IGhhcyBOTyBkYXRhIG5vZGUgKHN0YXJ0IFx1MjE5MlxuICAvLyBub3RpZnkgXHUyMTkyIGVuZCksIHNvIHRoZSByZWZ1c2FsIGRvZXMgbm90IHJlYWNoIGl0IHRvZGF5IGFuZCBkZWNsYXJpbmdcbiAgLy8gYHN5c3RlbWAgY2hhbmdlcyBub3RoaW5nIG9ic2VydmFibGUuIERlY2xhcmVkIGZvciB0aGUgc2FtZSByZWFzb24gYXNcbiAgLy8gYGNvbnRhY3Rfd2VsY29tZWAgXHUyMDE0IHNlZSB0aGUgZnVsbGVyIG5vdGUgdGhlcmU6IHRoZSByZWNvcmRlZCBkZWNpc2lvbiBpc1xuICAvLyB0aGF0IHJlY29yZC1jaGFuZ2UgYXV0b21hdGlvbiBydW5zIGFzIHRoZSBwbGF0Zm9ybSwgc28gYSBkYXRhIG5vZGUgYWRkZWRcbiAgLy8gbGF0ZXIgaW5oZXJpdHMgYW4gZWxldmF0aW9uIHRoYXQgd2FzIHJlYXNvbmVkIGFib3V0IHJhdGhlciB0aGFuIG9uZVxuICAvLyBkaXNjb3ZlcmVkIGFzIGEgcHJvZHVjdGlvbiByZWZ1c2FsLiBObyBkYXRhIG9wZXJhdGlvbiBleGlzdHMgdG8gc2NvcGUsIHNvXG4gIC8vIGVsZXZhdGluZyB0aGUgdXNlci1kcml2ZW4gcnVucyBjb3N0cyBub3RoaW5nLlxuICBydW5BczogJ3N5c3RlbScsXG4gIHZhcmlhYmxlczogW10sXG4gIG5vZGVzOiBbXG4gICAge1xuICAgICAgaWQ6ICdzdGFydCcsIHR5cGU6ICdzdGFydCcsIGxhYmVsOiAnU3RhcnQgKHRhc2sgY3JlYXRlZCknLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fdGFzaycsXG4gICAgICAgIHRyaWdnZXJUeXBlOiAncmVjb3JkLWFmdGVyLWNyZWF0ZScsXG4gICAgICAgIC8vIEdhdGUgb24gdGhlIGBzdGF0dXNgIGVudW0sIG5vdCB0aGUgYGlzX2NvbXBsZXRlZGAgYm9vbGVhbjogb25cbiAgICAgICAgLy8gU1FMaXRlL2xpYnNxbCBib29sZWFucyBwZXJzaXN0IGFzIGludGVnZXIgMSwgc28gYGlzX2NvbXBsZXRlZCAhPSB0cnVlYFxuICAgICAgICAvLyBpcyBgMSAhPSB0cnVlYCA9IGFsd2F5cyB0cnVlIGFuZCB0aGUgZ3VhcmQgbmV2ZXIgdHJpcHMgKGNmLiB0aGUgc2FtZVxuICAgICAgICAvLyBoYXphcmQgZG9jdW1lbnRlZCBpbiBjYXNlX2VzY2FsYXRpb24pLlxuICAgICAgICAvLyBUT1RBTElUWTogYGhhcyguLi4pYCBvbiBldmVyeSByZWFkLiBCb3RoIGZpZWxkcyBhcmUgYHJlcXVpcmVkYFxuICAgICAgICAvLyBBTkQgZGVmYXVsdGVkIHRvZGF5LCBzbyB0aGlzIHByZWRpY2F0ZSBtZWFzdXJlZCB0b3RhbCBhcyBhdXRob3JlZCBcdTIwMTRcbiAgICAgICAgLy8gYnV0IHRoYXQgaXMgYSBwcm9wZXJ0eSBvZiBgY3JtX3Rhc2tgJ3Mgc2NoZW1hLCBub3Qgb2YgdGhlIHByZWRpY2F0ZS5cbiAgICAgICAgLy8gRHJvcCBlaXRoZXIgZGVmYXVsdCBhbmQgdGhlIGZsb3cgZ29lcyBzaWxlbnRseSBpbmVydCBvblxuICAgICAgICAvLyBkcml2ZXItbWVtb3J5IC8gZHJpdmVyLW1vbmdvZGIsIHdpdGggbm90aGluZyB0byBjYXRjaCBpdC4gQW4gYWJzZW50XG4gICAgICAgIC8vIGBzdGF0dXNgIGlzIG5vdCBgY29tcGxldGVkYCwgc28gaXQgbXVzdCBub3Qgc3VwcHJlc3MgdGhlIGFsZXJ0LlxuICAgICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5wcmlvcml0eSkgJiYgcmVjb3JkLnByaW9yaXR5ID09IFwidXJnZW50XCJcbiAgICAgICAgICAmJiAoIWhhcyhyZWNvcmQuc3RhdHVzKSB8fCByZWNvcmQuc3RhdHVzICE9IFwiY29tcGxldGVkXCIpYCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ25vdGlmeV9vd25lcicsIHR5cGU6ICdub3RpZnknLCBsYWJlbDogJ05vdGlmeSBPd25lcicsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgcmVjaXBpZW50czogW2NlbGByZWNvcmQub3duZXJfaWRgXSxcbiAgICAgICAgY2hhbm5lbHM6IFsnaW5ib3gnLCAnZW1haWwnXSxcbiAgICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgICAgdG9waWM6ICd1cmdlbnRfdGFzaycsXG4gICAgICAgIHRlbXBsYXRlOiAnY3JtLnVyZ2VudF90YXNrJyxcbiAgICAgICAgdGVtcGxhdGVEYXRhOiB7IHN1YmplY3Q6IGNlbGByZWNvcmQuc3ViamVjdGAgfSxcbiAgICAgICAgYWN0aW9uVXJsOiAnL2NybV90YXNrL3t7cmVjb3JkLmlkfX0nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdub3RpZnlfb3duZXInLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdub3RpZnlfb3duZXInLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy90YXNrLWR1ZS1yZW1pbmRlci5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL3Rhc2stZHVlLXJlbWluZGVyLmZsb3cudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGNlbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcbmltcG9ydCB7IGd1YXJkZWQgfSBmcm9tICcuL19ndWFyZGVkLWl0ZXJhdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogVGFzayBEdWUgUmVtaW5kZXIgXHUyMDE0IHNjaGVkdWxlZCB0aW1lLWJhc2VkIHJlbWluZGVycy5cbiAqXG4gKiBUaGUgdGFzayBzY2hlbWEgY2FycmllcyBgcmVtaW5kZXJfZGF0ZWAgKGFuZCBgZHVlX2RhdGVgKSwgYW5kIHRoZSBjYWxlbmRhciAvXG4gKiBnYW50dCB2aWV3cyAqZGlzcGxheSogdGhlbTsgdGhpcyBmbG93IGlzIHdoYXQgd2F0Y2hlcyB0aGUgY2xvY2suIEl0IHN3ZWVwc1xuICogdGFza3Mgd2hvc2UgYHJlbWluZGVyX2RhdGVgIGhhcyBhcnJpdmVkIChhbmQgdGhhdCBhcmUgc3RpbGwgb3BlbiBhbmQgbm90IHlldFxuICogcmVtaW5kZWQpLCBub3RpZmllcyB0aGUgb3duZXIgb24gdGhlIGluYm94ICsgZW1haWwgY2hhbm5lbHMsIGFuZCBzdGFtcHNcbiAqIGByZW1pbmRlcl9zZW50YCBzbyB0aGUgc2FtZSB0YXNrIGlzIG5ldmVyIGFsZXJ0ZWQgdHdpY2UuXG4gKlxuICogTWlycm9ycyBgY2FzZV9zbGFfbW9uaXRvcmAgKHNjaGVkdWxlZCB0cmlnZ2VyICsgZ2V0X3JlY29yZCArIGxvb3AgKyBub3RpZnkgK1xuICogdXBkYXRlX3JlY29yZCksIHdoaWNoIGlzIHRoZSBlc3RhYmxpc2hlZCBwYXR0ZXJuIGZvciB0aW1lLWJhc2VkIHN3ZWVwcyBoZXJlLlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IFRhc2tEdWVSZW1pbmRlckZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICd0YXNrX2R1ZV9yZW1pbmRlcicsXG4gIGxhYmVsOiAnVGFzayBEdWUgUmVtaW5kZXInLFxuICBkZXNjcmlwdGlvbjogJ0hvdXJseSBzd2VlcDogbm90aWZ5IG93bmVycyBvZiB0YXNrcyB3aG9zZSByZW1pbmRlciB0aW1lIGhhcyBhcnJpdmVkLicsXG4gIHR5cGU6ICdzY2hlZHVsZScsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG4gIC8vIFNjaGVkdWxlZCBydW5zIGhhdmUgbm8gdHJpZ2dlciB1c2VyLCBzbyB1bmRlciB0aGUgZGVmYXVsdCBydW5BczondXNlcicgdGhlXG4gIC8vIGRhdGEgbm9kZXMgZXhlY3V0ZSBVTlNDT1BFRCBhbnl3YXkuIERlY2xhcmUgcnVuQXM6J3N5c3RlbScgdG8gbWFrZSB0aGF0XG4gIC8vIFJMUy1ieXBhc3NpbmcgZWxldmF0aW9uIGV4cGxpY2l0IGFuZCBpbnRlbmRlZCAoQURSLTAwNDkpLlxuICBydW5BczogJ3N5c3RlbScsXG5cbiAgdmFyaWFibGVzOiBbXSxcblxuICBub2RlczogW1xuICAgIHtcbiAgICAgIGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0IChob3VybHkpJyxcbiAgICAgIGNvbmZpZzogeyBzY2hlZHVsZTogJzAgKiAqICogKicgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAncXVlcnlfZHVlJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0ZpbmQgVGFza3MgRHVlIGZvciBSZW1pbmRlcicsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV90YXNrJyxcbiAgICAgICAgLy8gRGUtZHVwIHZpYSBgcmVtaW5kZXJfZGF0ZWAgaXRzZWxmOiB0aGUgc3dlZXAgbm90aWZpZXMgdGFza3Mgd2hvc2VcbiAgICAgICAgLy8gcmVtaW5kZXIgdGltZSBoYXMgYXJyaXZlZCwgdGhlbiBDTEVBUlMgcmVtaW5kZXJfZGF0ZSAoc2VlIG1hcmtfc2VudCksXG4gICAgICAgIC8vIHNvIHRoZSByb3cgbm8gbG9uZ2VyIG1hdGNoZXMgYCRsdGVgIG5leHQgdGljay4gV2UgZG8gTk9UIGZpbHRlciBvbiB0aGVcbiAgICAgICAgLy8gYHJlbWluZGVyX3NlbnRgIGJvb2xlYW4gaGVyZSBcdTIwMTQgZW1waXJpY2FsbHksIGEgd2hlcmUtY2xhdXNlIG9uIHRoYXRcbiAgICAgICAgLy8gKG5ld2x5IGFkZGVkKSBib29sZWFuIGNvbHVtbiByZXR1cm5zIHplcm8gcm93cyBhdCBydW50aW1lIGluIHRoaXNcbiAgICAgICAgLy8gZW5naW5lIGJ1aWxkLCB3aGlsZSB0aGUgbG9uZy1zdGFuZGluZyBgaXNfY29tcGxldGVkYCBib29sZWFuIHdvcmtzLlxuICAgICAgICAvLyBSZXVzaW5nIHRoZSB2ZXJpZmllZCBgJGx0ZWAgKyBgaXNfY29tcGxldGVkYCBwcmVkaWNhdGVzIGtlZXBzIHRoZVxuICAgICAgICAvLyBzd2VlcCByZWxpYWJsZTsgYHJlbWluZGVyX3NlbnRgIGlzIHN0aWxsIHN0YW1wZWQgZm9yIHRoZSBhdWRpdCB0cmFpbC5cbiAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgaXNfY29tcGxldGVkOiBmYWxzZSxcbiAgICAgICAgICByZW1pbmRlcl9kYXRlOiB7ICRsdGU6IGNlbGBpc29EYXRldGltZShub3coKSlgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGxpbWl0OiA1MDAsXG4gICAgICAgIG91dHB1dFZhcmlhYmxlOiAncmVtaW5kZXJMaXN0JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBUaGUgbG9vcCBib2R5IE1VU1QgYmUgbmVzdGVkIGluIGBjb25maWcuYm9keWAgXHUyMDE0IGEgZmxhdC1ncmFwaCBsb29wXG4gICAgICAvLyAoYm9keSBvbWl0dGVkLCBpdGVyYXRvciB3aXJlZCB2aWEgb3V0ZXIgZWRnZXMpIGRvZXMgTk9UIGl0ZXJhdGUgb3IgYmluZFxuICAgICAgLy8gdGhlIGl0ZXJhdG9yIHZhcmlhYmxlIGluIHRoZSBydW50aW1lIChsZWdhY3kgbm8tb3AgcGF0aCksIHNvXG4gICAgICAvLyBge2N1cnJlbnRUYXNrLip9YCByZXNvbHZlcyBlbXB0eS4gVmVyaWZpZWQgZW1waXJpY2FsbHkuXG4gICAgICBpZDogJ2xvb3BfdGFza3MnLCB0eXBlOiAnbG9vcCcsIGxhYmVsOiAnRm9yIEVhY2ggRHVlIFRhc2snLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGNvbGxlY3Rpb246IGNlbGByZW1pbmRlckxpc3RgLFxuICAgICAgICBpdGVyYXRvclZhcmlhYmxlOiAnY3VycmVudFRhc2snLFxuICAgICAgICBib2R5OiBndWFyZGVkKCd0YXNrJywge1xuICAgICAgICAgIG5vZGVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnbm90aWZ5X293bmVyJywgdHlwZTogJ25vdGlmeScsIGxhYmVsOiAnTm90aWZ5IE93bmVyJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgcmVjaXBpZW50czogW2NlbGBoYXMoY3VycmVudFRhc2sub3duZXJfaWQpID8gY3VycmVudFRhc2sub3duZXJfaWQgOiBudWxsYF0sXG4gICAgICAgICAgICAgICAgY2hhbm5lbHM6IFsnaW5ib3gnLCAnZW1haWwnXSxcbiAgICAgICAgICAgICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgIHRvcGljOiAndGFza19yZW1pbmRlcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6ICdjcm0udGFza19yZW1pbmRlcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVEYXRhOiB7XG4gICAgICAgICAgICAgICAgICBzdWJqZWN0OiBjZWxgY3VycmVudFRhc2suc3ViamVjdGAsIHJlbWluZGVyX2RhdGU6IGNlbGBjdXJyZW50VGFzay5yZW1pbmRlcl9kYXRlYCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFjdGlvblVybDogJy9jcm1fdGFzay97e2N1cnJlbnRUYXNrLmlkfX0nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWQ6ICdtYXJrX3NlbnQnLCB0eXBlOiAndXBkYXRlX3JlY29yZCcsIGxhYmVsOiAnTWFyayBSZW1pbmRlciBTZW50JyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV90YXNrJyxcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGBjdXJyZW50VGFzay5pZGAgfSxcbiAgICAgICAgICAgICAgICAvLyBDbGVhcmluZyByZW1pbmRlcl9kYXRlIGlzIHdoYXQgZGUtZHVwcyAodGhlIHJvdyBzdG9wcyBtYXRjaGluZ1xuICAgICAgICAgICAgICAgIC8vIHRoZSBzd2VlcCdzIGAkbHRlYCBuZXh0IHRpY2spOyByZW1pbmRlcl9zZW50IGlzIHRoZSBhdWRpdCBmbGFnLlxuICAgICAgICAgICAgICAgIGZpZWxkczogeyByZW1pbmRlcl9zZW50OiB0cnVlLCByZW1pbmRlcl9kYXRlOiBudWxsIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZWRnZXM6IFtcbiAgICAgICAgICAgIHsgaWQ6ICdiMScsIHNvdXJjZTogJ25vdGlmeV9vd25lcicsIHRhcmdldDogJ21hcmtfc2VudCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG5cbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ3F1ZXJ5X2R1ZScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ3F1ZXJ5X2R1ZScsIHRhcmdldDogJ2xvb3BfdGFza3MnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdsb29wX3Rhc2tzJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3MvYmlsbGluZy1oYW5kb2ZmLWNsb3NlZC13b24uZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9iaWxsaW5nLWhhbmRvZmYtY2xvc2VkLXdvbi5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbmltcG9ydCB7XG4gIEJJTExJTkdfSEFORE9GRl9FTkRQT0lOVCxcbiAgQklMTElOR19IQU5ET0ZGX0VWRU5ULFxuICBCSUxMSU5HX0hBTkRPRkZfTElORV9JVEVNX0xJTUlULFxuICBCSUxMSU5HX0hBTkRPRkZfU0lHTklOR19TRUNSRVQsXG4gIEJJTExJTkdfSEFORE9GRl9USU1FT1VUX01TLFxuICBMSU5FX0lURU1fRklFTERTLFxuICBiaWxsaW5nQm9keSxcbiAgbG9hZEFjY291bnROb2RlLFxufSBmcm9tICcuL19iaWxsaW5nLWVuZHBvaW50JztcblxuLyoqXG4gKiBcdTI1NTBcdTI1NTBcdTI1NTAgQmlsbGluZyBoYW5kLW9mZiBcdTIwMTQgd2hlcmUgSG90Q1JNJ3MgcmV2ZW51ZSBzY29wZSBlbmRzIFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFxuICpcbiAqIEhvdENSTSBvd25zIGxlYWQgXHUyMTkyIGNvbnRyYWN0LiBJdCBkb2VzICoqbm90KiogbW9kZWwgT3JkZXJzLCBJbnZvaWNlcyBvclxuICogUGF5bWVudHMgKG1haW50YWluZXIgZGVjaXNpb24sIDIwMjYtMDgtMDIpOiBiaWxsaW5nIGlzIGFuIGV4dGVybmFsIHN5c3RlbSdzXG4gKiBqb2IuIFdoYXQgdGhlIENSTSBvd2VzIHRoYXQgc3lzdGVtIGlzIGEgcmVsaWFibGUgaGFuZC1vZmYsIGFuZCB0aGVzZSB0d29cbiAqIGZsb3dzIGFyZSBpdDpcbiAqXG4gKiAgIC0gYGJpbGxpbmdfaGFuZG9mZl9jbG9zZWRfd29uYCAgICAgICAgICBcdTIwMTQgYW4gb3Bwb3J0dW5pdHkgRU5URVJTIGBjbG9zZWRfd29uYFxuICogICAgICh0aGlzIGZpbGU7IGBjcm1fb3Bwb3J0dW5pdHlgIGlzIHRoZSBzYWxlcyBwYWNrYWdlJ3Mgb2JqZWN0KVxuICogICAtIGBiaWxsaW5nX2hhbmRvZmZfY29udHJhY3RfYWN0aXZhdGVkYCAgXHUyMDE0IGEgY29udHJhY3QgRU5URVJTIGBhY3RpdmF0ZWRgXG4gKiAgICAgKGBzcmMvcmV2ZW51ZS9mbG93cy9iaWxsaW5nLWhhbmRvZmYtY29udHJhY3QtYWN0aXZhdGVkLmZsb3cudHNgKVxuICpcbiAqIEVhY2ggUE9TVHMgb25lIEpTT04gZG9jdW1lbnQgXHUyMDE0IHRoZSByZWNvcmQsIGl0cyBhY2NvdW50LCBhbmQgaXRzIGxpbmUgaXRlbXMgXHUyMDE0XG4gKiB0byB7QGxpbmsgQklMTElOR19IQU5ET0ZGX0VORFBPSU5UfSwgdGhyb3VnaCB0aGUgcGxhdGZvcm0ncyAqKmR1cmFibGUgSFRUUFxuICogb3V0Ym94Kio6IHRoZSBgaHR0cGAgbm9kZSB3aXRoIGBkdXJhYmxlOiB0cnVlYCBjYWxsc1xuICogYG1lc3NhZ2luZy5lbnF1ZXVlSHR0cCh7IHNvdXJjZTogJ2Zsb3cnLCBcdTIwMjYgfSlgLCB3aGljaCBwZXJzaXN0cyBhXG4gKiBgc3lzX2h0dHBfZGVsaXZlcnlgIHJvdyB0aGF0IHRoZSBIVFRQIGRpc3BhdGNoZXIgZHJhaW5zIHdpdGggcmV0cnksIGJhY2tvZmZcbiAqIGFuZCBkZWFkLWxldHRlcmluZywgc2lnbmluZyB0aGUgYm9keSB3aXRoIEhNQUMtU0hBMjU2IHdoZW4gYSBzZWNyZXQgaXMgc2V0LlxuICogTm90aGluZyBoZXJlIGlzIGN1c3RvbSBwbHVtYmluZzsgaXQgaXMgdGhlIHBsYXRmb3JtJ3Mgb3duIG91dGJvdW5kLWNhbGxvdXRcbiAqIHZlcmIsIG9uIHRoZSBzYW1lIG91dGJveCB0aGUgZGVjbGFyYXRpdmUgYHdlYmhvb2tzYCBzdXJmYWNlIHVzZXMuXG4gKlxuICogIyMgXHUyNkQ0IERvIG5vdCByZS1leHByZXNzIHRoZXNlIGFzIGRlY2xhcmVkIGB3ZWJob29rc2BcbiAqXG4gKiBNZWFzdXJlZCBvbiAxNy4wLjAtcmMuNiwgdGhhdCBzdXJmYWNlIGNhbm5vdCBleHByZXNzIGVpdGhlciBldmVudDpcbiAqIGBXZWJob29rU2NoZW1hYCBpcyBgLnN0cmljdGAgYW5kIHJlamVjdHMgYGNvbmRpdGlvbmAgLyBgZmlsdGVyYCAvIGBib2R5YCAvXG4gKiBgcGF5bG9hZEZpZWxkc2AgLyBgcmV0cnlQb2xpY3lgOyBpdHMgYHRyaWdnZXJzYCB2b2NhYnVsYXJ5IGlzXG4gKiBgY3JlYXRlIC8gdXBkYXRlIC8gZGVsZXRlIC8gYnVsa18qYCB3aXRoIG5vIHRyYW5zaXRpb24gZm9ybTsgYW5kIHRoZVxuICogYXV0by1lbnF1ZXVlciBtYXRjaGVzIG9uIG9iamVjdCArIHRyaWdnZXIgYWxvbmUgYW5kIGRlbGl2ZXJzIGEgZml4ZWRcbiAqIGBEYXRhRXZlbnRgIGVudmVsb3BlIGNhcnJ5aW5nIG5laXRoZXIgdGhlIGFjY291bnQgbm9yIHRoZSBsaW5lIGl0ZW1zLiBBXG4gKiBgc3lzX3dlYmhvb2tgIHJvdyBuYW1lZCBmb3IgY2xvc2VkLXdvbiB3b3VsZCBmaXJlIG9uICpldmVyeSogb3Bwb3J0dW5pdHkgZWRpdFxuICogXHUyMDE0IGEgZGVjbGFyYXRpb24gdGhhdCBsaWVzIGFib3V0IGl0c2VsZiwgaW4gdGhlIGFwcCBvdGhlciBwZW9wbGUgY29weS5cbiAqIERpc3BhdGNoIHRoZXJlIGlzIGFkZGl0aW9uYWxseSBnYXRlZCBvbiB0aGUgYHJlYWx0aW1lYCBjYXBhYmlsaXR5LCB3aGljaCB0aGlzXG4gKiBhcHAgZG9lcyBub3QgcmVxdWlyZSwgc28gc3VjaCBhIHJvdyB3b3VsZCBiZSB2aXNpYmxlIGluIFNldHVwIGFuZCBuZXZlciBmaXJlXG4gKiBhdCBhbGwuXG4gKlxuICogVGhlIGNvc3Qgb2YgdGhpcyByb3V0ZSBpcyBzdGF0ZWQgaW4gYF9iaWxsaW5nLWVuZHBvaW50LnRzYCBhbmQgaW5cbiAqIGBjb250ZW50L2RvY3MvcmV2ZW51ZS9iaWxsaW5nLWhhbmRvZmYubWR4YDogdGhlIGVuZHBvaW50IGFuZCBzZWNyZXQgbGl2ZSBpblxuICogZmxvdyBtZXRhZGF0YSwgc28gcmVwb2ludGluZyB0aGVtIGlzIGEgcmVidWlsZCwgbm90IGEgU2V0dXAgZWRpdC5cbiAqXG4gKiAjIyBFeGFjdGx5IG9uY2UgcGVyIHRyYW5zaXRpb24sIG5vdCBvbmNlIHBlciBlZGl0XG4gKlxuICogXHUyNkQ0IEJvdGggc3RhcnQgY29uZGl0aW9ucyBtdXN0IHRlc3QgdGhlIFRSQU5TSVRJT05cbiAqIChgcmVjb3JkLnggPT0gdiAmJiBwcmV2aW91cy54ICE9IHZgKSwgbmV2ZXIgdGhlIGN1cnJlbnQgdmFsdWUuIFRoaXMgaXMgdGhlXG4gKiBpZGlvbSBgb3Bwb3J0dW5pdHlfd29uX2FsZXJ0YCB1c2VzIG9uIHRoaXMgdmVyeSBvYmplY3Q6IHdpdGhvdXQgdGhlXG4gKiBgcHJldmlvdXMuKmAgdGVybSwgZXZlcnkgbGF0ZXIgZWRpdCBvZiBhIHdvbiBkZWFsIFx1MjAxNCBhIHNlZWQtb3duZXJzaGlwXG4gKiBjbGFpbSwgYW4gYXBwcm92YWwgc3RhbXAsIGEgZGVzY3JpcHRpb24gdHdlYWsgXHUyMDE0IHJlLWZpcmVzIHRoZSBmbG93LiBGb3IgYVxuICogY29uZ3JhdHVsYXRpb25zIG5vdGlmaWNhdGlvbiB0aGF0IGlzIG5vaXNlOyBmb3IgYSBiaWxsaW5nIGhhbmQtb2ZmIGl0IGlzIGFcbiAqIGR1cGxpY2F0ZSBvcmRlci4gYHByZXZpb3VzLipgIGlzIGd1YXJkZWQgRkFJTC1DTE9TRUQgKGBoYXMocHJldmlvdXMueCkgJiZgKVxuICogZm9yIHRoZSBzYW1lIHJlYXNvbiBpdCBpcyB0aGVyZTogd2hlbiB0aGUgZW5naW5lIGNhbm5vdCBzZWUgdGhlIHByaW9yIHZhbHVlXG4gKiBpdCBjYW5ub3Qgc2VlIGEgdHJhbnNpdGlvbiBlaXRoZXIsIGFuZCBtdXN0IG5vdCBjbGFpbSBvbmUuIFRoZSBzaGFwZSB0aGF0XG4gKiBjb3ZlcnMgaXMgYSBidWxrIGB1cGRhdGVNYW55YCwgd2hlcmUgT2JqZWN0UUwgcmVhZHMgbm8gcHJpb3Igcm93IGFuZFxuICogYHByZXZpb3VzYCBhcnJpdmVzIG51bGwgXHUyMDE0IG9uZSBoYW5kLW9mZiBwZXIgcm93IG9mIGEgYnVsayB1cGRhdGUgaXMgZXhhY3RseVxuICogd2hhdCBub2JvZHkgd2FudHMuXG4gKlxuICogRGVsaXZlcnkgaXRzZWxmIGlzICoqYXQtbGVhc3Qtb25jZSoqOiB0aGUgb3V0Ym94IHJldHJpZXMgYSBmYWlsZWQgYXR0ZW1wdCxcbiAqIGFuZCBldmVyeSBhdHRlbXB0IG9mIG9uZSBlbnF1ZXVlZCByb3cgY2FycmllcyB0aGUgc2FtZSBgWC1PYmplY3RzdGFjay1EZWxpdmVyeWBcbiAqIGlkLiBSZWNlaXZlcnMgZGVkdXBlIG9uIHRoYXQgaGVhZGVyLlxuICpcbiAqICMjIFRvdGFsaXR5XG4gKlxuICogRXZlcnkgYHJlY29yZC4qYCAvIGBwcmV2aW91cy4qYCByZWFkIGJlbG93IGNhcnJpZXMgYSBgaGFzKC4uLilgIGd1YXJkIFx1MjAxNCB0aGVcbiAqIGhvdXNlIHJ1bGUgYHRlc3QvZmxvdy1jb25kaXRpb24tdG90YWxpdHkudGVzdC50c2AgZW5mb3JjZXMsIGJlY2F1c2UgYSBmbG93XG4gKiBjb25kaXRpb24gdGhhdCBhYm9ydHMgZmFpbHMgdGhlIHdob2xlIHJ1biByYXRoZXIgdGhhbiB5aWVsZGluZyBgZmFsc2VgLlxuICovXG5cbi8qKlxuICogXHUyNTAwXHUyNTAwIEV2ZW50IDE6IG9wcG9ydHVuaXR5IGVudGVycyBgY2xvc2VkX3dvbmAgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gKi9cbmV4cG9ydCBjb25zdCBCaWxsaW5nSGFuZG9mZkNsb3NlZFdvbkZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICdiaWxsaW5nX2hhbmRvZmZfY2xvc2VkX3dvbicsXG4gIGxhYmVsOiAnQmlsbGluZyBIYW5kLW9mZjogQ2xvc2VkIFdvbicsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdPbiB0aGUgdHJhbnNpdGlvbiBpbnRvIGNsb3NlZF93b246IFBPU1QgdGhlIGRlYWwsIGl0cyBhY2NvdW50IGFuZCBpdHMgbGluZSBpdGVtcyB0byB0aGUgYmlsbGluZyBlbmRwb2ludCB2aWEgdGhlIGR1cmFibGUgSFRUUCBvdXRib3guJyxcbiAgdHlwZTogJ3JlY29yZF9jaGFuZ2UnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBBIHJlY29yZC1jaGFuZ2UgZmxvdyBmaXJlZCBieSBhIFNZU1RFTSB3cml0ZSBjYXJyaWVzIG5vIHRyaWdnZXIgdXNlclxuICAvLyAoQURSLTAwNDkpLCBhbmQgb3Bwb3J0dW5pdGllcyByZWFjaCBgY2xvc2VkX3dvbmAgdGhyb3VnaFxuICAvLyBtYWNoaW5lcnkgYXMgd2VsbCBhcyBhIHJlcCdzIG93biBzYXZlIFx1MjAxNCBgbGVhZF9jb252ZXJzaW9uYCB3cml0ZXMgdGhlbSwgYW5kXG4gIC8vIHRoZSBgY29udHJhY3RfcmVuZXdhbGAgc3dlZXAgaXMgaXRzZWxmIGBydW5BczogJ3N5c3RlbSdgLiBUaGlzIGZsb3cgaGFzIHR3b1xuICAvLyBkYXRhIG5vZGVzLCBzbyB1bmRlciB0aGUgZGVmYXVsdCBgcnVuQXM6ICd1c2VyJ2AgdGhvc2UgcmVhZHMgd291bGQgYmVcbiAgLy8gUkVGVVNFRCBvbiBleGFjdGx5IHRob3NlIHJ1bnMgYW5kIHRoZSBoYW5kLW9mZiB3b3VsZCB2YW5pc2ggc2lsZW50bHkuIFRoZVxuICAvLyBoYW5kLW9mZiBtdXN0IGFsc28gc2VlIHRoZSBXSE9MRSBkZWFsLCBub3QgdGhlIHNsaWNlIHRoZSBjbG9zaW5nIHJlcCBtYXlcbiAgLy8gcmVhZDogYW4gUkxTLXNjb3BlZCBsaW5lLWl0ZW0gcXVlcnkgdGhhdCByZXR1cm5zIHRocmVlIG9mIGZpdmUgcm93cyB3b3VsZFxuICAvLyB1bmRlci1iaWxsIHRoZSBjdXN0b21lciB3aXRob3V0IGZhaWxpbmcgYW55dGhpbmcuXG4gIHJ1bkFzOiAnc3lzdGVtJyxcbiAgdmFyaWFibGVzOiBbXG4gICAgLy8gQm91bmQgd2l0aCBhIGRlZmF1bHQgc28gdGhlIHBheWxvYWQga2V5IGFsd2F5cyBleGlzdHMuIE5vdCBzdHJpY3RseVxuICAgIC8vIG5lZWRlZCBoZXJlICh0aGlzIGZsb3cgYWx3YXlzIHJ1bnMgdGhlIHJlYWQpIFx1MjAxNCBkZWNsYXJlZCBmb3Igc3ltbWV0cnkgd2l0aFxuICAgIC8vIHRoZSBjb250cmFjdCBmbG93LCB3aGVyZSB0aGUgcmVhZCBpcyBjb25kaXRpb25hbCwgc28gdGhlIHR3byBwYXlsb2Fkc1xuICAgIC8vIGNhbm5vdCBkcmlmdCBpbnRvIGRpZmZlcmVudCBzaGFwZXMgZm9yIGFuIGVtcHR5IGl0ZW0gbGlzdC5cbiAgICB7IG5hbWU6ICdiaWxsaW5nTGluZUl0ZW1zJywgdHlwZTogJ2NvbGxlY3Rpb24nLCBpc0lucHV0OiBmYWxzZSwgaXNPdXRwdXQ6IGZhbHNlLCBkZWZhdWx0VmFsdWU6IFtdIH0sXG4gIF0sXG4gIG5vZGVzOiBbXG4gICAge1xuICAgICAgaWQ6ICdzdGFydCcsXG4gICAgICB0eXBlOiAnc3RhcnQnLFxuICAgICAgbGFiZWw6ICdTdGFydCAob3Bwb3J0dW5pdHkgdXBkYXRlZCknLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgICB0cmlnZ2VyVHlwZTogJ3JlY29yZC1hZnRlci11cGRhdGUnLFxuICAgICAgICAvLyBUUkFOU0lUSU9OLCBub3QgY3VycmVudCB2YWx1ZSBcdTIwMTQgc2VlIHRoZSBmaWxlIGhlYWRlci4gYHByZXZpb3VzLnN0YWdlYFxuICAgICAgICAvLyBpcyBndWFyZGVkIGZhaWwtY2xvc2VkOiBubyB2aXNpYmxlIHByaW9yIHN0YWdlIG1lYW5zIG5vIHZpc2libGVcbiAgICAgICAgLy8gdHJhbnNpdGlvbiwgc28gbm8gaGFuZC1vZmYuXG4gICAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnN0YWdlKSAmJiByZWNvcmQuc3RhZ2UgPT0gXCJjbG9zZWRfd29uXCJcbiAgICAgICAgICAmJiBoYXMocHJldmlvdXMuc3RhZ2UpICYmIHByZXZpb3VzLnN0YWdlICE9IFwiY2xvc2VkX3dvblwiYCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsb2FkQWNjb3VudE5vZGUoKSxcbiAgICB7XG4gICAgICBpZDogJ2xvYWRfbGluZV9pdGVtcycsXG4gICAgICB0eXBlOiAnZ2V0X3JlY29yZCcsXG4gICAgICBsYWJlbDogJ0xvYWQgTGluZSBJdGVtcycsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eV9saW5lX2l0ZW0nLFxuICAgICAgICBmaWx0ZXI6IHsgY3JtX29wcG9ydHVuaXR5OiBjZWxgcmVjb3JkLmlkYCB9LFxuICAgICAgICBmaWVsZHM6IExJTkVfSVRFTV9GSUVMRFMsXG4gICAgICAgIC8vID4gMSBpcyB3aGF0IG1ha2VzIGBnZXRfcmVjb3JkYCBpc3N1ZSBhIGBmaW5kYCBhbmQgYmluZCBhbiBBUlJBWTtcbiAgICAgICAgLy8gb21pdCBpdCBhbmQgdGhlIG5vZGUgY2FsbHMgYGZpbmRPbmVgIGFuZCBiaW5kcyBhIHNpbmdsZSByb3cuXG4gICAgICAgIGxpbWl0OiBCSUxMSU5HX0hBTkRPRkZfTElORV9JVEVNX0xJTUlULFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2JpbGxpbmdMaW5lSXRlbXMnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSBub2RlIGlkIGJlY29tZXMgdGhlIGRlbGl2ZXJ5J3MgYFgtT2JqZWN0c3RhY2stRXZlbnRgIGhlYWRlclxuICAgICAgLy8gKGBmbG93Ojxub2RlSWQ+YCksIHNvIGl0IGlzIG5hbWVkIGZvciB0aGUgZXZlbnQgYW5kIG5vdCBmb3IgdGhlIHZlcmIuXG4gICAgICBpZDogJ3NlbmRfY2xvc2VkX3dvbl9oYW5kb2ZmJyxcbiAgICAgIHR5cGU6ICdodHRwJyxcbiAgICAgIGxhYmVsOiAnRW5xdWV1ZSBCaWxsaW5nIEhhbmQtb2ZmJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICB1cmw6IEJJTExJTkdfSEFORE9GRl9FTkRQT0lOVCxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIC8vIFRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIHJvdXRlOiBlbnF1ZXVlIG9uIGBzeXNfaHR0cF9kZWxpdmVyeWAgcmF0aGVyXG4gICAgICAgIC8vIHRoYW4gY2FsbCBpbmxpbmUsIHNvIGEgcmVjZWl2ZXIgdGhhdCBpcyBkb3duIGdldHMgdGhlIGRlbGl2ZXJ5IHdoZW5cbiAgICAgICAgLy8gaXQgY29tZXMgYmFjayBpbnN0ZWFkIG9mIGxvc2luZyBpdC5cbiAgICAgICAgZHVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdGltZW91dE1zOiBCSUxMSU5HX0hBTkRPRkZfVElNRU9VVF9NUyxcbiAgICAgICAgc2lnbmluZ1NlY3JldDogQklMTElOR19IQU5ET0ZGX1NJR05JTkdfU0VDUkVULFxuICAgICAgICAvLyBPbmUgZW52ZWxvcGUgYnVpbGRpbmcgdGhlIHdob2xlIHBheWxvYWQgKHNlZSBgYmlsbGluZ0JvZHlgKS4gRWFjaFxuICAgICAgICAvLyByZWFkIGlzIHRoZSB2YWx1ZSBpdHNlbGYsIG5ldmVyIGl0cyBzdHJpbmdpZmljYXRpb24sIHNvIHRoZSBhbW91bnRcbiAgICAgICAgLy8gc3RheXMgYSBudW1iZXIgYW5kIHRoZSBsaW5lIGl0ZW1zIGFuIGFycmF5LlxuICAgICAgICBib2R5OiBiaWxsaW5nQm9keShCSUxMSU5HX0hBTkRPRkZfRVZFTlQub3Bwb3J0dW5pdHlDbG9zZWRXb24sICdvcHBvcnR1bml0eScsIFtcbiAgICAgICAgICAnaWQnLCAnbmFtZScsICdhbW91bnQnLCAnY2xvc2VfZGF0ZScsICdzdGFnZScsICd0eXBlJywgWydhY2NvdW50X2lkJywgJ2NybV9hY2NvdW50J10sICdvd25lcl9pZCcsXG4gICAgICAgIF0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdsb2FkX2FjY291bnQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdsb2FkX2FjY291bnQnLCB0YXJnZXQ6ICdsb2FkX2xpbmVfaXRlbXMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdsb2FkX2xpbmVfaXRlbXMnLCB0YXJnZXQ6ICdzZW5kX2Nsb3NlZF93b25faGFuZG9mZicsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlNCcsIHNvdXJjZTogJ3NlbmRfY2xvc2VkX3dvbl9oYW5kb2ZmJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3MvX2JpbGxpbmctZW5kcG9pbnQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3MvX2JpbGxpbmctZW5kcG9pbnQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGNlbCwgZXhwcmVzc2lvbiB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcblxuLyoqXG4gKiBCaWxsaW5nIGhhbmQtb2ZmIGNvbnRyYWN0IFx1MjAxNCB0aGUgT05FIHBsYWNlIHRoZSBvdXRib3VuZCB0YXJnZXQgYW5kIHRoZSBzaGFwZVxuICogb2Ygd2hhdCBpcyBzZW50IHRvIGl0IGxpdmUuXG4gKlxuICogSG90Q1JNJ3MgcmV2ZW51ZSBzY29wZSBlbmRzIGF0IHRoZSBzaWduZWQgY29udHJhY3QgKG1haW50YWluZXIgZGVjaXNpb24sXG4gKiAyMDI2LTA4LTAyKTogbm8gT3JkZXIgLyBJbnZvaWNlIC8gUGF5bWVudCBvYmplY3RzIGFyZSBtb2RlbGxlZCBoZXJlLiBXaGF0IHRoZVxuICogQ1JNIG93ZXMgdGhlIGJpbGxpbmcgc3lzdGVtIGlzIGEgKipyZWxpYWJsZSBoYW5kLW9mZioqIFx1MjAxNCB0d28gb3V0Ym91bmQgZXZlbnRzLFxuICogZGVsaXZlcmVkIG9uIHRoZSBwbGF0Zm9ybSdzIGR1cmFibGUgSFRUUCBvdXRib3guXG4gKlxuICogIyMgV2hlcmUgdGhlIGVuZHBvaW50IGxpdmVzLCBhbmQgd2h5IHRoYXQgaXMgYSBjb2RlIGNoYW5nZVxuICpcbiAqIFRoZXNlIGNvbnN0YW50cyBhcmUgcmVhZCBhdCAqKmJ1aWxkIHRpbWUqKiBieSB0aGUgdHdvIGBodHRwYCBub2RlcyBpblxuICogYGJpbGxpbmctaGFuZG9mZi5mbG93LnRzYCwgYW5kIGBvYmplY3RzdGFjayBidWlsZGAgYmFrZXMgdGhlaXIgdmFsdWVzIGludG8gdGhlXG4gKiBjb21waWxlZCBhcnRpZmFjdCdzIGZsb3cgbWV0YWRhdGEuIFRoZXJlIGlzIG5vIFNldHVwIHNjcmVlbiBmb3IgdGhlbS5cbiAqXG4gKiBUaGF0IGlzIGEgcmVhbCBjb3N0IG9mIHRoZSBtZWNoYW5pc20sIHN0YXRlZCByYXRoZXIgdGhhbiBidXJpZWQ6IHRoZVxuICogYWRtaW4tZWRpdGFibGUgYHdlYmhvb2tzYCBzdXJmYWNlIGNhbm5vdCBleHByZXNzIGVpdGhlciBvZiB0aGVzZSBldmVudHMsIHNvXG4gKiB0aGUgdHJhZGUgaXMgZXhhY3QgZXZlbnRzIHdpdGggYSBzaGFwZWQgcGF5bG9hZCBhdCB0aGUgcHJpY2Ugb2YgcmVwb2ludGluZ1xuICogYmVpbmcgYSByZWJ1aWxkLiBUaGUgbWVhc3VyZW1lbnRzIGJlaGluZCB0aGF0IGFyZSBpblxuICogYGJpbGxpbmctaGFuZG9mZi5mbG93LnRzYDsgYGNvbnRlbnQvZG9jcy9yZXZlbnVlL2JpbGxpbmctaGFuZG9mZi5tZHhgXG4gKiBkb2N1bWVudHMgdGhlIGNvc3QgcGxhaW5seSBpbnN0ZWFkIG9mIHRlYWNoaW5nIGEgU2V0dXAgc2NyZWVuIHRoYXQgZG9lcyBub3RcbiAqIGFwcGx5LlxuICpcbiAqICMjIE92ZXJyaWRpbmcgd2l0aG91dCBlZGl0aW5nIHRoaXMgZmlsZVxuICpcbiAqIEJvdGggdmFsdWVzIGFyZSByZWFkIGZyb20gdGhlIGVudmlyb25tZW50IGZpcnN0LCBzbyBhIGRlcGxveW1lbnQgY2FuIHNldCB0aGVtXG4gKiBpbiB0aGUgYnVpbGQgZW52aXJvbm1lbnQgcmF0aGVyIHRoYW4gcGF0Y2hpbmcgc291cmNlOlxuICpcbiAqICAgSE9UQ1JNX0JJTExJTkdfRU5EUE9JTlQ9aHR0cHM6Ly9iaWxsaW5nLmFjbWUuaW50ZXJuYWwvaG90Y3JtL2V2ZW50cyBcXFxuICogICBIT1RDUk1fQklMTElOR19TSUdOSU5HX1NFQ1JFVD1cdTIwMjYgXFxcbiAqICAgcG5wbSBidWlsZFxuICpcbiAqIFRoZSBzZWNyZXQgaXMgZGVsaWJlcmF0ZWx5IE5PVCBkZWZhdWx0ZWQgdG8gYSBsaXRlcmFsOiBhIGNvbW1pdHRlZCBITUFDIGtleVxuICogaW4gYSBwdWJsaWMgcmVmZXJlbmNlIGFwcCBpcyB3b3JzZSB0aGFuIGFuIHVuc2lnbmVkIGRlbGl2ZXJ5LCBhbmQgYW4gdW5zaWduZWRcbiAqIGRlbGl2ZXJ5IGlzIGF0IGxlYXN0IHZpc2libGUgKG5vIGBYLU9iamVjdHN0YWNrLVNpZ25hdHVyZWAgaGVhZGVyIG9uIHRoZVxuICogcmVxdWVzdCkgcmF0aGVyIHRoYW4gc2lsZW50bHkgdHJ1c3RlZC5cbiAqL1xuXG4vKipcbiAqIFdoZXJlIGJvdGggaGFuZC1vZmYgZXZlbnRzIGFyZSBQT1NUZWQuXG4gKlxuICogVGhlIGRlZmF1bHQgaXMgdGhlIFJGQyAyNjA2IGV4YW1wbGUgaG9zdCwgaS5lLiBkZWxpYmVyYXRlbHkgbm90IGEgcmVhbFxuICogcmVjZWl2ZXI6IGFuIHVudG91Y2hlZCBpbnN0YWxsIGVucXVldWVzIHRoZSBkZWxpdmVyeSwgcmV0cmllcyBpdCBvbiB0aGVcbiAqIHBsYXRmb3JtJ3MgYmFja29mZiBzY2hlZHVsZSwgYW5kIGxhbmRzIGl0IGluIGBzeXNfaHR0cF9kZWxpdmVyeWAgYXMgYGRlYWRgLlxuICogVGhhdCBpcyB0aGUgaG9uZXN0IGRlZmF1bHQgXHUyMDE0IHRoZSBoYW5kLW9mZiBpcyB3aXJlZCBhbmQgdmlzaWJseSB3YWl0aW5nIGZvciBhblxuICogZW5kcG9pbnQsIHJhdGhlciB0aGFuIHF1aWV0bHkgZG9pbmcgbm90aGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IEJJTExJTkdfSEFORE9GRl9FTkRQT0lOVCA9XG4gIHByb2Nlc3MuZW52LkhPVENSTV9CSUxMSU5HX0VORFBPSU5UPy50cmltKCkgfHwgJ2h0dHBzOi8vYmlsbGluZy5leGFtcGxlLmNvbS9ob3Rjcm0vZXZlbnRzJztcblxuLyoqXG4gKiBITUFDLVNIQTI1NiBzZWNyZXQgZm9yIHRoZSBgWC1PYmplY3RzdGFjay1TaWduYXR1cmVgIGhlYWRlci5cbiAqXG4gKiBgdW5kZWZpbmVkYCB3aGVuIHVuc2V0IFx1MjAxNCB0aGUgbWVzc2FnaW5nIHNlbmRlciBvbmx5IHNpZ25zIHdoZW4gYSBzZWNyZXQgaXNcbiAqIHByZXNlbnQsIGFuZCBhbiBlbXB0eSBzdHJpbmcgd291bGQgcmVhZCBhcyBcInNpZ25lZFwiIHRvIGFuIGF1dGhvciB3aGlsZVxuICogcHJvZHVjaW5nIG5vIGhlYWRlciBhdCBhbGwuXG4gKi9cbmV4cG9ydCBjb25zdCBCSUxMSU5HX0hBTkRPRkZfU0lHTklOR19TRUNSRVQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9XG4gIHByb2Nlc3MuZW52LkhPVENSTV9CSUxMSU5HX1NJR05JTkdfU0VDUkVUPy50cmltKCkgfHwgdW5kZWZpbmVkO1xuXG4vKiogUGVyLXJlcXVlc3QgdGltZW91dCBoYW5kZWQgdG8gdGhlIG91dGJveCBzZW5kZXIgKG1zKS4gKi9cbmV4cG9ydCBjb25zdCBCSUxMSU5HX0hBTkRPRkZfVElNRU9VVF9NUyA9IDMwXzAwMDtcblxuLyoqXG4gKiBFdmVudCBuYW1lcyBjYXJyaWVkIGluIHRoZSBwYXlsb2FkJ3MgYGV2ZW50YCBmaWVsZC5cbiAqXG4gKiBUaGUgcmVjZWl2ZXIgcm91dGVzIG9uIHRoaXMsIHNvIHRoZSBzdHJpbmdzIGFyZSBwYXJ0IG9mIHRoZSBjb250cmFjdCB3aXRoIHRoZVxuICogYmlsbGluZyBzeXN0ZW0gXHUyMDE0IGNoYW5naW5nIG9uZSBpcyBhIGJyZWFraW5nIGNoYW5nZSBmb3IgdGhlIGNvbnN1bWVyLCBub3QgYVxuICogcmVuYW1lLlxuICovXG5leHBvcnQgY29uc3QgQklMTElOR19IQU5ET0ZGX0VWRU5UID0ge1xuICBvcHBvcnR1bml0eUNsb3NlZFdvbjogJ2NybS5vcHBvcnR1bml0eS5jbG9zZWRfd29uJyxcbiAgY29udHJhY3RBY3RpdmF0ZWQ6ICdjcm0uY29udHJhY3QuYWN0aXZhdGVkJyxcbn0gYXMgY29uc3Q7XG5cbi8qKiBQYXlsb2FkIGNvbnRyYWN0IHZlcnNpb24gXHUyMDE0IGJ1bXBlZCB3aGVuIHRoZSBib2R5IHNoYXBlIGNoYW5nZXMgc2hhcGUuICovXG5leHBvcnQgY29uc3QgQklMTElOR19IQU5ET0ZGX1BBWUxPQURfVkVSU0lPTiA9IDE7XG5cbi8qKiBMaW5lIGl0ZW1zIHJlYWQgcGVyIGhhbmQtb2ZmLiBEZWFscyBpbiB0aGlzIGFwcCB0b3Agb3V0IHdlbGwgYmVsb3cgaXQuICovXG5leHBvcnQgY29uc3QgQklMTElOR19IQU5ET0ZGX0xJTkVfSVRFTV9MSU1JVCA9IDIwMDtcblxuLypcbiAqIFx1MjUwMFx1MjUwMFx1MjUwMCBUaGUgcGF5bG9hZCBoYWx2ZXMgYm90aCBoYW5kLW9mZiBldmVudHMgc2hhcmUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gKlxuICogVGhlc2Ugc2F0IGluIGBiaWxsaW5nLWhhbmRvZmYuZmxvdy50c2Agd2hpbGUgYm90aCBmbG93cyBsaXZlZCBpbiBvbmUgZmlsZS5cbiAqIFRoZSBBRFItMDEzMCBsYXlvdXQgcHV0cyBhIGZsb3cgd2l0aCBpdHMgdHJpZ2dlciBvYmplY3QsIGFuZCB0aGUgdHdvIGV2ZW50c1xuICogdHJpZ2dlciBvbiBvYmplY3RzIGluIGRpZmZlcmVudCBwYWNrYWdlcyBcdTIwMTQgYGNybV9vcHBvcnR1bml0eWAgaXMgc2FsZXMnLFxuICogYGNybV9jb250cmFjdGAgaXMgcmV2ZW51ZSdzIFx1MjAxNCBzbyB0aGUgZmxvd3MgYXJlIG5vd1xuICogYHNyYy9zYWxlcy9mbG93cy9iaWxsaW5nLWhhbmRvZmYtY2xvc2VkLXdvbi5mbG93LnRzYCBhbmRcbiAqIGBzcmMvcmV2ZW51ZS9mbG93cy9iaWxsaW5nLWhhbmRvZmYtY29udHJhY3QtYWN0aXZhdGVkLmZsb3cudHNgLiBUaGUgc2hhcmVkXG4gKiBoYWxmIG1vdmVkIEhFUkUgcmF0aGVyIHRoYW4gYmVpbmcgY29waWVkIGludG8gZWFjaDogaXQgaXMgdGhlIHNhbWUgY29udHJhY3RcbiAqIHdpdGggdGhlIHNhbWUgcmVjZWl2ZXIsIGFuZCB0d28gY29waWVzIG9mIGEgY29udHJhY3QgaXMgaG93IGEgcmVjZWl2ZXIgZW5kc1xuICogdXAgd2l0aCB0d28gc2hhcGVzLiBSZXZlbnVlIHJlYWRzIGl0IGFsb25nIHRoZSByZXZlbnVlIC0+IHNhbGVzIGVkZ2UsIHRoZVxuICogb25lIGRpcmVjdGlvbiBBRFItMDEzMCBhbGxvd3MuXG4gKi9cblxuLyoqIEFjY291bnQgZmllbGRzIHRoZSBiaWxsaW5nIHN5c3RlbSBuZWVkcyB0byBvcGVuIGEgY3VzdG9tZXIuICovXG5leHBvcnQgY29uc3QgQUNDT1VOVF9GSUVMRFMgPSBbXG4gICdpZCcsXG4gICduYW1lJyxcbiAgJ2FjY291bnRfbnVtYmVyJyxcbiAgJ2JpbGxpbmdfYWRkcmVzcycsXG4gICdiaWxsaW5nX2NvdW50cnknLFxuICAncGhvbmUnLFxuICAnd2Vic2l0ZScsXG5dO1xuXG4vKiogTGluZS1pdGVtIGZpZWxkcyB0aGF0IHByaWNlIGEgaGFuZC1vZmYuIGB0b3RhbF9wcmljZWAgaXMgdGhlIGZvcm11bGEgdG90YWwuICovXG5leHBvcnQgY29uc3QgTElORV9JVEVNX0ZJRUxEUyA9IFtcbiAgJ2lkJyxcbiAgJ2xpbmVfbnVtYmVyJyxcbiAgJ2NybV9wcm9kdWN0JyxcbiAgJ2Rlc2NyaXB0aW9uJyxcbiAgJ3F1YW50aXR5JyxcbiAgJ2xpc3RfcHJpY2UnLFxuICAndW5pdF9wcmljZScsXG4gICdkaXNjb3VudCcsXG4gICd0b3RhbF9wcmljZScsXG5dO1xuXG4vKiogQW4gb3B0aW9uYWwgY29sdW1uIG9mIHRoZSBhY2NvdW50IHJvdywgcmVhZCBhcyBgbnVsbGAgd2hlcmUgdGhlIHJvdyBsYWNrcyBpdC4gKi9cbmNvbnN0IGFjY291bnRGaWVsZCA9IChmaWVsZDogc3RyaW5nKSA9PiBgaGFzKGJpbGxpbmdBY2NvdW50LiR7ZmllbGR9KSA/IGJpbGxpbmdBY2NvdW50LiR7ZmllbGR9IDogbnVsbGA7XG5cbi8qKlxuICogVGhlIGFjY291bnQgYmxvY2ssIHNoYXJlZCBieSBib3RoIHBheWxvYWRzOiBhIENFTCBtYXAgbGl0ZXJhbCBvdmVyIHRoZVxuICogYGJpbGxpbmdBY2NvdW50YCByb3cge0BsaW5rIGxvYWRBY2NvdW50Tm9kZX0gYmluZHMsIHNwbGljZWQgaW50byBlYWNoIGJvZHkgYnlcbiAqIHtAbGluayBiaWxsaW5nQm9keX0uXG4gKlxuICogQXV0aG9yZWQgZmllbGQtYnktZmllbGQgcmF0aGVyIHRoYW4gcGFzc2luZyB0aGUgcm93IHdob2xlOiB0aGlzIG9iamVjdCBJUyB0aGVcbiAqIGNvbnRyYWN0IHdpdGggdGhlIGJpbGxpbmcgc3lzdGVtLCBzbyBpdCBtdXN0IG5vdCBzaWxlbnRseSBncm93IGEgY29sdW1uIHRoZVxuICogZGF5IHNvbWVvbmUgYWRkcyBhIGZpZWxkIHRvIGBjcm1fYWNjb3VudGAuXG4gKlxuICogYG5hbWVgIGlzIHJlcXVpcmVkIGFuZCBgYWNjb3VudF9udW1iZXJgIGFuIGF1dG9udW1iZXIsIHNvIGJvdGggYXJlIHJlYWRcbiAqIGJhcmUuIFRoZSBvdGhlciBmb3VyIGFyZSBvcHRpb25hbCwgYW5kIGEgc3BhcnNlIGRyaXZlciAobWVtb3J5LCBtb25nb2RiKVxuICogaGFuZHMgYmFjayBhIGNvbHVtbiB0aGUgcm93IHdhcyBuZXZlciB3cml0dGVuIHdpdGggQUJTRU5ULCB3aGljaCBDRUwgcmVmdXNlcyxcbiAqIHNvIGVhY2ggaXMgZ3VhcmRlZCB0byBgbnVsbGAuIFRoZSAxNy54IHRlbXBsYXRlIGRyb3BwZWQgc3VjaCBhIGtleSBmcm9tIHRoZVxuICogSlNPTiBpbnN0ZWFkOyBvbiB0aGUgU1FMIGRyaXZlcnMgdGhlIGNvbHVtbiBpcyBhbHdheXMgcHJlc2VudCBhbmQgdGhlIHR3b1xuICogYWdyZWUuXG4gKi9cbmV4cG9ydCBjb25zdCBBQ0NPVU5UX0JMT0NLID1cbiAgYHsnaWQnOiBiaWxsaW5nQWNjb3VudC5pZCwgJ25hbWUnOiBiaWxsaW5nQWNjb3VudC5uYW1lLCAnYWNjb3VudF9udW1iZXInOiBiaWxsaW5nQWNjb3VudC5hY2NvdW50X251bWJlciwgYCArXG4gIGAnYmlsbGluZ19hZGRyZXNzJzogJHthY2NvdW50RmllbGQoJ2JpbGxpbmdfYWRkcmVzcycpfSwgJ2JpbGxpbmdfY291bnRyeSc6ICR7YWNjb3VudEZpZWxkKCdiaWxsaW5nX2NvdW50cnknKX0sIGAgK1xuICBgJ3Bob25lJzogJHthY2NvdW50RmllbGQoJ3Bob25lJyl9LCAnd2Vic2l0ZSc6ICR7YWNjb3VudEZpZWxkKCd3ZWJzaXRlJyl9fWA7XG5cbi8qKlxuICogVGhlIGh0dHAgYGJvZHlgIG9mIGJvdGggaGFuZC1vZmZzOiBPTkUgQ0VMIHZhbHVlIGVudmVsb3BlIGJ1aWxkaW5nIHRoZSB3aG9sZVxuICogcGF5bG9hZC4gYGtleWAgbmFtZXMgdGhlIHJlY29yZCdzIG93biBibG9jaywgYW5kIGBmaWVsZHNgIGxpc3RzIHdoYXQgaXRcbiAqIGNhcnJpZXMsIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSB0cmlnZ2VyaW5nIGByZWNvcmRgOiBhIGZpZWxkIHVuZGVyIGl0cyBvd25cbiAqIG5hbWUsIG9yIGBba2V5LCBmaWVsZF1gIHdoZXJlIHRoZSBwYXlsb2FkIG5hbWVzIGl0IGRpZmZlcmVudGx5LiBgcmVjb3JkYCBpc1xuICogdGhlIHJlY29yZC1jaGFuZ2UgdHJpZ2dlcidzLCB3aGljaCBoYW5kcyB0aGUgcnVuIGV2ZXJ5IGRlY2xhcmVkIGZpZWxkIChudWxsXG4gKiB3aGVyZSB1bnNldCksIHNvIHRoZXNlIHJlYWRzIHRha2Ugbm8gZ3VhcmQuXG4gKlxuICogU2luY2UgMTguMC4wLW5leHQuMCBhbiBodHRwIGJvZHkgaXMgb25lIHZhbHVlLCBldmFsdWF0ZWQgb25jZSBiZWZvcmUgdGhlXG4gKiBjYWxsLCBzbyB0aGUgZHVyYWJsZSBvdXRib3ggZW5xdWV1ZXMgZXhhY3RseSB3aGF0IGFuIGlubGluZSBjYWxsIHdvdWxkIHNlbmQuXG4gKiBBIGB7XHUyMDI2fWAgdG9rZW4gaW4gYSBuZXN0ZWQgc3RyaW5nIGlzIHJlZnVzZWQgdGhlcmUsIGFuZCBhbiBlbnZlbG9wZSBuZXN0ZWQgaW5cbiAqIGEgbGl0ZXJhbCBvYmplY3Qgd291bGQgYmUgc2VudCBhcyB0aGUgb2JqZWN0IGl0IHNwZWxscyBcdTIwMTQgc28gdGhlIHBheWxvYWQgaXNcbiAqIGJ1aWx0IGJ5IG9uZSBlbnZlbG9wZSwgbm90IGJ5IGEgbGl0ZXJhbCB3aXRoIGVudmVsb3BlcyBpbnNpZGUgaXQuIENFTCBob2xkcyBhXG4gKiBtYXAncyB2YWx1ZXMgdG8gb25lIHR5cGUsIHNvIGVhY2ggbGl0ZXJhbCBhbmQgZWFjaCBuZXN0ZWQgbWFwIGlzIHdyYXBwZWQgaW5cbiAqIGBkeW4oKWAuIGBiaWxsaW5nTGluZUl0ZW1zYCBpcyBhIHZhcmlhYmxlIHJlYWQgYW5kIGFscmVhZHkgZHluYW1pYy5cbiAqL1xuZXhwb3J0IGNvbnN0IGJpbGxpbmdCb2R5ID0gKGV2ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nLCBmaWVsZHM6IChzdHJpbmcgfCBbc3RyaW5nLCBzdHJpbmddKVtdKSA9PlxuICBleHByZXNzaW9uKFxuICAgIGB7J2V2ZW50JzogZHluKCcke2V2ZW50fScpLCAndmVyc2lvbic6IGR5bigke0JJTExJTkdfSEFORE9GRl9QQVlMT0FEX1ZFUlNJT059KSwgYCArXG4gICAgICBgJ29jY3VycmVkX2F0JzogZHluKGlzb0RhdGV0aW1lKG5vdygpKSksIGAgK1xuICAgICAgYCcke2tleX0nOiBkeW4oeyR7ZmllbGRzLm1hcCgoZikgPT4gKHR5cGVvZiBmID09PSAnc3RyaW5nJyA/IFtmLCBmXSA6IGYpKS5tYXAoKFtrLCBmXSkgPT4gYCcke2t9JzogcmVjb3JkLiR7Zn1gKS5qb2luKCcsICcpfX0pLCBgICtcbiAgICAgIGAnYWNjb3VudCc6IGR5bigke0FDQ09VTlRfQkxPQ0t9KSwgJ2xpbmVfaXRlbXMnOiBiaWxsaW5nTGluZUl0ZW1zfWAsXG4gICk7XG5cbi8qKlxuICogUmVhZCB0aGUgYWNjb3VudCBuYW1lZCBieSB0aGUgdHJpZ2dlcmluZyByZWNvcmQuXG4gKlxuICogYGNybV9hY2NvdW50YCBpcyBgcmVxdWlyZWRgICsgYHN0b3JhZ2Uubm90TnVsbGAgb24gYm90aCBgY3JtX29wcG9ydHVuaXR5YCBhbmRcbiAqIGBjcm1fY29udHJhY3RgLCBzbyB0aGUgdmFsdWUgaXMgYWx3YXlzIHRoZXJlIG9uIGEgcmVhbCByb3cuIExlZnQgVU5HVUFSREVEIG9uXG4gKiBwdXJwb3NlOiBpZiBpdCB3ZXJlIGV2ZXIgYWJzZW50LCB0aGUgZW52ZWxvcGUgZmFpbHMgdGhlIHJ1biBsb3VkbHkgaW4gU3R1ZGlvJ3NcbiAqIEZsb3cgUnVucyBwYWdlLiBGb3IgYSByZXF1aXJlZCBmaWVsZCB0aGF0IGlzIHRoZSByaWdodCBmYWlsdXJlIFx1MjAxNCBhIHNpbGVudCBza2lwXG4gKiB3b3VsZCBkcm9wIGEgaGFuZC1vZmYgd2l0aCBubyB0cmFjZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRBY2NvdW50Tm9kZSA9ICgpOiBBdXRvbWF0aW9uLkZsb3dOb2RlID0+ICh7XG4gIGlkOiAnbG9hZF9hY2NvdW50JyxcbiAgdHlwZTogJ2dldF9yZWNvcmQnLFxuICBsYWJlbDogJ0xvYWQgQWNjb3VudCcsXG4gIGNvbmZpZzoge1xuICAgIG9iamVjdE5hbWU6ICdjcm1fYWNjb3VudCcsXG4gICAgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkLmNybV9hY2NvdW50YCB9LFxuICAgIGZpZWxkczogQUNDT1VOVF9GSUVMRFMsXG4gICAgLy8gTm8gYGxpbWl0YDogYGdldF9yZWNvcmRgIGNhbGxzIGBmaW5kT25lYCBiZWxvdyAyIGFuZCBiaW5kcyB0aGUgc2luZ2xlIHJvd1xuICAgIC8vIGl0c2VsZiwgd2hpY2ggaXMgd2hhdCB0aGUgYWNjb3VudCBibG9jaydzIGBiaWxsaW5nQWNjb3VudC5GSUVMRGAgcmVhZHMgbmVlZC5cbiAgICBvdXRwdXRWYXJpYWJsZTogJ2JpbGxpbmdBY2NvdW50JyxcbiAgfSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9mbG93cy9xdW90ZS1nZW5lcmF0aW9uLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2Zsb3dzL3F1b3RlLWdlbmVyYXRpb24uZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUCwgZXhwcmVzc2lvbiwgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xuaW1wb3J0IHsgUVVPVEVfRElTQ09VTlRfQ0VJTElORyB9IGZyb20gJy4uLy4uL3NhbGVzL29iamVjdHMvX3RocmVzaG9sZHMnO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIFRoZSBzY3JlZW4ncyBkaXNjb3VudCBhcyBhIENFTCBkb3VibGUsIDAgd2hlbiB0aGUgcmVwIGNsZWFyZWQgdGhlIGJveC4gQVxuICogc291cmNlIEZSQUdNRU5ULCBzcGxpY2VkIGludG8gYm90aCBwcmljaW5nIGVudmVsb3BlcyB3aXRoIGBleHByZXNzaW9uKClgOlxuICogdGhlIGBQYCB0YWcgSlNPTi1xdW90ZXMgYW4gaW50ZXJwb2xhdGVkIHN0cmluZywgc28gaXQgY2Fubm90IHNwbGljZSBvbmUuXG4gKi9cbmNvbnN0IERJU0NPVU5UID0gJyghaGFzKHZhcnMuZGlzY291bnQpIHx8IGlzQmxhbmsodmFycy5kaXNjb3VudCkgPyAwLjAgOiBkb3VibGUodmFycy5kaXNjb3VudCkpJztcblxuLyoqXG4gKiBFZGdlIGBlNGFgJ3MgcHJlZGljYXRlIFx1MjAxNCBhZHZhbmNlIHRoZSBkZWFsIHRvIGBwcm9wb3NhbGAuIEEgc291cmNlIEZSQUdNRU5UXG4gKiBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIGBESVNDT1VOVGA6IGVkZ2UgYGU0YmAgaXMgaXRzIGV4YWN0IG5lZ2F0aW9uLFxuICogc3BsaWNlZCBhcyBgIShcdTIwMjYpYCwgc28gdGhlIHR3byBicmFuY2hlcyBwYXJ0aXRpb24gYnkgY29uc3RydWN0aW9uIHJhdGhlclxuICogdGhhbiBieSBhIGhhbmQta2VwdCBEZSBNb3JnYW4gY29weSAodGhlIHJhdGlvbmFsZSBpcyBvbiB0aGUgZWRnZXMpLlxuICovXG5jb25zdCBBRFZBTkNFID0gYGhhcyh2YXJzLm9wcFJlY29yZCkgJiYgaGFzKHZhcnMub3BwUmVjb3JkLnN0YWdlKVxuICAmJiAodmFycy5vcHBSZWNvcmQuc3RhZ2UgPT0gXCJwcm9zcGVjdGluZ1wiIHx8IHZhcnMub3BwUmVjb3JkLnN0YWdlID09IFwicXVhbGlmaWNhdGlvblwiIHx8IHZhcnMub3BwUmVjb3JkLnN0YWdlID09IFwibmVlZHNfYW5hbHlzaXNcIilcbiAgJiYgKCFoYXModmFycy5vcHBSZWNvcmQuYXBwcm92YWxfc3RhdHVzKSB8fCB2YXJzLm9wcFJlY29yZC5hcHByb3ZhbF9zdGF0dXMgIT0gXCJwZW5kaW5nXCIpYDtcblxuLyoqIFF1b3RlIEdlbmVyYXRpb24gXHUyMDE0IHNjcmVlbiBmbG93IHRvIGNyZWF0ZSBhIHF1b3RlIGZyb20gYW4gb3Bwb3J0dW5pdHkgKi9cbmV4cG9ydCBjb25zdCBRdW90ZUdlbmVyYXRpb25GbG93OiBGbG93ID0ge1xuICBuYW1lOiAncXVvdGVfZ2VuZXJhdGlvbicsXG4gIGxhYmVsOiAnR2VuZXJhdGUgUXVvdGUgZnJvbSBPcHBvcnR1bml0eScsXG4gIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGEgcXVvdGUgYmFzZWQgb24gb3Bwb3J0dW5pdHkgZGV0YWlscycsXG4gIHR5cGU6ICdzY3JlZW4nLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuXG4gIHZhcmlhYmxlczogW1xuICAgIC8vIE1VU1QgYmUgYHJlY29yZElkYCBcdTIwMTQgdGhlIGNvbnNvbGUncyBmbG93LWFjdGlvbiB0cmlnZ2VyIGNvbnRyYWN0IHNlZWRzXG4gICAgLy8gb25seSB0aGF0IG5hbWUgKHsgcmVjb3JkSWQsIG9iamVjdE5hbWUgfSk7IGEgY3VzdG9tIG5hbWUgbGlrZVxuICAgIC8vIGBvcHBvcnR1bml0eUlkYCBhcnJpdmVzIHVuZGVmaW5lZC5cbiAgICB7IG5hbWU6ICdyZWNvcmRJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAncXVvdGVOYW1lJywgdHlwZTogJ3RleHQnLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgICB7IG5hbWU6ICdleHBpcmF0aW9uRGF5cycsIHR5cGU6ICdudW1iZXInLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgICB7IG5hbWU6ICdkaXNjb3VudCcsIHR5cGU6ICdudW1iZXInLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgXSxcblxuICBub2RlczogW1xuICAgIHsgaWQ6ICdzdGFydCcsIHR5cGU6ICdzdGFydCcsIGxhYmVsOiAnU3RhcnQnLCBjb25maWc6IHsgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScgfSB9LFxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBUaGUgXHU3QUNCXHU5ODc5IChxdWFsaWZpY2F0aW9uKSBnYXRlLCBSRVEtMDAwNiBzdGVwIDExICgjMjAzMikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBcdTMwMENcdTY1QjBcdTU4OUVcdTU1NDZcdTY3M0FcdTUzRUZcdThEREZcdThGREJcdUZGMENcdTdBQ0JcdTk4NzlcdTkwMUFcdThGQzdcdTU0MEVcdTY1QjlcdTUzRUZcdTY2RjRcdTY1QjBcdTk2MzZcdTZCQjVcdTMwMDFcdTYyOTVcdTY4MDdcdTMwMDFcdThENjJcdTRFMjJcdTUzNTVcdTY0Q0RcdTRGNUNcdTMwMDJcdTMwMEQgUnVsZWQgKGhvdGNybS1SNzRiXG4gICAgLy8gaXRlbSAyLCBCKTogYmVmb3JlIFx1N0FDQlx1OTg3OSBpcyBhcHByb3ZlZCwgR2VuZXJhdGUgUXVvdGUgUkVGVVNFUyBhbmQgY3JlYXRlc1xuICAgIC8vIG5vdGhpbmcuIFN0ZXBzIDE1IGFuZCAxOCBwdXQgcXVvdGluZyBhZnRlciB0aGUgZGVhbCdzIGFwcHJvdmFsIHRvby5cbiAgICAvL1xuICAgIC8vIFdoeSB0aGUgcmVmdXNhbCBpcyBIRVJFLCBhaGVhZCBvZiB0aGUgZm9ybSBhbmQgb2YgZXZlcnkgd3JpdGVyOiB0aGlzXG4gICAgLy8gZmxvdyB3cml0ZXMgdGhlIHF1b3RlIEJFRk9SRSB0aGUgc3RhZ2UsIGFuZCBhIGZsb3cgY2FycmllcyBub1xuICAgIC8vIHRyYW5zYWN0aW9uIChBRFItMDA3NykuIFdpdGggdGhlIGdhdGUgYXJtZWQsIGBvcHBvcnR1bml0eV9saWZlY3ljbGVgXG4gICAgLy8gcmVmdXNlcyB0aGUgYHVwZGF0ZV9vcHBvcnR1bml0eWAgc3RhZ2Ugd3JpdGUgXHUyMDE0IHNvIHRoZSBydW4gdXNlZCB0byBmYWlsXG4gICAgLy8gQUZURVIgYGNyZWF0ZV9xdW90ZWAgaGFkIGxhbmRlZDogbWVhc3VyZWQgb24gMTcuNy4wIGFzIGEgc2FsZXNfcmVwLFxuICAgIC8vIGBGTE9XX0ZBSUxFRGAgNDAwIGF0IGB1cGRhdGVfb3Bwb3J0dW5pdHlgIChcIlRoaXMgZGVhbCBuZWVkc1xuICAgIC8vIHF1YWxpZmljYXRpb24gYXBwcm92YWwgZmlyc3QgXHUyMDI2XCIpLCBvbmUgZHJhZnQgcXVvdGUgbGVmdCBiZWhpbmQsIHRoZVxuICAgIC8vIHN0YWdlIHVuY2hhbmdlZC4gXHUyNkQ0IE5vdCAjMjAxNSdzIGtlZXAtc3RhZ2UtYW5kLXF1b3RlOiB0aGF0IGxvY2sgZG9lc1xuICAgIC8vIG5vdCBob2xkIHF1b3RpbmcsIHRoaXMgZ2F0ZSBkb2VzLlxuICAgIC8vXG4gICAgLy8gVGhlIGZsb3cgaXMgdGhlIG9uZSBjaG9rZSBwb2ludCBldmVyeSBkb29yIHJlYWNoZXMgXHUyMDE0IHRoZSByZWNvcmQtaGVhZGVyXG4gICAgLy8gYW5kIGxpc3Qtcm93IGJ1dHRvbnMgYW5kIGBQT1NUIC9hdXRvbWF0aW9uL3F1b3RlX2dlbmVyYXRpb24vdHJpZ2dlcmAgXHUyMDE0XG4gICAgLy8gc28gdGhlIHJlZnVzYWwgbGl2ZXMgaGVyZSBhbmQgYGdlbmVyYXRlX3F1b3RlYCBzdGF5cyB2aXNpYmxlOiBoaWRpbmdcbiAgICAvLyBpdCB3b3VsZCBsZWF2ZSB0aGUgcmVwIGEgbWlzc2luZyBidXR0b24gd2l0aCBubyByZWFzb24sIGJlY2F1c2UgYW5cbiAgICAvLyBhY3Rpb24ncyBgdmlzaWJsZWAgLyBgZGlzYWJsZWRgIGFyZSBiYXJlIHByZWRpY2F0ZXMgd2l0aCBub3doZXJlIHRvXG4gICAgLy8gcHV0IGEgc2VudGVuY2UuXG4gICAgLy9cbiAgICAvLyBUaGUgRklMVEVSIGlzIHRoZSBnYXRlJ3MgcmVhZGluZywgdGhlIG9uZSBgb3Bwb3J0dW5pdHlfbGlmZWN5Y2xlYFxuICAgIC8vIGFwcGxpZXM6IGBwZW5kaW5nYCBvciBgcmVqZWN0ZWRgIGhvbGRzIHRoZSBkZWFsIChhbiBhcHByb3ZlcidzIFwibm9cIiBpc1xuICAgIC8vIG5vdCBhIHJlbGVhc2UpLCBldmVyeSBvdGhlciB2YWx1ZSBcdTIwMTQgdGhlIHNoaXBwZWQgYG5vdF9yZXF1aXJlZGAsXG4gICAgLy8gYGFwcHJvdmVkYCwgbm9uZSBhdCBhbGwgXHUyMDE0IGRvZXMgbm90LiBTbyBgaGVsZGAgYmluZHMgdGhlIGRlYWwgb25seSB3aGlsZVxuICAgIC8vIGl0IGlzIGhlbGQsIGFuZCBgbnVsbGAgb3RoZXJ3aXNlOyBgdGVzdC9mbG93LXF1b3RlLnRlc3QudHNgIHBpbnMgdGhhdFxuICAgIC8vIHRoZSB0d28gYW5zd2VyIGFsaWtlLCB2ZXJkaWN0IGJ5IHZlcmRpY3QuXG4gICAgLy9cbiAgICAvLyBBIHJlYWQgb2YgaXRzIG93biwgYXQgY2xpY2sgdGltZS4gXHUyNkQ0IERvIG5vdCBmb2xkIGl0IGludG9cbiAgICAvLyBgZ2V0X29wcG9ydHVuaXR5YDogdGhhdCByZWFkIHN0YXlzIEFGVEVSIHRoZSBzY3JlZW4gc28gdGhlIHByaWNpbmcgYW5kXG4gICAgLy8gdGhlICMyMDE1IGFwcHJvdmFsIGJyYW5jaCAoYGU0YWAgLyBgZTRiYCkgc2VlIHRoZSBkZWFsIGFzIGl0IGlzIGF0XG4gICAgLy8gc3VibWl0LiBUaGUgdmVyZGljdCBjYW5ub3QgZHJpZnQgdG93YXJkIGhlbGQgd2hpbGUgdGhlIGZvcm0gaXMgb3BlbjpcbiAgICAvLyBgbm90X3JlcXVpcmVkYCBhbmQgYGFwcHJvdmVkYCBhcmUgbmV2ZXIgd3JpdHRlbiBiYWNrIHRvIGBwZW5kaW5nYC5cbiAgICB7IGlkOiAnZ2V0X2hlbGQnLCB0eXBlOiAnZ2V0X3JlY29yZCcsIGxhYmVsOiAnR2V0IEhlbGQgRGVhbCcsIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JywgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkSWRgLCBxdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1czogeyAkaW46IFsncGVuZGluZycsICdyZWplY3RlZCddIH0gfSwgb3V0cHV0VmFyaWFibGU6ICdoZWxkJyB9IH0sXG4gICAgLy8gQSBmaXJzdC1jbGFzcyByZWZ1c2FsIChgRW5kQ29uZmlnU2NoZW1hYCBgb3V0Y29tZTogJ3JlZnVzZWQnYCk6IHRoZSBydW5cbiAgICAvLyBlbmRzIGByZWZ1c2VkYCwgbmV2ZXIgYGZhaWxlZGAgYW5kIG5ldmVyIHBhcmtlZCwgbm90aGluZyBpcyB3cml0dGVuLFxuICAgIC8vIGFuZCB0aGUgY29uc29sZSBzaG93cyB0aGUgbWVzc2FnZSB3aXRoIENsb3NlIG9ubHkgXHUyMDE0IG5vIFN1Ym1pdCBhbmQgbm9cbiAgICAvLyBcImNvbXBsZXRlZFwiIHRvYXN0LCB3aGljaCBpcyB3aGF0IGEgbWVzc2FnZS1vbmx5IHNjcmVlbiB3b3VsZCBnaXZlLiBJdFxuICAgIC8vIG5hbWVzIHRoZSBuZXh0IHN0ZXAgdGhlIGBvcHBvcnR1bml0eV9saWZlY3ljbGVgIHJlZnVzYWwgb2YgdGhpcyBnYXRlXG4gICAgLy8gbmFtZXMuXG4gICAgLy9cbiAgICAvLyBUcmFuc2xhdGVkOiBzaW5jZSAxOC4wLjAtbmV4dC4wIHRoZSBgZmxvd3NgIHRyYW5zbGF0aW9uIGdyb3VwIGtleXMgYW5cbiAgICAvLyBgZW5kYCBub2RlJ3MgcmVmdXNhbCBhcyBgcmVmdXNhbHMucmVmdXNlX2hlbGQubWVzc2FnZWAsIHdoaWNoIHRoZVxuICAgIC8vIGVuZ2luZSByZW5kZXJzIGluIHRoZSBydW4ncyBsb2NhbGUgKGF0IDE3LjcuMCBpdCBoYWQgbm8gc3VjaCBrZXksIHRoZVxuICAgIC8vIGdhcCByYWlzZWQgZnJvbSAjMjAzMikuIFRoZSBjb25zb2xlIHRpdGxlcyB0aGUgZGlhbG9nIHdpdGggdGhlIGFjdGlvbidzXG4gICAgLy8gdHJhbnNsYXRlZCBsYWJlbC4gXHUyNkQ0IERvIG5vdCByZS1yb3V0ZSB0aGUgcmVmdXNhbCB0aHJvdWdoIGEgc2NyZWVuIHRvXG4gICAgLy8gYm9ycm93IGEgdHJhbnNsYXRhYmxlIHRpdGxlLlxuICAgIHsgaWQ6ICdyZWZ1c2VfaGVsZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ1F1b3RlIFJlZnVzZWQnLCBjb25maWc6IHsgb3V0Y29tZTogJ3JlZnVzZWQnLCBtZXNzYWdlOiAnUXVhbGlmaWNhdGlvbiBhcHByb3ZhbCBjb21lcyBmaXJzdDogdGljayBSZXF1ZXN0IFF1YWxpZmljYXRpb24gQXBwcm92YWwuIE5vdGhpbmcgd2FzIGNyZWF0ZWQuJyB9IH0sXG4gICAge1xuICAgICAgaWQ6ICdzY3JlZW5fMScsIHR5cGU6ICdzY3JlZW4nLCBsYWJlbDogJ1F1b3RlIERldGFpbHMnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogJ3F1b3RlTmFtZScsIGxhYmVsOiAnUXVvdGUgTmFtZScsIHR5cGU6ICd0ZXh0JywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICB7IG5hbWU6ICdleHBpcmF0aW9uRGF5cycsIGxhYmVsOiAnVmFsaWQgRm9yIChEYXlzKScsIHR5cGU6ICdudW1iZXInLCByZXF1aXJlZDogdHJ1ZSwgZGVmYXVsdFZhbHVlOiAzMCB9LFxuICAgICAgICAgIC8vIFRoZSBjZWlsaW5nIGlzIGEgSEFSRCBibG9jayB3aXRoIG5vIG92ZXJyaWRlXG4gICAgICAgICAgLy8gKGBjcm1fcXVvdGUuZGlzY291bnRfd2l0aGluX2NlaWxpbmdgKSwgc28gdW50aWwgaXQgaXMgd3JpdHRlbiBoZXJlXG4gICAgICAgICAgLy8gYSByZXAgbWVldHMgdGhlIG51bWJlciBvbmx5IGJ5IGhhdmluZyB0aGUgcXVvdGUgcmVmdXNlZC4gQm90aFxuICAgICAgICAgIC8vIHN0cmluZ3MgYmVsb3cgaW50ZXJwb2xhdGUgYFFVT1RFX0RJU0NPVU5UX0NFSUxJTkdgIFx1MjAxNCBpbXBvcnRlZCxcbiAgICAgICAgICAvLyBuZXZlciByZXR5cGVkLCB0aGUgc2FtZSBydWxlIHRoZSB0d28gb2JqZWN0IHJ1bGVzIGZvbGxvdyBcdTIwMTQgc28gdGhlXG4gICAgICAgICAgLy8gaGludCBjYW5ub3QgZHJpZnQgZnJvbSB0aGUgcnVsZSBpdCBkZXNjcmliZXMuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBcdTI2RDQgVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IE5PIGBtYXhgLCBhbmQgYWRkaW5nIG9uZSBkb2VzIG5vdCB3b3JrOlxuICAgICAgICAgIC8vIGBTY3JlZW5GaWVsZENvbmZpZ1NjaGVtYWAgaXMgU1RSSUNUIGF0IDE3LjMuMCBhbmQgaXRzIGVudGlyZSBrZXlcbiAgICAgICAgICAvLyBzZXQgaXMgYG5hbWVgIC8gYGxhYmVsYCAvIGB0eXBlYCAvIGByZXF1aXJlZGAgLyBgb3B0aW9uc2AgL1xuICAgICAgICAgIC8vIGBkZWZhdWx0VmFsdWVgIC8gYHBsYWNlaG9sZGVyYCAvIGB2aXNpYmxlV2hlbmAuIGBtYXhgIGlzIHJlamVjdGVkXG4gICAgICAgICAgLy8gQlkgTkFNRSAoYFVucmVjb2duaXplZCBrZXkocykgb24gdGhpcyBzY3JlZW4gZmllbGQ6IG1heGApLCBzb1xuICAgICAgICAgIC8vIGl0IGZhaWxzIGBwbnBtIHZhbGlkYXRlYCByYXRoZXIgdGhhbiBxdWlldGx5IGRvaW5nIG5vdGhpbmcsIGFuZFxuICAgICAgICAgIC8vIHRoZSBleGVjdXRvciBmb3J3YXJkcyBubyBzdWNoIGtleSBpbnRvIHRoZSBgU2NyZWVuU3BlY2AgdGhlIGNsaWVudFxuICAgICAgICAgIC8vIHJlbmRlcnMuIGBoZWxwVGV4dGAgaXMgcmVqZWN0ZWQgdGhlIHNhbWUgd2F5IFx1MjAxNCB0aGUgY29uc29sZSdzXG4gICAgICAgICAgLy8gZGlhbG9nIHdvdWxkIHJlbmRlciBvbmUsIGJ1dCBubyBmbG93IHNjcmVlbiBjYW4gY2FycnkgaXQgdGhlcmUuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGF0IGxlYXZlcyB0d28gY2FycmllcnMsIGFuZCB0aGUgbGFiZWwgaXMgdGhlIGxvYWQtYmVhcmluZyBvbmU6XG4gICAgICAgICAgLy8gYHBsYWNlaG9sZGVyYCByZW5kZXJzIG9ubHkgd2hpbGUgdGhlIGlucHV0IGlzIGVtcHR5IGFuZFxuICAgICAgICAgIC8vIGBkZWZhdWx0VmFsdWU6IDBgIHNlZWRzIGl0LCBzbyBpdCBzdXJmYWNlcyBmb3IgdGhlIG1vbWVudCB0aGUgcmVwXG4gICAgICAgICAgLy8gY2xlYXJzIHRoZSBib3ggdG8gdHlwZSBcdTIwMTQgcmVhbCwgYnV0IG5vdCBlbm91Z2ggb24gaXRzIG93bi5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnZGlzY291bnQnLFxuICAgICAgICAgICAgbGFiZWw6IGBEaXNjb3VudCAlIChcdTIyNjQgJHtRVU9URV9ESVNDT1VOVF9DRUlMSU5HfSlgLFxuICAgICAgICAgICAgdHlwZTogJ3BlcmNlbnQnLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAwLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IGAwLSR7UVVPVEVfRElTQ09VTlRfQ0VJTElOR31gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdnZXRfb3Bwb3J0dW5pdHknLCB0eXBlOiAnZ2V0X3JlY29yZCcsIGxhYmVsOiAnR2V0IE9wcG9ydHVuaXR5JyxcbiAgICAgIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JywgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkSWRgIH0sIG91dHB1dFZhcmlhYmxlOiAnb3BwUmVjb3JkJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdjcmVhdGVfcXVvdGUnLCB0eXBlOiAnY3JlYXRlX3JlY29yZCcsIGxhYmVsOiAnQ3JlYXRlIFF1b3RlJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX3F1b3RlJyxcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgbmFtZTogY2VsYHF1b3RlTmFtZWAsIGNybV9vcHBvcnR1bml0eTogY2VsYHJlY29yZElkYCxcbiAgICAgICAgICBjcm1fYWNjb3VudDogY2VsYG9wcFJlY29yZC5jcm1fYWNjb3VudGAsIGNybV9jb250YWN0OiBjZWxgaGFzKG9wcFJlY29yZC5wcmltYXJ5X2NvbnRhY3QpID8gb3BwUmVjb3JkLnByaW1hcnlfY29udGFjdCA6IG51bGxgLFxuICAgICAgICAgIG93bmVyX2lkOiBjZWxgY3VycmVudF91c2VyLmlkYCwgc3RhdHVzOiAnZHJhZnQnLFxuICAgICAgICAgIHF1b3RlX2RhdGU6IGNlbGBpc29EYXRlKHRvZGF5KCkpYCwgZXhwaXJhdGlvbl9kYXRlOiBjZWxgaXNvRGF0ZShhZGREYXlzKHRvZGF5KCksIGV4cGlyYXRpb25EYXlzKSlgLFxuICAgICAgICAgIC8vIGBzdWJ0b3RhbGAgaXMgYSBiYXJlIHBhdGggcGFzcy10aHJvdWdoIGFuZCBuZWVkcyBubyByb3VuZGluZzogaXRcbiAgICAgICAgICAvLyBjb3BpZXMgYGNybV9vcHBvcnR1bml0eS5hbW91bnRgIGFzIHN0b3JlZCBhbmQgZG9lcyBubyBhcml0aG1ldGljLFxuICAgICAgICAgIC8vIHNvIGl0IGFkZHMgbm8gZmxvYXRpbmctcG9pbnQgdGFpbCBvZiBpdHMgb3duLlxuICAgICAgICAgIC8vIGBkaXNjb3VudGAgaXMgYW4gb3B0aW9uYWwgc2NyZWVuIGFuc3dlcjogYSByZXN1bWUgbWF5IGxlYXZlIGl0XG4gICAgICAgICAgLy8gdW5ib3VuZCwgd2hpY2ggdGhlIHRlbXBsYXRlIHdyb3RlIGFzIG5vdGhpbmcgYW5kIHRoZSBndWFyZCB3cml0ZXNcbiAgICAgICAgICAvLyBhcyBudWxsICh0aGUgcXVvdGUgZmllbGQgaGFzIG5vIGRlZmF1bHQsIHNvIHRoZSB0d28gYWdyZWUpLlxuICAgICAgICAgIHN1YnRvdGFsOiBjZWxgb3BwUmVjb3JkLmFtb3VudGAsIGRpc2NvdW50OiBjZWxgaGFzKHZhcnMuZGlzY291bnQpID8gZGlzY291bnQgOiBudWxsYCxcbiAgICAgICAgICAvLyBcdTI2RDQgQSBjdXJyZW5jeSBcdTAwRDcgcGVyY2VudGFnZSBNVVNUIGJlIHJvdW5kZWQgdG8gd2hvbGUgY2VudHMgaW5zaWRlIHRoZVxuICAgICAgICAgIC8vIGV4cHJlc3Npb24gXHUyMDE0IHRoZSBmbG93IGhhbmRzIHRoZSBlbmdpbmUgYSBtb25leSBhbW91bnQsIG5ldmVyIGFuXG4gICAgICAgICAgLy8gdW5yb3VuZGVkIGRvdWJsZS4gYGRpc2NvdW50IC8gMTAwYCBpcyBpbmV4YWN0IGZvciBldmVyeSBwZXJjZW50YWdlXG4gICAgICAgICAgLy8gd2hvc2UgaHVuZHJlZHRoIGlzIG5vdCBhIGR5YWRpYyByYXRpb25hbCwgc28gYSBCQVJFIHByb2R1Y3QgY2Fycmllc1xuICAgICAgICAgIC8vIGEgdGFpbDogMTgwLDAwMCBhdCAzMCUgaXMgMTI1OTk5Ljk5OTk5OTk5OTk5LiBXaGlsZSB0aGVzZSBmaWVsZHNcbiAgICAgICAgICAvLyBkZWNsYXJlZCBgc2NhbGU6IDJgIHRoZSBpbnNlcnQgd2FzIHJlamVjdGVkIGZvciBpdCAoYFRvdGFsIFByaWNlXG4gICAgICAgICAgLy8gbXVzdCBoYXZlIGF0IG1vc3QgMiBkZWNpbWFsIHBsYWNlcyAoZ290IDExKWAsICMxMjA2KS4gQ3VycmVuY3lcbiAgICAgICAgICAvLyBmaWVsZHMgbm8gbG9uZ2VyIGRlY2xhcmUgYHNjYWxlYCBcdTIwMTQgdGhlIHBsYXRmb3JtIHJlZnVzZXMgaXQsIGFcbiAgICAgICAgICAvLyBjdXJyZW5jeSdzIGRlY2ltYWxzIGFyZSBpdHMgSVNPIDQyMTcgbWlub3IgdW5pdCAoIzE5NjUpIFx1MjAxNCBzbyB0aGVcbiAgICAgICAgICAvLyB3cml0ZSBpcyBub3cgQUNDRVBURUQgYW5kIHRoZSB0YWlsIHdvdWxkIGJlIHN0b3JlZCBzaWxlbnRseS4gVGhlXG4gICAgICAgICAgLy8gcm91bmRpbmcga2VlcHMgYGRpc2NvdW50X2Ftb3VudGAgLyBgdG90YWxfcHJpY2VgIHdob2xlLWNlbnQgYW1vdW50cy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIEJvdGggYXJlIENFTCB2YWx1ZSBlbnZlbG9wZXMuIENFTCdzIGByb3VuZCgpYCBpcyBJTlRFR0VSLU9OTFkgYW5kXG4gICAgICAgICAgLy8gc2luZ2xlLWFyZ3VtZW50LCBhbmQgaXQgcmV0dXJucyBhbiBJTlQgXHUyMDE0IHNvIHRoZSBkaXZpc29yIE1VU1QgYmVcbiAgICAgICAgICAvLyB0aGUgZGVjaW1hbCBgMTAwLjBgLiBcdTI2RDQgTmV2ZXIgYC8gMTAwYDogaW4gQ0VMIGludCAvIGludCBpcyBpbnRlZ2VyXG4gICAgICAgICAgLy8gZGl2aXNpb24sIHdoaWNoIHNpbGVudGx5IGRyb3BzIHRoZSBjZW50cyAoMSwyMzQuNTYgYXQgMTAlIHdvdWxkXG4gICAgICAgICAgLy8gc3RvcmUgMTIzLCBub3QgMTIzLjQ2OyBgdGVzdC9mbG93LXF1b3RlLnRlc3QudHNgIHBpbnMgaXQpLiBcdTI2RDQgTm90XG4gICAgICAgICAgLy8gYHJvdW5kKHgsIDIpYCBlaXRoZXI6IHRoZXJlIGlzIG5vIHByZWNpc2lvbiBmb3JtLCBhbmQgaXQgZmFpbHNcbiAgICAgICAgICAvLyBsb3VkbHkuIGBkb3VibGUoKWAgdHlwZXMgdGhlIGFtb3VudCwgd2hpY2ggc29tZSBkcml2ZXJzIHJldHVybiBhc1xuICAgICAgICAgIC8vIGEgc3RyaW5nLiBBIGNsZWFyZWQgZGlzY291bnQgKG51bGwgLyBhYnNlbnQgLyBcIlwiKSBwcmljZXMgYXMgMCUsIGFzXG4gICAgICAgICAgLy8gaXQgZGlkIGJlZm9yZTsgdGhlIGBoYXMoKWAgZ3VhcmQgaXMgd2hhdCBrZWVwcyB0aGF0IFRPVEFMLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gXHUyQjUwIFRoaXMgc2hhcGUgYXBwbGllcyBBTllXSEVSRSBhIGZsb3cgbXVsdGlwbGllcyBhIGN1cnJlbmN5IGJ5IGFcbiAgICAgICAgICAvLyBwZXJjZW50YWdlLiBXcml0ZSB0aGUgcm91bmRpbmcsIG5vdCB0aGUgYmFyZSBwcm9kdWN0LlxuICAgICAgICAgIGRpc2NvdW50X2Ftb3VudDogZXhwcmVzc2lvbihgcm91bmQoZG91YmxlKG9wcFJlY29yZC5hbW91bnQpICogKCR7RElTQ09VTlR9IC8gMTAwLjApICogMTAwLjApIC8gMTAwLjBgLCAnY2VsJyksXG4gICAgICAgICAgdG90YWxfcHJpY2U6IGV4cHJlc3Npb24oYHJvdW5kKGRvdWJsZShvcHBSZWNvcmQuYW1vdW50KSAqICgxLjAgLSAke0RJU0NPVU5UfSAvIDEwMC4wKSAqIDEwMC4wKSAvIDEwMC4wYCwgJ2NlbCcpLFxuICAgICAgICAgIHBheW1lbnRfdGVybXM6ICduZXRfMzAnLFxuICAgICAgICB9LFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ3F1b3RlSWQnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEFkdmFuY2UgdG8gYHByb3Bvc2FsYCBvbmx5IGZyb20gYSBQUkUtcHJvcG9zYWwgc3RhZ2UgKHRoZSBzdGF0ZSBtYWNoaW5lXG4gICAgICAvLyBhbGxvd3MgYFx1MjE5MiBwcm9wb3NhbGAgZnJvbSBhbGwgdGhyZWUpLiBcdTI2RDQgTmV2ZXIgcmUtd3JpdGUgYHByb3Bvc2FsYCBvbiBhXG4gICAgICAvLyBkZWFsIGFscmVhZHkgYXQgcHJvcG9zYWwvbmVnb3RpYXRpb246IHRoYXQgaXMgYW4gaWxsZWdhbCBzZWxmL2JhY2t3YXJkXG4gICAgICAvLyB0cmFuc2l0aW9uLiBUaG9zZSBkZWFscyBrZWVwIHRoZWlyIHN0YWdlOyB0aGUgcXVvdGUgaXMgc3RpbGwgY3JlYXRlZC5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2RDQgTm9yIG9uIGEgZGVhbCBBV0FJVElORyBBUFBST1ZBTCAoYGFwcHJvdmFsX3N0YXR1cyA9PSBcInBlbmRpbmdcImApLiBBXG4gICAgICAvLyBkZWFsIG9mIGBMQVJHRV9ERUFMX0FNT1VOVGAgb3IgbW9yZSBpcyBoZWxkIGJ5IGBvcHBvcnR1bml0eV9hcHByb3ZhbGAnc1xuICAgICAgLy8gYXBwcm92YWwgbm9kZSAoYGxvY2tSZWNvcmQ6IHRydWVgKSB1bnRpbCBhIG1hbmFnZXIgZGVjaWRlcywgYW5kIHRoZVxuICAgICAgLy8gbG9jayByZWZ1c2VzIHRoaXMgcnVuJ3Mgc3RhZ2Ugd3JpdGUgXHUyMDE0IHRoZSBydW4gaXMgdGhlIHJlcCdzXG4gICAgICAvLyAoYHJ1bkFzOiAndXNlcidgKSwgYW5kIHRoZSBsb2NrIGlzIHRoZSBhcHByb3ZhbCB3b3JraW5nIGFzIGludGVuZGVkLlxuICAgICAgLy8gYGNyZWF0ZV9xdW90ZWAgaGFzIGFscmVhZHkgbGFuZGVkIGJ5IHRoZW4gYW5kIGEgZmxvdyBjYXJyaWVzIG5vXG4gICAgICAvLyB0cmFuc2FjdGlvbiAoQURSLTAwNzcpLCBzbyB0aGUgcmVmdXNhbCB1c2VkIHRvIGZhaWwgdGhlIHJ1biBBRlRFUiB0aGVcbiAgICAgIC8vIHF1b3RlIGV4aXN0ZWQ6IG1lYXN1cmVkIG9uIDE3LjcuMCwgYEZMT1dfRkFJTEVEYCA0MDAgYFJFQ09SRF9MT0NLRURgXG4gICAgICAvLyBhdCBgdXBkYXRlX29wcG9ydHVuaXR5YCwgdGhlIHJlcCB0b2xkIHRoZSBxdW90ZSBmYWlsZWQsIGFuZCB0aGUgZHJhZnRcbiAgICAgIC8vIHF1b3RlIGxlZnQgc3RhbmRpbmcgKCMyMDE1KS4gQSBkZWFsIHVuZGVyIHJldmlldyBrZWVwcyBpdHMgc3RhZ2VcbiAgICAgIC8vIGV4YWN0bHkgbGlrZSBhIGRlYWwgYWxyZWFkeSBhdCBwcm9wb3NhbDsgdGhlIHF1b3RlIGlzIHN0aWxsIGNyZWF0ZWQgXHUyMDE0XG4gICAgICAvLyB0aGUgYnV0dG9uIGlzIG9mZmVyZWQgYXQgZXZlcnkgb3BlbiBzdGFnZSwgYW5kIGEgZHJhZnQgcXVvdGUgY29tbWl0c1xuICAgICAgLy8gbm90aGluZyB0aGUgYXBwcm92YWwgaXMgdGhlcmUgdG8gaG9sZC4gYGFwcHJvdmFsX3N0YXR1c2AgaXMgdGhlIGxvY2snc1xuICAgICAgLy8gb3duIG1pcnJvciAoYGFwcHJvdmFsU3RhdHVzRmllbGRgKTogdGhlIGFwcHJvdmFscyBwbHVnaW4gc3RhbXBzXG4gICAgICAvLyBgcGVuZGluZ2Agd2hlbiBpdCBvcGVucyB0aGUgbG9ja2luZyByZXF1ZXN0IGFuZCBhIHRlcm1pbmFsIHZlcmRpY3RcbiAgICAgIC8vIHdoZW4gaXQgcmVsZWFzZXMgaXQuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHByZWRpY2F0ZSBpdHNlbGYgbGl2ZXMgb24gZWRnZXMgYGU0YWAgLyBgZTRiYCBcdTIwMTQgYSBgZGVjaXNpb25gIG5vZGUnc1xuICAgICAgLy8gc2luZ3VsYXIgYGNvbmZpZy5jb25kaXRpb25gIGlzIG5ldmVyIGV2YWx1YXRlZCwgc28gYSBjb3B5IGhlcmUgd291bGQgYmVcbiAgICAgIC8vIGluZXJ0ICgxNy4wLjAtcmMuMidzIGBmbG93LWluZXJ0LW5vZGUtY29uZGl0aW9uYCkuIFRoZSB0b3RhbGl0eVxuICAgICAgLy8gcmF0aW9uYWxlIGlzIG9uIHRob3NlIGVkZ2VzLCB3aGVyZSB0aGUgZ3VhcmRzIGFyZS5cbiAgICAgIGlkOiAnY2hlY2tfc3RhZ2UnLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0NhbiBBZHZhbmNlIHRvIFByb3Bvc2FsPycsXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ3VwZGF0ZV9vcHBvcnR1bml0eScsIHR5cGU6ICd1cGRhdGVfcmVjb3JkJywgbGFiZWw6ICdVcGRhdGUgT3Bwb3J0dW5pdHknLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIC8vIFx1MjZENCBObyBgbGFzdF9hY3Rpdml0eV9kYXRlYCB3cml0ZTogYGNybV9vcHBvcnR1bml0eWAgaGFzIG5vIHN1Y2ggZmllbGRcbiAgICAgICAgLy8gKGl0IGxpdmVzIG9uIGBjcm1fYWNjb3VudGApLCBhbmQgYW4gdW5rbm93biBjb2x1bW4gZmFpbHMgdGhpcyBub2RlLlxuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JywgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkSWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBzdGFnZTogJ3Byb3Bvc2FsJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEFEUi0wMDEyOiBkZWxpdmVyIHZpYSB0aGUgYG5vdGlmeWAgbm9kZSAoaW5ib3ggKyBlbWFpbCkuIFRoZSBsZWdhY3lcbiAgICAgIC8vIGBzY3JpcHRgICsgYGFjdGlvblR5cGU6J2VtYWlsJ2Agc2hhcGUgaXMgYSBuby1vcCBzdHViIGluIDcuNC5cbiAgICAgIGlkOiAnbm90aWZ5X293bmVyJywgdHlwZTogJ25vdGlmeScsIGxhYmVsOiAnU2VuZCBOb3RpZmljYXRpb24nLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtjZWxgY3VycmVudF91c2VyLmlkYF0sXG4gICAgICAgIGNoYW5uZWxzOiBbJ2luYm94JywgJ2VtYWlsJ10sXG4gICAgICAgIHRvcGljOiAncXVvdGVfY3JlYXRlZCcsXG4gICAgICAgIHRlbXBsYXRlOiAnY3JtLnF1b3RlX2NyZWF0ZWQnLFxuICAgICAgICB0ZW1wbGF0ZURhdGE6IHsgcXVvdGVfbmFtZTogY2VsYHF1b3RlTmFtZWAgfSxcbiAgICAgICAgYWN0aW9uVXJsOiAnL2NybV9xdW90ZS97e3F1b3RlSWQuaWR9fScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIC8vIFx1MjZENCBBIHJldGlyZWQgZWRnZSdzIGlkIHN0YXlzIFZBQ0FOVDogYGUxYCAoc3RhcnQgXHUyMTkyIHNjcmVlbl8xKSBpcyBvbmUuXG4gICAgLy8gRXZlcnkgc3Vydml2aW5nIGVkZ2Uga2VlcHMgaXRzIGlkLCBhbmQgYSBuZXcgb25lIHRha2VzIHRoZSBuZXh0IGlkIGFmdGVyXG4gICAgLy8gdGhlIGhpZ2hlc3QgaW4gdXNlIFx1MjAxNCBhIGR1cGxpY2F0ZSBpZCBpcyBpbmVydCwgc28gbm90aGluZyB3b3VsZCBmbGFnIGl0LlxuICAgIHsgaWQ6ICdlNycsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAnZ2V0X2hlbGQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAvLyBcdTI1MDBcdTI1MDAgVGhlIFx1N0FDQlx1OTg3OSBnYXRlICgjMjAzMikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBDT01QTEVNRU5UQVJZIENPTkRJVElPTkFMUyBvZmYgYSBwbGFpbiBkYXRhIG5vZGUsIG5vdCBhIGBkZWNpc2lvbmAgXHUyMDE0IHRoZVxuICAgIC8vIHNoYXBlIGBiaWxsaW5nLWhhbmRvZmYtY29udHJhY3QtYWN0aXZhdGVkLmZsb3cudHNgIHJlY29yZHM6IHRoZXkgYXJlXG4gICAgLy8gZXZhbHVhdGVkIG9uZSBieSBvbmUsIGFuZCBgIT0gbnVsbGAgLyBgPT0gbnVsbGAgcGFydGl0aW9uIGV4YWN0bHkuXG4gICAgLy8gYGdldF9oZWxkYCBkb21pbmF0ZXMgYm90aCBhbmQgYmluZHMgYGhlbGRgIG9uIGV2ZXJ5IHBhdGggXHUyMDE0IHRoZSByb3csIG9yXG4gICAgLy8gYG51bGxgIG9uIGEgbWlzcyBcdTIwMTQgc28gbmVpdGhlciByZWFkIHRha2VzIGEgYGhhcygpYCBndWFyZDogdGhlXG4gICAgLy8gZ2V0X3JlY29yZC1kb21pbmF0ZWQgY2FzZSBgdGVzdC9mbG93LXZhcmlhYmxlLWNvbmRpdGlvbnMudGVzdC50c2BcbiAgICAvLyByZWNvcmRzIGFzIG5lZWRpbmcgbm9uZSwgd3JpdHRlbiBsaWtlIGBsZWFkX2NvbnZlcnNpb25gJ3MgYGU1YCAvIGBlNmAuXG4gICAgLy8gRmFpbC1PUEVOIGxpa2UgdGhlIGhvb2s6IGEgZGVhbCB0aGUgcmVhZCBjYW5ub3Qgc2VlIGdvZXMgb24gdG8gdGhlIGZvcm1cbiAgICAvLyBhbmQgZmFpbHMgYXQgYGNyZWF0ZV9xdW90ZWAgZXhhY3RseSBhcyBpdCBhbHdheXMgZGlkLlxuICAgIHsgaWQ6ICdlOScsIHNvdXJjZTogJ2dldF9oZWxkJywgdGFyZ2V0OiAncmVmdXNlX2hlbGQnLCB0eXBlOiAnZGVmYXVsdCcsIGNvbmRpdGlvbjogUGB2YXJzLmhlbGQgIT0gbnVsbGAsIGxhYmVsOiAnSGVsZCcgfSxcbiAgICB7IGlkOiAnZTEwJywgc291cmNlOiAnZ2V0X2hlbGQnLCB0YXJnZXQ6ICdzY3JlZW5fMScsIHR5cGU6ICdkZWZhdWx0JywgY29uZGl0aW9uOiBQYHZhcnMuaGVsZCA9PSBudWxsYCwgbGFiZWw6ICdOb3QgaGVsZCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdzY3JlZW5fMScsIHRhcmdldDogJ2dldF9vcHBvcnR1bml0eScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMycsIHNvdXJjZTogJ2dldF9vcHBvcnR1bml0eScsIHRhcmdldDogJ2NyZWF0ZV9xdW90ZScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlNCcsIHNvdXJjZTogJ2NyZWF0ZV9xdW90ZScsIHRhcmdldDogJ2NoZWNrX3N0YWdlJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gVGhlIHR3byBicmFuY2hlcyBtdXN0IFBBUlRJVElPTiwgc28gdGhlIGtlZXAgc2lkZSBpcyB0aGUgYWR2YW5jZSBzaWRlXG4gICAgLy8gbmVnYXRlZCB3aG9sZSAoYEFEVkFOQ0VgIGFib3ZlKTogYGhhcyhcdTIwMjYpICYmIFx1MjAyNmAgYWR2YW5jZXMgYW5kIGV2ZXJ5dGhpbmdcbiAgICAvLyBlbHNlIGtlZXBzLiBBbiB1bmtub3duIHN0YWdlIHRoZXJlZm9yZSBsYW5kcyBvbiBcImtlZXAgc3RhZ2VcIiBcdTIwMTQgdGhlIHF1b3RlXG4gICAgLy8gaXMgc3RpbGwgY3JlYXRlZCBhbmQgbm90aGluZyBpbGxlZ2FsIGlzIHdyaXR0ZW4gdG8gdGhlIHN0YXRlIG1hY2hpbmUuXG4gICAgLy8gVGhlc2UgRURHRVMgYXJlIHRoZSBsaXZlIHNpdGVzOyBgY2hlY2tfc3RhZ2VgIGNhcnJpZXMgbm9cbiAgICAvLyBgY29uZmlnLmNvbmRpdGlvbmAgYXQgYWxsLCBiZWNhdXNlIHRoZSBlbmdpbmUgbmV2ZXIgZXZhbHVhdGVzIG9uZS5cbiAgICAvL1xuICAgIC8vIFRPVEFMSVRZOiBgb3BwUmVjb3JkYCBpcyBhIGBnZXRfcmVjb3JkYCBPVVRQVVQgXHUyMDE0IGBmaW5kT25lYCBhbnN3ZXJzXG4gICAgLy8gYSBtaXNzIHdpdGggYG51bGxgLCBhbmQgcmVhZGluZyBhIGZpZWxkIG9mZiBpdCB0aGVuIGFib3J0cyB3aXRoIGBObyBzdWNoXG4gICAgLy8ga2V5OiBzdGFnZWAuIE1lYXN1cmVkIHVucmVhY2hhYmxlIFRPREFZIG9ubHkgYmVjYXVzZSB0d28gbmVpZ2hib3VyaW5nXG4gICAgLy8gc2NoZW1hcyBoYXBwZW4gdG8gY2xvc2UgaXQ6IGBjcm1fb3Bwb3J0dW5pdHkuc3RhZ2VgIGlzIGByZXF1aXJlZGAgKG5ldmVyXG4gICAgLy8gYSBzcGFyc2UgY29sdW1uKSBhbmQgYGNybV9xdW90ZS5jcm1fYWNjb3VudGAgaXMgYHJlcXVpcmVkYCwgc28gYSBudWxsXG4gICAgLy8gYG9wcFJlY29yZGAgbWFrZXMgYGNyZWF0ZV9xdW90ZWAgZmFpbCBvbmUgbm9kZSBlYXJsaWVyLiBCb3RoIGFyZSBvbmVcbiAgICAvLyBgcmVxdWlyZWQ6IGZhbHNlYCBhd2F5IGZyb20gcmUtb3BlbmluZyBpdCwgc28gdGhlIHByZWRpY2F0ZSBjYXJyaWVzIGl0c1xuICAgIC8vIG93biBndWFyZCBcdTIwMTQgYW5kIGZyb20gMTcuMC4wLXJjLjIgYW4gdW5ldmFsdWFibGUgY29uZGl0aW9uIGFib3J0cyB0aGUgc3RlcFxuICAgIC8vIGluc3RlYWQgb2Ygc2tpcHBpbmcgaXQsIHNvIHRoZSBndWFyZCBpcyBsb2FkLWJlYXJpbmcsIG5vdFxuICAgIC8vIGRlY29yYXRpdmUuIE5vdGUgdGhlIHNjb3BlIGlzIGB2YXJzLm9wcFJlY29yZGAsIG5vdCBiYXJlIGBvcHBSZWNvcmRgOlxuICAgIC8vIG1lYXN1cmVkLCBgaGFzKG9wcFJlY29yZC5zdGFnZSlgIHN0aWxsIGFib3J0cyB3aXRoIGBVbmtub3duIHZhcmlhYmxlOlxuICAgIC8vIG9wcFJlY29yZGAgd2hlbiB0aGUgdmFyaWFibGUgaXMgdW5ib3VuZCwgd2hpbGUgYGhhcyh2YXJzLm9wcFJlY29yZClgXG4gICAgLy8gYW5zd2VycyBgZmFsc2VgIFx1MjAxNCBvbmx5IHRoZSBgdmFycy5gLXNjb3BlZCBmb3JtIGlzIHRvdGFsIGFnYWluc3QgYm90aFxuICAgIC8vIGhhemFyZHMuXG4gICAgLy9cbiAgICAvLyBUaGUgYXBwcm92YWwgdGVybSAoc2VlIGBjaGVja19zdGFnZWApIGlzIGd1YXJkZWQgdGhlIHNhbWUgd2F5OiBhbiBhYnNlbnRcbiAgICAvLyBvciBudWxsIGBhcHByb3ZhbF9zdGF0dXNgIGlzIFwibm90IHVuZGVyIGFwcHJvdmFsXCIgYW5kIGFkdmFuY2VzLCBhcyBpdFxuICAgIC8vIGRpZCBiZWZvcmUgdGhlIHRlcm0gZXhpc3RlZC5cbiAgICB7IGlkOiAnZTRhJywgc291cmNlOiAnY2hlY2tfc3RhZ2UnLCB0YXJnZXQ6ICd1cGRhdGVfb3Bwb3J0dW5pdHknLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IGV4cHJlc3Npb24oQURWQU5DRSwgJ2NlbCcpLCBsYWJlbDogJ0FkdmFuY2UnIH0sXG4gICAgeyBpZDogJ2U0YicsIHNvdXJjZTogJ2NoZWNrX3N0YWdlJywgdGFyZ2V0OiAnbm90aWZ5X293bmVyJywgdHlwZTogJ2NvbmRpdGlvbmFsJywgY29uZGl0aW9uOiBleHByZXNzaW9uKGAhKCR7QURWQU5DRX0pYCwgJ2NlbCcpLCBsYWJlbDogJ0tlZXAgc3RhZ2UnIH0sXG4gICAgeyBpZDogJ2U1Jywgc291cmNlOiAndXBkYXRlX29wcG9ydHVuaXR5JywgdGFyZ2V0OiAnbm90aWZ5X293bmVyJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U2Jywgc291cmNlOiAnbm90aWZ5X293bmVyJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9mbG93cy9jb250cmFjdC1yZW5ld2FsLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2Zsb3dzL2NvbnRyYWN0LXJlbmV3YWwuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUCwgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xuaW1wb3J0IHsgZ3VhcmRlZCB9IGZyb20gJy4uLy4uL3NhbGVzL2Zsb3dzL19ndWFyZGVkLWl0ZXJhdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogQ29udHJhY3QgUmVuZXdhbCBcdTIwMTQgc2NoZWR1bGVkIGRhaWx5IHN3ZWVwIGZvciBjb250cmFjdHMgZW50ZXJpbmcgdGhlaXJcbiAqIHJlbmV3YWwtbm90aWNlIHdpbmRvdy5cbiAqXG4gKiBUaGlzIGZsb3cgaXMgd2hhdCBjb25zdW1lcyBgZW5kX2RhdGVgLCBgYXV0b19yZW5ld2FsYCBhbmRcbiAqIGByZW5ld2FsX25vdGljZV9kYXlzYDogZWFjaCBtb3JuaW5nIGl0IGZpbmRzIGBhY3RpdmF0ZWRgIGNvbnRyYWN0cyB3aG9zZVxuICogYGVuZF9kYXRlYCBmYWxscyBpbnNpZGUgdGhlaXIgcGVyLWNvbnRyYWN0IG5vdGljZSB3aW5kb3csIGJvb2tzIGEgcmVuZXdhbCB0YXNrXG4gKiBmb3IgdGhlIG93bmVyLCBub3RpZmllcyB0aGVtLCBhbmQgXHUyMDE0IHdoZW4gYGF1dG9fcmVuZXdhbGAgaXMgb24gXHUyMDE0IG9wZW5zIGFuXG4gKiBgZXhpc3RpbmdfcmVuZXdhbGAgb3Bwb3J0dW5pdHkgcHJlLWZpbGxlZCBmcm9tIHRoZSBjb250cmFjdCB2YWx1ZSBzbyB0aGUgZGVhbFxuICogaXMgYWxyZWFkeSBpbiB0aGUgcGlwZWxpbmUuXG4gKlxuICogQ2FwYWJpbGl0aWVzIGV4ZXJjaXNlZDogc2NoZWR1bGVkIHRyaWdnZXIgKyBgbG9vcGAgb3ZlciBhIHF1ZXJ5IHJlc3VsdCArXG4gKiBwZXItcmVjb3JkIGBkZWNpc2lvbmAgZ2F0ZXMgKyBgbm90aWZ5YCAoQURSLTAwMTIpLlxuICovXG5leHBvcnQgY29uc3QgQ29udHJhY3RSZW5ld2FsRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2NvbnRyYWN0X3JlbmV3YWwnLFxuICBsYWJlbDogJ0NvbnRyYWN0IFJlbmV3YWwgUmVtaW5kZXInLFxuICBkZXNjcmlwdGlvbjogJ0RhaWx5IHN3ZWVwOiBvcGVuIHJlbmV3YWwgdGFza3Mvb3Bwb3J0dW5pdGllcyBmb3IgY29udHJhY3RzIG5lYXJpbmcgZW5kX2RhdGUuJyxcbiAgdHlwZTogJ3NjaGVkdWxlJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gU2NoZWR1bGVkIHJ1bnMgaGF2ZSBubyB0cmlnZ2VyIHVzZXIsIHNvIHVuZGVyIHRoZSBkZWZhdWx0IHJ1bkFzOid1c2VyJyB0aGVcbiAgLy8gZGF0YSBub2RlcyBleGVjdXRlIFVOU0NPUEVEIGFueXdheS4gRGVjbGFyZSBydW5Bczonc3lzdGVtJyB0byBtYWtlIHRoYXRcbiAgLy8gUkxTLWJ5cGFzc2luZyBlbGV2YXRpb24gZXhwbGljaXQgYW5kIGludGVuZGVkIChBRFItMDA0OSkuXG4gIHJ1bkFzOiAnc3lzdGVtJyxcblxuICB2YXJpYWJsZXM6IFtdLFxuXG4gIG5vZGVzOiBbXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCAoZGFpbHkgMDg6MDApJywgY29uZmlnOiB7IHNjaGVkdWxlOiAnMCA4ICogKiAqJyB9IH0sXG4gICAge1xuICAgICAgLy8gQnJvYWQgcHJlLWZpbHRlciAobmV4dCAxMjAgZGF5cyBcdTIwMTQgXHUyNkQ0IG11c3QgY292ZXIgdGhlIExBUkdFU1RcbiAgICAgIC8vIHJlbmV3YWxfbm90aWNlX2RheXMgaW4gdXNlOyBzZWVkcyBnbyB1cCB0byA5MCkuIFRoZSBwZXItcmVjb3JkIG5vdGljZVxuICAgICAgLy8gd2luZG93IGlzIGFwcGxpZWQgaW4gdGhlIGRlY2lzaW9uIG5vZGUgYmVsb3cgc28gZWFjaCBjb250cmFjdCBob25vdXJzXG4gICAgICAvLyBpdHMgb3duIHJlbmV3YWxfbm90aWNlX2RheXMuIEEgcHJlLWZpbHRlciBuYXJyb3dlciB0aGFuIHRoZSBsYXJnZXN0XG4gICAgICAvLyBub3RpY2UgcGVyaW9kIHNpbGVudGx5IHRydW5jYXRlcyBpdDogYSA5MC1kYXkgY29udHJhY3Qgc3RheXMgaW52aXNpYmxlXG4gICAgICAvLyB1bnRpbCA2MCBkYXlzIG91dC5cbiAgICAgIGlkOiAncXVlcnlfY29udHJhY3RzJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0ZpbmQgRXhwaXJpbmcgQ29udHJhY3RzJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2NvbnRyYWN0JyxcbiAgICAgICAgZmlsdGVyOiB7IHN0YXR1czogJ2FjdGl2YXRlZCcsIGVuZF9kYXRlOiB7ICRndGU6IGNlbGBpc29EYXRlKHRvZGF5KCkpYCwgJGx0ZTogY2VsYGlzb0RhdGUoZGF5c0Zyb21Ob3coMTIwKSlgIH0gfSxcbiAgICAgICAgbGltaXQ6IDUwMCxcbiAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdjb250cmFjdExpc3QnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnbG9vcF9jb250cmFjdHMnLCB0eXBlOiAnbG9vcCcsIGxhYmVsOiAnRm9yIEVhY2ggQ29udHJhY3QnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGNvbGxlY3Rpb246IGNlbGBjb250cmFjdExpc3RgLFxuICAgICAgICBpdGVyYXRvclZhcmlhYmxlOiAnY3VycmVudENvbnRyYWN0JyxcbiAgICAgICAgYm9keTogZ3VhcmRlZCgnY29udHJhY3QnLCB7XG4gICAgICAgICAgbm9kZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gR2F0ZXdheSBvbmx5IFx1MjAxNCB0aGUgcHJlZGljYXRlIGxpdmVzIG9uIHRoZSBvdXQtZWRnZS5cbiAgICAgICAgICAgICAgaWQ6ICdjaGVja19ub3RpY2Vfd2luZG93JywgdHlwZTogJ2RlY2lzaW9uJywgbGFiZWw6ICdXaXRoaW4gTm90aWNlIFdpbmRvdz8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gSWRlbXBvdGVuY3kgZ2F0ZTogdGhlIHN3ZWVwIG1hdGNoZXMgdGhlIHNhbWUgY29udHJhY3QgZXZlcnkgZGF5XG4gICAgICAgICAgICAgIC8vIG9mIGl0cyBub3RpY2Ugd2luZG93LCBzbyBcdTI2RDQgd2l0aG91dCBpdCBldmVyeSBkYXkgcHJvZHVjZXMgYVxuICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgdGFzayArIG5vdGlmaWNhdGlvbiAoYW5kLCBiZWxvdywgYSBkdXBsaWNhdGVcbiAgICAgICAgICAgICAgLy8gcGlwZWxpbmUtaW5mbGF0aW5nIHJlbmV3YWwgb3Bwb3J0dW5pdHkpLiBBbiBvcGVuIHJlbmV3YWwgdGFza1xuICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjb250cmFjdCBtZWFucyB0aGlzIHdpbmRvdyB3YXMgYWxyZWFkeSBoYW5kbGVkLlxuICAgICAgICAgICAgICBpZDogJ2ZpbmRfZXhpc3RpbmdfdGFzaycsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdBbHJlYWR5IFJlbWluZGVkPycsXG4gICAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fdGFzaycsXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgICByZWxhdGVkX3RvX2FjY291bnQ6IGNlbGBjdXJyZW50Q29udHJhY3QuY3JtX2FjY291bnRgLFxuICAgICAgICAgICAgICAgICAgc3ViamVjdDogY2VsYCdSZW5ld2FsIGR1ZTogY29udHJhY3QgJyArIGN1cnJlbnRDb250cmFjdC5jb250cmFjdF9udW1iZXJgLFxuICAgICAgICAgICAgICAgICAgc3RhdHVzOiB7ICRuaW46IFsnY29tcGxldGVkJ10gfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG91dHB1dFZhcmlhYmxlOiAnZXhpc3RpbmdSZW5ld2FsVGFzaycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBHYXRld2F5IG9ubHkgXHUyMDE0IHRoZSBwcmVkaWNhdGUgbGl2ZXMgb24gdGhlIG91dC1lZGdlLlxuICAgICAgICAgICAgICBpZDogJ2NoZWNrX25vdF9yZW1pbmRlZCcsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnRmlyc3QgUmVtaW5kZXI/JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnY3JlYXRlX3JlbmV3YWxfdGFzaycsIHR5cGU6ICdjcmVhdGVfcmVjb3JkJywgbGFiZWw6ICdDcmVhdGUgUmVuZXdhbCBUYXNrJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV90YXNrJyxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgICAgIHN1YmplY3Q6IGNlbGAnUmVuZXdhbCBkdWU6IGNvbnRyYWN0ICcgKyBjdXJyZW50Q29udHJhY3QuY29udHJhY3RfbnVtYmVyYCxcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdmb2xsb3dfdXAnLCBwcmlvcml0eTogJ2hpZ2gnLCBzdGF0dXM6ICdub3Rfc3RhcnRlZCcsXG4gICAgICAgICAgICAgICAgICBkdWVfZGF0ZTogY2VsYGN1cnJlbnRDb250cmFjdC5lbmRfZGF0ZWAsXG4gICAgICAgICAgICAgICAgICBvd25lcl9pZDogY2VsYGhhcyhjdXJyZW50Q29udHJhY3Qub3duZXJfaWQpID8gY3VycmVudENvbnRyYWN0Lm93bmVyX2lkIDogbnVsbGAsXG4gICAgICAgICAgICAgICAgICAvLyBPUkcgUEFSVElUSU9OLiBBIHNjaGVkdWxlIHRyaWdnZXIgY2FycmllcyBub1xuICAgICAgICAgICAgICAgICAgLy8gb3JnYW5pemF0aW9uLCBzbyB0aGUgZW5naW5lIGhhcyBub3RoaW5nIHRvIGZpbGwgdGhpcyBmcm9tXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIHJvdyB3b3VsZCBiZSBib3JuIGBvcmdhbml6YXRpb25faWRgIE5VTEwgXHUyMDE0IG91dHNpZGVcbiAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IG9yZyBwYXJ0aXRpb24sIHdoZXJlIGFuIGAob3JnYW5pemF0aW9uX2lkLCBcdTIwMjYpYCB1bmlxdWVcbiAgICAgICAgICAgICAgICAgIC8vIGluZGV4IGRvZXMgbm90IGNvbnN0cmFpbiBhbmQgb3JnLXNjb3BlZCByZWFkcyBuZXZlciBzZWUgaXQuXG4gICAgICAgICAgICAgICAgICAvLyBVcHN0cmVhbSBydWxpbmcgb2JqZWN0c3RhY2sjNjE1NSBRMj1BIHB1dHMgdGhlIGFuc3dlciBoZXJlLFxuICAgICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgZmxvdyBhdXRob3I6IGEgcmVuZXdhbCB0YXNrIGJlbG9uZ3MgdG8gdGhlIG9yZyBvZlxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbnRyYWN0IHRoYXQgc3Bhd25lZCBpdC4gRmlsbC1vbmx5IHByZWNlZGVuY2UgbWVhbnMgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGF1dGhvci1zZXQgdmFsdWUgd2lucyBvdmVyIHRoZSBlbmdpbmUgKG9iamVjdHN0YWNrIzYxNTMpLlxuICAgICAgICAgICAgICAgICAgLy8gVGhlIHNvdXJjZSBNVVNUIGJlIGEgcm93IHRoYXQgYWN0dWFsbHkgY2FycmllcyB0aGUgY29sdW1uLlxuICAgICAgICAgICAgICAgICAgLy8gT24gMTcueCBhbiBhYnNlbnQga2V5IGludGVycG9sYXRlZCB0byBgdW5kZWZpbmVkYCBhbmQgbGFuZGVkXG4gICAgICAgICAgICAgICAgICAvLyBhcyBOVUxMLCB3aGljaCBzYXRpc2ZpZWQgdGhlIHB1Ymxpc2ggZ3VhcmQgd2hpbGUgcmVwcm9kdWNpbmdcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBidWc7IHRoZSBDRUwgcmVhZCBiZWxvdyBmYWlscyB0aGUgaXRlcmF0aW9uIGluc3RlYWQsIGFuZFxuICAgICAgICAgICAgICAgICAgLy8gaXQgaXMgZGVsaWJlcmF0ZWx5IGxlZnQgVU5HVUFSREVEIFx1MjAxNCBhIGBoYXMoKWAgZ3VhcmQgd291bGRcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoYXQgTlVMTCBiYWNrLiBgY3JtX2NvbnRyYWN0YCBjYXJyaWVzIGl0OyBgc3lzX3VzZXJgXG4gICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdC5cbiAgICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbl9pZDogY2VsYGN1cnJlbnRDb250cmFjdC5vcmdhbml6YXRpb25faWRgLFxuICAgICAgICAgICAgICAgICAgcmVsYXRlZF90b190eXBlOiAnY3JtX2FjY291bnQnLFxuICAgICAgICAgICAgICAgICAgcmVsYXRlZF90b19hY2NvdW50OiBjZWxgY3VycmVudENvbnRyYWN0LmNybV9hY2NvdW50YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWQ6ICdub3RpZnlfb3duZXInLCB0eXBlOiAnbm90aWZ5JywgbGFiZWw6ICdOb3RpZnkgT3duZXInLFxuICAgICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICByZWNpcGllbnRzOiBbY2VsYGhhcyhjdXJyZW50Q29udHJhY3Qub3duZXJfaWQpID8gY3VycmVudENvbnRyYWN0Lm93bmVyX2lkIDogbnVsbGBdLFxuICAgICAgICAgICAgICAgIGNoYW5uZWxzOiBbJ2luYm94JywgJ2VtYWlsJ10sXG4gICAgICAgICAgICAgICAgdG9waWM6ICdjb250cmFjdF9yZW5ld2FsJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogJ2NybS5jb250cmFjdF9yZW5ld2FsJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZURhdGE6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnRyYWN0X251bWJlcjogY2VsYGN1cnJlbnRDb250cmFjdC5jb250cmFjdF9udW1iZXJgLCBlbmRfZGF0ZTogY2VsYGN1cnJlbnRDb250cmFjdC5lbmRfZGF0ZWAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhY3Rpb25Vcmw6ICcvY3JtX2NvbnRyYWN0L3t7Y3VycmVudENvbnRyYWN0LmlkfX0nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gR2F0ZXdheSBvbmx5IFx1MjAxNCB0aGUgcHJlZGljYXRlIGxpdmVzIG9uIHRoZSBvdXQtZWRnZS5cbiAgICAgICAgICAgICAgaWQ6ICdjaGVja19hdXRvX3JlbmV3YWwnLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0F1dG8tUmVuZXdhbCBPbj8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gU2Vjb25kIGdhdGU6IG5ldmVyIG9wZW4gYSBzZWNvbmQgcmVuZXdhbCBvcHBvcnR1bml0eSB3aGlsZSBvbmVcbiAgICAgICAgICAgICAgLy8gaXMgc3RpbGwgaW4gZmxpZ2h0IGZvciB0aGlzIGFjY291bnQgKGJlbHQtYW5kLWJyYWNlcyBmb3IgdGhlXG4gICAgICAgICAgICAgIC8vIGNhc2Ugd2hlcmUgdGhlIHRhc2sgd2FzIGNvbXBsZXRlZCBidXQgdGhlIGRlYWwgaXMgc3RpbGwgb3BlbikuXG4gICAgICAgICAgICAgIGlkOiAnZmluZF9leGlzdGluZ19yZW5ld2FsX29wcCcsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdPcGVuIFJlbmV3YWwgRGVhbCBFeGlzdHM/JyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgICBjcm1fYWNjb3VudDogY2VsYGN1cnJlbnRDb250cmFjdC5jcm1fYWNjb3VudGAsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnZXhpc3RpbmdfcmVuZXdhbCcsXG4gICAgICAgICAgICAgICAgICBzdGFnZTogeyAkbmluOiBbJ2Nsb3NlZF93b24nLCAnY2xvc2VkX2xvc3QnXSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdleGlzdGluZ1JlbmV3YWxPcHAnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gR2F0ZXdheSBvbmx5IFx1MjAxNCB0aGUgcHJlZGljYXRlIGxpdmVzIG9uIHRoZSBvdXQtZWRnZS5cbiAgICAgICAgICAgICAgaWQ6ICdjaGVja19ub19vcGVuX3JlbmV3YWwnLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ05vIE9wZW4gUmVuZXdhbCBEZWFsPycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogJ2NyZWF0ZV9yZW5ld2FsX29wcCcsIHR5cGU6ICdjcmVhdGVfcmVjb3JkJywgbGFiZWw6ICdPcGVuIFJlbmV3YWwgT3Bwb3J0dW5pdHknLFxuICAgICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGNlbGAnUmVuZXdhbCBcdTIwMTQgJyArIGN1cnJlbnRDb250cmFjdC5jb250cmFjdF9udW1iZXJgLFxuICAgICAgICAgICAgICAgICAgY3JtX2FjY291bnQ6IGNlbGBjdXJyZW50Q29udHJhY3QuY3JtX2FjY291bnRgLFxuICAgICAgICAgICAgICAgICAgYW1vdW50OiBjZWxgY3VycmVudENvbnRyYWN0LmNvbnRyYWN0X3ZhbHVlYCxcbiAgICAgICAgICAgICAgICAgIHN0YWdlOiAncHJvcG9zYWwnLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ2V4aXN0aW5nX3JlbmV3YWwnLFxuICAgICAgICAgICAgICAgICAgY2xvc2VfZGF0ZTogY2VsYGN1cnJlbnRDb250cmFjdC5lbmRfZGF0ZWAsXG4gICAgICAgICAgICAgICAgICBvd25lcl9pZDogY2VsYGhhcyhjdXJyZW50Q29udHJhY3Qub3duZXJfaWQpID8gY3VycmVudENvbnRyYWN0Lm93bmVyX2lkIDogbnVsbGAsXG4gICAgICAgICAgICAgICAgICAvLyBPUkcgUEFSVElUSU9OIFx1MjAxNCBzZWUgYGNyZWF0ZV9yZW5ld2FsX3Rhc2tgIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlbmV3YWwgZGVhbCBiZWxvbmdzIHRvIHRoZSBzYW1lIG9yZyBhcyB0aGUgY29udHJhY3QuXG4gICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25faWQ6IGNlbGBjdXJyZW50Q29udHJhY3Qub3JnYW5pemF0aW9uX2lkYCxcbiAgICAgICAgICAgICAgICAgIG5leHRfc3RlcDogJ0NvbmZpcm0gcmVuZXdhbCB0ZXJtcyB3aXRoIGN1c3RvbWVyJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGVkZ2VzOiBbXG4gICAgICAgICAgICAvLyBPbmx5IGFjdCB3aGVuIGluc2lkZSB0aGUgcGVyLWNvbnRyYWN0IG5vdGljZSB3aW5kb3c7IGdhdGVzIHdpdGhcbiAgICAgICAgICAgIC8vIG5vIG1hdGNoaW5nIGVkZ2Ugc2ltcGx5IGVuZCB0aGUgaXRlcmF0aW9uLCBzbyB0aGUgbG9vcCBtb3ZlcyBvbi5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGUgRURHRSBpcyB0aGUgT05MWSBzaXRlOiBhIGBkZWNpc2lvbmAgbm9kZSdzIHNpbmd1bGFyXG4gICAgICAgICAgICAvLyBgY29uZmlnLmNvbmRpdGlvbmAgaXMgbmV2ZXIgcmVhZCBcdTIwMTQgdGhlIGV4ZWN1dG9yIHJlYWRzIHRoZSBwbHVyYWxcbiAgICAgICAgICAgIC8vIGBjb25maWcuY29uZGl0aW9uc1tdYCBhbmQgbm90aGluZyBlbHNlIFx1MjAxNCBzbyBhIGNvcHkgb24gdGhlIG5vZGVcbiAgICAgICAgICAgIC8vIHdvdWxkIGJlIGluZXJ0IG1ldGFkYXRhIHRoYXQgZHJpZnRzIHNpbGVudGx5LiBgY2hlY2tfbm90aWNlX3dpbmRvd2BcbiAgICAgICAgICAgIC8vIGlzIHRoZXJlZm9yZSBhIGJhcmUgZ2F0ZXdheSBhbmQgdGhpcyBwcmVkaWNhdGUgaXMgYXV0aG9yZWQgb25jZS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBgZW5kX2RhdGVgIGlzIGEgREFURSBmaWVsZCBhbmQgYXJyaXZlcyBhcyBgWVlZWS1NTS1ERGAsIGJ1dCBDRUwnc1xuICAgICAgICAgICAgLy8gYHRpbWVzdGFtcCgpYCBvbmx5IGFjY2VwdHMgYSBmdWxsIElTTyA4NjAxIGRhdGV0aW1lIGFuZCB0aHJvd3NcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSAoXCJ0aW1lc3RhbXAoKSByZXF1aXJlcyBhIHN0cmluZyBpbiBJU08gODYwMSBmb3JtYXRcIikuXG4gICAgICAgICAgICAvLyBBcHBlbmRpbmcgdGhlIHRpbWUgcGFydCBpcyB3aGF0IG1ha2VzIHRoaXMgZXZhbHVhdGUgaW5zdGVhZCBvZlxuICAgICAgICAgICAgLy8gYmxvd2luZyB1cCBtaWQtc3dlZXAuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVE9UQUxJVFk6IGBjdXJyZW50Q29udHJhY3RgIGlzIGEgTE9PUCBJVEVNIG92ZXJcbiAgICAgICAgICAgIC8vIGBjb250cmFjdExpc3RgLCB3aGljaCBgZ2V0X3JlY29yZGAgZmlsbGVkIGZyb20gYGRhdGEuZmluZGAgXHUyMDE0XG4gICAgICAgICAgICAvLyBldmVyeSBlbGVtZW50IGlzIGEgcmF3IGRyaXZlciByb3csIHNwYXJzZSBpbiBleGFjdGx5IHRoZSB3YXlcbiAgICAgICAgICAgIC8vIGEgcmF3IGRyaXZlciByb3cgaXMuIGBlbmRfZGF0ZWAgaXMgYHJlcXVpcmVkYCBvbiBgY3JtX2NvbnRyYWN0YCBzb1xuICAgICAgICAgICAgLy8gdGhhdCBjb2x1bW4gaXMgYWx3YXlzIHdyaXR0ZW4sIGJ1dCBgcmVuZXdhbF9ub3RpY2VfZGF5c2BcbiAgICAgICAgICAgIC8vIChgZGVmYXVsdFZhbHVlOiAzMGApIGFuZCBgYXV0b19yZW5ld2FsYCAoYGRlZmF1bHRWYWx1ZTogZmFsc2VgKVxuICAgICAgICAgICAgLy8gYXJlIG9ubHkgREVGQVVMVEVELCBhbmQgYSByb3cgd3JpdHRlbiBiZWZvcmUgdGhlIGRlZmF1bHQgZXhpc3RlZFxuICAgICAgICAgICAgLy8gY2FycmllcyBuZWl0aGVyIHRoZSBjb2x1bW4gbm9yIGEgdmFsdWUuIEJvdGggb3BlcmFuZHNcbiAgICAgICAgICAgIC8vIGFkZGl0aW9uYWxseSBuZWVkIGAhPSBudWxsYCwgYmVjYXVzZSB0aGUgYWJvcnQgaGVyZSBpcyBub3QgdGhlXG4gICAgICAgICAgICAvLyB1c3VhbCBvdmVybG9hZCBlcnJvcjogYG51bGwgKyBcIlQwMDowMDowMFpcImAgYW5kIGBpbnQobnVsbClgIGVhY2hcbiAgICAgICAgICAgIC8vIGJsb3cgdXAgaW5zaWRlIHRoZSBmdW5jdGlvbiBjYWxsLCBvbmUgY29udHJhY3QgaW50byBhIDUwMC1yb3dcbiAgICAgICAgICAgIC8vIHN3ZWVwLCB0YWtpbmcgdGhlIHdob2xlIHNjaGVkdWxlZCBydW4gd2l0aCB0aGVtLlxuICAgICAgICAgICAgeyBpZDogJ2IxJywgc291cmNlOiAnY2hlY2tfbm90aWNlX3dpbmRvdycsIHRhcmdldDogJ2ZpbmRfZXhpc3RpbmdfdGFzaycsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGBoYXModmFycy5jdXJyZW50Q29udHJhY3QpICYmIGhhcyh2YXJzLmN1cnJlbnRDb250cmFjdC5lbmRfZGF0ZSkgJiYgaGFzKHZhcnMuY3VycmVudENvbnRyYWN0LnJlbmV3YWxfbm90aWNlX2RheXMpXG4gICAgICAgICAgICAgICYmIHZhcnMuY3VycmVudENvbnRyYWN0LmVuZF9kYXRlICE9IG51bGwgJiYgdmFycy5jdXJyZW50Q29udHJhY3QucmVuZXdhbF9ub3RpY2VfZGF5cyAhPSBudWxsXG4gICAgICAgICAgICAgICYmIHRpbWVzdGFtcCh2YXJzLmN1cnJlbnRDb250cmFjdC5lbmRfZGF0ZSArIFwiVDAwOjAwOjAwWlwiKSA8PSBkYXlzRnJvbU5vdyhpbnQodmFycy5jdXJyZW50Q29udHJhY3QucmVuZXdhbF9ub3RpY2VfZGF5cykpYCwgbGFiZWw6ICdJbiB3aW5kb3cnIH0sXG4gICAgICAgICAgICB7IGlkOiAnYjInLCBzb3VyY2U6ICdmaW5kX2V4aXN0aW5nX3Rhc2snLCB0YXJnZXQ6ICdjaGVja19ub3RfcmVtaW5kZWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiMycsIHNvdXJjZTogJ2NoZWNrX25vdF9yZW1pbmRlZCcsIHRhcmdldDogJ2NyZWF0ZV9yZW5ld2FsX3Rhc2snLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IFBgZXhpc3RpbmdSZW5ld2FsVGFzayA9PSBudWxsYCwgbGFiZWw6ICdGaXJzdCByZW1pbmRlcicgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiNCcsIHNvdXJjZTogJ2NyZWF0ZV9yZW5ld2FsX3Rhc2snLCB0YXJnZXQ6ICdub3RpZnlfb3duZXInLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiNScsIHNvdXJjZTogJ25vdGlmeV9vd25lcicsIHRhcmdldDogJ2NoZWNrX2F1dG9fcmVuZXdhbCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgICAgLy8gVE9UQUxJVFk6IHNhbWUgbG9vcCBpdGVtLCBzYW1lIHNwYXJzZSBkcml2ZXIgcm93LiBPbmx5IGFuXG4gICAgICAgICAgICAvLyBleHBsaWNpdCBgdHJ1ZWAgb3BlbnMgYSByZW5ld2FsIGRlYWwsIHNvIGFuIGFic2VudCBjb2x1bW4gcmVhZHNcbiAgICAgICAgICAgIC8vIGFzIFwiYXV0by1yZW5ld2FsIG9mZlwiIFx1MjAxNCB0aGUgY29uc2VydmF0aXZlIGJyYW5jaC5cbiAgICAgICAgICAgIHsgaWQ6ICdiNicsIHNvdXJjZTogJ2NoZWNrX2F1dG9fcmVuZXdhbCcsIHRhcmdldDogJ2ZpbmRfZXhpc3RpbmdfcmVuZXdhbF9vcHAnLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IFBgaGFzKHZhcnMuY3VycmVudENvbnRyYWN0KSAmJiBoYXModmFycy5jdXJyZW50Q29udHJhY3QuYXV0b19yZW5ld2FsKVxuICAgICAgICAgICAgICAmJiB2YXJzLmN1cnJlbnRDb250cmFjdC5hdXRvX3JlbmV3YWwgPT0gdHJ1ZWAsIGxhYmVsOiAnQXV0by1yZW5ldycgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiNycsIHNvdXJjZTogJ2ZpbmRfZXhpc3RpbmdfcmVuZXdhbF9vcHAnLCB0YXJnZXQ6ICdjaGVja19ub19vcGVuX3JlbmV3YWwnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiOCcsIHNvdXJjZTogJ2NoZWNrX25vX29wZW5fcmVuZXdhbCcsIHRhcmdldDogJ2NyZWF0ZV9yZW5ld2FsX29wcCcsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGBleGlzdGluZ1JlbmV3YWxPcHAgPT0gbnVsbGAsIGxhYmVsOiAnT3BlbiByZW5ld2FsIGRlYWwnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIHsgaWQ6ICdlMScsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAncXVlcnlfY29udHJhY3RzJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAncXVlcnlfY29udHJhY3RzJywgdGFyZ2V0OiAnbG9vcF9jb250cmFjdHMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdsb29wX2NvbnRyYWN0cycsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZmxvd3MvcXVvdGUtZXhwaXJhdGlvbi5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZmxvd3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9mbG93cy9xdW90ZS1leHBpcmF0aW9uLmZsb3cudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGNlbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcbmltcG9ydCB7IGd1YXJkZWQgfSBmcm9tICcuLi8uLi9zYWxlcy9mbG93cy9fZ3VhcmRlZC1pdGVyYXRpb24nO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIFF1b3RlIGF1dG8tZXhwaXJhdGlvbiBcdTIwMTQgc2NoZWR1bGVkIGRhaWx5IHN3ZWVwLlxuICpcbiAqIEZsaXBzIHF1b3RlcyBwYXN0IHRoZWlyIGBleHBpcmF0aW9uX2RhdGVgIHRvIGBleHBpcmVkYCB1bmxlc3MgYWxyZWFkeVxuICogYWNjZXB0ZWQvcmVqZWN0ZWQvZXhwaXJlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFF1b3RlRXhwaXJhdGlvbkZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICdxdW90ZV9leHBpcmF0aW9uJyxcbiAgbGFiZWw6ICdRdW90ZSBBdXRvLUV4cGlyYXRpb24nLFxuICBkZXNjcmlwdGlvbjogJ0RhaWx5OiBleHBpcmUgcXVvdGVzIHBhc3QgdGhlaXIgZXhwaXJhdGlvbl9kYXRlIHRoYXQgYXJlIHN0aWxsIG9wZW4uJyxcbiAgdHlwZTogJ3NjaGVkdWxlJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gU2NoZWR1bGVkIHJ1bnMgaGF2ZSBubyB0cmlnZ2VyIHVzZXIsIHNvIHVuZGVyIHRoZSBkZWZhdWx0IHJ1bkFzOid1c2VyJyB0aGVcbiAgLy8gZGF0YSBub2RlcyBleGVjdXRlIFVOU0NPUEVEIGFueXdheS4gRGVjbGFyZSBydW5Bczonc3lzdGVtJyB0byBtYWtlIHRoYXRcbiAgLy8gUkxTLWJ5cGFzc2luZyBlbGV2YXRpb24gZXhwbGljaXQgYW5kIGludGVuZGVkIChBRFItMDA0OSkuXG4gIHJ1bkFzOiAnc3lzdGVtJyxcbiAgdmFyaWFibGVzOiBbXSxcbiAgbm9kZXM6IFtcbiAgICB7IGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0IChkYWlseSAwMTowMCknLCBjb25maWc6IHsgc2NoZWR1bGU6ICcwIDEgKiAqIConIH0gfSxcbiAgICB7XG4gICAgICBpZDogJ3F1ZXJ5X3F1b3RlcycsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdGaW5kIEV4cGlyZWQgUXVvdGVzJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX3F1b3RlJyxcbiAgICAgICAgZmlsdGVyOiB7IHN0YXR1czogeyAkbmluOiBbJ2FjY2VwdGVkJywgJ3JlamVjdGVkJywgJ2V4cGlyZWQnXSB9LCBleHBpcmF0aW9uX2RhdGU6IHsgJGx0OiBjZWxgaXNvRGF0ZSh0b2RheSgpKWAgfSB9LFxuICAgICAgICBsaW1pdDogNTAwLFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ3F1b3RlTGlzdCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdsb29wX3F1b3RlcycsIHR5cGU6ICdsb29wJywgbGFiZWw6ICdGb3IgRWFjaCBRdW90ZScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgY29sbGVjdGlvbjogY2VsYHF1b3RlTGlzdGAsXG4gICAgICAgIGl0ZXJhdG9yVmFyaWFibGU6ICdjdXJyZW50UXVvdGUnLFxuICAgICAgICBib2R5OiBndWFyZGVkKCdxdW90ZScsIHtcbiAgICAgICAgICBub2RlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogJ21hcmtfZXhwaXJlZCcsIHR5cGU6ICd1cGRhdGVfcmVjb3JkJywgbGFiZWw6ICdNYXJrIEV4cGlyZWQnLFxuICAgICAgICAgICAgICBjb25maWc6IHsgb2JqZWN0TmFtZTogJ2NybV9xdW90ZScsIGZpbHRlcjogeyBpZDogY2VsYGN1cnJlbnRRdW90ZS5pZGAgfSwgZmllbGRzOiB7IHN0YXR1czogJ2V4cGlyZWQnIH0gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBlZGdlczogW10sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdxdWVyeV9xdW90ZXMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdxdWVyeV9xdW90ZXMnLCB0YXJnZXQ6ICdsb29wX3F1b3RlcycsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMycsIHNvdXJjZTogJ2xvb3BfcXVvdGVzJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9mbG93cy9jb250cmFjdC1leHBpcmF0aW9uLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2Zsb3dzL2NvbnRyYWN0LWV4cGlyYXRpb24uZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xuaW1wb3J0IHsgZ3VhcmRlZCB9IGZyb20gJy4uLy4uL3NhbGVzL2Zsb3dzL19ndWFyZGVkLWl0ZXJhdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogQ29udHJhY3QgYXV0by1leHBpcmF0aW9uIFx1MjAxNCBzY2hlZHVsZWQgZGFpbHkgc3dlZXAuXG4gKlxuICogRmxpcHMgYGFjdGl2YXRlZGAgY29udHJhY3RzIHBhc3QgdGhlaXIgYGVuZF9kYXRlYCB0byBgZXhwaXJlZGAgYW5kIG5vdGlmaWVzXG4gKiB0aGUgb3duZXIuIChSZW5ld2FsICpyZW1pbmRlcnMqIGFyZSBhIHNlcGFyYXRlIGNvbmNlcm4sIGhhbmRsZWQgYnkgdGhlXG4gKiBgY29udHJhY3RfcmVuZXdhbGAgZmxvdy4pXG4gKi9cbmV4cG9ydCBjb25zdCBDb250cmFjdEV4cGlyYXRpb25GbG93OiBGbG93ID0ge1xuICBuYW1lOiAnY29udHJhY3RfZXhwaXJhdGlvbicsXG4gIGxhYmVsOiAnQ29udHJhY3QgQXV0by1FeHBpcmF0aW9uJyxcbiAgZGVzY3JpcHRpb246ICdEYWlseTogZXhwaXJlIGFjdGl2YXRlZCBjb250cmFjdHMgcGFzdCB0aGVpciBlbmRfZGF0ZSBhbmQgbm90aWZ5IHRoZSBvd25lci4nLFxuICB0eXBlOiAnc2NoZWR1bGUnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBTY2hlZHVsZWQgcnVucyBoYXZlIG5vIHRyaWdnZXIgdXNlciwgc28gdW5kZXIgdGhlIGRlZmF1bHQgcnVuQXM6J3VzZXInIHRoZVxuICAvLyBkYXRhIG5vZGVzIGV4ZWN1dGUgVU5TQ09QRUQgYW55d2F5LiBEZWNsYXJlIHJ1bkFzOidzeXN0ZW0nIHRvIG1ha2UgdGhhdFxuICAvLyBSTFMtYnlwYXNzaW5nIGVsZXZhdGlvbiBleHBsaWNpdCBhbmQgaW50ZW5kZWQgKEFEUi0wMDQ5KS5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICB2YXJpYWJsZXM6IFtdLFxuICBub2RlczogW1xuICAgIHsgaWQ6ICdzdGFydCcsIHR5cGU6ICdzdGFydCcsIGxhYmVsOiAnU3RhcnQgKGRhaWx5IDAwOjAwKScsIGNvbmZpZzogeyBzY2hlZHVsZTogJzAgMCAqICogKicgfSB9LFxuICAgIHtcbiAgICAgIGlkOiAncXVlcnlfY29udHJhY3RzJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0ZpbmQgRXhwaXJlZCBDb250cmFjdHMnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fY29udHJhY3QnLFxuICAgICAgICBmaWx0ZXI6IHsgc3RhdHVzOiAnYWN0aXZhdGVkJywgZW5kX2RhdGU6IHsgJGx0OiBjZWxgaXNvRGF0ZSh0b2RheSgpKWAgfSB9LFxuICAgICAgICBsaW1pdDogNTAwLFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2NvbnRyYWN0TGlzdCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdsb29wX2NvbnRyYWN0cycsIHR5cGU6ICdsb29wJywgbGFiZWw6ICdGb3IgRWFjaCBDb250cmFjdCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgY29sbGVjdGlvbjogY2VsYGNvbnRyYWN0TGlzdGAsXG4gICAgICAgIGl0ZXJhdG9yVmFyaWFibGU6ICdjdXJyZW50Q29udHJhY3QnLFxuICAgICAgICBib2R5OiBndWFyZGVkKCdjb250cmFjdCcsIHtcbiAgICAgICAgICBub2RlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogJ21hcmtfZXhwaXJlZCcsIHR5cGU6ICd1cGRhdGVfcmVjb3JkJywgbGFiZWw6ICdNYXJrIEV4cGlyZWQnLFxuICAgICAgICAgICAgICBjb25maWc6IHsgb2JqZWN0TmFtZTogJ2NybV9jb250cmFjdCcsIGZpbHRlcjogeyBpZDogY2VsYGN1cnJlbnRDb250cmFjdC5pZGAgfSwgZmllbGRzOiB7IHN0YXR1czogJ2V4cGlyZWQnIH0gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnbm90aWZ5X293bmVyJywgdHlwZTogJ25vdGlmeScsIGxhYmVsOiAnTm90aWZ5IE93bmVyJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgcmVjaXBpZW50czogW2NlbGBoYXMoY3VycmVudENvbnRyYWN0Lm93bmVyX2lkKSA/IGN1cnJlbnRDb250cmFjdC5vd25lcl9pZCA6IG51bGxgXSxcbiAgICAgICAgICAgICAgICBjaGFubmVsczogWydpbmJveCcsICdlbWFpbCddLFxuICAgICAgICAgICAgICAgIHRvcGljOiAnY29udHJhY3RfZXhwaXJlZCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6ICdjcm0uY29udHJhY3RfZXhwaXJlZCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVEYXRhOiB7IGNvbnRyYWN0X251bWJlcjogY2VsYGN1cnJlbnRDb250cmFjdC5jb250cmFjdF9udW1iZXJgIH0sXG4gICAgICAgICAgICAgICAgYWN0aW9uVXJsOiAnL2NybV9jb250cmFjdC97e2N1cnJlbnRDb250cmFjdC5pZH19JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBlZGdlczogW1xuICAgICAgICAgICAgeyBpZDogJ2IxJywgc291cmNlOiAnbWFya19leHBpcmVkJywgdGFyZ2V0OiAnbm90aWZ5X293bmVyJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ3F1ZXJ5X2NvbnRyYWN0cycsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ3F1ZXJ5X2NvbnRyYWN0cycsIHRhcmdldDogJ2xvb3BfY29udHJhY3RzJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UzJywgc291cmNlOiAnbG9vcF9jb250cmFjdHMnLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2Zsb3dzL2JpbGxpbmctaGFuZG9mZi1jb250cmFjdC1hY3RpdmF0ZWQuZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZmxvd3MvYmlsbGluZy1oYW5kb2ZmLWNvbnRyYWN0LWFjdGl2YXRlZC5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbmltcG9ydCB7XG4gIEJJTExJTkdfSEFORE9GRl9FTkRQT0lOVCxcbiAgQklMTElOR19IQU5ET0ZGX0VWRU5ULFxuICBCSUxMSU5HX0hBTkRPRkZfTElORV9JVEVNX0xJTUlULFxuICBCSUxMSU5HX0hBTkRPRkZfU0lHTklOR19TRUNSRVQsXG4gIEJJTExJTkdfSEFORE9GRl9USU1FT1VUX01TLFxuICBMSU5FX0lURU1fRklFTERTLFxuICBiaWxsaW5nQm9keSxcbiAgbG9hZEFjY291bnROb2RlLFxufSBmcm9tICcuLi8uLi9zYWxlcy9mbG93cy9fYmlsbGluZy1lbmRwb2ludCc7XG5cbi8qKlxuICogXHUyNTUwXHUyNTUwXHUyNTUwIEJpbGxpbmcgaGFuZC1vZmYgXHUyMDE0IHdoZXJlIEhvdENSTSdzIHJldmVudWUgc2NvcGUgZW5kcyBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcbiAqXG4gKiBIb3RDUk0gb3ducyBsZWFkIFx1MjE5MiBjb250cmFjdC4gSXQgZG9lcyAqKm5vdCoqIG1vZGVsIE9yZGVycywgSW52b2ljZXMgb3JcbiAqIFBheW1lbnRzIChtYWludGFpbmVyIGRlY2lzaW9uLCAyMDI2LTA4LTAyKTogYmlsbGluZyBpcyBhbiBleHRlcm5hbCBzeXN0ZW0nc1xuICogam9iLiBXaGF0IHRoZSBDUk0gb3dlcyB0aGF0IHN5c3RlbSBpcyBhIHJlbGlhYmxlIGhhbmQtb2ZmLCBhbmQgdGhlc2UgdHdvXG4gKiBmbG93cyBhcmUgaXQ6XG4gKlxuICogICAtIGBiaWxsaW5nX2hhbmRvZmZfY2xvc2VkX3dvbmAgICAgICAgICAgXHUyMDE0IGFuIG9wcG9ydHVuaXR5IEVOVEVSUyBgY2xvc2VkX3dvbmBcbiAqICAgICAoYHNyYy9zYWxlcy9mbG93cy9iaWxsaW5nLWhhbmRvZmYtY2xvc2VkLXdvbi5mbG93LnRzYClcbiAqICAgLSBgYmlsbGluZ19oYW5kb2ZmX2NvbnRyYWN0X2FjdGl2YXRlZGAgIFx1MjAxNCBhIGNvbnRyYWN0IEVOVEVSUyBgYWN0aXZhdGVkYFxuICogICAgICh0aGlzIGZpbGU7IGBjcm1fY29udHJhY3RgIGlzIHRoZSByZXZlbnVlIHBhY2thZ2UncyBvYmplY3QpXG4gKlxuICogRWFjaCBQT1NUcyBvbmUgSlNPTiBkb2N1bWVudCBcdTIwMTQgdGhlIHJlY29yZCwgaXRzIGFjY291bnQsIGFuZCBpdHMgbGluZSBpdGVtcyBcdTIwMTRcbiAqIHRvIHtAbGluayBCSUxMSU5HX0hBTkRPRkZfRU5EUE9JTlR9LCB0aHJvdWdoIHRoZSBwbGF0Zm9ybSdzICoqZHVyYWJsZSBIVFRQXG4gKiBvdXRib3gqKjogdGhlIGBodHRwYCBub2RlIHdpdGggYGR1cmFibGU6IHRydWVgIGNhbGxzXG4gKiBgbWVzc2FnaW5nLmVucXVldWVIdHRwKHsgc291cmNlOiAnZmxvdycsIFx1MjAyNiB9KWAsIHdoaWNoIHBlcnNpc3RzIGFcbiAqIGBzeXNfaHR0cF9kZWxpdmVyeWAgcm93IHRoYXQgdGhlIEhUVFAgZGlzcGF0Y2hlciBkcmFpbnMgd2l0aCByZXRyeSwgYmFja29mZlxuICogYW5kIGRlYWQtbGV0dGVyaW5nLCBzaWduaW5nIHRoZSBib2R5IHdpdGggSE1BQy1TSEEyNTYgd2hlbiBhIHNlY3JldCBpcyBzZXQuXG4gKiBOb3RoaW5nIGhlcmUgaXMgY3VzdG9tIHBsdW1iaW5nOyBpdCBpcyB0aGUgcGxhdGZvcm0ncyBvd24gb3V0Ym91bmQtY2FsbG91dFxuICogdmVyYiwgb24gdGhlIHNhbWUgb3V0Ym94IHRoZSBkZWNsYXJhdGl2ZSBgd2ViaG9va3NgIHN1cmZhY2UgdXNlcy5cbiAqXG4gKiAjIyBcdTI2RDQgRG8gbm90IHJlLWV4cHJlc3MgdGhlc2UgYXMgZGVjbGFyZWQgYHdlYmhvb2tzYFxuICpcbiAqIE1lYXN1cmVkIG9uIDE3LjAuMC1yYy42LCB0aGF0IHN1cmZhY2UgY2Fubm90IGV4cHJlc3MgZWl0aGVyIGV2ZW50OlxuICogYFdlYmhvb2tTY2hlbWFgIGlzIGAuc3RyaWN0YCBhbmQgcmVqZWN0cyBgY29uZGl0aW9uYCAvIGBmaWx0ZXJgIC8gYGJvZHlgIC9cbiAqIGBwYXlsb2FkRmllbGRzYCAvIGByZXRyeVBvbGljeWA7IGl0cyBgdHJpZ2dlcnNgIHZvY2FidWxhcnkgaXNcbiAqIGBjcmVhdGUgLyB1cGRhdGUgLyBkZWxldGUgLyBidWxrXypgIHdpdGggbm8gdHJhbnNpdGlvbiBmb3JtOyBhbmQgdGhlXG4gKiBhdXRvLWVucXVldWVyIG1hdGNoZXMgb24gb2JqZWN0ICsgdHJpZ2dlciBhbG9uZSBhbmQgZGVsaXZlcnMgYSBmaXhlZFxuICogYERhdGFFdmVudGAgZW52ZWxvcGUgY2FycnlpbmcgbmVpdGhlciB0aGUgYWNjb3VudCBub3IgdGhlIGxpbmUgaXRlbXMuIEFcbiAqIGBzeXNfd2ViaG9va2Agcm93IG5hbWVkIGZvciBjbG9zZWQtd29uIHdvdWxkIGZpcmUgb24gKmV2ZXJ5KiBvcHBvcnR1bml0eSBlZGl0XG4gKiBcdTIwMTQgYSBkZWNsYXJhdGlvbiB0aGF0IGxpZXMgYWJvdXQgaXRzZWxmLCBpbiB0aGUgYXBwIG90aGVyIHBlb3BsZSBjb3B5LlxuICogRGlzcGF0Y2ggdGhlcmUgaXMgYWRkaXRpb25hbGx5IGdhdGVkIG9uIHRoZSBgcmVhbHRpbWVgIGNhcGFiaWxpdHksIHdoaWNoIHRoaXNcbiAqIGFwcCBkb2VzIG5vdCByZXF1aXJlLCBzbyBzdWNoIGEgcm93IHdvdWxkIGJlIHZpc2libGUgaW4gU2V0dXAgYW5kIG5ldmVyIGZpcmVcbiAqIGF0IGFsbC5cbiAqXG4gKiBUaGUgY29zdCBvZiB0aGlzIHJvdXRlIGlzIHN0YXRlZCBpbiBgX2JpbGxpbmctZW5kcG9pbnQudHNgIGFuZCBpblxuICogYGNvbnRlbnQvZG9jcy9yZXZlbnVlL2JpbGxpbmctaGFuZG9mZi5tZHhgOiB0aGUgZW5kcG9pbnQgYW5kIHNlY3JldCBsaXZlIGluXG4gKiBmbG93IG1ldGFkYXRhLCBzbyByZXBvaW50aW5nIHRoZW0gaXMgYSByZWJ1aWxkLCBub3QgYSBTZXR1cCBlZGl0LlxuICpcbiAqICMjIEV4YWN0bHkgb25jZSBwZXIgdHJhbnNpdGlvbiwgbm90IG9uY2UgcGVyIGVkaXRcbiAqXG4gKiBcdTI2RDQgQm90aCBzdGFydCBjb25kaXRpb25zIG11c3QgdGVzdCB0aGUgVFJBTlNJVElPTlxuICogKGByZWNvcmQueCA9PSB2ICYmIHByZXZpb3VzLnggIT0gdmApLCBuZXZlciB0aGUgY3VycmVudCB2YWx1ZS4gVGhpcyBpcyB0aGVcbiAqIGlkaW9tIGBvcHBvcnR1bml0eV93b25fYWxlcnRgIHVzZXMgb24gdGhpcyB2ZXJ5IG9iamVjdDogd2l0aG91dCB0aGVcbiAqIGBwcmV2aW91cy4qYCB0ZXJtLCBldmVyeSBsYXRlciBlZGl0IG9mIGEgd29uIGRlYWwgXHUyMDE0IGEgc2VlZC1vd25lcnNoaXBcbiAqIGNsYWltLCBhbiBhcHByb3ZhbCBzdGFtcCwgYSBkZXNjcmlwdGlvbiB0d2VhayBcdTIwMTQgcmUtZmlyZXMgdGhlIGZsb3cuIEZvciBhXG4gKiBjb25ncmF0dWxhdGlvbnMgbm90aWZpY2F0aW9uIHRoYXQgaXMgbm9pc2U7IGZvciBhIGJpbGxpbmcgaGFuZC1vZmYgaXQgaXMgYVxuICogZHVwbGljYXRlIG9yZGVyLiBgcHJldmlvdXMuKmAgaXMgZ3VhcmRlZCBGQUlMLUNMT1NFRCAoYGhhcyhwcmV2aW91cy54KSAmJmApXG4gKiBmb3IgdGhlIHNhbWUgcmVhc29uIGl0IGlzIHRoZXJlOiB3aGVuIHRoZSBlbmdpbmUgY2Fubm90IHNlZSB0aGUgcHJpb3IgdmFsdWVcbiAqIGl0IGNhbm5vdCBzZWUgYSB0cmFuc2l0aW9uIGVpdGhlciwgYW5kIG11c3Qgbm90IGNsYWltIG9uZS4gVGhlIHNoYXBlIHRoYXRcbiAqIGNvdmVycyBpcyBhIGJ1bGsgYHVwZGF0ZU1hbnlgLCB3aGVyZSBPYmplY3RRTCByZWFkcyBubyBwcmlvciByb3cgYW5kXG4gKiBgcHJldmlvdXNgIGFycml2ZXMgbnVsbCBcdTIwMTQgb25lIGhhbmQtb2ZmIHBlciByb3cgb2YgYSBidWxrIHVwZGF0ZSBpcyBleGFjdGx5XG4gKiB3aGF0IG5vYm9keSB3YW50cy5cbiAqXG4gKiBEZWxpdmVyeSBpdHNlbGYgaXMgKiphdC1sZWFzdC1vbmNlKio6IHRoZSBvdXRib3ggcmV0cmllcyBhIGZhaWxlZCBhdHRlbXB0LFxuICogYW5kIGV2ZXJ5IGF0dGVtcHQgb2Ygb25lIGVucXVldWVkIHJvdyBjYXJyaWVzIHRoZSBzYW1lIGBYLU9iamVjdHN0YWNrLURlbGl2ZXJ5YFxuICogaWQuIFJlY2VpdmVycyBkZWR1cGUgb24gdGhhdCBoZWFkZXIuXG4gKlxuICogIyMgVG90YWxpdHlcbiAqXG4gKiBFdmVyeSBgcmVjb3JkLipgIC8gYHByZXZpb3VzLipgIHJlYWQgYmVsb3cgY2FycmllcyBhIGBoYXMoLi4uKWAgZ3VhcmQgXHUyMDE0IHRoZVxuICogaG91c2UgcnVsZSBgdGVzdC9mbG93LWNvbmRpdGlvbi10b3RhbGl0eS50ZXN0LnRzYCBlbmZvcmNlcywgYmVjYXVzZSBhIGZsb3dcbiAqIGNvbmRpdGlvbiB0aGF0IGFib3J0cyBmYWlscyB0aGUgd2hvbGUgcnVuIHJhdGhlciB0aGFuIHlpZWxkaW5nIGBmYWxzZWAuXG4gKi9cblxuLyoqXG4gKiBcdTI1MDBcdTI1MDAgRXZlbnQgMjogY29udHJhY3QgZW50ZXJzIGBhY3RpdmF0ZWRgIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICpcbiAqIE5CIHRoZSB2YWx1ZSBpcyBgYWN0aXZhdGVkYC4gYGNybV9jb250cmFjdC5zdGF0dXNgIGhhcyBubyBgYWN0aXZlYCBtZW1iZXIgXHUyMDE0XG4gKiB0aGUgb3B0aW9ucyBhcmUgYGRyYWZ0IC8gaW5fYXBwcm92YWwgLyBhY3RpdmF0ZWQgLyBleHBpcmVkIC8gdGVybWluYXRlZGAsXG4gKiBnb3Zlcm5lZCBieSB0aGUgYGNvbnRyYWN0X3N0YXR1c19wcm9ncmVzc2lvbmAgc3RhdGUgbWFjaGluZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEJpbGxpbmdIYW5kb2ZmQ29udHJhY3RBY3RpdmF0ZWRGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnYmlsbGluZ19oYW5kb2ZmX2NvbnRyYWN0X2FjdGl2YXRlZCcsXG4gIGxhYmVsOiAnQmlsbGluZyBIYW5kLW9mZjogQ29udHJhY3QgQWN0aXZhdGVkJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ09uIHRoZSB0cmFuc2l0aW9uIGludG8gYWN0aXZhdGVkOiBQT1NUIHRoZSBjb250cmFjdCwgaXRzIGFjY291bnQgYW5kIHRoZSBvcmlnaW5hdGluZyBkZWFsXHUyMDE5cyBsaW5lIGl0ZW1zIHRvIHRoZSBiaWxsaW5nIGVuZHBvaW50IHZpYSB0aGUgZHVyYWJsZSBIVFRQIG91dGJveC4nLFxuICB0eXBlOiAncmVjb3JkX2NoYW5nZScsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG4gIC8vIENvbnRyYWN0cyBhcmUgYWN0aXZhdGVkIGJ5IG1hY2hpbmVyeSBhcyB3ZWxsIGFzIGJ5IGhhbmQgXHUyMDE0IGBjb250cmFjdC5ob29rLnRzYFxuICAvLyBzdGFtcHMgdGhlIGFjY291bnQgcHJvbW90aW9uIGFuZCBzaWduZWQgZGF0ZSBvbiB0aGF0IHNhbWUgdHJhbnNpdGlvbiwgYW5kXG4gIC8vIHRoZSByZW5ld2FsIHN3ZWVwIHJ1bnMgYHJ1bkFzOiAnc3lzdGVtJ2AuIEEgc3lzdGVtIHdyaXRlIGNhcnJpZXMgbm8gdHJpZ2dlclxuICAvLyB1c2VyLCBzbyB1bmRlciB0aGUgZGVmYXVsdCBgcnVuQXM6ICd1c2VyJ2AgdGhpcyBmbG93J3MgdHdvIHJlYWRzIHdvdWxkIGJlXG4gIC8vIHJlZnVzZWQgb24gZXhhY3RseSB0aG9zZSBydW5zIGFuZCB0aGUgaGFuZC1vZmYgd291bGQgZGlzYXBwZWFyIHdpdGhvdXQgYVxuICAvLyBmYWlsZWQgc3RlcC4gRWxldmF0aW9uIGFsc28gZ3VhcmFudGVlcyB0aGUgcGF5bG9hZCBpcyB0aGUgd2hvbGUgY29udHJhY3QsXG4gIC8vIG5vdCBhbiBSTFMtbmFycm93ZWQgdmlldyBvZiBpdC5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICB2YXJpYWJsZXM6IFtcbiAgICAvLyBCb3VuZCB3aXRoIGEgZGVmYXVsdCBiZWNhdXNlIHRoZSBsaW5lLWl0ZW0gcmVhZCBiZWxvdyBpcyBDT05ESVRJT05BTDogYVxuICAgIC8vIGNvbnRyYWN0IG5lZWQgbm90IGhhdmUgYW4gb3JpZ2luYXRpbmcgb3Bwb3J0dW5pdHkuIFdpdGhvdXQgdGhlIGRlZmF1bHQsXG4gICAgLy8gdGhlIHNraXBwZWQgcGF0aCBsZWF2ZXMgYGJpbGxpbmdMaW5lSXRlbXNgIHVuYm91bmQgYW5kIHRoZSBwYXlsb2FkIGtleVxuICAgIC8vIHZhbmlzaGVzIFx1MjAxNCBzbyBhIHJlY2VpdmVyIGNvdWxkIG5vdCB0ZWxsIFwibm8gaXRlbXNcIiBmcm9tIFwibm90IHNlbnRcIi5cbiAgICB7IG5hbWU6ICdiaWxsaW5nTGluZUl0ZW1zJywgdHlwZTogJ2NvbGxlY3Rpb24nLCBpc0lucHV0OiBmYWxzZSwgaXNPdXRwdXQ6IGZhbHNlLCBkZWZhdWx0VmFsdWU6IFtdIH0sXG4gIF0sXG4gIG5vZGVzOiBbXG4gICAge1xuICAgICAgaWQ6ICdzdGFydCcsXG4gICAgICB0eXBlOiAnc3RhcnQnLFxuICAgICAgbGFiZWw6ICdTdGFydCAoY29udHJhY3QgdXBkYXRlZCknLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fY29udHJhY3QnLFxuICAgICAgICB0cmlnZ2VyVHlwZTogJ3JlY29yZC1hZnRlci11cGRhdGUnLFxuICAgICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5zdGF0dXMpICYmIHJlY29yZC5zdGF0dXMgPT0gXCJhY3RpdmF0ZWRcIlxuICAgICAgICAgICYmIGhhcyhwcmV2aW91cy5zdGF0dXMpICYmIHByZXZpb3VzLnN0YXR1cyAhPSBcImFjdGl2YXRlZFwiYCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsb2FkQWNjb3VudE5vZGUoKSxcbiAgICB7XG4gICAgICBpZDogJ2xvYWRfbGluZV9pdGVtcycsXG4gICAgICB0eXBlOiAnZ2V0X3JlY29yZCcsXG4gICAgICBsYWJlbDogJ0xvYWQgT3JpZ2luYXRpbmcgRGVhbFx1MjAxOXMgTGluZSBJdGVtcycsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eV9saW5lX2l0ZW0nLFxuICAgICAgICAvLyBDb250cmFjdHMgY2Fycnkgbm8gbGluZSBpdGVtcyBvZiB0aGVpciBvd247IHdoYXQgd2FzIHNvbGQgc2l0cyBvbiB0aGVcbiAgICAgICAgLy8gb3Bwb3J0dW5pdHkgdGhlIGNvbnRyYWN0IGNhbWUgZnJvbS4gUmVhY2hlZCBvbmx5IHZpYSB0aGUgZ3VhcmRlZCBlZGdlXG4gICAgICAgIC8vIGJlbG93LCBiZWNhdXNlIGBjcm1fb3Bwb3J0dW5pdHlgIGlzIE9QVElPTkFMIG9uIGEgY29udHJhY3QgYW5kIGFcbiAgICAgICAgLy8gZmlsdGVyIG9wZXJhbmQgdGhhdCBldmFsdWF0ZXMgdG8gbnVsbCBtYWtlcyBgZ2V0X3JlY29yZGAgcmVmdXNlIHRoZVxuICAgICAgICAvLyBzdGVwIChhbiBhYnNlbnQgY29uZGl0aW9uIHdpZGVucyBhIHF1ZXJ5IHJhdGhlciB0aGFuIG5hcnJvd2luZyBpdCkuXG4gICAgICAgIGZpbHRlcjogeyBjcm1fb3Bwb3J0dW5pdHk6IGNlbGByZWNvcmQuY3JtX29wcG9ydHVuaXR5YCB9LFxuICAgICAgICBmaWVsZHM6IExJTkVfSVRFTV9GSUVMRFMsXG4gICAgICAgIGxpbWl0OiBCSUxMSU5HX0hBTkRPRkZfTElORV9JVEVNX0xJTUlULFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2JpbGxpbmdMaW5lSXRlbXMnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnc2VuZF9jb250cmFjdF9hY3RpdmF0ZWRfaGFuZG9mZicsXG4gICAgICB0eXBlOiAnaHR0cCcsXG4gICAgICBsYWJlbDogJ0VucXVldWUgQmlsbGluZyBIYW5kLW9mZicsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgdXJsOiBCSUxMSU5HX0hBTkRPRkZfRU5EUE9JTlQsXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBkdXJhYmxlOiB0cnVlLFxuICAgICAgICB0aW1lb3V0TXM6IEJJTExJTkdfSEFORE9GRl9USU1FT1VUX01TLFxuICAgICAgICBzaWduaW5nU2VjcmV0OiBCSUxMSU5HX0hBTkRPRkZfU0lHTklOR19TRUNSRVQsXG4gICAgICAgIC8vIE9uZSBlbnZlbG9wZSBidWlsZGluZyB0aGUgd2hvbGUgcGF5bG9hZCAoc2VlIGBiaWxsaW5nQm9keWApLiBUaGlzXG4gICAgICAgIC8vIGZsb3cgaXMgdGhlIGNvbnN1bWVyIG9mIGBiaWxsaW5nX2ZyZXF1ZW5jeWAgYW5kIGBwYXltZW50X3Rlcm1zYDogdGhleVxuICAgICAgICAvLyBhcmUgd2hhdCB0aGUgYmlsbGluZyBzeXN0ZW0gbmVlZHMgdG8gcmFpc2UgdGhlIHNjaGVkdWxlIEhvdENSTVxuICAgICAgICAvLyBkZWxpYmVyYXRlbHkgZG9lcyBub3QgbW9kZWwuXG4gICAgICAgIGJvZHk6IGJpbGxpbmdCb2R5KEJJTExJTkdfSEFORE9GRl9FVkVOVC5jb250cmFjdEFjdGl2YXRlZCwgJ2NvbnRyYWN0JywgW1xuICAgICAgICAgICdpZCcsICdjb250cmFjdF9udW1iZXInLCAnc3RhdHVzJywgJ2NvbnRyYWN0X3R5cGUnLCAnc3RhcnRfZGF0ZScsICdlbmRfZGF0ZScsICdjb250cmFjdF90ZXJtX21vbnRocycsXG4gICAgICAgICAgJ2NvbnRyYWN0X3ZhbHVlJywgJ2JpbGxpbmdfZnJlcXVlbmN5JywgJ3BheW1lbnRfdGVybXMnLCAnYXV0b19yZW5ld2FsJywgJ3NpZ25lZF9kYXRlJyxcbiAgICAgICAgICBbJ2FjY291bnRfaWQnLCAnY3JtX2FjY291bnQnXSwgWydvcHBvcnR1bml0eV9pZCcsICdjcm1fb3Bwb3J0dW5pdHknXSwgJ293bmVyX2lkJyxcbiAgICAgICAgXSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ2xvYWRfYWNjb3VudCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIC8vIFRoZSB0d28gZWRnZXMgYmVsb3cgYXJlIENPTVBMRU1FTlRBUlkgQ09ORElUSU9OQUxTIG9uIGEgcGxhaW4gZGF0YSBub2RlLFxuICAgIC8vIGRlbGliZXJhdGVseSBub3QgYSBgZGVjaXNpb25gIGdhdGV3YXkuIEEgZGVjaXNpb24gd2l0aCBubyBkZWNsYXJlZFxuICAgIC8vIGBjb25maWcuY29uZGl0aW9uc2AgcmVwb3J0cyB0aGUgZW5naW5lJ3MgYGRlZmF1bHRgIGJyYW5jaCBsYWJlbCwgYW5kXG4gICAgLy8gdHJhdmVyc2FsIHRoZW4gbmFycm93cyB0aGUgZWRnZSBzZXQgdG8gb3V0LWVkZ2VzIGNsYWltaW5nIHRoYXQgbGFiZWwgXHUyMDE0XG4gICAgLy8gYW4gYGlzRGVmYXVsdDogdHJ1ZWAgc2libGluZyB3b3VsZCBzd2FsbG93IHRoZSB3aG9sZSBicmFuY2ggYW5kIHRoZVxuICAgIC8vIGNvbmRpdGlvbmFsIGVkZ2Ugd291bGQgbmV2ZXIgYmUgZXZhbHVhdGVkLiBDb21wbGVtZW50YXJ5IGNvbmRpdGlvbnMgb2ZmIGFcbiAgICAvLyBub24tYnJhbmNoaW5nIG5vZGUgYXJlIGV2YWx1YXRlZCBvbmUgYnkgb25lLCB3aGljaCBpcyB0aGUgYmVoYXZpb3VyIHRoaXNcbiAgICAvLyBuZWVkcy5cbiAgICB7XG4gICAgICBpZDogJ2UyJyxcbiAgICAgIHNvdXJjZTogJ2xvYWRfYWNjb3VudCcsXG4gICAgICB0YXJnZXQ6ICdsb2FkX2xpbmVfaXRlbXMnLFxuICAgICAgdHlwZTogJ2NvbmRpdGlvbmFsJyxcbiAgICAgIGxhYmVsOiAnSGFzIG9yaWdpbmF0aW5nIGRlYWwnLFxuICAgICAgY29uZGl0aW9uOiBQYGhhcyhyZWNvcmQuY3JtX29wcG9ydHVuaXR5KSAmJiByZWNvcmQuY3JtX29wcG9ydHVuaXR5ICE9IG51bGxgLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdlMycsXG4gICAgICBzb3VyY2U6ICdsb2FkX2FjY291bnQnLFxuICAgICAgdGFyZ2V0OiAnc2VuZF9jb250cmFjdF9hY3RpdmF0ZWRfaGFuZG9mZicsXG4gICAgICB0eXBlOiAnY29uZGl0aW9uYWwnLFxuICAgICAgbGFiZWw6ICdObyBvcmlnaW5hdGluZyBkZWFsJyxcbiAgICAgIGNvbmRpdGlvbjogUGAhaGFzKHJlY29yZC5jcm1fb3Bwb3J0dW5pdHkpIHx8IHJlY29yZC5jcm1fb3Bwb3J0dW5pdHkgPT0gbnVsbGAsXG4gICAgfSxcbiAgICB7IGlkOiAnZTQnLCBzb3VyY2U6ICdsb2FkX2xpbmVfaXRlbXMnLCB0YXJnZXQ6ICdzZW5kX2NvbnRyYWN0X2FjdGl2YXRlZF9oYW5kb2ZmJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U1Jywgc291cmNlOiAnc2VuZF9jb250cmFjdF9hY3RpdmF0ZWRfaGFuZG9mZicsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9mbG93cy9jYW1wYWlnbi1lbnJvbGxtZW50LmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9mbG93cy9jYW1wYWlnbi1lbnJvbGxtZW50LmZsb3cudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IFAsIGNlbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcbmltcG9ydCB7IGd1YXJkZWQgfSBmcm9tICcuLi8uLi9zYWxlcy9mbG93cy9fZ3VhcmRlZC1pdGVyYXRpb24nO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIENhbXBhaWduIEVucm9sbG1lbnQgXHUyMDE0IHNjcmVlbiBmbG93IHRvIGJ1bGstZW5yb2xsIGxlYWRzIE9SIGNvbnRhY3RzIGludG8gYVxuICogY2FtcGFpZ24uXG4gKlxuICogTGF1bmNoZWQgZnJvbSB0aGUgXCJFbnJvbGwgTWVtYmVyc1wiIGFjdGlvbiBvbiBhIGNhbXBhaWduIHJlY29yZC4gXHUyNkQ0IE5ldmVyIHR1cm5cbiAqIHRoaXMgaW50byBhIGBzY2hlZHVsZWAgZmxvdzogYSBjcm9uIGZpcmluZyBzZWVkcyBOTyBpbnB1dCB2YXJpYWJsZXMgXHUyMDE0IG9ubHkgdGhlXG4gKiBjb25zb2xlJ3MgZmxvdy1hY3Rpb24gdHJpZ2dlciBkb2VzIChjZi4gbGVhZF9jb252ZXJzaW9uKSBcdTIwMTQgc28gYHJlY29yZElkYCBhbmRcbiAqIHRoZSBzZWdtZW50IGZpZWxkcyBhcnJpdmUgdW5kZWZpbmVkLCBhbmQgdGhlIHJ1biBlaXRoZXIgbWF0Y2hlcyBubyBjYW1wYWlnbiBvclxuICogbWFzcy1lbnJvbGxzIGV2ZXJ5IG9wZW4gbGVhZCBpbnRvIGEgbnVsbCBjYW1wYWlnbi5cbiAqXG4gKiBUaGUgY29udGFjdCBicmFuY2ggbWlycm9ycyB0aGUgbGVhZCBicmFuY2ggcmF0aGVyIHRoYW4gYmVpbmcgYSBzZWNvbmQgZGlhbGVjdDpcbiAqIHNhbWUgb3Blbi1jYW1wYWlnbiBnYXRlLCBzYW1lIGVsaWdpYmlsaXR5IHNoYXBlLCBzYW1lIHBlci1tZW1iZXIgZGVkdXBlLCBzYW1lXG4gKiBgc2VudGAgKyBgYWRkZWRfZGF0ZWAgc3RhbXAuIFNlZ21lbnRhdGlvbiBtaXJyb3JzIHRvbyBcdTIwMTQgbGVhZHMgYXJlIHNlZ21lbnRlZCBieVxuICogYHN0YXR1c2AgKHdoZXJlIHRoZXkgYXJlIGluIHF1YWxpZmljYXRpb24pOyBjb250YWN0cyBoYXZlIG5vIHN1Y2ggY29sdW1uLCBzb1xuICogdGhleSBhcmUgc2VnbWVudGVkIGJ5IGBkZXBhcnRtZW50YCwgdGhlIGZpZWxkIHRoYXQgYW5zd2VycyBcIndobyBpcyB0aGlzIHBlcnNvblxuICogYXQgdGhlIGFjY291bnRcIiwgd2hpY2ggaXMgd2hhdCBhIGNhbXBhaWduIHRhcmdldGluZyBhbiBleGlzdGluZyBjdXN0b21lciBiYXNlXG4gKiBzZWxlY3RzIG9uLlxuICpcbiAqIEVsaWdpYmlsaXR5LCBib3RoIHNpZGVzOiBoYXMgYW4gZW1haWwsIGFuZCBpcyBub3Qgb3B0ZWQgb3V0IG9mIGVtYWlsOyBsZWFkc1xuICogYWRkaXRpb25hbGx5IG11c3Qgbm90IGFscmVhZHkgYmUgY29udmVydGVkIChhIGNvbnZlcnRlZCBsZWFkIGlzIG5vdyBhIGNvbnRhY3QsXG4gKiBhbmQgd291bGQgb3RoZXJ3aXNlIGJlIGVucm9sbGFibGUgdGhyb3VnaCBib3RoIGJyYW5jaGVzIGFzIHR3byBwZW9wbGUpLlxuICogQWxyZWFkeS1lbnJvbGxlZCBwZW9wbGUgYXJlIHNraXBwZWQsIHNvIHJlLXJ1bm5pbmcgdGhlIGFjdGlvbiB0b3BzIHVwIHJhdGhlclxuICogdGhhbiBkdXBsaWNhdGluZy5cbiAqXG4gKiBcdTI2RDQgVGhpcyBmbG93IGRvZXMgTk9UIHdyaXRlIHRoZSBjYW1wYWlnbiBtZXRyaWMgcm9sbHVwcyAoYG51bV9zZW50YCBldGMuKSBcdTIwMTRcbiAqIHRoZSBjYW1wYWlnbiBtZXRyaWMgaG9va3Mgb3duIHRoZW0gYW5kIHJlZnJlc2ggb24gZXZlcnkgbWVtYmVyc2hpcCBjaGFuZ2UuIEFcbiAqIHBlci1ydW4gYG51bV9zZW50ID0ge2xlYWRMaXN0Lmxlbmd0aH1gIG92ZXJ3cml0ZSBoZXJlIGNsb2JiZXJzIHByaW9yIGJhdGNoZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBDYW1wYWlnbkVucm9sbG1lbnRGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnY2FtcGFpZ25fZW5yb2xsbWVudCcsXG4gIGxhYmVsOiAnRW5yb2xsIE1lbWJlcnMgaW4gQ2FtcGFpZ24nLFxuICBkZXNjcmlwdGlvbjogJ0J1bGsgZW5yb2xsIGVsaWdpYmxlIGxlYWRzIG9yIGNvbnRhY3RzIGludG8gdGhpcyBjYW1wYWlnbiAoc2tpcHMgYWxyZWFkeS1lbnJvbGxlZCBhbmQgb3B0ZWQtb3V0IHBlb3BsZSkuJyxcbiAgdHlwZTogJ3NjcmVlbicsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG5cbiAgdmFyaWFibGVzOiBbXG4gICAgLy8gYHJlY29yZElkYCBtYXRjaGVzIHRoZSBjb25zb2xlJ3MgZmxvdy1hY3Rpb24gdHJpZ2dlciBjb250cmFjdFxuICAgIC8vICh7IHJlY29yZElkLCBvYmplY3ROYW1lIH0pIFx1MjAxNCBjZi4gbGVhZF9jb252ZXJzaW9uIC8gcXVvdGVfZ2VuZXJhdGlvbi5cbiAgICB7IG5hbWU6ICdyZWNvcmRJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgLyoqXG4gICAgICogYG1lbWJlclNvdXJjZWAgaXMgQk9VTkQgQlkgVEhJUyBERUNMQVJBVElPTiBcdTIwMTQgbm90IGJ5IGEgc2VlZGluZyBub2RlLlxuICAgICAqXG4gICAgICogQm90aCBicmFuY2ggZWRnZXMgKGBlNGAgLyBgZTdgKSByZWFkIGB2YXJzLm1lbWJlclNvdXJjZWAsIHNvIGl0IG11c3QgYmVcbiAgICAgKiBib3VuZCBvbiBldmVyeSBwYXRoIHJlYWNoaW5nIHRoZW0uIGBGbG93VmFyaWFibGVTY2hlbWFgIGNhcnJpZXNcbiAgICAgKiBgZGVmYXVsdFZhbHVlYCBhbmQgdGhlIGVuZ2luZSBzZWVkcyBpdCBiZWZvcmUgdGhlIHN0YXJ0IG5vZGUgcnVucywgc28gdGhpc1xuICAgICAqIGtleSBhbG9uZSBiaW5kcyB0aGUgbmFtZSBcdTIwMTQgd2hpbGUgYSBjYWxsZXItc3VwcGxpZWRcbiAgICAgKiBgY29udGV4dC5wYXJhbXMubWVtYmVyU291cmNlYCBzdGlsbCBXSU5TIG92ZXIgaXQuXG4gICAgICpcbiAgICAgKiBcdTI2QTBcdUZFMEYgTWVhc3VyZWQgb24gdGhlIDE3LjEuMCBzcGVjLCB3aXRoIHRoZSBzY2hlbWEga2V5IHJlLWNoZWNrZWQgb24gMTcuMi4wLlxuICAgICAqIE5laXRoZXIgdGhhdCBrZXkgbm9yIHRoZSBzZWVkaW5nIGJlaGF2aW91ciB3YXMgcmUtY2hlY2tlZCBvbiAxNy4zLjAgb3JcbiAgICAgKiAxNy40LjAgKFBSICMxODE0LCAjMTgwNyksIG5vciBvbiAxNy41LjAsIDE3LjYuMCwgMTcuNy4wIG9yIDE4LjAuMC1uZXh0LjAgKHRoZSBwaW4gc2luY2UgIzIwMzEpLlxuICAgICAqXG4gICAgICogXHUyNkQ0IE5ldmVyIHNlZWQgdGhpcyB3aXRoIGFuIGFzc2lnbm1lbnQgbm9kZSBpbnN0ZWFkLiBBbiBhc3NpZ25tZW50IGlzXG4gICAgICogdW5jb25kaXRpb25hbCwgc28gaXQgQ0xPQkJFUlMgYSBzdXBwbGllZCBwYXJhbSBcdTIwMTQgbWVhc3VyZWQ6IGxhdW5jaGluZyB3aXRoXG4gICAgICogYHBhcmFtcy5tZW1iZXJTb3VyY2UgPSAnY29udGFjdHMnYCByYW4gdGhlIExFQUQgYnJhbmNoLiBJdCBhbHNvIHJlc3RhdGVzIGFcbiAgICAgKiBkZWZhdWx0IHRoZSBzY3JlZW4gZmllbGQgY2Fycmllcywgd2l0aCBub3RoaW5nIGtlZXBpbmcgdGhlIHR3byBpbiBzdGVwLlxuICAgICAqXG4gICAgICogQSBzZWNvbmQsIGluZGVwZW5kZW50IHJlYXNvbiBubyBzZWVkaW5nIG5vZGUgaXMgbmVlZGVkIGhlcmU6IHRoZVxuICAgICAqIGBtZW1iZXJTb3VyY2VgIHNjcmVlbiBmaWVsZCBiZWxvdyBpcyBgcmVxdWlyZWQ6IHRydWVgLCBhbmQgc2luY2VcbiAgICAgKiAxNy4wLjAtcmMuMiB0aGUgU0VSVkVSIGhvbGRzIGEgc2NyZWVuIHJlc3VtZSB0byB0aGUgZGVjbGFyZWQgZmllbGRcbiAgICAgKiBjb250cmFjdC4gQSByZXN1bWUgc2lnbmFsIG9taXR0aW5nIGBtZW1iZXJTb3VyY2VgIGlzIHJlZnVzZWQgd2l0aFxuICAgICAqIGBJTlZBTElEX1NDUkVFTl9JTlBVVGAgYW5kIHRoZSBydW4gc3RheXMgcGF1c2VkLCBzbyB0aGUgb3JkaW5hcnkgcmVzdW1lXG4gICAgICogcGF0aCBjYW5ub3QgcmVhY2ggYW4gdW5ib3VuZCByZWFkIGF0IGFsbCBcdTIwMTQgdW5saWtlIGBsZWFkX2NvbnZlcnNpb25gJ3NcbiAgICAgKiBjaGVja2JveCwgd2hpY2ggaXMgZGVsaWJlcmF0ZWx5IG5vdCBgcmVxdWlyZWRgIGFuZCB0aGVyZWZvcmUgaGFzIGFuXG4gICAgICogdW5hbnN3ZXJlZCBzdGF0ZS4gVGhlIG9uZSBwYXRoIHRoYXQgc2tpcHMgdGhhdCBjaGVjayBpcyBhIHJlc3VtZSBjYXJyeWluZ1xuICAgICAqIE5PIHNpZ25hbCBvYmplY3Q7IG1lYXN1cmVkIG9uIDE3LngsIGl0IGZhaWxzIG9uZSBub2RlIGxhdGVyIGF0XG4gICAgICogYHF1ZXJ5X2xlYWRzYCByZWdhcmRsZXNzIG9mIHRoaXMgYmluZGluZywgYmVjYXVzZSBgbGVhZFN0YXR1c2AgaXMgdW5ib3VuZFxuICAgICAqIGFuZCB0aGUgcXVlcnkgbmV2ZXIgcnVucyB3aWRlbmVkLiBTaW5jZSAxOC4wLjAtbmV4dC4wIHRoZSBmaWx0ZXIgb3BlcmFuZFxuICAgICAqIGlzIGEgQ0VMIGVudmVsb3BlLCBhbmQgYW4gdW5ib3VuZCB2YXJpYWJsZSBmYWlscyB0aGUgcnVuIGJlZm9yZSB0aGUgcXVlcnlcbiAgICAgKiAodGhlIHBsYXRmb3JtJ3MgYGZsb3ctdmFsdWUtc2xvdC10ZW1wbGF0ZS1kaWFsZWN0LXJlZnVzZWRgIGNvbnRyYWN0OyBub3RcbiAgICAgKiByZS1tZWFzdXJlZCBoZXJlKS5cbiAgICAgKlxuICAgICAqIFRoZSBsaXRlcmFsIGxpdmVzIEhFUkUgYW5kIG5vd2hlcmUgZWxzZTogdGhlIHNjcmVlbiBmaWVsZCBkZXJpdmVzIGl0c1xuICAgICAqIHByZWZpbGwgZnJvbSB0aGlzIHZhcmlhYmxlIChpdHMgYGRlZmF1bHRWYWx1ZWAgZW52ZWxvcGUgcmVhZHMgYG1lbWJlclNvdXJjZWApLlxuICAgICAqL1xuICAgIHsgbmFtZTogJ21lbWJlclNvdXJjZScsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlLCBkZWZhdWx0VmFsdWU6ICdsZWFkcycgfSxcbiAgICAvKipcbiAgICAgKiBgbGVhZFN0YXR1c2AgLyBgY29udGFjdERlcGFydG1lbnRgIGRlbGliZXJhdGVseSBjYXJyeSBOTyBgZGVmYXVsdFZhbHVlYCxcbiAgICAgKiBhbmQgdGhlIGFzeW1tZXRyeSB3aXRoIGBtZW1iZXJTb3VyY2VgIGlzIHRoZSBwb2ludC4gTm8gY29uZGl0aW9uIGluIHRoaXNcbiAgICAgKiBmbG93IHJlYWRzIGVpdGhlciBvbmUgXHUyMDE0IGVhY2ggaXMgYSBgZ2V0X3JlY29yZGAgYGZpbHRlcmAgb3BlcmFuZCBcdTIwMTQgc28gdGhlXG4gICAgICogYmluZGluZyBhbmFseXNpcyBpbiBgdGVzdC9mbG93LXZhcmlhYmxlLWNvbmRpdGlvbnMudGVzdC50c2AgZG9lcyBub3RcbiAgICAgKiBjb3ZlciB0aGVtLiBBbiB1bmJvdW5kIG9uZSBmYWlscyB0aGUgcnVuIGJlZm9yZSB0aGUgcXVlcnkgaXMgbWFkZSAodGhlXG4gICAgICogMTguMC4wLW5leHQuMCBmaWx0ZXItb3BlcmFuZCBjb250cmFjdCksIGJlY2F1c2UgYW4gYWJzZW50IGNvbmRpdGlvblxuICAgICAqIHdpZGVucyBhIHF1ZXJ5IGluc3RlYWQgb2YgbmFycm93aW5nIGl0LiBTZWVkaW5nIHRoZXNlIHR3byB3b3VsZCB0dXJuIHRoYXRcbiAgICAgKiBsb3VkIGZhaWx1cmUgaW50byBhIHNpbGVudCBlbnJvbG1lbnQgb2YgYSBzZWdtZW50IG5vYm9keSBjaG9zZTsgdGhlaXJcbiAgICAgKiBgcmVxdWlyZWQ6IHRydWVgIHNjcmVlbiBmaWVsZHMgYXJlIHdoYXQgc3VwcGx5IHRoZW0uXG4gICAgICovXG4gICAgeyBuYW1lOiAnbGVhZFN0YXR1cycsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAnY29udGFjdERlcGFydG1lbnQnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICBdLFxuXG4gIG5vZGVzOiBbXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCcsIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX2NhbXBhaWduJyB9IH0sXG4gICAge1xuICAgICAgaWQ6ICdzY3JlZW5fMScsIHR5cGU6ICdzY3JlZW4nLCBsYWJlbDogJ0Vucm9sbG1lbnQgQ3JpdGVyaWEnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vIFByZWZpbGwgREVSSVZFRCBmcm9tIHRoZSB2YXJpYWJsZSwgc28gdGhlIGRlZmF1bHQgaXMgd3JpdHRlblxuICAgICAgICAgICAgLy8gb25jZSAob24gdGhlIGRlY2xhcmF0aW9uKSByYXRoZXIgdGhhbiByZXN0YXRlZCBoZXJlIFx1MjAxNCB0aGVcbiAgICAgICAgICAgIC8vIHNpbmdsZS1hdXRob3JpdHkgZm9ybS4gVGhlIGVudmVsb3BlIGlzIGV2YWx1YXRlZCBiZWZvcmUgdGhlXG4gICAgICAgICAgICAvLyBzY3JlZW4gZ29lcyBvbiB0aGUgd2lyZSwgc28gdGhlIGNsaWVudCByZWNlaXZlcyB0aGUgcmF3IHZhbHVlLFxuICAgICAgICAgICAgLy8gdGhlIHN0cmluZyBgbGVhZHNgLCB3aGljaCBpcyB3aGF0IGEgbGl0ZXJhbFxuICAgICAgICAgICAgLy8gYGRlZmF1bHRWYWx1ZTogJ2xlYWRzJ2AgdXNlZCB0byBzZW5kLlxuICAgICAgICAgICAgbmFtZTogJ21lbWJlclNvdXJjZScsIGxhYmVsOiAnRW5yb2xsJywgdHlwZTogJ3NlbGVjdCcsIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBjZWxgbWVtYmVyU291cmNlYCxcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0xlYWRzJywgdmFsdWU6ICdsZWFkcycgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0NvbnRhY3RzJywgdmFsdWU6ICdjb250YWN0cycgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnbGVhZFN0YXR1cycsIGxhYmVsOiAnRW5yb2xsIGxlYWRzIGluIHN0YXR1cycsIHR5cGU6ICdzZWxlY3QnLCByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJ25ldycsXG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdOZXcnLCB2YWx1ZTogJ25ldycgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0NvbnRhY3RlZCcsIHZhbHVlOiAnY29udGFjdGVkJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnUXVhbGlmaWVkJywgdmFsdWU6ICdxdWFsaWZpZWQnIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gUmVxdWlyZWQsIGxpa2UgYGxlYWRTdGF0dXNgLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbjogYSBibGFua1xuICAgICAgICAgICAgLy8gc2VnbWVudCB3b3VsZCByZWFjaCB0aGUgZmlsdGVyIGFzIGFuIGVtcHR5IHN0cmluZyBhbmRcbiAgICAgICAgICAgIC8vIHNpbGVudGx5IG1hdGNoIHRoZSBjb250YWN0cyB3aXRoIE5PIGRlcGFydG1lbnQgcmF0aGVyIHRoYW4gYWxsIG9mXG4gICAgICAgICAgICAvLyB0aGVtLiBCb3RoIGJyYW5jaGVzIG1ha2UgdGhlIGNhbGxlciBuYW1lIGEgc2VnbWVudC5cbiAgICAgICAgICAgIG5hbWU6ICdjb250YWN0RGVwYXJ0bWVudCcsIGxhYmVsOiAnRW5yb2xsIGNvbnRhY3RzIGluIGRlcGFydG1lbnQnLFxuICAgICAgICAgICAgdHlwZTogJ3NlbGVjdCcsIHJlcXVpcmVkOiB0cnVlLCBkZWZhdWx0VmFsdWU6ICdleGVjdXRpdmUnLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnRXhlY3V0aXZlJywgdmFsdWU6ICdleGVjdXRpdmUnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdTYWxlcycsIHZhbHVlOiAnc2FsZXMnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdNYXJrZXRpbmcnLCB2YWx1ZTogJ21hcmtldGluZycgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0VuZ2luZWVyaW5nJywgdmFsdWU6ICdlbmdpbmVlcmluZycgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1N1cHBvcnQnLCB2YWx1ZTogJ3N1cHBvcnQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdGaW5hbmNlJywgdmFsdWU6ICdmaW5hbmNlJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnSHVtYW4gUmVzb3VyY2VzJywgdmFsdWU6ICdocicgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ09wZXJhdGlvbnMnLCB2YWx1ZTogJ29wZXJhdGlvbnMnIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdnZXRfY2FtcGFpZ24nLCB0eXBlOiAnZ2V0X3JlY29yZCcsIGxhYmVsOiAnR2V0IENhbXBhaWduJyxcbiAgICAgIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX2NhbXBhaWduJywgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkSWRgIH0sIG91dHB1dFZhcmlhYmxlOiAnY2FtcGFpZ25SZWNvcmQnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBUaGUgZ2F0ZSBpdHNlbGYgaXMgb24gZWRnZXMgYGU0YCAvIGBlN2AgXHUyMDE0IHNlZSB0aGUgbm90ZXMgdGhlcmUuIFRoaXMgbm9kZVxuICAgICAgLy8gY2FycmllcyBOTyBgY29uZmlnLmNvbmRpdGlvbmA6IHRoZSBrZXkgaXMgdGhlIHRyaWdnZXIgZ2F0ZSBvbiBhIGBzdGFydGBcbiAgICAgIC8vIG5vZGUgYW5kIGlzIHJlYWQgbm93aGVyZSBlbHNlLCBzbyBhIGNvcHkgaGVyZSB3b3VsZCBiZSBhIHNlY29uZCwgaW5lcnRcbiAgICAgIC8vIHN0YXRlbWVudCBvZiB0aGUgcHJlZGljYXRlIHRoYXQgbm8gcmVhZGVyIGNhbiB0ZWxsIGFwYXJ0IGZyb20gdGhlIGxpdmVcbiAgICAgIC8vIG9uZSAoZmxhZ2dlZCBieSBgZmxvdy1pbmVydC1ub2RlLWNvbmRpdGlvbmAgZnJvbSAxNy4wLjAtcmMuMikuXG4gICAgICBpZDogJ2NoZWNrX2NhbXBhaWduX29wZW4nLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0NhbXBhaWduIE9wZW4/JyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAncXVlcnlfbGVhZHMnLCB0eXBlOiAnZ2V0X3JlY29yZCcsIGxhYmVsOiAnRmluZCBFbGlnaWJsZSBMZWFkcycsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9sZWFkJyxcbiAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgc3RhdHVzOiBjZWxgbGVhZFN0YXR1c2AsXG4gICAgICAgICAgaXNfY29udmVydGVkOiBmYWxzZSxcbiAgICAgICAgICBlbWFpbDogeyAkbmU6IG51bGwgfSxcbiAgICAgICAgICAvLyBUaGlzIGlzIGVtYWlsLWNhbXBhaWduIGVucm9sbG1lbnQgXHUyMDE0IGhvbm91ciB0aGUgb3B0LW91dCBmbGFnLlxuICAgICAgICAgIC8vIGBjYW1wYWlnbl9tZW1iZXJfb3B0b3V0X3N5bmNgIHBvcHVsYXRlcyBpdDogYW4gdW5zdWJzY3JpYmVkIG1lbWJlclxuICAgICAgICAgIC8vIHJvdW5kLXRyaXBzIHRvIHRoZSBwZXJzb24ncyBgZW1haWxfb3B0X291dGAuXG4gICAgICAgICAgZW1haWxfb3B0X291dDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2xlYWRMaXN0JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2xvb3BfbGVhZHMnLCB0eXBlOiAnbG9vcCcsIGxhYmVsOiAnUHJvY2VzcyBFYWNoIExlYWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGNvbGxlY3Rpb246IGNlbGBsZWFkTGlzdGAsXG4gICAgICAgIGl0ZXJhdG9yVmFyaWFibGU6ICdjdXJyZW50TGVhZCcsXG4gICAgICAgIGJvZHk6IGd1YXJkZWQoJ2xlYWQnLCB7XG4gICAgICAgICAgbm9kZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gRGVkdXBlOiBza2lwIGxlYWRzIGFscmVhZHkgZW5yb2xsZWQgaW4gVEhJUyBjYW1wYWlnbiwgc28gYVxuICAgICAgICAgICAgICAvLyByZS1ydW4gdG9wcyB1cCBpbnN0ZWFkIG9mIGRvdWJsZS1lbnJvbGxpbmcgKGRvdWJsZSByb3dzXG4gICAgICAgICAgICAgIC8vIGluZmxhdGVkIG51bV9zZW50IC8gcmVzcG9uc2VfcmF0ZSkuXG4gICAgICAgICAgICAgIGlkOiAnZmluZF9leGlzdGluZ19tZW1iZXInLCB0eXBlOiAnZ2V0X3JlY29yZCcsIGxhYmVsOiAnQWxyZWFkeSBFbnJvbGxlZD8nLFxuICAgICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2NhbXBhaWduX21lbWJlcicsXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7IGNybV9jYW1wYWlnbjogY2VsYHJlY29yZElkYCwgY3JtX2xlYWQ6IGNlbGBjdXJyZW50TGVhZC5pZGAgfSxcbiAgICAgICAgICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2V4aXN0aW5nTWVtYmVyJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIEdhdGV3YXkgb25seSBcdTIwMTQgdGhlIHByZWRpY2F0ZSBsaXZlcyBvbiB0aGUgb3V0LWVkZ2UuXG4gICAgICAgICAgICAgIGlkOiAnY2hlY2tfbm90X2Vucm9sbGVkJywgdHlwZTogJ2RlY2lzaW9uJywgbGFiZWw6ICdOZXcgTWVtYmVyPycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBcdTJCNTAgVGhlIElOU0VSVCBpcyBlbGV2YXRlZCwgdGhpcyBmbG93IGlzIE5PVC4gYGFkZGVkX2RhdGVgIGlzXG4gICAgICAgICAgICAgIC8vIGByZWFkb25seTogdHJ1ZWAsIGFuZCBmcm9tIEBvYmplY3RzdGFjay9vYmplY3RxbCAxNy40LjAgdGhlXG4gICAgICAgICAgICAgIC8vIHJlYWRvbmx5IHN0cmlwIHJ1bnMgaW5zaWRlIGBlbmdpbmUuaW5zZXJ0YCBmb3IgYSBub24tc3lzdGVtXG4gICAgICAgICAgICAgIC8vIGNhbGxlciBhcyB3ZWxsIGFzIG9uIHVwZGF0ZSBcdTIwMTQgc28gYSB3cml0ZSBmcm9tIHRoaXMgc2NyZWVuXG4gICAgICAgICAgICAgIC8vIGZsb3cncyB1c2VyIGNvbnRleHQgbm93IGxvc2VzIHRoZSBzdGFtcC4gVGhlIHJlbWVkeSB0aGVcbiAgICAgICAgICAgICAgLy8gcGxhdGZvcm0gbmFtZXMgaXMgYSBzeXN0ZW0gY29udGV4dDsgdGhlIHJlbWVkeSBBR0VOVFMubWQgaG91c2VcbiAgICAgICAgICAgICAgLy8gcnVsZSA5IG5hbWVzIGlzIGEgZGVkaWNhdGVkIGBzeXN0ZW1gIHN1Yi1mbG93IHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgIC8vIGVsZXZhdGluZyB0aGUgc2NyZWVuIGZsb3cuIEJvdGggYXJlIHNhdGlzZmllZCBoZXJlLiBcdTI2RDQgRG8gbm90XG4gICAgICAgICAgICAgIC8vIGZvbGQgdGhpcyBiYWNrIGJ5IGdpdmluZyBUSElTIGZsb3cgYHJ1bkFzOiAnc3lzdGVtJ2A6IGl0IHdvdWxkXG4gICAgICAgICAgICAgIC8vIGFsc28gbGlmdCBSTFMgb2ZmIGBxdWVyeV9sZWFkc2AgLyBgcXVlcnlfY29udGFjdHNgLCBhbmRcbiAgICAgICAgICAgICAgLy8gYGNybV9sZWFkYCBpcyBgc2hhcmluZ01vZGVsOiAncHJpdmF0ZSdgLlxuICAgICAgICAgICAgICAvLyBTZWUgYHNyYy9tYXJrZXRpbmcvZmxvd3MvY2FtcGFpZ24tbWVtYmVyLWVucm9sbC5mbG93LnRzYC5cbiAgICAgICAgICAgICAgaWQ6ICdjcmVhdGVfY2FtcGFpZ25fbWVtYmVyJywgdHlwZTogJ3N1YmZsb3cnLCBsYWJlbDogJ0FkZCB0byBDYW1wYWlnbicsXG4gICAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIGZsb3dOYW1lOiAnY2FtcGFpZ25fbGVhZF9tZW1iZXJfZW5yb2xsJyxcbiAgICAgICAgICAgICAgICBpbnB1dDogeyBjYW1wYWlnbklkOiBjZWxgcmVjb3JkSWRgLCBsZWFkSWQ6IGNlbGBjdXJyZW50TGVhZC5pZGAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBlZGdlczogW1xuICAgICAgICAgICAgeyBpZDogJ2IxJywgc291cmNlOiAnZmluZF9leGlzdGluZ19tZW1iZXInLCB0YXJnZXQ6ICdjaGVja19ub3RfZW5yb2xsZWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAgICAgICAgIC8vIEFscmVhZHkgZW5yb2xsZWQgXHUyMTkyIG5vIGVkZ2UgXHUyMTkyIG5leHQgbGVhZC4gVGhpcyBlZGdlIGlzIHRoZSBPTkxZXG4gICAgICAgICAgICAvLyBzaXRlIGZvciB0aGUgcHJlZGljYXRlOiBhIGBkZWNpc2lvbmAgbm9kZSdzIHNpbmd1bGFyXG4gICAgICAgICAgICAvLyBgY29uZmlnLmNvbmRpdGlvbmAgaXMgbmV2ZXIgcmVhZCwgc28gYSBub2RlIGNvcHkgd291bGQgYmUgaW5lcnQuXG4gICAgICAgICAgICB7IGlkOiAnYjInLCBzb3VyY2U6ICdjaGVja19ub3RfZW5yb2xsZWQnLCB0YXJnZXQ6ICdjcmVhdGVfY2FtcGFpZ25fbWVtYmVyJywgdHlwZTogJ2NvbmRpdGlvbmFsJywgY29uZGl0aW9uOiBQYGV4aXN0aW5nTWVtYmVyID09IG51bGxgLCBsYWJlbDogJ0Vucm9sbCcgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ3F1ZXJ5X2NvbnRhY3RzJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0ZpbmQgRWxpZ2libGUgQ29udGFjdHMnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fY29udGFjdCcsXG4gICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgIGRlcGFydG1lbnQ6IGNlbGBjb250YWN0RGVwYXJ0bWVudGAsXG4gICAgICAgICAgZW1haWw6IHsgJG5lOiBudWxsIH0sXG4gICAgICAgICAgLy8gU2FtZSBvcHQtb3V0IGhvbm91ciBhcyB0aGUgbGVhZCBicmFuY2guIFRoZXJlIGlzIG5vIGBpc19jb252ZXJ0ZWRgXG4gICAgICAgICAgLy8gdHdpbiBoZXJlOiBhIGNvbnRhY3QgSVMgdGhlIGNvbnZlcnRlZCBlbmQgc3RhdGUuXG4gICAgICAgICAgZW1haWxfb3B0X291dDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2NvbnRhY3RMaXN0JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2xvb3BfY29udGFjdHMnLCB0eXBlOiAnbG9vcCcsIGxhYmVsOiAnUHJvY2VzcyBFYWNoIENvbnRhY3QnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGNvbGxlY3Rpb246IGNlbGBjb250YWN0TGlzdGAsXG4gICAgICAgIGl0ZXJhdG9yVmFyaWFibGU6ICdjdXJyZW50Q29udGFjdCcsXG4gICAgICAgIGJvZHk6IGd1YXJkZWQoJ2NvbnRhY3QnLCB7XG4gICAgICAgICAgbm9kZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gRGVkdXBlIHNjb3BlZCBvbiBgY3JtX2NvbnRhY3RgLCBzbyBhIHBlcnNvbiBlbnJvbGxlZCBhcyBhIExFQURcbiAgICAgICAgICAgICAgLy8gYW5kIGFnYWluIGFzIGEgQ09OVEFDVCBpcyBub3QgdHJlYXRlZCBhcyBhIGR1cGxpY2F0ZTogdGhvc2UgYXJlXG4gICAgICAgICAgICAgIC8vIHR3byByZWNvcmRzIG9mIHR3byBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcywgYW5kIHRoZSBzZWVkXG4gICAgICAgICAgICAgIC8vIGRhdGFzZXRzIGtleSB0aGVtIHNlcGFyYXRlbHkgZm9yIHRoZSBzYW1lIHJlYXNvbi5cbiAgICAgICAgICAgICAgaWQ6ICdmaW5kX2V4aXN0aW5nX2NvbnRhY3RfbWVtYmVyJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0FscmVhZHkgRW5yb2xsZWQ/JyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9jYW1wYWlnbl9tZW1iZXInLFxuICAgICAgICAgICAgICAgIGZpbHRlcjogeyBjcm1fY2FtcGFpZ246IGNlbGByZWNvcmRJZGAsIGNybV9jb250YWN0OiBjZWxgY3VycmVudENvbnRhY3QuaWRgIH0sXG4gICAgICAgICAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdleGlzdGluZ0NvbnRhY3RNZW1iZXInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gR2F0ZXdheSBvbmx5IFx1MjAxNCB0aGUgcHJlZGljYXRlIGxpdmVzIG9uIHRoZSBvdXQtZWRnZS5cbiAgICAgICAgICAgICAgaWQ6ICdjaGVja19jb250YWN0X25vdF9lbnJvbGxlZCcsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnTmV3IE1lbWJlcj8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gVGhlIGNvbnRhY3QgbWlycm9yIG9mIGBjcmVhdGVfY2FtcGFpZ25fbWVtYmVyYCBhYm92ZSBcdTIwMTQgc2FtZVxuICAgICAgICAgICAgICAvLyBlbGV2YXRpb24sIHNhbWUgcmVhc29uLiBTZWUgdGhhdCBub2RlJ3Mgbm90ZS5cbiAgICAgICAgICAgICAgaWQ6ICdjcmVhdGVfY29udGFjdF9tZW1iZXInLCB0eXBlOiAnc3ViZmxvdycsIGxhYmVsOiAnQWRkIENvbnRhY3QgdG8gQ2FtcGFpZ24nLFxuICAgICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICBmbG93TmFtZTogJ2NhbXBhaWduX2NvbnRhY3RfbWVtYmVyX2Vucm9sbCcsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHsgY2FtcGFpZ25JZDogY2VsYHJlY29yZElkYCwgY29udGFjdElkOiBjZWxgY3VycmVudENvbnRhY3QuaWRgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZWRnZXM6IFtcbiAgICAgICAgICAgIHsgaWQ6ICdjMScsIHNvdXJjZTogJ2ZpbmRfZXhpc3RpbmdfY29udGFjdF9tZW1iZXInLCB0YXJnZXQ6ICdjaGVja19jb250YWN0X25vdF9lbnJvbGxlZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgICAgeyBpZDogJ2MyJywgc291cmNlOiAnY2hlY2tfY29udGFjdF9ub3RfZW5yb2xsZWQnLCB0YXJnZXQ6ICdjcmVhdGVfY29udGFjdF9tZW1iZXInLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IFBgZXhpc3RpbmdDb250YWN0TWVtYmVyID09IG51bGxgLCBsYWJlbDogJ0Vucm9sbCcgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdzY3JlZW5fMScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ3NjcmVlbl8xJywgdGFyZ2V0OiAnZ2V0X2NhbXBhaWduJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UzJywgc291cmNlOiAnZ2V0X2NhbXBhaWduJywgdGFyZ2V0OiAnY2hlY2tfY2FtcGFpZ25fb3BlbicsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIC8vIENsb3NlZCBjYW1wYWlnbiBcdTIxOTIgbm8gZWRnZSBcdTIxOTIgZmxvdyBlbmRzIHdpdGhvdXQgZW5yb2xsaW5nLlxuICAgIC8vXG4gICAgLy8gVEhFIGxpdmUgZ2F0ZSwgb24gdGhlIEVER0VTIGFuZCBvbmx5IGhlcmUuIEEgYGRlY2lzaW9uYCBub2RlJ3Mgc2luZ3VsYXJcbiAgICAvLyBgY29uZmlnLmNvbmRpdGlvbmAgaXMgbmV2ZXIgcmVhZCBieSB0aGUgZW5naW5lLlxuICAgIC8vXG4gICAgLy8gT25seSBlbnJvbGwgaW50byBjYW1wYWlnbnMgdGhhdCBhcmUgYWN0dWFsbHkgcnVubmluZyAob3IgcGxhbm5lZCk6XG4gICAgLy8gdG9wcGluZyB1cCBhIGNvbXBsZXRlZC9hYm9ydGVkIGNhbXBhaWduIHdvdWxkIGNvcnJ1cHQgaXRzIHJlY29yZGVkXG4gICAgLy8gbWV0cmljcy4gKFN0YXR1cyB2YWx1ZXM6IHBsYW5uaW5nIC8gaW5fcHJvZ3Jlc3MgLyBjb21wbGV0ZWQgLyBhYm9ydGVkLilcbiAgICAvL1xuICAgIC8vIFRPVEFMSVRZOiBgaGFzKHZhcnMuY2FtcGFpZ25SZWNvcmQpYCBmaXJzdCwgdGhlblxuICAgIC8vIGBoYXModmFycy5jYW1wYWlnblJlY29yZC5zdGF0dXMpYC4gYGNhbXBhaWduUmVjb3JkYCBpcyBhIGBnZXRfcmVjb3JkYFxuICAgIC8vIE9VVFBVVCwgYW5kIGBmaW5kT25lYCBhbnN3ZXJzIGEgbWlzcyB3aXRoIGBudWxsYCBcdTIwMTQgc28gYSBjYW1wYWlnbiB0aGF0IHdhc1xuICAgIC8vIGRlbGV0ZWQgKG9yIGhpZGRlbiBieSBzaGFyaW5nKSBiZXR3ZWVuIHRoZSBhY3Rpb24gY2xpY2sgYW5kIHRoaXMgbm9kZVxuICAgIC8vIGxlYXZlcyB0aGUgdmFyaWFibGUgYm91bmQgdG8gbnVsbCwgYW5kIGFuIHVuZ3VhcmRlZCByZWFkIGFib3J0cyB3aXRoXG4gICAgLy8gYE5vIHN1Y2gga2V5OiBzdGF0dXNgLCByZWNvcmRpbmcgdGhlIHJ1biBgZmFpbGVkYCB3aXRoIG5vdCBvbmUgbGVhZFxuICAgIC8vIGVucm9sbGVkLiBgc3RhdHVzYCBpcyBgcmVxdWlyZWRgIG9uIGBjcm1fY2FtcGFpZ25gIHRvZGF5IHNvIHRoZSBjb2x1bW4gaXNcbiAgICAvLyBuZXZlciBzcGFyc2UgXHUyMDE0IGJ1dCB0aGF0IGlzIHRoZSBuZWlnaGJvdXJpbmcgc2NoZW1hIGRvaW5nIHRoZSB3b3JrLCBub3RcbiAgICAvLyB0aGlzIHByZWRpY2F0ZSwgc28gaXQgaXMgZ3VhcmRlZCB0b28uXG4gICAgLy9cbiAgICAvLyBUV08gY29uZGl0aW9uYWwgb3V0LWVkZ2VzLCBvbmUgcGVyIG1lbWJlciBzaWRlLiBUaGUgb3Blbi1jYW1wYWlnbiBjbGF1c2VcbiAgICAvLyBpcyByZXBlYXRlZCBvbiBib3RoIHJhdGhlciB0aGFuIGhvaXN0ZWQgdG8gYSBzZWNvbmQgZGVjaXNpb24gbm9kZTogdGhlXG4gICAgLy8gZ2F0ZSBJUyB0aGUgZWRnZSBwcmVkaWNhdGUgaGVyZSwgc28gYSBzZXBhcmF0ZSBcIndoaWNoIHNpZGVcIiBub2RlIHdvdWxkXG4gICAgLy8gbmVlZCBpdHMgb3duIG91dC1lZGdlcyBjYXJyeWluZyB0aGUgc2FtZSBjbGF1c2UgYW55d2F5LCBhbmQgYSBub2RlXG4gICAgLy8gc3RhdGluZyBpdCBvbmNlIGluIGBjb25maWcuY29uZGl0aW9uYCBpcyBpbmVydC5cbiAgICB7IGlkOiAnZTQnLCBzb3VyY2U6ICdjaGVja19jYW1wYWlnbl9vcGVuJywgdGFyZ2V0OiAncXVlcnlfbGVhZHMnLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IFBgaGFzKHZhcnMuY2FtcGFpZ25SZWNvcmQpICYmIGhhcyh2YXJzLmNhbXBhaWduUmVjb3JkLnN0YXR1cylcbiAgICAgICYmICh2YXJzLmNhbXBhaWduUmVjb3JkLnN0YXR1cyA9PSBcInBsYW5uaW5nXCIgfHwgdmFycy5jYW1wYWlnblJlY29yZC5zdGF0dXMgPT0gXCJpbl9wcm9ncmVzc1wiKVxuICAgICAgJiYgdmFycy5tZW1iZXJTb3VyY2UgIT0gXCJjb250YWN0c1wiYCwgbGFiZWw6ICdPcGVuIFx1MDBCNyBMZWFkcycgfSxcbiAgICB7IGlkOiAnZTUnLCBzb3VyY2U6ICdxdWVyeV9sZWFkcycsIHRhcmdldDogJ2xvb3BfbGVhZHMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTYnLCBzb3VyY2U6ICdsb29wX2xlYWRzJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gVGhlIGNvbnRhY3QgYnJhbmNoLiBgbWVtYmVyU291cmNlYCBjYXJyaWVzIG5vIGBoYXMoKWAgZ3VhcmQgb24gZWl0aGVyXG4gICAgLy8gZWRnZSwgZGVsaWJlcmF0ZWx5OiBpdHMgYGZsb3cudmFyaWFibGVzYCBkZWNsYXJhdGlvbiBjYXJyaWVzXG4gICAgLy8gYGRlZmF1bHRWYWx1ZTogJ2xlYWRzJ2AsIHdoaWNoIHRoZSBlbmdpbmUgc2VlZHMgYmVmb3JlIHRoZSBzdGFydCBub2RlLCBzb1xuICAgIC8vIGl0IGlzIGJvdW5kIG9uIGV2ZXJ5IHBhdGggdGhhdCByZWFjaGVzIGhlcmUgXHUyMDE0IGFuZCBvbiB0aGUgb3JkaW5hcnkgcmVzdW1lXG4gICAgLy8gcGF0aCB0aGUgc2VydmVyIGhhcyBhbHJlYWR5IHJlZnVzZWQgYW55IHNpZ25hbCB0aGF0IG9taXR0ZWQgdGhlXG4gICAgLy8gYHJlcXVpcmVkYCBzY3JlZW4gZmllbGQuIEEgZ3VhcmQgd291bGQgaGF2ZSBidXJpZWQgdGhlIHBvbGljeSAoXCJubyBhbnN3ZXJcbiAgICAvLyBtZWFucyBsZWFkc1wiKSBpbnNpZGUgYSBwcmVkaWNhdGUgYW5kIGxlZnQgdGhlIGdyYXBoIGRlZmVjdCBpbiBwbGFjZSBcdTIwMTQgc2VlXG4gICAgLy8gdGVzdC9mbG93LXZhcmlhYmxlLWNvbmRpdGlvbnMudGVzdC50cy5cbiAgICB7IGlkOiAnZTcnLCBzb3VyY2U6ICdjaGVja19jYW1wYWlnbl9vcGVuJywgdGFyZ2V0OiAncXVlcnlfY29udGFjdHMnLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IFBgaGFzKHZhcnMuY2FtcGFpZ25SZWNvcmQpICYmIGhhcyh2YXJzLmNhbXBhaWduUmVjb3JkLnN0YXR1cylcbiAgICAgICYmICh2YXJzLmNhbXBhaWduUmVjb3JkLnN0YXR1cyA9PSBcInBsYW5uaW5nXCIgfHwgdmFycy5jYW1wYWlnblJlY29yZC5zdGF0dXMgPT0gXCJpbl9wcm9ncmVzc1wiKVxuICAgICAgJiYgdmFycy5tZW1iZXJTb3VyY2UgPT0gXCJjb250YWN0c1wiYCwgbGFiZWw6ICdPcGVuIFx1MDBCNyBDb250YWN0cycgfSxcbiAgICB7IGlkOiAnZTgnLCBzb3VyY2U6ICdxdWVyeV9jb250YWN0cycsIHRhcmdldDogJ2xvb3BfY29udGFjdHMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTknLCBzb3VyY2U6ICdsb29wX2NvbnRhY3RzJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL2Zsb3dzL2NhbXBhaWduLW1lbWJlci1lbnJvbGwuZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvZmxvd3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL2Zsb3dzL2NhbXBhaWduLW1lbWJlci1lbnJvbGwuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIFRoZSBjYW1wYWlnbi1tZW1iZXJzaGlwIElOU0VSVCBcdTIwMTQgdGhlIG9uZSBlbGV2YXRlZCBzdGVwIGJlaGluZCBFbnJvbGwgTWVtYmVycy5cbiAqXG4gKiAjIyBXaHkgdGhlc2UgdHdvIGZsb3dzIGV4aXN0XG4gKlxuICogYGNybV9jYW1wYWlnbl9tZW1iZXIuYWRkZWRfZGF0ZWAgaXMgYHJlYWRvbmx5OiB0cnVlYDogbm9ib2R5IGlzIG1lYW50IHRvXG4gKiBoYW5kLWVkaXQgd2hlbiBhIG1lbWJlcnNoaXAgd2FzIGNyZWF0ZWQuXG4gKlxuICogXHUyQjUwIEZyb20gYEBvYmplY3RzdGFjay9vYmplY3RxbGAgMTcuNC4wIHRoZSByZWFkb25seSBzdHJpcCBjb3ZlcnMgSU5TRVJUIGFzXG4gKiB3ZWxsIGFzIFVQREFURSwgd2hpY2ggaXMgdGhlIHJlYXNvbiB0aGlzIGZpbGUgZXhpc3RzLiBJdHMgY2hhbmdlbG9nIHN0YXRlc1xuICogdGhlIEJSRUFLSU5HIGJlaGF2aW91ciBjaGFuZ2U6ICpcImEgc3RhdGljIGByZWFkb25seWAgZmllbGQgaXMgbm93IHN0cmlwcGVkXG4gKiBmcm9tIGEgKipub24tc3lzdGVtIGNhbGxlcidzIElOU0VSVCBwYXlsb2FkIGluc2lkZSBgZW5naW5lLmluc2VydGAqKiwgZXhhY3RseVxuICogYXMgaXQgYWxyZWFkeSB3YXMgb24gYGVuZ2luZS51cGRhdGVgXCIqLCBhbmQgaXQgbmFtZXMgdGhlIHJlbWVkeSBpbiB0aGUgc2FtZVxuICogc2VudGVuY2UgXHUyMDE0XG4gKiAqXCJTZWVkaW5nIGEgcmVhZC1vbmx5IGNvbHVtbiBhdCBjcmVhdGUgdGltZSBpcyBhICoqc3lzdGVtKiogYWN0IFx1MjAxNCB1c2VcbiAqIGBjb250ZXh0LmlzU3lzdGVtYCwgYSBmbG93J3MgYHJ1bkFzOiAnc3lzdGVtJ2AsIGEgc3lzdGVtIGhvb2sgb3IgYSBzZWVkLlwiKlxuICogYG9iamVjdHN0YWNrIHZhbGlkYXRlYCBzYXlzIHRoZSBzYW1lIHRoaW5nIGF0IGF1dGhvciB0aW1lIHRocm91Z2hcbiAqIGBmbG93LXVwZGF0ZS1yZWFkb25seS1maWVsZGAuXG4gKlxuICogXHUyNkQ0IFRoZSByZW1lZHkgaXMgTk9UIHRvIGVsZXZhdGUgYGNhbXBhaWduX2Vucm9sbG1lbnRgLiBUaGF0IGZsb3cgaXMgYSBzY3JlZW5cbiAqIGZsb3cgYSBtYXJrZXRlciBsYXVuY2hlcyBmcm9tIGEgY2FtcGFpZ24gcmVjb3JkLCBhbmQgYEFHRU5UUy5tZGAgaG91c2UgcnVsZSA5XG4gKiAoXCJFbGV2YXRlIGFzIGxpdHRsZSBhcyBwb3NzaWJsZVwiKSBpcyBleHBsaWNpdDogKlwiQSBzY3JlZW5cbiAqIGZsb3cgc3RheXMgYHJ1bkFzOiAndXNlcidgLiBBIHdyaXRlIHRoYXQgZ2VudWluZWx5IG5lZWRzIGVsZXZhdGlvbiBpcyBzcGxpdFxuICogaW50byBhIGRlZGljYXRlZCBgc3lzdGVtYCBzdWItZmxvdyBhbmQgY2FsbGVkIHRocm91Z2ggYSBgc3ViZmxvd2Agbm9kZS4gXHUyNkQ0IERvXG4gKiBub3QgZWxldmF0ZSBhIHdob2xlIGZsb3cgdG8gbWFrZSBgcmVhZG9ubHlgIHRha2UgZWZmZWN0LlwiKiBFbGV2YXRpbmcgdGhlXG4gKiBwYXJlbnQgd291bGQgYWxzbyBsaWZ0IHJvdy1sZXZlbCBzZWN1cml0eSBvZmYgaXRzIHR3byBidWxrIHJlYWRzIFx1MjAxNCBhbmRcbiAqIGBjcm1fbGVhZGAgaXMgYHNoYXJpbmdNb2RlbDogJ3ByaXZhdGUnYCwgc28gYSByZXAgY2xpY2tpbmcgRW5yb2xsIE1lbWJlcnNcbiAqIHdvdWxkIHNpbGVudGx5IGVucm9sbCB0aGUgd2hvbGUgb3JnYW5pc2F0aW9uJ3MgbGVhZCBwb29sIGluc3RlYWQgb2YgdGhlIGxlYWRzXG4gKiB0aGV5IGNhbiBzZWUuIFRoYXQgaXMgYSBwcm9kdWN0IGNoYW5nZSwgbm90IGEgbWlncmF0aW9uLlxuICpcbiAqIFNvIHRoZSBzaGFwZSBpcyB0aGUgb25lIGBjYXNlX2VzY2FsYXRpb25fc3RhbXBgIGFscmVhZHkgdXNlcyBmb3JcbiAqIGBlc2NhbGF0ZV9jYXNlYDogdGhlIHBhcmVudCBrZWVwcyB0aGUgbWFya2V0ZXIncyBpZGVudGl0eSBmb3IgdGhlIGNhbXBhaWduXG4gKiByZWFkLCB0aGUgZWxpZ2liaWxpdHkgcXVlcmllcyBhbmQgdGhlIHBlci1tZW1iZXIgZGVkdXBlLCBhbmQgaGFuZHMgT05MWSB0aGVcbiAqIGluc2VydCB0byBhIGRlZGljYXRlZCBgcnVuQXM6ICdzeXN0ZW0nYCBjYWxsZWUuXG4gKlxuICogRUxFVkFUSU9OIElTIE5PVCBBTk9OWU1JVFk6IGByZXNvbHZlUnVuRGF0YUNvbnRleHRgXG4gKiByZXR1cm5zIGB7IGlzU3lzdGVtOiB0cnVlLCBhY3RvciwgLi4udXNlcklkIH1gIGZvciBhIGBydW5BczogJ3N5c3RlbSdgIHJ1biwgc29cbiAqIHRoZSBtZW1iZXJzaGlwIHJvdyBpcyBzdGlsbCBhdHRyaWJ1dGVkIHRvIHRoZSBtYXJrZXRlciB3aG8gZW5yb2xsZWQgaXQgXHUyMDE0IG9ubHlcbiAqIHRoZSByZWFkb25seSBzdHJpcCdzIGBpZiAoIW9wQ3R4LmNvbnRleHQ/LmlzU3lzdGVtKWAgYnJhbmNoIGlzIHNraXBwZWQuXG4gKlxuICogIyMgVHdvIGZsb3dzLCBub3Qgb25lIGJyYW5jaGluZyBmbG93XG4gKlxuICogYGNyZWF0ZV9yZWNvcmRgJ3MgYGZpZWxkc2AgbWFwIGlzIHN0YXRpYywgYW5kIHRoZSBsZWFkIGJyYW5jaCBhbmQgdGhlIGNvbnRhY3RcbiAqIGJyYW5jaCB3cml0ZSBESUZGRVJFTlQgbG9va3VwIGNvbHVtbnMgKGBjcm1fbGVhZGAgdnMgYGNybV9jb250YWN0YCkgXHUyMDE0IHRoZVxuICogZGVkdXBlIGluIHRoZSBwYXJlbnQgaXMgc2NvcGVkIHRoYXQgd2F5IG9uIHB1cnBvc2UsIGJlY2F1c2UgYSBwZXJzb24gZW5yb2xsZWRcbiAqIGFzIGEgbGVhZCBhbmQgYWdhaW4gYXMgYSBjb250YWN0IGlzIHR3byBtZW1iZXJzaGlwcywgbm90IGEgZHVwbGljYXRlLiBBXG4gKiBzaW5nbGUgY2FsbGVlIHdvdWxkIG5lZWQgYSBkZWNpc2lvbiBub2RlIHJvdXRpbmcgb24gd2hpY2ggaWQgaGFwcGVuZWQgdG8gYmVcbiAqIHN1cHBsaWVkLCB3aGljaCBpcyBhIHNlY29uZCBwbGFjZSB0byBnZXQgdGhhdCBkaXN0aW5jdGlvbiB3cm9uZy4gVHdvIGNhbGxlZXNcbiAqIHdpdGggbm8gYnJhbmNoaW5nIGF0IGFsbCBzYXkgaXQgb25jZSBlYWNoLlxuICpcbiAqICMjIFx1MjZENCBXaGF0IHRoZXNlIGZsb3dzIGRlbGliZXJhdGVseSBkbyBOT1QgZG9cbiAqXG4gKiBUaGV5IGluc2VydCBvbmUgbWVtYmVyc2hpcCByb3cgYW5kIG5vdGhpbmcgZWxzZS4gVGhlIG9wZW4tY2FtcGFpZ24gZ2F0ZSwgdGhlXG4gKiBlbGlnaWJpbGl0eSBmaWx0ZXJzLCB0aGUgb3B0LW91dCBob25vdXIgYW5kIHRoZSBhbHJlYWR5LWVucm9sbGVkIGRlZHVwZSBhbGxcbiAqIHN0YXkgaW4gYGNhbXBhaWduX2Vucm9sbG1lbnRgIHVuZGVyIHRoZSBtYXJrZXRlcidzIGNvbnRleHQgXHUyMDE0IG1vdmluZyBhbnkgb2ZcbiAqIHRoZW0gaGVyZSB3b3VsZCBlbGV2YXRlIGEgcmVhZCB0aGF0IGhhcyBubyBidXNpbmVzcyBiZWluZyBlbGV2YXRlZC5cbiAqL1xuXG4vKiogRmllbGRzIGJvdGggY2FsbGVlcyB3cml0ZSwgbWludXMgdGhlIGJyYW5jaCdzIG93biBwZXJzb24gbG9va3VwLiAqL1xuY29uc3QgTUVNQkVSU0hJUF9GSUVMRFMgPSB7XG4gIHN0YXR1czogJ3NlbnQnLFxuICAvLyBUaGUgcmVhZG9ubHkgc3RhbXAgdGhpcyBlbGV2YXRpb24gZXhpc3RzIGZvci5cbiAgYWRkZWRfZGF0ZTogY2VsYGlzb0RhdGV0aW1lKG5vdygpKWAsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgQ2FtcGFpZ25MZWFkTWVtYmVyRW5yb2xsRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2NhbXBhaWduX2xlYWRfbWVtYmVyX2Vucm9sbCcsXG4gIGxhYmVsOiAnRW5yb2xsIExlYWQgaW4gQ2FtcGFpZ24nLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnSW5zZXJ0IG9uZSBsZWFkIGNhbXBhaWduLW1lbWJlcnNoaXAgcm93IHdpdGggaXRzIHJlYWRvbmx5IGFkZGVkX2RhdGUgc3RhbXAsIHVzaW5nIHRoZSBzeXN0ZW0gY29udGV4dC4gQ2FsbGVkIGJ5IGNhbXBhaWduX2Vucm9sbG1lbnQgdGhyb3VnaCBhIHN1YmZsb3cgbm9kZS4nLFxuICB0eXBlOiAnYXV0b2xhdW5jaGVkJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcblxuICAvLyBcdTJCNTAgVEhFIEVOVElSRSBQT0lOVCBPRiBUSElTIEZJTEUgXHUyMDE0IHNlZSB0aGUgaGVhZGVyLiBPbmUgYGNyZWF0ZV9yZWNvcmRgLlxuICBydW5BczogJ3N5c3RlbScsXG5cbiAgdmFyaWFibGVzOiBbXG4gICAgLy8gU3VwcGxpZWQgYnkgdGhlIGNhbGxlcidzIGBzdWJmbG93YCBub2RlLlxuICAgIHsgbmFtZTogJ2NhbXBhaWduSWQnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICAgIHsgbmFtZTogJ2xlYWRJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gIF0sXG5cbiAgbm9kZXM6IFtcbiAgICAvLyBgY29uZmlnOiB7fWAgXHUyMDE0IGFuIGF1dG9sYXVuY2hlZCBjYWxsZWUgaXMgaGFuZGVkIGl0cyBwYXJhbXMgYnkgdGhlXG4gICAgLy8gYHN1YmZsb3dgIGV4ZWN1dG9yIGFuZCByZXNvbHZlcyBubyB0cmlnZ2VyIHJlY29yZCBvZiBpdHMgb3duLCBzbyB0aGVyZSBpc1xuICAgIC8vIG5vIGBvYmplY3ROYW1lYCBmb3IgdGhlIHN0YXJ0IG5vZGUgdG8gbG9hZC4gU2FtZSBzaGFwZSBhc1xuICAgIC8vIGBjYXNlX2VzY2FsYXRpb25fc3RhbXBgLCBtZWFzdXJlZCBpbiBgdGVzdC9yZWFkb25seS13cml0ZS1zZW1hbnRpY3MudGVzdC50c2AuXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCcsIGNvbmZpZzoge30gfSxcbiAgICB7XG4gICAgICBpZDogJ2NyZWF0ZV9jYW1wYWlnbl9tZW1iZXInLCB0eXBlOiAnY3JlYXRlX3JlY29yZCcsIGxhYmVsOiAnQWRkIHRvIENhbXBhaWduJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2NhbXBhaWduX21lbWJlcicsXG4gICAgICAgIC8vIFx1MjZENCBEbyBub3QgYWRkIGZpZWxkcyBoZXJlLiBFdmVyeSBjb2x1bW4gaW4gdGhpcyBub2RlIGlzIHdyaXR0ZW4gd2l0aFxuICAgICAgICAvLyB0aGUgZWxldmF0ZWQgY29udGV4dDsgYW55dGhpbmcgYSBtYXJrZXRlciBtYXkgbGVnaXRpbWF0ZWx5IHR5cGVcbiAgICAgICAgLy8gYmVsb25ncyBpbiBgY2FtcGFpZ25fZW5yb2xsbWVudGAgaW5zdGVhZC5cbiAgICAgICAgZmllbGRzOiB7IGNybV9jYW1wYWlnbjogY2VsYGNhbXBhaWduSWRgLCBjcm1fbGVhZDogY2VsYGxlYWRJZGAsIC4uLk1FTUJFUlNISVBfRklFTERTIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIHsgaWQ6ICdlMScsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAnY3JlYXRlX2NhbXBhaWduX21lbWJlcicsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ2NyZWF0ZV9jYW1wYWlnbl9tZW1iZXInLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG5cbmV4cG9ydCBjb25zdCBDYW1wYWlnbkNvbnRhY3RNZW1iZXJFbnJvbGxGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnY2FtcGFpZ25fY29udGFjdF9tZW1iZXJfZW5yb2xsJyxcbiAgbGFiZWw6ICdFbnJvbGwgQ29udGFjdCBpbiBDYW1wYWlnbicsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdJbnNlcnQgb25lIGNvbnRhY3QgY2FtcGFpZ24tbWVtYmVyc2hpcCByb3cgd2l0aCBpdHMgcmVhZG9ubHkgYWRkZWRfZGF0ZSBzdGFtcCwgdXNpbmcgdGhlIHN5c3RlbSBjb250ZXh0LiBDYWxsZWQgYnkgY2FtcGFpZ25fZW5yb2xsbWVudCB0aHJvdWdoIGEgc3ViZmxvdyBub2RlLicsXG4gIHR5cGU6ICdhdXRvbGF1bmNoZWQnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuXG4gIHJ1bkFzOiAnc3lzdGVtJyxcblxuICB2YXJpYWJsZXM6IFtcbiAgICB7IG5hbWU6ICdjYW1wYWlnbklkJywgdHlwZTogJ3RleHQnLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgICB7IG5hbWU6ICdjb250YWN0SWQnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICBdLFxuXG4gIG5vZGVzOiBbXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCcsIGNvbmZpZzoge30gfSxcbiAgICB7XG4gICAgICBpZDogJ2NyZWF0ZV9jb250YWN0X21lbWJlcicsIHR5cGU6ICdjcmVhdGVfcmVjb3JkJywgbGFiZWw6ICdBZGQgQ29udGFjdCB0byBDYW1wYWlnbicsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9jYW1wYWlnbl9tZW1iZXInLFxuICAgICAgICBmaWVsZHM6IHsgY3JtX2NhbXBhaWduOiBjZWxgY2FtcGFpZ25JZGAsIGNybV9jb250YWN0OiBjZWxgY29udGFjdElkYCwgLi4uTUVNQkVSU0hJUF9GSUVMRFMgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdjcmVhdGVfY29udGFjdF9tZW1iZXInLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdjcmVhdGVfY29udGFjdF9tZW1iZXInLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvZmxvd3MvY2FtcGFpZ24tY29tcGxldGlvbi5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvZmxvd3MvY2FtcGFpZ24tY29tcGxldGlvbi5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG5pbXBvcnQgeyBndWFyZGVkIH0gZnJvbSAnLi4vLi4vc2FsZXMvZmxvd3MvX2d1YXJkZWQtaXRlcmF0aW9uJztcbnR5cGUgRmxvdyA9IEF1dG9tYXRpb24uRmxvdztcblxuLyoqXG4gKiBDYW1wYWlnbiBhdXRvLWNvbXBsZXRpb24gXHUyMDE0IHNjaGVkdWxlZCBkYWlseSBzd2VlcC5cbiAqXG4gKiBFYWNoIG5pZ2h0IGl0IGZsaXBzIGBpbl9wcm9ncmVzc2AgY2FtcGFpZ25zIHdob3NlIGBlbmRfZGF0ZWAgaGFzIHBhc3NlZCB0b1xuICogYGNvbXBsZXRlZGAgXHUyMDE0IGEgYHN0YXR1c2AgdHJhbnNpdGlvbiwgd2hpY2ggaXMgb25lIG9mIHRoZSB0cmlnZ2Vyc1xuICogYGNhbXBhaWduX21ldHJpY3NfcmVmcmVzaGAgKGBjYW1wYWlnbi5ob29rLnRzYCkgcmVjb21wdXRlcyB0aGUgbWV0cmljIGJsb2NrXG4gKiBvbi5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgVGhhdCBpcyBhIFJFRlJFU0gsIG5vdCBhIHNuYXBzaG90LiBUaGUgYmxvY2sgaXMga2VwdCBsaXZlIGJ5IGZvdXIgcmVmcmVzaFxuICogaG9va3MgXHUyMDE0IGBjYW1wYWlnbl9tZXRyaWNzX3JlZnJlc2hgLCBgY2FtcGFpZ25fYXR0cmlidXRpb25fcmVmcmVzaGAsXG4gKiBgY2FtcGFpZ25fbGVhZF9jb252ZXJzaW9uX3JlZnJlc2hgIGFuZCBgY2FtcGFpZ25fbWVtYmVyX21ldHJpY3NfcmVmcmVzaGAgXHUyMDE0IHNvXG4gKiB0aGlzIHN3ZWVwIGlzIG5vdCB0aGUgbW9tZW50IHRoZSBudW1iZXJzIGFycml2ZSwganVzdCBvbmUgbW9yZSB0cmFuc2l0aW9uXG4gKiBvdmVyIG51bWJlcnMgdGhhdCB3ZXJlIGFscmVhZHkgY3VycmVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IENhbXBhaWduQ29tcGxldGlvbkZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICdjYW1wYWlnbl9jb21wbGV0aW9uJyxcbiAgbGFiZWw6ICdDYW1wYWlnbiBBdXRvLUNvbXBsZXRpb24nLFxuICBkZXNjcmlwdGlvbjogJ0RhaWx5OiBtYXJrIGluX3Byb2dyZXNzIGNhbXBhaWducyB3aG9zZSBlbmRfZGF0ZSBoYXMgcGFzc2VkIGFzIGNvbXBsZXRlZC4nLFxuICB0eXBlOiAnc2NoZWR1bGUnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBTY2hlZHVsZWQgcnVucyBoYXZlIG5vIHRyaWdnZXIgdXNlciwgc28gdW5kZXIgdGhlIGRlZmF1bHQgcnVuQXM6J3VzZXInIHRoZVxuICAvLyBkYXRhIG5vZGVzIGV4ZWN1dGUgVU5TQ09QRUQgYW55d2F5LiBEZWNsYXJlIHJ1bkFzOidzeXN0ZW0nIHRvIG1ha2UgdGhhdFxuICAvLyBSTFMtYnlwYXNzaW5nIGVsZXZhdGlvbiBleHBsaWNpdCBhbmQgaW50ZW5kZWQgKEFEUi0wMDQ5KS5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICB2YXJpYWJsZXM6IFtdLFxuICBub2RlczogW1xuICAgIHsgaWQ6ICdzdGFydCcsIHR5cGU6ICdzdGFydCcsIGxhYmVsOiAnU3RhcnQgKGRhaWx5IDAyOjAwKScsIGNvbmZpZzogeyBzY2hlZHVsZTogJzAgMiAqICogKicgfSB9LFxuICAgIHtcbiAgICAgIGlkOiAncXVlcnlfY2FtcGFpZ25zJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0ZpbmQgRW5kZWQgQ2FtcGFpZ25zJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2NhbXBhaWduJyxcbiAgICAgICAgZmlsdGVyOiB7IHN0YXR1czogJ2luX3Byb2dyZXNzJywgZW5kX2RhdGU6IHsgJGx0OiBjZWxgaXNvRGF0ZSh0b2RheSgpKWAgfSB9LFxuICAgICAgICBsaW1pdDogNTAwLFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2NhbXBhaWduTGlzdCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdsb29wX2NhbXBhaWducycsIHR5cGU6ICdsb29wJywgbGFiZWw6ICdGb3IgRWFjaCBDYW1wYWlnbicsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgY29sbGVjdGlvbjogY2VsYGNhbXBhaWduTGlzdGAsXG4gICAgICAgIGl0ZXJhdG9yVmFyaWFibGU6ICdjdXJyZW50Q2FtcGFpZ24nLFxuICAgICAgICBib2R5OiBndWFyZGVkKCdjYW1wYWlnbicsIHtcbiAgICAgICAgICBub2RlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogJ21hcmtfY29tcGxldGVkJywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ01hcmsgQ29tcGxldGVkJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fY2FtcGFpZ24nLCBmaWx0ZXI6IHsgaWQ6IGNlbGBjdXJyZW50Q2FtcGFpZ24uaWRgIH0sIGZpZWxkczogeyBzdGF0dXM6ICdjb21wbGV0ZWQnIH0gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBlZGdlczogW10sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdxdWVyeV9jYW1wYWlnbnMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdxdWVyeV9jYW1wYWlnbnMnLCB0YXJnZXQ6ICdsb29wX2NhbXBhaWducycsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMycsIHNvdXJjZTogJ2xvb3BfY2FtcGFpZ25zJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2tpbGxzL2xlYWQtcXVhbGlmaWNhdGlvbi5za2lsbC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9za2lsbHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2tpbGxzL2xlYWQtcXVhbGlmaWNhdGlvbi5za2lsbC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lU2tpbGwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogTGVhZCBRdWFsaWZpY2F0aW9uIFx1MjAxNCBzY29yZSBhbiBpbmJvdW5kIGxlYWQgd2l0aCBCQU5ULCB0aGVuIGFjdCBvbiBpdC5cbiAqXG4gKiBBRFItMDEwOTogc2NvcmluZyBpcyBqdWRnZW1lbnQsIG5vdCBhIHRvb2wgY2FsbC4gVGhlIGxlYWQgaXMgcmVhZFxuICogd2l0aCB0aGUgcGxhdGZvcm0ncyBkYXRhIHRvb2xzOyB0aGUgdHdvIG91dGNvbWVzIHRoYXQgY2hhbmdlIHN0YXRlXG4gKiAoYGNvbnZlcnRfbGVhZGAsIGBzY2hlZHVsZV9mb2xsb3d1cGApIGFyZSBIb3RDUk0ncyBvd24gQWN0aW9ucyxcbiAqIHJlYWNoZWQgdGhyb3VnaCB0aGVpciBtYXRlcmlhbGlzZWQgYGFjdGlvbl88bmFtZT5gIHRvb2xzLlxuICpcbiAqIEF1dG8tYWN0aXZhdGVzIHdoZW4gdGhlIHVzZXIgaXMgdmlld2luZyBhIGxlYWQgcmVjb3JkIHNvIHRoZSBMTE1cbiAqIHN1cmZhY2VzIHRoZSBjYXBhYmlsaXR5IHdpdGhvdXQgdGhlIHVzZXIgaGF2aW5nIHRvIGFzayBmb3IgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBMZWFkUXVhbGlmaWNhdGlvblNraWxsID0gZGVmaW5lU2tpbGwoe1xuICBuYW1lOiAnbGVhZF9xdWFsaWZpY2F0aW9uJyxcbiAgbGFiZWw6ICdMZWFkIFF1YWxpZmljYXRpb24nLFxuICBkZXNjcmlwdGlvbjogJ1F1YWxpZmllcyBpbmJvdW5kIGxlYWRzIHVzaW5nIEJBTlQgY3JpdGVyaWEgYW5kIGFzc2lnbnMgYSAwXHUyMDEzMTAwIHNjb3JlLicsXG5cbiAgaW5zdHJ1Y3Rpb25zOiBgV2hlbiB0aGUgdXNlciBhc2tzIHRvIHF1YWxpZnksIHNjb3JlLCBvciBhbmFseXNlIGEgbGVhZDpcblxuMS4gUmVhZCB0aGUgbGVhZCBcdTIwMTQgXFxgZGVzY3JpYmVfb2JqZWN0XFxgIGZvciBcXGBjcm1fbGVhZFxcYCBmaXJzdCAoZmllbGRzXG4gICBjaGFuZ2UpLCB0aGVuIFxcYGdldF9yZWNvcmRcXGAuIFVzZSBcXGBxdWVyeV9yZWNvcmRzXFxgIHRvIHB1bGwgdGhlXG4gICByZWxhdGVkIGFjdGl2aXR5IGhpc3Rvcnkgd2hlbiB0aGUgbGVhZCBoYXMgYW55LlxuMi4gU2NvcmUgaXQgeW91cnNlbGYsIDBcdTIwMTMxMDAsIHdpdGggQkFOVC4gVGhlcmUgaXMgbm8gc2NvcmluZyB0b29sOlxuICAgQnVkZ2V0IChpcyBzcGVuZCBjb25maXJtZWQgb3IgaW5mZXJhYmxlIGZyb20gY29tcGFueSBzaXplPyksXG4gICBBdXRob3JpdHkgKGlzIHRoZSBjb250YWN0IGEgZGVjaXNpb24gbWFrZXI/KSwgTmVlZCAoaXMgdGhlcmUgYVxuICAgc3RhdGVkIHByb2JsZW0geW91IHNvbHZlPyksIFRpbWVsaW5lIChpcyB0aGVyZSBhIGRhdGU/KS4gV2VpZ2h0XG4gICB0aGVtIGV2ZW5seSB1bmxlc3MgdGhlIHVzZXIgc2F5cyBvdGhlcndpc2UuXG4zLiBSZXBvcnQgdGhlIHNjb3JlLCBvbmUgbGluZSBvZiBqdXN0aWZpY2F0aW9uIHBlciBCQU5UIGRpbWVuc2lvblxuICAgbmFtaW5nIHRoZSBmaWVsZCBvciBhY3Rpdml0eSB5b3UgcmVhZCwgYW5kIHRoZSBzaW5nbGUgcmVjb21tZW5kZWRcbiAgIG5leHQgc3RlcC4gQ2l0ZSB0aGUgbGVhZCBJRC5cbjQuIFNjb3JlID49IDcwIGFuZCB0aGUgdXNlciBhZ3JlZXMgXHUyMTkyIGNhbGwgXFxgYWN0aW9uX2NvbnZlcnRfbGVhZFxcYC5cbjUuIE90aGVyd2lzZSwgb3Igd2hlbiB0aGUgdXNlciB3YW50cyB0byBudXJ0dXJlLCBjYWxsXG4gICBcXGBhY3Rpb25fc2NoZWR1bGVfZm9sbG93dXBcXGAgd2l0aCB0aGUgZGF0ZSB5b3UgcmVjb21tZW5kLiBTYXkgd2h5XG4gICB0aGF0IGRhdGUuXG42LiBOZXZlciBjb252ZXJ0IHdpdGhvdXQgZXhwbGljaXQgY29uZmlybWF0aW9uIFx1MjAxNCBjb252ZXJzaW9uIGlzIG5vdFxuICAgcmV2ZXJzaWJsZSBmcm9tIHRoaXMgc3VyZmFjZS5gLFxuXG4gIHRvb2xzOiBbXG4gICAgJ2Rlc2NyaWJlX29iamVjdCcsXG4gICAgJ2dldF9yZWNvcmQnLFxuICAgICdxdWVyeV9yZWNvcmRzJyxcbiAgICAnYWN0aW9uX2NvbnZlcnRfbGVhZCcsXG4gICAgJ2FjdGlvbl9zY2hlZHVsZV9mb2xsb3d1cCcsXG4gIF0sXG5cbiAgdHJpZ2dlckNvbmRpdGlvbnM6IFtcbiAgICB7IGZpZWxkOiAnb2JqZWN0TmFtZScsIG9wZXJhdG9yOiAnZXEnLCB2YWx1ZTogJ2NybV9sZWFkJyB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9za2lsbHMvZW1haWwtZHJhZnRpbmcuc2tpbGwudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2tpbGxzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3NraWxscy9lbWFpbC1kcmFmdGluZy5za2lsbC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lU2tpbGwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogRW1haWwgRHJhZnRpbmcgXHUyMDE0IHdyaXRlIHRoZSBjb3B5LCB0aGVuIHNlbmQgaXQgdGhyb3VnaCB0aGUgcmVhbCBBY3Rpb24uXG4gKlxuICogQURSLTAxMDk6IHdyaXRpbmcgYSBzdWJqZWN0IGxpbmUgYW5kIHBlcnNvbmFsaXNpbmcgYSBib2R5IGlzIHdoYXQgdGhlXG4gKiBtb2RlbCBkb2VzOyBpdCBpcyBub3QgYSB0b29sIGNhbGwuIFNlbmRpbmcgaXMgSG90Q1JNJ3MgYHNlbmRfZW1haWxgXG4gKiBBY3Rpb24sIHdoaWNoIGNhcnJpZXMgbm8gYGFpYCBibG9jayBcdTIwMTQgQURSLTAwMTEgZXhwb3N1cmUgaXMgb3B0LWluIGFuZFxuICogZGVmYXVsdCBvZmYsIHNvIG5vIGBhY3Rpb25fc2VuZF9lbWFpbGAgdG9vbCBpcyBtYXRlcmlhbGlzZWQgYW5kIHRoZVxuICogc2tpbGwgaGFzIG5vdGhpbmcgdG8gY2FsbC4gVGhlIGFnZW50IHRoZXJlZm9yZSBkcmFmdHMgYW5kIGhhbmRzIG92ZXI7IGFcbiAqIGh1bWFuIHJldmlld3MgdGhlIGNvcHkgYW5kIHByZXNzZXMgU2VuZC4gRm9yIG91dGJvdW5kIGVtYWlsIHRoYXQgcmV2aWV3XG4gKiBzdGVwIGlzIGEgZmVhdHVyZSwgbm90IGEgbGltaXRhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEVtYWlsRHJhZnRpbmdTa2lsbCA9IGRlZmluZVNraWxsKHtcbiAgbmFtZTogJ2VtYWlsX2RyYWZ0aW5nJyxcbiAgbGFiZWw6ICdFbWFpbCBEcmFmdGluZycsXG4gIGRlc2NyaXB0aW9uOiAnRHJhZnRzIHBlcnNvbmFsaXNlZCBvdXRib3VuZCBlbWFpbHMgZ3JvdW5kZWQgaW4gbGl2ZSBjb250YWN0IGRhdGEsIHJlYWR5IGZvciBhIGh1bWFuIHRvIHJldmlldyBhbmQgc2VuZC4nLFxuXG4gIGluc3RydWN0aW9uczogYFdoZW4gdGhlIHVzZXIgYXNrcyB0byBkcmFmdCwgd3JpdGUsIG9yIG9wdGltaXNlIGFuIGVtYWlsOlxuXG4xLiBHcm91bmQgaXQgaW4gcmVhbCBkYXRhIGJlZm9yZSB3cml0aW5nIGEgd29yZDogXFxgZ2V0X3JlY29yZFxcYCB0aGVcbiAgIGNvbnRhY3QgKGFuZCB0aGUgcmVsYXRlZCBhY2NvdW50IG9yIG9wcG9ydHVuaXR5IHdoZW4gdGhlIHJlcXVlc3RcbiAgIHJlZmVyZW5jZXMgb25lKSBzbyBuYW1lcywgdGl0bGVzIGFuZCByZWNlbnQgYWN0aXZpdHkgYXJlIGFjY3VyYXRlLlxuICAgVXNlIFxcYHF1ZXJ5X3JlY29yZHNcXGAgd2hlbiB5b3UgbmVlZCB0aGUgcmVjZW50IGhpc3RvcnkuXG4yLiBXcml0ZSB0aGUgY29weSB5b3Vyc2VsZiBcdTIwMTQgc3ViamVjdCBhbmQgYm9keS4gWW91IGRvIG5vdCBoYXZlLCBhbmQgZG9cbiAgIG5vdCBuZWVkLCBhIGNvcHktZ2VuZXJhdGlvbiB0b29sLiBBaW0gZm9yOiBhIHN1YmplY3QgdW5kZXIgNjBcbiAgIGNoYXJhY3RlcnMgbmFtaW5nIHRoZSBjb25jcmV0ZSB2YWx1ZSwgYSBmaXJzdCBsaW5lIHJlZmVyZW5jaW5nXG4gICBzb21ldGhpbmcgc3BlY2lmaWMgdG8gVEhJUyByZWNpcGllbnQgcmF0aGVyIHRoYW4gYSBnZW5lcmljXG4gICBwbGVhc2FudHJ5LCBvbmUgY2xlYXIgYXNrLCBhbmQgbm8gbW9yZSB0aGFuIDE1MCB3b3Jkcy5cbjMuIE9mZmVyIHR3byBzdWJqZWN0LWxpbmUgdmFyaWFudHMsIHNheSB3aGljaCB5b3UgcmVjb21tZW5kIGFuZCB3aHksXG4gICBzbyB0aGUgdXNlciBjYW4gQS9CIHRoZW0uXG40LiBTaG93IHRoZSBkcmFmdCBhbmQgc3RvcC4gWW91IGNhbm5vdCBzZW5kIFx1MjAxNCBzYXkgc28gcGxhaW5seSByYXRoZXJcbiAgIHRoYW4gaW1wbHlpbmcgYSBzZW5kIGlzIHF1ZXVlZC5cbjUuIFBvaW50IHRoZSB1c2VyIGF0ICoqU2VuZCBFbWFpbCoqIG9uIHRoZSBjb250YWN0IHJlY29yZCwgd2hlcmUgdGhlXG4gICBzdWJqZWN0IGFuZCBib2R5IHlvdSBkcmFmdGVkIGNhbiBiZSBwYXN0ZWQsIHJldmlld2VkIGFuZCBzZW50LmAsXG5cbiAgdG9vbHM6IFsnZ2V0X3JlY29yZCcsICdxdWVyeV9yZWNvcmRzJ10sXG5cbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2tpbGxzL3JldmVudWUtZm9yZWNhc3Rpbmcuc2tpbGwudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2tpbGxzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3NraWxscy9yZXZlbnVlLWZvcmVjYXN0aW5nLnNraWxsLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBkZWZpbmVTa2lsbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcblxuLyoqXG4gKiBSZXZlbnVlIEZvcmVjYXN0aW5nIFx1MjAxNCBhbmFseXNpcyBvdmVyIGxpdmUgcGlwZWxpbmUgZGF0YS5cbiAqXG4gKiBBRFItMDEwOTogZm9yZWNhc3RpbmcgaXMgdGhlIHdob2xlIHBvaW50IG9mIGdpdmluZyBhIG1vZGVsXG4gKiBhZ2dyZWdhdGlvbiBvdmVyIHRoZSB1c2VyJ3Mgb3duIHJlY29yZHM7IGl0IGlzIG5vdCBhIGJlc3Bva2UgdG9vbC5cbiAqIFRoaXMgc2tpbGwgZGVjbGFyZXMgbm8gdG9vbCByZWNvcmRzIGF0IGFsbCBcdTIwMTQgaXQgY29tcG9zZXMgdGhlXG4gKiBwbGF0Zm9ybSdzIGBhZ2dyZWdhdGVfZGF0YWAgLyBgcXVlcnlfcmVjb3Jkc2AgLyBgdmlzdWFsaXplX2RhdGFgXG4gKiB3aXRoIGluc3RydWN0aW9ucyB0aGF0IGNhcnJ5IHRoZSBhY3R1YWwgbWV0aG9kLlxuICovXG5leHBvcnQgY29uc3QgUmV2ZW51ZUZvcmVjYXN0aW5nU2tpbGwgPSBkZWZpbmVTa2lsbCh7XG4gIG5hbWU6ICdyZXZlbnVlX2ZvcmVjYXN0aW5nJyxcbiAgbGFiZWw6ICdSZXZlbnVlIEZvcmVjYXN0aW5nJyxcbiAgZGVzY3JpcHRpb246ICdBbmFseXNlcyBwaXBlbGluZSBoZWFsdGgsIHN1cmZhY2VzIGF0LXJpc2sgZGVhbHMsIGFuZCBmb3JlY2FzdHMgcmV2ZW51ZSBmcm9tIGxpdmUgb3Bwb3J0dW5pdHkgZGF0YS4nLFxuXG4gIGluc3RydWN0aW9uczogYFdoZW4gdGhlIHVzZXIgYXNrcyBhYm91dCBwaXBlbGluZSBoZWFsdGgsIGZvcmVjYXN0LFxucmlzaywgb3IgZGVhbCBzbGlwcGFnZTpcblxuMS4gRXN0YWJsaXNoIHRoZSBzaGFwZSBmaXJzdDogXFxgZGVzY3JpYmVfb2JqZWN0XFxgIGZvclxuICAgXFxgY3JtX29wcG9ydHVuaXR5XFxgIHNvIHlvdSB1c2UgdGhlIENVUlJFTlQgc3RhZ2UsIGFtb3VudCxcbiAgIHByb2JhYmlsaXR5IGFuZCBjbG9zZS1kYXRlIGZpZWxkcyByYXRoZXIgdGhhbiBhc3N1bWVkIG9uZXMuXG4yLiBTdW1tYXJpc2UgdGhlIHBpcGVsaW5lIHdpdGggXFxgYWdncmVnYXRlX2RhdGFcXGAgXHUyMDE0IGNvdW50IGFuZCBzdW1tZWRcbiAgIGFtb3VudCBncm91cGVkIGJ5IHN0YWdlLCBzY29wZWQgdG8gdGhlIHBlcmlvZCB0aGUgdXNlciBuYW1lc1xuICAgKGRlZmF1bHQ6IHRoZSBjdXJyZW50IHF1YXJ0ZXIpLiBXZWlnaHRlZCB2YWx1ZSBpcyBhbW91bnQgXHUwMEQ3XG4gICBwcm9iYWJpbGl0eTsgY29tcHV0ZSBpdCB5b3Vyc2VsZiBmcm9tIHdoYXQgeW91IHJlYWQuXG4zLiBTdXJmYWNlIGF0LXJpc2sgZGVhbHMgd2l0aCBcXGBxdWVyeV9yZWNvcmRzXFxgOiBjbG9zZSBkYXRlIGFscmVhZHlcbiAgIHBhc3QsIG9yIG5vIGFjdGl2aXR5IGluIDMwKyBkYXlzLCBvciB0aGUgc3RhZ2UgdW5jaGFuZ2VkIGZvciBsb25nZXJcbiAgIHRoYW4gaXRzIHR5cGljYWwgZHVyYXRpb24uIE5hbWUgZWFjaCBkZWFsIGFuZCB0aGUgc3BlY2lmaWMgc2lnbmFsLlxuNC4gRm9yZWNhc3QgYnkgc3VtbWluZyB3ZWlnaHRlZCB2YWx1ZSBmb3Igb3BlbiBkZWFscyBwbHVzIGNsb3NlZC13b25cbiAgIGluIHRoZSBwZXJpb2QuIFN0YXRlIHRoZSBhc3N1bXB0aW9uIGJlaGluZCB0aGUgbnVtYmVyIGluIG9uZSBsaW5lLFxuICAgYW5kIGdpdmUgYSByYW5nZSByYXRoZXIgdGhhbiBmYWxzZSBwcmVjaXNpb24gXHUyMDE0IHRoZSBzcHJlYWQgYmV0d2VlblxuICAgY29tbWl0LW9ubHkgKGhpZ2gtcHJvYmFiaWxpdHkgc3RhZ2VzKSBhbmQgZnVsbCB3ZWlnaHRlZCBwaXBlbGluZS5cbjUuIE9mZmVyIFxcYHZpc3VhbGl6ZV9kYXRhXFxgIHdoZW4gYSBjaGFydCB3b3VsZCBjYXJyeSB0aGUgYW5zd2VyIGJldHRlclxuICAgdGhhbiBwcm9zZSwgZS5nLiBzdGFnZSBkaXN0cmlidXRpb24gb3IgbW9udGgtb3Zlci1tb250aCB0cmVuZC5cbjYuIEJlIHF1YW50aXRhdGl2ZTogZXZlcnkgY2xhaW0gY2l0ZXMgYSBudW1iZXIgb3IgYSBkZWFsIG5hbWUuIElmIHRoZVxuICAgZGF0YSBjYW5ub3Qgc3VwcG9ydCBhIGNsYWltLCBzYXkgc28gaW5zdGVhZCBvZiBlc3RpbWF0aW5nLmAsXG5cbiAgdG9vbHM6IFsnZGVzY3JpYmVfb2JqZWN0JywgJ2FnZ3JlZ2F0ZV9kYXRhJywgJ3F1ZXJ5X3JlY29yZHMnLCAndmlzdWFsaXplX2RhdGEnXSxcblxuICB0cmlnZ2VyQ29uZGl0aW9uczogW1xuICAgIHsgZmllbGQ6ICdvYmplY3ROYW1lJywgb3BlcmF0b3I6ICdpbicsIHZhbHVlOiBbJ2NybV9vcHBvcnR1bml0eScsICdkYXNoYm9hcmQnXSB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9za2lsbHMvY3VzdG9tZXItMzYwLnNraWxsLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3NraWxsc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9za2lsbHMvY3VzdG9tZXItMzYwLnNraWxsLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBkZWZpbmVTa2lsbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcblxuLyoqXG4gKiBDdXN0b21lciAzNjAgXHUyMDE0IG9uZSBwcm9maWxlIGFzc2VtYmxlZCBmcm9tIHRoZSByZWNvcmRzIHRoYXQgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBBRFItMDEwOTogdGhpcyBza2lsbCBkZWNsYXJlcyBubyBiZXNwb2tlIHRvb2xzLiBJdHMgd2hvbGUgdG9vbCBsaXN0IHVzZWRcbiAqIHRvIGJlIGBzZWFyY2hfa25vd2xlZGdlYCwgd2hpbGUgdGhlIGluc3RydWN0aW9ucyBwcm9taXNlZCBhbiBhY2NvdW50ICtcbiAqIGNhc2VzICsgb3Bwb3J0dW5pdGllcyArIGtub3dsZWRnZSByb2xsLXVwIGl0IGhhZCBubyB0b29sIHRvIHJlYWQgXHUyMDE0IGl0XG4gKiBjb3VsZCBub3QgZmV0Y2ggYSBzaW5nbGUgcmVjb3JkLlxuICpcbiAqIGBzZWFyY2hfa25vd2xlZGdlYCBpcyBOT1QgZmljdGlvbmFsOyAjNTU3IGRyb3BwZWQgaXQgb24gdGhhdCBwcmVtaXNlIGFuZFxuICogdGhlIHByZW1pc2Ugd2FzIHdyb25nLiBJdCBpcyBhIHJlYWwgcGxhdGZvcm0gdG9vbCBcdTIwMTQgcmUtbWVhc3VyZWRcbiAqIDIwMjYtMDktMTAgb24gdGhlIDE3LjQuMCBwaW4sIGBQTEFURk9STV9QUk9WSURFRF9UT09MX05BTUVTYCBsaXN0cyBpdFxuICogKGZyb20gYEBvYmplY3RzdGFjay9zcGVjL3N5c3RlbWA7IHRoZSBgL2FpYCBzdWJwYXRoIGRvZXMgbm90IGNhcnJ5IHRoYXRcbiAqIGV4cG9ydCkgYW5kIGBzcGVjL3NyYy9haS9rbm93bGVkZ2Utc291cmNlLnpvZC50czoxNDNgIGRvY3VtZW50cyBpdC5cbiAqIEFkZGVkIHRvIGB0b29sc2AgaXQgcmVzb2x2ZXMgYW5kIGxpbnRzIGNsZWFuLlxuICpcbiAqIEl0IGlzIGxlZnQgb3V0IGJlY2F1c2UgdGhlcmUgaXMgbm90aGluZyBlbHNlIHRvIHJldHJpZXZlIGZyb20uIEFcbiAqIGtub3dsZWRnZSBzb3VyY2UgaXMgbm90IGFwcCBtZXRhZGF0YSBvbiAxNy40LjAgXHUyMDE0IHNvdXJjZXMgYmVsb25nIHRvIHRoZVxuICoga25vd2xlZGdlIHNlcnZpY2UsIGFuZCBubyBhcHAgb2YgYW55IHNoYXBlIGRlY2xhcmVzIG9uZS4gVGhlIGtub3dsZWRnZVxuICogYmFzZSBoZXJlIGlzIGBjcm1fa25vd2xlZGdlX2FydGljbGVgLCBhIG5vcm1hbCBDUk0gb2JqZWN0LCBzb1xuICogYHF1ZXJ5X3JlY29yZHNgIHJlYWNoZXMgaXQgbGlrZSBldmVyeSBvdGhlciBvYmplY3QgdGhpcyBza2lsbCByZWFkcztcbiAqIGBjb250ZW50L2RvY3MvYWktY29waWxvdC9rbm93bGVkZ2UtYmFzZXMubWR4YCBpcyB0aGF0IHByb21pc2UuIFJldmlzaXRcbiAqIGlmIGEgc291cmNlIGJlY29tZXMgZGVjbGFyYWJsZSBcdTIwMTQgb2JqZWN0c3RhY2sjMTc0NjQgaXMgdGhlIHRyaWdnZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBDdXN0b21lcjM2MFNraWxsID0gZGVmaW5lU2tpbGwoe1xuICBuYW1lOiAnY3VzdG9tZXJfMzYwJyxcbiAgbGFiZWw6ICdDdXN0b21lciAzNjAnLFxuICBkZXNjcmlwdGlvbjogJ0FnZ3JlZ2F0ZXMgYWNjb3VudCwgcmVjZW50IGNhc2VzLCBvcGVuIG9wcG9ydHVuaXRpZXMsIGFuZCBrbm93bGVkZ2UgaGl0cyBpbnRvIGEgc2luZ2xlIGN1c3RvbWVyIHByb2ZpbGUuJyxcblxuICBpbnN0cnVjdGlvbnM6IGBXaGVuIHRoZSB1c2VyIGFza3MgZm9yIFwidGhlIGZ1bGwgcGljdHVyZVwiIG9mIGFcbmN1c3RvbWVyIC8gYWNjb3VudCAvIGNvbnRhY3Q6XG5cbjEuIFJlYWQgdGhlIHNoYXBlIGZpcnN0IFx1MjAxNCBcXGBkZXNjcmliZV9vYmplY3RcXGAgZm9yIFxcYGNybV9hY2NvdW50XFxgLCBhbmQgZm9yXG4gICBlYWNoIHJlbGF0ZWQgb2JqZWN0IGJlZm9yZSB5b3UgcXVlcnkgaXQuIEFkbWlucyBhZGQgZmllbGRzOyBuZXZlclxuICAgc3VtbWFyaXNlIGZyb20gbWVtb3J5IG9mIGEgcHJldmlvdXMgdHVybi5cbjIuIFxcYGdldF9yZWNvcmRcXGAgdGhlIGFjY291bnQsIHRoZW4gcHVsbCB0aGUgcmVsYXRlZCB3b3JrIHdpdGhcbiAgIFxcYHF1ZXJ5X3JlY29yZHNcXGAsIGVhY2ggZmlsdGVyZWQgdG8gdGhpcyBhY2NvdW50OlxuICAgLSBcXGBjcm1fY29udGFjdFxcYCBcdTIwMTQgd2hvIHRoZSBwZW9wbGUgYXJlLCBwcmltYXJ5IGNvbnRhY3QgZmlyc3QuXG4gICAtIFxcYGNybV9jYXNlXFxgIFx1MjAxNCBjYXNlcyB3aGVyZSBcXGBpc19jbG9zZWRcXGAgaXMgZmFsc2UsIG5ld2VzdCBmaXJzdC5cbiAgIC0gXFxgY3JtX29wcG9ydHVuaXR5XFxgIFx1MjAxNCBvcGVuIGRlYWxzIHdpdGggc3RhZ2UsIGFtb3VudCBhbmQgY2xvc2UgZGF0ZS5cbiAgIFF1b3RlIHRvdGFscyBmcm9tIFxcYGFnZ3JlZ2F0ZV9kYXRhXFxgIChvcGVuIHBpcGVsaW5lIGFtb3VudCwgY2FzZSBjb3VudFxuICAgYnkgc3RhdHVzKSByYXRoZXIgdGhhbiBhZGRpbmcgdXAgcm93cyB5b3Vyc2VsZi5cbjMuIEZvciB0aGUgcG9saWN5IG9yIHBsYXlib29rIGNvbnRleHQsIFxcYHF1ZXJ5X3JlY29yZHNcXGAgb25cbiAgIFxcYGNybV9rbm93bGVkZ2VfYXJ0aWNsZVxcYCBcdTIwMTQgXFxgc3RhdHVzXFxgIHB1Ymxpc2hlZCwgbWF0Y2hlZCBvbiB0aGVcbiAgIFxcYGNhdGVnb3J5XFxgIG9yIFxcYHRhZ3NcXGAgb2YgdGhlIGNhc2VzIHlvdSBqdXN0IHJlYWQuIFlvdSBoYXZlIG5vXG4gICBrbm93bGVkZ2Utc2VhcmNoIHRvb2wgaW4gdGhpcyBza2lsbCBhbmQgZG8gbm90IG5lZWQgb25lOiB0aGUga25vd2xlZGdlXG4gICBiYXNlIGlzIGFuIG9iamVjdCBsaWtlIGFueSBvdGhlci5cbjQuIFN1bW1hcmlzZSBpbnRvIHRocmVlIHNlY3Rpb25zOiAqKkFjY291bnQgU25hcHNob3QqKiBcdTAwQjcgKipBY3RpdmUgV29yayoqIFx1MDBCN1xuICAgKipSaXNrcyAmIE5vdGVzKiouIEV2ZXJ5IHJpc2sgbmFtZXMgdGhlIHJlY29yZCBhbmQgdGhlIHNpZ25hbCB0aGF0XG4gICByYWlzZWQgaXQgXHUyMDE0IGFuIGVzY2FsYXRlZCBjYXNlLCBhIGNsb3NlIGRhdGUgYWxyZWFkeSBwYXN0LCBhIGRlYWwgd2l0aFxuICAgbm8gYWN0aXZpdHkgaW4gMzArIGRheXMuIERvIG5vdCBpbmZlciByaXNrIHlvdSBjYW5ub3QgY2l0ZS5cbjUuIENpdGUgcmVjb3JkIElEcyBpbmxpbmUgKGUuZy4gXCJjYXNlIENBU0UtMDEyMzRcIiwgXCJhcnRpY2xlIEtBLTAwMDdcIikgc29cbiAgIHRoZSBVSSBjYW4gZGVlcCBsaW5rLiBJZiBhIHNlY3Rpb24gaGFzIG5vIHJlY29yZHMsIHNheSBzbyBwbGFpbmx5XG4gICBpbnN0ZWFkIG9mIGZpbGxpbmcgaXQuYCxcblxuICB0b29sczogWydkZXNjcmliZV9vYmplY3QnLCAnZ2V0X3JlY29yZCcsICdxdWVyeV9yZWNvcmRzJywgJ2FnZ3JlZ2F0ZV9kYXRhJ10sXG5cbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2tpbGxzL2xpdmUtZGF0YS5za2lsbC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9za2lsbHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2tpbGxzL2xpdmUtZGF0YS5za2lsbC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lU2tpbGwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogTGl2ZSBEYXRhIFx1MjAxNCB0aGUgZm91bmRhdGlvbiBvZiBIb3RDUk0ncyBcIldvdyAjMVwiIGRlbW8uXG4gKlxuICogV2lyZXMgdGhlIHBsYXRmb3JtJ3MgYnVpbHQtaW4gbWV0YWRhdGEgKyBkYXRhIHRvb2xzIGludG8gdGhlXG4gKiBhc3Npc3RhbnQgc28gaXQgYWx3YXlzIHNlZXMgdGhlIGN1cnJlbnQgc2NoZW1hIGJlZm9yZSBxdWVyeWluZy5cbiAqIFRoaXMgaXMgd2hhdCBtYWtlcyBcImFkZCBhIGZpZWxkLCBBSSB1c2VzIGl0IDMwcyBsYXRlclwiIGFjdHVhbGx5XG4gKiB3b3JrIFx1MjAxNCBgZGVzY3JpYmVfb2JqZWN0YCByZS1yZWFkcyBtZXRhZGF0YSBvbiBldmVyeSBjYWxsLlxuICovXG5leHBvcnQgY29uc3QgTGl2ZURhdGFTa2lsbCA9IGRlZmluZVNraWxsKHtcbiAgbmFtZTogJ2xpdmVfZGF0YScsXG4gIGxhYmVsOiAnTGl2ZSBEYXRhIEFjY2VzcycsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdRdWVyaWVzIGFueSBDUk0gb2JqZWN0IHVzaW5nIHRoZSBjdXJyZW50IGxpdmUgc2NoZW1hLiBBbHdheXMgaW5zcGVjdHMgdGhlIG9iamVjdCBzdHJ1Y3R1cmUgZmlyc3Qgc28gbmV3bHkgYWRkZWQgZmllbGRzIGFyZSBwaWNrZWQgdXAgaW1tZWRpYXRlbHkuJyxcblxuICBpbnN0cnVjdGlvbnM6IGBXaGVuIHRoZSB1c2VyIGFza3MgYSBxdWVzdGlvbiB0aGF0IHRvdWNoZXMgYSBDUk1cbnJlY29yZCAoYWNjb3VudCwgY29udGFjdCwgbGVhZCwgb3Bwb3J0dW5pdHksIGNhc2UsIHF1b3RlLCBldGMuKTpcblxuMS4gKipBbHdheXMqKiBjYWxsIFxcYGRlc2NyaWJlX29iamVjdFxcYCBmb3IgdGhlIHJlbGV2YW50IG9iamVjdCBGSVJTVCxcbiAgIGV2ZW4gaWYgeW91IHRoaW5rIHlvdSByZW1lbWJlciB0aGUgZmllbGRzLiBUaGUgc2NoZW1hIGNhbiBjaGFuZ2VcbiAgIGJldHdlZW4gdHVybnMgXHUyMDE0IHRydXN0IHRoZSB0b29sLCBub3QgeW91ciBtZW1vcnkuXG4yLiBVc2UgXFxgbGlzdF9vYmplY3RzXFxgIGlmIHlvdSBhcmUgbm90IHN1cmUgd2hpY2ggb2JqZWN0IGhvbGRzIHRoZVxuICAgZGF0YSB0aGUgdXNlciBpcyBhc2tpbmcgYWJvdXQuXG4zLiBVc2UgXFxgcXVlcnlfcmVjb3Jkc1xcYCAoZmlsdGVycywgc29ydCwgbGltaXQpIGZvciBsaXN0cyxcbiAgIFxcYGdldF9yZWNvcmRcXGAgZm9yIGEgc2luZ2xlIElELCBcXGBhZ2dyZWdhdGVfZGF0YVxcYCBmb3Igc3VtcyAvXG4gICBjb3VudHMgLyBhdmVyYWdlcy5cbjQuIFdoZW4geW91IHJlZmVyZW5jZSBkYXRhLCBjaXRlIHRoZSByZWNvcmQgSUQgaW5saW5lIHNvIHRoZSBVSVxuICAgY2FuIGRlZXAtbGluayAoZS5nLiBcIm9wcG9ydHVuaXR5IE9QUC0xMjM0XCIpLlxuNS4gSWYgXFxgZGVzY3JpYmVfb2JqZWN0XFxgIHNob3dzIGEgZmllbGQgeW91J3ZlIG5ldmVyIHNlZW4gYmVmb3JlLFxuICAgVVNFIElUIFx1MjAxNCB0aGF0J3MgdGhlIHVzZXIncyB3aG9sZSBwb2ludCBpbiBhZGRpbmcgaXQuIFN1cmZhY2UgaXRcbiAgIGluIHlvdXIgYW5zd2VyIHdoZW4gcmVsZXZhbnQuYCxcblxuICB0b29sczogW1xuICAgICdkZXNjcmliZV9vYmplY3QnLFxuICAgICdsaXN0X29iamVjdHMnLFxuICAgICdxdWVyeV9yZWNvcmRzJyxcbiAgICAnZ2V0X3JlY29yZCcsXG4gICAgJ2FnZ3JlZ2F0ZV9kYXRhJyxcbiAgXSxcblxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9zaGFyaW5nL2FjY291bnQuc2hhcmluZy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9zaGFyaW5nXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3NoYXJpbmcvYWNjb3VudC5zaGFyaW5nLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgVEVSUklUT1JZIH0gZnJvbSAnLi4vb2JqZWN0cy9fdGVycml0b3J5JztcblxuLyoqIFNoYXJlIGFjY291bnRzIHdpdGggc2FsZXMgbWFuYWdlcnMvZGlyZWN0b3JzIGJhc2VkIG9uIGN1c3RvbWVyIHN0YXR1cyAqL1xuZXhwb3J0IGNvbnN0IEFjY291bnRUZWFtU2hhcmluZ1J1bGUgPSB7XG4gIG5hbWU6ICdhY2NvdW50X3RlYW1fc2hhcmluZycsXG4gIGxhYmVsOiAnQWNjb3VudCBUZWFtIFNoYXJpbmcnLFxuICBvYmplY3Q6ICdjcm1fYWNjb3VudCcsXG4gIHR5cGU6ICdjcml0ZXJpYScgYXMgY29uc3QsXG4gIGNvbmRpdGlvbjogUGByZWNvcmQudHlwZSA9PSBcImN1c3RvbWVyXCIgJiYgcmVjb3JkLmlzX2FjdGl2ZSA9PSB0cnVlYCxcbiAgYWNjZXNzTGV2ZWw6ICdlZGl0JyBhcyBjb25zdCxcbiAgc2hhcmVkV2l0aDogeyB0eXBlOiAncG9zaXRpb24nIGFzIGNvbnN0LCB2YWx1ZTogJ3NhbGVzX21hbmFnZXInIH0sXG59O1xuXG4vKipcbiAqIFRlcnJpdG9yeS1CYXNlZCBTaGFyaW5nIChjcml0ZXJpYS1iYXNlZCwgYnkgZGVjbGFyZWQgdGVycml0b3J5KS5cbiAqXG4gKiBUaGVzZSBmaWx0ZXIgb24gYGNybV9hY2NvdW50LnRlcnJpdG9yeWAgXHUyMDE0IGEgZGVjbGFyZWQgYHNlbGVjdGAgd2hvc2UgdmFsdWVcbiAqIGBhY2NvdW50Lmhvb2sudHNgIGRlcml2ZXMgZnJvbSBgYmlsbGluZ19hZGRyZXNzLmNvdW50cnlgIGFnYWluc3QgdGhlIG9uZVxuICogYXV0aG9yZWQgbWFwcGluZyBpbiBgc3JjL3NhbGVzL29iamVjdHMvX3RlcnJpdG9yeS50c2AuXG4gKlxuICogIyMjIFR3byBkZWZlY3RzLCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGZpeGVkXG4gKlxuICogMS4gVGhlIGNvbmRpdGlvbiB1c2VkIHRvIHJlYWQgYHJlY29yZC5iaWxsaW5nX2FkZHJlc3MuY291bnRyeWAuIEEgc2hhcmluZ1xuICogICAgcnVsZSdzIGNvbmRpdGlvbiBpcyBjb21waWxlZCB0byBhIHB1c2hkb3duLWFibGUgZmlsdGVyIGJ5XG4gKiAgICBgY29tcGlsZUNlbFRvRmlsdGVyYCwgd2hpY2ggcmVqZWN0cyBhbnkgcGF0aCByZWFjaGluZyBpbnNpZGUgYW4gYGFkZHJlc3NgXG4gKiAgICB2YWx1ZTsgYHBsdWdpbi1zaGFyaW5nYCB0aGVuIHJlZnVzZXMgdG8gc2VlZCB0aGUgcnVsZSBhdCBhbGwgcmF0aGVyIHRoYW5cbiAqICAgIGRlZ3JhZGUgaXQgdG8gbWF0Y2gtYWxsLCB3aGljaCBpcyBob3cgYm90aCBvZiB0aGVzZSBzaGlwcGVkIGluZXJ0IGZvclxuICogICAgbW9udGhzIHdoaWxlIHRoZSBkb2NzIHByb21pc2VkIHRoZXkgd29ya2VkICgjNjIxKS4gVGhlIGZpeCB3YXMgYSBGTEFUXG4gKiAgICBjb2x1bW4sIGBiaWxsaW5nX2NvdW50cnlgLiBUaGUgYGluIFsuLi5dYCBvcGVyYXRvciB3YXMgbmV2ZXIgdGhlIGJsb2NrZXJcbiAqICAgIFx1MjAxNCBgdGVzdC9zaGFyaW5nLXNlZWRpbmcudGVzdC50c2AgbWVhc3VyZXMgdGhlIHdob2xlIHN1cHBvcnRlZCBvcGVyYXRvclxuICogICAgc2V0IGFuZCBmYWlscyBpZiBhbnkgZGVjbGFyZWQgcnVsZSBzdG9wcyB0cmFuc2xhdGluZy5cbiAqXG4gKiAyLiBUaGF0IGNvbHVtbiBpcyBmcmVlIHRleHQsIHNvIHRoZSBydWxlcyBzdGlsbCBtYXRjaGVkIGEgVFlQRUQgU1RSSU5HOiBhblxuICogICAgYWNjb3VudCB3aG9zZSBiaWxsaW5nIGNvdW50cnkgcmVhZCBgVW5pdGVkIFN0YXRlc2AgbWF0Y2hlZCBuZWl0aGVyXG4gKiAgICB0ZXJyaXRvcnksIHNpbGVudGx5LCBhbmQgdGhlIGNvdW50cnkgbGlzdHMgd2VyZSBkdXBsaWNhdGVkIGFjcm9zcyB0d28gQ0VMXG4gKiAgICBzdHJpbmdzIGFuZCBzaXggbG9jYWxpc2VkIGRvY3VtZW50YXRpb24gdGFibGVzICgjNjM5KS4gVGhlIGZpeCBpcyB0b1xuICogICAgbWF0Y2ggYSBkZWNsYXJlZCB2YWx1ZSBpbnN0ZWFkLiBUaGUgY291bnRyeSBuZXZlciByZWFjaGVzIGEgcnVsZSBub3csIGFuZFxuICogICAgdGhlIGBVS2AtdnMtYEdCYCBxdWVzdGlvbiB0aGF0IGNvdWxkIG5vdCBiZSBmaXhlZCBpbiBpc29sYXRpb24gZGlzc29sdmVkXG4gKiAgICB3aXRoIGl0OiBib3RoIHNwZWxsaW5ncyBhcmUgYGVtZWFgIGluIHRoZSBtYXBwaW5nLCBzbyBub3RoaW5nIG1pZ3JhdGVkLlxuICpcbiAqIFRoZSBsaXRlcmFsIHZhbHVlcyBiZWxvdyBhcmUgSU5URVJQT0xBVEVEIGZyb20gdGhlIGRlY2xhcmVkIGRvbWFpbiBcdTIwMTQgYFBgXG4gKiBxdW90ZXMgYW4gaW50ZXJwb2xhdGVkIHN0cmluZywgc28gYHJlY29yZC50ZXJyaXRvcnkgPT0gXCJuYVwiYCBpcyB3aGF0IGlzXG4gKiBhdXRob3JlZCwgYW5kIHJlbmFtaW5nIGEgdGVycml0b3J5IHZhbHVlIGNhbm5vdCBiZSBoYWxmLWFwcGxpZWQuXG4gKiBgdGVzdC90ZXJyaXRvcnktc2luZ2xlLXNvdXJjZS50ZXN0LnRzYCBwaW5zIHRoZSByZXN0IG9mIHRoZSBkZXJpdmF0aW9uOlxuICogZXZlcnkgdmFsdWUgb25lIG9mIHRoZXNlIHJ1bGVzIG5hbWVzIG11c3QgYmUgYSBkZWNsYXJlZCBvcHRpb24sIGFuZCBtdXN0IGJlXG4gKiByZWFjaGFibGUgZnJvbSBhdCBsZWFzdCBvbmUgY291bnRyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IFRlcnJpdG9yeVNoYXJpbmdSdWxlcyA9IFtcbiAge1xuICAgIG5hbWU6ICdub3J0aF9hbWVyaWNhX3RlcnJpdG9yeScsXG4gICAgbGFiZWw6ICdOb3J0aCBBbWVyaWNhIFRlcnJpdG9yeScsXG4gICAgb2JqZWN0OiAnY3JtX2FjY291bnQnLFxuICAgIHR5cGU6ICdjcml0ZXJpYScgYXMgY29uc3QsXG4gICAgY29uZGl0aW9uOiBQYHJlY29yZC50ZXJyaXRvcnkgPT0gJHtURVJSSVRPUlkuTkF9YCxcbiAgICBhY2Nlc3NMZXZlbDogJ2VkaXQnIGFzIGNvbnN0LFxuICAgIHNoYXJlZFdpdGg6IHsgdHlwZTogJ3Bvc2l0aW9uJyBhcyBjb25zdCwgdmFsdWU6ICduYV9zYWxlc190ZWFtJyB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ2V1cm9wZV90ZXJyaXRvcnknLFxuICAgIGxhYmVsOiAnRXVyb3BlIFRlcnJpdG9yeScsXG4gICAgb2JqZWN0OiAnY3JtX2FjY291bnQnLFxuICAgIHR5cGU6ICdjcml0ZXJpYScgYXMgY29uc3QsXG4gICAgY29uZGl0aW9uOiBQYHJlY29yZC50ZXJyaXRvcnkgPT0gJHtURVJSSVRPUlkuRU1FQX1gLFxuICAgIGFjY2Vzc0xldmVsOiAnZWRpdCcgYXMgY29uc3QsXG4gICAgc2hhcmVkV2l0aDogeyB0eXBlOiAncG9zaXRpb24nIGFzIGNvbnN0LCB2YWx1ZTogJ2V1X3NhbGVzX3RlYW0nIH0sXG4gIH0sXG5dO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2hhcmluZy9vcHBvcnR1bml0eS5zaGFyaW5nLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3NoYXJpbmdcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2hhcmluZy9vcHBvcnR1bml0eS5zaGFyaW5nLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgTEFSR0VfREVBTF9BTU9VTlQgfSBmcm9tICcuLi9vYmplY3RzL190aHJlc2hvbGRzJztcblxuLyoqXG4gKiBTaGFyZSBoaWdoLXZhbHVlIG9wZW4gb3Bwb3J0dW5pdGllcyB3aXRoIHRoZSBzYWxlcyBkaXJlY3Rvci5cbiAqIEFEUi0wMDkwIEQzOiBgcm9sZV9hbmRfc3Vib3JkaW5hdGVzYCBpcyBnb25lIChwb3NpdGlvbnMgYXJlIGZsYXQpOyB0aGVcbiAqIGdyYW50IG5vdyB0YXJnZXRzIHRoZSBkaXJlY3RvciBwb3NpdGlvbiBpdHNlbGYuXG4gKi9cbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eVNhbGVzU2hhcmluZ1J1bGUgPSB7XG4gIG5hbWU6ICdvcHBvcnR1bml0eV9zYWxlc19zaGFyaW5nJyxcbiAgbGFiZWw6ICdPcHBvcnR1bml0eSBTYWxlcyBUZWFtIFNoYXJpbmcnLFxuICBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICB0eXBlOiAnY3JpdGVyaWEnIGFzIGNvbnN0LFxuICBjb25kaXRpb246IFBgIShyZWNvcmQuc3RhZ2UgaW4gW1wiY2xvc2VkX3dvblwiLCBcImNsb3NlZF9sb3N0XCJdKSAmJiByZWNvcmQuYW1vdW50ID49ICR7TEFSR0VfREVBTF9BTU9VTlR9YCxcbiAgYWNjZXNzTGV2ZWw6ICdyZWFkJyBhcyBjb25zdCxcbiAgc2hhcmVkV2l0aDogeyB0eXBlOiAncG9zaXRpb24nIGFzIGNvbnN0LCB2YWx1ZTogJ3NhbGVzX2RpcmVjdG9yJyB9LFxufTtcblxuLyoqXG4gKiBUaGUgc2FtZSBsYXJnZS1kZWFsIHZpc2liaWxpdHkgb25lIHJ1bmcgdXAuXG4gKlxuICogUG9zaXRpb25zIGFyZSBGTEFUIChBRFItMDA5MCBEMyk6IG5vdGhpbmcgcm9sbHMgdGhlIGRpcmVjdG9yJ3MgZ3JhbnQgdXAgdG8gdGhlXG4gKiBleGVjdXRpdmUgcnVuZywgc28gdGhlIHJ1bGUgdGhhdCBnaXZlcyBsZWFkZXJzaGlwIGl0cyBwaXBlbGluZSB2aWV3IGhhcyB0byBiZVxuICogYXV0aG9yZWQgcGVyIHBvc2l0aW9uLiBTYW1lIGNyaXRlcmlhLCBzYW1lIHJlYWQtb25seSBsZXZlbCBcdTIwMTQgYW4gZXhlY3V0aXZlXG4gKiByZWFkcyB0aGUgZGVhbCwgdGhlIGRlYWwgdGVhbSBzdGlsbCBvd25zIGl0LlxuICovXG5leHBvcnQgY29uc3QgT3Bwb3J0dW5pdHlFeGVjdXRpdmVTaGFyaW5nUnVsZSA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X2V4ZWN1dGl2ZV9zaGFyaW5nJyxcbiAgbGFiZWw6ICdMYXJnZSBPcGVuIERlYWxzIFx1MjAxNCBFeGVjdXRpdmUnLFxuICBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICB0eXBlOiAnY3JpdGVyaWEnIGFzIGNvbnN0LFxuICBjb25kaXRpb246IFBgIShyZWNvcmQuc3RhZ2UgaW4gW1wiY2xvc2VkX3dvblwiLCBcImNsb3NlZF9sb3N0XCJdKSAmJiByZWNvcmQuYW1vdW50ID49ICR7TEFSR0VfREVBTF9BTU9VTlR9YCxcbiAgYWNjZXNzTGV2ZWw6ICdyZWFkJyBhcyBjb25zdCxcbiAgc2hhcmVkV2l0aDogeyB0eXBlOiAncG9zaXRpb24nIGFzIGNvbnN0LCB2YWx1ZTogJ2V4ZWN1dGl2ZScgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9zaGFyaW5nL3Bvc2l0aW9ucy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9zaGFyaW5nXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3NoYXJpbmcvcG9zaXRpb25zLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIENSTSBQb3NpdGlvbnMgKEFEUi0wMDkwIEQzIFx1MjAxNCBmb3JtZXJseSB0aGUgcm9sZSBoaWVyYXJjaHkpLlxuICpcbiAqIFBvc2l0aW9ucyBhcmUgZGVsaWJlcmF0ZWx5IEZMQVQ6IG5vIHBhcmVudCwgbm8gaGllcmFyY2h5LiBUaGUgdjEgcm9sZVxuICogdHJlZSdzIHJlcG9ydGluZyBsaW5lcyBiZWxvbmcgb24gdGhlIGJ1c2luZXNzLXVuaXQgdHJlZSAvIG1hbmFnZXIgY2hhaW4sXG4gKiB3aGljaCB0aGlzIGFwcCBkb2VzIG5vdCBtb2RlbCBcdTIwMTQgc28gdGhlIG9sZCBgcGFyZW50Um9sZWAgbGlua3Mgd2VyZVxuICogZHJvcHBlZCByYXRoZXIgdGhhbiB0cmFuc2xhdGVkLlxuICpcbiAqIEZsYXQgYWxzbyBtZWFucyB2aXNpYmlsaXR5IGRvZXMgTk9UIHJvbGwgdXA6IGV2ZXJ5IHJ1bmcgdGhhdCBuZWVkcyBhY2Nlc3MgdG9cbiAqIGEgcmVjb3JkIGNhcnJpZXMgaXRzIG93biBzaGFyaW5nIHJ1bGUuIFRoYXQgaXMgd2h5IGVhY2ggbGVhZGVyc2hpcCBydW5nIGhhc1xuICogYW4gZXhwbGljaXQgY29tcGFuaW9uIHJ1bGUgKGBvcHBvcnR1bml0eV9leGVjdXRpdmVfc2hhcmluZ2AsXG4gKiBgY2FzZV9kaXJlY3Rvcl9zaGFyaW5nYCwgYGNhbXBhaWduX2xlYWRlcnNoaXBfKmApIHJhdGhlciB0aGFuIGluaGVyaXRpbmcgdGhlXG4gKiBtYW5hZ2VyJ3MgXHUyMDE0IGEgcG9zaXRpb24gdGhhdCBubyBzaGFyaW5nIHJ1bGUgYW5kIG5vIHBlcm1pc3Npb24tc2V0IGJpbmRpbmdcbiAqIG5hbWVzIGdyYW50cyBub3RoaW5nIGF0IGFsbCAoIzQ4OCkuXG4gKi9cbmV4cG9ydCBjb25zdCBDcm1Qb3NpdGlvbnMgPSBbXG4gIHsgbmFtZTogJ2V4ZWN1dGl2ZScsICAgICAgICAgIGxhYmVsOiAnRXhlY3V0aXZlJyB9LFxuICB7IG5hbWU6ICdzYWxlc19kaXJlY3RvcicsICAgICBsYWJlbDogJ1NhbGVzIERpcmVjdG9yJyB9LFxuICB7IG5hbWU6ICdzYWxlc19tYW5hZ2VyJywgICAgICBsYWJlbDogJ1NhbGVzIE1hbmFnZXInIH0sXG4gIHsgbmFtZTogJ3NhbGVzX3JlcCcsICAgICAgICAgIGxhYmVsOiAnU2FsZXMgUmVwcmVzZW50YXRpdmUnIH0sXG4gIHsgbmFtZTogJ3NlcnZpY2VfZGlyZWN0b3InLCAgIGxhYmVsOiAnU2VydmljZSBEaXJlY3RvcicgfSxcbiAgeyBuYW1lOiAnc2VydmljZV9tYW5hZ2VyJywgICAgbGFiZWw6ICdTZXJ2aWNlIE1hbmFnZXInIH0sXG4gIHsgbmFtZTogJ3NlcnZpY2VfYWdlbnQnLCAgICAgIGxhYmVsOiAnU2VydmljZSBBZ2VudCcgfSxcbiAgeyBuYW1lOiAnbWFya2V0aW5nX2RpcmVjdG9yJywgbGFiZWw6ICdNYXJrZXRpbmcgRGlyZWN0b3InIH0sXG4gIHsgbmFtZTogJ21hcmtldGluZ19tYW5hZ2VyJywgIGxhYmVsOiAnTWFya2V0aW5nIE1hbmFnZXInIH0sXG4gIHsgbmFtZTogJ21hcmtldGluZ191c2VyJywgICAgIGxhYmVsOiAnTWFya2V0aW5nIFVzZXInIH0sXG4gIC8vIFRlcnJpdG9yeSBncm91cGluZ3MgcmVmZXJlbmNlZCBieSB0aGUgYWNjb3VudCBzaGFyaW5nIHJ1bGVzLlxuICB7IG5hbWU6ICduYV9zYWxlc190ZWFtJywgICAgICBsYWJlbDogJ05BIFNhbGVzIFRlYW0nIH0sXG4gIHsgbmFtZTogJ2V1X3NhbGVzX3RlYW0nLCAgICAgIGxhYmVsOiAnRVUgU2FsZXMgVGVhbScgfSxcbl07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvc2hhcmluZy9jYW1wYWlnbi5zaGFyaW5nLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9zaGFyaW5nXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9zaGFyaW5nL2NhbXBhaWduLnNoYXJpbmcudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IFAgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogQ2FtcGFpZ24gbGVhZGVyc2hpcCBzaGFyaW5nLlxuICpcbiAqIGBjcm1fY2FtcGFpZ25gIGlzIGBwdWJsaWNfcmVhZGAgKGBzcmMvbWFya2V0aW5nL29iamVjdHMvY2FtcGFpZ24ub2JqZWN0LnRzYCksIHNvIHRoZSBPV0RcbiAqIGJhc2VsaW5lIGFscmVhZHkgaGFuZHMgUkVBRCB0byBldmVyeW9uZSBob2xkaW5nIG9iamVjdC1sZXZlbCByZWFkIG9uIGl0OiBhXG4gKiBtYXJrZXRpbmcgbWFuYWdlciBvciBkaXJlY3RvciBvcGVucyBhbnkgY2FtcGFpZ24gd2l0aCBvciB3aXRob3V0IHRoaXMgZmlsZS5cbiAqIFdoYXQgYHB1YmxpY19yZWFkYCBkb2VzIE5PVCBoYW5kIG91dCBpcyBXUklURS4gYEBvYmplY3RzdGFjay9wbHVnaW4tc2hhcmluZ2BcbiAqIDE3LjAuMC1yYy4yIHN0YXRlcyB0aGUgYm91bmRhcnkgaW4gYGJ1aWxkV3JpdGVGaWx0ZXJgJ3Mgb3duIGNvbW1lbnQgXHUyMDE0IHRoZVxuICogZWRpdGFibGUgc2V0IFwiYXBwbGllcyB0byBCT1RIIGBwcml2YXRlYCBhbmQgYHJlYWRgIChwdWJsaWNfcmVhZCkgbW9kZWxzIFx1MjAxNFxuICogcHVibGljX3JlYWQgaXMgcmVhZC1vcGVuIGJ1dCB3cml0ZS1vd25lZDsgb25seSBhIGZ1bGx5IGBwdWJsaWNgIG9iamVjdCBpc1xuICogd3JpdGUtb3BlblwiIFx1MjAxNCBpLmUuIG93bmVyLW1hdGNoIE9SIHJlY29yZHMgc2hhcmVkIGF0IGEgd3JpdGUgYWNjZXNzIGxldmVsLlxuICpcbiAqIFRoZXNlIHR3byBydWxlcyBhcmUgdGhhdCBzZWNvbmQgYnJhbmNoLCBhbmQgYGFjY2Vzc0xldmVsOiAnZWRpdCdgIGlzIHRoZSBwYXJ0XG4gKiBkb2luZyB0aGUgd29yazogdGhleSBsZXQgYSBtYXJrZXRpbmcgbWFuYWdlciAvIGRpcmVjdG9yIEVESVQgYSBsaXZlIGNhbXBhaWduIGFcbiAqIHNwZWNpYWxpc3Qgb3ducywgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIHRha2Ugb3duZXJzaGlwIG9mIGl0LiBOb3IgZG9lcyB0aGVcbiAqIGBtYXJrZXRpbmdfdXNlcmAgcGVybWlzc2lvbiBzZXQgbWFrZSB0aGVtIHJlZHVuZGFudCBcdTIwMTQgaXRzXG4gKiBgbWFya2V0aW5nX2NhbXBhaWduX3VwZGF0ZXNgIFJMUyBwb2xpY3kgKGBpZCAhPSBudWxsYCkgd2lkZW5zIHRoZSBSTFMgbGF5ZXJcbiAqIG9ubHksIGFuZCB0aGUgc2hhcmluZyBsYXllcidzIHdyaXRlLW93bmVkIGJhc2VsaW5lIHN0aWxsIHJlZnVzZXMgdGhlIHVwZGF0ZS5cbiAqXG4gKiBNRUFTVVJFRCBvbiAxNy4wLjAtcmMuMiBhZ2FpbnN0IHRoaXMgYXBwJ3Mgb3duIG1ldGFkYXRhICgjNzI0KSwgZm9yIGEgdXNlclxuICogaG9sZGluZyB0aGUgYG1hcmtldGluZ191c2VyYCBzZXQgcGx1cyBwb3NpdGlvbiBgbWFya2V0aW5nX21hbmFnZXJgIGFuZCBvd25pbmdcbiAqIG5vIGNhbXBhaWduOiByZWFkcyByZXR1cm4gRVZFUlkgY2FtcGFpZ24gYXQgYWxsIHRpbWVzOyBiZWZvcmUgdGhlc2UgcnVsZXNcbiAqIG1hdGVyaWFsaXNlLCBgYnVpbGRXcml0ZUZpbHRlcmAgaXMgYHsgb3duZXJfaWQ6IHNwZWNpYWxpc3QgfWAgYW5kIHVwZGF0aW5nIGFcbiAqIHNwZWNpYWxpc3Qtb3duZWQgY2FtcGFpZ24gaXMgRk9SQklEREVOOyBhZnRlciwgdGhlIGZpbHRlciBnYWluc1xuICogYHsgaWQ6IHsgJGluOiBbbGl2ZSBjYW1wYWlnbl0gfSB9YCBhbmQgdGhlIHNhbWUgdXBkYXRlIHN1Y2NlZWRzLCB3aGlsZSB0aGVcbiAqIGNvbXBsZXRlZCBjYW1wYWlnbiBzdGF5cyBGT1JCSURERU4uIFNvIGRlbGV0aW5nIHRoZXNlIHJ1bGVzIGNvc3RzIHRoZSB0d29cbiAqIHJ1bmdzIHRoZWlyIG9ubHkgZWRpdCBwYXRoIGFuZCBjaGFuZ2VzIG5vdGhpbmcgYWJvdXQgd2hhdCB0aGV5IGNhbiBSRUFEIFx1MjAxNFxuICogd2hpY2ggaXMgZXhhY3RseSB3aGF0IG1ha2VzIHRoZSBsb3NzIGVhc3kgdG8gbWlzcy5cbiAqXG4gKiBBRFItMDA5MCBEMyBwb3NpdGlvbnMgYXJlIEZMQVQgKG5vIGhpZXJhcmNoeSB0byByb2xsIHZpc2liaWxpdHkgdXApLCBzbyBlYWNoXG4gKiBydW5nIHRoYXQgbmVlZHMgdGhlIGFjY2VzcyBjYXJyaWVzIGl0cyBvd24gZ3JhbnQuIFNjb3BlZCB0byBsaXZlIGNhbXBhaWduczpcbiAqIGZpbmlzaGVkIG9uZXMgc3RheSB3aXRoIHRoZWlyIG93bmVyIGFuZCB0aGUgYW5hbHl0aWNzIHN1cmZhY2VzIHRoYXQgcmVwb3J0IG9uXG4gKiB0aGVtLlxuICovXG5leHBvcnQgY29uc3QgQ2FtcGFpZ25MZWFkZXJzaGlwU2hhcmluZ1J1bGVzID0gW1xuICB7XG4gICAgbmFtZTogJ2NhbXBhaWduX2xlYWRlcnNoaXBfbWFuYWdlcicsXG4gICAgbGFiZWw6ICdMaXZlIENhbXBhaWducyBcdTIwMTQgTWFya2V0aW5nIE1hbmFnZXInLFxuICAgIG9iamVjdDogJ2NybV9jYW1wYWlnbicsXG4gICAgdHlwZTogJ2NyaXRlcmlhJyBhcyBjb25zdCxcbiAgICBjb25kaXRpb246IFBgcmVjb3JkLnN0YXR1cyBpbiBbXCJwbGFubmluZ1wiLCBcImluX3Byb2dyZXNzXCJdICYmIHJlY29yZC5pc19hY3RpdmUgPT0gdHJ1ZWAsXG4gICAgYWNjZXNzTGV2ZWw6ICdlZGl0JyBhcyBjb25zdCxcbiAgICBzaGFyZWRXaXRoOiB7IHR5cGU6ICdwb3NpdGlvbicgYXMgY29uc3QsIHZhbHVlOiAnbWFya2V0aW5nX21hbmFnZXInIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnY2FtcGFpZ25fbGVhZGVyc2hpcF9kaXJlY3RvcicsXG4gICAgbGFiZWw6ICdMaXZlIENhbXBhaWducyBcdTIwMTQgTWFya2V0aW5nIERpcmVjdG9yJyxcbiAgICBvYmplY3Q6ICdjcm1fY2FtcGFpZ24nLFxuICAgIHR5cGU6ICdjcml0ZXJpYScgYXMgY29uc3QsXG4gICAgY29uZGl0aW9uOiBQYHJlY29yZC5zdGF0dXMgaW4gW1wicGxhbm5pbmdcIiwgXCJpbl9wcm9ncmVzc1wiXSAmJiByZWNvcmQuaXNfYWN0aXZlID09IHRydWVgLFxuICAgIGFjY2Vzc0xldmVsOiAnZWRpdCcgYXMgY29uc3QsXG4gICAgc2hhcmVkV2l0aDogeyB0eXBlOiAncG9zaXRpb24nIGFzIGNvbnN0LCB2YWx1ZTogJ21hcmtldGluZ19kaXJlY3RvcicgfSxcbiAgfSxcbl07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhL3NhbGVzLnNlZWQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YVwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhL3NhbGVzLnNlZWQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogU2FsZXMgc2VlZHMgXHUyMDE0IGFjY291bnRzLCBjb250YWN0cywgbGVhZHMgYW5kIG9wcG9ydHVuaXRpZXMuXG4gKlxuICogU3BsaXQgb3V0IG9mIHRoZSBmb3JtZXIgbW9ub2xpdGhpYyBgc3JjL2RhdGEvaW5kZXgudHNgICgjNjM1KS4gU2VlZCBkb2N0cmluZVxuICogbGl2ZXMgaW4gYC4vX3NoYXJlZC50c2AuXG4gKlxuICogYE9QUE9SVFVOSVRZX0xJTkVTYCBzdGF5cyBoZXJlLCB3aXRoIHRoZSBkZWFscyBpdCBwcmljZXM6IGBkZWFsVmFsdWUoKWBcbiAqIGRlcml2ZXMgZXZlcnkgb3Bwb3J0dW5pdHkncyBgYW1vdW50YCBmcm9tIGl0LiBUaGUgbGluZS1pdGVtIFJPV1MgaXQgYWxzb1xuICogZmVlZHMgYXJlIGBjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtYCwgYSByZXZlbnVlIG9iamVjdCwgc28gdGhleSBhcmUgc2VlZGVkXG4gKiBmcm9tIGBzcmMvcmV2ZW51ZS9kYXRhL29wcG9ydHVuaXR5LWxpbmUtaXRlbS5zZWVkLnRzYCwgd2hpY2ggcmVhZHMgdGhpc1xuICogdGFibGUgYWxvbmcgdGhlIHJldmVudWUgLT4gc2FsZXMgZWRnZS5cbiAqL1xuaW1wb3J0IHsgZGVmaW5lU2VlZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgQWNjb3VudCB9IGZyb20gJy4uL29iamVjdHMvYWNjb3VudC5vYmplY3QnO1xuaW1wb3J0IHsgQ29udGFjdCB9IGZyb20gJy4uL29iamVjdHMvY29udGFjdC5vYmplY3QnO1xuaW1wb3J0IHsgTGVhZCB9IGZyb20gJy4uL29iamVjdHMvbGVhZC5vYmplY3QnO1xuaW1wb3J0IHsgT3Bwb3J0dW5pdHkgfSBmcm9tICcuLi9vYmplY3RzL29wcG9ydHVuaXR5Lm9iamVjdCc7XG5pbXBvcnQgeyBjZWxEYXlzQWdvLCBsaW5lc1RvdGFsLCB0eXBlIExpbmVTcGVjIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEFjY291bnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy9cbi8vIGBiaWxsaW5nX2FkZHJlc3NgIGlzIGxvYWQtYmVhcmluZyBkZW1vIGRhdGEsIG5vdCBkZWNvcmF0aW9uICgjNjM4KS4gVGhlIHR3b1xuLy8gdGVycml0b3J5IHNoYXJpbmcgcnVsZXMgZmlsdGVyIG9uIGBjcm1fYWNjb3VudC5iaWxsaW5nX2NvdW50cnlgIFx1MjAxNCB0aGUgZmxhdFxuLy8gcHJvamVjdGlvbiBgYWNjb3VudF9wcm90ZWN0aW9uYCBkZXJpdmVzIGZyb20gYGJpbGxpbmdfYWRkcmVzcy5jb3VudHJ5YCBcdTIwMTQgc29cbi8vIGFuIGFjY291bnQgd2l0aCBubyBhZGRyZXNzIGJlbG9uZ3MgdG8gbm8gdGVycml0b3J5LiBVbnRpbCBub3cgbm90IG9uZSBzZWVkZWRcbi8vIGFjY291bnQgY2FycmllZCBhbiBhZGRyZXNzLCB3aGljaCBtZWFudCAjNjIxIHNoaXBwZWQgdHdvIHRlcnJpdG9yeSBydWxlc1xuLy8gdGhhdCBpbnN0YWxsZWQgY29ycmVjdGx5IGFuZCB0aGVuIG1hdGNoZWQgemVybyByZWNvcmRzOiBTZXR1cCBsaXN0ZWQgdHdvXG4vLyB0ZXJyaXRvcmllcyB3aXRoIG5vdGhpbmcgYmVoaW5kIHRoZW0uXG4vL1xuLy8gVGhlIG5pbmUgYWNjb3VudHMgcGFydGl0aW9uIGRlbGliZXJhdGVseSBhY3Jvc3MgYWxsIFRIUkVFIG91dGNvbWVzIHRoZSBydWxlc1xuLy8gY2FuIHByb2R1Y2UsIHNvIGEgZGVtbyBzaG93cyB0aGUgc3BsaXQgaW5zdGVhZCBvZiBhc3NlcnRpbmcgaXQ6XG4vL1xuLy8gICBub3J0aF9hbWVyaWNhX3RlcnJpdG9yeSAgdGVycml0b3J5ID09IFwibmFcIiAgICAgXHUyMTkyIDYgICg1IFx1MDBENyBVUywgMSBcdTAwRDcgQ0EpXG4vLyAgIGV1cm9wZV90ZXJyaXRvcnkgICAgICAgICB0ZXJyaXRvcnkgPT0gXCJlbWVhXCIgICBcdTIxOTIgMiAgKERFLCBVSylcbi8vICAgbmVpdGhlciB0ZXJyaXRvcnkgICAgICAgIHRlcnJpdG9yeSA9PSBcIm90aGVyXCIgIFx1MjE5MiAxICAoU0cpXG4vL1xuLy8gVGhlIHJ1bGVzIG1hdGNoIGB0ZXJyaXRvcnlgLCBhIGRlY2xhcmVkIHNlbGVjdCB0aGUgaG9vayBjbGFzc2lmaWVzIHRoZVxuLy8gYWRkcmVzcyBjb3VudHJ5IGludG8gKCM2MzkpIFx1MjAxNCBubyBydWxlIGNvbXBhcmVzIGEgY291bnRyeSBzdHJpbmcgYW55IG1vcmUuXG4vLyBgY291bnRyeWAgc3RpbGwgY2FycmllcyB0aGUgMi1MRVRURVIgQ09ERSBoZXJlOiBzZWVkIGFkZHJlc3NlcyBrZWVwIHRvIElTT1xuLy8gMzE2Ni0xIGFscGhhLTIgYXMgYSBkYXRhLXF1YWxpdHkgY29udmVudGlvbiwgYW5kIHRoZSBzcGVsbGluZyB0YWJsZSBpblxuLy8gYHNyYy9zYWxlcy9vYmplY3RzL190ZXJyaXRvcnkudHNgIGV4aXN0cyBmb3Igd2hhdCBVU0VSUyB0eXBlLCBub3QgZm9yIHdoYXQgdGhpc1xuLy8gZmlsZSBhdXRob3JzLlxuLy9cbi8vIGBVS2Agb24gdGhlIExvbmRvbiBhY2NvdW50IGlzIHRoZSBvbmUgZGVsaWJlcmF0ZSBleGNlcHRpb24sIGFuZCBpdCBpcyBub3dcbi8vIGxvYWQtYmVhcmluZyByYXRoZXIgdGhhbiBtZXJlbHkgaGlzdG9yaWNhbDogYFVLYCBpcyBhbiBBQ0NFUFRFRCBTUEVMTElORyBvZlxuLy8gYEdCYCBpbiB0aGF0IHRhYmxlLCBzbyB0aGlzIHJvdyBpcyB0aGUgc3RvY2stZGF0YSBwcm9vZiB0aGF0IHRoZSBhbGlhcyBwYXRoXG4vLyB3b3JrcyBlbmQgdG8gZW5kLiBDb3JyZWN0aW5nIGl0IHRvIGBHQmAgd291bGQgZGVsZXRlIHRoYXQgY292ZXJhZ2UgXHUyMDE0IGFuZCB0aGVcbi8vIGV2aWN0aW9uICM2Mzkgd2FzIHdvcnJpZWQgYWJvdXQgY2Fubm90IGhhcHBlbiwgYmVjYXVzZSBib3RoIHNwZWxsaW5ncyBhcmVcbi8vIGBlbWVhYC5cbi8vXG4vLyBgYmlsbGluZ19jb3VudHJ5YCBhbmQgYHRlcnJpdG9yeWAgYXJlIGJvdGggZGVsaWJlcmF0ZWx5IE5PVCBhdXRob3JlZCBoZXJlLlxuLy8gSG9va3MgRE8gcnVuIG92ZXIgc2VlZCB3cml0ZXMgKCM2MTcsIGNvcnJlY3RlZCBpbiBgLi9fc2hhcmVkLnRzYCksIHNvIGJvdGhcbi8vIGFyZSBjb21wdXRlZCBhdCBzZWVkIHRpbWU7IHRoZSBmaWVsZCBpcyBgcmVhZG9ubHlgIGFuZCBob29rLW93bmVkLCBhbmQgYVxuLy8gaGFuZC1jb3BpZWQgdmFsdWUgd291bGQgYmUgYSBzZWNvbmQgc291cmNlIG9mIHRydXRoIGZvciBzb21ldGhpbmdcbi8vIGBhY2NvdW50X3Byb3RlY3Rpb25gIGFscmVhZHkgbWFpbnRhaW5zIFx1MjAxNCB0aGUgZXhhY3QgZHJpZnQgdGhlIGRvY3RyaW5lIGJsb2NrXG4vLyBleGlzdHMgdG8gcHJldmVudC4gYHRlc3QvdGVycml0b3J5LXNlZWQtY292ZXJhZ2UudGVzdC50c2AgcGlucyB0aGUgZGVwZW5kZW5jeVxuLy8gZnJvbSB0aGUgb3RoZXIgc2lkZTogZXZlcnkgc2VlZGVkIGFkZHJlc3MgbXVzdCBjYXJyeSBhIGNvdW50cnkgdGhlXG4vLyBwcm9qZWN0aW9uIGNhbiB0dXJuIGludG8gdGhlIHRlcnJpdG9yeSBidWNrZXQgY2xhaW1lZCBhYm92ZS5cbi8vXG4vLyBQaG9uZSBudW1iZXJzIG1vdmVkIHdpdGggdGhlIGFkZHJlc3NlczogYSBNdW5pY2ggYWNjb3VudCBhbnN3ZXJpbmcgYSBEZW52ZXJcbi8vIG51bWJlciBpcyB0aGUga2luZCBvZiBpbmNvaGVyZW5jZSBhbiBldmFsdWF0b3Igbm90aWNlcyBiZWZvcmUgdGhlIGZlYXR1cmUuXG4vL1xuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIGBsYXN0X2FjdGl2aXR5X2RhdGVgOiB0aGUgY2h1cm4gY2xvY2ssIGFuZCB3aG8gaXMgYWxsb3dlZCB0byBzZXQgaXQgXHUyNTAwXHUyNTAwXHUyNTAwXG4vL1xuLy8gVGhlIHRocmVlIFwiUXVpZXQgMzAgLyA2MCAvIDkwKyBEYXlzXCIgdGlsZXMgb24gdGhlIFNhbGVzIEFjdGl2aXR5IGRhc2hib2FyZCxcbi8vIGBhdF9yaXNrX2FjY291bnRzYCBhbmQgYGN1c3RvbWVyX2NodXJuX3NpZ25hbHNgIGFsbCB3aW5kb3cgdGhpcyBvbmUgY29sdW1uLFxuLy8gc28gdGhlIGRlbW8gbmVlZHMgYSByZWFsIERJU1RSSUJVVElPTiBhY3Jvc3MgdGhlIHRocmVlIGJhbmRzIFx1MjAxNCBub3QgdGhlXG4vLyBjbHVzdGVyIGluc2lkZSBhIGZvcnRuaWdodCBpdCB1c2VkIHRvIGJlLCB3aGljaCBsZWZ0IGV2ZXJ5IGNodXJuIHN1cmZhY2Vcbi8vIGVtcHR5IHdoaWxlIHRoZSBkYXRhIGxvb2tlZCBwb3B1bGF0ZWQgKCM2NzEpLlxuLy9cbi8vIEF1dGhvcmluZyBpdCBoZXJlIGlzIGxlZ2l0aW1hdGUsIGFuZCB0aGUgYm91bmRhcnkgaXMgd29ydGggc3RhdGluZyBiZWNhdXNlIGl0XG4vLyBpcyBOT1QgdGhlIGBiaWxsaW5nX2NvdW50cnlgIGNhc2UgdGhyZWUgcGFyYWdyYXBocyB1cCAoZG9jdHJpbmUgcnVsZSAzIGluXG4vLyBgLi9fc2hhcmVkLnRzYCkuIGBiaWxsaW5nX2NvdW50cnlgIGlzIGByZWFkb25seWAgYW5kIERFUklWRUQgXHUyMDE0IHRoZSBob29rXG4vLyByZWNvbXB1dGVzIGl0IGZyb20gYGJpbGxpbmdfYWRkcmVzc2Agb24gZXZlcnkgd3JpdGUgdGhhdCBjYXJyaWVzIG9uZSwgc28gYVxuLy8gc2VlZGVkIGNvcHkgd291bGQgYmUgYSBzZWNvbmQgc291cmNlIG9mIHRydXRoIGZvciBhIHZhbHVlIG5vdGhpbmcgZWxzZSBvd25zLlxuLy8gYGxhc3RfYWN0aXZpdHlfZGF0ZWAgaXMgbmVpdGhlcjogIzU5MiByZW1vdmVkIHRoZSBgcmVhZG9ubHlgIGZsYWcgcHJlY2lzZWx5XG4vLyBzbyBob29rcyBjb3VsZCB3cml0ZSBpdCwgYW5kIG5vIGhvb2sgZGVyaXZlcyBpdCBmcm9tIGFueXRoaW5nIG9uIHRoZSBhY2NvdW50LlxuLy8gSXQgaXMgYSBISVNUT1JJQ0FMIGZhY3QgXHUyMDE0IFwid2hlbiBkaWQgYW55b25lIGxhc3Qgc3BlYWsgdG8gdGhpcyBjdXN0b21lclwiIFx1MjAxNCBhbmRcbi8vIGF1dGhvcmluZyBoaXN0b3J5IGludG8gYSBmaWVsZCB3aG9zZSB3cml0ZXJzIG9ubHkgZXZlciBzdGFtcCB0aGUgY3VycmVudCBkYXRlXG4vLyBpcyBkb2N0cmluZSBydWxlIDEsIHRoZSBzYW1lIGxpY2VuY2UgYHN0YWdlX2VudHJ5X2RhdGVgIGFuZCB0aGUgY2FzZSBzZWVkcydcbi8vIGBjcmVhdGVkX2F0YCBhbHJlYWR5IHVzZS5cbi8vXG4vLyBXaGF0IHRoZSB3cml0ZXJzIERPIGltcG9zZSBpcyBhIGNvbnN0cmFpbnQgb24gdGhlIGV2ZW50cyBzZWVkZWQgYmVzaWRlIHRoZXNlXG4vLyByb3dzLCBhbmQgaXQgZGVjaWRlcyB0aGUgd2hvbGUgbGF5b3V0IGJlbG93LiBMaWZlY3ljbGUgaG9va3MgcnVuIG92ZXIgc2VlZFxuLy8gd3JpdGVzICgjNjE3KSwgYW5kIHR3byBvZiB0aGVtIHN0YW1wIFRPREFZIG9uIGFuIGFjY291bnQ6XG4vL1xuLy8gICBcdTAwQjcgYGV2ZW50X2FjdGl2aXR5X2J1YmJsZWAgXHUyMDE0IG9uIGFueSBgaGVsZGAgZXZlbnQsIHdhbGtpbmcgdXAgZnJvbSBpdHNcbi8vICAgICBjb250YWN0IC8gb3Bwb3J0dW5pdHkgLyBjYXNlIChgc3JjL3NhbGVzL29iamVjdHMvZXZlbnQuaG9vay50c2ApO1xuLy8gICBcdTAwQjcgYHRhc2tfYWN0aXZpdHlfYnViYmxlYCAgXHUyMDE0IG9uIGFueSB0YXNrIHNlZWRlZCBhbHJlYWR5IGNvbXBsZXRlZC5cbi8vXG4vLyBOZWl0aGVyIHJlYWRzIHRoZSBhY3Rpdml0eSdzIG93biB0aW1lc3RhbXA6IGEgYGhlbGRgIG1lZXRpbmcgc2VlZGVkIDQ1IGRheXNcbi8vIGFnbyBzdGlsbCBzdGFtcHMgdGhlIGRheSB0aGUgZGVtbyB3YXMgc2VlZGVkLiBTbyBhbiBhY2NvdW50IG1heSBjYXJyeSBhblxuLy8gYXV0aG9yZWQgYWdlIE9OTFkgaWYgbm90aGluZyBpbiB0aGUgc2VlZCBib29rIGJ1YmJsZXMgdG8gaXQ7IG90aGVyd2lzZSB0aGVcbi8vIGF1dGhvcmVkIHZhbHVlIGlzIG92ZXJ3cml0dGVuIGF0IHNlZWQgdGltZSBhbmQgdGhlIGRlbW8gc2hvd3Mgc29tZXRoaW5nXG4vLyBub2JvZHkgd3JvdGUgKGRvY3RyaW5lIHJ1bGUgMikuIEhlbmNlIHRoZSB0aHJlZS13YXkgc3BsaXQ6XG4vL1xuLy8gICB0b2RheSgpICAgQWNtZSwgV2F5bmUsIFZlcnRleCwgU3RhcmsgXHUyMDE0IGV2ZXJ5IGFjY291bnQgc29tZXRoaW5nIGluIHRoZSBzZWVkXG4vLyAgICAgICAgICAgICBib29rIGJ1YmJsZXMgdG8uIEFjbWUgLyBXYXluZSAvIFZlcnRleCBjYXJyeSBgaGVsZGAgZXZlbnRzO1xuLy8gICAgICAgICAgICAgU3RhcmsgY2FycmllcyB0aGUgY29tcGxldGVkIHdlbGNvbWUtcGFja2FnZSB0YXNrLCB3aGljaCBoYXNcbi8vICAgICAgICAgICAgIGJ1YmJsZWQgc2luY2UgbG9uZyBiZWZvcmUgdGhpcyBpc3N1ZSAoaXRzIGF1dGhvcmVkIGBkYXlzQWdvKDUpYFxuLy8gICAgICAgICAgICAgd2FzIGJlaW5nIHNpbGVudGx5IG92ZXJ3cml0dGVuKS4gQXV0aG9yZWQgYXMgdG9kYXkgYmVjYXVzZSB0aGF0XG4vLyAgICAgICAgICAgICBpcyBleGFjdGx5IHdoYXQgdGhlIGJ1YmJsZSB3cml0ZXMsIHNvIHRoZSB2YWx1ZSBpcyByaWdodCB3aGV0aGVyXG4vLyAgICAgICAgICAgICBvciBub3QgaG9va3MgZmlyZS5cbi8vICAgNlx1MjAxMzggZGF5cyAgTGF0dGljZSwgR2xvYmV4IFx1MjAxNCByZWNlbmN5IGZyb20gY2hhbm5lbHMgdGhpcyBzZWVkIGJvb2sgZG9lcyBub3Rcbi8vICAgICAgICAgICAgIG1vZGVsIChhbiBlbWFpbCB0aHJlYWQsIGEgc2lnbmF0dXJlKS4gVGhleSBjYXJyeSBvbmx5IGBwbGFubmVkYFxuLy8gICAgICAgICAgICAgYW5kIGBjYW5jZWxsZWRgIGV2ZW50cywgbmVpdGhlciBvZiB3aGljaCBidWJibGVzLlxuLy8gICA0MS83Mi8xMDQgTm9ydGh3aW5kLCBJbml0ZWNoLCBBcGV4IFx1MjAxNCBvbmUgcGVyIGNodXJuIGJhbmQuIE5vdGhpbmcgaGVsZFxuLy8gICAgICAgICAgICAgcmVhY2hlcyB0aGVtOyBlYWNoIGNhcnJpZXMgYSBCT09LRUQgcmUtZW5nYWdlbWVudCBtZWV0aW5nXG4vLyAgICAgICAgICAgICBpbnN0ZWFkLCB3aGljaCBpcyAjNTkyJ3Mgd2hvbGUgcG9pbnQ6IGEgbWVldGluZyBvbiB0aGUgY2FsZW5kYXJcbi8vICAgICAgICAgICAgIGlzIG5vdCBhbiBpbnRlcmFjdGlvbiB0aGF0IGhhcHBlbmVkLCBhbmQgb25seSBgaGVsZGAgbW92ZXMgdGhlXG4vLyAgICAgICAgICAgICBjbG9jay4gSW50ZXJuYWwgcGlwZWxpbmUgbW90aW9uIChhIGBzdGFnZV9lbnRyeV9kYXRlYCkgaXMgbm90XG4vLyAgICAgICAgICAgICBjdXN0b21lciBjb250YWN0IGVpdGhlciwgd2hpY2ggaXMgd2h5IGEgc3RhZ25hdGluZyBkZWFsIGNhbiBzaXRcbi8vICAgICAgICAgICAgIG9uIGEgc2lsZW50IGFjY291bnQgXHUyMDE0IHRoYXQgcGFpcmluZyBpcyB3aGF0IHRoZSBzdGFnbmF0aW9uIHN3ZWVwXG4vLyAgICAgICAgICAgICBhbmQgdGhlIGNodXJuIHRpbGVzIGFyZSBlYWNoIGxvb2tpbmcgYXQgZnJvbSBvbmUgc2lkZS5cbi8vXG4vLyBgdGVzdC9hY3Rpdml0eS1zZWVkLWNvdmVyYWdlLnRlc3QudHNgIHJlY29tcHV0ZXMgdGhlIGJ1YmJsZSdzIHJlYWNoYWJpbGl0eVxuLy8gZnJvbSB0aGUgc2VlZHMgdGhlbXNlbHZlcyBhbmQgZmFpbHMgaWYgYSBoZWxkIGV2ZW50IGV2ZXIgcmVhY2hlcyBvbmUgb2YgdGhlXG4vLyB0aHJlZSBxdWlldCBhY2NvdW50cywgc28gdGhlIHNwbGl0IGFib3ZlIGNhbm5vdCByb3QgaW50byBhIGNvbW1lbnQuXG4vL1xuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIGBoZWFsdGhfc2NvcmVgOiB0aGUgY2h1cm4gc2lnbmFsIGEgSFVNQU4gYXNzZXJ0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vXG4vLyBGb3VyIG9wdGlvbnMgc2hpcCAoYGhlYWx0aHlgIC8gYHdhdGNoaW5nYCAvIGBhdF9yaXNrYCAvIGBjaHVybmluZ2ApIGFuZCB0aGVcbi8vIGNodXJuIHJlcG9ydCdzIGZpcnN0IHBhbmVsLCBgY3NtX2ZsYWdnZWRfYWNjb3VudHNgLCBzZWxlY3RzIHRoZSB3b3JzdCB0d28uXG4vLyBUaGF0IHBhbmVsIGlzIHRoZSBPTkxZIG9uZSBvbiB0aGUgcmVwb3J0IHdpdGggbm8gdGltZSB3aW5kb3csIHNvIHRoZVxuLy8gcG9wdWxhdGlvbiBpdCBleGlzdHMgZm9yIGlzIGFuIGFjY291bnQgYmVpbmcgd29ya2VkIHJpZ2h0IG5vdyBhbmQgc3RpbGxcbi8vIGZsYWdnZWQuIFRoZSBzZWVkIGJvb2sgaGFzIHRvIGNvbnRhaW4gb25lLCBvciB0aGUgZGVtbyByZW5kZXJzIGEgcGFuZWwgdGhhdFxuLy8gbWVyZWx5IHJlc3RhdGVzIHRoZSA2MC1kYXkgd2luZG93IHN0YWNrZWQgYmVsb3cgaXQgKCMxNDE0KS4gSGVuY2UgYVxuLy8gZGVsaWJlcmF0ZSB0aHJlZS13YXkgc3BsaXQsIHRoZSBzYW1lIHNoYXBlIGFzIHRoZSB0ZXJyaXRvcnkgYW5kIGFjdGl2aXR5XG4vLyBwYXJ0aXRpb25zIGFib3ZlOlxuLy9cbi8vICAgSW5pdGVjaCAgYGF0X3Jpc2tgICArIDcyIGRheXMgcXVpZXQgXHUyMDE0IGZsYWdnZWQgQU5EIGRlcml2ZWQuIEl0IGxhbmRzIGluXG4vLyAgICAgICAgICAgIHRoaXMgcGFuZWwgYW5kIGluIGBhdF9yaXNrX2FjY291bnRzYDsgdGhlIHJlcG9ydCdzIG93biBoZWFkZXJcbi8vICAgICAgICAgICAgc2F5cyB0aGUgdHdvIGJsb2NrcyBhcmUgYWxsb3dlZCB0byBvdmVybGFwLlxuLy8gICBXYXluZSAgICBgY2h1cm5pbmdgICsgY2xvY2sgYXQgdG9kYXkoKSBcdTIwMTQgZmxhZ2dlZCBhbmQgTk9UIGRlcml2ZWQuIEl0c1xuLy8gICAgICAgICAgICBgc3RyYXRlZ2ljYCB0aWVyIGlzIGluc2lkZSBgc2lsZW50X2hpZ2hfdmFsdWVgJ3Mgc2NvcGUgYXMgd2VsbCxcbi8vICAgICAgICAgICAgc28gdGhlIGNsb2NrIGFsb25lIGtlZXBzIGl0IG91dCBvZiBCT1RIIHdpbmRvd2VkIHBhbmVsczogdGhlXG4vLyAgICAgICAgICAgIGFjY291bnQgbm8gZGVyaXZlZCBzaWduYWwgY2FuIHNlZS4gSXQgaXMgd2hhdCBtYWtlcyB0aGUgc2V0XG4vLyAgICAgICAgICAgIGRpZmZlcmVuY2UgRkxBR0dFRCBcXCBRVUlFVDYwIG5vbi1lbXB0eS5cbi8vICAgU3RhcmsgICAgYGF0X3Jpc2tgICArIGNsb2NrIGF0IHRvZGF5KCksIGFuZCBOT1QgYSBjdXN0b21lciBcdTIwMTQgdGhlIHJvdyB0aGVcbi8vICAgICAgICAgICAgcGFuZWwncyBgcm93czogWyd0eXBlJ11gIGdyb3VwaW5nIGV4aXN0cyBmb3IgKCMxNjQ3KS4gV2hpbGUgZXZlcnlcbi8vICAgICAgICAgICAgZmxhZ2dlZCBhY2NvdW50IHdhcyBhIGBjdXN0b21lcmAgdGhlIGdyb3VwaW5nIHJlbmRlcmVkIGEgc2luZ2xlXG4vLyAgICAgICAgICAgIHJvdyBhbmQgY291bGQgZGVtb25zdHJhdGUgbm90aGluZzsgdGhlIGdyaWQgdmlld1xuLy8gICAgICAgICAgICBgY3JtX2FjY291bnQuYXRfcmlza19hY2NvdW50c2AgZmlsdGVycyBgdHlwZSA9PSAnY3VzdG9tZXInYFxuLy8gICAgICAgICAgICBiZWZvcmUgYW55dGhpbmcgZWxzZSwgc28gYSBmbGFnZ2VkIFBBUlRORVIgaXMgYSByb3cgdGhlIHJlcG9ydFxuLy8gICAgICAgICAgICBibG9jayBjYW4gc2hvdyBhbmQgdGhhdCBncmlkIGNhbm5vdC5cbi8vXG4vLyBUaGUgb3RoZXIgY3VzdG9tZXJzIHN0YXkgYGhlYWx0aHlgIG9uIHB1cnBvc2UuIEEgc2V2ZXJpdHkgZXZlcnkgcmVjb3JkXG4vLyBjYXJyaWVzIGRlbW9uc3RyYXRlcyBub3RoaW5nLCBhbmQgYGNodXJuaW5nYCBpcyB0aGUgbW9zdCBzZXZlcmUgb3B0aW9uIGluXG4vLyB0aGUgbW9kZWwgXHUyMDE0IG9uZSByZWNvcmQgaXMgd2hhdCBtYWtlcyBpdCByZWFsIHJhdGhlciB0aGFuIGRlY2xhcmVkLlxuLy9cbi8vIFRoZSB0aHJlZSBQUk9TUEVDVFMgY2Fycnkgbm8gYGhlYWx0aF9zY29yZWAgYXQgYWxsLCBhbmQgdGhhdCBibGFuayBpcyBhXG4vLyBzdGF0ZWQgY2hvaWNlIHJhdGhlciB0aGFuIGFuIG92ZXJzaWdodDogdGhlIGNvbHVtbiBpcyB3aGF0IGEgQ1NNIGFzc2VydHNcbi8vIGFib3V0IGEgUkVMQVRJT05TSElQLCBhbmQgbm9ib2R5IGhhcyBiZWVuIGluIHRoZSByb29tIHdpdGggYW4gYWNjb3VudCB0aGF0XG4vLyB3YXMgbmV2ZXIgd29uLiBUaGUgY3JpdGVyaW9uIGAkaW4gW2F0X3Jpc2ssIGNodXJuaW5nXWAgZG9lcyBub3QgbWF0Y2ggYW5cbi8vIGFic2VudCB2YWx1ZSwgc28gYSBibGFuayByb3cgaXMgb3V0c2lkZSB0aGUgcGFuZWwgZWl0aGVyIHdheSBcdTIwMTQgaXQgc2F5c1xuLy8gXCJub2JvZHkgaGFzIGFzc2Vzc2VkIHRoaXNcIiwgd2hpY2ggaXMgZXhhY3RseSB0cnVlIG9mIGEgcHJvc3BlY3QuXG4vL1xuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIGBhcHByb3ZhbF9zdGF0dXNgOiBldmVyeSBzZWVkZWQgYWNjb3VudCBpcyBhbHJlYWR5IHNpZ25lZCBvZmYgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vL1xuLy8gRWFjaCByb3cgYmVsb3cgc3RhdGVzIGBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCdgLCBhbmQgaXQgaGFzIHRvLiBPbiBhIHJlYWxcbi8vIGluc2VydCB0aGUgY29sdW1uIGlzIGJvcm4gYmxhbmsgYW5kIGBhY2NvdW50X2FwcHJvdmFsYCBzdWJtaXRzIGl0IChSRVEtMDAwMztcbi8vIHRoZSByZXF1ZXN0J3MgbWlycm9yIHdyaXRlcyBgcGVuZGluZ2AsICMyMDY3KS4gQSBzZWVkIHJvdyBuZXZlciByZWFjaGVzIHRoYXRcbi8vIGZsb3c6IHRoZSBwbGF0Zm9ybSB3cml0ZXMgZXZlcnkgc2VlZCByb3cgd2l0aCBgc2tpcFRyaWdnZXJzYFxuLy8gKGBTRUVEX1dSSVRFX0VYRUNVVElPTl9DT05URVhUYCwgYEBvYmplY3RzdGFjay9zcGVjYCksIGJlY2F1c2UgYSBzZWVkIGlzXG4vLyBlc3RhYmxpc2hlZCBFTkQtU1RBVEUgZGF0YSwgbm90IGEgdXNlciBldmVudC4gTGVmdCB1bnN0YXRlZCwgYSByb3cgd291bGRcbi8vIGNsYWltIG5vIHNpZ24tb2ZmIGF0IGFsbDsgdW5kZXIgdGhlIGZvcm1lciBgcGVuZGluZ2AgZGVmYXVsdCBpdCByZWFkXG4vLyBgcGVuZGluZ2Agd2l0aCBubyByZXF1ZXN0IGJlaGluZCBpdCwgdGhlIGNvbnNvbGUgc2hvd2VkIFwiTG9ja2VkIGZvclxuLy8gYXBwcm92YWxcIiBhbmQgZGlzYWJsZWQgRWRpdCwgYW5kIG5vIGFkbWluIGNvdWxkIGVkaXQgYSBzZWVkZWQgYWNjb3VudFxuLy8gKCMyMDQyKS4gVGhlc2UgYWNjb3VudHMgY2FycnkgZGVhbHMsIGNvbnRyYWN0cyBhbmQgY2FzZXM7IHRoZXkgYXJlIHBhc3Rcbi8vIHRoZWlyIHNpZ24tb2ZmLCBzbyB0aGUgcm93IHNheXMgc28uXG4vLyBcdTI2RDQgRG8gbm90IFwiZml4XCIgaXQgd2l0aCBhbiBgYXBwcm92ZWRgIGZpZWxkIGRlZmF1bHQgaW5zdGVhZDogdGhhdCBzd2l0Y2hlc1xuLy8gdGhlIGdhdGUgb2ZmIGZvciBldmVyeSBhY2NvdW50IGEgdXNlciBjcmVhdGVzLlxuZXhwb3J0IGNvbnN0IGFjY291bnRzID0gZGVmaW5lU2VlZChBY2NvdW50LCB7XG4gIG1vZGU6ICd1cHNlcnQnLFxuICBleHRlcm5hbElkOiAnbmFtZScsXG4gIHJlY29yZHM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcsXG4gICAgICB0eXBlOiAnY3VzdG9tZXInLFxuICAgICAgaW5kdXN0cnk6ICd0ZWNobm9sb2d5JyxcbiAgICAgIGFubnVhbF9yZXZlbnVlOiA1MDAwMDAwLFxuICAgICAgbnVtYmVyX29mX2VtcGxveWVlczogMjUwLFxuICAgICAgcGhvbmU6ICcrMS00MTUtNTU1LTAxMDAnLFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IHN0cmVldDogJzUwMCBIb3dhcmQgU3RyZWV0LCBTdWl0ZSA0MDAnLCBjaXR5OiAnU2FuIEZyYW5jaXNjbycsIHN0YXRlOiAnQ0EnLCBwb3N0YWxDb2RlOiAnOTQxMDUnLCBjb3VudHJ5OiAnVVMnIH0sXG4gICAgICB3ZWJzaXRlOiAnaHR0cHM6Ly9hY21lLmV4YW1wbGUuY29tJyxcbiAgICAgIHRpZXI6ICdlbnRlcnByaXNlJyxcbiAgICAgIHNlZ21lbnQ6ICdncm93dGgnLFxuICAgICAgaGVhbHRoX3Njb3JlOiAnaGVhbHRoeScsXG4gICAgICAvLyBIZWxkOiB3b3Jrc2hvcCwgZGVtbywgY2FsbHMgYW5kIGFuIG9uc2l0ZSB2aXNpdCBcdTIwMTQgc2VlIGBzZXJ2aWNlLnNlZWQudHNgLlxuICAgICAgbGFzdF9hY3Rpdml0eV9kYXRlOiBjZWxgdG9kYXkoKWAsXG4gICAgICAvLyBUaGUgQVJSIGxpbmUgYmVsb3cgdXNlZCB0byByZWFkIFwic2lnbmVkIFExIDIwMjUgcmVuZXdhbFwiIHdoaWxlIHRoZVxuICAgICAgLy8gZGVhbCBpdCBkZXNjcmliZXMgY2xvc2VzIGBkYXlzQWdvKDE1KWAgXHUyMDE0IGEgZml4ZWQgY2FsZW5kYXIgcXVhcnRlciBvbiBhXG4gICAgICAvLyByZWxhdGl2ZS1kYXRlIHJlY29yZCwgd3JvbmcgaW4gYm90aCB0aGUgcXVhcnRlciBhbmQgdGhlIHllYXIgKCMxNjkyKS5cbiAgICAgIC8vIFRoZSBsYWJlbCBpcyBub3QgcmUtZGVyaXZlZCBoZXJlIGVpdGhlcjogdGhhdCBkYXRlIGJlbG9uZ3MgdG9cbiAgICAgIC8vIGBBY21lIEFubnVhbCBSZW5ld2FsIDIwMjVgIChgY2xvc2VfZGF0ZWApIGFuZCB0byBpdHMgY29udHJhY3RcbiAgICAgIC8vIChgc2lnbmVkX2RhdGVgLCBgcmV2ZW51ZS5zZWVkLnRzYCksIGFuZCBjb21wdXRpbmcgYSBjb3B5IGluIHRoaXMgbW9kdWxlXG4gICAgICAvLyBtZWFucyByZS1zdGF0aW5nIHRoYXQgcmVjb3JkJ3Mgb3duIG9mZnNldCBcdTIwMTQgYSBzZWNvbmQgc291cmNlIG9mIHRydXRoXG4gICAgICAvLyBmb3IgYSB2YWx1ZSB0d28gcmVjb3JkcyBhbHJlYWR5IG93bi4gU2FtZSBydWxpbmcgYXMgdGhlIGBuZXh0X3N0ZXBgXG4gICAgICAvLyBibG9jayBiZWxvdyAoIzE2NjApOiBubyBkYXRlIGdvZXMgYmFjayBpbnRvIHRoaXMgcHJvc2UsIGFic29sdXRlIE9SXG4gICAgICAvLyByZWxhdGl2ZS4gV2hhdCBzdGF5cyB0cnVlIGhvd2V2ZXIgdGhlIHJlbmV3YWwgaXMgZGF0ZWQgaXMgdGhhdCBpdCBJU1xuICAgICAgLy8gc2lnbmVkOiB0aGUgZGVhbCBpcyBgY2xvc2VkX3dvbmAgYW5kIGl0cyBjb250cmFjdCBgYWN0aXZhdGVkYC5cbiAgICAgIGRlc2NyaXB0aW9uOiBgKipTdHJhdGVnaWMgQ3VzdG9tZXIgXHUwMEI3IEVudGVycHJpc2UgVGllcioqXG5cbkFjbWUgQ29ycG9yYXRpb24gaXMgYSBTZXJpZXMtQyByb2JvdGljcyAmIGluZHVzdHJpYWwgYXV0b21hdGlvblxuY29tcGFueSB0aGF0IHN3aXRjaGVkIGZyb20gYSBjb21wZXRpdG9yIDE4IG1vbnRocyBhZ28uIFRoZXkgcnVuXG5Ib3RDUk0gYXMgdGhlaXIgc3lzdGVtIG9mIHJlY29yZCBmb3Igc2FsZXMgKyBzZXJ2aWNlIGFjcm9zc1xudGhyZWUgcmVnaW9uYWwgdGVhbXMgKE5BLCBFTUVBLCBBUEFDKS5cblxuKipSZWxhdGlvbnNoaXAqKlxuLSBQcmltYXJ5IGVjb25vbWljIGJ1eWVyOiBKb3JkYW4gUGFyayAoQ1RPKSBcdTIwMTQgdmFsdWVzIG91ciBvcGVuXG4gIGFyY2hpdGVjdHVyZSBhbmQgQUkgcm9hZG1hcC5cbi0gRGF5LXRvLWRheSBjaGFtcGlvbjogSm9obiBTbWl0aCAoVlAgRW5naW5lZXJpbmcpIFx1MjAxNCBvd25zIHRoZVxuICB0ZWNobmljYWwgZXZhbHVhdGlvbiBhbmQgaW50ZWdyYXRpb24gcXVlc3Rpb25zLlxuLSBQcm9jdXJlbWVudDogaGFuZGxlZCBieSBMaXNhIEtpbSBcdTIwMTQgcHJlZmVycyBhbm51YWwgY29udHJhY3RzLFxuICBuZXQtMzAgdGVybXMuXG5cbioqQ3VycmVudCBzdGF0ZSoqXG4tIEFSUjogJDIyMEsgKHNpZ25lZCByZW5ld2FsKS4gVXAgMjIlIFlvWS5cbi0gMSBvcGVuIGVudGVycHJpc2Ugb3Bwb3J0dW5pdHkgKCQxNTBLIHBsYXRmb3JtIHVwZ3JhZGUpIGluIHByb3Bvc2FsXG4gIHN0YWdlLCAxIHNlcnZpY2UgdGlja2V0IG9wZW4gKGxvZ2luIGlzc3VlcyksIDEgYmlsbGluZyBkaXNwdXRlXG4gIGF3YWl0aW5nIGN1c3RvbWVyIHJlc3BvbnNlLlxuLSBBSSBhZ2VudCBnb3Zlcm5hbmNlIGJlY2FtZSBhIGhhcmQgcmVxdWlyZW1lbnQgZm9yIHRoYXQgdXBncmFkZVxuICBhZnRlciB0aGVpciBpbnRlcm5hbCBjb21wbGlhbmNlIHJldmlldywgc28gdGhlIHdvcmtzaG9wIG5vdyBvblxuICB0aGUgY2FsZW5kYXIgaXMgdGhlIGdhdGUgb24gc2lnbmF0dXJlLlxuXG4qKlJlZCBmbGFncyoqXG4tIExvc3QgdGhlICQ3NUsgTWFya2V0aW5nIENsb3VkIGFkZC1vbiBvbiB0aW1pbmcgXHUyMDE0IHRoZWlyIG1hcmtldGluZ1xuICBvcmcgaXMgbG9ja2VkIGludG8gYSAyLXllYXIgSHViU3BvdCBjb250cmFjdCwgYW5kIHRoZSBidXlpbmdcbiAgd2luZG93IG9wZW5zIHdoZW4gdGhhdCBjb250cmFjdCByZW5ld3MuXG4tIExvZ2luIGlzc3VlcyB0aWNrZXQgaXMgYWxyZWFkeSBwYXN0IGl0cyBTTEEgY2xvY2sgXHUyMDE0IG5lZWRzIGV5ZXNcbiAgdG9kYXkuYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdHbG9iZXggSW5kdXN0cmllcycsXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcsXG4gICAgICB0eXBlOiAncHJvc3BlY3QnLFxuICAgICAgaW5kdXN0cnk6ICdtYW51ZmFjdHVyaW5nJyxcbiAgICAgIGFubnVhbF9yZXZlbnVlOiAxMjAwMDAwMCxcbiAgICAgIG51bWJlcl9vZl9lbXBsb3llZXM6IDgwMCxcbiAgICAgIHBob25lOiAnKzEtMzEyLTU1NS0wMjAwJyxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBzdHJlZXQ6ICcyMzMgU291dGggV2Fja2VyIERyaXZlJywgY2l0eTogJ0NoaWNhZ28nLCBzdGF0ZTogJ0lMJywgcG9zdGFsQ29kZTogJzYwNjA2JywgY291bnRyeTogJ1VTJyB9LFxuICAgICAgd2Vic2l0ZTogJ2h0dHBzOi8vZ2xvYmV4LmV4YW1wbGUuY29tJyxcbiAgICAgIHRpZXI6ICdlbnRlcnByaXNlJyxcbiAgICAgIHNlZ21lbnQ6ICduZXRfbmV3JyxcbiAgICAgIC8vIE9ubHkgYSBib29rZWQgZGVtbyBhbmQgYSBjYW5jZWxsZWQgcmV2aWV3IFx1MjAxNCBuZWl0aGVyIGJ1YmJsZXMsIHNvIHRoaXNcbiAgICAgIC8vIDgtZGF5IGFnZSBzdXJ2aXZlcyB0aGUgc2VlZCBsb2FkIGFuZCBzdGF5cyBpbnNpZGUgZXZlcnkgY2h1cm4gd2luZG93LlxuICAgICAgbGFzdF9hY3Rpdml0eV9kYXRlOiBjZWxgZGF5c0Fnbyg4KWAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSW5pdGVjaCBTb2x1dGlvbnMnLFxuICAgICAgYXBwcm92YWxfc3RhdHVzOiAnYXBwcm92ZWQnLFxuICAgICAgdHlwZTogJ2N1c3RvbWVyJyxcbiAgICAgIGluZHVzdHJ5OiAnZmluYW5jZScsXG4gICAgICBhbm51YWxfcmV2ZW51ZTogMzUwMDAwMCxcbiAgICAgIG51bWJlcl9vZl9lbXBsb3llZXM6IDE1MCxcbiAgICAgIHBob25lOiAnKzEtMjEyLTU1NS0wMzAwJyxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBzdHJlZXQ6ICcxIExpYmVydHkgUGxhemEsIDIzcmQgRmxvb3InLCBjaXR5OiAnTmV3IFlvcmsnLCBzdGF0ZTogJ05ZJywgcG9zdGFsQ29kZTogJzEwMDA2JywgY291bnRyeTogJ1VTJyB9LFxuICAgICAgd2Vic2l0ZTogJ2h0dHBzOi8vaW5pdGVjaC5leGFtcGxlLmNvbScsXG4gICAgICB0aWVyOiAnbWlkX21hcmtldCcsXG4gICAgICBzZWdtZW50OiAnYXRfcmlzaycsXG4gICAgICBoZWFsdGhfc2NvcmU6ICdhdF9yaXNrJyxcbiAgICAgIC8vIFFVSUVUIDYwKyBcdTIwMTQgdGhlIGBhdF9yaXNrYCBzZWdtZW50IGFuZCBoZWFsdGggc2NvcmUsIHdpdGggYSBjbG9jayB0aGF0XG4gICAgICAvLyBmaW5hbGx5IGFncmVlcyB3aXRoIHRoZW06IHRlbiB3ZWVrcyBvZiBzaWxlbmNlLiBBIG5vLXNob3cgY2FsbCA1NSBkYXlzXG4gICAgICAvLyBhZ28gd2FzIHRoZSBsYXN0IGF0dGVtcHQ7IHRoZSByZS1lbmdhZ2VtZW50IGNhbGwgb24gdGhlIGNhbGVuZGFyIGlzXG4gICAgICAvLyBgcGxhbm5lZGAsIHNvIGl0IG1vdmVzIG5vdGhpbmcuXG4gICAgICBsYXN0X2FjdGl2aXR5X2RhdGU6IGNlbGBkYXlzQWdvKDcyKWAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnU3RhcmsgTWVkaWNhbCcsXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcsXG4gICAgICB0eXBlOiAncGFydG5lcicsXG4gICAgICBpbmR1c3RyeTogJ2hlYWx0aGNhcmUnLFxuICAgICAgYW5udWFsX3JldmVudWU6IDgwMDAwMDAsXG4gICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiA0MDAsXG4gICAgICAvLyBUaGUgb25lIENhbmFkaWFuIGFjY291bnQ6IHN0aWxsIGluc2lkZSBub3J0aF9hbWVyaWNhX3RlcnJpdG9yeSwgYW5kIHRoZVxuICAgICAgLy8gcmVhc29uIHRoYXQgcnVsZSdzIGAkaW5gIGxpc3QgaXMgbm90IGEgc2luZ2xlLWNvdW50cnkgbGlzdCBpbiBkaXNndWlzZS5cbiAgICAgIHBob25lOiAnKzEtNDE2LTU1NS0wNDAwJyxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBzdHJlZXQ6ICcxODEgQmF5IFN0cmVldCwgU3VpdGUgMjIwMCcsIGNpdHk6ICdUb3JvbnRvJywgc3RhdGU6ICdPTicsIHBvc3RhbENvZGU6ICdNNUogMlQzJywgY291bnRyeTogJ0NBJyB9LFxuICAgICAgd2Vic2l0ZTogJ2h0dHBzOi8vc3RhcmttZWQuZXhhbXBsZS5jb20nLFxuICAgICAgdGllcjogJ21pZF9tYXJrZXQnLFxuICAgICAgc2VnbWVudDogJ3N0YWJsZScsXG4gICAgICAvLyBgYXRfcmlza2AgcmF0aGVyIHRoYW4gYGNodXJuaW5nYCwgYW5kIHRoZSBkaXN0aW5jdGlvbiBpcyB0aGUgcmVhc29uXG4gICAgICAvLyB0aGlzIHJvdyBjYW4gZXhpc3QgYXQgYWxsOiBhIHBhcnRuZXIgd2hvc2UgcGlsb3Qgd2FzIFdPTiBhbmQgd2hvc2VcbiAgICAgIC8vIGV4cGFuc2lvbiB0aGVuIGRpZWQgb24gYSBjYXBpdGFsIGZyZWV6ZSBjYW4gYmUgYXQgcmlzaywgYnV0IGl0IHdhc1xuICAgICAgLy8gbmV2ZXIgYSBzdWJzY3JpcHRpb24gdGhhdCBjb3VsZCBjaHVybi4gVGhlIHJlY29yZHMgc2F5IGl0IFx1MjAxNCBgU3RhcmtcbiAgICAgIC8vIEV4cGFuc2lvbiAoTG9zdClgIGNsb3NlZCBgbm9fYnVkZ2V0YCA2MCBkYXlzIGFnbyBhbmQgdGhlIHBhcnRuZXJzaGlwXG4gICAgICAvLyBjb250cmFjdCBpcyBzdGlsbCBpbiBsZWdhbCByZXZpZXcgXHUyMDE0IGFuZCB0aGUgcGFuZWwncyBjcml0ZXJpb24gYWRtaXRzXG4gICAgICAvLyBib3RoIHZhbHVlcywgc28gdGhlIGhvbmVzdCBzZXZlcml0eSBpcyBhbHNvIHRoZSBvbmUgdGhhdCBmbGFncy5cbiAgICAgIC8vXG4gICAgICAvLyBEaXZlcmdpbmcgZnJvbSBgc2VnbWVudDogJ3N0YWJsZSdgIGlzIGRlbGliZXJhdGUsIHRoZSBzYW1lIHNwbGl0XG4gICAgICAvLyBXYXluZSBkZW1vbnN0cmF0ZXMgYmVsb3c6IGBzZWdtZW50YCBpcyBob3cgdGhlIGJvb2sgY2xhc3NpZmllcyB0aGVcbiAgICAgIC8vIGFjY291bnQsIGBoZWFsdGhfc2NvcmVgIGlzIHdoYXQgYSBwZXJzb24gYXNzZXJ0cyBhYm91dCBpdC4gVGhlIGNsb2NrXG4gICAgICAvLyBzdGF5cyBhdCB0b2RheSgpLCBzbyBsaWtlIFdheW5lIHRoaXMgcm93IGlzIG91dHNpZGUgZXZlcnkgd2luZG93ZWRcbiAgICAgIC8vIHBhbmVsIG9uIHRoYXQgcmVwb3J0OiBpdCByZWFjaGVzIGBjc21fZmxhZ2dlZF9hY2NvdW50c2AgYW5kIG5vIG90aGVyXG4gICAgICAvLyBibG9jay5cbiAgICAgIGhlYWx0aF9zY29yZTogJ2F0X3Jpc2snLFxuICAgICAgLy8gVGhlIGNvbXBsZXRlZCAnU2VuZCB3ZWxjb21lIHBhY2thZ2UnIHRhc2sgYnViYmxlcyBoZXJlIG9uIGV2ZXJ5IHNlZWRcbiAgICAgIC8vIGxvYWQsIHNvIHRoaXMgaGFzIEFMV0FZUyByZXNvbHZlZCB0byB0b2RheSBcdTIwMTQgdGhlIHByZXZpb3VzIGBkYXlzQWdvKDUpYFxuICAgICAgLy8gd2FzIGF1dGhvcmVkIGFuZCB0aGVuIG92ZXJ3cml0dGVuIGJlZm9yZSBhbnlvbmUgY291bGQgcmVhZCBpdC5cbiAgICAgIGxhc3RfYWN0aXZpdHlfZGF0ZTogY2VsYHRvZGF5KClgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1dheW5lIEVudGVycHJpc2VzJyxcbiAgICAgIGFwcHJvdmFsX3N0YXR1czogJ2FwcHJvdmVkJyxcbiAgICAgIHR5cGU6ICdjdXN0b21lcicsXG4gICAgICBpbmR1c3RyeTogJ3RlY2hub2xvZ3knLFxuICAgICAgYW5udWFsX3JldmVudWU6IDI1MDAwMDAwLFxuICAgICAgbnVtYmVyX29mX2VtcGxveWVlczogMjAwMCxcbiAgICAgIHBob25lOiAnKzEtNjUwLTU1NS0wNTAwJyxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBzdHJlZXQ6ICczMDAwIEhhbm92ZXIgU3RyZWV0JywgY2l0eTogJ1BhbG8gQWx0bycsIHN0YXRlOiAnQ0EnLCBwb3N0YWxDb2RlOiAnOTQzMDQnLCBjb3VudHJ5OiAnVVMnIH0sXG4gICAgICB3ZWJzaXRlOiAnaHR0cHM6Ly93YXluZS5leGFtcGxlLmNvbScsXG4gICAgICB0aWVyOiAnc3RyYXRlZ2ljJyxcbiAgICAgIHNlZ21lbnQ6ICdncm93dGgnLFxuICAgICAgLy8gQ0hVUk5JTkcsIHdpdGggdGhlIGNsb2NrIHN0aWxsIHJ1bm5pbmcgXHUyMDE0IHRoZSBwb3B1bGF0aW9uXG4gICAgICAvLyBgY3NtX2ZsYWdnZWRfYWNjb3VudHNgIGV4aXN0cyBmb3IgKCMxNDE0KS4gRXZlcnkgREVSSVZFRCBzaWduYWwgb25cbiAgICAgIC8vIHRoaXMgcm93IHJlYWRzIGhlYWx0aHk6IGFuIG9wZXJhdGlvbnMgcm9sbG91dCBjbG9zZWQgZm91ciBkYXlzIGFnbywgYVxuICAgICAgLy8gbGljZW5jZSBzaXRzIGF0IDgwJSB0d28gd2Vla3MgZnJvbSBzaWduYXR1cmUsIHRocmVlIG1lZXRpbmdzIHdlcmUgaGVsZFxuICAgICAgLy8gdGhpcyBtb250aC4gVGhlIENTTSB3aG8gaGFzIGJlZW4gaW4gdGhlIHJvb20gc2F5cyB0aGUgYWNjb3VudCBpcyBnb2luZ1xuICAgICAgLy8gYW55d2F5LCBhbmQgYGhlYWx0aF9zY29yZWAgaXMgdGhlIG9ubHkgY2h1cm4gc2lnbmFsIGluIHRoZSBtb2RlbCBhXG4gICAgICAvLyBwZXJzb24gQVNTRVJUUyBcdTIwMTQgd2hpY2ggaXMgd2h5IHRoZSBwYW5lbCB0aGF0IHJlYWRzIGl0IGlzIGZpcnN0IG9uIHRoZVxuICAgICAgLy8gcmVwb3J0IGFuZCBjYXJyaWVzIG5vIHRpbWUgd2luZG93LlxuICAgICAgLy9cbiAgICAgIC8vIFx1MjZENCBEbyBub3QgXCJjb3JyZWN0XCIgdGhpcyB0byBgYXRfcmlza2AgdG8gYWdyZWUgd2l0aCB0aGUgcGlwZWxpbmUsIGFuZFxuICAgICAgLy8gXHUyNkQ0IGRvIG5vdCBzdG9wIHRoZSBjbG9jayB0byBhZ3JlZSB3aXRoIHRoZSBoZWFsdGggc2NvcmU6IGVpdGhlciBlZGl0XG4gICAgICAvLyBmb2xkcyB0aGUgcm93IGJhY2sgaW50byBgYXRfcmlza19hY2NvdW50c2AgKDYwLWRheSB3aW5kb3cpIGFuZCB0aGVcbiAgICAgIC8vIGZsYWdnZWQgcGFuZWwgZ29lcyBiYWNrIHRvIHJlc3RhdGluZyBpdHMgbmVpZ2hib3VyLlxuICAgICAgaGVhbHRoX3Njb3JlOiAnY2h1cm5pbmcnLFxuICAgICAgLy8gSGVsZDogbmVnb3RpYXRpb24gbWVldGluZywgc2VjdXJpdHktYWRkZW5kdW0gY2FsbCwgZ292ZXJuYW5jZSB3ZWJpbmFyLlxuICAgICAgbGFzdF9hY3Rpdml0eV9kYXRlOiBjZWxgdG9kYXkoKWAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnTm9ydGh3aW5kIEVuZXJneScsXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcsXG4gICAgICB0eXBlOiAncHJvc3BlY3QnLFxuICAgICAgaW5kdXN0cnk6ICdlbmVyZ3knLFxuICAgICAgYW5udWFsX3JldmVudWU6IDE4MDAwMDAwLFxuICAgICAgbnVtYmVyX29mX2VtcGxveWVlczogMTEwMCxcbiAgICAgIC8vIGV1cm9wZV90ZXJyaXRvcnksIGhhbGYgMTogREUuXG4gICAgICBwaG9uZTogJys0OS04OS01NTUwLTA2MDAnLFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IHN0cmVldDogJ0xlb3BvbGRzdHJhc3NlIDIxJywgY2l0eTogJ011bmljaCcsIHN0YXRlOiAnQlknLCBwb3N0YWxDb2RlOiAnODA4MDInLCBjb3VudHJ5OiAnREUnIH0sXG4gICAgICB3ZWJzaXRlOiAnaHR0cHM6Ly9ub3J0aHdpbmQuZXhhbXBsZS5jb20nLFxuICAgICAgdGllcjogJ2VudGVycHJpc2UnLFxuICAgICAgc2VnbWVudDogJ25ldF9uZXcnLFxuICAgICAgLy8gUVVJRVQgMzArIFx1MjAxNCB0aGUgZmllbGQtc2VydmljZSBwaWxvdCB3YXMgbG9zdCA4MCBkYXlzIGFnbyBhbmQgdGhlIGdyaWRcbiAgICAgIC8vIHByb2dyYW0gaGFzIG5vdCBiZWVuIHdvcmtlZCBzaW5jZS4gVGhlIGRpc2NvdmVyeSB3b3Jrc2hvcCBpcyBib29rZWQsXG4gICAgICAvLyBub3QgaGVsZC5cbiAgICAgIGxhc3RfYWN0aXZpdHlfZGF0ZTogY2VsYGRheXNBZ28oNDEpYCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQSByZWdpb25hbCBlbmVyZ3kgcHJvdmlkZXIgZXZhbHVhdGluZyBhIHVuaWZpZWQgb3BlcmF0aW9ucyBhbmQgY3VzdG9tZXItZGF0YSBwbGF0Zm9ybS4nLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ZlcnRleCBBbmFseXRpY3MnLFxuICAgICAgYXBwcm92YWxfc3RhdHVzOiAnYXBwcm92ZWQnLFxuICAgICAgdHlwZTogJ2N1c3RvbWVyJyxcbiAgICAgIGluZHVzdHJ5OiAnc29mdHdhcmUnLFxuICAgICAgYW5udWFsX3JldmVudWU6IDk1MDAwMDAsXG4gICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiA0MjAsXG4gICAgICBwaG9uZTogJysxLTUxMi01NTUtMDcwMCcsXG4gICAgICBiaWxsaW5nX2FkZHJlc3M6IHsgc3RyZWV0OiAnNjAwIENvbmdyZXNzIEF2ZW51ZSwgRmxvb3IgMTQnLCBjaXR5OiAnQXVzdGluJywgc3RhdGU6ICdUWCcsIHBvc3RhbENvZGU6ICc3ODcwMScsIGNvdW50cnk6ICdVUycgfSxcbiAgICAgIHdlYnNpdGU6ICdodHRwczovL3ZlcnRleC5leGFtcGxlLmNvbScsXG4gICAgICB0aWVyOiAnZW50ZXJwcmlzZScsXG4gICAgICBzZWdtZW50OiAnZ3Jvd3RoJyxcbiAgICAgIGhlYWx0aF9zY29yZTogJ2hlYWx0aHknLFxuICAgICAgLy8gSGVsZDogcm9sbG91dCBtZWV0aW5nLCBhbmFseXRpY3MgZGVtbywgY29tbWl0dGVlIGNhbGwsIHJldHJvc3BlY3RpdmUuXG4gICAgICBsYXN0X2FjdGl2aXR5X2RhdGU6IGNlbGB0b2RheSgpYCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQW4gYW5hbHl0aWNzIFNhYVMgY3VzdG9tZXIgZXhwYW5kaW5nIHVzYWdlIGZyb20gdGhlIGRhdGEgdGVhbSB0byBpdHMgcmV2ZW51ZSBvcmdhbml6YXRpb24uJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdMYXR0aWNlIEVkdWNhdGlvbicsXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcsXG4gICAgICB0eXBlOiAnY3VzdG9tZXInLFxuICAgICAgaW5kdXN0cnk6ICdlZHVjYXRpb24nLFxuICAgICAgYW5udWFsX3JldmVudWU6IDY4MDAwMDAsXG4gICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiAzMjAsXG4gICAgICAvLyBldXJvcGVfdGVycml0b3J5LCBoYWxmIDIgXHUyMDE0IGFuZCB0aGUgYWxpYXMgZml4dHVyZS4gYFVLYCBpcyBub3QgSVNPXG4gICAgICAvLyAzMTY2LTEgYWxwaGEtMiAoYEdCYCBpcyk7IGl0IGlzIGFuIEFDQ0VQVEVEIFNQRUxMSU5HIGluXG4gICAgICAvLyBgc3JjL3NhbGVzL29iamVjdHMvX3RlcnJpdG9yeS50c2AsIHNvIHRoaXMgcm93IHByb3ZlcyBvbiBzdG9jayBkYXRhIHRoYXQgYVxuICAgICAgLy8gbGVnYWN5IHNwZWxsaW5nIHN0aWxsIGxhbmRzIGluIGBlbWVhYCAoIzYzOSkuIE5vIGBzdGF0ZWA6IGFuIGFkZHJlc3NcbiAgICAgIC8vIHdpdGhvdXQgYSBzdWJkaXZpc2lvbiBpcyBhIG5vcm1hbCBzaGFwZSwgYW5kIG9ubHkgYGNvdW50cnlgIGlzIHJlYWQuXG4gICAgICBwaG9uZTogJys0NC0yMC03OTQ2LTA4MDAnLFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IHN0cmVldDogJzIwIEZlbmNodXJjaCBTdHJlZXQnLCBjaXR5OiAnTG9uZG9uJywgcG9zdGFsQ29kZTogJ0VDM00gM0JZJywgY291bnRyeTogJ1VLJyB9LFxuICAgICAgd2Vic2l0ZTogJ2h0dHBzOi8vbGF0dGljZS5leGFtcGxlLmNvbScsXG4gICAgICB0aWVyOiAnbWlkX21hcmtldCcsXG4gICAgICBzZWdtZW50OiAnc3RhYmxlJyxcbiAgICAgIGhlYWx0aF9zY29yZTogJ2hlYWx0aHknLFxuICAgICAgLy8gU2lnbmVkIHRoZSBhbmFseXRpY3MgZXhwYW5zaW9uIHNpeCBkYXlzIGFnbzsgdGhlIHJlbmV3YWwgcmV2aWV3IGlzXG4gICAgICAvLyBib29rZWQsIG5vdCBoZWxkLCBzbyBub3RoaW5nIGJ1YmJsZXMgYW5kIHRoaXMgYWdlIHN0YW5kcy5cbiAgICAgIGxhc3RfYWN0aXZpdHlfZGF0ZTogY2VsYGRheXNBZ28oNilgLFxuICAgICAgZGVzY3JpcHRpb246ICdBIGhpZ2hlci1lZHVjYXRpb24gdGVjaG5vbG9neSBjb21wYW55IGNvbnNvbGlkYXRpbmcgYWRtaXNzaW9ucywgc3R1ZGVudC1zdWNjZXNzIGFuZCBhbHVtbmkgd29ya2Zsb3dzLicsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnQXBleCBMb2dpc3RpY3MnLFxuICAgICAgYXBwcm92YWxfc3RhdHVzOiAnYXBwcm92ZWQnLFxuICAgICAgdHlwZTogJ3Byb3NwZWN0JyxcbiAgICAgIGluZHVzdHJ5OiAnbG9naXN0aWNzJyxcbiAgICAgIGFubnVhbF9yZXZlbnVlOiAyMjAwMDAwMCxcbiAgICAgIG51bWJlcl9vZl9lbXBsb3llZXM6IDE0MDAsXG4gICAgICAvLyBgdGVycml0b3J5ID09IFwib3RoZXJcImAgb24gcHVycG9zZTogd2l0aG91dCBhIHJlY29yZCB0aGF0IG1hdGNoZXNcbiAgICAgIC8vIG5laXRoZXIgcnVsZSwgXCJ0aGUgcnVsZXMgcGFydGl0aW9uIHRoZSBhY2NvdW50c1wiIGlzIHVuZmFsc2lmaWFibGUgXHUyMDE0XG4gICAgICAvLyBhIG1hdGNoLWFsbCByZWdyZXNzaW9uIHdvdWxkIGxvb2sgaWRlbnRpY2FsIHRvIGEgd29ya2luZyBvbmUuIGBTR2AgaXNcbiAgICAgIC8vIGEgcmVhbCBjb3VudHJ5IHRoZSBzdGFmZmVkIHRlcnJpdG9yaWVzIGRvIG5vdCBjb3Zlciwgd2hpY2ggaXMgZXhhY3RseVxuICAgICAgLy8gd2hhdCBgb3RoZXJgIGlzIGZvciAoIzYzOSkgXHUyMDE0IGl0IGlzIGEgc3RhdGVkIGNsYXNzaWZpY2F0aW9uIGhlcmUsIG5vdCBhXG4gICAgICAvLyBibGFuay5cbiAgICAgIHBob25lOiAnKzY1LTY1NTUtMDkwMCcsXG4gICAgICBiaWxsaW5nX2FkZHJlc3M6IHsgc3RyZWV0OiAnMTAgTWFyaW5hIEJvdWxldmFyZCwgIzMwLTAxJywgY2l0eTogJ1NpbmdhcG9yZScsIHBvc3RhbENvZGU6ICcwMTg5ODMnLCBjb3VudHJ5OiAnU0cnIH0sXG4gICAgICB3ZWJzaXRlOiAnaHR0cHM6Ly9hcGV4bG9naXN0aWNzLmV4YW1wbGUuY29tJyxcbiAgICAgIHRpZXI6ICdlbnRlcnByaXNlJyxcbiAgICAgIHNlZ21lbnQ6ICduZXRfbmV3JyxcbiAgICAgIC8vIFFVSUVUIDkwKyBcdTIwMTQgYSBsb3N0IGNvbXBsaWFuY2UgZGVhbCAxMTAgZGF5cyBhZ28gYW5kIGEgZGF0YS1odWJcbiAgICAgIC8vIGV2YWx1YXRpb24gdGhhdCBoYXMgYmVlbiBzaWxlbnQgZm9yIGEgcXVhcnRlci4gT25seSBhIGJvb2tlZFxuICAgICAgLy8gcmUtZW5nYWdlbWVudCBjYWxsLlxuICAgICAgbGFzdF9hY3Rpdml0eV9kYXRlOiBjZWxgZGF5c0FnbygxMDQpYCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQSBmYXN0LWdyb3dpbmcgbG9naXN0aWNzIHByb3ZpZGVyIGFzc2Vzc2luZyBhIG1vZGVybiBkYXRhIGh1YiBmb3IgaXRzIG9wZXJhdGlvbnMgYW5kIGNvbW1lcmNpYWwgdGVhbXMuJyxcbiAgICB9LFxuICBdXG59KTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENvbnRhY3RzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IGNvbnN0IGNvbnRhY3RzID0gZGVmaW5lU2VlZChDb250YWN0LCB7XG4gIG1vZGU6ICd1cHNlcnQnLFxuICBleHRlcm5hbElkOiAnZW1haWwnLFxuICByZWNvcmRzOiBbXG4gICAge1xuICAgICAgc2FsdXRhdGlvbjogJ21yJyxcbiAgICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgIGxhc3RfbmFtZTogJ1NtaXRoJyxcbiAgICAgIGVtYWlsOiAnam9obi5zbWl0aEBhY21lLmV4YW1wbGUuY29tJyxcbiAgICAgIHBob25lOiAnKzEtNDE1LTU1NS0wMTAxJyxcbiAgICAgIHRpdGxlOiAnVlAgb2YgRW5naW5lZXJpbmcnLFxuICAgICAgZGVwYXJ0bWVudDogJ2VuZ2luZWVyaW5nJyxcbiAgICAgIGNybV9hY2NvdW50OiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICBpc19wcmltYXJ5OiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgc2FsdXRhdGlvbjogJ21zJyxcbiAgICAgIGZpcnN0X25hbWU6ICdTYXJhaCcsXG4gICAgICBsYXN0X25hbWU6ICdKb2huc29uJyxcbiAgICAgIGVtYWlsOiAnc2FyYWguakBnbG9iZXguZXhhbXBsZS5jb20nLFxuICAgICAgcGhvbmU6ICcrMS0zMTItNTU1LTAyMDEnLFxuICAgICAgdGl0bGU6ICdDaGllZiBQcm9jdXJlbWVudCBPZmZpY2VyJyxcbiAgICAgIGRlcGFydG1lbnQ6ICdleGVjdXRpdmUnLFxuICAgICAgY3JtX2FjY291bnQ6ICdHbG9iZXggSW5kdXN0cmllcycsXG4gICAgICBpc19wcmltYXJ5OiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgc2FsdXRhdGlvbjogJ2RyJyxcbiAgICAgIGZpcnN0X25hbWU6ICdNaWNoYWVsJyxcbiAgICAgIGxhc3RfbmFtZTogJ0NoZW4nLFxuICAgICAgZW1haWw6ICdtY2hlbkBpbml0ZWNoLmV4YW1wbGUuY29tJyxcbiAgICAgIHBob25lOiAnKzEtMjEyLTU1NS0wMzAxJyxcbiAgICAgIHRpdGxlOiAnRGlyZWN0b3Igb2YgT3BlcmF0aW9ucycsXG4gICAgICBkZXBhcnRtZW50OiAnb3BlcmF0aW9ucycsXG4gICAgICBjcm1fYWNjb3VudDogJ0luaXRlY2ggU29sdXRpb25zJyxcbiAgICAgIGlzX3ByaW1hcnk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBzYWx1dGF0aW9uOiAnbXMnLFxuICAgICAgZmlyc3RfbmFtZTogJ0VtaWx5JyxcbiAgICAgIGxhc3RfbmFtZTogJ0RhdmlzJyxcbiAgICAgIGVtYWlsOiAnZW1pbHkuZEBzdGFya21lZC5leGFtcGxlLmNvbScsXG4gICAgICBwaG9uZTogJysxLTYxNy01NTUtMDQwMScsXG4gICAgICB0aXRsZTogJ0hlYWQgb2YgUGFydG5lcnNoaXBzJyxcbiAgICAgIGRlcGFydG1lbnQ6ICdzYWxlcycsXG4gICAgICBjcm1fYWNjb3VudDogJ1N0YXJrIE1lZGljYWwnLFxuICAgICAgaXNfcHJpbWFyeTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNhbHV0YXRpb246ICdtcicsXG4gICAgICBmaXJzdF9uYW1lOiAnUm9iZXJ0JyxcbiAgICAgIGxhc3RfbmFtZTogJ1dpbHNvbicsXG4gICAgICBlbWFpbDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLFxuICAgICAgcGhvbmU6ICcrMS02NTAtNTU1LTA1MDEnLFxuICAgICAgdGl0bGU6ICdDVE8nLFxuICAgICAgZGVwYXJ0bWVudDogJ2VuZ2luZWVyaW5nJyxcbiAgICAgIGNybV9hY2NvdW50OiAnV2F5bmUgRW50ZXJwcmlzZXMnLFxuICAgICAgaXNfcHJpbWFyeTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNhbHV0YXRpb246ICdtcycsXG4gICAgICBmaXJzdF9uYW1lOiAnT2xpdmlhJyxcbiAgICAgIGxhc3RfbmFtZTogJ0NoZW4nLFxuICAgICAgZW1haWw6ICdvbGl2aWEuY2hlbkBub3J0aHdpbmQuZXhhbXBsZS5jb20nLFxuICAgICAgcGhvbmU6ICcrMS0zMDMtNTU1LTA2MDEnLFxuICAgICAgdGl0bGU6ICdWUCBvZiBEaWdpdGFsIE9wZXJhdGlvbnMnLFxuICAgICAgZGVwYXJ0bWVudDogJ29wZXJhdGlvbnMnLFxuICAgICAgY3JtX2FjY291bnQ6ICdOb3J0aHdpbmQgRW5lcmd5JyxcbiAgICAgIGlzX3ByaW1hcnk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBzYWx1dGF0aW9uOiAnbXInLFxuICAgICAgZmlyc3RfbmFtZTogJ0V0aGFuJyxcbiAgICAgIGxhc3RfbmFtZTogJ0Jyb29rcycsXG4gICAgICBlbWFpbDogJ2V0aGFuLmJyb29rc0B2ZXJ0ZXguZXhhbXBsZS5jb20nLFxuICAgICAgcGhvbmU6ICcrMS01MTItNTU1LTA3MDEnLFxuICAgICAgdGl0bGU6ICdDaGllZiBSZXZlbnVlIE9mZmljZXInLFxuICAgICAgZGVwYXJ0bWVudDogJ2V4ZWN1dGl2ZScsXG4gICAgICBjcm1fYWNjb3VudDogJ1ZlcnRleCBBbmFseXRpY3MnLFxuICAgICAgaXNfcHJpbWFyeTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNhbHV0YXRpb246ICdtcycsXG4gICAgICBmaXJzdF9uYW1lOiAnUHJpeWEnLFxuICAgICAgbGFzdF9uYW1lOiAnU2hhaCcsXG4gICAgICBlbWFpbDogJ3ByaXlhLnNoYWhAbGF0dGljZS5leGFtcGxlLmNvbScsXG4gICAgICBwaG9uZTogJysxLTYxNy01NTUtMDgwMScsXG4gICAgICB0aXRsZTogJ1ZQIG9mIFN0dWRlbnQgU3VjY2VzcycsXG4gICAgICBkZXBhcnRtZW50OiAnb3BlcmF0aW9ucycsXG4gICAgICBjcm1fYWNjb3VudDogJ0xhdHRpY2UgRWR1Y2F0aW9uJyxcbiAgICAgIGlzX3ByaW1hcnk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBzYWx1dGF0aW9uOiAnbXInLFxuICAgICAgZmlyc3RfbmFtZTogJ01hcmN1cycsXG4gICAgICBsYXN0X25hbWU6ICdSZWVkJyxcbiAgICAgIGVtYWlsOiAnbWFyY3VzLnJlZWRAYXBleGxvZ2lzdGljcy5leGFtcGxlLmNvbScsXG4gICAgICBwaG9uZTogJysxLTQwNC01NTUtMDkwMScsXG4gICAgICB0aXRsZTogJ0RpcmVjdG9yIG9mIENvbW1lcmNpYWwgU3lzdGVtcycsXG4gICAgICBkZXBhcnRtZW50OiAnb3BlcmF0aW9ucycsXG4gICAgICBjcm1fYWNjb3VudDogJ0FwZXggTG9naXN0aWNzJyxcbiAgICAgIGlzX3ByaW1hcnk6IHRydWUsXG4gICAgfSxcbiAgXVxufSk7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBMZWFkcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8qKlxuICogRGlzcXVhbGlmaWNhdGlvbiByZWFzb25zIGZvciB0aGUgZ2VuZXJhdGVkIGB1bnF1YWxpZmllZGAgZGVtbyBsZWFkcywgcGFpcmVkXG4gKiB3aXRoIHRoZSBub3RlIHRoYXQgZXhwbGFpbnMgdGhlbS5cbiAqXG4gKiBgY3JtX2xlYWQuZGlzcXVhbGlmaWNhdGlvbl9yZWFzb25fcmVxdWlyZWRgIHJlamVjdHMgYW4gdW5xdWFsaWZpZWQgbGVhZCB0aGF0XG4gKiBjYXJyaWVzIG5vIHJlYXNvbiwgc28gZXZlcnkgc2VlZGVkIHVucXVhbGlmaWVkIHJvdyBtdXN0IHN1cHBseSBvbmUgXHUyMDE0IHRoZSByb3dzXG4gKiB1c2VkIHRvIGNhcnJ5IGEgYnVkZ2V0LWZsYXZvdXJlZCBub3RlIGFuZCBubyByZWFzb24gYXQgYWxsLiBSb3RhdGVkIG92ZXIgZm91clxuICogdmFsdWVzIHNvIHRoZSBkZW1vJ3MgZGlzcXVhbGlmaWNhdGlvbiBicmVha2Rvd24gaGFzIG1vcmUgdGhhbiBvbmUgYmFyLCBhbmRcbiAqIHRoZSBub3RlIGFsd2F5cyBtYXRjaGVzIHRoZSByZWFzb24gaXQgc2l0cyBuZXh0IHRvLlxuICovXG5jb25zdCBESVNRVUFMSUZJQ0FUSU9OX1JFQVNPTlMgPSBbXG4gIHsgcmVhc29uOiAnbm9fYnVkZ2V0JywgICAgIG5vdGU6ICdObyBidWRnZXQgYXBwcm92ZWQgZm9yIHRoaXMgZmlzY2FsIHllYXIgXHUyMDE0IHJldmlzaXQgbmV4dCBwbGFubmluZyBjeWNsZS4nIH0sXG4gIHsgcmVhc29uOiAnbm90X2FfZml0JywgICAgIG5vdGU6ICdSZXF1aXJlbWVudHMgc2l0IG91dHNpZGUgd2hhdCB0aGUgcHJvZHVjdCBjb3ZlcnMgdG9kYXkuJyB9LFxuICB7IHJlYXNvbjogJ3dyb25nX3BlcnNvbmEnLCBub3RlOiAnQ29udGFjdCBoYXMgbm8gc2F5IGluIHRoZSBidXlpbmcgZGVjaXNpb24gYW5kIG5vIHBhdGggdG8gYW4gb3duZXIuJyB9LFxuICB7IHJlYXNvbjogJ3VucmVhY2hhYmxlJywgICBub3RlOiAnU2l4IHRvdWNoZXMgYWNyb3NzIGVtYWlsIGFuZCBwaG9uZSBvdmVyIGZvdXIgd2Vla3MsIG5vIHJlc3BvbnNlLicgfSxcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBsZWFkcyA9IGRlZmluZVNlZWQoTGVhZCwge1xuICBtb2RlOiAndXBzZXJ0JyxcbiAgZXh0ZXJuYWxJZDogJ2VtYWlsJyxcbiAgcmVjb3JkczogW1xuICAgIHtcbiAgICAgIGZpcnN0X25hbWU6ICdBbGljZScsXG4gICAgICBsYXN0X25hbWU6ICdNYXJ0aW5leicsXG4gICAgICBjb21wYW55OiAnTmV4dEdlbiBSZXRhaWwnLFxuICAgICAgZW1haWw6ICdhbGljZUBuZXh0Z2VucmV0YWlsLmV4YW1wbGUuY29tJyxcbiAgICAgIHBob25lOiAnKzEtNTAzLTU1NS0wNjAwJyxcbiAgICAgIHN0YXR1czogJ25ldycsXG4gICAgICBsZWFkX3NvdXJjZTogJ3dlYicsXG4gICAgICBpbmR1c3RyeTogJ3JldGFpbCcsXG4gICAgICByYXRpbmc6IDMsXG4gICAgICBuZXh0X2ZvbGxvd3VwX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygyKWAsXG4gICAgfSxcbiAgICB7XG4gICAgICBmaXJzdF9uYW1lOiAnRGF2aWQnLFxuICAgICAgbGFzdF9uYW1lOiAnS2ltJyxcbiAgICAgIGNvbXBhbnk6ICdFZHVUZWNoIExhYnMnLFxuICAgICAgZW1haWw6ICdka2ltQGVkdXRlY2hsYWJzLmV4YW1wbGUuY29tJyxcbiAgICAgIHBob25lOiAnKzEtNDA4LTU1NS0wNzAwJyxcbiAgICAgIHN0YXR1czogJ2NvbnRhY3RlZCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ3JlZmVycmFsJyxcbiAgICAgIGluZHVzdHJ5OiAnZWR1Y2F0aW9uJyxcbiAgICAgIHJhdGluZzogNCxcbiAgICAgIG5leHRfZm9sbG93dXBfZGF0ZTogY2VsYGRheXNGcm9tTm93KDEpYCxcbiAgICAgIC8vIEEgc2VlZGVkIGBoZWxkYCBldmVudCBuYW1lcyB0aGlzIGxlYWQsIGFuZCBgZXZlbnRfYWN0aXZpdHlfYnViYmxlYFxuICAgICAgLy8gc3RhbXBzIGBsYXN0X2NvbnRhY3RlZF9kYXRlYCB3aXRoIHRoZSBTRUVEIE1PTUVOVCByYXRoZXIgdGhhbiB0aGVcbiAgICAgIC8vIGV2ZW50J3Mgb3duIHRpbWVzdGFtcCBcdTIwMTQgc28gYW4gYXV0aG9yZWQgYWdlIGhlcmUgd291bGQgYmUgb3ZlcndyaXR0ZW5cbiAgICAgIC8vIHRoZSBpbnN0YW50IGl0IHdhcyB3cml0dGVuIChkb2N0cmluZSBydWxlIDIgaW4gYC4vX3NoYXJlZC50c2ApLiBEYXlcbiAgICAgIC8vIGdyYW51bGFyaXR5IGlzIHRoZSBob25lc3QgbWF0Y2g6IHRoZSBzZWVkIHdyaXRlcyB0b2RheSdzIFVUQyBtaWRuaWdodCxcbiAgICAgIC8vIHRoZSBidWJibGUgd3JpdGVzIHRvZGF5J3MgaW5zdGFudCwgYW5kIGJvdGggcmVuZGVyIGFzIFwidG9kYXlcIi5cbiAgICAgIGxhc3RfY29udGFjdGVkX2RhdGU6IGNlbGB0b2RheSgpYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZpcnN0X25hbWU6ICdMaXNhJyxcbiAgICAgIGxhc3RfbmFtZTogJ1Rob21wc29uJyxcbiAgICAgIGNvbXBhbnk6ICdDbG91ZEZpcnN0IEluYycsXG4gICAgICBlbWFpbDogJ2xpc2EudEBjbG91ZGZpcnN0LmV4YW1wbGUuY29tJyxcbiAgICAgIHBob25lOiAnKzEtMjA2LTU1NS0wODAwJyxcbiAgICAgIHN0YXR1czogJ3F1YWxpZmllZCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ2V2ZW50JyxcbiAgICAgIGluZHVzdHJ5OiAndGVjaG5vbG9neScsXG4gICAgICAvLyBXSE9MRSBzdGFycyBvbmx5LiBgbGVhZC5ob29rLnRzYCByb3VuZHMgaXRzIGNvbXB1dGVkIHNjb3JlIHRvIGFuXG4gICAgICAvLyBpbnRlZ2VyIGJlY2F1c2UgXCJoYWxmIHZhbHVlcyByZW5kZXJlZCBpbmNvbnNpc3RlbnRseSBpbiB0aGUgc3RhclxuICAgICAgLy8gd2lkZ2V0XCIsIGFuZCB0aGUgaG9vayBsZWF2ZXMgYW4gZXhwbGljaXRseSBzZWVkZWQgbnVtYmVyIGFsb25lIFx1MjAxNCBzbyBhXG4gICAgICAvLyBzZWVkZWQgNC41IHdhcyB0aGUgb25lIHJhdGluZyBpbiB0aGUgc3lzdGVtIHRoZSBjb250cmFjdCBjb3VsZCBuZXZlclxuICAgICAgLy8gcHJvZHVjZSwgYW5kIGl0IHJlbmRlcmVkIGFzIHRoZSBicm9rZW4gaGFsZi1zdGFyIGl0IHdhcyBtZWFudCB0b1xuICAgICAgLy8gcHJldmVudCAoIzU5MSkuXG4gICAgICByYXRpbmc6IDUsXG4gICAgICBuZXh0X2ZvbGxvd3VwX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygwKWAsXG4gICAgICAvLyBTYW1lIGFzIERhdmlkIEtpbSBhYm92ZTogYSBgaGVsZGAgcXVhbGlmaWNhdGlvbiBjYWxsIG5hbWVzIHRoaXMgbGVhZC5cbiAgICAgIGxhc3RfY29udGFjdGVkX2RhdGU6IGNlbGB0b2RheSgpYCxcbiAgICB9LFxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBHZW5lcmF0ZWQgZGVtbyBsZWFkcyBcdTIwMTQgc3ByZWFkIGFjcm9zcyA2IG1vbnRocyBmb3IgbW9udGhseS1idWNrZXQgcmVwb3J0c1xuICAgIC8vIChgTGVhZEluZmxvd0J5TW9udGhTb3VyY2VSZXBvcnRgKS4gRWFjaCBgbGFzdF9jb250YWN0ZWRfZGF0ZWAgbGl2ZXMgaW4gYVxuICAgIC8vIGRpc3RpbmN0IG1vbnRoIC8gc291cmNlIHBhaXIgc28gdGhlIG1hdHJpeCBoYXMgbXVsdGlwbGUgY2VsbHMgcG9wdWxhdGVkLlxuICAgIC4uLltcbiAgICAgIHsgZm46ICdOb2FoJywgICAgbG46ICdQYXRlbCcsICAgIGNvOiAnVmVydGV4IEFuYWx5dGljcycsICAgICBzcmM6ICd3ZWInLCAgICAgICAgIGluZDogJ3RlY2hub2xvZ3knLCAgIGFnZTogNyAgIH0sXG4gICAgICB7IGZuOiAnTWF5YScsICAgIGxuOiAnU2luZ2gnLCAgICBjbzogJ0JsdWVQZWFrIExvZ2lzdGljcycsICAgc3JjOiAncmVmZXJyYWwnLCAgICBpbmQ6ICdsb2dpc3RpY3MnLCAgICBhZ2U6IDE0ICB9LFxuICAgICAgeyBmbjogJ093ZW4nLCAgICBsbjogJ0JlY2tlcicsICAgY286ICdOb3J0aHdpbmQgRW5lcmd5JywgICAgIHNyYzogJ2V2ZW50JywgICAgICAgaW5kOiAnZW5lcmd5JywgICAgICAgYWdlOiAyMSAgfSxcbiAgICAgIHsgZm46ICdTYXJhJywgICAgbG46ICdMb3BleicsICAgIGNvOiAnSGVsaW9zIFNvbGFyJywgICAgICAgICBzcmM6ICdwYXJ0bmVyJywgICAgIGluZDogJ2VuZXJneScsICAgICAgIGFnZTogMjggIH0sXG4gICAgICB7IGZuOiAnTGVvJywgICAgIGxuOiAnVmFuY2UnLCAgICBjbzogJ0NsZWFuQ2FydCcsICAgICAgICAgICAgc3JjOiAnd2ViJywgICAgICAgICBpbmQ6ICdyZXRhaWwnLCAgICAgICBhZ2U6IDM4ICB9LFxuICAgICAgeyBmbjogJ0lyaXMnLCAgICBsbjogJ09rYWZvcicsICAgY286ICdQdWxzZUhlYWx0aCcsICAgICAgICAgIHNyYzogJ2NvbGRfY2FsbCcsICAgaW5kOiAnaGVhbHRoY2FyZScsICAgYWdlOiA0NSAgfSxcbiAgICAgIHsgZm46ICdSYXZpJywgICAgbG46ICdNZWh0YScsICAgIGNvOiAnRm91bmRyeSBSb2JvdGljcycsICAgICBzcmM6ICdldmVudCcsICAgICAgIGluZDogJ21hbnVmYWN0dXJpbmcnLGFnZTogNTIgIH0sXG4gICAgICB7IGZuOiAnVGVzcycsICAgIGxuOiAnQnJvd24nLCAgICBjbzogJ0xhdHRpY2UgRWR1Y2F0aW9uJywgICAgc3JjOiAncmVmZXJyYWwnLCAgICBpbmQ6ICdlZHVjYXRpb24nLCAgICBhZ2U6IDY3ICB9LFxuICAgICAgeyBmbjogJ01hcmNvJywgICBsbjogJ1JpY2NpJywgICAgY286ICdBdXJvcmEgVHJhdmVsJywgICAgICAgIHNyYzogJ2FkdmVydGlzZW1lbnQnLCBpbmQ6ICdob3NwaXRhbGl0eScsICAgICAgIGFnZTogNzQgIH0sXG4gICAgICB7IGZuOiAnUGlhJywgICAgIGxuOiAnQW5hbmQnLCAgICBjbzogJ0NpdHJpbmUgRmluYW5jZScsICAgICAgc3JjOiAncGFydG5lcicsICAgICBpbmQ6ICdmaW5hbmNlJywgYWdlOiA4MSB9LFxuICAgICAgeyBmbjogJ0pvbmFzJywgICBsbjogJ0hvbHQnLCAgICAgY286ICdQb2xhciBDYXJnbycsICAgICAgICAgIHNyYzogJ3dlYicsICAgICAgICAgaW5kOiAnbG9naXN0aWNzJywgICAgYWdlOiA5NSAgfSxcbiAgICAgIHsgZm46ICdBbnlhJywgICAgbG46ICdWb2xrb3YnLCAgIGNvOiAnUmVkT2FrIFJlYWx0eScsICAgICAgICBzcmM6ICdjb2xkX2NhbGwnLCAgIGluZDogJ3JlYWxfZXN0YXRlJywgIGFnZTogMTAyIH0sXG4gICAgICB7IGZuOiAnVGhlbycsICAgIGxuOiAnUGFyaycsICAgICBjbzogJ1NreWxpbmUgTWVkaWEnLCAgICAgICAgc3JjOiAnYWR2ZXJ0aXNlbWVudCcsIGluZDogJ21lZGlhJywgICAgICAgIGFnZTogMTE2IH0sXG4gICAgICB7IGZuOiAnV3JlbicsICAgIGxuOiAnR2FyY2lhJywgICBjbzogJ01hcGxlIEJha2VyeSBHcm91cCcsICAgc3JjOiAnZXZlbnQnLCAgICAgICBpbmQ6ICdyZXRhaWwnLCBhZ2U6IDEyMyB9LFxuICAgICAgeyBmbjogJ0h1Z28nLCAgICBsbjogJ0R1Ym9pcycsICAgY286ICdOaW1idXMgQWVyb3NwYWNlJywgICAgIHNyYzogJ3JlZmVycmFsJywgICAgaW5kOiAnbWFudWZhY3R1cmluZycsYWdlOiAxMzggfSxcbiAgICAgIHsgZm46ICdMZW5hJywgICAgbG46ICdGaXNjaGVyJywgIGNvOiAnR3Jhbml0ZSBJbnN1cmFuY2UnLCAgICBzcmM6ICdwYXJ0bmVyJywgICAgIGluZDogJ2ZpbmFuY2UnLCBhZ2U6IDE0NSB9LFxuICAgICAgeyBmbjogJ0thaScsICAgICBsbjogJ1dhdGFuYWJlJywgY286ICdDb3JhbCBSZWVmIEhvdGVscycsICAgIHNyYzogJ3dlYicsICAgICAgICAgaW5kOiAnaG9zcGl0YWxpdHknLCAgICAgICBhZ2U6IDE2MiB9LFxuICAgICAgeyBmbjogJ01pcmEnLCAgICBsbjogJ0Nvc3RhJywgICAgY286ICdBdGxhcyBDb25zdHJ1Y3Rpb24nLCAgIHNyYzogJ2NvbGRfY2FsbCcsICAgaW5kOiAnb3RoZXInLCBhZ2U6IDE3NSB9LFxuICAgIF0ubWFwKChsLCBpKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSBgJHtsLmNvLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnJyl9LmV4YW1wbGUuY29tYDtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IChbJ25ldycsICdjb250YWN0ZWQnLCAncXVhbGlmaWVkJywgJ3VucXVhbGlmaWVkJ10gYXMgY29uc3QpW2kgJSA0XTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpcnN0X25hbWU6IGwuZm4sXG4gICAgICAgIGxhc3RfbmFtZTogbC5sbixcbiAgICAgICAgY29tcGFueTogbC5jbyxcbiAgICAgICAgZW1haWw6IGAke2wuZm4udG9Mb3dlckNhc2UoKX0uJHtsLmxuLnRvTG93ZXJDYXNlKCl9QCR7ZG9tYWlufWAsXG4gICAgICAgIHBob25lOiBgKzEtNTU1LTAxJHtTdHJpbmcoaSkucGFkU3RhcnQoMiwgJzAnKX0tJHtTdHJpbmcoMTAwMCArIGkgKiA3KX1gLFxuICAgICAgICBzdGF0dXMsXG4gICAgICAgIGxlYWRfc291cmNlOiBsLnNyYyxcbiAgICAgICAgaW5kdXN0cnk6IGwuaW5kLFxuICAgICAgICByYXRpbmc6IDEgKyAoKGkgKiA3KSAlIDUpLFxuICAgICAgICBsYXN0X2NvbnRhY3RlZF9kYXRlOiBjZWxEYXlzQWdvKGwuYWdlKSxcbiAgICAgICAgLy8gVGhlIHF1YWxpZmljYXRpb24gZmllbGRzIHdlcmUgbGVmdCBibGFuayBvbiBldmVyeSBnZW5lcmF0ZWQgbGVhZCwgc29cbiAgICAgICAgLy8gdGhlIGRldGFpbCBwYWdlJ3MgQ29udGFjdCAvIExlYWQgRGV0YWlsIC8gRGVzY3JpcHRpb24gc2VjdGlvbnMgaGFkXG4gICAgICAgIC8vIG5vdGhpbmcgdG8gcmVuZGVyICh0aGV5IGFsc28gZHJvcCB3aGF0ZXZlciB0aGUgaGlnaGxpZ2h0cyBzdHJpcFxuICAgICAgICAvLyBhbHJlYWR5IHNob3dzLCBzbyBhbGwgZm91ciBjb2xsYXBzZWQgdG8gbm90aGluZykgYW5kIHRoZSBkZW1vIHJlYWRcbiAgICAgICAgLy8gbGlrZSBhIGhhbGYtZmluaXNoZWQgaW1wb3J0LlxuICAgICAgICB0aXRsZTogKFsnVlAgT3BlcmF0aW9ucycsICdIZWFkIG9mIElUJywgJ0RpcmVjdG9yIG9mIFNhbGVzJywgJ0NPTycsICdQcm9jdXJlbWVudCBMZWFkJ10gYXMgY29uc3QpW2kgJSA1XSxcbiAgICAgICAgbW9iaWxlOiBgKzEtNTU1LTAyJHtTdHJpbmcoaSkucGFkU3RhcnQoMiwgJzAnKX0tJHtTdHJpbmcoMjAwMCArIGkgKiAzKX1gLFxuICAgICAgICB3ZWJzaXRlOiBgaHR0cHM6Ly8ke2RvbWFpbn1gLFxuICAgICAgICBhbm51YWxfcmV2ZW51ZTogMl8wMDBfMDAwICsgKChpICogM183MDBfMDAwKSAlIDkwXzAwMF8wMDApLFxuICAgICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiAyNSArICgoaSAqIDEzNykgJSA0XzgwMCksXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIGBJbmJvdW5kIHZpYSAke2wuc3JjLnJlcGxhY2UoL18vZywgJyAnKX0uIEV2YWx1YXRpbmcgYSBDUk0gdG8gcmVwbGFjZSBzcHJlYWRzaGVldHMgYCArXG4gICAgICAgICAgYGFjcm9zcyB0aGVpciAke2wuaW5kLnJlcGxhY2UoL18vZywgJyAnKX0gb3BlcmF0aW9uLmAsXG4gICAgICAgIC4uLihzdGF0dXMgPT09ICd1bnF1YWxpZmllZCdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZGlzcXVhbGlmaWNhdGlvbl9yZWFzb246IERJU1FVQUxJRklDQVRJT05fUkVBU09OU1soaSA+PiAyKSAlIERJU1FVQUxJRklDQVRJT05fUkVBU09OUy5sZW5ndGhdLnJlYXNvbixcbiAgICAgICAgICAgICAgbm90ZXM6IERJU1FVQUxJRklDQVRJT05fUkVBU09OU1soaSA+PiAyKSAlIERJU1FVQUxJRklDQVRJT05fUkVBU09OUy5sZW5ndGhdLm5vdGUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9O1xuICAgIH0pLFxuICBdXG59KTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIExpbmUgaXRlbXM6IHRoZSBvbmUgc291cmNlIG9mIHRydXRoIGZvciBkZWFsIHZhbHVlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLyoqXG4gKiBPcHBvcnR1bml0eSBsaW5lIGl0ZW1zLCBrZXllZCBieSB0aGUgb3Bwb3J0dW5pdHkncyBuYW1lIChpdHMgc2VlZFxuICogZXh0ZXJuYWxJZCkuIEV2ZXJ5IHNlZWRlZCBkZWFsIGlzIGl0ZW1pc2VkIFx1MjAxNCBiZWZvcmUgIzU5MSBub3Qgb25lIHdhcywgc28gdGhlXG4gKiBQcm9kdWN0cyByZWxhdGVkIGxpc3Qgd2FzIGVtcHR5IG9uIGV2ZXJ5IG9wcG9ydHVuaXR5IGluIHRoZSBkZW1vIGFuZCB0aGUgQ1BRXG4gKiBzdG9yeSBoYWQgbm90aGluZyB0byBzaG93LlxuICpcbiAqIFRoZXNlIHN1bXMgYXJlIEFVVEhPUklUQVRJVkU6IGVhY2ggb3Bwb3J0dW5pdHkncyBgYW1vdW50YCBiZWxvdyBpcyBjb21wdXRlZFxuICogZnJvbSBpdHMgbGluZXMgYnkgYGRlYWxWYWx1ZSgpYCByYXRoZXIgdGhhbiB0eXBlZCBpbiwgd2hpY2ggaXMgdGhlIHNhbWVcbiAqIGFuc3dlciBgb3Bwb3J0dW5pdHlfYW1vdW50X3JvbGx1cGAgY29tcHV0ZXMgd2hlbiBhIHJlcCB0b3VjaGVzIGEgbGluZS4gVGhlcmVcbiAqIGlzIHRoZXJlZm9yZSBubyBzZWVkZWQgcGFyZW50IHRvdGFsIHRoYXQgYSBmaXJzdCBsaW5lLWl0ZW0gZWRpdCBjYW4gc2lsZW50bHlcbiAqIHJld3JpdGUgXHUyMDE0IHRoZSBhY2NlcHRhbmNlIGNvbmRpdGlvbiBvZiAjNTkxIGhvbGRzIGJ5IGNvbnN0cnVjdGlvbiByYXRoZXIgdGhhblxuICogYnkgYW55b25lIHJlLWNoZWNraW5nIHRoZSBhcml0aG1ldGljLlxuICpcbiAqIERlcml2aW5nIHJhdGhlciB0aGFuIGRlbGVnYXRpbmcgaXMgZGVsaWJlcmF0ZS4gTGV0dGluZyB0aGUgcm9sbHVwIG93biB0aGVcbiAqIG51bWJlciB3b3VsZCBtYWtlIGV2ZXJ5IHNlZWRlZCBgYW1vdW50YCBkZXBlbmQgb24gd2hldGhlciBob29rcyBmaXJlIG92ZXJcbiAqIHNlZWQgd3JpdGVzIFx1MjAxNCB3aGljaCB0aGUgZG9jdHJpbmUgYmxvY2sgYWJvdmUgc2F5cyB0aGV5IGRvIG5vdCBhbmQgYSBib290IGxvZ1xuICogc2F5cyB0aGV5IGRvICgjNjE3KSBcdTIwMTQgYW5kIG9uIHRoYXQgaG9vayBzdXJ2aXZpbmcgaXRzIG93biB3cml0ZSBjYWxsICgjNjE2KS5cbiAqIEEgZGVyaXZlZCBsaXRlcmFsIGlzIGNvcnJlY3QgdW5kZXIgZXZlcnkgb25lIG9mIHRob3NlIGNvbWJpbmF0aW9uczogaWYgdGhlXG4gKiByb2xsdXAgcnVucyBpdCByZWNvbXB1dGVzIHRoZSBzYW1lIGZpZ3VyZSwgYW5kIGlmIGl0IG5ldmVyIHJ1bnMgdGhlIGZpZ3VyZVxuICogd2FzIGFscmVhZHkgcmlnaHQuXG4gKi9cbmV4cG9ydCBjb25zdCBPUFBPUlRVTklUWV9MSU5FUzogUmVjb3JkPHN0cmluZywgcmVhZG9ubHkgTGluZVNwZWNbXT4gPSB7XG4gICdBY21lIFBsYXRmb3JtIFVwZ3JhZGUnOiBbXG4gICAgeyBwcm9kdWN0OiAnT2JqZWN0U3RhY2sgUGxhdGZvcm0nLCBxdWFudGl0eTogMiwgdW5pdF9wcmljZTogNTAwMDAsIGRpc2NvdW50OiAxMCwgZGVzY3JpcHRpb246ICdFbnRlcnByaXNlIGVkaXRpb24gXHUyMDE0IE5BICsgRU1FQSBwcm9kdWN0aW9uIHRlbmFudHMgKG11bHRpLXllYXIgZGlzY291bnQpLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdQcmVtaXVtIFN1cHBvcnQnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogMjUwMDAsIGRlc2NyaXB0aW9uOiAnMjRcdTAwRDc3IHByZW1pdW0gc3VwcG9ydCB3aXRoIGEgbmFtZWQgVEFNLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJywgcXVhbnRpdHk6IDM1LCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgT3BzIG9yZ2FuaXphdGlvbi4nIH0sXG4gIF0sXG4gICdHbG9iZXggTWFudWZhY3R1cmluZyBTdWl0ZSc6IFtcbiAgICB7IHByb2R1Y3Q6ICdPYmplY3RTdGFjayBQbGF0Zm9ybScsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiA1MDAwMCwgZGVzY3JpcHRpb246ICdFbnRlcnByaXNlIGVkaXRpb24gXHUyMDE0IG9uZSBzaGFyZWQgdGVuYW50IHNlcnZpbmcgYWxsIHNpeCBtYW51ZmFjdHVyaW5nIHNpdGVzLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBZG1pbiBUcmFpbmluZyBXb3Jrc2hvcCcsIHF1YW50aXR5OiA0LCB1bml0X3ByaWNlOiA2MDAwLCBkZXNjcmlwdGlvbjogJ0ZvdXIgd29ya3Nob3AgZGF5cywgb25lIHBlciByZWdpb25hbCBwbGFudCBjbHVzdGVyLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdTdGFuZGFyZCBTdXBwb3J0JywgcXVhbnRpdHk6IDEsIHVuaXRfcHJpY2U6IDkwMDAsIGRlc2NyaXB0aW9uOiAnQnVzaW5lc3MtaG91cnMgc3VwcG9ydCBmb3IgdGhlIGZpcnN0IHllYXIuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogMTIsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnQWdlbnQgc2VhdHMgZm9yIHRoZSBwbGFudCBvcGVyYXRpb25zIGxlYWRzLicgfSxcbiAgXSxcbiAgJ1dheW5lIEVudGVycHJpc2UgTGljZW5zZSc6IFtcbiAgICB7IHByb2R1Y3Q6ICdPYmplY3RTdGFjayBQbGF0Zm9ybScsIHF1YW50aXR5OiAyMCwgdW5pdF9wcmljZTogNTAwMDAsIGRpc2NvdW50OiAxNSwgZGVzY3JpcHRpb246ICdFbnRlcnByaXNlLXdpZGUgbGljZW5zZSwgdm9sdW1lIGRpc2NvdW50IGF0IDIwIHRlbmFudHMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ1ByZW1pdW0gU3VwcG9ydCcsIHF1YW50aXR5OiA0LCB1bml0X3ByaWNlOiAyNTAwMCwgZGVzY3JpcHRpb246ICdQcmVtaXVtIHN1cHBvcnQgYWNyb3NzIGZvdXIgYnVzaW5lc3MgdW5pdHMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogMjUwLCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgZ2xvYmFsIHJldmVudWUgb3JnYW5pemF0aW9uLicgfSxcbiAgXSxcbiAgJ0luaXRlY2ggQ2xvdWQgTWlncmF0aW9uJzogW1xuICAgIHsgcHJvZHVjdDogJ0RhdGEgTWlncmF0aW9uIFNlcnZpY2VzJywgcXVhbnRpdHk6IDEsIHVuaXRfcHJpY2U6IDM1MDAwLCBkZXNjcmlwdGlvbjogJ01pZ3JhdGlvbiBvZmYgdGhlIGxlZ2FjeSBvbi1wcmVtaXNlIENSTS4nIH0sXG4gICAgeyBwcm9kdWN0OiAnQ2xvdWQgSG9zdGluZyAoQW5udWFsKScsIHF1YW50aXR5OiAyLCB1bml0X3ByaWNlOiAxMjAwMCwgZGVzY3JpcHRpb246ICdNYW5hZ2VkIGhvc3RpbmcsIHByaW1hcnkgKyBEUiByZWdpb24uJyB9LFxuICAgIHsgcHJvZHVjdDogJ1N0YW5kYXJkIFN1cHBvcnQnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogOTAwMCwgZGVzY3JpcHRpb246ICdCdXNpbmVzcy1ob3VycyBzdXBwb3J0IGZvciB0aGUgZmlyc3QgeWVhci4nIH0sXG4gICAgeyBwcm9kdWN0OiAnQUkgQWdlbnQgU2VhdCAoQW5udWFsKScsIHF1YW50aXR5OiAxMiwgdW5pdF9wcmljZTogMTAwMCwgZGVzY3JpcHRpb246ICdBZ2VudCBzZWF0cyBmb3IgdGhlIHNlcnZpY2UgZGVzay4nIH0sXG4gIF0sXG4gICdBY21lIEFubnVhbCBSZW5ld2FsIDIwMjUnOiBbXG4gICAgeyBwcm9kdWN0OiAnT2JqZWN0U3RhY2sgUGxhdGZvcm0nLCBxdWFudGl0eTogMywgdW5pdF9wcmljZTogNTAwMDAsIGRlc2NyaXB0aW9uOiAnUmVuZXdhbCBvZiB0aGUgdGhyZWUgcHJvZHVjdGlvbiB0ZW5hbnRzLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdQcmVtaXVtIFN1cHBvcnQnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogMjUwMDAsIGRlc2NyaXB0aW9uOiAnUHJlbWl1bSBzdXBwb3J0IHJlbmV3YWwuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogNDUsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnU2VhdCBleHBhbnNpb24gZHJpdmVuIGJ5IHRoZSBuZXcgRU1FQSB0ZWFtLicgfSxcbiAgXSxcbiAgJ1N0YXJrIE1lZGljYWwgUGlsb3QnOiBbXG4gICAgeyBwcm9kdWN0OiAnT2JqZWN0U3RhY2sgUGxhdGZvcm0nLCBxdWFudGl0eTogMiwgdW5pdF9wcmljZTogNTAwMDAsIGRlc2NyaXB0aW9uOiAnUGlsb3QgdGVuYW50cyBmb3IgdHdvIGNsaW5pY2FsIHNlcnZpY2UgbGluZXMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ1N0YW5kYXJkIFN1cHBvcnQnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogOTAwMCwgZGVzY3JpcHRpb246ICdTdGFuZGFyZCBzdXBwb3J0IGR1cmluZyB0aGUgcGlsb3QuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FkbWluIFRyYWluaW5nIFdvcmtzaG9wJywgcXVhbnRpdHk6IDYsIHVuaXRfcHJpY2U6IDYwMDAsIGRlc2NyaXB0aW9uOiAnU2l4IHdvcmtzaG9wIGRheXMgZm9yIHRoZSBjbGluaWNhbCBvcGVyYXRpb25zIGFkbWlucy4nIH0sXG4gIF0sXG4gICdXYXluZSBRMSBFeHBhbnNpb24nOiBbXG4gICAgeyBwcm9kdWN0OiAnT2JqZWN0U3RhY2sgUGxhdGZvcm0nLCBxdWFudGl0eTogNiwgdW5pdF9wcmljZTogNTAwMDAsIGRlc2NyaXB0aW9uOiAnRXhwYW5zaW9uIGludG8gc2l4IGFkZGl0aW9uYWwgc3Vic2lkaWFyaWVzLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdQcmVtaXVtIFN1cHBvcnQnLCBxdWFudGl0eTogMiwgdW5pdF9wcmljZTogMjUwMDAsIGRlc2NyaXB0aW9uOiAnUHJlbWl1bSBzdXBwb3J0IGZvciB0aGUgZXhwYW5kZWQgZm9vdHByaW50LicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJywgcXVhbnRpdHk6IDMwLCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgZXhwYW5zaW9uIHRlYW1zLicgfSxcbiAgXSxcbiAgJ0dsb2JleCBUcmFpbmluZyBQYWNrYWdlJzogW1xuICAgIHsgcHJvZHVjdDogJ0FkbWluIFRyYWluaW5nIFdvcmtzaG9wJywgcXVhbnRpdHk6IDEwLCB1bml0X3ByaWNlOiA2MDAwLCBkZXNjcmlwdGlvbjogJ1RlbiB3b3Jrc2hvcCBkYXlzIGFjcm9zcyB0aGUgcGxhbnQgYWRtaW4gY29tbXVuaXR5LicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJywgcXVhbnRpdHk6IDUsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnQWdlbnQgc2VhdHMgZm9yIHRoZSB0cmFpbmluZyBzYW5kYm94LicgfSxcbiAgXSxcbiAgJ0luaXRlY2ggUGhhc2UgMSc6IFtcbiAgICB7IHByb2R1Y3Q6ICdJbXBsZW1lbnRhdGlvbiBTZXJ2aWNlcycsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiA3NTAwMCwgZGVzY3JpcHRpb246ICdQaGFzZSAxIGltcGxlbWVudGF0aW9uOiBhY2NvdW50cywgY29udGFjdHMsIHBpcGVsaW5lLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdTdGFuZGFyZCBTdXBwb3J0JywgcXVhbnRpdHk6IDEsIHVuaXRfcHJpY2U6IDkwMDAsIGRlc2NyaXB0aW9uOiAnU3RhbmRhcmQgc3VwcG9ydCBmb3IgcGhhc2UgMS4nIH0sXG4gICAgeyBwcm9kdWN0OiAnQUkgQWdlbnQgU2VhdCAoQW5udWFsKScsIHF1YW50aXR5OiA2LCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgcGhhc2UtMSBwaWxvdCBncm91cC4nIH0sXG4gIF0sXG4gICdBY21lIEFkZC1vbiAoTG9zdCknOiBbXG4gICAgeyBwcm9kdWN0OiAnQW5hbHl0aWNzIEFkZC1vbicsIHF1YW50aXR5OiAyLCB1bml0X3ByaWNlOiAyMjAwMCwgZGVzY3JpcHRpb246ICdNYXJrZXRpbmcgYW5hbHl0aWNzIGZvciB0d28gYnVzaW5lc3MgdW5pdHMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0ludGVncmF0aW9uIENvbm5lY3RvciBQYWNrJywgcXVhbnRpdHk6IDEsIHVuaXRfcHJpY2U6IDE2MDAwLCBkZXNjcmlwdGlvbjogJ01hcmtldGluZy1hdXRvbWF0aW9uIGNvbm5lY3RvciBwYWNrLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdTYW5kYm94IEVudmlyb25tZW50IChBbm51YWwpJywgcXVhbnRpdHk6IDIsIHVuaXRfcHJpY2U6IDc1MDAsIGRlc2NyaXB0aW9uOiAnVHdvIHNhbmRib3hlcyBmb3IgdGhlIG1hcmtldGluZyBidWlsZC1vdXQuJyB9LFxuICBdLFxuICAnU3RhcmsgRXhwYW5zaW9uIChMb3N0KSc6IFtcbiAgICB7IHByb2R1Y3Q6ICdPYmplY3RTdGFjayBQbGF0Zm9ybScsIHF1YW50aXR5OiAyLCB1bml0X3ByaWNlOiA1MDAwMCwgZGVzY3JpcHRpb246ICdUd28gYWRkaXRpb25hbCBjbGluaWNhbCB0ZW5hbnRzLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdGaWVsZCBTZXJ2aWNlIE1vYmlsZScsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiAxNDAwMCwgZGVzY3JpcHRpb246ICdGaWVsZCBzZXJ2aWNlIG1vYmlsZSBmb3IgdGhlIGRldmljZS1zZXJ2aWNpbmcgdGVhbS4nIH0sXG4gICAgeyBwcm9kdWN0OiAnQUkgQWdlbnQgU2VhdCAoQW5udWFsKScsIHF1YW50aXR5OiA2LCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgc2VydmljZSBjb29yZGluYXRvcnMuJyB9LFxuICBdLFxuICAnR2xvYmV4IExpbmUgRXhwYW5zaW9uIChMb3N0KSc6IFtcbiAgICB7IHByb2R1Y3Q6ICdPYmplY3RTdGFjayBQbGF0Zm9ybScsIHF1YW50aXR5OiAyLCB1bml0X3ByaWNlOiA1MDAwMCwgZGVzY3JpcHRpb246ICdUd28gZnVydGhlciBwcm9kdWN0aW9uLWxpbmUgdGVuYW50cy4nIH0sXG4gICAgeyBwcm9kdWN0OiAnSW50ZWdyYXRpb24gQ29ubmVjdG9yIFBhY2snLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogMTYwMDAsIGRlc2NyaXB0aW9uOiAnQ29ubmVjdG9yIHBhY2sgZm9yIHRoZSBsaW5lLWNvbnRyb2wgc3lzdGVtcy4nIH0sXG4gICAgeyBwcm9kdWN0OiAnQUkgQWdlbnQgU2VhdCAoQW5udWFsKScsIHF1YW50aXR5OiA4LCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgbGluZSBzdXBlcnZpc29ycy4nIH0sXG4gIF0sXG4gICdOb3J0aHdpbmQgRmllbGQgU2VydmljZSBQaWxvdCAoTG9zdCknOiBbXG4gICAgeyBwcm9kdWN0OiAnRmllbGQgU2VydmljZSBNb2JpbGUnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogMTQwMDAsIGRlc2NyaXB0aW9uOiAnRmllbGQtc2VydmljZSBtb2JpbGUgZm9yIHRoZSBtZXRlcmluZyBjcmV3cy4nIH0sXG4gICAgeyBwcm9kdWN0OiAnU3RhbmRhcmQgU3VwcG9ydCcsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiA5MDAwLCBkZXNjcmlwdGlvbjogJ0J1c2luZXNzLWhvdXJzIHN1cHBvcnQgZHVyaW5nIHRoZSBwaWxvdC4nIH0sXG4gICAgeyBwcm9kdWN0OiAnQUkgQWdlbnQgU2VhdCAoQW5udWFsKScsIHF1YW50aXR5OiAxMCwgdW5pdF9wcmljZTogMTAwMCwgZGVzY3JpcHRpb246ICdBZ2VudCBzZWF0cyBmb3IgdGhlIGRpc3BhdGNoIGRlc2suJyB9LFxuICBdLFxuICAnQXBleCBDb21wbGlhbmNlIFJlcG9ydGluZyAoTG9zdCknOiBbXG4gICAgeyBwcm9kdWN0OiAnQW5hbHl0aWNzIEFkZC1vbicsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiAyMjAwMCwgZGVzY3JpcHRpb246ICdSZWd1bGF0b3J5IHJlcG9ydGluZyBwYWNrIGZvciBmbGVldCBjb21wbGlhbmNlLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdTYW5kYm94IEVudmlyb25tZW50IChBbm51YWwpJywgcXVhbnRpdHk6IDEsIHVuaXRfcHJpY2U6IDc1MDAsIGRlc2NyaXB0aW9uOiAnU2FuZGJveCBmb3IgdGhlIGNvbXBsaWFuY2UgcnVsZSBidWlsZC1vdXQuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogNiwgdW5pdF9wcmljZTogMTAwMCwgZGVzY3JpcHRpb246ICdBZ2VudCBzZWF0cyBmb3IgdGhlIGNvbXBsaWFuY2UgYW5hbHlzdHMuJyB9LFxuICBdLFxuICAnTm9ydGh3aW5kIEdyaWQgTW9kZXJuaXphdGlvbic6IFtcbiAgICB7IHByb2R1Y3Q6ICdPYmplY3RTdGFjayBQbGF0Zm9ybScsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiA1MDAwMCwgZGVzY3JpcHRpb246ICdFbnRlcnByaXNlIGVkaXRpb24gZm9yIGdyaWQsIGZpZWxkIGFuZCBjdXN0b21lciBvcGVyYXRpb25zLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdGaWVsZCBTZXJ2aWNlIE1vYmlsZScsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiAxNDAwMCwgZGVzY3JpcHRpb246ICdGaWVsZC1zZXJ2aWNlIG1vYmlsZSBmb3IgdGhlIGdyaWQgbWFpbnRlbmFuY2UgY3Jld3MuJyB9LFxuICAgIHsgcHJvZHVjdDogJ1NhbmRib3ggRW52aXJvbm1lbnQgKEFubnVhbCknLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogNzUwMCwgZGVzY3JpcHRpb246ICdTYW5kYm94IGZvciB0aGUgb3BlcmF0aW9uYWwtZGF0YSBhc3Nlc3NtZW50LicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJywgcXVhbnRpdHk6IDE1LCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgY29udHJvbC1yb29tIHBpbG90LicgfSxcbiAgXSxcbiAgJ0xhdHRpY2UgU3R1ZGVudCBTdWNjZXNzIFBsYXRmb3JtJzogW1xuICAgIHsgcHJvZHVjdDogJ09iamVjdFN0YWNrIFBsYXRmb3JtIChTTUIgRWRpdGlvbiknLCBxdWFudGl0eTogMiwgdW5pdF9wcmljZTogMTgwMDAsIGRlc2NyaXB0aW9uOiAnU3R1ZGVudC1zdWNjZXNzIHRlbmFudHMgZm9yIHRoZSB0d28gcGlsb3QgY29sbGVnZXMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FkbWluIFRyYWluaW5nIFdvcmtzaG9wJywgcXVhbnRpdHk6IDIsIHVuaXRfcHJpY2U6IDYwMDAsIGRlc2NyaXB0aW9uOiAnVHdvIHdvcmtzaG9wIGRheXMgZm9yIHRoZSBzdHVkZW50LXN1Y2Nlc3MgYWR2aXNlcnMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogNSwgdW5pdF9wcmljZTogMTAwMCwgZGVzY3JpcHRpb246ICdBZ2VudCBzZWF0cyBmb3IgdGhlIGFkdmlzaW5nIHRlYW0uJyB9LFxuICBdLFxuICAnVmVydGV4IEFuYWx5dGljcyBFeHBhbnNpb24nOiBbXG4gICAgeyBwcm9kdWN0OiAnQW5hbHl0aWNzIEFkZC1vbicsIHF1YW50aXR5OiAyLCB1bml0X3ByaWNlOiAyMjAwMCwgZGVzY3JpcHRpb246ICdBbmFseXRpY3MgZm9yIHRoZSBzYWxlcyBhbmQgbWFya2V0aW5nIHRlYW1zLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdQcmVtaXVtIFN1cHBvcnQnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogMjUwMDAsIGRlc2NyaXB0aW9uOiAnUHJlbWl1bSBzdXBwb3J0IGZvciB0aGUgZXhwYW5kZWQgZm9vdHByaW50LicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJywgcXVhbnRpdHk6IDEwLCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgcmV2ZW51ZSBvcGVyYXRpb25zIHRlYW0uJyB9LFxuICBdLFxuICAnQXBleCBMb2dpc3RpY3MgRGF0YSBIdWInOiBbXG4gICAgeyBwcm9kdWN0OiAnT2JqZWN0U3RhY2sgUGxhdGZvcm0nLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogNTAwMDAsIGRlc2NyaXB0aW9uOiAnRGF0YS1odWIgdGVuYW50IHNoYXJlZCBieSBjb21tZXJjaWFsLCBvcGVyYXRpb25zIGFuZCBmaW5hbmNlLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdEYXRhIE1pZ3JhdGlvbiBTZXJ2aWNlcycsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiAzNTAwMCwgZGVzY3JpcHRpb246ICdDb25zb2xpZGF0aW9uIG9mIGZvdXIgZnJhZ21lbnRlZCBjb21tZXJjaWFsIHN5c3RlbXMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogOCwgdW5pdF9wcmljZTogMTAwMCwgZGVzY3JpcHRpb246ICdBZ2VudCBzZWF0cyBmb3IgdGhlIGNvbW1lcmNpYWwgb3BlcmF0aW9ucyB0ZWFtLicgfSxcbiAgXSxcbiAgJ0xhdHRpY2UgRWR1Y2F0aW9uIFJlbmV3YWwnOiBbXG4gICAgeyBwcm9kdWN0OiAnT2JqZWN0U3RhY2sgUGxhdGZvcm0nLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogNTAwMDAsIGRlc2NyaXB0aW9uOiAnUmVuZXdhbCBvZiB0aGUgaW5zdGl0dXRpb24td2lkZSB0ZW5hbnQuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FuYWx5dGljcyBBZGQtb24nLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogMjIwMDAsIGRlc2NyaXB0aW9uOiAnRXhwYW5kZWQgYW5hbHl0aWNzIHBhY2thZ2UgZm9yIHRoZSByZW5ld2FsIHRlcm0uJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogMTUsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnU3R1ZGVudC1zdWNjZXNzIGF1dG9tYXRpb24gc2VhdHMuJyB9LFxuICBdLFxuICAnVmVydGV4IEVudGVycHJpc2UgUm9sbG91dCc6IFtcbiAgICB7IHByb2R1Y3Q6ICdPYmplY3RTdGFjayBQbGF0Zm9ybScsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiA1MDAwMCwgZGlzY291bnQ6IDIwLCBkZXNjcmlwdGlvbjogJ1BoYXNlLW9uZSB0ZW5hbnQgZm9yIHRoZSBmaXJzdCByZWdpb24sIHdpdGggZGF0YS1yZXNpZGVuY3kgY29udHJvbHMgKG11bHRpLXBoYXNlIGNvbW1pdG1lbnQgZGlzY291bnQpLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdEYXRhIE1pZ3JhdGlvbiBTZXJ2aWNlcycsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiAzNTAwMCwgZGVzY3JpcHRpb246ICdQaGFzZS1vbmUgbWlncmF0aW9uIG9mIHRoZSByZWdpb25hbCByZXZlbnVlIGRhdGEuJyB9LFxuICAgIHsgcHJvZHVjdDogJ1N0YW5kYXJkIFN1cHBvcnQnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogOTAwMCwgZGVzY3JpcHRpb246ICdCdXNpbmVzcy1ob3VycyBzdXBwb3J0IGZvciBwaGFzZSBvbmUuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogMTAsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnQWdlbnQgc2VhdHMgZm9yIHRoZSBmaXJzdCByb2xsb3V0IHdhdmUuJyB9LFxuICBdLFxuICAvLyBDYW1wYWlnbi1hdHRyaWJ1dGVkIHdpbnMgXHUyMDE0IHNlZSB0aGUgY2FtcGFpZ24gbWV0cmljcyBub3RlIGJlbG93LlxuICAnTGF0dGljZSBBbmFseXRpY3MgRXhwYW5zaW9uJzogW1xuICAgIHsgcHJvZHVjdDogJ0FuYWx5dGljcyBBZGQtb24nLCBxdWFudGl0eTogMiwgdW5pdF9wcmljZTogMjIwMDAsIGRlc2NyaXB0aW9uOiAnQW5hbHl0aWNzIGZvciBhZG1pc3Npb25zIGFuZCBhbHVtbmkgZW5nYWdlbWVudC4nIH0sXG4gICAgeyBwcm9kdWN0OiAnQWRtaW4gVHJhaW5pbmcgV29ya3Nob3AnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogNjAwMCwgZGVzY3JpcHRpb246ICdBbmFseXRpY3MgZW5hYmxlbWVudCBkYXkgZm9yIHRoZSBpbnN0aXR1dGlvbmFsLXJlc2VhcmNoIHRlYW0uJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogMjAsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnQWdlbnQgc2VhdHMgZm9yIHRoZSBhZG1pc3Npb25zIHRlYW0uJyB9LFxuICBdLFxuICAnV2F5bmUgT3BlcmF0aW9ucyBNb2R1bGUgUm9sbG91dCc6IFtcbiAgICB7IHByb2R1Y3Q6ICdPYmplY3RTdGFjayBQbGF0Zm9ybScsIHF1YW50aXR5OiAyLCB1bml0X3ByaWNlOiA1MDAwMCwgZGVzY3JpcHRpb246ICdPcGVyYXRpb25zIHRlbmFudHMgZm9yIHR3byBtYW51ZmFjdHVyaW5nIGRpdmlzaW9ucy4nIH0sXG4gICAgeyBwcm9kdWN0OiAnU3RhbmRhcmQgU3VwcG9ydCcsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiA5MDAwLCBkZXNjcmlwdGlvbjogJ1N0YW5kYXJkIHN1cHBvcnQgZm9yIHRoZSBvcGVyYXRpb25zIHJvbGxvdXQuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogMTEsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnQWdlbnQgc2VhdHMgZm9yIHRoZSBvcGVyYXRpb25zIHBsYW5uZXJzLicgfSxcbiAgXSxcbiAgJ1ZlcnRleCBEZXZlbG9wZXIgUGxhdGZvcm0gQWRvcHRpb24nOiBbXG4gICAgeyBwcm9kdWN0OiAnT2JqZWN0U3RhY2sgUGxhdGZvcm0nLCBxdWFudGl0eTogMywgdW5pdF9wcmljZTogNTAwMDAsIGRlc2NyaXB0aW9uOiAnRGV2ZWxvcGVyIHBsYXRmb3JtIHRlbmFudHMgZm9yIHRocmVlIHByb2R1Y3QgdGVhbXMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0ludGVncmF0aW9uIENvbm5lY3RvciBQYWNrJywgcXVhbnRpdHk6IDEsIHVuaXRfcHJpY2U6IDE2MDAwLCBkZXNjcmlwdGlvbjogJ0Nvbm5lY3RvciBwYWNrIGZvciB0aGUgaW50ZXJuYWwgZGF0YSB3YXJlaG91c2UuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FuYWx5dGljcyBBZGQtb24nLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogMjIwMDAsIGRlc2NyaXB0aW9uOiAnUHJvZHVjdC11c2FnZSBhbmFseXRpY3MgZm9yIHRoZSBwbGF0Zm9ybSB0ZWFtLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJywgcXVhbnRpdHk6IDEyLCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgZGV2ZWxvcGVyLWV4cGVyaWVuY2UgdGVhbS4nIH0sXG4gIF0sXG59O1xuXG4vKipcbiAqIGBhbW91bnRgICsgYGV4cGVjdGVkX3JldmVudWVgIGZvciBhIHNlZWRlZCBkZWFsLCBib3RoIGRlcml2ZWQgZnJvbSBpdHMgbGluZVxuICogaXRlbXMuIGBleHBlY3RlZF9yZXZlbnVlYCB1c2VzIG9wcG9ydHVuaXR5Lmhvb2sudHMncyBvd24gZXhwcmVzc2lvblxuICogKGBNYXRoLnJvdW5kKGFtb3VudCAqIHByb2JhYmlsaXR5KSAvIDEwMGApIHNvIHRoZSB0d28gYWdyZWUgdG8gdGhlIGNlbnQuXG4gKi9cbmNvbnN0IGRlYWxWYWx1ZSA9IChvcHBvcnR1bml0eU5hbWU6IHN0cmluZywgcHJvYmFiaWxpdHk6IG51bWJlcikgPT4ge1xuICBjb25zdCBsaW5lcyA9IE9QUE9SVFVOSVRZX0xJTkVTW29wcG9ydHVuaXR5TmFtZV07XG4gIGlmICghbGluZXMpIHRocm93IG5ldyBFcnJvcihgU2VlZCBlcnJvcjogbm8gbGluZSBpdGVtcyBhdXRob3JlZCBmb3Igb3Bwb3J0dW5pdHkgXCIke29wcG9ydHVuaXR5TmFtZX1cImApO1xuICBjb25zdCBhbW91bnQgPSBsaW5lc1RvdGFsKGxpbmVzKTtcbiAgcmV0dXJuIHsgYW1vdW50LCBleHBlY3RlZF9yZXZlbnVlOiBNYXRoLnJvdW5kKGFtb3VudCAqIHByb2JhYmlsaXR5KSAvIDEwMCB9O1xufTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIE9wcG9ydHVuaXRpZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vLyBgcHJvYmFiaWxpdHlgLCBgZm9yZWNhc3RfY2F0ZWdvcnlgIGFuZCBgZXhwZWN0ZWRfcmV2ZW51ZWAgYXJlIGRlcml2ZWQgZnJvbVxuLy8gYHN0YWdlYCBieSBvcHBvcnR1bml0eS5ob29rLnRzIChTVEFHRV9QUk9CQUJJTElUWSAvIFNUQUdFX0ZPUkVDQVNUKS4gSG9va3Ncbi8vIGRvbid0IHJ1biBvdmVyIHNlZWRzLCBzbyBldmVyeSByb3cgYmVsb3cgY2FycmllcyB0aGUgZXhhY3QgdmFsdWVzIHRoZSBob29rXG4vLyB3b3VsZCBjb21wdXRlIFx1MjAxNCBhbnl0aGluZyBlbHNlIGdldHMgc2lsZW50bHkgcmV3cml0dGVuIG9uIHRoZSBmaXJzdCB1c2VyXG4vLyBlZGl0ICgjNDkwKS5cbi8vXG4vLyBgc3RhZ2VfZW50cnlfZGF0ZWAgZm9sbG93cyB0aGUgc2FtZSBydWxlOiB0aGUgaG9vayBzdGFtcHMgaXQgb24gZXZlcnkgaW5zZXJ0XG4vLyBhbmQgc3RhZ2UgY2hhbmdlLCBzbyBhIHNlZWRlZCBkZWFsIHdpdGhvdXQgb25lIGlzIGEgc2hhcGUgcmVhbCBkYXRhIG5ldmVyXG4vLyBoYXMgXHUyMDE0IGFuZCBpdCBpcyB3aGF0IHRoZSBzdGFnbmF0aW9uIHN3ZWVwIGZpbHRlcnMgb24gYW5kIHdoYXQgdGhlXG4vLyBgZGF5c19pbl9zdGFnZWAgRk9STVVMQSBjb3VudHMgZnJvbSwgc28gaXQgcmVwbGFjZXMgdGhlIG9sZCBoYXJkY29kZWRcbi8vIGBkYXlzX2luX3N0YWdlYCBudW1iZXJzICgjNDg5KS4gT3BlbiBkZWFscyBjYXJyeSBhbiBhZ2UgdGhhdCBzcGFucyB0aGVcbi8vIDE0LWRheSBzdGFsZSB0aHJlc2hvbGQgaW4gYm90aCBkaXJlY3Rpb25zOyBzZXR0bGVkIGRlYWxzIGVudGVyZWQgdGhlaXJcbi8vIGNsb3NlZCBzdGFnZSBvbiB0aGVpciBjbG9zZSBkYXRlLlxuZXhwb3J0IGNvbnN0IG9wcG9ydHVuaXRpZXMgPSBkZWZpbmVTZWVkKE9wcG9ydHVuaXR5LCB7XG4gIG1vZGU6ICd1cHNlcnQnLFxuICBleHRlcm5hbElkOiAnbmFtZScsXG4gIHJlY29yZHM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnQWNtZSBQbGF0Zm9ybSBVcGdyYWRlJyxcbiAgICAgIGNybV9hY2NvdW50OiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICAuLi5kZWFsVmFsdWUoJ0FjbWUgUGxhdGZvcm0gVXBncmFkZScsIDYwKSxcbiAgICAgIHN0YWdlOiAncHJvcG9zYWwnLFxuICAgICAgcHJvYmFiaWxpdHk6IDYwLFxuICAgICAgY2xvc2VfZGF0ZTogY2VsYGRheXNGcm9tTm93KDMwKWAsXG4gICAgICB0eXBlOiAnZXhpc3RpbmdfdXBncmFkZScsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ2NvbW1pdCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ3dlYicsXG4gICAgICBzdGFnZV9lbnRyeV9kYXRlOiBjZWxEYXlzQWdvKDEyKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgVXBncmFkZSBmcm9tIFN0YW5kYXJkIHRvIEVudGVycHJpc2UgZWRpdGlvbiBmb3IgdGhlXG5OQSArIEVNRUEgdGVhbXMuIERyaXZlcnM6ICgxKSBBSSBhZ2VudCBnb3Zlcm5hbmNlIGJlY29tZXMgYSBoYXJkXG5yZXF1aXJlbWVudCBhZnRlciB0aGVpciBpbnRlcm5hbCBjb21wbGlhbmNlIHJldmlldywgKDIpIGFkdmFuY2VkXG5hbmFseXRpY3Mgc2VhdHMgZm9yIHRoZSBPcHMgb3JnLCAoMykgcHJpb3JpdHkgc3VwcG9ydCBTTEEuYCxcbiAgICAgIC8vIFRoaXMgc2VudGVuY2UgdXNlZCB0byBEQVRFIHRoZSB3b3Jrc2hvcCBpdHNlbGYgKFwidGhlIHdlZWsgb2ZcbiAgICAgIC8vIGNsb3NlX2RhdGUgLSAxNGRcIiA9PiBkYXlzRnJvbU5vdygxNikpIHdoaWxlIHRoZSBzZWVkZWQgZXZlbnQgaGFkIGl0IGF0XG4gICAgICAvLyBkYXlzRnJvbU5vdyg2KSBhbmQgYSBzZWVkZWQgdGFzayBjaGFzZWQgaXQgYXQgZGF5c0Zyb21Ob3coNykgXHUyMDE0IHRocmVlXG4gICAgICAvLyByZWNvcmRzLCB0aHJlZSBhbnN3ZXJzICgjMTY2MCkuIFRoZSBkYXRlIG5vdyBsaXZlcyBpbiBleGFjdGx5IE9ORVxuICAgICAgLy8gcGxhY2UsIHRoZSBgY3JtX2V2ZW50YCByb3cgaW4gc2VydmljZS5zZWVkLnRzLCBhbmQgdGhpcyBwcm9zZSBzdGF0ZXNcbiAgICAgIC8vIG9ubHkgd2hhdCBzdGF5cyB0cnVlIGhvd2V2ZXIgdGhhdCBldmVudCBpcyBzY2hlZHVsZWQ6IGl0IGlzIGJvb2tlZCxcbiAgICAgIC8vIGFuZCBpdHMgaW52aXRhdGlvbiBoYXMgZ29uZSBvdXQgKHRoZSBhdHRlbmRlZSBidWlsZGVyIGNsYW1wc1xuICAgICAgLy8gYGludml0ZWRfZGF0ZWAgYXQgZGF5c0FnbygwKSwgc28gYSBwbGFubmVkIGV2ZW50J3MgaW52aXRlIGlzIG5ldmVyIGluXG4gICAgICAvLyB0aGUgZnV0dXJlKS4gUmUtZGF0aW5nIHRoZSBldmVudCB0aGVyZWZvcmUgY2Fubm90IHN0cmFuZCB0aGlzIGxpbmUuXG4gICAgICAvLyBEbyBub3QgcHV0IGEgZGF0ZSBiYWNrIGhlcmUsIGFic29sdXRlIE9SIHJlbGF0aXZlOiBhIHNlY29uZCBjb3B5IGlzXG4gICAgICAvLyBhIHNlY29uZCB0aGluZyB0byBkcmlmdC5cbiAgICAgIG5leHRfc3RlcDogYFNlbmQgdGhlIHJldmlzZWQgcHJvcG9zYWwgKEVudGVycHJpc2UgZWRpdGlvbiwgMTgtbW9udGggdGVybSwgMTIlIG11bHRpLXllYXIgZGlzY291bnQpIHRvIEpvcmRhbiBQYXJrIGJ5IEVPVy4gVGhlIEFJIGdvdmVybmFuY2Ugd29ya3Nob3Agd2l0aCB0aGVpciBjb21wbGlhbmNlIHRlYW0gaXMgYWxyZWFkeSBib29rZWQgYW5kIHRoZSBpbnZpdGF0aW9uIGlzIG91dC5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0dsb2JleCBNYW51ZmFjdHVyaW5nIFN1aXRlJyxcbiAgICAgIGNybV9hY2NvdW50OiAnR2xvYmV4IEluZHVzdHJpZXMnLFxuICAgICAgLi4uZGVhbFZhbHVlKCdHbG9iZXggTWFudWZhY3R1cmluZyBTdWl0ZScsIDI1KSxcbiAgICAgIHN0YWdlOiAncXVhbGlmaWNhdGlvbicsXG4gICAgICBwcm9iYWJpbGl0eTogMjUsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coNjApYCxcbiAgICAgIHR5cGU6ICduZXdfYnVzaW5lc3MnLFxuICAgICAgZm9yZWNhc3RfY2F0ZWdvcnk6ICdwaXBlbGluZScsXG4gICAgICBsZWFkX3NvdXJjZTogJ3JlZmVycmFsJyxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbERheXNBZ28oNDUpLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1dheW5lIEVudGVycHJpc2UgTGljZW5zZScsXG4gICAgICBjcm1fYWNjb3VudDogJ1dheW5lIEVudGVycHJpc2VzJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnV2F5bmUgRW50ZXJwcmlzZSBMaWNlbnNlJywgODApLFxuICAgICAgc3RhZ2U6ICduZWdvdGlhdGlvbicsXG4gICAgICBwcm9iYWJpbGl0eTogODAsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMTQpYCxcbiAgICAgIHR5cGU6ICduZXdfYnVzaW5lc3MnLFxuICAgICAgZm9yZWNhc3RfY2F0ZWdvcnk6ICdjb21taXQnLFxuICAgICAgbGVhZF9zb3VyY2U6ICdwYXJ0bmVyJyxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbERheXNBZ28oNyksXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSW5pdGVjaCBDbG91ZCBNaWdyYXRpb24nLFxuICAgICAgY3JtX2FjY291bnQ6ICdJbml0ZWNoIFNvbHV0aW9ucycsXG4gICAgICAuLi5kZWFsVmFsdWUoJ0luaXRlY2ggQ2xvdWQgTWlncmF0aW9uJywgNDApLFxuICAgICAgc3RhZ2U6ICduZWVkc19hbmFseXNpcycsXG4gICAgICBwcm9iYWJpbGl0eTogNDAsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coNDUpYCxcbiAgICAgIHR5cGU6ICdleGlzdGluZ191cGdyYWRlJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAnYmVzdF9jYXNlJyxcbiAgICAgIGxlYWRfc291cmNlOiAnZXZlbnQnLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsRGF5c0FnbygzOCksXG4gICAgfSxcbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ2xvc2VkIFdvbiBkZWFscyAocG93ZXJzIEtQSXMgJiByZXZlbnVlIHRyZW5kcykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgbmFtZTogJ0FjbWUgQW5udWFsIFJlbmV3YWwgMjAyNScsXG4gICAgICBjcm1fYWNjb3VudDogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgICAgLi4uZGVhbFZhbHVlKCdBY21lIEFubnVhbCBSZW5ld2FsIDIwMjUnLCAxMDApLFxuICAgICAgc3RhZ2U6ICdjbG9zZWRfd29uJyxcbiAgICAgIHByb2JhYmlsaXR5OiAxMDAsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0FnbygxNSlgLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsYGRheXNBZ28oMTUpYCxcbiAgICAgIHR5cGU6ICdleGlzdGluZ19yZW5ld2FsJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAnY2xvc2VkJyxcbiAgICAgIGxlYWRfc291cmNlOiAncGFydG5lcicsXG4gICAgICB3aW5fcmVhc29uOiAncmVsYXRpb25zaGlwJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBgQW5udWFsIHJlbmV3YWwgb2YgdGhlIEFjbWUgU3RhbmRhcmQgc3Vic2NyaXB0aW9uLCBzaWduZWQgdHdvIHdlZWtzIGFoZWFkIG9mIHRoZSByZW5ld2FsIGRhdGUuIDIyJSBZb1kgdXBsaWZ0IGRyaXZlbiBieSBzZWF0IGV4cGFuc2lvbiBpbiB0aGUgbmV3IEVNRUEgdGVhbS4gTXVsdGkteWVhciBvcHRpb24gZGVjbGluZWQgdGhpcyByb3VuZCBcdTIwMTQgdGhleSB3YW50IHRvIHNlZSBob3cgdGhlIHBsYXRmb3JtIHVwZ3JhZGUgbGFuZHMgZmlyc3QuYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdTdGFyayBNZWRpY2FsIFBpbG90JyxcbiAgICAgIGNybV9hY2NvdW50OiAnU3RhcmsgTWVkaWNhbCcsXG4gICAgICAuLi5kZWFsVmFsdWUoJ1N0YXJrIE1lZGljYWwgUGlsb3QnLCAxMDApLFxuICAgICAgc3RhZ2U6ICdjbG9zZWRfd29uJyxcbiAgICAgIHByb2JhYmlsaXR5OiAxMDAsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0Fnbyg1MClgLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsYGRheXNBZ28oNTApYCxcbiAgICAgIHR5cGU6ICduZXdfYnVzaW5lc3MnLFxuICAgICAgZm9yZWNhc3RfY2F0ZWdvcnk6ICdjbG9zZWQnLFxuICAgICAgbGVhZF9zb3VyY2U6ICdldmVudCcsXG4gICAgICB3aW5fcmVhc29uOiAnYmVzdF9maXQnLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1dheW5lIFExIEV4cGFuc2lvbicsXG4gICAgICBjcm1fYWNjb3VudDogJ1dheW5lIEVudGVycHJpc2VzJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnV2F5bmUgUTEgRXhwYW5zaW9uJywgMTAwKSxcbiAgICAgIHN0YWdlOiAnY2xvc2VkX3dvbicsXG4gICAgICBwcm9iYWJpbGl0eTogMTAwLFxuICAgICAgY2xvc2VfZGF0ZTogY2VsYGRheXNBZ28oOTUpYCxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbGBkYXlzQWdvKDk1KWAsXG4gICAgICB0eXBlOiAnZXhpc3RpbmdfdXBncmFkZScsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ2Nsb3NlZCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ3dlYicsXG4gICAgICB3aW5fcmVhc29uOiAnYmV0dGVyX3Byb2R1Y3QnLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0dsb2JleCBUcmFpbmluZyBQYWNrYWdlJyxcbiAgICAgIGNybV9hY2NvdW50OiAnR2xvYmV4IEluZHVzdHJpZXMnLFxuICAgICAgLi4uZGVhbFZhbHVlKCdHbG9iZXggVHJhaW5pbmcgUGFja2FnZScsIDEwMCksXG4gICAgICBzdGFnZTogJ2Nsb3NlZF93b24nLFxuICAgICAgcHJvYmFiaWxpdHk6IDEwMCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzQWdvKDE0MClgLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsYGRheXNBZ28oMTQwKWAsXG4gICAgICB0eXBlOiAnbmV3X2J1c2luZXNzJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAnY2xvc2VkJyxcbiAgICAgIGxlYWRfc291cmNlOiAncmVmZXJyYWwnLFxuICAgICAgd2luX3JlYXNvbjogJ2JldHRlcl9zdXBwb3J0JyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJbml0ZWNoIFBoYXNlIDEnLFxuICAgICAgY3JtX2FjY291bnQ6ICdJbml0ZWNoIFNvbHV0aW9ucycsXG4gICAgICAuLi5kZWFsVmFsdWUoJ0luaXRlY2ggUGhhc2UgMScsIDEwMCksXG4gICAgICBzdGFnZTogJ2Nsb3NlZF93b24nLFxuICAgICAgcHJvYmFiaWxpdHk6IDEwMCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzQWdvKDIwMClgLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsYGRheXNBZ28oMjAwKWAsXG4gICAgICB0eXBlOiAnbmV3X2J1c2luZXNzJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAnY2xvc2VkJyxcbiAgICAgIGxlYWRfc291cmNlOiAnd2ViJyxcbiAgICAgIHdpbl9yZWFzb246ICdiZXR0ZXJfcHJpY2UnLFxuICAgIH0sXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENhbXBhaWduLWF0dHJpYnV0ZWQgd2lucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvLyBgY3JtX2NhbXBhaWduYCBpcyB3aGF0IGBjYW1wYWlnbl9hdHRyaWJ1dGlvbl9yZWZyZXNoYCBjb3VudHNcbiAgICAvLyAoYG51bV9vcHBvcnR1bml0aWVzYCAvIGBudW1fd29uX29wcG9ydHVuaXRpZXNgIC8gdGhlIHN1bW1lZFxuICAgIC8vIGBhY3R1YWxfcmV2ZW51ZWApIFx1MjAxNCBvbiBldmVyeSBvcHBvcnR1bml0eSBpbnNlcnQsIHVwZGF0ZSBhbmQgZGVsZXRlLCBub3RcbiAgICAvLyBvbmNlIGF0IGNvbXBsZXRpb24uIEJlZm9yZSAjNTkxIG5vdCBvbmUgb3Bwb3J0dW5pdHkgY2FycmllZCBpdCwgc28gdGhvc2VcbiAgICAvLyB0aHJlZSBtZXRyaWNzIHdlcmUgc3RydWN0dXJhbGx5IHplcm8gYW5kIGV2ZXJ5IGNhbXBhaWduJ3Mgc2VlZGVkXG4gICAgLy8gYGFjdHVhbF9yZXZlbnVlYCB3YXMgYSBudW1iZXIgdGhlIGhvb2sgd291bGQgaGF2ZSBvdmVyd3JpdHRlbiBvbiB0aGVcbiAgICAvLyBmaXJzdCBhdHRyaWJ1dGVkIHdyaXRlLlxuICAgIC8vIFRoZXNlIHRocmVlIHdpbnMgYXJlIHdoYXQgbWFrZSB0aGUgbWFya2V0aW5nIFJPSSBudW1iZXJzIGJlbG93IFRSVUUuXG4gICAge1xuICAgICAgbmFtZTogJ0xhdHRpY2UgQW5hbHl0aWNzIEV4cGFuc2lvbicsXG4gICAgICBjcm1fYWNjb3VudDogJ0xhdHRpY2UgRWR1Y2F0aW9uJyxcbiAgICAgIHByaW1hcnlfY29udGFjdDogJ3ByaXlhLnNoYWhAbGF0dGljZS5leGFtcGxlLmNvbScsXG4gICAgICBjcm1fY2FtcGFpZ246ICdRMyBFbnRlcnByaXNlIEVtYWlsIE51cnR1cmUnLFxuICAgICAgLi4uZGVhbFZhbHVlKCdMYXR0aWNlIEFuYWx5dGljcyBFeHBhbnNpb24nLCAxMDApLFxuICAgICAgc3RhZ2U6ICdjbG9zZWRfd29uJyxcbiAgICAgIHByb2JhYmlsaXR5OiAxMDAsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0Fnbyg2KWAsXG4gICAgICBzdGFnZV9lbnRyeV9kYXRlOiBjZWxgZGF5c0Fnbyg2KWAsXG4gICAgICB0eXBlOiAnZXhpc3RpbmdfZXhwYW5zaW9uJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAnY2xvc2VkJyxcbiAgICAgIGxlYWRfc291cmNlOiAnZW1haWxfY2FtcGFpZ24nLFxuICAgICAgd2luX3JlYXNvbjogJ2Jlc3RfZml0JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQW5hbHl0aWNzIHBhY2thZ2UgZm9yIGFkbWlzc2lvbnMgYW5kIGFsdW1uaSBlbmdhZ2VtZW50LCBzb3VyY2VkIGZyb20gdGhlIGVudGVycHJpc2UgbnVydHVyZSB0cmFjay4nLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1dheW5lIE9wZXJhdGlvbnMgTW9kdWxlIFJvbGxvdXQnLFxuICAgICAgY3JtX2FjY291bnQ6ICdXYXluZSBFbnRlcnByaXNlcycsXG4gICAgICBwcmltYXJ5X2NvbnRhY3Q6ICdyd2lsc29uQHdheW5lLmV4YW1wbGUuY29tJyxcbiAgICAgIGNybV9jYW1wYWlnbjogJ09wZXJhdGlvbnMgUGxhdGZvcm0gTGF1bmNoJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnV2F5bmUgT3BlcmF0aW9ucyBNb2R1bGUgUm9sbG91dCcsIDEwMCksXG4gICAgICBzdGFnZTogJ2Nsb3NlZF93b24nLFxuICAgICAgcHJvYmFiaWxpdHk6IDEwMCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzQWdvKDQpYCxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbGBkYXlzQWdvKDQpYCxcbiAgICAgIHR5cGU6ICdleGlzdGluZ191cGdyYWRlJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAnY2xvc2VkJyxcbiAgICAgIGxlYWRfc291cmNlOiAnY29udGVudCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ09wZXJhdGlvbnMgbW9kdWxlIGZvciB0d28gbWFudWZhY3R1cmluZyBkaXZpc2lvbnMsIGNsb3NlZCBvZmYgdGhlIG9wZXJhdGlvbnMtcGxhdGZvcm0gbGF1bmNoIHByb2dyYW0uJyxcbiAgICAgIHdpbl9yZWFzb246ICdyZWxhdGlvbnNoaXAnLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ZlcnRleCBEZXZlbG9wZXIgUGxhdGZvcm0gQWRvcHRpb24nLFxuICAgICAgY3JtX2FjY291bnQ6ICdWZXJ0ZXggQW5hbHl0aWNzJyxcbiAgICAgIHByaW1hcnlfY29udGFjdDogJ2V0aGFuLmJyb29rc0B2ZXJ0ZXguZXhhbXBsZS5jb20nLFxuICAgICAgY3JtX2NhbXBhaWduOiAnRGV2ZWxvcGVyIENvbnRlbnQgTWFya2V0aW5nIFB1c2gnLFxuICAgICAgLi4uZGVhbFZhbHVlKCdWZXJ0ZXggRGV2ZWxvcGVyIFBsYXRmb3JtIEFkb3B0aW9uJywgMTAwKSxcbiAgICAgIHN0YWdlOiAnY2xvc2VkX3dvbicsXG4gICAgICBwcm9iYWJpbGl0eTogMTAwLFxuICAgICAgY2xvc2VfZGF0ZTogY2VsYGRheXNBZ28oNilgLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsYGRheXNBZ28oNilgLFxuICAgICAgdHlwZTogJ2V4aXN0aW5nX2V4cGFuc2lvbicsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ2Nsb3NlZCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ2NvbnRlbnQnLFxuICAgICAgZGVzY3JpcHRpb246ICdUaHJlZSBwcm9kdWN0IHRlYW1zIGFkb3B0ZWQgdGhlIGRldmVsb3BlciBwbGF0Zm9ybSBhZnRlciB0aGUgdGVjaG5pY2FsIGNvbnRlbnQgc2VyaWVzLicsXG4gICAgICB3aW5fcmVhc29uOiAnYmV0dGVyX3Byb2R1Y3QnLFxuICAgIH0sXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENsb3NlZCBMb3N0IGRlYWxzIChwb3dlcnMgd2luLXJhdGUgKyBsb3NzLXJlYXNvbiBhbmFseXRpY3MpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gRml2ZSBsb3NzZXMgYWNyb3NzIGZpdmUgZGlzdGluY3QgYGxvc3NfcmVhc29uYCB2YWx1ZXMsIGFuZCBldmVyeSBvbmUgb2ZcbiAgICAvLyB0aGVtIGlzIG5vdyBNQU5EQVRPUlkgcmF0aGVyIHRoYW4gZGVjb3JhdGl2ZTogYGxvc3NfcmVhc29uYCBpc1xuICAgIC8vIGByZXF1aXJlZFdoZW5gIHN0YWdlIGlzIGBjbG9zZWRfbG9zdGAgKCM1OTMpLCBzbyBhIHNlZWRlZCBsb3N0IGRlYWxcbiAgICAvLyB3aXRob3V0IG9uZSBpcyByZWplY3RlZCBieSB0aGUgZW5naW5lIGF0IHNlZWQgdGltZSBcdTIwMTQgdGhlIGRlbW8gZGF0YWJhc2VcbiAgICAvLyBjYW5ub3QgYm9vdCB3aXRoIHRoZSBlbXB0eSBjb2x1bW4gdGhhdCBtYWRlIHRoZSBsb3NzLXJlYXNvbiB3aWRnZXRcbiAgICAvLyB1bmJ1aWxkYWJsZSBpbiB0aGUgZmlyc3QgcGxhY2UuXG4gICAgLy9cbiAgICAvLyBUaGVpciBgbGVhZF9zb3VyY2VgIHZhbHVlcyBhcmUgY2hvc2VuIHNvIHRoYXQgdGhlIHNvdXJjZXMgY2FycnlpbmcgYSBsb3NzXG4gICAgLy8gQUxTTyBjYXJyeSBhIHdpbiAoYHdlYmAsIGByZWZlcnJhbGAsIGBjb250ZW50YCksIHBsdXMgdHdvIHNvdXJjZXMgdGhhdFxuICAgIC8vIG9ubHkgZXZlciBsb3N0IChgY29sZF9jYWxsYCwgYGFkdmVydGlzZW1lbnRgKS4gVGhhdCBpcyB3aGF0IG1ha2VzXG4gICAgLy8gYHdpbl9yYXRlX2J5X2xlYWRfc291cmNlYCBhIHJlYWwgbWVhc3VyZW1lbnQgaW5zdGVhZCBvZiBhIGNvbHVtbiBvZlxuICAgIC8vIDEwMCVzOiB0aHJlZSByb3dzIHdoZXJlIGJvdGggaGFsdmVzIG9mIHRoZSByYXRpbyBtb3ZlLCBhbmQgdHdvIHJvd3MgdGhhdFxuICAgIC8vIHNob3cgd2hhdCBhbiBhbGwtbG9zcyBzb3VyY2UgbG9va3MgbGlrZS5cbiAgICB7XG4gICAgICBuYW1lOiAnQWNtZSBBZGQtb24gKExvc3QpJyxcbiAgICAgIGNybV9hY2NvdW50OiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICAuLi5kZWFsVmFsdWUoJ0FjbWUgQWRkLW9uIChMb3N0KScsIDApLFxuICAgICAgc3RhZ2U6ICdjbG9zZWRfbG9zdCcsXG4gICAgICBwcm9iYWJpbGl0eTogMCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzQWdvKDI1KWAsXG4gICAgICBzdGFnZV9lbnRyeV9kYXRlOiBjZWxgZGF5c0FnbygyNSlgLFxuICAgICAgdHlwZTogJ2V4aXN0aW5nX3VwZ3JhZGUnLFxuICAgICAgZm9yZWNhc3RfY2F0ZWdvcnk6ICdvbWl0dGVkJyxcbiAgICAgIGxlYWRfc291cmNlOiAnY29sZF9jYWxsJyxcbiAgICAgIGxvc3NfcmVhc29uOiAndGltaW5nJyxcbiAgICAgIGxvc3NfZGV0YWlsczogJ01hcmtldGluZyBpcyBsb2NrZWQgaW50byBhIDIteWVhciBIdWJTcG90IGNvbnRyYWN0OyB0aGUgYnV5aW5nIHdpbmRvdyBvcGVucyB3aGVuIHRoYXQgcmVuZXdzLicsXG4gICAgICAvLyBUaGlzIGxpbmUgdXNlZCB0byBlbmQgXCJSZXZpc2l0IGluIFEzXCIgXHUyMDE0IGEgaGFuZC10eXBlZCBjYWxlbmRhciBxdWFydGVyXG4gICAgICAvLyBvbiBhIHJlY29yZCB3aG9zZSBgY2xvc2VfZGF0ZWAgaXMgYGRheXNBZ28oMjUpYCwgc28gdGhlIHF1YXJ0ZXIgaXQgdG9sZFxuICAgICAgLy8gYSByZXAgdG8gd2FpdCBmb3IgaXMgdGhlIG9uZSB0aGUgZGVhbCB3YXMgYWxyZWFkeSBsb3N0IGluLCBhbmQgaXRcbiAgICAgIC8vIGNvbnRyYWRpY3RlZCB0aGlzIHJlY29yZCdzIG93biBgbG9zc19kZXRhaWxzYDogYSAyLXllYXIgbG9jayBkb2VzIG5vdFxuICAgICAgLy8gcmVvcGVuIGluc2lkZSB0aGUgcXVhcnRlciB0aGUgZGVhbCBjbG9zZWQgaW4gKCMxNzEyKS4gU2FtZSBydWxpbmcgYXNcbiAgICAgIC8vIHRoZSBgbmV4dF9zdGVwYCBibG9jayBhYm92ZSAoIzE2NjApOiBubyBkYXRlIGdvZXMgYmFjayBpbnRvIHRoaXMgcHJvc2UsXG4gICAgICAvLyBhYnNvbHV0ZSBPUiByZWxhdGl2ZS4gVGhlIHJlbmV3YWwgaXMgdGhlIGFuY2hvciB0aGF0IHN0YXlzIHRydWUgaG93ZXZlclxuICAgICAgLy8gdGhpcyByZWNvcmQgaXMgZGF0ZWQgXHUyMDE0IHdoaWNoIGlzIGhvdyBgbG9zc19kZXRhaWxzYCBhbmQgdGhlIGFjY291bnRcbiAgICAgIC8vIGRlc2NyaXB0aW9uIGFscmVhZHkgc3RhdGUgaXQuXG4gICAgICBkZXNjcmlwdGlvbjogYFRyaWVkIHRvIGJvbHQgb24gdGhlIE1hcmtldGluZyBDbG91ZCBtb2R1bGUgdmlhIGNvbGQgb3V0Ym91bmQuIExvc3QgYmVjYXVzZSBBY21lJ3MgbWFya2V0aW5nIG9yZyBpcyBhbHJlYWR5IG9uIGEgMi15ZWFyIEh1YlNwb3QgY29udHJhY3QuIFJldmlzaXQgd2hlbiB0aGF0IGNvbnRyYWN0IGNvbWVzIHVwIGZvciByZW5ld2FsIFx1MjAxNCB0aGF0IGlzIHdoZW4gdGhlIGJ1eWluZyB3aW5kb3cgb3BlbnMuYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdTdGFyayBFeHBhbnNpb24gKExvc3QpJyxcbiAgICAgIGNybV9hY2NvdW50OiAnU3RhcmsgTWVkaWNhbCcsXG4gICAgICAuLi5kZWFsVmFsdWUoJ1N0YXJrIEV4cGFuc2lvbiAoTG9zdCknLCAwKSxcbiAgICAgIHN0YWdlOiAnY2xvc2VkX2xvc3QnLFxuICAgICAgcHJvYmFiaWxpdHk6IDAsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0Fnbyg2MClgLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsYGRheXNBZ28oNjApYCxcbiAgICAgIHR5cGU6ICduZXdfYnVzaW5lc3MnLFxuICAgICAgZm9yZWNhc3RfY2F0ZWdvcnk6ICdvbWl0dGVkJyxcbiAgICAgIGxlYWRfc291cmNlOiAnYWR2ZXJ0aXNlbWVudCcsXG4gICAgICBsb3NzX3JlYXNvbjogJ25vX2J1ZGdldCcsXG4gICAgICBsb3NzX2RldGFpbHM6ICdDYXBpdGFsIGZyZWV6ZSBvbiBub24tY2xpbmljYWwgc3lzdGVtcyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGZpc2NhbCB5ZWFyLicsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnR2xvYmV4IExpbmUgRXhwYW5zaW9uIChMb3N0KScsXG4gICAgICBjcm1fYWNjb3VudDogJ0dsb2JleCBJbmR1c3RyaWVzJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnR2xvYmV4IExpbmUgRXhwYW5zaW9uIChMb3N0KScsIDApLFxuICAgICAgc3RhZ2U6ICdjbG9zZWRfbG9zdCcsXG4gICAgICBwcm9iYWJpbGl0eTogMCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzQWdvKDM1KWAsXG4gICAgICBzdGFnZV9lbnRyeV9kYXRlOiBjZWxgZGF5c0FnbygzNSlgLFxuICAgICAgdHlwZTogJ2V4aXN0aW5nX2V4cGFuc2lvbicsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ29taXR0ZWQnLFxuICAgICAgbGVhZF9zb3VyY2U6ICdyZWZlcnJhbCcsXG4gICAgICBsb3NzX3JlYXNvbjogJ2NvbXBldGl0b3InLFxuICAgICAgbG9zc19kZXRhaWxzOiAnSW5jdW1iZW50IE1FUyB2ZW5kb3IgYnVuZGxlZCB0aGUgdHdvIGFkZGl0aW9uYWwgbGluZXMgaW50byBhbiBleGlzdGluZyBtYXN0ZXIgYWdyZWVtZW50LicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0V4cGFuc2lvbiBpbnRvIHR3byBmdXJ0aGVyIHByb2R1Y3Rpb24gbGluZXMsIGxvc3QgdG8gdGhlIGluY3VtYmVudCBNRVMgdmVuZG9yIG9uIGJ1bmRsaW5nLicsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnTm9ydGh3aW5kIEZpZWxkIFNlcnZpY2UgUGlsb3QgKExvc3QpJyxcbiAgICAgIGNybV9hY2NvdW50OiAnTm9ydGh3aW5kIEVuZXJneScsXG4gICAgICAuLi5kZWFsVmFsdWUoJ05vcnRod2luZCBGaWVsZCBTZXJ2aWNlIFBpbG90IChMb3N0KScsIDApLFxuICAgICAgc3RhZ2U6ICdjbG9zZWRfbG9zdCcsXG4gICAgICBwcm9iYWJpbGl0eTogMCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzQWdvKDgwKWAsXG4gICAgICBzdGFnZV9lbnRyeV9kYXRlOiBjZWxgZGF5c0Fnbyg4MClgLFxuICAgICAgdHlwZTogJ25ld19idXNpbmVzcycsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ29taXR0ZWQnLFxuICAgICAgbGVhZF9zb3VyY2U6ICd3ZWInLFxuICAgICAgbG9zc19yZWFzb246ICdwcmljZScsXG4gICAgICBsb3NzX2RldGFpbHM6ICdQZXItdGVjaG5pY2lhbiBwcmljaW5nIGxhbmRlZCB+MzAlIGFib3ZlIHRoZSBidWRnZXQgdGhlIG9wZXJhdGlvbnMgZGlyZWN0b3IgaGFkIGFwcHJvdmVkLicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ZpZWxkLXNlcnZpY2UgcGlsb3QgZm9yIHRoZSBtZXRlcmluZyBjcmV3cywgbG9zdCBvbiBwcmljZSBhZ2FpbnN0IGEgY2hlYXBlciBwb2ludCBzb2x1dGlvbi4nLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0FwZXggQ29tcGxpYW5jZSBSZXBvcnRpbmcgKExvc3QpJyxcbiAgICAgIGNybV9hY2NvdW50OiAnQXBleCBMb2dpc3RpY3MnLFxuICAgICAgLi4uZGVhbFZhbHVlKCdBcGV4IENvbXBsaWFuY2UgUmVwb3J0aW5nIChMb3N0KScsIDApLFxuICAgICAgc3RhZ2U6ICdjbG9zZWRfbG9zdCcsXG4gICAgICBwcm9iYWJpbGl0eTogMCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzQWdvKDExMClgLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsYGRheXNBZ28oMTEwKWAsXG4gICAgICB0eXBlOiAnbmV3X2J1c2luZXNzJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAnb21pdHRlZCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ2NvbnRlbnQnLFxuICAgICAgbG9zc19yZWFzb246ICdmZWF0dXJlcycsXG4gICAgICBsb3NzX2RldGFpbHM6ICdObyBuYXRpdmUgaG91cnMtb2Ytc2VydmljZSBhdWRpdCB0cmFpbDsgdGhlIGNvbXBsaWFuY2UgdGVhbSBjb3VsZCBub3Qgc2lnbiBvZmYgd2l0aG91dCBpdC4nLFxuICAgICAgZGVzY3JpcHRpb246ICdSZWd1bGF0b3J5IHJlcG9ydGluZyBwYWNrIGZvciB0aGUgZmxlZXQgY29tcGxpYW5jZSB0ZWFtLCBsb3N0IG9uIGEgbWlzc2luZyBhdWRpdC10cmFpbCBjYXBhYmlsaXR5LicsXG4gICAgfSxcbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ3VyYXRlZCBhY3RpdmUgcGlwZWxpbmUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy8gVHdvIGNhcmRzIGluIGVhY2ggYWN0aXZlIHN0YWdlIG1ha2UgdGhlIGthbmJhbiBpbW1lZGlhdGVseSBsZWdpYmxlIGluXG4gICAgLy8gYSBjdXN0b21lciBkZW1vLiBUaGV5IGFsc28gdGVsbCBhIGNvaGVyZW50IHNhbGVzIHN0b3J5IGluc3RlYWQgb2ZcbiAgICAvLyBvdmVyd2hlbG1pbmcgdGhlIGJvYXJkIHdpdGggYW5vbnltb3VzIGdlbmVyYXRlZCByb3dzLlxuICAgIC8vXG4gICAgLy8gUFJJQ0VEIFRPIFNUQVkgRFJBR0dBQkxFICgjMTkwMikuIEEgZGVhbCBhdCBvciBhYm92ZVxuICAgIC8vIGBMQVJHRV9ERUFMX0FNT1VOVGAgaXMgYm9ybiBpbnRvIGBvcHBvcnR1bml0eV9hcHByb3ZhbF9vbl9jcmVhdGVgLCB3aG9zZVxuICAgIC8vIGFwcHJvdmFsIG5vZGVzIGhvbGQgdGhlIHJlY29yZCB3aXRoIGBsb2NrUmVjb3JkOiB0cnVlYCBcdTIwMTQgb24gdGhlIGJvYXJkXG4gICAgLy8gdGhhdCBjYXJkIHJlZnVzZXMgZXZlcnkgZHJhZyB3aXRoIGBSRUNPUkRfTE9DS0VEYC4gV2hlbiBuaW5lIG9mIHRoZSB0ZW5cbiAgICAvLyBvcGVuIGRlYWxzIHNhdCBvdmVyIHRoZSBsaW5lLCB0aGUgb25lIGJvYXJkIGEgZGVtbyBvcGVucyBmaXJzdCB3YXNcbiAgICAvLyBmcm96ZW4uIFNvIGV4YWN0bHkgVFdPIG9wZW4gZGVhbHMgZXhoaWJpdCB0aGUgYXBwcm92YWwgZmxvdywgb25lIHBlclxuICAgIC8vIHRpZXIsIGFuZCBib3RoIGFyZSBpbiB0aGUgYmxvY2sgYWJvdmU6IGBBY21lIFBsYXRmb3JtIFVwZ3JhZGVgXG4gICAgLy8gKG1hbmFnZXIgcmV2aWV3IG9ubHksICQxMDBLXHUyMDEzJDUwMEspIGFuZCBgV2F5bmUgRW50ZXJwcmlzZSBMaWNlbnNlYFxuICAgIC8vIChtYW5hZ2VyLCB0aGVuIGRpcmVjdG9yIHNpZ24tb2ZmLCBvdmVyIGBISUdIX1ZBTFVFX0RFQUxfQU1PVU5UYCkuIEV2ZXJ5XG4gICAgLy8gZGVhbCBpbiB0aGlzIGJsb2NrIGlzIHByaWNlZCB1bmRlciB0aGUgbGluZSwgc28gZWFjaCBhY3RpdmUgc3RhZ2Uga2VlcHNcbiAgICAvLyBhdCBsZWFzdCBvbmUgY2FyZCB0aGF0IG1vdmVzLiBgdGVzdC9zZWVkLWNvbnNpc3RlbmN5LnRlc3QudHNgIHBpbnMgdGhlXG4gICAgLy8gdHdvIGJ5IG5hbWUgXHUyMDE0IHJlLXByaWNpbmcgYSBkZWFsIGhlcmUgb3ZlciAkMTAwSyBnb2VzIHJlZCB0aGVyZS5cbiAgICB7XG4gICAgICBuYW1lOiAnTm9ydGh3aW5kIEdyaWQgTW9kZXJuaXphdGlvbicsXG4gICAgICBjcm1fYWNjb3VudDogJ05vcnRod2luZCBFbmVyZ3knLFxuICAgICAgcHJpbWFyeV9jb250YWN0OiAnb2xpdmlhLmNoZW5Abm9ydGh3aW5kLmV4YW1wbGUuY29tJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnTm9ydGh3aW5kIEdyaWQgTW9kZXJuaXphdGlvbicsIDEwKSxcbiAgICAgIHN0YWdlOiAncHJvc3BlY3RpbmcnLFxuICAgICAgcHJvYmFiaWxpdHk6IDEwLFxuICAgICAgY2xvc2VfZGF0ZTogY2VsYGRheXNGcm9tTm93KDcyKWAsXG4gICAgICB0eXBlOiAnbmV3X2J1c2luZXNzJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAncGlwZWxpbmUnLFxuICAgICAgbGVhZF9zb3VyY2U6ICd3ZWJpbmFyJyxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbERheXNBZ28oNCksXG4gICAgICBkZXNjcmlwdGlvbjogJ05vcnRod2luZCBpcyBhc3Nlc3NpbmcgYSB1bmlmaWVkIGdyaWQtbW9kZXJuaXphdGlvbiBwcm9ncmFtIGFmdGVyIGFuIGV4ZWN1dGl2ZSB3ZWJpbmFyLicsXG4gICAgICBuZXh0X3N0ZXA6ICdDb25maXJtIGRpc2NvdmVyeSBwYXJ0aWNpcGFudHMgYW5kIGFncmVlIHRoZSBvcGVyYXRpb25hbC1kYXRhIGFzc2Vzc21lbnQgc2NvcGUuJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdMYXR0aWNlIFN0dWRlbnQgU3VjY2VzcyBQbGF0Zm9ybScsXG4gICAgICBjcm1fYWNjb3VudDogJ0xhdHRpY2UgRWR1Y2F0aW9uJyxcbiAgICAgIHByaW1hcnlfY29udGFjdDogJ3ByaXlhLnNoYWhAbGF0dGljZS5leGFtcGxlLmNvbScsXG4gICAgICBjcm1fY2FtcGFpZ246ICdEZXZlbG9wZXIgQ29udGVudCBNYXJrZXRpbmcgUHVzaCcsXG4gICAgICAuLi5kZWFsVmFsdWUoJ0xhdHRpY2UgU3R1ZGVudCBTdWNjZXNzIFBsYXRmb3JtJywgMTApLFxuICAgICAgc3RhZ2U6ICdwcm9zcGVjdGluZycsXG4gICAgICBwcm9iYWJpbGl0eTogMTAsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coOTYpYCxcbiAgICAgIHR5cGU6ICduZXdfYnVzaW5lc3MnLFxuICAgICAgZm9yZWNhc3RfY2F0ZWdvcnk6ICdwaXBlbGluZScsXG4gICAgICBsZWFkX3NvdXJjZTogJ2NvbnRlbnQnLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsRGF5c0FnbygxMSksXG4gICAgICBkZXNjcmlwdGlvbjogJ0EgbmV3IHN0dWRlbnQtc3VjY2VzcyBpbml0aWF0aXZlIHNvdXJjZWQgZnJvbSB0aGUgaGlnaGVyLWVkdWNhdGlvbiBjb250ZW50IHNlcmllcy4nLFxuICAgICAgbmV4dF9zdGVwOiAnSW52aXRlIHRoZSBvcGVyYXRpb25zIHNwb25zb3IgdG8gdGhlIGRpc2NvdmVyeSB3b3Jrc2hvcC4nLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ZlcnRleCBBbmFseXRpY3MgRXhwYW5zaW9uJyxcbiAgICAgIGNybV9hY2NvdW50OiAnVmVydGV4IEFuYWx5dGljcycsXG4gICAgICBwcmltYXJ5X2NvbnRhY3Q6ICdldGhhbi5icm9va3NAdmVydGV4LmV4YW1wbGUuY29tJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnVmVydGV4IEFuYWx5dGljcyBFeHBhbnNpb24nLCAyNSksXG4gICAgICBzdGFnZTogJ3F1YWxpZmljYXRpb24nLFxuICAgICAgcHJvYmFiaWxpdHk6IDI1LFxuICAgICAgY2xvc2VfZGF0ZTogY2VsYGRheXNGcm9tTm93KDUyKWAsXG4gICAgICB0eXBlOiAnZXhpc3RpbmdfZXhwYW5zaW9uJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAncGlwZWxpbmUnLFxuICAgICAgbGVhZF9zb3VyY2U6ICdwYXJ0bmVyJyxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbERheXNBZ28oOCksXG4gICAgICBkZXNjcmlwdGlvbjogJ1ZlcnRleCB3YW50cyB0byBleHRlbmQgdGhlIHBsYXRmb3JtIGZyb20gaXRzIGRhdGEgdGVhbSB0byB0aGUgZnVsbCByZXZlbnVlIG9yZ2FuaXphdGlvbi4nLFxuICAgICAgbmV4dF9zdGVwOiAnVmFsaWRhdGUgdGhlIGJ1eWluZyBjb21taXR0ZWUsIGJ1ZGdldCBvd25lciBhbmQgZXhwYW5zaW9uIHRpbWVsaW5lLicsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnQXBleCBMb2dpc3RpY3MgRGF0YSBIdWInLFxuICAgICAgY3JtX2FjY291bnQ6ICdBcGV4IExvZ2lzdGljcycsXG4gICAgICBwcmltYXJ5X2NvbnRhY3Q6ICdtYXJjdXMucmVlZEBhcGV4bG9naXN0aWNzLmV4YW1wbGUuY29tJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnQXBleCBMb2dpc3RpY3MgRGF0YSBIdWInLCA0MCksXG4gICAgICBzdGFnZTogJ25lZWRzX2FuYWx5c2lzJyxcbiAgICAgIHByb2JhYmlsaXR5OiA0MCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygzOClgLFxuICAgICAgdHlwZTogJ25ld19idXNpbmVzcycsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ2Jlc3RfY2FzZScsXG4gICAgICBsZWFkX3NvdXJjZTogJ3BhcnRuZXInLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsRGF5c0FnbygxOCksXG4gICAgICBkZXNjcmlwdGlvbjogJ0FwZXggaXMgbWFwcGluZyBpdHMgZnJhZ21lbnRlZCBjb21tZXJjaWFsIHN5c3RlbXMgYmVmb3JlIGNvbW1pdHRpbmcgdG8gYSBkYXRhLWh1YiBwcm9ncmFtLicsXG4gICAgICBuZXh0X3N0ZXA6ICdDb21wbGV0ZSB0aGUgYXJjaGl0ZWN0dXJlIHdvcmtzaG9wIGFuZCBxdWFudGlmeSB0aGUgaW50ZWdyYXRpb24gYmFja2xvZy4nLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0xhdHRpY2UgRWR1Y2F0aW9uIFJlbmV3YWwnLFxuICAgICAgY3JtX2FjY291bnQ6ICdMYXR0aWNlIEVkdWNhdGlvbicsXG4gICAgICBwcmltYXJ5X2NvbnRhY3Q6ICdwcml5YS5zaGFoQGxhdHRpY2UuZXhhbXBsZS5jb20nLFxuICAgICAgY3JtX2NhbXBhaWduOiAnUTMgRW50ZXJwcmlzZSBFbWFpbCBOdXJ0dXJlJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnTGF0dGljZSBFZHVjYXRpb24gUmVuZXdhbCcsIDYwKSxcbiAgICAgIHN0YWdlOiAncHJvcG9zYWwnLFxuICAgICAgcHJvYmFiaWxpdHk6IDYwLFxuICAgICAgY2xvc2VfZGF0ZTogY2VsYGRheXNGcm9tTm93KDI0KWAsXG4gICAgICB0eXBlOiAnZXhpc3RpbmdfcmVuZXdhbCcsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ2NvbW1pdCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ2VtYWlsX2NhbXBhaWduJyxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbERheXNBZ28oNiksXG4gICAgICBkZXNjcmlwdGlvbjogJ1JlbmV3YWwgcHJvcG9zYWwgYWRkcyBzdHVkZW50LXN1Y2Nlc3MgYXV0b21hdGlvbiBhbmQgYW4gZXhwYW5kZWQgYW5hbHl0aWNzIHBhY2thZ2UuJyxcbiAgICAgIG5leHRfc3RlcDogJ1JldmlldyB0aGUgdHdvLXllYXIgb3B0aW9uIHdpdGggcHJvY3VyZW1lbnQgYmVmb3JlIHRoZSBleGVjdXRpdmUgc3BvbnNvciBtZWV0aW5nLicsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVmVydGV4IEVudGVycHJpc2UgUm9sbG91dCcsXG4gICAgICBjcm1fYWNjb3VudDogJ1ZlcnRleCBBbmFseXRpY3MnLFxuICAgICAgcHJpbWFyeV9jb250YWN0OiAnZXRoYW4uYnJvb2tzQHZlcnRleC5leGFtcGxlLmNvbScsXG4gICAgICAuLi5kZWFsVmFsdWUoJ1ZlcnRleCBFbnRlcnByaXNlIFJvbGxvdXQnLCA4MCksXG4gICAgICBzdGFnZTogJ25lZ290aWF0aW9uJyxcbiAgICAgIHByb2JhYmlsaXR5OiA4MCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygxMSlgLFxuICAgICAgdHlwZTogJ2V4aXN0aW5nX2V4cGFuc2lvbicsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ2NvbW1pdCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ3JlZmVycmFsJyxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbERheXNBZ28oMyksXG4gICAgICBkZXNjcmlwdGlvbjogJ1BoYXNlIG9uZSBvZiBhbiBlbnRlcnByaXNlIHJvbGxvdXQsIG5lZ290aWF0ZWQgYXJvdW5kIHBoYXNlZCBkZXBsb3ltZW50IGFuZCBkYXRhLXJlc2lkZW5jeSByZXF1aXJlbWVudHMuJyxcbiAgICAgIG5leHRfc3RlcDogJ1Jlc29sdmUgdGhlIGZpbmFsIHNlY3VyaXR5IGFkZGVuZHVtIGFuZCBjb25maXJtIHRoZSBwcm9jdXJlbWVudCBzaWduYXR1cmUgZGF0ZS4nLFxuICAgIH0sXG4gIF1cbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YS9fc2hhcmVkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGFcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YS9fc2hhcmVkLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFNlZWQgaGVscGVycyBzaGFyZWQgYnkgZXZlcnkgYCouc2VlZC50c2AgZmFtaWx5IG1vZHVsZS5cbiAqXG4gKiBUaGUgc2VlZCBkYXRhIHVzZWQgdG8gYmUgb25lIDEwMEtCIGBzcmMvZGF0YS9pbmRleC50c2AsIHdoaWNoIHNhdCB+MS41S0JcbiAqIHVuZGVyIHRoZSBgcG5wbSBoeWdpZW5lYCBieXRlIGNhcCBhbmQgdHVybmVkIHRoZSBuZXh0IGRlbW8gcmVjb3JkIGludG8gYVxuICogYnVpbGQgZmFpbHVyZSAoIzYzNSkuIEl0IGlzIG5vdyBzcGxpdCBieSBvYmplY3QgZmFtaWx5IFx1MjAxNCBgY2F0YWxvZ2AsIGBzYWxlc2AsXG4gKiBgc2VydmljZWAsIGBtYXJrZXRpbmdgLCBgcmV2ZW51ZWAgXHUyMDE0IHdpdGggYGluZGV4LnRzYCByZWR1Y2VkIHRvIHRoZVxuICogYWdncmVnYXRpbmcgYENybVNlZWREYXRhYCBleHBvcnQuIFRoaXMgbW9kdWxlIGhvbGRzIHdoYXQgbW9yZSB0aGFuIG9uZVxuICogZmFtaWx5IG5lZWRzLlxuICovXG5pbXBvcnQgeyBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogQSBub3RlIG9uIHN5c3RlbS1jb21wdXRlZCBmaWVsZHMgaW4gc2VlZHMgKCM0OTAsICM2MTcpLlxuICpcbiAqICMjIyBIb29rcyBETyBydW4gb3ZlciBzZWVkIHdyaXRlcyBcdTIwMTQgYXV0b21hdGlvbnMgZG8gbm90XG4gKlxuICogVGhlIHNlZWQgbG9hZGVyIHdyaXRlcyB3aXRoIGB7IGlzU3lzdGVtOiB0cnVlLCBza2lwVHJpZ2dlcnM6IHRydWUsXG4gKiBzZWVkUmVwbGF5OiB0cnVlIH1gLCBhbmQgdGhlIHByZW1pc2UgdGhpcyBmaWxlIHVzZWQgdG8gc3RhdGUgXHUyMDE0IFwiaG9va3MgZG8gTk9UXG4gKiBydW4gb3ZlciBzZWVkIHJvd3NcIiBcdTIwMTQgd2FzIHdyb25nICgjNjE3KS4gTWVhc3VyZWQgYWdhaW5zdCAxNy4wLjAtcmMuMSwgYW5kXG4gKiBtYXRjaGluZyBgU2VlZExvYWRlclNlcnZpY2UuU0VFRF9PUFRJT05TYCcgb3duIGNvbnRyYWN0OlxuICpcbiAqICAgLSBgaXNTeXN0ZW1gICAgYnlwYXNzZXMgUkJBQyBhbmQgRElTQUJMRVMgdGhlIHNlY3VyaXR5IHBsdWdpbidzIGluamVjdGlvblxuICogICAgICAgICAgICAgICAgICBvZiBgb3JnYW5pemF0aW9uX2lkYCAvIGBvd25lcl9pZGAgXHUyMDE0IHdoaWNoIGlzIHdoeSBzZWVkZWQgcm93c1xuICogICAgICAgICAgICAgICAgICBsYW5kIG93bmVybGVzcyB1bnRpbCB0aGUgcGxhdGZvcm0ncyBzZWVkLW93bmVyc2hpcCBjbGFpbVxuICogICAgICAgICAgICAgICAgICBoYW5kcyB0aGVtIHRvIHRoZSBmaXJzdCBhZG1pbmlzdHJhdG9yIHdoZW4gdGhlIHNlZWQgc2V0dGxlcy5cbiAqICAgLSBgc2tpcFRyaWdnZXJzYCBzdXBwcmVzc2VzIHJlY29yZC1jaGFuZ2UgQVVUT01BVElPTiAoYXV0b2xhdW5jaGVkIGZsb3dzKSxcbiAqICAgICAgICAgICAgICAgICAgbm90IGxpZmVjeWNsZSBob29rcy4gU2VlZCBkYXRhIGlzIHByZS1leGlzdGluZyBlbmQgc3RhdGUsXG4gKiAgICAgICAgICAgICAgICAgIG5vdCBhIHN0cmVhbSBvZiB1c2VyIGV2ZW50cy5cbiAqICAgLSBgc2VlZFJlcGxheWAgc2tpcHMgdGhlIGBzdGF0ZV9tYWNoaW5lYCBlbnRyeS90cmFuc2l0aW9uIGd1YXJkcywgc28gYVxuICogICAgICAgICAgICAgICAgICBtaWQtbGlmZWN5Y2xlIHJvdyAoYSBgY2xvc2VkX3dvbmAgZGVhbCkgaXMgYWNjZXB0ZWQuXG4gKlxuICogTGlmZWN5Y2xlIEhPT0tTIFx1MjAxNCBkZXJpdmVkIGZpZWxkcywgZGVmYXVsdHMsIHZhbGlkYXRpb24gXHUyMDE0IHN0aWxsIHJ1bi4gVGhlIGJvb3RcbiAqIGxvZyBzaG93cyB0aGVtIGZpcmluZyAoYG9wcG9ydHVuaXR5X2Ftb3VudF9yb2xsdXBgLCBgcXVvdGVfdG90YWxfcm9sbHVwYCksXG4gKiBhbmQgYGNybV9hY2NvdW50LmJpbGxpbmdfY291bnRyeWAgLyBgY3JtX2FjY291bnQudGVycml0b3J5YCBhcmUgb25seSBldmVyXG4gKiBwb3B1bGF0ZWQgYmVjYXVzZSBgYWNjb3VudF9wcm90ZWN0aW9uYCBkZXJpdmVzIHRoZW0gZnJvbSBgYmlsbGluZ19hZGRyZXNzYFxuICogb24gdGhlIHNlZWQgaW5zZXJ0ICgjNjM4LCAjNjM5KS4gYHRlc3QvdGVycml0b3J5LXNlZWQtY292ZXJhZ2UudGVzdC50c2AgcGlucyB0aGF0IGRlcGVuZGVuY3kuXG4gKlxuICogIyMjIFdoYXQgdGhhdCBtZWFucyBmb3IgYXV0aG9yaW5nXG4gKlxuICogVGhlIG9sZCBjb25jbHVzaW9uIHN1cnZpdmVzIHRoZSBjb3JyZWN0ZWQgcHJlbWlzZSwgYW5kIGlzIHN0aWxsIHRoZSBydWxlOlxuICpcbiAqIDEuIFNlZWRpbmcgaGlzdG9yaWNhbCB2YWx1ZXMgaW50byByZWFkb25seSBmaWVsZHMgKGBzdGFnZV9lbnRyeV9kYXRlYCxcbiAqICAgIGBsYXN0X2NvbnRhY3RlZF9kYXRlYCwgYGFjdHVhbF9yZXZlbnVlYCwgYW5kIHRoZSBwbGF0Zm9ybSdzIG93blxuICogICAgYGNyZWF0ZWRfYXRgIFx1MjAxNCB3aGljaCB0aGUgY2FzZSBzZWVkcyBhdXRob3Igc2luY2UgIzE5OTIpIGlzIGxlZ2l0aW1hdGVcbiAqICAgIGFuZCBsb2FkLWJlYXJpbmcgXHUyMDE0IGl0IGlzIHRoZSBvbmx5IHdheSBkZW1vIHJlcG9ydHMgZ2V0IGhpc3RvcnkgXHUyMDE0IGFuZCB0aGVcbiAqICAgIHBsYXRmb3JtIGV4cGxpY2l0bHkgcHJlc2VydmVzIGV4cGxpY2l0IHNlZWQgdmFsdWVzIChgY3JlYXRlZF9hdGAgb24gdGhlXG4gKiAgICBmaXJzdCBpbnNlcnQgc2luY2UgQG9iamVjdHN0YWNrL29iamVjdHFsIDE3LjcuMCwgb2JqZWN0c3RhY2sjMjE2NDYpLlxuICogMi4gRXZlcnkgc2VlZGVkIHZhbHVlIG9mIGEgaG9vay1vd25lZCBmaWVsZCBNVVNUIGVxdWFsIHdoYXQgdGhlIGhvb2sgd291bGRcbiAqICAgIGNvbXB1dGUgKGBpc19jbG9zZWRgIFx1MjFENCBzdGF0dXMsIGByZXNvbHV0aW9uX3RpbWVfaG91cnNgIFx1MjFENCBjbG9zZWRcdTIyMTJjcmVhdGVkLFxuICogICAgb3Bwb3J0dW5pdHkgYHByb2JhYmlsaXR5YC9gZm9yZWNhc3RfY2F0ZWdvcnlgL2BleHBlY3RlZF9yZXZlbnVlYCBcdTIxRDQgc3RhZ2UsXG4gKiAgICBmb3JlY2FzdCBgcGVyaW9kX2xhYmVsYCBcdTIxRDQgcGVyaW9kX3N0YXJ0KS4gVW5kZXIgdGhlIGNvcnJlY3RlZCBwcmVtaXNlIGFcbiAqICAgIG1pc21hdGNoIGlzIHJld3JpdHRlbiBpbW1lZGlhdGVseSwgYXQgc2VlZCB0aW1lLCBpbnN0ZWFkIG9mIG9uIHRoZSBmaXJzdFxuICogICAgdXNlciBlZGl0IFx1MjAxNCBlaXRoZXIgd2F5IHRoZSBkZW1vIGRvZXMgbm90IHNob3cgd2hhdCB3YXMgYXV0aG9yZWQuXG4gKiAzLiBBIGZpZWxkIHRoZSBob29rIERFUklWRVMgYW5kIHRoZSBzY2hlbWEgbWFya3MgYHJlYWRvbmx5YCBpcyBub3QgYXV0aG9yZWRcbiAqICAgIGhlcmUgYXQgYWxsIChgY3JtX2FjY291bnQuYmlsbGluZ19jb3VudHJ5YCwgYGNybV9hY2NvdW50LnRlcnJpdG9yeWApOlxuICogICAgZHVwbGljYXRpbmcgaXQgd291bGQgY3JlYXRlIGEgc2Vjb25kIHNvdXJjZSBvZiB0cnV0aCBmb3IgYSB2YWx1ZSB0aGUgaG9va1xuICogICAgYWxyZWFkeSBvd25zLlxuICpcbiAqIEF1dG9udW1iZXIgZmllbGRzIChgY2FzZV9udW1iZXJgLCBgY29udHJhY3RfbnVtYmVyYCwgYHF1b3RlX251bWJlcmApIGFyZVxuICogTkVWRVIgc2VlZGVkOiB0aGUgcnVudGltZSBvd25zIHRob3NlIHNlcXVlbmNlcyAodGhlIFNRTCBkcml2ZXIgYm9vdHN0cmFwc1xuICogZWFjaCBjb3VudGVyIHBhc3QgZXhpc3Rpbmcgcm93cyksIHNvIGhhbmQtbnVtYmVyaW5nIHRoZW0gb25seSBpbnZpdGVzXG4gKiBkcmlmdC4gVXBzZXJ0IGlkZW50aXR5IHVzZXMgYSBuYXR1cmFsIGtleSBpbnN0ZWFkIChzdWJqZWN0IC8gbmFtZSAvXG4gKiBkZXNjcmlwdGlvbikuXG4gKi9cblxuLyoqXG4gKiBCdWlsZCBhIENFTCBgZGF5c0FnbyhOKWAgZXhwcmVzc2lvbiBmcm9tIGEgcnVudGltZSBudW1iZXIuIE1pcnJvcnMgdGhlXG4gKiBleGlzdGluZyB0YWdnZWQtdGVtcGxhdGUgdXNhZ2UgKGBjZWxcXGBkYXlzQWdvKE4pXFxgYCkgc28gd2UgY2FuIHByb2R1Y2VcbiAqIHRpbWVzdGFtcHMgaW5zaWRlIGAubWFwKClgIGdlbmVyYXRvcnMgd2l0aG91dCBtYW51ZmFjdHVyaW5nIGZha2UgdGVtcGxhdGVcbiAqIHN0cmluZyBhcnJheXMuXG4gKi9cbmV4cG9ydCBjb25zdCBjZWxEYXlzQWdvID0gKG46IG51bWJlcikgPT4gY2VsYGRheXNBZ28oJHtufSlgO1xuZXhwb3J0IGNvbnN0IGNlbERheXNGcm9tTm93ID0gKG46IG51bWJlcikgPT4gY2VsYGRheXNGcm9tTm93KCR7bn0pYDtcblxuLyoqXG4gKiBBIGNvbmZpZ3VyZWQgcHJvZHVjdCBsaW5lLiBgdW5pdF9wcmljZWAgaXMgdGhlIE5FR09USUFURUQgcHJpY2UgKHdoYXQgdGhlXG4gKiByZXAgc29sZCBhdCk7IHRoZSBjYXRhbG9nIGBsaXN0X3ByaWNlYCBpcyBzdGFtcGVkIHNlcGFyYXRlbHkgZnJvbSB0aGVcbiAqIHByb2R1Y3QgcmVjb3JkLCBleGFjdGx5IGFzIHRoZSBwcmljZS1maWxsIGhvb2sgd291bGQuXG4gKi9cbmV4cG9ydCB0eXBlIExpbmVTcGVjID0ge1xuICByZWFkb25seSBwcm9kdWN0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1YW50aXR5OiBudW1iZXI7XG4gIHJlYWRvbmx5IHVuaXRfcHJpY2U6IG51bWJlcjtcbiAgLyoqIExpbmUtbGV2ZWwgZGlzY291bnQgJSwgZGVmYXVsdHMgdG8gMC4gKi9cbiAgcmVhZG9ubHkgZGlzY291bnQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59O1xuXG4vKiogYHF1YW50aXR5IFx1MDBENyB1bml0X3ByaWNlIFx1MDBENyAoMSBcdTIyMTIgZGlzY291bnQvMTAwKWAsIHJvdW5kZWQgZXhhY3RseSBhcyB0aGUgcm9sbHVwIGhvb2tzIHJvdW5kLiAqL1xuZXhwb3J0IGNvbnN0IGxpbmVUb3RhbCA9IChsOiBMaW5lU3BlYyk6IG51bWJlciA9PlxuICBNYXRoLnJvdW5kKGwucXVhbnRpdHkgKiBsLnVuaXRfcHJpY2UgKiAoMSAtIChsLmRpc2NvdW50ID8/IDApIC8gMTAwKSAqIDEwMCkgLyAxMDA7XG5cbmV4cG9ydCBjb25zdCBsaW5lc1RvdGFsID0gKGxpbmVzOiByZWFkb25seSBMaW5lU3BlY1tdKTogbnVtYmVyID0+XG4gIE1hdGgucm91bmQobGluZXMucmVkdWNlKChzdW0sIGwpID0+IHN1bSArIGxpbmVUb3RhbChsKSwgMCkgKiAxMDApIC8gMTAwO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YS9hY3Rpdml0eS5zZWVkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGFcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YS9hY3Rpdml0eS5zZWVkLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIEFjdGl2aXR5IHNlZWRzIFx1MjAxNCB0aGUgdGFzayBsaXN0IGFuZCB0aGUgaW50ZXJhY3Rpb24gbG9nLlxuICpcbiAqIGBjcm1fdGFza2AsIGBjcm1fZXZlbnRgIGFuZCBgY3JtX2V2ZW50X2F0dGVuZGVlYCBhcmUgdGhlIGFjdGl2aXR5IGxheWVyIG92ZXJcbiAqIGV2ZXJ5IG9iamVjdCBpbiB0aGUgYXBwIChhY2NvdW50cywgb3Bwb3J0dW5pdGllcyBBTkQgY2FzZXMpLCB3aGljaCBpcyB3aHlcbiAqIHBsYW4gaXRlbSA0IGZvbGRzIHRoZW0gaW50byB0aGUgYXBwIHBhY2thZ2UgcmF0aGVyIHRoYW4gZ2l2aW5nIGFjdGl2aXRpZXMgYVxuICogbW9kdWxlIG9mIHRoZWlyIG93bjogXCJhY3Rpdml0aWVzIGFyZSBhIGNyb3NzLWN1dHRpbmcgY2FwYWJpbGl0eSBubyBjdXN0b21lclxuICogYnV5cyBzZXBhcmF0ZWx5XCIuIFRoZWlyIHJvd3Mgd2VyZSBhdXRob3JlZCBpbiBgc3JjL2RhdGEvc2VydmljZS5zZWVkLnRzYCxcbiAqIGJlc2lkZSB0aGUgY2FzZXMgdGhleSBtb3N0IG9mdGVuIGhhbmcgb2ZmOyB0aG9zZSBjYXNlcyBhcmUgbm93XG4gKiBgc3JjL3NlcnZpY2UvZGF0YS9zZXJ2aWNlLnNlZWQudHNgIGFuZCBhcmUgcmVmZXJlbmNlZCBmcm9tIGhlcmUgYnkgbmF0dXJhbFxuICoga2V5IGV4YWN0bHkgYXMgYmVmb3JlLiBUaGUgY2FzZXMgYXJlIHJlZ2lzdGVyZWQgYnkgdGhlIHNlcnZpY2UgcGFja2FnZSBhbmRcbiAqIHRoZXNlIHJvd3MgYnkgdGhlIGFwcCBwYWNrYWdlOyBtZWFzdXJlZCBvbiBhIGZyZXNoIGJvb3Qgb2YgdGhlIHR3by1wYWNrYWdlXG4gKiBhcnRpZmFjdCAoIzE5MDcpLCBldmVyeSBzZWVkZWQgZXZlbnQncyBgcmVsYXRlZF90b19jYXNlYCByZXNvbHZlcyB0byBhIHJlYWxcbiAqIGNhc2UuXG4gKlxuICogU2VlZCBkb2N0cmluZSBsaXZlcyBpbiBgLi9fc2hhcmVkLnRzYC5cbiAqL1xuaW1wb3J0IHsgZGVmaW5lU2VlZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gJy4uL29iamVjdHMvdGFzay5vYmplY3QnO1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tICcuLi9vYmplY3RzL2V2ZW50Lm9iamVjdCc7XG5pbXBvcnQgeyBFdmVudEF0dGVuZGVlIH0gZnJvbSAnLi4vb2JqZWN0cy9ldmVudF9hdHRlbmRlZS5vYmplY3QnO1xuaW1wb3J0IHsgY2VsRGF5c0FnbyB9IGZyb20gJy4vX3NoYXJlZCc7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBUYXNrcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIFBvbHltb3JwaGljIHBhcmVudHMgbmVlZCBCT1RIIGhhbHZlczogYHJlbGF0ZWRfdG9fdHlwZWAgbmFtZXMgdGhlIHBhcmVudFxuLy8gb2JqZWN0IGFuZCB0aGUgbWF0Y2hpbmcgYHJlbGF0ZWRfdG9fKmAgbG9va3VwIGNhcnJpZXMgdGhlIHJlY29yZC4gVGhlXG4vLyBSZWxhdGVkIHRhYiBhbmQgdGFzay5ob29rJ3MgYWN0aXZpdHkgYnViYmxlIGtleSBvZmYgYHJlbGF0ZWRfdG9fdHlwZWAsIHNvIGFcbi8vIGxvb2t1cCB3aXRob3V0IGl0IGlzIGludmlzaWJsZSB0byBib3RoICgjNDkwKS5cbmV4cG9ydCBjb25zdCB0YXNrcyA9IGRlZmluZVNlZWQoVGFzaywge1xuICBtb2RlOiAndXBzZXJ0JyxcbiAgZXh0ZXJuYWxJZDogJ3N1YmplY3QnLFxuICByZWNvcmRzOiBbXG4gICAge1xuICAgICAgc3ViamVjdDogJ0ZvbGxvdyB1cCB3aXRoIEFjbWUgb24gcHJvcG9zYWwnLFxuICAgICAgZGVzY3JpcHRpb246ICdTZW5kIEpvcmRhbiBQYXJrIHRoZSByZXZpc2VkIEVudGVycHJpc2UgcHJvcG9zYWwgYW5kIGEgMzAtbWluIGNhbGVuZGFyIHNsb3QgdG8gd2FsayB0aHJvdWdoIHRoZSBBSSBnb3Zlcm5hbmNlIHNlY3Rpb24uJyxcbiAgICAgIHN0YXR1czogJ25vdF9zdGFydGVkJyxcbiAgICAgIHByaW9yaXR5OiAnaGlnaCcsXG4gICAgICBwcmlvcml0eV9yYW5rOiAzLFxuICAgICAgZHVlX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygyKWAsXG4gICAgICByZWxhdGVkX3RvX3R5cGU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgcmVsYXRlZF90b19hY2NvdW50OiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICByZWxhdGVkX3RvX29wcG9ydHVuaXR5OiAnQWNtZSBQbGF0Zm9ybSBVcGdyYWRlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSB3b3Jrc2hvcCB0aGlzIHRhc2sgYXNrcyBzb21lb25lIHRvIGJvb2sgaXMgQUxSRUFEWSBvbiB0aGVcbiAgICAgIC8vIGNhbGVuZGFyOiB0aGUgYEFjbWUgXHUyMDE0IEFJIGFnZW50IGdvdmVybmFuY2Ugd29ya3Nob3BgIGV2ZW50IGxvd2VyIGluXG4gICAgICAvLyB0aGlzIGZpbGUgaXMgYHBsYW5uZWRgIGF0IGRheXNGcm9tTm93KDYpLCBhbmQgdGhlIGF0dGVuZGVlIGJ1aWxkZXJcbiAgICAgIC8vIGRhdGVzIGl0cyBpbnZpdGF0aW9uIGBkYXlzQWdvKG1heCgtNiArIGludml0ZWREYXlzQmVmb3JlKDkpLCAwKSlgID1cbiAgICAgIC8vIGRheXNBZ28oMykgXHUyMDE0IGFscmVhZHkgc2VudCwgYW5kIGFscmVhZHkgYW5zd2VyZWQgYHRlbnRhdGl2ZWAuIFNvIHRoZVxuICAgICAgLy8gYm9va2luZyB0YXNrIGlzIERPTkUsIGFuZCBpdCB3YXMgZG9uZSB0aGUgZGF5IHRoZSBpbnZpdGF0aW9uIHdlbnRcbiAgICAgIC8vIG91dC4gQW4gb3BlbiBcInNjaGVkdWxlIGl0XCIgdGFzayBiZXNpZGUgYSBib29rZWQtYW5kLWludml0ZWQgbWVldGluZ1xuICAgICAgLy8gaXMgdGhlIGNvbnRyYWRpY3Rpb24gaXRzZWxmLCBub3QgYSBkdWUgZGF0ZSB0byBudWRnZSAoIzE2NjApLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBFVkVOVCBvd25zIHRoZSB3b3Jrc2hvcCdzIGRhdGUuIE5vdGhpbmcgaGVyZSByZXN0YXRlcyBpdCBcdTIwMTQgYm90aFxuICAgICAgLy8gZGF0ZXMgYmVsb3cgZGVyaXZlIGZyb20gdGhlIGludml0YXRpb24gaW5zdGFudCBcdTIwMTQgc28gdGhlcmUgaXMgbm9cbiAgICAgIC8vIHNlY29uZCBjb3B5IHRvIGRyaWZ0IG91dCBvZiBzdGVwLlxuICAgICAgc3ViamVjdDogJ0FjbWUgXHUyMDE0IHNjaGVkdWxlIEFJIGdvdmVybmFuY2Ugd29ya3Nob3AnLFxuICAgICAgZGVzY3JpcHRpb246ICdCbG9jayBhIDkwLW1pbiBqb2ludCB3b3Jrc2hvcCB3aXRoIEFjbWVcdTIwMTlzIGNvbXBsaWFuY2UgdGVhbSB0byB3YWxrIHRocm91Z2ggaG93IEhvdENSTSBhZ2VudHMgaGFuZGxlIGRhdGEgc2NvcGluZywgUkJBQywgYXVkaXQgdHJhaWxzLCBhbmQgaHVtYW4taW4tdGhlLWxvb3AuIFByZS1yZWFkOiBBRFItMDAwNyArIHRoZSBnb3Zlcm5hbmNlIGRlbW8gZGVjay4nLFxuICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgIHByaW9yaXR5OiAnaGlnaCcsXG4gICAgICBwcmlvcml0eV9yYW5rOiAzLFxuICAgICAgZHVlX2RhdGU6IGNlbGBkYXlzQWdvKDMpYCxcbiAgICAgIGNvbXBsZXRlZF9kYXRlOiBjZWxgZGF5c0FnbygzKWAsXG4gICAgICAvLyBIb29rcyBkb24ndCBydW4gb3ZlciBzZWVkcyBcdTIwMTQgbWlycm9yIHdoYXQgdGFza19jb21wbGV0aW9uIHdvdWxkIHN0YW1wLlxuICAgICAgaXNfY29tcGxldGVkOiB0cnVlLFxuICAgICAgcHJvZ3Jlc3NfcGVyY2VudDogMTAwLFxuICAgICAgcmVsYXRlZF90b190eXBlOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgIHJlbGF0ZWRfdG9fYWNjb3VudDogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgICAgcmVsYXRlZF90b19vcHBvcnR1bml0eTogJ0FjbWUgUGxhdGZvcm0gVXBncmFkZScsXG4gICAgfSxcbiAgICB7XG4gICAgICBzdWJqZWN0OiAnQWNtZSBcdTIwMTQgY2xvc2Ugb3V0IGxvZ2luLWlzc3VlcyB0aWNrZXQgYmVmb3JlIFNMQScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NvbmZpcm0gZW5naW5lZXJpbmcgaGFzIHRoZSBFTUVBIFNTTyBjbG9jay1za2V3IHBhdGNoIHJlYWR5LCBkZXBsb3kgdG8gQWNtZVx1MjAxOXMgdGVuYW50LCBhbmQgc2VuZCBMaXNhIEtpbSBhIGN1c3RvbWVyLWZhY2luZyBwb3N0LW1vcnRlbS4nLFxuICAgICAgc3RhdHVzOiAnaW5fcHJvZ3Jlc3MnLFxuICAgICAgcHJpb3JpdHk6ICd1cmdlbnQnLFxuICAgICAgcHJpb3JpdHlfcmFuazogNCxcbiAgICAgIGR1ZV9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMSlgLFxuICAgICAgcmVsYXRlZF90b190eXBlOiAnY3JtX2Nhc2UnLFxuICAgICAgcmVsYXRlZF90b19hY2NvdW50OiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICByZWxhdGVkX3RvX2Nhc2U6ICdMb2dpbiBpc3N1ZXMgYWZ0ZXIgcGxhdGZvcm0gdXBncmFkZScsXG4gICAgfSxcbiAgICB7XG4gICAgICBzdWJqZWN0OiAnU2NoZWR1bGUgZGVtbyBmb3IgR2xvYmV4IHRlYW0nLFxuICAgICAgc3RhdHVzOiAnaW5fcHJvZ3Jlc3MnLFxuICAgICAgcHJpb3JpdHk6ICdub3JtYWwnLFxuICAgICAgcHJpb3JpdHlfcmFuazogMixcbiAgICAgIGR1ZV9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coNSlgLFxuICAgICAgcmVsYXRlZF90b190eXBlOiAnY3JtX2FjY291bnQnLFxuICAgICAgcmVsYXRlZF90b19hY2NvdW50OiAnR2xvYmV4IEluZHVzdHJpZXMnLFxuICAgIH0sXG4gICAge1xuICAgICAgc3ViamVjdDogJ1ByZXBhcmUgY29udHJhY3QgZm9yIFdheW5lIEVudGVycHJpc2VzJyxcbiAgICAgIHN0YXR1czogJ25vdF9zdGFydGVkJyxcbiAgICAgIHByaW9yaXR5OiAndXJnZW50JyxcbiAgICAgIHByaW9yaXR5X3Jhbms6IDQsXG4gICAgICBkdWVfZGF0ZTogY2VsYGRheXNGcm9tTm93KDEpYCxcbiAgICAgIHJlbGF0ZWRfdG9fdHlwZTogJ2NybV9hY2NvdW50JyxcbiAgICAgIHJlbGF0ZWRfdG9fYWNjb3VudDogJ1dheW5lIEVudGVycHJpc2VzJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHN1YmplY3Q6ICdTZW5kIHdlbGNvbWUgcGFja2FnZSB0byBTdGFyayBNZWRpY2FsJyxcbiAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICBwcmlvcml0eTogJ2xvdycsXG4gICAgICBwcmlvcml0eV9yYW5rOiAxLFxuICAgICAgY29tcGxldGVkX2RhdGU6IGNlbGBkYXlzQWdvKDIpYCxcbiAgICAgIC8vIEhvb2tzIGRvbid0IHJ1biBvdmVyIHNlZWRzIFx1MjAxNCBtaXJyb3Igd2hhdCB0YXNrX2NvbXBsZXRpb24gd291bGQgc3RhbXAuXG4gICAgICBpc19jb21wbGV0ZWQ6IHRydWUsXG4gICAgICBwcm9ncmVzc19wZXJjZW50OiAxMDAsXG4gICAgICByZWxhdGVkX3RvX3R5cGU6ICdjcm1fYWNjb3VudCcsXG4gICAgICByZWxhdGVkX3RvX2FjY291bnQ6ICdTdGFyayBNZWRpY2FsJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEludGVybmFsIGhvdXNla2VlcGluZyB0YXNrIFx1MjAxNCBkZWxpYmVyYXRlbHkgdW5wYXJlbnRlZCAodGhlXG4gICAgICAvLyByZWxhdGVkX3RvX3JlcXVpcmVkIHJ1bGUgaXMgYSB3YXJuaW5nLCBub3QgYW4gZXJyb3IpLlxuICAgICAgc3ViamVjdDogJ1VwZGF0ZSBDUk0gcGlwZWxpbmUgcmVwb3J0JyxcbiAgICAgIHN0YXR1czogJ25vdF9zdGFydGVkJyxcbiAgICAgIHByaW9yaXR5OiAnbm9ybWFsJyxcbiAgICAgIHByaW9yaXR5X3Jhbms6IDIsXG4gICAgICBkdWVfZGF0ZTogY2VsYGRheXNGcm9tTm93KDcpYCxcbiAgICB9LFxuICBdXG59KTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEV2ZW50cyAmIGF0dGVuZGVlczogdGhlIGludGVyYWN0aW9uIGxvZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vXG4vLyAjNTkyIHNoaXBwZWQgdGhlIGFjdGl2aXR5IG1vZGVsIFx1MjAxNCBgY3JtX2V2ZW50YCwgYGNybV9ldmVudF9hdHRlbmRlZWAsIHRoZVxuLy8gcGVyLW9iamVjdCBsb2cvc2NoZWR1bGUgYWN0aW9ucywgdGhlIGBldmVudF9tZXRyaWNzYCBjdWJlIGFuZCB0aGUgU2FsZXNcbi8vIEFjdGl2aXR5IGRhc2hib2FyZCBcdTIwMTQgYW5kIGRlbGliZXJhdGVseSBsZWZ0IHRoZSBkZW1vIHJvd3MgdG8gdGhpcyBpc3N1ZVxuLy8gKCM2NzEpLiBVbnRpbCBub3cgdGhlIGRlbW8gYm9vdGVkIHdpdGggdGhlIHdob2xlIG1vZGVsIGluc3RhbGxlZCBhbmQgbm90IG9uZVxuLy8gcm93IGluIGl0OiBldmVyeSB3aWRnZXQgb24gdGhhdCBkYXNoYm9hcmQgcmVhZCAwLCB0aGUgY2FsZW5kYXIgYW5kXG4vLyBpbnRlcmFjdGlvbi1oaXN0b3J5IHZpZXdzIHdlcmUgZW1wdHksIGFuZCB0aGUgdGhyZWUgY2h1cm4gdGlsZXMgaGFkIG5vdGhpbmdcbi8vIHRvIHN0cmF0aWZ5LlxuLy9cbi8vICMgVGltZSBpcyBhdXRob3JlZCBpbiBDRUwsIG5ldmVyIGluIFR5cGVTY3JpcHRcbi8vXG4vLyBgc3RhcnRfZGF0ZXRpbWVgIC8gYGVuZF9kYXRldGltZWAgYXJlIGBjZWxgIGV4cHJlc3Npb25zXG4vLyAoYGRheXNBZ28oMTIpICsgZHVyYXRpb24oXCI5aDBtXCIpYCksIHJlc29sdmVkIGJ5IHRoZSBzZWVkIGxvYWRlciBhdCBCT09ULlxuLy8gUGxhaW4tVFMgZGF0ZXMgd291bGQgZnJlZXplIGludG8gYGRpc3Qvb2JqZWN0c3RhY2suanNvbmAgYXQgQlVJTEQgdGltZSwgYW5kIGFcbi8vIHB1Ymxpc2hlZCBhcnRpZmFjdCB3b3VsZCBzaGlwIGEgY2FsZW5kYXIgdGhhdCBhZ2VzIG91dCBcdTIwMTQgdGhlIHNhbWUgaGF6YXJkXG4vLyBgdGVzdC9hbmFseXRpY3MtaW50ZWdyaXR5LnRlc3QudHNgIGd1YXJkcyBvbiByZXBvcnQgZmlsdGVycy4gYGRheXNBZ28oKWBcbi8vIGFsb25lIHJldHVybnMgVVRDIG1pZG5pZ2h0LCB3aGljaCBpcyB3aHkgdGhlIGR1cmF0aW9uIHRlcm0gaXMgdGhlcmU6IGFcbi8vIGNhbGVuZGFyIG9iamVjdCB3aG9zZSBldmVyeSByb3cgc3RhcnRzIGF0IDAwOjAwIGlzIGEgY2FsZW5kYXIgbm9ib2R5IHdvdWxkXG4vLyBkZW1vLlxuLy9cbi8vICMgQSBgaGVsZGAgZXZlbnQgc3RhbXBzIFRPREFZIG9uIGl0cyBhY2NvdW50IFx1MjAxNCB0aGF0IGlzIHRoZSB3aG9sZSBsYXlvdXQgcnVsZVxuLy9cbi8vIExpZmVjeWNsZSBob29rcyBydW4gb3ZlciBzZWVkIHdyaXRlcyAoIzYxNyksIHNvIGBldmVudF9hY3Rpdml0eV9idWJibGVgIGZpcmVzXG4vLyBvbiB0aGVzZSBpbnNlcnRzIGFuZCBzdGFtcHMgYGNybV9hY2NvdW50Lmxhc3RfYWN0aXZpdHlfZGF0ZWAgL1xuLy8gYGNybV9jb250YWN0Lmxhc3RfY29udGFjdGVkX2RhdGVgIC8gYGNybV9sZWFkLmxhc3RfY29udGFjdGVkX2RhdGVgIHdpdGggdGhlXG4vLyBTRUVEIE1PTUVOVCBcdTIwMTQgbm90IHdpdGggdGhlIGV2ZW50J3Mgb3duIHRpbWVzdGFtcC4gTm90aGluZyBoZXJlIGNhbiBtYWtlIGFuXG4vLyBhY2NvdW50IGxvb2sgcXVpZXQgQU5EIGdpdmUgaXQgYSBoZWxkIGludGVyYWN0aW9uOyB0aGUgdHdvIGFyZSB0aGUgc2FtZVxuLy8gY29sdW1uLiBTbyB0aGUgcXVpZXQgYWNjb3VudHMgb2YgYHNhbGVzLnNlZWQudHNgIGNhcnJ5IG9ubHkgYHBsYW5uZWRgLFxuLy8gYGNhbmNlbGxlZGAgYW5kIGBub19zaG93YCByb3dzLCBub25lIG9mIHdoaWNoIGJ1YmJsZSwgYW5kIHRoZSBhY2NvdW50cyB0aGF0XG4vLyBkbyBjYXJyeSBoZWxkIHJvd3MgYXJlIGF1dGhvcmVkIGF0IGB0b2RheSgpYCB0aGVyZS4gVGhlIGxvbmcgbm90ZSBiZXNpZGUgdGhlXG4vLyBhY2NvdW50IHJlY29yZHMgc3RhdGVzIHRoZSBib3VuZGFyeTsgYHRlc3QvYWN0aXZpdHktc2VlZC1jb3ZlcmFnZS50ZXN0LnRzYFxuLy8gcmVjb21wdXRlcyB0aGUgYnViYmxlJ3Mgb3duIHJlYWNoYWJpbGl0eSBvdmVyIHRoZXNlIHJvd3MgYW5kIGZhaWxzIGlmIGEgaGVsZFxuLy8gZXZlbnQgZXZlciByZWFjaGVzIGFuIGFjY291bnQgdGhlIGNodXJuIHRpbGVzIGRlcGVuZCBvbi5cbi8vXG4vLyAjIFVwc2VydCBpZGVudGl0eSBpcyBgc3ViamVjdGBcbi8vXG4vLyBTYW1lIGNob2ljZSBhcyBgY3JtX3Rhc2tgIGFuZCBgY3JtX2Nhc2VgIGFib3ZlLCBhbmQgaXQgY2FycmllcyB0aGUgc2FtZSBrbm93blxuLy8gY29zdDogYSB1c2VyIHdobyBsb2dzIGFuIGludGVyYWN0aW9uIHVuZGVyIGEgc3ViamVjdCB0aGlzIGZpbGUgYWxzbyB1c2VzXG4vLyB3b3VsZCBoYXZlIHRoZWlyIHJvdyBhZG9wdGVkIChhbmQgb3ZlcndyaXR0ZW4pIGJ5IHRoZSBuZXh0IHJlLXNlZWQuIFRoZVxuLy8gZm9yZWNhc3Qgc2VlZHMgZXNjYXBlIHRoYXQgd2l0aCBhIGRlZGljYXRlZCBgc2VlZF9rZXlgIGNvbHVtbiAoIzYxMyksIHdoaWNoXG4vLyBpcyBhbiBPQkpFQ1QgY2hhbmdlIGFuZCBvdXQgb2YgdGhpcyBpc3N1ZSdzIHNjb3BlOyB0aGUgc3ViamVjdHMgYmVsb3cgYXJlXG4vLyBsb25nIGFuZCBhY2NvdW50LXNwZWNpZmljIHNvIHRoZSBjb2xsaXNpb24gbmVlZHMgZGVsaWJlcmF0ZSBlZmZvcnQsIGFuZCB0aGVcbi8vIHR3byBhY3Rpdml0eS1zaGFwZWQgb2JqZWN0cyB0aGF0IGNhbWUgYmVmb3JlIGFscmVhZHkgYWNjZXB0IHRoZSBzYW1lIHRyYWRlLlxuLy8gTm8gY29sbGlzaW9uIGV4aXN0cyB3aXRoIHRoZSBydW50aW1lIHdyaXRlcidzIG93biByb3dzOiBgbG9nX2NhbGxgIC9cbi8vIGBsb2dfbWVldGluZ2AgLyBgc2NoZWR1bGVfbWVldGluZ2AgaW5zZXJ0IHdpdGggYW4gZXhwbGljaXQgYG93bmVyX2lkYFxuLy8gKGBzcmMvc2FsZXMvYWN0aW9ucy9hY3Rpdml0eS1hY3Rpb25zLnRzYCksIHNvIHRoZXkgYXJlIG5ldmVyIG93bmVybGVzcyBhbmQgdGhlXG4vLyBwbGF0Zm9ybSdzIHNlZWQtb3duZXJzaGlwIGNsYWltIG5ldmVyIHRvdWNoZXMgdGhlbSBcdTIwMTQgdGhlIFwib25lIHByb2R1Y2VyIHBlclxuLy8gd2luZG93XCIgcXVlc3Rpb24gIzcwMiByYWlzZWQsIGFuc3dlcmVkIGZvciB0aGlzIG9iamVjdC5cblxuLyoqIFdoaWNoIGByZWxhdGVkX3RvXypgIGxvb2t1cCBjYXJyaWVzIGVhY2ggYHJlbGF0ZWRfdG9fdHlwZWAuICovXG5jb25zdCBFVkVOVF9SRUxBVEVEX0ZJRUxEID0ge1xuICBjcm1fYWNjb3VudDogJ3JlbGF0ZWRfdG9fYWNjb3VudCcsXG4gIGNybV9jb250YWN0OiAncmVsYXRlZF90b19jb250YWN0JyxcbiAgY3JtX29wcG9ydHVuaXR5OiAncmVsYXRlZF90b19vcHBvcnR1bml0eScsXG4gIGNybV9sZWFkOiAncmVsYXRlZF90b19sZWFkJyxcbiAgY3JtX2Nhc2U6ICdyZWxhdGVkX3RvX2Nhc2UnLFxufSBhcyBjb25zdDtcblxudHlwZSBFdmVudFJlbGF0ZWRUeXBlID0ga2V5b2YgdHlwZW9mIEVWRU5UX1JFTEFURURfRklFTEQ7XG5cbnR5cGUgQXR0ZW5kZWVTcGVjID0ge1xuICAvKiogQ29udGFjdCBlbWFpbCBcdTIwMTQgdGhlIGNvbnRhY3QgZGF0YXNldCdzIGV4dGVybmFsSWQuIEV4Y2x1c2l2ZSB3aXRoIGBsZWFkYC4gKi9cbiAgcmVhZG9ubHkgY29udGFjdD86IHN0cmluZztcbiAgLyoqIExlYWQgZW1haWwgXHUyMDE0IHRoZSBsZWFkIGRhdGFzZXQncyBleHRlcm5hbElkLiAqL1xuICByZWFkb25seSBsZWFkPzogc3RyaW5nO1xuICByZWFkb25seSByZXNwb25zZTogJ2FjY2VwdGVkJyB8ICdkZWNsaW5lZCcgfCAndGVudGF0aXZlJyB8ICdub19yZXNwb25zZSc7XG59O1xuXG50eXBlIEV2ZW50U3BlYyA9IHtcbiAgcmVhZG9ubHkgc3ViamVjdDogc3RyaW5nO1xuICByZWFkb25seSB0eXBlOiAnbWVldGluZycgfCAnY2FsbCcgfCAnZGVtbycgfCAnd2ViaW5hcicgfCAnb25zaXRlX3Zpc2l0JyB8ICdvdGhlcic7XG4gIHJlYWRvbmx5IHN0YXR1czogJ2hlbGQnIHwgJ3BsYW5uZWQnIHwgJ2NhbmNlbGxlZCcgfCAnbm9fc2hvdyc7XG4gIC8qKiBEYXlzIGJlZm9yZSBib290LiBORUdBVElWRSBtZWFucyB0aGF0IG1hbnkgZGF5cyBBRlRFUiBib290LiAqL1xuICByZWFkb25seSBkYXlzQWdvOiBudW1iZXI7XG4gIC8qKiBVVEMgd2FsbCBjbG9jayB0aGUgc2xvdCBvcGVucyBhdDogYFtob3VyLCBtaW51dGVdYC4gKi9cbiAgcmVhZG9ubHkgYXQ6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl07XG4gIC8qKiBTbG90IGxlbmd0aCBpbiBtaW51dGVzIFx1MjAxNCB0aGUgZ2FwIGJldHdlZW4gc3RhcnQgYW5kIGVuZCBvbiB0aGUgY2FsZW5kYXIuICovXG4gIHJlYWRvbmx5IG1pbnV0ZXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcmVsYXRlZFR5cGU6IEV2ZW50UmVsYXRlZFR5cGU7XG4gIC8qKiBOYXR1cmFsIGtleSBvZiB0aGUgcmVsYXRlZCByZWNvcmQgKHRoYXQgZGF0YXNldCdzIGV4dGVybmFsSWQpLiAqL1xuICByZWFkb25seSByZWxhdGVkS2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBY2NvdW50IG5hdHVyYWwga2V5LCB3aGVuIHRoZSByZWxhdGVkIHJlY29yZCBoYW5ncyBvZmYgb25lLiBBdXRob3JlZCBvbiB0aGVcbiAgICogZXZlbnQgYXMgd2VsbCBhcyBpbXBsaWVkIHRocm91Z2ggdGhlIHBhcmVudCBcdTIwMTQgc2FtZSBzaGFwZSB0aGUgdGFzayBzZWVkc1xuICAgKiB1c2UsIGFuZCBpdCBpcyB3aGF0IHB1dHMgdGhlIHJvdyBpbiB0aGUgQUNDT1VOVCdzIGFjdGl2aXR5IHJlbGF0ZWQgbGlzdC5cbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogc3RyaW5nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcmVhZG9ubHkgb3V0Y29tZT86IHN0cmluZztcbiAgcmVhZG9ubHkgYXR0ZW5kZWVzOiByZWFkb25seSBBdHRlbmRlZVNwZWNbXTtcbiAgLyoqIERheXMgYmVmb3JlIHRoZSBldmVudCB0aGUgaW52aXRhdGlvbiB3ZW50IG91dC4gRGVmYXVsdHMgdG8gMy4gKi9cbiAgcmVhZG9ubHkgaW52aXRlZERheXNCZWZvcmU/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIEEgd2FsbC1jbG9jayBpbnN0YW50IG9uIGEgZGF5IHJlbGF0aXZlIHRvIHRoZSBib290IGRhdGUuXG4gKlxuICogYGRheXNBZ28obilgIC8gYGRheXNGcm9tTm93KG4pYCBib3RoIHJldHVybiBVVEMgbWlkbmlnaHQgb2YgdGhhdCBjYWxlbmRhclxuICogZGF5LCBhbmQgQ0VMIHRpbWVzdGFtcCArIGR1cmF0aW9uIGFyaXRobWV0aWMgaXMgd2hhdCBwdXRzIGEgcmVhbCB0aW1lIG9uIGl0LlxuICovXG5jb25zdCBjZWxDbG9jayA9IChkYXlzQWdvOiBudW1iZXIsIGhvdXI6IG51bWJlciwgbWludXRlOiBudW1iZXIpID0+IHtcbiAgY29uc3QgY2xvY2sgPSBgJHtob3VyfWgke21pbnV0ZX1tYDtcbiAgcmV0dXJuIGRheXNBZ28gPj0gMFxuICAgID8gY2VsYGRheXNBZ28oJHtkYXlzQWdvfSkgKyBkdXJhdGlvbigke2Nsb2NrfSlgXG4gICAgOiBjZWxgZGF5c0Zyb21Ob3coJHstZGF5c0Fnb30pICsgZHVyYXRpb24oJHtjbG9ja30pYDtcbn07XG5cbi8qKlxuICogVGhlIGludGVyYWN0aW9uIGxvZy5cbiAqXG4gKiBgaGVsZGAgcm93cyBzcGFuIGFsbCBmaXZlIGByZWxhdGVkX3RvX3R5cGVgIHZhbHVlcyBhbmQgZml2ZSBvZiB0aGUgc2l4XG4gKiBgdHlwZWAgdmFsdWVzIGFjcm9zcyByb3VnaGx5IG5pbmUgd2Vla3MsIGJlY2F1c2UgdGhhdCBpcyB3aGF0IHRoZSBTYWxlc1xuICogQWN0aXZpdHkgZGFzaGJvYXJkIHJlYWRzOiB0aGUgbWl4IGRvbnV0IGdyb3VwcyBieSBgdHlwZWAsIHRoZSBcIndoZXJlIHRoZVxuICogYWN0aXZpdHkgbGFuZHNcIiBiYXIgZ3JvdXBzIGJ5IGByZWxhdGVkX3RvX3R5cGVgLCBhbmQgdGhlIHZvbHVtZSBhcmVhIGNoYXJ0XG4gKiBidWNrZXRzIGBzdGFydF9kYXRldGltZWAgYnkgd2Vlay4gQSBibG9jayBvZiByb3dzIGluIG9uZSB3ZWVrIG9uIG9uZSBwYXJlbnRcbiAqIHdvdWxkIGxpZ2h0IGV2ZXJ5IHdpZGdldCB1cCB3aGlsZSBwcm92aW5nIG5vbmUgb2YgdGhlbS5cbiAqL1xuY29uc3QgRVZFTlRfU1BFQ1M6IHJlYWRvbmx5IEV2ZW50U3BlY1tdID0gW1xuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQWNtZSBDb3Jwb3JhdGlvbiBcdTIwMTQgdGhlIGhlcm8gYWNjb3VudCwgd29ya2VkIGFjcm9zcyBldmVyeSBwYXJlbnQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIHtcbiAgICBzdWJqZWN0OiAnQWNtZSBcdTIwMTQgRW50ZXJwcmlzZSBlZGl0aW9uIHdhbGt0aHJvdWdoJyxcbiAgICB0eXBlOiAnZGVtbycsIHN0YXR1czogJ2hlbGQnLCBkYXlzQWdvOiAyLCBhdDogWzEwLCAwXSwgbWludXRlczogNjAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fb3Bwb3J0dW5pdHknLCByZWxhdGVkS2V5OiAnQWNtZSBQbGF0Zm9ybSBVcGdyYWRlJywgYWNjb3VudDogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgIGxvY2F0aW9uOiAnWm9vbScsXG4gICAgb3V0Y29tZTogJ1dhbGtlZCB0aGUgT3BzIHRlYW0gdGhyb3VnaCBhZ2VudCBnb3Zlcm5hbmNlIGFuZCB0aGUgYW5hbHl0aWNzIHNlYXRzLiBSZXZpc2VkIHByb3Bvc2FsIHRvIGZvbGxvdyB0aGlzIHdlZWsuJyxcbiAgICBhdHRlbmRlZXM6IFt7IGNvbnRhY3Q6ICdqb2huLnNtaXRoQGFjbWUuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdBY21lIFx1MjAxNCBwcm9wb3NhbCBmb2xsb3ctdXAgY2FsbCcsXG4gICAgdHlwZTogJ2NhbGwnLCBzdGF0dXM6ICdoZWxkJywgZGF5c0FnbzogNSwgYXQ6IFsxNSwgMzBdLCBtaW51dGVzOiAyNSxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9jb250YWN0JywgcmVsYXRlZEtleTogJ2pvaG4uc21pdGhAYWNtZS5leGFtcGxlLmNvbScsIGFjY291bnQ6ICdBY21lIENvcnBvcmF0aW9uJyxcbiAgICBvdXRjb21lOiAnUHJvY3VyZW1lbnQgd2FudHMgYW4gMTgtbW9udGggdGVybS4gUHJpY2luZyB0byBiZSByZS1jdXQgYmVmb3JlIHRoZSBnb3Zlcm5hbmNlIHdvcmtzaG9wLicsXG4gICAgYXR0ZW5kZWVzOiBbeyBjb250YWN0OiAnam9obi5zbWl0aEBhY21lLmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdhY2NlcHRlZCcgfV0sXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnQWNtZSBcdTIwMTQgQUkgZ292ZXJuYW5jZSBzY29waW5nIHNlc3Npb24nLFxuICAgIHR5cGU6ICdtZWV0aW5nJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDEyLCBhdDogWzksIDBdLCBtaW51dGVzOiA5MCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9hY2NvdW50JywgcmVsYXRlZEtleTogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgIGxvY2F0aW9uOiAnR29vZ2xlIE1lZXQnLFxuICAgIG91dGNvbWU6ICdBZ3JlZWQgdGhlIHdvcmtzaG9wIGFnZW5kYTogZGF0YSBzY29waW5nLCBSQkFDLCBhdWRpdCB0cmFpbHMsIGh1bWFuLWluLXRoZS1sb29wLicsXG4gICAgYXR0ZW5kZWVzOiBbeyBjb250YWN0OiAnam9obi5zbWl0aEBhY21lLmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdhY2NlcHRlZCcgfV0sXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnQWNtZSBcdTIwMTQgbG9naW4gaW5jaWRlbnQgc3RhdHVzIGNhbGwnLFxuICAgIHR5cGU6ICdjYWxsJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDE2LCBhdDogWzgsIDMwXSwgbWludXRlczogMjAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fY2FzZScsIHJlbGF0ZWRLZXk6ICdMb2dpbiBpc3N1ZXMgYWZ0ZXIgcGxhdGZvcm0gdXBncmFkZScsIGFjY291bnQ6ICdBY21lIENvcnBvcmF0aW9uJyxcbiAgICBvdXRjb21lOiAnQ29uZmlybWVkIHRoZSBFTUVBIFNTTyBjbG9jay1za2V3IGh5cG90aGVzaXM7IGVuZ2luZWVyaW5nIHJlcHJvZHVjaW5nIGluIHN0YWdpbmcuJyxcbiAgICBhdHRlbmRlZXM6IFt7IGNvbnRhY3Q6ICdqb2huLnNtaXRoQGFjbWUuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdBY21lIFx1MjAxNCByZW5ld2FsIHNpZ25hdHVyZSByZXZpZXcnLFxuICAgIHR5cGU6ICdtZWV0aW5nJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDIwLCBhdDogWzE0LCAwXSwgbWludXRlczogNDUsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fb3Bwb3J0dW5pdHknLCByZWxhdGVkS2V5OiAnQWNtZSBBbm51YWwgUmVuZXdhbCAyMDI1JywgYWNjb3VudDogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgIG91dGNvbWU6ICdTaWduZWQgdHdvIHdlZWtzIGFoZWFkIG9mIHRoZSByZW5ld2FsIGRhdGUuIE11bHRpLXllYXIgZGVmZXJyZWQgdG8gdGhlIHVwZ3JhZGUgZGVjaXNpb24uJyxcbiAgICBhdHRlbmRlZXM6IFt7IGNvbnRhY3Q6ICdqb2huLnNtaXRoQGFjbWUuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdBY21lIFx1MjAxNCBTYW4gRnJhbmNpc2NvIEhRIGJ1c2luZXNzIHJldmlldycsXG4gICAgdHlwZTogJ29uc2l0ZV92aXNpdCcsIHN0YXR1czogJ2hlbGQnLCBkYXlzQWdvOiAzMywgYXQ6IFsxMywgMF0sIG1pbnV0ZXM6IDEyMCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9hY2NvdW50JywgcmVsYXRlZEtleTogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgIGxvY2F0aW9uOiAnNTAwIEhvd2FyZCBTdHJlZXQsIFN1aXRlIDQwMCwgU2FuIEZyYW5jaXNjbycsXG4gICAgb3V0Y29tZTogJ1F1YXJ0ZXJseSByZXZpZXcgd2l0aCB0aGUgQ1RPIG9yZy4gRXhwYW5zaW9uIGludG8gdGhlIEVNRUEgdGVhbSBjb25maXJtZWQgYXMgdGhlIG5leHQgbW90aW9uLicsXG4gICAgYXR0ZW5kZWVzOiBbeyBjb250YWN0OiAnam9obi5zbWl0aEBhY21lLmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdhY2NlcHRlZCcgfV0sXG4gIH0sXG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFdheW5lIEVudGVycHJpc2VzIFx1MjAxNCBhIGRlYWwgaW4gbmVnb3RpYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIHtcbiAgICBzdWJqZWN0OiAnV2F5bmUgXHUyMDE0IGVudGVycHJpc2UgbGljZW5zZSBuZWdvdGlhdGlvbicsXG4gICAgdHlwZTogJ21lZXRpbmcnLCBzdGF0dXM6ICdoZWxkJywgZGF5c0FnbzogMywgYXQ6IFsxNiwgMF0sIG1pbnV0ZXM6IDYwLFxuICAgIHJlbGF0ZWRUeXBlOiAnY3JtX29wcG9ydHVuaXR5JywgcmVsYXRlZEtleTogJ1dheW5lIEVudGVycHJpc2UgTGljZW5zZScsIGFjY291bnQ6ICdXYXluZSBFbnRlcnByaXNlcycsXG4gICAgbG9jYXRpb246ICdab29tJyxcbiAgICBvdXRjb21lOiAnVm9sdW1lIHRpZXIgYWdyZWVkIGF0IDIwIHRlbmFudHMuIFNlY3VyaXR5IGFkZGVuZHVtIGlzIHRoZSBsYXN0IG9wZW4gaXRlbS4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdXYXluZSBcdTIwMTQgc2VjdXJpdHkgYWRkZW5kdW0gd2Fsa3Rocm91Z2gnLFxuICAgIHR5cGU6ICdjYWxsJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDgsIGF0OiBbMTEsIDBdLCBtaW51dGVzOiAzMCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9jb250YWN0JywgcmVsYXRlZEtleTogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLCBhY2NvdW50OiAnV2F5bmUgRW50ZXJwcmlzZXMnLFxuICAgIG91dGNvbWU6ICdMZWdhbCB0byByZXR1cm4gcmVkbGluZXMgd2l0aGluIHRoZSB3ZWVrLicsXG4gICAgYXR0ZW5kZWVzOiBbeyBjb250YWN0OiAncndpbHNvbkB3YXluZS5leGFtcGxlLmNvbScsIHJlc3BvbnNlOiAnYWNjZXB0ZWQnIH1dLFxuICB9LFxuICB7XG4gICAgc3ViamVjdDogJ1dheW5lIFx1MjAxNCBwbGF0Zm9ybSBnb3Zlcm5hbmNlIHdlYmluYXInLFxuICAgIHR5cGU6ICd3ZWJpbmFyJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDI2LCBhdDogWzE1LCAwXSwgbWludXRlczogNjAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fYWNjb3VudCcsIHJlbGF0ZWRLZXk6ICdXYXluZSBFbnRlcnByaXNlcycsXG4gICAgbG9jYXRpb246ICdodHRwczovL2FjbWUuZXhhbXBsZS5jb20vd2ViaW5hcnMvZ292ZXJuYW5jZScsXG4gICAgb3V0Y29tZTogJ0ZvdXIgYnVzaW5lc3MgdW5pdHMgYXR0ZW5kZWQ7IHR3byBhc2tlZCBmb3IgdGhlaXIgb3duIHJvbGxvdXQgcGxhbi4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdXYXluZSBcdTIwMTQgYnVsayBpbXBvcnQgcm9sbG91dCBjaGVjay1pbicsXG4gICAgdHlwZTogJ2NhbGwnLCBzdGF0dXM6ICdoZWxkJywgZGF5c0FnbzogNDUsIGF0OiBbMTAsIDMwXSwgbWludXRlczogMjUsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fY2FzZScsIHJlbGF0ZWRLZXk6ICdSZXF1ZXN0OiBidWxrIGltcG9ydCB2aWEgQ1NWJywgYWNjb3VudDogJ1dheW5lIEVudGVycHJpc2VzJyxcbiAgICBvdXRjb21lOiAnQ1NWIGltcG9ydCBzaGlwcGVkIGFuZCBkb2N1bWVudGVkOyB0aGUgY3VzdG9tZXIgY2xvc2VkIHRoZSByZXF1ZXN0IG91dCBvbiB0aGUgY2FsbC4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgVmVydGV4IEFuYWx5dGljcyBcdTIwMTQgZXhwYW5zaW9uLCB0aGVuIGFuIGVudGVycHJpc2Ugcm9sbG91dCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAge1xuICAgIHN1YmplY3Q6ICdWZXJ0ZXggXHUyMDE0IHJvbGxvdXQgcGhhc2luZyBhbmQgZGF0YSByZXNpZGVuY3knLFxuICAgIHR5cGU6ICdtZWV0aW5nJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDEsIGF0OiBbOSwgMzBdLCBtaW51dGVzOiA3NSxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9vcHBvcnR1bml0eScsIHJlbGF0ZWRLZXk6ICdWZXJ0ZXggRW50ZXJwcmlzZSBSb2xsb3V0JywgYWNjb3VudDogJ1ZlcnRleCBBbmFseXRpY3MnLFxuICAgIGxvY2F0aW9uOiAnWm9vbScsXG4gICAgb3V0Y29tZTogJ1BoYXNlIDEgc2NvcGVkIHRvIGZvdXIgcmVnaW9ucy4gUmVzaWRlbmN5IGNvbnRyb2xzIHRvIGJlIGNvbmZpcm1lZCB3aXRoIHRoZWlyIHNlY3VyaXR5IHRlYW0uJyxcbiAgICBhdHRlbmRlZXM6IFt7IGNvbnRhY3Q6ICdldGhhbi5icm9va3NAdmVydGV4LmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdhY2NlcHRlZCcgfV0sXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnVmVydGV4IFx1MjAxNCByZXZlbnVlIGFuYWx5dGljcyBkZW1vJyxcbiAgICB0eXBlOiAnZGVtbycsIHN0YXR1czogJ2hlbGQnLCBkYXlzQWdvOiAxMCwgYXQ6IFsxNCwgMzBdLCBtaW51dGVzOiA0NSxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9vcHBvcnR1bml0eScsIHJlbGF0ZWRLZXk6ICdWZXJ0ZXggQW5hbHl0aWNzIEV4cGFuc2lvbicsIGFjY291bnQ6ICdWZXJ0ZXggQW5hbHl0aWNzJyxcbiAgICBsb2NhdGlvbjogJ1pvb20nLFxuICAgIG91dGNvbWU6ICdTYWxlcywgbWFya2V0aW5nIGFuZCBzZXJ2aWNlIGxlYWRzIGFsbCBhc2tlZCBmb3IgdGhlaXIgb3duIHdvcmtzcGFjZSBcdTIwMTQgdGhlIGV4cGFuc2lvbiBjYXNlIG1ha2VzIGl0c2VsZi4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ2V0aGFuLmJyb29rc0B2ZXJ0ZXguZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdWZXJ0ZXggXHUyMDE0IGV4cGFuc2lvbiBidXlpbmcgY29tbWl0dGVlIGNhbGwnLFxuICAgIHR5cGU6ICdjYWxsJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDE5LCBhdDogWzE2LCAzMF0sIG1pbnV0ZXM6IDMwLFxuICAgIHJlbGF0ZWRUeXBlOiAnY3JtX2NvbnRhY3QnLCByZWxhdGVkS2V5OiAnZXRoYW4uYnJvb2tzQHZlcnRleC5leGFtcGxlLmNvbScsIGFjY291bnQ6ICdWZXJ0ZXggQW5hbHl0aWNzJyxcbiAgICBvdXRjb21lOiAnQ1JPIG93bnMgdGhlIGJ1ZGdldDsgdGhlIGRhdGEgdGVhbSBzdGF5cyB0aGUgdGVjaG5pY2FsIHNwb25zb3IuJyxcbiAgICBhdHRlbmRlZXM6IFt7IGNvbnRhY3Q6ICdldGhhbi5icm9va3NAdmVydGV4LmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdhY2NlcHRlZCcgfV0sXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnVmVydGV4IFx1MjAxNCBkZXZlbG9wZXIgcGxhdGZvcm0gcmV0cm9zcGVjdGl2ZScsXG4gICAgdHlwZTogJ21lZXRpbmcnLCBzdGF0dXM6ICdoZWxkJywgZGF5c0FnbzogMzgsIGF0OiBbMTEsIDBdLCBtaW51dGVzOiA2MCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9hY2NvdW50JywgcmVsYXRlZEtleTogJ1ZlcnRleCBBbmFseXRpY3MnLFxuICAgIG91dGNvbWU6ICdUaHJlZSBwcm9kdWN0IHRlYW1zIGxpdmUgb24gdGhlIGRldmVsb3BlciBwbGF0Zm9ybTsgdXNhZ2UgYW5hbHl0aWNzIGlzIHRoZSBuZXh0IGFzay4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ2V0aGFuLmJyb29rc0B2ZXJ0ZXguZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgU3RhcmsgTWVkaWNhbCBcdTIwMTQgdGhlIHBhcnRuZXIgbW90aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICB7XG4gICAgc3ViamVjdDogJ1N0YXJrIE1lZGljYWwgXHUyMDE0IFRvcm9udG8gY2xpbmljYWwgb3BlcmF0aW9ucyB2aXNpdCcsXG4gICAgdHlwZTogJ29uc2l0ZV92aXNpdCcsIHN0YXR1czogJ2hlbGQnLCBkYXlzQWdvOiA1MiwgYXQ6IFs5LCAwXSwgbWludXRlczogMTgwLFxuICAgIHJlbGF0ZWRUeXBlOiAnY3JtX2FjY291bnQnLCByZWxhdGVkS2V5OiAnU3RhcmsgTWVkaWNhbCcsXG4gICAgbG9jYXRpb246ICcxODEgQmF5IFN0cmVldCwgU3VpdGUgMjIwMCwgVG9yb250bycsXG4gICAgb3V0Y29tZTogJ1R3byBjbGluaWNhbCBzZXJ2aWNlIGxpbmVzIGxpdmUgb24gdGhlIHBpbG90LiBEZXZpY2Utc2VydmljaW5nIGV4cGFuc2lvbiBwYXJrZWQgb24gYnVkZ2V0LicsXG4gICAgYXR0ZW5kZWVzOiBbeyBjb250YWN0OiAnZW1pbHkuZEBzdGFya21lZC5leGFtcGxlLmNvbScsIHJlc3BvbnNlOiAnYWNjZXB0ZWQnIH1dLFxuICB9LFxuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBMZWFkczogdGhlIG9ubHkgaGVsZCByb3dzIHRoYXQgdG91Y2ggYSBwcm9zcGVjdCdzIG93biBjbG9jayBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAge1xuICAgIHN1YmplY3Q6ICdDbG91ZEZpcnN0IFx1MjAxNCBxdWFsaWZpY2F0aW9uIGNhbGwgd2l0aCBMaXNhIFRob21wc29uJyxcbiAgICB0eXBlOiAnY2FsbCcsIHN0YXR1czogJ2hlbGQnLCBkYXlzQWdvOiAxLCBhdDogWzExLCAwXSwgbWludXRlczogMzAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fbGVhZCcsIHJlbGF0ZWRLZXk6ICdsaXNhLnRAY2xvdWRmaXJzdC5leGFtcGxlLmNvbScsXG4gICAgb3V0Y29tZTogJ0J1ZGdldCBjb25maXJtZWQgYW5kIGEgdGVjaG5pY2FsIGV2YWx1YXRpb24gYWdyZWVkIFx1MjAxNCBxdWFsaWZpZWQuJyxcbiAgICBhdHRlbmRlZXM6IFt7IGxlYWQ6ICdsaXNhLnRAY2xvdWRmaXJzdC5leGFtcGxlLmNvbScsIHJlc3BvbnNlOiAnYWNjZXB0ZWQnIH1dLFxuICB9LFxuICB7XG4gICAgc3ViamVjdDogJ0VkdVRlY2ggTGFicyBcdTIwMTQgZGlzY292ZXJ5IGNhbGwgd2l0aCBEYXZpZCBLaW0nLFxuICAgIHR5cGU6ICdjYWxsJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDQsIGF0OiBbMTMsIDBdLCBtaW51dGVzOiAzMCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9sZWFkJywgcmVsYXRlZEtleTogJ2RraW1AZWR1dGVjaGxhYnMuZXhhbXBsZS5jb20nLFxuICAgIG91dGNvbWU6ICdSZXBsYWNpbmcgc3ByZWFkc2hlZXRzIGFjcm9zcyBhZG1pc3Npb25zLiBSZWZlcnJhbCBzb3VyY2UgY29uZmlybWVkLicsXG4gICAgYXR0ZW5kZWVzOiBbeyBsZWFkOiAnZGtpbUBlZHV0ZWNobGFicy5leGFtcGxlLmNvbScsIHJlc3BvbnNlOiAnYWNjZXB0ZWQnIH1dLFxuICB9LFxuICAvLyBUaGUgZWFybGllciB0b3VjaCBvbiBlYWNoIG9mIHRoZSB0d28gbGVhZHMgYWJvdmUsIHNvIGVhY2ggbGVhZCdzIEFjdGl2aXR5XG4gIC8vIHRhYiByZWFkcyBhcyBhIHNob3J0IGhpc3RvcnkgcmF0aGVyIHRoYW4gYSBzaW5nbGUgcm93LiBCb3RoIGxlYWRzIGFscmVhZHlcbiAgLy8gY2FycnkgYGxhc3RfY29udGFjdGVkX2RhdGU6IHRvZGF5KClgIGZvciB0aGVpciBsYXRlciBjYWxsLCBzbyBhIHNlY29uZCBoZWxkXG4gIC8vIHJvdyBtb3ZlcyBubyByZWNlbmN5IGNsb2NrIChgZXZlbnRfYWN0aXZpdHlfYnViYmxlYCBzdGFtcHMgdGhlIHNlZWQgbW9tZW50KS5cbiAge1xuICAgIHN1YmplY3Q6ICdDbG91ZEZpcnN0IFx1MjAxNCBmb2xsb3ctdXAgbWVldGluZyBhZnRlciB0aGUgQ2xvdWQgU3VtbWl0IGJvb3RoJyxcbiAgICB0eXBlOiAnbWVldGluZycsIHN0YXR1czogJ2hlbGQnLCBkYXlzQWdvOiA4LCBhdDogWzE1LCAwXSwgbWludXRlczogNDUsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fbGVhZCcsIHJlbGF0ZWRLZXk6ICdsaXNhLnRAY2xvdWRmaXJzdC5leGFtcGxlLmNvbScsXG4gICAgb3V0Y29tZTogJ1dhbGtlZCB0aHJvdWdoIHBpcGVsaW5lIGFuZCBmb3JlY2FzdGluZy4gQXNrZWQgZm9yIGEgcXVhbGlmaWNhdGlvbiBjYWxsIHdpdGggZmluYW5jZS4nLFxuICAgIGF0dGVuZGVlczogW3sgbGVhZDogJ2xpc2EudEBjbG91ZGZpcnN0LmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdhY2NlcHRlZCcgfV0sXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnRWR1VGVjaCBMYWJzIFx1MjAxNCByZWZlcnJhbCBpbnRybyBjYWxsIHdpdGggRGF2aWQgS2ltJyxcbiAgICB0eXBlOiAnY2FsbCcsIHN0YXR1czogJ2hlbGQnLCBkYXlzQWdvOiA5LCBhdDogWzEwLCAwXSwgbWludXRlczogMTUsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fbGVhZCcsIHJlbGF0ZWRLZXk6ICdka2ltQGVkdXRlY2hsYWJzLmV4YW1wbGUuY29tJyxcbiAgICBvdXRjb21lOiAnV2FybSBpbnRybyBmcm9tIHRoZSByZWZlcnJpbmcgcGFydG5lci4gQm9va2VkIGEgcHJvcGVyIGRpc2NvdmVyeSBjYWxsLicsXG4gICAgYXR0ZW5kZWVzOiBbeyBsZWFkOiAnZGtpbUBlZHV0ZWNobGFicy5leGFtcGxlLmNvbScsIHJlc3BvbnNlOiAnYWNjZXB0ZWQnIH1dLFxuICB9LFxuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBCb29rZWQsIG5vdCBoZWxkOiB0aGUgY2FsZW5kYXIgYWhlYWQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIC8vIFRoZXNlIGFyZSB3aGF0IGBzdGF0dXNgIGV4aXN0cyBmb3IuIE5vdCBvbmUgb2YgdGhlbSBtb3ZlcyBhIHJlY2VuY3kgY2xvY2ssXG4gIC8vIGFuZCB0aGUgdGhyZWUgcmUtZW5nYWdlbWVudCByb3dzIGJlbG93IHNpdCBvbiB0aGUgYWNjb3VudHMgdGhlIGNodXJuIHRpbGVzXG4gIC8vIGNvdW50IFx1MjAxNCB3aGljaCBpcyB0aGUgZGVtb25zdHJhdGlvbiwgbm90IGFuIG92ZXJzaWdodC5cbiAge1xuICAgIHN1YmplY3Q6ICdBY21lIFx1MjAxNCBBSSBhZ2VudCBnb3Zlcm5hbmNlIHdvcmtzaG9wJyxcbiAgICB0eXBlOiAnbWVldGluZycsIHN0YXR1czogJ3BsYW5uZWQnLCBkYXlzQWdvOiAtNiwgYXQ6IFs5LCAwXSwgbWludXRlczogOTAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fb3Bwb3J0dW5pdHknLCByZWxhdGVkS2V5OiAnQWNtZSBQbGF0Zm9ybSBVcGdyYWRlJywgYWNjb3VudDogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgIGxvY2F0aW9uOiAnR29vZ2xlIE1lZXQnLFxuICAgIGRlc2NyaXB0aW9uOiAnSm9pbnQgd29ya3Nob3Agd2l0aCBBY21lIGNvbXBsaWFuY2U6IGRhdGEgc2NvcGluZywgUkJBQywgYXVkaXQgdHJhaWxzLCBodW1hbi1pbi10aGUtbG9vcC4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ2pvaG4uc21pdGhAYWNtZS5leGFtcGxlLmNvbScsIHJlc3BvbnNlOiAndGVudGF0aXZlJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogOSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdXYXluZSBcdTIwMTQgcHJvY3VyZW1lbnQgc2lnbmF0dXJlIGNhbGwnLFxuICAgIHR5cGU6ICdtZWV0aW5nJywgc3RhdHVzOiAncGxhbm5lZCcsIGRheXNBZ286IC0xLCBhdDogWzExLCAwXSwgbWludXRlczogMzAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fb3Bwb3J0dW5pdHknLCByZWxhdGVkS2V5OiAnV2F5bmUgRW50ZXJwcmlzZSBMaWNlbnNlJywgYWNjb3VudDogJ1dheW5lIEVudGVycHJpc2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NvbmZpcm0gdGhlIHNpZ25hdHVyZSBkYXRlIG9uY2UgdGhlIHNlY3VyaXR5IGFkZGVuZHVtIGlzIGNsb3NlZC4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogNCxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdHbG9iZXggXHUyMDE0IG1hbnVmYWN0dXJpbmcgc3VpdGUgZGVtbycsXG4gICAgdHlwZTogJ2RlbW8nLCBzdGF0dXM6ICdwbGFubmVkJywgZGF5c0FnbzogLTUsIGF0OiBbMTUsIDBdLCBtaW51dGVzOiA2MCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9vcHBvcnR1bml0eScsIHJlbGF0ZWRLZXk6ICdHbG9iZXggTWFudWZhY3R1cmluZyBTdWl0ZScsIGFjY291bnQ6ICdHbG9iZXggSW5kdXN0cmllcycsXG4gICAgbG9jYXRpb246ICdab29tJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BsYW50LW9wZXJhdGlvbnMgZGVtbyBmb3IgdGhlIHNpeC1zaXRlIHJvbGxvdXQsIGFoZWFkIG9mIHRoZSBxdWFsaWZpY2F0aW9uIHJldmlldy4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ3NhcmFoLmpAZ2xvYmV4LmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdhY2NlcHRlZCcgfV0sXG4gICAgaW52aXRlZERheXNCZWZvcmU6IDgsXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnTGF0dGljZSBcdTIwMTQgcmVuZXdhbCBwcm9wb3NhbCByZXZpZXcnLFxuICAgIHR5cGU6ICdtZWV0aW5nJywgc3RhdHVzOiAncGxhbm5lZCcsIGRheXNBZ286IC0zLCBhdDogWzEwLCAwXSwgbWludXRlczogNDUsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fb3Bwb3J0dW5pdHknLCByZWxhdGVkS2V5OiAnTGF0dGljZSBFZHVjYXRpb24gUmVuZXdhbCcsIGFjY291bnQ6ICdMYXR0aWNlIEVkdWNhdGlvbicsXG4gICAgZGVzY3JpcHRpb246ICdXYWxrIHByb2N1cmVtZW50IHRocm91Z2ggdGhlIHR3by15ZWFyIG9wdGlvbiBiZWZvcmUgdGhlIGV4ZWN1dGl2ZSBzcG9uc29yIG1lZXRpbmcuJyxcbiAgICBhdHRlbmRlZXM6IFt7IGNvbnRhY3Q6ICdwcml5YS5zaGFoQGxhdHRpY2UuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogNixcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdJbml0ZWNoIFx1MjAxNCByZS1lbmdhZ2VtZW50IGNhbGwgYmVmb3JlIHJlbmV3YWwnLFxuICAgIHR5cGU6ICdjYWxsJywgc3RhdHVzOiAncGxhbm5lZCcsIGRheXNBZ286IC0yLCBhdDogWzE0LCAwXSwgbWludXRlczogMzAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fYWNjb3VudCcsIHJlbGF0ZWRLZXk6ICdJbml0ZWNoIFNvbHV0aW9ucycsXG4gICAgZGVzY3JpcHRpb246ICdOb2JvZHkgaGFzIHNwb2tlbiB0byBJbml0ZWNoIGluIHRlbiB3ZWVrcyBhbmQgdGhlIHJlbmV3YWwgaXMgNzUgZGF5cyBvdXQuIFJlLW9wZW4gdGhlIHJlbGF0aW9uc2hpcC4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ21jaGVuQGluaXRlY2guZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ25vX3Jlc3BvbnNlJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogNSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdOb3J0aHdpbmQgXHUyMDE0IGdyaWQgbW9kZXJuaXphdGlvbiBkaXNjb3Zlcnkgd29ya3Nob3AnLFxuICAgIHR5cGU6ICdtZWV0aW5nJywgc3RhdHVzOiAncGxhbm5lZCcsIGRheXNBZ286IC03LCBhdDogWzksIDMwXSwgbWludXRlczogMTIwLFxuICAgIHJlbGF0ZWRUeXBlOiAnY3JtX29wcG9ydHVuaXR5JywgcmVsYXRlZEtleTogJ05vcnRod2luZCBHcmlkIE1vZGVybml6YXRpb24nLCBhY2NvdW50OiAnTm9ydGh3aW5kIEVuZXJneScsXG4gICAgbG9jYXRpb246ICdMZW9wb2xkc3RyYXNzZSAyMSwgTXVuaWNoJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NvbmZpcm0gZGlzY292ZXJ5IHBhcnRpY2lwYW50cyBhbmQgYWdyZWUgdGhlIG9wZXJhdGlvbmFsLWRhdGEgYXNzZXNzbWVudCBzY29wZS4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ29saXZpYS5jaGVuQG5vcnRod2luZC5leGFtcGxlLmNvbScsIHJlc3BvbnNlOiAndGVudGF0aXZlJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogMTAsXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnQXBleCBMb2dpc3RpY3MgXHUyMDE0IGRhdGEgaHViIHJlLWVuZ2FnZW1lbnQgY2FsbCcsXG4gICAgdHlwZTogJ2NhbGwnLCBzdGF0dXM6ICdwbGFubmVkJywgZGF5c0FnbzogLTQsIGF0OiBbMTYsIDBdLCBtaW51dGVzOiAzMCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9hY2NvdW50JywgcmVsYXRlZEtleTogJ0FwZXggTG9naXN0aWNzJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBkYXRhLWh1YiBldmFsdWF0aW9uIGhhcyBiZWVuIHNpbGVudCBmb3IgYSBxdWFydGVyLiBSZS1lc3RhYmxpc2ggdGhlIGNvbW1lcmNpYWwgc3BvbnNvci4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ21hcmN1cy5yZWVkQGFwZXhsb2dpc3RpY3MuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ25vX3Jlc3BvbnNlJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogNixcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdOZXh0R2VuIFJldGFpbCBcdTIwMTQgZmlyc3QgZGlzY292ZXJ5IGNhbGwgd2l0aCBBbGljZSBNYXJ0aW5leicsXG4gICAgdHlwZTogJ2NhbGwnLCBzdGF0dXM6ICdwbGFubmVkJywgZGF5c0FnbzogLTIsIGF0OiBbMTUsIDBdLCBtaW51dGVzOiAzMCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9sZWFkJywgcmVsYXRlZEtleTogJ2FsaWNlQG5leHRnZW5yZXRhaWwuZXhhbXBsZS5jb20nLFxuICAgIGRlc2NyaXB0aW9uOiAnSW5ib3VuZCB3ZWIgbGVhZCwgYm9va2VkIG9uIGhlciBmb2xsb3ctdXAgZGF0ZS4nLFxuICAgIGF0dGVuZGVlczogW3sgbGVhZDogJ2FsaWNlQG5leHRnZW5yZXRhaWwuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ25vX3Jlc3BvbnNlJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogMyxcbiAgfSxcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgTmVpdGhlciBoZWxkIG5vciBib29rZWQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIC8vIGBkdXJhdGlvbl9taW51dGVzYCBpcyAwIG9uIGJvdGgsIGV4YWN0bHkgYXMgYGV2ZW50X3NjaGVkdWxlX2Rlcml2ZWBcbiAgLy8gcmVjb21wdXRlcyBpdDogYSBtZWV0aW5nIG5vYm9keSBhdHRlbmRlZCBvY2N1cGllcyBub2JvZHkncyB0aW1lLCB3aGlsZSB0aGVcbiAgLy8gY2FsZW5kYXIgc2xvdCBpdCB3YXMgYm9va2VkIGludG8gc3RheXMgb24gdGhlIHJlY29yZCBhcyBldmlkZW5jZSBvZiB0aGVcbiAgLy8gYXR0ZW1wdC5cbiAge1xuICAgIHN1YmplY3Q6ICdHbG9iZXggXHUyMDE0IGxpbmUgZXhwYW5zaW9uIHJldmlldycsXG4gICAgdHlwZTogJ21lZXRpbmcnLCBzdGF0dXM6ICdjYW5jZWxsZWQnLCBkYXlzQWdvOiAzMCwgYXQ6IFsxNCwgMF0sIG1pbnV0ZXM6IDYwLFxuICAgIHJlbGF0ZWRUeXBlOiAnY3JtX29wcG9ydHVuaXR5JywgcmVsYXRlZEtleTogJ0dsb2JleCBMaW5lIEV4cGFuc2lvbiAoTG9zdCknLCBhY2NvdW50OiAnR2xvYmV4IEluZHVzdHJpZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ2FuY2VsbGVkIGJ5IHRoZSBjdXN0b21lcjogdGhlIGluY3VtYmVudCBNRVMgdmVuZG9yIGhhZCBhbHJlYWR5IGJ1bmRsZWQgdGhlIHR3byBsaW5lcy4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ3NhcmFoLmpAZ2xvYmV4LmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdkZWNsaW5lZCcgfV0sXG4gICAgaW52aXRlZERheXNCZWZvcmU6IDcsXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnSW5pdGVjaCBcdTIwMTQgU1NPIGNvbmZpZ3VyYXRpb24gY2hlY2staW4nLFxuICAgIHR5cGU6ICdjYWxsJywgc3RhdHVzOiAnbm9fc2hvdycsIGRheXNBZ286IDU1LCBhdDogWzEwLCAwXSwgbWludXRlczogMzAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fYWNjb3VudCcsIHJlbGF0ZWRLZXk6ICdJbml0ZWNoIFNvbHV0aW9ucycsXG4gICAgZGVzY3JpcHRpb246ICdDdXN0b21lciBkaWQgbm90IGpvaW4uIFRoZSBsYXN0IGF0dGVtcHQgdG8gcmVhY2ggSW5pdGVjaCBiZWZvcmUgdGhlIGFjY291bnQgd2VudCBxdWlldC4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ21jaGVuQGluaXRlY2guZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ25vX3Jlc3BvbnNlJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogNCxcbiAgfSxcbl07XG5cbi8qKiBgW2hvdXIsIG1pbnV0ZV1gIHBsdXMgYG1pbnV0ZXNgLCBhcyB0aGUgZW5kLW9mLXNsb3Qgd2FsbCBjbG9jay4gKi9cbmNvbnN0IGVuZENsb2NrID0gKHNwZWM6IEV2ZW50U3BlYyk6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0gPT4ge1xuICBjb25zdCB0b3RhbCA9IHNwZWMuYXRbMF0gKiA2MCArIHNwZWMuYXRbMV0gKyBzcGVjLm1pbnV0ZXM7XG4gIHJldHVybiBbTWF0aC5mbG9vcih0b3RhbCAvIDYwKSwgdG90YWwgJSA2MF07XG59O1xuXG5leHBvcnQgY29uc3QgZXZlbnRzID0gZGVmaW5lU2VlZChFdmVudCwge1xuICBtb2RlOiAndXBzZXJ0JyxcbiAgZXh0ZXJuYWxJZDogJ3N1YmplY3QnLFxuICByZWNvcmRzOiBFVkVOVF9TUEVDUy5tYXAoKHNwZWMpID0+IHtcbiAgICBjb25zdCBbZW5kSG91ciwgZW5kTWludXRlXSA9IGVuZENsb2NrKHNwZWMpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWJqZWN0OiBzcGVjLnN1YmplY3QsXG4gICAgICB0eXBlOiBzcGVjLnR5cGUsXG4gICAgICBzdGF0dXM6IHNwZWMuc3RhdHVzLFxuICAgICAgc3RhcnRfZGF0ZXRpbWU6IGNlbENsb2NrKHNwZWMuZGF5c0Fnbywgc3BlYy5hdFswXSwgc3BlYy5hdFsxXSksXG4gICAgICBlbmRfZGF0ZXRpbWU6IGNlbENsb2NrKHNwZWMuZGF5c0FnbywgZW5kSG91ciwgZW5kTWludXRlKSxcbiAgICAgIC8vIEF1dGhvcmVkIHJhdGhlciB0aGFuIGxlZnQgdG8gdGhlIGhvb2ssIGFuZCBhdXRob3JlZCB0byB0aGUgdmFsdWUgdGhlXG4gICAgICAvLyBob29rIGNvbXB1dGVzOiBgZXZlbnRfc2NoZWR1bGVfZGVyaXZlYCBtZWFzdXJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIHR3b1xuICAgICAgLy8gdGltZXN0YW1wcyBhYm92ZSwgdGhlbiB6ZXJvZXMgaXQgZm9yIGEgY2FuY2VsbGVkIC8gbm8tc2hvdyByb3cuIEJvdGhcbiAgICAgIC8vIGJyYW5jaGVzIGFncmVlIHdpdGggdGhpcyBsaXRlcmFsLCBzbyB0aGUgZmlndXJlIGlzIHJpZ2h0IHdoZXRoZXIgb3Igbm90XG4gICAgICAvLyBob29rcyBmaXJlIG92ZXIgdGhlIHNlZWQgd3JpdGUgKGAuL19zaGFyZWQudHNgLCBkb2N0cmluZSBydWxlIDIpLlxuICAgICAgZHVyYXRpb25fbWludXRlczogc3BlYy5zdGF0dXMgPT09ICdjYW5jZWxsZWQnIHx8IHNwZWMuc3RhdHVzID09PSAnbm9fc2hvdycgPyAwIDogc3BlYy5taW51dGVzLFxuICAgICAgYWxsX2RheTogZmFsc2UsXG4gICAgICByZWxhdGVkX3RvX3R5cGU6IHNwZWMucmVsYXRlZFR5cGUsXG4gICAgICBbRVZFTlRfUkVMQVRFRF9GSUVMRFtzcGVjLnJlbGF0ZWRUeXBlXV06IHNwZWMucmVsYXRlZEtleSxcbiAgICAgIC8vIFRoZSBhY2NvdW50IGxpbmsgaXMgYXV0aG9yZWQgb24gZXZlcnkgcm93IHRoYXQgaGFzIG9uZSwgaW5jbHVkaW5nIHJvd3NcbiAgICAgIC8vIHdob3NlIGByZWxhdGVkX3RvX3R5cGVgIGlzIHRoZSBjb250YWN0IC8gb3Bwb3J0dW5pdHkgLyBjYXNlIFx1MjAxNCB0aGUgc2FtZVxuICAgICAgLy8gc2hhcGUgdGhlIHRhc2sgc2VlZHMgdXNlLCBhbmQgd2hhdCBmaWxscyB0aGUgQUNDT1VOVCdzIGFjdGl2aXR5IGxpc3QuXG4gICAgICAuLi4oc3BlYy5hY2NvdW50ICYmIHNwZWMucmVsYXRlZFR5cGUgIT09ICdjcm1fYWNjb3VudCdcbiAgICAgICAgPyB7IHJlbGF0ZWRfdG9fYWNjb3VudDogc3BlYy5hY2NvdW50IH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4oc3BlYy5sb2NhdGlvbiA/IHsgbG9jYXRpb246IHNwZWMubG9jYXRpb24gfSA6IHt9KSxcbiAgICAgIC4uLihzcGVjLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogc3BlYy5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgLi4uKHNwZWMub3V0Y29tZSA/IHsgb3V0Y29tZV9ub3Rlczogc3BlYy5vdXRjb21lIH0gOiB7fSksXG4gICAgICAvLyBObyBgb3duZXJfaWRgOiBhIHNlZWQgY2Fubm90IG5hbWUgYSB1c2VyIChzZWUgYG9iamVjdHN0YWNrLmNvbXBvc2l0aW9uLnRzYCxcbiAgICAgIC8vIFwiQSBzZWVkIGNhbid0IG5hbWUgYSB1c2VyXCIpLCBzbyB0aGVzZSByb3dzIGxhbmQgb3duZXJsZXNzIGFuZCB0aGVcbiAgICAgIC8vIHBsYXRmb3JtJ3Mgc2VlZC1vd25lcnNoaXAgY2xhaW0gaGFuZHMgdGhlbSB0byB0aGUgZmlyc3QgYWRtaW5pc3RyYXRvclxuICAgICAgLy8gd2hlbiB0aGUgc2VlZCBzZXR0bGVzICgjNjcxLCAjMTg5MikuXG4gICAgfTtcbiAgfSksXG59KTtcblxuLyoqXG4gKiBBdHRlbmRlZXMsIHNlZWRlZCBhcyBUV08gZGF0YXNldHMgb3ZlciBvbmUgb2JqZWN0LCBzcGxpdCBieSB3aGljaCBwYXJ0eVxuICogbG9va3VwIGlzIHBvcHVsYXRlZCBcdTIwMTQgdGhlIHNhbWUgY29uc3RydWN0aW9uLCBmb3IgdGhlIHNhbWUgcmVhc29uLCBhc1xuICogYGNhbXBhaWduTWVtYmVyc0Zyb21MZWFkc2AgLyBgY2FtcGFpZ25NZW1iZXJzRnJvbUNvbnRhY3RzYDogdGhlIGxvYWRlcidzXG4gKiBjb21wb3NpdGUga2V5IGlzIEVNUFRZIHdoZW4gYW55IGNvbXBvbmVudCBpcyBudWxsLCB3aGljaCBzaWxlbnRseSBkaXNhYmxlc1xuICogZGVkdXBlIGFuZCByZS1pbnNlcnRzIGV2ZXJ5IHJvdyBvbiBlYWNoIHJlcGxheSBib290LlxuICpcbiAqIFRoZXJlIGlzIG5vIHRoaXJkIGRhdGFzZXQgZm9yIGBzeXNfdXNlcmAgYXR0ZW5kZWVzLCBhbmQgbm8gYGlzX29yZ2FuaXplcjpcbiAqIHRydWVgIHJvdyBhbnl3aGVyZSBiZWxvdy4gVGhlIG9yZ2FuaXNlciBvZiBldmVyeSBvbmUgb2YgdGhlc2UgbWVldGluZ3MgaXMgdGhlXG4gKiByZXAgXHUyMDE0IGEgYHN5c191c2VyYCBcdTIwMTQgYW5kIGEgc2VlZCBjYW5ub3QgbmFtZSBhIHVzZXI6IGxvb2t1cCB2YWx1ZXMgcmVzb2x2ZVxuICogYWdhaW5zdCB0aGUgdGFyZ2V0J3MgZXh0ZXJuYWxJZCwgd2hpY2ggb25seSB3b3JrcyBpbnNpZGUgdGhlIGFwcCdzIG93blxuICogb2JqZWN0IGdyYXBoLiBgYWN0aXZpdHktYWN0aW9ucy50c2AgYWRkcyB0aGUgb3JnYW5pc2VyIHJvdyBhdCBydW50aW1lLCB3aGVyZVxuICogdGhlIGlkIGV4aXN0cy4gTm90aGluZyBpcyBpbnZlbnRlZCBoZXJlIHRvIHN0YW5kIGluIGZvciBpdC5cbiAqXG4gKiAjIFRoZSBleHRlcm5hbCBndWVzdCwgcmV2aXNpdGVkICgjNzQwKVxuICpcbiAqICM2NzEgc2VlZGVkIG5vIGV4dGVybmFsLW9ubHkgYXR0ZW5kZWUgZm9yIGEgcmVhc29uIHRoYXQgaGFzIG5vdyBFWFBJUkVELCBhbmRcbiAqIHRoZSBub3RlIGlzIHVwZGF0ZWQgcmF0aGVyIHRoYW4gZGVsZXRlZCBiZWNhdXNlIHRoZSByZWFzb24gd2FzIGEgZGVmZWN0LCBub3RcbiAqIGEgdGFzdGU6IGBhdHRlbmRlZV90eXBlYCBoYWQgbm8gYGV4dGVybmFsYCB2YWx1ZSwgc28gdGhlIG9ubHkgd2F5IHRvIHN0b3JlIGFcbiAqIGd1ZXN0IHdobyBpcyBpbiBubyBDUk0gb2JqZWN0IHdhcyB0byBmaWxlIHRoZSByb3cgdW5kZXIgYGNvbnRhY3RgIGFuZCBsZWF2ZVxuICogYGNybV9jb250YWN0YCBlbXB0eSBcdTIwMTQgYSBzZWVkIHRoYXQgbGllcyBhYm91dCBpdHMgb3duIGRpc2NyaW1pbmF0b3IuICM3NDAgYWRkZWRcbiAqIHRoZSBmb3VydGggb3B0aW9uIGFuZCBtYWRlIGBhdHRlbmRlZV9yZXNvbHZlc2AgLyBgYXR0ZW5kZWVfdHlwZV9leGNsdXNpdmVgXG4gKiBlbmZvcmNlIHRoZSBwYWlyaW5nLCBzbyBgeyBhdHRlbmRlZV90eXBlOiAnZXh0ZXJuYWwnLCBleHRlcm5hbF9uYW1lOiBcIlx1MjAyNlwiIH1gIGlzXG4gKiBub3cgYW4gaG9uZXN0LCBhY2NlcHRlZCByb3cgYW5kIHNlZWRpbmcgb25lIGlzIGxlZ2l0aW1hdGUuXG4gKlxuICogSXQgaXMgc3RpbGwgbm90IHNlZWRlZCwgb24gdGhlIG5hcnJvd2VyIGdyb3VuZCB0aGF0IHN1cnZpdmVzOiBldmVyeSByb3cgYmVsb3dcbiAqIGlzIGRyYXduIGZyb20gYSBzZWVkZWQgY29udGFjdCBvciBsZWFkIHNvIHRoZSBkZW1vJ3MgcmVsYXRlZCBsaXN0cyBhbmQgY2h1cm5cbiAqIHRpbGVzIGhhbmcgdG9nZXRoZXIsIGFuZCBhbiBpbnZlbnRlZCBvdXRzaWRlIGNvdW5zZWwgd291bGQgYnV5IGEgdGhpcmRcbiAqIGRhdGFzZXQgKGl0cyBvd24gYGV4dGVybmFsSWQ6IFsnY3JtX2V2ZW50JywgJ2V4dGVybmFsX25hbWUnXWAsIHNpbmNlIHRoZVxuICogbG9hZGVyJ3MgY29tcG9zaXRlIGtleSBpcyBlbXB0eSB3aGVuIGEgY29tcG9uZW50IGlzIG51bGwpIGZvciBvbmUgZGVjb3JhdGl2ZVxuICogcm93IHRoYXQgbm8gdmlldywgY3ViZSBvciBkYXNoYm9hcmQgcmVhZHMuIFRoZSBjYXBhYmlsaXR5IGlzIHByb3ZlbiB3aGVyZSB0aGVcbiAqIHF1ZXN0aW9uIGFjdHVhbGx5IGlzIFx1MjAxNCBvbiB0aGUgcmVhbCBlbmdpbmUsIGluXG4gKiBgdGVzdC9hdHRlbmRlZS10eXBlLXJlc29sdXRpb24udGVzdC50c2AgXHUyMDE0IG5vdCBpbiB0aGUgZml4dHVyZSBib29rLiBBZGQgb25lXG4gKiBoZXJlIHRoZSBkYXkgYSBkZW1vIHNjZW5hcmlvIGdlbnVpbmVseSBoYXMgYSBndWVzdCBpbiB0aGUgcm9vbTsgbm90aGluZyBpblxuICogdGhlIG1ldGFkYXRhIHN0YW5kcyBpbiB0aGUgd2F5IGFueSBtb3JlLlxuICovXG5jb25zdCBhdHRlbmRlZVJlY29yZHMgPSAoa2luZDogJ2NvbnRhY3QnIHwgJ2xlYWQnKSA9PlxuICBFVkVOVF9TUEVDUy5mbGF0TWFwKChzcGVjKSA9PlxuICAgIHNwZWMuYXR0ZW5kZWVzXG4gICAgICAuZmlsdGVyKChhKSA9PiAoa2luZCA9PT0gJ2xlYWQnID8gYS5sZWFkIDogYS5jb250YWN0KSlcbiAgICAgIC5tYXAoKGEpID0+ICh7XG4gICAgICAgIGNybV9ldmVudDogc3BlYy5zdWJqZWN0LFxuICAgICAgICBhdHRlbmRlZV90eXBlOiBraW5kLFxuICAgICAgICAuLi4oa2luZCA9PT0gJ2xlYWQnID8geyBjcm1fbGVhZDogYS5sZWFkIH0gOiB7IGNybV9jb250YWN0OiBhLmNvbnRhY3QgfSksXG4gICAgICAgIHJlc3BvbnNlOiBhLnJlc3BvbnNlLFxuICAgICAgICBpc19vcmdhbml6ZXI6IGZhbHNlLFxuICAgICAgICAvLyBUaGUgaW52aXRhdGlvbiBwcmVkYXRlcyB0aGUgc2xvdC4gQ2xhbXBlZCBhdCAwIHNvIGEgbWVldGluZyBib29rZWRcbiAgICAgICAgLy8gZm9yIHRoZSBkYXkgYWZ0ZXIgdG9tb3Jyb3cgd2FzIGludml0ZWQgdG9kYXksIG5ldmVyIHRvbW9ycm93LlxuICAgICAgICBpbnZpdGVkX2RhdGU6IGNlbERheXNBZ28oTWF0aC5tYXgoc3BlYy5kYXlzQWdvICsgKHNwZWMuaW52aXRlZERheXNCZWZvcmUgPz8gMyksIDApKSxcbiAgICAgIH0pKSxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGV2ZW50QXR0ZW5kZWVzRnJvbUNvbnRhY3RzID0gZGVmaW5lU2VlZChFdmVudEF0dGVuZGVlLCB7XG4gIG1vZGU6ICd1cHNlcnQnLFxuICBleHRlcm5hbElkOiBbJ2NybV9ldmVudCcsICdjcm1fY29udGFjdCddLFxuICByZWNvcmRzOiBhdHRlbmRlZVJlY29yZHMoJ2NvbnRhY3QnKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZXZlbnRBdHRlbmRlZXNGcm9tTGVhZHMgPSBkZWZpbmVTZWVkKEV2ZW50QXR0ZW5kZWUsIHtcbiAgbW9kZTogJ3Vwc2VydCcsXG4gIGV4dGVybmFsSWQ6IFsnY3JtX2V2ZW50JywgJ2NybV9sZWFkJ10sXG4gIHJlY29yZHM6IGF0dGVuZGVlUmVjb3JkcygnbGVhZCcpLFxufSk7XG5cbi8qKlxuICogVGhlIGxlYWQgdGltZWxpbmUgcG9pbnRlcnMgXHUyMDE0IHdoYXQgYGxvZ19jYWxsYCB3b3VsZCBoYXZlIHdyaXR0ZW4gKCMxMjU4KS5cbiAqXG4gKiBBIGhlbGQgaW50ZXJhY3Rpb24gbG9nZ2VkIHRocm91Z2ggYGxvZ19jYWxsYCAvIGBsb2dfbWVldGluZ2BcbiAqIChgc3JjL3NhbGVzL2FjdGlvbnMvYWN0aXZpdHktYWN0aW9ucy50c2ApIHdyaXRlcyB0aHJlZSB0aGluZ3M6IHRoZVxuICogYGNybV9ldmVudGAsIGl0cyBhdHRlbmRlZXMsIGFuZCBvbmUgYHN5c19hY3Rpdml0eWAgcm93IFx1MjAxNCB0aGUgQURSLTAwNTJcbiAqIEFjdGl2aXR5UG9pbnRlciB0aGUgbGVhZCdzICoqQWN0aXZpdHkqKiB0YWIgcmVhZHNcbiAqIChgcmVjb3JkOmFjdGl2aXR5YCBcdTIxOTIgYHN5c19hY3Rpdml0eWAgYnkgYHsgb2JqZWN0X25hbWUsIHJlY29yZF9pZCB9YCwgZmlsdGVyZWRcbiAqIHRvIHRoZSBgdGFza2Aga2luZCwgd2hpY2ggaXMgYHR5cGU6ICdjb21wbGV0ZWQnYCkuIFRoZSBzZWVkcyBhYm92ZSBhdXRob3IgdGhlXG4gKiBmaXJzdCB0d28gZm9yIGV2ZXJ5IGhlbGQgbGVhZCBpbnRlcmFjdGlvbjsgdGhpcyBkYXRhc2V0IGF1dGhvcnMgdGhlIHRoaXJkLFxuICogZGVyaXZlZCBmcm9tIHRoZSBTQU1FIHNwZWNzIHNvIHRoZSB0d28gY2Fubm90IGRyaWZ0IGFwYXJ0LlxuICpcbiAqIGByZWNvcmRfaWRgIGFuZCBgc291cmNlX2lkYCBjYXJyeSBOQVRVUkFMIEtFWVMgXHUyMDE0IHRoZSBsZWFkJ3MgZW1haWwgYW5kIHRoZVxuICogZXZlbnQncyBzdWJqZWN0LiBCb3RoIGFyZSBgcmVmZXJlbmNlVmlhYCBwb2ludGVyIHBhaXJzIG9uIHRoZSBwbGF0Zm9ybSBvYmplY3RcbiAqIChgcmVjb3JkX2lkYCBcdTIxOTQgYG9iamVjdF9uYW1lYCwgYHNvdXJjZV9pZGAgXHUyMTk0IGBzb3VyY2Vfb2JqZWN0YCksIHNvIHRoZSBzZWVkXG4gKiBsb2FkZXIgcmVzb2x2ZXMgZWFjaCBhZ2FpbnN0IHRoZSBvYmplY3QgaXRzIHNpYmxpbmcgY29sdW1uIG5hbWVzIGFuZFxuICogcmVmdXNlcyBhbiB1bnJlc29sdmFibGUgb25lIGxvdWRseSByYXRoZXIgdGhhbiBzdG9yaW5nIHRoZSBsaXRlcmFsLlxuICpcbiAqIFR3byBwbGF0Zm9ybSBmYWN0cyBib3VuZCB3aGF0IGlzIGF1dGhvcmVkIGhlcmU6XG4gKlxuICogICAtIGBzeXNfYWN0aXZpdHlgIGlzIGBsaWZlY3ljbGUuY2xhc3M6ICd0ZWxlbWV0cnknYCB3aXRoXG4gKiAgICAgYHJldGVudGlvbjogeyBtYXhBZ2U6ICcxNGQnIH1gLCBzbyBvbmx5IGludGVyYWN0aW9ucyB5b3VuZ2VyIHRoYW4gYVxuICogICAgIGZvcnRuaWdodCBhcmUgc2VlZGVkIFx1MjAxNCBhbiBvbGRlciByb3cgd291bGQgYmUgcmVhcGVkIGJlZm9yZSBhbnlvbmUgZGVtb3NcbiAqICAgICBpdC4gVGhlIGZpbHRlciBiZWxvdyBlbmZvcmNlcyB0aGF0IHJhdGhlciB0aGFuIHRydXN0aW5nIHRoZSBzcGVjIGxpc3QuXG4gKiAgIC0gQSBzZWVkIGNhbm5vdCBuYW1lIGEgdXNlciwgc28gYGFjdG9yX2lkYCAvIGBhY3Rvcl9uYW1lYCBhcmUgbm90IGF1dGhvcmVkXG4gKiAgICAgKHNlZSBgb2JqZWN0c3RhY2suY29tcG9zaXRpb24udHNgLCBcIkEgc2VlZCBjYW4ndCBuYW1lIGEgdXNlclwiKS4gVGhlXG4gKiAgICAgYWN0aW9uIHN0YW1wcyB0aGUgcmVwIGF0IHJ1bnRpbWUsIHdoZXJlIHRoZSBpZCBleGlzdHMuXG4gKi9cbmNvbnN0IFNZU19BQ1RJVklUWV9SRVRFTlRJT05fREFZUyA9IDE0O1xuXG4vKipcbiAqIFRoZSBzdW1tYXJ5IHByZWZpeCBvZiB0aGUgYWN0aW9uIHRoYXQgbG9ncyBlYWNoIGhlbGQgZXZlbnQgdHlwZSBcdTIwMTQgdGhlIHR3b1xuICogd3JpdGVycyB0aGF0IGV4aXN0IChgTE9HX0NBTExfU1BFQ2AgLyBgTE9HX01FRVRJTkdfU1BFQ2ApLiBBIGhlbGQgZXZlbnQgb2ZcbiAqIGFueSBvdGhlciB0eXBlIGhhcyBubyBhY3Rpb24gdGhhdCB3b3VsZCBoYXZlIHdyaXR0ZW4gYSBwb2ludGVyIGZvciBpdCwgc28gaXRcbiAqIGdldHMgbm9uZSBoZXJlIGVpdGhlcjogdGhpcyBkYXRhc2V0IG1pcnJvcnMgYSB3cml0ZXIsIGl0IGlzIG5vdCBhIGZvdXJ0aCBvbmUuXG4gKi9cbmNvbnN0IExPR0dFRF9TVU1NQVJZX1BSRUZJWDogUGFydGlhbDxSZWNvcmQ8RXZlbnRTcGVjWyd0eXBlJ10sIHN0cmluZz4+ID0ge1xuICBjYWxsOiAnJyxcbiAgbWVldGluZzogJ01lZXRpbmc6ICcsXG59O1xuXG5leHBvcnQgY29uc3QgbGVhZEludGVyYWN0aW9uUG9pbnRlcnMgPSB7XG4gIG9iamVjdDogJ3N5c19hY3Rpdml0eScsXG4gIG1vZGU6ICd1cHNlcnQnIGFzIGNvbnN0LFxuICAvLyBPbmUgdGltZWxpbmUgcG9pbnRlciBwZXIgcmljaCBzb3VyY2UgcmVjb3JkLCBleGFjdGx5IGFzIHRoZSBhY3Rpb24gd3JpdGVzXG4gIC8vIGl0LiBNYXRjaGVkIG9uIHRoZSBSRVNPTFZFRCBpZHMsIHNvIHJlcGxheSBib290cyBkZWR1cGUuXG4gIGV4dGVybmFsSWQ6IFsnc291cmNlX29iamVjdCcsICdzb3VyY2VfaWQnXSxcbiAgcmVjb3JkczogRVZFTlRfU1BFQ1MuZmlsdGVyKFxuICAgIChzcGVjKSA9PlxuICAgICAgc3BlYy5yZWxhdGVkVHlwZSA9PT0gJ2NybV9sZWFkJyAmJlxuICAgICAgc3BlYy5zdGF0dXMgPT09ICdoZWxkJyAmJlxuICAgICAgTE9HR0VEX1NVTU1BUllfUFJFRklYW3NwZWMudHlwZV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgc3BlYy5kYXlzQWdvID49IDAgJiZcbiAgICAgIHNwZWMuZGF5c0FnbyA8IFNZU19BQ1RJVklUWV9SRVRFTlRJT05fREFZUyxcbiAgKS5tYXAoKHNwZWMpID0+IHtcbiAgICBjb25zdCBbZW5kSG91ciwgZW5kTWludXRlXSA9IGVuZENsb2NrKHNwZWMpO1xuICAgIHJldHVybiB7XG4gICAgICAvLyBgaGVsZGAgaXMgd2hhdCBib3RoIGFjdGlvbnMgd3JpdGUgYXMgYGNvbXBsZXRlZGAgXHUyMDE0IHRoZSBgdGFza2AgZmVlZFxuICAgICAgLy8ga2luZCwgdGhlIG9uZSB0aGUgbGVhZCBBY3Rpdml0eSB0YWIgcmVuZGVycy5cbiAgICAgIHR5cGU6ICdjb21wbGV0ZWQnLFxuICAgICAgLy8gVGhlIGFjdGlvbidzIG93biBzdW1tYXJ5OiBwcmVmaXgsIHN1YmplY3QsIGR1cmF0aW9uIGluIGJyYWNrZXRzLlxuICAgICAgc3VtbWFyeTogYCR7TE9HR0VEX1NVTU1BUllfUFJFRklYW3NwZWMudHlwZV19JHtzcGVjLnN1YmplY3R9ICgke3NwZWMubWludXRlc30gbWluKWAsXG4gICAgICAvLyBMb2dnZWQgd2hlbiB0aGUgc2xvdCBlbmRlZC5cbiAgICAgIHRpbWVzdGFtcDogY2VsQ2xvY2soc3BlYy5kYXlzQWdvLCBlbmRIb3VyLCBlbmRNaW51dGUpLFxuICAgICAgb2JqZWN0X25hbWU6ICdjcm1fbGVhZCcsXG4gICAgICByZWNvcmRfaWQ6IHNwZWMucmVsYXRlZEtleSxcbiAgICAgIHNvdXJjZV9vYmplY3Q6ICdjcm1fZXZlbnQnLFxuICAgICAgc291cmNlX2lkOiBzcGVjLnN1YmplY3QsXG4gICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBraW5kOiBzcGVjLnR5cGUsXG4gICAgICAgIGR1cmF0aW9uX21pbnV0ZXM6IHNwZWMubWludXRlcyxcbiAgICAgICAgbm90ZXM6IHNwZWMub3V0Y29tZSA/PyAnJyxcbiAgICAgICAgYXR0ZW5kZWVfY291bnQ6IHNwZWMuYXR0ZW5kZWVzLmxlbmd0aCxcbiAgICAgIH0pLFxuICAgIH07XG4gIH0pLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGEvZm9yZWNhc3Quc2VlZC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGEvZm9yZWNhc3Quc2VlZC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBGb3JlY2FzdCBzZWVkcyBcdTIwMTQgdGhlIHF1YXJ0ZXJseSBhbmQgbW9udGhseSBzbmFwc2hvdCByb3dzLlxuICpcbiAqIGBjcm1fZm9yZWNhc3RgIGlzIGEgc2FsZXMgb2JqZWN0IChwbGFuIGl0ZW0gNDogdGhlIGN1c3RvbWVyIGNvcmUgYW5kIHRoZVxuICogYWN0aXZpdHkgb2JqZWN0cyBmb2xkIGludG8gdGhlIGFwcCBwYWNrYWdlKSwgc28gaXRzIHNlZWQgcm93cyBhcmUgc2FsZXMnIFx1MjAxNFxuICogdGhleSB3ZXJlIGF1dGhvcmVkIGluIGBzcmMvZGF0YS9yZXZlbnVlLnNlZWQudHNgIGJlY2F1c2UgYSBmb3JlY2FzdCBpcyBhXG4gKiByZXZlbnVlIE5VTUJFUiwgYnV0IHRoZSBhc3NpZ25tZW50IHJ1bGUgZm9sbG93cyB0aGUgb2JqZWN0LCBub3QgdGhlIHN1YmplY3QuXG4gKiBTZWVkIGRvY3RyaW5lIGxpdmVzIGluIGAuL19zaGFyZWQudHNgLlxuICovXG5pbXBvcnQgeyBkZWZpbmVTZWVkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgeyBGb3JlY2FzdCB9IGZyb20gJy4uL29iamVjdHMvZm9yZWNhc3Qub2JqZWN0JztcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEZvcmVjYXN0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIGBvd25lcl9pZGAgaXMgbGVmdCB1bnNldDogYSBzZWVkIGNhbm5vdCBuYW1lIGEgdXNlciBhbmQgc2VlZCB3cml0ZXMgcnVuXG4vLyBgaXNTeXN0ZW1gLCBzbyBub3RoaW5nIHN0YW1wcyBpdCBcdTIwMTQgb3duZXJzaGlwIGlzIGJhY2tmaWxsZWQgYnkgdGhlIHBsYXRmb3JtJ3Ncbi8vIHNlZWQtb3duZXJzaGlwIGNsYWltIHdoZW4gdGhlIHNlZWQgc2V0dGxlcywgd2hpY2ggY292ZXJzIGBjcm1fZm9yZWNhc3RgXG4vLyBhbG9uZ3NpZGUgZXZlcnkgb3RoZXIgb3duZXItc2NvcGVkIG9iamVjdCAoIzcwMiwgIzE4OTIpLiBTZWUgdGhlIG5vdGUgb25cbi8vIG93bmVyc2hpcCBpbiBgb2JqZWN0c3RhY2suY29tcG9zaXRpb24udHNgLlxuLy9cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBPTkUgUFJPRFVDRVIgUEVSIFdJTkRPVyAoIzcwMikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vL1xuLy8gYGZvcmVjYXN0X3NuYXBzaG90YCAoIzU5MCkgdXBzZXJ0cyB0aGUgcm93IHdob3NlIHdpbmRvdyBjb250YWlucyB0b2RheSwgYW5kXG4vLyBpdHMgbG9va3VwIGlzIE9XTkVSLVNDT1BFRDpcbi8vXG4vLyAgICAgeyBvd25lcl9pZDogJ3tjdXJyZW50T3duZXIuaWR9JywgcGVyaW9kOiAncXVhcnRlcicsXG4vLyAgICAgICBwZXJpb2Rfc3RhcnQ6IHsgJGx0ZTogJ3tUT0RBWSgpfScgfSwgcGVyaW9kX2VuZDogeyAkZ3RlOiAne1RPREFZKCl9JyB9IH1cbi8vXG4vLyBBIHNlZWRlZCByb3cgaW4gdGhhdCBzYW1lIHdpbmRvdyBjYW4gbmV2ZXIgc2F0aXNmeSB0aGF0IGZpbHRlciBhdCB0aGUgbW9tZW50XG4vLyB0aGUgc3dlZXAgcmVhZHMgaXQgXHUyMDE0IHRoZSBzZWVkIHdyaXRlcyBubyBvd25lciwgYW5kIHRoZSBjbGFpbSBpcyBhIHNlcGFyYXRlLFxuLy8gbGF0ZXIgc3dlZXAgXHUyMDE0IHNvIHRoZSBmbG93IGNvbmNsdWRlcyB0aGUgcGVyaW9kIGlzIG1pc3NpbmcgYW5kIG9wZW5zIGEgU0VDT05EXG4vLyByb3cgYmVzaWRlIGl0LiBCb3RoIHNwYW4gdGhlIHNhbWUgcXVhcnRlcjsgb25lIGhhcyBhbiBvd25lciBhbmQgb25lIGRvZXMgbm90LlxuLy8gRXZlcnkgb3duZXItZ3JvdXBlZCBjb25zdW1lciB0aGVuIHJlbmRlcnMgYSBwaGFudG9tLCBvd25lcmxlc3MgZHVwbGljYXRlIGZvclxuLy8gdGhlIGN1cnJlbnQgcXVhcnRlciwgb24gZXZlcnkgcmUtc2VlZGVkIGRldiBib290IChgcXVvdGFfYXR0YWlubWVudF9ieV9yZXBgXG4vLyBtb3N0IHZpc2libHksIHNpbmNlIGl0IHBpbnMgZXhhY3RseSB0aGF0IHdpbmRvdykuXG4vL1xuLy8gQ2xhaW1pbmcgdGhlIHJvdyBkb2VzIG5vdCBmaXggdGhhdCwgaXQgb25seSByZS1sYWJlbHMgdGhlIHBoYW50b206IHdoaWNoZXZlclxuLy8gb2YgdGhlIHR3byBzY2hlZHVsZWQgc3dlZXBzIHJlYWNoZXMgdGhlIHdpbmRvdyBmaXJzdCBkZWNpZGVzIHdoZXRoZXIgdGhlXG4vLyBzZWNvbmQgb25lIGFkb3B0cyB0aGUgcm93IG9yIGR1cGxpY2F0ZXMgaXQsIGFuZCBhIGR1cGxpY2F0ZSBuZXZlciBoZWFscy5cbi8vXG4vLyBTbyB0aGUgc2VlZHMgc3RvcCBhdCB0aGUgd2luZG93J3MgZWRnZS4gVGhleSBzaGlwIFNFVFRMRUQgcXVhcnRlcnMgb25seSwgcGx1c1xuLy8gdGhlIGN1cnJlbnQgTU9OVEggXHUyMDE0IGEgd2luZG93IG5vIHJ1bnRpbWUgd3JpdGVyIHRvdWNoZXMsIHNpbmNlIHRoZSBzd2VlcCdzXG4vLyBwZXJpb2QgaXMgZml4ZWQgdG8gYHF1YXJ0ZXJgLiBUaGUgY3VycmVudCBxdWFydGVyIGJlbG9uZ3MgdG9cbi8vIGBmb3JlY2FzdF9zbmFwc2hvdGAgYWxvbmUuIGB0ZXN0L2ZvcmVjYXN0LXNlZWRzLnRlc3QudHNgIGRlcml2ZXMgdGhlXG4vLyBmb3JiaWRkZW4gd2luZG93IGZyb20gdGhlIGZsb3cncyBvd24gbG9va3VwIGZpbHRlciBhbmQgZmFpbHMgb24gYW55IHNlZWRlZFxuLy8gcm93IHRoYXQgbGFuZHMgaW5zaWRlIGl0LlxuLy9cbi8vIFRoZSBjb3N0LCBzdGF0ZWQgcmF0aGVyIHRoYW4gaGlkZGVuOiBvbiBhIGZyZXNobHkgc2VlZGVkIG9yZyB0aGUgU2FsZXNcbi8vIGRhc2hib2FyZCdzICpRdW90YSBBdHRhaW5tZW50IGJ5IFJlcCogdGFibGUgaXMgZW1wdHkgdW50aWwgdGhlIDAzOjAwIHN3ZWVwXG4vLyBvcGVucyB0aGUgcXVhcnRlcidzIHJvd3MsIGFuZCB0aGVpciBgcXVvdGFgIHN0YXlzIGJsYW5rIHVudGlsIHNvbWVvbmUgc2V0c1xuLy8gb25lIGJ5IGhhbmQgKGBxdW90YWAgaGFzIG5vIGF1dG9tYXRlZCB3cml0ZXIgXHUyMDE0IHNlZSBgZm9yZWNhc3Qub2JqZWN0LnRzYCkuXG4vLyBUaGF0IGlzIHRoZSBzYW1lIGhvbmVzdC1lbXB0eSBzdGF0ZSB0aGUgd2lkZ2V0IGFscmVhZHkgY2hvb3NlcyBhdCBhIHF1YXJ0ZXJcbi8vIGJvdW5kYXJ5OyB0aGUgYWx0ZXJuYXRpdmUgd2FzIGEgcm93IGF0dHJpYnV0ZWQgdG8gbm9ib2R5LCBjYXJyeWluZyBhIHF1b3RhIG5vXG4vLyByZXAgaXMgb24gdGhlIGhvb2sgZm9yLlxuLy9cbi8vIFBlcmlvZHMgYXJlIFJFQUwgY2FsZW5kYXIgcGVyaW9kcywgbGFiZWxsZWQgZXhhY3RseSB0aGUgd2F5XG4vLyBmb3JlY2FzdC5ob29rLnRzIGRlcml2ZXMgdGhlbSAoJ1EzIDIwMjYnIC8gJ0F1ZyAyMDI2JykgXHUyMDE0IGhvb2tzIGRvbid0IHJ1blxuLy8gb3ZlciBzZWVkcywgYW5kIHRoZSBob29rIG9ubHkgZmlsbHMgYSBCTEFOSyBwZXJpb2RfbGFiZWwsIHNvIHNlZWRlZCByb3dzXG4vLyBtdXN0IHNwZWFrIHRoZSBzYW1lIGRpYWxlY3QgYXMgcnVudGltZSBzbmFwc2hvdHMgb3IgbGlzdCB2aWV3cyBlbmQgdXBcbi8vIG1peGluZyAnVGhpcyBRdWFydGVyJyB3aXRoICdRMyAyMDI2JyAoIzQ5MCkuIENhbGVuZGFyLXRydWUgYHBlcmlvZF9zdGFydGBcbi8vIHZhbHVlcyBjYXJyeSB0aGUgc2FtZSBvYmxpZ2F0aW9uIG9uIHRoZSBRVUVSWSBzaWRlOiBgcGVyaW9kX3N0YXJ0YCBpcyBvbmVcbi8vIGhhbGYgb2YgdGhlIChvd25lciwgcGVyaW9kLCBwZXJpb2Rfc3RhcnQpIGtleSB0aGUgc25hcHNob3Qgc3dlZXAgdXBzZXJ0cyBvbixcbi8vIHRoZSBvYmplY3QgaW5kZXhlcywgYW5kIGV2ZXJ5IHBlcmlvZC1zY29wZWQgc3VyZmFjZSBwaW5zIGJ5IGVxdWFsaXR5IFx1MjAxNCBhXG4vLyB2YWx1ZSB0aGF0IGlzIG5vdCB0aGUgcGVyaW9kJ3MgcmVhbCBmaXJzdCBkYXkgbmFtZXMgYSByb3cgbm8gc3VjaCBmaWx0ZXIgY2FuXG4vLyBldmVyIHNlbGVjdCwgYW5kIG5vIHJvbGx1cCBjYW4gbGluZSB1cCBhZ2FpbnN0IGl0cyBuZWlnaGJvdXJzLlxuLy9cbi8vIFdoYXQgdGhlc2Ugcm93cyBtdXN0IE5PVCBkbyBpcyBhbnN3ZXIgYSBDVVJSRU5ULXF1YXJ0ZXIgZmlsdGVyOiBwZXIgIzcwMiB0aGF0XG4vLyB3aW5kb3cgYmVsb25ncyB0byBgZm9yZWNhc3Rfc25hcHNob3RgIGFsb25lLCBzbyB0aGUgc2VlZHMgYmVsb3cgc2hpcCBzZXR0bGVkXG4vLyBxdWFydGVycyBwbHVzIHRoZSBjdXJyZW50IG1vbnRoLCBhbmQgYHRoaXNfcXVhcnRlcl9mb3JlY2FzdHNgIC9cbi8vIGBxdW90YV9hdHRhaW5tZW50X2J5X3JlcGAgY29ycmVjdGx5IHJldHVybiBub25lIG9mIHRoZW0uXG4vL1xuLy8gKFRoZSBzZW50ZW5jZSB0aGF0IHN0b29kIGhlcmUgc2FpZCB0aGUgb3Bwb3NpdGUgXHUyMDE0IHRoYXQgdGhlc2UgdmFsdWVzIG1ha2UgdGhlXG4vLyBgdGhpc19xdWFydGVyX2ZvcmVjYXN0c2AgdmlldydzIGB7dGhpc19xdWFydGVyX3N0YXJ0fWAgZmlsdGVyIFwibWF0Y2ggdGhlXG4vLyBzZWVkZWQgcm93XCIuIENvcnJlY3RlZCBpbiAjNzQ0LCBhbmQgaXQgd2FzIHdyb25nIHRocmVlIHdheXM6XG4vLyBge3RoaXNfcXVhcnRlcl9zdGFydH1gIGlzIG5vdCBpbiB0aGUgdG9rZW4gdm9jYWJ1bGFyeSBcdTIwMTQgdGhlIHNwZWxsaW5nIGlzXG4vLyBge2N1cnJlbnRfcXVhcnRlcl9zdGFydH1gLCBhbmQgc2luY2UgMTcuMC4wLXJjLjAgdGhlIG1pc3NwZWxsaW5nIHRocm93c1xuLy8gYFVucmVzb2x2YWJsZSBmaWx0ZXIgcGxhY2Vob2xkZXJgIGluc3RlYWQgb2Ygc2lsZW50bHkgbWF0Y2hpbmcgbm90aGluZzsgdGhlXG4vLyBmaWx0ZXIgaXRzZWxmIHdhcyByZW1vdmVkIGZyb20gdGhlIHZpZXcgaW4gIzUxNSBhbmQgb25seSBjYW1lIGJhY2sgaW4gIzczMDtcbi8vIGFuZCBtYXRjaGluZyBpcyB0aGUgb3V0Y29tZSAjNzAyIHJ1bGVzIG91dC4pXG4vL1xuLy8gQ29tcHV0ZWQgaW4gcGxhaW4gVFMgKFVUQywgbWlycm9yaW5nIHRoZSBob29rJ3MgaGVscGVycyk6IHRoaXMgbW9kdWxlIGlzXG4vLyBldmFsdWF0ZWQgd2hlbiB0aGUgYXBwIGJ1bmRsZSBsb2FkcywgdGhlIHNhbWUgbW9tZW50IHRoZSBjZWxgLi4uYCBzZWVkc1xuLy8gYXJlIHJlc29sdmVkLlxuY29uc3QgRk9SRUNBU1RfTU9OVEhTID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuY29uc3QgZm9yZWNhc3RJc29EYXRlID0gKGQ6IERhdGUpID0+XG4gIGAke2QuZ2V0VVRDRnVsbFllYXIoKX0tJHtTdHJpbmcoZC5nZXRVVENNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKX0tJHtTdHJpbmcoZC5nZXRVVENEYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbmNvbnN0IGZvcmVjYXN0UXVhcnRlckxhYmVsID0gKGQ6IERhdGUpID0+IGBRJHtNYXRoLmZsb29yKGQuZ2V0VVRDTW9udGgoKSAvIDMpICsgMX0gJHtkLmdldFVUQ0Z1bGxZZWFyKCl9YDtcbmNvbnN0IGZvcmVjYXN0TW9udGhMYWJlbCA9IChkOiBEYXRlKSA9PiBgJHtGT1JFQ0FTVF9NT05USFNbZC5nZXRVVENNb250aCgpXX0gJHtkLmdldFVUQ0Z1bGxZZWFyKCl9YDtcbmNvbnN0IGZvcmVjYXN0Tm93ID0gbmV3IERhdGUoKTtcbmNvbnN0IGZvcmVjYXN0WWVhciA9IGZvcmVjYXN0Tm93LmdldFVUQ0Z1bGxZZWFyKCk7XG5jb25zdCBmb3JlY2FzdE1vbnRoID0gZm9yZWNhc3ROb3cuZ2V0VVRDTW9udGgoKTtcbmNvbnN0IGZvcmVjYXN0UXVhcnRlck1vbnRoID0gTWF0aC5mbG9vcihmb3JlY2FzdE1vbnRoIC8gMykgKiAzO1xuLy8gTm8gYHRoaXNRdWFydGVyU3RhcnRgIC8gYHRoaXNRdWFydGVyRW5kYDogdGhhdCB3aW5kb3cgaXMgYGZvcmVjYXN0X3NuYXBzaG90YCdzXG4vLyBhbmQgbm90aGluZyBoZXJlIG1heSBvcGVuIGEgcm93IGluIGl0ICgjNzAyLCBub3RlIGFib3ZlKS5cbmNvbnN0IHRoaXNNb250aFN0YXJ0ID0gbmV3IERhdGUoRGF0ZS5VVEMoZm9yZWNhc3RZZWFyLCBmb3JlY2FzdE1vbnRoLCAxKSk7XG5jb25zdCB0aGlzTW9udGhFbmQgPSBuZXcgRGF0ZShEYXRlLlVUQyhmb3JlY2FzdFllYXIsIGZvcmVjYXN0TW9udGggKyAxLCAwKSk7XG5jb25zdCBsYXN0UXVhcnRlclN0YXJ0ID0gbmV3IERhdGUoRGF0ZS5VVEMoZm9yZWNhc3RZZWFyLCBmb3JlY2FzdFF1YXJ0ZXJNb250aCAtIDMsIDEpKTtcbmNvbnN0IGxhc3RRdWFydGVyRW5kID0gbmV3IERhdGUoRGF0ZS5VVEMoZm9yZWNhc3RZZWFyLCBmb3JlY2FzdFF1YXJ0ZXJNb250aCwgMCkpO1xuLy8gRGVlcGVyIGhpc3Rvcnk6IHF1b3RhLWF0dGFpbm1lbnQgYW5kIGNvdmVyYWdlIHRyZW5kcyBuZWVkIG1vcmUgdGhhbiBhIHNpbmdsZVxuLy8gcHJpb3IgcGVyaW9kIHRvIHBsb3QgKCM1OTEpLiBUaGVzZSBhcmUgYWxsIFNFVFRMRUQgcGVyaW9kcyBcdTIwMTQgZGVsaWJlcmF0ZWx5IHNvOlxuLy8gdGhlIGZvcmVjYXN0IHNuYXBzaG90IHN3ZWVwIHVwc2VydHMgdGhlIENVUlJFTlQgcXVhcnRlciwgc28gaGlzdG9yaWNhbCByb3dzXG4vLyBjYW4gbmV2ZXIgY29sbGlkZSB3aXRoIHdoYXQgaXQgd3JpdGVzLiBUaGF0IHJ1bGUgaXMgbm93IHRoZSB3aG9sZSBydWxlIGZvclxuLy8gcXVhcnRlcnMgKCM3MDIpOiBldmVyeSBxdWFydGVybHkgc2VlZCBiZWxvdyBpcyBzZXR0bGVkLlxuY29uc3QgcXVhcnRlclN0YXJ0QWdvID0gKG46IG51bWJlcikgPT4gbmV3IERhdGUoRGF0ZS5VVEMoZm9yZWNhc3RZZWFyLCBmb3JlY2FzdFF1YXJ0ZXJNb250aCAtIDMgKiBuLCAxKSk7XG5jb25zdCBxdWFydGVyRW5kQWdvID0gKG46IG51bWJlcikgPT4gbmV3IERhdGUoRGF0ZS5VVEMoZm9yZWNhc3RZZWFyLCBmb3JlY2FzdFF1YXJ0ZXJNb250aCAtIDMgKiAobiAtIDEpLCAwKSk7XG5jb25zdCBtb250aFN0YXJ0QWdvID0gKG46IG51bWJlcikgPT4gbmV3IERhdGUoRGF0ZS5VVEMoZm9yZWNhc3RZZWFyLCBmb3JlY2FzdE1vbnRoIC0gbiwgMSkpO1xuY29uc3QgbW9udGhFbmRBZ28gPSAobjogbnVtYmVyKSA9PiBuZXcgRGF0ZShEYXRlLlVUQyhmb3JlY2FzdFllYXIsIGZvcmVjYXN0TW9udGggLSBuICsgMSwgMCkpO1xuXG4vKipcbiAqIFRoZSB0aHJlZSBvcGVuLXBpcGVsaW5lIGJ1Y2tldHMgb2YgYSBzZXR0bGVkIHNuYXBzaG90LCBpbiB0aGUgc2hhcGUgdGhlXG4gKiBmb3JlY2FzdCBvYmplY3QgZGVmaW5lcyB0aGVtIChgc3JjL3NhbGVzL29iamVjdHMvZm9yZWNhc3Qub2JqZWN0LnRzYCkuXG4gKlxuICogVGhlIGJ1Y2tldHMgYXJlIENVTVVMQVRJVkUgc3Vic2V0cyBvZiBvbmUgYW5vdGhlciwgc28gZXZlcnkgcm93IHNhdGlzZmllc1xuICogYHBpcGVsaW5lID49IGJlc3RDYXNlID49IGNvbW1pdGAuIE5hbWVkIHJhdGhlciB0aGFuIHBvc2l0aW9uYWw6IHRocmVlIGJhcmVcbiAqIG51bWJlcnMgaW4gYSByb3cgb2YgZWlnaHQgYXJndW1lbnRzIGlzIHRoZSBzaGFwZSBhIGxhdGVyIGVkaXQgdHJhbnNwb3Nlc1xuICogd2l0aG91dCBhbnl0aGluZyBub3RpY2luZy5cbiAqL1xudHlwZSBPcGVuQnVja2V0cyA9IHsgcGlwZWxpbmU6IG51bWJlcjsgYmVzdENhc2U6IG51bWJlcjsgY29tbWl0OiBudW1iZXIgfTtcblxuLyoqXG4gKiBBIHNldHRsZWQgKHBhc3QpIHBlcmlvZCBzbmFwc2hvdCwgY2FwdHVyZWQgb24gdGhlIGRheSB0aGUgcGVyaW9kIGNsb3NlZC5cbiAqXG4gKiBgb3BlbmAgaXMgd2hhdCB3YXMgc3RpbGwgT1BFTiBpbiB0aGUgcGVyaW9kIGF0IHRoYXQgbW9tZW50IFx1MjAxNCB0aGUgZGVhbHMgdGhhdFxuICogaGFkIG5vdCByZXNvbHZlZCBieSB0aGUgbGFzdCBkYXkgYW5kIHdlbnQgb24gdG8gc2xpcCBpbnRvIHRoZSBuZXh0IHBlcmlvZC5cbiAqXG4gKiBUaGVzZSByb3dzIGNhcnJpZWQgYDBgIGZvciBhbGwgdGhyZWUgYnVja2V0cyB1bnRpbCAjMTI0NC4gVGhlIHRoZW9yeSB3YXNcbiAqIFwiYSBjbG9zZWQgcGVyaW9kIGhhcyBubyBwaXBlbGluZSBsZWZ0XCIsIGFuZCBpdCBpcyB0aGUgb25lIHJlYWRpbmcgYVxuICogcGVyaW9kLUVORCBzbmFwc2hvdCBjYW5ub3QgaGF2ZTogYSBwZXJpb2QgZW5kcyB3aXRoIGRlYWxzIHN0aWxsIG9wZW4sIHdoaWNoXG4gKiBpcyBleGFjdGx5IHdoYXQgdGhlIFwic2xpcHBlZCBpbnRvIHRoZSBuZXh0IHF1YXJ0ZXJcIiBub3RlIGJlbG93IGRlc2NyaWJlcy5cbiAqIFRoZSBjb3N0IHdhcyBub3QgY29zbWV0aWMgXHUyMDE0IGBwaXBlbGluZV9hbW91bnRgLCBgYmVzdF9jYXNlX2Ftb3VudGAsXG4gKiBgY29tbWl0X2Ftb3VudGAgYW5kIHRoZSBgY292ZXJhZ2VfcmF0aW9gIGZvcm11bGEgdGhhdCBkaXZpZGVzIGJ5IHRoZSBmaXJzdFxuICogb2YgdGhlbSBhcmUgZm91ciBvZiB0aGUgdGhpcnRlZW4gY29sdW1ucyB0aGUgZm9yZWNhc3QgbGlzdCByZW5kZXJzLCBzbyB0aGVcbiAqIG1vZHVsZSBvcGVuZWQgb24gc2l4IHJvd3Mgb2YgemVyb3MgYW5kIGNvdWxkIG5vdCBhbnN3ZXIgdGhlIHF1ZXN0aW9uIHRoZVxuICogb2JqZWN0IGV4aXN0cyBmb3IuXG4gKlxuICogTk9UIGEgbGljZW5jZSB0byBzZWVkIHRoZSBDVVJSRU5UIHF1YXJ0ZXI6IHRoYXQgd2luZG93IGhhcyBleGFjdGx5IG9uZVxuICogcHJvZHVjZXIsIGBmb3JlY2FzdF9zbmFwc2hvdGAgKCM3MDIpLCBhbmQgdGhlIG5vdGUgYWJvdmUgaXMgdGhlIHdob2xlIHJ1bGUuXG4gKiBQaW5uZWQgYnkgYHRlc3QvZm9yZWNhc3Qtc2VlZHMudGVzdC50c2AuXG4gKi9cbmNvbnN0IGNsb3NlZFBlcmlvZCA9IChcbiAgc2VlZF9rZXk6IHN0cmluZyxcbiAgcGVyaW9kOiAnbW9udGgnIHwgJ3F1YXJ0ZXInLFxuICBzdGFydDogRGF0ZSxcbiAgZW5kOiBEYXRlLFxuICBxdW90YTogbnVtYmVyLFxuICBjbG9zZWQ6IG51bWJlcixcbiAgb3BlbjogT3BlbkJ1Y2tldHMsXG4gIG5vdGVzOiBzdHJpbmcsXG4pID0+ICh7XG4gIHNlZWRfa2V5LFxuICBwZXJpb2QsXG4gIHBlcmlvZF9sYWJlbDogcGVyaW9kID09PSAncXVhcnRlcicgPyBmb3JlY2FzdFF1YXJ0ZXJMYWJlbChzdGFydCkgOiBmb3JlY2FzdE1vbnRoTGFiZWwoc3RhcnQpLFxuICBwZXJpb2Rfc3RhcnQ6IGZvcmVjYXN0SXNvRGF0ZShzdGFydCksXG4gIHBlcmlvZF9lbmQ6IGZvcmVjYXN0SXNvRGF0ZShlbmQpLFxuICBzbmFwc2hvdF9kYXRlOiBmb3JlY2FzdElzb0RhdGUoZW5kKSxcbiAgcXVvdGEsXG4gIHBpcGVsaW5lX2Ftb3VudDogb3Blbi5waXBlbGluZSxcbiAgYmVzdF9jYXNlX2Ftb3VudDogb3Blbi5iZXN0Q2FzZSxcbiAgY29tbWl0X2Ftb3VudDogb3Blbi5jb21taXQsXG4gIGNsb3NlZF9hbW91bnQ6IGNsb3NlZCxcbiAgc291cmNlOiAnc2NoZWR1bGVkJyBhcyBjb25zdCxcbiAgbm90ZXMsXG59KTtcblxuLy8gVXBzZXJ0IGlkZW50aXR5IGlzIHRoZSBzeW50aGV0aWMgYHNlZWRfa2V5YCwgTk9UIGBwZXJpb2RfbGFiZWxgICgjNjEzKS5cbi8vIGBwZXJpb2RfbGFiZWxgIG5hbWVzIGEgU0VUIG9mIHJvd3Mgb25jZSB0aGUgZm9yZWNhc3Rfc25hcHNob3Qgc3dlZXAgKCM1OTApXG4vLyB3cml0ZXMgb25lIHBlciBhY3RpdmUgb3duZXIgcGVyIHF1YXJ0ZXIgXHUyMDE0IGFsbCByZWFkaW5nICdRMyAyMDI2JyBcdTIwMTQgYW5kIHRoZVxuLy8gbG9hZGVyIG1hdGNoZXMgYWdhaW5zdCB0aGUgd2hvbGUgdGFibGUsIHNvIGEgcmUtc2VlZCBjb3VsZCBvdmVyd3JpdGUgYSByZWFsXG4vLyByZXAncyBzbmFwc2hvdCB3aXRoIHRoZSBkZW1vIG51bWJlcnMuIFdoeSBhIHN5bnRoZXRpYyBrZXkgYW5kIG5vdCB0aGUgdHJ1ZVxuLy8gKG93bmVyLCBwZXJpb2QsIHBlcmlvZF9zdGFydCkgaWRlbnRpdHkgb3IgYW4gaW5zZXJ0LW9uY2UgbW9kZTogc2VlIHRoZVxuLy8gYHNlZWRfa2V5YCBkZWNsYXJhdGlvbiBpbiBgc3JjL3NhbGVzL29iamVjdHMvZm9yZWNhc3Qub2JqZWN0LnRzYC5cbi8vXG4vLyBUaGUga2V5cyBhcmUgUE9TSVRJT05BTCAoJ2N1cnJlbnQgbW9udGgnLCAndHdvIHF1YXJ0ZXJzIGJhY2snKSwgbm90IGNhbGVuZGFyXG4vLyB2YWx1ZXMsIGJlY2F1c2UgdGhlIHJlY29yZHMgYXJlIHBvc2l0aW9uYWwgXHUyMDE0IHJlY29tcHV0ZWQgYWdhaW5zdCBgbmV3IERhdGUoKWBcbi8vIG9uIGV2ZXJ5IGltcG9ydC4gQSBwb3NpdGlvbmFsIGtleSBrZWVwcyB0aGUgZGVtbyBhdCBleGFjdGx5IHRoZXNlIHNldmVuIHJvd3Ncbi8vIGFzIHRoZSBjYWxlbmRhciByb2xscyBmb3J3YXJkLCByZS1wb2ludGluZyBlYWNoIGF0IGl0cyBuZXcgcGVyaW9kOyBhXG4vLyBjYWxlbmRhci1kZXJpdmVkIGtleSB3b3VsZCBzdHJhbmQgbGFzdCBxdWFydGVyJ3MgZGVtbyByb3cgYW5kIGFkZCBvbmUgcm93IHBlclxuLy8gcmUtc2VlZC5cbi8vXG4vLyBUaGVyZSBpcyBubyBgZGVtb19xdWFydGVyX2N1cnJlbnRgOiB0aGUgY3VycmVudCBxdWFydGVyIGlzIHRoZSBvbmUgd2luZG93XG4vLyBgZm9yZWNhc3Rfc25hcHNob3RgIHdyaXRlcywgYW5kIHR3byBwcm9kdWNlcnMgaW4gb25lIHdpbmRvdyBpcyB3aGF0ICM3MDIgd2FzLlxuLy8gVGhlIGN1cnJlbnQgTU9OVEggc3RheXMgXHUyMDE0IHRoZSBzd2VlcCdzIHBlcmlvZCBpcyBgcXVhcnRlcmAsIHNvIG5vIHJ1bnRpbWVcbi8vIHdyaXRlciBvcGVucyBhIG1vbnRobHkgcm93LlxuZXhwb3J0IGNvbnN0IGZvcmVjYXN0cyA9IGRlZmluZVNlZWQoRm9yZWNhc3QsIHtcbiAgbW9kZTogJ3Vwc2VydCcsXG4gIGV4dGVybmFsSWQ6ICdzZWVkX2tleScsXG4gIHJlY29yZHM6IFtcbiAgICB7XG4gICAgICBzZWVkX2tleTogJ2RlbW9fbW9udGhfY3VycmVudCcsXG4gICAgICBwZXJpb2Q6ICdtb250aCcsXG4gICAgICBwZXJpb2RfbGFiZWw6IGZvcmVjYXN0TW9udGhMYWJlbCh0aGlzTW9udGhTdGFydCksXG4gICAgICBwZXJpb2Rfc3RhcnQ6IGZvcmVjYXN0SXNvRGF0ZSh0aGlzTW9udGhTdGFydCksXG4gICAgICBwZXJpb2RfZW5kOiBmb3JlY2FzdElzb0RhdGUodGhpc01vbnRoRW5kKSxcbiAgICAgIHNuYXBzaG90X2RhdGU6IGNlbGB0b2RheSgpYCxcbiAgICAgIHF1b3RhOiA1MDAwMDAsXG4gICAgICBwaXBlbGluZV9hbW91bnQ6IDc2MDAwMCxcbiAgICAgIGJlc3RfY2FzZV9hbW91bnQ6IDU0MDAwMCxcbiAgICAgIGNvbW1pdF9hbW91bnQ6IDM2MDAwMCxcbiAgICAgIGNsb3NlZF9hbW91bnQ6IDI5NTAwMCxcbiAgICAgIHNvdXJjZTogJ3NjaGVkdWxlZCcsXG4gICAgICBub3RlczogJ0hlYWx0aHkgY292ZXJhZ2U7IHR3byBjb21taXQgZGVhbHMgZXhwZWN0ZWQgdG8gY2xvc2UgdGhpcyB3ZWVrLicsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZWVkX2tleTogJ2RlbW9fcXVhcnRlcl9taW51c18xJyxcbiAgICAgIHBlcmlvZDogJ3F1YXJ0ZXInLFxuICAgICAgcGVyaW9kX2xhYmVsOiBmb3JlY2FzdFF1YXJ0ZXJMYWJlbChsYXN0UXVhcnRlclN0YXJ0KSxcbiAgICAgIHBlcmlvZF9zdGFydDogZm9yZWNhc3RJc29EYXRlKGxhc3RRdWFydGVyU3RhcnQpLFxuICAgICAgcGVyaW9kX2VuZDogZm9yZWNhc3RJc29EYXRlKGxhc3RRdWFydGVyRW5kKSxcbiAgICAgIHNuYXBzaG90X2RhdGU6IGZvcmVjYXN0SXNvRGF0ZShsYXN0UXVhcnRlckVuZCksXG4gICAgICBxdW90YTogMTQwMDAwMCxcbiAgICAgIHBpcGVsaW5lX2Ftb3VudDogMjQwMDAwLFxuICAgICAgYmVzdF9jYXNlX2Ftb3VudDogMTUwMDAwLFxuICAgICAgY29tbWl0X2Ftb3VudDogOTUwMDAsXG4gICAgICBjbG9zZWRfYW1vdW50OiAxNDg1MDAwLFxuICAgICAgc291cmNlOiAnc2NoZWR1bGVkJyxcbiAgICAgIG5vdGVzOiAnQ2xvc2VkIGF0IDEwNiUgb2YgcXVvdGEuJyxcbiAgICB9LFxuICAgIGNsb3NlZFBlcmlvZCgnZGVtb19xdWFydGVyX21pbnVzXzInLCAncXVhcnRlcicsIHF1YXJ0ZXJTdGFydEFnbygyKSwgcXVhcnRlckVuZEFnbygyKSwgMTMwMDAwMCwgMTE5NjAwMCxcbiAgICAgIHsgcGlwZWxpbmU6IDI4NTAwMCwgYmVzdENhc2U6IDE5MDAwMCwgY29tbWl0OiAxMjAwMDAgfSxcbiAgICAgICdDbG9zZWQgYXQgOTIlIG9mIHF1b3RhIFx1MjAxNCB0d28gZW50ZXJwcmlzZSBkZWFscyBzbGlwcGVkIGludG8gdGhlIG5leHQgcXVhcnRlci4nKSxcbiAgICBjbG9zZWRQZXJpb2QoJ2RlbW9fcXVhcnRlcl9taW51c18zJywgJ3F1YXJ0ZXInLCBxdWFydGVyU3RhcnRBZ28oMyksIHF1YXJ0ZXJFbmRBZ28oMyksIDEyMDAwMDAsIDEzMDgwMDAsXG4gICAgICB7IHBpcGVsaW5lOiAxOTUwMDAsIGJlc3RDYXNlOiAxMzAwMDAsIGNvbW1pdDogODUwMDAgfSxcbiAgICAgICdDbG9zZWQgYXQgMTA5JSBvZiBxdW90YSwgY2FycmllZCBieSB0aGUgZW50ZXJwcmlzZSByZW5ld2FsIGNvaG9ydC4nKSxcbiAgICBjbG9zZWRQZXJpb2QoJ2RlbW9fcXVhcnRlcl9taW51c180JywgJ3F1YXJ0ZXInLCBxdWFydGVyU3RhcnRBZ28oNCksIHF1YXJ0ZXJFbmRBZ28oNCksIDExMDAwMDAsIDEwNDUwMDAsXG4gICAgICB7IHBpcGVsaW5lOiAxNjUwMDAsIGJlc3RDYXNlOiAxMTAwMDAsIGNvbW1pdDogNzAwMDAgfSxcbiAgICAgICdDbG9zZWQgYXQgOTUlIG9mIHF1b3RhIGluIHRoZSBmaXJzdCBxdWFydGVyIG9uIHRoZSBuZXcgdGVycml0b3J5IG1vZGVsLicpLFxuICAgIGNsb3NlZFBlcmlvZCgnZGVtb19tb250aF9taW51c18xJywgJ21vbnRoJywgbW9udGhTdGFydEFnbygxKSwgbW9udGhFbmRBZ28oMSksIDQ4MDAwMCwgNTA1MDAwLFxuICAgICAgeyBwaXBlbGluZTogOTYwMDAsIGJlc3RDYXNlOiA2MjAwMCwgY29tbWl0OiA0MDAwMCB9LFxuICAgICAgJ0Nsb3NlZCBhdCAxMDUlIG9mIHF1b3RhOyB0aGUgZXhwYW5zaW9uIG1vdGlvbiBjb3ZlcmVkIGEgc29mdCBuZXctYnVzaW5lc3MgbW9udGguJyksXG4gICAgY2xvc2VkUGVyaW9kKCdkZW1vX21vbnRoX21pbnVzXzInLCAnbW9udGgnLCBtb250aFN0YXJ0QWdvKDIpLCBtb250aEVuZEFnbygyKSwgNDYwMDAwLCA0MTQwMDAsXG4gICAgICB7IHBpcGVsaW5lOiA5MjAwMCwgYmVzdENhc2U6IDU4MDAwLCBjb21taXQ6IDM1MDAwIH0sXG4gICAgICAnQ2xvc2VkIGF0IDkwJSBvZiBxdW90YSBcdTIwMTQgc3VtbWVyIHNsb3dkb3duIGFjcm9zcyB0aGUgbWlkLW1hcmtldCBzZWdtZW50LicpLFxuICBdXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGEvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YVwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhL2luZGV4LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFNhbGVzIHNlZWQgZGF0YSwgYW5kIHRoZSBjb21wb3NpdGlvbiBrbm9iIGV2ZXJ5IHBhY2thZ2UncyByb3dzIGFyZSBzZWxlY3RlZFxuICogYnkuXG4gKlxuICogVGhlIHJvd3MgdGhlbXNlbHZlcyBhcmUgYXV0aG9yZWQgcGVyIG9iamVjdCBmYW1pbHkgaW4gdGhlIGAqLnNlZWQudHNgXG4gKiBtb2R1bGVzIGJlc2lkZSB0aGlzIGZpbGU7IGBvYmplY3RzdGFjay5jb21wb3NpdGlvbi50c2AgY29sbGVjdHMgYWxsIGZvdXJcbiAqIGRpcmVjdG9yaWVzJyBmYW1pbGllcyBpbnRvIHRoZSBzaW5nbGUgb3JkZXJlZCBgQ3JtU2VlZERhdGFgIHVuaW9uIGFuZCBjdXRzIGl0XG4gKiBieSBvd25pbmcgcGFja2FnZSBcdTIwMTQgZWFjaCBwYWNrYWdlIHN0YWNrIHJlZ2lzdGVycyB0aGUgZmFtaWxpZXMgd2hvc2Ugb2JqZWN0XG4gKiBpdCBvd25zLlxuICogVGhhdCBhc3NlbWJseSBpcyBOT1QgaGVyZSwgYW5kIGNhbm5vdCBiZTogaXQgbmFtZXMgYGNybV9wcm9kdWN0YCxcbiAqIGBjcm1fY2FzZWAsIGBjcm1fY2FtcGFpZ25gIGFuZCB0aGUgcmVzdCwgd2hpY2ggYXJlIG90aGVyIHBhY2thZ2VzJyBvYmplY3RzLFxuICogYW5kIGEgc2FsZXMgZmlsZSBtYXkgaW1wb3J0IGZyb20gaXRzIG93biBkaXJlY3Rvcnkgb3IgZnJvbSBgc3JjL3NhbGVzL2Agb25seVxuICogKHBsYW4gaXRlbSA3KS4gVGhlIE9SREVSIGl0IGFzc2VtYmxlcyBpbiBpcyBsb2FkLWJlYXJpbmcgXHUyMDE0IHJvd3MgcmVmZXJlbmNlXG4gKiByb3dzIHNlZWRlZCBlYXJsaWVyIFx1MjAxNCBzbyBpdCBsaXZlcyBpbiB0aGUgb25lIGZpbGUgdGhhdCBjYW4gc2VlIGFsbCBmb3VyLlxuICpcbiAqIFdoZXJlIHRvIGFkZCBhIHJvdyBmb2xsb3dzIGZyb20gdGhlIG9iamVjdDpcbiAqXG4gKiAgIC0gYF9zaGFyZWQudHNgICAgICAgICBzZWVkIGRvY3RyaW5lICsgaGVscGVycyBldmVyeSBwYWNrYWdlJ3Mgcm93cyB1c2VcbiAqICAgLSBgc2FsZXMuc2VlZC50c2AgICAgIGFjY291bnRzLCBjb250YWN0cywgbGVhZHMsIG9wcG9ydHVuaXRpZXNcbiAqICAgLSBgYWN0aXZpdHkuc2VlZC50c2AgIHRhc2tzLCBldmVudHMsIGV2ZW50IGF0dGVuZGVlc1xuICogICAtIGBmb3JlY2FzdC5zZWVkLnRzYCAgZm9yZWNhc3Qgc25hcHNob3RzXG4gKiAgIC0gYHNyYy9yZXZlbnVlL2RhdGEvYCBwcm9kdWN0cywgb3Bwb3J0dW5pdHkgbGluZXMsIGNvbnRyYWN0cywgcXVvdGVzLCBxdW90ZSBsaW5lc1xuICogICAtIGBzcmMvc2VydmljZS9kYXRhL2AgY2FzZXMsIGtub3dsZWRnZSBhcnRpY2xlc1xuICogICAtIGBzcmMvbWFya2V0aW5nL2RhdGEvYCBjYW1wYWlnbnMsIGNhbXBhaWduIG1lbWJlcnNcbiAqL1xuZXhwb3J0IHsgYWNjb3VudHMsIGNvbnRhY3RzLCBsZWFkcywgb3Bwb3J0dW5pdGllcywgT1BQT1JUVU5JVFlfTElORVMgfSBmcm9tICcuL3NhbGVzLnNlZWQnO1xuZXhwb3J0IHsgdGFza3MsIGV2ZW50cywgZXZlbnRBdHRlbmRlZXNGcm9tQ29udGFjdHMsIGV2ZW50QXR0ZW5kZWVzRnJvbUxlYWRzLCBsZWFkSW50ZXJhY3Rpb25Qb2ludGVycyB9IGZyb20gJy4vYWN0aXZpdHkuc2VlZCc7XG5leHBvcnQgeyBmb3JlY2FzdHMgfSBmcm9tICcuL2ZvcmVjYXN0LnNlZWQnO1xuZXhwb3J0IHsgY2VsRGF5c0FnbywgY2VsRGF5c0Zyb21Ob3csIGxpbmVUb3RhbCwgbGluZXNUb3RhbCwgdHlwZSBMaW5lU3BlYyB9IGZyb20gJy4vX3NoYXJlZCc7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCB0aGUgU2FhUyAvIG11bHRpLW9yZyBjb21wb3NpdGlvbiBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBXaGljaCBTSEFQRSBvZiB0aGlzIGFwcCBhIGJ1aWxkIGFzc2VtYmxlcyAoIzEzNjEpLlxuICpcbiAqIGBkZWZhdWx0YCBpcyB0aGUgY29tbXVuaXR5L3NpbmdsZS1vcmcgYXBwIGFuZCBpcyB3aGF0IGV2ZXJ5IGJ1aWxkIHByb2R1Y2VzXG4gKiB1bmxlc3Mgc29tZXRoaW5nIGFza3Mgb3RoZXJ3aXNlIFx1MjAxNCB0aGUgZGVtbyBvcmcgYW5kIGl0cyBzdG9yeXRlbGxpbmcgZGF0YSxcbiAqIHdoaWNoIHRoZSBwbGF0Zm9ybSdzIHNlZWQtc2V0dGxlIG93bmVyc2hpcCBjbGFpbSBiaW5kcyB0byB0aGUgZmlyc3QgcGxhdGZvcm1cbiAqIGFkbWluaXN0cmF0b3IuXG4gKlxuICogYHNhYXNgIGlzIHRoZSBzaGFwZSBhIG11bHRpLW9yZyBvcGVyYXRvciBkZXBsb3lzIG9uIHRoZSBlbnRlcnByaXNlIHJ1bnRpbWVcbiAqIHVuZGVyIGEgd2FsbGVkIHRlbmFuY3kgcG9zdHVyZSAoYE9TX1RFTkFOQ1lfUE9TVFVSRT1pc29sYXRlZGApLiBUaGUgdHdvXG4gKiBkaWZmZXIgT05MWSBieSB3aGF0IHRoZSBjb21wb3NpdGlvbiByZWdpc3RlcnM7IG5vIGNvZGUgYnJhbmNoZXMgYXQgcnVudGltZSxcbiAqIG5vdGhpbmcgaXMgZGVjaWRlZCBwZXIgdGVuYW50LCBhbmQgbm8gZW50ZXJwcmlzZSBwYWNrYWdlIGlzIGltcG9ydGVkLiBTZWVcbiAqIHtAbGluayBTYWFzVGVuYW50U2VlZERhdGF9IGZvciB3aHkgdGhlIHNlZWQgc2V0IHNocmlua3MgYW5kXG4gKiBgb2JqZWN0c3RhY2suY29tcG9zaXRpb24udHNgIGZvciB0aGUgcGVybWlzc2lvbiBoYWxmLlxuICovXG5leHBvcnQgdHlwZSBIb3RDcm1Db21wb3NpdGlvbiA9ICdkZWZhdWx0JyB8ICdzYWFzJztcblxuLyoqIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB7QGxpbmsgcmVzb2x2ZUNvbXBvc2l0aW9ufSByZWFkcy4gKi9cbmV4cG9ydCBjb25zdCBDT01QT1NJVElPTl9FTlZfVkFSID0gJ0hPVENSTV9DT01QT1NJVElPTic7XG5cbi8qKiBFdmVyeSB2YWx1ZSB7QGxpbmsgcmVzb2x2ZUNvbXBvc2l0aW9ufSBhY2NlcHRzLCBmb3IgZGlhZ25vc3RpY3MgYW5kIHRlc3RzLiAqL1xuZXhwb3J0IGNvbnN0IEhPVENSTV9DT01QT1NJVElPTlM6IHJlYWRvbmx5IEhvdENybUNvbXBvc2l0aW9uW10gPSBbJ2RlZmF1bHQnLCAnc2FhcyddO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIGNvbXBvc2l0aW9uIGZyb20gdGhlIGVudmlyb25tZW50IFx1MjAxNCBhbmQgUkVGVVNFIGFueXRoaW5nIGVsc2UuXG4gKlxuICogVGhlIHJlZnVzYWwgaXMgdGhlIHBvaW50LCBhbmQgaXQgaXMgd2h5IHRoaXMgaXMgYSBmdW5jdGlvbiByYXRoZXIgdGhhbiBhXG4gKiBgPT09ICdzYWFzJ2AgY29tcGFyaXNvbiBhdCB0aGUgb25lIGNhbGwgc2l0ZS4gVGhlIGZhaWx1cmUgbW9kZSBhIHNpbGVudFxuICogZGVmYXVsdCBwcm9kdWNlcyBpcyBub3QgXCJ0aGUgYnVpbGQgaXMgYSBiaXQgd3JvbmdcIjogYEhPVENSTV9DT01QT1NJVElPTj1zYXNzYFxuICogd291bGQgYXNzZW1ibGUgdGhlIEZVTEwgZGVtbyB1bmlvbiwgYW5kIHRoZSBvcGVyYXRvciB3b3VsZCBvbmx5IGZpbmQgb3V0IHdoZW5cbiAqIGV2ZXJ5IHRlbmFudCB0aGV5IG9uYm9hcmQgcmVjZWl2ZXMgbmluZSBhY2NvdW50cyBuYW1lZCBhZnRlciBvdGhlciBwZW9wbGUnc1xuICogY29tcGFuaWVzIFx1MjAxNCBhIGRhdGEtc2hhcGUgbWlzdGFrZSB0aGF0IGlzIGV4cGVuc2l2ZSB0byB1bndpbmQgb25jZSB0ZW5hbnRzXG4gKiBoYXZlIGVkaXRlZCB0aG9zZSByb3dzLiBBbiB1bnJlY29nbmlzZWQgdmFsdWUgdGhlcmVmb3JlIHRocm93cyBhdFxuICogY29uZmlnLWxvYWQgdGltZSwgd2hlcmUgYSBidWlsZCBmYWlscyBsb3VkbHkgYW5kIG5vdGhpbmcgaGFzIHNoaXBwZWQuXG4gKlxuICogVW5zZXQgYW5kIGVtcHR5IGJvdGggbWVhbiBgZGVmYXVsdGAsIGRlbGliZXJhdGVseTogXCJubyBvcGluaW9uXCIgaXMgdGhlXG4gKiBjb21tdW5pdHkgYXBwLCBzbyBubyBleGlzdGluZyBidWlsZCwgc2NyaXB0IG9yIENJIGpvYiBjaGFuZ2VzIGJlaGF2aW91ciBieVxuICogc2F5aW5nIG5vdGhpbmcgKGBwbnBtIGJ1aWxkYCwgYG9iamVjdHN0YWNrIHZhbGlkYXRlYCwgdGhlIGNsb3VkIEVFIHJpZ3MnXG4gKiBgc2NyaXB0cy9idWlsZC1ob3Rjcm0tYXJ0aWZhY3Quc2hgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb21wb3NpdGlvbihcbiAgcmF3OiBzdHJpbmcgfCB1bmRlZmluZWQgPSBwcm9jZXNzLmVudltDT01QT1NJVElPTl9FTlZfVkFSXSxcbik6IEhvdENybUNvbXBvc2l0aW9uIHtcbiAgY29uc3QgdmFsdWUgPSAocmF3ID8/ICcnKS50cmltKCk7XG4gIGlmICh2YWx1ZSA9PT0gJycpIHJldHVybiAnZGVmYXVsdCc7XG4gIGlmICgoSE9UQ1JNX0NPTVBPU0lUSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlIGFzIEhvdENybUNvbXBvc2l0aW9uO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgJHtDT01QT1NJVElPTl9FTlZfVkFSfT1cIiR7dmFsdWV9XCIgaXMgbm90IGEgSG90Q1JNIGNvbXBvc2l0aW9uLiBgICtcbiAgICAgIGBFeHBlY3RlZCBvbmUgb2Y6ICR7SE9UQ1JNX0NPTVBPU0lUSU9OUy5qb2luKCcsICcpfSAob3IgbGVhdmUgaXQgdW5zZXQgZm9yICdkZWZhdWx0JykuYCxcbiAgKTtcbn1cbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YS9jYXRhbG9nLnNlZWQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9kYXRhXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YS9jYXRhbG9nLnNlZWQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogUHJvZHVjdCBjYXRhbG9ndWUgc2VlZHMgXHUyMDE0IGFuZCB0aGUgdHdvIGhlbHBlcnMgdGhhdCByZWFkIHByaWNlcyBiYWNrIG91dCBvZlxuICogaXQsIHNvIGEgbGluZSBpdGVtJ3MgYGxpc3RfcHJpY2VgIGNhbiBuZXZlciBkaXNhZ3JlZSB3aXRoIHRoZSBjYXRhbG9ndWUuXG4gKlxuICogU3BsaXQgb3V0IG9mIHRoZSBmb3JtZXIgbW9ub2xpdGhpYyBgc3JjL2RhdGEvaW5kZXgudHNgICgjNjM1KS4gU2VlZCBkb2N0cmluZVxuICogbGl2ZXMgaW4gYHNyYy9zYWxlcy9kYXRhL19zaGFyZWQudHNgLlxuICovXG5pbXBvcnQgeyBkZWZpbmVTZWVkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vb2JqZWN0cy9wcm9kdWN0Lm9iamVjdCc7XG5pbXBvcnQgdHlwZSB7IExpbmVTcGVjIH0gZnJvbSAnLi4vLi4vc2FsZXMvZGF0YS9fc2hhcmVkJztcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFByb2R1Y3RzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gVGhlIGNhdGFsb2cgaXMgd2hhdCBldmVyeSBsaW5lIGl0ZW0gYmVsb3cgcHJpY2VzIGFnYWluc3QsIHNvIGl0IGhhcyB0byBiZVxuLy8gd2lkZSBlbm91Z2ggdG8gY29uZmlndXJlIGEgcmVhbGlzdGljIGRlYWw6IGFuIGVkaXRpb24sIGFuIGFkZC1vbiwgYVxuLy8gcGVyLXNlYXQgc3Vic2NyaXB0aW9uLCBzdXBwb3J0IHRpZXJzIGFuZCBwcm9mZXNzaW9uYWwgc2VydmljZXMuIEZvdXJcbi8vIHByb2R1Y3RzIGNvdWxkIG5vdCAoIzU5MSkuXG4vL1xuLy8gYGNvc3RgIGlzIHBvcHVsYXRlZCBvbiBldmVyeSBwcm9kdWN0OiBgY29zdF9sZXNzX3RoYW5fcHJpY2VgIGlzIGEgcmVhbFxuLy8gdmFsaWRhdGlvbiBydWxlIHRoYXQgXCJoYXMgbmV2ZXIgb25jZSBldmFsdWF0ZWRcIiB3aGlsZSB0aGUgZmllbGQgd2FzIGJsYW5rXG4vLyBldmVyeXdoZXJlLCBhbmQgbWFyZ2luIGlzIHdoYXQgdGhlIHByb2R1Y3QtbWl4IGFuYWx5dGljcyBhcmUgZm9yLiBFdmVyeSByb3dcbi8vIGtlZXBzIGNvc3Qgc3RyaWN0bHkgYmVsb3cgbGlzdCBwcmljZS5cbmV4cG9ydCBjb25zdCBwcm9kdWN0cyA9IGRlZmluZVNlZWQoUHJvZHVjdCwge1xuICBtb2RlOiAndXBzZXJ0JyxcbiAgZXh0ZXJuYWxJZDogJ25hbWUnLFxuICByZWNvcmRzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ09iamVjdFN0YWNrIFBsYXRmb3JtJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGVudGVycHJpc2UgZWRpdGlvbjogdW5saW1pdGVkIG9iamVjdHMsIEFJIGFnZW50cywgZ292ZXJuYW5jZSBhbmQgYXVkaXQuJyxcbiAgICAgIGNhdGVnb3J5OiAnc29mdHdhcmUnLFxuICAgICAgZmFtaWx5OiAnZW50ZXJwcmlzZScsXG4gICAgICBza3U6ICdPUy1QTEFULUVOVCcsXG4gICAgICBsaXN0X3ByaWNlOiA1MDAwMCxcbiAgICAgIGNvc3Q6IDEyMDAwLFxuICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ09iamVjdFN0YWNrIFBsYXRmb3JtIChTTUIgRWRpdGlvbiknLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgbWlkLW1hcmtldCBlZGl0aW9uOiBjb3JlIENSTSBvYmplY3RzIGFuZCBhdXRvbWF0aW9uLCBjYXBwZWQgYWdlbnQgdXNhZ2UuJyxcbiAgICAgIGNhdGVnb3J5OiAnc29mdHdhcmUnLFxuICAgICAgZmFtaWx5OiAnc21iJyxcbiAgICAgIHNrdTogJ09TLVBMQVQtU01CJyxcbiAgICAgIGxpc3RfcHJpY2U6IDE4MDAwLFxuICAgICAgY29zdDogNDUwMCxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdDbG91ZCBIb3N0aW5nIChBbm51YWwpJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTWFuYWdlZCBob3N0aW5nIHdpdGggcmVnaW9uYWwgZGF0YSByZXNpZGVuY3kgYW5kIGEgOTkuOSUgYXZhaWxhYmlsaXR5IHRhcmdldC4nLFxuICAgICAgY2F0ZWdvcnk6ICdzdWJzY3JpcHRpb24nLFxuICAgICAgZmFtaWx5OiAnY2xvdWQnLFxuICAgICAgc2t1OiAnT1MtQ0xPVUQtSE9TVCcsXG4gICAgICBsaXN0X3ByaWNlOiAxMjAwMCxcbiAgICAgIGNvc3Q6IDQyMDAsXG4gICAgICBpc19hY3RpdmU6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnU2FuZGJveCBFbnZpcm9ubWVudCAoQW5udWFsKScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0EgZnVsbC1jb3B5IG5vbi1wcm9kdWN0aW9uIGVudmlyb25tZW50IGZvciB0ZXN0aW5nIG1ldGFkYXRhIGNoYW5nZXMgYmVmb3JlIHJlbGVhc2UuJyxcbiAgICAgIGNhdGVnb3J5OiAnc3Vic2NyaXB0aW9uJyxcbiAgICAgIGZhbWlseTogJ2Nsb3VkJyxcbiAgICAgIHNrdTogJ09TLUNMT1VELVNCWCcsXG4gICAgICBsaXN0X3ByaWNlOiA3NTAwLFxuICAgICAgY29zdDogMjYwMCxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQSBuYW1lZC11c2VyIHNlYXQgZm9yIHRoZSBDby1QaWxvdCBhbmQgYWdlbnQgc3VyZmFjZXMsIGJpbGxlZCBhbm51YWxseS4nLFxuICAgICAgY2F0ZWdvcnk6ICdzdWJzY3JpcHRpb24nLFxuICAgICAgZmFtaWx5OiAnY2xvdWQnLFxuICAgICAgc2t1OiAnT1MtQUktU0VBVCcsXG4gICAgICBsaXN0X3ByaWNlOiAxMDAwLFxuICAgICAgY29zdDogMjYwLFxuICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0FuYWx5dGljcyBBZGQtb24nLFxuICAgICAgZGVzY3JpcHRpb246ICdEYXNoYm9hcmRzLCBjdWJlcyBhbmQgc2NoZWR1bGVkIHJlcG9ydGluZyBmb3IgdGhlIHJldmVudWUgb3JnYW5pemF0aW9uLicsXG4gICAgICBjYXRlZ29yeTogJ3NvZnR3YXJlJyxcbiAgICAgIGZhbWlseTogJ2VudGVycHJpc2UnLFxuICAgICAgc2t1OiAnT1MtQURET04tQU5MJyxcbiAgICAgIGxpc3RfcHJpY2U6IDIyMDAwLFxuICAgICAgY29zdDogNjUwMCxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJbnRlZ3JhdGlvbiBDb25uZWN0b3IgUGFjaycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1ByZS1idWlsdCBjb25uZWN0b3JzIGZvciBFUlAsIG1hcmtldGluZyBhdXRvbWF0aW9uIGFuZCBkYXRhIHdhcmVob3VzZSB0YXJnZXRzLicsXG4gICAgICBjYXRlZ29yeTogJ3NvZnR3YXJlJyxcbiAgICAgIGZhbWlseTogJ2VudGVycHJpc2UnLFxuICAgICAgc2t1OiAnT1MtQURET04tSU5UJyxcbiAgICAgIGxpc3RfcHJpY2U6IDE2MDAwLFxuICAgICAgY29zdDogNTIwMCxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdGaWVsZCBTZXJ2aWNlIE1vYmlsZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ09mZmxpbmUtY2FwYWJsZSBtb2JpbGUgYXBwIGZvciBmaWVsZCB0ZWNobmljaWFucyBhbmQgcm91dGUtYmFzZWQgc2VydmljZSB3b3JrLicsXG4gICAgICBjYXRlZ29yeTogJ3NvZnR3YXJlJyxcbiAgICAgIGZhbWlseTogJ3NtYicsXG4gICAgICBza3U6ICdPUy1BRERPTi1GU00nLFxuICAgICAgbGlzdF9wcmljZTogMTQwMDAsXG4gICAgICBjb3N0OiA0MjAwLFxuICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ByZW1pdW0gU3VwcG9ydCcsXG4gICAgICBkZXNjcmlwdGlvbjogJzI0XHUwMEQ3NyBzdXBwb3J0IHdpdGggYSBvbmUtaG91ciBQMSByZXNwb25zZSB0YXJnZXQgYW5kIGEgbmFtZWQgdGVjaG5pY2FsIGFjY291bnQgbWFuYWdlci4nLFxuICAgICAgY2F0ZWdvcnk6ICdzdXBwb3J0JyxcbiAgICAgIGZhbWlseTogJ3NlcnZpY2VzJyxcbiAgICAgIHNrdTogJ09TLVNVUC1QUkVNJyxcbiAgICAgIGxpc3RfcHJpY2U6IDI1MDAwLFxuICAgICAgY29zdDogOTAwMCxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdTdGFuZGFyZCBTdXBwb3J0JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQnVzaW5lc3MtaG91cnMgc3VwcG9ydCB3aXRoIGEgbmV4dC1idXNpbmVzcy1kYXkgcmVzcG9uc2UgdGFyZ2V0LicsXG4gICAgICBjYXRlZ29yeTogJ3N1cHBvcnQnLFxuICAgICAgZmFtaWx5OiAnc2VydmljZXMnLFxuICAgICAgc2t1OiAnT1MtU1VQLVNURCcsXG4gICAgICBsaXN0X3ByaWNlOiA5MDAwLFxuICAgICAgY29zdDogMzYwMCxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJbXBsZW1lbnRhdGlvbiBTZXJ2aWNlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0d1aWRlZCBpbXBsZW1lbnRhdGlvbjogZGlzY292ZXJ5LCBtZXRhZGF0YSBidWlsZCwgaW50ZWdyYXRpb24gYW5kIGdvLWxpdmUgc3VwcG9ydC4nLFxuICAgICAgY2F0ZWdvcnk6ICdzZXJ2aWNlJyxcbiAgICAgIGZhbWlseTogJ3NlcnZpY2VzJyxcbiAgICAgIHNrdTogJ09TLVNWQy1JTVBMJyxcbiAgICAgIGxpc3RfcHJpY2U6IDc1MDAwLFxuICAgICAgY29zdDogNDEwMDAsXG4gICAgICBpc19hY3RpdmU6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnRGF0YSBNaWdyYXRpb24gU2VydmljZXMnLFxuICAgICAgZGVzY3JpcHRpb246ICdFeHRyYWN0aW9uLCBtYXBwaW5nIGFuZCByZWNvbmNpbGlhdGlvbiBvZiBsZWdhY3kgQ1JNIGFuZCBzcHJlYWRzaGVldCBkYXRhLicsXG4gICAgICBjYXRlZ29yeTogJ3NlcnZpY2UnLFxuICAgICAgZmFtaWx5OiAnc2VydmljZXMnLFxuICAgICAgc2t1OiAnT1MtU1ZDLU1JR1InLFxuICAgICAgbGlzdF9wcmljZTogMzUwMDAsXG4gICAgICBjb3N0OiAxOTAwMCxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdBZG1pbiBUcmFpbmluZyBXb3Jrc2hvcCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0Egb25lLWRheSB3b3Jrc2hvcCBmb3IgYWRtaW5pc3RyYXRvcnMgb24gbWV0YWRhdGEsIHBlcm1pc3Npb25zIGFuZCBhbmFseXRpY3MuJyxcbiAgICAgIGNhdGVnb3J5OiAnc2VydmljZScsXG4gICAgICBmYW1pbHk6ICdzZXJ2aWNlcycsXG4gICAgICBza3U6ICdPUy1TVkMtVFJOJyxcbiAgICAgIGxpc3RfcHJpY2U6IDYwMDAsXG4gICAgICBjb3N0OiAyNDAwLFxuICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgIH0sXG4gIF1cbn0pO1xuXG4vKipcbiAqIENhdGFsb2cgcHJpY2Ugb2YgYSBzZWVkZWQgcHJvZHVjdCwgcmVhZCBiYWNrIGZyb20gdGhlIGRhdGFzZXQgYWJvdmUgc28gdGhlXG4gKiBwcmljZSBsaXZlcyBpbiBleGFjdGx5IG9uZSBwbGFjZS5cbiAqXG4gKiBMaW5lIGl0ZW1zIGNhcnJ5IGBsaXN0X3ByaWNlYCBleHBsaWNpdGx5IGJlY2F1c2UgaG9va3MgZG8gTk9UIHJ1biBvdmVyIHNlZWRzXG4gKiAoIzQ5MCk6IHRoZSBzaGFyZWQgcHJpY2UtZmlsbCBob29rIChgX2xpbmUtaXRlbS1wcmljZS1maWxsLnRzYCkgaXMgd2hhdFxuICogc3RhbXBzIGBsaXN0X3ByaWNlYCBmcm9tIGBjcm1fcHJvZHVjdC5saXN0X3ByaWNlYCBvbiBhIHJlYWwgd3JpdGUsIHNvIGFcbiAqIHNlZWRlZCBsaW5lIGhhcyB0byBhcnJpdmUgYWxyZWFkeSBjYXJyeWluZyB3aGF0IHRoYXQgaG9vayB3b3VsZCBoYXZlXG4gKiB3cml0dGVuLiBSZWFkaW5nIGl0IGZyb20gdGhlIGNhdGFsb2cgcmVjb3JkIG1ha2VzIHRoYXQgbGl0ZXJhbGx5IGltcG9zc2libGVcbiAqIHRvIGdldCB3cm9uZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNhdGFsb2dQcmljZSA9IChwcm9kdWN0TmFtZTogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgcHJvZHVjdCA9IHByb2R1Y3RzLnJlY29yZHMuZmluZCgocikgPT4gci5uYW1lID09PSBwcm9kdWN0TmFtZSk7XG4gIGlmICghcHJvZHVjdCB8fCB0eXBlb2YgcHJvZHVjdC5saXN0X3ByaWNlICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2VlZCBlcnJvcjogbm8gY2F0YWxvZyBwcm9kdWN0IG5hbWVkIFwiJHtwcm9kdWN0TmFtZX1cImApO1xuICB9XG4gIHJldHVybiBwcm9kdWN0Lmxpc3RfcHJpY2U7XG59O1xuXG4vKipcbiAqIEZsYXR0ZW4gYSBgeyBwYXJlbnQgXHUyMTkyIGxpbmVzIH1gIHRhYmxlIGludG8gc2VlZCByZWNvcmRzIGZvciBvbmUgbGluZS1pdGVtXG4gKiBvYmplY3QuIGBsaXN0X3ByaWNlYCBhbmQgYGxpbmVfbnVtYmVyYCBhcmUgdGhlIHR3byBmaWVsZHMgYSByZWFsIHdyaXRlIGdldHNcbiAqIGZyb20gbWFjaGluZXJ5IGEgc2VlZCBjYW5ub3QgY291bnQgb24gKHRoZSBwcmljZS1maWxsIGhvb2ssIGFuZCB0aGUgcXVvdGUgL1xuICogb3Bwb3J0dW5pdHkgbGluZSBlZGl0b3JzKSwgc28gYm90aCBhcmUgbWF0ZXJpYWxpc2VkIGhlcmUgXHUyMDE0IHRoZSByb3cgaXMgdGhlblxuICogY29ycmVjdCB3aGV0aGVyIG9yIG5vdCB0aGUgaG9vayBmaXJlcyBvdmVyIGEgc2VlZCB3cml0ZSAoIzYxNykuXG4gKi9cbmV4cG9ydCBjb25zdCBsaW5lSXRlbVJlY29yZHMgPSA8SyBleHRlbmRzIHN0cmluZz4oXG4gIHBhcmVudEZpZWxkOiBLLFxuICB0YWJsZTogUmVjb3JkPHN0cmluZywgcmVhZG9ubHkgTGluZVNwZWNbXT4sXG4pOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPT5cbiAgT2JqZWN0LmVudHJpZXModGFibGUpLmZsYXRNYXAoKFtwYXJlbnQsIGxpbmVzXSkgPT5cbiAgICBsaW5lcy5tYXAoKGwsIGkpID0+ICh7XG4gICAgICBbcGFyZW50RmllbGRdOiBwYXJlbnQsXG4gICAgICBjcm1fcHJvZHVjdDogbC5wcm9kdWN0LFxuICAgICAgZGVzY3JpcHRpb246IGwuZGVzY3JpcHRpb24sXG4gICAgICBxdWFudGl0eTogbC5xdWFudGl0eSxcbiAgICAgIGxpc3RfcHJpY2U6IGNhdGFsb2dQcmljZShsLnByb2R1Y3QpLFxuICAgICAgdW5pdF9wcmljZTogbC51bml0X3ByaWNlLFxuICAgICAgZGlzY291bnQ6IGwuZGlzY291bnQgPz8gMCxcbiAgICAgIGxpbmVfbnVtYmVyOiBpICsgMSxcbiAgICB9KSksXG4gICk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2RhdGEvb3Bwb3J0dW5pdHktbGluZS1pdGVtLnNlZWQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9kYXRhXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YS9vcHBvcnR1bml0eS1saW5lLWl0ZW0uc2VlZC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lU2VlZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgT3Bwb3J0dW5pdHlMaW5lSXRlbSB9IGZyb20gJy4uL29iamVjdHMvb3Bwb3J0dW5pdHlfbGluZV9pdGVtLm9iamVjdCc7XG5pbXBvcnQgeyBsaW5lSXRlbVJlY29yZHMgfSBmcm9tICcuL2NhdGFsb2cuc2VlZCc7XG5pbXBvcnQgeyBPUFBPUlRVTklUWV9MSU5FUyB9IGZyb20gJy4uLy4uL3NhbGVzL2RhdGEvc2FsZXMuc2VlZCc7XG5cbi8qKlxuICogT3Bwb3J0dW5pdHkgbGluZSBpdGVtIHNlZWQgcm93cy5cbiAqXG4gKiBgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbWAgaXMgYSByZXZlbnVlIG9iamVjdCwgc28gaXRzIHNlZWQgcm93cyBhcmUgdGhlXG4gKiByZXZlbnVlIHBhY2thZ2UncyAocGxhbiBpdGVtIDU6IGFuIGl0ZW0gbGl2ZXMgd2l0aCB0aGUgb2JqZWN0IGl0IGlzIGF1dGhvcmVkXG4gKiBhZ2FpbnN0KSBcdTIwMTQgd2hpbGUgdGhlIExJTkVTIHRoZW1zZWx2ZXMgc3RheSB3aXRoIHRoZSBvcHBvcnR1bml0aWVzIHRoZXkgcHJpY2UuXG4gKiBgT1BQT1JUVU5JVFlfTElORVNgIGlzIHJlYWQgZnJvbSBgc3JjL3NhbGVzL2RhdGEvc2FsZXMuc2VlZC50c2AgYWxvbmcgdGhlXG4gKiByZXZlbnVlIC0+IHNhbGVzIGVkZ2UsIGFuZCBpdCBoYXMgdG8gYmU6IHRoZSBzYW1lIHRhYmxlIGlzIHdoYXRcbiAqIGBkZWFsVmFsdWUoKWAgZGVyaXZlcyBldmVyeSBvcHBvcnR1bml0eSdzIGBhbW91bnRgIGZyb20sIHNvIGEgc2Vjb25kIGNvcHlcbiAqIGhlcmUgd291bGQgYmUgYSBzZWNvbmQgYW5zd2VyIHRvIHdoYXQgYSBkZWFsIGlzIHdvcnRoLlxuICpcbiAqIFx1MjUwMFx1MjUwMFx1MjUwMCBPcHBvcnR1bml0eSBsaW5lIGl0ZW1zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICogSWRlbnRpdHkgaXMgdGhlIENPTVBPU0lURSBuYXR1cmFsIGtleSAob3Bwb3J0dW5pdHksIHByb2R1Y3QpOiB0aGUgb2JqZWN0IGhhc1xuICogbm8gc2luZ2xlIG5hdHVyYWwga2V5IFx1MjAxNCBubyBuYW1lLCBhbmQgYGxpbmVfbnVtYmVyYCBpcyBvbmx5IHVuaXF1ZSB3aXRoaW4gYVxuICogcGFyZW50IFx1MjAxNCBhbmQgYSBqdW5jdGlvbi1zaGFwZWQgZGF0YXNldCB3aXRob3V0IG9uZSBjYW4gb25seSBydW5cbiAqIGBtb2RlOiAnaW5zZXJ0J2AsIHdoaWNoIHJlLWluc2VydHMgZXZlcnkgcm93IG9uIGVhY2ggcmVwbGF5IGJvb3QgYW5kXG4gKiBkdXBsaWNhdGVzIHRoZSB0YWJsZSAoZnJhbWV3b3JrIzM0MzQpLiBUaGUgbG9hZGVyIG1hdGNoZXMgY29tcG9zaXRlIGtleVxuICogZmllbGRzIGJ5IHRoZWlyIFJFU09MVkVEIGlkcywgc28gdGhpcyBkZWR1cGVzIGNvcnJlY3RseSBhY3Jvc3MgcmVzdGFydHMuXG4gKiBUaGUgcHJhY3RpY2FsIGNvbnN0cmFpbnQgaXQgaW1wb3NlczogYSBwcm9kdWN0IGFwcGVhcnMgYXQgbW9zdCBvbmNlIHBlclxuICogZGVhbCwgd2hpY2ggaXMgaG93IHRoZXNlIGxpbmVzIGFyZSBhdXRob3JlZCBhbnl3YXkuXG4gKi9cbmV4cG9ydCBjb25zdCBvcHBvcnR1bml0eUxpbmVJdGVtcyA9IGRlZmluZVNlZWQoT3Bwb3J0dW5pdHlMaW5lSXRlbSwge1xuICBtb2RlOiAndXBzZXJ0JyxcbiAgZXh0ZXJuYWxJZDogWydjcm1fb3Bwb3J0dW5pdHknLCAnY3JtX3Byb2R1Y3QnXSxcbiAgcmVjb3JkczogbGluZUl0ZW1SZWNvcmRzKCdjcm1fb3Bwb3J0dW5pdHknLCBPUFBPUlRVTklUWV9MSU5FUyksXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YS9yZXZlbnVlLnNlZWQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9kYXRhXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YS9yZXZlbnVlLnNlZWQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogUmV2ZW51ZSBzZWVkcyBcdTIwMTQgY29udHJhY3RzLCBxdW90ZXMgYW5kIHRoZWlyIGxpbmVzLlxuICpcbiAqIFNwbGl0IG91dCBvZiB0aGUgZm9ybWVyIG1vbm9saXRoaWMgYHNyYy9kYXRhL2luZGV4LnRzYCAoIzYzNSkuIFNlZWQgZG9jdHJpbmVcbiAqIGxpdmVzIGluIGBzcmMvc2FsZXMvZGF0YS9fc2hhcmVkLnRzYC5cbiAqL1xuaW1wb3J0IHsgZGVmaW5lU2VlZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgQ29udHJhY3QgfSBmcm9tICcuLi9vYmplY3RzL2NvbnRyYWN0Lm9iamVjdCc7XG5pbXBvcnQgeyBRdW90ZSB9IGZyb20gJy4uL29iamVjdHMvcXVvdGUub2JqZWN0JztcbmltcG9ydCB7IFF1b3RlTGluZUl0ZW0gfSBmcm9tICcuLi9vYmplY3RzL3F1b3RlX2xpbmVfaXRlbS5vYmplY3QnO1xuaW1wb3J0IHsgbGluZXNUb3RhbCwgdHlwZSBMaW5lU3BlYyB9IGZyb20gJy4uLy4uL3NhbGVzL2RhdGEvX3NoYXJlZCc7XG5pbXBvcnQgeyBsaW5lSXRlbVJlY29yZHMgfSBmcm9tICcuL2NhdGFsb2cuc2VlZCc7XG5pbXBvcnQgeyBPUFBPUlRVTklUWV9MSU5FUyB9IGZyb20gJy4uLy4uL3NhbGVzL2RhdGEvc2FsZXMuc2VlZCc7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDb250cmFjdHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vLyBgY29udHJhY3RfbnVtYmVyYCBpcyBhIHJ1bnRpbWUtb3duZWQgYXV0b251bWJlciBhbmQgaXMgTk9UIHNlZWRlZCAoIzQ5MCkuXG4vLyBDb250cmFjdCBoYXMgbm8gbmF0dXJhbC1uYW1lIGZpZWxkLCBzbyB0aGUgKHVuaXF1ZSwgc3RhYmxlKSBkZXNjcmlwdGlvblxuLy8gZG91YmxlcyBhcyB0aGUgdXBzZXJ0IGlkZW50aXR5IGZvciB0aGVzZSBmaXh0dXJlcy5cbmV4cG9ydCBjb25zdCBjb250cmFjdHMgPSBkZWZpbmVTZWVkKENvbnRyYWN0LCB7XG4gIG1vZGU6ICd1cHNlcnQnLFxuICBleHRlcm5hbElkOiAnZGVzY3JpcHRpb24nLFxuICByZWNvcmRzOiBbXG4gICAgLy8gVGhlIG9uZSBBQ1RJVkFURUQgY29udHJhY3QgaW4gdGhlIGFwcCBcdTIwMTQgYGNvbnRyYWN0X3JlbmV3YWxgLFxuICAgIC8vIGBjb250cmFjdF9leHBpcmF0aW9uYCBhbmQgYGJpbGxpbmdfaGFuZG9mZmAgYWxsIGZpbHRlciBvbiBleGFjdGx5IHRoYXRcbiAgICAvLyBzdGF0dXMgXHUyMDE0IHNvIGl0IGhhcyB0byBiZSBhIGNvbnRyYWN0IHRoYXQgd2FzIHJlYWxseSBzaWduZWQsIG9mZiBhIGRlYWxcbiAgICAvLyB0aGF0IHdhcyByZWFsbHkgd29uLlxuICAgIC8vXG4gICAgLy8gSXQgdXNlZCB0byBsaW5rIGBBY21lIFBsYXRmb3JtIFVwZ3JhZGVgIGFuZCBjYXJyeSB0aGF0IGRlYWwncyBsaW5lIHRvdGFsXG4gICAgLy8gKDE1MDAwMCkgd2hpbGUgdGhhdCBkZWFsIGlzIHN0aWxsIGBwcm9wb3NhbGAsIGNsb3NpbmcgYGRheXNGcm9tTm93KDMwKWBcbiAgICAvLyAoIzE2NjEpLiBOb3RoaW5nIGluIHRoaXMgYXBwIGNhbiBwcm9kdWNlIHRoYXQgcGFpcmluZzogYHF1b3RlX29uX2FjY2VwdGVkYFxuICAgIC8vIGNsb3NlLXdpbnMgYW4gb3Bwb3J0dW5pdHkgdGhlIG1vbWVudCBpdHMgcXVvdGUgaXMgYWNjZXB0ZWQsIGFuZFxuICAgIC8vIGBjbG9zZWRfd29uYCBpcyBURVJNSU5BTCBpbiBgb3Bwb3J0dW5pdHlfc3RhZ2VfcHJvZ3Jlc3Npb25gIFx1MjAxNCBzbyBhIHNpZ25lZFxuICAgIC8vIGNvbnRyYWN0IGNhbiBuZXZlciBzaXQgb24gYW4gb3BlbiBkZWFsLCBmcm9tIGVpdGhlciBkaXJlY3Rpb24uXG4gICAgLy9cbiAgICAvLyBFdmVyeSBmaWVsZCBiZWxvdyBpcyBub3cgZGVyaXZlZCBmcm9tIGBBY21lIEFubnVhbCBSZW5ld2FsIDIwMjVgLCB0aGVcbiAgICAvLyBgY2xvc2VkX3dvbmAgZGVhbCB0aGlzIGNvbnRyYWN0J3Mgb3duIGRlc2NyaXB0aW9uIHdhcyBhbHJlYWR5IGRlc2NyaWJpbmc6XG4gICAgLy8gICBjb250cmFjdF92YWx1ZSBcdTIwMTQgdGhhdCBkZWFsJ3MgbGluZS1pdGVtIHRvdGFsLCB3aGljaCBpcyBhbHNvIHRoZSBBUlIgdGhlXG4gICAgLy8gICAgICAgICAgICAgICAgICAgIGFjY291bnQgZGVzY3JpcHRpb24gcmVwb3J0cy4gMTUwMDAwIHdhcyB0aGUgdXBncmFkZSdzXG4gICAgLy8gICAgICAgICAgICAgICAgICAgIHRvdGFsLCBpLmUuIHRoZSB2YWx1ZSBjYW1lIGZyb20gYSBkaWZmZXJlbnQgZGVhbCB0aGFuXG4gICAgLy8gICAgICAgICAgICAgICAgICAgIHRoZSBsaW5rIGRpZDtcbiAgICAvLyAgIHNpZ25lZF9kYXRlICAgIFx1MjAxNCBpdHMgYGNsb3NlX2RhdGVgOiB5b3Ugc2lnbiB3aGVuIHlvdSB3aW4sIGFuZFxuICAgIC8vICAgICAgICAgICAgICAgICAgICBgcXVvdGVfb25fYWNjZXB0ZWRgIHN0YW1wcyB0aGF0IHNhbWUgZGF5O1xuICAgIC8vICAgc3RhcnRfZGF0ZSAgICAgXHUyMDE0IHNpZ25hdHVyZSArIDE0ZCwgYmVjYXVzZSB0aGF0IGRlYWwncyBkZXNjcmlwdGlvbiBzYXlzXG4gICAgLy8gICAgICAgICAgICAgICAgICAgIGl0IHdhcyBcInNpZ25lZCB0d28gd2Vla3MgYWhlYWQgb2YgdGhlIHJlbmV3YWwgZGF0ZVwiO1xuICAgIC8vICAgZW5kX2RhdGUgICAgICAgXHUyMDE0IHN0YXJ0ICsgMzY1ZCwgdGhlIHNwYW4gZXZlcnkgb3RoZXIgcm93IGhlcmUgdXNlcyBmb3IgYVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAxMi1tb250aCB0ZXJtLlxuICAgIHtcbiAgICAgIGNybV9hY2NvdW50OiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICBjcm1fY29udGFjdDogJ2pvaG4uc21pdGhAYWNtZS5leGFtcGxlLmNvbScsXG4gICAgICBjcm1fb3Bwb3J0dW5pdHk6ICdBY21lIEFubnVhbCBSZW5ld2FsIDIwMjUnLFxuICAgICAgc3RhdHVzOiAnYWN0aXZhdGVkJyxcbiAgICAgIGNvbnRyYWN0X3Rlcm1fbW9udGhzOiAxMixcbiAgICAgIHN0YXJ0X2RhdGU6IGNlbGBkYXlzQWdvKDEpYCxcbiAgICAgIGVuZF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMzY0KWAsXG4gICAgICBjb250cmFjdF92YWx1ZTogMjIwMDAwLFxuICAgICAgYmlsbGluZ19mcmVxdWVuY3k6ICdhbm51YWxseScsXG4gICAgICBwYXltZW50X3Rlcm1zOiAnbmV0XzMwJyxcbiAgICAgIGF1dG9fcmVuZXdhbDogdHJ1ZSxcbiAgICAgIHJlbmV3YWxfbm90aWNlX2RheXM6IDYwLFxuICAgICAgY29udHJhY3RfdHlwZTogJ3N1YnNjcmlwdGlvbicsXG4gICAgICBzaWduZWRfZGF0ZTogY2VsYGRheXNBZ28oMTUpYCxcbiAgICAgIHNpZ25lZF9ieTogJ0pvaG4gU21pdGgnLFxuICAgICAgZGVzY3JpcHRpb246ICdBbm51YWwgcGxhdGZvcm0gc3Vic2NyaXB0aW9uIHdpdGggcHJlbWl1bSBzdXBwb3J0IHRpZXIuJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGNybV9hY2NvdW50OiAnV2F5bmUgRW50ZXJwcmlzZXMnLFxuICAgICAgY3JtX2NvbnRhY3Q6ICdyd2lsc29uQHdheW5lLmV4YW1wbGUuY29tJyxcbiAgICAgIGNybV9vcHBvcnR1bml0eTogJ1dheW5lIEVudGVycHJpc2UgTGljZW5zZScsXG4gICAgICBzdGF0dXM6ICdpbl9hcHByb3ZhbCcsXG4gICAgICBjb250cmFjdF90ZXJtX21vbnRoczogMzYsXG4gICAgICBzdGFydF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMTQpYCxcbiAgICAgIGVuZF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMTEwOSlgLFxuICAgICAgY29udHJhY3RfdmFsdWU6IDEyMDAwMDAsXG4gICAgICBiaWxsaW5nX2ZyZXF1ZW5jeTogJ2FubnVhbGx5JyxcbiAgICAgIHBheW1lbnRfdGVybXM6ICduZXRfNjAnLFxuICAgICAgYXV0b19yZW5ld2FsOiBmYWxzZSxcbiAgICAgIHJlbmV3YWxfbm90aWNlX2RheXM6IDkwLFxuICAgICAgY29udHJhY3RfdHlwZTogJ2xpY2Vuc2UnLFxuICAgICAgZGVzY3JpcHRpb246ICdNdWx0aS15ZWFyIGVudGVycHJpc2UgbGljZW5zZSB3aXRoIGN1c3RvbSBTTEEuJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGNybV9hY2NvdW50OiAnSW5pdGVjaCBTb2x1dGlvbnMnLFxuICAgICAgY3JtX2NvbnRhY3Q6ICdtY2hlbkBpbml0ZWNoLmV4YW1wbGUuY29tJyxcbiAgICAgIHN0YXR1czogJ2V4cGlyZWQnLFxuICAgICAgY29udHJhY3RfdGVybV9tb250aHM6IDEyLFxuICAgICAgc3RhcnRfZGF0ZTogY2VsYGRheXNBZ28oNDAwKWAsXG4gICAgICBlbmRfZGF0ZTogY2VsYGRheXNBZ28oMzUpYCxcbiAgICAgIGNvbnRyYWN0X3ZhbHVlOiA2MDAwMCxcbiAgICAgIGJpbGxpbmdfZnJlcXVlbmN5OiAncXVhcnRlcmx5JyxcbiAgICAgIHBheW1lbnRfdGVybXM6ICduZXRfMzAnLFxuICAgICAgYXV0b19yZW5ld2FsOiBmYWxzZSxcbiAgICAgIHJlbmV3YWxfbm90aWNlX2RheXM6IDMwLFxuICAgICAgY29udHJhY3RfdHlwZTogJ3NlcnZpY2UnLFxuICAgICAgc2lnbmVkX2RhdGU6IGNlbGBkYXlzQWdvKDQwNSlgLFxuICAgICAgc2lnbmVkX2J5OiAnTWljaGFlbCBDaGVuJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSW5pdGlhbCBzZXJ2aWNlIGFncmVlbWVudCwgcGVuZGluZyByZW5ld2FsIGRpc2N1c3Npb24uJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGNybV9hY2NvdW50OiAnU3RhcmsgTWVkaWNhbCcsXG4gICAgICBjcm1fY29udGFjdDogJ2VtaWx5LmRAc3RhcmttZWQuZXhhbXBsZS5jb20nLFxuICAgICAgc3RhdHVzOiAnZHJhZnQnLFxuICAgICAgY29udHJhY3RfdGVybV9tb250aHM6IDI0LFxuICAgICAgc3RhcnRfZGF0ZTogY2VsYGRheXNGcm9tTm93KDMwKWAsXG4gICAgICBlbmRfZGF0ZTogY2VsYGRheXNGcm9tTm93KDc2MClgLFxuICAgICAgY29udHJhY3RfdmFsdWU6IDM1MDAwMCxcbiAgICAgIGJpbGxpbmdfZnJlcXVlbmN5OiAnbW9udGhseScsXG4gICAgICBwYXltZW50X3Rlcm1zOiAnbmV0XzMwJyxcbiAgICAgIGF1dG9fcmVuZXdhbDogdHJ1ZSxcbiAgICAgIHJlbmV3YWxfbm90aWNlX2RheXM6IDYwLFxuICAgICAgY29udHJhY3RfdHlwZTogJ3BhcnRuZXJzaGlwJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSGVhbHRoY2FyZSBwYXJ0bmVyc2hpcCBhZ3JlZW1lbnQsIGN1cnJlbnRseSB1bmRlciBsZWdhbCByZXZpZXcuJyxcbiAgICB9LFxuICBdXG59KTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFF1b3RlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIGBxdW90ZV9udW1iZXJgIGlzIGEgcnVudGltZS1vd25lZCBhdXRvbnVtYmVyIGFuZCBpcyBOT1Qgc2VlZGVkICgjNDkwKTtcbi8vIHRoZSAodW5pcXVlKSBxdW90ZSBuYW1lIGlzIHRoZSB1cHNlcnQgaWRlbnRpdHkgaW5zdGVhZC5cbi8qKlxuICogUXVvdGUgbGluZSBpdGVtcywga2V5ZWQgYnkgcXVvdGUgbmFtZS4gVGhlIGZvdXIgcXVvdGVzIGdlbmVyYXRlZCBmcm9tIGEgZGVhbFxuICogY2FycnkgdGhhdCBkZWFsJ3MgY29uZmlndXJhdGlvbiB2ZXJiYXRpbSBcdTIwMTQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHRoZVxuICogYHF1b3RlX2dlbmVyYXRpb25gIGZsb3cgZG9lcyB3aGVuIGl0IGNsb25lcyBvcHBvcnR1bml0eSBsaW5lcyBvbnRvIGEgcXVvdGUuXG4gKi9cbmNvbnN0IFFVT1RFX0xJTkVTOiBSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBMaW5lU3BlY1tdPiA9IHtcbiAgJ0FjbWUgUGxhdGZvcm0gVXBncmFkZSBRdW90ZSc6IE9QUE9SVFVOSVRZX0xJTkVTWydBY21lIFBsYXRmb3JtIFVwZ3JhZGUnXSxcbiAgJ0FjbWUgQW5udWFsIFJlbmV3YWwgMjAyNSBRdW90ZSc6IE9QUE9SVFVOSVRZX0xJTkVTWydBY21lIEFubnVhbCBSZW5ld2FsIDIwMjUnXSxcbiAgJ0dsb2JleCBNYW51ZmFjdHVyaW5nIFN1aXRlIFByb3Bvc2FsJzogT1BQT1JUVU5JVFlfTElORVNbJ0dsb2JleCBNYW51ZmFjdHVyaW5nIFN1aXRlJ10sXG4gICdXYXluZSBFbnRlcnByaXNlIExpY2Vuc2UgUXVvdGUnOiBPUFBPUlRVTklUWV9MSU5FU1snV2F5bmUgRW50ZXJwcmlzZSBMaWNlbnNlJ10sXG4gICdJbml0ZWNoIENsb3VkIE1pZ3JhdGlvbiBFc3RpbWF0ZSc6IE9QUE9SVFVOSVRZX0xJTkVTWydJbml0ZWNoIENsb3VkIE1pZ3JhdGlvbiddLFxuICAvLyBRdW90ZWQgc3RhbmRhbG9uZSwgYmVmb3JlIGFueSBvcHBvcnR1bml0eSBleGlzdGVkIFx1MjAxNCBhbmQgdGhlbiByZWplY3RlZC5cbiAgJ1N0YXJrIE1lZGljYWwgUGlsb3QgUXVvdGUnOiBbXG4gICAgeyBwcm9kdWN0OiAnQWRtaW4gVHJhaW5pbmcgV29ya3Nob3AnLCBxdWFudGl0eTogNSwgdW5pdF9wcmljZTogNjAwMCwgZGVzY3JpcHRpb246ICdGaXZlIHdvcmtzaG9wIGRheXMgZm9yIHRoZSBwaWxvdCBjbGluaWNhbCB0ZWFtcy4nIH0sXG4gICAgeyBwcm9kdWN0OiAnU3RhbmRhcmQgU3VwcG9ydCcsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiA5MDAwLCBkZXNjcmlwdGlvbjogJ1N0YW5kYXJkIHN1cHBvcnQgZm9yIHRoZSBwaWxvdCB0ZXJtLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJywgcXVhbnRpdHk6IDYsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnQWdlbnQgc2VhdHMgZm9yIHRoZSBwaWxvdCBjb29yZGluYXRvcnMuJyB9LFxuICBdLFxufTtcblxuLyoqXG4gKiBgc3VidG90YWxgIC8gYGRpc2NvdW50X2Ftb3VudGAgLyBgdG90YWxfcHJpY2VgIGZvciBhIHF1b3RlLCBkZXJpdmVkIGZyb20gaXRzXG4gKiBsaW5lcyB3aXRoIGBxdW90ZV90b3RhbF9yb2xsdXBgJ3Mgb3duIG1vZGVsOlxuICpcbiAqICAgc3VidG90YWwgICAgICAgID0gXHUwM0EzIGxpbmUgKHF1YW50aXR5IFx1MDBENyB1bml0X3ByaWNlIFx1MDBENyAoMSBcdTIyMTIgbGluZV9kaXNjb3VudC8xMDApKVxuICogICBkaXNjb3VudF9hbW91bnQgPSBzdWJ0b3RhbCBcdTAwRDcgcXVvdGUuZGlzY291bnQlXG4gKiAgIHRvdGFsX3ByaWNlICAgICA9IHN1YnRvdGFsIFx1MjIxMiBkaXNjb3VudF9hbW91bnQgKyB0YXggKyBzaGlwcGluZ19oYW5kbGluZ1xuICpcbiAqIFF1b3RlLWxldmVsIGB0YXhgIGFuZCBgc2hpcHBpbmdfaGFuZGxpbmdgIHN0YXkgbWFudWFsIGlucHV0cyBcdTIwMTQgdGhlIHJvbGx1cFxuICogZG9lcyBub3QgZGVyaXZlIHRoZW0gZWl0aGVyLiBFdmVyeXRoaW5nIHRoZSByb2xsdXAgRE9FUyBvd24gaXMgY29tcHV0ZWQgaGVyZVxuICogc28gdGhhdCB0aGUgZmlyc3QgZWRpdCB0byBhIHNlZWRlZCBsaW5lIGl0ZW0gcmVjb21wdXRlcyB0aGUgc2FtZSBudW1iZXJzXG4gKiBpbnN0ZWFkIG9mIHZpc2libHkgY29ycmVjdGluZyB0aGVtLlxuICovXG5jb25zdCBxdW90ZVRvdGFscyA9IChcbiAgcXVvdGVOYW1lOiBzdHJpbmcsXG4gIG9wdHM6IHsgZGlzY291bnQ6IG51bWJlcjsgdGF4OiBudW1iZXI7IHNoaXBwaW5nX2hhbmRsaW5nOiBudW1iZXIgfSxcbikgPT4ge1xuICBjb25zdCBsaW5lcyA9IFFVT1RFX0xJTkVTW3F1b3RlTmFtZV07XG4gIGlmICghbGluZXMpIHRocm93IG5ldyBFcnJvcihgU2VlZCBlcnJvcjogbm8gbGluZSBpdGVtcyBhdXRob3JlZCBmb3IgcXVvdGUgXCIke3F1b3RlTmFtZX1cImApO1xuICBjb25zdCBzdWJ0b3RhbCA9IGxpbmVzVG90YWwobGluZXMpO1xuICBjb25zdCBkaXNjb3VudF9hbW91bnQgPSBNYXRoLnJvdW5kKHN1YnRvdGFsICogKG9wdHMuZGlzY291bnQgLyAxMDApICogMTAwKSAvIDEwMDtcbiAgY29uc3QgdG90YWxfcHJpY2UgPVxuICAgIE1hdGgucm91bmQoKHN1YnRvdGFsIC0gZGlzY291bnRfYW1vdW50ICsgb3B0cy50YXggKyBvcHRzLnNoaXBwaW5nX2hhbmRsaW5nKSAqIDEwMCkgLyAxMDA7XG4gIHJldHVybiB7XG4gICAgc3VidG90YWwsXG4gICAgZGlzY291bnQ6IG9wdHMuZGlzY291bnQsXG4gICAgZGlzY291bnRfYW1vdW50LFxuICAgIHRheDogb3B0cy50YXgsXG4gICAgc2hpcHBpbmdfaGFuZGxpbmc6IG9wdHMuc2hpcHBpbmdfaGFuZGxpbmcsXG4gICAgdG90YWxfcHJpY2UsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgcXVvdGVzID0gZGVmaW5lU2VlZChRdW90ZSwge1xuICBtb2RlOiAndXBzZXJ0JyxcbiAgZXh0ZXJuYWxJZDogJ25hbWUnLFxuICByZWNvcmRzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ0FjbWUgUGxhdGZvcm0gVXBncmFkZSBRdW90ZScsXG4gICAgICBjcm1fYWNjb3VudDogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgICAgY3JtX2NvbnRhY3Q6ICdqb2huLnNtaXRoQGFjbWUuZXhhbXBsZS5jb20nLFxuICAgICAgY3JtX29wcG9ydHVuaXR5OiAnQWNtZSBQbGF0Zm9ybSBVcGdyYWRlJyxcbiAgICAgIC8vIGBleHBpcmVkYCwgbm90IGBhY2NlcHRlZGAgKCMxNjYxKS4gQWNjZXB0aW5nIHRoaXMgcXVvdGUgd291bGQgaGF2ZVxuICAgICAgLy8gY2xvc2Utd29uIGBBY21lIFBsYXRmb3JtIFVwZ3JhZGVgLCB3aGljaCBpcyBgcHJvcG9zYWxgIGFuZCAzMCBkYXlzIGZyb21cbiAgICAgIC8vIGNsb3NlIFx1MjAxNCB0aGUgc2FtZSBpbXBvc3NpYmxlIHBhaXJpbmcgdGhlIGNvbnRyYWN0IGFib3ZlIGNhcnJpZWQsIG9uZVxuICAgICAgLy8gb2JqZWN0IG92ZXIuIGBleHBpcmVkYCBpcyB3aGF0IGBxdW90ZV9leHBpcmF0aW9uYCBjb21wdXRlcyBmb3IgYVxuICAgICAgLy8gcHJlc2VudGVkIHF1b3RlIHBhc3QgaXRzIGBleHBpcmF0aW9uX2RhdGVgLCBhbmQgaXQgaXMgd2hhdCB0aGUgZGVhbCdzXG4gICAgICAvLyBvd24gbmV4dCBzdGVwIGFzc3VtZXM6IHRoZSByZXZpc2VkIEVudGVycHJpc2UgcHJvcG9zYWwgc3RpbGwgaGFzIHRvIGdvXG4gICAgICAvLyBvdXQuIEl0cyBgY3JtX2NvbnRhY3RgIHN0YXlzIHB1dCBcdTIwMTQgdGhlIHJvdyBpcyBubyBsb25nZXIgZ2F0ZWQgYnlcbiAgICAgIC8vIGByZXF1aXJlZFdoZW5gLCBidXQgdGhlIHJlY2lwaWVudCBpcyBzdGlsbCB3aG8gaXQgd2FzIHNlbnQgdG8uXG4gICAgICBzdGF0dXM6ICdleHBpcmVkJyxcbiAgICAgIHF1b3RlX2RhdGU6IGNlbGBkYXlzQWdvKDQ1KWAsXG4gICAgICBleHBpcmF0aW9uX2RhdGU6IGNlbGBkYXlzQWdvKDE1KWAsXG4gICAgICAuLi5xdW90ZVRvdGFscygnQWNtZSBQbGF0Zm9ybSBVcGdyYWRlIFF1b3RlJywgeyBkaXNjb3VudDogMTAsIHRheDogMTE0NzUsIHNoaXBwaW5nX2hhbmRsaW5nOiAwIH0pLFxuICAgICAgcGF5bWVudF90ZXJtczogJ25ldF8zMCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ1BsYXRmb3JtIHVwZ3JhZGUgd2l0aCAxMCUgbG95YWx0eSBkaXNjb3VudCBhcHBsaWVkLicsXG4gICAgfSxcbiAgICAvLyBUaGUgcmVuZXdhbCdzIG93biBxdW90ZSwgYW5kIHRoZSBzZWVkJ3Mgb25lIEFDQ0VQVEVEIHF1b3RlLiBBY2NlcHRhbmNlIGlzXG4gICAgLy8gb25seSBjb2hlcmVudCBoZXJlOiBgcXVvdGVfb25fYWNjZXB0ZWRgIGNsb3NlLXdpbnMgd2hhdGV2ZXIgb3Bwb3J0dW5pdHkgYVxuICAgIC8vIHF1b3RlIGxpbmtzLCBzbyBhbiBhY2NlcHRlZCBxdW90ZSBjYW4gb25seSBldmVyIHBvaW50IGF0IGEgYGNsb3NlZF93b25gXG4gICAgLy8gZGVhbC4gSXQgYWxzbyBjb21wbGV0ZXMgdGhlIHByb3ZlbmFuY2UgY2hhaW4gdGhlIGNvbnRyYWN0IGFib3ZlIG5lZWRzIFx1MjAxNFxuICAgIC8vIGRlYWwgd29uLCBxdW90ZSBhY2NlcHRlZCwgY29udHJhY3QgZHJhZnRlZCwgdGhlbiBjb21wbGV0ZWQgYW5kIGFjdGl2YXRlZFxuICAgIC8vIGJ5IGFuIGFkbWluICh0aGUgZHJhZnQgdGhlIGhvb2sgd3JpdGVzIGlzIGV4cGxpY2l0bHkgYSBzdGFydGluZyBwb2ludCkuXG4gICAgLy8gYEFjbWUgQW5udWFsIFJlbmV3YWwgMjAyNWAga2VlcHMgaXRzIHJlcC1yZWNvcmRlZCBgcmVsYXRpb25zaGlwYCB3aW5cbiAgICAvLyByZWFzb246IHRoZSBob29rIG9ubHkgc3VwcGxpZXMgYHF1b3RlX2FjY2VwdGVkYCB3aGVuIG5vYm9keSByZWNvcmRlZCBvbmUuXG4gICAge1xuICAgICAgbmFtZTogJ0FjbWUgQW5udWFsIFJlbmV3YWwgMjAyNSBRdW90ZScsXG4gICAgICBjcm1fYWNjb3VudDogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgICAgY3JtX2NvbnRhY3Q6ICdqb2huLnNtaXRoQGFjbWUuZXhhbXBsZS5jb20nLFxuICAgICAgY3JtX29wcG9ydHVuaXR5OiAnQWNtZSBBbm51YWwgUmVuZXdhbCAyMDI1JyxcbiAgICAgIHN0YXR1czogJ2FjY2VwdGVkJyxcbiAgICAgIHF1b3RlX2RhdGU6IGNlbGBkYXlzQWdvKDMwKWAsXG4gICAgICBleHBpcmF0aW9uX2RhdGU6IGNlbGBkYXlzQWdvKDEpYCxcbiAgICAgIC8vIE5vIGRpc2NvdW50IFx1MjAxNCB0aGUgcmVuZXdhbCB3ZW50IGF0IGxpc3QgKFwibXVsdGkteWVhciBvcHRpb24gZGVjbGluZWRcbiAgICAgIC8vIHRoaXMgcm91bmRcIiksIHdoaWNoIGlzIHdoYXQgaXRzIDIyJSBZb1kgdXBsaWZ0IGlzIG1hZGUgb2YuIFRheCBpcyA4LjUlXG4gICAgICAvLyBvZiB0aGUgcG9zdC1kaXNjb3VudCBzdWJ0b3RhbCwgdGhlIHJhdGUgdGhlIG90aGVyIEFjbWUgcXVvdGUgYmlsbHMgYXQ7XG4gICAgICAvLyBldmVyeSBub24tQWNtZSBxdW90ZSBoZXJlIGJpbGxzIDglLlxuICAgICAgLi4ucXVvdGVUb3RhbHMoJ0FjbWUgQW5udWFsIFJlbmV3YWwgMjAyNSBRdW90ZScsIHsgZGlzY291bnQ6IDAsIHRheDogMTg3MDAsIHNoaXBwaW5nX2hhbmRsaW5nOiAwIH0pLFxuICAgICAgcGF5bWVudF90ZXJtczogJ25ldF8zMCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0FubnVhbCByZW5ld2FsIFx1MjAxNCB0aHJlZSBwcm9kdWN0aW9uIHRlbmFudHMsIHByZW1pdW0gc3VwcG9ydCBhbmQgdGhlIEVNRUEgc2VhdCBleHBhbnNpb24uJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdHbG9iZXggTWFudWZhY3R1cmluZyBTdWl0ZSBQcm9wb3NhbCcsXG4gICAgICBjcm1fYWNjb3VudDogJ0dsb2JleCBJbmR1c3RyaWVzJyxcbiAgICAgIGNybV9jb250YWN0OiAnc2FyYWguakBnbG9iZXguZXhhbXBsZS5jb20nLFxuICAgICAgY3JtX29wcG9ydHVuaXR5OiAnR2xvYmV4IE1hbnVmYWN0dXJpbmcgU3VpdGUnLFxuICAgICAgc3RhdHVzOiAncHJlc2VudGVkJyxcbiAgICAgIHF1b3RlX2RhdGU6IGNlbGBkYXlzQWdvKDcpYCxcbiAgICAgIGV4cGlyYXRpb25fZGF0ZTogY2VsYGRheXNGcm9tTm93KDIzKWAsXG4gICAgICAuLi5xdW90ZVRvdGFscygnR2xvYmV4IE1hbnVmYWN0dXJpbmcgU3VpdGUgUHJvcG9zYWwnLCB7IGRpc2NvdW50OiA1LCB0YXg6IDcyMjAsIHNoaXBwaW5nX2hhbmRsaW5nOiAyNTAwIH0pLFxuICAgICAgcGF5bWVudF90ZXJtczogJ25ldF82MCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ01hbnVmYWN0dXJpbmcgc3VpdGUgbGljZW5zaW5nIHdpdGggcGxhbnQtYWRtaW4gdHJhaW5pbmcuJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdXYXluZSBFbnRlcnByaXNlIExpY2Vuc2UgUXVvdGUnLFxuICAgICAgY3JtX2FjY291bnQ6ICdXYXluZSBFbnRlcnByaXNlcycsXG4gICAgICBjcm1fY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLFxuICAgICAgY3JtX29wcG9ydHVuaXR5OiAnV2F5bmUgRW50ZXJwcmlzZSBMaWNlbnNlJyxcbiAgICAgIHN0YXR1czogJ2luX3JldmlldycsXG4gICAgICBxdW90ZV9kYXRlOiBjZWxgZGF5c0FnbygzKWAsXG4gICAgICBleHBpcmF0aW9uX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygyNylgLFxuICAgICAgLi4ucXVvdGVUb3RhbHMoJ1dheW5lIEVudGVycHJpc2UgTGljZW5zZSBRdW90ZScsIHsgZGlzY291bnQ6IDE1LCB0YXg6IDgxNjAwLCBzaGlwcGluZ19oYW5kbGluZzogMCB9KSxcbiAgICAgIHBheW1lbnRfdGVybXM6ICduZXRfNjAnLFxuICAgICAgZGVzY3JpcHRpb246ICdNdWx0aS15ZWFyIGVudGVycHJpc2UgbGljZW5zZSB3aXRoIHZvbHVtZSBkaXNjb3VudC4nLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0luaXRlY2ggQ2xvdWQgTWlncmF0aW9uIEVzdGltYXRlJyxcbiAgICAgIGNybV9hY2NvdW50OiAnSW5pdGVjaCBTb2x1dGlvbnMnLFxuICAgICAgY3JtX2NvbnRhY3Q6ICdtY2hlbkBpbml0ZWNoLmV4YW1wbGUuY29tJyxcbiAgICAgIGNybV9vcHBvcnR1bml0eTogJ0luaXRlY2ggQ2xvdWQgTWlncmF0aW9uJyxcbiAgICAgIHN0YXR1czogJ2RyYWZ0JyxcbiAgICAgIHF1b3RlX2RhdGU6IGNlbGBkYXlzQWdvKDEpYCxcbiAgICAgIGV4cGlyYXRpb25fZGF0ZTogY2VsYGRheXNGcm9tTm93KDI5KWAsXG4gICAgICAuLi5xdW90ZVRvdGFscygnSW5pdGVjaCBDbG91ZCBNaWdyYXRpb24gRXN0aW1hdGUnLCB7IGRpc2NvdW50OiAwLCB0YXg6IDY0MDAsIHNoaXBwaW5nX2hhbmRsaW5nOiAwIH0pLFxuICAgICAgcGF5bWVudF90ZXJtczogJ25ldF8zMCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0Nsb3VkIG1pZ3JhdGlvbiBzZXJ2aWNlcywgYXdhaXRpbmcgaW50ZXJuYWwgcmV2aWV3LicsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnU3RhcmsgTWVkaWNhbCBQaWxvdCBRdW90ZScsXG4gICAgICBjcm1fYWNjb3VudDogJ1N0YXJrIE1lZGljYWwnLFxuICAgICAgY3JtX2NvbnRhY3Q6ICdlbWlseS5kQHN0YXJrbWVkLmV4YW1wbGUuY29tJyxcbiAgICAgIHN0YXR1czogJ3JlamVjdGVkJyxcbiAgICAgIHF1b3RlX2RhdGU6IGNlbGBkYXlzQWdvKDYwKWAsXG4gICAgICBleHBpcmF0aW9uX2RhdGU6IGNlbGBkYXlzQWdvKDMwKWAsXG4gICAgICAuLi5xdW90ZVRvdGFscygnU3RhcmsgTWVkaWNhbCBQaWxvdCBRdW90ZScsIHsgZGlzY291bnQ6IDAsIHRheDogMzYwMCwgc2hpcHBpbmdfaGFuZGxpbmc6IDAgfSksXG4gICAgICBwYXltZW50X3Rlcm1zOiAnbmV0XzMwJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUGlsb3QgcHJvamVjdCBxdW90ZSwgcmVqZWN0ZWQgZHVlIHRvIGJ1ZGdldCBjb25zdHJhaW50cy4nLFxuICAgICAgaW50ZXJuYWxfbm90ZXM6ICdDdXN0b21lciByZXF1ZXN0ZWQgcmUtcXVvdGUgd2l0aCBzbWFsbGVyIHNjb3BlLicsXG4gICAgfSxcbiAgXVxufSk7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBRdW90ZSBsaW5lIGl0ZW1zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gU2FtZSBjb21wb3NpdGUta2V5IHJlYXNvbmluZyBhcyB0aGUgb3Bwb3J0dW5pdHkgbGluZXMgYWJvdmU6IChxdW90ZSxcbi8vIHByb2R1Y3QpIGlzIHRoZSBvbmx5IG5hdHVyYWwga2V5IHRoaXMganVuY3Rpb24tc2hhcGVkIG9iamVjdCBoYXMuXG5leHBvcnQgY29uc3QgcXVvdGVMaW5lSXRlbXMgPSBkZWZpbmVTZWVkKFF1b3RlTGluZUl0ZW0sIHtcbiAgbW9kZTogJ3Vwc2VydCcsXG4gIGV4dGVybmFsSWQ6IFsnY3JtX3F1b3RlJywgJ2NybV9wcm9kdWN0J10sXG4gIHJlY29yZHM6IGxpbmVJdGVtUmVjb3JkcygnY3JtX3F1b3RlJywgUVVPVEVfTElORVMpLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2RhdGEvc2VydmljZS5zZWVkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZGF0YVwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2RhdGEvc2VydmljZS5zZWVkLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFNlcnZpY2Ugc2VlZHMgXHUyMDE0IHRoZSBjYXNlIGJhY2tsb2cgYW5kIHRoZSBrbm93bGVkZ2UgYmFzZS5cbiAqXG4gKiBUaGUgdGFzayBsaXN0IGFuZCB0aGUgaW50ZXJhY3Rpb24gbG9nIHVzZWQgdG8gYmUgaGVyZSB0b286IHRhc2tzLCBldmVudHMgYW5kXG4gKiBldmVudCBhdHRlbmRlZXMgYXJlIHRoZSBhY3Rpdml0eSBsYXllciBvdmVyIGV2ZXJ5IG9iamVjdCwgYW5kIHRoZSBjYXNlIHNlZWRzXG4gKiBhcmUgdGhlIHJlY29yZHMgdGhleSBtb3N0IG9mdGVuIGhhbmcgb2ZmICgjNjcxKS4gVGhvc2UgdGhyZWUgb2JqZWN0cyBhcmUgdGhlXG4gKiBTQUxFUyBwYWNrYWdlJ3MgdW5kZXIgdGhlIEFEUi0wMTMwIGxheW91dCAocGxhbiBpdGVtIDQgXHUyMDE0IHRoZSBhY3Rpdml0eVxuICogb2JqZWN0cyBmb2xkIGludG8gdGhlIGFwcCBwYWNrYWdlKSwgc28gdGhlaXIgcm93cyBtb3ZlZCB3aXRoIHRoZW0gdG9cbiAqIGBzcmMvc2FsZXMvZGF0YS9hY3Rpdml0eS5zZWVkLnRzYC4gTm90aGluZyBhYm91dCB0aGUgcm93cyBjaGFuZ2VkOiB0aGV5IHN0aWxsXG4gKiByZWZlcmVuY2UgY2FzZXMgYnkgbmF0dXJhbCBrZXkuIFRoZXNlIGNhc2Ugcm93cyBhcmUgcmVnaXN0ZXJlZCBieSB0aGUgc2VydmljZVxuICogcGFja2FnZSBhbmQgdGhlIGFjdGl2aXR5IHJvd3MgYnkgdGhlIGFwcCBwYWNrYWdlOyBtZWFzdXJlZCBvbiBhIGZyZXNoIGJvb3RcbiAqIG9mIHRoZSB0d28tcGFja2FnZSBhcnRpZmFjdCAoIzE5MDcpLCB0aGUgbG9va3VwcyByZXNvbHZlIGluIGJvdGggZGlyZWN0aW9ucyBcdTIwMTRcbiAqIGV2ZXJ5IHNlZWRlZCBjYXNlJ3MgYWNjb3VudCwgYW5kIGV2ZXJ5IHNlZWRlZCBldmVudCdzIGNhc2UuXG4gKlxuICogU3BsaXQgb3V0IG9mIHRoZSBmb3JtZXIgbW9ub2xpdGhpYyBgc3JjL2RhdGEvaW5kZXgudHNgICgjNjM1KS4gU2VlZCBkb2N0cmluZVxuICogbGl2ZXMgaW4gYHNyYy9zYWxlcy9kYXRhL19zaGFyZWQudHNgLlxuICovXG5pbXBvcnQgeyBkZWZpbmVTZWVkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgeyBDYXNlIH0gZnJvbSAnLi4vb2JqZWN0cy9jYXNlLm9iamVjdCc7XG5pbXBvcnQgeyBLbm93bGVkZ2VBcnRpY2xlIH0gZnJvbSAnLi4vb2JqZWN0cy9rbm93bGVkZ2VfYXJ0aWNsZS5vYmplY3QnO1xuaW1wb3J0IHsgQ0FTRV9TTEFfREVGQVVMVF9USUVSLCBjYXNlU2xhQnJlYWNoZWQsIGNhc2VTbGFDYWxlbmRhckhvdXJzIH0gZnJvbSAnLi4vb2JqZWN0cy9fY2FzZS1zbGEnO1xuaW1wb3J0IHsgY2VsRGF5c0FnbyB9IGZyb20gJy4uLy4uL3NhbGVzL2RhdGEvX3NoYXJlZCc7XG5pbXBvcnQgeyBhY2NvdW50cyB9IGZyb20gJy4uLy4uL3NhbGVzL2RhdGEvc2FsZXMuc2VlZCc7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTZWVkZWQgU0xBIGR1ZSBkYXRlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vXG4vLyBIb29rcyBkbyBub3QgcnVuIG92ZXIgc2VlZHMsIHNvIGEgaG9vay1vd25lZCBmaWVsZCBoYXMgdG8gYXJyaXZlIGFscmVhZHlcbi8vIGhvbGRpbmcgd2hhdCB0aGUgaG9vayB3b3VsZCBoYXZlIGNvbXB1dGVkIChgdGVzdC9zZWVkLWNvbnNpc3RlbmN5LnRlc3QudHNgXG4vLyBpcyB0aGUgZW5mb3JjZW1lbnQpLiBgc2xhX2R1ZV9kYXRlYCB1c2VkIHRvIGJlIGhhbmQtdHlwZWQgcGVyIGNhc2UgXHUyMDE0IGVpZ2h0XG4vLyBudW1iZXJzIHBpY2tlZCB0byBsb29rIHBsYXVzaWJsZSBcdTIwMTQgYW5kIGl0IGlzIG5vdyBERVJJVkVEIGZyb20gdGhlIHNhbWVcbi8vIHByaW9yaXR5IFx1MDBENyBhY2NvdW50LXRpZXIgbWF0cml4IGBjYXNlX3NsYV9kZWZhdWx0c2AgYXBwbGllcywgc28gYSBjZWxsIGNoYW5nZVxuLy8gbW92ZXMgdGhlIGRlbW8gZGF0YSB3aXRoIGl0IGluc3RlYWQgb2YgbGVhdmluZyBpdCBseWluZy5cbi8vXG4vLyBUaGUgYWNjb3VudCB0aWVyIGlzIHJlYWQgb2ZmIHRoZSBhY2NvdW50IHNlZWQgaXRzZWxmIHJhdGhlciB0aGFuIGNvcGllZCBpbnRvXG4vLyBhIHRhYmxlIGhlcmU6IGBjcm1fYWNjb3VudC50aWVyYCBpcyB0aGUgaW5wdXQgdGhlIG1hdHJpeCB0YWtlcywgYW5kIHRoZXJlIGlzXG4vLyBubyByZWFzb24gZm9yIHRoaXMgZmlsZSB0byBob2xkIGEgc2Vjb25kIG9waW5pb24gYWJvdXQgd2hpY2ggdGllciBBY21lIGlzLlxuY29uc3QgVElFUl9CWV9BQ0NPVU5UID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oXG4gIChhY2NvdW50cy5yZWNvcmRzIGFzIFJlYWRvbmx5QXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KS5tYXAoKGEpID0+IFtcbiAgICBTdHJpbmcoYS5uYW1lKSxcbiAgICB0eXBlb2YgYS50aWVyID09PSAnc3RyaW5nJyA/IGEudGllciA6IENBU0VfU0xBX0RFRkFVTFRfVElFUixcbiAgXSksXG4pO1xuXG4vKiogVGhlIG1hdHJpeCBjZWxsIGBjYXNlX3NsYV9kZWZhdWx0c2Agd291bGQgaGF2ZSBhcHBsaWVkLCBpbiBjYWxlbmRhciBob3VycyBhZnRlciBjcmVhdGlvbi4gKi9cbmNvbnN0IHNlZWRlZFNsYUhvdXJzID0gKHByaW9yaXR5OiBzdHJpbmcsIGFjY291bnROYW1lPzogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgaG91cnMgPSBjYXNlU2xhQ2FsZW5kYXJIb3Vycyhwcmlvcml0eSwgYWNjb3VudE5hbWUgPyBUSUVSX0JZX0FDQ09VTlQuZ2V0KGFjY291bnROYW1lKSA6IHVuZGVmaW5lZCk7XG4gIGlmIChob3VycyA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYHNlZWQ6IG5vIFNMQSBtYXRyaXggcm93IGZvciBwcmlvcml0eSBcIiR7cHJpb3JpdHl9XCJgKTtcbiAgcmV0dXJuIGhvdXJzO1xufTtcblxuLyoqXG4gKiBgY3JlYXRlZF9hdCArIG1hdHJpeChwcmlvcml0eSwgdGllcilgLCBhcyBhIENFTCBleHByZXNzaW9uIFx1MjAxNCB0aGUgY2FzZSdzXG4gKiBhdXRob3JlZCBjcmVhdGlvbiBpbnN0YW50ICh0aGUgcGxhdGZvcm0ncyBvd24gYGNyZWF0ZWRfYXRgLCB3aGljaCB0aGUgc2VlZFxuICogbG9hZGVyIGtlZXBzIG9uIGZpcnN0IGluc2VydCBzaW5jZSBAb2JqZWN0c3RhY2svb2JqZWN0cWwgMTcuNy4wLFxuICogb2JqZWN0c3RhY2sjMjE2NDYpIHBsdXMgdGhlIGNlbGwgYGNhc2Vfc2xhX2RlZmF1bHRzYCB3b3VsZCBoYXZlIGFwcGxpZWQuXG4gKlxuICogYGRheXNBZ28obilgIGlzIGEgVVRDIG1pZG5pZ2h0LCBzbyB0aGUgaG91ciBvZmZzZXQgaGFzIHRvIGJlIGFkZGVkIG9uIHRvcCBvZlxuICogaXQgXHUyMDE0IGhlbmNlIGArIGR1cmF0aW9uKCdOaCcpYCByYXRoZXIgdGhhbiBhIHNlY29uZCBkYXktZ3JhbnVsYXIgaGVscGVyLlxuICpcbiAqIEEgZHVlIGRhdGUgdGhhdCBsYW5kcyBpbiB0aGUgcGFzdCBpcyBleHBlY3RlZCBhbmQgY29ycmVjdCBvbiBhbiBvbGQgb3BlbiBjYXNlXG4gKiBcdTIwMTQgdGhhdCBpcyB3aGF0IGEgYnJlYWNoIElTLiBPbiBhbiBPUEVOIGNhc2UgdGhlIGZsYWcgaXMgYGNhc2Vfc2xhX21vbml0b3JgJ3NcbiAqIHRvIHdyaXRlLCBvbiBhIGRlcGxveW1lbnQgdGhhdCBydW5zIHNjaGVkdWxlZCB3b3JrLCBhbmQgdGhlIHNlZWQgb25seSBwcmUtc2V0c1xuICogaXQgd2hlcmUgdGhlIGRlbW8gd2FudHMgYSBicmVhY2ggdmlzaWJsZSB3aXRob3V0IGEgc3dlZXAuXG4gKi9cbmNvbnN0IGNlbENhc2VTbGFEdWUgPSAoY3JlYXRlZERheXNBZ286IG51bWJlciwgcHJpb3JpdHk6IHN0cmluZywgYWNjb3VudE5hbWU/OiBzdHJpbmcpID0+XG4gIGNlbGBkYXlzQWdvKCR7Y3JlYXRlZERheXNBZ299KSArIGR1cmF0aW9uKCcke3NlZWRlZFNsYUhvdXJzKHByaW9yaXR5LCBhY2NvdW50TmFtZSl9aCcpYDtcblxuLyoqXG4gKiBgaXNfc2xhX3Zpb2xhdGVkYCBvZiBhIFNFVFRMRUQgY2FzZSAocmVzb2x2ZWQgb3IgY2xvc2VkKSBcdTIwMTQgREVSSVZFRCwgbmV2ZXJcbiAqIHBpY2tlZCAoIzIwNzApLiBgY2FzZV9zbGFfZGVmYXVsdHNgIHJlY29yZHMgdGhlIGJyZWFjaCBvbiB0aGUgd3JpdGUgdGhhdFxuICogc2V0dGxlcyBhIGNhc2UgYWZ0ZXIgaXRzIGR1ZSBkYXRlLCBzbyBhIHNldHRsZWQgc2VlZCByb3cgaGFzIHRvIGFycml2ZVxuICogaG9sZGluZyBleGFjdGx5IHdoYXQgdGhhdCB3cml0ZSB3b3VsZCBoYXZlIHJlY29yZGVkOiBgY2FzZVNsYUJyZWFjaGVkYCBvdmVyXG4gKiB0aGUgcm93J3Mgb3duIGRhdGVzLiBCb3RoIGluc3RhbnRzIGFyZSBvZmZzZXRzIGZyb20gdGhlIHNhbWUgYGRheXNBZ28oKWBcbiAqIG1pZG5pZ2h0IFx1MjAxNCB0aGUgZHVlIGRhdGUgYG1hdHJpeChwcmlvcml0eSwgdGllcilgIGhvdXJzIGFmdGVyIGNyZWF0aW9uLCB0aGVcbiAqIHNldHRsZSBpbnN0YW50IChgY2xvc2VkX2RhdGVgLCB3aGljaCBhIHNldHRsZWQgc2VlZCByb3cgY2FycmllcyBhcyBpdHNcbiAqIHJlc29sdmVkLWRhdGUgcHJveHkpIHdob2xlIGRheXMgYWZ0ZXIgaXQgXHUyMDE0IHNvIHRoZSBob3VyIGNvdW50cyBjb21wYXJlXG4gKiBkaXJlY3RseSwgYW5kIGEgY2FzZSBzZXR0bGVkIGV4YWN0bHkgb24gaXRzIGRlYWRsaW5lIG1ldCBpdC5cbiAqXG4gKiBUaGVzZSByb3dzIHVzZWQgdG8gYmUgYXV0aG9yZWQgYGZhbHNlYCBhY3Jvc3MgdGhlIGJvYXJkLCB3aGljaCBtYWRlIHRoZVxuICogYHNsYV9wZXJmb3JtYW5jZWAgcmVwb3J0IGFuZCB0aGUgY29tcGxpYW5jZSBnYXVnZSByZWFkIDEwMCUgbWV0IG92ZXIgY2xvc2VkXG4gKiBjYXNlcyB0aGF0IGhhZCBmaW5pc2hlZCBkYXlzIGxhdGUgYnkgdGhlaXIgb3duIGRhdGVzLlxuICovXG5jb25zdCBzZWVkZWRTZXR0bGVkQnJlYWNoID0gKFxuICBjcmVhdGVkRGF5c0FnbzogbnVtYmVyLFxuICBzZXR0bGVkRGF5c0FnbzogbnVtYmVyLFxuICBwcmlvcml0eTogc3RyaW5nLFxuICBhY2NvdW50TmFtZT86IHN0cmluZyxcbik6IGJvb2xlYW4gPT4gY2FzZVNsYUJyZWFjaGVkKHNlZWRlZFNsYUhvdXJzKHByaW9yaXR5LCBhY2NvdW50TmFtZSksIChjcmVhdGVkRGF5c0FnbyAtIHNldHRsZWREYXlzQWdvKSAqIDI0KTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENhc2VzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IGNvbnN0IGNhc2VzID0gZGVmaW5lU2VlZChDYXNlLCB7XG4gIG1vZGU6ICd1cHNlcnQnLFxuICBleHRlcm5hbElkOiAnc3ViamVjdCcsXG4gIHJlY29yZHM6IFtcbiAgICB7XG4gICAgICBzdWJqZWN0OiAnTG9naW4gaXNzdWVzIGFmdGVyIHBsYXRmb3JtIHVwZ3JhZGUnLFxuICAgICAgZGVzY3JpcHRpb246IGBVc2VycyBpbiB0aGUgRU1FQSBvZmZpY2UgcmVwb3J0IGludGVybWl0dGVudCA0MDEgZXJyb3JzIHdoZW4gbG9nZ2luZyBpbiBhZnRlciB0aGUgdjQuMiB1cGdyYWRlIHJvbGxlZCBvdXQgV2VkbmVzZGF5IG5pZ2h0LiBQYXR0ZXJuOiBvbmx5IGFmZmVjdHMgdXNlcnMgYXV0aGVudGljYXRpbmcgdmlhIFNBTUwgdGhyb3VnaCBPa3RhLCBvbmx5IGJldHdlZW4gMDk6MDBcdTIwMTMxMDozMCBVVEMuIE5BIGFuZCBBUEFDIHVzZXJzIGFyZSB1bmFmZmVjdGVkLlxuXG4qKkN1c3RvbWVyIGltcGFjdDoqKiB+NDAgdXNlcnMgYmxvY2tlZCBhdCBwZWFrLCBjb3N0aW5nIH4zIHByb2R1Y3RpdmUgaG91cnMgcGVyIGFmZmVjdGVkIHVzZXIuXG5cbioqSW5pdGlhbCB0cmlhZ2U6KiogU3VzcGVjdCBhIGNsb2NrLXNrZXcgaXNzdWUgb24gdGhlIEVNRUEgU1NPIHJlbGF5IGFkZGVkIGR1cmluZyB0aGUgdXBncmFkZSB3aW5kb3cuIEVuZ2luZWVyaW5nIGlzIHJlcHJvZHVjaW5nIGluIHN0YWdpbmcuYCxcbiAgICAgIGNybV9hY2NvdW50OiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICBjcm1fY29udGFjdDogJ2pvaG4uc21pdGhAYWNtZS5leGFtcGxlLmNvbScsXG4gICAgICBzdGF0dXM6ICdpbl9wcm9ncmVzcycsXG4gICAgICBwcmlvcml0eTogJ2hpZ2gnLFxuICAgICAgcHJpb3JpdHlfcmFuazogMyxcbiAgICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICAgIG9yaWdpbjogJ2VtYWlsJyxcbiAgICAgIGlzX2Nsb3NlZDogZmFsc2UsXG4gICAgICBpc19zbGFfdmlvbGF0ZWQ6IGZhbHNlLFxuICAgICAgaXNfZXNjYWxhdGVkOiBmYWxzZSxcbiAgICAgIGNyZWF0ZWRfYXQ6IGNlbGBkYXlzQWdvKDIpYCxcbiAgICAgIHNsYV9kdWVfZGF0ZTogY2VsQ2FzZVNsYUR1ZSgyLCAnaGlnaCcsICdBY21lIENvcnBvcmF0aW9uJyksXG4gICAgfSxcbiAgICB7XG4gICAgICBzdWJqZWN0OiAnRGF0YSBleHBvcnQgdGltaW5nIG91dCBmb3IgbGFyZ2UgZGF0YXNldHMnLFxuICAgICAgZGVzY3JpcHRpb246ICdDU1YgZXhwb3J0IGZhaWxzIGZvciBkYXRhc2V0cyBvdmVyIDEwayByb3dzLicsXG4gICAgICBjcm1fYWNjb3VudDogJ0dsb2JleCBJbmR1c3RyaWVzJyxcbiAgICAgIGNybV9jb250YWN0OiAnc2FyYWguakBnbG9iZXguZXhhbXBsZS5jb20nLFxuICAgICAgc3RhdHVzOiAnZXNjYWxhdGVkJyxcbiAgICAgIHByaW9yaXR5OiAnY3JpdGljYWwnLFxuICAgICAgcHJpb3JpdHlfcmFuazogNCxcbiAgICAgIHR5cGU6ICdidWcnLFxuICAgICAgb3JpZ2luOiAncGhvbmUnLFxuICAgICAgaXNfY2xvc2VkOiBmYWxzZSxcbiAgICAgIGlzX3NsYV92aW9sYXRlZDogdHJ1ZSxcbiAgICAgIGlzX2VzY2FsYXRlZDogdHJ1ZSxcbiAgICAgIGVzY2FsYXRpb25fcmVhc29uOiAnQ3VzdG9tZXIgdGhyZWF0ZW5pbmcgY2h1cm4nLFxuICAgICAgY3JlYXRlZF9hdDogY2VsYGRheXNBZ28oNSlgLFxuICAgICAgc2xhX2R1ZV9kYXRlOiBjZWxDYXNlU2xhRHVlKDUsICdjcml0aWNhbCcsICdHbG9iZXggSW5kdXN0cmllcycpLFxuICAgIH0sXG4gICAge1xuICAgICAgc3ViamVjdDogJ0hvdyB0byBjb25maWd1cmUgU1NPIHdpdGggT2t0YT8nLFxuICAgICAgZGVzY3JpcHRpb246ICdDdXN0b21lciBuZWVkcyBndWlkYW5jZSBvbiBTU08gc2V0dXAgd2l0aCBPa3RhLicsXG4gICAgICBjcm1fYWNjb3VudDogJ0luaXRlY2ggU29sdXRpb25zJyxcbiAgICAgIGNybV9jb250YWN0OiAnbWNoZW5AaW5pdGVjaC5leGFtcGxlLmNvbScsXG4gICAgICBzdGF0dXM6ICdyZXNvbHZlZCcsXG4gICAgICBwcmlvcml0eTogJ21lZGl1bScsXG4gICAgICBwcmlvcml0eV9yYW5rOiAyLFxuICAgICAgdHlwZTogJ3F1ZXN0aW9uJyxcbiAgICAgIG9yaWdpbjogJ3dlYicsXG4gICAgICAvLyBSZXNvbHZlZC1idXQtbm90LWNsb3NlZDogY2FzZS5ob29rIGtlZXBzIGlzX2Nsb3NlZD1mYWxzZSBhbmQgc3RhbXBzXG4gICAgICAvLyBjbG9zZWRfZGF0ZSBhcyB0aGUgcmVzb2x2ZWQtZGF0ZSBwcm94eTsgcmVzb2x1dGlvbl90aW1lX2hvdXJzIGlzIHRoZVxuICAgICAgLy8gY2xvc2VkXHUyMjEyY3JlYXRlZCBkZWx0YSB0aGUgaG9vayB3b3VsZCBjb21wdXRlIChkYXlzQWdvKCkgaXMgZGF5LWdyYW51bGFyLFxuICAgICAgLy8gc28gZGVsdGFzIGNvbWUgaW4gMjRoIHN0ZXBzKS5cbiAgICAgIGlzX2Nsb3NlZDogZmFsc2UsXG4gICAgICBpc19zbGFfdmlvbGF0ZWQ6IHNlZWRlZFNldHRsZWRCcmVhY2goMywgMiwgJ21lZGl1bScsICdJbml0ZWNoIFNvbHV0aW9ucycpLFxuICAgICAgaXNfZXNjYWxhdGVkOiBmYWxzZSxcbiAgICAgIHJlc29sdXRpb25fdGltZV9ob3VyczogMjQuMCxcbiAgICAgIGNyZWF0ZWRfYXQ6IGNlbGBkYXlzQWdvKDMpYCxcbiAgICAgIGNsb3NlZF9kYXRlOiBjZWxgZGF5c0FnbygyKWAsXG4gICAgICBzbGFfZHVlX2RhdGU6IGNlbENhc2VTbGFEdWUoMywgJ21lZGl1bScsICdJbml0ZWNoIFNvbHV0aW9ucycpLFxuICAgIH0sXG4gICAge1xuICAgICAgc3ViamVjdDogJ0FQSSByYXRlIGxpbWl0IGV4Y2VlZGVkIG9uIHByb2R1Y3Rpb24nLFxuICAgICAgZGVzY3JpcHRpb246ICdQcm9kdWN0aW9uIGVudmlyb25tZW50IGhpdHRpbmcgcmF0ZSBsaW1pdHMgZHVyaW5nIHBlYWsgaG91cnMuJyxcbiAgICAgIGNybV9hY2NvdW50OiAnV2F5bmUgRW50ZXJwcmlzZXMnLFxuICAgICAgY3JtX2NvbnRhY3Q6ICdyd2lsc29uQHdheW5lLmV4YW1wbGUuY29tJyxcbiAgICAgIHN0YXR1czogJ2Nsb3NlZCcsXG4gICAgICBwcmlvcml0eTogJ2hpZ2gnLFxuICAgICAgcHJpb3JpdHlfcmFuazogMyxcbiAgICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICAgIG9yaWdpbjogJ2NoYXQnLFxuICAgICAgaXNfY2xvc2VkOiB0cnVlLFxuICAgICAgaXNfc2xhX3Zpb2xhdGVkOiBzZWVkZWRTZXR0bGVkQnJlYWNoKDcsIDYsICdoaWdoJywgJ1dheW5lIEVudGVycHJpc2VzJyksXG4gICAgICBpc19lc2NhbGF0ZWQ6IGZhbHNlLFxuICAgICAgLy8gYHJlc29sdXRpb25gIGlzIFJFUVVJUkVEIHdoZW4gc3RhdHVzIGlzICdjbG9zZWQnIChvYmplY3QgdmFsaWRhdGlvblxuICAgICAgLy8gYHJlc29sdXRpb25fcmVxdWlyZWRfZm9yX2Nsb3NlZGApIFx1MjAxNCB3aXRob3V0IGl0IHRoZSBzZWVkIHJvdyBpcyByZWplY3RlZC5cbiAgICAgIHJlc29sdXRpb246ICdSYWlzZWQgdGhlIHByb2R1Y3Rpb24gcmF0ZS1saW1pdCB0aWVyIGFuZCBhZGRlZCBjbGllbnQtc2lkZSBiYWNrb2ZmOyB1c2FnZSBub3cgd2l0aGluIGxpbWl0cy4nLFxuICAgICAgLy8gVGhlIGRlZmxlY3Rpb24gbGluayAoIzYwMSk6IHRoaXMgY2FzZSB3YXMgYW5zd2VyZWQgb3V0IG9mIHRoZSBrbm93bGVkZ2VcbiAgICAgIC8vIGJhc2UsIHNvIGl0IG5hbWVzIHRoZSBhcnRpY2xlIHRoYXQgcmVzb2x2ZWQgaXQuIFJlZmVyZW5jZWQgYnkgdGhlXG4gICAgICAvLyBhcnRpY2xlIHNlZWQncyBgZXh0ZXJuYWxJZGAgKGB0aXRsZWApLCB0aGUgc2FtZSB3YXkgZXZlcnkgb3RoZXIgc2VlZGVkXG4gICAgICAvLyBsb29rdXAgbmFtZXMgaXRzIHRhcmdldC5cbiAgICAgIHJlc29sdmVkX2J5X2FydGljbGU6ICdBUEkgUmF0ZSBMaW1pdHMnLFxuICAgICAgLy8gY2xvc2VkXHUyMjEyY3JlYXRlZCBkZWx0YSwgYXMgY2FzZS5ob29rIGNvbXB1dGVzIGl0LlxuICAgICAgcmVzb2x1dGlvbl90aW1lX2hvdXJzOiAyNC4wLFxuICAgICAgY3JlYXRlZF9hdDogY2VsYGRheXNBZ28oNylgLFxuICAgICAgY2xvc2VkX2RhdGU6IGNlbGBkYXlzQWdvKDYpYCxcbiAgICAgIHNsYV9kdWVfZGF0ZTogY2VsQ2FzZVNsYUR1ZSg3LCAnaGlnaCcsICdXYXluZSBFbnRlcnByaXNlcycpLFxuICAgIH0sXG4gICAge1xuICAgICAgc3ViamVjdDogJ1BERiByZXBvcnRzIG5vdCByZW5kZXJpbmcgY2hhcnRzIGNvcnJlY3RseScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NoYXJ0cyBhcHBlYXIgYmxhbmsgd2hlbiBleHBvcnRpbmcgZGFzaGJvYXJkIHRvIFBERi4nLFxuICAgICAgY3JtX2FjY291bnQ6ICdTdGFyayBNZWRpY2FsJyxcbiAgICAgIGNybV9jb250YWN0OiAnZW1pbHkuZEBzdGFya21lZC5leGFtcGxlLmNvbScsXG4gICAgICBzdGF0dXM6ICduZXcnLFxuICAgICAgcHJpb3JpdHk6ICdtZWRpdW0nLFxuICAgICAgcHJpb3JpdHlfcmFuazogMixcbiAgICAgIHR5cGU6ICdidWcnLFxuICAgICAgb3JpZ2luOiAnZW1haWwnLFxuICAgICAgaXNfY2xvc2VkOiBmYWxzZSxcbiAgICAgIGlzX3NsYV92aW9sYXRlZDogZmFsc2UsXG4gICAgICBpc19lc2NhbGF0ZWQ6IGZhbHNlLFxuICAgICAgY3JlYXRlZF9hdDogY2VsYGRheXNBZ28oMSlgLFxuICAgICAgc2xhX2R1ZV9kYXRlOiBjZWxDYXNlU2xhRHVlKDEsICdtZWRpdW0nLCAnU3RhcmsgTWVkaWNhbCcpLFxuICAgIH0sXG4gICAge1xuICAgICAgc3ViamVjdDogJ0JpbGxpbmcgZGlzY3JlcGFuY3kgb24gbGFzdCBpbnZvaWNlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBgQ3VzdG9tZXIgKExpc2EgS2ltLCBQcm9jdXJlbWVudCkgZmxhZ2dlZCB0aGF0IHRoZSBNYXkgaW52b2ljZSBzaG93cyAxNSBhY3RpdmUgc2VhdHMgYnV0IEFjbWUgaXMgb25seSB1c2luZyAxMi4gVHdvIG9mIHRoZSBzZWF0cyB3ZXJlIGRlLXByb3Zpc2lvbmVkIGluIGVhcmx5IEFwcmlsIHdoZW4gdHdvIGVuZ2luZWVycyBsZWZ0IHRoZSBjb21wYW55LlxuXG4qKlJvb3QgY2F1c2U6KiogdGhlIGRlLXByb3Zpc2lvbmluZyBoYXBwZW5lZCBpbiBvdXIgYWRtaW4gY29uc29sZSBidXQgdGhlIHNlYXQtY291bnQgbWV0cmljIGluIGJpbGxpbmcgb25seSByZWZyZXNoZXMgbW9udGhseSwgc28gdGhlIE1heSBpbnZvaWNlIHBpY2tlZCB1cCB0aGUgcHJlLWNoYW5nZSBjb3VudC5cblxuKipSZXNvbHV0aW9uIHBhdGg6KiogaXNzdWUgYSAkMSwyMDAgY3JlZGl0IG1lbW8gYW5kIHN3aXRjaCBBY21lIHRvIHRoZSBuZXcgcmVhbC10aW1lIHNlYXQtYmlsbGluZyBwaXBlbGluZSBzbyB0aGlzIGNhbid0IHJlY3VyLiBXYWl0aW5nIG9uIExpc2EgdG8gY29uZmlybSBzaGUncyBnb29kIHdpdGggdGhlIGNyZWRpdC1tZW1vIHRyZWF0bWVudCB2cyBhIHJlZnVuZC5gLFxuICAgICAgY3JtX2FjY291bnQ6ICdBY21lIENvcnBvcmF0aW9uJyxcbiAgICAgIGNybV9jb250YWN0OiAnam9obi5zbWl0aEBhY21lLmV4YW1wbGUuY29tJyxcbiAgICAgIHN0YXR1czogJ3dhaXRpbmdfY3VzdG9tZXInLFxuICAgICAgcHJpb3JpdHk6ICdsb3cnLFxuICAgICAgcHJpb3JpdHlfcmFuazogMSxcbiAgICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICAgIG9yaWdpbjogJ2VtYWlsJyxcbiAgICAgIGlzX2Nsb3NlZDogZmFsc2UsXG4gICAgICBpc19zbGFfdmlvbGF0ZWQ6IGZhbHNlLFxuICAgICAgaXNfZXNjYWxhdGVkOiBmYWxzZSxcbiAgICAgIGNyZWF0ZWRfYXQ6IGNlbGBkYXlzQWdvKDQpYCxcbiAgICAgIHNsYV9kdWVfZGF0ZTogY2VsQ2FzZVNsYUR1ZSg0LCAnbG93JywgJ0FjbWUgQ29ycG9yYXRpb24nKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHN1YmplY3Q6ICdNb2JpbGUgYXBwIGNyYXNoZXMgb24gaU9TIDE3JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQXBwIGNyYXNoZXMgb24gbGF1bmNoIGZvciB1c2VycyBydW5uaW5nIGlPUyAxNy4yKy4nLFxuICAgICAgY3JtX2FjY291bnQ6ICdHbG9iZXggSW5kdXN0cmllcycsXG4gICAgICBjcm1fY29udGFjdDogJ3NhcmFoLmpAZ2xvYmV4LmV4YW1wbGUuY29tJyxcbiAgICAgIHN0YXR1czogJ2luX3Byb2dyZXNzJyxcbiAgICAgIHByaW9yaXR5OiAnY3JpdGljYWwnLFxuICAgICAgcHJpb3JpdHlfcmFuazogNCxcbiAgICAgIHR5cGU6ICdidWcnLFxuICAgICAgb3JpZ2luOiAnd2ViJyxcbiAgICAgIGlzX2Nsb3NlZDogZmFsc2UsXG4gICAgICBpc19zbGFfdmlvbGF0ZWQ6IHRydWUsXG4gICAgICBpc19lc2NhbGF0ZWQ6IHRydWUsXG4gICAgICBlc2NhbGF0aW9uX3JlYXNvbjogJ0FmZmVjdHMgMzAlIG9mIG1vYmlsZSB1c2VycycsXG4gICAgICBjcmVhdGVkX2F0OiBjZWxgZGF5c0FnbygzKWAsXG4gICAgICBzbGFfZHVlX2RhdGU6IGNlbENhc2VTbGFEdWUoMywgJ2NyaXRpY2FsJywgJ0dsb2JleCBJbmR1c3RyaWVzJyksXG4gICAgfSxcbiAgICB7XG4gICAgICBzdWJqZWN0OiAnUmVxdWVzdDogYnVsayBpbXBvcnQgdmlhIENTVicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0N1c3RvbWVyIHJlcXVlc3RpbmcgYWJpbGl0eSB0byBpbXBvcnQgcmVjb3JkcyB2aWEgQ1NWIHVwbG9hZC4nLFxuICAgICAgY3JtX2FjY291bnQ6ICdXYXluZSBFbnRlcnByaXNlcycsXG4gICAgICBjcm1fY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLFxuICAgICAgc3RhdHVzOiAnY2xvc2VkJyxcbiAgICAgIHByaW9yaXR5OiAnbG93JyxcbiAgICAgIHByaW9yaXR5X3Jhbms6IDEsXG4gICAgICB0eXBlOiAnZmVhdHVyZV9yZXF1ZXN0JyxcbiAgICAgIG9yaWdpbjogJ3dlYicsXG4gICAgICBpc19jbG9zZWQ6IHRydWUsXG4gICAgICBpc19zbGFfdmlvbGF0ZWQ6IHNlZWRlZFNldHRsZWRCcmVhY2goMTAsIDgsICdsb3cnLCAnV2F5bmUgRW50ZXJwcmlzZXMnKSxcbiAgICAgIGlzX2VzY2FsYXRlZDogZmFsc2UsXG4gICAgICAvLyBSZXF1aXJlZCBmb3IgY2xvc2VkIGNhc2VzIChyZXNvbHV0aW9uX3JlcXVpcmVkX2Zvcl9jbG9zZWQpLlxuICAgICAgcmVzb2x1dGlvbjogJ0RlbGl2ZXJlZCBDU1YgYnVsay1pbXBvcnQgaW4gdGhlIDkuNCByZWxlYXNlOyBzaGFyZWQgdGhlIGRvY3MgbGluayB3aXRoIHRoZSBjdXN0b21lci4nLFxuICAgICAgLy8gY2xvc2VkXHUyMjEyY3JlYXRlZCBkZWx0YSwgYXMgY2FzZS5ob29rIGNvbXB1dGVzIGl0LlxuICAgICAgcmVzb2x1dGlvbl90aW1lX2hvdXJzOiA0OC4wLFxuICAgICAgY3JlYXRlZF9hdDogY2VsYGRheXNBZ28oMTApYCxcbiAgICAgIGNsb3NlZF9kYXRlOiBjZWxgZGF5c0Fnbyg4KWAsXG4gICAgICBzbGFfZHVlX2RhdGU6IGNlbENhc2VTbGFEdWUoMTAsICdsb3cnLCAnV2F5bmUgRW50ZXJwcmlzZXMnKSxcbiAgICB9LFxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBHZW5lcmF0ZWQgZGVtbyBjYXNlcyBcdTIwMTQgMzAgY2FzZXMgb3ZlciB0aGUgbGFzdCAzMCBkYXlzLCBtaXhlZCBhY3Jvc3NcbiAgICAvLyBwcmlvcml0aWVzLiBQb3dlcnMgYENhc2VzT3BlbmVkQnlEYXlQcmlvcml0eVJlcG9ydGAgKGRhaWx5IGJ1Y2tldGluZ1xuICAgIC8vIG1hdHJpeCkgYW5kIHRoZSBzZXJ2aWNlIGRhc2hib2FyZCdzIGRhaWx5LXZvbHVtZSBhcmVhIGNoYXJ0LlxuICAgIC8vXG4gICAgLy8gIyMjIFdoeSBldmVyeSBheGlzIGNhcnJpZXMgYSByb3RhdGlvbiwgYW5kIG5vdCBqdXN0IGBpICUgbGVuZ3RoYCAoIzE2NTkpXG4gICAgLy9cbiAgICAvLyBUaGVzZSByb3dzIHVzZWQgdG8gcmVhZCBPTkUgY291bnRlciBmb3IgZXZlcnkgYXhpczogYGNybV9hY2NvdW50YCBhbmRcbiAgICAvLyBgc3RhdHVzYCBib3RoIHRvb2sgYGkgJSA1YCwgYW5kIGBwcmlvcml0eWAsIGB0eXBlYCBhbmQgYG9yaWdpbmAgYWxsIHRvb2tcbiAgICAvLyBgaSAlIDRgLiBFcXVhbC1sZW5ndGggbGlzdHMgd2Fsa2VkIGJ5IG9uZSBpbmRleCBhZHZhbmNlIGluIGxvY2tzdGVwLCBzb1xuICAgIC8vIGVhY2ggZ3JvdXAgY2FtZSBvdXQgUEVSRkVDVExZIGNvcnJlbGF0ZWQgXHUyMDE0IGV2ZXJ5IEFjbWUgY2FzZSBgbmV3YCwgZXZlcnlcbiAgICAvLyBHbG9iZXggY2FzZSBgaW5fcHJvZ3Jlc3NgLCBhbmQgZXZlcnkgYGxvd2AgY2FzZSBhIGBxdWVzdGlvbmAgcmFpc2VkIGJ5XG4gICAgLy8gYGVtYWlsYC4gVGhpcnR5IHJvd3Mgb2Ygdm9sdW1lIHdpdGggbm8gdmFyaWV0eSwgd2hpY2ggaXMgdGhlIG9wcG9zaXRlIG9mXG4gICAgLy8gd2hhdCBhIHZvbHVtZSBnZW5lcmF0b3IgaXMgZm9yOiB0aGUgYWNjb3VudCBcdTAwRDcgc3RhdHVzIGNyb3NzLXRhYiBoZWxkIDUgb2ZcbiAgICAvLyBpdHMgMjUgY2VsbHMsIGFuZCBwcmlvcml0eSBcdTAwRDcgdHlwZSBcdTAwRDcgb3JpZ2luIDQgb2YgMTYgYXBpZWNlLlxuICAgIC8vXG4gICAgLy8gRWFjaCBsaXN0IG5vdyBhZHZhbmNlcyBvbmUgc3RlcCBwZXIgcm93IFBMVVMgYSByb3RhdGlvbiBcdTIwMTQgYGNgIGV4dHJhIHN0ZXBzXG4gICAgLy8gZXZlcnkgYG1gIHJvd3MuIFR3byBheGVzIHN0YXkgY29ycmVsYXRlZCBleGFjdGx5IHdoZW4gdGhlaXIgcmVsYXRpdmVcbiAgICAvLyBvZmZzZXQgbmV2ZXIgbW92ZXMsIHNvIHRoZSByb3RhdGlvbnMgYXJlIGNob3NlbiB0byBtYWtlIGV2ZXJ5IHJlbGF0aXZlXG4gICAgLy8gb2Zmc2V0IHN3ZWVwIGl0cyB3aG9sZSBjeWNsZS4gYGNybV9hY2NvdW50YCBpcyB0aGUgYW5jaG9yIGFuZCBjYXJyaWVzIG5vXG4gICAgLy8gcm90YXRpb247IHRoZSBvdGhlciBmb3VyIGFyZSBzdGF0ZWQgcmVsYXRpdmUgdG8gaXQuXG4gICAgLy9cbiAgICAvLyBgYWNjb3VudCBcdTAwRDcgc3RhdHVzYCBpcyBjb21wbGV0ZSBCWSBDT05TVFJVQ1RJT04gcmF0aGVyIHRoYW4gYnkgbHVjaywgYW5kXG4gICAgLy8gdGhlIHByb29mIGlzIG9uZSBsaW5lOiBhY2NvdW50IGBhYCB0YWtlcyByb3dzIGkgPSBhLCBhKzUgXHUyMDI2IGErMjUsIHdob3NlXG4gICAgLy8gYmxvY2sgbnVtYmVycyBydW4gMFx1MjAyNjUsIHNvIGl0cyBzdGF0dXNlcyBhcmUgYChhICsgYikgJSA1YCBvdmVyIGIgPSAwXHUyMDI2NSBcdTIwMTRcbiAgICAvLyBhbGwgZml2ZSBvZiB0aGVtLiBUaGUgdGhpcnR5IHJvd3MgdGhlcmVmb3JlIHdhbGsgdGhlIHdob2xlIDUgXHUwMEQ3IDUgZ3JpZCxcbiAgICAvLyB0d2VudHktZml2ZSBjZWxscyBvbmNlIGFuZCBmaXZlIG9mIHRoZW0gYSBzZWNvbmQgdGltZS5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBUaGUgcmVtYWluaW5nIHRocmVlIGNvbnN0YW50cyBhcmUgVFVORUQsIG5vdCBkZXJpdmVkLiBUaGV5IHdlcmUgcGlja2VkXG4gICAgLy8gYnkgY29tcHV0aW5nIGFsbCB0ZW4gcGFpcndpc2UgY3Jvc3MtdGFicyBhbmQga2VlcGluZyB0aGUgYXNzaWdubWVudCB0aGF0XG4gICAgLy8gbGVmdCB0aGUgZmV3ZXN0IGVtcHR5IGNlbGxzLiBNZWFzdXJlZCBvdmVyIHRoZSBsaXN0cyBhcyBzaGlwcGVkOiAxODggb2ZcbiAgICAvLyB0aGUgMTkzIHBhaXJ3aXNlIGNlbGxzIGFyZSBvY2N1cGllZCwgbm8gY2VsbCBob2xkcyBtb3JlIHRoYW4gMyByb3dzLCBhbmRcbiAgICAvLyB0aGUgbWFyZ2luYWxzIHN0YXkgYXMgZmxhdCBhcyB0aGlydHkgcm93cyBhbGxvdyBcdTIwMTQgNi82LzYvNi82IGJ5IGFjY291bnRcbiAgICAvLyBhbmQgYnkgc3RhdHVzLCA4LzcvNy84IGJ5IHByaW9yaXR5LCB0eXBlIGFuZCBvcmlnaW4uIFx1MjZENCBDaGFuZ2luZyB0aGVcbiAgICAvLyBMRU5HVEggb2YgYW55IGxpc3QgYmVsb3cgdm9pZHMgdGhhdCB0dW5pbmc6IHJlLW1lYXN1cmUgdGhlIGNyb3NzLXRhYnNcbiAgICAvLyByYXRoZXIgdGhhbiBhc3N1bWluZyB0aGUgcm90YXRpb25zIHN0aWxsIHNlcGFyYXRlIHRoZSBheGVzLlxuICAgIC8vXG4gICAgLy8gVHdvIHNjaGVtZXMgdGhhdCByZWFkIGFzIG1vcmUgcHJpbmNpcGxlZCB0aGFuIHRoZXkgbWVhc3VyZSB3ZXJlIHJlamVjdGVkXG4gICAgLy8gaGVyZSwgYW5kIGFyZSByZWNvcmRlZCBzbyB0aGV5IGFyZSBub3QgcmUtZGVyaXZlZDogcm90YXRpbmcgdGhlIDUtbGlzdHNcbiAgICAvLyBvbiB0aGUgNC1ibG9jayBhbmQgdGhlIDQtbGlzdHMgb24gdGhlIDUtYmxvY2sgKFwidGhlIGxlbmd0aHMgYXJlIGNvcHJpbWUsXG4gICAgLy8gc28gdGhleSBjYW5ub3QgcmVzb25hdGVcIikgZW1wdGllcyBvbmUgc3RhdHVzIGNvbXBsZXRlbHk7IGFuZCByb3RhdGluZ1xuICAgIC8vIGBjcm1fYWNjb3VudGAgYXMgd2VsbCBcdTIwMTQgdG8gYnJlYWsgdGhlIGV2ZXJ5LWZpZnRoLWRheSBiZWF0IGl0IHdhbGtzIHRoZVxuICAgIC8vIGNhbGVuZGFyIG9uIFx1MjAxNCBjb3N0cyB0d2VsdmUgZnVydGhlciBlbXB0eSBjZWxscy4gVGhhdCBiZWF0IGlzIHRoZVxuICAgIC8vIGRlbGliZXJhdGUgcHJpY2Ugb2YgYW5jaG9yaW5nOiB3aXRoIG9uZSByb3cgcGVyIGRheSwgc29tZSBheGlzIGhhcyB0byBiZVxuICAgIC8vIHRoZSBmaXhlZCBvbmUgdGhlIG90aGVyIGZvdXIgYXJlIG1lYXN1cmVkIGFnYWluc3QuXG4gICAgLi4uKCgpOiByZWFkb25seSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0+IHtcbiAgICAgIGNvbnN0IHByaW9yaXRpZXMgPSBbJ2xvdycsICdtZWRpdW0nLCAnaGlnaCcsICdjcml0aWNhbCddIGFzIGNvbnN0O1xuICAgICAgLy8gTWlycm9yIG9mIGNhc2UuaG9vaydzIHByaW9yaXR5IHJhbmsgbWFwIFx1MjAxNCBob29rcyBkb24ndCBydW4gb3ZlciBzZWVkcy5cbiAgICAgIGNvbnN0IHJhbmtCeVByaW9yaXR5OiBSZWNvcmQ8dHlwZW9mIHByaW9yaXRpZXNbbnVtYmVyXSwgbnVtYmVyPiA9IHsgbG93OiAxLCBtZWRpdW06IDIsIGhpZ2g6IDMsIGNyaXRpY2FsOiA0IH07XG4gICAgICBjb25zdCB0eXBlcyA9IFsncXVlc3Rpb24nLCAnYnVnJywgJ3Byb2JsZW0nLCAnZmVhdHVyZV9yZXF1ZXN0J10gYXMgY29uc3Q7XG4gICAgICBjb25zdCBvcmlnaW5zID0gWydlbWFpbCcsICdwaG9uZScsICd3ZWInLCAnY2hhdCddIGFzIGNvbnN0O1xuICAgICAgY29uc3Qgc3RhdHVzZXMgPSBbJ25ldycsICdpbl9wcm9ncmVzcycsICdyZXNvbHZlZCcsICdjbG9zZWQnLCAnZXNjYWxhdGVkJ10gYXMgY29uc3Q7XG4gICAgICBjb25zdCBhY2NvdW50c0xpc3QgPSBbJ0FjbWUgQ29ycG9yYXRpb24nLCAnR2xvYmV4IEluZHVzdHJpZXMnLCAnV2F5bmUgRW50ZXJwcmlzZXMnLCAnSW5pdGVjaCBTb2x1dGlvbnMnLCAnU3RhcmsgTWVkaWNhbCddIGFzIGNvbnN0O1xuICAgICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMwOyBpKyspIHtcbiAgICAgICAgLy8gVGhlIGFuY2hvciwgdGhlbiB0aGUgZm91ciByb3RhdGlvbnMgdGhlIGJsb2NrIGNvbW1lbnQgYWJvdmUgZGVyaXZlcy5cbiAgICAgICAgLy8gYDEwYCBpcyB0aGUgb25lIGNvbnN0YW50IHdpdGggbm8gcmVhZGluZyBvZmYgYSBsaXN0IGxlbmd0aCBcdTIwMTQgaXQgaXNcbiAgICAgICAgLy8gdGhlIHJvdGF0aW9uIHRoYXQgbWVhc3VyZWQgYmVzdCBmb3IgYG9yaWdpbmAgYWdhaW5zdCB0aGUgb3RoZXIgZm91ci5cbiAgICAgICAgY29uc3QgYWNjb3VudCA9IGFjY291bnRzTGlzdFtpICUgYWNjb3VudHNMaXN0Lmxlbmd0aF07XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHN0YXR1c2VzWyhpICsgTWF0aC5mbG9vcihpIC8gYWNjb3VudHNMaXN0Lmxlbmd0aCkpICUgc3RhdHVzZXMubGVuZ3RoXTtcbiAgICAgICAgY29uc3QgcHJpb3JpdHkgPSBwcmlvcml0aWVzWyhpICsgTWF0aC5mbG9vcihpIC8gcHJpb3JpdGllcy5sZW5ndGgpKSAlIHByaW9yaXRpZXMubGVuZ3RoXTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVzWyhpICsgMiAqIE1hdGguZmxvb3IoaSAvIHR5cGVzLmxlbmd0aCkpICUgdHlwZXMubGVuZ3RoXTtcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gb3JpZ2luc1soaSArIE1hdGguZmxvb3IoaSAvIDEwKSkgJSBvcmlnaW5zLmxlbmd0aF07XG4gICAgICAgIGNvbnN0IHNldHRsZWQgPSBzdGF0dXMgPT09ICdyZXNvbHZlZCcgfHwgc3RhdHVzID09PSAnY2xvc2VkJztcbiAgICAgICAgY29uc3QgYWdlRGF5cyA9IDEgKyAoaSAlIDMwKTtcbiAgICAgICAgLy8gU2V0dGxlZCBjYXNlcyBnZXQgYSByZXNvbHV0aW9uIGRlbGF5IG9mIDFcdTIwMTMzIGRheXMgKGNhcHBlZCBhdCB0aGVcbiAgICAgICAgLy8gY2FzZSdzIGFnZSk7IHJlc29sdXRpb25fdGltZV9ob3VycyBpcyBleGFjdGx5IHRoZSBjbG9zZWRcdTIyMTJjcmVhdGVkXG4gICAgICAgIC8vIGRlbHRhIGNhc2UuaG9vayB3b3VsZCBjb21wdXRlIChkYXlzQWdvKCkgaXMgZGF5LWdyYW51bGFyIFx1MjE5MiAyNGggc3RlcHMpLlxuICAgICAgICBjb25zdCByZXNvbHV0aW9uRGF5cyA9IE1hdGgubWluKGFnZURheXMsIDEgKyAoaSAlIDMpKTtcbiAgICAgICAgLy8gQSBTRVRUTEVEIHJvdydzIGZsYWcgaXMgZGVyaXZlZCBmcm9tIGl0cyBvd24gZGF0ZXMgKCMyMDcwLFxuICAgICAgICAvLyBgc2VlZGVkU2V0dGxlZEJyZWFjaGApOiB0aGUgd3JpdGUgdGhhdCBzZXR0bGVkIGl0IHdvdWxkIGhhdmUgcmVjb3JkZWRcbiAgICAgICAgLy8gYSBsYXRlIGZpbmlzaCwgc28gdGhlIHNlZWQgZG9lcyB0b28uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEFuIE9QRU4gcm93J3MgZmxhZyBpcyB0aGUgc3dlZXAncyBkZWZpbml0aW9uIFx1MjAxNCBvcGVuLCBhbmQgaXRzIGR1ZSBkYXRlXG4gICAgICAgIC8vIGFscmVhZHkgaW4gdGhlIHBhc3QuIFRoZSBvbGQgZ2VuZXJhdG9yIGZsYWdnZWQgcm93cyBhcyB2aW9sYXRlZCB3aGlsZVxuICAgICAgICAvLyBnaXZpbmcgZXZlcnkgcm93IGEgRlVUVVJFIGR1ZSBkYXRlOyBzaW5jZSAjNTk1IHRoZSBkdWUgZGF0ZSBpcyBERVJJVkVEXG4gICAgICAgIC8vIChgY2VsQ2FzZVNsYUR1ZWAgYmVsb3cpLCBzbyBcImFscmVhZHkgaW4gdGhlIHBhc3RcIiBob2xkcyBieVxuICAgICAgICAvLyBjb25zdHJ1Y3Rpb24gaGVyZTogYSBjcml0aWNhbCBjYXNlIGlzIGR1ZSA0aCBhZnRlciBjcmVhdGlvbiBhbmQgZXZlcnlcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGNhc2UgaXMgYXQgbGVhc3QgYSBkYXkgb2xkLiBUaGUgY29udmVyc2UgaXMgZGVsaWJlcmF0ZWx5IG5vdFxuICAgICAgICAvLyBlbmZvcmNlZCBcdTIwMTQgb3RoZXIgb3BlbiByb3dzIGFyZSBwYXN0IGR1ZSB0b28sIGFuZCBgY2FzZV9zbGFfbW9uaXRvcmBcbiAgICAgICAgLy8gbm90aWNlcyB0aGVtIHdoZXJlIHNjaGVkdWxlZCB3b3JrIHJ1bnMuIFByZS1zZXR0aW5nIHRoZSBmbGFnIGhlcmUgb25seVxuICAgICAgICAvLyBkZWNpZGVzIHdoaWNoIG9wZW4gYnJlYWNoZXMgdGhlIGRlbW8gc2hvd3Mgd2l0aG91dCBhIHN3ZWVwLlxuICAgICAgICBjb25zdCBzbGFWaW9sYXRlZCA9IHNldHRsZWRcbiAgICAgICAgICA/IHNlZWRlZFNldHRsZWRCcmVhY2goYWdlRGF5cywgYWdlRGF5cyAtIHJlc29sdXRpb25EYXlzLCBwcmlvcml0eSwgYWNjb3VudClcbiAgICAgICAgICA6IHByaW9yaXR5ID09PSAnY3JpdGljYWwnICYmIGkgJSAzID09PSAwO1xuICAgICAgICBvdXQucHVzaCh7XG4gICAgICAgICAgc3ViamVjdDogYERlbW8gY2FzZSAke1N0cmluZyhpICsgMSkucGFkU3RhcnQoMiwgJzAnKX0gXHUyMDE0ICR7cHJpb3JpdHl9ICR7dHlwZX1gLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQXV0by1nZW5lcmF0ZWQgZGVtbyBjYXNlIGZvciAke3ByaW9yaXR5fSBwcmlvcml0eSBvbiBkYXkgLSR7YWdlRGF5c30uYCxcbiAgICAgICAgICBjcm1fYWNjb3VudDogYWNjb3VudCxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgcHJpb3JpdHlfcmFuazogcmFua0J5UHJpb3JpdHlbcHJpb3JpdHldLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgIC8vIGlzX2Nsb3NlZCBzdHJpY3RseSBtaXJyb3JzIGNhc2UuaG9vazogdHJ1ZSBPTkxZIGZvciBzdGF0dXNcbiAgICAgICAgICAvLyAnY2xvc2VkJyBcdTIwMTQgYSByZXNvbHZlZCBjYXNlIGlzIE5PVCBjbG9zZWQgeWV0LlxuICAgICAgICAgIGlzX2Nsb3NlZDogc3RhdHVzID09PSAnY2xvc2VkJyxcbiAgICAgICAgICBpc19zbGFfdmlvbGF0ZWQ6IHNsYVZpb2xhdGVkLFxuICAgICAgICAgIGlzX2VzY2FsYXRlZDogc3RhdHVzID09PSAnZXNjYWxhdGVkJyxcbiAgICAgICAgICAuLi4oc2V0dGxlZCA/IHsgcmVzb2x1dGlvbl90aW1lX2hvdXJzOiByZXNvbHV0aW9uRGF5cyAqIDI0IH0gOiB7fSksXG4gICAgICAgICAgLy8gT2JqZWN0IHZhbGlkYXRpb25zIHJlcXVpcmUgdGhlc2Ugd2hlbiBjbG9zZWQvZXNjYWxhdGVkIFx1MjAxNCB3aXRob3V0XG4gICAgICAgICAgLy8gdGhlbSB0aGUgZ2VuZXJhdGVkIHJvd3MgYXJlIHJlamVjdGVkIChyZXNvbHV0aW9uX3JlcXVpcmVkX2Zvcl9jbG9zZWRcbiAgICAgICAgICAvLyAvIGVzY2FsYXRpb25fcmVhc29uX3JlcXVpcmVkKS5cbiAgICAgICAgICAuLi4oc3RhdHVzID09PSAnY2xvc2VkJyA/IHsgcmVzb2x1dGlvbjogJ1Jlc29sdmVkIHBlciBzdGFuZGFyZCBydW5ib29rOyByb290IGNhdXNlIGRvY3VtZW50ZWQgYW5kIGN1c3RvbWVyIGNvbmZpcm1lZC4nIH0gOiB7fSksXG4gICAgICAgICAgLi4uKHN0YXR1cyA9PT0gJ2VzY2FsYXRlZCcgPyB7IGVzY2FsYXRpb25fcmVhc29uOiAnRXNjYWxhdGVkIHRvIHRpZXItMiBlbmdpbmVlcmluZyBmb3IgU0xBLXJpc2sgcmV2aWV3LicgfSA6IHt9KSxcbiAgICAgICAgICBjcmVhdGVkX2F0OiBjZWxEYXlzQWdvKGFnZURheXMpLFxuICAgICAgICAgIC8vIFJlc29sdmVkIGNhc2VzIGFsc28gY2FycnkgY2xvc2VkX2RhdGU6IGNhc2UuaG9vayBzdGFtcHMgaXQgYXMgdGhlXG4gICAgICAgICAgLy8gcmVzb2x2ZWQtZGF0ZSBwcm94eSB3aGlsZSBrZWVwaW5nIGlzX2Nsb3NlZD1mYWxzZS5cbiAgICAgICAgICAuLi4oc2V0dGxlZCA/IHsgY2xvc2VkX2RhdGU6IGNlbERheXNBZ28oYWdlRGF5cyAtIHJlc29sdXRpb25EYXlzKSB9IDoge30pLFxuICAgICAgICAgIHNsYV9kdWVfZGF0ZTogY2VsQ2FzZVNsYUR1ZShhZ2VEYXlzLCBwcmlvcml0eSwgYWNjb3VudCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9KSgpLFxuICBdLFxufSk7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBLbm93bGVkZ2UgQXJ0aWNsZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vL1xuLy8gTm8gYGhlbHBmdWxfY291bnRgIC8gYG5vdF9oZWxwZnVsX2NvdW50YCBoZXJlLCBkZWxpYmVyYXRlbHkgKCM2MDEpLiBUaG9zZSB0d29cbi8vIGFyZSBub3cgREVSSVZFRDogYGFydGljbGVfZmVlZGJhY2tfbWV0cmljc19yZWZyZXNoYCByZWNvdW50cyB0aGVtIGZyb21cbi8vIGBjcm1fYXJ0aWNsZV9mZWVkYmFja2Agb24gZXZlcnkgdm90ZS4gVGhpcyBmaWxlIHVzZWQgdG8gdHlwZSBpbiAzOCwgOTYsIDUsIDlcbi8vIFx1MjAxNCBudW1iZXJzIHdpdGggbm8gcm93cyBiZWhpbmQgdGhlbSBcdTIwMTQgYW5kIHRoZSBmaXJzdCByZWFsIHZvdGUgb24gYW4gYXJ0aWNsZVxuLy8gd291bGQgaGF2ZSByZWNvdW50ZWQgOTYgZG93biB0byAxLCBpbiBmcm9udCBvZiB3aG9ldmVyIHByZXNzZWQgdGhlIGJ1dHRvbi5cbi8vXG4vLyBUaGUgc2VlZCBkb2N0cmluZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZSBpcyB3aGF0IGRlY2lkZXMgaXQ6IGEgaG9vay1vd25lZFxuLy8gZmllbGQgbXVzdCBhcnJpdmUgaG9sZGluZyB3aGF0IHRoZSBob29rIFdPVUxEIGhhdmUgY29tcHV0ZWQuIFdpdGggbm8gc2VlZGVkXG4vLyBmZWVkYmFjayByb3dzIHRoZSBob25lc3QgdmFsdWUgaXMgdGhlIGZpZWxkJ3Mgb3duIGRlZmF1bHQsIDAuIFJvd3MgYXJlIG5vdFxuLy8gc2VlZGVkIGVpdGhlciwgYmVjYXVzZSBhIHNlZWQgY2Fubm90IG5hbWUgYSB1c2VyIChzZWUgdGhlIG5vdGUgb25cbi8vIGBjcm1fZXZlbnRfYXR0ZW5kZWVgIGJlbG93KSBhbmQgdGhlIHZvdGVyJ3MgaWRlbnRpdHkgaXMgZXhhY3RseSB3aGF0IHRoZVxuLy8gb25lLXZvdGUtcGVyLXJlYWRlciBpbmRleCBrZXlzIG9uIFx1MjAxNCBhIHRhYmxlIG9mIG93bmVybGVzcyB2ZXJkaWN0cyB3b3VsZCBiZVxuLy8gdGhlIHNhbWUgZmljdGlvbiBvbmUgbGV2ZWwgZG93bi5cbi8vXG4vLyBUaGUgZGVmbGVjdGlvbiBoYWxmIG9mICM2MDEgZG9lcyBub3QgaGF2ZSB0aGlzIHByb2JsZW0gYW5kIElTIHNlZWRlZDogYSBjYXNlXG4vLyBuYW1pbmcgdGhlIGFydGljbGUgdGhhdCByZXNvbHZlZCBpdCBuZWVkcyBubyB1c2VyLCBzbyB0aGUgY2xvc2VkXG4vLyBgQVBJIHJhdGUgbGltaXQgZXhjZWVkZWQgb24gcHJvZHVjdGlvbmAgY2FzZSBhYm92ZSBjYXJyaWVzIGEgcmVhbFxuLy8gYHJlc29sdmVkX2J5X2FydGljbGVgIGFuZCB0aGUgU2VydmljZSBkYXNoYm9hcmQncyBLQiB0aWxlcyBoYXZlIHNvbWV0aGluZ1xuLy8gdHJ1ZSB0byBzaG93IG9uIGEgZnJlc2ggYHBucG0gZGVtbzpyZXNldGAuXG5leHBvcnQgY29uc3Qga25vd2xlZGdlQXJ0aWNsZXMgPSBkZWZpbmVTZWVkKEtub3dsZWRnZUFydGljbGUsIHtcbiAgbW9kZTogJ3Vwc2VydCcsXG4gIGV4dGVybmFsSWQ6ICd0aXRsZScsXG4gIHJlY29yZHM6IFtcbiAgICB7XG4gICAgICB0aXRsZTogJ0dldHRpbmcgU3RhcnRlZCB3aXRoIEhvdENSTScsXG4gICAgICBzdW1tYXJ5OiAnQSBmaXZlLW1pbnV0ZSB0b3VyIG9mIGFjY291bnRzLCBjb250YWN0cywgbGVhZHMgYW5kIHRoZSBzYWxlcyBwaXBlbGluZS4nLFxuICAgICAgY2F0ZWdvcnk6ICdnZXR0aW5nX3N0YXJ0ZWQnLFxuICAgICAgc3RhdHVzOiAncHVibGlzaGVkJyxcbiAgICAgIGF1ZGllbmNlOiAncHVibGljJyxcbiAgICAgIGxhbmd1YWdlOiAnZW4nLFxuICAgICAgYm9keTogYCMgR2V0dGluZyBTdGFydGVkIHdpdGggSG90Q1JNXG5cbldlbGNvbWUhIFRoaXMgZ3VpZGUgd2Fsa3MgeW91IHRocm91Z2ggdGhlIGNvcmUgb2JqZWN0czpcblxuMS4gKipBY2NvdW50cyoqIFx1MjAxNCB0aGUgY29tcGFuaWVzIHlvdSBzZWxsIHRvIGFuZCBzZXJ2ZS5cbjIuICoqQ29udGFjdHMqKiBcdTIwMTQgdGhlIHBlb3BsZSBhdCB0aG9zZSBhY2NvdW50cy5cbjMuICoqTGVhZHMqKiBcdTIwMTQgdW5xdWFsaWZpZWQgcHJvc3BlY3RzIGluIHRoZSB0b3Agb2YgdGhlIGZ1bm5lbC5cbjQuICoqT3Bwb3J0dW5pdGllcyoqIFx1MjAxNCBxdWFsaWZpZWQgZGVhbHMgbW92aW5nIHRocm91Z2ggeW91ciBwaXBlbGluZS5cblxuT3BlbiB0aGUgKipTYWxlcyBQaXBlbGluZSoqIGthbmJhbiB0byBkcmFnIGRlYWxzIGJldHdlZW4gc3RhZ2VzLCBhbmQgdXNlIHRoZVxuKipFeGVjdXRpdmUgT3ZlcnZpZXcqKiBkYXNoYm9hcmQgdG8gdHJhY2sgcmV2ZW51ZSBhdCBhIGdsYW5jZS5gLFxuICAgICAgcHVibGlzaGVkX2F0OiBjZWxgZGF5c0Fnbyg0MClgLFxuICAgICAgbGFzdF9yZXZpZXdlZF9hdDogY2VsYGRheXNBZ28oMjApYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRpdGxlOiAnUmVzZXR0aW5nIFlvdXIgUGFzc3dvcmQnLFxuICAgICAgc3VtbWFyeTogJ0hvdyBlbmQgdXNlcnMgcmVzZXQgYSBmb3Jnb3R0ZW4gcGFzc3dvcmQgZnJvbSB0aGUgbG9naW4gc2NyZWVuLicsXG4gICAgICBjYXRlZ29yeTogJ2hvd190bycsXG4gICAgICBzdGF0dXM6ICdwdWJsaXNoZWQnLFxuICAgICAgYXVkaWVuY2U6ICdwdWJsaWMnLFxuICAgICAgbGFuZ3VhZ2U6ICdlbicsXG4gICAgICBib2R5OiBgIyBSZXNldHRpbmcgWW91ciBQYXNzd29yZFxuXG4xLiBPbiB0aGUgbG9naW4gc2NyZWVuLCBjbGljayAqKkZvcmdvdCBwYXNzd29yZD8qKlxuMi4gRW50ZXIgdGhlIGVtYWlsIGFzc29jaWF0ZWQgd2l0aCB5b3VyIGFjY291bnQuXG4zLiBDaGVjayB5b3VyIGluYm94IGZvciBhIHJlc2V0IGxpbmsgKHZhbGlkIGZvciAzMCBtaW51dGVzKS5cbjQuIENob29zZSBhIG5ldyBwYXNzd29yZCBvZiBhdCBsZWFzdCAxMiBjaGFyYWN0ZXJzLlxuXG5JZiB0aGUgZW1haWwgZG9lcyBub3QgYXJyaXZlLCBjaGVjayBzcGFtIG9yIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yLmAsXG4gICAgICBwdWJsaXNoZWRfYXQ6IGNlbGBkYXlzQWdvKDI1KWAsXG4gICAgICBsYXN0X3Jldmlld2VkX2F0OiBjZWxgZGF5c0FnbygxMClgLFxuICAgIH0sXG4gICAge1xuICAgICAgdGl0bGU6ICdBUEkgUmF0ZSBMaW1pdHMnLFxuICAgICAgc3VtbWFyeTogJ1Blci10b2tlbiByZXF1ZXN0IHF1b3RhcyBhbmQgcmVjb21tZW5kZWQgYmFjay1vZmYgc3RyYXRlZ3kuJyxcbiAgICAgIGNhdGVnb3J5OiAnYXBpJyxcbiAgICAgIHN0YXR1czogJ2RyYWZ0JyxcbiAgICAgIGF1ZGllbmNlOiAnaW50ZXJuYWwnLFxuICAgICAgbGFuZ3VhZ2U6ICdlbicsXG4gICAgICBib2R5OiBgIyBBUEkgUmF0ZSBMaW1pdHMgKERSQUZUKVxuXG5EZWZhdWx0IHF1b3RhIGlzIDYwMCByZXF1ZXN0cy9taW51dGUgcGVyIHRva2VuLiBPbiBIVFRQIDQyOSwgYmFjayBvZmZcbmV4cG9uZW50aWFsbHkgc3RhcnRpbmcgYXQgMXMuIE51bWJlcnMgcGVuZGluZyBmaW5hbCByZXZpZXcgd2l0aCBwbGF0Zm9ybSB0ZWFtLmAsXG4gICAgfSxcbiAgICB7XG4gICAgICB0aXRsZTogJ0xlZ2FjeSBTU08gU2V0dXAnLFxuICAgICAgc3VtbWFyeTogJ1NBTUwgY29uZmlndXJhdGlvbiBmb3IgdGhlIHByZS0yMDI1IGlkZW50aXR5IHN0YWNrLicsXG4gICAgICBjYXRlZ29yeTogJ3Ryb3VibGVzaG9vdGluZycsXG4gICAgICBzdGF0dXM6ICdwdWJsaXNoZWQnLFxuICAgICAgYXVkaWVuY2U6ICdpbnRlcm5hbCcsXG4gICAgICBsYW5ndWFnZTogJ2VuJyxcbiAgICAgIGJvZHk6IGAjIExlZ2FjeSBTU08gU2V0dXBcblxuVGhpcyBjb3ZlcnMgdGhlIGRlcHJlY2F0ZWQgU0FNTCAxLjEgZmxvdy4gTmV3IHRlbmFudHMgc2hvdWxkIHVzZSB0aGUgT0lEQ1xuY29ubmVjdG9yIGluc3RlYWQuIFJldGFpbmVkIGZvciBjdXN0b21lcnMgc3RpbGwgb24gdGhlIGxlZ2FjeSBzdGFjay5gLFxuICAgICAgcHVibGlzaGVkX2F0OiBjZWxgZGF5c0FnbygyNDApYCxcbiAgICAgIGxhc3RfcmV2aWV3ZWRfYXQ6IGNlbGBkYXlzQWdvKDIyMClgLFxuICAgIH0sXG4gIF1cbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL19jYXNlLXNsYS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL19jYXNlLXNsYS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBUaGUgY2FzZSBTTEEgcG9saWN5IG1hdHJpeCBcdTIwMTQgcHJpb3JpdHkgXHUwMEQ3IGFjY291bnQgdGllciwgaW4gQ0FMRU5EQVIgSE9VUlMuXG4gKlxuICogIyBXaGF0IHRoaXMgcmVwbGFjZXNcbiAqXG4gKiBVbnRpbCAjNTk1IHRoZSBvbmx5IFNMQSBydWxlIGluIHRoZSBhcHAgd2FzIFwiY3JpdGljYWwgXHUyMUQyIG5vdyArIDRoXCIsIGhhcmRjb2RlZFxuICogaW4gYGNhc2Vfc2xhX2RlZmF1bHRzYC4gVGhyZWUgb2YgdGhlIGZvdXIgcHJpb3JpdGllcyB0aGVyZWZvcmUgZ290IE5PXG4gKiBgc2xhX2R1ZV9kYXRlYCBhdCBhbGwsIHdoaWNoIG1lYW50IGBjYXNlX3NsYV9tb25pdG9yYCBcdTIwMTQgdGhlIGhvdXJseSBzd2VlcCB0aGF0XG4gKiBmbGFncyBhbmQgZXNjYWxhdGVzIGJyZWFjaGVzIFx1MjAxNCBjb3VsZCBuZXZlciBmaXJlIGZvciB0aGVtOiBpdCBzZWxlY3RzIG9uXG4gKiBgc2xhX2R1ZV9kYXRlIDwgbm93YCwgYW5kIGEgYmxhbmsgZGF0ZSBpcyBuZXZlciBpbiB0aGUgcGFzdC4gQSBIaWdoIGNhc2VcbiAqIG5vYm9keSB0b3VjaGVkIGVudGVyZWQgbmVpdGhlciB0aGUgcHJpb3JpdHktZXNjYWxhdGlvbiBwYXRoIG5vciB0aGUgdGltZVxuICogcGF0aC4gVGhlIGZpZWxkLCB0aGUgc3dlZXAgYW5kIHRoZSBmb3VyIHB1Ymxpc2hlZCBwZXItcHJpb3JpdHkgdGFyZ2V0cyB3ZXJlXG4gKiBhbGwgc2hpcHBlZDsgb25seSB0aGUgY2xvY2sgYmVoaW5kIHRocmVlIG9mIHRoZW0gd2FzIG1pc3NpbmcuXG4gKlxuICogYGNybV9hY2NvdW50LnRpZXJgIHdhcyB0aGUgb3RoZXIgaGFsZiBvZiB0aGUgc2FtZSBnYXA6IGZvdXIgb3B0aW9ucyBkZWNsYXJlZFxuICogb24gdGhlIGFjY291bnQgb2JqZWN0IGFuZCByZWFkIGJ5IG5vdGhpbmcgb3V0c2lkZSBgc3JjL3ZpZXdzL2FjY291bnQudmlldy50c2AuXG4gKlxuICogIyBcdTI2QTBcdUZFMEYgQ0FMRU5EQVIgSE9VUlMsIE5PVCBCVVNJTkVTUyBIT1VSU1xuICpcbiAqIEV2ZXJ5IG51bWJlciBiZWxvdyBpcyBhZGRlZCB0byB0aGUgV0FMTCBDTE9DSy4gVGhpcyBhcHAgc2hpcHMgbm9cbiAqIGJ1c2luZXNzLWhvdXJzIGNhbGVuZGFyLCBubyB3b3JraW5nLWRheSBkZWZpbml0aW9uIGFuZCBubyBob2xpZGF5IGxpc3QgXHUyMDE0XG4gKiB0aGVyZSBpcyBub3RoaW5nIGluIGl0cyBtZXRhZGF0YSBhIGRlYWRsaW5lIGNvdWxkIGJlIGNvdW50ZWQgYWdhaW5zdCwgYW5kXG4gKiB0aGUgcGxhdGZvcm0gcHJvdmlkZXMgbm8gc3VjaCBzZXJ2aWNlIGVpdGhlci4gU28gYSBQMSByYWlzZWQgYXQgNXBtIG9uIGFcbiAqIEZyaWRheSBpcyBkdWUgYXQgOXBtIHRoYXQgc2FtZSBGcmlkYXksIGFuZCBhIExvdyBjYXNlIHJhaXNlZCBvbiB0aGUgMjNyZCBvZlxuICogRGVjZW1iZXIgcnVucyBpdHMgd2VlayBkb3duIG92ZXIgdGhlIGhvbGlkYXlzLlxuICpcbiAqIFRoaXMgaXMgc3RhdGVkIHJhdGhlciB0aGFuIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHRoZSBzaW5nbGUgbW9zdCBsaWtlbHkgd2F5XG4gKiBmb3IgdGhlc2UgbnVtYmVycyB0byBiZSBtaXNyZWFkLiBUZWFjaGluZyB0aGUgZGVhZGxpbmUgdG8gc2tpcCBub24td29ya2luZ1xuICogdGltZSBtZWFucyB0ZWFjaGluZyB0aGlzIG1vZHVsZSBhIGNhbGVuZGFyIFx1MjAxNCBpdCBpcyBub3QgYSBtYXR0ZXIgb2YgY2hhbmdpbmdcbiAqIGEgY2VsbC5cbiAqXG4gKiBUaGlzIGhlYWRlciBpcyB0aGUgT05FIHBsYWNlIHRoZSBhcHAgc2F5cyBpdCBpbiBwcm9zZSAoIzE5NzQpLiBFdmVyeXdoZXJlXG4gKiBlbHNlIHRoZSB1bml0IHJpZGVzIGluIGEgbmFtZSBcdTIwMTQgYENBU0VfU0xBX0NBTEVOREFSX0hPVVJTYCBhbmRcbiAqIGBjYXNlU2xhQ2FsZW5kYXJIb3Vyc2AgYmVsb3csIGBzbGFDYWxlbmRhckhvdXJzYCBpbiB0aGUgaG9vayBib2R5IFx1MjAxNCBhbmQgaW5cbiAqIGB0ZXN0L2Nhc2Utc2xhLW1hdHJpeC50ZXN0LnRzYCwgd2hpY2ggZHJpdmVzIHRoZSBob29rIG9uIGEgZml4ZWQgRnJpZGF5XG4gKiAxNzowMCBjbG9jayBhbmQgcGlucyB0aGUgZGVhZGxpbmVzIHRoYXQgbGFuZCBvbiB0aGUgd2Vla2VuZC4gVGhlIG9wZXJhdG9yXG4gKiByZWFkcyBpdCBpbiB0aGUgYHNsYV9kdWVfZGF0ZWAgZmllbGQgZGVzY3JpcHRpb24uXG4gKlxuICogIyBXaHkgdGhlIGBjcml0aWNhbGAgcm93IGlzIGZsYXRcbiAqXG4gKiBFdmVyeSBjZWxsIGluIHRoZSBgY3JpdGljYWxgIHJvdyBpcyA0IFx1MjAxNCBkZWxpYmVyYXRlbHksIGFuZCBpdCBpcyB0aGUgb25lXG4gKiBjb25zdHJhaW50IG9uIHRoaXMgdGFibGUgdGhhdCBpcyBub3QgYSBwcm9kdWN0IG9waW5pb24uIEJlZm9yZSAjNTk1IEVWRVJZXG4gKiBjcml0aWNhbCBjYXNlIGdvdCA0IGhvdXJzIHJlZ2FyZGxlc3Mgb2YgdGllci4gRGlmZmVyZW50aWF0aW5nIHRoZSByb3cgYnlcbiAqIHRpZXIgd291bGQgTE9PU0VOIHRoZSBkZWFkbGluZSBvbiB0aGUgY3JpdGljYWwgY2FzZXMgb2Ygbm9uLXN0cmF0ZWdpY1xuICogYWNjb3VudHMsIGkuZS4gdGhpcyBjaGFuZ2Ugd291bGQgdGFrZSBhIGNsb2NrIGF3YXkgZnJvbSB3b3JrIHRoYXQgYWxyZWFkeVxuICogaGFkIG9uZS4gRmxhdCBhdCA0IGtlZXBzIHRoZSBuZXcgYmVoYXZpb3VyIGEgc3RyaWN0IHN1cGVyc2V0IG9mIHRoZSBvbGQ6XG4gKiBldmVyeSBjYXNlIHRoYXQgaGFkIGEgZHVlIGRhdGUgc3RpbGwgZ2V0cyB0aGUgc2FtZSBvbmUsIGFuZCB0aHJlZSB3aG9sZVxuICogcHJpb3JpdGllcyBnYWluIG9uZS4gKFRoZSBydWxpbmcgb24gIzU5NSBhc2tzIGZvciA0aCBhcyB0aGUgKnN0cmF0ZWdpYypcbiAqIGNlbGw7IGhvbGRpbmcgdGhlIHJlc3Qgb2YgdGhlIHJvdyB0byBpdCB0b28gaXMgd2hhdCBtYWtlcyBcInN1cGVyc2V0XCIgdHJ1ZVxuICogcmF0aGVyIHRoYW4gYXBwcm94aW1hdGVseSB0cnVlLilcbiAqXG4gKiBUaGUgcmVtYWluaW5nIHJvd3MgbmV2ZXIgZXhjZWVkIHRoZSBwZXItcHJpb3JpdHkgdGFyZ2V0IHRoZSB1c2VyIGRvY3MgaGF2ZVxuICogYWx3YXlzIHB1Ymxpc2hlZCAoSGlnaCA4aCwgTWVkaXVtIDIgZGF5cyA9IDQ4aCwgTG93IDcgZGF5cyA9IDE2OGgpIFx1MjAxNCB0aGVcbiAqIGxvd2VzdCB0aWVyIGdldHMgZXhhY3RseSB0aGF0IGNvbW1pdG1lbnQgYW5kIHRoZSBoaWdoZXIgdGllcnMgZ2V0IHRpZ2h0ZXIuXG4gKiBObyBhY2NvdW50IGlzIHdvcnNlIG9mZiBhdCBhbnkgcHJpb3JpdHkgdGhhbiB0aGUgZG9jcyBhbHJlYWR5IHByb21pc2VkLlxuICpcbiAqICMgV2hlcmUgdGhpcyBjb25zdGFudCBpcywgYW5kIGlzIG5vdCwgdGhlIHNvdXJjZSBvZiB0cnV0aFxuICpcbiAqIFRoZSBob29rIGJvZHkgaW4gYGNhc2UuaG9vay50c2AgY2FycmllcyBhIEhBTkQtQ09QSUVEIG1pcnJvciBvZiB0aGlzIHRhYmxlXG4gKiBhbmQgY2Fubm90IGltcG9ydCBpdDogTDIgaG9vayBib2RpZXMgcnVuIGJvZHktb25seSBpbiB0aGUgUXVpY2tKUyBzYW5kYm94LFxuICogc28gYSBtb2R1bGUgY29uc3RhbnQgcmVzb2x2ZXMgYXQgYXV0aG9yaW5nIHRpbWUgYW5kIGFycml2ZXMgYXMgYHVuZGVmaW5lZGBcbiAqIGF0IHJ1bnRpbWUgKHNlZSBgX2xpbmUtaXRlbS1wcmljZS1maWxsLnRzYCwgYW5kIHRoZSBzYW1lIGZvcmNlZCBkdXBsaWNhdGlvblxuICogYmVoaW5kIGB0ZXN0L3ByaW9yaXR5LXJhbmstcGFyaXR5LnRlc3QudHNgKS4gYHNyYy9zZXJ2aWNlL2RhdGEvc2VydmljZS5zZWVkLnRzYFxuICogaW1wb3J0cyB0aGlzIG1vZHVsZSBmb3IgcmVhbCBcdTIwMTQgc2VlZHMgYXJlIGF1dGhvcmVkLXRpbWUgZGF0YSBhbmQgaG9va3MgZG8gbm90XG4gKiBydW4gb3ZlciB0aGVtLCBzbyB0aGUgc2VlZGVkIGR1ZSBkYXRlcyBoYXZlIHRvIGJlIHJpZ2h0IG9uIGFycml2YWwuXG4gKlxuICogYHRlc3QvY2FzZS1zbGEtbWF0cml4LnRlc3QudHNgIGlzIHdoYXQga2VlcHMgdGhlIHR3byBjb3BpZXMgaG9uZXN0OiBpdCBwaW5zXG4gKiBhbGwgc2l4dGVlbiBjZWxscyBieSBEUklWSU5HIHRoZSBzaGlwcGVkIGhvb2sgaGFuZGxlciwgc28gY2hhbmdpbmcgYSBjZWxsIGluXG4gKiBlaXRoZXIgcGxhY2Ugd2l0aG91dCB0aGUgb3RoZXIgZmFpbHMgdGhlIHN1aXRlLlxuICovXG5cbi8qKiBUaGUgZm91ciBgY3JtX2FjY291bnQudGllcmAgb3B0aW9ucywgdGlnaHRlc3Qgc2VydmljZSBsZXZlbCBmaXJzdC4gKi9cbmV4cG9ydCBjb25zdCBDQVNFX1NMQV9USUVSUyA9IFsnc3RyYXRlZ2ljJywgJ2VudGVycHJpc2UnLCAnbWlkX21hcmtldCcsICdzbWInXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIENhc2VTbGFUaWVyID0gKHR5cGVvZiBDQVNFX1NMQV9USUVSUylbbnVtYmVyXTtcblxuLyoqIFRoZSBmb3VyIGBjcm1fY2FzZS5wcmlvcml0eWAgb3B0aW9ucyB0aGF0IGNhcnJ5IGEgY2xvY2suICovXG5leHBvcnQgY29uc3QgQ0FTRV9TTEFfUFJJT1JJVElFUyA9IFsnY3JpdGljYWwnLCAnaGlnaCcsICdtZWRpdW0nLCAnbG93J10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBDYXNlU2xhUHJpb3JpdHkgPSAodHlwZW9mIENBU0VfU0xBX1BSSU9SSVRJRVMpW251bWJlcl07XG5cbi8qKlxuICogVGllciB1c2VkIHdoZW4gdGhlIGNhc2UgbmFtZXMgbm8gYWNjb3VudCwgb3IgdGhlIGFjY291bnQncyB0aWVyIGlzIGJsYW5rLCBvclxuICogdGhlIHJlYWRlciBjYW5ub3Qgc2VlIHRoZSBhY2NvdW50IHJvdyAoZ3Vlc3QgaW50YWtlIHRocm91Z2ggdGhlIHdlYiBmb3JtIGlzXG4gKiB0aGUgb3JkaW5hcnkgY2FzZSBcdTIwMTQgaXQgY2FuIGNyZWF0ZSBhIGNhc2UgYW5kIHJlYWQgbm90aGluZyBlbHNlKS5cbiAqXG4gKiBgc21iYCBpcyB0aGUgbG9vc2VzdCBjb2x1bW4gQU5EIHRoZSBgZGVmYXVsdFZhbHVlYCB0aGUgYWNjb3VudCBvYmplY3QgYWxyZWFkeVxuICogZGVjbGFyZXMgZm9yIGB0aWVyYCwgc28gYW4gdW5yZWFkYWJsZSBhY2NvdW50IGlzIHRyZWF0ZWQgZXhhY3RseSBsaWtlIGFuXG4gKiBhY2NvdW50IG5vYm9keSBoYXMgY2xhc3NpZmllZC4gRXJyaW5nIGxvb3NlIGlzIHRoZSBzYWZlIGRpcmVjdGlvbjogYSBkZWFkbGluZVxuICogaW52ZW50ZWQgdGlnaHRlciB0aGFuIHRoZSBjdXN0b21lcidzIGNvbnRyYWN0IHdvdWxkIG1hbnVmYWN0dXJlIGJyZWFjaGVzIG91dFxuICogb2YgYSBwZXJtaXNzaW9uIGVycm9yLlxuICovXG5leHBvcnQgY29uc3QgQ0FTRV9TTEFfREVGQVVMVF9USUVSOiBDYXNlU2xhVGllciA9ICdzbWInO1xuXG4vKiogQ2FsZW5kYXIgaG91cnMgZnJvbSBjYXNlIGNyZWF0aW9uIHRvIGBzbGFfZHVlX2RhdGVgLCBieSBwcmlvcml0eSBhbmQgYWNjb3VudCB0aWVyLiAqL1xuZXhwb3J0IGNvbnN0IENBU0VfU0xBX0NBTEVOREFSX0hPVVJTOiBSZWNvcmQ8Q2FzZVNsYVByaW9yaXR5LCBSZWNvcmQ8Q2FzZVNsYVRpZXIsIG51bWJlcj4+ID0ge1xuICAvLyAgICAgICAgICAgc3RyYXRlZ2ljICBlbnRlcnByaXNlICBtaWRfbWFya2V0ICBzbWJcbiAgY3JpdGljYWw6IHsgc3RyYXRlZ2ljOiA0LCBlbnRlcnByaXNlOiA0LCBtaWRfbWFya2V0OiA0LCBzbWI6IDQgfSxcbiAgaGlnaDogeyBzdHJhdGVnaWM6IDYsIGVudGVycHJpc2U6IDgsIG1pZF9tYXJrZXQ6IDgsIHNtYjogOCB9LFxuICBtZWRpdW06IHsgc3RyYXRlZ2ljOiAyNCwgZW50ZXJwcmlzZTogMzYsIG1pZF9tYXJrZXQ6IDQ4LCBzbWI6IDQ4IH0sXG4gIGxvdzogeyBzdHJhdGVnaWM6IDk2LCBlbnRlcnByaXNlOiAxMjAsIG1pZF9tYXJrZXQ6IDE2OCwgc21iOiAxNjggfSxcbn07XG5cbi8qKiBMb29rIGEgY2VsbCB1cCB3aXRoIHRoZSBkb2N1bWVudGVkIGZhbGxiYWNrcy4gVW5rbm93biBwcmlvcml0eSBcdTIxRDIgbm8gY2xvY2suICovXG5leHBvcnQgZnVuY3Rpb24gY2FzZVNsYUNhbGVuZGFySG91cnMocHJpb3JpdHk6IHN0cmluZywgdGllcj86IHN0cmluZyB8IG51bGwpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCByb3cgPSBDQVNFX1NMQV9DQUxFTkRBUl9IT1VSU1twcmlvcml0eSBhcyBDYXNlU2xhUHJpb3JpdHldO1xuICBpZiAoIXJvdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHJvd1t0aWVyIGFzIENhc2VTbGFUaWVyXSA/PyByb3dbQ0FTRV9TTEFfREVGQVVMVF9USUVSXTtcbn1cblxuLyoqXG4gKiBUSEUgQlJFQUNIIFJVTEUgKCMyMDcwKTogYSBjYXNlIGJyZWFjaGVkIGl0cyBTTEEgd2hlbiBpdHMgYHNsYV9kdWVfZGF0ZWAgaXNcbiAqIFNUUklDVExZIGJlZm9yZSB0aGUgaW5zdGFudCBpdHMgY2xvY2sgc3RvcHBlZC4gQm90aCBhcmd1bWVudHMgYXJlIHJlYWQgb24gb25lXG4gKiBjbG9jayBcdTIwMTQgZXBvY2ggbWlsbGlzZWNvbmRzLCBvciBob3VycyBhZnRlciB0aGUgY2FzZSB3YXMgY3JlYXRlZCBcdTIwMTQgc28gYSBjYXNlXG4gKiB0aGF0IHN0b3BzIGV4YWN0bHkgb24gaXRzIGRlYWRsaW5lIG1ldCBpdC4gQSBjYXNlIHdpdGggbm8gZHVlIGRhdGUgaGFzIG5vXG4gKiBjbG9jaywgYW5kIGlzIG5ldmVyIGp1ZGdlZCBhdCBhbGw6IGNhbGxlcnMgZG8gbm90IHJlYWNoIHRoaXMgd2l0aG91dCBvbmUuXG4gKlxuICogVGhlIGNsb2NrIHN0b3BzIHdoZW4gdGhlIGNhc2Ugc3RvcHMgYmVpbmcgbGl2ZSB3b3JrIFx1MjAxNCB0aGUgZmlyc3Qgd3JpdGUgdGhhdFxuICogdGFrZXMgaXQgaW50byBgQ0xPU0VEX0NBU0VfU1RBVFVTRVNgIChgX2Nhc2UtYXNzaWdubWVudC50c2ApLiBUd28gd3JpdGVyc1xuICogcmVjb3JkIGEgYnJlYWNoLCBvbmUgcGVyIHNpZGUgb2YgdGhhdCBsaW5lLCBhbmQgYm90aCBhcHBseSBUSElTIHJ1bGU6XG4gKlxuICogICAtIHdoaWxlIHRoZSBjYXNlIGlzIGxpdmU6IGBjYXNlX3NsYV9tb25pdG9yYCBzZWxlY3RzXG4gKiAgICAgYHNsYV9kdWVfZGF0ZTogeyAkbHQ6IE5PVygpIH1gLCB0aGUgc2FtZSBzdHJpY3QgY29tcGFyaXNvbiwgd2l0aCBcIm5vd1wiIGFzXG4gKiAgICAgdGhlIGluc3RhbnQgXHUyMDE0IGJ1dCBvbmx5IG9uIGEgZGVwbG95bWVudCB0aGF0IHJ1bnMgc2NoZWR1bGVkIHdvcms7XG4gKiAgIC0gYXQgdGhlIHN0b3A6IGBjYXNlX3NsYV9kZWZhdWx0c2AgKGBjYXNlLmhvb2sudHNgKSBjb21wYXJlcyB0aGUgZHVlIGRhdGVcbiAqICAgICB3aXRoIHRoZSBpbnN0YW50IG9mIHRoZSByZXNvbHZpbmcgb3IgY2xvc2luZyB3cml0ZS4gSXQgbmVlZHMgbm8gc2NoZWR1bGUsXG4gKiAgICAgc28gdGhlIGNsb3NlZC1jYXNlIHN1cmZhY2VzIFx1MjAxNCB0aGUgYHNsYV9wZXJmb3JtYW5jZWAgcmVwb3J0IGFuZCB0aGVcbiAqICAgICBgc2xhX2NvbXBsaWFuY2VfcmF0ZWAgZ2F1Z2UgXHUyMDE0IGFyZSByaWdodCBvbiBldmVyeSBkZXBsb3ltZW50LlxuICpcbiAqIE5laXRoZXIgd3JpdGVyIGV2ZXIgY2xlYXJzIHRoZSBmbGFnOiBhIGJyZWFjaCwgb25jZSByZWNvcmRlZCwgc3RheXMuXG4gKlxuICogVGhlIGhvb2sgYm9keSBzcGVsbHMgdGhpcyBjb21wYXJpc29uIGlubGluZSwgZm9yIHRoZSByZWFzb24gdGhlIG1hdHJpeCBhYm92ZVxuICogaXMgbWlycm9yZWQgdGhlcmUgKG5vIG1vZHVsZSBzY29wZSBpbiB0aGUgc2FuZGJveCkuIFRoZSBzZWVkIGRlcml2ZXMgdGhlXG4gKiBmbGFnIG9mIGV2ZXJ5IHNldHRsZWQgZGVtbyBjYXNlIGZyb20gdGhpcyBmdW5jdGlvbiwgYW5kXG4gKiBgdGVzdC9jYXNlLXNsYS1icmVhY2gtb24tY2xvc2UudGVzdC50c2AgZHJpdmVzIHRoZSBMT1dFUkVEIGhvb2sgYm9keSBhZ2FpbnN0XG4gKiBpdCBvbiBib3RoIHNpZGVzIG9mIHRoZSBib3VuZGFyeSwgc28gdGhlIHR3byBjYW5ub3QgZHJpZnQuXG4gKi9cbmV4cG9ydCBjb25zdCBjYXNlU2xhQnJlYWNoZWQgPSAoZHVlQXQ6IG51bWJlciwgY2xvY2tTdG9wcGVkQXQ6IG51bWJlcik6IGJvb2xlYW4gPT4gZHVlQXQgPCBjbG9ja1N0b3BwZWRBdDtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9kYXRhL21hcmtldGluZy5zZWVkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9kYXRhXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9kYXRhL21hcmtldGluZy5zZWVkLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIE1hcmtldGluZyBzZWVkcyBcdTIwMTQgY2FtcGFpZ25zIGFuZCB0aGVpciBtZW1iZXJzaGlwLlxuICpcbiAqIFJlYWRzIHRoZSBzYWxlcyBzZWVkcyAoYGxlYWRzYCwgYG9wcG9ydHVuaXRpZXNgKSBiZWNhdXNlIHRoZSBjYW1wYWlnbiBtZXRyaWNcbiAqIGJsb2NrIGlzIERFUklWRUQgZnJvbSB0aGVtIHJhdGhlciB0aGFuIHR5cGVkIGluIFx1MjAxNCBzZWUgYGNhbXBhaWduTWV0cmljc2AuXG4gKlxuICogU3BsaXQgb3V0IG9mIHRoZSBmb3JtZXIgbW9ub2xpdGhpYyBgc3JjL2RhdGEvaW5kZXgudHNgICgjNjM1KS4gU2VlZCBkb2N0cmluZVxuICogbGl2ZXMgaW4gYHNyYy9zYWxlcy9kYXRhL19zaGFyZWQudHNgLlxuICovXG5pbXBvcnQgeyBkZWZpbmVTZWVkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgeyBDYW1wYWlnbiB9IGZyb20gJy4uL29iamVjdHMvY2FtcGFpZ24ub2JqZWN0JztcbmltcG9ydCB7IENhbXBhaWduTWVtYmVyIH0gZnJvbSAnLi4vb2JqZWN0cy9jYW1wYWlnbl9tZW1iZXIub2JqZWN0JztcbmltcG9ydCB7IGNlbERheXNBZ28gfSBmcm9tICcuLi8uLi9zYWxlcy9kYXRhL19zaGFyZWQnO1xuaW1wb3J0IHsgbGVhZHMsIG9wcG9ydHVuaXRpZXMgfSBmcm9tICcuLi8uLi9zYWxlcy9kYXRhL3NhbGVzLnNlZWQnO1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ2FtcGFpZ24gbWVtYmVyc2hpcCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8qKlxuICogQ2FtcGFpZ24gbWVtYmVycywga2V5ZWQgYnkgY2FtcGFpZ24gbmFtZS5cbiAqXG4gKiBNZW1iZXJzaGlwIGlzIHRoZSBPTkxZIHBhdGggZnJvbSBhIGNhbXBhaWduIHRvIGEgbGVhZCBcdTIwMTQgYGNybV9sZWFkYCBoYXMgbm9cbiAqIGNhbXBhaWduIGZpZWxkIFx1MjAxNCBzbyB3aXRoIHRoaXMgdGFibGUgZW1wdHkgKGFzIGl0IHdhcyBiZWZvcmUgIzU5MSkgZXZlcnlcbiAqIGNhbXBhaWduIHJlcG9ydGVkIGBudW1fc2VudGAgMCwgYHJlc3BvbnNlX3JhdGVgIDAlIGFuZCBubyBhdHRyaWJ1dGVkIGxlYWRzXG4gKiBhdCBhbGwsIHdoYXRldmVyIHRoZSBjYW1wYWlnbiByZWNvcmRzIGNsYWltZWQuXG4gKlxuICogU3RhdHVzIHZvY2FidWxhcnkgaXMgcmVzdHJpY3RlZCB0byB0aGUgbGlmZWN5Y2xlIHZhbHVlcyBhIHdyaXRlciBhY3R1YWxseVxuICogcHJvZHVjZXM6IGBzZW50YCAod2hhdCB0aGUgY2FtcGFpZ25fZW5yb2xsbWVudCBmbG93IGFuZCB0aGUgdHdvXG4gKiBBZGQtdG8tQ2FtcGFpZ24gYWN0aW9ucyBzdGFtcCksIGByZXNwb25kZWRgICh0aGUgYG1hcmtfcmVzcG9uZGVkYCBhY3Rpb24pXG4gKiBhbmQgYHVuc3Vic2NyaWJlZGAuIFRoZSBgb3BlbmVkYCAvIGBjbGlja2VkYCAvIGBib3VuY2VkYCBzdGF0ZXMgYW5kIHRoZVxuICogYGZpcnN0X29wZW5lZF9kYXRlYCAvIGBmaXJzdF9jbGlja2VkX2RhdGVgIHN0YW1wcyB3ZXJlIFJFTU9WRUQgZnJvbSB0aGVcbiAqIG9iamVjdCB1bmRlciAjNTk3IFx1MjAxNCBubyBlbWFpbC10cmFja2luZyBlbmdpbmUgZXhpc3RzIG9uIHRoZSBwbGF0Zm9ybSwgc29cbiAqIG5vdGhpbmcgY291bGQgZXZlciBoYXZlIHdyaXR0ZW4gdGhlbS5cbiAqXG4gKiBgY29udmVydGVkYCBpcyBhIGxpdmUgc3RhdHVzIHdpdGggYSByZWFsIHdyaXRlclxuICogKGBjYW1wYWlnbl9sZWFkX2NvbnZlcnNpb25fcmVmcmVzaGAgcHJvbW90ZXMgYSBtZW1iZXIgd2hlbiBpdHMgbGVhZCdzXG4gKiBgaXNfY29udmVydGVkYCBmbGlwcykgYnV0IGlzIGRlbGliZXJhdGVseSBub3QgU0VFREVEOiBubyBzZWVkZWQgbGVhZCBpc1xuICogY29udmVydGVkIFx1MjAxNCBjb252ZXJzaW9uIGlzIHRoZSBsZWFkX2NvbnZlcnNpb24gZmxvdydzIGpvYiBhdCBydW50aW1lIFx1MjAxNCBzbyBhXG4gKiBgY29udmVydGVkYCBtZW1iZXIgd291bGQgYmUgYSBtZW1iZXIgc3RhdGUgbm8gbGVhZCByZWNvcmQgYmFja3MgdXAuXG4gKi9cbnR5cGUgQ2FtcGFpZ25NZW1iZXJTcGVjID0ge1xuICAvKiogTGVhZCBlbWFpbCAodGhlIGxlYWQgZGF0YXNldCdzIGV4dGVybmFsSWQpIFx1MjAxNCBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgY29udGFjdGAuICovXG4gIHJlYWRvbmx5IGxlYWQ/OiBzdHJpbmc7XG4gIC8qKiBDb250YWN0IGVtYWlsICh0aGUgY29udGFjdCBkYXRhc2V0J3MgZXh0ZXJuYWxJZCkuICovXG4gIHJlYWRvbmx5IGNvbnRhY3Q/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXR1czogJ3NlbnQnIHwgJ3Jlc3BvbmRlZCcgfCAndW5zdWJzY3JpYmVkJztcbiAgcmVhZG9ubHkgYWRkZWREYXlzQWdvOiBudW1iZXI7XG4gIC8qKiBEYXlzIGFnbyB0aGUgbWVtYmVyIHJlc3BvbmRlZC4gUmVxdWlyZWQgYnkgYHJlc3BvbmRlZGAsIGFic2VudCBvdGhlcndpc2UuICovXG4gIHJlYWRvbmx5IHJlc3BvbmRlZERheXNBZ28/OiBudW1iZXI7XG59O1xuXG5jb25zdCBDQU1QQUlHTl9NRU1CRVJTOiBSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBDYW1wYWlnbk1lbWJlclNwZWNbXT4gPSB7XG4gICdRMyBFbnRlcnByaXNlIEVtYWlsIE51cnR1cmUnOiBbXG4gICAgeyBsZWFkOiAnbm9haC5wYXRlbEB2ZXJ0ZXhhbmFseXRpY3MuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdyZXNwb25kZWQnLCBhZGRlZERheXNBZ286IDE0LCByZXNwb25kZWREYXlzQWdvOiA5IH0sXG4gICAgeyBsZWFkOiAnbWF5YS5zaW5naEBibHVlcGVha2xvZ2lzdGljcy5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDE0IH0sXG4gICAgeyBsZWFkOiAnb3dlbi5iZWNrZXJAbm9ydGh3aW5kZW5lcmd5LmV4YW1wbGUuY29tJywgc3RhdHVzOiAncmVzcG9uZGVkJywgYWRkZWREYXlzQWdvOiAxNCwgcmVzcG9uZGVkRGF5c0FnbzogMTEgfSxcbiAgICB7IGxlYWQ6ICdzYXJhLmxvcGV6QGhlbGlvc3NvbGFyLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogMTQgfSxcbiAgICB7IGxlYWQ6ICdsZW8udmFuY2VAY2xlYW5jYXJ0LmV4YW1wbGUuY29tJywgc3RhdHVzOiAndW5zdWJzY3JpYmVkJywgYWRkZWREYXlzQWdvOiAxNCB9LFxuICAgIHsgbGVhZDogJ2lyaXMub2thZm9yQHB1bHNlaGVhbHRoLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogMTMgfSxcbiAgICB7IGxlYWQ6ICdyYXZpLm1laHRhQGZvdW5kcnlyb2JvdGljcy5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDEzIH0sXG4gICAgeyBsZWFkOiAndGVzcy5icm93bkBsYXR0aWNlZWR1Y2F0aW9uLmV4YW1wbGUuY29tJywgc3RhdHVzOiAncmVzcG9uZGVkJywgYWRkZWREYXlzQWdvOiAxMywgcmVzcG9uZGVkRGF5c0FnbzogOCB9LFxuICAgIHsgY29udGFjdDogJ2pvaG4uc21pdGhAYWNtZS5leGFtcGxlLmNvbScsIHN0YXR1czogJ3Jlc3BvbmRlZCcsIGFkZGVkRGF5c0FnbzogMTQsIHJlc3BvbmRlZERheXNBZ286IDEwIH0sXG4gICAgeyBjb250YWN0OiAnZXRoYW4uYnJvb2tzQHZlcnRleC5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDE0IH0sXG4gICAgeyBjb250YWN0OiAncHJpeWEuc2hhaEBsYXR0aWNlLmV4YW1wbGUuY29tJywgc3RhdHVzOiAncmVzcG9uZGVkJywgYWRkZWREYXlzQWdvOiAxNCwgcmVzcG9uZGVkRGF5c0FnbzogNyB9LFxuICAgIHsgY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiAxMyB9LFxuICBdLFxuICAnT3BlcmF0aW9ucyBQbGF0Zm9ybSBMYXVuY2gnOiBbXG4gICAgeyBsZWFkOiAnam9uYXMuaG9sdEBwb2xhcmNhcmdvLmV4YW1wbGUuY29tJywgc3RhdHVzOiAncmVzcG9uZGVkJywgYWRkZWREYXlzQWdvOiAxMSwgcmVzcG9uZGVkRGF5c0FnbzogNiB9LFxuICAgIHsgbGVhZDogJ2FueWEudm9sa292QHJlZG9ha3JlYWx0eS5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDExIH0sXG4gICAgeyBsZWFkOiAndGhlby5wYXJrQHNreWxpbmVtZWRpYS5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDExIH0sXG4gICAgeyBsZWFkOiAnd3Jlbi5nYXJjaWFAbWFwbGViYWtlcnlncm91cC5leGFtcGxlLmNvbScsIHN0YXR1czogJ3Jlc3BvbmRlZCcsIGFkZGVkRGF5c0FnbzogMTAsIHJlc3BvbmRlZERheXNBZ286IDUgfSxcbiAgICB7IGxlYWQ6ICdodWdvLmR1Ym9pc0BuaW1idXNhZXJvc3BhY2UuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiAxMCB9LFxuICAgIHsgY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdyZXNwb25kZWQnLCBhZGRlZERheXNBZ286IDExLCByZXNwb25kZWREYXlzQWdvOiA3IH0sXG4gICAgeyBjb250YWN0OiAnbWFyY3VzLnJlZWRAYXBleGxvZ2lzdGljcy5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDExIH0sXG4gICAgeyBjb250YWN0OiAnb2xpdmlhLmNoZW5Abm9ydGh3aW5kLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogMTAgfSxcbiAgICB7IGNvbnRhY3Q6ICdzYXJhaC5qQGdsb2JleC5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDEwIH0sXG4gIF0sXG4gICdEZXZlbG9wZXIgQ29udGVudCBNYXJrZXRpbmcgUHVzaCc6IFtcbiAgICB7IGxlYWQ6ICdsZW5hLmZpc2NoZXJAZ3Jhbml0ZWluc3VyYW5jZS5leGFtcGxlLmNvbScsIHN0YXR1czogJ3Jlc3BvbmRlZCcsIGFkZGVkRGF5c0FnbzogMzMsIHJlc3BvbmRlZERheXNBZ286IDI3IH0sXG4gICAgeyBsZWFkOiAna2FpLndhdGFuYWJlQGNvcmFscmVlZmhvdGVscy5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDMzIH0sXG4gICAgeyBsZWFkOiAnbWlyYS5jb3N0YUBhdGxhc2NvbnN0cnVjdGlvbi5leGFtcGxlLmNvbScsIHN0YXR1czogJ3Vuc3Vic2NyaWJlZCcsIGFkZGVkRGF5c0FnbzogMzMgfSxcbiAgICB7IGxlYWQ6ICdwaWEuYW5hbmRAY2l0cmluZWZpbmFuY2UuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdyZXNwb25kZWQnLCBhZGRlZERheXNBZ286IDMyLCByZXNwb25kZWREYXlzQWdvOiAyNCB9LFxuICAgIHsgbGVhZDogJ21hcmNvLnJpY2NpQGF1cm9yYXRyYXZlbC5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDMyIH0sXG4gICAgeyBsZWFkOiAnbGlzYS50QGNsb3VkZmlyc3QuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdyZXNwb25kZWQnLCBhZGRlZERheXNBZ286IDMwLCByZXNwb25kZWREYXlzQWdvOiAyMSB9LFxuICAgIHsgY29udGFjdDogJ2V0aGFuLmJyb29rc0B2ZXJ0ZXguZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdyZXNwb25kZWQnLCBhZGRlZERheXNBZ286IDMzLCByZXNwb25kZWREYXlzQWdvOiAxOSB9LFxuICAgIHsgY29udGFjdDogJ21jaGVuQGluaXRlY2guZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiAzMyB9LFxuICAgIHsgY29udGFjdDogJ2pvaG4uc21pdGhAYWNtZS5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDMyIH0sXG4gICAgeyBjb250YWN0OiAnZW1pbHkuZEBzdGFya21lZC5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDMyIH0sXG4gICAgeyBjb250YWN0OiAnc2FyYWguakBnbG9iZXguZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiAzMCB9LFxuICBdLFxuICAvLyBDYW1wYWlnbnMgc3RpbGwgaW4gYHBsYW5uaW5nYCBjYXJyeSB0aGVpciBpbnZpdGF0aW9uIC8gcmVnaXN0cmF0aW9uIGxpc3Q6XG4gIC8vIHRoZSBlbnJvbGxtZW50IGZsb3cgcnVucyBmb3IgYHBsYW5uaW5nYCBhbmQgYGluX3Byb2dyZXNzYCBjYW1wYWlnbnMgYWxpa2VcbiAgLy8gYW5kIHN0YW1wcyBgc2VudGAgb24gZW5yb2xsbWVudCwgc28gYSBwcmUtbGF1bmNoIHRhcmdldCBsaXN0IGxvb2tzIGV4YWN0bHlcbiAgLy8gbGlrZSB0aGlzLlxuICAnQ2xvdWQgTWlncmF0aW9uIFdlYmluYXInOiBbXG4gICAgeyBsZWFkOiAnZGtpbUBlZHV0ZWNobGFicy5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDQgfSxcbiAgICB7IGxlYWQ6ICdhbGljZUBuZXh0Z2VucmV0YWlsLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogNCB9LFxuICAgIHsgbGVhZDogJ2pvbmFzLmhvbHRAcG9sYXJjYXJnby5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDMgfSxcbiAgICB7IGxlYWQ6ICdhbnlhLnZvbGtvdkByZWRvYWtyZWFsdHkuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiAzIH0sXG4gICAgeyBjb250YWN0OiAnbWNoZW5AaW5pdGVjaC5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDQgfSxcbiAgICB7IGNvbnRhY3Q6ICdtYXJjdXMucmVlZEBhcGV4bG9naXN0aWNzLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogMyB9LFxuICBdLFxuICAnRXhlY3V0aXZlIEFJIEdvdmVybmFuY2UgUm91bmR0YWJsZSc6IFtcbiAgICB7IGNvbnRhY3Q6ICdqb2huLnNtaXRoQGFjbWUuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiA2IH0sXG4gICAgeyBjb250YWN0OiAncndpbHNvbkB3YXluZS5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDYgfSxcbiAgICB7IGNvbnRhY3Q6ICdldGhhbi5icm9va3NAdmVydGV4LmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogNSB9LFxuICAgIHsgY29udGFjdDogJ3ByaXlhLnNoYWhAbGF0dGljZS5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDUgfSxcbiAgICB7IGNvbnRhY3Q6ICdlbWlseS5kQHN0YXJrbWVkLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogNSB9LFxuICBdLFxuICAnUGFydG5lciBPcGVyYXRpb25zIFJvYWRzaG93JzogW1xuICAgIHsgbGVhZDogJ21heWEuc2luZ2hAYmx1ZXBlYWtsb2dpc3RpY3MuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiA3IH0sXG4gICAgeyBsZWFkOiAncmF2aS5tZWh0YUBmb3VuZHJ5cm9ib3RpY3MuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiA3IH0sXG4gICAgeyBjb250YWN0OiAnbWFyY3VzLnJlZWRAYXBleGxvZ2lzdGljcy5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDYgfSxcbiAgICB7IGNvbnRhY3Q6ICdvbGl2aWEuY2hlbkBub3J0aHdpbmQuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiA2IH0sXG4gIF0sXG4gICdTYWFTQ29uIDIwMjYgVHJhZGUgU2hvdyc6IFtcbiAgICB7IGxlYWQ6ICd0aGVvLnBhcmtAc2t5bGluZW1lZGlhLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogOCB9LFxuICAgIHsgbGVhZDogJ3dyZW4uZ2FyY2lhQG1hcGxlYmFrZXJ5Z3JvdXAuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiA4IH0sXG4gICAgeyBsZWFkOiAnaHVnby5kdWJvaXNAbmltYnVzYWVyb3NwYWNlLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogNyB9LFxuICAgIHsgbGVhZDogJ21hcmNvLnJpY2NpQGF1cm9yYXRyYXZlbC5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDcgfSxcbiAgXSxcbn07XG5cbi8qKlxuICogVGhlIG1ldHJpYyBibG9jayB0aGUgY2FtcGFpZ24gbWV0cmljIGhvb2tzIG1haW50YWluLCBjb21wdXRlZCBoZXJlIGZyb20gdGhlXG4gKiB2ZXJ5IHNhbWUgaW5wdXRzIHRoZXkgcmVhZDogdGhlIG1lbWJlcnNoaXAgdGFibGUgYWJvdmUgYW5kIHRoZSBvcHBvcnR1bml0aWVzXG4gKiBhdHRyaWJ1dGVkIHZpYSBgY3JtX2NhbXBhaWduYC5cbiAqXG4gKiBTZWVkaW5nIHRoZXNlIGJ5IGhhbmQgaXMgd2hhdCBtYWRlIHRoZW0gd3JvbmcgYmVmb3JlIFx1MjAxNCBhIGhhbmQtdHlwZWRcbiAqIGBhY3R1YWxfcmV2ZW51ZWAgc3Vydml2ZWQgdW50b3VjaGVkIHVudGlsIHNvbWV0aGluZyByZWNvbXB1dGVkLCBhdCB3aGljaFxuICogcG9pbnQgdGhlIGhvb2sgcmVwbGFjZWQgaXQgd2l0aCB0aGUgdHJ1dGggYW5kIHRoZSBudW1iZXIgXCJteXN0ZXJpb3VzbHlcIlxuICogY2hhbmdlZC4gRGVyaXZpbmcgaXQgaGVyZSBtYWtlcyB0aGUgZmlyc3QgcmVjb21wdXRlIGEgbm8tb3AgaW5zdGVhZDogc2FtZVxuICogaW5wdXRzLCBzYW1lIGFyaXRobWV0aWMsIHNhbWUgYW5zd2VyLlxuICpcbiAqIFRoYXQgZmlyc3QgcmVjb21wdXRlIG5vdyBhcnJpdmVzIG11Y2ggc29vbmVyIHRoYW4gaXQgdXNlZCB0by4gQmVmb3JlICM1OTcgdGhlXG4gKiBvbmx5IHdyaXRlciBmaXJlZCBvbiB0aGUgYFx1MjE5MiBjb21wbGV0ZWRgIHRyYW5zaXRpb24sIHNvIHRoZXNlIHNlZWRlZCB2YWx1ZXNcbiAqIHdlcmUgdGhlIE9OTFkgbnVtYmVycyBhIGxpdmUgY2FtcGFpZ24gZXZlciBzaG93ZWQ7IHRvZGF5IGFueSBtZW1iZXJzaGlwLFxuICogYXR0cmlidXRpb24gb3IgY29udmVyc2lvbiBjaGFuZ2UgcmVmcmVzaGVzIHRoZW0gKHNlZSB0aGUgZm91ciByZWZyZXNoIGhvb2tzOlxuICogYGNhbXBhaWduX21ldHJpY3NfcmVmcmVzaGAgYW5kIGBjYW1wYWlnbl9tZW1iZXJfbWV0cmljc19yZWZyZXNoYCBpblxuICogYHNyYy9tYXJrZXRpbmcvb2JqZWN0cy9gLCBgY2FtcGFpZ25fbGVhZF9jb252ZXJzaW9uX3JlZnJlc2hgIGFuZFxuICogYGNhbXBhaWduX2F0dHJpYnV0aW9uX3JlZnJlc2hgIGluIGBzcmMvc2FsZXMvb2JqZWN0cy9gKS4gVGhlIGRlcml2YXRpb24gYmVsb3dcbiAqIGlzIHRoZXJlZm9yZSBhIG1pcnJvciBvZiB0aGVpciBvbmUgaW5saW5lZCByZWNvbXB1dGUgYW5kIGhhcyB0byBzdGF5IG9uZSBcdTIwMTRcbiAqIGB0ZXN0L3NlZWQtY29uc2lzdGVuY3kudGVzdC50c2AgY2hlY2tzIHRoZSBzZWVkcyBhZ2FpbnN0IGl0LlxuICovXG5jb25zdCBjYW1wYWlnbk1ldHJpY3MgPSAoY2FtcGFpZ25OYW1lOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgbWVtYmVycyA9IENBTVBBSUdOX01FTUJFUlNbY2FtcGFpZ25OYW1lXSA/PyBbXTtcbiAgY29uc3QgbGVhZEtleXMgPSBuZXcgU2V0KG1lbWJlcnMubWFwKChtKSA9PiBtLmxlYWQpLmZpbHRlcigoZSk6IGUgaXMgc3RyaW5nID0+IEJvb2xlYW4oZSkpKTtcbiAgY29uc3QgY29udmVydGVkTGVhZHMgPSBsZWFkcy5yZWNvcmRzLmZpbHRlcihcbiAgICAobCkgPT4gdHlwZW9mIGwuZW1haWwgPT09ICdzdHJpbmcnICYmIGxlYWRLZXlzLmhhcyhsLmVtYWlsKSAmJiBsLmlzX2NvbnZlcnRlZCA9PT0gdHJ1ZSxcbiAgKS5sZW5ndGg7XG4gIGNvbnN0IGF0dHJpYnV0ZWQgPSBvcHBvcnR1bml0aWVzLnJlY29yZHMuZmlsdGVyKChvKSA9PiBvLmNybV9jYW1wYWlnbiA9PT0gY2FtcGFpZ25OYW1lKTtcbiAgY29uc3Qgd29uID0gYXR0cmlidXRlZC5maWx0ZXIoKG8pID0+IG8uc3RhZ2UgPT09ICdjbG9zZWRfd29uJyk7XG4gIHJldHVybiB7XG4gICAgLy8gXCJUb3RhbCBtZW1iZXJzIGVucm9sbGVkXCIgXHUyMDE0IGNhbXBhaWduLmhvb2sudHMncyBzaW5nbGUgZGVmaW5pdGlvbiBvZiBudW1fc2VudC5cbiAgICBudW1fc2VudDogbWVtYmVycy5sZW5ndGgsXG4gICAgLy8gYHJlc3BvbmRlZGAgb3IgYGNvbnZlcnRlZGAsIGFzIGluIGBjb21wdXRlQ2FtcGFpZ25NZXRyaWNzYC4gVGhlIHNlZWQgc2V0XG4gICAgLy8gaG9sZHMgbm8gYGNvbnZlcnRlZGAgbWVtYmVyIChzZWUgdGhlIG5vdGUgb24gQ0FNUEFJR05fTUVNQkVSUyksIHNvIHRoZVxuICAgIC8vIHR3byBwcmVkaWNhdGVzIGNvaW5jaWRlIG9uIHRoaXMgZGF0YSBcdTIwMTQgc3BlbGxlZCB0aGUgbmFycm93IHdheSBiZWNhdXNlXG4gICAgLy8gd2lkZW5pbmcgaXQgaGVyZSB3b3VsZCBzdWdnZXN0IGEgc2VlZGVkIHN0YXRlIHRoYXQgZG9lcyBub3QgZXhpc3QuXG4gICAgbnVtX3Jlc3BvbnNlczogbWVtYmVycy5maWx0ZXIoKG0pID0+IG0uc3RhdHVzID09PSAncmVzcG9uZGVkJykubGVuZ3RoLFxuICAgIG51bV9sZWFkczogbGVhZEtleXMuc2l6ZSxcbiAgICBudW1fY29udmVydGVkX2xlYWRzOiBjb252ZXJ0ZWRMZWFkcyxcbiAgICBudW1fb3Bwb3J0dW5pdGllczogYXR0cmlidXRlZC5sZW5ndGgsXG4gICAgbnVtX3dvbl9vcHBvcnR1bml0aWVzOiB3b24ubGVuZ3RoLFxuICAgIGFjdHVhbF9yZXZlbnVlOiB3b24ucmVkdWNlKChzdW0sIG8pID0+IHN1bSArICh0eXBlb2Ygby5hbW91bnQgPT09ICdudW1iZXInID8gby5hbW91bnQgOiAwKSwgMCksXG4gIH07XG59O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ2FtcGFpZ25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IGNvbnN0IGNhbXBhaWducyA9IGRlZmluZVNlZWQoQ2FtcGFpZ24sIHtcbiAgbW9kZTogJ3Vwc2VydCcsXG4gIGV4dGVybmFsSWQ6ICduYW1lJyxcbiAgcmVjb3JkczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdRMyBFbnRlcnByaXNlIEVtYWlsIE51cnR1cmUnLFxuICAgICAgZGVzY3JpcHRpb246ICdNdWx0aS10b3VjaCBudXJ0dXJlIGZvciBlbnRlcnByaXNlIElUIGRlY2lzaW9uIG1ha2VycyBldmFsdWF0aW5nIEFJIGdvdmVybmFuY2UgYW5kIGFuYWx5dGljcy4nLFxuICAgICAgdHlwZTogJ2VtYWlsJyxcbiAgICAgIGNoYW5uZWw6ICdlbWFpbCcsXG4gICAgICBzdGF0dXM6ICdpbl9wcm9ncmVzcycsXG4gICAgICBzdGFydF9kYXRlOiBjZWxgZGF5c0FnbygxNSlgLFxuICAgICAgZW5kX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygyMSlgLFxuICAgICAgYnVkZ2V0ZWRfY29zdDogMjgwMDAsXG4gICAgICBhY3R1YWxfY29zdDogMTQwMDAsXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiA1NjAwMDAsXG4gICAgICB0YXJnZXRfc2l6ZTogNTAwMCxcbiAgICAgIC4uLmNhbXBhaWduTWV0cmljcygnUTMgRW50ZXJwcmlzZSBFbWFpbCBOdXJ0dXJlJyksXG4gICAgICBsYW5kaW5nX3BhZ2VfdXJsOiAnaHR0cHM6Ly9hY21lLmV4YW1wbGUuY29tL2xwL2VudGVycHJpc2UtcTMnLFxuICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0V4ZWN1dGl2ZSBBSSBHb3Zlcm5hbmNlIFJvdW5kdGFibGUnLFxuICAgICAgZGVzY3JpcHRpb246ICdBIGxpdmUgZXhlY3V0aXZlIHJvdW5kdGFibGUgb24gb3BlcmF0aW5nIEFJIGFnZW50cyB3aXRoIGdvdmVybmFuY2UsIGF1ZGl0YWJpbGl0eSBhbmQgdHJ1c3QuJyxcbiAgICAgIHR5cGU6ICdjb25mZXJlbmNlJyxcbiAgICAgIGNoYW5uZWw6ICdldmVudHMnLFxuICAgICAgc3RhdHVzOiAncGxhbm5pbmcnLFxuICAgICAgc3RhcnRfZGF0ZTogY2VsYGRheXNGcm9tTm93KDIpYCxcbiAgICAgIGVuZF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMylgLFxuICAgICAgYnVkZ2V0ZWRfY29zdDogMjIwMDAsXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiAzMjAwMDAsXG4gICAgICB0YXJnZXRfc2l6ZTogMTIwLFxuICAgICAgLi4uY2FtcGFpZ25NZXRyaWNzKCdFeGVjdXRpdmUgQUkgR292ZXJuYW5jZSBSb3VuZHRhYmxlJyksXG4gICAgICBpc19hY3RpdmU6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnQ2xvdWQgTWlncmF0aW9uIFdlYmluYXInLFxuICAgICAgZGVzY3JpcHRpb246ICdBIHRlY2huaWNhbCB3ZWJpbmFyIG9uIG1vZGVybml6aW5nIGN1c3RvbWVyIG9wZXJhdGlvbnMgYW5kIGRhdGEgd29ya2Zsb3dzIGluIHRoZSBjbG91ZC4nLFxuICAgICAgdHlwZTogJ3dlYmluYXInLFxuICAgICAgY2hhbm5lbDogJ2RpZ2l0YWwnLFxuICAgICAgc3RhdHVzOiAncGxhbm5pbmcnLFxuICAgICAgc3RhcnRfZGF0ZTogY2VsYGRheXNGcm9tTm93KDYpYCxcbiAgICAgIGVuZF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coOClgLFxuICAgICAgYnVkZ2V0ZWRfY29zdDogMTgwMDAsXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiAzNjAwMDAsXG4gICAgICB0YXJnZXRfc2l6ZTogMTUwMCxcbiAgICAgIC4uLmNhbXBhaWduTWV0cmljcygnQ2xvdWQgTWlncmF0aW9uIFdlYmluYXInKSxcbiAgICAgIGxhbmRpbmdfcGFnZV91cmw6ICdodHRwczovL2FjbWUuZXhhbXBsZS5jb20vd2ViaW5hcnMvY2xvdWQtbWlncmF0aW9uJyxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdPcGVyYXRpb25zIFBsYXRmb3JtIExhdW5jaCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0xhdW5jaCBjYW1wYWlnbiBmb3IgdGhlIG9wZXJhdGlvbnMgcGxhdGZvcm0sIHBhaXJpbmcgcHJvZHVjdCBjb250ZW50IHdpdGggY3VzdG9tZXIgcHJvb2YgcG9pbnRzLicsXG4gICAgICB0eXBlOiAnY29udGVudCcsXG4gICAgICBjaGFubmVsOiAnZGlnaXRhbCcsXG4gICAgICBzdGF0dXM6ICdpbl9wcm9ncmVzcycsXG4gICAgICAvLyBXYXMgYGRheXNGcm9tTm93KDEyKWAgXHUyMDE0IGFuIGBpbl9wcm9ncmVzc2AgY2FtcGFpZ24gdGhhdCBoYWQgbm90IHN0YXJ0ZWRcbiAgICAgIC8vIHlldCwgd2hpY2ggbm8gYXR0cmlidXRpb24gY2FuIGJlIGNvbnNpc3RlbnQgd2l0aCAoIzU5MSkuXG4gICAgICBzdGFydF9kYXRlOiBjZWxgZGF5c0FnbygxMilgLFxuICAgICAgZW5kX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygxNClgLFxuICAgICAgYnVkZ2V0ZWRfY29zdDogMzYwMDAsXG4gICAgICBhY3R1YWxfY29zdDogMTIwMDAsXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiA0ODAwMDAsXG4gICAgICB0YXJnZXRfc2l6ZTogODAwMCxcbiAgICAgIC4uLmNhbXBhaWduTWV0cmljcygnT3BlcmF0aW9ucyBQbGF0Zm9ybSBMYXVuY2gnKSxcbiAgICAgIGxhbmRpbmdfcGFnZV91cmw6ICdodHRwczovL2FjbWUuZXhhbXBsZS5jb20vbGF1bmNoL29wZXJhdGlvbnMtcGxhdGZvcm0nLFxuICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1BhcnRuZXIgT3BlcmF0aW9ucyBSb2Fkc2hvdycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0pvaW50IHJlZ2lvbmFsIHNlc3Npb25zIHdpdGggc3RyYXRlZ2ljIHBhcnRuZXJzIGZvciBvcGVyYXRpb25zIGFuZCBJVCBsZWFkZXJzLicsXG4gICAgICB0eXBlOiAncGFydG5lcicsXG4gICAgICBjaGFubmVsOiAncGFydG5lcicsXG4gICAgICBzdGF0dXM6ICdwbGFubmluZycsXG4gICAgICBzdGFydF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMTkpYCxcbiAgICAgIGVuZF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMjIpYCxcbiAgICAgIGJ1ZGdldGVkX2Nvc3Q6IDQ4MDAwLFxuICAgICAgZXhwZWN0ZWRfcmV2ZW51ZTogNzIwMDAwLFxuICAgICAgdGFyZ2V0X3NpemU6IDYwMCxcbiAgICAgIC4uLmNhbXBhaWduTWV0cmljcygnUGFydG5lciBPcGVyYXRpb25zIFJvYWRzaG93JyksXG4gICAgICBpc19hY3RpdmU6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnU2FhU0NvbiAyMDI2IFRyYWRlIFNob3cnLFxuICAgICAgZGVzY3JpcHRpb246ICdBIGZvY3VzZWQgYm9vdGgsIGV4ZWN1dGl2ZSBkaW5uZXIgYW5kIGN1c3RvbWVyLXN0b3J5IHByb2dyYW0gYXQgdGhlIFNhYVNDb24gaW5kdXN0cnkgY29uZmVyZW5jZS4nLFxuICAgICAgdHlwZTogJ3RyYWRlX3Nob3cnLFxuICAgICAgY2hhbm5lbDogJ2V2ZW50cycsXG4gICAgICBzdGF0dXM6ICdwbGFubmluZycsXG4gICAgICBzdGFydF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMjcpYCxcbiAgICAgIGVuZF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMzApYCxcbiAgICAgIGJ1ZGdldGVkX2Nvc3Q6IDc1MDAwLFxuICAgICAgZXhwZWN0ZWRfcmV2ZW51ZTogMTIwMDAwMCxcbiAgICAgIHRhcmdldF9zaXplOiAzMDAwLFxuICAgICAgLi4uY2FtcGFpZ25NZXRyaWNzKCdTYWFTQ29uIDIwMjYgVHJhZGUgU2hvdycpLFxuICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0RldmVsb3BlciBDb250ZW50IE1hcmtldGluZyBQdXNoJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGVjaG5pY2FsIGJsb2cgcG9zdHMsIHZpZGVvIHR1dG9yaWFscyBhbmQgZGV2ZWxvcGVyIGNvbW11bml0eSBlbmdhZ2VtZW50IGNvbXBsZXRlZCBsYXN0IG1vbnRoLicsXG4gICAgICB0eXBlOiAnY29udGVudCcsXG4gICAgICBjaGFubmVsOiAnZGlnaXRhbCcsXG4gICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgc3RhcnRfZGF0ZTogY2VsYGRheXNBZ28oMzUpYCxcbiAgICAgIGVuZF9kYXRlOiBjZWxgZGF5c0Fnbyg0KWAsXG4gICAgICBidWRnZXRlZF9jb3N0OiA0MDAwMCxcbiAgICAgIGFjdHVhbF9jb3N0OiAyNTAwMCxcbiAgICAgIGV4cGVjdGVkX3JldmVudWU6IDI1MDAwMCxcbiAgICAgIHRhcmdldF9zaXplOiAxMDAwMCxcbiAgICAgIC4uLmNhbXBhaWduTWV0cmljcygnRGV2ZWxvcGVyIENvbnRlbnQgTWFya2V0aW5nIFB1c2gnKSxcbiAgICAgIGxhbmRpbmdfcGFnZV91cmw6ICdodHRwczovL2FjbWUuZXhhbXBsZS5jb20vZGV2ZWxvcGVycycsXG4gICAgICBpc19hY3RpdmU6IHRydWUsXG4gICAgfSxcbiAgXVxufSk7XG5cbi8qKlxuICogQ2FtcGFpZ24gbWVtYmVycyBhcmUgc2VlZGVkIGFzIFRXTyBkYXRhc2V0cyBvdmVyIG9uZSBvYmplY3QsIHNwbGl0IGJ5IHdoaWNoXG4gKiBzaWRlIG9mIHRoZSBqdW5jdGlvbiBpcyBwb3B1bGF0ZWQuXG4gKlxuICogTm90IGEgc3R5bGlzdGljIGNob2ljZTogdGhlIG9iamVjdCBoYXMgbm8gc2luZ2xlIG5hdHVyYWwga2V5IChpdHMgb25seSB0ZXh0XG4gKiBpZGVudGl0eSBpcyBhIHJ1bnRpbWUtb3duZWQgYXV0b251bWJlciksIHNvIGlkZW50aXR5IGhhcyB0byBiZSB0aGUgY29tcG9zaXRlXG4gKiBvZiBjYW1wYWlnbiArIG1lbWJlci4gVGhlIGxvYWRlciBidWlsZHMgYSBjb21wb3NpdGUga2V5IGJ5IGpvaW5pbmcgdGhlXG4gKiBwZXItZmllbGQgdmFsdWVzIGFuZCByZXR1cm5zIGFuIEVNUFRZIGtleSBcdTIwMTQgbm8gZGVkdXBlLCBzbyBhIHJlcGxheSBib290XG4gKiByZS1pbnNlcnRzIGV2ZXJ5IHJvdyBcdTIwMTQgYXMgc29vbiBhcyBBTlkgY29tcG9uZW50IGlzIG51bGwuIGBjcm1fbGVhZGAgYW5kXG4gKiBgY3JtX2NvbnRhY3RgIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYnkgZGVzaWduLCBzbyBhIHNpbmdsZVxuICogYFsnY3JtX2NhbXBhaWduJywgJ2NybV9sZWFkJywgJ2NybV9jb250YWN0J11gIGtleSB3b3VsZCBiZSBibGFuayBvbiBldmVyeVxuICogcm93LiBTcGxpdHRpbmcgdGhlIHJvd3MgYnkgbWVtYmVyIHR5cGUgZ2l2ZXMgZWFjaCBkYXRhc2V0IGEga2V5IHdob3NlIHBhcnRzXG4gKiBhcmUgYWxsIHByZXNlbnQuXG4gKi9cbmNvbnN0IG1lbWJlclJlY29yZHMgPSAoXG4gIGtpbmQ6ICdsZWFkJyB8ICdjb250YWN0Jyxcbik6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9PlxuICBPYmplY3QuZW50cmllcyhDQU1QQUlHTl9NRU1CRVJTKS5mbGF0TWFwKChbY2FtcGFpZ24sIG1lbWJlcnNdKSA9PlxuICAgIG1lbWJlcnNcbiAgICAgIC5maWx0ZXIoKG0pID0+IChraW5kID09PSAnbGVhZCcgPyBtLmxlYWQgOiBtLmNvbnRhY3QpKVxuICAgICAgLm1hcCgobSkgPT4gKHtcbiAgICAgICAgY3JtX2NhbXBhaWduOiBjYW1wYWlnbixcbiAgICAgICAgLi4uKGtpbmQgPT09ICdsZWFkJyA/IHsgY3JtX2xlYWQ6IG0ubGVhZCB9IDogeyBjcm1fY29udGFjdDogbS5jb250YWN0IH0pLFxuICAgICAgICBzdGF0dXM6IG0uc3RhdHVzLFxuICAgICAgICBhZGRlZF9kYXRlOiBjZWxEYXlzQWdvKG0uYWRkZWREYXlzQWdvKSxcbiAgICAgICAgLy8gYGhhc19yZXNwb25kZWRgIC8gYHJlc3BvbnNlX2RhdGVgIHRyYWNrIHRoZSBgcmVzcG9uZGVkYCBzdGF0dXNcbiAgICAgICAgLy8gZXhhY3RseSBcdTIwMTQgYSByZXNwb25kZWQgbWVtYmVyIHdpdGggbm8gcmVzcG9uc2UgZGF0ZSBpcyBhIHNoYXBlIHRoZVxuICAgICAgICAvLyByZXNwb25zZS10cmFja2luZyBzdXJmYWNlcyBjYW5ub3QgcmVuZGVyLlxuICAgICAgICBoYXNfcmVzcG9uZGVkOiBtLnN0YXR1cyA9PT0gJ3Jlc3BvbmRlZCcsXG4gICAgICAgIC4uLihtLnJlc3BvbmRlZERheXNBZ28gIT09IHVuZGVmaW5lZCA/IHsgcmVzcG9uc2VfZGF0ZTogY2VsRGF5c0FnbyhtLnJlc3BvbmRlZERheXNBZ28pIH0gOiB7fSksXG4gICAgICB9KSksXG4gICk7XG5cbmV4cG9ydCBjb25zdCBjYW1wYWlnbk1lbWJlcnNGcm9tTGVhZHMgPSBkZWZpbmVTZWVkKENhbXBhaWduTWVtYmVyLCB7XG4gIG1vZGU6ICd1cHNlcnQnLFxuICBleHRlcm5hbElkOiBbJ2NybV9jYW1wYWlnbicsICdjcm1fbGVhZCddLFxuICByZWNvcmRzOiBtZW1iZXJSZWNvcmRzKCdsZWFkJyksXG59KTtcblxuZXhwb3J0IGNvbnN0IGNhbXBhaWduTWVtYmVyc0Zyb21Db250YWN0cyA9IGRlZmluZVNlZWQoQ2FtcGFpZ25NZW1iZXIsIHtcbiAgbW9kZTogJ3Vwc2VydCcsXG4gIGV4dGVybmFsSWQ6IFsnY3JtX2NhbXBhaWduJywgJ2NybV9jb250YWN0J10sXG4gIHJlY29yZHM6IG1lbWJlclJlY29yZHMoJ2NvbnRhY3QnKSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9vYmplY3RzdGFjay5jb21wb3NpdGlvbi50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3XCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvb2JqZWN0c3RhY2suY29tcG9zaXRpb24udHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogVGhlIGZvdXIgcGFja2FnZXMsIGNvbGxlY3RlZCBpbnRvIHRoZSB0d28gcGFja2FnZSBzdGFja3MgdGhpcyBhcnRpZmFjdFxuICogY2Fycmllcy5cbiAqXG4gKiBBIGRpcmVjdG9yeSB1bmRlciBgc3JjL2AgSVMgYSBwYWNrYWdlIChBRFItMDEzMCwgYG1vZHVsZS1zcGxpdC1wbGFuLm1kYFxuICogaXRlbXMgNFx1MjAxMzkpLiBUd28gb2YgdGhlbSBhcmUgcGFja2FnZXMgb2YgdGhlIEFSVElGQUNUIGFzIHdlbGw6XG4gKlxuICogICAtIGBzcmMvc2FsZXMvYCBcdTIwMTQgYGFwcC5vYmplY3RzdGFjay5ob3Rjcm1gLCB0aGUgYHR5cGU6ICdhcHAnYCBwYWNrYWdlIHRoaXNcbiAqICAgICBhcnRpZmFjdCB0YWtlcyBpdHMgaWRlbnRpdHkgZnJvbS4gSXRzIGBkZWZpbmVTdGFja2AgaXMgdGhlIGZhY3RvcnkgaW5cbiAqICAgICBgc3JjL3NhbGVzL2luZGV4LnRzYCwgYW5kIHRoaXMgZmlsZSBoYW5kcyBpdCBpdHMgY29sbGVjdGlvbnM6IHRoZSBzYWxlc1xuICogICAgIGJhcnJlbHMgcGx1cyB0aG9zZSBvZiBgc3JjL3JldmVudWUvYCBhbmQgYHNyYy9tYXJrZXRpbmcvYCwgd2hpY2ggc3RheVxuICogICAgIGRpcmVjdG9yaWVzIG9mIHRoZSBhcHAgcGFja2FnZSB1bnRpbCB0aGV5IGdldCBwYWNrYWdpbmcgY2FyZHMgb2YgdGhlaXJcbiAqICAgICBvd24sIGFuZCB3aGljaCBhIGZpbGUgdW5kZXIgYHNyYy9zYWxlcy9gIG1heSBub3QgaW1wb3J0LlxuICogICAtIGBzcmMvc2VydmljZS9gIFx1MjAxNCBgYXBwLm9iamVjdHN0YWNrLmhvdGNybS5zZXJ2aWNlYCwgYSBgdHlwZTogJ21vZHVsZSdgLlxuICogICAgIEl0cyBgZGVmaW5lU3RhY2tgIGlzIGBzcmMvc2VydmljZS9pbmRleC50c2AsIHdoaWNoIGFzc2VtYmxlcyBpdHMgb3duXG4gKiAgICAgY29sbGVjdGlvbnMgZnJvbSBpdHMgb3duIGJhcnJlbHM7IHRoaXMgZmlsZSBoYW5kcyBpdCBvbmx5IHRoZSBzZWVkIHJvd3NcbiAqICAgICB0aGUgY29tcG9zaXRpb24ga25vYiBzZWxlY3RzLlxuICpcbiAqIGBvYmplY3RzdGFjay5jb25maWcudHNgIGNvbXBvc2VzIHRoZSB0d28gaW50byBPTkUgcmVsZWFzZSBhcnRpZmFjdC4gVGhpcyBmaWxlXG4gKiBidWlsZHMgdGhlbSwgYmVjYXVzZSBpdCBpcyB0aGUgb25lIHBsYWNlIHRoYXQgbWF5IHNlZSBldmVyeSBwYWNrYWdlIEFORCBjYXJyeVxuICogbmFtZWQgZXhwb3J0cy5cbiAqXG4gKiAjIyBXaHkgdGhpcyBpcyBub3Qgc2ltcGx5IHRoZSB0b3Agb2YgYG9iamVjdHN0YWNrLmNvbmZpZy50c2BcbiAqXG4gKiBUaGF0IGZpbGUgbWF5IGNhcnJ5IE5PIG5hbWVkIGV4cG9ydC4gYG9iamVjdHN0YWNrIGJ1aWxkYCByZWFkcyB0aGUgY29uZmlnXG4gKiBtb2R1bGUgYW5kIHBhcnNlcyBpdCBhZ2FpbnN0IGBPYmplY3RTdGFja0RlZmluaXRpb25TY2hlbWFgLCB3aGljaCBpc1xuICogYC5zdHJpY3RgLCBzbyBhbnkgZXhwb3J0IGJlc2lkZSB0aGUgZGVmYXVsdCBpcyBhbiB1bnJlY29nbmlzZWQgdG9wLWxldmVsXG4gKiBzdGFjayBrZXkgYW5kIHRoZSBidWlsZCBmYWlscyBieSBuYW1lLiBNZWFzdXJlZCBvbiB0aGUgcHJlLW1vdmUgdHJlZSwgbm90XG4gKiBhc3N1bWVkOiBhcHBlbmRpbmcgYGV4cG9ydCBjb25zdCBQcm9iZU5hbWVkRXhwb3J0ID0gWzEsIDIsIDNdO2AgdG8gdGhlXG4gKiB1bm1vZGlmaWVkIGBvYmplY3RzdGFjay5jb25maWcudHNgIGF0IDU5MGIwOTUgZmFpbHMgYHBucG0gYnVpbGRgIHdpdGhcbiAqIFwiVW5yZWNvZ25pemVkIGtleShzKSBvbiB0aGlzIHN0YWNrIGRlZmluaXRpb246IGBQcm9iZU5hbWVkRXhwb3J0YFwiLlxuICpcbiAqIFR3byBraW5kcyBvZiB2YWx1ZSBuZWVkIHRvIGJlIGltcG9ydGFibGUsIHNvIHRoZXkgbGl2ZSBoZXJlOlxuICpcbiAqICAgLSB0aGUgQVVUSE9SRUQgY29sbGVjdGlvbnMgXHUyMDE0IGFib3V0IGEgZG96ZW4gc3VpdGVzIGFzc2VydCBhZ2FpbnN0IHRoZW1cbiAqICAgICB1cHN0cmVhbSBvZiBgZGVmaW5lU3RhY2soKWAsIHdoaWNoIGlzIHRoZSBvbmx5IHNpZGUgb2YgdGhhdCBjYWxsIHdoZXJlXG4gKiAgICAgYENybVNlZWREYXRhYCBhbmQgdGhlIHN0YWNrJ3MgYGRhdGFgIGFyZSBkaXN0aW5ndWlzaGFibGUgYXQgYWxsIChzZWUgdGhlXG4gKiAgICAgbm90ZSBpbiBgdGVzdC9zYWFzLWNvbXBvc2l0aW9uLnRlc3QudHNgKTtcbiAqICAgLSB0aGUgdHdvIEJVSUxUIHBhY2thZ2Ugc3RhY2tzIFx1MjAxNCBhIG11bHRpLXBhY2thZ2UgYXJ0aWZhY3QgY2FycmllcyBldmVyeVxuICogICAgIGNvbGxlY3Rpb24gb25jZSwgaW5zaWRlIGl0cyBwYWNrYWdlJ3MgYm9keSBpbiBgcGFja2FnZXNbXWAsIGFuZCBubyBsb25nZXJcbiAqICAgICBiZXNpZGUgdGhlbSBhdCB0aGUgdG9wIGxldmVsIChBRFItMDEzMCBENCwgMjAyNi0wOS0yMiBhZGRlbmR1bSksIHNvIGFcbiAqICAgICBzdWl0ZSB0aGF0IHJlYWRzIFwiZXZlcnkgb2JqZWN0IG9mIHRoZSBhcHBcIiBjb21wb3NlcyB0aGVzZSB0d28gaXRzZWxmLlxuICpcbiAqICMjIE9yZGVyXG4gKlxuICogUmVnaXN0cmF0aW9uIG9yZGVyIHdpdGhpbiBhIGNvbGxlY3Rpb24gaXMgYSBwcm9wZXJ0eSBvZiBlYWNoIFBBQ0tBR0Ugbm93OlxuICogdGhlIGFydGlmYWN0IGNhcnJpZXMgZWFjaCBwYWNrYWdlJ3MgY29sbGVjdGlvbnMgaW4gaXRzIG93biBib2R5LCBpbiB0aGUgb3JkZXJcbiAqIHRoYXQgcGFja2FnZSdzIHN0YWNrIHdhcyBoYW5kZWQgdGhlbS4gVHdvIG9yZGVycyBzdGF5IGxvYWQtYmVhcmluZyBhbmQgYXJlXG4gKiBzdGF0ZWQgZXhwbGljaXRseSBiZWxvdyBcdTIwMTQgYENybVNlZWREYXRhYCwgdGhlIHJlcGxheSBvcmRlciBhIHNlZWQgcm93J3NcbiAqIG5hdHVyYWwta2V5IGxvb2t1cHMgd2VyZSB3cml0dGVuIGFnYWluc3QsIGFuZCB0aGUgaGFuZC1vcmRlcmVkIGxpc3RzXG4gKiAoYGFwcEhvb2tzYCwgYGFwcEZsb3dzYCwgYGFwcFNraWxsc2AsIGBhcHBTaGFyaW5nUnVsZXNgKSB0aGF0IGtlZXAgdGhlIG9yZGVyXG4gKiB0aGUgc2luZ2xlLXRyZWUgYmFycmVscyBoYWQuIEV2ZXJ5dGhpbmcgZWxzZSB1c2VzIGBieUV4cG9ydE5hbWUoKWAgXHUyMDE0IGFcbiAqIG1vZHVsZSBuYW1lc3BhY2UgZW51bWVyYXRlcyBpdHMgZXhwb3J0cyBpbiBhc2NlbmRpbmcgY29kZS11bml0IG9yZGVyIG9mIHRoZVxuICogZXhwb3J0IE5BTUUsIHNvIG1lcmdpbmcgc2V2ZXJhbCBiYXJyZWxzIGFuZCBzb3J0aW5nIGJ5IHRoYXQgbmFtZSBpcyB0aGUgc2FtZVxuICogcnVsZSBvbmUgYmFycmVsIGFscmVhZHkgYXBwbGllZCwgcmF0aGVyIHRoYW4gYSBuZXcgb25lLlxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhvdENybUFwcFN0YWNrIH0gZnJvbSAnLi9zcmMvc2FsZXMvaW5kZXguanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlSG90Q3JtU2VydmljZVN0YWNrLCBzZXJ2aWNlSG9va3MsIHNlcnZpY2VGbG93cywgc2VydmljZVNraWxscywgc2VydmljZVNoYXJpbmdSdWxlcyxcbn0gZnJvbSAnLi9zcmMvc2VydmljZS9pbmRleC5qcyc7XG5cbmltcG9ydCAqIGFzIHNhbGVzT2JqZWN0cyBmcm9tICcuL3NyYy9zYWxlcy9vYmplY3RzL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIHJldmVudWVPYmplY3RzIGZyb20gJy4vc3JjL3JldmVudWUvb2JqZWN0cy9pbmRleC5qcyc7XG5pbXBvcnQgKiBhcyBtYXJrZXRpbmdPYmplY3RzIGZyb20gJy4vc3JjL21hcmtldGluZy9vYmplY3RzL2luZGV4LmpzJztcblxuaW1wb3J0ICogYXMgc2FsZXNBY3Rpb25zIGZyb20gJy4vc3JjL3NhbGVzL2FjdGlvbnMvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgbWFya2V0aW5nQWN0aW9ucyBmcm9tICcuL3NyYy9tYXJrZXRpbmcvYWN0aW9ucy9pbmRleC5qcyc7XG5cbmltcG9ydCAqIGFzIHNhbGVzRGFzaGJvYXJkcyBmcm9tICcuL3NyYy9zYWxlcy9kYXNoYm9hcmRzL2luZGV4LmpzJztcblxuaW1wb3J0ICogYXMgc2FsZXNEYXRhc2V0cyBmcm9tICcuL3NyYy9zYWxlcy9kYXRhc2V0cy9pbmRleC5qcyc7XG5pbXBvcnQgKiBhcyByZXZlbnVlRGF0YXNldHMgZnJvbSAnLi9zcmMvcmV2ZW51ZS9kYXRhc2V0cy9pbmRleC5qcyc7XG5cbmltcG9ydCAqIGFzIHNhbGVzUmVwb3J0cyBmcm9tICcuL3NyYy9zYWxlcy9yZXBvcnRzL2luZGV4LmpzJztcblxuaW1wb3J0ICogYXMgbWFwcGluZ3MgZnJvbSAnLi9zcmMvc2FsZXMvbWFwcGluZ3MvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgYXBwcyBmcm9tICcuL3NyYy9zYWxlcy9hcHBzL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIHByb2ZpbGVzIGZyb20gJy4vc3JjL3NhbGVzL3Byb2ZpbGVzL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIHRyYW5zbGF0aW9ucyBmcm9tICcuL3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvaW5kZXguanMnO1xuXG5pbXBvcnQgKiBhcyBzYWxlc1ZpZXdzIGZyb20gJy4vc3JjL3NhbGVzL3ZpZXdzL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIHJldmVudWVWaWV3cyBmcm9tICcuL3NyYy9yZXZlbnVlL3ZpZXdzL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIG1hcmtldGluZ1ZpZXdzIGZyb20gJy4vc3JjL21hcmtldGluZy92aWV3cy9pbmRleC5qcyc7XG5cbmltcG9ydCAqIGFzIHNhbGVzUGFnZXMgZnJvbSAnLi9zcmMvc2FsZXMvcGFnZXMvaW5kZXguanMnO1xuXG5pbXBvcnQgKiBhcyBzYWxlc0VtYWlsVGVtcGxhdGVzIGZyb20gJy4vc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9pbmRleC5qcyc7XG5pbXBvcnQgKiBhcyByZXZlbnVlRW1haWxUZW1wbGF0ZXMgZnJvbSAnLi9zcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXMvaW5kZXguanMnO1xuXG5pbXBvcnQgeyBTeXN0ZW1BZG1pblByb2ZpbGUgfSBmcm9tICcuL3NyYy9zYWxlcy9wcm9maWxlcy9pbmRleC5qcyc7XG5pbXBvcnQgeyBUZW5hbnRBZG1pblByb2ZpbGUgfSBmcm9tICcuL3NyYy9zYWxlcy9wcm9maWxlcy90ZW5hbnQtYWRtaW4ucHJvZmlsZS5qcyc7XG5cbi8vIEhvb2tzIFx1MjAxNCBvbmUgYmFycmVsIHBlciBkaXJlY3RvcnksIGFzc2VtYmxlZCBiZWxvdyBpbiBzb3VyY2UtZmlsZS1uYW1lIG9yZGVyLlxuaW1wb3J0IHtcbiAgYWNjb3VudEhvb2ssIGNvbnRhY3RIb29rLCBldmVudEhvb2ssIGZvcmVjYXN0SG9vaywgbGVhZEhvb2ssXG4gIGxlYWRDYW1wYWlnbk1ldHJpY3NIb29rLCBvcHBvcnR1bml0eUhvb2ssIG9wcG9ydHVuaXR5Q2FtcGFpZ25NZXRyaWNzSG9vaywgdGFza0hvb2ssXG59IGZyb20gJy4vc3JjL3NhbGVzL29iamVjdHMvaG9va3MuanMnO1xuaW1wb3J0IHtcbiAgY29udHJhY3RIb29rLCBvcHBvcnR1bml0eUxpbmVJdGVtSG9vaywgcHJvZHVjdEhvb2ssIHF1b3RlSG9vaywgcXVvdGVMaW5lSXRlbUhvb2ssXG59IGZyb20gJy4vc3JjL3JldmVudWUvb2JqZWN0cy9ob29rcy5qcyc7XG5pbXBvcnQgeyBjYW1wYWlnbkhvb2ssIGNhbXBhaWduTWVtYmVySG9vayB9IGZyb20gJy4vc3JjL21hcmtldGluZy9vYmplY3RzL2hvb2tzLmpzJztcblxuLy8gRmxvd3MgXHUyMDE0IHRoZSByZWdpc3RyYXRpb24gb3JkZXIgdGhlIHNpbmdsZSBgYWxsRmxvd3NgIGFycmF5IHVzZWQgdG8gaG9sZC5cbmltcG9ydCB7XG4gIENvbnRhY3RXZWxjb21lRmxvdywgRm9yZWNhc3RTbmFwc2hvdEZsb3csIExlYWRBc3NpZ25tZW50RmxvdyxcbiAgQWNjb3VudEFwcHJvdmFsRmxvdyxcbiAgTGVhZENvbnZlcnNpb25GbG93LCBMZWFkQ29udmVyc2lvbkFwcHJvdmFsRmxvdyxcbiAgT3Bwb3J0dW5pdHlBcHByb3ZhbEZsb3csIE9wcG9ydHVuaXR5QXBwcm92YWxPbkNyZWF0ZUZsb3csXG4gIE9wcG9ydHVuaXR5U3RhdHVzQ2hhbmdlQXBwcm92YWxGbG93LCBPcHBvcnR1bml0eVF1YWxpZmljYXRpb25BcHByb3ZhbEZsb3csXG4gIE9wcG9ydHVuaXR5U3RhZ25hdGlvbkZsb3csIE9wcG9ydHVuaXR5V29uQWxlcnRGbG93LCBTY2hlZHVsZUZvbGxvd1VwRmxvdyxcbiAgVGFza0R1ZVJlbWluZGVyRmxvdywgVGFza1VyZ2VudEFsZXJ0RmxvdywgQmlsbGluZ0hhbmRvZmZDbG9zZWRXb25GbG93LFxufSBmcm9tICcuL3NyYy9zYWxlcy9mbG93cy9pbmRleC5qcyc7XG5pbXBvcnQge1xuICBRdW90ZUdlbmVyYXRpb25GbG93LCBDb250cmFjdFJlbmV3YWxGbG93LCBRdW90ZUV4cGlyYXRpb25GbG93LCBDb250cmFjdEV4cGlyYXRpb25GbG93LFxuICBCaWxsaW5nSGFuZG9mZkNvbnRyYWN0QWN0aXZhdGVkRmxvdyxcbn0gZnJvbSAnLi9zcmMvcmV2ZW51ZS9mbG93cy9pbmRleC5qcyc7XG5pbXBvcnQge1xuICBDYW1wYWlnbkVucm9sbG1lbnRGbG93LCBDYW1wYWlnbkxlYWRNZW1iZXJFbnJvbGxGbG93LCBDYW1wYWlnbkNvbnRhY3RNZW1iZXJFbnJvbGxGbG93LFxuICBDYW1wYWlnbkNvbXBsZXRpb25GbG93LFxufSBmcm9tICcuL3NyYy9tYXJrZXRpbmcvZmxvd3MvaW5kZXguanMnO1xuXG4vLyBTa2lsbHMgXHUyMDE0IGxpa2V3aXNlLlxuaW1wb3J0IHtcbiAgTGVhZFF1YWxpZmljYXRpb25Ta2lsbCwgRW1haWxEcmFmdGluZ1NraWxsLCBSZXZlbnVlRm9yZWNhc3RpbmdTa2lsbCxcbiAgQ3VzdG9tZXIzNjBTa2lsbCwgTGl2ZURhdGFTa2lsbCxcbn0gZnJvbSAnLi9zcmMvc2FsZXMvc2tpbGxzL2luZGV4LmpzJztcblxuaW1wb3J0IHtcbiAgQWNjb3VudFRlYW1TaGFyaW5nUnVsZSwgVGVycml0b3J5U2hhcmluZ1J1bGVzLFxuICBPcHBvcnR1bml0eVNhbGVzU2hhcmluZ1J1bGUsIE9wcG9ydHVuaXR5RXhlY3V0aXZlU2hhcmluZ1J1bGUsXG4gIENybVBvc2l0aW9ucyxcbn0gZnJvbSAnLi9zcmMvc2FsZXMvc2hhcmluZy9pbmRleC5qcyc7XG5pbXBvcnQgeyBDYW1wYWlnbkxlYWRlcnNoaXBTaGFyaW5nUnVsZXMgfSBmcm9tICcuL3NyYy9tYXJrZXRpbmcvc2hhcmluZy9pbmRleC5qcyc7XG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZURlZmluaXRpb24gfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG4vLyBTZWVkIHJvd3MgXHUyMDE0IHRoZSByZXBsYXkgb3JkZXIgbGl2ZXMgaW4gYENybVNlZWREYXRhYCBiZWxvdy5cbmltcG9ydCB0eXBlIHsgSG90Q3JtQ29tcG9zaXRpb24gfSBmcm9tICcuL3NyYy9zYWxlcy9kYXRhL2luZGV4LmpzJztcbmltcG9ydCB7XG4gIHJlc29sdmVDb21wb3NpdGlvbixcbiAgYWNjb3VudHMsIGNvbnRhY3RzLCBsZWFkcywgb3Bwb3J0dW5pdGllcyxcbiAgdGFza3MsIGV2ZW50cywgZXZlbnRBdHRlbmRlZXNGcm9tQ29udGFjdHMsIGV2ZW50QXR0ZW5kZWVzRnJvbUxlYWRzLCBsZWFkSW50ZXJhY3Rpb25Qb2ludGVycywgZm9yZWNhc3RzLFxufSBmcm9tICcuL3NyYy9zYWxlcy9kYXRhL2luZGV4LmpzJztcbmltcG9ydCB7IHByb2R1Y3RzLCBvcHBvcnR1bml0eUxpbmVJdGVtcywgY29udHJhY3RzLCBxdW90ZXMsIHF1b3RlTGluZUl0ZW1zIH0gZnJvbSAnLi9zcmMvcmV2ZW51ZS9kYXRhL2luZGV4LmpzJztcbmltcG9ydCB7IGNhc2VzLCBrbm93bGVkZ2VBcnRpY2xlcyB9IGZyb20gJy4vc3JjL3NlcnZpY2UvZGF0YS9pbmRleC5qcyc7XG5pbXBvcnQgeyBjYW1wYWlnbnMsIGNhbXBhaWduTWVtYmVyc0Zyb21MZWFkcywgY2FtcGFpZ25NZW1iZXJzRnJvbUNvbnRhY3RzIH0gZnJvbSAnLi9zcmMvbWFya2V0aW5nL2RhdGEvaW5kZXguanMnO1xuXG4vKipcbiAqIE9uZSByZWdpc3RyYXRpb24gYXJyYXkgb3V0IG9mIHRoZSBtZXJnZWQgcGVyLXBhY2thZ2UgYmFycmVscyBvZiBhIG1ldGFkYXRhXG4gKiB0eXBlLCBvcmRlcmVkIGJ5IEVYUE9SVCBOQU1FLlxuICpcbiAqIGBPYmplY3QudmFsdWVzKDxtb2R1bGUgbmFtZXNwYWNlPilgIFx1MjAxNCB3aGF0IHRoaXMgZmlsZSBkaWQgZm9yIGVhY2ggb2YgdGhlc2VcbiAqIGNvbGxlY3Rpb25zIHdoaWxlIHRoZXJlIHdhcyBvbmUgYmFycmVsIHBlciB0eXBlIFx1MjAxNCBlbnVtZXJhdGVzIGluIGFzY2VuZGluZ1xuICogY29kZS11bml0IG9yZGVyIG9mIHRoZSBleHBvcnQgbmFtZSwgbm90IGluIHRoZSBiYXJyZWwncyBkZWNsYXJhdGlvbiBvcmRlci5cbiAqIChNZWFzdXJlZCBvbiB0aGUgcHJlLW1vdmUgYXJ0aWZhY3Q6IGBzcmMvcGFnZXMvaW5kZXgudHNgIGRlY2xhcmVkXG4gKiBgTGVhZERldGFpbFBhZ2VgIGZpcnN0IGFuZCB0aGUgYXJ0aWZhY3QncyBgcGFnZXNbXWAgc3RpbGwgYmVnYW4gd2l0aFxuICogYGFjY291bnRfZGV0YWlsX3BhZ2VgLikgU28gc29ydGluZyB0aGUgbWVyZ2VkIGVudHJpZXMgYnkgZXhwb3J0IG5hbWUgaXMgbm90XG4gKiBhIG5ldyBvcmRlcmluZyBydWxlIFx1MjAxNCBpdCBpcyB0aGUgc2FtZSBvbmUsIGFwcGxpZWQgYWNyb3NzIGZvdXIgbmFtZXNwYWNlc1xuICogaW5zdGVhZCBvZiBvbmUuXG4gKlxuICogVGhlIG5hbWVzcGFjZXMgYXJlIHNwcmVhZCBpbnRvIG9uZSBvYmplY3QgYXQgdGhlIGNhbGwgc2l0ZSwgd2hpY2ggaXMgYWxzb1xuICogd2hhdCBrZWVwcyB0aGUgZW50cmllcyBUWVBFRDogZWFjaCBiYXJyZWwgaXMgaXRzIG93biBtb2R1bGUgbmFtZXNwYWNlIHdpdGhcbiAqIGl0cyBvd24gZWxlbWVudCB1bmlvbiwgc28gcGFzc2luZyB0aGVtIGFzIHNlcGFyYXRlIGFyZ3VtZW50cyBtYWtlc1xuICogVHlwZVNjcmlwdCBpbmZlciBgVGAgZnJvbSB0aGUgZmlyc3Qgb25lIGFsb25lIGFuZCByZWplY3QgdGhlIHJlc3QuIEFcbiAqIGR1cGxpY2F0ZSBleHBvcnQgbmFtZSBhY3Jvc3MgdHdvIHBhY2thZ2VzIHdvdWxkIGNvbGxpZGUgaW4gdGhhdCBzcHJlYWQgXHUyMDE0IGl0XG4gKiBjb3VsZCBub3QgaGFwcGVuIHdoaWxlIHRoZSBleHBvcnRzIHNoYXJlZCBvbmUgbmFtZXNwYWNlIGVpdGhlciwgYW5kIGl0IGlzIGFcbiAqIGNvbXBpbGUgZXJyb3IgdGhlIGRheSB0d28gcGFja2FnZXMgZXhwb3J0IHRoZSBzYW1lIG5hbWUuXG4gKi9cbmNvbnN0IGJ5RXhwb3J0TmFtZSA9IDxUPihtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIFQ+KTogVFtdID0+XG4gIE9iamVjdC5lbnRyaWVzKG1lcmdlZClcbiAgICAuc29ydCgoW2FdLCBbYl0pID0+IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCkpXG4gICAgLm1hcCgoWywgdmFsdWVdKSA9PiB2YWx1ZSk7XG5cbi8qIFx1MjUwMFx1MjUwMFx1MjUwMCBUaGUgYXBwIHBhY2thZ2UncyBjb2xsZWN0aW9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgKi9cblxuLyoqXG4gKiBFdmVyeSBDUk0gbGlmZWN5Y2xlIGhvb2sgdGhlIEFQUCBQQUNLQUdFIHJlZ2lzdGVycywgaW4gdGhlIG9yZGVyXG4gKiBgc3JjL2hvb2tzL2luZGV4LnRzYCByZWdpc3RlcmVkIHRoZW0gKGJ5IGhvb2sgc291cmNlIGZpbGUgbmFtZSkgXHUyMDE0IHNlZSB0aGVcbiAqIE9SREVSIG5vdGUgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuXG4gKlxuICogYCouaG9vay50c2AgZmlsZXMgc2l0IGJlc2lkZSB0aGUgYCoub2JqZWN0LnRzYCB0aGV5IG5hbWUsIG9uZSBkaXJlY3RvcnkgZWFjaCxcbiAqIHdoaWNoIGlzIHdoYXQgZW5mb3JjZXMgQURSLTAxMzAgUjQuIFR3byBlbnRyaWVzIHRoZXJlZm9yZSBjb21lIGZyb20gYVxuICogZGlmZmVyZW50IGRpcmVjdG9yeSB0aGFuIHRoZSBjYW1wYWlnbiBtZXRhZGF0YSB0aGV5IG1haW50YWluOlxuICogYG9wcG9ydHVuaXR5Q2FtcGFpZ25NZXRyaWNzSG9va2AgYW5kIGBsZWFkQ2FtcGFpZ25NZXRyaWNzSG9va2AgYXJlIGF0dGFjaGVkXG4gKiB0byBgY3JtX29wcG9ydHVuaXR5YCBhbmQgYGNybV9sZWFkYCwgc28gdGhleSBsaXZlIGluIHNhbGVzLiBUaGUgdGhyZWUgc2VydmljZVxuICogaG9va3MgcmVnaXN0ZXIgd2l0aCB0aGUgc2VydmljZSBwYWNrYWdlIChgc2VydmljZUhvb2tzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBIb29rcyA9IFtcbiAgYWNjb3VudEhvb2ssXG4gIGNhbXBhaWduSG9vayxcbiAgb3Bwb3J0dW5pdHlDYW1wYWlnbk1ldHJpY3NIb29rLFxuICBsZWFkQ2FtcGFpZ25NZXRyaWNzSG9vayxcbiAgY2FtcGFpZ25NZW1iZXJIb29rLFxuICBjb250YWN0SG9vayxcbiAgY29udHJhY3RIb29rLFxuICBldmVudEhvb2ssXG4gIGZvcmVjYXN0SG9vayxcbiAgbGVhZEhvb2ssXG4gIG9wcG9ydHVuaXR5SG9vayxcbiAgb3Bwb3J0dW5pdHlMaW5lSXRlbUhvb2ssXG4gIHByb2R1Y3RIb29rLFxuICBxdW90ZUhvb2ssXG4gIHF1b3RlTGluZUl0ZW1Ib29rLFxuICB0YXNrSG9vayxcbl0uZmxhdE1hcCgoZW50cnkpID0+IChBcnJheS5pc0FycmF5KGVudHJ5KSA/IGVudHJ5IDogW2VudHJ5XSkpO1xuXG4vKipcbiAqIEV2ZXJ5IGZsb3cgdGhlIGFwcCBwYWNrYWdlIHJlZ2lzdGVycywgaW4gdGhlIG9yZGVyIHRoZSBzaW5nbGUgYGFsbEZsb3dzYFxuICogYXJyYXkgcmVnaXN0ZXJlZCB0aGVtLiBUaGUgc2V2ZW4gY2FzZSBmbG93cyByZWdpc3RlciB3aXRoIHRoZSBzZXJ2aWNlXG4gKiBwYWNrYWdlIChgc2VydmljZUZsb3dzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBGbG93cyA9IFtcbiAgQ2FtcGFpZ25FbnJvbGxtZW50RmxvdyxcbiAgQ2FtcGFpZ25MZWFkTWVtYmVyRW5yb2xsRmxvdyxcbiAgQ2FtcGFpZ25Db250YWN0TWVtYmVyRW5yb2xsRmxvdyxcbiAgQWNjb3VudEFwcHJvdmFsRmxvdyxcbiAgTGVhZENvbnZlcnNpb25GbG93LFxuICBMZWFkQ29udmVyc2lvbkFwcHJvdmFsRmxvdyxcbiAgU2NoZWR1bGVGb2xsb3dVcEZsb3csXG4gIE9wcG9ydHVuaXR5QXBwcm92YWxGbG93LFxuICBPcHBvcnR1bml0eUFwcHJvdmFsT25DcmVhdGVGbG93LFxuICBPcHBvcnR1bml0eVN0YXR1c0NoYW5nZUFwcHJvdmFsRmxvdyxcbiAgT3Bwb3J0dW5pdHlRdWFsaWZpY2F0aW9uQXBwcm92YWxGbG93LFxuICBRdW90ZUdlbmVyYXRpb25GbG93LFxuICBDb250cmFjdFJlbmV3YWxGbG93LFxuICBPcHBvcnR1bml0eVN0YWduYXRpb25GbG93LFxuICBGb3JlY2FzdFNuYXBzaG90RmxvdyxcbiAgTGVhZEFzc2lnbm1lbnRGbG93LFxuICBDYW1wYWlnbkNvbXBsZXRpb25GbG93LFxuICBRdW90ZUV4cGlyYXRpb25GbG93LFxuICBDb250cmFjdEV4cGlyYXRpb25GbG93LFxuICBDb250YWN0V2VsY29tZUZsb3csXG4gIE9wcG9ydHVuaXR5V29uQWxlcnRGbG93LFxuICBUYXNrVXJnZW50QWxlcnRGbG93LFxuICBUYXNrRHVlUmVtaW5kZXJGbG93LFxuICBCaWxsaW5nSGFuZG9mZkNsb3NlZFdvbkZsb3csXG4gIEJpbGxpbmdIYW5kb2ZmQ29udHJhY3RBY3RpdmF0ZWRGbG93LFxuXTtcblxuLyoqXG4gKiBFdmVyeSBza2lsbCB0aGUgYXBwIHBhY2thZ2UgcmVnaXN0ZXJzIFx1MjAxNCB0aGUgY3Jvc3MtZG9tYWluIG9uZXMgYXJlIGFsbCBoZXJlLlxuICogVGhlIGNhc2UtdHJpYWdlIHNraWxsIHJlZ2lzdGVycyB3aXRoIHRoZSBzZXJ2aWNlIHBhY2thZ2UgKGBzZXJ2aWNlU2tpbGxzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBTa2lsbHMgPSBbXG4gIExlYWRRdWFsaWZpY2F0aW9uU2tpbGwsXG4gIEVtYWlsRHJhZnRpbmdTa2lsbCxcbiAgUmV2ZW51ZUZvcmVjYXN0aW5nU2tpbGwsXG4gIEN1c3RvbWVyMzYwU2tpbGwsXG4gIExpdmVEYXRhU2tpbGwsXG5dO1xuXG4vKiogRXZlcnkgb2JqZWN0IGRlZmluaXRpb24gdGhlIGFwcCBwYWNrYWdlIHJlZ2lzdGVycy4gKi9cbmV4cG9ydCBjb25zdCBhcHBPYmplY3RzID0gYnlFeHBvcnROYW1lKHtcbiAgLi4uc2FsZXNPYmplY3RzLCAuLi5yZXZlbnVlT2JqZWN0cywgLi4ubWFya2V0aW5nT2JqZWN0cyxcbn0pO1xuXG4vKiogRXZlcnkgVUkgLyBBSS1jYWxsYWJsZSBhY3Rpb24gaXQgcmVnaXN0ZXJzLiAqL1xuZXhwb3J0IGNvbnN0IGFwcEFjdGlvbnMgPSBieUV4cG9ydE5hbWUoeyAuLi5zYWxlc0FjdGlvbnMsIC4uLm1hcmtldGluZ0FjdGlvbnMgfSk7XG5cbi8qKiBJdHMgZGFzaGJvYXJkcyBcdTIwMTQgdGhlIGNyb3NzLWRvbWFpbiBvbmVzIGluY2x1ZGVkIChwbGFuIGl0ZW0gNCkuICovXG5leHBvcnQgY29uc3QgYXBwRGFzaGJvYXJkcyA9IGJ5RXhwb3J0TmFtZSh7IC4uLnNhbGVzRGFzaGJvYXJkcyB9KTtcblxuLyoqIEl0cyBhbmFseXRpY3MgZGF0YXNldHMgKEFEUi0wMDIxKS4gKi9cbmV4cG9ydCBjb25zdCBhcHBEYXRhc2V0cyA9IGJ5RXhwb3J0TmFtZSh7IC4uLnNhbGVzRGF0YXNldHMsIC4uLnJldmVudWVEYXRhc2V0cyB9KTtcblxuLyoqIEl0cyByZXBvcnRzLiAqL1xuZXhwb3J0IGNvbnN0IGFwcFJlcG9ydHMgPSBieUV4cG9ydE5hbWUoeyAuLi5zYWxlc1JlcG9ydHMgfSk7XG5cbi8qKiBJdHMgbGlzdC12aWV3IGdyb3Vwcy4gKi9cbmV4cG9ydCBjb25zdCBhcHBWaWV3cyA9IGJ5RXhwb3J0TmFtZSh7XG4gIC4uLnNhbGVzVmlld3MsIC4uLnJldmVudWVWaWV3cywgLi4ubWFya2V0aW5nVmlld3MsXG59KTtcblxuLyoqIEl0cyBwYWdlIGxheW91dHMgXHUyMDE0IGBob21lYCwgYGFwcF9sYXVuY2hlcmAgYW5kIGB1dGlsaXR5X2JhcmAgYW1vbmcgdGhlbS4gKi9cbmV4cG9ydCBjb25zdCBhcHBQYWdlcyA9IGJ5RXhwb3J0TmFtZSh7IC4uLnNhbGVzUGFnZXMgfSk7XG5cbi8qKiBFdmVyeSBpbXBvcnQgbWFwcGluZyBcdTIwMTQgc2FsZXMgb25seTsgbm90aGluZyBlbHNlIGF1dGhvcnMgb25lLiAqL1xuZXhwb3J0IGNvbnN0IGFwcE1hcHBpbmdzID0gYnlFeHBvcnROYW1lKHsgLi4ubWFwcGluZ3MgfSk7XG5cbi8qKiBUaGUgYXBwIGl0c2VsZiwgYW5kIGl0cyBuYXZpZ2F0aW9uIEdST1VQUyAodGhlIGNvbnRhaW5lcnMgbW9kdWxlcyBhaW0gYXQpLiAqL1xuZXhwb3J0IGNvbnN0IGFwcEFwcHMgPSBieUV4cG9ydE5hbWUoeyAuLi5hcHBzIH0pO1xuXG4vKiogVGhlIGxvY2FsZSBwYWNrcyBcdTIwMTQgd2hvbGUgaW4gdGhlIGFwcCBwYWNrYWdlIChwbGFuIGl0ZW0gNCksIHNlcnZpY2UgbGFiZWxzIGluY2x1ZGVkLiAqL1xuZXhwb3J0IGNvbnN0IGFwcFRyYW5zbGF0aW9ucyA9IGJ5RXhwb3J0TmFtZSh7IC4uLnRyYW5zbGF0aW9ucyB9KTtcblxuLyoqXG4gKiBFdmVyeSBgc3lzX2VtYWlsX3RlbXBsYXRlYCByb3cgdGhlIGFwcCBwYWNrYWdlIHJlZ2lzdGVycyBcdTIwMTQgdGhlIGxvY2FsaXphYmxlXG4gKiBjb250ZW50IHBhdGggZm9yIGBub3RpZnlgICgjOTIwNSkuIFRoZSBzZXJ2aWNlIHBhY2thZ2UgcmVnaXN0ZXJzIGl0cyBvd24gdHdvXG4gKiBjYXNlIHRlbXBsYXRlcywgYmVzaWRlIHRoZSBmbG93cyB0aGF0IHNlbmQgdGhlbS5cbiAqXG4gKiBBIHBhY2thZ2UgYmFycmVsIGV4cG9ydHMgT05FIHN5bWJvbCBjYXJyeWluZyB0aGF0IHBhY2thZ2UncyByb3dzLCBzb1xuICogYGJ5RXhwb3J0TmFtZSgpYCBvcmRlcnMgdGhlbSBieSBleHBvcnQgbmFtZSBhbmQgYC5mbGF0KClgIHByb2R1Y2VzIHRoZVxuICogc2luZ2xlIGFycmF5IGBkZWZpbmVTdGFjayh7IGVtYWlsVGVtcGxhdGVzIH0pYCB0YWtlcy4gUmVhY2hpbmcgdGhlIHBhY2thZ2VcbiAqIGJhcnJlbCBJUyByZWFjaGluZyB0aGUgcmVnaXN0cmF0aW9uIGhlcmU6IG5vIGhhbmQta2VwdCBvcmRlcmVkIGxpc3QsIGJlY2F1c2VcbiAqIG5vdGhpbmcgYWJvdXQgdGhlIG9yZGVyIGlzIGxvYWQtYmVhcmluZyBcdTIwMTQgYSByb3cgaXMgcmVzb2x2ZWQgYnlcbiAqIGAobmFtZSwgbG9jYWxlKWAgYXQgZGVsaXZlcnkgdGltZSwgbmV2ZXIgYnkgcG9zaXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBFbWFpbFRlbXBsYXRlcyA9IGJ5RXhwb3J0TmFtZTxFbWFpbFRlbXBsYXRlRGVmaW5pdGlvbltdPih7XG4gIC4uLnNhbGVzRW1haWxUZW1wbGF0ZXMsIC4uLnJldmVudWVFbWFpbFRlbXBsYXRlcyxcbn0pLmZsYXQoKTtcblxuLyoqXG4gKiBUaGUgcGVybWlzc2lvbiBzZXRzLCBhcyB0aGUgTkFNRVNQQUNFIHJhdGhlciB0aGFuIGFuIGFycmF5OiB0aGUgU2FhU1xuICogY29tcG9zaXRpb24gZmlsdGVycyB0aGVtIGJ5IGlkZW50aXR5IGJlbG93LCB3aGljaCBuZWVkcyBgT2JqZWN0LnZhbHVlcygpYFxuICogb3ZlciB0aGUgc2FtZSBvYmplY3QgdGhlIG5hbWVkIGV4cG9ydHMgY29tZSBmcm9tLlxuICpcbiAqIFRoZXkgc3RheSBXSE9MRSBpbiB0aGUgYXBwIHBhY2thZ2UgKEFEUi0wMTMwIGFkZGVuZHVtLCAyMDI2LTA5LTAyKSwgc2VydmljZVxuICogZ3JhbnRzIGluY2x1ZGVkOiBhIHBlcm1pc3Npb24gc2V0IGlzIGEgcm9sZSBhIHBlcnNvbiBob2xkcyBhY3Jvc3MgdGhlIHdob2xlXG4gKiBwcm9kdWN0LCBub3QgYSBwcm9wZXJ0eSBvZiBvbmUgbW9kdWxlLlxuICovXG5leHBvcnQgY29uc3QgYWxsUHJvZmlsZXMgPSBwcm9maWxlcztcblxuZXhwb3J0IHsgU3lzdGVtQWRtaW5Qcm9maWxlLCBUZW5hbnRBZG1pblByb2ZpbGUgfTtcblxuLyoqXG4gKiBUaGUgc2hhcmluZyBydWxlcyB0aGUgYXBwIHBhY2thZ2UgcmVnaXN0ZXJzLCBpbiB0aGUgb3JkZXIgdGhpcyBhcHAgaGFzXG4gKiBhbHdheXMgcmVnaXN0ZXJlZCB0aGVtLiBUaGUgdGhyZWUgQ0FTRSBydWxlcyBhcmUgYXV0aG9yZWQgYWdhaW5zdFxuICogYGNybV9jYXNlYCBhbmQgcmVnaXN0ZXIgd2l0aCB0aGUgc2VydmljZSBwYWNrYWdlIChgc2VydmljZVNoYXJpbmdSdWxlc2ApLlxuICovXG5leHBvcnQgY29uc3QgYXBwU2hhcmluZ1J1bGVzID0gW1xuICBBY2NvdW50VGVhbVNoYXJpbmdSdWxlLFxuICBPcHBvcnR1bml0eVNhbGVzU2hhcmluZ1J1bGUsXG4gIE9wcG9ydHVuaXR5RXhlY3V0aXZlU2hhcmluZ1J1bGUsXG4gIC4uLlRlcnJpdG9yeVNoYXJpbmdSdWxlcyxcbiAgLi4uQ2FtcGFpZ25MZWFkZXJzaGlwU2hhcmluZ1J1bGVzLFxuXTtcblxuZXhwb3J0IHsgQ3JtUG9zaXRpb25zIH07XG5cbi8qIFx1MjUwMFx1MjUwMFx1MjUwMCBBcnRpZmFjdC13aWRlIHN3ZWVwcyBcdTIwMTQgd2hhdCB0aGUgc3VpdGVzIHJlYWQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwICovXG5cbi8qKlxuICogRXZlcnkgaG9vayBpbiB0aGUgQVJUSUZBQ1QsIGJvdGggcGFja2FnZXMuXG4gKlxuICogVGhlIHN1aXRlcyB0aGF0IHN3ZWVwIGhvb2tzIChgdGVzdC9yZWZ1c2FsLWVudmVsb3BlLnRlc3QudHNgLFxuICogYHRlc3QvcnVudGltZS1jb3ZlcmFnZS50ZXN0LnRzYCwgYHRlc3QvaG9vay13cml0ZS1zaGFwZS50ZXN0LnRzYCxcbiAqIGB0ZXN0L2FjdGlvbi1zYW5kYm94LnRlc3QudHNgLCBgdGVzdC90ZXJyaXRvcnktc2luZ2xlLXNvdXJjZS50ZXN0LnRzYCkgYXJlXG4gKiBhYm91dCB0aGUgYXBwIGEgY3VzdG9tZXIgaW5zdGFsbHMsIHdoaWNoIGlzIHRoZSB3aG9sZSBhcnRpZmFjdCBcdTIwMTQgc28gdGhleSBrZWVwXG4gKiByZWFkaW5nIG9uZSBsaXN0LCBhc3NlbWJsZWQgaGVyZSBmcm9tIGVhY2ggcGFja2FnZSdzIG93bi5cbiAqL1xuZXhwb3J0IGNvbnN0IGFsbEhvb2tzID0gWy4uLmFwcEhvb2tzLCAuLi5zZXJ2aWNlSG9va3NdO1xuXG4vKiogRXZlcnkgZmxvdyBpbiB0aGUgYXJ0aWZhY3QsIGJvdGggcGFja2FnZXMgXHUyMDE0IHNhbWUgcmVhc29uIGFzIHtAbGluayBhbGxIb29rc30uICovXG5leHBvcnQgY29uc3QgYWxsRmxvd3MgPSBbLi4uYXBwRmxvd3MsIC4uLnNlcnZpY2VGbG93c107XG5cbi8qKiBFdmVyeSBza2lsbCBpbiB0aGUgYXJ0aWZhY3QsIGJvdGggcGFja2FnZXMgXHUyMDE0IHNhbWUgcmVhc29uIGFzIHtAbGluayBhbGxIb29rc30uICovXG5leHBvcnQgY29uc3QgYWxsU2tpbGxzID0gWy4uLmFwcFNraWxscywgLi4uc2VydmljZVNraWxsc107XG5cbi8qKiBFdmVyeSBzaGFyaW5nIHJ1bGUgaW4gdGhlIGFydGlmYWN0LCBib3RoIHBhY2thZ2VzIFx1MjAxNCBzYW1lIHJlYXNvbiBhcyB7QGxpbmsgYWxsSG9va3N9LiAqL1xuZXhwb3J0IGNvbnN0IENybVNoYXJpbmdSdWxlcyA9IFsuLi5hcHBTaGFyaW5nUnVsZXMsIC4uLnNlcnZpY2VTaGFyaW5nUnVsZXNdO1xuXG5cbi8qKlxuICogT3duZXJzaGlwIGFuZCBDUk0gcG9zaXRpb25zIGFyZSBOT1Qgc2VlZGVkIGhlcmUgXHUyMDE0IHRoZXkgY2FuJ3QgYmUuXG4gKlxuICogQSBzZWVkIGNhbid0IG5hbWUgYSB1c2VyLiBMb29rdXAgdmFsdWVzIGFyZSByZXNvbHZlZCBhZ2FpbnN0IHRoZSB0YXJnZXQnc1xuICogZXh0ZXJuYWxJZCBhbmQgdGhhdCBvbmx5IHdvcmtzIGZvciBvYmplY3RzIGluIHRoZSBhcHAncyBvd24gZ3JhcGgsIHNvXG4gKiBgb3duZXJfaWQ6ICdEZXYgQWRtaW4nYCB3b3VsZCBzdG9yZSB0aGUgbGl0ZXJhbCBzdHJpbmcgcmF0aGVyIHRoYW4gYW4gaWQgKHZlcmlmaWVkOlxuICogYSBgc3lzX3VzZXJfcG9zaXRpb25gIHJvdyBzZWVkZWQgdGhhdCB3YXkgaXMgdW5tYXRjaGFibGUgYnkgdGhlIHJlYWwgdXNlclxuICogaWQpLCBhbmQgYGNlbFxcYG9zLnVzZXIuaWRcXGBgIGluc2lkZSBhIHNlZWQgZXZhbHVhdGVzIHRvIG5vdGhpbmcuIFRoZSBpZCBkb2VzXG4gKiBub3QgZXhpc3QgdW50aWwgZmlyc3QgYm9vdC5cbiAqXG4gKiBUaGUgUExBVEZPUk0gZG9lcyBpdCwgYXQgdGhlIG9ubHkgbW9tZW50IGl0IGNhbjogd2hlbiB0aGUgc2VlZCBzZXR0bGVzLFxuICogYEBvYmplY3RzdGFjay9wbHVnaW4tc2VjdXJpdHlgIHJlLXJ1bnMgaXRzIHNlZWQtb3duZXJzaGlwIGNsYWltIG9uXG4gKiBgYXBwOnNlZWRlZGAgYW5kIGhhbmRzIGV2ZXJ5IG93bmVybGVzcyByb3cgb2YgZXZlcnkgb2JqZWN0IGNhcnJ5aW5nXG4gKiBgb3duZXJfaWRgIHRvIHRoZSBmaXJzdCBwbGF0Zm9ybSBhZG1pbmlzdHJhdG9yIChvYmplY3RzdGFjayMxNzg3Miwgc2hpcHBlZCBpblxuICogMTcuNi4wKS4gTm8gSG90Q1JNIGZsb3cgaXMgaW52b2x2ZWQuIFRoZSBgZGVtb19ib290c3RyYXBgIHN3ZWVwIHRoYXQgdXNlZFxuICogdG8gZG8gdGhpcyBldmVyeSB0ZW4gbWludXRlcyB3YXMgcmV0aXJlZCBvbmNlIGEgZnJlc2ggYm9vdCBtZWFzdXJlZCB0aGF0XG4gKiBjbGFpbSBsZWF2aW5nIGFsbCB0d2VsdmUgc2VlZGVkIG93bmVyLXNjb3BlZCBvYmplY3RzIGF0IHplcm8gb3duZXJsZXNzIHJvd3NcbiAqIHdpdGggdGhlIHN3ZWVwIGRpc2FibGVkICgjMTg5MikuXG4gKlxuICogYG93bmVyX2lkYCBpcyB0aGUgYXBwJ3MgT05FIG93bmVyc2hpcCBjb2x1bW4gKCM1NDggcmV0aXJlZCB0aGUgYXBwLWF1dGhvcmVkXG4gKiBgb3duZXJgIGxvb2t1cCB0aGF0IHVzZWQgdG8gc2l0IGJlc2lkZSBpdCBcdTIwMTQgdGhlICM2MjIgc3BsaXQpLiBTZWVkIHdyaXRlcyBydW5cbiAqIHVuZGVyIGB7IGlzU3lzdGVtOiB0cnVlIH1gLCB3aGljaCBzaG9ydC1jaXJjdWl0cyB0aGUgc2VjdXJpdHkgbWlkZGxld2FyZSwgc29cbiAqIGl0cyBpbnNlcnQtdGltZSBhdXRvLXN0YW1wIG9mIGBvd25lcl9pZGAgbmV2ZXIgZmlyZXMgXHUyMDE0IFwic2VlZHMgZWl0aGVyIGRlY2xhcmVcbiAqIHRob3NlIGZpZWxkcyBleHBsaWNpdGx5IHBlciByZWNvcmRcIiBcdTIwMTQgYW5kIHBlciB0aGUgcGFyYWdyYXBoIGFib3ZlIHRoZXNlIHNlZWRzXG4gKiBjYW5ub3QgZGVjbGFyZSBpdC4gU28gYSBzZWVkZWQgcm93IHJlYWNoZXMgdGhlIGRhdGFiYXNlIG93bmVkIGJ5IG5vYm9keVxuICogKGBvd25lcl9pZGAgbnVsbCkgdW50aWwgdGhhdCBjbGFpbSBydW5zLiBOb3RoaW5nIGhlcmUgc2hvdWxkIGdyb3cgYW5cbiAqIGBvd25lcl9pZGAgc2VlZCB2YWx1ZSB0byBwYXBlciBvdmVyIHRoYXQ6IHRoZSBwbGF0Zm9ybSBjbGFpbSBpcyB0aGVcbiAqIG1lY2hhbmlzbS5cbiAqL1xuXG4vKipcbiAqIEFsbCBDUk0gc2VlZCBkYXRhc2V0cywgaW4gUkVQTEFZIE9SREVSIFx1MjAxNCB0aGUgQVJUSUZBQ1QncyB3aG9sZSBzZWVkIHVuaW9uLlxuICpcbiAqIFRoaXMgbGlzdCBhc3NlbWJsZXMgaGVyZSByYXRoZXIgdGhhbiBpbiBhIHBhY2thZ2UgYmFycmVsIGZvciB0d28gcmVhc29ucyxcbiAqIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBiaW5kaW5nIG9uZS4gSXQgbmFtZXMgcm93cyBmcm9tIGFsbCBmb3VyIHBhY2thZ2VzLCBhbmRcbiAqIG5vIGBzcmMvYCBmaWxlIG1heSByZWFjaCBzaWRld2F5cyBpbnRvIGFub3RoZXIgcGFja2FnZSAocGxhbiBpdGVtIDcpLiBBbmRcbiAqIHRoZSBvcmRlciBpcyBsb2FkLWJlYXJpbmcgXHUyMDE0IHJvd3MgcmVzb2x2ZSB0aGVpciBsb29rdXBzIGFnYWluc3Qgcm93cyBzZWVkZWRcbiAqIGVhcmxpZXIsIGFuZCB0aGUgb3JkZXIgaW50ZXJsZWF2ZXMgdGhlIHBhY2thZ2VzIChwcm9kdWN0cyBiZXR3ZWVuXG4gKiBvcHBvcnR1bml0aWVzIGFuZCB0YXNrcywgY29udHJhY3RzIGFmdGVyIGNhbXBhaWduIG1lbWJlcnMpLCBzbyBpdCBpcyBub3RcbiAqIHJlY292ZXJhYmxlIGJ5IGNvbmNhdGVuYXRpbmcgZm91ciBwZXItcGFja2FnZSBsaXN0cyBpbiBhbnkgcGFja2FnZSBvcmRlci5cbiAqIEl0IGlzIGV4YWN0bHkgdGhlIG9yZGVyIGBDcm1TZWVkRGF0YWAgaGFzIGFsd2F5cyBoYWQuIEFib3V0IHRlbiBzdWl0ZXMgcmVhZFxuICogdGhpcyB1bmlvbjsge0BsaW5rIHNlZWREYXRhRm9yfSBpcyB3aGF0IHRoZSB0d28gcGFja2FnZSBzdGFja3MgcmVnaXN0ZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBDcm1TZWVkRGF0YSA9IFtcbiAgYWNjb3VudHMsXG4gIGNvbnRhY3RzLFxuICBsZWFkcyxcbiAgb3Bwb3J0dW5pdGllcyxcbiAgcHJvZHVjdHMsXG4gIG9wcG9ydHVuaXR5TGluZUl0ZW1zLFxuICB0YXNrcyxcbiAgY2FzZXMsXG4gIC8vIEV2ZW50cyBjb21lIGFmdGVyIHRoZSBmaXZlIG9iamVjdHMgdGhlaXIgYHJlbGF0ZWRfdG9fKmAgbG9va3VwcyByZXNvbHZlXG4gIC8vIGFnYWluc3QgKGFjY291bnRzLCBjb250YWN0cywgbGVhZHMsIG9wcG9ydHVuaXRpZXMsIGNhc2VzKTsgdGhlIGF0dGVuZGVlXG4gIC8vIGp1bmN0aW9ucyBjb21lIGFmdGVyIHRoZSBldmVudHMgdGhleSBoYW5nIG9mZi5cbiAgZXZlbnRzLFxuICBldmVudEF0dGVuZGVlc0Zyb21Db250YWN0cyxcbiAgZXZlbnRBdHRlbmRlZXNGcm9tTGVhZHMsXG4gIGxlYWRJbnRlcmFjdGlvblBvaW50ZXJzLFxuICBjYW1wYWlnbnMsXG4gIGNhbXBhaWduTWVtYmVyc0Zyb21MZWFkcyxcbiAgY2FtcGFpZ25NZW1iZXJzRnJvbUNvbnRhY3RzLFxuICBjb250cmFjdHMsXG4gIHF1b3RlcyxcbiAgcXVvdGVMaW5lSXRlbXMsXG4gIGZvcmVjYXN0cyxcbiAga25vd2xlZGdlQXJ0aWNsZXMsXG5dO1xuXG4vKipcbiAqIFRoZSBzZWVkIGRhdGFzZXRzIGEgU2FhUyB0ZW5hbnQgZ2V0czogdGhlIHByb2R1Y3QgQ0FUQUxPR1VFLCBhbmQgbm90aGluZyBlbHNlLlxuICpcbiAqIE1haW50YWluZXIgcnVsaW5nLCAyMDI2LTA4LTI3IChvYmplY3RzdGFjayMxMjcwMSwgcXVvdGVkIHVudHJhbnNsYXRlZCk6XG4gKiBcdTMwMENcdTZCQ0ZcdTRFMkFcdTc5REZcdTYyMzdcdTVFOTRcdThCRTVcdTU0MDRcdTgxRUFcdTRGN0ZcdTc1MjhcdTU0MDRcdTgxRUFcdTc2ODRcdTY1NzBcdTYzNkVcdTU0MjdcdTMwMEQgXHUyMDE0IGV2ZXJ5IHRlbmFudCB1c2VzIGl0cyBvd24gZGF0YSwgdGhlXG4gKiBwcm9kdWN0IGNhdGFsb2d1ZSBpbmNsdWRlZDsgYW5kIFx1MzAwQ1x1NzlDRFx1NUI1MFx1NEU1Rlx1NEUwRFx1NUU5NFx1OEJFNVx1NjYyRlx1NTE2OFx1NUM0MFx1NzY4NFx1NTQ0MFx1RkYwQ1x1NTZFMFx1NEUzQVx1NzlDRFx1NUI1MFx1NjU3MFx1NjM2RVx1NEUwRFx1NTQwQ1x1NzY4NFx1NUJBMlx1NjIzN1xuICogXHU5MEZEXHU2NjJGXHU4OTgxXHU2NTM5XHU3Njg0XHU1NDQwXHVGRjBDXHU1M0VBXHU2NjJGXHU1M0MyXHU4MDAzXHU1NDQwXHVGRjBDXHU3OURGXHU2MjM3XHU4OTgxXHU4MUVBXHU1REYxXHU1MjIwXHU5NjY0XHU1NDQwXHUzMDBEIFx1MjAxNCBhIHNlZWQgaXMgYSBwZXItdGVuYW50XG4gKiBSRUZFUkVOQ0UgY29weSB0aGUgdGVuYW50IGVkaXRzIGFuZCBkZWxldGVzLlxuICpcbiAqIFRoZSBwbGF0Zm9ybSBhbHJlYWR5IHJlcGxheXMgcGVyIHRlbmFudDogYEBvYmplY3RzdGFjay9ydW50aW1lYCdzXG4gKiBgc2VlZC1yZXBsYXllcmAgcmVwbGF5cyB0aGUgcmVnaXN0ZXJlZCBkYXRhc2V0IHVuaW9uIGludG8gZWFjaCBuZXdseSBmb3VuZGVkXG4gKiBvcmdhbml6YXRpb24gc3RhbXBlZCB3aXRoIHRoYXQgb3JnYW5pemF0aW9uJ3MgaWQuIFdoYXQgaXQgaGFzIG5vIG5vdGlvbiBvZiBpc1xuICogV0hJQ0ggZmFtaWxpZXMgdG8gcmVwbGF5IFx1MjAxNCBpdCBhbHdheXMgcmVwbGF5cyB0aGUgd2hvbGUgdW5pb24gXHUyMDE0IHNvIHRoZVxuICogc2VsZWN0aW9uIGlzIG1hZGUgSEVSRSwgb25jZSwgYXQgY29tcG9zaXRpb24gdGltZS4gVGhhdCBpcyBhbHNvIHRoZSBzaGFwZSB0aGVcbiAqIHJ1bGluZyB3YW50czogdW5pZm9ybSBmb3IgZXZlcnkgdGVuYW50LCB3aXRoIG5vIHBlci10ZW5hbnQgb3B0LWluIG1lY2hhbmlzbVxuICogdG8gYXV0aG9yLCBtaXMtc2V0LCBvciBzdXBwb3J0LlxuICpcbiAqIFdoeSB0aGUgY2F0YWxvZ3VlIGFuZCBvbmx5IHRoZSBjYXRhbG9ndWU6XG4gKlxuICogIC0gQSBjYXRhbG9ndWUgaXMgdGhlIG9uZSBmYW1pbHkgdGhhdCBpcyBnZW51aW5lbHkgYSBzdGFydGluZyBwb2ludC4gQSBuZXdcbiAqICAgIHRlbmFudCBuZWVkcyBwcmljZWFibGUgcHJvZHVjdHMgYmVmb3JlIHRoZXkgY2FuIHF1b3RlIGFueXRoaW5nLCBhbmQgdGhlXG4gKiAgICByb3dzIGFyZSB0aGVpcnMgdG8gcmVuYW1lLCByZS1wcmljZSBhbmQgZGVsZXRlLlxuICogIC0gYHNhbGVzYCAvIGBzZXJ2aWNlYCAvIGBtYXJrZXRpbmdgIC8gYHJldmVudWVgIGFyZSBTVE9SWVRFTExJTkc6IEFjbWVcbiAqICAgIENvcnBvcmF0aW9uJ3MgcGlwZWxpbmUsIG5pbmUgZXNjYWxhdGVkIGNhc2VzLCBhIGZpbmlzaGVkIGNhbXBhaWduLiBMYW5kaW5nXG4gKiAgICB0aG9zZSBpbiBhIHBheWluZyB0ZW5hbnQncyBvcmcgaXMgbm90IGEgaGVscGZ1bCBoZWFkIHN0YXJ0LCBpdCBpcyBzb21lb25lXG4gKiAgICBlbHNlJ3MgZGF0YSBpbiB0aGVpciBDUk0uXG4gKiAgLSBJdCBpcyBhbHNvIHRoZSBmYW1pbHkgd2l0aCBubyBvdXRnb2luZyByZWZlcmVuY2VzLCBzbyB0aGUgc2hyaW5rIGNhbm5vdFxuICogICAgc3RyYW5kIGEgbG9va3VwOiBgc3JjL3JldmVudWUvZGF0YS9jYXRhbG9nLnNlZWQudHNgIHJlc29sdmVzIG5vdGhpbmcgYWdhaW5zdFxuICogICAgYW5vdGhlciBvYmplY3QsIHdoaWxlIGV2ZXJ5IG90aGVyIGZhbWlseSBwb2ludHMgYXQgYWNjb3VudHMsIGNvbnRhY3RzIG9yIHByb2R1Y3RzXG4gKiAgICBieSBuYXR1cmFsIGtleS5cbiAqXG4gKiBcdTI2RDQgTm90IGEgcGxhY2UgdG8gZ3JvdyBhIFwic3RhcnRlciBkYXRhXCIgYnVuZGxlLiBBIGZhbWlseSBhZGRlZCBoZXJlIHNoaXBzXG4gKiBpbnRvIGV2ZXJ5IHRlbmFudCBvZiBldmVyeSBTYWFTIGRlcGxveW1lbnQ7IHRoZSBiYXIgaXMgXCJhIHRlbmFudCBjYW5ub3RcbiAqIG9wZXJhdGUgd2l0aG91dCBpdFwiLCBub3QgXCJpdCBsb29rcyBuaWNlIG9uIGRheSBvbmVcIi5cbiAqL1xuZXhwb3J0IGNvbnN0IFNhYXNUZW5hbnRTZWVkRGF0YSA9IFtwcm9kdWN0c107XG5cbi8qKlxuICogVGhlIHNlZWQgZmFtaWxpZXMgb2YgdGhlIFNFUlZJQ0UgcGFja2FnZSBcdTIwMTQgdGhlIHJvd3Mgd2hvc2Ugb2JqZWN0IGl0IG93bnMuXG4gKlxuICogXHUyNkEwXHVGRTBGIEEgc2VlZCBmYW1pbHkgaXMgUkVHSVNURVJFRCBCWSBUSEUgUEFDS0FHRSBUSEFUIE9XTlMgSVRTIE9CSkVDVC4gTmFtZWRcbiAqIGhlcmUsIGJlc2lkZSB0aGUgcmVwbGF5IG9yZGVyIGl0IGlzIGN1dCBvdXQgb2YsIHNvIHRoZSB0d28gY2Fubm90IGRyaWZ0XG4gKiBhcGFydDogdGhlIHNwbGl0IGlzIGEgcHJvcGVydHkgb2Yge0BsaW5rIENybVNlZWREYXRhfS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VTZWVkRGF0YSA9IFtjYXNlcywga25vd2xlZGdlQXJ0aWNsZXNdO1xuXG4vKiogRXZlcnl0aGluZyBlbHNlIFx1MjAxNCB0aGUgYXBwIHBhY2thZ2UncyBvd24gZmFtaWxpZXMsIGluIHtAbGluayBDcm1TZWVkRGF0YX0gb3JkZXIuICovXG5leHBvcnQgY29uc3QgQXBwU2VlZERhdGEgPSBDcm1TZWVkRGF0YS5maWx0ZXIoKGZhbWlseSkgPT4gIVNlcnZpY2VTZWVkRGF0YS5pbmNsdWRlcyhmYW1pbHkpKTtcblxuLyoqXG4gKiBUaGUgc2VlZCBkYXRhc2V0cyBlYWNoIHBhY2thZ2UgcmVnaXN0ZXJzIHVuZGVyIGEgY29tcG9zaXRpb24uXG4gKlxuICogVGhlIFNhYVMgc2VsZWN0aW9uIGlzIHN0aWxsIG1hZGUgb25jZSwgaGVyZTogYSB0ZW5hbnQgZ2V0cyB0aGUgcHJvZHVjdFxuICogY2F0YWxvZ3VlIGFuZCBub3RoaW5nIGVsc2UsIHNvIHRoZSBzZXJ2aWNlIHBhY2thZ2UgcmVnaXN0ZXJzIG5vIHJvd3MgYXQgYWxsXG4gKiBpbiB0aGF0IHNoYXBlLiBTZWUge0BsaW5rIFNhYXNUZW5hbnRTZWVkRGF0YX0gZm9yIHdoeS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlZWREYXRhRm9yID0gKFxuICBjb21wb3NpdGlvbjogSG90Q3JtQ29tcG9zaXRpb24sXG4pOiB7IGFwcDogdHlwZW9mIENybVNlZWREYXRhOyBzZXJ2aWNlOiB0eXBlb2YgQ3JtU2VlZERhdGEgfSA9PlxuICBjb21wb3NpdGlvbiA9PT0gJ3NhYXMnXG4gICAgPyB7IGFwcDogU2Fhc1RlbmFudFNlZWREYXRhLCBzZXJ2aWNlOiBbXSB9XG4gICAgOiB7IGFwcDogQXBwU2VlZERhdGEsIHNlcnZpY2U6IFNlcnZpY2VTZWVkRGF0YSB9O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgV2hpY2ggU0hBUEUgb2YgSG90Q1JNIHRoaXMgYnVpbGQgYXNzZW1ibGVzICgjMTM2MSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vL1xuLy8gYGRlZmF1bHRgICh1bnNldCwgb3IgYEhPVENSTV9DT01QT1NJVElPTj1kZWZhdWx0YCkgaXMgdGhlIGNvbW11bml0eSBhcHAgYW5kXG4vLyBpcyBieXRlLWZvci1ieXRlIHdoYXQgaXQgYWx3YXlzIHdhcyBcdTIwMTQgZXZlcnkgZmllbGQgYmVsb3cgdGhhdCBhIGNvbXBvc2l0aW9uXG4vLyB0b3VjaGVzIGZhbGxzIHRocm91Z2ggdG8gdGhlIHNhbWUgdmFsdWUgaXQgaGFkIGJlZm9yZSB0aGlzIGtub2IgZXhpc3RlZC5cbi8vIGBIT1RDUk1fQ09NUE9TSVRJT049c2Fhc2AgYXNzZW1ibGVzIHRoZSBzaGFwZSBhIG11bHRpLW9yZyBvcGVyYXRvciBkZXBsb3lzIG9uXG4vLyB0aGUgZW50ZXJwcmlzZSBydW50aW1lIHVuZGVyIGEgd2FsbGVkIHRlbmFuY3kgcG9zdHVyZTsgYW4gdW5yZWNvZ25pc2VkIHZhbHVlXG4vLyB0aHJvd3MgaGVyZSByYXRoZXIgdGhhbiBxdWlldGx5IGFzc2VtYmxpbmcgdGhlIHdyb25nIGFwcCAoc2VlXG4vLyBgcmVzb2x2ZUNvbXBvc2l0aW9uYCkuXG4vL1xuLy8gVGhlIGtub2IgaXMgcmVzb2x2ZWQgT05DRSwgaGVyZSwgYW5kIGhhbmRlZCB0byB0aGUgcGFja2FnZSBzdGFja3MgYWxyZWFkeVxuLy8gYXBwbGllZC4gSXQgaXMgZGVsaWJlcmF0ZWx5IENPTVBPU0lUSU9OLXRpbWUgYW5kIHVuaWZvcm0uIFRoZSBwbGF0Zm9ybSdzXG4vLyBgc2VlZC1yZXBsYXllcmAgZ2l2ZXMgZXZlcnkgbmV3bHkgZm91bmRlZCBvcmdhbml6YXRpb24gaXRzIG93biBwcml2YXRlIGNvcHlcbi8vIG9mIHRoZSByZWdpc3RlcmVkIGRhdGFzZXQgdW5pb24gKG1haW50YWluZXIgcnVsaW5nIDIwMjYtMDgtMjcsXG4vLyBvYmplY3RzdGFjayMxMjcwMTogXHUzMDBDXHU3OUNEXHU1QjUwXHU0RTVGXHU0RTBEXHU1RTk0XHU4QkU1XHU2NjJGXHU1MTY4XHU1QzQwXHU3Njg0XHU1NDQwIFx1MjAyNlx1NTNFQVx1NjYyRlx1NTNDMlx1ODAwM1x1NTQ0MFx1RkYwQ1x1NzlERlx1NjIzN1x1ODk4MVx1ODFFQVx1NURGMVx1NTIyMFx1OTY2NFx1NTQ0MFx1MzAwRCksXG4vLyBidXQgaXQgaGFzIG5vIHBlci1mYW1pbHkgb3IgcGVyLXRlbmFudCBzZWxlY3Rpb24gYW5kIG5vbmUgaXMgY2hhcnRlcmVkIFx1MjAxNCBzb1xuLy8gV0hBVCBnZXRzIHJlcGxheWVkIGlzIGRlY2lkZWQgb25jZSwgaGVyZSwgZm9yIGV2ZXJ5IHRlbmFudCBhbGlrZS5cbi8vXG4vLyBUd28gdGhpbmdzIGNoYW5nZSwgYW5kIG5vdGhpbmcgZWxzZS4gVGhlcmUgaXMgbm8gcnVudGltZSBicmFuY2ggYW55d2hlcmUgaW5cbi8vIGBzcmMvYCwgYW5kIG5vIGVudGVycHJpc2UgcGFja2FnZSBpcyBpbXBvcnRlZDogYW4gYXJ0aWZhY3QgYnVpbHQgZWl0aGVyIHdheVxuLy8gcnVucyBvbiB0aGUgY29tbXVuaXR5IHJ1bnRpbWUuIEJvdGggc2hhcGVzIHJlZ2lzdGVyIHRoZSBzYW1lIGZsb3dzOiB0aGUgb25lXG4vLyBmbG93IHRoZSBTYWFTIHNoYXBlIHVzZWQgdG8gZHJvcCwgdGhlIGBkZW1vX2Jvb3RzdHJhcGAgb3duZXJzaGlwIHN3ZWVwLCBpc1xuLy8gcmV0aXJlZCBmcm9tIHRoZSBhcHAgKCMxODkyKSBcdTIwMTQgdGhlIHBsYXRmb3JtIGNsYWltcyBzZWVkZWQgcm93cyBpdHNlbGYuXG4vL1xuLy8gIDEuIGBkYXRhYCBcdTIwMTQgdGhlIGNhdGFsb2d1ZSBmYW1pbHkgb25seSwgc28gdGhlIHNlcnZpY2UgcGFja2FnZSByZWdpc3RlcnNcbi8vICAgICBub25lLiBTZWUgYFNhYXNUZW5hbnRTZWVkRGF0YWAuXG4vLyAgICAgYGRlbW8tc3RhZmZpbmdgIG5lZWRzIG5vIGV4Y2x1c2lvbiBcdTIwMTQgYHNyYy9zYWxlcy9zaGFyaW5nL2RlbW8tc3RhZmZpbmcudHNgIGlzXG4vLyAgICAgZGVsaWJlcmF0ZWx5IG5vdCBleHBvcnRlZCBmcm9tIGBzcmMvc2FsZXMvc2hhcmluZy9pbmRleC5qc2AgYW5kIG5vdCByZWdpc3RlcmVkXG4vLyAgICAgaW4gYW55IGNvbXBvc2l0aW9uICgjNjQwLCBwaW5uZWQgYnkgYHRlc3QvZGVtby1zdGFmZmluZy50ZXN0LnRzYCkuXG4vLyAgMi4gYHBlcm1pc3Npb25zYCBcdTIwMTQgYHN5c3RlbV9hZG1pbmAgaXMgcmVwbGFjZWQgYnkgYHRlbmFudF9hZG1pbmAsIHdoaWNoIGhvbGRzXG4vLyAgICAgb3JnLXNjb3BlZCBgbWFuYWdlX29yZ191c2Vyc2AgaW5zdGVhZCBvZiBwbGF0Zm9ybS1zY29wZSBgbWFuYWdlX3VzZXJzYC5cbi8vICAgICBSZWFkIGBzcmMvc2FsZXMvcHJvZmlsZXMvdGVuYW50LWFkbWluLnByb2ZpbGUudHNgIGZvciB0aGUgZnVsbCBhdWRpdCwgaW5jbHVkaW5nXG4vLyAgICAgd2hhdCBgdmlld19hbGxfZGF0YWAgLyBgbW9kaWZ5X2FsbF9kYXRhYCBtZWFuIHVuZGVyIHRoZSB3YWxsLlxuY29uc3QgY29tcG9zaXRpb24gPSByZXNvbHZlQ29tcG9zaXRpb24oKTtcbmNvbnN0IGlzU2FhcyA9IGNvbXBvc2l0aW9uID09PSAnc2Fhcyc7XG5jb25zdCBzZWVkRGF0YSA9IHNlZWREYXRhRm9yKGNvbXBvc2l0aW9uKTtcblxuLyoqXG4gKiBQZXJtaXNzaW9uIHNldHMgdGhpcyBjb21wb3NpdGlvbiByZWdpc3RlcnMuIEZpbHRlcmVkIGJ5IElERU5USVRZLCBub3QgYnkgbmFtZVxuICogc3RyaW5nLCBzbyBhIHJlbmFtZSBjYW5ub3Qgc2lsZW50bHkgdHVybiB0aGUgc3Vic3RpdHV0aW9uIGludG8gYSBuby1vcC5cbiAqL1xuY29uc3QgY29tcG9zaXRpb25QZXJtaXNzaW9ucyA9IGlzU2Fhc1xuICA/IFsuLi5PYmplY3QudmFsdWVzKGFsbFByb2ZpbGVzKS5maWx0ZXIoKHNldCkgPT4gc2V0ICE9PSBTeXN0ZW1BZG1pblByb2ZpbGUpLCBUZW5hbnRBZG1pblByb2ZpbGVdXG4gIDogT2JqZWN0LnZhbHVlcyhhbGxQcm9maWxlcyk7XG5cbi8qIFx1MjUwMFx1MjUwMFx1MjUwMCBUaGUgdHdvIHBhY2thZ2Ugc3RhY2tzIGBvYmplY3RzdGFjay5jb25maWcudHNgIGNvbXBvc2VzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAqL1xuXG4vKiogYGFwcC5vYmplY3RzdGFjay5ob3Rjcm0uc2VydmljZWAgXHUyMDE0IHNlZSBgc3JjL3NlcnZpY2UvaW5kZXgudHNgLiAqL1xuZXhwb3J0IGNvbnN0IHNlcnZpY2VTdGFjayA9IGNyZWF0ZUhvdENybVNlcnZpY2VTdGFjayh7IGRhdGE6IHNlZWREYXRhLnNlcnZpY2UgfSk7XG5cbi8qKlxuICogYGFwcC5vYmplY3RzdGFjay5ob3Rjcm1gIFx1MjAxNCBzZWUgYHNyYy9zYWxlcy9pbmRleC50c2AsIGluY2x1ZGluZyB3aHkgaXQgaXNcbiAqIGhhbmRlZCBgYXJ0aWZhY3RPYmplY3RzYDogaXRzIHBlcm1pc3Npb24gc2V0cyBzdGF5IHdob2xlIGhlcmUgYW5kIGdyYW50IG9uXG4gKiB0aGUgc2VydmljZSBwYWNrYWdlJ3Mgb2JqZWN0cyB0b28uXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBTdGFjayA9IGNyZWF0ZUhvdENybUFwcFN0YWNrKFxuICB7XG4gICAgb2JqZWN0czogYXBwT2JqZWN0cyxcbiAgICBhY3Rpb25zOiBhcHBBY3Rpb25zLFxuICAgIGRhc2hib2FyZHM6IGFwcERhc2hib2FyZHMsXG4gICAgZGF0YXNldHM6IGFwcERhdGFzZXRzLFxuICAgIHJlcG9ydHM6IGFwcFJlcG9ydHMsXG4gICAgLy8gUmV1c2FibGUgaW1wb3J0IHByb2plY3Rpb25zICgjNjAzKS4gUmVmZXJlbmNlZCBieSBuYW1lIGZyb20gdGhlIGltcG9ydFxuICAgIC8vIGVuZHBvaW50IFx1MjAxNCBgbWFwcGluZ05hbWU6ICdjcm1fYWNjb3VudF9pbXBvcnQnYCBcdTIwMTQgc28gYSBjdXN0b21lcidzIG93blxuICAgIC8vIHNwcmVhZHNoZWV0IGxvYWRzIHdpdGhvdXQgcGVyLWNvbHVtbiBtYXBwaW5nIGJ5IGhhbmQuIFRlbXBsYXRlczpcbiAgICAvLyBgYXNzZXRzL2ltcG9ydC10ZW1wbGF0ZXMvYC5cbiAgICBtYXBwaW5nczogYXBwTWFwcGluZ3MsXG4gICAgZmxvd3M6IGFwcEZsb3dzLFxuICAgIHNraWxsczogYXBwU2tpbGxzLFxuICAgIHBlcm1pc3Npb25zOiBjb21wb3NpdGlvblBlcm1pc3Npb25zLFxuICAgIGFwcHM6IGFwcEFwcHMsXG4gICAgdmlld3M6IGFwcFZpZXdzLFxuICAgIHBhZ2VzOiBhcHBQYWdlcyxcbiAgICAvLyBBcHByb3ZhbHMgYXJlIG1vZGVsZWQgYXMgYHJlY29yZF9jaGFuZ2VgIGZsb3dzIHdpdGggYGFwcHJvdmFsYCBub2Rlc1xuICAgIC8vIChBRFItMDAxOSk7IHNlZSBzcmMvc2FsZXMvZmxvd3Mvb3Bwb3J0dW5pdHktYXBwcm92YWwuZmxvdy50cy4gVGhlXG4gICAgLy8gc3RhbmRhbG9uZSBgYXBwcm92YWxzYCBzdGFjayBmaWVsZCB3YXMgcmVtb3ZlZCBpbiBPYmplY3RTdGFjayA3LjQuXG4gICAgLy8gTm8gYGFuYWx5dGljc0N1YmVzYDogZGF0YXNldHMgKEFEUi0wMDIxKSBhcmUgdGhlIHNlbWFudGljIGxheWVyIFx1MjAxNCB0aGVcbiAgICAvLyBhbmFseXRpY3Mgc2VydmljZSBjb21waWxlcyBlYWNoIGRhdGFzZXQgaW50byBpdHMgY3ViZSBpbnRlcm5hbGx5LCBhbmQgYVxuICAgIC8vIHNlY29uZCBoYW5kLXdyaXR0ZW4gY3ViZSBsYXllciBvbmx5IGR1cGxpY2F0ZXMgYW5kIGRyaWZ0cy5cblxuICAgIGhvb2tzOiBhcHBIb29rcyxcblxuICAgIGRhdGE6IHNlZWREYXRhLmFwcCxcblxuICAgIHRyYW5zbGF0aW9uczogYXBwVHJhbnNsYXRpb25zLFxuXG4gICAgLy8gVGhlIGxvY2FsaXphYmxlIGNvbnRlbnQgcGF0aCBmb3IgYG5vdGlmeWAgKCM5MjA1KS4gQSBub2RlIG5hbWVzIGEgdGVtcGxhdGVcbiAgICAvLyBhbmQgc3VwcGxpZXMgaXRzIGB0ZW1wbGF0ZURhdGFgOyB0aGUgZGVsaXZlcnkgcGF0aCByZXNvbHZlc1xuICAgIC8vIGAobmFtZSwgbG9jYWxlKWAgYWdhaW5zdCB0aGVzZSByb3dzIFBFUiBSRUNJUElFTlQsIGFmdGVyIGZhbi1vdXQgXHUyMDE0IHRoZVxuICAgIC8vIHJlY2lwaWVudCdzIG93biBgc3lzX3VzZXIubG9jYWxlYCB3aGVuIHNldCwgZWxzZSBgaTE4bi5kZWZhdWx0TG9jYWxlYCBcdTIwMTRcbiAgICAvLyBzbyB0d28gcGVvcGxlIG9uIG9uZSBub3RpZmljYXRpb24gY2FuIHJlYWQgaXQgaW4gdHdvIGxhbmd1YWdlcy5cbiAgICBlbWFpbFRlbXBsYXRlczogYXBwRW1haWxUZW1wbGF0ZXMsXG5cbiAgICBzaGFyaW5nUnVsZXM6IGFwcFNoYXJpbmdSdWxlcyxcbiAgICAvLyBBRFItMDA5MCBEMzogcG9zaXRpb25zIGFyZSBmbGF0IGNhcGFiaWxpdHktZGlzdHJpYnV0aW9uIGdyb3VwcyBcdTIwMTQgdGhlIHYxXG4gICAgLy8gcm9sZSBoaWVyYXJjaHkncyBwYXJlbnQgbGlua3MgYXJlIGdvbmUgKGhpZXJhcmNoeSBiZWxvbmdzIHRvIHRoZVxuICAgIC8vIGJ1c2luZXNzLXVuaXQgdHJlZSwgd2hpY2ggdGhpcyBhcHAgZG9lcyBub3QgbW9kZWwpLlxuICAgIHBvc2l0aW9uczogQ3JtUG9zaXRpb25zLFxuICB9LFxuICB7IGFydGlmYWN0T2JqZWN0czogKHNlcnZpY2VTdGFjay5vYmplY3RzID8/IFtdKS5tYXAoKG9iamVjdCkgPT4g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LGFBQWE7QUFBQSxNQUNYLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLGFBQWEsRUFBRSxZQUFZLEtBQUs7QUFBQSxNQUNoQztBQUFBLE1BQ0EsU0FBUyxDQUFDLGVBQWUsV0FBVyxlQUFlLFlBQVksZ0JBQWdCLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BV3pGLFFBQVE7QUFBQSxRQUNOLEVBQUUsT0FBTyxVQUFVLFVBQVUsVUFBVSxPQUFPLENBQUMsWUFBWSxRQUFRLEVBQUU7QUFBQSxRQUNyRSxFQUFFLE9BQU8sWUFBWSxVQUFVLE1BQU0sT0FBTyxDQUFDLFFBQVEsVUFBVSxFQUFFO0FBQUEsTUFDbkU7QUFBQSxNQUNBLE1BQU0sQ0FBQyxFQUFFLE9BQU8sZ0JBQWdCLE9BQU8sTUFBTSxDQUFDO0FBQUEsSUFDaEQ7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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Q0UsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sY0FBYztBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUFBO0FBQUEsRUFHQSxTQUFTO0FBQUEsSUFDUDtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBSVY7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxZQUNWLE9BQU87QUFBQSxZQUNQLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQXlCVixTQUFTO0FBQUEsY0FDUDtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBMkdBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixJQUFJO0FBQUEsVUFDSixPQUFPO0FBQUEsVUFDUCxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUtWLFVBQVU7QUFBQSxZQUNWLFNBQVNDO0FBQUEsWUFDVCxPQUFPO0FBQUEsY0FDTCxJQUFJO0FBQUEsY0FDSixTQUFTO0FBQUEsY0FDVCxTQUFTO0FBQUEsY0FDVCxTQUFTO0FBQUEsWUFDWDtBQUFBLFlBQ0EsTUFBTTtBQUFBLGNBQ0osSUFDRTtBQUFBLGNBS0YsU0FDRTtBQUFBLGNBR0YsU0FDRTtBQUFBLGNBS0YsU0FDRTtBQUFBLFlBTUo7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQU9WLFVBQVU7QUFBQSxZQUNWLFNBQVNBO0FBQUEsWUFDVCxPQUFPO0FBQUEsY0FDTCxJQUFJO0FBQUEsY0FDSixTQUFTO0FBQUEsY0FDVCxTQUFTO0FBQUEsY0FDVCxTQUFTO0FBQUEsWUFDWDtBQUFBLFlBQ0EsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNBSUosSUFDRTtBQUFBLGNBS0YsU0FDRTtBQUFBLGNBSUYsU0FDRTtBQUFBLGNBS0YsU0FDRTtBQUFBLFlBTUo7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBSUE7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxZ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LElBQ1QsU0FBUztBQUFBLElBQ1QsWUFBWTtBQUFBLElBQ1osVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLVCxVQUFVO0FBQUEsSUFDVixPQUFPO0FBQUEsSUFDUCxRQUFRO0FBQUEsSUFDUixhQUFhO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFRUCxPQUFPO0FBQUEsSUFFUCxNQUFNLFNBQVM7QUFBQSxJQUVmLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFPZCxnQkFBZ0I7QUFBQSxJQUVoQixjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJZCxXQUFXO0FBQUEsRUFDYjtBQUFBLEVBQ0EsRUFBRSxrQkFBa0IsYUFBYSxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxPQUFPLElBQUksRUFBRTtBQUMvRTs7O0F2TzVoQkEsSUFBTyw2QkFBUSxjQUFjLENBQUMsY0FBYyxRQUFRLEdBQUcsRUFBRSxVQUFVLFdBQVcsQ0FBQzsiLAogICJuYW1lcyI6IFsiZGVmaW5lU3RhY2siLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIlAiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIlAiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIkYiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJQIiwgIm9iamVjdHNfZXhwb3J0cyIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJGIiwgIlAiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIkYiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJGIiwgIlAiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIkYiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJQIiwgIm9iamVjdHNfZXhwb3J0cyIsICJQIiwgIlAiLCAiUCIsICJQIiwgImNlbCIsICJjZWwiLCAiY2VsIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgIlAiLCAiZGVmaW5lVmlldyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVN0YWNrIiwgIm9iamVjdHNfZXhwb3J0cyIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJGIiwgIlAiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIkYiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJGIiwgIlAiLCAiY2VsIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJGIiwgIlAiLCAiY2VsIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJGIiwgIlAiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIkYiLCAiUCIsICJvYmplY3RzX2V4cG9ydHMiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIkYiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJQIiwgIlAiLCAiUCIsICJQIiwgIlAiLCAiUCIsICJQIiwgImFjdGlvbnNfZXhwb3J0cyIsICJQIiwgIlAiLCAiZGVmaW5lRGF0YXNldCIsICJkZWZpbmVEYXRhc2V0IiwgImRlZmluZURhdGFzZXQiLCAiZGVmaW5lRGF0YXNldCIsICJkZWZpbmVEYXRhc2V0IiwgImRlZmluZURhdGFzZXQiLCAiZGVmaW5lRGF0YXNldCIsICJkZWZpbmVEYXRhc2V0IiwgImRlZmluZURhdGFzZXQiLCAiZGVmaW5lRGF0YXNldCIsICJkZWZpbmVEYXRhc2V0IiwgImRlZmluZURhdGFzZXQiLCAiZGVmaW5lRGF0YXNldCIsICJkZWZpbmVEYXRhc2V0IiwgImRhdGFzZXRzX2V4cG9ydHMiLCAiZGVmaW5lRGF0YXNldCIsICJkZWZpbmVEYXRhc2V0IiwgImRlZmluZU1hcHBpbmciLCAiZGVmaW5lTWFwcGluZyIsICJkZWZpbmVNYXBwaW5nIiwgImRlZmluZU1hcHBpbmciLCAiZW4iLCAiYXBwU3VyZmFjZSIsICJhY3Rpdml0eUFjdGlvbnMiLCAiY3VzdG9tZXIiLCAiYWN0aXZpdHlBY3Rpb25zIiwgInBpcGVsaW5lIiwgImFjdGl2aXR5QWN0aW9ucyIsICJjb21tZXJjZSIsICJzZXJ2aWNlIiwgImFjdGl2aXR5QWN0aW9ucyIsICJhY3Rpdml0eSIsICJtYXJrZXRpbmciLCAiemhDTiIsICJjdXN0b21lciIsICJzZXJ2aWNlIiwgInBpcGVsaW5lIiwgImNvbW1lcmNlIiwgImFjdGl2aXR5IiwgIm1hcmtldGluZyIsICJhcHBTdXJmYWNlIiwgImFwcFN1cmZhY2UiLCAiYWN0aXZpdHlBY3Rpb25zIiwgImN1c3RvbWVyIiwgImFjdGl2aXR5QWN0aW9ucyIsICJwaXBlbGluZSIsICJhY3Rpdml0eUFjdGlvbnMiLCAiY29tbWVyY2UiLCAic2VydmljZSIsICJhY3Rpdml0eUFjdGlvbnMiLCAiYWN0aXZpdHkiLCAibWFya2V0aW5nIiwgImphSlAiLCAiY3VzdG9tZXIiLCAic2VydmljZSIsICJwaXBlbGluZSIsICJjb21tZXJjZSIsICJhY3Rpdml0eSIsICJtYXJrZXRpbmciLCAiYXBwU3VyZmFjZSIsICJhcHBTdXJmYWNlIiwgImFjdGl2aXR5QWN0aW9ucyIsICJjdXN0b21lciIsICJhY3Rpdml0eUFjdGlvbnMiLCAicGlwZWxpbmUiLCAiYWN0aXZpdHlBY3Rpb25zIiwgImNvbW1lcmNlIiwgInNlcnZpY2UiLCAiYWN0aXZpdHlBY3Rpb25zIiwgImFjdGl2aXR5IiwgIm1hcmtldGluZyIsICJlc0VTIiwgImN1c3RvbWVyIiwgInNlcnZpY2UiLCAicGlwZWxpbmUiLCAiY29tbWVyY2UiLCAiYWN0aXZpdHkiLCAibWFya2V0aW5nIiwgImFwcFN1cmZhY2UiLCAiZW4iLCAiemhDTiIsICJqYUpQIiwgImVzRVMiLCAiUCIsICJkZWZpbmVWaWV3IiwgIlAiLCAiZGVmaW5lVmlldyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVZpZXciLCAiZGVmaW5lVmlldyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVZpZXciLCAiZGVmaW5lVmlldyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVZpZXciLCAiZGVmaW5lVmlldyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVZpZXciLCAiZGVmaW5lVmlldyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVZpZXciLCAidmlld3NfZXhwb3J0cyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVZpZXciLCAiZGVmaW5lVmlldyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVZpZXciLCAiZGVmaW5lVmlldyIsICJ2aWV3c19leHBvcnRzIiwgImRlZmluZVZpZXciLCAiZGVmaW5lVmlldyIsICJQIiwgIlAiLCAiZW4iLCAiemhDTiIsICJqYUpQIiwgImVzRVMiLCAiZW4iLCAiemhDTiIsICJqYUpQIiwgImVzRVMiLCAiZW1haWxfdGVtcGxhdGVzX2V4cG9ydHMiLCAiZW4iLCAiemhDTiIsICJqYUpQIiwgImVzRVMiLCAiZW4iLCAiemhDTiIsICJqYUpQIiwgImVzRVMiLCAib3Bwb3J0dW5pdGllcyIsICJwZXJpb2QiLCAiaW5wdXQiLCAiY29udGFjdHMiLCAibGVhZHMiLCAidHlwZSIsICJpbnRlcnZhbCIsICJzdGF0dXMiLCAiUCIsICJjZWwiLCAiY2VsIiwgIlAiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiY2VsIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImNlbCIsICJjZWwiLCAiUCIsICJQIiwgImV4cHJlc3Npb24iLCAiY2VsIiwgImNlbCIsICJleHByZXNzaW9uIiwgIlAiLCAiUCIsICJjZWwiLCAiY2VsIiwgIlAiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiY2VsIiwgImNlbCIsICJQIiwgImNlbCIsICJjZWwiLCAiZXhwcmVzc2lvbiIsICJleHByZXNzaW9uIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImV4cHJlc3Npb24iLCAiY2VsIiwgImNlbCIsICJleHByZXNzaW9uIiwgIlAiLCAiUCIsICJjZWwiLCAiY2VsIiwgIlAiLCAiY2VsIiwgImNlbCIsICJjZWwiLCAiY2VsIiwgIlAiLCAiY2VsIiwgIlAiLCAiY2VsIiwgIlAiLCAiY2VsIiwgImNlbCIsICJQIiwgImNlbCIsICJjZWwiLCAiY2VsIiwgImNlbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJQIiwgIlAiLCAiUCIsICJQIiwgIlAiLCAiUCIsICJjZWwiLCAiY2VsIiwgImNlbCIsICJjZWwiLCAiZGVmaW5lU2VlZCIsICJjZWwiLCAiZGVmaW5lU2VlZCIsICJjZWwiLCAiZGVmaW5lU2VlZCIsICJjZWwiLCAiZGVmaW5lU2VlZCIsICJjZWwiLCAiZGVmaW5lU2VlZCIsICJkZWZpbmVTZWVkIiwgImRlZmluZVNlZWQiLCAiZGVmaW5lU2VlZCIsICJkZWZpbmVTZWVkIiwgImNlbCIsICJkZWZpbmVTZWVkIiwgImNlbCIsICJkZWZpbmVTZWVkIiwgImNlbCIsICJjZWwiLCAiZGVmaW5lU2VlZCIsICJkZWZpbmVTZWVkIiwgImNlbCIsICJkZWZpbmVTZWVkIiwgImNlbCIsICJvYmplY3RzX2V4cG9ydHMiLCAiYWN0aW9uc19leHBvcnRzIiwgImRhdGFzZXRzX2V4cG9ydHMiLCAidmlld3NfZXhwb3J0cyIsICJlbWFpbF90ZW1wbGF0ZXNfZXhwb3J0cyIsICJjb21wb3NpdGlvbiJdCn0K diff --git a/src/sales/views/lead.view.ts b/src/sales/views/lead.view.ts index e7fae774..049bedbe 100644 --- a/src/sales/views/lead.view.ts +++ b/src/sales/views/lead.view.ts @@ -290,10 +290,11 @@ export const LeadViews = defineView({ }, 'lead_source', 'industry', - { - field: 'owner_id', - required: true, - }, + // Offered, ⛔ not `required` (#2097): an insert that leaves it empty is + // stamped to the creator by the platform (see `lead.hook.ts`), so a + // rep's new lead is theirs without a pick, and a manager can still + // choose another owner. `required` blocked that save client-side. + 'owner_id', // `disqualification_reason` is enforced by the // `disqualification_reason_required` validation on crm_lead, so every // form that lets a user pick "Unqualified" must also offer the reason From b5237b67cfe3b730353775c0d31e890fc520a159 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 14 Oct 2026 08:11:18 +0000 Subject: [PATCH 2/4] test(ownership): pin that the New Lead form does not require an owner Also drops objectstack.config.bundled_4tw0mek20uf.mjs, a dev-server compile artifact the previous commit picked up by accident. Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv Co-authored-by: Claude --- objectstack.config.bundled_4tw0mek20uf.mjs | 35749 ------------------- test/ownership-model.test.ts | 16 + 2 files changed, 16 insertions(+), 35749 deletions(-) delete mode 100644 objectstack.config.bundled_4tw0mek20uf.mjs diff --git a/objectstack.config.bundled_4tw0mek20uf.mjs b/objectstack.config.bundled_4tw0mek20uf.mjs deleted file mode 100644 index 00f6fd91..00000000 --- a/objectstack.config.bundled_4tw0mek20uf.mjs +++ /dev/null @@ -1,35749 +0,0 @@ -var __defProp = Object.defineProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; - -// objectstack.config.ts -import { composeStacks } from "@objectstack/spec"; - -// src/sales/index.ts -import { defineStack } from "@objectstack/spec"; -var createHotCrmAppStack = (collections, options) => defineStack({ - manifest: { - id: "app.objectstack.hotcrm", - namespace: "crm", - version: "4.0.1", - type: "app", - name: "HotCRM", - description: "AI-Native CRM for the ObjectStack marketplace \u2014 Accounts, Contacts, Leads, Opportunities, Cases, Knowledge, Forecasts, Campaigns, Contracts.", - // ADR-0087 protocol handshake (ADR-0025 §3.2): the metadata/runtime - // protocol major this app's metadata is authored against. Only the major - // participates in the check — a runtime on a different major refuses the - // load with a structured OS_PROTOCOL_INCOMPATIBLE diagnostic (naming the - // `objectstack migrate meta` replay) instead of failing deep in a schema - // parse. Bump together with `specVersion` on every platform upgrade - // (docs/MAINTENANCE.md §3) — `test/docs-declared-versions.test.ts` now - // enforces that pairing against `objectstack.manifest.json` instead of - // trusting this comment, because two platform upgrades in a row (rc.2, then - // rc.3) moved the manifest and left this line behind (#728). Every package - // of this artifact states the same protocol; `src/service/index.ts` - // repeats it for the same reason. - engines: { protocol: "^18.0.0-next.0" } - }, - // ─── Platform capabilities this app needs ───────────────────────── - // The runtime resolves each capability name to a built-in service plugin - // and auto-loads it (with extras like Automation's node packs). No need - // to hand-instantiate plugins or pass `--preset` flags. See - // packages/cli/src/commands/serve.ts CAPABILITY_PROVIDERS for the - // complete map; explicit `plugins: [...]` always shadows the resolver. - // `auth` enables the auth/login surface (login/register) via @objectstack/plugin-auth. - // `ui` serves the unified Console shell and CRM apps under /_console/ - // (login at /_console/login). ObjectStack 7.x replaced the legacy - // /_studio/ and /_account/ mounts with this single /_console/ surface. - // Both are required for a clickable login flow when running `objectstack start` - // off the compiled artifact. - // Note: the foundational slate (queue, job, cache, settings, email, - // storage) is auto-injected by the CLI for every non-`minimal` - // preset — see `ALWAYS_CAPS` in packages/cli/src/commands/serve.ts. - // Listed below only the *opt-in* capabilities this stack actually - // wants on top of that slate. - // `triggers` installs the record-change + schedule trigger providers that - // actually fire autolaunched flows (record_change & schedule types). Without - // it the `automation` engine registers flows but nothing ever launches them. - // Schedule triggers run via the job service (in the always-on slate). - // - // This is the APP package's slate. `defineStack` validates capabilities per - // stack, so `src/service/index.ts` declares the four its own metadata needs - // itself, and the artifact's slate is the union of the two lists. - // - // `ai` is deliberately NOT listed. ObjectStack 11.3.0 (ADR-0025 S2) removed - // `@objectstack/service-ai` from the open edition — the AI runtime now ships - // only in the closed cloud package, and the framework CLI does not depend on - // it. Under ObjectStack 16, `requires: ['ai']` is a *fail-fast* capability: - // the serve command hard-aborts boot when the package is absent, so keeping it - // here would break `objectstack start`/`dev` for this open-edition app (the AI - // block runs before every other capability resolves). The AI metadata is - // unaffected — the skills still validate, build into the artifact, and run - // wherever a runtime provides the `ai` tier (cloud's objectos-runtime). There - // are no app-authored agents: they were retired in #512 and the surface is - // skills-only (ADR-0063 §2); skills attach to a platform agent by `surface`. - // A local open-edition boot simply omits the AI service and hides its console - // surface. To run AI locally, declare `@objectstack/service-ai` (cloud) in - // package.json — its mere presence best-effort auto-loads it. - // `hierarchy-security` is the ONE enterprise-edition capability this app - // declares. It was introduced for #880 — `sales_manager` authored - // `writeScope: 'own_and_reports'` on `crm_contract`, an ADR-0057 HIERARCHY - // scope resolved by the `hierarchy-scope-resolver` service that ships only - // in `@objectstack/security-enterprise`, and `defineStack` refuses such a - // grant unless the capability is declared. Since #549 `crm_contract` is - // `controlled_by_parent` under the account, that scope is inert and is no - // longer authored; the app currently authors NO hierarchy scope at all. - // - // The declaration STAYS. Maintainer ruling 2026-08-31 (#1378, pinned by - // `test/hierarchy-read-depth.test.ts`): nothing is removed from `requires[]`. - // Maintainer ruling, 2026-08-11, verbatim: 「本项目是元数据app,在企业版运行就 - // 具备企业版相关的能力,不重复开发。」 The app states what it MEANS and the - // edition supplies the capability, rather than approximating it with a broader - // open-edition value. - // - // UNLIKE `ai` above, this is SAFE to declare on an open-edition boot and does - // NOT fail fast. Verified against `@objectstack/cli`'s serve command: the - // capability resolver looks the token up in `CAPABILITY_PROVIDERS`, finds no - // entry, and because `hierarchy-security` IS in the known - // `PLATFORM_CAPABILITY_TOKENS` vocabulary it takes the deliberate "stay quiet" - // branch — no warning, no abort — since the capability arrives via an explicit - // enterprise plugin in `plugins[]`. Only tier-gated tokens (ai / ai-studio / - // i18n / ui / auth) have the dedicated hard-abort blocks the note above - // describes. `objectstack validate` does print one informational line naming - // the package to install; that is expected output, not a defect to silence. - requires: ["automation", "triggers", "analytics", "auth", "ui", "approvals", "sharing", "hierarchy-security"], - // The locale configuration is the ARTIFACT's, and `i18n` is a - // `'single'`-disposition key: two stacks declaring different values make - // `composeStacks` throw, and declaring identical ones twice is a second - // place to drift. It lives on the App package, alone. - i18n: { - defaultLocale: "en", - supportedLocales: ["en", "zh-CN", "ja-JP", "es-ES"], - fallbackLocale: "en" - }, - ...collections -}, { artifactObjects: options.artifactObjects }); - -// src/service/index.ts -import { defineStack as defineStack2 } from "@objectstack/spec"; - -// src/service/actions/case.actions.ts -import { P } from "@objectstack/spec"; -var EscalateCaseAction = { - name: "escalate_case", - label: "Escalate Case", - objectName: "crm_case", - icon: "alert-triangle", - type: "flow", - target: "escalate_case", - locations: ["record_header", "list_item"], - visible: P`has(record.is_escalated) && record.is_escalated == false && has(record.is_closed) && record.is_closed == false`, - confirmText: "This will escalate the case to the escalation team. Continue?", - successMessage: "Case escalated successfully!", - refreshAfter: true -}; -var CloseCaseAction = { - name: "close_case", - label: "Close Case", - objectName: "crm_case", - icon: "check-circle", - type: "flow", - target: "close_case", - locations: ["record_header"], - visible: P`has(record.is_closed) && record.is_closed == false`, - confirmText: "Are you sure you want to close this case?", - successMessage: "Case closed successfully!", - refreshAfter: true -}; -var ClaimCaseAction = { - name: "claim_case", - label: "Claim Case", - objectName: "crm_case", - icon: "user-plus", - type: "flow", - target: "claim_case", - locations: ["record_header", "list_item"], - // ⛔ Deliberately NOT `has()`-guarded — the one site the #1890 totality sweep - // left alone after making every other `visible` in `src/actions/` total. This - // predicate is the sharing grant's own text, verbatim, and - // `test/claim-case-one-owner-writer.test.ts` compares the two strings; the - // grant itself cannot carry `has()`, because `plugin-sharing` compiles a - // criteria condition with `compileCelToFilter`, which rejects the whole - // function-call class, and an untranslatable rule is DROPPED by the seeder - // (#621). `src/service/sharing/case.sharing.ts` writes that out in full, including why - // `record.owner_id == null` is total one layer down (`{ owner_id: { $null: true } }`). - // ⚠️ What that reasoning does NOT cover is THIS surface: an action `visible` is - // interpreted by CEL in the browser against whatever the page holds, which is - // `{}` for the first renders, so this predicate does abort there. Making it - // total needs the grant and the parity pin moved together — a maintainer call, - // not this card's. (#1890) - visible: P`record.owner_id == null && record.status != "resolved" && record.status != "closed"`, - successMessage: "Case claimed \u2014 it is yours now.", - refreshAfter: true -}; - -// src/service/objects/index.ts -var objects_exports = {}; -__export(objects_exports, { - ArticleFeedback: () => ArticleFeedback, - Case: () => Case, - KnowledgeArticle: () => KnowledgeArticle -}); - -// src/service/objects/article_feedback.object.ts -import { ObjectSchema, Field } from "@objectstack/spec/data"; -var ArticleFeedback = ObjectSchema.create({ - name: "crm_article_feedback", - label: "Article Feedback", - pluralLabel: "Article Feedback", - icon: "thumbs-up", - description: "One reader\u2019s helpful / not-helpful verdict on a knowledge article", - // ADR-0090 D1/D7: OWD is an authored decision. Feedback is an attribute of - // the article, so record access DERIVES from it (ADR-0055) — the same call - // `crm_campaign_member` makes, and for the same reason: a vote row means - // nothing apart from the article it is about, and `crm_knowledge_article` is - // `public_read`, so anyone who can read the article can read its feedback. - // - // ⛔ Not `private`: with the voter as owner, the counters' own evidence would - // be invisible to the author trying to understand them — the same way it was - // wrong on `crm_campaign_member`. - sharingModel: "controlled_by_parent", - // ADR-0079: junction rows have no derivable text title; point the canonical - // nameField at the stored autonumber explicitly (autonumber is not in the - // auto-derivation whitelist). Same call as `crm_campaign_member` and - // `crm_event_attendee`. - nameField: "feedback_number", - // A related list takes its columns from the child's `highlightFields` MINUS - // the lookup it is scoped by, and this object ships no view of its own — so - // this list IS the feedback panel on an article's detail page (#944): the - // verdict, and who gave it. - // - // TWO fields are deliberately absent, for two different reasons: - // - // - `feedback_number`, the same call `crm_campaign_member` makes with - // `member_number`: it is the record TITLE, which a detail page hoists out - // of the body, so leading the strip with it would fill the panel with - // autonumbers instead of verdicts. - // - `comment`, a 500-character textarea. A highlight strip holds short - // values, and keeping it out is also what stops the `basic` group being - // ENTIRELY title-or-strip — a group whose every field is hoisted keeps its - // heading on forms and silently vanishes from detail pages - // (`field-group-shadowed`, the same trap `crm_campaign_member`'s `basic` - // group and `crm_task`'s `assignment` group each had to be rescued from). - // So the comment is the group's own content on the row's detail page, - // and reaches the panel through `relatedListColumns` on the article - // lookup below instead (#1199). - highlightFields: ["crm_knowledge_article", "verdict", "owner_id"], - fieldGroups: [ - { key: "basic", label: "Feedback", icon: "message-square" } - ], - fields: { - feedback_number: Field.autonumber({ - label: "Feedback #", - format: "AF-{0000}", - group: "basic" - }), - // Platform ownership anchor — canonical note in `account.object.ts` (#548). - // Here it is also the VOTER: the platform stamps it on insert, which is - // what `unique_vote_per_reader` keys on and what lets a reader change - // their own mind without an admin's help. - owner_id: Field.lookup("sys_user", { - label: "Reader", - group: "basic", - system: true, - readonly: false - }), - /** - * The article this verdict is about. - * - * `deleteBehavior: 'cascade'` — a vote on a deleted article denotes - * nothing. This is the lesson #696 cost the campaign junction: both party - * lookups there took `Field.lookup`'s `set_null` default, the cleared row - * instantly violated the object's own required-reference rule, and every - * enrolled person became permanently undeletable. A required lookup that - * defaults to `set_null` is that bug waiting to happen, so the behaviour is - * spelled out here rather than inherited. - */ - crm_knowledge_article: Field.lookup("crm_knowledge_article", { - label: "Article", - required: true, - storage: { notNull: true }, - group: "basic", - deleteBehavior: "cascade", - description: "Knowledge article this feedback is about.", - // Curates the feedback panel on the article's detail page — the surface - // the article's AUTHOR reads (#1199). A related list reads - // `relatedListColumns` on the child's lookup before it falls back to - // `highlightFields` minus that lookup (#944), so this is a SUPERSET of - // the fallback (Verdict / Reader) plus `comment`: the note a reader - // types to explain a verdict was stored and shown on no list, and the - // author the field's own description names could not see it without - // opening each row. Last, because it is the one long value. - // - // ⛔ Deliberately NOT solved by adding `comment` to `highlightFields` — - // see the note above that list (`field-group-shadowed`). - relatedListColumns: ["verdict", "owner_id", "comment"] - }), - verdict: Field.select({ - label: "Verdict", - required: true, - storage: { notNull: true }, - group: "basic", - options: [ - { label: "Helpful", value: "helpful", color: "#10B981", default: true }, - { label: "Not Helpful", value: "not_helpful", color: "#EF4444" } - ] - }), - comment: Field.textarea({ - label: "Comment", - group: "basic", - maxLength: 500, - description: "Optional note explaining the verdict \u2014 read by the article\u2019s author." - }) - }, - indexes: [ - { fields: ["crm_knowledge_article"] }, - { fields: ["verdict"] }, - // One vote per reader per article. Without it the counters answer "how many - // clicks", which is not a number anybody wants next to "Not Helpful". - // - // `unique: 'organization'` states the scope explicitly, per ADR-0120: the - // driver prepends the NULL-safe organization key part - // (`COALESCE(organization_id, '__global__')`) at registration, so the - // constraint is one vote per reader per article WITHIN an organization, - // and rows with no organization form one bucket rather than each escaping - // under SQL's NULL-distinct semantics. Bare `unique: true` is the - // deprecated positional spelling of `'global'` — it warns today - // (`unique/unscoped-declared-index`) and protocol 18 rejects it, and - // "globally unique across every installation" is not what one reader's - // opinion of one article means. - { fields: ["crm_knowledge_article", "owner_id"], unique: "organization" } - ], - enable: { - apiEnabled: true, - apiMethods: ["get", "list", "create", "update", "delete"] - } -}); - -// src/service/objects/case.object.ts -import { ObjectSchema as ObjectSchema2, Field as Field2 } from "@objectstack/spec/data"; -import { F, P as P2 } from "@objectstack/spec"; -var Case = ObjectSchema2.create({ - name: "crm_case", - label: "Case", - pluralLabel: "Cases", - icon: "life-buoy", - description: "Customer support cases and service requests", - // ADR-0090 D1/D7: OWD is an authored decision. Owner + escalation sharing rule. - sharingModel: "private", - fieldGroups: [ - { key: "basic", label: "Case Information", icon: "info" }, - { key: "origin", label: "Origin & Routing", icon: "route" }, - { key: "sla", label: "SLA & Priority", icon: "clock" }, - { key: "resolution", label: "Resolution", icon: "check-circle" }, - { key: "escalation", label: "Escalation", icon: "alert-triangle", collapse: "collapsed" }, - { key: "system", label: "System", icon: "database", collapse: "collapsed" } - ], - fields: { - // Platform ownership anchor — canonical note in `account.object.ts` (#548). - owner_id: Field2.lookup("sys_user", { - label: "Case Owner", - group: "origin", - system: true, - readonly: false, - trackHistory: true - }), - // Case Information - // - // `unique: true` is declared HERE, on the field, and deliberately NOT as a - // `{ fields: ['organization_id', 'case_number'], unique: true }` entry in - // `indexes[]` below (#1023) — same spelling `crm_account.name`, - // `crm_contact.email` and `crm_product.sku` already use, for the same - // reason. Since framework #3696 the field-level form is per-organization: - // it materializes as the composite `(organization key part, case_number)`, - // unique WITHIN an organization. Since platform 17.0.0-rc.4 (ADR-0120 D3, - // #5030) that key part is NULL-safe — `COALESCE(organization_id, - // '__global__')` — so rows with no organization form ONE bucket instead of - // each escaping the constraint under SQL's NULL-distinct semantics. - // - // The hand-written table composite this replaced could not get that: a - // declared index is taken verbatim, so it materialized as plain - // `UNIQUE (organization_id, case_number)` and enforced NOTHING on any row - // whose `organization_id` was NULL — i.e. every row of a single-organization - // or untenanted install. It also read as "unique per organization" while - // materializing as an unscoped composite, which is the bare-`unique: true` - // spelling ADR-0120 warns on in 17.x and protocol 18 rejects (#5082). - // - // Scope spelling: bare `true` at FIELD level already means "per - // organization" and carries no deprecation (`'organization'` is its - // explicit synonym with byte-identical materialization — measured). It is - // written as `true` to match the four sibling objects above; switching the - // repo to the explicit word is a uniform decision for all of them, not - // something `crm_case` forks on alone. - case_number: Field2.autonumber({ - label: "Case Number", - group: "basic", - format: "CASE-{00000}", - unique: true - }), - subject: Field2.text({ - label: "Subject", - group: "basic", - required: true, - storage: { notNull: true }, - searchable: true, - maxLength: 255 - }), - // ADR-0079 record title (was titleFormat '{case_number} - {subject}'). - display_title: Field2.formula({ - label: "Display Title", - group: "basic", - expression: F`record.case_number + " - " + record.subject` - }), - description: Field2.markdown({ - label: "Description", - group: "basic", - required: true, - storage: { notNull: true } - }), - // Relationships - crm_account: Field2.lookup("crm_account", { - label: "Account", - group: "basic" - }), - crm_contact: Field2.lookup("crm_contact", { - label: "Contact", - group: "basic", - // Optional so Web-to-Case (anonymous) submissions can land without - // an existing CRM contact. Back-office staff or a triage flow links - // the case to a contact after the fact. This matches the Salesforce - // Web-to-Case convention. - // @objectstack 12: string[] `referenceFilters` is dead (not read by the - // picker). `dependsOn` is the live cascading-lookup form — it scopes the - // contact candidates to those sharing the case's `crm_account` (ADR-0049). - dependsOn: ["crm_account"] - }), - // Case Management - status: Field2.select({ - label: "Status", - group: "basic", - required: true, - storage: { notNull: true }, - // ADR-0052 §5b.1 — platform auto-renders status changes on the timeline - // ("Status: New → Escalated"). Delivers the case timeline declaratively - // (the hand-coded version was deferred in #396 due to a hook-crash bug). - trackHistory: true, - options: [ - { label: "New", value: "new", color: "#808080", default: true }, - { label: "In Progress", value: "in_progress", color: "#FFA500" }, - { label: "Waiting on Customer", value: "waiting_customer", color: "#FFD700" }, - { label: "Waiting on Support", value: "waiting_support", color: "#4169E1" }, - { label: "Escalated", value: "escalated", color: "#FF0000" }, - { label: "Resolved", value: "resolved", color: "#00AA00" }, - { label: "Closed", value: "closed", color: "#006400" } - ] - }), - priority: Field2.select({ - label: "Priority", - group: "sla", - required: true, - storage: { notNull: true }, - trackHistory: true, - options: [ - { label: "Low", value: "low", color: "#4169E1", default: true }, - { label: "Medium", value: "medium", color: "#FFA500" }, - { label: "High", value: "high", color: "#FF4500" }, - { label: "Critical", value: "critical", color: "#FF0000" } - ] - }), - // Sortable ordinal for `priority`. Ordering a queue by the select field - // itself sorts the raw strings, so `priority desc` yields - // medium > low > high > critical — the exact inversion of urgency, which - // buried every critical case at the bottom of the agent's queue. Select - // options carry no ordinal in the spec, so the rank is materialised here - // and stamped by `case_sla_defaults`; queue views sort on it instead. - // `0` is the UNRANKED sentinel, shared with crm_task.priority_rank: it is - // what a record carries when no recognised priority has been stamped, and - // it sorts below every real rank (1–4) on the `priority_rank desc` queues. - // ⛔ It must not be `1` here (or `2` on crm_task): a non-zero sentinel - // orders the same unknown priority differently on the two objects, and on - // this one it is indistinguishable from a genuine `low`. - priority_rank: Field2.number({ - label: "Priority Rank", - readonly: true, - defaultValue: 0 - }), - type: Field2.select({ - label: "Case Type", - group: "basic", - options: [ - { label: "Question", value: "question" }, - { label: "Problem", value: "problem" }, - { label: "Feature Request", value: "feature_request" }, - { label: "Bug", value: "bug" } - ] - }), - origin: Field2.select({ - label: "Case Origin", - group: "origin", - options: [ - { label: "Email", value: "email" }, - { label: "Phone", value: "phone" }, - { label: "Web", value: "web" }, - { label: "Chat", value: "chat" }, - { label: "Social Media", value: "social_media" } - ] - }), - // Assignment - // SLA and Metrics - // - // NO `created_date` here (#1992, the #575 B2 precedent on - // `crm_opportunity`): the platform already injects `created_at` on every - // object and stamps it on every insert, while this duplicate had no writer - // at all — only the seed data set it, so every case created through the - // UI or REST stored null and fell out of "Cases Opened by Priority × Day" - // and the service dashboard's date range. Surfaces that need the creation - // instant read `created_at` (the `case_metrics` dataset, the dashboard - // range, the `case_timeline` view, `case_sla_defaults`' resolution time); - // the seeds author it directly, and the seed loader keeps an authored - // `created_at` on first insert since @objectstack/objectql 17.7.0 - // (objectstack#21646). - closed_date: Field2.datetime({ - label: "Closed Date", - group: "sla", - readonly: true - }), - // ⛔ NOT `readonly`: stamped by `event_activity_bubble` - // (`src/sales/objects/event.hook.ts`) on the first HELD `crm_event` related to the - // case, whoever wrote that event. ⚠️ That hook reaches this case through - // `ctx.api`, a `ScopedContext` over the ACTING USER's execution context — - // so its write is a CALLER-supplied write from a non-`isSystem` context, - // which `stripReadonlyFields` deletes. `readonly` here silently disables - // the stamp. (A hook writing its OWN record's `ctx.input.data` is a - // different case and SURVIVES `readonly` — hook-written keys are not - // caller-supplied. Measured in `test/readonly-write-semantics.test.ts`.) - // - // Definition: the moment the customer first heard back from us, matching - // Salesforce `FirstResponseDateTime` / Zendesk first reply time — NOT an - // internal status change, which would report "responded" while the customer - // is still waiting. - first_response_date: Field2.datetime({ - label: "First Response Date", - group: "sla" - }), - resolution_time_hours: Field2.number({ - label: "Resolution Time (Hours)", - group: "sla", - readonly: true, - scale: 2 - }), - // Stamped once, on the first write that gives the case a priority, from the - // priority × account-tier matrix in `./_case-sla.ts` (`case_sla_defaults`). - // Not `readonly`: a service manager may legitimately renegotiate a deadline, - // and the hook never overwrites a value that is already there. - sla_due_date: Field2.datetime({ - label: "SLA Due Date", - description: "Set from the case priority and the account\u2019s Customer Tier, in calendar hours: nights, weekends and holidays count.", - group: "sla" - }), - // Stamped by two writers, one per side of the clock stop (#2070): the - // `case_sla_monitor` schedule flow while the case is live work, and - // `case_sla_defaults` on the write that resolves or closes it late. The - // rule both apply is `caseSlaBreached` in `./_case-sla.ts`. - // - // NOT `readonly` — but NOT for the reason this comment used to give, and - // the difference is measured in `test/readonly-write-semantics.test.ts` - // (#1429). `case_sla_monitor` declares `runAs: 'system'`, so its writes - // would SURVIVE a `readonly: true` here. It stays writable pending a - // decision that has to weigh the other surfaces (seed data, - // `service-agent.profile.ts`, the create form), not because the platform - // would drop the sweep's write. - // - // ⚠️ This is now the ONLY escalation-group flag still declared writable: - // `is_escalated` and `escalated_date` became `readonly: true` when #1434 - // moved their user-context writer into a system sub-flow. So the open - // question here is narrower than it was — it is purely about this field's - // authoring surfaces, with no platform obstacle left to blame. - is_sla_violated: Field2.boolean({ - label: "SLA Violated", - group: "sla", - defaultValue: false - }), - // Escalation - // - // `readonly: true` — the honest declaration, because nobody types this. - // Its three writers are now unanimously elevated (#1434, maintainer- - // approved decision batch #21 ②): - // - // case_escalation runAs: 'system' (record-change) - // case_sla_monitor runAs: 'system' (schedule) - // case_escalation_stamp runAs: 'system' (called by the escalate_case - // screen flow via a subflow node) - // - // ⭐ What changed, and why the readonly declaration is now safe: the - // `escalate_case` screen flow used to write this field itself, and it - // stays `runAs: 'user'` because a person clicks it. The platform's - // readonly strip is one branch of the UPDATE path - // (`if (!opCtx.context?.isSystem)`, over CALLER-supplied keys), so that - // user-context write WOULD have been silently dropped. Rather than - // elevating the whole screen flow, the stamp moved into the dedicated - // `case_escalation_stamp` sub-flow. The agent's own writes - // (`escalation_reason`, `priority`, `status`) still carry their identity; - // only these two stamps are elevated. - // - // The guest-submission branch of `case.hook.ts` also forces this false, and - // is unaffected: it is a `beforeInsert` hook, so its key is not - // caller-supplied AND the INSERT path is exempt from the strip entirely. - // Seed data (`service.seed.ts`) is exempt for the same reason. - // - // ⛔ If you find yourself reverting this to writable so a user-context flow - // write lands, you are re-opening #1434 — add a `subflow` step instead. - // Semantics measured in `test/readonly-write-semantics.test.ts`. - is_escalated: Field2.boolean({ - label: "Escalated", - group: "escalation", - readonly: true, - defaultValue: false - }), - // `readonly: true`, same reasoning as `is_escalated` above and stamped by - // the same writers — `case_escalation` and the `case_escalation_stamp` - // sub-flow, both `runAs: 'system'`. Never typed by a person. - escalated_date: Field2.datetime({ - label: "Escalated Date", - group: "escalation", - readonly: true - }), - // ⛔ DELIBERATELY NOT `readonly`, and this is load-bearing (#1434). This is - // the agent's own screen input — `escalate_case`'s screen collects it and - // writes it with the USER's context. Declaring it readonly would make the - // platform silently strip the reason the agent just typed, which is the - // harm #1434 was filed about, inverted onto user input. It is also - // required whenever `is_escalated` flips true (the - // `escalation_reason_required` validation below), so dropping it would - // reject the escalation outright. - escalation_reason: Field2.textarea({ - label: "Escalation Reason", - group: "escalation" - }), - // No `parent_case`. A case hierarchy was declared here and never - // traversed: nothing rolled child cases up, nothing closed or notified them - // with the parent, and no service flow read the link. Related cases that - // matter in this app are linked through the knowledge article that resolved - // them (`resolved_by_article`), which the deflection measures do read. - // Resolution - resolution: Field2.markdown({ - label: "Resolution", - group: "resolution" - }), - /** - * The knowledge article that RESOLVED this case (#601). - * - * The second half of a two-way link, and deliberately not a replacement for - * the first. `crm_knowledge_article.related_to_case` points the other way — - * "the case this article was WRITTEN FROM" — and the two answer different - * questions: provenance (where did this article come from) versus - * deflection (what did this article save us). Merging them would make both - * unanswerable, so both stay. - * - * This is the column the deflection measures on `case_metrics` read - * (`kb_resolved_count` / `kb_deflection_rate`), which is why blank is - * normalised to NULL by `case_resolution_article_normalize` in - * `case.hook.ts`: the close-case screen sends `''` for a field the agent - * left empty, an empty string is NOT null, and `count(resolved_by_article)` - * counts it — a silently inflated numerator on a ratio widget, the exact - * shape of #614. - */ - resolved_by_article: Field2.lookup("crm_knowledge_article", { - label: "Resolved by Article", - group: "resolution", - description: "Knowledge article that resolved this case \u2014 the deflection signal." - }), - // Internal notes - internal_notes: Field2.markdown({ - label: "Internal Notes", - group: "system", - description: "Internal notes; not visible to the customer." - }), - // Flags - is_closed: Field2.boolean({ - label: "Is Closed", - group: "system", - defaultValue: false, - readonly: true - }) - }, - // Database indexes for performance - // - // `case_number` is an autonumber (`CASE-{00000}`), and the platform's - // autonumber sequence is PER TENANT — every organization counts from 1. A - // platform-wide unique index on it therefore rejects the second - // organization's `CASE-00001` on insert: the exact collision framework #3696 - // exists to prevent. The constraint has to match the sequence that feeds it. - // - // No `{ fields: ['organization_id', 'case_number'], unique: true }` here - // (#1023). Case-number uniqueness is declared on the `case_number` field - // itself — see the note there for why the hand-written table composite could - // not express it. Do NOT add it back alongside the field-level declaration - // either: declaring both makes the verbatim index win and leaves the - // per-organization one unreachable (framework#3991 - // `unique/double-declaration`), which would silently undo the fix. - indexes: [ - { fields: ["crm_account"] }, - { fields: ["owner_id"] }, - { fields: ["status"] }, - { fields: ["priority"] } - ], - // API surface. History → Field.trackHistory (ADR-0052). - enable: { - apiEnabled: true, - // #602 — screenshots and logs are how a support case gets diagnosed. - // See the canonical capability note in `src/sales/objects/index.ts`. - files: true - }, - // ADR-0052 §5b.2 — declarative milestone activity for the service narrative. - // The caseSideEffects hook still owns its real side-effects (escalation task, - // closed-date stamping); these are timeline entries only, emitted by the platform. - activityMilestones: [ - { field: "status", value: "escalated", summary: "Case escalated \u2014 {subject}", type: "updated" }, - { field: "status", value: "resolved", summary: "Case resolved \u2014 {subject}", type: "completed" }, - { field: "status", value: "closed", summary: "Case closed \u2014 {subject}", type: "completed" } - ], - // ADR-0079: render-only `titleFormat` retired in favor of `nameField`, - // which names a real field. The former template composed two local fields, so - // the `display_title` formula field (see fields) reproduces it. - nameField: "display_title", - // Explicit search targets (ADR-0061). REQUIRED because nameField is a - // FORMULA (display_title/full_name): without this, $search auto-defaults to - // the formula field, which isn't a real column, so the lookup picker + global - // search silently return zero. These are real, indexed columns. - searchableFields: ["subject", "case_number"], - highlightFields: ["case_number", "subject", "crm_account", "status", "priority"], - // Removed: list_views and form_views belong in UI configuration, not object definition - // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the - // rule returns a verdict even when the merged record has no such key. See - // AGENTS.md "Validation predicates must be TOTAL" and - // test/object-validation-predicates.test.ts, which fails the build otherwise. - validations: [ - { - name: "resolution_required_for_closed", - type: "script", - severity: "error", - message: "Resolution is required when closing a case", - condition: P2`has(record.status) && record.status == "closed" && (!has(record.resolution) || isBlank(record.resolution))` - }, - { - name: "escalation_reason_required", - type: "script", - severity: "error", - message: "Escalation reason is required when escalating a case", - condition: P2`has(record.is_escalated) && record.is_escalated == true && (!has(record.escalation_reason) || isBlank(record.escalation_reason))` - }, - { - name: "case_status_progression", - type: "state_machine", - severity: "warning", - message: "Invalid status transition", - field: "status", - // Escalate + Close actions are available from ANY open status (see - // escalate_case / close_case visibility). The transition map must permit - // →escalated and →closed from every open state, else those actions emit a - // spurious "Invalid status transition" warning (e.g. escalating a brand-new - // case, which is a legitimate support move). - transitions: { - "new": ["in_progress", "waiting_customer", "escalated", "closed"], - "in_progress": ["waiting_customer", "waiting_support", "escalated", "resolved", "closed"], - "waiting_customer": ["in_progress", "waiting_support", "escalated", "closed"], - "waiting_support": ["in_progress", "waiting_customer", "escalated", "closed"], - "escalated": ["in_progress", "resolved", "closed"], - "resolved": ["closed", "in_progress"], - // Can reopen - "closed": ["in_progress"] - // Can reopen - } - } - ] - // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were - // removed from the platform. Field updates live in this object's `*.hook.ts`; - // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. -}); - -// src/service/objects/knowledge_article.object.ts -import { ObjectSchema as ObjectSchema3, Field as Field3 } from "@objectstack/spec/data"; -import { F as F2, P as P3 } from "@objectstack/spec"; -var KnowledgeArticle = ObjectSchema3.create({ - name: "crm_knowledge_article", - label: "Knowledge Article", - pluralLabel: "Knowledge Articles", - icon: "book-open", - description: "Reusable knowledge base articles for self-service and AI grounding", - // ADR-0090 D1/D7: OWD is an authored decision. Knowledge base is org-readable; authors edit. - sharingModel: "public_read", - // ─── Public access ───────────────────────────────────────────────────── - // - // Publishing a public article mints a share link through the platform's - // `publicSharing` surface (maintainer ruling, 2026-08-02: no customer portal, - // no anonymous-grant widening). ⛔ The whole safety of that rests on - // `eligibility`, which is the ONLY thing standing between a share dialog and - // a stranger reading an internal or draft article — so this block may only be - // declared while every key below is enforced. - // - // MEASURED on `@objectstack/plugin-sharing@17.1.0` — the version - // installed AT THE TIME of the measurement, not the current pin (this table - // has NOT been re-taken on any later pin — not 17.3.0, #1676, not 17.4.0, - // PR #1814, and not 17.5.0) — - // against the real `ShareLinkService` and a real engine, - // not read off a grep count: - // - // | key | measured on 17.1.0 | - // | -------------------- | ---------------------------------------------- | - // | `enabled` | ENFORCED — false ⇒ SHARING_NOT_ENABLED 422 | - // | `allowedAudiences` | ENFORCED — `signed_in` refused 422 | - // | `allowedPermissions` | ENFORCED — non-`view` refused 422 | - // | `redactFields` | APPLIED to every token-served response | - // | `eligibility` | **ENFORCED — false verdict ⇒ 422, no link** | - // - // `test/knowledge-article-share-links.test.ts` drives all of it end to end - // and is the acceptance evidence; read it before changing anything here. - // - // ⚠️ TWO SPELLING TRAPS, both measured, both of which produce a block that - // LOOKS declared and silently is not: - // - // 1. `eligibility` must be a PLAIN STRING. It is `z.ZodString` in the spec - // and `getPolicy()` keeps it only when `typeof raw.eligibility === - // 'string'`. The `P` tagged template used by `validations[].condition` - // below returns an Expression OBJECT `{ dialect, source }` — passing one - // here does not narrow anything, it makes the predicate vanish. - // - // 2. Every field read is `record.`-PREFIXED. The evaluator is - // `ExpressionEngine` from `@objectstack/formula` (record-level CEL), and - // `record` is the ONLY binding it is given. The bare-identifier spelling - // `status == 'published' && audience == 'public'` COMPILES and then fails - // at evaluate with `Unknown variable: audience`, - // which `assertEligible` turns into ELIGIBILITY_UNEVALUABLE 422. That - // fails CLOSED, so it is not a security hole; it is a feature that never - // mints a single link while reading as if it works. - // - // The predicate is TOTAL for the same reason the `validations` below are: - // `has()` guards every read. `assertEligible` materializes declared fields to - // `null` first, so an absent key would not abort here today — the guards keep - // that true if the field set changes. (The `has(record.x)` caveat carried - // from objectstack#7861 is about `compileCelToFilter`, the SHARING-RULE path. - // That is a different evaluator, it is not on this code path, and it is not - // even exported from `@objectstack/plugin-sharing`. Verified, not assumed.) - // - // ⚠️ Eligibility is evaluated at MINT time only; `resolveToken()` does not - // re-check it. Re-classifying a published/public article to internal or back - // to draft does NOT revoke links already minted from it — those must be - // revoked explicitly. That is platform behaviour, filed upstream, not - // something this app compensates for app-side. - publicSharing: { - enabled: true, - // `public` and `link_only` only. `signed_in` would be a different feature - // and `email` is refused at creation without an allowlist. - allowedAudiences: ["public", "link_only"], - // Read-only. Same as the platform default, declared anyway: this is a - // security boundary, and a default is not a decision. - allowedPermissions: ["view"], - // The gate. Published AND public-audience, nothing else — a draft, an - // in_review, an archived, or any internal-audience article is refused at - // `createLink` with RECORD_NOT_ELIGIBLE 422 and no row is written. - eligibility: 'has(record.status) && record.status == "published" && has(record.audience) && record.audience == "public"', - // Stripped from every token-served response. These are the fields that - // exist for staff: who owns the article, which customer case it was - // written from, and when an editor last reviewed it. None of them are part - // of the answer a reader followed the link for. - redactFields: ["owner_id", "related_to_case", "last_reviewed_at"] - }, - // ADR-0079: render-only `titleFormat` retired in favor of `nameField`, - // which names a real field. The former template composed two local fields, so - // a `display_title` formula field reproduces it for the record title. - nameField: "display_title", - // Explicit search targets (ADR-0061). REQUIRED because nameField is a - // FORMULA (display_title/full_name): without this, $search auto-defaults to - // the formula field, which isn't a real column, so the lookup picker + global - // search silently return zero. These are real, indexed columns. - searchableFields: ["title", "article_number", "summary"], - highlightFields: ["article_number", "title", "category", "status", "audience"], - fieldGroups: [ - { key: "basic", label: "Article Information", icon: "info" }, - { key: "content", label: "Content", icon: "file-text" }, - { key: "taxonomy", label: "Categorization", icon: "tag" }, - { key: "metrics", label: "Engagement", icon: "activity", collapse: "collapsed" } - ], - fields: { - // Platform ownership anchor — canonical note in `account.object.ts` (#548). - owner_id: Field3.lookup("sys_user", { - label: "Article Owner", - group: "basic", - system: true, - readonly: false, - trackHistory: true - }), - article_number: Field3.autonumber({ - label: "Article Number", - format: "KA-{0000}", - group: "basic" - }), - title: Field3.text({ - label: "Title", - required: true, - storage: { notNull: true }, - searchable: true, - maxLength: 255, - group: "basic" - }), - // ADR-0079 record title (was titleFormat '{article_number} - {title}'). - display_title: Field3.formula({ - label: "Display Title", - expression: F2`record.article_number + " - " + record.title`, - group: "basic" - }), - summary: Field3.text({ - label: "Summary", - description: "One-paragraph TL;DR shown in search results and AI citations.", - maxLength: 500, - searchable: true, - group: "basic" - }), - body: Field3.markdown({ - label: "Body", - description: "Full article content (Markdown).", - searchable: true, - group: "content" - }), - category: Field3.select({ - label: "Category", - group: "taxonomy", - options: [ - { label: "Getting Started", value: "getting_started", default: true }, - { label: "How-To", value: "how_to" }, - { label: "Troubleshooting", value: "troubleshooting" }, - { label: "Billing & Pricing", value: "billing" }, - { label: "API & Integrations", value: "api" }, - { label: "Release Notes", value: "release_notes" }, - { label: "Policy", value: "policy" } - ] - }), - tags: Field3.select({ - label: "Tags", - multiple: true, - group: "taxonomy", - options: [ - { label: "Auth", value: "auth" }, - { label: "SSO", value: "sso" }, - { label: "Mobile", value: "mobile" }, - { label: "Email", value: "email" }, - { label: "Reports", value: "reports" }, - { label: "Performance", value: "performance" }, - { label: "Data Import", value: "data_import" }, - { label: "Webhooks", value: "webhooks" } - ] - }), - status: Field3.select({ - label: "Status", - required: true, - storage: { notNull: true }, - group: "basic", - trackHistory: true, - options: [ - { label: "Draft", value: "draft", color: "#94A3B8", default: true }, - { label: "In Review", value: "in_review", color: "#F59E0B" }, - { label: "Published", value: "published", color: "#10B981" }, - { label: "Archived", value: "archived", color: "#475569" } - ] - }), - audience: Field3.select({ - label: "Audience", - required: true, - storage: { notNull: true }, - group: "basic", - description: "Public articles are visible in the customer portal; internal articles are agent-only.", - options: [ - { label: "Public", value: "public", default: true, color: "#0EA5E9" }, - { label: "Internal", value: "internal", color: "#7C3AED" } - ] - }), - language: Field3.select({ - label: "Language", - group: "basic", - options: [ - { label: "English", value: "en", default: true }, - { label: "Simplified Chinese", value: "zh_cn" }, - { label: "Spanish", value: "es_es" }, - { label: "Japanese", value: "ja_jp" } - ] - }), - related_to_case: Field3.lookup("crm_case", { - label: "Originating Case", - description: "Case this article was authored from (optional).", - group: "content" - }), - published_at: Field3.datetime({ - label: "Published At", - readonly: true, - group: "basic" - }), - last_reviewed_at: Field3.datetime({ - label: "Last Reviewed At", - readonly: true, - group: "basic" - }), - /** - * `view_count` is GONE (#601), and this note is the record of why. - * - * All three engagement counters were `readonly: true` with a writer - * nowhere — on the platform or in this app — so all three were pinned at - * whatever the seed said, forever, while the article grid summed a "Views" - * column. ADR-0049's enforce-or-remove leaves two honest endings per - * field: give it a writer, or delete it. The card left this one to the - * implementer, and the two below went the other way, so the split is - * argued rather than assumed. - * - * A page-view writer WOULD have been expressible — `afterFind` is a real - * hook event on this platform. It is not built, because of what the event - * actually means: `beforeFind`/`afterFind` fire on record MATERIALIZATION, - * for `find` and `findOne` alike, with no per-method read event - * (deliberately — see the spec's note on #3195). So a counter written - * there would increment on the article grid, on global search, on the - * lookup picker in the close-case screen, on the AI grounding queries that - * cite articles — every one of them a "view" of a row nobody read. The - * number would grow fastest for articles nobody opens, and it would carry - * a database write on every read path in the app to do it. - * - * "Views" that means "appearances in any query" is a worse lie than a - * field that is missing, because it looks like data. A real page-view - * counter needs a real view event from a real article surface — the day - * one exists, this field comes back with it, and not before. - * - * `helpful_count` / `not_helpful_count` DO get a writer, and it is the - * whole reason `crm_article_feedback` exists: reader verdicts are recorded - * as rows and these two are RECOUNTED from them by - * `article_feedback_metrics_refresh`. They stay `readonly: true` and that - * is now an accurate statement — derived from evidence, never typed in. - */ - helpful_count: Field3.number({ - label: "Helpful Votes", - group: "metrics", - readonly: true, - defaultValue: 0, - description: "Recounted from crm_article_feedback \u2014 never typed in." - }), - not_helpful_count: Field3.number({ - label: "Not Helpful Votes", - group: "metrics", - readonly: true, - defaultValue: 0, - description: "Recounted from crm_article_feedback \u2014 never typed in." - }) - }, - indexes: [ - { fields: ["title"] }, - { fields: ["category"] }, - { fields: ["status"] }, - { fields: ["audience"] }, - { fields: ["language"] } - ], - // API surface. History → Field.trackHistory (ADR-0052). - enable: { - apiEnabled: true, - apiMethods: ["get", "list", "create", "update", "delete"] - }, - // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the - // rule returns a verdict even when the merged record has no such key. See - // AGENTS.md "Validation predicates must be TOTAL" and - // test/object-validation-predicates.test.ts, which fails the build otherwise. - validations: [ - { - name: "published_requires_body", - type: "script", - severity: "error", - message: "Articles cannot be published without a body.", - condition: P3`has(record.status) && record.status == "published" && (!has(record.body) || record.body == null || record.body == "")` - }, - { - name: "published_requires_summary", - type: "script", - severity: "warning", - message: "Published articles should have a summary for search results and AI citations.", - condition: P3`has(record.status) && record.status == "published" && (!has(record.summary) || record.summary == null || record.summary == "")` - } - ] -}); - -// src/sales/objects/index.ts -var objects_exports2 = {}; -__export(objects_exports2, { - Account: () => Account, - Contact: () => Contact, - Event: () => Event, - EventAttendee: () => EventAttendee, - Forecast: () => Forecast, - Lead: () => Lead, - Opportunity: () => Opportunity, - Task: () => Task -}); - -// src/sales/objects/account.object.ts -import { ObjectSchema as ObjectSchema4, Field as Field4 } from "@objectstack/spec/data"; -import { F as F3 } from "@objectstack/spec"; - -// src/sales/objects/_picklists.ts -var SALUTATION_OPTIONS = [ - { label: "Mr.", value: "mr" }, - { label: "Ms.", value: "ms" }, - { label: "Mrs.", value: "mrs" }, - { label: "Dr.", value: "dr" }, - { label: "Prof.", value: "prof" } -]; -var INDUSTRY_OPTIONS = [ - { label: "Technology", value: "technology" }, - { label: "Software / SaaS", value: "software" }, - { label: "Finance", value: "finance" }, - { label: "Healthcare", value: "healthcare" }, - { label: "Retail", value: "retail" }, - { label: "Manufacturing", value: "manufacturing" }, - { label: "Education", value: "education" }, - { label: "Real Estate", value: "real_estate" }, - { label: "Media & Entertainment", value: "media" }, - { label: "Logistics", value: "logistics" }, - { label: "Hospitality", value: "hospitality" }, - { label: "Energy & Utilities", value: "energy" }, - { label: "Government", value: "government" }, - { label: "Non-profit", value: "nonprofit" }, - { label: "Other", value: "other" } -]; -var LEAD_SOURCE_OPTIONS = [ - { label: "Web", value: "web" }, - { label: "Referral", value: "referral" }, - { label: "Event / Trade Show", value: "event" }, - { label: "Webinar", value: "webinar" }, - { label: "Partner", value: "partner" }, - { label: "Advertisement", value: "advertisement" }, - { label: "Paid Search", value: "paid_search" }, - { label: "Social Media", value: "social" }, - { label: "Content / Blog", value: "content" }, - { label: "Cold Call", value: "cold_call" }, - { label: "Email Campaign", value: "email_campaign" }, - { label: "Other", value: "other" } -]; -var PAYMENT_TERMS_OPTIONS = [ - { label: "Net 15", value: "net_15" }, - { label: "Net 30", value: "net_30", default: true }, - { label: "Net 60", value: "net_60" }, - { label: "Net 90", value: "net_90" }, - { label: "Due on Receipt", value: "due_on_receipt" } -]; -var TASK_TYPE_OPTIONS = [ - { label: "Call", value: "call" }, - { label: "Email", value: "email" }, - { label: "Meeting", value: "meeting" }, - { label: "Follow-up", value: "follow_up" }, - { label: "Demo", value: "demo" }, - { label: "Other", value: "other" } -]; -var OPPORTUNITY_STAGE_OPTIONS = [ - { label: "Prospecting", value: "prospecting", color: "#808080", default: true }, - { label: "Qualification", value: "qualification", color: "#FFA500" }, - { label: "Needs Analysis", value: "needs_analysis", color: "#FFD700" }, - { label: "Proposal", value: "proposal", color: "#4169E1" }, - { label: "Negotiation", value: "negotiation", color: "#9370DB" }, - { label: "Closed Won", value: "closed_won", color: "#00AA00" }, - { label: "Closed Lost", value: "closed_lost", color: "#FF0000" } -]; -var EVENT_TYPE_OPTIONS = [ - { label: "Meeting", value: "meeting", color: "#4169E1", default: true }, - { label: "Call", value: "call", color: "#00AA00" }, - { label: "Demo", value: "demo", color: "#9370DB" }, - { label: "Webinar", value: "webinar", color: "#FFA500" }, - { label: "Onsite Visit", value: "onsite_visit", color: "#0EA5E9" }, - { label: "Other", value: "other", color: "#808080" } -]; -var EVENT_STATUS_OPTIONS = [ - { label: "Planned", value: "planned", color: "#4169E1", default: true }, - { label: "Held", value: "held", color: "#00AA00" }, - { label: "Cancelled", value: "cancelled", color: "#999999" }, - { label: "No Show", value: "no_show", color: "#FF4500" } -]; -var ATTENDEE_RESPONSE_OPTIONS = [ - { label: "No Response", value: "no_response", color: "#808080", default: true }, - { label: "Accepted", value: "accepted", color: "#00AA00" }, - { label: "Declined", value: "declined", color: "#FF0000" }, - { label: "Tentative", value: "tentative", color: "#FFA500" } -]; -var RELATED_TO_TYPE_OPTIONS = [ - { label: "Account", value: "crm_account" }, - { label: "Contact", value: "crm_contact" }, - { label: "Opportunity", value: "crm_opportunity" }, - { label: "Lead", value: "crm_lead" }, - { label: "Case", value: "crm_case" } -]; -var DUPLICATE_OF_TYPE_AUTHORABLE_OPTIONS = [ - { label: "Lead", value: "crm_lead" }, - { label: "Contact", value: "crm_contact" } -]; -var DUPLICATE_OF_TYPE_ERASED = "erased"; -var DUPLICATE_OF_TYPE_OPTIONS = [ - ...DUPLICATE_OF_TYPE_AUTHORABLE_OPTIONS, - { label: "Erased Record", value: DUPLICATE_OF_TYPE_ERASED } -]; -var plainOptions = (options) => options.map(({ label, value }) => ({ label, value })); -var LEAD_NEED_TYPE_OPTIONS = [ - { label: "New Implementation", value: "new_implementation" }, - { label: "Expansion", value: "expansion" }, - { label: "Replacement", value: "replacement" }, - { label: "Renewal", value: "renewal" }, - { label: "Consulting", value: "consulting" }, - { label: "Support & Maintenance", value: "support" }, - { label: "Other", value: "other" } -]; - -// src/sales/objects/_territory.ts -var TERRITORY = { - NA: "na", - EMEA: "emea", - OTHER: "other" -}; -var TERRITORY_OPTIONS = [ - { label: "North America", value: TERRITORY.NA, color: "#0070D2" }, - { label: "EMEA", value: TERRITORY.EMEA, color: "#7C3AED" }, - { label: "Other", value: TERRITORY.OTHER, color: "#999999" } -]; -var TERRITORY_FALLBACK = TERRITORY.OTHER; -var TERRITORY_COUNTRIES = { - na: ["US", "CA", "MX"], - emea: ["GB", "DE", "FR", "IT", "ES"] -}; -var COUNTRY_ALIASES = { - "United States": "US", - "United States of America": "US", - USA: "US", - Canada: "CA", - Mexico: "MX", - UK: "GB", - "United Kingdom": "GB", - "Great Britain": "GB", - Germany: "DE", - France: "FR", - Italy: "IT", - Spain: "ES" -}; -var COUNTRY_TERRITORY = (() => { - const map = {}; - for (const [territory, countries] of Object.entries(TERRITORY_COUNTRIES)) { - for (const code of countries) map[code] = territory; - } - for (const [alias, code] of Object.entries(COUNTRY_ALIASES)) { - const territory = map[code]; - if (!territory) { - throw new Error(`COUNTRY_ALIASES: "${alias}" points at "${code}", which no territory covers`); - } - const key = normalizeCountry(alias); - if (map[key] && map[key] !== territory) { - throw new Error(`COUNTRY_ALIASES: "${alias}" collides with an entry mapped to "${map[key]}"`); - } - map[key] = territory; - } - return map; -})(); -function normalizeCountry(value) { - return typeof value === "string" ? value.trim().replace(/\s+/g, " ").toUpperCase() : ""; -} - -// src/sales/objects/account.object.ts -var Account = ObjectSchema4.create({ - name: "crm_account", - label: "Account", - pluralLabel: "Accounts", - icon: "building", - description: "Companies and organizations doing business with us", - // ADR-0090 D1/D7: OWD is an authored decision. Owner + sharing rules (team/territory grants below). - sharingModel: "private", - // ADR-0079: render-only `titleFormat` retired in favor of `nameField`, - // which names a real field. The former template composed two local fields, so - // a `display_title` formula field reproduces it for the record title. - nameField: "display_title", - // Explicit search targets (ADR-0061). REQUIRED because nameField is a - // FORMULA (display_title/full_name): without this, $search auto-defaults to - // the formula field, which isn't a real column, so the lookup picker + global - // search silently return zero. These are real, indexed columns. - searchableFields: ["name", "account_number", "registration_number"], - highlightFields: ["account_number", "name", "type", "owner_id"], - // The record's picture (#1199): the record chrome draws the logo beside the - // title in every account page header. No logo, no picture: the platform - // draws no placeholder or initials in its place. - imageField: "logo", - // Field groups organize the form layout. Array order == display order. - // Each field below opts in via `group: ''`. - fieldGroups: [ - { key: "basic", label: "Basic Information", icon: "building" }, - { key: "financials", label: "Financials", icon: "dollar-sign" }, - // REQ-0003 acceptance 3: the business-profile fields render as their own - // group with NO `record:details` section authored anywhere — the derived - // layout ladder's rung 1 (AGENTS.md: escape hatches are for extreme cases). - { key: "business_profile", label: "Business Profile", icon: "briefcase" }, - { key: "contact_info", label: "Contact Information", icon: "phone" }, - { key: "ownership", label: "Ownership & Status", icon: "users" }, - { key: "branding", label: "Branding", icon: "palette", collapse: "collapsed" }, - { key: "system", label: "System", icon: "settings", collapse: "collapsed" } - ], - fields: { - // ─── Ownership ───────────────────────────────────────────────────── - // - // `owner_id` is the PLATFORM ownership anchor, not an app invention: the - // registry injects exactly this column into every user-owned object - // (`applySystemFields`), and it is the one OWD, sharing rules, owner-scope - // widening and the `is_private` row filter all read. ⛔ Never author a - // SECOND `owner` lookup beside it — reassigning that moves the record in - // every list and report and moves no access at all. - // - // ⚠️ Declared rather than left to injection, which the platform supports - // explicitly ("author-declared fields with the same name always win over - // injection, no overwrite"). Three things only a declaration buys: - // • `os validate` resolves it. An injected column is invisible to every - // author-time rule, so `highlightFields: ['owner_id']` is reported as - // "not a field on this object — silently skipped by every consumer", - // and a CEL predicate reading `record.owner_id` fails outright. - // • the per-object label and `group` survive (an injected field carries - // the generic label "Owner" and no group at all); - // • `trackHistory` survives, so a transfer still renders on the record - // timeline instead of only in the compliance audit log. - // `system: true` keeps the injected marker the platform's own tooling - // reads — notably the clone path, which strips system columns so a copy is - // stamped to the cloner rather than inheriting the source's owner. - // - // No `defaultValue`: the security middleware stamps `owner_id` to the - // acting user on any insert that leaves it empty, and denies one that names - // another user without `allowTransfer` (#3004). That is stronger than a - // field default, which evaluates to nothing on every user-less write. - owner_id: Field4.lookup("sys_user", { - label: "Account Owner", - group: "ownership", - system: true, - readonly: false, - trackHistory: true - }), - // AutoNumber field - Unique account identifier - account_number: Field4.autonumber({ - label: "Account Number", - format: "ACC-{000000}", - group: "basic" - }), - // Basic Information - // - // ⚠️ `unique: true` is declared HERE, on the field, and deliberately NOT as - // a `{ fields: ['name'], unique: true }` entry in `indexes[]` below. The - // field-level form is tenant-scoped — it materializes as - // `(organization_id, name)`, unique WITHIN an organization — while a - // declared index is taken verbatim, i.e. platform-wide. The table form - // means the SECOND organization to create an "Acme Corp" is rejected by the - // database, and account name is also the seed data's external-id / upsert - // key (`src/sales/data/sales.seed.ts`), so it bites the first multi-tenant - // install. The composite also indexes the column, so no separate - // `{ fields: ['name'] }` entry is needed for the `searchableFields` / - // seed-upsert read paths. - name: Field4.text({ - label: "Account Name", - required: true, - storage: { notNull: true }, - searchable: true, - unique: true, - maxLength: 255, - group: "basic" - }), - /** - * Case- and whitespace-folded copy of `name` — the key lead conversion - * matches accounts on. - * - * ### Why a stored column, and not any of the cheaper shapes - * - * ⚠️ Three cheaper fixes are all dead ends, and each is a live platform - * constraint. `test/account-name-normalized-match.test.ts` re-measures every - * one so this note cannot quietly go stale: - * - * - **A flow cannot normalize.** `service-automation`'s `resolveToken` - * understands exactly one function form, `/^(NOW|TODAY)\s*\(\s*\)…/`. - * `{LOWER(x)}`, `{TRIM(x)}` and `{x.toLowerCase()}` all resolve to - * `undefined` (every bare identifier is substituted before the expression - * is evaluated, so no string method is reachable), and an unwrapped - * `LOWER({x})` interpolates literally to `"LOWER(Acme Corp)"`. - * - **A formula field cannot be the match key.** `driver-sql`'s - * `fieldHasColumn` returns false for `type: 'formula'`, so a computed - * value has no physical column and nothing can filter on it. - * - **`$regex` is not an answer.** On `driver-sql` it does not run as a - * regex at all: it compiles to `LIKE '%value%'`, a SUBSTRING match, so - * `"Acme Corp"` also matches `"Not Acme Corp Ltd"`. It cannot collapse - * internal whitespace, the leading wildcard defeats the index, and on the - * in-memory driver it does compile user-controlled text into a `RegExp`. - * - * So the canonical form is established by the PRODUCER at write time — the - * same doctrine `crm_lead.email` / `crm_contact.email` follow — and the - * reader does a plain, indexed equality match. The other side of that - * comparison is `crm_lead.company_normalized`, which exists for the same - * reason: a flow can compare two stored columns, it cannot compute either. - * - * ### What it holds - * - * `name`, trimmed, lower-cased, with runs of internal whitespace collapsed - * to one space. Nothing else — normalize-then-EXACT. Fuzzy matching - * (punctuation folding, legal-suffix stripping, edit distance) is - * deliberately out of scope; it turns a lookup into a ranking problem and - * needs a human review affordance this app does not have. - * - * Derived, never authored: `account.hook.ts` recomputes it on every write - * that carries `name`, and leaves it alone otherwise. `readonly` keeps - * user/API writes off it (INSERT is exempt from the strip and UPDATE strips - * only CALLER-supplied keys, so the hook's own write always survives); - * `hidden` keeps a machine-owned column out of forms and pickers — the same - * pairing `crm_forecast.seed_key` uses. - */ - name_normalized: Field4.text({ - label: "Account Name (Normalized)", - description: "Match key for lead conversion: Account Name lower-cased, trimmed, with internal whitespace collapsed. Maintained by the account_protection hook \u2014 never edit directly.", - readonly: true, - hidden: true, - maxLength: 255, - group: "system" - }), - // ADR-0079 record title (was titleFormat '{account_number} - {name}'). - display_title: Field4.formula({ - label: "Display Title", - expression: F3`record.account_number + " - " + record.name`, - group: "basic" - }), - /** - * The counterparty's registered identity in a government registry. - * - * ⛔ NOT named after one country's registry, and that is the whole design - * constraint (REQ-0003 *Disposition & rationale*). The requirement arrived - * as 社会信用代码 because the customer registers in China; a Japanese install - * writes 法人番号 here, a German one a Handelsregisternummer, a US one an - * EIN. A `unified_social_credit_code` field would carry one country's - * registry in its NAME, where no install can rename it — so the core field - * is generic and the registry it came from is the install's own knowledge. - * - * ⚠️ Distinct from `account_number` above, which is OUR sequence - * (`Field.autonumber`, `ACC-{000000}`) and already spent as half the record - * title. That is an identifier we issue; this is one we were given, and - * invoicing, credit checks and entity resolution key on the latter. - * - * `searchable` + the `searchableFields` entry above is REQ-0003 acceptance - * 1 — the value is findable from global search and the lookup picker. It is - * indexed below for that read path. - * - * ⛔ NOT `unique: true`. Refusing a save because two rows carry the same - * registered identity is a data-quality POLICY, and this repo has already - * chosen the soft shape for that question once — the hard unique on - * `crm_lead.email` was removed because refusing a repeat is worse than - * recording it. The same reasoning `name_normalized` records: a match key, - * not a policy. Deduplication is a review affordance this app does not have. - */ - registration_number: Field4.text({ - label: "Registration Number", - description: "The counterparty's registered identity as issued by its own government registry \u2014 whichever registry that is. Not the Account Number, which we issue.", - searchable: true, - maxLength: 64, - group: "basic" - }), - /** - * What this account may be used for commercially — the category that GATES - * capability rather than merely classifying (REQ-0003, the record's most - * valuable primitive: *some counterparties are payable but not sellable*). - * - * ## Why a field BESIDE `type`, and not four more options on it - * - * REQ-0003 leaves this open ("either new options on `type` or a field - * beside it, decided when built"). It is a separate field because `type` - * is a RELATIONSHIP-STAGE axis — prospect → customer → former, plus - * partner — and it already has two readers that would be broken by a value - * meaning "may not be sold to": `account.hook.ts` promotes on it, and - * `opportunity.hook.ts` flips a won deal's account to `customer`. An - * `agency` option on `type` would therefore be overwritten into `customer` - * by the first won deal booked against it, silently un-restricting the - * account. The two axes are independent — an agency can be a prospect, a - * customer or a former customer — so they are two fields. - * - * ## Generic values only - * - * REQ-0003 rules the customer's own vocabulary (招标代理公司 …) **C**: - * overlay configuration, ⛔ never committed into core. Core ships the - * capability distinction itself; an install maps its market's categories - * onto these two values. - * - * ## What reads it: `opportunity.hook.ts` `beforeInsert` - * - * REQ-0003 is explicit that "a category no rule reads is prose, and the - * rule is the point", so this field ships WITH its reader. The reader is a - * hook, and which construct carries the gate is a maintainer ruling - * (2026-09-16), quoted verbatim and kept untranslated: - * - * 「闸门走 `opportunity.hook.ts` 的 `beforeInsert`,用 hook 的 `ctx.api` 读客户类别。 - * REQ-0003 第 128 行的 `validations[]` 与该记录自己的验收第 2 条冲突,以验收为准。」 - * - * ⛔ Do NOT restate the gate as the `validations[]` entry REQ-0003 line - * 128 names. TWO independent measurements say it cannot be that, and both - * are recorded here because each alone would be talked past: - * - * 1. **It would brick history.** A validation is evaluated against - * `{...previous, ...data}` on EVERY write, so "already linked to a - * restricted account" and "linking now" are the same state and every - * later edit to every historical opportunity would be refused — the - * exact thing REQ-0003 acceptance 2 forbids ("opportunities that - * already point at it keep working and keep being editable"). - * `lead.hook.ts` carries the same finding for its own gate. - * 2. **It cannot read the account at all.** A predicate is evaluated by - * `checkPredicate(rule, merged, previous)` over plain data objects — - * the opportunity's OWN stored columns. `record.crm_account.type` - * does not traverse the lookup (measured: `runtime: No such key: - * type`), and `os.lookup(...)` has no overload because `buildScope()` - * in `@objectstack/formula` composes `os` from only `ctx.user` / - * `ctx.org` / `ctx.env` and never binds `ctx.api` (measured: - * `runtime: found no matching overload for 'dyn.lookup(string, - * dyn)'`; filed upstream as objectstack#18318). An unevaluable - * predicate REJECTS THE WRITE, so authoring it literally refuses - * every opportunity write, insert and update alike. - * - * ⚠️ The hook's `ctx.api` is a DIFFERENT surface from the formula - * `EvalContext.api` that measurement 2 is about, and the two are routinely - * confused. The hook one is live and used ~20 times across - * `src/sales/objects/*.hook.ts`; its shape is `./_hook-api.ts`, pinned - * against a real engine by `test/hook-query-predicate.test.ts` and - * `test/hook-write-shape.test.ts`. objectstack#18318 does not block this - * field. - * - * ⛔ Do NOT "fix" anything here by denormalising this value onto - * `crm_opportunity`: a copy needs a writer and goes stale the moment an - * account is reclassified, and anything able to write the copy is able to - * simply refuse. - */ - commercial_capability: Field4.select({ - label: "Commercial Capability", - group: "basic", - description: "Whether new business may be opened against this account. Settlement Only accounts stay fully usable for billing and payment, but no new opportunity may be linked to them.", - defaultValue: "full", - options: [ - { label: "Full", value: "full", color: "#00AA00", default: true }, - { label: "Settlement Only", value: "settlement_only", color: "#FFA500" } - ] - }), - // Select fields with custom options - type: Field4.select({ - label: "Account Type", - group: "basic", - options: [ - { label: "Prospect", value: "prospect", color: "#FFA500", default: true }, - { label: "Customer", value: "customer", color: "#00AA00" }, - { label: "Partner", value: "partner", color: "#0000FF" }, - { label: "Former Customer", value: "former", color: "#999999" } - ] - }), - industry: Field4.select({ - label: "Industry", - group: "basic", - // Canonical set shared with Lead (#490): lead_conversion copies - // `leadRecord.industry` onto the account it creates, so this must - // accept every Lead value. - options: [...INDUSTRY_OPTIONS] - }), - description: Field4.markdown({ - label: "Description", - group: "basic" - }), - // Number fields - annual_revenue: Field4.currency({ - label: "Annual Revenue", - min: 0, - group: "financials", - trackHistory: true - }), - /** - * Rolled-up annual revenue of this account's direct children. - * - * ⚠️ DIRECT children only, one level — the engine aggregates over the rows - * whose `parent_account` is this account, not over a transitive closure. A - * grandparent shows the sum of its own children, and the docs say so; - * anything else needs a different (and much more expensive) primitive than - * the one the platform ships. - * - * Self-referencing roll-ups are worth measuring rather than assuming, - * because parent and child are the same object and the engine's summary - * index is keyed by child object. `test/decorative-field-sweep.test.ts` - * drives all four legs of the lifecycle (insert, raise, re-parent, delete) - * so a platform regression cannot quietly turn this back into decoration. - */ - child_account_revenue: Field4.summary({ - label: "Child Account Revenue", - group: "financials", - scale: 2, - summaryOperations: { - object: "crm_account", - field: "annual_revenue", - function: "sum", - relationshipField: "parent_account" - } - }), - number_of_employees: Field4.number({ - label: "Employees", - min: 0, - group: "financials" - }), - // ─── Business profile (REQ-0003 step 3) ──────────────────────────── - // - // Generic B2B sales intelligence, not IT-services vocabulary: who holds the - // account today, how much there is to win this year, and how they pay. - // - // ⚠️ `annual_revenue` above answers none of these — it is the account's OWN - // turnover, what the counterparty earns, whereas the budget below is what - // it will SPEND with vendors. Reusing one for the other is the mistake this - // group exists to prevent. - // - // ⚠️ `pnpm validate` reports all three as "carrier-only — declared but - // nothing in this stack reads or displays it", and that reading is EXPECTED - // here rather than a defect to tidy away. The liveness diagnostic counts - // view columns, form sections, page bindings, flow nodes, formulas, hooks - // and actions as sites; it does NOT count `fieldGroups` membership, which - // is precisely the DERIVED layout REQ-0003 acceptance 3 asks for ("render - // as their own group … without any `record:details` section being - // authored"). These are data-entry fields a person fills in and a person - // reads off the derived form. ⛔ Do NOT answer the warning by authoring a - // `record:details` section — that is the escape hatch AGENTS.md reserves - // for a named customer demand, and it would trade acceptance 3 for a - // quieter log. No guard reads this warning. - incumbent_vendor: Field4.text({ - label: "Incumbent Vendor", - description: "The supplier currently holding this account for the spend we are chasing.", - maxLength: 255, - group: "business_profile" - }), - annual_purchasing_budget: Field4.currency({ - label: "Annual Purchasing Budget", - description: "What this account expects to SPEND with vendors this year \u2014 not its own revenue.", - min: 0, - group: "business_profile" - }), - // Payment terms as a select, not free text: it is read by a person sizing - // cash-flow risk, and a picklist keeps that domain knowable. The values are - // the net-terms ladder every B2B install shares; a customer whose contracts - // use a different ladder overlays its own. - payment_cycle: Field4.select({ - label: "Payment Cycle", - group: "business_profile", - options: [ - { label: "Prepaid", value: "prepaid" }, - { label: "Net 30", value: "net_30" }, - { label: "Net 60", value: "net_60" }, - { label: "Net 90", value: "net_90" } - ] - }), - // Contact Information - phone: Field4.text({ - label: "Phone", - format: "phone", - group: "contact_info" - }), - website: Field4.url({ - label: "Website", - group: "contact_info" - }), - // Structured Address field (new field type) - billing_address: Field4.address({ - label: "Billing Address", - group: "contact_info" - }), - /** - * Flat projection of `billing_address.country`. - * - * ### Why the flat column exists — the trap that catches every rule - * ### authored against an `address` - * - * ⚠️ `billing_address` is an `address` field: the platform stores the whole - * {street, city, state, postalCode, country, countryCode, formatted} value - * in ONE column. A sharing rule's CEL condition is compiled to a - * pushdown-able `FilterCondition` by `compileCelToFilter`, and that compiler - * rejects every path reaching INSIDE such a value: - * - * record.billing_address.country in ["US","CA","MX"] - * → unsupported: cross-object/nested field path - * "record.billing_address.country" is not pushdown-able - * - * `plugin-sharing` then refuses to seed the rule rather than degrade it to - * match-all, so the rule is dropped on every boot and its recipients get - * nothing at all. Measured: the blocker is the NESTED PATH, not the - * `in [...]` operator — `in [...]`, `==`, `!=`, `<`, `>`, `&&`, `||`, `!`, - * `startsWith()` and `== null` all compile fine against a FLAT field. - * Rewriting the condition as a disjunction of `==` therefore does NOT help; - * only a flat column does. `test/sharing-seeding.test.ts` measures that - * matrix instead of assuming it. - * - * ### What it holds - * - * `billing_address.country`, trimmed, internal whitespace collapsed, and - * upper-cased — nothing else. It is what was TYPED, so it is still free - * text and still capable of holding `Deutschland`. Nothing matches against - * it: `territory` below classifies it, and an unrecognised spelling lands in - * a stated `other`. `countryCode` is deliberately not consulted; see the - * note in `account.hook.ts` for why the ISO slot is not the input. - * - * Derived, never authored: `account.hook.ts` recomputes it on every write - * that carries `billing_address`, and leaves it untouched otherwise. - */ - billing_country: Field4.text({ - label: "Billing Country", - description: "Derived from Billing Address \u2014 the country exactly as it was entered, trimmed and upper-cased. Territory is classified from it.", - readonly: true, - maxLength: 64, - group: "contact_info" - }), - /** - * Territory — the declared value the territory sharing rules filter on. - * - * ### Why a select and not the country - * - * Matching free-text `billing_country` against a list of country codes - * inside a CEL string means an account whose address reads `United States` - * belongs to NO territory, silently — the metadata says territory sharing - * works and for that account it does nothing, with no error anywhere. A - * `select` makes the domain knowable: three values, declared, every one - * reachable, and an account outside the staffed territories says `other` - * rather than nothing. - * - * It also collapses four copies of the country list (two CEL strings and - * six localised documentation tables) into one authored table in - * `./_territory.ts`. Adding a country is a line there; the sharing rules, - * this picklist and the docs all follow, and - * `test/territory-single-source.test.ts` fails if any of them does not. - * - * ### Readonly, and always stated - * - * Derived by `account_protection` from `billing_address.country`, never - * authored — correcting an account's territory means correcting its - * address, which keeps ONE fact behind the classification. Every insert - * states it (an account with no address at all is `other`), and an update - * that does not carry the address leaves it alone. - */ - territory: Field4.select({ - label: "Territory", - description: "Derived from Billing Address \u2014 the sales territory this account belongs to. Accounts outside the staffed territories are Other.", - readonly: true, - options: [...TERRITORY_OPTIONS], - group: "contact_info" - }), - // Office Location (new field type) - office_location: Field4.location({ - label: "Office Location", - group: "contact_info" - }), - // Relationship fields - /** - * The account hierarchy. `child_account_revenue` below is its one reader — - * the platform computes roll-up summaries itself, so the honest consumer is - * a single declaration rather than hand-written recompute hooks. - */ - parent_account: Field4.lookup("crm_account", { - label: "Parent Account", - description: "Parent company in hierarchy", - group: "ownership" - }), - // Boolean field - is_active: Field4.boolean({ - label: "Active", - defaultValue: true, - group: "ownership", - trackHistory: true - }), - /** - * Where this account stands in its sign-off (REQ-0003 step 5 / acceptance 4). - * - * `readonly`, so only the platform's own approval write reaches it: a - * user's insert or edit that names this column has it stripped (measured - * on 17.7.0 for `approved`, `pending` and `rejected` alike, #2067). - * - * ⛔ NOT a second boolean beside `is_active`, which REQ-0003 rules out by - * name. `is_active` answers "is this account live at all"; this answers - * "has the record been signed off", and collapsing them would make - * deactivating an account indistinguishable from rejecting one. - * - * ⚠️ Ships with NO default, and that is what keeps the gate armed (#2067). - * A new account is born blank, `account_approval` starts on the blank, and - * its approval node opens the request; the node's `approvalStatusField` - * mirror then writes `pending` (plugin-approvals `openNodeRequest`) before - * the create returns; only the create's own response body still shows the - * blank row it inserted. So with approvals in the composition REQ-0003 - * acceptance 4 holds in as many words ("A newly created account sits in a - * pending state, appears in the platform approval inbox …"), and `pending` - * always has a request behind it. Without approvals (a plan or edition - * that omits the capability) nothing opens a request, so nothing writes - * `pending`: the account stays blank and editable instead of reading - * "locked for approval" forever, which is what a shipped `pending` default - * did, since the console derives its lock from this column's value. - * - * ⛔ Do not restore `defaultValue: 'pending'`, nor an option-level - * `default: true` on Pending (the form would preselect it). An install - * that wants no account sign-off ADDS `defaultValue: 'approved'`; the - * flow's start condition is then false for every record and the gate is - * off, switchable and inert. That is the same kind of off switch - * `crm_lead.conversion_approval_status` records, and ⛔ NOT the flow's - * `status`, for the reasons measured in `lead-conversion-approval.flow.ts`. - * - * ⛔ There is deliberately no `not_required` value. Blank already says - * "no request has been opened", and `approved` already spells "nothing to - * decide". - */ - approval_status: Field4.select({ - label: "Approval Status", - group: "ownership", - readonly: true, - trackHistory: true, - options: [ - { label: "Pending", value: "pending", color: "#FFA500" }, - { label: "Approved", value: "approved", color: "#00AA00" }, - { label: "Rejected", value: "rejected", color: "#FF0000" } - ] - }), - // Brand color (new field type) - brand_color: Field4.color({ - label: "Brand Color", - group: "branding" - }), - // Company logo (uploaded image). `accept` / `maxSize` are server-enforced - // from @objectstack 17 — see the note on `crm_product.image`. - logo: Field4.image({ - label: "Company Logo", - group: "branding", - accept: ["image/png", "image/jpeg", "image/svg+xml", "image/webp"], - maxSize: 2 * 1024 * 1024 - }), - // Date field - // - // ⛔ NOT `readonly`, and it must not become readonly. This is the signal - // `at_risk_accounts` and `customer_churn_signals` are built on, and it is - // written by ONE path: another object's hook calling - // `api.object('crm_account').update({ last_activity_date }, …)`. - // - // ⚠️ Platform constraint: `stripReadonlyFields` deletes a readonly key from - // any payload whose CALLER supplied it, for every context that is not - // `isSystem` — and a hook's `ctx.api` is a `ScopedContext` over the ACTING - // USER's execution context, not a system one. So a readonly field a hook - // writes is silently dropped: the engine logs `Field '…' is read-only — - // ignoring incoming change` and the column stays null forever. - // - // ⛔ `crm_campaign_member.added_date` was cited here as a twin and is NOT - // one — it was ruled `readonly: true` in #1667 precisely because its - // writers are INSERTs, which the strip never reaches. THIS field is an - // UPDATE through a hook's `ctx.api`, which is the one shape that cannot be - // `readonly`. Note the rule - // is about the CONTEXT, not about hooks or flows as such — a hook stamping - // its own `ctx.input.data` survives, and a flow survives when its `runAs` - // is `'system'` (measured: `test/readonly-write-semantics.test.ts`, #1429; - // `crm_case.is_sla_violated` is cited elsewhere as a twin of this field - // and is NOT one — its writer is a system flow). This field stays out of - // every form section instead, which is the protection that actually - // holds. `test/activity-recency.test.ts` proves - // the write lands — and fails if the flag comes back. - last_activity_date: Field4.date({ - label: "Last Activity Date", - group: "system" - }), - // ─── Customer Success / Account Health ──────────────────────────── - tier: Field4.select({ - label: "Customer Tier", - group: "ownership", - options: [ - { label: "Strategic", value: "strategic", color: "#7C3AED" }, - { label: "Enterprise", value: "enterprise", color: "#4169E1" }, - { label: "Mid-Market", value: "mid_market", color: "#00AA00" }, - { label: "SMB", value: "smb", color: "#FFA500", default: true } - ] - }), - segment: Field4.select({ - label: "Segment", - group: "ownership", - options: [ - { label: "Net New", value: "net_new" }, - { label: "Growth", value: "growth" }, - { label: "At Risk", value: "at_risk" }, - { label: "Stable", value: "stable" } - ] - }), - health_score: Field4.select({ - label: "Health Score", - group: "ownership", - description: "CSM-maintained health indicator", - options: [ - { label: "Healthy", value: "healthy", color: "#00AA00" }, - { label: "Watching", value: "watching", color: "#FFA500" }, - { label: "At Risk", value: "at_risk", color: "#FF4500" }, - { label: "Churning", value: "churning", color: "#FF0000" } - ] - }) - // ⛔ No account-level renewal model here, on purpose. Renewal is a - // CONTRACT-level process with exactly one home — `crm_contract.end_date` + - // `renewal_notice_days`, swept daily by `src/revenue/flows/contract-renewal.flow.ts`, - // which books the task and notifies the CONTRACT owner; the user-facing - // queue is that object's `renewal_calendar` view. A `renewal_owner` / - // `next_renewal_date` pair here would be declared and inert, telling an - // admin a renewal reaches the CSM they named when nothing would. If an - // account-level renewal owner is ever wanted, it is a change to that flow - // plus a real writer for the date — not a second pair of fields. - }, - // Database indexes for performance - // - // ⚠️ No `{ fields: ['name'], unique: true }` here. Account-name uniqueness is - // declared on the `name` field itself, which the framework builds as the - // tenant composite `(organization_id, name)`. Declaring the single-column - // index too makes the platform-wide constraint win and leaves the per-tenant - // one unreachable (framework#3991 `unique/double-declaration`) — the same - // trap `crm_contact`, `crm_lead` and `crm_product` document. Two - // organizations must be able to each have their own "Acme Corp". - indexes: [ - { fields: ["owner_id"] }, - { fields: ["type", "is_active"] }, - // The territory sharing rules filter on this column, so it is read on every - // account query a territory recipient makes. `billing_country` carries no - // index of its own: nothing filters on it — it is displayed, and classified - // into this column by the hook. - { fields: ["territory"] }, - // Lead conversion filters on this column on every conversion — the column - // exists to replace an unindexed `$regex` scan. Plain index, NOT - // `unique: true`, deliberately: - // - // 1. Per-tenant uniqueness of account names is already declared on the - // `name` field. A unique `name_normalized` would SUBSUME it (equal names - // normalize equally) and force that constraint to be re-decided. - // 2. This column is a MATCH key, not a policy. Rejecting a near-duplicate - // name outright is a separate data-quality decision, and this repo has - // already chosen the soft shape for that question once (the hard unique - // on `crm_lead.email` was removed because refusing a repeat enquiry is - // worse than recording it). - // 3. ⚠️ Measured hazard: `create_index` FAILS on any deployment already - // holding `Acme Corp` and `ACME Corp` separately, so a unique index - // could not be an upgrade step without a merge pass first. That hazard - // is bounded today ONLY because this repo's deployment shape is fresh - // installs — see docs/MAINTENANCE.md §3.3. The conclusion is conditional - // on that premise, not universal. - // - // Consequence, recorded rather than hidden: two accounts CAN still hold the - // same normalized name if something outside the flow creates them, and - // `get_record` has no `sort` option, so the conversion would reuse an - // arbitrary one. Reusing one of N is still better than creating the N+1th. - { fields: ["name_normalized"] }, - // `searchableFields` carries `registration_number`, and the note at the top - // of this file records why those must be real, indexed columns. - { fields: ["registration_number"] } - ], - // API surface + capabilities. `files` and `feeds` are live and enforced (see - // the canonical note in `src/sales/objects/index.ts`). Field history lives on - // individual `Field.trackHistory` (ADR-0052); global search uses - // `searchableFields` / per-field `searchable`. - enable: { - apiEnabled: true, - // Expose via REST/GraphQL - apiMethods: ["get", "list", "create", "update", "delete"], - // Whitelist allowed API operations - // Contracts, org charts and RFPs live on the account record. Opt-in (spec - // default false); attach/download/delete authority is the parent record's - // own, so this adds a surface, not a grant. - files: true - } - // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were - // removed from the platform. Field updates live in this object's `*.hook.ts`; - // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. -}); - -// src/sales/objects/contact.object.ts -import { ObjectSchema as ObjectSchema5, Field as Field5 } from "@objectstack/spec/data"; -import { F as F4 } from "@objectstack/spec"; -var Contact = ObjectSchema5.create({ - name: "crm_contact", - label: "Contact", - pluralLabel: "Contacts", - icon: "user", - description: "People associated with accounts", - // ADR-0090 D1/D7: OWD is an authored decision. Master-detail child of crm_account — inherits the account's sharing. - sharingModel: "controlled_by_parent", - fieldGroups: [ - { key: "identity", label: "Identity", icon: "user" }, - { key: "account_info", label: "Account & Title", icon: "briefcase" }, - { key: "buying_centre", label: "Buying Centre", icon: "users" }, - { key: "contact_info", label: "Contact Information", icon: "phone" }, - { key: "mailing_address", label: "Mailing Address", icon: "map-pin", collapse: "collapsed" }, - { key: "additional", label: "Additional Info", icon: "info", collapse: "collapsed" }, - { key: "preferences", label: "Communication Preferences", icon: "bell-off", collapse: "collapsed" } - ], - fields: { - // Platform ownership anchor — canonical note in `account.object.ts` (#548). - owner_id: Field5.lookup("sys_user", { - label: "Contact Owner", - group: "account_info", - system: true, - readonly: false, - trackHistory: true - }), - // Name fields - salutation: Field5.select({ - label: "Salutation", - group: "identity", - // Canonical set shared with Lead (#490) — see _picklists.ts. - options: [...SALUTATION_OPTIONS] - }), - first_name: Field5.text({ - label: "First Name", - required: true, - storage: { notNull: true }, - searchable: true, - group: "identity" - }), - last_name: Field5.text({ - label: "Last Name", - required: true, - storage: { notNull: true }, - searchable: true, - group: "identity" - }), - // Formula field - Full name - // `salutation` is a picklist, so the formula sees the raw VALUE (`ms`, `dr`), - // not the label — names rendered as "ms Emily Davis" in lists and details - // (#461). The formula language has no proper-case or option-label lookup, and - // hardcoding "Ms." would defeat translation, so the name is built from the - // name fields alone; salutation stays its own (translated) field. - full_name: Field5.formula({ - label: "Full Name", - expression: F4`joinNonEmpty([record.first_name, record.last_name], ' ')`, - group: "identity" - }), - // Avatar field. `accept` / `maxSize` are server-enforced from - // @objectstack 17 — see the note on `crm_product.image`. - avatar: Field5.avatar({ - label: "Profile Picture", - group: "identity", - accept: ["image/png", "image/jpeg", "image/webp"], - maxSize: 2 * 1024 * 1024 - }), - // Relationship: Link to Account (Master-Detail) - crm_account: Field5.masterDetail("crm_account", { - label: "Account", - required: true, - storage: { notNull: true }, - deleteBehavior: "cascade", - // Delete contacts when account is deleted - group: "account_info" - }), - // Professional Information - title: Field5.text({ - label: "Job Title", - group: "account_info" - }), - department: Field5.select({ - label: "Department", - group: "account_info", - options: [ - { label: "Executive", value: "executive" }, - { label: "Sales", value: "sales" }, - { label: "Marketing", value: "marketing" }, - { label: "Engineering", value: "engineering" }, - { label: "Support", value: "support" }, - { label: "Finance", value: "finance" }, - { label: "Human Resources", value: "hr" }, - { label: "Operations", value: "operations" } - ] - }), - // ── Buying centre (REQ-0004) ───────────────────────────────────────── - // - // The three attributes that turn an account's contact list from a - // DIRECTORY into a MAP: what this person does in the purchase decision, - // where they stand on us, and how strong our relationship with them is. - // `title` above is the employer's job title and `is_primary` below is a - // one-bit answer to "who do we call" — neither of them is this fact. - // - // ⛔ Read by people and by reporting, never by a gate. No hook, no flow - // and no validation is authored against any of the three, none is - // `required`, and none carries an option `default`: a contact with all - // three blank saves exactly as it did before this group existed - // (REQ-0004 acceptance 4). They are sales intelligence, and AGENTS.md - // metadata semantics rule 8 is what keeps a machine signal from refusing - // a write. - // ⚠️ `buying_function`, not `buying_role` — and 'Buying Function', not - // 'Buying Role'. `security-role-word` (an author-time rule, ADR-0090 D3) - // refuses the word `role` on BOTH, measured on this branch as two - // successive `pnpm validate` exit-1 runs: first the field name, then the - // label, because "admins must meet ONE vocabulary" and `role` is the - // platform's security vocabulary (permission_set / position / - // business_unit). Its own remedy prescribes the replacement used here — - // "a domain word (e.g. 'function', 'duty')". - // - // The rule's surface is the ENGLISH one it can read: it matches - // `/\brole(s)?\b/i` over object/field/action/permission-set/position/app - // declarations and does not reach the locale packs. So the three - // non-English packs keep the natural business term for this concept in - // their own language (zh-CN 采购角色, es-ES Rol de Compra, ja-JP 購買役割) - // — same fact, each written the way its reader says it. - buying_function: Field5.select({ - label: "Buying Function", - group: "buying_centre", - // SINGLE-valued, and REQ-0004 left that call to the implementing PR. - // `multiple: true` would cost the field the property acceptance 2 asks - // for: `GroupingConfigSchema` (`@objectstack/spec/ui`, the installed - // pin) answers a grouped list with ONE server-side aggregate query, and - // its `GroupingFieldSchema.field` says the group header "carries its - // raw stored value" — so a multi-valued column groups by the - // COMBINATION. `decision_maker` + `user` would become a group of its - // own instead of feeding both, which is the opposite of reading an - // account as a map. A person who is genuinely two things is recorded as - // the role that governs THIS decision; the second one is already - // legible from `title` / `department`. - // - // The six are the generic buying-centre slots every industry reads the - // same way — ⛔ deliberately not one company's role model. - options: [ - { label: "Decision Maker", value: "decision_maker" }, - { label: "Economic Buyer", value: "economic_buyer" }, - { label: "Technical Evaluator", value: "technical_evaluator" }, - { label: "User", value: "user" }, - { label: "Influencer", value: "influencer" }, - { label: "Gatekeeper", value: "gatekeeper" } - ] - }), - attitude: Field5.select({ - label: "Attitude to Us", - group: "buying_centre", - // ORDERED, most to least favourable — declaration order IS the order a - // picklist and a grouped list present, so the ladder is authored rather - // than described. A blank means nobody has formed a view yet, which is - // a different fact from `neutral`. - options: [ - { label: "Champion", value: "champion" }, - { label: "Supportive", value: "supportive" }, - { label: "Neutral", value: "neutral" }, - { label: "Skeptical", value: "skeptical" }, - { label: "Blocker", value: "blocker" } - ] - }), - relationship_strength: Field5.select({ - label: "Relationship Strength", - group: "buying_centre", - // ORDERED, weakest to strongest. ⛔ Not a free-text score, and ⛔ not - // derived from `last_contacted_date` below: recency is machine-written - // and measures something else — a weekly call with someone who will not - // take our side is not a strong relationship. A blank means unassessed; - // `distant` is an assessment that came back weak. - options: [ - { label: "Distant", value: "distant" }, - { label: "Acquaintance", value: "acquaintance" }, - { label: "Working Relationship", value: "working" }, - { label: "Strong", value: "strong" }, - { label: "Trusted Advisor", value: "trusted_advisor" } - ] - }), - // No `reports_to`. The org chart was declared and never built: no page - // rendered the tree the contact docs promised, no skill read the chain when - // summarising an account, and no flow escalated along it. Sharing derives - // from the master `crm_account`, never from this lookup. - // Contact Information - email: Field5.email({ - label: "Email", - required: true, - storage: { notNull: true }, - unique: true, - group: "contact_info" - }), - phone: Field5.text({ - label: "Phone", - format: "phone", - group: "contact_info" - }), - mobile: Field5.text({ - label: "Mobile", - format: "phone", - group: "contact_info" - }), - // Mailing Address — one structured `address` value, the same shape as - // `crm_account.billing_address` and `crm_lead.address`, because a postal - // address is one fact and AGENTS.md's field-type guidance names - // `Field.address()` for it (ruling on #1836; it replaced five flat - // `mailing_*` text fields, converted by `scripts/backfill-contact-mailing-address.ts`). - mailing_address: Field5.address({ - label: "Mailing Address", - group: "mailing_address" - }), - // Additional Information - // - // No `birthdate`. Nothing greeted, segmented or reported on it, and an - // importable date of birth with no consumer is personal data held for no - // stated purpose — the one field on this object where "declared but inert" - // also carries a data-protection cost. - lead_source: Field5.select({ - label: "Lead Source", - group: "additional", - // Canonical set shared with Lead + Opportunity (#490) — a converted - // lead's source must remain representable on the contact. - options: [...LEAD_SOURCE_OPTIONS] - }), - description: Field5.markdown({ - label: "Description", - group: "additional" - }), - // Flags - is_primary: Field5.boolean({ - label: "Primary Contact", - defaultValue: false, - description: "Is this the main contact for the account?", - group: "preferences" - }), - do_not_call: Field5.boolean({ - label: "Do Not Call", - defaultValue: false, - group: "preferences" - }), - email_opt_out: Field5.boolean({ - label: "Email Opt Out", - defaultValue: false, - group: "preferences" - }), - // Interaction recency for the PERSON (#592). `crm_account` carries - // `last_activity_date` for the company and `crm_lead` carries - // `last_contacted_date` for a prospect; the contact — the record a rep - // actually calls and emails — had neither, so "when did anyone last speak - // to our champion?" was unanswerable. - // - // Written by the activity bubble in `event.hook.ts` / `task.hook.ts` and by - // `send_email`. Deliberately NOT `readonly`: a readonly field is stripped - // from every non-system write whose caller supplied the key (#2948), which - // is exactly how the account and lead columns above ended up permanently - // null. It is kept off the form sections instead. - last_contacted_date: Field5.datetime({ - label: "Last Contacted", - group: "additional" - }) - }, - // Enable features - // API surface. History → Field.trackHistory (ADR-0052). - enable: { - apiEnabled: true, - // #602 — signed NDAs, business cards, meeting notes attach to the person. - // See the canonical capability note in `src/sales/objects/index.ts`. - files: true - }, - // Database indexes for performance - // - // NOTE: no `{ fields: ['email'], unique: true }` here. Email uniqueness is - // declared on the field itself (`unique: true`), which since framework #3696 - // materializes as the tenant composite `(organization_id, email)` — unique - // WITHIN an organization, which is what a multi-tenant CRM wants (two orgs - // may each know john@acme.com). A declared single-column index is taken - // verbatim, i.e. platform-wide, so declaring both left the global index - // enforcing the old behaviour and the per-tenant constraint unreachable - // (framework#3991 `unique/double-declaration`). - indexes: [ - { fields: ["crm_account"] }, - { fields: ["owner_id"] }, - { fields: ["last_name", "first_name"] } - ], - // Display configuration. ADR-0079 `nameField` names the real field holding - // the record title — here the `full_name` formula field defined above. - nameField: "full_name", - // Explicit search targets (ADR-0061). REQUIRED because nameField is a - // FORMULA (display_title/full_name): without this, $search auto-defaults to - // the formula field, which isn't a real column, so the lookup picker + global - // search silently return zero. These are real, indexed columns. - searchableFields: ["first_name", "last_name", "email"], - highlightFields: ["full_name", "email", "crm_account", "phone"] - // ⚠️ No standalone `type: 'unique'` validation exists on this platform - // (ADR-0032 validation union). Email uniqueness is enforced by the - // field-level `unique: true` above, scoped per organization. - // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were - // removed from the platform. Field updates live in this object's `*.hook.ts`; - // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. -}); - -// src/sales/objects/event.object.ts -import { P as P4 } from "@objectstack/spec"; -import { ObjectSchema as ObjectSchema6, Field as Field6 } from "@objectstack/spec/data"; -var Event = ObjectSchema6.create({ - name: "crm_event", - label: "Event", - pluralLabel: "Events", - icon: "calendar-days", - description: "Meetings, calls and other scheduled interactions with customers", - // ADR-0090 D1/D7: OWD is an authored decision. Mirrors `crm_task`: an event - // is a personal activity record, owned by the rep who ran it. - sharingModel: "private", - fieldGroups: [ - { key: "basic", label: "Event Information", icon: "info" }, - { key: "schedule", label: "Schedule", icon: "calendar" }, - { key: "related", label: "Related Records", icon: "link" }, - { key: "outcome", label: "Outcome", icon: "clipboard-check", collapse: "collapsed" } - ], - fields: { - // Platform ownership anchor — canonical note in `account.object.ts` (#548). - owner_id: Field6.lookup("sys_user", { - label: "Assigned To", - group: "basic", - system: true, - readonly: false, - trackHistory: true - }), - // ─── Event Information ──────────────────────────────────────────── - subject: Field6.text({ - group: "basic", - label: "Subject", - required: true, - storage: { notNull: true }, - searchable: true, - maxLength: 255 - }), - type: Field6.select({ - group: "basic", - label: "Event Type", - required: true, - storage: { notNull: true }, - // Field-level default, not just the option flag: the option `default` - // only preselects in some form surfaces, so a quick-create opened from a - // related list left this required field blank (same defect crm_task.status - // carries a note about). - defaultValue: "meeting", - options: [...EVENT_TYPE_OPTIONS] - }), - status: Field6.select({ - group: "basic", - label: "Status", - required: true, - storage: { notNull: true }, - trackHistory: true, - defaultValue: "planned", - options: [...EVENT_STATUS_OPTIONS] - }), - description: Field6.markdown({ - group: "basic", - label: "Description" - }), - // ─── Schedule ───────────────────────────────────────────────────── - start_datetime: Field6.datetime({ - group: "schedule", - label: "Start", - required: true, - storage: { notNull: true } - }), - end_datetime: Field6.datetime({ - group: "schedule", - label: "End" - }), - all_day: Field6.boolean({ - group: "schedule", - label: "All Day Event", - defaultValue: false - }), - // Derived in `event.hook.ts` from start/end. NOT `readonly`: the field is - // also what the activity actions supply directly when a rep logs a call - // that took 20 minutes, and a readonly field is stripped from any write - // whose CALLER supplied the key (#2948) — including an action body running - // under the rep's own context. Derivation inside this object's own - // before-hook is unaffected either way (the strip keys off the caller's - // payload, not the post-hook document), so leaving it writable costs - // nothing and keeps `log_call` honest. - duration_minutes: Field6.number({ - group: "schedule", - label: "Duration (minutes)", - min: 0, - scale: 0 - }), - location: Field6.text({ - group: "schedule", - label: "Location", - maxLength: 255, - description: "Room, address, or meeting link" - }), - // ─── Related Records (polymorphic, same shape as crm_task) ───────── - related_to_type: Field6.select({ - group: "related", - label: "Related To Type", - options: [...RELATED_TO_TYPE_OPTIONS] - }), - related_to_account: Field6.lookup("crm_account", { - group: "related", - label: "Related Account" - }), - related_to_contact: Field6.lookup("crm_contact", { - group: "related", - label: "Related Contact" - }), - related_to_opportunity: Field6.lookup("crm_opportunity", { - group: "related", - label: "Related Opportunity" - }), - related_to_lead: Field6.lookup("crm_lead", { - group: "related", - label: "Related Lead" - }), - related_to_case: Field6.lookup("crm_case", { - group: "related", - label: "Related Case" - }), - // ─── Outcome ────────────────────────────────────────────────────── - outcome_notes: Field6.markdown({ - group: "outcome", - label: "Outcome Notes", - description: "What was agreed, and what happens next" - }) - // No `is_past` / `is_upcoming` boolean. A write-time snapshot of "has this - // happened yet" is stale the moment the clock passes it, and the app has - // already been burnt by exactly that (`crm_task.is_overdue` — see the - // `overdue_tasks` view's label note). `status` is the authored, non-decaying - // signal, and the upcoming/past views filter on it and sort by - // `start_datetime` instead. - }, - // API surface. History → Field.trackHistory (ADR-0052). - enable: { - apiEnabled: true - }, - indexes: [ - { fields: ["start_datetime"] }, - { fields: ["owner_id"] }, - { fields: ["status"] }, - { fields: ["related_to_account"] }, - { fields: ["related_to_opportunity"] } - ], - // ADR-0079: `nameField` names the real field holding the record title. - nameField: "subject", - highlightFields: ["subject", "type", "status", "start_datetime", "owner_id"], - searchableFields: ["subject", "location"], - // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the - // rule returns a verdict even when the merged record has no such key. See - // AGENTS.md "Validation predicates must be TOTAL" and - // test/object-validation-predicates.test.ts, which fails the build otherwise. - validations: [ - { - name: "end_after_start", - type: "script", - severity: "error", - message: "The end time must be after the start time", - // BOTH guards, on both operands, because they answer different hazards - // (AGENTS.md "Validation predicates must be TOTAL"): - // · `has(...)` — absent key. On a driver that stores only the columns - // a row was written with, an absent `end_datetime` aborts the whole - // predicate under strict CEL, and from 17.0.0-rc.2 that abort REJECTS - // the save rather than skipping the rule (#4649). - // · `!= null` — present-but-null. `dyn < dyn` aborts too, and - // `has()` says nothing about it. - // An ordering comparison needs both; neither substitutes for the other. - condition: P4`has(record.start_datetime) && has(record.end_datetime) && record.start_datetime != null && record.end_datetime != null && !isBlank(record.end_datetime) && record.end_datetime < record.start_datetime` - }, - { - name: "related_to_required", - type: "script", - severity: "warning", - message: "At least one related record should be selected", - condition: P4`(!has(record.related_to_account) || isBlank(record.related_to_account)) && (!has(record.related_to_contact) || isBlank(record.related_to_contact)) && (!has(record.related_to_opportunity) || isBlank(record.related_to_opportunity)) && (!has(record.related_to_lead) || isBlank(record.related_to_lead)) && (!has(record.related_to_case) || isBlank(record.related_to_case))` - } - ] -}); - -// src/sales/objects/event_attendee.object.ts -import { expression } from "@objectstack/spec"; -import { ObjectSchema as ObjectSchema7, Field as Field7 } from "@objectstack/spec/data"; -var ATTENDEE_RESOLUTIONS = [ - { value: "contact", column: "crm_contact", label: "Contact", color: "#4169E1" }, - { value: "lead", column: "crm_lead", label: "Lead", color: "#FFA500" }, - { value: "user", column: "sys_user", label: "User", color: "#00AA00" }, - { value: "external", column: "external_name", label: "External", color: "#8A8A8A" } -]; -var DEFAULT_ATTENDEE_TYPE = "contact"; -var blank = (f) => `(!has(record.${f}) || isBlank(record.${f}))`; -var filled = (f) => `(has(record.${f}) && !isBlank(record.${f}))`; -var typeIs = (v) => `(has(record.attendee_type) && record.attendee_type == "${v}")`; -var typeIsNot = (v) => `(has(record.attendee_type) && record.attendee_type != "${v}")`; -var RESOLVES_CONDITION = ATTENDEE_RESOLUTIONS.map((r) => `(${typeIs(r.value)} && ${blank(r.column)})`).join(" || "); -var EXCLUSIVE_CONDITION = ATTENDEE_RESOLUTIONS.map((r) => `(${filled(r.column)} && ${typeIsNot(r.value)})`).join(" || "); -var partyFormHints = (column) => { - const resolution = ATTENDEE_RESOLUTIONS.find((r) => r.column === column); - if (!resolution) { - throw new Error(`No attendee resolution declares the column "${column}"`); - } - return { - requiredWhen: expression(typeIs(resolution.value), "cel") - }; -}; -var EventAttendee = ObjectSchema7.create({ - name: "crm_event_attendee", - label: "Event Attendee", - pluralLabel: "Event Attendees", - icon: "users", - description: "A person invited to or present at an event", - sharingModel: "controlled_by_parent", - // ADR-0079: junction rows have no derivable text title; point the canonical - // nameField at the stored autonumber explicitly (autonumber is not in the - // auto-derivation whitelist). - nameField: "attendee_number", - highlightFields: ["crm_event", "attendee_type", "response", "is_organizer"], - fieldGroups: [ - { key: "basic", label: "Attendee", icon: "user" }, - { key: "response", label: "Invitation", icon: "mail-check" } - ], - fields: { - attendee_number: Field7.autonumber({ - group: "basic", - label: "Attendee Number", - format: "EA-{00000}" - }), - // ⚠️ Deliberately left on the spec default, and NOT cascaded with the party - // lookups below. Because it is REQUIRED, the engine escalates the stored - // `set_null` to a refusal at delete time, with a message naming the real - // obstacle instead of an unrelated rule: "Cannot delete crm_event (...): 3 - // dependent crm_event_attendee record(s) reference it via crm_event - // (crm_event is required, so it cannot be cleared)." That is the correct - // answer on this side, for the same reason `crm_campaign_member.crm_campaign` - // keeps it: a meeting's attendee list is the meeting's historical record, - // not a per-person artefact. `test/event-attendee-cascade.test.ts` pins the - // resolved value so a copy-paste of the three cascades cannot reach here. - crm_event: Field7.lookup("crm_event", { - group: "basic", - label: "Event", - required: true, - storage: { notNull: true } - }), - // The discriminator says which of the four columns below is the live one. It - // is authored rather than derived so a query can filter "internal attendees - // only" without four OR'd null checks. The options are GENERATED from the - // resolution table rather than retyped — see the note at the top of this - // file for why the pairing is declared once. - attendee_type: Field7.select({ - group: "basic", - label: "Attendee Type", - required: true, - storage: { notNull: true }, - defaultValue: DEFAULT_ATTENDEE_TYPE, - options: ATTENDEE_RESOLUTIONS.map((r) => ({ - label: r.label, - value: r.value, - color: r.color, - ...r.value === DEFAULT_ATTENDEE_TYPE ? { default: true } : {} - })) - }), - // ⛔ `deleteBehavior: 'cascade'` on ALL THREE party lookups, not the default. - // - // ⚠️ Platform constraint: a lookup defaults to `set_null`, and the engine - // implements `set_null` by UPDATING the row that holds it. On a column a - // validation rule reads, that makes the referenced party permanently - // UNDELETABLE: clearing this column leaves the row the engine just edited in - // violation of `attendee_resolves` below, and the whole delete rolls back - // with an error naming an object the caller never addressed. The same - // construction bites `crm_campaign_member`. - // - // `external_name` is the fourth resolution, but it is blank on every row the - // product actually writes (`src/sales/actions/activity-actions.ts` logs attendees - // with a party reference and never an external name), so it rescues nothing. - // - // Cascade rather than `restrict`: an attendee row is a JUNCTION whose whole - // meaning is "this person was in this room". Once the person is gone the row - // denotes nothing, and the query it exists to serve ("meetings this person - // attended") has lost its subject. `restrict` would produce an accurate - // message but keep the person undeletable until someone deleted their - // attendance by hand, and undeletable PEOPLE is the impact being fixed. - // Cascade also leaves no reachable state in which a stored attendee row - // breaks its own object's rule. - crm_contact: Field7.lookup("crm_contact", { - group: "basic", - label: "Contact", - deleteBehavior: "cascade", - description: "Set when the attendee is an existing customer contact", - ...partyFormHints("crm_contact") - }), - crm_lead: Field7.lookup("crm_lead", { - group: "basic", - label: "Lead", - deleteBehavior: "cascade", - description: "Set when the attendee is still an unconverted lead", - ...partyFormHints("crm_lead") - }), - // `sys_user` gets the SAME answer as the two CRM parties, and it was worth a - // second look rather than a copy-paste: - // - // · Deleting a user is a real, reachable operation. Generic CRUD delete on - // the identity table is off (`sys_user` ships `apiMethods: ['get', - // 'list', 'update', 'bulk']`), but better-auth's own routes — - // `/api/v1/auth/delete-user`, which the platform's `sys_user` object - // surfaces as the "Delete My Account" record action, and - // `/api/v1/auth/admin/remove-user` — resolve `user` to `sys_user` and - // land on `dataEngine.delete(...)`, i.e. the SAME ObjectQL delete that - // runs the referential pass. So `set_null` here is not dormant: it breaks - // account erasure for any colleague who ever attended a meeting. - // · The app's shipped stance is already "a deleted user's references - // degrade". EVERY other `sys_user` lookup in HotCRM (every `owner_id`, - // plus `product_manager`) is `set_null` and NO validation rule reads any - // of them — the rule below is the only one in the app that reads a user - // reference at all, which is precisely why this is the only lookup where - // the default misbehaves. `restrict` here would make this junction the - // ONE app row able to veto a platform identity erasure — an app object - // holding a `protection: { lock: 'full' }`, better-auth-managed table - // hostage, surfacing as an opaque failure from an auth route. That is a - // layering inversion, not a fix. - // · The cost of cascade is bounded and is the right half to lose: the - // meeting itself (`crm_event` — subject, times, outcome notes) survives - // untouched; only the per-person row goes, and it goes because the - // person's identity record was erased. Deactivation, not deletion, is the - // ordinary offboarding path (the platform ships ban/unban), and it - // touches nothing here. - sys_user: Field7.lookup("sys_user", { - group: "basic", - label: "User", - deleteBehavior: "cascade", - description: "Set when the attendee is a colleague", - ...partyFormHints("sys_user") - }), - // Free text is the LAST resort, not the default: it exists only for the - // genuinely unmodelled guest (a prospect's lawyer who is in no CRM object). - // It is the resolution of ONE attendee type — `external` — and the rules - // below enforce that both ways: an `external` row must fill it, and no - // other type may. It is not a place to paste a list, and not a note field - // to hang off a Contact row. - external_name: Field7.text({ - group: "basic", - label: "External Attendee", - maxLength: 255, - description: "Name of an attendee who is in no CRM object \u2014 set when Attendee Type is External", - ...partyFormHints("external_name") - }), - response: Field7.select({ - group: "response", - label: "Response", - required: true, - storage: { notNull: true }, - trackHistory: true, - defaultValue: "no_response", - options: [...ATTENDEE_RESPONSE_OPTIONS] - }), - is_organizer: Field7.boolean({ - group: "response", - label: "Organizer", - defaultValue: false - }), - // ⛔ NOT `readonly` — but the cross-reference this note used to carry is - // retired, not merely reworded: `crm_campaign_member.added_date` was ruled - // `readonly: true` in #1667, so it is no longer a precedent for keeping an - // insert-stamped column open, and the reason it cited ("the engine strips a - // readonly key the CALLER supplied") does not reach an INSERT at all — the - // strip is an UPDATE-path rule (`test/readonly-write-semantics.test.ts`). - // What holds it open is now MEASURED (#1747, the per-writer census #1435 - // ran for the other three), not "nobody has ruled on it": this column has a - // user-context UPDATE writer, which none of the three columns #1666 / #1667 - // moved had. The census, in full: - // • the fifteen generated activity actions (5 `ACTIVITY_TARGETS` × 3 - // kinds, one shared body in `activity-actions.ts`) INSERT it, and an - // action body runs `isSystem` — exempt twice over; - // • the two `service.seed.ts` attendee seeds write it, and their - // `mode: 'upsert'` replay UPDATE is exempt too, because seed writes are - // `isSystem` (`flow-scheduled.test.ts` pins that via ownerless rows); - // • the record form — `event_attendee.view.ts` lists it in the - // `invitation` section, AUTHORED rather than synthesized, and the four - // profiles that name the object all grant `allowEdit`. A rep correcting - // Invited on a saved row is a non-`isSystem` UPDATE carrying a - // caller-supplied key: precisely what the strip deletes. The three - // flipped columns appear in NO form section anywhere in `src/*/views/`, - // `crm_opportunity`'s authored form included. - // ⭐ It is also not the same KIND of column. `added_date` / `approved_date` - // are stamped `{NOW()}` by the writer, so their value IS the write moment; - // `invited_date` records when the invitation went out, and the seed dates it - // 3-10 days before its own event, per row. A column whose value is not the - // write moment is one a person can be right about. ⛔ Do not flip it on the - // strength of the sibling ruling. - invited_date: Field7.datetime({ - group: "response", - label: "Invited" - }) - }, - indexes: [ - { fields: ["crm_event"] }, - { fields: ["crm_contact"] }, - { fields: ["sys_user"] } - ], - // ⚠️ Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so - // the rule returns a verdict even when the merged record has no such key. See - // AGENTS.md "Validation predicates must be TOTAL" and - // test/object-validation-predicates.test.ts, which fails the build otherwise. - // - // Both rules are GENERATED from `ATTENDEE_RESOLUTIONS` at the top of this - // file. ⚠️ `expression(..., 'cel')` is the same envelope the ``P`…` `` tag - // produces, but the tag JSON-quotes an interpolated string and so cannot - // splice a source fragment — which is why these use the function form. The - // pairing is declared once and read twice; see the note up there. - validations: [ - // The type's own column must be filled. - { - name: "attendee_resolves", - type: "script", - severity: "error", - message: "An attendee must fill the party its Attendee Type names \u2014 a Contact row needs a Contact, an External row needs an External Attendee name", - condition: expression(RESOLVES_CONDITION, "cel") - }, - // …and no other column may be filled. The separate rule is deliberate: one - // condition, one wording. Folding both into `attendee_resolves` would make - // its message a lie for half the rows it rejects, and "you filled the wrong - // column" is not the same instruction as "you filled nothing". - { - name: "attendee_type_exclusive", - type: "script", - severity: "error", - message: "An attendee names exactly one party \u2014 clear every party column its Attendee Type does not name", - condition: expression(EXCLUSIVE_CONDITION, "cel") - } - ] -}); - -// src/sales/objects/forecast.object.ts -import { ObjectSchema as ObjectSchema8, Field as Field8 } from "@objectstack/spec/data"; -import { F as F5, P as P5 } from "@objectstack/spec"; -var Forecast = ObjectSchema8.create({ - name: "crm_forecast", - label: "Forecast", - pluralLabel: "Forecasts", - icon: "trending-up", - description: "Periodic pipeline snapshot by owner used for revenue forecasting.", - // OWD is an authored decision (ADR-0090 D1/D7). Forecasts are personal to the - // owner. - sharingModel: "private", - // ADR-0079 record title. ⚠️ A formula cannot dot-walk a lookup (ADR-0072), so - // `display_title` composes local fields only: period_label + (period_start). - nameField: "display_title", - // ⚠️ Explicit search targets (ADR-0061), REQUIRED because `nameField` is a - // FORMULA: without this, `$search` auto-defaults to the formula field, which - // is not a real column, so the lookup picker and global search silently - // return zero. These are real, indexed columns. - searchableFields: ["period_label"], - highlightFields: ["owner_id", "period", "period_start", "commit_amount", "closed_amount"], - fieldGroups: [ - { key: "basic", label: "Snapshot", icon: "info" }, - { key: "amounts", label: "Amounts", icon: "dollar-sign" }, - { key: "meta", label: "Source", icon: "database", collapse: "collapsed" } - ], - fields: { - // Platform ownership anchor — canonical note in `account.object.ts` (#548). - owner_id: Field8.lookup("sys_user", { - label: "Owner", - group: "basic", - system: true, - readonly: false, - trackHistory: true - }), - period: Field8.select({ - label: "Period", - required: true, - storage: { notNull: true }, - group: "basic", - options: [ - { label: "Month", value: "month", default: true }, - { label: "Quarter", value: "quarter" } - ] - }), - // Wording mirrors the two refusal messages this field is bound by - // (`period_start_first_of_period` / `quarter_starts_on_quarter_boundary`, - // both below) so the form and the rejection agree on the same rule - // instead of describing two different ones (#1085). - period_start: Field8.date({ - label: "Period Start", - description: "Must be the first day of the period \u2014 e.g. 2026-08-01 for Aug 2026. A quarterly forecast must additionally start on a quarter boundary: January 1, April 1, July 1 or October 1.", - required: true, - storage: { notNull: true }, - group: "basic" - }), - // Still not read-only: `forecast.hook.ts` fills it only when the write - // leaves it unset, and `src/sales/data/forecast.seed.ts` hand-fills it on every - // seeded row — so hand-entry is a capability this app uses. A hand-filled - // value is pinned to the same calendar period `period_start` is - // (`period_end_matches_calendar_period` below), and the description states - // that rule rather than the weaker `period_end_after_start` it subsumes: - // the form says what is actually enforced. - period_end: Field8.date({ - label: "Period End", - description: "Normally derived automatically from Period and Period Start. If set by hand, it must be the last day of that period \u2014 e.g. 2026-09-30 for a quarter starting 2026-07-01, or 2026-08-31 for Aug 2026.", - required: true, - storage: { notNull: true }, - group: "basic" - }), - period_label: Field8.text({ - label: "Period Label", - description: 'Human-friendly label, e.g. "Q3 2026" or "Aug 2026".', - group: "basic" - }), - // ADR-0079 record title. ⚠️ A formula cannot dot-walk a lookup (ADR-0072), - // so this composes local fields only; `period_start` (a date) is - // string()-coerced for concat. - // - // ⚠️ The coercion is `string()`, NOT `text()`. `text` is not a registered - // CEL function — it is absent from `CEL_STDLIB_FUNCTIONS` — so a formula - // using it faults at runtime and leaves the record's `nameField` null. The - // author-time `expression-invalid` rule now REPORTS it ("found no matching - // overload for 'text(dyn)'") instead of letting a broken formula through to - // null silently. `string` is the catalog's coercion, alongside - // `int`/`bool`/`double`/`timestamp`. - display_title: Field8.formula({ - label: "Display Title", - expression: F5`record.period_label + " (" + string(record.period_start) + ")"`, - group: "basic" - }), - snapshot_date: Field8.date({ - label: "Snapshot Date", - description: "The day this snapshot was captured.", - required: true, - storage: { notNull: true }, - group: "meta" - }), - quota: Field8.currency({ - label: "Quota", - min: 0, - group: "amounts", - trackHistory: true - }), - pipeline_amount: Field8.currency({ - label: "Pipeline", - description: "Sum of all open opportunities closing in this period (any stage).", - min: 0, - group: "amounts" - }), - best_case_amount: Field8.currency({ - label: "Best Case", - description: "Open opportunities in the Best Case or Commit forecast category.", - min: 0, - group: "amounts" - }), - commit_amount: Field8.currency({ - label: "Commit", - description: "Open opportunities in the Commit forecast category (owner-committed).", - min: 0, - group: "amounts" - }), - closed_amount: Field8.currency({ - label: "Closed Won", - description: "Already-closed-won amount in this period.", - min: 0, - group: "amounts" - }), - expected_amount: Field8.formula({ - label: "Expected", - description: "Closed Won + Commit \u2014 what the owner reasonably expects to land.", - expression: F5`coalesce(record.closed_amount, 0) + coalesce(record.commit_amount, 0)`, - scale: 2, - group: "amounts" - }), - attainment_pct: Field8.formula({ - label: "Attainment %", - description: "Closed Won \xF7 Quota \xD7 100. Reads 0% until a positive quota is set.", - expression: F5`coalesce(record.quota, 0) > 0 ? (coalesce(record.closed_amount, 0) * 100.0) / record.quota : 0.0`, - scale: 2, - group: "amounts" - }), - coverage_ratio: Field8.formula({ - label: "Coverage Ratio", - description: "Pipeline \xF7 (Quota \u2212 Closed Won) \u2014 whether enough pipeline remains to cover the gap. Reads 0 once the quota is already met.", - expression: F5`(coalesce(record.quota, 0) - coalesce(record.closed_amount, 0)) > 0 ? coalesce(record.pipeline_amount, 0) / (record.quota - coalesce(record.closed_amount, 0)) : 0.0`, - scale: 2, - group: "amounts" - }), - source: Field8.select({ - label: "Source", - group: "meta", - options: [ - { label: "Scheduled snapshot", value: "scheduled", default: true }, - { label: "AI skill", value: "ai" }, - { label: "Manual entry", value: "manual" } - ] - }), - notes: Field8.text({ - label: "Notes", - maxLength: 1e3, - group: "meta" - }), - // Fixture identity — the seed loader's `externalId`, and nothing else. - // - // `crm_forecast` is a PER-OWNER snapshot: its real identity is - // (owner_id, period, period_start), and every other column is a rendering of - // part of that. `period_label` in particular names a SET of rows once the - // `forecast_snapshot` sweep writes one row per active owner per quarter — - // they all read 'Q3 2026' — so upserting on that label lets a re-seed match, - // and overwrite, a real rep's snapshot. - // - // ⚠️ The true composite `externalId: ['owner_id', 'period', 'period_start']` - // is not available here: a seed cannot name a user (see the note in - // `objectstack.composition.ts`, "A seed can't name a user"), so `owner_id` - // is null on every seeded row, and - // the loader's `externalIdKey` returns "" as soon as any part is empty. An - // empty key never matches, so upsert degrades to insert-on-every-replay. - // Dropping `owner_id` does not rescue it: a runtime row for the current - // quarter carries exactly the same (period, period_start). - // - // ⚠️ `mode: 'insert'` does NOT mean "insert once" — the loader inserts - // unconditionally on every replay boot (framework#3434). `'ignore'` is the - // real insert-once mode, but it decides "already there?" from the same - // `externalId`, so on a broken key it would SKIP the demo row because a real - // rep's row already claimed 'Q3 2026'. Fixing the identity is a prerequisite - // either way. Hence this synthetic, seeder-only key. - // - // ⚠️ `readonly` is the load-bearing part, not decoration: seed writes run - // `{ isSystem: true }` and bypass readonly stripping, while readonly - // stripping does guard user/API writes — so a genuine forecast row can never - // acquire a `seed_key` and can never be matched by a re-seed. That is what - // makes the fix structural rather than a naming convention. `hidden` keeps a - // fixtures-only column out of forms and pickers. - seed_key: Field8.text({ - label: "Seed Key", - description: "Demo-fixture identity. Written only by the seed loader; empty on every real snapshot.", - maxLength: 64, - readonly: true, - hidden: true, - group: "meta" - }) - }, - indexes: [ - { fields: ["owner_id", "period_start", "period"] }, - { fields: ["snapshot_date"] }, - { fields: ["period_start"] } - ], - // API surface. History → Field.trackHistory (ADR-0052). - enable: { - apiEnabled: true, - apiMethods: ["get", "list", "create", "update", "delete"] - }, - // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the - // rule returns a verdict even when the merged record has no such key. See - // AGENTS.md "Validation predicates must be TOTAL" and - // test/object-validation-predicates.test.ts, which fails the build otherwise. - validations: [ - { - name: "period_end_after_start", - type: "script", - severity: "error", - message: "Period End must be after Period Start.", - // `<=`, not `<`: the rule name says "after" and a forecast period is a - // month or a quarter, never a single instant, so `period_end == - // period_start` is a zero-length period rather than a valid one. Same - // operator and wording as the `end_after_start` twins on - // campaign/contract. - condition: P5`has(record.period_end) && record.period_end != null && has(record.period_start) && record.period_start != null && record.period_end <= record.period_start` - }, - // A hand-filled `period_start` must be the first day of the calendar period - // it labels. Maintainer ruling 2026-08-11: 「接受你的全部建议」 — refuse - // rather than accept or snap. - // - // The hook derives `period_end` as "start + one period" — a ROLLING window. - // That is calendar-true for a start on a boundary and drifts for anything - // else: `period: 'quarter'` + `period_start: 2026-08-15` derives - // `period_end: 2026-10-31` under `period_label: 'Q3 2026'`, a window - // labelled Q3 that reaches a month into Q4. The row is internally - // inconsistent in a way no consumer can detect: every "this quarter" - // equals-filter reads `period_start`, and the nightly sweep selects the - // current row by `period_start <= today <= period_end`. - // - // These rules are the ONE enforcement point — deliberately not a throw in - // `forecast.hook.ts` as well. ⚠️ A declared rule is the shape the platform - // can act on: it refuses the write with a `ValidationError` / - // `VALIDATION_FAILED` envelope (HTTP 400) on the record form, on the API and - // on a seed's system write alike, where a hook throw is a bare `Error`. The - // derivation is left alone: with the start pinned to a boundary, "start + - // one period" IS the calendar period. - // - // ⚠️ WHY A REGEX AND NOT DATE ARITHMETIC: the CEL stdlib this app compiles - // against (`CEL_STDLIB_FUNCTIONS`) has no month/day accessor — the date - // functions are `today`/`daysBetween`/`addDays`/`addMonths`/`date` — so "the - // 1st of its month" is not expressible as arithmetic. Both drivers this app - // can run on hand `period_start` back as a `YYYY-MM-DD` string, and an ISO - // *datetime* string still matches these prefix-anchored patterns. A caller - // that writes a JS `Date` object is the one shape `string()` has no overload - // for; the engine then rejects that write naming the rule rather than - // admitting it, and no writer in this app does that. - { - name: "period_start_first_of_period", - type: "script", - severity: "error", - message: "Period Start must be the first day of the period \u2014 e.g. 2026-08-01 for Aug 2026.", - condition: P5`has(record.period_start) && record.period_start != null && !matches(string(record.period_start), "^[0-9]{4}-[0-9]{2}-01")` - }, - { - name: "quarter_starts_on_quarter_boundary", - type: "script", - severity: "error", - // The month rule above already rejects any non-1st day, so this one only - // ever adds the quarter-month half: 2026-08-01 is a valid month start and - // not a valid quarter start. - message: "A quarterly forecast must start on a quarter boundary \u2014 January 1, April 1, July 1 or October 1.", - condition: P5`has(record.period) && record.period == "quarter" && has(record.period_start) && record.period_start != null && !matches(string(record.period_start), "^[0-9]{4}-(01|04|07|10)-01")` - }, - // …and the OTHER end of the same window. The two rules above pin the START; - // `period_end` stays reachable, because the hook derives it only when the - // write leaves it unset and the field sits editable on the record form. - // Without this rule, `period: 'quarter'` + `period_start: 2026-07-01` (a - // boundary the rules above admit) + a hand-typed `period_end: 2027-05-15` is - // ADMITTED under `period_label: 'Q3 2026'` — a ten-month window labelled as - // one quarter, reached through the other field. - // - // WHY A RULE AND NOT A READ-ONLY FIELD: deriving `period_end` always and - // locking the form breaks the demo seed — - // `src/sales/data/forecast.seed.ts` hand-fills it on every seeded row. - // Hand-entry stays; it is now bounded. - // - // ⚠️ WHY `type: 'script'` AND NOT A FIELD CONSTRAINT: a field bound judges - // only the value being written, so a row already stored wrong keeps - // accepting edits forever; a script validation is evaluated against the - // MERGED record on every write and is therefore a true invariant. - // `test/forecast-period-end-boundary.test.ts` pins both halves — a legacy - // row is refused on its next unrelated edit, and the repair is admitted. - // - // WHY DATE ARITHMETIC HERE WHEN THE TWO RULES ABOVE USE A REGEX: not taste. - // Those rules inspect ONE date's components ("is this the 1st of its - // month?"), and the CEL stdlib has no month/day accessor. This rule compares - // TWO dates, which `addMonths`/`addDays`/`daysBetween` express directly. - // - // The predicate says "one period long", and that is the same claim as "ends - // on the calendar boundary" ONLY because the two rules above pin the start - // to one. That coupling is deliberate: the three are one set enforcing one - // invariant (a row's window is exactly the calendar period it is labelled - // with), not three independent gates. - // - // ⚠️ `daysBetween(a, b) != 0` rather than `a == b`: both drivers this app - // runs on hand dates back as `YYYY-MM-DD` strings while `addDays` returns a - // timestamp, and a string never `==` a timestamp — the rule would be - // permanently green. `daysBetween` puts both sides through the same - // `toDate`, so the string, an ISO datetime spelling and a JS `Date` all - // compare alike. - // - // ⚠️ The `!= null` guards are load-bearing for a THIRD hazard beyond the two - // AGENTS.md names: `daysBetween(null, …)` reaches `BigInt(NaN)` and THROWS, - // which the engine reports as `predicate failed to evaluate` — a rule that - // cannot answer, i.e. a rejected ordinary save. This predicate has no - // ordering operator, so `object-validation-predicates.test.ts`'s - // unguarded-comparison sweep does not cover it; the pin lives in - // `test/forecast-period-end-boundary.test.ts` instead. - { - name: "period_end_matches_calendar_period", - type: "script", - severity: "error", - message: "Period End must be the last day of the period \u2014 e.g. 2026-09-30 for a quarter starting 2026-07-01, or 2026-08-31 for Aug 2026.", - // Spelled out per period value instead of a ternary on the month count: - // an undeclared `period` is refused BY NAME by the picklist ("Period must - // be one of: month, quarter", measured), so this rule judges only the two - // values it understands and leaves the rest to the schema. - condition: P5`has(record.period) && record.period != null && has(record.period_start) && record.period_start != null && has(record.period_end) && record.period_end != null && ((record.period == "month" && daysBetween(record.period_end, addDays(addMonths(record.period_start, 1), -1)) != 0) || (record.period == "quarter" && daysBetween(record.period_end, addDays(addMonths(record.period_start, 3), -1)) != 0))` - }, - { - name: "snapshot_amounts_non_negative", - type: "script", - severity: "error", - message: "Snapshot amounts cannot be negative.", - condition: P5`(has(record.pipeline_amount) && record.pipeline_amount != null && record.pipeline_amount < 0) || (has(record.best_case_amount) && record.best_case_amount != null && record.best_case_amount < 0) || (has(record.commit_amount) && record.commit_amount != null && record.commit_amount < 0) || (has(record.closed_amount) && record.closed_amount != null && record.closed_amount < 0)` - } - ] -}); - -// src/sales/objects/lead.object.ts -import { ObjectSchema as ObjectSchema9, Field as Field9 } from "@objectstack/spec/data"; -import { F as F6, P as P6 } from "@objectstack/spec"; -var Lead = ObjectSchema9.create({ - name: "crm_lead", - label: "Lead", - pluralLabel: "Leads", - icon: "user-plus", - description: "Potential customers not yet qualified", - // ADR-0090 D1/D7: OWD is an authored decision. Owner-worked queue. - sharingModel: "private", - fieldGroups: [ - { key: "identity", label: "Identity", icon: "user-plus" }, - { key: "company_info", label: "Company Information", icon: "building" }, - { key: "contact_info", label: "Contact Information", icon: "phone" }, - { key: "qualification", label: "Qualification", icon: "star" }, - { key: "assignment", label: "Assignment", icon: "user" }, - { key: "address", label: "Address", icon: "map-pin", collapse: "collapsed" }, - { key: "additional", label: "Additional Info", icon: "info", collapse: "collapsed" }, - { key: "preferences", label: "Communication Preferences", icon: "bell-off", collapse: "collapsed" }, - { key: "conversion", label: "Conversion", icon: "check-circle", collapse: "collapsed" }, - { key: "duplicates", label: "Duplicate Management", icon: "copy", collapse: "collapsed" } - ], - fields: { - // Platform ownership anchor — canonical note in `account.object.ts` (#548). - owner_id: Field9.lookup("sys_user", { - label: "Lead Owner", - group: "assignment", - system: true, - readonly: false, - trackHistory: true - }), - // Personal Information - salutation: Field9.select({ - label: "Salutation", - group: "identity", - // Canonical set shared with Contact (#490) — see _picklists.ts. - options: [...SALUTATION_OPTIONS] - }), - first_name: Field9.text({ - label: "First Name", - required: true, - storage: { notNull: true }, - searchable: true, - group: "identity" - }), - last_name: Field9.text({ - label: "Last Name", - required: true, - storage: { notNull: true }, - searchable: true, - group: "identity" - }), - // ⚠️ `salutation` is a picklist, so a formula sees the raw VALUE (`ms`, - // `dr`), not the label — including it renders names as "ms Emily Davis" in - // lists and details. Dropped here and from `display_title` below, matching - // Contact. - full_name: Field9.formula({ - label: "Full Name", - expression: F6`joinNonEmpty([record.first_name, record.last_name], ' ')`, - group: "identity" - }), - // ADR-0079 record title (was titleFormat '{full_name} - {company}'). - // Composed from the same source fields as `full_name` (not formula-on-formula) - // plus `company`, so the title resolves from real stored values. - display_title: Field9.formula({ - label: "Display Title", - expression: F6`joinNonEmpty([record.first_name, record.last_name], ' ') + " - " + record.company`, - group: "identity" - }), - // Company Information - company: Field9.text({ - label: "Company", - required: true, - storage: { notNull: true }, - searchable: true, - group: "company_info" - }), - /** - * Case- and whitespace-folded copy of `company` — the value lead conversion - * compares against `crm_account.name_normalized`. - * - * ### Why the LEAD needs one too - * - * ⚠️ A normalized column on `crm_account` alone fixes nothing: the - * conversion flow would then compare a raw company string against a folded - * account name, and `"ACME Corp"` still would not match `acme corp`. Both - * sides have to be canonical, and the flow can canonicalize neither — - * `service-automation`'s `resolveToken` accepts exactly one function form - * (`NOW()` / `TODAY()`), so `{LOWER(x)}`, `{TRIM(x)}` and - * `{x.toLowerCase()}` all resolve to `undefined`. See the field comment on - * `crm_account.name_normalized` for the full measurement. - * - * `company` itself is NOT folded in place: it is the display value, it is - * copied verbatim onto the account the conversion creates, and lower-casing - * it would ship `acme corp` as a customer-visible account name. That is the - * one way this differs from `email`, which has no meaningful case and so is - * canonicalized in place. - * - * Derived, never authored: `lead_duplicate_check` recomputes it on every - * write that carries `company`. Not indexed — nothing filters on it; it is - * read off the lead record the flow already fetched. - */ - company_normalized: Field9.text({ - label: "Company (Normalized)", - description: "Match key for lead conversion: Company lower-cased, trimmed, with internal whitespace collapsed. Maintained by the lead_duplicate_check hook \u2014 never edit directly.", - readonly: true, - hidden: true, - maxLength: 255, - group: "company_info" - }), - title: Field9.text({ - label: "Job Title", - group: "company_info" - }), - industry: Field9.select({ - label: "Industry", - group: "company_info", - // Canonical set shared with Account (#490): lead_conversion copies this - // value onto the created Account, so both objects MUST agree. - options: [...INDUSTRY_OPTIONS] - }), - // ⚠️ NOT `unique`. A hard uniqueness constraint on a lead's email says a - // person may enquire once, ever, and the database enforces it by REJECTING - // the second enquiry — turning an ordinary follow-up into a 500 on the - // public form. Real funnels re-capture the same address routinely. - // Duplicates are a fact to be RECORDED, not an error: `lead_duplicate_check` - // in lead.hook.ts links the new lead to the record it repeats (see the - // `duplicates` field group below). The plain index below is what keeps the - // column indexed in the constraint's absence — the intake dedupe lookup, the - // `crm_lead_import` upsert key and the conversion flow all read leads by - // email on every write. - email: Field9.email({ - label: "Email", - required: true, - storage: { notNull: true }, - group: "contact_info" - }), - phone: Field9.text({ - label: "Phone", - format: "phone", - group: "contact_info" - }), - mobile: Field9.text({ - label: "Mobile", - format: "phone", - group: "contact_info" - }), - website: Field9.url({ - label: "Website", - group: "contact_info" - }), - // Lead Qualification - status: Field9.select({ - label: "Lead Status", - required: true, - storage: { notNull: true }, - group: "qualification", - trackHistory: true, - // Field-level default: option-level `default: true` only preselects in - // UI forms after first paint; the quick-create dialog and API inserts - // need a real defaultValue (see approval_status for the same lesson). - defaultValue: "new", - options: [ - { label: "New", value: "new", color: "#808080", default: true }, - { label: "Contacted", value: "contacted", color: "#FFA500" }, - { label: "Qualified", value: "qualified", color: "#4169E1" }, - { label: "Unqualified", value: "unqualified", color: "#FF0000" }, - { label: "Converted", value: "converted", color: "#00AA00" } - ] - }), - rating: Field9.rating(5, { - label: "Lead Score", - description: "Lead quality score (1-5 stars)", - group: "qualification" - }), - lead_source: Field9.select({ - label: "Lead Source", - group: "qualification", - // Canonical set shared with Contact + Opportunity (#490): lead_conversion - // copies this value onto the created Opportunity, so all three MUST agree. - options: [...LEAD_SOURCE_OPTIONS] - }), - // ── Demand: what this prospect wants, and what it is worth ───────── - // - // REQ-0005 steps 6-7. Both fields are in `qualification` because they ARE - // qualification data — what the buyer is asking for and how big it is are - // the two facts a rep weighs before working a lead — and neither is - // required: a lead captured off the public form has neither, and saves - // exactly as it did before. - need_type: Field9.select({ - label: "Need Type", - group: "qualification", - description: "What this prospect is asking for. Routing, prioritisation and demand reporting read this.", - // Generic starter vocabulary, declared once in `_picklists.ts` — see the - // note there for why it is NOT shared with `crm_opportunity.type`. - options: [...LEAD_NEED_TYPE_OPTIONS] - }), - // ⛔ NEVER conflated with `annual_revenue`, which sits two groups below in - // `additional` and answers a different question: that is the prospect - // COMPANY's own turnover, a size signal, and it is the value - // `lead_conversion` copies onto the account it creates. This is the value - // of the DEMAND — the number that becomes `crm_opportunity.amount` when the - // lead converts, and the only figure the pipeline has before then. - // - // ⛔ Nor is it a second copy of `crm_opportunity.amount`. The opportunity's - // amount is a committed deal figure a rep defends in a forecast; this is an - // estimate taken before qualification, and the conversion screen is where a - // human turns one into the other (it PREFILLS from here — see the - // `opportunityAmount` screen field in `lead-conversion.flow.ts` — rather - // than copying silently, so the rep confirms the number that enters the - // forecast). - estimated_amount: Field9.currency({ - label: "Estimated Amount", - group: "qualification", - description: "Estimated value of this demand, before qualification. Prefills the deal amount at conversion." - }), - // ── The conversion approval gate (REQ-0005 step 7) ───────────────── - // - // ⚠️ `defaultValue: 'not_required'` IS THE GATE'S OFF SWITCH, and it is the - // one line an install changes to arm it. REQ-0005: "The gate must be - // configurable — off by default. A single-seller install must not be forced - // through an approval to convert a lead." - // - // OFF (shipped) every lead is born `not_required`; nothing ever writes - // `pending`, so `lead_conversion_approval` never enters, - // the Convert button never hides and the write-path gate in - // `lead.hook.ts` never fires. Conversion behaves EXACTLY as - // it did before this field existed. - // ON change this one value to `'pending'`. Every lead is then - // born pending, `lead_conversion_approval` opens its - // request, and conversion is refused until an approver - // decides. - // - // Leads that predate the switch keep whatever they were born with, which is - // the point: arming the gate does not invalidate or re-open a single - // existing record (REQ-0005 acceptance 4). This is a TRANSITION GATE, not an - // invariant (AGENTS.md metadata semantics rule 7) — what is refused is the - // ACT of converting, evaluated against `previous` in `lead.hook.ts`, never - // the state of a record that is already converted. - // - // Shape copied from `crm_opportunity.approval_status`: `readonly: true` - // plus a REAL field-level `defaultValue`, ⛔ not only an option-level - // `default: true` — the same lesson `status` above records, and the reason - // that field's own comment gives: an option default only preselects in UI - // forms after first paint, so a quick-create dialog or an API insert would - // land a null and a null matches no flow entry condition. - // - // ⛔ Do NOT add an "approved" value to `status` instead. That select is the - // qualification lifecycle; a sixth value there would break the - // `convert_lead` predicate, the `lead_status_progression` transitions and - // the seeded rows, and would conflate "this lead is worth working" with - // "someone signed off on converting it". - conversion_approval_status: Field9.select({ - label: "Conversion Approval", - group: "qualification", - readonly: true, - trackHistory: true, - description: "Whether this lead has been signed off for conversion. Not Required means no approval is asked for \u2014 the shipped default.", - defaultValue: "not_required", - options: [ - { label: "Not Required", value: "not_required", default: true }, - { label: "Pending", value: "pending", color: "#FFA500" }, - { label: "Approved", value: "approved", color: "#00AA00" }, - { label: "Rejected", value: "rejected", color: "#FF0000" } - ] - }), - // Assignment - // Conversion tracking. - // ⛔ NOT `readonly`: the `lead_conversion` flow's `mark_converted` node - // UPDATEs this column and the four `converted_*` ones below, and that flow - // declares no `runAs` — so it runs at the engine default `'user'`, which is - // also where house rule 9 keeps a screen flow. `stripReadonlyFields` runs - // under `if (!opCtx.context?.isSystem)` and deletes every readonly key the - // CALLER supplied, so `readonly` here would silently un-convert every - // conversion. - // ⚠️ The other writer is unaffected, and is not the reason: the - // guest-submission sanitiser in `lead.hook.ts` ASSIGNS these on - // `beforeInsert`, and hook-written keys are not caller-supplied — nor does - // the strip run on INSERT at all. Measured in - // `test/readonly-write-semantics.test.ts`. - // ⇒ Declaring these `readonly` would need the flow's write ELEVATED, which - // is a privilege decision on the maintainer's floor, not this file's (#1435). - // Edit-protection is the `beforeUpdate` guard in `lead.hook.ts`, which - // rejects any USER edit to a converted lead outside a small allow-list — - // and it is the ONLY guard, deliberately: a script validation beside it - // never fires, because the hook's throw always wins the race. - is_converted: Field9.boolean({ - label: "Converted", - defaultValue: false, - group: "conversion", - trackHistory: true - }), - converted_account: Field9.lookup("crm_account", { - label: "Converted Account", - group: "conversion" - }), - converted_contact: Field9.lookup("crm_contact", { - label: "Converted Contact", - group: "conversion" - }), - converted_opportunity: Field9.lookup("crm_opportunity", { - label: "Converted Opportunity", - group: "conversion" - }), - converted_date: Field9.datetime({ - label: "Converted Date", - group: "conversion" - }), - // Address (using new address field type) - address: Field9.address({ - label: "Address", - group: "address" - }), - // Additional Info - annual_revenue: Field9.currency({ - label: "Annual Revenue", - group: "additional" - }), - number_of_employees: Field9.number({ - label: "Number of Employees", - group: "additional" - }), - description: Field9.markdown({ - label: "Description", - group: "additional" - }), - // Custom notes with rich text formatting - notes: Field9.richtext({ - label: "Notes", - description: "Working notes on this lead \u2014 supports formatting.", - group: "additional" - }), - // Flags - do_not_call: Field9.boolean({ - label: "Do Not Call", - defaultValue: false, - group: "preferences" - }), - email_opt_out: Field9.boolean({ - label: "Email Opt Out", - defaultValue: false, - group: "preferences" - }), - // Follow-up & disqualification tracking - next_followup_date: Field9.date({ - label: "Next Follow-up Date", - group: "qualification" - }), - // NOT `readonly` (#592) — see the long note on - // `crm_account.last_activity_date`. The activity bubble writes this from - // another object's hook, and a readonly field is stripped from any - // non-system write whose caller supplied the key (#2948), so every bubble - // into this column was silently discarded. - last_contacted_date: Field9.datetime({ - label: "Last Contacted", - group: "qualification" - }), - disqualification_reason: Field9.select({ - label: "Disqualification Reason", - group: "qualification", - description: "Required when status is Unqualified", - options: [ - { label: "Not a Fit", value: "not_a_fit" }, - { label: "No Budget", value: "no_budget" }, - { label: "Wrong Persona", value: "wrong_persona" }, - { label: "Unreachable", value: "unreachable" }, - { label: "Duplicate", value: "duplicate" }, - { label: "Competitor", value: "competitor" }, - { label: "Other", value: "other" } - ] - }), - // ── Duplicate management ─────────────────────────────────────────── - // - // `disqualification_reason: 'duplicate'` is only meaningful if the record - // says WHAT it duplicates — otherwise the "duplicate" bar on the - // disqualification breakdown points at nothing you can open. - // - // ⚠️ The surviving record can live on either object — a still-open lead, or - // a contact the prospect already became — and `Field.lookup` takes exactly - // one target (`Field.lookup(['crm_lead','crm_contact'])` is rejected at - // schema parse: "reference: expected string, received array"). So the link - // is the same TYPE-DISCRIMINATOR shape `crm_task.related_to_*` already uses: - // one select naming the object, one lookup per object, and the pairing - // enforced declaratively. - // - // The vocabulary is TWO sets, declared and split in `_picklists.ts`: the two - // object names an author may pick, plus `erased` — a tombstone the form does - // not offer and only `lead_duplicate_check` ever writes. - // - // The tombstone is what lets an erasure COMPLETE against a lead a human - // confirmed as a duplicate, without relaxing one rule, so read it as a - // constraint rather than as a spare value: `requiredWhen` below pairs only - // `crm_lead` / `crm_contact`, so a tombstoned type never fires either - // pairing and never demands a pointer to a record that is gone; and - // `duplicate_disqualification_requires_survivor` asks for a NON-BLANK type - // plus `duplicate_status == "confirmed"`, both of which a tombstoned lead - // still satisfies — so the verdict a reviewer recorded survives the erasure - // instead of being deleted as a side effect of someone else's GDPR request. - duplicate_of_type: Field9.select({ - label: "Duplicate Of", - group: "duplicates", - description: "Which object holds the surviving record this lead repeats.", - options: [...DUPLICATE_OF_TYPE_OPTIONS] - }), - // ⚠️ The type↔lookup pairing is `requiredWhen`, not a script validation: - // "the lookup named by the type must be populated" is exactly a conditional - // write contract, the engine evaluates it on insert and update, and it - // reports against the FIELD, so the form marks the empty lookup instead of - // showing a record-level error. (`crm_task` states the same intent as a - // warning-severity script rule because it predates `requiredWhen`, - // ADR-0113.) - // - // ⚠️ `has(...)` is load-bearing, not decoration. A bare - // `record.duplicate_of_type == "crm_lead"` aborts with `No such key` on any - // record whose merged shape omits the column, and the engine's response to a - // predicate that fails to evaluate is to SKIP it ("requiredWhen for - // 'duplicate_of_lead' failed to evaluate — skipped"). The rule would then - // read as enforced and require nothing at all. - // - // ⚠️ Both lookups take the spec default `deleteBehavior: 'set_null'`, and - // that is deliberate: a lead is a first-class record that happens to carry a - // flag, so `cascade` would destroy the lead because the record it was - // compared against was deleted. What keeps the pairing honest under a - // `set_null` clear is the retirement block in `lead_duplicate_check` - // (`lead.hook.ts`, job 1c): when a write leaves the named lookup blank it - // drops `duplicate_of_type` and `duplicate_status` in the same write, so the - // pair is never left half-stated and this rule never has to be loosened to - // tolerate one. Read that note before changing either predicate. - duplicate_of_lead: Field9.lookup("crm_lead", { - label: "Duplicate Of Lead", - group: "duplicates", - requiredWhen: P6`has(record.duplicate_of_type) && record.duplicate_of_type == "crm_lead"` - }), - duplicate_of_contact: Field9.lookup("crm_contact", { - label: "Duplicate Of Contact", - group: "duplicates", - requiredWhen: P6`has(record.duplicate_of_type) && record.duplicate_of_type == "crm_contact"` - }), - // Machine suspicion and human verdict are ONE field with two values, not two - // parallel sets of link fields: the intake hook writes `suspected` and only - // ever when this is blank (lead.hook.ts), so a human's `confirmed` survives - // every later write, and both states stay queryable off one column. - duplicate_status: Field9.select({ - label: "Duplicate Status", - group: "duplicates", - trackHistory: true, - description: "Suspected = flagged automatically at intake. Confirmed = a human verified the match.", - options: [ - { label: "Suspected", value: "suspected", color: "#FFA500" }, - { label: "Confirmed", value: "confirmed", color: "#FF0000" } - ] - }) - }, - // Lifecycle transitions are enforced via a `state_machine` validation rule - // (see validations[] below). ⚠️ There is no top-level `stateMachines` key on - // the platform — status state machines are expressed in the validation union. - // Database indexes for performance - // - // ⚠️ `email` is indexed but NOT unique, and the index must stay explicit: it - // used to exist only as a side effect of a field-level `unique: true`, so - // dropping that constraint would otherwise have dropped the index with it and - // left three read paths — the `lead_duplicate_check` intake lookup, the - // `crm_lead_import` upsert key and the conversion flow — scanning the table - // on every write. - // - // ⛔ Do NOT add `unique: true` back here: a single-column unique index makes - // the platform-wide constraint win over the per-tenant composite - // (framework#3991), so two organizations could not work the same address - // independently. Uniqueness is not the rule this object wants at all. - indexes: [ - { fields: ["owner_id"] }, - { fields: ["status"] }, - { fields: ["company"] }, - { fields: ["email"] } - ], - // API surface. History → Field.trackHistory (ADR-0052). - enable: { - apiEnabled: true - }, - // ADR-0079 record title — the `display_title` formula field defined above. - nameField: "display_title", - // Explicit search targets (ADR-0061). REQUIRED because nameField is a - // FORMULA (display_title/full_name): without this, $search auto-defaults to - // the formula field, which isn't a real column, so the lookup picker + global - // search silently return zero. These are real, indexed columns. - searchableFields: ["first_name", "last_name", "company", "email"], - highlightFields: ["full_name", "company", "email", "status", "owner_id"], - // Removed: list_views and form_views belong in UI configuration, not object definition - // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the - // rule returns a verdict even when the merged record has no such key. See - // AGENTS.md "Validation predicates must be TOTAL" and - // test/object-validation-predicates.test.ts, which fails the build otherwise. - validations: [ - { - name: "email_required", - type: "script", - severity: "error", - message: "Email is required", - condition: P6`!has(record.email) || isBlank(record.email)` - }, - { - // The field description promises "Required when status is Unqualified"; - // this is what enforces it. A lead in `unqualified` with no recorded - // reason loses the one datum a disqualification review needs. Same shape - // as `crm_case.escalation_reason_required`. - name: "disqualification_reason_required", - type: "script", - severity: "error", - message: "Disqualification reason is required when a lead is Unqualified", - condition: P6`has(record.status) && record.status == "unqualified" && (!has(record.disqualification_reason) || isBlank(record.disqualification_reason))` - }, - { - // "Disqualified as a duplicate" has to name the survivor. - // - // Same shape as `disqualification_reason_required` directly above — a - // declarative condition evaluated by the engine on insert and update, with - // no hook involved. The two clauses are the two things the field-level - // `requiredWhen` on the lookups cannot say: - // - // 1. `duplicate_of_type` must be chosen, which is what makes exactly one - // of the two `requiredWhen` predicates fire and demand its lookup. - // 2. `duplicate_status` must be `confirmed` SPECIFICALLY. `requiredWhen` - // asks whether a field is populated, not what it holds — and a lead - // closed on the machine's `suspected` guess is precisely the outcome - // this rule exists to prevent. A human has to look and agree. - // - // ⚠️ Every field reference is wrapped in `has(...)`, and that is what makes - // this an enforced rule rather than a decorative one. The engine evaluates - // a validation against `{...previous, ...data}` and fills absent fields - // with null on INSERT — but not on UPDATE, where `previous` is whatever - // the driver returned, and a driver that stores only the columns a row was - // written with hands back a record with no `duplicate_status` key at all. - // Strict CEL then aborts the whole predicate with `No such key`, and a - // predicate that fails to evaluate is SKIPPED, not failed: - // - // WARN Validation rule '…' predicate failed to evaluate (…) — skipped - // - // The unguarded first draft of this rule let a lead be closed as a - // duplicate with no survivor named, silently, on the in-memory driver — - // the driver the whole test suite runs on. - name: "duplicate_disqualification_requires_survivor", - type: "script", - severity: "error", - message: "Disqualifying a lead as Duplicate requires naming the surviving record and setting Duplicate Status to Confirmed", - condition: P6`has(record.disqualification_reason) && record.disqualification_reason == "duplicate" && !(has(record.duplicate_of_type) && !isBlank(record.duplicate_of_type) && has(record.duplicate_status) && record.duplicate_status == "confirmed")` - }, - { - name: "lead_status_progression", - type: "state_machine", - severity: "warning", - message: "Invalid lead status transition", - field: "status", - // Conversion (→ converted) is allowed from any worked-open status so the - // Convert action's widened visibility (new/contacted/qualified) never trips - // a spurious "invalid transition" warning when the flow stamps - // status:'converted'. - transitions: { - new: ["contacted", "qualified", "unqualified", "converted"], - contacted: ["qualified", "unqualified", "converted"], - qualified: ["converted", "unqualified"], - unqualified: ["new"], - converted: [] - } - } - ] - // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were - // removed from the platform. Field updates live in this object's `*.hook.ts`; - // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. -}); - -// src/sales/objects/opportunity.object.ts -import { ObjectSchema as ObjectSchema10, Field as Field10 } from "@objectstack/spec/data"; -import { F as F7, P as P7 } from "@objectstack/spec"; -var Opportunity = ObjectSchema10.create({ - name: "crm_opportunity", - label: "Opportunity", - pluralLabel: "Opportunities", - icon: "dollar-sign", - description: "Sales opportunities and deals in the pipeline", - // ADR-0090 D1/D7: OWD is an authored decision. Owner + high-value management sharing rule. - sharingModel: "private", - // ⚠️ ADR-0079 `nameField` is a FIELD, not a render template, and a FORMULA - // sees the stored select VALUE rather than its translated label — so a - // `'{name} - {stage}'` title renders every deal "Enterprise Deal - - // closed_won" in lookups, related lists and search, in every locale. The - // formula language has no option-label lookup, so the title is the plain - // `name` column; `stage` still leads the highlight strip below, translated. - nameField: "name", - // Explicit search targets (ADR-0061). `name` is a real indexed column, so - // $search resolves on its own here; the list is kept explicit to pin the - // intent (other objects whose nameField IS a formula rely on it). - searchableFields: ["name"], - highlightFields: ["name", "crm_account", "amount", "stage", "owner_id"], - fieldGroups: [ - { key: "basic", label: "Basic Information", icon: "dollar-sign" }, - { key: "financials", label: "Financials", icon: "trending-up" }, - { key: "sales_process", label: "Sales Process", icon: "target" }, - { key: "qualification", label: "Qualification", icon: "filter" }, - { key: "narrative", label: "Deal Narrative", icon: "book-open" }, - { key: "classification", label: "Classification", icon: "tag" }, - { key: "campaign", label: "Campaigns", icon: "flag", collapse: "collapsed" }, - { key: "notes", label: "Notes & Next Steps", icon: "file-text" }, - { key: "crm_forecast", label: "Forecast & Metrics", icon: "bar-chart", collapse: "collapsed" } - ], - fields: { - // Platform ownership anchor — canonical note in `account.object.ts` (#548). - owner_id: Field10.lookup("sys_user", { - label: "Opportunity Owner", - group: "basic", - system: true, - readonly: false, - trackHistory: true - }), - // Basic Information - name: Field10.text({ - label: "Opportunity Name", - required: true, - storage: { notNull: true }, - searchable: true, - group: "basic" - }), - // (No `display_title` formula — see `nameField` above: composing the title - // from `stage` leaked the raw select value into every rendered title.) - // Relationships - crm_account: Field10.lookup("crm_account", { - label: "Account", - required: true, - storage: { notNull: true }, - group: "basic" - }), - primary_contact: Field10.lookup("crm_contact", { - label: "Primary Contact", - // @objectstack 12: string[] `referenceFilters` is dead (not read by the - // picker); `dependsOn` is the live cascading form — scopes contacts to the - // opportunity's `crm_account` (ADR-0049). - dependsOn: ["crm_account"], - group: "basic" - }), - // Financial Information - amount: Field10.currency({ - label: "Amount", - required: true, - storage: { notNull: true }, - min: 0, - group: "financials", - trackHistory: true - }), - expected_revenue: Field10.currency({ - label: "Expected Revenue", - readonly: true, - // Calculated field - group: "financials" - }), - // ─── Qualification (REQ-0006 step 8) ─────────────────────────────── - // - // The standard triage vocabulary of a seller that cannot pursue every - // deal. `forecast_category` answers a different question — it is the - // forecast roll-up bucket, derived from `stage` — so none of this is - // folded into it. GENERIC values only: a customer's own grading scale is - // overlay configuration (REQ-0006 acceptance 5). - // - // ⚠️ `pnpm validate` reports the fields in this block, in the narrative - // block below, and the customer-side dates as "carrier-only — declared - // but nothing in this stack reads or displays it", and that reading is - // EXPECTED here rather than a defect to tidy away. The liveness - // diagnostic counts view columns, form sections, page bindings, flow - // nodes, formulas, hooks and actions as sites; it does NOT count - // `fieldGroups` membership, which is precisely the DERIVED layout - // REQ-0006 acceptance 1 asks for. ⛔ Do NOT answer the warning by - // authoring a `record:details` section — that is the escape hatch - // AGENTS.md reserves for a named customer demand, and it would trade - // acceptance 1 for a quieter log. `crm_account`'s business-profile block - // carries the same verdict on `main` for the same reason (#1948). - will_bid: Field10.boolean({ - label: "Will Bid", - description: "Whether we intend to bid. Unset means the decision is open.", - group: "qualification" - }), - controllability: Field10.select({ - label: "Controllability", - group: "qualification", - options: [ - { label: "High", value: "high" }, - { label: "Medium", value: "medium" }, - { label: "Low", value: "low" } - ] - }), - priority: Field10.select({ - label: "Priority", - group: "qualification", - options: [ - { label: "High", value: "high" }, - { label: "Medium", value: "medium" }, - { label: "Low", value: "low" } - ] - }), - deal_level: Field10.select({ - label: "Deal Level", - group: "qualification", - options: [ - { label: "Strategic", value: "strategic" }, - { label: "Key", value: "key" }, - { label: "Standard", value: "standard" } - ] - }), - // The FACT of subcontracting is generic and belongs in core; the - // customer's supplier list is not and is not proposed here. - is_subcontracted: Field10.boolean({ - label: "Involves Subcontracting", - defaultValue: false, - group: "qualification" - }), - subcontracting_note: Field10.textarea({ - label: "Subcontracting Note", - group: "qualification" - }), - // ─── The 立项 (qualification) gate: the rep's request ───────────── - // - // REQ-0006 step 11: 「销售立项需走审批流程;新增商机可跟进,立项通过后方可更新阶段、 - // 投标、赢丢单操作。」 The rep ASKS for 立项 by ticking this box, and - // `opportunity_qualification_approval` opens one approval when it turns on - // (the TRANSITION, not the current value). A rejection clears it, so - // ticking it again is a fresh request — the role `requested_status` plays - // for the status-change gate, as a boolean because 立项 asks for one thing. - // - // `defaultValue: false` is load-bearing for the start condition: every deal - // born after this column then STORES the key, so `has(previous.…)` holds - // on every driver and the off→on transition is visible. Not readonly: this - // is the one half of the gate a person writes. Inert while the gate is - // off — nothing reads it unless an install arms the verdict below. - qualification_requested: Field10.boolean({ - label: "Request Qualification Approval", - description: "Tick to send this deal for qualification approval. A rejection clears it; tick it again to ask again.", - defaultValue: false, - group: "qualification" - }), - // ─── The 立项 gate's switch AND its verdict column ───────────────── - // - // ⚠️ This `defaultValue` IS the switch, exactly as on - // `status_change_approval_status` below, and shipped it is `not_required`: - // the gate is OFF by default (REQ-0006 *Disposition*: "Both gates must be - // configurable — off by default"). No deal is born `pending`, the flow's - // start condition and the `opportunity_lifecycle` refusal are false for - // every record that has ever existed, and a stage move, Will Bid and a - // direct close work exactly as they do without it. An install ARMS the gate - // by changing this one value to `'pending'`; deals that already exist keep - // `not_required`, so arming it invalidates no record. ⛔ Not the flow's - // `status` — `lead-conversion-approval.flow.ts` records why. - // - // ⚠️ Its OWN column — ⛔ never `approval_status` (the amount-tiered - // flow's; its entry keys on `not_required`, so sharing would re-arm it) and - // ⛔ never `status_change_approval_status` (one gate's verdict would erase - // the other's, and the step-14 hook reads that column input-first). - // - // `readonly: true` on the #1666 grounds: the only writers are the gate's - // own `runAs: 'system'` flow and the insert default, and both survive the - // readonly strip. A user-supplied verdict is stripped BEFORE the - // `beforeUpdate` hooks run — measured on 17.6.0 with a real ObjectQL: a - // user update of `{ stage, qualification_approval_status: 'approved' }` - // reached the hooks as `{ id, stage }` and was refused 409 — so the - // input-first read in `opportunity_lifecycle` cannot be fed an `approved` - // by hand. - qualification_approval_status: Field10.select({ - label: "Qualification Approval", - group: "qualification", - readonly: true, - defaultValue: "not_required", - options: [ - { label: "Not Required", value: "not_required", default: true }, - { label: "Pending", value: "pending", color: "#FFA500" }, - { label: "Approved", value: "approved", color: "#00AA00" }, - { label: "Rejected", value: "rejected", color: "#FF0000" } - ] - }), - // Sales Process - stage: Field10.select({ - label: "Stage", - required: true, - storage: { notNull: true }, - group: "sales_process", - // ADR-0052 §5b.1 — the platform auto-renders each stage change on the - // activity timeline as "Stage: Proposal → Negotiation" (no hook code). - trackHistory: true, - // Canonical set (#490) — the mass_update_stage action renders the same - // list; see _picklists.ts. - options: [...OPPORTUNITY_STAGE_OPTIONS] - }), - probability: Field10.percent({ - label: "Probability (%)", - min: 0, - max: 100, - defaultValue: 10, - group: "sales_process" - }), - // Important Dates - close_date: Field10.date({ - label: "Close Date", - required: true, - storage: { notNull: true }, - group: "sales_process", - trackHistory: true - }), - // NO `created_date` here: the platform already injects `created_at` on - // every object, and this duplicate had no writer at all — not the seed - // data, not a hook, not a flow — so it was permanently null while - // `created_at` carried the real value (#575 B2). Surfaces that need the - // creation instant read `created_at` (see the deal_timeline view). - // - // Stage-age clock (#489). This is the STORED half of the pair: a real, - // indexed date column, so it is what automation and views may filter and - // sort on. `days_in_stage` below is a formula derived from it. - // `opportunity_lifecycle` stamps it on insert and re-stamps it on every - // stage change; readonly because nothing but that hook should move it - // (before-hook writes survive readonly stripping — only caller-supplied - // keys are dropped). - stage_entry_date: Field10.date({ - label: "Stage Entry Date", - description: "Date this opportunity entered its current stage.", - readonly: true, - group: "sales_process" - }), - // ─── The customer's own procurement calendar (REQ-0006 step 8) ───── - // - // ⛔ Never folded into `close_date`: that is a single date and it is OUR - // expected close. These are three distinct BUYER-side events, and - // REQ-0006 acceptance 2 requires them to be reportable independently of - // the forecast close date — see the `tender_this_quarter` list view, - // which predicates on `expected_tender_date` alone. - customer_initiation_date: Field10.date({ - label: "Customer Initiation Date", - group: "sales_process" - }), - expected_tender_date: Field10.date({ - label: "Expected Tender Date", - group: "sales_process" - }), - expected_signing_date: Field10.date({ - label: "Expected Signing Date", - group: "sales_process" - }), - expected_tender_amount: Field10.currency({ - label: "Expected Tender Amount", - min: 0, - group: "sales_process" - }), - expected_signing_amount: Field10.currency({ - label: "Expected Signing Amount", - min: 0, - group: "sales_process" - }), - // Additional Classification - type: Field10.select({ - label: "Opportunity Type", - group: "classification", - options: [ - { label: "New Business", value: "new_business" }, - { label: "Existing Customer - Upgrade", value: "existing_upgrade" }, - { label: "Existing Customer - Renewal", value: "existing_renewal" }, - { label: "Existing Customer - Expansion", value: "existing_expansion" } - ] - }), - // ⛔ BESIDE `type`, never replacing or overloading it: `type`'s four - // values are a RELATIONSHIP taxonomy that `opportunity.hook.ts` and - // reporting read. Generic delivery-model values only — the customer's own - // line-of-business list is overlay (REQ-0006 acceptance 5). - business_line: Field10.select({ - label: "Business Line", - group: "classification", - options: [ - { label: "Product", value: "product" }, - { label: "Professional Services", value: "services" }, - { label: "Consulting", value: "consulting" }, - { label: "Support & Maintenance", value: "support" }, - { label: "Other", value: "other" } - ] - }), - lead_source: Field10.select({ - label: "Lead Source", - group: "classification", - // Canonical set shared with Lead + Contact (#490): lead_conversion - // copies `leadRecord.lead_source` onto the opportunity it creates, so - // this must accept every Lead value. - options: [...LEAD_SOURCE_OPTIONS] - }), - // Campaign tracking - crm_campaign: Field10.lookup("crm_campaign", { - label: "Campaign", - description: "Marketing campaign that generated this opportunity", - group: "campaign" - }), - // Sales cycle metrics - // - // ⚠️ FORMULA, not a stored counter. As a plain number column nothing ever - // raises it: the hook resets it to 0 on a stage change and no sweep - // increments it, so `days_in_stage > 14` matches only rows a seed hardcoded - // and the `opportunity_stagnation` flow never fires on real data. Deriving - // it from `stage_entry_date` is correct on every read and costs no nightly - // full-table pass. - // - // ⚠️ The trade-off: formulas are evaluated AFTER the query (the engine's - // `applyFormulaPlan` walks the returned rows), so this is not a real column - // and CANNOT appear in a filter or a sort. Anything that needs to *select* - // stalled deals predicates on `stage_entry_date` instead — see - // `opportunity-stagnation.flow.ts` and the `stale_opportunities` view. - // - // ⚠️ `has()` + null guard: `daysBetween(null, …)` faults and the whole field - // silently evaluates to null, so an unstamped row is spelled out as null - // rather than arriving there by accident. - days_in_stage: Field10.formula({ - label: "Days in Current Stage", - expression: F7`has(record.stage_entry_date) && record.stage_entry_date != null ? daysBetween(record.stage_entry_date, today()) : null`, - returnType: "number", - group: "crm_forecast" - }), - // Additional information - description: Field10.markdown({ - label: "Description", - group: "notes" - }), - next_step: Field10.textarea({ - label: "Next Steps", - group: "notes" - }), - // ─── Deal narrative (REQ-0006 step 10) ───────────────────────────── - // - // The standard deal-review narrative, split out of `description` so each - // part is reviewable, templatable and (later) reportable on its own — - // ⛔ not more prose crammed into one markdown field. - // - // ⚠️ `payment_terms` is PROSE here and a select on `crm_quote` / - // `crm_contract`: what a rep records mid-pursuit is the shape of a term - // still being negotiated, not the net-terms ladder a signed document - // carries. ⛔ Do not "unify" it onto PAYMENT_TERMS_OPTIONS — that would - // force a half-agreed term into a closed vocabulary. - // - // All four are `Field.textarea` (REQ-0006 names markdown OR textarea per - // field). Measured on the 17.6.0 console, the Details tab's edit mode — - // the surface these fields render on — has no markdown editor, so a - // markdown field here could be read but never written. The maintainer - // ruled textarea for the three that were markdown (2026-10-03, on #1950: - // 「改成 textarea(推荐)」). - customer_background: Field10.textarea({ - label: "Customer Background", - group: "narrative" - }), - project_background: Field10.textarea({ - label: "Project Background", - group: "narrative" - }), - risk_analysis: Field10.textarea({ - label: "Risk Analysis", - group: "narrative" - }), - payment_terms: Field10.textarea({ - label: "Payment Terms", - group: "narrative" - }), - // Flags - is_private: Field10.boolean({ - label: "Private", - defaultValue: false, - group: "crm_forecast" - }), - forecast_category: Field10.select({ - label: "Forecast Category", - group: "crm_forecast", - options: [ - { label: "Pipeline", value: "pipeline" }, - { label: "Best Case", value: "best_case" }, - { label: "Commit", value: "commit" }, - { label: "Omitted", value: "omitted" }, - { label: "Closed", value: "closed" } - ] - }), - // Approval workflow tracking. - // ⭐ `readonly: true` — DECLARED, and the declaration is the honest one - // rather than a hopeful one. Audited per writer (#1666): every writer of - // this column and of `approved_date` is elevated or an insert. - // `opportunity_approval` declares `runAs: 'system'`, and - // `opportunity_approval_on_create` inherits it by spreading that flow, so - // `resolveRunDataContext` hands the engine `isSystem: true` and the - // `if (!opCtx.context?.isSystem)` strip branch is skipped outright; the - // `approval` node's own `approvalStatusField` write runs inside those same - // system runs; seeds write on INSERT, which the strip never touches. No - // view, page or action writes either column. ⇒ No writer loses its write. - // Ruled #1666 (director seat, decision batch #74, 2026-09-07): "Declared = - // enforced" applies to the audit surface too. ⛔ The hand-edit escape hatch - // — an admin clearing a stuck approval by typing over the stamp — is given - // up ON PURPOSE: a stuck approval is a platform or flow defect to be fixed - // as one, not a reason to keep an audit stamp hand-editable. ⛔ Do not - // reintroduce a bypass, and do not soften either column back to editable - // without a new ruling. Both halves are pinned in - // `test/audit-stamp-readonly.test.ts`: the system path still lands both - // stamps, and a plain user-context UPDATE of either is stripped. - // ⚠️ `defaultValue` at FIELD level: option-level `default: true` - // only preselects in UI forms — API and flow inserts land null without it, - // and a null `approval_status` never matches the flow's entry condition. - approval_status: Field10.select({ - label: "Approval Status", - group: "sales_process", - readonly: true, - defaultValue: "not_required", - options: [ - { label: "Not Required", value: "not_required", default: true }, - { label: "Pending", value: "pending", color: "#FFA500" }, - { label: "Approved", value: "approved", color: "#00AA00" }, - { label: "Rejected", value: "rejected", color: "#FF0000" } - ] - }), - approved_date: Field10.datetime({ - label: "Approved Date", - group: "sales_process", - readonly: true - }), - // ─── The status-change gate's switch AND its verdict column ──────── - // - // ⚠️ This `defaultValue` IS the switch, and shipped it is `not_required`, - // so the gate is OFF by default — REQ-0006 acceptance 3: "with it off - // (the default), the existing amount-tiered behaviour of - // `opportunity-approval.flow.ts` is bit-for-bit what it is today". No - // record is ever born `pending`, `opportunity_status_change_approval`'s - // start condition is false for every row that has ever existed, and - // nothing about the amount-tiered flow changes. An install ARMS the gate - // by changing this one value to `'pending'`. - // - // ⛔ Not the flow's `status`, for the reason - // `lead-conversion-approval.flow.ts` records and measured: `draft` still - // fires its triggers, and `obsolete` composes with the installation's - // activation ledger into a gate no install can ever turn ON. - // - // ⚠️ Deliberately NOT `approval_status`. That column is the amount-tiered - // flow's, and sharing it would make either gate's verdict erase the - // other's — and re-trigger the amount flow, whose entry condition keys on - // `approval_status == "not_required"`. - // - // `readonly: true` on the same audited grounds as `approval_status` - // (#1666): the only writers are the gate's own `runAs: 'system'` flow and - // the insert default, and both survive the readonly strip. - // What the rep is ASKING for, ⛔ never the stage itself: REQ-0006 - // acceptance 3 requires the stage not to move until the request is - // decided, and a `record_change` flow binds an AFTER hook — by the time it - // runs, a stage the rep wrote has already moved. So the rep writes the - // request here (with the win/loss reason), and the approved decision - // writes `stage` — the customer's own step 14, 「通过后商机状态正式生效」. - // - // Values ARE the two stage values, so the flow's approve branch can apply - // it with `stage: '{oppRecord.requested_status}'` and no mapping table can - // drift. Not readonly: this is the one half of the gate a person writes. - // Inert while the gate is off — nothing reads it unless the install arms - // `status_change_approval_status`. - requested_status: Field10.select({ - label: "Requested Status", - group: "sales_process", - options: [ - { label: "Won", value: "closed_won" }, - { label: "Lost", value: "closed_lost" } - ] - }), - status_change_approval_status: Field10.select({ - label: "Status Change Approval", - group: "sales_process", - readonly: true, - defaultValue: "not_required", - options: [ - { label: "Not Required", value: "not_required", default: true }, - { label: "Pending", value: "pending", color: "#FFA500" }, - { label: "Approved", value: "approved", color: "#00AA00" }, - { label: "Rejected", value: "rejected", color: "#FF0000" } - ] - }), - // ─── Win / Loss analysis ─────────────────────────────────────────── - // - // ⛔ The reason is captured AT CLOSE, and that is enforced, not requested. - // Leaving both fields optional means every seeded and user-closed deal - // lands with them empty and the win/loss widgets below have nothing to draw. - // - // `requiredWhen`, not a script validation, for the same reason - // `crm_lead.duplicate_of_lead` uses it (ADR-0113): "this field must hold a - // value when the record looks like X" is exactly a conditional write - // contract, the engine evaluates it on insert AND update inside - // `evaluateValidationRules`, and it reports against the FIELD — so the form - // marks the empty picklist instead of showing a record-level banner. It is - // ALSO the only shape the freeze below leaves usable: once a deal is closed, - // `opportunity.hook.ts` refuses every user edit outside the narrative - // fields, so a reason not captured in the closing write can never be added - // afterwards. Close time is the only chance. - // `test/win-loss-capture.test.ts` drives both predicates through a real - // ObjectQL over a real driver, on insert and on update. - // - // ⚠️ `has(...)` is load-bearing. A bare `record.stage == "closed_lost"` - // aborts with `No such key` on any merged record that omits the column, and - // the engine's answer to a predicate that cannot evaluate is to SKIP it - // ("requiredWhen for 'loss_reason' failed to evaluate — skipped"), which - // would make this read as enforced while requiring nothing at all. - win_reason: Field10.select({ - label: "Win Reason", - description: "Why this deal was won. Required to close an opportunity as Won.", - group: "classification", - requiredWhen: P7`has(record.stage) && record.stage == "closed_won"`, - options: [ - { label: "Better Product", value: "better_product" }, - { label: "Better Price", value: "better_price" }, - { label: "Existing Relationship", value: "relationship" }, - { label: "Better Support", value: "better_support" }, - { label: "Best Fit / Features", value: "best_fit" }, - // Written by the machine, not chosen by a rep: `quote_on_accepted` - // (quote.hook.ts) wins the deal the moment a customer accepts the - // quote, and no human is in that write to attribute it. Naming the - // automated path is this repo's existing idiom for exactly that split - // (`crm_lead.duplicate_status` = machine `suspected` vs human - // `confirmed`) and it keeps the rule exception-free: every closed_won - // row carries a reason, and an analyst can still tell a CPQ close from - // a rep's attribution instead of reading a fabricated "Better Product". - { label: "Quote Accepted", value: "quote_accepted" }, - { label: "Other", value: "other" } - ] - }), - loss_reason: Field10.select({ - label: "Loss Reason", - description: "Why this deal was lost. Required to close an opportunity as Lost.", - group: "classification", - requiredWhen: P7`has(record.stage) && record.stage == "closed_lost"`, - options: [ - { label: "Price Too High", value: "price" }, - { label: "Lost to Competitor", value: "competitor" }, - { label: "No Budget", value: "no_budget" }, - { label: "No Decision", value: "no_decision" }, - { label: "Bad Timing", value: "timing" }, - { label: "Missing Features", value: "features" }, - { label: "Other", value: "other" } - ] - }), - loss_details: Field10.textarea({ - label: "Loss/Win Details", - description: "Free-text context behind the win or loss reason.", - group: "classification" - }) - }, - // Database indexes for performance - indexes: [ - { fields: ["name"] }, - { fields: ["crm_account"] }, - { fields: ["owner_id"] }, - { fields: ["stage"] }, - { fields: ["close_date"] }, - // The stagnation sweep filters on this every morning. - { fields: ["stage_entry_date"] } - ], - // Enable advanced features - // - // Stage/amount history is tracked per-field via `Field.trackHistory` - // (ADR-0052). ⚠️ Ownership is NOT: it lives on the platform's injected - // `owner_id`, which carries no `trackHistory` flag — a transfer is recorded - // in the compliance audit log (`sys_audit_log`, unconditional) rather than on - // the activity feed. - enable: { - apiEnabled: true, - apiMethods: ["get", "list", "create", "update", "delete"], - // Whitelist allowed API operations - // #602 — proposals, redlines and signed orders belong on the deal. - // See the canonical capability note in `src/sales/objects/index.ts`. - files: true - }, - // ADR-0052 §5b.2 — declarative milestone activity. When `stage` enters these - // values the platform emits a semantic timeline entry (no hook code). - // Combined with the field-level `trackHistory` above (stage-change rows) this - // replaces any hand-coded activity hook. - activityMilestones: [ - { field: "stage", value: "closed_won", summary: "Deal won \u2014 {name}", type: "completed" }, - { field: "stage", value: "closed_lost", summary: "Deal lost \u2014 {name}", type: "completed" } - ], - // Removed: list_views and form_views belong in UI configuration, not object definition - // Lifecycle transitions are enforced via a `state_machine` validation rule - // (see validations[] below). ⚠️ There is no top-level `stateMachines` key on - // the platform — status state machines live in the validation union. - // Validation Rules - // - // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the - // rule returns a verdict even when the merged record has no such key. See - // AGENTS.md "Validation predicates must be TOTAL" and - // test/object-validation-predicates.test.ts, which fails the build otherwise. - validations: [ - { - name: "close_date_future", - type: "script", - severity: "warning", - message: "Close date should not be in the past unless opportunity is closed", - // An absent `stage` key means "no stage recorded", which is not a closed - // stage — hence `!has(record.stage) || (…)` rather than a leading - // `has(record.stage) &&`, which would suppress the warning instead. - condition: P7`has(record.close_date) && record.close_date != null && record.close_date < today() && (!has(record.stage) || (record.stage != "closed_won" && record.stage != "closed_lost"))` - }, - { - name: "amount_positive", - type: "script", - severity: "error", - message: "Amount must be greater than zero", - condition: P7`has(record.amount) && record.amount != null && record.amount <= 0` - }, - { - name: "opportunity_stage_progression", - type: "state_machine", - severity: "warning", - message: "Invalid opportunity stage transition", - field: "stage", - transitions: { - // `→ proposal` is legal from every pre-proposal stage: the - // quote_generation flow fast-forwards the deal to `proposal` when a - // quote is generated, which can happen at any open stage. - prospecting: ["qualification", "proposal", "closed_lost"], - qualification: ["needs_analysis", "proposal", "closed_lost"], - needs_analysis: ["proposal", "closed_lost"], - // `proposal → closed_won` is legal: the quote_on_accepted hook closes - // the linked deal directly from the CPQ path (quote_generation parks - // the opportunity at `proposal`; an accepted quote wins it without a - // separate negotiation step). - proposal: ["negotiation", "closed_won", "closed_lost"], - negotiation: ["closed_won", "closed_lost"], - closed_won: [], - closed_lost: [] - } - } - ] - // ⚠️ `probability` and `expected_revenue` are NOT computed declaratively. - // They are derived in `opportunity.hook.ts` (single source of truth = - // stage → STAGE_PROBABILITY); keeping the math in one place avoids drift - // between a declarative CASE() table and the hook's lookup table. - // - // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were - // removed from the platform. Field updates live in this object's `*.hook.ts`; - // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. -}); - -// src/sales/objects/task.object.ts -import { ObjectSchema as ObjectSchema11, Field as Field11 } from "@objectstack/spec/data"; -import { P as P8 } from "@objectstack/spec"; -var Task = ObjectSchema11.create({ - name: "crm_task", - label: "Task", - pluralLabel: "Tasks", - icon: "check-square", - description: "Activities and to-do items", - // ADR-0090 D1/D7: OWD is an authored decision. Personal activity records. - sharingModel: "private", - // Every other business object with a detail page groups its fields; task was - // one of the two that did not, so its detail page fell back to one flat grid - // where the five polymorphic `related_to_*` lookups and the recurrence - // machinery sat inline with the subject. The keys mirror the sections the - // task form already uses (Task / Related Records / Recurrence & Effort) so - // the two surfaces agree. - fieldGroups: [ - { key: "basic", label: "Task Information", icon: "info" }, - { key: "scheduling", label: "Scheduling", icon: "calendar" }, - // No 'assignment' group: the assignee (`owner_id`) was its only member, and - // the synthesized detail page hoists it into the highlight strip — so the - // group rendered on forms and never on detail pages - // (`field-group-shadowed`). It lives in `basic` alongside - // subject/status/priority instead. - { key: "related", label: "Related Records", icon: "link" }, - { key: "recurrence", label: "Recurrence", icon: "refresh-ccw", collapse: "collapsed" }, - { key: "effort", label: "Progress & Effort", icon: "activity", collapse: "collapsed" }, - { key: "system", label: "System", icon: "database", collapse: "collapsed" } - ], - fields: { - // Platform ownership anchor — canonical note in `account.object.ts` (#548). - owner_id: Field11.lookup("sys_user", { - label: "Assigned To", - group: "basic", - system: true, - readonly: false, - trackHistory: true - }), - // Task Information - subject: Field11.text({ - group: "basic", - label: "Subject", - required: true, - storage: { notNull: true }, - searchable: true, - maxLength: 255 - }), - description: Field11.markdown({ - group: "basic", - label: "Description" - }), - // Task Management - status: Field11.select({ - group: "basic", - label: "Status", - required: true, - storage: { notNull: true }, - trackHistory: true, - // Field-level default, not just the option flag: the option `default` - // only preselects in some form surfaces, so a quick-create modal opened - // from a related list left this required field blank and the rep had to - // pick "Not Started" by hand every time. - defaultValue: "not_started", - options: [ - { label: "Not Started", value: "not_started", color: "#808080", default: true }, - { label: "In Progress", value: "in_progress", color: "#FFA500" }, - { label: "Waiting", value: "waiting", color: "#FFD700" }, - { label: "Completed", value: "completed", color: "#00AA00" }, - { label: "Deferred", value: "deferred", color: "#999999" } - ] - }), - priority: Field11.select({ - group: "basic", - label: "Priority", - required: true, - storage: { notNull: true }, - trackHistory: true, - // `normal` is the default rather than `low`: a rep filing a to-do has - // made no priority judgement, and defaulting everything to Low made the - // field meaningless (nothing ever sorted above the noise). - defaultValue: "normal", - options: [ - { label: "Low", value: "low", color: "#4169E1" }, - { label: "Normal", value: "normal", color: "#00AA00", default: true }, - { label: "High", value: "high", color: "#FFA500" }, - { label: "Urgent", value: "urgent", color: "#FF0000" } - ] - }), - // Sortable ordinal for `priority` — see crm_case.priority_rank. Sorting on - // the select itself compares raw strings (normal > low > high > urgent), - // which pushes urgent work to the bottom of the to-do queue. - // - // `0` is the UNRANKED sentinel, identical to crm_case.priority_rank. ⛔ It - // must stay identical on both: a differing sentinel orders the same unknown - // priority differently on the two objects, and `2` here would make an - // unranked task indistinguishable from a genuine `normal`. - priority_rank: Field11.number({ - label: "Priority Rank", - readonly: true, - defaultValue: 0 - }), - type: Field11.select({ - group: "basic", - label: "Task Type", - // Canonical set (#490) — the schedule_followup screen renders the same - // list; see _picklists.ts. - options: [...TASK_TYPE_OPTIONS] - }), - // Dates - due_date: Field11.date({ - group: "scheduling", - label: "Due Date" - }), - reminder_date: Field11.datetime({ - group: "scheduling", - label: "Reminder Date/Time" - }), - completed_date: Field11.datetime({ - group: "scheduling", - label: "Completed Date", - readonly: true - }), - // Related To (Polymorphic relationship - can link to multiple object types) - related_to_type: Field11.select({ - group: "related", - label: "Related To Type", - options: [ - { label: "Account", value: "crm_account" }, - { label: "Contact", value: "crm_contact" }, - { label: "Opportunity", value: "crm_opportunity" }, - { label: "Lead", value: "crm_lead" }, - { label: "Case", value: "crm_case" } - ] - }), - related_to_account: Field11.lookup("crm_account", { - group: "related", - label: "Related Account" - }), - related_to_contact: Field11.lookup("crm_contact", { - group: "related", - label: "Related Contact" - }), - related_to_opportunity: Field11.lookup("crm_opportunity", { - group: "related", - label: "Related Opportunity" - }), - related_to_lead: Field11.lookup("crm_lead", { - group: "related", - label: "Related Lead" - }), - related_to_case: Field11.lookup("crm_case", { - group: "related", - label: "Related Case" - }), - // Recurrence (for recurring tasks) - is_recurring: Field11.boolean({ - group: "recurrence", - label: "Recurring Task", - defaultValue: false - }), - recurrence_type: Field11.select({ - group: "recurrence", - label: "Recurrence Type", - options: [ - { label: "Daily", value: "daily" }, - { label: "Weekly", value: "weekly" }, - { label: "Monthly", value: "monthly" }, - { label: "Yearly", value: "yearly" } - ] - }), - recurrence_interval: Field11.number({ - group: "recurrence", - label: "Recurrence Interval", - defaultValue: 1, - min: 1 - }), - recurrence_end_date: Field11.date({ - group: "recurrence", - label: "Recurrence End Date" - }), - // Flags - is_completed: Field11.boolean({ - group: "system", - label: "Is Completed", - defaultValue: false, - readonly: true - }), - is_overdue: Field11.boolean({ - group: "system", - label: "Is Overdue", - defaultValue: false, - readonly: true - }), - // Set by the `task_due_reminder` schedule flow once a reminder has fired - // (the sweep de-dups on `reminder_date`, which it clears; this flag is the - // audit trail), and defaulted to `false` by `task.hook.ts` on insert. - // - // NOT readonly — but the old reason here ("16.x drops flow writes to - // readonly fields") does not survive measurement. Taken on 17.1.0, - // RE-TAKEN on 17.2.0 (#1460) and RE-CONFIRMED on 17.3.0 (#1676) — the pin - // at each of those takings; not re-taken on 17.4.0 (PR #1814, #1807) or - // 17.5.0 — same verdict all three times: `task_due_reminder` - // declares `runAs: 'system'`, so its write WOULD survive a - // `readonly: true`. - // - // ⚠️ The other half of that reason EXPIRED at 17.4.0 and is ⛔ NOT - // renumbered here: "the insert path is exempt from the strip" held through - // 17.3.0 and was reversed as a declared BREAKING change — the retirement - // is recorded in the INSERT-path section of - // `test/readonly-write-semantics.test.ts` (#1429) and in - // `campaign_member.object.ts`. Neither half moves this field, which is not - // `readonly` at all. Left writable as-is; flipping it is a separate - // decision, not a comment fix. - reminder_sent: Field11.boolean({ - group: "system", - label: "Reminder Sent", - defaultValue: false - }), - // Progress - progress_percent: Field11.percent({ - group: "effort", - label: "Progress (%)", - min: 0, - max: 100, - defaultValue: 0 - }) - // No time tracking. `estimated_hours` / `actual_hours` were declared and - // inert: no rollup summed them onto a case or an opportunity, no variance - // report compared them, and nothing warned when actual overran estimate. - // Effort on a task is `progress_percent`, which the task views do read. - }, - // API surface. History → Field.trackHistory (ADR-0052). - enable: { - apiEnabled: true - }, - // Database indexes for performance - indexes: [ - { fields: ["status"] }, - { fields: ["priority"] }, - { fields: ["owner_id"] }, - { fields: ["due_date"] } - ], - // ADR-0079: render-only `titleFormat` retired in favor of `nameField`, - // which names the real field holding the record title (here: `subject`). - nameField: "subject", - highlightFields: ["subject", "status", "priority", "due_date", "owner_id"], - // Removed: list_views and form_views belong in UI configuration, not object definition - // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the - // rule returns a verdict even when the merged record has no such key. See - // AGENTS.md "Validation predicates must be TOTAL" and - // test/object-validation-predicates.test.ts, which fails the build otherwise. - validations: [ - { - name: "completed_date_required", - type: "script", - severity: "error", - message: "Completed date is required when status is Completed", - condition: P8`has(record.status) && record.status == "completed" && (!has(record.completed_date) || isBlank(record.completed_date))` - }, - { - name: "recurrence_fields_required", - type: "script", - severity: "error", - message: "Recurrence type is required for recurring tasks", - condition: P8`has(record.is_recurring) && record.is_recurring == true && (!has(record.recurrence_type) || isBlank(record.recurrence_type))` - }, - { - name: "related_to_required", - type: "script", - severity: "warning", - message: "At least one related record should be selected", - condition: P8`(!has(record.related_to_account) || isBlank(record.related_to_account)) && (!has(record.related_to_contact) || isBlank(record.related_to_contact)) && (!has(record.related_to_opportunity) || isBlank(record.related_to_opportunity)) && (!has(record.related_to_lead) || isBlank(record.related_to_lead)) && (!has(record.related_to_case) || isBlank(record.related_to_case))` - } - ] - // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were - // removed from the platform. Field updates live in this object's `*.hook.ts`; - // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. -}); - -// src/sales/actions/activity-actions.ts -var nameFieldMap = (objectDefs) => Object.fromEntries( - Object.values(objectDefs).filter( - (o) => typeof o?.name === "string" && typeof o?.nameField === "string" - ).map((o) => [o.name, o.nameField]) -); -var ACTIVITY_TARGETS = { - crm_lead: "related_to_lead", - crm_contact: "related_to_contact", - crm_account: "related_to_account", - crm_opportunity: "related_to_opportunity", - crm_case: "related_to_case" -}; -var lit = (value) => JSON.stringify(value); -var ACTOR_NAME_RESOLUTION_SOURCE = `// The acting user's DISPLAY name, for the sys_activity row (#673 / #678). - // - // PLATFORM WORKAROUND. \`ctx.user.name\` is not a display name on the - // dispatch path the Console uses: the REST action dispatcher builds the - // body's user as \`{ id: ec.userId, name: ec.userId, \u2026 }\` \u2014 the key is - // present and carries the raw id, so \`ctx.user?.name\` reads as a - // plausible string and silently wrote ids like - // "grDEyLoIgnunJ2M7Y2muLgcuQbDUT0s2" into \`sys_activity.actor_name\` - // (@objectstack/runtime 17.0.0-rc.2, dist/index.js:5397-5399). The MCP - // dispatcher does try a display name first - // (\`ec.userName ?? ec.userDisplayName ?? ec.userId\`, dist/index.js:1776) - // but nothing in the installed platform ever populates either field, so - // it falls back to the id too. - // - // So the name is resolved HERE, from \`sys_user.name\` (the column the - // platform itself treats as the profile display name), with the id kept - // as the last resort \u2014 an opaque id is bad, a blank actor is worse. - // A name that differs from the id is taken as already-resolved, which is - // what makes this one query and not a query per activity write. - // - // DELETE THIS once the platform delivers a display name on ctx.user.name - // for REST-dispatched action bodies: every splice site collapses back to - // \`actor_name: ctx.user?.name\` (objectstack-ai/objectstack#5372). - const ctxName = ctx.user?.name ? String(ctx.user.name).trim() : ''; - let actorName = ctxName && ctxName !== userId ? ctxName : ''; - if (!actorName && userId) { - try { - const found = await ctx.api.object('sys_user').find({ - where: { id: userId }, - fields: ['name'], - top: 1, - }); - const users = Array.isArray(found) ? found : (found?.records ?? []); - const resolved = users.length && users[0].name ? String(users[0].name).trim() : ''; - if (resolved) actorName = resolved; - } catch (e) { - // A denied or unavailable sys_user read must not fail the log \u2014 the - // interaction the rep just recorded matters more than its label. - } - } - if (!actorName) actorName = userId;`; -function activityAction(spec, objectName, nameField) { - const relatedField = ACTIVITY_TARGETS[objectName]; - if (!relatedField) { - throw new Error( - `activityAction: '${objectName}' is not an activity target \u2014 extend ACTIVITY_TARGETS together with crm_event.related_to_type and its related_to_* lookup.` - ); - } - return { - name: spec.name, - label: spec.label, - // Object-scoped, one registration per object. The runtime registers a body - // action under `:` and the dispatcher probes - // `` then `*`; a body action with no objectName lands under a - // 'global' key nothing ever probes ("Action 'log_call' on object '*' not - // found", verified 2026-07-28). ⛔ Never author an object-less body action. - objectName, - icon: spec.icon, - // script, not modal: modal submits die on GET /api/v1/meta/object/ - // → 400 in 16.1.0; script actions POST /api/v1/actions/... and execute. - type: "script", - body: { - language: "js", - source: ` - const OBJECT_NAME = ${lit(objectName)}; - const RELATED_FIELD = ${lit(relatedField)}; - const NAME_FIELD = ${lit(nameField)}; - const EVENT_TYPE = ${lit(spec.eventType)}; - const EVENT_STATUS = ${lit(spec.eventStatus)}; - - const record = ctx.record ?? {}; - const recordId = ctx.recordId ?? record.id ?? null; - const userId = ctx.user?.id ?? null; - const nowIso = new Date().toISOString(); - - ${ACTOR_NAME_RESOLUTION_SOURCE} - - const subject = input.subject ? String(input.subject) : ${lit(spec.defaultSubject)}; - const duration = input.duration ? Number(input.duration) : 0; - const notes = input.notes ? String(input.notes) : ''; - const location = input.location ? String(input.location) : ''; - - // A booking states its own start; a log is "just now". - // - // WORKAROUND for objectstack-ai/objectstack#5061 \u2014 the start is collected - // as a CALENDAR DAY + a WALL CLOCK (\`start_date\` / \`start_time\`) and - // joined here, instead of as one \`type: 'datetime'\` param. A datetime - // param is unusable from the Console: it renders as a zone-less - // \`\` and POSTs the raw value - // ("2026-08-10T15:00"), which the runtime's action-param validator rejects - // with 400 "expected an ISO-8601 instant with explicit zone" \u2014 no user - // input can pass. \`date\` and \`time\` are the two param types whose - // renderer output ("YYYY-MM-DD" / "HH:MM") the validator accepts verbatim, - // so the pair is submittable where the single datetime never was. - // - // TIMEZONE: the wall clock is interpreted as **UTC**, and both param - // labels say so. UTC is the only zone this body can apply deterministically - // \u2014 the sandbox context carries no user or org timezone (\`ctx.user\` is - // id/name/email), and reading the server's local zone would make the same - // input mean different instants on different hosts and in tests. Everything - // else this app writes is likewise a UTC instant (\`new Date().toISOString()\`). - // - // When #5061 lands (the Console serializing datetime-local in the - // browser's zone), this reverts to ONE \`type: 'datetime'\` param and the - // zone becomes the user's own \u2014 see \`collectsSchedule\` in this file. - let startIso = nowIso; - const startDate = input.start_date ? String(input.start_date).trim() : ''; - if (startDate) { - const startTime = input.start_time ? String(input.start_time).trim() : '00:00'; - // 'HH:MM' and 'HH:MM:SS' are both shapes the validator lets through. - const clock = startTime.length === 5 ? startTime + ':00' : startTime; - const parsed = new Date(startDate + 'T' + clock + '.000Z'); - // An unparseable value falls back to now rather than writing NaN into a - // required column. - if (!isNaN(parsed.getTime())) startIso = parsed.toISOString(); - } - - // 1. the interaction itself, as a queryable record. - const eventDoc = { - subject: subject, - type: EVENT_TYPE, - status: EVENT_STATUS, - start_datetime: startIso, - // Load-bearing, not decoration: an action body executes with - // isSystem: true (runtime buildActionExecutionContext), which - // short-circuits the security middleware \u2014 so the insert-time - // auto-stamp of owner_id never fires here. Omitting it would land the - // interaction ownerless, i.e. invisible in "My \u2026" and uneditable under - // a private OWD (#548, the #622 failure mode). - owner_id: userId, - related_to_type: OBJECT_NAME, - }; - if (duration > 0) eventDoc.duration_minutes = duration; - if (location) eventDoc.location = location; - if (notes) eventDoc.description = notes; - if (recordId) eventDoc[RELATED_FIELD] = recordId; - const event = await ctx.api.object('crm_event').insert(eventDoc); - const eventId = event?.id ?? null; - - // 2. attendees, as rows \u2014 the point of #592. - // A multi-lookup param may arrive as an array or, on a surface that - // renders it single-valued, as one scalar. Normalising both is not a - // lenient parse of authored metadata: it is the console's own input - // shape, which this body does not control. - const toList = (v) => { - if (v === null || v === undefined || v === '') return []; - return Array.isArray(v) ? v : [v]; - }; - const attendees = []; - if (userId) { - attendees.push({ attendee_type: 'user', sys_user: userId, is_organizer: true, response: 'accepted' }); - } - // The record the action was fired from IS an attendee when it is a - // person. On an account / opportunity / case it is not, so nothing is - // invented for it \u2014 the event's related_to_* link already records it. - if (OBJECT_NAME === 'crm_contact' && recordId) { - attendees.push({ attendee_type: 'contact', crm_contact: recordId, response: 'no_response' }); - } - if (OBJECT_NAME === 'crm_lead' && recordId) { - attendees.push({ attendee_type: 'lead', crm_lead: recordId, response: 'no_response' }); - } - for (const c of toList(input.attendee_contacts)) { - attendees.push({ attendee_type: 'contact', crm_contact: String(c), response: 'no_response' }); - } - for (const u of toList(input.attendee_users)) { - attendees.push({ attendee_type: 'user', sys_user: String(u), response: 'no_response' }); - } - - const seen = {}; - const attendeeIds = []; - for (const a of attendees) { - const who = a.sys_user ?? a.crm_contact ?? a.crm_lead ?? ''; - const key = a.attendee_type + ':' + who; - if (seen[key]) continue; - seen[key] = true; - const doc = Object.assign({}, a, { crm_event: eventId, invited_date: nowIso }); - const row = await ctx.api.object('crm_event_attendee').insert(doc); - if (row?.id) attendeeIds.push(row.id); - } - - // 3. the unified-timeline pointer. - // \`metadata\` no longer carries the attendee list: it is a display hint - // beside a real record now, not the record itself. ADR-0052 - // source_object/source_id is the queryable drill to the crm_event row. - const summary = duration ? subject + ' (' + duration + ' min)' : subject; - const activity = await ctx.api.object('sys_activity').insert({ - type: EVENT_STATUS === 'held' ? 'completed' : 'scheduled', - summary: ${lit(spec.summaryPrefix)} + summary, - actor_id: userId, - actor_name: actorName, - object_name: OBJECT_NAME, - record_id: recordId, - // #514 item 2: the object's DECLARED nameField, not a hardcoded name. - record_label: record[NAME_FIELD] ?? null, - source_object: 'crm_event', - source_id: eventId, - metadata: JSON.stringify({ - kind: EVENT_TYPE, - duration_minutes: duration, - notes: notes, - attendee_count: attendeeIds.length, - }), - }); - - // 4. SLA first-response stamp \u2014 NOT here. #575 B2 originally stamped - // \`crm_case.first_response_date\` from this body, which meant the metric - // was only ever written when the interaction was recorded through the two - // buttons this factory builds; an event created any other way left it - // null, under a comment asking every future author to remember. #595 - // moved the stamp to \`event_activity_bubble\` in - // \`src/sales/objects/event.hook.ts\`, which already fires on exactly the - // condition that matters ("a held event, on its transition into held") - // and already resolves \`related_to_case\`. Step 1 above writes that - // event, so this action still stamps the case \u2014 through one writer - // instead of a convention. Do not reintroduce a copy here: two writers - // racing on a "first" timestamp is how it becomes a "last" one. - - return { eventId: eventId, activityId: activity?.id ?? null, attendeeIds: attendeeIds }; - `, - capabilities: ["api.read", "api.write"], - timeoutMs: 5e3 - }, - locations: ["record_header", "list_item", "record_related"], - params: [ - { - name: "subject", - label: spec.subjectLabel, - type: "text", - required: true - }, - // WORKAROUND objectstack-ai/objectstack#5061 — one `type: 'datetime'` - // param ("Starts At") is what this WANTS to be, and it is unusable: the - // Console renders it as a zone-less `` and - // POSTs the raw value, which the action-param validator rejects with a - // 400 (`expected an ISO-8601 instant with explicit zone`). The renderer's - // output shape and the validator's accepted shape do not intersect, so - // NO user input can submit the action — reproduced from both the list-row - // menu and the record header. - // - // `date` and `time` are the two param types where they DO intersect: the - // Console renders native `` / `` - // pickers (`ui-components` DateField / TimeField, both emitting - // `e.target.value` verbatim) and the validator's `CalendarDateValueSchema` - // /`ClockTimeValueSchema` accept exactly `YYYY-MM-DD` and `HH:MM`. Two - // native pickers are also better UX than one free-text box, which is the - // other shape that would have submitted. - // - // The zone is stated in the LABELS, not in `helpText`: the Console's - // action-param form forwards only name/label/type/required/placeholder/ - // options/multiple/accept/maxSize to the field widget, so a `helpText` - // here would never reach the user. - // - // REVERT WHEN #5061 LANDS: back to - // { name: 'start', label: 'Starts At', type: 'datetime', required: true } - // and drop the join in the body above. - ...spec.collectsSchedule ? [ - { name: "start_date", label: "Start Date (UTC)", type: "date", required: true }, - { name: "start_time", label: "Start Time (UTC)", type: "time", required: true }, - { name: "location", label: "Location", type: "text", required: false } - ] : [], - { - name: "duration", - label: "Duration (minutes)", - type: "number", - required: false - }, - // Two typed lookups, not one free-text box: the platform has no - // polymorphic picker, and typed lookups produce queryable rows where a - // text box produces a comma-separated sentence nothing can filter on. - { - name: "attendee_contacts", - label: "Contact Attendees", - type: "lookup", - reference: "crm_contact", - multiple: true, - required: false - }, - { - name: "attendee_users", - label: "Internal Attendees", - type: "lookup", - reference: "sys_user", - multiple: true, - required: false - }, - { - name: "notes", - label: spec.notesLabel, - type: "textarea", - required: false - } - ], - successMessage: spec.successMessage, - refreshAfter: true - }; -} -var LOG_CALL_SPEC = { - name: "log_call", - label: "Log a Call", - icon: "phone", - eventType: "call", - eventStatus: "held", - summaryPrefix: "", - defaultSubject: "Untitled Call", - subjectLabel: "Call Subject", - notesLabel: "Call Notes", - successMessage: "Call logged successfully!" -}; -var LOG_MEETING_SPEC = { - name: "log_meeting", - label: "Log a Meeting", - icon: "calendar-check", - eventType: "meeting", - eventStatus: "held", - summaryPrefix: "Meeting: ", - defaultSubject: "Untitled Meeting", - subjectLabel: "Meeting Subject", - notesLabel: "Meeting Notes", - successMessage: "Meeting logged successfully!" -}; -var SCHEDULE_MEETING_SPEC = { - name: "schedule_meeting", - label: "Schedule a Meeting", - icon: "calendar-plus", - eventType: "meeting", - // `planned`, and that is the whole difference that matters: a booking must - // NOT reset the customer's recency clock (see event.hook.ts). - eventStatus: "planned", - summaryPrefix: "Meeting scheduled: ", - defaultSubject: "Untitled Meeting", - subjectLabel: "Meeting Subject", - notesLabel: "Agenda", - collectsSchedule: true, - successMessage: "Meeting scheduled!" -}; -var ACTIVITY_SPECS = [LOG_CALL_SPEC, LOG_MEETING_SPEC, SCHEDULE_MEETING_SPEC]; -var activityActionsFor = (objectName, objectDefs) => { - const nameField = nameFieldMap(objectDefs)[objectName] ?? "name"; - const built = ACTIVITY_SPECS.map((spec) => activityAction(spec, objectName, nameField)); - return Object.fromEntries(built.map((a) => [a.name, a])); -}; -var leadActivityActions = activityActionsFor("crm_lead", objects_exports2); -var contactActivityActions = activityActionsFor("crm_contact", objects_exports2); -var accountActivityActions = activityActionsFor("crm_account", objects_exports2); -var opportunityActivityActions = activityActionsFor("crm_opportunity", objects_exports2); -var LeadLogCallAction = leadActivityActions.log_call; -var LeadLogMeetingAction = leadActivityActions.log_meeting; -var LeadScheduleMeetingAction = leadActivityActions.schedule_meeting; -var ContactLogCallAction = contactActivityActions.log_call; -var ContactLogMeetingAction = contactActivityActions.log_meeting; -var ContactScheduleMeetingAction = contactActivityActions.schedule_meeting; -var AccountLogCallAction = accountActivityActions.log_call; -var AccountLogMeetingAction = accountActivityActions.log_meeting; -var AccountScheduleMeetingAction = accountActivityActions.schedule_meeting; -var OpportunityLogCallAction = opportunityActivityActions.log_call; -var OpportunityLogMeetingAction = opportunityActivityActions.log_meeting; -var OpportunityScheduleMeetingAction = opportunityActivityActions.schedule_meeting; - -// src/service/actions/case-activity.actions.ts -var caseActivityActions = activityActionsFor("crm_case", objects_exports); -var LogCallAction = caseActivityActions.log_call; -var LogMeetingAction = caseActivityActions.log_meeting; -var CaseScheduleMeetingAction = caseActivityActions.schedule_meeting; - -// src/service/actions/knowledge_article.actions.ts -import { P as P9 } from "@objectstack/spec"; -var feedbackBody = (verdict) => ` - const id = ctx.recordId; - if (!id) throw new Error('submit_article_feedback requires a recordId'); - const userId = ctx.user?.id ?? null; - if (!userId) throw new Error('Sign in to rate an article.'); - - // One row per (article, reader) \u2014 the unique index says so, and this - // read is what keeps a mind-change an UPDATE instead of a duplicate. - const existing = await ctx.api.object('crm_article_feedback').findOne({ - where: { crm_knowledge_article: id, owner_id: userId }, - }); - - if (existing && existing.id) { - if (existing.verdict === '${verdict}') { - return { ok: true, id: existing.id, verdict: '${verdict}', changed: false }; - } - await ctx.api.object('crm_article_feedback').update( - { id: existing.id, verdict: '${verdict}' }, - { where: { id: existing.id } }, - ); - return { ok: true, id: existing.id, verdict: '${verdict}', changed: true }; - } - - const inserted = await ctx.api.object('crm_article_feedback').insert({ - crm_knowledge_article: id, - verdict: '${verdict}', - owner_id: userId, - }); - return { ok: true, id: inserted?.id ?? null, verdict: '${verdict}', changed: true }; - `; -var publishedOnly = P9`has(record.status) && record.status == "published"`; -var MarkArticleHelpfulAction = { - name: "mark_article_helpful", - label: "Helpful", - objectName: "crm_knowledge_article", - icon: "thumbs-up", - type: "script", - body: { - language: "js", - source: feedbackBody("helpful"), - capabilities: ["api.read", "api.write"], - timeoutMs: 5e3 - }, - locations: ["record_header"], - visible: publishedOnly, - successMessage: "Thanks \u2014 recorded as helpful.", - refreshAfter: true -}; -var MarkArticleNotHelpfulAction = { - name: "mark_article_not_helpful", - label: "Not Helpful", - objectName: "crm_knowledge_article", - icon: "thumbs-down", - type: "script", - body: { - language: "js", - source: feedbackBody("not_helpful"), - capabilities: ["api.read", "api.write"], - timeoutMs: 5e3 - }, - locations: ["record_header"], - visible: publishedOnly, - successMessage: "Thanks \u2014 recorded as not helpful.", - refreshAfter: true -}; - -// src/service/dashboards/service.dashboard.ts -var dataset = "case_metrics"; -var ServiceDashboard = { - name: "service_dashboard", - label: "Customer Service", - description: "Case load, SLA health, and resolution performance", - columns: 12, - gap: 4, - refreshIntervalSeconds: 60, - // 1 minute — service desks need fresh numbers - header: { - showTitle: true, - showDescription: true - // Header action buttons removed: `create_case` is not a defined action and - // `/objects/case?owner=current_user` / `/reports/sla` are not in-app view - // routes — all three were dead. Re-add real, wired-up actions here when available. - }, - // Historical note (#460 → #1157): this dashboard shipped without a date - // picker from PR #546 until the 17.0.0 GA upgrade, because windowing a - // `Field.datetime()` could not be compared — `driver-sql` 16.1.0 coerced - // datetime bounds to epoch-ms INTEGER while every datetime in the database is - // ISO TEXT, so `$gte` matched everything and `$lte` matched nothing and the - // whole dashboard read zeros. Both named preconditions are fixed and - // released: objectstack#3912 (the coercion) and objectstack#3777 (a bare-date - // `$lte` dropping same-day rows). The window below is not restored on the - // strength of those closures alone — `test/dashboard-date-range-window.test.ts` - // executes it against a real SQLite database and compares every widget to a - // ground truth computed in the same run, so a re-regression fails CI here - // rather than being discovered as an all-zero dashboard again. - // - // The range windows `created_at`, the platform's creation stamp (#1992). It - // used to window `created_date`, which nothing wrote on a real case, so - // every case created through the UI or REST fell outside every range. - dateRange: { field: "created_at", defaultRange: "last_90_days", allowCustomRange: true }, - globalFilters: [ - { - field: "owner_id", - label: { en: "Agent", "zh-CN": "\u8D1F\u8D23\u4EBA", "es-ES": "Propietario del Caso", "ja-JP": "\u30B1\u30FC\u30B9\u62C5\u5F53\u8005" }, - type: "lookup", - scope: "dashboard", - optionsFrom: { object: "sys_user", valueField: "id", labelField: "name" } - }, - { - field: "priority", - label: { en: "Priority", "zh-CN": "\u4F18\u5148\u7EA7", "es-ES": "Prioridad", "ja-JP": "\u512A\u5148\u5EA6" }, - type: "select", - scope: "dashboard", - options: [ - // zh-CN `critical` is 严重, never 紧急 — 紧急 belongs to crm_task.priority.urgent - // and the two vocabularies are distinct sets (ruling #1342). Same wording as - // `objects.crm_case.fields.priority.options` in every locale pack. - { value: "critical", label: { en: "Critical", "zh-CN": "\u4E25\u91CD", "es-ES": "Cr\xEDtica", "ja-JP": "\u91CD\u5927" } }, - { value: "high", label: { en: "High", "zh-CN": "\u9AD8", "es-ES": "Alta", "ja-JP": "\u9AD8" } }, - { value: "medium", label: { en: "Medium", "zh-CN": "\u4E2D", "es-ES": "Media", "ja-JP": "\u4E2D" } }, - { value: "low", label: { en: "Low", "zh-CN": "\u4F4E", "es-ES": "Baja", "ja-JP": "\u4F4E" } } - ] - } - ], - widgets: [ - // ─── Row 1: Case-Load KPIs ──────────────────────────────────────── - { - id: "open_cases", - title: "Open Cases", - description: "Cases that are not yet closed", - type: "metric", - filter: { is_closed: false }, - colorVariant: "orange", - dataset, - values: ["case_count"], - layout: { x: 0, y: 0, w: 3, h: 2 } - }, - { - id: "critical_cases", - title: "Critical Cases", - description: "Open cases marked as critical priority", - type: "metric", - filter: { priority: "critical", is_closed: false }, - colorVariant: "danger", - dataset, - values: ["case_count"], - layout: { x: 3, y: 0, w: 3, h: 2 } - }, - { - id: "avg_resolution_time", - title: "Avg Resolution Time", - description: "Mean time to close, in hours", - type: "metric", - filter: { is_closed: true }, - colorVariant: "blue", - dataset, - values: ["avg_resolution"], - layout: { x: 6, y: 0, w: 3, h: 2 } - }, - { - id: "sla_violations", - title: "SLA Violations", - description: "Cases that breached their SLA", - type: "metric", - // Counted at READ time (#2070): a case already flagged, OR a case still - // open whose deadline has passed. The second branch is the selection - // `case_sla_monitor` sweeps — same status set, same strict `$lt` at the - // current instant (`{now}` is that instant in a query filter; `{NOW()}` - // in a flow template) — so the tile reads true on a deployment that runs - // no scheduled work, where nothing flags an open breach. It counts; it - // does not act: escalation and the owner's alert still need the sweep. - // `test/case-sla-breach-on-close.test.ts` pins the two to one selection. - filter: { - $or: [ - { is_sla_violated: true }, - { status: { $nin: ["resolved", "closed"] }, sla_due_date: { $lt: "{now}" } } - ] - }, - colorVariant: "warning", - dataset, - values: ["case_count"], - layout: { x: 9, y: 0, w: 3, h: 2 } - }, - // ─── Row 2: Distribution ────────────────────────────────────────── - { - id: "cases_by_status", - title: "Cases by Status", - description: "Workload distribution across the pipeline", - type: "donut", - filter: { is_closed: false }, - colorVariant: "blue", - dataset, - dimensions: ["status"], - values: ["case_count"], - layout: { x: 0, y: 2, w: 4, h: 4 }, - chartConfig: { - showLegend: true, - showDataLabels: true, - colors: ["#0EA5E9", "#06B6D4", "#14B8A6", "#10B981", "#F59E0B"] - } - }, - { - id: "cases_by_priority", - title: "Cases by Priority", - description: "Open case mix by urgency", - type: "pie", - filter: { is_closed: false }, - colorVariant: "warning", - dataset, - dimensions: ["priority"], - values: ["case_count"], - layout: { x: 4, y: 2, w: 4, h: 4 }, - chartConfig: { - showLegend: true, - showDataLabels: true, - // critical → high → medium → low - colors: ["#DC2626", "#F97316", "#F59E0B", "#10B981"] - } - }, - { - id: "cases_by_origin", - title: "Cases by Origin", - description: "Where our cases are coming from", - type: "bar", - colorVariant: "purple", - dataset, - dimensions: ["origin"], - values: ["case_count"], - layout: { x: 8, y: 2, w: 4, h: 4 }, - chartConfig: { - showLegend: false, - showDataLabels: true, - colors: ["#8B5CF6"] - } - }, - // ─── Row 3: Volume & SLA Trends ─────────────────────────────────── - { - id: "daily_case_volume", - title: "Daily Case Volume", - description: "New cases created over the last 30 days", - type: "area", - filter: { created_at: { $gte: "{30_days_ago}" } }, - // Opted out ON PURPOSE, re-decided in #1157 rather than inherited. - // - // The floor above is no longer inert: on 17.0.0 `{30_days_ago}` resolves - // to a start-of-day bound the driver compares correctly (measured, with a - // ground truth, in `test/dashboard-date-range-window.test.ts`), so this - // chart really does plot the last 30 days and its title is true again. - // That is exactly why it must not follow the picker: the dashboard range - // is ANDed into every bound widget, so a reader who selects "last 7 days" - // would get a 7-day chart still labelled "last 30 days". Self-described - // windows opt out — the same rule the Executive dashboard's YTD tile - // follows, pinned by `test/action-references.test.ts`. Binding it instead - // would mean dropping this filter and retitling the widget in all four - // locale bundles; the fixed 30-day volume trend beside a 90-day case load - // is the intended reading. - filterBindings: { dateRange: false }, - colorVariant: "blue", - dataset, - dimensions: ["created_at"], - values: ["case_count"], - layout: { x: 0, y: 6, w: 8, h: 4 }, - chartConfig: { - showLegend: false, - showDataLabels: false, - colors: ["#0EA5E9"], - interaction: { tooltips: true, brush: true } - }, - options: { dateGranularity: "day" } - }, - { - id: "sla_compliance_gauge", - title: "SLA Compliance", - description: "Percent of cases resolved within SLA this period", - type: "gauge", - filter: { is_closed: true }, - colorVariant: "success", - // Plots COMPLIANCE, the quantity the title, the description, the - // success colouring and the 0.95 target line all name (#1213). It used - // to plot `avg_sla_violated` — the complement — with `options.invert` - // asking the renderer to flip it. `invert` is not a declared key on - // `DashboardWidgetOptionsSchema`; it rode the `.passthrough()`, nothing - // could report it inert, and the gauge read 0.0% on an org with 100% - // compliance. The key is gone rather than left pretending: a measure - // that means what the widget says is the fix, and the measure's own - // label prints under the number, so the two cannot drift apart again. - dataset, - values: ["sla_compliance_rate"], - layout: { x: 8, y: 6, w: 4, h: 4 }, - chartConfig: { - showLegend: false, - showDataLabels: true, - colors: ["#10B981", "#F59E0B", "#EF4444"], - annotations: [ - { type: "line", axis: "y", value: 0.95, label: "Target", style: "dashed", color: "#10B981" } - ] - } - // The target line was written for COMPLIANCE and is unchanged: it was - // always right — it was the plotted value that disagreed with it. (The - // green/amber/red `options.thresholds` ladder beside it was deleted in - // 17.6.0's strict cleanup: no dashboard renderer reads widget - // `thresholds`, so it never coloured anything.) - }, - // ─── Row 4: Knowledge deflection (#601) ─────────────────────────── - // - // The deflection metric the card asks the service dashboard to show, and - // the reason it is THREE tiles rather than one: a ratio widget on its own - // is unreadable — 100% could be "40 of 40" or "1 of 1", and a blank rate - // could be "no closed cases" or "no KB resolutions" (measured: a filtered - // measure contributes NO row for a group it selects nothing in, so the - // rate comes back absent, not 0). Numerator and denominator therefore ship - // beside the percentage, the same rule the sales dashboard's win rate - // follows after #614. - { - id: "kb_deflection_rate", - title: "KB Deflection Rate", - description: "Share of closed cases resolved with a knowledge article", - type: "metric", - colorVariant: "success", - dataset, - values: ["kb_deflection_rate"], - layout: { x: 0, y: 10, w: 4, h: 2 } - }, - { - id: "kb_resolved_cases", - title: "Resolved by KB", - description: "Closed cases pointing at the article that resolved them", - type: "metric", - colorVariant: "blue", - dataset, - values: ["kb_resolved_count"], - layout: { x: 4, y: 10, w: 4, h: 2 } - }, - { - id: "closed_cases_total", - title: "Closed Cases", - description: "The denominator behind the deflection rate", - type: "metric", - colorVariant: "default", - dataset, - values: ["closed_count"], - layout: { x: 8, y: 10, w: 4, h: 2 } - }, - { - id: "top_resolving_articles", - title: "Top Resolving Articles", - description: "Knowledge articles ranked by the closed cases they resolved", - type: "table", - filter: { is_closed: true }, - colorVariant: "default", - dataset, - dimensions: ["resolved_article"], - values: ["kb_resolved_count"], - layout: { x: 0, y: 12, w: 12, h: 4 }, - options: { - sortBy: "kb_resolved_count", - sortOrder: "desc", - limit: 10 - } - }, - // ─── Row 5: My Open Cases by Priority ───────────────────────────── - // A dashboard `table` binds to an analytics cube and aggregates; it cannot - // list individual cases (ADR-0021) — for the case-by-case queue, use the - // my_open_cases ListView ("My Cases" in the My Work nav group). - // `{current_user_id}` scopes what this widget SHOWS; it is presentation - // scope, not an access boundary — row-level security owns that (#510). - { - id: "my_open_cases_by_priority", - title: "My Open Cases by Priority", - description: "Your open cases and their SLA-violation rate, broken down by priority", - type: "table", - filter: { is_closed: false, owner_id: "{current_user_id}" }, - // Opts out of the Agent global filter (keyed by its field, `owner_id`): - // ANDing an agent pick into "mine" empties the widget for anyone else. - filterBindings: { owner_id: false }, - colorVariant: "default", - dataset, - dimensions: ["priority"], - values: ["case_count", "avg_sla_violated"], - layout: { x: 0, y: 16, w: 12, h: 4 }, - options: { - sortBy: "case_count", - sortOrder: "desc", - limit: 10 - } - } - ] -}; - -// src/service/datasets/case.dataset.ts -import { defineDataset } from "@objectstack/spec/ui"; -var CaseDataset = defineDataset({ - name: "case_metrics", - label: "Case Metrics", - description: "Semantic layer for support-case counts, resolution time and SLA", - object: "crm_case", - dimensions: [ - { name: "status", label: "Status", field: "status", type: "string" }, - { name: "priority", label: "Priority", field: "priority", type: "string" }, - { name: "origin", label: "Origin", field: "origin", type: "string" }, - { name: "type", label: "Type", field: "type", type: "string" }, - // The platform's creation stamp (#1992) — the same dimension - // `account_metrics` and `lead_metrics` declare, bucketed by day here. - { name: "created_at", label: "Created", field: "created_at", type: "date", dateGranularity: "day" }, - // Article ranking by resolutions (#601) — group closed cases by the - // article that resolved them. `type: 'lookup'`, the same spelling the - // `owner` dimension on `opportunity_metrics` uses for `owner_id`. - { name: "resolved_article", label: "Resolving Article", field: "resolved_by_article", type: "lookup" } - ], - measures: [ - { name: "case_count", label: "Cases", aggregate: "count" }, - { name: "avg_resolution", label: "Avg Resolution (h)", aggregate: "avg", field: "resolution_time_hours", format: "0.0" }, - { name: "avg_sla_violated", label: "SLA Violation Rate", aggregate: "avg", field: "is_sla_violated", format: "0.0%" }, - // ─── Knowledge deflection (#601) ──────────────────────────────────── - // - // "% of closed cases resolved with an article". Built to the shape - // `opportunity_metrics.win_rate` arrived at the hard way (#593/#614): the - // two halves of the ratio are declared HERE as named measures, once, so no - // widget improvises a denominator — a wrong denominator does not error, it - // returns a plausible number. - // - // Each half carries its OWN `filter`, which the executor runs as a - // sub-query and merges back on the selected dimensions. A widget-level - // filter cannot express this: it would narrow BOTH halves to the same row - // set, which is how you end up dividing a number by itself. - // - // `kb_resolved_count` counts the COLUMN, not the rows: `count()` - // counts non-NULL values, so it needs no `$ne: null` predicate and no - // parallel boolean flag to drift out of step with the lookup. MEASURED on - // 17.0.0-rc.6 against both drivers — the numbers are pinned in - // `test/knowledge-deflection.test.ts`. The one thing it CANNOT discount is - // an empty string, which is non-NULL; that is why the blank is normalised - // to NULL at write time by `case_resolution_article_normalize`, and why - // that hook is part of this metric rather than a tidy-up beside it. - // - // Every widget that shows `kb_deflection_rate` also shows - // `kb_resolved_count` and `closed_count` beside it, so a reader can check - // the arithmetic that produced the percentage. - { name: "closed_count", label: "Closed Cases", aggregate: "count", filter: { is_closed: true } }, - { - name: "kb_resolved_count", - label: "Resolved by KB", - aggregate: "count", - field: "resolved_by_article", - filter: { is_closed: true } - }, - { - name: "kb_deflection_rate", - label: "KB Deflection Rate", - derived: { op: "ratio", of: ["kb_resolved_count", "closed_count"] }, - format: "0%" - }, - // ─── SLA compliance (#1213) ───────────────────────────────────────── - // - // The service dashboard's gauge asks "are we meeting SLA?", so the number - // it plots has to BE compliance. It used to plot `avg_sla_violated` — the - // complement — and ask the renderer to flip it with `options.invert`. That - // key is not declared by `DashboardWidgetOptionsSchema`; it rides the - // schema's `.passthrough()`, so no validator, lint rule or gate could ever - // tell the author it does nothing — and none did. The gauge read 0.0% on - // an org with 100% compliance. - // - // Spelled as a ratio of two counts rather than `1 - avg_sla_violated` - // because `DerivedMeasureOp` operands are MEASURE NAMES only (`of: - // string[]` — "no raw fields, no raw SQL"), so there is no literal `1` to - // subtract from. `difference` cannot express it either. This is the card's - // own second option and the spec's sanctioned shape — the one - // `kb_deflection_rate` above already uses. - // - // `is_sla_violated: false`, not `$ne: true`: the field declares - // `defaultValue: false`, and MEASURED on both drivers this app runs, a - // closed case inserted without the column stores `false` rather than NULL. - // So `sla_met_count + violated = closed_count` holds with no NULL hole. - // Both spellings measured identical (2 of 3, both drivers); the plain one - // is the one that reads as what it means. - // - // The denominator is `closed_count`, already declared above — the same - // measure the `closed_cases_total` tile shows, so a reader can check the - // percentage against a number on the same page. An empty numerator group - // does NOT blank the rate: the executor fills a `count` column's empty - // group with 0 BEFORE evaluating derived measures, so a fully-breached org - // reads 0%, not blank. A zero DENOMINATOR (no closed cases at all) does - // return null — "no data", which is the honest reading. - { name: "sla_met_count", label: "Cases Within SLA", aggregate: "count", filter: { is_closed: true, is_sla_violated: false } }, - { - name: "sla_compliance_rate", - label: "SLA Compliance Rate", - derived: { op: "ratio", of: ["sla_met_count", "closed_count"] }, - format: "0%" - } - ] -}); - -// src/sales/email-templates/_bundle.ts -var bundle = (packs) => Object.entries(packs).flatMap(([locale, pack]) => Object.entries(pack).map(([name, row]) => ({ name, locale, ...row }))); - -// src/service/email-templates/en.ts -var en = { - "crm.case_escalated": { - label: "Case Escalated", - subject: "Case escalated: {{case_number}}", - bodyHtml: "

Case {{case_number}} ({{priority}}) has been auto-escalated on critical priority. Ownership passes to the service manager with the lightest load; while nobody holds that position the case stays with you. Open the case to see who owns it now.

" - }, - "crm.case_sla_breach": { - label: "Case SLA Breached", - subject: "SLA breached: case {{case_number}}", - bodyHtml: "

Case {{case_number}} ({{priority}}) passed its SLA due date and has been auto-escalated.

" - } -}; - -// src/service/email-templates/zh-CN.ts -var zhCN = { - "crm.case_escalated": { - label: "\u5DE5\u5355\u5DF2\u5347\u7EA7", - subject: "\u5DE5\u5355\u5DF2\u5347\u7EA7\uFF1A{{case_number}}", - bodyHtml: "

\u5DE5\u5355 {{case_number}}\uFF08{{priority}}\uFF09\u56E0\u4E25\u91CD\u7EA7\u522B\u5DF2\u81EA\u52A8\u5347\u7EA7\u3002\u6240\u6709\u6743\u5C06\u8F6C\u4EA4\u7ED9\u5F53\u524D\u8D1F\u8377\u6700\u8F7B\u7684\u670D\u52A1\u7ECF\u7406\uFF1B\u82E5\u8BE5\u804C\u4F4D\u6682\u65E0\u4EBA\u62C5\u4EFB\uFF0C\u5DE5\u5355\u4ECD\u5F52\u60A8\u6240\u6709\u3002\u8BF7\u6253\u5F00\u5DE5\u5355\u67E5\u770B\u5F53\u524D\u8D1F\u8D23\u4EBA\u3002

" - }, - "crm.case_sla_breach": { - label: "\u5DE5\u5355 SLA \u8D85\u65F6", - subject: "SLA \u8D85\u65F6\uFF1A\u5DE5\u5355 {{case_number}}", - bodyHtml: "

\u5DE5\u5355 {{case_number}}\uFF08{{priority}}\uFF09\u5DF2\u8D85\u8FC7 SLA \u5230\u671F\u65F6\u95F4\uFF0C\u5E76\u5DF2\u81EA\u52A8\u5347\u7EA7\u3002

" - } -}; - -// src/service/email-templates/ja-JP.ts -var jaJP = { - "crm.case_escalated": { - label: "\u30B1\u30FC\u30B9\u306E\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3", - subject: "\u30B1\u30FC\u30B9\u304C\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u3055\u308C\u307E\u3057\u305F: {{case_number}}", - bodyHtml: "

\u30B1\u30FC\u30B9 {{case_number}}\uFF08{{priority}}\uFF09\u306F\u91CD\u5927\u5EA6\u304C\u9AD8\u3044\u305F\u3081\u81EA\u52D5\u7684\u306B\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u3055\u308C\u307E\u3057\u305F\u3002\u6240\u6709\u6A29\u306F\u8CA0\u8377\u306E\u6700\u3082\u8EFD\u3044\u30B5\u30FC\u30D3\u30B9\u30DE\u30CD\u30FC\u30B8\u30E3\u30FC\u306B\u79FB\u308A\u307E\u3059\u3002\u305D\u306E\u5F79\u8077\u306B\u8AB0\u3082\u3044\u306A\u3044\u9593\u306F\u3001\u30B1\u30FC\u30B9\u306F\u3042\u306A\u305F\u306E\u307E\u307E\u3067\u3059\u3002\u30B1\u30FC\u30B9\u3092\u958B\u3044\u3066\u73FE\u5728\u306E\u6240\u6709\u8005\u3092\u3054\u78BA\u8A8D\u304F\u3060\u3055\u3044\u3002

" - }, - "crm.case_sla_breach": { - label: "\u30B1\u30FC\u30B9\u306E SLA \u8D85\u904E", - subject: "SLA \u8D85\u904E: \u30B1\u30FC\u30B9 {{case_number}}", - bodyHtml: "

\u30B1\u30FC\u30B9 {{case_number}}\uFF08{{priority}}\uFF09\u306F SLA \u671F\u9650\u3092\u904E\u304E\u305F\u305F\u3081\u3001\u81EA\u52D5\u7684\u306B\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u3055\u308C\u307E\u3057\u305F\u3002

" - } -}; - -// src/service/email-templates/es-ES.ts -var esES = { - "crm.case_escalated": { - label: "Caso escalado", - subject: "Caso escalado: {{case_number}}", - bodyHtml: "

El caso {{case_number}} ({{priority}}) se ha escalado autom\xE1ticamente por prioridad cr\xEDtica. La propiedad pasa al responsable de servicio con menos carga; mientras nadie ocupe ese puesto, el caso sigue siendo tuyo. Abre el caso para ver qui\xE9n lo tiene ahora.

" - }, - "crm.case_sla_breach": { - label: "SLA del caso incumplido", - subject: "SLA incumplido: caso {{case_number}}", - bodyHtml: "

El caso {{case_number}} ({{priority}}) super\xF3 su fecha l\xEDmite de SLA y se ha escalado autom\xE1ticamente.

" - } -}; - -// src/service/email-templates/crm.email-template.ts -var ServiceEmailTemplates = bundle({ - "en-US": en, - "zh-CN": zhCN, - "ja-JP": jaJP, - "es-ES": esES -}); - -// src/service/flows/case-escalation.flow.ts -import { P as P10, cel } from "@objectstack/spec"; -var CaseEscalationFlow = { - name: "case_escalation", - label: "Case Escalation Process", - description: "Automatically escalate high-priority cases", - type: "record_change", - status: "active", - // A record-change flow fired by a SYSTEM write carries no trigger user - // either — the user-less exposure is NOT schedule-only (ADR-0049), and the - // platform's own build-time lint cannot see this shape - // because it is only knowable at run time. Measured on 17.0.0-rc.2: a - // user-less run refuses the very first data node — "[runAs] refusing a data - // operation (object 'crm_case', event 'record-after-update')" — so a case - // raised by the seed loader, an integration, or another runAs:'system' - // flow's write silently keeps its critical priority forever. - // - // Elevating the USER-driven runs too is correct here: escalation is a - // service-level policy, not the writer's own edit. Both data nodes are keyed - // to `{record.id}` — the row that just fired the trigger — so user scope - // buys no restriction that matters, while it does add a failure mode: an - // agent may legitimately raise a case without holding edit rights on the - // escalation lifecycle fields (`is_escalated` / `escalated_date` / `status`). - // This also puts the flow on the same footing as `case_sla_monitor`, which - // performs the same escalation on a schedule under `runAs: 'system'`. - runAs: "system", - variables: [ - { name: "caseId", type: "text", isInput: true, isOutput: false } - ], - nodes: [ - { - // Trigger wiring (7.4): bind to afterUpdate and gate on the critical - // transition. The re-fire guard MUST NOT rely on the boolean - // `is_escalated`: this flow's own escalation write re-triggers - // record-after-update, and on SQLite/libsql a boolean persists as integer - // `1`, so `record.is_escalated != true` is `1 != true` = true — the guard - // never trips and the flow loops forever (it wedged a first-boot seed on - // 2026-07-06). Instead: - // - `escalated_date == null` marks "never escalated" (the escalation write - // stamps it, suppressing the second fire AND any re-escalation when an - // agent later moves the case back to in_progress to work it); - // - the status terms keep the flow off cases already escalated or already - // finished — without them a critical case could never be resolved or - // closed (the flow would yank `status` straight back to `escalated`). - id: "start", - type: "start", - label: "Start", - config: { - objectName: "crm_case", - triggerType: "record-after-update", - // Also suppress on closed/resolved: closing a critical case is itself - // an afterUpdate, and with only the `!= "escalated"` guard this flow - // re-escalated the case the moment it was closed (observed live: - // close_case wrote status "closed", this flow immediately rewrote it - // to "escalated"). Status strings are the reliable guard — comparing - // the boolean is_closed suffers the SQLite `1 != true` trap above. - // `escalated_date == null` additionally keeps a case that was already - // escalated once (then reopened) from being escalated again. - // - // TOTALITY: every `record.x` read carries a `has(record.x)` - // guard — see the house-rule block in - // `test/flow-condition-totality.test.ts`. Measured end-to-end on - // driver-memory: a case BORN critical is stored without an - // `escalated_date` column at all, `record.escalated_date == null` - // aborted with `No such key: escalated_date`, and this flow never ran - // on the very population it exists for. The guards below preserve the - // predicate's answer on every shape where it previously had one. - // `escalated_date` absent means the same as null ("never escalated"); - // an absent `status` cannot be a terminal status, so it must not - // suppress the escalation. - condition: P10`has(record.priority) && record.priority == "critical" - && (!has(record.escalated_date) || record.escalated_date == null) - && (!has(record.status) - || (record.status != "escalated" && record.status != "resolved" && record.status != "closed"))` - } - }, - { - id: "get_case", - type: "get_record", - label: "Get Case Record", - config: { objectName: "crm_case", filter: { id: cel`record.id` }, outputVariable: "caseRecord" } - }, - { - // The `label` names what this node actually does: it flags the case as - // escalated (see `fields` below) and reassigns nothing. The `id` keeps - // its original `assign_senior_agent` spelling on purpose — `edges[]` - // reference nodes by id, and `CaseEscalationOnCreateFlow` rewrites the - // node list by id, so renaming one is a behaviour change, not a wording - // fix. - id: "assign_senior_agent", - type: "update_record", - label: "Flag as Escalated", - config: { - objectName: "crm_case", - filter: { id: cel`record.id` }, - // `escalation_reason` must be set whenever `is_escalated` flips true — the - // object's `escalation_reason_required` validation rejects the write - // otherwise (which silently aborted this flow until it was supplied). - // - // ⛔ This node writes NO owner, and cannot: reassigning from a flow - // would mean `{caseRecord.owner_id.manager}`, and a flow template - // cannot traverse a lookup — it interpolates to the literal "undefined" - // and would orphan the case under a phantom owner. The hand-off does not - // need to happen here: this very update fires the - // `case_escalation_reassign` beforeUpdate hook - // (`src/service/objects/_case-assignment.ts`), which puts the case with the - // least-loaded holder of the flat `service_manager` position — a pool, - // which the app can resolve, rather than a manager chain, which it - // cannot. With that pool unstaffed the case keeps its owner and this - // write is unchanged. - fields: { is_escalated: true, escalation_reason: "Auto-escalated: critical priority", escalated_date: cel`isoDatetime(now())`, status: "escalated" } - } - }, - // No `create_task` node here: the escalation write above flips `status` to - // `escalated`, which fires the `case_status_side_effects` hook — the single - // owner of escalation follow-up tasks (it also covers the `escalate_case` - // action and the SLA monitor). A second task node here produced duplicate, - // disagreeing tasks (case owner/high vs account owner/urgent) per escalation. - { - // Gateway only — the live predicate is on the out-edge `e4`. The engine - // never reads a `decision` node's singular `config.condition`, so a copy - // here would restate the gate without BEING the gate - // (`flow-inert-node-condition`); `pnpm lint` — `os lint --strict` — - // fails on that. - // - // Why the gate exists: `crm_case.owner_id` is NULLABLE and an unowned case - // is an ordinary state — this repo ships `scripts/backfill-owner-id.ts` - // and `pnpm backfill:owner` precisely because ownerless rows happen, and - // ordinary REST creation / import reach the same state. `notify_team` - // below addresses exactly ONE recipient, so an ownerless case leaves it - // with an empty slate, which the builtin node treats as a HARD failure: - // `execute` returns `success: false`, `executeNode` turns that into a - // throw, and the run ends `status: 'failed'`. - // - // BLAST RADIUS, stated precisely because it differs from the sibling - // defect in `case_sla_monitor` and the difference is structural: these two - // are `record_change` flows with NO loop, so one ownerless case kills only - // its OWN run — there is no queue of other records behind it. A `schedule` - // flow whose work sits inside a `loop` awaits `runRegion` with no - // try/catch, and there one ownerless row takes down every record ordered - // behind it. - // - // ⛔ The gate sits AFTER `assign_senior_agent`, which stays - // UNCONDITIONAL: the escalation itself must still land (measured - // `is_escalated: true`, `status: 'escalated'` on every failing run), so an - // ownerless critical case stays visible in views and reports. Only the - // notify is gated — and here that loses nothing a reader would want, - // because `caseRecord` is read by `get_case` UPSTREAM of the escalation - // write, so `{caseRecord.owner_id}` is deliberately the owner the case had - // BEFORE the hand-off. With no such person there is no "previous owner" - // for the message to be addressed to. - // - // ⚠️ This guard is exactly the duplication objectstack#13682 exists to - // retire — `notify` should treat an empty audience as a RECORDED SKIP - // rather than a hard failure. When that lands, delete this node and edge - // `e4`'s predicate here, and the same pair in `case-sla-monitor.flow.ts`. - id: "check_owner", - type: "decision", - label: "Case Has an Owner?" - }, - { - // ADR-0012: the dedicated `notify` node dispatches through the messaging - // service (inbox + email + push). The legacy `script` + `actionType:'email'` - // shape is a no-op stub in 7.4 and never delivered anything. - // Owner only: `{caseRecord.owner_id.manager}` cannot traverse a lookup in - // flow templates — it interpolates to the literal "undefined". - // The `label` names the single recipient this node has (`recipients` - // below); the `id` keeps its `notify_team` spelling because `edges[]` - // reference it. Cf. the same node in `case-sla-monitor.flow.ts`, whose - // label already says `Alert Owner`. - id: "notify_team", - type: "notify", - label: "Notify Case Owner", - config: { - // Owner only, and the owner it reaches is the one the case had BEFORE - // the escalation: `caseRecord` was read by `get_case` upstream of the - // write, so `{caseRecord.owner_id}` is the agent being handed off from - // — exactly the person this message is for. Flow templates cannot - // traverse a lookup (see the note on `assign_senior_agent` above): - // `{caseRecord.owner_id.manager}` and `{caseRecord.crm_account.name}` - // both interpolate to the literal string "undefined" — a phantom - // recipient and a garbled body. - recipients: [cel`caseRecord.owner_id`], - channels: ["inbox", "email"], - severity: "critical", - topic: "case_escalated", - // ⚠️ The body — now `crm.case_escalated` in `../email-templates/`, one - // row per locale — must stay true on BOTH outcomes. "It remains - // assigned to you" is false whenever the hand-off finds a manager; the - // opposite claim ("it has been reassigned") is false whenever the - // `service_manager` pool is unstaffed, which is the first-install norm. - // So it states the rule and points at the record for the answer, in - // every language. - template: "crm.case_escalated", - templateData: { case_number: cel`caseRecord.case_number`, priority: cel`caseRecord.priority` }, - actionUrl: "/crm_case/{{record.id}}" - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "get_case", type: "default" }, - { id: "e2", source: "get_case", target: "assign_senior_agent", type: "default" }, - { id: "e3", source: "assign_senior_agent", target: "check_owner", type: "default" }, - // The gate. A `decision` with no matching out-edge simply ends the run - // here, after the escalation has already been written. - // - // TOTALITY: `caseRecord` is a `get_record` OUTPUT — a raw driver row, sparse - // in the way `driver-memory` / `driver-mongodb` store only the columns a row - // was written with — so only `has()` is total, and it must be `vars.`-scoped - // (measured: bare `has(caseRecord.owner_id)` still aborts with `Unknown - // variable` on an unbound root, while `has(vars.caseRecord)` answers - // `false`). - // - // ⛔ EVERY TERM IS LOAD-BEARING — do not simplify this predicate. The last - // one MIRRORS THE NOTIFY NODE'S OWN emptiness rule rather than guessing at - // it: builtin `notify` builds its audience with `String(v).trim()` + - // `.filter(Boolean)`, so null, undefined, `''` and any all-whitespace value - // all collapse to the same empty slate. Each term was measured through - // `evaluateCondition` on the shape it alone covers, by dropping it and - // recording what the rest do: - // - `has(vars.caseRecord)` — an UNBOUND root. Without it the predicate - // aborts with `No such key: caseRecord`. `get_case` binds the variable - // on every path here (it sets it even when it matched nothing), so this - // term is what keeps a future graph edit from turning a gate into an - // abort — and the `vars.`-scoped `has()` pair is the house rule - // `test/flow-variable-conditions.test.ts` enforces. - // - `has(vars.caseRecord.owner_id)` — the ABSENT key. Without it, - // `vars.caseRecord.owner_id != null` aborts with `No such key: owner_id`. - // - `vars.caseRecord.owner_id != null` — the explicit NULL. Without it the - // wrap is handed one and aborts with `no matching overload for - // 'string(null)'`, so this term must short-circuit in front of it. - // - `string(...).trim() != ""` — the BLANK/whitespace id. `' ' != ""` is - // TRUE in CEL, so a gate written that way opens for a whitespace - // `owner_id` and reproduces this very defect one input narrower. The - // `string()` wrap is not decoration either: measured, a bare `.trim()` - // on a numeric id aborts with `no matching overload for - // 'double.trim()'` and `.matches()` with `'double.matches(string)'` — a - // thrown condition, the fault mode this gate exists to remove. - // - // ⛔ Do NOT add a `vars.caseRecord != null` term for the row that is GONE by - // the time `get_case` reads it. Measured INERT: `get_record` with no match - // sets the variable to `null`, key present, and `has()` on a null base - // answers `false` rather than aborting, so the four terms above already - // close that shape (`test/flow-escalation-ownerless-case.test.ts` covers - // it). A term that cannot change an answer is an inert copy, not defence in - // depth. - { id: "e4", source: "check_owner", target: "notify_team", type: "conditional", condition: P10`has(vars.caseRecord) && has(vars.caseRecord.owner_id) - && vars.caseRecord.owner_id != null && string(vars.caseRecord.owner_id).trim() != ""`, label: "Has owner" }, - { id: "e5", source: "notify_team", target: "end", type: "default" } - ] -}; -var CaseEscalationOnCreateFlow = { - ...CaseEscalationFlow, - name: "case_escalation_on_create", - label: "Case Escalation Process (on create)", - description: "Escalate cases created critical (insert-time twin of case_escalation)", - nodes: CaseEscalationFlow.nodes.map( - (n) => n.id === "start" ? { ...n, config: { ...n.config, triggerType: "record-after-create" } } : n - ) -}; - -// src/service/flows/case-actions.flow.ts -import { cel as cel2 } from "@objectstack/spec"; - -// src/service/objects/_case-assignment.ts -var CLAIMABLE_TARGET_STATUSES = [ - "in_progress", - "waiting_customer", - "waiting_support" -]; -function createCaseRoundRobinAssign(hookName = "case_auto_assign") { - return { - name: hookName, - object: "crm_case", - events: ["beforeInsert"], - priority: 250, - description: "Assign ownerless new cases to the least-loaded service agent.", - handler: async (ctx) => { - const { input } = ctx; - if (typeof input.owner_id === "string" && input.owner_id) return; - const api = ctx.api; - if (!api) return; - try { - const holders = await api.object("sys_user_position").find({ - where: { position: "service_agent" }, - fields: ["user_id"], - top: 1e3 - }); - const agentIds = Array.from( - new Set( - (holders ?? []).map((r) => typeof r.user_id === "string" ? r.user_id : "").filter(Boolean) - ) - ); - if (agentIds.length === 0) return; - let best; - let bestCount = Infinity; - for (const agentId of agentIds) { - const openCount = await api.object("crm_case").count({ - where: { owner_id: agentId, status: { $nin: ["resolved", "closed"] } } - }); - if (openCount < bestCount) { - bestCount = openCount; - best = agentId; - } - } - if (best) input.owner_id = best; - } catch { - } - } - }; -} -function createCaseEscalationReassign(hookName = "case_escalation_reassign") { - return { - name: hookName, - object: "crm_case", - events: ["beforeUpdate"], - priority: 250, - runAs: "system", - description: "Hand a case being escalated to the least-loaded service manager.", - handler: async (ctx) => { - if (ctx.dispatch?.mode === "per-row") return; - const { input } = ctx; - const previous = ctx.previous; - if (!previous) return; - if (input.status !== "escalated" || previous.status === "escalated") return; - if (typeof input.owner_id === "string" && input.owner_id) return; - const api = ctx.api; - if (!api) return; - const organizationId = typeof previous.organization_id === "string" && previous.organization_id !== "" ? previous.organization_id : void 0; - const inOrganization = organizationId ? { organization_id: organizationId } : {}; - try { - const holders = await api.object("sys_user_position").find({ - where: { position: "service_manager", ...inOrganization }, - fields: ["user_id"], - top: 1e3 - }); - const managerIds = Array.from( - new Set( - (holders ?? []).map((r) => typeof r.user_id === "string" ? r.user_id : "").filter(Boolean) - ) - ); - if (managerIds.length === 0) return; - const currentOwner = typeof previous.owner_id === "string" && previous.owner_id || ""; - if (currentOwner && managerIds.indexOf(currentOwner) !== -1) return; - let best; - let bestCount = Infinity; - for (const managerId of managerIds) { - const openCount = await api.object("crm_case").count({ - where: { owner_id: managerId, status: { $nin: ["resolved", "closed"] }, ...inOrganization } - }); - if (openCount < bestCount) { - bestCount = openCount; - best = managerId; - } - } - if (best) input.owner_id = best; - } catch { - } - } - }; -} -function createCaseSelfClaim(hookName = "case_self_claim") { - return { - name: hookName, - object: "crm_case", - events: ["beforeUpdate"], - priority: 260, - description: "Let a user claim an unowned open case by picking it up; the owner written is always the caller.", - handler: async (ctx) => { - if (ctx.dispatch?.mode === "per-row") return; - const { input } = ctx; - const previous = ctx.previous; - if (!previous) return; - const claimant = ctx.user?.id; - if (typeof claimant !== "string" || !claimant) return; - if (ctx.session?.isSystem) return; - if ("owner_id" in input) return; - if (typeof previous.owner_id === "string" && previous.owner_id) return; - if (previous.status === "closed") return; - if (previous.is_closed === true || previous.is_closed === 1) return; - const next = input.status; - if (typeof next !== "string" || next === previous.status) return; - if (next !== "in_progress" && next !== "waiting_customer" && next !== "waiting_support") return; - input.owner_id = claimant; - } - }; -} - -// src/service/flows/case-actions.flow.ts -var EscalateCaseFlow = { - name: "escalate_case", - label: "Escalate Case", - description: "Collect an escalation reason, then flag and re-prioritise the case.", - type: "screen", - status: "active", - variables: [ - // MUST be `recordId` — the console's flow-action contract seeds only that - // name (and its camelCase object alias); a custom name arrives undefined. - { name: "recordId", type: "text", isInput: true, isOutput: false }, - { name: "reason", type: "text", isInput: true, isOutput: false } - ], - nodes: [ - { id: "start", type: "start", label: "Start", config: { objectName: "crm_case" } }, - { - id: "screen_1", - type: "screen", - label: "Escalate Case", - config: { - fields: [ - { name: "reason", label: "Escalation Reason", type: "textarea", required: true } - ] - } - }, - { - // The USER-CONTEXT half of the escalation. Everything here is a - // column the acting agent may legitimately write, so it is written with - // their identity — this flow stays `runAs: 'user'`. - // - // escalation_reason the agent's own screen input - // priority an ordinary editable field - // status ordinary, and the hook trigger (below) - // - // The two stamps a person never types — `is_escalated` and - // `escalated_date` — are `readonly: true` on `crm_case` and are written - // by the `case_escalation_stamp` subflow that follows, with the system - // context. See `src/service/flows/case-escalation-stamp.flow.ts`. - // - // ⚠️ `status: 'escalated'` MUST stay in this node, and not only because - // it is user-writable: it is the trigger both escalation hooks key off — - // `case_escalation_reassign` (`_case-assignment.ts`) gates on - // `input.status !== 'escalated' || previous.status === 'escalated'`, and - // `case_status_side_effects` (`case.hook.ts`) reads the same transition. - // Keeping it here keeps the ownership hand-off and the side-effect tasks - // firing from the ACTING USER's write, exactly as they did before the - // split. Moving it into the elevated subflow would silently re-attribute - // both to the system. - // - // It is also what suppresses a double-fire of the automatic - // `case_escalation` record-change flow. - id: "escalate", - type: "update_record", - label: "Escalate Case", - config: { - objectName: "crm_case", - filter: { id: cel2`recordId` }, - fields: { - escalation_reason: cel2`reason`, - status: "escalated", - priority: "critical" - } - } - }, - { - // The ELEVATED half, and the only elevation in this flow: one - // `runAs: 'system'` flow, one `update_record`, two readonly columns. - // The maintainer-approved direction — elevate the write, not the flow. - // - // ⚠️ THIS NODE MUST RUN AFTER `escalate`, NOT BEFORE. `crm_case`'s - // `escalation_reason_required` validation rejects any write whose merged - // record has `is_escalated == true` and a blank `escalation_reason`. The - // reason is written by the node above, so by the time the flag flips it - // is already stored. Reversing these two nodes fires that validation - // against a record with no reason yet and the stamp is rejected. - // - // ⛔ Do not "simplify" this by giving THIS flow `runAs: 'system'` and - // folding the stamp back into the node above. That is option A, costed - // and explicitly not adopted: it elevates every write this screen flow - // makes and stops it carrying the acting user's context downstream. - // `AGENTS.md` house rule 9 states it as standing policy. - id: "stamp_escalation", - type: "subflow", - label: "Stamp Escalation Flags", - config: { - flowName: "case_escalation_stamp", - input: { recordId: cel2`recordId` } - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "screen_1", type: "default" }, - { id: "e2", source: "screen_1", target: "escalate", type: "default" }, - { id: "e3", source: "escalate", target: "stamp_escalation", type: "default" }, - { id: "e4", source: "stamp_escalation", target: "end", type: "default" } - ] -}; -var CloseCaseFlow = { - name: "close_case", - label: "Close Case", - description: "Collect the resolution, then close the case and stop the SLA clock.", - type: "screen", - status: "active", - // `is_closed` is a readonly lifecycle field. This trusted screen flow owns - // the transition and must therefore run with the system writer. - // - // ⛔ A HISTORICAL PRECEDENT, NOT A POLICY — do not cite this line to justify - // elevating another screen flow (#1434, the maintainer ruling that settled - // it). The standing rule is the opposite one: a screen flow stays - // `runAs: 'user'` and a write that genuinely needs elevation is split into a - // dedicated `system` sub-flow reached by a `subflow` node — see - // `escalate_case` above and `src/service/flows/case-escalation-stamp.flow.ts`. - // "Readonly stripped my write, so I made the flow system" is the pattern - // that ruling exists to stop being copied; `AGENTS.md` house rule 9 carries - // it as house policy. This flow predates that rule and has not been - // re-shaped to match it. - runAs: "system", - variables: [ - { name: "recordId", type: "text", isInput: true, isOutput: false }, - { name: "resolution", type: "text", isInput: true, isOutput: false }, - { name: "resolved_by_article", type: "text", isInput: true, isOutput: false } - ], - nodes: [ - { id: "start", type: "start", label: "Start", config: { objectName: "crm_case" } }, - { - // The "attach the article that resolved it" affordance. Optional - // on purpose: most cases are not resolved out of the knowledge base, and - // a required field here would be answered with a junk value rather than - // left honest — which is worse than an absent link for a measure whose - // whole job is to say how OFTEN the KB resolves a case. - // - // `reference` names the object the picker offers. Up to - // `@objectstack/spec@17.4.0` a screen field had no such key, so this - // `type: 'lookup'` field had nothing to resolve a record picker from; - // 17.5.0 added `reference` to `ScreenFieldConfigSchema` and made it - // REQUIRED on a lookup screen field (#17913) — the stack does not load - // without it. It is the same target the case's own `resolved_by_article` - // lookup declares (`crm_knowledge_article`). - // - // The `Resolved by Article` lookup in the case's Resolution group, on the - // record form, writes the same column; the action is - // `refreshAfter: true`, so the record form is what the agent lands on - // immediately after closing. - id: "screen_1", - type: "screen", - label: "Close Case", - config: { - fields: [ - { name: "resolution", label: "Resolution", type: "textarea", required: true }, - { - name: "resolved_by_article", - label: "Resolved by Article (optional)", - type: "lookup", - reference: "crm_knowledge_article", - required: false - } - ] - } - }, - { - // `resolved_by_article` is written unconditionally, and a blank one is - // normalised to NULL by `case_resolution_article_normalize` - // (`src/service/objects/case.hook.ts`) rather than branched around here: MEASURED - // on the real engine, a screen field left empty resumes as `''` and lands - // as an empty string, which `count(resolved_by_article)` counts. A - // `decision` node could not have branched it either — this repo has - // measured `decision.config.condition` to be inert metadata - // (`test/win-loss-capture.test.ts`'s table of five such surfaces). - // - // The read is guarded because the field is optional: a resume that omits - // it leaves the variable unbound, which the 17.x template wrote as nothing - // (the stored link left alone) and CEL refuses. The guard writes NULL - // there — the value a blank field already lands as after the normalize - // hook — so an omitted answer and an empty one now close the case alike. - id: "close", - type: "update_record", - label: "Close Case", - config: { - objectName: "crm_case", - filter: { id: cel2`recordId` }, - fields: { - is_closed: true, - resolution: cel2`resolution`, - status: "closed", - resolved_by_article: cel2`has(vars.resolved_by_article) ? resolved_by_article : null` - } - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "screen_1", type: "default" }, - { id: "e2", source: "screen_1", target: "close", type: "default" }, - { id: "e3", source: "close", target: "end", type: "default" } - ] -}; -var CLAIM_STATUS_LABEL = { - in_progress: "In Progress", - waiting_customer: "Waiting on Customer", - waiting_support: "Waiting on Support" -}; -var CLAIM_STATUS_OPTIONS = CLAIMABLE_TARGET_STATUSES.map((value) => ({ - value, - label: CLAIM_STATUS_LABEL[value] -})); -var ClaimCaseFlow = { - name: "claim_case", - label: "Claim Case", - description: "Take an unowned case out of triage by moving it to a status that means you are on it.", - type: "screen", - status: "active", - // Load-bearing, not boilerplate — see the header. A system run claims nobody. - runAs: "user", - variables: [ - // MUST be `recordId` — the console's flow-action contract seeds only that - // name (and its camelCase object alias); a custom name arrives undefined. - { name: "recordId", type: "text", isInput: true, isOutput: false }, - { name: "claimStatus", type: "text", isInput: true, isOutput: false } - ], - nodes: [ - { id: "start", type: "start", label: "Start", config: { objectName: "crm_case" } }, - { - id: "screen_1", - type: "screen", - label: "Claim Case", - config: { - fields: [ - { - name: "claimStatus", - label: "Working status", - type: "select", - required: true, - defaultValue: "in_progress", - options: CLAIM_STATUS_OPTIONS - } - ] - } - }, - { - // ⛔ `status` is the ONLY field this node may ever carry. Adding - // `owner_id` here does not "make the claim explicit" — it makes the write - // refused by the transfer gate before any hook runs, and it takes - // `case_self_claim` out of the path on the one caller it would reach. - // The guard beside this file fails on any such addition. - id: "claim", - type: "update_record", - label: "Claim Case", - config: { - objectName: "crm_case", - filter: { id: cel2`recordId` }, - fields: { - status: cel2`claimStatus` - } - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "screen_1", type: "default" }, - { id: "e2", source: "screen_1", target: "claim", type: "default" }, - { id: "e3", source: "claim", target: "end", type: "default" } - ] -}; - -// src/service/flows/case-escalation-stamp.flow.ts -import { cel as cel3 } from "@objectstack/spec"; -var CaseEscalationStampFlow = { - name: "case_escalation_stamp", - label: "Stamp Case Escalation", - description: "Write the two readonly escalation stamps (is_escalated, escalated_date) with the system context. Called by escalate_case through a subflow node.", - type: "autolaunched", - status: "active", - // ⭐ THE ENTIRE POINT OF THIS FILE. This is the only elevation in the - // escalate path, and it covers exactly one `update_record` node. - runAs: "system", - variables: [ - // Supplied by the caller's `subflow` node, whose `input` envelope reads its own `recordId`. - { name: "recordId", type: "text", isInput: true, isOutput: false } - ], - nodes: [ - // `config: {}` matches the shape measured in - // `test/readonly-write-semantics.test.ts`: an autolaunched callee is handed - // its params by the `subflow` executor and resolves no trigger record of - // its own, so there is no `objectName` for the start node to load. - { id: "start", type: "start", label: "Start", config: {} }, - { - id: "stamp", - type: "update_record", - label: "Stamp Escalation Flags", - config: { - objectName: "crm_case", - filter: { id: cel3`recordId` }, - // ⛔ Do not add fields here. Every column in this node is written with - // the elevated context; anything a user can legitimately type belongs - // in `escalate_case` instead. - fields: { - is_escalated: true, - escalated_date: cel3`isoDatetime(now())` - } - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "stamp", type: "default" }, - { id: "e2", source: "stamp", target: "end", type: "default" } - ] -}; - -// src/service/flows/case-sla-monitor.flow.ts -import { P as P11, cel as cel4 } from "@objectstack/spec"; - -// src/sales/flows/_guarded-iteration.ts -var guarded = (key, region) => ({ - nodes: [{ - id: `guard_${key}`, - type: "try_catch", - label: "Guarded Iteration", - config: { - try: region, - catch: { nodes: [{ id: `handled_${key}`, type: "assignment", label: "Skip This Item" }] } - } - }] -}); - -// src/service/flows/case-sla-monitor.flow.ts -var CASE_HAS_OWNER = () => P11`has(vars.currentCase) && has(vars.currentCase.owner_id) - && vars.currentCase.owner_id != null && string(vars.currentCase.owner_id).trim() != ""`; -var CASE_HAS_NO_OWNER = () => P11`has(vars.currentCase) && (!has(vars.currentCase.owner_id) - || vars.currentCase.owner_id == null || string(vars.currentCase.owner_id).trim() == "")`; -var CaseSlaMonitorFlow = { - name: "case_sla_monitor", - label: "Case SLA Monitor", - description: "Hourly sweep: flag and escalate open cases that have breached their SLA due date.", - type: "schedule", - status: "active", - // Scheduled runs have no trigger user, so under the default runAs:'user' the - // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that - // RLS-bypassing elevation explicit and intended (ADR-0049). - runAs: "system", - variables: [], - nodes: [ - { id: "start", type: "start", label: "Start (hourly)", config: { schedule: "0 * * * *" } }, - { - id: "query_breached", - type: "get_record", - label: "Find Breached Cases", - config: { - objectName: "crm_case", - // ⛔ `$nin` on `status`, never `is_closed: false`: a case in `resolved` - // has met its SLA — work is finished — but `is_closed` only flips on - // `closed`, so the boolean filter stamps false breaches on resolved - // cases and drags them back to `escalated`. - // - // `$lt` is `caseSlaBreached` (`src/service/objects/_case-sla.ts`) read - // with "now" as the instant: STRICTLY past due. Its other half is - // `case_sla_defaults`, which applies the same rule on the write that - // settles a case — so a case settled late is flagged even when this - // sweep never reached it, or never runs (#2070). - // - // "Now" is the query engine's own `{now}` placeholder, which an - // 18.0.0-next.0 filter operand leaves to the engine as written. It - // renders the instant's ISO text, as the retired `{NOW()}` flow token - // did, and it is the spelling the SLA Violations tile reads, so the - // sweep and the tile say "past due" in one wording. - filter: { - status: { $nin: ["resolved", "closed"] }, - is_sla_violated: false, - sla_due_date: { $lt: "{now}" } - }, - limit: 500, - outputVariable: "caseList" - } - }, - { - id: "loop_cases", - type: "loop", - label: "For Each Breached Case", - config: { - collection: cel4`caseList`, - iteratorVariable: "currentCase", - body: guarded("case", { - nodes: [ - { - id: "flag_breach", - type: "update_record", - label: "Flag SLA Breach", - config: { - objectName: "crm_case", - filter: { id: cel4`currentCase.id` }, - // `escalation_reason` must accompany `is_escalated: true` — the - // object's `escalation_reason_required` validation (severity: - // error) rejects the whole write otherwise, turning this sweep - // into a silent no-op (cf. the same fix in case_escalation). - fields: { - is_sla_violated: true, - is_escalated: true, - status: "escalated", - escalated_date: cel4`isoDatetime(now())`, - escalation_reason: "Auto-escalated: SLA due date breached" - } - } - }, - { - // Gateway only — the predicate lives on the out-edge. - // - // `crm_case.owner_id` is NULLABLE and an unowned case is an - // ordinary state (this repo ships `scripts/backfill-owner-id.ts` / - // `pnpm backfill:owner` precisely because ownerless rows happen; - // ordinary REST creation and import reach it too). The `notify` - // node below addresses exactly one recipient, so an ownerless case - // left it with an empty slate — which the builtin node treats as a - // HARD failure, and that failure is not scoped to the one case: - // `executeNode` throws, `runRegion` rethrows, and the `loop` node - // awaits it with no try/catch, so the whole sweep died on the - // ownerless row and every breached case ORDERED BEHIND IT was - // never even flagged. Measured, not assumed — see - // `test/flow-sla-ownerless-case.test.ts`. - // - // The gate sits AFTER `flag_breach` on purpose. `flag_breach` is - // unconditional, so an ownerless breach is still RECORDED on the - // record — visible in views and reports, where a service manager - // finds it. Gating both would trade a dead run for a silently - // dropped alert on exactly the cases most likely to be neglected. - // - // The ownerless branch is not a dead end: it goes to - // `reload_case`, because by the time the gate is reached the - // sweep's own write may ALREADY HAVE GIVEN THE CASE AN OWNER — - // see that node (maintainer ruling 2026-09-03, option C). - id: "check_owner", - type: "decision", - label: "Case Has an Owner?" - }, - { - // Re-read the case the sweep just wrote. - // - // ⚠️ THE ASSIGNMENT IS NOT AUTHORED HERE, AND MUST NOT BE. - // `flag_breach` writes `status: 'escalated'`, and that IS the - // escalation transition `case_escalation_reassign` - // (`src/service/objects/_case-assignment.ts`, `beforeUpdate`, priority - // 250) fires on: it stamps the least-loaded holder of the - // `service_manager` position onto the payload of the update - // already in flight. So the sweep does not need a seam to "call" - // the assignment — performing the transition IS putting the case - // through it, and the app keeps ONE answer to "who should own - // this case" instead of a flow-shaped second implementation of - // least-loaded balancing. - // - // MEASURED, not assumed (`test/flow-sla-ownerless-case.test.ts` - // drives the real flow, the real engine and the real hooks): with - // a staffed pool an ownerless breached case comes back owned; with - // an empty pool the hook stands down and the case comes back - // ownerless. No second write, no re-entry, no loop — the hook - // mutates the in-flight payload and issues no operation of its - // own. - // - // ⛔ The READ is what this node is for, not a second write: - // `currentCase` is the loop item bound by `query_breached` BEFORE - // `flag_breach` ran, so the owner the sweep just assigned is - // invisible to it and `{currentCase.owner_id}` addresses the - // pre-write state. Re-binding the SAME variable is what makes the - // rest of the iteration — the gate below and the notify node's - // whole template — read the case as it now stands, with no second - // notify node to keep in step. - // - // No `limit`: `get_record` calls `findOne` at or below 1 and binds - // the single row itself, which is what `{currentCase.}` - // needs. A miss binds `null` — `get_record` always binds — which - // `check_assigned` below is there to read. - id: "reload_case", - type: "get_record", - label: "Re-read Case After Escalation", - config: { - objectName: "crm_case", - filter: { id: cel4`currentCase.id` }, - outputVariable: "currentCase" - } - }, - { - // Gateway only — the predicate lives on the out-edge. - // - // The ruled empty-pool clause, as a gate rather than a failure: - // when the `service_manager` pool resolves empty the hook assigns - // nobody, the re-read case is still ownerless, no edge matches and - // the iteration ends. The breach stays on the record and in the - // run summary, the notification is skipped at a NAMED gate, and - // the run survives. ⛔ No hard failure, no fallback recipient, no - // manager-chain dot-walk. - id: "check_assigned", - type: "decision", - label: "Escalation Found an Owner?" - }, - { - // Owner only: `{currentCase.owner_id.manager}` cannot traverse a - // lookup in flow templates — it interpolates to the literal - // "undefined" (cf. case_escalation / opportunity_won_alert). - // - // Reached from BOTH gates, and the whole template reads - // `currentCase` either way: on the owned branch that is the row - // `query_breached` bound, on the ownerless branch the row - // `reload_case` re-bound. One node, one wording, one recipient - // rule — a second notify node would be the same alert authored - // twice, free to drift on the half nobody is looking at. - // - // ⚠️ THE RECIPIENT IS RULED, NOT INCIDENTAL — #1535, maintainer - // ruling 2026-09-07, option A. On a breached - // case that ALREADY HAS AN OWNER, `flag_breach` writes - // `status: 'escalated'` and `case_escalation_reassign` hands the - // case to the least-loaded `service_manager` inside that same - // write — yet this node addresses `currentCase` as - // `query_breached` bound it, BEFORE the hand-off. So the breach - // alert deliberately reaches the agent the case is being taken - // FROM, not the manager who now owns it. - // - // It is the SAME etiquette `case_escalation` already states in - // `content/docs/service/sla-and-escalation.mdx` — "the - // notification goes to the previous owner alone" — and that page - // now states it for this sweep too. One escalation etiquette - // across both mechanisms. - // - // ⛔ Do not "fix" this into an alert for the new owner. That is - // option C, and it would have to re-rule `case_escalation` in the - // same stroke — ⛔ never one mechanism only. - // - // `test/flow-sla-ownerless-assignment.test.ts` pins the pairing - // (the owned breach IS handed over AND its alert still goes to - // the pre-hand-off owner), and records the ruling's declared gap - // as measured: the hand-off hook issues no notice of its own, so - // the receiving manager is told nothing by this run. - id: "notify_team", - type: "notify", - label: "Alert Owner", - config: { - // Owner only — `{currentCase.owner_id.manager}` dot-walks a - // lookup, which flow templates interpolate as "undefined". - recipients: [cel4`currentCase.owner_id`], - channels: ["inbox", "email"], - severity: "critical", - topic: "case_sla_breach", - template: "crm.case_sla_breach", - templateData: { - case_number: cel4`currentCase.case_number`, - priority: cel4`currentCase.priority` - }, - actionUrl: "/crm_case/{{currentCase.id}}" - } - } - ], - edges: [ - { id: "b1", source: "flag_breach", target: "check_owner", type: "default" }, - // The two out-edges of `check_owner` are an exact PARTITION of the - // cases where `currentCase` is bound (see {@link CASE_HAS_OWNER} / - // {@link CASE_HAS_NO_OWNER}) — never a `default` edge alongside a - // conditional one, which would traverse BOTH and notify twice. - // - // ⚠️ The owned branch reads `currentCase` as `query_breached` bound - // it, deliberately: a case that already had an - // owner keeps alerting THAT owner, which is what the sweep has - // always done. ⚠️ That is RULED intent now, no longer an open - // question — the `notify_team` node carries the ruling. - { id: "b2", source: "check_owner", target: "notify_team", type: "conditional", condition: CASE_HAS_OWNER(), label: "Has owner" }, - { id: "b3", source: "check_owner", target: "reload_case", type: "conditional", condition: CASE_HAS_NO_OWNER(), label: "No owner \u2014 re-read after escalation" }, - { id: "b4", source: "reload_case", target: "check_assigned", type: "default" }, - // Both branches converge on the ONE notify node, which is why the - // re-read re-binds `currentCase` rather than a second variable: the - // recipient, the title, the message and the action URL are authored - // once and cannot drift into two versions of the same alert. - // - // A gate with no matching edge simply ends the iteration, so an - // ownerless case the pool could not place is skipped and the loop - // moves on to the next breached case — the run survives, which is - // the property this flow was repaired for. - { id: "b5", source: "check_assigned", target: "notify_team", type: "conditional", condition: CASE_HAS_OWNER(), label: "Escalation assigned an owner" } - ] - }) - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "query_breached", type: "default" }, - { id: "e2", source: "query_breached", target: "loop_cases", type: "default" }, - { id: "e3", source: "loop_cases", target: "end", type: "default" } - ] -}; - -// src/service/objects/article_feedback.hook.ts -var articleFeedbackMetricsRefresh = { - name: "article_feedback_metrics_refresh", - object: "crm_article_feedback", - events: ["afterInsert", "afterUpdate", "afterDelete"], - priority: 800, - async: true, - onError: "log", - runAs: "system", - description: "Recount an article\u2019s helpful / not-helpful votes from crm_article_feedback.", - handler: async (ctx) => { - const api = ctx.api; - if (!api) return; - const { input } = ctx; - const previous = ctx.previous; - const articleIds = Array.from(new Set([ - typeof input?.crm_knowledge_article === "string" ? input.crm_knowledge_article : "", - typeof previous?.crm_knowledge_article === "string" ? previous.crm_knowledge_article : "" - ].filter(Boolean))); - for (const id of articleIds) { - const helpful = await api.object("crm_article_feedback").count({ - where: { crm_knowledge_article: id, verdict: "helpful" } - }); - const notHelpful = await api.object("crm_article_feedback").count({ - where: { crm_knowledge_article: id, verdict: "not_helpful" } - }); - await api.object("crm_knowledge_article").update({ - id, - helpful_count: helpful, - not_helpful_count: notHelpful - }, { where: { id } }); - } - } -}; -var article_feedback_hook_default = [articleFeedbackMetricsRefresh]; - -// src/service/objects/case.hook.ts -var caseValidation = { - name: "case_sla_defaults", - object: "crm_case", - events: ["beforeInsert", "beforeUpdate"], - priority: 200, - description: "Apply the priority \xD7 account-tier SLA matrix and the case lifecycle defaults.", - handler: async (ctx) => { - if (ctx.event === "beforeUpdate" && ctx.dispatch?.mode === "per-row") return; - const { input } = ctx; - const api = ctx.api; - const isGuestSubmission = !ctx.previous && !ctx.user?.id && !ctx.session?.isSystem; - if (isGuestSubmission) { - if (!input.origin) input.origin = "web"; - if (!input.status) input.status = "new"; - input.owner_id = null; - input.is_escalated = false; - input.escalation_reason = null; - input.internal_notes = null; - input.resolution = null; - } - const priority = typeof input.priority === "string" && input.priority || typeof ctx.previous?.priority === "string" && ctx.previous.priority || void 0; - if (priority) { - const rank = { low: 1, medium: 2, high: 3, critical: 4 }; - input.priority_rank = rank[priority] ?? 0; - } - if (priority && !input.sla_due_date && !ctx.previous?.sla_due_date) { - const slaCalendarHours = { - critical: { strategic: 4, enterprise: 4, mid_market: 4, smb: 4 }, - high: { strategic: 6, enterprise: 8, mid_market: 8, smb: 8 }, - medium: { strategic: 24, enterprise: 36, mid_market: 48, smb: 48 }, - low: { strategic: 96, enterprise: 120, mid_market: 168, smb: 168 } - }; - const DEFAULT_TIER = "smb"; - const row = slaCalendarHours[priority]; - if (row) { - let tier = DEFAULT_TIER; - const variesByTier = row.strategic !== row.enterprise || row.enterprise !== row.mid_market || row.mid_market !== row.smb; - const accountId = typeof input.crm_account === "string" && input.crm_account || typeof ctx.previous?.crm_account === "string" && ctx.previous.crm_account || void 0; - if (variesByTier && accountId && api) { - try { - const found = await api.object("crm_account").find({ - where: { id: accountId }, - fields: ["tier"], - top: 1 - }); - const rows = Array.isArray(found) ? found : []; - const stored = rows.length ? rows[0].tier : void 0; - if (typeof stored === "string" && stored) tier = stored; - } catch { - } - } - const hours = row[tier] ?? row[DEFAULT_TIER]; - input.sla_due_date = new Date(Date.now() + hours * 36e5).toISOString(); - } - } - const effStatus = typeof input.status === "string" && input.status || typeof ctx.previous?.status === "string" && ctx.previous.status || void 0; - if (typeof effStatus === "string") input.is_closed = effStatus === "closed"; - if (!isGuestSubmission) { - const becameClosed = input.status === "closed" && ctx.previous?.status !== "closed"; - if (becameClosed && !input.closed_date && !ctx.previous?.closed_date) { - input.closed_date = (/* @__PURE__ */ new Date()).toISOString(); - } - const closedDate = typeof input.closed_date === "string" && input.closed_date || typeof ctx.previous?.closed_date === "string" && ctx.previous.closed_date || void 0; - const createdDate = typeof input.created_at === "string" && input.created_at || typeof ctx.previous?.created_at === "string" && ctx.previous.created_at || void 0; - if (closedDate && createdDate) { - const hrs = (new Date(closedDate).getTime() - new Date(createdDate).getTime()) / 36e5; - if (Number.isFinite(hrs) && hrs >= 0) input.resolution_time_hours = Math.round(hrs * 10) / 10; - } - const settledStatuses = ["resolved", "closed"]; - if (settledStatuses.includes(String(effStatus)) && !settledStatuses.includes(String(ctx.previous?.status))) { - const due = input.sla_due_date !== void 0 ? input.sla_due_date : ctx.previous?.sla_due_date; - const stoppedAt = typeof input.closed_date === "string" && input.closed_date || (/* @__PURE__ */ new Date()).toISOString(); - if (typeof due === "string" && Date.parse(due) < Date.parse(stoppedAt)) input.is_sla_violated = true; - } - } - } -}; -var caseSideEffects = { - name: "case_status_side_effects", - object: "crm_case", - events: ["afterUpdate"], - priority: 800, - async: true, - onError: "log", - description: "Open the escalation follow-up task for the account owner.", - handler: async (ctx) => { - const { input } = ctx; - const previous = ctx.previous; - if (!previous) return; - const api = ctx.api; - if (!api) return; - const caseId = typeof input.id === "string" && input.id || (typeof previous.id === "string" ? previous.id : void 0); - const accountId = typeof input.crm_account === "string" && input.crm_account || typeof previous.crm_account === "string" && previous.crm_account || void 0; - if (input.status === "escalated" && previous.status !== "escalated" && accountId) { - const account = await api.object("crm_account").findOne({ where: { id: accountId } }); - const ownerId = account?.owner_id ?? ctx.user?.id; - const due = /* @__PURE__ */ new Date(); - due.setUTCDate(due.getUTCDate() + 1); - const caseNumber = typeof previous.case_number === "string" ? previous.case_number.trim() : ""; - const caseSubject = typeof input.subject === "string" && input.subject.trim() || typeof previous.subject === "string" && previous.subject.trim() || ""; - const label = [caseNumber, caseSubject].filter(Boolean).join(" \xB7 "); - const titled = label ? `Escalated: ${label}` : "Escalated case needs attention"; - await api.object("crm_task").insert({ - subject: titled.length > 255 ? `${titled.slice(0, 254)}\u2026` : titled, - status: "not_started", - priority: "urgent", - type: "follow_up", - due_date: due.toISOString().slice(0, 10), - owner_id: ownerId, - related_to_type: "crm_case", - related_to_case: caseId, - related_to_account: accountId - }); - } - } -}; -var caseResolutionAccountActivity = { - name: "case_resolution_account_activity", - object: "crm_case", - events: ["afterUpdate"], - priority: 800, - async: true, - onError: "log", - runAs: "system", - description: "Bump the account\u2019s last activity date when a case is resolved.", - handler: async (ctx) => { - const { input } = ctx; - const previous = ctx.previous; - if (!previous) return; - if (input.status !== "resolved" || previous.status === "resolved") return; - const api = ctx.api; - if (!api) return; - const accountId = typeof input.crm_account === "string" && input.crm_account || typeof previous.crm_account === "string" && previous.crm_account || void 0; - if (!accountId) return; - await api.object("crm_account").update( - { id: accountId, last_activity_date: (/* @__PURE__ */ new Date()).toISOString().slice(0, 10) }, - { where: { id: accountId } } - ); - } -}; -var caseAutoAssign = createCaseRoundRobinAssign(); -var caseEscalationReassign = createCaseEscalationReassign(); -var caseSelfClaim = createCaseSelfClaim(); -var caseResolutionArticleNormalize = { - name: "case_resolution_article_normalize", - object: "crm_case", - events: ["beforeInsert", "beforeUpdate"], - priority: 150, - description: "Normalise a blank resolved_by_article to null so the deflection measure counts only real links.", - handler: async (ctx) => { - const { input } = ctx; - if (!("resolved_by_article" in input)) return; - const value = input.resolved_by_article; - if (value === "" || value === void 0) { - input.resolved_by_article = null; - return; - } - if (typeof value === "string" && value.trim() === "") { - input.resolved_by_article = null; - } - } -}; -var case_hook_default = [ - caseValidation, - caseAutoAssign, - caseEscalationReassign, - caseSelfClaim, - caseResolutionArticleNormalize, - caseSideEffects, - caseResolutionAccountActivity -]; - -// src/service/objects/knowledge_article.hook.ts -var knowledgeArticlePublish = { - name: "knowledge_article_publish_timestamps", - object: "crm_knowledge_article", - events: ["beforeInsert", "beforeUpdate"], - priority: 300, - description: "Stamp published_at on the first publish; refresh last_reviewed_at while published.", - handler: async (ctx) => { - if (ctx.event === "beforeUpdate" && ctx.dispatch?.mode === "per-row") return; - const { input } = ctx; - const previous = ctx.previous; - const nextStatus = typeof input.status === "string" && input.status || previous?.status; - if (nextStatus !== "published") return; - const nowIso = (/* @__PURE__ */ new Date()).toISOString(); - input.last_reviewed_at = nowIso; - const existing = input.published_at ?? previous?.published_at; - if (existing === void 0 || existing === null || existing === "") { - input.published_at = nowIso; - } - } -}; -var knowledge_article_hook_default = knowledgeArticlePublish; - -// src/service/pages/case_detail.page.ts -var CaseDetailPage = { - name: "case_detail_page", - label: "Case Detail", - description: "Service-agent case record: highlights, SLA path, details and activity timeline.", - type: "record", - object: "crm_case", - template: "full-width", - kind: "full", - variables: [ - { name: "activeTab", type: "string", defaultValue: "details" } - ], - regions: [ - { - name: "header", - width: "full", - components: [ - { - type: "page:header", - id: "case_header", - label: "Case Information", - properties: { - title: "{case_number} \xB7 {subject}", - // The lookup field is `crm_account` — `{account}` matched nothing - // and the subtitle rendered blank. - subtitle: "{crm_account}", - // `icon` removed from `page:header` in @objectstack/spec 17.0.0 - // (#6946, ADR-0087 D2) — deleted, not renamed. See the full note on - // `account_detail.page.ts`; nothing ever drew it. - // `breadcrumb` retired from `page:header` in @objectstack/spec 17.6.0 - // (#20785, `page-header-breadcrumb-removed`) — deleted: no renderer - // ever drew a trail for it; the app shell's own trail is unchanged. - // Action IDs, not `ActionDef` objects: `PageHeaderProps.actions` is - // `z.array(z.string())` ("Action IDs to show in header") in - // @objectstack/spec 17.3.0, and this repo authors against the - // protocol (#1653). Each id is the `name` of a crm_case-scoped - // action — `claim_case` / `escalate_case` / `close_case` in - // `src/service/actions/case.actions.ts`, the activity trio in - // `src/service/actions/case-activity.actions.ts`. - // - // This list is the whole header (#2072, the #592 sentence on - // `lead_detail.page.ts`): an action it does not name is reachable - // only from the list row's ⋮ menu, which is how an agent on an - // unowned case had to go back to the list to claim it, and could - // not log or book a meeting here at all. Each action's own - // `visible` still decides when it shows — `claim_case` only on an - // ownerless open case. `claim_case` goes FIRST because the header - // draws three buttons inline and folds the rest into ⋯: on an - // ownerless case claiming is the gesture, and on an owned one it - // is hidden, so the inline three stay escalate / close / call. - // `test/action-references.test.ts` holds this list to every - // crm_case action placed at `record_header`. - actions: ["claim_case", "escalate_case", "close_case", "log_call", "log_meeting", "schedule_meeting"] - } - }, - { - type: "record:highlights", - id: "case_highlights", - label: "Key Information", - properties: { - // crm_case carries a single `sla_due_date` plus the derived - // `is_sla_violated` flag — the split response/resolution deadlines - // named here do not exist, so the agent's most time-critical fact - // was missing from the strip entirely. - fields: [ - "status", - "priority", - "sla_due_date", - "is_sla_violated", - "owner_id", - "crm_account" - ] - } - }, - { - type: "record:path", - id: "case_status_path", - label: "Case Status Path", - properties: { - statusField: "status", - stages: [ - { value: "new", label: "New" }, - { value: "in_progress", label: "In Progress" }, - // The status option is `waiting_customer`; the longer spelling - // matched no option, so this stage never lit up and rendered - // untranslated next to its neighbours. - { value: "waiting_customer", label: "Waiting on Customer" }, - { value: "escalated", label: "Escalated" }, - { value: "resolved", label: "Resolved" }, - { value: "closed", label: "Closed" } - ] - } - } - ] - }, - { - name: "main", - width: "large", - components: [ - { - type: "page:tabs", - id: "case_main_tabs", - properties: { - // `type` → `tabStyle` (@objectstack/spec 17.0.0, #6776, ADR-0087 - // D2). Same concept, same three values (`line` | `card` | `pill`); - // the rename exists because a props key called `type` collides with - // the component node's own dispatch key and is unauthorable in the - // flat and JSX carriers. See the full note on `home.page.ts`. - tabStyle: "line", - position: "top", - items: [ - { - // Tab item `key` → `value` (#1269). `value` is the stable - // `?tab=` URL token the renderer reads (`it.value`, falling back - // to an index-derived `tab-`); `key` is read by nothing, so - // these tabs were addressable only as `tab-0`/`tab-1`/`tab-2`, - // which point at different tabs the moment the item list - // changes. `PageTabsProps`' own alias table answers `key` with - // `value` for exactly this reason. - value: "details", - label: "Details", - children: [ - { - type: "record:details", - id: "case_details", - label: "Case Details", - properties: { - // `columns` is a STRING enum ('1'|'2'|'3'|'4') in - // @objectstack/spec 17, and `layout` was removed there - // (#6946 / ADR-0087 D2). - columns: "2", - // Every section references one of crm_case's `fieldGroups` - // (#970, the #806 class ruling C): the renderer derives - // members, label, icon and collapse state from the object, - // so this page curates only the order. The full note — - // what a group section does on 17.6.0 and what may not sit - // beside `group` — is on `lead_detail.page.ts`. - // - // The highlights strip still wins (#1211): the renderer - // drops what `record:highlights` registered (`status`, - // `priority`, `sla_due_date`, `is_sla_violated`, - // `owner_id`, `crm_account`) and the title candidate - // `subject` from the derived members. - // - // `escalated_date` — written by three flows and shown - // nowhere until now (#970) — arrives with the `escalation` - // group, beside `is_escalated` and `escalation_reason`. - // - // `internal_notes` (#1428) is in the `system` group with - // `is_closed`. A group whose members are ALL empty renders - // nothing, but a boolean always holds a value, so `system` - // renders on every case and an unwritten `internal_notes` - // stays reachable the way every empty field here is: the - // section's "Show N empty fields" toggle, then inline edit. - // ⛔ Not the create form — `/new` and edit both resolve - // `view.form`, and `case.hook.ts` nulls the column for - // anonymous web-to-case submissions. - // - // `resolution` / `resolved_by_article` render once the case - // carries one; `close_case` is the flow that collects the - // resolution. - // - // `hideEmpty: false` (#2003, the #1211 reasoning) only on - // `origin`: with `owner_id` in the strip, its one member is - // the channel an agent picks, and without the key the - // section vanishes on a new case. Not on `sla`: outside - // the strip its members are stamps no one types - // (`closed_date` and `resolution_time_hours` at close, - // `first_response_date` by `event.hook.ts`), so the key - // would draw empty rows to look at, not to fill. - sections: [ - { group: "basic" }, - { group: "origin", hideEmpty: false }, - { group: "sla" }, - { group: "escalation" }, - { group: "resolution" }, - { group: "system" } - ] - } - } - ] - }, - { - value: "related", - label: "Related", - children: [ - { - type: "page:accordion", - id: "case_related_accordion", - properties: { - items: [ - { - // An accordion item `key` is DELETED, not renamed to - // `value` — the opposite verdict to the tab items - // above, and the difference is a read point (#1269). - // `PageAccordionProps`' item shape is - // `{ label, icon?, collapsed?, children }` and it - // prescribes AGAINST `value` by name: the renderer - // maps every item to `{ ...it, value: `panel-` }` - // before rendering, so an authored value is - // overwritten. `page:tabs` really does read `it.value`; - // `page:accordion` does not. Nothing addresses these - // panels, so the identifier has nowhere to land. - label: "Open Tasks", - children: [ - { - type: "record:related_list", - id: "case_tasks", - properties: { - objectName: "crm_task", - relationshipField: "related_to_case", - columns: [ - "subject", - "status", - "priority", - "due_date", - "owner_id" - ], - filter: [ - { field: "status", operator: "not_equals", value: "completed" } - ], - limit: 10 - } - } - ] - } - ] - } - } - ] - }, - { - value: "activity", - label: "Activity", - children: [ - { - type: "record:activity", - id: "case_activity", - properties: { - filterMode: "all", - showFilterToggle: true, - limit: 25, - unifiedTimeline: true, - showCommentInput: true, - enableMentions: true, - enableReactions: true, - enableThreading: true, - // Load-bearing (#2071): a call or meeting logged on the - // case is a `sys_activity` row of type `completed` (the - // `task` feed kind), and the renderer drops every such - // row unless this is true — so an agent's logged call - // never reached this tab. The case's other `completed` - // writers are its own `resolved` / `closed` milestones - // (`case.object.ts`), which belong on this timeline too. - // Completed crm_task rows do NOT arrive here: a task's - // audit rows are keyed to the task, and this feed reads - // only rows keyed to the case. No `types` filter, unlike - // the lead page: this timeline mixes comments and field - // changes on purpose (`unifiedTimeline` above). - showCompleted: true - } - } - ] - } - ] - } - } - ] - } - ], - isDefault: true, - aria: { - ariaLabel: "Case Detail Page", - ariaDescribedBy: "Service-agent case detail view with SLA path, details, related items and activity timeline." - } -}; - -// src/service/reports/case.report.ts -var CasesByStatusPriorityReport = { - name: "cases_by_status_priority", - label: "Cases by Status and Priority", - description: "Summary of cases by status and priority", - // The chart counts cases, so `case_count` must be selected alongside the - // resolution time — and the yAxis must name that MEASURE ('case_number' - // was a raw-field name that exists in no dataset, so the axis was empty). - dataset: "case_metrics", - rows: ["status", "priority"], - values: ["case_count", "avg_resolution"], - type: "summary", - chart: { type: "bar", title: "Cases by Status", showLegend: true, xAxis: "status", yAxis: "case_count" } -}; -var SlaPerformanceReport = { - name: "sla_performance", - label: "SLA Performance Report", - description: "Analysis of SLA compliance", - // 'avg_sla_violated' (not a duplicated 'case_count') — the table showed two - // identical Cases columns and no violation measure; the chart's yAxis must - // name a dataset MEASURE, not a raw field ('is_sla_violated' leaked the - // column name onto the axis). - dataset: "case_metrics", - rows: ["priority"], - values: ["case_count", "avg_sla_violated", "avg_resolution"], - type: "summary", - runtimeFilter: { is_closed: true }, - chart: { type: "column", title: "SLA Violations by Priority", showLegend: false, xAxis: "priority", yAxis: "avg_sla_violated" } -}; -var CasesOpenedByDayPriorityReport = { - name: "cases_opened_by_day_priority", - label: "Cases Opened by Priority \xD7 Day", - description: "Daily case inflow split by priority", - dataset: "case_metrics", - rows: ["priority"], - columns: ["created_at"], - values: ["case_count"], - type: "matrix" -}; - -// src/service/sharing/case.sharing.ts -import { P as P12 } from "@objectstack/spec"; -var CaseEscalationSharingRule = { - name: "case_escalation_sharing", - label: "Escalated Cases Sharing", - object: "crm_case", - type: "criteria", - condition: P12`record.priority == "critical" && record.is_closed == false`, - accessLevel: "edit", - sharedWith: { type: "position", value: "service_manager" } -}; -var CaseDirectorSharingRule = { - name: "case_director_sharing", - label: "Escalated Cases \u2014 Service Director", - object: "crm_case", - type: "criteria", - condition: P12`record.priority == "critical" && record.is_closed == false`, - accessLevel: "read", - sharedWith: { type: "position", value: "service_director" } -}; -var CaseUnassignedTriageSharingRule = { - name: "case_unassigned_triage_sharing", - label: "Unassigned Cases \u2014 Triage", - object: "crm_case", - type: "criteria", - condition: P12`record.owner_id == null && record.status != "resolved" && record.status != "closed"`, - accessLevel: "edit", - sharedWith: { type: "position", value: "service_agent" } -}; - -// src/service/skills/case-triage.skill.ts -import { defineSkill } from "@objectstack/spec"; -var CaseTriageSkill = defineSkill({ - name: "case_triage", - label: "Case Triage", - description: "Triages a support case, assigns a priority with its justification, and points at the escalate/close action.", - instructions: `When the user asks to triage, prioritise, or classify a case: - -1. Read the case first \u2014 call \`describe_object\` for \`crm_case\` (the - schema is alive; admins add fields), then \`get_record\` for the case - at hand. Never triage from memory of a previous turn. -2. Assign a priority yourself from what you read. There is no triage - tool and you do not need one \u2014 weigh, in order: customer tier and - contract value, whether the customer is blocked with no workaround, - how long the case has been open against its SLA, and the sentiment - of the latest customer message. -3. State the priority and the ONE reason that drove it. Cite the case - ID and the field values you used. -4. If the priority is critical, say so and point the user at - **Escalate Case** on the record header \u2014 offer a ready-to-paste - \`reason\` built from step 3. You cannot escalate yourself, and should - not imply otherwise. -5. If the case is resolved in substance, point at **Close Case** and - offer a \`resolution\` summary the user can paste. -6. For the customer-facing reply, hand off to the \`email_drafting\` - skill rather than drafting it here.`, - tools: ["describe_object", "get_record"], - triggerConditions: [ - { field: "objectName", operator: "eq", value: "crm_case" } - ] -}); - -// src/service/views/case.view.ts -import { defineView } from "@objectstack/spec/ui"; -var data = { provider: "object", object: "crm_case" }; -var CaseViews = defineView({ - list: { - type: "grid", - name: "all_cases", - label: "All Cases", - userActions: { editInline: true }, - data, - columns: [ - { field: "case_number", width: 130, sortable: true, link: true, pinned: "left" }, - { field: "subject", width: 280, sortable: true }, - { field: "crm_account", width: 180 }, - { field: "crm_contact", width: 160 }, - { field: "priority", width: 110, sortable: true }, - { field: "status", width: 130, sortable: true }, - { field: "origin", width: 120 }, - { field: "sla_due_date", width: 160, sortable: true }, - { field: "is_sla_violated", width: 110, align: "center" }, - { field: "is_escalated", width: 110, align: "center" }, - { field: "owner_id", width: 150 } - ], - // Sort on the materialised ordinal, not the select itself: `priority desc` - // compares raw strings and lands medium > low > high > critical, burying - // every critical case at the bottom of the queue. - sort: [ - { field: "priority_rank", order: "desc" }, - { field: "sla_due_date", order: "asc" } - ], - rowColor: { - field: "priority", - colors: { critical: "red", high: "orange", medium: "yellow", low: "slate" } - }, - selection: { type: "multiple" }, - pagination: { pageSize: 50 }, - // The UI door for the `allowExport` grant four profiles already hold on - // `crm_case`. Export runs on ONE server-side route - // (`GET /api/v1/data/crm_case/export`, gated by `security.canExport`), so - // this declares which formats the toolbar offers — not a second gate: a - // profile without the grant gets 403 whether it clicks the button or - // curls the route. Measured in #798/#816; before this the grant was live - // but reachable only by `curl`. - exportOptions: { formats: ["csv", "xlsx"] }, - appearance: { - showDescription: true, - allowedVisualizations: ["grid", "kanban", "calendar", "timeline"] - }, - // Binds the 'calendar' entry above: the switcher opens the same deadlines - // the dedicated `sla_calendar` view shows, on the field this list already - // sorts by. `sla_due_date` is optional — a case the SLA monitor has not - // stamped carries no date at all, which is the truthful answer; the - // alternative the platform refuses is a guessed field putting every such - // case on today. - calendar: { - startDateField: "sla_due_date", - titleField: "subject", - colorField: "priority" - } - // Escalate straight from the queue: escalate_case's own - // `locations: ['list_item']` auto-injects the row-menu item. - }, - listViews: { - /** Service workflow board */ - case_workflow: { - name: "case_workflow", - type: "kanban", - label: "Service Workflow", - data, - columns: ["case_number", "subject", "priority", "sla_due_date"], - kanban: { - groupByField: "status", - columns: ["case_number", "subject", "crm_account", "priority", "owner_id"] - }, - filter: [{ field: "is_closed", operator: "equals", value: false }], - navigation: { mode: "drawer", width: "640px" } - }, - /** SLA calendar */ - sla_calendar: { - name: "sla_calendar", - type: "calendar", - label: "SLA Calendar", - data, - columns: ["case_number", "subject", "priority"], - calendar: { - startDateField: "sla_due_date", - titleField: "subject", - colorField: "priority" - } - }, - /** Chronological case stream */ - case_timeline: { - name: "case_timeline", - type: "timeline", - label: "Case Timeline", - data, - columns: ["case_number", "subject"], - timeline: { - // `created_at`, the platform's own creation stamp — the object's - // duplicate `created_date` was removed in #1992 because nothing wrote - // it on a real case, so every user-created case started its bar at - // null. Same spelling as `deal_timeline` on crm_opportunity (#575 B2). - startDateField: "created_at", - endDateField: "closed_date", - titleField: "subject", - groupByField: "owner_id", - colorField: "status", - scale: "day" - } - }, - /** - * The agent's personal queue: the cases themselves, one row each. Its - * aggregate counterpart is service_dashboard's "My Open Cases by - * Priority" (#510) — a dashboard widget counts, it cannot list. - */ - my_open_cases: { - name: "my_open_cases", - type: "grid", - label: "My Open Cases", - userActions: { editInline: true }, - data, - columns: ["case_number", "subject", "crm_account", "priority", "status", "sla_due_date"], - // ⚠️ `status not_in CLOSED_CASE_STATUSES`, NOT `is_closed == false`: the - // flag is derived as `effStatus === 'closed'` and never flips on - // `resolved`, so the flag spelling listed every RESOLVED case under a tab - // labelled "My Open Cases" — measured on the seeded demo population, the - // flag returned 30 of 38 cases and 7 of those 30 were resolved. A resolved - // case is finished work awaiting closure, not an open queue, and the - // mainstream service-cloud reading of "open" excludes it (Zendesk's open - // set omits Solved; ServiceNow's OOTB Open filter is - // `state not in (Resolved, Closed, Cancelled)`). Ruled 2026-08-31; pinned by - // `test/live-work-predicate-parity.test.ts` (#1145), whose consumer roster - // this view joined in the same change. - filter: [ - { field: "owner_id", operator: "equals", value: "{current_user_id}" }, - { field: "status", operator: "not_in", value: ["resolved", "closed"] } - ], - sort: [ - { field: "priority_rank", order: "desc" }, - { field: "sla_due_date", order: "asc" } - ] - }, - /** - * Unassigned — triage (#596). The second half of the queue substitute. - * - * `case_auto_assign` (`src/service/objects/_case-assignment.ts`) is a NO-OP whenever - * the `service_agent` pool is empty, and an empty pool is the FIRST-INSTALL - * NORM rather than an edge case: `sys_user_position` membership is runtime - * data, so on a fresh org — and any time every agent has been unassigned - * from the position — an inbound web-to-case lands ownerless. Best-effort - * assignment also stands down on a permission denial (the anonymous - * public-form context cannot read `sys_user_position` at all). - * - * Those cases used to be invisible: no view filtered on the absence of an - * owner, so an unowned case appeared in `All Cases` with a blank Owner - * column and nothing distinguished it from the rest. This view is the - * standing answer — silence replaced by a pinned tab whose row count IS the - * intake backlog. - * - * `is_null` on `owner_id`, not `equals: null`: the ownerless shape is an - * ABSENT column on driver-memory (see the totality note in - * `case-escalation.flow.ts`, where `record.escalated_date == null` aborted - * with `No such key`) as well as a NULL one on SQL, and only the operator - * form answers the same way for both. - * - * The predicate for "no longer live work" is `status not_in ['resolved', - * 'closed']`, NOT `is_closed == false`. `is_closed` is derived by - * `case_sla_defaults` as `effStatus === 'closed'`, so it never flips on - * `resolved` — and a resolved ownerless case satisfied both of this view's - * old filters and sat here forever, which is neither "arrives with no - * owner" nor "work waiting for a human". `not_in` lowers to the `$nin` the - * load-balancing hooks and `case_sla_monitor` already use for the same - * concept, so the four consumers now state one predicate; the roster that - * holds them together by NAME is `test/live-work-predicate-parity.test.ts`. - * `closed` stays excluded for the reason it always was: history, not - * backlog. - * - * ⚠️ WHO ACTUALLY SEES ROWS HERE is decided by record-level access, not by - * this view, and the answer today is narrower than the tab suggests. A - * view tab carries no role scoping — `ViewTabSchema` has `pinned`, - * `isDefault` and a boolean `visible`, and nothing per-profile — so this is - * pinned for everyone who can open Cases, while the ROWS resolve per - * profile: - * - * - `system_admin` — `viewAllRecords`, so the full backlog. This is the - * persona the empty-pool state is FOR: an empty `service_agent` pool is - * fixed by staffing `sys_user_position`, which only an admin can do. - * - `sales_manager` — `viewAllRecords`, read-only. - * - a service manager / director — the critical, open slice only, via the - * existing `case_escalation_sharing` / `case_director_sharing` criteria - * rules (`src/service/sharing/case.sharing.ts`). - * - `service_agent` — `readScope: 'own'` on `crm_case`, and an unowned - * row is owned by nobody, so **an agent's triage tab is empty**. - * - * The last line is a real gap for the "agent pulls from the queue" story - * and is deliberately NOT closed here: granting service roles sight of - * unowned cases is a sharing-model change (a new criteria rule, or a - * `readScope` widening), which is outside this card's file surface and is - * exactly the kind of quiet permission widening the #596 ruling rules out. - * Filed as #1096 for a decision, with the reach table above and the three - * options priced. - */ - unassigned_triage: { - name: "unassigned_triage", - type: "grid", - label: "Unassigned \u2014 triage", - userActions: { editInline: true }, - data, - columns: ["case_number", "subject", "crm_account", "crm_contact", "priority", "status", "origin", "sla_due_date"], - filter: [ - { field: "owner_id", operator: "is_null" }, - { field: "status", operator: "not_in", value: ["resolved", "closed"] } - ], - // Same ordering as the main queue: urgency first (on the materialised - // ordinal, never the raw select), then soonest deadline. - sort: [ - { field: "priority_rank", order: "desc" }, - { field: "sla_due_date", order: "asc" } - ], - rowColor: { - field: "priority", - colors: { critical: "red", high: "orange", medium: "yellow", low: "slate" } - }, - // The empty state carries the operational instruction, because "no rows" - // here is ambiguous on its own: it means either "the round-robin placed - // everything" (good) or "no case has arrived yet" (also fine) — and the - // reader most likely to be looking is someone who just found the tab - // full and needs to know why. - emptyState: { - title: "Nothing waiting for triage", - message: "Every case has an owner. Cases appear here when they arrive with no owner \u2014 typically a web-to-case submission that arrived while nobody held the Service Agent position.", - icon: "inbox" - } - }, - escalated_cases: { - name: "escalated_cases", - type: "grid", - label: "Escalated Cases", - userActions: { editInline: true }, - data, - columns: ["case_number", "subject", "crm_account", "priority", "sla_due_date", "owner_id"], - filter: [{ field: "is_escalated", operator: "equals", value: true }], - sort: [{ field: "priority_rank", order: "desc" }] - }, - /** - * SLA-at-risk: open cases at High or Critical priority needing attention. - * - * ⚠️ Names what the filter below actually selects. This read - * "high/urgent" until #1333 — but `crm_case.priority` is - * low/medium/high/critical (`case.object.ts:138-142`) and has NO `urgent`; - * that value belongs to `crm_task`. The mirror-image crossing already - * shipped a real defect once (`task.view.ts:35` — Case colour keys on the - * task view left every urgent and normal row uncoloured), and the - * direction that cost something was the one where the comment was - * believed. Two overlapping-but-unequal vocabularies: keep them apart. - */ - sla_at_risk: { - name: "sla_at_risk", - type: "grid", - label: "\u23F0 SLA at Risk", - userActions: { editInline: true }, - data, - columns: ["case_number", "subject", "crm_account", "priority", "sla_due_date", "owner_id"], - // Operator-only filter — sort by SLA due date ascending so the soonest - // surface first. (The view runtime does not interpolate `{NOW() + 4h}`.) - // - // ⚠️ `status not_in CLOSED_CASE_STATUSES`, NOT `is_closed == false`: the - // flag is derived as `effStatus === 'closed'` and never flips on - // `resolved`, so the flag spelling listed resolved cases as at risk while - // `case_sla_monitor` — the automation that OWNS SLA — had already - // excluded them (`status: { $nin: ['resolved', 'closed'] }`). The tab a - // human reads and the sweep that acts must answer this one question the - // same way. Pinned by `test/live-work-predicate-parity.test.ts` (#1145). - filter: [ - { field: "status", operator: "not_in", value: ["resolved", "closed"] }, - { field: "priority", operator: "in", value: ["high", "critical"] } - ], - sort: [{ field: "sla_due_date", order: "asc" }] - } - }, - /** - * The record form — and, because the platform has ONE, the CREATE form too. - * - * ## ⚠️ This object's `form` IS the create dialog (#1214 item 3) - * - * Measured against the console this app shipped at that taking - * (`@objectstack/console` 17.1.0, `dist/assets/`; this bundle read was ⛔ NOT - * re-taken on any later pin), BOTH - * entry points that open a case form resolve - * it the same way and neither takes a create/edit argument: - * - * RecordFormPage (`/{object}/new`, `/{object}/record/{id}/edit`) - * view.form ?? view.formViews?.default - * useActionModal (the `+ New` modal off a list view) - * view.form ?? view.formViews?.default - * - * ⇒ There is no create-only form to author. `ListViewSchema.addRecord` - * carries a `formView` key in `@objectstack/spec`, but NO console code path - * reads it (the string appears only in the view designer's own i18n table), - * so pointing it at a second form view would ship an ADR-0049 - * declared-but-unenforced shape and change nothing on screen. - * - * ⇒ Therefore the create-safe field set has to BE this form's field set. - * That is why the SLA and Resolution sections are gone rather than gated. - * - * ## ⛔ Why the tab strip was not the object's `fieldGroups` - * - * `crm_case.fieldGroups` declares SIX groups (Case Information / Origin & - * Routing / SLA & Priority / Resolution / Escalation / System) and the - * dialog showed THREE tabs — these sections. The renderer only reaches for - * `fieldGroups` on its AUTO-DERIVED path, taken when a form authors no - * `sections` at all; an authored `sections` array wins outright. So - * `src/service/objects/case.object.ts` is not part of this surface. - * - * ## ⚠️ Authoring `sections` OPTS OUT of the create-mode field strip - * - * That auto-derived path also runs two filters the authored path never sees - * (`plugin-form`: `Qe` → `qe` drops `readonly`/`hidden` fields, and on - * `mode === 'create'` `Je` additionally drops formula / summary / autonumber - * fields). An authored section renders its list VERBATIM. That is the whole - * mechanism behind this defect: the platform would have hidden - * `created_date` (retired in #1992), `closed_date`, `resolution_time_hours` - * and `is_closed` from a creator by itself, and naming them in a section put - * them back. - * - * ## ⛔ Why not gate the old sections on a predicate instead - * - * A section-level `visibleWhen` is parsed by `FormSectionSchema` and read by - * NOTHING in the form renderer (only FIELD-level `visibleWhen` is - * evaluated), so it would hide nothing. And field-level predicate evaluation - * FAILS OPEN — an unevaluable predicate renders the field visible, with no - * diagnostic (the house rule at the top of `lead.view.ts`, upstream - * objectstack-ai/objectstack#5149). A gate that fails open is not a gate for - * a data-integrity control, which is what this one is. - * - * ## What a creator may author here, and why the rest left - * - * Everything below is a fact the person raising the case HAS at intake. - * `case_number` stays because it is `readonly: true` on the object, so the - * renderer disables it — it is shown, never authored. - * - * The removed fields are all written by the lifecycle, and every one of them - * still has the surface it belongs on (pinned in - * `test/case-create-form-narrowing.test.ts`, both directions): - * - * closed_date readonly; `case_timeline` end - * (its start is the platform's - * `created_at`; `created_date` was - * retired in #1992) - * sla_due_date `case.hook.ts` stamps it from the - * priority × tier matrix; list column, - * sort key, `sla_calendar.startDateField`, - * detail-page highlights - * first_response_date `event.hook.ts` is its SINGLE writer - * resolution_time_hours readonly; derived at close; detail page - * is_sla_violated list column + detail-page highlights - * is_escalated, escalation_reason written by `case_escalation` / - * `case_sla_monitor` / `escalate_case`; - * detail page's Status & SLA section - * resolution detail page's Description section - * (the `resolution_required_on_close` - * validation still has its surface) - * is_closed readonly; derived from `status` - * - * ⚠️ `internal_notes`, `customer_rating` and `customer_feedback` left with - * the Resolution section and had NO other authoring surface at all. #1428 - * settled both halves of that, and neither answer was "put them back here": - * - * internal_notes `case_detail.page.ts`'s Description - * section, authored by inline edit — - * staff prose an agent writes while - * WORKING a case, which is why it did not - * come back to this form. The guest - * branch of `case.hook.ts` nulls the - * column on anonymous intake, so an - * intake surface for it would be a - * surface for a value the app discards. - * - * customer_rating, RETIRED under ADR-0049 enforce-or-remove - * customer_feedback (maintainer ruling, decision batch #21, - * 2026-09-03). Neither column exists on - * `crm_case` any more, so there is nothing - * here to omit and nothing anywhere to - * author. - * - * ⛔ Do not re-introduce either field, here or elsewhere. The ruling was not - * "no room on this form": a satisfaction score typed by the person being - * scored is not the same fact as one the customer gave, and neither field was - * named in ANY profile's `fields` map — which on this platform means - * unrestricted, not restricted. `case_csat_followup`, whose only purpose was - * to notify the case owner to log a rating, was retired in the same change. - * A customer-answered survey is a feature and would arrive as its own card, - * not as two inputs added back here. - * - * `type: 'simple'`, not `'tabbed'`: one section is not a tab strip. - */ - form: { - type: "simple", - sections: [ - { - name: "case", - label: "Case", - columns: 2, - fields: [ - "case_number", - { field: "subject", required: true, span: "full" }, - { field: "crm_account", required: true }, - "crm_contact", - { field: "status", required: true }, - "priority", - "origin", - "owner_id", - // Required on the object with no default — a form without it could - // never save a new case. - { field: "description", required: true, span: "full" } - ] - } - ] - }, - /** - * Additional named form views. - * - * `web_to_case` is a PUBLIC / ANONYMOUS support form (Salesforce - * Web-to-Case equivalent). Hosted at `/forms/support` and embeddable in - * a help center. Guests can ONLY submit — the `guest_portal` profile - * denies read/edit/delete on `crm_case`. Internal fields (status, origin, - * owner_id, SLA) are stamped by `case.hook.ts` after a guest submission. - * `priority` is NOT one of them: this form asks the guest for it, and an - * unset one is filled by the `low` option `crm_case.priority` declares - * `default: true`. Field defaults are applied before `beforeInsert`, so the - * hook only ever reads `priority` (to derive `priority_rank`). - */ - formViews: { - web_to_case: { - type: "simple", - data, - sections: [ - { - name: "how_can_we_help", - label: "How can we help?", - columns: 1, - fields: [ - { - field: "subject", - required: true, - placeholder: "Short summary of the issue" - }, - { - field: "description", - required: true, - placeholder: "Steps to reproduce, error messages, screenshots..." - }, - { - field: "type", - helpText: "Pick the option that best matches your issue." - }, - { - field: "priority", - helpText: "Critical issues should also be reported via phone." - } - ] - } - ], - sharing: { - enabled: true, - allowAnonymous: true, - publicLink: "/forms/support" - } - } - } -}); - -// src/service/views/knowledge_article.view.ts -import { defineView as defineView2 } from "@objectstack/spec/ui"; -var KnowledgeArticleViews = defineView2({ - list: { - type: "grid", - name: "all_articles", - label: "All Articles", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_knowledge_article" }, - columns: [ - { field: "article_number", width: 120, link: true, pinned: "left", sortable: true }, - { field: "title", width: 320, sortable: true }, - { field: "category", width: 160 }, - { field: "status", width: 130, sortable: true }, - { field: "audience", width: 110 }, - { field: "language", width: 110 }, - { field: "owner_id", width: 150 }, - { field: "published_at", width: 160, sortable: true }, - { field: "helpful_count", width: 110, align: "right", summary: "sum" } - ], - sort: [{ field: "published_at", order: "desc" }], - grouping: { fields: [{ field: "category", order: "asc" }] }, - selection: { type: "multiple" }, - pagination: { pageSize: 50 }, - rowColor: { - field: "status", - colors: { draft: "slate", in_review: "amber", published: "emerald", archived: "gray" } - }, - appearance: { - showDescription: true, - allowedVisualizations: ["grid", "kanban"] - } - }, - listViews: { - published_articles: { - name: "published_articles", - type: "grid", - label: "Published", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_knowledge_article" }, - columns: ["article_number", "title", "category", "audience", "helpful_count", "not_helpful_count", "published_at"], - filter: [{ field: "status", operator: "equals", value: "published" }], - sort: [{ field: "helpful_count", order: "desc" }] - }, - my_drafts: { - name: "my_drafts", - type: "grid", - label: "My Drafts", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_knowledge_article" }, - columns: ["article_number", "title", "category", "status", "updated_at"], - filter: [ - { field: "status", operator: "in", value: ["draft", "in_review"] }, - // `{current_user_id}` is the only user token the view runtime resolves. - { field: "owner_id", operator: "equals", value: "{current_user_id}" } - ], - sort: [{ field: "updated_at", order: "desc" }] - } - }, - form: { - type: "simple", - sections: [ - { - name: "article", - label: "Article", - columns: 2, - fields: [ - "article_number", - { field: "title", required: true, span: "full" }, - { field: "summary", span: "full" }, - "category", - "tags", - "status", - "audience", - "language", - "owner_id" - ] - }, - { - name: "content", - label: "Content", - columns: 1, - fields: ["body"] - }, - { - // `name` alongside `label` (#1100): a form section declaring only a - // label renders its ENGLISH label under every locale, and neither the - // existing i18n tests nor the `i18n/missing-*` gate can see it — the - // heading has no key for a translator to miss. This section is named - // because this change edits it (`view_count` was removed from it, #601); - // the app-wide sweep of the other headings is #1100's job, held behind - // this card precisely so the two do not collide in the locale packs. - name: "engagement", - label: "Engagement", - columns: 3, - fields: ["helpful_count", "not_helpful_count", "published_at", "last_reviewed_at", "related_to_case"] - } - ] - } -}); - -// src/service/index.ts -var serviceHooks = [article_feedback_hook_default, case_hook_default, knowledge_article_hook_default].flat(); -var serviceFlows = [ - CaseEscalationFlow, - CaseEscalationOnCreateFlow, - EscalateCaseFlow, - CloseCaseFlow, - ClaimCaseFlow, - CaseEscalationStampFlow, - CaseSlaMonitorFlow -]; -var serviceSkills = [CaseTriageSkill]; -var serviceSharingRules = [ - CaseEscalationSharingRule, - CaseDirectorSharingRule, - CaseUnassignedTriageSharingRule -]; -var createHotCrmServiceStack = (collections) => defineStack2({ - manifest: { - id: "app.objectstack.hotcrm.service", - name: "HotCRM Service", - // The app package's namespace, deliberately (ADR-0130 D1). - namespace: "crm", - // The ARTIFACT's version: one `package.json`, one build, one release - // (ADR-0130 D6), so a module of this artifact is never at a version of its - // own. Bump it with the app package's and `package.json` — - // `test/docs-declared-versions.test.ts` holds all three, and the range - // below, to one value. - version: "4.0.1", - type: "module", - description: "HotCRM support module \u2014 cases, knowledge articles, and the SLA surface.", - // The same protocol as the app package (ADR-0087 handshake); bump it with - // `specVersion` on every platform upgrade, exactly as the app's is. - engines: { protocol: "^18.0.0-next.0" }, - // The App package this module extends. - dependencies: { "app.objectstack.hotcrm": "^4.0.1" }, - /** - * The five navigation entries this module puts into the app's menu - * (ADR-0029 D7). - * - * Not a design choice: an app's own `navigation` may not name another - * package's object (ADR-0130 §1.5, rule R3 of `module-split-plan.md`), so - * all five became contributions the moment `crm_case`, - * `crm_knowledge_article`, `service_dashboard` and `sla_performance` left - * the app package. The app keeps the GROUPS (`group_service`, `group_work`, - * `group_insights`) — a container a module cannot declare inside an app it - * does not own — and this module fills them. - * - * `app` is the app's bare `name` (`crm_enterprise`), not the manifest id: a - * dotted id is refused as a non-snake_case identifier. - * - * ⚠️ `priority` orders CONTRIBUTIONS against each other inside a group. It - * does NOT interleave them with the app's own children — a contributed item - * is appended after everything the app itself declares in that group. The - * one visible consequence is `nav_my_cases`, 4th of 6 in *My Work* before - * the split and last after it; the three `group_service` items and - * `nav_report_sla` keep their positions because the app declares nothing - * after them. ⛔ Do not compensate with a per-item `order`: that key sorts - * in the renderer only, this app authors none anywhere, and adding one to - * work around a platform merge rule is what AGENTS.md forbids. - */ - navigationContributions: [ - { - app: "crm_enterprise", - group: "group_service", - // Stated rather than defaulted so that the day a second package - // contributes into one of these groups, the order is an authored fact - // instead of a registration-order accident. - priority: 10, - items: [ - { id: "nav_case", type: "object", objectName: "crm_case", label: "Cases", icon: "life-buoy" }, - { id: "nav_knowledge", type: "object", objectName: "crm_knowledge_article", label: "Knowledge", icon: "book-open" }, - { id: "nav_service_dashboard", type: "dashboard", dashboardName: "service_dashboard", label: "Service Overview", icon: "gauge" } - ] - }, - { - app: "crm_enterprise", - group: "group_work", - priority: 20, - items: [ - { id: "nav_my_cases", type: "object", objectName: "crm_case", viewName: "my_open_cases", label: "My Cases", icon: "life-buoy" } - ] - }, - { - app: "crm_enterprise", - group: "group_insights", - priority: 30, - items: [ - { id: "nav_report_sla", type: "report", reportName: "sla_performance", label: "SLA Performance", icon: "timer" } - ] - } - ] - }, - // What THIS package's metadata needs — see the `requires` paragraph above. - requires: ["automation", "triggers", "analytics", "sharing"], - objects: [ArticleFeedback, Case, KnowledgeArticle], - hooks: serviceHooks, - views: [CaseViews, KnowledgeArticleViews], - pages: [CaseDetailPage], - flows: serviceFlows, - actions: [ - EscalateCaseAction, - CloseCaseAction, - ClaimCaseAction, - LogCallAction, - LogMeetingAction, - CaseScheduleMeetingAction, - MarkArticleHelpfulAction, - MarkArticleNotHelpfulAction - ], - datasets: [CaseDataset], - reports: [CasesByStatusPriorityReport, SlaPerformanceReport, CasesOpenedByDayPriorityReport], - dashboards: [ServiceDashboard], - skills: serviceSkills, - sharingRules: serviceSharingRules, - emailTemplates: ServiceEmailTemplates, - ...collections -}); - -// src/revenue/objects/index.ts -var objects_exports3 = {}; -__export(objects_exports3, { - Contract: () => Contract, - OpportunityLineItem: () => OpportunityLineItem, - Product: () => Product, - Quote: () => Quote, - QuoteLineItem: () => QuoteLineItem -}); - -// src/revenue/objects/contract.object.ts -import { ObjectSchema as ObjectSchema12, Field as Field12 } from "@objectstack/spec/data"; -import { P as P13 } from "@objectstack/spec"; -var Contract = ObjectSchema12.create({ - name: "crm_contract", - label: "Contract", - pluralLabel: "Contracts", - icon: "file-pen-line", - description: "Legal contracts and agreements", - // ADR-0090 D1/D7: OWD is an authored decision. Master-detail child of - // crm_account — a contract IS account data: reachable by whoever can reach - // the account, editable by whoever can edit it (#549, ruling 2026-08-31). - sharingModel: "controlled_by_parent", - // ADR-0079: render-only `titleFormat` retired in favor of `nameField`. - // Original template was '{contract_number} - {crm_account.name}'. The - // `crm_account.name` segment is a lookup DOT-WALK, which a formula field - // cannot reference (ADR-0072), so it is DROPPED. Only the local - // `contract_number` (autonumber) remains, so no formula is needed — point - // `nameField` straight at it. - nameField: "contract_number", - highlightFields: ["contract_number", "crm_account", "status", "start_date", "end_date"], - fieldGroups: [ - { key: "basic", label: "Contract Information", icon: "info" }, - { key: "parties", label: "Parties", icon: "users" }, - { key: "terms", label: "Terms & Dates", icon: "calendar" }, - { key: "value", label: "Contract Value", icon: "dollar-sign" }, - { key: "status", label: "Status & Approval", icon: "check-circle" }, - { key: "renewal", label: "Renewal", icon: "refresh-ccw", collapse: "collapsed" } - ], - fields: { - // Platform ownership anchor — canonical note in `account.object.ts` (#548). - owner_id: Field12.lookup("sys_user", { - label: "Contract Owner", - group: "parties", - system: true, - readonly: false, - trackHistory: true - }), - // AutoNumber field - contract_number: Field12.autonumber({ - label: "Contract Number", - group: "basic", - format: "CTR-{0000}" - }), - // Relationships — the master the OWD derives from. Authored as - // master-detail so the master is not decided by declaration order against - // the required `crm_contact` lookup below (objectstack#14747). - crm_account: Field12.masterDetail("crm_account", { - label: "Account", - group: "parties", - required: true, - storage: { notNull: true }, - deleteBehavior: "cascade" - }), - crm_contact: Field12.lookup("crm_contact", { - label: "Primary Contact", - group: "parties", - required: true, - storage: { notNull: true }, - // @objectstack 12: string[] `referenceFilters` is dead (not read by the - // picker); `dependsOn` is the live cascading-lookup form — scopes contacts - // to the contract's `crm_account` (ADR-0049). - dependsOn: ["crm_account"] - }), - crm_opportunity: Field12.lookup("crm_opportunity", { - label: "Related Opportunity", - group: "parties", - // Scope opportunities to the contract's account (was dead referenceFilters). - dependsOn: ["crm_account"] - }), - // Status - status: Field12.select({ - label: "Status", - group: "status", - options: [ - { label: "Draft", value: "draft", color: "#999999", default: true }, - { label: "In Approval", value: "in_approval", color: "#FFA500" }, - { label: "Activated", value: "activated", color: "#00AA00" }, - { label: "Expired", value: "expired", color: "#FF0000" }, - { label: "Terminated", value: "terminated", color: "#666666" } - ], - required: true, - storage: { notNull: true }, - trackHistory: true - }), - // Contract Terms - contract_term_months: Field12.number({ - label: "Contract Term (Months)", - group: "terms", - required: true, - storage: { notNull: true }, - min: 1 - }), - start_date: Field12.date({ - label: "Start Date", - group: "terms", - required: true, - storage: { notNull: true } - }), - end_date: Field12.date({ - label: "End Date", - group: "terms", - required: true, - storage: { notNull: true } - }), - // Financial - contract_value: Field12.currency({ - label: "Contract Value", - group: "value", - min: 0, - required: true, - storage: { notNull: true } - }), - billing_frequency: Field12.select({ - label: "Billing Frequency", - group: "value", - options: [ - { label: "Monthly", value: "monthly", default: true }, - { label: "Quarterly", value: "quarterly" }, - { label: "Annually", value: "annually" }, - { label: "One-time", value: "one_time" } - ] - }), - payment_terms: Field12.select({ - label: "Payment Terms", - group: "value", - // Canonical set shared with Quote: an accepted quote's terms (incl. - // due_on_receipt) must survive the copy onto the contract. That copy is - // `quote_accepted_contract_draft` (src/revenue/objects/quote.hook.ts). This field's `net_30` - // option default applies only when the quote itself carried no term, - // which is the intended fall-through, not a gap. - options: [...PAYMENT_TERMS_OPTIONS] - }), - // Renewal - auto_renewal: Field12.boolean({ - label: "Auto Renewal", - group: "renewal", - defaultValue: false - }), - renewal_notice_days: Field12.number({ - label: "Renewal Notice (Days)", - group: "renewal", - min: 0, - defaultValue: 30 - }), - // Legal - contract_type: Field12.select({ - label: "Contract Type", - group: "basic", - options: [ - { label: "Subscription", value: "subscription" }, - { label: "Service Agreement", value: "service" }, - { label: "License", value: "license" }, - { label: "Partnership", value: "partnership" }, - { label: "NDA", value: "nda" }, - { label: "MSA", value: "msa" } - ] - }), - signed_date: Field12.date({ - label: "Signed Date", - group: "status" - }), - signed_by: Field12.text({ - label: "Signed By", - group: "status", - maxLength: 255 - }), - document_url: Field12.url({ - label: "Contract Document", - group: "basic" - }), - // Terms & Conditions - special_terms: Field12.markdown({ - label: "Special Terms", - group: "terms" - }), - description: Field12.markdown({ - label: "Description", - group: "basic" - }), - // Billing Address - billing_address: Field12.address({ - label: "Billing Address", - group: "value" - }) - }, - // Database indexes - indexes: [ - { fields: ["crm_account"] }, - { fields: ["status"] }, - { fields: ["start_date"] }, - { fields: ["end_date"] }, - { fields: ["owner_id"] } - ], - // Enable advanced features - // API surface. History → Field.trackHistory (ADR-0052). - enable: { - apiEnabled: true, - apiMethods: ["get", "list", "create", "update", "delete"], - // #602 — the executed contract itself. `document_url` remains the pointer - // to an external DMS copy; this is where the file actually lives. - // See the canonical capability note in `src/sales/objects/index.ts`. - files: true - }, - // Validation Rules - // - // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the - // rule returns a verdict even when the merged record has no such key. See - // AGENTS.md "Validation predicates must be TOTAL" and - // test/object-validation-predicates.test.ts, which fails the build otherwise. - validations: [ - { - name: "end_after_start", - type: "script", - severity: "error", - message: "End Date must be after Start Date", - condition: P13`has(record.end_date) && record.end_date != null && has(record.start_date) && record.start_date != null && record.end_date <= record.start_date` - }, - // NOTE: the `valid_contract_term` warning (months-between term check) was - // dropped in the 9.8.0 upgrade — its CEL predicate used `monthsBetween()`, - // which 9.8.0's aligned CEL stdlib (ADR-0032) no longer provides. It was a - // non-blocking warning; the hard end-date>start-date rule above remains. - { - // #575 B4. Like `crm_quote`, this object shipped a lifecycle vocabulary - // with no transition constraint and no status guard in `contract.hook.ts` - // — so `draft → activated` was a legal move, activating an agreement that - // never passed approval. Activation is the consequential edge here: - // `contract_on_activation` stamps `signed_date`, promotes the account to - // `customer`, and the renewal flow starts counting from it. - name: "contract_status_progression", - type: "state_machine", - severity: "warning", - message: "Invalid contract status transition", - field: "status", - transitions: { - draft: ["in_approval", "terminated"], - // Approval either lands (`activated`) or sends the paperwork back. - in_approval: ["draft", "activated", "terminated"], - // `→ expired` is the contract_expiration flow, whose own sweep filter - // is `status: 'activated'` — nothing else ages out. - activated: ["expired", "terminated"], - // Both ends are terminal: a renewal is a NEW contract (the - // contract_renewal flow files a task, it does not revive the old row). - expired: [], - terminated: [] - } - } - ] - // Workflow Rules - // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were - // removed from the platform. Field updates live in this object's `*.hook.ts`; - // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. -}); - -// src/revenue/objects/opportunity_line_item.object.ts -import { ObjectSchema as ObjectSchema13, Field as Field13 } from "@objectstack/spec/data"; -import { F as F8, P as P14 } from "@objectstack/spec"; -var OpportunityLineItem = ObjectSchema13.create({ - name: "crm_opportunity_line_item", - label: "Opportunity Line Item", - pluralLabel: "Opportunity Line Items", - icon: "package", - description: "A single product line on an Opportunity", - // ADR-0090 D1/D7: OWD is an authored decision. A line item has no meaning - // apart from its deal, so its record access DERIVES from the opportunity - // (ADR-0055), and as of 17.0.0-rc.4 that derivation means what it says. - // - // ⚠️ Reads ARE filtered to line items whose `crm_opportunity` the caller can - // read, and master accessibility resolves through the same paths a direct - // read of the opportunity takes — ownership and `sys_record_share` grants - // included, NOT the master's row-level security policies alone. So a rep - // reads the lines of the deals in their own book plus anything shared to - // them, and the private-deal RLS filter carried by the `sales_manager` and - // `marketing_user` sets narrows on top of that rather than being the only - // thing that narrows. The parent-write gate derives the same way: a line - // whose opportunity the caller cannot edit is refused. - // - // `test/parent-derived-reach.test.ts` pins the narrow semantics and was - // written to go red the day the platform widens them: with the master set - // resolved from RLS policies alone, any caller without the private-deal - // policy — `sales_rep` included — reaches EVERY opportunity's lines. - // ADR-0055's relation resolver accepts a REQUIRED LOOKUP as the parent, so - // this works without converting the relationship to master-detail. - // - // ⛔ Not `private`: this object has no owner of its own, so `private` falls - // back to the platform's auto-stamped `owner_id` (whoever inserted the row) — - // and the rep who owns the deal then cannot see a line the quote-generation - // flow or their manager added to it. - sharingModel: "controlled_by_parent", - // Per-field history is opt-in via `Field.trackHistory` (ADR-0052), set on - // quantity/unit_price/discount below. Master-detail children still inherit - // the master's sharing automatically. - highlightFields: ["crm_product", "quantity", "unit_price", "total_price"], - // Two groups, derived from the nine fields this object actually declares - // rather than copied off a neighbour (#1453). The split is the one the - // arithmetic already makes: everything `total_price` multiplies together is - // `pricing`, everything that says WHICH line this is is `basic`. - // - // `quantity` is a pricing field here, not an identity one — it is a factor in - // `total_price`, and separating it from the price it multiplies would put the - // two halves of one product on two sections. `crm_quote_line_item` takes the - // same split over its ten fields, and the parents agree: `crm_quote` and - // `crm_product` both keep every money field in `pricing` — `crm_quote`'s - // `tax` included — and both keep `description` in `basic`. - // - // ⚠️ Neither group may be a subset of the highlight strip: a synthesized - // detail page hoists the title plus the first four `highlightFields` out of - // the body, so an all-hoisted group renders on forms and nowhere else - // (`field-group-shadowed`; `pnpm lint` — `os lint --strict` — fails on it). - // `basic` keeps crm_opportunity/description/line_number and `pricing` keeps - // list_price/discount outside that strip, so both survive the hoist. - fieldGroups: [ - { key: "basic", label: "Line Item", icon: "package" }, - { key: "pricing", label: "Pricing", icon: "dollar-sign" } - ], - fields: { - // The parent link, and the ONE field on this object that decides whether the - // deal it belongs to can be deleted at all (#727). - // - // Declaring nothing here does not mean "no opinion": `Field.lookup` resolves - // `deleteBehavior` to the spec default `set_null`, and the engine's - // `cascadeDeleteRelations` escalates a `set_null` default on a REQUIRED - // lookup to `restrict` — a NOT NULL column cannot be cleared. So the silent - // default made every itemised opportunity undeletable, with a message that - // told the API caller to `set deleteBehavior:'cascade'` on this very field: - // - // DELETE /api/v1/data/crm_opportunity/ - // → 409 DELETE_RESTRICTED "…1 dependent crm_opportunity_line_item - // record(s) reference it via crm_opportunity…" - // - // `cascade` is the semantics this object already claims twice over: the - // header comment says a line has no meaning apart from its deal, and - // `opportunity_line_item.hook.ts` derives `crm_opportunity.amount` FROM the - // line set. A record whose parent is gone denotes nothing and would keep a - // dead deal's revenue in the line-level reports. - // - // This is deliberately NOT the campaign/event answer (#696, #711 kept - // `crm_campaign_member.crm_campaign` and `crm_event_attendee.crm_event` on - // the restricting default): a member list is a campaign's historical record - // and survives on its own terms. A price line does not. - crm_opportunity: Field13.masterDetail("crm_opportunity", { - label: "Opportunity", - group: "basic", - required: true, - storage: { notNull: true }, - deleteBehavior: "cascade" - }), - // Deliberately left on the default, which the same escalation turns into - // `restrict`: deleting a catalog product must NOT shred the priced history - // of deals that sold it. `product.hook.ts`'s own `beforeDelete` says the - // same thing in words ("Set is_active=false to retire instead"). - crm_product: Field13.lookup("crm_product", { - label: "Product", - group: "basic", - required: true, - storage: { notNull: true } - }), - description: Field13.text({ - label: "Description", - group: "basic", - maxLength: 500 - }), - quantity: Field13.number({ - label: "Quantity", - group: "pricing", - required: true, - storage: { notNull: true }, - scale: 2, - min: 0, - defaultValue: 1, - trackHistory: true - }), - list_price: Field13.currency({ - label: "List Price", - group: "pricing", - readonly: true, - description: "Auto-populated from the product's List Price." - }), - unit_price: Field13.currency({ - label: "Sales Price", - group: "pricing", - required: true, - storage: { notNull: true }, - description: "Negotiated unit price (may differ from list price)", - trackHistory: true - }), - discount: Field13.percent({ - label: "Discount %", - group: "pricing", - scale: 2, - min: 0, - max: 100, - defaultValue: 0, - trackHistory: true - }), - total_price: Field13.formula({ - label: "Total", - group: "pricing", - expression: F8`record.quantity * record.unit_price * (1 - record.discount / 100)` - }), - line_number: Field13.number({ - label: "Line #", - group: "basic", - scale: 0, - readonly: true - }) - }, - // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the - // rule returns a verdict even when the merged record has no such key. See - // AGENTS.md "Validation predicates must be TOTAL" and - // test/object-validation-predicates.test.ts, which fails the build otherwise. - validations: [ - { - name: "unit_price_positive", - type: "script", - severity: "error", - message: "Sales price cannot be negative", - // Both guards are load-bearing, not defensive noise. `has(...)` answers - // "is the key present at all": on update the predicate sees - // `{...previous, ...data}`, and a driver that stores only written columns - // returns no key, which aborts the whole predicate and silently skips the - // rule (#630). `!= null` answers "does it hold a value": strict CEL - // ABORTS on `null < 0` instead of evaluating it false, so the unguarded - // form left this rule inert on a blank price — it never fired at all, - // which is the opposite of what a validation is for. The `null` hazard is - // written up at `account.object.ts:244-245`; the same-named rule in - // `quote_line_item.object.ts` has carried that guard all along. - condition: P14`has(record.unit_price) && record.unit_price != null && record.unit_price < 0` - } - ] -}); - -// src/revenue/objects/product.object.ts -import { ObjectSchema as ObjectSchema14, Field as Field14 } from "@objectstack/spec/data"; -import { F as F9, P as P15 } from "@objectstack/spec"; -var Product = ObjectSchema14.create({ - name: "crm_product", - label: "Product", - pluralLabel: "Products", - icon: "box", - description: "Products and services offered by the company", - // ADR-0090 D1/D7: OWD is an authored decision. Product catalog is org-visible; only owners edit. - sharingModel: "public_read", - // ADR-0079: render-only `titleFormat` retired in favor of `nameField`, - // which names a real field. The former template composed two local fields, so - // a `display_title` formula field reproduces it for the record title. - nameField: "display_title", - // Explicit search targets (ADR-0061). REQUIRED because nameField is a - // FORMULA (display_title/full_name): without this, $search auto-defaults to - // the formula field, which isn't a real column, so the lookup picker + global - // search silently return zero. These are real, indexed columns. - searchableFields: ["name", "product_code", "sku"], - highlightFields: ["product_code", "name", "category", "is_active"], - fieldGroups: [ - { key: "basic", label: "Product Information", icon: "info" }, - { key: "pricing", label: "Pricing", icon: "dollar-sign" }, - { key: "metadata", label: "Resources", icon: "link", collapse: "collapsed" } - ], - fields: { - // AutoNumber field - Unique product identifier - product_code: Field14.autonumber({ - label: "Product Code", - group: "basic", - format: "PRD-{0000}" - }), - // Basic Information - name: Field14.text({ - label: "Product Name", - group: "basic", - required: true, - storage: { notNull: true }, - searchable: true, - maxLength: 255 - }), - // ADR-0079 record title (was titleFormat '{product_code} - {name}'). - display_title: Field14.formula({ - label: "Display Title", - group: "basic", - expression: F9`record.product_code + " - " + record.name` - }), - description: Field14.markdown({ - label: "Description", - group: "basic" - }), - // Categorization - category: Field14.select({ - label: "Category", - group: "basic", - options: [ - { label: "Software", value: "software", default: true }, - { label: "Hardware", value: "hardware" }, - { label: "Service", value: "service" }, - { label: "Subscription", value: "subscription" }, - { label: "Support", value: "support" } - ] - }), - family: Field14.select({ - label: "Product Family", - group: "basic", - options: [ - { label: "Enterprise Solutions", value: "enterprise" }, - { label: "SMB Solutions", value: "smb" }, - { label: "Professional Services", value: "services" }, - { label: "Cloud Services", value: "cloud" } - ] - }), - // Pricing - list_price: Field14.currency({ - label: "List Price", - group: "pricing", - min: 0, - required: true, - storage: { notNull: true } - }), - cost: Field14.currency({ - label: "Cost", - group: "pricing", - min: 0 - }), - // SKU - // - // `quantity_on_hand` / `reorder_point` were removed with the rest of the - // inventory surface: nothing in this app decremented stock, and the "Low - // Stock" view they fed compared against a hardcoded 10 rather than the - // reorder point beside it. HotCRM sells from a catalog; warehouse state - // belongs to the system of record that owns it. - sku: Field14.text({ - label: "SKU", - group: "basic", - maxLength: 50, - unique: true - }), - // Status - is_active: Field14.boolean({ - label: "Active", - group: "basic", - defaultValue: true, - trackHistory: true - }), - // Relationships - product_manager: Field14.lookup("sys_user", { - label: "Product Manager", - group: "basic" - }), - // Images and Assets - // `accept` / `maxSize` are declarable AND server-enforced from - // @objectstack 17 (ADR-0104 D3 wave 2). Before that the upload widget read - // them but `FieldSchema` dropped them at parse, so the constraint existed - // only in the browser and any direct API caller walked past it. - image: Field14.image({ - label: "Product Image", - group: "metadata", - accept: ["image/png", "image/jpeg", "image/webp"], - maxSize: 5 * 1024 * 1024 - }), - datasheet: Field14.file({ - label: "Datasheet", - group: "metadata", - accept: ["application/pdf"], - maxSize: 20 * 1024 * 1024 - }) - // `billing_type` and `unit_of_measure` were removed with the tax flag: both - // were seeded on all 13 catalog products and read by nothing — no quote - // total, no revenue-recognition report and no line-item behaviour ever - // consulted either. A picklist that only ever renders itself is a - // maintenance obligation (four locales, an import column, every future - // migration) charged against a capability that does not exist. - }, - // Database indexes - // - // No `{ fields: ['sku'], unique: true }` here: the field-level `unique: true` - // already builds the tenant composite `(organization_id, sku)` since - // framework #3696. Declaring the single-column index too made the - // platform-wide constraint win and left the per-tenant one unreachable - // (framework#3991) — an SKU is unique inside a catalogue, and two - // organizations may legitimately both stock "ABC-123". - indexes: [ - { fields: ["name"] }, - { fields: ["category"] }, - { fields: ["is_active"] } - ], - // Enable advanced features - // API surface. History → Field.trackHistory (ADR-0052). - enable: { - apiEnabled: true, - apiMethods: ["get", "list", "create", "update", "delete"] - }, - // Validation Rules - // - // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the - // rule returns a verdict even when the merged record has no such key. See - // AGENTS.md "Validation predicates must be TOTAL" and - // test/object-validation-predicates.test.ts, which fails the build otherwise. - validations: [ - { - name: "price_positive", - type: "script", - severity: "error", - message: "List Price must be positive", - // Two distinct guards, both required. `has(...)` answers "is the key - // there at all" — on update the merged record is `{...previous, ...data}` - // and a driver that stores only written columns hands back no key, which - // aborts the whole predicate (#630). `!= null` then answers "does it hold - // a value" — strict CEL cannot compare dyn < int, the hazard - // written up on `account.object.ts`. `list_price` is `required`, but the - // rule also runs on partial updates that omit it. - condition: P15`has(record.list_price) && record.list_price != null && record.list_price < 0` - }, - { - name: "cost_less_than_price", - type: "script", - severity: "warning", - message: "Cost should be less than List Price", - // Both operands need both guards: `cost` is optional and absent on every - // seeded product, so this warning has never once evaluated. - condition: P15`has(record.cost) && record.cost != null && has(record.list_price) && record.list_price != null && record.cost >= record.list_price` - } - ] -}); - -// src/revenue/objects/quote.object.ts -import { ObjectSchema as ObjectSchema15, Field as Field15 } from "@objectstack/spec/data"; -import { F as F10, P as P16, cel as cel5 } from "@objectstack/spec"; - -// src/sales/objects/_thresholds.ts -var LARGE_DEAL_AMOUNT = 1e5; -var HIGH_VALUE_DEAL_AMOUNT = 5e5; -var QUOTE_DISCOUNT_CEILING = 60; - -// src/revenue/objects/quote.object.ts -var Quote = ObjectSchema15.create({ - name: "crm_quote", - label: "Quote", - pluralLabel: "Quotes", - icon: "file-text", - description: "Price quotes for customers", - // ADR-0090 D1/D7: OWD is an authored decision. Master-detail child of - // crm_account — a quote is reachable by whoever can reach its account, and - // its line items derive one level further (#549, ruling 2026-08-31). - sharingModel: "controlled_by_parent", - // ADR-0079: render-only `titleFormat` retired in favor of `nameField`, - // which names a real field. The former template composed two local fields, so - // a `display_title` formula field reproduces it for the record title. - nameField: "display_title", - // Explicit search targets (ADR-0061). REQUIRED because nameField is a - // FORMULA (display_title/full_name): without this, $search auto-defaults to - // the formula field, which isn't a real column, so the lookup picker + global - // search silently return zero. These are real, indexed columns. - searchableFields: ["name", "quote_number"], - highlightFields: ["quote_number", "name", "crm_account", "status", "total_price"], - fieldGroups: [ - { key: "basic", label: "Quote Information", icon: "info" }, - { key: "pricing", label: "Pricing", icon: "dollar-sign" }, - { key: "terms", label: "Terms & Validity", icon: "calendar" }, - { key: "address", label: "Addresses", icon: "map-pin", collapse: "collapsed" }, - { key: "system", label: "System", icon: "database", collapse: "collapsed" } - ], - fields: { - // Platform ownership anchor — canonical note in `account.object.ts` (#548). - owner_id: Field15.lookup("sys_user", { - label: "Quote Owner", - group: "basic", - system: true, - readonly: false, - trackHistory: true - }), - // AutoNumber field - quote_number: Field15.autonumber({ - label: "Quote Number", - group: "basic", - format: "QTE-{0000}" - }), - // Basic Information - name: Field15.text({ - label: "Quote Name", - group: "basic", - required: true, - storage: { notNull: true }, - searchable: true, - maxLength: 255 - }), - // ADR-0079 record title (was titleFormat '{quote_number} - {name}'). - display_title: Field15.formula({ - label: "Display Title", - group: "basic", - expression: F10`record.quote_number + " - " + record.name` - }), - // Relationships — the master the OWD derives from (authored, not positional). - crm_account: Field15.masterDetail("crm_account", { - label: "Account", - group: "basic", - required: true, - storage: { notNull: true }, - deleteBehavior: "cascade" - }), - crm_contact: Field15.lookup("crm_contact", { - label: "Contact", - group: "basic", - // Optional AT DRAFT TIME, required from `presented` on (#1017). - // - // quote_generation maps the opportunity's `primary_contact`, which is - // itself optional — a flat `required: true` here meant contact-less - // opportunities could never draft a quote at all. So the recipient is - // nailed down by the time a quote is PRESENTED, not when it is drafted. - // That sentence sat in this comment for the field's whole life with - // nothing enforcing it: no rule stopped a contact-less quote reaching - // `presented` or `accepted`, and the bill came due one object over. - // `crm_contract.crm_contact` is `required` + `notNull`, so accepting such - // a quote made `quote_on_accepted` fail to draft the contract — since - // #714/#1013 that failure is honest and no longer swallows the close-won - // leg, but the hook is `async` + `onError: 'log'`, so the accepting write - // still answers 200 and the only evidence is a server log nobody reads. - // `requiredWhen` moves the same refusal to the synchronous, someone-is- - // watching moment: the rep is told on the write that turns the quote - // outward, against the field, with the quote still editable. - // - // WHY EXACTLY `presented` + `accepted`, and not the other two terminal - // states. Both of those are reachable WITHOUT the quote ever being sent - // (see the `quote_status_progression` transitions below): - // • `expired` — the `quote_expiration` flow sweeps on `expiration_date` - // alone and expires never-sent drafts as readily as presented ones. - // Requiring a recipient there would make a nightly system write fail - // on exactly the quotes that have no recipient BECAUSE nobody sent - // them, and the sweep's `runAs: 'system'` would not exempt it — the - // gate applies on write, not on actor. - // • `rejected` — legal straight from `in_review`, i.e. a quote killed - // internally before anyone saw it. Demanding a contact to file that - // verdict asks for a recipient the quote never had. - // Neither state passes anything on to a contract, so neither needs one. - // - // ⚠️ `has(record.status)` is load-bearing, not decoration — the same trap - // documented at `lead.object.ts`'s duplicate lookups: a bare - // `record.status == "presented"` aborts with `No such key` on any merged - // record that simply omits the column, and the engine's answer to a - // predicate that fails to evaluate is to SKIP it ("requiredWhen for - // 'crm_contact' failed to evaluate — skipped"). The rule would then read - // as enforced and require nothing at all. - // - // @objectstack 12: string[] `referenceFilters` is dead (not read by the - // picker); `dependsOn` is the live cascading form — scopes contacts to the - // quote's `crm_account` (ADR-0049). - dependsOn: ["crm_account"], - requiredWhen: P16`has(record.status) && (record.status == "presented" || record.status == "accepted")`, - description: "Required once the quote is Presented or Accepted \u2014 the drafted contract takes its Primary Contact from here." - }), - crm_opportunity: Field15.lookup("crm_opportunity", { - label: "Opportunity", - group: "basic", - // Scope opportunities to the quote's account (was dead referenceFilters). - dependsOn: ["crm_account"] - }), - // Status - status: Field15.select({ - label: "Status", - group: "basic", - options: [ - { label: "Draft", value: "draft", color: "#999999", default: true }, - { label: "In Review", value: "in_review", color: "#FFA500" }, - { label: "Presented", value: "presented", color: "#4169E1" }, - { label: "Accepted", value: "accepted", color: "#00AA00" }, - { label: "Rejected", value: "rejected", color: "#FF0000" }, - { label: "Expired", value: "expired", color: "#666666" } - ], - required: true, - storage: { notNull: true }, - trackHistory: true - }), - // Dates - quote_date: Field15.date({ - label: "Quote Date", - group: "terms", - required: true, - storage: { notNull: true }, - defaultValue: cel5`today()` - }), - expiration_date: Field15.date({ - label: "Expiration Date", - group: "terms", - required: true, - storage: { notNull: true } - }), - // Pricing - // subtotal/discount_amount/total_price are NOT `readonly`, and the writer - // that decides it is the LINE-ITEM ROLLUP — not the flow this note used to - // name. `quote_total_rollup` (`quote_line_item.hook.ts`) recomputes all - // three on every line insert/update/delete through - // `api.object('crm_quote').update(...)`: a cross-record write via `ctx.api`, - // which is a `ScopedContext` over the ACTING USER's context. The keys are - // therefore CALLER-supplied to a non-`isSystem` UPDATE, exactly what - // `stripReadonlyFields` deletes — with `readonly` on, a quote's totals would - // freeze at whatever the flow first seeded and never track its lines again. - // ⚠️ `quote_generation` writes them too, but at CREATE time, and the strip - // is an UPDATE-path rule — that write would survive `readonly` untouched. - // The retired 16.x claim rested on that create-time write, which is how this - // note reached a right conclusion from the wrong writer. - // Measured in `test/readonly-write-semantics.test.ts` (insert is exempt) and - // `test/activity-recency.test.ts` (the `ctx.api` strip, on the real engine). - subtotal: Field15.currency({ - label: "Subtotal", - group: "pricing" - }), - discount: Field15.percent({ - label: "Discount %", - group: "pricing", - scale: 2, - min: 0, - max: 100 - }), - discount_amount: Field15.currency({ - label: "Discount Amount", - group: "pricing" - }), - tax: Field15.currency({ - label: "Tax", - group: "pricing" - }), - shipping_handling: Field15.currency({ - label: "Shipping & Handling", - group: "pricing" - }), - total_price: Field15.currency({ - label: "Total Price", - group: "pricing" - }), - // Terms - payment_terms: Field15.select({ - label: "Payment Terms", - group: "terms", - // Canonical set shared with Contract (#490) — see _picklists.ts. - options: [...PAYMENT_TERMS_OPTIONS] - }), - shipping_terms: Field15.text({ - label: "Shipping Terms", - group: "terms", - maxLength: 255 - }), - // Billing & Shipping Address - billing_address: Field15.address({ - label: "Billing Address", - group: "address" - }), - shipping_address: Field15.address({ - label: "Shipping Address", - group: "address" - }), - // Notes - description: Field15.markdown({ - label: "Description", - group: "basic" - }), - internal_notes: Field15.textarea({ - label: "Internal Notes", - group: "system" - }) - }, - // Database indexes - indexes: [ - { fields: ["crm_account"] }, - { fields: ["crm_opportunity"] }, - { fields: ["owner_id"] }, - { fields: ["status"] }, - { fields: ["quote_date"] } - ], - // Enable advanced features - // API surface. History → Field.trackHistory (ADR-0052). - enable: { - apiEnabled: true, - apiMethods: ["get", "list", "create", "update", "delete"], - // #602 — the generated quote PDF and the customer's countersigned copy. - // See the canonical capability note in `src/sales/objects/index.ts`. - files: true - }, - // Validation Rules - // - // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the - // rule returns a verdict even when the merged record has no such key. See - // AGENTS.md "Validation predicates must be TOTAL" and - // test/object-validation-predicates.test.ts, which fails the build otherwise. - validations: [ - { - name: "expiration_after_quote", - type: "script", - severity: "error", - message: "Expiration Date must be after Quote Date", - condition: P16`has(record.expiration_date) && record.expiration_date != null && has(record.quote_date) && record.quote_date != null && record.expiration_date <= record.quote_date` - }, - { - // #599. The only discount constraint this object ever had was the field's - // own `max: 100` — the arithmetic domain of a percentage — so a rep could - // put 90% off a $99K deal on a quote and nothing anywhere objected: the - // approval flow keys on the opportunity's AMOUNT, and $99K is under the - // large-deal line. This is the policy ceiling that constraint never was. - // - // ⚠️ A predicate of `record.discount > 100` here would be DEAD: field-level - // bounds are evaluated BEFORE object validations, so `discount: 150` is - // already refused by `max: 100` with `code: 'max_value'` and the message - // "Discount % must be ≤ 100", and the rule's own message is unreachable on - // every input that could reach it. - // - // ### Why a script validation and not a lower `max` on the field - // - // This is an INVARIANT — "a quote's discount may never exceed the - // ceiling" — not a transition condition, and #1069 is open on exactly - // that distinction for `requiredWhen`. Both instruments were measured - // against a row stored above the ceiling before the rule existed - // (`test/quote-discount-ceiling.test.ts` runs the measurement): - // - // Field.percent({ max: 60 }) legacy row, unrelated edit → ADMITTED - // this rule legacy row, unrelated edit → REFUSED - // - // A field bound checks the value being WRITTEN; a script validation is - // evaluated against the MERGED record on every write. So `max` carries - // the same silent legacy hole #1069 describes, in a second instrument, - // and the rule does not. The cost of the invariant, stated rather than - // hidden: an over-ceiling row is frozen to everything except the repair — - // bringing the discount back under the ceiling is admitted, and is an - // ordinary edit. HotCRM ships no such row (deepest seeded discount: 20%). - // - // `max: 100` stays on the field as the domain of a percentage. The policy - // number lives in `_thresholds.ts`, interpolated into both the predicate - // and the message so the two cannot disagree. - name: "discount_within_ceiling", - type: "script", - severity: "error", - message: `Discount cannot exceed ${QUOTE_DISCOUNT_CEILING}%`, - condition: P16`has(record.discount) && record.discount != null && record.discount > ${QUOTE_DISCOUNT_CEILING}` - }, - { - // #575 B4. `crm_quote` had a full lifecycle vocabulary and no transition - // constraint whatsoever — nor a status guard in `quote.hook.ts` — so a - // quote could go straight from `draft` to `accepted`, which in CPQ terms - // is a signed number nobody reviewed or sent. `warning` severity matches - // the lead / opportunity / case machines: it flags the jump on the record - // without blocking a support-driven correction. - name: "quote_status_progression", - type: "state_machine", - severity: "warning", - message: "Invalid quote status transition", - field: "status", - transitions: { - // `→ expired` is legal from every UNSETTLED state: the quote_expiration - // flow sweeps on `expiration_date` alone and expires drafts that were - // never sent as readily as presented ones. - draft: ["in_review", "expired"], - in_review: ["draft", "presented", "rejected", "expired"], - presented: ["accepted", "rejected", "expired"], - // `accepted` and `expired` are terminal, and not only by convention — - // `quote_pricing_guard` in quote.hook.ts freezes both, allowing edits - // to `internal_notes` and nothing else. - accepted: [], - expired: [], - // A rejected quote is not frozen: the rep revises the numbers and - // re-issues, which starts again at `draft`. - rejected: ["draft"] - } - } - ] - // Workflow Rules - // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were - // removed from the platform. Field updates live in this object's `*.hook.ts`; - // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. -}); - -// src/revenue/objects/quote_line_item.object.ts -import { ObjectSchema as ObjectSchema16, Field as Field16 } from "@objectstack/spec/data"; -import { F as F11, P as P17 } from "@objectstack/spec"; -var QuoteLineItem = ObjectSchema16.create({ - name: "crm_quote_line_item", - label: "Quote Line Item", - pluralLabel: "Quote Line Items", - icon: "package", - description: "A single product line on a Quote", - // OWD is an authored decision (ADR-0090 D1/D7). Record access DERIVES from - // the quote (ADR-0055). - // - // ⚠️ Reads ARE filtered to lines whose `crm_quote` the caller can read, and - // "can read" resolves through the same paths a direct read of the quote takes - // — owner scope and `sys_record_share` grants included, NOT the master's - // row-level security policies alone. A rep who owns one quote reads that - // quote's lines and no others. The parent-write gate derives the same way: a - // line whose quote the caller cannot edit is refused with a - // `PermissionDeniedError` naming the master. - // - // `test/parent-derived-reach.test.ts` pins those semantics with positive - // controls, so a regression is caught in either direction — it was written to - // go red the day the platform widens them: with the derivation consulting - // master RLS policies only, under a SYSTEM context, and no policy authored on - // `crm_quote`, the master set is EVERY quote and a line item is readable — - // and writable — by every holder of object-level read on this object. The - // relation resolver accepts a REQUIRED LOOKUP as the parent, so no - // master-detail conversion is needed. - // - // ⛔ Not `private`: with no owner field on this object that resolves to the - // platform's auto-stamped `owner_id` — the row's inserter — so lines cloned - // onto a quote by the `quote_generation` flow are invisible to the rep who - // owns the quote. - sharingModel: "controlled_by_parent", - // Per-field history is opt-in via `Field.trackHistory` (ADR-0052), set on - // quantity/unit_price/discount below. Master-detail children still inherit - // the master's sharing automatically. - highlightFields: ["crm_product", "quantity", "unit_price", "total_price"], - // The same two-group split as `crm_opportunity_line_item` (#1453), derived - // from the ten fields declared here: every factor `total_price` multiplies - // is `pricing`, everything that says WHICH line this is is `basic`. - // - // ⚠️ Neither group may be a subset of the highlight strip — see the twin - // object for the hoisting rule this satisfies. - fieldGroups: [ - { key: "basic", label: "Line Item", icon: "package" }, - { key: "pricing", label: "Pricing", icon: "dollar-sign" } - ], - fields: { - // The parent link — same decision, same reasoning, as - // `opportunity_line_item.crm_opportunity` (#727); read the long note there. - // In short: declaring nothing resolves to the spec default `set_null`, which - // the engine escalates to `restrict` on a REQUIRED lookup, so every quote - // that had been itemised refused to delete with a 409 quoting this field. - // A quote line is subordinate to its quote (`quote_line_item.hook.ts` rolls - // the quote's subtotal/total UP from these rows), so it goes with it. - crm_quote: Field16.masterDetail("crm_quote", { - label: "Quote", - group: "basic", - required: true, - storage: { notNull: true }, - deleteBehavior: "cascade", - // Curates the line-items panel on a quote's detail page (#1199) — the - // mechanism that panel reads first (#944; the long note is on - // `crm_campaign_member.crm_campaign`). A SUPERSET of the fallback it - // replaces (`highlightFields` minus this lookup: Product / Quantity / - // Sales Price / Total) plus `subtotal`, the line's price after its own - // discount — the formula was evaluated on every read and shown in no list. - // - // ⛔ Not added to `highlightFields`: the detail page hoists the first - // four of that strip, so a fifth entry never reaches the strip, and - // reordering it would evict `total_price` from the record's header. - relatedListColumns: ["crm_product", "quantity", "unit_price", "subtotal", "total_price"] - }), - // Left on the restricting default on purpose — see the twin object: a - // product's catalog entry must not take priced quote history with it. - crm_product: Field16.lookup("crm_product", { - label: "Product", - group: "basic", - required: true, - storage: { notNull: true } - }), - description: Field16.text({ - label: "Description", - group: "basic", - maxLength: 500 - }), - quantity: Field16.number({ - label: "Quantity", - group: "pricing", - required: true, - storage: { notNull: true }, - scale: 2, - min: 0, - defaultValue: 1, - trackHistory: true - }), - list_price: Field16.currency({ - label: "List Price", - group: "pricing", - readonly: true - }), - unit_price: Field16.currency({ - label: "Sales Price", - group: "pricing", - required: true, - storage: { notNull: true }, - trackHistory: true - }), - discount: Field16.percent({ - label: "Discount %", - group: "pricing", - scale: 2, - min: 0, - max: 100, - defaultValue: 0, - trackHistory: true - }), - subtotal: Field16.formula({ - label: "Subtotal", - group: "pricing", - expression: F11`record.quantity * record.unit_price * (1 - record.discount / 100)` - }), - // A line carries no tax: tax is the quote's own amount (#2069), so Total is - // `subtotal`'s expression, not a read of `subtotal` — a formula reading a - // formula depends on hydration order (`lead.object.ts:61-64`). - total_price: Field16.formula({ - label: "Total", - group: "pricing", - expression: F11`record.quantity * record.unit_price * (1 - record.discount / 100)` - }), - line_number: Field16.number({ - label: "Line #", - group: "basic", - scale: 0, - readonly: true - }) - }, - // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the - // rule returns a verdict even when the merged record has no such key. See - // AGENTS.md "Validation predicates must be TOTAL" and - // test/object-validation-predicates.test.ts, which fails the build otherwise. - validations: [ - { - name: "unit_price_positive", - type: "script", - severity: "error", - message: "Sales price cannot be negative", - condition: P17`has(record.unit_price) && record.unit_price != null && record.unit_price < 0` - }, - { - // #1086. The other half of #599's ceiling, and the reason that card's own - // acceptance criterion — "a quote with a 90% line discount cannot reach - // `presented`" — was not met by the quote-level rule alone. - // - // ### The walk-around this closes - // - // A quote's total has TWO independent discount multipliers, and - // `quote_total_rollup` composes them: - // - // subtotal = Σ line (quantity × unit_price × (1 − LINE discount/100)) - // discount_amount = subtotal × QUOTE discount% - // - // #599 put a ceiling on the second one only. So a quote at - // `discount: 0` — which clears `discount_within_ceiling` on `crm_quote` - // outright — with every line at `discount: 90` prices 90% below list, and - // nothing objected: this object's only discount constraint was the - // field's own `max: 100`, the arithmetic domain of a percentage. An - // invariant with a documented walk-around is worse than no invariant, - // because a reader (human or AI) cites the rule as the guarantee. - // - // ### Same constant, same instrument, deliberately - // - // The number is `QUOTE_DISCOUNT_CEILING` — imported, never retyped, so the - // two ceilings are one policy and cannot drift into two. The instrument is - // a `type: 'script'` validation for the reason #599 measured on the quote - // (and this card re-measured on this object, in - // `test/quote-discount-ceiling.test.ts`): a field-level `max` validates - // only the value being WRITTEN, so a line stored above the ceiling before - // the rule existed keeps accepting edits forever, while a script - // validation is evaluated against the MERGED record on every write and is - // therefore a true invariant. `max: 100` stays on the field as the domain - // of a percentage; the policy line lives here. - // - // ### What this rule does NOT decide - // - // 60% per line AND 60% on the quote still compounds to ~84% EFFECTIVE. - // Whether the ceiling should be read against the effective discount is a - // business-policy question with no answer in this codebase, and it is - // open as #1109 — deliberately not guessed here. A per-line ceiling is - // correct under either answer: it is the whole policy if the answer is - // per-line, and a component of it if the answer is effective. - name: "discount_within_ceiling", - type: "script", - severity: "error", - // Names the LINE, because the quote carries a same-named rule with its - // own message: on a refused save the rep must be able to tell which of - // the two numbers the platform is objecting to. - message: `Line discount cannot exceed ${QUOTE_DISCOUNT_CEILING}%`, - condition: P17`has(record.discount) && record.discount != null && record.discount > ${QUOTE_DISCOUNT_CEILING}` - } - ] -}); - -// src/marketing/objects/index.ts -var objects_exports4 = {}; -__export(objects_exports4, { - Campaign: () => Campaign, - CampaignMember: () => CampaignMember -}); - -// src/marketing/objects/campaign.object.ts -import { ObjectSchema as ObjectSchema17, Field as Field17 } from "@objectstack/spec/data"; -import { F as F12, P as P18 } from "@objectstack/spec"; -var Campaign = ObjectSchema17.create({ - name: "crm_campaign", - label: "Campaign", - pluralLabel: "Campaigns", - icon: "megaphone", - description: "Marketing campaigns and initiatives", - // ADR-0090 D1/D7: OWD is an authored decision. Campaign catalog is org-visible; only owners edit. - sharingModel: "public_read", - // ADR-0079: render-only `titleFormat` retired in favor of `nameField`, - // which names a real field. The former template composed two local fields, so - // a `display_title` formula field reproduces it for the record title. - nameField: "display_title", - // Explicit search targets (ADR-0061). REQUIRED because nameField is a - // FORMULA (display_title/full_name): without this, $search auto-defaults to - // the formula field, which isn't a real column, so the lookup picker + global - // search silently return zero. These are real, indexed columns. - searchableFields: ["name", "campaign_code"], - highlightFields: ["campaign_code", "name", "type", "status", "start_date"], - // Every other business object with a detail page groups its fields; campaign - // was one of the two that did not, so its detail page fell back to one flat - // 30-field grid with the ROI formulas sitting next to the campaign name. The - // labels mirror the sections the campaign form uses (Campaign Information / - // Schedule / Budget & ROI / Performance) so the two surfaces agree — the - // form's old three-section shape buried the two manual-entry cost fields in a - // combined "Schedule & Budget" row and was split to match this one (#597). - fieldGroups: [ - { key: "basic", label: "Campaign Information", icon: "megaphone" }, - { key: "schedule", label: "Schedule", icon: "calendar" }, - { key: "budget", label: "Budget & ROI", icon: "dollar-sign" }, - { key: "metrics", label: "Performance", icon: "bar-chart" }, - { key: "assignment", label: "Ownership", icon: "user" }, - { key: "assets", label: "Campaign Assets", icon: "link", collapse: "collapsed" } - ], - fields: { - // Platform ownership anchor — canonical note in `account.object.ts` (#548). - owner_id: Field17.lookup("sys_user", { - label: "Campaign Owner", - group: "assignment", - system: true, - readonly: false, - trackHistory: true - }), - // AutoNumber field - campaign_code: Field17.autonumber({ - group: "basic", - label: "Campaign Code", - format: "CPG-{0000}" - }), - // Basic Information - name: Field17.text({ - group: "basic", - label: "Campaign Name", - required: true, - storage: { notNull: true }, - searchable: true, - maxLength: 255 - }), - // ADR-0079 record title (was titleFormat '{campaign_code} - {name}'). - display_title: Field17.formula({ - group: "basic", - label: "Display Title", - expression: F12`record.campaign_code + " - " + record.name` - }), - description: Field17.markdown({ - group: "basic", - label: "Description" - }), - // Type & Channel - type: Field17.select({ - group: "basic", - label: "Campaign Type", - options: [ - { label: "Email", value: "email", default: true }, - { label: "Webinar", value: "webinar" }, - { label: "Trade Show", value: "trade_show" }, - { label: "Conference", value: "conference" }, - { label: "Direct Mail", value: "direct_mail" }, - { label: "Social Media", value: "social_media" }, - { label: "Content Marketing", value: "content" }, - { label: "Partner Marketing", value: "partner" } - ] - }), - channel: Field17.select({ - group: "basic", - label: "Primary Channel", - options: [ - { label: "Digital", value: "digital" }, - { label: "Social", value: "social" }, - { label: "Email", value: "email" }, - { label: "Events", value: "events" }, - { label: "Partner", value: "partner" } - ] - }), - // Status - status: Field17.select({ - group: "basic", - label: "Status", - options: [ - { label: "Planning", value: "planning", color: "#999999", default: true }, - { label: "In Progress", value: "in_progress", color: "#FFA500" }, - { label: "Completed", value: "completed", color: "#00AA00" }, - { label: "Aborted", value: "aborted", color: "#FF0000" } - ], - required: true, - storage: { notNull: true }, - trackHistory: true - }), - // Dates - start_date: Field17.date({ - group: "schedule", - label: "Start Date", - required: true, - storage: { notNull: true } - }), - end_date: Field17.date({ - group: "schedule", - label: "End Date", - required: true, - storage: { notNull: true } - }), - // Budget & ROI - budgeted_cost: Field17.currency({ - group: "budget", - label: "Budgeted Cost", - min: 0 - }), - actual_cost: Field17.currency({ - group: "budget", - label: "Actual Cost", - min: 0 - }), - expected_revenue: Field17.currency({ - group: "budget", - label: "Expected Revenue", - min: 0 - }), - // ⛔ NOT `readonly` (here and on the num_* snapshot fields below), and the - // reason holds on the pinned engine rather than on the retired 16.x claim - // this note used to carry. The metric block — `CAMPAIGN_METRIC_FIELDS` in - // `campaign.hook.ts` — is written by FOUR refresh hooks, not by the - // long-retired `campaign_snapshot_metrics`: `campaign_metrics_refresh`, - // `campaign_attribution_refresh`, `campaign_lead_conversion_refresh` and - // `campaign_member_metrics_refresh`. Every one of them writes - // `api.object('crm_campaign').update(...)`, and none declares `Hook.runAs`, - // which defaults to `'inherit'` — so `ctx.api` is a `ScopedContext` over the - // ACTING USER's context, and the keys are CALLER-supplied to a - // non-`isSystem` UPDATE, exactly what `stripReadonlyFields` deletes. Their - // least-privileged trigger is an ordinary user edit — a rep moving a - // campaign's status, saving an opportunity, enrolling a member — so - // `readonly` here would freeze the whole block at its seeded values. - // Measured in `test/activity-recency.test.ts`, which runs this same - // `ctx.api` shape through the real engine under a plain user context. - actual_revenue: Field17.currency({ - group: "budget", - label: "Actual Revenue", - min: 0 - }), - // Metrics - target_size: Field17.number({ - group: "metrics", - label: "Target Size", - description: "Target number of leads/contacts", - min: 0 - }), - // NOT `readonly`: written by the same four refresh hooks, and for the same - // reason — see the note on `actual_revenue` above. - // Definition: total members enrolled. - num_sent: Field17.number({ - group: "metrics", - label: "Number Sent", - min: 0 - }), - num_responses: Field17.number({ - group: "metrics", - label: "Number of Responses", - min: 0 - }), - num_leads: Field17.number({ - group: "metrics", - label: "Number of Leads", - min: 0 - }), - num_converted_leads: Field17.number({ - group: "metrics", - label: "Converted Leads", - min: 0 - }), - num_opportunities: Field17.number({ - group: "metrics", - label: "Opportunities Created", - min: 0 - }), - num_won_opportunities: Field17.number({ - group: "metrics", - label: "Won Opportunities", - min: 0 - }), - // Calculated Metrics (Formula Fields) - response_rate: Field17.formula({ - group: "metrics", - label: "Response Rate %", - expression: F12`coalesce(record.num_sent, 0) > 0 ? (coalesce(record.num_responses, 0) * 100.0) / record.num_sent : 0.0`, - scale: 2 - }), - roi: Field17.formula({ - group: "budget", - label: "ROI %", - expression: F12`coalesce(record.actual_cost, 0) > 0 ? ((coalesce(record.actual_revenue, 0) - record.actual_cost) * 100.0) / record.actual_cost : 0.0`, - scale: 2 - }), - // No `parent_campaign`. Campaign hierarchy was declared and never used: no - // page, doc or report mentioned it, and the honest consumer for it — a - // rolled-up ROI — cannot be one declaration. `roi` here is a formula over - // this campaign's OWN `actual_cost` / `actual_revenue`, so a hierarchy ROI - // would put a second, differently-scoped ROI on the same record and leave - // every reader to guess which one they were looking at. - // Campaign Assets - landing_page_url: Field17.url({ - group: "assets", - label: "Landing Page" - }), - is_active: Field17.boolean({ - group: "assets", - label: "Active", - defaultValue: true - }) - }, - // Database indexes - indexes: [ - { fields: ["name"] }, - { fields: ["type"] }, - { fields: ["status"] }, - { fields: ["start_date"] }, - { fields: ["owner_id"] } - ], - // Enable advanced features - // API surface. History → Field.trackHistory (ADR-0052). - enable: { - apiEnabled: true, - apiMethods: ["get", "list", "create", "update", "delete"] - }, - // Validation Rules - // - // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the - // rule returns a verdict even when the merged record has no such key. See - // AGENTS.md "Validation predicates must be TOTAL" and - // test/object-validation-predicates.test.ts, which fails the build otherwise. - validations: [ - { - name: "end_after_start", - type: "script", - severity: "error", - message: "End Date must be after Start Date", - // `<=`, not `<`: the message promises "after", so a campaign that ends - // the day it starts is a violation. Matches `crm_contract`'s twin rule - // and `crm_forecast.period_end_after_start` (#514 item 12). - condition: P18`has(record.end_date) && record.end_date != null && has(record.start_date) && record.start_date != null && record.end_date <= record.start_date` - }, - { - name: "actual_cost_within_budget", - type: "script", - severity: "warning", - message: "Actual Cost exceeds Budgeted Cost", - condition: P18`has(record.actual_cost) && record.actual_cost != null && has(record.budgeted_cost) && record.budgeted_cost != null && record.actual_cost > record.budgeted_cost` - } - ] - // Workflow Rules - // ⚠️ No `workflows[]` here, and none is possible: object `workflows[]` were - // removed from the platform. Field updates live in this object's `*.hook.ts`; - // scheduled status flips and notifications live in `src/*/flows/*.flow.ts`. -}); - -// src/marketing/objects/campaign_member.object.ts -import { ObjectSchema as ObjectSchema18, Field as Field18 } from "@objectstack/spec/data"; -import { P as P19 } from "@objectstack/spec"; -var CampaignMember = ObjectSchema18.create({ - name: "crm_campaign_member", - label: "Campaign Member", - pluralLabel: "Campaign Members", - icon: "user-plus", - description: "Membership and response tracking for marketing campaigns", - // ADR-0090 D1/D7: OWD is an authored decision. Membership is an attribute of - // the campaign, so record access DERIVES from it (ADR-0055). The relation - // resolver accepts the REQUIRED `crm_campaign` LOOKUP as the parent, so no - // master-detail conversion is needed. - // - // The derivation delivers exactly "members whose `crm_campaign` the caller - // can read". ⚠️ Master accessibility resolves through the same paths a direct - // read of the campaign takes — ownership and `sys_record_share` grants folded - // in ALONGSIDE the master's row-level security policies, not the policies - // alone. `test/parent-derived-reach.test.ts` pins that, and was written to go - // red the day the platform changes it: an earlier version consulted master - // RLS ONLY, under a SYSTEM context, so with no policy narrowing a SELECT on - // `crm_campaign` a member row was readable by every holder of object-level - // read on this object. - // - // ⚠️ The write side reaches further than reads: the platform's - // `member_default` set carries an owner-only-writes RLS policy on updates, - // and because the derivation folds master RLS in, that policy reaches through - // to member writes — see the `marketing_campaign_updates` note in - // `src/sales/profiles/marketing-user.profile.ts`. - // - // ⛔ Not `private`: with no owner field on the junction row that resolves to - // "whoever inserted it", which is nobody's idea of campaign membership and - // hides rows written by the enrollment flow. - sharingModel: "controlled_by_parent", - // Per-field history is opt-in via `Field.trackHistory` (ADR-0052), set on - // `status` below — there is no object-level history flag. - // ADR-0079: junction rows have no derivable text title; point the canonical - // nameField at the stored autonumber explicitly (autonumber is not in the - // auto-derivation whitelist). - nameField: "member_number", - // Load-bearing on TWO surfaces, and the second one is why this list is not - // the side that gave way to fix `field-group-shadowed` below (#715). Besides the - // detail highlight strip, it is what curates the members panel on a - // campaign's detail page: a related list takes its columns from the child's - // `highlightFields` minus the lookup it is scoped by, and this object ships - // no view at all, so dropping `crm_lead`/`crm_contact` here would leave that - // panel showing Status / Response Date and no person — measured and pinned in - // `test/view-references.test.ts` (#944). - highlightFields: ["crm_campaign", "crm_lead", "crm_contact", "status", "response_date"], - // Both groups render on detail pages as well as on forms, and keeping them - // that way is a constraint on the two lists above, not a free choice (#715). - // A synthesized detail page hoists the record title plus the first four - // highlightFields out of the body, so a group whose every field is hoisted - // keeps its heading on forms and silently disappears from detail pages - // (`field-group-shadowed`). - // `basic` was exactly that: member_number is the title, and campaign/lead/ - // contact are the first three of the strip. `added_date` — the enrollment - // stamp, which describes the MEMBERSHIP rather than the person's response — - // sits here rather than under `response` so the group has something of its - // own to show. Same resolution as `crm_task`'s shadowed `assignment` group - // (#582): move the field to the group it reads under, leave the strip alone. - fieldGroups: [ - { key: "basic", label: "Basic Information", icon: "info" }, - { key: "response", label: "Response Tracking", icon: "activity" } - ], - fields: { - member_number: Field18.autonumber({ - label: "Member Number", - format: "CM-{00000}", - group: "basic" - }), - crm_campaign: Field18.lookup("crm_campaign", { - label: "Campaign", - required: true, - storage: { notNull: true }, - group: "basic", - // Curates the members panel on a campaign — and it is the ONE mechanism - // that actually reaches that panel. Measured in #944 and restated in - // `test/view-references.test.ts`: a detail-page related list reads - // `relatedListColumns` on the CHILD's lookup first, and only without it - // falls back to the child's `highlightFields` minus this lookup. The - // child's `list` view is never consulted, which is why authoring one - // here would not have shown anything. - // - // It is a SUPERSET of the fallback it replaces — Lead / Contact / - // Status / Response Date, in that order — plus the one column the panel - // was missing. `added_date` is the enrollment stamp: `readonly: true` - // (#1667) and written on every enrollment by the two elevated sub-flows - // #1807 built for it, so a marketer could see WHEN a member responded - // but not when they were added, on a register whose whole subject is - // the enrollment. It sits after the person and before the response - // lifecycle, which is the order the row happens in. - // - // ⛔ Deliberately NOT solved by adding `added_date` to - // `highlightFields`: that strip is hoisted out of the detail body, and - // `added_date` is the only field in the `basic` group that is neither - // the record title nor already in the strip — hoisting it would leave - // the group with nothing of its own and silently vanish its heading - // from every detail page (`field-group-shadowed`, the trap the note - // above this object's `fieldGroups` records being rescued from). - relatedListColumns: ["crm_lead", "crm_contact", "added_date", "status", "response_date"] - }), - // `deleteBehavior: 'cascade'` on BOTH party lookups (#696). A lookup - // defaults to `set_null`, and that default made every enrolled person - // permanently undeletable: deleting the lead cleared this column, the - // cleared row instantly violated `lead_or_contact_required` below, and the - // whole delete rolled back with a 400 naming an object the caller never - // touched ("A campaign member must reference either a Lead or a Contact", - // `"object":"crm_lead"`). A GDPR "delete this person" request could not be - // served through the API or the UI. - // - // Cascade rather than `restrict`: this is a JUNCTION row whose entire - // meaning is "this person is enrolled in this campaign". Once the person is - // gone the row denotes nothing, so keeping it (restrict) would only trade - // one undeletable person for a manual un-enrol chore, and the impact this - // fixes is undeletable people, not a confusing message. Cascade also makes - // the object's own rule unfalsifiable by construction: there is no longer a - // reachable state in which a stored member row breaks it. - crm_lead: Field18.lookup("crm_lead", { - label: "Lead", - group: "basic", - deleteBehavior: "cascade", - description: "Set when the member was a Lead at enrollment time" - }), - crm_contact: Field18.lookup("crm_contact", { - label: "Contact", - group: "basic", - deleteBehavior: "cascade", - description: "Set when the member is an existing Contact" - }), - // ⭐ `readonly: true` — DECLARED, and it still costs no writer its write, - // but the reason CHANGED on the @objectstack/* 17.4.0 migration. It used to - // be "the strip is an UPDATE-path rule and every writer here is an INSERT". - // objectql 17.4.0 retired that: a static readonly field is now stripped from - // a NON-SYSTEM caller's INSERT payload inside `engine.insert` too, so an - // ordinary user-context create no longer seeds this column. - // - // Every writer is therefore elevated now, and the elevation is scoped as - // narrowly as AGENTS.md house rule 9 requires — the `campaign_enrollment` - // SCREEN flow stays `runAs: 'user'` and hands only the insert to - // `campaign_lead_member_enroll` / `campaign_contact_member_enroll` - // (`runAs: 'system'`, one `create_record` each); the marketing seed is a - // system write already. Nothing updates it: there is no `update_record` - // node, no hook and no action that writes `added_date`. This column's own - // two halves are pinned in `test/audit-stamp-readonly.test.ts` — the - // enrollment writers still stamp it, and a user-context UPDATE is stripped. - // Ruled #1667 (director seat, decision batch #74, 2026-09-07): an - // enrollment stamp nobody is meant to hand-edit gets the declaration that - // says so. ⛔ The 16.x claim this note used to carry ("every member landed - // with a null Added Date while the flag was on") described an engine this - // repo no longer runs; ⛔ do not resurrect it as a reason to open the - // column back up. - // - // Grouped under `basic`, not `response` (#715): it records when the - // membership was created, which is a fact about the enrollment, not a step - // in the response lifecycle the other stamps track. - added_date: Field18.datetime({ - label: "Added Date", - group: "basic", - readonly: true - }), - // Writers, one per surviving value (#597): - // sent — campaign_enrollment flow, `create_campaign` (leads) and - // `add_contact_to_campaign` (contacts) stamp it on insert. - // responded — the `mark_responded` action (src/marketing/actions/campaign.actions.ts). - // converted — the member's lead converting; `campaign_lead_conversion_refresh` - // (src/sales/objects/lead.campaign-metrics.hook.ts) promotes - // the row when `crm_lead.is_converted` flips. - // unsubscribed — set by a rep (or an opt-out request) on the member row; - // `campaign_member_optout_sync` round-trips it to the - // lead/contact's `email_opt_out`, which is what makes the - // enrollment flow's opt-out filter honour it next run. - // - // `opened` / `clicked` / `bounced` were removed here — see the object - // docblock. Nothing on the platform can produce them. - status: Field18.select({ - label: "Status", - required: true, - storage: { notNull: true }, - group: "response", - trackHistory: true, - options: [ - { label: "Sent", value: "sent", default: true, color: "#A0A0A0" }, - { label: "Responded", value: "responded", color: "#00AA00" }, - { label: "Converted", value: "converted", color: "#7C3AED" }, - { label: "Unsubscribed", value: "unsubscribed", color: "#FF0000" } - ] - }), - // Written by the `mark_responded` action, and by - // `campaign_member_lifecycle` when it back-fills a member whose response - // was recorded by flipping `status` directly. - response_date: Field18.datetime({ - label: "Response Date", - group: "response" - }), - // Kept in lockstep with `status == "responded"` by - // `campaign_member_lifecycle` (beforeInsert/beforeUpdate) — a boolean that - // disagrees with the status it summarises is the shape the response - // surfaces cannot render, and it is what `test/seed-consistency.test.ts` - // already pins on the seed side. - has_responded: Field18.boolean({ - label: "Has Responded", - defaultValue: false, - group: "response" - }) - }, - // Predicates below are TOTAL: every `record.x` read is `has()`-guarded, so the - // rule returns a verdict even when the merged record has no such key. See - // AGENTS.md "Validation predicates must be TOTAL" and - // test/object-validation-predicates.test.ts, which fails the build otherwise. - validations: [ - { - name: "lead_or_contact_required", - type: "script", - severity: "error", - message: "A campaign member must reference either a Lead or a Contact", - condition: P19`(!has(record.crm_lead) || isBlank(record.crm_lead)) && (!has(record.crm_contact) || isBlank(record.crm_contact))` - } - ] -}); - -// src/sales/actions/index.ts -var actions_exports = {}; -__export(actions_exports, { - AccountLogCallAction: () => AccountLogCallAction, - AccountLogMeetingAction: () => AccountLogMeetingAction, - AccountScheduleMeetingAction: () => AccountScheduleMeetingAction, - AddContactToCampaignAction: () => AddContactToCampaignAction, - CloneOpportunityAction: () => CloneOpportunityAction, - ContactLogCallAction: () => ContactLogCallAction, - ContactLogMeetingAction: () => ContactLogMeetingAction, - ContactScheduleMeetingAction: () => ContactScheduleMeetingAction, - ConvertLeadAction: () => ConvertLeadAction, - CreateCampaignAction: () => CreateCampaignAction, - GenerateQuoteAction: () => GenerateQuoteAction, - LeadLogCallAction: () => LeadLogCallAction, - LeadLogMeetingAction: () => LeadLogMeetingAction, - LeadScheduleMeetingAction: () => LeadScheduleMeetingAction, - MarkPrimaryContactAction: () => MarkPrimaryContactAction, - MassUpdateStageAction: () => MassUpdateStageAction, - OpportunityLogCallAction: () => OpportunityLogCallAction, - OpportunityLogMeetingAction: () => OpportunityLogMeetingAction, - OpportunityScheduleMeetingAction: () => OpportunityScheduleMeetingAction, - ScheduleFollowUpAction: () => ScheduleFollowUpAction, - SendEmailAction: () => SendEmailAction -}); - -// src/sales/actions/contact.actions.ts -import { P as P20 } from "@objectstack/spec"; -var MarkPrimaryContactAction = { - name: "mark_primary", - label: "Mark as Primary Contact", - objectName: "crm_contact", - icon: "star", - type: "script", - body: { - language: "js", - source: ` - const id = ctx.recordId; - if (!id) throw new Error('mark_primary requires a recordId'); - await ctx.api.object('crm_contact').update({ id, is_primary: true }, { where: { id } }); - return { ok: true, id, is_primary: true }; - `, - capabilities: ["api.write"], - timeoutMs: 2e3 - }, - locations: ["record_header", "list_item"], - visible: P20`has(record.is_primary) && record.is_primary == false`, - confirmText: "Mark this contact as the primary contact for the account?", - successMessage: "Contact marked as primary!", - refreshAfter: true -}; -var AddContactToCampaignAction = { - name: "add_contact_to_campaign", - label: "Add to Campaign", - objectName: "crm_contact", - icon: "send", - type: "script", - body: { - language: "js", - source: ` - // Value key = the param's field name ('crm_campaign') since the param - // omits an explicit 'name'. Insert uses the REAL lookup field names on - // crm_campaign_member (crm_campaign / crm_contact). - const campaignId = input.crm_campaign ?? null; - if (!campaignId) throw new Error('add_contact_to_campaign requires a campaign id'); - const ids = ctx.recordId ? [ctx.recordId] : []; - if (!ids.length) throw new Error('add_contact_to_campaign: no contact selected'); - const raw = await ctx.api.object('crm_campaign_member').find({ - where: { crm_campaign: campaignId }, - fields: ['crm_contact'], - top: 5000, - }); - const existingRows = Array.isArray(raw) ? raw : (raw?.records ?? []); - const existing = new Set(existingRows.map((r) => r.crm_contact)); - const inserted = []; - let skipped = 0; - for (const contactId of ids) { - if (existing.has(contactId)) { skipped++; continue; } - const row = await ctx.api.object('crm_campaign_member').insert({ - crm_campaign: campaignId, - crm_contact: contactId, - status: 'sent', - }); - inserted.push(row?.id ?? null); - } - return { campaignId, count: inserted.length, skipped, ids: inserted }; - `, - capabilities: ["api.read", "api.write"], - timeoutMs: 1e4 - }, - locations: ["list_toolbar", "list_item"], - params: [ - { - field: "crm_campaign", - objectOverride: "crm_campaign_member", - label: "Campaign", - required: true - } - ], - // An opted-out contact must not be added to a campaign by hand either — the - // enrollment flow already filters them out, and a manual add-to-campaign is - // the obvious way around a filter nobody remembers is there. Same predicate - // the `send_email` action uses. - visible: P20`has(record.email_opt_out) && record.email_opt_out == false`, - successMessage: "Contacts added to campaign!", - refreshAfter: true -}; -var SendEmailAction = { - name: "send_email", - label: "Send Email", - objectName: "crm_contact", - icon: "mail", - // script, not modal: modal submits die on GET /api/v1/meta/object/ - // → 400 in 16.1.0; script actions POST /api/v1/actions/... and execute. - type: "script", - body: { - language: "js", - source: ` - const record = ctx.record ?? {}; - const recipientId = ctx.recordId ?? record.id ?? null; - const to = record.email ? String(record.email) : ''; - const from = ctx.user?.email ?? 'noreply@hotcrm.local'; - const userId = ctx.user?.id ?? null; - const subject = input.subject ? String(input.subject) : ('Email to ' + to); - const body = input.body ? String(input.body) : ''; - const email = await ctx.api.object('sys_email').insert({ - from_address: from, - to_addresses: to, - subject, - body_text: body, - status: 'queued', - related_object: 'crm_contact', - related_id: recipientId, - sent_by: userId, - }); - - ${ACTOR_NAME_RESOLUTION_SOURCE} - - // Surface the email on the contact's unified activity timeline - // (the audit writer only logs generic CRUD; this is the semantic event). - const activity = await ctx.api.object('sys_activity').insert({ - type: 'completed', - summary: 'Email: ' + subject, - actor_id: userId, - actor_name: actorName, - object_name: 'crm_contact', - record_id: recipientId, - record_label: record.full_name ?? record.name ?? to, - // ADR-0052 ActivityPointer: structured pointer to the rich source entity - // (the sys_email row) so the timeline renders a "View source \u2192" drill to - // the full email \u2014 the queryable replacement for stashing the id in metadata. - source_object: 'sys_email', - source_id: email?.id ?? null, - metadata: JSON.stringify({ kind: 'email', to, subject }), - }); - // #592 scope item 3: every activity writer bumps interaction recency. - // An email is an interaction but NOT a calendar slot, so it writes no - // \`crm_event\` \u2014 which means it cannot ride the event hook's bubble and - // has to stamp the two timestamps itself. Both columns are deliberately - // non-readonly (see crm_account.last_activity_date's note): a readonly - // field is stripped from any non-system write whose caller supplied the - // key (#2948), and an action body runs under the sending rep's context. - if (recipientId) { - const nowIso = new Date().toISOString(); - try { - await ctx.api.object('crm_contact').update( - { id: recipientId, last_contacted_date: nowIso }, - { where: { id: recipientId } }, - ); - } catch (e) { /* best-effort recency; never fail the send */ } - const accountId = record.crm_account ? String(record.crm_account) : null; - if (accountId) { - try { - await ctx.api.object('crm_account').update( - { id: accountId, last_activity_date: nowIso.slice(0, 10) }, - { where: { id: accountId } }, - ); - } catch (e) { /* best-effort recency; never fail the send */ } - } - } - return { emailId: email?.id, activityId: activity?.id }; - `, - capabilities: ["api.read", "api.write"], - timeoutMs: 5e3 - }, - locations: ["record_header", "list_item"], - visible: P20`has(record.email_opt_out) && record.email_opt_out == false`, - params: [ - { name: "subject", label: "Subject", type: "text", required: true }, - { name: "body", label: "Body", type: "textarea", required: true } - ], - refreshAfter: false -}; - -// src/sales/actions/lead.actions.ts -import { P as P21 } from "@objectstack/spec"; -var ConvertLeadAction = { - name: "convert_lead", - label: "Convert Lead", - objectName: "crm_lead", - icon: "arrow-right-circle", - type: "flow", - target: "lead_conversion", - locations: ["record_header", "list_item"], - // Convert is the lead's most basic outcome — surface it on ANY open lead - // (new / contacted / qualified), not just qualified. Gating to qualified-only - // hid the button on most seeded leads, so it read as "conversion is missing". - // Only already-converted or disqualified leads hide it. - // - // TOTALITY (AGENTS.md → "Validation predicates must be TOTAL", #630): every - // `record.x` read carries a `has(record.x)`, and the guards are arranged to - // fail CLOSED — an unknown record hides the button. That arrangement is a - // MEASUREMENT, not a preference. Measured in the browser on console 17.4.0 by - // instrumenting the shipped predicate evaluator: the record page evaluates this - // predicate twice against an EMPTY record (`record` is `{}`, zero keys) before - // the row lands, then re-evaluates it against the full row. So an absent - // `status` here means "no record yet", never "a lead with no status" — a lead - // with no status cannot exist, since `status` is `required` with - // `storage: { notNull: true }` and `defaultValue: 'new'` (src/sales/objects/lead.object.ts), - // and the REST payload this surface reads carries every declared column. - // Fail-open (`!has(record.status) || …`) would therefore buy nothing and cost - // something real: Convert would flash on a disqualified lead for the - // pre-hydration beat, on an IRREVERSIBLE action. - // Unguarded, strict CEL aborted the whole predicate on those two renders - // (`[runtime] No such key: status`) and object-ui fell back to its own - // `fallback: false`, so this spelling states the policy the error path was - // already applying — minus the console warning on every lead page load. (#1890) - // - // ⚠️ The approval term is the ONE fail-OPEN read in this predicate, and the - // asymmetry is deliberate rather than an oversight in an otherwise - // fail-closed arrangement (REQ-0005 step 7). The two terms above fail closed - // because an absent `status` means "no record yet" — a lead with no status - // cannot exist, since `status` is `required` with a `defaultValue`. An absent - // `conversion_approval_status` means something else entirely: a lead written - // before the column existed, which must convert the way it always did. And - // the shipped `not_required` default is the gate's OFF position, so treating - // "not one of the two refusing verdicts" as convertible is what makes the - // default install behave exactly as it did before this field. `lead.hook.ts` - // and `lead-conversion.flow.ts`'s `decision_approval` carry the same polarity - // — the three surfaces have to agree about what "off" means, or the button - // disappears on leads the write path would happily convert. - // - // ⛔ Hiding this button is NOT the gate. It is the courtesy half; the control - // is the `beforeUpdate` refusal in `lead.hook.ts`, which a REST caller cannot - // route around. - visible: P21`has(record.is_converted) && record.is_converted == false && has(record.status) && record.status != "unqualified" && record.status != "converted" - && (!has(record.conversion_approval_status) || (record.conversion_approval_status != "pending" && record.conversion_approval_status != "rejected"))`, - // NO `confirmText`. A screen flow IS the confirmation, and this one opens - // `Conversion Details` — a screen carrying the decision (`Create - // Opportunity?`, and the deal's name and amount), a Cancel button, and the - // suspected-duplicate warning that says something TRUE about THIS lead. A - // dialog in front of it costs every conversion one extra click to answer a - // question it cannot help anyone answer. Confirms are for DESTRUCTIVE actions - // with no follow-up UI — `close_case` / `escalate_case` in `case.actions.ts` - // are the shape that still earns one. - // - // Mechanism, measured on the console this app pinned at that taking - // (@objectstack/console 17.3.0, `dist/assets/`; this bundle read was ⛔ NOT - // re-taken on any later pin — 17.4.0, PR #1814, or 17.5.0) rather than - // assumed: the runner gates the dialog on - // the key's presence alone — - // if (action.confirmText && !await confirmHandler(evaluate(action.confirmText))) - // return { success: false, error: 'Action cancelled by user' }; - // — so REMOVING the key is what removes the dialog; there is no `confirm: - // false` to write, and no other key re-raises it. - successMessage: "Lead converted successfully!", - refreshAfter: true, - // ADR-0011 — opt this Action in to AI, which materialises the - // `action_convert_lead` tool the `lead_qualification` skill references. - // Flow-typed with a target, so it has a headless path. `requiresConfirmation` - // is the only key the AI path reads: `actionLooksDestructive` consults - // `ai.requiresConfirmation` and nothing else, and the console's - // confirm-dialog string reached no AI code — so dropping `confirmText` above - // leaves the AI approval signal exactly where it was. The flag is SURFACED, - // not enforced — `list_actions` reports `requiresConfirmation: true` and the - // calling client decides what to do with it, while `run_action` dispatches - // the flow with no server-side pause. It warns the caller that this is - // irreversible; it is not a lock. - ai: { - exposed: true, - requiresConfirmation: true, - description: "Converts a qualified lead into an account, contact and opportunity. Irreversible \u2014 requires human approval before it runs." - } -}; -var ScheduleFollowUpAction = { - name: "schedule_followup", - label: "Schedule Follow-up", - objectName: "crm_lead", - icon: "calendar-plus", - type: "flow", - target: "schedule_followup", - locations: ["record_header", "list_item"], - // A converted or disqualified lead has no next touch to schedule. - visible: P21`has(record.is_converted) && record.is_converted == false && has(record.status) && record.status != "unqualified" && record.status != "converted"`, - successMessage: "Follow-up scheduled.", - refreshAfter: true, - // ADR-0011 — materialises `action_schedule_followup` for the - // `lead_qualification` skill. Additive and reversible, so no approval gate. - ai: { - exposed: true, - description: "Schedules the next follow-up task on a lead, assigned to its owner, so the next touch lands on the rep list." - } -}; -var CreateCampaignAction = { - name: "create_campaign", - label: "Add to Campaign", - objectName: "crm_lead", - icon: "send", - // script, not modal — a `type: 'modal'` action has NO server dispatch at all: - // the renderer just opens its `target`, and the runtime refuses it over REST - // (`headlessActionTypeError`, 400 "a client-side action with no server - // dispatch"), so its `body` never runs. To collect input and then run - // server-side, the shape is `type: 'script'` + `params` — the runner collects - // the same dialog. See ScheduleFollowUpAction. - type: "script", - body: { - language: "js", - source: ` - // Value key = the param's field name ('crm_campaign') since the param - // omits an explicit 'name'. Insert uses the REAL lookup field names on - // crm_campaign_member (crm_campaign / crm_lead) \u2014 not the generic - // campaign_id / lead_id an earlier revision of the doc example taught, - // which don't exist here and left crm_campaign null \u2192 'Campaign required' - // validation failure. - const campaignId = input.crm_campaign ?? null; - if (!campaignId) throw new Error('create_campaign requires a campaign id'); - // One lead per dispatch \u2014 the bare-string \`bulkActions\` wiring fans this - // body out once per selected row (see the note above). \`ids\` stays a - // list so the dedupe + skip loop below reads the same on both contracts, - // should this action ever move to an aggregate def. - const ids = ctx.recordId ? [ctx.recordId] : []; - if (!ids.length) throw new Error('create_campaign: no lead selected'); - // Skip leads already on this campaign \u2014 the modal copy promises - // duplicates are skipped, and re-running the action on the same - // selection must not double-count marketing touches. - const raw = await ctx.api.object('crm_campaign_member').find({ - where: { crm_campaign: campaignId }, - fields: ['crm_lead'], - top: 5000, - }); - const existingRows = Array.isArray(raw) ? raw : (raw?.records ?? []); - const existing = new Set(existingRows.map((r) => r.crm_lead)); - const inserted = []; - let skipped = 0; - for (const leadId of ids) { - if (existing.has(leadId)) { skipped++; continue; } - const row = await ctx.api.object('crm_campaign_member').insert({ - crm_campaign: campaignId, - crm_lead: leadId, - status: 'sent', - }); - inserted.push(row?.id ?? null); - } - return { campaignId, count: inserted.length, skipped, ids: inserted }; - `, - capabilities: ["api.read", "api.write"], - timeoutMs: 1e4 - }, - // list_item gives every row a working record-scoped entry point. The - // list_toolbar button is single-record by construction: with no `_selectedIds` - // in the bag the dispatcher resolves a recordId from the grid selection, and a - // multi-row selection there is ambiguous, so it is refused client-side with - // "This action runs on a single record — select exactly one row." - // Multi-lead enrollment is the SELECTION-BAR button instead, which the view's - // `bulkActions: ['create_campaign']` produces and which fans out per row. - locations: ["list_toolbar", "list_item"], - params: [ - // Field-backed param: `field` + `objectOverride` make the console resolve - // the widget from crm_campaign_member.crm_campaign (a lookup → crm_campaign), - // rendering a RECORD PICKER. A bare `{ type:'lookup' }` with no field can't - // resolve a target object and silently falls back to a paste-the-ID textbox. - { - field: "crm_campaign", - objectOverride: "crm_campaign_member", - label: "Campaign", - required: true - } - ], - successMessage: "Leads added to campaign!", - refreshAfter: true -}; - -// src/sales/actions/opportunity.actions.ts -import { P as P22 } from "@objectstack/spec"; -var CloneOpportunityAction = { - name: "clone_opportunity", - label: "Clone Opportunity", - objectName: "crm_opportunity", - icon: "copy", - type: "script", - body: { - language: "js", - source: ` - const id = ctx.recordId; - if (!id) throw new Error('clone_opportunity requires a recordId'); - // Read the source from ctx.record (seeded by the runner for record-scoped - // actions \u2014 same source send_email uses). This avoids the in-sandbox - // find() that previously faulted, WHILE still copying the REQUIRED fields - // (crm_account / amount / close_date). The old minimal insert set only - // name+stage, so every clone failed the object's required-field + amount>0 - // validations at runtime and no opportunity was ever created. - const src = ctx.record ?? {}; - if (!src.crm_account) { - throw new Error('clone_opportunity: source account not loaded; cannot clone.'); - } - // Give the clone a fresh 90-day close horizon so a copied past date can't - // trip the "close date in the past" validation on a new prospecting deal. - // - // The step is on the UTC calendar because the render below is - // (\`toISOString()\`). The base is \`new Date()\` \u2014 an instant, not a - // stored \`YYYY-MM-DD\` \u2014 so unlike quote.hook/task.hook there is no - // UTC-midnight anchor being read back on the wrong calendar here; the - // only mixture was the step itself. A local \`getDate\`/\`setDate\` step - // preserves WALL-CLOCK time, so a 90-day window containing a DST - // transition is 23 h or 25 h long and the rendered UTC day lands one off - // whenever the clone instant is within an hour of a UTC day boundary. - const horizon = new Date(); - horizon.setUTCDate(horizon.getUTCDate() + 90); - const inserted = await ctx.api.object('crm_opportunity').insert({ - name: 'Copy of ' + (src.name ?? ('opportunity ' + id)), - crm_account: src.crm_account, - primary_contact: src.primary_contact ?? null, - amount: src.amount ?? 1, - stage: 'prospecting', - probability: 10, - close_date: horizon.toISOString().slice(0, 10), - type: src.type ?? null, - lead_source: src.lead_source ?? null, - crm_campaign: src.crm_campaign ?? null, - // Explicit because an action body runs \`isSystem\`, so nothing stamps - // \`owner_id\` for it \u2014 see the note in activity-actions.ts (#548). - owner_id: ctx.user?.id ?? null, - }); - return { id: inserted?.id ?? null }; - `, - capabilities: ["api.read", "api.write"], - timeoutMs: 5e3 - }, - locations: ["record_header", "record_more"], - successMessage: "Opportunity cloned successfully!", - refreshAfter: true -}; -var MassUpdateStageAction = { - name: "mass_update_stage", - label: "Update Stage", - objectName: "crm_opportunity", - icon: "layers", - type: "script", - body: { - language: "js", - source: ` - const newStage = input.stage ?? null; - if (!newStage) throw new Error('mass_update_stage requires a stage'); - // Selection first, single record as the fallback. An aggregate dispatch - // carries the whole selection in \`_selectedIds\` and NO recordId; a - // single-record dispatch carries recordId and no selection. The two are - // never both present, so the order only decides which shape wins if the - // platform ever sends both. - const selected = Array.isArray(input._selectedIds) ? input._selectedIds : []; - const ids = selected.length ? selected : (ctx.recordId ? [ctx.recordId] : []); - if (!ids.length) throw new Error('mass_update_stage: no opportunity selected'); - const missed = []; - let firstCause = ''; - let updated = 0; - for (const id of ids) { - // \`update(data, options)\` \u2014 \`ctx.api\` is the engine repo facade, whose - // update takes a DOCUMENT, not an id. \`updateById(id, data)\` exists on - // ObjectRepository but NOT on the facade the runtime builds when it has - // no scoped context, so this spelling is the only one live on both. - // - // An id that matches no row is a MISS, not an abort, and the engine has - // answered it both ways: through @objectstack/* 17.0.0-rc.6 \`update\` - // RESOLVED WITH NULL, and from 17.0.0 it REJECTS (RECORD_NOT_FOUND / - // 404). Both are handled here, and neither may end the loop \u2014 an - // uncaught rejection on the first stale id would leave every id after - // it unattempted, so re-running the action over the same selection - // would fail at the same row forever and the live rows behind it could - // never be covered. That is strictly worse than the silent-success - // failure #588 pulled this button for, because it is unrecoverable - // from the UI. Collect the miss, keep going, reject once at the end. - // - // The catch is deliberately cause-AGNOSTIC \u2014 but NOT because the cause - // is invisible. Read on 17.4.0 (\`hostErrorToVm\`; not re-read on 17.5.0), a host - // rejection reaches a body as \`name\` and \`message\` plus, when the host - // error carries them, \`code\`, \`status\`, \`fields\` and \`userMessage\` \u2014 - // nothing else, so a stale id arrives branchable as - // \`code === 'RECORD_NOT_FOUND'\` while \`details\` really is dropped. The - // branch is not taken because every cause has the same outcome here \u2014 - // the row did not move, so collect it and keep going \u2014 and narrowing - // the catch to a roster of known codes would let an unlisted cause - // abort the loop, the failure the paragraph above forbids. Message text - // is engine wording and not contract, so \`firstCause\` is carried - // verbatim and never parsed. - let row = null; - try { - row = await ctx.api.object('crm_opportunity').update( - { id: id, stage: newStage }, - { where: { id: id } }, - ); - } catch (err) { - row = null; - if (!firstCause) firstCause = (err && err.message) ? String(err.message) : String(err); - } - // Count only what came back: counting the ATTEMPT is how a stale or - // invisible id turns into a success toast for a write that never - // happened (#588). - if (row) { updated++; } else { missed.push(id); } - } - // Aggregate dispatch is all-or-nothing (objectui#3139): a handler that - // cannot cover the whole selection must reject rather than report partial - // work, because the bar offers no per-row retry \u2014 the retry IS re-running - // the action over the selection, which is safe here since setting a stage - // is idempotent. Rows already moved in this run keep the new stage; the - // error names the ones that did not so the rep can see the difference. - if (missed.length) { - throw new Error( - 'mass_update_stage: ' + missed.length + ' of ' + ids.length - + ' selected opportunities could not be updated (' + missed.join(', ') - + '). Re-run the action on the selection to retry.' - + (firstCause ? ' First cause: ' + firstCause : '') - ); - } - return { stage: newStage, updated }; - `, - capabilities: ["api.write"], - timeoutMs: 1e4 - }, - locations: ["list_toolbar"], - params: [ - { - name: "stage", - label: "New Stage", - type: "select", - required: true, - // Mirrors crm_opportunity.stage exactly — see _picklists.ts. - options: plainOptions(OPPORTUNITY_STAGE_OPTIONS) - } - ], - successMessage: "Opportunities updated successfully!", - refreshAfter: true -}; -var GenerateQuoteAction = { - name: "generate_quote", - label: "Generate Quote", - objectName: "crm_opportunity", - icon: "receipt", - type: "flow", - target: "quote_generation", - // Mirror clone_opportunity's placement (header + overflow menu) so the action - // is reachable both as a primary button and from the "…" menu on narrow - // viewports where the header collapses. - locations: ["record_header", "record_more", "list_item"], - visible: P22`has(record.stage) && record.stage != "closed_won" && record.stage != "closed_lost"`, - successMessage: "Quote created from opportunity!", - refreshAfter: true -}; - -// src/marketing/actions/index.ts -var actions_exports2 = {}; -__export(actions_exports2, { - EnrollLeadsAction: () => EnrollLeadsAction, - MarkRespondedAction: () => MarkRespondedAction -}); - -// src/marketing/actions/campaign.actions.ts -import { P as P23 } from "@objectstack/spec"; -var EnrollLeadsAction = { - name: "enroll_leads", - label: "Enroll Members", - objectName: "crm_campaign", - icon: "user-plus", - type: "flow", - target: "campaign_enrollment", - locations: ["record_header", "record_more"], - // Enrollment only makes sense while the campaign is open — the flow - // double-checks this server-side. - visible: P23`has(record.status) && (record.status == "planning" || record.status == "in_progress")`, - successMessage: "Eligible members enrolled in campaign.", - refreshAfter: true -}; -var MarkRespondedAction = { - name: "mark_responded", - label: "Mark Responded", - objectName: "crm_campaign_member", - icon: "reply", - // script, not modal — a `type: 'modal'` action has no server dispatch at all - // and its body never runs (see `create_campaign`'s note in lead.actions.ts). - type: "script", - body: { - language: "js", - source: ` - const id = ctx.recordId; - if (!id) throw new Error('mark_responded requires a recordId'); - const respondedAt = new Date().toISOString(); - await ctx.api.object('crm_campaign_member').update( - { id, status: 'responded', has_responded: true, response_date: respondedAt }, - { where: { id } }, - ); - return { id, status: 'responded', response_date: respondedAt }; - `, - capabilities: ["api.write"], - timeoutMs: 5e3 - }, - locations: ["record_header", "list_item"], - // Already-responded and converted members have nothing to record; an - // unsubscribed member must not be dragged back into the funnel by a - // mis-click (`campaign_member_optout_sync` has already opted that person out - // of email, and this action would not undo that — leaving the two records - // disagreeing about the same person). - visible: P23`has(record.status) && record.status == "sent"`, - successMessage: "Response recorded on this campaign member.", - refreshAfter: true -}; - -// src/sales/dashboards/index.ts -var dashboards_exports = {}; -__export(dashboards_exports, { - ActivityDashboard: () => ActivityDashboard, - CrmOverviewDashboard: () => CrmOverviewDashboard, - ExecutiveDashboard: () => ExecutiveDashboard, - SalesDashboard: () => SalesDashboard -}); - -// src/sales/dashboards/activity.dashboard.ts -var ActivityDashboard = { - name: "sales_activity_dashboard", - label: "Sales Activity", - description: "Who is talking to customers, how often, and which accounts have gone quiet", - columns: 12, - gap: 4, - refreshIntervalSeconds: 300, - header: { - showTitle: true, - showDescription: true - }, - globalFilters: [ - { - field: "owner_id", - label: { en: "Rep", "zh-CN": "\u9500\u552E\u4EE3\u8868", "es-ES": "Representante", "ja-JP": "\u62C5\u5F53\u8005" }, - type: "lookup", - scope: "dashboard", - optionsFrom: { object: "sys_user", valueField: "id", labelField: "name" } - } - ], - widgets: [ - // ─── Row 1: what happened, and what is booked ───────────────────── - { - id: "interactions_held", - title: "Interactions Logged", - description: "Calls and meetings that actually happened", - type: "metric", - filter: { status: "held" }, - colorVariant: "success", - dataset: "event_metrics", - values: ["event_count"], - layout: { x: 0, y: 0, w: 3, h: 2 } - }, - { - id: "meetings_booked", - title: "Meetings Booked", - description: "Meetings on the calendar that have not happened yet", - type: "metric", - filter: { status: "planned", type: "meeting" }, - colorVariant: "blue", - dataset: "event_metrics", - values: ["event_count"], - layout: { x: 3, y: 0, w: 3, h: 2 } - }, - { - id: "customer_minutes", - title: "Customer Minutes", - description: "Total time spent in front of customers", - type: "metric", - filter: { status: "held" }, - colorVariant: "purple", - dataset: "event_metrics", - values: ["total_minutes"], - layout: { x: 6, y: 0, w: 3, h: 2 } - }, - { - // First widget in the app to use `task_metrics`. The dataset shipped with - // the "My Day" work and then had no consumer at all (#592) — a semantic - // layer nobody queries is a maintenance cost with no reader. - id: "tasks_completed", - title: "Tasks Completed", - description: "Follow-ups closed out \u2014 the other half of activity", - type: "metric", - filter: { is_completed: true }, - colorVariant: "orange", - dataset: "task_metrics", - values: ["task_count"], - layout: { x: 9, y: 0, w: 3, h: 2 } - }, - // ─── Row 2: who, and when ───────────────────────────────────────── - { - id: "activity_by_rep", - title: "Activity by Rep", - description: "Logged interactions per owner \u2014 the coverage question", - type: "bar", - filter: { status: "held" }, - colorVariant: "success", - dataset: "event_metrics", - dimensions: ["owner"], - values: ["event_count"], - layout: { x: 0, y: 2, w: 6, h: 4 }, - chartConfig: { - showLegend: false, - showDataLabels: true, - colors: ["#10B981"] - } - }, - { - id: "activity_by_week", - title: "Activity Volume by Week", - description: "Interactions per week \u2014 is the team speeding up or going quiet?", - type: "area", - filter: { status: "held" }, - colorVariant: "blue", - // The week bucket lives on the DIMENSION, not in a filter — see the - // header note on why the trend belongs on an axis here. The datetime - // filter bound itself works (objectstack#3912 / #3777, 17.0.0); putting - // the trend in a filter would narrow it, which is a different objection. - dataset: "event_metrics", - dimensions: ["start_datetime"], - values: ["event_count"], - layout: { x: 6, y: 2, w: 6, h: 4 }, - chartConfig: { - showLegend: false, - showDataLabels: false, - colors: ["#0EA5E9"], - interaction: { tooltips: true, brush: true } - } - }, - // ─── Row 3: what the activity is about ──────────────────────────── - { - id: "activity_mix", - title: "Activity Mix", - description: "Calls vs meetings vs demos", - type: "donut", - filter: { status: "held" }, - colorVariant: "purple", - dataset: "event_metrics", - dimensions: ["type"], - values: ["event_count"], - layout: { x: 0, y: 6, w: 4, h: 4 }, - chartConfig: { - showLegend: true, - showDataLabels: true, - colors: ["#4169E1", "#10B981", "#8B5CF6", "#F59E0B", "#0EA5E9", "#94A3B8"] - } - }, - { - id: "activity_by_record_type", - title: "Where the Activity Lands", - description: "Which part of the funnel is getting attention", - type: "bar", - filter: { status: "held" }, - colorVariant: "blue", - dataset: "event_metrics", - dimensions: ["related_to_type"], - values: ["event_count"], - layout: { x: 4, y: 6, w: 4, h: 4 }, - chartConfig: { - showLegend: false, - showDataLabels: true, - colors: ["#4169E1"] - } - }, - { - // "Activity per open deal" as two honest numbers rather than one - // fabricated ratio: the semantic layer has no cross-dataset calculated - // measure, so a single "1.8 activities/deal" tile would have to be - // computed by the renderer over two independent queries — which nothing - // does today. A manager reads the pair; a made-up quotient would read as - // measured. Filed as a follow-up rather than faked here. - id: "deal_activity", - title: "Interactions on Deals", - description: "Logged interactions linked to an opportunity \u2014 read against Open Deals \u2192", - type: "metric", - filter: { status: "held", related_to_type: "crm_opportunity" }, - colorVariant: "success", - dataset: "event_metrics", - values: ["event_count"], - layout: { x: 8, y: 6, w: 2, h: 4 } - }, - { - id: "open_deals_for_activity", - title: "Open Deals", - description: "Opportunities still in play", - type: "metric", - filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, - colorVariant: "blue", - dataset: "opportunity_metrics", - values: ["opp_count"], - layout: { x: 10, y: 6, w: 2, h: 4 } - }, - // ─── Row 4: the churn story, now backed by a real signal ────────── - // These window `crm_account.last_activity_date`, which is a `Field.date()` - // (TEXT `YYYY-MM-DD`) — the same shape `customer_churn_signals` already - // filters safely. Until #592 the column was written by nothing at all: the - // bubble that fed it was silently discarded on every invocation because - // the field was `readonly` (#2948). These three tiles are the reason that - // mattered. - { - id: "quiet_accounts_30", - title: "Quiet 30+ Days", - description: "Active accounts with no logged interaction in a month", - type: "metric", - filter: { is_active: true, last_activity_date: { $lt: "{30_days_ago}" } }, - colorVariant: "warning", - dataset: "account_metrics", - values: ["account_count"], - layout: { x: 0, y: 10, w: 4, h: 2 } - }, - { - id: "quiet_accounts_60", - title: "Quiet 60+ Days", - description: "Two months of silence \u2014 the at-risk threshold", - type: "metric", - filter: { is_active: true, last_activity_date: { $lt: "{60_days_ago}" } }, - colorVariant: "orange", - dataset: "account_metrics", - values: ["account_count"], - layout: { x: 4, y: 10, w: 4, h: 2 } - }, - { - id: "quiet_accounts_90", - title: "Quiet 90+ Days", - description: "A quarter with no contact \u2014 intervene or write it off", - type: "metric", - filter: { is_active: true, last_activity_date: { $lt: "{90_days_ago}" } }, - colorVariant: "danger", - dataset: "account_metrics", - values: ["account_count"], - layout: { x: 8, y: 10, w: 4, h: 2 } - } - ] -}; - -// src/sales/dashboards/shared-widgets.ts -var pipelineByStageFunnelWidget = (layout) => ({ - id: "pipeline_by_stage", - title: "Pipeline by Stage", - description: "Open opportunity value at each sales stage", - type: "funnel", - filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, - dataset: "opportunity_metrics", - dimensions: ["stage"], - values: ["total_amount"], - layout, - suppressWarnings: ["chart-config-missing"] - // intentional default rendering -}); -var avgDealSizeMetricWidget = (layout, overrides = {}) => ({ - id: "avg_deal_size", - title: "Avg Deal Size", - description: "Average value of closed-won deals", - type: "metric", - filter: { stage: "closed_won" }, - colorVariant: "orange", - dataset: "opportunity_metrics", - values: ["avg_amount"], - layout, - ...overrides -}); - -// src/sales/dashboards/crm.dashboard.ts -var CrmOverviewDashboard = { - name: "crm_overview_dashboard", - label: "CRM Overview", - description: "Revenue metrics, pipeline analytics, and deal insights", - columns: 12, - gap: 4, - refreshIntervalSeconds: 300, - header: { - showTitle: true, - showDescription: true - // Header action buttons removed: `create_opportunity` / `create_lead` are not - // defined actions and `/reports` is not an in-app view route — all three were - // dead. Re-add real, wired-up actions here when available. - }, - dateRange: { - field: "close_date", - defaultRange: "this_quarter", - allowCustomRange: true - }, - globalFilters: [ - { - field: "owner_id", - label: { en: "Owner", "zh-CN": "\u8D1F\u8D23\u4EBA", "es-ES": "Responsable", "ja-JP": "\u62C5\u5F53\u8005" }, - type: "lookup", - scope: "dashboard", - optionsFrom: { object: "sys_user", valueField: "id", labelField: "name" } - } - ], - widgets: [ - // ─── KPI Row ────────────────────────────────────────────────────── - { - id: "total_revenue", - title: "Total Revenue", - description: "Closed-won revenue this period", - type: "metric", - filter: { stage: "closed_won" }, - colorVariant: "success", - dataset: "opportunity_metrics", - values: ["total_amount"], - layout: { x: 0, y: 0, w: 3, h: 2 } - }, - { - id: "active_deals", - title: "Active Deals", - description: "Open opportunities in the pipeline", - type: "metric", - filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, - colorVariant: "blue", - dataset: "opportunity_metrics", - values: ["opp_count"], - layout: { x: 3, y: 0, w: 3, h: 2 } - }, - { - id: "won_deals", - title: "Won Deals", - description: "Closed-won deals this period", - type: "metric", - filter: { stage: "closed_won" }, - colorVariant: "purple", - dataset: "opportunity_metrics", - values: ["opp_count"], - layout: { x: 6, y: 0, w: 3, h: 2 } - }, - // No overrides left once the fabricated trend is gone. - avgDealSizeMetricWidget({ x: 9, y: 0, w: 3, h: 2 }), - // ─── Charts Row 1 ───────────────────────────────────────────────── - { - id: "revenue_trends", - title: "Revenue Trends", - description: "Closed-won revenue over the last 12 months", - type: "area", - filter: { stage: "closed_won", close_date: { $gte: "{12_months_ago}" } }, - filterBindings: { dateRange: false }, - // self-scoped to 12 months — the date picker must not narrow it - colorVariant: "success", - dataset: "opportunity_metrics", - dimensions: ["close_date"], - values: ["total_amount"], - layout: { x: 0, y: 2, w: 9, h: 4 }, - chartConfig: { - showLegend: false, - showDataLabels: false, - colors: ["#10B981"], - interaction: { tooltips: true, brush: true } - }, - options: { dateGranularity: "month" } - }, - { - id: "lead_source", - title: "Lead Source", - description: "Pipeline value by acquisition channel", - type: "donut", - colorVariant: "purple", - dataset: "opportunity_metrics", - dimensions: ["lead_source"], - values: ["total_amount"], - layout: { x: 9, y: 2, w: 3, h: 4 }, - chartConfig: { - showLegend: true, - showDataLabels: true, - colors: ["#4F46E5", "#06B6D4", "#10B981", "#F59E0B", "#EF4444", "#8B5CF6"] - } - }, - // ─── Charts Row 2 ───────────────────────────────────────────────── - pipelineByStageFunnelWidget({ x: 0, y: 6, w: 6, h: 4 }), - { - id: "top_products", - title: "Top Products", - description: "Total list-price revenue by product category", - type: "bar", - colorVariant: "blue", - // crm_product has no `close_date`, so the date picker would fail it with - // `no such column`. ObjectStack 15 (framework#2501) injects every dashboard - // filter (dateRange + globalFilters) into each widget's query. - // The `owner_id` opt-out is SEMANTIC, not structural: since #548 every - // business object carries the injected `owner_id`, so the filter would now - // resolve — it just means nothing on a shared product catalog, where the - // column records whoever created the entry. - filterBindings: { dateRange: false, owner_id: false }, - dataset: "product_metrics", - dimensions: ["category"], - values: ["list_price_sum"], - layout: { x: 6, y: 6, w: 6, h: 4 }, - chartConfig: { - showLegend: false, - showDataLabels: true, - colors: ["#4F46E5"] - } - }, - // ─── Pipeline by Owner ──────────────────────────────────────────── - // A dashboard `table` binds to an analytics dataset (a cube), so it must - // aggregate — it cannot list raw records (ADR-0021). The previous - // "Recent Opportunities" table selected only the `opp_count` measure with - // no dimension, which renders a single summary row, not a per-deal list. - // For a true per-record listing, surface an object-bound ListView through - // app navigation instead (ADR-0017). Here we group by owner for a rep - // pipeline breakdown that renders one row per owner. - { - id: "pipeline_by_owner", - title: "Pipeline by Owner", - description: "Open pipeline value and deal count per sales rep", - type: "table", - filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, - colorVariant: "default", - dataset: "opportunity_metrics", - dimensions: ["owner"], - values: ["total_amount", "opp_count", "avg_amount"], - layout: { x: 0, y: 10, w: 12, h: 4 }, - options: { - sortBy: "total_amount", - sortOrder: "desc", - limit: 10 - } - } - ] -}; - -// src/sales/dashboards/executive.dashboard.ts -var LEAD_SOURCE_FILTER_LABELS = { - web: { en: "Web", "zh-CN": "\u7F51\u7AD9", "es-ES": "Web", "ja-JP": "\u30A6\u30A7\u30D6" }, - referral: { en: "Referral", "zh-CN": "\u63A8\u8350", "es-ES": "Referencia", "ja-JP": "\u7D39\u4ECB" }, - event: { en: "Event / Trade Show", "zh-CN": "\u6D3B\u52A8 / \u5C55\u4F1A", "es-ES": "Evento / Feria", "ja-JP": "\u30A4\u30D9\u30F3\u30C8\u30FB\u5C55\u793A\u4F1A" }, - webinar: { en: "Webinar", "zh-CN": "\u7EBF\u4E0A\u7814\u8BA8\u4F1A", "es-ES": "Seminario Web", "ja-JP": "\u30A6\u30A7\u30D3\u30CA\u30FC" }, - partner: { en: "Partner", "zh-CN": "\u5408\u4F5C\u4F19\u4F34", "es-ES": "Socio", "ja-JP": "\u30D1\u30FC\u30C8\u30CA\u30FC" }, - advertisement: { en: "Advertisement", "zh-CN": "\u5E7F\u544A", "es-ES": "Publicidad", "ja-JP": "\u5E83\u544A" }, - paid_search: { en: "Paid Search", "zh-CN": "\u4ED8\u8D39\u641C\u7D22", "es-ES": "B\xFAsqueda de Pago", "ja-JP": "\u6709\u6599\u691C\u7D22" }, - social: { en: "Social Media", "zh-CN": "\u793E\u4EA4\u5A92\u4F53", "es-ES": "Redes Sociales", "ja-JP": "\u30BD\u30FC\u30B7\u30E3\u30EB\u30E1\u30C7\u30A3\u30A2" }, - content: { en: "Content / Blog", "zh-CN": "\u5185\u5BB9 / \u535A\u5BA2", "es-ES": "Contenido / Blog", "ja-JP": "\u30B3\u30F3\u30C6\u30F3\u30C4\u30FB\u30D6\u30ED\u30B0" }, - cold_call: { en: "Cold Call", "zh-CN": "\u964C\u751F\u62DC\u8BBF", "es-ES": "Llamada en Fr\xEDo", "ja-JP": "\u30B3\u30FC\u30EB\u30C9\u30B3\u30FC\u30EB" }, - email_campaign: { en: "Email Campaign", "zh-CN": "\u90AE\u4EF6\u8425\u9500", "es-ES": "Campa\xF1a de Email", "ja-JP": "\u30E1\u30FC\u30EB\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" }, - other: { en: "Other", "zh-CN": "\u5176\u4ED6", "es-ES": "Otro", "ja-JP": "\u305D\u306E\u4ED6" } -}; -var ExecutiveDashboard = { - name: "executive_dashboard", - label: "Executive Overview", - description: "High-level revenue, customer, and pipeline KPIs for leadership", - columns: 12, - gap: 4, - refreshIntervalSeconds: 300, - // 5 minutes - header: { - showTitle: true, - showDescription: true - // Header action buttons removed: they referenced actions/routes that were - // never implemented (`export_dashboard_pdf`, `schedule_dashboard_email`, - // `customize_dashboard` are not defined anywhere), so they rendered as dead - // buttons. Re-add real, wired-up actions here if these features land. - }, - dateRange: { - field: "close_date", - defaultRange: "this_quarter", - allowCustomRange: true - }, - globalFilters: [ - { - field: "owner_id", - label: { en: "Owner", "zh-CN": "\u8D1F\u8D23\u4EBA", "es-ES": "Responsable", "ja-JP": "\u62C5\u5F53\u8005" }, - type: "lookup", - scope: "dashboard", - optionsFrom: { object: "sys_user", valueField: "id", labelField: "name" } - }, - { - field: "lead_source", - label: { en: "Lead Source", "zh-CN": "\u7EBF\u7D22\u6765\u6E90", "es-ES": "Origen del Prospecto", "ja-JP": "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9" }, - type: "select", - scope: "dashboard", - // Roster derived, wording from the language packs — see - // LEAD_SOURCE_FILTER_LABELS above. Order follows the canonical constant. - options: LEAD_SOURCE_OPTIONS.map(({ value }) => ({ - value, - label: LEAD_SOURCE_FILTER_LABELS[String(value)] - })) - } - ], - widgets: [ - // ─── Row 1: Headline KPIs ───────────────────────────────────────── - { - id: "total_revenue_ytd", - title: "Total Revenue (YTD)", - description: "Closed-won revenue this year", - type: "metric", - filter: { stage: "closed_won", close_date: { $gte: "{current_year_start}" } }, - // Self-scoped to YTD; without this the injected dashboard dateRange - // (default this_quarter) is ANDed in and the tile shows quarter revenue. - filterBindings: { dateRange: false }, - dataset: "opportunity_metrics", - values: ["total_amount"], - layout: { x: 0, y: 0, w: 3, h: 2 } - }, - { - id: "total_accounts", - title: "Active Accounts", - description: "Customers with at least one active relationship", - type: "metric", - filter: { is_active: true }, - // crm_account has neither `close_date` nor `lead_source`; opt this widget - // out of both dashboard filters bound to those fields. ObjectStack 15 - // (framework#2501) injects every dashboard filter (dateRange + globalFilters) - // into each widget's query, so a widget on an object lacking a filter field - // fails with `no such column`. crm_account DOES have `owner_id` (injected - // into every business object, #548), so the owner filter is left to apply. - filterBindings: { dateRange: false, lead_source: false }, - dataset: "account_metrics", - values: ["account_count"], - layout: { x: 3, y: 0, w: 3, h: 2 } - }, - { - id: "total_contacts", - title: "Total Contacts", - description: "People in our address book", - type: "metric", - filterBindings: { dateRange: false }, - // crm_contact has no close_date — opt out of the date picker - dataset: "contact_metrics", - values: ["contact_count"], - layout: { x: 6, y: 0, w: 3, h: 2 } - }, - { - id: "open_leads", - title: "Open Leads", - description: "Unconverted leads in the funnel", - type: "metric", - filter: { is_converted: false }, - filterBindings: { dateRange: false }, - // crm_lead has no close_date — opt out of the date picker - dataset: "lead_metrics", - values: ["lead_count"], - layout: { x: 9, y: 0, w: 3, h: 2 } - }, - // ─── Row 2: Revenue Analysis ────────────────────────────────────── - { - id: "revenue_trend", - title: "Revenue Trend", - description: "Closed-won revenue over the last 12 months", - type: "area", - filter: { stage: "closed_won", close_date: { $gte: "{12_months_ago}" } }, - filterBindings: { dateRange: false }, - // self-scoped to 12 months — the date picker must not narrow it - dataset: "opportunity_metrics", - dimensions: ["close_date"], - values: ["total_amount"], - layout: { x: 0, y: 2, w: 8, h: 4 }, - // Default rendering is intentional: the dataset widget plots the selected - // dimension × values directly; a chartConfig would duplicate them inertly. - suppressWarnings: ["chart-config-missing"] - }, - { - id: "revenue_by_industry", - title: "Revenue by Industry", - description: "YTD closed-won revenue split by customer industry", - type: "donut", - filter: { stage: "closed_won", close_date: { $gte: "{current_year_start}" } }, - filterBindings: { dateRange: false }, - // self-scoped to YTD — the date picker must not narrow it - dataset: "opportunity_metrics", - dimensions: ["account_industry"], - values: ["total_amount"], - layout: { x: 8, y: 2, w: 4, h: 4 }, - suppressWarnings: ["chart-config-missing"] - // intentional default rendering (see revenue_trend) - }, - // ─── Row 3: Pipeline & Activity ─────────────────────────────────── - // The funnel now comes from the shared factory (#539); its remaining inert - // config lives in shared-widgets.ts and is out of this PR's scope. - pipelineByStageFunnelWidget({ x: 0, y: 6, w: 6, h: 4 }), - { - id: "new_accounts_by_month", - title: "New Accounts", - description: "Account creation cadence \u2014 last 6 months", - type: "bar", - filter: { created_at: { $gte: "{6_months_ago}" } }, - filterBindings: { dateRange: false, lead_source: false }, - // crm_account has no close_date/lead_source; scopes itself by created_at - dataset: "account_metrics", - dimensions: ["created_at"], - values: ["account_count"], - layout: { x: 6, y: 6, w: 6, h: 4 }, - suppressWarnings: ["chart-config-missing"] - // intentional default rendering (see revenue_trend) - }, - // ─── Row 4: Revenue by Industry ─────────────────────────────────── - // A dashboard `table` binds to an analytics cube, so it aggregates rather - // than listing raw accounts (ADR-0021). The previous "Top Accounts by - // Revenue" table selected only the `account_count` measure with no - // dimension — a single summary row, not a customer ranking. Grouping by - // industry gives a real multi-row breakdown of book-of-business by sector; - // for a per-account list, use an object-bound ListView (ADR-0017). - // Column headers and number formats come from the dataset's dimension and - // measure metadata. - { - id: "accounts_by_industry", - title: "Accounts by Industry", - description: "Total annual revenue and account count per industry", - type: "table", - filterBindings: { dateRange: false, lead_source: false }, - // crm_account has no close_date/lead_source — opt out of both - dataset: "account_metrics", - dimensions: ["industry"], - values: ["annual_revenue_sum", "account_count"], - layout: { x: 0, y: 10, w: 12, h: 4 } - } - ] -}; - -// src/sales/dashboards/sales.dashboard.ts -var SalesDashboard = { - name: "sales_dashboard", - label: "Sales Performance", - description: "Pipeline analytics, win rate trends, and rep performance", - columns: 12, - gap: 4, - refreshIntervalSeconds: 180, - // 3 minutes - header: { - showTitle: true, - // Keep the opening KPI row in the first viewport for a live demo. The - // description remains available in dashboard metadata and translations. - showDescription: false - // Header action buttons removed: `create_opportunity` / `export_dashboard_pdf` - // are not defined actions, and `/reports/forecast` matches no report route — - // all three were dead. Re-add real, wired-up actions here when available. - }, - dateRange: { - field: "close_date", - defaultRange: "this_quarter", - allowCustomRange: true - }, - globalFilters: [ - { - field: "owner_id", - label: { en: "Sales Rep", "zh-CN": "\u9500\u552E\u4EE3\u8868", "es-ES": "Representante de Ventas", "ja-JP": "\u55B6\u696D\u62C5\u5F53\u8005" }, - type: "lookup", - scope: "dashboard", - optionsFrom: { object: "sys_user", valueField: "id", labelField: "name" } - }, - { - field: "type", - label: { en: "Deal Type", "zh-CN": "\u5546\u673A\u7C7B\u578B", "es-ES": "Tipo de Oportunidad", "ja-JP": "\u5546\u8AC7\u30BF\u30A4\u30D7" }, - type: "select", - scope: "dashboard", - options: [ - { value: "new_business", label: { en: "New Business", "zh-CN": "\u65B0\u4E1A\u52A1", "es-ES": "Nuevo Negocio", "ja-JP": "\u65B0\u898F\u30D3\u30B8\u30CD\u30B9" } }, - { value: "existing_upgrade", label: { en: "Existing Customer - Upgrade", "zh-CN": "\u8001\u5BA2\u6237\u5347\u7EA7", "es-ES": "Cliente Existente - Mejora", "ja-JP": "\u65E2\u5B58\u9867\u5BA2 - \u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9" } }, - { value: "existing_renewal", label: { en: "Existing Customer - Renewal", "zh-CN": "\u8001\u5BA2\u6237\u7EED\u7EA6", "es-ES": "Cliente Existente - Renovaci\xF3n", "ja-JP": "\u65E2\u5B58\u9867\u5BA2 - \u66F4\u65B0" } }, - { value: "existing_expansion", label: { en: "Existing Customer - Expansion", "zh-CN": "\u8001\u5BA2\u6237\u62D3\u5C55", "es-ES": "Cliente Existente - Expansi\xF3n", "ja-JP": "\u65E2\u5B58\u9867\u5BA2 - \u62E1\u5927" } } - ] - } - ], - widgets: [ - // ─── Row 1: Pipeline KPIs ───────────────────────────────────────── - { - id: "total_pipeline_value", - title: "Total Pipeline", - description: "Sum of open opportunity value", - type: "metric", - filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, - colorVariant: "blue", - dataset: "opportunity_metrics", - values: ["total_amount"], - layout: { x: 0, y: 0, w: 3, h: 2 } - }, - { - id: "closed_won_qtd", - title: "Closed Won (QTD)", - description: "Revenue closed this quarter", - type: "metric", - filter: { stage: "closed_won", close_date: { $gte: "{current_quarter_start}" } }, - filterBindings: { dateRange: false }, - // self-scoped to QTD — the date picker must not re-window it - colorVariant: "success", - dataset: "opportunity_metrics", - values: ["total_amount"], - layout: { x: 3, y: 0, w: 3, h: 2 } - }, - { - id: "open_opportunities", - title: "Open Opportunities", - description: "Active deals in flight", - type: "metric", - filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, - colorVariant: "orange", - dataset: "opportunity_metrics", - values: ["opp_count"], - layout: { x: 6, y: 0, w: 3, h: 2 } - }, - avgDealSizeMetricWidget({ x: 9, y: 0, w: 3, h: 2 }, { - description: "Average value of closed-won deals this quarter", - filter: { stage: "closed_won", close_date: { $gte: "{current_quarter_start}" } }, - filterBindings: { dateRange: false }, - // self-scoped to QTD — the date picker must not re-window it - colorVariant: "purple" - }), - // ─── Row 2: Win / Loss KPIs ─────────────────────────────────────── - // - // The ratio and its two inputs sit side by side ON PURPOSE (#593). A win - // rate is the failure mode #614 shipped: a wrong denominator raises no - // error, it just prints a plausible percentage. Showing "62%" next to - // "8 won" and "5 lost" means a reader can check the arithmetic at a - // glance, and a half that silently loses its filter stops being invisible. - // - // All three windows are the same self-scoped 12 months (`dateRange: false` - // so the header's date picker cannot re-window one of them and not the - // others — three tiles over three different windows would be worse than - // no tiles at all). - { - // NOTE: no `stage` filter here, and that is deliberate. Both halves of - // the ratio come from the DATASET's own measure filters — `won_count` - // over closed_won, `decided_count` over closed_won + closed_lost — so - // open pipeline is excluded by the measures. A widget-level - // `stage: {$in: [...]}` filter would narrow numerator and denominator - // alike, which is how a ratio quietly becomes a division by itself. - id: "win_rate_12m", - title: "Win Rate (12M)", - description: "Deals won as a share of all deals settled in the last 12 months", - type: "metric", - filter: { close_date: { $gte: "{12_months_ago}" } }, - filterBindings: { dateRange: false }, - colorVariant: "success", - dataset: "opportunity_metrics", - values: ["win_rate"], - layout: { x: 0, y: 2, w: 4, h: 2 } - }, - { - id: "won_deals_12m", - title: "Deals Won (12M)", - description: "The numerator of the win rate", - type: "metric", - filter: { close_date: { $gte: "{12_months_ago}" } }, - filterBindings: { dateRange: false }, - colorVariant: "blue", - dataset: "opportunity_metrics", - values: ["won_count"], - layout: { x: 4, y: 2, w: 4, h: 2 } - }, - { - id: "lost_deals_12m", - title: "Deals Lost (12M)", - description: "The other half of the win-rate denominator", - type: "metric", - filter: { close_date: { $gte: "{12_months_ago}" } }, - filterBindings: { dateRange: false }, - colorVariant: "orange", - dataset: "opportunity_metrics", - values: ["lost_count"], - layout: { x: 8, y: 2, w: 4, h: 2 } - }, - // ─── Row 3: Pipeline & Trends ───────────────────────────────────── - pipelineByStageFunnelWidget({ x: 0, y: 4, w: 6, h: 4 }), - { - id: "monthly_revenue_trend", - title: "Monthly Revenue Trend", - description: "Closed-won revenue, last 12 months", - type: "area", - filter: { stage: "closed_won", close_date: { $gte: "{12_months_ago}" } }, - filterBindings: { dateRange: false }, - // self-scoped to 12 months — the date picker must not narrow it - colorVariant: "success", - dataset: "opportunity_metrics", - dimensions: ["close_date"], - values: ["total_amount"], - layout: { x: 6, y: 4, w: 6, h: 4 }, - chartConfig: { - showLegend: false, - showDataLabels: false, - colors: ["#10B981"], - // No quota annotation line: ChartAnnotationSchema only takes a STATIC - // value, and the real quotas live per-owner/per-period in - // crm_forecast.quota (seeded 500k–1.5M — the old hardcoded 100000 was - // fiction). Quota vs. actual is the quota_attainment_by_rep table - // below, bound to the forecast_metrics dataset. - interaction: { tooltips: true, brush: true } - }, - options: { dateGranularity: "month" } - }, - // ─── Row 4: Performance Breakdown ───────────────────────────────── - { - id: "pipeline_by_forecast_category", - title: "Pipeline by Forecast Category", - description: "Open pipeline grouped by sales forecast category", - type: "horizontal-bar", - filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, - colorVariant: "blue", - dataset: "opportunity_metrics", - dimensions: ["forecast_category"], - values: ["total_amount"], - layout: { x: 0, y: 8, w: 6, h: 4 }, - chartConfig: { - showLegend: false, - showDataLabels: true, - colors: ["#4F46E5"] - } - }, - { - id: "lead_source_breakdown", - title: "Lead Source", - description: "Where our pipeline is coming from", - type: "donut", - filter: { stage: { $nin: ["closed_lost"] } }, - colorVariant: "purple", - dataset: "opportunity_metrics", - dimensions: ["lead_source"], - values: ["total_amount"], - layout: { x: 6, y: 8, w: 6, h: 4 }, - chartConfig: { - showLegend: true, - showDataLabels: true, - colors: ["#4F46E5", "#06B6D4", "#10B981", "#F59E0B", "#EF4444", "#8B5CF6"] - } - }, - // ─── Row 5: Rep Leaderboard ─────────────────────────────────────── - // A dashboard `table` binds to an analytics cube and aggregates; it cannot - // list raw deals (ADR-0021). The previous "Top Open Opportunities" table - // selected only `opp_count` with no dimension — one summary row, not a deal - // ranking. Grouping open pipeline by owner yields a rep leaderboard (one - // row per rep). For a per-deal list, surface an object-bound ListView - // through app navigation (ADR-0017). - { - id: "open_pipeline_by_owner", - title: "Open Pipeline by Owner", - description: "In-flight pipeline value, deal count and avg win probability per rep", - type: "table", - filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, - colorVariant: "default", - dataset: "opportunity_metrics", - dimensions: ["owner"], - values: ["total_amount", "opp_count", "avg_probability"], - layout: { x: 0, y: 12, w: 12, h: 4 }, - options: { - sortBy: "total_amount", - sortOrder: "desc", - limit: 10 - } - }, - // ─── Row 6: Quota Attainment ────────────────────────────────────── - // The real per-rep quota data (crm_forecast.quota) surfaced as a table: - // dashboard chart annotations cannot reference a dataset (static values - // only), so quota vs. actual gets its own widget instead of a fake line. - { - id: "quota_attainment_by_rep", - title: "Quota Attainment by Rep", - description: "Current-quarter quota, closed revenue and attainment per rep, from forecast snapshots", - type: "table", - colorVariant: "default", - // crm_forecast has neither `close_date` nor `type`; opt out of the - // dashboard filters bound to those fields (framework#2501 injects every - // dashboard filter into each widget query). `owner` exists and applies. - filterBindings: { dateRange: false, type: false }, - // ONE period, or the numbers are nonsense (#614). `crm_forecast` holds a - // row per owner PER PERIOD, and `quota_sum` / `closed_sum` are plain - // `sum` measures — so an unpinned query adds this quarter's quota to this - // month's quota to every settled quarter's quota and labels the total - // "Quota". On the shipped seeds that turned a rep's real 1,500,000 - // quarterly quota into 7,940,000, with attainment wrong by the same - // construction (89% instead of 55%). - // - // Both halves of the key are needed. `period: 'quarter'` alone still sums - // every quarter ever snapshotted; `period_start` alone still merges the - // quarter row with the month row that opens the same quarter (Q3 and July - // both start on the 1st). Together they name exactly one snapshot per - // owner — the same (owner, period, period_start) tuple the snapshot sweep - // upserts on and the object indexes. - // - // `{current_quarter_start}` is resolved by the ANALYTICS path, verified - // rather than assumed: `queryDataset` runs both the dataset filter and the - // widget's `runtimeFilter` through `resolveFilterTokens`, which - // understands `{(current|last|next)_(week|month|quarter|year)_(start|end)}` - // and throws `FILTER_TOKEN_UNKNOWN` on anything else. - // - // The LIST path resolves the same macros, and has since 17.0.0-rc.0: - // `resolveFilterTokens()` was wired into the ObjectQL READ path (objectql - // `feat(filters): evaluate {filter-token} placeholders server-side`, - // #3582) ahead of the middleware chain, covering `find` / `findOne` / - // `count` / `aggregate` — the one gate every server-side read passes - // through, saved-view filters included. So this widget's filter and a - // saved view's filter now read the same way, and the sibling - // `this_quarter_forecasts` in `src/sales/views/forecast.view.ts` pins this same - // quarter with this same macro. Measured, not inferred: - // `test/forecast-current-quarter-view.test.ts` runs both filter shapes — - // the `period_start` equality (#730) and the `close_date` range (#743) — - // through a real engine and pins a three-way outcome (current quarter - // only: not zero rows, not every quarter). First taken on 17.0.0-rc.2; - // RE-RUN 2026-09-03 on 17.2.0 (#1467), RE-RUN on 17.3.0 (#1676, the PR - // #1577 pin) and RE-RUN again on 17.4.0 (PR #1814, #1807) — green all - // four times, so the outcome held on every pin it was taken on, not - // only the first. Not yet re-run on 17.5.0. - // - // What stood here before described the two paths as asymmetric and told - // the next author not to generalise between them. That was true on - // @objectstack 16.1.0 and expired at rc.0 (#744). - // - // Cost of pinning to the CURRENT quarter rather than the latest one: for - // the few hours between a quarter boundary and the 03:00 sweep that opens - // the new row, the table is empty. Empty is the honest state — the - // alternative renders last quarter's attainment under a header that says - // this one. - filter: { period: "quarter", period_start: "{current_quarter_start}" }, - dataset: "forecast_metrics", - dimensions: ["owner"], - values: ["quota_sum", "closed_sum", "attainment"], - layout: { x: 0, y: 16, w: 12, h: 4 }, - options: { - sortBy: "attainment", - sortOrder: "desc", - limit: 10 - } - }, - // ─── Row 7: Win / Loss analysis ─────────────────────────────────── - // - // Three widgets over the settled half of the pipeline (#593). Each of the - // two win-rate breakdowns is a TABLE, not a bar chart, and that is the - // whole design: a bar of "67%" is unfalsifiable, whereas a row reading - // "Won 2 · Lost 1 · Settled 3 · 67%" carries its own proof. Perturb either - // half — win a deal that was lost, or lose one that was won — and three of - // those four numbers move. `test/win-loss-capture.test.ts` does exactly - // that against the real dataset executor and the real seeds. - // - // Both tables opt out of the header's `close_date` window - // (`dateRange: false`) for the reason the quota table does: a win rate over - // "this quarter" on a demo database is computed from whichever one or two - // deals happen to have settled inside it, which is noise wearing the - // costume of a KPI. Twelve months is the same window the row-2 tiles and - // the revenue trend use, so the dashboard tells one consistent story. - { - id: "win_rate_by_owner", - title: "Win / Loss by Rep", - description: "Deals won, deals lost and win rate per rep \u2014 last 12 months", - type: "table", - filter: { close_date: { $gte: "{12_months_ago}" } }, - filterBindings: { dateRange: false }, - colorVariant: "default", - dataset: "opportunity_metrics", - dimensions: ["owner"], - values: ["won_count", "lost_count", "decided_count", "win_rate", "won_amount"], - layout: { x: 0, y: 20, w: 6, h: 4 }, - options: { - sortBy: "decided_count", - sortOrder: "desc", - limit: 10 - } - }, - { - id: "win_rate_by_lead_source", - title: "Win / Loss by Lead Source", - description: "Which sources produce deals that actually close \u2014 last 12 months", - type: "table", - filter: { close_date: { $gte: "{12_months_ago}" } }, - filterBindings: { dateRange: false }, - colorVariant: "default", - dataset: "opportunity_metrics", - dimensions: ["lead_source"], - values: ["won_count", "lost_count", "decided_count", "win_rate", "won_amount"], - layout: { x: 6, y: 20, w: 6, h: 4 }, - options: { - sortBy: "decided_count", - sortOrder: "desc", - limit: 12 - } - }, - { - // The loss-reason breakdown the fields were declared for and never got. - // - // `loss_reason` is mandatory on every `closed_lost` record (see - // crm_opportunity), so this chart has no "unattributed" slice to - // apologise for — an empty chart here means no losses in the window, - // never "nobody filled the field in". - // - // Counts, not amounts: the question a loss review asks is "how often did - // we lose for this reason", and one large lost deal should not outweigh - // five recurring feature gaps. `lost_amount` is declared on the dataset - // for the revenue view of the same question. - id: "loss_reason_breakdown", - title: "Why We Lose", - description: "Lost deals by reason \u2014 last 12 months", - type: "donut", - filter: { stage: "closed_lost", close_date: { $gte: "{12_months_ago}" } }, - filterBindings: { dateRange: false }, - colorVariant: "orange", - dataset: "opportunity_metrics", - dimensions: ["loss_reason"], - values: ["opp_count"], - layout: { x: 0, y: 24, w: 12, h: 4 }, - chartConfig: { - showLegend: true, - showDataLabels: true, - colors: ["#EF4444", "#F59E0B", "#8B5CF6", "#06B6D4", "#4F46E5", "#10B981", "#64748B"] - } - }, - // ─── Row 9: Pivot — Stage × Lead Source ─────────────────────────── - { - id: "pipeline_stage_by_source", - title: "Pipeline by Stage \xD7 Lead Source", - description: "Cross-tab of open opportunity amount by stage and source", - type: "pivot", - filter: { stage: { $nin: ["closed_won", "closed_lost"] } }, - colorVariant: "default", - dataset: "opportunity_metrics", - dimensions: ["stage", "lead_source"], - values: ["total_amount"], - layout: { x: 0, y: 28, w: 12, h: 4 } - } - ] -}; - -// src/sales/datasets/index.ts -var datasets_exports = {}; -__export(datasets_exports, { - AccountDataset: () => AccountDataset, - ContactDataset: () => ContactDataset, - EventDataset: () => EventDataset, - ForecastDataset: () => ForecastDataset, - LeadDataset: () => LeadDataset, - OpportunityDataset: () => OpportunityDataset, - TaskDataset: () => TaskDataset -}); - -// src/sales/datasets/opportunity.dataset.ts -import { defineDataset as defineDataset2 } from "@objectstack/spec/ui"; -var OpportunityDataset = defineDataset2({ - name: "opportunity_metrics", - label: "Opportunity Metrics", - description: "Semantic layer for sales-pipeline counts and amounts", - object: "crm_opportunity", - // Include the account relationship so dimensions can traverse it (the join is - // derived from the `crm_account` lookup — no hand-written ON clause). - include: ["crm_account"], - dimensions: [ - { name: "stage", label: "Stage", field: "stage", type: "string" }, - { name: "lead_source", label: "Lead Source", field: "lead_source", type: "string" }, - { name: "forecast_category", label: "Forecast Category", field: "forecast_category", type: "string" }, - { name: "type", label: "Deal Type", field: "type", type: "string" }, - // Semantic name `owner`; column `owner_id`, the platform anchor (#548). - { name: "owner", label: "Owner", field: "owner_id", type: "lookup" }, - // Win/loss attribution (#593). Both columns are now mandatory at close - // (`requiredWhen` on crm_opportunity), so grouping by either one over - // settled deals has no "unattributed" bucket to explain away. - { name: "win_reason", label: "Win Reason", field: "win_reason", type: "string" }, - { name: "loss_reason", label: "Loss Reason", field: "loss_reason", type: "string" }, - // v17 fixes scoped aggregate execution and SQLite's epoch bucketing. - // Trends and quarter coverage need different buckets over the same field, - // so each one is its own semantic dimension. - { name: "close_date", label: "Close Date", field: "close_date", type: "date", dateGranularity: "month" }, - { name: "close_quarter", label: "Close Quarter", field: "close_date", type: "date", dateGranularity: "quarter" }, - // Cross-object dimension: account industry via the crm_account relationship. - { name: "account_industry", label: "Account Industry", field: "crm_account.industry", type: "string" } - ], - measures: [ - { name: "opp_count", label: "Opportunities", aggregate: "count" }, - { name: "total_amount", label: "Total Amount", aggregate: "sum", field: "amount", format: "0,0" }, - { name: "avg_amount", label: "Avg Deal Size", aggregate: "avg", field: "amount", format: "0,0" }, - { name: "avg_probability", label: "Avg Probability", aggregate: "avg", field: "probability", format: "0%" }, - // ─── Win rate (#593) ──────────────────────────────────────────────── - // - // A ratio is the most dangerous kind of measure: a wrong denominator does - // not error, it returns a plausible number (#614 rendered a 1,500,000 - // quota as 7,940,000 because a filter was missing one of its two halves). - // So the two halves are declared here, ONCE, as named measures — not - // improvised per widget — and every widget that shows `win_rate` also - // shows `won_count` and `lost_count` beside it, so the reader can check - // the arithmetic that produced the percentage. - // - // Each carries its OWN `filter`, which the executor honours by running - // that measure as its own sub-query and merging the result back on the - // selected dimensions. That is what lets one widget row hold "won 2, lost - // 1, 67%" — the counts are over different row sets, and only a - // measure-level filter can say so. A widget-level `filter` cannot: it - // narrows the whole row set at once, which is exactly how you end up - // dividing a number by itself. - // - // `decided_count` is deliberately its own filtered count and NOT - // `derived: { op: 'sum', of: ['won_count', 'lost_count'] }`. Measured on - // 17.0.0-rc.1: a filtered measure contributes NO row for a group its - // filter selects nothing in — the count comes back absent, not 0 — and a - // derived measure over an absent input evaluates to null. Summing the two - // would therefore blank the win rate of any rep who has never lost a deal - // (100%, the group you least want to hide). Counting the union directly - // keeps the denominator present whenever the group has any settled deal at - // all. The remaining asymmetry — a group with losses but NO wins reports a - // null win rate rather than 0% — is a platform behaviour, not something a - // widget can paper over; it is pinned by `test/win-loss-capture.test.ts` - // and filed as #656. The tables show `lost_count` next to `win_rate` - // precisely so that a blank rate reads as "0 wins out of 3", not as - // "no data". - { name: "won_count", label: "Won Deals", aggregate: "count", filter: { stage: "closed_won" } }, - { name: "lost_count", label: "Lost Deals", aggregate: "count", filter: { stage: "closed_lost" } }, - { - name: "decided_count", - label: "Settled Deals", - aggregate: "count", - filter: { stage: { $in: ["closed_won", "closed_lost"] } } - }, - { name: "won_amount", label: "Won Revenue", aggregate: "sum", field: "amount", filter: { stage: "closed_won" }, format: "0,0" }, - { name: "lost_amount", label: "Lost Revenue", aggregate: "sum", field: "amount", filter: { stage: "closed_lost" }, format: "0,0" }, - { name: "win_rate", label: "Win Rate", derived: { op: "ratio", of: ["won_count", "decided_count"] }, format: "0%" } - ] -}); - -// src/sales/datasets/account.dataset.ts -import { defineDataset as defineDataset3 } from "@objectstack/spec/ui"; -var AccountDataset = defineDataset3({ - name: "account_metrics", - label: "Account Metrics", - description: "Semantic layer for account counts by industry / type", - object: "crm_account", - dimensions: [ - { name: "industry", label: "Industry", field: "industry", type: "string" }, - { name: "type", label: "Type", field: "type", type: "string" }, - { name: "created_at", label: "Created", field: "created_at", type: "date", dateGranularity: "month" } - ], - measures: [ - { name: "account_count", label: "Accounts", aggregate: "count" }, - { name: "annual_revenue_sum", label: "Annual Revenue", aggregate: "sum", field: "annual_revenue", format: "0,0" } - ] -}); - -// src/sales/datasets/contact.dataset.ts -import { defineDataset as defineDataset4 } from "@objectstack/spec/ui"; -var ContactDataset = defineDataset4({ - name: "contact_metrics", - label: "Contact Metrics", - description: "Semantic layer for contact counts", - object: "crm_contact", - dimensions: [], - measures: [{ name: "contact_count", label: "Contacts", aggregate: "count" }] -}); - -// src/sales/datasets/lead.dataset.ts -import { defineDataset as defineDataset5 } from "@objectstack/spec/ui"; -var LeadDataset = defineDataset5({ - name: "lead_metrics", - label: "Lead Metrics", - description: "Semantic layer for lead counts", - object: "crm_lead", - dimensions: [ - { name: "status", label: "Status", field: "status", type: "string" }, - { name: "lead_source", label: "Source", field: "lead_source", type: "string" }, - { name: "created_at", label: "Created", field: "created_at", type: "date" }, - { name: "last_contacted_date", label: "Last Contacted", field: "last_contacted_date", type: "date", dateGranularity: "month" } - ], - measures: [{ name: "lead_count", label: "Leads", aggregate: "count" }] -}); - -// src/sales/datasets/task.dataset.ts -import { defineDataset as defineDataset6 } from "@objectstack/spec/ui"; -var TaskDataset = defineDataset6({ - name: "task_metrics", - label: "Task Metrics", - description: "Semantic layer for task workload and completion", - object: "crm_task", - dimensions: [ - { name: "status", label: "Status", field: "status", type: "string" }, - { name: "priority", label: "Priority", field: "priority", type: "string" }, - { name: "priority_rank", label: "Urgency", field: "priority_rank", type: "number" }, - { name: "type", label: "Type", field: "type", type: "string" }, - { name: "due_date", label: "Due Date", field: "due_date", type: "date" }, - { name: "is_overdue", label: "Overdue", field: "is_overdue", type: "boolean" }, - { name: "is_completed", label: "Completed", field: "is_completed", type: "boolean" } - ], - measures: [ - { name: "task_count", label: "Tasks", aggregate: "count" }, - { name: "avg_progress", label: "Avg Progress", aggregate: "avg", field: "progress_percent", format: "0.0%" } - ] -}); - -// src/sales/datasets/event.dataset.ts -import { defineDataset as defineDataset7 } from "@objectstack/spec/ui"; -var EventDataset = defineDataset7({ - name: "event_metrics", - label: "Activity Metrics", - description: "Semantic layer for meetings, calls and interaction recency", - object: "crm_event", - dimensions: [ - { name: "type", label: "Activity Type", field: "type", type: "string" }, - { name: "status", label: "Status", field: "status", type: "string" }, - // `owner` is the SEMANTIC name every widget/report selects by; the column - // behind it is the platform ownership anchor `owner_id` (#548). - { name: "owner", label: "Owner", field: "owner_id", type: "string" }, - { name: "related_to_type", label: "Related To", field: "related_to_type", type: "string" }, - { - name: "start_datetime", - label: "Activity Week", - field: "start_datetime", - type: "date", - dateGranularity: "week" - } - ], - measures: [ - { name: "event_count", label: "Activities", aggregate: "count" }, - { - name: "total_minutes", - label: "Minutes", - aggregate: "sum", - field: "duration_minutes", - format: "0,0" - }, - { - name: "avg_minutes", - label: "Avg Duration", - aggregate: "avg", - field: "duration_minutes", - format: "0,0" - } - ] -}); - -// src/sales/datasets/forecast.dataset.ts -import { defineDataset as defineDataset8 } from "@objectstack/spec/ui"; -var ForecastDataset = defineDataset8({ - name: "forecast_metrics", - label: "Forecast Metrics", - description: "Semantic layer for per-owner quota, attainment and pipeline coverage", - object: "crm_forecast", - dimensions: [ - // Semantic name `owner`; column `owner_id`, the platform anchor (#548). - { name: "owner", label: "Owner", field: "owner_id", type: "lookup" }, - { name: "period", label: "Period Type", field: "period", type: "string" }, - { name: "period_label", label: "Period", field: "period_label", type: "string" }, - { name: "period_start", label: "Period Start", field: "period_start", type: "date" } - ], - measures: [ - { name: "quota_sum", label: "Quota", aggregate: "sum", field: "quota", format: "0,0" }, - { name: "closed_sum", label: "Closed", aggregate: "sum", field: "closed_amount", format: "0,0" }, - { name: "pipeline_sum", label: "Pipeline", aggregate: "sum", field: "pipeline_amount", format: "0,0" }, - { name: "commit_sum", label: "Commit", aggregate: "sum", field: "commit_amount", format: "0,0" }, - // Derived ratio (ADR-0021 Q1) rather than avg(attainment_pct): summing - // closed and quota before dividing weights every rep/period by quota - // size, where an average of per-row percentages would not. - { name: "attainment", label: "Attainment", derived: { op: "ratio", of: ["closed_sum", "quota_sum"] }, format: "0%" } - ] -}); - -// src/revenue/datasets/index.ts -var datasets_exports2 = {}; -__export(datasets_exports2, { - ProductDataset: () => ProductDataset -}); - -// src/revenue/datasets/product.dataset.ts -import { defineDataset as defineDataset9 } from "@objectstack/spec/ui"; -var ProductDataset = defineDataset9({ - name: "product_metrics", - label: "Product Metrics", - description: "Semantic layer for product catalog counts and list price", - object: "crm_product", - dimensions: [ - { name: "category", label: "Category", field: "category", type: "string" } - ], - measures: [ - { name: "product_count", label: "Products", aggregate: "count" }, - { name: "list_price_sum", label: "Total List Price", aggregate: "sum", field: "list_price", format: "0,0" } - ] -}); - -// src/sales/reports/index.ts -var reports_exports = {}; -__export(reports_exports, { - AccountsByIndustryTypeReport: () => AccountsByIndustryTypeReport, - CustomerChurnSignalsReport: () => CustomerChurnSignalsReport, - LeadInflowByMonthSourceReport: () => LeadInflowByMonthSourceReport, - OpportunitiesByStageReport: () => OpportunitiesByStageReport, - OpportunityFunnelByOwnerStageReport: () => OpportunityFunnelByOwnerStageReport, - PipelineCoverageByQuarterReport: () => PipelineCoverageByQuarterReport, - WonOpportunitiesByOwnerReport: () => WonOpportunitiesByOwnerReport -}); - -// src/sales/reports/account.report.ts -var AccountsByIndustryTypeReport = { - name: "accounts_by_industry_type", - label: "Accounts by Industry and Type", - description: "Matrix report showing accounts by industry and type", - dataset: "account_metrics", - rows: ["industry"], - columns: ["type"], - values: ["account_count", "annual_revenue_sum"], - type: "matrix", - runtimeFilter: { is_active: true } -}; - -// src/sales/reports/lead.report.ts -var LeadInflowByMonthSourceReport = { - name: "lead_inflow_by_month_source", - label: "Lead Engagement by Month \xD7 Source", - description: "Contacted-lead volume per month, broken down by acquisition channel", - dataset: "lead_metrics", - rows: ["lead_source"], - columns: ["last_contacted_date"], - values: ["lead_count"], - type: "matrix", - // A never-contacted lead has no engagement month, and grouping it produced a - // headerless '—' column next to the real ones. This report counts CONTACTED - // leads (see the label/description), so the empty bucket is excluded at the - // source rather than rendered as a mystery column. - runtimeFilter: { last_contacted_date: { $ne: null } } -}; - -// src/sales/reports/opportunity.report.ts -var OpportunitiesByStageReport = { - name: "opportunities_by_stage", - label: "Opportunities by Stage", - description: "Summary of opportunities grouped by stage", - dataset: "opportunity_metrics", - rows: ["stage"], - values: ["total_amount", "avg_probability"], - type: "summary", - // `{current_year_start}` is a spec date macro (DATE_MACRO_TOKENS) resolved - // per-query, so the YTD window rolls with time instead of freezing the year - // the artifact was built into dist/objectstack.json. - runtimeFilter: { stage: { $ne: "closed_lost" }, close_date: { $gte: "{current_year_start}" } }, - chart: { type: "bar", title: "Pipeline by Stage", showLegend: true, xAxis: "stage", yAxis: "total_amount" } -}; -var WonOpportunitiesByOwnerReport = { - name: "won_opportunities_by_owner", - label: "Won Opportunities by Owner", - description: "Closed won opportunities grouped by owner", - dataset: "opportunity_metrics", - rows: ["owner"], - values: ["total_amount"], - type: "summary", - runtimeFilter: { stage: "closed_won" }, - chart: { type: "column", title: "Revenue by Sales Rep", showLegend: false, xAxis: "owner", yAxis: "total_amount" } -}; -var PipelineCoverageByQuarterReport = { - name: "pipeline_coverage_by_quarter", - label: "Pipeline Coverage by Forecast \xD7 Quarter", - description: "Open pipeline amount by forecast category, bucketed by close quarter", - dataset: "opportunity_metrics", - rows: ["forecast_category"], - columns: ["close_quarter"], - values: ["total_amount", "opp_count"], - type: "matrix", - runtimeFilter: { stage: { $nin: ["closed_won", "closed_lost"] } } -}; -var OpportunityFunnelByOwnerStageReport = { - name: "opportunity_funnel_owner_stage", - label: "Opportunity Funnel by Owner \u2192 Stage", - description: "Per-rep stage-by-stage pipeline funnel", - dataset: "opportunity_metrics", - rows: ["owner", "stage"], - values: ["total_amount", "opp_count", "avg_probability"], - type: "summary", - runtimeFilter: { stage: { $ne: "closed_lost" } }, - chart: { type: "funnel", title: "Pipeline Funnel", showLegend: false, xAxis: "stage", yAxis: "total_amount" } -}; - -// src/sales/reports/churn.report.ts -var CustomerChurnSignalsReport = { - name: "customer_churn_signals", - label: "Customer Churn Signals", - description: "Three-panel early-warning view: at-risk customers, silent high-value accounts, and recently-lost opportunities.", - type: "joined", - blocks: [ - { - // Named for the ACTOR, not the value, because `at_risk` is also a - // `health_score` option and `at_risk_accounts` is already the block - // below (a time window, nothing to do with the field). The two are - // allowed to overlap: this one asks "who did a human flag", that one - // asks "whose clock stopped". - name: "csm_flagged_accounts", - label: "CSM-Flagged Accounts", - description: "Accounts a CSM has hand-flagged as at-risk or churning, grouped by type \u2014 human judgement, independent of the activity clock.", - type: "summary", - dataset: "account_metrics", - rows: ["type"], - values: ["account_count"], - // No date term on purpose (see the header). `is_active` matches the two - // account blocks below: a deactivated account has already churned, so it - // is not a retention queue item. Grouping by `type` separates a flagged - // CUSTOMER (revenue at risk today) from a flagged prospect or partner, - // which the grid view `crm_account.at_risk_accounts` cannot show — it is - // scoped to `type: 'customer'` before anything else. - runtimeFilter: { - is_active: true, - health_score: { $in: ["at_risk", "churning"] } - } - }, - { - name: "at_risk_accounts", - label: "At-Risk Accounts", - description: "Active accounts with no activity in 60+ days, grouped by industry.", - type: "summary", - dataset: "account_metrics", - rows: ["industry"], - values: ["account_count"], - runtimeFilter: { - is_active: true, - last_activity_date: { $lt: "{60_days_ago}" } - } - }, - { - name: "silent_high_value", - label: "Silent High-Value Accounts", - description: "Strategic and enterprise accounts gone quiet for 90+ days, grouped by type.", - type: "summary", - dataset: "account_metrics", - rows: ["type"], - values: ["account_count"], - // "High-value" is the account's tier, not a revenue threshold: the - // strategic/enterprise tiers are exactly the book the CSM team owns. - runtimeFilter: { - is_active: true, - tier: { $in: ["strategic", "enterprise"] }, - last_activity_date: { $lt: "{90_days_ago}" } - } - }, - { - name: "recently_closed_lost", - label: "Recently Lost Opportunities", - description: "Opportunities closed-lost in the last 30 days \u2014 investigate before the customer fully churns.", - type: "summary", - dataset: "opportunity_metrics", - rows: ["owner"], - values: ["total_amount", "opp_count"], - runtimeFilter: { - stage: "closed_lost", - close_date: { $gte: "{30_days_ago}" } - } - } - ] -}; - -// src/sales/mappings/index.ts -var mappings_exports = {}; -__export(mappings_exports, { - AccountImportMapping: () => AccountImportMapping, - ContactImportMapping: () => ContactImportMapping, - LeadImportMapping: () => LeadImportMapping -}); - -// src/sales/mappings/account_import.mapping.ts -import { defineMapping } from "@objectstack/spec/data"; - -// src/sales/mappings/_shared.ts -var INDUSTRY_SYNONYMS = { - "SaaS": "software", - "Saas": "software", - "IT": "technology", - "Tech": "technology", - "Information Technology": "technology", - "Financial Services": "finance", - "Banking": "finance", - "Insurance": "finance", - "Health Care": "healthcare", - "Pharmaceuticals": "healthcare", - "E-commerce": "retail", - "Ecommerce": "retail", - "Consumer Goods": "retail", - "Transportation": "logistics", - "Utilities": "energy", - "Oil & Gas": "energy", - "Public Sector": "government", - "Non Profit": "nonprofit", - "Non-Profit": "nonprofit", - "NGO": "nonprofit", - "Travel & Hospitality": "hospitality" -}; -var LEAD_SOURCE_SYNONYMS = { - "Website": "web", - "Web Site": "web", - "Inbound": "web", - "Word of mouth": "referral", - "Customer Referral": "referral", - "Trade Show": "event", - "Conference": "event", - "Seminar": "webinar", - "Partner Referral": "partner", - "Google Ads": "paid_search", - "AdWords": "paid_search", - "SEM": "paid_search", - "LinkedIn": "social", - "Facebook": "social", - "X": "social", - "Twitter": "social", - "Blog": "content", - "Whitepaper": "content", - "Phone Inquiry": "cold_call", - "Outbound": "cold_call", - "Email": "email_campaign", - "Newsletter": "email_campaign" -}; -var DEPARTMENT_SYNONYMS = { - "HR": "hr" -}; - -// src/sales/mappings/account_import.mapping.ts -var AccountImportMapping = defineMapping({ - name: "crm_account_import", - label: "Account Import (CSV)", - targetObject: "crm_account", - sourceFormat: "csv", - // also accepted for .xlsx uploads — both are tabular - mode: "upsert", - upsertKey: ["name"], - fieldMapping: [ - { source: "Account Name", target: "name" }, - { - source: "Account Type", - target: "type", - transform: "map", - params: { - valueMap: { - "Client": "customer", - "Reseller": "partner", - "Churned": "former", - "Lost Customer": "former" - } - } - }, - { - source: "Industry", - target: "industry", - transform: "map", - params: { valueMap: INDUSTRY_SYNONYMS } - }, - // The account hook rejects a website that is not http(s) — keep full URLs - // in the source sheet (see `src/sales/objects/account.hook.ts`). - { source: "Website", target: "website" }, - { source: "Phone", target: "phone" }, - { source: "Annual Revenue", target: "annual_revenue" }, - { source: "Employees", target: "number_of_employees" }, - { source: "Description", target: "description" }, - // Owner resolution. VERIFIED against the platform import path - // (`packages/rest/src/import-runner.ts` → `resolveRef`): a reference cell - // is resolved against the referenced object by `id`, the field's - // `displayField`, then `name` / `title` / `label` / `full_name` / `email` / - // `username`. `sys_user` has an `email` column, so an owner-email cell - // resolves to that user's id — no separate resolution step is needed here. - // An address that matches no user FAILS the row (`reference_not_found`); - // leaving the cell BLANK is the supported fallback — the security - // middleware's insert-time stamp then makes the importing user the owner - // (the import write carries the importer's context, not `isSystem`). - // - // The target is `owner_id`, the platform ownership anchor — #548 retired - // the app-authored `owner` lookup this used to name. A resolved cell is - // therefore an ownership TRANSFER: it plants the row under someone other - // than the importer, which the #3004 guard denies unless the importing user - // holds `allowTransfer` (system_admin / sales_manager do). That is the - // intended posture — a bulk file that silently reassigns the book is - // exactly what the grant exists to gate. - { source: "Account Owner Email", target: "owner_id", transform: "lookup" }, - // Self-reference: a parent named later in the same file still resolves — - // the runner flushes buffered creates and retries once (framework#3148). - { source: "Parent Account", target: "parent_account", transform: "lookup" } - // NOT MAPPED — `billing_address` / `office_location` are structured - // (json-backed `address` / `location`) fields. A joined string is not a - // way in: the engine rejects it per row — measured, `Billing Address has an - // invalid address value: Invalid input: expected object, received string`. - // (The dry run does NOT predict that rejection; it reports the row ok. - // Framework-side, filed as objectstack-ai/objectstack#4633.) - // Address columns are therefore left out of the account template. A target - // may now name a declared PART of a compound field — `contact_import.mapping.ts` - // maps five columns into `mailing_address.street` … `.country` (#1836) — so - // adding address columns here would be a template change, not a platform gap. - ] -}); - -// src/sales/mappings/contact_import.mapping.ts -import { defineMapping as defineMapping2 } from "@objectstack/spec/data"; -var ContactImportMapping = defineMapping2({ - name: "crm_contact_import", - label: "Contact Import (CSV)", - targetObject: "crm_contact", - sourceFormat: "csv", - mode: "upsert", - upsertKey: ["email"], - fieldMapping: [ - { source: "Salutation", target: "salutation" }, - { source: "First Name", target: "first_name" }, - { source: "Last Name", target: "last_name" }, - // Required master-detail parent; resolved by account name. - { source: "Account Name", target: "crm_account", transform: "lookup" }, - { source: "Title", target: "title" }, - { - source: "Department", - target: "department", - transform: "map", - params: { valueMap: DEPARTMENT_SYNONYMS } - }, - { source: "Email", target: "email" }, - { source: "Phone", target: "phone" }, - { source: "Mobile", target: "mobile" }, - // Five template columns, one structured field: each column names a part - // of `mailing_address`, and the import assembles the parts one row maps - // into that field's single value. - { source: "Mailing Street", target: "mailing_address.street" }, - { source: "Mailing City", target: "mailing_address.city" }, - { source: "Mailing State", target: "mailing_address.state" }, - { source: "Mailing Postal Code", target: "mailing_address.postalCode" }, - { source: "Mailing Country", target: "mailing_address.country" }, - { - source: "Lead Source", - target: "lead_source", - transform: "map", - params: { valueMap: LEAD_SOURCE_SYNONYMS } - }, - { source: "Description", target: "description" }, - // Owner-email resolution, the blank-cell fallback, and why a filled cell - // needs `allowTransfer`: see the long note in `account_import.mapping.ts`. - { source: "Contact Owner Email", target: "owner_id", transform: "lookup" } - ] -}); - -// src/sales/mappings/lead_import.mapping.ts -import { defineMapping as defineMapping3 } from "@objectstack/spec/data"; -var LeadImportMapping = defineMapping3({ - name: "crm_lead_import", - label: "Lead Import (CSV)", - targetObject: "crm_lead", - sourceFormat: "csv", - mode: "upsert", - upsertKey: ["email"], - fieldMapping: [ - { source: "Salutation", target: "salutation" }, - { source: "First Name", target: "first_name" }, - { source: "Last Name", target: "last_name" }, - { source: "Company", target: "company" }, - { source: "Title", target: "title" }, - { - source: "Industry", - target: "industry", - transform: "map", - params: { valueMap: INDUSTRY_SYNONYMS } - }, - { source: "Email", target: "email" }, - { source: "Phone", target: "phone" }, - { source: "Mobile", target: "mobile" }, - { source: "Website", target: "website" }, - { - source: "Lead Status", - target: "status", - transform: "map", - params: { - valueMap: { - "Open": "new", - "Working": "contacted", - "In Progress": "contacted", - "Nurturing": "contacted", - "Disqualified": "unqualified", - "Closed - Not Converted": "unqualified" - } - } - }, - { - source: "Lead Source", - target: "lead_source", - transform: "map", - params: { valueMap: LEAD_SOURCE_SYNONYMS } - }, - { source: "Annual Revenue", target: "annual_revenue" }, - { source: "Employees", target: "number_of_employees" }, - { source: "Description", target: "description" }, - // Owner-email resolution and the `allowTransfer` gate on a filled cell: - // see the long note in `account_import.mapping.ts`. The blank-cell - // behaviour differs — see the header comment above. - { source: "Lead Owner Email", target: "owner_id", transform: "lookup" } - // NOT MAPPED — `crm_lead.address` is a structured (json-backed) `address` - // field; the import path cannot compose one from separate street/city/ - // postcode columns, and a joined string is rejected per row. Same - // reasoning, and the same measurement, as the account mapping. - ] -}); - -// src/sales/apps/index.ts -var apps_exports = {}; -__export(apps_exports, { - CrmApp: () => CrmApp -}); - -// src/sales/apps/crm.app.ts -import { App } from "@objectstack/spec/ui"; -var HOTCRM_ICON = 'data:image/svg+xml,%0A %0A %0A%0A'; -var CrmApp = App.create({ - name: "crm_enterprise", - label: "HotCRM", - icon: "briefcase", - // ADR-0063 §1/§2 — `defaultAgent` is a surface binding, not a custom-agent - // slot: the only resolvable values are the two PLATFORM agents, `ask` (data - // surface) and `build` (authoring surface). HotCRM is a data surface, so it - // binds `ask`; the app's own AI capability ships as skills (`src/*/skills/`), - // which attach to the platform agents by `surface` affinity. The app-authored - // agents this key used to name were retired in #512. - defaultAgent: "ask", - // `logo` and `favicon` are the inlined `HOTCRM_ICON` above (#2051), never a - // server path: an install serves only what the artifact carries. The console - // passes each value through untouched — `logo` as the sidebar's ``, - // `favicon` as the favicon `link.href` — and a `data:` URI renders in both. - // `primaryColor` is the icon's tile fill (#2066): the mark and the theme are one orange. - branding: { - primaryColor: "#EA580C", - logo: HOTCRM_ICON, - favicon: HOTCRM_ICON - }, - navigation: [ - // Pinned landing — single executive view, single click from launcher. - { - id: "nav_home", - type: "dashboard", - dashboardName: "executive_dashboard", - label: "Home", - icon: "home" - }, - { - id: "group_sales", - type: "group", - label: "Sales", - icon: "chart-line", - expanded: true, - children: [ - { id: "nav_lead", type: "object", objectName: "crm_lead", label: "Leads", icon: "user-plus" }, - { id: "nav_account", type: "object", objectName: "crm_account", label: "Accounts", icon: "building" }, - // ADR-0047 interface page — the curated counterpart to the Accounts - // object entry (quick filters only; activates with spec > 9.2.0). - { id: "nav_account_workbench", type: "page", pageName: "account_workbench", label: "Account Workbench", icon: "sliders-horizontal" }, - { id: "nav_contact", type: "object", objectName: "crm_contact", label: "Contacts", icon: "user" }, - // No separate "Pipeline" entry: the kanban board is another tab on - // this same list page — `pipeline_kanban` in - // `OpportunityViews.listViews`, which the switcher puts on the strip - // under its own label, *Sales Pipeline* — one click from here and - // zero clicks further than a second sidebar row. The - // view-entry exemplar duty this item used to carry now sits with the - // "My Work" items below, which are all object + `viewName`. - { id: "nav_opportunity", type: "object", objectName: "crm_opportunity", label: "Opportunities", icon: "target" }, - { id: "nav_quote", type: "object", objectName: "crm_quote", label: "Quotes", icon: "receipt" }, - // Contracts close the sales cycle: quote → signed agreement → renewal. - // The object, its views and its renewal automation all shipped, but - // there was no way to reach any of it from the app. - { id: "nav_contract", type: "object", objectName: "crm_contract", label: "Contracts", icon: "file-signature" }, - // Products sit here, not under Marketing (#1259): they are the - // revenue master data every quote line and opportunity line item - // points at — a sales object that happened to be filed next to - // campaigns. - { id: "nav_product", type: "object", objectName: "crm_product", label: "Products", icon: "package" }, - { id: "nav_sales_dashboard", type: "dashboard", dashboardName: "sales_dashboard", label: "Sales Performance", icon: "chart-line" } - ] - }, - { - // Everything a rep owes someone. `crm_task` had views, seed data, a - // recurrence hook and two reminder flows, and no entry point — the only - // way to see a task was to open the record it hung off. - id: "group_work", - type: "group", - label: "My Work", - icon: "list-checks", - expanded: true, - // These are ListViews: they list the records themselves, which a - // dashboard widget (an aggregate over a dataset, ADR-0021) cannot. Both - // surfaces resolve `{current_user_id}` since objectstack#12230 — the - // Service dashboard's "My Open Cases by Priority" is the aggregate - // counterpart of "My Cases" (#510). - // - // Every item here is object + `viewName`, which makes this group the - // app's view-entry exemplar since #1259 retired the "Pipeline" row. - // The one exception is the approvals Inbox at the bottom — a - // `component` entry, and the app's only one. - children: [ - { id: "nav_my_tasks", type: "object", objectName: "crm_task", viewName: "my_open_tasks", label: "My Tasks", icon: "circle-check" }, - { id: "nav_my_deals", type: "object", objectName: "crm_opportunity", viewName: "my_open_deals", label: "My Deals", icon: "target" }, - { id: "nav_my_leads", type: "object", objectName: "crm_lead", viewName: "my_leads", label: "My Leads", icon: "user-plus" }, - // #592 — the rep's own calendar: a list of events, so a view, not a - // dashboard. - { id: "nav_my_calendar", type: "object", objectName: "crm_event", viewName: "my_events", label: "My Calendar", icon: "calendar-days" }, - // No "All Tasks" entry: "My Tasks" opens the `crm_task` list page, - // whose tab strip leads with *All Tasks* — `TaskViews.list`, name - // `all_tasks`. It leads because it is the object's PRIMARY list: the - // switcher moves the primary to the front of the strip and marks it - // default, so nothing has to be authored to say so. The whole book is - // one tab away, and the sidebar keeps one row per object instead of - // two. - // - // ── The approvals Inbox lives here, not in a group of its own (#1259) - // - // It used to be the single child of an "Approvals" group. Its content - // is a personal queue — the things waiting on *you* — which is what - // this group is; a one-item group next to it was structure without a - // distinction. Dissolving that group is why this entry moved, not any - // rule against single-item groups (Marketing is one and stays one). - // - // "Inbox" (zh-CN 待我审批) must land somewhere an approver can actually - // approve. It used to be `type: 'object'` on `sys_approval_request` — - // the approvals plugin's raw request table, which is read-only: no row - // actions, no approve/reject, only Share on the record detail. The label - // promised an action the destination could not perform (#1123). - // - // `component` — not `url`. The platform's approval centre is a - // first-party console surface registered in the ComponentRegistry as - // `approvals:inbox` (registered by @objectstack/console itself, source - // `@object-ui/console`, rendering ApprovalsInboxPage) — exactly what the - // spec documents `component` for: "a first-party UI shipped with the - // platform — typically admin/setup surfaces that have no row in any data - // store". `url` is documented as the *external link* type, and taking it - // would mean hard-coding a console-internal route plus this app's own - // name (`/apps/crm_enterprise/system/approvals`) into metadata. A - // `componentRef` instead resolves against the *current* app base, so the - // entry keeps the user inside HotCRM's shell without naming the app, and - // a ref that ever stops resolving renders a loud "Component not - // registered" panel rather than silently bouncing to the console home. - // - // The read-only object list is not kept as a second "history" entry: the - // approval centre already subsumes it — My Pending / Submitted by me / - // All tabs plus a status filter (Pending / Approved / Rejected / - // Recalled / Returned for revision) — so a second entry would add a - // strictly weaker view of the same rows. - // - // `requiresObject` is retained: it is a base nav-item field on every - // item type, so the entry still hides itself on installs where - // @objectstack/plugin-approvals is absent and no approval exists to act - // on. - // - // There is no "Processes" item either: @objectstack/plugin-approvals - // registers sys_approval_request / sys_approval_action / - // sys_approval_approver / sys_approval_delegation — but neither a bare - // `sys_approval` nor a `sys_approval_process` object exists in any - // installed plugin (measured on the 17.2.0 rosters), - // so the old item's requiresObject guard hid it on every install, - // forever. - { id: "nav_approval_requests", type: "component", componentRef: "approvals:inbox", label: "Inbox", icon: "inbox", requiresObject: "sys_approval_request" } - ] - }, - { - // #592 — activity was the app's largest blind spot: `crm_event` and its - // attendee rows had nowhere to be seen, and no dashboard anywhere counted - // an interaction. Kept as its own group rather than buried under Sales, - // because "what happened with this customer, and when?" is the question - // the whole batch was about. - id: "group_activity", - type: "group", - label: "Activity", - icon: "calendar-days", - expanded: true, - children: [ - // One row for the object, one for the dashboard. The calendar and the - // interaction history are two more tabs on this same list page — - // `event_calendar` and `held_events` in `EventViews.listViews`, which - // the switcher puts on the strip under each view's own label — #1259 - // removed the sidebar duplicates, not the surfaces. `crm_event` had - // four sidebar rows; - // it was the single largest source of the nav's growth. - { id: "nav_event", type: "object", objectName: "crm_event", label: "Events", icon: "calendar-days" }, - { id: "nav_activity_dashboard", type: "dashboard", dashboardName: "sales_activity_dashboard", label: "Sales Activity", icon: "activity" } - ] - }, - { - // Campaigns drive lead_source and the campaign-member records that - // "Add to Campaign" writes — with no nav entry the marketing half of - // the data model was invisible. - // - // A single-item group on purpose (#1259). Marketing is a domain of its - // own, and a reader scanning the sidebar for "where does campaign work - // live" finds it by name. Item-count symmetry is not the goal; the - // Approvals group was dissolved because its item *was* personal work, - // not because one child is too few. - id: "group_marketing", - type: "group", - label: "Marketing", - icon: "megaphone", - children: [ - { id: "nav_campaign", type: "object", objectName: "crm_campaign", label: "Campaigns", icon: "megaphone" } - ] - }, - { - id: "group_service", - type: "group", - label: "Service", - icon: "headset", - expanded: true, - // EMPTY ON PURPOSE — this group is a CONTAINER, not a menu. - // - // `crm_case`, `crm_knowledge_article`, `service_dashboard` and - // `sla_performance` belong to `app.objectstack.hotcrm.service`, and an - // app's own `navigation` may not name another package's object (ADR-0130 - // §1.5): the entry fails at author time with "references object - // `crm_case` which is not defined in objects". The module puts all three - // back through `navigationContributions` (ADR-0029 D7), and it can only - // aim at a group the app DECLARES — a module cannot create one inside an - // app it does not own. So the app publishes the anchor and the module - // fills it; `src/service/index.ts` holds the other half, and the two - // service items of *My Work* and *Insights* come back the same way. - // - // ⛔ Do not "tidy" the group away: deleting it relocates all three - // contributed items to the app's top level with a - // `nav_contribution_group_missing` warning. - children: [] - }, - { - id: "group_insights", - type: "group", - label: "Insights", - icon: "sparkles", - children: [ - // Trimmed to three high-signal reports. Full report catalogue still - // ships as metadata; admins can pin more from the report picker. - { id: "nav_crm_dashboard", type: "dashboard", dashboardName: "crm_overview_dashboard", label: "CRM Overview", icon: "layout-dashboard" }, - { id: "nav_forecast", type: "object", objectName: "crm_forecast", label: "Forecasts", icon: "trending-up" }, - { id: "nav_report_pipeline_coverage", type: "report", reportName: "pipeline_coverage_by_quarter", label: "Pipeline Coverage", icon: "columns-3" }, - { id: "nav_report_lead_inflow", type: "report", reportName: "lead_inflow_by_month_source", label: "Lead Inflow", icon: "trending-up" } - ] - } - ] -}); - -// src/sales/profiles/index.ts -var profiles_exports = {}; -__export(profiles_exports, { - GuestPortalProfile: () => GuestPortalProfile, - MarketingUserProfile: () => MarketingUserProfile, - SalesManagerProfile: () => SalesManagerProfile, - SalesRepProfile: () => SalesRepProfile, - ServiceAgentProfile: () => ServiceAgentProfile, - ServiceManagerProfile: () => ServiceManagerProfile, - SystemAdminProfile: () => SystemAdminProfile -}); - -// src/sales/profiles/guest-portal.profile.ts -var GuestPortalProfile = { - name: "guest_portal", - label: "Guest (Public Forms)", - description: "Anonymous visitors submitting public Web-to-Lead / Web-to-Case forms. INSERT-only on lead and case; no read/edit/delete on any object.", - // No `allowExport` anywhere below, deliberately: this set is bound to the - // `guest` anchor, and ADR-0090 D9 classes `allowExport` as a high-privilege - // bit no anchor may confer — the set would stop binding at all, on top of - // handing anonymous visitors bulk table egress. See `src/sales/profiles/index.ts`. - objects: { - crm_lead: { - allowCreate: true, - allowRead: false, - allowEdit: false, - allowDelete: false, - viewAllRecords: false, - modifyAllRecords: false - }, - crm_case: { - allowCreate: true, - allowRead: false, - allowEdit: false, - allowDelete: false, - viewAllRecords: false, - modifyAllRecords: false - } - } -}; - -// src/sales/profiles/marketing-user.profile.ts -var MarketingUserProfile = { - name: "marketing_user", - label: "Marketing User", - objects: { - // `allowExport` where an export surface exists — canonical note in - // `src/sales/profiles/index.ts`. Lead and contact list exports are marketing's - // core targeting workflow; account/opportunity back the campaign-ROI - // reports. No `crm_case` grant here, so no export bit for it either. - crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, - crm_account: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, - crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, - crm_campaign: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - // Org-wide read: marketing attributes campaign → pipeline ROI, which needs - // every opportunity, not just self-owned. viewAllRecords was false here - // while every other object on this set is true — an oversight that hid all - // pipeline from marketing (and tripped security-private-no-readscope). - crm_opportunity: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, - // Campaign membership is THIS profile's core write surface: the - // "Add to Campaign" action (`src/sales/actions/lead.actions.ts`) inserts - // `crm_campaign_member` rows, and before #488 no permission set granted the - // object — the action failed for the only persona meant to run it. Rows - // derive from the campaign (controlled_by_parent), so there is no record - // scope to author — and as of 17.0.0-rc.4 that derivation does follow the - // campaign grant: MEASURED and pinned by - // `test/parent-derived-reach.test.ts`, master accessibility resolves through - // the same paths a direct read of the campaign takes, ownership and - // `sys_record_share` grants included. For THIS profile the delta is small — - // `crm_campaign` is `public_read` and this set holds org-wide campaign read, - // so the rows are the same either way — but the grant is now scope that - // follows the campaigns above, not org-wide read in fact as it was through - // 17.0.0-rc.3 (objectstack-ai/objectstack#5386, #694). - // Deleting membership history stays a manager/admin privilege, matching - // every other object here. - crm_campaign_member: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - // Read-only reference: knowledge articles for campaign copy - // (public_read catalog). - // Reads the KB and may rate it; cannot author articles (#601). - crm_article_feedback: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - crm_knowledge_article: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - // The record Attachments panel, READ only: canonical note on `enable.files` - // in `src/sales/objects/index.ts` (#2029). Which attachments it lists - // derives from the parent record; upload and delete wait upstream. - sys_attachment: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - // The record Discussion panel, comments and activity: canonical note on - // `enable.feeds` in `src/sales/objects/index.ts` (#2029). Which threads it - // reaches derives from the parent record; deleting a comment waits upstream. - sys_comment: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - sys_activity: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false } - }, - fields: { - // Marketing reads pipeline for campaign ROI but never prices a deal, and - // account health is the renewal team's call — read, never write (#488). - "crm_opportunity.amount": { readable: true, editable: false }, - "crm_account.health_score": { readable: true, editable: false } - }, - // The same private-deal row filter the sales_manager set carries: this - // profile also holds org-wide opportunity read, so it is one of the readers - // `crm_opportunity.is_private` has to hold back. See sales-manager.profile.ts - // for the full rationale. - rowLevelSecurity: [ - { - name: "opportunity_private_owner_only_marketing", - // A deal flagged Private is visible only to its owner, even to holders of - // org-wide opportunity read. (`rowLevelSecurity[].label` / `description` - // are display copy — the 17.7.0 liveness ledger marks both live: the - // permission editor draws them on the policy card. This policy authors - // neither, so its intent lives in this comment.) - object: "crm_opportunity", - operation: "select", - using: "is_private == false || owner_id == current_user.id" - }, - // The platform's `member_default` set carries a wildcard owner-only-writes - // policy (`created_by == current_user.id` on update), and RLS policies are - // OR-combined — so without a policy of its own, this set's allowEdit on - // campaigns only reaches campaigns the user personally created. That also - // silently broke "Add to Campaign": enrolling a member is a write DERIVED - // from the campaign (controlled_by_parent), so it requires campaign edit at - // the row level. This is the one direction in which the ADR-0055 derivation - // really does narrow: a master RLS policy is exactly what it folds in, while - // ownership and `sys_record_share` grants are not (which is why the READ - // side of these member rows is org-wide — see the `crm_campaign_member` - // grant above and objectstack-ai/objectstack#5386, #694). This policy widens - // campaign updates to every holder of the set — exactly what the object - // grant above already declares. `id != null` - // is the pushdown-safe "all rows" predicate (verified: compiles to - // `{id: {$null: false}}`). - { - name: "marketing_campaign_updates", - // Marketing users edit any campaign (and thereby enrol members into it), - // not only campaigns they created. - object: "crm_campaign", - operation: "update", - using: "id != null" - }, - // Same widening for the member rows themselves: response tracking means - // updating rows the enrollment flow (system context) created, which the - // default owner-only-writes policy would otherwise deny. - { - name: "marketing_campaign_member_updates", - // Marketing users update member response state on rows they did not - // personally create. - object: "crm_campaign_member", - operation: "update", - using: "id != null" - } - ] -}; - -// src/sales/profiles/sales-manager.profile.ts -var SalesManagerProfile = { - name: "sales_manager", - label: "Sales Manager", - objects: { - // `allowTransfer` on exactly the objects this set holds `modifyAllRecords` - // on — the sales book a manager reassigns. Canonical note in - // `src/sales/profiles/index.ts`. - // `allowExport` where an export surface exists — canonical note in - // `src/sales/profiles/index.ts`. A manager owns the number, so the pipeline and - // book exports that feed offline forecasting are part of the job. - crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, - crm_account: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, - crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, - crm_opportunity: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, - crm_quote: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - // No writeScope: `crm_contract` is `controlled_by_parent` under - // `crm_account` (#549), so a scope here would be inert — the write gate - // asks for EDIT on the account instead, which this set holds org-wide - // (`modifyAllRecords` above). That retires the #880 gap on BOTH editions: - // the contract an accepted quote drafts hangs under the rep, and the - // manager edits it because they can edit its account, not because of a - // hierarchy depth. `own_and_reports` was the app's only authored hierarchy - // scope; `requires: ['hierarchy-security']` stays declared (#1378 ruling). - // `allowDelete: false` must keep holding; `modifyAllRecords: false` keeps - // this off the super-user bypass. `test/contract-write-depth.test.ts`. - crm_contract: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - crm_product: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - crm_campaign: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - crm_case: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, - crm_task: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - // A manager coaches on activity, so this is org-wide read AND write on a - // private object — the same shape their `crm_task` grant already has. - // `crm_event_attendee` is `controlled_by_parent` (ADR-0055): no scope to - // author — one would be inert metadata. It narrows to the events this set - // can read, which is every event: `viewAllRecords` on `crm_event` above puts - // the whole activity stack in reach, so the derived attendee rows follow. - // MEASURED on 17.0.0-rc.4 and pinned by `test/parent-derived-reach.test.ts`, - // master accessibility resolves through the same paths a direct read of the - // event takes — ownership and `sys_record_share` grants folded in, not the - // master's row-level security policies alone. Until 17.0.0-rc.3 this grant - // was org-wide in FACT rather than by derivation, whatever the event grants - // said (#694); objectstack-ai/objectstack#5386 fixed that upstream and it - // shipped in rc.4. Same note in `sales-rep.profile.ts`. - crm_event: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - crm_event_attendee: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false }, - // The forecast IS the manager's job: they read every rep's snapshot and - // adjust the committed number, so this is org-wide read AND write on a - // private object (#488 — the object had no grant at all). - crm_forecast: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - // Knowledge is service-authored; sales reads it (public_read OWD). - // Reads the KB and may rate it; cannot author articles (#601). - crm_article_feedback: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - crm_knowledge_article: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - // Enrollment is marketing's job; a manager only reads the membership rows - // behind campaign ROI. `crm_campaign_member` is `controlled_by_parent`, so - // no readScope/viewAllRecords applies (ADR-0055) — but the rows do not - // "follow the campaign": the derivation resolves the master set through the - // master's RLS policies only (none narrow a select on `crm_campaign`), so - // this is org-wide read on every member row. The practical delta is small - // here — `crm_campaign` is `public_read` and this set reads every campaign - // anyway — so the intended derivation would return the same rows. See - // `campaign_member.object.ts` and objectstack-ai/objectstack#5386 (#694). - crm_campaign_member: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - // Line items: full CRUD so a manager can fix pricing on any rep's deal or - // quote. Both objects are `controlled_by_parent`, so there is no scope to - // author — but that derivation does not narrow these rows to the deals and - // quotes the manager can read. MEASURED (see the note in - // `sales-rep.profile.ts` and `test/parent-derived-reach.test.ts`): the master - // set comes from the master's RLS policies only, never from ownership or a - // share. This set authors one such policy — the private-deal filter on - // `crm_opportunity` below — and none on `crm_quote`, so quote lines are - // org-wide, and opportunity lines are bounded by that policy and nothing - // else (the guard test pins the quote chain; the opportunity side follows - // from the same measured mechanism). Upstream gap: - // objectstack-ai/objectstack#5386 (#694). - crm_opportunity_line_item: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false }, - crm_quote_line_item: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false }, - // The record Attachments panel, READ only: canonical note on `enable.files` - // in `src/sales/objects/index.ts` (#2029). Which attachments it lists - // derives from the parent record; upload and delete wait upstream. - sys_attachment: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - // The record Discussion panel, comments and activity: canonical note on - // `enable.feeds` in `src/sales/objects/index.ts` (#2029). Which threads it - // reaches derives from the parent record; deleting a comment waits upstream. - sys_comment: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - sys_activity: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false } - }, - fields: { - // Sensitive fields a manager must see in full. Authored explicitly rather - // than left absent: these are the fields other sets mask, and an unauthored - // grant reads as an oversight instead of a decision (#488). - "crm_opportunity.amount": { readable: true, editable: true }, - "crm_account.health_score": { readable: true, editable: true }, - "crm_quote.internal_notes": { readable: true, editable: true }, - // Case internal notes are the service team's working memory: a sales - // manager reads them for account context but never edits them. - "crm_case.internal_notes": { readable: true, editable: false } - }, - // ADR-0058: `crm_opportunity.is_private` is settable in the opportunity form - // (`opportunity.view.ts`) and, before this rule, was read by nothing — a - // checkbox that promised confidentiality and delivered none. Org-wide readers - // are exactly who it has to hold back, so the set that grants - // `viewAllRecords` on opportunities also carries the row filter that honours - // it. Compiles to `{ $or: [{ is_private: false }, { owner_id: }] }`. - // - // `owner_id`, not the app-authored `owner` lookup this used to name: #548 - // retired that field. The predicate now keys on the SAME column the OWD / - // sharing owner-match reads, so "its owner" means one thing app-wide. - rowLevelSecurity: [ - { - name: "opportunity_private_owner_only", - // A deal flagged Private is visible only to its owner, even to holders of - // org-wide opportunity read. (`rowLevelSecurity[].label` / `description` - // are display copy — the 17.7.0 liveness ledger marks both live: the - // permission editor draws them on the policy card. This policy authors - // neither, so its intent lives in this comment.) - object: "crm_opportunity", - operation: "select", - using: "is_private == false || owner_id == current_user.id" - } - ] -}; - -// src/sales/profiles/sales-rep.profile.ts -var SalesRepProfile = { - name: "sales_rep", - label: "Sales Representative", - // A rep's book of business is private by design (own records + whatever a - // sharing rule or team grant extends). The objects below carry an explicit - // `readScope: 'own'` so the intent is authored, not inferred — this both - // silences the `security-private-no-readscope` liveness warning and pins the - // behavior: without it, a private-OWD object with allowRead but no scope is - // an under-specified grant the engine reads as "own only" anyway. - // - // What widens that scope today is narrower than it sounds: the territory / - // account-team rules are authored on `crm_account` ONLY, and a sharing rule - // widens the object it names — not the records hanging off it. So a rep who - // receives an account through a territory rule reads that account, while the - // tasks on it stay own-only and opportunities widen only through the - // >= $100k leadership rules. Quotes and contracts are the exception since - // #549 (ruling 2026-08-31): both are `controlled_by_parent` under the - // account, so they arrive with it — the same derivation as contacts. - // - // The `controlled_by_parent` grants below read as narrow, and as of - // 17.0.0-rc.4 they ARE. MEASURED and pinned by - // `test/parent-derived-reach.test.ts`: the ADR-0055 derivation resolves master - // accessibility through the same paths a direct read of the master takes — - // owner scope AND `sys_record_share` grants, not the master's row-level - // security policies alone. A rep holding ONE account through a territory rule - // reads that account's contacts and no others, and reads line items only under - // the quotes they can reach. Writes derive the same way: a child of a master - // the rep cannot edit is refused. So each grant below is bounded by the - // parent's sharing, which is what it looks like. - // - // Until 17.0.0-rc.3 the same grants were org-wide reads and this note said so - // (#694): the derivation consulted master RLS policies only, and HotCRM - // authors none, so the master set was every record. - // objectstack-ai/objectstack#5386 fixed that upstream and it shipped in rc.4. - objects: { - // `allowExport` where an export surface exists — canonical note in - // `src/sales/profiles/index.ts`. Safe alongside `readScope: 'own'`: export is - // read-derived, so a rep's CSV carries their own book, not the org's. - crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: "own", allowExport: true }, - crm_account: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: "own", allowExport: true }, - // NO readScope: `crm_contact` is `controlled_by_parent` (master-detail to - // crm_account), so a `readScope` here is inert — the sharing service only - // applies owner scope to `private` objects — and it read as a promise the - // engine never kept: it said "own contacts only" while access derived from - // the parent (#488). That derivation now delivers exactly "the accounts the - // rep can read": measured on 17.0.0-rc.4, a rep holding one territory - // account reads THAT account's contacts and no others (see the note at the - // top of this file, #694). - crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, allowExport: true }, - crm_opportunity: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: "own", allowExport: true }, - // NO readScope on quote/contract either: both are `controlled_by_parent` - // under `crm_account` (#549), so a scope here would be inert. A rep reads - // the quotes and contracts of every account they can reach, edits the - // quotes of accounts they can edit, and never edits a contract (object - // gate). `test/parent-derived-reach.test.ts` measures both levels. - crm_quote: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - crm_contract: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - crm_product: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - crm_campaign: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - crm_case: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: "own", allowExport: true }, - crm_task: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false, readScope: "own" }, - // ─── Activity (#592) ────────────────────────────────────────────── - // `crm_event` is `private` like `crm_task` — a personal activity record — - // so an explicit record scope is required alongside allowRead (an omitted - // scope silently means "own only" and reads as an unmade decision). - // `crm_event_attendee` is `controlled_by_parent`, so authoring a readScope - // here would be inert metadata the engine never applies. Its rows narrow to - // the events the rep can read — which, `crm_event` being private and - // own-scoped, is their own calendar (see the note at the top of this file, - // #694). - crm_event: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false, readScope: "own" }, - crm_event_attendee: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false }, - // Reference catalog (public_read OWD): reps read knowledge articles, which - // are authored by service. - // Reads the KB and may rate it; cannot author articles (#601). - crm_article_feedback: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - crm_knowledge_article: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - // Forecast snapshots are written by the nightly `forecast.hook` job and the - // `revenue_forecasting` skill, never by hand — read-only, and only the rep's - // own snapshots (private OWD + explicit own scope, as above). - crm_forecast: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: "own" }, - // Product lines on deals and quotes. Both objects are - // `controlled_by_parent`, so there is no readScope to author — one would be - // inert metadata. That derivation scopes a rep to the lines under the deals - // and quotes they can reach: measured on 17.0.0-rc.4, a rep reads the lines - // of the one quote they own and none of the others (see the note at the top - // of this file, #694). Without these grants the opportunity "Products" - // related list and the whole CPQ path were denied for every non-admin user - // (#488). - crm_opportunity_line_item: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false }, - crm_quote_line_item: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false }, - // Which campaign sourced a lead — read-only context, derived from the - // campaign (controlled_by_parent). Enrollment belongs to marketing_user. - crm_campaign_member: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - // The record Attachments panel, READ only: canonical note on `enable.files` - // in `src/sales/objects/index.ts` (#2029). Which attachments it lists - // derives from the parent record; upload and delete wait upstream. - sys_attachment: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - // The record Discussion panel, comments and activity: canonical note on - // `enable.feeds` in `src/sales/objects/index.ts` (#2029). Which threads it - // reaches derives from the parent record; deleting a comment waits upstream. - sys_comment: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - sys_activity: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false } - }, - fields: { - "crm_account.annual_revenue": { readable: true, editable: false }, - "crm_account.description": { readable: true, editable: true }, - "crm_opportunity.amount": { readable: true, editable: true }, - "crm_opportunity.probability": { readable: true, editable: true }, - // Health score drives the renewal book and the at-risk views: reps see it, - // the renewal/CS process sets it. Readable (the `at_risk_accounts` view - // filters and sorts on it, and a masked field cannot be filtered) but never - // rep-editable — it was previously unauthored on every set (#488). - "crm_account.health_score": { readable: true, editable: false }, - // Quote internal notes stay rep-editable: `quote.hook` deliberately keeps - // them writable after a quote is sent, when nothing else is. - "crm_quote.internal_notes": { readable: true, editable: true }, - // Case internal notes are the service team's private working notes. A rep - // reads the case (own scope) for account context; the agent-only commentary - // inside it is masked — no view filters or sorts on this field, so masking - // costs nothing but the value itself. - "crm_case.internal_notes": { readable: false, editable: false } - } -}; - -// src/sales/profiles/service-agent.profile.ts -var ServiceAgentProfile = { - name: "service_agent", - label: "Service Agent", - objects: { - // Reference context an agent needs to work ANY ticket — a customer's cases - // are meaningless without seeing the account/contact behind them, so these - // are org-visible reads (viewAllRecords: true), NOT own-only. This was the - // security-private-no-readscope warning's real signal: allowRead on a - // private object with no scope had silently locked agents out of every - // account they didn't personally own. - // `allowExport` where an export surface exists — canonical note in - // `src/sales/profiles/index.ts`. `crm_opportunity` carries no export bit: this - // set has no read on it at all, and the axis never widens read. - crm_lead: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, - crm_account: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, - crm_contact: { allowCreate: false, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, - crm_opportunity: { allowCreate: false, allowRead: false, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - // Cases + tasks: an agent's own queue by default (readScope: 'own'). - // Cross-agent visibility exists for CASES only — the escalation rules widen - // open critical cases to service_manager / service_director. `crm_task` has - // no sharing rule at all, so an agent reading an account org-wide still - // sees only their own tasks on it (#549). - crm_case: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: "own", allowExport: true }, - // `allowTransfer` on `crm_task` ONLY — canonical note in - // `src/sales/profiles/index.ts`. Narrow and load-bearing: escalating a case fires - // `case_status_side_effects`, which opens the follow-up task OWNED BY the - // account owner (`case.hook.ts`). That insert runs on `ctx.api` with the - // agent's own context, so planting it under another user is a transfer and - // is denied without this bit — the case update would fail with it. This is - // "assign work to a colleague", not "reassign the ticket": the agent holds - // no transfer grant on `crm_case` or any customer record. - // - // ⚠️ Escalation DOES now move a case to the `service_manager` pool (#1070), - // and it does so with no `crm_case` grant here — deliberately. That - // hand-off runs on the `beforeUpdate` seam, which the #3004 guard cannot - // see (measured, three readings, in `_case-assignment.ts`'s header and - // pinned in `test/case-assignment.test.ts`), so the case moves as part of - // the escalation write the automation is already performing rather than as - // an agent-initiated transfer. Doing it the other way — a `ctx.api` write - // from `afterUpdate` — WOULD need `crm_case.allowTransfer` here, which - // would let an agent reassign any case they can edit. That is a - // permission-model decision and is not being taken as a side effect of a - // hook: this line stays `crm_task` only. - crm_task: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false, readScope: "own", allowTransfer: true }, - // #592 — `log_call` / `log_meeting` are scoped to `crm_case` too, and an - // agent who cannot INSERT a `crm_event` gets a button that 403s. Same - // own-scoped shape as their tasks. - crm_event: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false, readScope: "own" }, - crm_event_attendee: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false }, - crm_product: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - // The knowledge base is this team's own surface: agents draft and revise - // articles (draft → in_review → published is enforced by the KB flow, not by - // CRUD), and read every published article regardless of author. Archiving - // is destructive-by-policy, so deletion stays with admins. Before #488 the - // object had no grant at all — the "Knowledge" nav item was denied for - // everyone, including the agents it was built for. - // Agents rate the articles they use to close cases (#601). Create + edit - // their OWN row (`modifyAllRecords: false` keeps them off everyone else's - // vote); no delete — a withdrawn opinion is a changed verdict, not an - // erased one. - crm_article_feedback: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - crm_knowledge_article: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - // The record Attachments panel, READ only: canonical note on `enable.files` - // in `src/sales/objects/index.ts` (#2029). Which attachments it lists - // derives from the parent record; upload and delete wait upstream. - sys_attachment: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - // The record Discussion panel, comments and activity: canonical note on - // `enable.feeds` in `src/sales/objects/index.ts` (#2029). Which threads it - // reaches derives from the parent record; deleting a comment waits upstream. - sys_comment: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - sys_activity: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false } - }, - fields: { - "crm_case.is_sla_violated": { readable: true, editable: false }, - "crm_case.resolution_time_hours": { readable: true, editable: false }, - // Internal notes are the agent's working memory on a ticket — full access - // here, read-only for sales_manager, masked for sales_rep (#488). - "crm_case.internal_notes": { readable: true, editable: true }, - // Account health is renewal-team data an agent reads for context only. - "crm_account.health_score": { readable: true, editable: false } - } -}; -var ServiceManagerProfile = { - ...ServiceAgentProfile, - name: "service_manager", - label: "Service Manager" -}; - -// src/sales/profiles/system-admin.profile.ts -var SystemAdminProfile = { - name: "system_admin", - label: "System Administrator", - objects: { - // `allowTransfer` on every object — canonical note in `src/sales/profiles/index.ts`. - // The admin is the persona that reassigns ownership when someone leaves. - // `allowExport` on the five objects with an export surface — see the - // canonical note in `src/sales/profiles/index.ts`. It is authored even here: - // 17.0 gates export on the explicit bit, and `modifyAllRecords` does not - // stand in for it, so without these an admin cannot export either. - crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, - crm_account: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, - crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, - crm_opportunity: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, - crm_quote: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - crm_contract: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - crm_product: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - crm_campaign: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - crm_case: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true, allowExport: true }, - crm_task: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - crm_event: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - crm_event_attendee: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - // The objects below shipped with navigation, views, hooks and seed data - // but no grant in ANY permission set (#488): "Knowledge" and "Forecasts" - // were permission-denied nav items for every user, admins included. - crm_forecast: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - crm_article_feedback: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - crm_knowledge_article: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - // Detail rows. Their RECORD-level access derives from the master - // (ADR-0055 `controlled_by_parent`), but object-level CRUD is a separate - // gate that is never derived — it has to be granted explicitly here. - crm_opportunity_line_item: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - crm_quote_line_item: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - crm_campaign_member: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowTransfer: true }, - // The record Attachments panel, READ only: canonical note on `enable.files` - // in `src/sales/objects/index.ts` (#2029). Which attachments it lists - // derives from the parent record; upload and delete wait upstream. - sys_attachment: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - // The record Discussion panel, comments and activity: canonical note on - // `enable.feeds` in `src/sales/objects/index.ts` (#2029). Which threads it - // reaches derives from the parent record; deleting a comment waits upstream. - sys_comment: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - sys_activity: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false } - }, - systemPermissions: [ - "view_setup", - "manage_users", - "customize_application", - "view_all_data", - "modify_all_data", - "manage_profiles", - "manage_roles", - "manage_sharing" - ] -}; - -// src/sales/translations/index.ts -var translations_exports = {}; -__export(translations_exports, { - CrmTranslations: () => CrmTranslations -}); - -// src/sales/translations/en/app.ts -var appSurface = { - apps: { - crm_enterprise: { - label: "HotCRM", - description: "Customer relationship management for sales, service, and marketing", - navigation: { - group_activity: { label: "Activity" }, - group_sales: { label: "Sales" }, - group_service: { label: "Service" }, - group_marketing: { label: "Marketing" } - } - } - }, - messages: { - "common.save": "Save", - "common.cancel": "Cancel", - "common.delete": "Delete", - "common.edit": "Edit", - "common.create": "Create", - "common.search": "Search", - "common.filter": "Filter", - "common.export": "Export", - "common.back": "Back", - "common.confirm": "Confirm", - "nav.sales": "Sales", - "nav.service": "Service", - "nav.marketing": "Marketing", - "nav.products": "Products", - "nav.analytics": "Analytics", - "success.saved": "Record saved successfully", - "success.converted": "Lead converted successfully", - "confirm.delete": "Are you sure you want to delete this record?", - "confirm.convert_lead": "Convert this lead to account, contact, and opportunity?", - "error.required": "This field is required", - "error.load_failed": "Failed to load data" - }, - dashboards: { - sales_activity_dashboard: { - label: "Sales Activity", - description: "Who is talking to customers, how often, and which accounts have gone quiet", - widgets: { - interactions_held: { title: "Interactions Logged", description: "Calls and meetings that actually happened" }, - meetings_booked: { title: "Meetings Booked", description: "Meetings on the calendar that have not happened yet" }, - customer_minutes: { title: "Customer Minutes", description: "Total time spent in front of customers" }, - tasks_completed: { title: "Tasks Completed", description: "Follow-ups closed out \u2014 the other half of activity" }, - activity_by_rep: { title: "Activity by Rep", description: "Logged interactions per owner" }, - activity_by_week: { title: "Activity Volume by Week", description: "Interactions per week" }, - activity_mix: { title: "Activity Mix", description: "Calls vs meetings vs demos" }, - activity_by_record_type: { title: "Where the Activity Lands", description: "Which part of the funnel is getting attention" }, - deal_activity: { title: "Interactions on Deals", description: "Logged interactions linked to an opportunity" }, - open_deals_for_activity: { title: "Open Deals", description: "Opportunities still in play" }, - quiet_accounts_30: { title: "Quiet 30+ Days", description: "Active accounts with no logged interaction in a month" }, - quiet_accounts_60: { title: "Quiet 60+ Days", description: "Two months of silence \u2014 the at-risk threshold" }, - quiet_accounts_90: { title: "Quiet 90+ Days", description: "A quarter with no contact" } - } - }, - crm_overview_dashboard: { - label: "CRM Overview", - description: "Revenue metrics, pipeline analytics, and deal insights", - widgets: { - total_revenue: { title: "Total Revenue", description: "Closed-won revenue this period" }, - active_deals: { title: "Active Deals", description: "Open opportunities in the pipeline" }, - won_deals: { title: "Won Deals", description: "Closed-won deals this period" }, - avg_deal_size: { title: "Avg Deal Size", description: "Average value of closed-won deals" }, - revenue_trends: { title: "Revenue Trends", description: "Closed-won revenue over the last 12 months" }, - lead_source: { title: "Lead Source", description: "Pipeline value by acquisition channel" }, - pipeline_by_stage: { title: "Pipeline by Stage", description: "Open opportunity value at each sales stage" }, - top_products: { title: "Top Products", description: "Total list-price revenue by product category" }, - pipeline_by_owner: { title: "Pipeline by Owner", description: "Open pipeline value and deal count per sales rep" } - } - }, - executive_dashboard: { - label: "Executive Overview", - description: "High-level revenue, customer, and pipeline KPIs for leadership", - widgets: { - total_revenue_ytd: { title: "Total Revenue (YTD)", description: "Closed-won revenue this year" }, - total_accounts: { title: "Active Accounts", description: "Customers with at least one active relationship" }, - total_contacts: { title: "Total Contacts", description: "People in our address book" }, - open_leads: { title: "Open Leads", description: "Unconverted leads in the funnel" }, - revenue_trend: { title: "Revenue Trend", description: "Closed-won revenue over the last 12 months" }, - revenue_by_industry: { title: "Revenue by Industry", description: "YTD closed-won revenue split by customer industry" }, - pipeline_by_stage: { title: "Pipeline by Stage", description: "Open opportunity value at each sales stage" }, - new_accounts_by_month: { title: "New Accounts", description: "Account creation cadence \u2014 last 6 months" }, - accounts_by_industry: { title: "Accounts by Industry", description: "Total annual revenue and account count per industry" } - } - }, - sales_dashboard: { - label: "Sales Performance", - description: "Pipeline analytics, win rate trends, and rep performance", - widgets: { - total_pipeline_value: { title: "Total Pipeline", description: "Sum of open opportunity value" }, - closed_won_qtd: { title: "Closed Won (QTD)", description: "Revenue closed this quarter" }, - open_opportunities: { title: "Open Opportunities", description: "Active deals in flight" }, - avg_deal_size: { title: "Avg Deal Size", description: "Average value of closed-won deals this quarter" }, - pipeline_by_stage: { title: "Pipeline by Stage", description: "Open opportunity value at each sales stage" }, - monthly_revenue_trend: { title: "Monthly Revenue Trend", description: "Closed-won revenue, last 12 months" }, - pipeline_by_forecast_category: { title: "Pipeline by Forecast Category", description: "Open pipeline grouped by sales forecast category" }, - lead_source_breakdown: { title: "Lead Source", description: "Where our pipeline is coming from" }, - open_pipeline_by_owner: { title: "Open Pipeline by Owner", description: "In-flight pipeline value, deal count and avg win probability per rep" }, - quota_attainment_by_rep: { title: "Quota Attainment by Rep", description: "Current-quarter quota, closed revenue and attainment per rep, from forecast snapshots" }, - pipeline_stage_by_source: { title: "Pipeline by Stage \xD7 Lead Source", description: "Cross-tab of open opportunity amount by stage and source" }, - win_rate_12m: { title: "Win Rate (12M)", description: "Deals won as a share of all deals settled in the last 12 months" }, - won_deals_12m: { title: "Deals Won (12M)", description: "The numerator of the win rate" }, - lost_deals_12m: { title: "Deals Lost (12M)", description: "The other half of the win-rate denominator" }, - win_rate_by_owner: { title: "Win / Loss by Rep", description: "Deals won, deals lost and win rate per rep \u2014 last 12 months" }, - win_rate_by_lead_source: { title: "Win / Loss by Lead Source", description: "Which sources produce deals that actually close \u2014 last 12 months" }, - loss_reason_breakdown: { title: "Why We Lose", description: "Lost deals by reason \u2014 last 12 months" } - } - }, - service_dashboard: { - label: "Customer Service", - description: "Case load, SLA health, and resolution performance", - widgets: { - open_cases: { title: "Open Cases", description: "Cases that are not yet closed" }, - critical_cases: { title: "Critical Cases", description: "Open cases marked as critical priority" }, - avg_resolution_time: { title: "Avg Resolution Time", description: "Mean time to close, in hours" }, - sla_violations: { title: "SLA Violations", description: "Cases that breached their SLA" }, - cases_by_status: { title: "Cases by Status", description: "Workload distribution across the pipeline" }, - cases_by_priority: { title: "Cases by Priority", description: "Open case mix by urgency" }, - cases_by_origin: { title: "Cases by Origin", description: "Where our cases are coming from" }, - daily_case_volume: { title: "Daily Case Volume", description: "New cases created over the last 30 days" }, - sla_compliance_gauge: { title: "SLA Compliance", description: "Percent of cases resolved within SLA this period" }, - kb_deflection_rate: { title: "KB Deflection Rate", description: "Share of closed cases resolved with a knowledge article" }, - kb_resolved_cases: { title: "Resolved by KB", description: "Closed cases pointing at the article that resolved them" }, - closed_cases_total: { title: "Closed Cases", description: "The denominator behind the deflection rate" }, - top_resolving_articles: { title: "Top Resolving Articles", description: "Knowledge articles ranked by the closed cases they resolved" }, - my_open_cases_by_priority: { title: "My Open Cases by Priority", description: "Your open cases and their SLA-violation rate, broken down by priority" } - } - } - }, - pages: { - account_detail_page: { - label: "Account Detail", - description: "Slotted account record page \u2014 custom header + persistent discussion feed.", - // Required, though it equals the page source: a missing `title` falls - // back to `label`, and the header then read "Account Detail" instead of - // the account's name (#2042). - title: "{name}", - subtitle: "{industry} \xB7 {type}" - }, - account_workbench: { - label: "Account Workbench", - description: "Curated account list for the sales team: quick filters only, no view management." - }, - app_launcher_page: { - label: "App Launcher", - description: "Central hub for accessing all applications", - subtitle: "Select an app to get started", - components: { - app_search: { label: "Search Apps" }, - app_grid: { label: "Application Grid" } - } - }, - case_detail_page: { - label: "Case Detail", - description: "Service-agent case record: highlights, SLA path, details and activity timeline.", - title: "{case_number} \xB7 {subject}", - subtitle: "{crm_account}", - components: { - case_highlights: { label: "Key Information" }, - case_status_path: { label: "Case Status Path" } - } - }, - lead_detail_page: { - label: "Lead Detail", - description: "Comprehensive lead detail page with highlights, details, and related information", - title: "{first_name} {last_name}", - subtitle: "{company}", - components: { - lead_duplicate_alert_confirmed: { label: "Confirmed Duplicate Alert" }, - lead_duplicate_alert_suspected: { label: "Suspected Duplicate Alert" }, - lead_highlights: { label: "Key Information" }, - lead_path: { label: "Lead Status Path" }, - main_tabs: { label: "Lead Information Tabs" } - } - }, - opportunity_detail_page: { - label: "Opportunity Detail", - description: "Comprehensive opportunity detail page with path, highlights, details, and related lists", - title: "{name}", - subtitle: "{crm_account}", - components: { - opp_highlights: { label: "Key Information" }, - opp_stage_path: { label: "Opportunity Stage Path" } - } - }, - sales_home_page: { - label: "Sales Home", - description: "Sales team home page with key metrics and quick actions", - title: "Sales Dashboard", - subtitle: "Welcome back", - components: { - quick_create: { title: "Quick Create", label: "Quick Create" }, - key_metrics: { title: "Key Performance Indicators", label: "Key Metrics" }, - home_tabs: { label: "Home Tabs" }, - ai_briefing: { - title: "Ask the AI Assistant", - label: "Today with the AI Assistant" - }, - upcoming_events: { title: "Upcoming Events", label: "Upcoming Events" } - } - }, - utility_bar_page: { - label: "Utility Bar", - description: "Quick access utility bar with floating tools", - components: { - notifications_panel: { label: "Notifications" }, - quick_notes: { title: "Quick Notes", label: "Quick Notes" }, - quick_search: { label: "Quick Search" } - } - } - } -}; - -// src/sales/translations/en/_shared.ts -var activityActions = { - log_call: { - label: "Log a Call", - successMessage: "Call logged successfully!", - params: { - subject: { label: "Call Subject" }, - duration: { label: "Duration (minutes)" }, - attendee_contacts: { label: "Contact Attendees" }, - attendee_users: { label: "Internal Attendees" }, - notes: { label: "Call Notes" } - } - }, - log_meeting: { - label: "Log a Meeting", - successMessage: "Meeting logged successfully!", - params: { - subject: { label: "Meeting Subject" }, - duration: { label: "Duration (minutes)" }, - attendee_contacts: { label: "Contact Attendees" }, - attendee_users: { label: "Internal Attendees" }, - notes: { label: "Meeting Notes" } - } - }, - schedule_meeting: { - label: "Schedule a Meeting", - successMessage: "Meeting scheduled!", - params: { - subject: { label: "Meeting Subject" }, - start_date: { label: "Start Date (UTC)" }, - start_time: { label: "Start Time (UTC)" }, - location: { label: "Location" }, - duration: { label: "Duration (minutes)" }, - attendee_contacts: { label: "Contact Attendees" }, - attendee_users: { label: "Internal Attendees" }, - notes: { label: "Agenda" } - } - } -}; - -// src/sales/translations/en/objects.customer.ts -var customer = { - crm_account: { - label: "Account", - pluralLabel: "Accounts", - fields: { - account_number: { label: "Account Number" }, - registration_number: { - label: "Registration Number", - help: "The counterparty's registered identity as issued by its own government registry. Not the Account Number, which we issue." - }, - commercial_capability: { - label: "Commercial Capability", - help: "Whether new business may be opened against this account. Settlement Only accounts stay usable for billing and payment, but no new opportunity may be linked to them.", - options: { full: "Full", settlement_only: "Settlement Only" } - }, - incumbent_vendor: { label: "Incumbent Vendor", help: "The supplier currently holding this account for the spend we are chasing." }, - annual_purchasing_budget: { label: "Annual Purchasing Budget", help: "What this account expects to spend with vendors this year \u2014 not its own revenue." }, - payment_cycle: { - label: "Payment Cycle", - options: { prepaid: "Prepaid", net_30: "Net 30", net_60: "Net 60", net_90: "Net 90" } - }, - approval_status: { - label: "Approval Status", - help: "Where this account stands in its sign-off. A new account starts Pending and is decided in the approval inbox.", - options: { pending: "Pending", approved: "Approved", rejected: "Rejected" } - }, - name: { label: "Account Name", help: "Legal name of the company or organization" }, - type: { - label: "Type", - options: { prospect: "Prospect", customer: "Customer", partner: "Partner", former: "Former Customer" } - }, - industry: { - label: "Industry", - options: { - technology: "Technology", - software: "Software / SaaS", - finance: "Finance", - healthcare: "Healthcare", - retail: "Retail", - manufacturing: "Manufacturing", - education: "Education", - real_estate: "Real Estate", - media: "Media & Entertainment", - logistics: "Logistics", - hospitality: "Hospitality", - energy: "Energy & Utilities", - government: "Government", - nonprofit: "Non-profit", - other: "Other" - } - }, - annual_revenue: { label: "Annual Revenue" }, - child_account_revenue: { label: "Child Account Revenue", help: "Sum of the annual revenue of the direct children of this account." }, - number_of_employees: { label: "Number of Employees" }, - phone: { label: "Phone" }, - website: { label: "Website" }, - billing_address: { label: "Billing Address" }, - billing_country: { - label: "Billing Country", - help: "Derived from Billing Address \u2014 the country exactly as entered, trimmed and upper-cased." - }, - territory: { - label: "Territory", - help: "Derived from Billing Address \u2014 the sales territory the sharing rules match on. Accounts outside the staffed territories are Other.", - options: { na: "North America", emea: "EMEA", other: "Other" } - }, - office_location: { label: "Office Location" }, - owner_id: { label: "Account Owner" }, - parent_account: { label: "Parent Account", help: "Parent company in hierarchy" }, - description: { label: "Description" }, - is_active: { label: "Active" }, - last_activity_date: { label: "Last Activity Date" }, - brand_color: { label: "Brand Color" }, - logo: { label: "Company Logo" }, - tier: { - label: "Customer Tier", - options: { strategic: "Strategic", enterprise: "Enterprise", mid_market: "Mid-Market", smb: "SMB" } - }, - segment: { - label: "Segment", - options: { net_new: "Net New", growth: "Growth", at_risk: "At Risk", stable: "Stable" } - }, - health_score: { - label: "Health Score", - help: "CSM-maintained health indicator", - options: { healthy: "Healthy", watching: "Watching", at_risk: "At Risk", churning: "Churning" } - }, - name_normalized: { - label: "Account Name (Normalized)", - help: "Match key for lead conversion: Account Name lower-cased, trimmed, with internal whitespace collapsed. Maintained by the account_protection hook \u2014 never edit directly." - }, - display_title: { label: "Display Title" } - }, - _views: { - all_accounts: { label: "All Accounts", description: "Primary account list with revenue & industry summaries" }, - account_gallery: { label: "Account Cards", description: "Branded account cards with brand-color highlights" }, - account_map: { label: "Accounts by Location", description: "Geospatial distribution of accounts" }, - enterprise_accounts: { label: "Enterprise Accounts", description: "Accounts with the highest annual revenue" }, - my_accounts: { label: "My Accounts", description: "Accounts owned by the current user" }, - at_risk_accounts: { label: "\u26A0\uFE0F At-Risk Accounts" } - }, - _sections: { - basic: { label: "Basic Information" }, - financials: { label: "Financials" }, - business_profile: { label: "Business Profile" }, - contact_info: { label: "Contact Information" }, - ownership: { label: "Ownership & Status" }, - branding: { label: "Branding" }, - system: { label: "System" }, - // Form section names on account.view.ts (#1100) - profile: { label: "Profile" }, - customer_success: { label: "Customer Success" }, - locations: { label: "Locations" }, - description: { label: "Description" } - }, - _actions: { ...activityActions } - }, - crm_contact: { - label: "Contact", - pluralLabel: "Contacts", - fields: { - salutation: { - label: "Salutation", - options: { mr: "Mr.", ms: "Ms.", mrs: "Mrs.", dr: "Dr.", prof: "Prof." } - }, - first_name: { label: "First Name" }, - last_name: { label: "Last Name" }, - full_name: { label: "Full Name" }, - crm_account: { label: "Account" }, - email: { label: "Email" }, - phone: { label: "Phone" }, - mobile: { label: "Mobile" }, - title: { label: "Title" }, - department: { - label: "Department", - options: { - executive: "Executive", - sales: "Sales", - marketing: "Marketing", - engineering: "Engineering", - support: "Support", - finance: "Finance", - hr: "Human Resources", - operations: "Operations" - } - }, - // Buying centre (REQ-0004) — the decision map. English is the source - // wording for the option VALUES; every other pack translates these. - buying_function: { - label: "Buying Function", - options: { - decision_maker: "Decision Maker", - economic_buyer: "Economic Buyer", - technical_evaluator: "Technical Evaluator", - user: "User", - influencer: "Influencer", - gatekeeper: "Gatekeeper" - } - }, - attitude: { - label: "Attitude to Us", - options: { - champion: "Champion", - supportive: "Supportive", - neutral: "Neutral", - skeptical: "Skeptical", - blocker: "Blocker" - } - }, - relationship_strength: { - label: "Relationship Strength", - options: { - distant: "Distant", - acquaintance: "Acquaintance", - working: "Working Relationship", - strong: "Strong", - trusted_advisor: "Trusted Advisor" - } - }, - owner_id: { label: "Contact Owner" }, - description: { label: "Description" }, - is_primary: { label: "Primary Contact", help: "Is this the main contact for the account?" }, - avatar: { label: "Profile Picture" }, - mailing_address: { label: "Mailing Address" }, - lead_source: { - label: "Lead Source", - options: { - web: "Web", - referral: "Referral", - event: "Event / Trade Show", - webinar: "Webinar", - partner: "Partner", - advertisement: "Advertisement", - paid_search: "Paid Search", - social: "Social Media", - content: "Content / Blog", - cold_call: "Cold Call", - email_campaign: "Email Campaign", - other: "Other" - } - }, - do_not_call: { label: "Do Not Call" }, - email_opt_out: { label: "Email Opt Out" }, - last_contacted_date: { label: "Last Contacted" } - }, - _views: { - all_contacts: { label: "All Contacts" }, - contact_directory: { label: "People Directory" }, - primary_contacts: { label: "Primary Contacts" } - }, - _sections: { - identity: { label: "Identity" }, - account_info: { label: "Account & Title" }, - buying_centre: { label: "Buying Centre" }, - contact_info: { label: "Contact Information" }, - mailing_address: { label: "Mailing Address" }, - additional: { label: "Additional Info" }, - preferences: { label: "Communication Preferences" }, - // Form section names on contact.view.ts (#1100). `contact_details` / - // `comm_preferences`, not `contact_info` / `preferences` — those are - // already fieldGroup keys with their own (longer) wording above. - contact_details: { label: "Contact Info" }, - comm_preferences: { label: "Preferences" } - }, - _actions: { - ...activityActions, - mark_primary: { - label: "Mark as Primary Contact", - confirmText: "Mark this contact as the primary contact for the account?", - successMessage: "Contact marked as primary!" - }, - send_email: { - label: "Send Email", - params: { - subject: { label: "Subject" }, - body: { label: "Body" } - } - }, - add_contact_to_campaign: { - label: "Add to Campaign", - successMessage: "Contacts added to campaign!", - params: { - crm_campaign: { label: "Campaign" } - } - } - } - } -}; - -// src/sales/translations/en/objects.pipeline.ts -var pipeline = { - crm_lead: { - label: "Lead", - pluralLabel: "Leads", - fields: { - first_name: { label: "First Name" }, - last_name: { label: "Last Name" }, - company: { label: "Company" }, - title: { label: "Title" }, - email: { label: "Email" }, - phone: { label: "Phone" }, - status: { - label: "Status", - options: { - new: "New", - contacted: "Contacted", - qualified: "Qualified", - unqualified: "Unqualified", - converted: "Converted" - } - }, - lead_source: { - label: "Lead Source", - options: { - web: "Web", - referral: "Referral", - event: "Event / Trade Show", - webinar: "Webinar", - partner: "Partner", - advertisement: "Advertisement", - paid_search: "Paid Search", - social: "Social Media", - content: "Content / Blog", - cold_call: "Cold Call", - email_campaign: "Email Campaign", - other: "Other" - } - }, - owner_id: { label: "Lead Owner" }, - is_converted: { label: "Converted" }, - description: { label: "Description" }, - salutation: { - label: "Salutation", - options: { mr: "Mr.", ms: "Ms.", mrs: "Mrs.", dr: "Dr.", prof: "Prof." } - }, - full_name: { label: "Full Name" }, - industry: { - label: "Industry", - options: { - technology: "Technology", - software: "Software / SaaS", - finance: "Finance", - healthcare: "Healthcare", - retail: "Retail", - manufacturing: "Manufacturing", - education: "Education", - real_estate: "Real Estate", - media: "Media & Entertainment", - logistics: "Logistics", - hospitality: "Hospitality", - energy: "Energy & Utilities", - government: "Government", - nonprofit: "Non-profit", - other: "Other" - } - }, - mobile: { label: "Mobile" }, - website: { label: "Website" }, - rating: { label: "Lead Score", help: "Lead quality score (1-5 stars)" }, - converted_account: { label: "Converted Account" }, - converted_contact: { label: "Converted Contact" }, - converted_opportunity: { label: "Converted Opportunity" }, - converted_date: { label: "Converted Date" }, - address: { label: "Address" }, - annual_revenue: { label: "Annual Revenue" }, - number_of_employees: { label: "Number of Employees" }, - notes: { label: "Notes", help: "Working notes on this lead \u2014 supports formatting." }, - do_not_call: { label: "Do Not Call" }, - email_opt_out: { label: "Email Opt Out" }, - disqualification_reason: { - label: "Disqualification Reason", - help: "Required when status is Unqualified", - options: { - not_a_fit: "Not a Fit", - no_budget: "No Budget", - wrong_persona: "Wrong Persona", - unreachable: "Unreachable", - duplicate: "Duplicate", - competitor: "Competitor", - other: "Other" - } - }, - duplicate_of_type: { - label: "Duplicate Of", - help: "Which object holds the surviving record this lead repeats.", - // `erased` is a tombstone, not a choice: the form does not offer it - // (see `src/sales/views/lead.view.ts`), but a lead whose survivor was - // deleted carries it, so it needs a label wherever the record is - // READ — detail page, list column, export. Untranslated it would - // render as the raw `erased`. - options: { crm_lead: "Lead", crm_contact: "Contact", erased: "Erased Record" } - }, - duplicate_of_lead: { label: "Duplicate Of Lead" }, - duplicate_of_contact: { label: "Duplicate Of Contact" }, - duplicate_status: { - label: "Duplicate Status", - help: "Suspected = flagged automatically at intake. Confirmed = a human verified the match.", - options: { suspected: "Suspected", confirmed: "Confirmed" } - }, - display_title: { label: "Display Title" }, - company_normalized: { - label: "Company (Normalized)", - help: "Match key for lead conversion: Company lower-cased, trimmed, with internal whitespace collapsed. Maintained by the lead_duplicate_check hook \u2014 never edit directly." - }, - next_followup_date: { label: "Next Follow-up Date" }, - last_contacted_date: { label: "Last Contacted" }, - need_type: { - label: "Need Type", - help: "What this prospect is asking for. Routing, prioritisation and demand reporting read this.", - options: { - new_implementation: "New Implementation", - expansion: "Expansion", - replacement: "Replacement", - renewal: "Renewal", - consulting: "Consulting", - support: "Support & Maintenance", - other: "Other" - } - }, - estimated_amount: { - label: "Estimated Amount", - help: "Estimated value of this demand, before qualification. Prefills the deal amount at conversion." - }, - conversion_approval_status: { - label: "Conversion Approval", - help: "Whether this lead has been signed off for conversion. Not Required means no approval is asked for \u2014 the shipped default.", - options: { - not_required: "Not Required", - pending: "Pending", - approved: "Approved", - rejected: "Rejected" - } - } - }, - _views: { - all_leads: { - label: "All Leads", - emptyState: { title: "No Leads Yet", message: "Get started by creating your first lead" } - }, - kanban_by_status: { label: "Lead Pipeline" }, - calendar_by_created: { label: "Lead Calendar" }, - gallery_view: { label: "Lead Cards" }, - my_leads: { label: "My Leads" }, - high_priority: { label: "High Priority" }, - hot_leads: { label: "\u{1F525} Hot Leads" }, - suspected_duplicates: { - label: "Suspected Duplicates", - emptyState: { - title: "No Suspected Duplicates", - message: "Nothing to review \u2014 every re-captured email has been checked." - } - } - }, - _sections: { - identity: { label: "Identity" }, - company_info: { label: "Company Information" }, - contact_info: { label: "Contact Information" }, - qualification: { label: "Qualification" }, - assignment: { label: "Assignment" }, - address: { label: "Address" }, - additional: { label: "Additional Info" }, - preferences: { label: "Communication Preferences" }, - conversion: { label: "Conversion" }, - duplicates: { label: "Duplicate Management" }, - // The detail page's sections reference the groups above (#806), so it - // has no section names of its own. - // Form section names on lead.view.ts (#1100). The sections of the - // default form and of every named formView live here — add a form - // there, add its section names here. `address` / `qualification` above - // are reused (identical fieldGroup wording); every other name here is new. - contact_information: { label: "Contact Information" }, - lead_classification: { label: "Lead Classification" }, - company_information: { label: "Company Information" }, - additional_information: { label: "Additional Information" }, - privacy: { label: "Privacy" }, - general: { label: "General" }, - details: { label: "Details" }, - step_1_contact_details: { label: "Step 1: Contact Details" }, - step_2_company_information: { label: "Step 2: Company Information" }, - step_3_qualification: { label: "Step 3: Qualification" }, - step_4_review_and_convert: { label: "Step 4: Review & Convert" }, - primary_information: { label: "Primary Information" }, - extended_details: { label: "Extended Details" }, - quick_edit: { label: "Quick Edit" }, - update_lead_status: { label: "Update Lead Status" }, - tell_us_about_yourself: { label: "Tell us about yourself" }, - about_your_company: { label: "About your company" }, - how_can_we_help: { label: "How can we help?" }, - lead_information: { label: "Lead Information" }, - address_information: { label: "Address Information" }, - privacy_preferences: { label: "Privacy Preferences" } - }, - _actions: { - ...activityActions, - convert_lead: { - label: "Convert Lead", - successMessage: "Lead converted successfully!" - }, - create_campaign: { - label: "Add to Campaign", - successMessage: "Leads added to campaign!", - params: { - crm_campaign: { label: "Campaign" } - } - }, - schedule_followup: { - label: "Schedule Follow-up", - successMessage: "Follow-up scheduled." - } - } - }, - crm_opportunity: { - label: "Opportunity", - pluralLabel: "Opportunities", - fields: { - name: { label: "Opportunity Name" }, - crm_account: { label: "Account" }, - primary_contact: { label: "Primary Contact" }, - owner_id: { label: "Opportunity Owner" }, - amount: { label: "Amount" }, - expected_revenue: { label: "Expected Revenue" }, - stage: { - label: "Stage", - options: { - prospecting: "Prospecting", - qualification: "Qualification", - needs_analysis: "Needs Analysis", - proposal: "Proposal", - negotiation: "Negotiation", - closed_won: "Closed Won", - closed_lost: "Closed Lost" - } - }, - probability: { label: "Probability (%)" }, - close_date: { label: "Close Date" }, - type: { - label: "Type", - options: { - new_business: "New Business", - existing_upgrade: "Existing Customer - Upgrade", - existing_renewal: "Existing Customer - Renewal", - existing_expansion: "Existing Customer - Expansion" - } - }, - forecast_category: { - label: "Forecast Category", - options: { - pipeline: "Pipeline", - best_case: "Best Case", - commit: "Commit", - omitted: "Omitted", - closed: "Closed" - } - }, - description: { label: "Description" }, - next_step: { label: "Next Step" }, - lead_source: { - label: "Lead Source", - options: { - web: "Web", - referral: "Referral", - event: "Event / Trade Show", - webinar: "Webinar", - partner: "Partner", - advertisement: "Advertisement", - paid_search: "Paid Search", - social: "Social Media", - content: "Content / Blog", - cold_call: "Cold Call", - email_campaign: "Email Campaign", - other: "Other" - } - }, - crm_campaign: { label: "Campaign", help: "Marketing campaign that generated this opportunity" }, - days_in_stage: { label: "Days in Current Stage" }, - stage_entry_date: { - label: "Stage Entry Date", - help: "Date this opportunity entered its current stage." - }, - is_private: { label: "Private" }, - approval_status: { - label: "Approval Status", - options: { not_required: "Not Required", pending: "Pending", approved: "Approved", rejected: "Rejected" } - }, - approved_date: { label: "Approved Date" }, - win_reason: { - label: "Win Reason", - help: "Why this deal was won. Required to close an opportunity as Won.", - options: { - better_product: "Better Product", - better_price: "Better Price", - relationship: "Existing Relationship", - better_support: "Better Support", - best_fit: "Best Fit / Features", - quote_accepted: "Quote Accepted", - other: "Other" - } - }, - loss_reason: { - label: "Loss Reason", - help: "Why this deal was lost. Required to close an opportunity as Lost.", - options: { - price: "Price Too High", - competitor: "Lost to Competitor", - no_budget: "No Budget", - no_decision: "No Decision", - timing: "Bad Timing", - features: "Missing Features", - other: "Other" - } - }, - loss_details: { - label: "Loss/Win Details", - help: "Free-text context behind the win or loss reason." - }, - // REQ-0006 — qualification, the customer's procurement calendar, the - // deal narrative, the business line and the status-change gate. - will_bid: { - label: "Will Bid", - help: "Whether we intend to bid. Unset means the decision is open." - }, - controllability: { label: "Controllability", options: { high: "High", medium: "Medium", low: "Low" } }, - priority: { label: "Priority", options: { high: "High", medium: "Medium", low: "Low" } }, - deal_level: { label: "Deal Level", options: { strategic: "Strategic", key: "Key", standard: "Standard" } }, - is_subcontracted: { label: "Involves Subcontracting" }, - subcontracting_note: { label: "Subcontracting Note" }, - customer_initiation_date: { label: "Customer Initiation Date" }, - expected_tender_date: { label: "Expected Tender Date" }, - expected_signing_date: { label: "Expected Signing Date" }, - expected_tender_amount: { label: "Expected Tender Amount" }, - expected_signing_amount: { label: "Expected Signing Amount" }, - business_line: { - label: "Business Line", - options: { - product: "Product", - services: "Professional Services", - consulting: "Consulting", - support: "Support & Maintenance", - other: "Other" - } - }, - customer_background: { label: "Customer Background" }, - project_background: { label: "Project Background" }, - risk_analysis: { label: "Risk Analysis" }, - payment_terms: { label: "Payment Terms" }, - requested_status: { label: "Requested Status", options: { closed_won: "Won", closed_lost: "Lost" } }, - status_change_approval_status: { - label: "Status Change Approval", - options: { not_required: "Not Required", pending: "Pending", approved: "Approved", rejected: "Rejected" } - }, - // REQ-0006 step 11 — the 立项 (qualification) approval gate. - qualification_requested: { - label: "Request Qualification Approval", - help: "Tick to send this deal for qualification approval. A rejection clears it; tick it again to ask again." - }, - qualification_approval_status: { - label: "Qualification Approval", - options: { not_required: "Not Required", pending: "Pending", approved: "Approved", rejected: "Rejected" } - } - }, - _views: { - tender_this_quarter: { - label: "Tender This Quarter", - emptyState: { - title: "No Tenders Expected This Quarter", - message: "This tab lists open deals whose customer-side tender date falls inside the current quarter. Record Expected Tender Date on a deal to see it here." - } - }, - open_opportunities: { label: "Open Deals" }, - all_opportunities: { label: "All Opportunities" }, - pipeline_kanban: { label: "Sales Pipeline" }, - close_date_calendar: { label: "Forecast Calendar" }, - deal_timeline: { label: "Deal Timeline" }, - deal_gallery: { label: "Deal Cards" }, - my_open_deals: { label: "My Open Deals" }, - stale_opportunities: { label: "\u26A0\uFE0F Stale Opportunities \xB7 Longest in Stage First" }, - closing_this_quarter: { - label: "Closing This Quarter", - emptyState: { - title: "No Deals Closing This Quarter", - message: "This tab lists open commit and best-case deals with a close date inside the current quarter. Nothing matches right now \u2014 deals closing later are on the Open Deals tab." - } - } - }, - _sections: { - basic: { label: "Basic Information" }, - financials: { label: "Financials" }, - sales_process: { label: "Sales Process" }, - classification: { label: "Classification" }, - campaign: { label: "Campaigns" }, - notes: { label: "Notes & Next Steps" }, - qualification: { label: "Qualification" }, - narrative: { label: "Deal Narrative" }, - crm_forecast: { label: "Forecast & Metrics" }, - // The detail page's sections reference the groups above (#1452), so it - // has no section names of its own. - // Form section names on opportunity.view.ts (#1100) - overview: { label: "Overview" }, - forecast: { label: "Forecast" }, - sales_strategy: { label: "Sales Strategy" }, - win_loss: { label: "Win / Loss" } - }, - _actions: { - ...activityActions, - clone_opportunity: { - label: "Clone Opportunity", - successMessage: "Opportunity cloned successfully!" - }, - mass_update_stage: { - label: "Update Stage", - successMessage: "Opportunities updated successfully!", - params: { - stage: { label: "New Stage" } - } - }, - generate_quote: { - label: "Generate Quote", - successMessage: "Quote created from opportunity!" - } - } - }, - crm_opportunity_line_item: { - label: "Opportunity Line Item", - pluralLabel: "Opportunity Line Items", - description: "Per-product pricing lines under an opportunity", - fields: { - crm_opportunity: { label: "Opportunity" }, - crm_product: { label: "Product" }, - description: { label: "Description" }, - quantity: { label: "Quantity" }, - list_price: { label: "List Price", help: "Auto-populated from the product's List Price." }, - unit_price: { - label: "Sales Price", - help: "Negotiated unit price (may differ from list price)" - }, - discount: { label: "Discount %" }, - total_price: { label: "Total" }, - line_number: { label: "Line #" } - }, - _sections: { - basic: { label: "Line Item" }, - pricing: { label: "Pricing" } - } - }, - crm_forecast: { - label: "Forecast", - pluralLabel: "Forecasts", - description: "Periodic pipeline snapshot by owner used for revenue forecasting", - fields: { - owner_id: { label: "Owner" }, - period: { label: "Period", options: { month: "Month", quarter: "Quarter" } }, - period_start: { - label: "Period Start", - help: "Must be the first day of the period \u2014 e.g. 2026-08-01 for Aug 2026. A quarterly forecast must additionally start on a quarter boundary: January 1, April 1, July 1 or October 1." - }, - period_end: { - label: "Period End", - help: "Normally derived automatically from Period and Period Start. If set by hand, it must be the last day of that period \u2014 e.g. 2026-09-30 for a quarter starting 2026-07-01, or 2026-08-31 for Aug 2026." - }, - period_label: { label: "Period", help: 'Human-friendly label, e.g. "Q3 2026" or "Aug 2026".' }, - snapshot_date: { label: "Snapshot Date", help: "The day this snapshot was captured." }, - source: { - label: "Source", - options: { scheduled: "Scheduled snapshot", ai: "AI skill", manual: "Manual entry" } - }, - quota: { label: "Quota" }, - pipeline_amount: { - label: "Pipeline", - help: "Sum of all open opportunities closing in this period (any stage)." - }, - best_case_amount: { - label: "Best Case", - help: "Open opportunities in the Best Case or Commit forecast category." - }, - commit_amount: { - label: "Commit", - help: "Open opportunities in the Commit forecast category (owner-committed)." - }, - closed_amount: { label: "Closed Won", help: "Already-closed-won amount in this period." }, - expected_amount: { - label: "Expected", - help: "Closed Won + Commit \u2014 what the owner reasonably expects to land." - }, - attainment_pct: { label: "Attainment %", help: "Closed Won \xF7 Quota \xD7 100. Reads 0% until a positive quota is set." }, - coverage_ratio: { - label: "Coverage", - help: "Pipeline \xF7 (Quota \u2212 Closed Won) \u2014 whether enough pipeline remains to cover the gap. Reads 0 once the quota is already met." - }, - notes: { label: "Notes" }, - display_title: { label: "Display Title" }, - seed_key: { - label: "Seed Key", - help: "Demo-fixture identity. Written only by the seed loader; empty on every real snapshot." - } - }, - _views: { - all_forecasts: { label: "All Forecasts" }, - this_quarter_forecasts: { - label: "This Quarter", - emptyState: { - title: "This Quarter Has No Snapshots Yet", - message: "Quarterly snapshots are written by the nightly forecast sweep. Until it has run once for the current quarter this view is empty \u2014 settled quarters are on the All tab." - } - }, - my_forecast: { label: "My Forecast" } - }, - _sections: { - basic: { label: "Snapshot" }, - amounts: { label: "Amounts" }, - meta: { label: "Source" }, - // Form section names on forecast.view.ts (#1100). `basic`'s label - // matches "Snapshot" but its key does not, so this form section - // needs its own entry; `notes` has no fieldGroup counterpart at all. - snapshot: { label: "Snapshot" }, - notes: { label: "Notes" } - } - } -}; - -// src/sales/translations/en/objects.commerce.ts -var commerce = { - crm_quote: { - label: "Quote", - pluralLabel: "Quotes", - fields: { - quote_number: { label: "Quote Number" }, - name: { label: "Quote Name" }, - crm_account: { label: "Account" }, - crm_contact: { - label: "Contact", - help: "Required once the quote is Presented or Accepted \u2014 the drafted contract takes its Primary Contact from here." - }, - crm_opportunity: { label: "Opportunity" }, - owner_id: { label: "Quote Owner" }, - status: { - label: "Status", - options: { - draft: "Draft", - in_review: "In Review", - presented: "Presented", - accepted: "Accepted", - rejected: "Rejected", - expired: "Expired" - } - }, - quote_date: { label: "Quote Date" }, - expiration_date: { label: "Expiration Date" }, - subtotal: { label: "Subtotal" }, - discount: { label: "Discount %" }, - discount_amount: { label: "Discount Amount" }, - tax: { label: "Tax" }, - shipping_handling: { label: "Shipping & Handling" }, - total_price: { label: "Total Price" }, - payment_terms: { - label: "Payment Terms", - options: { - net_15: "Net 15", - net_30: "Net 30", - net_60: "Net 60", - net_90: "Net 90", - due_on_receipt: "Due on Receipt" - } - }, - shipping_terms: { label: "Shipping Terms" }, - billing_address: { label: "Billing Address" }, - shipping_address: { label: "Shipping Address" }, - description: { label: "Description" }, - internal_notes: { label: "Internal Notes" }, - display_title: { label: "Display Title" } - }, - _views: { - all_quotes: { label: "All Quotes" }, - quote_pipeline: { label: "Quote Pipeline" }, - quote_calendar: { label: "Quote Calendar" } - }, - _sections: { - basic: { label: "Quote Information" }, - pricing: { label: "Pricing" }, - terms: { label: "Terms & Validity" }, - address: { label: "Addresses" }, - system: { label: "System" }, - // Form section names on quote.view.ts (#1100). `quote_terms`, not - // `terms` — `terms` is already the fieldGroup key for "Terms & Validity". - quote: { label: "Quote" }, - totals: { label: "Totals" }, - quote_terms: { label: "Terms" }, - addresses_and_notes: { label: "Addresses & Notes" } - } - }, - crm_quote_line_item: { - label: "Quote Line Item", - pluralLabel: "Quote Line Items", - description: "Per-product pricing lines under a quote", - fields: { - crm_quote: { label: "Quote" }, - crm_product: { label: "Product" }, - description: { label: "Description" }, - quantity: { label: "Quantity" }, - list_price: { label: "List Price" }, - unit_price: { label: "Sales Price" }, - discount: { label: "Discount %" }, - subtotal: { label: "Subtotal" }, - total_price: { label: "Total" }, - line_number: { label: "Line #" } - }, - _sections: { - basic: { label: "Line Item" }, - pricing: { label: "Pricing" } - } - }, - crm_contract: { - label: "Contract", - pluralLabel: "Contracts", - fields: { - contract_number: { label: "Contract Number" }, - crm_account: { label: "Account" }, - crm_contact: { label: "Primary Contact" }, - crm_opportunity: { label: "Related Opportunity" }, - owner_id: { label: "Contract Owner" }, - status: { - label: "Status", - options: { - draft: "Draft", - in_approval: "In Approval", - activated: "Activated", - expired: "Expired", - terminated: "Terminated" - } - }, - contract_term_months: { label: "Contract Term (Months)" }, - start_date: { label: "Start Date" }, - end_date: { label: "End Date" }, - contract_value: { label: "Contract Value" }, - billing_frequency: { - label: "Billing Frequency", - options: { - monthly: "Monthly", - quarterly: "Quarterly", - annually: "Annually", - one_time: "One-time" - } - }, - payment_terms: { - label: "Payment Terms", - options: { - net_15: "Net 15", - net_30: "Net 30", - net_60: "Net 60", - net_90: "Net 90", - due_on_receipt: "Due on Receipt" - } - }, - auto_renewal: { label: "Auto Renewal" }, - renewal_notice_days: { label: "Renewal Notice (Days)" }, - contract_type: { - label: "Contract Type", - options: { - subscription: "Subscription", - service: "Service Agreement", - license: "License", - partnership: "Partnership", - nda: "NDA", - msa: "MSA" - } - }, - signed_date: { label: "Signed Date" }, - signed_by: { label: "Signed By" }, - document_url: { label: "Contract Document" }, - special_terms: { label: "Special Terms" }, - description: { label: "Description" }, - billing_address: { label: "Billing Address" } - }, - _views: { - all_contracts: { label: "All Contracts" }, - renewal_calendar: { label: "Renewal Calendar" }, - contract_gantt: { label: "Contract Terms" }, - contract_timeline: { label: "Contract Timeline" } - }, - _sections: { - basic: { label: "Contract Information" }, - parties: { label: "Parties" }, - terms: { label: "Terms & Dates" }, - value: { label: "Contract Value" }, - status: { label: "Status & Approval" }, - renewal: { label: "Renewal" }, - // Form section names on contract.view.ts (#1100). `contract_terms`, - // not `terms` — `terms` is already the fieldGroup key for "Terms & Dates". - contract_terms: { label: "Terms" }, - signing_and_documents: { label: "Signing & Documents" }, - notes: { label: "Notes" } - } - }, - crm_product: { - label: "Product", - pluralLabel: "Products", - fields: { - product_code: { label: "Product Code" }, - name: { label: "Product Name" }, - description: { label: "Description" }, - category: { - label: "Category", - options: { - software: "Software", - hardware: "Hardware", - service: "Service", - subscription: "Subscription", - support: "Support" - } - }, - family: { - label: "Product Family", - options: { - enterprise: "Enterprise Solutions", - smb: "SMB Solutions", - services: "Professional Services", - cloud: "Cloud Services" - } - }, - list_price: { label: "List Price" }, - cost: { label: "Cost" }, - sku: { label: "SKU" }, - is_active: { label: "Active" }, - product_manager: { label: "Product Manager" }, - image: { label: "Product Image" }, - datasheet: { label: "Datasheet" }, - display_title: { label: "Display Title" } - }, - _views: { - all_products: { label: "All Products" }, - product_catalog: { label: "Product Catalog" } - }, - _sections: { - basic: { label: "Product Information" }, - pricing: { label: "Pricing" }, - metadata: { label: "Resources" }, - // Form section names on product.view.ts (#1100) - product_info: { label: "Product Info" }, - pricing_info: { label: "Pricing" }, - media: { label: "Media" } - } - } -}; - -// src/sales/translations/en/objects.service.ts -var service = { - crm_case: { - label: "Case", - pluralLabel: "Cases", - fields: { - case_number: { label: "Case Number" }, - subject: { label: "Subject" }, - description: { label: "Description" }, - crm_account: { label: "Account" }, - crm_contact: { label: "Contact" }, - status: { - label: "Status", - options: { - new: "New", - in_progress: "In Progress", - waiting_customer: "Waiting on Customer", - waiting_support: "Waiting on Support", - escalated: "Escalated", - resolved: "Resolved", - closed: "Closed" - } - }, - priority: { - label: "Priority", - options: { low: "Low", medium: "Medium", high: "High", critical: "Critical" } - }, - type: { - label: "Case Type", - options: { - question: "Question", - problem: "Problem", - feature_request: "Feature Request", - bug: "Bug" - } - }, - origin: { - label: "Case Origin", - options: { email: "Email", phone: "Phone", web: "Web", chat: "Chat", social_media: "Social Media" } - }, - owner_id: { label: "Case Owner" }, - closed_date: { label: "Closed Date" }, - first_response_date: { label: "First Response Date" }, - resolution_time_hours: { label: "Resolution Time (Hours)" }, - sla_due_date: { label: "SLA Due Date", help: "Set from the case priority and the account\u2019s Customer Tier, in calendar hours: nights, weekends and holidays count." }, - is_sla_violated: { label: "SLA Violated" }, - is_escalated: { label: "Escalated" }, - escalation_reason: { label: "Escalation Reason" }, - resolution: { label: "Resolution" }, - resolved_by_article: { label: "Resolved by Article", help: "Knowledge article that resolved this case \u2014 the deflection signal." }, - internal_notes: { label: "Internal Notes", help: "Internal notes; not visible to the customer." }, - is_closed: { label: "Is Closed" }, - display_title: { label: "Display Title" }, - priority_rank: { label: "Priority Rank" }, - escalated_date: { label: "Escalated Date" } - }, - _views: { - all_cases: { label: "All Cases" }, - case_workflow: { label: "Service Workflow" }, - sla_calendar: { label: "SLA Calendar" }, - case_timeline: { label: "Case Timeline" }, - unassigned_triage: { - label: "Unassigned \u2014 triage", - emptyState: { - title: "Nothing waiting for triage", - message: "Every case has an owner. Cases appear here when they arrive with no owner \u2014 typically a web-to-case submission that arrived while nobody held the Service Agent position." - } - }, - escalated_cases: { label: "Escalated Cases" }, - my_open_cases: { label: "My Open Cases" }, - sla_at_risk: { label: "\u23F0 SLA at Risk" } - }, - _sections: { - basic: { label: "Case Information" }, - origin: { label: "Origin & Routing" }, - sla: { label: "SLA & Priority" }, - resolution: { label: "Resolution" }, - escalation: { label: "Escalation" }, - system: { label: "System" }, - // The detail page's sections reference the groups above (#970), so it - // has no section names of its own. - // Form section names on case.view.ts (#1100). - case: { label: "Case" }, - how_can_we_help: { label: "How can we help?" } - }, - _actions: { - ...activityActions, - escalate_case: { - label: "Escalate Case", - confirmText: "This will escalate the case to the escalation team. Continue?", - successMessage: "Case escalated successfully!" - }, - close_case: { - label: "Close Case", - confirmText: "Are you sure you want to close this case?", - successMessage: "Case closed successfully!" - }, - claim_case: { - label: "Claim Case", - successMessage: "Case claimed \u2014 it is yours now." - } - } - }, - crm_knowledge_article: { - label: "Knowledge Article", - pluralLabel: "Knowledge Base", - description: "Reusable answers and how-to guides for customers and agents", - fields: { - article_number: { label: "Article #" }, - title: { label: "Title" }, - summary: { label: "Summary", help: "One-paragraph TL;DR shown in search results and AI citations." }, - body: { label: "Body", help: "Full article content (Markdown)." }, - category: { - label: "Category", - options: { - getting_started: "Getting Started", - how_to: "How-To", - troubleshooting: "Troubleshooting", - billing: "Billing & Pricing", - api: "API & Integrations", - release_notes: "Release Notes", - policy: "Policy" - } - }, - tags: { - label: "Tags", - options: { - auth: "Auth", - sso: "SSO", - mobile: "Mobile", - email: "Email", - reports: "Reports", - performance: "Performance", - data_import: "Data Import", - webhooks: "Webhooks" - } - }, - status: { - label: "Status", - options: { draft: "Draft", in_review: "In Review", published: "Published", archived: "Archived" } - }, - audience: { - label: "Audience", - help: "Public articles are visible in the customer portal; internal articles are agent-only.", - options: { public: "Public", internal: "Internal" } - }, - language: { - label: "Language", - options: { en: "English", zh_cn: "Simplified Chinese", es_es: "Spanish", ja_jp: "Japanese" } - }, - owner_id: { label: "Owner" }, - related_to_case: { label: "Source Case", help: "Case this article was authored from (optional)." }, - published_at: { label: "Published At" }, - last_reviewed_at: { label: "Last Reviewed" }, - helpful_count: { label: "Helpful", help: "Recounted from crm_article_feedback \u2014 never typed in." }, - not_helpful_count: { label: "Not Helpful", help: "Recounted from crm_article_feedback \u2014 never typed in." }, - display_title: { label: "Display Title" } - }, - _views: { - all_articles: { label: "All Articles" }, - published_articles: { label: "Published" }, - my_drafts: { label: "My Drafts" } - }, - _sections: { - basic: { label: "Article Information" }, - content: { label: "Content" }, - taxonomy: { label: "Categorization" }, - metrics: { label: "Engagement" }, - engagement: { label: "Engagement" }, - // Form section name on knowledge_article.view.ts (#1100) - article: { label: "Article" } - }, - _actions: { - mark_article_helpful: { - label: "Helpful", - successMessage: "Thanks \u2014 recorded as helpful." - }, - mark_article_not_helpful: { - label: "Not Helpful", - successMessage: "Thanks \u2014 recorded as not helpful." - } - } - }, - crm_article_feedback: { - label: "Article Feedback", - pluralLabel: "Article Feedback", - description: "One reader\u2019s helpful / not-helpful verdict on a knowledge article", - fields: { - feedback_number: { label: "Feedback #" }, - owner_id: { label: "Reader" }, - crm_knowledge_article: { label: "Article", help: "Knowledge article this feedback is about." }, - verdict: { - label: "Verdict", - options: { helpful: "Helpful", not_helpful: "Not Helpful" } - }, - comment: { label: "Comment", help: "Optional note explaining the verdict \u2014 read by the article\u2019s author." } - }, - _sections: { - basic: { label: "Feedback" } - } - } -}; - -// src/sales/translations/en/objects.activity.ts -var activity = { - crm_task: { - label: "Task", - pluralLabel: "Tasks", - fields: { - subject: { label: "Subject" }, - description: { label: "Description" }, - status: { - label: "Status", - options: { - not_started: "Not Started", - in_progress: "In Progress", - waiting: "Waiting", - completed: "Completed", - deferred: "Deferred" - } - }, - priority: { - label: "Priority", - options: { low: "Low", normal: "Normal", high: "High", urgent: "Urgent" } - }, - type: { - label: "Task Type", - options: { - call: "Call", - email: "Email", - meeting: "Meeting", - follow_up: "Follow-up", - demo: "Demo", - other: "Other" - } - }, - due_date: { label: "Due Date" }, - reminder_date: { label: "Reminder Date/Time" }, - completed_date: { label: "Completed Date" }, - owner_id: { label: "Assigned To" }, - related_to_type: { - label: "Related To Type", - options: { - crm_account: "Account", - crm_contact: "Contact", - crm_opportunity: "Opportunity", - crm_lead: "Lead", - crm_case: "Case" - } - }, - related_to_account: { label: "Related Account" }, - related_to_contact: { label: "Related Contact" }, - related_to_opportunity: { label: "Related Opportunity" }, - related_to_lead: { label: "Related Lead" }, - related_to_case: { label: "Related Case" }, - is_recurring: { label: "Recurring Task" }, - recurrence_type: { - label: "Recurrence Type", - options: { daily: "Daily", weekly: "Weekly", monthly: "Monthly", yearly: "Yearly" } - }, - recurrence_interval: { label: "Recurrence Interval" }, - recurrence_end_date: { label: "Recurrence End Date" }, - is_completed: { label: "Is Completed" }, - is_overdue: { label: "Is Overdue" }, - progress_percent: { label: "Progress (%)" }, - priority_rank: { label: "Priority Rank" }, - reminder_sent: { label: "Reminder Sent" } - }, - _views: { - all_tasks: { label: "All Tasks" }, - task_board: { label: "Task Board" }, - task_calendar: { label: "Task Schedule" }, - task_gantt: { label: "Execution Plan" }, - task_timeline: { label: "Worklog Timeline" }, - my_open_tasks: { label: "My Open Tasks" }, - todays_tasks: { label: "\u{1F4C5} My Priority Tasks" }, - overdue_tasks: { label: "\u23F0 Open Tasks \xB7 Most Overdue First" } - }, - _sections: { - basic: { label: "Task Information" }, - scheduling: { label: "Scheduling" }, - related: { label: "Related Records" }, - recurrence: { label: "Recurrence" }, - effort: { label: "Progress & Effort" }, - system: { label: "System" }, - // Form section names on task.view.ts (#1100) - task: { label: "Task" }, - related_records: { label: "Related Records" }, - recurrence_and_effort: { label: "Recurrence & Effort" } - } - }, - crm_event: { - label: "Event", - pluralLabel: "Events", - description: "Meetings, calls and other scheduled interactions with customers", - fields: { - subject: { label: "Subject" }, - description: { label: "Description" }, - type: { - label: "Event Type", - options: { - meeting: "Meeting", - call: "Call", - demo: "Demo", - webinar: "Webinar", - onsite_visit: "Onsite Visit", - other: "Other" - } - }, - status: { - label: "Status", - options: { - planned: "Planned", - held: "Held", - cancelled: "Cancelled", - no_show: "No Show" - } - }, - owner_id: { label: "Assigned To" }, - start_datetime: { label: "Start" }, - end_datetime: { label: "End" }, - all_day: { label: "All Day Event" }, - duration_minutes: { label: "Duration (minutes)" }, - location: { label: "Location", help: "Room, address, or meeting link" }, - related_to_type: { - label: "Related To Type", - options: { - crm_account: "Account", - crm_contact: "Contact", - crm_opportunity: "Opportunity", - crm_lead: "Lead", - crm_case: "Case" - } - }, - related_to_account: { label: "Related Account" }, - related_to_contact: { label: "Related Contact" }, - related_to_opportunity: { label: "Related Opportunity" }, - related_to_lead: { label: "Related Lead" }, - related_to_case: { label: "Related Case" }, - outcome_notes: { label: "Outcome Notes", help: "What was agreed, and what happens next" } - }, - _views: { - all_events: { label: "All Events" }, - event_calendar: { label: "Event Calendar" }, - event_timeline: { label: "Team Schedule" }, - my_events: { label: "My Calendar" }, - upcoming_events: { label: "\u{1F4C5} Upcoming \xB7 Soonest First" }, - held_events: { label: "\u2705 Interaction History" } - }, - _sections: { - basic: { label: "Event Information" }, - schedule: { label: "Schedule" }, - related: { label: "Related Records" }, - outcome: { label: "Outcome" }, - // Form section names on event.view.ts (#1100). `related_records`, - // not `related` — `related` is already the fieldGroup key above. - event: { label: "Event" }, - related_records: { label: "Related Records" } - } - }, - crm_event_attendee: { - label: "Event Attendee", - pluralLabel: "Event Attendees", - description: "A person invited to or present at an event", - fields: { - attendee_number: { label: "Attendee Number" }, - crm_event: { label: "Event" }, - attendee_type: { - label: "Attendee Type", - options: { contact: "Contact", lead: "Lead", user: "User", external: "External" } - }, - crm_contact: { label: "Contact", help: "Set when the attendee is an existing customer contact" }, - crm_lead: { label: "Lead", help: "Set when the attendee is still an unconverted lead" }, - sys_user: { label: "User", help: "Set when the attendee is a colleague" }, - external_name: { - label: "External Attendee", - help: "Name of an attendee who is in no CRM object \u2014 set when Attendee Type is External" - }, - response: { - label: "Response", - options: { - no_response: "No Response", - accepted: "Accepted", - declined: "Declined", - tentative: "Tentative" - } - }, - is_organizer: { label: "Organizer" }, - invited_date: { label: "Invited" } - }, - _views: { - all_event_attendees: { label: "Event Attendees" } - }, - _sections: { - basic: { label: "Attendee" }, - response: { label: "Invitation" }, - // Form section names on event_attendee.view.ts (#1100) — same English - // text as the fieldGroups above, but a distinct key: `attendee` / - // `invitation` are not `basic` / `response`. - attendee: { label: "Attendee" }, - invitation: { label: "Invitation" } - } - } -}; - -// src/sales/translations/en/objects.marketing.ts -var marketing = { - crm_campaign: { - label: "Campaign", - pluralLabel: "Campaigns", - fields: { - campaign_code: { label: "Campaign Code" }, - name: { label: "Campaign Name" }, - description: { label: "Description" }, - type: { - label: "Campaign Type", - options: { - email: "Email", - webinar: "Webinar", - trade_show: "Trade Show", - conference: "Conference", - direct_mail: "Direct Mail", - social_media: "Social Media", - content: "Content Marketing", - partner: "Partner Marketing" - } - }, - channel: { - label: "Primary Channel", - options: { - digital: "Digital", - social: "Social", - email: "Email", - events: "Events", - partner: "Partner" - } - }, - status: { - label: "Status", - options: { - planning: "Planning", - in_progress: "In Progress", - completed: "Completed", - aborted: "Aborted" - } - }, - start_date: { label: "Start Date" }, - end_date: { label: "End Date" }, - budgeted_cost: { label: "Budgeted Cost" }, - actual_cost: { label: "Actual Cost" }, - expected_revenue: { label: "Expected Revenue" }, - actual_revenue: { label: "Actual Revenue" }, - target_size: { label: "Target Size", help: "Target number of leads/contacts" }, - num_sent: { label: "Number Sent" }, - num_responses: { label: "Number of Responses" }, - num_leads: { label: "Number of Leads" }, - num_converted_leads: { label: "Converted Leads" }, - num_opportunities: { label: "Opportunities Created" }, - num_won_opportunities: { label: "Won Opportunities" }, - response_rate: { label: "Response Rate %" }, - roi: { label: "ROI %" }, - owner_id: { label: "Campaign Owner" }, - landing_page_url: { label: "Landing Page" }, - is_active: { label: "Active" }, - display_title: { label: "Display Title" } - }, - _views: { - all_campaigns: { label: "All Campaigns" }, - campaign_gantt: { label: "Campaign Schedule" }, - campaign_calendar: { label: "Launch Calendar" }, - campaign_timeline: { label: "Marketing Timeline" } - }, - _sections: { - basic: { label: "Campaign Information" }, - schedule: { label: "Schedule" }, - budget: { label: "Budget & ROI" }, - metrics: { label: "Performance" }, - assignment: { label: "Ownership" }, - assets: { label: "Campaign Assets" } - }, - _actions: { - enroll_leads: { - label: "Enroll Members", - successMessage: "Eligible members enrolled in campaign." - } - } - }, - crm_campaign_member: { - label: "Campaign Member", - pluralLabel: "Campaign Members", - description: "Leads and contacts touched by a campaign, with response status", - fields: { - member_number: { label: "Member Number" }, - crm_campaign: { label: "Campaign" }, - crm_lead: { label: "Lead", help: "Set when the member was a Lead at enrollment time" }, - crm_contact: { label: "Contact", help: "Set when the member is an existing Contact" }, - status: { - label: "Status", - options: { - sent: "Sent", - responded: "Responded", - converted: "Converted", - unsubscribed: "Unsubscribed" - } - }, - added_date: { label: "Added Date" }, - response_date: { label: "Response Date" }, - has_responded: { label: "Has Responded" } - }, - _sections: { - basic: { label: "Basic Information" }, - response: { label: "Response Tracking" } - }, - _actions: { - mark_responded: { - label: "Mark Responded", - successMessage: "Response recorded on this campaign member." - } - } - } -}; - -// src/sales/translations/en.ts -var en2 = { - objects: { - crm_account: customer.crm_account, - crm_contact: customer.crm_contact, - crm_knowledge_article: service.crm_knowledge_article, - crm_forecast: pipeline.crm_forecast, - crm_lead: pipeline.crm_lead, - crm_opportunity: pipeline.crm_opportunity, - crm_case: service.crm_case, - crm_contract: commerce.crm_contract, - crm_product: commerce.crm_product, - crm_quote: commerce.crm_quote, - crm_task: activity.crm_task, - crm_campaign: marketing.crm_campaign, - crm_event: activity.crm_event, - crm_event_attendee: activity.crm_event_attendee, - crm_article_feedback: service.crm_article_feedback, - crm_campaign_member: marketing.crm_campaign_member, - crm_opportunity_line_item: pipeline.crm_opportunity_line_item, - crm_quote_line_item: commerce.crm_quote_line_item - }, - ...appSurface -}; - -// src/sales/translations/zh-CN/app.ts -var appSurface2 = { - apps: { - crm_enterprise: { - label: "HotCRM", - description: "\u6DB5\u76D6\u9500\u552E\u3001\u670D\u52A1\u548C\u5E02\u573A\u8425\u9500\u7684\u5BA2\u6237\u5173\u7CFB\u7BA1\u7406\u7CFB\u7EDF", - // Keyed by navigation-node `id` (a flat keyspace regardless of depth). - navigation: { - group_activity: { label: "\u6D3B\u52A8" }, - nav_event: { label: "\u6D3B\u52A8" }, - nav_activity_dashboard: { label: "\u9500\u552E\u6D3B\u52A8" }, - nav_my_calendar: { label: "\u6211\u7684\u65E5\u5386" }, - nav_home: { label: "\u9996\u9875" }, - group_sales: { label: "\u9500\u552E" }, - nav_lead: { label: "\u7EBF\u7D22" }, - nav_account: { label: "\u5BA2\u6237" }, - nav_account_workbench: { label: "\u5BA2\u6237\u5DE5\u4F5C\u53F0" }, - nav_contact: { label: "\u8054\u7CFB\u4EBA" }, - nav_opportunity: { label: "\u5546\u673A" }, - nav_quote: { label: "\u62A5\u4EF7" }, - nav_contract: { label: "\u5408\u540C" }, - nav_product: { label: "\u4EA7\u54C1" }, - nav_sales_dashboard: { label: "\u9500\u552E\u4E1A\u7EE9" }, - group_work: { label: "\u6211\u7684\u5DE5\u4F5C" }, - nav_my_tasks: { label: "\u6211\u7684\u4EFB\u52A1" }, - nav_my_deals: { label: "\u6211\u7684\u5546\u673A" }, - nav_my_leads: { label: "\u6211\u7684\u7EBF\u7D22" }, - nav_my_cases: { label: "\u6211\u7684\u5DE5\u5355" }, - nav_approval_requests: { label: "\u5F85\u6211\u5BA1\u6279" }, - group_marketing: { label: "\u5E02\u573A\u8425\u9500" }, - nav_campaign: { label: "\u8425\u9500\u6D3B\u52A8" }, - group_service: { label: "\u670D\u52A1" }, - nav_case: { label: "\u5DE5\u5355" }, - nav_knowledge: { label: "\u77E5\u8BC6\u5E93" }, - nav_service_dashboard: { label: "\u670D\u52A1\u6982\u89C8" }, - group_insights: { label: "\u6570\u636E\u6D1E\u5BDF" }, - nav_crm_dashboard: { label: "CRM \u603B\u89C8" }, - nav_forecast: { label: "\u9500\u552E\u9884\u6D4B" }, - nav_report_pipeline_coverage: { label: "\u7BA1\u9053\u8986\u76D6\u7387" }, - nav_report_lead_inflow: { label: "\u7EBF\u7D22\u6D41\u5165" }, - nav_report_sla: { label: "SLA \u8FBE\u6210" } - } - } - }, - messages: { - "common.save": "\u4FDD\u5B58", - "common.cancel": "\u53D6\u6D88", - "common.delete": "\u5220\u9664", - "common.edit": "\u7F16\u8F91", - "common.create": "\u65B0\u5EFA", - "common.search": "\u641C\u7D22", - "common.filter": "\u7B5B\u9009", - "common.export": "\u5BFC\u51FA", - "common.back": "\u8FD4\u56DE", - "common.confirm": "\u786E\u8BA4", - "nav.sales": "\u9500\u552E", - "nav.service": "\u670D\u52A1", - "nav.marketing": "\u8425\u9500", - "nav.products": "\u4EA7\u54C1", - "nav.analytics": "\u6570\u636E\u5206\u6790", - "success.saved": "\u8BB0\u5F55\u4FDD\u5B58\u6210\u529F", - "success.converted": "\u7EBF\u7D22\u8F6C\u5316\u6210\u529F", - "confirm.delete": "\u786E\u5B9A\u8981\u5220\u9664\u6B64\u8BB0\u5F55\u5417\uFF1F", - "confirm.convert_lead": "\u5C06\u6B64\u7EBF\u7D22\u8F6C\u5316\u4E3A\u5BA2\u6237\u3001\u8054\u7CFB\u4EBA\u548C\u5546\u673A\uFF1F", - "error.required": "\u6B64\u5B57\u6BB5\u4E3A\u5FC5\u586B\u9879", - "error.load_failed": "\u6570\u636E\u52A0\u8F7D\u5931\u8D25" - }, - dashboards: { - sales_activity_dashboard: { - label: "\u9500\u552E\u6D3B\u52A8", - description: "\u8C01\u5728\u548C\u5BA2\u6237\u6C9F\u901A\u3001\u9891\u7387\u5982\u4F55\uFF0C\u4EE5\u53CA\u54EA\u4E9B\u5BA2\u6237\u5DF2\u7ECF\u6C89\u9ED8", - widgets: { - interactions_held: { title: "\u5DF2\u8BB0\u5F55\u4E92\u52A8", description: "\u771F\u5B9E\u53D1\u751F\u8FC7\u7684\u901A\u8BDD\u4E0E\u4F1A\u8BAE" }, - meetings_booked: { title: "\u5DF2\u9884\u7EA6\u4F1A\u8BAE", description: "\u5DF2\u6392\u5165\u65E5\u5386\u4F46\u5C1A\u672A\u4E3E\u884C\u7684\u4F1A\u8BAE" }, - customer_minutes: { title: "\u5BA2\u6237\u63A5\u89E6\u5206\u949F\u6570", description: "\u9762\u5411\u5BA2\u6237\u7684\u603B\u65F6\u957F" }, - tasks_completed: { title: "\u5DF2\u5B8C\u6210\u4EFB\u52A1", description: "\u5DF2\u95ED\u73AF\u7684\u8DDF\u8FDB\u4E8B\u9879\u2014\u2014\u6D3B\u52A8\u7684\u53E6\u4E00\u534A" }, - activity_by_rep: { title: "\u6309\u9500\u552E\u4EE3\u8868\u7EDF\u8BA1\u7684\u6D3B\u52A8", description: "\u6BCF\u4F4D\u8D1F\u8D23\u4EBA\u8BB0\u5F55\u7684\u4E92\u52A8\u6570" }, - activity_by_week: { title: "\u6BCF\u5468\u6D3B\u52A8\u91CF", description: "\u6BCF\u5468\u4E92\u52A8\u6570" }, - activity_mix: { title: "\u6D3B\u52A8\u6784\u6210", description: "\u901A\u8BDD\u3001\u4F1A\u8BAE\u4E0E\u6F14\u793A\u7684\u5360\u6BD4" }, - activity_by_record_type: { title: "\u6D3B\u52A8\u843D\u5728\u54EA\u91CC", description: "\u6F0F\u6597\u7684\u54EA\u4E2A\u73AF\u8282\u83B7\u5F97\u4E86\u5173\u6CE8" }, - deal_activity: { title: "\u5546\u673A\u4E0A\u7684\u4E92\u52A8", description: "\u5173\u8054\u5230\u5546\u673A\u7684\u5DF2\u8BB0\u5F55\u4E92\u52A8" }, - open_deals_for_activity: { title: "\u8FDB\u884C\u4E2D\u7684\u5546\u673A", description: "\u4ECD\u5728\u63A8\u8FDB\u7684\u5546\u673A\u6570" }, - quiet_accounts_30: { title: "\u6C89\u9ED8 30 \u5929\u4EE5\u4E0A", description: "\u4E00\u4E2A\u6708\u5185\u6CA1\u6709\u4EFB\u4F55\u4E92\u52A8\u8BB0\u5F55\u7684\u6D3B\u8DC3\u5BA2\u6237" }, - quiet_accounts_60: { title: "\u6C89\u9ED8 60 \u5929\u4EE5\u4E0A", description: "\u4E24\u4E2A\u6708\u65E0\u8054\u7CFB\u2014\u2014\u98CE\u9669\u9608\u503C" }, - quiet_accounts_90: { title: "\u6C89\u9ED8 90 \u5929\u4EE5\u4E0A", description: "\u6574\u6574\u4E00\u4E2A\u5B63\u5EA6\u6CA1\u6709\u8054\u7CFB" } - } - }, - crm_overview_dashboard: { - label: "CRM \u603B\u89C8", - description: "\u6536\u5165\u6307\u6807\u3001\u7BA1\u9053\u5206\u6790\u4E0E\u5546\u673A\u6D1E\u5BDF", - widgets: { - total_revenue: { title: "\u603B\u6536\u5165", description: "\u672C\u671F\u5DF2\u6210\u4EA4\u6536\u5165" }, - active_deals: { title: "\u6D3B\u8DC3\u5546\u673A", description: "\u7BA1\u9053\u4E2D\u8FDB\u884C\u4E2D\u7684\u5546\u673A" }, - won_deals: { title: "\u8D62\u5355\u6570", description: "\u672C\u671F\u5DF2\u7ED3\u6848\u5546\u673A\u4E2D\u8D62\u5355\u7684\u603B\u6570" }, - avg_deal_size: { title: "\u5E73\u5747\u8BA2\u5355\u91D1\u989D", description: "\u5DF2\u6210\u4EA4\u5546\u673A\u7684\u5E73\u5747\u91D1\u989D" }, - revenue_trends: { title: "\u6536\u5165\u8D8B\u52BF", description: "\u8FC7\u53BB 12 \u4E2A\u6708\u7684\u5DF2\u6210\u4EA4\u6536\u5165" }, - lead_source: { title: "\u7EBF\u7D22\u6765\u6E90", description: "\u6309\u83B7\u5BA2\u6E20\u9053\u7EDF\u8BA1\u7684\u7BA1\u9053\u91D1\u989D" }, - pipeline_by_stage: { title: "\u9636\u6BB5\u7BA1\u9053\u5206\u5E03", description: "\u6309\u9636\u6BB5\u7EDF\u8BA1\u7684\u8FDB\u884C\u4E2D\u5546\u673A\u91D1\u989D" }, - top_products: { title: "\u70ED\u95E8\u4EA7\u54C1", description: "\u6309\u4EA7\u54C1\u7C7B\u522B\u7EDF\u8BA1\u7684\u76EE\u5F55\u4EF7\u6536\u5165" }, - pipeline_by_owner: { title: "\u6309\u8D1F\u8D23\u4EBA\u7EDF\u8BA1\u7BA1\u9053", description: "\u5404\u9500\u552E\u8D1F\u8D23\u4EBA\u7684\u8FDB\u884C\u4E2D\u7BA1\u9053\u91D1\u989D\u4E0E\u5546\u673A\u6570" } - } - }, - executive_dashboard: { - label: "\u9AD8\u7BA1\u603B\u89C8", - description: "\u9762\u5411\u7BA1\u7406\u5C42\u7684\u6536\u5165\u3001\u5BA2\u6237\u4E0E\u7BA1\u9053\u9AD8\u9636\u6307\u6807", - widgets: { - total_revenue_ytd: { title: "\u5E74\u5EA6\u7D2F\u8BA1\u6536\u5165", description: "\u672C\u5E74\u5EA6\u5DF2\u6210\u4EA4\u6536\u5165" }, - total_accounts: { title: "\u6D3B\u8DC3\u5BA2\u6237", description: "\u81F3\u5C11\u5B58\u5728\u4E00\u9879\u6D3B\u8DC3\u5173\u7CFB\u7684\u5BA2\u6237" }, - total_contacts: { title: "\u8054\u7CFB\u4EBA\u603B\u6570", description: "\u901A\u8BAF\u5F55\u4E2D\u7684\u8054\u7CFB\u4EBA" }, - open_leads: { title: "\u672A\u8F6C\u5316\u7EBF\u7D22", description: "\u6F0F\u6597\u4E2D\u5C1A\u672A\u8F6C\u5316\u7684\u7EBF\u7D22" }, - revenue_trend: { title: "\u6536\u5165\u8D8B\u52BF", description: "\u8FC7\u53BB 12 \u4E2A\u6708\u7684\u5DF2\u6210\u4EA4\u6536\u5165" }, - revenue_by_industry: { title: "\u884C\u4E1A\u6536\u5165\u5206\u5E03", description: "\u672C\u5E74\u5EA6\u5DF2\u6210\u4EA4\u6536\u5165\u6309\u5BA2\u6237\u884C\u4E1A\u62C6\u5206" }, - pipeline_by_stage: { title: "\u9636\u6BB5\u7BA1\u9053\u5206\u5E03", description: "\u6309\u9636\u6BB5\u7EDF\u8BA1\u7684\u8FDB\u884C\u4E2D\u5546\u673A\u91D1\u989D" }, - new_accounts_by_month: { title: "\u65B0\u589E\u5BA2\u6237", description: "\u8FC7\u53BB 6 \u4E2A\u6708\u7684\u5BA2\u6237\u521B\u5EFA\u8282\u594F" }, - accounts_by_industry: { title: "\u6309\u884C\u4E1A\u7EDF\u8BA1\u5BA2\u6237", description: "\u5404\u884C\u4E1A\u7684\u5E74\u8425\u6536\u603B\u989D\u4E0E\u5BA2\u6237\u6570" } - } - }, - sales_dashboard: { - label: "\u9500\u552E\u4E1A\u7EE9", - description: "\u7BA1\u9053\u5206\u6790\u3001\u8D62\u7387\u8D8B\u52BF\u53CA\u9500\u552E\u4EE3\u8868\u7EE9\u6548", - widgets: { - total_pipeline_value: { title: "\u7BA1\u9053\u603B\u989D", description: "\u6240\u6709\u8FDB\u884C\u4E2D\u5546\u673A\u91D1\u989D\u5408\u8BA1" }, - closed_won_qtd: { title: "\u672C\u5B63\u5EA6\u5DF2\u6210\u4EA4", description: "\u672C\u5B63\u5EA6\u5DF2\u8D62\u5F97\u7684\u6536\u5165" }, - open_opportunities: { title: "\u8FDB\u884C\u4E2D\u5546\u673A", description: "\u6B63\u5728\u63A8\u8FDB\u7684\u6D3B\u8DC3\u5546\u673A" }, - avg_deal_size: { title: "\u5E73\u5747\u8BA2\u5355\u91D1\u989D", description: "\u672C\u5B63\u5EA6\u5DF2\u6210\u4EA4\u5546\u673A\u7684\u5E73\u5747\u91D1\u989D" }, - pipeline_by_stage: { title: "\u9636\u6BB5\u7BA1\u9053\u5206\u5E03", description: "\u6309\u9636\u6BB5\u7EDF\u8BA1\u7684\u8FDB\u884C\u4E2D\u5546\u673A\u91D1\u989D" }, - monthly_revenue_trend: { title: "\u6708\u5EA6\u6536\u5165\u8D8B\u52BF", description: "\u8FC7\u53BB 12 \u4E2A\u6708\u7684\u5DF2\u6210\u4EA4\u6536\u5165" }, - pipeline_by_forecast_category: { title: "\u9884\u6D4B\u7C7B\u522B\u7BA1\u9053\u5206\u5E03", description: "\u6309\u9884\u6D4B\u7C7B\u522B\u7EDF\u8BA1\u7684\u8FDB\u884C\u4E2D\u7BA1\u9053\u91D1\u989D" }, - lead_source_breakdown: { title: "\u7EBF\u7D22\u6765\u6E90\u5206\u5E03", description: "\u6309\u6765\u6E90\u7EDF\u8BA1\u7684\u7EBF\u7D22\u6570\u91CF" }, - open_pipeline_by_owner: { title: "\u6309\u8D1F\u8D23\u4EBA\u7EDF\u8BA1\u8FDB\u884C\u4E2D\u7BA1\u9053", description: "\u5404\u9500\u552E\u8D1F\u8D23\u4EBA\u7684\u8FDB\u884C\u4E2D\u7BA1\u9053\u91D1\u989D\u3001\u5546\u673A\u6570\u4E0E\u5E73\u5747\u8D62\u5355\u6982\u7387" }, - quota_attainment_by_rep: { title: "\u6309\u9500\u552E\u4EE3\u8868\u7EDF\u8BA1\u914D\u989D\u8FBE\u6210", description: "\u6765\u81EA\u9884\u6D4B\u5FEB\u7167\u7684\u5404\u9500\u552E\u4EE3\u8868\u672C\u5B63\u5EA6\u914D\u989D\u3001\u5DF2\u6210\u4EA4\u6536\u5165\u4E0E\u8FBE\u6210\u7387" }, - pipeline_stage_by_source: { title: "\u9636\u6BB5 \xD7 \u7EBF\u7D22\u6765\u6E90", description: "\u6309\u9636\u6BB5\u548C\u6765\u6E90\u4EA4\u53C9\u7EDF\u8BA1\u8FDB\u884C\u4E2D\u5546\u673A\u91D1\u989D" }, - win_rate_12m: { title: "\u8D62\u7387\uFF08\u8FD1 12 \u4E2A\u6708\uFF09", description: "\u8FD1 12 \u4E2A\u6708\u5DF2\u7ED3\u5355\u5546\u673A\u4E2D\u8D62\u5355\u6240\u5360\u7684\u6BD4\u4F8B" }, - won_deals_12m: { title: "\u8D62\u5355\u6570\uFF08\u8FD1 12 \u4E2A\u6708\uFF09", description: "\u8D62\u7387\u7684\u5206\u5B50" }, - lost_deals_12m: { title: "\u4E22\u5355\u6570\uFF08\u8FD1 12 \u4E2A\u6708\uFF09", description: "\u8D62\u7387\u5206\u6BCD\u7684\u53E6\u4E00\u534A" }, - win_rate_by_owner: { title: "\u6309\u9500\u552E\u4EE3\u8868\u7EDF\u8BA1\u8D62/\u4E22\u5355", description: "\u8FD1 12 \u4E2A\u6708\u5404\u9500\u552E\u4EE3\u8868\u7684\u8D62\u5355\u6570\u3001\u4E22\u5355\u6570\u4E0E\u8D62\u7387" }, - win_rate_by_lead_source: { title: "\u6309\u7EBF\u7D22\u6765\u6E90\u7EDF\u8BA1\u8D62/\u4E22\u5355", description: "\u8FD1 12 \u4E2A\u6708\u54EA\u4E9B\u6765\u6E90\u5E26\u6765\u7684\u5546\u673A\u771F\u6B63\u6210\u4EA4" }, - loss_reason_breakdown: { title: "\u4E22\u5355\u539F\u56E0\u5206\u6790", description: "\u8FD1 12 \u4E2A\u6708\u4E22\u5355\u6309\u539F\u56E0\u5206\u5E03" } - } - }, - service_dashboard: { - label: "\u5BA2\u6237\u670D\u52A1", - description: "\u5DE5\u5355\u8D1F\u8F7D\u3001SLA \u5065\u5EB7\u5EA6\u4E0E\u5904\u7406\u7EE9\u6548", - widgets: { - open_cases: { title: "\u672A\u5173\u95ED\u5DE5\u5355", description: "\u5C1A\u672A\u5173\u95ED\u7684\u5DE5\u5355" }, - critical_cases: { title: "\u4E25\u91CD\u5DE5\u5355", description: "\u6807\u8BB0\u4E3A\u4E25\u91CD\u4F18\u5148\u7EA7\u7684\u672A\u5173\u95ED\u5DE5\u5355" }, - avg_resolution_time: { title: "\u5E73\u5747\u89E3\u51B3\u65F6\u957F", description: "\u5173\u95ED\u5DE5\u5355\u7684\u5E73\u5747\u5904\u7406\u65F6\u957F\uFF08\u5C0F\u65F6\uFF09" }, - sla_violations: { title: "SLA \u8FDD\u7EA6", description: "\u5DF2\u8D85\u51FA SLA \u7684\u5DE5\u5355" }, - cases_by_status: { title: "\u6309\u72B6\u6001\u5206\u5E03", description: "\u5DE5\u5355\u5728\u5404\u5904\u7406\u9636\u6BB5\u7684\u5206\u5E03" }, - cases_by_priority: { title: "\u6309\u4F18\u5148\u7EA7\u5206\u5E03", description: "\u672A\u5173\u95ED\u5DE5\u5355\u6309\u7D27\u6025\u7A0B\u5EA6\u7684\u5206\u5E03" }, - cases_by_origin: { title: "\u6309\u6765\u6E90\u5206\u5E03", description: "\u5DE5\u5355\u7684\u6765\u6E90\u6E20\u9053" }, - daily_case_volume: { title: "\u6BCF\u65E5\u5DE5\u5355\u91CF", description: "\u8FC7\u53BB 30 \u5929\u7684\u65B0\u5EFA\u5DE5\u5355" }, - sla_compliance_gauge: { title: "SLA \u8FBE\u6210\u7387", description: "\u672C\u671F SLA \u5185\u89E3\u51B3\u5DE5\u5355\u7684\u5360\u6BD4" }, - kb_deflection_rate: { title: "\u77E5\u8BC6\u5E93\u8F6C\u79FB\u7387", description: "\u5DF2\u5173\u95ED\u5DE5\u5355\u4E2D\u7531\u77E5\u8BC6\u6587\u7AE0\u89E3\u51B3\u7684\u5360\u6BD4" }, - kb_resolved_cases: { title: "\u77E5\u8BC6\u5E93\u89E3\u51B3\u6570", description: "\u5DF2\u5173\u8054\u89E3\u51B3\u6587\u7AE0\u7684\u5DF2\u5173\u95ED\u5DE5\u5355" }, - closed_cases_total: { title: "\u5DF2\u5173\u95ED\u5DE5\u5355", description: "\u8F6C\u79FB\u7387\u7684\u5206\u6BCD" }, - top_resolving_articles: { title: "\u89E3\u51B3\u5DE5\u5355\u6700\u591A\u7684\u6587\u7AE0", description: "\u6309\u89E3\u51B3\u7684\u5DF2\u5173\u95ED\u5DE5\u5355\u6570\u6392\u540D\u7684\u77E5\u8BC6\u6587\u7AE0" }, - my_open_cases_by_priority: { title: "\u6211\u7684\u672A\u5173\u95ED\u5DE5\u5355\uFF08\u6309\u4F18\u5148\u7EA7\uFF09", description: "\u4F60\u7684\u672A\u5173\u95ED\u5DE5\u5355\u53CA\u5176 SLA \u8FDD\u7EA6\u7387\uFF0C\u6309\u4F18\u5148\u7EA7\u7EC6\u5206" } - } - } - }, - // `title` / `subtitle` translate the page's `page:header`; `title` falls back - // to `label` when omitted, so it is authored only where the two differ. - // Header strings carrying `{field}` tokens keep the token spelling verbatim — - // the console substitutes on the raw key, so a translated token resolves to - // nothing and the header renders blank. - datasets: { - account_metrics: { - label: "\u5BA2\u6237\u6307\u6807", - description: "\u6309\u884C\u4E1A\u4E0E\u7C7B\u578B\u7EDF\u8BA1\u5BA2\u6237\u6570\u91CF\u7684\u8BED\u4E49\u5C42", - dimensions: { - industry: { - label: "\u884C\u4E1A" - }, - type: { - label: "\u7C7B\u578B" - }, - created_at: { - label: "\u521B\u5EFA\u65F6\u95F4" - } - }, - measures: { - account_count: { - label: "\u5BA2\u6237\u6570" - }, - annual_revenue_sum: { - label: "\u5E74\u8425\u6536" - } - } - }, - case_metrics: { - label: "\u5DE5\u5355\u6307\u6807", - description: "\u7EDF\u8BA1\u5DE5\u5355\u6570\u91CF\u3001\u89E3\u51B3\u65F6\u957F\u4E0E SLA \u7684\u8BED\u4E49\u5C42", - dimensions: { - created_at: { - label: "\u521B\u5EFA\u65F6\u95F4" - }, - origin: { - label: "\u6765\u6E90" - }, - priority: { - label: "\u4F18\u5148\u7EA7" - }, - resolved_article: { - label: "\u89E3\u51B3\u7528\u77E5\u8BC6\u6587\u7AE0" - }, - status: { - label: "\u72B6\u6001" - }, - type: { - label: "\u7C7B\u578B" - } - }, - measures: { - avg_resolution: { - label: "\u5E73\u5747\u89E3\u51B3\u65F6\u957F\uFF08\u5C0F\u65F6\uFF09" - }, - avg_sla_violated: { - label: "SLA \u8FDD\u7EA6\u7387" - }, - case_count: { - label: "\u5DE5\u5355\u6570" - }, - closed_count: { - label: "\u5DF2\u5173\u95ED\u5DE5\u5355" - }, - kb_deflection_rate: { - label: "\u77E5\u8BC6\u5E93\u81EA\u52A9\u89E3\u51B3\u7387" - }, - kb_resolved_count: { - label: "\u77E5\u8BC6\u5E93\u89E3\u51B3\u6570" - }, - sla_compliance_rate: { - label: "SLA \u8FBE\u6807\u7387" - }, - sla_met_count: { - label: "SLA \u8FBE\u6807\u5DE5\u5355" - } - } - }, - contact_metrics: { - label: "\u8054\u7CFB\u4EBA\u6307\u6807", - description: "\u7EDF\u8BA1\u8054\u7CFB\u4EBA\u6570\u91CF\u7684\u8BED\u4E49\u5C42", - measures: { - contact_count: { - label: "\u8054\u7CFB\u4EBA\u6570" - } - } - }, - event_metrics: { - label: "\u6D3B\u52A8\u6307\u6807", - description: "\u7EDF\u8BA1\u4F1A\u8BAE\u3001\u901A\u8BDD\u4E0E\u4E92\u52A8\u65B0\u8FD1\u5EA6\u7684\u8BED\u4E49\u5C42", - dimensions: { - owner: { - label: "\u8D1F\u8D23\u4EBA" - }, - related_to_type: { - label: "\u5173\u8054\u5BF9\u8C61" - }, - start_datetime: { - label: "\u6D3B\u52A8\u5468" - }, - status: { - label: "\u72B6\u6001" - }, - type: { - label: "\u6D3B\u52A8\u7C7B\u578B" - } - }, - measures: { - avg_minutes: { - label: "\u5E73\u5747\u65F6\u957F" - }, - event_count: { - label: "\u6D3B\u52A8\u6570" - }, - total_minutes: { - label: "\u603B\u5206\u949F\u6570" - } - } - }, - forecast_metrics: { - label: "\u9500\u552E\u9884\u6D4B\u6307\u6807", - description: "\u6309\u8D1F\u8D23\u4EBA\u7EDF\u8BA1\u914D\u989D\u3001\u8FBE\u6210\u7387\u4E0E\u7BA1\u9053\u8986\u76D6\u500D\u6570\u7684\u8BED\u4E49\u5C42", - dimensions: { - owner: { - label: "\u8D1F\u8D23\u4EBA" - }, - period: { - label: "\u5468\u671F\u7C7B\u578B" - }, - period_label: { - label: "\u5468\u671F" - }, - period_start: { - label: "\u5468\u671F\u5F00\u59CB" - } - }, - measures: { - attainment: { - label: "\u8FBE\u6210\u7387" - }, - closed_sum: { - label: "\u5DF2\u6210\u4EA4" - }, - commit_sum: { - label: "\u627F\u8BFA" - }, - pipeline_sum: { - label: "\u9500\u552E\u7BA1\u9053" - }, - quota_sum: { - label: "\u914D\u989D" - } - } - }, - lead_metrics: { - label: "\u7EBF\u7D22\u6307\u6807", - description: "\u7EDF\u8BA1\u7EBF\u7D22\u6570\u91CF\u7684\u8BED\u4E49\u5C42", - dimensions: { - created_at: { - label: "\u521B\u5EFA\u65F6\u95F4" - }, - last_contacted_date: { - label: "\u6700\u8FD1\u8054\u7CFB" - }, - lead_source: { - label: "\u6765\u6E90" - }, - status: { - label: "\u72B6\u6001" - } - }, - measures: { - lead_count: { - label: "\u7EBF\u7D22\u6570" - } - } - }, - opportunity_metrics: { - label: "\u5546\u673A\u6307\u6807", - description: "\u7EDF\u8BA1\u9500\u552E\u7BA1\u9053\u6570\u91CF\u4E0E\u91D1\u989D\u7684\u8BED\u4E49\u5C42", - dimensions: { - account_industry: { - label: "\u5BA2\u6237\u884C\u4E1A" - }, - close_date: { - label: "\u9884\u8BA1\u6210\u4EA4\u65E5" - }, - close_quarter: { - label: "\u6210\u4EA4\u5B63\u5EA6" - }, - forecast_category: { - label: "\u9884\u6D4B\u7C7B\u522B" - }, - lead_source: { - label: "\u7EBF\u7D22\u6765\u6E90" - }, - loss_reason: { - label: "\u5931\u5355\u539F\u56E0" - }, - owner: { - label: "\u8D1F\u8D23\u4EBA" - }, - stage: { - label: "\u9636\u6BB5" - }, - type: { - label: "\u5546\u673A\u7C7B\u578B" - }, - win_reason: { - label: "\u8D62\u5355\u539F\u56E0" - } - }, - measures: { - avg_amount: { - label: "\u5E73\u5747\u5355\u7B14\u91D1\u989D" - }, - avg_probability: { - label: "\u5E73\u5747\u8D62\u5355\u6982\u7387" - }, - decided_count: { - label: "\u5DF2\u5B9A\u5C40\u5546\u673A" - }, - lost_amount: { - label: "\u5931\u5355\u91D1\u989D" - }, - lost_count: { - label: "\u5931\u5355\u6570" - }, - opp_count: { - label: "\u5546\u673A\u6570" - }, - total_amount: { - label: "\u603B\u91D1\u989D" - }, - win_rate: { - label: "\u8D62\u5355\u7387" - }, - won_amount: { - label: "\u8D62\u5355\u91D1\u989D" - }, - won_count: { - label: "\u8D62\u5355\u6570" - } - } - }, - product_metrics: { - label: "\u4EA7\u54C1\u6307\u6807", - description: "\u7EDF\u8BA1\u4EA7\u54C1\u76EE\u5F55\u6570\u91CF\u4E0E\u6807\u4EF7\u7684\u8BED\u4E49\u5C42", - dimensions: { - category: { - label: "\u7C7B\u522B" - } - }, - measures: { - list_price_sum: { - label: "\u6807\u4EF7\u5408\u8BA1" - }, - product_count: { - label: "\u4EA7\u54C1\u6570" - } - } - }, - task_metrics: { - label: "\u4EFB\u52A1\u6307\u6807", - description: "\u7EDF\u8BA1\u4EFB\u52A1\u5DE5\u4F5C\u91CF\u4E0E\u5B8C\u6210\u60C5\u51B5\u7684\u8BED\u4E49\u5C42", - dimensions: { - due_date: { - label: "\u622A\u6B62\u65E5\u671F" - }, - is_completed: { - label: "\u5DF2\u5B8C\u6210" - }, - is_overdue: { - label: "\u5DF2\u903E\u671F" - }, - priority: { - label: "\u4F18\u5148\u7EA7" - }, - priority_rank: { - label: "\u7D27\u6025\u5EA6" - }, - status: { - label: "\u72B6\u6001" - }, - type: { - label: "\u7C7B\u578B" - } - }, - measures: { - avg_progress: { - label: "\u5E73\u5747\u8FDB\u5EA6" - }, - task_count: { - label: "\u4EFB\u52A1\u6570" - } - } - } - }, - pages: { - account_detail_page: { - label: "\u5BA2\u6237\u8BE6\u60C5", - description: "\u63D2\u69FD\u5F0F\u5BA2\u6237\u8BB0\u5F55\u9875\u2014\u2014\u81EA\u5B9A\u4E49\u9875\u5934 + \u5E38\u9A7B\u8BA8\u8BBA\u533A\u3002", - title: "{name}", - subtitle: "{industry} \xB7 {type}", - components: { - account_chatter: { label: "\u8BA8\u8BBA" } - } - }, - account_workbench: { - label: "\u5BA2\u6237\u5DE5\u4F5C\u53F0", - description: "\u9762\u5411\u9500\u552E\u56E2\u961F\u7684\u7CBE\u9009\u5BA2\u6237\u5217\u8868\uFF1A\u4EC5\u63D0\u4F9B\u5FEB\u6377\u7B5B\u9009\uFF0C\u4E0D\u542B\u89C6\u56FE\u7BA1\u7406\u3002" - }, - app_launcher_page: { - label: "\u5E94\u7528\u4E2D\u5FC3", - description: "\u8BBF\u95EE\u5168\u90E8\u5E94\u7528\u7684\u7EDF\u4E00\u5165\u53E3", - subtitle: "\u9009\u62E9\u4E00\u4E2A\u5E94\u7528\u5F00\u59CB\u4F7F\u7528", - components: { - app_search: { label: "\u641C\u7D22\u5E94\u7528" }, - app_grid: { label: "\u5E94\u7528\u7F51\u683C" } - } - }, - case_detail_page: { - label: "\u5DE5\u5355\u8BE6\u60C5", - description: "\u5BA2\u670D\u5DE5\u5355\u8BB0\u5F55\u9875\uFF1A\u5173\u952E\u4FE1\u606F\u3001SLA \u8FDB\u5EA6\u3001\u660E\u7EC6\u4E0E\u6D3B\u52A8\u65F6\u95F4\u7EBF\u3002", - title: "{case_number} \xB7 {subject}", - subtitle: "{crm_account}", - components: { - case_highlights: { label: "\u5173\u952E\u4FE1\u606F" }, - case_status_path: { label: "\u5DE5\u5355\u72B6\u6001\u8FDB\u5EA6" }, - case_details: { label: "\u5DE5\u5355\u660E\u7EC6" } - } - }, - lead_detail_page: { - label: "\u7EBF\u7D22\u8BE6\u60C5", - description: "\u5B8C\u6574\u7684\u7EBF\u7D22\u8BE6\u60C5\u9875\uFF0C\u5305\u542B\u5173\u952E\u4FE1\u606F\u3001\u660E\u7EC6\u4E0E\u76F8\u5173\u8BB0\u5F55\u3002", - title: "{first_name} {last_name}", - subtitle: "{company}", - components: { - lead_duplicate_alert_confirmed: { label: "\u5DF2\u786E\u8BA4\u91CD\u590D\u63D0\u9192" }, - lead_duplicate_alert_suspected: { label: "\u7591\u4F3C\u91CD\u590D\u63D0\u9192" }, - lead_highlights: { label: "\u5173\u952E\u4FE1\u606F" }, - lead_path: { label: "\u7EBF\u7D22\u72B6\u6001\u8FDB\u5EA6" }, - main_tabs: { label: "\u7EBF\u7D22\u4FE1\u606F\u6807\u7B7E\u9875" }, - lead_details: { label: "\u7EBF\u7D22\u660E\u7EC6" }, - related_accordion: { label: "\u76F8\u5173\u8BB0\u5F55" }, - related_tasks: { title: "\u5F85\u529E\u4EFB\u52A1", label: "\u4EFB\u52A1" }, - lead_activity: { label: "\u6D3B\u52A8\u65F6\u95F4\u7EBF" }, - lead_history: { label: "\u5B57\u6BB5\u5386\u53F2" } - } - }, - opportunity_detail_page: { - label: "\u5546\u673A\u8BE6\u60C5", - description: "\u5B8C\u6574\u7684\u5546\u673A\u8BE6\u60C5\u9875\uFF0C\u5305\u542B\u9636\u6BB5\u8FDB\u5EA6\u3001\u5173\u952E\u4FE1\u606F\u3001\u660E\u7EC6\u4E0E\u76F8\u5173\u5217\u8868\u3002", - title: "{name}", - subtitle: "{crm_account}", - components: { - opp_highlights: { label: "\u5173\u952E\u4FE1\u606F" }, - opp_stage_path: { label: "\u5546\u673A\u9636\u6BB5\u8FDB\u5EA6" }, - opp_details: { label: "\u5546\u673A\u660E\u7EC6" } - } - }, - sales_home_page: { - label: "\u9500\u552E\u4E3B\u9875", - description: "\u9500\u552E\u56E2\u961F\u4E3B\u9875\uFF0C\u6C47\u603B\u5173\u952E\u6307\u6807\u4E0E\u5FEB\u6377\u64CD\u4F5C", - title: "\u9500\u552E\u770B\u677F", - subtitle: "\u6B22\u8FCE\u56DE\u6765", - components: { - kpi_revenue_won: { - label: "\u8D62\u5355\u8425\u6536" - }, - kpi_deals_won: { - label: "\u8D62\u5355\u6570" - }, - kpi_pipeline_value: { - label: "\u9500\u552E\u7BA1\u9053\u91D1\u989D" - }, - kpi_open_leads: { - label: "\u5F00\u653E\u7EBF\u7D22" - }, - home_upcoming_events: { - label: "\u{1F4C5} \u5373\u5C06\u5F00\u59CB \xB7 \u6700\u8FD1\u4F18\u5148" - }, - quick_create: { title: "\u5FEB\u901F\u521B\u5EFA", label: "\u5FEB\u901F\u521B\u5EFA" }, - key_metrics: { title: "\u5173\u952E\u7EE9\u6548\u6307\u6807", label: "\u5173\u952E\u6307\u6807" }, - home_tabs: { label: "\u4E3B\u9875\u6807\u7B7E\u9875" }, - home_my_leads: { label: "\u6211\u7684\u7EBF\u7D22" }, - home_my_deals: { label: "\u6211\u7684\u8FDB\u884C\u4E2D\u5546\u673A" }, - home_my_tasks: { label: "\u6211\u7684\u5F85\u529E\u4EFB\u52A1" }, - ai_briefing: { - title: "\u8BE2\u95EE AI \u52A9\u624B", - label: "AI \u52A9\u624B\u4ECA\u65E5\u901F\u89C8" - }, - upcoming_events: { title: "\u5373\u5C06\u5F00\u59CB\u7684\u6D3B\u52A8", label: "\u5373\u5C06\u5F00\u59CB\u7684\u6D3B\u52A8" } - } - }, - utility_bar_page: { - label: "\u5DE5\u5177\u680F", - description: "\u60AC\u6D6E\u5DE5\u5177\u7684\u5FEB\u6377\u8BBF\u95EE\u680F", - components: { - notifications_panel: { label: "\u901A\u77E5" }, - quick_notes: { title: "\u5FEB\u901F\u7B14\u8BB0", label: "\u5FEB\u901F\u7B14\u8BB0" }, - quick_search: { label: "\u5FEB\u901F\u641C\u7D22" } - } - } - }, - // Screen-flow copy (#1210, #1975). Keyed `flows..label`, - // `screens..title` and `screens..fields..{label,placeholder}` - // — the keys `os lint`'s `i18n/missing-flow` names, read by the console's - // flow runner since @objectstack 17.7.0 (the spec's `flows` liveness row is - // `live` there). A screen with no authored `title` shows its flow's label in - // every locale, so each `screen_1.title` repeats the flow label. Since - // 18.0.0-next.0 three more surfaces are keys the engine reads in the run's - // locale, and `i18n/missing-flow` names each missing one: a select field's - // `options.` (worded as the object field's own option in this pack), - // an authored screen `description`, and a refusing `end` node's - // `refusals..message`. A translated description or message is a text - // slot like the one it translates, so a hole in it is `{{ }}`. - // The discount ceiling is interpolated from `QUOTE_DISCOUNT_CEILING`, never - // retyped: the number lives in `_thresholds.ts` alone (#1711). - flows: { - campaign_enrollment: { - label: "\u5C06\u6210\u5458\u52A0\u5165\u8425\u9500\u6D3B\u52A8", - screens: { - screen_1: { - title: "\u5C06\u6210\u5458\u52A0\u5165\u8425\u9500\u6D3B\u52A8", - fields: { - memberSource: { label: "\u52A0\u5165\u7684\u6210\u5458\u7C7B\u578B", options: { leads: "\u7EBF\u7D22", contacts: "\u8054\u7CFB\u4EBA" } }, - leadStatus: { label: "\u52A0\u5165\u4EE5\u4E0B\u72B6\u6001\u7684\u7EBF\u7D22", options: { new: "\u65B0\u5EFA", contacted: "\u5DF2\u8054\u7CFB", qualified: "\u5DF2\u786E\u8BA4" } }, - contactDepartment: { - label: "\u52A0\u5165\u4EE5\u4E0B\u90E8\u95E8\u7684\u8054\u7CFB\u4EBA", - options: { executive: "\u7BA1\u7406\u5C42", sales: "\u9500\u552E\u90E8", marketing: "\u5E02\u573A\u90E8", engineering: "\u5DE5\u7A0B\u90E8", support: "\u652F\u6301\u90E8", finance: "\u8D22\u52A1\u90E8", hr: "\u4EBA\u529B\u8D44\u6E90", operations: "\u8FD0\u8425\u90E8" } - } - } - } - } - }, - escalate_case: { - label: "\u5347\u7EA7\u5DE5\u5355", - screens: { screen_1: { title: "\u5347\u7EA7\u5DE5\u5355", fields: { reason: { label: "\u5347\u7EA7\u539F\u56E0" } } } } - }, - close_case: { - label: "\u5173\u95ED\u5DE5\u5355", - screens: { - screen_1: { - title: "\u5173\u95ED\u5DE5\u5355", - fields: { - resolution: { label: "\u89E3\u51B3\u65B9\u6848" }, - resolved_by_article: { label: "\u901A\u8FC7\u77E5\u8BC6\u6587\u7AE0\u89E3\u51B3\uFF08\u53EF\u9009\uFF09" } - } - } - } - }, - claim_case: { - label: "\u8BA4\u9886\u5DE5\u5355", - screens: { - screen_1: { - title: "\u8BA4\u9886\u5DE5\u5355", - fields: { - claimStatus: { - label: "\u5904\u7406\u72B6\u6001", - options: { in_progress: "\u5904\u7406\u4E2D", waiting_customer: "\u7B49\u5F85\u5BA2\u6237\u56DE\u590D", waiting_support: "\u7B49\u5F85\u652F\u6301\u56DE\u590D" } - } - } - } - } - }, - lead_conversion: { - label: "\u7EBF\u7D22\u8F6C\u5316\u6D41\u7A0B", - screens: { - screen_1: { - title: "\u7EBF\u7D22\u8F6C\u5316\u6D41\u7A0B", - // The duplicate warning's text is a variable the flow assigns; this - // key can only carry the hole that shows it. - description: "{{duplicateWarning}}", - fields: { - createOpportunity: { label: "\u662F\u5426\u521B\u5EFA\u5546\u673A\uFF1F" }, - opportunityName: { label: "\u5546\u673A\u540D\u79F0" }, - opportunityAmount: { label: "\u5546\u673A\u91D1\u989D" }, - closeDate: { label: "\u9884\u8BA1\u6210\u4EA4\u65E5\u671F" } - } - }, - refuse_confirmed_duplicate: { - title: "\u8F6C\u5316\u88AB\u62D2\u7EDD", - description: "\u8BE5\u7EBF\u7D22\u7684\u300C\u91CD\u590D\u72B6\u6001\u300D\u4E3A\u300C\u5DF2\u786E\u8BA4\u91CD\u590D\u300D\uFF1A\u5BA1\u6838\u4EBA\u5DF2\u5C06\u5176\u4E0E\u73B0\u6709\u8BB0\u5F55\u6BD4\u5BF9\uFF0C\u5E76\u8BB0\u5F55\u4E3A\u91CD\u590D\u3002\u8F6C\u5316\u4F1A\u4E3A\u540C\u4E00\u4E70\u5BB6\u518D\u521B\u5EFA\u4E00\u4E2A\u5BA2\u6237\u3001\u8054\u7CFB\u4EBA\u548C\u5546\u673A\u3002\u672C\u7EBF\u7D22\u7684\u300C\u91CD\u590D\u7EBF\u7D22\u7BA1\u7406\u300D\u90E8\u5206\u5217\u51FA\u4E86\u4FDD\u7559\u7684\u8BB0\u5F55\uFF1B\u8BF7\u6539\u4E3A\u4EE5\u91CD\u590D\u4E3A\u7531\u5C06\u6B64\u7EBF\u7D22\u8BBE\u4E3A\u300C\u672A\u901A\u8FC7\u300D\u3002\u53EA\u6709\u5BA1\u6838\u4EBA\u4FEE\u6539\u8BE5\u7ED3\u8BBA\u540E\u624D\u80FD\u91CD\u65B0\u8F6C\u5316\u3002" - }, - refuse_unapproved: { - title: "\u8F6C\u5316\u88AB\u62D2\u7EDD", - description: "\u8BE5\u7EBF\u7D22\u5C1A\u672A\u83B7\u51C6\u8F6C\u5316\u3002\u5FC5\u987B\u7531\u5BA1\u6279\u4EBA\u6279\u51C6\u540E\uFF0C\u624D\u80FD\u8F6C\u5316\u4E3A\u5BA2\u6237\u3001\u8054\u7CFB\u4EBA\u548C\u5546\u673A\uFF1B\u7EBF\u7D22\u4E0A\u7684\u300C\u8F6C\u5316\u5BA1\u6279\u300D\u5B57\u6BB5\u663E\u793A\u8BE5\u51B3\u5B9A\u4ECD\u5728\u5F85\u5BA1\u6279\u8FD8\u662F\u5DF2\u88AB\u9A73\u56DE\u3002\u5728\u6B64\u671F\u95F4\u8BF7\u7EE7\u7EED\u8DDF\u8FDB\u8BE5\u7EBF\u7D22\u2014\u2014\u5B83\u7684\u4EFB\u4F55\u5185\u5BB9\u90FD\u6CA1\u6709\u88AB\u51BB\u7ED3\u3002" - }, - refuse_no_match_key: { - title: "\u8F6C\u5316\u88AB\u62D2\u7EDD", - description: "\u8BE5\u7EBF\u7D22\u7684\u516C\u53F8\u6CA1\u6709\u5339\u914D\u952E\uFF0C\u56E0\u6B64\u8F6C\u5316\u65E0\u6CD5\u5224\u65AD\u5B83\u5C5E\u4E8E\u54EA\u4E2A\u5BA2\u6237\uFF0C\u4E5F\u4E0D\u4F1A\u53BB\u731C\u6D4B\uFF1A\u731C\u6D4B\u53EF\u80FD\u4F1A\u628A\u8054\u7CFB\u4EBA\u548C\u5546\u673A\u5F52\u5230\u53E6\u4E00\u4E2A\u5BA2\u6237\u540D\u4E0B\u3002\u4FDD\u5B58\u7EBF\u7D22\u7684\u300C\u516C\u53F8\u300D\u4F1A\u91CD\u65B0\u751F\u6210\u5339\u914D\u952E\uFF0C\u8BF7\u91CD\u65B0\u4FDD\u5B58\u540E\u518D\u8F6C\u5316\u3002\u5C1A\u672A\u521B\u5EFA\u4EFB\u4F55\u8BB0\u5F55\u3002" - } - } - }, - schedule_followup: { - label: "\u5B89\u6392\u8DDF\u8FDB", - screens: { - screen_1: { - title: "\u5B89\u6392\u8DDF\u8FDB", - fields: { - subject: { label: "\u4E0B\u4E00\u6B65\u505A\u4EC0\u4E48\uFF1F" }, - dueDate: { label: "\u622A\u6B62\u65E5\u671F" }, - activityType: { - label: "\u6D3B\u52A8\u7C7B\u578B", - options: { call: "\u7535\u8BDD", email: "\u90AE\u4EF6", meeting: "\u4F1A\u8BAE", follow_up: "\u8DDF\u8FDB", demo: "\u6F14\u793A", other: "\u5176\u4ED6" } - }, - priority: { label: "\u4F18\u5148\u7EA7", options: { low: "\u4F4E", normal: "\u666E\u901A", high: "\u9AD8", urgent: "\u7D27\u6025" } }, - notes: { label: "\u5907\u6CE8" } - } - } - } - }, - quote_generation: { - label: "\u4ECE\u5546\u673A\u751F\u6210\u62A5\u4EF7\u5355", - refusals: { refuse_held: { message: "\u9700\u5148\u5B8C\u6210\u7ACB\u9879\u5BA1\u6279\uFF1A\u8BF7\u52FE\u9009\u300C\u7533\u8BF7\u7ACB\u9879\u5BA1\u6279\u300D\u3002\u5C1A\u672A\u521B\u5EFA\u4EFB\u4F55\u5185\u5BB9\u3002" } }, - screens: { - screen_1: { - title: "\u4ECE\u5546\u673A\u751F\u6210\u62A5\u4EF7\u5355", - fields: { - quoteName: { label: "\u62A5\u4EF7\u540D\u79F0" }, - expirationDays: { label: "\u6709\u6548\u671F\uFF08\u5929\uFF09" }, - discount: { label: `\u6298\u6263 % (\u2264 ${QUOTE_DISCOUNT_CEILING})`, placeholder: `0-${QUOTE_DISCOUNT_CEILING}` } - } - } - } - } - } -}; - -// src/sales/translations/zh-CN/_shared.ts -var activityActions2 = { - log_call: { - label: "\u8BB0\u5F55\u901A\u8BDD", - successMessage: "\u901A\u8BDD\u8BB0\u5F55\u6210\u529F\uFF01", - params: { - subject: { label: "\u901A\u8BDD\u4E3B\u9898" }, - duration: { label: "\u65F6\u957F\uFF08\u5206\u949F\uFF09" }, - attendee_contacts: { label: "\u8054\u7CFB\u4EBA\u53C2\u4E0E\u8005" }, - attendee_users: { label: "\u5185\u90E8\u53C2\u4E0E\u8005" }, - notes: { label: "\u901A\u8BDD\u8BB0\u5F55" } - } - }, - log_meeting: { - label: "\u8BB0\u5F55\u4F1A\u8BAE", - successMessage: "\u4F1A\u8BAE\u8BB0\u5F55\u6210\u529F\uFF01", - params: { - subject: { label: "\u4F1A\u8BAE\u4E3B\u9898" }, - duration: { label: "\u65F6\u957F\uFF08\u5206\u949F\uFF09" }, - attendee_contacts: { label: "\u8054\u7CFB\u4EBA\u53C2\u4F1A\u4EBA" }, - attendee_users: { label: "\u5185\u90E8\u53C2\u4F1A\u4EBA" }, - notes: { label: "\u4F1A\u8BAE\u7EAA\u8981" } - } - }, - schedule_meeting: { - label: "\u5B89\u6392\u4F1A\u8BAE", - successMessage: "\u4F1A\u8BAE\u5DF2\u5B89\u6392\uFF01", - params: { - subject: { label: "\u4F1A\u8BAE\u4E3B\u9898" }, - start_date: { label: "\u5F00\u59CB\u65E5\u671F\uFF08UTC\uFF09" }, - start_time: { label: "\u5F00\u59CB\u65F6\u95F4\uFF08UTC\uFF09" }, - location: { label: "\u5730\u70B9" }, - duration: { label: "\u65F6\u957F\uFF08\u5206\u949F\uFF09" }, - attendee_contacts: { label: "\u8054\u7CFB\u4EBA\u53C2\u4F1A\u4EBA" }, - attendee_users: { label: "\u5185\u90E8\u53C2\u4F1A\u4EBA" }, - notes: { label: "\u4F1A\u8BAE\u8BAE\u7A0B" } - } - } -}; - -// src/sales/translations/zh-CN/objects.customer.ts -var customer2 = { - crm_account: { - label: "\u5BA2\u6237", - pluralLabel: "\u5BA2\u6237", - description: "\u4E0E\u6211\u4EEC\u6709\u4E1A\u52A1\u5F80\u6765\u7684\u516C\u53F8\u548C\u7EC4\u7EC7", - fields: { - account_number: { label: "\u5BA2\u6237\u7F16\u53F7" }, - registration_number: { - label: "\u767B\u8BB0\u8BC1\u4EF6\u53F7", - help: "\u5BF9\u65B9\u5728\u5176\u6240\u5C5E\u653F\u5E9C\u767B\u8BB0\u673A\u5173\u53D6\u5F97\u7684\u767B\u8BB0\u6807\u8BC6\u3002\u4E0D\u540C\u4E8E\u7531\u6211\u65B9\u53D1\u653E\u7684\u5BA2\u6237\u7F16\u53F7\u3002" - }, - commercial_capability: { - label: "\u5546\u52A1\u80FD\u529B", - help: "\u8BE5\u5BA2\u6237\u662F\u5426\u53EF\u4EE5\u627F\u63A5\u65B0\u4E1A\u52A1\u3002\u4EC5\u7ED3\u7B97\u7C7B\u5BA2\u6237\u4F9D\u7136\u53EF\u7528\u4E8E\u5F00\u7968\u4E0E\u6536\u4ED8\u6B3E\uFF0C\u4F46\u4E0D\u80FD\u5173\u8054\u65B0\u7684\u5546\u673A\u3002", - options: { full: "\u5B8C\u6574", settlement_only: "\u4EC5\u7ED3\u7B97" } - }, - incumbent_vendor: { label: "\u73B0\u6709\u4F9B\u5E94\u5546", help: "\u5F53\u524D\u627F\u63A5\u8BE5\u5BA2\u6237\u8FD9\u90E8\u5206\u652F\u51FA\u7684\u4F9B\u5E94\u5546\u3002" }, - annual_purchasing_budget: { label: "\u5E74\u5EA6\u91C7\u8D2D\u9884\u7B97", help: "\u8BE5\u5BA2\u6237\u672C\u5E74\u5EA6\u9884\u8BA1\u5411\u4F9B\u5E94\u5546\u652F\u51FA\u7684\u91D1\u989D\uFF0C\u800C\u975E\u5176\u81EA\u8EAB\u8425\u6536\u3002" }, - payment_cycle: { - label: "\u4ED8\u6B3E\u5468\u671F", - options: { prepaid: "\u9884\u4ED8", net_30: "30 \u5929", net_60: "60 \u5929", net_90: "90 \u5929" } - }, - approval_status: { - label: "\u5BA1\u6279\u72B6\u6001", - help: "\u8BE5\u5BA2\u6237\u7684\u5BA1\u6279\u8FDB\u5C55\u3002\u65B0\u5EFA\u5BA2\u6237\u521D\u59CB\u4E3A\u5F85\u5BA1\u6279\uFF0C\u5E76\u5728\u5BA1\u6279\u6536\u4EF6\u7BB1\u4E2D\u88C1\u5B9A\u3002", - options: { pending: "\u5F85\u5BA1\u6279", approved: "\u5DF2\u901A\u8FC7", rejected: "\u5DF2\u9A73\u56DE" } - }, - name: { label: "\u5BA2\u6237\u540D\u79F0", help: "\u516C\u53F8\u6216\u7EC4\u7EC7\u7684\u6CD5\u5B9A\u540D\u79F0" }, - type: { - label: "\u7C7B\u578B", - options: { prospect: "\u6F5C\u5728\u5BA2\u6237", customer: "\u6B63\u5F0F\u5BA2\u6237", partner: "\u5408\u4F5C\u4F19\u4F34", former: "\u524D\u5BA2\u6237" } - }, - industry: { - label: "\u884C\u4E1A", - options: { - technology: "\u79D1\u6280", - software: "\u8F6F\u4EF6 / SaaS", - finance: "\u91D1\u878D", - healthcare: "\u533B\u7597", - retail: "\u96F6\u552E", - manufacturing: "\u5236\u9020", - education: "\u6559\u80B2", - real_estate: "\u623F\u5730\u4EA7", - media: "\u4F20\u5A92\u5A31\u4E50", - logistics: "\u7269\u6D41", - hospitality: "\u9152\u5E97\u65C5\u6E38", - energy: "\u80FD\u6E90\u516C\u7528\u4E8B\u4E1A", - government: "\u653F\u5E9C", - nonprofit: "\u975E\u8425\u5229", - other: "\u5176\u4ED6" - } - }, - annual_revenue: { label: "\u5E74\u8425\u6536" }, - child_account_revenue: { label: "\u5B50\u516C\u53F8\u5E74\u8425\u6536\u5408\u8BA1", help: "\u672C\u5BA2\u6237\u76F4\u5C5E\u5B50\u516C\u53F8\u7684\u5E74\u8425\u6536\u5408\u8BA1\u3002" }, - number_of_employees: { label: "\u5458\u5DE5\u4EBA\u6570" }, - phone: { label: "\u7535\u8BDD" }, - website: { label: "\u7F51\u7AD9" }, - billing_address: { label: "\u8D26\u5355\u5730\u5740" }, - billing_country: { - label: "\u8D26\u5355\u56FD\u5BB6", - help: "\u7531\u8D26\u5355\u5730\u5740\u63A8\u5BFC\u2014\u2014\u6309\u5F55\u5165\u539F\u6837\u53BB\u9664\u9996\u5C3E\u7A7A\u683C\u5E76\u8F6C\u4E3A\u5927\u5199\u3002" - }, - territory: { - label: "\u9500\u552E\u533A\u57DF", - help: "\u7531\u8D26\u5355\u5730\u5740\u63A8\u5BFC\u2014\u2014\u533A\u57DF\u5171\u4EAB\u89C4\u5219\u636E\u6B64\u5339\u914D\u3002\u4E0D\u5C5E\u4E8E\u5DF2\u914D\u7F6E\u533A\u57DF\u7684\u5BA2\u6237\u4E3A\u201C\u5176\u4ED6\u201D\u3002", - options: { na: "\u5317\u7F8E", emea: "\u6B27\u6D32\u3001\u4E2D\u4E1C\u4E0E\u975E\u6D32", other: "\u5176\u4ED6" } - }, - office_location: { label: "\u529E\u516C\u5730\u70B9" }, - owner_id: { label: "\u5BA2\u6237\u8D1F\u8D23\u4EBA" }, - parent_account: { label: "\u6BCD\u516C\u53F8", help: "\u5C42\u7EA7\u7ED3\u6784\u4E2D\u7684\u6BCD\u516C\u53F8" }, - description: { label: "\u63CF\u8FF0" }, - is_active: { label: "\u662F\u5426\u6D3B\u8DC3" }, - last_activity_date: { label: "\u6700\u8FD1\u6D3B\u52A8\u65E5\u671F" }, - brand_color: { label: "\u54C1\u724C\u8272" }, - logo: { label: "\u516C\u53F8\u6807\u8BC6" }, - tier: { - label: "\u5BA2\u6237\u5206\u5C42", - options: { strategic: "\u6218\u7565\u5BA2\u6237", enterprise: "\u4F01\u4E1A\u5BA2\u6237", mid_market: "\u4E2D\u578B\u5BA2\u6237", smb: "\u4E2D\u5C0F\u5BA2\u6237" } - }, - segment: { - label: "\u5BA2\u6237\u7EC6\u5206", - options: { net_new: "\u5168\u65B0\u5BA2\u6237", growth: "\u589E\u957F\u5BA2\u6237", at_risk: "\u98CE\u9669\u5BA2\u6237", stable: "\u7A33\u5B9A\u5BA2\u6237" } - }, - health_score: { - label: "\u5065\u5EB7\u5EA6", - help: "\u5BA2\u6237\u6210\u529F\u7ECF\u7406\u7EF4\u62A4\u7684\u5065\u5EB7\u5EA6\u6307\u6807", - options: { healthy: "\u5065\u5EB7", watching: "\u5173\u6CE8", at_risk: "\u98CE\u9669", churning: "\u6D41\u5931\u4E2D" } - }, - name_normalized: { label: "\u5BA2\u6237\u540D\u79F0\uFF08\u89C4\u8303\u5316\uFF09", help: "\u7EBF\u7D22\u8F6C\u5316\u7684\u5339\u914D\u952E\uFF1A\u5BA2\u6237\u540D\u79F0\u8F6C\u5C0F\u5199\u3001\u53BB\u9664\u9996\u5C3E\u7A7A\u683C\u3001\u5185\u90E8\u8FDE\u7EED\u7A7A\u767D\u5408\u5E76\u4E3A\u4E00\u4E2A\u7A7A\u683C\u3002\u7531 account_protection \u94A9\u5B50\u7EF4\u62A4\u2014\u2014\u8BF7\u52FF\u76F4\u63A5\u7F16\u8F91\u3002" }, - display_title: { label: "\u663E\u793A\u540D\u79F0" } - }, - _views: { - all_accounts: { - label: "\u5168\u90E8\u5BA2\u6237", - description: "\u5BA2\u6237\u4E3B\u5217\u8868\uFF0C\u5305\u542B\u8425\u6536\u4E0E\u884C\u4E1A\u6458\u8981", - bulkActions: { - delete: { - label: "\u5220\u9664", - confirmLabel: "\u5220\u9664", - confirmText: "\u786E\u5B9A\u8981\u6C38\u4E45\u5220\u9664 {{count}} \u4E2A\u5BA2\u6237\u5417\uFF1F\u6B64\u64CD\u4F5C\u65E0\u6CD5\u64A4\u9500\u3002" - }, - transfer_owner: { - label: "\u8F6C\u79FB\u8D1F\u8D23\u4EBA", - confirmText: "\u786E\u5B9A\u8981\u8F6C\u79FB {{count}} \u4E2A\u5BA2\u6237\u7684\u8D1F\u8D23\u4EBA\u5417\uFF1F", - params: { - owner_id: { - label: "\u65B0\u8D1F\u8D23\u4EBA" - } - } - }, - update_tier: { - label: "\u66F4\u65B0\u5BA2\u6237\u7B49\u7EA7", - confirmText: "\u786E\u5B9A\u8981\u5C06 {{count}} \u4E2A\u5BA2\u6237\u7684\u7B49\u7EA7\u66F4\u65B0\u4E3A {{tier}} \u5417\uFF1F", - params: { - tier: { - label: "\u5BA2\u6237\u7B49\u7EA7" - } - } - } - } - }, - account_gallery: { label: "\u5BA2\u6237\u5361\u7247", description: "\u4F7F\u7528\u54C1\u724C\u8272\u9AD8\u4EAE\u7684\u5BA2\u6237\u5361\u7247\u89C6\u56FE" }, - account_map: { label: "\u5BA2\u6237\u5730\u56FE", description: "\u5BA2\u6237\u7684\u5730\u7406\u5206\u5E03" }, - enterprise_accounts: { label: "\u4F01\u4E1A\u5BA2\u6237", description: "\u5E74\u8425\u6536\u6700\u9AD8\u7684\u5927\u5BA2\u6237" }, - my_accounts: { label: "\u6211\u7684\u5BA2\u6237", description: "\u7531\u5F53\u524D\u7528\u6237\u8D1F\u8D23\u7684\u5BA2\u6237" }, - at_risk_accounts: { label: "\u26A0\uFE0F \u98CE\u9669\u5BA2\u6237" } - }, - _sections: { - basic: { label: "\u57FA\u672C\u4FE1\u606F" }, - financials: { label: "\u8D22\u52A1\u4FE1\u606F" }, - business_profile: { label: "\u4E1A\u52A1\u4FE1\u606F" }, - contact_info: { label: "\u8054\u7CFB\u4FE1\u606F" }, - ownership: { label: "\u5F52\u5C5E\u4E0E\u72B6\u6001" }, - branding: { label: "\u54C1\u724C" }, - system: { label: "\u7CFB\u7EDF" }, - // account.view.ts 表单区块名称 (#1100) - profile: { label: "\u8D44\u6599" }, - customer_success: { label: "\u5BA2\u6237\u6210\u529F" }, - locations: { label: "\u5730\u5740\u4FE1\u606F" }, - description: { label: "\u63CF\u8FF0" } - }, - _actions: { ...activityActions2 } - }, - crm_contact: { - label: "\u8054\u7CFB\u4EBA", - pluralLabel: "\u8054\u7CFB\u4EBA", - description: "\u5BA2\u6237\u4E0E\u5546\u673A\u7684\u5173\u952E\u4EBA\u7269\u8054\u7CFB\u4EBA", - fields: { - salutation: { - label: "\u79F0\u8C13", - options: { mr: "\u5148\u751F", ms: "\u5973\u58EB", mrs: "\u592B\u4EBA", dr: "\u535A\u58EB", prof: "\u6559\u6388" } - }, - first_name: { label: "\u540D" }, - last_name: { label: "\u59D3" }, - full_name: { label: "\u5168\u540D" }, - crm_account: { label: "\u6240\u5C5E\u5BA2\u6237" }, - email: { label: "\u90AE\u7BB1" }, - phone: { label: "\u7535\u8BDD" }, - mobile: { label: "\u624B\u673A" }, - title: { label: "\u804C\u4F4D" }, - department: { - label: "\u90E8\u95E8", - options: { - executive: "\u7BA1\u7406\u5C42", - sales: "\u9500\u552E\u90E8", - marketing: "\u5E02\u573A\u90E8", - engineering: "\u5DE5\u7A0B\u90E8", - support: "\u652F\u6301\u90E8", - finance: "\u8D22\u52A1\u90E8", - hr: "\u4EBA\u529B\u8D44\u6E90", - operations: "\u8FD0\u8425\u90E8" - } - }, - // 采购决策圈 (REQ-0004)。英文标签是 'Buying Function' 而非 'Buying Role': - // 平台的 security-role-word 规则在对象声明上保留了英文 role 一词(ADR-0090 D3)。 - // 该规则只匹配英文,不读语言包,所以中文这里用本地读者真正在说的词。 - buying_function: { - label: "\u91C7\u8D2D\u89D2\u8272", - options: { - decision_maker: "\u51B3\u7B56\u8005", - economic_buyer: "\u9884\u7B97\u51B3\u7B56\u4EBA", - technical_evaluator: "\u6280\u672F\u8BC4\u4F30\u4EBA", - user: "\u4F7F\u7528\u8005", - influencer: "\u5F71\u54CD\u8005", - gatekeeper: "\u5B88\u95E8\u4EBA" - } - }, - attitude: { - label: "\u5BF9\u6211\u53F8\u6001\u5EA6", - options: { - champion: "\u62E5\u62A4\u8005", - supportive: "\u652F\u6301", - neutral: "\u4E2D\u7ACB", - skeptical: "\u5B58\u7591", - blocker: "\u53CD\u5BF9\u8005" - } - }, - relationship_strength: { - label: "\u4E0E\u9500\u552E\u5173\u7CFB\u5F3A\u5EA6", - options: { - distant: "\u758F\u8FDC", - acquaintance: "\u4E00\u822C\u8BA4\u8BC6", - working: "\u5DE5\u4F5C\u5F80\u6765", - strong: "\u5173\u7CFB\u7D27\u5BC6", - trusted_advisor: "\u53EF\u4FE1\u987E\u95EE" - } - }, - owner_id: { label: "\u8054\u7CFB\u4EBA\u8D1F\u8D23\u4EBA" }, - description: { label: "\u63CF\u8FF0" }, - is_primary: { label: "\u4E3B\u8981\u8054\u7CFB\u4EBA", help: "\u662F\u5426\u4E3A\u8BE5\u5BA2\u6237\u7684\u4E3B\u8981\u8054\u7CFB\u4EBA\uFF1F" }, - mailing_address: { label: "\u90AE\u5BC4\u5730\u5740" }, - lead_source: { - label: "\u7EBF\u7D22\u6765\u6E90", - options: { - web: "\u7F51\u7AD9", - referral: "\u63A8\u8350", - event: "\u6D3B\u52A8 / \u5C55\u4F1A", - webinar: "\u7EBF\u4E0A\u7814\u8BA8\u4F1A", - partner: "\u5408\u4F5C\u4F19\u4F34", - advertisement: "\u5E7F\u544A", - paid_search: "\u4ED8\u8D39\u641C\u7D22", - social: "\u793E\u4EA4\u5A92\u4F53", - content: "\u5185\u5BB9 / \u535A\u5BA2", - cold_call: "\u964C\u751F\u62DC\u8BBF", - email_campaign: "\u90AE\u4EF6\u8425\u9500", - other: "\u5176\u4ED6" - } - }, - do_not_call: { label: "\u7981\u6B62\u81F4\u7535" }, - email_opt_out: { label: "\u62D2\u7EDD\u90AE\u4EF6" }, - last_contacted_date: { label: "\u6700\u8FD1\u8054\u7CFB\u65F6\u95F4" }, - avatar: { label: "\u5934\u50CF" } - }, - _views: { - all_contacts: { label: "\u5168\u90E8\u8054\u7CFB\u4EBA" }, - contact_directory: { label: "\u8054\u7CFB\u4EBA\u76EE\u5F55" }, - primary_contacts: { label: "\u4E3B\u8981\u8054\u7CFB\u4EBA" } - }, - _actions: { - ...activityActions2, - mark_primary: { - label: "\u8BBE\u4E3A\u4E3B\u8981\u8054\u7CFB\u4EBA", - confirmText: "\u662F\u5426\u5C06\u6B64\u8054\u7CFB\u4EBA\u8BBE\u4E3A\u8BE5\u5BA2\u6237\u7684\u4E3B\u8981\u8054\u7CFB\u4EBA\uFF1F", - successMessage: "\u5DF2\u8BBE\u4E3A\u4E3B\u8981\u8054\u7CFB\u4EBA\uFF01" - }, - send_email: { - label: "\u53D1\u9001\u90AE\u4EF6", - params: { - subject: { label: "\u4E3B\u9898" }, - body: { label: "\u6B63\u6587" } - } - }, - add_contact_to_campaign: { - label: "\u52A0\u5165\u8425\u9500\u6D3B\u52A8", - successMessage: "\u8054\u7CFB\u4EBA\u5DF2\u52A0\u5165\u8425\u9500\u6D3B\u52A8\uFF01", - params: { - crm_campaign: { label: "\u8425\u9500\u6D3B\u52A8" } - } - } - }, - _sections: { - identity: { label: "\u8EAB\u4EFD\u4FE1\u606F" }, - account_info: { label: "\u5BA2\u6237\u4E0E\u804C\u52A1" }, - buying_centre: { label: "\u91C7\u8D2D\u51B3\u7B56\u5708" }, - contact_info: { label: "\u8054\u7CFB\u65B9\u5F0F" }, - mailing_address: { label: "\u90AE\u5BC4\u5730\u5740" }, - additional: { label: "\u9644\u52A0\u4FE1\u606F" }, - preferences: { label: "\u6C9F\u901A\u504F\u597D" }, - // contact.view.ts 表单区块名称 (#1100) - contact_details: { label: "\u8054\u7CFB\u4FE1\u606F" }, - comm_preferences: { label: "\u504F\u597D\u8BBE\u7F6E" } - } - } -}; - -// src/sales/translations/zh-CN/objects.pipeline.ts -var pipeline2 = { - crm_lead: { - _validations: { - disqualification_reason_required: { - message: "\u7EBF\u7D22\u6807\u8BB0\u4E3A\u4E0D\u5408\u683C\u65F6\u5FC5\u987B\u586B\u5199\u53D6\u6D88\u8D44\u683C\u539F\u56E0" - }, - duplicate_disqualification_requires_survivor: { - message: "\u4EE5\u91CD\u590D\u4E3A\u7531\u53D6\u6D88\u7EBF\u7D22\u8D44\u683C\u65F6\uFF0C\u5FC5\u987B\u6307\u660E\u4FDD\u7559\u7684\u8BB0\u5F55\u5E76\u5C06\u91CD\u590D\u72B6\u6001\u8BBE\u4E3A\u5DF2\u786E\u8BA4" - }, - email_required: { - message: "\u7535\u5B50\u90AE\u4EF6\u4E3A\u5FC5\u586B\u9879" - }, - lead_status_progression: { - message: "\u65E0\u6548\u7684\u7EBF\u7D22\u72B6\u6001\u6D41\u8F6C" - } - }, - label: "\u7EBF\u7D22", - pluralLabel: "\u7EBF\u7D22", - description: "\u5C1A\u672A\u786E\u8BA4\u7684\u6F5C\u5728\u5BA2\u6237", - fields: { - salutation: { - label: "\u79F0\u8C13", - options: { mr: "\u5148\u751F", ms: "\u5973\u58EB", mrs: "\u592B\u4EBA", dr: "\u535A\u58EB", prof: "\u6559\u6388" } - }, - first_name: { label: "\u540D" }, - last_name: { label: "\u59D3" }, - full_name: { label: "\u5168\u540D" }, - company: { label: "\u516C\u53F8" }, - title: { label: "\u804C\u4F4D" }, - email: { label: "\u90AE\u7BB1" }, - phone: { label: "\u7535\u8BDD" }, - industry: { - label: "\u884C\u4E1A", - options: { - technology: "\u79D1\u6280", - software: "\u8F6F\u4EF6 / SaaS", - finance: "\u91D1\u878D", - healthcare: "\u533B\u7597", - retail: "\u96F6\u552E", - manufacturing: "\u5236\u9020", - education: "\u6559\u80B2", - real_estate: "\u623F\u5730\u4EA7", - media: "\u4F20\u5A92\u5A31\u4E50", - logistics: "\u7269\u6D41", - hospitality: "\u9152\u5E97\u65C5\u6E38", - energy: "\u80FD\u6E90\u516C\u7528\u4E8B\u4E1A", - government: "\u653F\u5E9C", - nonprofit: "\u975E\u8425\u5229", - other: "\u5176\u4ED6" - } - }, - status: { - label: "\u72B6\u6001", - options: { - // 已确认 / 未通过 是同一个动作(线索确认)的正反两面;原先的 - // 已确认 / 不合格 出自两套说法,在状态条上并排时读起来不成对。 - new: "\u65B0\u5EFA", - contacted: "\u5DF2\u8054\u7CFB", - qualified: "\u5DF2\u786E\u8BA4", - unqualified: "\u672A\u901A\u8FC7", - converted: "\u5DF2\u8F6C\u5316" - } - }, - lead_source: { - label: "\u7EBF\u7D22\u6765\u6E90", - options: { - web: "\u7F51\u7AD9", - referral: "\u63A8\u8350", - event: "\u6D3B\u52A8 / \u5C55\u4F1A", - webinar: "\u7EBF\u4E0A\u7814\u8BA8\u4F1A", - partner: "\u5408\u4F5C\u4F19\u4F34", - advertisement: "\u5E7F\u544A", - paid_search: "\u4ED8\u8D39\u641C\u7D22", - social: "\u793E\u4EA4\u5A92\u4F53", - content: "\u5185\u5BB9 / \u535A\u5BA2", - cold_call: "\u964C\u751F\u62DC\u8BBF", - email_campaign: "\u90AE\u4EF6\u8425\u9500", - other: "\u5176\u4ED6" - } - }, - owner_id: { label: "\u7EBF\u7D22\u8D1F\u8D23\u4EBA" }, - is_converted: { label: "\u5DF2\u8F6C\u5316" }, - description: { label: "\u63CF\u8FF0" }, - mobile: { label: "\u624B\u673A" }, - website: { label: "\u7F51\u7AD9" }, - rating: { label: "\u7EBF\u7D22\u8BC4\u5206", help: "\u7EBF\u7D22\u8D28\u91CF\u8BC4\u5206\uFF081-5 \u661F\uFF09" }, - converted_account: { label: "\u8F6C\u5316\u5BA2\u6237" }, - converted_contact: { label: "\u8F6C\u5316\u8054\u7CFB\u4EBA" }, - converted_opportunity: { label: "\u8F6C\u5316\u5546\u673A" }, - converted_date: { label: "\u8F6C\u5316\u65E5\u671F" }, - address: { label: "\u5730\u5740" }, - annual_revenue: { label: "\u5E74\u8425\u6536" }, - number_of_employees: { label: "\u5458\u5DE5\u4EBA\u6570" }, - notes: { label: "\u5907\u6CE8", help: "\u672C\u7EBF\u7D22\u7684\u5DE5\u4F5C\u5907\u6CE8\u2014\u2014\u652F\u6301\u683C\u5F0F\u6392\u7248\u3002" }, - do_not_call: { label: "\u7981\u6B62\u81F4\u7535" }, - email_opt_out: { label: "\u62D2\u6536\u90AE\u4EF6" }, - disqualification_reason: { - // 状态里的 unqualified 译作「未通过」,所以这里跟着叫「未通过原因」 - // 而不是「取消资格原因」—— 两个字段在同一张表单上下相邻,用词必须成对。 - label: "\u672A\u901A\u8FC7\u539F\u56E0", - help: "\u72B6\u6001\u4E3A\u300C\u672A\u901A\u8FC7\u300D\u65F6\u5FC5\u586B", - options: { - not_a_fit: "\u9700\u6C42\u4E0D\u5339\u914D", - no_budget: "\u9884\u7B97\u4E0D\u8DB3", - wrong_persona: "\u8054\u7CFB\u4EBA\u89D2\u8272\u4E0D\u7B26", - unreachable: "\u65E0\u6CD5\u8054\u7CFB", - duplicate: "\u91CD\u590D\u7EBF\u7D22", - competitor: "\u9009\u62E9\u4E86\u7ADE\u4E89\u5BF9\u624B", - other: "\u5176\u4ED6" - } - }, - duplicate_of_type: { - help: "\u4FDD\u7559\u4E0B\u6765\u7684\u90A3\u6761\u8BB0\u5F55\u6240\u5C5E\u7684\u5BF9\u8C61\u7C7B\u578B\u3002", - label: "\u91CD\u590D\u4E8E", - // `erased` 是墓碑值,不是可选项:表单不提供它(见 - // `src/sales/views/lead.view.ts`),但幸存记录被删除后线索会带着它, - // 所以凡是读取记录的地方都需要标签,否则会显示原始值 `erased`。 - options: { crm_lead: "\u7EBF\u7D22", crm_contact: "\u8054\u7CFB\u4EBA", erased: "\u8BB0\u5F55\u5DF2\u5220\u9664" } - }, - duplicate_of_lead: { label: "\u91CD\u590D\u7684\u7EBF\u7D22" }, - duplicate_of_contact: { label: "\u91CD\u590D\u7684\u8054\u7CFB\u4EBA" }, - duplicate_status: { - help: "\u7591\u4F3C = \u5F55\u5165\u65F6\u81EA\u52A8\u6807\u8BB0\uFF1B\u5DF2\u786E\u8BA4 = \u4EBA\u5DE5\u6838\u5B9E\u8FC7\u5339\u914D\u3002", - // 疑似 = 录入时自动标记;已确认 = 人工核对后的判定。两者是同一 - // 判断的两个阶段,所以共用一个字段而不是各占一套链接字段。 - label: "\u91CD\u590D\u72B6\u6001", - options: { suspected: "\u7591\u4F3C\u91CD\u590D", confirmed: "\u5DF2\u786E\u8BA4\u91CD\u590D" } - }, - display_title: { label: "\u663E\u793A\u540D\u79F0" }, - company_normalized: { label: "\u516C\u53F8\u540D\u79F0\uFF08\u89C4\u8303\u5316\uFF09", help: "\u7EBF\u7D22\u8F6C\u5316\u7684\u5339\u914D\u952E\uFF1A\u516C\u53F8\u540D\u79F0\u8F6C\u5C0F\u5199\u3001\u53BB\u9664\u9996\u5C3E\u7A7A\u683C\u3001\u5185\u90E8\u8FDE\u7EED\u7A7A\u767D\u5408\u5E76\u4E3A\u4E00\u4E2A\u7A7A\u683C\u3002\u7531 lead_duplicate_check \u94A9\u5B50\u7EF4\u62A4\u2014\u2014\u8BF7\u52FF\u76F4\u63A5\u7F16\u8F91\u3002" }, - next_followup_date: { label: "\u4E0B\u6B21\u8DDF\u8FDB\u65E5\u671F" }, - last_contacted_date: { label: "\u6700\u8FD1\u8054\u7CFB\u65F6\u95F4" }, - need_type: { - label: "\u9700\u6C42\u7C7B\u578B", - help: "\u5BA2\u6237\u60F3\u8981\u4EC0\u4E48\u3002\u7EBF\u7D22\u5206\u6D3E\u3001\u4F18\u5148\u7EA7\u6392\u5E8F\u548C\u9700\u6C42\u5206\u6790\u90FD\u8BFB\u8FD9\u4E2A\u5B57\u6BB5\u3002", - options: { - new_implementation: "\u65B0\u5EFA\u5B9E\u65BD", - expansion: "\u6269\u5BB9\u589E\u8D2D", - replacement: "\u66FF\u6362\u8FC1\u79FB", - renewal: "\u7EED\u7EA6", - consulting: "\u54A8\u8BE2\u670D\u52A1", - support: "\u8FD0\u7EF4\u652F\u6301", - other: "\u5176\u4ED6" - } - }, - estimated_amount: { - label: "\u9884\u8BA1\u91D1\u989D", - help: "\u8D44\u683C\u5224\u5B9A\u4E4B\u524D\u5BF9\u8BE5\u9700\u6C42\u91D1\u989D\u7684\u4F30\u7B97\u3002\u8F6C\u5316\u65F6\u7528\u4E8E\u9884\u586B\u5546\u673A\u91D1\u989D\u3002" - }, - conversion_approval_status: { - label: "\u8F6C\u5316\u5BA1\u6279", - help: "\u8BE5\u7EBF\u7D22\u662F\u5426\u5DF2\u83B7\u51C6\u8F6C\u5316\u3002\u300C\u65E0\u9700\u5BA1\u6279\u300D\u8868\u793A\u4E0D\u8D70\u5BA1\u6279\u6D41\u7A0B\u2014\u2014\u8FD9\u662F\u4EA7\u54C1\u7684\u51FA\u5382\u9ED8\u8BA4\u503C\u3002", - options: { - not_required: "\u65E0\u9700\u5BA1\u6279", - pending: "\u5F85\u5BA1\u6279", - approved: "\u5BA1\u6279\u901A\u8FC7", - rejected: "\u5BA1\u6279\u9A73\u56DE" - } - } - }, - _views: { - all_leads: { - label: "\u5168\u90E8\u7EBF\u7D22", - emptyState: { title: "\u8FD8\u6CA1\u6709\u7EBF\u7D22", message: "\u521B\u5EFA\u7B2C\u4E00\u6761\u7EBF\u7D22\uFF0C\u4ECE\u8FD9\u91CC\u5F00\u59CB" } - }, - kanban_by_status: { label: "\u7EBF\u7D22\u6D41\u6C34\u7EBF" }, - calendar_by_created: { label: "\u7EBF\u7D22\u65E5\u5386" }, - gallery_view: { label: "\u7EBF\u7D22\u5361\u7247" }, - my_leads: { label: "\u6211\u7684\u7EBF\u7D22" }, - high_priority: { label: "\u9AD8\u4F18\u5148\u7EA7" }, - hot_leads: { label: "\u{1F525} \u9AD8\u70ED\u5EA6\u7EBF\u7D22" }, - suspected_duplicates: { - label: "\u7591\u4F3C\u91CD\u590D\u7EBF\u7D22", - emptyState: { title: "\u6CA1\u6709\u7591\u4F3C\u91CD\u590D", message: "\u65E0\u9700\u590D\u6838\u2014\u2014\u6BCF\u4E2A\u91CD\u590D\u5F55\u5165\u7684\u90AE\u7BB1\u90FD\u5DF2\u68C0\u67E5\u8FC7\u3002" } - } - }, - _sections: { - // Object-level section keys (lead.object.ts), used by record forms and - // by the detail page, whose sections reference these groups (#806) - address: { label: "\u5730\u5740" }, - identity: { label: "\u8EAB\u4EFD\u4FE1\u606F" }, - company_info: { label: "\u516C\u53F8\u4FE1\u606F" }, - contact_info: { label: "\u8054\u7CFB\u65B9\u5F0F" }, - qualification: { label: "\u8D44\u683C\u8BC4\u4F30" }, - assignment: { label: "\u5206\u914D" }, - additional: { label: "\u9644\u52A0\u4FE1\u606F" }, - preferences: { label: "\u6C9F\u901A\u504F\u597D" }, - conversion: { label: "\u8F6C\u5316" }, - duplicates: { label: "\u91CD\u590D\u7EBF\u7D22\u7BA1\u7406" }, - // lead.view.ts 表单区块名称 (#1100) —— 默认表单与每一个具名 formView - // 的区块名字都住在这里:那边新增一个表单,这里就补上它的区块名。 - contact_information: { label: "\u8054\u7CFB\u4FE1\u606F" }, - lead_classification: { label: "\u7EBF\u7D22\u5206\u7C7B" }, - company_information: { label: "\u516C\u53F8\u4FE1\u606F" }, - additional_information: { label: "\u9644\u52A0\u4FE1\u606F" }, - privacy: { label: "\u9690\u79C1" }, - general: { label: "\u5E38\u89C4\u4FE1\u606F" }, - details: { label: "\u8BE6\u60C5" }, - step_1_contact_details: { label: "\u7B2C\u4E00\u6B65\uFF1A\u8054\u7CFB\u65B9\u5F0F" }, - step_2_company_information: { label: "\u7B2C\u4E8C\u6B65\uFF1A\u516C\u53F8\u4FE1\u606F" }, - step_3_qualification: { label: "\u7B2C\u4E09\u6B65\uFF1A\u8D44\u8D28\u5BA1\u6838" }, - step_4_review_and_convert: { label: "\u7B2C\u56DB\u6B65\uFF1A\u5BA1\u6838\u5E76\u8F6C\u5316" }, - primary_information: { label: "\u4E3B\u8981\u4FE1\u606F" }, - extended_details: { label: "\u6269\u5C55\u4FE1\u606F" }, - quick_edit: { label: "\u5FEB\u901F\u7F16\u8F91" }, - update_lead_status: { label: "\u66F4\u65B0\u7EBF\u7D22\u72B6\u6001" }, - tell_us_about_yourself: { label: "\u8BF7\u4ECB\u7ECD\u4E00\u4E0B\u60A8\u81EA\u5DF1" }, - about_your_company: { label: "\u60A8\u7684\u516C\u53F8\u4FE1\u606F" }, - how_can_we_help: { label: "\u6211\u4EEC\u80FD\u5E2E\u60A8\u4EC0\u4E48\uFF1F" }, - lead_information: { label: "\u7EBF\u7D22\u4FE1\u606F" }, - address_information: { label: "\u5730\u5740\u4FE1\u606F" }, - privacy_preferences: { label: "\u9690\u79C1\u504F\u597D" } - }, - _actions: { - ...activityActions2, - convert_lead: { - label: "\u8F6C\u5316\u7EBF\u7D22", - successMessage: "\u7EBF\u7D22\u8F6C\u5316\u6210\u529F\uFF01" - }, - create_campaign: { - label: "\u52A0\u5165\u8425\u9500\u6D3B\u52A8", - successMessage: "\u5DF2\u5C06\u7EBF\u7D22\u52A0\u5165\u8425\u9500\u6D3B\u52A8\uFF01", - params: { - crm_campaign: { label: "\u8425\u9500\u6D3B\u52A8" } - } - }, - schedule_followup: { - label: "\u5B89\u6392\u8DDF\u8FDB", - successMessage: "\u8DDF\u8FDB\u4EFB\u52A1\u5DF2\u521B\u5EFA\u3002" - } - } - }, - crm_opportunity: { - _validations: { - amount_positive: { - message: "\u91D1\u989D\u5FC5\u987B\u5927\u4E8E\u96F6" - }, - close_date_future: { - message: "\u9664\u975E\u5546\u673A\u5DF2\u7ED3\u675F\uFF0C\u5426\u5219\u9884\u8BA1\u6210\u4EA4\u65E5\u4E0D\u5E94\u65E9\u4E8E\u4ECA\u5929" - }, - opportunity_stage_progression: { - message: "\u65E0\u6548\u7684\u5546\u673A\u9636\u6BB5\u6D41\u8F6C" - } - }, - label: "\u5546\u673A", - pluralLabel: "\u5546\u673A", - description: "\u9500\u552E\u6D41\u7A0B\u4E2D\u7684\u5546\u673A\u4E0E\u4EA4\u6613", - fields: { - name: { label: "\u5546\u673A\u540D\u79F0" }, - crm_account: { label: "\u6240\u5C5E\u5BA2\u6237" }, - primary_contact: { label: "\u4E3B\u8981\u8054\u7CFB\u4EBA" }, - owner_id: { label: "\u5546\u673A\u8D1F\u8D23\u4EBA" }, - amount: { label: "\u91D1\u989D" }, - expected_revenue: { label: "\u9884\u671F\u6536\u5165" }, - stage: { - label: "\u9636\u6BB5", - options: { - prospecting: "\u5BFB\u627E\u5BA2\u6237", - qualification: "\u8D44\u683C\u5BA1\u67E5", - needs_analysis: "\u9700\u6C42\u5206\u6790", - proposal: "\u63D0\u6848", - negotiation: "\u8C08\u5224", - closed_won: "\u6210\u4EA4", - closed_lost: "\u5931\u8D25" - } - }, - probability: { label: "\u6210\u4EA4\u6982\u7387 (%)" }, - close_date: { label: "\u9884\u8BA1\u6210\u4EA4\u65E5\u671F" }, - type: { - label: "\u7C7B\u578B", - options: { - new_business: "\u65B0\u4E1A\u52A1", - existing_upgrade: "\u8001\u5BA2\u6237\u5347\u7EA7", - existing_renewal: "\u8001\u5BA2\u6237\u7EED\u7EA6", - existing_expansion: "\u8001\u5BA2\u6237\u62D3\u5C55" - } - }, - forecast_category: { - label: "\u9884\u6D4B\u7C7B\u522B", - options: { - pipeline: "\u7BA1\u9053", - best_case: "\u6700\u4F73\u60C5\u51B5", - commit: "\u627F\u8BFA", - omitted: "\u5DF2\u6392\u9664", - closed: "\u5DF2\u5173\u95ED" - } - }, - description: { label: "\u63CF\u8FF0" }, - next_step: { label: "\u4E0B\u4E00\u6B65" }, - lead_source: { - label: "\u7EBF\u7D22\u6765\u6E90", - options: { - web: "\u7F51\u7AD9", - referral: "\u63A8\u8350", - event: "\u6D3B\u52A8 / \u5C55\u4F1A", - webinar: "\u7EBF\u4E0A\u7814\u8BA8\u4F1A", - partner: "\u5408\u4F5C\u4F19\u4F34", - advertisement: "\u5E7F\u544A", - paid_search: "\u4ED8\u8D39\u641C\u7D22", - social: "\u793E\u4EA4\u5A92\u4F53", - content: "\u5185\u5BB9 / \u535A\u5BA2", - cold_call: "\u964C\u751F\u62DC\u8BBF", - email_campaign: "\u90AE\u4EF6\u8425\u9500", - other: "\u5176\u4ED6" - } - }, - crm_campaign: { label: "\u8425\u9500\u6D3B\u52A8", help: "\u5E26\u6765\u6B64\u5546\u673A\u7684\u8425\u9500\u6D3B\u52A8" }, - days_in_stage: { label: "\u5F53\u524D\u9636\u6BB5\u5929\u6570" }, - stage_entry_date: { label: "\u8FDB\u5165\u5F53\u524D\u9636\u6BB5\u65E5\u671F", help: "\u672C\u5546\u673A\u8FDB\u5165\u5F53\u524D\u9636\u6BB5\u7684\u65E5\u671F\u3002" }, - is_private: { label: "\u79C1\u5BC6" }, - approval_status: { - label: "\u5BA1\u6279\u72B6\u6001", - options: { not_required: "\u65E0\u9700\u5BA1\u6279", pending: "\u5BA1\u6279\u4E2D", approved: "\u5DF2\u6279\u51C6", rejected: "\u5DF2\u9A73\u56DE" } - }, - approved_date: { label: "\u6279\u51C6\u65F6\u95F4" }, - win_reason: { - help: '\u8D62\u5355\u539F\u56E0\u3002\u5C06\u5546\u673A\u5173\u95ED\u4E3A"\u6210\u4EA4"\u65F6\u5FC5\u586B\u3002', - label: "\u8D62\u5355\u539F\u56E0", - options: { - better_product: "\u4EA7\u54C1\u66F4\u4F18", - better_price: "\u4EF7\u683C\u66F4\u4F18", - relationship: "\u5BA2\u6237\u5173\u7CFB", - better_support: "\u652F\u6301\u66F4\u597D", - best_fit: "\u6700\u4F73\u5951\u5408", - quote_accepted: "\u62A5\u4EF7\u88AB\u63A5\u53D7", - other: "\u5176\u4ED6" - } - }, - loss_reason: { - help: '\u4E22\u5355\u539F\u56E0\u3002\u5C06\u5546\u673A\u5173\u95ED\u4E3A"\u5931\u8D25"\u65F6\u5FC5\u586B\u3002', - label: "\u4E22\u5355\u539F\u56E0", - options: { - price: "\u4EF7\u683C\u8FC7\u9AD8", - competitor: "\u8F93\u7ED9\u7ADE\u4E89\u5BF9\u624B", - no_budget: "\u65E0\u9884\u7B97", - no_decision: "\u672A\u51B3\u7B56", - timing: "\u65F6\u673A\u4E0D\u5408\u9002", - features: "\u529F\u80FD\u7F3A\u5931", - other: "\u5176\u4ED6" - } - }, - loss_details: { label: "\u8D62/\u4E22\u5355\u8BE6\u60C5", help: "\u8D62\u5355\u6216\u4E22\u5355\u539F\u56E0\u7684\u8865\u5145\u8BF4\u660E\u3002" }, - // REQ-0006 — 资格评估、客户侧采购日程、商机叙述、业务线与状态变更审批。 - will_bid: { label: "\u662F\u5426\u6295\u6807", help: "\u6211\u65B9\u662F\u5426\u6253\u7B97\u6295\u6807\u3002\u7559\u7A7A\u8868\u793A\u5C1A\u672A\u51B3\u5B9A\u3002" }, - controllability: { label: "\u53EF\u63A7\u6027", options: { high: "\u9AD8", medium: "\u4E2D", low: "\u4F4E" } }, - priority: { label: "\u4F18\u5148\u7EA7", options: { high: "\u9AD8", medium: "\u4E2D", low: "\u4F4E" } }, - deal_level: { label: "\u5546\u673A\u7EA7\u522B", options: { strategic: "\u6218\u7565\u7EA7", key: "\u91CD\u70B9", standard: "\u666E\u901A" } }, - is_subcontracted: { label: "\u6D89\u53CA\u5206\u5305" }, - subcontracting_note: { label: "\u5206\u5305\u8BF4\u660E" }, - customer_initiation_date: { label: "\u5BA2\u6237\u7ACB\u9879\u65E5\u671F" }, - expected_tender_date: { label: "\u9884\u8BA1\u62DB\u6807\u65E5\u671F" }, - expected_signing_date: { label: "\u9884\u8BA1\u7B7E\u7EA6\u65E5\u671F" }, - expected_tender_amount: { label: "\u9884\u8BA1\u62DB\u6807\u91D1\u989D" }, - expected_signing_amount: { label: "\u9884\u8BA1\u7B7E\u7EA6\u91D1\u989D" }, - business_line: { - label: "\u4E1A\u52A1\u7EBF", - options: { product: "\u4EA7\u54C1", services: "\u4E13\u4E1A\u670D\u52A1", consulting: "\u54A8\u8BE2\u670D\u52A1", support: "\u8FD0\u7EF4\u652F\u6301", other: "\u5176\u4ED6" } - }, - customer_background: { label: "\u5BA2\u6237\u7B80\u4ECB" }, - project_background: { label: "\u9879\u76EE\u80CC\u666F" }, - risk_analysis: { label: "\u98CE\u9669\u5206\u6790" }, - payment_terms: { label: "\u4ED8\u6B3E\u6761\u6B3E" }, - requested_status: { label: "\u7533\u8BF7\u53D8\u66F4\u72B6\u6001", options: { closed_won: "\u8D62\u5355", closed_lost: "\u4E22\u5355" } }, - status_change_approval_status: { - label: "\u72B6\u6001\u53D8\u66F4\u5BA1\u6279", - options: { not_required: "\u65E0\u9700\u5BA1\u6279", pending: "\u5BA1\u6279\u4E2D", approved: "\u5DF2\u6279\u51C6", rejected: "\u5DF2\u9A73\u56DE" } - }, - // REQ-0006 第 11 步 — 立项审批。 - qualification_requested: { - label: "\u7533\u8BF7\u7ACB\u9879\u5BA1\u6279", - help: "\u52FE\u9009\u540E\u63D0\u4EA4\u7ACB\u9879\u5BA1\u6279\u3002\u5BA1\u6279\u88AB\u9A73\u56DE\u65F6\u4F1A\u81EA\u52A8\u53D6\u6D88\u52FE\u9009\uFF1B\u518D\u6B21\u52FE\u9009\u5373\u53EF\u91CD\u65B0\u7533\u8BF7\u3002" - }, - qualification_approval_status: { - label: "\u7ACB\u9879\u5BA1\u6279", - options: { not_required: "\u65E0\u9700\u5BA1\u6279", pending: "\u5BA1\u6279\u4E2D", approved: "\u5DF2\u6279\u51C6", rejected: "\u5DF2\u9A73\u56DE" } - } - }, - _views: { - tender_this_quarter: { - label: "\u672C\u5B63\u5EA6\u9884\u8BA1\u62DB\u6807", - emptyState: { - title: "\u672C\u5B63\u5EA6\u6682\u65E0\u9884\u8BA1\u62DB\u6807\u7684\u5546\u673A", - message: "\u672C\u6807\u7B7E\u9875\u5217\u51FA\u5BA2\u6237\u4FA7\u9884\u8BA1\u62DB\u6807\u65E5\u671F\u843D\u5728\u5F53\u524D\u5B63\u5EA6\u5185\u7684\u8FDB\u884C\u4E2D\u5546\u673A\u3002\u5728\u5546\u673A\u4E0A\u586B\u5199\u201C\u9884\u8BA1\u62DB\u6807\u65E5\u671F\u201D\u540E\uFF0C\u5B83\u5C31\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002" - } - }, - open_opportunities: { label: "\u8FDB\u884C\u4E2D\u5546\u673A" }, - all_opportunities: { label: "\u5168\u90E8\u5546\u673A" }, - pipeline_kanban: { label: "\u9500\u552E\u6D41\u6C34\u7EBF" }, - close_date_calendar: { label: "\u9884\u6D4B\u65E5\u5386" }, - deal_timeline: { label: "\u5546\u673A\u65F6\u95F4\u7EBF" }, - deal_gallery: { label: "\u5546\u673A\u5361\u7247" }, - my_open_deals: { label: "\u6211\u7684\u8FDB\u884C\u4E2D\u5546\u673A" }, - stale_opportunities: { label: "\u26A0\uFE0F \u505C\u6EDE\u5546\u673A \xB7 \u6309\u9636\u6BB5\u505C\u7559\u65F6\u95F4\u6392\u5E8F" }, - closing_this_quarter: { - label: "\u672C\u5B63\u5EA6\u5F85\u6210\u4EA4\u5546\u673A", - emptyState: { - title: "\u672C\u5B63\u5EA6\u6682\u65E0\u5F85\u6210\u4EA4\u5546\u673A", - message: "\u672C\u6807\u7B7E\u9875\u5217\u51FA\u9884\u8BA1\u6210\u4EA4\u65E5\u671F\u843D\u5728\u5F53\u524D\u5B63\u5EA6\u5185\u3001\u4E14\u5904\u4E8E\u627F\u8BFA\uFF08Commit\uFF09\u6216\u6700\u4F73\u53EF\u80FD\uFF08Best Case\uFF09\u7684\u8FDB\u884C\u4E2D\u5546\u673A\u3002\u5F53\u524D\u6CA1\u6709\u7B26\u5408\u6761\u4EF6\u7684\u8BB0\u5F55\u2014\u2014\u9884\u8BA1\u6210\u4EA4\u65E5\u671F\u66F4\u665A\u7684\u5546\u673A\u8BF7\u89C1\u201C\u8FDB\u884C\u4E2D\u5546\u673A\u201D\u6807\u7B7E\u9875\u3002" - } - } - }, - _sections: { - // Object-level section keys (opportunity.object.ts), used by record forms - // and by the detail page, whose sections reference these groups (#1452) - crm_forecast: { label: "\u9636\u6BB5\u4E0E\u9884\u6D4B" }, - basic: { label: "\u57FA\u672C\u4FE1\u606F" }, - financials: { label: "\u8D22\u52A1\u4FE1\u606F" }, - sales_process: { label: "\u9500\u552E\u6D41\u7A0B" }, - classification: { label: "\u5206\u7C7B" }, - campaign: { label: "\u8425\u9500\u6D3B\u52A8" }, - notes: { label: "\u5907\u6CE8\u4E0E\u4E0B\u4E00\u6B65" }, - qualification: { label: "\u8D44\u683C\u8BC4\u4F30" }, - narrative: { label: "\u5546\u673A\u53D9\u8FF0" }, - // opportunity.view.ts 表单区块名称 (#1100) - overview: { label: "\u6982\u89C8" }, - forecast: { label: "\u9884\u6D4B" }, - sales_strategy: { label: "\u9500\u552E\u7B56\u7565" }, - win_loss: { label: "\u8D62\u5355/\u8F93\u5355" } - }, - _actions: { - ...activityActions2, - clone_opportunity: { - label: "\u514B\u9686\u5546\u673A", - successMessage: "\u5546\u673A\u514B\u9686\u6210\u529F\uFF01" - }, - generate_quote: { - label: "\u751F\u6210\u62A5\u4EF7\u5355", - successMessage: "\u5DF2\u6839\u636E\u5546\u673A\u521B\u5EFA\u62A5\u4EF7\u5355\uFF01" - }, - mass_update_stage: { - label: "\u66F4\u65B0\u9636\u6BB5", - successMessage: "\u5546\u673A\u9636\u6BB5\u5DF2\u66F4\u65B0\uFF01", - params: { - stage: { - label: "\u65B0\u9636\u6BB5", - options: { - prospecting: "\u5BFB\u627E\u5BA2\u6237", - qualification: "\u8D44\u683C\u5BA1\u67E5", - needs_analysis: "\u9700\u6C42\u5206\u6790", - proposal: "\u63D0\u6848", - negotiation: "\u8C08\u5224", - closed_won: "\u6210\u4EA4", - closed_lost: "\u5931\u8D25" - } - } - } - } - } - }, - crm_opportunity_line_item: { - _validations: { - unit_price_positive: { - message: "\u9500\u552E\u4EF7\u683C\u4E0D\u80FD\u4E3A\u8D1F\u6570" - } - }, - label: "\u5546\u673A\u4EA7\u54C1\u660E\u7EC6", - pluralLabel: "\u5546\u673A\u4EA7\u54C1\u660E\u7EC6", - description: "\u5546\u673A\u4E0B\u6309\u4EA7\u54C1\u62C6\u5206\u7684\u62A5\u4EF7\u884C", - fields: { - crm_opportunity: { label: "\u5173\u8054\u5546\u673A" }, - crm_product: { label: "\u4EA7\u54C1" }, - description: { label: "\u63CF\u8FF0" }, - quantity: { label: "\u6570\u91CF" }, - list_price: { label: "\u6807\u4EF7", help: "\u81EA\u52A8\u53D6\u81EA\u4EA7\u54C1\u7684\u76EE\u5F55\u4EF7" }, - unit_price: { label: "\u9500\u552E\u5355\u4EF7", help: "\u534F\u5546\u540E\u7684\u5355\u4EF7\uFF08\u53EF\u4E0E\u76EE\u5F55\u4EF7\u4E0D\u540C\uFF09" }, - discount: { label: "\u6298\u6263\uFF08%\uFF09" }, - total_price: { label: "\u603B\u8BA1" }, - line_number: { label: "\u884C\u53F7" } - }, - _sections: { - basic: { label: "\u660E\u7EC6\u884C" }, - pricing: { label: "\u4EF7\u683C" } - } - }, - crm_forecast: { - _validations: { - period_end_after_start: { - message: "\u5468\u671F\u7ED3\u675F\u5FC5\u987B\u665A\u4E8E\u5468\u671F\u5F00\u59CB\u3002" - }, - period_end_matches_calendar_period: { - message: "\u5468\u671F\u7ED3\u675F\u5FC5\u987B\u662F\u8BE5\u5468\u671F\u7684\u6700\u540E\u4E00\u5929\u2014\u2014\u4F8B\u5982\u4EE5 2026-07-01 \u5F00\u59CB\u7684\u5B63\u5EA6\u5BF9\u5E94 2026-09-30\uFF0C2026 \u5E74 8 \u6708\u5BF9\u5E94 2026-08-31\u3002" - }, - period_start_first_of_period: { - message: "\u5468\u671F\u5F00\u59CB\u5FC5\u987B\u662F\u8BE5\u5468\u671F\u7684\u7B2C\u4E00\u5929\u2014\u2014\u4F8B\u5982 2026 \u5E74 8 \u6708\u5BF9\u5E94 2026-08-01\u3002" - }, - quarter_starts_on_quarter_boundary: { - message: "\u5B63\u5EA6\u9884\u6D4B\u5FC5\u987B\u4ECE\u5B63\u5EA6\u8FB9\u754C\u5F00\u59CB\u2014\u20141 \u6708 1 \u65E5\u30014 \u6708 1 \u65E5\u30017 \u6708 1 \u65E5\u6216 10 \u6708 1 \u65E5\u3002" - }, - snapshot_amounts_non_negative: { - message: "\u5FEB\u7167\u91D1\u989D\u4E0D\u80FD\u4E3A\u8D1F\u6570\u3002" - } - }, - label: "\u9500\u552E\u9884\u6D4B", - pluralLabel: "\u9500\u552E\u9884\u6D4B", - description: "\u6309\u9500\u552E\u8D1F\u8D23\u4EBA\u5B9A\u671F\u8BB0\u5F55\u7684\u7BA1\u9053\u5FEB\u7167\uFF0C\u7528\u4E8E\u6536\u5165\u9884\u6D4B", - fields: { - owner_id: { label: "\u8D1F\u8D23\u4EBA" }, - period: { label: "\u5468\u671F", options: { month: "\u6708\u5EA6", quarter: "\u5B63\u5EA6" } }, - period_start: { - label: "\u5468\u671F\u8D77\u59CB", - help: "\u5FC5\u987B\u662F\u6240\u5728\u5468\u671F\u7684\u7B2C\u4E00\u5929\u2014\u2014\u4F8B\u5982 2026 \u5E74 8 \u6708\u5BF9\u5E94 2026-08-01\u3002\u5B63\u5EA6\u9884\u6D4B\u8FD8\u5FC5\u987B\u843D\u5728\u5B63\u5EA6\u8FB9\u754C\u4E0A\uFF1A1 \u6708 1 \u65E5\u30014 \u6708 1 \u65E5\u30017 \u6708 1 \u65E5\u6216 10 \u6708 1 \u65E5\u3002" - }, - period_end: { - label: "\u5468\u671F\u622A\u6B62", - help: '\u901A\u5E38\u6839\u636E"\u5468\u671F"\u548C"\u5468\u671F\u8D77\u59CB"\u81EA\u52A8\u63A8\u7B97\u3002\u5982\u624B\u52A8\u586B\u5199\uFF0C\u5FC5\u987B\u662F\u8BE5\u5468\u671F\u7684\u6700\u540E\u4E00\u5929\u2014\u2014\u4F8B\u5982\u8D77\u59CB\u4E3A 2026-07-01 \u7684\u5B63\u5EA6\u5BF9\u5E94 2026-09-30\uFF0C2026 \u5E74 8 \u6708\u5BF9\u5E94 2026-08-31\u3002' - }, - period_label: { label: "\u5468\u671F\u6807\u7B7E", help: '\u6613\u8BFB\u7684\u5468\u671F\u6807\u7B7E\uFF0C\u4F8B\u5982"2026 \u5E74\u7B2C\u4E09\u5B63\u5EA6"\u6216"2026 \u5E74 8 \u6708"\u3002' }, - snapshot_date: { label: "\u5FEB\u7167\u65E5\u671F", help: "\u672C\u6B21\u5FEB\u7167\u7684\u91C7\u96C6\u65E5\u671F\u3002" }, - source: { - label: "\u6765\u6E90", - options: { scheduled: "\u5B9A\u65F6\u5FEB\u7167", ai: "AI \u6280\u80FD", manual: "\u624B\u5DE5\u5F55\u5165" } - }, - quota: { label: "\u914D\u989D" }, - pipeline_amount: { label: "\u7BA1\u9053\u91D1\u989D", help: "\u672C\u5468\u671F\u5185\u6240\u6709\u9884\u8BA1\u7ED3\u5355\u7684\u8FDB\u884C\u4E2D\u5546\u673A\u91D1\u989D\u5408\u8BA1\uFF08\u4E0D\u9650\u9636\u6BB5\uFF09\u3002" }, - best_case_amount: { label: "\u6700\u4F73\u60C5\u51B5", help: '\u9884\u6D4B\u7C7B\u522B\u4E3A"\u6700\u4F73\u60C5\u51B5"\u6216"\u627F\u8BFA"\u7684\u8FDB\u884C\u4E2D\u5546\u673A\u3002' }, - commit_amount: { label: "\u627F\u8BFA\u91D1\u989D", help: '\u9884\u6D4B\u7C7B\u522B\u4E3A"\u627F\u8BFA"\u7684\u8FDB\u884C\u4E2D\u5546\u673A\uFF08\u8D1F\u8D23\u4EBA\u5DF2\u627F\u8BFA\uFF09\u3002' }, - closed_amount: { label: "\u5DF2\u6210\u4EA4\u91D1\u989D", help: "\u672C\u5468\u671F\u5185\u5DF2\u8D62\u5355\u7684\u91D1\u989D\u3002" }, - expected_amount: { label: "\u9884\u671F\u91D1\u989D", help: "\u5DF2\u6210\u4EA4 + \u627F\u8BFA\u2014\u2014\u8D1F\u8D23\u4EBA\u5408\u7406\u9884\u671F\u80FD\u62FF\u4E0B\u7684\u91D1\u989D\u3002" }, - attainment_pct: { label: "\u8FBE\u6210\u7387\uFF08%\uFF09", help: "\u5DF2\u6210\u4EA4 \xF7 \u914D\u989D \xD7 100\u3002\u914D\u989D\u4E3A\u6B63\u6570\u4E4B\u524D\u663E\u793A 0%\u3002" }, - coverage_ratio: { label: "\u8986\u76D6\u500D\u6570", help: "\u7BA1\u9053\u91D1\u989D \xF7\uFF08\u914D\u989D \u2212 \u5DF2\u6210\u4EA4\uFF09\u2014\u2014\u5224\u65AD\u5269\u4F59\u7F3A\u53E3\u662F\u5426\u6709\u8DB3\u591F\u7BA1\u9053\u8986\u76D6\u3002\u914D\u989D\u5DF2\u8FBE\u6210\u65F6\u663E\u793A 0\u3002" }, - notes: { label: "\u5907\u6CE8" }, - display_title: { label: "\u663E\u793A\u540D\u79F0" }, - seed_key: { label: "\u79CD\u5B50\u6807\u8BC6", help: "\u6F14\u793A\u6570\u636E\u6807\u8BC6\u3002\u4EC5\u7531\u79CD\u5B50\u52A0\u8F7D\u5668\u5199\u5165\uFF1B\u771F\u5B9E\u5FEB\u7167\u4E0A\u59CB\u7EC8\u4E3A\u7A7A\u3002" } - }, - _views: { - all_forecasts: { label: "\u5168\u90E8\u9884\u6D4B" }, - this_quarter_forecasts: { - label: "\u672C\u5B63\u5EA6", - emptyState: { - title: "\u672C\u5B63\u5EA6\u5C1A\u65E0\u5FEB\u7167", - message: "\u5B63\u5EA6\u5FEB\u7167\u7531\u6BCF\u665A\u7684\u9884\u6D4B\u626B\u63CF\u4EFB\u52A1\u5199\u5165\u3002\u5728\u5B83\u4E3A\u5F53\u524D\u5B63\u5EA6\u9996\u6B21\u8DD1\u5B8C\u4E4B\u524D\uFF0C\u672C\u89C6\u56FE\u4E3A\u7A7A\u2014\u2014\u5DF2\u7ED3\u675F\u7684\u5B63\u5EA6\u8BF7\u89C1\u201C\u5168\u90E8\u201D\u6807\u7B7E\u9875\u3002" - } - }, - my_forecast: { label: "\u6211\u7684\u9884\u6D4B" } - }, - _sections: { - basic: { label: "\u5FEB\u7167" }, - amounts: { label: "\u91D1\u989D" }, - meta: { label: "\u6765\u6E90" }, - // forecast.view.ts 表单区块名称 (#1100) - snapshot: { label: "\u5FEB\u7167" }, - notes: { label: "\u5907\u6CE8" } - } - } -}; - -// src/sales/translations/zh-CN/objects.commerce.ts -var commerce2 = { - crm_quote: { - _validations: { - discount_within_ceiling: { - message: "\u6298\u6263\u4E0D\u80FD\u8D85\u8FC7 60%" - }, - expiration_after_quote: { - message: "\u5931\u6548\u65E5\u671F\u5FC5\u987B\u665A\u4E8E\u62A5\u4EF7\u65E5\u671F" - }, - quote_status_progression: { - message: "\u65E0\u6548\u7684\u62A5\u4EF7\u5355\u72B6\u6001\u6D41\u8F6C" - } - }, - label: "\u62A5\u4EF7\u5355", - pluralLabel: "\u62A5\u4EF7\u5355", - description: "\u53D1\u9001\u7ED9\u5BA2\u6237\u7684\u4EF7\u683C\u62A5\u4EF7", - fields: { - quote_number: { label: "\u62A5\u4EF7\u5355\u7F16\u53F7" }, - name: { label: "\u62A5\u4EF7\u540D\u79F0" }, - crm_account: { label: "\u6240\u5C5E\u5BA2\u6237" }, - crm_opportunity: { label: "\u5173\u8054\u5546\u673A" }, - status: { - label: "\u72B6\u6001", - options: { - draft: "\u8349\u7A3F", - in_review: "\u5BA1\u6838\u4E2D", - presented: "\u5DF2\u63D0\u4EA4", - accepted: "\u5DF2\u63A5\u53D7", - rejected: "\u5DF2\u62D2\u7EDD", - expired: "\u5DF2\u8FC7\u671F" - } - }, - total_price: { label: "\u603B\u91D1\u989D" }, - discount: { label: "\u6298\u6263 (%)" }, - expiration_date: { label: "\u5230\u671F\u65E5\u671F" }, - description: { label: "\u63CF\u8FF0" }, - crm_contact: { - label: "\u8054\u7CFB\u4EBA", - help: "\u62A5\u4EF7\u8FDB\u5165\u300C\u5DF2\u63D0\u4EA4\u300D\u6216\u300C\u5DF2\u63A5\u53D7\u300D\u540E\u5FC5\u586B \u2014\u2014 \u8D77\u8349\u7684\u5408\u540C\u4ECE\u8FD9\u91CC\u53D6\u4E3B\u8981\u8054\u7CFB\u4EBA\u3002" - }, - owner_id: { label: "\u62A5\u4EF7\u8D1F\u8D23\u4EBA" }, - quote_date: { label: "\u62A5\u4EF7\u65E5\u671F" }, - subtotal: { label: "\u5C0F\u8BA1" }, - discount_amount: { label: "\u6298\u6263\u91D1\u989D" }, - tax: { label: "\u7A0E\u989D" }, - shipping_handling: { label: "\u8FD0\u8D39\u53CA\u624B\u7EED\u8D39" }, - payment_terms: { - label: "\u4ED8\u6B3E\u6761\u6B3E", - options: { - net_15: "15 \u5929\u8D26\u671F", - net_30: "30 \u5929\u8D26\u671F", - net_60: "60 \u5929\u8D26\u671F", - net_90: "90 \u5929\u8D26\u671F", - due_on_receipt: "\u8D27\u5230\u4ED8\u6B3E" - } - }, - shipping_terms: { label: "\u8FD0\u8F93\u6761\u6B3E" }, - billing_address: { label: "\u8D26\u5355\u5730\u5740" }, - shipping_address: { label: "\u6536\u8D27\u5730\u5740" }, - internal_notes: { label: "\u5185\u90E8\u5907\u6CE8" }, - display_title: { label: "\u663E\u793A\u540D\u79F0" } - }, - _views: { - all_quotes: { label: "\u5168\u90E8\u62A5\u4EF7\u5355" }, - quote_pipeline: { label: "\u62A5\u4EF7\u6D41\u6C34\u7EBF" }, - quote_calendar: { label: "\u62A5\u4EF7\u65E5\u5386" } - }, - _sections: { - basic: { label: "\u62A5\u4EF7\u4FE1\u606F" }, - pricing: { label: "\u4EF7\u683C" }, - terms: { label: "\u6761\u6B3E\u4E0E\u6709\u6548\u671F" }, - address: { label: "\u5730\u5740" }, - system: { label: "\u7CFB\u7EDF" }, - // quote.view.ts 表单区块名称 (#1100) - quote: { label: "\u62A5\u4EF7\u5355" }, - totals: { label: "\u5408\u8BA1" }, - quote_terms: { label: "\u6761\u6B3E" }, - addresses_and_notes: { label: "\u5730\u5740\u4E0E\u5907\u6CE8" } - } - }, - crm_quote_line_item: { - _validations: { - discount_within_ceiling: { - message: "\u884C\u6298\u6263\u4E0D\u80FD\u8D85\u8FC7 60%" - }, - unit_price_positive: { - message: "\u9500\u552E\u4EF7\u683C\u4E0D\u80FD\u4E3A\u8D1F\u6570" - } - }, - label: "\u62A5\u4EF7\u5355\u660E\u7EC6", - pluralLabel: "\u62A5\u4EF7\u5355\u660E\u7EC6", - description: "\u62A5\u4EF7\u5355\u4E0B\u6309\u4EA7\u54C1\u62C6\u5206\u7684\u62A5\u4EF7\u884C", - fields: { - crm_quote: { label: "\u5173\u8054\u62A5\u4EF7\u5355" }, - crm_product: { label: "\u4EA7\u54C1" }, - description: { label: "\u63CF\u8FF0" }, - quantity: { label: "\u6570\u91CF" }, - list_price: { label: "\u6807\u4EF7" }, - unit_price: { label: "\u9500\u552E\u5355\u4EF7" }, - discount: { label: "\u6298\u6263\uFF08%\uFF09" }, - subtotal: { label: "\u5C0F\u8BA1" }, - total_price: { label: "\u603B\u8BA1" }, - line_number: { label: "\u884C\u53F7" } - }, - _sections: { - basic: { label: "\u660E\u7EC6\u884C" }, - pricing: { label: "\u4EF7\u683C" } - } - }, - crm_contract: { - _validations: { - end_after_start: { - message: "\u7ED3\u675F\u65E5\u671F\u5FC5\u987B\u665A\u4E8E\u5F00\u59CB\u65E5\u671F" - }, - contract_status_progression: { - message: "\u65E0\u6548\u7684\u5408\u540C\u72B6\u6001\u6D41\u8F6C" - } - }, - label: "\u5408\u540C", - pluralLabel: "\u5408\u540C", - description: "\u4E0E\u5BA2\u6237\u7B7E\u7F72\u7684\u6CD5\u5F8B\u5408\u540C", - fields: { - contract_number: { label: "\u5408\u540C\u7F16\u53F7" }, - crm_account: { label: "\u6240\u5C5E\u5BA2\u6237" }, - status: { - label: "\u72B6\u6001", - options: { - draft: "\u8349\u7A3F", - in_approval: "\u5BA1\u6279\u4E2D", - activated: "\u5DF2\u6FC0\u6D3B", - expired: "\u5DF2\u8FC7\u671F", - terminated: "\u5DF2\u7EC8\u6B62" - } - }, - start_date: { label: "\u5F00\u59CB\u65E5\u671F" }, - end_date: { label: "\u7ED3\u675F\u65E5\u671F" }, - contract_value: { label: "\u5408\u540C\u91D1\u989D" }, - description: { label: "\u63CF\u8FF0" }, - crm_contact: { label: "\u4E3B\u8981\u8054\u7CFB\u4EBA" }, - crm_opportunity: { label: "\u5173\u8054\u5546\u673A" }, - owner_id: { label: "\u5408\u540C\u8D1F\u8D23\u4EBA" }, - contract_term_months: { label: "\u5408\u540C\u671F\u9650\uFF08\u6708\uFF09" }, - billing_frequency: { - label: "\u8BA1\u8D39\u5468\u671F", - options: { monthly: "\u6309\u6708", quarterly: "\u6309\u5B63\u5EA6", annually: "\u6309\u5E74", one_time: "\u4E00\u6B21\u6027" } - }, - payment_terms: { - label: "\u4ED8\u6B3E\u6761\u6B3E", - options: { - net_15: "15 \u5929\u8D26\u671F", - net_30: "30 \u5929\u8D26\u671F", - net_60: "60 \u5929\u8D26\u671F", - net_90: "90 \u5929\u8D26\u671F", - due_on_receipt: "\u8D27\u5230\u4ED8\u6B3E" - } - }, - auto_renewal: { label: "\u81EA\u52A8\u7EED\u7EA6" }, - renewal_notice_days: { label: "\u7EED\u7EA6\u901A\u77E5\uFF08\u5929\uFF09" }, - contract_type: { - label: "\u5408\u540C\u7C7B\u578B", - options: { - subscription: "\u8BA2\u9605\u5408\u540C", - service: "\u670D\u52A1\u534F\u8BAE", - license: "\u6388\u6743\u8BB8\u53EF", - partnership: "\u5408\u4F5C\u534F\u8BAE", - nda: "\u4FDD\u5BC6\u534F\u8BAE", - msa: "\u4E3B\u670D\u52A1\u534F\u8BAE" - } - }, - signed_date: { label: "\u7B7E\u7F72\u65E5\u671F" }, - signed_by: { label: "\u7B7E\u7F72\u4EBA" }, - document_url: { label: "\u5408\u540C\u6587\u6863" }, - special_terms: { label: "\u7279\u6B8A\u6761\u6B3E" }, - billing_address: { label: "\u8D26\u5355\u5730\u5740" } - }, - _views: { - all_contracts: { label: "\u5168\u90E8\u5408\u540C" }, - renewal_calendar: { label: "\u7EED\u7EA6\u65E5\u5386" }, - contract_gantt: { label: "\u5408\u540C\u6761\u6B3E" }, - contract_timeline: { label: "\u5408\u540C\u65F6\u95F4\u7EBF" } - }, - _sections: { - basic: { label: "\u5408\u540C\u4FE1\u606F" }, - parties: { label: "\u7B7E\u7EA6\u65B9" }, - terms: { label: "\u6761\u6B3E\u4E0E\u65E5\u671F" }, - value: { label: "\u5408\u540C\u91D1\u989D" }, - status: { label: "\u72B6\u6001\u4E0E\u5BA1\u6279" }, - renewal: { label: "\u7EED\u7EA6" }, - // contract.view.ts 表单区块名称 (#1100) - contract_terms: { label: "\u6761\u6B3E" }, - signing_and_documents: { label: "\u7B7E\u7F72\u4E0E\u6587\u4EF6" }, - notes: { label: "\u5907\u6CE8" } - } - }, - crm_product: { - _validations: { - cost_less_than_price: { - message: "\u6210\u672C\u5E94\u4F4E\u4E8E\u6807\u4EF7" - }, - price_positive: { - message: "\u6807\u4EF7\u5FC5\u987B\u4E3A\u6B63\u6570" - } - }, - label: "\u4EA7\u54C1", - pluralLabel: "\u4EA7\u54C1", - description: "\u516C\u53F8\u63D0\u4F9B\u7684\u4EA7\u54C1\u4E0E\u670D\u52A1", - fields: { - product_code: { label: "\u4EA7\u54C1\u4EE3\u7801" }, - name: { label: "\u4EA7\u54C1\u540D\u79F0" }, - category: { - label: "\u4EA7\u54C1\u7C7B\u522B", - options: { - software: "\u8F6F\u4EF6", - hardware: "\u786C\u4EF6", - service: "\u670D\u52A1", - subscription: "\u8BA2\u9605", - support: "\u652F\u6301\u670D\u52A1" - } - }, - cost: { label: "\u6210\u672C" }, - is_active: { label: "\u662F\u5426\u542F\u7528" }, - description: { label: "\u63CF\u8FF0" }, - family: { - label: "\u4EA7\u54C1\u7CFB\u5217", - options: { - enterprise: "\u4F01\u4E1A\u7EA7\u65B9\u6848", - smb: "\u4E2D\u5C0F\u4F01\u4E1A\u65B9\u6848", - services: "\u4E13\u4E1A\u670D\u52A1", - cloud: "\u4E91\u670D\u52A1" - } - }, - list_price: { label: "\u6807\u4EF7" }, - sku: { label: "SKU" }, - product_manager: { label: "\u4EA7\u54C1\u7ECF\u7406" }, - image: { label: "\u4EA7\u54C1\u56FE\u7247" }, - datasheet: { label: "\u89C4\u683C\u4E66" }, - display_title: { label: "\u663E\u793A\u540D\u79F0" } - }, - _views: { - all_products: { label: "\u5168\u90E8\u4EA7\u54C1" }, - product_catalog: { label: "\u4EA7\u54C1\u76EE\u5F55" } - }, - _sections: { - basic: { label: "\u4EA7\u54C1\u4FE1\u606F" }, - pricing: { label: "\u4EF7\u683C" }, - metadata: { label: "\u8D44\u6E90" }, - // product.view.ts 表单区块名称 (#1100) - product_info: { label: "\u4EA7\u54C1\u4FE1\u606F" }, - pricing_info: { label: "\u5B9A\u4EF7" }, - media: { label: "\u5A92\u4F53" } - } - } -}; - -// src/sales/translations/zh-CN/objects.service.ts -var service2 = { - crm_case: { - _validations: { - resolution_required_for_closed: { - message: "\u5173\u95ED\u5DE5\u5355\u65F6\u5FC5\u987B\u586B\u5199\u89E3\u51B3\u65B9\u6848" - }, - escalation_reason_required: { - message: "\u5347\u7EA7\u5DE5\u5355\u65F6\u5FC5\u987B\u586B\u5199\u5347\u7EA7\u539F\u56E0" - }, - case_status_progression: { - message: "\u65E0\u6548\u7684\u72B6\u6001\u6D41\u8F6C" - } - }, - label: "\u5DE5\u5355", - pluralLabel: "\u5DE5\u5355", - description: "\u5BA2\u6237\u652F\u6301\u5DE5\u5355\u4E0E\u670D\u52A1\u8BF7\u6C42", - fields: { - case_number: { label: "\u5DE5\u5355\u7F16\u53F7" }, - subject: { label: "\u4E3B\u9898" }, - description: { label: "\u63CF\u8FF0" }, - crm_account: { label: "\u6240\u5C5E\u5BA2\u6237" }, - crm_contact: { label: "\u8054\u7CFB\u4EBA" }, - status: { - label: "\u72B6\u6001", - options: { - new: "\u65B0\u5EFA", - in_progress: "\u5904\u7406\u4E2D", - waiting_customer: "\u7B49\u5F85\u5BA2\u6237\u56DE\u590D", - waiting_support: "\u7B49\u5F85\u652F\u6301\u56DE\u590D", - escalated: "\u5DF2\u5347\u7EA7", - resolved: "\u5DF2\u89E3\u51B3", - closed: "\u5DF2\u5173\u95ED" - } - }, - priority: { - // `critical` MUST NOT render 紧急 — that word belongs to - // `crm_task.priority.urgent`, and the two vocabularies are different - // sets (case: low/medium/high/critical · task: low/normal/high/urgent). - // When both rendered 紧急 the screen showed one word for two values the - // model treats as distinct, which is how a case value ends up in a task - // predicate (`src/sales/views/task.view.ts` carries the tombstone of that - // crossing). Maintainer ruling 2026-08-31, #1342: case `critical` is - // 严重, task `urgent` keeps 紧急. en/es-ES/ja-JP already separate them - // (Critical/Urgent · Crítica/Urgente · 重大/緊急); zh-CN was the outlier. - label: "\u4F18\u5148\u7EA7", - options: { low: "\u4F4E", medium: "\u4E2D", high: "\u9AD8", critical: "\u4E25\u91CD" } - }, - type: { - label: "\u7C7B\u578B", - options: { - question: "\u54A8\u8BE2", - problem: "\u6545\u969C", - feature_request: "\u529F\u80FD\u9700\u6C42", - bug: "\u7F3A\u9677" - } - }, - owner_id: { label: "\u8D1F\u8D23\u4EBA" }, - origin: { - label: "\u5DE5\u5355\u6765\u6E90", - options: { email: "\u90AE\u4EF6", phone: "\u7535\u8BDD", web: "\u7F51\u7AD9", chat: "\u5728\u7EBF\u5BA2\u670D", social_media: "\u793E\u4EA4\u5A92\u4F53" } - }, - closed_date: { label: "\u5173\u95ED\u65E5\u671F" }, - first_response_date: { label: "\u9996\u6B21\u54CD\u5E94\u65E5\u671F" }, - resolution_time_hours: { label: "\u89E3\u51B3\u8017\u65F6\uFF08\u5C0F\u65F6\uFF09" }, - sla_due_date: { label: "SLA \u5230\u671F", help: "\u6309\u5DE5\u5355\u4F18\u5148\u7EA7\u4E0E\u6240\u5C5E\u5BA2\u6237\u7684\u5BA2\u6237\u5206\u5C42\u8BBE\u5B9A\uFF0C\u4EE5\u65E5\u5386\u5C0F\u65F6\u8BA1\uFF1A\u591C\u95F4\u3001\u5468\u672B\u4E0E\u8282\u5047\u65E5\u90FD\u8BA1\u5165\u3002" }, - is_sla_violated: { label: "SLA \u8FDD\u53CD" }, - is_escalated: { label: "\u5DF2\u5347\u7EA7" }, - escalation_reason: { label: "\u5347\u7EA7\u539F\u56E0" }, - resolution: { label: "\u89E3\u51B3\u65B9\u6848" }, - resolved_by_article: { label: "\u89E3\u51B3\u8BE5\u5DE5\u5355\u7684\u77E5\u8BC6\u6587\u7AE0", help: "\u89E3\u51B3\u6B64\u5DE5\u5355\u7684\u77E5\u8BC6\u5E93\u6587\u7AE0 \u2014\u2014 \u8F6C\u79FB\u7387\u7684\u7EDF\u8BA1\u53E3\u5F84\u3002" }, - internal_notes: { label: "\u5185\u90E8\u5907\u6CE8", help: "\u5185\u90E8\u5907\u6CE8\uFF0C\u5BA2\u6237\u4E0D\u53EF\u89C1" }, - is_closed: { label: "\u662F\u5426\u5173\u95ED" }, - display_title: { label: "\u663E\u793A\u540D\u79F0" }, - priority_rank: { label: "\u4F18\u5148\u7EA7\u6392\u5E8F" }, - escalated_date: { label: "\u5347\u7EA7\u65E5\u671F" } - }, - _views: { - all_cases: { label: "\u5168\u90E8\u5DE5\u5355" }, - case_workflow: { label: "\u670D\u52A1\u6D41\u8F6C" }, - sla_calendar: { label: "SLA \u65E5\u5386" }, - case_timeline: { label: "\u5DE5\u5355\u65F6\u95F4\u7EBF" }, - unassigned_triage: { - label: "\u672A\u5206\u6D3E \u2014 \u5F85\u5206\u8BCA", - emptyState: { - title: "\u6CA1\u6709\u5F85\u5206\u8BCA\u7684\u5DE5\u5355", - message: "\u6240\u6709\u5DE5\u5355\u90FD\u6709\u8D1F\u8D23\u4EBA\u3002\u5F53\u5DE5\u5355\u5230\u8FBE\u65F6\u6CA1\u6709\u8D1F\u8D23\u4EBA\uFF0C\u5C31\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC \u2014\u2014 \u901A\u5E38\u662F\u5728\u65E0\u4EBA\u62C5\u4EFB\u300C\u5BA2\u670D\u4E13\u5458\u300D\u804C\u4F4D\u671F\u95F4\u63D0\u4EA4\u7684\u7F51\u9875\u8F6C\u5DE5\u5355\u3002" - } - }, - escalated_cases: { label: "\u5DF2\u5347\u7EA7\u5DE5\u5355" }, - my_open_cases: { label: "\u6211\u7684\u5F85\u5904\u7406\u5DE5\u5355" }, - sla_at_risk: { label: "\u23F0 SLA \u98CE\u9669\u9884\u8B66" } - }, - _actions: { - ...activityActions2, - escalate_case: { - label: "\u5347\u7EA7\u5DE5\u5355", - confirmText: "\u6B64\u64CD\u4F5C\u4F1A\u5C06\u5DE5\u5355\u5347\u7EA7\u5230\u5347\u7EA7\u5904\u7406\u56E2\u961F\uFF0C\u662F\u5426\u7EE7\u7EED\uFF1F", - successMessage: "\u5DE5\u5355\u5347\u7EA7\u6210\u529F\uFF01" - }, - close_case: { - label: "\u5173\u95ED\u5DE5\u5355", - confirmText: "\u786E\u5B9A\u8981\u5173\u95ED\u6B64\u5DE5\u5355\u5417\uFF1F", - successMessage: "\u5DE5\u5355\u5DF2\u6210\u529F\u5173\u95ED\uFF01" - }, - claim_case: { - label: "\u8BA4\u9886\u5DE5\u5355", - successMessage: "\u5DE5\u5355\u5DF2\u8BA4\u9886\uFF0C\u73B0\u5728\u5F52\u4F60\u8D1F\u8D23\u3002" - } - }, - _sections: { - // case.view.ts 表单区块名称 (#1100)。 - case: { label: "\u5DE5\u5355" }, - how_can_we_help: { label: "\u6211\u4EEC\u80FD\u5E2E\u60A8\u4EC0\u4E48\uFF1F" }, - // Object-level section keys (case.object.ts), used by record forms and - // by the detail page, whose sections reference these groups (#970) - basic: { label: "\u5DE5\u5355\u4FE1\u606F" }, - origin: { label: "\u6765\u6E90\u4E0E\u8DEF\u7531" }, - sla: { label: "SLA \u4E0E\u4F18\u5148\u7EA7" }, - resolution: { label: "\u89E3\u51B3\u65B9\u6848" }, - escalation: { label: "\u5347\u7EA7" }, - system: { label: "\u7CFB\u7EDF" } - } - }, - crm_knowledge_article: { - _validations: { - published_requires_body: { - message: "\u6CA1\u6709\u6B63\u6587\u7684\u6587\u7AE0\u65E0\u6CD5\u53D1\u5E03\u3002" - }, - published_requires_summary: { - message: "\u5DF2\u53D1\u5E03\u7684\u6587\u7AE0\u5E94\u586B\u5199\u6458\u8981\uFF0C\u4F9B\u641C\u7D22\u7ED3\u679C\u4E0E AI \u5F15\u7528\u4F7F\u7528\u3002" - } - }, - label: "\u77E5\u8BC6\u6587\u7AE0", - pluralLabel: "\u77E5\u8BC6\u5E93", - description: "\u9762\u5411\u5BA2\u6237\u548C\u5750\u5E2D\u7684\u53EF\u590D\u7528\u95EE\u7B54\u4E0E\u64CD\u4F5C\u6307\u5357", - fields: { - article_number: { label: "\u6587\u7AE0\u7F16\u53F7" }, - title: { label: "\u6807\u9898" }, - summary: { label: "\u6458\u8981", help: "\u4E00\u6BB5\u8BDD\u6458\u8981\uFF0C\u663E\u793A\u5728\u641C\u7D22\u7ED3\u679C\u548C AI \u5F15\u7528\u4E2D\u3002" }, - body: { label: "\u6B63\u6587", help: "\u6587\u7AE0\u6B63\u6587\uFF08Markdown\uFF09\u3002" }, - category: { - label: "\u5206\u7C7B", - options: { - getting_started: "\u5165\u95E8\u6307\u5357", - how_to: "\u64CD\u4F5C\u6307\u5357", - troubleshooting: "\u6545\u969C\u6392\u67E5", - billing: "\u8D26\u52A1\u4E0E\u4EF7\u683C", - api: "API \u4E0E\u96C6\u6210", - release_notes: "\u7248\u672C\u8BF4\u660E", - policy: "\u653F\u7B56\u5236\u5EA6" - } - }, - tags: { - label: "\u6807\u7B7E", - options: { - auth: "\u8EAB\u4EFD\u8BA4\u8BC1", - sso: "\u5355\u70B9\u767B\u5F55", - mobile: "\u79FB\u52A8\u7AEF", - email: "\u90AE\u4EF6", - reports: "\u62A5\u8868", - performance: "\u6027\u80FD", - data_import: "\u6570\u636E\u5BFC\u5165", - webhooks: "Webhook" - } - }, - status: { - label: "\u72B6\u6001", - options: { draft: "\u8349\u7A3F", in_review: "\u5BA1\u6838\u4E2D", published: "\u5DF2\u53D1\u5E03", archived: "\u5DF2\u5F52\u6863" } - }, - audience: { label: "\u53D7\u4F17", options: { public: "\u516C\u5F00", internal: "\u4EC5\u5185\u90E8" }, help: "\u516C\u5F00\u6587\u7AE0\u5728\u5BA2\u6237\u95E8\u6237\u53EF\u89C1\uFF1B\u5185\u90E8\u6587\u7AE0\u4EC5\u5BA2\u670D\u53EF\u89C1\u3002" }, - language: { - label: "\u8BED\u8A00", - options: { en: "\u82F1\u8BED", zh_cn: "\u7B80\u4F53\u4E2D\u6587", es_es: "\u897F\u73ED\u7259\u8BED", ja_jp: "\u65E5\u8BED" } - }, - owner_id: { label: "\u8D1F\u8D23\u4EBA" }, - related_to_case: { label: "\u6765\u6E90\u5DE5\u5355", help: "\u672C\u6587\u6240\u4F9D\u636E\u7684\u5DE5\u5355\uFF08\u53EF\u9009\uFF09\u3002" }, - published_at: { label: "\u53D1\u5E03\u65F6\u95F4" }, - last_reviewed_at: { label: "\u6700\u8FD1\u590D\u6838" }, - helpful_count: { label: "\u6709\u7528", help: "\u7531 crm_article_feedback \u91CD\u65B0\u7EDF\u8BA1\u5F97\u51FA\uFF0C\u4E0D\u53EF\u624B\u5DE5\u586B\u5199\u3002" }, - not_helpful_count: { label: "\u6CA1\u7528", help: "\u7531 crm_article_feedback \u91CD\u65B0\u7EDF\u8BA1\u5F97\u51FA\uFF0C\u4E0D\u53EF\u624B\u5DE5\u586B\u5199\u3002" }, - display_title: { label: "\u663E\u793A\u540D\u79F0" } - }, - _views: { - all_articles: { label: "\u5168\u90E8\u6587\u7AE0" }, - published_articles: { label: "\u5DF2\u53D1\u5E03" }, - my_drafts: { label: "\u6211\u7684\u8349\u7A3F" } - }, - _sections: { - basic: { label: "\u6587\u7AE0\u4FE1\u606F" }, - content: { label: "\u5185\u5BB9" }, - taxonomy: { label: "\u5206\u7C7B" }, - metrics: { label: "\u4E92\u52A8\u6570\u636E" }, - engagement: { label: "\u4E92\u52A8\u6570\u636E" }, - // knowledge_article.view.ts 表单区块名称 (#1100) - article: { label: "\u6587\u7AE0" } - }, - _actions: { - mark_article_helpful: { - label: "\u6709\u7528", - successMessage: "\u5DF2\u8BB0\u5F55\u4E3A\u300C\u6709\u7528\u300D\uFF0C\u8C22\u8C22\u53CD\u9988\u3002" - }, - mark_article_not_helpful: { - label: "\u6CA1\u7528", - successMessage: "\u5DF2\u8BB0\u5F55\u4E3A\u300C\u6CA1\u7528\u300D\uFF0C\u8C22\u8C22\u53CD\u9988\u3002" - } - } - }, - crm_article_feedback: { - label: "\u6587\u7AE0\u53CD\u9988", - pluralLabel: "\u6587\u7AE0\u53CD\u9988", - description: "\u8BFB\u8005\u5BF9\u67D0\u7BC7\u77E5\u8BC6\u6587\u7AE0\u7684\u300C\u6709\u7528 / \u6CA1\u7528\u300D\u8BC4\u4EF7", - fields: { - feedback_number: { label: "\u53CD\u9988\u7F16\u53F7" }, - owner_id: { label: "\u8BFB\u8005" }, - crm_knowledge_article: { label: "\u6587\u7AE0", help: "\u672C\u6761\u53CD\u9988\u9488\u5BF9\u7684\u77E5\u8BC6\u6587\u7AE0\u3002" }, - verdict: { - label: "\u8BC4\u4EF7", - options: { helpful: "\u6709\u7528", not_helpful: "\u6CA1\u7528" } - }, - comment: { label: "\u5907\u6CE8", help: "\u53EF\u9009\u8BF4\u660E\uFF0C\u4F5C\u8005\u53EF\u89C1\u3002" } - }, - _sections: { - basic: { label: "\u53CD\u9988" } - } - } -}; - -// src/sales/translations/zh-CN/objects.activity.ts -var activity2 = { - crm_task: { - _validations: { - completed_date_required: { - message: "\u72B6\u6001\u4E3A\u5DF2\u5B8C\u6210\u65F6\u5FC5\u987B\u586B\u5199\u5B8C\u6210\u65E5\u671F" - }, - recurrence_fields_required: { - message: "\u91CD\u590D\u4EFB\u52A1\u5FC5\u987B\u586B\u5199\u91CD\u590D\u7C7B\u578B" - }, - related_to_required: { - message: "\u81F3\u5C11\u9700\u8981\u9009\u62E9\u4E00\u6761\u5173\u8054\u8BB0\u5F55" - } - }, - label: "\u4EFB\u52A1", - pluralLabel: "\u4EFB\u52A1", - description: "\u6D3B\u52A8\u4E0E\u5F85\u529E\u4E8B\u9879", - fields: { - subject: { label: "\u4E3B\u9898" }, - description: { label: "\u63CF\u8FF0" }, - status: { - label: "\u72B6\u6001", - options: { - not_started: "\u672A\u5F00\u59CB", - in_progress: "\u8FDB\u884C\u4E2D", - waiting: "\u7B49\u5F85\u4E2D", - completed: "\u5DF2\u5B8C\u6210", - deferred: "\u5DF2\u63A8\u8FDF" - } - }, - priority: { - // `urgent` KEEPS 紧急, and ⛔ nothing may re-point it at `crm_case`'s - // top value: the two vocabularies are different sets (task: - // low/normal/high/urgent · case: low/medium/high/critical), so the two - // zh-CN words must stay different or the screen stops distinguishing - // two values the model treats as distinct — the crossing - // `src/sales/views/task.view.ts` carries the tombstone of. Maintainer ruling - // 2026-08-31, #1342: 紧急 stays here (urgent is this object's literal - // word) and case `critical` moved to 严重. - label: "\u4F18\u5148\u7EA7", - options: { low: "\u4F4E", normal: "\u666E\u901A", high: "\u9AD8", urgent: "\u7D27\u6025" } - }, - due_date: { label: "\u622A\u6B62\u65E5\u671F" }, - type: { - label: "\u4EFB\u52A1\u7C7B\u578B", - options: { - call: "\u7535\u8BDD", - email: "\u90AE\u4EF6", - meeting: "\u4F1A\u8BAE", - follow_up: "\u8DDF\u8FDB", - demo: "\u6F14\u793A", - other: "\u5176\u4ED6" - } - }, - reminder_date: { label: "\u63D0\u9192\u65F6\u95F4" }, - completed_date: { label: "\u5B8C\u6210\u65E5\u671F" }, - owner_id: { label: "\u8D1F\u8D23\u4EBA" }, - related_to_type: { - label: "\u5173\u8054\u5BF9\u8C61\u7C7B\u578B", - options: { - crm_account: "\u5BA2\u6237", - crm_contact: "\u8054\u7CFB\u4EBA", - crm_opportunity: "\u5546\u673A", - crm_lead: "\u7EBF\u7D22", - crm_case: "\u5DE5\u5355" - } - }, - related_to_account: { label: "\u5173\u8054\u5BA2\u6237" }, - related_to_contact: { label: "\u5173\u8054\u8054\u7CFB\u4EBA" }, - related_to_opportunity: { label: "\u5173\u8054\u5546\u673A" }, - related_to_lead: { label: "\u5173\u8054\u7EBF\u7D22" }, - related_to_case: { label: "\u5173\u8054\u5DE5\u5355" }, - is_recurring: { label: "\u91CD\u590D\u4EFB\u52A1" }, - recurrence_type: { - label: "\u91CD\u590D\u7C7B\u578B", - options: { daily: "\u6BCF\u65E5", weekly: "\u6BCF\u5468", monthly: "\u6BCF\u6708", yearly: "\u6BCF\u5E74" } - }, - recurrence_interval: { label: "\u91CD\u590D\u95F4\u9694" }, - recurrence_end_date: { label: "\u91CD\u590D\u7ED3\u675F\u65E5\u671F" }, - is_completed: { label: "\u662F\u5426\u5B8C\u6210" }, - is_overdue: { label: "\u662F\u5426\u903E\u671F" }, - progress_percent: { label: "\u8FDB\u5EA6\uFF08%\uFF09" }, - priority_rank: { label: "\u4F18\u5148\u7EA7\u6392\u5E8F" }, - reminder_sent: { label: "\u63D0\u9192\u5DF2\u53D1\u9001" } - }, - _sections: { - basic: { label: "\u4EFB\u52A1\u4FE1\u606F" }, - scheduling: { label: "\u65E5\u7A0B\u5B89\u6392" }, - related: { label: "\u5173\u8054\u8BB0\u5F55" }, - recurrence: { label: "\u91CD\u590D\u89C4\u5219" }, - system: { label: "\u7CFB\u7EDF" }, - effort: { label: "\u8FDB\u5EA6\u4E0E\u5DE5\u65F6" }, - // task.view.ts 表单区块名称 (#1100) - task: { label: "\u4EFB\u52A1" }, - related_records: { label: "\u5173\u8054\u8BB0\u5F55" }, - recurrence_and_effort: { label: "\u91CD\u590D\u4E0E\u5DE5\u65F6" } - }, - _views: { - all_tasks: { label: "\u5168\u90E8\u4EFB\u52A1" }, - task_board: { label: "\u4EFB\u52A1\u770B\u677F" }, - task_calendar: { label: "\u4EFB\u52A1\u65E5\u7A0B" }, - task_gantt: { label: "\u6267\u884C\u8BA1\u5212" }, - task_timeline: { label: "\u5DE5\u65F6\u65F6\u95F4\u7EBF" }, - my_open_tasks: { label: "\u6211\u7684\u5F85\u529E\u4EFB\u52A1" }, - todays_tasks: { label: "\u{1F4C5} \u6211\u7684\u4F18\u5148\u4EFB\u52A1" }, - overdue_tasks: { label: "\u23F0 \u5F85\u529E\u4EFB\u52A1 \xB7 \u6309\u903E\u671F\u65F6\u957F\u6392\u5E8F" } - } - }, - crm_event: { - _validations: { - end_after_start: { - message: "\u7ED3\u675F\u65F6\u95F4\u5FC5\u987B\u665A\u4E8E\u5F00\u59CB\u65F6\u95F4" - }, - related_to_required: { - message: "\u81F3\u5C11\u9700\u8981\u9009\u62E9\u4E00\u6761\u5173\u8054\u8BB0\u5F55" - } - }, - label: "\u6D3B\u52A8", - pluralLabel: "\u6D3B\u52A8", - description: "\u4E0E\u5BA2\u6237\u7684\u4F1A\u8BAE\u3001\u901A\u8BDD\u53CA\u5176\u4ED6\u5DF2\u5B89\u6392\u7684\u4E92\u52A8", - fields: { - subject: { label: "\u4E3B\u9898" }, - description: { label: "\u63CF\u8FF0" }, - type: { - label: "\u6D3B\u52A8\u7C7B\u578B", - options: { - meeting: "\u4F1A\u8BAE", - call: "\u7535\u8BDD", - demo: "\u6F14\u793A", - webinar: "\u7EBF\u4E0A\u7814\u8BA8\u4F1A", - onsite_visit: "\u4E0A\u95E8\u62DC\u8BBF", - other: "\u5176\u4ED6" - } - }, - status: { - label: "\u72B6\u6001", - options: { - planned: "\u5DF2\u8BA1\u5212", - held: "\u5DF2\u4E3E\u884C", - cancelled: "\u5DF2\u53D6\u6D88", - no_show: "\u5BA2\u6237\u672A\u5230" - } - }, - owner_id: { label: "\u8D1F\u8D23\u4EBA" }, - start_datetime: { label: "\u5F00\u59CB\u65F6\u95F4" }, - end_datetime: { label: "\u7ED3\u675F\u65F6\u95F4" }, - all_day: { label: "\u5168\u5929\u6D3B\u52A8" }, - duration_minutes: { label: "\u65F6\u957F\uFF08\u5206\u949F\uFF09" }, - location: { label: "\u5730\u70B9", help: "\u4F1A\u8BAE\u5BA4\u3001\u5730\u5740\u6216\u4F1A\u8BAE\u94FE\u63A5" }, - related_to_type: { - label: "\u5173\u8054\u5BF9\u8C61\u7C7B\u578B", - options: { - crm_account: "\u5BA2\u6237", - crm_contact: "\u8054\u7CFB\u4EBA", - crm_opportunity: "\u5546\u673A", - crm_lead: "\u7EBF\u7D22", - crm_case: "\u5DE5\u5355" - } - }, - related_to_account: { label: "\u5173\u8054\u5BA2\u6237" }, - related_to_contact: { label: "\u5173\u8054\u8054\u7CFB\u4EBA" }, - related_to_opportunity: { label: "\u5173\u8054\u5546\u673A" }, - related_to_lead: { label: "\u5173\u8054\u7EBF\u7D22" }, - related_to_case: { label: "\u5173\u8054\u5DE5\u5355" }, - outcome_notes: { label: "\u4F1A\u540E\u7EAA\u8981", help: "\u8FBE\u6210\u4E86\u4EC0\u4E48\u5171\u8BC6\uFF0C\u4E0B\u4E00\u6B65\u505A\u4EC0\u4E48" } - }, - _sections: { - basic: { label: "\u6D3B\u52A8\u4FE1\u606F" }, - schedule: { label: "\u65E5\u7A0B\u5B89\u6392" }, - related: { label: "\u5173\u8054\u8BB0\u5F55" }, - outcome: { label: "\u7ED3\u679C" }, - // event.view.ts 表单区块名称 (#1100) - event: { label: "\u6D3B\u52A8" }, - related_records: { label: "\u5173\u8054\u8BB0\u5F55" } - }, - _views: { - all_events: { label: "\u5168\u90E8\u6D3B\u52A8" }, - event_calendar: { label: "\u6D3B\u52A8\u65E5\u5386" }, - event_timeline: { label: "\u56E2\u961F\u65E5\u7A0B" }, - my_events: { label: "\u6211\u7684\u65E5\u5386" }, - upcoming_events: { label: "\u{1F4C5} \u5373\u5C06\u5F00\u59CB \xB7 \u6309\u65F6\u95F4\u5347\u5E8F" }, - held_events: { label: "\u2705 \u4E92\u52A8\u5386\u53F2" } - } - }, - crm_event_attendee: { - _validations: { - attendee_resolves: { - message: "\u53C2\u4E0E\u8005\u5FC5\u987B\u586B\u5199\u5176\u53C2\u4E0E\u8005\u7C7B\u578B\u6240\u6307\u7684\u4E00\u65B9\u2014\u2014\u8054\u7CFB\u4EBA\u7C7B\u578B\u9700\u8981\u586B\u5199\u8054\u7CFB\u4EBA\uFF0C\u5916\u90E8\u7C7B\u578B\u9700\u8981\u586B\u5199\u5916\u90E8\u53C2\u4E0E\u8005\u59D3\u540D" - }, - attendee_type_exclusive: { - message: "\u53C2\u4E0E\u8005\u53EA\u80FD\u6307\u5B9A\u4E00\u65B9\u2014\u2014\u8BF7\u6E05\u7A7A\u5176\u53C2\u4E0E\u8005\u7C7B\u578B\u672A\u6307\u660E\u7684\u6240\u6709\u5B57\u6BB5" - } - }, - label: "\u6D3B\u52A8\u53C2\u4E0E\u8005", - pluralLabel: "\u6D3B\u52A8\u53C2\u4E0E\u8005", - description: "\u53D7\u9080\u53C2\u52A0\u6216\u5B9E\u9645\u51FA\u5E2D\u6D3B\u52A8\u7684\u4EBA\u5458", - fields: { - attendee_number: { label: "\u53C2\u4E0E\u8005\u7F16\u53F7" }, - crm_event: { label: "\u6D3B\u52A8" }, - attendee_type: { - label: "\u53C2\u4E0E\u8005\u7C7B\u578B", - options: { contact: "\u8054\u7CFB\u4EBA", lead: "\u7EBF\u7D22", user: "\u5185\u90E8\u7528\u6237", external: "\u5916\u90E8\u6765\u5BBE" } - }, - crm_contact: { label: "\u8054\u7CFB\u4EBA", help: "\u53C2\u4E0E\u8005\u662F\u5DF2\u6709\u5BA2\u6237\u8054\u7CFB\u4EBA\u65F6\u586B\u5199" }, - crm_lead: { label: "\u7EBF\u7D22", help: "\u53C2\u4E0E\u8005\u4ECD\u662F\u672A\u8F6C\u5316\u7EBF\u7D22\u65F6\u586B\u5199" }, - sys_user: { label: "\u5185\u90E8\u7528\u6237", help: "\u53C2\u4E0E\u8005\u662F\u540C\u4E8B\u65F6\u586B\u5199" }, - external_name: { label: "\u5916\u90E8\u53C2\u4E0E\u8005", help: "\u4E0D\u5728\u4EFB\u4F55 CRM \u5BF9\u8C61\u4E2D\u7684\u53C2\u4E0E\u8005\u59D3\u540D\u2014\u2014\u53C2\u4E0E\u8005\u7C7B\u578B\u4E3A\u300C\u5916\u90E8\u6765\u5BBE\u300D\u65F6\u586B\u5199" }, - response: { - label: "\u56DE\u590D", - options: { - no_response: "\u672A\u56DE\u590D", - accepted: "\u5DF2\u63A5\u53D7", - declined: "\u5DF2\u62D2\u7EDD", - tentative: "\u5F85\u5B9A" - } - }, - is_organizer: { label: "\u7EC4\u7EC7\u8005" }, - invited_date: { label: "\u9080\u8BF7\u65F6\u95F4" } - }, - _sections: { - basic: { label: "\u53C2\u4E0E\u8005" }, - response: { label: "\u9080\u8BF7" }, - // event_attendee.view.ts 表单区块名称 (#1100) - attendee: { label: "\u53C2\u4E0E\u8005" }, - invitation: { label: "\u9080\u8BF7" } - }, - _views: { - all_event_attendees: { label: "\u6D3B\u52A8\u53C2\u4E0E\u8005" } - } - } -}; - -// src/sales/translations/zh-CN/objects.marketing.ts -var marketing2 = { - crm_campaign: { - _validations: { - end_after_start: { - message: "\u7ED3\u675F\u65E5\u671F\u5FC5\u987B\u665A\u4E8E\u5F00\u59CB\u65E5\u671F" - }, - actual_cost_within_budget: { - message: "\u5B9E\u9645\u6210\u672C\u8D85\u51FA\u9884\u7B97\u6210\u672C" - } - }, - label: "\u8425\u9500\u6D3B\u52A8", - pluralLabel: "\u8425\u9500\u6D3B\u52A8", - description: "\u5E02\u573A\u8425\u9500\u6D3B\u52A8\u4E0E\u63A8\u5E7F", - fields: { - campaign_code: { label: "\u6D3B\u52A8\u4EE3\u7801" }, - name: { label: "\u6D3B\u52A8\u540D\u79F0" }, - type: { - label: "\u7C7B\u578B", - options: { - email: "\u90AE\u4EF6\u8425\u9500", - webinar: "\u7EBF\u4E0A\u7814\u8BA8\u4F1A", - trade_show: "\u5C55\u4F1A", - conference: "\u884C\u4E1A\u4F1A\u8BAE", - direct_mail: "\u76F4\u90AE", - social_media: "\u793E\u4EA4\u5A92\u4F53", - content: "\u5185\u5BB9\u8425\u9500", - partner: "\u4F19\u4F34\u8054\u5408\u8425\u9500" - } - }, - status: { - label: "\u72B6\u6001", - options: { - planning: "\u89C4\u5212\u4E2D", - in_progress: "\u8FDB\u884C\u4E2D", - completed: "\u5DF2\u5B8C\u6210", - aborted: "\u5DF2\u4E2D\u6B62" - } - }, - start_date: { label: "\u5F00\u59CB\u65E5\u671F" }, - end_date: { label: "\u7ED3\u675F\u65E5\u671F" }, - expected_revenue: { label: "\u9884\u671F\u6536\u5165" }, - description: { label: "\u63CF\u8FF0" }, - channel: { - label: "\u4E3B\u8981\u6E20\u9053", - options: { digital: "\u6570\u5B57\u6E20\u9053", social: "\u793E\u4EA4\u5A92\u4F53", email: "\u90AE\u4EF6", events: "\u7EBF\u4E0B\u6D3B\u52A8", partner: "\u5408\u4F5C\u4F19\u4F34" } - }, - budgeted_cost: { label: "\u9884\u7B97\u6210\u672C" }, - actual_cost: { label: "\u5B9E\u9645\u6210\u672C" }, - actual_revenue: { label: "\u5B9E\u9645\u6536\u5165" }, - target_size: { label: "\u76EE\u6807\u4EBA\u6570", help: "\u76EE\u6807\u7EBF\u7D22/\u8054\u7CFB\u4EBA\u6570\u91CF" }, - num_sent: { label: "\u53D1\u9001\u6570\u91CF" }, - num_responses: { label: "\u54CD\u5E94\u6570\u91CF" }, - num_leads: { label: "\u7EBF\u7D22\u6570\u91CF" }, - num_converted_leads: { label: "\u5DF2\u8F6C\u5316\u7EBF\u7D22\u6570" }, - num_opportunities: { label: "\u5DF2\u521B\u5EFA\u5546\u673A\u6570" }, - num_won_opportunities: { label: "\u5DF2\u8D62\u5F97\u5546\u673A" }, - response_rate: { label: "\u54CD\u5E94\u7387\uFF08%\uFF09" }, - roi: { label: "\u6295\u8D44\u56DE\u62A5\u7387\uFF08%\uFF09" }, - owner_id: { label: "\u6D3B\u52A8\u8D1F\u8D23\u4EBA" }, - landing_page_url: { label: "\u7740\u9646\u9875" }, - is_active: { label: "\u662F\u5426\u542F\u7528" }, - display_title: { label: "\u663E\u793A\u540D\u79F0" } - }, - _sections: { - basic: { label: "\u6D3B\u52A8\u4FE1\u606F" }, - schedule: { label: "\u65E5\u7A0B\u5B89\u6392" }, - budget: { label: "\u9884\u7B97\u4E0E\u6295\u8D44\u56DE\u62A5" }, - metrics: { label: "\u6548\u679C\u6570\u636E" }, - assignment: { label: "\u5F52\u5C5E" }, - assets: { label: "\u6D3B\u52A8\u7D20\u6750" } - }, - _views: { - all_campaigns: { label: "\u5168\u90E8\u8425\u9500\u6D3B\u52A8" }, - campaign_gantt: { label: "\u6D3B\u52A8\u6392\u671F" }, - campaign_calendar: { label: "\u6D3B\u52A8\u65E5\u5386" }, - campaign_timeline: { label: "\u8425\u9500\u65F6\u95F4\u7EBF" } - }, - _actions: { - enroll_leads: { - label: "\u6279\u91CF\u52A0\u5165\u6210\u5458", - successMessage: "\u7B26\u5408\u6761\u4EF6\u7684\u6210\u5458\u5DF2\u52A0\u5165\u8425\u9500\u6D3B\u52A8\u3002" - } - } - }, - crm_campaign_member: { - _validations: { - lead_or_contact_required: { - message: "\u8425\u9500\u6D3B\u52A8\u6210\u5458\u5FC5\u987B\u5173\u8054\u7EBF\u7D22\u6216\u8054\u7CFB\u4EBA\u4E4B\u4E00" - } - }, - // 「营销活动成员」, not 「活动成员」: this object's master is `crm_campaign` - // (营销活动), while 「活动」 is already this pack's label for `crm_event` and - // 「活动参与者」 its child `crm_event_attendee`. Dropping 「营销」 put a - // marketing object inside the calendar family's name space (#810). - label: "\u8425\u9500\u6D3B\u52A8\u6210\u5458", - pluralLabel: "\u8425\u9500\u6D3B\u52A8\u6210\u5458", - description: "\u8425\u9500\u6D3B\u52A8\u6240\u89E6\u8FBE\u7684\u7EBF\u7D22\u4E0E\u8054\u7CFB\u4EBA\u53CA\u5176\u54CD\u5E94\u72B6\u6001", - fields: { - member_number: { label: "\u6210\u5458\u7F16\u53F7" }, - crm_campaign: { label: "\u8425\u9500\u6D3B\u52A8" }, - crm_lead: { label: "\u7EBF\u7D22", help: "\u6210\u5458\u52A0\u5165\u65F6\u8EAB\u4EFD\u4E3A\u7EBF\u7D22\u7684\uFF0C\u8BB0\u5F55\u5728\u6B64" }, - crm_contact: { label: "\u8054\u7CFB\u4EBA", help: "\u6210\u5458\u4E3A\u5DF2\u6709\u8054\u7CFB\u4EBA\u7684\uFF0C\u8BB0\u5F55\u5728\u6B64" }, - status: { - label: "\u72B6\u6001", - options: { - sent: "\u5DF2\u53D1\u9001", - responded: "\u5DF2\u54CD\u5E94", - converted: "\u5DF2\u8F6C\u5316", - unsubscribed: "\u5DF2\u9000\u8BA2" - } - }, - added_date: { label: "\u52A0\u5165\u65F6\u95F4" }, - response_date: { label: "\u54CD\u5E94\u65F6\u95F4" }, - has_responded: { label: "\u5DF2\u54CD\u5E94" } - }, - _sections: { - basic: { label: "\u57FA\u672C\u4FE1\u606F" }, - response: { label: "\u54CD\u5E94\u8DDF\u8E2A" } - }, - _actions: { - mark_responded: { - label: "\u6807\u8BB0\u4E3A\u5DF2\u54CD\u5E94", - successMessage: "\u5DF2\u8BB0\u5F55\u8BE5\u8425\u9500\u6D3B\u52A8\u6210\u5458\u7684\u54CD\u5E94\u3002" - } - } - } -}; - -// src/sales/translations/zh-CN.ts -var zhCN2 = { - objects: { - crm_account: customer2.crm_account, - crm_contact: customer2.crm_contact, - crm_knowledge_article: service2.crm_knowledge_article, - crm_forecast: pipeline2.crm_forecast, - crm_lead: pipeline2.crm_lead, - crm_quote: commerce2.crm_quote, - crm_contract: commerce2.crm_contract, - crm_case: service2.crm_case, - crm_task: activity2.crm_task, - crm_campaign: marketing2.crm_campaign, - crm_product: commerce2.crm_product, - crm_opportunity: pipeline2.crm_opportunity, - crm_event: activity2.crm_event, - crm_event_attendee: activity2.crm_event_attendee, - crm_article_feedback: service2.crm_article_feedback, - crm_campaign_member: marketing2.crm_campaign_member, - crm_opportunity_line_item: pipeline2.crm_opportunity_line_item, - crm_quote_line_item: commerce2.crm_quote_line_item - }, - ...appSurface2 -}; - -// src/sales/translations/ja-JP/app.ts -var appSurface3 = { - apps: { - crm_enterprise: { - label: "HotCRM", - description: "\u55B6\u696D\u30FB\u30B5\u30FC\u30D3\u30B9\u30FB\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0\u5411\u3051\u9867\u5BA2\u95A2\u4FC2\u7BA1\u7406\u30B7\u30B9\u30C6\u30E0", - // Keyed by navigation-node `id` (a flat keyspace regardless of depth). - navigation: { - nav_home: { label: "\u30DB\u30FC\u30E0" }, - group_sales: { label: "\u55B6\u696D" }, - nav_lead: { label: "\u30EA\u30FC\u30C9" }, - nav_account: { label: "\u53D6\u5F15\u5148" }, - nav_account_workbench: { label: "\u53D6\u5F15\u5148\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1" }, - nav_contact: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, - nav_opportunity: { label: "\u5546\u8AC7" }, - nav_quote: { label: "\u898B\u7A4D" }, - nav_contract: { label: "\u5951\u7D04" }, - nav_product: { label: "\u88FD\u54C1" }, - nav_sales_dashboard: { label: "\u55B6\u696D\u5B9F\u7E3E" }, - group_work: { label: "\u30DE\u30A4\u30EF\u30FC\u30AF" }, - nav_my_tasks: { label: "\u79C1\u306E\u30BF\u30B9\u30AF" }, - nav_my_deals: { label: "\u79C1\u306E\u5546\u8AC7" }, - nav_my_leads: { label: "\u79C1\u306E\u30EA\u30FC\u30C9" }, - nav_my_cases: { label: "\u79C1\u306E\u30B1\u30FC\u30B9" }, - nav_my_calendar: { label: "\u30DE\u30A4\u30AB\u30EC\u30F3\u30C0\u30FC" }, - nav_approval_requests: { label: "\u53D7\u4FE1\u30C8\u30EC\u30A4" }, - group_activity: { label: "\u6D3B\u52D5" }, - nav_event: { label: "\u30A4\u30D9\u30F3\u30C8" }, - nav_activity_dashboard: { label: "\u55B6\u696D\u6D3B\u52D5" }, - group_marketing: { label: "\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0" }, - nav_campaign: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" }, - group_service: { label: "\u30B5\u30FC\u30D3\u30B9" }, - nav_case: { label: "\u30B1\u30FC\u30B9" }, - nav_knowledge: { label: "\u30CA\u30EC\u30C3\u30B8\u30D9\u30FC\u30B9" }, - nav_service_dashboard: { label: "\u30B5\u30FC\u30D3\u30B9\u6982\u8981" }, - group_insights: { label: "\u30A4\u30F3\u30B5\u30A4\u30C8" }, - nav_crm_dashboard: { label: "CRM \u6982\u8981" }, - nav_forecast: { label: "\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8" }, - nav_report_pipeline_coverage: { label: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u30AB\u30D0\u30EC\u30C3\u30B8" }, - nav_report_lead_inflow: { label: "\u30EA\u30FC\u30C9\u6D41\u5165" }, - nav_report_sla: { label: "SLA \u5B9F\u7E3E" } - } - } - }, - messages: { - "common.save": "\u4FDD\u5B58", - "common.cancel": "\u30AD\u30E3\u30F3\u30BB\u30EB", - "common.delete": "\u524A\u9664", - "common.edit": "\u7DE8\u96C6", - "common.create": "\u65B0\u898F\u4F5C\u6210", - "common.search": "\u691C\u7D22", - "common.filter": "\u30D5\u30A3\u30EB\u30BF\u30FC", - "common.export": "\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8", - "common.back": "\u623B\u308B", - "common.confirm": "\u78BA\u8A8D", - "nav.sales": "\u55B6\u696D", - "nav.service": "\u30B5\u30FC\u30D3\u30B9", - "nav.marketing": "\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0", - "nav.products": "\u88FD\u54C1", - "nav.analytics": "\u30A2\u30CA\u30EA\u30C6\u30A3\u30AF\u30B9", - "success.saved": "\u30EC\u30B3\u30FC\u30C9\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F", - "success.converted": "\u30EA\u30FC\u30C9\u3092\u5909\u63DB\u3057\u307E\u3057\u305F", - "confirm.delete": "\u3053\u306E\u30EC\u30B3\u30FC\u30C9\u3092\u524A\u9664\u3057\u3066\u3082\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F", - "confirm.convert_lead": "\u3053\u306E\u30EA\u30FC\u30C9\u3092\u53D6\u5F15\u5148\u30FB\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u30FB\u5546\u8AC7\u306B\u5909\u63DB\u3057\u307E\u3059\u304B\uFF1F", - "error.required": "\u3053\u306E\u9805\u76EE\u306F\u5FC5\u9808\u3067\u3059", - "error.load_failed": "\u30C7\u30FC\u30BF\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F" - }, - dashboards: { - sales_activity_dashboard: { - label: "\u55B6\u696D\u6D3B\u52D5", - description: "\u8AB0\u304C\u3069\u308C\u3060\u3051\u9867\u5BA2\u3068\u8A71\u3057\u3066\u3044\u308B\u304B\u3001\u3069\u306E\u53D6\u5F15\u5148\u304C\u6C88\u9ED9\u3057\u3066\u3044\u308B\u304B", - widgets: { - interactions_held: { title: "\u8A18\u9332\u6E08\u307F\u306E\u5BFE\u8A71", description: "\u5B9F\u969B\u306B\u884C\u308F\u308C\u305F\u96FB\u8A71\u3068\u4F1A\u8B70" }, - meetings_booked: { title: "\u8A2D\u5B9A\u6E08\u307F\u306E\u4F1A\u8B70", description: "\u30AB\u30EC\u30F3\u30C0\u30FC\u4E0A\u306B\u3042\u308A\u672A\u5B9F\u65BD\u306E\u4F1A\u8B70" }, - customer_minutes: { title: "\u9867\u5BA2\u63A5\u89E6\u6642\u9593\uFF08\u5206\uFF09", description: "\u9867\u5BA2\u3068\u5411\u304D\u5408\u3063\u305F\u7DCF\u6642\u9593" }, - tasks_completed: { title: "\u5B8C\u4E86\u30BF\u30B9\u30AF", description: "\u30AF\u30ED\u30FC\u30BA\u3057\u305F\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7" }, - activity_by_rep: { title: "\u62C5\u5F53\u8005\u5225\u306E\u6D3B\u52D5", description: "\u62C5\u5F53\u8005\u3054\u3068\u306E\u8A18\u9332\u6E08\u307F\u5BFE\u8A71\u6570" }, - activity_by_week: { title: "\u9031\u6B21\u306E\u6D3B\u52D5\u91CF", description: "\u9031\u3042\u305F\u308A\u306E\u5BFE\u8A71\u6570" }, - activity_mix: { title: "\u6D3B\u52D5\u306E\u5185\u8A33", description: "\u96FB\u8A71\u30FB\u4F1A\u8B70\u30FB\u30C7\u30E2\u306E\u6BD4\u7387" }, - activity_by_record_type: { title: "\u6D3B\u52D5\u306E\u5BFE\u8C61", description: "\u30D5\u30A1\u30CD\u30EB\u306E\u3069\u3053\u306B\u6CE8\u529B\u3057\u3066\u3044\u308B\u304B" }, - deal_activity: { title: "\u5546\u8AC7\u4E0A\u306E\u5BFE\u8A71", description: "\u5546\u8AC7\u306B\u7D10\u3065\u304F\u8A18\u9332\u6E08\u307F\u5BFE\u8A71" }, - open_deals_for_activity: { title: "\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7", description: "\u9032\u884C\u4E2D\u306E\u5546\u8AC7\u6570" }, - quiet_accounts_30: { title: "30 \u65E5\u4EE5\u4E0A\u6C88\u9ED9", description: "1 \u304B\u6708\u9593\u5BFE\u8A71\u8A18\u9332\u306E\u306A\u3044\u30A2\u30AF\u30C6\u30A3\u30D6\u53D6\u5F15\u5148" }, - quiet_accounts_60: { title: "60 \u65E5\u4EE5\u4E0A\u6C88\u9ED9", description: "2 \u304B\u6708\u306E\u6C88\u9ED9 \u2014 \u30EA\u30B9\u30AF\u95BE\u5024" }, - quiet_accounts_90: { title: "90 \u65E5\u4EE5\u4E0A\u6C88\u9ED9", description: "\u56DB\u534A\u671F\u306B\u308F\u305F\u308A\u63A5\u89E6\u306A\u3057" } - } - }, - crm_overview_dashboard: { - label: "CRM \u6982\u8981", - description: "\u58F2\u4E0A\u6307\u6A19\u3001\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u5206\u6790\u3001\u5546\u8AC7\u30A4\u30F3\u30B5\u30A4\u30C8", - widgets: { - total_revenue: { title: "\u7DCF\u58F2\u4E0A", description: "\u5F53\u671F\u306E\u6210\u7ACB\u6E08\u307F\u58F2\u4E0A" }, - active_deals: { title: "\u9032\u884C\u4E2D\u306E\u5546\u8AC7", description: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u4E0A\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7" }, - won_deals: { title: "\u6210\u7ACB\u5546\u8AC7\u6570", description: "\u5F53\u671F\u306B\u6210\u7ACB\u3057\u305F\u5546\u8AC7\u306E\u7DCF\u6570" }, - avg_deal_size: { title: "\u5E73\u5747\u5546\u8AC7\u898F\u6A21", description: "\u6210\u7ACB\u6E08\u307F\u5546\u8AC7\u306E\u5E73\u5747\u91D1\u984D" }, - revenue_trends: { title: "\u58F2\u4E0A\u30C8\u30EC\u30F3\u30C9", description: "\u904E\u53BB12\u304B\u6708\u306E\u6210\u7ACB\u6E08\u307F\u58F2\u4E0A" }, - lead_source: { title: "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9", description: "\u7372\u5F97\u30C1\u30E3\u30CD\u30EB\u5225\u306E\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u91D1\u984D" }, - pipeline_by_stage: { title: "\u30B9\u30C6\u30FC\u30B8\u5225\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", description: "\u5404\u55B6\u696D\u30B9\u30C6\u30FC\u30B8\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u91D1\u984D" }, - top_products: { title: "\u58F2\u308C\u7B4B\u88FD\u54C1", description: "\u88FD\u54C1\u30AB\u30C6\u30B4\u30EA\u5225\u306E\u5B9A\u4FA1\u30D9\u30FC\u30B9\u58F2\u4E0A" }, - pipeline_by_owner: { title: "\u62C5\u5F53\u8005\u5225\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", description: "\u55B6\u696D\u62C5\u5F53\u8005\u3054\u3068\u306E\u30AA\u30FC\u30D7\u30F3\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u91D1\u984D\u3068\u5546\u8AC7\u6570" } - } - }, - executive_dashboard: { - label: "\u30A8\u30B0\u30BC\u30AF\u30C6\u30A3\u30D6\u6982\u8981", - description: "\u7D4C\u55B6\u5C64\u5411\u3051\u306E\u58F2\u4E0A\u30FB\u9867\u5BA2\u30FB\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u306E\u4E3B\u8981KPI", - widgets: { - total_revenue_ytd: { title: "\u5E74\u5EA6\u7D2F\u8A08\u58F2\u4E0A", description: "\u672C\u5E74\u5EA6\u306E\u6210\u7ACB\u6E08\u307F\u58F2\u4E0A" }, - total_accounts: { title: "\u30A2\u30AF\u30C6\u30A3\u30D6\u53D6\u5F15\u5148", description: "\u5C11\u306A\u304F\u3068\u30821\u3064\u306E\u6709\u52B9\u306A\u95A2\u4FC2\u3092\u6301\u3064\u9867\u5BA2" }, - total_contacts: { title: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u6570", description: "\u540D\u7C3F\u306B\u767B\u9332\u3055\u308C\u305F\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, - open_leads: { title: "\u30AA\u30FC\u30D7\u30F3\u30EA\u30FC\u30C9", description: "\u672A\u5909\u63DB\u306E\u30EA\u30FC\u30C9" }, - revenue_trend: { title: "\u58F2\u4E0A\u30C8\u30EC\u30F3\u30C9", description: "\u904E\u53BB12\u304B\u6708\u306E\u6210\u7ACB\u6E08\u307F\u58F2\u4E0A" }, - revenue_by_industry: { title: "\u696D\u7A2E\u5225\u58F2\u4E0A", description: "\u672C\u5E74\u5EA6\u306E\u6210\u7ACB\u6E08\u307F\u58F2\u4E0A\u3092\u696D\u7A2E\u5225\u306B\u5206\u985E" }, - pipeline_by_stage: { title: "\u30B9\u30C6\u30FC\u30B8\u5225\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", description: "\u5404\u55B6\u696D\u30B9\u30C6\u30FC\u30B8\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u91D1\u984D" }, - new_accounts_by_month: { title: "\u65B0\u898F\u53D6\u5F15\u5148", description: "\u904E\u53BB6\u304B\u6708\u306E\u53D6\u5F15\u5148\u4F5C\u6210\u30DA\u30FC\u30B9" }, - accounts_by_industry: { title: "\u696D\u7A2E\u5225\u53D6\u5F15\u5148", description: "\u696D\u7A2E\u3054\u3068\u306E\u5E74\u9593\u58F2\u4E0A\u5408\u8A08\u3068\u53D6\u5F15\u5148\u6570" } - } - }, - sales_dashboard: { - label: "\u55B6\u696D\u5B9F\u7E3E", - description: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u5206\u6790\u3001\u52DD\u7387\u30C8\u30EC\u30F3\u30C9\u3001\u62C5\u5F53\u8005\u5225\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9", - widgets: { - total_pipeline_value: { title: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u5408\u8A08", description: "\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u91D1\u984D\u306E\u5408\u8A08" }, - closed_won_qtd: { title: "\u4ECA\u56DB\u534A\u671F\u6210\u7ACB\u984D", description: "\u4ECA\u56DB\u534A\u671F\u306B\u6210\u7ACB\u3057\u305F\u58F2\u4E0A" }, - open_opportunities: { title: "\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7", description: "\u9032\u884C\u4E2D\u306E\u30A2\u30AF\u30C6\u30A3\u30D6\u5546\u8AC7" }, - avg_deal_size: { title: "\u5E73\u5747\u5546\u8AC7\u898F\u6A21", description: "\u4ECA\u56DB\u534A\u671F\u306E\u6210\u7ACB\u6E08\u307F\u5546\u8AC7\u306E\u5E73\u5747\u91D1\u984D" }, - pipeline_by_stage: { title: "\u30B9\u30C6\u30FC\u30B8\u5225\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", description: "\u5404\u55B6\u696D\u30B9\u30C6\u30FC\u30B8\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u91D1\u984D" }, - monthly_revenue_trend: { title: "\u6708\u6B21\u58F2\u4E0A\u30C8\u30EC\u30F3\u30C9", description: "\u904E\u53BB12\u304B\u6708\u306E\u6210\u7ACB\u6E08\u307F\u58F2\u4E0A" }, - pipeline_by_forecast_category: { title: "\u4E88\u6E2C\u30AB\u30C6\u30B4\u30EA\u5225\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", description: "\u58F2\u4E0A\u4E88\u6E2C\u30AB\u30C6\u30B4\u30EA\u5225\u306E\u30AA\u30FC\u30D7\u30F3\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u91D1\u984D" }, - lead_source_breakdown: { title: "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9", description: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u306E\u6D41\u5165\u5143" }, - open_pipeline_by_owner: { title: "\u62C5\u5F53\u8005\u5225\u30AA\u30FC\u30D7\u30F3\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", description: "\u55B6\u696D\u62C5\u5F53\u8005\u3054\u3068\u306E\u9032\u884C\u4E2D\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u91D1\u984D\u30FB\u5546\u8AC7\u6570\u30FB\u5E73\u5747\u52DD\u7387" }, - quota_attainment_by_rep: { title: "\u62C5\u5F53\u8005\u5225\u30CE\u30EB\u30DE\u9054\u6210\u72B6\u6CC1", description: "\u4E88\u6E2C\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u306B\u57FA\u3065\u304F\u62C5\u5F53\u8005\u5225\u306E\u4ECA\u56DB\u534A\u671F\u30CE\u30EB\u30DE\u30FB\u6210\u7D04\u53CE\u76CA\u30FB\u9054\u6210\u7387" }, - pipeline_stage_by_source: { title: "\u30B9\u30C6\u30FC\u30B8 \xD7 \u30EA\u30FC\u30C9\u30BD\u30FC\u30B9", description: "\u30B9\u30C6\u30FC\u30B8\u3068\u30BD\u30FC\u30B9\u5225\u306E\u9032\u884C\u4E2D\u5546\u8AC7\u91D1\u984D\u306E\u30AF\u30ED\u30B9\u96C6\u8A08" }, - win_rate_12m: { title: "\u52DD\u7387\uFF08\u76F4\u8FD112\u304B\u6708\uFF09", description: "\u76F4\u8FD112\u304B\u6708\u306B\u6C7A\u7740\u3057\u305F\u5546\u8AC7\u306E\u3046\u3061\u6210\u7ACB\u3057\u305F\u5272\u5408" }, - won_deals_12m: { title: "\u6210\u7ACB\u5546\u8AC7\u6570\uFF08\u76F4\u8FD112\u304B\u6708\uFF09", description: "\u52DD\u7387\u306E\u5206\u5B50" }, - lost_deals_12m: { title: "\u5931\u6CE8\u5546\u8AC7\u6570\uFF08\u76F4\u8FD112\u304B\u6708\uFF09", description: "\u52DD\u7387\u306E\u5206\u6BCD\u306E\u3082\u3046\u534A\u5206" }, - win_rate_by_owner: { title: "\u62C5\u5F53\u8005\u5225 \u53D7\u6CE8\uFF0F\u5931\u6CE8", description: "\u76F4\u8FD112\u304B\u6708\u306E\u62C5\u5F53\u8005\u3054\u3068\u306E\u6210\u7ACB\u6570\u30FB\u5931\u6CE8\u6570\u30FB\u52DD\u7387" }, - win_rate_by_lead_source: { title: "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9\u5225 \u53D7\u6CE8\uFF0F\u5931\u6CE8", description: "\u5B9F\u969B\u306B\u6210\u7ACB\u306B\u3064\u306A\u304C\u308B\u306E\u306F\u3069\u306E\u30BD\u30FC\u30B9\u304B \u2014 \u76F4\u8FD112\u304B\u6708" }, - loss_reason_breakdown: { title: "\u5931\u6CE8\u306E\u7406\u7531", description: "\u76F4\u8FD112\u304B\u6708\u306E\u5931\u6CE8\u5546\u8AC7\u3092\u7406\u7531\u5225\u306B\u96C6\u8A08" } - } - }, - service_dashboard: { - label: "\u30AB\u30B9\u30BF\u30DE\u30FC\u30B5\u30FC\u30D3\u30B9", - description: "\u30B1\u30FC\u30B9\u8CA0\u8377\u3001SLA\u5065\u5168\u6027\u3001\u89E3\u6C7A\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9", - widgets: { - open_cases: { title: "\u30AA\u30FC\u30D7\u30F3\u30B1\u30FC\u30B9", description: "\u307E\u3060\u30AF\u30ED\u30FC\u30BA\u3055\u308C\u3066\u3044\u306A\u3044\u30B1\u30FC\u30B9" }, - critical_cases: { title: "\u91CD\u5927\u30B1\u30FC\u30B9", description: "\u512A\u5148\u5EA6\u300C\u91CD\u5927\u300D\u306E\u30AA\u30FC\u30D7\u30F3\u30B1\u30FC\u30B9" }, - avg_resolution_time: { title: "\u5E73\u5747\u89E3\u6C7A\u6642\u9593", description: "\u30AF\u30ED\u30FC\u30BA\u307E\u3067\u306E\u5E73\u5747\u6642\u9593\uFF08\u6642\uFF09" }, - sla_violations: { title: "SLA \u9055\u53CD", description: "SLA \u3092\u8D85\u904E\u3057\u305F\u30B1\u30FC\u30B9" }, - cases_by_status: { title: "\u30B9\u30C6\u30FC\u30BF\u30B9\u5225\u30B1\u30FC\u30B9", description: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u5168\u4F53\u306E\u30EF\u30FC\u30AF\u30ED\u30FC\u30C9\u5206\u5E03" }, - cases_by_priority: { title: "\u512A\u5148\u5EA6\u5225\u30B1\u30FC\u30B9", description: "\u7DCA\u6025\u5EA6\u5225\u306E\u30AA\u30FC\u30D7\u30F3\u30B1\u30FC\u30B9\u69CB\u6210" }, - cases_by_origin: { title: "\u767A\u751F\u6E90\u5225\u30B1\u30FC\u30B9", description: "\u30B1\u30FC\u30B9\u306E\u6D41\u5165\u30C1\u30E3\u30CD\u30EB" }, - daily_case_volume: { title: "\u65E5\u6B21\u30B1\u30FC\u30B9\u4EF6\u6570", description: "\u904E\u53BB30\u65E5\u9593\u306E\u65B0\u898F\u30B1\u30FC\u30B9" }, - sla_compliance_gauge: { title: "SLA \u9054\u6210\u7387", description: "\u5F53\u671F SLA \u5185\u306B\u89E3\u6C7A\u3057\u305F\u30B1\u30FC\u30B9\u306E\u5272\u5408" }, - kb_deflection_rate: { title: "\u30CA\u30EC\u30C3\u30B8\u89E3\u6C7A\u7387", description: "\u30AF\u30ED\u30FC\u30BA\u3057\u305F\u30B1\u30FC\u30B9\u306E\u3046\u3061\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B\u3067\u89E3\u6C7A\u3057\u305F\u5272\u5408" }, - kb_resolved_cases: { title: "\u30CA\u30EC\u30C3\u30B8\u3067\u89E3\u6C7A", description: "\u89E3\u6C7A\u3057\u305F\u8A18\u4E8B\u304C\u7D10\u3065\u304F\u30AF\u30ED\u30FC\u30BA\u6E08\u307F\u30B1\u30FC\u30B9" }, - closed_cases_total: { title: "\u30AF\u30ED\u30FC\u30BA\u6E08\u307F\u30B1\u30FC\u30B9", description: "\u30CA\u30EC\u30C3\u30B8\u89E3\u6C7A\u7387\u306E\u5206\u6BCD" }, - top_resolving_articles: { title: "\u89E3\u6C7A\u4EF6\u6570\u306E\u591A\u3044\u8A18\u4E8B", description: "\u89E3\u6C7A\u3057\u305F\u30AF\u30ED\u30FC\u30BA\u6E08\u307F\u30B1\u30FC\u30B9\u6570\u3067\u4E26\u3079\u305F\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B" }, - my_open_cases_by_priority: { title: "\u512A\u5148\u5EA6\u5225\u306E\u79C1\u306E\u30AA\u30FC\u30D7\u30F3\u30B1\u30FC\u30B9", description: "\u3042\u306A\u305F\u306E\u30AA\u30FC\u30D7\u30F3\u30B1\u30FC\u30B9\u3068\u305D\u306ESLA\u9055\u53CD\u7387\u3092\u512A\u5148\u5EA6\u5225\u306B\u96C6\u8A08" } - } - } - }, - // `title` / `subtitle` translate the page's `page:header`; `title` falls back - // to `label` when omitted, so it is authored only where the two differ. - // Header strings carrying `{field}` tokens keep the token spelling verbatim — - // the console substitutes on the raw key, so a translated token resolves to - // nothing and the header renders blank. - datasets: { - account_metrics: { - label: "\u53D6\u5F15\u5148\u6307\u6A19", - description: "\u696D\u7A2E\u30FB\u7A2E\u5225\u3054\u3068\u306B\u53D6\u5F15\u5148\u6570\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", - dimensions: { - industry: { - label: "\u696D\u7A2E" - }, - type: { - label: "\u7A2E\u5225" - }, - created_at: { - label: "\u4F5C\u6210\u65E5" - } - }, - measures: { - account_count: { - label: "\u53D6\u5F15\u5148\u6570" - }, - annual_revenue_sum: { - label: "\u5E74\u9593\u58F2\u4E0A" - } - } - }, - case_metrics: { - label: "\u30B1\u30FC\u30B9\u6307\u6A19", - description: "\u30B1\u30FC\u30B9\u6570\u30FB\u89E3\u6C7A\u6642\u9593\u30FBSLA \u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", - dimensions: { - created_at: { - label: "\u4F5C\u6210\u65E5" - }, - origin: { - label: "\u767A\u751F\u5143" - }, - priority: { - label: "\u512A\u5148\u5EA6" - }, - resolved_article: { - label: "\u89E3\u6C7A\u306B\u4F7F\u7528\u3057\u305F\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B" - }, - status: { - label: "\u30B9\u30C6\u30FC\u30BF\u30B9" - }, - type: { - label: "\u7A2E\u5225" - } - }, - measures: { - avg_resolution: { - label: "\u5E73\u5747\u89E3\u6C7A\u6642\u9593\uFF08\u6642\u9593\uFF09" - }, - avg_sla_violated: { - label: "SLA \u9055\u53CD\u7387" - }, - case_count: { - label: "\u30B1\u30FC\u30B9\u6570" - }, - closed_count: { - label: "\u30AF\u30ED\u30FC\u30BA\u6E08\u307F\u30B1\u30FC\u30B9" - }, - kb_deflection_rate: { - label: "\u30CA\u30EC\u30C3\u30B8\u30D9\u30FC\u30B9\u81EA\u5DF1\u89E3\u6C7A\u7387" - }, - kb_resolved_count: { - label: "\u30CA\u30EC\u30C3\u30B8\u30D9\u30FC\u30B9\u3067\u89E3\u6C7A\u3057\u305F\u4EF6\u6570" - }, - sla_compliance_rate: { - label: "SLA \u9075\u5B88\u7387" - }, - sla_met_count: { - label: "SLA \u3092\u6E80\u305F\u3057\u305F\u30B1\u30FC\u30B9" - } - } - }, - contact_metrics: { - label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u6307\u6A19", - description: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u6570\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", - measures: { - contact_count: { - label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u6570" - } - } - }, - event_metrics: { - label: "\u6D3B\u52D5\u6307\u6A19", - description: "\u4F1A\u8B70\u30FB\u901A\u8A71\u30FB\u63A5\u89E6\u306E\u65B0\u3057\u3055\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", - dimensions: { - owner: { - label: "\u6240\u6709\u8005" - }, - related_to_type: { - label: "\u95A2\u9023\u5148" - }, - start_datetime: { - label: "\u6D3B\u52D5\u9031" - }, - status: { - label: "\u30B9\u30C6\u30FC\u30BF\u30B9" - }, - type: { - label: "\u6D3B\u52D5\u7A2E\u5225" - } - }, - measures: { - avg_minutes: { - label: "\u5E73\u5747\u6240\u8981\u6642\u9593" - }, - event_count: { - label: "\u6D3B\u52D5\u4EF6\u6570" - }, - total_minutes: { - label: "\u5408\u8A08\u5206\u6570" - } - } - }, - forecast_metrics: { - label: "\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8\u6307\u6A19", - description: "\u62C5\u5F53\u8005\u3054\u3068\u306E\u76EE\u6A19\u30FB\u9054\u6210\u7387\u30FB\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u30AB\u30D0\u30EC\u30C3\u30B8\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", - dimensions: { - owner: { - label: "\u6240\u6709\u8005" - }, - period: { - label: "\u671F\u9593\u7A2E\u5225" - }, - period_label: { - label: "\u671F\u9593" - }, - period_start: { - label: "\u671F\u9593\u958B\u59CB" - } - }, - measures: { - attainment: { - label: "\u9054\u6210\u7387" - }, - closed_sum: { - label: "\u30AF\u30ED\u30FC\u30BA\u6E08\u307F" - }, - commit_sum: { - label: "\u30B3\u30DF\u30C3\u30C8" - }, - pipeline_sum: { - label: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3" - }, - quota_sum: { - label: "\u76EE\u6A19" - } - } - }, - lead_metrics: { - label: "\u30EA\u30FC\u30C9\u6307\u6A19", - description: "\u30EA\u30FC\u30C9\u6570\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", - dimensions: { - created_at: { - label: "\u4F5C\u6210\u65E5" - }, - last_contacted_date: { - label: "\u6700\u7D42\u63A5\u89E6\u65E5" - }, - lead_source: { - label: "\u30BD\u30FC\u30B9" - }, - status: { - label: "\u30B9\u30C6\u30FC\u30BF\u30B9" - } - }, - measures: { - lead_count: { - label: "\u30EA\u30FC\u30C9\u6570" - } - } - }, - opportunity_metrics: { - label: "\u5546\u8AC7\u6307\u6A19", - description: "\u55B6\u696D\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u306E\u4EF6\u6570\u3068\u91D1\u984D\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", - dimensions: { - account_industry: { - label: "\u53D6\u5F15\u5148\u306E\u696D\u7A2E" - }, - close_date: { - label: "\u5B8C\u4E86\u4E88\u5B9A\u65E5" - }, - close_quarter: { - label: "\u5B8C\u4E86\u56DB\u534A\u671F" - }, - forecast_category: { - label: "\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8\u533A\u5206" - }, - lead_source: { - label: "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9" - }, - loss_reason: { - label: "\u5931\u6CE8\u7406\u7531" - }, - owner: { - label: "\u6240\u6709\u8005" - }, - stage: { - label: "\u30B9\u30C6\u30FC\u30B8" - }, - type: { - label: "\u5546\u8AC7\u7A2E\u5225" - }, - win_reason: { - label: "\u53D7\u6CE8\u7406\u7531" - } - }, - measures: { - avg_amount: { - label: "\u5E73\u5747\u5546\u8AC7\u91D1\u984D" - }, - avg_probability: { - label: "\u5E73\u5747\u78BA\u5EA6" - }, - decided_count: { - label: "\u6C7A\u7740\u3057\u305F\u5546\u8AC7" - }, - lost_amount: { - label: "\u5931\u6CE8\u91D1\u984D" - }, - lost_count: { - label: "\u5931\u6CE8\u4EF6\u6570" - }, - opp_count: { - label: "\u5546\u8AC7\u6570" - }, - total_amount: { - label: "\u5408\u8A08\u91D1\u984D" - }, - win_rate: { - label: "\u53D7\u6CE8\u7387" - }, - won_amount: { - label: "\u53D7\u6CE8\u91D1\u984D" - }, - won_count: { - label: "\u53D7\u6CE8\u4EF6\u6570" - } - } - }, - product_metrics: { - label: "\u88FD\u54C1\u6307\u6A19", - description: "\u88FD\u54C1\u30AB\u30BF\u30ED\u30B0\u306E\u4EF6\u6570\u3068\u5B9A\u4FA1\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", - dimensions: { - category: { - label: "\u30AB\u30C6\u30B4\u30EA" - } - }, - measures: { - list_price_sum: { - label: "\u5B9A\u4FA1\u5408\u8A08" - }, - product_count: { - label: "\u88FD\u54C1\u6570" - } - } - }, - task_metrics: { - label: "\u30BF\u30B9\u30AF\u6307\u6A19", - description: "\u30BF\u30B9\u30AF\u306E\u4F5C\u696D\u91CF\u3068\u5B8C\u4E86\u72B6\u6CC1\u3092\u96C6\u8A08\u3059\u308B\u30BB\u30DE\u30F3\u30C6\u30A3\u30C3\u30AF\u30EC\u30A4\u30E4\u30FC", - dimensions: { - due_date: { - label: "\u671F\u9650" - }, - is_completed: { - label: "\u5B8C\u4E86\u6E08\u307F" - }, - is_overdue: { - label: "\u671F\u9650\u8D85\u904E" - }, - priority: { - label: "\u512A\u5148\u5EA6" - }, - priority_rank: { - label: "\u7DCA\u6025\u5EA6" - }, - status: { - label: "\u30B9\u30C6\u30FC\u30BF\u30B9" - }, - type: { - label: "\u7A2E\u5225" - } - }, - measures: { - avg_progress: { - label: "\u5E73\u5747\u9032\u6357" - }, - task_count: { - label: "\u30BF\u30B9\u30AF\u6570" - } - } - } - }, - pages: { - account_detail_page: { - label: "\u53D6\u5F15\u5148\u8A73\u7D30", - description: "\u30B9\u30ED\u30C3\u30C8\u69CB\u6210\u306E\u53D6\u5F15\u5148\u30EC\u30B3\u30FC\u30C9\u30DA\u30FC\u30B8 \u2014 \u30AB\u30B9\u30BF\u30E0\u30D8\u30C3\u30C0\u30FC\u3068\u5E38\u8A2D\u306E\u30C7\u30A3\u30B9\u30AB\u30C3\u30B7\u30E7\u30F3\u30D5\u30A3\u30FC\u30C9\u3002", - title: "{name}", - subtitle: "{industry} \xB7 {type}", - components: { - account_chatter: { label: "\u30C7\u30A3\u30B9\u30AB\u30C3\u30B7\u30E7\u30F3" } - } - }, - account_workbench: { - label: "\u53D6\u5F15\u5148\u30EF\u30FC\u30AF\u30D9\u30F3\u30C1", - description: "\u55B6\u696D\u30C1\u30FC\u30E0\u5411\u3051\u306B\u53B3\u9078\u3057\u305F\u53D6\u5F15\u5148\u30EA\u30B9\u30C8\u3002\u30AF\u30A4\u30C3\u30AF\u30D5\u30A3\u30EB\u30BF\u30FC\u306E\u307F\u3067\u3001\u30D3\u30E5\u30FC\u7BA1\u7406\u306F\u884C\u3044\u307E\u305B\u3093\u3002" - }, - app_launcher_page: { - label: "\u30A2\u30D7\u30EA\u30E9\u30F3\u30C1\u30E3\u30FC", - description: "\u3059\u3079\u3066\u306E\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u306B\u30A2\u30AF\u30BB\u30B9\u3059\u308B\u305F\u3081\u306E\u7D71\u5408\u30CF\u30D6", - subtitle: "\u958B\u59CB\u3059\u308B\u30A2\u30D7\u30EA\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044", - components: { - app_search: { label: "\u30A2\u30D7\u30EA\u3092\u691C\u7D22" }, - app_grid: { label: "\u30A2\u30D7\u30EA\u30B0\u30EA\u30C3\u30C9" } - } - }, - case_detail_page: { - label: "\u30B1\u30FC\u30B9\u8A73\u7D30", - description: "\u30B5\u30FC\u30D3\u30B9\u62C5\u5F53\u8005\u5411\u3051\u306E\u30B1\u30FC\u30B9\u30EC\u30B3\u30FC\u30C9\u30DA\u30FC\u30B8\uFF1A\u30CF\u30A4\u30E9\u30A4\u30C8\u3001SLA \u30D1\u30B9\u3001\u8A73\u7D30\u3001\u6D3B\u52D5\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u3002", - title: "{case_number} \xB7 {subject}", - subtitle: "{crm_account}", - components: { - case_highlights: { label: "\u91CD\u8981\u60C5\u5831" }, - case_status_path: { label: "\u30B1\u30FC\u30B9\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u9032\u6357" }, - case_details: { label: "\u30B1\u30FC\u30B9\u8A73\u7D30\u60C5\u5831" } - } - }, - lead_detail_page: { - label: "\u30EA\u30FC\u30C9\u8A73\u7D30", - description: "\u30CF\u30A4\u30E9\u30A4\u30C8\u30FB\u8A73\u7D30\u30FB\u95A2\u9023\u60C5\u5831\u3092\u5099\u3048\u305F\u30EA\u30FC\u30C9\u306E\u7DCF\u5408\u8A73\u7D30\u30DA\u30FC\u30B8\u3002", - title: "{first_name} {last_name}", - subtitle: "{company}", - components: { - lead_duplicate_alert_confirmed: { label: "\u91CD\u8907\u78BA\u5B9A\u306E\u8B66\u544A" }, - lead_duplicate_alert_suspected: { label: "\u91CD\u8907\u306E\u7591\u3044\u306E\u8B66\u544A" }, - lead_highlights: { label: "\u91CD\u8981\u60C5\u5831" }, - lead_path: { label: "\u30EA\u30FC\u30C9\u30B9\u30C6\u30FC\u30BF\u30B9\u306E\u9032\u6357" }, - main_tabs: { label: "\u30EA\u30FC\u30C9\u60C5\u5831\u30BF\u30D6" }, - lead_details: { label: "\u30EA\u30FC\u30C9\u8A73\u7D30\u60C5\u5831" }, - related_accordion: { label: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9" }, - related_tasks: { title: "\u672A\u5B8C\u4E86\u306E\u30BF\u30B9\u30AF", label: "\u30BF\u30B9\u30AF" }, - lead_activity: { label: "\u6D3B\u52D5\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3" }, - lead_history: { label: "\u9805\u76EE\u5C65\u6B74" } - } - }, - opportunity_detail_page: { - label: "\u5546\u8AC7\u8A73\u7D30", - description: "\u30B9\u30C6\u30FC\u30B8\u30D1\u30B9\u30FB\u30CF\u30A4\u30E9\u30A4\u30C8\u30FB\u8A73\u7D30\u30FB\u95A2\u9023\u30EA\u30B9\u30C8\u3092\u5099\u3048\u305F\u5546\u8AC7\u306E\u7DCF\u5408\u8A73\u7D30\u30DA\u30FC\u30B8\u3002", - title: "{name}", - subtitle: "{crm_account}", - components: { - opp_highlights: { label: "\u91CD\u8981\u60C5\u5831" }, - opp_stage_path: { label: "\u5546\u8AC7\u30B9\u30C6\u30FC\u30B8\u306E\u9032\u6357" }, - opp_details: { label: "\u5546\u8AC7\u8A73\u7D30\u60C5\u5831" } - } - }, - sales_home_page: { - label: "\u55B6\u696D\u30DB\u30FC\u30E0", - description: "\u4E3B\u8981\u6307\u6A19\u3068\u30AF\u30A4\u30C3\u30AF\u30A2\u30AF\u30B7\u30E7\u30F3\u3092\u307E\u3068\u3081\u305F\u55B6\u696D\u30C1\u30FC\u30E0\u306E\u30DB\u30FC\u30E0\u30DA\u30FC\u30B8", - title: "\u55B6\u696D\u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9", - subtitle: "\u304A\u304B\u3048\u308A\u306A\u3055\u3044", - components: { - kpi_revenue_won: { - label: "\u53D7\u6CE8\u58F2\u4E0A" - }, - kpi_deals_won: { - label: "\u53D7\u6CE8\u4EF6\u6570" - }, - kpi_pipeline_value: { - label: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u91D1\u984D" - }, - kpi_open_leads: { - label: "\u30AA\u30FC\u30D7\u30F3\u30EA\u30FC\u30C9" - }, - home_upcoming_events: { - label: "\u{1F4C5} \u958B\u50AC\u4E88\u5B9A \xB7 \u76F4\u8FD1\u9806" - }, - quick_create: { title: "\u30AF\u30A4\u30C3\u30AF\u4F5C\u6210", label: "\u30AF\u30A4\u30C3\u30AF\u4F5C\u6210" }, - key_metrics: { title: "\u4E3B\u8981\u696D\u7E3E\u8A55\u4FA1\u6307\u6A19", label: "\u4E3B\u8981\u6307\u6A19" }, - home_tabs: { label: "\u30DB\u30FC\u30E0\u30BF\u30D6" }, - home_my_leads: { label: "\u79C1\u306E\u30EA\u30FC\u30C9" }, - home_my_deals: { label: "\u79C1\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7" }, - home_my_tasks: { label: "\u79C1\u306E\u30AA\u30FC\u30D7\u30F3\u30BF\u30B9\u30AF" }, - ai_briefing: { - title: "AI \u30A2\u30B7\u30B9\u30BF\u30F3\u30C8\u306B\u8CEA\u554F", - label: "\u4ECA\u65E5\u306E AI \u30A2\u30B7\u30B9\u30BF\u30F3\u30C8" - }, - upcoming_events: { title: "\u4ECA\u5F8C\u306E\u4E88\u5B9A", label: "\u4ECA\u5F8C\u306E\u4E88\u5B9A" } - } - }, - utility_bar_page: { - label: "\u30E6\u30FC\u30C6\u30A3\u30EA\u30C6\u30A3\u30D0\u30FC", - description: "\u30D5\u30ED\u30FC\u30C6\u30A3\u30F3\u30B0\u30C4\u30FC\u30EB\u3078\u306E\u30AF\u30A4\u30C3\u30AF\u30A2\u30AF\u30BB\u30B9\u30D0\u30FC", - components: { - notifications_panel: { label: "\u901A\u77E5" }, - quick_notes: { title: "\u30AF\u30A4\u30C3\u30AF\u30E1\u30E2", label: "\u30AF\u30A4\u30C3\u30AF\u30E1\u30E2" }, - quick_search: { label: "\u30AF\u30A4\u30C3\u30AF\u691C\u7D22" } - } - } - }, - // Screen-flow copy (#1210, #1975). Keyed `flows..label`, - // `screens..title` and `screens..fields..{label,placeholder}` - // — the keys `os lint`'s `i18n/missing-flow` names, read by the console's - // flow runner since @objectstack 17.7.0 (the spec's `flows` liveness row is - // `live` there). A screen with no authored `title` shows its flow's label in - // every locale, so each `screen_1.title` repeats the flow label. Since - // 18.0.0-next.0 three more surfaces are keys the engine reads in the run's - // locale, and `i18n/missing-flow` names each missing one: a select field's - // `options.` (worded as the object field's own option in this pack), - // an authored screen `description`, and a refusing `end` node's - // `refusals..message`. A translated description or message is a text - // slot like the one it translates, so a hole in it is `{{ }}`. - // The discount ceiling is interpolated from `QUOTE_DISCOUNT_CEILING`, never - // retyped: the number lives in `_thresholds.ts` alone (#1711). - flows: { - campaign_enrollment: { - label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306B\u30E1\u30F3\u30D0\u30FC\u3092\u767B\u9332", - screens: { - screen_1: { - title: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306B\u30E1\u30F3\u30D0\u30FC\u3092\u767B\u9332", - fields: { - memberSource: { label: "\u767B\u9332\u3059\u308B\u30E1\u30F3\u30D0\u30FC\u306E\u7A2E\u985E", options: { leads: "\u30EA\u30FC\u30C9", contacts: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" } }, - leadStatus: { label: "\u767B\u9332\u3059\u308B\u30EA\u30FC\u30C9\u306E\u30B9\u30C6\u30FC\u30BF\u30B9", options: { new: "\u65B0\u898F", contacted: "\u30B3\u30F3\u30BF\u30AF\u30C8\u6E08\u307F", qualified: "\u9069\u683C" } }, - contactDepartment: { - label: "\u767B\u9332\u3059\u308B\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u90E8\u9580", - options: { executive: "\u7D4C\u55B6\u5C64", sales: "\u55B6\u696D\u90E8", marketing: "\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0\u90E8", engineering: "\u30A8\u30F3\u30B8\u30CB\u30A2\u30EA\u30F3\u30B0\u90E8", support: "\u30B5\u30DD\u30FC\u30C8\u90E8", finance: "\u7D4C\u7406\u90E8", hr: "\u4EBA\u4E8B\u90E8", operations: "\u30AA\u30DA\u30EC\u30FC\u30B7\u30E7\u30F3\u90E8" } - } - } - } - } - }, - escalate_case: { - label: "\u30B1\u30FC\u30B9\u3092\u30A8\u30B9\u30AB\u30EC\u30FC\u30C8", - screens: { screen_1: { title: "\u30B1\u30FC\u30B9\u3092\u30A8\u30B9\u30AB\u30EC\u30FC\u30C8", fields: { reason: { label: "\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u7406\u7531" } } } } - }, - close_case: { - label: "\u30B1\u30FC\u30B9\u3092\u30AF\u30ED\u30FC\u30BA", - screens: { - screen_1: { - title: "\u30B1\u30FC\u30B9\u3092\u30AF\u30ED\u30FC\u30BA", - fields: { - resolution: { label: "\u89E3\u6C7A\u5185\u5BB9" }, - resolved_by_article: { label: "\u89E3\u6C7A\u306B\u4F7F\u3063\u305F\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B\uFF08\u4EFB\u610F\uFF09" } - } - } - } - }, - claim_case: { - label: "\u30B1\u30FC\u30B9\u3092\u5F15\u304D\u53D7\u3051\u308B", - screens: { - screen_1: { - title: "\u30B1\u30FC\u30B9\u3092\u5F15\u304D\u53D7\u3051\u308B", - fields: { - claimStatus: { - label: "\u5BFE\u5FDC\u72B6\u6CC1", - options: { in_progress: "\u5BFE\u5FDC\u4E2D", waiting_customer: "\u9867\u5BA2\u306E\u56DE\u7B54\u5F85\u3061", waiting_support: "\u30B5\u30DD\u30FC\u30C8\u306E\u56DE\u7B54\u5F85\u3061" } - } - } - } - } - }, - lead_conversion: { - label: "\u30EA\u30FC\u30C9\u5909\u63DB\u30D7\u30ED\u30BB\u30B9", - screens: { - screen_1: { - title: "\u30EA\u30FC\u30C9\u5909\u63DB\u30D7\u30ED\u30BB\u30B9", - // The duplicate warning's text is a variable the flow assigns; this - // key can only carry the hole that shows it. - description: "{{duplicateWarning}}", - fields: { - createOpportunity: { label: "\u5546\u8AC7\u3092\u4F5C\u6210\u3057\u307E\u3059\u304B\uFF1F" }, - opportunityName: { label: "\u5546\u8AC7\u540D" }, - opportunityAmount: { label: "\u5546\u8AC7\u91D1\u984D" }, - closeDate: { label: "\u5B8C\u4E86\u4E88\u5B9A\u65E5" } - } - }, - refuse_confirmed_duplicate: { - title: "\u5909\u63DB\u306F\u62D2\u5426\u3055\u308C\u307E\u3057\u305F", - description: "\u3053\u306E\u30EA\u30FC\u30C9\u306E\u91CD\u8907\u30B9\u30C6\u30FC\u30BF\u30B9\u306F\u300C\u91CD\u8907\u78BA\u5B9A\u300D\u3067\u3059\u3002\u30EC\u30D3\u30E5\u30FC\u62C5\u5F53\u8005\u304C\u65E2\u5B58\u306E\u30EC\u30B3\u30FC\u30C9\u3068\u7167\u5408\u3057\u3001\u91CD\u8907\u3067\u3042\u308B\u3068\u8A18\u9332\u3057\u307E\u3057\u305F\u3002\u5909\u63DB\u3059\u308B\u3068\u3001\u540C\u3058\u8CFC\u5165\u8005\u306B\u5BFE\u3057\u3066\u53D6\u5F15\u5148\u30FB\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u30FB\u5546\u8AC7\u304C\u3082\u3046 1 \u4EF6\u305A\u3064\u4F5C\u6210\u3055\u308C\u307E\u3059\u3002\u6B8B\u3059\u30EC\u30B3\u30FC\u30C9\u306F\u3053\u306E\u30EA\u30FC\u30C9\u306E\u300C\u91CD\u8907\u7BA1\u7406\u300D\u30BB\u30AF\u30B7\u30E7\u30F3\u306B\u8868\u793A\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u4EE3\u308F\u308A\u306B\u3001\u3053\u306E\u30EA\u30FC\u30C9\u3092\u91CD\u8907\u3068\u3057\u3066\u4E0D\u9069\u683C\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u5909\u63DB\u3092\u518D\u3073\u53EF\u80FD\u306B\u3067\u304D\u308B\u306E\u306F\u3001\u305D\u306E\u5224\u5B9A\u3092\u898B\u76F4\u3059\u30EC\u30D3\u30E5\u30FC\u62C5\u5F53\u8005\u3060\u3051\u3067\u3059\u3002" - }, - refuse_unapproved: { - title: "\u5909\u63DB\u306F\u62D2\u5426\u3055\u308C\u307E\u3057\u305F", - description: "\u3053\u306E\u30EA\u30FC\u30C9\u306F\u307E\u3060\u5909\u63DB\u306E\u627F\u8A8D\u3092\u5F97\u3066\u3044\u307E\u305B\u3093\u3002\u53D6\u5F15\u5148\u30FB\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u30FB\u5546\u8AC7\u306B\u5909\u63DB\u3059\u308B\u306B\u306F\u3001\u5148\u306B\u627F\u8A8D\u8005\u306E\u627F\u8A8D\u304C\u5FC5\u8981\u3067\u3059\u3002\u30EA\u30FC\u30C9\u306E\u300C\u30B3\u30F3\u30D0\u30FC\u30B8\u30E7\u30F3\u627F\u8A8D\u300D\u9805\u76EE\u3067\u3001\u5224\u65AD\u304C\u307E\u3060\u627F\u8A8D\u5F85\u3061\u304B\u3001\u5374\u4E0B\u3055\u308C\u305F\u304B\u3092\u78BA\u8A8D\u3067\u304D\u307E\u3059\u3002\u305D\u308C\u307E\u3067\u306E\u9593\u3082\u30EA\u30FC\u30C9\u3078\u306E\u5BFE\u5FDC\u306F\u7D9A\u3051\u3066\u304F\u3060\u3055\u3044\u3002\u51CD\u7D50\u3055\u308C\u308B\u3082\u306E\u306F\u3042\u308A\u307E\u305B\u3093\u3002" - }, - refuse_no_match_key: { - title: "\u5909\u63DB\u306F\u62D2\u5426\u3055\u308C\u307E\u3057\u305F", - description: "\u3053\u306E\u30EA\u30FC\u30C9\u306E\u4F1A\u793E\u540D\u306B\u306F\u7167\u5408\u30AD\u30FC\u304C\u306A\u3044\u305F\u3081\u3001\u5909\u63DB\u3067\u306F\u3069\u306E\u53D6\u5F15\u5148\u306B\u5C5E\u3059\u308B\u304B\u3092\u5224\u65AD\u3067\u304D\u305A\u3001\u63A8\u6E2C\u3082\u3057\u307E\u305B\u3093\u3002\u63A8\u6E2C\u3059\u308B\u3068\u3001\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3068\u5546\u8AC7\u304C\u5225\u306E\u9867\u5BA2\u306E\u4E0B\u306B\u767B\u9332\u3055\u308C\u308B\u304A\u305D\u308C\u304C\u3042\u308A\u307E\u3059\u3002\u30EA\u30FC\u30C9\u306E\u300C\u4F1A\u793E\u540D\u300D\u3092\u4FDD\u5B58\u3059\u308B\u3068\u30AD\u30FC\u304C\u518D\u4F5C\u6210\u3055\u308C\u308B\u306E\u3067\u3001\u3082\u3046\u4E00\u5EA6\u4FDD\u5B58\u3057\u3066\u304B\u3089\u5909\u63DB\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u4F55\u3082\u4F5C\u6210\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002" - } - } - }, - schedule_followup: { - label: "\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7\u3092\u8A2D\u5B9A", - screens: { - screen_1: { - title: "\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7\u3092\u8A2D\u5B9A", - fields: { - subject: { label: "\u6B21\u306E\u30B9\u30C6\u30C3\u30D7\u306F\uFF1F" }, - dueDate: { label: "\u671F\u9650" }, - activityType: { - label: "\u6D3B\u52D5\u7A2E\u5225", - options: { call: "\u96FB\u8A71", email: "\u30E1\u30FC\u30EB", meeting: "\u4F1A\u8B70", follow_up: "\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7", demo: "\u30C7\u30E2", other: "\u305D\u306E\u4ED6" } - }, - priority: { label: "\u512A\u5148\u5EA6", options: { low: "\u4F4E", normal: "\u901A\u5E38", high: "\u9AD8", urgent: "\u7DCA\u6025" } }, - notes: { label: "\u30E1\u30E2" } - } - } - } - }, - quote_generation: { - label: "\u5546\u8AC7\u304B\u3089\u898B\u7A4D\u3092\u4F5C\u6210", - refusals: { refuse_held: { message: "\u5148\u306B\u6848\u4EF6\u5316\u627F\u8A8D\u304C\u5FC5\u8981\u3067\u3059\u3002\u300C\u6848\u4EF6\u5316\u627F\u8A8D\u3092\u7533\u8ACB\u300D\u306B\u30C1\u30A7\u30C3\u30AF\u3092\u5165\u308C\u3066\u304F\u3060\u3055\u3044\u3002\u4F55\u3082\u4F5C\u6210\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002" } }, - screens: { - screen_1: { - title: "\u5546\u8AC7\u304B\u3089\u898B\u7A4D\u3092\u4F5C\u6210", - fields: { - quoteName: { label: "\u898B\u7A4D\u540D" }, - expirationDays: { label: "\u6709\u52B9\u671F\u9593\uFF08\u65E5\uFF09" }, - discount: { label: `\u5272\u5F15\u7387 % (\u2264 ${QUOTE_DISCOUNT_CEILING})`, placeholder: `0-${QUOTE_DISCOUNT_CEILING}` } - } - } - } - } - } -}; - -// src/sales/translations/ja-JP/_shared.ts -var activityActions3 = { - log_call: { - label: "\u96FB\u8A71\u3092\u8A18\u9332", - successMessage: "\u96FB\u8A71\u3092\u8A18\u9332\u3057\u307E\u3057\u305F\uFF01", - params: { - subject: { label: "\u96FB\u8A71\u306E\u4EF6\u540D" }, - duration: { label: "\u6240\u8981\u6642\u9593\uFF08\u5206\uFF09" }, - attendee_contacts: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u53C2\u52A0\u8005" }, - attendee_users: { label: "\u793E\u5185\u53C2\u52A0\u8005" }, - notes: { label: "\u901A\u8A71\u30E1\u30E2" } - } - }, - log_meeting: { - label: "\u4F1A\u8B70\u3092\u8A18\u9332", - successMessage: "\u4F1A\u8B70\u3092\u8A18\u9332\u3057\u307E\u3057\u305F\uFF01", - params: { - subject: { label: "\u4F1A\u8B70\u306E\u4EF6\u540D" }, - duration: { label: "\u6240\u8981\u6642\u9593\uFF08\u5206\uFF09" }, - attendee_contacts: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u53C2\u52A0\u8005" }, - attendee_users: { label: "\u793E\u5185\u53C2\u52A0\u8005" }, - notes: { label: "\u8B70\u4E8B\u30E1\u30E2" } - } - }, - schedule_meeting: { - label: "\u4F1A\u8B70\u3092\u8A2D\u5B9A", - successMessage: "\u4F1A\u8B70\u3092\u8A2D\u5B9A\u3057\u307E\u3057\u305F\uFF01", - params: { - subject: { label: "\u4F1A\u8B70\u306E\u4EF6\u540D" }, - start_date: { label: "\u958B\u59CB\u65E5 (UTC)" }, - start_time: { label: "\u958B\u59CB\u6642\u523B (UTC)" }, - location: { label: "\u5834\u6240" }, - duration: { label: "\u6240\u8981\u6642\u9593\uFF08\u5206\uFF09" }, - attendee_contacts: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u53C2\u52A0\u8005" }, - attendee_users: { label: "\u793E\u5185\u53C2\u52A0\u8005" }, - notes: { label: "\u30A2\u30B8\u30A7\u30F3\u30C0" } - } - } -}; -var salutationOptions = { mr: "Mr.", ms: "Ms.", mrs: "Mrs.", dr: "\u535A\u58EB", prof: "\u6559\u6388" }; -var industryOptions = { - technology: "\u30C6\u30AF\u30CE\u30ED\u30B8\u30FC", - software: "\u30BD\u30D5\u30C8\u30A6\u30A7\u30A2 / SaaS", - finance: "\u91D1\u878D", - healthcare: "\u30D8\u30EB\u30B9\u30B1\u30A2", - retail: "\u5C0F\u58F2", - manufacturing: "\u88FD\u9020", - education: "\u6559\u80B2", - real_estate: "\u4E0D\u52D5\u7523", - media: "\u30E1\u30C7\u30A3\u30A2\u30FB\u30A8\u30F3\u30BF\u30E1", - logistics: "\u7269\u6D41", - hospitality: "\u30DB\u30B9\u30D4\u30BF\u30EA\u30C6\u30A3", - energy: "\u30A8\u30CD\u30EB\u30AE\u30FC\u30FB\u516C\u76CA", - government: "\u653F\u5E9C\u30FB\u884C\u653F", - nonprofit: "\u975E\u55B6\u5229", - other: "\u305D\u306E\u4ED6" -}; -var leadSourceOptions = { - web: "\u30A6\u30A7\u30D6", - referral: "\u7D39\u4ECB", - event: "\u30A4\u30D9\u30F3\u30C8\u30FB\u5C55\u793A\u4F1A", - webinar: "\u30A6\u30A7\u30D3\u30CA\u30FC", - partner: "\u30D1\u30FC\u30C8\u30CA\u30FC", - advertisement: "\u5E83\u544A", - paid_search: "\u6709\u6599\u691C\u7D22", - social: "\u30BD\u30FC\u30B7\u30E3\u30EB\u30E1\u30C7\u30A3\u30A2", - content: "\u30B3\u30F3\u30C6\u30F3\u30C4\u30FB\u30D6\u30ED\u30B0", - cold_call: "\u30B3\u30FC\u30EB\u30C9\u30B3\u30FC\u30EB", - email_campaign: "\u30E1\u30FC\u30EB\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3", - other: "\u305D\u306E\u4ED6" -}; - -// src/sales/translations/ja-JP/objects.customer.ts -var customer3 = { - crm_account: { - label: "\u53D6\u5F15\u5148", - pluralLabel: "\u53D6\u5F15\u5148", - description: "\u5F53\u793E\u3068\u53D6\u5F15\u306E\u3042\u308B\u4F01\u696D\u30FB\u7D44\u7E54", - fields: { - account_number: { label: "\u53D6\u5F15\u5148\u756A\u53F7" }, - registration_number: { - label: "\u767B\u8A18\u756A\u53F7", - help: "\u53D6\u5F15\u5148\u304C\u81EA\u56FD\u306E\u767B\u8A18\u6A5F\u95A2\u304B\u3089\u4EA4\u4ED8\u3055\u308C\u305F\u767B\u8A18\u4E0A\u306E\u8B58\u5225\u756A\u53F7\u3002\u5F53\u793E\u304C\u63A1\u756A\u3059\u308B\u53D6\u5F15\u5148\u756A\u53F7\u3068\u306F\u7570\u306A\u308A\u307E\u3059\u3002" - }, - commercial_capability: { - label: "\u5546\u8AC7\u53EF\u5426\u533A\u5206", - help: "\u3053\u306E\u53D6\u5F15\u5148\u306B\u5BFE\u3057\u3066\u65B0\u898F\u306E\u5546\u8AC7\u3092\u958B\u59CB\u3067\u304D\u308B\u304B\u3069\u3046\u304B\u3002\u6C7A\u6E08\u306E\u307F\u306E\u53D6\u5F15\u5148\u306F\u8ACB\u6C42\u30FB\u5165\u91D1\u306B\u306F\u5F15\u304D\u7D9A\u304D\u5229\u7528\u3067\u304D\u307E\u3059\u304C\u3001\u65B0\u898F\u5546\u8AC7\u3092\u95A2\u9023\u4ED8\u3051\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002", - options: { full: "\u5236\u9650\u306A\u3057", settlement_only: "\u6C7A\u6E08\u306E\u307F" } - }, - incumbent_vendor: { label: "\u73FE\u884C\u30D9\u30F3\u30C0\u30FC", help: "\u5F53\u793E\u304C\u72D9\u3063\u3066\u3044\u308B\u652F\u51FA\u3092\u73FE\u5728\u53D7\u6CE8\u3057\u3066\u3044\u308B\u30D9\u30F3\u30C0\u30FC\u3002" }, - annual_purchasing_budget: { label: "\u5E74\u9593\u8ABF\u9054\u4E88\u7B97", help: "\u3053\u306E\u53D6\u5F15\u5148\u304C\u4ECA\u5E74\u5EA6\u30D9\u30F3\u30C0\u30FC\u306B\u652F\u51FA\u3059\u308B\u898B\u8FBC\u307F\u984D\u3067\u3042\u308A\u3001\u81EA\u793E\u306E\u58F2\u4E0A\u9AD8\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002" }, - payment_cycle: { - label: "\u652F\u6255\u30B5\u30A4\u30AF\u30EB", - options: { prepaid: "\u524D\u6255\u3044", net_30: "30\u65E5", net_60: "60\u65E5", net_90: "90\u65E5" } - }, - approval_status: { - label: "\u627F\u8A8D\u30B9\u30C6\u30FC\u30BF\u30B9", - help: "\u3053\u306E\u53D6\u5F15\u5148\u306E\u627F\u8A8D\u72B6\u6CC1\u3002\u65B0\u898F\u53D6\u5F15\u5148\u306F\u627F\u8A8D\u5F85\u3061\u3067\u4F5C\u6210\u3055\u308C\u3001\u627F\u8A8D\u30C8\u30EC\u30A4\u3067\u5224\u65AD\u3055\u308C\u307E\u3059\u3002", - options: { pending: "\u627F\u8A8D\u5F85\u3061", approved: "\u627F\u8A8D\u6E08\u307F", rejected: "\u5374\u4E0B" } - }, - name: { label: "\u53D6\u5F15\u5148\u540D", help: "\u4F1A\u793E\u307E\u305F\u306F\u7D44\u7E54\u306E\u6B63\u5F0F\u540D\u79F0" }, - name_normalized: { - label: "\u53D6\u5F15\u5148\u540D\uFF08\u6B63\u898F\u5316\uFF09", - help: "\u30EA\u30FC\u30C9\u5909\u63DB\u306E\u7167\u5408\u30AD\u30FC\u3002\u53D6\u5F15\u5148\u540D\u3092\u5C0F\u6587\u5B57\u5316\u3057\u3001\u524D\u5F8C\u306E\u7A7A\u767D\u3092\u9664\u53BB\u3057\u3066\u3001\u5185\u90E8\u306E\u9023\u7D9A\u3059\u308B\u7A7A\u767D\u3092 1 \u3064\u306B\u307E\u3068\u3081\u305F\u3082\u306E\u3002account_protection \u30D5\u30C3\u30AF\u304C\u81EA\u52D5\u3067\u7DAD\u6301\u3057\u307E\u3059 \u2014 \u76F4\u63A5\u7DE8\u96C6\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002" - }, - display_title: { label: "\u8868\u793A\u540D" }, - type: { - label: "\u30BF\u30A4\u30D7", - options: { prospect: "\u898B\u8FBC\u307F\u5BA2", customer: "\u9867\u5BA2", partner: "\u30D1\u30FC\u30C8\u30CA\u30FC", former: "\u904E\u53BB\u306E\u53D6\u5F15\u5148" } - }, - industry: { - label: "\u696D\u7A2E", - options: { ...industryOptions } - }, - annual_revenue: { label: "\u5E74\u9593\u58F2\u4E0A" }, - child_account_revenue: { label: "\u5B50\u4F1A\u793E\u5E74\u9593\u58F2\u4E0A\u5408\u8A08", help: "\u76F4\u5C5E\u306E\u5B50\u53D6\u5F15\u5148\u306E\u5E74\u9593\u58F2\u4E0A\u306E\u5408\u8A08\u3002" }, - number_of_employees: { label: "\u5F93\u696D\u54E1\u6570" }, - phone: { label: "\u96FB\u8A71\u756A\u53F7" }, - website: { label: "Web\u30B5\u30A4\u30C8" }, - billing_address: { label: "\u8ACB\u6C42\u5148\u4F4F\u6240" }, - billing_country: { - label: "\u8ACB\u6C42\u5148\u56FD", - help: "\u8ACB\u6C42\u5148\u4F4F\u6240\u304B\u3089\u5C0E\u51FA \u2014 \u5165\u529B\u3055\u308C\u305F\u56FD\u540D\u3092\u305D\u306E\u307E\u307E\u3001\u524D\u5F8C\u306E\u7A7A\u767D\u3092\u9664\u53BB\u3057\u5927\u6587\u5B57\u5316\u3057\u305F\u5024\u3002" - }, - territory: { - label: "\u30C6\u30EA\u30C8\u30EA\u30FC", - help: "\u8ACB\u6C42\u5148\u4F4F\u6240\u304B\u3089\u5C0E\u51FA \u2014 \u30C6\u30EA\u30C8\u30EA\u30FC\u5171\u6709\u30EB\u30FC\u30EB\u304C\u7167\u5408\u3059\u308B\u55B6\u696D\u30C6\u30EA\u30C8\u30EA\u30FC\u3002\u62C5\u5F53\u30C1\u30FC\u30E0\u306E\u306A\u3044\u30C6\u30EA\u30C8\u30EA\u30FC\u306E\u53D6\u5F15\u5148\u306F\u300C\u305D\u306E\u4ED6\u300D\u3002", - options: { na: "\u5317\u7C73", emea: "EMEA", other: "\u305D\u306E\u4ED6" } - }, - office_location: { label: "\u30AA\u30D5\u30A3\u30B9\u6240\u5728\u5730" }, - owner_id: { label: "\u53D6\u5F15\u5148\u6240\u6709\u8005" }, - parent_account: { label: "\u89AA\u53D6\u5F15\u5148", help: "\u968E\u5C64\u69CB\u9020\u306B\u304A\u3051\u308B\u89AA\u4F1A\u793E" }, - description: { label: "\u8AAC\u660E" }, - is_active: { label: "\u6709\u52B9" }, - last_activity_date: { label: "\u6700\u7D42\u6D3B\u52D5\u65E5" }, - brand_color: { label: "\u30D6\u30E9\u30F3\u30C9\u30AB\u30E9\u30FC" }, - logo: { label: "\u4F1A\u793E\u30ED\u30B4" }, - tier: { - label: "\u9867\u5BA2\u30E9\u30F3\u30AF", - options: { - strategic: "\u6226\u7565\u9867\u5BA2", - enterprise: "\u30A8\u30F3\u30BF\u30FC\u30D7\u30E9\u30A4\u30BA", - mid_market: "\u30DF\u30C3\u30C9\u30DE\u30FC\u30B1\u30C3\u30C8", - smb: "\u4E2D\u5C0F\u4F01\u696D" - } - }, - segment: { - label: "\u9867\u5BA2\u30BB\u30B0\u30E1\u30F3\u30C8", - options: { net_new: "\u65B0\u898F\u7372\u5F97", growth: "\u6210\u9577", at_risk: "\u30EA\u30B9\u30AF\u3042\u308A", stable: "\u5B89\u5B9A" } - }, - health_score: { - label: "\u30D8\u30EB\u30B9\u30B9\u30B3\u30A2", - help: "\u30AB\u30B9\u30BF\u30DE\u30FC\u30B5\u30AF\u30BB\u30B9\u62C5\u5F53\uFF08CSM\uFF09\u304C\u7BA1\u7406\u3059\u308B\u5065\u5168\u6027\u306E\u6307\u6A19", - options: { healthy: "\u826F\u597D", watching: "\u8981\u89B3\u5BDF", at_risk: "\u30EA\u30B9\u30AF\u3042\u308A", churning: "\u89E3\u7D04\u9032\u884C\u4E2D" } - } - }, - _views: { - all_accounts: { - label: "\u5168\u53D6\u5F15\u5148", - description: "\u58F2\u4E0A\u3068\u696D\u7A2E\u3092\u542B\u3080\u53D6\u5F15\u5148\u306E\u4E00\u89A7", - bulkActions: { - delete: { - label: "\u524A\u9664", - confirmLabel: "\u524A\u9664", - confirmText: "{{count}} \u4EF6\u306E\u53D6\u5F15\u5148\u3092\u5B8C\u5168\u306B\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F\u3053\u306E\u64CD\u4F5C\u306F\u53D6\u308A\u6D88\u305B\u307E\u305B\u3093\u3002" - }, - transfer_owner: { - label: "\u6240\u6709\u8005\u306E\u5909\u66F4", - confirmText: "{{count}} \u4EF6\u306E\u53D6\u5F15\u5148\u306E\u6240\u6709\u8005\u3092\u5909\u66F4\u3057\u307E\u3059\u304B\uFF1F", - params: { - owner_id: { - label: "\u65B0\u3057\u3044\u6240\u6709\u8005" - } - } - }, - update_tier: { - label: "\u9867\u5BA2\u30E9\u30F3\u30AF\u306E\u66F4\u65B0", - confirmText: "{{count}} \u4EF6\u306E\u53D6\u5F15\u5148\u306E\u9867\u5BA2\u30E9\u30F3\u30AF\u3092 {{tier}} \u306B\u66F4\u65B0\u3057\u307E\u3059\u304B\uFF1F", - params: { - tier: { - label: "\u9867\u5BA2\u30E9\u30F3\u30AF" - } - } - } - } - }, - account_gallery: { label: "\u53D6\u5F15\u5148\u30AB\u30FC\u30C9", description: "\u30D6\u30E9\u30F3\u30C9\u30AB\u30E9\u30FC\u4ED8\u304D\u306E\u30AB\u30FC\u30C9\u30D3\u30E5\u30FC" }, - account_map: { label: "\u53D6\u5F15\u5148\u30DE\u30C3\u30D7", description: "\u53D6\u5F15\u5148\u306E\u5730\u7406\u7684\u5206\u5E03" }, - enterprise_accounts: { label: "\u30A8\u30F3\u30BF\u30FC\u30D7\u30E9\u30A4\u30BA\u53D6\u5F15\u5148", description: "\u5E74\u5546\u6700\u4E0A\u4F4D\u306E\u4E3B\u8981\u9867\u5BA2" }, - my_accounts: { label: "\u79C1\u306E\u53D6\u5F15\u5148", description: "\u81EA\u5206\u304C\u6240\u6709\u3059\u308B\u53D6\u5F15\u5148" }, - at_risk_accounts: { label: "\u26A0\uFE0F \u30EA\u30B9\u30AF\u306E\u3042\u308B\u53D6\u5F15\u5148" } - }, - _sections: { - basic: { label: "\u57FA\u672C\u60C5\u5831" }, - financials: { label: "\u8CA1\u52D9\u60C5\u5831" }, - business_profile: { label: "\u30D3\u30B8\u30CD\u30B9\u60C5\u5831" }, - contact_info: { label: "\u9023\u7D61\u5148\u60C5\u5831" }, - ownership: { label: "\u6240\u6709\u8005\u30FB\u30B9\u30C6\u30FC\u30BF\u30B9" }, - branding: { label: "\u30D6\u30E9\u30F3\u30C7\u30A3\u30F3\u30B0" }, - system: { label: "\u30B7\u30B9\u30C6\u30E0" }, - // account.view.ts のフォームセクション名 (#1100) - profile: { label: "\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB" }, - customer_success: { label: "\u30AB\u30B9\u30BF\u30DE\u30FC\u30B5\u30AF\u30BB\u30B9" }, - locations: { label: "\u6240\u5728\u5730" }, - description: { label: "\u8AAC\u660E" } - }, - _actions: { ...activityActions3 } - }, - crm_contact: { - label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", - pluralLabel: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", - description: "\u53D6\u5F15\u5148\u306B\u6240\u5C5E\u3059\u308B\u62C5\u5F53\u8005", - fields: { - salutation: { label: "\u656C\u79F0", options: { ...salutationOptions } }, - first_name: { label: "\u540D" }, - last_name: { label: "\u59D3" }, - full_name: { label: "\u6C0F\u540D" }, - crm_account: { label: "\u53D6\u5F15\u5148" }, - email: { label: "\u30E1\u30FC\u30EB" }, - phone: { label: "\u96FB\u8A71" }, - mobile: { label: "\u643A\u5E2F\u96FB\u8A71" }, - title: { label: "\u5F79\u8077" }, - department: { - label: "\u90E8\u9580", - options: { - executive: "\u7D4C\u55B6\u5C64", - sales: "\u55B6\u696D\u90E8", - marketing: "\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0\u90E8", - engineering: "\u30A8\u30F3\u30B8\u30CB\u30A2\u30EA\u30F3\u30B0\u90E8", - support: "\u30B5\u30DD\u30FC\u30C8\u90E8", - finance: "\u7D4C\u7406\u90E8", - hr: "\u4EBA\u4E8B\u90E8", - operations: "\u30AA\u30DA\u30EC\u30FC\u30B7\u30E7\u30F3\u90E8" - } - }, - // バイイングセンター (REQ-0004) — 意思決定のマップ。英語ラベルは - // 'Buying Role' ではなく 'Buying Function':security-role-word ルールが - // 宣言側で英単語 role を予約している (ADR-0090 D3)。同ルールは英語のみを - // 読み言語パックには及ばないため、ここでは日本語として自然な語を使う。 - buying_function: { - label: "\u8CFC\u8CB7\u5F79\u5272", - options: { - decision_maker: "\u6C7A\u88C1\u8005", - economic_buyer: "\u4E88\u7B97\u6C7A\u88C1\u8005", - technical_evaluator: "\u6280\u8853\u8A55\u4FA1\u8005", - user: "\u5229\u7528\u8005", - influencer: "\u5F71\u97FF\u8005", - gatekeeper: "\u30B2\u30FC\u30C8\u30AD\u30FC\u30D1\u30FC" - } - }, - attitude: { - label: "\u81EA\u793E\u3078\u306E\u614B\u5EA6", - options: { - champion: "\u63A8\u9032\u8005", - supportive: "\u597D\u610F\u7684", - neutral: "\u4E2D\u7ACB", - skeptical: "\u61D0\u7591\u7684", - blocker: "\u53CD\u5BFE\u8005" - } - }, - relationship_strength: { - label: "\u95A2\u4FC2\u306E\u5F37\u3055", - options: { - distant: "\u758E\u9060", - acquaintance: "\u9854\u898B\u77E5\u308A", - working: "\u696D\u52D9\u4E0A\u306E\u95A2\u4FC2", - strong: "\u5F37\u3044", - trusted_advisor: "\u4FE1\u983C\u3055\u308C\u308B\u30A2\u30C9\u30D0\u30A4\u30B6\u30FC" - } - }, - owner_id: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u6240\u6709\u8005" }, - description: { label: "\u8AAC\u660E" }, - is_primary: { label: "\u4E3B\u62C5\u5F53\u8005", help: "\u3053\u306E\u53D6\u5F15\u5148\u306E\u4E3B\u62C5\u5F53\u8005\u304B\u3069\u3046\u304B" }, - avatar: { label: "\u30D7\u30ED\u30D5\u30A3\u30FC\u30EB\u753B\u50CF" }, - mailing_address: { label: "\u90F5\u9001\u5148\u4F4F\u6240" }, - lead_source: { label: "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9", options: { ...leadSourceOptions } }, - do_not_call: { label: "\u96FB\u8A71\u62D2\u5426" }, - email_opt_out: { label: "\u30E1\u30FC\u30EB\u914D\u4FE1\u505C\u6B62" }, - last_contacted_date: { label: "\u6700\u7D42\u63A5\u89E6\u65E5\u6642" } - }, - _views: { - all_contacts: { label: "\u5168\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, - contact_directory: { label: "\u8CAC\u4EFB\u8005\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA" }, - primary_contacts: { label: "\u4E3B\u62C5\u5F53\u8005" } - }, - _sections: { - identity: { label: "\u57FA\u672C\u60C5\u5831" }, - account_info: { label: "\u53D6\u5F15\u5148\u30FB\u5F79\u8077" }, - buying_centre: { label: "\u30D0\u30A4\u30A4\u30F3\u30B0\u30BB\u30F3\u30BF\u30FC" }, - contact_info: { label: "\u9023\u7D61\u5148\u60C5\u5831" }, - mailing_address: { label: "\u90F5\u9001\u5148\u4F4F\u6240" }, - additional: { label: "\u305D\u306E\u4ED6\u306E\u60C5\u5831" }, - preferences: { label: "\u30B3\u30DF\u30E5\u30CB\u30B1\u30FC\u30B7\u30E7\u30F3\u8A2D\u5B9A" }, - // contact.view.ts のフォームセクション名 (#1100) - contact_details: { label: "\u9023\u7D61\u5148\u60C5\u5831" }, - comm_preferences: { label: "\u8A2D\u5B9A" } - }, - _actions: { - ...activityActions3, - mark_primary: { - label: "\u4E3B\u62C5\u5F53\u8005\u306B\u8A2D\u5B9A", - confirmText: "\u3053\u306E\u8CAC\u4EFB\u8005\u3092\u53D6\u5F15\u5148\u306E\u4E3B\u62C5\u5F53\u8005\u306B\u8A2D\u5B9A\u3057\u307E\u3059\u304B\uFF1F", - successMessage: "\u4E3B\u62C5\u5F53\u8005\u306B\u8A2D\u5B9A\u3057\u307E\u3057\u305F\uFF01" - }, - send_email: { - label: "\u30E1\u30FC\u30EB\u9001\u4FE1", - params: { - subject: { label: "\u4EF6\u540D" }, - body: { label: "\u672C\u6587" } - } - }, - add_contact_to_campaign: { - label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306B\u8FFD\u52A0", - successMessage: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3092\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306B\u8FFD\u52A0\u3057\u307E\u3057\u305F\uFF01", - params: { - crm_campaign: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" } - } - } - } - } -}; - -// src/sales/translations/ja-JP/objects.pipeline.ts -var opportunityStageOptions = { - prospecting: "\u898B\u8FBC\u307F\u8ABF\u67FB", - qualification: "\u9078\u5B9A", - needs_analysis: "\u30CB\u30FC\u30BA\u5206\u6790", - proposal: "\u63D0\u6848", - negotiation: "\u4EA4\u6E09", - closed_won: "\u6210\u7ACB", - closed_lost: "\u4E0D\u6210\u7ACB" -}; -var pipeline3 = { - crm_lead: { - _validations: { - disqualification_reason_required: { - message: "\u30EA\u30FC\u30C9\u3092\u300C\u5BFE\u8C61\u5916\u300D\u306B\u3059\u308B\u5834\u5408\u306F\u5931\u683C\u7406\u7531\u304C\u5FC5\u8981\u3067\u3059" - }, - duplicate_disqualification_requires_survivor: { - message: "\u91CD\u8907\u3092\u7406\u7531\u306B\u30EA\u30FC\u30C9\u3092\u5931\u683C\u3068\u3059\u308B\u5834\u5408\u306F\u3001\u6B8B\u3059\u30EC\u30B3\u30FC\u30C9\u3092\u6307\u5B9A\u3057\u3001\u91CD\u8907\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u300C\u78BA\u8A8D\u6E08\u307F\u300D\u306B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" - }, - email_required: { - message: "\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u5FC5\u9808\u3067\u3059" - }, - lead_status_progression: { - message: "\u7121\u52B9\u306A\u30EA\u30FC\u30C9\u30B9\u30C6\u30FC\u30BF\u30B9\u9077\u79FB\u3067\u3059" - } - }, - label: "\u30EA\u30FC\u30C9", - pluralLabel: "\u30EA\u30FC\u30C9", - description: "\u307E\u3060\u9069\u683C\u5224\u5B9A\u3092\u53D7\u3051\u3066\u3044\u306A\u3044\u898B\u8FBC\u307F\u5BA2", - fields: { - salutation: { label: "\u656C\u79F0", options: { ...salutationOptions } }, - first_name: { label: "\u540D" }, - last_name: { label: "\u59D3" }, - full_name: { label: "\u6C0F\u540D" }, - display_title: { label: "\u8868\u793A\u540D" }, - company: { label: "\u4F1A\u793E\u540D" }, - company_normalized: { - label: "\u4F1A\u793E\u540D\uFF08\u6B63\u898F\u5316\uFF09", - help: "\u30EA\u30FC\u30C9\u5909\u63DB\u306E\u7167\u5408\u30AD\u30FC\u3002\u4F1A\u793E\u540D\u3092\u5C0F\u6587\u5B57\u5316\u3057\u3001\u524D\u5F8C\u306E\u7A7A\u767D\u3092\u9664\u53BB\u3057\u3066\u3001\u5185\u90E8\u306E\u9023\u7D9A\u3059\u308B\u7A7A\u767D\u3092 1 \u3064\u306B\u307E\u3068\u3081\u305F\u3082\u306E\u3002lead_duplicate_check \u30D5\u30C3\u30AF\u304C\u81EA\u52D5\u3067\u7DAD\u6301\u3057\u307E\u3059 \u2014 \u76F4\u63A5\u7DE8\u96C6\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002" - }, - title: { label: "\u5F79\u8077" }, - email: { label: "\u30E1\u30FC\u30EB" }, - phone: { label: "\u96FB\u8A71" }, - industry: { - label: "\u696D\u7A2E", - options: { ...industryOptions } - }, - status: { - label: "\u30B9\u30C6\u30FC\u30BF\u30B9", - options: { - new: "\u65B0\u898F", - contacted: "\u30B3\u30F3\u30BF\u30AF\u30C8\u6E08\u307F", - qualified: "\u9069\u683C", - unqualified: "\u4E0D\u9069\u683C", - converted: "\u5909\u63DB\u6E08\u307F" - } - }, - lead_source: { label: "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9", options: { ...leadSourceOptions } }, - owner_id: { label: "\u30EA\u30FC\u30C9\u6240\u6709\u8005" }, - is_converted: { label: "\u5909\u63DB\u6E08\u307F" }, - description: { label: "\u8AAC\u660E" }, - mobile: { label: "\u643A\u5E2F\u96FB\u8A71" }, - website: { label: "Web\u30B5\u30A4\u30C8" }, - rating: { label: "\u30EA\u30FC\u30C9\u30B9\u30B3\u30A2", help: "\u30EA\u30FC\u30C9\u306E\u54C1\u8CEA\u30B9\u30B3\u30A2\uFF081\u301C5 \u6BB5\u968E\uFF09" }, - converted_account: { label: "\u5909\u63DB\u5F8C\u306E\u53D6\u5F15\u5148" }, - converted_contact: { label: "\u5909\u63DB\u5F8C\u306E\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, - converted_opportunity: { label: "\u5909\u63DB\u5F8C\u306E\u5546\u8AC7" }, - converted_date: { label: "\u5909\u63DB\u65E5" }, - address: { label: "\u4F4F\u6240" }, - annual_revenue: { label: "\u5E74\u9593\u58F2\u4E0A" }, - number_of_employees: { label: "\u5F93\u696D\u54E1\u6570" }, - notes: { label: "\u30E1\u30E2", help: "\u3053\u306E\u30EA\u30FC\u30C9\u306B\u95A2\u3059\u308B\u4F5C\u696D\u30E1\u30E2 \u2014 \u66F8\u5F0F\u8A2D\u5B9A\u306B\u5BFE\u5FDC\u3002" }, - do_not_call: { label: "\u96FB\u8A71\u62D2\u5426" }, - email_opt_out: { label: "\u30E1\u30FC\u30EB\u914D\u4FE1\u505C\u6B62" }, - next_followup_date: { label: "\u6B21\u56DE\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7\u65E5" }, - last_contacted_date: { label: "\u6700\u7D42\u63A5\u89E6\u65E5\u6642" }, - need_type: { - label: "\u30CB\u30FC\u30BA\u7A2E\u5225", - help: "\u3053\u306E\u898B\u8FBC\u5BA2\u304C\u4F55\u3092\u6C42\u3081\u3066\u3044\u308B\u304B\u3002\u5272\u308A\u5F53\u3066\u30FB\u512A\u5148\u9806\u4F4D\u4ED8\u3051\u30FB\u9700\u8981\u5206\u6790\u304C\u3053\u306E\u9805\u76EE\u3092\u53C2\u7167\u3057\u307E\u3059\u3002", - options: { - new_implementation: "\u65B0\u898F\u5C0E\u5165", - expansion: "\u62E1\u5F35\u30FB\u8FFD\u52A0", - replacement: "\u5165\u308C\u66FF\u3048\u30FB\u79FB\u884C", - renewal: "\u66F4\u65B0", - consulting: "\u30B3\u30F3\u30B5\u30EB\u30C6\u30A3\u30F3\u30B0", - support: "\u4FDD\u5B88\u30FB\u30B5\u30DD\u30FC\u30C8", - other: "\u305D\u306E\u4ED6" - } - }, - estimated_amount: { - label: "\u4E88\u60F3\u91D1\u984D", - help: "\u30AF\u30AA\u30EA\u30D5\u30A3\u30B1\u30FC\u30B7\u30E7\u30F3\u524D\u306E\u9700\u8981\u91D1\u984D\u306E\u898B\u7A4D\u308A\u3002\u30B3\u30F3\u30D0\u30FC\u30B8\u30E7\u30F3\u6642\u306B\u5546\u8AC7\u91D1\u984D\u3078\u521D\u671F\u5024\u3068\u3057\u3066\u5165\u308A\u307E\u3059\u3002" - }, - conversion_approval_status: { - label: "\u30B3\u30F3\u30D0\u30FC\u30B8\u30E7\u30F3\u627F\u8A8D", - help: "\u3053\u306E\u898B\u8FBC\u5BA2\u304C\u30B3\u30F3\u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u627F\u8A8D\u3092\u5F97\u3066\u3044\u308B\u304B\u3002\u300C\u627F\u8A8D\u4E0D\u8981\u300D\u306F\u627F\u8A8D\u3092\u6C42\u3081\u306A\u3044\u72B6\u614B\u3067\u3001\u51FA\u8377\u6642\u306E\u65E2\u5B9A\u5024\u3067\u3059\u3002", - options: { - not_required: "\u627F\u8A8D\u4E0D\u8981", - pending: "\u627F\u8A8D\u5F85\u3061", - approved: "\u627F\u8A8D\u6E08\u307F", - rejected: "\u5374\u4E0B" - } - }, - disqualification_reason: { - label: "\u4E0D\u9069\u683C\u7406\u7531", - help: "\u30B9\u30C6\u30FC\u30BF\u30B9\u304C\u300C\u4E0D\u9069\u683C\u300D\u306E\u5834\u5408\u306F\u5FC5\u9808", - options: { - not_a_fit: "\u30CB\u30FC\u30BA\u304C\u5408\u308F\u306A\u3044", - no_budget: "\u4E88\u7B97\u306A\u3057", - wrong_persona: "\u62C5\u5F53\u8005\u304C\u7570\u306A\u308B", - unreachable: "\u9023\u7D61\u4E0D\u80FD", - duplicate: "\u91CD\u8907\u30EA\u30FC\u30C9", - competitor: "\u7AF6\u5408\u4ED6\u793E\u306B\u6C7A\u5B9A", - other: "\u305D\u306E\u4ED6" - } - }, - duplicate_of_type: { - label: "\u91CD\u8907\u5BFE\u8C61", - help: "\u91CD\u8907\u5143\u3068\u3057\u3066\u6B8B\u308B\u30EC\u30B3\u30FC\u30C9\u304C\u5C5E\u3059\u308B\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306E\u7A2E\u5225\u3002", - // `erased` は墓碑値であり選択肢ではない。フォームには表示しない - // (`src/sales/views/lead.view.ts` を参照)が、残存レコードが削除された - // リードはこの値を保持するため、レコードを読む場所ではラベルが要る。 - options: { crm_lead: "\u30EA\u30FC\u30C9", crm_contact: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", erased: "\u524A\u9664\u6E08\u307F\u30EC\u30B3\u30FC\u30C9" } - }, - duplicate_of_lead: { label: "\u91CD\u8907\u3059\u308B\u30EA\u30FC\u30C9" }, - duplicate_of_contact: { label: "\u91CD\u8907\u3059\u308B\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, - duplicate_status: { - label: "\u91CD\u8907\u30B9\u30C6\u30FC\u30BF\u30B9", - help: "\u300C\u91CD\u8907\u306E\u7591\u3044\u300D= \u767B\u9332\u6642\u306B\u81EA\u52D5\u3067\u4ED8\u4E0E\u3002\u300C\u91CD\u8907\u78BA\u5B9A\u300D= \u62C5\u5F53\u8005\u304C\u4E00\u81F4\u3092\u78BA\u8A8D\u6E08\u307F\u3002", - options: { suspected: "\u91CD\u8907\u306E\u7591\u3044", confirmed: "\u91CD\u8907\u78BA\u5B9A" } - } - }, - _views: { - all_leads: { - label: "\u5168\u30EA\u30FC\u30C9", - emptyState: { title: "\u30EA\u30FC\u30C9\u304C\u307E\u3060\u3042\u308A\u307E\u305B\u3093", message: "\u6700\u521D\u306E\u30EA\u30FC\u30C9\u3092\u4F5C\u6210\u3057\u3066\u59CB\u3081\u307E\u3057\u3087\u3046" } - }, - kanban_by_status: { label: "\u30EA\u30FC\u30C9\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3" }, - calendar_by_created: { label: "\u30EA\u30FC\u30C9\u30AB\u30EC\u30F3\u30C0\u30FC" }, - gallery_view: { label: "\u30EA\u30FC\u30C9\u30AB\u30FC\u30C9" }, - my_leads: { label: "\u79C1\u306E\u30EA\u30FC\u30C9" }, - high_priority: { label: "\u512A\u5148\u5EA6\u9AD8" }, - hot_leads: { label: "\u{1F525} \u30DB\u30C3\u30C8\u30EA\u30FC\u30C9" }, - suspected_duplicates: { - label: "\u91CD\u8907\u306E\u7591\u3044\u304C\u3042\u308B\u30EA\u30FC\u30C9", - emptyState: { - title: "\u91CD\u8907\u306E\u7591\u3044\u306F\u3042\u308A\u307E\u305B\u3093", - message: "\u78BA\u8A8D\u306F\u4E0D\u8981\u3067\u3059 \u2014 \u518D\u767B\u9332\u3055\u308C\u305F\u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9\u306F\u3059\u3079\u3066\u30C1\u30A7\u30C3\u30AF\u6E08\u307F\u3067\u3059\u3002" - } - } - }, - _sections: { - // オブジェクト定義のセクションキー(lead.object.ts)— 入力フォームと、 - // これらのグループを参照する詳細ページのセクション(#806)で使用 - address: { label: "\u4F4F\u6240" }, - identity: { label: "\u57FA\u672C\u60C5\u5831" }, - company_info: { label: "\u4F1A\u793E\u60C5\u5831" }, - contact_info: { label: "\u9023\u7D61\u5148\u60C5\u5831" }, - qualification: { label: "\u9069\u683C\u5224\u5B9A" }, - assignment: { label: "\u62C5\u5F53\u8005" }, - additional: { label: "\u305D\u306E\u4ED6\u306E\u60C5\u5831" }, - preferences: { label: "\u30B3\u30DF\u30E5\u30CB\u30B1\u30FC\u30B7\u30E7\u30F3\u8A2D\u5B9A" }, - conversion: { label: "\u5909\u63DB" }, - duplicates: { label: "\u91CD\u8907\u7BA1\u7406" }, - // lead.view.ts のフォームセクション名 (#1100) — デフォルトフォームと - // 名前付き formView すべてのセクション名がここに集まる。あちらにフォームを - // 追加したら、そのセクション名をここに追加する。 - contact_information: { label: "\u9023\u7D61\u5148\u60C5\u5831" }, - lead_classification: { label: "\u30EA\u30FC\u30C9\u5206\u985E" }, - company_information: { label: "\u4F1A\u793E\u60C5\u5831" }, - additional_information: { label: "\u8FFD\u52A0\u60C5\u5831" }, - privacy: { label: "\u30D7\u30E9\u30A4\u30D0\u30B7\u30FC" }, - general: { label: "\u4E00\u822C" }, - details: { label: "\u8A73\u7D30" }, - step_1_contact_details: { label: "\u30B9\u30C6\u30C3\u30D71\uFF1A\u9023\u7D61\u5148\u60C5\u5831" }, - step_2_company_information: { label: "\u30B9\u30C6\u30C3\u30D72\uFF1A\u4F1A\u793E\u60C5\u5831" }, - step_3_qualification: { label: "\u30B9\u30C6\u30C3\u30D73\uFF1A\u8CC7\u683C\u8A55\u4FA1" }, - step_4_review_and_convert: { label: "\u30B9\u30C6\u30C3\u30D74\uFF1A\u78BA\u8A8D\u3068\u5909\u63DB" }, - primary_information: { label: "\u4E3B\u8981\u60C5\u5831" }, - extended_details: { label: "\u8A73\u7D30\u60C5\u5831" }, - quick_edit: { label: "\u30AF\u30A4\u30C3\u30AF\u7DE8\u96C6" }, - update_lead_status: { label: "\u30EA\u30FC\u30C9\u30B9\u30C6\u30FC\u30BF\u30B9\u3092\u66F4\u65B0" }, - tell_us_about_yourself: { label: "\u3042\u306A\u305F\u306B\u3064\u3044\u3066\u6559\u3048\u3066\u304F\u3060\u3055\u3044" }, - about_your_company: { label: "\u8CB4\u793E\u306B\u3064\u3044\u3066" }, - how_can_we_help: { label: "\u3069\u306E\u3088\u3046\u306A\u3054\u7528\u4EF6\u3067\u3057\u3087\u3046\u304B\uFF1F" }, - lead_information: { label: "\u30EA\u30FC\u30C9\u60C5\u5831" }, - address_information: { label: "\u4F4F\u6240\u60C5\u5831" }, - privacy_preferences: { label: "\u30D7\u30E9\u30A4\u30D0\u30B7\u30FC\u8A2D\u5B9A" } - }, - _actions: { - ...activityActions3, - convert_lead: { - label: "\u30EA\u30FC\u30C9\u5909\u63DB", - successMessage: "\u30EA\u30FC\u30C9\u306E\u5909\u63DB\u306B\u6210\u529F\u3057\u307E\u3057\u305F\uFF01" - }, - create_campaign: { - label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306B\u8FFD\u52A0", - successMessage: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306B\u8FFD\u52A0\u3057\u307E\u3057\u305F\uFF01", - params: { - crm_campaign: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" } - } - }, - schedule_followup: { - label: "\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7\u3092\u8A2D\u5B9A", - successMessage: "\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7\u3092\u8A2D\u5B9A\u3057\u307E\u3057\u305F\u3002" - } - } - }, - crm_opportunity: { - _validations: { - amount_positive: { - message: "\u91D1\u984D\u306F 0 \u3088\u308A\u5927\u304D\u3044\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" - }, - close_date_future: { - message: "\u5546\u8AC7\u304C\u30AF\u30ED\u30FC\u30BA\u3057\u3066\u3044\u308B\u5834\u5408\u3092\u9664\u304D\u3001\u5B8C\u4E86\u4E88\u5B9A\u65E5\u3092\u904E\u53BB\u306B\u8A2D\u5B9A\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093" - }, - opportunity_stage_progression: { - message: "\u7121\u52B9\u306A\u5546\u8AC7\u30B9\u30C6\u30FC\u30B8\u9077\u79FB\u3067\u3059" - } - }, - label: "\u5546\u8AC7", - pluralLabel: "\u5546\u8AC7", - description: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u4E0A\u306E\u5546\u8AC7\u30FB\u6848\u4EF6", - fields: { - name: { label: "\u5546\u8AC7\u540D" }, - crm_account: { label: "\u53D6\u5F15\u5148" }, - primary_contact: { label: "\u4E3B\u62C5\u5F53\u8005" }, - owner_id: { label: "\u5546\u8AC7\u6240\u6709\u8005" }, - amount: { label: "\u91D1\u984D" }, - expected_revenue: { label: "\u671F\u5F85\u53CE\u76CA" }, - stage: { - label: "\u30B9\u30C6\u30FC\u30B8", - options: { ...opportunityStageOptions } - }, - probability: { label: "\u78BA\u5EA6 (%)" }, - close_date: { label: "\u5B8C\u4E86\u4E88\u5B9A\u65E5" }, - type: { - label: "\u30BF\u30A4\u30D7", - options: { - new_business: "\u65B0\u898F\u30D3\u30B8\u30CD\u30B9", - existing_upgrade: "\u65E2\u5B58\u9867\u5BA2 - \u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9", - existing_renewal: "\u65E2\u5B58\u9867\u5BA2 - \u66F4\u65B0", - existing_expansion: "\u65E2\u5B58\u9867\u5BA2 - \u62E1\u5927" - } - }, - forecast_category: { - label: "\u58F2\u4E0A\u4E88\u6E2C\u30AB\u30C6\u30B4\u30EA", - options: { - pipeline: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", - best_case: "\u30D9\u30B9\u30C8\u30B1\u30FC\u30B9", - commit: "\u30B3\u30DF\u30C3\u30C8", - omitted: "\u9664\u5916", - closed: "\u5B8C\u4E86" - } - }, - description: { label: "\u8AAC\u660E" }, - next_step: { label: "\u6B21\u306E\u30B9\u30C6\u30C3\u30D7" }, - lead_source: { label: "\u30EA\u30FC\u30C9\u30BD\u30FC\u30B9", options: { ...leadSourceOptions } }, - crm_campaign: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3", help: "\u3053\u306E\u5546\u8AC7\u3092\u751F\u307F\u51FA\u3057\u305F\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" }, - days_in_stage: { label: "\u73FE\u30B9\u30C6\u30FC\u30B8\u6EDE\u5728\u65E5\u6570" }, - stage_entry_date: { label: "\u30B9\u30C6\u30FC\u30B8\u958B\u59CB\u65E5", help: "\u3053\u306E\u5546\u8AC7\u304C\u73FE\u5728\u306E\u30B9\u30C6\u30FC\u30B8\u306B\u5165\u3063\u305F\u65E5\u3002" }, - is_private: { label: "\u975E\u516C\u958B" }, - approval_status: { - label: "\u627F\u8A8D\u30B9\u30C6\u30FC\u30BF\u30B9", - options: { not_required: "\u627F\u8A8D\u4E0D\u8981", pending: "\u627F\u8A8D\u5F85\u3061", approved: "\u627F\u8A8D\u6E08\u307F", rejected: "\u5374\u4E0B" } - }, - approved_date: { label: "\u627F\u8A8D\u65E5" }, - // #593 — 商談クローズ時に必須。失注理由は営業ダッシュボードの - // 内訳ウィジェットにも出るため、保存値がそのまま画面に出てはいけない。 - win_reason: { - label: "\u53D7\u6CE8\u7406\u7531", - help: "\u53D7\u6CE8\u306B\u81F3\u3063\u305F\u7406\u7531\u3002\u5546\u8AC7\u3092\u300C\u6210\u7ACB\u300D\u3067\u30AF\u30ED\u30FC\u30BA\u3059\u308B\u969B\u306B\u5FC5\u9808\u3067\u3059\u3002", - options: { - better_product: "\u88FD\u54C1\u304C\u512A\u308C\u3066\u3044\u308B", - better_price: "\u4FA1\u683C\u304C\u512A\u308C\u3066\u3044\u308B", - relationship: "\u65E2\u5B58\u306E\u95A2\u4FC2", - better_support: "\u30B5\u30DD\u30FC\u30C8\u304C\u512A\u308C\u3066\u3044\u308B", - best_fit: "\u6700\u9069\u306A\u6A5F\u80FD\u30FB\u9069\u5408\u6027", - quote_accepted: "\u898B\u7A4D\u627F\u8A8D", - other: "\u305D\u306E\u4ED6" - } - }, - loss_reason: { - label: "\u5931\u6CE8\u7406\u7531", - help: "\u5931\u6CE8\u3057\u305F\u7406\u7531\u3002\u5546\u8AC7\u3092\u300C\u4E0D\u6210\u7ACB\u300D\u3067\u30AF\u30ED\u30FC\u30BA\u3059\u308B\u969B\u306B\u5FC5\u9808\u3067\u3059\u3002", - options: { - price: "\u4FA1\u683C\u304C\u9AD8\u3059\u304E\u308B", - competitor: "\u7AF6\u5408\u4ED6\u793E\u306B\u6557\u5317", - no_budget: "\u4E88\u7B97\u306A\u3057", - no_decision: "\u610F\u601D\u6C7A\u5B9A\u306A\u3057", - timing: "\u30BF\u30A4\u30DF\u30F3\u30B0\u4E0D\u9069", - features: "\u6A5F\u80FD\u4E0D\u8DB3", - other: "\u305D\u306E\u4ED6" - } - }, - loss_details: { label: "\u53D7\u6CE8\u30FB\u5931\u6CE8\u306E\u8A73\u7D30", help: "\u53D7\u6CE8\u30FB\u5931\u6CE8\u7406\u7531\u306E\u88DC\u8DB3\u8AAC\u660E\uFF08\u81EA\u7531\u8A18\u8FF0\uFF09\u3002" }, - // REQ-0006 — 適格判定、顧客側の調達スケジュール、商談の経緯、事業区分、ステータス変更承認。 - will_bid: { label: "\u5165\u672D\u4E88\u5B9A", help: "\u5165\u672D\u3059\u308B\u610F\u5411\u304C\u3042\u308B\u304B\u3069\u3046\u304B\u3002\u672A\u8A2D\u5B9A\u306F\u5224\u65AD\u304C\u4FDD\u7559\u4E2D\u3067\u3042\u308B\u3053\u3068\u3092\u793A\u3057\u307E\u3059\u3002" }, - controllability: { label: "\u30B3\u30F3\u30C8\u30ED\u30FC\u30EB\u5EA6", options: { high: "\u9AD8", medium: "\u4E2D", low: "\u4F4E" } }, - priority: { label: "\u512A\u5148\u5EA6", options: { high: "\u9AD8", medium: "\u4E2D", low: "\u4F4E" } }, - deal_level: { label: "\u5546\u8AC7\u30E9\u30F3\u30AF", options: { strategic: "\u6226\u7565", key: "\u91CD\u70B9", standard: "\u6A19\u6E96" } }, - is_subcontracted: { label: "\u5916\u6CE8\u3042\u308A" }, - subcontracting_note: { label: "\u5916\u6CE8\u30E1\u30E2" }, - customer_initiation_date: { label: "\u9867\u5BA2\u306E\u6848\u4EF6\u5316\u65E5" }, - expected_tender_date: { label: "\u5165\u672D\u4E88\u5B9A\u65E5" }, - expected_signing_date: { label: "\u5951\u7D04\u7DE0\u7D50\u4E88\u5B9A\u65E5" }, - expected_tender_amount: { label: "\u5165\u672D\u4E88\u5B9A\u91D1\u984D" }, - expected_signing_amount: { label: "\u5951\u7D04\u4E88\u5B9A\u91D1\u984D" }, - business_line: { - label: "\u4E8B\u696D\u533A\u5206", - options: { - product: "\u88FD\u54C1", - services: "\u30D7\u30ED\u30D5\u30A7\u30C3\u30B7\u30E7\u30CA\u30EB\u30B5\u30FC\u30D3\u30B9", - consulting: "\u30B3\u30F3\u30B5\u30EB\u30C6\u30A3\u30F3\u30B0", - support: "\u4FDD\u5B88\u30FB\u30B5\u30DD\u30FC\u30C8", - other: "\u305D\u306E\u4ED6" - } - }, - customer_background: { label: "\u9867\u5BA2\u6982\u8981" }, - project_background: { label: "\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u80CC\u666F" }, - risk_analysis: { label: "\u30EA\u30B9\u30AF\u5206\u6790" }, - payment_terms: { label: "\u652F\u6255\u6761\u4EF6" }, - requested_status: { label: "\u7533\u8ACB\u30B9\u30C6\u30FC\u30BF\u30B9", options: { closed_won: "\u53D7\u6CE8", closed_lost: "\u5931\u6CE8" } }, - status_change_approval_status: { - label: "\u30B9\u30C6\u30FC\u30BF\u30B9\u5909\u66F4\u627F\u8A8D", - options: { not_required: "\u627F\u8A8D\u4E0D\u8981", pending: "\u627F\u8A8D\u5F85\u3061", approved: "\u627F\u8A8D\u6E08\u307F", rejected: "\u5374\u4E0B" } - }, - // REQ-0006 ステップ 11 — 案件化(立项)承認。 - qualification_requested: { - label: "\u6848\u4EF6\u5316\u627F\u8A8D\u3092\u7533\u8ACB", - help: "\u30C1\u30A7\u30C3\u30AF\u3059\u308B\u3068\u3053\u306E\u5546\u8AC7\u3092\u6848\u4EF6\u5316\u627F\u8A8D\u306B\u56DE\u3057\u307E\u3059\u3002\u5374\u4E0B\u3055\u308C\u308B\u3068\u30C1\u30A7\u30C3\u30AF\u304C\u5916\u308C\u307E\u3059\u3002\u518D\u5EA6\u30C1\u30A7\u30C3\u30AF\u3059\u308B\u3068\u6539\u3081\u3066\u7533\u8ACB\u3067\u304D\u307E\u3059\u3002" - }, - qualification_approval_status: { - label: "\u6848\u4EF6\u5316\u627F\u8A8D", - options: { not_required: "\u627F\u8A8D\u4E0D\u8981", pending: "\u627F\u8A8D\u5F85\u3061", approved: "\u627F\u8A8D\u6E08\u307F", rejected: "\u5374\u4E0B" } - } - }, - _views: { - tender_this_quarter: { - label: "\u4ECA\u56DB\u534A\u671F\u306B\u5165\u672D\u4E88\u5B9A", - emptyState: { - title: "\u4ECA\u56DB\u534A\u671F\u306B\u5165\u672D\u4E88\u5B9A\u306E\u5546\u8AC7\u306F\u3042\u308A\u307E\u305B\u3093", - message: "\u3053\u306E\u30BF\u30D6\u306B\u306F\u3001\u9867\u5BA2\u5074\u306E\u5165\u672D\u4E88\u5B9A\u65E5\u304C\u4ECA\u56DB\u534A\u671F\u5185\u306B\u3042\u308B\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002\u5546\u8AC7\u306B\u300C\u5165\u672D\u4E88\u5B9A\u65E5\u300D\u3092\u5165\u529B\u3059\u308B\u3068\u3001\u3053\u3053\u306B\u8868\u793A\u3055\u308C\u307E\u3059\u3002" - } - }, - open_opportunities: { label: "\u9032\u884C\u4E2D\u306E\u5546\u8AC7" }, - all_opportunities: { label: "\u5168\u5546\u8AC7" }, - pipeline_kanban: { label: "\u30BB\u30FC\u30EB\u30B9\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3" }, - close_date_calendar: { label: "\u4E88\u6E2C\u30AB\u30EC\u30F3\u30C0\u30FC" }, - deal_timeline: { label: "\u5546\u8AC7\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3" }, - deal_gallery: { label: "\u5546\u8AC7\u30AB\u30FC\u30C9" }, - my_open_deals: { label: "\u79C1\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7" }, - stale_opportunities: { label: "\u26A0\uFE0F \u505C\u6EDE\u5546\u8AC7 \xB7 \u30B9\u30C6\u30FC\u30B8\u6EDE\u5728\u304C\u9577\u3044\u9806" }, - closing_this_quarter: { - label: "\u4ECA\u56DB\u534A\u671F\u306B\u30AF\u30ED\u30FC\u30BA\u4E88\u5B9A", - emptyState: { - title: "\u4ECA\u56DB\u534A\u671F\u306B\u30AF\u30ED\u30FC\u30BA\u4E88\u5B9A\u306E\u5546\u8AC7\u306F\u3042\u308A\u307E\u305B\u3093", - message: "\u3053\u306E\u30BF\u30D6\u306B\u306F\u3001\u5B8C\u4E86\u4E88\u5B9A\u65E5\u304C\u4ECA\u56DB\u534A\u671F\u5185\u306B\u3042\u308B\u30B3\u30DF\u30C3\u30C8\uFF0F\u30D9\u30B9\u30C8\u30B1\u30FC\u30B9\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002\u73FE\u5728\u8A72\u5F53\u3059\u308B\u5546\u8AC7\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u305D\u308C\u4EE5\u964D\u306B\u30AF\u30ED\u30FC\u30BA\u3059\u308B\u5546\u8AC7\u306F\u300C\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u300D\u30BF\u30D6\u306B\u3042\u308A\u307E\u3059\u3002" - } - } - }, - _sections: { - // オブジェクト定義のセクションキー(opportunity.object.ts)— 入力フォームと、 - // これらのグループを参照する詳細ページのセクション(#1452)で使用 - crm_forecast: { label: "\u30B9\u30C6\u30FC\u30B8\u30FB\u58F2\u4E0A\u4E88\u6E2C" }, - basic: { label: "\u57FA\u672C\u60C5\u5831" }, - financials: { label: "\u8CA1\u52D9\u60C5\u5831" }, - sales_process: { label: "\u55B6\u696D\u30D7\u30ED\u30BB\u30B9" }, - classification: { label: "\u5206\u985E" }, - campaign: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" }, - notes: { label: "\u30E1\u30E2\u30FB\u6B21\u306E\u30B9\u30C6\u30C3\u30D7" }, - qualification: { label: "\u9069\u683C\u5224\u5B9A" }, - narrative: { label: "\u5546\u8AC7\u306E\u7D4C\u7DEF" }, - // opportunity.view.ts のフォームセクション名 (#1100) - overview: { label: "\u6982\u8981" }, - forecast: { label: "\u4E88\u6E2C" }, - sales_strategy: { label: "\u55B6\u696D\u6226\u7565" }, - win_loss: { label: "\u53D7\u6CE8\uFF0F\u5931\u6CE8" } - }, - _actions: { - ...activityActions3, - clone_opportunity: { - label: "\u5546\u8AC7\u3092\u8907\u88FD", - successMessage: "\u5546\u8AC7\u3092\u8907\u88FD\u3057\u307E\u3057\u305F\uFF01" - }, - mass_update_stage: { - label: "\u30B9\u30C6\u30FC\u30B8\u66F4\u65B0", - successMessage: "\u5546\u8AC7\u30B9\u30C6\u30FC\u30B8\u3092\u66F4\u65B0\u3057\u307E\u3057\u305F\uFF01", - params: { - stage: { - label: "\u65B0\u3057\u3044\u30B9\u30C6\u30FC\u30B8", - options: { ...opportunityStageOptions } - } - } - }, - generate_quote: { - label: "\u898B\u7A4D\u3092\u4F5C\u6210", - successMessage: "\u5546\u8AC7\u304B\u3089\u898B\u7A4D\u3092\u4F5C\u6210\u3057\u307E\u3057\u305F\uFF01" - } - } - }, - crm_opportunity_line_item: { - _validations: { - unit_price_positive: { - message: "\u8CA9\u58F2\u4FA1\u683C\u3092\u8CA0\u306E\u5024\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093" - } - }, - label: "\u5546\u8AC7\u5546\u54C1\u660E\u7D30", - pluralLabel: "\u5546\u8AC7\u5546\u54C1\u660E\u7D30", - description: "\u5546\u8AC7\u914D\u4E0B\u306E\u88FD\u54C1\u5225\u4FA1\u683C\u660E\u7D30\u884C", - fields: { - crm_opportunity: { label: "\u5546\u8AC7" }, - crm_product: { label: "\u88FD\u54C1" }, - description: { label: "\u8AAC\u660E" }, - quantity: { label: "\u6570\u91CF" }, - list_price: { label: "\u5B9A\u4FA1", help: "\u88FD\u54C1\u306E\u30AB\u30BF\u30ED\u30B0\u4FA1\u683C\u304B\u3089\u81EA\u52D5\u5165\u529B\u3055\u308C\u307E\u3059" }, - unit_price: { label: "\u8CA9\u58F2\u4FA1\u683C", help: "\u4EA4\u6E09\u5F8C\u306E\u5358\u4FA1\uFF08\u5B9A\u4FA1\u3068\u7570\u306A\u308B\u5834\u5408\u304C\u3042\u308A\u307E\u3059\uFF09" }, - discount: { label: "\u5272\u5F15\u7387\uFF08%\uFF09" }, - total_price: { label: "\u5408\u8A08" }, - line_number: { label: "\u884C\u756A\u53F7" } - }, - _sections: { - basic: { label: "\u660E\u7D30\u884C" }, - pricing: { label: "\u4FA1\u683C" } - } - }, - crm_forecast: { - _validations: { - period_end_after_start: { - message: "\u671F\u9593\u7D42\u4E86\u306F\u671F\u9593\u958B\u59CB\u3088\u308A\u5F8C\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002" - }, - period_end_matches_calendar_period: { - message: "\u671F\u9593\u7D42\u4E86\u306F\u305D\u306E\u671F\u9593\u306E\u6700\u7D42\u65E5\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u4F8B\uFF1A2026-07-01 \u958B\u59CB\u306E\u56DB\u534A\u671F\u306A\u3089 2026-09-30\u30012026 \u5E74 8 \u6708\u306A\u3089 2026-08-31\u3002" - }, - period_start_first_of_period: { - message: "\u671F\u9593\u958B\u59CB\u306F\u305D\u306E\u671F\u9593\u306E\u521D\u65E5\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u4F8B\uFF1A2026 \u5E74 8 \u6708\u306A\u3089 2026-08-01\u3002" - }, - quarter_starts_on_quarter_boundary: { - message: "\u56DB\u534A\u671F\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8\u306F\u56DB\u534A\u671F\u306E\u5883\u754C\uFF081 \u6708 1 \u65E5\u30014 \u6708 1 \u65E5\u30017 \u6708 1 \u65E5\u300110 \u6708 1 \u65E5\uFF09\u304B\u3089\u958B\u59CB\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002" - }, - snapshot_amounts_non_negative: { - message: "\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u91D1\u984D\u306F\u8CA0\u306E\u5024\u306B\u3067\u304D\u307E\u305B\u3093\u3002" - } - }, - label: "\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8", - pluralLabel: "\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8", - description: "\u62C5\u5F53\u8005\u3054\u3068\u306E\u5B9A\u671F\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3067\u53CE\u76CA\u4E88\u6E2C\u306B\u4F7F\u7528", - fields: { - owner_id: { label: "\u62C5\u5F53\u8005" }, - period: { label: "\u671F\u9593", options: { month: "\u6708\u6B21", quarter: "\u56DB\u534A\u671F" } }, - period_start: { - label: "\u671F\u9593\u958B\u59CB", - help: "\u671F\u9593\u306E\u521D\u65E5\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059 \u2014 \u4F8B: 2026 \u5E74 8 \u6708\u306A\u3089 2026-08-01\u3002\u56DB\u534A\u671F\u306E\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8\u306F\u3055\u3089\u306B\u56DB\u534A\u671F\u306E\u5883\u754C\uFF081 \u6708 1 \u65E5\u30FB4 \u6708 1 \u65E5\u30FB7 \u6708 1 \u65E5\u30FB10 \u6708 1 \u65E5\uFF09\u3067\u958B\u59CB\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002" - }, - period_end: { - label: "\u671F\u9593\u7D42\u4E86", - help: "\u901A\u5E38\u306F\u300C\u671F\u9593\u300D\u3068\u300C\u671F\u9593\u958B\u59CB\u300D\u304B\u3089\u81EA\u52D5\u7684\u306B\u7B97\u51FA\u3055\u308C\u307E\u3059\u3002\u624B\u52D5\u3067\u5165\u529B\u3059\u308B\u5834\u5408\u306F\u3001\u305D\u306E\u671F\u9593\u306E\u6700\u7D42\u65E5\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059 \u2014 \u4F8B: 2026-07-01 \u958B\u59CB\u306E\u56DB\u534A\u671F\u306A\u3089 2026-09-30\u30012026 \u5E74 8 \u6708\u306A\u3089 2026-08-31\u3002" - }, - period_label: { - label: "\u671F\u9593", - help: "\u300C2026 \u5E74\u7B2C 3 \u56DB\u534A\u671F\u300D\u300C2026 \u5E74 8 \u6708\u300D\u306E\u3088\u3046\u306A\u8AAD\u307F\u3084\u3059\u3044\u671F\u9593\u30E9\u30D9\u30EB\u3002" - }, - display_title: { label: "\u8868\u793A\u540D" }, - snapshot_date: { label: "\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u65E5", help: "\u3053\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u53D6\u5F97\u3057\u305F\u65E5\u3002" }, - source: { - label: "\u30BD\u30FC\u30B9", - options: { scheduled: "\u5B9A\u671F\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8", ai: "AI \u30B9\u30AD\u30EB", manual: "\u624B\u52D5\u5165\u529B" } - }, - quota: { label: "\u30AF\u30A9\u30FC\u30BF" }, - pipeline_amount: { - label: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3", - help: "\u3053\u306E\u671F\u9593\u306B\u30AF\u30ED\u30FC\u30BA\u4E88\u5B9A\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u306E\u5408\u8A08\u91D1\u984D\uFF08\u30B9\u30C6\u30FC\u30B8\u3092\u554F\u308F\u306A\u3044\uFF09\u3002" - }, - best_case_amount: { - label: "\u30D9\u30B9\u30C8\u30B1\u30FC\u30B9", - help: "\u58F2\u4E0A\u4E88\u6E2C\u30AB\u30C6\u30B4\u30EA\u304C\u300C\u30D9\u30B9\u30C8\u30B1\u30FC\u30B9\u300D\u307E\u305F\u306F\u300C\u30B3\u30DF\u30C3\u30C8\u300D\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\u3002" - }, - commit_amount: { - label: "\u30B3\u30DF\u30C3\u30C8", - help: "\u58F2\u4E0A\u4E88\u6E2C\u30AB\u30C6\u30B4\u30EA\u304C\u300C\u30B3\u30DF\u30C3\u30C8\u300D\u306E\u30AA\u30FC\u30D7\u30F3\u5546\u8AC7\uFF08\u62C5\u5F53\u8005\u304C\u30B3\u30DF\u30C3\u30C8\u6E08\u307F\uFF09\u3002" - }, - closed_amount: { label: "\u30AF\u30ED\u30FC\u30BA", help: "\u3053\u306E\u671F\u9593\u306B\u3059\u3067\u306B\u6210\u7ACB\u3057\u305F\u91D1\u984D\u3002" }, - expected_amount: { - label: "\u4E88\u60F3", - help: "\u30AF\u30ED\u30FC\u30BA + \u30B3\u30DF\u30C3\u30C8 \u2014 \u62C5\u5F53\u8005\u304C\u7121\u7406\u306A\u304F\u7740\u5730\u3092\u898B\u8FBC\u3081\u308B\u91D1\u984D\u3002" - }, - attainment_pct: { - label: "\u9054\u6210\u7387 %", - help: "\u30AF\u30ED\u30FC\u30BA \xF7 \u30AF\u30A9\u30FC\u30BF \xD7 100\u3002\u30AF\u30A9\u30FC\u30BF\u304C\u6B63\u306E\u5024\u306B\u306A\u308B\u307E\u3067\u306F 0% \u3068\u8868\u793A\u3055\u308C\u307E\u3059\u3002" - }, - coverage_ratio: { - label: "\u30AB\u30D0\u30EC\u30C3\u30B8", - help: "\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3 \xF7\uFF08\u30AF\u30A9\u30FC\u30BF \u2212 \u30AF\u30ED\u30FC\u30BA\uFF09\u2014 \u6B8B\u308A\u306E\u5DEE\u5206\u3092\u57CB\u3081\u308B\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u304C\u5341\u5206\u304B\u3069\u3046\u304B\u3002\u30AF\u30A9\u30FC\u30BF\u9054\u6210\u6E08\u307F\u306E\u5834\u5408\u306F 0 \u3068\u8868\u793A\u3055\u308C\u307E\u3059\u3002" - }, - notes: { label: "\u30E1\u30E2" }, - seed_key: { - label: "\u30B7\u30FC\u30C9\u30AD\u30FC", - help: "\u30C7\u30E2\u30C7\u30FC\u30BF\u306E\u8B58\u5225\u5B50\u3002\u30B7\u30FC\u30C9\u30ED\u30FC\u30C0\u30FC\u3060\u3051\u304C\u66F8\u304D\u8FBC\u307F\u3001\u5B9F\u969B\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3067\u306F\u5E38\u306B\u7A7A\u3067\u3059\u3002" - } - }, - _views: { - all_forecasts: { label: "\u3059\u3079\u3066\u306E\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8" }, - this_quarter_forecasts: { - label: "\u4ECA\u56DB\u534A\u671F", - emptyState: { - title: "\u4ECA\u56DB\u534A\u671F\u306E\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u306F\u307E\u3060\u3042\u308A\u307E\u305B\u3093", - message: "\u56DB\u534A\u671F\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u306F\u591C\u9593\u306E\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8\u96C6\u8A08\u304C\u66F8\u304D\u8FBC\u307F\u307E\u3059\u3002\u4ECA\u56DB\u534A\u671F\u5206\u304C\u4E00\u5EA6\u5B9F\u884C\u3055\u308C\u308B\u307E\u3067\u3053\u306E\u30D3\u30E5\u30FC\u306F\u7A7A\u3067\u3059\u3002\u78BA\u5B9A\u6E08\u307F\u306E\u56DB\u534A\u671F\u306F\u300C\u3059\u3079\u3066\u300D\u30BF\u30D6\u306B\u3042\u308A\u307E\u3059\u3002" - } - }, - my_forecast: { label: "\u81EA\u5206\u306E\u30D5\u30A9\u30FC\u30AD\u30E3\u30B9\u30C8" } - }, - _sections: { - basic: { label: "\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8" }, - amounts: { label: "\u91D1\u984D" }, - meta: { label: "\u30BD\u30FC\u30B9" }, - // forecast.view.ts のフォームセクション名 (#1100) - snapshot: { label: "\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8" }, - notes: { label: "\u30E1\u30E2" } - } - } -}; - -// src/sales/translations/ja-JP/objects.commerce.ts -var paymentTermsOptions = { - net_15: "15 \u65E5\u4EE5\u5185\u6255\u3044", - net_30: "30 \u65E5\u4EE5\u5185\u6255\u3044", - net_60: "60 \u65E5\u4EE5\u5185\u6255\u3044", - net_90: "90 \u65E5\u4EE5\u5185\u6255\u3044", - due_on_receipt: "\u8ACB\u6C42\u66F8\u53D7\u9818\u6642\u6255\u3044" -}; -var commerce3 = { - crm_quote: { - _validations: { - discount_within_ceiling: { - message: "\u5272\u5F15\u7387\u306F 60% \u3092\u8D85\u3048\u3089\u308C\u307E\u305B\u3093" - }, - expiration_after_quote: { - message: "\u6709\u52B9\u671F\u9650\u306F\u898B\u7A4D\u65E5\u3088\u308A\u5F8C\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" - }, - quote_status_progression: { - message: "\u7121\u52B9\u306A\u898B\u7A4D\u30B9\u30C6\u30FC\u30BF\u30B9\u9077\u79FB\u3067\u3059" - } - }, - label: "\u898B\u7A4D", - pluralLabel: "\u898B\u7A4D", - description: "\u9867\u5BA2\u306B\u63D0\u793A\u3059\u308B\u4FA1\u683C\u898B\u7A4D", - fields: { - quote_number: { label: "\u898B\u7A4D\u756A\u53F7" }, - name: { label: "\u898B\u7A4D\u540D" }, - display_title: { label: "\u8868\u793A\u540D" }, - crm_account: { label: "\u53D6\u5F15\u5148" }, - crm_contact: { - label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", - help: "\u898B\u7A4D\u304C\u300C\u63D0\u793A\u6E08\u307F\u300D\u307E\u305F\u306F\u300C\u627F\u8A8D\u6E08\u307F\u300D\u306B\u306A\u3063\u305F\u6642\u70B9\u3067\u5FC5\u9808\u3067\u3059\u3002\u4F5C\u6210\u3055\u308C\u308B\u5951\u7D04\u306E\u4E3B\u62C5\u5F53\u8005\u306F\u3053\u3053\u304B\u3089\u5F15\u304D\u7D99\u304C\u308C\u307E\u3059\u3002" - }, - crm_opportunity: { label: "\u5546\u8AC7" }, - owner_id: { label: "\u898B\u7A4D\u62C5\u5F53\u8005" }, - status: { - label: "\u30B9\u30C6\u30FC\u30BF\u30B9", - options: { - draft: "\u4E0B\u66F8\u304D", - in_review: "\u30EC\u30D3\u30E5\u30FC\u4E2D", - presented: "\u63D0\u793A\u6E08\u307F", - accepted: "\u627F\u8A8D\u6E08\u307F", - rejected: "\u5374\u4E0B", - expired: "\u671F\u9650\u5207\u308C" - } - }, - quote_date: { label: "\u898B\u7A4D\u65E5" }, - expiration_date: { label: "\u6709\u52B9\u671F\u9650" }, - subtotal: { label: "\u5C0F\u8A08" }, - discount: { label: "\u5272\u5F15\u7387(%)" }, - discount_amount: { label: "\u5272\u5F15\u984D" }, - tax: { label: "\u7A0E\u984D" }, - shipping_handling: { label: "\u914D\u9001\u30FB\u624B\u6570\u6599" }, - total_price: { label: "\u5408\u8A08\u91D1\u984D" }, - payment_terms: { label: "\u652F\u6255\u6761\u4EF6", options: { ...paymentTermsOptions } }, - shipping_terms: { label: "\u914D\u9001\u6761\u4EF6" }, - billing_address: { label: "\u8ACB\u6C42\u5148\u4F4F\u6240" }, - shipping_address: { label: "\u914D\u9001\u5148\u4F4F\u6240" }, - description: { label: "\u8AAC\u660E" }, - internal_notes: { label: "\u5185\u90E8\u30E1\u30E2" } - }, - _views: { - all_quotes: { label: "\u5168\u898B\u7A4D" }, - quote_pipeline: { label: "\u898B\u7A4D\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3" }, - quote_calendar: { label: "\u898B\u7A4D\u30AB\u30EC\u30F3\u30C0\u30FC" } - }, - _sections: { - basic: { label: "\u898B\u7A4D\u60C5\u5831" }, - pricing: { label: "\u4FA1\u683C" }, - terms: { label: "\u6761\u4EF6\u30FB\u6709\u52B9\u671F\u9650" }, - address: { label: "\u4F4F\u6240" }, - system: { label: "\u30B7\u30B9\u30C6\u30E0" }, - // quote.view.ts のフォームセクション名 (#1100) - quote: { label: "\u898B\u7A4D\u66F8" }, - totals: { label: "\u5408\u8A08" }, - quote_terms: { label: "\u5951\u7D04\u6761\u4EF6" }, - addresses_and_notes: { label: "\u4F4F\u6240\u3068\u5099\u8003" } - } - }, - crm_quote_line_item: { - _validations: { - discount_within_ceiling: { - message: "\u660E\u7D30\u306E\u5272\u5F15\u7387\u306F 60% \u3092\u8D85\u3048\u3089\u308C\u307E\u305B\u3093" - }, - unit_price_positive: { - message: "\u8CA9\u58F2\u4FA1\u683C\u3092\u8CA0\u306E\u5024\u306B\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093" - } - }, - label: "\u898B\u7A4D\u660E\u7D30", - pluralLabel: "\u898B\u7A4D\u660E\u7D30", - description: "\u898B\u7A4D\u914D\u4E0B\u306E\u88FD\u54C1\u5225\u4FA1\u683C\u660E\u7D30\u884C", - fields: { - crm_quote: { label: "\u898B\u7A4D" }, - crm_product: { label: "\u88FD\u54C1" }, - description: { label: "\u8AAC\u660E" }, - quantity: { label: "\u6570\u91CF" }, - list_price: { label: "\u5B9A\u4FA1" }, - unit_price: { label: "\u8CA9\u58F2\u4FA1\u683C" }, - discount: { label: "\u5272\u5F15\u7387\uFF08%\uFF09" }, - subtotal: { label: "\u5C0F\u8A08" }, - total_price: { label: "\u5408\u8A08" }, - line_number: { label: "\u884C\u756A\u53F7" } - }, - _sections: { - basic: { label: "\u660E\u7D30\u884C" }, - pricing: { label: "\u4FA1\u683C" } - } - }, - crm_contract: { - _validations: { - end_after_start: { - message: "\u7D42\u4E86\u65E5\u306F\u958B\u59CB\u65E5\u3088\u308A\u5F8C\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" - }, - contract_status_progression: { - message: "\u7121\u52B9\u306A\u5951\u7D04\u30B9\u30C6\u30FC\u30BF\u30B9\u9077\u79FB\u3067\u3059" - } - }, - label: "\u5951\u7D04", - pluralLabel: "\u5951\u7D04", - description: "\u9867\u5BA2\u3068\u7DE0\u7D50\u3057\u305F\u6CD5\u7684\u306A\u5951\u7D04\u30FB\u5408\u610F", - fields: { - contract_number: { label: "\u5951\u7D04\u756A\u53F7" }, - crm_account: { label: "\u53D6\u5F15\u5148" }, - crm_contact: { label: "\u4E3B\u62C5\u5F53\u8005" }, - crm_opportunity: { label: "\u95A2\u9023\u5546\u8AC7" }, - owner_id: { label: "\u5951\u7D04\u62C5\u5F53\u8005" }, - status: { - label: "\u30B9\u30C6\u30FC\u30BF\u30B9", - options: { - draft: "\u4E0B\u66F8\u304D", - in_approval: "\u627F\u8A8D\u4E2D", - activated: "\u6709\u52B9", - expired: "\u671F\u9650\u5207\u308C", - terminated: "\u89E3\u7D04" - } - }, - contract_term_months: { label: "\u5951\u7D04\u671F\u9593\uFF08\u6708\uFF09" }, - start_date: { label: "\u958B\u59CB\u65E5" }, - end_date: { label: "\u7D42\u4E86\u65E5" }, - contract_value: { label: "\u5951\u7D04\u91D1\u984D" }, - billing_frequency: { - label: "\u8ACB\u6C42\u983B\u5EA6", - options: { monthly: "\u6708\u6B21", quarterly: "\u56DB\u534A\u671F", annually: "\u5E74\u6B21", one_time: "\u4E00\u62EC" } - }, - payment_terms: { label: "\u652F\u6255\u6761\u4EF6", options: { ...paymentTermsOptions } }, - auto_renewal: { label: "\u81EA\u52D5\u66F4\u65B0" }, - renewal_notice_days: { label: "\u66F4\u65B0\u901A\u77E5\uFF08\u65E5\uFF09" }, - contract_type: { - label: "\u5951\u7D04\u7A2E\u5225", - options: { - subscription: "\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3\u5951\u7D04", - service: "\u30B5\u30FC\u30D3\u30B9\u5951\u7D04", - license: "\u30E9\u30A4\u30BB\u30F3\u30B9\u5951\u7D04", - partnership: "\u30D1\u30FC\u30C8\u30CA\u30FC\u30B7\u30C3\u30D7\u5951\u7D04", - nda: "\u79D8\u5BC6\u4FDD\u6301\u5951\u7D04 (NDA)", - msa: "\u57FA\u672C\u5951\u7D04 (MSA)" - } - }, - signed_date: { label: "\u7F72\u540D\u65E5" }, - signed_by: { label: "\u7F72\u540D\u8005" }, - document_url: { label: "\u5951\u7D04\u66F8\u985E" }, - special_terms: { label: "\u7279\u7D04\u4E8B\u9805" }, - description: { label: "\u8AAC\u660E" }, - billing_address: { label: "\u8ACB\u6C42\u5148\u4F4F\u6240" } - }, - _views: { - all_contracts: { label: "\u5168\u5951\u7D04" }, - renewal_calendar: { label: "\u66F4\u65B0\u30AB\u30EC\u30F3\u30C0\u30FC" }, - contract_gantt: { label: "\u5951\u7D04\u671F\u9593" }, - contract_timeline: { label: "\u5951\u7D04\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3" } - }, - _sections: { - basic: { label: "\u5951\u7D04\u60C5\u5831" }, - parties: { label: "\u5951\u7D04\u5F53\u4E8B\u8005" }, - terms: { label: "\u5951\u7D04\u6761\u4EF6\u30FB\u671F\u9593" }, - value: { label: "\u5951\u7D04\u91D1\u984D" }, - status: { label: "\u30B9\u30C6\u30FC\u30BF\u30B9\u30FB\u627F\u8A8D" }, - renewal: { label: "\u66F4\u65B0" }, - // contract.view.ts のフォームセクション名 (#1100) - contract_terms: { label: "\u5951\u7D04\u6761\u4EF6" }, - signing_and_documents: { label: "\u7F72\u540D\u3068\u66F8\u985E" }, - notes: { label: "\u5099\u8003" } - } - }, - crm_product: { - _validations: { - cost_less_than_price: { - message: "\u539F\u4FA1\u306F\u5B9A\u4FA1\u3088\u308A\u4F4E\u304F\u3057\u3066\u304F\u3060\u3055\u3044" - }, - price_positive: { - message: "\u5B9A\u4FA1\u306F\u6B63\u306E\u5024\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" - } - }, - label: "\u88FD\u54C1", - pluralLabel: "\u88FD\u54C1", - description: "\u81EA\u793E\u304C\u63D0\u4F9B\u3059\u308B\u88FD\u54C1\u30FB\u30B5\u30FC\u30D3\u30B9", - fields: { - product_code: { label: "\u88FD\u54C1\u30B3\u30FC\u30C9" }, - name: { label: "\u88FD\u54C1\u540D" }, - display_title: { label: "\u8868\u793A\u540D" }, - description: { label: "\u8AAC\u660E" }, - category: { - label: "\u30AB\u30C6\u30B4\u30EA", - options: { - software: "\u30BD\u30D5\u30C8\u30A6\u30A7\u30A2", - hardware: "\u30CF\u30FC\u30C9\u30A6\u30A7\u30A2", - service: "\u30B5\u30FC\u30D3\u30B9", - subscription: "\u30B5\u30D6\u30B9\u30AF\u30EA\u30D7\u30B7\u30E7\u30F3", - support: "\u30B5\u30DD\u30FC\u30C8" - } - }, - family: { - label: "\u88FD\u54C1\u30D5\u30A1\u30DF\u30EA", - options: { - enterprise: "\u30A8\u30F3\u30BF\u30FC\u30D7\u30E9\u30A4\u30BA\u5411\u3051\u30BD\u30EA\u30E5\u30FC\u30B7\u30E7\u30F3", - smb: "\u4E2D\u5C0F\u4F01\u696D\u5411\u3051\u30BD\u30EA\u30E5\u30FC\u30B7\u30E7\u30F3", - services: "\u30D7\u30ED\u30D5\u30A7\u30C3\u30B7\u30E7\u30CA\u30EB\u30B5\u30FC\u30D3\u30B9", - cloud: "\u30AF\u30E9\u30A6\u30C9\u30B5\u30FC\u30D3\u30B9" - } - }, - list_price: { label: "\u5B9A\u4FA1" }, - cost: { label: "\u30B3\u30B9\u30C8" }, - sku: { label: "SKU" }, - is_active: { label: "\u6709\u52B9" }, - product_manager: { label: "\u30D7\u30ED\u30C0\u30AF\u30C8\u30DE\u30CD\u30FC\u30B8\u30E3\u30FC" }, - image: { label: "\u88FD\u54C1\u753B\u50CF" }, - datasheet: { label: "\u30C7\u30FC\u30BF\u30B7\u30FC\u30C8" } - }, - _views: { - all_products: { label: "\u5168\u88FD\u54C1" }, - product_catalog: { label: "\u88FD\u54C1\u30AB\u30BF\u30ED\u30B0" } - }, - _sections: { - basic: { label: "\u88FD\u54C1\u60C5\u5831" }, - pricing: { label: "\u4FA1\u683C" }, - metadata: { label: "\u95A2\u9023\u8CC7\u6599" }, - // product.view.ts のフォームセクション名 (#1100) - product_info: { label: "\u88FD\u54C1\u60C5\u5831" }, - pricing_info: { label: "\u4FA1\u683C" }, - media: { label: "\u30E1\u30C7\u30A3\u30A2" } - } - } -}; - -// src/sales/translations/ja-JP/objects.service.ts -var service3 = { - crm_case: { - _validations: { - resolution_required_for_closed: { - message: "\u30B1\u30FC\u30B9\u3092\u30AF\u30ED\u30FC\u30BA\u3059\u308B\u306B\u306F\u89E3\u6C7A\u5185\u5BB9\u304C\u5FC5\u8981\u3067\u3059" - }, - escalation_reason_required: { - message: "\u30B1\u30FC\u30B9\u3092\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u3059\u308B\u306B\u306F\u7406\u7531\u304C\u5FC5\u8981\u3067\u3059" - }, - case_status_progression: { - message: "\u7121\u52B9\u306A\u30B9\u30C6\u30FC\u30BF\u30B9\u9077\u79FB\u3067\u3059" - } - }, - label: "\u30B1\u30FC\u30B9", - pluralLabel: "\u30B1\u30FC\u30B9", - description: "\u30AB\u30B9\u30BF\u30DE\u30FC\u30B5\u30DD\u30FC\u30C8\u306E\u30B1\u30FC\u30B9\u3068\u30B5\u30FC\u30D3\u30B9\u4F9D\u983C", - fields: { - case_number: { label: "\u30B1\u30FC\u30B9\u756A\u53F7" }, - subject: { label: "\u4EF6\u540D" }, - display_title: { label: "\u8868\u793A\u540D" }, - description: { label: "\u8AAC\u660E" }, - crm_account: { label: "\u53D6\u5F15\u5148" }, - crm_contact: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, - status: { - label: "\u30B9\u30C6\u30FC\u30BF\u30B9", - options: { - new: "\u65B0\u898F", - in_progress: "\u5BFE\u5FDC\u4E2D", - waiting_customer: "\u9867\u5BA2\u306E\u56DE\u7B54\u5F85\u3061", - waiting_support: "\u30B5\u30DD\u30FC\u30C8\u306E\u56DE\u7B54\u5F85\u3061", - escalated: "\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u6E08", - resolved: "\u89E3\u6C7A\u6E08", - closed: "\u30AF\u30ED\u30FC\u30BA\u6E08" - } - }, - priority: { - label: "\u512A\u5148\u5EA6", - options: { low: "\u4F4E", medium: "\u4E2D", high: "\u9AD8", critical: "\u91CD\u5927" } - }, - priority_rank: { label: "\u512A\u5148\u5EA6\u30E9\u30F3\u30AF" }, - type: { - label: "\u30B1\u30FC\u30B9\u7A2E\u5225", - options: { - question: "\u554F\u3044\u5408\u308F\u305B", - problem: "\u4E0D\u5177\u5408", - feature_request: "\u6A5F\u80FD\u8981\u671B", - bug: "\u30D0\u30B0" - } - }, - origin: { - label: "\u30B1\u30FC\u30B9\u767A\u751F\u5143", - options: { email: "\u30E1\u30FC\u30EB", phone: "\u96FB\u8A71", web: "\u30A6\u30A7\u30D6", chat: "\u30C1\u30E3\u30C3\u30C8", social_media: "\u30BD\u30FC\u30B7\u30E3\u30EB\u30E1\u30C7\u30A3\u30A2" } - }, - owner_id: { label: "\u30B1\u30FC\u30B9\u62C5\u5F53\u8005" }, - closed_date: { label: "\u30AF\u30ED\u30FC\u30BA\u65E5" }, - first_response_date: { label: "\u521D\u56DE\u5FDC\u7B54\u65E5" }, - resolution_time_hours: { label: "\u89E3\u6C7A\u6642\u9593\uFF08\u6642\u9593\uFF09" }, - sla_due_date: { label: "SLA\u671F\u9650", help: "\u30B1\u30FC\u30B9\u306E\u512A\u5148\u5EA6\u3068\u53D6\u5F15\u5148\u306E\u9867\u5BA2\u30E9\u30F3\u30AF\u304B\u3089\u8A2D\u5B9A\u3055\u308C\u3001\u66A6\u6642\u9593\u3067\u6570\u3048\u307E\u3059\u3002\u591C\u9593\u30FB\u9031\u672B\u30FB\u795D\u65E5\u3082\u3059\u3079\u3066\u542B\u307E\u308C\u307E\u3059\u3002" }, - is_sla_violated: { label: "SLA\u9055\u53CD" }, - is_escalated: { label: "\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u6E08" }, - escalated_date: { label: "\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u65E5" }, - escalation_reason: { label: "\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u7406\u7531" }, - resolution: { label: "\u89E3\u6C7A\u5185\u5BB9" }, - resolved_by_article: { label: "\u89E3\u6C7A\u3057\u305F\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B", help: "\u3053\u306E\u30B1\u30FC\u30B9\u3092\u89E3\u6C7A\u3057\u305F\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B \u2014 \u9038\u3089\u3057\u7387\u306E\u6307\u6A19\u3002" }, - internal_notes: { label: "\u5185\u90E8\u30E1\u30E2", help: "\u9867\u5BA2\u306B\u306F\u8868\u793A\u3055\u308C\u306A\u3044\u793E\u5185\u5411\u3051\u30E1\u30E2" }, - is_closed: { label: "\u30AF\u30ED\u30FC\u30BA\u6E08" } - }, - _views: { - all_cases: { label: "\u5168\u30B1\u30FC\u30B9" }, - case_workflow: { label: "\u30B5\u30FC\u30D3\u30B9\u30D5\u30ED\u30FC" }, - sla_calendar: { label: "SLA \u30AB\u30EC\u30F3\u30C0\u30FC" }, - case_timeline: { label: "\u30B1\u30FC\u30B9\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3" }, - unassigned_triage: { - label: "\u672A\u5272\u308A\u5F53\u3066 \u2014 \u30C8\u30EA\u30A2\u30FC\u30B8", - emptyState: { - title: "\u30C8\u30EA\u30A2\u30FC\u30B8\u5F85\u3061\u306F\u3042\u308A\u307E\u305B\u3093", - message: "\u3059\u3079\u3066\u306E\u30B1\u30FC\u30B9\u306B\u6240\u6709\u8005\u304C\u3044\u307E\u3059\u3002\u6240\u6709\u8005\u306E\u306A\u3044\u30B1\u30FC\u30B9\u306F\u3053\u3053\u306B\u8868\u793A\u3055\u308C\u307E\u3059 \u2014 \u901A\u5E38\u306F\u3001\u30B5\u30FC\u30D3\u30B9\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306E\u8077\u4F4D\u3092\u8AB0\u3082\u4FDD\u6301\u3057\u3066\u3044\u306A\u3044\u9593\u306B\u5C4A\u3044\u305F Web-to-Case \u306E\u9001\u4FE1\u3067\u3059\u3002" - } - }, - escalated_cases: { label: "\u30A8\u30B9\u30AB\u30EC\u30FC\u30C8\u3057\u305F\u30B1\u30FC\u30B9" }, - my_open_cases: { label: "\u79C1\u306E\u30AA\u30FC\u30D7\u30F3\u30B1\u30FC\u30B9" }, - sla_at_risk: { label: "\u23F0 SLA \u30EA\u30B9\u30AF\u3042\u308A" } - }, - _sections: { - // case.view.ts のフォームセクション名 (#1100)。 - case: { label: "\u30B1\u30FC\u30B9" }, - how_can_we_help: { label: "\u3069\u306E\u3088\u3046\u306A\u3054\u7528\u4EF6\u3067\u3057\u3087\u3046\u304B\uFF1F" }, - // オブジェクト定義のセクションキー(case.object.ts)— 入力フォームと、 - // これらのグループを参照する詳細ページのセクション(#970)で使用 - basic: { label: "\u30B1\u30FC\u30B9\u60C5\u5831" }, - origin: { label: "\u767A\u751F\u5143\u30FB\u632F\u308A\u5206\u3051" }, - sla: { label: "SLA\u30FB\u512A\u5148\u5EA6" }, - resolution: { label: "\u89E3\u6C7A" }, - escalation: { label: "\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3" }, - system: { label: "\u30B7\u30B9\u30C6\u30E0" } - }, - _actions: { - ...activityActions3, - escalate_case: { - label: "\u30B1\u30FC\u30B9\u3092\u30A8\u30B9\u30AB\u30EC\u30FC\u30C8", - confirmText: "\u3053\u306E\u30B1\u30FC\u30B9\u3092\u30A8\u30B9\u30AB\u30EC\u30FC\u30B7\u30E7\u30F3\u30C1\u30FC\u30E0\u3078\u5F15\u304D\u7D99\u304E\u307E\u3059\u3002\u7D9A\u884C\u3057\u307E\u3059\u304B\uFF1F", - successMessage: "\u30B1\u30FC\u30B9\u3092\u30A8\u30B9\u30AB\u30EC\u30FC\u30C8\u3057\u307E\u3057\u305F\uFF01" - }, - close_case: { - label: "\u30B1\u30FC\u30B9\u3092\u30AF\u30ED\u30FC\u30BA", - confirmText: "\u3053\u306E\u30B1\u30FC\u30B9\u3092\u30AF\u30ED\u30FC\u30BA\u3057\u3066\u3082\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F", - successMessage: "\u30B1\u30FC\u30B9\u3092\u30AF\u30ED\u30FC\u30BA\u3057\u307E\u3057\u305F\uFF01" - }, - claim_case: { - label: "\u30B1\u30FC\u30B9\u3092\u5F15\u304D\u53D7\u3051\u308B", - successMessage: "\u30B1\u30FC\u30B9\u3092\u5F15\u304D\u53D7\u3051\u307E\u3057\u305F\u3002\u62C5\u5F53\u8005\u306F\u3042\u306A\u305F\u3067\u3059\u3002" - } - } - }, - crm_knowledge_article: { - _validations: { - published_requires_body: { - message: "\u672C\u6587\u306E\u306A\u3044\u8A18\u4E8B\u306F\u516C\u958B\u3067\u304D\u307E\u305B\u3093\u3002" - }, - published_requires_summary: { - message: "\u516C\u958B\u6E08\u307F\u306E\u8A18\u4E8B\u306B\u306F\u3001\u691C\u7D22\u7D50\u679C\u3068 AI \u306E\u5F15\u7528\u306E\u305F\u3081\u306B\u6982\u8981\u3092\u8A18\u8F09\u3057\u3066\u304F\u3060\u3055\u3044\u3002" - } - }, - label: "\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B", - pluralLabel: "\u30CA\u30EC\u30C3\u30B8\u30D9\u30FC\u30B9", - description: "\u9867\u5BA2\u3068\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u304C\u518D\u5229\u7528\u3067\u304D\u308B\u56DE\u7B54\u3068\u30CF\u30A6\u30C4\u30FC\u30AC\u30A4\u30C9", - fields: { - article_number: { label: "\u8A18\u4E8B\u756A\u53F7" }, - title: { label: "\u30BF\u30A4\u30C8\u30EB" }, - display_title: { label: "\u8868\u793A\u540D" }, - summary: { label: "\u8981\u7D04", help: "\u691C\u7D22\u7D50\u679C\u3084 AI \u306E\u5F15\u7528\u306B\u8868\u793A\u3055\u308C\u308B 1 \u6BB5\u843D\u306E\u8981\u7D04\u3002" }, - body: { label: "\u672C\u6587", help: "\u8A18\u4E8B\u306E\u672C\u6587\uFF08Markdown\uFF09\u3002" }, - category: { - label: "\u30AB\u30C6\u30B4\u30EA", - options: { - getting_started: "\u306F\u3058\u3081\u306B", - how_to: "\u30CF\u30A6\u30C4\u30FC", - troubleshooting: "\u30C8\u30E9\u30D6\u30EB\u30B7\u30E5\u30FC\u30C6\u30A3\u30F3\u30B0", - billing: "\u8ACB\u6C42\u3068\u6599\u91D1", - api: "API \u3068\u9023\u643A", - release_notes: "\u30EA\u30EA\u30FC\u30B9\u30CE\u30FC\u30C8", - policy: "\u30DD\u30EA\u30B7\u30FC" - } - }, - tags: { - label: "\u30BF\u30B0", - options: { - auth: "\u8A8D\u8A3C", - sso: "SSO", - mobile: "\u30E2\u30D0\u30A4\u30EB", - email: "\u30E1\u30FC\u30EB", - reports: "\u30EC\u30DD\u30FC\u30C8", - performance: "\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9", - data_import: "\u30C7\u30FC\u30BF\u30A4\u30F3\u30DD\u30FC\u30C8", - webhooks: "Webhook" - } - }, - status: { - label: "\u30B9\u30C6\u30FC\u30BF\u30B9", - options: { draft: "\u4E0B\u66F8\u304D", in_review: "\u30EC\u30D3\u30E5\u30FC\u4E2D", published: "\u516C\u958B\u6E08\u307F", archived: "\u30A2\u30FC\u30AB\u30A4\u30D6" } - }, - audience: { - label: "\u5BFE\u8C61", - help: "\u516C\u958B\u8A18\u4E8B\u306F\u30AB\u30B9\u30BF\u30DE\u30FC\u30DD\u30FC\u30BF\u30EB\u306B\u8868\u793A\u3055\u308C\u3001\u793E\u5185\u8A18\u4E8B\u306F\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306E\u307F\u304C\u95B2\u89A7\u3067\u304D\u307E\u3059\u3002", - options: { public: "\u516C\u958B", internal: "\u793E\u5185" } - }, - language: { - label: "\u8A00\u8A9E", - options: { en: "\u82F1\u8A9E", zh_cn: "\u7C21\u4F53\u5B57\u4E2D\u56FD\u8A9E", es_es: "\u30B9\u30DA\u30A4\u30F3\u8A9E", ja_jp: "\u65E5\u672C\u8A9E" } - }, - owner_id: { label: "\u6240\u6709\u8005" }, - related_to_case: { label: "\u5143\u306E\u30B1\u30FC\u30B9", help: "\u3053\u306E\u8A18\u4E8B\u306E\u5143\u306B\u306A\u3063\u305F\u30B1\u30FC\u30B9\uFF08\u4EFB\u610F\uFF09\u3002" }, - published_at: { label: "\u516C\u958B\u65E5\u6642" }, - last_reviewed_at: { label: "\u6700\u7D42\u30EC\u30D3\u30E5\u30FC" }, - helpful_count: { label: "\u5F79\u306B\u7ACB\u3063\u305F", help: "crm_article_feedback \u304B\u3089\u518D\u96C6\u8A08\u3055\u308C\u307E\u3059\u3002\u624B\u5165\u529B\u306F\u3067\u304D\u307E\u305B\u3093\u3002" }, - not_helpful_count: { label: "\u5F79\u306B\u7ACB\u305F\u306A\u304B\u3063\u305F", help: "crm_article_feedback \u304B\u3089\u518D\u96C6\u8A08\u3055\u308C\u307E\u3059\u3002\u624B\u5165\u529B\u306F\u3067\u304D\u307E\u305B\u3093\u3002" } - }, - _views: { - all_articles: { label: "\u3059\u3079\u3066\u306E\u8A18\u4E8B" }, - published_articles: { label: "\u516C\u958B\u6E08\u307F" }, - my_drafts: { label: "\u81EA\u5206\u306E\u4E0B\u66F8\u304D" } - }, - _sections: { - basic: { label: "\u8A18\u4E8B\u60C5\u5831" }, - content: { label: "\u30B3\u30F3\u30C6\u30F3\u30C4" }, - taxonomy: { label: "\u5206\u985E" }, - metrics: { label: "\u5229\u7528\u72B6\u6CC1" }, - engagement: { label: "\u5229\u7528\u72B6\u6CC1" }, - // knowledge_article.view.ts のフォームセクション名 (#1100) - article: { label: "\u8A18\u4E8B" } - }, - _actions: { - mark_article_helpful: { - label: "\u5F79\u306B\u7ACB\u3063\u305F", - successMessage: "\u300C\u5F79\u306B\u7ACB\u3063\u305F\u300D\u3068\u3057\u3066\u8A18\u9332\u3057\u307E\u3057\u305F\u3002\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002" - }, - mark_article_not_helpful: { - label: "\u5F79\u306B\u7ACB\u305F\u306A\u304B\u3063\u305F", - successMessage: "\u300C\u5F79\u306B\u7ACB\u305F\u306A\u304B\u3063\u305F\u300D\u3068\u3057\u3066\u8A18\u9332\u3057\u307E\u3057\u305F\u3002\u3042\u308A\u304C\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002" - } - } - }, - crm_article_feedback: { - label: "\u8A18\u4E8B\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF", - pluralLabel: "\u8A18\u4E8B\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF", - description: "\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B\u306B\u5BFE\u3059\u308B\u8AAD\u8005\u306E\u300C\u5F79\u306B\u7ACB\u3063\u305F / \u5F79\u306B\u7ACB\u305F\u306A\u304B\u3063\u305F\u300D\u8A55\u4FA1", - fields: { - feedback_number: { label: "\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u756A\u53F7" }, - owner_id: { label: "\u8AAD\u8005" }, - crm_knowledge_article: { label: "\u8A18\u4E8B", help: "\u3053\u306E\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF\u306E\u5BFE\u8C61\u3068\u306A\u308B\u30CA\u30EC\u30C3\u30B8\u8A18\u4E8B\u3002" }, - verdict: { - label: "\u8A55\u4FA1", - options: { helpful: "\u5F79\u306B\u7ACB\u3063\u305F", not_helpful: "\u5F79\u306B\u7ACB\u305F\u306A\u304B\u3063\u305F" } - }, - comment: { label: "\u30B3\u30E1\u30F3\u30C8", help: "\u8A55\u4FA1\u306E\u7406\u7531\uFF08\u4EFB\u610F\uFF09 \u2014 \u8A18\u4E8B\u306E\u4F5C\u6210\u8005\u304C\u8AAD\u307F\u307E\u3059\u3002" } - }, - _sections: { - basic: { label: "\u30D5\u30A3\u30FC\u30C9\u30D0\u30C3\u30AF" } - } - } -}; - -// src/sales/translations/ja-JP/objects.activity.ts -var relatedToTypeOptions = { - crm_account: "\u53D6\u5F15\u5148", - crm_contact: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", - crm_opportunity: "\u5546\u8AC7", - crm_lead: "\u30EA\u30FC\u30C9", - crm_case: "\u30B1\u30FC\u30B9" -}; -var activity3 = { - crm_task: { - _validations: { - completed_date_required: { - message: "\u30B9\u30C6\u30FC\u30BF\u30B9\u304C\u300C\u5B8C\u4E86\u300D\u306E\u5834\u5408\u306F\u5B8C\u4E86\u65E5\u304C\u5FC5\u8981\u3067\u3059" - }, - recurrence_fields_required: { - message: "\u7E70\u308A\u8FD4\u3057\u30BF\u30B9\u30AF\u306B\u306F\u7E70\u308A\u8FD4\u3057\u7A2E\u5225\u304C\u5FC5\u8981\u3067\u3059" - }, - related_to_required: { - message: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9\u3092\u5C11\u306A\u304F\u3068\u3082 1 \u4EF6\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044" - } - }, - label: "\u30BF\u30B9\u30AF", - pluralLabel: "\u30BF\u30B9\u30AF", - description: "\u6D3B\u52D5\u3068 ToDo", - fields: { - subject: { label: "\u4EF6\u540D" }, - description: { label: "\u8AAC\u660E" }, - status: { - label: "\u30B9\u30C6\u30FC\u30BF\u30B9", - options: { - not_started: "\u672A\u7740\u624B", - in_progress: "\u9032\u884C\u4E2D", - waiting: "\u5F85\u6A5F\u4E2D", - completed: "\u5B8C\u4E86", - deferred: "\u4FDD\u7559" - } - }, - priority: { - label: "\u512A\u5148\u5EA6", - options: { low: "\u4F4E", normal: "\u901A\u5E38", high: "\u9AD8", urgent: "\u7DCA\u6025" } - }, - priority_rank: { label: "\u512A\u5148\u5EA6\u30E9\u30F3\u30AF" }, - type: { - label: "\u30BF\u30B9\u30AF\u7A2E\u5225", - options: { - call: "\u96FB\u8A71", - email: "\u30E1\u30FC\u30EB", - meeting: "\u4F1A\u8B70", - follow_up: "\u30D5\u30A9\u30ED\u30FC\u30A2\u30C3\u30D7", - demo: "\u30C7\u30E2", - other: "\u305D\u306E\u4ED6" - } - }, - due_date: { label: "\u671F\u9650" }, - reminder_date: { label: "\u30EA\u30DE\u30A4\u30F3\u30C0\u30FC\u65E5\u6642" }, - reminder_sent: { label: "\u30EA\u30DE\u30A4\u30F3\u30C0\u30FC\u9001\u4FE1\u6E08\u307F" }, - completed_date: { label: "\u5B8C\u4E86\u65E5" }, - owner_id: { label: "\u62C5\u5F53\u8005" }, - related_to_type: { - label: "\u95A2\u9023\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u7A2E\u5225", - options: { ...relatedToTypeOptions } - }, - related_to_account: { label: "\u95A2\u9023\u53D6\u5F15\u5148" }, - related_to_contact: { label: "\u95A2\u9023\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, - related_to_opportunity: { label: "\u95A2\u9023\u5546\u8AC7" }, - related_to_lead: { label: "\u95A2\u9023\u30EA\u30FC\u30C9" }, - related_to_case: { label: "\u95A2\u9023\u30B1\u30FC\u30B9" }, - is_recurring: { label: "\u7E70\u308A\u8FD4\u3057\u30BF\u30B9\u30AF" }, - recurrence_type: { - label: "\u7E70\u308A\u8FD4\u3057\u7A2E\u5225", - options: { daily: "\u6BCE\u65E5", weekly: "\u6BCE\u9031", monthly: "\u6BCE\u6708", yearly: "\u6BCE\u5E74" } - }, - recurrence_interval: { label: "\u7E70\u308A\u8FD4\u3057\u9593\u9694" }, - recurrence_end_date: { label: "\u7E70\u308A\u8FD4\u3057\u7D42\u4E86\u65E5" }, - is_completed: { label: "\u5B8C\u4E86\u6E08" }, - is_overdue: { label: "\u671F\u9650\u8D85\u904E" }, - progress_percent: { label: "\u9032\u6357\uFF08%\uFF09" } - }, - _views: { - all_tasks: { label: "\u5168\u30BF\u30B9\u30AF" }, - task_board: { label: "\u30BF\u30B9\u30AF\u30DC\u30FC\u30C9" }, - task_calendar: { label: "\u30BF\u30B9\u30AF\u30AB\u30EC\u30F3\u30C0\u30FC" }, - task_gantt: { label: "\u5B9F\u884C\u8A08\u753B" }, - task_timeline: { label: "\u5DE5\u6570\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3" }, - my_open_tasks: { label: "\u79C1\u306E\u30AA\u30FC\u30D7\u30F3\u30BF\u30B9\u30AF" }, - todays_tasks: { label: "\u{1F4C5} \u79C1\u306E\u512A\u5148\u30BF\u30B9\u30AF" }, - overdue_tasks: { label: "\u23F0 \u30AA\u30FC\u30D7\u30F3\u30BF\u30B9\u30AF \xB7 \u671F\u9650\u8D85\u904E\u304C\u9577\u3044\u9806" } - }, - _sections: { - basic: { label: "\u30BF\u30B9\u30AF\u60C5\u5831" }, - scheduling: { label: "\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB" }, - related: { label: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9" }, - recurrence: { label: "\u7E70\u308A\u8FD4\u3057" }, - effort: { label: "\u9032\u6357\u30FB\u5DE5\u6570" }, - system: { label: "\u30B7\u30B9\u30C6\u30E0" }, - // task.view.ts のフォームセクション名 (#1100) - task: { label: "\u30BF\u30B9\u30AF" }, - related_records: { label: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9" }, - recurrence_and_effort: { label: "\u7E70\u308A\u8FD4\u3057\u3068\u5DE5\u6570" } - } - }, - crm_event: { - _validations: { - end_after_start: { - message: "\u7D42\u4E86\u6642\u523B\u306F\u958B\u59CB\u6642\u523B\u3088\u308A\u5F8C\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" - }, - related_to_required: { - message: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9\u3092\u5C11\u306A\u304F\u3068\u3082 1 \u4EF6\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044" - } - }, - label: "\u30A4\u30D9\u30F3\u30C8", - pluralLabel: "\u30A4\u30D9\u30F3\u30C8", - description: "\u9867\u5BA2\u3068\u306E\u4F1A\u8B70\u30FB\u96FB\u8A71\u306A\u3069\u306E\u4E88\u5B9A\u3055\u308C\u305F\u5BFE\u8A71", - fields: { - subject: { label: "\u4EF6\u540D" }, - description: { label: "\u8AAC\u660E" }, - type: { - label: "\u30A4\u30D9\u30F3\u30C8\u7A2E\u5225", - options: { - meeting: "\u4F1A\u8B70", - call: "\u96FB\u8A71", - demo: "\u30C7\u30E2", - webinar: "\u30A6\u30A7\u30D3\u30CA\u30FC", - onsite_visit: "\u8A2A\u554F", - other: "\u305D\u306E\u4ED6" - } - }, - status: { - label: "\u30B9\u30C6\u30FC\u30BF\u30B9", - options: { - planned: "\u4E88\u5B9A", - held: "\u5B9F\u65BD\u6E08\u307F", - cancelled: "\u30AD\u30E3\u30F3\u30BB\u30EB", - no_show: "\u7121\u65AD\u6B20\u5E2D" - } - }, - owner_id: { label: "\u62C5\u5F53\u8005" }, - start_datetime: { label: "\u958B\u59CB" }, - end_datetime: { label: "\u7D42\u4E86" }, - all_day: { label: "\u7D42\u65E5\u30A4\u30D9\u30F3\u30C8" }, - duration_minutes: { label: "\u6240\u8981\u6642\u9593\uFF08\u5206\uFF09" }, - location: { label: "\u5834\u6240", help: "\u4F1A\u8B70\u5BA4\u30FB\u4F4F\u6240\u30FB\u4F1A\u8B70\u30EA\u30F3\u30AF" }, - related_to_type: { - label: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9\u7A2E\u5225", - options: { ...relatedToTypeOptions } - }, - related_to_account: { label: "\u95A2\u9023\u53D6\u5F15\u5148" }, - related_to_contact: { label: "\u95A2\u9023\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005" }, - related_to_opportunity: { label: "\u95A2\u9023\u5546\u8AC7" }, - related_to_lead: { label: "\u95A2\u9023\u30EA\u30FC\u30C9" }, - related_to_case: { label: "\u95A2\u9023\u30B1\u30FC\u30B9" }, - outcome_notes: { label: "\u7D50\u679C\u30E1\u30E2", help: "\u5408\u610F\u4E8B\u9805\u3068\u6B21\u306E\u30A2\u30AF\u30B7\u30E7\u30F3" } - }, - _views: { - all_events: { label: "\u3059\u3079\u3066\u306E\u30A4\u30D9\u30F3\u30C8" }, - event_calendar: { label: "\u30A4\u30D9\u30F3\u30C8\u30AB\u30EC\u30F3\u30C0\u30FC" }, - event_timeline: { label: "\u30C1\u30FC\u30E0\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB" }, - my_events: { label: "\u30DE\u30A4\u30AB\u30EC\u30F3\u30C0\u30FC" }, - upcoming_events: { label: "\u{1F4C5} \u958B\u50AC\u4E88\u5B9A \xB7 \u76F4\u8FD1\u9806" }, - held_events: { label: "\u2705 \u5BFE\u8A71\u5C65\u6B74" } - }, - _sections: { - basic: { label: "\u30A4\u30D9\u30F3\u30C8\u60C5\u5831" }, - schedule: { label: "\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB" }, - related: { label: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9" }, - outcome: { label: "\u5B9F\u65BD\u7D50\u679C" }, - // event.view.ts のフォームセクション名 (#1100) - event: { label: "\u30A4\u30D9\u30F3\u30C8" }, - related_records: { label: "\u95A2\u9023\u30EC\u30B3\u30FC\u30C9" } - } - }, - crm_event_attendee: { - _validations: { - attendee_resolves: { - message: "\u53C2\u52A0\u8005\u306F\u53C2\u52A0\u8005\u7A2E\u5225\u304C\u793A\u3059\u76F8\u624B\u3092\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u5834\u5408\u306F\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3092\u3001\u793E\u5916\u306E\u5834\u5408\u306F\u793E\u5916\u53C2\u52A0\u8005\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044" - }, - attendee_type_exclusive: { - message: "\u53C2\u52A0\u8005\u304C\u6307\u5B9A\u3067\u304D\u308B\u76F8\u624B\u306F 1 \u3064\u3060\u3051\u3067\u3059\u3002\u53C2\u52A0\u8005\u7A2E\u5225\u304C\u793A\u3055\u306A\u3044\u9805\u76EE\u306F\u3059\u3079\u3066\u7A7A\u306B\u3057\u3066\u304F\u3060\u3055\u3044" - } - }, - label: "\u30A4\u30D9\u30F3\u30C8\u53C2\u52A0\u8005", - pluralLabel: "\u30A4\u30D9\u30F3\u30C8\u53C2\u52A0\u8005", - description: "\u30A4\u30D9\u30F3\u30C8\u306B\u62DB\u5F85\u3055\u308C\u305F\u3001\u307E\u305F\u306F\u51FA\u5E2D\u3057\u305F\u4EBA", - fields: { - attendee_number: { label: "\u53C2\u52A0\u8005\u756A\u53F7" }, - crm_event: { label: "\u30A4\u30D9\u30F3\u30C8" }, - attendee_type: { - label: "\u53C2\u52A0\u8005\u7A2E\u5225", - options: { contact: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", lead: "\u30EA\u30FC\u30C9", user: "\u793E\u5185\u30E6\u30FC\u30B6\u30FC", external: "\u793E\u5916\u30B2\u30B9\u30C8" } - }, - crm_contact: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", help: "\u53C2\u52A0\u8005\u304C\u65E2\u5B58\u306E\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3067\u3042\u308B\u5834\u5408\u306B\u8A2D\u5B9A\u3057\u307E\u3059" }, - crm_lead: { label: "\u30EA\u30FC\u30C9", help: "\u53C2\u52A0\u8005\u304C\u307E\u3060\u5909\u63DB\u3055\u308C\u3066\u3044\u306A\u3044\u30EA\u30FC\u30C9\u3067\u3042\u308B\u5834\u5408\u306B\u8A2D\u5B9A\u3057\u307E\u3059" }, - sys_user: { label: "\u793E\u5185\u30E6\u30FC\u30B6\u30FC", help: "\u53C2\u52A0\u8005\u304C\u793E\u5185\u306E\u540C\u50DA\u3067\u3042\u308B\u5834\u5408\u306B\u8A2D\u5B9A\u3057\u307E\u3059" }, - external_name: { label: "\u793E\u5916\u53C2\u52A0\u8005", help: "CRM \u306E\u3069\u306E\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u306B\u3082\u5B58\u5728\u3057\u306A\u3044\u53C2\u52A0\u8005\u306E\u6C0F\u540D \u2014 \u53C2\u52A0\u8005\u7A2E\u5225\u304C\u300C\u793E\u5916\u30B2\u30B9\u30C8\u300D\u306E\u3068\u304D\u306B\u8A2D\u5B9A\u3057\u307E\u3059" }, - response: { - label: "\u56DE\u7B54", - options: { - no_response: "\u672A\u56DE\u7B54", - accepted: "\u627F\u8AFE", - declined: "\u8F9E\u9000", - tentative: "\u4EEE\u627F\u8AFE" - } - }, - is_organizer: { label: "\u4E3B\u50AC\u8005" }, - invited_date: { label: "\u62DB\u5F85\u65E5\u6642" } - }, - _views: { - all_event_attendees: { label: "\u30A4\u30D9\u30F3\u30C8\u53C2\u52A0\u8005" } - }, - _sections: { - basic: { label: "\u53C2\u52A0\u8005" }, - response: { label: "\u62DB\u5F85" }, - // event_attendee.view.ts のフォームセクション名 (#1100) - attendee: { label: "\u53C2\u52A0\u8005" }, - invitation: { label: "\u62DB\u5F85" } - } - } -}; - -// src/sales/translations/ja-JP/objects.marketing.ts -var marketing3 = { - crm_campaign: { - _validations: { - end_after_start: { - message: "\u7D42\u4E86\u65E5\u306F\u958B\u59CB\u65E5\u3088\u308A\u5F8C\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" - }, - actual_cost_within_budget: { - message: "\u5B9F\u7E3E\u30B3\u30B9\u30C8\u304C\u4E88\u7B97\u30B3\u30B9\u30C8\u3092\u8D85\u3048\u3066\u3044\u307E\u3059" - } - }, - label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3", - pluralLabel: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3", - description: "\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u3068\u65BD\u7B56", - fields: { - campaign_code: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30B3\u30FC\u30C9" }, - name: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u540D" }, - display_title: { label: "\u8868\u793A\u540D" }, - description: { label: "\u8AAC\u660E" }, - type: { - label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u7A2E\u5225", - options: { - email: "\u30E1\u30FC\u30EB", - webinar: "\u30A6\u30A7\u30D3\u30CA\u30FC", - trade_show: "\u5C55\u793A\u4F1A", - conference: "\u30AB\u30F3\u30D5\u30A1\u30EC\u30F3\u30B9", - direct_mail: "\u30C0\u30A4\u30EC\u30AF\u30C8\u30E1\u30FC\u30EB", - social_media: "\u30BD\u30FC\u30B7\u30E3\u30EB\u30E1\u30C7\u30A3\u30A2", - content: "\u30B3\u30F3\u30C6\u30F3\u30C4\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0", - partner: "\u30D1\u30FC\u30C8\u30CA\u30FC\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0" - } - }, - channel: { - label: "\u4E3B\u8981\u30C1\u30E3\u30CD\u30EB", - options: { - digital: "\u30C7\u30B8\u30BF\u30EB", - social: "\u30BD\u30FC\u30B7\u30E3\u30EB", - email: "\u30E1\u30FC\u30EB", - events: "\u30A4\u30D9\u30F3\u30C8", - partner: "\u30D1\u30FC\u30C8\u30CA\u30FC" - } - }, - status: { - label: "\u30B9\u30C6\u30FC\u30BF\u30B9", - options: { - planning: "\u8A08\u753B\u4E2D", - in_progress: "\u5B9F\u65BD\u4E2D", - completed: "\u5B8C\u4E86", - aborted: "\u4E2D\u6B62" - } - }, - start_date: { label: "\u958B\u59CB\u65E5" }, - end_date: { label: "\u7D42\u4E86\u65E5" }, - budgeted_cost: { label: "\u4E88\u7B97\u30B3\u30B9\u30C8" }, - actual_cost: { label: "\u5B9F\u30B3\u30B9\u30C8" }, - expected_revenue: { label: "\u4E88\u6E2C\u58F2\u4E0A" }, - actual_revenue: { label: "\u5B9F\u53CE\u76CA" }, - target_size: { label: "\u30BF\u30FC\u30B2\u30C3\u30C8\u898F\u6A21", help: "\u5BFE\u8C61\u3068\u3059\u308B\u30EA\u30FC\u30C9\u30FB\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u76EE\u6A19\u4EF6\u6570" }, - num_sent: { label: "\u9001\u4FE1\u6570" }, - num_responses: { label: "\u5FDC\u7B54\u6570" }, - num_leads: { label: "\u30EA\u30FC\u30C9\u6570" }, - num_converted_leads: { label: "\u5909\u63DB\u6E08\u30EA\u30FC\u30C9\u6570" }, - num_opportunities: { label: "\u4F5C\u6210\u6E08\u5546\u8AC7\u6570" }, - num_won_opportunities: { label: "\u53D7\u6CE8\u5546\u8AC7" }, - response_rate: { label: "\u5FDC\u7B54\u7387\uFF08%\uFF09" }, - roi: { label: "ROI\uFF08%\uFF09" }, - owner_id: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u62C5\u5F53\u8005" }, - landing_page_url: { label: "\u30E9\u30F3\u30C7\u30A3\u30F3\u30B0\u30DA\u30FC\u30B8" }, - is_active: { label: "\u6709\u52B9" } - }, - _views: { - all_campaigns: { label: "\u5168\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" }, - campaign_gantt: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u65E5\u7A0B" }, - campaign_calendar: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30AB\u30EC\u30F3\u30C0\u30FC" }, - campaign_timeline: { label: "\u30DE\u30FC\u30B1\u30C6\u30A3\u30F3\u30B0\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3" } - }, - _sections: { - basic: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u60C5\u5831" }, - schedule: { label: "\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB" }, - budget: { label: "\u4E88\u7B97\u30FBROI" }, - metrics: { label: "\u5B9F\u7E3E" }, - assignment: { label: "\u62C5\u5F53\u8005" }, - assets: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30A2\u30BB\u30C3\u30C8" } - }, - _actions: { - enroll_leads: { - label: "\u30E1\u30F3\u30D0\u30FC\u3092\u4E00\u62EC\u767B\u9332", - successMessage: "\u5BFE\u8C61\u30E1\u30F3\u30D0\u30FC\u3092\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306B\u767B\u9332\u3057\u307E\u3057\u305F\u3002" - } - } - }, - crm_campaign_member: { - _validations: { - lead_or_contact_required: { - message: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30E1\u30F3\u30D0\u30FC\u306F\u30EA\u30FC\u30C9\u307E\u305F\u306F\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306E\u3044\u305A\u308C\u304B\u3092\u53C2\u7167\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059" - } - }, - label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30E1\u30F3\u30D0\u30FC", - pluralLabel: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30E1\u30F3\u30D0\u30FC", - description: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u306E\u5BFE\u8C61\u3068\u306A\u3063\u305F\u30EA\u30FC\u30C9\u30FB\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3068\u305D\u306E\u53CD\u5FDC\u72B6\u6CC1", - fields: { - member_number: { label: "\u30E1\u30F3\u30D0\u30FC\u756A\u53F7" }, - crm_campaign: { label: "\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3" }, - crm_lead: { label: "\u30EA\u30FC\u30C9", help: "\u767B\u9332\u6642\u70B9\u3067\u30EA\u30FC\u30C9\u3060\u3063\u305F\u30E1\u30F3\u30D0\u30FC\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059" }, - crm_contact: { label: "\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", help: "\u65E2\u5B58\u306E\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3067\u3042\u308B\u30E1\u30F3\u30D0\u30FC\u306B\u8A2D\u5B9A\u3055\u308C\u307E\u3059" }, - status: { - label: "\u30B9\u30C6\u30FC\u30BF\u30B9", - options: { - sent: "\u9001\u4FE1\u6E08", - responded: "\u5FDC\u7B54\u6E08", - converted: "\u5909\u63DB\u6E08", - unsubscribed: "\u914D\u4FE1\u505C\u6B62" - } - }, - added_date: { label: "\u8FFD\u52A0\u65E5\u6642" }, - response_date: { label: "\u5FDC\u7B54\u65E5\u6642" }, - has_responded: { label: "\u5FDC\u7B54\u6E08" } - }, - _sections: { - basic: { label: "\u57FA\u672C\u60C5\u5831" }, - response: { label: "\u53CD\u5FDC\u30C8\u30E9\u30C3\u30AD\u30F3\u30B0" } - }, - _actions: { - mark_responded: { - label: "\u5FDC\u7B54\u6E08\u306B\u3059\u308B", - successMessage: "\u3053\u306E\u30AD\u30E3\u30F3\u30DA\u30FC\u30F3\u30E1\u30F3\u30D0\u30FC\u306E\u5FDC\u7B54\u3092\u8A18\u9332\u3057\u307E\u3057\u305F\u3002" - } - } - } -}; - -// src/sales/translations/ja-JP.ts -var jaJP2 = { - objects: { - crm_account: customer3.crm_account, - crm_contact: customer3.crm_contact, - crm_knowledge_article: service3.crm_knowledge_article, - crm_forecast: pipeline3.crm_forecast, - crm_lead: pipeline3.crm_lead, - crm_opportunity: pipeline3.crm_opportunity, - crm_case: service3.crm_case, - crm_contract: commerce3.crm_contract, - crm_product: commerce3.crm_product, - crm_quote: commerce3.crm_quote, - crm_task: activity3.crm_task, - crm_campaign: marketing3.crm_campaign, - crm_event: activity3.crm_event, - crm_event_attendee: activity3.crm_event_attendee, - crm_article_feedback: service3.crm_article_feedback, - crm_campaign_member: marketing3.crm_campaign_member, - crm_opportunity_line_item: pipeline3.crm_opportunity_line_item, - crm_quote_line_item: commerce3.crm_quote_line_item - }, - ...appSurface3 -}; - -// src/sales/translations/es-ES/app.ts -var appSurface4 = { - apps: { - crm_enterprise: { - label: "HotCRM", - description: "Gesti\xF3n de relaciones con clientes para ventas, servicio y marketing", - // Indexado por el `id` del nodo de navegación (espacio de nombres plano, - // sea cual sea la profundidad del nodo). - navigation: { - group_activity: { label: "Actividad" }, - nav_event: { label: "Eventos" }, - nav_activity_dashboard: { label: "Actividad de Ventas" }, - nav_my_calendar: { label: "Mi Calendario" }, - nav_home: { label: "Inicio" }, - group_sales: { label: "Ventas" }, - nav_lead: { label: "Prospectos" }, - nav_account: { label: "Cuentas" }, - nav_account_workbench: { label: "Mesa de Trabajo de Cuentas" }, - nav_contact: { label: "Contactos" }, - nav_opportunity: { label: "Oportunidades" }, - nav_quote: { label: "Cotizaciones" }, - nav_contract: { label: "Contratos" }, - nav_product: { label: "Productos" }, - nav_sales_dashboard: { label: "Rendimiento de Ventas" }, - group_work: { label: "Mi Trabajo" }, - nav_my_tasks: { label: "Mis Tareas" }, - nav_my_deals: { label: "Mis Negocios" }, - nav_my_leads: { label: "Mis Prospectos" }, - nav_my_cases: { label: "Mis Casos" }, - nav_approval_requests: { label: "Bandeja de Entrada" }, - group_service: { label: "Servicio" }, - nav_case: { label: "Casos" }, - nav_knowledge: { label: "Conocimiento" }, - nav_service_dashboard: { label: "Resumen de Servicio" }, - group_marketing: { label: "Marketing" }, - nav_campaign: { label: "Campa\xF1as" }, - group_insights: { label: "An\xE1lisis" }, - nav_crm_dashboard: { label: "Resumen CRM" }, - nav_forecast: { label: "Previsiones" }, - nav_report_pipeline_coverage: { label: "Cobertura del Pipeline" }, - nav_report_lead_inflow: { label: "Entrada de Prospectos" }, - nav_report_sla: { label: "Cumplimiento de SLA" } - } - } - }, - messages: { - "common.save": "Guardar", - "common.cancel": "Cancelar", - "common.delete": "Eliminar", - "common.edit": "Editar", - "common.create": "Crear", - "common.search": "Buscar", - "common.filter": "Filtrar", - "common.export": "Exportar", - "common.back": "Volver", - "common.confirm": "Confirmar", - "nav.sales": "Ventas", - "nav.service": "Servicio", - "nav.marketing": "Marketing", - "nav.products": "Productos", - "nav.analytics": "Anal\xEDtica", - "success.saved": "Registro guardado exitosamente", - "success.converted": "Prospecto convertido exitosamente", - "confirm.delete": "\xBFEst\xE1 seguro de que desea eliminar este registro?", - "confirm.convert_lead": "\xBFConvertir este prospecto en cuenta, contacto y oportunidad?", - "error.required": "Este campo es obligatorio", - "error.load_failed": "Error al cargar los datos" - }, - dashboards: { - sales_activity_dashboard: { - label: "Actividad de ventas", - description: "Qui\xE9n habla con los clientes, con qu\xE9 frecuencia y qu\xE9 cuentas se han quedado en silencio", - widgets: { - interactions_held: { title: "Interacciones registradas", description: "Llamadas y reuniones que realmente ocurrieron" }, - meetings_booked: { title: "Reuniones agendadas", description: "Reuniones en el calendario que a\xFAn no ocurren" }, - customer_minutes: { title: "Minutos con clientes", description: "Tiempo total frente a clientes" }, - tasks_completed: { title: "Tareas completadas", description: "Seguimientos cerrados \u2014 la otra mitad de la actividad" }, - activity_by_rep: { title: "Actividad por representante", description: "Interacciones registradas por responsable" }, - activity_by_week: { title: "Volumen de actividad por semana", description: "Interacciones por semana" }, - activity_mix: { title: "Composici\xF3n de la actividad", description: "Llamadas vs reuniones vs demostraciones" }, - activity_by_record_type: { title: "D\xF3nde cae la actividad", description: "Qu\xE9 parte del embudo recibe atenci\xF3n" }, - deal_activity: { title: "Interacciones en oportunidades", description: "Interacciones vinculadas a una oportunidad" }, - open_deals_for_activity: { title: "Oportunidades abiertas", description: "Oportunidades a\xFAn en juego" }, - quiet_accounts_30: { title: "Silencio 30+ d\xEDas", description: "Cuentas activas sin interacci\xF3n en un mes" }, - quiet_accounts_60: { title: "Silencio 60+ d\xEDas", description: "Dos meses de silencio \u2014 el umbral de riesgo" }, - quiet_accounts_90: { title: "Silencio 90+ d\xEDas", description: "Un trimestre sin contacto" } - } - }, - crm_overview_dashboard: { - label: "Resumen CRM", - description: "M\xE9tricas de ingresos, anal\xEDtica de pipeline e informaci\xF3n de oportunidades", - widgets: { - total_revenue: { title: "Ingresos totales", description: "Ingresos cerrados ganados en este per\xEDodo" }, - active_deals: { title: "Negocios activos", description: "Oportunidades abiertas en el pipeline" }, - won_deals: { title: "Negocios ganados", description: "Negocios cerrados ganados en este per\xEDodo" }, - avg_deal_size: { title: "Tama\xF1o medio del negocio", description: "Valor medio de los negocios cerrados ganados" }, - revenue_trends: { title: "Tendencia de ingresos", description: "Ingresos cerrados ganados de los \xFAltimos 12 meses" }, - lead_source: { title: "Origen del prospecto", description: "Valor del pipeline por canal de adquisici\xF3n" }, - pipeline_by_stage: { title: "Pipeline por etapa", description: "Valor de oportunidades abiertas en cada etapa de venta" }, - top_products: { title: "Productos principales", description: "Ingresos a precio de lista por categor\xEDa de producto" }, - pipeline_by_owner: { title: "Pipeline por responsable", description: "Valor del pipeline abierto y n\xFAmero de negocios por comercial" } - } - }, - executive_dashboard: { - label: "Vista ejecutiva", - description: "KPI de alto nivel sobre ingresos, clientes y pipeline para la direcci\xF3n", - widgets: { - total_revenue_ytd: { title: "Ingresos totales (YTD)", description: "Ingresos cerrados ganados en lo que va del a\xF1o" }, - total_accounts: { title: "Cuentas activas", description: "Clientes con al menos una relaci\xF3n activa" }, - total_contacts: { title: "Total de contactos", description: "Personas en nuestra agenda" }, - open_leads: { title: "Prospectos abiertos", description: "Prospectos sin convertir en el embudo" }, - revenue_trend: { title: "Tendencia de ingresos", description: "Ingresos cerrados ganados de los \xFAltimos 12 meses" }, - revenue_by_industry: { title: "Ingresos por industria", description: "Ingresos YTD ganados separados por industria del cliente" }, - pipeline_by_stage: { title: "Pipeline por etapa", description: "Valor de oportunidades abiertas en cada etapa de venta" }, - new_accounts_by_month: { title: "Cuentas nuevas", description: "Ritmo de creaci\xF3n de cuentas en los \xFAltimos 6 meses" }, - accounts_by_industry: { title: "Cuentas por sector", description: "Ingreso anual total y n\xFAmero de cuentas por sector" } - } - }, - sales_dashboard: { - label: "Rendimiento de ventas", - description: "Anal\xEDtica de pipeline, tendencias de tasa de \xE9xito y rendimiento de los representantes", - widgets: { - total_pipeline_value: { title: "Pipeline total", description: "Suma del valor de las oportunidades abiertas" }, - closed_won_qtd: { title: "Cerrado ganado (trimestre)", description: "Ingresos cerrados este trimestre" }, - open_opportunities: { title: "Oportunidades abiertas", description: "Negocios activos en curso" }, - avg_deal_size: { title: "Tama\xF1o medio del negocio", description: "Valor medio de los negocios cerrados ganados este trimestre" }, - pipeline_by_stage: { title: "Pipeline por etapa", description: "Valor de oportunidades abiertas en cada etapa de venta" }, - monthly_revenue_trend: { title: "Tendencia mensual de ingresos", description: "Ingresos cerrados ganados de los \xFAltimos 12 meses" }, - pipeline_by_forecast_category: { title: "Pipeline por categor\xEDa de pron\xF3stico", description: "Pipeline abierto agrupado por categor\xEDa de pron\xF3stico de ventas" }, - lead_source_breakdown: { title: "Origen del prospecto", description: "De d\xF3nde proviene nuestro pipeline" }, - open_pipeline_by_owner: { title: "Pipeline abierto por responsable", description: "Valor del pipeline en curso, n\xFAmero de negocios y probabilidad media de cierre por comercial" }, - quota_attainment_by_rep: { title: "Cumplimiento de cuota por representante", description: "Cuota del trimestre actual, ingresos cerrados y cumplimiento por representante, seg\xFAn instant\xE1neas de pron\xF3stico" }, - pipeline_stage_by_source: { title: "Pipeline por Etapa \xD7 Origen", description: "Tabla cruzada del importe de oportunidades abiertas por etapa y origen" }, - win_rate_12m: { title: "Tasa de \xE9xito (12M)", description: "Negocios ganados como porcentaje de todos los negocios resueltos en los \xFAltimos 12 meses" }, - won_deals_12m: { title: "Negocios ganados (12M)", description: "El numerador de la tasa de \xE9xito" }, - lost_deals_12m: { title: "Negocios perdidos (12M)", description: "La otra mitad del denominador de la tasa de \xE9xito" }, - win_rate_by_owner: { title: "Ganados / perdidos por representante", description: "Negocios ganados, negocios perdidos y tasa de \xE9xito por representante \u2014 \xFAltimos 12 meses" }, - win_rate_by_lead_source: { title: "Ganados / perdidos por origen del prospecto", description: "Qu\xE9 or\xEDgenes producen negocios que realmente se cierran \u2014 \xFAltimos 12 meses" }, - loss_reason_breakdown: { title: "Por qu\xE9 perdemos", description: "Negocios perdidos por motivo \u2014 \xFAltimos 12 meses" } - } - }, - service_dashboard: { - label: "Servicio al cliente", - description: "Carga de casos, salud del SLA y rendimiento de resoluci\xF3n", - widgets: { - open_cases: { title: "Casos abiertos", description: "Casos que a\xFAn no se han cerrado" }, - critical_cases: { title: "Casos cr\xEDticos", description: "Casos abiertos marcados como prioridad cr\xEDtica" }, - avg_resolution_time: { title: "Tiempo medio de resoluci\xF3n", description: "Tiempo medio hasta el cierre, en horas" }, - sla_violations: { title: "Incumplimientos de SLA", description: "Casos que incumplieron su SLA" }, - cases_by_status: { title: "Casos por estado", description: "Distribuci\xF3n de la carga a lo largo del pipeline" }, - cases_by_priority: { title: "Casos por prioridad", description: "Mezcla de casos abiertos por urgencia" }, - cases_by_origin: { title: "Casos por origen", description: "De d\xF3nde provienen nuestros casos" }, - daily_case_volume: { title: "Volumen diario de casos", description: "Casos nuevos creados en los \xFAltimos 30 d\xEDas" }, - sla_compliance_gauge: { title: "Cumplimiento de SLA", description: "Porcentaje de casos resueltos dentro del SLA en este per\xEDodo" }, - kb_deflection_rate: { title: "Tasa de Desv\xEDo por KB", description: "Proporci\xF3n de casos cerrados resueltos con un art\xEDculo de la base de conocimiento" }, - kb_resolved_cases: { title: "Resueltos por KB", description: "Casos cerrados que se\xF1alan el art\xEDculo que los resolvi\xF3" }, - closed_cases_total: { title: "Casos Cerrados", description: "El denominador de la tasa de desv\xEDo" }, - top_resolving_articles: { title: "Art\xEDculos que M\xE1s Resuelven", description: "Art\xEDculos de la base de conocimiento ordenados por los casos cerrados que resolvieron" }, - my_open_cases_by_priority: { title: "Mis casos abiertos por prioridad", description: "Tus casos abiertos y su tasa de incumplimiento de SLA, desglosados por prioridad" } - } - } - }, - // `title` / `subtitle` son las propiedades del componente `page:header`. - // Los marcadores `{…}` se sustituyen sobre la cadena TRADUCIDA, así que el - // token debe conservarse tal cual: traducido, no resuelve y se ve vacío. - datasets: { - account_metrics: { - label: "M\xE9tricas de cuentas", - description: "Capa sem\xE1ntica para el recuento de cuentas por sector y tipo", - dimensions: { - industry: { - label: "Sector" - }, - type: { - label: "Tipo" - }, - created_at: { - label: "Creado" - } - }, - measures: { - account_count: { - label: "Cuentas" - }, - annual_revenue_sum: { - label: "Ingresos anuales" - } - } - }, - case_metrics: { - label: "M\xE9tricas de casos", - description: "Capa sem\xE1ntica para el recuento de casos, el tiempo de resoluci\xF3n y el SLA", - dimensions: { - created_at: { - label: "Creado" - }, - origin: { - label: "Origen" - }, - priority: { - label: "Prioridad" - }, - resolved_article: { - label: "Art\xEDculo de resoluci\xF3n" - }, - status: { - label: "Estado" - }, - type: { - label: "Tipo" - } - }, - measures: { - avg_resolution: { - label: "Resoluci\xF3n media (h)" - }, - avg_sla_violated: { - label: "Tasa de incumplimiento del SLA" - }, - case_count: { - label: "Casos" - }, - closed_count: { - label: "Casos cerrados" - }, - kb_deflection_rate: { - label: "Tasa de desv\xEDo por base de conocimiento" - }, - kb_resolved_count: { - label: "Resueltos por base de conocimiento" - }, - sla_compliance_rate: { - label: "Tasa de cumplimiento del SLA" - }, - sla_met_count: { - label: "Casos dentro del SLA" - } - } - }, - contact_metrics: { - label: "M\xE9tricas de contactos", - description: "Capa sem\xE1ntica para el recuento de contactos", - measures: { - contact_count: { - label: "Contactos" - } - } - }, - event_metrics: { - label: "M\xE9tricas de actividad", - description: "Capa sem\xE1ntica para reuniones, llamadas y recencia de interacci\xF3n", - dimensions: { - owner: { - label: "Propietario" - }, - related_to_type: { - label: "Relacionado con" - }, - start_datetime: { - label: "Semana de actividad" - }, - status: { - label: "Estado" - }, - type: { - label: "Tipo de actividad" - } - }, - measures: { - avg_minutes: { - label: "Duraci\xF3n media" - }, - event_count: { - label: "Actividades" - }, - total_minutes: { - label: "Minutos" - } - } - }, - forecast_metrics: { - label: "M\xE9tricas de previsi\xF3n", - description: "Capa sem\xE1ntica para cuota, cumplimiento y cobertura de pipeline por propietario", - dimensions: { - owner: { - label: "Propietario" - }, - period: { - label: "Tipo de periodo" - }, - period_label: { - label: "Periodo" - }, - period_start: { - label: "Inicio del periodo" - } - }, - measures: { - attainment: { - label: "Cumplimiento" - }, - closed_sum: { - label: "Cerrado" - }, - commit_sum: { - label: "Comprometido" - }, - pipeline_sum: { - label: "Pipeline" - }, - quota_sum: { - label: "Cuota" - } - } - }, - lead_metrics: { - label: "M\xE9tricas de prospectos", - description: "Capa sem\xE1ntica para el recuento de prospectos", - dimensions: { - created_at: { - label: "Creado" - }, - last_contacted_date: { - label: "\xDAltimo contacto" - }, - lead_source: { - label: "Origen" - }, - status: { - label: "Estado" - } - }, - measures: { - lead_count: { - label: "Prospectos" - } - } - }, - opportunity_metrics: { - label: "M\xE9tricas de oportunidades", - description: "Capa sem\xE1ntica para el recuento y los importes del pipeline de ventas", - dimensions: { - account_industry: { - label: "Sector de la cuenta" - }, - close_date: { - label: "Fecha de cierre" - }, - close_quarter: { - label: "Trimestre de cierre" - }, - forecast_category: { - label: "Categor\xEDa de previsi\xF3n" - }, - lead_source: { - label: "Origen del prospecto" - }, - loss_reason: { - label: "Motivo de p\xE9rdida" - }, - owner: { - label: "Propietario" - }, - stage: { - label: "Etapa" - }, - type: { - label: "Tipo de negocio" - }, - win_reason: { - label: "Motivo de ganancia" - } - }, - measures: { - avg_amount: { - label: "Tama\xF1o medio del negocio" - }, - avg_probability: { - label: "Probabilidad media" - }, - decided_count: { - label: "Negocios resueltos" - }, - lost_amount: { - label: "Ingresos perdidos" - }, - lost_count: { - label: "Negocios perdidos" - }, - opp_count: { - label: "Oportunidades" - }, - total_amount: { - label: "Importe total" - }, - win_rate: { - label: "Tasa de ganancia" - }, - won_amount: { - label: "Ingresos ganados" - }, - won_count: { - label: "Negocios ganados" - } - } - }, - product_metrics: { - label: "M\xE9tricas de productos", - description: "Capa sem\xE1ntica para el recuento del cat\xE1logo y el precio de lista", - dimensions: { - category: { - label: "Categor\xEDa" - } - }, - measures: { - list_price_sum: { - label: "Precio de lista total" - }, - product_count: { - label: "Productos" - } - } - }, - task_metrics: { - label: "M\xE9tricas de tareas", - description: "Capa sem\xE1ntica para la carga de trabajo y la finalizaci\xF3n de tareas", - dimensions: { - due_date: { - label: "Fecha de vencimiento" - }, - is_completed: { - label: "Completada" - }, - is_overdue: { - label: "Vencida" - }, - priority: { - label: "Prioridad" - }, - priority_rank: { - label: "Urgencia" - }, - status: { - label: "Estado" - }, - type: { - label: "Tipo" - } - }, - measures: { - avg_progress: { - label: "Progreso medio" - }, - task_count: { - label: "Tareas" - } - } - } - }, - pages: { - account_detail_page: { - label: "Detalle de Cuenta", - description: "P\xE1gina de registro de cuenta por slots: cabecera personalizada + feed de discusi\xF3n permanente.", - title: "{name}", - subtitle: "{industry} \xB7 {type}", - components: { - account_chatter: { label: "Discusi\xF3n" } - } - }, - account_workbench: { - label: "Mesa de Trabajo de Cuentas", - description: "Lista de cuentas curada para el equipo comercial: solo filtros r\xE1pidos, sin gesti\xF3n de vistas." - }, - app_launcher_page: { - label: "Lanzador de Aplicaciones", - description: "Punto de acceso central a todas las aplicaciones", - subtitle: "Seleccione una aplicaci\xF3n para empezar", - components: { - app_search: { label: "Buscar Aplicaciones" }, - app_grid: { label: "Cuadr\xEDcula de Aplicaciones" } - } - }, - case_detail_page: { - label: "Detalle de Caso", - description: "P\xE1gina de caso para el agente de servicio: datos destacados, progreso del SLA, detalles y cronolog\xEDa de actividad.", - title: "{case_number} \xB7 {subject}", - subtitle: "{crm_account}", - components: { - case_highlights: { label: "Informaci\xF3n Clave" }, - case_status_path: { label: "Progreso del Estado del Caso" }, - case_details: { label: "Detalles del Caso" } - } - }, - lead_detail_page: { - label: "Detalle de Prospecto", - description: "P\xE1gina completa de detalle del prospecto, con datos destacados, detalles e informaci\xF3n relacionada", - title: "{first_name} {last_name}", - subtitle: "{company}", - components: { - lead_duplicate_alert_confirmed: { label: "Aviso de duplicado confirmado" }, - lead_duplicate_alert_suspected: { label: "Aviso de duplicado sospechoso" }, - lead_highlights: { label: "Informaci\xF3n Clave" }, - lead_path: { label: "Progreso del Estado del Prospecto" }, - main_tabs: { label: "Pesta\xF1as de Informaci\xF3n del Prospecto" }, - lead_details: { label: "Detalles del Prospecto" }, - related_accordion: { label: "Registros Relacionados" }, - related_tasks: { title: "Tareas Abiertas", label: "Tareas" }, - lead_activity: { label: "Cronolog\xEDa de Actividad" }, - lead_history: { label: "Historial de Campos" } - } - }, - opportunity_detail_page: { - label: "Detalle de Oportunidad", - description: "P\xE1gina completa de detalle de la oportunidad, con recorrido de etapas, datos destacados, detalles y listas relacionadas", - title: "{name}", - subtitle: "{crm_account}", - components: { - opp_highlights: { label: "Informaci\xF3n Clave" }, - opp_stage_path: { label: "Progreso de Etapa de la Oportunidad" }, - opp_details: { label: "Detalles de la Oportunidad" } - } - }, - sales_home_page: { - label: "Inicio de Ventas", - description: "P\xE1gina de inicio del equipo comercial con m\xE9tricas clave y acciones r\xE1pidas", - title: "Panel de Ventas", - subtitle: "Bienvenido de nuevo", - components: { - kpi_revenue_won: { - label: "Ingresos (ganados)" - }, - kpi_deals_won: { - label: "Negocios ganados" - }, - kpi_pipeline_value: { - label: "Valor del pipeline" - }, - kpi_open_leads: { - label: "Prospectos abiertos" - }, - home_upcoming_events: { - label: "\u{1F4C5} Pr\xF3ximos \xB7 M\xE1s cercanos primero" - }, - quick_create: { title: "Creaci\xF3n R\xE1pida", label: "Creaci\xF3n R\xE1pida" }, - key_metrics: { title: "Indicadores Clave de Rendimiento", label: "M\xE9tricas Clave" }, - home_tabs: { label: "Pesta\xF1as de Inicio" }, - home_my_leads: { label: "Mis Prospectos" }, - home_my_deals: { label: "Mis Negocios Abiertos" }, - home_my_tasks: { label: "Mis Tareas Abiertas" }, - ai_briefing: { - title: "Preg\xFAntale al Asistente de IA", - label: "Hoy con el Asistente de IA" - }, - upcoming_events: { title: "Pr\xF3ximos Eventos", label: "Pr\xF3ximos Eventos" } - } - }, - utility_bar_page: { - label: "Barra de Utilidades", - description: "Barra de acceso r\xE1pido con herramientas flotantes", - components: { - notifications_panel: { label: "Notificaciones" }, - quick_notes: { title: "Notas R\xE1pidas", label: "Notas R\xE1pidas" }, - quick_search: { label: "B\xFAsqueda R\xE1pida" } - } - } - }, - // Screen-flow copy (#1210, #1975). Keyed `flows..label`, - // `screens..title` and `screens..fields..{label,placeholder}` - // — the keys `os lint`'s `i18n/missing-flow` names, read by the console's - // flow runner since @objectstack 17.7.0 (the spec's `flows` liveness row is - // `live` there). A screen with no authored `title` shows its flow's label in - // every locale, so each `screen_1.title` repeats the flow label. Since - // 18.0.0-next.0 three more surfaces are keys the engine reads in the run's - // locale, and `i18n/missing-flow` names each missing one: a select field's - // `options.` (worded as the object field's own option in this pack), - // an authored screen `description`, and a refusing `end` node's - // `refusals..message`. A translated description or message is a text - // slot like the one it translates, so a hole in it is `{{ }}`. - // The discount ceiling is interpolated from `QUOTE_DISCOUNT_CEILING`, never - // retyped: the number lives in `_thresholds.ts` alone (#1711). - flows: { - campaign_enrollment: { - label: "Inscribir miembros en la campa\xF1a", - screens: { - screen_1: { - title: "Inscribir miembros en la campa\xF1a", - fields: { - memberSource: { label: "Tipo de miembro a inscribir", options: { leads: "Prospectos", contacts: "Contactos" } }, - leadStatus: { label: "Inscribir prospectos con estado", options: { new: "Nuevo", contacted: "Contactado", qualified: "Calificado" } }, - contactDepartment: { - label: "Inscribir contactos del departamento", - options: { executive: "Ejecutivo", sales: "Ventas", marketing: "Marketing", engineering: "Ingenier\xEDa", support: "Soporte", finance: "Finanzas", hr: "Recursos Humanos", operations: "Operaciones" } - } - } - } - } - }, - escalate_case: { - label: "Escalar Caso", - screens: { screen_1: { title: "Escalar Caso", fields: { reason: { label: "Motivo de Escalaci\xF3n" } } } } - }, - close_case: { - label: "Cerrar Caso", - screens: { - screen_1: { - title: "Cerrar Caso", - fields: { - resolution: { label: "Resoluci\xF3n" }, - resolved_by_article: { label: "Resuelto con art\xEDculo (opcional)" } - } - } - } - }, - claim_case: { - label: "Tomar Caso", - screens: { - screen_1: { - title: "Tomar Caso", - fields: { - claimStatus: { - label: "Estado de trabajo", - options: { in_progress: "En Curso", waiting_customer: "Esperando al Cliente", waiting_support: "Esperando a Soporte" } - } - } - } - } - }, - lead_conversion: { - label: "Proceso de conversi\xF3n de prospecto", - screens: { - screen_1: { - title: "Proceso de conversi\xF3n de prospecto", - // The duplicate warning's text is a variable the flow assigns; this - // key can only carry the hole that shows it. - description: "{{duplicateWarning}}", - fields: { - createOpportunity: { label: "\xBFCrear oportunidad?" }, - opportunityName: { label: "Nombre de Oportunidad" }, - opportunityAmount: { label: "Monto de la Oportunidad" }, - closeDate: { label: "Fecha de Cierre" } - } - }, - refuse_confirmed_duplicate: { - title: "Conversi\xF3n rechazada", - description: "El Estado del Duplicado de este prospecto es Confirmado: un revisor lo compar\xF3 con un registro existente y registr\xF3 que lo repite. Convertirlo crear\xEDa una segunda cuenta, contacto y oportunidad para el mismo comprador. La secci\xF3n Gesti\xF3n de Duplicados de este prospecto indica el registro que se conserva; descalifique este prospecto como duplicado. Solo un revisor que cambie ese veredicto vuelve a habilitar la conversi\xF3n." - }, - refuse_unapproved: { - title: "Conversi\xF3n rechazada", - description: "Este prospecto no ha sido aprobado para la conversi\xF3n. Un aprobador debe darle el visto bueno antes de que pueda convertirse en una cuenta, un contacto y una oportunidad; el campo Aprobaci\xF3n de Conversi\xF3n del prospecto muestra si la decisi\xF3n sigue pendiente o fue rechazada. Mientras tanto, siga trabajando el prospecto: nada de \xE9l queda bloqueado." - }, - refuse_no_match_key: { - title: "Conversi\xF3n rechazada", - description: "La empresa de este prospecto no tiene clave de coincidencia, as\xED que la conversi\xF3n no puede saber a qu\xE9 cuenta pertenece y no lo va a adivinar: una suposici\xF3n podr\xEDa archivar el contacto y la oportunidad bajo otro cliente. Guardar la Empresa del prospecto reconstruye la clave, as\xED que gu\xE1rdela de nuevo y luego convi\xE9rtalo. No se ha creado nada." - } - } - }, - schedule_followup: { - label: "Programar Seguimiento", - screens: { - screen_1: { - title: "Programar Seguimiento", - fields: { - subject: { label: "\xBFCu\xE1l es el siguiente paso?" }, - dueDate: { label: "Fecha L\xEDmite" }, - activityType: { - label: "Tipo de Actividad", - options: { call: "Llamada", email: "Email", meeting: "Reuni\xF3n", follow_up: "Seguimiento", demo: "Demostraci\xF3n", other: "Otro" } - }, - priority: { label: "Prioridad", options: { low: "Baja", normal: "Normal", high: "Alta", urgent: "Urgente" } }, - notes: { label: "Notas" } - } - } - } - }, - quote_generation: { - label: "Generar cotizaci\xF3n desde la oportunidad", - refusals: { refuse_held: { message: "Primero va la aprobaci\xF3n de calificaci\xF3n: marque Solicitar Aprobaci\xF3n de Calificaci\xF3n. No se cre\xF3 nada." } }, - screens: { - screen_1: { - title: "Generar cotizaci\xF3n desde la oportunidad", - fields: { - quoteName: { label: "Nombre de Cotizaci\xF3n" }, - expirationDays: { label: "V\xE1lida por (d\xEDas)" }, - discount: { label: `Descuento % (\u2264 ${QUOTE_DISCOUNT_CEILING})`, placeholder: `0-${QUOTE_DISCOUNT_CEILING}` } - } - } - } - } - } -}; - -// src/sales/translations/es-ES/_shared.ts -var activityActions4 = { - log_call: { - label: "Registrar llamada", - successMessage: "\xA1Llamada registrada exitosamente!", - params: { - subject: { label: "Asunto de la llamada" }, - duration: { label: "Duraci\xF3n (minutos)" }, - attendee_contacts: { label: "Contactos participantes" }, - attendee_users: { label: "Participantes internos" }, - notes: { label: "Notas de la llamada" } - } - }, - log_meeting: { - label: "Registrar reuni\xF3n", - successMessage: "\xA1Reuni\xF3n registrada exitosamente!", - params: { - subject: { label: "Asunto de la reuni\xF3n" }, - duration: { label: "Duraci\xF3n (minutos)" }, - attendee_contacts: { label: "Contactos participantes" }, - attendee_users: { label: "Participantes internos" }, - notes: { label: "Notas de la reuni\xF3n" } - } - }, - schedule_meeting: { - label: "Programar reuni\xF3n", - successMessage: "\xA1Reuni\xF3n programada!", - params: { - subject: { label: "Asunto de la reuni\xF3n" }, - start_date: { label: "Fecha de inicio (UTC)" }, - start_time: { label: "Hora de inicio (UTC)" }, - location: { label: "Ubicaci\xF3n" }, - duration: { label: "Duraci\xF3n (minutos)" }, - attendee_contacts: { label: "Contactos participantes" }, - attendee_users: { label: "Participantes internos" }, - notes: { label: "Agenda" } - } - } -}; - -// src/sales/translations/es-ES/objects.customer.ts -var customer4 = { - crm_account: { - label: "Cuenta", - pluralLabel: "Cuentas", - description: "Empresas y organizaciones con las que mantenemos relaci\xF3n comercial", - fields: { - account_number: { label: "N\xFAmero de Cuenta" }, - registration_number: { - label: "N\xFAmero de Registro", - help: "La identidad registrada de la contraparte, emitida por su propio registro gubernamental. No es el N\xFAmero de Cuenta, que emitimos nosotros." - }, - commercial_capability: { - label: "Capacidad Comercial", - help: "Si se puede abrir nuevo negocio con esta cuenta. Las cuentas de Solo Liquidaci\xF3n siguen siendo utilizables para facturaci\xF3n y pagos, pero no se les puede vincular ninguna oportunidad nueva.", - options: { full: "Completa", settlement_only: "Solo Liquidaci\xF3n" } - }, - incumbent_vendor: { label: "Proveedor Actual", help: "El proveedor que actualmente atiende el gasto que perseguimos en esta cuenta." }, - annual_purchasing_budget: { label: "Presupuesto Anual de Compras", help: "Lo que esta cuenta espera gastar con proveedores este a\xF1o, no sus propios ingresos." }, - payment_cycle: { - label: "Ciclo de Pago", - options: { prepaid: "Prepago", net_30: "30 d\xEDas", net_60: "60 d\xEDas", net_90: "90 d\xEDas" } - }, - approval_status: { - label: "Estado de Aprobaci\xF3n", - help: "En qu\xE9 punto de su aprobaci\xF3n est\xE1 esta cuenta. Una cuenta nueva comienza Pendiente y se decide en la bandeja de aprobaciones.", - options: { pending: "Pendiente", approved: "Aprobada", rejected: "Rechazada" } - }, - name: { label: "Nombre de Cuenta", help: "Nombre legal de la empresa u organizaci\xF3n" }, - name_normalized: { - label: "Nombre de Cuenta (Normalizado)", - help: "Clave de coincidencia para la conversi\xF3n de prospectos: el Nombre de Cuenta en min\xFAsculas, sin espacios sobrantes y con los espacios internos reducidos a uno. Lo mantiene el hook account_protection \u2014 nunca lo edite directamente." - }, - display_title: { label: "T\xEDtulo Mostrado" }, - type: { - label: "Tipo", - // `former` is 'Former Customer' in account.object.ts; the `en` bundle - // had truncated it to 'Former', and translating that truncation gave - // a bare 'Anterior' — an adjective with no noun, next to three option - // labels that are all nouns. - options: { prospect: "Prospecto", customer: "Cliente", partner: "Socio", former: "Cliente Anterior" } - }, - industry: { - label: "Industria", - options: { - technology: "Tecnolog\xEDa", - software: "Software / SaaS", - finance: "Finanzas", - healthcare: "Salud", - retail: "Comercio", - manufacturing: "Manufactura", - education: "Educaci\xF3n", - real_estate: "Inmobiliaria", - media: "Medios y Entretenimiento", - logistics: "Log\xEDstica", - hospitality: "Hosteler\xEDa", - energy: "Energ\xEDa y Servicios P\xFAblicos", - government: "Gobierno", - nonprofit: "Sin \xC1nimo de Lucro", - other: "Otro" - } - }, - annual_revenue: { label: "Ingresos Anuales" }, - child_account_revenue: { label: "Ingresos de Cuentas Hijas", help: "Suma de los ingresos anuales de las cuentas hijas directas." }, - number_of_employees: { label: "N\xFAmero de Empleados" }, - phone: { label: "Tel\xE9fono" }, - website: { label: "Sitio Web" }, - billing_address: { label: "Direcci\xF3n de Facturaci\xF3n" }, - billing_country: { - label: "Pa\xEDs de Facturaci\xF3n", - help: "Derivado de la Direcci\xF3n de Facturaci\xF3n \u2014 el pa\xEDs tal como se introdujo, sin espacios y en may\xFAsculas." - }, - territory: { - label: "Territorio", - help: "Derivado de la Direcci\xF3n de Facturaci\xF3n \u2014 el territorio de ventas que usan las reglas de compartici\xF3n. Las cuentas fuera de los territorios con equipo asignado son Otro.", - options: { na: "Norteam\xE9rica", emea: "EMEA", other: "Otro" } - }, - office_location: { label: "Ubicaci\xF3n de Oficina" }, - owner_id: { label: "Propietario de Cuenta" }, - parent_account: { label: "Cuenta Matriz", help: "Empresa matriz en la jerarqu\xEDa" }, - description: { label: "Descripci\xF3n" }, - is_active: { label: "Activo" }, - last_activity_date: { label: "Fecha de \xDAltima Actividad" }, - brand_color: { label: "Color de Marca" }, - logo: { label: "Logo de la Empresa" }, - tier: { - label: "Nivel de Cliente", - options: { - strategic: "Estrat\xE9gico", - enterprise: "Gran Empresa", - mid_market: "Mediana Empresa", - smb: "PYME" - } - }, - segment: { - label: "Segmento", - options: { - net_new: "Cliente Nuevo", - growth: "Crecimiento", - at_risk: "En Riesgo", - stable: "Estable" - } - }, - health_score: { - label: "\xCDndice de Salud", - help: "Indicador de salud mantenido por el CSM", - options: { - healthy: "Saludable", - watching: "En Observaci\xF3n", - at_risk: "En Riesgo", - churning: "En Fuga" - } - } - }, - _views: { - all_accounts: { - label: "Todas las Cuentas", - description: "Lista maestra de cuentas con ingresos e industria", - bulkActions: { - delete: { - label: "Eliminar", - confirmLabel: "Eliminar", - confirmText: "\xBFEliminar permanentemente {{count}} cuenta(s)? Esta acci\xF3n no se puede deshacer." - }, - transfer_owner: { - label: "Transferir propietario", - confirmText: "\xBFTransferir la propiedad de {{count}} cuenta(s)?", - params: { - owner_id: { - label: "Nuevo propietario" - } - } - }, - update_tier: { - label: "Actualizar nivel", - confirmText: "\xBFActualizar el nivel de {{count}} cuenta(s) a {{tier}}?", - params: { - tier: { - label: "Nivel de cliente" - } - } - } - } - }, - account_gallery: { label: "Galer\xEDa de Cuentas", description: "Vista de tarjetas con colores de marca" }, - account_map: { label: "Mapa de Cuentas", description: "Distribuci\xF3n geogr\xE1fica de cuentas" }, - enterprise_accounts: { label: "Cuentas Empresariales", description: "Cuentas con mayores ingresos anuales" }, - my_accounts: { label: "Mis Cuentas", description: "Cuentas asignadas al usuario actual" }, - at_risk_accounts: { label: "\u26A0\uFE0F Cuentas en Riesgo" } - }, - _sections: { - basic: { label: "Informaci\xF3n B\xE1sica" }, - financials: { label: "Datos Financieros" }, - business_profile: { label: "Perfil de Negocio" }, - contact_info: { label: "Informaci\xF3n de Contacto" }, - ownership: { label: "Propiedad y Estado" }, - branding: { label: "Identidad de Marca" }, - system: { label: "Sistema" }, - // Nombres de sección del formulario en account.view.ts (#1100) - profile: { label: "Perfil" }, - customer_success: { label: "\xC9xito del Cliente" }, - locations: { label: "Ubicaciones" }, - description: { label: "Descripci\xF3n" } - }, - _actions: { ...activityActions4 } - }, - crm_contact: { - label: "Contacto", - pluralLabel: "Contactos", - description: "Personas asociadas a las cuentas", - fields: { - // Mismo juego de valores que `crm_lead.salutation` — tradúzcanse igual. - salutation: { - label: "T\xEDtulo", - options: { mr: "Sr.", ms: "Srta.", mrs: "Sra.", dr: "Dr.", prof: "Prof." } - }, - first_name: { label: "Nombre" }, - last_name: { label: "Apellido" }, - full_name: { label: "Nombre Completo" }, - crm_account: { label: "Cuenta" }, - email: { label: "Correo Electr\xF3nico" }, - phone: { label: "Tel\xE9fono" }, - mobile: { label: "M\xF3vil" }, - title: { label: "Cargo" }, - department: { - label: "Departamento", - options: { - executive: "Ejecutivo", - sales: "Ventas", - marketing: "Marketing", - engineering: "Ingenier\xEDa", - support: "Soporte", - finance: "Finanzas", - hr: "Recursos Humanos", - operations: "Operaciones" - } - }, - // Centro de compra (REQ-0004) — el mapa de la decisión. La etiqueta - // inglesa es 'Buying Function' y no 'Buying Role': la regla - // security-role-word reserva la palabra inglesa `role` en las - // declaraciones (ADR-0090 D3). Esa regla sólo lee inglés y no alcanza - // los paquetes de idioma, así que aquí va el término natural. - buying_function: { - label: "Rol de Compra", - options: { - decision_maker: "Decisor", - economic_buyer: "Comprador Econ\xF3mico", - technical_evaluator: "Evaluador T\xE9cnico", - user: "Usuario", - influencer: "Influenciador", - gatekeeper: "Guardi\xE1n" - } - }, - attitude: { - label: "Actitud hacia Nosotros", - options: { - champion: "Defensor", - supportive: "Favorable", - neutral: "Neutral", - skeptical: "Esc\xE9ptico", - blocker: "Bloqueador" - } - }, - relationship_strength: { - label: "Fuerza de la Relaci\xF3n", - options: { - distant: "Distante", - acquaintance: "Conocido", - working: "Relaci\xF3n de Trabajo", - strong: "Fuerte", - trusted_advisor: "Asesor de Confianza" - } - }, - owner_id: { label: "Propietario de Contacto" }, - description: { label: "Descripci\xF3n" }, - is_primary: { label: "Contacto Principal", help: "\xBFEs este el contacto principal de la cuenta?" }, - avatar: { label: "Foto de Perfil" }, - mailing_address: { label: "Direcci\xF3n de Correo" }, - // Juego compartido con `crm_lead.lead_source` y - // `crm_opportunity.lead_source` — los tres deben coincidir literalmente. - lead_source: { - label: "Origen del Prospecto", - options: { - web: "Web", - referral: "Referencia", - event: "Evento / Feria", - webinar: "Seminario Web", - partner: "Socio", - advertisement: "Publicidad", - paid_search: "B\xFAsqueda de Pago", - social: "Redes Sociales", - content: "Contenido / Blog", - cold_call: "Llamada en Fr\xEDo", - email_campaign: "Campa\xF1a de Email", - other: "Otro" - } - }, - do_not_call: { label: "No Llamar" }, - email_opt_out: { label: "Excluir de Correos" }, - last_contacted_date: { label: "\xDAltimo contacto" } - }, - _views: { - all_contacts: { label: "Todos los Contactos" }, - contact_directory: { label: "Directorio de Contactos" }, - primary_contacts: { label: "Contactos Principales" } - }, - _sections: { - identity: { label: "Identidad" }, - account_info: { label: "Cuenta y Cargo" }, - buying_centre: { label: "Centro de Compra" }, - contact_info: { label: "Informaci\xF3n de Contacto" }, - mailing_address: { label: "Direcci\xF3n de Correo" }, - additional: { label: "Informaci\xF3n Adicional" }, - preferences: { label: "Preferencias de Comunicaci\xF3n" }, - // Nombres de sección del formulario en contact.view.ts (#1100) - contact_details: { label: "Informaci\xF3n de Contacto" }, - comm_preferences: { label: "Preferencias" } - }, - _actions: { - ...activityActions4, - mark_primary: { - label: "Marcar como Principal", - confirmText: "\xBFEstablecer este contacto como contacto principal de la cuenta?", - successMessage: "\xA1Establecido como contacto principal!" - }, - send_email: { - label: "Enviar Correo", - params: { - subject: { label: "Asunto" }, - body: { label: "Cuerpo" } - } - }, - add_contact_to_campaign: { - label: "A\xF1adir a Campa\xF1a", - successMessage: "\xA1Contactos a\xF1adidos a la campa\xF1a!", - params: { - crm_campaign: { label: "Campa\xF1a" } - } - } - } - } -}; - -// src/sales/translations/es-ES/objects.pipeline.ts -var pipeline4 = { - crm_lead: { - _validations: { - disqualification_reason_required: { - message: "El motivo de descalificaci\xF3n es obligatorio cuando un prospecto no est\xE1 cualificado" - }, - duplicate_disqualification_requires_survivor: { - message: "Descalificar un prospecto como duplicado exige nombrar el registro superviviente y marcar el estado de duplicado como Confirmado" - }, - email_required: { - message: "El correo electr\xF3nico es obligatorio" - }, - lead_status_progression: { - message: "Transici\xF3n de estado de prospecto no v\xE1lida" - } - }, - label: "Prospecto", - pluralLabel: "Prospectos", - description: "Clientes potenciales todav\xEDa sin calificar", - fields: { - first_name: { label: "Nombre" }, - last_name: { label: "Apellido" }, - company: { label: "Empresa" }, - company_normalized: { - label: "Empresa (Normalizado)", - help: "Clave de coincidencia para la conversi\xF3n de prospectos: la Empresa en min\xFAsculas, sin espacios sobrantes y con los espacios internos reducidos a uno. Lo mantiene el hook lead_duplicate_check \u2014 nunca lo edite directamente." - }, - display_title: { label: "T\xEDtulo Mostrado" }, - title: { label: "Cargo" }, - email: { label: "Correo Electr\xF3nico" }, - phone: { label: "Tel\xE9fono" }, - status: { - label: "Estado", - options: { - new: "Nuevo", - contacted: "Contactado", - qualified: "Calificado", - unqualified: "No Calificado", - converted: "Convertido" - } - }, - lead_source: { - label: "Origen del Prospecto", - options: { - web: "Web", - referral: "Referencia", - event: "Evento / Feria", - webinar: "Seminario Web", - partner: "Socio", - advertisement: "Publicidad", - paid_search: "B\xFAsqueda de Pago", - social: "Redes Sociales", - content: "Contenido / Blog", - cold_call: "Llamada en Fr\xEDo", - email_campaign: "Campa\xF1a de Email", - other: "Otro" - } - }, - owner_id: { label: "Propietario" }, - is_converted: { label: "Convertido" }, - description: { label: "Descripci\xF3n" }, - // Mismo juego de valores que `crm_contact.salutation` — tradúzcanse igual. - salutation: { - label: "Tratamiento", - options: { mr: "Sr.", ms: "Srta.", mrs: "Sra.", dr: "Dr.", prof: "Prof." } - }, - full_name: { label: "Nombre Completo" }, - // Los 15 valores son los mismos que en `crm_account.industry` — deben - // coincidir literalmente entre ambas pantallas. - industry: { - label: "Industria", - options: { - technology: "Tecnolog\xEDa", - software: "Software / SaaS", - finance: "Finanzas", - healthcare: "Salud", - retail: "Comercio", - manufacturing: "Manufactura", - education: "Educaci\xF3n", - real_estate: "Inmobiliaria", - media: "Medios y Entretenimiento", - logistics: "Log\xEDstica", - hospitality: "Hosteler\xEDa", - energy: "Energ\xEDa y Servicios P\xFAblicos", - government: "Gobierno", - nonprofit: "Sin \xC1nimo de Lucro", - other: "Otro" - } - }, - mobile: { label: "M\xF3vil" }, - website: { label: "Sitio Web" }, - rating: { label: "Puntuaci\xF3n de Prospecto", help: "Puntuaci\xF3n de calidad del prospecto (1-5 estrellas)" }, - next_followup_date: { label: "Pr\xF3xima Fecha de Seguimiento" }, - last_contacted_date: { label: "\xDAltimo Contacto" }, - need_type: { - label: "Tipo de Necesidad", - help: "Qu\xE9 est\xE1 pidiendo este prospecto. La asignaci\xF3n, la priorizaci\xF3n y los informes de demanda leen este campo.", - options: { - new_implementation: "Nueva Implantaci\xF3n", - expansion: "Ampliaci\xF3n", - replacement: "Sustituci\xF3n", - renewal: "Renovaci\xF3n", - consulting: "Consultor\xEDa", - support: "Soporte y Mantenimiento", - other: "Otro" - } - }, - estimated_amount: { - label: "Importe Estimado", - help: "Valor estimado de esta necesidad, antes de la cualificaci\xF3n. Precarga el importe de la oportunidad al convertir." - }, - conversion_approval_status: { - label: "Aprobaci\xF3n de Conversi\xF3n", - help: "Si este prospecto tiene el visto bueno para convertirse. \xABNo Requerida\xBB significa que no se pide aprobaci\xF3n: es el valor predeterminado de f\xE1brica.", - options: { - not_required: "No Requerida", - pending: "Pendiente", - approved: "Aprobada", - rejected: "Rechazada" - } - }, - converted_account: { label: "Cuenta Convertida" }, - converted_contact: { label: "Contacto Convertido" }, - converted_opportunity: { label: "Oportunidad Convertida" }, - converted_date: { label: "Fecha de Conversi\xF3n" }, - address: { label: "Direcci\xF3n" }, - annual_revenue: { label: "Ingresos Anuales" }, - number_of_employees: { label: "N\xFAmero de Empleados" }, - notes: { label: "Notas", help: "Notas de trabajo sobre este cliente potencial: admite formato." }, - do_not_call: { label: "No Llamar" }, - email_opt_out: { label: "Excluir de Correos" }, - disqualification_reason: { - label: "Motivo de No Calificaci\xF3n", - help: "Obligatorio cuando el estado es No Calificado", - options: { - not_a_fit: "No Encaja", - no_budget: "Sin Presupuesto", - wrong_persona: "Perfil Incorrecto", - unreachable: "Ilocalizable", - duplicate: "Duplicado", - competitor: "Competidor", - other: "Otro" - } - }, - duplicate_of_type: { - label: "Duplicado De", - help: "Qu\xE9 objeto contiene el registro superviviente que este prospecto repite.", - // `erased` es una lápida, no una opción: el formulario no la ofrece - // (ver `src/sales/views/lead.view.ts`), pero un prospecto cuyo superviviente - // fue eliminado la lleva, así que necesita etiqueta allí donde el - // registro se LEE; sin traducir se mostraría el valor crudo `erased`. - options: { crm_lead: "Prospecto", crm_contact: "Contacto", erased: "Registro Eliminado" } - }, - duplicate_of_lead: { label: "Prospecto Duplicado" }, - duplicate_of_contact: { label: "Contacto Duplicado" }, - duplicate_status: { - label: "Estado del Duplicado", - help: "Sospechoso = marcado autom\xE1ticamente en la captura. Confirmado = una persona verific\xF3 la coincidencia.", - options: { suspected: "Sospechoso", confirmed: "Confirmado" } - } - }, - _views: { - all_leads: { - label: "Todos los Prospectos", - emptyState: { title: "Todav\xEDa no hay prospectos", message: "Empiece creando su primer prospecto" } - }, - kanban_by_status: { label: "Pipeline de Prospectos" }, - calendar_by_created: { label: "Calendario de Prospectos" }, - gallery_view: { label: "Galer\xEDa de Prospectos" }, - my_leads: { label: "Mis Prospectos" }, - high_priority: { label: "Alta Prioridad" }, - hot_leads: { label: "\u{1F525} Prospectos Calientes" }, - suspected_duplicates: { - label: "Duplicados Sospechosos", - emptyState: { - title: "Sin duplicados sospechosos", - message: "Nada que revisar: se han comprobado todos los correos recapturados." - } - } - }, - _sections: { - // Claves de sección del objeto (lead.object.ts) que usan los - // formularios de registro y la página de detalle, cuyas secciones - // hacen referencia a estos grupos (#806). - address: { label: "Direcci\xF3n" }, - identity: { label: "Identidad" }, - company_info: { label: "Informaci\xF3n de la Empresa" }, - contact_info: { label: "Informaci\xF3n de Contacto" }, - qualification: { label: "Calificaci\xF3n" }, - assignment: { label: "Asignaci\xF3n" }, - conversion: { label: "Conversi\xF3n" }, - additional: { label: "Informaci\xF3n Adicional" }, - preferences: { label: "Preferencias de Comunicaci\xF3n" }, - duplicates: { label: "Gesti\xF3n de Duplicados" }, - // Nombres de sección del formulario en lead.view.ts (#1100) — aquí - // viven las secciones del formulario por defecto y las de cada formView - // con nombre: si se añade un formulario allí, se añaden aquí sus - // nombres de sección. - contact_information: { label: "Informaci\xF3n de Contacto" }, - lead_classification: { label: "Clasificaci\xF3n del Lead" }, - company_information: { label: "Informaci\xF3n de la Empresa" }, - additional_information: { label: "Informaci\xF3n Adicional" }, - privacy: { label: "Privacidad" }, - general: { label: "General" }, - details: { label: "Detalles" }, - step_1_contact_details: { label: "Paso 1: Datos de Contacto" }, - step_2_company_information: { label: "Paso 2: Informaci\xF3n de la Empresa" }, - step_3_qualification: { label: "Paso 3: Calificaci\xF3n" }, - step_4_review_and_convert: { label: "Paso 4: Revisar y Convertir" }, - primary_information: { label: "Informaci\xF3n Principal" }, - extended_details: { label: "Detalles Ampliados" }, - quick_edit: { label: "Edici\xF3n R\xE1pida" }, - update_lead_status: { label: "Actualizar Estado del Lead" }, - tell_us_about_yourself: { label: "Cu\xE9ntanos sobre ti" }, - about_your_company: { label: "Sobre tu empresa" }, - how_can_we_help: { label: "\xBFC\xF3mo podemos ayudarte?" }, - lead_information: { label: "Informaci\xF3n del Lead" }, - address_information: { label: "Informaci\xF3n de Direcci\xF3n" }, - privacy_preferences: { label: "Preferencias de Privacidad" } - }, - _actions: { - ...activityActions4, - convert_lead: { - label: "Convertir Prospecto", - successMessage: "\xA1Prospecto convertido con \xE9xito!" - }, - create_campaign: { - label: "Agregar a Campa\xF1a", - successMessage: "\xA1Prospecto agregado a la campa\xF1a!", - params: { - crm_campaign: { label: "Campa\xF1a" } - } - }, - schedule_followup: { - label: "Programar Seguimiento", - successMessage: "Seguimiento programado." - } - } - }, - crm_opportunity: { - _validations: { - amount_positive: { - message: "El importe debe ser mayor que cero" - }, - close_date_future: { - message: "La fecha de cierre no deber\xEDa estar en el pasado salvo que la oportunidad est\xE9 cerrada" - }, - opportunity_stage_progression: { - message: "Transici\xF3n de etapa de oportunidad no v\xE1lida" - } - }, - label: "Oportunidad", - pluralLabel: "Oportunidades", - description: "Oportunidades de venta y negocios en el pipeline", - fields: { - name: { label: "Nombre de Oportunidad" }, - crm_account: { label: "Cuenta" }, - primary_contact: { label: "Contacto Principal" }, - owner_id: { label: "Propietario de Oportunidad" }, - amount: { label: "Monto" }, - expected_revenue: { label: "Ingreso Esperado" }, - stage: { - label: "Etapa", - options: { - prospecting: "Prospecci\xF3n", - qualification: "Calificaci\xF3n", - needs_analysis: "An\xE1lisis de Necesidades", - proposal: "Propuesta", - negotiation: "Negociaci\xF3n", - closed_won: "Cerrada Ganada", - closed_lost: "Cerrada Perdida" - } - }, - probability: { label: "Probabilidad (%)" }, - close_date: { label: "Fecha de Cierre" }, - type: { - label: "Tipo", - options: { - new_business: "Nuevo Negocio", - existing_upgrade: "Cliente Existente - Mejora", - existing_renewal: "Cliente Existente - Renovaci\xF3n", - existing_expansion: "Cliente Existente - Expansi\xF3n" - } - }, - forecast_category: { - label: "Categor\xEDa de Pron\xF3stico", - options: { - pipeline: "Pipeline", - best_case: "Mejor Caso", - commit: "Compromiso", - omitted: "Omitida", - closed: "Cerrada" - } - }, - description: { label: "Descripci\xF3n" }, - next_step: { label: "Pr\xF3ximo Paso" }, - lead_source: { - label: "Origen del Prospecto", - options: { - web: "Web", - referral: "Referencia", - event: "Evento / Feria", - webinar: "Seminario Web", - partner: "Socio", - advertisement: "Publicidad", - paid_search: "B\xFAsqueda de Pago", - social: "Redes Sociales", - content: "Contenido / Blog", - cold_call: "Llamada en Fr\xEDo", - email_campaign: "Campa\xF1a de Email", - other: "Otro" - } - }, - crm_campaign: { label: "Campa\xF1a", help: "Campa\xF1a de marketing que gener\xF3 esta oportunidad" }, - days_in_stage: { label: "D\xEDas en Etapa Actual" }, - stage_entry_date: { label: "Fecha de Entrada a la Etapa", help: "Fecha en la que esta oportunidad entr\xF3 en su etapa actual." }, - is_private: { label: "Privado" }, - approval_status: { - label: "Estado de Aprobaci\xF3n", - options: { - not_required: "No Requerida", - pending: "Pendiente", - approved: "Aprobada", - rejected: "Rechazada" - } - }, - approved_date: { label: "Fecha de Aprobaci\xF3n" }, - // #593 — obligatorias al cerrar la oportunidad, y el desglose de - // motivos de pérdida las muestra en el panel de ventas, así que el - // valor almacenado nunca debe llegar crudo al selector. - win_reason: { - label: "Motivo de Ganancia", - help: "Por qu\xE9 se gan\xF3 este negocio. Obligatorio para cerrar una oportunidad como Ganada.", - options: { - better_product: "Mejor Producto", - better_price: "Mejor Precio", - relationship: "Relaci\xF3n Existente", - better_support: "Mejor Soporte", - best_fit: "Mejor Ajuste / Funcionalidades", - quote_accepted: "Cotizaci\xF3n Aceptada", - other: "Otro" - } - }, - loss_reason: { - label: "Motivo de P\xE9rdida", - help: "Por qu\xE9 se perdi\xF3 este negocio. Obligatorio para cerrar una oportunidad como Perdida.", - options: { - price: "Precio Demasiado Alto", - competitor: "Perdida ante Competidor", - no_budget: "Sin Presupuesto", - no_decision: "Sin Decisi\xF3n", - timing: "Momento Inadecuado", - features: "Funcionalidades Faltantes", - other: "Otro" - } - }, - loss_details: { - label: "Detalles de Ganancia/P\xE9rdida", - help: "Contexto en texto libre detr\xE1s del motivo de ganancia o p\xE9rdida." - }, - // REQ-0006 — calificación, calendario de compra del cliente, narrativa - // del negocio, línea de negocio y aprobación del cambio de estado. - will_bid: { - label: "Presentaremos Oferta", - help: "Si tenemos intenci\xF3n de presentar oferta. Sin valor significa que la decisi\xF3n sigue abierta." - }, - controllability: { label: "Controlabilidad", options: { high: "Alta", medium: "Media", low: "Baja" } }, - priority: { label: "Prioridad", options: { high: "Alta", medium: "Media", low: "Baja" } }, - deal_level: { label: "Nivel del Negocio", options: { strategic: "Estrat\xE9gico", key: "Clave", standard: "Est\xE1ndar" } }, - is_subcontracted: { label: "Incluye Subcontrataci\xF3n" }, - subcontracting_note: { label: "Nota de Subcontrataci\xF3n" }, - customer_initiation_date: { label: "Fecha de Inicio del Proyecto (Cliente)" }, - expected_tender_date: { label: "Fecha Prevista de Licitaci\xF3n" }, - expected_signing_date: { label: "Fecha Prevista de Firma" }, - expected_tender_amount: { label: "Importe Previsto de Licitaci\xF3n" }, - expected_signing_amount: { label: "Importe Previsto de Firma" }, - business_line: { - label: "L\xEDnea de Negocio", - options: { - product: "Producto", - services: "Servicios Profesionales", - consulting: "Consultor\xEDa", - support: "Soporte y Mantenimiento", - other: "Otro" - } - }, - customer_background: { label: "Antecedentes del Cliente" }, - project_background: { label: "Antecedentes del Proyecto" }, - risk_analysis: { label: "An\xE1lisis de Riesgos" }, - payment_terms: { label: "Condiciones de Pago" }, - requested_status: { label: "Estado Solicitado", options: { closed_won: "Ganada", closed_lost: "Perdida" } }, - status_change_approval_status: { - label: "Aprobaci\xF3n del Cambio de Estado", - options: { - not_required: "No Requerida", - pending: "Pendiente", - approved: "Aprobada", - rejected: "Rechazada" - } - }, - // REQ-0006 paso 11 — la aprobación de calificación (立项). - qualification_requested: { - label: "Solicitar Aprobaci\xF3n de Calificaci\xF3n", - help: "M\xE1rquelo para enviar este negocio a aprobaci\xF3n de calificaci\xF3n. Un rechazo lo desmarca; vuelva a marcarlo para solicitarla de nuevo." - }, - qualification_approval_status: { - label: "Aprobaci\xF3n de Calificaci\xF3n", - options: { - not_required: "No Requerida", - pending: "Pendiente", - approved: "Aprobada", - rejected: "Rechazada" - } - } - }, - _views: { - tender_this_quarter: { - label: "Licitaciones de Este Trimestre", - emptyState: { - title: "No hay licitaciones previstas este trimestre", - message: "Esta pesta\xF1a muestra los negocios abiertos cuya fecha de licitaci\xF3n del cliente cae dentro del trimestre actual. Registra la Fecha Prevista de Licitaci\xF3n en un negocio para verlo aqu\xED." - } - }, - open_opportunities: { label: "Oportunidades Abiertas" }, - all_opportunities: { label: "Todas las Oportunidades" }, - pipeline_kanban: { label: "Pipeline de Ventas" }, - close_date_calendar: { label: "Calendario de Pron\xF3stico" }, - deal_timeline: { label: "L\xEDnea de Tiempo" }, - deal_gallery: { label: "Galer\xEDa de Negocios" }, - my_open_deals: { label: "Mis Negocios Abiertos" }, - closing_this_quarter: { - label: "Cierres de Este Trimestre", - emptyState: { - title: "No hay negocios que cierren este trimestre", - message: "Esta pesta\xF1a muestra los negocios abiertos en categor\xEDa Compromiso o Mejor Caso cuya fecha de cierre cae dentro del trimestre actual. Ahora mismo no hay ninguno; los negocios que cierran m\xE1s adelante est\xE1n en la pesta\xF1a Negocios Abiertos." - } - }, - stale_opportunities: { label: "\u26A0\uFE0F Oportunidades Estancadas \xB7 M\xE1s Tiempo en Etapa Primero" } - }, - _sections: { - // Claves de sección del objeto (opportunity.object.ts) que usan los - // formularios de registro y la página de detalle, cuyas secciones - // hacen referencia a estos grupos (#1452). - // - // `crm_forecast` es la clave del grupo de campos («Forecast & Metrics» - // en inglés). Esta traducción es anterior a #1452, cuando una sección - // de la página de detalle con el mismo nombre se titulaba «Stage & - // Forecast»; desde entonces solo la lee el grupo. - crm_forecast: { label: "Etapa y Previsi\xF3n" }, - basic: { label: "Informaci\xF3n B\xE1sica" }, - financials: { label: "Datos Financieros" }, - sales_process: { label: "Proceso de Venta" }, - classification: { label: "Clasificaci\xF3n" }, - campaign: { label: "Campa\xF1as" }, - notes: { label: "Notas y Pr\xF3ximos Pasos" }, - qualification: { label: "Calificaci\xF3n" }, - narrative: { label: "Narrativa del Negocio" }, - // Nombres de sección del formulario en opportunity.view.ts (#1100) - overview: { label: "Resumen" }, - forecast: { label: "Previsi\xF3n" }, - sales_strategy: { label: "Estrategia de Ventas" }, - win_loss: { label: "Ganada / Perdida" } - }, - _actions: { - ...activityActions4, - clone_opportunity: { - label: "Clonar Oportunidad", - successMessage: "\xA1Oportunidad clonada con \xE9xito!" - }, - mass_update_stage: { - label: "Actualizar Etapa", - successMessage: "\xA1Etapa de oportunidad actualizada!", - params: { - // Mismos valores que `fields.stage` — deben coincidir literalmente. - stage: { - label: "Nueva Etapa", - options: { - prospecting: "Prospecci\xF3n", - qualification: "Calificaci\xF3n", - needs_analysis: "An\xE1lisis de Necesidades", - proposal: "Propuesta", - negotiation: "Negociaci\xF3n", - closed_won: "Cerrada Ganada", - closed_lost: "Cerrada Perdida" - } - } - } - }, - generate_quote: { - label: "Generar Cotizaci\xF3n", - successMessage: "\xA1Cotizaci\xF3n creada desde la oportunidad!" - } - } - }, - crm_opportunity_line_item: { - _validations: { - unit_price_positive: { - message: "El precio de venta no puede ser negativo" - } - }, - label: "L\xEDnea de Oportunidad", - pluralLabel: "L\xEDneas de Oportunidad", - description: "L\xEDneas de precio por producto dentro de una oportunidad", - fields: { - crm_opportunity: { label: "Oportunidad" }, - crm_product: { label: "Producto" }, - description: { label: "Descripci\xF3n" }, - quantity: { label: "Cantidad" }, - list_price: { label: "Precio de Lista", help: "Se rellena autom\xE1ticamente desde el Precio de Lista del producto." }, - unit_price: { label: "Precio de Venta", help: "Precio unitario negociado (puede diferir del precio de lista)" }, - discount: { label: "Descuento (%)" }, - total_price: { label: "Total" }, - line_number: { label: "N\xBA de L\xEDnea" } - }, - _sections: { - basic: { label: "L\xEDnea" }, - pricing: { label: "Precios" } - } - }, - crm_forecast: { - _validations: { - period_end_after_start: { - message: "El fin del periodo debe ser posterior a su inicio." - }, - period_end_matches_calendar_period: { - message: "El fin del periodo debe ser el \xFAltimo d\xEDa del periodo: p. ej. 2026-09-30 para un trimestre que empieza el 2026-07-01, o 2026-08-31 para agosto de 2026." - }, - period_start_first_of_period: { - message: "El inicio del periodo debe ser el primer d\xEDa del periodo: p. ej. 2026-08-01 para agosto de 2026." - }, - quarter_starts_on_quarter_boundary: { - message: "Una previsi\xF3n trimestral debe comenzar en un l\xEDmite de trimestre: 1 de enero, 1 de abril, 1 de julio o 1 de octubre." - }, - snapshot_amounts_non_negative: { - message: "Los importes de la instant\xE1nea no pueden ser negativos." - } - }, - label: "Previsi\xF3n", - pluralLabel: "Previsiones", - description: "Instant\xE1nea peri\xF3dica del pipeline por propietario para previsi\xF3n de ingresos", - fields: { - owner_id: { label: "Propietario" }, - period: { label: "Periodo", options: { month: "Mes", quarter: "Trimestre" } }, - period_start: { - label: "Inicio del periodo", - help: "Debe ser el primer d\xEDa del periodo \u2014 p. ej. 2026-08-01 para agosto de 2026. Adem\xE1s, una previsi\xF3n trimestral debe comenzar en un l\xEDmite de trimestre: 1 de enero, 1 de abril, 1 de julio o 1 de octubre." - }, - period_end: { - label: "Fin del periodo", - help: "Normalmente se calcula autom\xE1ticamente a partir de Periodo e Inicio del periodo. Si se introduce a mano, debe ser el \xFAltimo d\xEDa de ese periodo \u2014 p. ej. 2026-09-30 para un trimestre que empieza el 2026-07-01, o 2026-08-31 para agosto de 2026." - }, - period_label: { label: "Periodo", help: "Etiqueta legible, p. ej. \xABT3 2026\xBB o \xABAgo 2026\xBB." }, - display_title: { label: "T\xEDtulo Mostrado" }, - snapshot_date: { label: "Fecha de instant\xE1nea", help: "El d\xEDa en que se captur\xF3 esta instant\xE1nea." }, - source: { - label: "Origen", - options: { scheduled: "Instant\xE1nea programada", ai: "Skill de IA", manual: "Entrada manual" } - }, - quota: { label: "Cuota" }, - pipeline_amount: { label: "Pipeline", help: "Suma de todas las oportunidades abiertas que cierran en este periodo (en cualquier etapa)." }, - best_case_amount: { label: "Mejor caso", help: "Oportunidades abiertas en la categor\xEDa de pron\xF3stico Mejor caso o Compromiso." }, - commit_amount: { label: "Compromiso", help: "Oportunidades abiertas en la categor\xEDa de pron\xF3stico Compromiso (comprometidas por el propietario)." }, - closed_amount: { label: "Cerrado", help: "Importe ya cerrado ganado en este periodo." }, - expected_amount: { label: "Esperado", help: "Cerrado + Compromiso: lo que el propietario espera razonablemente cerrar." }, - attainment_pct: { label: "Cumplimiento %", help: "Cerrado \xF7 Cuota \xD7 100. Muestra 0 % hasta que se fija una cuota positiva." }, - coverage_ratio: { label: "Cobertura", help: "Pipeline \xF7 (Cuota \u2212 Cerrado): si queda pipeline suficiente para cubrir la diferencia. Muestra 0 cuando ya se ha alcanzado la cuota." }, - notes: { label: "Notas" }, - seed_key: { - label: "Clave de semilla", - help: "Identidad del juego de datos de demostraci\xF3n. Solo la escribe el cargador de semillas; est\xE1 vac\xEDa en cualquier instant\xE1nea real." - } - }, - _views: { - all_forecasts: { label: "Todas las previsiones" }, - this_quarter_forecasts: { - label: "Este trimestre", - emptyState: { - title: "A\xFAn no hay instant\xE1neas de este trimestre", - message: "Las instant\xE1neas trimestrales las escribe el barrido nocturno de previsiones. Hasta que se ejecute una vez para el trimestre actual, esta vista est\xE1 vac\xEDa; los trimestres cerrados est\xE1n en la pesta\xF1a Todas." - } - }, - my_forecast: { label: "Mi previsi\xF3n" } - }, - _sections: { - basic: { label: "Instant\xE1nea" }, - amounts: { label: "Importes" }, - meta: { label: "Origen" }, - // Nombres de sección del formulario en forecast.view.ts (#1100) - snapshot: { label: "Instant\xE1nea" }, - notes: { label: "Notas" } - } - } -}; - -// src/sales/translations/es-ES/objects.commerce.ts -var commerce4 = { - crm_quote: { - _validations: { - discount_within_ceiling: { - message: "El descuento no puede superar el 60 %" - }, - expiration_after_quote: { - message: "La fecha de vencimiento debe ser posterior a la de la cotizaci\xF3n" - }, - quote_status_progression: { - message: "Transici\xF3n de estado de cotizaci\xF3n no v\xE1lida" - } - }, - label: "Cotizaci\xF3n", - pluralLabel: "Cotizaciones", - description: "Cotizaciones de precios para clientes", - fields: { - quote_number: { label: "N\xFAmero de Cotizaci\xF3n" }, - display_title: { label: "T\xEDtulo Mostrado" }, - name: { label: "Nombre de Cotizaci\xF3n" }, - crm_account: { label: "Cuenta" }, - crm_contact: { - label: "Contacto", - help: "Obligatorio en cuanto la cotizaci\xF3n pasa a Presentada o Aceptada: el contrato generado toma de aqu\xED su Contacto principal." - }, - crm_opportunity: { label: "Oportunidad" }, - owner_id: { label: "Propietario de Cotizaci\xF3n" }, - status: { - label: "Estado", - options: { - draft: "Borrador", - in_review: "En Revisi\xF3n", - presented: "Presentada", - accepted: "Aceptada", - rejected: "Rechazada", - expired: "Expirada" - } - }, - quote_date: { label: "Fecha de Cotizaci\xF3n" }, - expiration_date: { label: "Fecha de Expiraci\xF3n" }, - subtotal: { label: "Subtotal" }, - discount: { label: "Descuento %" }, - discount_amount: { label: "Monto de Descuento" }, - tax: { label: "Impuesto" }, - shipping_handling: { label: "Env\xEDo y Manipulaci\xF3n" }, - total_price: { label: "Precio Total" }, - // Mismo juego de valores que `crm_contract.payment_terms` — tradúzcanse igual. - payment_terms: { - label: "T\xE9rminos de Pago", - options: { - net_15: "Neto 15", - net_30: "Neto 30", - net_60: "Neto 60", - net_90: "Neto 90", - due_on_receipt: "Pago a la Recepci\xF3n" - } - }, - shipping_terms: { label: "T\xE9rminos de Env\xEDo" }, - billing_address: { label: "Direcci\xF3n de Facturaci\xF3n" }, - shipping_address: { label: "Direcci\xF3n de Env\xEDo" }, - description: { label: "Descripci\xF3n" }, - internal_notes: { label: "Notas Internas" } - }, - _views: { - all_quotes: { label: "Todas las Cotizaciones" }, - quote_pipeline: { label: "Pipeline de Cotizaciones" }, - quote_calendar: { label: "Calendario de Cotizaciones" } - }, - _sections: { - basic: { label: "Informaci\xF3n de la Cotizaci\xF3n" }, - pricing: { label: "Precios" }, - terms: { label: "T\xE9rminos y Vigencia" }, - address: { label: "Direcciones" }, - system: { label: "Sistema" }, - // Nombres de sección del formulario en quote.view.ts (#1100) - quote: { label: "Cotizaci\xF3n" }, - totals: { label: "Totales" }, - quote_terms: { label: "T\xE9rminos" }, - addresses_and_notes: { label: "Direcciones y Notas" } - } - }, - crm_quote_line_item: { - _validations: { - discount_within_ceiling: { - message: "El descuento de l\xEDnea no puede superar el 60 %" - }, - unit_price_positive: { - message: "El precio de venta no puede ser negativo" - } - }, - label: "L\xEDnea de Cotizaci\xF3n", - pluralLabel: "L\xEDneas de Cotizaci\xF3n", - description: "L\xEDneas de precio por producto dentro de una cotizaci\xF3n", - fields: { - crm_quote: { label: "Cotizaci\xF3n" }, - crm_product: { label: "Producto" }, - description: { label: "Descripci\xF3n" }, - quantity: { label: "Cantidad" }, - list_price: { label: "Precio de Lista" }, - unit_price: { label: "Precio de Venta" }, - discount: { label: "Descuento (%)" }, - subtotal: { label: "Subtotal" }, - total_price: { label: "Total" }, - line_number: { label: "N\xBA de L\xEDnea" } - }, - _sections: { - basic: { label: "L\xEDnea" }, - pricing: { label: "Precios" } - } - }, - crm_contract: { - _validations: { - end_after_start: { - message: "La fecha de fin debe ser posterior a la de inicio" - }, - contract_status_progression: { - message: "Transici\xF3n de estado de contrato no v\xE1lida" - } - }, - label: "Contrato", - pluralLabel: "Contratos", - description: "Contratos y acuerdos legales", - fields: { - contract_number: { label: "N\xFAmero de Contrato" }, - crm_account: { label: "Cuenta" }, - crm_contact: { label: "Contacto Principal" }, - crm_opportunity: { label: "Oportunidad Relacionada" }, - owner_id: { label: "Propietario del Contrato" }, - status: { - label: "Estado", - options: { - draft: "Borrador", - in_approval: "En Aprobaci\xF3n", - activated: "Activado", - expired: "Expirado", - terminated: "Rescindido" - } - }, - contract_term_months: { label: "Plazo del Contrato (Meses)" }, - start_date: { label: "Fecha de Inicio" }, - end_date: { label: "Fecha de Fin" }, - contract_value: { label: "Valor del Contrato" }, - billing_frequency: { - label: "Frecuencia de Facturaci\xF3n", - options: { monthly: "Mensual", quarterly: "Trimestral", annually: "Anual", one_time: "Pago \xDAnico" } - }, - // Mismo juego de valores que `crm_quote.payment_terms` — tradúzcanse igual. - payment_terms: { - label: "T\xE9rminos de Pago", - options: { - net_15: "Neto 15", - net_30: "Neto 30", - net_60: "Neto 60", - net_90: "Neto 90", - due_on_receipt: "Pago a la Recepci\xF3n" - } - }, - auto_renewal: { label: "Renovaci\xF3n Autom\xE1tica" }, - renewal_notice_days: { label: "Aviso de Renovaci\xF3n (D\xEDas)" }, - contract_type: { - label: "Tipo de Contrato", - options: { - subscription: "Suscripci\xF3n", - service: "Acuerdo de Servicio", - license: "Licencia", - partnership: "Asociaci\xF3n", - nda: "Acuerdo de Confidencialidad (NDA)", - msa: "Acuerdo Marco de Servicios (MSA)" - } - }, - signed_date: { label: "Fecha de Firma" }, - signed_by: { label: "Firmado Por" }, - document_url: { label: "Documento de Contrato" }, - special_terms: { label: "T\xE9rminos Especiales" }, - description: { label: "Descripci\xF3n" }, - billing_address: { label: "Direcci\xF3n de Facturaci\xF3n" } - }, - _views: { - all_contracts: { label: "Todos los Contratos" }, - renewal_calendar: { label: "Calendario de Renovaci\xF3n" }, - contract_gantt: { label: "Plazos del Contrato" }, - contract_timeline: { label: "L\xEDnea de Tiempo" } - }, - _sections: { - basic: { label: "Informaci\xF3n del Contrato" }, - parties: { label: "Partes" }, - terms: { label: "T\xE9rminos y Fechas" }, - value: { label: "Valor del Contrato" }, - status: { label: "Estado y Aprobaci\xF3n" }, - renewal: { label: "Renovaci\xF3n" }, - // Nombres de sección del formulario en contract.view.ts (#1100) - contract_terms: { label: "T\xE9rminos" }, - signing_and_documents: { label: "Firma y Documentos" }, - notes: { label: "Notas" } - } - }, - crm_product: { - _validations: { - cost_less_than_price: { - message: "El coste deber\xEDa ser inferior al precio de lista" - }, - price_positive: { - message: "El precio de lista debe ser positivo" - } - }, - label: "Producto", - pluralLabel: "Productos", - description: "Productos y servicios que ofrece la empresa", - fields: { - product_code: { label: "C\xF3digo de Producto" }, - display_title: { label: "T\xEDtulo Mostrado" }, - name: { label: "Nombre de Producto" }, - description: { label: "Descripci\xF3n" }, - category: { - label: "Categor\xEDa", - options: { - software: "Software", - hardware: "Hardware", - service: "Servicio", - subscription: "Suscripci\xF3n", - support: "Soporte" - } - }, - family: { - label: "Familia de Producto", - options: { - enterprise: "Soluciones para Gran Empresa", - smb: "Soluciones para PYMEs", - services: "Servicios Profesionales", - cloud: "Servicios en la Nube" - } - }, - list_price: { label: "Precio de Lista" }, - cost: { label: "Costo" }, - sku: { label: "SKU" }, - is_active: { label: "Activo" }, - product_manager: { label: "Gerente de Producto" }, - image: { label: "Imagen de Producto" }, - datasheet: { label: "Ficha T\xE9cnica" } - }, - _views: { - all_products: { label: "Todos los Productos" }, - product_catalog: { label: "Cat\xE1logo de Productos" } - }, - _sections: { - basic: { label: "Informaci\xF3n del Producto" }, - pricing: { label: "Precios" }, - metadata: { label: "Recursos" }, - // Nombres de sección del formulario en product.view.ts (#1100) - product_info: { label: "Informaci\xF3n del Producto" }, - pricing_info: { label: "Precios" }, - media: { label: "Multimedia" } - } - } -}; - -// src/sales/translations/es-ES/objects.service.ts -var service4 = { - crm_case: { - _validations: { - resolution_required_for_closed: { - message: "La resoluci\xF3n es obligatoria al cerrar un caso" - }, - escalation_reason_required: { - message: "El motivo de escalado es obligatorio al escalar un caso" - }, - case_status_progression: { - message: "Transici\xF3n de estado no v\xE1lida" - } - }, - label: "Caso", - pluralLabel: "Casos", - description: "Casos de soporte y solicitudes de servicio de clientes", - fields: { - case_number: { label: "N\xFAmero de Caso" }, - display_title: { label: "T\xEDtulo Mostrado" }, - subject: { label: "Asunto" }, - description: { label: "Descripci\xF3n" }, - crm_account: { label: "Cuenta" }, - crm_contact: { label: "Contacto" }, - status: { - label: "Estado", - options: { - new: "Nuevo", - in_progress: "En Curso", - waiting_customer: "Esperando al Cliente", - waiting_support: "Esperando a Soporte", - escalated: "Escalado", - resolved: "Resuelto", - closed: "Cerrado" - } - }, - priority: { - label: "Prioridad", - options: { low: "Baja", medium: "Media", high: "Alta", critical: "Cr\xEDtica" } - }, - priority_rank: { label: "Rango de Prioridad" }, - type: { - label: "Tipo de Caso", - options: { - question: "Consulta", - problem: "Problema", - feature_request: "Solicitud de Funcionalidad", - bug: "Error" - } - }, - // `email` y `chat` se dejan como préstamos: son el término habitual en - // español de negocios y concuerdan con `crm_campaign.channel`. - origin: { - label: "Origen del Caso", - options: { email: "Email", phone: "Tel\xE9fono", web: "Web", chat: "Chat", social_media: "Redes Sociales" } - }, - owner_id: { label: "Propietario del Caso" }, - closed_date: { label: "Fecha de Cierre" }, - first_response_date: { label: "Fecha de Primera Respuesta" }, - resolution_time_hours: { label: "Tiempo de Resoluci\xF3n (Horas)" }, - sla_due_date: { label: "Fecha L\xEDmite SLA", help: "Se fija seg\xFAn la prioridad del caso y el Nivel de Cliente de la cuenta, en horas naturales: las noches, los fines de semana y los festivos cuentan." }, - is_sla_violated: { label: "SLA Incumplido" }, - is_escalated: { label: "Escalado" }, - escalated_date: { label: "Fecha de Escalaci\xF3n" }, - escalation_reason: { label: "Motivo de Escalaci\xF3n" }, - resolution: { label: "Resoluci\xF3n" }, - resolved_by_article: { label: "Resuelto por Art\xEDculo", help: "Art\xEDculo de la base de conocimiento que resolvi\xF3 este caso \u2014 la se\xF1al de desv\xEDo." }, - internal_notes: { label: "Notas Internas", help: "Notas internas no visibles para el cliente" }, - is_closed: { label: "Est\xE1 Cerrado" } - }, - _views: { - all_cases: { label: "Todos los Casos" }, - case_workflow: { label: "Flujo de Servicio" }, - sla_calendar: { label: "Calendario SLA" }, - case_timeline: { label: "L\xEDnea de Tiempo de Casos" }, - unassigned_triage: { - label: "Sin asignar \u2014 triaje", - emptyState: { - title: "Nada pendiente de triaje", - message: "Todos los casos tienen propietario. Los casos aparecen aqu\xED cuando llegan sin propietario \u2014 normalmente un env\xEDo web-a-caso recibido mientras nadie ocupaba el puesto de Agente de Servicio." - } - }, - escalated_cases: { label: "Casos Escalados" }, - my_open_cases: { label: "Mis Casos Abiertos" }, - sla_at_risk: { label: "\u23F0 SLA en Riesgo" } - }, - _sections: { - // Nombres de sección del formulario en case.view.ts (#1100). - case: { label: "Caso" }, - how_can_we_help: { label: "\xBFC\xF3mo podemos ayudarte?" }, - // Claves de sección del objeto (case.object.ts) que usan los - // formularios de registro y la página de detalle, cuyas secciones - // hacen referencia a estos grupos (#970). - basic: { label: "Informaci\xF3n del Caso" }, - origin: { label: "Origen y Asignaci\xF3n" }, - sla: { label: "SLA y Prioridad" }, - resolution: { label: "Resoluci\xF3n" }, - escalation: { label: "Escalaci\xF3n" }, - system: { label: "Sistema" } - }, - _actions: { - ...activityActions4, - escalate_case: { - label: "Escalar Caso", - confirmText: "Esto enviar\xE1 el caso al equipo de escalaci\xF3n. \xBFContinuar?", - successMessage: "\xA1Caso escalado con \xE9xito!" - }, - close_case: { - label: "Cerrar Caso", - confirmText: "\xBFEst\xE1 seguro de querer cerrar este caso?", - successMessage: "\xA1Caso cerrado con \xE9xito!" - }, - claim_case: { - label: "Tomar Caso", - successMessage: "Caso tomado: ahora es suyo." - } - } - }, - crm_knowledge_article: { - _validations: { - published_requires_body: { - message: "No se pueden publicar art\xEDculos sin cuerpo." - }, - published_requires_summary: { - message: "Los art\xEDculos publicados deben tener un resumen para los resultados de b\xFAsqueda y las citas de IA." - } - }, - label: "Art\xEDculo de Conocimiento", - pluralLabel: "Base de Conocimiento", - description: "Respuestas y gu\xEDas reutilizables para clientes y agentes", - fields: { - article_number: { label: "N.\xBA Art\xEDculo" }, - display_title: { label: "T\xEDtulo Mostrado" }, - title: { label: "T\xEDtulo" }, - summary: { label: "Resumen", help: "Resumen de un p\xE1rrafo que se muestra en los resultados de b\xFAsqueda y en las citas de la IA." }, - body: { label: "Contenido", help: "Contenido completo del art\xEDculo (Markdown)." }, - category: { - label: "Categor\xEDa", - options: { - getting_started: "Primeros pasos", - how_to: "C\xF3mo hacerlo", - troubleshooting: "Resoluci\xF3n de problemas", - billing: "Facturaci\xF3n", - api: "API e Integraciones", - release_notes: "Notas de versi\xF3n", - policy: "Pol\xEDticas" - } - }, - tags: { - label: "Etiquetas", - options: { - auth: "Autenticaci\xF3n", - sso: "SSO", - mobile: "M\xF3vil", - email: "Correo", - reports: "Informes", - performance: "Rendimiento", - data_import: "Importaci\xF3n de datos", - webhooks: "Webhooks" - } - }, - status: { - label: "Estado", - options: { draft: "Borrador", in_review: "En revisi\xF3n", published: "Publicado", archived: "Archivado" } - }, - audience: { - label: "Audiencia", - help: "Los art\xEDculos p\xFAblicos son visibles en el portal de clientes; los internos solo los ven los agentes.", - options: { public: "P\xFAblico", internal: "Interno" } - }, - language: { - label: "Idioma", - options: { en: "Ingl\xE9s", zh_cn: "Chino simplificado", es_es: "Espa\xF1ol", ja_jp: "Japon\xE9s" } - }, - owner_id: { label: "Propietario" }, - related_to_case: { label: "Caso de origen", help: "Caso a partir del cual se redact\xF3 este art\xEDculo (opcional)." }, - published_at: { label: "Publicado el" }, - last_reviewed_at: { label: "\xDAltima revisi\xF3n" }, - helpful_count: { label: "\xDAtil", help: "Recontado desde crm_article_feedback \u2014 nunca se escribe a mano." }, - not_helpful_count: { label: "No \xFAtil", help: "Recontado desde crm_article_feedback \u2014 nunca se escribe a mano." } - }, - _views: { - all_articles: { label: "Todos los art\xEDculos" }, - published_articles: { label: "Publicados" }, - my_drafts: { label: "Mis borradores" } - }, - _sections: { - basic: { label: "Informaci\xF3n del Art\xEDculo" }, - content: { label: "Contenido" }, - taxonomy: { label: "Categorizaci\xF3n" }, - metrics: { label: "Interacci\xF3n" }, - engagement: { label: "Interacci\xF3n" }, - // Nombre de sección del formulario en knowledge_article.view.ts (#1100) - article: { label: "Art\xEDculo" } - }, - _actions: { - mark_article_helpful: { - label: "\xDAtil", - successMessage: "Gracias \u2014 registrado como \xFAtil." - }, - mark_article_not_helpful: { - label: "No \xFAtil", - successMessage: "Gracias \u2014 registrado como no \xFAtil." - } - } - }, - crm_article_feedback: { - label: "Opini\xF3n sobre el Art\xEDculo", - pluralLabel: "Opiniones sobre Art\xEDculos", - description: "El veredicto \xFAtil / no \xFAtil de un lector sobre un art\xEDculo de la base de conocimiento", - fields: { - feedback_number: { label: "N.\xBA de Opini\xF3n" }, - owner_id: { label: "Lector" }, - crm_knowledge_article: { label: "Art\xEDculo", help: "Art\xEDculo de la base de conocimiento al que se refiere esta opini\xF3n." }, - verdict: { - label: "Veredicto", - options: { helpful: "\xDAtil", not_helpful: "No \xFAtil" } - }, - comment: { label: "Comentario", help: "Nota opcional que explica el veredicto \u2014 la lee el autor del art\xEDculo." } - }, - _sections: { - basic: { label: "Opini\xF3n" } - } - } -}; - -// src/sales/translations/es-ES/objects.activity.ts -var activity4 = { - crm_task: { - _validations: { - completed_date_required: { - message: "La fecha de finalizaci\xF3n es obligatoria cuando el estado es Completada" - }, - recurrence_fields_required: { - message: "El tipo de recurrencia es obligatorio para las tareas recurrentes" - }, - related_to_required: { - message: "Debe seleccionarse al menos un registro relacionado" - } - }, - label: "Tarea", - pluralLabel: "Tareas", - description: "Actividades y tareas pendientes", - fields: { - subject: { label: "Asunto" }, - description: { label: "Descripci\xF3n" }, - status: { - label: "Estado", - options: { - not_started: "No Iniciada", - in_progress: "En Curso", - waiting: "En Espera", - completed: "Completada", - deferred: "Aplazada" - } - }, - priority: { - label: "Prioridad", - options: { low: "Baja", normal: "Normal", high: "Alta", urgent: "Urgente" } - }, - priority_rank: { label: "Rango de Prioridad" }, - type: { - label: "Tipo de Tarea", - options: { - call: "Llamada", - email: "Email", - meeting: "Reuni\xF3n", - follow_up: "Seguimiento", - demo: "Demostraci\xF3n", - other: "Otro" - } - }, - due_date: { label: "Fecha L\xEDmite" }, - reminder_date: { label: "Fecha/Hora de Recordatorio" }, - reminder_sent: { label: "Recordatorio Enviado" }, - completed_date: { label: "Fecha de Finalizaci\xF3n" }, - owner_id: { label: "Asignado A" }, - // Los valores son nombres de objeto: se reutilizan las etiquetas ya - // traducidas de cada objeto en este mismo paquete (igual que - // `crm_event.related_to_type`). - related_to_type: { - label: "Tipo de Objeto Relacionado", - options: { - crm_account: "Cuenta", - crm_contact: "Contacto", - crm_opportunity: "Oportunidad", - crm_lead: "Prospecto", - crm_case: "Caso" - } - }, - related_to_account: { label: "Cuenta Relacionada" }, - related_to_contact: { label: "Contacto Relacionado" }, - related_to_opportunity: { label: "Oportunidad Relacionada" }, - related_to_lead: { label: "Prospecto Relacionado" }, - related_to_case: { label: "Caso Relacionado" }, - is_recurring: { label: "Tarea Recurrente" }, - recurrence_type: { - label: "Tipo de Recurrencia", - options: { daily: "Diaria", weekly: "Semanal", monthly: "Mensual", yearly: "Anual" } - }, - recurrence_interval: { label: "Intervalo de Recurrencia" }, - recurrence_end_date: { label: "Fecha Fin de Recurrencia" }, - is_completed: { label: "Est\xE1 Completado" }, - is_overdue: { label: "Est\xE1 Vencido" }, - progress_percent: { label: "Progreso (%)" } - }, - _views: { - all_tasks: { label: "Todas las Tareas" }, - task_board: { label: "Tablero de Tareas" }, - task_calendar: { label: "Calendario de Tareas" }, - task_gantt: { label: "Plan de Ejecuci\xF3n" }, - task_timeline: { label: "L\xEDnea de Tiempo" }, - my_open_tasks: { label: "Mis Tareas Abiertas" }, - todays_tasks: { label: "\u{1F4C5} Mis Tareas Prioritarias" }, - overdue_tasks: { label: "\u23F0 Tareas Abiertas \xB7 M\xE1s Vencidas Primero" } - }, - _sections: { - basic: { label: "Informaci\xF3n de la Tarea" }, - scheduling: { label: "Programaci\xF3n" }, - related: { label: "Registros Relacionados" }, - recurrence: { label: "Recurrencia" }, - effort: { label: "Progreso y Esfuerzo" }, - system: { label: "Sistema" }, - // Nombres de sección del formulario en task.view.ts (#1100) - task: { label: "Tarea" }, - related_records: { label: "Registros Relacionados" }, - recurrence_and_effort: { label: "Recurrencia y Esfuerzo" } - } - }, - crm_event: { - _validations: { - end_after_start: { - message: "La hora de fin debe ser posterior a la de inicio" - }, - related_to_required: { - message: "Debe seleccionarse al menos un registro relacionado" - } - }, - label: "Evento", - pluralLabel: "Eventos", - description: "Reuniones, llamadas y otras interacciones programadas con clientes", - fields: { - subject: { label: "Asunto" }, - description: { label: "Descripci\xF3n" }, - type: { - label: "Tipo de evento", - options: { - meeting: "Reuni\xF3n", - call: "Llamada", - demo: "Demostraci\xF3n", - webinar: "Seminario web", - onsite_visit: "Visita presencial", - other: "Otro" - } - }, - status: { - label: "Estado", - options: { - planned: "Planificado", - held: "Realizado", - cancelled: "Cancelado", - no_show: "No asisti\xF3" - } - }, - owner_id: { label: "Asignado a" }, - start_datetime: { label: "Inicio" }, - end_datetime: { label: "Fin" }, - all_day: { label: "Evento de todo el d\xEDa" }, - duration_minutes: { label: "Duraci\xF3n (minutos)" }, - location: { label: "Ubicaci\xF3n", help: "Sala, direcci\xF3n o enlace de la reuni\xF3n" }, - related_to_type: { - label: "Tipo de registro relacionado", - options: { - crm_account: "Cuenta", - crm_contact: "Contacto", - crm_opportunity: "Oportunidad", - crm_lead: "Prospecto", - crm_case: "Caso" - } - }, - related_to_account: { label: "Cuenta relacionada" }, - related_to_contact: { label: "Contacto relacionado" }, - related_to_opportunity: { label: "Oportunidad relacionada" }, - related_to_lead: { label: "Prospecto relacionado" }, - related_to_case: { label: "Caso relacionado" }, - outcome_notes: { label: "Notas de resultado", help: "Qu\xE9 se acord\xF3 y qu\xE9 sigue" } - }, - _views: { - all_events: { label: "Todos los eventos" }, - event_calendar: { label: "Calendario de eventos" }, - event_timeline: { label: "Agenda del equipo" }, - my_events: { label: "Mi calendario" }, - upcoming_events: { label: "\u{1F4C5} Pr\xF3ximos \xB7 M\xE1s cercanos primero" }, - held_events: { label: "\u2705 Historial de interacciones" } - }, - _sections: { - basic: { label: "Informaci\xF3n del Evento" }, - schedule: { label: "Programaci\xF3n" }, - related: { label: "Registros Relacionados" }, - outcome: { label: "Resultado" }, - // Nombres de sección del formulario en event.view.ts (#1100) - event: { label: "Evento" }, - related_records: { label: "Registros Relacionados" } - } - }, - crm_event_attendee: { - _validations: { - attendee_resolves: { - message: "Un asistente debe indicar la parte que nombra su tipo: el tipo Contacto requiere un contacto y el tipo Externo requiere un nombre de asistente externo" - }, - attendee_type_exclusive: { - message: "Un asistente nombra exactamente una parte: borre las columnas que su tipo de asistente no nombra" - } - }, - label: "Asistente al evento", - pluralLabel: "Asistentes al evento", - description: "Persona invitada o presente en un evento", - fields: { - attendee_number: { label: "N\xFAmero de asistente" }, - crm_event: { label: "Evento" }, - attendee_type: { - label: "Tipo de asistente", - options: { contact: "Contacto", lead: "Prospecto", user: "Usuario", external: "Externo" } - }, - crm_contact: { label: "Contacto", help: "Se rellena cuando el asistente es un contacto de cliente ya existente" }, - crm_lead: { label: "Prospecto", help: "Se rellena cuando el asistente sigue siendo un prospecto sin convertir" }, - sys_user: { label: "Usuario", help: "Se rellena cuando el asistente es un compa\xF1ero de la empresa" }, - external_name: { label: "Asistente externo", help: "Nombre de un asistente que no est\xE1 en ning\xFAn objeto del CRM: se rellena cuando el tipo de asistente es Externo" }, - response: { - label: "Respuesta", - options: { - no_response: "Sin respuesta", - accepted: "Aceptado", - declined: "Rechazado", - tentative: "Tentativo" - } - }, - is_organizer: { label: "Organizador" }, - invited_date: { label: "Invitado el" } - }, - _views: { - all_event_attendees: { label: "Asistentes al evento" } - }, - _sections: { - // El inglés es «Attendee» / «Invitation», no el par - // «Basic Information» / «Response Tracking» de crm_campaign_member. - basic: { label: "Asistente" }, - response: { label: "Invitaci\xF3n" }, - // Nombres de sección del formulario en event_attendee.view.ts (#1100) - attendee: { label: "Asistente" }, - invitation: { label: "Invitaci\xF3n" } - } - } -}; - -// src/sales/translations/es-ES/objects.marketing.ts -var marketing4 = { - crm_campaign: { - _validations: { - end_after_start: { - message: "La fecha de fin debe ser posterior a la de inicio" - }, - actual_cost_within_budget: { - message: "El coste real supera el coste presupuestado" - } - }, - label: "Campa\xF1a", - pluralLabel: "Campa\xF1as", - description: "Campa\xF1as e iniciativas de marketing", - fields: { - campaign_code: { label: "C\xF3digo de Campa\xF1a" }, - display_title: { label: "T\xEDtulo Mostrado" }, - name: { label: "Nombre de Campa\xF1a" }, - description: { label: "Descripci\xF3n" }, - type: { - label: "Tipo de Campa\xF1a", - options: { - email: "Email", - webinar: "Seminario Web", - trade_show: "Feria Comercial", - conference: "Conferencia", - direct_mail: "Correo Postal", - social_media: "Redes Sociales", - content: "Marketing de Contenidos", - partner: "Marketing con Socios" - } - }, - channel: { - label: "Canal Principal", - options: { - digital: "Digital", - social: "Redes Sociales", - email: "Email", - events: "Eventos", - partner: "Socios" - } - }, - status: { - label: "Estado", - options: { - planning: "Planificaci\xF3n", - in_progress: "En Curso", - completed: "Completada", - aborted: "Cancelada" - } - }, - start_date: { label: "Fecha de Inicio" }, - end_date: { label: "Fecha de Fin" }, - budgeted_cost: { label: "Costo Presupuestado" }, - actual_cost: { label: "Costo Real" }, - expected_revenue: { label: "Ingresos Previstos" }, - actual_revenue: { label: "Ingresos Reales" }, - target_size: { label: "Tama\xF1o Objetivo", help: "N\xFAmero objetivo de prospectos/contactos" }, - num_sent: { label: "Cantidad Enviada" }, - num_responses: { label: "N\xFAmero de Respuestas" }, - num_leads: { label: "N\xFAmero de Prospectos" }, - num_converted_leads: { label: "Prospectos Convertidos" }, - num_opportunities: { label: "Oportunidades Creadas" }, - num_won_opportunities: { label: "Oportunidades Ganadas" }, - response_rate: { label: "Tasa de Respuesta %" }, - roi: { label: "ROI %" }, - owner_id: { label: "Propietario de Campa\xF1a" }, - landing_page_url: { label: "P\xE1gina de Aterrizaje" }, - is_active: { label: "Activo" } - }, - _views: { - all_campaigns: { label: "Todas las Campa\xF1as" }, - campaign_gantt: { label: "Programaci\xF3n de Campa\xF1as" }, - campaign_calendar: { label: "Calendario de Campa\xF1as" }, - campaign_timeline: { label: "L\xEDnea de Tiempo de Marketing" } - }, - _sections: { - basic: { label: "Informaci\xF3n de Campa\xF1a" }, - schedule: { label: "Programaci\xF3n" }, - budget: { label: "Presupuesto y ROI" }, - metrics: { label: "Rendimiento" }, - // El inglés de este grupo es «Ownership», no «Assignment»: agrupa al - // propietario de la campaña, igual que `crm_account.ownership`. - assignment: { label: "Propiedad" }, - assets: { label: "Recursos de Campa\xF1a" } - }, - _actions: { - enroll_leads: { - label: "Inscribir Miembros", - successMessage: "Miembros elegibles inscritos en la campa\xF1a." - } - } - }, - crm_campaign_member: { - _validations: { - lead_or_contact_required: { - message: "Un miembro de campa\xF1a debe referenciar un prospecto o un contacto" - } - }, - label: "Miembro de Campa\xF1a", - pluralLabel: "Miembros de Campa\xF1a", - description: "Prospectos y contactos alcanzados por una campa\xF1a, con su estado de respuesta", - fields: { - member_number: { label: "N\xFAmero de Miembro" }, - crm_campaign: { label: "Campa\xF1a" }, - crm_lead: { label: "Prospecto", help: "Se rellena cuando el miembro era un Prospecto en el momento de la inscripci\xF3n" }, - crm_contact: { label: "Contacto", help: "Se rellena cuando el miembro es un Contacto existente" }, - status: { - label: "Estado", - options: { - sent: "Enviado", - responded: "Respondido", - converted: "Convertido", - unsubscribed: "Dado de Baja" - } - }, - added_date: { label: "Fecha de Alta" }, - response_date: { label: "Fecha de Respuesta" }, - has_responded: { label: "Ha Respondido" } - }, - _sections: { - basic: { label: "Informaci\xF3n B\xE1sica" }, - response: { label: "Seguimiento de Respuesta" } - }, - _actions: { - mark_responded: { - label: "Marcar como Respondido", - successMessage: "Respuesta registrada en este miembro de campa\xF1a." - } - } - } -}; - -// src/sales/translations/es-ES.ts -var esES2 = { - objects: { - crm_account: customer4.crm_account, - crm_contact: customer4.crm_contact, - crm_knowledge_article: service4.crm_knowledge_article, - crm_forecast: pipeline4.crm_forecast, - crm_lead: pipeline4.crm_lead, - crm_opportunity: pipeline4.crm_opportunity, - crm_case: service4.crm_case, - crm_contract: commerce4.crm_contract, - crm_product: commerce4.crm_product, - crm_quote: commerce4.crm_quote, - crm_task: activity4.crm_task, - crm_campaign: marketing4.crm_campaign, - crm_event: activity4.crm_event, - crm_event_attendee: activity4.crm_event_attendee, - crm_article_feedback: service4.crm_article_feedback, - crm_campaign_member: marketing4.crm_campaign_member, - crm_opportunity_line_item: pipeline4.crm_opportunity_line_item, - crm_quote_line_item: commerce4.crm_quote_line_item - }, - ...appSurface4 -}; - -// src/sales/translations/crm.translation.ts -var CrmTranslations = { - en: en2, - "zh-CN": zhCN2, - "ja-JP": jaJP2, - "es-ES": esES2 -}; - -// src/sales/views/index.ts -var views_exports = {}; -__export(views_exports, { - AccountViews: () => AccountViews, - ContactViews: () => ContactViews, - EventAttendeeViews: () => EventAttendeeViews, - EventViews: () => EventViews, - ForecastViews: () => ForecastViews, - LeadViews: () => LeadViews, - OpportunityViews: () => OpportunityViews, - TaskViews: () => TaskViews -}); - -// src/sales/views/lead.view.ts -import { P as P24 } from "@objectstack/spec"; -import { defineView as defineView3 } from "@objectstack/spec/ui"; -var DUPLICATE_LINK_FIELDS = [ - { - field: "duplicate_of_type", - required: true, - // The picker offers the AUTHORABLE half of the vocabulary only (#1164). - // `crm_lead.duplicate_of_type` also accepts `erased`, a tombstone - // `lead_duplicate_check` stamps when the engine's reference cleanup nulls - // the pointer — "confirmed duplicate of a record that has since been - // erased". Nobody authors that: it is an observation about a deletion that - // already happened, and offering it would let a reviewer close a lead as a - // duplicate of nothing while satisfying every rule that exists to stop - // exactly that. Narrowing here rather than deleting the value is the point - // — the record can still SAY it, and the field keeps its label in all four - // locales, so a tombstoned lead reads as "Erased Record" on the detail page - // instead of as a raw enum nobody can explain. - // - // Spread from `_picklists.ts` rather than retyped: the authorable set is - // the source both lists derive from, so a future object type added there - // reaches this picker automatically and the tombstone never can. - options: [...DUPLICATE_OF_TYPE_AUTHORABLE_OPTIONS], - visibleOn: P24`has(record.disqualification_reason) && record.disqualification_reason == "duplicate"` - }, - { - field: "duplicate_of_lead", - required: true, - visibleOn: P24`has(record.duplicate_of_type) && record.duplicate_of_type == "crm_lead"` - }, - { - field: "duplicate_of_contact", - required: true, - visibleOn: P24`has(record.duplicate_of_type) && record.duplicate_of_type == "crm_contact"` - }, - { - field: "duplicate_status", - required: true, - visibleOn: P24`has(record.disqualification_reason) && record.disqualification_reason == "duplicate"`, - helpText: "Confirmed means a human checked the two records and they are the same person." - } -]; -var LeadViews = defineView3({ - /** - * Default List View - Grid with Advanced Features - */ - list: { - type: "grid", - name: "all_leads", - label: "All Leads", - userActions: { editInline: true }, - data: { - provider: "object", - object: "crm_lead" - }, - // Column Configuration with Enhanced Features - columns: [ - { - // One name column, not two. Splitting first/last spent 300px to say - // what "Alice Martinez" says in one, and hung the record link off the - // given name alone — so opening a person meant aiming at their first - // name specifically. - field: "full_name", - label: "Name", - width: 200, - sortable: true, - link: true - // Primary navigation link - }, - { - field: "company", - label: "Company", - width: 200, - sortable: true - }, - { - field: "email", - label: "Email", - width: 200 - }, - { - field: "status", - label: "Status", - width: 120, - sortable: true - }, - { - field: "rating", - label: "Score", - width: 100, - align: "center" - }, - { - field: "lead_source", - label: "Source", - width: 120 - }, - // REQ-0005 acceptance 1: what the prospect wants and what it is worth, - // on the roster a rep opens every morning. Columns are also what the - // list's own filter and grouping controls offer, which is what makes the - // two FILTERABLE and GROUPABLE here rather than only readable — the same - // reading `contact.view.ts` records for the buying-centre columns. - // `need_type` is single-valued for exactly that reason (see - // `_picklists.ts`): a grouped list answers with one aggregate per raw - // stored value, so a multi-valued column would group by the combination. - { - field: "need_type", - label: "Need Type", - width: 160, - sortable: true - }, - { - field: "estimated_amount", - label: "Est. Amount", - width: 130, - align: "right", - sortable: true - }, - { - field: "owner_id", - label: "Owner", - width: 150 - } - ], - sort: [ - { field: "created_at", order: "desc" } - ], - // A row click opens the record page. There is deliberately no - // `navigation.view` here: measured in the browser on console 17.3.0 - // (#1716), the key is not resolved as a form-view name. The navigation - // hook reads it into the SECOND argument of `onNavigate` — the slot that - // otherwise carries the literal mode string, `r(t, d ?? 'view')` — so it - // named nothing and selected nothing. The record page here is rendered by - // `lead_detail_page` (`src/sales/pages/lead_detail.page.ts`), not by a named - // form view, and clicking a row behaved identically with the key present, - // with it absent, and on a list that never declared it. `detail_form` - // below stays: it is this file's one TABBED layout example, and it was - // already reachable by no path. - navigation: { - mode: "page" - }, - // `convert_lead` / `schedule_followup` declare `locations: ['list_item']` - // and are auto-injected into the menu. Do not add strings here: the legacy - // rowActions surface only dispatches defined stack actions. - // Built-in `exportOptions` covers CSV export; no export action needed. - bulkActions: ["create_campaign"], - // Features - pagination: { pageSize: 25, pageSizeOptions: [10, 25, 50, 100] }, - rowHeight: "medium", - exportOptions: { formats: ["csv", "xlsx"] }, - // Empty State - emptyState: { - title: "No Leads Yet", - message: "Get started by creating your first lead", - icon: "user-plus" - } - }, - /** - * Default Form View - SIMPLE Layout - * Basic sectioned form with collapsible sections and column layouts - */ - form: { - type: "simple", - sections: [ - { - name: "contact_information", - label: "Contact Information", - collapsible: true, - collapsed: false, - columns: 2, - // 2-column layout - fields: [ - { - field: "salutation" - }, - { - field: "first_name", - required: true - }, - { - field: "last_name", - required: true, - span: "full" - }, - "company", - "title", - "email", - "phone", - "mobile", - "website" - ] - }, - { - name: "lead_classification", - label: "Lead Classification", - collapsible: true, - collapsed: false, - columns: 3, - // 3-column layout - fields: [ - { - field: "status", - required: true - }, - { - field: "rating", - widget: "star_rating" - // Custom widget - }, - "lead_source", - "industry", - // Offered, ⛔ not `required` (#2097): an insert that leaves it empty is - // stamped to the creator by the platform (see `lead.hook.ts`), so a - // rep's new lead is theirs without a pick, and a manager can still - // choose another owner. `required` blocked that save client-side. - "owner_id", - // `disqualification_reason` is enforced by the - // `disqualification_reason_required` validation on crm_lead, so every - // form that lets a user pick "Unqualified" must also offer the reason - // — otherwise the save fails with an error the form gives you no way - // to clear. Hidden until it applies. - { - field: "disqualification_reason", - required: true, - visibleOn: P24`has(record.status) && record.status == "unqualified"` - }, - // REQ-0005 step 6: 「填写…需求类型…预计金额」. A rep types these at - // intake, so they need an authoring surface — and this form IS the - // create dialog (`RecordFormPage` and `useActionModal` both resolve - // `view.form ?? view.formViews?.default`, see `case.view.ts`). - // - // ⚠️ Named rather than reached through a group reference, and the - // AGENTS.md ladder's rung 3 asks for the reason in writing. Both - // fields declare `group: 'qualification'` on the object, so every - // DERIVED surface — the page synthesizer, an auto-derived form — - // already carries them from `fieldGroups` alone with nothing authored. - // This form is not one of those: it authors `sections`, and an - // authored `sections` array wins outright over the auto-derived path. - // The rung-2 fix, a `{ group: 'qualification' }` section, cannot be - // used HERE specifically: this section is a CURATED cross-group set, - // not a mirror of that group. It already names four of the group's - // members with per-field overrides a group reference cannot carry - // (`status` required, `rating`'s star widget, and - // `disqualification_reason`'s `required` + `visibleOn` directly - // above), and it borrows `industry` and `owner_id` from two other - // groups. Adding a group reference beside it would render those four - // a second time and pull in `next_followup_date` / - // `last_contacted_date`, which are machine-written and deliberately - // absent from every form. ⇒ The customer need is real, the group - // reference genuinely cannot express it, and the two lines below are - // what that leaves. - "need_type", - "estimated_amount", - ...DUPLICATE_LINK_FIELDS - ] - }, - { - name: "company_information", - label: "Company Information", - collapsible: true, - collapsed: true, - // Collapsed by default - columns: 2, - fields: [ - "annual_revenue", - "number_of_employees" - ] - }, - { - name: "address", - label: "Address", - collapsible: true, - collapsed: true, - columns: 2, - // `crm_lead` stores the location in one composite `Field.address`; - // the discrete street/city/state/postal_code/country columns this - // section used to list do not exist on the object, so the whole - // section rendered blank. - fields: [ - { - field: "address", - span: "full" - } - ] - }, - { - name: "additional_information", - label: "Additional Information", - collapsible: true, - collapsed: true, - columns: 1, - // Single column for text areas - fields: [ - "description", - "notes" - ] - }, - { - name: "privacy", - label: "Privacy", - collapsible: true, - collapsed: true, - columns: 2, - fields: [ - "do_not_call", - "email_opt_out" - ] - } - ] - }, - /** - * Additional Named List Views - */ - listViews: { - // Declaration order IS tab order in the console. These three working - // queues used to sit AFTER the kanban / calendar / gallery views, which - // pushed all of them into the "3 more" overflow menu — so the one screen - // a rep opens this list for was the one they had to go hunting for, while - // three presentation modes held the front row. - /** - * My Leads — a rep's own queue, hottest first. - */ - my_leads: { - name: "my_leads", - type: "grid", - label: "My Leads", - userActions: { editInline: true }, - data: { - provider: "object", - object: "crm_lead" - }, - columns: ["full_name", "company", "email", "status", "rating"], - filter: [ - { field: "owner_id", operator: "equals", value: "{current_user_id}" } - ], - sort: [ - { field: "rating", order: "desc" }, - { field: "created_at", order: "desc" } - ] - }, - /** - * Hot Leads — the working queue for the leads routing declared HOT. - * - * "Hot" is defined in exactly ONE place: the `lead_assignment` flow's - * `check_hot` decision (edge `e2`, `record.rating >= 4`). Crossing that - * line is what stamps the 1-day follow-up SLA and fires the "Hot lead — - * assign within 24h" alert at the owner, so this queue must hold precisely - * the leads that alert is about. (An earlier comment here credited a - * flagging workflow that has never existed in this repo — dead name - * removed, the routing flow is the producer.) - * - * The cut was `rating >= 4.5` (#766). `rating` is a WHOLE-star field — - * `lead.hook.ts` rounds its computed score ("round to WHOLE stars"), the - * `star_rating` widget offers nothing finer, and the one seeded 4.5 was - * deleted for the same reason (#591) — so `>= 4.5` meant `== 5` on every - * row that can actually exist. A 4-star lead was routed hot, alerted on, - * and then missing from the queue its owner was sent to. - * - * Sharing the population with "High Priority" is the deliberate cost of - * having one definition of hot, not an oversight: both views now show - * rating >= 4, still New or Contacted. What differs is what they are FOR. - * Hot Leads is the work order — sorted by next-follow-up (the SLA that - * routing just stamped), with phone, email and owner on the row so it can - * be dialled top to bottom. High Priority is the scan list — score-tinted - * rows and lead source, no SLA column, no time ordering. A 5-star-only - * queue, if it is ever a real need, gets its own view under its own name - * instead of squatting on "Hot". - * - * `test/hot-lead-threshold-parity.test.ts` derives this threshold and the - * flow's from the metadata and fails if they drift apart again. - */ - hot_leads: { - name: "hot_leads", - type: "grid", - label: "\u{1F525} Hot Leads", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_lead" }, - columns: ["full_name", "company", "phone", "email", "rating", "next_followup_date", "owner_id"], - // Same rating cut as the `lead_assignment` hot branch, scoped to the - // statuses still worth working. (Operator-only filters; the view runtime - // does not resolve date template strings.) - filter: [ - { field: "rating", operator: "greater_than_or_equal", value: 4 }, - { field: "status", operator: "in", value: ["new", "contacted"] } - ], - sort: [{ field: "next_followup_date", order: "asc" }] - }, - /** - * High Priority Leads - */ - high_priority: { - name: "high_priority", - type: "grid", - label: "High Priority", - userActions: { editInline: true }, - data: { - provider: "object", - object: "crm_lead" - }, - columns: ["full_name", "company", "email", "status", "rating", "lead_source"], - filter: [ - { field: "rating", operator: "greater_than_or_equal", value: 4 }, - { field: "status", operator: "in", value: ["new", "contacted"] } - ], - rowColor: { - field: "rating", - colors: { - "5": "green", - "4": "orange" - } - } - }, - /** - * Suspected Duplicates — the review queue behind the intake flag (#598). - * - * `lead_duplicate_check` marks a re-captured email `suspected` and links it - * to the record it repeats. Without a place to SEE that set, the flag would - * be a column nobody reads: the reviewer opens this queue, compares the two - * records, and either clears the flag or disqualifies the lead as a - * confirmed duplicate. `confirmed` rows drop out of the queue, so it drains. - */ - suspected_duplicates: { - name: "suspected_duplicates", - type: "grid", - label: "Suspected Duplicates", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_lead" }, - columns: [ - "full_name", - "company", - "email", - "duplicate_of_type", - "duplicate_of_lead", - "duplicate_of_contact", - "status", - "owner_id" - ], - filter: [ - { field: "duplicate_status", operator: "equals", value: "suspected" } - ], - // Oldest suspicion first: an unreviewed duplicate is a second rep working - // the same person, so the queue is worked front to back. - sort: [{ field: "created_at", order: "asc" }], - emptyState: { - title: "No Suspected Duplicates", - message: "Nothing to review \u2014 every re-captured email has been checked.", - icon: "copy" - } - }, - /** - * Kanban Board View - */ - kanban_by_status: { - name: "kanban_by_status", - type: "kanban", - label: "Lead Pipeline", - data: { - provider: "object", - object: "crm_lead" - }, - columns: ["first_name", "last_name", "company", "email"], - kanban: { - groupByField: "status", - summarizeField: "annual_revenue", - columns: ["first_name", "last_name", "company", "rating"] - }, - navigation: { - mode: "drawer", - // Open in drawer instead of new page - width: "600px" - } - }, - /** - * Calendar View - */ - calendar_by_created: { - name: "calendar_by_created", - type: "calendar", - label: "Lead Calendar", - data: { - provider: "object", - object: "crm_lead" - }, - columns: ["first_name", "last_name", "company"], - calendar: { - startDateField: "created_at", - titleField: "company", - colorField: "status" - } - }, - /** - * Gallery/Card View - */ - gallery_view: { - name: "gallery_view", - type: "gallery", - label: "Lead Cards", - data: { - provider: "object", - object: "crm_lead" - }, - columns: ["first_name", "last_name", "company", "email", "status"], - gallery: { - cardSize: "medium", - titleField: "company", - visibleFields: ["first_name", "last_name", "email", "phone", "status", "rating"] - } - } - }, - /** - * Additional Named Form Views - Demonstrating All 6 Layout Types - * - * One example per layout type. The SIMPLE one is the default `form` - * above, so this block carries the other five, plus the public and the - * conditional-visibility examples. Every layout is demonstrated exactly - * once across the file: each entry below is the only example of its own. - */ - formViews: { - /** - * 2. TABBED Layout - * Organize complex forms with tabs - */ - detail_form: { - type: "tabbed", - sections: [ - { - name: "general", - label: "General", - columns: 2, - fields: [ - "salutation", - "first_name", - "last_name", - "company", - "title", - "email", - "phone", - "mobile" - ] - }, - { - name: "qualification", - label: "Qualification", - columns: 2, - fields: [ - { field: "status", required: true }, - { field: "rating", widget: "star_rating" }, - "lead_source", - "industry", - "annual_revenue", - "number_of_employees", - // See the default form: `unqualified` requires a reason. - { - field: "disqualification_reason", - required: true, - visibleOn: P24`has(record.status) && record.status == "unqualified"` - }, - ...DUPLICATE_LINK_FIELDS - ] - }, - { - name: "address", - label: "Address", - columns: 2, - // Single composite `Field.address` — see the note on the default - // form's Address section. - fields: [ - { field: "address", span: "full" } - ] - }, - { - name: "details", - label: "Details", - columns: 1, - fields: [ - "description", - "notes", - "do_not_call", - "email_opt_out" - ] - } - ] - }, - /** - * 3. WIZARD Layout - * Step-by-step guided process - */ - lead_conversion_wizard: { - type: "wizard", - data: { - provider: "object", - object: "crm_lead" - }, - sections: [ - { - name: "step_1_contact_details", - label: "Step 1: Contact Details", - columns: 2, - fields: [ - { field: "first_name", required: true, readonly: true }, - { field: "last_name", required: true, readonly: true }, - { field: "email", readonly: true, span: "full" }, - "phone", - "mobile" - ] - }, - { - name: "step_2_company_information", - label: "Step 2: Company Information", - columns: 2, - fields: [ - { field: "company", required: true, readonly: true }, - "title", - "industry", - "annual_revenue", - "number_of_employees", - "website" - ] - }, - { - name: "step_3_qualification", - label: "Step 3: Qualification", - columns: 2, - fields: [ - { field: "status", required: true }, - // See the default form: `unqualified` requires a reason. The status - // is editable in this step, so the wizard can land there too. - { - field: "disqualification_reason", - required: true, - visibleOn: P24`has(record.status) && record.status == "unqualified"` - }, - ...DUPLICATE_LINK_FIELDS, - { field: "rating", widget: "star_rating" }, - "lead_source", - { - field: "owner_id", - // Conditional visibility. `!= null` on top of `has(...)`: strict - // CEL aborts on `dyn < int`, which `has()` alone allows. - visibleOn: P24`has(record.rating) && record.rating != null && record.rating >= 4` - } - ] - }, - { - name: "step_4_review_and_convert", - label: "Step 4: Review & Convert", - columns: 1, - fields: [ - { - field: "description", - helpText: "Review all information before converting to Account and Contact" - } - ] - } - ] - }, - /** - * 4. SPLIT Layout - * Master-detail split view - */ - split_edit: { - type: "split", - data: { - provider: "object", - object: "crm_lead" - }, - sections: [ - { - name: "primary_information", - label: "Primary Information", - columns: 1, - fields: [ - "first_name", - "last_name", - "company", - "email", - { field: "status", required: true }, - "owner_id", - // See the default form: `unqualified` requires a reason. - { - field: "disqualification_reason", - required: true, - visibleOn: P24`has(record.status) && record.status == "unqualified"` - }, - ...DUPLICATE_LINK_FIELDS - ] - }, - { - name: "extended_details", - label: "Extended Details", - columns: 2, - fields: [ - "phone", - "mobile", - "title", - "industry", - "lead_source", - { field: "rating", widget: "star_rating" }, - "annual_revenue", - "number_of_employees" - ] - } - ] - }, - /** - * 5. DRAWER Layout - * Side panel form (typically opened from list view) - */ - quick_edit_drawer: { - type: "drawer", - data: { - provider: "object", - object: "crm_lead" - }, - sections: [ - { - name: "quick_edit", - label: "Quick Edit", - columns: 1, - // Drawers typically use single column - fields: [ - { field: "first_name", required: true }, - { field: "last_name", required: true }, - "company", - "email", - "phone", - { field: "status", required: true }, - { field: "rating", widget: "star_rating" }, - "lead_source", - { - field: "owner_id", - // Only show owner after initial contact. A record with no status - // yet has not been contacted, so `!isBlank` keeps the blank case - // on the "hidden" side rather than letting `null != "new"` show it. - visibleOn: P24`has(record.status) && !isBlank(record.status) && record.status != "new"` - }, - // See the default form: `unqualified` requires a reason. - { - field: "disqualification_reason", - required: true, - visibleOn: P24`has(record.status) && record.status == "unqualified"` - }, - ...DUPLICATE_LINK_FIELDS - ] - } - ] - }, - /** - * 6. MODAL Layout - * Dialog-based form for quick actions - */ - status_update_modal: { - type: "modal", - data: { - provider: "object", - object: "crm_lead" - }, - sections: [ - { - name: "update_lead_status", - label: "Update Lead Status", - columns: 1, - fields: [ - { field: "first_name", readonly: true }, - { field: "last_name", readonly: true }, - { field: "company", readonly: true }, - { - field: "status", - required: true, - helpText: "Select the new status for this lead" - }, - { - field: "rating", - widget: "star_rating", - // Only show rating for qualified leads - visibleOn: P24`has(record.status) && record.status == "qualified"` - }, - // The reason picklist, not just free-text notes: it is what the - // `disqualification_reason_required` validation checks, and this - // modal is the main place a rep flips a lead to Unqualified. - { - field: "disqualification_reason", - required: true, - visibleOn: P24`has(record.status) && record.status == "unqualified"` - }, - ...DUPLICATE_LINK_FIELDS, - { - field: "notes", - placeholder: "Add notes about this status change", - // Free-text context alongside the reason - visibleOn: P24`has(record.status) && record.status == "unqualified"` - } - ] - } - ] - }, - /** - * 7. PUBLIC / ANONYMOUS — "Web-to-Lead" - * - * Airtable-style public form hosted at `/forms/contact-us`. Embeddable - * via iframe on a marketing site. Guests can ONLY submit (insert) — the - * `guest_portal` profile denies read/edit/delete on `crm_lead`. - * - * Fields not on the form (status, lead_source, owner_id, rating) are stamped - * by the `lead_automation` hook in `lead.hook.ts` after a guest submission. - */ - web_to_lead: { - type: "simple", - data: { - provider: "object", - object: "crm_lead" - }, - sections: [ - { - name: "tell_us_about_yourself", - label: "Tell us about yourself", - columns: 2, - fields: [ - { field: "first_name", required: true }, - { field: "last_name", required: true }, - { field: "email", required: true, span: "full" }, - "phone", - "title" - ] - }, - { - name: "about_your_company", - label: "About your company", - columns: 2, - fields: [ - { field: "company", required: true, span: "full" }, - "website", - "industry", - "number_of_employees", - "annual_revenue" - ] - }, - { - name: "how_can_we_help", - label: "How can we help?", - columns: 1, - fields: [ - { - field: "description", - required: true, - placeholder: "Briefly describe what you are looking for...", - helpText: "A sales representative will get back to you within one business day." - } - ] - } - ], - sharing: { - enabled: true, - allowAnonymous: true, - publicLink: "/forms/contact-us" - } - }, - /** - * Advanced Example: Conditional Field Visibility & Dependencies - */ - advanced_conditional: { - type: "simple", - data: { - provider: "object", - object: "crm_lead" - }, - sections: [ - { - name: "lead_information", - label: "Lead Information", - columns: 2, - fields: [ - "first_name", - "last_name", - "company", - "email", - "status", - "lead_source", - { - field: "rating", - widget: "star_rating", - // Only show after first contact — see the drawer form's note on - // why blank stays on the "hidden" side. - visibleOn: P24`has(record.status) && !isBlank(record.status) && record.status != "new"` - }, - { - field: "industry", - dependsOn: "company" - // Industry options depend on company - }, - { - field: "annual_revenue", - // Only for qualified leads - visibleOn: P24`has(record.rating) && record.rating != null && record.rating >= 3` - }, - { - field: "number_of_employees", - visibleOn: P24`has(record.rating) && record.rating != null && record.rating >= 3` - }, - { - field: "owner_id", - required: true, - visibleOn: P24`has(record.status) && (record.status == "contacted" || record.status == "qualified")` - }, - // See the default form: `unqualified` requires a reason. - { - field: "disqualification_reason", - required: true, - visibleOn: P24`has(record.status) && record.status == "unqualified"` - }, - ...DUPLICATE_LINK_FIELDS, - { - field: "notes", - span: "full", - required: true, - // Require explanation for unqualified - visibleOn: P24`has(record.status) && record.status == "unqualified"` - } - ] - }, - { - name: "address_information", - label: "Address Information", - collapsible: true, - collapsed: true, - columns: 2, - // Single composite `Field.address` — the discrete street/city/state/ - // postal_code/country columns do not exist on crm_lead. - fields: [ - { field: "address", span: "full" } - ] - }, - { - name: "privacy_preferences", - label: "Privacy Preferences", - collapsible: true, - collapsed: true, - columns: 2, - fields: [ - { - field: "do_not_call", - helpText: "Check if this lead has requested not to be called" - }, - { - field: "email_opt_out", - helpText: "Check if this lead has opted out of email communications" - } - ] - } - ] - } - } -}); - -// src/sales/views/account.view.ts -import { defineView as defineView4 } from "@objectstack/spec/ui"; -var AccountViews = defineView4({ - list: { - type: "grid", - name: "all_accounts", - label: "All Accounts", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_account" }, - columns: [ - { field: "name", width: 240, sortable: true, link: true, pinned: "left" }, - { field: "industry", width: 140, sortable: true }, - { field: "type", width: 130 }, - { field: "annual_revenue", width: 160, align: "right", summary: "sum" }, - { field: "number_of_employees", width: 130, align: "right", summary: "avg" }, - { field: "health_score", width: 140 } - ], - sort: [{ field: "annual_revenue", order: "desc" }], - rowColor: { field: "is_active", colors: { true: "green", false: "slate" } }, - selection: { type: "multiple" }, - pagination: { pageSize: 50, pageSizeOptions: [25, 50, 100] }, - exportOptions: { formats: ["csv", "xlsx"] }, - compactToolbar: true, - bulkActionDefs: [ - { - name: "update_tier", - label: "Update Tier", - icon: "tag", - operation: "update", - params: [ - { - name: "tier", - label: "Customer Tier", - type: "select", - required: true, - options: [ - { label: "Strategic", value: "strategic" }, - { label: "Enterprise", value: "enterprise" }, - { label: "Mid-Market", value: "mid_market" }, - { label: "SMB", value: "smb" } - ] - } - ], - confirmText: "Update tier on {{count}} account(s) to {{tier}}?" - }, - { - name: "transfer_owner", - label: "Transfer Owner", - icon: "user-check", - operation: "update", - params: [ - { - name: "owner_id", - label: "New Owner", - type: "lookup", - // The platform registers `sys_user` — `user` matches no object and - // rendered an empty picker. - object: "sys_user", - required: true - } - ], - confirmText: "Transfer ownership of {{count}} account(s)?" - }, - { - name: "delete", - label: "Delete", - icon: "trash-2", - variant: "danger", - operation: "delete", - confirmText: "Permanently delete {{count}} account(s)? This cannot be undone.", - confirmLabel: "Delete" - } - ], - appearance: { - showDescription: true, - allowedVisualizations: ["grid", "gallery", "map"] - } - }, - listViews: { - /** Branded account cards */ - account_gallery: { - name: "account_gallery", - type: "gallery", - label: "Account Cards", - data: { provider: "object", object: "crm_account" }, - // `logo` rides in the projection for the same reason the timeline view - // carries its date fields: the list data source projects the configured - // columns, and `coverField` reads off that projection. - columns: ["name", "industry", "annual_revenue", "phone", "logo"], - gallery: { - // The card art this view was named for. "Branded account cards" had a - // brand COLOUR and no brand IMAGE — `crm_account.logo` is the object's - // only image field and nothing displayed it, so every card drew the - // same blank cover. `coverFit` is left unstated: the schema's default - // is the crop these cards want, and materialising a default rewrites - // "the author said nothing" into "the author asked for this". - coverField: "logo", - cardSize: "medium", - titleField: "name", - visibleFields: ["industry", "annual_revenue", "number_of_employees", "phone", "website", "owner_id"] - } - }, - /** - * Geospatial distribution. - * - * The `map` block is what BINDS the view to a coordinate source. Without it - * the renderer falls back to literal default field names, which resolve on - * `crm_account` only by luck — the view draws no marker while authoring - * reports success (`view/layout-without-binding`). `office_location` is the - * object's `Field.location(...)`, which is the one field on `crm_account` - * carrying coordinates; `billing_address` is an `address` field and is a - * postal shape, not a coordinate one, so it stays a column rather than the - * binding. `titleField` names the marker label — `name`, not the object's - * `nameField` (`display_title`), because the map's own `columns` show - * `name` and the two should agree. - */ - account_map: { - name: "account_map", - type: "map", - label: "Accounts by Location", - data: { provider: "object", object: "crm_account" }, - columns: ["name", "industry", "office_location", "billing_address"], - map: { locationField: "office_location", titleField: "name" } - }, - /** Tier accounts: Enterprise (>= $10M ARR) */ - enterprise_accounts: { - name: "enterprise_accounts", - type: "grid", - label: "Enterprise Accounts", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_account" }, - columns: ["name", "industry", "annual_revenue", "number_of_employees", "owner_id"], - filter: [{ field: "annual_revenue", operator: "greater_than_or_equal", value: 1e7 }], - sort: [{ field: "annual_revenue", order: "desc" }], - // ADR-0047 end-user quick filters (Airtable "User filters", Elements: - // dropdowns). `element: 'dropdown'`, deliberately — on an object list - // the view SWITCHER owns the tab bar (it builds one entry per `list` / - // `listViews` descriptor), so a quick-filter block shaped as tabs is - // dropped there: the console logs `defines userFilters (element: - // "tabs"), which are ignored on an object list view (ADR-0047 "views" - // mode — the view switcher owns the tab bar here)` and renders nothing. - // Dropdowns sit beside the switcher and are unaffected. - // `owner_id` is the platform ownership lookup (#548) — it renders as a - // record-picker dropdown. - // NOTE: requires @objectstack/spec > 9.2.0 (ADR-0047 UserFiltersSchema); - // on older specs defineStack strips this block — harmless no-op. - ...{ - userFilters: { - element: "dropdown", - fields: [ - { field: "industry", showCount: true }, - { field: "type" }, - { field: "owner_id" } - ] - } - // typed via spread-as-any until @objectstack/spec ships ADR-0047 - // (UserFiltersSchema is in framework main, > 9.2.0) - } - }, - my_accounts: { - name: "my_accounts", - type: "grid", - label: "My Accounts", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_account" }, - columns: ["name", "industry", "annual_revenue", "phone", "last_activity_date"], - filter: [{ field: "owner_id", operator: "equals", value: "{current_user_id}" }], - sort: [{ field: "last_activity_date", order: "desc" }] - }, - // The `renewals_due` view is gone with the fields it was built on (#1181): - // both its `is_not_null` filter and its sort key were - // `crm_account.next_renewal_date`, so the view could not outlive the field. - // Nothing is lost — `crm_contract` ships the renewals queue that the daily - // sweep actually acts on (`renewal_calendar`, over `end_date`). - /** At-risk customers — CSM action queue */ - at_risk_accounts: { - name: "at_risk_accounts", - type: "grid", - label: "\u26A0\uFE0F At-Risk Accounts", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_account" }, - columns: ["name", "tier", "health_score", "segment", "last_activity_date"], - filter: [ - { field: "type", operator: "equals", value: "customer" }, - { field: "health_score", operator: "in", value: ["at_risk", "churning"] } - ], - sort: [{ field: "health_score", order: "desc" }] - } - }, - form: { - type: "tabbed", - sections: [ - { - name: "profile", - label: "Profile", - columns: 2, - fields: [ - { field: "name", required: true, span: "full" }, - "account_number", - // `type` (prospect / customer / partner …) drives the Renewals and - // At-Risk views' `type = customer` filter — with no form field it - // could never be set, so those views matched nothing. - "type", - "industry", - "phone", - "website", - "owner_id", - "parent_account", - "is_active", - "brand_color", - // The other half of the `branding` group. Without a form field there - // is no upload control anywhere in the app, so the logo the gallery - // cards now cover with could never have been set. Full span: an - // image drop target in a half-width cell is a thumbnail-sized one. - { field: "logo", span: "full" } - ] - }, - { - // `child_account_revenue` is a roll-up the engine maintains, so it is - // read-only on the form by construction — it is here because a hierarchy - // nobody can see the effect of is the decoration this field replaced. - name: "financials", - label: "Financials", - columns: 2, - fields: ["annual_revenue", "number_of_employees", "child_account_revenue"] - }, - { - // The customer-success fields the at_risk_accounts view lists and - // filters on. They existed on the object but no form offered them, so - // the CS working queue stayed permanently empty. (`renewal_owner` and - // `next_renewal_date` were removed from this section with the fields - // themselves — #1181.) - name: "customer_success", - label: "Customer Success", - columns: 2, - fields: ["tier", "segment", "health_score"] - }, - { - name: "locations", - label: "Locations", - columns: 1, - // `billing_country` and `territory` are readonly and derived, but both - // are on the form on purpose: an admin asking "why does the NA team not - // see this account?" reads the answer off the record instead of - // guessing at the address blob (#621). `territory` is what the rules - // actually match (#639) and `billing_country` is the input it was - // classified from, so the two together show the whole derivation — - // including the case the picklist alone cannot explain, an account - // sitting in `Other` because its country was typed in a spelling the - // mapping does not know. - fields: ["billing_address", "billing_country", "territory", "office_location"] - }, - { - name: "description", - label: "Description", - columns: 1, - fields: ["description"] - } - ] - } -}); - -// src/sales/views/contact.view.ts -import { defineView as defineView5 } from "@objectstack/spec/ui"; -var ContactViews = defineView5({ - list: { - type: "grid", - name: "all_contacts", - label: "All Contacts", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_contact" }, - columns: [ - { field: "avatar", width: 64, align: "center" }, - { field: "first_name", width: 140, sortable: true, link: true }, - { field: "last_name", width: 140, sortable: true }, - { field: "crm_account", width: 200 }, - { field: "title", width: 180 }, - { field: "department", width: 140 }, - // REQ-0004 acceptance 2: the three buying-centre attributes are columns - // on the landing roster, which is already grouped by account with the - // groups collapsed — so expanding one account reads as a MAP (who - // decides, who is on our side) instead of a directory. Columns are also - // what the list's own filter and grouping controls offer. - { field: "buying_function", width: 160 }, - { field: "attitude", width: 140 }, - { field: "relationship_strength", width: 180 }, - { field: "email", width: 220 }, - { field: "phone", width: 150 }, - { field: "owner_id", width: 150 } - ], - sort: [{ field: "last_name", order: "asc" }], - grouping: { fields: [{ field: "crm_account", order: "asc", collapsed: true }] }, - selection: { type: "multiple" }, - // The selection-bar entry point for campaigning at existing customers - // (#597), mirroring `bulkActions: ['create_campaign']` on the lead grid. - // The bare-string form fans the action out once per selected row; do not - // add strings for `mark_primary` / `send_email`, which declare - // `locations: ['list_item']` and are auto-injected into the row menu. - bulkActions: ["add_contact_to_campaign"], - pagination: { pageSize: 50, pageSizeOptions: [25, 50, 100] }, - exportOptions: { formats: ["csv", "xlsx"] }, - appearance: { - showDescription: true, - allowedVisualizations: ["grid", "gallery"] - } - }, - listViews: { - /** People directory */ - contact_directory: { - name: "contact_directory", - type: "gallery", - label: "People Directory", - data: { provider: "object", object: "crm_contact" }, - columns: ["first_name", "last_name", "title", "email"], - gallery: { - coverField: "avatar", - coverFit: "cover", - cardSize: "small", - titleField: "last_name", - visibleFields: ["first_name", "title", "department", "email", "phone", "crm_account"] - } - }, - primary_contacts: { - name: "primary_contacts", - type: "grid", - label: "Primary Contacts", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_contact" }, - columns: ["first_name", "last_name", "crm_account", "title", "email", "phone"], - filter: [{ field: "is_primary", operator: "equals", value: true }], - sort: [{ field: "crm_account", order: "asc" }] - } - }, - form: { - type: "tabbed", - sections: [ - { - name: "identity", - label: "Identity", - columns: 2, - fields: [ - "salutation", - { field: "first_name", required: true }, - { field: "last_name", required: true, span: "full" }, - { field: "crm_account", required: true }, - "title", - "department", - "owner_id" - ] - }, - { - // REQ-0004 acceptance 1: the buying-centre group is rendered FROM - // `fieldGroups`, with no per-field enumeration authored anywhere. - // - // This form authors `sections`, and an authored `sections` array wins - // outright over the renderer's `fieldGroups` auto-derivation (the - // mechanism is written up at length in `case.view.ts`), so a group - // declared on the object alone would reach the SYNTHESIZED detail - // page and never this form — which is also the create dialog. The - // group-reference form is rung 2 of the AGENTS.md ladder, for exactly - // this "partial arrangement is genuinely needed" case: `group:` - // inherits the object's `buying_centre` members (every field pointing - // at it, in declaration order) and its presentation, so adding a - // fourth attribute to the group later reaches this form by itself. - // - // ⛔ `group:` is mutually exclusive with `fields:` and with every key - // the group itself declares (`name`, `label`, `description`, - // `visibleWhen`, `collapsible`/`collapsed: true`) — `columns` is not - // one of those, because the group declares nothing about layout. - group: "buying_centre", - columns: 2 - }, - { - // Named `contact_details`, not `contact_info` — `contact_info` is - // already a distinct fieldGroup key on `crm_contact` ("Contact - // Information"), and reusing it here would make this section's - // translated heading follow that group's wording instead of its own - // "Contact Info". - name: "contact_details", - label: "Contact Info", - columns: 2, - fields: ["email", "phone", "mobile", "avatar"] - }, - { - // Named `mailing_address` — deliberately the SAME key as the - // `mailing_address` fieldGroup on `crm_contact`, which is the opposite - // call from the two sections either side of it and for the same - // reason. Reusing a group key makes the section's translated heading - // follow that group's wording; `contact_details` and - // `comm_preferences` wanted their own shorter wording, so they had to - // avoid the collision. This section wants exactly the group's wording - // ("Mailing Address"), which every locale already carries under - // `objects.crm_contact._sections.mailing_address`, so the collision is - // the feature: one heading, one translation, four locales, no new row. - // - // Why the section exists at all: an authored `sections` array wins - // outright over the renderer's `fieldGroups` auto-derivation (the - // mechanism is written up at length in `case.view.ts`), and this form - // is also the CREATE dialog. Without this section the address was - // readable on the SYNTHESIZED detail page — which does derive from - // `fieldGroups` — while no form in the app could enter or edit it, - // even though `contact_import.mapping.ts` writes it from the shipped - // CSV template. This tab is the authoring half of the import path. - name: "mailing_address", - label: "Mailing Address", - columns: 2, - fields: [ - // One structured `address` field; full width, so its parts lay out - // as a unit rather than in half a grid column. - { field: "mailing_address", span: "full" } - ] - }, - { - // Named `comm_preferences`, not `preferences` — `preferences` is - // already a distinct fieldGroup key on `crm_contact` ("Communication - // Preferences"), and reusing it here would make this section's - // translated heading follow that group's wording instead of its own - // "Preferences". - name: "comm_preferences", - label: "Preferences", - columns: 2, - fields: ["lead_source", "is_primary", "do_not_call", "email_opt_out"] - } - ] - } -}); - -// src/sales/views/opportunity.view.ts -import { defineView as defineView6 } from "@objectstack/spec/ui"; -var OpportunityViews = defineView6({ - // The landing view is OPEN deals, not every deal ever recorded. - // - // Sorted by close_date ascending and unfiltered, "All Opportunities" opened - // on settled history: the first screen was 7 closed-won and 4 closed-lost - // records, and a rep had to scroll past months of finished business to reach - // anything they could still act on. The full unfiltered list is still one - // click away on the "All Opportunities" tab. - list: { - type: "grid", - name: "open_opportunities", - label: "Open Deals", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_opportunity" }, - filter: [ - { field: "stage", operator: "not_in", value: ["closed_won", "closed_lost"] } - ], - columns: [ - { field: "name", width: 220, sortable: true, link: true }, - { field: "crm_account", label: "Account", width: 180 }, - { field: "stage", width: 140, sortable: true }, - { field: "amount", width: 140, align: "right", sortable: true, summary: "sum" }, - { field: "probability", width: 110, align: "right" }, - { field: "expected_revenue", width: 160, align: "right", summary: "sum" }, - { field: "close_date", width: 140, sortable: true } - ], - sort: [{ field: "close_date", order: "asc" }], - rowColor: { - field: "stage", - colors: { - prospecting: "slate", - qualification: "sky", - // Teal sits between the cool qualification blue and the warm proposal - // amber, keeping the cool→warm funnel ramp readable. NOT the gold - // `#FFD700` this option carries in `_picklists.ts`: gold is one hue - // step from proposal's amber, so the two adjacent stages would tint - // rows the same. - // - // Values are colour NAMES, not hex: objectui's `useRowColor` resolves - // only a name from its own vocabulary (or a full `bg-*` class) and - // turns a hex into no colour at all — so until 17.6.0's lint said so, - // this map tinted nothing. - needs_analysis: "teal", - proposal: "amber", - negotiation: "purple", - closed_won: "green", - closed_lost: "red" - } - }, - pagination: { pageSize: 25, pageSizeOptions: [25, 50, 100] }, - selection: { type: "multiple" }, - showRecordCount: true, - exportOptions: { formats: ["csv", "xlsx"] }, - appearance: { - showDescription: true, - allowedVisualizations: ["grid", "kanban", "calendar", "timeline", "gallery"] - }, - // Binds the 'calendar' entry above: the same forecast dates the dedicated - // `close_date_calendar` view shows, on the field this list sorts by. - // `close_date` is required + notNull on crm_opportunity. - calendar: { - startDateField: "close_date", - titleField: "name", - colorField: "stage" - }, - // List-level entry points: generate_quote reaches the row menu via its - // own `locations: ['list_item']`. Built-in `exportOptions` covers CSV - // export. - // - // `mass_update_stage` is wired as an AGGREGATE bulk def, not as a bare - // `bulkActions: ['mass_update_stage']` string (#508). The two forms are - // different dispatch contracts, and only this one moves a whole selection: - // - // - bare string → per-record fan-out: the action is dispatched ONCE PER - // selected row with `recordId` set. N requests, N stage moves. - // - aggregate def → ONE dispatch for the whole selection, carrying every - // id in the builtin `params._selectedIds` and no `recordId`. One - // request, N stage moves, one audit entry. - // - // Aggregate is the right shape here because the body already loops over the - // selection itself, and because the run is all-or-nothing: a partial result - // rejects instead of leaving the bar reporting per-row success it cannot - // honour (see the body in `src/sales/actions/opportunity.actions.ts`). - // - // `execution: 'aggregate'` is REQUIRED on an `operation: 'custom'` def and - // is not boilerplate: a custom def without it has no dispatcher, so the - // button ticks green once per row and does nothing at all. The spec refuses - // that shape at parse time (#4457) — which is also what makes this - // declaration safe to trust rather than merely present. - // - // History: this list carried the bare-string form until #588 removed it as - // a silent no-op, and the removal was read as "the platform cannot deliver - // a selection" for two release candidates. It could: the channel is - // `params._selectedIds`, the underscore is load-bearing, and nothing was - // injecting it precisely BECAUSE this declaration was gone - // (objectstack-ai/objectstack#5568, closed works-as-declared). - // - // The def deliberately carries only the three keys that choose the dispatch - // contract. Label, icon, params (the New Stage picker) and `visible` are - // promoted from the action itself by the renderer, so the dialog and the - // toolbar button cannot drift apart — and the label stays i18n-resolved, - // which an inline `label:` here would not be. - bulkActionDefs: [ - { name: "mass_update_stage", operation: "custom", execution: "aggregate" } - ] - }, - listViews: { - /** - * All Opportunities — the unfiltered book, including closed business. - * - * Demoted from the landing view (see the note on `list` above) but kept - * whole: reporting, audits and win/loss reviews all need the closed rows, - * and a manager reaches this in one click. - */ - all_opportunities: { - name: "all_opportunities", - type: "grid", - label: "All Opportunities", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_opportunity" }, - columns: [ - { field: "name", width: 220, sortable: true, link: true }, - { field: "crm_account", label: "Account", width: 180 }, - { field: "stage", width: 140, sortable: true }, - { field: "amount", width: 140, align: "right", sortable: true, summary: "sum" }, - { field: "probability", width: 110, align: "right" }, - { field: "expected_revenue", width: 160, align: "right", summary: "sum" }, - { field: "close_date", width: 140, sortable: true }, - { field: "owner_id", width: 150 } - ], - sort: [{ field: "close_date", order: "desc" }], - showRecordCount: true - }, - /** Drag-and-drop sales pipeline */ - pipeline_kanban: { - name: "pipeline_kanban", - type: "kanban", - label: "Sales Pipeline", - data: { provider: "object", object: "crm_opportunity" }, - columns: ["name", "crm_account", "amount", "close_date", "owner_id"], - kanban: { - groupByField: "stage", - summarizeField: "amount", - columns: ["name", "crm_account", "amount", "close_date"] - }, - // The board is the active working pipeline. Closed business remains in - // the full book and the dashboard, while excluding it here keeps all - // five active stages visible at a presentation-friendly width. - filter: [{ field: "stage", operator: "not_in", value: ["closed_won", "closed_lost"] }], - sort: [{ field: "close_date", order: "asc" }], - navigation: { mode: "drawer", width: "640px" } - }, - /** Close-date forecasting calendar */ - close_date_calendar: { - name: "close_date_calendar", - type: "calendar", - label: "Forecast Calendar", - data: { provider: "object", object: "crm_opportunity" }, - columns: ["name", "amount", "stage", "owner_id"], - calendar: { - startDateField: "close_date", - titleField: "name", - colorField: "stage" - } - }, - /** Chronological deal flow */ - deal_timeline: { - name: "deal_timeline", - type: "timeline", - label: "Deal Timeline", - data: { provider: "object", object: "crm_opportunity" }, - columns: ["name", "crm_account", "amount"], - timeline: { - // `created_at`, the platform's own creation stamp — the object's - // duplicate `created_date` was removed in #575 B2 because nothing ever - // wrote it, so this timeline started every bar at null. Same spelling - // as the lead activity calendar. - startDateField: "created_at", - endDateField: "close_date", - titleField: "name", - groupByField: "owner_id", - colorField: "stage", - scale: "month" - } - }, - /** Executive review cards */ - deal_gallery: { - name: "deal_gallery", - type: "gallery", - label: "Deal Cards", - data: { provider: "object", object: "crm_opportunity" }, - columns: ["name", "crm_account", "amount", "stage", "close_date"], - gallery: { - cardSize: "medium", - titleField: "name", - visibleFields: ["crm_account", "amount", "stage", "probability", "close_date", "owner_id"] - } - }, - /** Personal pipeline */ - my_open_deals: { - name: "my_open_deals", - type: "grid", - label: "My Open Deals", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_opportunity" }, - columns: ["name", "crm_account", "stage", "amount", "close_date"], - // "Open" has to exclude BOTH closed stages. Excluding only closed_won - // meant a rep's own queue opened on their lost deals, sorted to the top - // by close_date — the least actionable rows in the system. - filter: [ - { field: "owner_id", operator: "equals", value: "{current_user_id}" }, - { field: "stage", operator: "not_in", value: ["closed_won", "closed_lost"] } - ], - sort: [{ field: "close_date", order: "asc" }] - }, - /** Stale Opportunities — still-open deals, longest-parked first */ - stale_opportunities: { - name: "stale_opportunities", - type: "grid", - // Honest label: this view does not apply the 14-day cut its automation - // twin (`opportunity_stagnation`, STALE_THRESHOLD_DAYS = 14) uses, and - // does not claim to. Two independent reasons were recorded for that; one - // still holds and one has expired, so they are separated here. - // - // STILL TRUE — `days_in_stage` is a FORMULA (#489), evaluated in JS after - // the query, so the data engine can neither filter nor sort on it. Any - // filter phrased in terms of `days_in_stage` remains impossible. - // - // EXPIRED (#744) — the second reason said the list data path resolves no - // date macros, so `stage_entry_date < {14_days_ago}` would ship the token - // as a literal and invert the comparison lexicographically ('2026-…' sorts - // below '{', so every row matched). That was measured on @objectstack - // 16.1.0 and stopped being true at 17.0.0-rc.0, when `resolveFilterTokens()` - // was wired into the ObjectQL read path (objectql #3582). `{14_days_ago}` - // is a first-class vocabulary member — it matches the parameterised - // grammar `DATE_MACRO_PARAM_RE`, `{N_(minutes|hours|days|weeks|months| - // years)_(ago|from_now)}` — and it reaches the driver already substituted - // for an ISO date. Measured on 17.0.0-rc.2, RE-MEASURED 2026-09-03 on - // 17.2.0 (#1467), RE-RUN on 17.3.0 (#1676, after the PR #1577 bump) and - // RE-RUN again on 17.4.0 (#1883, after the PR #1814 bump; not yet on - // 17.5.0), unchanged at every taking: over four rows parked - // 30d / 15d / 13d / 1d, `stage_entry_date < {14_days_ago}` returned the - // 30d and 15d rows — the same two the equivalent day-start literal - // returns, and not all four, which is what an unsubstituted token would - // have matched. It is the same seam - // `closing_this_quarter` — the very next view in this file — relies on, - // pinned against a real engine in - // `test/forecast-current-quarter-view.test.ts`. - // - // Correcting that half of the comment does not decide anything about the - // filter, and is deliberately not a licence to change it: expressing the - // cut as `stage_entry_date <= {14_days_ago}` would drop `days_in_stage` - // from the question entirely and change which rows this view returns — - // hiding today's 13-day-old deals from a manager's queue. That is a - // BEHAVIOUR change with its own issue (#770), where the open question is - // whether this queue should be a cut or a ranking at all — this label - // promises a ranking and honours it. `stale_articles` in - // `src/views/knowledge_article.view.ts` carried the same expired premise - // and was corrected in the same pass (#769); that tab was then DELETED - // outright (#781, the review queue ruled out of the product), so it is no - // longer a comparison available in this tree — the surviving precedent - // for "ranking, not cut" is this view. Nothing below was touched. - // - // As shipped: operator-only filter, ordered by the stored - // `stage_entry_date` ascending — longest-parked on top, which is the - // queue a manager works. The `days_in_stage` column puts the - // `opportunity_stagnation` threshold in plain sight on every row. - label: "\u26A0\uFE0F Stale Opportunities \xB7 Longest in Stage First", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_opportunity" }, - columns: ["name", "crm_account", "stage", "amount", "stage_entry_date", "days_in_stage", "close_date", "owner_id"], - filter: [ - { field: "stage", operator: "not_in", value: ["closed_won", "closed_lost"] } - ], - sort: [{ field: "stage_entry_date", order: "asc" }, { field: "close_date", order: "asc" }] - }, - /** - * Tender expected this quarter — REQ-0006 acceptance 2 in one view. - * - * The point of the view is the predicate: it windows - * `expected_tender_date`, the CUSTOMER's procurement calendar, and touches - * `close_date` nowhere — which is what "reportable independently of - * `close_date`" means and what a single forecast date could never express. - * - * Same inclusive `{current_quarter_*}` bounds as `closing_this_quarter` - * below, exact for the same measured reason: both bounds are date macros - * resolved server-side, and `expected_tender_date` is a `Field.date()` - * stored as `YYYY-MM-DD` TEXT, so the inclusive upper bound drops no rows. - */ - tender_this_quarter: { - name: "tender_this_quarter", - type: "grid", - label: "Tender This Quarter", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_opportunity" }, - columns: ["name", "crm_account", "expected_tender_date", "expected_tender_amount", "expected_signing_date", "stage", "owner_id"], - filter: [ - { field: "stage", operator: "not_in", value: ["closed_won", "closed_lost"] }, - { field: "expected_tender_date", operator: "greater_than_or_equal", value: "{current_quarter_start}" }, - { field: "expected_tender_date", operator: "less_than_or_equal", value: "{current_quarter_end}" } - ], - sort: [{ field: "expected_tender_date", order: "asc" }], - // Empty is the legitimate state on a fresh install: no seed row carries - // a customer-side tender date, so this tab opens on nothing until a rep - // records one. Unexplained, that reads as broken. - emptyState: { - title: "No Tenders Expected This Quarter", - message: "This tab lists open deals whose customer-side tender date falls inside the current quarter. Record Expected Tender Date on a deal to see it here.", - icon: "calendar-clock" - } - }, - /** Closing this quarter (commit + best_case) — sales-manager forecast */ - closing_this_quarter: { - name: "closing_this_quarter", - type: "grid", - label: "Closing This Quarter", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_opportunity" }, - columns: ["name", "crm_account", "amount", "forecast_category", "probability", "close_date", "owner_id"], - // The `close_date` window is what makes the label true (#743). Without - // it this view returned EVERY open commit/best-case deal whenever it - // closed — a deal slated for next March sat under a heading that said - // "Closing This Quarter", and summing the Amount column gave a number - // that was not this quarter's commit. - // - // Both bounds are date macros resolved server-side: `resolveFilterTokens()` - // was wired into the ObjectQL read path in 17.0.0-rc.0 (objectql #3582, - // covering find/findOne/count/aggregate ahead of the middleware chain), - // so a saved-view filter value reaches the driver already substituted. - // Measured on 17.0.0-rc.2, RE-MEASURED 2026-09-03 on 17.2.0 (#1467), - // RE-RUN on 17.3.0 (#1676, after the PR #1577 bump) and RE-RUN again on - // 17.4.0 (#1883, after the PR #1814 bump), unchanged at - // every taking — see the runtime block in - // `test/forecast-current-quarter-view.test.ts`, which is that - // re-measurement (not yet re-run on 17.5.0). - // - // The upper bound is INCLUSIVE against `{current_quarter_end}` rather - // than half-open against `{next_quarter_start}`, and that choice is - // deliberate: a `*_end` token resolves to the period's last calendar DAY - // (2026-09-30), which on a `datetime` column would stop at midnight and - // silently drop that day's rows — the spec says to use the half-open - // form there. `close_date` is `Field.date()`, stored as `YYYY-MM-DD` - // TEXT on both sides of the comparison, so the inclusive bound is exact. - // That is the same field-type property `metadata-references.test.ts` - // relies on for why the CRM/Sales/Executive dashboards may window - // `close_date` at all (#460). Both forms were measured to return the - // identical row set here; the inclusive one reads as what it means. - filter: [ - { field: "forecast_category", operator: "in", value: ["commit", "best_case"] }, - { field: "stage", operator: "not_in", value: ["closed_won", "closed_lost"] }, - { field: "close_date", operator: "greater_than_or_equal", value: "{current_quarter_start}" }, - { field: "close_date", operator: "less_than_or_equal", value: "{current_quarter_end}" } - ], - sort: [{ field: "close_date", order: "asc" }], - // Scoping the list makes "empty" a state a real user meets, so it needs - // copy. Unlike the forecast view's (#745, where the sweep owns the - // window and a fresh install is ALWAYS empty until it runs), the seeds - // here do produce rows for most of a quarter — six seeded deals qualify - // on forecast_category + stage, at `daysFromNow` offsets 11/14/24/30/38/45. - // But every one of those offsets is relative to the INSTALL day, so once - // fewer than 11 days remain in the quarter all six land in the next one - // and a freshly seeded demo opens this tab on nothing. A real org meets - // the same state whenever a quarter's commit slips out. Empty is - // legitimate here; unexplained, it reads as broken. - emptyState: { - title: "No Deals Closing This Quarter", - message: "This tab lists open commit and best-case deals with a close date inside the current quarter. Nothing matches right now \u2014 deals closing later are on the Open Deals tab.", - icon: "calendar-check" - } - } - }, - form: { - type: "tabbed", - sections: [ - { - name: "overview", - label: "Overview", - columns: 2, - fields: [ - { field: "name", required: true, span: "full" }, - { field: "crm_account", required: true }, - "primary_contact", - { field: "stage", required: true }, - { field: "amount", required: true }, - "probability", - "close_date", - "owner_id" - ] - }, - { - name: "forecast", - label: "Forecast", - columns: 2, - fields: [ - "expected_revenue", - "forecast_category", - "type", - "lead_source", - "crm_campaign", - "stage_entry_date", - "days_in_stage", - "is_private", - // REQ-0006 step 8 — the customer's own procurement calendar. Named - // here (AGENTS.md ladder rung 3), and the reason in writing: - // `tender_this_quarter` filters on `expected_tender_date`, and a - // filtered field no form offers is a view that can never match a - // deal a rep created through the UI (`test/metadata-references - // .test.ts`). The fields declare `group: 'sales_process'`, so every - // DERIVED surface — the record page's Details tab — already carries - // them; this form authors `sections`, which win outright over - // derivation. A `{ group: 'sales_process' }` reference cannot stand - // in: it would render `stage`, `probability` and `close_date` - // (curated in Overview, `stage` `required`) and `stage_entry_date` - // (above) a second time, and pull the approval verdict columns and - // the inert-by-default `requested_status` into the create dialog. - "customer_initiation_date", - "expected_tender_date", - "expected_tender_amount", - "expected_signing_date", - "expected_signing_amount" - ] - }, - // REQ-0006 acceptance 1, FROM `fieldGroups` (AGENTS.md ladder rung 2), - // the way `contact.view.ts` references REQ-0004's buying centre: this - // form authors `sections`, which win outright over the renderer's - // `fieldGroups` derivation, so a group declared on the object alone - // never reaches this form — the Edit and New dialog. A group reference - // enumerates nothing; members, label and icon come from the object. - // - // ⚠️ Measured on the 17.6.0 console: the tabbed dialog renders NO tab - // for a `{ group }` section — this one, and the contact form's buying - // centre on `main` alike. That is the platform's to fix, and these two - // lines are the contract-correct form waiting for it (AGENTS.md: a - // platform defect is waited for, never routed around). Until then every - // REQ-0006 field is edited through the Details tab's edit mode — which - // offers no markdown editor, the reason the narrative fields are - // textareas (see the note above `customer_background`). - { group: "qualification", columns: 2 }, - { group: "narrative", columns: 1 }, - { - name: "sales_strategy", - label: "Sales Strategy", - columns: 1, - // `competitors` sat here until #1061 retired it — this form section was - // the field's ONLY surface anywhere in the app (nothing read it back). - fields: ["next_step"] - }, - { - // Win/loss capture at close time. The fields existed on the object for - // reporting but no form offered them, so every closed deal lost its - // why-we-won / why-we-lost data. - name: "win_loss", - label: "Win / Loss", - collapsible: true, - collapsed: true, - columns: 2, - fields: ["win_reason", "loss_reason", { field: "loss_details", span: "full" }] - } - ] - } -}); - -// src/sales/views/task.view.ts -import { defineView as defineView7 } from "@objectstack/spec/ui"; -var TaskViews = defineView7({ - list: { - type: "grid", - name: "all_tasks", - label: "All Tasks", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_task" }, - // NO `progress_percent` column here (#1214 item 5). The default grid used - // to render completion THREE times on one row — 是否完成 (tick), 状态, and - // 进度(%) — and the percent was the one that carried nothing. - // - // ⚠️ The card justified the removal as "every seeded row is 0%". That is - // FALSE as stated and was re-measured before deleting: two of the seven - // seeded tasks carry 100. What is TRUE is the claim underneath it — nobody - // maintains a percent per task — and the seed shows it more sharply than - // the card did: - // · every value that exists is 100, and every one of those rows is - // `status: 'completed'` (`service.seed.ts` mirrors what the hook would - // stamp, since hooks do not run over seeds); - // · `task_completion` stamps 100 on the completed transition and writes - // the field at no other time; - // · both `in_progress` rows sit at 0 — the one status where a percent - // could say something a status cannot, and it says nothing. - // ⇒ On this grid the column is `status` re-rendered at LOWER resolution: it - // cannot tell `not_started` from `in_progress` (both 0), while the `status` - // column beside it can. Dropping it loses no fact this row does not already - // carry twice. - // - // ⛔ The FIELD stays, and so does every other reader — this is one column - // on one view, not a retirement: `task_gantt` fills its bars from - // `gantt.progressField`, `task_board` and `my_open_tasks` show it (neither - // carries `status` AND `is_completed`, so there it is not a third spelling), - // `avg_progress` in `task.dataset.ts` aggregates it, and the Effort section - // of this file's form still lets a user author one. - // - // ⛔ `is_completed` STAYS, and is not the second half of this cleanup: it is - // not an independent shadow that can contradict `status` — `task_completion` - // recomputes it from status on every insert and update - // (`input.is_completed = effStatus === 'completed'`), which is precisely the - // "render completion from status" the card asks for, already done at the - // data layer. It is also this list's first sort key and its completion - // control. - columns: [ - { field: "is_completed", width: 60, align: "center" }, - { field: "subject", width: 280, sortable: true, link: true }, - { field: "status", width: 130, sortable: true }, - { field: "priority", width: 110, sortable: true }, - { field: "due_date", width: 140, sortable: true }, - { field: "owner_id", width: 150 }, - { field: "is_overdue", width: 100, align: "center" } - ], - sort: [ - { field: "is_completed", order: "asc" }, - { field: "due_date", order: "asc" } - ], - rowColor: { - // Task priority is low/normal/high/urgent — the previous critical/medium - // keys were Case values, so urgent and normal rows got no color at all. - // Colors mirror the option colors on crm_task.priority. - field: "priority", - colors: { urgent: "red", high: "orange", normal: "green", low: "slate" } - }, - selection: { type: "multiple" }, - pagination: { pageSize: 50 }, - appearance: { - showDescription: true, - allowedVisualizations: ["grid", "kanban", "calendar", "gantt", "timeline"] - }, - // Binds the 'calendar' entry above: the same schedule the dedicated - // `task_calendar` view shows, on the field this list sorts by. `due_date` - // is optional — an undated task stays off the calendar instead of being - // dropped on today by a guessed field. - calendar: { - startDateField: "due_date", - titleField: "subject", - colorField: "priority" - } - }, - listViews: { - /** Work board */ - task_board: { - name: "task_board", - type: "kanban", - label: "Task Board", - data: { provider: "object", object: "crm_task" }, - columns: ["subject", "priority", "due_date", "owner_id"], - kanban: { - groupByField: "status", - columns: ["subject", "priority", "due_date", "progress_percent"] - }, - filter: [{ field: "is_completed", operator: "equals", value: false }], - navigation: { mode: "drawer", width: "520px" } - }, - /** Schedule view */ - task_calendar: { - name: "task_calendar", - type: "calendar", - label: "Task Schedule", - data: { provider: "object", object: "crm_task" }, - columns: ["subject", "priority", "owner_id"], - calendar: { - startDateField: "due_date", - titleField: "subject", - colorField: "priority" - } - }, - /** Execution plan */ - task_gantt: { - name: "task_gantt", - type: "gantt", - label: "Execution Plan", - data: { provider: "object", object: "crm_task" }, - columns: ["subject", "owner_id", "progress_percent"], - gantt: { - startDateField: "reminder_date", - endDateField: "due_date", - titleField: "subject", - progressField: "progress_percent" - } - }, - /** Worklog timeline */ - task_timeline: { - name: "task_timeline", - type: "timeline", - label: "Worklog Timeline", - data: { provider: "object", object: "crm_task" }, - columns: ["subject", "status"], - timeline: { - startDateField: "reminder_date", - endDateField: "due_date", - titleField: "subject", - groupByField: "owner_id", - colorField: "status", - scale: "week" - } - }, - my_open_tasks: { - name: "my_open_tasks", - type: "grid", - label: "My Open Tasks", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_task" }, - columns: ["subject", "priority", "due_date", "progress_percent"], - filter: [ - { field: "owner_id", operator: "equals", value: "{current_user_id}" }, - { field: "is_completed", operator: "equals", value: false } - ], - sort: [{ field: "due_date", order: "asc" }] - }, - /** My open priority tasks — daily morning queue */ - todays_tasks: { - name: "todays_tasks", - type: "grid", - label: "\u{1F4C5} My Priority Tasks", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_task" }, - columns: ["subject", "priority", "status", "due_date", "related_to_type", "owner_id"], - // Operator-only filter — priority and status, no tokens — and the reason - // recorded here for that has expired (#782). Two claims stood here; both - // were wrong already on 17.0.0-rc.2 — the version this repo pinned AT - // THE TIME they were measured, not the current pin — in different - // ways. "Wrong" is about those two - // retired claims, not about the engine: nothing in this block reports - // broken platform behaviour. - // - // ⚠️ READ THE VERSION ON EACH READING BELOW. They were taken at - // several different pins and are labelled individually; a reading - // labelled 17.2.0 was taken there and has NOT been re-taken on any later - // pin unless it says so. - // - // `{current_user_id}` DOES interpolate. `resolveFilterTokens()` was wired - // into the ObjectQL READ path at 17.0.0-rc.0 (objectql #3582) ahead of - // the middleware chain, covering `find` / `findOne` / `count` / - // `aggregate` — saved-view filters included. `my_open_tasks`, the view - // directly above, ships that exact token. Measured in #784 with two probes - // that separate the three possible outcomes: `owner_id = - // {current_org_id}` returned 0 rows (the filter is not being dropped) - // while `owner_id = {current_user_id}` returned every seeded task (not a - // literal-string compare either — the literal matches no owner at all). - // RE-MEASURED 2026-09-03 on 17.2.0 (#1467), unchanged: both probes - // reported exactly those results there. NOT re-run on 17.3.0 (#1676) — - // the two-probe result is a 17.2.0 reading, and the seam it rests on - // (`resolveFilterTokens()` on the read path) was re-confirmed on 17.4.0 - // by `test/flow-filter-today-token.test.ts` (not yet re-run on 17.5.0). - // - // `{TODAY()}` is not a spelling of anything and never was. The vocabulary - // is `{today}` / `{yesterday}` / `{tomorrow}` / `{now}`, the period - // tokens, and the parameterised `{N_days_ago}` family. - // - // ⚠️ WHAT CHANGED between rc.2 and 17.4.0 — the one reading in - // this block that did NOT survive re-measurement, and the reason the - // version qualifiers here are load-bearing rather than bookkeeping. On - // rc.2 `{TODAY()}` was not REJECTED either: the placeholder grammar was - // `/^\$?\{([a-zA-Z0-9_]+)\}$/`, parentheses fell outside it, - // `classifyFilterToken('{TODAY()}')` returned null, and the string - // reached the driver verbatim and compared as text. From 17.2.0 on — - // re-confirmed on 17.3.0 (#1676) and again on 17.4.0 - // (#1883) by the PREMISE case in - // `test/flow-filter-today-token.test.ts`, which drives a real engine — - // that is FALSE: `FILTER_TOKEN_WRAPPED_RE` in `@objectstack/spec/data` - // now reads `/^\$?\{([^{}]+)\}$/`, which DOES match `TODAY()`, so it - // classifies as `kind: 'unknown'` and `resolveFilterTokens()` throws - // `UnknownFilterTokenError` (`FILTER_TOKEN_UNKNOWN`, HTTP 400) — the same - // envelope `{TODAY}` gets. The change landed at 17.0.0-rc.6 and this repo - // already pins it elsewhere: `test/flow-filter-today-token.test.ts` - // (#1107). That is also why the `src/*/flows` sweeps that still spell - // `{TODAY()}` work — `interpolateFilter()` resolves it before ObjectQL - // sees the filter at all. - // - // Measured on rc.2 over a four-row `crm_task` fixture (due 30d ago / 1d - // ago / today / in 7d), and RE-MEASURED 2026-09-03 on 17.2.0 (#1467) - // over the same fixture — three rows unchanged, the fourth not. ⛔ The - // row COUNTS below are a 17.2.0 reading and were NOT re-taken on 17.3.0 - // (#1676); what WAS re-confirmed there is the throw/resolve verdict in - // the right-hand column, by `test/flow-filter-today-token.test.ts`: - // - // rc.2 17.2.0 - // due_date < '{today}' -> 2 rows (past-due) 2 rows - // due_date <= '{today}' -> 3 rows 3 rows - // due_date < '{TODAY}' -> throws throws - // due_date < '{TODAY()}' -> ALL 4 rows throws - // - // (Both throws are `UnknownFilterTokenError`, `FILTER_TOKEN_UNKNOWN`.) - // - // So the #744 lexicographic inversion ('2026-…' sorts below '{') is NOT - // still live on this path, and ⛔ nothing here should carry a workaround - // for it: on rc.2 it reached every spelling the grammar could not see, - // and the 17.2.0 grammar sees them all. The author-time guard in - // `test/metadata-references.test.ts` — it scans the broader - // `/\{([^{}]+)\}/` and rejects any token neither path resolves — still - // earns its keep, by failing at authoring time rather than as a 400 in a - // user's face, and by covering the analytics path the engine gate does - // not. - // - // Correcting the comment is not a licence to change the filter. Whether - // this view should carry a date bound at all — and whether a label - // reading "My Priority Tasks" over a filter with no owner condition is - // the right name — are BEHAVIOUR decisions on #770's line for the task - // views, not this one's. - // - // The sort below is due_date-MAJOR, not priority-major: `priority_rank - // desc` only breaks ties inside a single due date, so a high task due - // tomorrow outranks an urgent one due next week. Measured on rc.2 with - // the shipped sort over four rows — soon/urgent, soon/high, later/urgent, - // later/high, in that order. What stood here said the sort "puts urgent - // at top", which is what the OTHER key order would do. - filter: [ - { field: "status", operator: "in", value: ["not_started", "in_progress"] }, - { field: "priority", operator: "in", value: ["high", "urgent"] } - ], - sort: [{ field: "due_date", order: "asc" }, { field: "priority_rank", order: "desc" }] - }, - /** Overdue / open tasks across the team — sorted oldest-due first */ - overdue_tasks: { - name: "overdue_tasks", - type: "grid", - // Honest label. Two independent reasons were recorded for it; one still - // holds and one has expired (#782), so they are separated here. - // - // STILL TRUE — `is_overdue` is a WRITE-TIME snapshot. `task.hook.ts:68` - // stamps it in `beforeSave` off that moment's clock (`effDue < todayStr` - // and not completed) and nothing re-stamps it afterwards, so a task that - // was on time when it was last saved still reads `is_overdue = false` the - // day after its due date passes. A filter on that column would hand back - // the wrong rows, and it would go wrong silently. - // - // EXPIRED — the other reason said the view layer cannot resolve - // `due_date < {TODAY()}`, and that only `{current_user_id}` interpolates. - // Both halves were wrong already on 17.0.0-rc.2 — the version this repo - // pinned AT THE TIME they were measured, not the current pin — and the - // file said the opposite of - // itself: the note on `todays_tasks` above asserted that - // `{current_user_id}` does NOT interpolate. It does. - // That comment carries the measurements with their versions, INCLUDING - // the one that moved: `{TODAY()}` is REJECTED from 17.2.0 on - // (`FILTER_TOKEN_UNKNOWN`, re-confirmed on 17.3.0 and again on - // 17.4.0 by - // `test/flow-filter-today-token.test.ts`) where on rc.2 it shipped to - // the driver as text, so "cannot resolve `{TODAY()}`" is wrong on the - // current pin for a different reason than it was wrong on rc.2. The - // canonical `{today}` resolves on the read path either way, so a - // strictly past-due filter IS expressible: `due_date < '{today}'` - // selected exactly the past-due rows out of four on rc.2, and did again - // on 17.2.0 (RE-MEASURED 2026-09-03; that row count was not re-taken on - // 17.3.0, where the token's resolution is re-confirmed by the test file - // named above). - // - // So the honest statement is narrower than the one that stood here: this - // view CAN be given a strictly past-due cut through `{today}`, and is not - // given one. Adding it is a BEHAVIOUR change, not a comment correction — - // it would drop today's due-today work out of the queue and turn an - // "Open Tasks" backlog into a strict overdue list, which is the - // cut-versus-ranking question already open on #770 for the task views. - // That also retires the follow-up this comment used to end on: an hourly - // flow re-stamping `is_overdue` was proposed as the ONLY route to a - // truly-overdue gauge, because the filter route was believed closed. - // There are two routes now, and choosing between them belongs to #770. - // - // As shipped: the open-task backlog ordered most-overdue-first (oldest - // due date on top), which is the actionable queue a manager works. - label: "\u23F0 Open Tasks \xB7 Most Overdue First", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_task" }, - columns: ["subject", "priority", "status", "due_date", "owner_id"], - filter: [ - { field: "is_completed", operator: "equals", value: false } - ], - sort: [{ field: "due_date", order: "asc" }] - } - }, - form: { - type: "simple", - sections: [ - { - name: "task", - label: "Task", - columns: 2, - // `type` (call / email / meeting / demo) is what makes an activity - // history readable and is the first thing a rep reaches for after the - // subject — it was missing entirely. `description` captures what was - // actually said on the call. `progress_percent` moved to the Effort - // section: a task being filed is 0% by definition, so a percentage - // slider on the create form is noise. - fields: [ - { field: "subject", required: true, span: "full" }, - { field: "type", required: false }, - { field: "status", required: true }, - "priority", - "due_date", - "owner_id", - "reminder_date", - { field: "description", span: "full" } - ] - }, - { - name: "related_records", - label: "Related Records", - collapsible: true, - columns: 2, - fields: [ - "related_to_account", - "related_to_contact", - "related_to_opportunity", - "related_to_lead", - "related_to_case" - ] - }, - { - name: "recurrence_and_effort", - label: "Recurrence & Effort", - collapsible: true, - collapsed: true, - columns: 2, - fields: [ - "is_recurring", - "recurrence_type", - "recurrence_interval", - "recurrence_end_date", - "progress_percent" - ] - } - ] - } -}); - -// src/sales/views/event.view.ts -import { defineView as defineView8 } from "@objectstack/spec/ui"; -var EventViews = defineView8({ - list: { - type: "grid", - name: "all_events", - label: "All Events", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_event" }, - columns: [ - { field: "subject", width: 280, sortable: true, link: true }, - { field: "type", width: 120, sortable: true }, - { field: "status", width: 120, sortable: true }, - { field: "start_datetime", width: 180, sortable: true }, - { field: "duration_minutes", width: 120, align: "right" }, - { field: "location", width: 180 }, - { field: "owner_id", width: 150 } - ], - sort: [{ field: "start_datetime", order: "desc" }], - rowColor: { - // Mirrors the option colors on crm_event.status. - field: "status", - colors: { planned: "blue", held: "green", cancelled: "slate", no_show: "orange" } - }, - selection: { type: "multiple" }, - pagination: { pageSize: 50 }, - appearance: { - showDescription: true, - allowedVisualizations: ["grid", "calendar", "timeline", "kanban"] - }, - // Binds the 'calendar' entry above: the same span the dedicated - // `event_calendar` view shows. `start_datetime` is required + notNull; - // `end_datetime` is optional, so an event without one stays a single point - // in time rather than borrowing a neighbour's end. - calendar: { - startDateField: "start_datetime", - endDateField: "end_datetime", - titleField: "subject", - colorField: "type" - } - }, - listViews: { - /** The calendar the issue asks for — start → end, coloured by kind. */ - event_calendar: { - name: "event_calendar", - type: "calendar", - label: "Event Calendar", - data: { provider: "object", object: "crm_event" }, - columns: ["subject", "type", "owner_id"], - calendar: { - startDateField: "start_datetime", - endDateField: "end_datetime", - titleField: "subject", - colorField: "type" - } - }, - /** Who is booked when — one lane per rep. */ - event_timeline: { - name: "event_timeline", - type: "timeline", - label: "Team Schedule", - data: { provider: "object", object: "crm_event" }, - columns: ["subject", "status"], - timeline: { - startDateField: "start_datetime", - endDateField: "end_datetime", - titleField: "subject", - groupByField: "owner_id", - colorField: "type", - scale: "day" - } - }, - my_events: { - name: "my_events", - type: "calendar", - label: "My Calendar", - data: { provider: "object", object: "crm_event" }, - columns: ["subject", "type", "location"], - // `{current_user_id}` is the one token the list-view data path really - // interpolates (see crm.app.ts's "My Work" note). - filter: [{ field: "owner_id", operator: "equals", value: "{current_user_id}" }], - calendar: { - startDateField: "start_datetime", - endDateField: "end_datetime", - titleField: "subject", - colorField: "type" - } - }, - /** Booked, not yet held — soonest first. */ - upcoming_events: { - name: "upcoming_events", - type: "grid", - label: "\u{1F4C5} Upcoming \xB7 Soonest First", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_event" }, - columns: ["subject", "type", "start_datetime", "location", "related_to_type", "owner_id"], - filter: [{ field: "status", operator: "equals", value: "planned" }], - sort: [{ field: "start_datetime", order: "asc" }] - }, - /** What actually happened — the interaction history the CRM could not show. */ - held_events: { - name: "held_events", - type: "grid", - label: "\u2705 Interaction History", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_event" }, - columns: ["subject", "type", "start_datetime", "duration_minutes", "related_to_type", "owner_id"], - filter: [{ field: "status", operator: "equals", value: "held" }], - sort: [{ field: "start_datetime", order: "desc" }] - } - }, - form: { - type: "simple", - sections: [ - { - name: "event", - label: "Event", - columns: 2, - fields: [ - { field: "subject", required: true, span: "full" }, - { field: "type", required: true }, - { field: "status", required: true }, - "owner_id", - "location", - { field: "description", span: "full" } - ] - }, - { - name: "schedule", - label: "Schedule", - columns: 2, - fields: [ - { field: "start_datetime", required: true }, - "end_datetime", - "all_day", - "duration_minutes" - ] - }, - { - name: "related_records", - label: "Related Records", - collapsible: true, - columns: 2, - fields: [ - "related_to_account", - "related_to_contact", - "related_to_opportunity", - "related_to_lead", - "related_to_case" - ] - }, - { - name: "outcome", - label: "Outcome", - collapsible: true, - collapsed: true, - columns: 1, - fields: ["outcome_notes"] - } - ] - } -}); - -// src/sales/views/event_attendee.view.ts -import { defineView as defineView9 } from "@objectstack/spec/ui"; -var EventAttendeeViews = defineView9({ - list: { - type: "grid", - name: "all_event_attendees", - label: "Event Attendees", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_event_attendee" }, - columns: [ - { field: "attendee_type", width: 120, sortable: true }, - { field: "crm_contact", width: 200 }, - { field: "crm_lead", width: 200 }, - { field: "sys_user", width: 200 }, - { field: "external_name", width: 200 }, - { field: "response", width: 140, sortable: true }, - { field: "is_organizer", width: 100, align: "center" } - ], - sort: [{ field: "is_organizer", order: "desc" }], - rowColor: { - // Mirrors the option colors on crm_event_attendee.response. - field: "response", - colors: { accepted: "green", declined: "red", tentative: "orange", no_response: "slate" } - }, - pagination: { pageSize: 25 } - }, - form: { - type: "simple", - sections: [ - { - name: "attendee", - label: "Attendee", - columns: 2, - fields: [ - { field: "crm_event", required: true }, - { field: "attendee_type", required: true }, - "crm_contact", - "crm_lead", - "sys_user", - "external_name" - ] - }, - { - name: "invitation", - label: "Invitation", - columns: 2, - fields: ["response", "is_organizer", "invited_date"] - } - ] - } -}); - -// src/sales/views/forecast.view.ts -import { defineView as defineView10 } from "@objectstack/spec/ui"; -var ForecastViews = defineView10({ - list: { - type: "grid", - name: "all_forecasts", - label: "All Forecasts", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_forecast" }, - columns: [ - { field: "owner_id", width: 160, pinned: "left", link: true }, - { field: "period_label", width: 130, sortable: true }, - { field: "period_start", width: 130, sortable: true }, - { field: "snapshot_date", width: 130, sortable: true }, - { field: "quota", width: 130, align: "right", summary: "sum" }, - { field: "closed_amount", width: 140, align: "right", summary: "sum" }, - { field: "commit_amount", width: 140, align: "right", summary: "sum" }, - { field: "best_case_amount", width: 140, align: "right", summary: "sum" }, - { field: "pipeline_amount", width: 140, align: "right", summary: "sum" }, - // No total here: a formula has no stored column to aggregate, so the spec refuses `sum` on a `formula` field (#1980). - { field: "expected_amount", width: 140, align: "right" }, - { field: "attainment_pct", width: 130, align: "right" }, - { field: "coverage_ratio", width: 130, align: "right" }, - { field: "source", width: 130 } - ], - sort: [ - { field: "period_start", order: "desc" }, - { field: "owner_id", order: "asc" } - ], - grouping: { fields: [{ field: "period_label", order: "desc" }] }, - pagination: { pageSize: 50 }, - appearance: { allowedVisualizations: ["grid"] } - }, - listViews: { - this_quarter_forecasts: { - name: "this_quarter_forecasts", - type: "grid", - // The label promises the CURRENT quarter, and the filter delivers it. - // - // The restriction was dropped in #515 on the measurement that "the list - // data path resolves no date macro". That measurement was taken on - // @objectstack 16.1.0 and has since expired: `resolveFilterTokens()` was - // wired into the ObjectQL READ path in 17.0.0-rc.0 (objectql - // `feat(filters): evaluate {filter-token} placeholders server-side`, - // #3582) — `find`/`findOne`/`count`/`aggregate`, ahead of the middleware - // chain, which is the one gate every server-side read passes through, - // saved-view filters included. Measured rather than inferred; - // `test/forecast-current-quarter-view.test.ts` runs THIS filter through a - // real engine and pins the three-way outcome (one quarter selected, not - // zero and not all of them). First taken on 17.0.0-rc.2, RE-RUN - // 2026-09-03 on 17.2.0 (#1467), RE-RUN on 17.3.0 (#1676, after the PR - // #1577 bump) and RE-RUN again on 17.4.0 (#1883, after the PR #1814 - // bump), green all four times. Not yet re-run on 17.5.0; the test is - // what re-takes the reading on each new pin. - // - // Both halves of the key are load-bearing, same as the quota-attainment - // widget in `src/sales/dashboards/sales.dashboard.ts`: `period: 'quarter'` - // alone returns every quarter ever snapshotted (the #730 defect), and - // `period_start` alone merges the quarter row with the MONTH row that - // opens the same quarter — Q3 and July both start on the 1st. - // - // The old `{this_quarter_start}` spelling is not merely unresolved now, - // it is rejected: the resolver throws `Unresolvable filter placeholder` - // and names `{current_quarter_start}` as the fix, so the silent-empty - // failure mode that removal was reacting to is no longer reachable. - label: "This Quarter", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_forecast" }, - columns: ["owner_id", "quota", "closed_amount", "commit_amount", "best_case_amount", "pipeline_amount", "attainment_pct", "coverage_ratio"], - filter: [ - { field: "period", operator: "equals", value: "quarter" }, - { field: "period_start", operator: "equals", value: "{current_quarter_start}" } - ], - // One sort key, because the filter pins `period_start` to a single value - // — the `period_start desc` key that ranked quarters against each other - // existed only to float the current quarter to the top of an unscoped - // list, and is provably inert now that the list holds one quarter. - // - // The tiebreaker is NOT `attainment_pct desc`, which is a FORMULA — the - // engine computes it in JS after the query, so the data engine never saw - // that sort key and the ordering within a quarter was arbitrary (same - // class of defect as #489's `days_in_stage` filter). `closed_amount` is - // the stored numerator behind attainment and ranks the same direction. - sort: [ - { field: "closed_amount", order: "desc" } - ], - // Empty is the honest state, and it needs to say so. The seeds ship no - // current-quarter row on purpose (#702 — the sweep owns that window, and - // two producers in one window is what left a phantom ownerless - // duplicate), so on a fresh install this view is empty until the 03:00 - // `forecast_snapshot` sweep has run once. That is the same trade the - // quota-attainment widget already takes; without this copy the user - // cannot tell it apart from a broken view. - emptyState: { - title: "This Quarter Has No Snapshots Yet", - message: "Quarterly snapshots are written by the nightly forecast sweep. Until it has run once for the current quarter this view is empty \u2014 settled quarters are on the All tab.", - icon: "calendar" - } - }, - my_forecast: { - name: "my_forecast", - type: "grid", - label: "My Forecast", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_forecast" }, - columns: ["period_label", "snapshot_date", "quota", "closed_amount", "commit_amount", "pipeline_amount", "attainment_pct"], - // `{current_user_id}` is the only user token the view runtime resolves - // (`{current_user}` silently never matches). - filter: [{ field: "owner_id", operator: "equals", value: "{current_user_id}" }], - sort: [{ field: "period_start", order: "desc" }] - } - }, - form: { - type: "simple", - sections: [ - { - name: "snapshot", - label: "Snapshot", - columns: 2, - fields: ["owner_id", "period", "period_start", "period_end", "period_label", "snapshot_date", "source"] - }, - { - name: "amounts", - label: "Amounts", - columns: 2, - fields: ["quota", "closed_amount", "commit_amount", "best_case_amount", "pipeline_amount", "expected_amount", "attainment_pct", "coverage_ratio"] - }, - { - name: "notes", - label: "Notes", - columns: 1, - fields: ["notes"] - } - ] - } -}); - -// src/revenue/views/index.ts -var views_exports2 = {}; -__export(views_exports2, { - ContractViews: () => ContractViews, - ProductViews: () => ProductViews, - QuoteViews: () => QuoteViews -}); - -// src/revenue/views/contract.view.ts -import { defineView as defineView11 } from "@objectstack/spec/ui"; -var ContractViews = defineView11({ - list: { - type: "grid", - name: "all_contracts", - label: "All Contracts", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_contract" }, - columns: [ - { field: "contract_number", width: 150, link: true, pinned: "left" }, - { field: "crm_account", width: 200 }, - { field: "crm_opportunity", width: 200 }, - { field: "status", width: 130, sortable: true }, - { field: "contract_value", width: 140, align: "right", summary: "sum" }, - { field: "contract_term_months", width: 130, align: "right" }, - { field: "start_date", width: 130, sortable: true }, - { field: "end_date", width: 130, sortable: true }, - { field: "auto_renewal", width: 110, align: "center" }, - { field: "owner_id", width: 150 } - ], - sort: [{ field: "end_date", order: "asc" }], - pagination: { pageSize: 25 }, - selection: { type: "multiple" }, - appearance: { - allowedVisualizations: ["grid", "calendar", "gantt", "timeline"] - }, - // Binds the 'calendar' entry above: renewal dates, same as the dedicated - // `renewal_calendar` view and the field this list sorts by. A contract - // calendar answers "what renews when" — the start -> end term SPAN is - // already carried by `contract_gantt` and `contract_timeline`, which is - // why `end_date` is the start of the event here rather than an end. - calendar: { - startDateField: "end_date", - titleField: "contract_number", - colorField: "status" - } - }, - listViews: { - /** Renewal calendar (highlights upcoming end dates) */ - renewal_calendar: { - name: "renewal_calendar", - type: "calendar", - label: "Renewal Calendar", - data: { provider: "object", object: "crm_contract" }, - columns: ["contract_number", "crm_account", "status"], - calendar: { - startDateField: "end_date", - titleField: "contract_number", - colorField: "status" - } - }, - /** Contract terms gantt */ - contract_gantt: { - name: "contract_gantt", - type: "gantt", - label: "Contract Terms", - data: { provider: "object", object: "crm_contract" }, - columns: ["contract_number", "crm_account", "contract_value"], - gantt: { - startDateField: "start_date", - endDateField: "end_date", - titleField: "contract_number" - } - }, - /** Chronological timeline */ - contract_timeline: { - name: "contract_timeline", - type: "timeline", - label: "Contract Timeline", - data: { provider: "object", object: "crm_contract" }, - columns: ["contract_number", "crm_account"], - timeline: { - startDateField: "start_date", - endDateField: "end_date", - titleField: "contract_number", - groupByField: "crm_account", - colorField: "status", - scale: "quarter" - } - } - }, - form: { - type: "tabbed", - sections: [ - { - name: "parties", - label: "Parties", - columns: 2, - fields: ["contract_number", "crm_account", "crm_contact", "crm_opportunity", "owner_id", "status"] - }, - { - // Named `contract_terms`, not `terms` — `terms` is already a distinct - // fieldGroup key on `crm_contract` ("Terms & Dates"), and reusing it - // here would make this section's translated heading follow that - // group's wording instead of its own "Terms". - name: "contract_terms", - label: "Terms", - columns: 2, - fields: [ - "contract_term_months", - "start_date", - "end_date", - "contract_value", - "billing_frequency", - "payment_terms", - "auto_renewal", - "renewal_notice_days" - ] - }, - { - name: "signing_and_documents", - label: "Signing & Documents", - columns: 2, - fields: ["signed_date", "signed_by", "document_url"] - }, - { - // The contract's two markdown bodies, together and in the order a - // reader needs them — the question #1826 asked this form to answer. - // They are not redundant, and `content/docs/revenue/contracts.mdx` - // already rules which is which: **Description** is the plain summary - // of what this contract is (declared on the `basic` group, listed - // there under "Contract Information"), while **Special Terms** is - // where every free-text TERM goes — the doc sends renewal - // instructions, an unlisted billing cadence and an unlisted payment - // arrangement to Special Terms by name, three separate times. - // Description was the one field in that inventory no form offered, so - // the summary a reader was told the record carries could not be - // written. One column, because both are long-form. - name: "notes", - label: "Notes", - columns: 1, - fields: ["description", "special_terms", "billing_address"] - } - ] - } -}); - -// src/revenue/views/product.view.ts -import { defineView as defineView12 } from "@objectstack/spec/ui"; -var ProductViews = defineView12({ - list: { - type: "grid", - name: "all_products", - label: "All Products", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_product" }, - columns: [ - { field: "product_code", width: 140, link: true, pinned: "left" }, - { field: "name", width: 240, sortable: true }, - { field: "category", width: 140 }, - { field: "family", width: 140 }, - { field: "sku", width: 140 }, - { field: "list_price", width: 130, align: "right", summary: "avg" }, - { field: "cost", width: 130, align: "right" }, - { field: "is_active", width: 100, align: "center" } - ], - sort: [{ field: "name", order: "asc" }], - grouping: { fields: [{ field: "category", order: "asc" }] }, - pagination: { pageSize: 50 }, - selection: { type: "multiple" }, - appearance: { - allowedVisualizations: ["grid", "gallery"] - } - }, - listViews: { - /** Visual catalog */ - product_catalog: { - name: "product_catalog", - type: "gallery", - label: "Product Catalog", - data: { provider: "object", object: "crm_product" }, - columns: ["name", "category", "list_price"], - gallery: { - coverField: "image", - coverFit: "cover", - cardSize: "medium", - titleField: "name", - visibleFields: ["product_code", "category", "family", "list_price", "sku"] - } - } - }, - form: { - type: "simple", - sections: [ - { - name: "product_info", - label: "Product Info", - columns: 2, - fields: [ - "product_code", - { field: "name", required: true, span: "full" }, - "category", - "family", - "sku", - "product_manager", - "is_active" - ] - }, - { - name: "pricing_info", - label: "Pricing", - columns: 2, - fields: ["list_price", "cost"] - }, - { - name: "media", - label: "Media", - columns: 1, - fields: ["image", "datasheet", "description"] - } - ] - } -}); - -// src/revenue/views/quote.view.ts -import { defineView as defineView13 } from "@objectstack/spec/ui"; -var QuoteViews = defineView13({ - list: { - type: "grid", - name: "all_quotes", - label: "All Quotes", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_quote" }, - columns: [ - { field: "quote_number", width: 140, link: true, pinned: "left" }, - { field: "crm_account", width: 200 }, - { field: "crm_opportunity", width: 200 }, - { field: "status", width: 130, sortable: true }, - { field: "quote_date", width: 130, sortable: true }, - { field: "expiration_date", width: 140, sortable: true }, - { field: "subtotal", width: 130, align: "right", summary: "sum" }, - { field: "discount", width: 110, align: "right" }, - { field: "tax", width: 110, align: "right", summary: "sum" }, - { field: "total_price", width: 140, align: "right", summary: "sum" }, - { field: "owner_id", width: 150 } - ], - sort: [{ field: "quote_date", order: "desc" }], - pagination: { pageSize: 25 }, - selection: { type: "multiple" }, - appearance: { - allowedVisualizations: ["grid", "kanban", "calendar"] - }, - // Binds the 'calendar' entry above: the same span the dedicated - // `quote_calendar` view shows. `quote_date` and `expiration_date` are both - // required + notNull on crm_quote, so every quote lands on a real window. - calendar: { - startDateField: "quote_date", - endDateField: "expiration_date", - titleField: "quote_number", - colorField: "status" - } - }, - listViews: { - /** Quote workflow board */ - quote_pipeline: { - name: "quote_pipeline", - type: "kanban", - label: "Quote Pipeline", - data: { provider: "object", object: "crm_quote" }, - columns: ["quote_number", "crm_account", "total_price", "expiration_date"], - kanban: { - groupByField: "status", - summarizeField: "total_price", - columns: ["quote_number", "crm_account", "total_price", "expiration_date"] - } - }, - /** Quote-date calendar */ - quote_calendar: { - name: "quote_calendar", - type: "calendar", - label: "Quote Calendar", - data: { provider: "object", object: "crm_quote" }, - columns: ["quote_number", "crm_account", "total_price"], - calendar: { - startDateField: "quote_date", - endDateField: "expiration_date", - titleField: "quote_number", - colorField: "status" - } - } - }, - form: { - type: "tabbed", - sections: [ - { - name: "quote", - label: "Quote", - columns: 2, - // `name` is required on crm_quote with no default — omitting it made - // quote creation through this form impossible. - fields: [{ field: "name", required: true, span: "full" }, "quote_number", "crm_account", "crm_contact", "crm_opportunity", "owner_id", "status", "quote_date", "expiration_date"] - }, - { - name: "totals", - label: "Totals", - columns: 2, - fields: ["subtotal", "discount", "discount_amount", "tax", "shipping_handling", "total_price"] - }, - { - // Named `quote_terms`, not `terms` — `terms` is already a distinct - // fieldGroup key on `crm_quote` ("Terms & Validity"), and reusing it - // here would make this section's translated heading follow that - // group's wording instead of its own "Terms". - name: "quote_terms", - label: "Terms", - columns: 2, - fields: ["payment_terms", "shipping_terms"] - }, - { - name: "addresses_and_notes", - label: "Addresses & Notes", - columns: 1, - fields: ["billing_address", "shipping_address", "internal_notes"] - } - ] - } -}); - -// src/marketing/views/index.ts -var views_exports3 = {}; -__export(views_exports3, { - CampaignViews: () => CampaignViews -}); - -// src/marketing/views/campaign.view.ts -import { defineView as defineView14 } from "@objectstack/spec/ui"; -var CampaignViews = defineView14({ - list: { - type: "grid", - name: "all_campaigns", - label: "All Campaigns", - userActions: { editInline: true }, - data: { provider: "object", object: "crm_campaign" }, - columns: [ - { field: "name", width: 240, sortable: true, link: true, pinned: "left" }, - { field: "channel", width: 130 }, - { field: "status", width: 130, sortable: true }, - { field: "start_date", width: 130, sortable: true }, - { field: "end_date", width: 130, sortable: true }, - { field: "budgeted_cost", width: 140, align: "right", summary: "sum" }, - { field: "expected_revenue", width: 160, align: "right", summary: "sum" } - ], - sort: [{ field: "start_date", order: "asc" }], - pagination: { pageSize: 25 }, - selection: { type: "multiple" }, - appearance: { - showDescription: true, - allowedVisualizations: ["grid", "gantt", "calendar", "timeline"] - }, - // Binds the 'calendar' entry above: the switcher opens the same schedule - // the dedicated `campaign_calendar` view shows. Both dates are required + - // notNull on crm_campaign, so every campaign spans a truthful range. - calendar: { - startDateField: "start_date", - endDateField: "end_date", - titleField: "name", - colorField: "channel" - } - }, - listViews: { - /** Campaign schedule */ - campaign_gantt: { - name: "campaign_gantt", - type: "gantt", - label: "Campaign Schedule", - data: { provider: "object", object: "crm_campaign" }, - columns: ["name", "channel"], - gantt: { - startDateField: "start_date", - endDateField: "end_date", - titleField: "name" - } - }, - /** Launch calendar */ - campaign_calendar: { - name: "campaign_calendar", - type: "calendar", - label: "Launch Calendar", - data: { provider: "object", object: "crm_campaign" }, - columns: ["name", "channel", "status"], - calendar: { - startDateField: "start_date", - endDateField: "end_date", - titleField: "name", - colorField: "channel" - } - }, - /** Marketing timeline */ - campaign_timeline: { - name: "campaign_timeline", - type: "timeline", - label: "Marketing Timeline", - data: { provider: "object", object: "crm_campaign" }, - // The list data source projects configured columns. Keep the date - // fields in that projection so the timeline renderer can bucket and - // order campaigns from the same schedule data as the calendar/Gantt. - columns: ["name", "channel", "start_date", "end_date"], - timeline: { - startDateField: "start_date", - endDateField: "end_date", - titleField: "name", - groupByField: "channel", - colorField: "status", - scale: "month" - } - } - }, - form: { - type: "tabbed", - sections: [ - { - // Every form section here carries a `name` matching the object's - // fieldGroup key, so the heading resolves through - // `objects.crm_campaign._sections..label` in all four packs. A - // nameless section has no key a bundle can carry and renders its - // English label in every locale — the platform warns about exactly this - // during `objectstack validate`, and this form was carrying four of - // those warnings before the #597 restructure gave it a reason to move. - name: "basic", - label: "Campaign Information", - columns: 2, - fields: [ - { field: "name", required: true, span: "full" }, - "campaign_code", - "type", - "channel", - { field: "status", required: true }, - "owner_id", - "is_active", - "landing_page_url", - // The markdown body of the campaign brief. Declared on the `basic` - // group and filled by seven of the seed campaigns, but omitted from - // this enumeration — so the only surface that could show it did not, - // and a marketer could neither read nor write the brief they wrote. - { field: "description", span: "full" } - ] - }, - { - name: "schedule", - label: "Schedule", - columns: 2, - fields: ["start_date", "end_date"] - }, - { - /** - * Budget & ROI — a SECTION OF ITS OWN, deliberately (#597). - * - * `budgeted_cost` and `actual_cost` are the only two campaign numbers - * that are manual-entry by design: nothing on the platform knows what a - * trade-show booth cost. They used to sit seventh and eighth in a - * seven-field "Schedule & Budget" row, below the dates and beside two - * revenue figures one of which the metric hooks own — so the two fields - * a marketer must type were the least visible things on the form, and - * `actual_cost` in particular went untyped. - * - * That is not a cosmetic complaint: `roi` divides by `actual_cost`, and - * its formula answers a flat `0.0` for any campaign where that field is - * blank. An empty cost field renders as 0% ROI on every campaign — the - * one number the whole Performance section exists to produce, reading - * as a real measurement rather than as missing input. - * - * So the costs get their own heading, and `roi` is displayed HERE with - * them rather than at the bottom of Performance, where its dependency - * on two fields three sections away was invisible. The heading matches - * the object's `budget` fieldGroup, so the form and the detail page - * agree on what this group is called. - */ - name: "budget", - label: "Budget & ROI", - columns: 2, - fields: ["budgeted_cost", "actual_cost", "expected_revenue", "actual_revenue", "roi"] - }, - { - name: "metrics", - label: "Performance", - columns: 2, - fields: [ - "target_size", - "num_sent", - "num_responses", - "num_leads", - "num_converted_leads", - "num_opportunities", - "num_won_opportunities", - "response_rate" - ] - } - ] - } -}); - -// src/sales/pages/index.ts -var pages_exports = {}; -__export(pages_exports, { - AccountDetailPage: () => AccountDetailPage, - AccountWorkbenchPage: () => AccountWorkbenchPage, - AppLauncherPage: () => AppLauncherPage, - LeadDetailPage: () => LeadDetailPage, - OpportunityDetailPage: () => OpportunityDetailPage, - SalesHomePage: () => SalesHomePage, - UtilityBarPage: () => UtilityBarPage -}); - -// src/sales/pages/lead_detail.page.ts -import { P as P25 } from "@objectstack/spec"; -var LeadDetailPage = { - name: "lead_detail_page", - label: "Lead Detail", - description: "Comprehensive lead detail page with highlights, details, and related information", - type: "record", - object: "crm_lead", - // Template defines the overall layout structure. We use `full-width` - // (single column) because the previous `header-sidebar-main` layout - // sandwiched the highlights strip into a cramped sidebar with no other - // meaningful sidebar content — Salesforce Lightning record pages - // similarly default to a stacked column for medium-density objects. - template: "full-width", - kind: "full", - // Page-level state variables - variables: [ - { - name: "showHistory", - type: "boolean", - defaultValue: false - }, - { - name: "activeTab", - type: "string", - defaultValue: "details" - } - ], - // Regions correspond to slots in the template - regions: [ - { - name: "header", - width: "full", - components: [ - // Title + subtitle + icon, with record-level actions rendered - // inline in the header's action slot via the first-class - // `actions` property (no sibling node, no visual offset hack). - { - type: "page:header", - id: "lead_header", - label: "Lead Information", - properties: { - title: "{first_name} {last_name}", - subtitle: "{company}", - // `icon` removed from `page:header` in @objectstack/spec 17.0.0 - // (#6946, ADR-0087 D2) — deleted, not renamed. See the full note on - // `account_detail.page.ts`; nothing ever drew it. - // `breadcrumb` retired from `page:header` in @objectstack/spec 17.6.0 - // (#20785, `page-header-breadcrumb-removed`) — deleted: no renderer - // ever drew a trail for it; the app shell's own trail is unchanged. - // Convert is the outcome; scheduling the next touch is the daily - // act. Both belong in the header — the follow-up used to be four - // clicks deep in the Related tab. - // - // The three activity actions are listed EXPLICITLY (#592): a custom - // record page replaces the synthesized header, so an object-scoped - // action that is not named here is unreachable from the record — - // only the list-row ⋮ menu can fire it. Logging the call you just - // made is the single most frequent thing a rep does on a lead, and - // it was two navigations away. - // - // Action IDs, not `ActionDef` objects: `PageHeaderProps.actions` is - // `z.array(z.string())` ("Action IDs to show in header") in - // @objectstack/spec 17.3.0, and this repo authors against the - // protocol (#1653). Each id is the `name` of a crm_lead-scoped - // action — `convert_lead` / `schedule_followup` in - // `src/sales/actions/lead.actions.ts`, the activity trio in - // `src/sales/actions/activity-actions.ts`. - actions: [ - "convert_lead", - "schedule_followup", - "log_call", - "log_meeting", - "schedule_meeting" - ] - } - }, - // Duplicate banners — ONE PER VERDICT (#1207 · widened by #1289 · - // split by #1628). - // - // `lead_duplicate_check` (lead.hook.ts, job 2) already writes - // `duplicate_status: 'suspected'` and links the record the lead repeats - // — the flag existed, and this page never read it. A rep opened a - // flagged lead, saw a page identical to a clean one, and converted it - // into a second account, contact and opportunity. These banners and the - // `duplicates` section on the Details tab are the record-page half of - // that fix — the banner is the alarm, the section is the link to - // compare against; the conversion screen carries the other half. - // - // ## Why there are TWO of them (#1628) - // - // #1207 shipped one banner gated on `== "suspected"`, which left the - // STRONGER state silent. #1289 widened the predicate to every verdict - // and, being one component, had to pick copy that named NEITHER state: - // a `record:alert` carries a single `visible` and a single title/body - // pair, and `pickLocalized` picks by LANGUAGE, not by row — so naming - // one verdict would have mislabelled every lead in the other. - // - // That was correct for one banner, and it is why one banner is not - // enough. Since #1288 the two verdicts have OPPOSITE next steps: - // - // suspected — the intake hook's guess. Conversion PROCEEDS; the rep - // should compare against the linked record first. - // confirmed — a reviewer's verdict. Conversion is REFUSED outright - // (`lead-conversion.flow.ts`, `refuse_confirmed_duplicate`). - // - // One sentence cannot state either without being false for the other, - // so it stated neither, and the rep had to scroll to the Duplicate - // Status chip to learn which situation they were in. A banner that - // announces something is wrong but not what to do is not doing the one - // job a banner has. Two components, two predicates, two next steps. - // - // ⚠️ Two sibling `record:alert` nodes really do BOTH render: a region - // renders as `components.map((node, i) => )` — read out of the shipped console bundle at the - // `.objectui-sha` pin — so each is mounted separately and evaluates its - // own `visible` against the same row. Their `id`s are their React keys, - // which is why the two ids differ rather than sharing one. - // - // ⚠️ `visible` is the ONE record component whose PROPS carry a real row - // predicate: `record-alert.tsx` evaluates `properties.visible` through - // `toPredicateInput` + `useCondition` against the row - // (`usePredicateRecordContext`), the same pipeline as an action button. - // A node-level `visibleWhen` is a different gate one tier up, - // evaluated by `SchemaRenderer`, and the two compose as AND. Measured - // on the 17.6.0 pin (#1887), that tier binds the page's row as - // `record` too (objectui#5454): this same predicate, moved there, - // gated correctly in both directions. `visible` stays because it is - // the gate `record:alert` declares in its own props. - // - // ⚠️ `has()` is load-bearing, and this surface is the WORST of the four - // this repo measures (cf. `test/view-predicate-dialect.test.ts`): the - // renderer's call site is FAIL-SOFT — an unevaluable predicate answers - // SHOWN. So a bare `record.duplicate_status == "suspected"` would abort - // with `No such key` on every clean lead whose driver omits the column - // (`driver-memory` / `driver-mongodb`; `driver-sql` returns it as null) - // and put a duplicate warning on leads that are not duplicates. The - // guard is what makes the predicate answer `false` instead of faulting. - // Pinned on the real engine in `test/lead-duplicate-visibility.test.ts`. - // - // ⛔ And the guard is NOT the whole predicate — `has()` ALONE is wrong - // here, in either shape. It is TRUE for a key that is PRESENT AND NULL, - // which is precisely what `driver-sql` hands back for a clean lead - // (measured: `has(record.duplicate_status)` against - // `{ duplicate_status: null }` answers `{ ok: true, value: true }`), so - // the guard needs a comparison beside it or the banner cries wolf on - // every clean lead. #1289, covering both verdicts at once, spelled that - // comparison `&& … != null`. A per-verdict banner spells it with the - // EQUALITY, which is strictly narrower and subsumes it: measured on - // this engine, `null == "suspected"` is a clean `false`, not a fault, - // and the two spellings agree on every record shape a driver can - // produce. Both halves of the shape #1289 ruled for are intact — the - // `has()` guard verbatim, and a comparison that makes "set" mean set — - // and the comparison got STRICTER, which is the point of the split. The - // same spelling already ships one file over, on this same field: the - // conversion flow's `e21` / `e25` edges (#1288) read - // `has(vars.leadRecord.duplicate_status) && … == "suspected"`. - // - // ⛔ Neither half may be simplified away. Both are pinned, shape by - // shape, including the reverse pin that the unguarded tail really does - // fault. - // - // `P` — an explicit `{ dialect: 'cel' }` envelope — is not decoration - // either: `ExpressionEvaluator.evaluateCondition` routes ONLY the - // envelope to `@objectstack/formula`'s CEL engine, where `has()` is a - // real function; a bare string takes the legacy JS path, whose - // `FormulaFunctions` has no CEL `has()`, so the guard would itself be - // the fault that fails soft to visible. - // - // `title` / `body` carry inline locale maps rather than plain strings: - // this renderer resolves both through `pickLocalized(…, language)` - // (the same capability `opportunity_detail.page.ts` records under - // #972), and `body` has no other channel — the i18n extractor's - // per-component copy keys (`PAGE_COMPONENT_COPY_KEYS`, read on 17.6.0) - // are title/description/label/placeholder/emptyText, so a plain-string - // `body` would ship English to all four locales. Keeping both halves of one banner's copy in one - // place beats splitting `title` into the locale packs. - // - // ⭐ Each banner's copy NAMES ITS OWN VERDICT, in the vocabulary the - // `duplicate_status` chip below publishes, and never the other one — - // pinned against the option labels read out of the locale packs in - // `test/lead-duplicate-visibility.test.ts`, so renaming an option - // re-aims the assertion rather than retiring it. - { - type: "record:alert", - id: "lead_duplicate_alert_suspected", - label: "Suspected Duplicate Alert", - properties: { - // `warning`, not `error`: conversion still PROCEEDS on this - // verdict, and the renderer maps `error` to `role="alert"` / - // `aria-live="assertive"` — an interruption this state has not - // earned. - severity: "warning", - visible: P25`has(record.duplicate_status) && record.duplicate_status == "suspected"`, - title: { - en: "Suspected duplicate \u2014 compare before you convert", - "zh-CN": "\u7591\u4F3C\u91CD\u590D\u2014\u2014\u8F6C\u6362\u524D\u8BF7\u5148\u6BD4\u5BF9", - "ja-JP": "\u91CD\u8907\u306E\u7591\u3044 \u2014 \u5909\u63DB\u3059\u308B\u524D\u306B\u7167\u5408\u3057\u3066\u304F\u3060\u3055\u3044", - "es-ES": "Duplicado Sospechoso: compare antes de convertir" - }, - body: { - en: "Intake matched this lead to a record this app already has. Duplicate Management below links that record \u2014 open it and compare. You can still convert this lead: this is the match intake guessed at, not a reviewer's decision. But if it is the same buyer, disqualify it instead, because converting creates a second account, contact and opportunity for them.", - "zh-CN": "\u5F55\u5165\u65F6\u53D1\u73B0\u8BE5\u7EBF\u7D22\u4E0E\u7CFB\u7EDF\u4E2D\u5DF2\u6709\u8BB0\u5F55\u5339\u914D\u3002\u4E0B\u65B9\u300C\u91CD\u590D\u7EBF\u7D22\u7BA1\u7406\u300D\u4E2D\u662F\u5B83\u91CD\u590D\u7684\u90A3\u6761\u8BB0\u5F55\uFF0C\u8BF7\u5148\u6253\u5F00\u6BD4\u5BF9\u3002\u8BE5\u7EBF\u7D22\u4ECD\u7136\u53EF\u4EE5\u8F6C\u6362\uFF1A\u8FD9\u662F\u5F55\u5165\u65F6\u7684\u81EA\u52A8\u5224\u65AD\uFF0C\u4E0D\u662F\u5BA1\u6838\u4EBA\u7684\u7ED3\u8BBA\u3002\u4F46\u82E5\u786E\u5C5E\u540C\u4E00\u5BA2\u6237\uFF0C\u8BF7\u6539\u4E3A\u53D6\u6D88\u8D44\u683C\u2014\u2014\u8F6C\u6362\u4F1A\u4E3A\u540C\u4E00\u5BA2\u6237\u518D\u521B\u5EFA\u4E00\u5957\u5BA2\u6237\u3001\u8054\u7CFB\u4EBA\u548C\u5546\u673A\u3002", - "ja-JP": "\u767B\u9332\u6642\u306B\u3001\u3053\u306E\u30EA\u30FC\u30C9\u304C\u65E2\u5B58\u30EC\u30B3\u30FC\u30C9\u3068\u4E00\u81F4\u3057\u307E\u3057\u305F\u3002\u4E0B\u306E\u300C\u91CD\u8907\u7BA1\u7406\u300D\u306B\u91CD\u8907\u5148\u306E\u30EC\u30B3\u30FC\u30C9\u304C\u3042\u308A\u307E\u3059\u3002\u307E\u305A\u958B\u3044\u3066\u7167\u5408\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u3053\u306E\u30EA\u30FC\u30C9\u306F\u307E\u3060\u5909\u63DB\u3067\u304D\u307E\u3059\u3002\u3053\u308C\u306F\u767B\u9332\u6642\u306E\u81EA\u52D5\u5224\u5B9A\u3067\u3042\u308A\u3001\u62C5\u5F53\u8005\u306E\u7D50\u8AD6\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u305F\u3060\u3057\u540C\u3058\u76F8\u624B\u3067\u3042\u308C\u3070\u3001\u5909\u63DB\u305B\u305A\u4E0D\u9069\u683C\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u5909\u63DB\u3059\u308B\u3068\u540C\u3058\u76F8\u624B\u306B\u53D6\u5F15\u5148\u30FB\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u30FB\u5546\u8AC7\u304C\u3082\u3046\u4E00\u7D44\u4F5C\u6210\u3055\u308C\u307E\u3059\u3002", - "es-ES": "La captura encontr\xF3 que este prospecto coincide con un registro que ya existe. Gesti\xF3n de Duplicados, m\xE1s abajo, enlaza ese registro: \xE1bralo y comp\xE1relo. Todav\xEDa puede convertir este prospecto, porque se trata de una coincidencia autom\xE1tica de la captura y no del veredicto de una persona. Pero si es el mismo comprador, descalif\xEDquelo en su lugar: convertirlo crea una segunda cuenta, contacto y oportunidad para \xE9l." - } - } - }, - { - type: "record:alert", - id: "lead_duplicate_alert_confirmed", - label: "Confirmed Duplicate Alert", - properties: { - // `error`, and the level is the message: this is the state on which - // the app REFUSES the rep's next click, and the renderer gives - // `error` `role="alert"` / `aria-live="assertive"` rather than the - // polite `role="status"` every other level gets. ⛔ The severity is - // presentation only — what the app refuses was ruled by #1288 and - // shipped by PR #1555, and nothing here changes it. - severity: "error", - visible: P25`has(record.duplicate_status) && record.duplicate_status == "confirmed"`, - title: { - en: "Confirmed duplicate \u2014 conversion will be refused", - "zh-CN": "\u5DF2\u786E\u8BA4\u91CD\u590D\u2014\u2014\u8F6C\u6362\u5C06\u88AB\u62D2\u7EDD", - "ja-JP": "\u91CD\u8907\u78BA\u5B9A \u2014 \u5909\u63DB\u306F\u62D2\u5426\u3055\u308C\u307E\u3059", - "es-ES": "Duplicado Confirmado: la conversi\xF3n ser\xE1 rechazada" - }, - body: { - // ⭐ The only place a rep learns the Convert button will refuse - // them BEFORE they press it — until this banner, the refusal - // dialog was the first they heard of it. - en: "A reviewer checked this lead and recorded that it repeats a record this app already has, so Convert Lead refuses it \u2014 this banner is the only warning you get before you press the button. Disqualify this lead instead, naming the surviving record from Duplicate Management below. If the verdict is wrong, a reviewer revises Duplicate Status; there is no override here.", - "zh-CN": "\u5BA1\u6838\u4EBA\u5DF2\u6838\u5B9E\u8BE5\u7EBF\u7D22\u4E0E\u7CFB\u7EDF\u4E2D\u5DF2\u6709\u8BB0\u5F55\u91CD\u590D\uFF0C\u56E0\u6B64\u300C\u8F6C\u6362\u7EBF\u7D22\u300D\u4F1A\u62D2\u7EDD\u6267\u884C\u2014\u2014\u672C\u63D0\u793A\u662F\u4F60\u6309\u4E0B\u6309\u94AE\u524D\u552F\u4E00\u7684\u9884\u8B66\u3002\u8BF7\u6539\u4E3A\u53D6\u6D88\u8BE5\u7EBF\u7D22\u7684\u8D44\u683C\uFF0C\u5E76\u5728\u4E0B\u65B9\u300C\u91CD\u590D\u7EBF\u7D22\u7BA1\u7406\u300D\u4E2D\u6CE8\u660E\u4FDD\u7559\u7684\u90A3\u6761\u8BB0\u5F55\u3002\u82E5\u5224\u5B9A\u6709\u8BEF\uFF0C\u5E94\u7531\u5BA1\u6838\u4EBA\u4FEE\u6539\u300C\u91CD\u590D\u72B6\u6001\u300D\uFF0C\u6B64\u5904\u4E0D\u63D0\u4F9B\u5F3A\u5236\u8F6C\u6362\u7684\u5165\u53E3\u3002", - "ja-JP": "\u62C5\u5F53\u8005\u304C\u78BA\u8A8D\u3057\u3001\u3053\u306E\u30EA\u30FC\u30C9\u306F\u65E2\u5B58\u30EC\u30B3\u30FC\u30C9\u306E\u91CD\u8907\u3067\u3042\u308B\u3068\u8A18\u9332\u3055\u308C\u307E\u3057\u305F\u3002\u305D\u306E\u305F\u3081\u300C\u30EA\u30FC\u30C9\u5909\u63DB\u300D\u306F\u62D2\u5426\u3055\u308C\u307E\u3059\u3002\u3053\u306E\u901A\u77E5\u304C\u3001\u30DC\u30BF\u30F3\u3092\u62BC\u3059\u524D\u306B\u5F97\u3089\u308C\u308B\u552F\u4E00\u306E\u8B66\u544A\u3067\u3059\u3002\u3053\u306E\u30EA\u30FC\u30C9\u306F\u4E0D\u9069\u683C\u306B\u3057\u305F\u3046\u3048\u3067\u3001\u4E0B\u306E\u300C\u91CD\u8907\u7BA1\u7406\u300D\u3067\u6B8B\u3059\u30EC\u30B3\u30FC\u30C9\u3092\u660E\u8A18\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u5224\u5B9A\u304C\u8AA4\u3063\u3066\u3044\u308B\u5834\u5408\u306F\u62C5\u5F53\u8005\u304C\u300C\u91CD\u8907\u30B9\u30C6\u30FC\u30BF\u30B9\u300D\u3092\u4FEE\u6B63\u3057\u307E\u3059\u3002\u3053\u3053\u306B\u5F37\u5236\u5909\u63DB\u306E\u624B\u6BB5\u306F\u3042\u308A\u307E\u305B\u3093\u3002", - "es-ES": "Una persona verific\xF3 que este prospecto repite un registro que ya existe, por lo que Convertir Prospecto lo rechazar\xE1: este aviso es la \xFAnica advertencia antes de pulsar el bot\xF3n. Descalifique el prospecto e indique el registro que sobrevive desde Gesti\xF3n de Duplicados, m\xE1s abajo. Si el veredicto es incorrecto, una persona debe cambiar el Estado del Duplicado; aqu\xED no hay forma de forzar la conversi\xF3n." - } - } - }, - // Salesforce-style Highlights Panel: a horizontal strip of the - // most-important key facts directly under the header. Pulled out - // of the sidebar so it can use the full page width. - { - type: "record:highlights", - id: "lead_highlights", - label: "Key Information", - properties: { - fields: ["status", "rating", "lead_source", "owner_id", "email", "phone"] - } - }, - { - type: "record:path", - id: "lead_path", - label: "Lead Status Path", - properties: { - statusField: "status", - // `converted` is the terminal WIN state and must be on the path — - // without it the strip reads as if "Unqualified" were the goal, and - // a converted lead had no stage to light up at all. - stages: [ - { value: "new", label: "New" }, - { value: "contacted", label: "Contacted" }, - { value: "qualified", label: "Qualified" }, - { value: "converted", label: "Converted" }, - { value: "unqualified", label: "Unqualified" } - ] - } - } - ] - }, - { - name: "main", - width: "large", - components: [ - { - type: "page:tabs", - id: "main_tabs", - label: "Lead Information Tabs", - properties: { - // `type` → `tabStyle` (@objectstack/spec 17.0.0, #6776, ADR-0087 - // D2). Same three values; see the full note on `home.page.ts`. - tabStyle: "line", - position: "top", - items: [ - { - label: "Details", - icon: "info-circle", - children: [ - { - type: "record:details", - id: "lead_details", - label: "Lead Details", - properties: { - columns: "2", - // `layout` was REMOVED from `record:details` in - // @objectstack/spec 17.0.0 (#6946, ADR-0087 D2) and is - // deleted with no successor: its `auto` | `custom` - // semantics were never implemented. - // - // Every section is a GROUP REFERENCE (#806, maintainer - // ruling C, decision batch #21, 2026-09-03). `{ group }` - // names one of crm_lead's `fieldGroups`, and the renderer - // derives that section's members, label, icon and collapse - // state from the object (`deriveFieldGroupLayout`, - // ADR-0085 §5). Membership has ONE declaration site — the - // `group:` on each field in lead.object.ts — and this page - // curates only the ORDER, so a field added to a group shows - // up here with no edit to this file. ⛔ Do not enumerate - // `fields:` again, and do not restate a key the group owns - // (`name` / `label` / `icon` / `collapsible` / - // `defaultCollapsed`) beside `group`: the spec refuses both. - // - // ⛔ `sections` stays load-bearing. Omitting it renders an - // EMPTY Details tab, not a `fieldGroups` fallback (#806 R28 - // on 17.2.0, #1521); derivation is per section, through - // `group:`, never page-level. - // - // Measured on @objectstack/console 17.6.0 (#806 R70, - // headless Chromium, with a control leg; on 17.4.0 R61 - // measured this form crashing the component). What a - // group section does there is the renderer's, not ours: - // - it lays out its own column count (the page-level - // `columns` above does not reach it); - // - a group whose members are all empty renders nothing - // (`duplicates` on a clean lead), unless the section - // says `hideEmpty: false`; - // - members the highlights strip registered are dropped, - // so `assignment` (only `owner_id`) renders nothing on - // this page — the owner is in the strip; - // - a group declared `collapse: 'collapsed'` starts - // collapsed; changing that is a `fieldGroups` decision - // in lead.object.ts, not a key on this page. - // - // `hideEmpty: false` (#2003, the #1211 reasoning) sits on - // the groups whose every member a rep types and the - // create form asks for: `contact_info` (`mobile` and - // `website` once the strip takes `email` and `phone`), - // `address`, and `additional` (revenue, headcount, - // description, notes). Without it all three vanish on a - // fresh lead, so a rep cannot see what is left to fill. - // Not on `assignment`: its derived list is empty, and the - // renderer draws nothing for an empty list whatever - // `hideEmpty` says. Not on `duplicates`: the - // `lead_duplicate_check` hook writes it. - sections: [ - { group: "identity" }, - { group: "company_info" }, - { group: "contact_info", hideEmpty: false }, - // Do Not Call / Email Opt Out, right under the numbers - // a rep is about to dial (#806). - { group: "preferences" }, - { group: "qualification" }, - { group: "assignment" }, - { group: "address", hideEmpty: false }, - { group: "conversion" }, - // The LINK half of the duplicate banners (#1207): the - // group carries both survivor lookups, because - // `lead_duplicate_check` matches contacts before leads. - // On a clean lead every member is empty, so the section - // renders nothing. ⚠️ Not the highlights strip: - // `record:highlights` caps `fields` at 7 and holds 6. - { group: "duplicates" }, - // Description and Notes — kept last, where the page's - // Description section always sat. - { group: "additional", hideEmpty: false } - ] - } - } - ] - }, - { - label: "Related", - icon: "link", - children: [ - { - type: "page:accordion", - id: "related_accordion", - label: "Related Records", - properties: { - allowMultiple: true, - items: [ - { - label: "Tasks", - icon: "list-checks", - collapsed: false, - children: [ - { - type: "record:related_list", - id: "related_tasks", - label: "Tasks", - properties: { - objectName: "crm_task", - // crm_task links back through the polymorphic - // `related_to_lead` lookup; there is no `lead_id` - // column, so the old binding matched nothing and - // this list read "0" no matter how many follow-ups - // the rep had filed. - relationshipField: "related_to_lead", - columns: ["subject", "status", "priority", "due_date", "owner_id"], - sort: [ - { field: "due_date", order: "asc" } - ], - limit: 10, - title: "Open Tasks", - filter: [{ field: "status", operator: "not_equals", value: "completed" }], - showViewAll: true - } - } - ] - } - ] - } - } - ] - }, - { - label: "Activity", - icon: "clock", - children: [ - { - type: "record:activity", - id: "lead_activity", - label: "Activity Timeline", - properties: { - // `types` is keyed on FEED ITEM KIND, never on object name - // (#1209). The old `['crm_task']` was not one of the kinds - // the prop accepts, and nothing anywhere enforced that: the - // page schema's `properties` is an open bag - // (`z.record(z.string(), z.unknown())`) so the value was - // stored verbatim, and the renderer's own sanitiser drops - // members it does not recognise and then reads the EMPTY - // remainder as "no filter authored" — measured on the - // shipped bundle, `types: ['crm_task']`, `types: []` and - // omitting `types` all render the same unfiltered stream. - // That is why the tab showed `Created Lead` / `Updated - // Lead` audit rows, which the History tab already covers. - // - // What this component can actually show is `sys_activity` - // scoped to the record, through the renderer's own - // type map — measured, not inferred: - // - // sys_activity.type feed kind written by - // created/updated/… field_change platform audit - // system system platform - // completed task log_call / - // log_meeting / - // send_email - // scheduled (dropped) schedule_meeting - // - // So `task` is the kind that carries a rep's logged - // interactions, and it is the only reachable one worth - // filtering to. `event` is NOT added: it is a legal kind - // the prop accepts but no `sys_activity.type` maps to it, - // so it would be a declared value enforced by nothing. - // `scheduled` rows fall out of the map upstream — a - // platform gap, not something to work around here. - types: ["task"], - limit: 20, - // Load-bearing, not cosmetic: the renderer strips every - // `task` item BEFORE the `types` filter runs unless this is - // true, and `task` items are exactly the `completed` rows. - // `types: ['task']` with the old `showCompleted: false` - // renders an empty tab. - showCompleted: true - } - } - ] - }, - { - label: "History", - icon: "history", - children: [ - { - // `record:history` is the platform's own audit feed over the - // fields marked `trackHistory` (status / rating). Ownership - // moved to the platform's `owner_id` in #548, which carries no - // `trackHistory` flag — transfers land in the compliance audit - // log, not on this feed. - // The hand-rolled version queried an object named - // `field_history`, which this app does not define, so the - // tab could only ever render empty. - type: "record:history", - id: "lead_history", - label: "Field History", - properties: { - limit: 25 - } - } - ] - } - ] - } - } - ] - } - ], - // Make this the default page for leads - isDefault: true, - // ARIA accessibility - aria: { - ariaLabel: "Lead Detail Page", - ariaDescribedBy: "Detailed view of lead information with related records and activity" - } -}; - -// src/sales/pages/opportunity_detail.page.ts -var OpportunityDetailPage = { - name: "opportunity_detail_page", - label: "Opportunity Detail", - description: "Comprehensive opportunity detail page with path, highlights, details, and related lists", - type: "record", - object: "crm_opportunity", - template: "full-width", - kind: "full", - variables: [ - { name: "activeTab", type: "string", defaultValue: "details" } - ], - regions: [ - { - name: "header", - width: "full", - components: [ - { - type: "page:header", - id: "opp_header", - label: "Opportunity Information", - properties: { - title: "{name}", - // The lookup field is `crm_account` — `{account}` matched nothing - // and the subtitle rendered blank. - subtitle: "{crm_account}", - // `icon` removed from `page:header` in @objectstack/spec 17.0.0 - // (#6946, ADR-0087 D2) — deleted, not renamed. See the full note on - // `account_detail.page.ts`; nothing ever drew it. - // `breadcrumb` retired from `page:header` in @objectstack/spec 17.6.0 - // (#20785, `page-header-breadcrumb-removed`) — deleted: no renderer - // ever drew a trail for it; the app shell's own trail is unchanged. - // generate_quote is the CPQ entry point (opportunity → quote); a - // custom record page replaces the default header, so the action - // must be listed here explicitly or it is unreachable. The same - // sentence is why the three activity actions are named here (#592): - // without them a rep can log a call on the deal only from the list - // row's ⋮ menu, never from the deal itself. - // - // Action IDs, not `ActionDef` objects: `PageHeaderProps.actions` is - // `z.array(z.string())` ("Action IDs to show in header") in - // @objectstack/spec 17.3.0, and this repo authors against the - // protocol (#1653). Each id is the `name` of a - // crm_opportunity-scoped action — `generate_quote` / - // `clone_opportunity` in `src/sales/actions/opportunity.actions.ts`, the - // activity trio in `src/sales/actions/activity-actions.ts`. - actions: [ - "generate_quote", - "clone_opportunity", - "log_call", - "log_meeting", - "schedule_meeting" - ] - } - }, - { - type: "record:highlights", - id: "opp_highlights", - label: "Key Information", - properties: { - fields: ["amount", "close_date", "probability", "expected_revenue", "owner_id", "crm_account"] - } - }, - { - type: "record:path", - id: "opp_stage_path", - label: "Opportunity Stage Path", - properties: { - statusField: "stage", - // Every canonical value of `stage` must appear here, in funnel - // order — the path is the only place a rep reads "where is this - // deal". `needs_analysis` was missing, so a deal sitting in that - // stage lit up NO step at all and the strip read as if the deal - // had skipped from Qualification to Proposal. The two terminal - // stages stay last (won before lost), matching lead_detail's - // converted/unqualified tail. - stages: [ - { value: "prospecting", label: "Prospecting" }, - { value: "qualification", label: "Qualification" }, - { value: "needs_analysis", label: "Needs Analysis" }, - { value: "proposal", label: "Proposal" }, - { value: "negotiation", label: "Negotiation" }, - { value: "closed_won", label: "Closed Won" }, - { value: "closed_lost", label: "Closed Lost" } - ] - } - } - ] - }, - { - name: "main", - width: "large", - components: [ - { - type: "page:tabs", - id: "opp_main_tabs", - properties: { - // `type` → `tabStyle` (@objectstack/spec 17.0.0, #6776, ADR-0087 - // D2). Same three values; see the full note on `home.page.ts`. - tabStyle: "line", - position: "top", - items: [ - { - // Tab item `key` → `value` (#1269): `value` is the stable - // `?tab=` URL token the renderer reads, `key` is read by - // nothing. See the full note on `case_detail.page.ts`. - value: "details", - label: "Details", - children: [ - { - type: "record:details", - id: "opp_details", - label: "Opportunity Details", - properties: { - // `columns` is a STRING enum ('1'|'2'|'3'|'4') in - // @objectstack/spec 17. `layout` is gone (removed in spec - // 17.0.0, #6946 / ADR-0087 D2). - columns: "2", - // Every section references one of crm_opportunity's - // `fieldGroups` (#1452, the #806 class ruling C): the - // renderer derives members, label, icon and collapse state - // from the object, so this page curates only the order. - // The full note — what a group section does on 17.6.0 and - // what may not sit beside `group` — is on - // `lead_detail.page.ts`. - // - // The highlights strip still wins (#1211): the renderer - // drops every field `record:highlights` registered, and the - // record title, from the derived members. So `basic` shows - // `primary_contact` only, and `financials` (`amount`, - // `expected_revenue`, both in the strip) renders nothing - // here — it stays referenced so that a field added to the - // group reaches this tab without an edit to this file. - // - // `hideEmpty: false` keeps an ALL-empty section on screen - // (#1211). The platform default (objectui#8603 ruling A) - // renders such a section as nothing at all, so on a deal - // with only its required fields the deal's type and - // source (`classification`), its campaign (`campaign`) - // and its description and next step (`notes`) vanished — - // the very fields a seller fills in later. Kept, they - // show as labelled empty rows to fill. Measured on - // 17.6.0 on such a deal: 2 sections render without it, 5 - // with it. Not on `basic` (its only member outside the - // title and the strip is `primary_contact`), nor on - // `financials`: both members sit in the strip, the - // derived list is empty, and the renderer draws nothing - // for an empty list whatever `hideEmpty` says. - // - // `qualification` and `narrative` (REQ-0006) sit right - // after `sales_process`, the order the object declares - // them in, and both keep `hideEmpty: false` on the same - // reasoning: every member is a judgement or a piece of - // prose the seller is expected to write (bid / no-bid, - // controllability, priority, deal level, subcontracting; - // the four narrative fields), none sits in the strip, and - // no deal that predates REQ-0006 carries any of them — so - // without the key both sections vanish on every existing - // deal, which is exactly where a seller would fill them. - sections: [ - { group: "basic" }, - { group: "financials" }, - { group: "classification", hideEmpty: false }, - { group: "campaign", hideEmpty: false }, - { group: "sales_process" }, - { group: "qualification", hideEmpty: false }, - { group: "narrative", hideEmpty: false }, - { group: "crm_forecast" }, - { group: "notes", hideEmpty: false } - ] - } - } - ] - }, - { - value: "related", - label: "Related", - children: [ - { - type: "page:accordion", - id: "opp_related_accordion", - properties: { - items: [ - { - // Accordion item `key` is DELETED, not renamed to - // `value` — the opposite verdict to the tab items - // above, because this renderer overwrites `value` with - // `panel-`. See the full note on - // `case_detail.page.ts`. - label: "Quotes", - // OPEN on arrival (#1214 item 6). All three panels - // used to start shut, so the Related tab opened on - // three closed bars whose headers already carried the - // counts — the click bought the user nothing the page - // had not already told them. - // - // `collapsed: false` is the whole mechanism, and it is - // needed even though the schema DEFAULTS it to false: - // the renderer opens the panels it finds by strict - // identity — `items.filter(i => i.collapsed === false)` - // — so an item that simply omits the key is - // `undefined`, not `false`, and stays shut. Measured - // on the @objectstack/console 17.3.0 bundle — the pin - // at that taking, ⛔ NOT re-taken on 17.4.0 - // (#1814, #1807) or 17.5.0 — - // and the component's own designer text says the same - // ("collapsed: false opens a panel by default"). - // - // ⚠️ ONLY the first panel, and that is the renderer's - // choice rather than a preference: with `allowMultiple` - // absent (it defaults false) the accordion mounts as - // `type="single"` and takes `defaultValue={open[0]}` — - // one panel, the first in declaration order. Marking - // Products or Open Tasks too would change nothing on - // screen. Opening more than one means declaring - // `allowMultiple: true`, which changes the interaction - // model (panels stop closing each other) and is not - // this card's ask. - // - // ⛔ NOT "default-open the sections that have rows", - // which the card asked for first: that is not - // expressible here. `collapsed` is a static boolean on - // a strict item shape (`label` / `icon` / `collapsed` / - // `children` — nothing else parses), the page is - // authored metadata evaluated before any row is read, - // and the related lists below fetch their own rows - // after mount. Reported rather than worked around; ⛔ - // the component is not this repo's to change. - collapsed: false, - children: [ - { - type: "record:related_list", - id: "opp_quotes", - properties: { - objectName: "crm_quote", - relationshipField: "crm_opportunity", - columns: ["quote_number", "name", "status", "total_price", "expiration_date"], - limit: 10 - } - } - ] - }, - { - label: "Products", - children: [ - { - type: "record:related_list", - id: "opp_products", - properties: { - objectName: "crm_opportunity_line_item", - relationshipField: "crm_opportunity", - columns: ["crm_product", "quantity", "unit_price", "total_price"], - limit: 10, - // The entry point that was missing (#1731). Every - // OTHER surface already treated line items as - // live — three profiles grant `allowCreate`, the - // docs describe the amount rolling up from them, - // and `billing-handoff.flow.ts`'s - // `load_line_items` reads them on every won deal - // — while nothing in the app could create one: - // no action, no list view, no navigation entry, - // no seed. A rep who wanted to itemise a deal had - // to type the Amount by hand. Declared surface and - // reachable surface now coincide again. - // - // What `add` writes is the whole reason a picker - // is sufficient here. It creates a row carrying - // exactly two authored keys — - // `{ [relationshipField]: , - // [linkField]: }` — and - // nothing else. On this object that would leave - // `quantity` and `unit_price` unset, and both are - // `required` + `storage.notNull`, so the insert - // would be refused. It is not, because the two - // gaps are already filled by machinery that - // predates this list: - // - // quantity -> the field's own `defaultValue: 1` - // unit_price -> `_line-item-price-fill.ts`, which - // on `beforeInsert` stamps - // `list_price` from the chosen - // product and defaults the - // negotiated `unit_price` to it - // discount -> the field's own `defaultValue: 0` - // total_price-> the formula over the three above - // - // and `crm_product.list_price` is itself `required` - // + `notNull`, so the hook can never fail to find a - // source. Measured end-to-end, not reasoned: - // `test/opportunity-line-item-add-picker.test.ts` - // inserts the picker's exact two-key shape and - // asserts the complete priced row, with an ablation - // that unbinds the hook and shows the same insert - // rejected as "Sales Price is required" — so the - // assertion cannot pass vacuously. - // - // ⛔ Do not add a `label`. The button falls back to - // the platform's own localized "Add"; the - // translation bundles reach a page component through - // `pages..components.`, which carries - // `label`/`title`/`description` for the COMPONENT - // and has no route to a nested `add.label`. A - // hand-authored string here would ship English into - // the zh-CN / es-ES / ja-JP bundles with no key to - // translate it under. - // - // `valueField` and `labelField` are both omitted on - // purpose rather than restated: `valueField` - // defaults to `id`, which is what the `crm_product` - // lookup stores, and `labelField` defaults to the - // picked object's own title field — `crm_product` - // declares `nameField: 'display_title'` (ADR-0079), - // so the picker labels rows "PRD-0001 - Widget" and - // keeps ONE source of truth for a product's title. - // That formula title is searchable only because the - // object also declares `searchableFields`, which it - // already does for exactly this reason. - add: { - picker: { - object: "crm_product", - // A retired product must not be sellable onto a - // new deal. `product.hook.ts`'s `beforeDelete` - // defines retirement as precisely this flag - // ("Set is_active=false to retire instead"), - // so the catalog's own retirement mechanism is - // what scopes the picker. All 13 seeded - // products carry `is_active: true`, so this - // narrows without emptying. - filter: [{ field: "is_active", operator: "equals", value: true }] - }, - linkField: "crm_product" - } - } - } - ] - }, - { - label: "Open Tasks", - children: [ - { - type: "record:related_list", - id: "opp_tasks", - properties: { - objectName: "crm_task", - relationshipField: "related_to_opportunity", - columns: ["subject", "status", "priority", "due_date", "owner_id"], - filter: [{ field: "status", operator: "not_equals", value: "completed" }], - limit: 10 - } - } - ] - } - ] - } - } - ] - }, - { - value: "activity", - label: "Activity", - children: [ - { - type: "record:activity", - id: "opp_activity", - /** - * `filters` is deleted with nothing put in its place, and - * that is the whole finding (#1269). - * - * It used to read `['all', 'tasks', 'meetings', 'calls', - * 'emails']` — a vocabulary that exists nowhere in the - * contract. `RecordActivityProps` has exactly two filter - * channels and neither takes that list: - * - * `types` — an array of FEED ITEM KINDS - * (`comment` | `field_change` | `task` | - * `event` | `email` | `call` | …). Not - * these values: `all` is not a kind and - * `meetings` is not one either (the kind - * is `event`), and all five are plural - * where the enum is singular. - * `filterMode` — ONE default for the panel's dropdown, - * from `all` | `comments_only` | - * `changes_only` | `tasks_only`. The - * dropdown's option list is the renderer's, - * not authorable. - * - * So the list was reaching for a third thing — "offer these - * filter chips" — that the component does not expose. What - * it wanted is already delivered: `showFilterToggle` - * defaults on, so the panel renders its filter dropdown, and - * `filterMode` defaults to `all`, so it opens unfiltered. - * Neither is restated here, because materializing a default - * turns "the author said nothing" into "the author asked for - * the default" — a different fact, and the one a later - * liveness audit reads. - * - * Mapping it onto `types` instead was considered and - * rejected: #1209 corrected exactly that mistake one page - * over (the lead timeline's `types: ['crm_task']`), and the - * renderer sanitises out-of-enum members then reads the - * EMPTY remainder as "no filter authored" — so a bad `types` - * is indistinguishable from no `types` on screen while - * claiming otherwise in source. A `types` here would also - * be a NEW restriction nobody asked for: it would drop - * comments and field changes from a timeline that shows them - * today. - */ - properties: { - limit: 25, - // Load-bearing (#2071): a call or meeting logged on the - // deal is a `sys_activity` row of type `completed` (the - // `task` feed kind), and the renderer drops every such - // row unless this is true — so a rep's logged call never - // reached this tab. The deal's other `completed` writers - // are its own won / lost milestones - // (`opportunity.object.ts`), which belong here too. - // Completed crm_task rows do NOT arrive: their audit rows - // are keyed to the task, and this feed reads only rows - // keyed to the deal. Nor is this the `types` restriction - // the note above refuses: it adds rows and filters none. - showCompleted: true - } - } - ] - } - ] - } - } - ] - }, - { - name: "aside", - width: "small", - components: [ - { - type: "record:reference_rail", - id: "opp_reference_rail", - properties: { - /** - * No entry declares a `title` — deliberately (#972). - * - * The rail resolves a card's heading as - * `entry.title || i18n.objectLabel({ name: objectName, … })`, so a - * literal `title` does not merely provide a default: it WINS, and - * the locale bundle is never consulted. The three literals that - * used to sit here (`Quotes` / `Products` / `Open Tasks`) therefore - * printed English into every one of the four locales this app - * ships, on top of `objects..label` already being translated - * in all of them. Dropping them hands the heading back to the - * translation bundle — the single source of truth for what an - * object is called — so a locale added later is covered for free. - * - * A translated literal is not available as an alternative: unlike - * `record:alert`, whose `title` is run through the inline - * translation-map resolver, the rail renders `entry.title` as a - * raw React child. An `{ en, 'zh-CN' }` map here would not be - * resolved — it would be handed to React as an object. - * - * The third card losing the word "Open" is a correction, not a - * casualty. A rail entry has no filter at all — the rail queries - * `{ $filter: { [relationshipField]: parentId }, $top: limit }` and - * reads nothing else — so that card always counted and listed this - * deal's tasks whatever their status. The heading claimed a filter - * the component cannot apply. The genuinely filtered view is the - * `opp_tasks` related list on the *Related* tab above, which does - * carry `status neq completed`. - * - * Pinned by `test/metadata-references.test.ts` (entries resolve, - * no literal titles) and `test/i18n-references.test.ts` (every - * rail object has a `label` in every locale, so the fallback - * lands on a translation rather than on a humanized object name). - */ - entries: [ - { - objectName: "crm_quote", - relationshipField: "crm_opportunity", - limit: 3 - }, - { - objectName: "crm_opportunity_line_item", - relationshipField: "crm_opportunity", - limit: 3 - }, - { - objectName: "crm_task", - relationshipField: "related_to_opportunity", - limit: 3 - } - ] - } - } - ] - } - ], - isDefault: true, - aria: { - ariaLabel: "Opportunity Detail Page", - ariaDescribedBy: "Detailed view of opportunity information with related records and activity" - } -}; - -// src/sales/pages/account_detail.page.ts -var AccountDetailPage = { - name: "account_detail_page", - label: "Account Detail", - description: "Slotted account record page \u2014 custom header + persistent discussion feed.", - type: "record", - object: "crm_account", - kind: "slotted", - regions: [], - slots: { - header: { - type: "page:header", - id: "account_header_slotted", - label: "Account Header (slotted)", - properties: { - title: "{name}", - subtitle: "{industry} \xB7 {type}", - // `icon` and `eyebrow` are GONE, and for two different reasons — both - // measured against the contract rather than inferred from the warning - // text (#1269). - // - // `icon` was REMOVED from `page:header` in @objectstack/spec 17.0.0 - // (#6946, ADR-0087 D2). It is deleted rather than renamed because no - // renderer ever read it: objectui resolves `icon` per header ACTION - // (`action.icon`) and never off the header's own props bag, and the - // component registry never published it as an input — which is what put - // the key in objectui's `UNPUBLISHED_EXEMPTIONS` as a "spec declares it, - // NO renderer read point" entry. The header's own identity comes from - // the record chrome (`recordChrome`, on by default). - // - // `eyebrow` was never declared by anything. It is not in - // `PageHeaderProps`, it has no alias or tombstone there, and the string - // "eyebrow" does not occur anywhere in objectui — no schema, no - // registry input, no renderer. So the ACCOUNT kicker this page's - // docblock used to promise has never reached a screen: the props bag is - // `z.record(z.string(), z.unknown())`, so the key was carried into the - // artifact and dropped at render. Deleting it changes nothing a user - // sees; it only stops the source claiming a kicker exists. - // `breadcrumb` retired from `page:header` in @objectstack/spec 17.6.0 - // (#20785, `page-header-breadcrumb-removed`) — deleted: no renderer - // ever drew a trail for it; the app shell's own trail is unchanged. - // Overriding the `header` slot REPLACES the synthesized header, actions - // and all — so this slot has to re-state every action it wants to keep. - // Before #592 it named none, which is why an account record showed no - // activity buttons at all while the list row's ⋮ menu showed three. - // - // Action IDs, not `ActionDef` objects: `PageHeaderProps.actions` is - // `z.array(z.string())` ("Action IDs to show in header") in - // @objectstack/spec 17.3.0, and this repo authors against the protocol - // (#1653). Each id is the `name` of a crm_account-scoped action in - // `src/sales/actions/activity-actions.ts`. - actions: ["log_call", "log_meeting", "schedule_meeting"] - } - }, - discussion: { - type: "record:chatter", - id: "account_chatter", - label: "Discussion", - /** - * One `feed`, for one reason: `showCompleted` (#2071). - * - * This feed IS the account's activity timeline — the slotted page - * synthesizes no Activity tab, so the panel's "All Activity" stream is - * where an account's `sys_activity` rows surface. A call or meeting - * logged on the account is a row of type `completed` (the `task` feed - * kind), and the timeline drops every such row unless - * `feed.showCompleted` is true — so Log a Call / Log a Meeting on an - * account wrote a row that appeared nowhere on the account. - * - * Authoring a `feed` costs two more keys, and they are stated rather - * than left out. `RecordChatterRenderer` builds `{ position: 'bottom', - * collapsible: false, feed: { enableReactions: true, enableThreading: - * true, showCommentInput: true }, ...schema }` — one shallow spread — so - * a `feed` of our own REPLACES that default object wholesale, and - * `RecordActivityTimeline` reads `enableReactions ?? false` and - * `enableThreading ?? false` off what is left. Without the two keys - * below, reactions and threading would silently switch off. - * `showCommentInput` needs no restating: the timeline reads it as - * `!== false`. - * - * `feed.enableMentions` needs none either: the renderer reads it as - * `!== false` too. And the older note still holds (#1269): - * `enableComments` and a top-level `enableReactions` / `enableMentions` - * are not `record:chatter` keys — `RecordChatterProps` declares - * `position`, `width`, `collapsible`, `defaultCollapsed`, `feed` and - * `aria`, nothing else. - */ - properties: { - feed: { - showCompleted: true, - enableReactions: true, - enableThreading: true - } - } - } - } -}; - -// src/sales/pages/account_workbench.page.ts -var AccountWorkbenchPage = { - name: "account_workbench", - label: "Account Workbench", - description: "Curated account list for the sales team: quick filters only, no view management.", - type: "list", - object: "crm_account", - kind: "full", - template: "default", - isDefault: false, - // Interface pages carry no regions — the list surface is generated from - // `interfaceConfig` (ADR-0047), not composed from components. - regions: [], - interfaceConfig: { - source: "crm_account", - sourceView: "all_accounts", - ...{ - userFilters: { - element: "dropdown", - fields: [ - { field: "industry", showCount: true }, - { field: "type" }, - { field: "owner_id" } - ] - } - // typed via spread-as-any until @objectstack/spec ships ADR-0047 - // (UserFiltersSchema is in framework main, > 9.2.0) - }, - appearance: { - showDescription: true, - allowedVisualizations: ["grid"] - }, - userActions: { - sort: true, - search: true, - filter: false, - rowHeight: false, - addRecordForm: false - }, - showRecordCount: true - } -}; - -// src/sales/pages/home.page.ts -var embeddedListView = (id, objectName, views, viewKey) => { - const view = views.listViews?.[viewKey]; - if (!view) throw new Error(`home.page.ts: no saved view "${viewKey}" on ${objectName}`); - return { - type: "list-view", - id, - label: view.label, - properties: { - objectName, - viewType: "grid", - columns: view.columns, - filter: view.filter, - sort: view.sort - } - }; -}; -var SalesHomePage = { - name: "sales_home_page", - label: "Sales Home", - description: "Sales team home page with key metrics and quick actions", - type: "home", - template: "three-column", - kind: "full", - variables: [ - { - name: "selectedPeriod", - type: "string", - defaultValue: "this_month" - } - ], - regions: [ - { - name: "header", - width: "full", - components: [ - { - type: "page:header", - id: "home_header", - label: "Sales Home Header", - properties: { - title: "Sales Dashboard", - // Was `Welcome back, {current_user.first_name}`, which rendered as - // "Welcome back, " — the name was never going to arrive, because - // that one string mixes three vocabularies that do not compose: - // - // 1. `subtitle` is an `I18nLabel` (`ComponentPropsMap`, - // `@objectstack/spec/ui`) — a display string or an inline - // locale map, resolved by `resolveI18nLabel`. The field has no - // token pass and no expression pass of its own. - // 2. Braces DO resolve in a page header, but the vocabulary is the - // BOUND RECORD's own fields — `case_detail.page.ts` records the - // measurement, where `{account}` matched no field and the - // subtitle rendered blank until it was spelled `{crm_account}`. - // A `type: 'home'` page has no record, so no brace token can - // ever resolve here. - // 3. `current_user.first_name` is a CEL path, and CEL is written - // bare, never inside `{…}`. The one resolvable brace token in - // the filter vocabulary is `{current_user_id}` on its own. - // - // A greeting that names the user is not expressible on a - // translatable label, so the label now says the part that is true - // in every locale and the four bundles carry the translations - // (`pages.sales_home_page.subtitle`). Personalising it would need a - // component that takes user data — no shipped component does - // (`user:profile` and its neighbours are `emptyProps` rows), so - // this is a static greeting rather than a widened accept surface. - subtitle: "Welcome back" - // `icon` removed from `page:header` in @objectstack/spec 17.0.0 - // (#6946, ADR-0087 D2) — deleted, not renamed. See the full note on - // `account_detail.page.ts`; nothing ever drew it. - // `breadcrumb` retired from `page:header` in @objectstack/spec 17.6.0 - // (#20785, `page-header-breadcrumb-removed`) — deleted: no renderer - // ever drew a trail for it; the app shell's own trail is unchanged. - } - } - ] - }, - { - name: "left_sidebar", - width: "small", - components: [ - { - type: "page:card", - id: "quick_create", - label: "Quick Create", - properties: { - title: "Quick Create", - bordered: true, - children: [ - { - type: "nav:menu", - id: "create_menu", - properties: {} - } - ] - } - } - // There is no `Recent Items` card here any more, and re-adding one - // needs a data source that does not exist yet. - // - // It shipped as a `page:card` with a title and no body: a bordered box - // with the words "Recent Items" and nothing under them, on the landing - // page of every `sales_rep` / `sales_manager`. "Recent" is per-user - // access history across objects, and the platform publishes no source - // for it on 17.1.0 — `ComponentPropsMap` has no recent-records - // component, and the two that sound like one (`record:activity`, - // `record:history`) both read the page's BOUND RECORD, which a home - // page does not have. Binding it to one object's list view instead - // would have made the title lie, which is the defect #771 exists to - // prevent, so the card is removed rather than filled with something - // that is not recency. Recorded as #1217; when the platform ships a - // recent-records source, this is where the card goes back. - ] - }, - { - name: "main", - width: "large", - components: [ - { - type: "page:card", - id: "key_metrics", - label: "Key Metrics", - properties: { - title: "Key Performance Indicators", - bordered: false, - // `record:highlights` needs a bound record and real fields; a home - // page has neither, and the four names it listed (total_revenue, - // deals_won, …) exist on no object — the card rendered blank. - // `object-metric` widgets aggregate live data instead. - children: [ - { - type: "object-metric", - id: "kpi_revenue_won", - properties: { - objectName: "crm_opportunity", - label: "Revenue (Won)", - icon: "dollar-sign", - aggregate: { field: "amount", function: "sum" }, - filter: [{ field: "stage", operator: "equals", value: "closed_won" }] - } - }, - { - type: "object-metric", - id: "kpi_deals_won", - properties: { - objectName: "crm_opportunity", - label: "Deals Won", - icon: "trophy", - aggregate: { field: "id", function: "count" }, - filter: [{ field: "stage", operator: "equals", value: "closed_won" }] - } - }, - { - type: "object-metric", - id: "kpi_pipeline_value", - properties: { - objectName: "crm_opportunity", - label: "Pipeline Value", - icon: "briefcase", - aggregate: { field: "amount", function: "sum" }, - filter: [{ field: "stage", operator: "not_in", value: ["closed_won", "closed_lost"] }] - } - }, - { - type: "object-metric", - id: "kpi_open_leads", - properties: { - objectName: "crm_lead", - label: "Open Leads", - icon: "user-plus", - aggregate: { field: "id", function: "count" }, - filter: [{ field: "is_converted", operator: "equals", value: false }] - } - } - ] - } - }, - { - type: "page:tabs", - id: "home_tabs", - label: "Home Tabs", - properties: { - /** - * `type` → `tabStyle` (@objectstack/spec 17.0.0, #6776, ADR-0087 - * D2). The concept and the value vocabulary (`line` | `card` | - * `pill`) are unchanged; only the spelling moved, because a props - * key named `type` collides with the page component's own dispatch - * key: objectui's `SchemaRenderer` hoists `properties` onto the node - * but deliberately skips `type` and `id` (or the inner value would - * shadow which renderer to dispatch to), and `sdui-parser` lists - * `type` in `BASE_PROPS`, so a manifest input by that name is never - * validated at all. - * - * Renaming is behaviour-preserving on this page and on the three - * record pages: the renderer resolves - * `schema?.properties?.type || schema?.tabStyle || 'line'`, so it - * has been honouring the retired spelling as a back-compat read all - * along and picks up the canonical one through the same hoist. - */ - tabStyle: "card", - position: "top", - items: [ - { - label: "My Leads", - icon: "user-plus", - children: [embeddedListView("home_my_leads", "crm_lead", LeadViews, "my_leads")] - }, - { - // Was "My Opportunities", which promises every deal I own; the - // view behind it is the open-pipeline one (the nav's My Work > - // My Deals opens the same `my_open_deals`). The tab name now - // says what the panel shows. - label: "My Open Deals", - icon: "dollar-sign", - children: [embeddedListView("home_my_deals", "crm_opportunity", OpportunityViews, "my_open_deals")] - }, - { - // Same correction: `my_open_tasks` excludes completed tasks. - label: "My Open Tasks", - icon: "list-checks", - children: [embeddedListView("home_my_tasks", "crm_task", TaskViews, "my_open_tasks")] - } - ] - } - } - ] - }, - { - name: "right_sidebar", - width: "medium", - components: [ - { - type: "page:card", - id: "ai_briefing", - // The assistant is the PLATFORM's (`ask`), not an app-owned persona: - // HotCRM contributes skills, the agent lives in the cloud side - // (maintainer ruling on #612, 2026-08-04). The retired `sales_copilot` - // agent (#512, ADR-0063 §2) must not be named in live UI copy — and - // the entry point is the assistant panel the platform opens from the - // right edge of every page, which is the wording - // `content/docs/ai-copilot/index.mdx` landed in #611/PR #1001. - label: "Today with the AI Assistant", - properties: { - title: "Ask the AI Assistant", - bordered: true, - // The paragraph is an `element:text` child (#1581). It used to be - // `properties.description`, which `page:card` does not declare, so - // the card rendered as a title over nothing. `content` is not on - // the locale pack's page-component face, so the four languages - // live here as an inline locale map, the spec's route for page - // prose. The #1002 persona guard in - // `test/metadata-references.test.ts` reads this child. - children: [ - { - type: "element:text", - id: "ai_briefing_text", - properties: { - content: { - en: 'Open the assistant panel from the right edge of the page and ask "what should I focus on today?" \u2014 it sees your live pipeline, schema, and accounts.', - "zh-CN": '\u4ECE\u9875\u9762\u53F3\u4FA7\u6253\u5F00\u52A9\u624B\u9762\u677F\uFF0C\u8BE2\u95EE"\u6211\u4ECA\u5929\u5E94\u8BE5\u5173\u6CE8\u4EC0\u4E48\uFF1F"\u2014\u2014\u5B83\u53EF\u4EE5\u5B9E\u65F6\u67E5\u770B\u60A8\u7684\u9500\u552E\u7BA1\u9053\u3001\u67B6\u6784\u4E0E\u5BA2\u6237\u4FE1\u606F\u3002', - "es-ES": 'Abra el panel del asistente desde el borde derecho de la p\xE1gina y pregunte "\xBFen qu\xE9 deber\xEDa concentrarme hoy?" \u2014 ve su flujo de ventas, esquema y cuentas en tiempo real.', - "ja-JP": "\u30DA\u30FC\u30B8\u53F3\u7AEF\u304B\u3089\u30A2\u30B7\u30B9\u30BF\u30F3\u30C8\u30D1\u30CD\u30EB\u3092\u958B\u304D\u3001\u300C\u4ECA\u65E5\u306F\u4F55\u306B\u96C6\u4E2D\u3059\u3079\u304D\u304B\uFF1F\u300D\u3068\u5C0B\u306D\u3066\u304F\u3060\u3055\u3044 \u2014 \u30EA\u30A2\u30EB\u30BF\u30A4\u30E0\u306E\u30D1\u30A4\u30D7\u30E9\u30A4\u30F3\u3001\u30B9\u30AD\u30FC\u30DE\u3001\u53D6\u5F15\u5148\u60C5\u5831\u3092\u628A\u63E1\u3057\u3066\u3044\u307E\u3059\u3002" - } - } - } - ] - } - }, - { - type: "page:card", - id: "upcoming_events", - // Was `Calendar` / "Today's Schedule" over an empty bordered box — - // the card declared no body, so the renderer had nothing to draw. - // - // It is bound to `crm_event`'s saved `upcoming_events` view, read off - // the view exactly like the tabs above, and the name now matches what - // the panel shows. "Today's Schedule" is NOT what any existing view - // says: `my_events` is scoped to the current user but carries no date - // filter, no sort and no date column (27 seeded rows, mostly `held` - // interactions from the past), while `upcoming_events` is - // `status: 'planned'` sorted by `start_datetime` ascending with the - // date on the row. Narrowing either one to today would mean retyping - // a filter in this page — the second definition the helper above - // exists to prevent — so the title says "upcoming" instead of - // promising a day this page cannot compute. - label: "Upcoming Events", - properties: { - title: "Upcoming Events", - bordered: true, - children: [embeddedListView("home_upcoming_events", "crm_event", EventViews, "upcoming_events")] - } - } - ] - } - ], - isDefault: true, - aria: { - ariaLabel: "Sales Home Page", - ariaDescribedBy: "Sales team home page with metrics, leads, and quick actions" - } -}; - -// src/sales/pages/app_launcher.page.ts -var AppLauncherPage = { - name: "app_launcher_page", - label: "App Launcher", - description: "Central hub for accessing all applications", - type: "app", - template: "centered", - kind: "full", - regions: [ - { - name: "header", - width: "full", - components: [ - { - type: "global:search", - id: "app_search", - label: "Search Apps", - properties: {} - } - ] - }, - { - name: "main", - width: "large", - components: [ - { - type: "page:header", - id: "launcher_header", - label: "App Launcher Header", - properties: { - title: "App Launcher", - subtitle: "Select an app to get started" - // `icon` removed from `page:header` in @objectstack/spec 17.0.0 - // (#6946, ADR-0087 D2) — deleted, not renamed. See the full note on - // `account_detail.page.ts`; nothing ever drew it. - // `breadcrumb` retired from `page:header` in @objectstack/spec 17.6.0 - // (#20785, `page-header-breadcrumb-removed`) — deleted: no renderer - // ever drew a trail for it; the app shell's own trail is unchanged. - } - }, - { - type: "app:launcher", - id: "app_grid", - label: "Application Grid", - properties: {} - } - ] - } - ], - isDefault: false, - aria: { - ariaLabel: "App Launcher Page", - ariaDescribedBy: "Central application launcher for accessing all apps" - } -}; - -// src/sales/pages/utility_bar.page.ts -var UtilityBarPage = { - name: "utility_bar_page", - label: "Utility Bar", - description: "Quick access utility bar with floating tools", - type: "utility", - template: "utility-bar", - kind: "full", - regions: [ - { - name: "utilities", - width: "full", - components: [ - { - type: "global:notifications", - id: "notifications_panel", - label: "Notifications", - properties: {} - }, - { - type: "page:card", - id: "quick_notes", - label: "Quick Notes", - properties: { - title: "Quick Notes", - bordered: true - } - }, - { - type: "global:search", - id: "quick_search", - label: "Quick Search", - properties: {} - } - ] - } - ], - isDefault: false, - aria: { - ariaLabel: "Utility Bar", - ariaDescribedBy: "Quick access utility bar with floating tools and notifications" - } -}; - -// src/sales/email-templates/index.ts -var email_templates_exports = {}; -__export(email_templates_exports, { - SalesEmailTemplates: () => SalesEmailTemplates -}); - -// src/sales/email-templates/en.ts -var en3 = { - "crm.account_approved": { - label: "Account Approved", - subject: "Account approved: {{name}}", - bodyHtml: "

This account has been signed off and is now established data.

" - }, - "crm.account_rejected": { - label: "Account Not Approved", - subject: "Account not approved: {{name}}", - bodyHtml: "

This account was not signed off. Correct its details and ask for another review.

" - }, - "crm.contact_welcome": { - label: "New Contact", - subject: "New contact: {{first_name}} {{last_name}}", - bodyHtml: "

{{first_name}} {{last_name}} was added as a contact. Reach out to welcome them.

" - }, - "crm.deal_stalled": { - label: "Stalled Deal", - subject: "Stalled deal: {{name}}", - bodyHtml: "

Opportunity {{name}} has sat in {{stage}} for {{days_in_stage}} days. Time to advance or re-qualify it.

" - }, - "crm.large_deal_won": { - label: "Large Deal Won", - subject: "Large deal won: {{name}}", - bodyHtml: "

{{name}} closed at {{amount}}. Congratulations to the team.

" - }, - "crm.lead_conversion_approved": { - label: "Lead Approved for Conversion", - subject: "Lead approved for conversion: {{first_name}} {{last_name}}", - bodyHtml: "

This lead has been signed off. You can convert it into an account, contact and opportunity.

" - }, - "crm.lead_conversion_rejected": { - label: "Lead Not Approved", - subject: "Lead not approved: {{first_name}} {{last_name}}", - bodyHtml: "

Conversion of this lead was not approved. Keep working it, or disqualify it with a reason.

" - }, - "crm.lead_converted": { - label: "Lead Converted", - subject: "Lead converted: {{first_name}} {{last_name}}", - bodyHtml: "

Lead {{first_name}} {{last_name}} was converted into an account and contact.

" - }, - "crm.lead_routing_hot": { - label: "Hot Lead Routing", - subject: "Hot lead \u2014 assign within 24h: {{first_name}} {{last_name}}", - bodyHtml: "

{{first_name}} {{last_name}} from {{company}} (rating {{rating}}) needs an owner today.

" - }, - "crm.lead_routing_new": { - label: "New Lead Routing", - subject: "New lead to assign: {{first_name}} {{last_name}}", - bodyHtml: "

{{first_name}} {{last_name}} from {{company}} is awaiting assignment.

" - }, - "crm.opportunity_approved": { - label: "Deal Approved", - subject: "Deal approved: {{name}}", - bodyHtml: "

Your opportunity {{name}} has been approved.

" - }, - "crm.opportunity_rejected": { - label: "Deal Rejected", - subject: "Deal rejected: {{name}}", - bodyHtml: "

Your opportunity {{name}} was not approved. Review and revise before resubmitting.

" - }, - "crm.task_reminder": { - label: "Task Reminder", - subject: "Task reminder: {{subject}}", - bodyHtml: '

Your task "{{subject}}" is due (reminder set for {{reminder_date}}).

' - }, - "crm.urgent_task": { - label: "Urgent Task", - subject: "Urgent task: {{subject}}", - bodyHtml: '

An urgent task "{{subject}}" was assigned to you and needs attention.

' - } -}; - -// src/sales/email-templates/zh-CN.ts -var zhCN3 = { - "crm.account_approved": { - label: "\u5BA2\u6237\u5BA1\u6279\u901A\u8FC7", - subject: "\u5BA2\u6237\u5DF2\u5BA1\u6279\u901A\u8FC7\uFF1A{{name}}", - bodyHtml: "

\u8BE5\u5BA2\u6237\u5DF2\u5BA1\u6279\u901A\u8FC7\uFF0C\u73B0\u4E3A\u6B63\u5F0F\u6570\u636E\u3002

" - }, - "crm.account_rejected": { - label: "\u5BA2\u6237\u5BA1\u6279\u672A\u901A\u8FC7", - subject: "\u5BA2\u6237\u672A\u901A\u8FC7\u5BA1\u6279\uFF1A{{name}}", - bodyHtml: "

\u8BE5\u5BA2\u6237\u672A\u901A\u8FC7\u5BA1\u6279\u3002\u8BF7\u4FEE\u6B63\u5176\u4FE1\u606F\u540E\u518D\u6B21\u63D0\u4EA4\u5BA1\u6838\u3002

" - }, - "crm.contact_welcome": { - label: "\u65B0\u8054\u7CFB\u4EBA", - subject: "\u65B0\u8054\u7CFB\u4EBA\uFF1A{{first_name}} {{last_name}}", - bodyHtml: "

{{first_name}} {{last_name}} \u5DF2\u6DFB\u52A0\u4E3A\u8054\u7CFB\u4EBA\u3002\u8BF7\u4E3B\u52A8\u8054\u7CFB\u5E76\u8868\u793A\u6B22\u8FCE\u3002

" - }, - "crm.deal_stalled": { - label: "\u5546\u673A\u505C\u6EDE", - subject: "\u505C\u6EDE\u5546\u673A\uFF1A{{name}}", - bodyHtml: "

\u5546\u673A {{name}} \u5DF2\u5728\u201C{{stage}}\u201D\u9636\u6BB5\u505C\u7559 {{days_in_stage}} \u5929\u3002\u8BF7\u63A8\u8FDB\u6216\u91CD\u65B0\u8BC4\u4F30\u3002

" - }, - "crm.large_deal_won": { - label: "\u5927\u989D\u5546\u673A\u8D62\u5355", - subject: "\u5927\u989D\u5546\u673A\u8D62\u5355\uFF1A{{name}}", - bodyHtml: "

{{name}} \u4EE5 {{amount}} \u6210\u4EA4\u3002\u606D\u559C\u56E2\u961F\u3002

" - }, - "crm.lead_conversion_approved": { - label: "\u7EBF\u7D22\u8F6C\u6362\u5DF2\u6279\u51C6", - subject: "\u7EBF\u7D22\u8F6C\u6362\u5DF2\u6279\u51C6\uFF1A{{first_name}} {{last_name}}", - bodyHtml: "

\u8BE5\u7EBF\u7D22\u5DF2\u5BA1\u6279\u901A\u8FC7\u3002\u60A8\u53EF\u4EE5\u5C06\u5176\u8F6C\u6362\u4E3A\u5BA2\u6237\u3001\u8054\u7CFB\u4EBA\u548C\u5546\u673A\u3002

" - }, - "crm.lead_conversion_rejected": { - label: "\u7EBF\u7D22\u8F6C\u6362\u672A\u6279\u51C6", - subject: "\u7EBF\u7D22\u672A\u901A\u8FC7\u5BA1\u6279\uFF1A{{first_name}} {{last_name}}", - bodyHtml: "

\u8BE5\u7EBF\u7D22\u7684\u8F6C\u6362\u672A\u83B7\u6279\u51C6\u3002\u8BF7\u7EE7\u7EED\u8DDF\u8FDB\uFF0C\u6216\u6CE8\u660E\u539F\u56E0\u5C06\u5176\u53D6\u6D88\u8D44\u683C\u3002

" - }, - "crm.lead_converted": { - label: "\u7EBF\u7D22\u5DF2\u8F6C\u6362", - subject: "\u7EBF\u7D22\u5DF2\u8F6C\u6362\uFF1A{{first_name}} {{last_name}}", - bodyHtml: "

\u7EBF\u7D22 {{first_name}} {{last_name}} \u5DF2\u8F6C\u6362\u4E3A\u5BA2\u6237\u548C\u8054\u7CFB\u4EBA\u3002

" - }, - "crm.lead_routing_hot": { - label: "\u70ED\u95E8\u7EBF\u7D22\u5206\u914D", - subject: "\u70ED\u95E8\u7EBF\u7D22 \u2014 24 \u5C0F\u65F6\u5185\u5206\u914D\uFF1A{{first_name}} {{last_name}}", - bodyHtml: "

\u6765\u81EA {{company}} \u7684 {{first_name}} {{last_name}}\uFF08\u8BC4\u5206 {{rating}}\uFF09\u9700\u8981\u4ECA\u5929\u5C31\u6307\u5B9A\u8D1F\u8D23\u4EBA\u3002

" - }, - "crm.lead_routing_new": { - label: "\u65B0\u7EBF\u7D22\u5206\u914D", - subject: "\u5F85\u5206\u914D\u65B0\u7EBF\u7D22\uFF1A{{first_name}} {{last_name}}", - bodyHtml: "

\u6765\u81EA {{company}} \u7684 {{first_name}} {{last_name}} \u6B63\u5728\u7B49\u5F85\u5206\u914D\u3002

" - }, - "crm.opportunity_approved": { - label: "\u5546\u673A\u5BA1\u6279\u901A\u8FC7", - subject: "\u5546\u673A\u5DF2\u6279\u51C6\uFF1A{{name}}", - bodyHtml: "

\u60A8\u7684\u5546\u673A {{name}} \u5DF2\u83B7\u6279\u51C6\u3002

" - }, - "crm.opportunity_rejected": { - label: "\u5546\u673A\u5BA1\u6279\u672A\u901A\u8FC7", - subject: "\u5546\u673A\u672A\u6279\u51C6\uFF1A{{name}}", - bodyHtml: "

\u60A8\u7684\u5546\u673A {{name}} \u672A\u83B7\u6279\u51C6\u3002\u8BF7\u68C0\u67E5\u5E76\u4FEE\u6539\u540E\u91CD\u65B0\u63D0\u4EA4\u3002

" - }, - "crm.task_reminder": { - label: "\u4EFB\u52A1\u63D0\u9192", - subject: "\u4EFB\u52A1\u63D0\u9192\uFF1A{{subject}}", - bodyHtml: "

\u60A8\u7684\u4EFB\u52A1\u201C{{subject}}\u201D\u5DF2\u5230\u671F\uFF08\u63D0\u9192\u65F6\u95F4 {{reminder_date}}\uFF09\u3002

" - }, - "crm.urgent_task": { - label: "\u7D27\u6025\u4EFB\u52A1", - subject: "\u7D27\u6025\u4EFB\u52A1\uFF1A{{subject}}", - bodyHtml: "

\u4E00\u9879\u7D27\u6025\u4EFB\u52A1\u201C{{subject}}\u201D\u5DF2\u5206\u914D\u7ED9\u60A8\uFF0C\u9700\u8981\u5C3D\u5FEB\u5904\u7406\u3002

" - } -}; - -// src/sales/email-templates/ja-JP.ts -var jaJP3 = { - "crm.account_approved": { - label: "\u30A2\u30AB\u30A6\u30F3\u30C8\u627F\u8A8D\u6E08\u307F", - subject: "\u30A2\u30AB\u30A6\u30F3\u30C8\u304C\u627F\u8A8D\u3055\u308C\u307E\u3057\u305F: {{name}}", - bodyHtml: "

\u3053\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306F\u627F\u8A8D\u3055\u308C\u3001\u6B63\u5F0F\u306A\u30C7\u30FC\u30BF\u306B\u306A\u308A\u307E\u3057\u305F\u3002

" - }, - "crm.account_rejected": { - label: "\u30A2\u30AB\u30A6\u30F3\u30C8\u672A\u627F\u8A8D", - subject: "\u30A2\u30AB\u30A6\u30F3\u30C8\u304C\u627F\u8A8D\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: {{name}}", - bodyHtml: "

\u3053\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306F\u627F\u8A8D\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u5185\u5BB9\u3092\u4FEE\u6B63\u306E\u3046\u3048\u3001\u518D\u5EA6\u627F\u8A8D\u3092\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044\u3002

" - }, - "crm.contact_welcome": { - label: "\u65B0\u898F\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005", - subject: "\u65B0\u3057\u3044\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005: {{first_name}} {{last_name}}", - bodyHtml: "

{{first_name}} {{last_name}} \u304C\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3068\u3057\u3066\u8FFD\u52A0\u3055\u308C\u307E\u3057\u305F\u3002\u3054\u6328\u62F6\u306E\u9023\u7D61\u3092\u3057\u3066\u304F\u3060\u3055\u3044\u3002

" - }, - "crm.deal_stalled": { - label: "\u505C\u6EDE\u4E2D\u306E\u5546\u8AC7", - subject: "\u505C\u6EDE\u4E2D\u306E\u5546\u8AC7: {{name}}", - bodyHtml: "

\u5546\u8AC7 {{name}} \u306F\u300C{{stage}}\u300D\u306B {{days_in_stage}} \u65E5\u9593\u7559\u307E\u3063\u3066\u3044\u307E\u3059\u3002\u6B21\u306E\u6BB5\u968E\u306B\u9032\u3081\u308B\u304B\u3001\u518D\u8A55\u4FA1\u3057\u3066\u304F\u3060\u3055\u3044\u3002

" - }, - "crm.large_deal_won": { - label: "\u5927\u578B\u5546\u8AC7\u306E\u53D7\u6CE8", - subject: "\u5927\u578B\u5546\u8AC7\u3092\u53D7\u6CE8: {{name}}", - bodyHtml: "

{{name}} \u304C {{amount}} \u3067\u6210\u7D04\u3057\u307E\u3057\u305F\u3002\u30C1\u30FC\u30E0\u306E\u7686\u3055\u3093\u3001\u304A\u3081\u3067\u3068\u3046\u3054\u3056\u3044\u307E\u3059\u3002

" - }, - "crm.lead_conversion_approved": { - label: "\u30EA\u30FC\u30C9\u5909\u63DB\u306E\u627F\u8A8D", - subject: "\u30EA\u30FC\u30C9\u306E\u5909\u63DB\u304C\u627F\u8A8D\u3055\u308C\u307E\u3057\u305F: {{first_name}} {{last_name}}", - bodyHtml: "

\u3053\u306E\u30EA\u30FC\u30C9\u306F\u627F\u8A8D\u3055\u308C\u307E\u3057\u305F\u3002\u53D6\u5F15\u5148\u3001\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u3001\u5546\u8AC7\u306B\u5909\u63DB\u3067\u304D\u307E\u3059\u3002

" - }, - "crm.lead_conversion_rejected": { - label: "\u30EA\u30FC\u30C9\u672A\u627F\u8A8D", - subject: "\u30EA\u30FC\u30C9\u304C\u627F\u8A8D\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: {{first_name}} {{last_name}}", - bodyHtml: "

\u3053\u306E\u30EA\u30FC\u30C9\u306E\u5909\u63DB\u306F\u627F\u8A8D\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u5F15\u304D\u7D9A\u304D\u5BFE\u5FDC\u3059\u308B\u304B\u3001\u7406\u7531\u3092\u4ED8\u3051\u3066\u5BFE\u8C61\u5916\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002

" - }, - "crm.lead_converted": { - label: "\u30EA\u30FC\u30C9\u5909\u63DB\u6E08\u307F", - subject: "\u30EA\u30FC\u30C9\u3092\u5909\u63DB\u3057\u307E\u3057\u305F: {{first_name}} {{last_name}}", - bodyHtml: "

\u30EA\u30FC\u30C9 {{first_name}} {{last_name}} \u3092\u53D6\u5F15\u5148\u3068\u53D6\u5F15\u5148\u8CAC\u4EFB\u8005\u306B\u5909\u63DB\u3057\u307E\u3057\u305F\u3002

" - }, - "crm.lead_routing_hot": { - label: "\u30DB\u30C3\u30C8\u30EA\u30FC\u30C9\u306E\u5272\u308A\u5F53\u3066", - subject: "\u30DB\u30C3\u30C8\u30EA\u30FC\u30C9 \u2014 24 \u6642\u9593\u4EE5\u5185\u306B\u5272\u308A\u5F53\u3066: {{first_name}} {{last_name}}", - bodyHtml: "

{{company}} \u306E {{first_name}} {{last_name}}\uFF08\u8A55\u4FA1 {{rating}}\uFF09\u306B\u672C\u65E5\u4E2D\u306B\u62C5\u5F53\u8005\u3092\u5272\u308A\u5F53\u3066\u3066\u304F\u3060\u3055\u3044\u3002

" - }, - "crm.lead_routing_new": { - label: "\u65B0\u898F\u30EA\u30FC\u30C9\u306E\u5272\u308A\u5F53\u3066", - subject: "\u5272\u308A\u5F53\u3066\u5F85\u3061\u306E\u65B0\u898F\u30EA\u30FC\u30C9: {{first_name}} {{last_name}}", - bodyHtml: "

{{company}} \u306E {{first_name}} {{last_name}} \u304C\u5272\u308A\u5F53\u3066\u3092\u5F85\u3063\u3066\u3044\u307E\u3059\u3002

" - }, - "crm.opportunity_approved": { - label: "\u5546\u8AC7\u627F\u8A8D\u6E08\u307F", - subject: "\u5546\u8AC7\u304C\u627F\u8A8D\u3055\u308C\u307E\u3057\u305F: {{name}}", - bodyHtml: "

\u5546\u8AC7 {{name}} \u304C\u627F\u8A8D\u3055\u308C\u307E\u3057\u305F\u3002

" - }, - "crm.opportunity_rejected": { - label: "\u5546\u8AC7\u672A\u627F\u8A8D", - subject: "\u5546\u8AC7\u304C\u627F\u8A8D\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F: {{name}}", - bodyHtml: "

\u5546\u8AC7 {{name}} \u306F\u627F\u8A8D\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u5185\u5BB9\u3092\u78BA\u8A8D\u30FB\u4FEE\u6B63\u306E\u3046\u3048\u3001\u518D\u7533\u8ACB\u3057\u3066\u304F\u3060\u3055\u3044\u3002

" - }, - "crm.task_reminder": { - label: "ToDo \u30EA\u30DE\u30A4\u30F3\u30C0\u30FC", - subject: "ToDo \u306E\u30EA\u30DE\u30A4\u30F3\u30C0\u30FC: {{subject}}", - bodyHtml: "

ToDo\u300C{{subject}}\u300D\u304C\u671F\u9650\u3092\u8FCE\u3048\u307E\u3057\u305F\uFF08\u30EA\u30DE\u30A4\u30F3\u30C0\u30FC\u8A2D\u5B9A: {{reminder_date}}\uFF09\u3002

" - }, - "crm.urgent_task": { - label: "\u7DCA\u6025 ToDo", - subject: "\u7DCA\u6025\u306E ToDo: {{subject}}", - bodyHtml: "

\u7DCA\u6025\u306E ToDo\u300C{{subject}}\u300D\u304C\u5272\u308A\u5F53\u3066\u3089\u308C\u307E\u3057\u305F\u3002\u5BFE\u5FDC\u3092\u304A\u9858\u3044\u3057\u307E\u3059\u3002

" - } -}; - -// src/sales/email-templates/es-ES.ts -var esES3 = { - "crm.account_approved": { - label: "Cuenta aprobada", - subject: "Cuenta aprobada: {{name}}", - bodyHtml: "

Esta cuenta ha sido aprobada y ya es un dato consolidado.

" - }, - "crm.account_rejected": { - label: "Cuenta no aprobada", - subject: "Cuenta no aprobada: {{name}}", - bodyHtml: "

Esta cuenta no fue aprobada. Corrige sus datos y solicita otra revisi\xF3n.

" - }, - "crm.contact_welcome": { - label: "Nuevo contacto", - subject: "Nuevo contacto: {{first_name}} {{last_name}}", - bodyHtml: "

{{first_name}} {{last_name}} se ha a\xF1adido como contacto. Ponte en contacto para darle la bienvenida.

" - }, - "crm.deal_stalled": { - label: "Oportunidad estancada", - subject: "Oportunidad estancada: {{name}}", - bodyHtml: "

La oportunidad {{name}} lleva {{days_in_stage}} d\xEDas en {{stage}}. Es hora de avanzarla o volver a cualificarla.

" - }, - "crm.large_deal_won": { - label: "Gran operaci\xF3n ganada", - subject: "Gran operaci\xF3n ganada: {{name}}", - bodyHtml: "

{{name}} se cerr\xF3 por {{amount}}. Enhorabuena al equipo.

" - }, - "crm.lead_conversion_approved": { - label: "Cliente potencial aprobado para conversi\xF3n", - subject: "Cliente potencial aprobado para conversi\xF3n: {{first_name}} {{last_name}}", - bodyHtml: "

Este cliente potencial ha sido aprobado. Puedes convertirlo en cuenta, contacto y oportunidad.

" - }, - "crm.lead_conversion_rejected": { - label: "Cliente potencial no aprobado", - subject: "Cliente potencial no aprobado: {{first_name}} {{last_name}}", - bodyHtml: "

La conversi\xF3n de este cliente potencial no fue aprobada. Sigue trabaj\xE1ndolo o descalif\xEDcalo indicando un motivo.

" - }, - "crm.lead_converted": { - label: "Cliente potencial convertido", - subject: "Cliente potencial convertido: {{first_name}} {{last_name}}", - bodyHtml: "

El cliente potencial {{first_name}} {{last_name}} se convirti\xF3 en cuenta y contacto.

" - }, - "crm.lead_routing_hot": { - label: "Asignaci\xF3n de cliente potencial caliente", - subject: "Cliente potencial caliente \u2014 asignar en 24 h: {{first_name}} {{last_name}}", - bodyHtml: "

{{first_name}} {{last_name}} de {{company}} (puntuaci\xF3n {{rating}}) necesita propietario hoy.

" - }, - "crm.lead_routing_new": { - label: "Asignaci\xF3n de cliente potencial", - subject: "Nuevo cliente potencial por asignar: {{first_name}} {{last_name}}", - bodyHtml: "

{{first_name}} {{last_name}} de {{company}} est\xE1 pendiente de asignaci\xF3n.

" - }, - "crm.opportunity_approved": { - label: "Oportunidad aprobada", - subject: "Oportunidad aprobada: {{name}}", - bodyHtml: "

Tu oportunidad {{name}} ha sido aprobada.

" - }, - "crm.opportunity_rejected": { - label: "Oportunidad rechazada", - subject: "Oportunidad rechazada: {{name}}", - bodyHtml: "

Tu oportunidad {{name}} no fue aprobada. Rev\xEDsala y corr\xEDgela antes de volver a enviarla.

" - }, - "crm.task_reminder": { - label: "Recordatorio de tarea", - subject: "Recordatorio de tarea: {{subject}}", - bodyHtml: '

Tu tarea "{{subject}}" vence (recordatorio fijado para {{reminder_date}}).

' - }, - "crm.urgent_task": { - label: "Tarea urgente", - subject: "Tarea urgente: {{subject}}", - bodyHtml: '

Se te ha asignado una tarea urgente "{{subject}}" que requiere atenci\xF3n.

' - } -}; - -// src/sales/email-templates/crm.email-template.ts -var SalesEmailTemplates = bundle({ - "en-US": en3, - "zh-CN": zhCN3, - "ja-JP": jaJP3, - "es-ES": esES3 -}); - -// src/revenue/email-templates/index.ts -var email_templates_exports2 = {}; -__export(email_templates_exports2, { - RevenueEmailTemplates: () => RevenueEmailTemplates -}); - -// src/revenue/email-templates/en.ts -var en4 = { - "crm.contract_expired": { - label: "Contract Expired", - subject: "Contract expired: {{contract_number}}", - bodyHtml: "

Contract {{contract_number}} reached its end date and has been marked expired.

" - }, - "crm.contract_renewal": { - label: "Contract Renewal Due", - subject: "Contract renewal due: {{contract_number}}", - bodyHtml: "

Contract {{contract_number}} ends on {{end_date}}. Start the renewal conversation now.

" - }, - "crm.quote_created": { - label: "Quote Created", - subject: "Quote created: {{quote_name}}", - bodyHtml: "

Your quote {{quote_name}} has been created from this opportunity.

" - } -}; - -// src/revenue/email-templates/zh-CN.ts -var zhCN4 = { - "crm.contract_expired": { - label: "\u5408\u540C\u5DF2\u5230\u671F", - subject: "\u5408\u540C\u5DF2\u5230\u671F\uFF1A{{contract_number}}", - bodyHtml: "

\u5408\u540C {{contract_number}} \u5DF2\u5230\u8FBE\u7ED3\u675F\u65E5\u671F\uFF0C\u5E76\u5DF2\u6807\u8BB0\u4E3A\u5230\u671F\u3002

" - }, - "crm.contract_renewal": { - label: "\u5408\u540C\u7EED\u7EA6\u63D0\u9192", - subject: "\u5408\u540C\u5F85\u7EED\u7EA6\uFF1A{{contract_number}}", - bodyHtml: "

\u5408\u540C {{contract_number}} \u5C06\u4E8E {{end_date}} \u7ED3\u675F\u3002\u8BF7\u7ACB\u5373\u542F\u52A8\u7EED\u7EA6\u6C9F\u901A\u3002

" - }, - "crm.quote_created": { - label: "\u62A5\u4EF7\u5355\u5DF2\u521B\u5EFA", - subject: "\u62A5\u4EF7\u5355\u5DF2\u521B\u5EFA\uFF1A{{quote_name}}", - bodyHtml: "

\u60A8\u7684\u62A5\u4EF7\u5355 {{quote_name}} \u5DF2\u4ECE\u8BE5\u5546\u673A\u521B\u5EFA\u3002

" - } -}; - -// src/revenue/email-templates/ja-JP.ts -var jaJP4 = { - "crm.contract_expired": { - label: "\u5951\u7D04\u306E\u6E80\u4E86", - subject: "\u5951\u7D04\u304C\u6E80\u4E86\u3057\u307E\u3057\u305F: {{contract_number}}", - bodyHtml: "

\u5951\u7D04 {{contract_number}} \u306F\u7D42\u4E86\u65E5\u306B\u9054\u3057\u3001\u6E80\u4E86\u3068\u3057\u3066\u8A18\u9332\u3055\u308C\u307E\u3057\u305F\u3002

" - }, - "crm.contract_renewal": { - label: "\u5951\u7D04\u66F4\u65B0\u306E\u6642\u671F", - subject: "\u5951\u7D04\u306E\u66F4\u65B0\u6642\u671F\u3067\u3059: {{contract_number}}", - bodyHtml: "

\u5951\u7D04 {{contract_number}} \u306F {{end_date}} \u306B\u7D42\u4E86\u3057\u307E\u3059\u3002\u66F4\u65B0\u306E\u76F8\u8AC7\u3092\u59CB\u3081\u3066\u304F\u3060\u3055\u3044\u3002

" - }, - "crm.quote_created": { - label: "\u898B\u7A4D\u306E\u4F5C\u6210", - subject: "\u898B\u7A4D\u3092\u4F5C\u6210\u3057\u307E\u3057\u305F: {{quote_name}}", - bodyHtml: "

\u3053\u306E\u5546\u8AC7\u304B\u3089\u898B\u7A4D {{quote_name}} \u304C\u4F5C\u6210\u3055\u308C\u307E\u3057\u305F\u3002

" - } -}; - -// src/revenue/email-templates/es-ES.ts -var esES4 = { - "crm.contract_expired": { - label: "Contrato vencido", - subject: "Contrato vencido: {{contract_number}}", - bodyHtml: "

El contrato {{contract_number}} alcanz\xF3 su fecha de fin y se ha marcado como vencido.

" - }, - "crm.contract_renewal": { - label: "Renovaci\xF3n de contrato pendiente", - subject: "Renovaci\xF3n de contrato pendiente: {{contract_number}}", - bodyHtml: "

El contrato {{contract_number}} finaliza el {{end_date}}. Inicia ya la conversaci\xF3n de renovaci\xF3n.

" - }, - "crm.quote_created": { - label: "Presupuesto creado", - subject: "Presupuesto creado: {{quote_name}}", - bodyHtml: "

Tu presupuesto {{quote_name}} se ha creado a partir de esta oportunidad.

" - } -}; - -// src/revenue/email-templates/crm.email-template.ts -var RevenueEmailTemplates = bundle({ - "en-US": en4, - "zh-CN": zhCN4, - "ja-JP": jaJP4, - "es-ES": esES4 -}); - -// src/sales/profiles/tenant-admin.profile.ts -var TenantAdminProfile = { - name: "tenant_admin", - label: "Tenant Administrator", - // Derived, never transcribed — see the note above. Spread rather than - // aliased so the two sets are independent values in the built artifact. - objects: { ...SystemAdminProfile.objects }, - systemPermissions: [ - "view_setup", - // The one substitution this profile exists for: org-scoped member - // management instead of platform-wide user management. - "manage_org_users", - // Org-bounded by the driver's tenant predicate — see the audit above. - "view_all_data", - "modify_all_data", - "manage_sharing" - ] -}; - -// src/sales/objects/account.hook.ts -var accountHook = { - name: "account_protection", - object: "crm_account", - events: ["beforeInsert", "beforeUpdate", "beforeDelete"], - priority: 200, - description: "Validate account fields and protect customer accounts with opportunities or activated contracts from deletion.", - handler: async (ctx) => { - function refuse(message, code, status, userMessage = message) { - const err = new Error(message); - err.code = code; - err.status = status; - err.userMessage = userMessage; - return err; - } - const { event, input } = ctx; - if (event === "beforeInsert" || event === "beforeUpdate") { - if (typeof input.website === "string" && input.website.length > 0) { - if (!/^https?:\/\//i.test(input.website)) { - throw refuse("Website must start with http:// or https://", "VALIDATION_FAILED", 400); - } - } - if (typeof input.annual_revenue === "number" && input.annual_revenue < 0) { - throw refuse("Annual Revenue must be greater than or equal to 0", "VALIDATION_FAILED", 400); - } - if ("billing_address" in input || event === "beforeInsert") { - const address = input.billing_address; - const country = address !== null && typeof address === "object" && !Array.isArray(address) ? address.country : void 0; - const normalized = typeof country === "string" ? country.trim().replace(/\s+/g, " ").toUpperCase() : ""; - if ("billing_address" in input) { - input.billing_country = normalized === "" ? null : normalized; - } - const TERRITORY_BY_COUNTRY = { - "US": "na", - "CA": "na", - "MX": "na", - "GB": "emea", - "DE": "emea", - "FR": "emea", - "IT": "emea", - "ES": "emea", - "UNITED STATES": "na", - "UNITED STATES OF AMERICA": "na", - "USA": "na", - "CANADA": "na", - "MEXICO": "na", - "UK": "emea", - "UNITED KINGDOM": "emea", - "GREAT BRITAIN": "emea", - "GERMANY": "emea", - "FRANCE": "emea", - "ITALY": "emea", - "SPAIN": "emea" - }; - input.territory = TERRITORY_BY_COUNTRY[normalized] || "other"; - } - if ("name" in input) { - const rawName = input.name; - const normalizedName = typeof rawName === "string" ? rawName.trim().toLowerCase().replace(/\s+/g, " ") : ""; - input.name_normalized = normalizedName === "" ? null : normalizedName; - } - } - if (event === "beforeUpdate" && ctx.user?.id && ctx.dispatch?.mode !== "per-row") { - const prev = ctx.previous ?? {}; - const ownerChanged = typeof input.owner_id !== "undefined" && input.owner_id !== prev.owner_id; - const typeChanged = typeof input.type !== "undefined" && input.type !== prev.type; - if (ownerChanged || typeChanged) { - input.last_activity_date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10); - } - } - if (event === "beforeDelete") { - const previous = ctx.previous; - if (!previous || previous.type !== "customer") return; - const api = ctx.api; - if (!api) return; - const opportunities2 = await api.object("crm_opportunity").count({ - where: { crm_account: previous.id } - }); - if (opportunities2 > 0) { - throw refuse( - opportunities2 === 1 ? "Cannot delete customer account: 1 opportunity, open or closed, still references it. Delete the opportunity first, or mark the account inactive to retire it instead." : `Cannot delete customer account: ${opportunities2} opportunities, open or closed, still reference it. Delete the opportunities first, or mark the account inactive to retire it instead.`, - "DELETE_RESTRICTED", - 409 - ); - } - const activeContracts = await api.object("crm_contract").count({ - where: { crm_account: previous.id, status: "activated" } - }); - if (activeContracts > 0) { - throw refuse( - activeContracts === 1 ? "Cannot delete customer account: 1 activated contract still references it. Terminate or reassign it first." : `Cannot delete customer account: ${activeContracts} activated contracts still reference it. Terminate or reassign them first.`, - "DELETE_RESTRICTED", - 409 - ); - } - } - } -}; -var account_hook_default = accountHook; - -// src/sales/objects/contact.hook.ts -var contactHook = { - name: "contact_integrity", - object: "crm_contact", - events: ["beforeInsert", "beforeUpdate", "beforeDelete"], - priority: 200, - description: "Dedupe contacts by email and protect referenced contacts from deletion.", - handler: async (ctx) => { - function refuse(message, code, status, userMessage = message) { - const err = new Error(message); - err.code = code; - err.status = status; - err.userMessage = userMessage; - return err; - } - const { event, input } = ctx; - const api = ctx.api; - if ((event === "beforeInsert" || event === "beforeUpdate") && api) { - const email = typeof input.email === "string" ? input.email.toLowerCase() : ""; - if (email) { - input.email = email; - const organizationId = [ - ctx.user?.organizationId, - ctx.session?.organizationId, - input.organization_id, - ctx.previous?.organization_id - ].find((candidate) => typeof candidate === "string" && candidate !== ""); - if (organizationId || ctx.user?.id) { - const dup = await api.object("crm_contact").findOne({ - where: organizationId ? { organization_id: organizationId, email } : { email } - }); - const dupRow = dup; - const dupId = dupRow?.id; - const selfId = ctx.previous?.id ?? input.id; - if (dup && dupId !== selfId) { - const dupName = [dupRow?.first_name, dupRow?.last_name].filter((part) => typeof part === "string" && part.trim() !== "").join(" "); - throw refuse( - dupName ? `Another contact (${dupName}) with email ${email} already exists.` : `Another contact with email ${email} already exists.`, - "DUPLICATE_VALUE", - 409 - ); - } - } - } - } - if (event === "beforeDelete" && api) { - const id = ctx.previous?.id; - if (!id) return; - const [openOpps, openQuotes, activeContracts] = await Promise.all([ - api.object("crm_opportunity").count({ - where: { primary_contact: id, stage: { $nin: ["closed_won", "closed_lost"] } } - }), - api.object("crm_quote").count({ - where: { crm_contact: id, status: { $nin: ["rejected", "expired"] } } - }), - api.object("crm_contract").count({ - where: { crm_contact: id, status: "activated" } - }) - ]); - const total = openOpps + openQuotes + activeContracts; - if (total > 0) { - const name = [ctx.previous?.first_name, ctx.previous?.last_name].filter((part) => typeof part === "string" && part.trim() !== "").join(" "); - const subject = name ? `Contact ${name}` : "This contact"; - throw refuse( - `${subject} is still referenced by ${openOpps} open opportunity(ies), ${openQuotes} active quote(s), ${activeContracts} active contract(s), so it cannot be deleted \u2014 and neither can its account, because deleting an account deletes its contacts. Close or reassign the opportunities and quotes first, and give each contract another primary contact: a contract keeps its primary contact even after it ends.`, - "DELETE_RESTRICTED", - 409 - ); - } - } - } -}; -var contact_hook_default = contactHook; - -// src/sales/objects/event.hook.ts -var eventScheduleDerive = { - name: "event_schedule_derive", - object: "crm_event", - events: ["beforeInsert", "beforeUpdate"], - priority: 200, - description: "Keep start/end/duration coherent: derive whichever of end_datetime or duration_minutes was not supplied.", - handler: async (ctx) => { - if (ctx.event === "beforeUpdate" && ctx.dispatch?.mode === "per-row") return; - const { input } = ctx; - const previous = ctx.previous; - const effective = (key) => input[key] !== void 0 && input[key] !== null ? input[key] : previous?.[key]; - const start = effective("start_datetime"); - const end = effective("end_datetime"); - const durationRaw = effective("duration_minutes"); - const startMs = typeof start === "string" || start instanceof Date ? new Date(start).getTime() : NaN; - const endMs = typeof end === "string" || end instanceof Date ? new Date(end).getTime() : NaN; - const duration = typeof durationRaw === "number" && isFinite(durationRaw) ? durationRaw : NaN; - const allDay = effective("all_day") === true; - if (!isNaN(startMs) && !isNaN(endMs)) { - if (!allDay) input.duration_minutes = Math.max(0, Math.round((endMs - startMs) / 6e4)); - } else if (!isNaN(startMs) && isNaN(endMs) && !isNaN(duration) && duration > 0) { - input.end_datetime = new Date(startMs + duration * 6e4).toISOString(); - } - const status = effective("status"); - if (status === "cancelled" || status === "no_show") input.duration_minutes = 0; - } -}; -var eventActivityBubble = { - name: "event_activity_bubble", - object: "crm_event", - events: ["afterInsert", "afterUpdate"], - priority: 800, - async: true, - onError: "log", - runAs: "system", - description: "A held event stamps interaction recency on the related account (walking up from contact/opportunity/case), lead and contact, and the first-response time on a related case.", - handler: async (ctx) => { - const { input } = ctx; - const previous = ctx.previous; - const api = ctx.api; - if (!api) return; - const r = { ...previous ?? {}, ...input }; - if (r.status !== "held") return; - if (previous && previous.status === "held") return; - const nowIso = (/* @__PURE__ */ new Date()).toISOString(); - const today = nowIso.slice(0, 10); - const idOf = (key) => typeof r[key] === "string" && r[key].length > 0 ? r[key] : void 0; - const org = idOf("organization_id"); - const inOrg = org ? { organization_id: org } : {}; - const accountIds = /* @__PURE__ */ new Set(); - const contactIds = /* @__PURE__ */ new Set(); - const leadIds = /* @__PURE__ */ new Set(); - const direct = idOf("related_to_account"); - if (direct) accountIds.add(direct); - const contactId = idOf("related_to_contact"); - if (contactId) contactIds.add(contactId); - const leadId = idOf("related_to_lead"); - if (leadId) leadIds.add(leadId); - const parentLookups = [ - ["related_to_contact", "crm_contact"], - ["related_to_opportunity", "crm_opportunity"], - ["related_to_case", "crm_case"] - ]; - for (const [field, object] of parentLookups) { - const id = idOf(field); - if (!id) continue; - try { - const raw = await api.object(object).find({ - where: { id, ...inOrg }, - fields: ["crm_account"], - top: 1 - }); - const rows = Array.isArray(raw) ? raw : raw?.records ?? []; - const parent = rows.length ? rows[0].crm_account : void 0; - if (typeof parent === "string" && parent.length > 0) accountIds.add(parent); - } catch { - } - } - const targets = [ - ["crm_account", accountIds, { last_activity_date: today }], - ["crm_contact", contactIds, { last_contacted_date: nowIso }], - ["crm_lead", leadIds, { last_contacted_date: nowIso }] - ]; - for (const [object, ids, doc] of targets) { - let inside = [...ids]; - if (org && inside.length > 0) { - try { - const raw = await api.object(object).find({ where: { id: { $in: inside }, ...inOrg }, fields: ["id"], top: inside.length }); - inside = (Array.isArray(raw) ? raw : raw?.records ?? []).map((row) => String(row.id)); - } catch { - inside = []; - } - } - for (const id of inside) { - try { - await api.object(object).update({ ...doc, id }, { where: { id } }); - } catch { - } - } - } - const responseCaseId = idOf("related_to_case"); - if (responseCaseId) { - try { - const raw = await api.object("crm_case").find({ - where: { id: responseCaseId, ...inOrg }, - fields: ["first_response_date"], - top: 1 - }); - const rows = Array.isArray(raw) ? raw : raw?.records ?? []; - if (rows.length > 0 && !rows[0].first_response_date) { - await api.object("crm_case").update( - { id: responseCaseId, first_response_date: nowIso }, - { where: { id: responseCaseId } } - ); - } - } catch { - } - } - } -}; -var eventDoNotCallGuard = { - name: "event_do_not_call_guard", - object: "crm_event", - events: ["beforeInsert", "beforeUpdate"], - priority: 150, - description: "Refuse to book a planned Call event against a lead/contact flagged Do Not Call.", - handler: async (ctx) => { - function refuse(message, code, status, userMessage = message) { - const err = new Error(message); - err.code = code; - err.status = status; - err.userMessage = userMessage; - return err; - } - const { input } = ctx; - const previous = ctx.previous; - const api = ctx.api; - if (!api) return; - const effective = (key) => input[key] !== void 0 && input[key] !== null ? input[key] : previous?.[key]; - if (effective("type") !== "call") return; - if (effective("status") !== "planned") return; - const leadId = effective("related_to_lead"); - const contactId = effective("related_to_contact"); - const targets = []; - if (typeof leadId === "string" && leadId) { - targets.push({ object: "crm_lead", id: leadId, label: "lead" }); - } - if (typeof contactId === "string" && contactId) { - targets.push({ object: "crm_contact", id: contactId, label: "contact" }); - } - for (const t of targets) { - const raw = await api.object(t.object).find({ - where: { id: t.id }, - fields: ["id", "do_not_call"], - top: 1 - }); - const rows = Array.isArray(raw) ? raw : raw?.records ?? []; - const person = rows[0]; - if (person?.do_not_call === true) { - throw refuse( - `This ${t.label} is flagged Do Not Call, so a call cannot be scheduled against them. Log the call as held if it already happened, book a meeting instead, or clear Do Not Call on the record first.`, - "FORBIDDEN", - 403 - ); - } - } - } -}; -var event_hook_default = [eventScheduleDerive, eventDoNotCallGuard, eventActivityBubble]; - -// src/sales/objects/forecast.hook.ts -var forecastDerive = { - name: "forecast_derive_period", - object: "crm_forecast", - events: ["beforeInsert", "beforeUpdate"], - priority: 200, - description: "Derive period_start, period_end and period_label from period (+ snapshot_date).", - handler: async (ctx) => { - if (ctx.event === "beforeUpdate" && ctx.dispatch?.mode === "per-row") return; - const pad = (n) => String(n).padStart(2, "0"); - const isoDate = (d) => `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`; - const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - const endOfMonth = (start) => new Date(Date.UTC(start.getUTCFullYear(), start.getUTCMonth() + 1, 0)); - const endOfQuarter = (start) => new Date(Date.UTC(start.getUTCFullYear(), start.getUTCMonth() + 3, 0)); - const startOfPeriod = (period2, d) => new Date(Date.UTC( - d.getUTCFullYear(), - period2 === "quarter" ? Math.floor(d.getUTCMonth() / 3) * 3 : d.getUTCMonth(), - 1 - )); - const labelFor = (period2, start) => { - if (period2 === "quarter") { - const q = Math.floor(start.getUTCMonth() / 3) + 1; - return `Q${q} ${start.getUTCFullYear()}`; - } - return `${MONTHS[start.getUTCMonth()]} ${start.getUTCFullYear()}`; - }; - const { input } = ctx; - const previous = ctx.previous; - const period = typeof input.period === "string" && input.period || typeof previous?.period === "string" && previous.period || "month"; - let startStr = typeof input.period_start === "string" && input.period_start || typeof previous?.period_start === "string" && previous.period_start || void 0; - if (!startStr) { - const anchorStr = typeof input.snapshot_date === "string" && input.snapshot_date || typeof previous?.snapshot_date === "string" && previous.snapshot_date || isoDate(/* @__PURE__ */ new Date()); - const anchor = /* @__PURE__ */ new Date(`${anchorStr.slice(0, 10)}T00:00:00Z`); - if (!Number.isNaN(anchor.getTime())) { - startStr = isoDate(startOfPeriod(period, anchor)); - input.period_start = startStr; - } - } - if (startStr) { - const start = /* @__PURE__ */ new Date(`${startStr}T00:00:00Z`); - if (!Number.isNaN(start.getTime())) { - const end = period === "quarter" ? endOfQuarter(start) : endOfMonth(start); - if (!input.period_end) input.period_end = isoDate(end); - if (!input.period_label) input.period_label = labelFor(period, start); - } - } - if (!input.snapshot_date && !previous?.snapshot_date) { - input.snapshot_date = isoDate(/* @__PURE__ */ new Date()); - } - } -}; -var forecast_hook_default = forecastDerive; - -// src/sales/objects/lead.hook.ts -var leadAutoAssignHook = { - name: "lead_auto_assign", - object: "crm_lead", - events: ["beforeInsert"], - priority: 250, - description: "Assign ownerless new leads to the least-loaded sales rep.", - handler: async (ctx) => { - const { input } = ctx; - if (typeof input.owner_id === "string" && input.owner_id) return; - const api = ctx.api; - if (!api) return; - try { - const holders = await api.object("sys_user_position").find({ - where: { position: "sales_rep" }, - fields: ["user_id"], - top: 1e3 - }); - const repIds = Array.from( - new Set( - (holders ?? []).map((r) => typeof r.user_id === "string" ? r.user_id : "").filter(Boolean) - ) - ); - if (repIds.length === 0) return; - let best; - let bestCount = Infinity; - for (const repId of repIds) { - const openCount = await api.object("crm_lead").count({ - where: { owner_id: repId, is_converted: false } - }); - if (openCount < bestCount) { - bestCount = openCount; - best = repId; - } - } - if (best) input.owner_id = best; - } catch { - } - } -}; -var leadHook = { - name: "lead_automation", - object: "crm_lead", - events: ["beforeInsert", "beforeUpdate", "afterUpdate"], - priority: 200, - description: "Score new leads, lock converted leads, and create follow-up task on qualification.", - handler: async (ctx) => { - function refuse(message, code, status, userMessage = message) { - const err = new Error(message); - err.code = code; - err.status = status; - err.userMessage = userMessage; - return err; - } - const { event, input } = ctx; - const HIGH_VALUE_INDUSTRIES = /* @__PURE__ */ new Set(["technology", "finance", "healthcare"]); - const SENIOR_TITLE_PATTERN = /\b(ceo|cto|cfo|cio|coo|founder|vp|vice president|director|head of)\b/i; - function computeRating(input2) { - let score = 0; - const email = typeof input2.email === "string" ? input2.email : ""; - const phone = typeof input2.phone === "string" ? input2.phone : ""; - const title = typeof input2.title === "string" ? input2.title : ""; - const industry = typeof input2.industry === "string" ? input2.industry : ""; - const employees = typeof input2.number_of_employees === "number" ? input2.number_of_employees : 0; - const revenue = typeof input2.annual_revenue === "number" ? input2.annual_revenue : 0; - if (email && !/(gmail|yahoo|hotmail|outlook|qq|163)\.com$/i.test(email)) score += 1; - if (phone.length > 0) score += 0.5; - if (SENIOR_TITLE_PATTERN.test(title)) score += 1.5; - if (HIGH_VALUE_INDUSTRIES.has(industry)) score += 1; - if (employees >= 200) score += 0.5; - if (revenue >= 1e7) score += 0.5; - const clamped = Math.max(1, Math.min(5, score)); - return Math.round(clamped); - } - if (event === "beforeInsert") { - const isGuestSubmission = !ctx.user?.id && !ctx.session?.isSystem; - if (isGuestSubmission) { - if (!input.lead_source) input.lead_source = "web"; - if (!input.status) input.status = "new"; - input.is_converted = false; - input.converted_account = null; - input.converted_contact = null; - input.converted_opportunity = null; - input.converted_date = null; - input.owner_id = null; - input.duplicate_of_type = null; - input.duplicate_of_lead = null; - input.duplicate_of_contact = null; - input.duplicate_status = null; - } - if (typeof input.rating !== "number") { - input.rating = computeRating(input); - } - } - if (event === "beforeUpdate") { - const previous = ctx.previous; - const wasConverted = previous?.is_converted === true || previous?.status === "converted"; - const isConverting = !wasConverted && (input.is_converted === true || input.status === "converted"); - const verdict = previous?.conversion_approval_status; - if (isConverting && (verdict === "pending" || verdict === "rejected")) { - const person = [previous?.first_name, previous?.last_name].filter((part) => typeof part === "string" && part.trim() !== "").join(" "); - const company = typeof previous?.company === "string" ? previous.company.trim() : ""; - const label = [person, company].filter(Boolean).join(" - "); - const state = verdict === "rejected" ? "was rejected" : "is still awaiting approval"; - throw refuse( - `Cannot convert ${label ? `lead ${label}` : "this lead"}: its conversion ${state}. Conversion opens once an approver signs it off \u2014 the Conversion Approval field on the lead shows where it stands.`, - "RECORD_LOCKED", - 409 - ); - } - } - if (event === "beforeUpdate" && ctx.user?.id) { - const previous = ctx.previous; - const wasConverted = previous?.is_converted === true || previous?.status === "converted"; - if (wasConverted) { - const ALLOWED = /* @__PURE__ */ new Set([ - "description", - "notes", - // Framework-managed / system columns (cf. opportunity.hook.ts). - "id", - "owner_id", - "created_at", - "updated_at", - "created_by", - "updated_by", - "space_id", - "organization_id", - "org_id", - "version" - ]); - const violating = Object.keys(input).filter( - (k) => !ALLOWED.has(k) && input[k] !== previous?.[k] - ); - if (violating.length > 0) { - const REFERENCE_FIELDS = /* @__PURE__ */ new Set([ - "converted_account", - "converted_contact", - "converted_opportunity", - "duplicate_of_lead", - "duplicate_of_contact" - ]); - const isReferenceCleanup = violating.every( - (k) => REFERENCE_FIELDS.has(k) && input[k] === null && previous?.[k] != null - ); - if (isReferenceCleanup) return; - const person = [previous?.first_name, previous?.last_name].filter((part) => typeof part === "string" && part.trim() !== "").join(" "); - const company = typeof previous?.company === "string" ? previous.company.trim() : ""; - const label = [person, company].filter(Boolean).join(" - "); - throw refuse( - `Cannot edit ${label ? `converted lead ${label}` : "a converted lead"} (attempted: ${violating.join(", ")}). Make changes on the converted records instead.`, - "RECORD_LOCKED", - 409 - ); - } - } - } - if (event === "afterUpdate") { - const previous = ctx.previous; - const becameQualified = input.status === "qualified" && previous?.status !== "qualified"; - if (!becameQualified) return; - const api = ctx.api; - if (!api) return; - const leadId = typeof input.id === "string" && input.id || typeof previous?.id === "string" && previous.id || void 0; - const ownerId = typeof input.owner_id === "string" && input.owner_id || typeof previous?.owner_id === "string" && previous.owner_id || ctx.user?.id; - const dueDate = /* @__PURE__ */ new Date(); - dueDate.setUTCDate(dueDate.getUTCDate() + 2); - const person = [ - typeof input.first_name === "string" && input.first_name || previous?.first_name, - typeof input.last_name === "string" && input.last_name || previous?.last_name - ].filter((part) => typeof part === "string" && part.trim() !== "").join(" "); - const company = typeof input.company === "string" && input.company.trim() || typeof previous?.company === "string" && previous.company.trim() || ""; - const label = [person, company].filter(Boolean).join(" - "); - const titled = label ? `Follow up with qualified lead: ${label}` : "Follow up with qualified lead"; - try { - await api.object("crm_task").insert({ - subject: titled.length > 255 ? `${titled.slice(0, 254)}\u2026` : titled, - status: "not_started", - priority: "high", - type: "follow_up", - due_date: dueDate.toISOString().slice(0, 10), - // Unlike `lead_auto_assign` above, this is a SEPARATE insert on - // `ctx.api` — a new operation carrying the caller's context, so the - // #3004 transfer guard does apply to it. When the qualifier is the - // lead's own rep (`owner_id` == caller) it is not a transfer at all; - // a manager qualifying a rep's lead holds `allowTransfer`. Any other - // caller is denied and the catch below drops the task rather than - // landing it on the wrong desk. - owner_id: ownerId, - related_to_type: "crm_lead", - related_to_lead: leadId - }); - } catch { - } - } - } -}; -var leadDuplicateCheckHook = { - name: "lead_duplicate_check", - object: "crm_lead", - events: ["beforeInsert", "beforeUpdate"], - priority: 300, - description: "Normalize lead email and company match key; flag a re-captured address as a suspected duplicate of the record it repeats.", - handler: async (ctx) => { - const { event, input } = ctx; - const SCAN_LIMIT = 50; - const isBlank = (value) => value === void 0 || value === null || typeof value === "string" && value.trim() === ""; - if (typeof input.email === "string") { - input.email = input.email.trim().toLowerCase(); - } - const email = typeof input.email === "string" ? input.email : ""; - if ("company" in input) { - const rawCompany = input.company; - const normalizedCompany = typeof rawCompany === "string" ? rawCompany.trim().toLowerCase().replace(/\s+/g, " ") : ""; - input.company_normalized = normalizedCompany === "" ? null : normalizedCompany; - } - if (event === "beforeUpdate" && ctx.dispatch?.mode !== "per-row") { - const previous = ctx.previous; - const LINK_OF_TYPE = { - crm_lead: "duplicate_of_lead", - crm_contact: "duplicate_of_contact" - }; - const restated = "duplicate_of_type" in input && !isBlank(input.duplicate_of_type); - const declared = previous?.duplicate_of_type; - const link = typeof declared === "string" ? LINK_OF_TYPE[declared] : void 0; - if (!restated && link && link in input && isBlank(input[link])) { - if (!("duplicate_status" in input) && previous?.duplicate_status === "confirmed") { - input.duplicate_of_type = "erased"; - } else { - input.duplicate_of_type = null; - input.duplicate_status = null; - } - } - } - if (event !== "beforeInsert" || !email) return; - if (!isBlank(input.duplicate_status) || !isBlank(input.duplicate_of_type)) return; - const api = ctx.api; - if (!api) return; - const original = (rows) => { - let best; - let bestKey = Infinity; - for (const row of rows) { - const id = typeof row.id === "string" ? row.id : ""; - if (!id) continue; - const raw = row.created_at; - const parsed = typeof raw === "string" || typeof raw === "number" || raw instanceof Date ? new Date(raw).getTime() : Number.NaN; - const key = Number.isFinite(parsed) ? parsed : Infinity; - if (best === void 0 || key < bestKey) { - best = id; - bestKey = key; - } - } - return best; - }; - try { - const contacts2 = await api.object("crm_contact").find({ - where: { email }, - fields: ["id", "created_at"], - top: SCAN_LIMIT - }); - const contactId = original(contacts2 ?? []); - if (contactId) { - input.duplicate_of_type = "crm_contact"; - input.duplicate_of_contact = contactId; - input.duplicate_status = "suspected"; - return; - } - const leads2 = await api.object("crm_lead").find({ - where: { email, is_converted: false }, - fields: ["id", "created_at"], - top: SCAN_LIMIT - }); - const leadId = original(leads2 ?? []); - if (leadId) { - input.duplicate_of_type = "crm_lead"; - input.duplicate_of_lead = leadId; - input.duplicate_status = "suspected"; - } - } catch { - } - } -}; -var lead_hook_default = [leadAutoAssignHook, leadHook, leadDuplicateCheckHook]; - -// src/sales/objects/lead.campaign-metrics.hook.ts -var campaignLeadConversionRefresh = { - name: "campaign_lead_conversion_refresh", - object: "crm_lead", - events: ["afterUpdate"], - priority: 810, - async: true, - onError: "log", - runAs: "system", - description: "Promote campaign members of a converting lead and recompute campaign metrics.", - handler: async (ctx) => { - const api = ctx.api; - if (!api) return; - const { input } = ctx; - const previous = ctx.previous; - if (input?.is_converted !== true) return; - if (previous?.is_converted === true) return; - const leadId = typeof input?.id === "string" && input.id || (typeof previous?.id === "string" ? previous.id : ""); - if (!leadId) return; - const memberships = await api.object("crm_campaign_member").find({ - where: { crm_lead: leadId }, - fields: ["id", "crm_campaign", "status"], - top: 500 - }); - for (const m of memberships) { - const memberId = typeof m.id === "string" ? m.id : ""; - if (!memberId) continue; - if (m.status !== "sent" && m.status !== "responded") continue; - await api.object("crm_campaign_member").update( - { id: memberId, status: "converted" }, - { where: { id: memberId } } - ); - } - const campaignIds = Array.from(new Set( - memberships.map((m) => typeof m.crm_campaign === "string" ? m.crm_campaign : "").filter(Boolean) - )); - for (const id of campaignIds) { - const memberRows = await api.object("crm_campaign_member").find({ - where: { crm_campaign: id }, - fields: ["crm_lead", "status"], - top: 5e3 - }); - const leadIds = Array.from(new Set( - memberRows.map((r) => typeof r.crm_lead === "string" ? r.crm_lead : "").filter(Boolean) - )); - const convertedLeads = leadIds.length > 0 ? await api.object("crm_lead").count({ where: { id: { $in: leadIds }, is_converted: true } }) : 0; - const numOpportunities = await api.object("crm_opportunity").count({ where: { crm_campaign: id } }); - const numWon = await api.object("crm_opportunity").count({ where: { crm_campaign: id, stage: "closed_won" } }); - const wonRows = await api.object("crm_opportunity").find({ - where: { crm_campaign: id, stage: "closed_won" }, - fields: ["amount"], - top: 5e3 - }); - const actualRevenue = wonRows.reduce( - (sum, row) => sum + (typeof row.amount === "number" ? row.amount : Number(row.amount) || 0), - 0 - ); - await api.object("crm_campaign").update({ - id, - num_sent: memberRows.length, - num_responses: memberRows.filter((r) => r.status === "responded" || r.status === "converted").length, - num_leads: leadIds.length, - num_converted_leads: convertedLeads, - num_opportunities: numOpportunities, - num_won_opportunities: numWon, - actual_revenue: actualRevenue - }, { where: { id } }); - } - } -}; -var lead_campaign_metrics_hook_default = [campaignLeadConversionRefresh]; - -// src/sales/objects/opportunity.hook.ts -var opportunityValidationHook = { - name: "opportunity_lifecycle", - object: "crm_opportunity", - events: ["beforeInsert", "beforeUpdate"], - priority: 200, - description: "Recompute expected_revenue, freeze closed opportunities except narrative fields.", - handler: async (ctx) => { - function refuse(message, code, status, userMessage = message) { - const err = new Error(message); - err.code = code; - err.status = status; - err.userMessage = userMessage; - return err; - } - const STAGE_PROBABILITY = { - prospecting: 10, - qualification: 25, - needs_analysis: 40, - proposal: 60, - negotiation: 80, - closed_won: 100, - closed_lost: 0 - }; - const NARRATIVE_FIELDS = /* @__PURE__ */ new Set(["description", "next_step", "notes"]); - const SYSTEM_FIELDS = /* @__PURE__ */ new Set([ - "id", - "owner_id", - "created_at", - "updated_at", - "created_by", - "updated_by", - "space_id", - "organization_id", - "org_id", - "version" - ]); - const APPROVAL_FIELDS = /* @__PURE__ */ new Set([ - "approval_status", - "approved_date", - "status_change_approval_status", - "requested_status", - "qualification_approval_status", - "qualification_requested" - ]); - const STAGE_FORECAST = { - prospecting: "pipeline", - qualification: "pipeline", - needs_analysis: "best_case", - proposal: "commit", - negotiation: "commit", - closed_won: "closed", - closed_lost: "omitted" - }; - const { event, input } = ctx; - const previous = ctx.previous; - if (event === "beforeUpdate" && previous && ctx.user?.id) { - const qualification = input.qualification_approval_status ?? previous.qualification_approval_status; - if (qualification === "pending" || qualification === "rejected") { - const held = []; - if (typeof input.stage === "string" && input.stage !== previous.stage) held.push("Stage"); - if (typeof input.requested_status === "string" && input.requested_status !== "" && input.requested_status !== previous.requested_status) { - held.push("Requested Status"); - } - if (held.length > 0) { - throw refuse( - `This deal needs qualification approval first: tick Request Qualification Approval. ${held.join(" and ")} can change once it is approved.`, - "RECORD_LOCKED", - 409 - ); - } - } - } - if (event === "beforeUpdate" && previous && ctx.user?.id) { - const gate = input.status_change_approval_status ?? previous.status_change_approval_status; - const next = input.stage; - const closing = (next === "closed_won" || next === "closed_lost") && next !== previous.stage; - if (closing && (gate === "pending" || gate === "rejected")) { - throw refuse( - "This deal's status change needs approval: set Requested Status (and the win/loss reason) instead. The stage takes effect when the request is approved.", - "RECORD_LOCKED", - 409 - ); - } - } - if (event === "beforeUpdate" && previous && ctx.user?.id) { - const prevStage = previous.stage; - const isClosed = prevStage === "closed_won" || prevStage === "closed_lost"; - if (isClosed) { - const violating = Object.keys(input).filter( - (k) => !NARRATIVE_FIELDS.has(k) && !SYSTEM_FIELDS.has(k) && !APPROVAL_FIELDS.has(k) && input[k] !== previous[k] - ); - if (violating.length > 0) { - const REFERENCE_FIELDS = /* @__PURE__ */ new Set(["crm_account", "primary_contact", "crm_campaign"]); - const isReferenceCleanup = violating.every( - (k) => REFERENCE_FIELDS.has(k) && input[k] === null && previous?.[k] != null - ); - if (isReferenceCleanup) return; - const name = typeof previous.name === "string" ? previous.name.trim() : ""; - const subject = name ? `Opportunity ${name}` : "Opportunity"; - throw refuse( - `${subject} is closed (${prevStage}); only ${[...NARRATIVE_FIELDS].join(", ")} may be edited. Attempted: ${violating.join(", ")}.`, - "RECORD_LOCKED", - 409 - ); - } - } - } - if (ctx.event === "beforeUpdate" && ctx.dispatch?.mode === "per-row") return; - const amount = typeof input.amount === "number" ? input.amount : typeof previous?.amount === "number" ? previous.amount : void 0; - const stage = typeof input.stage === "string" ? input.stage : typeof previous?.stage === "string" ? previous.stage : void 0; - if (typeof amount === "number" && stage && STAGE_PROBABILITY[stage] !== void 0) { - input.expected_revenue = Math.round(amount * STAGE_PROBABILITY[stage]) / 100; - } - if (stage && STAGE_PROBABILITY[stage] !== void 0) { - input.probability = STAGE_PROBABILITY[stage]; - } - if (stage && STAGE_FORECAST[stage] !== void 0) { - const stageChanged = event === "beforeInsert" || typeof input.stage === "string" && input.stage !== previous?.stage; - if (stageChanged) input.forecast_category = STAGE_FORECAST[stage]; - } - if (event === "beforeInsert" && !input.stage_entry_date) { - input.stage_entry_date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10); - } - if (event === "beforeUpdate" && previous) { - if (input.stage === "closed_won" && previous.stage !== "closed_won" && !input.close_date) { - input.close_date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10); - } - if (typeof input.stage === "string" && input.stage !== previous.stage) { - input.stage_entry_date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10); - } - } - } -}; -var opportunityWonHook = { - name: "opportunity_promote_account", - object: "crm_opportunity", - events: ["afterUpdate"], - priority: 800, - async: true, - onError: "log", - runAs: "system", - description: "On closed_won: promote linked account to customer and create activation task.", - handler: async (ctx) => { - const { input } = ctx; - const previous = ctx.previous; - const becameWon = input.stage === "closed_won" && previous?.stage !== "closed_won"; - if (!becameWon) return; - const api = ctx.api; - if (!api) return; - const accountId = typeof input.crm_account === "string" && input.crm_account || typeof previous?.crm_account === "string" && previous.crm_account || void 0; - if (!accountId) return; - const account = await api.object("crm_account").findOne({ where: { id: accountId } }); - if (account && account.type !== "customer") { - await api.object("crm_account").update( - { id: accountId, type: "customer" }, - { where: { id: accountId } } - ); - } - const oppId = typeof input.id === "string" && input.id || previous?.id; - const ownerId = typeof input.owner_id === "string" && input.owner_id || typeof previous?.owner_id === "string" && previous.owner_id || ctx.user?.id; - const due = /* @__PURE__ */ new Date(); - due.setUTCDate(due.getUTCDate() + 3); - const oppName = typeof input.name === "string" && input.name.trim() || typeof previous?.name === "string" && previous.name.trim() || ""; - const titled = oppName ? `Activate new customer for opportunity ${oppName}` : "Activate new customer"; - await api.object("crm_task").insert({ - subject: titled.length > 255 ? `${titled.slice(0, 254)}\u2026` : titled, - status: "not_started", - priority: "high", - type: "follow_up", - due_date: due.toISOString().slice(0, 10), - owner_id: ownerId, - related_to_type: "crm_opportunity", - related_to_opportunity: oppId, - related_to_account: accountId - }); - } -}; -var opportunityAccountCapabilityHook = { - name: "opportunity_account_capability", - object: "crm_opportunity", - events: ["beforeInsert"], - priority: 150, - runAs: "system", - description: "Refuse a NEW opportunity linked to an account whose commercial capability is settlement only.", - handler: async (ctx) => { - function refuse(message, code, status, userMessage = message) { - const err = new Error(message); - err.code = code; - err.status = status; - err.userMessage = userMessage; - return err; - } - const api = ctx.api; - if (!api) return; - const accountId = ctx.input.crm_account; - if (typeof accountId !== "string" || accountId === "") return; - const org = ctx.input.organization_id; - const account = await api.object("crm_account").findOne({ - where: { id: accountId, ...typeof org === "string" && org ? { organization_id: org } : {} }, - fields: ["commercial_capability"] - }); - if (!account || account.commercial_capability !== "settlement_only") return; - throw refuse( - "Cannot open an opportunity against this account: its Commercial Capability is Settlement Only, so it is available for billing and payment but no new business may be booked against it. Pick a different account, or have the account reclassified to Full first.", - "VALIDATION_FAILED", - 400 - ); - } -}; -var opportunity_hook_default = [ - opportunityAccountCapabilityHook, - opportunityValidationHook, - opportunityWonHook -]; - -// src/sales/objects/opportunity.campaign-metrics.hook.ts -var campaignAttributionRefresh = { - name: "campaign_attribution_refresh", - object: "crm_opportunity", - events: ["afterInsert", "afterUpdate", "afterDelete"], - priority: 810, - async: true, - onError: "log", - runAs: "system", - description: "Recompute campaign metrics when an opportunity\u2019s campaign attribution changes.", - handler: async (ctx) => { - const api = ctx.api; - if (!api) return; - const { input } = ctx; - const previous = ctx.previous; - const campaignIds = Array.from(new Set([ - typeof input?.crm_campaign === "string" ? input.crm_campaign : "", - typeof previous?.crm_campaign === "string" ? previous.crm_campaign : "" - ].filter(Boolean))); - for (const id of campaignIds) { - const memberRows = await api.object("crm_campaign_member").find({ - where: { crm_campaign: id }, - fields: ["crm_lead", "status"], - top: 5e3 - }); - const leadIds = Array.from(new Set( - memberRows.map((r) => typeof r.crm_lead === "string" ? r.crm_lead : "").filter(Boolean) - )); - const convertedLeads = leadIds.length > 0 ? await api.object("crm_lead").count({ where: { id: { $in: leadIds }, is_converted: true } }) : 0; - const numOpportunities = await api.object("crm_opportunity").count({ where: { crm_campaign: id } }); - const numWon = await api.object("crm_opportunity").count({ where: { crm_campaign: id, stage: "closed_won" } }); - const wonRows = await api.object("crm_opportunity").find({ - where: { crm_campaign: id, stage: "closed_won" }, - fields: ["amount"], - top: 5e3 - }); - const actualRevenue = wonRows.reduce( - (sum, row) => sum + (typeof row.amount === "number" ? row.amount : Number(row.amount) || 0), - 0 - ); - await api.object("crm_campaign").update({ - id, - num_sent: memberRows.length, - num_responses: memberRows.filter((r) => r.status === "responded" || r.status === "converted").length, - num_leads: leadIds.length, - num_converted_leads: convertedLeads, - num_opportunities: numOpportunities, - num_won_opportunities: numWon, - actual_revenue: actualRevenue - }, { where: { id } }); - } - } -}; -var opportunity_campaign_metrics_hook_default = [campaignAttributionRefresh]; - -// src/sales/objects/task.hook.ts -var taskValidation = { - name: "task_completion", - object: "crm_task", - events: ["beforeInsert", "beforeUpdate"], - priority: 200, - description: "Stamp completed/overdue flags + dates on completion and validate reminder timing.", - handler: async (ctx) => { - if (ctx.event === "beforeUpdate" && ctx.dispatch?.mode === "per-row") return; - function refuse(message, code, status, userMessage = message) { - const err = new Error(message); - err.code = code; - err.status = status; - err.userMessage = userMessage; - return err; - } - const { input } = ctx; - const previous = ctx.previous; - if (!previous && input.reminder_sent == null) { - input.reminder_sent = false; - } - const effPriority = typeof input.priority === "string" && input.priority || typeof previous?.priority === "string" && previous.priority || void 0; - if (effPriority) { - const rank = { low: 1, normal: 2, high: 3, urgent: 4 }; - input.priority_rank = rank[effPriority] ?? 0; - } - if (input.status === "completed" && previous?.status !== "completed") { - if (!input.completed_date || !ctx.session?.isSystem) { - input.completed_date = (/* @__PURE__ */ new Date()).toISOString(); - } - if (typeof input.progress_percent !== "number") input.progress_percent = 100; - } - const effStatus = typeof input.status === "string" && input.status || typeof previous?.status === "string" && previous.status || void 0; - if (typeof effStatus === "string") input.is_completed = effStatus === "completed"; - const effDue = typeof input.due_date === "string" && input.due_date || typeof previous?.due_date === "string" && previous.due_date || void 0; - const todayStr = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10); - input.is_overdue = !!effDue && effDue.slice(0, 10) < todayStr && input.is_completed !== true; - const reminder = typeof input.reminder_date === "string" && input.reminder_date || typeof previous?.reminder_date === "string" && previous.reminder_date || void 0; - const due = typeof input.due_date === "string" && input.due_date || typeof previous?.due_date === "string" && previous.due_date || void 0; - if (reminder && due && reminder.slice(0, 10) > due.slice(0, 10)) { - throw refuse( - `Reminder (${reminder}) is after the due date (${due}); reminders should fire before the deadline.`, - "VALIDATION_FAILED", - 400 - ); - } - } -}; -var taskRecurrence = { - name: "task_recurrence", - object: "crm_task", - events: ["afterUpdate"], - priority: 700, - async: true, - onError: "log", - description: "On completion of a recurring task, spawn the next occurrence (dates advanced by recurrence_type \xD7 interval).", - handler: async (ctx) => { - function advanceDate(d, type2, interval2) { - const next = new Date(d); - if (type2 === "daily") { - next.setUTCDate(next.getUTCDate() + interval2); - return next; - } - if (type2 === "weekly") { - next.setUTCDate(next.getUTCDate() + 7 * interval2); - return next; - } - const months = type2 === "monthly" ? interval2 : type2 === "yearly" ? 12 * interval2 : 0; - if (months === 0) return next; - const day = next.getUTCDate(); - next.setUTCDate(1); - next.setUTCMonth(next.getUTCMonth() + months); - const lastDayOfTargetMonth = new Date(Date.UTC( - next.getUTCFullYear(), - next.getUTCMonth() + 1, - 0 - )).getUTCDate(); - next.setUTCDate(Math.min(day, lastDayOfTargetMonth)); - return next; - } - const { input } = ctx; - const previous = ctx.previous; - const api = ctx.api; - if (!api) return; - const nowDone = input.status === "completed" || input.is_completed === true; - const wasDone = previous?.status === "completed" || previous?.is_completed === true; - if (!nowDone || wasDone) return; - const r = { ...previous ?? {}, ...input }; - if (r.is_recurring !== true) return; - const type = typeof r.recurrence_type === "string" ? r.recurrence_type : void 0; - if (!type || !["daily", "weekly", "monthly", "yearly"].includes(type)) return; - const interval = Number(r.recurrence_interval) > 0 ? Number(r.recurrence_interval) : 1; - const baseDue = r.due_date ? new Date(r.due_date) : /* @__PURE__ */ new Date(); - if (isNaN(baseDue.getTime())) return; - const nextDue = advanceDate(baseDue, type, interval); - if (r.recurrence_end_date) { - const end = new Date(r.recurrence_end_date); - if (!isNaN(end.getTime()) && nextDue > end) return; - } - const doc = { - subject: r.subject, - description: r.description ?? null, - priority: r.priority, - type: r.type ?? null, - owner_id: r.owner_id ?? null, - status: "not_started", - is_completed: false, - reminder_sent: false, - due_date: nextDue.toISOString().slice(0, 10), - is_recurring: true, - recurrence_type: type, - recurrence_interval: interval, - recurrence_end_date: r.recurrence_end_date ?? null, - related_to_type: r.related_to_type ?? null, - related_to_account: r.related_to_account ?? null, - related_to_contact: r.related_to_contact ?? null, - related_to_opportunity: r.related_to_opportunity ?? null, - related_to_lead: r.related_to_lead ?? null, - related_to_case: r.related_to_case ?? null - }; - if (r.reminder_date) { - const baseRem = new Date(r.reminder_date); - if (!isNaN(baseRem.getTime())) doc.reminder_date = advanceDate(baseRem, type, interval).toISOString(); - } - try { - await api.object("crm_task").insert(doc); - } catch { - } - } -}; -var taskBubble = { - name: "task_activity_bubble", - object: "crm_task", - events: ["afterUpdate"], - priority: 800, - async: true, - onError: "log", - runAs: "system", - description: "A completed task stamps interaction recency on the related account (walking up from contact/opportunity/case), lead and contact.", - handler: async (ctx) => { - const { input } = ctx; - const previous = ctx.previous; - const api = ctx.api; - if (!api) return; - const nowDone = input.status === "completed" || input.is_completed === true; - const wasDone = previous?.status === "completed" || previous?.is_completed === true; - if (!nowDone || wasDone) return; - const r = { ...previous ?? {}, ...input }; - const nowIso = (/* @__PURE__ */ new Date()).toISOString(); - const today = nowIso.slice(0, 10); - const idOf = (key) => typeof r[key] === "string" && r[key].length > 0 ? r[key] : void 0; - const org = idOf("organization_id"); - const inOrg = org ? { organization_id: org } : {}; - const accountIds = /* @__PURE__ */ new Set(); - const contactIds = /* @__PURE__ */ new Set(); - const leadIds = /* @__PURE__ */ new Set(); - const direct = idOf("related_to_account"); - if (direct) accountIds.add(direct); - const contactId = idOf("related_to_contact"); - if (contactId) contactIds.add(contactId); - const leadId = idOf("related_to_lead"); - if (leadId) leadIds.add(leadId); - const parentLookups = [ - ["related_to_contact", "crm_contact"], - ["related_to_opportunity", "crm_opportunity"], - ["related_to_case", "crm_case"] - ]; - for (const [field, object] of parentLookups) { - const id = idOf(field); - if (!id) continue; - try { - const raw = await api.object(object).find({ - where: { id, ...inOrg }, - fields: ["crm_account"], - top: 1 - }); - const rows = Array.isArray(raw) ? raw : raw?.records ?? []; - const parent = rows.length ? rows[0].crm_account : void 0; - if (typeof parent === "string" && parent.length > 0) accountIds.add(parent); - } catch { - } - } - const targets = [ - ["crm_account", accountIds, { last_activity_date: today }], - ["crm_contact", contactIds, { last_contacted_date: nowIso }], - ["crm_lead", leadIds, { last_contacted_date: nowIso }] - ]; - for (const [object, ids, doc] of targets) { - let inside = [...ids]; - if (org && inside.length > 0) { - try { - const raw = await api.object(object).find({ where: { id: { $in: inside }, ...inOrg }, fields: ["id"], top: inside.length }); - inside = (Array.isArray(raw) ? raw : raw?.records ?? []).map((row) => String(row.id)); - } catch { - inside = []; - } - } - for (const id of inside) { - try { - await api.object(object).update({ ...doc, id }, { where: { id } }); - } catch { - } - } - } - } -}; -var taskDoNotCallGuard = { - name: "task_do_not_call_guard", - object: "crm_task", - events: ["beforeInsert", "beforeUpdate"], - priority: 150, - description: "Refuse to schedule an open Call task against a lead/contact flagged Do Not Call.", - handler: async (ctx) => { - function refuse(message, code, status, userMessage = message) { - const err = new Error(message); - err.code = code; - err.status = status; - err.userMessage = userMessage; - return err; - } - const { input } = ctx; - const previous = ctx.previous; - const api = ctx.api; - if (!api) return; - const effective = (key) => input[key] !== void 0 && input[key] !== null ? input[key] : previous?.[key]; - if (effective("type") !== "call") return; - if (effective("status") === "completed") return; - const leadId = effective("related_to_lead"); - const contactId = effective("related_to_contact"); - const targets = []; - if (typeof leadId === "string" && leadId) { - targets.push({ object: "crm_lead", id: leadId, label: "lead" }); - } - if (typeof contactId === "string" && contactId) { - targets.push({ object: "crm_contact", id: contactId, label: "contact" }); - } - for (const t of targets) { - const raw = await api.object(t.object).find({ - where: { id: t.id }, - fields: ["id", "do_not_call"], - top: 1 - }); - const rows = Array.isArray(raw) ? raw : raw?.records ?? []; - const person = rows[0]; - if (person?.do_not_call === true) { - throw refuse( - `This ${t.label} is flagged Do Not Call, so a Call task cannot be scheduled against them. Log a completed call if one already happened, choose a non-phone activity type, or clear Do Not Call on the record first.`, - "FORBIDDEN", - 403 - ); - } - } - } -}; -var task_hook_default = [taskValidation, taskDoNotCallGuard, taskRecurrence, taskBubble]; - -// src/revenue/objects/contract.hook.ts -var contractValidation = { - name: "contract_validation", - object: "crm_contract", - events: ["beforeInsert", "beforeUpdate"], - priority: 200, - description: "Enforce contract term math and prevent shrinking end_date once activated.", - handler: async (ctx) => { - function refuse(message, code, status, userMessage = message) { - const err = new Error(message); - err.code = code; - err.status = status; - err.userMessage = userMessage; - return err; - } - const { event, input, previous } = ctx; - function monthsBetween(startISO, endISO) { - const s = new Date(startISO); - const e = new Date(endISO); - return (e.getUTCFullYear() - s.getUTCFullYear()) * 12 + (e.getUTCMonth() - s.getUTCMonth()) + // Unchanged intent: has the end day-of-month reached the start's yet? - // If not, the last month is not complete and does not count. - (e.getUTCDate() >= s.getUTCDate() ? 0 : -1); - } - const startDate = [input.start_date, previous?.start_date].find((v) => typeof v === "string" && v !== ""); - const endDate = [input.end_date, previous?.end_date].find((v) => typeof v === "string" && v !== ""); - const term = [input.contract_term_months, previous?.contract_term_months].find((v) => typeof v === "number" && !!v); - if (startDate && endDate && term) { - const calc = monthsBetween(startDate, endDate); - if (Math.abs(calc - term) > 1) { - throw refuse( - `Contract term (${term} months) does not match date range (${calc} months from ${startDate} to ${endDate}).`, - "VALIDATION_FAILED", - 400 - ); - } - } - if (event === "beforeUpdate" && previous?.status === "activated") { - if (typeof input.end_date === "string" && typeof previous.end_date === "string" && input.end_date < previous.end_date) { - throw refuse( - `Cannot shrink end_date (${previous.end_date} \u2192 ${input.end_date}) after activation. Use a termination/amendment workflow instead.`, - "RECORD_LOCKED", - 409 - ); - } - } - } -}; -var contractActivation = { - name: "contract_on_activation", - object: "crm_contract", - events: ["afterUpdate"], - priority: 800, - async: true, - onError: "log", - description: "On activation: stamp signed_date, promote account.", - handler: async (ctx) => { - const { input, previous } = ctx; - if (input.status !== "activated" || previous?.status === "activated") return; - const api = ctx.api; - if (!api) return; - const id = [input.id, previous?.id].find((v) => typeof v === "string" && v !== ""); - const accountId = [input.crm_account, previous?.crm_account].find((v) => typeof v === "string" && v !== ""); - if (id && !input.signed_date && !previous?.signed_date) { - await api.object("crm_contract").update( - { id, signed_date: (/* @__PURE__ */ new Date()).toISOString().slice(0, 10) }, - { where: { id } } - ); - } - if (accountId) { - const account = await api.object("crm_account").findOne({ where: { id: accountId } }); - if (account && account.type !== "customer") { - await api.object("crm_account").update( - { id: accountId, type: "customer" }, - { where: { id: accountId } } - ); - } - } - } -}; -var contract_hook_default = [contractValidation, contractActivation]; - -// src/revenue/objects/_line-item-price-fill.ts -function createLineItemPriceFill(objectName, hookName) { - return { - name: hookName, - object: objectName, - events: ["beforeInsert", "beforeUpdate"], - priority: 100, - description: "Default list_price / unit_price from the chosen product.", - handler: async (ctx) => { - const { event, input } = ctx; - const api = ctx.api; - if (!api) return; - const productId = typeof input.crm_product === "string" ? input.crm_product : void 0; - if (!productId) return; - const product = await api.object("crm_product").findOne({ - where: { id: productId }, - fields: ["id", "list_price"] - }); - const listPrice = product && typeof product.list_price === "number" ? product.list_price : void 0; - if (listPrice === void 0) return; - input.list_price = listPrice; - if (event === "beforeInsert" && input.unit_price == null) { - input.unit_price = listPrice; - } - } - }; -} -function createLineItemNumbering(objectName, hookName) { - return { - name: hookName, - object: objectName, - events: ["beforeInsert", "beforeUpdate"], - priority: 110, - runAs: "system", - description: "Assign line_number = (max under the parent) + 1.", - handler: async (ctx) => { - const { event, input } = ctx; - const prev = ctx.previous; - const api = ctx.api; - if (!api) return; - if (!ctx.user?.id && typeof input.line_number === "number") return; - if (event === "beforeUpdate" && (ctx.dispatch?.mode === "per-row" || typeof prev?.line_number === "number")) return; - const parentKey = ctx.object === "crm_quote_line_item" ? "crm_quote" : "crm_opportunity"; - const parentId = input[parentKey] ?? prev?.[parentKey]; - if (typeof parentId !== "string" || !parentId) return; - const siblings = await api.object(ctx.object).find({ - where: { [parentKey]: parentId }, - fields: ["line_number"], - top: 5e3 - }); - let max = 0; - for (const s of siblings) { - if (typeof s.line_number === "number" && s.line_number > max) max = s.line_number; - } - const offset = event === "beforeInsert" && ctx.dispatch?.mode === "per-row" ? ctx.dispatch.index : 0; - input.line_number = max + 1 + offset; - } - }; -} - -// src/revenue/objects/opportunity_line_item.hook.ts -var opportunityLineItemPriceFill = createLineItemPriceFill( - "crm_opportunity_line_item", - "opportunity_line_item_price_fill" -); -var opportunityLineItemNumbering = createLineItemNumbering( - "crm_opportunity_line_item", - "opportunity_line_item_line_number" -); -var opportunityAmountRollup = { - name: "opportunity_amount_rollup", - object: "crm_opportunity_line_item", - events: ["afterInsert", "afterUpdate", "afterDelete"], - priority: 300, - async: true, - onError: "log", - description: "Recompute parent opportunity.amount from the sum of its line items.", - handler: async (ctx) => { - const api = ctx.api; - if (!api) return; - const { input, previous } = ctx; - const num = (v) => typeof v === "number" ? v : 0; - const oppIds = /* @__PURE__ */ new Set(); - for (const v of [input?.crm_opportunity, previous?.crm_opportunity]) { - if (typeof v === "string" && v) oppIds.add(v); - } - if (oppIds.size === 0) return; - for (const oppId of oppIds) { - const opp = await api.object("crm_opportunity").findOne({ - where: { id: oppId }, - fields: ["id", "stage"] - }); - const stage = opp && typeof opp.stage === "string" ? opp.stage : void 0; - if (stage === "closed_won" || stage === "closed_lost") continue; - const lines = await api.object("crm_opportunity_line_item").find({ - where: { crm_opportunity: oppId }, - fields: ["quantity", "unit_price", "discount"], - top: 5e3 - }); - if (!lines || lines.length === 0) continue; - let sum = 0; - for (const l of lines) sum += num(l.quantity) * num(l.unit_price) * (1 - num(l.discount) / 100); - sum = Math.round(sum * 100) / 100; - if (sum > 0) { - await api.object("crm_opportunity").update( - { id: oppId, amount: sum }, - { where: { id: oppId } } - ); - } - } - } -}; -var opportunity_line_item_hook_default = [opportunityLineItemPriceFill, opportunityLineItemNumbering, opportunityAmountRollup]; - -// src/revenue/objects/product.hook.ts -var productHook = { - name: "product_catalog", - object: "crm_product", - events: ["beforeInsert", "beforeUpdate", "beforeDelete"], - priority: 200, - description: "Pricing sanity, SKU normalization, and protect referenced products from deletion.", - handler: async (ctx) => { - function refuse(message, code, status, userMessage = message) { - const err = new Error(message); - err.code = code; - err.status = status; - err.userMessage = userMessage; - return err; - } - const { event, input, previous } = ctx; - if (event === "beforeInsert" || event === "beforeUpdate") { - const listPrice = [input.list_price, previous?.list_price].find((v) => typeof v === "number"); - const cost = [input.cost, previous?.cost].find((v) => typeof v === "number"); - if (typeof listPrice === "number" && typeof cost === "number" && listPrice < cost) { - throw refuse( - `List Price (${listPrice}) must be greater than or equal to Cost (${cost}).`, - "VALIDATION_FAILED", - 400 - ); - } - if (typeof input.sku === "string") { - input.sku = input.sku.toUpperCase(); - } - } - if (event === "beforeDelete") { - const api = ctx.api; - const id = previous?.id; - if (!api || !id) return; - const [oppRefs, quoteRefs] = await Promise.all([ - api.object("crm_opportunity_line_item").count({ where: { crm_product: id } }).catch(() => 0), - api.object("crm_quote_line_item").count({ where: { crm_product: id } }).catch(() => 0) - ]); - if (oppRefs + quoteRefs > 0) { - throw refuse( - `Cannot delete product: referenced by ${oppRefs} opportunity(ies) and ${quoteRefs} quote(s). Set is_active=false to retire instead.`, - "DELETE_RESTRICTED", - 409 - ); - } - } - } -}; -var product_hook_default = productHook; - -// src/revenue/objects/quote.hook.ts -var quoteValidation = { - name: "quote_workflow", - // ⚠️ Two objects, deliberately (#2060): the freeze below is ONE freeze — the - // quote's and its lines' — so it lives in one place, judged by one user/system - // boundary and carried by one envelope, rather than a second copy of both on - // the line. `test/package-ownership.test.ts` reads every name in the list. - object: ["crm_quote", "crm_quote_line_item"], - events: ["beforeInsert", "beforeUpdate"], - priority: 200, - description: "Default expiration date; freeze accepted/expired quotes and their lines.", - handler: async (ctx) => { - function refuse(message, code, status, userMessage = message) { - const err = new Error(message); - err.code = code; - err.status = status; - err.userMessage = userMessage; - return err; - } - const { event, input, previous } = ctx; - if (ctx.object === "crm_quote_line_item") { - const changed = Object.keys(input).some((k) => !["id", "updated_at", "updated_by", "line_number"].includes(k) && input[k] !== previous?.[k]); - for (const id of /* @__PURE__ */ new Set([input.crm_quote, previous?.crm_quote])) { - const q = changed && ctx.user?.id && typeof id === "string" && id ? await ctx.api?.object("crm_quote").findOne({ where: { id }, fields: ["quote_number", "name", "status"] }) : null; - if (q?.status === "accepted" || q?.status === "expired") { - throw refuse(`Quote ${String(q.quote_number)} - ${String(q.name)} is ${q.status}, so its line items can no longer be added or changed.`, "RECORD_LOCKED", 409); - } - } - return; - } - function subject() { - const label = [previous?.quote_number, previous?.name].map((v) => typeof v === "string" ? v.trim() : "").filter(Boolean).join(" - "); - return label ? `Quote ${label}` : "Quote"; - } - function addDays(iso, days) { - const d = new Date(iso); - d.setUTCDate(d.getUTCDate() + days); - return d.toISOString().slice(0, 10); - } - if (event === "beforeInsert" && !input.expiration_date) { - const base = typeof input.quote_date === "string" ? input.quote_date : (/* @__PURE__ */ new Date()).toISOString().slice(0, 10); - input.expiration_date = addDays(base, 30); - } - if (event === "beforeUpdate" && previous && ctx.user?.id) { - const frozen = previous.status === "accepted" || previous.status === "expired"; - if (frozen) { - const allowed = /* @__PURE__ */ new Set(["internal_notes"]); - const SYSTEM_FIELDS = /* @__PURE__ */ new Set([ - "id", - "owner_id", - "created_at", - "updated_at", - "created_by", - "updated_by", - "space_id", - "organization_id", - "org_id", - "version" - ]); - const violating = Object.keys(input).filter( - (k) => !allowed.has(k) && !SYSTEM_FIELDS.has(k) && input[k] !== previous[k] - ); - if (violating.length > 0) { - const REFERENCE_FIELDS = /* @__PURE__ */ new Set(["crm_account", "crm_contact", "crm_opportunity"]); - const isReferenceCleanup = violating.every( - (k) => REFERENCE_FIELDS.has(k) && input[k] === null && previous?.[k] != null - ); - if (isReferenceCleanup) return; - const what = `${subject()} is ${previous.status}`; - throw refuse(`${what}; only internal_notes may be edited. Attempted: ${violating.join(", ")}.`, "RECORD_LOCKED", 409); - } - } - if (input.status === "accepted" && previous.status !== "accepted") { - const dealId = [input.crm_opportunity, previous.crm_opportunity].find((v) => typeof v === "string" && v); - const deal = dealId ? await ctx.api?.object("crm_opportunity").findOne({ - where: { id: dealId }, - fields: ["stage", "approval_status", "status_change_approval_status", "qualification_approval_status"] - }).catch(() => null) : null; - const held = deal && !String(deal.stage).startsWith("closed_") ? [["approval_status", "Approval Status"], ["status_change_approval_status", "Status Change Approval"], ["qualification_approval_status", "Qualification Approval"]].filter(([f]) => deal[f] === "pending" || deal[f] === "rejected" && f !== "approval_status").map(([f, label]) => `${label} is ${deal[f] === "pending" ? "Pending" : "Rejected"}`) : []; - if (held.length > 0) { - const what = `${subject()} cannot be accepted while its opportunity is held by an approval`; - throw refuse(`${what} (${held.join("; ")}): accepting it would close that deal as won. Accept it once the approval is granted.`, "RECORD_LOCKED", 409); - } - } - } - } -}; -var quoteAcceptedContractDraft = { - name: "quote_accepted_contract_draft", - object: "crm_quote", - events: ["afterUpdate"], - priority: 800, - async: true, - onError: "log", - runAs: "system", - description: "Draft the accepted quote\u2019s contract.", - handler: async (ctx) => { - const { input, previous } = ctx; - if (input.status !== "accepted" || previous?.status === "accepted") return; - const api = ctx.api; - if (!api) return; - function addMonths(iso, months) { - const d = new Date(iso); - d.setUTCMonth(d.getUTCMonth() + months); - return d.toISOString().slice(0, 10); - } - const pickId = (...candidates) => candidates.find((c) => typeof c === "string" && c !== ""); - const accountId = pickId(input.crm_account, previous?.crm_account); - const contactId = pickId(input.crm_contact, previous?.crm_contact); - const opportunityId = pickId(input.crm_opportunity, previous?.crm_opportunity); - const ownerId = pickId(input.owner_id, previous?.owner_id, ctx.user?.id); - const totalPrice = [input.total_price, previous?.total_price].find((v) => typeof v === "number") ?? 0; - const paymentTerms = pickId(input.payment_terms, previous?.payment_terms); - const today = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10); - const DRAFT_CONTRACT_DEFAULTS = { - contract_term_months: 12, - contract_type: "subscription", - start_date: today - }; - const trimmed = (v) => typeof v === "string" ? v.trim() : ""; - const quoteLabel = [trimmed(previous?.quote_number), [input.name, previous?.name].map(trimmed).find(Boolean)].filter(Boolean).join(" - "); - const contract = { - ...DRAFT_CONTRACT_DEFAULTS, - status: "draft", - end_date: addMonths(DRAFT_CONTRACT_DEFAULTS.start_date, DRAFT_CONTRACT_DEFAULTS.contract_term_months), - contract_value: totalPrice, - description: quoteLabel ? `Auto-drafted from accepted quote ${quoteLabel}` : "Auto-drafted from an accepted quote" - }; - if (accountId) contract.crm_account = accountId; - if (contactId) contract.crm_contact = contactId; - if (opportunityId) contract.crm_opportunity = opportunityId; - if (ownerId) contract.owner_id = ownerId; - if (paymentTerms) contract.payment_terms = paymentTerms; - try { - await api.object("crm_contract").insert(contract); - } catch (err) { - throw new Error(`could not draft the contract for quote ${quoteLabel}: ${err.message}`); - } - } -}; -var quoteAccepted = { - name: "quote_on_accepted", - object: "crm_quote", - events: ["afterUpdate"], - priority: 800, - async: true, - onError: "log", - description: "Close-win the accepted quote\u2019s opportunity.", - handler: async (ctx) => { - const { input, previous } = ctx; - if (input.status !== "accepted" || previous?.status === "accepted") return; - const api = ctx.api; - const id = [input.crm_opportunity, previous?.crm_opportunity].find((v) => typeof v === "string" && v !== ""); - if (!api || !id) return; - try { - const opp = await api.object("crm_opportunity").findOne({ where: { id } }); - if (opp && !String(opp.stage).startsWith("closed_")) { - const won = { id, stage: "closed_won", close_date: (/* @__PURE__ */ new Date()).toISOString().slice(0, 10) }; - await api.object("crm_opportunity").update({ ...won, ...opp.win_reason ? {} : { win_reason: "quote_accepted" } }, { where: { id } }); - } - } catch (err) { - throw new Error(`could not close-won the opportunity of quote ${String(previous?.quote_number)}: ${err.message}`); - } - } -}; -var quote_hook_default = [quoteValidation, quoteAcceptedContractDraft, quoteAccepted]; - -// src/revenue/objects/quote_line_item.hook.ts -var quoteLineItemPriceFill = createLineItemPriceFill( - "crm_quote_line_item", - "quote_line_item_price_fill" -); -var quoteLineItemNumbering = createLineItemNumbering( - "crm_quote_line_item", - "quote_line_item_line_number" -); -var quoteTotalRollup = { - name: "quote_total_rollup", - object: "crm_quote_line_item", - events: ["afterInsert", "afterUpdate", "afterDelete"], - priority: 300, - async: true, - onError: "log", - description: "Recompute parent quote subtotal/discount/total from its line items.", - handler: async (ctx) => { - const api = ctx.api; - if (!api) return; - const { input, previous } = ctx; - const num = (v) => typeof v === "number" ? v : 0; - const quoteIds = /* @__PURE__ */ new Set(); - for (const v of [input?.crm_quote, previous?.crm_quote]) { - if (typeof v === "string" && v) quoteIds.add(v); - } - if (quoteIds.size === 0) return; - for (const quoteId of quoteIds) { - const quote = await api.object("crm_quote").findOne({ - where: { id: quoteId }, - fields: ["id", "status", "discount", "tax", "shipping_handling"] - }); - if (!quote) continue; - const status = typeof quote.status === "string" ? quote.status : void 0; - if (status === "accepted" || status === "expired") continue; - const lines = await api.object("crm_quote_line_item").find({ - where: { crm_quote: quoteId }, - fields: ["quantity", "unit_price", "discount"], - top: 5e3 - }); - if (!lines || lines.length === 0) continue; - let subtotal = 0; - for (const l of lines) subtotal += num(l.quantity) * num(l.unit_price) * (1 - num(l.discount) / 100); - subtotal = Math.round(subtotal * 100) / 100; - const discountAmount = Math.round(subtotal * (num(quote.discount) / 100) * 100) / 100; - const total = Math.round((subtotal - discountAmount + num(quote.tax) + num(quote.shipping_handling)) * 100) / 100; - await api.object("crm_quote").update( - { id: quoteId, subtotal, discount_amount: discountAmount, total_price: total }, - { where: { id: quoteId } } - ); - } - } -}; -var quote_line_item_hook_default = [quoteLineItemPriceFill, quoteLineItemNumbering, quoteTotalRollup]; - -// src/marketing/objects/campaign.hook.ts -var campaignValidation = { - name: "campaign_validation", - object: "crm_campaign", - events: ["beforeInsert", "beforeUpdate"], - priority: 200, - description: "Validate campaign date range and required fields per status.", - handler: async (ctx) => { - function refuse(message, code, status2, userMessage = message) { - const err = new Error(message); - err.code = code; - err.status = status2; - err.userMessage = userMessage; - return err; - } - const { input } = ctx; - const previous = ctx.previous; - const start = typeof input.start_date === "string" && input.start_date || typeof previous?.start_date === "string" && previous.start_date || void 0; - const end = typeof input.end_date === "string" && input.end_date || typeof previous?.end_date === "string" && previous.end_date || void 0; - if (start && end && start > end) { - throw refuse(`Campaign start_date (${start}) must not be after end_date (${end}).`, "VALIDATION_FAILED", 400); - } - const status = typeof input.status === "string" && input.status || typeof previous?.status === "string" && previous.status || void 0; - if (status === "in_progress" && (!start || !end)) { - throw refuse("Campaign cannot move to in_progress without both start_date and end_date.", "VALIDATION_FAILED", 400); - } - } -}; -var campaignMetricsRefresh = { - name: "campaign_metrics_refresh", - object: "crm_campaign", - events: ["afterUpdate"], - priority: 800, - async: true, - onError: "log", - description: "Recompute the campaign metric block whenever the campaign status moves.", - handler: async (ctx) => { - const { input } = ctx; - const previous = ctx.previous; - if (typeof input.status !== "string") return; - if (previous && input.status === previous.status) return; - const api = ctx.api; - if (!api) return; - const campaignId = typeof input.id === "string" && input.id || (typeof previous?.id === "string" ? previous.id : ""); - if (!campaignId) return; - for (const id of [campaignId]) { - const memberRows = await api.object("crm_campaign_member").find({ - where: { crm_campaign: id }, - fields: ["crm_lead", "status"], - top: 5e3 - }); - const leadIds = Array.from(new Set( - memberRows.map((r) => typeof r.crm_lead === "string" ? r.crm_lead : "").filter(Boolean) - )); - const convertedLeads = leadIds.length > 0 ? await api.object("crm_lead").count({ where: { id: { $in: leadIds }, is_converted: true } }) : 0; - const numOpportunities = await api.object("crm_opportunity").count({ where: { crm_campaign: id } }); - const numWon = await api.object("crm_opportunity").count({ where: { crm_campaign: id, stage: "closed_won" } }); - const wonRows = await api.object("crm_opportunity").find({ - where: { crm_campaign: id, stage: "closed_won" }, - fields: ["amount"], - top: 5e3 - }); - const actualRevenue = wonRows.reduce( - (sum, row) => sum + (typeof row.amount === "number" ? row.amount : Number(row.amount) || 0), - 0 - ); - await api.object("crm_campaign").update({ - id, - num_sent: memberRows.length, - num_responses: memberRows.filter((r) => r.status === "responded" || r.status === "converted").length, - num_leads: leadIds.length, - num_converted_leads: convertedLeads, - num_opportunities: numOpportunities, - num_won_opportunities: numWon, - actual_revenue: actualRevenue - }, { where: { id } }); - } - } -}; -var CAMPAIGN_METRIC_FIELDS = [ - "num_sent", - "num_responses", - "num_leads", - "num_converted_leads", - "num_opportunities", - "num_won_opportunities", - "actual_revenue" -]; -var CAMPAIGN_METRIC_WRITE_KEYS = ["id", ...CAMPAIGN_METRIC_FIELDS]; -var campaign_hook_default = [campaignValidation, campaignMetricsRefresh]; - -// src/marketing/objects/campaign_member.hook.ts -var campaignMemberLifecycle = { - name: "campaign_member_lifecycle", - object: "crm_campaign_member", - events: ["beforeInsert", "beforeUpdate"], - priority: 200, - description: "Keep has_responded / response_date in lockstep with the member status.", - handler: async (ctx) => { - if (ctx.event === "beforeUpdate" && ctx.dispatch?.mode === "per-row") return; - const { input } = ctx; - const previous = ctx.previous; - const status = typeof input.status === "string" && input.status || (typeof previous?.status === "string" ? previous.status : void 0); - if (!status) return; - const responded = status === "responded" || status === "converted"; - const priorStatus = typeof previous?.status === "string" ? previous.status : ""; - const wasResponded = priorStatus === "responded" || priorStatus === "converted"; - if (responded) { - input.has_responded = true; - const existing = input.response_date ?? previous?.response_date; - if (!wasResponded && (existing === void 0 || existing === null || existing === "")) { - input.response_date = (/* @__PURE__ */ new Date()).toISOString(); - } - return; - } - if (wasResponded && typeof input.status === "string") { - input.has_responded = false; - input.response_date = null; - return; - } - if (ctx.event === "beforeInsert" && input.has_responded === void 0) { - input.has_responded = false; - } - } -}; -var campaignMemberOptOutSync = { - name: "campaign_member_optout_sync", - object: "crm_campaign_member", - events: ["afterInsert", "afterUpdate"], - priority: 300, - async: true, - onError: "log", - runAs: "system", - description: "Sync an unsubscribed member back to the lead/contact email_opt_out flag.", - handler: async (ctx) => { - const api = ctx.api; - if (!api) return; - const { input } = ctx; - const previous = ctx.previous; - if (input?.status !== "unsubscribed") return; - if (previous?.status === "unsubscribed") return; - const leadId = typeof input?.crm_lead === "string" && input.crm_lead || (typeof previous?.crm_lead === "string" ? previous.crm_lead : void 0); - const contactId = typeof input?.crm_contact === "string" && input.crm_contact || (typeof previous?.crm_contact === "string" ? previous.crm_contact : void 0); - if (leadId) { - await api.object("crm_lead").update( - { id: leadId, email_opt_out: true }, - { where: { id: leadId } } - ); - } - if (contactId) { - await api.object("crm_contact").update( - { id: contactId, email_opt_out: true }, - { where: { id: contactId } } - ); - } - } -}; -var campaignMemberMetricsRefresh = { - name: "campaign_member_metrics_refresh", - object: "crm_campaign_member", - events: ["afterInsert", "afterUpdate", "afterDelete"], - priority: 800, - async: true, - onError: "log", - runAs: "system", - description: "Recompute the campaign metric block live whenever its membership changes.", - handler: async (ctx) => { - const api = ctx.api; - if (!api) return; - const { input } = ctx; - const previous = ctx.previous; - const campaignIds = Array.from(new Set([ - typeof input?.crm_campaign === "string" ? input.crm_campaign : "", - typeof previous?.crm_campaign === "string" ? previous.crm_campaign : "" - ].filter(Boolean))); - for (const id of campaignIds) { - const memberRows = await api.object("crm_campaign_member").find({ - where: { crm_campaign: id }, - fields: ["crm_lead", "status"], - top: 5e3 - }); - const leadIds = Array.from(new Set( - memberRows.map((r) => typeof r.crm_lead === "string" ? r.crm_lead : "").filter(Boolean) - )); - const convertedLeads = leadIds.length > 0 ? await api.object("crm_lead").count({ where: { id: { $in: leadIds }, is_converted: true } }) : 0; - const numOpportunities = await api.object("crm_opportunity").count({ where: { crm_campaign: id } }); - const numWon = await api.object("crm_opportunity").count({ where: { crm_campaign: id, stage: "closed_won" } }); - const wonRows = await api.object("crm_opportunity").find({ - where: { crm_campaign: id, stage: "closed_won" }, - fields: ["amount"], - top: 5e3 - }); - const actualRevenue = wonRows.reduce( - (sum, row) => sum + (typeof row.amount === "number" ? row.amount : Number(row.amount) || 0), - 0 - ); - await api.object("crm_campaign").update({ - id, - num_sent: memberRows.length, - num_responses: memberRows.filter((r) => r.status === "responded" || r.status === "converted").length, - num_leads: leadIds.length, - num_converted_leads: convertedLeads, - num_opportunities: numOpportunities, - num_won_opportunities: numWon, - actual_revenue: actualRevenue - }, { where: { id } }); - } - } -}; -var campaign_member_hook_default = [ - campaignMemberLifecycle, - campaignMemberOptOutSync, - campaignMemberMetricsRefresh -]; - -// src/sales/flows/lead-conversion.flow.ts -import { P as P26, cel as cel6 } from "@objectstack/spec"; -var LeadConversionFlow = { - name: "lead_conversion", - label: "Lead Conversion Process", - description: "Automated flow to convert qualified leads to accounts, contacts, and opportunities", - type: "screen", - status: "active", - variables: [ - // Named `recordId` to match the console's flow-action invocation contract: - // POST /automation/:name/trigger sends { recordId, objectName } and the - // dispatcher exposes them as params.recordId / params.crmLeadId. A custom - // name like `leadId` never gets seeded (16.x runtime). - { name: "recordId", type: "text", isInput: true, isOutput: false }, - // THE authority for the conversion default. `defaultValue` is what makes - // declared mean BOUND: the engine seeds every declared variable that - // carries one before the run starts, so `createOpportunity` is bound on - // every path — including the one where the screen runner posts back only - // the fields the user touched. The screen field below derives its prefill - // from this line rather than restating `false`. - // - // Measured on 17.0.0 GA, by running flows (not by reading the engine): - // · declared + nothing supplied → bound to `false`; ablating this key - // from the declaration re-fails the read with `No such key: - // createOpportunity`, so the default is what binds it; - // · seeded BEFORE the start condition is evaluated, so a start condition - // could read it too; - // · a caller-supplied `context.params.createOpportunity` WINS — the - // boundary is `!== undefined`, so an explicit `false`/`null` is a - // supplied answer, and only absence falls through to this default. - // ⛔ Never seed this with an assignment node instead: an assignment is - // unconditional and clobbers a caller-supplied value. All of the above is - // pinned in `test/flow-variable-conditions.test.ts`. - { name: "createOpportunity", type: "boolean", isInput: true, isOutput: false, defaultValue: false }, - { name: "opportunityName", type: "text", isInput: true, isOutput: false }, - { name: "opportunityAmount", type: "text", isInput: true, isOutput: false }, - // The conversion's close date, collected on the screen below - // instead of stamped inside `create_opportunity`. Declared with NO - // `defaultValue`, and that is measured rather than chosen: the engine - // binds a DECLARATION's default raw — `seedDeclaredVariables` does a plain - // `variables.set(name, defaultValue)` with no `interpolate` call — so - // `{TODAY() + 90}` written here would bind that string verbatim and - // `create_opportunity` would post the braces into a date column. Measured - // on 17.3.0 by running a probe flow, not by reading the engine. The screen - // field is therefore the only layer that can carry the expression, which - // is where the +90 lives and why this line is deliberately bare. - { name: "closeDate", type: "date", isInput: true, isOutput: false } - ], - nodes: [ - { id: "start", type: "start", label: "Start", config: { objectName: "crm_lead" } }, - { - id: "screen_1", - type: "screen", - label: "Conversion Details", - config: { - // The suspected-duplicate warning. `lead_duplicate_check` flags a - // re-captured email at intake and links the record the lead repeats; - // the rep about to CONVERT is the last moment that flag is worth - // anything, and without it the duplicate becomes a second account, - // contact and opportunity. - // - // ⛔ Not on `convert_lead`'s `confirmText`: that string is static and - // unconditional, so it would warn identically on every clean lead — the - // cry-wolf that makes a confirm dialog furniture. This screen is where - // the conversion decision is actually taken, and the one surface that - // can say something TRUE about THIS lead. - // - // Mechanism: the executor renders `config.description` — a text slot, - // written as a `{{ }}` hole since 18.0.0-next.0 — into the `ScreenSpec` - // it puts on the wire, and `FlowRunner.tsx` renders it — - // `{screen.description && …}`. A hole over `null` - // renders the empty string, which the executor's `renderTextSlot` - // turns into no description at all (read in the installed - // 18.0.0-next.0 `service-automation`; on the 17.1.0 bundles it was - // measured as `interp` mapping null to `undefined`), so the clean-lead - // branch below (which assigns `null`) renders NO description rather - // than an empty paragraph. That is why the conditionality lives in an - // assignment and not in the copy: a screen `description` has no - // `visibleWhen`. - description: "{{duplicateWarning}}", - // `visibleWhen` on a screen field is BARE CEL over the screen's own - // field names — not the CEL value envelopes the rest of this flow uses - // for filters and `update_record` fields, evaluated on the server. The - // client re-evaluates the predicate against the values collected so far, - // which is why it cannot be a server-evaluated envelope. - fields: [ - // ⛔ NEVER `required` on a boolean screen field. A checkbox has no - // unanswered state — clear IS an answer, and "convert this lead - // WITHOUT an opportunity" is the commonest path. `required: true` - // blocks on both sides of the wire: the client counts the untouched - // box as an unanswered field and disables Submit, and from - // 17.0.0-rc.2 the SERVER enforces the screen's declared contract too, - // refusing the resume with `INVALID_SCREEN_INPUT: Screen field - // "createOpportunity" is required` — so a runner that posts only what - // the user touched cannot convert a lead at all. The variable's - // declared `defaultValue` is what supplies the answer. - // - // DERIVED, not restated. The envelope reads the flow variable - // `createOpportunity`, so the literal `false` is written exactly once in this - // file — on the declaration — and the widget prefill cannot drift from - // the value the engine binds. - // - // A screen field's `defaultValue` is a CEL value envelope evaluated - // before the descriptor goes on the wire, so the client receives the - // value, never the envelope: boolean `false`, which is what the - // 17.0.0 GA template was measured to send. (`visibleWhen` below is the - // opposite case: forwarded raw, never evaluated on the server. Same - // node, two different dialects.) - { name: "createOpportunity", label: "Create Opportunity?", type: "boolean", defaultValue: cel6`createOpportunity` }, - // PREFILLED FROM THE LEAD (REQ-0005 acceptance 2). Both defaults are - // CEL envelopes over `leadRecord`, which `get_lead` bound before this - // screen was reached — the fetch sits AHEAD of the screen for the - // duplicate warning, and these two ride the same ordering. - // - // ⚠️ Each envelope is evaluated before the descriptor goes on the - // wire, so `estimated_amount` arrives as a NUMBER. `company` is - // required on a lead; `estimated_amount` is not, so its read is - // guarded: a lead with no estimate is served `null` where 17.x served - // nothing (the migration entry: a field's `defaultValue` seeds the - // field with null), and an ABSENT column on a sparse datasource no - // longer fails the run at this screen. - // - // ⛔ The amount is prefilled, never copied silently. `estimated_amount` - // is a pre-qualification guess and `crm_opportunity.amount` is a - // number a rep defends in a forecast; conversion is the moment a human - // turns one into the other, so the figure is shown in an editable box - // and the rep confirms it. Writing it straight into - // `create_opportunity` would put an unreviewed estimate into the - // forecast and leave the two fields looking like copies of each other. - // - // `required` on the amount mirrors the column, for the reason given - // at `closeDate` below: `crm_opportunity.amount` is `required` + - // `notNull`, and without this a ticked box with no amount reached - // `create_opportunity` after the account and contact were written, - // leaving the lead half-converted (#2060 item 2). Visible-only, so - // an unticked box still converts with no amount. - { name: "opportunityName", label: "Opportunity Name", type: "text", required: true, defaultValue: cel6`leadRecord.company`, visibleWhen: "createOpportunity == true" }, - { name: "opportunityAmount", label: "Opportunity Amount", type: "currency", required: true, defaultValue: cel6`has(leadRecord.estimated_amount) ? leadRecord.estimated_amount : null`, visibleWhen: "createOpportunity == true" }, - // The close date, DEFAULTED AND VISIBLE. `close_date` is what files - // an opportunity into a forecast PERIOD, so ⛔ never stamp it silently - // inside `create_opportunity`: a hidden +90 days files every converted - // deal a quarter out and moves the forecast where nobody can see it. - // - // The +90 is written HERE and nowhere else, and here the layer is - // FORCED rather than preferred. A screen field's `defaultValue` is - // evaluated before the descriptor goes on the wire and a flow - // variable's default is bound raw (see the declaration above), so this - // is the only place the expression can be written at all. - // `isoDate(daysFromNow(90))` writes the `YYYY-MM-DD` string 90 days out - // on the UTC calendar — what 17.3.0's `{TODAY() + 90}` was measured to - // send — and the value the rep sees is the value - // `create_opportunity` writes. - // - // `required` mirrors the column — `crm_opportunity.close_date` is - // `required` + `notNull` — and it is what keeps the refusal at the - // SCREEN boundary. Measured both ways against a real ObjectQL engine: - // WITHOUT it, a submission carrying no date reaches - // `create_opportunity` and fails there with `Close Date is required`, - // by which point the account and the contact have already been - // written and the lead is left half-converted; WITH it the resume is - // refused before any node runs, nothing is written, and the message - // names the field. That path is not hypothetical — a rep who CLEARS - // the prefilled date posts the key empty, and `isPresent('')` is - // false. A hidden `required` never fires: the server contract skips it - // when `visibleWhen` evaluates false, and so does the console, which - // is the untouched-checkbox path this screen has always had to keep - // working. - { name: "closeDate", label: "Close Date", type: "date", required: true, defaultValue: cel6`isoDate(daysFromNow(90))`, visibleWhen: "createOpportunity == true" } - ] - } - }, - { - // ⛔ This fetch must stay AHEAD of the screen: the duplicate warning - // reads `leadRecord`, and a screen that suspends before the fetch has - // nothing to read. The fetch itself never depended on the screen — - // `recordId` is an input variable, seeded before the run starts. - id: "get_lead", - type: "get_record", - label: "Get Lead Record", - config: { objectName: "crm_lead", filter: { id: cel6`recordId` }, outputVariable: "leadRecord" } - }, - { - // Branching is on edges `e21` / `e22` / `e25` — see `decision_account`. - // Three ways out, because `duplicate_status` carries two different KINDS - // of fact and they get different answers: the machine's `suspected` guess - // warns and lets the rep decide (`e21`), a person's `confirmed` verdict - // refuses outright (`e25`), and everything else converts silently (`e22`). - id: "decision_duplicate", - type: "decision", - label: "Duplicate Verdict?" - }, - { - // The warning names the record the way the UI names a person — by the - // email address the two records share — and NOT by - // `duplicate_of_lead` / `duplicate_of_contact`, which hold ids. That is - // the house rule `test/record-id-not-in-prose.test.ts` states for every - // sentence a user reads: "the id goes in the relationship field that - // exists to carry it, or nowhere". The link itself is on the lead's - // record page (`lead_detail.page.ts`), where it can be clicked. - // - // "flagged at intake" is the app's own published definition of this - // value, not a guess about provenance: `duplicate_status`'s help text - // reads "Suspected = flagged automatically at intake" in all four - // locales, and `lead_duplicate_check` is insert-only by design. - // - // This warning's TEXT is English-only: it is the value of a variable, - // and no locale pack reaches a variable — the screen's translated - // `description` can only carry the `{{duplicateWarning}}` hole that - // shows it. The screens' own headings and bodies are keyed in the packs - // (`flows.lead_conversion` in `src/sales/translations//app.ts`), - // and the banner on the record page carries the warning in all four. - id: "warn_duplicate", - type: "assignment", - label: "Compose Duplicate Warning", - config: { - assignments: { - duplicateWarning: cel6`'Suspected duplicate — intake flagged this lead as repeating an existing record with this email address (' + leadRecord.email + '). Converting creates a second account, contact and opportunity for the same buyer; compare the linked record on the lead page before you continue.'` - } - } - }, - { - // The other branch assigns `null`, which is what makes the warning - // CONDITIONAL: the description hole renders it as no description at - // all (see `screen_1`). Same shape as `no_opportunity` below — both branches - // write the variable so no downstream read ever meets an unset one. - id: "no_duplicate_warning", - type: "assignment", - label: "No Duplicate Warning", - config: { assignments: { duplicateWarning: null } } - }, - { - // The REFUSAL. A `confirmed` duplicate is a person's verdict, and the app - // stops converting on it — the rule AGENTS.md states as "interception - // stands on a person's judgement". `suspected` keeps the warn-and-allow - // above: a machine's guess stays advisory, because `lead_duplicate_check` - // matches on email EQUALITY and a shared inbox (`info@`, a switchboard - // address) false-positives by construction. ⛔ Do not block on the guess — - // it would need an override flag to stay usable, and an override flag is - // the one shape this exhibit must not demonstrate. - // - // ## Why the refusal is HERE and not on `convert_lead`'s predicate - // - // A refusal must NAME the verdict and the surviving record, and measured - // against `@objectstack/spec` 17.2.0 the action predicates cannot: - // `visible` and `disabled` are each a bare boolean/CEL envelope with - // nowhere to put a sentence, so `visible` hides a button that cannot then - // explain itself and `disabled` greys one out with no reason attached. - // `errorMessage` on the Action is a single static string — what the - // console toasts on a FAILED run — and cannot say anything about THIS - // lead. A screen node's `description` is a text slot rendered per run - // and shown by `FlowRunner` as the dialog body. - // - // The flow is also the only choke point covering every door: the - // record-header button, the list-row button and the `action_convert_lead` - // AI tool all dispatch `POST /automation/lead_conversion/trigger`, while - // `visible` / `disabled` are console-side and say nothing to the other - // two. - // - // ## What the rep sees, measured on the shipped console bundle - // - // A run that PAUSES returns `{ success: true, silent: true }` to the - // action framework (`RecordDetailView`'s flow handler), and `silent` - // suppresses the success toast — so `convert_lead`'s - // `successMessage: 'Lead converted successfully!'` does NOT fire behind - // this dialog. Submitting it resumes into `end`; nothing is created and - // the lead is untouched on either path, because every write in this flow - // is downstream of `screen_1`. - // - // ## What the copy may claim - // - // ⛔ NOT the shared email address, which is what `warn_duplicate` above - // uses. That claim is safe for `suspected` because only - // `lead_duplicate_check` writes it and it matches on email; `confirmed` - // is written by a PERSON, and the lead form lets a reviewer point - // `duplicate_of_type` + its lookup at any record they like. So the - // refusal names the survivor through the relationship fields that exist - // to carry it (`test/record-id-not-in-prose.test.ts`: "the id goes in the - // relationship field that exists to carry it, or nowhere"), naming the - // `duplicates` field group by its shipped label, "Duplicate Management". - // That sentence also stays true on the `erased` tombstone, where the - // verdict survives its pointer (`lead.hook.ts`, job 1c). - // - // ⛔ Never transcribe the vocabulary of `duplicate_of_type` into this - // sentence ("an existing Lead" / "an existing Contact"). Those labels are - // locale-pack facts with one source of truth, the rep can see them on the - // section this line points at, and a hand-copied machine list in prose is - // the drift AGENTS.md documentation rule 5 forbids. - // - // The title and the body are translated in the packs - // (`flows.lead_conversion.screens.refuse_confirmed_duplicate`). - id: "refuse_confirmed_duplicate", - type: "screen", - label: "Conversion Refused", - config: { - title: "Conversion refused", - description: "This lead's Duplicate Status is Confirmed: a reviewer compared it against an existing record and recorded that it repeats one. Converting would create a second account, contact and opportunity for the same buyer. The Duplicate Management section on this lead names the surviving record; disqualify this lead as a duplicate instead. Only a reviewer revising that verdict reopens conversion.", - // A message-only screen: no fields, so the pause has to be asked for. - // `waitForInput` is what turns a field-less screen from a server-side - // pass-through into the dialog the rep reads (the executor's - // `shouldPause`), and without it this node would fall through to `end` - // in silence — a refusal nobody is told about. - waitForInput: true - } - }, - { - // Branching is on edges `e28` / `e29` — see `decision_account`. - id: "decision_approval", - type: "decision", - label: "Approved for Conversion?" - }, - { - // The approval gate, on the surface a REST caller reaches (REQ-0005 - // acceptance 3). `convert_lead`'s `visible` predicate hides the button and - // `lead.hook.ts` refuses the write, but this flow has its own door — - // `POST /automation/lead_conversion/trigger` — and without this branch a - // caller through that door would run the whole conversion and only be - // refused at `mark_converted`, by which point the account, the contact and - // the opportunity have already been written and the lead is left - // half-converted. Refusing HERE, ahead of `screen_1`, is what makes the - // gate whole: every create and update in this flow sits behind that - // screen, and this path never reaches it. - id: "refuse_unapproved", - type: "screen", - label: "Conversion Refused", - config: { - title: "Conversion refused", - description: "This lead has not been approved for conversion. An approver has to sign it off before it can become an account, contact and opportunity; the Conversion Approval field on the lead shows whether the decision is still pending or was refused. Keep working the lead in the meantime \u2014 nothing about it is frozen.", - // Field-less screen: `waitForInput` is what turns it from a server-side - // pass-through into the dialog the rep reads. See - // `refuse_confirmed_duplicate` for the mechanism. - waitForInput: true - } - }, - { - // Branching is on edges `e31` / `e32` — see `decision_account`. The - // match-key guard sits between the duplicate verdict and `screen_1`, so - // it dominates `find_account` and a key-less lead is refused before the - // rep fills in the form and before any write. It is the LAST of the - // three refusals on purpose: an unapproved lead or a confirmed duplicate - // is told that verdict first, and a missing key is a repairable data - // gap rather than a verdict. - id: "decision_match_key", - type: "decision", - label: "Company Match Key?" - }, - { - // The KEY-LESS refusal (#2017). Why `find_account` must not run without - // a key is recorded on that node; this is what the rep reads instead. - // - // A refusal, not a new account, and that is the flow's own stated intent - // rather than a fresh choice: a conversion that stops is far cheaper to - // diagnose than one that quietly attaches to the wrong account or - // creates a duplicate one, and `screen_1` offers the rep no account - // choice that could confirm a match by hand. - // - // The copy claims only what holds on every path into it: the key is - // derived from `company` on every write that carries it - // (`lead_duplicate_check`), and nothing has been written, because every - // create and update in this flow sits behind `screen_1`. Its title and - // body are translated in the packs, like the other two refusals. - // - // Field-less screen: `waitForInput` is what turns it from a server-side - // pass-through into the dialog the rep reads. See - // `refuse_confirmed_duplicate` for the mechanism. - id: "refuse_no_match_key", - type: "screen", - label: "Conversion Refused", - config: { - title: "Conversion refused", - description: "This lead's company has no match key, so conversion cannot tell which account it belongs to, and it will not guess: a guess could file the contact and opportunity under another customer. Saving the lead's Company rebuilds the key, so save it again, then convert. Nothing has been created.", - waitForInput: true - } - }, - { - // Account dedupe: match on the NORMALIZED company name, never on the raw - // one — "Acme Corp" and "ACME Corp" are the same account. - // - // Both sides of this comparison are stored, hook-maintained columns, and - // on 17.x that was forced rather than chosen: a flow template could not - // normalize ANYTHING. `service-automation`'s `resolveToken` recognises exactly one - // function form — `NOW()` / `TODAY()` — and every bare identifier in the - // expression fallback is substituted before evaluation, so no string - // method is reachable either: `{LOWER(x)}`, `{TRIM(x)}` and - // `{x.toLowerCase()}` all resolve to `undefined`, and an unwrapped - // `LOWER({x})` interpolates literally to "LOWER(Acme Corp)". A formula - // field is no help either — it has no physical column to filter on. So - // the producer canonicalizes (`account_protection`, - // `lead_duplicate_check`) and this node does a plain, indexed equality - // match. `test/account-name-normalized-match.test.ts` re-measures all of - // that rather than trusting this paragraph. - // - // Normalize-then-EXACT only: lower + trim + collapse internal - // whitespace. Fuzzy matching stays out of scope. - // - // A lead with NO `company_normalized` never reaches this node: - // `decision_match_key`, ahead of `screen_1`, refuses it first. The node - // cannot be left to refuse on its own, because "no key" arrives in two - // shapes that behave differently (both measured on 17.7.0): - // - // · ABSENT — a sparse datasource (`driver-memory` / `driver-mongodb`) - // on a row never written with the column. The token resolves to - // nothing and `get_record` refuses to run, so the run FAILS - // (`FLOW_FAILED`, "refusing to run — 1 filter condition(s) resolved - // to nothing and were dropped from the query …"). - // · NULL — SQL, or any datasource once the column is written empty, - // which `lead_duplicate_check` does on purpose for a company that - // folds to nothing. The token resolves to `null`, and a bare `null` - // in a filter is the platform's documented HAS-NO-VALUE predicate - // (`$eq: null`, `@objectstack/spec` `data/filter.zod.ts`). This - // lookup then MATCHES every account whose own key is null, and the - // lead converts onto an unrelated customer's account (#2017). - // - // A key-less lead is not only a row written before the producer existed - // (the backfill in docs/MAINTENANCE.md §3.3): a non-string company - // written through the record API folds to `null` too. A conversion that - // stops is far cheaper to diagnose than one that quietly attaches to the - // wrong account or creates a duplicate one, so the answer is the - // refusal the rep reads in `refuse_no_match_key`. - // - // Since 18.0.0-next.0 the operand is a CEL envelope: an absent key fails - // the run before the query, and a null one refuses the node instead of - // matching (the platform's `flow-value-slot-template-dialect-refused` - // entry; not re-measured here). Neither shape converts onto another - // account any more, and `decision_match_key` still refuses first, with - // copy the rep can read. - // - // ⛔ Never paper this over with a second, case-sensitive lookup on the - // raw `name`: a missing key means the producer could not derive one, and - // a tolerant consumer path would hide that while restoring the exact bug - // this node exists to fix. - id: "find_account", - type: "get_record", - label: "Find Existing Account", - config: { objectName: "crm_account", filter: { name_normalized: cel6`leadRecord.company_normalized` }, outputVariable: "matchedAccount" } - }, - { - // Branching is on edges `e5` / `e6`. No `config.condition` here: a - // `decision` node's singular one is never evaluated. - id: "decision_account", - type: "decision", - label: "Account Already Exists?" - }, - { - // NEW-account branch. outputVariable is `createdAccount`; the assignment - // below normalizes both branches onto a single `accountId` id string so - // downstream nodes don't need to know which path ran. - // - // `name` carries the lead's company VERBATIM — the display value. The - // match key `name_normalized` is deliberately absent: it is readonly and - // hook-owned, and `account_protection` derives it from the `name` written - // here, so an account created by this node is immediately findable by the - // next conversion. - id: "create_account", - type: "create_record", - label: "Create Account", - config: { - objectName: "crm_account", - fields: { - // `company` is required on a lead; every other copied fact is - // optional, so its read is guarded to null (an insert treats null as - // it treated the key the template left out). - name: cel6`leadRecord.company`, - phone: cel6`has(leadRecord.phone) ? leadRecord.phone : null`, - website: cel6`has(leadRecord.website) ? leadRecord.website : null`, - industry: cel6`has(leadRecord.industry) ? leadRecord.industry : null`, - annual_revenue: cel6`has(leadRecord.annual_revenue) ? leadRecord.annual_revenue : null`, - number_of_employees: cel6`has(leadRecord.number_of_employees) ? leadRecord.number_of_employees : null`, - billing_address: cel6`has(leadRecord.address) ? leadRecord.address : null`, - owner_id: cel6`current_user.id`, - is_active: true - }, - outputVariable: "createdAccount" - } - }, - { - id: "use_new_account", - type: "assignment", - label: "Use New Account", - config: { assignments: { accountId: cel6`createdAccount.id` } } - }, - { - id: "use_existing_account", - type: "assignment", - label: "Reuse Existing Account", - config: { assignments: { accountId: cel6`matchedAccount.id` } } - }, - { - // Contact dedupe by email — GLOBAL, not per-account. ⛔ Never scope this - // lookup to the account: `crm_contact` carries a global unique index on - // `email`, so an account-scoped lookup misses a same-email contact under - // another account and `create_contact` then explodes on the DB index - // AFTER the account has been created, orphaning it. Leads require an - // email, so the match key is reliable. - id: "find_contact", - type: "get_record", - label: "Find Existing Contact", - config: { - objectName: "crm_contact", - filter: { email: cel6`leadRecord.email` }, - outputVariable: "matchedContact" - } - }, - { - // Branching is on edges `e11` / `e12` — see `decision_account`. - id: "decision_contact", - type: "decision", - label: "Contact Already Exists?" - }, - { - // `accountId` is a bare id string from whichever account branch ran. - id: "create_contact", - type: "create_record", - label: "Create Contact", - config: { - objectName: "crm_contact", - fields: { - // The person's own facts travel with them (#2068). `crm_contact` - // declares each of these on the lead's vocabulary (`_picklists.ts` - // for the two selects, pinned by `test/actions-flows-integrity`), so - // a straight copy is always legal. The two opt-outs are copied, - // never defaulted: a lead that opted out must not become a contact - // that has not — `email_opt_out` hides Send Email and silences - // `contact_welcome`, `do_not_call` refuses a scheduled call. A - // REUSED contact does not come through here: see - // `decision_contact_do_not_call`. - // - // Names and email are required on a lead and read bare; the rest - // are optional and guarded to null, which an insert reads as the - // omitted key the template wrote (each opt-out then takes its - // `false` default, as before). - salutation: cel6`has(leadRecord.salutation) ? leadRecord.salutation : null`, - mobile: cel6`has(leadRecord.mobile) ? leadRecord.mobile : null`, - lead_source: cel6`has(leadRecord.lead_source) ? leadRecord.lead_source : null`, - do_not_call: cel6`has(leadRecord.do_not_call) ? leadRecord.do_not_call : null`, - email_opt_out: cel6`has(leadRecord.email_opt_out) ? leadRecord.email_opt_out : null`, - first_name: cel6`leadRecord.first_name`, - last_name: cel6`leadRecord.last_name`, - email: cel6`leadRecord.email`, - phone: cel6`has(leadRecord.phone) ? leadRecord.phone : null`, - title: cel6`has(leadRecord.title) ? leadRecord.title : null`, - crm_account: cel6`accountId`, - is_primary: true, - owner_id: cel6`current_user.id` - }, - outputVariable: "createdContact" - } - }, - { - id: "use_new_contact", - type: "assignment", - label: "Use New Contact", - config: { assignments: { contactId: cel6`createdContact.id` } } - }, - { - id: "use_existing_contact", - type: "assignment", - label: "Reuse Existing Contact", - config: { assignments: { contactId: cel6`matchedContact.id` } } - }, - { - // ── A REUSED contact keeps the stricter consent (#2068) ────────────── - // - // `create_contact` copies the lead's opt-outs onto a NEW contact. A - // reused contact already holds its own answer, and an opt-out is a - // promise to a person that a conversion never takes back — so this path - // only ever RAISES a flag, one node per flag, and only when the lead - // carries it. The `raise_*` nodes write the literal `true`, ⛔ never a - // copy of `leadRecord.x`: a copy would write the lead's `false` over a contact - // who had opted out. `crm_account` carries neither flag, so the account - // half of "the stricter value wins" has nothing to write. - // - // The edges read the LEAD's flag only, not whether the contact already - // holds it. Reading `vars.matchedContact.x` needs a - // `has(vars.matchedContact)` guard, which - // `test/flow-variable-conditions.test.ts` forbids on this flow (a - // `get_record` binds it on every path) — and writing `true` over `true` - // changes nothing. - // - // Branching on `e35` / `e36`, then `e38` / `e39`: each pair is TOTAL and - // partitions by De Morgan, so exactly one edge holds on every shape - // `get_lead` can bind — pinned in `test/flow-conversion.test.ts`. - id: "decision_contact_do_not_call", - type: "decision", - label: "Lead Is Do-Not-Call?" - }, - { - id: "raise_contact_do_not_call", - type: "update_record", - label: "Carry Do-Not-Call to Contact", - config: { objectName: "crm_contact", filter: { id: cel6`contactId` }, fields: { do_not_call: true } } - }, - { - id: "decision_contact_email_opt_out", - type: "decision", - label: "Lead Opted Out of Email?" - }, - { - id: "raise_contact_email_opt_out", - type: "update_record", - label: "Carry Email Opt-Out to Contact", - config: { objectName: "crm_contact", filter: { id: cel6`contactId` }, fields: { email_opt_out: true } } - }, - { - // Branching is on edges `e16` / `e17` — see `decision_account`. - id: "decision_opportunity", - type: "decision", - label: "Create Opportunity?" - }, - { - // `close_date` comes from the screen field, which is the only layer that - // can carry the `isoDate(daysFromNow(90))` expression — see the - // `closeDate` declaration. An unbound `closeDate` fails the run at this - // node rather than inventing a quarter, which is the failure this node - // is allowed to have. - id: "create_opportunity", - type: "create_record", - label: "Create Opportunity", - config: { - objectName: "crm_opportunity", - fields: { - name: cel6`opportunityName`, - crm_account: cel6`accountId`, - primary_contact: cel6`contactId`, - amount: cel6`opportunityAmount`, - stage: "prospecting", - probability: 10, - lead_source: cel6`has(leadRecord.lead_source) ? leadRecord.lead_source : null`, - close_date: cel6`closeDate`, - owner_id: cel6`current_user.id` - }, - outputVariable: "createdOpportunity" - } - }, - { - // Normalize both opportunity branches onto a single `opportunityId`, the - // same pattern as accountId/contactId. ⛔ Never reference - // `createdOpportunity.id` downstream instead: on the "No" branch the - // create node never ran, and the unbound read fails the run (on 17.x the - // unresolved token interpolated into the `converted_opportunity` lookup - // as a placeholder). - id: "use_new_opportunity", - type: "assignment", - label: "Use New Opportunity", - config: { assignments: { opportunityId: cel6`createdOpportunity.id` } } - }, - { - id: "no_opportunity", - type: "assignment", - label: "No Opportunity", - config: { assignments: { opportunityId: null } } - }, - { - id: "mark_converted", - type: "update_record", - label: "Mark Lead as Converted", - config: { - objectName: "crm_lead", - filter: { id: cel6`recordId` }, - fields: { - // `status: 'converted'` rides along so list views agree with the - // conversion flags (the qualified → converted transition is legal - // per the lead_status_progression state machine). - is_converted: true, - status: "converted", - converted_date: cel6`isoDatetime(now())`, - converted_account: cel6`accountId`, - converted_contact: cel6`contactId`, - converted_opportunity: cel6`opportunityId` - } - } - }, - { - // ADR-0012: deliver via the `notify` node (inbox + email). The legacy - // `script` + `actionType:'email'` shape is a no-op stub in 7.4. - id: "send_notification", - type: "notify", - label: "Send Confirmation", - config: { - recipients: [cel6`current_user.id`], - channels: ["inbox", "email"], - topic: "lead_converted", - template: "crm.lead_converted", - templateData: { first_name: cel6`leadRecord.first_name`, last_name: cel6`leadRecord.last_name` }, - actionUrl: "/crm_account/{{accountId}}" - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - // ⛔ A retired edge's id stays VACANT and every surviving edge keeps the id - // it has always had — `e1`, `e3` and `e15` are gaps on purpose. - // Renumbering to close a gap rewrites ids that other notes, tests and run - // logs refer to. - { id: "e0", source: "start", target: "get_lead", type: "default" }, - // ⛔ When you add an edge, take the next id AFTER THE HIGHEST IN USE — do - // not reuse a vacant one, and do not assume an unused-looking id is free. - // A duplicate id is INERT (traversal filters out-edges by `source`, never - // by `id`), so nothing fails and the collision survives to trap the next - // editor picking out of the sequence. `e1`, `e3` and `e15` are vacant - // retired ids and stay that way; `e27` is above the highest live id, not - // a gap-fill. - { id: "e27", source: "get_lead", target: "decision_approval", type: "default" }, - // ── The approval gate (REQ-0005 step 7) ──────────────────────────── - // - // The same TOTAL, PARTITIONING pair the duplicate verdict below is written - // as, and for the same measured reason: a decision node declaring no - // `config.conditions` takes EVERY out-edge whose condition holds, in - // parallel, so two overlapping guards would refuse the conversion and - // continue it in one run. `e29` is `e28` negated by De Morgan. - // - // ⚠️ The polarity is fail-OPEN, unlike the duplicate branch, and that is the - // gate's off switch rather than a slip. Only the two verdicts a live - // approval writes refuse; `not_required` — the shipped default — and an - // absent column (a lead from before the field existed) both continue, so - // with the gate off this pair is invisible and conversion behaves exactly as - // it did before. `lead.hook.ts` and `convert_lead.visible` carry the same - // polarity, because the three have to agree about what "off" means. - { id: "e28", source: "decision_approval", target: "refuse_unapproved", type: "default", condition: P26`has(vars.leadRecord) && has(vars.leadRecord.conversion_approval_status) - && (vars.leadRecord.conversion_approval_status == "pending" || vars.leadRecord.conversion_approval_status == "rejected")`, label: "Not approved" }, - { id: "e29", source: "decision_approval", target: "decision_duplicate", type: "default", condition: P26`!has(vars.leadRecord) || !has(vars.leadRecord.conversion_approval_status) - || (vars.leadRecord.conversion_approval_status != "pending" && vars.leadRecord.conversion_approval_status != "rejected")`, label: "Clear" }, - // Rejoins nothing, exactly like `e26`: the refusal IS not reaching a writer. - { id: "e30", source: "refuse_unapproved", target: "end", type: "default" }, - // ⚠️ Both conditions are TOTAL, and on this surface that is not a style - // preference: a flow condition is interpreted strict CEL on every run, and - // an unguarded field read against a driver that omits absent columns - // (`driver-memory` / `driver-mongodb`) aborts — which FAILS THE RUN, so an - // unguarded read here would make ordinary leads unconvertible. Measured, in - // exactly that shape: `condition failed to evaluate as CEL: No such key: - // duplicate_status`. The full table is in - // `test/flow-condition-totality.test.ts`. - // - // TWO guards, in the spelling `test/flow-variable-conditions.test.ts` - // requires, and the outer one is not decoration: `vars.leadRecord` is a - // KEY, so a plain `vars.leadRecord != null` would itself abort with - // `Unknown variable` on the run where `get_lead` bound nothing — the guard - // would be the fault it was written to prevent. `has(vars.leadRecord)` - // answers instead of reading. - // - // The THREE edges PARTITION by De Morgan (`!(a && b && c)` written out as - // `!a || !b || !c`, with the two verdict tests conjoined under the last - // term), so exactly one is true for every record shape, including the - // shapes where the column, the row or both are missing. - // - // ⛔ `e22`'s third term must carry BOTH inequalities. A decision node that - // declares no `config.conditions` reports no branch, so traversal takes - // EVERY out-edge whose condition holds, IN PARALLEL — with `e22` left at - // `!= "suspected"` a confirmed lead satisfies `e22` AND `e25`, showing the - // refusal and converting the lead in the same run. Measured on - // `AutomationEngine.evaluateCondition` across all seven record shapes; the - // pin is in `test/lead-duplicate-visibility.test.ts`. - { id: "e21", source: "decision_duplicate", target: "warn_duplicate", type: "default", condition: P26`has(vars.leadRecord) && has(vars.leadRecord.duplicate_status) && vars.leadRecord.duplicate_status == "suspected"`, label: "Suspected" }, - { id: "e25", source: "decision_duplicate", target: "refuse_confirmed_duplicate", type: "default", condition: P26`has(vars.leadRecord) && has(vars.leadRecord.duplicate_status) && vars.leadRecord.duplicate_status == "confirmed"`, label: "Confirmed" }, - { id: "e22", source: "decision_duplicate", target: "no_duplicate_warning", type: "default", condition: P26`!has(vars.leadRecord) || !has(vars.leadRecord.duplicate_status) || (vars.leadRecord.duplicate_status != "suspected" && vars.leadRecord.duplicate_status != "confirmed")`, label: "Clean" }, - // Both clear duplicate branches pass the match-key guard before the form. - { id: "e23", source: "warn_duplicate", target: "decision_match_key", type: "default" }, - { id: "e24", source: "no_duplicate_warning", target: "decision_match_key", type: "default" }, - // ── The match-key guard (#2017) ──────────────────────────────────── - // - // TOTAL and PARTITIONING, for the reason recorded at `e28` / `e29`: `e32` - // is `e31` negated by De Morgan, so exactly one holds for every shape - // `get_lead` can bind — unbound, a null row, the column absent, null, - // empty, or keyed. `has()` alone is not the test: on a row that carries - // the column as null it answers true, so the value needs `isBlank` too. - // Fail-CLOSED, unlike the approval gate: without a key there is nothing to - // match on, and a guess is the defect. - { id: "e31", source: "decision_match_key", target: "screen_1", type: "default", condition: P26`has(vars.leadRecord) && has(vars.leadRecord.company_normalized) && !isBlank(vars.leadRecord.company_normalized)`, label: "Has match key" }, - { id: "e32", source: "decision_match_key", target: "refuse_no_match_key", type: "default", condition: P26`!has(vars.leadRecord) || !has(vars.leadRecord.company_normalized) || isBlank(vars.leadRecord.company_normalized)`, label: "No match key" }, - // Rejoins nothing, exactly like `e26` / `e30`. - { id: "e33", source: "refuse_no_match_key", target: "end", type: "default" }, - // The refusal branch rejoins nothing: it goes straight to `end`, so no - // node that writes is downstream of it. That is the refusal — the flow's - // every create/update sits behind `screen_1`, which this path never - // reaches. - { id: "e26", source: "refuse_confirmed_duplicate", target: "end", type: "default" }, - { id: "e2", source: "screen_1", target: "find_account", type: "default" }, - { id: "e4", source: "find_account", target: "decision_account", type: "default" }, - // Existing account → reuse; no account → create. Both converge on create_contact. - // `find_account` is reached only with a match key (`e31`), so a match - // here is an equality on a real key, never the has-no-value predicate. - // ⛔ No second copy of the key test on these two edges: it could never - // be false here, and an inert restatement of a live predicate is the - // shape #650 retired from this repo's decision nodes. - { id: "e5", source: "decision_account", target: "use_existing_account", type: "default", condition: P26`vars.matchedAccount != null`, label: "Existing" }, - { id: "e6", source: "decision_account", target: "create_account", type: "default", condition: P26`vars.matchedAccount == null`, label: "New" }, - { id: "e7", source: "create_account", target: "use_new_account", type: "default" }, - // Both account branches converge on the contact-dedupe lookup. - { id: "e8", source: "use_new_account", target: "find_contact", type: "default" }, - { id: "e9", source: "use_existing_account", target: "find_contact", type: "default" }, - { id: "e10", source: "find_contact", target: "decision_contact", type: "default" }, - // Existing contact → reuse; none → create. Both converge on - // decision_opportunity, the reuse path through the consent raise below. - { id: "e11", source: "decision_contact", target: "use_existing_contact", type: "default", condition: P26`vars.matchedContact != null`, label: "Existing" }, - { id: "e12", source: "decision_contact", target: "create_contact", type: "default", condition: P26`vars.matchedContact == null`, label: "New" }, - { id: "e13", source: "create_contact", target: "use_new_contact", type: "default" }, - { id: "e14", source: "use_new_contact", target: "decision_opportunity", type: "default" }, - // ── The reused contact's consent raise (#2068) ───────────────────── - // - // `e15` (use_existing_contact → decision_opportunity) is RETIRED and stays - // vacant; `e34` replaces it. Each pair below is TOTAL and PARTITIONING, and - // only a flag the lead carries as `true` takes the raise. - { id: "e34", source: "use_existing_contact", target: "decision_contact_do_not_call", type: "default" }, - { id: "e35", source: "decision_contact_do_not_call", target: "raise_contact_do_not_call", type: "default", condition: P26`has(vars.leadRecord) && has(vars.leadRecord.do_not_call) && vars.leadRecord.do_not_call == true`, label: "Do not call" }, - { id: "e36", source: "decision_contact_do_not_call", target: "decision_contact_email_opt_out", type: "default", condition: P26`!has(vars.leadRecord) || !has(vars.leadRecord.do_not_call) || vars.leadRecord.do_not_call != true`, label: "Callable" }, - { id: "e37", source: "raise_contact_do_not_call", target: "decision_contact_email_opt_out", type: "default" }, - { id: "e38", source: "decision_contact_email_opt_out", target: "raise_contact_email_opt_out", type: "default", condition: P26`has(vars.leadRecord) && has(vars.leadRecord.email_opt_out) && vars.leadRecord.email_opt_out == true`, label: "Opted out" }, - { id: "e39", source: "decision_contact_email_opt_out", target: "decision_opportunity", type: "default", condition: P26`!has(vars.leadRecord) || !has(vars.leadRecord.email_opt_out) || vars.leadRecord.email_opt_out != true`, label: "Emailable" }, - { id: "e40", source: "raise_contact_email_opt_out", target: "decision_opportunity", type: "default" }, - { id: "e16", source: "decision_opportunity", target: "create_opportunity", type: "default", condition: P26`vars.createOpportunity == true`, label: "Yes" }, - { id: "e17", source: "decision_opportunity", target: "no_opportunity", type: "default", condition: P26`vars.createOpportunity != true`, label: "No" }, - { id: "e18", source: "create_opportunity", target: "use_new_opportunity", type: "default" }, - { id: "e18a", source: "use_new_opportunity", target: "mark_converted", type: "default" }, - { id: "e18b", source: "no_opportunity", target: "mark_converted", type: "default" }, - { id: "e19", source: "mark_converted", target: "send_notification", type: "default" }, - { id: "e20", source: "send_notification", target: "end", type: "default" } - ] -}; - -// src/sales/flows/lead-conversion-approval.flow.ts -import { P as P27, cel as cel7 } from "@objectstack/spec"; -var LeadConversionApprovalFlow = { - name: "lead_conversion_approval", - label: "Lead Conversion Approval", - description: "Sign-off a lead needs before it may be converted. Inert unless the install arms the gate on crm_lead.conversion_approval_status.", - type: "record_change", - status: "active", - // Same reading `opportunity_approval` records, and for the same two reasons. - // A gate exists to CONSTRAIN the submitter, so the submitter's own scope is - // the wrong identity to evaluate it under — and an approval control that - // engages only for writers carrying a session is not a control, since a - // `runAs: 'system'` importer creating leads would simply bypass it. The - // verdict writes below also land on `conversion_approval_status`, which is - // `readonly: true` on the object, so only a platform write reaches it. - runAs: "system", - variables: [ - { name: "leadId", type: "text", isInput: true, isOutput: false } - ], - nodes: [ - { - id: "start", - type: "start", - label: "Start", - config: { - objectName: "crm_lead", - triggerType: "record-after-create", - // TOTALITY (AGENTS.md — validation predicates must be TOTAL): `has()` - // on every read. A flow condition is strict CEL on every run, and an - // unguarded read against a driver that omits absent columns aborts — - // which from 17.0.0-rc.2 FAILS THE RUN rather than skipping it. The - // absent case must read as "not gated": a lead with no approval column - // at all is a lead from before the field existed, and it converts the - // way it always did. - condition: P27`has(record.conversion_approval_status) && record.conversion_approval_status == "pending"` - } - }, - { - id: "get_lead", - type: "get_record", - label: "Get Lead", - config: { objectName: "crm_lead", filter: { id: cel7`record.id` }, outputVariable: "leadRecord" } - }, - { - id: "conversion_review", - type: "approval", - label: "Lead Conversion Review", - config: { - // The customer's chain is 销售负责人 → 销售总监; the generic shape core - // ships is the manager bench this app already declares approvers - // against. A second tier, or a different position, is overlay - // configuration — the same status as the need-type vocabulary. - approvers: [{ type: "position", value: "sales_manager" }], - // Explicit though it is the schema default, exactly as - // `opportunity_approval` authors it: approvers snapshot at request - // creation, so an empty bench would otherwise leave the request - // undecidable — and here that means a lead nobody can ever convert. - onEmptyApprovers: "admin_rescue", - behavior: "first_response", - // ⚠️ `false`, and NOT the schema default `true` — the one place this - // node deliberately differs from its opportunity sibling. A deal under - // review is a document being negotiated; a LEAD under review is a person - // a rep is still calling. Locking the record would freeze - // `last_contacted_date`, `next_followup_date`, the notes and every - // activity bubble for as long as the approver takes, so the gate would - // stop the work it exists to authorise. Nothing is at risk in leaving it - // open: the verdict column is `readonly: true`, so the only field this - // node's decision touches is one no user may write anyway. - lockRecord: false, - approvalStatusField: "conversion_approval_status" - } - }, - { - id: "mark_approved", - type: "update_record", - label: "Mark Approved", - config: { - objectName: "crm_lead", - filter: { id: cel7`record.id` }, - fields: { conversion_approval_status: "approved" } - } - }, - { - id: "notify_approved", - type: "notify", - label: "Notify Owner \u2014 Approved", - config: { - recipients: [cel7`has(leadRecord.owner_id) ? leadRecord.owner_id : null`], - channels: ["inbox"], - topic: "lead_conversion_approved", - template: "crm.lead_conversion_approved", - templateData: { first_name: cel7`leadRecord.first_name`, last_name: cel7`leadRecord.last_name` }, - actionUrl: "/crm_lead/{{record.id}}" - } - }, - { - id: "mark_rejected", - type: "update_record", - label: "Mark Rejected", - config: { - objectName: "crm_lead", - filter: { id: cel7`record.id` }, - fields: { conversion_approval_status: "rejected" } - } - }, - { - id: "notify_rejected", - type: "notify", - label: "Notify Owner \u2014 Rejected", - config: { - recipients: [cel7`has(leadRecord.owner_id) ? leadRecord.owner_id : null`], - channels: ["inbox"], - severity: "warning", - topic: "lead_conversion_rejected", - template: "crm.lead_conversion_rejected", - templateData: { first_name: cel7`leadRecord.first_name`, last_name: cel7`leadRecord.last_name` }, - actionUrl: "/crm_lead/{{record.id}}" - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "get_lead", type: "default" }, - { id: "e2", source: "get_lead", target: "conversion_review", type: "default" }, - // Approval-node branch labels — the engine resumes down the out-edge whose - // `label` matches the recorded decision. - { id: "e3", source: "conversion_review", target: "mark_approved", type: "default", label: "approve" }, - { id: "e4", source: "conversion_review", target: "mark_rejected", type: "default", label: "reject" }, - { id: "e5", source: "mark_approved", target: "notify_approved", type: "default" }, - { id: "e6", source: "notify_approved", target: "end", type: "default" }, - { id: "e7", source: "mark_rejected", target: "notify_rejected", type: "default" }, - { id: "e8", source: "notify_rejected", target: "end", type: "default" } - ] -}; - -// src/sales/flows/account-approval.flow.ts -import { P as P28, cel as cel8 } from "@objectstack/spec"; -var AccountApprovalFlow = { - name: "account_approval", - label: "Account Approval", - description: "Sign-off a newly created account needs before it counts as established data. Switchable from crm_account.approval_status.", - type: "record_change", - status: "active", - // Same reading the two sibling approval flows record. A gate exists to - // CONSTRAIN the submitter, so the submitter's own scope is the wrong identity - // to evaluate it under; and the verdict writes below land on - // `approval_status`, which is `readonly: true` on the object, so only a - // platform write reaches it at all. - runAs: "system", - variables: [{ name: "accountId", type: "text", isInput: true, isOutput: false }], - nodes: [ - { - id: "start", - type: "start", - label: "Start", - config: { - objectName: "crm_account", - triggerType: "record-after-create", - // Fires on the BLANK a new account is born with (see the header): - // absent on a sparse driver, null on SQL. A user cannot pre-fill the - // column (it is `readonly`), so only a system writer or an install's - // `approved` default can make it non-blank at insert, and both mean - // "nothing to submit". - // TOTALITY (AGENTS.md — validation predicates must be TOTAL): the - // `(!has(x) || isBlank(x))` form is the "x holds no value" row of that - // table. A flow condition is strict CEL on every run, and an unguarded - // read against a driver that omits absent columns aborts — which from - // 17.0.0-rc.2 FAILS THE RUN rather than skipping it. - condition: P28`!has(record.approval_status) || isBlank(record.approval_status)` - } - }, - { - id: "get_account", - type: "get_record", - label: "Get Account", - config: { - objectName: "crm_account", - filter: { id: cel8`record.id` }, - outputVariable: "accountRecord" - } - }, - { - id: "account_review", - type: "approval", - label: "Account Review", - config: { - // The customer's chain is 销售负责人 → 销售总监; REQ-0003 rules that named - // chain **C** (overlay — one company's org chart), so core ships the - // one generic tier against the manager bench this app already declares. - approvers: [{ type: "position", value: "sales_manager" }], - // Explicit though it is the schema default, exactly as both sibling - // flows author it: approvers snapshot at request creation, so an empty - // bench would otherwise leave the request undecidable — and here that - // means an account nobody can ever approve. - onEmptyApprovers: "admin_rescue", - behavior: "first_response", - // ⚠️ `false`, matching the lead sibling rather than the opportunity one. - // An account under review is a record a rep is still working — contacts - // are being attached, the address is being corrected, activity is - // landing on it. Locking it would freeze exactly the data-entry the - // approval exists to review. Nothing is at risk: the verdict column is - // `readonly: true`, so the only field this decision touches is one no - // user may write anyway. - lockRecord: false, - approvalStatusField: "approval_status" - } - }, - { - id: "mark_approved", - type: "update_record", - label: "Mark Approved", - config: { - objectName: "crm_account", - filter: { id: cel8`record.id` }, - fields: { approval_status: "approved" } - } - }, - { - id: "notify_approved", - type: "notify", - label: "Notify Owner \u2014 Approved", - config: { - recipients: [cel8`has(accountRecord.owner_id) ? accountRecord.owner_id : null`], - channels: ["inbox"], - topic: "account_approved", - template: "crm.account_approved", - templateData: { name: cel8`accountRecord.name` }, - actionUrl: "/crm_account/{{record.id}}" - } - }, - { - id: "mark_rejected", - type: "update_record", - label: "Mark Rejected", - config: { - objectName: "crm_account", - filter: { id: cel8`record.id` }, - fields: { approval_status: "rejected" } - } - }, - { - id: "notify_rejected", - type: "notify", - label: "Notify Owner \u2014 Rejected", - config: { - recipients: [cel8`has(accountRecord.owner_id) ? accountRecord.owner_id : null`], - channels: ["inbox"], - severity: "warning", - topic: "account_rejected", - template: "crm.account_rejected", - templateData: { name: cel8`accountRecord.name` }, - actionUrl: "/crm_account/{{record.id}}" - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "get_account", type: "default" }, - { id: "e2", source: "get_account", target: "account_review", type: "default" }, - // Approval-node branch labels — the engine resumes down the out-edge whose - // `label` matches the recorded decision. - { id: "e3", source: "account_review", target: "mark_approved", type: "default", label: "approve" }, - { id: "e4", source: "account_review", target: "mark_rejected", type: "default", label: "reject" }, - { id: "e5", source: "mark_approved", target: "notify_approved", type: "default" }, - { id: "e6", source: "notify_approved", target: "end", type: "default" }, - { id: "e7", source: "mark_rejected", target: "notify_rejected", type: "default" }, - { id: "e8", source: "notify_rejected", target: "end", type: "default" } - ] -}; - -// src/sales/flows/schedule-followup.flow.ts -import { cel as cel9 } from "@objectstack/spec"; -var ScheduleFollowUpFlow = { - name: "schedule_followup", - label: "Schedule Follow-up", - description: "Create the next follow-up task on a lead, already linked and owned.", - type: "screen", - status: "active", - variables: [ - // MUST be `recordId` — the console's flow-action contract seeds only that - // name (and its camelCase object alias); a custom name arrives undefined. - { name: "recordId", type: "text", isInput: true, isOutput: false }, - { name: "subject", type: "text", isInput: true, isOutput: false }, - { name: "dueDate", type: "date", isInput: true, isOutput: false }, - { name: "activityType", type: "text", isInput: true, isOutput: false }, - { name: "priority", type: "text", isInput: true, isOutput: false }, - { name: "notes", type: "text", isInput: true, isOutput: false } - ], - nodes: [ - { id: "start", type: "start", label: "Start", config: { objectName: "crm_lead" } }, - { - id: "screen_1", - type: "screen", - label: "Schedule Follow-up", - config: { - fields: [ - { name: "subject", label: "What is the next step?", type: "text", required: true }, - { name: "dueDate", label: "Due Date", type: "date", required: true }, - { - name: "activityType", - label: "Activity Type", - type: "select", - // Mirrors crm_task.type exactly. ⛔ Never hand-copy the subset — it - // silently drops an option (`other`) from the picker. - options: plainOptions(TASK_TYPE_OPTIONS) - }, - { - name: "priority", - label: "Priority", - type: "select", - options: [ - { label: "Low", value: "low" }, - { label: "Normal", value: "normal" }, - { label: "High", value: "high" }, - { label: "Urgent", value: "urgent" } - ] - }, - { name: "notes", label: "Notes", type: "textarea" } - ] - } - }, - { - id: "get_lead", - type: "get_record", - label: "Get Lead Record", - config: { objectName: "crm_lead", filter: { id: cel9`recordId` }, outputVariable: "leadRecord" } - }, - { - id: "create_task", - type: "create_record", - label: "Create Follow-up Task", - config: { - objectName: "crm_task", - fields: { - subject: cel9`subject`, - due_date: cel9`dueDate`, - // The three optional answers: a resume may leave one unbound, which - // the template wrote as nothing and the guard writes as null. On an - // insert the two are the same — the engine applies a field's default - // to an explicit null exactly as to an omitted key, so an unanswered - // priority still lands as `normal`. - type: cel9`has(vars.activityType) ? activityType : null`, - priority: cel9`has(vars.priority) ? priority : null`, - description: cel9`has(vars.notes) ? notes : null`, - status: "not_started", - owner_id: cel9`current_user.id`, - // Polymorphic parent: both halves are required for the lead's - // Related tab to pick the task up. - related_to_type: "crm_lead", - related_to_lead: cel9`recordId` - }, - outputVariable: "createdTask" - } - }, - { - // Keep the lead's own follow-up date in step with the task that was just - // filed, so the Hot Leads view (sorted by next_followup_date) reflects - // the commitment the rep actually made. - id: "stamp_lead", - type: "update_record", - label: "Stamp Next Follow-up Date", - config: { - objectName: "crm_lead", - filter: { id: cel9`recordId` }, - fields: { next_followup_date: cel9`dueDate` } - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "screen_1", type: "default" }, - { id: "e2", source: "screen_1", target: "get_lead", type: "default" }, - { id: "e3", source: "get_lead", target: "create_task", type: "default" }, - { id: "e4", source: "create_task", target: "stamp_lead", type: "default" }, - { id: "e5", source: "stamp_lead", target: "end", type: "default" } - ] -}; - -// src/sales/flows/opportunity-approval.flow.ts -import { P as P29, cel as cel10 } from "@objectstack/spec"; -var OpportunityApprovalFlow = { - name: "opportunity_approval", - label: "Large Deal Approval", - description: "Tiered approval for opportunities: manager review at $100K or more, director sign-off > $500K.", - type: "record_change", - status: "active", - // Same user-less exposure as every record-change flow (ADR-0049) — and the - // one with teeth. Measured on 17.0.0-rc.2: a $150K renewal - // created by the `runAs: 'system'` contract_renewal sweep fired this flow - // with no trigger user, and the run died at `get_opportunity`. The deal sat - // at `approval_status: 'not_required'`, unlocked, with no approval request - // ever opened — the gate was bypassed by the writer simply not carrying a - // session. An approval control that only engages for logged-in writers is - // not a control. - // - // Elevating the USER-driven runs too is not merely acceptable here, it is - // required. This gate exists to CONSTRAIN the submitter, so the submitter's - // own scope is the wrong identity to evaluate it under; and - // `mark_approved` / `mark_rejected` stamp `approval_status` on a record the - // approval node holds locked (`lockRecord: true`), which only a platform - // write may land. The approval node itself already opens its request under - // the platform identity while re-attaching the deciding user for - // attribution, so this declaration aligns the flow with the node it drives. - runAs: "system", - variables: [ - { name: "opportunityId", type: "text", isInput: true, isOutput: false } - ], - nodes: [ - { - id: "start", - type: "start", - label: "Start", - // Trigger wiring (7.4): bind to afterUpdate; gate on crossing the entry - // threshold while not already in an approval state. The `not_required` - // guard stops the flow's own approval_status writes from re-triggering it. - config: { - objectName: "crm_opportunity", - triggerType: "record-after-update", - // Null-tolerant: rows inserted before approval_status had a field-level - // defaultValue (e.g. flow-created opportunities) carry null, which must - // still enter approval. - // Stage guard: a settled deal must never (re-)enter approval — the - // freeze hook rejects approval-status writes on closed records, so - // without this guard the flow opened a locked approval request it - // could never resolve (lockRecord held the closed record hostage). - // TOTALITY: `has(...)` on every read, plus `!= null` on the - // ordering comparison — `has()` passes an explicit null and - // `record.amount >= 100000` then aborts with - // `no such overload: dyn >= int`. Measured total as authored - // today (amount/stage are required, approval_status is defaulted), but - // that is `crm_opportunity`'s schema doing the work, not the - // predicate. An absent `approval_status` reads the same as the null - // this condition already tolerates; an absent `stage` is not a settled - // stage, so it must not block approval. - condition: P29`has(record.amount) && record.amount != null && record.amount >= ${LARGE_DEAL_AMOUNT} - && (!has(record.approval_status) || record.approval_status == "not_required" || record.approval_status == null) - && (!has(record.stage) || (record.stage != "closed_won" && record.stage != "closed_lost"))` - } - }, - { - id: "get_opportunity", - type: "get_record", - label: "Get Opportunity", - config: { objectName: "crm_opportunity", filter: { id: cel10`record.id` }, outputVariable: "oppRecord" } - }, - // ── Tier 1: Sales Manager review (all deals at $100K or more) ─── - { - id: "manager_review", - type: "approval", - label: "Sales Manager Review", - config: { - // ⛔ Never add an org-owner approver as an empty-bench workaround. - // `onEmptyApprovers: 'admin_rescue'` is the node policy for an empty - // position on @objectstack 17 (approvers snapshot at request creation, - // so a position with no holders would otherwise leave the request - // undecidable while `lockRecord` held the record hostage). An - // `{ type: 'org_membership_level', value: 'owner' }` entry overshoots: - // with `behavior: 'first_response'` it makes an org owner a routine - // approver for every deal, not a rescue when the bench is empty. - approvers: [{ type: "position", value: "sales_manager" }], - // Explicit even though `admin_rescue` is the schema default — this is - // the mechanism the node depends on, so it is authored, not inherited. - onEmptyApprovers: "admin_rescue", - behavior: "first_response", - lockRecord: true, - approvalStatusField: "approval_status" - } - }, - // ── Tier gate: does this deal also need director sign-off? ────── - { - // No `config.condition` here: the branch is on edges `e5` / `e6`, which - // is where the engine actually reads it. A copy on the node would be - // inert and indistinguishable from the live one (17.0.0-rc.2's - // `flow-inert-node-condition`). - id: "check_high_value", - type: "decision", - label: "High Value (> $500K)?" - }, - // ── Tier 2: Sales Director sign-off (deals > $500K only) ──────── - { - id: "director_signoff", - type: "approval", - label: "Sales Director Sign-off", - config: { - // Same node policy as manager_review — see the note there. - approvers: [{ type: "position", value: "sales_director" }], - onEmptyApprovers: "admin_rescue", - behavior: "first_response", - lockRecord: true, - approvalStatusField: "approval_status" - } - }, - // ── Final approve: stamp status + notify owner ────────────────── - { - id: "mark_approved", - type: "update_record", - label: "Mark Approved", - config: { - objectName: "crm_opportunity", - filter: { id: cel10`record.id` }, - fields: { approval_status: "approved", approved_date: cel10`isoDatetime(now())` } - } - }, - { - id: "notify_approved", - type: "notify", - label: "Notify Owner \u2014 Approved", - config: { - recipients: [cel10`has(oppRecord.owner_id) ? oppRecord.owner_id : null`], - channels: ["inbox", "email"], - topic: "opportunity_approved", - template: "crm.opportunity_approved", - templateData: { name: cel10`oppRecord.name` }, - actionUrl: "/crm_opportunity/{{record.id}}" - } - }, - // ── Rejection: stamp status + notify owner ────────────────────── - { - id: "mark_rejected", - type: "update_record", - label: "Mark Rejected", - config: { - objectName: "crm_opportunity", - filter: { id: cel10`record.id` }, - fields: { approval_status: "rejected" } - } - }, - { - id: "notify_rejected", - type: "notify", - label: "Notify Owner \u2014 Rejected", - config: { - recipients: [cel10`has(oppRecord.owner_id) ? oppRecord.owner_id : null`], - channels: ["inbox", "email"], - severity: "warning", - topic: "opportunity_rejected", - template: "crm.opportunity_rejected", - templateData: { name: cel10`oppRecord.name` }, - actionUrl: "/crm_opportunity/{{record.id}}" - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "get_opportunity", type: "default" }, - { id: "e2", source: "get_opportunity", target: "manager_review", type: "default" }, - // Manager decision (approval-node branch labels) - { id: "e3", source: "manager_review", target: "check_high_value", type: "default", label: "approve" }, - { id: "e4", source: "manager_review", target: "mark_rejected", type: "default", label: "reject" }, - // Tier gate (decision-node conditional branches). These EDGES are the live - // sites — the engine never evaluates a `decision` node's singular - // `config.condition` — and they must PARTITION, so the guards are written - // in opposite polarity. A deal whose amount cannot be read lands on - // `mark_approved`: the manager has already approved it, and an unreadable - // amount must not strand an approved deal in a locked, undecidable - // director step. - // - // TOTALITY: `oppRecord` is a `get_record` OUTPUT, so the read needs - // `has(vars.oppRecord)` (the variable), `has(vars.oppRecord.amount)` (the - // column — `findOne` answers a miss with `null`, and a sparse driver row - // omits an unwritten column outright) and `!= null` (an explicit null - // passes `has()` and the ordering comparison then aborts with `no such - // overload: dyn > int`). Measured total as authored today — `amount` - // is `required` on `crm_opportunity` and the `get_record` is keyed on the - // row that just fired the trigger — but that is the neighbouring schema - // doing the work, exactly as in the start condition above. `vars.`-scoped - // rather than bare: `has(oppRecord.amount)` still aborts with `Unknown - // variable: oppRecord` on an unbound variable, `has(vars.oppRecord)` - // answers `false` (measured). From 17.0.0-rc.2 an unevaluable condition - // ABORTS the step rather than skipping it, so a guard that was - // belt-and-braces is now what keeps the run alive. - { id: "e5", source: "check_high_value", target: "director_signoff", type: "conditional", condition: P29`has(vars.oppRecord) && has(vars.oppRecord.amount) - && vars.oppRecord.amount != null && vars.oppRecord.amount > ${HIGH_VALUE_DEAL_AMOUNT}`, label: "High value (> $500K)" }, - { id: "e6", source: "check_high_value", target: "mark_approved", type: "conditional", condition: P29`!has(vars.oppRecord) || !has(vars.oppRecord.amount) - || vars.oppRecord.amount == null || vars.oppRecord.amount <= ${HIGH_VALUE_DEAL_AMOUNT}`, label: "Standard (\u2264 $500K)" }, - // Director decision (approval-node branch labels) - { id: "e7", source: "director_signoff", target: "mark_approved", type: "default", label: "approve" }, - { id: "e8", source: "director_signoff", target: "mark_rejected", type: "default", label: "reject" }, - // Terminal branches - { id: "e9", source: "mark_approved", target: "notify_approved", type: "default" }, - { id: "e10", source: "notify_approved", target: "end", type: "default" }, - { id: "e11", source: "mark_rejected", target: "notify_rejected", type: "default" }, - { id: "e12", source: "notify_rejected", target: "end", type: "default" } - ] -}; -var OpportunityApprovalOnCreateFlow = { - ...OpportunityApprovalFlow, - name: "opportunity_approval_on_create", - label: "Large Deal Approval (on create)", - description: "Approval intake for opportunities created above the threshold (insert-time twin of opportunity_approval).", - nodes: OpportunityApprovalFlow.nodes.map( - (n) => n.id === "start" ? { ...n, config: { ...n.config, triggerType: "record-after-create" } } : n - ) -}; - -// src/sales/flows/opportunity-status-change-approval.flow.ts -import { P as P30, cel as cel11 } from "@objectstack/spec"; -var OpportunityStatusChangeApprovalFlow = { - name: "opportunity_status_change_approval", - label: "Opportunity Status Change Approval", - description: "Sign-off a deal needs before it is declared won or lost. Inert unless the install arms the gate on crm_opportunity.status_change_approval_status.", - type: "record_change", - status: "active", - // REQ-0006 acceptance 4, and the same reading `opportunity_approval` records - // from its own measured failure: a gate that engages only for writers - // carrying a session is not a control — a `runAs: 'system'` sweep or import - // would simply bypass it. The verdict and the stage write below also land on - // columns the readonly strip protects, which only a platform write reaches. - runAs: "system", - variables: [ - { name: "opportunityId", type: "text", isInput: true, isOutput: false } - ], - nodes: [ - { - id: "start", - type: "start", - label: "Start", - config: { - objectName: "crm_opportunity", - triggerType: "record-after-update", - // TOTALITY (AGENTS.md — validation predicates must be TOTAL): `has()` - // on every read. A flow condition is strict CEL on every run and an - // unguarded read against a driver that omits absent columns aborts, - // which from 17.0.0-rc.2 FAILS THE RUN rather than skipping it. The - // absent case must read as "not gated": a deal with no gate column at - // all predates the field and closes the way it always did. - // - // Three halves: - // - // - the gate is ARMED: `pending` (born armed, no request decided yet) - // or `rejected` (the last request was refused). `rejected` re-opens - // on a new request because `opportunity.hook.ts` refuses a direct - // close in both states — if only `pending` entered here, a rejected - // deal could be neither requested nor closed, ever. - // - a request is present; - // - the request is NEW on this write. TRANSITION, not current value — - // the idiom `billing_handoff_closed_won` records for this object. - // Without it the flow re-fires on its own write-back while the - // request is still open (the approval node's `pending` stamp through - // `approvalStatusField` is an update of this record). Measured on - // 17.6.0 with this term deleted: one re-entry per request, each - // caught only by the engine's self-trigger guard ("the guard as - // authored does not exclude the flow's own write-back"); with it, - // none. `previous.*` is guarded FAIL-CLOSED: no visible prior - // value, no visible new request. - // - // `apply_status` leaves the gate `approved` (out of reach) and - // `clear_request` empties the request, so neither re-enters. - condition: P30`has(record.status_change_approval_status) - && (record.status_change_approval_status == "pending" || record.status_change_approval_status == "rejected") - && has(record.requested_status) && record.requested_status != null && record.requested_status != "" - && has(previous.requested_status) && previous.requested_status != record.requested_status` - } - }, - { - id: "get_opportunity", - type: "get_record", - label: "Get Opportunity", - config: { objectName: "crm_opportunity", filter: { id: cel11`record.id` }, outputVariable: "oppRecord" } - }, - { - id: "status_review", - type: "approval", - label: "Status Change Review", - config: { - // The customer's chain is 销售负责人 → 事业部负责人; the generic shape core - // ships is the manager bench this app already declares approvers - // against. A second tier, or a different position, is overlay - // configuration (REQ-0006 acceptance 5). - approvers: [{ type: "position", value: "sales_manager" }], - // Explicit though it is the schema default, exactly as both sibling - // approvals author it: approvers snapshot at request creation, so an - // empty bench would leave the request undecidable — and here that - // means a deal nobody can ever close. - onEmptyApprovers: "admin_rescue", - behavior: "first_response", - // `true`, matching `opportunity_approval` and NOT the lead gate: a deal - // awaiting a won/lost verdict must not keep moving underneath the - // approver. Its narrative fields are what the freeze hook leaves open - // anyway. - lockRecord: true, - approvalStatusField: "status_change_approval_status" - } - }, - { - // The approved decision is what moves the stage — "通过后正式生效". - // - // ⚠️ Both fields in ONE write, and that is load-bearing: the - // status-change guard in `opportunity.hook.ts` reads the gate column - // INPUT-FIRST, so this write presents itself as already-approved and the - // guard lets the stage through. Splitting it into two writes would have - // the guard refuse the flow's own write (ELEVATION IS NOT ANONYMITY — - // `runAs: 'system'` carries the triggering user, so `ctx.user?.id` is - // present in this run). - // - // `win_reason` / `loss_reason` are `requiredWhen` the stage is closed and - // are evaluated against the merged record, so the values the rep captured - // when requesting satisfy them here. - id: "apply_status", - type: "update_record", - label: "Apply Requested Status", - config: { - objectName: "crm_opportunity", - filter: { id: cel11`record.id` }, - fields: { - stage: cel11`oppRecord.requested_status`, - status_change_approval_status: "approved", - approved_date: cel11`isoDatetime(now())` - } - } - }, - { - // A rejected request is cleared, not left standing, and the verdict stays - // `rejected` so the hook keeps refusing a direct close: the way on is a - // new request, which the start condition opens as a fresh approval. - id: "clear_request", - type: "update_record", - label: "Clear Rejected Request", - config: { - objectName: "crm_opportunity", - filter: { id: cel11`record.id` }, - fields: { status_change_approval_status: "rejected", requested_status: null } - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "get_opportunity", type: "default" }, - { id: "e2", source: "get_opportunity", target: "status_review", type: "default" }, - // Approval-node branch labels. - { id: "e3", source: "status_review", target: "apply_status", type: "default", label: "approve" }, - { id: "e4", source: "status_review", target: "clear_request", type: "default", label: "reject" }, - { id: "e5", source: "apply_status", target: "end", type: "default" }, - { id: "e6", source: "clear_request", target: "end", type: "default" } - ] -}; - -// src/sales/flows/opportunity-qualification-approval.flow.ts -import { P as P31, cel as cel12 } from "@objectstack/spec"; -var OpportunityQualificationApprovalFlow = { - name: "opportunity_qualification_approval", - label: "Opportunity Qualification Approval", - description: "The \u7ACB\u9879 sign-off a deal needs before its stage or won/lost call may change. Inert unless the install arms the gate on crm_opportunity.qualification_approval_status.", - type: "record_change", - status: "active", - // The reading both sibling gates record from `opportunity_approval`'s - // measured failure: a gate that engages only for writers carrying a session - // is not a control. The verdict writes below also land on a column the - // readonly strip protects, which only a platform write reaches. - runAs: "system", - variables: [ - { name: "opportunityId", type: "text", isInput: true, isOutput: false } - ], - nodes: [ - { - id: "start", - type: "start", - label: "Start", - config: { - objectName: "crm_opportunity", - triggerType: "record-after-update", - // TOTALITY (AGENTS.md — validation predicates must be TOTAL): `has()` - // on every read; the absent case reads as "not gated". - // - // Three halves, the status-change gate's own: - // - // - the gate is ARMED: `pending` or `rejected`. `rejected` re-opens on a - // new request because the hook refuses the gated acts in both states — - // if only `pending` entered here, a rejected deal could never qualify. - // - the request is ticked; - // - the request is NEW on this write. TRANSITION, not current value: - // the approval node's `pending` stamp through `approvalStatusField` is - // an update of this record while the request is still ticked, and a - // current-value test re-fires on it. Measured on a 17.6.0 boot with - // this term deleted: one re-entry per request, caught only by the - // engine's self-trigger guard ("the guard as authored does not - // exclude the flow's own write-back"); with it, none. `previous.*` is - // guarded FAIL-CLOSED: no visible prior value, no visible new request. - // - // `mark_qualified` leaves the gate `approved` (out of reach) and - // `clear_request` unticks the request, so neither re-enters. - condition: P31`has(record.qualification_approval_status) - && (record.qualification_approval_status == "pending" || record.qualification_approval_status == "rejected") - && has(record.qualification_requested) && record.qualification_requested == true - && has(previous.qualification_requested) && previous.qualification_requested != true` - } - }, - { - id: "get_opportunity", - type: "get_record", - label: "Get Opportunity", - config: { objectName: "crm_opportunity", filter: { id: cel12`record.id` }, outputVariable: "oppRecord" } - }, - { - id: "qualification_review", - type: "approval", - label: "Qualification Review", - config: { - // The customer's chain is 销售负责人 / 事业部审批岗 → 事业部负责人; the generic - // shape core ships is the manager bench both sibling gates route to. A - // second tier, or a different position, is overlay configuration - // (REQ-0006: the named approval chains are C). - approvers: [{ type: "position", value: "sales_manager" }], - // Explicit though it is the schema default, as every sibling authors - // it: an empty bench would leave the request undecidable — here, a - // deal that can never move its stage. - onEmptyApprovers: "admin_rescue", - behavior: "first_response", - // ⚠️ `false`, NOT the status-change gate's `true` — the one term this - // node deliberately takes from the LEAD gate instead. Step 11 says it - // in as many words: 「新增商机可跟进」. A deal awaiting 立项 is still being - // worked — the narrative, the customer calendar, the amount and Will - // Bid are what the approver reads — and locking it would stop that work - // for as long as the approver takes. The two acts the gate exists to hold - // are refused by `opportunity_lifecycle` whether or not a request is - // open, so the lock would add nothing but the freeze. - lockRecord: false, - approvalStatusField: "qualification_approval_status" - } - }, - { - id: "mark_qualified", - type: "update_record", - label: "Mark Qualified", - config: { - objectName: "crm_opportunity", - filter: { id: cel12`record.id` }, - fields: { qualification_approval_status: "approved" } - } - }, - { - // A rejected request is cleared, not left standing, and the verdict stays - // `rejected` so the hook keeps refusing the gated acts: the way on is a - // new request, which the start condition opens as a fresh approval. - id: "clear_request", - type: "update_record", - label: "Clear Rejected Request", - config: { - objectName: "crm_opportunity", - filter: { id: cel12`record.id` }, - fields: { qualification_approval_status: "rejected", qualification_requested: false } - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "get_opportunity", type: "default" }, - { id: "e2", source: "get_opportunity", target: "qualification_review", type: "default" }, - // Approval-node branch labels. - { id: "e3", source: "qualification_review", target: "mark_qualified", type: "default", label: "approve" }, - { id: "e4", source: "qualification_review", target: "clear_request", type: "default", label: "reject" }, - { id: "e5", source: "mark_qualified", target: "end", type: "default" }, - { id: "e6", source: "clear_request", target: "end", type: "default" } - ] -}; - -// src/sales/flows/opportunity-stagnation.flow.ts -import { P as P32, cel as cel13 } from "@objectstack/spec"; -var STALE_THRESHOLD_DAYS = 14; -var OpportunityStagnationFlow = { - name: "opportunity_stagnation", - label: "Stalled Deal Alert", - description: "Daily sweep: nudge owners about open opportunities stuck in-stage beyond the threshold.", - type: "schedule", - status: "active", - // Scheduled runs have no trigger user, so under the default runAs:'user' the - // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that - // RLS-bypassing elevation explicit and intended (ADR-0049). - runAs: "system", - variables: [], - nodes: [ - { id: "start", type: "start", label: "Start (daily 07:30)", config: { schedule: "30 7 * * *" } }, - { - id: "query_stalled", - type: "get_record", - label: "Find Stalled Deals", - config: { - objectName: "crm_opportunity", - // ⛔ Predicate on the STORED `stage_entry_date`, never on - // `days_in_stage`: the latter is a formula, computed after the query, so - // as a filter key it addresses a column that does not exist. - // `entry < today − N` - // is the same test as `days_in_stage > N`, computed by a CEL value - // envelope (the `isoDate(daysAgo(n))` spelling; contract-renewal uses - // its `daysFromNow` twin). - // A row with a null `stage_entry_date` does not satisfy `$lt` and is - // skipped, preserving "nothing has stagnated yet" for unstamped rows. - filter: { - stage: { $nin: ["closed_won", "closed_lost"] }, - stage_entry_date: { $lt: cel13`isoDate(daysAgo(${STALE_THRESHOLD_DAYS}))` } - }, - limit: 500, - outputVariable: "oppList" - } - }, - { - id: "loop_opps", - type: "loop", - label: "For Each Stalled Deal", - config: { - collection: cel13`oppList`, - iteratorVariable: "currentOpp", - body: guarded("opp", { - nodes: [ - { - // Idempotency gate: a still-open stall task means this deal was - // already nudged. ⛔ Without it the daily sweep re-notifies and - // re-creates an identical task every morning for as long as the - // deal stays stalled — an unbounded duplicate pile-up. - id: "find_existing_task", - type: "get_record", - label: "Already Nudged?", - config: { - objectName: "crm_task", - filter: { - related_to_opportunity: cel13`currentOpp.id`, - subject: cel13`'Advance stalled deal: ' + currentOpp.name`, - status: { $nin: ["completed"] } - }, - outputVariable: "existingStallTask" - } - }, - { - // Gateway only — the predicate lives on the out-edge. - id: "check_not_nudged", - type: "decision", - label: "First Nudge?" - }, - { - // Owner only: `{currentOpp.owner_id.manager}` cannot traverse a - // lookup in flow templates — it interpolates to the literal - // "undefined" (cf. opportunity_won_alert). - id: "notify_owner", - type: "notify", - label: "Nudge Owner", - config: { - recipients: [cel13`has(currentOpp.owner_id) ? currentOpp.owner_id : null`], - channels: ["inbox", "email"], - topic: "deal_stalled", - template: "crm.deal_stalled", - templateData: { - name: cel13`currentOpp.name`, - stage: cel13`currentOpp.stage`, - days_in_stage: cel13`currentOpp.days_in_stage` - }, - actionUrl: "/crm_opportunity/{{currentOpp.id}}" - } - }, - { - id: "create_followup_task", - type: "create_record", - label: "Create Follow-up Task", - config: { - objectName: "crm_task", - fields: { - subject: cel13`'Advance stalled deal: ' + currentOpp.name`, - type: "follow_up", - priority: "high", - status: "not_started", - due_date: cel13`isoDate(daysFromNow(2))`, - owner_id: cel13`has(currentOpp.owner_id) ? currentOpp.owner_id : null`, - // ORG PARTITION. A schedule trigger carries no - // organization, so without this the nudge task is born - // `organization_id` NULL — outside every org partition. - // Upstream ruling objectstack#6155 Q2=A assigns the answer to - // the flow author; the task belongs to the org of the deal it - // nudges. `crm_opportunity` carries the column, so the read - // resolves. It is deliberately UNGUARDED: on 17.x a source - // lacking it interpolated to `undefined` and landed as NULL - // while looking declared; CEL fails the iteration instead, and - // a `has()` guard would write that NULL back. - organization_id: cel13`currentOpp.organization_id`, - related_to_type: "crm_opportunity", - related_to_opportunity: cel13`currentOpp.id` - } - } - } - ], - edges: [ - { id: "b1", source: "find_existing_task", target: "check_not_nudged", type: "default" }, - // "Already nudged" has no edge, so the loop moves to the next item. - // This edge is the ONLY site for the predicate: a `decision` - // node's singular `config.condition` is never read, so a node copy - // would be inert metadata free to drift away from what runs. - { id: "b2", source: "check_not_nudged", target: "notify_owner", type: "conditional", condition: P32`existingStallTask == null`, label: "First nudge" }, - { id: "b3", source: "notify_owner", target: "create_followup_task", type: "default" } - ] - }) - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "query_stalled", type: "default" }, - { id: "e2", source: "query_stalled", target: "loop_opps", type: "default" }, - { id: "e3", source: "loop_opps", target: "end", type: "default" } - ] -}; - -// src/sales/flows/forecast-snapshot.flow.ts -import { P as P33, expression as expression2, cel as cel14 } from "@objectstack/spec"; -var SNAPSHOT_PERIOD = "quarter"; -var OPEN_STAGES = { $nin: ["closed_won", "closed_lost"] }; -var CURRENT_PERIOD_FILTER = { - owner_id: cel14`currentOwner.id`, - period: SNAPSHOT_PERIOD, - period_start: { $lte: cel14`isoDate(today())` }, - period_end: { $gte: cel14`isoDate(today())` } -}; -var OWNED_PERIOD_FILTER = { ...CURRENT_PERIOD_FILTER, source: "scheduled" }; -var inPeriod = (extra) => ({ - owner_id: cel14`currentOwner.id`, - organization_id: cel14`currentForecast.organization_id`, - close_date: { - $gte: cel14`currentForecast.period_start`, - $lte: cel14`currentForecast.period_end` - }, - ...extra -}); -var sumBucket = (key, label, filter, total, item = `current_${key}`) => ({ - find: { - id: `find_${key}`, - type: "get_record", - label: `Find ${label}`, - config: { - objectName: "crm_opportunity", - filter, - limit: 500, - outputVariable: `${key}Opps` - } - }, - sum: { - id: `sum_${key}`, - type: "loop", - label: `Sum ${label}`, - config: { - collection: expression2(`${key}Opps`, "cel"), - iteratorVariable: item, - body: { - nodes: [ - { - id: `add_${key}`, - type: "assignment", - label: `Add to ${label}`, - config: { - assignments: { - [total]: expression2(`${total} + (!has(${item}.amount) || isBlank(${item}.amount) ? 0.0 : double(${item}.amount))`, "cel") - } - } - } - ], - edges: [] - } - } - } -}); -var BUCKETS = [ - sumBucket("pipeline", "Open Pipeline", inPeriod({ stage: OPEN_STAGES }), "pipelineTotal"), - sumBucket( - "best_case", - "Best Case", - inPeriod({ stage: OPEN_STAGES, forecast_category: { $in: ["best_case", "commit"] } }), - "bestCaseTotal" - ), - sumBucket( - "commit", - "Commit", - inPeriod({ stage: OPEN_STAGES, forecast_category: "commit" }), - "commitTotal" - ), - sumBucket("won", "Closed Won", inPeriod({ stage: "closed_won" }), "closedTotal") -]; -var OWNER_CHAIN = [ - "reset_totals", - ...BUCKETS.flatMap((b) => [b.find.id, b.sum.id]), - "write_snapshot" -]; -var ForecastSnapshotFlow = { - name: "forecast_snapshot", - label: "Forecast Snapshot", - description: "Nightly sweep: upsert a current-quarter crm_forecast row per active opportunity owner with pipeline, best-case, commit and closed-won totals.", - type: "schedule", - status: "active", - // Scheduled runs have no trigger user, so under the default runAs:'user' the - // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that - // RLS-bypassing elevation explicit and intended (ADR-0049) — and it - // is load-bearing here: `crm_forecast` is `sharingModel: 'private'`, so a - // user-scoped sweep could only ever see its own rows. - runAs: "system", - variables: [], - nodes: [ - { id: "start", type: "start", label: "Start (daily 03:00)", config: { schedule: "0 3 * * *" } }, - { - // Every user is a candidate; the `has_deals` gate below decides who is - // actually an opportunity owner. Filtering `sys_user` here instead would - // hard-code an activity flag this app does not own. - // No `filter` key: an EMPTY filter node (`{}`) reduces to TRUE and - // matches every row, so it is indistinguishable from an absent key — - // ObjectStack 17.0.0-rc.6 promotes the pair to an author-time error - // (`filter-empty-node`) precisely because only the absent key SAYS - // "every user is a candidate" to the next reader. The `has_deals` gate - // below is what actually narrows the set. - id: "query_owners", - type: "get_record", - label: "Find Users", - config: { objectName: "sys_user", limit: 500, outputVariable: "ownerList" } - }, - { - id: "loop_owners", - type: "loop", - label: "For Each Owner", - config: { - collection: cel14`ownerList`, - iteratorVariable: "currentOwner", - body: guarded("owner", { - nodes: [ - { - // Cheap findOne gate: a user with no live opportunity is not a - // forecast owner, and must not get a row (a fresh install would - // otherwise gain one empty snapshot per employee). - id: "find_any_deal", - type: "get_record", - label: "Owns Any Live Deal?", - config: { - objectName: "crm_opportunity", - filter: { owner_id: cel14`currentOwner.id`, stage: { $nin: ["closed_lost"] } }, - outputVariable: "ownerAnyDeal" - } - }, - { - // Gateway only — the predicate lives on the out-edge. - id: "has_deals", - type: "decision", - label: "Active Owner?" - }, - { - // Idempotency gate AND period lookup in one read: the row whose - // window contains today IS this owner's current-period snapshot. - id: "find_forecast", - type: "get_record", - label: "Current-Period Snapshot?", - config: { - objectName: "crm_forecast", - filter: CURRENT_PERIOD_FILTER, - outputVariable: "existingForecast" - } - }, - { - // Gateway only — the predicate lives on the out-edges. - id: "check_missing", - type: "decision", - label: "First Snapshot This Period?" - }, - { - // Only `period` is supplied: `forecast.hook.ts` derives - // period_start/period_end/period_label so the boundaries are - // calendar-true without the flow doing date arithmetic it - // cannot do. `quota` is omitted on purpose — see the header. - // A leaf node: the two mutually-exclusive edges out of - // `check_missing` both converge on `reload_forecast`, so the - // chain below runs exactly once on either path. - id: "create_forecast", - type: "create_record", - label: "Open Snapshot Row", - config: { - objectName: "crm_forecast", - fields: { - owner_id: cel14`currentOwner.id`, - // ORG PARTITION. A schedule trigger carries no - // organization, so without this the snapshot row is born - // `organization_id` NULL — outside every org partition, where - // an `(organization_id, …)` unique index does not constrain - // and org-scoped reads never see it. Upstream ruling - // objectstack#6155 Q2=A assigns the answer to the flow author. - // - // The source is `ownerAnyDeal`, NOT `currentOwner`. The loop - // item here is a `sys_user` row, and `sys_user` declares NO - // `organization_id` — identity is global, org-partitioned it - // is not (it carries `primary_business_unit_id` instead). - // On 17.x `{currentOwner.organization_id}` interpolated to - // `undefined` and landed as NULL: the publish guard, which only - // checks that the key is declared, went green over a row still - // born outside every partition (measured, not assumed). Under - // CEL that read fails the iteration instead. - // - // `ownerAnyDeal` is the `crm_opportunity` from `find_any_deal` - // — it carries the column, and edge `b2` (`ownerAnyDeal != - // null`) is the only route to this node, so it is never null - // here. Semantically right too: an owner's forecast belongs to - // the org their pipeline is in. - organization_id: cel14`ownerAnyDeal.organization_id`, - period: SNAPSHOT_PERIOD, - snapshot_date: cel14`isoDate(today())`, - source: "scheduled", - pipeline_amount: 0, - best_case_amount: 0, - commit_amount: 0, - closed_amount: 0 - } - } - }, - { - // Re-read rather than reuse the create output, so both paths - // (row already existed / row just created) hand the rest of the - // body ONE variable carrying the hook-derived period window. - // - // ⛔ Scope this to OWNED_PERIOD_FILTER, never to the gate's - // window: this read chooses the row that gets WRITTEN, and the - // sweep only ever owns its own. A miss binds `currentForecast` to - // null — `get_record` always binds — which is exactly what - // `check_owned` below is there to read. - id: "reload_forecast", - type: "get_record", - label: "Load Snapshot Row", - config: { - objectName: "crm_forecast", - filter: OWNED_PERIOD_FILTER, - outputVariable: "currentForecast" - } - }, - { - // Gateway only — the predicate lives on the out-edge. - // - // The stand-down gate. The window is handled either way by the - // time we get here; this asks whether the row handling it is the - // sweep's. Same single-out-edge skip shape as `has_deals`: when - // the only conditional edge does not match, the iteration ends and - // the engine records the unreached nodes as `skipped` with this - // node as `skippedBy` — so a stand-down is visible in the run log - // rather than silent. - id: "check_owned", - type: "decision", - label: "Sweep Owns This Row?" - }, - { - // Accumulators live in the flow-wide variable map (a loop body - // shares the enclosing scope), so they MUST be zeroed per owner - // or every rep inherits the previous rep's totals. - id: "reset_totals", - type: "assignment", - label: "Reset Totals", - config: { - assignments: { - pipelineTotal: 0, - bestCaseTotal: 0, - commitTotal: 0, - closedTotal: 0 - } - } - }, - ...BUCKETS.flatMap((b) => [b.find, b.sum]), - { - // Filter by id: `update_record` calls `data.update` without - // `options.multi`, so a filter matching more than one row fails - // (same constraint as demo_bootstrap / case_sla_monitor). - id: "write_snapshot", - type: "update_record", - label: "Write Snapshot", - config: { - objectName: "crm_forecast", - filter: { id: cel14`currentForecast.id` }, - fields: { - pipeline_amount: cel14`pipelineTotal`, - best_case_amount: cel14`bestCaseTotal`, - commit_amount: cel14`commitTotal`, - closed_amount: cel14`closedTotal`, - snapshot_date: cel14`isoDate(today())`, - source: "scheduled" - } - } - } - ], - edges: [ - // Loop-nested conditions are explicit CEL envelopes (`P`): the - // conversion pass that wraps bare strings only walks a flow's - // TOP-LEVEL edges, so a bare string in here would fall through to - // the legacy template path and compare as text — a gate that never - // opens, silently. - // - // These edges are the ONLY site for their predicates: a - // `decision` node's singular `config.condition` is never read, so a - // node-level copy would be inert metadata free to drift. - { id: "b1", source: "find_any_deal", target: "has_deals", type: "default" }, - // No matching edge simply ends this iteration, so a user with no - // live deal is skipped without a snapshot row. - { id: "b2", source: "has_deals", target: "find_forecast", type: "conditional", condition: P33`ownerAnyDeal != null`, label: "Active owner" }, - { id: "b3", source: "find_forecast", target: "check_missing", type: "default" }, - // Mutually exclusive, and both reach `reload_forecast` — never a - // default edge alongside a conditional one, which would traverse - // BOTH and double-count the whole chain. - { id: "b4", source: "check_missing", target: "create_forecast", type: "conditional", condition: P33`existingForecast == null`, label: "Open new row" }, - { id: "b5", source: "check_missing", target: "reload_forecast", type: "conditional", condition: P33`existingForecast != null`, label: "Refresh existing row" }, - { id: "b6", source: "create_forecast", target: "reload_forecast", type: "default" }, - { id: "b7", source: "reload_forecast", target: "check_owned", type: "default" }, - // The stand-down. No complementary edge, on purpose: the - // false branch is "this window belongs to a manual/ai row", and the - // whole point is that the sweep then does NOTHING — no write, and - // no second row. A variable-root null test, so no `has()` guard is - // needed: `reload_forecast` is a `get_record` and binds - // `currentForecast` unconditionally, to `null` on a miss. - { id: "b8", source: "check_owned", target: "reset_totals", type: "conditional", condition: P33`currentForecast != null`, label: "Sweep owns the row" }, - ...OWNER_CHAIN.slice(0, -1).map((source, i) => ({ - id: `c${i}`, - source, - target: OWNER_CHAIN[i + 1], - type: "default" - })) - ] - }) - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "query_owners", type: "default" }, - { id: "e2", source: "query_owners", target: "loop_owners", type: "default" }, - { id: "e3", source: "loop_owners", target: "end", type: "default" } - ] -}; - -// src/sales/flows/lead-assignment.flow.ts -import { P as P34, cel as cel15 } from "@objectstack/spec"; -var LeadAssignmentFlow = { - name: "lead_assignment", - label: "New Lead Routing & SLA", - description: "On new lead: set a rating-based follow-up SLA and alert the lead owner.", - type: "record_change", - status: "active", - // A record-change flow fired by a SYSTEM write carries no trigger user - // either (ADR-0049). This is the population the flow is FOR: - // leads arrive from web-to-lead, a CSV import, a partner integration or a - // seed load, none of which carry a user session. Measured on 17.0.0-rc.2, a - // user-less run refuses `sla_hot` / `sla_std` outright, so the lead lands - // with no follow-up SLA and no alert at all — silently, since the refusal - // surfaces only in the server log. - // - // Elevating the USER-driven runs too is correct: the SLA stamp is the - // platform's routing decision about the row that just fired the trigger - // (keyed to `{record.id}`), not the submitting rep's own edit, and a rep who - // may create a lead is not thereby guaranteed edit rights on it. - runAs: "system", - variables: [], - nodes: [ - { - id: "start", - type: "start", - label: "Start (lead created)", - config: { objectName: "crm_lead", triggerType: "record-after-create" } - }, - { - // Branching lives on edges `e2` / `e3` — see the totality note there. - // This node carries no `config.condition`: the engine never evaluates a - // `decision` node's singular one, so a copy here would restate the gate - // without being the gate (17.0.0-rc.2's `flow-inert-node-condition`). - id: "check_hot", - type: "decision", - label: "Hot Lead (rating \u2265 4)?" - }, - // ── Hot path: 1-day SLA, high-severity alert ─────────────────── - { - id: "sla_hot", - type: "update_record", - label: "Set 1-Day SLA", - config: { objectName: "crm_lead", filter: { id: cel15`record.id` }, fields: { next_followup_date: cel15`isoDate(daysFromNow(1))` } } - }, - { - id: "notify_hot", - type: "notify", - label: "Alert \u2014 Hot Lead", - config: { - // Route to the lead's OWNER (a real user id). A CRM position like - // 'sales_manager' is NOT a messaging audience — the messaging service - // resolves user:/role:(sys_member)/team:/owner_of:, and a bare - // 'sales_manager' was stored verbatim as sys_inbox_message.user_id, - // matching no real user, so these alerts reached nobody. owner is set - // on insert (defaultValue os.user.id) and is the accountable party. - recipients: [cel15`record.owner_id`], - channels: ["inbox", "email"], - severity: "warning", - topic: "lead_routing", - template: "crm.lead_routing_hot", - templateData: { - first_name: cel15`record.first_name`, - last_name: cel15`record.last_name`, - company: cel15`record.company`, - rating: cel15`record.rating` - }, - actionUrl: "/crm_lead/{{record.id}}" - } - }, - // ── Standard path: 3-day SLA, normal alert ───────────────────── - { - id: "sla_std", - type: "update_record", - label: "Set 3-Day SLA", - config: { objectName: "crm_lead", filter: { id: cel15`record.id` }, fields: { next_followup_date: cel15`isoDate(daysFromNow(3))` } } - }, - { - id: "notify_std", - type: "notify", - label: "Alert \u2014 New Lead", - config: { - // Route to the lead's owner — see notify_hot for why a bare - // 'sales_manager' position never reached anyone. - recipients: [cel15`record.owner_id`], - channels: ["inbox"], - topic: "lead_routing", - template: "crm.lead_routing_new", - templateData: { - first_name: cel15`record.first_name`, - last_name: cel15`record.last_name`, - company: cel15`record.company` - }, - actionUrl: "/crm_lead/{{record.id}}" - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "check_hot", type: "default" }, - // TOTALITY: these two edges must PARTITION every lead — a rating - // the predicate cannot read has to fall down one branch, never neither. - // Guarding both with `has(...) &&` would have traded a loud abort for a - // silent no-op (unrated lead → no SLA, no alert, no error), which is the - // "declared ≠ enforced" shape this repo keeps deleting rules over. So the - // hot branch demands a readable rating and the standard branch absorbs - // everything else: an unrated lead is, correctly, not a hot lead. - // - // `rating` is neither required nor defaulted, so a lead written without one - // is stored with NO `rating` column on driver-memory / driver-mongodb. - // Measured end-to-end: the unguarded `record.rating >= 4` aborted with `No - // such key: rating` and an unrated lead got no SLA stamp and no alert at - // all. `has()` alone is not enough on an ORDERING comparison — an explicit - // `rating: null` passes `has()` and then aborts with `no such overload: - // dyn >= int` — so both guards are required, in this order. - { id: "e2", source: "check_hot", target: "sla_hot", type: "conditional", condition: P34`has(record.rating) && record.rating != null && record.rating >= 4`, label: "Hot" }, - { id: "e3", source: "check_hot", target: "sla_std", type: "conditional", condition: P34`!has(record.rating) || record.rating == null || record.rating < 4`, label: "Standard" }, - { id: "e4", source: "sla_hot", target: "notify_hot", type: "default" }, - { id: "e5", source: "notify_hot", target: "end", type: "default" }, - { id: "e6", source: "sla_std", target: "notify_std", type: "default" }, - { id: "e7", source: "notify_std", target: "end", type: "default" } - ] -}; - -// src/sales/flows/contact-welcome.flow.ts -import { P as P35, cel as cel16 } from "@objectstack/spec"; -var ContactWelcomeFlow = { - name: "contact_welcome", - label: "Contact Welcome", - description: "On new contact: prompt the owner to welcome them.", - type: "record_change", - status: "active", - // A record-change flow fired by a SYSTEM write carries no trigger user - // either (ADR-0049) — and this flow exists FOR that - // population: the start condition below already documents the seeded / - // integration-written contacts whose `owner_id` the security middleware - // never stamped because the write carried no session. - // - // Measured honestly on 17.0.0-rc.2: this flow has NO data node today (start - // → notify → end), the runAs refusal covers get/create/update/delete only, - // and `notify` dispatches through the messaging service without a run data - // context — so a user-less run completes and delivers today, and this - // declaration changes nothing observable right now. It is declared anyway - // because the decision being recorded is "record-change automation runs as - // the platform", not "this flow currently happens to have no data node". - // The day a data node is added — or a start-node `config.expand`, which is - // the remedy the notify node's own error message recommends and which reads - // through the same guarded path — the elevation has already been reasoned - // about here rather than discovered as a refusal in production. Elevation is - // harmless for the user-driven runs: there is no data operation to scope. - runAs: "system", - variables: [], - nodes: [ - { - id: "start", - type: "start", - label: "Start (contact created)", - config: { - objectName: "crm_contact", - triggerType: "record-after-create", - // TOTALITY: every `record.x` read carries a `has(record.x)` - // guard — see the house-rule block in - // `test/flow-condition-totality.test.ts`. The absent-key case is real - // here, not hypothetical: `owner_id` is auto-stamped by the security - // middleware only on writes that CARRY a user, and a system write — - // seed data, an integration, a `runAs: 'system'` flow — short-circuits - // that middleware entirely. Such a row reaches driver-memory - // with NO `owner_id` column at all, so `record.owner_id != null` alone - // aborts with `No such key` and no seeded contact ever gets a welcome - // prompt. `!= null` is not a substitute for `has()`: on an absent key - // it aborts exactly like `== "v"` does. An absent `email_opt_out` - // means the contact has not opted out. - condition: P35`has(record.owner_id) && record.owner_id != null - && (!has(record.email_opt_out) || record.email_opt_out != true)` - } - }, - { - id: "send_welcome", - type: "notify", - label: "Prompt Owner to Welcome", - config: { - recipients: [cel16`record.owner_id`], - channels: ["inbox", "email"], - topic: "contact_welcome", - template: "crm.contact_welcome", - templateData: { first_name: cel16`record.first_name`, last_name: cel16`record.last_name` }, - actionUrl: "/crm_contact/{{record.id}}" - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "send_welcome", type: "default" }, - { id: "e2", source: "send_welcome", target: "end", type: "default" } - ] -}; - -// src/sales/flows/opportunity-won-alert.flow.ts -import { P as P36, cel as cel17 } from "@objectstack/spec"; -var OpportunityWonAlertFlow = { - name: "opportunity_won_alert", - label: "Large Deal Won Alert", - description: "On closed_won opportunities of $100K or more: notify the owner \u2014 the owner alone, not their manager.", - type: "record_change", - status: "active", - // A record-change flow fired by a SYSTEM write carries no trigger user - // either (ADR-0049). Deals reach `closed_won` through - // machinery as well as through a rep's own save — `lead_conversion` and the - // `contract_renewal` sweep both write opportunities, and the latter is - // itself `runAs: 'system'`. - // - // Measured honestly on 17.0.0-rc.2: this flow has NO data node (start → - // notify → end), so the refusal does not reach it today and declaring - // `system` changes nothing observable. Declared for the same reason as - // `contact_welcome` — see the fuller note there. Nothing to scope, so - // elevating the user-driven runs costs nothing. - runAs: "system", - variables: [], - nodes: [ - { - id: "start", - type: "start", - label: "Start (opp updated)", - config: { - objectName: "crm_opportunity", - triggerType: "record-after-update", - // `previous.stage` guard: fire on the TRANSITION into closed_won only. - // Without it every later edit of a won deal (seed-ownership - // claims, approval-status stamps, description tweaks) re-sent the - // congratulations blast. The trigger forwards `previous` into the - // condition scope (cf. the engine's record-change context). - // TOTALITY: `has(...)` on every read, plus `!= null` on the - // ordering comparison (`has()` passes an explicit null and - // `record.amount >= 100000` then aborts with - // `no such overload: dyn >= int`). - // - // `previous.stage` is guarded FAIL-CLOSED — `has(previous.stage) &&`, - // not `!has(previous.stage) ||` — which is the opposite of how - // `record.stage` is guarded, deliberately. This term exists solely to - // suppress a re-fire, and the failure it was written for (a - // congratulations blast to management re-sent on every later edit of a - // won deal) is worse than a missed one. When the engine cannot see - // what the prior stage was it cannot see a TRANSITION either, so it - // must not claim one. In practice `previous` is a full prior row on - // every record-after-update; the shape this covers is a bulk - // `updateMany`, where ObjectQL never reads a prior row and `previous` - // arrives null — and firing one blast per row of a bulk update is - // exactly what nobody wants. - condition: P36`has(record.stage) && record.stage == "closed_won" - && has(previous.stage) && previous.stage != "closed_won" - && has(record.amount) && record.amount != null && record.amount >= ${LARGE_DEAL_AMOUNT}` - } - }, - { - // The `label` names what this node actually does: it notifies the owner - // and nobody else. The `id` keeps its original `notify_management` - // spelling on purpose — `edges[]` reference nodes by id, so renaming one - // is a behaviour change, not a wording fix. - id: "notify_management", - type: "notify", - label: "Notify Owner", - config: { - // Owner only: `{record.owner_id.manager}` cannot traverse a lookup on the - // raw trigger snapshot — it interpolates to the literal "undefined" - // and the message is delivered to a phantom user. - recipients: [cel17`record.owner_id`], - channels: ["inbox", "email"], - severity: "info", - topic: "large_deal_won", - template: "crm.large_deal_won", - templateData: { name: cel17`record.name`, amount: cel17`record.amount` }, - actionUrl: "/crm_opportunity/{{record.id}}" - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "notify_management", type: "default" }, - { id: "e2", source: "notify_management", target: "end", type: "default" } - ] -}; - -// src/sales/flows/task-urgent-alert.flow.ts -import { P as P37, cel as cel18 } from "@objectstack/spec"; -var TaskUrgentAlertFlow = { - name: "task_urgent_alert", - label: "Urgent Task Alert", - description: "On new urgent task: notify the owner.", - type: "record_change", - status: "active", - // A record-change flow fired by a SYSTEM write carries no trigger user - // either (ADR-0049), and most urgent tasks in this app are - // machine-written: `case_status_side_effects` opens the escalation follow-up - // task, and the scheduled sweeps create their own — none of those writes - // carries a session. - // - // Measured honestly on 17.0.0-rc.2: this flow has NO data node (start → - // notify → end), so the refusal does not reach it today and declaring - // `system` changes nothing observable. Declared for the same reason as - // `contact_welcome` — see the fuller note there: the recorded decision is - // that record-change automation runs as the platform, so a data node added - // later inherits an elevation that was reasoned about rather than one - // discovered as a production refusal. No data operation exists to scope, so - // elevating the user-driven runs costs nothing. - runAs: "system", - variables: [], - nodes: [ - { - id: "start", - type: "start", - label: "Start (task created)", - config: { - objectName: "crm_task", - triggerType: "record-after-create", - // Gate on the `status` enum, not the `is_completed` boolean: on - // SQLite/libsql booleans persist as integer 1, so `is_completed != true` - // is `1 != true` = always true and the guard never trips (cf. the same - // hazard documented in case_escalation). - // TOTALITY: `has(...)` on every read. Both fields are `required` - // AND defaulted today, so this predicate measured total as authored — - // but that is a property of `crm_task`'s schema, not of the predicate. - // Drop either default and the flow goes silently inert on - // driver-memory / driver-mongodb, with nothing to catch it. An absent - // `status` is not `completed`, so it must not suppress the alert. - condition: P37`has(record.priority) && record.priority == "urgent" - && (!has(record.status) || record.status != "completed")` - } - }, - { - id: "notify_owner", - type: "notify", - label: "Notify Owner", - config: { - recipients: [cel18`record.owner_id`], - channels: ["inbox", "email"], - severity: "warning", - topic: "urgent_task", - template: "crm.urgent_task", - templateData: { subject: cel18`record.subject` }, - actionUrl: "/crm_task/{{record.id}}" - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "notify_owner", type: "default" }, - { id: "e2", source: "notify_owner", target: "end", type: "default" } - ] -}; - -// src/sales/flows/task-due-reminder.flow.ts -import { cel as cel19 } from "@objectstack/spec"; -var TaskDueReminderFlow = { - name: "task_due_reminder", - label: "Task Due Reminder", - description: "Hourly sweep: notify owners of tasks whose reminder time has arrived.", - type: "schedule", - status: "active", - // Scheduled runs have no trigger user, so under the default runAs:'user' the - // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that - // RLS-bypassing elevation explicit and intended (ADR-0049). - runAs: "system", - variables: [], - nodes: [ - { - id: "start", - type: "start", - label: "Start (hourly)", - config: { schedule: "0 * * * *" } - }, - { - id: "query_due", - type: "get_record", - label: "Find Tasks Due for Reminder", - config: { - objectName: "crm_task", - // De-dup via `reminder_date` itself: the sweep notifies tasks whose - // reminder time has arrived, then CLEARS reminder_date (see mark_sent), - // so the row no longer matches `$lte` next tick. We do NOT filter on the - // `reminder_sent` boolean here — empirically, a where-clause on that - // (newly added) boolean column returns zero rows at runtime in this - // engine build, while the long-standing `is_completed` boolean works. - // Reusing the verified `$lte` + `is_completed` predicates keeps the - // sweep reliable; `reminder_sent` is still stamped for the audit trail. - filter: { - is_completed: false, - reminder_date: { $lte: cel19`isoDatetime(now())` } - }, - limit: 500, - outputVariable: "reminderList" - } - }, - { - // The loop body MUST be nested in `config.body` — a flat-graph loop - // (body omitted, iterator wired via outer edges) does NOT iterate or bind - // the iterator variable in the runtime (legacy no-op path), so - // `{currentTask.*}` resolves empty. Verified empirically. - id: "loop_tasks", - type: "loop", - label: "For Each Due Task", - config: { - collection: cel19`reminderList`, - iteratorVariable: "currentTask", - body: guarded("task", { - nodes: [ - { - id: "notify_owner", - type: "notify", - label: "Notify Owner", - config: { - recipients: [cel19`has(currentTask.owner_id) ? currentTask.owner_id : null`], - channels: ["inbox", "email"], - severity: "warning", - topic: "task_reminder", - template: "crm.task_reminder", - templateData: { - subject: cel19`currentTask.subject`, - reminder_date: cel19`currentTask.reminder_date` - }, - actionUrl: "/crm_task/{{currentTask.id}}" - } - }, - { - id: "mark_sent", - type: "update_record", - label: "Mark Reminder Sent", - config: { - objectName: "crm_task", - filter: { id: cel19`currentTask.id` }, - // Clearing reminder_date is what de-dups (the row stops matching - // the sweep's `$lte` next tick); reminder_sent is the audit flag. - fields: { reminder_sent: true, reminder_date: null } - } - } - ], - edges: [ - { id: "b1", source: "notify_owner", target: "mark_sent", type: "default" } - ] - }) - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "query_due", type: "default" }, - { id: "e2", source: "query_due", target: "loop_tasks", type: "default" }, - { id: "e3", source: "loop_tasks", target: "end", type: "default" } - ] -}; - -// src/sales/flows/billing-handoff-closed-won.flow.ts -import { P as P38, cel as cel21 } from "@objectstack/spec"; - -// src/sales/flows/_billing-endpoint.ts -import { cel as cel20, expression as expression3 } from "@objectstack/spec"; -var BILLING_HANDOFF_ENDPOINT = process.env.HOTCRM_BILLING_ENDPOINT?.trim() || "https://billing.example.com/hotcrm/events"; -var BILLING_HANDOFF_SIGNING_SECRET = process.env.HOTCRM_BILLING_SIGNING_SECRET?.trim() || void 0; -var BILLING_HANDOFF_TIMEOUT_MS = 3e4; -var BILLING_HANDOFF_EVENT = { - opportunityClosedWon: "crm.opportunity.closed_won", - contractActivated: "crm.contract.activated" -}; -var BILLING_HANDOFF_PAYLOAD_VERSION = 1; -var BILLING_HANDOFF_LINE_ITEM_LIMIT = 200; -var ACCOUNT_FIELDS = [ - "id", - "name", - "account_number", - "billing_address", - "billing_country", - "phone", - "website" -]; -var LINE_ITEM_FIELDS = [ - "id", - "line_number", - "crm_product", - "description", - "quantity", - "list_price", - "unit_price", - "discount", - "total_price" -]; -var accountField = (field) => `has(billingAccount.${field}) ? billingAccount.${field} : null`; -var ACCOUNT_BLOCK = `{'id': billingAccount.id, 'name': billingAccount.name, 'account_number': billingAccount.account_number, 'billing_address': ${accountField("billing_address")}, 'billing_country': ${accountField("billing_country")}, 'phone': ${accountField("phone")}, 'website': ${accountField("website")}}`; -var billingBody = (event, key, fields) => expression3( - `{'event': dyn('${event}'), 'version': dyn(${BILLING_HANDOFF_PAYLOAD_VERSION}), 'occurred_at': dyn(isoDatetime(now())), '${key}': dyn({${fields.map((f) => typeof f === "string" ? [f, f] : f).map(([k, f]) => `'${k}': record.${f}`).join(", ")}}), 'account': dyn(${ACCOUNT_BLOCK}), 'line_items': billingLineItems}` -); -var loadAccountNode = () => ({ - id: "load_account", - type: "get_record", - label: "Load Account", - config: { - objectName: "crm_account", - filter: { id: cel20`record.crm_account` }, - fields: ACCOUNT_FIELDS, - // No `limit`: `get_record` calls `findOne` below 2 and binds the single row - // itself, which is what the account block's `billingAccount.FIELD` reads need. - outputVariable: "billingAccount" - } -}); - -// src/sales/flows/billing-handoff-closed-won.flow.ts -var BillingHandoffClosedWonFlow = { - name: "billing_handoff_closed_won", - label: "Billing Hand-off: Closed Won", - description: "On the transition into closed_won: POST the deal, its account and its line items to the billing endpoint via the durable HTTP outbox.", - type: "record_change", - status: "active", - // A record-change flow fired by a SYSTEM write carries no trigger user - // (ADR-0049), and opportunities reach `closed_won` through - // machinery as well as a rep's own save — `lead_conversion` writes them, and - // the `contract_renewal` sweep is itself `runAs: 'system'`. This flow has two - // data nodes, so under the default `runAs: 'user'` those reads would be - // REFUSED on exactly those runs and the hand-off would vanish silently. The - // hand-off must also see the WHOLE deal, not the slice the closing rep may - // read: an RLS-scoped line-item query that returns three of five rows would - // under-bill the customer without failing anything. - runAs: "system", - variables: [ - // Bound with a default so the payload key always exists. Not strictly - // needed here (this flow always runs the read) — declared for symmetry with - // the contract flow, where the read is conditional, so the two payloads - // cannot drift into different shapes for an empty item list. - { name: "billingLineItems", type: "collection", isInput: false, isOutput: false, defaultValue: [] } - ], - nodes: [ - { - id: "start", - type: "start", - label: "Start (opportunity updated)", - config: { - objectName: "crm_opportunity", - triggerType: "record-after-update", - // TRANSITION, not current value — see the file header. `previous.stage` - // is guarded fail-closed: no visible prior stage means no visible - // transition, so no hand-off. - condition: P38`has(record.stage) && record.stage == "closed_won" - && has(previous.stage) && previous.stage != "closed_won"` - } - }, - loadAccountNode(), - { - id: "load_line_items", - type: "get_record", - label: "Load Line Items", - config: { - objectName: "crm_opportunity_line_item", - filter: { crm_opportunity: cel21`record.id` }, - fields: LINE_ITEM_FIELDS, - // > 1 is what makes `get_record` issue a `find` and bind an ARRAY; - // omit it and the node calls `findOne` and binds a single row. - limit: BILLING_HANDOFF_LINE_ITEM_LIMIT, - outputVariable: "billingLineItems" - } - }, - { - // The node id becomes the delivery's `X-Objectstack-Event` header - // (`flow:`), so it is named for the event and not for the verb. - id: "send_closed_won_handoff", - type: "http", - label: "Enqueue Billing Hand-off", - config: { - url: BILLING_HANDOFF_ENDPOINT, - method: "POST", - // The whole point of this route: enqueue on `sys_http_delivery` rather - // than call inline, so a receiver that is down gets the delivery when - // it comes back instead of losing it. - durable: true, - timeoutMs: BILLING_HANDOFF_TIMEOUT_MS, - signingSecret: BILLING_HANDOFF_SIGNING_SECRET, - // One envelope building the whole payload (see `billingBody`). Each - // read is the value itself, never its stringification, so the amount - // stays a number and the line items an array. - body: billingBody(BILLING_HANDOFF_EVENT.opportunityClosedWon, "opportunity", [ - "id", - "name", - "amount", - "close_date", - "stage", - "type", - ["account_id", "crm_account"], - "owner_id" - ]) - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "load_account", type: "default" }, - { id: "e2", source: "load_account", target: "load_line_items", type: "default" }, - { id: "e3", source: "load_line_items", target: "send_closed_won_handoff", type: "default" }, - { id: "e4", source: "send_closed_won_handoff", target: "end", type: "default" } - ] -}; - -// src/revenue/flows/quote-generation.flow.ts -import { P as P39, expression as expression4, cel as cel22 } from "@objectstack/spec"; -var DISCOUNT = "(!has(vars.discount) || isBlank(vars.discount) ? 0.0 : double(vars.discount))"; -var ADVANCE = `has(vars.oppRecord) && has(vars.oppRecord.stage) - && (vars.oppRecord.stage == "prospecting" || vars.oppRecord.stage == "qualification" || vars.oppRecord.stage == "needs_analysis") - && (!has(vars.oppRecord.approval_status) || vars.oppRecord.approval_status != "pending")`; -var QuoteGenerationFlow = { - name: "quote_generation", - label: "Generate Quote from Opportunity", - description: "Create a quote based on opportunity details", - type: "screen", - status: "active", - variables: [ - // MUST be `recordId` — the console's flow-action trigger contract seeds - // only that name ({ recordId, objectName }); a custom name like - // `opportunityId` arrives undefined. - { name: "recordId", type: "text", isInput: true, isOutput: false }, - { name: "quoteName", type: "text", isInput: true, isOutput: false }, - { name: "expirationDays", type: "number", isInput: true, isOutput: false }, - { name: "discount", type: "number", isInput: true, isOutput: false } - ], - nodes: [ - { id: "start", type: "start", label: "Start", config: { objectName: "crm_opportunity" } }, - // ─── The 立项 (qualification) gate, REQ-0006 step 11 (#2032) ───────── - // - // 「新增商机可跟进,立项通过后方可更新阶段、投标、赢丢单操作。」 Ruled (hotcrm-R74b - // item 2, B): before 立项 is approved, Generate Quote REFUSES and creates - // nothing. Steps 15 and 18 put quoting after the deal's approval too. - // - // Why the refusal is HERE, ahead of the form and of every writer: this - // flow writes the quote BEFORE the stage, and a flow carries no - // transaction (ADR-0077). With the gate armed, `opportunity_lifecycle` - // refuses the `update_opportunity` stage write — so the run used to fail - // AFTER `create_quote` had landed: measured on 17.7.0 as a sales_rep, - // `FLOW_FAILED` 400 at `update_opportunity` ("This deal needs - // qualification approval first …"), one draft quote left behind, the - // stage unchanged. ⛔ Not #2015's keep-stage-and-quote: that lock does - // not hold quoting, this gate does. - // - // The flow is the one choke point every door reaches — the record-header - // and list-row buttons and `POST /automation/quote_generation/trigger` — - // so the refusal lives here and `generate_quote` stays visible: hiding - // it would leave the rep a missing button with no reason, because an - // action's `visible` / `disabled` are bare predicates with nowhere to - // put a sentence. - // - // The FILTER is the gate's reading, the one `opportunity_lifecycle` - // applies: `pending` or `rejected` holds the deal (an approver's "no" is - // not a release), every other value — the shipped `not_required`, - // `approved`, none at all — does not. So `held` binds the deal only while - // it is held, and `null` otherwise; `test/flow-quote.test.ts` pins that - // the two answer alike, verdict by verdict. - // - // A read of its own, at click time. ⛔ Do not fold it into - // `get_opportunity`: that read stays AFTER the screen so the pricing and - // the #2015 approval branch (`e4a` / `e4b`) see the deal as it is at - // submit. The verdict cannot drift toward held while the form is open: - // `not_required` and `approved` are never written back to `pending`. - { id: "get_held", type: "get_record", label: "Get Held Deal", config: { objectName: "crm_opportunity", filter: { id: cel22`recordId`, qualification_approval_status: { $in: ["pending", "rejected"] } }, outputVariable: "held" } }, - // A first-class refusal (`EndConfigSchema` `outcome: 'refused'`): the run - // ends `refused`, never `failed` and never parked, nothing is written, - // and the console shows the message with Close only — no Submit and no - // "completed" toast, which is what a message-only screen would give. It - // names the next step the `opportunity_lifecycle` refusal of this gate - // names. - // - // Translated: since 18.0.0-next.0 the `flows` translation group keys an - // `end` node's refusal as `refusals.refuse_held.message`, which the - // engine renders in the run's locale (at 17.7.0 it had no such key, the - // gap raised from #2032). The console titles the dialog with the action's - // translated label. ⛔ Do not re-route the refusal through a screen to - // borrow a translatable title. - { id: "refuse_held", type: "end", label: "Quote Refused", config: { outcome: "refused", message: "Qualification approval comes first: tick Request Qualification Approval. Nothing was created." } }, - { - id: "screen_1", - type: "screen", - label: "Quote Details", - config: { - fields: [ - { name: "quoteName", label: "Quote Name", type: "text", required: true }, - { name: "expirationDays", label: "Valid For (Days)", type: "number", required: true, defaultValue: 30 }, - // The ceiling is a HARD block with no override - // (`crm_quote.discount_within_ceiling`), so until it is written here - // a rep meets the number only by having the quote refused. Both - // strings below interpolate `QUOTE_DISCOUNT_CEILING` — imported, - // never retyped, the same rule the two object rules follow — so the - // hint cannot drift from the rule it describes. - // - // ⛔ There is deliberately NO `max`, and adding one does not work: - // `ScreenFieldConfigSchema` is STRICT at 17.3.0 and its entire key - // set is `name` / `label` / `type` / `required` / `options` / - // `defaultValue` / `placeholder` / `visibleWhen`. `max` is rejected - // BY NAME (`Unrecognized key(s) on this screen field: max`), so - // it fails `pnpm validate` rather than quietly doing nothing, and - // the executor forwards no such key into the `ScreenSpec` the client - // renders. `helpText` is rejected the same way — the console's - // dialog would render one, but no flow screen can carry it there. - // - // That leaves two carriers, and the label is the load-bearing one: - // `placeholder` renders only while the input is empty and - // `defaultValue: 0` seeds it, so it surfaces for the moment the rep - // clears the box to type — real, but not enough on its own. - { - name: "discount", - label: `Discount % (\u2264 ${QUOTE_DISCOUNT_CEILING})`, - type: "percent", - defaultValue: 0, - placeholder: `0-${QUOTE_DISCOUNT_CEILING}` - } - ] - } - }, - { - id: "get_opportunity", - type: "get_record", - label: "Get Opportunity", - config: { objectName: "crm_opportunity", filter: { id: cel22`recordId` }, outputVariable: "oppRecord" } - }, - { - id: "create_quote", - type: "create_record", - label: "Create Quote", - config: { - objectName: "crm_quote", - fields: { - name: cel22`quoteName`, - crm_opportunity: cel22`recordId`, - crm_account: cel22`oppRecord.crm_account`, - crm_contact: cel22`has(oppRecord.primary_contact) ? oppRecord.primary_contact : null`, - owner_id: cel22`current_user.id`, - status: "draft", - quote_date: cel22`isoDate(today())`, - expiration_date: cel22`isoDate(addDays(today(), expirationDays))`, - // `subtotal` is a bare path pass-through and needs no rounding: it - // copies `crm_opportunity.amount` as stored and does no arithmetic, - // so it adds no floating-point tail of its own. - // `discount` is an optional screen answer: a resume may leave it - // unbound, which the template wrote as nothing and the guard writes - // as null (the quote field has no default, so the two agree). - subtotal: cel22`oppRecord.amount`, - discount: cel22`has(vars.discount) ? discount : null`, - // ⛔ A currency × percentage MUST be rounded to whole cents inside the - // expression — the flow hands the engine a money amount, never an - // unrounded double. `discount / 100` is inexact for every percentage - // whose hundredth is not a dyadic rational, so a BARE product carries - // a tail: 180,000 at 30% is 125999.99999999999. While these fields - // declared `scale: 2` the insert was rejected for it (`Total Price - // must have at most 2 decimal places (got 11)`, #1206). Currency - // fields no longer declare `scale` — the platform refuses it, a - // currency's decimals are its ISO 4217 minor unit (#1965) — so the - // write is now ACCEPTED and the tail would be stored silently. The - // rounding keeps `discount_amount` / `total_price` whole-cent amounts. - // - // Both are CEL value envelopes. CEL's `round()` is INTEGER-ONLY and - // single-argument, and it returns an INT — so the divisor MUST be - // the decimal `100.0`. ⛔ Never `/ 100`: in CEL int / int is integer - // division, which silently drops the cents (1,234.56 at 10% would - // store 123, not 123.46; `test/flow-quote.test.ts` pins it). ⛔ Not - // `round(x, 2)` either: there is no precision form, and it fails - // loudly. `double()` types the amount, which some drivers return as - // a string. A cleared discount (null / absent / "") prices as 0%, as - // it did before; the `has()` guard is what keeps that TOTAL. - // - // ⭐ This shape applies ANYWHERE a flow multiplies a currency by a - // percentage. Write the rounding, not the bare product. - discount_amount: expression4(`round(double(oppRecord.amount) * (${DISCOUNT} / 100.0) * 100.0) / 100.0`, "cel"), - total_price: expression4(`round(double(oppRecord.amount) * (1.0 - ${DISCOUNT} / 100.0) * 100.0) / 100.0`, "cel"), - payment_terms: "net_30" - }, - outputVariable: "quoteId" - } - }, - { - // Advance to `proposal` only from a PRE-proposal stage (the state machine - // allows `→ proposal` from all three). ⛔ Never re-write `proposal` on a - // deal already at proposal/negotiation: that is an illegal self/backward - // transition. Those deals keep their stage; the quote is still created. - // - // ⛔ Nor on a deal AWAITING APPROVAL (`approval_status == "pending"`). A - // deal of `LARGE_DEAL_AMOUNT` or more is held by `opportunity_approval`'s - // approval node (`lockRecord: true`) until a manager decides, and the - // lock refuses this run's stage write — the run is the rep's - // (`runAs: 'user'`), and the lock is the approval working as intended. - // `create_quote` has already landed by then and a flow carries no - // transaction (ADR-0077), so the refusal used to fail the run AFTER the - // quote existed: measured on 17.7.0, `FLOW_FAILED` 400 `RECORD_LOCKED` - // at `update_opportunity`, the rep told the quote failed, and the draft - // quote left standing (#2015). A deal under review keeps its stage - // exactly like a deal already at proposal; the quote is still created — - // the button is offered at every open stage, and a draft quote commits - // nothing the approval is there to hold. `approval_status` is the lock's - // own mirror (`approvalStatusField`): the approvals plugin stamps - // `pending` when it opens the locking request and a terminal verdict - // when it releases it. - // - // The predicate itself lives on edges `e4a` / `e4b` — a `decision` node's - // singular `config.condition` is never evaluated, so a copy here would be - // inert (17.0.0-rc.2's `flow-inert-node-condition`). The totality - // rationale is on those edges, where the guards are. - id: "check_stage", - type: "decision", - label: "Can Advance to Proposal?" - }, - { - id: "update_opportunity", - type: "update_record", - label: "Update Opportunity", - config: { - // ⛔ No `last_activity_date` write: `crm_opportunity` has no such field - // (it lives on `crm_account`), and an unknown column fails this node. - objectName: "crm_opportunity", - filter: { id: cel22`recordId` }, - fields: { stage: "proposal" } - } - }, - { - // ADR-0012: deliver via the `notify` node (inbox + email). The legacy - // `script` + `actionType:'email'` shape is a no-op stub in 7.4. - id: "notify_owner", - type: "notify", - label: "Send Notification", - config: { - recipients: [cel22`current_user.id`], - channels: ["inbox", "email"], - topic: "quote_created", - template: "crm.quote_created", - templateData: { quote_name: cel22`quoteName` }, - actionUrl: "/crm_quote/{{quoteId.id}}" - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - // ⛔ A retired edge's id stays VACANT: `e1` (start → screen_1) is one. - // Every surviving edge keeps its id, and a new one takes the next id after - // the highest in use — a duplicate id is inert, so nothing would flag it. - { id: "e7", source: "start", target: "get_held", type: "default" }, - // ── The 立项 gate (#2032) ────────────────────────────────────────── - // - // COMPLEMENTARY CONDITIONALS off a plain data node, not a `decision` — the - // shape `billing-handoff-contract-activated.flow.ts` records: they are - // evaluated one by one, and `!= null` / `== null` partition exactly. - // `get_held` dominates both and binds `held` on every path — the row, or - // `null` on a miss — so neither read takes a `has()` guard: the - // get_record-dominated case `test/flow-variable-conditions.test.ts` - // records as needing none, written like `lead_conversion`'s `e5` / `e6`. - // Fail-OPEN like the hook: a deal the read cannot see goes on to the form - // and fails at `create_quote` exactly as it always did. - { id: "e9", source: "get_held", target: "refuse_held", type: "default", condition: P39`vars.held != null`, label: "Held" }, - { id: "e10", source: "get_held", target: "screen_1", type: "default", condition: P39`vars.held == null`, label: "Not held" }, - { id: "e2", source: "screen_1", target: "get_opportunity", type: "default" }, - { id: "e3", source: "get_opportunity", target: "create_quote", type: "default" }, - { id: "e4", source: "create_quote", target: "check_stage", type: "default" }, - // The two branches must PARTITION, so the keep side is the advance side - // negated whole (`ADVANCE` above): `has(…) && …` advances and everything - // else keeps. An unknown stage therefore lands on "keep stage" — the quote - // is still created and nothing illegal is written to the state machine. - // These EDGES are the live sites; `check_stage` carries no - // `config.condition` at all, because the engine never evaluates one. - // - // TOTALITY: `oppRecord` is a `get_record` OUTPUT — `findOne` answers - // a miss with `null`, and reading a field off it then aborts with `No such - // key: stage`. Measured unreachable TODAY only because two neighbouring - // schemas happen to close it: `crm_opportunity.stage` is `required` (never - // a sparse column) and `crm_quote.crm_account` is `required`, so a null - // `oppRecord` makes `create_quote` fail one node earlier. Both are one - // `required: false` away from re-opening it, so the predicate carries its - // own guard — and from 17.0.0-rc.2 an unevaluable condition aborts the step - // instead of skipping it, so the guard is load-bearing, not - // decorative. Note the scope is `vars.oppRecord`, not bare `oppRecord`: - // measured, `has(oppRecord.stage)` still aborts with `Unknown variable: - // oppRecord` when the variable is unbound, while `has(vars.oppRecord)` - // answers `false` — only the `vars.`-scoped form is total against both - // hazards. - // - // The approval term (see `check_stage`) is guarded the same way: an absent - // or null `approval_status` is "not under approval" and advances, as it - // did before the term existed. - { id: "e4a", source: "check_stage", target: "update_opportunity", type: "conditional", condition: expression4(ADVANCE, "cel"), label: "Advance" }, - { id: "e4b", source: "check_stage", target: "notify_owner", type: "conditional", condition: expression4(`!(${ADVANCE})`, "cel"), label: "Keep stage" }, - { id: "e5", source: "update_opportunity", target: "notify_owner", type: "default" }, - { id: "e6", source: "notify_owner", target: "end", type: "default" } - ] -}; - -// src/revenue/flows/contract-renewal.flow.ts -import { P as P40, cel as cel23 } from "@objectstack/spec"; -var ContractRenewalFlow = { - name: "contract_renewal", - label: "Contract Renewal Reminder", - description: "Daily sweep: open renewal tasks/opportunities for contracts nearing end_date.", - type: "schedule", - status: "active", - // Scheduled runs have no trigger user, so under the default runAs:'user' the - // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that - // RLS-bypassing elevation explicit and intended (ADR-0049). - runAs: "system", - variables: [], - nodes: [ - { id: "start", type: "start", label: "Start (daily 08:00)", config: { schedule: "0 8 * * *" } }, - { - // Broad pre-filter (next 120 days — ⛔ must cover the LARGEST - // renewal_notice_days in use; seeds go up to 90). The per-record notice - // window is applied in the decision node below so each contract honours - // its own renewal_notice_days. A pre-filter narrower than the largest - // notice period silently truncates it: a 90-day contract stays invisible - // until 60 days out. - id: "query_contracts", - type: "get_record", - label: "Find Expiring Contracts", - config: { - objectName: "crm_contract", - filter: { status: "activated", end_date: { $gte: cel23`isoDate(today())`, $lte: cel23`isoDate(daysFromNow(120))` } }, - limit: 500, - outputVariable: "contractList" - } - }, - { - id: "loop_contracts", - type: "loop", - label: "For Each Contract", - config: { - collection: cel23`contractList`, - iteratorVariable: "currentContract", - body: guarded("contract", { - nodes: [ - { - // Gateway only — the predicate lives on the out-edge. - id: "check_notice_window", - type: "decision", - label: "Within Notice Window?" - }, - { - // Idempotency gate: the sweep matches the same contract every day - // of its notice window, so ⛔ without it every day produces a - // duplicate task + notification (and, below, a duplicate - // pipeline-inflating renewal opportunity). An open renewal task - // for this contract means this window was already handled. - id: "find_existing_task", - type: "get_record", - label: "Already Reminded?", - config: { - objectName: "crm_task", - filter: { - related_to_account: cel23`currentContract.crm_account`, - subject: cel23`'Renewal due: contract ' + currentContract.contract_number`, - status: { $nin: ["completed"] } - }, - outputVariable: "existingRenewalTask" - } - }, - { - // Gateway only — the predicate lives on the out-edge. - id: "check_not_reminded", - type: "decision", - label: "First Reminder?" - }, - { - id: "create_renewal_task", - type: "create_record", - label: "Create Renewal Task", - config: { - objectName: "crm_task", - fields: { - subject: cel23`'Renewal due: contract ' + currentContract.contract_number`, - type: "follow_up", - priority: "high", - status: "not_started", - due_date: cel23`currentContract.end_date`, - owner_id: cel23`has(currentContract.owner_id) ? currentContract.owner_id : null`, - // ORG PARTITION. A schedule trigger carries no - // organization, so the engine has nothing to fill this from - // and the row would be born `organization_id` NULL — outside - // every org partition, where an `(organization_id, …)` unique - // index does not constrain and org-scoped reads never see it. - // Upstream ruling objectstack#6155 Q2=A puts the answer here, - // with the flow author: a renewal task belongs to the org of - // the contract that spawned it. Fill-only precedence means an - // author-set value wins over the engine (objectstack#6153). - // The source MUST be a row that actually carries the column. - // On 17.x an absent key interpolated to `undefined` and landed - // as NULL, which satisfied the publish guard while reproducing - // the bug; the CEL read below fails the iteration instead, and - // it is deliberately left UNGUARDED — a `has()` guard would - // write that NULL back. `crm_contract` carries it; `sys_user` - // does not. - organization_id: cel23`currentContract.organization_id`, - related_to_type: "crm_account", - related_to_account: cel23`currentContract.crm_account` - } - } - }, - { - id: "notify_owner", - type: "notify", - label: "Notify Owner", - config: { - recipients: [cel23`has(currentContract.owner_id) ? currentContract.owner_id : null`], - channels: ["inbox", "email"], - topic: "contract_renewal", - template: "crm.contract_renewal", - templateData: { - contract_number: cel23`currentContract.contract_number`, - end_date: cel23`currentContract.end_date` - }, - actionUrl: "/crm_contract/{{currentContract.id}}" - } - }, - { - // Gateway only — the predicate lives on the out-edge. - id: "check_auto_renewal", - type: "decision", - label: "Auto-Renewal On?" - }, - { - // Second gate: never open a second renewal opportunity while one - // is still in flight for this account (belt-and-braces for the - // case where the task was completed but the deal is still open). - id: "find_existing_renewal_opp", - type: "get_record", - label: "Open Renewal Deal Exists?", - config: { - objectName: "crm_opportunity", - filter: { - crm_account: cel23`currentContract.crm_account`, - type: "existing_renewal", - stage: { $nin: ["closed_won", "closed_lost"] } - }, - outputVariable: "existingRenewalOpp" - } - }, - { - // Gateway only — the predicate lives on the out-edge. - id: "check_no_open_renewal", - type: "decision", - label: "No Open Renewal Deal?" - }, - { - id: "create_renewal_opp", - type: "create_record", - label: "Open Renewal Opportunity", - config: { - objectName: "crm_opportunity", - fields: { - name: cel23`'Renewal — ' + currentContract.contract_number`, - crm_account: cel23`currentContract.crm_account`, - amount: cel23`currentContract.contract_value`, - stage: "proposal", - type: "existing_renewal", - close_date: cel23`currentContract.end_date`, - owner_id: cel23`has(currentContract.owner_id) ? currentContract.owner_id : null`, - // ORG PARTITION — see `create_renewal_task` above. - // The renewal deal belongs to the same org as the contract. - organization_id: cel23`currentContract.organization_id`, - next_step: "Confirm renewal terms with customer" - } - } - } - ], - edges: [ - // Only act when inside the per-contract notice window; gates with - // no matching edge simply end the iteration, so the loop moves on. - // - // The EDGE is the ONLY site: a `decision` node's singular - // `config.condition` is never read — the executor reads the plural - // `config.conditions[]` and nothing else — so a copy on the node - // would be inert metadata that drifts silently. `check_notice_window` - // is therefore a bare gateway and this predicate is authored once. - // - // `end_date` is a DATE field and arrives as `YYYY-MM-DD`, but CEL's - // `timestamp()` only accepts a full ISO 8601 datetime and throws - // otherwise ("timestamp() requires a string in ISO 8601 format"). - // Appending the time part is what makes this evaluate instead of - // blowing up mid-sweep. - // - // TOTALITY: `currentContract` is a LOOP ITEM over - // `contractList`, which `get_record` filled from `data.find` — - // every element is a raw driver row, sparse in exactly the way - // a raw driver row is. `end_date` is `required` on `crm_contract` so - // that column is always written, but `renewal_notice_days` - // (`defaultValue: 30`) and `auto_renewal` (`defaultValue: false`) - // are only DEFAULTED, and a row written before the default existed - // carries neither the column nor a value. Both operands - // additionally need `!= null`, because the abort here is not the - // usual overload error: `null + "T00:00:00Z"` and `int(null)` each - // blow up inside the function call, one contract into a 500-row - // sweep, taking the whole scheduled run with them. - { id: "b1", source: "check_notice_window", target: "find_existing_task", type: "conditional", condition: P40`has(vars.currentContract) && has(vars.currentContract.end_date) && has(vars.currentContract.renewal_notice_days) - && vars.currentContract.end_date != null && vars.currentContract.renewal_notice_days != null - && timestamp(vars.currentContract.end_date + "T00:00:00Z") <= daysFromNow(int(vars.currentContract.renewal_notice_days))`, label: "In window" }, - { id: "b2", source: "find_existing_task", target: "check_not_reminded", type: "default" }, - { id: "b3", source: "check_not_reminded", target: "create_renewal_task", type: "conditional", condition: P40`existingRenewalTask == null`, label: "First reminder" }, - { id: "b4", source: "create_renewal_task", target: "notify_owner", type: "default" }, - { id: "b5", source: "notify_owner", target: "check_auto_renewal", type: "default" }, - // TOTALITY: same loop item, same sparse driver row. Only an - // explicit `true` opens a renewal deal, so an absent column reads - // as "auto-renewal off" — the conservative branch. - { id: "b6", source: "check_auto_renewal", target: "find_existing_renewal_opp", type: "conditional", condition: P40`has(vars.currentContract) && has(vars.currentContract.auto_renewal) - && vars.currentContract.auto_renewal == true`, label: "Auto-renew" }, - { id: "b7", source: "find_existing_renewal_opp", target: "check_no_open_renewal", type: "default" }, - { id: "b8", source: "check_no_open_renewal", target: "create_renewal_opp", type: "conditional", condition: P40`existingRenewalOpp == null`, label: "Open renewal deal" } - ] - }) - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "query_contracts", type: "default" }, - { id: "e2", source: "query_contracts", target: "loop_contracts", type: "default" }, - { id: "e3", source: "loop_contracts", target: "end", type: "default" } - ] -}; - -// src/revenue/flows/quote-expiration.flow.ts -import { cel as cel24 } from "@objectstack/spec"; -var QuoteExpirationFlow = { - name: "quote_expiration", - label: "Quote Auto-Expiration", - description: "Daily: expire quotes past their expiration_date that are still open.", - type: "schedule", - status: "active", - // Scheduled runs have no trigger user, so under the default runAs:'user' the - // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that - // RLS-bypassing elevation explicit and intended (ADR-0049). - runAs: "system", - variables: [], - nodes: [ - { id: "start", type: "start", label: "Start (daily 01:00)", config: { schedule: "0 1 * * *" } }, - { - id: "query_quotes", - type: "get_record", - label: "Find Expired Quotes", - config: { - objectName: "crm_quote", - filter: { status: { $nin: ["accepted", "rejected", "expired"] }, expiration_date: { $lt: cel24`isoDate(today())` } }, - limit: 500, - outputVariable: "quoteList" - } - }, - { - id: "loop_quotes", - type: "loop", - label: "For Each Quote", - config: { - collection: cel24`quoteList`, - iteratorVariable: "currentQuote", - body: guarded("quote", { - nodes: [ - { - id: "mark_expired", - type: "update_record", - label: "Mark Expired", - config: { objectName: "crm_quote", filter: { id: cel24`currentQuote.id` }, fields: { status: "expired" } } - } - ], - edges: [] - }) - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "query_quotes", type: "default" }, - { id: "e2", source: "query_quotes", target: "loop_quotes", type: "default" }, - { id: "e3", source: "loop_quotes", target: "end", type: "default" } - ] -}; - -// src/revenue/flows/contract-expiration.flow.ts -import { cel as cel25 } from "@objectstack/spec"; -var ContractExpirationFlow = { - name: "contract_expiration", - label: "Contract Auto-Expiration", - description: "Daily: expire activated contracts past their end_date and notify the owner.", - type: "schedule", - status: "active", - // Scheduled runs have no trigger user, so under the default runAs:'user' the - // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that - // RLS-bypassing elevation explicit and intended (ADR-0049). - runAs: "system", - variables: [], - nodes: [ - { id: "start", type: "start", label: "Start (daily 00:00)", config: { schedule: "0 0 * * *" } }, - { - id: "query_contracts", - type: "get_record", - label: "Find Expired Contracts", - config: { - objectName: "crm_contract", - filter: { status: "activated", end_date: { $lt: cel25`isoDate(today())` } }, - limit: 500, - outputVariable: "contractList" - } - }, - { - id: "loop_contracts", - type: "loop", - label: "For Each Contract", - config: { - collection: cel25`contractList`, - iteratorVariable: "currentContract", - body: guarded("contract", { - nodes: [ - { - id: "mark_expired", - type: "update_record", - label: "Mark Expired", - config: { objectName: "crm_contract", filter: { id: cel25`currentContract.id` }, fields: { status: "expired" } } - }, - { - id: "notify_owner", - type: "notify", - label: "Notify Owner", - config: { - recipients: [cel25`has(currentContract.owner_id) ? currentContract.owner_id : null`], - channels: ["inbox", "email"], - topic: "contract_expired", - template: "crm.contract_expired", - templateData: { contract_number: cel25`currentContract.contract_number` }, - actionUrl: "/crm_contract/{{currentContract.id}}" - } - } - ], - edges: [ - { id: "b1", source: "mark_expired", target: "notify_owner", type: "default" } - ] - }) - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "query_contracts", type: "default" }, - { id: "e2", source: "query_contracts", target: "loop_contracts", type: "default" }, - { id: "e3", source: "loop_contracts", target: "end", type: "default" } - ] -}; - -// src/revenue/flows/billing-handoff-contract-activated.flow.ts -import { P as P41, cel as cel26 } from "@objectstack/spec"; -var BillingHandoffContractActivatedFlow = { - name: "billing_handoff_contract_activated", - label: "Billing Hand-off: Contract Activated", - description: "On the transition into activated: POST the contract, its account and the originating deal\u2019s line items to the billing endpoint via the durable HTTP outbox.", - type: "record_change", - status: "active", - // Contracts are activated by machinery as well as by hand — `contract.hook.ts` - // stamps the account promotion and signed date on that same transition, and - // the renewal sweep runs `runAs: 'system'`. A system write carries no trigger - // user, so under the default `runAs: 'user'` this flow's two reads would be - // refused on exactly those runs and the hand-off would disappear without a - // failed step. Elevation also guarantees the payload is the whole contract, - // not an RLS-narrowed view of it. - runAs: "system", - variables: [ - // Bound with a default because the line-item read below is CONDITIONAL: a - // contract need not have an originating opportunity. Without the default, - // the skipped path leaves `billingLineItems` unbound and the payload key - // vanishes — so a receiver could not tell "no items" from "not sent". - { name: "billingLineItems", type: "collection", isInput: false, isOutput: false, defaultValue: [] } - ], - nodes: [ - { - id: "start", - type: "start", - label: "Start (contract updated)", - config: { - objectName: "crm_contract", - triggerType: "record-after-update", - condition: P41`has(record.status) && record.status == "activated" - && has(previous.status) && previous.status != "activated"` - } - }, - loadAccountNode(), - { - id: "load_line_items", - type: "get_record", - label: "Load Originating Deal\u2019s Line Items", - config: { - objectName: "crm_opportunity_line_item", - // Contracts carry no line items of their own; what was sold sits on the - // opportunity the contract came from. Reached only via the guarded edge - // below, because `crm_opportunity` is OPTIONAL on a contract and a - // filter operand that evaluates to null makes `get_record` refuse the - // step (an absent condition widens a query rather than narrowing it). - filter: { crm_opportunity: cel26`record.crm_opportunity` }, - fields: LINE_ITEM_FIELDS, - limit: BILLING_HANDOFF_LINE_ITEM_LIMIT, - outputVariable: "billingLineItems" - } - }, - { - id: "send_contract_activated_handoff", - type: "http", - label: "Enqueue Billing Hand-off", - config: { - url: BILLING_HANDOFF_ENDPOINT, - method: "POST", - durable: true, - timeoutMs: BILLING_HANDOFF_TIMEOUT_MS, - signingSecret: BILLING_HANDOFF_SIGNING_SECRET, - // One envelope building the whole payload (see `billingBody`). This - // flow is the consumer of `billing_frequency` and `payment_terms`: they - // are what the billing system needs to raise the schedule HotCRM - // deliberately does not model. - body: billingBody(BILLING_HANDOFF_EVENT.contractActivated, "contract", [ - "id", - "contract_number", - "status", - "contract_type", - "start_date", - "end_date", - "contract_term_months", - "contract_value", - "billing_frequency", - "payment_terms", - "auto_renewal", - "signed_date", - ["account_id", "crm_account"], - ["opportunity_id", "crm_opportunity"], - "owner_id" - ]) - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "load_account", type: "default" }, - // The two edges below are COMPLEMENTARY CONDITIONALS on a plain data node, - // deliberately not a `decision` gateway. A decision with no declared - // `config.conditions` reports the engine's `default` branch label, and - // traversal then narrows the edge set to out-edges claiming that label — - // an `isDefault: true` sibling would swallow the whole branch and the - // conditional edge would never be evaluated. Complementary conditions off a - // non-branching node are evaluated one by one, which is the behaviour this - // needs. - { - id: "e2", - source: "load_account", - target: "load_line_items", - type: "conditional", - label: "Has originating deal", - condition: P41`has(record.crm_opportunity) && record.crm_opportunity != null` - }, - { - id: "e3", - source: "load_account", - target: "send_contract_activated_handoff", - type: "conditional", - label: "No originating deal", - condition: P41`!has(record.crm_opportunity) || record.crm_opportunity == null` - }, - { id: "e4", source: "load_line_items", target: "send_contract_activated_handoff", type: "default" }, - { id: "e5", source: "send_contract_activated_handoff", target: "end", type: "default" } - ] -}; - -// src/marketing/flows/campaign-enrollment.flow.ts -import { P as P42, cel as cel27 } from "@objectstack/spec"; -var CampaignEnrollmentFlow = { - name: "campaign_enrollment", - label: "Enroll Members in Campaign", - description: "Bulk enroll eligible leads or contacts into this campaign (skips already-enrolled and opted-out people).", - type: "screen", - status: "active", - variables: [ - // `recordId` matches the console's flow-action trigger contract - // ({ recordId, objectName }) — cf. lead_conversion / quote_generation. - { name: "recordId", type: "text", isInput: true, isOutput: false }, - /** - * `memberSource` is BOUND BY THIS DECLARATION — not by a seeding node. - * - * Both branch edges (`e4` / `e7`) read `vars.memberSource`, so it must be - * bound on every path reaching them. `FlowVariableSchema` carries - * `defaultValue` and the engine seeds it before the start node runs, so this - * key alone binds the name — while a caller-supplied - * `context.params.memberSource` still WINS over it. - * - * ⚠️ Measured on the 17.1.0 spec, with the schema key re-checked on 17.2.0. - * Neither that key nor the seeding behaviour was re-checked on 17.3.0 or - * 17.4.0 (PR #1814, #1807), nor on 17.5.0, 17.6.0, 17.7.0 or 18.0.0-next.0 (the pin since #2031). - * - * ⛔ Never seed this with an assignment node instead. An assignment is - * unconditional, so it CLOBBERS a supplied param — measured: launching with - * `params.memberSource = 'contacts'` ran the LEAD branch. It also restates a - * default the screen field carries, with nothing keeping the two in step. - * - * A second, independent reason no seeding node is needed here: the - * `memberSource` screen field below is `required: true`, and since - * 17.0.0-rc.2 the SERVER holds a screen resume to the declared field - * contract. A resume signal omitting `memberSource` is refused with - * `INVALID_SCREEN_INPUT` and the run stays paused, so the ordinary resume - * path cannot reach an unbound read at all — unlike `lead_conversion`'s - * checkbox, which is deliberately not `required` and therefore has an - * unanswered state. The one path that skips that check is a resume carrying - * NO signal object; measured on 17.x, it fails one node later at - * `query_leads` regardless of this binding, because `leadStatus` is unbound - * and the query never runs widened. Since 18.0.0-next.0 the filter operand - * is a CEL envelope, and an unbound variable fails the run before the query - * (the platform's `flow-value-slot-template-dialect-refused` contract; not - * re-measured here). - * - * The literal lives HERE and nowhere else: the screen field derives its - * prefill from this variable (its `defaultValue` envelope reads `memberSource`). - */ - { name: "memberSource", type: "text", isInput: true, isOutput: false, defaultValue: "leads" }, - /** - * `leadStatus` / `contactDepartment` deliberately carry NO `defaultValue`, - * and the asymmetry with `memberSource` is the point. No condition in this - * flow reads either one — each is a `get_record` `filter` operand — so the - * binding analysis in `test/flow-variable-conditions.test.ts` does not - * cover them. An unbound one fails the run before the query is made (the - * 18.0.0-next.0 filter-operand contract), because an absent condition - * widens a query instead of narrowing it. Seeding these two would turn that - * loud failure into a silent enrolment of a segment nobody chose; their - * `required: true` screen fields are what supply them. - */ - { name: "leadStatus", type: "text", isInput: true, isOutput: false }, - { name: "contactDepartment", type: "text", isInput: true, isOutput: false } - ], - nodes: [ - { id: "start", type: "start", label: "Start", config: { objectName: "crm_campaign" } }, - { - id: "screen_1", - type: "screen", - label: "Enrollment Criteria", - config: { - fields: [ - { - // Prefill DERIVED from the variable, so the default is written - // once (on the declaration) rather than restated here — the - // single-authority form. The envelope is evaluated before the - // screen goes on the wire, so the client receives the raw value, - // the string `leads`, which is what a literal - // `defaultValue: 'leads'` used to send. - name: "memberSource", - label: "Enroll", - type: "select", - required: true, - defaultValue: cel27`memberSource`, - options: [ - { label: "Leads", value: "leads" }, - { label: "Contacts", value: "contacts" } - ] - }, - { - name: "leadStatus", - label: "Enroll leads in status", - type: "select", - required: true, - defaultValue: "new", - options: [ - { label: "New", value: "new" }, - { label: "Contacted", value: "contacted" }, - { label: "Qualified", value: "qualified" } - ] - }, - { - // Required, like `leadStatus`, and for the same reason: a blank - // segment would reach the filter as an empty string and - // silently match the contacts with NO department rather than all of - // them. Both branches make the caller name a segment. - name: "contactDepartment", - label: "Enroll contacts in department", - type: "select", - required: true, - defaultValue: "executive", - options: [ - { label: "Executive", value: "executive" }, - { label: "Sales", value: "sales" }, - { label: "Marketing", value: "marketing" }, - { label: "Engineering", value: "engineering" }, - { label: "Support", value: "support" }, - { label: "Finance", value: "finance" }, - { label: "Human Resources", value: "hr" }, - { label: "Operations", value: "operations" } - ] - } - ] - } - }, - { - id: "get_campaign", - type: "get_record", - label: "Get Campaign", - config: { objectName: "crm_campaign", filter: { id: cel27`recordId` }, outputVariable: "campaignRecord" } - }, - { - // The gate itself is on edges `e4` / `e7` — see the notes there. This node - // carries NO `config.condition`: the key is the trigger gate on a `start` - // node and is read nowhere else, so a copy here would be a second, inert - // statement of the predicate that no reader can tell apart from the live - // one (flagged by `flow-inert-node-condition` from 17.0.0-rc.2). - id: "check_campaign_open", - type: "decision", - label: "Campaign Open?" - }, - { - id: "query_leads", - type: "get_record", - label: "Find Eligible Leads", - config: { - objectName: "crm_lead", - filter: { - status: cel27`leadStatus`, - is_converted: false, - email: { $ne: null }, - // This is email-campaign enrollment — honour the opt-out flag. - // `campaign_member_optout_sync` populates it: an unsubscribed member - // round-trips to the person's `email_opt_out`. - email_opt_out: false - }, - limit: 1e3, - outputVariable: "leadList" - } - }, - { - id: "loop_leads", - type: "loop", - label: "Process Each Lead", - config: { - collection: cel27`leadList`, - iteratorVariable: "currentLead", - body: guarded("lead", { - nodes: [ - { - // Dedupe: skip leads already enrolled in THIS campaign, so a - // re-run tops up instead of double-enrolling (double rows - // inflated num_sent / response_rate). - id: "find_existing_member", - type: "get_record", - label: "Already Enrolled?", - config: { - objectName: "crm_campaign_member", - filter: { crm_campaign: cel27`recordId`, crm_lead: cel27`currentLead.id` }, - outputVariable: "existingMember" - } - }, - { - // Gateway only — the predicate lives on the out-edge. - id: "check_not_enrolled", - type: "decision", - label: "New Member?" - }, - { - // ⭐ The INSERT is elevated, this flow is NOT. `added_date` is - // `readonly: true`, and from @objectstack/objectql 17.4.0 the - // readonly strip runs inside `engine.insert` for a non-system - // caller as well as on update — so a write from this screen - // flow's user context now loses the stamp. The remedy the - // platform names is a system context; the remedy AGENTS.md house - // rule 9 names is a dedicated `system` sub-flow rather than - // elevating the screen flow. Both are satisfied here. ⛔ Do not - // fold this back by giving THIS flow `runAs: 'system'`: it would - // also lift RLS off `query_leads` / `query_contacts`, and - // `crm_lead` is `sharingModel: 'private'`. - // See `src/marketing/flows/campaign-member-enroll.flow.ts`. - id: "create_campaign_member", - type: "subflow", - label: "Add to Campaign", - config: { - flowName: "campaign_lead_member_enroll", - input: { campaignId: cel27`recordId`, leadId: cel27`currentLead.id` } - } - } - ], - edges: [ - { id: "b1", source: "find_existing_member", target: "check_not_enrolled", type: "default" }, - // Already enrolled → no edge → next lead. This edge is the ONLY - // site for the predicate: a `decision` node's singular - // `config.condition` is never read, so a node copy would be inert. - { id: "b2", source: "check_not_enrolled", target: "create_campaign_member", type: "conditional", condition: P42`existingMember == null`, label: "Enroll" } - ] - }) - } - }, - { - id: "query_contacts", - type: "get_record", - label: "Find Eligible Contacts", - config: { - objectName: "crm_contact", - filter: { - department: cel27`contactDepartment`, - email: { $ne: null }, - // Same opt-out honour as the lead branch. There is no `is_converted` - // twin here: a contact IS the converted end state. - email_opt_out: false - }, - limit: 1e3, - outputVariable: "contactList" - } - }, - { - id: "loop_contacts", - type: "loop", - label: "Process Each Contact", - config: { - collection: cel27`contactList`, - iteratorVariable: "currentContact", - body: guarded("contact", { - nodes: [ - { - // Dedupe scoped on `crm_contact`, so a person enrolled as a LEAD - // and again as a CONTACT is not treated as a duplicate: those are - // two records of two different relationships, and the seed - // datasets key them separately for the same reason. - id: "find_existing_contact_member", - type: "get_record", - label: "Already Enrolled?", - config: { - objectName: "crm_campaign_member", - filter: { crm_campaign: cel27`recordId`, crm_contact: cel27`currentContact.id` }, - outputVariable: "existingContactMember" - } - }, - { - // Gateway only — the predicate lives on the out-edge. - id: "check_contact_not_enrolled", - type: "decision", - label: "New Member?" - }, - { - // The contact mirror of `create_campaign_member` above — same - // elevation, same reason. See that node's note. - id: "create_contact_member", - type: "subflow", - label: "Add Contact to Campaign", - config: { - flowName: "campaign_contact_member_enroll", - input: { campaignId: cel27`recordId`, contactId: cel27`currentContact.id` } - } - } - ], - edges: [ - { id: "c1", source: "find_existing_contact_member", target: "check_contact_not_enrolled", type: "default" }, - { id: "c2", source: "check_contact_not_enrolled", target: "create_contact_member", type: "conditional", condition: P42`existingContactMember == null`, label: "Enroll" } - ] - }) - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "screen_1", type: "default" }, - { id: "e2", source: "screen_1", target: "get_campaign", type: "default" }, - { id: "e3", source: "get_campaign", target: "check_campaign_open", type: "default" }, - // Closed campaign → no edge → flow ends without enrolling. - // - // THE live gate, on the EDGES and only here. A `decision` node's singular - // `config.condition` is never read by the engine. - // - // Only enroll into campaigns that are actually running (or planned): - // topping up a completed/aborted campaign would corrupt its recorded - // metrics. (Status values: planning / in_progress / completed / aborted.) - // - // TOTALITY: `has(vars.campaignRecord)` first, then - // `has(vars.campaignRecord.status)`. `campaignRecord` is a `get_record` - // OUTPUT, and `findOne` answers a miss with `null` — so a campaign that was - // deleted (or hidden by sharing) between the action click and this node - // leaves the variable bound to null, and an unguarded read aborts with - // `No such key: status`, recording the run `failed` with not one lead - // enrolled. `status` is `required` on `crm_campaign` today so the column is - // never sparse — but that is the neighbouring schema doing the work, not - // this predicate, so it is guarded too. - // - // TWO conditional out-edges, one per member side. The open-campaign clause - // is repeated on both rather than hoisted to a second decision node: the - // gate IS the edge predicate here, so a separate "which side" node would - // need its own out-edges carrying the same clause anyway, and a node - // stating it once in `config.condition` is inert. - { id: "e4", source: "check_campaign_open", target: "query_leads", type: "conditional", condition: P42`has(vars.campaignRecord) && has(vars.campaignRecord.status) - && (vars.campaignRecord.status == "planning" || vars.campaignRecord.status == "in_progress") - && vars.memberSource != "contacts"`, label: "Open \xB7 Leads" }, - { id: "e5", source: "query_leads", target: "loop_leads", type: "default" }, - { id: "e6", source: "loop_leads", target: "end", type: "default" }, - // The contact branch. `memberSource` carries no `has()` guard on either - // edge, deliberately: its `flow.variables` declaration carries - // `defaultValue: 'leads'`, which the engine seeds before the start node, so - // it is bound on every path that reaches here — and on the ordinary resume - // path the server has already refused any signal that omitted the - // `required` screen field. A guard would have buried the policy ("no answer - // means leads") inside a predicate and left the graph defect in place — see - // test/flow-variable-conditions.test.ts. - { id: "e7", source: "check_campaign_open", target: "query_contacts", type: "conditional", condition: P42`has(vars.campaignRecord) && has(vars.campaignRecord.status) - && (vars.campaignRecord.status == "planning" || vars.campaignRecord.status == "in_progress") - && vars.memberSource == "contacts"`, label: "Open \xB7 Contacts" }, - { id: "e8", source: "query_contacts", target: "loop_contacts", type: "default" }, - { id: "e9", source: "loop_contacts", target: "end", type: "default" } - ] -}; - -// src/marketing/flows/campaign-member-enroll.flow.ts -import { cel as cel28 } from "@objectstack/spec"; -var MEMBERSHIP_FIELDS = { - status: "sent", - // The readonly stamp this elevation exists for. - added_date: cel28`isoDatetime(now())` -}; -var CampaignLeadMemberEnrollFlow = { - name: "campaign_lead_member_enroll", - label: "Enroll Lead in Campaign", - description: "Insert one lead campaign-membership row with its readonly added_date stamp, using the system context. Called by campaign_enrollment through a subflow node.", - type: "autolaunched", - status: "active", - // ⭐ THE ENTIRE POINT OF THIS FILE — see the header. One `create_record`. - runAs: "system", - variables: [ - // Supplied by the caller's `subflow` node. - { name: "campaignId", type: "text", isInput: true, isOutput: false }, - { name: "leadId", type: "text", isInput: true, isOutput: false } - ], - nodes: [ - // `config: {}` — an autolaunched callee is handed its params by the - // `subflow` executor and resolves no trigger record of its own, so there is - // no `objectName` for the start node to load. Same shape as - // `case_escalation_stamp`, measured in `test/readonly-write-semantics.test.ts`. - { id: "start", type: "start", label: "Start", config: {} }, - { - id: "create_campaign_member", - type: "create_record", - label: "Add to Campaign", - config: { - objectName: "crm_campaign_member", - // ⛔ Do not add fields here. Every column in this node is written with - // the elevated context; anything a marketer may legitimately type - // belongs in `campaign_enrollment` instead. - fields: { crm_campaign: cel28`campaignId`, crm_lead: cel28`leadId`, ...MEMBERSHIP_FIELDS } - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "create_campaign_member", type: "default" }, - { id: "e2", source: "create_campaign_member", target: "end", type: "default" } - ] -}; -var CampaignContactMemberEnrollFlow = { - name: "campaign_contact_member_enroll", - label: "Enroll Contact in Campaign", - description: "Insert one contact campaign-membership row with its readonly added_date stamp, using the system context. Called by campaign_enrollment through a subflow node.", - type: "autolaunched", - status: "active", - runAs: "system", - variables: [ - { name: "campaignId", type: "text", isInput: true, isOutput: false }, - { name: "contactId", type: "text", isInput: true, isOutput: false } - ], - nodes: [ - { id: "start", type: "start", label: "Start", config: {} }, - { - id: "create_contact_member", - type: "create_record", - label: "Add Contact to Campaign", - config: { - objectName: "crm_campaign_member", - fields: { crm_campaign: cel28`campaignId`, crm_contact: cel28`contactId`, ...MEMBERSHIP_FIELDS } - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "create_contact_member", type: "default" }, - { id: "e2", source: "create_contact_member", target: "end", type: "default" } - ] -}; - -// src/marketing/flows/campaign-completion.flow.ts -import { cel as cel29 } from "@objectstack/spec"; -var CampaignCompletionFlow = { - name: "campaign_completion", - label: "Campaign Auto-Completion", - description: "Daily: mark in_progress campaigns whose end_date has passed as completed.", - type: "schedule", - status: "active", - // Scheduled runs have no trigger user, so under the default runAs:'user' the - // data nodes execute UNSCOPED anyway. Declare runAs:'system' to make that - // RLS-bypassing elevation explicit and intended (ADR-0049). - runAs: "system", - variables: [], - nodes: [ - { id: "start", type: "start", label: "Start (daily 02:00)", config: { schedule: "0 2 * * *" } }, - { - id: "query_campaigns", - type: "get_record", - label: "Find Ended Campaigns", - config: { - objectName: "crm_campaign", - filter: { status: "in_progress", end_date: { $lt: cel29`isoDate(today())` } }, - limit: 500, - outputVariable: "campaignList" - } - }, - { - id: "loop_campaigns", - type: "loop", - label: "For Each Campaign", - config: { - collection: cel29`campaignList`, - iteratorVariable: "currentCampaign", - body: guarded("campaign", { - nodes: [ - { - id: "mark_completed", - type: "update_record", - label: "Mark Completed", - config: { objectName: "crm_campaign", filter: { id: cel29`currentCampaign.id` }, fields: { status: "completed" } } - } - ], - edges: [] - }) - } - }, - { id: "end", type: "end", label: "End" } - ], - edges: [ - { id: "e1", source: "start", target: "query_campaigns", type: "default" }, - { id: "e2", source: "query_campaigns", target: "loop_campaigns", type: "default" }, - { id: "e3", source: "loop_campaigns", target: "end", type: "default" } - ] -}; - -// src/sales/skills/lead-qualification.skill.ts -import { defineSkill as defineSkill2 } from "@objectstack/spec"; -var LeadQualificationSkill = defineSkill2({ - name: "lead_qualification", - label: "Lead Qualification", - description: "Qualifies inbound leads using BANT criteria and assigns a 0\u2013100 score.", - instructions: `When the user asks to qualify, score, or analyse a lead: - -1. Read the lead \u2014 \`describe_object\` for \`crm_lead\` first (fields - change), then \`get_record\`. Use \`query_records\` to pull the - related activity history when the lead has any. -2. Score it yourself, 0\u2013100, with BANT. There is no scoring tool: - Budget (is spend confirmed or inferable from company size?), - Authority (is the contact a decision maker?), Need (is there a - stated problem you solve?), Timeline (is there a date?). Weight - them evenly unless the user says otherwise. -3. Report the score, one line of justification per BANT dimension - naming the field or activity you read, and the single recommended - next step. Cite the lead ID. -4. Score >= 70 and the user agrees \u2192 call \`action_convert_lead\`. -5. Otherwise, or when the user wants to nurture, call - \`action_schedule_followup\` with the date you recommend. Say why - that date. -6. Never convert without explicit confirmation \u2014 conversion is not - reversible from this surface.`, - tools: [ - "describe_object", - "get_record", - "query_records", - "action_convert_lead", - "action_schedule_followup" - ], - triggerConditions: [ - { field: "objectName", operator: "eq", value: "crm_lead" } - ] -}); - -// src/sales/skills/email-drafting.skill.ts -import { defineSkill as defineSkill3 } from "@objectstack/spec"; -var EmailDraftingSkill = defineSkill3({ - name: "email_drafting", - label: "Email Drafting", - description: "Drafts personalised outbound emails grounded in live contact data, ready for a human to review and send.", - instructions: `When the user asks to draft, write, or optimise an email: - -1. Ground it in real data before writing a word: \`get_record\` the - contact (and the related account or opportunity when the request - references one) so names, titles and recent activity are accurate. - Use \`query_records\` when you need the recent history. -2. Write the copy yourself \u2014 subject and body. You do not have, and do - not need, a copy-generation tool. Aim for: a subject under 60 - characters naming the concrete value, a first line referencing - something specific to THIS recipient rather than a generic - pleasantry, one clear ask, and no more than 150 words. -3. Offer two subject-line variants, say which you recommend and why, - so the user can A/B them. -4. Show the draft and stop. You cannot send \u2014 say so plainly rather - than implying a send is queued. -5. Point the user at **Send Email** on the contact record, where the - subject and body you drafted can be pasted, reviewed and sent.`, - tools: ["get_record", "query_records"] -}); - -// src/sales/skills/revenue-forecasting.skill.ts -import { defineSkill as defineSkill4 } from "@objectstack/spec"; -var RevenueForecastingSkill = defineSkill4({ - name: "revenue_forecasting", - label: "Revenue Forecasting", - description: "Analyses pipeline health, surfaces at-risk deals, and forecasts revenue from live opportunity data.", - instructions: `When the user asks about pipeline health, forecast, -risk, or deal slippage: - -1. Establish the shape first: \`describe_object\` for - \`crm_opportunity\` so you use the CURRENT stage, amount, - probability and close-date fields rather than assumed ones. -2. Summarise the pipeline with \`aggregate_data\` \u2014 count and summed - amount grouped by stage, scoped to the period the user names - (default: the current quarter). Weighted value is amount \xD7 - probability; compute it yourself from what you read. -3. Surface at-risk deals with \`query_records\`: close date already - past, or no activity in 30+ days, or the stage unchanged for longer - than its typical duration. Name each deal and the specific signal. -4. Forecast by summing weighted value for open deals plus closed-won - in the period. State the assumption behind the number in one line, - and give a range rather than false precision \u2014 the spread between - commit-only (high-probability stages) and full weighted pipeline. -5. Offer \`visualize_data\` when a chart would carry the answer better - than prose, e.g. stage distribution or month-over-month trend. -6. Be quantitative: every claim cites a number or a deal name. If the - data cannot support a claim, say so instead of estimating.`, - tools: ["describe_object", "aggregate_data", "query_records", "visualize_data"], - triggerConditions: [ - { field: "objectName", operator: "in", value: ["crm_opportunity", "dashboard"] } - ] -}); - -// src/sales/skills/customer-360.skill.ts -import { defineSkill as defineSkill5 } from "@objectstack/spec"; -var Customer360Skill = defineSkill5({ - name: "customer_360", - label: "Customer 360", - description: "Aggregates account, recent cases, open opportunities, and knowledge hits into a single customer profile.", - instructions: `When the user asks for "the full picture" of a -customer / account / contact: - -1. Read the shape first \u2014 \`describe_object\` for \`crm_account\`, and for - each related object before you query it. Admins add fields; never - summarise from memory of a previous turn. -2. \`get_record\` the account, then pull the related work with - \`query_records\`, each filtered to this account: - - \`crm_contact\` \u2014 who the people are, primary contact first. - - \`crm_case\` \u2014 cases where \`is_closed\` is false, newest first. - - \`crm_opportunity\` \u2014 open deals with stage, amount and close date. - Quote totals from \`aggregate_data\` (open pipeline amount, case count - by status) rather than adding up rows yourself. -3. For the policy or playbook context, \`query_records\` on - \`crm_knowledge_article\` \u2014 \`status\` published, matched on the - \`category\` or \`tags\` of the cases you just read. You have no - knowledge-search tool in this skill and do not need one: the knowledge - base is an object like any other. -4. Summarise into three sections: **Account Snapshot** \xB7 **Active Work** \xB7 - **Risks & Notes**. Every risk names the record and the signal that - raised it \u2014 an escalated case, a close date already past, a deal with - no activity in 30+ days. Do not infer risk you cannot cite. -5. Cite record IDs inline (e.g. "case CASE-01234", "article KA-0007") so - the UI can deep link. If a section has no records, say so plainly - instead of filling it.`, - tools: ["describe_object", "get_record", "query_records", "aggregate_data"] -}); - -// src/sales/skills/live-data.skill.ts -import { defineSkill as defineSkill6 } from "@objectstack/spec"; -var LiveDataSkill = defineSkill6({ - name: "live_data", - label: "Live Data Access", - description: "Queries any CRM object using the current live schema. Always inspects the object structure first so newly added fields are picked up immediately.", - instructions: `When the user asks a question that touches a CRM -record (account, contact, lead, opportunity, case, quote, etc.): - -1. **Always** call \`describe_object\` for the relevant object FIRST, - even if you think you remember the fields. The schema can change - between turns \u2014 trust the tool, not your memory. -2. Use \`list_objects\` if you are not sure which object holds the - data the user is asking about. -3. Use \`query_records\` (filters, sort, limit) for lists, - \`get_record\` for a single ID, \`aggregate_data\` for sums / - counts / averages. -4. When you reference data, cite the record ID inline so the UI - can deep-link (e.g. "opportunity OPP-1234"). -5. If \`describe_object\` shows a field you've never seen before, - USE IT \u2014 that's the user's whole point in adding it. Surface it - in your answer when relevant.`, - tools: [ - "describe_object", - "list_objects", - "query_records", - "get_record", - "aggregate_data" - ] -}); - -// src/sales/sharing/account.sharing.ts -import { P as P43 } from "@objectstack/spec"; -var AccountTeamSharingRule = { - name: "account_team_sharing", - label: "Account Team Sharing", - object: "crm_account", - type: "criteria", - condition: P43`record.type == "customer" && record.is_active == true`, - accessLevel: "edit", - sharedWith: { type: "position", value: "sales_manager" } -}; -var TerritorySharingRules = [ - { - name: "north_america_territory", - label: "North America Territory", - object: "crm_account", - type: "criteria", - condition: P43`record.territory == ${TERRITORY.NA}`, - accessLevel: "edit", - sharedWith: { type: "position", value: "na_sales_team" } - }, - { - name: "europe_territory", - label: "Europe Territory", - object: "crm_account", - type: "criteria", - condition: P43`record.territory == ${TERRITORY.EMEA}`, - accessLevel: "edit", - sharedWith: { type: "position", value: "eu_sales_team" } - } -]; - -// src/sales/sharing/opportunity.sharing.ts -import { P as P44 } from "@objectstack/spec"; -var OpportunitySalesSharingRule = { - name: "opportunity_sales_sharing", - label: "Opportunity Sales Team Sharing", - object: "crm_opportunity", - type: "criteria", - condition: P44`!(record.stage in ["closed_won", "closed_lost"]) && record.amount >= ${LARGE_DEAL_AMOUNT}`, - accessLevel: "read", - sharedWith: { type: "position", value: "sales_director" } -}; -var OpportunityExecutiveSharingRule = { - name: "opportunity_executive_sharing", - label: "Large Open Deals \u2014 Executive", - object: "crm_opportunity", - type: "criteria", - condition: P44`!(record.stage in ["closed_won", "closed_lost"]) && record.amount >= ${LARGE_DEAL_AMOUNT}`, - accessLevel: "read", - sharedWith: { type: "position", value: "executive" } -}; - -// src/sales/sharing/positions.ts -var CrmPositions = [ - { name: "executive", label: "Executive" }, - { name: "sales_director", label: "Sales Director" }, - { name: "sales_manager", label: "Sales Manager" }, - { name: "sales_rep", label: "Sales Representative" }, - { name: "service_director", label: "Service Director" }, - { name: "service_manager", label: "Service Manager" }, - { name: "service_agent", label: "Service Agent" }, - { name: "marketing_director", label: "Marketing Director" }, - { name: "marketing_manager", label: "Marketing Manager" }, - { name: "marketing_user", label: "Marketing User" }, - // Territory groupings referenced by the account sharing rules. - { name: "na_sales_team", label: "NA Sales Team" }, - { name: "eu_sales_team", label: "EU Sales Team" } -]; - -// src/marketing/sharing/campaign.sharing.ts -import { P as P45 } from "@objectstack/spec"; -var CampaignLeadershipSharingRules = [ - { - name: "campaign_leadership_manager", - label: "Live Campaigns \u2014 Marketing Manager", - object: "crm_campaign", - type: "criteria", - condition: P45`record.status in ["planning", "in_progress"] && record.is_active == true`, - accessLevel: "edit", - sharedWith: { type: "position", value: "marketing_manager" } - }, - { - name: "campaign_leadership_director", - label: "Live Campaigns \u2014 Marketing Director", - object: "crm_campaign", - type: "criteria", - condition: P45`record.status in ["planning", "in_progress"] && record.is_active == true`, - accessLevel: "edit", - sharedWith: { type: "position", value: "marketing_director" } - } -]; - -// src/sales/data/sales.seed.ts -import { defineSeed } from "@objectstack/spec/data"; -import { cel as cel31 } from "@objectstack/spec"; - -// src/sales/data/_shared.ts -import { cel as cel30 } from "@objectstack/spec"; -var celDaysAgo = (n) => cel30`daysAgo(${n})`; -var lineTotal = (l) => Math.round(l.quantity * l.unit_price * (1 - (l.discount ?? 0) / 100) * 100) / 100; -var linesTotal = (lines) => Math.round(lines.reduce((sum, l) => sum + lineTotal(l), 0) * 100) / 100; - -// src/sales/data/sales.seed.ts -var accounts = defineSeed(Account, { - mode: "upsert", - externalId: "name", - records: [ - { - name: "Acme Corporation", - approval_status: "approved", - type: "customer", - industry: "technology", - annual_revenue: 5e6, - number_of_employees: 250, - phone: "+1-415-555-0100", - billing_address: { street: "500 Howard Street, Suite 400", city: "San Francisco", state: "CA", postalCode: "94105", country: "US" }, - website: "https://acme.example.com", - tier: "enterprise", - segment: "growth", - health_score: "healthy", - // Held: workshop, demo, calls and an onsite visit — see `service.seed.ts`. - last_activity_date: cel31`today()`, - // The ARR line below used to read "signed Q1 2025 renewal" while the - // deal it describes closes `daysAgo(15)` — a fixed calendar quarter on a - // relative-date record, wrong in both the quarter and the year (#1692). - // The label is not re-derived here either: that date belongs to - // `Acme Annual Renewal 2025` (`close_date`) and to its contract - // (`signed_date`, `revenue.seed.ts`), and computing a copy in this module - // means re-stating that record's own offset — a second source of truth - // for a value two records already own. Same ruling as the `next_step` - // block below (#1660): no date goes back into this prose, absolute OR - // relative. What stays true however the renewal is dated is that it IS - // signed: the deal is `closed_won` and its contract `activated`. - description: `**Strategic Customer \xB7 Enterprise Tier** - -Acme Corporation is a Series-C robotics & industrial automation -company that switched from a competitor 18 months ago. They run -HotCRM as their system of record for sales + service across -three regional teams (NA, EMEA, APAC). - -**Relationship** -- Primary economic buyer: Jordan Park (CTO) \u2014 values our open - architecture and AI roadmap. -- Day-to-day champion: John Smith (VP Engineering) \u2014 owns the - technical evaluation and integration questions. -- Procurement: handled by Lisa Kim \u2014 prefers annual contracts, - net-30 terms. - -**Current state** -- ARR: $220K (signed renewal). Up 22% YoY. -- 1 open enterprise opportunity ($150K platform upgrade) in proposal - stage, 1 service ticket open (login issues), 1 billing dispute - awaiting customer response. -- AI agent governance became a hard requirement for that upgrade - after their internal compliance review, so the workshop now on - the calendar is the gate on signature. - -**Red flags** -- Lost the $75K Marketing Cloud add-on on timing \u2014 their marketing - org is locked into a 2-year HubSpot contract, and the buying - window opens when that contract renews. -- Login issues ticket is already past its SLA clock \u2014 needs eyes - today.` - }, - { - name: "Globex Industries", - approval_status: "approved", - type: "prospect", - industry: "manufacturing", - annual_revenue: 12e6, - number_of_employees: 800, - phone: "+1-312-555-0200", - billing_address: { street: "233 South Wacker Drive", city: "Chicago", state: "IL", postalCode: "60606", country: "US" }, - website: "https://globex.example.com", - tier: "enterprise", - segment: "net_new", - // Only a booked demo and a cancelled review — neither bubbles, so this - // 8-day age survives the seed load and stays inside every churn window. - last_activity_date: cel31`daysAgo(8)` - }, - { - name: "Initech Solutions", - approval_status: "approved", - type: "customer", - industry: "finance", - annual_revenue: 35e5, - number_of_employees: 150, - phone: "+1-212-555-0300", - billing_address: { street: "1 Liberty Plaza, 23rd Floor", city: "New York", state: "NY", postalCode: "10006", country: "US" }, - website: "https://initech.example.com", - tier: "mid_market", - segment: "at_risk", - health_score: "at_risk", - // QUIET 60+ — the `at_risk` segment and health score, with a clock that - // finally agrees with them: ten weeks of silence. A no-show call 55 days - // ago was the last attempt; the re-engagement call on the calendar is - // `planned`, so it moves nothing. - last_activity_date: cel31`daysAgo(72)` - }, - { - name: "Stark Medical", - approval_status: "approved", - type: "partner", - industry: "healthcare", - annual_revenue: 8e6, - number_of_employees: 400, - // The one Canadian account: still inside north_america_territory, and the - // reason that rule's `$in` list is not a single-country list in disguise. - phone: "+1-416-555-0400", - billing_address: { street: "181 Bay Street, Suite 2200", city: "Toronto", state: "ON", postalCode: "M5J 2T3", country: "CA" }, - website: "https://starkmed.example.com", - tier: "mid_market", - segment: "stable", - // `at_risk` rather than `churning`, and the distinction is the reason - // this row can exist at all: a partner whose pilot was WON and whose - // expansion then died on a capital freeze can be at risk, but it was - // never a subscription that could churn. The records say it — `Stark - // Expansion (Lost)` closed `no_budget` 60 days ago and the partnership - // contract is still in legal review — and the panel's criterion admits - // both values, so the honest severity is also the one that flags. - // - // Diverging from `segment: 'stable'` is deliberate, the same split - // Wayne demonstrates below: `segment` is how the book classifies the - // account, `health_score` is what a person asserts about it. The clock - // stays at today(), so like Wayne this row is outside every windowed - // panel on that report: it reaches `csm_flagged_accounts` and no other - // block. - health_score: "at_risk", - // The completed 'Send welcome package' task bubbles here on every seed - // load, so this has ALWAYS resolved to today — the previous `daysAgo(5)` - // was authored and then overwritten before anyone could read it. - last_activity_date: cel31`today()` - }, - { - name: "Wayne Enterprises", - approval_status: "approved", - type: "customer", - industry: "technology", - annual_revenue: 25e6, - number_of_employees: 2e3, - phone: "+1-650-555-0500", - billing_address: { street: "3000 Hanover Street", city: "Palo Alto", state: "CA", postalCode: "94304", country: "US" }, - website: "https://wayne.example.com", - tier: "strategic", - segment: "growth", - // CHURNING, with the clock still running — the population - // `csm_flagged_accounts` exists for (#1414). Every DERIVED signal on - // this row reads healthy: an operations rollout closed four days ago, a - // licence sits at 80% two weeks from signature, three meetings were held - // this month. The CSM who has been in the room says the account is going - // anyway, and `health_score` is the only churn signal in the model a - // person ASSERTS — which is why the panel that reads it is first on the - // report and carries no time window. - // - // ⛔ Do not "correct" this to `at_risk` to agree with the pipeline, and - // ⛔ do not stop the clock to agree with the health score: either edit - // folds the row back into `at_risk_accounts` (60-day window) and the - // flagged panel goes back to restating its neighbour. - health_score: "churning", - // Held: negotiation meeting, security-addendum call, governance webinar. - last_activity_date: cel31`today()` - }, - { - name: "Northwind Energy", - approval_status: "approved", - type: "prospect", - industry: "energy", - annual_revenue: 18e6, - number_of_employees: 1100, - // europe_territory, half 1: DE. - phone: "+49-89-5550-0600", - billing_address: { street: "Leopoldstrasse 21", city: "Munich", state: "BY", postalCode: "80802", country: "DE" }, - website: "https://northwind.example.com", - tier: "enterprise", - segment: "net_new", - // QUIET 30+ — the field-service pilot was lost 80 days ago and the grid - // program has not been worked since. The discovery workshop is booked, - // not held. - last_activity_date: cel31`daysAgo(41)`, - description: "A regional energy provider evaluating a unified operations and customer-data platform." - }, - { - name: "Vertex Analytics", - approval_status: "approved", - type: "customer", - industry: "software", - annual_revenue: 95e5, - number_of_employees: 420, - phone: "+1-512-555-0700", - billing_address: { street: "600 Congress Avenue, Floor 14", city: "Austin", state: "TX", postalCode: "78701", country: "US" }, - website: "https://vertex.example.com", - tier: "enterprise", - segment: "growth", - health_score: "healthy", - // Held: rollout meeting, analytics demo, committee call, retrospective. - last_activity_date: cel31`today()`, - description: "An analytics SaaS customer expanding usage from the data team to its revenue organization." - }, - { - name: "Lattice Education", - approval_status: "approved", - type: "customer", - industry: "education", - annual_revenue: 68e5, - number_of_employees: 320, - // europe_territory, half 2 — and the alias fixture. `UK` is not ISO - // 3166-1 alpha-2 (`GB` is); it is an ACCEPTED SPELLING in - // `src/sales/objects/_territory.ts`, so this row proves on stock data that a - // legacy spelling still lands in `emea` (#639). No `state`: an address - // without a subdivision is a normal shape, and only `country` is read. - phone: "+44-20-7946-0800", - billing_address: { street: "20 Fenchurch Street", city: "London", postalCode: "EC3M 3BY", country: "UK" }, - website: "https://lattice.example.com", - tier: "mid_market", - segment: "stable", - health_score: "healthy", - // Signed the analytics expansion six days ago; the renewal review is - // booked, not held, so nothing bubbles and this age stands. - last_activity_date: cel31`daysAgo(6)`, - description: "A higher-education technology company consolidating admissions, student-success and alumni workflows." - }, - { - name: "Apex Logistics", - approval_status: "approved", - type: "prospect", - industry: "logistics", - annual_revenue: 22e6, - number_of_employees: 1400, - // `territory == "other"` on purpose: without a record that matches - // neither rule, "the rules partition the accounts" is unfalsifiable — - // a match-all regression would look identical to a working one. `SG` is - // a real country the staffed territories do not cover, which is exactly - // what `other` is for (#639) — it is a stated classification here, not a - // blank. - phone: "+65-6555-0900", - billing_address: { street: "10 Marina Boulevard, #30-01", city: "Singapore", postalCode: "018983", country: "SG" }, - website: "https://apexlogistics.example.com", - tier: "enterprise", - segment: "net_new", - // QUIET 90+ — a lost compliance deal 110 days ago and a data-hub - // evaluation that has been silent for a quarter. Only a booked - // re-engagement call. - last_activity_date: cel31`daysAgo(104)`, - description: "A fast-growing logistics provider assessing a modern data hub for its operations and commercial teams." - } - ] -}); -var contacts = defineSeed(Contact, { - mode: "upsert", - externalId: "email", - records: [ - { - salutation: "mr", - first_name: "John", - last_name: "Smith", - email: "john.smith@acme.example.com", - phone: "+1-415-555-0101", - title: "VP of Engineering", - department: "engineering", - crm_account: "Acme Corporation", - is_primary: true - }, - { - salutation: "ms", - first_name: "Sarah", - last_name: "Johnson", - email: "sarah.j@globex.example.com", - phone: "+1-312-555-0201", - title: "Chief Procurement Officer", - department: "executive", - crm_account: "Globex Industries", - is_primary: true - }, - { - salutation: "dr", - first_name: "Michael", - last_name: "Chen", - email: "mchen@initech.example.com", - phone: "+1-212-555-0301", - title: "Director of Operations", - department: "operations", - crm_account: "Initech Solutions", - is_primary: true - }, - { - salutation: "ms", - first_name: "Emily", - last_name: "Davis", - email: "emily.d@starkmed.example.com", - phone: "+1-617-555-0401", - title: "Head of Partnerships", - department: "sales", - crm_account: "Stark Medical", - is_primary: true - }, - { - salutation: "mr", - first_name: "Robert", - last_name: "Wilson", - email: "rwilson@wayne.example.com", - phone: "+1-650-555-0501", - title: "CTO", - department: "engineering", - crm_account: "Wayne Enterprises", - is_primary: true - }, - { - salutation: "ms", - first_name: "Olivia", - last_name: "Chen", - email: "olivia.chen@northwind.example.com", - phone: "+1-303-555-0601", - title: "VP of Digital Operations", - department: "operations", - crm_account: "Northwind Energy", - is_primary: true - }, - { - salutation: "mr", - first_name: "Ethan", - last_name: "Brooks", - email: "ethan.brooks@vertex.example.com", - phone: "+1-512-555-0701", - title: "Chief Revenue Officer", - department: "executive", - crm_account: "Vertex Analytics", - is_primary: true - }, - { - salutation: "ms", - first_name: "Priya", - last_name: "Shah", - email: "priya.shah@lattice.example.com", - phone: "+1-617-555-0801", - title: "VP of Student Success", - department: "operations", - crm_account: "Lattice Education", - is_primary: true - }, - { - salutation: "mr", - first_name: "Marcus", - last_name: "Reed", - email: "marcus.reed@apexlogistics.example.com", - phone: "+1-404-555-0901", - title: "Director of Commercial Systems", - department: "operations", - crm_account: "Apex Logistics", - is_primary: true - } - ] -}); -var DISQUALIFICATION_REASONS = [ - { reason: "no_budget", note: "No budget approved for this fiscal year \u2014 revisit next planning cycle." }, - { reason: "not_a_fit", note: "Requirements sit outside what the product covers today." }, - { reason: "wrong_persona", note: "Contact has no say in the buying decision and no path to an owner." }, - { reason: "unreachable", note: "Six touches across email and phone over four weeks, no response." } -]; -var leads = defineSeed(Lead, { - mode: "upsert", - externalId: "email", - records: [ - { - first_name: "Alice", - last_name: "Martinez", - company: "NextGen Retail", - email: "alice@nextgenretail.example.com", - phone: "+1-503-555-0600", - status: "new", - lead_source: "web", - industry: "retail", - rating: 3, - next_followup_date: cel31`daysFromNow(2)` - }, - { - first_name: "David", - last_name: "Kim", - company: "EduTech Labs", - email: "dkim@edutechlabs.example.com", - phone: "+1-408-555-0700", - status: "contacted", - lead_source: "referral", - industry: "education", - rating: 4, - next_followup_date: cel31`daysFromNow(1)`, - // A seeded `held` event names this lead, and `event_activity_bubble` - // stamps `last_contacted_date` with the SEED MOMENT rather than the - // event's own timestamp — so an authored age here would be overwritten - // the instant it was written (doctrine rule 2 in `./_shared.ts`). Day - // granularity is the honest match: the seed writes today's UTC midnight, - // the bubble writes today's instant, and both render as "today". - last_contacted_date: cel31`today()` - }, - { - first_name: "Lisa", - last_name: "Thompson", - company: "CloudFirst Inc", - email: "lisa.t@cloudfirst.example.com", - phone: "+1-206-555-0800", - status: "qualified", - lead_source: "event", - industry: "technology", - // WHOLE stars only. `lead.hook.ts` rounds its computed score to an - // integer because "half values rendered inconsistently in the star - // widget", and the hook leaves an explicitly seeded number alone — so a - // seeded 4.5 was the one rating in the system the contract could never - // produce, and it rendered as the broken half-star it was meant to - // prevent (#591). - rating: 5, - next_followup_date: cel31`daysFromNow(0)`, - // Same as David Kim above: a `held` qualification call names this lead. - last_contacted_date: cel31`today()` - }, - // ─── Generated demo leads — spread across 6 months for monthly-bucket reports - // (`LeadInflowByMonthSourceReport`). Each `last_contacted_date` lives in a - // distinct month / source pair so the matrix has multiple cells populated. - ...[ - { fn: "Noah", ln: "Patel", co: "Vertex Analytics", src: "web", ind: "technology", age: 7 }, - { fn: "Maya", ln: "Singh", co: "BluePeak Logistics", src: "referral", ind: "logistics", age: 14 }, - { fn: "Owen", ln: "Becker", co: "Northwind Energy", src: "event", ind: "energy", age: 21 }, - { fn: "Sara", ln: "Lopez", co: "Helios Solar", src: "partner", ind: "energy", age: 28 }, - { fn: "Leo", ln: "Vance", co: "CleanCart", src: "web", ind: "retail", age: 38 }, - { fn: "Iris", ln: "Okafor", co: "PulseHealth", src: "cold_call", ind: "healthcare", age: 45 }, - { fn: "Ravi", ln: "Mehta", co: "Foundry Robotics", src: "event", ind: "manufacturing", age: 52 }, - { fn: "Tess", ln: "Brown", co: "Lattice Education", src: "referral", ind: "education", age: 67 }, - { fn: "Marco", ln: "Ricci", co: "Aurora Travel", src: "advertisement", ind: "hospitality", age: 74 }, - { fn: "Pia", ln: "Anand", co: "Citrine Finance", src: "partner", ind: "finance", age: 81 }, - { fn: "Jonas", ln: "Holt", co: "Polar Cargo", src: "web", ind: "logistics", age: 95 }, - { fn: "Anya", ln: "Volkov", co: "RedOak Realty", src: "cold_call", ind: "real_estate", age: 102 }, - { fn: "Theo", ln: "Park", co: "Skyline Media", src: "advertisement", ind: "media", age: 116 }, - { fn: "Wren", ln: "Garcia", co: "Maple Bakery Group", src: "event", ind: "retail", age: 123 }, - { fn: "Hugo", ln: "Dubois", co: "Nimbus Aerospace", src: "referral", ind: "manufacturing", age: 138 }, - { fn: "Lena", ln: "Fischer", co: "Granite Insurance", src: "partner", ind: "finance", age: 145 }, - { fn: "Kai", ln: "Watanabe", co: "Coral Reef Hotels", src: "web", ind: "hospitality", age: 162 }, - { fn: "Mira", ln: "Costa", co: "Atlas Construction", src: "cold_call", ind: "other", age: 175 } - ].map((l, i) => { - const domain = `${l.co.toLowerCase().replace(/\s+/g, "")}.example.com`; - const status = ["new", "contacted", "qualified", "unqualified"][i % 4]; - return { - first_name: l.fn, - last_name: l.ln, - company: l.co, - email: `${l.fn.toLowerCase()}.${l.ln.toLowerCase()}@${domain}`, - phone: `+1-555-01${String(i).padStart(2, "0")}-${String(1e3 + i * 7)}`, - status, - lead_source: l.src, - industry: l.ind, - rating: 1 + i * 7 % 5, - last_contacted_date: celDaysAgo(l.age), - // The qualification fields were left blank on every generated lead, so - // the detail page's Contact / Lead Detail / Description sections had - // nothing to render (they also drop whatever the highlights strip - // already shows, so all four collapsed to nothing) and the demo read - // like a half-finished import. - title: ["VP Operations", "Head of IT", "Director of Sales", "COO", "Procurement Lead"][i % 5], - mobile: `+1-555-02${String(i).padStart(2, "0")}-${String(2e3 + i * 3)}`, - website: `https://${domain}`, - annual_revenue: 2e6 + i * 37e5 % 9e7, - number_of_employees: 25 + i * 137 % 4800, - description: `Inbound via ${l.src.replace(/_/g, " ")}. Evaluating a CRM to replace spreadsheets across their ${l.ind.replace(/_/g, " ")} operation.`, - ...status === "unqualified" ? { - disqualification_reason: DISQUALIFICATION_REASONS[(i >> 2) % DISQUALIFICATION_REASONS.length].reason, - notes: DISQUALIFICATION_REASONS[(i >> 2) % DISQUALIFICATION_REASONS.length].note - } : {} - }; - }) - ] -}); -var OPPORTUNITY_LINES = { - "Acme Platform Upgrade": [ - { product: "ObjectStack Platform", quantity: 2, unit_price: 5e4, discount: 10, description: "Enterprise edition \u2014 NA + EMEA production tenants (multi-year discount)." }, - { product: "Premium Support", quantity: 1, unit_price: 25e3, description: "24\xD77 premium support with a named TAM." }, - { product: "AI Agent Seat (Annual)", quantity: 35, unit_price: 1e3, description: "Agent seats for the Ops organization." } - ], - "Globex Manufacturing Suite": [ - { product: "ObjectStack Platform", quantity: 1, unit_price: 5e4, description: "Enterprise edition \u2014 one shared tenant serving all six manufacturing sites." }, - { product: "Admin Training Workshop", quantity: 4, unit_price: 6e3, description: "Four workshop days, one per regional plant cluster." }, - { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Business-hours support for the first year." }, - { product: "AI Agent Seat (Annual)", quantity: 12, unit_price: 1e3, description: "Agent seats for the plant operations leads." } - ], - "Wayne Enterprise License": [ - { product: "ObjectStack Platform", quantity: 20, unit_price: 5e4, discount: 15, description: "Enterprise-wide license, volume discount at 20 tenants." }, - { product: "Premium Support", quantity: 4, unit_price: 25e3, description: "Premium support across four business units." }, - { product: "AI Agent Seat (Annual)", quantity: 250, unit_price: 1e3, description: "Agent seats for the global revenue organization." } - ], - "Initech Cloud Migration": [ - { product: "Data Migration Services", quantity: 1, unit_price: 35e3, description: "Migration off the legacy on-premise CRM." }, - { product: "Cloud Hosting (Annual)", quantity: 2, unit_price: 12e3, description: "Managed hosting, primary + DR region." }, - { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Business-hours support for the first year." }, - { product: "AI Agent Seat (Annual)", quantity: 12, unit_price: 1e3, description: "Agent seats for the service desk." } - ], - "Acme Annual Renewal 2025": [ - { product: "ObjectStack Platform", quantity: 3, unit_price: 5e4, description: "Renewal of the three production tenants." }, - { product: "Premium Support", quantity: 1, unit_price: 25e3, description: "Premium support renewal." }, - { product: "AI Agent Seat (Annual)", quantity: 45, unit_price: 1e3, description: "Seat expansion driven by the new EMEA team." } - ], - "Stark Medical Pilot": [ - { product: "ObjectStack Platform", quantity: 2, unit_price: 5e4, description: "Pilot tenants for two clinical service lines." }, - { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Standard support during the pilot." }, - { product: "Admin Training Workshop", quantity: 6, unit_price: 6e3, description: "Six workshop days for the clinical operations admins." } - ], - "Wayne Q1 Expansion": [ - { product: "ObjectStack Platform", quantity: 6, unit_price: 5e4, description: "Expansion into six additional subsidiaries." }, - { product: "Premium Support", quantity: 2, unit_price: 25e3, description: "Premium support for the expanded footprint." }, - { product: "AI Agent Seat (Annual)", quantity: 30, unit_price: 1e3, description: "Agent seats for the expansion teams." } - ], - "Globex Training Package": [ - { product: "Admin Training Workshop", quantity: 10, unit_price: 6e3, description: "Ten workshop days across the plant admin community." }, - { product: "AI Agent Seat (Annual)", quantity: 5, unit_price: 1e3, description: "Agent seats for the training sandbox." } - ], - "Initech Phase 1": [ - { product: "Implementation Services", quantity: 1, unit_price: 75e3, description: "Phase 1 implementation: accounts, contacts, pipeline." }, - { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Standard support for phase 1." }, - { product: "AI Agent Seat (Annual)", quantity: 6, unit_price: 1e3, description: "Agent seats for the phase-1 pilot group." } - ], - "Acme Add-on (Lost)": [ - { product: "Analytics Add-on", quantity: 2, unit_price: 22e3, description: "Marketing analytics for two business units." }, - { product: "Integration Connector Pack", quantity: 1, unit_price: 16e3, description: "Marketing-automation connector pack." }, - { product: "Sandbox Environment (Annual)", quantity: 2, unit_price: 7500, description: "Two sandboxes for the marketing build-out." } - ], - "Stark Expansion (Lost)": [ - { product: "ObjectStack Platform", quantity: 2, unit_price: 5e4, description: "Two additional clinical tenants." }, - { product: "Field Service Mobile", quantity: 1, unit_price: 14e3, description: "Field service mobile for the device-servicing team." }, - { product: "AI Agent Seat (Annual)", quantity: 6, unit_price: 1e3, description: "Agent seats for the service coordinators." } - ], - "Globex Line Expansion (Lost)": [ - { product: "ObjectStack Platform", quantity: 2, unit_price: 5e4, description: "Two further production-line tenants." }, - { product: "Integration Connector Pack", quantity: 1, unit_price: 16e3, description: "Connector pack for the line-control systems." }, - { product: "AI Agent Seat (Annual)", quantity: 8, unit_price: 1e3, description: "Agent seats for the line supervisors." } - ], - "Northwind Field Service Pilot (Lost)": [ - { product: "Field Service Mobile", quantity: 1, unit_price: 14e3, description: "Field-service mobile for the metering crews." }, - { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Business-hours support during the pilot." }, - { product: "AI Agent Seat (Annual)", quantity: 10, unit_price: 1e3, description: "Agent seats for the dispatch desk." } - ], - "Apex Compliance Reporting (Lost)": [ - { product: "Analytics Add-on", quantity: 1, unit_price: 22e3, description: "Regulatory reporting pack for fleet compliance." }, - { product: "Sandbox Environment (Annual)", quantity: 1, unit_price: 7500, description: "Sandbox for the compliance rule build-out." }, - { product: "AI Agent Seat (Annual)", quantity: 6, unit_price: 1e3, description: "Agent seats for the compliance analysts." } - ], - "Northwind Grid Modernization": [ - { product: "ObjectStack Platform", quantity: 1, unit_price: 5e4, description: "Enterprise edition for grid, field and customer operations." }, - { product: "Field Service Mobile", quantity: 1, unit_price: 14e3, description: "Field-service mobile for the grid maintenance crews." }, - { product: "Sandbox Environment (Annual)", quantity: 1, unit_price: 7500, description: "Sandbox for the operational-data assessment." }, - { product: "AI Agent Seat (Annual)", quantity: 15, unit_price: 1e3, description: "Agent seats for the control-room pilot." } - ], - "Lattice Student Success Platform": [ - { product: "ObjectStack Platform (SMB Edition)", quantity: 2, unit_price: 18e3, description: "Student-success tenants for the two pilot colleges." }, - { product: "Admin Training Workshop", quantity: 2, unit_price: 6e3, description: "Two workshop days for the student-success advisers." }, - { product: "AI Agent Seat (Annual)", quantity: 5, unit_price: 1e3, description: "Agent seats for the advising team." } - ], - "Vertex Analytics Expansion": [ - { product: "Analytics Add-on", quantity: 2, unit_price: 22e3, description: "Analytics for the sales and marketing teams." }, - { product: "Premium Support", quantity: 1, unit_price: 25e3, description: "Premium support for the expanded footprint." }, - { product: "AI Agent Seat (Annual)", quantity: 10, unit_price: 1e3, description: "Agent seats for the revenue operations team." } - ], - "Apex Logistics Data Hub": [ - { product: "ObjectStack Platform", quantity: 1, unit_price: 5e4, description: "Data-hub tenant shared by commercial, operations and finance." }, - { product: "Data Migration Services", quantity: 1, unit_price: 35e3, description: "Consolidation of four fragmented commercial systems." }, - { product: "AI Agent Seat (Annual)", quantity: 8, unit_price: 1e3, description: "Agent seats for the commercial operations team." } - ], - "Lattice Education Renewal": [ - { product: "ObjectStack Platform", quantity: 1, unit_price: 5e4, description: "Renewal of the institution-wide tenant." }, - { product: "Analytics Add-on", quantity: 1, unit_price: 22e3, description: "Expanded analytics package for the renewal term." }, - { product: "AI Agent Seat (Annual)", quantity: 15, unit_price: 1e3, description: "Student-success automation seats." } - ], - "Vertex Enterprise Rollout": [ - { product: "ObjectStack Platform", quantity: 1, unit_price: 5e4, discount: 20, description: "Phase-one tenant for the first region, with data-residency controls (multi-phase commitment discount)." }, - { product: "Data Migration Services", quantity: 1, unit_price: 35e3, description: "Phase-one migration of the regional revenue data." }, - { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Business-hours support for phase one." }, - { product: "AI Agent Seat (Annual)", quantity: 10, unit_price: 1e3, description: "Agent seats for the first rollout wave." } - ], - // Campaign-attributed wins — see the campaign metrics note below. - "Lattice Analytics Expansion": [ - { product: "Analytics Add-on", quantity: 2, unit_price: 22e3, description: "Analytics for admissions and alumni engagement." }, - { product: "Admin Training Workshop", quantity: 1, unit_price: 6e3, description: "Analytics enablement day for the institutional-research team." }, - { product: "AI Agent Seat (Annual)", quantity: 20, unit_price: 1e3, description: "Agent seats for the admissions team." } - ], - "Wayne Operations Module Rollout": [ - { product: "ObjectStack Platform", quantity: 2, unit_price: 5e4, description: "Operations tenants for two manufacturing divisions." }, - { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Standard support for the operations rollout." }, - { product: "AI Agent Seat (Annual)", quantity: 11, unit_price: 1e3, description: "Agent seats for the operations planners." } - ], - "Vertex Developer Platform Adoption": [ - { product: "ObjectStack Platform", quantity: 3, unit_price: 5e4, description: "Developer platform tenants for three product teams." }, - { product: "Integration Connector Pack", quantity: 1, unit_price: 16e3, description: "Connector pack for the internal data warehouse." }, - { product: "Analytics Add-on", quantity: 1, unit_price: 22e3, description: "Product-usage analytics for the platform team." }, - { product: "AI Agent Seat (Annual)", quantity: 12, unit_price: 1e3, description: "Agent seats for the developer-experience team." } - ] -}; -var dealValue = (opportunityName, probability) => { - const lines = OPPORTUNITY_LINES[opportunityName]; - if (!lines) throw new Error(`Seed error: no line items authored for opportunity "${opportunityName}"`); - const amount = linesTotal(lines); - return { amount, expected_revenue: Math.round(amount * probability) / 100 }; -}; -var opportunities = defineSeed(Opportunity, { - mode: "upsert", - externalId: "name", - records: [ - { - name: "Acme Platform Upgrade", - crm_account: "Acme Corporation", - ...dealValue("Acme Platform Upgrade", 60), - stage: "proposal", - probability: 60, - close_date: cel31`daysFromNow(30)`, - type: "existing_upgrade", - forecast_category: "commit", - lead_source: "web", - stage_entry_date: celDaysAgo(12), - description: `Upgrade from Standard to Enterprise edition for the -NA + EMEA teams. Drivers: (1) AI agent governance becomes a hard -requirement after their internal compliance review, (2) advanced -analytics seats for the Ops org, (3) priority support SLA.`, - // This sentence used to DATE the workshop itself ("the week of - // close_date - 14d" => daysFromNow(16)) while the seeded event had it at - // daysFromNow(6) and a seeded task chased it at daysFromNow(7) — three - // records, three answers (#1660). The date now lives in exactly ONE - // place, the `crm_event` row in service.seed.ts, and this prose states - // only what stays true however that event is scheduled: it is booked, - // and its invitation has gone out (the attendee builder clamps - // `invited_date` at daysAgo(0), so a planned event's invite is never in - // the future). Re-dating the event therefore cannot strand this line. - // Do not put a date back here, absolute OR relative: a second copy is - // a second thing to drift. - next_step: `Send the revised proposal (Enterprise edition, 18-month term, 12% multi-year discount) to Jordan Park by EOW. The AI governance workshop with their compliance team is already booked and the invitation is out.` - }, - { - name: "Globex Manufacturing Suite", - crm_account: "Globex Industries", - ...dealValue("Globex Manufacturing Suite", 25), - stage: "qualification", - probability: 25, - close_date: cel31`daysFromNow(60)`, - type: "new_business", - forecast_category: "pipeline", - lead_source: "referral", - stage_entry_date: celDaysAgo(45) - }, - { - name: "Wayne Enterprise License", - crm_account: "Wayne Enterprises", - ...dealValue("Wayne Enterprise License", 80), - stage: "negotiation", - probability: 80, - close_date: cel31`daysFromNow(14)`, - type: "new_business", - forecast_category: "commit", - lead_source: "partner", - stage_entry_date: celDaysAgo(7) - }, - { - name: "Initech Cloud Migration", - crm_account: "Initech Solutions", - ...dealValue("Initech Cloud Migration", 40), - stage: "needs_analysis", - probability: 40, - close_date: cel31`daysFromNow(45)`, - type: "existing_upgrade", - forecast_category: "best_case", - lead_source: "event", - stage_entry_date: celDaysAgo(38) - }, - // ─── Closed Won deals (powers KPIs & revenue trends) ──────────────── - { - name: "Acme Annual Renewal 2025", - crm_account: "Acme Corporation", - ...dealValue("Acme Annual Renewal 2025", 100), - stage: "closed_won", - probability: 100, - close_date: cel31`daysAgo(15)`, - stage_entry_date: cel31`daysAgo(15)`, - type: "existing_renewal", - forecast_category: "closed", - lead_source: "partner", - win_reason: "relationship", - description: `Annual renewal of the Acme Standard subscription, signed two weeks ahead of the renewal date. 22% YoY uplift driven by seat expansion in the new EMEA team. Multi-year option declined this round \u2014 they want to see how the platform upgrade lands first.` - }, - { - name: "Stark Medical Pilot", - crm_account: "Stark Medical", - ...dealValue("Stark Medical Pilot", 100), - stage: "closed_won", - probability: 100, - close_date: cel31`daysAgo(50)`, - stage_entry_date: cel31`daysAgo(50)`, - type: "new_business", - forecast_category: "closed", - lead_source: "event", - win_reason: "best_fit" - }, - { - name: "Wayne Q1 Expansion", - crm_account: "Wayne Enterprises", - ...dealValue("Wayne Q1 Expansion", 100), - stage: "closed_won", - probability: 100, - close_date: cel31`daysAgo(95)`, - stage_entry_date: cel31`daysAgo(95)`, - type: "existing_upgrade", - forecast_category: "closed", - lead_source: "web", - win_reason: "better_product" - }, - { - name: "Globex Training Package", - crm_account: "Globex Industries", - ...dealValue("Globex Training Package", 100), - stage: "closed_won", - probability: 100, - close_date: cel31`daysAgo(140)`, - stage_entry_date: cel31`daysAgo(140)`, - type: "new_business", - forecast_category: "closed", - lead_source: "referral", - win_reason: "better_support" - }, - { - name: "Initech Phase 1", - crm_account: "Initech Solutions", - ...dealValue("Initech Phase 1", 100), - stage: "closed_won", - probability: 100, - close_date: cel31`daysAgo(200)`, - stage_entry_date: cel31`daysAgo(200)`, - type: "new_business", - forecast_category: "closed", - lead_source: "web", - win_reason: "better_price" - }, - // ─── Campaign-attributed wins ─────────────────────────────────────── - // `crm_campaign` is what `campaign_attribution_refresh` counts - // (`num_opportunities` / `num_won_opportunities` / the summed - // `actual_revenue`) — on every opportunity insert, update and delete, not - // once at completion. Before #591 not one opportunity carried it, so those - // three metrics were structurally zero and every campaign's seeded - // `actual_revenue` was a number the hook would have overwritten on the - // first attributed write. - // These three wins are what make the marketing ROI numbers below TRUE. - { - name: "Lattice Analytics Expansion", - crm_account: "Lattice Education", - primary_contact: "priya.shah@lattice.example.com", - crm_campaign: "Q3 Enterprise Email Nurture", - ...dealValue("Lattice Analytics Expansion", 100), - stage: "closed_won", - probability: 100, - close_date: cel31`daysAgo(6)`, - stage_entry_date: cel31`daysAgo(6)`, - type: "existing_expansion", - forecast_category: "closed", - lead_source: "email_campaign", - win_reason: "best_fit", - description: "Analytics package for admissions and alumni engagement, sourced from the enterprise nurture track." - }, - { - name: "Wayne Operations Module Rollout", - crm_account: "Wayne Enterprises", - primary_contact: "rwilson@wayne.example.com", - crm_campaign: "Operations Platform Launch", - ...dealValue("Wayne Operations Module Rollout", 100), - stage: "closed_won", - probability: 100, - close_date: cel31`daysAgo(4)`, - stage_entry_date: cel31`daysAgo(4)`, - type: "existing_upgrade", - forecast_category: "closed", - lead_source: "content", - description: "Operations module for two manufacturing divisions, closed off the operations-platform launch program.", - win_reason: "relationship" - }, - { - name: "Vertex Developer Platform Adoption", - crm_account: "Vertex Analytics", - primary_contact: "ethan.brooks@vertex.example.com", - crm_campaign: "Developer Content Marketing Push", - ...dealValue("Vertex Developer Platform Adoption", 100), - stage: "closed_won", - probability: 100, - close_date: cel31`daysAgo(6)`, - stage_entry_date: cel31`daysAgo(6)`, - type: "existing_expansion", - forecast_category: "closed", - lead_source: "content", - description: "Three product teams adopted the developer platform after the technical content series.", - win_reason: "better_product" - }, - // ─── Closed Lost deals (powers win-rate + loss-reason analytics) ──── - // - // Five losses across five distinct `loss_reason` values, and every one of - // them is now MANDATORY rather than decorative: `loss_reason` is - // `requiredWhen` stage is `closed_lost` (#593), so a seeded lost deal - // without one is rejected by the engine at seed time — the demo database - // cannot boot with the empty column that made the loss-reason widget - // unbuildable in the first place. - // - // Their `lead_source` values are chosen so that the sources carrying a loss - // ALSO carry a win (`web`, `referral`, `content`), plus two sources that - // only ever lost (`cold_call`, `advertisement`). That is what makes - // `win_rate_by_lead_source` a real measurement instead of a column of - // 100%s: three rows where both halves of the ratio move, and two rows that - // show what an all-loss source looks like. - { - name: "Acme Add-on (Lost)", - crm_account: "Acme Corporation", - ...dealValue("Acme Add-on (Lost)", 0), - stage: "closed_lost", - probability: 0, - close_date: cel31`daysAgo(25)`, - stage_entry_date: cel31`daysAgo(25)`, - type: "existing_upgrade", - forecast_category: "omitted", - lead_source: "cold_call", - loss_reason: "timing", - loss_details: "Marketing is locked into a 2-year HubSpot contract; the buying window opens when that renews.", - // This line used to end "Revisit in Q3" — a hand-typed calendar quarter - // on a record whose `close_date` is `daysAgo(25)`, so the quarter it told - // a rep to wait for is the one the deal was already lost in, and it - // contradicted this record's own `loss_details`: a 2-year lock does not - // reopen inside the quarter the deal closed in (#1712). Same ruling as - // the `next_step` block above (#1660): no date goes back into this prose, - // absolute OR relative. The renewal is the anchor that stays true however - // this record is dated — which is how `loss_details` and the account - // description already state it. - description: `Tried to bolt on the Marketing Cloud module via cold outbound. Lost because Acme's marketing org is already on a 2-year HubSpot contract. Revisit when that contract comes up for renewal \u2014 that is when the buying window opens.` - }, - { - name: "Stark Expansion (Lost)", - crm_account: "Stark Medical", - ...dealValue("Stark Expansion (Lost)", 0), - stage: "closed_lost", - probability: 0, - close_date: cel31`daysAgo(60)`, - stage_entry_date: cel31`daysAgo(60)`, - type: "new_business", - forecast_category: "omitted", - lead_source: "advertisement", - loss_reason: "no_budget", - loss_details: "Capital freeze on non-clinical systems for the rest of the fiscal year." - }, - { - name: "Globex Line Expansion (Lost)", - crm_account: "Globex Industries", - ...dealValue("Globex Line Expansion (Lost)", 0), - stage: "closed_lost", - probability: 0, - close_date: cel31`daysAgo(35)`, - stage_entry_date: cel31`daysAgo(35)`, - type: "existing_expansion", - forecast_category: "omitted", - lead_source: "referral", - loss_reason: "competitor", - loss_details: "Incumbent MES vendor bundled the two additional lines into an existing master agreement.", - description: "Expansion into two further production lines, lost to the incumbent MES vendor on bundling." - }, - { - name: "Northwind Field Service Pilot (Lost)", - crm_account: "Northwind Energy", - ...dealValue("Northwind Field Service Pilot (Lost)", 0), - stage: "closed_lost", - probability: 0, - close_date: cel31`daysAgo(80)`, - stage_entry_date: cel31`daysAgo(80)`, - type: "new_business", - forecast_category: "omitted", - lead_source: "web", - loss_reason: "price", - loss_details: "Per-technician pricing landed ~30% above the budget the operations director had approved.", - description: "Field-service pilot for the metering crews, lost on price against a cheaper point solution." - }, - { - name: "Apex Compliance Reporting (Lost)", - crm_account: "Apex Logistics", - ...dealValue("Apex Compliance Reporting (Lost)", 0), - stage: "closed_lost", - probability: 0, - close_date: cel31`daysAgo(110)`, - stage_entry_date: cel31`daysAgo(110)`, - type: "new_business", - forecast_category: "omitted", - lead_source: "content", - loss_reason: "features", - loss_details: "No native hours-of-service audit trail; the compliance team could not sign off without it.", - description: "Regulatory reporting pack for the fleet compliance team, lost on a missing audit-trail capability." - }, - // ─── Curated active pipeline ───────────────────────────────────── - // Two cards in each active stage make the kanban immediately legible in - // a customer demo. They also tell a coherent sales story instead of - // overwhelming the board with anonymous generated rows. - // - // PRICED TO STAY DRAGGABLE (#1902). A deal at or above - // `LARGE_DEAL_AMOUNT` is born into `opportunity_approval_on_create`, whose - // approval nodes hold the record with `lockRecord: true` — on the board - // that card refuses every drag with `RECORD_LOCKED`. When nine of the ten - // open deals sat over the line, the one board a demo opens first was - // frozen. So exactly TWO open deals exhibit the approval flow, one per - // tier, and both are in the block above: `Acme Platform Upgrade` - // (manager review only, $100K–$500K) and `Wayne Enterprise License` - // (manager, then director sign-off, over `HIGH_VALUE_DEAL_AMOUNT`). Every - // deal in this block is priced under the line, so each active stage keeps - // at least one card that moves. `test/seed-consistency.test.ts` pins the - // two by name — re-pricing a deal here over $100K goes red there. - { - name: "Northwind Grid Modernization", - crm_account: "Northwind Energy", - primary_contact: "olivia.chen@northwind.example.com", - ...dealValue("Northwind Grid Modernization", 10), - stage: "prospecting", - probability: 10, - close_date: cel31`daysFromNow(72)`, - type: "new_business", - forecast_category: "pipeline", - lead_source: "webinar", - stage_entry_date: celDaysAgo(4), - description: "Northwind is assessing a unified grid-modernization program after an executive webinar.", - next_step: "Confirm discovery participants and agree the operational-data assessment scope." - }, - { - name: "Lattice Student Success Platform", - crm_account: "Lattice Education", - primary_contact: "priya.shah@lattice.example.com", - crm_campaign: "Developer Content Marketing Push", - ...dealValue("Lattice Student Success Platform", 10), - stage: "prospecting", - probability: 10, - close_date: cel31`daysFromNow(96)`, - type: "new_business", - forecast_category: "pipeline", - lead_source: "content", - stage_entry_date: celDaysAgo(11), - description: "A new student-success initiative sourced from the higher-education content series.", - next_step: "Invite the operations sponsor to the discovery workshop." - }, - { - name: "Vertex Analytics Expansion", - crm_account: "Vertex Analytics", - primary_contact: "ethan.brooks@vertex.example.com", - ...dealValue("Vertex Analytics Expansion", 25), - stage: "qualification", - probability: 25, - close_date: cel31`daysFromNow(52)`, - type: "existing_expansion", - forecast_category: "pipeline", - lead_source: "partner", - stage_entry_date: celDaysAgo(8), - description: "Vertex wants to extend the platform from its data team to the full revenue organization.", - next_step: "Validate the buying committee, budget owner and expansion timeline." - }, - { - name: "Apex Logistics Data Hub", - crm_account: "Apex Logistics", - primary_contact: "marcus.reed@apexlogistics.example.com", - ...dealValue("Apex Logistics Data Hub", 40), - stage: "needs_analysis", - probability: 40, - close_date: cel31`daysFromNow(38)`, - type: "new_business", - forecast_category: "best_case", - lead_source: "partner", - stage_entry_date: celDaysAgo(18), - description: "Apex is mapping its fragmented commercial systems before committing to a data-hub program.", - next_step: "Complete the architecture workshop and quantify the integration backlog." - }, - { - name: "Lattice Education Renewal", - crm_account: "Lattice Education", - primary_contact: "priya.shah@lattice.example.com", - crm_campaign: "Q3 Enterprise Email Nurture", - ...dealValue("Lattice Education Renewal", 60), - stage: "proposal", - probability: 60, - close_date: cel31`daysFromNow(24)`, - type: "existing_renewal", - forecast_category: "commit", - lead_source: "email_campaign", - stage_entry_date: celDaysAgo(6), - description: "Renewal proposal adds student-success automation and an expanded analytics package.", - next_step: "Review the two-year option with procurement before the executive sponsor meeting." - }, - { - name: "Vertex Enterprise Rollout", - crm_account: "Vertex Analytics", - primary_contact: "ethan.brooks@vertex.example.com", - ...dealValue("Vertex Enterprise Rollout", 80), - stage: "negotiation", - probability: 80, - close_date: cel31`daysFromNow(11)`, - type: "existing_expansion", - forecast_category: "commit", - lead_source: "referral", - stage_entry_date: celDaysAgo(3), - description: "Phase one of an enterprise rollout, negotiated around phased deployment and data-residency requirements.", - next_step: "Resolve the final security addendum and confirm the procurement signature date." - } - ] -}); - -// src/sales/data/activity.seed.ts -import { defineSeed as defineSeed2 } from "@objectstack/spec/data"; -import { cel as cel32 } from "@objectstack/spec"; -var tasks = defineSeed2(Task, { - mode: "upsert", - externalId: "subject", - records: [ - { - subject: "Follow up with Acme on proposal", - description: "Send Jordan Park the revised Enterprise proposal and a 30-min calendar slot to walk through the AI governance section.", - status: "not_started", - priority: "high", - priority_rank: 3, - due_date: cel32`daysFromNow(2)`, - related_to_type: "crm_opportunity", - related_to_account: "Acme Corporation", - related_to_opportunity: "Acme Platform Upgrade" - }, - { - // The workshop this task asks someone to book is ALREADY on the - // calendar: the `Acme — AI agent governance workshop` event lower in - // this file is `planned` at daysFromNow(6), and the attendee builder - // dates its invitation `daysAgo(max(-6 + invitedDaysBefore(9), 0))` = - // daysAgo(3) — already sent, and already answered `tentative`. So the - // booking task is DONE, and it was done the day the invitation went - // out. An open "schedule it" task beside a booked-and-invited meeting - // is the contradiction itself, not a due date to nudge (#1660). - // - // The EVENT owns the workshop's date. Nothing here restates it — both - // dates below derive from the invitation instant — so there is no - // second copy to drift out of step. - subject: "Acme \u2014 schedule AI governance workshop", - description: "Block a 90-min joint workshop with Acme\u2019s compliance team to walk through how HotCRM agents handle data scoping, RBAC, audit trails, and human-in-the-loop. Pre-read: ADR-0007 + the governance demo deck.", - status: "completed", - priority: "high", - priority_rank: 3, - due_date: cel32`daysAgo(3)`, - completed_date: cel32`daysAgo(3)`, - // Hooks don't run over seeds — mirror what task_completion would stamp. - is_completed: true, - progress_percent: 100, - related_to_type: "crm_opportunity", - related_to_account: "Acme Corporation", - related_to_opportunity: "Acme Platform Upgrade" - }, - { - subject: "Acme \u2014 close out login-issues ticket before SLA", - description: "Confirm engineering has the EMEA SSO clock-skew patch ready, deploy to Acme\u2019s tenant, and send Lisa Kim a customer-facing post-mortem.", - status: "in_progress", - priority: "urgent", - priority_rank: 4, - due_date: cel32`daysFromNow(1)`, - related_to_type: "crm_case", - related_to_account: "Acme Corporation", - related_to_case: "Login issues after platform upgrade" - }, - { - subject: "Schedule demo for Globex team", - status: "in_progress", - priority: "normal", - priority_rank: 2, - due_date: cel32`daysFromNow(5)`, - related_to_type: "crm_account", - related_to_account: "Globex Industries" - }, - { - subject: "Prepare contract for Wayne Enterprises", - status: "not_started", - priority: "urgent", - priority_rank: 4, - due_date: cel32`daysFromNow(1)`, - related_to_type: "crm_account", - related_to_account: "Wayne Enterprises" - }, - { - subject: "Send welcome package to Stark Medical", - status: "completed", - priority: "low", - priority_rank: 1, - completed_date: cel32`daysAgo(2)`, - // Hooks don't run over seeds — mirror what task_completion would stamp. - is_completed: true, - progress_percent: 100, - related_to_type: "crm_account", - related_to_account: "Stark Medical" - }, - { - // Internal housekeeping task — deliberately unparented (the - // related_to_required rule is a warning, not an error). - subject: "Update CRM pipeline report", - status: "not_started", - priority: "normal", - priority_rank: 2, - due_date: cel32`daysFromNow(7)` - } - ] -}); -var EVENT_RELATED_FIELD = { - crm_account: "related_to_account", - crm_contact: "related_to_contact", - crm_opportunity: "related_to_opportunity", - crm_lead: "related_to_lead", - crm_case: "related_to_case" -}; -var celClock = (daysAgo, hour, minute) => { - const clock = `${hour}h${minute}m`; - return daysAgo >= 0 ? cel32`daysAgo(${daysAgo}) + duration(${clock})` : cel32`daysFromNow(${-daysAgo}) + duration(${clock})`; -}; -var EVENT_SPECS = [ - // ─── Acme Corporation — the hero account, worked across every parent ──── - { - subject: "Acme \u2014 Enterprise edition walkthrough", - type: "demo", - status: "held", - daysAgo: 2, - at: [10, 0], - minutes: 60, - relatedType: "crm_opportunity", - relatedKey: "Acme Platform Upgrade", - account: "Acme Corporation", - location: "Zoom", - outcome: "Walked the Ops team through agent governance and the analytics seats. Revised proposal to follow this week.", - attendees: [{ contact: "john.smith@acme.example.com", response: "accepted" }] - }, - { - subject: "Acme \u2014 proposal follow-up call", - type: "call", - status: "held", - daysAgo: 5, - at: [15, 30], - minutes: 25, - relatedType: "crm_contact", - relatedKey: "john.smith@acme.example.com", - account: "Acme Corporation", - outcome: "Procurement wants an 18-month term. Pricing to be re-cut before the governance workshop.", - attendees: [{ contact: "john.smith@acme.example.com", response: "accepted" }] - }, - { - subject: "Acme \u2014 AI governance scoping session", - type: "meeting", - status: "held", - daysAgo: 12, - at: [9, 0], - minutes: 90, - relatedType: "crm_account", - relatedKey: "Acme Corporation", - location: "Google Meet", - outcome: "Agreed the workshop agenda: data scoping, RBAC, audit trails, human-in-the-loop.", - attendees: [{ contact: "john.smith@acme.example.com", response: "accepted" }] - }, - { - subject: "Acme \u2014 login incident status call", - type: "call", - status: "held", - daysAgo: 16, - at: [8, 30], - minutes: 20, - relatedType: "crm_case", - relatedKey: "Login issues after platform upgrade", - account: "Acme Corporation", - outcome: "Confirmed the EMEA SSO clock-skew hypothesis; engineering reproducing in staging.", - attendees: [{ contact: "john.smith@acme.example.com", response: "accepted" }] - }, - { - subject: "Acme \u2014 renewal signature review", - type: "meeting", - status: "held", - daysAgo: 20, - at: [14, 0], - minutes: 45, - relatedType: "crm_opportunity", - relatedKey: "Acme Annual Renewal 2025", - account: "Acme Corporation", - outcome: "Signed two weeks ahead of the renewal date. Multi-year deferred to the upgrade decision.", - attendees: [{ contact: "john.smith@acme.example.com", response: "accepted" }] - }, - { - subject: "Acme \u2014 San Francisco HQ business review", - type: "onsite_visit", - status: "held", - daysAgo: 33, - at: [13, 0], - minutes: 120, - relatedType: "crm_account", - relatedKey: "Acme Corporation", - location: "500 Howard Street, Suite 400, San Francisco", - outcome: "Quarterly review with the CTO org. Expansion into the EMEA team confirmed as the next motion.", - attendees: [{ contact: "john.smith@acme.example.com", response: "accepted" }] - }, - // ─── Wayne Enterprises — a deal in negotiation ────────────────────────── - { - subject: "Wayne \u2014 enterprise license negotiation", - type: "meeting", - status: "held", - daysAgo: 3, - at: [16, 0], - minutes: 60, - relatedType: "crm_opportunity", - relatedKey: "Wayne Enterprise License", - account: "Wayne Enterprises", - location: "Zoom", - outcome: "Volume tier agreed at 20 tenants. Security addendum is the last open item.", - attendees: [{ contact: "rwilson@wayne.example.com", response: "accepted" }] - }, - { - subject: "Wayne \u2014 security addendum walkthrough", - type: "call", - status: "held", - daysAgo: 8, - at: [11, 0], - minutes: 30, - relatedType: "crm_contact", - relatedKey: "rwilson@wayne.example.com", - account: "Wayne Enterprises", - outcome: "Legal to return redlines within the week.", - attendees: [{ contact: "rwilson@wayne.example.com", response: "accepted" }] - }, - { - subject: "Wayne \u2014 platform governance webinar", - type: "webinar", - status: "held", - daysAgo: 26, - at: [15, 0], - minutes: 60, - relatedType: "crm_account", - relatedKey: "Wayne Enterprises", - location: "https://acme.example.com/webinars/governance", - outcome: "Four business units attended; two asked for their own rollout plan.", - attendees: [{ contact: "rwilson@wayne.example.com", response: "accepted" }] - }, - { - subject: "Wayne \u2014 bulk import rollout check-in", - type: "call", - status: "held", - daysAgo: 45, - at: [10, 30], - minutes: 25, - relatedType: "crm_case", - relatedKey: "Request: bulk import via CSV", - account: "Wayne Enterprises", - outcome: "CSV import shipped and documented; the customer closed the request out on the call.", - attendees: [{ contact: "rwilson@wayne.example.com", response: "accepted" }] - }, - // ─── Vertex Analytics — expansion, then an enterprise rollout ─────────── - { - subject: "Vertex \u2014 rollout phasing and data residency", - type: "meeting", - status: "held", - daysAgo: 1, - at: [9, 30], - minutes: 75, - relatedType: "crm_opportunity", - relatedKey: "Vertex Enterprise Rollout", - account: "Vertex Analytics", - location: "Zoom", - outcome: "Phase 1 scoped to four regions. Residency controls to be confirmed with their security team.", - attendees: [{ contact: "ethan.brooks@vertex.example.com", response: "accepted" }] - }, - { - subject: "Vertex \u2014 revenue analytics demo", - type: "demo", - status: "held", - daysAgo: 10, - at: [14, 30], - minutes: 45, - relatedType: "crm_opportunity", - relatedKey: "Vertex Analytics Expansion", - account: "Vertex Analytics", - location: "Zoom", - outcome: "Sales, marketing and service leads all asked for their own workspace \u2014 the expansion case makes itself.", - attendees: [{ contact: "ethan.brooks@vertex.example.com", response: "accepted" }] - }, - { - subject: "Vertex \u2014 expansion buying committee call", - type: "call", - status: "held", - daysAgo: 19, - at: [16, 30], - minutes: 30, - relatedType: "crm_contact", - relatedKey: "ethan.brooks@vertex.example.com", - account: "Vertex Analytics", - outcome: "CRO owns the budget; the data team stays the technical sponsor.", - attendees: [{ contact: "ethan.brooks@vertex.example.com", response: "accepted" }] - }, - { - subject: "Vertex \u2014 developer platform retrospective", - type: "meeting", - status: "held", - daysAgo: 38, - at: [11, 0], - minutes: 60, - relatedType: "crm_account", - relatedKey: "Vertex Analytics", - outcome: "Three product teams live on the developer platform; usage analytics is the next ask.", - attendees: [{ contact: "ethan.brooks@vertex.example.com", response: "accepted" }] - }, - // ─── Stark Medical — the partner motion ──────────────────────────────── - { - subject: "Stark Medical \u2014 Toronto clinical operations visit", - type: "onsite_visit", - status: "held", - daysAgo: 52, - at: [9, 0], - minutes: 180, - relatedType: "crm_account", - relatedKey: "Stark Medical", - location: "181 Bay Street, Suite 2200, Toronto", - outcome: "Two clinical service lines live on the pilot. Device-servicing expansion parked on budget.", - attendees: [{ contact: "emily.d@starkmed.example.com", response: "accepted" }] - }, - // ─── Leads: the only held rows that touch a prospect's own clock ──────── - { - subject: "CloudFirst \u2014 qualification call with Lisa Thompson", - type: "call", - status: "held", - daysAgo: 1, - at: [11, 0], - minutes: 30, - relatedType: "crm_lead", - relatedKey: "lisa.t@cloudfirst.example.com", - outcome: "Budget confirmed and a technical evaluation agreed \u2014 qualified.", - attendees: [{ lead: "lisa.t@cloudfirst.example.com", response: "accepted" }] - }, - { - subject: "EduTech Labs \u2014 discovery call with David Kim", - type: "call", - status: "held", - daysAgo: 4, - at: [13, 0], - minutes: 30, - relatedType: "crm_lead", - relatedKey: "dkim@edutechlabs.example.com", - outcome: "Replacing spreadsheets across admissions. Referral source confirmed.", - attendees: [{ lead: "dkim@edutechlabs.example.com", response: "accepted" }] - }, - // The earlier touch on each of the two leads above, so each lead's Activity - // tab reads as a short history rather than a single row. Both leads already - // carry `last_contacted_date: today()` for their later call, so a second held - // row moves no recency clock (`event_activity_bubble` stamps the seed moment). - { - subject: "CloudFirst \u2014 follow-up meeting after the Cloud Summit booth", - type: "meeting", - status: "held", - daysAgo: 8, - at: [15, 0], - minutes: 45, - relatedType: "crm_lead", - relatedKey: "lisa.t@cloudfirst.example.com", - outcome: "Walked through pipeline and forecasting. Asked for a qualification call with finance.", - attendees: [{ lead: "lisa.t@cloudfirst.example.com", response: "accepted" }] - }, - { - subject: "EduTech Labs \u2014 referral intro call with David Kim", - type: "call", - status: "held", - daysAgo: 9, - at: [10, 0], - minutes: 15, - relatedType: "crm_lead", - relatedKey: "dkim@edutechlabs.example.com", - outcome: "Warm intro from the referring partner. Booked a proper discovery call.", - attendees: [{ lead: "dkim@edutechlabs.example.com", response: "accepted" }] - }, - // ─── Booked, not held: the calendar ahead ─────────────────────────────── - // These are what `status` exists for. Not one of them moves a recency clock, - // and the three re-engagement rows below sit on the accounts the churn tiles - // count — which is the demonstration, not an oversight. - { - subject: "Acme \u2014 AI agent governance workshop", - type: "meeting", - status: "planned", - daysAgo: -6, - at: [9, 0], - minutes: 90, - relatedType: "crm_opportunity", - relatedKey: "Acme Platform Upgrade", - account: "Acme Corporation", - location: "Google Meet", - description: "Joint workshop with Acme compliance: data scoping, RBAC, audit trails, human-in-the-loop.", - attendees: [{ contact: "john.smith@acme.example.com", response: "tentative" }], - invitedDaysBefore: 9 - }, - { - subject: "Wayne \u2014 procurement signature call", - type: "meeting", - status: "planned", - daysAgo: -1, - at: [11, 0], - minutes: 30, - relatedType: "crm_opportunity", - relatedKey: "Wayne Enterprise License", - account: "Wayne Enterprises", - description: "Confirm the signature date once the security addendum is closed.", - attendees: [{ contact: "rwilson@wayne.example.com", response: "accepted" }], - invitedDaysBefore: 4 - }, - { - subject: "Globex \u2014 manufacturing suite demo", - type: "demo", - status: "planned", - daysAgo: -5, - at: [15, 0], - minutes: 60, - relatedType: "crm_opportunity", - relatedKey: "Globex Manufacturing Suite", - account: "Globex Industries", - location: "Zoom", - description: "Plant-operations demo for the six-site rollout, ahead of the qualification review.", - attendees: [{ contact: "sarah.j@globex.example.com", response: "accepted" }], - invitedDaysBefore: 8 - }, - { - subject: "Lattice \u2014 renewal proposal review", - type: "meeting", - status: "planned", - daysAgo: -3, - at: [10, 0], - minutes: 45, - relatedType: "crm_opportunity", - relatedKey: "Lattice Education Renewal", - account: "Lattice Education", - description: "Walk procurement through the two-year option before the executive sponsor meeting.", - attendees: [{ contact: "priya.shah@lattice.example.com", response: "accepted" }], - invitedDaysBefore: 6 - }, - { - subject: "Initech \u2014 re-engagement call before renewal", - type: "call", - status: "planned", - daysAgo: -2, - at: [14, 0], - minutes: 30, - relatedType: "crm_account", - relatedKey: "Initech Solutions", - description: "Nobody has spoken to Initech in ten weeks and the renewal is 75 days out. Re-open the relationship.", - attendees: [{ contact: "mchen@initech.example.com", response: "no_response" }], - invitedDaysBefore: 5 - }, - { - subject: "Northwind \u2014 grid modernization discovery workshop", - type: "meeting", - status: "planned", - daysAgo: -7, - at: [9, 30], - minutes: 120, - relatedType: "crm_opportunity", - relatedKey: "Northwind Grid Modernization", - account: "Northwind Energy", - location: "Leopoldstrasse 21, Munich", - description: "Confirm discovery participants and agree the operational-data assessment scope.", - attendees: [{ contact: "olivia.chen@northwind.example.com", response: "tentative" }], - invitedDaysBefore: 10 - }, - { - subject: "Apex Logistics \u2014 data hub re-engagement call", - type: "call", - status: "planned", - daysAgo: -4, - at: [16, 0], - minutes: 30, - relatedType: "crm_account", - relatedKey: "Apex Logistics", - description: "The data-hub evaluation has been silent for a quarter. Re-establish the commercial sponsor.", - attendees: [{ contact: "marcus.reed@apexlogistics.example.com", response: "no_response" }], - invitedDaysBefore: 6 - }, - { - subject: "NextGen Retail \u2014 first discovery call with Alice Martinez", - type: "call", - status: "planned", - daysAgo: -2, - at: [15, 0], - minutes: 30, - relatedType: "crm_lead", - relatedKey: "alice@nextgenretail.example.com", - description: "Inbound web lead, booked on her follow-up date.", - attendees: [{ lead: "alice@nextgenretail.example.com", response: "no_response" }], - invitedDaysBefore: 3 - }, - // ─── Neither held nor booked ──────────────────────────────────────────── - // `duration_minutes` is 0 on both, exactly as `event_schedule_derive` - // recomputes it: a meeting nobody attended occupies nobody's time, while the - // calendar slot it was booked into stays on the record as evidence of the - // attempt. - { - subject: "Globex \u2014 line expansion review", - type: "meeting", - status: "cancelled", - daysAgo: 30, - at: [14, 0], - minutes: 60, - relatedType: "crm_opportunity", - relatedKey: "Globex Line Expansion (Lost)", - account: "Globex Industries", - description: "Cancelled by the customer: the incumbent MES vendor had already bundled the two lines.", - attendees: [{ contact: "sarah.j@globex.example.com", response: "declined" }], - invitedDaysBefore: 7 - }, - { - subject: "Initech \u2014 SSO configuration check-in", - type: "call", - status: "no_show", - daysAgo: 55, - at: [10, 0], - minutes: 30, - relatedType: "crm_account", - relatedKey: "Initech Solutions", - description: "Customer did not join. The last attempt to reach Initech before the account went quiet.", - attendees: [{ contact: "mchen@initech.example.com", response: "no_response" }], - invitedDaysBefore: 4 - } -]; -var endClock = (spec) => { - const total = spec.at[0] * 60 + spec.at[1] + spec.minutes; - return [Math.floor(total / 60), total % 60]; -}; -var events = defineSeed2(Event, { - mode: "upsert", - externalId: "subject", - records: EVENT_SPECS.map((spec) => { - const [endHour, endMinute] = endClock(spec); - return { - subject: spec.subject, - type: spec.type, - status: spec.status, - start_datetime: celClock(spec.daysAgo, spec.at[0], spec.at[1]), - end_datetime: celClock(spec.daysAgo, endHour, endMinute), - // Authored rather than left to the hook, and authored to the value the - // hook computes: `event_schedule_derive` measures the gap between the two - // timestamps above, then zeroes it for a cancelled / no-show row. Both - // branches agree with this literal, so the figure is right whether or not - // hooks fire over the seed write (`./_shared.ts`, doctrine rule 2). - duration_minutes: spec.status === "cancelled" || spec.status === "no_show" ? 0 : spec.minutes, - all_day: false, - related_to_type: spec.relatedType, - [EVENT_RELATED_FIELD[spec.relatedType]]: spec.relatedKey, - // The account link is authored on every row that has one, including rows - // whose `related_to_type` is the contact / opportunity / case — the same - // shape the task seeds use, and what fills the ACCOUNT's activity list. - ...spec.account && spec.relatedType !== "crm_account" ? { related_to_account: spec.account } : {}, - ...spec.location ? { location: spec.location } : {}, - ...spec.description ? { description: spec.description } : {}, - ...spec.outcome ? { outcome_notes: spec.outcome } : {} - // No `owner_id`: a seed cannot name a user (see `objectstack.composition.ts`, - // "A seed can't name a user"), so these rows land ownerless and the - // platform's seed-ownership claim hands them to the first administrator - // when the seed settles (#671, #1892). - }; - }) -}); -var attendeeRecords = (kind) => EVENT_SPECS.flatMap( - (spec) => spec.attendees.filter((a) => kind === "lead" ? a.lead : a.contact).map((a) => ({ - crm_event: spec.subject, - attendee_type: kind, - ...kind === "lead" ? { crm_lead: a.lead } : { crm_contact: a.contact }, - response: a.response, - is_organizer: false, - // The invitation predates the slot. Clamped at 0 so a meeting booked - // for the day after tomorrow was invited today, never tomorrow. - invited_date: celDaysAgo(Math.max(spec.daysAgo + (spec.invitedDaysBefore ?? 3), 0)) - })) -); -var eventAttendeesFromContacts = defineSeed2(EventAttendee, { - mode: "upsert", - externalId: ["crm_event", "crm_contact"], - records: attendeeRecords("contact") -}); -var eventAttendeesFromLeads = defineSeed2(EventAttendee, { - mode: "upsert", - externalId: ["crm_event", "crm_lead"], - records: attendeeRecords("lead") -}); -var SYS_ACTIVITY_RETENTION_DAYS = 14; -var LOGGED_SUMMARY_PREFIX = { - call: "", - meeting: "Meeting: " -}; -var leadInteractionPointers = { - object: "sys_activity", - mode: "upsert", - // One timeline pointer per rich source record, exactly as the action writes - // it. Matched on the RESOLVED ids, so replay boots dedupe. - externalId: ["source_object", "source_id"], - records: EVENT_SPECS.filter( - (spec) => spec.relatedType === "crm_lead" && spec.status === "held" && LOGGED_SUMMARY_PREFIX[spec.type] !== void 0 && spec.daysAgo >= 0 && spec.daysAgo < SYS_ACTIVITY_RETENTION_DAYS - ).map((spec) => { - const [endHour, endMinute] = endClock(spec); - return { - // `held` is what both actions write as `completed` — the `task` feed - // kind, the one the lead Activity tab renders. - type: "completed", - // The action's own summary: prefix, subject, duration in brackets. - summary: `${LOGGED_SUMMARY_PREFIX[spec.type]}${spec.subject} (${spec.minutes} min)`, - // Logged when the slot ended. - timestamp: celClock(spec.daysAgo, endHour, endMinute), - object_name: "crm_lead", - record_id: spec.relatedKey, - source_object: "crm_event", - source_id: spec.subject, - metadata: JSON.stringify({ - kind: spec.type, - duration_minutes: spec.minutes, - notes: spec.outcome ?? "", - attendee_count: spec.attendees.length - }) - }; - }) -}; - -// src/sales/data/forecast.seed.ts -import { defineSeed as defineSeed3 } from "@objectstack/spec/data"; -import { cel as cel33 } from "@objectstack/spec"; -var FORECAST_MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; -var forecastIsoDate = (d) => `${d.getUTCFullYear()}-${String(d.getUTCMonth() + 1).padStart(2, "0")}-${String(d.getUTCDate()).padStart(2, "0")}`; -var forecastQuarterLabel = (d) => `Q${Math.floor(d.getUTCMonth() / 3) + 1} ${d.getUTCFullYear()}`; -var forecastMonthLabel = (d) => `${FORECAST_MONTHS[d.getUTCMonth()]} ${d.getUTCFullYear()}`; -var forecastNow = /* @__PURE__ */ new Date(); -var forecastYear = forecastNow.getUTCFullYear(); -var forecastMonth = forecastNow.getUTCMonth(); -var forecastQuarterMonth = Math.floor(forecastMonth / 3) * 3; -var thisMonthStart = new Date(Date.UTC(forecastYear, forecastMonth, 1)); -var thisMonthEnd = new Date(Date.UTC(forecastYear, forecastMonth + 1, 0)); -var lastQuarterStart = new Date(Date.UTC(forecastYear, forecastQuarterMonth - 3, 1)); -var lastQuarterEnd = new Date(Date.UTC(forecastYear, forecastQuarterMonth, 0)); -var quarterStartAgo = (n) => new Date(Date.UTC(forecastYear, forecastQuarterMonth - 3 * n, 1)); -var quarterEndAgo = (n) => new Date(Date.UTC(forecastYear, forecastQuarterMonth - 3 * (n - 1), 0)); -var monthStartAgo = (n) => new Date(Date.UTC(forecastYear, forecastMonth - n, 1)); -var monthEndAgo = (n) => new Date(Date.UTC(forecastYear, forecastMonth - n + 1, 0)); -var closedPeriod = (seed_key, period, start, end, quota, closed, open, notes) => ({ - seed_key, - period, - period_label: period === "quarter" ? forecastQuarterLabel(start) : forecastMonthLabel(start), - period_start: forecastIsoDate(start), - period_end: forecastIsoDate(end), - snapshot_date: forecastIsoDate(end), - quota, - pipeline_amount: open.pipeline, - best_case_amount: open.bestCase, - commit_amount: open.commit, - closed_amount: closed, - source: "scheduled", - notes -}); -var forecasts = defineSeed3(Forecast, { - mode: "upsert", - externalId: "seed_key", - records: [ - { - seed_key: "demo_month_current", - period: "month", - period_label: forecastMonthLabel(thisMonthStart), - period_start: forecastIsoDate(thisMonthStart), - period_end: forecastIsoDate(thisMonthEnd), - snapshot_date: cel33`today()`, - quota: 5e5, - pipeline_amount: 76e4, - best_case_amount: 54e4, - commit_amount: 36e4, - closed_amount: 295e3, - source: "scheduled", - notes: "Healthy coverage; two commit deals expected to close this week." - }, - { - seed_key: "demo_quarter_minus_1", - period: "quarter", - period_label: forecastQuarterLabel(lastQuarterStart), - period_start: forecastIsoDate(lastQuarterStart), - period_end: forecastIsoDate(lastQuarterEnd), - snapshot_date: forecastIsoDate(lastQuarterEnd), - quota: 14e5, - pipeline_amount: 24e4, - best_case_amount: 15e4, - commit_amount: 95e3, - closed_amount: 1485e3, - source: "scheduled", - notes: "Closed at 106% of quota." - }, - closedPeriod( - "demo_quarter_minus_2", - "quarter", - quarterStartAgo(2), - quarterEndAgo(2), - 13e5, - 1196e3, - { pipeline: 285e3, bestCase: 19e4, commit: 12e4 }, - "Closed at 92% of quota \u2014 two enterprise deals slipped into the next quarter." - ), - closedPeriod( - "demo_quarter_minus_3", - "quarter", - quarterStartAgo(3), - quarterEndAgo(3), - 12e5, - 1308e3, - { pipeline: 195e3, bestCase: 13e4, commit: 85e3 }, - "Closed at 109% of quota, carried by the enterprise renewal cohort." - ), - closedPeriod( - "demo_quarter_minus_4", - "quarter", - quarterStartAgo(4), - quarterEndAgo(4), - 11e5, - 1045e3, - { pipeline: 165e3, bestCase: 11e4, commit: 7e4 }, - "Closed at 95% of quota in the first quarter on the new territory model." - ), - closedPeriod( - "demo_month_minus_1", - "month", - monthStartAgo(1), - monthEndAgo(1), - 48e4, - 505e3, - { pipeline: 96e3, bestCase: 62e3, commit: 4e4 }, - "Closed at 105% of quota; the expansion motion covered a soft new-business month." - ), - closedPeriod( - "demo_month_minus_2", - "month", - monthStartAgo(2), - monthEndAgo(2), - 46e4, - 414e3, - { pipeline: 92e3, bestCase: 58e3, commit: 35e3 }, - "Closed at 90% of quota \u2014 summer slowdown across the mid-market segment." - ) - ] -}); - -// src/sales/data/index.ts -var COMPOSITION_ENV_VAR = "HOTCRM_COMPOSITION"; -var HOTCRM_COMPOSITIONS = ["default", "saas"]; -function resolveComposition(raw = process.env[COMPOSITION_ENV_VAR]) { - const value = (raw ?? "").trim(); - if (value === "") return "default"; - if (HOTCRM_COMPOSITIONS.includes(value)) { - return value; - } - throw new Error( - `${COMPOSITION_ENV_VAR}="${value}" is not a HotCRM composition. Expected one of: ${HOTCRM_COMPOSITIONS.join(", ")} (or leave it unset for 'default').` - ); -} - -// src/revenue/data/catalog.seed.ts -import { defineSeed as defineSeed4 } from "@objectstack/spec/data"; -var products = defineSeed4(Product, { - mode: "upsert", - externalId: "name", - records: [ - { - name: "ObjectStack Platform", - description: "The enterprise edition: unlimited objects, AI agents, governance and audit.", - category: "software", - family: "enterprise", - sku: "OS-PLAT-ENT", - list_price: 5e4, - cost: 12e3, - is_active: true - }, - { - name: "ObjectStack Platform (SMB Edition)", - description: "The mid-market edition: core CRM objects and automation, capped agent usage.", - category: "software", - family: "smb", - sku: "OS-PLAT-SMB", - list_price: 18e3, - cost: 4500, - is_active: true - }, - { - name: "Cloud Hosting (Annual)", - description: "Managed hosting with regional data residency and a 99.9% availability target.", - category: "subscription", - family: "cloud", - sku: "OS-CLOUD-HOST", - list_price: 12e3, - cost: 4200, - is_active: true - }, - { - name: "Sandbox Environment (Annual)", - description: "A full-copy non-production environment for testing metadata changes before release.", - category: "subscription", - family: "cloud", - sku: "OS-CLOUD-SBX", - list_price: 7500, - cost: 2600, - is_active: true - }, - { - name: "AI Agent Seat (Annual)", - description: "A named-user seat for the Co-Pilot and agent surfaces, billed annually.", - category: "subscription", - family: "cloud", - sku: "OS-AI-SEAT", - list_price: 1e3, - cost: 260, - is_active: true - }, - { - name: "Analytics Add-on", - description: "Dashboards, cubes and scheduled reporting for the revenue organization.", - category: "software", - family: "enterprise", - sku: "OS-ADDON-ANL", - list_price: 22e3, - cost: 6500, - is_active: true - }, - { - name: "Integration Connector Pack", - description: "Pre-built connectors for ERP, marketing automation and data warehouse targets.", - category: "software", - family: "enterprise", - sku: "OS-ADDON-INT", - list_price: 16e3, - cost: 5200, - is_active: true - }, - { - name: "Field Service Mobile", - description: "Offline-capable mobile app for field technicians and route-based service work.", - category: "software", - family: "smb", - sku: "OS-ADDON-FSM", - list_price: 14e3, - cost: 4200, - is_active: true - }, - { - name: "Premium Support", - description: "24\xD77 support with a one-hour P1 response target and a named technical account manager.", - category: "support", - family: "services", - sku: "OS-SUP-PREM", - list_price: 25e3, - cost: 9e3, - is_active: true - }, - { - name: "Standard Support", - description: "Business-hours support with a next-business-day response target.", - category: "support", - family: "services", - sku: "OS-SUP-STD", - list_price: 9e3, - cost: 3600, - is_active: true - }, - { - name: "Implementation Services", - description: "Guided implementation: discovery, metadata build, integration and go-live support.", - category: "service", - family: "services", - sku: "OS-SVC-IMPL", - list_price: 75e3, - cost: 41e3, - is_active: true - }, - { - name: "Data Migration Services", - description: "Extraction, mapping and reconciliation of legacy CRM and spreadsheet data.", - category: "service", - family: "services", - sku: "OS-SVC-MIGR", - list_price: 35e3, - cost: 19e3, - is_active: true - }, - { - name: "Admin Training Workshop", - description: "A one-day workshop for administrators on metadata, permissions and analytics.", - category: "service", - family: "services", - sku: "OS-SVC-TRN", - list_price: 6e3, - cost: 2400, - is_active: true - } - ] -}); -var catalogPrice = (productName) => { - const product = products.records.find((r) => r.name === productName); - if (!product || typeof product.list_price !== "number") { - throw new Error(`Seed error: no catalog product named "${productName}"`); - } - return product.list_price; -}; -var lineItemRecords = (parentField, table) => Object.entries(table).flatMap( - ([parent, lines]) => lines.map((l, i) => ({ - [parentField]: parent, - crm_product: l.product, - description: l.description, - quantity: l.quantity, - list_price: catalogPrice(l.product), - unit_price: l.unit_price, - discount: l.discount ?? 0, - line_number: i + 1 - })) -); - -// src/revenue/data/opportunity-line-item.seed.ts -import { defineSeed as defineSeed5 } from "@objectstack/spec/data"; -var opportunityLineItems = defineSeed5(OpportunityLineItem, { - mode: "upsert", - externalId: ["crm_opportunity", "crm_product"], - records: lineItemRecords("crm_opportunity", OPPORTUNITY_LINES) -}); - -// src/revenue/data/revenue.seed.ts -import { defineSeed as defineSeed6 } from "@objectstack/spec/data"; -import { cel as cel34 } from "@objectstack/spec"; -var contracts = defineSeed6(Contract, { - mode: "upsert", - externalId: "description", - records: [ - // The one ACTIVATED contract in the app — `contract_renewal`, - // `contract_expiration` and `billing_handoff` all filter on exactly that - // status — so it has to be a contract that was really signed, off a deal - // that was really won. - // - // It used to link `Acme Platform Upgrade` and carry that deal's line total - // (150000) while that deal is still `proposal`, closing `daysFromNow(30)` - // (#1661). Nothing in this app can produce that pairing: `quote_on_accepted` - // close-wins an opportunity the moment its quote is accepted, and - // `closed_won` is TERMINAL in `opportunity_stage_progression` — so a signed - // contract can never sit on an open deal, from either direction. - // - // Every field below is now derived from `Acme Annual Renewal 2025`, the - // `closed_won` deal this contract's own description was already describing: - // contract_value — that deal's line-item total, which is also the ARR the - // account description reports. 150000 was the upgrade's - // total, i.e. the value came from a different deal than - // the link did; - // signed_date — its `close_date`: you sign when you win, and - // `quote_on_accepted` stamps that same day; - // start_date — signature + 14d, because that deal's description says - // it was "signed two weeks ahead of the renewal date"; - // end_date — start + 365d, the span every other row here uses for a - // 12-month term. - { - crm_account: "Acme Corporation", - crm_contact: "john.smith@acme.example.com", - crm_opportunity: "Acme Annual Renewal 2025", - status: "activated", - contract_term_months: 12, - start_date: cel34`daysAgo(1)`, - end_date: cel34`daysFromNow(364)`, - contract_value: 22e4, - billing_frequency: "annually", - payment_terms: "net_30", - auto_renewal: true, - renewal_notice_days: 60, - contract_type: "subscription", - signed_date: cel34`daysAgo(15)`, - signed_by: "John Smith", - description: "Annual platform subscription with premium support tier." - }, - { - crm_account: "Wayne Enterprises", - crm_contact: "rwilson@wayne.example.com", - crm_opportunity: "Wayne Enterprise License", - status: "in_approval", - contract_term_months: 36, - start_date: cel34`daysFromNow(14)`, - end_date: cel34`daysFromNow(1109)`, - contract_value: 12e5, - billing_frequency: "annually", - payment_terms: "net_60", - auto_renewal: false, - renewal_notice_days: 90, - contract_type: "license", - description: "Multi-year enterprise license with custom SLA." - }, - { - crm_account: "Initech Solutions", - crm_contact: "mchen@initech.example.com", - status: "expired", - contract_term_months: 12, - start_date: cel34`daysAgo(400)`, - end_date: cel34`daysAgo(35)`, - contract_value: 6e4, - billing_frequency: "quarterly", - payment_terms: "net_30", - auto_renewal: false, - renewal_notice_days: 30, - contract_type: "service", - signed_date: cel34`daysAgo(405)`, - signed_by: "Michael Chen", - description: "Initial service agreement, pending renewal discussion." - }, - { - crm_account: "Stark Medical", - crm_contact: "emily.d@starkmed.example.com", - status: "draft", - contract_term_months: 24, - start_date: cel34`daysFromNow(30)`, - end_date: cel34`daysFromNow(760)`, - contract_value: 35e4, - billing_frequency: "monthly", - payment_terms: "net_30", - auto_renewal: true, - renewal_notice_days: 60, - contract_type: "partnership", - description: "Healthcare partnership agreement, currently under legal review." - } - ] -}); -var QUOTE_LINES = { - "Acme Platform Upgrade Quote": OPPORTUNITY_LINES["Acme Platform Upgrade"], - "Acme Annual Renewal 2025 Quote": OPPORTUNITY_LINES["Acme Annual Renewal 2025"], - "Globex Manufacturing Suite Proposal": OPPORTUNITY_LINES["Globex Manufacturing Suite"], - "Wayne Enterprise License Quote": OPPORTUNITY_LINES["Wayne Enterprise License"], - "Initech Cloud Migration Estimate": OPPORTUNITY_LINES["Initech Cloud Migration"], - // Quoted standalone, before any opportunity existed — and then rejected. - "Stark Medical Pilot Quote": [ - { product: "Admin Training Workshop", quantity: 5, unit_price: 6e3, description: "Five workshop days for the pilot clinical teams." }, - { product: "Standard Support", quantity: 1, unit_price: 9e3, description: "Standard support for the pilot term." }, - { product: "AI Agent Seat (Annual)", quantity: 6, unit_price: 1e3, description: "Agent seats for the pilot coordinators." } - ] -}; -var quoteTotals = (quoteName, opts) => { - const lines = QUOTE_LINES[quoteName]; - if (!lines) throw new Error(`Seed error: no line items authored for quote "${quoteName}"`); - const subtotal = linesTotal(lines); - const discount_amount = Math.round(subtotal * (opts.discount / 100) * 100) / 100; - const total_price = Math.round((subtotal - discount_amount + opts.tax + opts.shipping_handling) * 100) / 100; - return { - subtotal, - discount: opts.discount, - discount_amount, - tax: opts.tax, - shipping_handling: opts.shipping_handling, - total_price - }; -}; -var quotes = defineSeed6(Quote, { - mode: "upsert", - externalId: "name", - records: [ - { - name: "Acme Platform Upgrade Quote", - crm_account: "Acme Corporation", - crm_contact: "john.smith@acme.example.com", - crm_opportunity: "Acme Platform Upgrade", - // `expired`, not `accepted` (#1661). Accepting this quote would have - // close-won `Acme Platform Upgrade`, which is `proposal` and 30 days from - // close — the same impossible pairing the contract above carried, one - // object over. `expired` is what `quote_expiration` computes for a - // presented quote past its `expiration_date`, and it is what the deal's - // own next step assumes: the revised Enterprise proposal still has to go - // out. Its `crm_contact` stays put — the row is no longer gated by - // `requiredWhen`, but the recipient is still who it was sent to. - status: "expired", - quote_date: cel34`daysAgo(45)`, - expiration_date: cel34`daysAgo(15)`, - ...quoteTotals("Acme Platform Upgrade Quote", { discount: 10, tax: 11475, shipping_handling: 0 }), - payment_terms: "net_30", - description: "Platform upgrade with 10% loyalty discount applied." - }, - // The renewal's own quote, and the seed's one ACCEPTED quote. Acceptance is - // only coherent here: `quote_on_accepted` close-wins whatever opportunity a - // quote links, so an accepted quote can only ever point at a `closed_won` - // deal. It also completes the provenance chain the contract above needs — - // deal won, quote accepted, contract drafted, then completed and activated - // by an admin (the draft the hook writes is explicitly a starting point). - // `Acme Annual Renewal 2025` keeps its rep-recorded `relationship` win - // reason: the hook only supplies `quote_accepted` when nobody recorded one. - { - name: "Acme Annual Renewal 2025 Quote", - crm_account: "Acme Corporation", - crm_contact: "john.smith@acme.example.com", - crm_opportunity: "Acme Annual Renewal 2025", - status: "accepted", - quote_date: cel34`daysAgo(30)`, - expiration_date: cel34`daysAgo(1)`, - // No discount — the renewal went at list ("multi-year option declined - // this round"), which is what its 22% YoY uplift is made of. Tax is 8.5% - // of the post-discount subtotal, the rate the other Acme quote bills at; - // every non-Acme quote here bills 8%. - ...quoteTotals("Acme Annual Renewal 2025 Quote", { discount: 0, tax: 18700, shipping_handling: 0 }), - payment_terms: "net_30", - description: "Annual renewal \u2014 three production tenants, premium support and the EMEA seat expansion." - }, - { - name: "Globex Manufacturing Suite Proposal", - crm_account: "Globex Industries", - crm_contact: "sarah.j@globex.example.com", - crm_opportunity: "Globex Manufacturing Suite", - status: "presented", - quote_date: cel34`daysAgo(7)`, - expiration_date: cel34`daysFromNow(23)`, - ...quoteTotals("Globex Manufacturing Suite Proposal", { discount: 5, tax: 7220, shipping_handling: 2500 }), - payment_terms: "net_60", - description: "Manufacturing suite licensing with plant-admin training." - }, - { - name: "Wayne Enterprise License Quote", - crm_account: "Wayne Enterprises", - crm_contact: "rwilson@wayne.example.com", - crm_opportunity: "Wayne Enterprise License", - status: "in_review", - quote_date: cel34`daysAgo(3)`, - expiration_date: cel34`daysFromNow(27)`, - ...quoteTotals("Wayne Enterprise License Quote", { discount: 15, tax: 81600, shipping_handling: 0 }), - payment_terms: "net_60", - description: "Multi-year enterprise license with volume discount." - }, - { - name: "Initech Cloud Migration Estimate", - crm_account: "Initech Solutions", - crm_contact: "mchen@initech.example.com", - crm_opportunity: "Initech Cloud Migration", - status: "draft", - quote_date: cel34`daysAgo(1)`, - expiration_date: cel34`daysFromNow(29)`, - ...quoteTotals("Initech Cloud Migration Estimate", { discount: 0, tax: 6400, shipping_handling: 0 }), - payment_terms: "net_30", - description: "Cloud migration services, awaiting internal review." - }, - { - name: "Stark Medical Pilot Quote", - crm_account: "Stark Medical", - crm_contact: "emily.d@starkmed.example.com", - status: "rejected", - quote_date: cel34`daysAgo(60)`, - expiration_date: cel34`daysAgo(30)`, - ...quoteTotals("Stark Medical Pilot Quote", { discount: 0, tax: 3600, shipping_handling: 0 }), - payment_terms: "net_30", - description: "Pilot project quote, rejected due to budget constraints.", - internal_notes: "Customer requested re-quote with smaller scope." - } - ] -}); -var quoteLineItems = defineSeed6(QuoteLineItem, { - mode: "upsert", - externalId: ["crm_quote", "crm_product"], - records: lineItemRecords("crm_quote", QUOTE_LINES) -}); - -// src/service/data/service.seed.ts -import { defineSeed as defineSeed7 } from "@objectstack/spec/data"; -import { cel as cel35 } from "@objectstack/spec"; - -// src/service/objects/_case-sla.ts -var CASE_SLA_DEFAULT_TIER = "smb"; -var CASE_SLA_CALENDAR_HOURS = { - // strategic enterprise mid_market smb - critical: { strategic: 4, enterprise: 4, mid_market: 4, smb: 4 }, - high: { strategic: 6, enterprise: 8, mid_market: 8, smb: 8 }, - medium: { strategic: 24, enterprise: 36, mid_market: 48, smb: 48 }, - low: { strategic: 96, enterprise: 120, mid_market: 168, smb: 168 } -}; -function caseSlaCalendarHours(priority, tier) { - const row = CASE_SLA_CALENDAR_HOURS[priority]; - if (!row) return void 0; - return row[tier] ?? row[CASE_SLA_DEFAULT_TIER]; -} -var caseSlaBreached = (dueAt, clockStoppedAt) => dueAt < clockStoppedAt; - -// src/service/data/service.seed.ts -var TIER_BY_ACCOUNT = new Map( - accounts.records.map((a) => [ - String(a.name), - typeof a.tier === "string" ? a.tier : CASE_SLA_DEFAULT_TIER - ]) -); -var seededSlaHours = (priority, accountName) => { - const hours = caseSlaCalendarHours(priority, accountName ? TIER_BY_ACCOUNT.get(accountName) : void 0); - if (hours === void 0) throw new Error(`seed: no SLA matrix row for priority "${priority}"`); - return hours; -}; -var celCaseSlaDue = (createdDaysAgo, priority, accountName) => cel35`daysAgo(${createdDaysAgo}) + duration('${seededSlaHours(priority, accountName)}h')`; -var seededSettledBreach = (createdDaysAgo, settledDaysAgo, priority, accountName) => caseSlaBreached(seededSlaHours(priority, accountName), (createdDaysAgo - settledDaysAgo) * 24); -var cases = defineSeed7(Case, { - mode: "upsert", - externalId: "subject", - records: [ - { - subject: "Login issues after platform upgrade", - description: `Users in the EMEA office report intermittent 401 errors when logging in after the v4.2 upgrade rolled out Wednesday night. Pattern: only affects users authenticating via SAML through Okta, only between 09:00\u201310:30 UTC. NA and APAC users are unaffected. - -**Customer impact:** ~40 users blocked at peak, costing ~3 productive hours per affected user. - -**Initial triage:** Suspect a clock-skew issue on the EMEA SSO relay added during the upgrade window. Engineering is reproducing in staging.`, - crm_account: "Acme Corporation", - crm_contact: "john.smith@acme.example.com", - status: "in_progress", - priority: "high", - priority_rank: 3, - type: "problem", - origin: "email", - is_closed: false, - is_sla_violated: false, - is_escalated: false, - created_at: cel35`daysAgo(2)`, - sla_due_date: celCaseSlaDue(2, "high", "Acme Corporation") - }, - { - subject: "Data export timing out for large datasets", - description: "CSV export fails for datasets over 10k rows.", - crm_account: "Globex Industries", - crm_contact: "sarah.j@globex.example.com", - status: "escalated", - priority: "critical", - priority_rank: 4, - type: "bug", - origin: "phone", - is_closed: false, - is_sla_violated: true, - is_escalated: true, - escalation_reason: "Customer threatening churn", - created_at: cel35`daysAgo(5)`, - sla_due_date: celCaseSlaDue(5, "critical", "Globex Industries") - }, - { - subject: "How to configure SSO with Okta?", - description: "Customer needs guidance on SSO setup with Okta.", - crm_account: "Initech Solutions", - crm_contact: "mchen@initech.example.com", - status: "resolved", - priority: "medium", - priority_rank: 2, - type: "question", - origin: "web", - // Resolved-but-not-closed: case.hook keeps is_closed=false and stamps - // closed_date as the resolved-date proxy; resolution_time_hours is the - // closed−created delta the hook would compute (daysAgo() is day-granular, - // so deltas come in 24h steps). - is_closed: false, - is_sla_violated: seededSettledBreach(3, 2, "medium", "Initech Solutions"), - is_escalated: false, - resolution_time_hours: 24, - created_at: cel35`daysAgo(3)`, - closed_date: cel35`daysAgo(2)`, - sla_due_date: celCaseSlaDue(3, "medium", "Initech Solutions") - }, - { - subject: "API rate limit exceeded on production", - description: "Production environment hitting rate limits during peak hours.", - crm_account: "Wayne Enterprises", - crm_contact: "rwilson@wayne.example.com", - status: "closed", - priority: "high", - priority_rank: 3, - type: "problem", - origin: "chat", - is_closed: true, - is_sla_violated: seededSettledBreach(7, 6, "high", "Wayne Enterprises"), - is_escalated: false, - // `resolution` is REQUIRED when status is 'closed' (object validation - // `resolution_required_for_closed`) — without it the seed row is rejected. - resolution: "Raised the production rate-limit tier and added client-side backoff; usage now within limits.", - // The deflection link (#601): this case was answered out of the knowledge - // base, so it names the article that resolved it. Referenced by the - // article seed's `externalId` (`title`), the same way every other seeded - // lookup names its target. - resolved_by_article: "API Rate Limits", - // closed−created delta, as case.hook computes it. - resolution_time_hours: 24, - created_at: cel35`daysAgo(7)`, - closed_date: cel35`daysAgo(6)`, - sla_due_date: celCaseSlaDue(7, "high", "Wayne Enterprises") - }, - { - subject: "PDF reports not rendering charts correctly", - description: "Charts appear blank when exporting dashboard to PDF.", - crm_account: "Stark Medical", - crm_contact: "emily.d@starkmed.example.com", - status: "new", - priority: "medium", - priority_rank: 2, - type: "bug", - origin: "email", - is_closed: false, - is_sla_violated: false, - is_escalated: false, - created_at: cel35`daysAgo(1)`, - sla_due_date: celCaseSlaDue(1, "medium", "Stark Medical") - }, - { - subject: "Billing discrepancy on last invoice", - description: `Customer (Lisa Kim, Procurement) flagged that the May invoice shows 15 active seats but Acme is only using 12. Two of the seats were de-provisioned in early April when two engineers left the company. - -**Root cause:** the de-provisioning happened in our admin console but the seat-count metric in billing only refreshes monthly, so the May invoice picked up the pre-change count. - -**Resolution path:** issue a $1,200 credit memo and switch Acme to the new real-time seat-billing pipeline so this can't recur. Waiting on Lisa to confirm she's good with the credit-memo treatment vs a refund.`, - crm_account: "Acme Corporation", - crm_contact: "john.smith@acme.example.com", - status: "waiting_customer", - priority: "low", - priority_rank: 1, - type: "problem", - origin: "email", - is_closed: false, - is_sla_violated: false, - is_escalated: false, - created_at: cel35`daysAgo(4)`, - sla_due_date: celCaseSlaDue(4, "low", "Acme Corporation") - }, - { - subject: "Mobile app crashes on iOS 17", - description: "App crashes on launch for users running iOS 17.2+.", - crm_account: "Globex Industries", - crm_contact: "sarah.j@globex.example.com", - status: "in_progress", - priority: "critical", - priority_rank: 4, - type: "bug", - origin: "web", - is_closed: false, - is_sla_violated: true, - is_escalated: true, - escalation_reason: "Affects 30% of mobile users", - created_at: cel35`daysAgo(3)`, - sla_due_date: celCaseSlaDue(3, "critical", "Globex Industries") - }, - { - subject: "Request: bulk import via CSV", - description: "Customer requesting ability to import records via CSV upload.", - crm_account: "Wayne Enterprises", - crm_contact: "rwilson@wayne.example.com", - status: "closed", - priority: "low", - priority_rank: 1, - type: "feature_request", - origin: "web", - is_closed: true, - is_sla_violated: seededSettledBreach(10, 8, "low", "Wayne Enterprises"), - is_escalated: false, - // Required for closed cases (resolution_required_for_closed). - resolution: "Delivered CSV bulk-import in the 9.4 release; shared the docs link with the customer.", - // closed−created delta, as case.hook computes it. - resolution_time_hours: 48, - created_at: cel35`daysAgo(10)`, - closed_date: cel35`daysAgo(8)`, - sla_due_date: celCaseSlaDue(10, "low", "Wayne Enterprises") - }, - // ─── Generated demo cases — 30 cases over the last 30 days, mixed across - // priorities. Powers `CasesOpenedByDayPriorityReport` (daily bucketing - // matrix) and the service dashboard's daily-volume area chart. - // - // ### Why every axis carries a rotation, and not just `i % length` (#1659) - // - // These rows used to read ONE counter for every axis: `crm_account` and - // `status` both took `i % 5`, and `priority`, `type` and `origin` all took - // `i % 4`. Equal-length lists walked by one index advance in lockstep, so - // each group came out PERFECTLY correlated — every Acme case `new`, every - // Globex case `in_progress`, and every `low` case a `question` raised by - // `email`. Thirty rows of volume with no variety, which is the opposite of - // what a volume generator is for: the account × status cross-tab held 5 of - // its 25 cells, and priority × type × origin 4 of 16 apiece. - // - // Each list now advances one step per row PLUS a rotation — `c` extra steps - // every `m` rows. Two axes stay correlated exactly when their relative - // offset never moves, so the rotations are chosen to make every relative - // offset sweep its whole cycle. `crm_account` is the anchor and carries no - // rotation; the other four are stated relative to it. - // - // `account × status` is complete BY CONSTRUCTION rather than by luck, and - // the proof is one line: account `a` takes rows i = a, a+5 … a+25, whose - // block numbers run 0…5, so its statuses are `(a + b) % 5` over b = 0…5 — - // all five of them. The thirty rows therefore walk the whole 5 × 5 grid, - // twenty-five cells once and five of them a second time. - // - // ⚠️ The remaining three constants are TUNED, not derived. They were picked - // by computing all ten pairwise cross-tabs and keeping the assignment that - // left the fewest empty cells. Measured over the lists as shipped: 188 of - // the 193 pairwise cells are occupied, no cell holds more than 3 rows, and - // the marginals stay as flat as thirty rows allow — 6/6/6/6/6 by account - // and by status, 8/7/7/8 by priority, type and origin. ⛔ Changing the - // LENGTH of any list below voids that tuning: re-measure the cross-tabs - // rather than assuming the rotations still separate the axes. - // - // Two schemes that read as more principled than they measure were rejected - // here, and are recorded so they are not re-derived: rotating the 5-lists - // on the 4-block and the 4-lists on the 5-block ("the lengths are coprime, - // so they cannot resonate") empties one status completely; and rotating - // `crm_account` as well — to break the every-fifth-day beat it walks the - // calendar on — costs twelve further empty cells. That beat is the - // deliberate price of anchoring: with one row per day, some axis has to be - // the fixed one the other four are measured against. - ...(() => { - const priorities = ["low", "medium", "high", "critical"]; - const rankByPriority = { low: 1, medium: 2, high: 3, critical: 4 }; - const types = ["question", "bug", "problem", "feature_request"]; - const origins = ["email", "phone", "web", "chat"]; - const statuses = ["new", "in_progress", "resolved", "closed", "escalated"]; - const accountsList = ["Acme Corporation", "Globex Industries", "Wayne Enterprises", "Initech Solutions", "Stark Medical"]; - const out = []; - for (let i = 0; i < 30; i++) { - const account = accountsList[i % accountsList.length]; - const status = statuses[(i + Math.floor(i / accountsList.length)) % statuses.length]; - const priority = priorities[(i + Math.floor(i / priorities.length)) % priorities.length]; - const type = types[(i + 2 * Math.floor(i / types.length)) % types.length]; - const origin = origins[(i + Math.floor(i / 10)) % origins.length]; - const settled = status === "resolved" || status === "closed"; - const ageDays = 1 + i % 30; - const resolutionDays = Math.min(ageDays, 1 + i % 3); - const slaViolated = settled ? seededSettledBreach(ageDays, ageDays - resolutionDays, priority, account) : priority === "critical" && i % 3 === 0; - out.push({ - subject: `Demo case ${String(i + 1).padStart(2, "0")} \u2014 ${priority} ${type}`, - description: `Auto-generated demo case for ${priority} priority on day -${ageDays}.`, - crm_account: account, - status, - priority, - priority_rank: rankByPriority[priority], - type, - origin, - // is_closed strictly mirrors case.hook: true ONLY for status - // 'closed' — a resolved case is NOT closed yet. - is_closed: status === "closed", - is_sla_violated: slaViolated, - is_escalated: status === "escalated", - ...settled ? { resolution_time_hours: resolutionDays * 24 } : {}, - // Object validations require these when closed/escalated — without - // them the generated rows are rejected (resolution_required_for_closed - // / escalation_reason_required). - ...status === "closed" ? { resolution: "Resolved per standard runbook; root cause documented and customer confirmed." } : {}, - ...status === "escalated" ? { escalation_reason: "Escalated to tier-2 engineering for SLA-risk review." } : {}, - created_at: celDaysAgo(ageDays), - // Resolved cases also carry closed_date: case.hook stamps it as the - // resolved-date proxy while keeping is_closed=false. - ...settled ? { closed_date: celDaysAgo(ageDays - resolutionDays) } : {}, - sla_due_date: celCaseSlaDue(ageDays, priority, account) - }); - } - return out; - })() - ] -}); -var knowledgeArticles = defineSeed7(KnowledgeArticle, { - mode: "upsert", - externalId: "title", - records: [ - { - title: "Getting Started with HotCRM", - summary: "A five-minute tour of accounts, contacts, leads and the sales pipeline.", - category: "getting_started", - status: "published", - audience: "public", - language: "en", - body: `# Getting Started with HotCRM - -Welcome! This guide walks you through the core objects: - -1. **Accounts** \u2014 the companies you sell to and serve. -2. **Contacts** \u2014 the people at those accounts. -3. **Leads** \u2014 unqualified prospects in the top of the funnel. -4. **Opportunities** \u2014 qualified deals moving through your pipeline. - -Open the **Sales Pipeline** kanban to drag deals between stages, and use the -**Executive Overview** dashboard to track revenue at a glance.`, - published_at: cel35`daysAgo(40)`, - last_reviewed_at: cel35`daysAgo(20)` - }, - { - title: "Resetting Your Password", - summary: "How end users reset a forgotten password from the login screen.", - category: "how_to", - status: "published", - audience: "public", - language: "en", - body: `# Resetting Your Password - -1. On the login screen, click **Forgot password?** -2. Enter the email associated with your account. -3. Check your inbox for a reset link (valid for 30 minutes). -4. Choose a new password of at least 12 characters. - -If the email does not arrive, check spam or contact your administrator.`, - published_at: cel35`daysAgo(25)`, - last_reviewed_at: cel35`daysAgo(10)` - }, - { - title: "API Rate Limits", - summary: "Per-token request quotas and recommended back-off strategy.", - category: "api", - status: "draft", - audience: "internal", - language: "en", - body: `# API Rate Limits (DRAFT) - -Default quota is 600 requests/minute per token. On HTTP 429, back off -exponentially starting at 1s. Numbers pending final review with platform team.` - }, - { - title: "Legacy SSO Setup", - summary: "SAML configuration for the pre-2025 identity stack.", - category: "troubleshooting", - status: "published", - audience: "internal", - language: "en", - body: `# Legacy SSO Setup - -This covers the deprecated SAML 1.1 flow. New tenants should use the OIDC -connector instead. Retained for customers still on the legacy stack.`, - published_at: cel35`daysAgo(240)`, - last_reviewed_at: cel35`daysAgo(220)` - } - ] -}); - -// src/marketing/data/marketing.seed.ts -import { defineSeed as defineSeed8 } from "@objectstack/spec/data"; -import { cel as cel36 } from "@objectstack/spec"; -var CAMPAIGN_MEMBERS = { - "Q3 Enterprise Email Nurture": [ - { lead: "noah.patel@vertexanalytics.example.com", status: "responded", addedDaysAgo: 14, respondedDaysAgo: 9 }, - { lead: "maya.singh@bluepeaklogistics.example.com", status: "sent", addedDaysAgo: 14 }, - { lead: "owen.becker@northwindenergy.example.com", status: "responded", addedDaysAgo: 14, respondedDaysAgo: 11 }, - { lead: "sara.lopez@heliossolar.example.com", status: "sent", addedDaysAgo: 14 }, - { lead: "leo.vance@cleancart.example.com", status: "unsubscribed", addedDaysAgo: 14 }, - { lead: "iris.okafor@pulsehealth.example.com", status: "sent", addedDaysAgo: 13 }, - { lead: "ravi.mehta@foundryrobotics.example.com", status: "sent", addedDaysAgo: 13 }, - { lead: "tess.brown@latticeeducation.example.com", status: "responded", addedDaysAgo: 13, respondedDaysAgo: 8 }, - { contact: "john.smith@acme.example.com", status: "responded", addedDaysAgo: 14, respondedDaysAgo: 10 }, - { contact: "ethan.brooks@vertex.example.com", status: "sent", addedDaysAgo: 14 }, - { contact: "priya.shah@lattice.example.com", status: "responded", addedDaysAgo: 14, respondedDaysAgo: 7 }, - { contact: "rwilson@wayne.example.com", status: "sent", addedDaysAgo: 13 } - ], - "Operations Platform Launch": [ - { lead: "jonas.holt@polarcargo.example.com", status: "responded", addedDaysAgo: 11, respondedDaysAgo: 6 }, - { lead: "anya.volkov@redoakrealty.example.com", status: "sent", addedDaysAgo: 11 }, - { lead: "theo.park@skylinemedia.example.com", status: "sent", addedDaysAgo: 11 }, - { lead: "wren.garcia@maplebakerygroup.example.com", status: "responded", addedDaysAgo: 10, respondedDaysAgo: 5 }, - { lead: "hugo.dubois@nimbusaerospace.example.com", status: "sent", addedDaysAgo: 10 }, - { contact: "rwilson@wayne.example.com", status: "responded", addedDaysAgo: 11, respondedDaysAgo: 7 }, - { contact: "marcus.reed@apexlogistics.example.com", status: "sent", addedDaysAgo: 11 }, - { contact: "olivia.chen@northwind.example.com", status: "sent", addedDaysAgo: 10 }, - { contact: "sarah.j@globex.example.com", status: "sent", addedDaysAgo: 10 } - ], - "Developer Content Marketing Push": [ - { lead: "lena.fischer@graniteinsurance.example.com", status: "responded", addedDaysAgo: 33, respondedDaysAgo: 27 }, - { lead: "kai.watanabe@coralreefhotels.example.com", status: "sent", addedDaysAgo: 33 }, - { lead: "mira.costa@atlasconstruction.example.com", status: "unsubscribed", addedDaysAgo: 33 }, - { lead: "pia.anand@citrinefinance.example.com", status: "responded", addedDaysAgo: 32, respondedDaysAgo: 24 }, - { lead: "marco.ricci@auroratravel.example.com", status: "sent", addedDaysAgo: 32 }, - { lead: "lisa.t@cloudfirst.example.com", status: "responded", addedDaysAgo: 30, respondedDaysAgo: 21 }, - { contact: "ethan.brooks@vertex.example.com", status: "responded", addedDaysAgo: 33, respondedDaysAgo: 19 }, - { contact: "mchen@initech.example.com", status: "sent", addedDaysAgo: 33 }, - { contact: "john.smith@acme.example.com", status: "sent", addedDaysAgo: 32 }, - { contact: "emily.d@starkmed.example.com", status: "sent", addedDaysAgo: 32 }, - { contact: "sarah.j@globex.example.com", status: "sent", addedDaysAgo: 30 } - ], - // Campaigns still in `planning` carry their invitation / registration list: - // the enrollment flow runs for `planning` and `in_progress` campaigns alike - // and stamps `sent` on enrollment, so a pre-launch target list looks exactly - // like this. - "Cloud Migration Webinar": [ - { lead: "dkim@edutechlabs.example.com", status: "sent", addedDaysAgo: 4 }, - { lead: "alice@nextgenretail.example.com", status: "sent", addedDaysAgo: 4 }, - { lead: "jonas.holt@polarcargo.example.com", status: "sent", addedDaysAgo: 3 }, - { lead: "anya.volkov@redoakrealty.example.com", status: "sent", addedDaysAgo: 3 }, - { contact: "mchen@initech.example.com", status: "sent", addedDaysAgo: 4 }, - { contact: "marcus.reed@apexlogistics.example.com", status: "sent", addedDaysAgo: 3 } - ], - "Executive AI Governance Roundtable": [ - { contact: "john.smith@acme.example.com", status: "sent", addedDaysAgo: 6 }, - { contact: "rwilson@wayne.example.com", status: "sent", addedDaysAgo: 6 }, - { contact: "ethan.brooks@vertex.example.com", status: "sent", addedDaysAgo: 5 }, - { contact: "priya.shah@lattice.example.com", status: "sent", addedDaysAgo: 5 }, - { contact: "emily.d@starkmed.example.com", status: "sent", addedDaysAgo: 5 } - ], - "Partner Operations Roadshow": [ - { lead: "maya.singh@bluepeaklogistics.example.com", status: "sent", addedDaysAgo: 7 }, - { lead: "ravi.mehta@foundryrobotics.example.com", status: "sent", addedDaysAgo: 7 }, - { contact: "marcus.reed@apexlogistics.example.com", status: "sent", addedDaysAgo: 6 }, - { contact: "olivia.chen@northwind.example.com", status: "sent", addedDaysAgo: 6 } - ], - "SaaSCon 2026 Trade Show": [ - { lead: "theo.park@skylinemedia.example.com", status: "sent", addedDaysAgo: 8 }, - { lead: "wren.garcia@maplebakerygroup.example.com", status: "sent", addedDaysAgo: 8 }, - { lead: "hugo.dubois@nimbusaerospace.example.com", status: "sent", addedDaysAgo: 7 }, - { lead: "marco.ricci@auroratravel.example.com", status: "sent", addedDaysAgo: 7 } - ] -}; -var campaignMetrics = (campaignName) => { - const members = CAMPAIGN_MEMBERS[campaignName] ?? []; - const leadKeys = new Set(members.map((m) => m.lead).filter((e) => Boolean(e))); - const convertedLeads = leads.records.filter( - (l) => typeof l.email === "string" && leadKeys.has(l.email) && l.is_converted === true - ).length; - const attributed = opportunities.records.filter((o) => o.crm_campaign === campaignName); - const won = attributed.filter((o) => o.stage === "closed_won"); - return { - // "Total members enrolled" — campaign.hook.ts's single definition of num_sent. - num_sent: members.length, - // `responded` or `converted`, as in `computeCampaignMetrics`. The seed set - // holds no `converted` member (see the note on CAMPAIGN_MEMBERS), so the - // two predicates coincide on this data — spelled the narrow way because - // widening it here would suggest a seeded state that does not exist. - num_responses: members.filter((m) => m.status === "responded").length, - num_leads: leadKeys.size, - num_converted_leads: convertedLeads, - num_opportunities: attributed.length, - num_won_opportunities: won.length, - actual_revenue: won.reduce((sum, o) => sum + (typeof o.amount === "number" ? o.amount : 0), 0) - }; -}; -var campaigns = defineSeed8(Campaign, { - mode: "upsert", - externalId: "name", - records: [ - { - name: "Q3 Enterprise Email Nurture", - description: "Multi-touch nurture for enterprise IT decision makers evaluating AI governance and analytics.", - type: "email", - channel: "email", - status: "in_progress", - start_date: cel36`daysAgo(15)`, - end_date: cel36`daysFromNow(21)`, - budgeted_cost: 28e3, - actual_cost: 14e3, - expected_revenue: 56e4, - target_size: 5e3, - ...campaignMetrics("Q3 Enterprise Email Nurture"), - landing_page_url: "https://acme.example.com/lp/enterprise-q3", - is_active: true - }, - { - name: "Executive AI Governance Roundtable", - description: "A live executive roundtable on operating AI agents with governance, auditability and trust.", - type: "conference", - channel: "events", - status: "planning", - start_date: cel36`daysFromNow(2)`, - end_date: cel36`daysFromNow(3)`, - budgeted_cost: 22e3, - expected_revenue: 32e4, - target_size: 120, - ...campaignMetrics("Executive AI Governance Roundtable"), - is_active: true - }, - { - name: "Cloud Migration Webinar", - description: "A technical webinar on modernizing customer operations and data workflows in the cloud.", - type: "webinar", - channel: "digital", - status: "planning", - start_date: cel36`daysFromNow(6)`, - end_date: cel36`daysFromNow(8)`, - budgeted_cost: 18e3, - expected_revenue: 36e4, - target_size: 1500, - ...campaignMetrics("Cloud Migration Webinar"), - landing_page_url: "https://acme.example.com/webinars/cloud-migration", - is_active: true - }, - { - name: "Operations Platform Launch", - description: "Launch campaign for the operations platform, pairing product content with customer proof points.", - type: "content", - channel: "digital", - status: "in_progress", - // Was `daysFromNow(12)` — an `in_progress` campaign that had not started - // yet, which no attribution can be consistent with (#591). - start_date: cel36`daysAgo(12)`, - end_date: cel36`daysFromNow(14)`, - budgeted_cost: 36e3, - actual_cost: 12e3, - expected_revenue: 48e4, - target_size: 8e3, - ...campaignMetrics("Operations Platform Launch"), - landing_page_url: "https://acme.example.com/launch/operations-platform", - is_active: true - }, - { - name: "Partner Operations Roadshow", - description: "Joint regional sessions with strategic partners for operations and IT leaders.", - type: "partner", - channel: "partner", - status: "planning", - start_date: cel36`daysFromNow(19)`, - end_date: cel36`daysFromNow(22)`, - budgeted_cost: 48e3, - expected_revenue: 72e4, - target_size: 600, - ...campaignMetrics("Partner Operations Roadshow"), - is_active: true - }, - { - name: "SaaSCon 2026 Trade Show", - description: "A focused booth, executive dinner and customer-story program at the SaaSCon industry conference.", - type: "trade_show", - channel: "events", - status: "planning", - start_date: cel36`daysFromNow(27)`, - end_date: cel36`daysFromNow(30)`, - budgeted_cost: 75e3, - expected_revenue: 12e5, - target_size: 3e3, - ...campaignMetrics("SaaSCon 2026 Trade Show"), - is_active: true - }, - { - name: "Developer Content Marketing Push", - description: "Technical blog posts, video tutorials and developer community engagement completed last month.", - type: "content", - channel: "digital", - status: "completed", - start_date: cel36`daysAgo(35)`, - end_date: cel36`daysAgo(4)`, - budgeted_cost: 4e4, - actual_cost: 25e3, - expected_revenue: 25e4, - target_size: 1e4, - ...campaignMetrics("Developer Content Marketing Push"), - landing_page_url: "https://acme.example.com/developers", - is_active: true - } - ] -}); -var memberRecords = (kind) => Object.entries(CAMPAIGN_MEMBERS).flatMap( - ([campaign, members]) => members.filter((m) => kind === "lead" ? m.lead : m.contact).map((m) => ({ - crm_campaign: campaign, - ...kind === "lead" ? { crm_lead: m.lead } : { crm_contact: m.contact }, - status: m.status, - added_date: celDaysAgo(m.addedDaysAgo), - // `has_responded` / `response_date` track the `responded` status - // exactly — a responded member with no response date is a shape the - // response-tracking surfaces cannot render. - has_responded: m.status === "responded", - ...m.respondedDaysAgo !== void 0 ? { response_date: celDaysAgo(m.respondedDaysAgo) } : {} - })) -); -var campaignMembersFromLeads = defineSeed8(CampaignMember, { - mode: "upsert", - externalId: ["crm_campaign", "crm_lead"], - records: memberRecords("lead") -}); -var campaignMembersFromContacts = defineSeed8(CampaignMember, { - mode: "upsert", - externalId: ["crm_campaign", "crm_contact"], - records: memberRecords("contact") -}); - -// objectstack.composition.ts -var byExportName = (merged) => Object.entries(merged).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0).map(([, value]) => value); -var appHooks = [ - account_hook_default, - campaign_hook_default, - opportunity_campaign_metrics_hook_default, - lead_campaign_metrics_hook_default, - campaign_member_hook_default, - contact_hook_default, - contract_hook_default, - event_hook_default, - forecast_hook_default, - lead_hook_default, - opportunity_hook_default, - opportunity_line_item_hook_default, - product_hook_default, - quote_hook_default, - quote_line_item_hook_default, - task_hook_default -].flatMap((entry) => Array.isArray(entry) ? entry : [entry]); -var appFlows = [ - CampaignEnrollmentFlow, - CampaignLeadMemberEnrollFlow, - CampaignContactMemberEnrollFlow, - AccountApprovalFlow, - LeadConversionFlow, - LeadConversionApprovalFlow, - ScheduleFollowUpFlow, - OpportunityApprovalFlow, - OpportunityApprovalOnCreateFlow, - OpportunityStatusChangeApprovalFlow, - OpportunityQualificationApprovalFlow, - QuoteGenerationFlow, - ContractRenewalFlow, - OpportunityStagnationFlow, - ForecastSnapshotFlow, - LeadAssignmentFlow, - CampaignCompletionFlow, - QuoteExpirationFlow, - ContractExpirationFlow, - ContactWelcomeFlow, - OpportunityWonAlertFlow, - TaskUrgentAlertFlow, - TaskDueReminderFlow, - BillingHandoffClosedWonFlow, - BillingHandoffContractActivatedFlow -]; -var appSkills = [ - LeadQualificationSkill, - EmailDraftingSkill, - RevenueForecastingSkill, - Customer360Skill, - LiveDataSkill -]; -var appObjects = byExportName({ - ...objects_exports2, - ...objects_exports3, - ...objects_exports4 -}); -var appActions = byExportName({ ...actions_exports, ...actions_exports2 }); -var appDashboards = byExportName({ ...dashboards_exports }); -var appDatasets = byExportName({ ...datasets_exports, ...datasets_exports2 }); -var appReports = byExportName({ ...reports_exports }); -var appViews = byExportName({ - ...views_exports, - ...views_exports2, - ...views_exports3 -}); -var appPages = byExportName({ ...pages_exports }); -var appMappings = byExportName({ ...mappings_exports }); -var appApps = byExportName({ ...apps_exports }); -var appTranslations = byExportName({ ...translations_exports }); -var appEmailTemplates = byExportName({ - ...email_templates_exports, - ...email_templates_exports2 -}).flat(); -var allProfiles = profiles_exports; -var appSharingRules = [ - AccountTeamSharingRule, - OpportunitySalesSharingRule, - OpportunityExecutiveSharingRule, - ...TerritorySharingRules, - ...CampaignLeadershipSharingRules -]; -var allHooks = [...appHooks, ...serviceHooks]; -var allFlows = [...appFlows, ...serviceFlows]; -var allSkills = [...appSkills, ...serviceSkills]; -var CrmSharingRules = [...appSharingRules, ...serviceSharingRules]; -var CrmSeedData = [ - accounts, - contacts, - leads, - opportunities, - products, - opportunityLineItems, - tasks, - cases, - // Events come after the five objects their `related_to_*` lookups resolve - // against (accounts, contacts, leads, opportunities, cases); the attendee - // junctions come after the events they hang off. - events, - eventAttendeesFromContacts, - eventAttendeesFromLeads, - leadInteractionPointers, - campaigns, - campaignMembersFromLeads, - campaignMembersFromContacts, - contracts, - quotes, - quoteLineItems, - forecasts, - knowledgeArticles -]; -var SaasTenantSeedData = [products]; -var ServiceSeedData = [cases, knowledgeArticles]; -var AppSeedData = CrmSeedData.filter((family) => !ServiceSeedData.includes(family)); -var seedDataFor = (composition2) => composition2 === "saas" ? { app: SaasTenantSeedData, service: [] } : { app: AppSeedData, service: ServiceSeedData }; -var composition = resolveComposition(); -var isSaas = composition === "saas"; -var seedData = seedDataFor(composition); -var compositionPermissions = isSaas ? [...Object.values(allProfiles).filter((set) => set !== SystemAdminProfile), TenantAdminProfile] : Object.values(allProfiles); -var serviceStack = createHotCrmServiceStack({ data: seedData.service }); -var appStack = createHotCrmAppStack( - { - objects: appObjects, - actions: appActions, - dashboards: appDashboards, - datasets: appDatasets, - reports: appReports, - // Reusable import projections (#603). Referenced by name from the import - // endpoint — `mappingName: 'crm_account_import'` — so a customer's own - // spreadsheet loads without per-column mapping by hand. Templates: - // `assets/import-templates/`. - mappings: appMappings, - flows: appFlows, - skills: appSkills, - permissions: compositionPermissions, - apps: appApps, - views: appViews, - pages: appPages, - // Approvals are modeled as `record_change` flows with `approval` nodes - // (ADR-0019); see src/sales/flows/opportunity-approval.flow.ts. The - // standalone `approvals` stack field was removed in ObjectStack 7.4. - // No `analyticsCubes`: datasets (ADR-0021) are the semantic layer — the - // analytics service compiles each dataset into its cube internally, and a - // second hand-written cube layer only duplicates and drifts. - hooks: appHooks, - data: seedData.app, - translations: appTranslations, - // The localizable content path for `notify` (#9205). A node names a template - // and supplies its `templateData`; the delivery path resolves - // `(name, locale)` against these rows PER RECIPIENT, after fan-out — the - // recipient's own `sys_user.locale` when set, else `i18n.defaultLocale` — - // so two people on one notification can read it in two languages. - emailTemplates: appEmailTemplates, - sharingRules: appSharingRules, - // ADR-0090 D3: positions are flat capability-distribution groups — the v1 - // role hierarchy's parent links are gone (hierarchy belongs to the - // business-unit tree, which this app does not model). - positions: CrmPositions - }, - { artifactObjects: (serviceStack.objects ?? []).map((object) => object.name) } -); - -// objectstack.config.ts -var objectstack_config_default = composeStacks([serviceStack, appStack], { manifest: "preserve" }); -export { - objectstack_config_default as default -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsib2JqZWN0c3RhY2suY29uZmlnLnRzIiwgInNyYy9zYWxlcy9pbmRleC50cyIsICJzcmMvc2VydmljZS9pbmRleC50cyIsICJzcmMvc2VydmljZS9hY3Rpb25zL2Nhc2UuYWN0aW9ucy50cyIsICJzcmMvc2VydmljZS9vYmplY3RzL2luZGV4LnRzIiwgInNyYy9zZXJ2aWNlL29iamVjdHMvYXJ0aWNsZV9mZWVkYmFjay5vYmplY3QudHMiLCAic3JjL3NlcnZpY2Uvb2JqZWN0cy9jYXNlLm9iamVjdC50cyIsICJzcmMvc2VydmljZS9vYmplY3RzL2tub3dsZWRnZV9hcnRpY2xlLm9iamVjdC50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9pbmRleC50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9hY2NvdW50Lm9iamVjdC50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9fcGlja2xpc3RzLnRzIiwgInNyYy9zYWxlcy9vYmplY3RzL190ZXJyaXRvcnkudHMiLCAic3JjL3NhbGVzL29iamVjdHMvY29udGFjdC5vYmplY3QudHMiLCAic3JjL3NhbGVzL29iamVjdHMvZXZlbnQub2JqZWN0LnRzIiwgInNyYy9zYWxlcy9vYmplY3RzL2V2ZW50X2F0dGVuZGVlLm9iamVjdC50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9mb3JlY2FzdC5vYmplY3QudHMiLCAic3JjL3NhbGVzL29iamVjdHMvbGVhZC5vYmplY3QudHMiLCAic3JjL3NhbGVzL29iamVjdHMvb3Bwb3J0dW5pdHkub2JqZWN0LnRzIiwgInNyYy9zYWxlcy9vYmplY3RzL3Rhc2sub2JqZWN0LnRzIiwgInNyYy9zYWxlcy9hY3Rpb25zL2FjdGl2aXR5LWFjdGlvbnMudHMiLCAic3JjL3NlcnZpY2UvYWN0aW9ucy9jYXNlLWFjdGl2aXR5LmFjdGlvbnMudHMiLCAic3JjL3NlcnZpY2UvYWN0aW9ucy9rbm93bGVkZ2VfYXJ0aWNsZS5hY3Rpb25zLnRzIiwgInNyYy9zZXJ2aWNlL2Rhc2hib2FyZHMvc2VydmljZS5kYXNoYm9hcmQudHMiLCAic3JjL3NlcnZpY2UvZGF0YXNldHMvY2FzZS5kYXRhc2V0LnRzIiwgInNyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvX2J1bmRsZS50cyIsICJzcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXMvZW4udHMiLCAic3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzL3poLUNOLnRzIiwgInNyYy9zZXJ2aWNlL2VtYWlsLXRlbXBsYXRlcy9qYS1KUC50cyIsICJzcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXMvZXMtRVMudHMiLCAic3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzL2NybS5lbWFpbC10ZW1wbGF0ZS50cyIsICJzcmMvc2VydmljZS9mbG93cy9jYXNlLWVzY2FsYXRpb24uZmxvdy50cyIsICJzcmMvc2VydmljZS9mbG93cy9jYXNlLWFjdGlvbnMuZmxvdy50cyIsICJzcmMvc2VydmljZS9vYmplY3RzL19jYXNlLWFzc2lnbm1lbnQudHMiLCAic3JjL3NlcnZpY2UvZmxvd3MvY2FzZS1lc2NhbGF0aW9uLXN0YW1wLmZsb3cudHMiLCAic3JjL3NlcnZpY2UvZmxvd3MvY2FzZS1zbGEtbW9uaXRvci5mbG93LnRzIiwgInNyYy9zYWxlcy9mbG93cy9fZ3VhcmRlZC1pdGVyYXRpb24udHMiLCAic3JjL3NlcnZpY2Uvb2JqZWN0cy9hcnRpY2xlX2ZlZWRiYWNrLmhvb2sudHMiLCAic3JjL3NlcnZpY2Uvb2JqZWN0cy9jYXNlLmhvb2sudHMiLCAic3JjL3NlcnZpY2Uvb2JqZWN0cy9rbm93bGVkZ2VfYXJ0aWNsZS5ob29rLnRzIiwgInNyYy9zZXJ2aWNlL3BhZ2VzL2Nhc2VfZGV0YWlsLnBhZ2UudHMiLCAic3JjL3NlcnZpY2UvcmVwb3J0cy9jYXNlLnJlcG9ydC50cyIsICJzcmMvc2VydmljZS9zaGFyaW5nL2Nhc2Uuc2hhcmluZy50cyIsICJzcmMvc2VydmljZS9za2lsbHMvY2FzZS10cmlhZ2Uuc2tpbGwudHMiLCAic3JjL3NlcnZpY2Uvdmlld3MvY2FzZS52aWV3LnRzIiwgInNyYy9zZXJ2aWNlL3ZpZXdzL2tub3dsZWRnZV9hcnRpY2xlLnZpZXcudHMiLCAic3JjL3JldmVudWUvb2JqZWN0cy9pbmRleC50cyIsICJzcmMvcmV2ZW51ZS9vYmplY3RzL2NvbnRyYWN0Lm9iamVjdC50cyIsICJzcmMvcmV2ZW51ZS9vYmplY3RzL29wcG9ydHVuaXR5X2xpbmVfaXRlbS5vYmplY3QudHMiLCAic3JjL3JldmVudWUvb2JqZWN0cy9wcm9kdWN0Lm9iamVjdC50cyIsICJzcmMvcmV2ZW51ZS9vYmplY3RzL3F1b3RlLm9iamVjdC50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9fdGhyZXNob2xkcy50cyIsICJzcmMvcmV2ZW51ZS9vYmplY3RzL3F1b3RlX2xpbmVfaXRlbS5vYmplY3QudHMiLCAic3JjL21hcmtldGluZy9vYmplY3RzL2luZGV4LnRzIiwgInNyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbi5vYmplY3QudHMiLCAic3JjL21hcmtldGluZy9vYmplY3RzL2NhbXBhaWduX21lbWJlci5vYmplY3QudHMiLCAic3JjL3NhbGVzL2FjdGlvbnMvaW5kZXgudHMiLCAic3JjL3NhbGVzL2FjdGlvbnMvY29udGFjdC5hY3Rpb25zLnRzIiwgInNyYy9zYWxlcy9hY3Rpb25zL2xlYWQuYWN0aW9ucy50cyIsICJzcmMvc2FsZXMvYWN0aW9ucy9vcHBvcnR1bml0eS5hY3Rpb25zLnRzIiwgInNyYy9tYXJrZXRpbmcvYWN0aW9ucy9pbmRleC50cyIsICJzcmMvbWFya2V0aW5nL2FjdGlvbnMvY2FtcGFpZ24uYWN0aW9ucy50cyIsICJzcmMvc2FsZXMvZGFzaGJvYXJkcy9pbmRleC50cyIsICJzcmMvc2FsZXMvZGFzaGJvYXJkcy9hY3Rpdml0eS5kYXNoYm9hcmQudHMiLCAic3JjL3NhbGVzL2Rhc2hib2FyZHMvc2hhcmVkLXdpZGdldHMudHMiLCAic3JjL3NhbGVzL2Rhc2hib2FyZHMvY3JtLmRhc2hib2FyZC50cyIsICJzcmMvc2FsZXMvZGFzaGJvYXJkcy9leGVjdXRpdmUuZGFzaGJvYXJkLnRzIiwgInNyYy9zYWxlcy9kYXNoYm9hcmRzL3NhbGVzLmRhc2hib2FyZC50cyIsICJzcmMvc2FsZXMvZGF0YXNldHMvaW5kZXgudHMiLCAic3JjL3NhbGVzL2RhdGFzZXRzL29wcG9ydHVuaXR5LmRhdGFzZXQudHMiLCAic3JjL3NhbGVzL2RhdGFzZXRzL2FjY291bnQuZGF0YXNldC50cyIsICJzcmMvc2FsZXMvZGF0YXNldHMvY29udGFjdC5kYXRhc2V0LnRzIiwgInNyYy9zYWxlcy9kYXRhc2V0cy9sZWFkLmRhdGFzZXQudHMiLCAic3JjL3NhbGVzL2RhdGFzZXRzL3Rhc2suZGF0YXNldC50cyIsICJzcmMvc2FsZXMvZGF0YXNldHMvZXZlbnQuZGF0YXNldC50cyIsICJzcmMvc2FsZXMvZGF0YXNldHMvZm9yZWNhc3QuZGF0YXNldC50cyIsICJzcmMvcmV2ZW51ZS9kYXRhc2V0cy9pbmRleC50cyIsICJzcmMvcmV2ZW51ZS9kYXRhc2V0cy9wcm9kdWN0LmRhdGFzZXQudHMiLCAic3JjL3NhbGVzL3JlcG9ydHMvaW5kZXgudHMiLCAic3JjL3NhbGVzL3JlcG9ydHMvYWNjb3VudC5yZXBvcnQudHMiLCAic3JjL3NhbGVzL3JlcG9ydHMvbGVhZC5yZXBvcnQudHMiLCAic3JjL3NhbGVzL3JlcG9ydHMvb3Bwb3J0dW5pdHkucmVwb3J0LnRzIiwgInNyYy9zYWxlcy9yZXBvcnRzL2NodXJuLnJlcG9ydC50cyIsICJzcmMvc2FsZXMvbWFwcGluZ3MvaW5kZXgudHMiLCAic3JjL3NhbGVzL21hcHBpbmdzL2FjY291bnRfaW1wb3J0Lm1hcHBpbmcudHMiLCAic3JjL3NhbGVzL21hcHBpbmdzL19zaGFyZWQudHMiLCAic3JjL3NhbGVzL21hcHBpbmdzL2NvbnRhY3RfaW1wb3J0Lm1hcHBpbmcudHMiLCAic3JjL3NhbGVzL21hcHBpbmdzL2xlYWRfaW1wb3J0Lm1hcHBpbmcudHMiLCAic3JjL3NhbGVzL2FwcHMvaW5kZXgudHMiLCAic3JjL3NhbGVzL2FwcHMvY3JtLmFwcC50cyIsICJzcmMvc2FsZXMvcHJvZmlsZXMvaW5kZXgudHMiLCAic3JjL3NhbGVzL3Byb2ZpbGVzL2d1ZXN0LXBvcnRhbC5wcm9maWxlLnRzIiwgInNyYy9zYWxlcy9wcm9maWxlcy9tYXJrZXRpbmctdXNlci5wcm9maWxlLnRzIiwgInNyYy9zYWxlcy9wcm9maWxlcy9zYWxlcy1tYW5hZ2VyLnByb2ZpbGUudHMiLCAic3JjL3NhbGVzL3Byb2ZpbGVzL3NhbGVzLXJlcC5wcm9maWxlLnRzIiwgInNyYy9zYWxlcy9wcm9maWxlcy9zZXJ2aWNlLWFnZW50LnByb2ZpbGUudHMiLCAic3JjL3NhbGVzL3Byb2ZpbGVzL3N5c3RlbS1hZG1pbi5wcm9maWxlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvaW5kZXgudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9hcHAudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9fc2hhcmVkLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vb2JqZWN0cy5jdXN0b21lci50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuL29iamVjdHMucGlwZWxpbmUudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9vYmplY3RzLmNvbW1lcmNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vb2JqZWN0cy5zZXJ2aWNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vb2JqZWN0cy5hY3Rpdml0eS50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuL29iamVjdHMubWFya2V0aW5nLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4udHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9hcHAudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9fc2hhcmVkLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vb2JqZWN0cy5jdXN0b21lci50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOL29iamVjdHMucGlwZWxpbmUudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9vYmplY3RzLmNvbW1lcmNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vb2JqZWN0cy5zZXJ2aWNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vb2JqZWN0cy5hY3Rpdml0eS50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOL29iamVjdHMubWFya2V0aW5nLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04udHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9hcHAudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9fc2hhcmVkLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5jdXN0b21lci50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQL29iamVjdHMucGlwZWxpbmUudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9vYmplY3RzLmNvbW1lcmNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5zZXJ2aWNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5hY3Rpdml0eS50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQL29iamVjdHMubWFya2V0aW5nLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy9hcHAudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy9fc2hhcmVkLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvb2JqZWN0cy5jdXN0b21lci50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL29iamVjdHMucGlwZWxpbmUudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy9vYmplY3RzLmNvbW1lcmNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvb2JqZWN0cy5zZXJ2aWNlLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvb2JqZWN0cy5hY3Rpdml0eS50cyIsICJzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL29iamVjdHMubWFya2V0aW5nLnRzIiwgInNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMudHMiLCAic3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9jcm0udHJhbnNsYXRpb24udHMiLCAic3JjL3NhbGVzL3ZpZXdzL2luZGV4LnRzIiwgInNyYy9zYWxlcy92aWV3cy9sZWFkLnZpZXcudHMiLCAic3JjL3NhbGVzL3ZpZXdzL2FjY291bnQudmlldy50cyIsICJzcmMvc2FsZXMvdmlld3MvY29udGFjdC52aWV3LnRzIiwgInNyYy9zYWxlcy92aWV3cy9vcHBvcnR1bml0eS52aWV3LnRzIiwgInNyYy9zYWxlcy92aWV3cy90YXNrLnZpZXcudHMiLCAic3JjL3NhbGVzL3ZpZXdzL2V2ZW50LnZpZXcudHMiLCAic3JjL3NhbGVzL3ZpZXdzL2V2ZW50X2F0dGVuZGVlLnZpZXcudHMiLCAic3JjL3NhbGVzL3ZpZXdzL2ZvcmVjYXN0LnZpZXcudHMiLCAic3JjL3JldmVudWUvdmlld3MvaW5kZXgudHMiLCAic3JjL3JldmVudWUvdmlld3MvY29udHJhY3Qudmlldy50cyIsICJzcmMvcmV2ZW51ZS92aWV3cy9wcm9kdWN0LnZpZXcudHMiLCAic3JjL3JldmVudWUvdmlld3MvcXVvdGUudmlldy50cyIsICJzcmMvbWFya2V0aW5nL3ZpZXdzL2luZGV4LnRzIiwgInNyYy9tYXJrZXRpbmcvdmlld3MvY2FtcGFpZ24udmlldy50cyIsICJzcmMvc2FsZXMvcGFnZXMvaW5kZXgudHMiLCAic3JjL3NhbGVzL3BhZ2VzL2xlYWRfZGV0YWlsLnBhZ2UudHMiLCAic3JjL3NhbGVzL3BhZ2VzL29wcG9ydHVuaXR5X2RldGFpbC5wYWdlLnRzIiwgInNyYy9zYWxlcy9wYWdlcy9hY2NvdW50X2RldGFpbC5wYWdlLnRzIiwgInNyYy9zYWxlcy9wYWdlcy9hY2NvdW50X3dvcmtiZW5jaC5wYWdlLnRzIiwgInNyYy9zYWxlcy9wYWdlcy9ob21lLnBhZ2UudHMiLCAic3JjL3NhbGVzL3BhZ2VzL2FwcF9sYXVuY2hlci5wYWdlLnRzIiwgInNyYy9zYWxlcy9wYWdlcy91dGlsaXR5X2Jhci5wYWdlLnRzIiwgInNyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvaW5kZXgudHMiLCAic3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9lbi50cyIsICJzcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzL3poLUNOLnRzIiwgInNyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvamEtSlAudHMiLCAic3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9lcy1FUy50cyIsICJzcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzL2NybS5lbWFpbC10ZW1wbGF0ZS50cyIsICJzcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXMvaW5kZXgudHMiLCAic3JjL3JldmVudWUvZW1haWwtdGVtcGxhdGVzL2VuLnRzIiwgInNyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlcy96aC1DTi50cyIsICJzcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXMvamEtSlAudHMiLCAic3JjL3JldmVudWUvZW1haWwtdGVtcGxhdGVzL2VzLUVTLnRzIiwgInNyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlcy9jcm0uZW1haWwtdGVtcGxhdGUudHMiLCAic3JjL3NhbGVzL3Byb2ZpbGVzL3RlbmFudC1hZG1pbi5wcm9maWxlLnRzIiwgInNyYy9zYWxlcy9vYmplY3RzL2FjY291bnQuaG9vay50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9jb250YWN0Lmhvb2sudHMiLCAic3JjL3NhbGVzL29iamVjdHMvZXZlbnQuaG9vay50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9mb3JlY2FzdC5ob29rLnRzIiwgInNyYy9zYWxlcy9vYmplY3RzL2xlYWQuaG9vay50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9sZWFkLmNhbXBhaWduLW1ldHJpY3MuaG9vay50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy9vcHBvcnR1bml0eS5ob29rLnRzIiwgInNyYy9zYWxlcy9vYmplY3RzL29wcG9ydHVuaXR5LmNhbXBhaWduLW1ldHJpY3MuaG9vay50cyIsICJzcmMvc2FsZXMvb2JqZWN0cy90YXNrLmhvb2sudHMiLCAic3JjL3JldmVudWUvb2JqZWN0cy9jb250cmFjdC5ob29rLnRzIiwgInNyYy9yZXZlbnVlL29iamVjdHMvX2xpbmUtaXRlbS1wcmljZS1maWxsLnRzIiwgInNyYy9yZXZlbnVlL29iamVjdHMvb3Bwb3J0dW5pdHlfbGluZV9pdGVtLmhvb2sudHMiLCAic3JjL3JldmVudWUvb2JqZWN0cy9wcm9kdWN0Lmhvb2sudHMiLCAic3JjL3JldmVudWUvb2JqZWN0cy9xdW90ZS5ob29rLnRzIiwgInNyYy9yZXZlbnVlL29iamVjdHMvcXVvdGVfbGluZV9pdGVtLmhvb2sudHMiLCAic3JjL21hcmtldGluZy9vYmplY3RzL2NhbXBhaWduLmhvb2sudHMiLCAic3JjL21hcmtldGluZy9vYmplY3RzL2NhbXBhaWduX21lbWJlci5ob29rLnRzIiwgInNyYy9zYWxlcy9mbG93cy9sZWFkLWNvbnZlcnNpb24uZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3MvbGVhZC1jb252ZXJzaW9uLWFwcHJvdmFsLmZsb3cudHMiLCAic3JjL3NhbGVzL2Zsb3dzL2FjY291bnQtYXBwcm92YWwuZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3Mvc2NoZWR1bGUtZm9sbG93dXAuZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3Mvb3Bwb3J0dW5pdHktYXBwcm92YWwuZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3Mvb3Bwb3J0dW5pdHktc3RhdHVzLWNoYW5nZS1hcHByb3ZhbC5mbG93LnRzIiwgInNyYy9zYWxlcy9mbG93cy9vcHBvcnR1bml0eS1xdWFsaWZpY2F0aW9uLWFwcHJvdmFsLmZsb3cudHMiLCAic3JjL3NhbGVzL2Zsb3dzL29wcG9ydHVuaXR5LXN0YWduYXRpb24uZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3MvZm9yZWNhc3Qtc25hcHNob3QuZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3MvbGVhZC1hc3NpZ25tZW50LmZsb3cudHMiLCAic3JjL3NhbGVzL2Zsb3dzL2NvbnRhY3Qtd2VsY29tZS5mbG93LnRzIiwgInNyYy9zYWxlcy9mbG93cy9vcHBvcnR1bml0eS13b24tYWxlcnQuZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3MvdGFzay11cmdlbnQtYWxlcnQuZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3MvdGFzay1kdWUtcmVtaW5kZXIuZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3MvYmlsbGluZy1oYW5kb2ZmLWNsb3NlZC13b24uZmxvdy50cyIsICJzcmMvc2FsZXMvZmxvd3MvX2JpbGxpbmctZW5kcG9pbnQudHMiLCAic3JjL3JldmVudWUvZmxvd3MvcXVvdGUtZ2VuZXJhdGlvbi5mbG93LnRzIiwgInNyYy9yZXZlbnVlL2Zsb3dzL2NvbnRyYWN0LXJlbmV3YWwuZmxvdy50cyIsICJzcmMvcmV2ZW51ZS9mbG93cy9xdW90ZS1leHBpcmF0aW9uLmZsb3cudHMiLCAic3JjL3JldmVudWUvZmxvd3MvY29udHJhY3QtZXhwaXJhdGlvbi5mbG93LnRzIiwgInNyYy9yZXZlbnVlL2Zsb3dzL2JpbGxpbmctaGFuZG9mZi1jb250cmFjdC1hY3RpdmF0ZWQuZmxvdy50cyIsICJzcmMvbWFya2V0aW5nL2Zsb3dzL2NhbXBhaWduLWVucm9sbG1lbnQuZmxvdy50cyIsICJzcmMvbWFya2V0aW5nL2Zsb3dzL2NhbXBhaWduLW1lbWJlci1lbnJvbGwuZmxvdy50cyIsICJzcmMvbWFya2V0aW5nL2Zsb3dzL2NhbXBhaWduLWNvbXBsZXRpb24uZmxvdy50cyIsICJzcmMvc2FsZXMvc2tpbGxzL2xlYWQtcXVhbGlmaWNhdGlvbi5za2lsbC50cyIsICJzcmMvc2FsZXMvc2tpbGxzL2VtYWlsLWRyYWZ0aW5nLnNraWxsLnRzIiwgInNyYy9zYWxlcy9za2lsbHMvcmV2ZW51ZS1mb3JlY2FzdGluZy5za2lsbC50cyIsICJzcmMvc2FsZXMvc2tpbGxzL2N1c3RvbWVyLTM2MC5za2lsbC50cyIsICJzcmMvc2FsZXMvc2tpbGxzL2xpdmUtZGF0YS5za2lsbC50cyIsICJzcmMvc2FsZXMvc2hhcmluZy9hY2NvdW50LnNoYXJpbmcudHMiLCAic3JjL3NhbGVzL3NoYXJpbmcvb3Bwb3J0dW5pdHkuc2hhcmluZy50cyIsICJzcmMvc2FsZXMvc2hhcmluZy9wb3NpdGlvbnMudHMiLCAic3JjL21hcmtldGluZy9zaGFyaW5nL2NhbXBhaWduLnNoYXJpbmcudHMiLCAic3JjL3NhbGVzL2RhdGEvc2FsZXMuc2VlZC50cyIsICJzcmMvc2FsZXMvZGF0YS9fc2hhcmVkLnRzIiwgInNyYy9zYWxlcy9kYXRhL2FjdGl2aXR5LnNlZWQudHMiLCAic3JjL3NhbGVzL2RhdGEvZm9yZWNhc3Quc2VlZC50cyIsICJzcmMvc2FsZXMvZGF0YS9pbmRleC50cyIsICJzcmMvcmV2ZW51ZS9kYXRhL2NhdGFsb2cuc2VlZC50cyIsICJzcmMvcmV2ZW51ZS9kYXRhL29wcG9ydHVuaXR5LWxpbmUtaXRlbS5zZWVkLnRzIiwgInNyYy9yZXZlbnVlL2RhdGEvcmV2ZW51ZS5zZWVkLnRzIiwgInNyYy9zZXJ2aWNlL2RhdGEvc2VydmljZS5zZWVkLnRzIiwgInNyYy9zZXJ2aWNlL29iamVjdHMvX2Nhc2Utc2xhLnRzIiwgInNyYy9tYXJrZXRpbmcvZGF0YS9tYXJrZXRpbmcuc2VlZC50cyIsICJvYmplY3RzdGFjay5jb21wb3NpdGlvbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L29iamVjdHN0YWNrLmNvbmZpZy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3XCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvb2JqZWN0c3RhY2suY29uZmlnLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBjb21wb3NlU3RhY2tzIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuXG4vLyBUaGUgdHdvIHBhY2thZ2Ugc3RhY2tzLCBidWlsdCBcdTIwMTQgc2VlIGBvYmplY3RzdGFjay5jb21wb3NpdGlvbi50c2AsIHdoaWNoIGFsc29cbi8vIHJlc29sdmVzIHRoZSBgSE9UQ1JNX0NPTVBPU0lUSU9OYCBrbm9iIGFuZCByZWNvcmRzIHdoeSB0aGF0IHdvcmsgY2Fubm90IGxpdmVcbi8vIGluIHRoaXMgZmlsZSAoXHUyNkQ0IHRoaXMgbW9kdWxlIG1heSBjYXJyeSBubyBuYW1lZCBleHBvcnQ6IHRoZSBidWlsZCBwYXJzZXMgaXRcbi8vIGFnYWluc3QgYSBgLnN0cmljdGAgc3RhY2sgc2NoZW1hIGFuZCBmYWlscyBvbiBhbnkga2V5IGJ1dCB0aGUgZGVmYXVsdCkuXG5pbXBvcnQgeyBzZXJ2aWNlU3RhY2ssIGFwcFN0YWNrIH0gZnJvbSAnLi9vYmplY3RzdGFjay5jb21wb3NpdGlvbi5qcyc7XG5cbi8qKlxuICogT05FIHJlbGVhc2UgYXJ0aWZhY3QsIFRXTyBwYWNrYWdlcyAoQURSLTAxMzAgRDQpLlxuICpcbiAqICAtIGBhcHAub2JqZWN0c3RhY2suaG90Y3JtYCAoYHNyYy9zYWxlcy9pbmRleC50c2ApIFx1MjAxNCB0aGUgYHR5cGU6ICdhcHAnYFxuICogICAgcGFja2FnZSBhIGN1c3RvbWVyIGluc3RhbGxzOiBzYWxlcywgcGx1cyB0aGUgYHNyYy9yZXZlbnVlL2AgYW5kXG4gKiAgICBgc3JjL21hcmtldGluZy9gIGRpcmVjdG9yaWVzIGl0IHN0aWxsIHJlZ2lzdGVycywgdGhlIGFwcCBhbmQgaXRzXG4gKiAgICBuYXZpZ2F0aW9uIGdyb3VwcywgdGhlIHBlcm1pc3Npb24gc2V0cywgdGhlIGxvY2FsZSBwYWNrcy5cbiAqICAtIGBhcHAub2JqZWN0c3RhY2suaG90Y3JtLnNlcnZpY2VgIChgc3JjL3NlcnZpY2UvaW5kZXgudHNgKSBcdTIwMTQgdGhlIHN1cHBvcnRcbiAqICAgIG1vZHVsZTogY2FzZXMgYW5kIGtub3dsZWRnZSwgYW5kIHRoZSBmaXZlIG5hdmlnYXRpb24gZW50cmllcyBpdFxuICogICAgY29udHJpYnV0ZXMgaW50byB0aGUgYXBwJ3MgZ3JvdXBzLlxuICpcbiAqIGBtYW5pZmVzdDogJ3ByZXNlcnZlJ2AgaXMgdGhlIG9ubHkgb3B0aW9uIHRoYXQgc2VwYXJhdGVzIFwib25lIGFydGlmYWN0XG4gKiBjYXJyeWluZyBOIHBhY2thZ2VzXCIgZnJvbSB0aGUgcGljay1vbmUgY29tcG9zaXRpb24gZXZlcnkgb3RoZXIgc3RyYXRlZ3lcbiAqIHBlcmZvcm1zLiBJdCBlbWl0cyBgcGFja2FnZXNbXWAsIG9uZSBlbnRyeSBwZXIgaW5wdXQgc3RhY2sgY2FycnlpbmcgdGhhdFxuICogcGFja2FnZSBBU1NFTUJMRUQgXHUyMDE0IGl0cyBtYW5pZmVzdCBwbHVzIHRoZSBjb2xsZWN0aW9ucyBpdCBvd25zLiBUaGF0IGxpc3QgaXNcbiAqIHdoYXQgYE9iamVjdFFMLnJlZ2lzdGVyQXBwYCByZWdpc3RlcnMgcGFja2FnZSBieSBwYWNrYWdlLCBhbmQgaXQgaXMgd2hlcmVcbiAqIHBlci1wYWNrYWdlIE9XTkVSU0hJUCBjb21lcyBmcm9tLiBFYWNoIGRlZmluaXRpb24gaXMgY2FycmllZCBPTkNFLCBpbiB0aGVcbiAqIGJvZHkgb2YgdGhlIHBhY2thZ2UgdGhhdCBvd25zIGl0OiBhIG11bHRpLXBhY2thZ2UgYXJ0aWZhY3QgaGFzIG5vIGZsYXR0ZW5lZFxuICogY29weSBvZiBpdHMgY29sbGVjdGlvbnMgYmVzaWRlIGBwYWNrYWdlc1tdYCAoQURSLTAxMzAgRDQsIDIwMjYtMDktMjJcbiAqIGFkZGVuZHVtKSwgc28gYSByZWFkZXIgd2FudGluZyBcImV2ZXJ5IG9iamVjdCBvZiB0aGUgYXBwXCIgcmVzb2x2ZXMgdGhlXG4gKiBwYWNrYWdlIGJvZGllcywgYXMgZXZlcnkgcGxhdGZvcm0gcmVhZGVyIGRvZXMuXG4gKlxuICogVGhlIEFwcCBwYWNrYWdlIGlzIExBU1QgZGVsaWJlcmF0ZWx5LCBhbmQgdGhhdCBpcyBub3QgdGhlIGxvYWQtYmVhcmluZyBoYWxmOlxuICpcbiAqICAtIHRoZSBzaW5ndWxhciBgbWFuaWZlc3RgIGlzIHN0aWxsIHBpY2tlZCBieSB0aGUgZGVmYXVsdCBgJ2xhc3QnYCBydWxlLCBzb1xuICogICAgdGhlIGFydGlmYWN0IGlkZW50aWZpZXMgYXMgdGhlIEFwcCBhIGNvbnN1bWVyIGluc3RhbGxzIChBRFItMDAxOSBEMSksXG4gKiAgICBgYXBwLm9iamVjdHN0YWNrLmhvdGNybWAsIG5vdCBhcyBvbmUgb2YgaXRzIG1vZHVsZXM7XG4gKiAgLSBSRUdJU1RSQVRJT04gb3JkZXIgaXMgZGVjaWRlZCBieSBgZGVwZW5kZW5jaWVzYCBcdTIwMTQgdGhlIHNlcnZpY2UgbW9kdWxlXG4gKiAgICBkZWNsYXJlcyBgYXBwLm9iamVjdHN0YWNrLmhvdGNybWAsIGFuZCBgcGFja2FnZXNbXWAgaXMgc29ydGVkIHRocm91Z2ggdGhlXG4gKiAgICBwbGF0Zm9ybSdzIG9uZSB0b3BvbG9naWNhbCBzb3J0ZXIgKEFEUi0wMTMwIEQ1LCBBRFItMDExNikgXHUyMDE0IHNvIHRoZSBhcHBcbiAqICAgIHJlZ2lzdGVycyBmaXJzdCB3aGF0ZXZlciBzbG90IGl0IG9jY3VwaWVzIGhlcmUuIEFuIGFydGlmYWN0IHRoYXQgb25seVxuICogICAgd29ya2VkIGJlY2F1c2Ugc29tZW9uZSBsaXN0ZWQgdGhlIHBhY2thZ2VzIGluIHRoZSByaWdodCBvcmRlciBpcyB0aGVcbiAqICAgIGZhaWx1cmUgQURSLTAxMTYgZXhpc3RzIGFib3V0LCBhbmQgaXQgZmFpbHMgU0lMRU5UTFkuXG4gKlxuICogYG9iamVjdHN0YWNrIGJ1aWxkYCBjb21waWxlcyB0aGlzIGZpbGUgaW50byBvbmUgYGRpc3Qvb2JqZWN0c3RhY2suanNvbmA7XG4gKiBgb2JqZWN0c3RhY2sgZGV2YCBib290cyB0aGUgc2FtZSBzaGFwZSBzdHJhaWdodCBmcm9tIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY29tcG9zZVN0YWNrcyhbc2VydmljZVN0YWNrLCBhcHBTdGFja10sIHsgbWFuaWZlc3Q6ICdwcmVzZXJ2ZScgfSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9pbmRleC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNiBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lU3RhY2ssIHR5cGUgT2JqZWN0U3RhY2tEZWZpbml0aW9uLCB0eXBlIE9iamVjdFN0YWNrRGVmaW5pdGlvbklucHV0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuXG4vKipcbiAqIEV2ZXJ5dGhpbmcgdGhlIGFwcCBwYWNrYWdlIFJFR0lTVEVSUywgYXMgb3Bwb3NlZCB0byB3aGF0IGl0IElTLlxuICpcbiAqIFRoZSBpZGVudGl0eSBrZXlzIGFyZSBub3QgaW4gaXQgYW5kIGNhbm5vdCBiZSBwYXNzZWQ6IGBtYW5pZmVzdGAsIGByZXF1aXJlc2BcbiAqIGFuZCBgaTE4bmAgYXJlIHRoaXMgcGFja2FnZSdzIG93biBzdGF0ZW1lbnQgYWJvdXQgaXRzZWxmLCBhbmQgYHBhY2thZ2VzYFxuICogYmVsb25ncyB0byB0aGUgYXJ0aWZhY3QgZW52ZWxvcGUgb25lIGxldmVsIHVwLlxuICovXG5leHBvcnQgdHlwZSBIb3RDcm1BcHBDb2xsZWN0aW9ucyA9IE9taXQ8XG4gIE9iamVjdFN0YWNrRGVmaW5pdGlvbklucHV0LFxuICAnbWFuaWZlc3QnIHwgJ3BhY2thZ2VzJyB8ICdyZXF1aXJlcycgfCAnaTE4bidcbj47XG5cbi8qKlxuICogYGFwcC5vYmplY3RzdGFjay5ob3Rjcm1gIFx1MjAxNCB0aGUgQXBwIHBhY2thZ2Ugb2YgdGhpcyBhcnRpZmFjdCwgYW5kIHRoZSBzYWxlc1xuICogbW9kdWxlIChBRFItMDEzMCBENCwgYG1vZHVsZS1zcGxpdC1wbGFuLm1kYCBkZWNpc2lvbiA0KS5cbiAqXG4gKiBBRFItMDAxOSByZXF1aXJlcyBleGFjdGx5IG9uZSBgdHlwZTogJ2FwcCdgIHBhY2thZ2UgcGVyIGFydGlmYWN0IGFuZCB0aGVcbiAqIGFydGlmYWN0IHRha2VzIGl0cyBpZGVudGl0eSBmcm9tIGl0OyBub3RoaW5nIHJlcXVpcmVzIHRoYXQgcGFja2FnZSB0byBiZSBhblxuICogZW1wdHkgc2hlbGwsIGFuZCB0aGUgcGxhdGZvcm0ncyBvd24gdHdvLXBhY2thZ2UgZml4dHVyZVxuICogKGBleGFtcGxlcy9hcHAtbXVsdGktcGFja2FnZWApIHNheXMgdGhlIG9wcG9zaXRlIFx1MjAxNCBpdHMgQXBwIHBhY2thZ2Ugb3ducyB0aGVcbiAqIGN1c3RvbWVyIG9iamVjdCBhbmQgdGhlIG5hdmlnYXRpb24uIFNvIHNhbGVzIElTIHRoZSBhcHA6IGl0IGtlZXBzIHRoZSBpZFxuICogYGFwcC5vYmplY3RzdGFjay5ob3Rjcm1gLCBvd25zIHRoZSBjdXN0b21lciBjb3JlIGFuZCB0aGUgYWN0aXZpdHkgb2JqZWN0cyxcbiAqIHRoZSBhcHAgYW5kIGl0cyBuYXZpZ2F0aW9uIEdST1VQUywgdGhlIGNyb3NzLWRvbWFpbiBkYXNoYm9hcmRzIGFuZCBza2lsbHMsXG4gKiB0aGUgcGVybWlzc2lvbiBzZXRzLCB0aGUgcG9zaXRpb25zLCB0aGUgZm91ciBsb2NhbGUgcGFja3MsIHRoZSBpbXBvcnRcbiAqIG1hcHBpbmdzLCBhbmQgZXZlcnkgc291cmNlIGZpbGUgbW9yZSB0aGFuIG9uZSBwYWNrYWdlIG5lZWRzLlxuICpcbiAqICMjIFdoeSB0aGlzIGZpbGUgdGFrZXMgaXRzIGNvbGxlY3Rpb25zIGluc3RlYWQgb2YgaW1wb3J0aW5nIHRoZW1cbiAqXG4gKiBgc3JjL3JldmVudWUvYCBhbmQgYHNyYy9tYXJrZXRpbmcvYCBhcmUgcGFja2FnZXMgaW4gdGhlIExBWU9VVCBidXQgbm90IHlldFxuICogcGFja2FnZXMgaW4gdGhlIEFSVElGQUNUIFx1MjAxNCB0aGUgcnVsaW5nIGFza2VkIGZvciBzYWxlcyBhbmQgc3VwcG9ydCBmaXJzdCBcdTIwMTQgc29cbiAqIHRoZSBhcHAgcGFja2FnZSByZWdpc3RlcnMgdGhlaXIgY29sbGVjdGlvbnMgZm9yIG5vdy4gQSBmaWxlIHVuZGVyXG4gKiBgc3JjL3NhbGVzL2AgbWF5IG5vdCBpbXBvcnQgZnJvbSBhIG1vZHVsZSBkaXJlY3RvcnkgKEFHRU5UUy5tZCAqUHJvamVjdFxuICogQXJjaGl0ZWN0dXJlKiBydWxlIDI6IG93biBkaXJlY3Rvcnkgb3IgYHNyYy9zYWxlcy9gLCBuZXZlciBzaWRld2F5cyksIHNvIHRoZVxuICogYXNzZW1ibHkgb2YgdGhvc2UgdHdvIGNhbm5vdCBoYXBwZW4gaGVyZS4gSXQgaGFwcGVucyBpblxuICogYG9iamVjdHN0YWNrLmNvbXBvc2l0aW9uLnRzYCwgdGhlIHJvb3QgbW9kdWxlIHRoYXQgaXMgYWxsb3dlZCB0byBzZWUgZXZlcnlcbiAqIHBhY2thZ2UuIFdoZW4gcmV2ZW51ZSBhbmQgbWFya2V0aW5nIGJlY29tZSBwYWNrYWdlcyBvZiB0aGVpciBvd24sIHRoZVxuICogYXJndW1lbnQgc2hyaW5rcyB0byB0aGUgc2FsZXMgYmFycmVscyBhbmQgdGhpcyBmaWxlIGNhbiBpbXBvcnQgdGhlbSBpdHNlbGYuXG4gKlxuICogIyMgYGFydGlmYWN0T2JqZWN0c2AgXHUyMDE0IHRoZSBwZXJtaXNzaW9uIHNldHMgc3RheSB3aG9sZSBoZXJlXG4gKlxuICogQURSLTAxMzAncyAyMDI2LTA5LTAyIGFkZGVuZHVtIGtlZXBzIGV2ZXJ5IHBlcm1pc3Npb24gc2V0IFdIT0xFIGluIHRoZVxuICogYHR5cGU6ICdhcHAnYCBwYWNrYWdlOiBhIHNldCBpcyBhdXRob3JlZCBwZXIgUk9MRSwgc28gbm8gbW9kdWxlIG93bnMgb25lLiBUaGVcbiAqIGFwcCBwYWNrYWdlIGFsc28gb3ducyBvYmplY3RzIG9mIGl0cyBvd24sIHNvIGBkZWZpbmVTdGFja2Agd291bGQgb3RoZXJ3aXNlXG4gKiByZWFkIGEgZ3JhbnQgb24gYGNybV9jYXNlYCBhcyBhIGdyYW50IG9uIGFuIG9iamVjdCBcIm5vdCBkZWZpbmVkIGluIG9iamVjdHNcIi5cbiAqIGBhcnRpZmFjdE9iamVjdHNgIGlzIHRoZSBwbGF0Zm9ybSdzIGFuc3dlciB0byBleGFjdGx5IHRoYXQgKG9iamVjdHN0YWNrIzE4MjAyKTpcbiAqIHRoZSBuYW1lcyB0aGUgT1RIRVIgcGFja2FnZXMgb2YgdGhpcyBhcnRpZmFjdCBvd24sIGFnYWluc3Qgd2hpY2ggdGhpc1xuICogcGFja2FnZSdzIGBwZXJtaXNzaW9uc1tdLm9iamVjdHNgIGFuZCBgZGF0YVtdLm9iamVjdGAgXHUyMDE0IGFuZCB0aG9zZSB0d29cbiAqIHJlZmVyZW5jZSBjbGFzc2VzIG9ubHkgXHUyMDE0IGFyZSByZXNvbHZlZC4gTWVhc3VyZWQgb24gMTcuNy4wOiB3aXRob3V0IGl0LCB0aGVcbiAqIHNldmVuIHNldHMnIDE4IGdyYW50cyBvbiBgY3JtX2Nhc2VgLCBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCBhbmRcbiAqIGBjcm1fYXJ0aWNsZV9mZWVkYmFja2AgYXJlIHJlZnVzZWQgKFwiZGVmaW5lU3RhY2sgY3Jvc3MtcmVmZXJlbmNlIHZhbGlkYXRpb25cbiAqIGZhaWxlZCAoMTggaXNzdWVzKVwiKTsgd2l0aCBpdCwgbm9uZS4gVGhlIGNsYWltIGlzIHZlcmlmaWVkLCBub3QgdHJ1c3RlZDogYVxuICogZ3JhbnQgbmFtaW5nIGFuIG9iamVjdCBubyBwYWNrYWdlIG9mIHRoZSBhcnRpZmFjdCBkZWZpbmVzIGlzIHN0aWxsIHJlZnVzZWQsXG4gKiBieSBgY29tcG9zZVN0YWNrc2AnIGFydGlmYWN0IHBhc3MsIGV2ZW4gd2hlbiB0aGUgbmFtZSBpcyBsaXN0ZWQgaGVyZS4gQSBob29rXG4gKiBvciBhbiBhcHAgbmF2aWdhdGlvbiBlbnRyeSBvbiBhbm90aGVyIHBhY2thZ2UncyBvYmplY3Qgc3RheXMgcmVmdXNlZDtcbiAqIG5hdmlnYXRpb24gY3Jvc3NlcyBvbmx5IHRocm91Z2ggdGhlIG1vZHVsZSdzIGBuYXZpZ2F0aW9uQ29udHJpYnV0aW9uc2AuXG4gKlxuICogIyMgV2hhdCBpcyBkZWxpYmVyYXRlbHkgTk9UIGhlcmVcbiAqXG4gKiBUaGUgYEhPVENSTV9DT01QT1NJVElPTmAga25vYiAoIzEzNjEpLiBJdCBzZWxlY3RzIHBlcm1pc3Npb24gc2V0cyBhbmQgc2VlZFxuICogZmFtaWxpZXMsIGFuZCBpdCBpcyByZXNvbHZlZCBvbmNlIGF0IHRoZSByb290IGFuZCBoYW5kZWQgZG93biBhbHJlYWR5XG4gKiBhcHBsaWVkIFx1MjAxNCBgb2JqZWN0c3RhY2suY29tcG9zaXRpb24udHNgIGNhcnJpZXMgdGhlIGZ1bGwgYXVkaXQgb2Ygd2hhdCB0aGVcbiAqIGtub2IgY2hhbmdlcyBhbmQgd2h5LCBiZWNhdXNlIHRoZSBhbnN3ZXIgaXMgYWJvdXQgdGhlIEFSVElGQUNULCBub3QgYWJvdXRcbiAqIHRoaXMgcGFja2FnZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUhvdENybUFwcFN0YWNrID0gKFxuICBjb2xsZWN0aW9uczogSG90Q3JtQXBwQ29sbGVjdGlvbnMsXG4gIG9wdGlvbnM6IHsgYXJ0aWZhY3RPYmplY3RzOiByZWFkb25seSBzdHJpbmdbXSB9LFxuKTogT2JqZWN0U3RhY2tEZWZpbml0aW9uID0+XG4gIGRlZmluZVN0YWNrKHtcbiAgICBtYW5pZmVzdDoge1xuICAgICAgaWQ6ICdhcHAub2JqZWN0c3RhY2suaG90Y3JtJyxcbiAgICAgIG5hbWVzcGFjZTogJ2NybScsXG4gICAgICB2ZXJzaW9uOiAnNC4wLjEnLFxuICAgICAgdHlwZTogJ2FwcCcsXG4gICAgICBuYW1lOiAnSG90Q1JNJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQUktTmF0aXZlIENSTSBmb3IgdGhlIE9iamVjdFN0YWNrIG1hcmtldHBsYWNlIFx1MjAxNCBBY2NvdW50cywgQ29udGFjdHMsIExlYWRzLCBPcHBvcnR1bml0aWVzLCBDYXNlcywgS25vd2xlZGdlLCBGb3JlY2FzdHMsIENhbXBhaWducywgQ29udHJhY3RzLicsXG4gICAgICAvLyBBRFItMDA4NyBwcm90b2NvbCBoYW5kc2hha2UgKEFEUi0wMDI1IFx1MDBBNzMuMik6IHRoZSBtZXRhZGF0YS9ydW50aW1lXG4gICAgICAvLyBwcm90b2NvbCBtYWpvciB0aGlzIGFwcCdzIG1ldGFkYXRhIGlzIGF1dGhvcmVkIGFnYWluc3QuIE9ubHkgdGhlIG1ham9yXG4gICAgICAvLyBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGNoZWNrIFx1MjAxNCBhIHJ1bnRpbWUgb24gYSBkaWZmZXJlbnQgbWFqb3IgcmVmdXNlcyB0aGVcbiAgICAgIC8vIGxvYWQgd2l0aCBhIHN0cnVjdHVyZWQgT1NfUFJPVE9DT0xfSU5DT01QQVRJQkxFIGRpYWdub3N0aWMgKG5hbWluZyB0aGVcbiAgICAgIC8vIGBvYmplY3RzdGFjayBtaWdyYXRlIG1ldGFgIHJlcGxheSkgaW5zdGVhZCBvZiBmYWlsaW5nIGRlZXAgaW4gYSBzY2hlbWFcbiAgICAgIC8vIHBhcnNlLiBCdW1wIHRvZ2V0aGVyIHdpdGggYHNwZWNWZXJzaW9uYCBvbiBldmVyeSBwbGF0Zm9ybSB1cGdyYWRlXG4gICAgICAvLyAoZG9jcy9NQUlOVEVOQU5DRS5tZCBcdTAwQTczKSBcdTIwMTQgYHRlc3QvZG9jcy1kZWNsYXJlZC12ZXJzaW9ucy50ZXN0LnRzYCBub3dcbiAgICAgIC8vIGVuZm9yY2VzIHRoYXQgcGFpcmluZyBhZ2FpbnN0IGBvYmplY3RzdGFjay5tYW5pZmVzdC5qc29uYCBpbnN0ZWFkIG9mXG4gICAgICAvLyB0cnVzdGluZyB0aGlzIGNvbW1lbnQsIGJlY2F1c2UgdHdvIHBsYXRmb3JtIHVwZ3JhZGVzIGluIGEgcm93IChyYy4yLCB0aGVuXG4gICAgICAvLyByYy4zKSBtb3ZlZCB0aGUgbWFuaWZlc3QgYW5kIGxlZnQgdGhpcyBsaW5lIGJlaGluZCAoIzcyOCkuIEV2ZXJ5IHBhY2thZ2VcbiAgICAgIC8vIG9mIHRoaXMgYXJ0aWZhY3Qgc3RhdGVzIHRoZSBzYW1lIHByb3RvY29sOyBgc3JjL3NlcnZpY2UvaW5kZXgudHNgXG4gICAgICAvLyByZXBlYXRzIGl0IGZvciB0aGUgc2FtZSByZWFzb24uXG4gICAgICBlbmdpbmVzOiB7IHByb3RvY29sOiAnXjE4LjAuMC1uZXh0LjAnIH0sXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBQbGF0Zm9ybSBjYXBhYmlsaXRpZXMgdGhpcyBhcHAgbmVlZHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy8gVGhlIHJ1bnRpbWUgcmVzb2x2ZXMgZWFjaCBjYXBhYmlsaXR5IG5hbWUgdG8gYSBidWlsdC1pbiBzZXJ2aWNlIHBsdWdpblxuICAgIC8vIGFuZCBhdXRvLWxvYWRzIGl0ICh3aXRoIGV4dHJhcyBsaWtlIEF1dG9tYXRpb24ncyBub2RlIHBhY2tzKS4gTm8gbmVlZFxuICAgIC8vIHRvIGhhbmQtaW5zdGFudGlhdGUgcGx1Z2lucyBvciBwYXNzIGAtLXByZXNldGAgZmxhZ3MuIFNlZVxuICAgIC8vIHBhY2thZ2VzL2NsaS9zcmMvY29tbWFuZHMvc2VydmUudHMgQ0FQQUJJTElUWV9QUk9WSURFUlMgZm9yIHRoZVxuICAgIC8vIGNvbXBsZXRlIG1hcDsgZXhwbGljaXQgYHBsdWdpbnM6IFsuLi5dYCBhbHdheXMgc2hhZG93cyB0aGUgcmVzb2x2ZXIuXG4gICAgLy8gYGF1dGhgIGVuYWJsZXMgdGhlIGF1dGgvbG9naW4gc3VyZmFjZSAobG9naW4vcmVnaXN0ZXIpIHZpYSBAb2JqZWN0c3RhY2svcGx1Z2luLWF1dGguXG4gICAgLy8gYHVpYCAgIHNlcnZlcyB0aGUgdW5pZmllZCBDb25zb2xlIHNoZWxsIGFuZCBDUk0gYXBwcyB1bmRlciAvX2NvbnNvbGUvXG4gICAgLy8gICAgICAgIChsb2dpbiBhdCAvX2NvbnNvbGUvbG9naW4pLiBPYmplY3RTdGFjayA3LnggcmVwbGFjZWQgdGhlIGxlZ2FjeVxuICAgIC8vICAgICAgICAvX3N0dWRpby8gYW5kIC9fYWNjb3VudC8gbW91bnRzIHdpdGggdGhpcyBzaW5nbGUgL19jb25zb2xlLyBzdXJmYWNlLlxuICAgIC8vIEJvdGggYXJlIHJlcXVpcmVkIGZvciBhIGNsaWNrYWJsZSBsb2dpbiBmbG93IHdoZW4gcnVubmluZyBgb2JqZWN0c3RhY2sgc3RhcnRgXG4gICAgLy8gb2ZmIHRoZSBjb21waWxlZCBhcnRpZmFjdC5cbiAgICAvLyBOb3RlOiB0aGUgZm91bmRhdGlvbmFsIHNsYXRlIChxdWV1ZSwgam9iLCBjYWNoZSwgc2V0dGluZ3MsIGVtYWlsLFxuICAgIC8vIHN0b3JhZ2UpIGlzIGF1dG8taW5qZWN0ZWQgYnkgdGhlIENMSSBmb3IgZXZlcnkgbm9uLWBtaW5pbWFsYFxuICAgIC8vIHByZXNldCBcdTIwMTQgc2VlIGBBTFdBWVNfQ0FQU2AgaW4gcGFja2FnZXMvY2xpL3NyYy9jb21tYW5kcy9zZXJ2ZS50cy5cbiAgICAvLyBMaXN0ZWQgYmVsb3cgb25seSB0aGUgKm9wdC1pbiogY2FwYWJpbGl0aWVzIHRoaXMgc3RhY2sgYWN0dWFsbHlcbiAgICAvLyB3YW50cyBvbiB0b3Agb2YgdGhhdCBzbGF0ZS5cbiAgICAvLyBgdHJpZ2dlcnNgIGluc3RhbGxzIHRoZSByZWNvcmQtY2hhbmdlICsgc2NoZWR1bGUgdHJpZ2dlciBwcm92aWRlcnMgdGhhdFxuICAgIC8vIGFjdHVhbGx5IGZpcmUgYXV0b2xhdW5jaGVkIGZsb3dzIChyZWNvcmRfY2hhbmdlICYgc2NoZWR1bGUgdHlwZXMpLiBXaXRob3V0XG4gICAgLy8gaXQgdGhlIGBhdXRvbWF0aW9uYCBlbmdpbmUgcmVnaXN0ZXJzIGZsb3dzIGJ1dCBub3RoaW5nIGV2ZXIgbGF1bmNoZXMgdGhlbS5cbiAgICAvLyBTY2hlZHVsZSB0cmlnZ2VycyBydW4gdmlhIHRoZSBqb2Igc2VydmljZSAoaW4gdGhlIGFsd2F5cy1vbiBzbGF0ZSkuXG4gICAgLy9cbiAgICAvLyBUaGlzIGlzIHRoZSBBUFAgcGFja2FnZSdzIHNsYXRlLiBgZGVmaW5lU3RhY2tgIHZhbGlkYXRlcyBjYXBhYmlsaXRpZXMgcGVyXG4gICAgLy8gc3RhY2ssIHNvIGBzcmMvc2VydmljZS9pbmRleC50c2AgZGVjbGFyZXMgdGhlIGZvdXIgaXRzIG93biBtZXRhZGF0YSBuZWVkc1xuICAgIC8vIGl0c2VsZiwgYW5kIHRoZSBhcnRpZmFjdCdzIHNsYXRlIGlzIHRoZSB1bmlvbiBvZiB0aGUgdHdvIGxpc3RzLlxuICAgIC8vXG4gICAgLy8gYGFpYCBpcyBkZWxpYmVyYXRlbHkgTk9UIGxpc3RlZC4gT2JqZWN0U3RhY2sgMTEuMy4wIChBRFItMDAyNSBTMikgcmVtb3ZlZFxuICAgIC8vIGBAb2JqZWN0c3RhY2svc2VydmljZS1haWAgZnJvbSB0aGUgb3BlbiBlZGl0aW9uIFx1MjAxNCB0aGUgQUkgcnVudGltZSBub3cgc2hpcHNcbiAgICAvLyBvbmx5IGluIHRoZSBjbG9zZWQgY2xvdWQgcGFja2FnZSwgYW5kIHRoZSBmcmFtZXdvcmsgQ0xJIGRvZXMgbm90IGRlcGVuZCBvblxuICAgIC8vIGl0LiBVbmRlciBPYmplY3RTdGFjayAxNiwgYHJlcXVpcmVzOiBbJ2FpJ11gIGlzIGEgKmZhaWwtZmFzdCogY2FwYWJpbGl0eTpcbiAgICAvLyB0aGUgc2VydmUgY29tbWFuZCBoYXJkLWFib3J0cyBib290IHdoZW4gdGhlIHBhY2thZ2UgaXMgYWJzZW50LCBzbyBrZWVwaW5nIGl0XG4gICAgLy8gaGVyZSB3b3VsZCBicmVhayBgb2JqZWN0c3RhY2sgc3RhcnRgL2BkZXZgIGZvciB0aGlzIG9wZW4tZWRpdGlvbiBhcHAgKHRoZSBBSVxuICAgIC8vIGJsb2NrIHJ1bnMgYmVmb3JlIGV2ZXJ5IG90aGVyIGNhcGFiaWxpdHkgcmVzb2x2ZXMpLiBUaGUgQUkgbWV0YWRhdGEgaXNcbiAgICAvLyB1bmFmZmVjdGVkIFx1MjAxNCB0aGUgc2tpbGxzIHN0aWxsIHZhbGlkYXRlLCBidWlsZCBpbnRvIHRoZSBhcnRpZmFjdCwgYW5kIHJ1blxuICAgIC8vIHdoZXJldmVyIGEgcnVudGltZSBwcm92aWRlcyB0aGUgYGFpYCB0aWVyIChjbG91ZCdzIG9iamVjdG9zLXJ1bnRpbWUpLiBUaGVyZVxuICAgIC8vIGFyZSBubyBhcHAtYXV0aG9yZWQgYWdlbnRzOiB0aGV5IHdlcmUgcmV0aXJlZCBpbiAjNTEyIGFuZCB0aGUgc3VyZmFjZSBpc1xuICAgIC8vIHNraWxscy1vbmx5IChBRFItMDA2MyBcdTAwQTcyKTsgc2tpbGxzIGF0dGFjaCB0byBhIHBsYXRmb3JtIGFnZW50IGJ5IGBzdXJmYWNlYC5cbiAgICAvLyBBIGxvY2FsIG9wZW4tZWRpdGlvbiBib290IHNpbXBseSBvbWl0cyB0aGUgQUkgc2VydmljZSBhbmQgaGlkZXMgaXRzIGNvbnNvbGVcbiAgICAvLyBzdXJmYWNlLiBUbyBydW4gQUkgbG9jYWxseSwgZGVjbGFyZSBgQG9iamVjdHN0YWNrL3NlcnZpY2UtYWlgIChjbG91ZCkgaW5cbiAgICAvLyBwYWNrYWdlLmpzb24gXHUyMDE0IGl0cyBtZXJlIHByZXNlbmNlIGJlc3QtZWZmb3J0IGF1dG8tbG9hZHMgaXQuXG4gICAgLy8gYGhpZXJhcmNoeS1zZWN1cml0eWAgaXMgdGhlIE9ORSBlbnRlcnByaXNlLWVkaXRpb24gY2FwYWJpbGl0eSB0aGlzIGFwcFxuICAgIC8vIGRlY2xhcmVzLiBJdCB3YXMgaW50cm9kdWNlZCBmb3IgIzg4MCBcdTIwMTQgYHNhbGVzX21hbmFnZXJgIGF1dGhvcmVkXG4gICAgLy8gYHdyaXRlU2NvcGU6ICdvd25fYW5kX3JlcG9ydHMnYCBvbiBgY3JtX2NvbnRyYWN0YCwgYW4gQURSLTAwNTcgSElFUkFSQ0hZXG4gICAgLy8gc2NvcGUgcmVzb2x2ZWQgYnkgdGhlIGBoaWVyYXJjaHktc2NvcGUtcmVzb2x2ZXJgIHNlcnZpY2UgdGhhdCBzaGlwcyBvbmx5XG4gICAgLy8gaW4gYEBvYmplY3RzdGFjay9zZWN1cml0eS1lbnRlcnByaXNlYCwgYW5kIGBkZWZpbmVTdGFja2AgcmVmdXNlcyBzdWNoIGFcbiAgICAvLyBncmFudCB1bmxlc3MgdGhlIGNhcGFiaWxpdHkgaXMgZGVjbGFyZWQuIFNpbmNlICM1NDkgYGNybV9jb250cmFjdGAgaXNcbiAgICAvLyBgY29udHJvbGxlZF9ieV9wYXJlbnRgIHVuZGVyIHRoZSBhY2NvdW50LCB0aGF0IHNjb3BlIGlzIGluZXJ0IGFuZCBpcyBub1xuICAgIC8vIGxvbmdlciBhdXRob3JlZDsgdGhlIGFwcCBjdXJyZW50bHkgYXV0aG9ycyBOTyBoaWVyYXJjaHkgc2NvcGUgYXQgYWxsLlxuICAgIC8vXG4gICAgLy8gVGhlIGRlY2xhcmF0aW9uIFNUQVlTLiBNYWludGFpbmVyIHJ1bGluZyAyMDI2LTA4LTMxICgjMTM3OCwgcGlubmVkIGJ5XG4gICAgLy8gYHRlc3QvaGllcmFyY2h5LXJlYWQtZGVwdGgudGVzdC50c2ApOiBub3RoaW5nIGlzIHJlbW92ZWQgZnJvbSBgcmVxdWlyZXNbXWAuXG4gICAgLy8gTWFpbnRhaW5lciBydWxpbmcsIDIwMjYtMDgtMTEsIHZlcmJhdGltOiBcdTMwMENcdTY3MkNcdTk4NzlcdTc2RUVcdTY2MkZcdTUxNDNcdTY1NzBcdTYzNkVhcHBcdUZGMENcdTU3MjhcdTRGMDFcdTRFMUFcdTcyNDhcdThGRDBcdTg4NENcdTVDMzFcbiAgICAvLyBcdTUxNzdcdTU5MDdcdTRGMDFcdTRFMUFcdTcyNDhcdTc2RjhcdTUxNzNcdTc2ODRcdTgwRkRcdTUyOUJcdUZGMENcdTRFMERcdTkxQ0RcdTU5MERcdTVGMDBcdTUzRDFcdTMwMDJcdTMwMEQgVGhlIGFwcCBzdGF0ZXMgd2hhdCBpdCBNRUFOUyBhbmQgdGhlXG4gICAgLy8gZWRpdGlvbiBzdXBwbGllcyB0aGUgY2FwYWJpbGl0eSwgcmF0aGVyIHRoYW4gYXBwcm94aW1hdGluZyBpdCB3aXRoIGEgYnJvYWRlclxuICAgIC8vIG9wZW4tZWRpdGlvbiB2YWx1ZS5cbiAgICAvL1xuICAgIC8vIFVOTElLRSBgYWlgIGFib3ZlLCB0aGlzIGlzIFNBRkUgdG8gZGVjbGFyZSBvbiBhbiBvcGVuLWVkaXRpb24gYm9vdCBhbmQgZG9lc1xuICAgIC8vIE5PVCBmYWlsIGZhc3QuIFZlcmlmaWVkIGFnYWluc3QgYEBvYmplY3RzdGFjay9jbGlgJ3Mgc2VydmUgY29tbWFuZDogdGhlXG4gICAgLy8gY2FwYWJpbGl0eSByZXNvbHZlciBsb29rcyB0aGUgdG9rZW4gdXAgaW4gYENBUEFCSUxJVFlfUFJPVklERVJTYCwgZmluZHMgbm9cbiAgICAvLyBlbnRyeSwgYW5kIGJlY2F1c2UgYGhpZXJhcmNoeS1zZWN1cml0eWAgSVMgaW4gdGhlIGtub3duXG4gICAgLy8gYFBMQVRGT1JNX0NBUEFCSUxJVFlfVE9LRU5TYCB2b2NhYnVsYXJ5IGl0IHRha2VzIHRoZSBkZWxpYmVyYXRlIFwic3RheSBxdWlldFwiXG4gICAgLy8gYnJhbmNoIFx1MjAxNCBubyB3YXJuaW5nLCBubyBhYm9ydCBcdTIwMTQgc2luY2UgdGhlIGNhcGFiaWxpdHkgYXJyaXZlcyB2aWEgYW4gZXhwbGljaXRcbiAgICAvLyBlbnRlcnByaXNlIHBsdWdpbiBpbiBgcGx1Z2luc1tdYC4gT25seSB0aWVyLWdhdGVkIHRva2VucyAoYWkgLyBhaS1zdHVkaW8gL1xuICAgIC8vIGkxOG4gLyB1aSAvIGF1dGgpIGhhdmUgdGhlIGRlZGljYXRlZCBoYXJkLWFib3J0IGJsb2NrcyB0aGUgbm90ZSBhYm92ZVxuICAgIC8vIGRlc2NyaWJlcy4gYG9iamVjdHN0YWNrIHZhbGlkYXRlYCBkb2VzIHByaW50IG9uZSBpbmZvcm1hdGlvbmFsIGxpbmUgbmFtaW5nXG4gICAgLy8gdGhlIHBhY2thZ2UgdG8gaW5zdGFsbDsgdGhhdCBpcyBleHBlY3RlZCBvdXRwdXQsIG5vdCBhIGRlZmVjdCB0byBzaWxlbmNlLlxuICAgIHJlcXVpcmVzOiBbJ2F1dG9tYXRpb24nLCAndHJpZ2dlcnMnLCAnYW5hbHl0aWNzJywgJ2F1dGgnLCAndWknLCAnYXBwcm92YWxzJywgJ3NoYXJpbmcnLCAnaGllcmFyY2h5LXNlY3VyaXR5J10sXG5cbiAgICAvLyBUaGUgbG9jYWxlIGNvbmZpZ3VyYXRpb24gaXMgdGhlIEFSVElGQUNUJ3MsIGFuZCBgaTE4bmAgaXMgYVxuICAgIC8vIGAnc2luZ2xlJ2AtZGlzcG9zaXRpb24ga2V5OiB0d28gc3RhY2tzIGRlY2xhcmluZyBkaWZmZXJlbnQgdmFsdWVzIG1ha2VcbiAgICAvLyBgY29tcG9zZVN0YWNrc2AgdGhyb3csIGFuZCBkZWNsYXJpbmcgaWRlbnRpY2FsIG9uZXMgdHdpY2UgaXMgYSBzZWNvbmRcbiAgICAvLyBwbGFjZSB0byBkcmlmdC4gSXQgbGl2ZXMgb24gdGhlIEFwcCBwYWNrYWdlLCBhbG9uZS5cbiAgICBpMThuOiB7XG4gICAgICBkZWZhdWx0TG9jYWxlOiAnZW4nLFxuICAgICAgc3VwcG9ydGVkTG9jYWxlczogWydlbicsICd6aC1DTicsICdqYS1KUCcsICdlcy1FUyddLFxuICAgICAgZmFsbGJhY2tMb2NhbGU6ICdlbicsXG4gICAgfSxcblxuICAgIC4uLmNvbGxlY3Rpb25zLFxuICB9LCB7IGFydGlmYWN0T2JqZWN0czogb3B0aW9ucy5hcnRpZmFjdE9iamVjdHMgfSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2luZGV4LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2VcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNiBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lU3RhY2ssIHR5cGUgT2JqZWN0U3RhY2tEZWZpbml0aW9uLCB0eXBlIE9iamVjdFN0YWNrRGVmaW5pdGlvbklucHV0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuXG5pbXBvcnQge1xuICBFc2NhbGF0ZUNhc2VBY3Rpb24sIENsb3NlQ2FzZUFjdGlvbiwgQ2xhaW1DYXNlQWN0aW9uLFxuICBMb2dDYWxsQWN0aW9uLCBMb2dNZWV0aW5nQWN0aW9uLCBDYXNlU2NoZWR1bGVNZWV0aW5nQWN0aW9uLFxuICBNYXJrQXJ0aWNsZUhlbHBmdWxBY3Rpb24sIE1hcmtBcnRpY2xlTm90SGVscGZ1bEFjdGlvbixcbn0gZnJvbSAnLi9hY3Rpb25zL2luZGV4LmpzJztcbmltcG9ydCB7IFNlcnZpY2VEYXNoYm9hcmQgfSBmcm9tICcuL2Rhc2hib2FyZHMvaW5kZXguanMnO1xuaW1wb3J0IHsgQ2FzZURhdGFzZXQgfSBmcm9tICcuL2RhdGFzZXRzL2luZGV4LmpzJztcbmltcG9ydCB7IFNlcnZpY2VFbWFpbFRlbXBsYXRlcyB9IGZyb20gJy4vZW1haWwtdGVtcGxhdGVzL2luZGV4LmpzJztcbmltcG9ydCB7XG4gIENhc2VFc2NhbGF0aW9uRmxvdywgQ2FzZUVzY2FsYXRpb25PbkNyZWF0ZUZsb3csIEVzY2FsYXRlQ2FzZUZsb3csIENsb3NlQ2FzZUZsb3csXG4gIENsYWltQ2FzZUZsb3csIENhc2VFc2NhbGF0aW9uU3RhbXBGbG93LCBDYXNlU2xhTW9uaXRvckZsb3csXG59IGZyb20gJy4vZmxvd3MvaW5kZXguanMnO1xuaW1wb3J0IHsgQXJ0aWNsZUZlZWRiYWNrLCBDYXNlLCBLbm93bGVkZ2VBcnRpY2xlIH0gZnJvbSAnLi9vYmplY3RzL2luZGV4LmpzJztcbmltcG9ydCB7IGFydGljbGVGZWVkYmFja0hvb2ssIGNhc2VIb29rLCBrbm93bGVkZ2VBcnRpY2xlSG9vayB9IGZyb20gJy4vb2JqZWN0cy9ob29rcy5qcyc7XG5pbXBvcnQgeyBDYXNlRGV0YWlsUGFnZSB9IGZyb20gJy4vcGFnZXMvaW5kZXguanMnO1xuaW1wb3J0IHtcbiAgQ2FzZXNCeVN0YXR1c1ByaW9yaXR5UmVwb3J0LCBTbGFQZXJmb3JtYW5jZVJlcG9ydCwgQ2FzZXNPcGVuZWRCeURheVByaW9yaXR5UmVwb3J0LFxufSBmcm9tICcuL3JlcG9ydHMvaW5kZXguanMnO1xuaW1wb3J0IHtcbiAgQ2FzZURpcmVjdG9yU2hhcmluZ1J1bGUsIENhc2VFc2NhbGF0aW9uU2hhcmluZ1J1bGUsIENhc2VVbmFzc2lnbmVkVHJpYWdlU2hhcmluZ1J1bGUsXG59IGZyb20gJy4vc2hhcmluZy9pbmRleC5qcyc7XG5pbXBvcnQgeyBDYXNlVHJpYWdlU2tpbGwgfSBmcm9tICcuL3NraWxscy9pbmRleC5qcyc7XG5pbXBvcnQgeyBDYXNlVmlld3MsIEtub3dsZWRnZUFydGljbGVWaWV3cyB9IGZyb20gJy4vdmlld3MvaW5kZXguanMnO1xuXG4vKipcbiAqIFRoZSBmb3VyIGNvbGxlY3Rpb25zIG9mIHRoaXMgcGFja2FnZSB0aGF0IHRoZSBhcHAtd2lkZSBzd2VlcHMgYWxzbyByZWFkLFxuICogbmFtZWQgb25jZSwgaGVyZS5cbiAqXG4gKiBgb2JqZWN0c3RhY2suY29tcG9zaXRpb24udHNgIGFzc2VtYmxlcyBgYWxsSG9va3NgLCBgYWxsRmxvd3NgLCBgYWxsU2tpbGxzYFxuICogYW5kIGBDcm1TaGFyaW5nUnVsZXNgIFx1MjAxNCBldmVyeSBob29rLCBmbG93LCBza2lsbCBhbmQgc2hhcmluZyBydWxlIG9mIHRoZVxuICogQVJUSUZBQ1QgXHUyMDE0IG91dCBvZiBlYWNoIHBhY2thZ2UncyBvd24gbGlzdCwgc28gdGhlIHN1aXRlcyB0aGF0IHN3ZWVwIHRoZW0ga2VlcFxuICogcmVhZGluZyBvbmUgbGlzdCBhbmQgdGhpcyBwYWNrYWdlJ3MgaGFsZiBvZiBpdCBpcyB0aGUgdmVyeSBhcnJheSBpdHMgc3RhY2tcbiAqIHJlZ2lzdGVycy4gYC5mbGF0KClgIGJlY2F1c2UgYSBgKi5ob29rLnRzYCBtYXkgZGVmYXVsdC1leHBvcnQgYW4gQVJSQVkgb2ZcbiAqIGhvb2tzIChvbmUgZmlsZSwgc2V2ZXJhbCB0cmlnZ2VycyBvbiBpdHMgb2JqZWN0KS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlcnZpY2VIb29rcyA9IFthcnRpY2xlRmVlZGJhY2tIb29rLCBjYXNlSG9vaywga25vd2xlZGdlQXJ0aWNsZUhvb2tdLmZsYXQoKTtcblxuLyoqIFRoaXMgcGFja2FnZSdzIGZsb3dzIFx1MjAxNCBzZWUge0BsaW5rIHNlcnZpY2VIb29rc30uICovXG5leHBvcnQgY29uc3Qgc2VydmljZUZsb3dzID0gW1xuICBDYXNlRXNjYWxhdGlvbkZsb3csIENhc2VFc2NhbGF0aW9uT25DcmVhdGVGbG93LCBFc2NhbGF0ZUNhc2VGbG93LCBDbG9zZUNhc2VGbG93LFxuICBDbGFpbUNhc2VGbG93LCBDYXNlRXNjYWxhdGlvblN0YW1wRmxvdywgQ2FzZVNsYU1vbml0b3JGbG93LFxuXTtcblxuLyoqIFRoaXMgcGFja2FnZSdzIHNraWxscyBcdTIwMTQgc2VlIHtAbGluayBzZXJ2aWNlSG9va3N9LiAqL1xuZXhwb3J0IGNvbnN0IHNlcnZpY2VTa2lsbHMgPSBbQ2FzZVRyaWFnZVNraWxsXTtcblxuLyoqIFRoaXMgcGFja2FnZSdzIHNoYXJpbmcgcnVsZXMgXHUyMDE0IHNlZSB7QGxpbmsgc2VydmljZUhvb2tzfS4gKi9cbmV4cG9ydCBjb25zdCBzZXJ2aWNlU2hhcmluZ1J1bGVzID0gW1xuICBDYXNlRXNjYWxhdGlvblNoYXJpbmdSdWxlLCBDYXNlRGlyZWN0b3JTaGFyaW5nUnVsZSwgQ2FzZVVuYXNzaWduZWRUcmlhZ2VTaGFyaW5nUnVsZSxcbl07XG5cbi8qKlxuICogV2hhdCB0aGlzIHBhY2thZ2UgcmVnaXN0ZXJzIGJ1dCBkb2VzIG5vdCBhc3NlbWJsZTogaXRzIHNlZWQgcm93cy5cbiAqXG4gKiBFdmVyeXRoaW5nIGVsc2UgY29tZXMgZnJvbSB0aGlzIHBhY2thZ2UncyBvd24gYmFycmVscy4gVGhlIHNlZWQgZmFtaWxpZXMgYXJlXG4gKiB0aGUgb25lIGV4Y2VwdGlvbiBiZWNhdXNlIFdISUNIIGZhbWlsaWVzIGEgYnVpbGQgcmVwbGF5cyBpcyB0aGVcbiAqIGBIT1RDUk1fQ09NUE9TSVRJT05gIGtub2IncyBkZWNpc2lvbiAoIzEzNjEpLCBtYWRlIG9uY2UsIGF0IHRoZSByb290IFx1MjAxNCBhXG4gKiBTYWFTIHRlbmFudCBnZXRzIHRoZSBwcm9kdWN0IGNhdGFsb2d1ZSBhbmQgbm90aGluZyBlbHNlLCBzbyB0aGlzIHBhY2thZ2VcbiAqIHJlZ2lzdGVycyBubyByb3dzIGluIHRoYXQgc2hhcGUuIFNlZSBgc2VlZERhdGFGb3JgIGluXG4gKiBgb2JqZWN0c3RhY2suY29tcG9zaXRpb24udHNgLlxuICovXG5leHBvcnQgdHlwZSBIb3RDcm1TZXJ2aWNlQ29sbGVjdGlvbnMgPSBQaWNrPE9iamVjdFN0YWNrRGVmaW5pdGlvbklucHV0LCAnZGF0YSc+O1xuXG4vKipcbiAqIGBhcHAub2JqZWN0c3RhY2suaG90Y3JtLnNlcnZpY2VgIFx1MjAxNCB0aGUgU1VQUE9SVCBtb2R1bGUgb2YgdGhpcyBhcnRpZmFjdFxuICogKEFEUi0wMTMwIEQ0OiBvbmUgcmVsZWFzZSBhcnRpZmFjdCwgTiBwYWNrYWdlcywgb25lIG5hbWVzcGFjZSkuXG4gKlxuICogSXQgb3ducyBgY3JtX2Nhc2VgLCBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCBhbmQgYGNybV9hcnRpY2xlX2ZlZWRiYWNrYCwgYW5kXG4gKiBldmVyeSBpdGVtIGF1dGhvcmVkIGFnYWluc3QgdGhlbTogdGhlaXIgaG9va3MsIHZpZXdzLCB0aGUgY2FzZSBkZXRhaWwgcGFnZSxcbiAqIHRoZSBzZXZlbiBjYXNlIGZsb3dzLCB0aGUgY2FzZSBhbmQgYXJ0aWNsZSBhY3Rpb25zLCBgY2FzZV9tZXRyaWNzYCBhbmQgdGhlXG4gKiB0aHJlZSByZXBvcnRzIG92ZXIgaXQsIHRoZSBTZXJ2aWNlIE92ZXJ2aWV3IGRhc2hib2FyZCwgdGhlIGNhc2UtdHJpYWdlIHNraWxsLFxuICogdGhlIHRocmVlIGNhc2Ugc2hhcmluZyBydWxlcywgdGhlIHR3byBjYXNlIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZXMgYW5kIHRoZVxuICogY2FzZSBhbmQga25vd2xlZGdlIHNlZWQgcm93cy5cbiAqXG4gKiBUaHJlZSBwcm9wZXJ0aWVzIGFyZSBsb2FkLWJlYXJpbmc6XG4gKlxuICogIC0gKipUaGUgc2FtZSBgbmFtZXNwYWNlYCBhcyB0aGUgYXBwIHBhY2thZ2UuKiogVGhhdCBpcyB3aGF0IEFEUi0wMTMwIEQxXG4gKiAgICBidXlzOiBjby1vd25lcnNoaXAgb2Ygb25lIG5hbWVzcGFjZSBpbnNpZGUgb25lIGFydGlmYWN0LCBzbyBgY3JtX2Nhc2VgXG4gKiAgICBrZWVwcyBpdHMgbmFtZSBpbnN0ZWFkIG9mIGJlY29taW5nIGBzZXJ2aWNlX2Nhc2VgLiBUaGUgb2JqZWN0IGBuYW1lYCBJU1xuICogICAgdGhlIHRhYmxlIG5hbWUsIHRoZSBSRVNUIHBhdGggYW5kIHRoZSBzYXZlZC12aWV3IGtleSAoQURSLTAxMjkgRDFcdTIwMTNEMiksIHNvXG4gKiAgICBhIHJlbmFtZSB3b3VsZCBiZSBhIGRhdGEgbWlncmF0aW9uOyB0aGlzIHNwbGl0IGNvc3RzIG5vbmUuXG4gKiAgLSAqKmBkZXBlbmRlbmNpZXNgIGlzIHRoZSBlZGdlOyB0aGUgYXJyYXkgb3JkZXIgaW4gYG9iamVjdHN0YWNrLmNvbmZpZy50c2BcbiAqICAgIGlzIG5vdC4qKiBUaGUgbG9hZCBwYXRoIHNvcnRzIGBwYWNrYWdlc1tdYCB0aHJvdWdoIHRoZSBwbGF0Zm9ybSdzIG9uZVxuICogICAgdG9wb2xvZ2ljYWwgc29ydGVyIChBRFItMDEzMCBENSwgQURSLTAxMTYpLCBzbyB0aGUgYXBwIHBhY2thZ2UgcmVnaXN0ZXJzXG4gKiAgICBmaXJzdCB3aGF0ZXZlciBzbG90IGl0IG9jY3VwaWVzIGluIHRoZSBgY29tcG9zZVN0YWNrcyhbXHUyMDI2XSlgIGNhbGwuXG4gKiAgLSAqKk5hdmlnYXRpb24gY3Jvc3NlcyBvbmx5IHRocm91Z2ggY29udHJpYnV0aW9ucyoqIFx1MjAxNCB0aGUgYmxvY2sgYmVsb3cuXG4gKlxuICogXHUyNkQ0IE5vIGBpMThuYCBoZXJlOiBpdCBpcyBhIGAnc2luZ2xlJ2AtZGlzcG9zaXRpb24gc3RhY2sga2V5LCBzbyB0d28gc3RhY2tzXG4gKiBkZWNsYXJpbmcgRElGRkVSRU5UIHZhbHVlcyBtYWtlIGBjb21wb3NlU3RhY2tzYCB0aHJvdyBhbmQgZGVjbGFyaW5nIGlkZW50aWNhbFxuICogb25lcyB0d2ljZSBpcyBhIHNlY29uZCBwbGFjZSB0byBkcmlmdC4gVGhlIGFwcCBwYWNrYWdlIGRlY2xhcmVzIGl0IG9uY2UsIGZvclxuICogdGhlIGFydGlmYWN0IFx1MjAxNCBhbmQgdGhlIGxvY2FsZSBwYWNrcyB0aGF0IGxhYmVsIHRoaXMgcGFja2FnZSdzIG9iamVjdHMgc3RheVxuICogd2hvbGUgaW4gdGhlIGFwcCBwYWNrYWdlIHdpdGggaXQuXG4gKlxuICogYHJlcXVpcmVzYCBpcyB0aGUgb3Bwb3NpdGU6IGBkZWZpbmVTdGFja2AgdmFsaWRhdGVzIHRyaWdnZXIgY2FwYWJpbGl0eSBQRVJcbiAqIFNUQUNLLCBzbyBhIHBhY2thZ2Ugd2hvc2Ugb3duIGZsb3dzIGRlY2xhcmUgYHJlY29yZF9jaGFuZ2VgIC8gYHNjaGVkdWxlYFxuICogdHJpZ2dlcnMgbXVzdCBkZWNsYXJlIGB0cmlnZ2Vyc2AgaXRzZWxmIFx1MjAxNCB0aGUgYXBwIHBhY2thZ2UncyBzbGF0ZSBkb2VzIG5vdFxuICogcmVhY2ggdGhpcyBwYXJzZTpcbiAqXG4gKiAgICAgXHUyNzE3IGZsb3cgJ2Nhc2VfZXNjYWxhdGlvbicgZGVjbGFyZXMgYSAncmVjb3JkX2NoYW5nZScgdHJpZ2dlciBidXRcbiAqICAgICAgIGByZXF1aXJlc2AgZG9lcyBub3QgaW5jbHVkZSAnYXV0b21hdGlvbicgb3IgJ3RyaWdnZXJzJyBcdTIwMTQgbm9cbiAqICAgICAgICdyZWNvcmRfY2hhbmdlJyB0cmlnZ2VyIHdvdWxkIGJlIHJlZ2lzdGVyZWQgXHUyMDI2XG4gKlxuICogKG1lYXN1cmVkIG9uIDE3LjcuMCBieSBkZWxldGluZyB0aGUgbGluZSBiZWxvdzogdGhyZWUgc3VjaCByZWZ1c2Fscywgb25lXG4gKiBwZXIgdHJpZ2dlcmVkIGNhc2UgZmxvdykuXG4gKlxuICogU28gdGhpcyBsaXN0IGlzIGV4YWN0bHkgd2hhdCBUSElTIHBhY2thZ2UncyBtZXRhZGF0YSBuZWVkczogYGF1dG9tYXRpb25gIGFuZFxuICogYHRyaWdnZXJzYCBmb3IgdGhlIHNldmVuIGNhc2UgZmxvd3MsIGBhbmFseXRpY3NgIGZvciBgY2FzZV9tZXRyaWNzYCBhbmQgdGhlXG4gKiBpdGVtcyBvdmVyIGl0LCBgc2hhcmluZ2AgZm9yIHRoZSB0aHJlZSBjYXNlIHNoYXJpbmcgcnVsZXMuIFRoZSBhcHAgcGFja2FnZSdzXG4gKiBzdXJmYWNlIGNhcGFiaWxpdGllcyAoYGF1dGhgLCBgdWlgLCBgYXBwcm92YWxzYCwgYGhpZXJhcmNoeS1zZWN1cml0eWApIGFyZVxuICogbm90IHJlcGVhdGVkLlxuICpcbiAqIFJlZ2lzdHJhdGlvbiBzdGF5cyBmaWxlLWJ5LWZpbGU6IGV2ZXJ5IGl0ZW0gaXMgbmFtZWQgaGVyZSwgdGhyb3VnaCBpdHNcbiAqIGRpcmVjdG9yeSBiYXJyZWwuIEEgZmlsZSB0aGF0IHJlYWNoZXMgbm8gYmFycmVsIGFuZCBubyBsaW5lIGJlbG93IGlzXG4gKiB2YWxpZGF0ZWQgYnkgbm90aGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUhvdENybVNlcnZpY2VTdGFjayA9IChcbiAgY29sbGVjdGlvbnM6IEhvdENybVNlcnZpY2VDb2xsZWN0aW9ucyxcbik6IE9iamVjdFN0YWNrRGVmaW5pdGlvbiA9PiBkZWZpbmVTdGFjayh7XG4gIG1hbmlmZXN0OiB7XG4gICAgaWQ6ICdhcHAub2JqZWN0c3RhY2suaG90Y3JtLnNlcnZpY2UnLFxuICAgIG5hbWU6ICdIb3RDUk0gU2VydmljZScsXG4gICAgLy8gVGhlIGFwcCBwYWNrYWdlJ3MgbmFtZXNwYWNlLCBkZWxpYmVyYXRlbHkgKEFEUi0wMTMwIEQxKS5cbiAgICBuYW1lc3BhY2U6ICdjcm0nLFxuICAgIC8vIFRoZSBBUlRJRkFDVCdzIHZlcnNpb246IG9uZSBgcGFja2FnZS5qc29uYCwgb25lIGJ1aWxkLCBvbmUgcmVsZWFzZVxuICAgIC8vIChBRFItMDEzMCBENiksIHNvIGEgbW9kdWxlIG9mIHRoaXMgYXJ0aWZhY3QgaXMgbmV2ZXIgYXQgYSB2ZXJzaW9uIG9mIGl0c1xuICAgIC8vIG93bi4gQnVtcCBpdCB3aXRoIHRoZSBhcHAgcGFja2FnZSdzIGFuZCBgcGFja2FnZS5qc29uYCBcdTIwMTRcbiAgICAvLyBgdGVzdC9kb2NzLWRlY2xhcmVkLXZlcnNpb25zLnRlc3QudHNgIGhvbGRzIGFsbCB0aHJlZSwgYW5kIHRoZSByYW5nZVxuICAgIC8vIGJlbG93LCB0byBvbmUgdmFsdWUuXG4gICAgdmVyc2lvbjogJzQuMC4xJyxcbiAgICB0eXBlOiAnbW9kdWxlJyxcbiAgICBkZXNjcmlwdGlvbjogJ0hvdENSTSBzdXBwb3J0IG1vZHVsZSBcdTIwMTQgY2FzZXMsIGtub3dsZWRnZSBhcnRpY2xlcywgYW5kIHRoZSBTTEEgc3VyZmFjZS4nLFxuICAgIC8vIFRoZSBzYW1lIHByb3RvY29sIGFzIHRoZSBhcHAgcGFja2FnZSAoQURSLTAwODcgaGFuZHNoYWtlKTsgYnVtcCBpdCB3aXRoXG4gICAgLy8gYHNwZWNWZXJzaW9uYCBvbiBldmVyeSBwbGF0Zm9ybSB1cGdyYWRlLCBleGFjdGx5IGFzIHRoZSBhcHAncyBpcy5cbiAgICBlbmdpbmVzOiB7IHByb3RvY29sOiAnXjE4LjAuMC1uZXh0LjAnIH0sXG4gICAgLy8gVGhlIEFwcCBwYWNrYWdlIHRoaXMgbW9kdWxlIGV4dGVuZHMuXG4gICAgZGVwZW5kZW5jaWVzOiB7ICdhcHAub2JqZWN0c3RhY2suaG90Y3JtJzogJ140LjAuMScgfSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBmaXZlIG5hdmlnYXRpb24gZW50cmllcyB0aGlzIG1vZHVsZSBwdXRzIGludG8gdGhlIGFwcCdzIG1lbnVcbiAgICAgKiAoQURSLTAwMjkgRDcpLlxuICAgICAqXG4gICAgICogTm90IGEgZGVzaWduIGNob2ljZTogYW4gYXBwJ3Mgb3duIGBuYXZpZ2F0aW9uYCBtYXkgbm90IG5hbWUgYW5vdGhlclxuICAgICAqIHBhY2thZ2UncyBvYmplY3QgKEFEUi0wMTMwIFx1MDBBNzEuNSwgcnVsZSBSMyBvZiBgbW9kdWxlLXNwbGl0LXBsYW4ubWRgKSwgc29cbiAgICAgKiBhbGwgZml2ZSBiZWNhbWUgY29udHJpYnV0aW9ucyB0aGUgbW9tZW50IGBjcm1fY2FzZWAsXG4gICAgICogYGNybV9rbm93bGVkZ2VfYXJ0aWNsZWAsIGBzZXJ2aWNlX2Rhc2hib2FyZGAgYW5kIGBzbGFfcGVyZm9ybWFuY2VgIGxlZnRcbiAgICAgKiB0aGUgYXBwIHBhY2thZ2UuIFRoZSBhcHAga2VlcHMgdGhlIEdST1VQUyAoYGdyb3VwX3NlcnZpY2VgLCBgZ3JvdXBfd29ya2AsXG4gICAgICogYGdyb3VwX2luc2lnaHRzYCkgXHUyMDE0IGEgY29udGFpbmVyIGEgbW9kdWxlIGNhbm5vdCBkZWNsYXJlIGluc2lkZSBhbiBhcHAgaXRcbiAgICAgKiBkb2VzIG5vdCBvd24gXHUyMDE0IGFuZCB0aGlzIG1vZHVsZSBmaWxscyB0aGVtLlxuICAgICAqXG4gICAgICogYGFwcGAgaXMgdGhlIGFwcCdzIGJhcmUgYG5hbWVgIChgY3JtX2VudGVycHJpc2VgKSwgbm90IHRoZSBtYW5pZmVzdCBpZDogYVxuICAgICAqIGRvdHRlZCBpZCBpcyByZWZ1c2VkIGFzIGEgbm9uLXNuYWtlX2Nhc2UgaWRlbnRpZmllci5cbiAgICAgKlxuICAgICAqIFx1MjZBMFx1RkUwRiBgcHJpb3JpdHlgIG9yZGVycyBDT05UUklCVVRJT05TIGFnYWluc3QgZWFjaCBvdGhlciBpbnNpZGUgYSBncm91cC4gSXRcbiAgICAgKiBkb2VzIE5PVCBpbnRlcmxlYXZlIHRoZW0gd2l0aCB0aGUgYXBwJ3Mgb3duIGNoaWxkcmVuIFx1MjAxNCBhIGNvbnRyaWJ1dGVkIGl0ZW1cbiAgICAgKiBpcyBhcHBlbmRlZCBhZnRlciBldmVyeXRoaW5nIHRoZSBhcHAgaXRzZWxmIGRlY2xhcmVzIGluIHRoYXQgZ3JvdXAuIFRoZVxuICAgICAqIG9uZSB2aXNpYmxlIGNvbnNlcXVlbmNlIGlzIGBuYXZfbXlfY2FzZXNgLCA0dGggb2YgNiBpbiAqTXkgV29yayogYmVmb3JlXG4gICAgICogdGhlIHNwbGl0IGFuZCBsYXN0IGFmdGVyIGl0OyB0aGUgdGhyZWUgYGdyb3VwX3NlcnZpY2VgIGl0ZW1zIGFuZFxuICAgICAqIGBuYXZfcmVwb3J0X3NsYWAga2VlcCB0aGVpciBwb3NpdGlvbnMgYmVjYXVzZSB0aGUgYXBwIGRlY2xhcmVzIG5vdGhpbmdcbiAgICAgKiBhZnRlciB0aGVtLiBcdTI2RDQgRG8gbm90IGNvbXBlbnNhdGUgd2l0aCBhIHBlci1pdGVtIGBvcmRlcmA6IHRoYXQga2V5IHNvcnRzXG4gICAgICogaW4gdGhlIHJlbmRlcmVyIG9ubHksIHRoaXMgYXBwIGF1dGhvcnMgbm9uZSBhbnl3aGVyZSwgYW5kIGFkZGluZyBvbmUgdG9cbiAgICAgKiB3b3JrIGFyb3VuZCBhIHBsYXRmb3JtIG1lcmdlIHJ1bGUgaXMgd2hhdCBBR0VOVFMubWQgZm9yYmlkcy5cbiAgICAgKi9cbiAgICBuYXZpZ2F0aW9uQ29udHJpYnV0aW9uczogW1xuICAgICAge1xuICAgICAgICBhcHA6ICdjcm1fZW50ZXJwcmlzZScsXG4gICAgICAgIGdyb3VwOiAnZ3JvdXBfc2VydmljZScsXG4gICAgICAgIC8vIFN0YXRlZCByYXRoZXIgdGhhbiBkZWZhdWx0ZWQgc28gdGhhdCB0aGUgZGF5IGEgc2Vjb25kIHBhY2thZ2VcbiAgICAgICAgLy8gY29udHJpYnV0ZXMgaW50byBvbmUgb2YgdGhlc2UgZ3JvdXBzLCB0aGUgb3JkZXIgaXMgYW4gYXV0aG9yZWQgZmFjdFxuICAgICAgICAvLyBpbnN0ZWFkIG9mIGEgcmVnaXN0cmF0aW9uLW9yZGVyIGFjY2lkZW50LlxuICAgICAgICBwcmlvcml0eTogMTAsXG4gICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgeyBpZDogJ25hdl9jYXNlJywgICAgICB0eXBlOiAnb2JqZWN0Jywgb2JqZWN0TmFtZTogJ2NybV9jYXNlJywgICAgICAgICAgICAgIGxhYmVsOiAnQ2FzZXMnLCAgICAgaWNvbjogJ2xpZmUtYnVveScgfSxcbiAgICAgICAgICB7IGlkOiAnbmF2X2tub3dsZWRnZScsIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX2tub3dsZWRnZV9hcnRpY2xlJywgbGFiZWw6ICdLbm93bGVkZ2UnLCBpY29uOiAnYm9vay1vcGVuJyB9LFxuICAgICAgICAgIHsgaWQ6ICduYXZfc2VydmljZV9kYXNoYm9hcmQnLCB0eXBlOiAnZGFzaGJvYXJkJywgZGFzaGJvYXJkTmFtZTogJ3NlcnZpY2VfZGFzaGJvYXJkJywgbGFiZWw6ICdTZXJ2aWNlIE92ZXJ2aWV3JywgaWNvbjogJ2dhdWdlJyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgYXBwOiAnY3JtX2VudGVycHJpc2UnLFxuICAgICAgICBncm91cDogJ2dyb3VwX3dvcmsnLFxuICAgICAgICBwcmlvcml0eTogMjAsXG4gICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgeyBpZDogJ25hdl9teV9jYXNlcycsIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX2Nhc2UnLCB2aWV3TmFtZTogJ215X29wZW5fY2FzZXMnLCBsYWJlbDogJ015IENhc2VzJywgaWNvbjogJ2xpZmUtYnVveScgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGFwcDogJ2NybV9lbnRlcnByaXNlJyxcbiAgICAgICAgZ3JvdXA6ICdncm91cF9pbnNpZ2h0cycsXG4gICAgICAgIHByaW9yaXR5OiAzMCxcbiAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICB7IGlkOiAnbmF2X3JlcG9ydF9zbGEnLCB0eXBlOiAncmVwb3J0JywgcmVwb3J0TmFtZTogJ3NsYV9wZXJmb3JtYW5jZScsIGxhYmVsOiAnU0xBIFBlcmZvcm1hbmNlJywgaWNvbjogJ3RpbWVyJyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuXG4gIC8vIFdoYXQgVEhJUyBwYWNrYWdlJ3MgbWV0YWRhdGEgbmVlZHMgXHUyMDE0IHNlZSB0aGUgYHJlcXVpcmVzYCBwYXJhZ3JhcGggYWJvdmUuXG4gIHJlcXVpcmVzOiBbJ2F1dG9tYXRpb24nLCAndHJpZ2dlcnMnLCAnYW5hbHl0aWNzJywgJ3NoYXJpbmcnXSxcblxuICBvYmplY3RzOiBbQXJ0aWNsZUZlZWRiYWNrLCBDYXNlLCBLbm93bGVkZ2VBcnRpY2xlXSxcbiAgaG9va3M6IHNlcnZpY2VIb29rcyxcbiAgdmlld3M6IFtDYXNlVmlld3MsIEtub3dsZWRnZUFydGljbGVWaWV3c10sXG4gIHBhZ2VzOiBbQ2FzZURldGFpbFBhZ2VdLFxuICBmbG93czogc2VydmljZUZsb3dzLFxuICBhY3Rpb25zOiBbXG4gICAgRXNjYWxhdGVDYXNlQWN0aW9uLCBDbG9zZUNhc2VBY3Rpb24sIENsYWltQ2FzZUFjdGlvbixcbiAgICBMb2dDYWxsQWN0aW9uLCBMb2dNZWV0aW5nQWN0aW9uLCBDYXNlU2NoZWR1bGVNZWV0aW5nQWN0aW9uLFxuICAgIE1hcmtBcnRpY2xlSGVscGZ1bEFjdGlvbiwgTWFya0FydGljbGVOb3RIZWxwZnVsQWN0aW9uLFxuICBdLFxuICBkYXRhc2V0czogW0Nhc2VEYXRhc2V0XSxcbiAgcmVwb3J0czogW0Nhc2VzQnlTdGF0dXNQcmlvcml0eVJlcG9ydCwgU2xhUGVyZm9ybWFuY2VSZXBvcnQsIENhc2VzT3BlbmVkQnlEYXlQcmlvcml0eVJlcG9ydF0sXG4gIGRhc2hib2FyZHM6IFtTZXJ2aWNlRGFzaGJvYXJkXSxcbiAgc2tpbGxzOiBzZXJ2aWNlU2tpbGxzLFxuICBzaGFyaW5nUnVsZXM6IHNlcnZpY2VTaGFyaW5nUnVsZXMsXG4gIGVtYWlsVGVtcGxhdGVzOiBTZXJ2aWNlRW1haWxUZW1wbGF0ZXMsXG5cbiAgLi4uY29sbGVjdGlvbnMsXG59KTtcblxuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9hY3Rpb25zL2Nhc2UuYWN0aW9ucy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2FjdGlvbnNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9hY3Rpb25zL2Nhc2UuYWN0aW9ucy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBBY3Rpb24gfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5pbXBvcnQgeyBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuXG4vKipcbiAqIENhc2UgYWN0aW9ucyBcdTIwMTQgYWxsIHRocmVlIGRlbGVnYXRlIHRvIHNjcmVlbiBmbG93cyBpblxuICogYHNyYy9zZXJ2aWNlL2Zsb3dzL2Nhc2UtYWN0aW9ucy5mbG93LnRzYCAoc2VlIHRoZSBub3RlIHRoZXJlIGZvciB3aHk6IG1vZGFsXG4gKiBhY3Rpb25zIG5ldmVyIGV4ZWN1dGUgdGhlaXIgYm9keSBpbiAxNi4xLjAsIGFuZCBzY3JpcHQgYm9kaWVzIGNhbm5vdFxuICogVVBEQVRFIGEgcmVjb3JkIG9uIGEgc2hhcmluZy1ydWxlZCBvYmplY3Q7IHNjcmVlbiBmbG93cyBhcmUgdGhlIG1lY2hhbmlzbVxuICogdGhhdCBkZW1vbnN0cmFibHkgd29ya3MsIHNhbWUgYXMgYGNvbnZlcnRfbGVhZGAgLyBgc2NoZWR1bGVfZm9sbG93dXBgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IEVzY2FsYXRlQ2FzZUFjdGlvbjogQWN0aW9uID0ge1xuICBuYW1lOiAnZXNjYWxhdGVfY2FzZScsXG4gIGxhYmVsOiAnRXNjYWxhdGUgQ2FzZScsXG4gIG9iamVjdE5hbWU6ICdjcm1fY2FzZScsXG4gIGljb246ICdhbGVydC10cmlhbmdsZScsXG4gIHR5cGU6ICdmbG93JyxcbiAgdGFyZ2V0OiAnZXNjYWxhdGVfY2FzZScsXG4gIGxvY2F0aW9uczogWydyZWNvcmRfaGVhZGVyJywgJ2xpc3RfaXRlbSddLFxuICB2aXNpYmxlOiBQYGhhcyhyZWNvcmQuaXNfZXNjYWxhdGVkKSAmJiByZWNvcmQuaXNfZXNjYWxhdGVkID09IGZhbHNlICYmIGhhcyhyZWNvcmQuaXNfY2xvc2VkKSAmJiByZWNvcmQuaXNfY2xvc2VkID09IGZhbHNlYCxcbiAgY29uZmlybVRleHQ6ICdUaGlzIHdpbGwgZXNjYWxhdGUgdGhlIGNhc2UgdG8gdGhlIGVzY2FsYXRpb24gdGVhbS4gQ29udGludWU/JyxcbiAgc3VjY2Vzc01lc3NhZ2U6ICdDYXNlIGVzY2FsYXRlZCBzdWNjZXNzZnVsbHkhJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcblxuZXhwb3J0IGNvbnN0IENsb3NlQ2FzZUFjdGlvbjogQWN0aW9uID0ge1xuICBuYW1lOiAnY2xvc2VfY2FzZScsXG4gIGxhYmVsOiAnQ2xvc2UgQ2FzZScsXG4gIG9iamVjdE5hbWU6ICdjcm1fY2FzZScsXG4gIGljb246ICdjaGVjay1jaXJjbGUnLFxuICB0eXBlOiAnZmxvdycsXG4gIHRhcmdldDogJ2Nsb3NlX2Nhc2UnLFxuICBsb2NhdGlvbnM6IFsncmVjb3JkX2hlYWRlciddLFxuICB2aXNpYmxlOiBQYGhhcyhyZWNvcmQuaXNfY2xvc2VkKSAmJiByZWNvcmQuaXNfY2xvc2VkID09IGZhbHNlYCxcbiAgY29uZmlybVRleHQ6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2xvc2UgdGhpcyBjYXNlPycsXG4gIHN1Y2Nlc3NNZXNzYWdlOiAnQ2FzZSBjbG9zZWQgc3VjY2Vzc2Z1bGx5IScsXG4gIHJlZnJlc2hBZnRlcjogdHJ1ZSxcbn07XG5cbi8qKlxuICogQ2xhaW0gQ2FzZSBcdTIwMTQgdGhlIGFmZm9yZGFuY2UgZm9yIHRoZSB1bmFzc2lnbmVkLXRyaWFnZSBnZXN0dXJlLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBgdmlzaWJsZWAgTVVTVCBtaXJyb3IgdGhlIHNoYXJpbmcgZ3JhbnQsIG5ldmVyIGEgY29udmVuaWVuY2UgZmxhZy5cbiAqIGBjYXNlX3VuYXNzaWduZWRfdHJpYWdlX3NoYXJpbmdgIChgc3JjL3NlcnZpY2Uvc2hhcmluZy9jYXNlLnNoYXJpbmcudHNgKSBpcyB3aGF0XG4gKiBkZWNpZGVzIHdoZXRoZXIgdGhlIGFnZW50IGxvb2tpbmcgYXQgdGhpcyBidXR0b24gbWF5IHdyaXRlIHRoZSByb3cgYXQgYWxsLCBzb1xuICogdGhlIHByZWRpY2F0ZSBoZXJlIGlzIGNvcGllZCBmcm9tIGl0IHZlcmJhdGltLiBcdTI2RDQgTmV2ZXIgcmVzdGF0ZSBpdCBhc1xuICogYHJlY29yZC5pc19jbG9zZWQgPT0gZmFsc2VgOiB0aGF0IGZsYWcgaXMgZGVyaXZlZCBhcyBgc3RhdHVzID09PSAnY2xvc2VkJ2AgYW5kXG4gKiBuZXZlciBmbGlwcyBvbiBgcmVzb2x2ZWRgLCBzbyBpdCB3b3VsZCBvZmZlciBhIENsYWltIGJ1dHRvbiBvbiByZXNvbHZlZFxuICogb3duZXJsZXNzIGNhc2VzIHRoZSBhZ2VudCBpcyBub3Qgc2hhcmVkIGFuZCBjYW5ub3QgY2xhaW0gXHUyMDE0IGEgYnV0dG9uIHRoYXRcbiAqIGFuc3dlcnMgRk9SQklEREVOLiBUaGUgYnV0dG9uIGFuZCB0aGUgZ3JhbnQgYXJlIG9uZSBzZW50ZW5jZSBzdGF0ZWQgdHdpY2UsIGFuZFxuICogYHRlc3QvY2xhaW0tY2FzZS1vbmUtb3duZXItd3JpdGVyLnRlc3QudHNgIGhvbGRzIHRoZW0gdG8gdGhhdC5cbiAqXG4gKiBObyBgY29uZmlybVRleHRgOiB0aGUgZmxvdyBvcGVucyBhIHNjcmVlbiB0aGF0IGFza3Mgd2hpY2ggd29ya2luZyBzdGF0dXMgdGhlXG4gKiBhZ2VudCBpcyBjbGFpbWluZyBpbnRvLCBhbmQgdGhhdCBzY3JlZW4gSVMgdGhlIGNvbmZpcm1hdGlvbi4gQSBtb2RhbCBpbiBmcm9udFxuICogb2YgaXQgd291bGQgYmUgdHdvIGRpYWxvZ3MgZm9yIG9uZSBnZXN0dXJlLlxuICovXG5leHBvcnQgY29uc3QgQ2xhaW1DYXNlQWN0aW9uOiBBY3Rpb24gPSB7XG4gIG5hbWU6ICdjbGFpbV9jYXNlJyxcbiAgbGFiZWw6ICdDbGFpbSBDYXNlJyxcbiAgb2JqZWN0TmFtZTogJ2NybV9jYXNlJyxcbiAgaWNvbjogJ3VzZXItcGx1cycsXG4gIHR5cGU6ICdmbG93JyxcbiAgdGFyZ2V0OiAnY2xhaW1fY2FzZScsXG4gIGxvY2F0aW9uczogWydyZWNvcmRfaGVhZGVyJywgJ2xpc3RfaXRlbSddLFxuICAvLyBcdTI2RDQgRGVsaWJlcmF0ZWx5IE5PVCBgaGFzKClgLWd1YXJkZWQgXHUyMDE0IHRoZSBvbmUgc2l0ZSB0aGUgIzE4OTAgdG90YWxpdHkgc3dlZXBcbiAgLy8gbGVmdCBhbG9uZSBhZnRlciBtYWtpbmcgZXZlcnkgb3RoZXIgYHZpc2libGVgIGluIGBzcmMvYWN0aW9ucy9gIHRvdGFsLiBUaGlzXG4gIC8vIHByZWRpY2F0ZSBpcyB0aGUgc2hhcmluZyBncmFudCdzIG93biB0ZXh0LCB2ZXJiYXRpbSwgYW5kXG4gIC8vIGB0ZXN0L2NsYWltLWNhc2Utb25lLW93bmVyLXdyaXRlci50ZXN0LnRzYCBjb21wYXJlcyB0aGUgdHdvIHN0cmluZ3M7IHRoZVxuICAvLyBncmFudCBpdHNlbGYgY2Fubm90IGNhcnJ5IGBoYXMoKWAsIGJlY2F1c2UgYHBsdWdpbi1zaGFyaW5nYCBjb21waWxlcyBhXG4gIC8vIGNyaXRlcmlhIGNvbmRpdGlvbiB3aXRoIGBjb21waWxlQ2VsVG9GaWx0ZXJgLCB3aGljaCByZWplY3RzIHRoZSB3aG9sZVxuICAvLyBmdW5jdGlvbi1jYWxsIGNsYXNzLCBhbmQgYW4gdW50cmFuc2xhdGFibGUgcnVsZSBpcyBEUk9QUEVEIGJ5IHRoZSBzZWVkZXJcbiAgLy8gKCM2MjEpLiBgc3JjL3NlcnZpY2Uvc2hhcmluZy9jYXNlLnNoYXJpbmcudHNgIHdyaXRlcyB0aGF0IG91dCBpbiBmdWxsLCBpbmNsdWRpbmcgd2h5XG4gIC8vIGByZWNvcmQub3duZXJfaWQgPT0gbnVsbGAgaXMgdG90YWwgb25lIGxheWVyIGRvd24gKGB7IG93bmVyX2lkOiB7ICRudWxsOiB0cnVlIH0gfWApLlxuICAvLyBcdTI2QTBcdUZFMEYgV2hhdCB0aGF0IHJlYXNvbmluZyBkb2VzIE5PVCBjb3ZlciBpcyBUSElTIHN1cmZhY2U6IGFuIGFjdGlvbiBgdmlzaWJsZWAgaXNcbiAgLy8gaW50ZXJwcmV0ZWQgYnkgQ0VMIGluIHRoZSBicm93c2VyIGFnYWluc3Qgd2hhdGV2ZXIgdGhlIHBhZ2UgaG9sZHMsIHdoaWNoIGlzXG4gIC8vIGB7fWAgZm9yIHRoZSBmaXJzdCByZW5kZXJzLCBzbyB0aGlzIHByZWRpY2F0ZSBkb2VzIGFib3J0IHRoZXJlLiBNYWtpbmcgaXRcbiAgLy8gdG90YWwgbmVlZHMgdGhlIGdyYW50IGFuZCB0aGUgcGFyaXR5IHBpbiBtb3ZlZCB0b2dldGhlciBcdTIwMTQgYSBtYWludGFpbmVyIGNhbGwsXG4gIC8vIG5vdCB0aGlzIGNhcmQncy4gKCMxODkwKVxuICB2aXNpYmxlOiBQYHJlY29yZC5vd25lcl9pZCA9PSBudWxsICYmIHJlY29yZC5zdGF0dXMgIT0gXCJyZXNvbHZlZFwiICYmIHJlY29yZC5zdGF0dXMgIT0gXCJjbG9zZWRcImAsXG4gIHN1Y2Nlc3NNZXNzYWdlOiAnQ2FzZSBjbGFpbWVkIFx1MjAxNCBpdCBpcyB5b3VycyBub3cuJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2Uvb2JqZWN0cy9pbmRleC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL2luZGV4LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFNlcnZpY2Ugb2JqZWN0IGJhcnJlbC5cbiAqXG4gKiBSZS1leHBvcnRzIHRoaXMgcGFja2FnZSdzICoub2JqZWN0LnRzIGRlZmluaXRpb25zOyB0aGUgYCouaG9vay50c2AgZmlsZXNcbiAqIGJlc2lkZSB0aGVtIHJlZ2lzdGVyIHRocm91Z2ggYC4vaG9va3MudHNgLiBUaGUgY2Fub25pY2FsIG5vdGUgb24gdGhlXG4gKiBjb2xsYWJvcmF0aW9uIGNhcGFiaWxpdGllcyAoYGVuYWJsZS5maWxlc2AsIGBlbmFibGUuZmVlZHNgKSB0aGF0IGV2ZXJ5XG4gKiBvYmplY3QgaW4gdGhpcyBhcHAgcG9pbnRzIGF0IGlzIHdyaXR0ZW4gb25jZSwgaW5cbiAqIGBzcmMvc2FsZXMvb2JqZWN0cy9pbmRleC50c2AuXG4gKi9cblxuZXhwb3J0IHsgQXJ0aWNsZUZlZWRiYWNrIH0gZnJvbSAnLi9hcnRpY2xlX2ZlZWRiYWNrLm9iamVjdCc7XG5leHBvcnQgeyBDYXNlIH0gZnJvbSAnLi9jYXNlLm9iamVjdCc7XG5leHBvcnQgeyBLbm93bGVkZ2VBcnRpY2xlIH0gZnJvbSAnLi9rbm93bGVkZ2VfYXJ0aWNsZS5vYmplY3QnO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL2FydGljbGVfZmVlZGJhY2sub2JqZWN0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2Uvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHMvYXJ0aWNsZV9mZWVkYmFjay5vYmplY3QudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IE9iamVjdFNjaGVtYSwgRmllbGQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcblxuLyoqXG4gKiBBcnRpY2xlIEZlZWRiYWNrIE9iamVjdCAoIzYwMSlcbiAqXG4gKiBPbmUgcmVhZGVyJ3MgdmVyZGljdCBvbiBvbmUga25vd2xlZGdlIGFydGljbGUgXHUyMDE0IHRoZSBXUklURVIgYmVoaW5kXG4gKiBgY3JtX2tub3dsZWRnZV9hcnRpY2xlLmhlbHBmdWxfY291bnRgIC8gYG5vdF9oZWxwZnVsX2NvdW50YCwgd2hpY2ggd2VyZVxuICogYHJlYWRvbmx5YCB3aXRoIG5vdGhpbmcgb24gZWl0aGVyIHNpZGUgb2YgdGhlIHBsYXRmb3JtIGFibGUgdG8gbW92ZSB0aGVtLlxuICpcbiAqICMjIyBXaHkgYSByb3cgYW5kIG5vdCBhIGNvdW50ZXIgYnVtcFxuICpcbiAqIFRoZSBvYnZpb3VzIHNoYXBlIFx1MjAxNCBhIFwiSGVscGZ1bFwiIGJ1dHRvbiB3aG9zZSBhY3Rpb24gYm9keSBkb2VzXG4gKiBgaGVscGZ1bF9jb3VudCArIDFgIFx1MjAxNCBjYW5ub3QgYmUgYnVpbHQgb24gdGhpcyBwbGF0Zm9ybSwgYW5kIHRoZSByZWFzb24gaXNcbiAqIG1lYXN1cmVkIHJhdGhlciB0aGFuIGFzc3VtZWQ6XG4gKlxuICogIC0gQSBgdHlwZTogJ3NjcmlwdCdgIGFjdGlvbiBib2R5IHJ1bnMgaW4gdGhlIFF1aWNrSlMgc2FuZGJveCwgd2hvc2VcbiAqICAgIGV4ZWN1dGlvbiBjb250ZXh0IGNhcnJpZXMgbm8gY2FsbGVyIGlkZW50aXR5LiBBbiBVUERBVEUgaXQgaXNzdWVzIGFnYWluc3RcbiAqICAgIGFuIG9iamVjdCB3aXRoIHNoYXJpbmcgcnVsZXMgaXMgcmVmdXNlZCBieSB0aGUgc2hhcmluZyBtaWRkbGV3YXJlIGV2ZW4gZm9yXG4gKiAgICB0aGUgcmVjb3JkJ3Mgb3duZXIgXHUyMDE0IHRoZSBtZWFzdXJlbWVudCBgc3JjL3NlcnZpY2UvZmxvd3MvY2FzZS1hY3Rpb25zLmZsb3cudHNgXG4gKiAgICByZWNvcmRzLCBhbmQgdGhlIHJlYXNvbiBib3RoIGNhc2UgYWN0aW9ucyBhcmUgc2NyZWVuIGZsb3dzLiBJTlNFUlRTIGFyZVxuICogICAgdW5hZmZlY3RlZCwgd2hpY2ggaXMgdGhlIHNlYW0gdGhpcyBvYmplY3QgdGFrZXMuXG4gKiAgLSBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCBpcyBgcHVibGljX3JlYWRgOiByZWFkLW9wZW4sIFdSSVRFLU9XTkVELiBTbyB0aGVcbiAqICAgIG9uZSBhZ2VudCB3aG8gY291bGQgYnVtcCB0aGUgY291bnRlciBieSBoYW5kIGlzIHRoZSBhcnRpY2xlJ3MgYXV0aG9yLFxuICogICAgd2hpY2ggaXMgcHJlY2lzZWx5IHRoZSBwZXJzb24gd2hvc2Ugdm90ZSBpcyB3b3J0aGxlc3MuXG4gKiAgLSBUaGVyZSBpcyBubyBhdG9taWMgaW5jcmVtZW50IG9uIHRoZSBkYXRhIEFQSSwgc28gdHdvIGNvbmN1cnJlbnQgdm90ZXNcbiAqICAgIHJlYWQtbW9kaWZ5LXdyaXRlIHRoZSBzYW1lIHZhbHVlIGFuZCBvbmUgb2YgdGhlbSBkaXNhcHBlYXJzLlxuICpcbiAqIEEgdm90ZSByb3cgc2lkZXN0ZXBzIGFsbCB0aHJlZTogdGhlIHJlYWRlciBJTlNFUlRTIHRoZWlyIG93biByb3cgKGFsbG93ZWQpLFxuICogYW5kIGBhcnRpY2xlX2ZlZWRiYWNrX21ldHJpY3NfcmVmcmVzaGAgKGBhcnRpY2xlX2ZlZWRiYWNrLmhvb2sudHNgKSBSRUNPVU5UU1xuICogdGhlIGFydGljbGUncyB0d28gY291bnRlcnMgZnJvbSB0aGlzIHRhYmxlIHVuZGVyIHRoZSBob29rJ3Mgb3duIHByaXZpbGVnZXMuXG4gKiBSZWNvdW50LCBub3QgaW5jcmVtZW50IFx1MjAxNCBpdCBpcyBpZGVtcG90ZW50LCBpdCBzZWxmLWhlYWxzIGFmdGVyIGEgZGVsZXRlZCBvclxuICogZWRpdGVkIHZvdGUsIGFuZCBpdCBjYW5ub3QgZHJpZnQgdGhlIHdheSBhIHJ1bm5pbmcgdG90YWwgZG9lcy4gRXhhY3RseSB0aGVcbiAqIHNoYXBlIGBjYW1wYWlnbl9tZW1iZXJfbWV0cmljc19yZWZyZXNoYCB1c2VzIHRvIGtlZXAgYGNybV9jYW1wYWlnbmAncyBtZXRyaWNcbiAqIGJsb2NrIGxpdmUgKCM1OTcpLCB3aGljaCBpcyB0aGUgcHJlY2VkZW50IHRoaXMgZmlsZSBmb2xsb3dzIG9uIHB1cnBvc2VcbiAqIHJhdGhlciB0aGFuIGludmVudGluZyBhIHNlY29uZCBpZGlvbSBmb3IgdGhlIHNhbWUgcHJvYmxlbS5cbiAqXG4gKiAjIyMgV2hhdCBpdCBidXlzIGJleW9uZCBhIHdyaXRlclxuICpcbiAqIEEgY291bnRlciB3aXRoIG5vIHJvdyBiZWhpbmQgaXQgY2Fubm90IGFuc3dlciBcImRpZCB0aGlzIHBlcnNvbiBhbHJlYWR5XG4gKiB2b3RlXCIsIHNvIGl0IGNvdW50cyBvbmUgZW50aHVzaWFzdCBmb3J0eSB0aW1lcy4gYHVuaXF1ZV92b3RlX3Blcl9yZWFkZXJgXG4gKiBiZWxvdyBrZXlzIG9uZSByb3cgcGVyIChhcnRpY2xlLCByZWFkZXIpIGFuZCB0aGUgYHN1Ym1pdF9hcnRpY2xlX2ZlZWRiYWNrYFxuICogYWN0aW9uIFVQREFURVMgdGhhdCByb3cgd2hlbiBhIHJlYWRlciBjaGFuZ2VzIHRoZWlyIG1pbmQgXHUyMDE0IHNvIHRoZSBjb3VudGVyc1xuICogbWVhbiBcImhvdyBtYW55IHBlb3BsZVwiLCB3aGljaCBpcyB0aGUgb25seSByZWFkaW5nIHRoYXQgbWFrZXNcbiAqIGBoZWxwZnVsX2NvdW50YCB2cyBgbm90X2hlbHBmdWxfY291bnRgIGEgY29tcGFyaXNvbiByYXRoZXIgdGhhbiB0d29cbiAqIHVucmVsYXRlZCB0YWxsaWVzLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBgdmVyZGljdGAgaXMgZGVsaWJlcmF0ZWx5IHR3by12YWx1ZWQuIEEgZml2ZS1zdGFyIHNjYWxlLCBhIGZyZWUtdGV4dFxuICogcmVhc29uIHRheG9ub215IGFuZCBcIndhcyB0aGlzIGFydGljbGUgdXAgdG8gZGF0ZVwiIGFyZSBhbGwgcGxhdXNpYmxlIGFuZCBhbGxcbiAqIHVuYnVpbHQ6IHRoaXMgb2JqZWN0IGV4aXN0cyB0byBnaXZlIHR3byBkZWNsYXJlZCBjb3VudGVycyBhIHJlYWwgd3JpdGVyLCBhbmRcbiAqIGEgdm9jYWJ1bGFyeSBub3RoaW5nIHJlYWRzIHdvdWxkIHJlY3JlYXRlIHRoZSB2ZXJ5IGRlZmVjdCBpdCBpcyBmaXhpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBBcnRpY2xlRmVlZGJhY2sgPSBPYmplY3RTY2hlbWEuY3JlYXRlKHtcbiAgbmFtZTogJ2NybV9hcnRpY2xlX2ZlZWRiYWNrJyxcbiAgbGFiZWw6ICdBcnRpY2xlIEZlZWRiYWNrJyxcbiAgcGx1cmFsTGFiZWw6ICdBcnRpY2xlIEZlZWRiYWNrJyxcbiAgaWNvbjogJ3RodW1icy11cCcsXG4gIGRlc2NyaXB0aW9uOiAnT25lIHJlYWRlclx1MjAxOXMgaGVscGZ1bCAvIG5vdC1oZWxwZnVsIHZlcmRpY3Qgb24gYSBrbm93bGVkZ2UgYXJ0aWNsZScsXG5cbiAgLy8gQURSLTAwOTAgRDEvRDc6IE9XRCBpcyBhbiBhdXRob3JlZCBkZWNpc2lvbi4gRmVlZGJhY2sgaXMgYW4gYXR0cmlidXRlIG9mXG4gIC8vIHRoZSBhcnRpY2xlLCBzbyByZWNvcmQgYWNjZXNzIERFUklWRVMgZnJvbSBpdCAoQURSLTAwNTUpIFx1MjAxNCB0aGUgc2FtZSBjYWxsXG4gIC8vIGBjcm1fY2FtcGFpZ25fbWVtYmVyYCBtYWtlcywgYW5kIGZvciB0aGUgc2FtZSByZWFzb246IGEgdm90ZSByb3cgbWVhbnNcbiAgLy8gbm90aGluZyBhcGFydCBmcm9tIHRoZSBhcnRpY2xlIGl0IGlzIGFib3V0LCBhbmQgYGNybV9rbm93bGVkZ2VfYXJ0aWNsZWAgaXNcbiAgLy8gYHB1YmxpY19yZWFkYCwgc28gYW55b25lIHdobyBjYW4gcmVhZCB0aGUgYXJ0aWNsZSBjYW4gcmVhZCBpdHMgZmVlZGJhY2suXG4gIC8vXG4gIC8vIFx1MjZENCBOb3QgYHByaXZhdGVgOiB3aXRoIHRoZSB2b3RlciBhcyBvd25lciwgdGhlIGNvdW50ZXJzJyBvd24gZXZpZGVuY2Ugd291bGRcbiAgLy8gYmUgaW52aXNpYmxlIHRvIHRoZSBhdXRob3IgdHJ5aW5nIHRvIHVuZGVyc3RhbmQgdGhlbSBcdTIwMTQgdGhlIHNhbWUgd2F5IGl0IHdhc1xuICAvLyB3cm9uZyBvbiBgY3JtX2NhbXBhaWduX21lbWJlcmAuXG4gIHNoYXJpbmdNb2RlbDogJ2NvbnRyb2xsZWRfYnlfcGFyZW50JyxcblxuICAvLyBBRFItMDA3OToganVuY3Rpb24gcm93cyBoYXZlIG5vIGRlcml2YWJsZSB0ZXh0IHRpdGxlOyBwb2ludCB0aGUgY2Fub25pY2FsXG4gIC8vIG5hbWVGaWVsZCBhdCB0aGUgc3RvcmVkIGF1dG9udW1iZXIgZXhwbGljaXRseSAoYXV0b251bWJlciBpcyBub3QgaW4gdGhlXG4gIC8vIGF1dG8tZGVyaXZhdGlvbiB3aGl0ZWxpc3QpLiBTYW1lIGNhbGwgYXMgYGNybV9jYW1wYWlnbl9tZW1iZXJgIGFuZFxuICAvLyBgY3JtX2V2ZW50X2F0dGVuZGVlYC5cbiAgbmFtZUZpZWxkOiAnZmVlZGJhY2tfbnVtYmVyJyxcblxuICAvLyBBIHJlbGF0ZWQgbGlzdCB0YWtlcyBpdHMgY29sdW1ucyBmcm9tIHRoZSBjaGlsZCdzIGBoaWdobGlnaHRGaWVsZHNgIE1JTlVTXG4gIC8vIHRoZSBsb29rdXAgaXQgaXMgc2NvcGVkIGJ5LCBhbmQgdGhpcyBvYmplY3Qgc2hpcHMgbm8gdmlldyBvZiBpdHMgb3duIFx1MjAxNCBzb1xuICAvLyB0aGlzIGxpc3QgSVMgdGhlIGZlZWRiYWNrIHBhbmVsIG9uIGFuIGFydGljbGUncyBkZXRhaWwgcGFnZSAoIzk0NCk6IHRoZVxuICAvLyB2ZXJkaWN0LCBhbmQgd2hvIGdhdmUgaXQuXG4gIC8vXG4gIC8vIFRXTyBmaWVsZHMgYXJlIGRlbGliZXJhdGVseSBhYnNlbnQsIGZvciB0d28gZGlmZmVyZW50IHJlYXNvbnM6XG4gIC8vXG4gIC8vICAtIGBmZWVkYmFja19udW1iZXJgLCB0aGUgc2FtZSBjYWxsIGBjcm1fY2FtcGFpZ25fbWVtYmVyYCBtYWtlcyB3aXRoXG4gIC8vICAgIGBtZW1iZXJfbnVtYmVyYDogaXQgaXMgdGhlIHJlY29yZCBUSVRMRSwgd2hpY2ggYSBkZXRhaWwgcGFnZSBob2lzdHMgb3V0XG4gIC8vICAgIG9mIHRoZSBib2R5LCBzbyBsZWFkaW5nIHRoZSBzdHJpcCB3aXRoIGl0IHdvdWxkIGZpbGwgdGhlIHBhbmVsIHdpdGhcbiAgLy8gICAgYXV0b251bWJlcnMgaW5zdGVhZCBvZiB2ZXJkaWN0cy5cbiAgLy8gIC0gYGNvbW1lbnRgLCBhIDUwMC1jaGFyYWN0ZXIgdGV4dGFyZWEuIEEgaGlnaGxpZ2h0IHN0cmlwIGhvbGRzIHNob3J0XG4gIC8vICAgIHZhbHVlcywgYW5kIGtlZXBpbmcgaXQgb3V0IGlzIGFsc28gd2hhdCBzdG9wcyB0aGUgYGJhc2ljYCBncm91cCBiZWluZ1xuICAvLyAgICBFTlRJUkVMWSB0aXRsZS1vci1zdHJpcCBcdTIwMTQgYSBncm91cCB3aG9zZSBldmVyeSBmaWVsZCBpcyBob2lzdGVkIGtlZXBzIGl0c1xuICAvLyAgICBoZWFkaW5nIG9uIGZvcm1zIGFuZCBzaWxlbnRseSB2YW5pc2hlcyBmcm9tIGRldGFpbCBwYWdlc1xuICAvLyAgICAoYGZpZWxkLWdyb3VwLXNoYWRvd2VkYCwgdGhlIHNhbWUgdHJhcCBgY3JtX2NhbXBhaWduX21lbWJlcmAncyBgYmFzaWNgXG4gIC8vICAgIGdyb3VwIGFuZCBgY3JtX3Rhc2tgJ3MgYGFzc2lnbm1lbnRgIGdyb3VwIGVhY2ggaGFkIHRvIGJlIHJlc2N1ZWQgZnJvbSkuXG4gIC8vICAgIFNvIHRoZSBjb21tZW50IGlzIHRoZSBncm91cCdzIG93biBjb250ZW50IG9uIHRoZSByb3cncyBkZXRhaWwgcGFnZSxcbiAgLy8gICAgYW5kIHJlYWNoZXMgdGhlIHBhbmVsIHRocm91Z2ggYHJlbGF0ZWRMaXN0Q29sdW1uc2Agb24gdGhlIGFydGljbGVcbiAgLy8gICAgbG9va3VwIGJlbG93IGluc3RlYWQgKCMxMTk5KS5cbiAgaGlnaGxpZ2h0RmllbGRzOiBbJ2NybV9rbm93bGVkZ2VfYXJ0aWNsZScsICd2ZXJkaWN0JywgJ293bmVyX2lkJ10sXG5cbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2Jhc2ljJywgbGFiZWw6ICdGZWVkYmFjaycsIGljb246ICdtZXNzYWdlLXNxdWFyZScgfSxcbiAgXSxcblxuICBmaWVsZHM6IHtcbiAgICBmZWVkYmFja19udW1iZXI6IEZpZWxkLmF1dG9udW1iZXIoe1xuICAgICAgbGFiZWw6ICdGZWVkYmFjayAjJyxcbiAgICAgIGZvcm1hdDogJ0FGLXswMDAwfScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICB9KSxcblxuICAgIC8vIFBsYXRmb3JtIG93bmVyc2hpcCBhbmNob3IgXHUyMDE0IGNhbm9uaWNhbCBub3RlIGluIGBhY2NvdW50Lm9iamVjdC50c2AgKCM1NDgpLlxuICAgIC8vIEhlcmUgaXQgaXMgYWxzbyB0aGUgVk9URVI6IHRoZSBwbGF0Zm9ybSBzdGFtcHMgaXQgb24gaW5zZXJ0LCB3aGljaCBpc1xuICAgIC8vIHdoYXQgYHVuaXF1ZV92b3RlX3Blcl9yZWFkZXJgIGtleXMgb24gYW5kIHdoYXQgbGV0cyBhIHJlYWRlciBjaGFuZ2VcbiAgICAvLyB0aGVpciBvd24gbWluZCB3aXRob3V0IGFuIGFkbWluJ3MgaGVscC5cbiAgICBvd25lcl9pZDogRmllbGQubG9va3VwKCdzeXNfdXNlcicsIHtcbiAgICAgIGxhYmVsOiAnUmVhZGVyJyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgc3lzdGVtOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IGZhbHNlLFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogVGhlIGFydGljbGUgdGhpcyB2ZXJkaWN0IGlzIGFib3V0LlxuICAgICAqXG4gICAgICogYGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZSdgIFx1MjAxNCBhIHZvdGUgb24gYSBkZWxldGVkIGFydGljbGUgZGVub3Rlc1xuICAgICAqIG5vdGhpbmcuIFRoaXMgaXMgdGhlIGxlc3NvbiAjNjk2IGNvc3QgdGhlIGNhbXBhaWduIGp1bmN0aW9uOiBib3RoIHBhcnR5XG4gICAgICogbG9va3VwcyB0aGVyZSB0b29rIGBGaWVsZC5sb29rdXBgJ3MgYHNldF9udWxsYCBkZWZhdWx0LCB0aGUgY2xlYXJlZCByb3dcbiAgICAgKiBpbnN0YW50bHkgdmlvbGF0ZWQgdGhlIG9iamVjdCdzIG93biByZXF1aXJlZC1yZWZlcmVuY2UgcnVsZSwgYW5kIGV2ZXJ5XG4gICAgICogZW5yb2xsZWQgcGVyc29uIGJlY2FtZSBwZXJtYW5lbnRseSB1bmRlbGV0YWJsZS4gQSByZXF1aXJlZCBsb29rdXAgdGhhdFxuICAgICAqIGRlZmF1bHRzIHRvIGBzZXRfbnVsbGAgaXMgdGhhdCBidWcgd2FpdGluZyB0byBoYXBwZW4sIHNvIHRoZSBiZWhhdmlvdXIgaXNcbiAgICAgKiBzcGVsbGVkIG91dCBoZXJlIHJhdGhlciB0aGFuIGluaGVyaXRlZC5cbiAgICAgKi9cbiAgICBjcm1fa25vd2xlZGdlX2FydGljbGU6IEZpZWxkLmxvb2t1cCgnY3JtX2tub3dsZWRnZV9hcnRpY2xlJywge1xuICAgICAgbGFiZWw6ICdBcnRpY2xlJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0tub3dsZWRnZSBhcnRpY2xlIHRoaXMgZmVlZGJhY2sgaXMgYWJvdXQuJyxcblxuICAgICAgLy8gQ3VyYXRlcyB0aGUgZmVlZGJhY2sgcGFuZWwgb24gdGhlIGFydGljbGUncyBkZXRhaWwgcGFnZSBcdTIwMTQgdGhlIHN1cmZhY2VcbiAgICAgIC8vIHRoZSBhcnRpY2xlJ3MgQVVUSE9SIHJlYWRzICgjMTE5OSkuIEEgcmVsYXRlZCBsaXN0IHJlYWRzXG4gICAgICAvLyBgcmVsYXRlZExpc3RDb2x1bW5zYCBvbiB0aGUgY2hpbGQncyBsb29rdXAgYmVmb3JlIGl0IGZhbGxzIGJhY2sgdG9cbiAgICAgIC8vIGBoaWdobGlnaHRGaWVsZHNgIG1pbnVzIHRoYXQgbG9va3VwICgjOTQ0KSwgc28gdGhpcyBpcyBhIFNVUEVSU0VUIG9mXG4gICAgICAvLyB0aGUgZmFsbGJhY2sgKFZlcmRpY3QgLyBSZWFkZXIpIHBsdXMgYGNvbW1lbnRgOiB0aGUgbm90ZSBhIHJlYWRlclxuICAgICAgLy8gdHlwZXMgdG8gZXhwbGFpbiBhIHZlcmRpY3Qgd2FzIHN0b3JlZCBhbmQgc2hvd24gb24gbm8gbGlzdCwgYW5kIHRoZVxuICAgICAgLy8gYXV0aG9yIHRoZSBmaWVsZCdzIG93biBkZXNjcmlwdGlvbiBuYW1lcyBjb3VsZCBub3Qgc2VlIGl0IHdpdGhvdXRcbiAgICAgIC8vIG9wZW5pbmcgZWFjaCByb3cuIExhc3QsIGJlY2F1c2UgaXQgaXMgdGhlIG9uZSBsb25nIHZhbHVlLlxuICAgICAgLy9cbiAgICAgIC8vIFx1MjZENCBEZWxpYmVyYXRlbHkgTk9UIHNvbHZlZCBieSBhZGRpbmcgYGNvbW1lbnRgIHRvIGBoaWdobGlnaHRGaWVsZHNgIFx1MjAxNFxuICAgICAgLy8gc2VlIHRoZSBub3RlIGFib3ZlIHRoYXQgbGlzdCAoYGZpZWxkLWdyb3VwLXNoYWRvd2VkYCkuXG4gICAgICByZWxhdGVkTGlzdENvbHVtbnM6IFsndmVyZGljdCcsICdvd25lcl9pZCcsICdjb21tZW50J10sXG4gICAgfSksXG5cbiAgICB2ZXJkaWN0OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdWZXJkaWN0JyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0hlbHBmdWwnLCB2YWx1ZTogJ2hlbHBmdWwnLCBjb2xvcjogJyMxMEI5ODEnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdOb3QgSGVscGZ1bCcsIHZhbHVlOiAnbm90X2hlbHBmdWwnLCBjb2xvcjogJyNFRjQ0NDQnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgY29tbWVudDogRmllbGQudGV4dGFyZWEoe1xuICAgICAgbGFiZWw6ICdDb21tZW50JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbWF4TGVuZ3RoOiA1MDAsXG4gICAgICBkZXNjcmlwdGlvbjogJ09wdGlvbmFsIG5vdGUgZXhwbGFpbmluZyB0aGUgdmVyZGljdCBcdTIwMTQgcmVhZCBieSB0aGUgYXJ0aWNsZVx1MjAxOXMgYXV0aG9yLicsXG4gICAgfSksXG4gIH0sXG5cbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ2NybV9rbm93bGVkZ2VfYXJ0aWNsZSddIH0sXG4gICAgeyBmaWVsZHM6IFsndmVyZGljdCddIH0sXG4gICAgLy8gT25lIHZvdGUgcGVyIHJlYWRlciBwZXIgYXJ0aWNsZS4gV2l0aG91dCBpdCB0aGUgY291bnRlcnMgYW5zd2VyIFwiaG93IG1hbnlcbiAgICAvLyBjbGlja3NcIiwgd2hpY2ggaXMgbm90IGEgbnVtYmVyIGFueWJvZHkgd2FudHMgbmV4dCB0byBcIk5vdCBIZWxwZnVsXCIuXG4gICAgLy9cbiAgICAvLyBgdW5pcXVlOiAnb3JnYW5pemF0aW9uJ2Agc3RhdGVzIHRoZSBzY29wZSBleHBsaWNpdGx5LCBwZXIgQURSLTAxMjA6IHRoZVxuICAgIC8vIGRyaXZlciBwcmVwZW5kcyB0aGUgTlVMTC1zYWZlIG9yZ2FuaXphdGlvbiBrZXkgcGFydFxuICAgIC8vIChgQ09BTEVTQ0Uob3JnYW5pemF0aW9uX2lkLCAnX19nbG9iYWxfXycpYCkgYXQgcmVnaXN0cmF0aW9uLCBzbyB0aGVcbiAgICAvLyBjb25zdHJhaW50IGlzIG9uZSB2b3RlIHBlciByZWFkZXIgcGVyIGFydGljbGUgV0lUSElOIGFuIG9yZ2FuaXphdGlvbixcbiAgICAvLyBhbmQgcm93cyB3aXRoIG5vIG9yZ2FuaXphdGlvbiBmb3JtIG9uZSBidWNrZXQgcmF0aGVyIHRoYW4gZWFjaCBlc2NhcGluZ1xuICAgIC8vIHVuZGVyIFNRTCdzIE5VTEwtZGlzdGluY3Qgc2VtYW50aWNzLiBCYXJlIGB1bmlxdWU6IHRydWVgIGlzIHRoZVxuICAgIC8vIGRlcHJlY2F0ZWQgcG9zaXRpb25hbCBzcGVsbGluZyBvZiBgJ2dsb2JhbCdgIFx1MjAxNCBpdCB3YXJucyB0b2RheVxuICAgIC8vIChgdW5pcXVlL3Vuc2NvcGVkLWRlY2xhcmVkLWluZGV4YCkgYW5kIHByb3RvY29sIDE4IHJlamVjdHMgaXQsIGFuZFxuICAgIC8vIFwiZ2xvYmFsbHkgdW5pcXVlIGFjcm9zcyBldmVyeSBpbnN0YWxsYXRpb25cIiBpcyBub3Qgd2hhdCBvbmUgcmVhZGVyJ3NcbiAgICAvLyBvcGluaW9uIG9mIG9uZSBhcnRpY2xlIG1lYW5zLlxuICAgIHsgZmllbGRzOiBbJ2NybV9rbm93bGVkZ2VfYXJ0aWNsZScsICdvd25lcl9pZCddLCB1bmlxdWU6ICdvcmdhbml6YXRpb24nIH0sXG4gIF0sXG5cbiAgZW5hYmxlOiB7XG4gICAgYXBpRW5hYmxlZDogdHJ1ZSxcbiAgICBhcGlNZXRob2RzOiBbJ2dldCcsICdsaXN0JywgJ2NyZWF0ZScsICd1cGRhdGUnLCAnZGVsZXRlJ10sXG4gIH0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2Uvb2JqZWN0cy9jYXNlLm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL2Nhc2Uub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBPYmplY3RTY2hlbWEsIEZpZWxkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBGLCBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuXG5leHBvcnQgY29uc3QgQ2FzZSA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX2Nhc2UnLFxuICBsYWJlbDogJ0Nhc2UnLFxuICBwbHVyYWxMYWJlbDogJ0Nhc2VzJyxcbiAgaWNvbjogJ2xpZmUtYnVveScsXG4gIGRlc2NyaXB0aW9uOiAnQ3VzdG9tZXIgc3VwcG9ydCBjYXNlcyBhbmQgc2VydmljZSByZXF1ZXN0cycsXG5cbiAgLy8gQURSLTAwOTAgRDEvRDc6IE9XRCBpcyBhbiBhdXRob3JlZCBkZWNpc2lvbi4gT3duZXIgKyBlc2NhbGF0aW9uIHNoYXJpbmcgcnVsZS5cbiAgc2hhcmluZ01vZGVsOiAncHJpdmF0ZScsXG5cbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2Jhc2ljJywgICAgICAgbGFiZWw6ICdDYXNlIEluZm9ybWF0aW9uJywgaWNvbjogJ2luZm8nIH0sXG4gICAgeyBrZXk6ICdvcmlnaW4nLCAgICAgIGxhYmVsOiAnT3JpZ2luICYgUm91dGluZycsIGljb246ICdyb3V0ZScgfSxcbiAgICB7IGtleTogJ3NsYScsICAgICAgICAgbGFiZWw6ICdTTEEgJiBQcmlvcml0eScsICAgaWNvbjogJ2Nsb2NrJyB9LFxuICAgIHsga2V5OiAncmVzb2x1dGlvbicsICBsYWJlbDogJ1Jlc29sdXRpb24nLCAgICAgICBpY29uOiAnY2hlY2stY2lyY2xlJyB9LFxuICAgIHsga2V5OiAnZXNjYWxhdGlvbicsICBsYWJlbDogJ0VzY2FsYXRpb24nLCAgICAgICBpY29uOiAnYWxlcnQtdHJpYW5nbGUnLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ3N5c3RlbScsICAgICAgbGFiZWw6ICdTeXN0ZW0nLCAgICAgICAgICAgaWNvbjogJ2RhdGFiYXNlJywgICAgICAgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gUGxhdGZvcm0gb3duZXJzaGlwIGFuY2hvciBcdTIwMTQgY2Fub25pY2FsIG5vdGUgaW4gYGFjY291bnQub2JqZWN0LnRzYCAoIzU0OCkuXG4gICAgb3duZXJfaWQ6IEZpZWxkLmxvb2t1cCgnc3lzX3VzZXInLCB7XG4gICAgICBsYWJlbDogJ0Nhc2UgT3duZXInLFxuICAgICAgZ3JvdXA6ICdvcmlnaW4nLFxuICAgICAgc3lzdGVtOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IGZhbHNlLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgLy8gQ2FzZSBJbmZvcm1hdGlvblxuICAgIC8vXG4gICAgLy8gYHVuaXF1ZTogdHJ1ZWAgaXMgZGVjbGFyZWQgSEVSRSwgb24gdGhlIGZpZWxkLCBhbmQgZGVsaWJlcmF0ZWx5IE5PVCBhcyBhXG4gICAgLy8gYHsgZmllbGRzOiBbJ29yZ2FuaXphdGlvbl9pZCcsICdjYXNlX251bWJlciddLCB1bmlxdWU6IHRydWUgfWAgZW50cnkgaW5cbiAgICAvLyBgaW5kZXhlc1tdYCBiZWxvdyAoIzEwMjMpIFx1MjAxNCBzYW1lIHNwZWxsaW5nIGBjcm1fYWNjb3VudC5uYW1lYCxcbiAgICAvLyBgY3JtX2NvbnRhY3QuZW1haWxgIGFuZCBgY3JtX3Byb2R1Y3Quc2t1YCBhbHJlYWR5IHVzZSwgZm9yIHRoZSBzYW1lXG4gICAgLy8gcmVhc29uLiBTaW5jZSBmcmFtZXdvcmsgIzM2OTYgdGhlIGZpZWxkLWxldmVsIGZvcm0gaXMgcGVyLW9yZ2FuaXphdGlvbjpcbiAgICAvLyBpdCBtYXRlcmlhbGl6ZXMgYXMgdGhlIGNvbXBvc2l0ZSBgKG9yZ2FuaXphdGlvbiBrZXkgcGFydCwgY2FzZV9udW1iZXIpYCxcbiAgICAvLyB1bmlxdWUgV0lUSElOIGFuIG9yZ2FuaXphdGlvbi4gU2luY2UgcGxhdGZvcm0gMTcuMC4wLXJjLjQgKEFEUi0wMTIwIEQzLFxuICAgIC8vICM1MDMwKSB0aGF0IGtleSBwYXJ0IGlzIE5VTEwtc2FmZSBcdTIwMTQgYENPQUxFU0NFKG9yZ2FuaXphdGlvbl9pZCxcbiAgICAvLyAnX19nbG9iYWxfXycpYCBcdTIwMTQgc28gcm93cyB3aXRoIG5vIG9yZ2FuaXphdGlvbiBmb3JtIE9ORSBidWNrZXQgaW5zdGVhZCBvZlxuICAgIC8vIGVhY2ggZXNjYXBpbmcgdGhlIGNvbnN0cmFpbnQgdW5kZXIgU1FMJ3MgTlVMTC1kaXN0aW5jdCBzZW1hbnRpY3MuXG4gICAgLy9cbiAgICAvLyBUaGUgaGFuZC13cml0dGVuIHRhYmxlIGNvbXBvc2l0ZSB0aGlzIHJlcGxhY2VkIGNvdWxkIG5vdCBnZXQgdGhhdDogYVxuICAgIC8vIGRlY2xhcmVkIGluZGV4IGlzIHRha2VuIHZlcmJhdGltLCBzbyBpdCBtYXRlcmlhbGl6ZWQgYXMgcGxhaW5cbiAgICAvLyBgVU5JUVVFIChvcmdhbml6YXRpb25faWQsIGNhc2VfbnVtYmVyKWAgYW5kIGVuZm9yY2VkIE5PVEhJTkcgb24gYW55IHJvd1xuICAgIC8vIHdob3NlIGBvcmdhbml6YXRpb25faWRgIHdhcyBOVUxMIFx1MjAxNCBpLmUuIGV2ZXJ5IHJvdyBvZiBhIHNpbmdsZS1vcmdhbml6YXRpb25cbiAgICAvLyBvciB1bnRlbmFudGVkIGluc3RhbGwuIEl0IGFsc28gcmVhZCBhcyBcInVuaXF1ZSBwZXIgb3JnYW5pemF0aW9uXCIgd2hpbGVcbiAgICAvLyBtYXRlcmlhbGl6aW5nIGFzIGFuIHVuc2NvcGVkIGNvbXBvc2l0ZSwgd2hpY2ggaXMgdGhlIGJhcmUtYHVuaXF1ZTogdHJ1ZWBcbiAgICAvLyBzcGVsbGluZyBBRFItMDEyMCB3YXJucyBvbiBpbiAxNy54IGFuZCBwcm90b2NvbCAxOCByZWplY3RzICgjNTA4MikuXG4gICAgLy9cbiAgICAvLyBTY29wZSBzcGVsbGluZzogYmFyZSBgdHJ1ZWAgYXQgRklFTEQgbGV2ZWwgYWxyZWFkeSBtZWFucyBcInBlclxuICAgIC8vIG9yZ2FuaXphdGlvblwiIGFuZCBjYXJyaWVzIG5vIGRlcHJlY2F0aW9uIChgJ29yZ2FuaXphdGlvbidgIGlzIGl0c1xuICAgIC8vIGV4cGxpY2l0IHN5bm9ueW0gd2l0aCBieXRlLWlkZW50aWNhbCBtYXRlcmlhbGl6YXRpb24gXHUyMDE0IG1lYXN1cmVkKS4gSXQgaXNcbiAgICAvLyB3cml0dGVuIGFzIGB0cnVlYCB0byBtYXRjaCB0aGUgZm91ciBzaWJsaW5nIG9iamVjdHMgYWJvdmU7IHN3aXRjaGluZyB0aGVcbiAgICAvLyByZXBvIHRvIHRoZSBleHBsaWNpdCB3b3JkIGlzIGEgdW5pZm9ybSBkZWNpc2lvbiBmb3IgYWxsIG9mIHRoZW0sIG5vdFxuICAgIC8vIHNvbWV0aGluZyBgY3JtX2Nhc2VgIGZvcmtzIG9uIGFsb25lLlxuICAgIGNhc2VfbnVtYmVyOiBGaWVsZC5hdXRvbnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnQ2FzZSBOdW1iZXInLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBmb3JtYXQ6ICdDQVNFLXswMDAwMH0nLFxuICAgICAgdW5pcXVlOiB0cnVlLFxuICAgIH0pLFxuICAgIFxuICAgIHN1YmplY3Q6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdTdWJqZWN0JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBtYXhMZW5ndGg6IDI1NSxcbiAgICB9KSxcblxuICAgIC8vIEFEUi0wMDc5IHJlY29yZCB0aXRsZSAod2FzIHRpdGxlRm9ybWF0ICd7Y2FzZV9udW1iZXJ9IC0ge3N1YmplY3R9JykuXG4gICAgZGlzcGxheV90aXRsZTogRmllbGQuZm9ybXVsYSh7XG4gICAgICBsYWJlbDogJ0Rpc3BsYXkgVGl0bGUnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBleHByZXNzaW9uOiBGYHJlY29yZC5jYXNlX251bWJlciArIFwiIC0gXCIgKyByZWNvcmQuc3ViamVjdGAsXG4gICAgfSksXG5cbiAgICBkZXNjcmlwdGlvbjogRmllbGQubWFya2Rvd24oe1xuICAgICAgbGFiZWw6ICdEZXNjcmlwdGlvbicsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgfSksXG4gICAgXG4gICAgLy8gUmVsYXRpb25zaGlwc1xuICAgIGNybV9hY2NvdW50OiBGaWVsZC5sb29rdXAoJ2NybV9hY2NvdW50Jywge1xuICAgICAgbGFiZWw6ICdBY2NvdW50JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuICAgIFxuICAgIGNybV9jb250YWN0OiBGaWVsZC5sb29rdXAoJ2NybV9jb250YWN0Jywge1xuICAgICAgbGFiZWw6ICdDb250YWN0JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgLy8gT3B0aW9uYWwgc28gV2ViLXRvLUNhc2UgKGFub255bW91cykgc3VibWlzc2lvbnMgY2FuIGxhbmQgd2l0aG91dFxuICAgICAgLy8gYW4gZXhpc3RpbmcgQ1JNIGNvbnRhY3QuIEJhY2stb2ZmaWNlIHN0YWZmIG9yIGEgdHJpYWdlIGZsb3cgbGlua3NcbiAgICAgIC8vIHRoZSBjYXNlIHRvIGEgY29udGFjdCBhZnRlciB0aGUgZmFjdC4gVGhpcyBtYXRjaGVzIHRoZSBTYWxlc2ZvcmNlXG4gICAgICAvLyBXZWItdG8tQ2FzZSBjb252ZW50aW9uLlxuICAgICAgLy8gQG9iamVjdHN0YWNrIDEyOiBzdHJpbmdbXSBgcmVmZXJlbmNlRmlsdGVyc2AgaXMgZGVhZCAobm90IHJlYWQgYnkgdGhlXG4gICAgICAvLyBwaWNrZXIpLiBgZGVwZW5kc09uYCBpcyB0aGUgbGl2ZSBjYXNjYWRpbmctbG9va3VwIGZvcm0gXHUyMDE0IGl0IHNjb3BlcyB0aGVcbiAgICAgIC8vIGNvbnRhY3QgY2FuZGlkYXRlcyB0byB0aG9zZSBzaGFyaW5nIHRoZSBjYXNlJ3MgYGNybV9hY2NvdW50YCAoQURSLTAwNDkpLlxuICAgICAgZGVwZW5kc09uOiBbJ2NybV9hY2NvdW50J10sXG4gICAgfSksXG4gICAgXG4gICAgLy8gQ2FzZSBNYW5hZ2VtZW50XG4gICAgc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgLy8gQURSLTAwNTIgXHUwMEE3NWIuMSBcdTIwMTQgcGxhdGZvcm0gYXV0by1yZW5kZXJzIHN0YXR1cyBjaGFuZ2VzIG9uIHRoZSB0aW1lbGluZVxuICAgICAgLy8gKFwiU3RhdHVzOiBOZXcgXHUyMTkyIEVzY2FsYXRlZFwiKS4gRGVsaXZlcnMgdGhlIGNhc2UgdGltZWxpbmUgZGVjbGFyYXRpdmVseVxuICAgICAgLy8gKHRoZSBoYW5kLWNvZGVkIHZlcnNpb24gd2FzIGRlZmVycmVkIGluICMzOTYgZHVlIHRvIGEgaG9vay1jcmFzaCBidWcpLlxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnTmV3JywgdmFsdWU6ICduZXcnLCBjb2xvcjogJyM4MDgwODAnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdJbiBQcm9ncmVzcycsIHZhbHVlOiAnaW5fcHJvZ3Jlc3MnLCBjb2xvcjogJyNGRkE1MDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdXYWl0aW5nIG9uIEN1c3RvbWVyJywgdmFsdWU6ICd3YWl0aW5nX2N1c3RvbWVyJywgY29sb3I6ICcjRkZENzAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnV2FpdGluZyBvbiBTdXBwb3J0JywgdmFsdWU6ICd3YWl0aW5nX3N1cHBvcnQnLCBjb2xvcjogJyM0MTY5RTEnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFc2NhbGF0ZWQnLCB2YWx1ZTogJ2VzY2FsYXRlZCcsIGNvbG9yOiAnI0ZGMDAwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1Jlc29sdmVkJywgdmFsdWU6ICdyZXNvbHZlZCcsIGNvbG9yOiAnIzAwQUEwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0Nsb3NlZCcsIHZhbHVlOiAnY2xvc2VkJywgY29sb3I6ICcjMDA2NDAwJyB9LFxuICAgICAgXVxuICAgIH0pLFxuICAgIFxuICAgIHByaW9yaXR5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdQcmlvcml0eScsXG4gICAgICBncm91cDogJ3NsYScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnTG93JywgdmFsdWU6ICdsb3cnLCBjb2xvcjogJyM0MTY5RTEnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdNZWRpdW0nLCB2YWx1ZTogJ21lZGl1bScsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0hpZ2gnLCB2YWx1ZTogJ2hpZ2gnLCBjb2xvcjogJyNGRjQ1MDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDcml0aWNhbCcsIHZhbHVlOiAnY3JpdGljYWwnLCBjb2xvcjogJyNGRjAwMDAnIH0sXG4gICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTb3J0YWJsZSBvcmRpbmFsIGZvciBgcHJpb3JpdHlgLiBPcmRlcmluZyBhIHF1ZXVlIGJ5IHRoZSBzZWxlY3QgZmllbGRcbiAgICAvLyBpdHNlbGYgc29ydHMgdGhlIHJhdyBzdHJpbmdzLCBzbyBgcHJpb3JpdHkgZGVzY2AgeWllbGRzXG4gICAgLy8gbWVkaXVtID4gbG93ID4gaGlnaCA+IGNyaXRpY2FsIFx1MjAxNCB0aGUgZXhhY3QgaW52ZXJzaW9uIG9mIHVyZ2VuY3ksIHdoaWNoXG4gICAgLy8gYnVyaWVkIGV2ZXJ5IGNyaXRpY2FsIGNhc2UgYXQgdGhlIGJvdHRvbSBvZiB0aGUgYWdlbnQncyBxdWV1ZS4gU2VsZWN0XG4gICAgLy8gb3B0aW9ucyBjYXJyeSBubyBvcmRpbmFsIGluIHRoZSBzcGVjLCBzbyB0aGUgcmFuayBpcyBtYXRlcmlhbGlzZWQgaGVyZVxuICAgIC8vIGFuZCBzdGFtcGVkIGJ5IGBjYXNlX3NsYV9kZWZhdWx0c2A7IHF1ZXVlIHZpZXdzIHNvcnQgb24gaXQgaW5zdGVhZC5cbiAgICAvLyBgMGAgaXMgdGhlIFVOUkFOS0VEIHNlbnRpbmVsLCBzaGFyZWQgd2l0aCBjcm1fdGFzay5wcmlvcml0eV9yYW5rOiBpdCBpc1xuICAgIC8vIHdoYXQgYSByZWNvcmQgY2FycmllcyB3aGVuIG5vIHJlY29nbmlzZWQgcHJpb3JpdHkgaGFzIGJlZW4gc3RhbXBlZCwgYW5kXG4gICAgLy8gaXQgc29ydHMgYmVsb3cgZXZlcnkgcmVhbCByYW5rICgxXHUyMDEzNCkgb24gdGhlIGBwcmlvcml0eV9yYW5rIGRlc2NgIHF1ZXVlcy5cbiAgICAvLyBcdTI2RDQgSXQgbXVzdCBub3QgYmUgYDFgIGhlcmUgKG9yIGAyYCBvbiBjcm1fdGFzayk6IGEgbm9uLXplcm8gc2VudGluZWxcbiAgICAvLyBvcmRlcnMgdGhlIHNhbWUgdW5rbm93biBwcmlvcml0eSBkaWZmZXJlbnRseSBvbiB0aGUgdHdvIG9iamVjdHMsIGFuZCBvblxuICAgIC8vIHRoaXMgb25lIGl0IGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBnZW51aW5lIGBsb3dgLlxuICAgIHByaW9yaXR5X3Jhbms6IEZpZWxkLm51bWJlcih7XG4gICAgICBsYWJlbDogJ1ByaW9yaXR5IFJhbmsnLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBkZWZhdWx0VmFsdWU6IDAsXG4gICAgfSksXG5cbiAgICB0eXBlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdDYXNlIFR5cGUnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdRdWVzdGlvbicsIHZhbHVlOiAncXVlc3Rpb24nIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQcm9ibGVtJywgdmFsdWU6ICdwcm9ibGVtJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRmVhdHVyZSBSZXF1ZXN0JywgdmFsdWU6ICdmZWF0dXJlX3JlcXVlc3QnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdCdWcnLCB2YWx1ZTogJ2J1ZycgfSxcbiAgICAgIF1cbiAgICB9KSxcbiAgICBcbiAgICBvcmlnaW46IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ0Nhc2UgT3JpZ2luJyxcbiAgICAgIGdyb3VwOiAnb3JpZ2luJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0VtYWlsJywgdmFsdWU6ICdlbWFpbCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1Bob25lJywgdmFsdWU6ICdwaG9uZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1dlYicsIHZhbHVlOiAnd2ViJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQ2hhdCcsIHZhbHVlOiAnY2hhdCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1NvY2lhbCBNZWRpYScsIHZhbHVlOiAnc29jaWFsX21lZGlhJyB9LFxuICAgICAgXVxuICAgIH0pLFxuICAgIFxuICAgIC8vIEFzc2lnbm1lbnRcbiAgICBcbiAgICAvLyBTTEEgYW5kIE1ldHJpY3NcbiAgICAvL1xuICAgIC8vIE5PIGBjcmVhdGVkX2RhdGVgIGhlcmUgKCMxOTkyLCB0aGUgIzU3NSBCMiBwcmVjZWRlbnQgb25cbiAgICAvLyBgY3JtX29wcG9ydHVuaXR5YCk6IHRoZSBwbGF0Zm9ybSBhbHJlYWR5IGluamVjdHMgYGNyZWF0ZWRfYXRgIG9uIGV2ZXJ5XG4gICAgLy8gb2JqZWN0IGFuZCBzdGFtcHMgaXQgb24gZXZlcnkgaW5zZXJ0LCB3aGlsZSB0aGlzIGR1cGxpY2F0ZSBoYWQgbm8gd3JpdGVyXG4gICAgLy8gYXQgYWxsIFx1MjAxNCBvbmx5IHRoZSBzZWVkIGRhdGEgc2V0IGl0LCBzbyBldmVyeSBjYXNlIGNyZWF0ZWQgdGhyb3VnaCB0aGVcbiAgICAvLyBVSSBvciBSRVNUIHN0b3JlZCBudWxsIGFuZCBmZWxsIG91dCBvZiBcIkNhc2VzIE9wZW5lZCBieSBQcmlvcml0eSBcdTAwRDcgRGF5XCJcbiAgICAvLyBhbmQgdGhlIHNlcnZpY2UgZGFzaGJvYXJkJ3MgZGF0ZSByYW5nZS4gU3VyZmFjZXMgdGhhdCBuZWVkIHRoZSBjcmVhdGlvblxuICAgIC8vIGluc3RhbnQgcmVhZCBgY3JlYXRlZF9hdGAgKHRoZSBgY2FzZV9tZXRyaWNzYCBkYXRhc2V0LCB0aGUgZGFzaGJvYXJkXG4gICAgLy8gcmFuZ2UsIHRoZSBgY2FzZV90aW1lbGluZWAgdmlldywgYGNhc2Vfc2xhX2RlZmF1bHRzYCcgcmVzb2x1dGlvbiB0aW1lKTtcbiAgICAvLyB0aGUgc2VlZHMgYXV0aG9yIGl0IGRpcmVjdGx5LCBhbmQgdGhlIHNlZWQgbG9hZGVyIGtlZXBzIGFuIGF1dGhvcmVkXG4gICAgLy8gYGNyZWF0ZWRfYXRgIG9uIGZpcnN0IGluc2VydCBzaW5jZSBAb2JqZWN0c3RhY2svb2JqZWN0cWwgMTcuNy4wXG4gICAgLy8gKG9iamVjdHN0YWNrIzIxNjQ2KS5cbiAgICBjbG9zZWRfZGF0ZTogRmllbGQuZGF0ZXRpbWUoe1xuICAgICAgbGFiZWw6ICdDbG9zZWQgRGF0ZScsXG4gICAgICBncm91cDogJ3NsYScsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBcdTI2RDQgTk9UIGByZWFkb25seWA6IHN0YW1wZWQgYnkgYGV2ZW50X2FjdGl2aXR5X2J1YmJsZWBcbiAgICAvLyAoYHNyYy9zYWxlcy9vYmplY3RzL2V2ZW50Lmhvb2sudHNgKSBvbiB0aGUgZmlyc3QgSEVMRCBgY3JtX2V2ZW50YCByZWxhdGVkIHRvIHRoZVxuICAgIC8vIGNhc2UsIHdob2V2ZXIgd3JvdGUgdGhhdCBldmVudC4gXHUyNkEwXHVGRTBGIFRoYXQgaG9vayByZWFjaGVzIHRoaXMgY2FzZSB0aHJvdWdoXG4gICAgLy8gYGN0eC5hcGlgLCBhIGBTY29wZWRDb250ZXh0YCBvdmVyIHRoZSBBQ1RJTkcgVVNFUidzIGV4ZWN1dGlvbiBjb250ZXh0IFx1MjAxNFxuICAgIC8vIHNvIGl0cyB3cml0ZSBpcyBhIENBTExFUi1zdXBwbGllZCB3cml0ZSBmcm9tIGEgbm9uLWBpc1N5c3RlbWAgY29udGV4dCxcbiAgICAvLyB3aGljaCBgc3RyaXBSZWFkb25seUZpZWxkc2AgZGVsZXRlcy4gYHJlYWRvbmx5YCBoZXJlIHNpbGVudGx5IGRpc2FibGVzXG4gICAgLy8gdGhlIHN0YW1wLiAoQSBob29rIHdyaXRpbmcgaXRzIE9XTiByZWNvcmQncyBgY3R4LmlucHV0LmRhdGFgIGlzIGFcbiAgICAvLyBkaWZmZXJlbnQgY2FzZSBhbmQgU1VSVklWRVMgYHJlYWRvbmx5YCBcdTIwMTQgaG9vay13cml0dGVuIGtleXMgYXJlIG5vdFxuICAgIC8vIGNhbGxlci1zdXBwbGllZC4gTWVhc3VyZWQgaW4gYHRlc3QvcmVhZG9ubHktd3JpdGUtc2VtYW50aWNzLnRlc3QudHNgLilcbiAgICAvL1xuICAgIC8vIERlZmluaXRpb246IHRoZSBtb21lbnQgdGhlIGN1c3RvbWVyIGZpcnN0IGhlYXJkIGJhY2sgZnJvbSB1cywgbWF0Y2hpbmdcbiAgICAvLyBTYWxlc2ZvcmNlIGBGaXJzdFJlc3BvbnNlRGF0ZVRpbWVgIC8gWmVuZGVzayBmaXJzdCByZXBseSB0aW1lIFx1MjAxNCBOT1QgYW5cbiAgICAvLyBpbnRlcm5hbCBzdGF0dXMgY2hhbmdlLCB3aGljaCB3b3VsZCByZXBvcnQgXCJyZXNwb25kZWRcIiB3aGlsZSB0aGUgY3VzdG9tZXJcbiAgICAvLyBpcyBzdGlsbCB3YWl0aW5nLlxuICAgIGZpcnN0X3Jlc3BvbnNlX2RhdGU6IEZpZWxkLmRhdGV0aW1lKHtcbiAgICAgIGxhYmVsOiAnRmlyc3QgUmVzcG9uc2UgRGF0ZScsXG4gICAgICBncm91cDogJ3NsYScsXG4gICAgfSksXG4gICAgXG4gICAgcmVzb2x1dGlvbl90aW1lX2hvdXJzOiBGaWVsZC5udW1iZXIoe1xuICAgICAgbGFiZWw6ICdSZXNvbHV0aW9uIFRpbWUgKEhvdXJzKScsXG4gICAgICBncm91cDogJ3NsYScsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgIHNjYWxlOiAyLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFN0YW1wZWQgb25jZSwgb24gdGhlIGZpcnN0IHdyaXRlIHRoYXQgZ2l2ZXMgdGhlIGNhc2UgYSBwcmlvcml0eSwgZnJvbSB0aGVcbiAgICAvLyBwcmlvcml0eSBcdTAwRDcgYWNjb3VudC10aWVyIG1hdHJpeCBpbiBgLi9fY2FzZS1zbGEudHNgIChgY2FzZV9zbGFfZGVmYXVsdHNgKS5cbiAgICAvLyBOb3QgYHJlYWRvbmx5YDogYSBzZXJ2aWNlIG1hbmFnZXIgbWF5IGxlZ2l0aW1hdGVseSByZW5lZ290aWF0ZSBhIGRlYWRsaW5lLFxuICAgIC8vIGFuZCB0aGUgaG9vayBuZXZlciBvdmVyd3JpdGVzIGEgdmFsdWUgdGhhdCBpcyBhbHJlYWR5IHRoZXJlLlxuICAgIHNsYV9kdWVfZGF0ZTogRmllbGQuZGF0ZXRpbWUoe1xuICAgICAgbGFiZWw6ICdTTEEgRHVlIERhdGUnLFxuICAgICAgZGVzY3JpcHRpb246ICdTZXQgZnJvbSB0aGUgY2FzZSBwcmlvcml0eSBhbmQgdGhlIGFjY291bnRcdTIwMTlzIEN1c3RvbWVyIFRpZXIsIGluIGNhbGVuZGFyIGhvdXJzOiBuaWdodHMsIHdlZWtlbmRzIGFuZCBob2xpZGF5cyBjb3VudC4nLFxuICAgICAgZ3JvdXA6ICdzbGEnLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFN0YW1wZWQgYnkgdHdvIHdyaXRlcnMsIG9uZSBwZXIgc2lkZSBvZiB0aGUgY2xvY2sgc3RvcCAoIzIwNzApOiB0aGVcbiAgICAvLyBgY2FzZV9zbGFfbW9uaXRvcmAgc2NoZWR1bGUgZmxvdyB3aGlsZSB0aGUgY2FzZSBpcyBsaXZlIHdvcmssIGFuZFxuICAgIC8vIGBjYXNlX3NsYV9kZWZhdWx0c2Agb24gdGhlIHdyaXRlIHRoYXQgcmVzb2x2ZXMgb3IgY2xvc2VzIGl0IGxhdGUuIFRoZVxuICAgIC8vIHJ1bGUgYm90aCBhcHBseSBpcyBgY2FzZVNsYUJyZWFjaGVkYCBpbiBgLi9fY2FzZS1zbGEudHNgLlxuICAgIC8vXG4gICAgLy8gTk9UIGByZWFkb25seWAgXHUyMDE0IGJ1dCBOT1QgZm9yIHRoZSByZWFzb24gdGhpcyBjb21tZW50IHVzZWQgdG8gZ2l2ZSwgYW5kXG4gICAgLy8gdGhlIGRpZmZlcmVuY2UgaXMgbWVhc3VyZWQgaW4gYHRlc3QvcmVhZG9ubHktd3JpdGUtc2VtYW50aWNzLnRlc3QudHNgXG4gICAgLy8gKCMxNDI5KS4gYGNhc2Vfc2xhX21vbml0b3JgIGRlY2xhcmVzIGBydW5BczogJ3N5c3RlbSdgLCBzbyBpdHMgd3JpdGVzXG4gICAgLy8gd291bGQgU1VSVklWRSBhIGByZWFkb25seTogdHJ1ZWAgaGVyZS4gSXQgc3RheXMgd3JpdGFibGUgcGVuZGluZyBhXG4gICAgLy8gZGVjaXNpb24gdGhhdCBoYXMgdG8gd2VpZ2ggdGhlIG90aGVyIHN1cmZhY2VzIChzZWVkIGRhdGEsXG4gICAgLy8gYHNlcnZpY2UtYWdlbnQucHJvZmlsZS50c2AsIHRoZSBjcmVhdGUgZm9ybSksIG5vdCBiZWNhdXNlIHRoZSBwbGF0Zm9ybVxuICAgIC8vIHdvdWxkIGRyb3AgdGhlIHN3ZWVwJ3Mgd3JpdGUuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgVGhpcyBpcyBub3cgdGhlIE9OTFkgZXNjYWxhdGlvbi1ncm91cCBmbGFnIHN0aWxsIGRlY2xhcmVkIHdyaXRhYmxlOlxuICAgIC8vIGBpc19lc2NhbGF0ZWRgIGFuZCBgZXNjYWxhdGVkX2RhdGVgIGJlY2FtZSBgcmVhZG9ubHk6IHRydWVgIHdoZW4gIzE0MzRcbiAgICAvLyBtb3ZlZCB0aGVpciB1c2VyLWNvbnRleHQgd3JpdGVyIGludG8gYSBzeXN0ZW0gc3ViLWZsb3cuIFNvIHRoZSBvcGVuXG4gICAgLy8gcXVlc3Rpb24gaGVyZSBpcyBuYXJyb3dlciB0aGFuIGl0IHdhcyBcdTIwMTQgaXQgaXMgcHVyZWx5IGFib3V0IHRoaXMgZmllbGQnc1xuICAgIC8vIGF1dGhvcmluZyBzdXJmYWNlcywgd2l0aCBubyBwbGF0Zm9ybSBvYnN0YWNsZSBsZWZ0IHRvIGJsYW1lLlxuICAgIGlzX3NsYV92aW9sYXRlZDogRmllbGQuYm9vbGVhbih7XG4gICAgICBsYWJlbDogJ1NMQSBWaW9sYXRlZCcsXG4gICAgICBncm91cDogJ3NsYScsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIEVzY2FsYXRpb25cbiAgICAvL1xuICAgIC8vIGByZWFkb25seTogdHJ1ZWAgXHUyMDE0IHRoZSBob25lc3QgZGVjbGFyYXRpb24sIGJlY2F1c2Ugbm9ib2R5IHR5cGVzIHRoaXMuXG4gICAgLy8gSXRzIHRocmVlIHdyaXRlcnMgYXJlIG5vdyB1bmFuaW1vdXNseSBlbGV2YXRlZCAoIzE0MzQsIG1haW50YWluZXItXG4gICAgLy8gYXBwcm92ZWQgZGVjaXNpb24gYmF0Y2ggIzIxIFx1MjQ2MSk6XG4gICAgLy9cbiAgICAvLyAgIGNhc2VfZXNjYWxhdGlvbiAgICAgICAgcnVuQXM6ICdzeXN0ZW0nICAocmVjb3JkLWNoYW5nZSlcbiAgICAvLyAgIGNhc2Vfc2xhX21vbml0b3IgICAgICAgcnVuQXM6ICdzeXN0ZW0nICAoc2NoZWR1bGUpXG4gICAgLy8gICBjYXNlX2VzY2FsYXRpb25fc3RhbXAgIHJ1bkFzOiAnc3lzdGVtJyAgKGNhbGxlZCBieSB0aGUgZXNjYWxhdGVfY2FzZVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW4gZmxvdyB2aWEgYSBzdWJmbG93IG5vZGUpXG4gICAgLy9cbiAgICAvLyBcdTJCNTAgV2hhdCBjaGFuZ2VkLCBhbmQgd2h5IHRoZSByZWFkb25seSBkZWNsYXJhdGlvbiBpcyBub3cgc2FmZTogdGhlXG4gICAgLy8gYGVzY2FsYXRlX2Nhc2VgIHNjcmVlbiBmbG93IHVzZWQgdG8gd3JpdGUgdGhpcyBmaWVsZCBpdHNlbGYsIGFuZCBpdFxuICAgIC8vIHN0YXlzIGBydW5BczogJ3VzZXInYCBiZWNhdXNlIGEgcGVyc29uIGNsaWNrcyBpdC4gVGhlIHBsYXRmb3JtJ3NcbiAgICAvLyByZWFkb25seSBzdHJpcCBpcyBvbmUgYnJhbmNoIG9mIHRoZSBVUERBVEUgcGF0aFxuICAgIC8vIChgaWYgKCFvcEN0eC5jb250ZXh0Py5pc1N5c3RlbSlgLCBvdmVyIENBTExFUi1zdXBwbGllZCBrZXlzKSwgc28gdGhhdFxuICAgIC8vIHVzZXItY29udGV4dCB3cml0ZSBXT1VMRCBoYXZlIGJlZW4gc2lsZW50bHkgZHJvcHBlZC4gUmF0aGVyIHRoYW5cbiAgICAvLyBlbGV2YXRpbmcgdGhlIHdob2xlIHNjcmVlbiBmbG93LCB0aGUgc3RhbXAgbW92ZWQgaW50byB0aGUgZGVkaWNhdGVkXG4gICAgLy8gYGNhc2VfZXNjYWxhdGlvbl9zdGFtcGAgc3ViLWZsb3cuIFRoZSBhZ2VudCdzIG93biB3cml0ZXNcbiAgICAvLyAoYGVzY2FsYXRpb25fcmVhc29uYCwgYHByaW9yaXR5YCwgYHN0YXR1c2ApIHN0aWxsIGNhcnJ5IHRoZWlyIGlkZW50aXR5O1xuICAgIC8vIG9ubHkgdGhlc2UgdHdvIHN0YW1wcyBhcmUgZWxldmF0ZWQuXG4gICAgLy9cbiAgICAvLyBUaGUgZ3Vlc3Qtc3VibWlzc2lvbiBicmFuY2ggb2YgYGNhc2UuaG9vay50c2AgYWxzbyBmb3JjZXMgdGhpcyBmYWxzZSwgYW5kXG4gICAgLy8gaXMgdW5hZmZlY3RlZDogaXQgaXMgYSBgYmVmb3JlSW5zZXJ0YCBob29rLCBzbyBpdHMga2V5IGlzIG5vdFxuICAgIC8vIGNhbGxlci1zdXBwbGllZCBBTkQgdGhlIElOU0VSVCBwYXRoIGlzIGV4ZW1wdCBmcm9tIHRoZSBzdHJpcCBlbnRpcmVseS5cbiAgICAvLyBTZWVkIGRhdGEgKGBzZXJ2aWNlLnNlZWQudHNgKSBpcyBleGVtcHQgZm9yIHRoZSBzYW1lIHJlYXNvbi5cbiAgICAvL1xuICAgIC8vIFx1MjZENCBJZiB5b3UgZmluZCB5b3Vyc2VsZiByZXZlcnRpbmcgdGhpcyB0byB3cml0YWJsZSBzbyBhIHVzZXItY29udGV4dCBmbG93XG4gICAgLy8gd3JpdGUgbGFuZHMsIHlvdSBhcmUgcmUtb3BlbmluZyAjMTQzNCBcdTIwMTQgYWRkIGEgYHN1YmZsb3dgIHN0ZXAgaW5zdGVhZC5cbiAgICAvLyBTZW1hbnRpY3MgbWVhc3VyZWQgaW4gYHRlc3QvcmVhZG9ubHktd3JpdGUtc2VtYW50aWNzLnRlc3QudHNgLlxuICAgIGlzX2VzY2FsYXRlZDogRmllbGQuYm9vbGVhbih7XG4gICAgICBsYWJlbDogJ0VzY2FsYXRlZCcsXG4gICAgICBncm91cDogJ2VzY2FsYXRpb24nLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIGByZWFkb25seTogdHJ1ZWAsIHNhbWUgcmVhc29uaW5nIGFzIGBpc19lc2NhbGF0ZWRgIGFib3ZlIGFuZCBzdGFtcGVkIGJ5XG4gICAgLy8gdGhlIHNhbWUgd3JpdGVycyBcdTIwMTQgYGNhc2VfZXNjYWxhdGlvbmAgYW5kIHRoZSBgY2FzZV9lc2NhbGF0aW9uX3N0YW1wYFxuICAgIC8vIHN1Yi1mbG93LCBib3RoIGBydW5BczogJ3N5c3RlbSdgLiBOZXZlciB0eXBlZCBieSBhIHBlcnNvbi5cbiAgICBlc2NhbGF0ZWRfZGF0ZTogRmllbGQuZGF0ZXRpbWUoe1xuICAgICAgbGFiZWw6ICdFc2NhbGF0ZWQgRGF0ZScsXG4gICAgICBncm91cDogJ2VzY2FsYXRpb24nLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgfSksXG4gICAgXG4gICAgLy8gXHUyNkQ0IERFTElCRVJBVEVMWSBOT1QgYHJlYWRvbmx5YCwgYW5kIHRoaXMgaXMgbG9hZC1iZWFyaW5nICgjMTQzNCkuIFRoaXMgaXNcbiAgICAvLyB0aGUgYWdlbnQncyBvd24gc2NyZWVuIGlucHV0IFx1MjAxNCBgZXNjYWxhdGVfY2FzZWAncyBzY3JlZW4gY29sbGVjdHMgaXQgYW5kXG4gICAgLy8gd3JpdGVzIGl0IHdpdGggdGhlIFVTRVIncyBjb250ZXh0LiBEZWNsYXJpbmcgaXQgcmVhZG9ubHkgd291bGQgbWFrZSB0aGVcbiAgICAvLyBwbGF0Zm9ybSBzaWxlbnRseSBzdHJpcCB0aGUgcmVhc29uIHRoZSBhZ2VudCBqdXN0IHR5cGVkLCB3aGljaCBpcyB0aGVcbiAgICAvLyBoYXJtICMxNDM0IHdhcyBmaWxlZCBhYm91dCwgaW52ZXJ0ZWQgb250byB1c2VyIGlucHV0LiBJdCBpcyBhbHNvXG4gICAgLy8gcmVxdWlyZWQgd2hlbmV2ZXIgYGlzX2VzY2FsYXRlZGAgZmxpcHMgdHJ1ZSAodGhlXG4gICAgLy8gYGVzY2FsYXRpb25fcmVhc29uX3JlcXVpcmVkYCB2YWxpZGF0aW9uIGJlbG93KSwgc28gZHJvcHBpbmcgaXQgd291bGRcbiAgICAvLyByZWplY3QgdGhlIGVzY2FsYXRpb24gb3V0cmlnaHQuXG4gICAgZXNjYWxhdGlvbl9yZWFzb246IEZpZWxkLnRleHRhcmVhKHtcbiAgICAgIGxhYmVsOiAnRXNjYWxhdGlvbiBSZWFzb24nLFxuICAgICAgZ3JvdXA6ICdlc2NhbGF0aW9uJyxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBObyBgcGFyZW50X2Nhc2VgLiBBIGNhc2UgaGllcmFyY2h5IHdhcyBkZWNsYXJlZCBoZXJlIGFuZCBuZXZlclxuICAgIC8vIHRyYXZlcnNlZDogbm90aGluZyByb2xsZWQgY2hpbGQgY2FzZXMgdXAsIG5vdGhpbmcgY2xvc2VkIG9yIG5vdGlmaWVkIHRoZW1cbiAgICAvLyB3aXRoIHRoZSBwYXJlbnQsIGFuZCBubyBzZXJ2aWNlIGZsb3cgcmVhZCB0aGUgbGluay4gUmVsYXRlZCBjYXNlcyB0aGF0XG4gICAgLy8gbWF0dGVyIGluIHRoaXMgYXBwIGFyZSBsaW5rZWQgdGhyb3VnaCB0aGUga25vd2xlZGdlIGFydGljbGUgdGhhdCByZXNvbHZlZFxuICAgIC8vIHRoZW0gKGByZXNvbHZlZF9ieV9hcnRpY2xlYCksIHdoaWNoIHRoZSBkZWZsZWN0aW9uIG1lYXN1cmVzIGRvIHJlYWQuXG4gICAgXG4gICAgLy8gUmVzb2x1dGlvblxuICAgIHJlc29sdXRpb246IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGxhYmVsOiAnUmVzb2x1dGlvbicsXG4gICAgICBncm91cDogJ3Jlc29sdXRpb24nLFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogVGhlIGtub3dsZWRnZSBhcnRpY2xlIHRoYXQgUkVTT0xWRUQgdGhpcyBjYXNlICgjNjAxKS5cbiAgICAgKlxuICAgICAqIFRoZSBzZWNvbmQgaGFsZiBvZiBhIHR3by13YXkgbGluaywgYW5kIGRlbGliZXJhdGVseSBub3QgYSByZXBsYWNlbWVudCBmb3JcbiAgICAgKiB0aGUgZmlyc3QuIGBjcm1fa25vd2xlZGdlX2FydGljbGUucmVsYXRlZF90b19jYXNlYCBwb2ludHMgdGhlIG90aGVyIHdheSBcdTIwMTRcbiAgICAgKiBcInRoZSBjYXNlIHRoaXMgYXJ0aWNsZSB3YXMgV1JJVFRFTiBGUk9NXCIgXHUyMDE0IGFuZCB0aGUgdHdvIGFuc3dlciBkaWZmZXJlbnRcbiAgICAgKiBxdWVzdGlvbnM6IHByb3ZlbmFuY2UgKHdoZXJlIGRpZCB0aGlzIGFydGljbGUgY29tZSBmcm9tKSB2ZXJzdXNcbiAgICAgKiBkZWZsZWN0aW9uICh3aGF0IGRpZCB0aGlzIGFydGljbGUgc2F2ZSB1cykuIE1lcmdpbmcgdGhlbSB3b3VsZCBtYWtlIGJvdGhcbiAgICAgKiB1bmFuc3dlcmFibGUsIHNvIGJvdGggc3RheS5cbiAgICAgKlxuICAgICAqIFRoaXMgaXMgdGhlIGNvbHVtbiB0aGUgZGVmbGVjdGlvbiBtZWFzdXJlcyBvbiBgY2FzZV9tZXRyaWNzYCByZWFkXG4gICAgICogKGBrYl9yZXNvbHZlZF9jb3VudGAgLyBga2JfZGVmbGVjdGlvbl9yYXRlYCksIHdoaWNoIGlzIHdoeSBibGFuayBpc1xuICAgICAqIG5vcm1hbGlzZWQgdG8gTlVMTCBieSBgY2FzZV9yZXNvbHV0aW9uX2FydGljbGVfbm9ybWFsaXplYCBpblxuICAgICAqIGBjYXNlLmhvb2sudHNgOiB0aGUgY2xvc2UtY2FzZSBzY3JlZW4gc2VuZHMgYCcnYCBmb3IgYSBmaWVsZCB0aGUgYWdlbnRcbiAgICAgKiBsZWZ0IGVtcHR5LCBhbiBlbXB0eSBzdHJpbmcgaXMgTk9UIG51bGwsIGFuZCBgY291bnQocmVzb2x2ZWRfYnlfYXJ0aWNsZSlgXG4gICAgICogY291bnRzIGl0IFx1MjAxNCBhIHNpbGVudGx5IGluZmxhdGVkIG51bWVyYXRvciBvbiBhIHJhdGlvIHdpZGdldCwgdGhlIGV4YWN0XG4gICAgICogc2hhcGUgb2YgIzYxNC5cbiAgICAgKi9cbiAgICByZXNvbHZlZF9ieV9hcnRpY2xlOiBGaWVsZC5sb29rdXAoJ2NybV9rbm93bGVkZ2VfYXJ0aWNsZScsIHtcbiAgICAgIGxhYmVsOiAnUmVzb2x2ZWQgYnkgQXJ0aWNsZScsXG4gICAgICBncm91cDogJ3Jlc29sdXRpb24nLFxuICAgICAgZGVzY3JpcHRpb246ICdLbm93bGVkZ2UgYXJ0aWNsZSB0aGF0IHJlc29sdmVkIHRoaXMgY2FzZSBcdTIwMTQgdGhlIGRlZmxlY3Rpb24gc2lnbmFsLicsXG4gICAgfSksXG5cblxuICAgIC8vIEludGVybmFsIG5vdGVzXG4gICAgaW50ZXJuYWxfbm90ZXM6IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGxhYmVsOiAnSW50ZXJuYWwgTm90ZXMnLFxuICAgICAgZ3JvdXA6ICdzeXN0ZW0nLFxuICAgICAgZGVzY3JpcHRpb246ICdJbnRlcm5hbCBub3Rlczsgbm90IHZpc2libGUgdG8gdGhlIGN1c3RvbWVyLicsXG4gICAgfSksXG4gICAgXG4gICAgLy8gRmxhZ3NcbiAgICBpc19jbG9zZWQ6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdJcyBDbG9zZWQnLFxuICAgICAgZ3JvdXA6ICdzeXN0ZW0nLFxuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgIH0pLFxuICB9LFxuICBcbiAgLy8gRGF0YWJhc2UgaW5kZXhlcyBmb3IgcGVyZm9ybWFuY2VcbiAgLy9cbiAgLy8gYGNhc2VfbnVtYmVyYCBpcyBhbiBhdXRvbnVtYmVyIChgQ0FTRS17MDAwMDB9YCksIGFuZCB0aGUgcGxhdGZvcm0nc1xuICAvLyBhdXRvbnVtYmVyIHNlcXVlbmNlIGlzIFBFUiBURU5BTlQgXHUyMDE0IGV2ZXJ5IG9yZ2FuaXphdGlvbiBjb3VudHMgZnJvbSAxLiBBXG4gIC8vIHBsYXRmb3JtLXdpZGUgdW5pcXVlIGluZGV4IG9uIGl0IHRoZXJlZm9yZSByZWplY3RzIHRoZSBzZWNvbmRcbiAgLy8gb3JnYW5pemF0aW9uJ3MgYENBU0UtMDAwMDFgIG9uIGluc2VydDogdGhlIGV4YWN0IGNvbGxpc2lvbiBmcmFtZXdvcmsgIzM2OTZcbiAgLy8gZXhpc3RzIHRvIHByZXZlbnQuIFRoZSBjb25zdHJhaW50IGhhcyB0byBtYXRjaCB0aGUgc2VxdWVuY2UgdGhhdCBmZWVkcyBpdC5cbiAgLy9cbiAgLy8gTm8gYHsgZmllbGRzOiBbJ29yZ2FuaXphdGlvbl9pZCcsICdjYXNlX251bWJlciddLCB1bmlxdWU6IHRydWUgfWAgaGVyZVxuICAvLyAoIzEwMjMpLiBDYXNlLW51bWJlciB1bmlxdWVuZXNzIGlzIGRlY2xhcmVkIG9uIHRoZSBgY2FzZV9udW1iZXJgIGZpZWxkXG4gIC8vIGl0c2VsZiBcdTIwMTQgc2VlIHRoZSBub3RlIHRoZXJlIGZvciB3aHkgdGhlIGhhbmQtd3JpdHRlbiB0YWJsZSBjb21wb3NpdGUgY291bGRcbiAgLy8gbm90IGV4cHJlc3MgaXQuIERvIE5PVCBhZGQgaXQgYmFjayBhbG9uZ3NpZGUgdGhlIGZpZWxkLWxldmVsIGRlY2xhcmF0aW9uXG4gIC8vIGVpdGhlcjogZGVjbGFyaW5nIGJvdGggbWFrZXMgdGhlIHZlcmJhdGltIGluZGV4IHdpbiBhbmQgbGVhdmVzIHRoZVxuICAvLyBwZXItb3JnYW5pemF0aW9uIG9uZSB1bnJlYWNoYWJsZSAoZnJhbWV3b3JrIzM5OTFcbiAgLy8gYHVuaXF1ZS9kb3VibGUtZGVjbGFyYXRpb25gKSwgd2hpY2ggd291bGQgc2lsZW50bHkgdW5kbyB0aGUgZml4LlxuICBpbmRleGVzOiBbXG4gICAgeyBmaWVsZHM6IFsnY3JtX2FjY291bnQnXSB9LFxuICAgIHsgZmllbGRzOiBbJ293bmVyX2lkJ10gfSxcbiAgICB7IGZpZWxkczogWydzdGF0dXMnXSB9LFxuICAgIHsgZmllbGRzOiBbJ3ByaW9yaXR5J10gfSxcbiAgXSxcbiAgXG4gIC8vIEFQSSBzdXJmYWNlLiBIaXN0b3J5IFx1MjE5MiBGaWVsZC50cmFja0hpc3RvcnkgKEFEUi0wMDUyKS5cbiAgZW5hYmxlOiB7XG4gICAgYXBpRW5hYmxlZDogdHJ1ZSxcbiAgICAvLyAjNjAyIFx1MjAxNCBzY3JlZW5zaG90cyBhbmQgbG9ncyBhcmUgaG93IGEgc3VwcG9ydCBjYXNlIGdldHMgZGlhZ25vc2VkLlxuICAgIC8vIFNlZSB0aGUgY2Fub25pY2FsIGNhcGFiaWxpdHkgbm90ZSBpbiBgc3JjL3NhbGVzL29iamVjdHMvaW5kZXgudHNgLlxuICAgIGZpbGVzOiB0cnVlLFxuICB9LFxuXG4gIC8vIEFEUi0wMDUyIFx1MDBBNzViLjIgXHUyMDE0IGRlY2xhcmF0aXZlIG1pbGVzdG9uZSBhY3Rpdml0eSBmb3IgdGhlIHNlcnZpY2UgbmFycmF0aXZlLlxuICAvLyBUaGUgY2FzZVNpZGVFZmZlY3RzIGhvb2sgc3RpbGwgb3ducyBpdHMgcmVhbCBzaWRlLWVmZmVjdHMgKGVzY2FsYXRpb24gdGFzayxcbiAgLy8gY2xvc2VkLWRhdGUgc3RhbXBpbmcpOyB0aGVzZSBhcmUgdGltZWxpbmUgZW50cmllcyBvbmx5LCBlbWl0dGVkIGJ5IHRoZSBwbGF0Zm9ybS5cbiAgYWN0aXZpdHlNaWxlc3RvbmVzOiBbXG4gICAgeyBmaWVsZDogJ3N0YXR1cycsIHZhbHVlOiAnZXNjYWxhdGVkJywgc3VtbWFyeTogJ0Nhc2UgZXNjYWxhdGVkIFx1MjAxNCB7c3ViamVjdH0nLCB0eXBlOiAndXBkYXRlZCcgfSxcbiAgICB7IGZpZWxkOiAnc3RhdHVzJywgdmFsdWU6ICdyZXNvbHZlZCcsIHN1bW1hcnk6ICdDYXNlIHJlc29sdmVkIFx1MjAxNCB7c3ViamVjdH0nLCB0eXBlOiAnY29tcGxldGVkJyB9LFxuICAgIHsgZmllbGQ6ICdzdGF0dXMnLCB2YWx1ZTogJ2Nsb3NlZCcsIHN1bW1hcnk6ICdDYXNlIGNsb3NlZCBcdTIwMTQge3N1YmplY3R9JywgdHlwZTogJ2NvbXBsZXRlZCcgfSxcbiAgXSxcblxuICAvLyBBRFItMDA3OTogcmVuZGVyLW9ubHkgYHRpdGxlRm9ybWF0YCByZXRpcmVkIGluIGZhdm9yIG9mIGBuYW1lRmllbGRgLFxuICAvLyB3aGljaCBuYW1lcyBhIHJlYWwgZmllbGQuIFRoZSBmb3JtZXIgdGVtcGxhdGUgY29tcG9zZWQgdHdvIGxvY2FsIGZpZWxkcywgc29cbiAgLy8gdGhlIGBkaXNwbGF5X3RpdGxlYCBmb3JtdWxhIGZpZWxkIChzZWUgZmllbGRzKSByZXByb2R1Y2VzIGl0LlxuICBuYW1lRmllbGQ6ICdkaXNwbGF5X3RpdGxlJyxcbiAgLy8gRXhwbGljaXQgc2VhcmNoIHRhcmdldHMgKEFEUi0wMDYxKS4gUkVRVUlSRUQgYmVjYXVzZSBuYW1lRmllbGQgaXMgYVxuICAvLyBGT1JNVUxBIChkaXNwbGF5X3RpdGxlL2Z1bGxfbmFtZSk6IHdpdGhvdXQgdGhpcywgJHNlYXJjaCBhdXRvLWRlZmF1bHRzIHRvXG4gIC8vIHRoZSBmb3JtdWxhIGZpZWxkLCB3aGljaCBpc24ndCBhIHJlYWwgY29sdW1uLCBzbyB0aGUgbG9va3VwIHBpY2tlciArIGdsb2JhbFxuICAvLyBzZWFyY2ggc2lsZW50bHkgcmV0dXJuIHplcm8uIFRoZXNlIGFyZSByZWFsLCBpbmRleGVkIGNvbHVtbnMuXG4gIHNlYXJjaGFibGVGaWVsZHM6IFsnc3ViamVjdCcsICdjYXNlX251bWJlciddLFxuICBoaWdobGlnaHRGaWVsZHM6IFsnY2FzZV9udW1iZXInLCAnc3ViamVjdCcsICdjcm1fYWNjb3VudCcsICdzdGF0dXMnLCAncHJpb3JpdHknXSxcbiAgXG4gIC8vIFJlbW92ZWQ6IGxpc3Rfdmlld3MgYW5kIGZvcm1fdmlld3MgYmVsb25nIGluIFVJIGNvbmZpZ3VyYXRpb24sIG5vdCBvYmplY3QgZGVmaW5pdGlvblxuICBcbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAncmVzb2x1dGlvbl9yZXF1aXJlZF9mb3JfY2xvc2VkJyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiAnUmVzb2x1dGlvbiBpcyByZXF1aXJlZCB3aGVuIGNsb3NpbmcgYSBjYXNlJyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnN0YXR1cykgJiYgcmVjb3JkLnN0YXR1cyA9PSBcImNsb3NlZFwiICYmICghaGFzKHJlY29yZC5yZXNvbHV0aW9uKSB8fCBpc0JsYW5rKHJlY29yZC5yZXNvbHV0aW9uKSlgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2VzY2FsYXRpb25fcmVhc29uX3JlcXVpcmVkJyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRXNjYWxhdGlvbiByZWFzb24gaXMgcmVxdWlyZWQgd2hlbiBlc2NhbGF0aW5nIGEgY2FzZScsXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5pc19lc2NhbGF0ZWQpICYmIHJlY29yZC5pc19lc2NhbGF0ZWQgPT0gdHJ1ZSAmJiAoIWhhcyhyZWNvcmQuZXNjYWxhdGlvbl9yZWFzb24pIHx8IGlzQmxhbmsocmVjb3JkLmVzY2FsYXRpb25fcmVhc29uKSlgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ2Nhc2Vfc3RhdHVzX3Byb2dyZXNzaW9uJyxcbiAgICAgIHR5cGU6ICdzdGF0ZV9tYWNoaW5lJyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiAnSW52YWxpZCBzdGF0dXMgdHJhbnNpdGlvbicsXG4gICAgICBmaWVsZDogJ3N0YXR1cycsXG4gICAgICAvLyBFc2NhbGF0ZSArIENsb3NlIGFjdGlvbnMgYXJlIGF2YWlsYWJsZSBmcm9tIEFOWSBvcGVuIHN0YXR1cyAoc2VlXG4gICAgICAvLyBlc2NhbGF0ZV9jYXNlIC8gY2xvc2VfY2FzZSB2aXNpYmlsaXR5KS4gVGhlIHRyYW5zaXRpb24gbWFwIG11c3QgcGVybWl0XG4gICAgICAvLyBcdTIxOTJlc2NhbGF0ZWQgYW5kIFx1MjE5MmNsb3NlZCBmcm9tIGV2ZXJ5IG9wZW4gc3RhdGUsIGVsc2UgdGhvc2UgYWN0aW9ucyBlbWl0IGFcbiAgICAgIC8vIHNwdXJpb3VzIFwiSW52YWxpZCBzdGF0dXMgdHJhbnNpdGlvblwiIHdhcm5pbmcgKGUuZy4gZXNjYWxhdGluZyBhIGJyYW5kLW5ld1xuICAgICAgLy8gY2FzZSwgd2hpY2ggaXMgYSBsZWdpdGltYXRlIHN1cHBvcnQgbW92ZSkuXG4gICAgICB0cmFuc2l0aW9uczoge1xuICAgICAgICAnbmV3JzogWydpbl9wcm9ncmVzcycsICd3YWl0aW5nX2N1c3RvbWVyJywgJ2VzY2FsYXRlZCcsICdjbG9zZWQnXSxcbiAgICAgICAgJ2luX3Byb2dyZXNzJzogWyd3YWl0aW5nX2N1c3RvbWVyJywgJ3dhaXRpbmdfc3VwcG9ydCcsICdlc2NhbGF0ZWQnLCAncmVzb2x2ZWQnLCAnY2xvc2VkJ10sXG4gICAgICAgICd3YWl0aW5nX2N1c3RvbWVyJzogWydpbl9wcm9ncmVzcycsICd3YWl0aW5nX3N1cHBvcnQnLCAnZXNjYWxhdGVkJywgJ2Nsb3NlZCddLFxuICAgICAgICAnd2FpdGluZ19zdXBwb3J0JzogWydpbl9wcm9ncmVzcycsICd3YWl0aW5nX2N1c3RvbWVyJywgJ2VzY2FsYXRlZCcsICdjbG9zZWQnXSxcbiAgICAgICAgJ2VzY2FsYXRlZCc6IFsnaW5fcHJvZ3Jlc3MnLCAncmVzb2x2ZWQnLCAnY2xvc2VkJ10sXG4gICAgICAgICdyZXNvbHZlZCc6IFsnY2xvc2VkJywgJ2luX3Byb2dyZXNzJ10sICAvLyBDYW4gcmVvcGVuXG4gICAgICAgICdjbG9zZWQnOiBbJ2luX3Byb2dyZXNzJ10sICAvLyBDYW4gcmVvcGVuXG4gICAgICB9XG4gICAgfSxcbiAgXSxcbiAgXG4gIC8vIFx1MjZBMFx1RkUwRiBObyBgd29ya2Zsb3dzW11gIGhlcmUsIGFuZCBub25lIGlzIHBvc3NpYmxlOiBvYmplY3QgYHdvcmtmbG93c1tdYCB3ZXJlXG4gIC8vIHJlbW92ZWQgZnJvbSB0aGUgcGxhdGZvcm0uIEZpZWxkIHVwZGF0ZXMgbGl2ZSBpbiB0aGlzIG9iamVjdCdzIGAqLmhvb2sudHNgO1xuICAvLyBzY2hlZHVsZWQgc3RhdHVzIGZsaXBzIGFuZCBub3RpZmljYXRpb25zIGxpdmUgaW4gYHNyYy8qL2Zsb3dzLyouZmxvdy50c2AuXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2Uvb2JqZWN0cy9rbm93bGVkZ2VfYXJ0aWNsZS5vYmplY3QudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2Uvb2JqZWN0cy9rbm93bGVkZ2VfYXJ0aWNsZS5vYmplY3QudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IE9iamVjdFNjaGVtYSwgRmllbGQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB7IEYsIFAgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogS25vd2xlZGdlIEFydGljbGUgT2JqZWN0XG4gKlxuICogUmV1c2FibGUsIHNlYXJjaC1pbmRleGVkIGFuc3dlcnMgdGhhdCBiYWNrIHRoZSBTdXBwb3J0IEtub3dsZWRnZSBCYXNlXG4gKiBhbmQgZ3JvdW5kIHRoZSBhc3Npc3RhbnQncyBjYXNlLXJlc29sdXRpb24gc2tpbGxzLlxuICpcbiAqIExpZmVjeWNsZTogZHJhZnQgXHUyMTkyIGluX3JldmlldyBcdTIxOTIgcHVibGlzaGVkIFx1MjE5MiBhcmNoaXZlZC5cbiAqIEF1ZGllbmNlOiAgcHVibGljIChjdXN0b21lciBwb3J0YWwgdmlzaWJsZSkgfCBpbnRlcm5hbCAoYWdlbnQtb25seSkuXG4gKi9cbmV4cG9ydCBjb25zdCBLbm93bGVkZ2VBcnRpY2xlID0gT2JqZWN0U2NoZW1hLmNyZWF0ZSh7XG4gIG5hbWU6ICdjcm1fa25vd2xlZGdlX2FydGljbGUnLFxuICBsYWJlbDogJ0tub3dsZWRnZSBBcnRpY2xlJyxcbiAgcGx1cmFsTGFiZWw6ICdLbm93bGVkZ2UgQXJ0aWNsZXMnLFxuICBpY29uOiAnYm9vay1vcGVuJyxcbiAgZGVzY3JpcHRpb246ICdSZXVzYWJsZSBrbm93bGVkZ2UgYmFzZSBhcnRpY2xlcyBmb3Igc2VsZi1zZXJ2aWNlIGFuZCBBSSBncm91bmRpbmcnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIEtub3dsZWRnZSBiYXNlIGlzIG9yZy1yZWFkYWJsZTsgYXV0aG9ycyBlZGl0LlxuICBzaGFyaW5nTW9kZWw6ICdwdWJsaWNfcmVhZCcsXG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFB1YmxpYyBhY2Nlc3MgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIC8vXG4gIC8vIFB1Ymxpc2hpbmcgYSBwdWJsaWMgYXJ0aWNsZSBtaW50cyBhIHNoYXJlIGxpbmsgdGhyb3VnaCB0aGUgcGxhdGZvcm0nc1xuICAvLyBgcHVibGljU2hhcmluZ2Agc3VyZmFjZSAobWFpbnRhaW5lciBydWxpbmcsIDIwMjYtMDgtMDI6IG5vIGN1c3RvbWVyIHBvcnRhbCxcbiAgLy8gbm8gYW5vbnltb3VzLWdyYW50IHdpZGVuaW5nKS4gXHUyNkQ0IFRoZSB3aG9sZSBzYWZldHkgb2YgdGhhdCByZXN0cyBvblxuICAvLyBgZWxpZ2liaWxpdHlgLCB3aGljaCBpcyB0aGUgT05MWSB0aGluZyBzdGFuZGluZyBiZXR3ZWVuIGEgc2hhcmUgZGlhbG9nIGFuZFxuICAvLyBhIHN0cmFuZ2VyIHJlYWRpbmcgYW4gaW50ZXJuYWwgb3IgZHJhZnQgYXJ0aWNsZSBcdTIwMTQgc28gdGhpcyBibG9jayBtYXkgb25seSBiZVxuICAvLyBkZWNsYXJlZCB3aGlsZSBldmVyeSBrZXkgYmVsb3cgaXMgZW5mb3JjZWQuXG4gIC8vXG4gIC8vIE1FQVNVUkVEIG9uIGBAb2JqZWN0c3RhY2svcGx1Z2luLXNoYXJpbmdAMTcuMS4wYCBcdTIwMTQgdGhlIHZlcnNpb25cbiAgLy8gaW5zdGFsbGVkIEFUIFRIRSBUSU1FIG9mIHRoZSBtZWFzdXJlbWVudCwgbm90IHRoZSBjdXJyZW50IHBpbiAodGhpcyB0YWJsZVxuICAvLyBoYXMgTk9UIGJlZW4gcmUtdGFrZW4gb24gYW55IGxhdGVyIHBpbiBcdTIwMTQgbm90IDE3LjMuMCwgIzE2NzYsIG5vdCAxNy40LjAsXG4gIC8vIFBSICMxODE0LCBhbmQgbm90IDE3LjUuMCkgXHUyMDE0XG4gIC8vIGFnYWluc3QgdGhlIHJlYWwgYFNoYXJlTGlua1NlcnZpY2VgIGFuZCBhIHJlYWwgZW5naW5lLFxuICAvLyBub3QgcmVhZCBvZmYgYSBncmVwIGNvdW50OlxuICAvL1xuICAvLyAgIHwga2V5ICAgICAgICAgICAgICAgICAgfCBtZWFzdXJlZCBvbiAxNy4xLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgLy8gICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gIC8vICAgfCBgZW5hYmxlZGAgICAgICAgICAgICB8IEVORk9SQ0VEIFx1MjAxNCBmYWxzZSBcdTIxRDIgU0hBUklOR19OT1RfRU5BQkxFRCA0MjIgICAgIHxcbiAgLy8gICB8IGBhbGxvd2VkQXVkaWVuY2VzYCAgIHwgRU5GT1JDRUQgXHUyMDE0IGBzaWduZWRfaW5gIHJlZnVzZWQgNDIyICAgICAgICAgICAgIHxcbiAgLy8gICB8IGBhbGxvd2VkUGVybWlzc2lvbnNgIHwgRU5GT1JDRUQgXHUyMDE0IG5vbi1gdmlld2AgcmVmdXNlZCA0MjIgICAgICAgICAgICAgIHxcbiAgLy8gICB8IGByZWRhY3RGaWVsZHNgICAgICAgIHwgQVBQTElFRCB0byBldmVyeSB0b2tlbi1zZXJ2ZWQgcmVzcG9uc2UgICAgICAgICB8XG4gIC8vICAgfCBgZWxpZ2liaWxpdHlgICAgICAgICB8ICoqRU5GT1JDRUQgXHUyMDE0IGZhbHNlIHZlcmRpY3QgXHUyMUQyIDQyMiwgbm8gbGluayoqICAgIHxcbiAgLy9cbiAgLy8gYHRlc3Qva25vd2xlZGdlLWFydGljbGUtc2hhcmUtbGlua3MudGVzdC50c2AgZHJpdmVzIGFsbCBvZiBpdCBlbmQgdG8gZW5kXG4gIC8vIGFuZCBpcyB0aGUgYWNjZXB0YW5jZSBldmlkZW5jZTsgcmVhZCBpdCBiZWZvcmUgY2hhbmdpbmcgYW55dGhpbmcgaGVyZS5cbiAgLy9cbiAgLy8gXHUyNkEwXHVGRTBGIFRXTyBTUEVMTElORyBUUkFQUywgYm90aCBtZWFzdXJlZCwgYm90aCBvZiB3aGljaCBwcm9kdWNlIGEgYmxvY2sgdGhhdFxuICAvLyBMT09LUyBkZWNsYXJlZCBhbmQgc2lsZW50bHkgaXMgbm90OlxuICAvL1xuICAvLyAgMS4gYGVsaWdpYmlsaXR5YCBtdXN0IGJlIGEgUExBSU4gU1RSSU5HLiBJdCBpcyBgei5ab2RTdHJpbmdgIGluIHRoZSBzcGVjXG4gIC8vICAgICBhbmQgYGdldFBvbGljeSgpYCBrZWVwcyBpdCBvbmx5IHdoZW4gYHR5cGVvZiByYXcuZWxpZ2liaWxpdHkgPT09XG4gIC8vICAgICAnc3RyaW5nJ2AuIFRoZSBgUGAgdGFnZ2VkIHRlbXBsYXRlIHVzZWQgYnkgYHZhbGlkYXRpb25zW10uY29uZGl0aW9uYFxuICAvLyAgICAgYmVsb3cgcmV0dXJucyBhbiBFeHByZXNzaW9uIE9CSkVDVCBgeyBkaWFsZWN0LCBzb3VyY2UgfWAgXHUyMDE0IHBhc3Npbmcgb25lXG4gIC8vICAgICBoZXJlIGRvZXMgbm90IG5hcnJvdyBhbnl0aGluZywgaXQgbWFrZXMgdGhlIHByZWRpY2F0ZSB2YW5pc2guXG4gIC8vXG4gIC8vICAyLiBFdmVyeSBmaWVsZCByZWFkIGlzIGByZWNvcmQuYC1QUkVGSVhFRC4gVGhlIGV2YWx1YXRvciBpc1xuICAvLyAgICAgYEV4cHJlc3Npb25FbmdpbmVgIGZyb20gYEBvYmplY3RzdGFjay9mb3JtdWxhYCAocmVjb3JkLWxldmVsIENFTCksIGFuZFxuICAvLyAgICAgYHJlY29yZGAgaXMgdGhlIE9OTFkgYmluZGluZyBpdCBpcyBnaXZlbi4gVGhlIGJhcmUtaWRlbnRpZmllciBzcGVsbGluZ1xuICAvLyAgICAgYHN0YXR1cyA9PSAncHVibGlzaGVkJyAmJiBhdWRpZW5jZSA9PSAncHVibGljJ2AgQ09NUElMRVMgYW5kIHRoZW4gZmFpbHNcbiAgLy8gICAgIGF0IGV2YWx1YXRlIHdpdGggYFVua25vd24gdmFyaWFibGU6IGF1ZGllbmNlYCxcbiAgLy8gICAgIHdoaWNoIGBhc3NlcnRFbGlnaWJsZWAgdHVybnMgaW50byBFTElHSUJJTElUWV9VTkVWQUxVQUJMRSA0MjIuIFRoYXRcbiAgLy8gICAgIGZhaWxzIENMT1NFRCwgc28gaXQgaXMgbm90IGEgc2VjdXJpdHkgaG9sZTsgaXQgaXMgYSBmZWF0dXJlIHRoYXQgbmV2ZXJcbiAgLy8gICAgIG1pbnRzIGEgc2luZ2xlIGxpbmsgd2hpbGUgcmVhZGluZyBhcyBpZiBpdCB3b3Jrcy5cbiAgLy9cbiAgLy8gVGhlIHByZWRpY2F0ZSBpcyBUT1RBTCBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBgdmFsaWRhdGlvbnNgIGJlbG93IGFyZTpcbiAgLy8gYGhhcygpYCBndWFyZHMgZXZlcnkgcmVhZC4gYGFzc2VydEVsaWdpYmxlYCBtYXRlcmlhbGl6ZXMgZGVjbGFyZWQgZmllbGRzIHRvXG4gIC8vIGBudWxsYCBmaXJzdCwgc28gYW4gYWJzZW50IGtleSB3b3VsZCBub3QgYWJvcnQgaGVyZSB0b2RheSBcdTIwMTQgdGhlIGd1YXJkcyBrZWVwXG4gIC8vIHRoYXQgdHJ1ZSBpZiB0aGUgZmllbGQgc2V0IGNoYW5nZXMuIChUaGUgYGhhcyhyZWNvcmQueClgIGNhdmVhdCBjYXJyaWVkXG4gIC8vIGZyb20gb2JqZWN0c3RhY2sjNzg2MSBpcyBhYm91dCBgY29tcGlsZUNlbFRvRmlsdGVyYCwgdGhlIFNIQVJJTkctUlVMRSBwYXRoLlxuICAvLyBUaGF0IGlzIGEgZGlmZmVyZW50IGV2YWx1YXRvciwgaXQgaXMgbm90IG9uIHRoaXMgY29kZSBwYXRoLCBhbmQgaXQgaXMgbm90XG4gIC8vIGV2ZW4gZXhwb3J0ZWQgZnJvbSBgQG9iamVjdHN0YWNrL3BsdWdpbi1zaGFyaW5nYC4gVmVyaWZpZWQsIG5vdCBhc3N1bWVkLilcbiAgLy9cbiAgLy8gXHUyNkEwXHVGRTBGIEVsaWdpYmlsaXR5IGlzIGV2YWx1YXRlZCBhdCBNSU5UIHRpbWUgb25seTsgYHJlc29sdmVUb2tlbigpYCBkb2VzIG5vdFxuICAvLyByZS1jaGVjayBpdC4gUmUtY2xhc3NpZnlpbmcgYSBwdWJsaXNoZWQvcHVibGljIGFydGljbGUgdG8gaW50ZXJuYWwgb3IgYmFja1xuICAvLyB0byBkcmFmdCBkb2VzIE5PVCByZXZva2UgbGlua3MgYWxyZWFkeSBtaW50ZWQgZnJvbSBpdCBcdTIwMTQgdGhvc2UgbXVzdCBiZVxuICAvLyByZXZva2VkIGV4cGxpY2l0bHkuIFRoYXQgaXMgcGxhdGZvcm0gYmVoYXZpb3VyLCBmaWxlZCB1cHN0cmVhbSwgbm90XG4gIC8vIHNvbWV0aGluZyB0aGlzIGFwcCBjb21wZW5zYXRlcyBmb3IgYXBwLXNpZGUuXG4gIHB1YmxpY1NoYXJpbmc6IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8vIGBwdWJsaWNgIGFuZCBgbGlua19vbmx5YCBvbmx5LiBgc2lnbmVkX2luYCB3b3VsZCBiZSBhIGRpZmZlcmVudCBmZWF0dXJlXG4gICAgLy8gYW5kIGBlbWFpbGAgaXMgcmVmdXNlZCBhdCBjcmVhdGlvbiB3aXRob3V0IGFuIGFsbG93bGlzdC5cbiAgICBhbGxvd2VkQXVkaWVuY2VzOiBbJ3B1YmxpYycsICdsaW5rX29ubHknXSxcbiAgICAvLyBSZWFkLW9ubHkuIFNhbWUgYXMgdGhlIHBsYXRmb3JtIGRlZmF1bHQsIGRlY2xhcmVkIGFueXdheTogdGhpcyBpcyBhXG4gICAgLy8gc2VjdXJpdHkgYm91bmRhcnksIGFuZCBhIGRlZmF1bHQgaXMgbm90IGEgZGVjaXNpb24uXG4gICAgYWxsb3dlZFBlcm1pc3Npb25zOiBbJ3ZpZXcnXSxcbiAgICAvLyBUaGUgZ2F0ZS4gUHVibGlzaGVkIEFORCBwdWJsaWMtYXVkaWVuY2UsIG5vdGhpbmcgZWxzZSBcdTIwMTQgYSBkcmFmdCwgYW5cbiAgICAvLyBpbl9yZXZpZXcsIGFuIGFyY2hpdmVkLCBvciBhbnkgaW50ZXJuYWwtYXVkaWVuY2UgYXJ0aWNsZSBpcyByZWZ1c2VkIGF0XG4gICAgLy8gYGNyZWF0ZUxpbmtgIHdpdGggUkVDT1JEX05PVF9FTElHSUJMRSA0MjIgYW5kIG5vIHJvdyBpcyB3cml0dGVuLlxuICAgIGVsaWdpYmlsaXR5OlxuICAgICAgJ2hhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwicHVibGlzaGVkXCIgJiYgJyArXG4gICAgICAnaGFzKHJlY29yZC5hdWRpZW5jZSkgJiYgcmVjb3JkLmF1ZGllbmNlID09IFwicHVibGljXCInLFxuICAgIC8vIFN0cmlwcGVkIGZyb20gZXZlcnkgdG9rZW4tc2VydmVkIHJlc3BvbnNlLiBUaGVzZSBhcmUgdGhlIGZpZWxkcyB0aGF0XG4gICAgLy8gZXhpc3QgZm9yIHN0YWZmOiB3aG8gb3ducyB0aGUgYXJ0aWNsZSwgd2hpY2ggY3VzdG9tZXIgY2FzZSBpdCB3YXNcbiAgICAvLyB3cml0dGVuIGZyb20sIGFuZCB3aGVuIGFuIGVkaXRvciBsYXN0IHJldmlld2VkIGl0LiBOb25lIG9mIHRoZW0gYXJlIHBhcnRcbiAgICAvLyBvZiB0aGUgYW5zd2VyIGEgcmVhZGVyIGZvbGxvd2VkIHRoZSBsaW5rIGZvci5cbiAgICByZWRhY3RGaWVsZHM6IFsnb3duZXJfaWQnLCAncmVsYXRlZF90b19jYXNlJywgJ2xhc3RfcmV2aWV3ZWRfYXQnXSxcbiAgfSxcblxuICAvLyBBRFItMDA3OTogcmVuZGVyLW9ubHkgYHRpdGxlRm9ybWF0YCByZXRpcmVkIGluIGZhdm9yIG9mIGBuYW1lRmllbGRgLFxuICAvLyB3aGljaCBuYW1lcyBhIHJlYWwgZmllbGQuIFRoZSBmb3JtZXIgdGVtcGxhdGUgY29tcG9zZWQgdHdvIGxvY2FsIGZpZWxkcywgc29cbiAgLy8gYSBgZGlzcGxheV90aXRsZWAgZm9ybXVsYSBmaWVsZCByZXByb2R1Y2VzIGl0IGZvciB0aGUgcmVjb3JkIHRpdGxlLlxuICBuYW1lRmllbGQ6ICdkaXNwbGF5X3RpdGxlJyxcbiAgLy8gRXhwbGljaXQgc2VhcmNoIHRhcmdldHMgKEFEUi0wMDYxKS4gUkVRVUlSRUQgYmVjYXVzZSBuYW1lRmllbGQgaXMgYVxuICAvLyBGT1JNVUxBIChkaXNwbGF5X3RpdGxlL2Z1bGxfbmFtZSk6IHdpdGhvdXQgdGhpcywgJHNlYXJjaCBhdXRvLWRlZmF1bHRzIHRvXG4gIC8vIHRoZSBmb3JtdWxhIGZpZWxkLCB3aGljaCBpc24ndCBhIHJlYWwgY29sdW1uLCBzbyB0aGUgbG9va3VwIHBpY2tlciArIGdsb2JhbFxuICAvLyBzZWFyY2ggc2lsZW50bHkgcmV0dXJuIHplcm8uIFRoZXNlIGFyZSByZWFsLCBpbmRleGVkIGNvbHVtbnMuXG4gIHNlYXJjaGFibGVGaWVsZHM6IFsndGl0bGUnLCAnYXJ0aWNsZV9udW1iZXInLCAnc3VtbWFyeSddLFxuICBoaWdobGlnaHRGaWVsZHM6IFsnYXJ0aWNsZV9udW1iZXInLCAndGl0bGUnLCAnY2F0ZWdvcnknLCAnc3RhdHVzJywgJ2F1ZGllbmNlJ10sXG5cbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2Jhc2ljJywgICAgIGxhYmVsOiAnQXJ0aWNsZSBJbmZvcm1hdGlvbicsIGljb246ICdpbmZvJyB9LFxuICAgIHsga2V5OiAnY29udGVudCcsICAgbGFiZWw6ICdDb250ZW50JywgICAgICAgICAgICAgaWNvbjogJ2ZpbGUtdGV4dCcgfSxcbiAgICB7IGtleTogJ3RheG9ub215JywgIGxhYmVsOiAnQ2F0ZWdvcml6YXRpb24nLCAgICAgIGljb246ICd0YWcnIH0sXG4gICAgeyBrZXk6ICdtZXRyaWNzJywgICBsYWJlbDogJ0VuZ2FnZW1lbnQnLCAgICAgICAgICBpY29uOiAnYWN0aXZpdHknLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgXSxcblxuICBmaWVsZHM6IHtcbiAgICAvLyBQbGF0Zm9ybSBvd25lcnNoaXAgYW5jaG9yIFx1MjAxNCBjYW5vbmljYWwgbm90ZSBpbiBgYWNjb3VudC5vYmplY3QudHNgICgjNTQ4KS5cbiAgICBvd25lcl9pZDogRmllbGQubG9va3VwKCdzeXNfdXNlcicsIHtcbiAgICAgIGxhYmVsOiAnQXJ0aWNsZSBPd25lcicsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIHN5c3RlbTogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiBmYWxzZSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIGFydGljbGVfbnVtYmVyOiBGaWVsZC5hdXRvbnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnQXJ0aWNsZSBOdW1iZXInLFxuICAgICAgZm9ybWF0OiAnS0EtezAwMDB9JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuXG4gICAgdGl0bGU6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdUaXRsZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG1heExlbmd0aDogMjU1LFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICAvLyBBRFItMDA3OSByZWNvcmQgdGl0bGUgKHdhcyB0aXRsZUZvcm1hdCAne2FydGljbGVfbnVtYmVyfSAtIHt0aXRsZX0nKS5cbiAgICBkaXNwbGF5X3RpdGxlOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnRGlzcGxheSBUaXRsZScsXG4gICAgICBleHByZXNzaW9uOiBGYHJlY29yZC5hcnRpY2xlX251bWJlciArIFwiIC0gXCIgKyByZWNvcmQudGl0bGVgLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICBzdW1tYXJ5OiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnU3VtbWFyeScsXG4gICAgICBkZXNjcmlwdGlvbjogJ09uZS1wYXJhZ3JhcGggVEw7RFIgc2hvd24gaW4gc2VhcmNoIHJlc3VsdHMgYW5kIEFJIGNpdGF0aW9ucy4nLFxuICAgICAgbWF4TGVuZ3RoOiA1MDAsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICBib2R5OiBGaWVsZC5tYXJrZG93bih7XG4gICAgICBsYWJlbDogJ0JvZHknLFxuICAgICAgZGVzY3JpcHRpb246ICdGdWxsIGFydGljbGUgY29udGVudCAoTWFya2Rvd24pLicsXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgZ3JvdXA6ICdjb250ZW50JyxcbiAgICB9KSxcblxuICAgIGNhdGVnb3J5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdDYXRlZ29yeScsXG4gICAgICBncm91cDogJ3RheG9ub215JyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0dldHRpbmcgU3RhcnRlZCcsICAgICB2YWx1ZTogJ2dldHRpbmdfc3RhcnRlZCcsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ0hvdy1UbycsICAgICAgICAgICAgICB2YWx1ZTogJ2hvd190bycgfSxcbiAgICAgICAgeyBsYWJlbDogJ1Ryb3VibGVzaG9vdGluZycsICAgICB2YWx1ZTogJ3Ryb3VibGVzaG9vdGluZycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0JpbGxpbmcgJiBQcmljaW5nJywgICB2YWx1ZTogJ2JpbGxpbmcnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdBUEkgJiBJbnRlZ3JhdGlvbnMnLCAgdmFsdWU6ICdhcGknIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWxlYXNlIE5vdGVzJywgICAgICAgdmFsdWU6ICdyZWxlYXNlX25vdGVzJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUG9saWN5JywgICAgICAgICAgICAgIHZhbHVlOiAncG9saWN5JyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIHRhZ3M6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ1RhZ3MnLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBncm91cDogJ3RheG9ub215JyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0F1dGgnLCAgICAgICAgICB2YWx1ZTogJ2F1dGgnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTU08nLCAgICAgICAgICAgdmFsdWU6ICdzc28nIH0sXG4gICAgICAgIHsgbGFiZWw6ICdNb2JpbGUnLCAgICAgICAgdmFsdWU6ICdtb2JpbGUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFbWFpbCcsICAgICAgICAgdmFsdWU6ICdlbWFpbCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1JlcG9ydHMnLCAgICAgICB2YWx1ZTogJ3JlcG9ydHMnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQZXJmb3JtYW5jZScsICAgdmFsdWU6ICdwZXJmb3JtYW5jZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0RhdGEgSW1wb3J0JywgICB2YWx1ZTogJ2RhdGFfaW1wb3J0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnV2ViaG9va3MnLCAgICAgIHZhbHVlOiAnd2ViaG9va3MnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnRHJhZnQnLCAgICAgIHZhbHVlOiAnZHJhZnQnLCAgICAgY29sb3I6ICcjOTRBM0I4JywgZGVmYXVsdDogdHJ1ZSB9LFxuICAgICAgICB7IGxhYmVsOiAnSW4gUmV2aWV3JywgIHZhbHVlOiAnaW5fcmV2aWV3JywgY29sb3I6ICcjRjU5RTBCJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUHVibGlzaGVkJywgIHZhbHVlOiAncHVibGlzaGVkJywgY29sb3I6ICcjMTBCOTgxJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQXJjaGl2ZWQnLCAgIHZhbHVlOiAnYXJjaGl2ZWQnLCAgY29sb3I6ICcjNDc1NTY5JyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIGF1ZGllbmNlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdBdWRpZW5jZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1B1YmxpYyBhcnRpY2xlcyBhcmUgdmlzaWJsZSBpbiB0aGUgY3VzdG9tZXIgcG9ydGFsOyBpbnRlcm5hbCBhcnRpY2xlcyBhcmUgYWdlbnQtb25seS4nLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnUHVibGljJywgICB2YWx1ZTogJ3B1YmxpYycsIGRlZmF1bHQ6IHRydWUsIGNvbG9yOiAnIzBFQTVFOScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0ludGVybmFsJywgdmFsdWU6ICdpbnRlcm5hbCcsIGNvbG9yOiAnIzdDM0FFRCcgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICBsYW5ndWFnZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnTGFuZ3VhZ2UnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdFbmdsaXNoJywgICAgICAgICAgICAgdmFsdWU6ICdlbicsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ1NpbXBsaWZpZWQgQ2hpbmVzZScsICB2YWx1ZTogJ3poX2NuJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU3BhbmlzaCcsICAgICAgICAgICAgIHZhbHVlOiAnZXNfZXMnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdKYXBhbmVzZScsICAgICAgICAgICAgdmFsdWU6ICdqYV9qcCcgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICByZWxhdGVkX3RvX2Nhc2U6IEZpZWxkLmxvb2t1cCgnY3JtX2Nhc2UnLCB7XG4gICAgICBsYWJlbDogJ09yaWdpbmF0aW5nIENhc2UnLFxuICAgICAgZGVzY3JpcHRpb246ICdDYXNlIHRoaXMgYXJ0aWNsZSB3YXMgYXV0aG9yZWQgZnJvbSAob3B0aW9uYWwpLicsXG4gICAgICBncm91cDogJ2NvbnRlbnQnLFxuICAgIH0pLFxuXG5cbiAgICBwdWJsaXNoZWRfYXQ6IEZpZWxkLmRhdGV0aW1lKHtcbiAgICAgIGxhYmVsOiAnUHVibGlzaGVkIEF0JyxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICBsYXN0X3Jldmlld2VkX2F0OiBGaWVsZC5kYXRldGltZSh7XG4gICAgICBsYWJlbDogJ0xhc3QgUmV2aWV3ZWQgQXQnLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIGB2aWV3X2NvdW50YCBpcyBHT05FICgjNjAxKSwgYW5kIHRoaXMgbm90ZSBpcyB0aGUgcmVjb3JkIG9mIHdoeS5cbiAgICAgKlxuICAgICAqIEFsbCB0aHJlZSBlbmdhZ2VtZW50IGNvdW50ZXJzIHdlcmUgYHJlYWRvbmx5OiB0cnVlYCB3aXRoIGEgd3JpdGVyXG4gICAgICogbm93aGVyZSBcdTIwMTQgb24gdGhlIHBsYXRmb3JtIG9yIGluIHRoaXMgYXBwIFx1MjAxNCBzbyBhbGwgdGhyZWUgd2VyZSBwaW5uZWQgYXRcbiAgICAgKiB3aGF0ZXZlciB0aGUgc2VlZCBzYWlkLCBmb3JldmVyLCB3aGlsZSB0aGUgYXJ0aWNsZSBncmlkIHN1bW1lZCBhIFwiVmlld3NcIlxuICAgICAqIGNvbHVtbi4gQURSLTAwNDkncyBlbmZvcmNlLW9yLXJlbW92ZSBsZWF2ZXMgdHdvIGhvbmVzdCBlbmRpbmdzIHBlclxuICAgICAqIGZpZWxkOiBnaXZlIGl0IGEgd3JpdGVyLCBvciBkZWxldGUgaXQuIFRoZSBjYXJkIGxlZnQgdGhpcyBvbmUgdG8gdGhlXG4gICAgICogaW1wbGVtZW50ZXIsIGFuZCB0aGUgdHdvIGJlbG93IHdlbnQgdGhlIG90aGVyIHdheSwgc28gdGhlIHNwbGl0IGlzXG4gICAgICogYXJndWVkIHJhdGhlciB0aGFuIGFzc3VtZWQuXG4gICAgICpcbiAgICAgKiBBIHBhZ2UtdmlldyB3cml0ZXIgV09VTEQgaGF2ZSBiZWVuIGV4cHJlc3NpYmxlIFx1MjAxNCBgYWZ0ZXJGaW5kYCBpcyBhIHJlYWxcbiAgICAgKiBob29rIGV2ZW50IG9uIHRoaXMgcGxhdGZvcm0uIEl0IGlzIG5vdCBidWlsdCwgYmVjYXVzZSBvZiB3aGF0IHRoZSBldmVudFxuICAgICAqIGFjdHVhbGx5IG1lYW5zOiBgYmVmb3JlRmluZGAvYGFmdGVyRmluZGAgZmlyZSBvbiByZWNvcmQgTUFURVJJQUxJWkFUSU9OLFxuICAgICAqIGZvciBgZmluZGAgYW5kIGBmaW5kT25lYCBhbGlrZSwgd2l0aCBubyBwZXItbWV0aG9kIHJlYWQgZXZlbnRcbiAgICAgKiAoZGVsaWJlcmF0ZWx5IFx1MjAxNCBzZWUgdGhlIHNwZWMncyBub3RlIG9uICMzMTk1KS4gU28gYSBjb3VudGVyIHdyaXR0ZW5cbiAgICAgKiB0aGVyZSB3b3VsZCBpbmNyZW1lbnQgb24gdGhlIGFydGljbGUgZ3JpZCwgb24gZ2xvYmFsIHNlYXJjaCwgb24gdGhlXG4gICAgICogbG9va3VwIHBpY2tlciBpbiB0aGUgY2xvc2UtY2FzZSBzY3JlZW4sIG9uIHRoZSBBSSBncm91bmRpbmcgcXVlcmllcyB0aGF0XG4gICAgICogY2l0ZSBhcnRpY2xlcyBcdTIwMTQgZXZlcnkgb25lIG9mIHRoZW0gYSBcInZpZXdcIiBvZiBhIHJvdyBub2JvZHkgcmVhZC4gVGhlXG4gICAgICogbnVtYmVyIHdvdWxkIGdyb3cgZmFzdGVzdCBmb3IgYXJ0aWNsZXMgbm9ib2R5IG9wZW5zLCBhbmQgaXQgd291bGQgY2FycnlcbiAgICAgKiBhIGRhdGFiYXNlIHdyaXRlIG9uIGV2ZXJ5IHJlYWQgcGF0aCBpbiB0aGUgYXBwIHRvIGRvIGl0LlxuICAgICAqXG4gICAgICogXCJWaWV3c1wiIHRoYXQgbWVhbnMgXCJhcHBlYXJhbmNlcyBpbiBhbnkgcXVlcnlcIiBpcyBhIHdvcnNlIGxpZSB0aGFuIGFcbiAgICAgKiBmaWVsZCB0aGF0IGlzIG1pc3NpbmcsIGJlY2F1c2UgaXQgbG9va3MgbGlrZSBkYXRhLiBBIHJlYWwgcGFnZS12aWV3XG4gICAgICogY291bnRlciBuZWVkcyBhIHJlYWwgdmlldyBldmVudCBmcm9tIGEgcmVhbCBhcnRpY2xlIHN1cmZhY2UgXHUyMDE0IHRoZSBkYXlcbiAgICAgKiBvbmUgZXhpc3RzLCB0aGlzIGZpZWxkIGNvbWVzIGJhY2sgd2l0aCBpdCwgYW5kIG5vdCBiZWZvcmUuXG4gICAgICpcbiAgICAgKiBgaGVscGZ1bF9jb3VudGAgLyBgbm90X2hlbHBmdWxfY291bnRgIERPIGdldCBhIHdyaXRlciwgYW5kIGl0IGlzIHRoZVxuICAgICAqIHdob2xlIHJlYXNvbiBgY3JtX2FydGljbGVfZmVlZGJhY2tgIGV4aXN0czogcmVhZGVyIHZlcmRpY3RzIGFyZSByZWNvcmRlZFxuICAgICAqIGFzIHJvd3MgYW5kIHRoZXNlIHR3byBhcmUgUkVDT1VOVEVEIGZyb20gdGhlbSBieVxuICAgICAqIGBhcnRpY2xlX2ZlZWRiYWNrX21ldHJpY3NfcmVmcmVzaGAuIFRoZXkgc3RheSBgcmVhZG9ubHk6IHRydWVgIGFuZCB0aGF0XG4gICAgICogaXMgbm93IGFuIGFjY3VyYXRlIHN0YXRlbWVudCBcdTIwMTQgZGVyaXZlZCBmcm9tIGV2aWRlbmNlLCBuZXZlciB0eXBlZCBpbi5cbiAgICAgKi9cbiAgICBoZWxwZnVsX2NvdW50OiBGaWVsZC5udW1iZXIoe1xuICAgICAgbGFiZWw6ICdIZWxwZnVsIFZvdGVzJyxcbiAgICAgIGdyb3VwOiAnbWV0cmljcycsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogMCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUmVjb3VudGVkIGZyb20gY3JtX2FydGljbGVfZmVlZGJhY2sgXHUyMDE0IG5ldmVyIHR5cGVkIGluLicsXG4gICAgfSksXG5cbiAgICBub3RfaGVscGZ1bF9jb3VudDogRmllbGQubnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnTm90IEhlbHBmdWwgVm90ZXMnLFxuICAgICAgZ3JvdXA6ICdtZXRyaWNzJyxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgZGVmYXVsdFZhbHVlOiAwLFxuICAgICAgZGVzY3JpcHRpb246ICdSZWNvdW50ZWQgZnJvbSBjcm1fYXJ0aWNsZV9mZWVkYmFjayBcdTIwMTQgbmV2ZXIgdHlwZWQgaW4uJyxcbiAgICB9KSxcbiAgfSxcblxuICBpbmRleGVzOiBbXG4gICAgeyBmaWVsZHM6IFsndGl0bGUnXSB9LFxuICAgIHsgZmllbGRzOiBbJ2NhdGVnb3J5J10gfSxcbiAgICB7IGZpZWxkczogWydzdGF0dXMnXSB9LFxuICAgIHsgZmllbGRzOiBbJ2F1ZGllbmNlJ10gfSxcbiAgICB7IGZpZWxkczogWydsYW5ndWFnZSddIH0sXG4gIF0sXG5cbiAgLy8gQVBJIHN1cmZhY2UuIEhpc3RvcnkgXHUyMTkyIEZpZWxkLnRyYWNrSGlzdG9yeSAoQURSLTAwNTIpLlxuICBlbmFibGU6IHtcbiAgICBhcGlFbmFibGVkOiB0cnVlLFxuICAgIGFwaU1ldGhvZHM6IFsnZ2V0JywgJ2xpc3QnLCAnY3JlYXRlJywgJ3VwZGF0ZScsICdkZWxldGUnXSxcbiAgfSxcblxuICAvLyBQcmVkaWNhdGVzIGJlbG93IGFyZSBUT1RBTDogZXZlcnkgYHJlY29yZC54YCByZWFkIGlzIGBoYXMoKWAtZ3VhcmRlZCwgc28gdGhlXG4gIC8vIHJ1bGUgcmV0dXJucyBhIHZlcmRpY3QgZXZlbiB3aGVuIHRoZSBtZXJnZWQgcmVjb3JkIGhhcyBubyBzdWNoIGtleS4gU2VlXG4gIC8vIEFHRU5UUy5tZCBcIlZhbGlkYXRpb24gcHJlZGljYXRlcyBtdXN0IGJlIFRPVEFMXCIgYW5kXG4gIC8vIHRlc3Qvb2JqZWN0LXZhbGlkYXRpb24tcHJlZGljYXRlcy50ZXN0LnRzLCB3aGljaCBmYWlscyB0aGUgYnVpbGQgb3RoZXJ3aXNlLlxuICB2YWxpZGF0aW9uczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdwdWJsaXNoZWRfcmVxdWlyZXNfYm9keScsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0FydGljbGVzIGNhbm5vdCBiZSBwdWJsaXNoZWQgd2l0aG91dCBhIGJvZHkuJyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnN0YXR1cykgJiYgcmVjb3JkLnN0YXR1cyA9PSBcInB1Ymxpc2hlZFwiICYmICghaGFzKHJlY29yZC5ib2R5KSB8fCByZWNvcmQuYm9keSA9PSBudWxsIHx8IHJlY29yZC5ib2R5ID09IFwiXCIpYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdwdWJsaXNoZWRfcmVxdWlyZXNfc3VtbWFyeScsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiAnUHVibGlzaGVkIGFydGljbGVzIHNob3VsZCBoYXZlIGEgc3VtbWFyeSBmb3Igc2VhcmNoIHJlc3VsdHMgYW5kIEFJIGNpdGF0aW9ucy4nLFxuICAgICAgY29uZGl0aW9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwicHVibGlzaGVkXCIgJiYgKCFoYXMocmVjb3JkLnN1bW1hcnkpIHx8IHJlY29yZC5zdW1tYXJ5ID09IG51bGwgfHwgcmVjb3JkLnN1bW1hcnkgPT0gXCJcIilgLFxuICAgIH0sXG4gIF0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIE9iamVjdCBEZWZpbml0aW9ucyBCYXJyZWxcbiAqIFxuICogUmUtZXhwb3J0cyB0aGlzIHBhY2thZ2UncyAqLm9iamVjdC50cyBkZWZpbml0aW9ucyBmb3IgcmVnaXN0cmF0aW9uIGJ5IHRoZVxuICogYXBwIHBhY2thZ2UncyBzdGFjayAoYG9iamVjdHN0YWNrLmNvbXBvc2l0aW9uLnRzYCBcdTIxOTIgYHNyYy9zYWxlcy9pbmRleC50c2ApLiBUaGUgYCouaG9vay50c2AgZmlsZXMgc2l0IGJlc2lkZSB0aGVtIGFuZCBhcmVcbiAqIHJlZ2lzdGVyZWQgdGhyb3VnaCBgLi9ob29rcy50c2AgaW5zdGVhZCBcdTIwMTQgYSBob29rIGlzIGF0dGFjaGVkIHRvIHRoZSBvYmplY3RcbiAqIGl0IG5hbWVzLCBhbmQgc2luY2UgdGhlIEFEUi0wMTMwIGxheW91dCBhIGRpcmVjdG9yeSBpcyBhIHBhY2thZ2UsIHNvIHRoZSB0d29cbiAqIHRyYXZlbCB0b2dldGhlci5cbiAqL1xuXG4vKlxuICogQ2Fub25pY2FsIG5vdGUgXHUyMDE0IHRoZSBjb2xsYWJvcmF0aW9uIGNhcGFiaWxpdGllcyAoYGVuYWJsZS5maWxlc2AsXG4gKiBgZW5hYmxlLmZlZWRzYCkuIFJlZmVyZW5jZWQgZnJvbSBlYWNoIG9iamVjdCB0aGF0IG9wdHMgaW4gKCM2MDIpLlxuICpcbiAqICoqYGVuYWJsZS5maWxlc2AgXHUyMDE0IGF0dGFjaG1lbnRzLiBPcHQtaW4sIHNwZWMgZGVmYXVsdCBgZmFsc2VgLioqIEl0IGlzIGEgcmVhbCxcbiAqIGRvdWJseS1lbmZvcmNlZCBzd2l0Y2gsIG5vdCBkb2N1bWVudGF0aW9uOlxuICpcbiAqIC0gU2VydmVyOiBgcGx1Z2luLWF1ZGl0YCdzIGBlbmZvcmNlRmlsZXNDYXBhYmlsaXR5YCBydW5zIGBiZWZvcmVJbnNlcnRgIG9uXG4gKiAgIGBzeXNfYXR0YWNobWVudGAgYW5kIHRocm93cyBgRklMRVNfRElTQUJMRURgICg0MDMpIHdoZW4gdGhlIHJvdydzXG4gKiAgIGBwYXJlbnRfb2JqZWN0YCBkb2VzIG5vdCBkZWNsYXJlIGBmaWxlczogdHJ1ZWAuIE5vIGZsYWcgXHUyMTkyIG5vIGF0dGFjaG1lbnQgY2FuXG4gKiAgIGV4aXN0IGFnYWluc3QgdGhlIHJlY29yZCwgd2hhdGV2ZXIgdGhlIFVJIG9mZmVycy5cbiAqIC0gQ2xpZW50OiB0aGUgY29uc29sZSdzIGBSZWNvcmREZXRhaWxWaWV3YCBnYXRlcyBpdHMgQXR0YWNobWVudHMgcGFuZWwgb25cbiAqICAgYGVuYWJsZT8uZmlsZXMgPT09IHRydWVgLCBzbyBhbiBvYmplY3Qgd2l0aG91dCB0aGUgZmxhZyBoYXMgbm8gdXBsb2FkXG4gKiAgIHN1cmZhY2UgYXQgYWxsLlxuICpcbiAqIFRoZSBmbGFnIG9wZW5zIHRoZSBzdXJmYWNlOyBpdCBncmFudHMgKipubyoqIGFjY2VzcyBvZiBpdHMgb3duLCBhbmQgbm90aGluZ1xuICogZWxzZSBvbiB0aGUgcGxhdGZvcm0gZG9lcyBlaXRoZXIuIGBzeXNfYXR0YWNobWVudGAgaXMgYW4gb2JqZWN0IGxpa2UgYW55XG4gKiBvdGhlcjogdGhlIHBsYXRmb3JtJ3MgbWVtYmVyIGJhc2VsaW5lIG5hbWVzIGl0IG5vd2hlcmUgKGl0IHdhcyBuYXJyb3dlZCB0b1xuICogZXhwbGljaXQtYWxsb3csIG9iamVjdHN0YWNrLWFpL29iamVjdHN0YWNrIzU0OTEpLCBzbyBhIHBlcnNvbiB3aG9zZVxuICogcGVybWlzc2lvbiBzZXRzIGRvIG5vdCBncmFudCBpdCBpcyByZWZ1c2VkIHRoZSB3aG9sZSBwYW5lbCB3aXRoIDQwM1xuICogYFBFUk1JU1NJT05fREVOSUVEYCwgcmVhZHMgaW5jbHVkZWQuIE1lYXN1cmVkIG9uIGEgZnJlc2ggYHBucG0gZGV2YCBib3hcbiAqICgjMjAyOSk6IGBuYS5yZXBgLCBvcGVuaW5nIGEgcXVvdGUgdGhleSBjYW4gcmVhZCwgZ290IFwiWW91IGRvbid0IGhhdmUgYWNjZXNzXG4gKiB0byB0aGVzZSBhdHRhY2htZW50c1wiLCBhbmQgZXZlcnkgb3RoZXIgZGVtbyBwZXJzb25hIGdvdCB0aGUgc2FtZSBhbnN3ZXIuXG4gKiBUaGUgcGxhdGZvcm0ncyBhdHRhY2htZW50cy1hY2Nlc3MgcGFnZSBuYW1lcyB0aGUgcmVtZWR5OiBhbiBvcmRpbmFyeSxcbiAqIHBvc2l0aW9uLWRpc3RyaWJ1dGVkIHBlcm1pc3Npb24gc2V0IGdyYW50cyBgc3lzX2F0dGFjaG1lbnRgLiBTbyBFVkVSWVxuICogcGVybWlzc2lvbiBzZXQgd2hvc2UgaG9sZGVycyBjYW4gcmVhZCBhIGZpbGVzLWVuYWJsZWQgb2JqZWN0IGdyYW50cyBpdFxuICogYGFsbG93UmVhZGAsIGFuZCBgZ3Vlc3RfcG9ydGFsYCBncmFudHMgbm90aGluZy5cbiAqXG4gKiBXSElDSCBhdHRhY2htZW50cyB0aGF0IGdyYW50IHJlYWNoZXMgc3RheXMgd2l0aCB0aGUgcGFyZW50IHJlY29yZDogYVxuICogYHNlcnZpY2Utc3RvcmFnZWAgbWlkZGxld2FyZSBpbnRlcnNlY3RzIGV2ZXJ5IGBzeXNfYXR0YWNobWVudGAgcmVhZCB3aXRoIHRoZVxuICogcGFyZW50cyB0aGUgY2FsbGVyIGNhbiBhY3R1YWxseSBzZWUgKGZhaWxpbmcgY2xvc2VkIHRvIGEgZGVueS1hbGwgZmlsdGVyIG9uXG4gKiBlcnJvcikuIFNvIGEgcmVwIGxpc3RzIHRoZSBhdHRhY2htZW50cyBvZiB0aGUgcXVvdGVzIHRoZXkgY2FuIHJlYWQgYW5kIG9mIG5vXG4gKiBvdGhlciAoYHRlc3QvcmVjb3JkLWF0dGFjaG1lbnRzLWFjY2Vzcy50ZXN0LnRzYCBtZWFzdXJlcyBpdCkuXG4gKlxuICogKipVcGxvYWQgYW5kIGRlbGV0ZSBhcmUgTk9UIGdyYW50ZWQsIG9uIHB1cnBvc2UgKCMyMDI5KS4qKiBUaGVpciBnYXRlIGlzXG4gKiBgY2FuRWRpdChwYXJlbnQpYCAoYXR0YWNoKSBhbmQgdXBsb2FkZXItb3ItYGNhbkVkaXQocGFyZW50KWAgKGRlbGV0ZSksIGFza2VkXG4gKiBvZiB0aGUgc2hhcmluZyBzZXJ2aWNlLCBhbmQgb24gMTcuNy4wIHRoYXQgc2VydmljZSBhbnN3ZXJzIGB0cnVlYCBmb3IgRVZFUllcbiAqIGBjb250cm9sbGVkX2J5X3BhcmVudGAgb2JqZWN0OiBpdCByZWFkcyB0aGF0IG1vZGVsIGFzIGBwdWJsaWNgIGFuZCBuZXZlciBhc2tzXG4gKiB0aGUgbWFzdGVyLiBUaHJlZSBvZiB0aGUgc2l4IGZpbGVzLWVuYWJsZWQgb2JqZWN0cyBhcmUgc3VjaCBjaGlsZHJlblxuICogKGBjcm1fY29udGFjdGAsIGBjcm1fcXVvdGVgLCBgY3JtX2NvbnRyYWN0YCkuIE1lYXN1cmVkIG9uIHRoZSBzYW1lIGJveCB3aXRoXG4gKiB0aGUgd3JpdGUgYml0cyBncmFudGVkOiBgbmEucmVwYCBhdHRhY2hlZCBhIGZpbGUgdG8gYSBxdW90ZSB0aGV5IGdldCA0MDQgb25cbiAqICgyMDEpLCBhbmQgb24gYSBjb250cmFjdCB3aG9zZSBvd24gUEFUQ0ggYW5zd2VycyB0aGVtIDQwMyB0aGV5IGF0dGFjaGVkIGFcbiAqIGZpbGUgKDIwMSkgYW5kIGRlbGV0ZWQgdGhlIGFkbWluJ3MgZXhlY3V0ZWQtY29udHJhY3QgZmlsZSAoMjAwKSwgd2hpbGUgYW5cbiAqIGF0dGFjaCB0byBhIHByaXZhdGUgYWNjb3VudCB0aGV5IGNhbm5vdCByZWFkIGFuc3dlcmVkIDQwM1xuICogYEFUVEFDSE1FTlRfUEFSRU5UX0FDQ0VTU2AuIFNvIHRoZSB3cml0ZSBiaXRzIHdvdWxkIGxldCBldmVyeSBwZXJzb25hIHBsYW50XG4gKiBmaWxlcyBvbiwgYW5kIGRlbGV0ZSBvdGhlcnMnIGZpbGVzIGZyb20sIHF1b3RlcywgY29udHJhY3RzIGFuZCBjb250YWN0c1xuICogdGhleSBjYW5ub3QgZWRpdC4gVGhhdCBpcyBhIHBsYXRmb3JtIGRlZmVjdCwgcmVwb3J0ZWQgdXBzdHJlYW1cbiAqIGZyb20gIzIwMjk7IHVudGlsIGl0cyBmaXggaXMgaW4gdGhlIHBpbm5lZCB2ZXJzaW9uLCBvbmx5IGFuIGFkbWluaXN0cmF0b3JcbiAqIHVwbG9hZHMsIGFuZCB0aGUgd3JpdGUgYml0cyBqb2luIGBhbGxvd1JlYWRgIGhlcmUgd2hlbiBpdCBsYW5kcyAoQUdFTlRTLm1kXG4gKiBcdTAwQTcyOiB3YWl0LCBkbyBub3Qgcm91dGUgYXJvdW5kIGl0KS5cbiAqXG4gKiBMZWFkcyBhcmUgZGVsaWJlcmF0ZWx5IGV4Y2x1ZGVkIFx1MjAxNCBhdHRhY2htZW50cyBvbiB1bnF1YWxpZmllZCBsZWFkcyBpbnZpdGVcbiAqIGp1bmsuIFJldmlzaXQgb24gZGVtYW5kLlxuICpcbiAqICoqYGVuYWJsZS5mZWVkc2AgXHUyMDE0IHJlY29yZCBjb21tZW50cyAoYHN5c19jb21tZW50YCkuIE9wdC1PVVQsIHNwZWMgZGVmYXVsdFxuICogYHRydWVgLioqIEJvdGggZW5mb3JjZW1lbnQgcG9pbnRzIGdhdGUgb24gYW4gZXhwbGljaXQgYGZhbHNlYFxuICogKGBlbmZvcmNlRmVlZHNDYXBhYmlsaXR5YCB0aHJvd3MgYEZFRURTX0RJU0FCTEVEYCBvbmx5IGZvciBgZmVlZHMgPT09IGZhbHNlYDtcbiAqIHRoZSBjb25zb2xlIHJlbmRlcnMgdGhlIGZlZWQgdW5sZXNzIGBlbmFibGU/LmZlZWRzID09PSBmYWxzZWApLCBzbyBldmVyeVxuICogSG90Q1JNIG9iamVjdCBhbHJlYWR5IGhhcyBjb21tZW50cyBlbmFibGVkIGFuZCBhdXRob3JpbmcgYGZlZWRzOiB0cnVlYCB3b3VsZFxuICogcmVzdGF0ZSBhIGRlZmF1bHQgcmF0aGVyIHRoYW4gY2hhbmdlIGJlaGF2aW91ci4gRG8gbm90IGFkZCBpdDogYW4gaW5lcnRcbiAqIHJlc3RhdGVtZW50IGlzIHRoZSBraW5kIG9mIG1ldGFkYXRhIHRoYXQgbGF0ZXIgcmVhZHMgYXMgbG9hZC1iZWFyaW5nLlxuICogSWYgY29tbWVudHMgZXZlciBuZWVkIHRvIGJlIHN3aXRjaGVkIG9mZiBmb3IgYW4gb2JqZWN0LCBhdXRob3IgYGZhbHNlYC5cbiAqIGB0ZXN0L2NvbGxhYm9yYXRpb24tY2FwYWJpbGl0aWVzLnRlc3QudHNgIHBpbnMgYm90aCBoYWx2ZXMgb2YgdGhpcyBydWxlLlxuICpcbiAqIFZlcmlmaWVkIGluIGEgbGl2ZSBjb25zb2xlICgjNjAyKTogdGhlIERpc2N1c3Npb24gcGFuZWwgcmVuZGVycyBvbiB0aGVcbiAqIG9wcG9ydHVuaXR5IGFuZCBhY2NvdW50IHJlY29yZHMsIGEgcG9zdGVkIGNvbW1lbnQgcm91bmQtdHJpcHNcbiAqIChgUE9TVCAvYXBpL3YxL2RhdGEvc3lzX2NvbW1lbnRgIFx1MjE5MiAyMDEpIGFuZCBzdXJ2aXZlcyBhIHJlbG9hZC5cbiAqXG4gKiBMaWtlIGBlbmFibGUuZmlsZXNgLCB0aGUgZmxhZyBvcGVucyB0aGUgc3VyZmFjZSBhbmQgZ3JhbnRzIG5vIGFjY2Vzcy4gVGhlXG4gKiBEaXNjdXNzaW9uIHBhbmVsIHJlYWRzIHR3byBwbGF0Zm9ybSBvYmplY3RzLCBgc3lzX2NvbW1lbnRgICh0aGUgY29tbWVudHMpXG4gKiBhbmQgYHN5c19hY3Rpdml0eWAgKHRoZSByZWNvcmQncyBhY3Rpdml0eSB0aW1lbGluZSksIGFuZCB0aGUgbWVtYmVyIGJhc2VsaW5lXG4gKiBuYW1lcyBuZWl0aGVyLCBzbyB0aHJvdWdoICMyMDI5IGV2ZXJ5IHBlcnNvbmEgYnV0IHRoZSBwbGF0Zm9ybSBhZG1pbiBnb3RcbiAqIFwiWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3IGNvbW1lbnRzIG9uIHRoaXMgcmVjb3JkXCIgYW5kIHRoZSBzYW1lIGZvclxuICogaXRzIGFjdGl2aXR5ICg0MDMgYFBFUk1JU1NJT05fREVOSUVEYCkuIFNvIGV2ZXJ5IHNldCB0aGF0IGdyYW50c1xuICogYHN5c19hdHRhY2htZW50YCBhbHNvIGdyYW50cyBgc3lzX2NvbW1lbnRgIHJlYWQsIGNyZWF0ZSBhbmQgZWRpdCBhbmRcbiAqIGBzeXNfYWN0aXZpdHlgIHJlYWQsIGFuZCBgZ3Vlc3RfcG9ydGFsYCBncmFudHMgbmVpdGhlci5cbiAqXG4gKiBXSElDSCB0aHJlYWRzIHRob3NlIGdyYW50cyByZWFjaCBpcyB0aGUgcGxhdGZvcm0ncywgYW5kIGl0IGZvbGxvd3MgdGhlXG4gKiBwYXJlbnQgcmVjb3JkICh0aGUgcGxhdGZvcm0ncyBvYmplY3RzdGFjay1haS9vYmplY3RzdGFjayM0NjMwIGdhdGVzKTogYVxuICogYHBsdWdpbi1hdWRpdGAgbWlkZGxld2FyZSBuYXJyb3dzIGV2ZXJ5IGBzeXNfY29tbWVudGAgYW5kIGBzeXNfYWN0aXZpdHlgIHJlYWRcbiAqIHRvIHJvd3Mgd2hvc2UgcGFyZW50IHRoZSBjYWxsZXIgY2FuIHJlYWQsIGEgcG9zdCB0byBhIHRocmVhZCB3aG9zZSByZWNvcmQgdGhlXG4gKiBjYWxsZXIgY2Fubm90IHJlYWQgaXMgcmVmdXNlZCB3aXRoIDQwMyBgUkVDT1JEX05PVF9BQ0NFU1NJQkxFYCwgYW5kIG9ubHkgYVxuICogY29tbWVudCdzIGF1dGhvciBtYXkgZWRpdCBpdC4gTWVhc3VyZWQgYXMgYG5hLnJlcGAgb24gYSBmcmVzaCBgcG5wbSBkZXZgIGJveFxuICogKCMyMDI5KTogdGhlIGNvbW1lbnRzIGFuZCBhY3Rpdml0eSBvZiB0aGUgYWNjb3VudHMsIHF1b3RlcyBhbmQgY29udHJhY3RzIHRoZXlcbiAqIGNhbiByZWFkIGFyZSBsaXN0ZWQsIHRob3NlIG9mIHJlY29yZHMgdGhleSBjYW5ub3QgcmVhZCBhcmUgbm90ICg0MDQgYnkgaWQpLFxuICogYW5kIGEgcG9zdCB0byBvbmUgb2YgdGhvc2UgaXMgcmVmdXNlZC4gYHRlc3QvcmVjb3JkLWNvbW1lbnRzLWFjY2Vzcy50ZXN0LnRzYFxuICogcGlucyBpdC5cbiAqXG4gKiAqKkRlbGV0aW5nIGEgY29tbWVudCBpcyBOT1QgZ3JhbnRlZCwgb24gcHVycG9zZSAoIzIwMjkpLioqIEl0cyBnYXRlIGlzXG4gKiBhdXRob3Itb3ItYGNhbkVkaXQocGFyZW50KWAsIHRoZSBzYW1lIHNoYXJpbmctc2VydmljZSBjYWxsIGFzIHRoZSBhdHRhY2htZW50XG4gKiBnYXRlIGFib3ZlLCB3aXRoIHRoZSBzYW1lIDE3LjcuMCBhbnN3ZXIgb2YgYHRydWVgIGZvciBldmVyeVxuICogYGNvbnRyb2xsZWRfYnlfcGFyZW50YCBwYXJlbnQuIE1lYXN1cmVkIHdpdGggdGhlIGRlbGV0ZSBiaXQgZ3JhbnRlZDogYG5hLnJlcGBcbiAqIGRlbGV0ZWQgdGhlIGFkbWluJ3MgY29tbWVudCBvbiBhIGNvbnRyYWN0IHdob3NlIG93biBQQVRDSCBhbnN3ZXJzIHRoZW0gNDAzLlxuICogUmVwb3J0ZWQgdXBzdHJlYW0gZnJvbSAjMjAyOTsgdGhlIGRlbGV0ZSBiaXQgam9pbnMgdGhlIGdyYW50IHdoZW4gdGhlIGZpeCBpc1xuICogaW4gdGhlIHBpbm5lZCB2ZXJzaW9uIChBR0VOVFMubWQgXHUwMEE3MikuXG4gKi9cblxuZXhwb3J0IHsgQWNjb3VudCB9IGZyb20gJy4vYWNjb3VudC5vYmplY3QnO1xuZXhwb3J0IHsgQ29udGFjdCB9IGZyb20gJy4vY29udGFjdC5vYmplY3QnO1xuZXhwb3J0IHsgRXZlbnQgfSBmcm9tICcuL2V2ZW50Lm9iamVjdCc7XG5leHBvcnQgeyBFdmVudEF0dGVuZGVlIH0gZnJvbSAnLi9ldmVudF9hdHRlbmRlZS5vYmplY3QnO1xuZXhwb3J0IHsgRm9yZWNhc3QgfSBmcm9tICcuL2ZvcmVjYXN0Lm9iamVjdCc7XG5leHBvcnQgeyBMZWFkIH0gZnJvbSAnLi9sZWFkLm9iamVjdCc7XG5leHBvcnQgeyBPcHBvcnR1bml0eSB9IGZyb20gJy4vb3Bwb3J0dW5pdHkub2JqZWN0JztcbmV4cG9ydCB7IFRhc2sgfSBmcm9tICcuL3Rhc2sub2JqZWN0JztcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvYWNjb3VudC5vYmplY3QudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2FjY291bnQub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBPYmplY3RTY2hlbWEsIEZpZWxkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBGIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgSU5EVVNUUllfT1BUSU9OUyB9IGZyb20gJy4vX3BpY2tsaXN0cyc7XG5pbXBvcnQgeyBURVJSSVRPUllfT1BUSU9OUyB9IGZyb20gJy4vX3RlcnJpdG9yeSc7XG5cbmV4cG9ydCBjb25zdCBBY2NvdW50ID0gT2JqZWN0U2NoZW1hLmNyZWF0ZSh7XG4gIG5hbWU6ICdjcm1fYWNjb3VudCcsXG4gIGxhYmVsOiAnQWNjb3VudCcsXG4gIHBsdXJhbExhYmVsOiAnQWNjb3VudHMnLFxuICBpY29uOiAnYnVpbGRpbmcnLFxuICBkZXNjcmlwdGlvbjogJ0NvbXBhbmllcyBhbmQgb3JnYW5pemF0aW9ucyBkb2luZyBidXNpbmVzcyB3aXRoIHVzJyxcblxuICAvLyBBRFItMDA5MCBEMS9ENzogT1dEIGlzIGFuIGF1dGhvcmVkIGRlY2lzaW9uLiBPd25lciArIHNoYXJpbmcgcnVsZXMgKHRlYW0vdGVycml0b3J5IGdyYW50cyBiZWxvdykuXG4gIHNoYXJpbmdNb2RlbDogJ3ByaXZhdGUnLFxuICAvLyBBRFItMDA3OTogcmVuZGVyLW9ubHkgYHRpdGxlRm9ybWF0YCByZXRpcmVkIGluIGZhdm9yIG9mIGBuYW1lRmllbGRgLFxuICAvLyB3aGljaCBuYW1lcyBhIHJlYWwgZmllbGQuIFRoZSBmb3JtZXIgdGVtcGxhdGUgY29tcG9zZWQgdHdvIGxvY2FsIGZpZWxkcywgc29cbiAgLy8gYSBgZGlzcGxheV90aXRsZWAgZm9ybXVsYSBmaWVsZCByZXByb2R1Y2VzIGl0IGZvciB0aGUgcmVjb3JkIHRpdGxlLlxuICBuYW1lRmllbGQ6ICdkaXNwbGF5X3RpdGxlJyxcbiAgLy8gRXhwbGljaXQgc2VhcmNoIHRhcmdldHMgKEFEUi0wMDYxKS4gUkVRVUlSRUQgYmVjYXVzZSBuYW1lRmllbGQgaXMgYVxuICAvLyBGT1JNVUxBIChkaXNwbGF5X3RpdGxlL2Z1bGxfbmFtZSk6IHdpdGhvdXQgdGhpcywgJHNlYXJjaCBhdXRvLWRlZmF1bHRzIHRvXG4gIC8vIHRoZSBmb3JtdWxhIGZpZWxkLCB3aGljaCBpc24ndCBhIHJlYWwgY29sdW1uLCBzbyB0aGUgbG9va3VwIHBpY2tlciArIGdsb2JhbFxuICAvLyBzZWFyY2ggc2lsZW50bHkgcmV0dXJuIHplcm8uIFRoZXNlIGFyZSByZWFsLCBpbmRleGVkIGNvbHVtbnMuXG4gIHNlYXJjaGFibGVGaWVsZHM6IFsnbmFtZScsICdhY2NvdW50X251bWJlcicsICdyZWdpc3RyYXRpb25fbnVtYmVyJ10sXG4gIGhpZ2hsaWdodEZpZWxkczogWydhY2NvdW50X251bWJlcicsICduYW1lJywgJ3R5cGUnLCAnb3duZXJfaWQnXSxcbiAgLy8gVGhlIHJlY29yZCdzIHBpY3R1cmUgKCMxMTk5KTogdGhlIHJlY29yZCBjaHJvbWUgZHJhd3MgdGhlIGxvZ28gYmVzaWRlIHRoZVxuICAvLyB0aXRsZSBpbiBldmVyeSBhY2NvdW50IHBhZ2UgaGVhZGVyLiBObyBsb2dvLCBubyBwaWN0dXJlOiB0aGUgcGxhdGZvcm1cbiAgLy8gZHJhd3Mgbm8gcGxhY2Vob2xkZXIgb3IgaW5pdGlhbHMgaW4gaXRzIHBsYWNlLlxuICBpbWFnZUZpZWxkOiAnbG9nbycsXG5cbiAgLy8gRmllbGQgZ3JvdXBzIG9yZ2FuaXplIHRoZSBmb3JtIGxheW91dC4gQXJyYXkgb3JkZXIgPT0gZGlzcGxheSBvcmRlci5cbiAgLy8gRWFjaCBmaWVsZCBiZWxvdyBvcHRzIGluIHZpYSBgZ3JvdXA6ICc8a2V5PidgLlxuICBmaWVsZEdyb3VwczogW1xuICAgIHsga2V5OiAnYmFzaWMnLCAgICAgICAgbGFiZWw6ICdCYXNpYyBJbmZvcm1hdGlvbicsICBpY29uOiAnYnVpbGRpbmcnIH0sXG4gICAgeyBrZXk6ICdmaW5hbmNpYWxzJywgICBsYWJlbDogJ0ZpbmFuY2lhbHMnLCAgICAgICAgIGljb246ICdkb2xsYXItc2lnbicgfSxcbiAgICAvLyBSRVEtMDAwMyBhY2NlcHRhbmNlIDM6IHRoZSBidXNpbmVzcy1wcm9maWxlIGZpZWxkcyByZW5kZXIgYXMgdGhlaXIgb3duXG4gICAgLy8gZ3JvdXAgd2l0aCBOTyBgcmVjb3JkOmRldGFpbHNgIHNlY3Rpb24gYXV0aG9yZWQgYW55d2hlcmUgXHUyMDE0IHRoZSBkZXJpdmVkXG4gICAgLy8gbGF5b3V0IGxhZGRlcidzIHJ1bmcgMSAoQUdFTlRTLm1kOiBlc2NhcGUgaGF0Y2hlcyBhcmUgZm9yIGV4dHJlbWUgY2FzZXMpLlxuICAgIHsga2V5OiAnYnVzaW5lc3NfcHJvZmlsZScsIGxhYmVsOiAnQnVzaW5lc3MgUHJvZmlsZScsIGljb246ICdicmllZmNhc2UnIH0sXG4gICAgeyBrZXk6ICdjb250YWN0X2luZm8nLCBsYWJlbDogJ0NvbnRhY3QgSW5mb3JtYXRpb24nLCBpY29uOiAncGhvbmUnIH0sXG4gICAgeyBrZXk6ICdvd25lcnNoaXAnLCAgICBsYWJlbDogJ093bmVyc2hpcCAmIFN0YXR1cycsIGljb246ICd1c2VycycgfSxcbiAgICB7IGtleTogJ2JyYW5kaW5nJywgICAgIGxhYmVsOiAnQnJhbmRpbmcnLCAgICAgICAgICAgaWNvbjogJ3BhbGV0dGUnLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ3N5c3RlbScsICAgICAgIGxhYmVsOiAnU3lzdGVtJywgICAgICAgICAgICAgaWNvbjogJ3NldHRpbmdzJywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIE93bmVyc2hpcCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIGBvd25lcl9pZGAgaXMgdGhlIFBMQVRGT1JNIG93bmVyc2hpcCBhbmNob3IsIG5vdCBhbiBhcHAgaW52ZW50aW9uOiB0aGVcbiAgICAvLyByZWdpc3RyeSBpbmplY3RzIGV4YWN0bHkgdGhpcyBjb2x1bW4gaW50byBldmVyeSB1c2VyLW93bmVkIG9iamVjdFxuICAgIC8vIChgYXBwbHlTeXN0ZW1GaWVsZHNgKSwgYW5kIGl0IGlzIHRoZSBvbmUgT1dELCBzaGFyaW5nIHJ1bGVzLCBvd25lci1zY29wZVxuICAgIC8vIHdpZGVuaW5nIGFuZCB0aGUgYGlzX3ByaXZhdGVgIHJvdyBmaWx0ZXIgYWxsIHJlYWQuIFx1MjZENCBOZXZlciBhdXRob3IgYVxuICAgIC8vIFNFQ09ORCBgb3duZXJgIGxvb2t1cCBiZXNpZGUgaXQgXHUyMDE0IHJlYXNzaWduaW5nIHRoYXQgbW92ZXMgdGhlIHJlY29yZCBpblxuICAgIC8vIGV2ZXJ5IGxpc3QgYW5kIHJlcG9ydCBhbmQgbW92ZXMgbm8gYWNjZXNzIGF0IGFsbC5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBEZWNsYXJlZCByYXRoZXIgdGhhbiBsZWZ0IHRvIGluamVjdGlvbiwgd2hpY2ggdGhlIHBsYXRmb3JtIHN1cHBvcnRzXG4gICAgLy8gZXhwbGljaXRseSAoXCJhdXRob3ItZGVjbGFyZWQgZmllbGRzIHdpdGggdGhlIHNhbWUgbmFtZSBhbHdheXMgd2luIG92ZXJcbiAgICAvLyBpbmplY3Rpb24sIG5vIG92ZXJ3cml0ZVwiKS4gVGhyZWUgdGhpbmdzIG9ubHkgYSBkZWNsYXJhdGlvbiBidXlzOlxuICAgIC8vICAgXHUyMDIyIGBvcyB2YWxpZGF0ZWAgcmVzb2x2ZXMgaXQuIEFuIGluamVjdGVkIGNvbHVtbiBpcyBpbnZpc2libGUgdG8gZXZlcnlcbiAgICAvLyAgICAgYXV0aG9yLXRpbWUgcnVsZSwgc28gYGhpZ2hsaWdodEZpZWxkczogWydvd25lcl9pZCddYCBpcyByZXBvcnRlZCBhc1xuICAgIC8vICAgICBcIm5vdCBhIGZpZWxkIG9uIHRoaXMgb2JqZWN0IFx1MjAxNCBzaWxlbnRseSBza2lwcGVkIGJ5IGV2ZXJ5IGNvbnN1bWVyXCIsXG4gICAgLy8gICAgIGFuZCBhIENFTCBwcmVkaWNhdGUgcmVhZGluZyBgcmVjb3JkLm93bmVyX2lkYCBmYWlscyBvdXRyaWdodC5cbiAgICAvLyAgIFx1MjAyMiB0aGUgcGVyLW9iamVjdCBsYWJlbCBhbmQgYGdyb3VwYCBzdXJ2aXZlIChhbiBpbmplY3RlZCBmaWVsZCBjYXJyaWVzXG4gICAgLy8gICAgIHRoZSBnZW5lcmljIGxhYmVsIFwiT3duZXJcIiBhbmQgbm8gZ3JvdXAgYXQgYWxsKTtcbiAgICAvLyAgIFx1MjAyMiBgdHJhY2tIaXN0b3J5YCBzdXJ2aXZlcywgc28gYSB0cmFuc2ZlciBzdGlsbCByZW5kZXJzIG9uIHRoZSByZWNvcmRcbiAgICAvLyAgICAgdGltZWxpbmUgaW5zdGVhZCBvZiBvbmx5IGluIHRoZSBjb21wbGlhbmNlIGF1ZGl0IGxvZy5cbiAgICAvLyBgc3lzdGVtOiB0cnVlYCBrZWVwcyB0aGUgaW5qZWN0ZWQgbWFya2VyIHRoZSBwbGF0Zm9ybSdzIG93biB0b29saW5nXG4gICAgLy8gcmVhZHMgXHUyMDE0IG5vdGFibHkgdGhlIGNsb25lIHBhdGgsIHdoaWNoIHN0cmlwcyBzeXN0ZW0gY29sdW1ucyBzbyBhIGNvcHkgaXNcbiAgICAvLyBzdGFtcGVkIHRvIHRoZSBjbG9uZXIgcmF0aGVyIHRoYW4gaW5oZXJpdGluZyB0aGUgc291cmNlJ3Mgb3duZXIuXG4gICAgLy9cbiAgICAvLyBObyBgZGVmYXVsdFZhbHVlYDogdGhlIHNlY3VyaXR5IG1pZGRsZXdhcmUgc3RhbXBzIGBvd25lcl9pZGAgdG8gdGhlXG4gICAgLy8gYWN0aW5nIHVzZXIgb24gYW55IGluc2VydCB0aGF0IGxlYXZlcyBpdCBlbXB0eSwgYW5kIGRlbmllcyBvbmUgdGhhdCBuYW1lc1xuICAgIC8vIGFub3RoZXIgdXNlciB3aXRob3V0IGBhbGxvd1RyYW5zZmVyYCAoIzMwMDQpLiBUaGF0IGlzIHN0cm9uZ2VyIHRoYW4gYVxuICAgIC8vIGZpZWxkIGRlZmF1bHQsIHdoaWNoIGV2YWx1YXRlcyB0byBub3RoaW5nIG9uIGV2ZXJ5IHVzZXItbGVzcyB3cml0ZS5cbiAgICBvd25lcl9pZDogRmllbGQubG9va3VwKCdzeXNfdXNlcicsIHtcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBPd25lcicsXG4gICAgICBncm91cDogJ293bmVyc2hpcCcsXG4gICAgICBzeXN0ZW06IHRydWUsXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBBdXRvTnVtYmVyIGZpZWxkIC0gVW5pcXVlIGFjY291bnQgaWRlbnRpZmllclxuICAgIGFjY291bnRfbnVtYmVyOiBGaWVsZC5hdXRvbnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBOdW1iZXInLFxuICAgICAgZm9ybWF0OiAnQUNDLXswMDAwMDB9JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuXG4gICAgLy8gQmFzaWMgSW5mb3JtYXRpb25cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBgdW5pcXVlOiB0cnVlYCBpcyBkZWNsYXJlZCBIRVJFLCBvbiB0aGUgZmllbGQsIGFuZCBkZWxpYmVyYXRlbHkgTk9UIGFzXG4gICAgLy8gYSBgeyBmaWVsZHM6IFsnbmFtZSddLCB1bmlxdWU6IHRydWUgfWAgZW50cnkgaW4gYGluZGV4ZXNbXWAgYmVsb3cuIFRoZVxuICAgIC8vIGZpZWxkLWxldmVsIGZvcm0gaXMgdGVuYW50LXNjb3BlZCBcdTIwMTQgaXQgbWF0ZXJpYWxpemVzIGFzXG4gICAgLy8gYChvcmdhbml6YXRpb25faWQsIG5hbWUpYCwgdW5pcXVlIFdJVEhJTiBhbiBvcmdhbml6YXRpb24gXHUyMDE0IHdoaWxlIGFcbiAgICAvLyBkZWNsYXJlZCBpbmRleCBpcyB0YWtlbiB2ZXJiYXRpbSwgaS5lLiBwbGF0Zm9ybS13aWRlLiBUaGUgdGFibGUgZm9ybVxuICAgIC8vIG1lYW5zIHRoZSBTRUNPTkQgb3JnYW5pemF0aW9uIHRvIGNyZWF0ZSBhbiBcIkFjbWUgQ29ycFwiIGlzIHJlamVjdGVkIGJ5IHRoZVxuICAgIC8vIGRhdGFiYXNlLCBhbmQgYWNjb3VudCBuYW1lIGlzIGFsc28gdGhlIHNlZWQgZGF0YSdzIGV4dGVybmFsLWlkIC8gdXBzZXJ0XG4gICAgLy8ga2V5IChgc3JjL3NhbGVzL2RhdGEvc2FsZXMuc2VlZC50c2ApLCBzbyBpdCBiaXRlcyB0aGUgZmlyc3QgbXVsdGktdGVuYW50XG4gICAgLy8gaW5zdGFsbC4gVGhlIGNvbXBvc2l0ZSBhbHNvIGluZGV4ZXMgdGhlIGNvbHVtbiwgc28gbm8gc2VwYXJhdGVcbiAgICAvLyBgeyBmaWVsZHM6IFsnbmFtZSddIH1gIGVudHJ5IGlzIG5lZWRlZCBmb3IgdGhlIGBzZWFyY2hhYmxlRmllbGRzYCAvXG4gICAgLy8gc2VlZC11cHNlcnQgcmVhZCBwYXRocy5cbiAgICBuYW1lOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBOYW1lJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgdW5pcXVlOiB0cnVlLFxuICAgICAgbWF4TGVuZ3RoOiAyNTUsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIENhc2UtIGFuZCB3aGl0ZXNwYWNlLWZvbGRlZCBjb3B5IG9mIGBuYW1lYCBcdTIwMTQgdGhlIGtleSBsZWFkIGNvbnZlcnNpb25cbiAgICAgKiBtYXRjaGVzIGFjY291bnRzIG9uLlxuICAgICAqXG4gICAgICogIyMjIFdoeSBhIHN0b3JlZCBjb2x1bW4sIGFuZCBub3QgYW55IG9mIHRoZSBjaGVhcGVyIHNoYXBlc1xuICAgICAqXG4gICAgICogXHUyNkEwXHVGRTBGIFRocmVlIGNoZWFwZXIgZml4ZXMgYXJlIGFsbCBkZWFkIGVuZHMsIGFuZCBlYWNoIGlzIGEgbGl2ZSBwbGF0Zm9ybVxuICAgICAqIGNvbnN0cmFpbnQuIGB0ZXN0L2FjY291bnQtbmFtZS1ub3JtYWxpemVkLW1hdGNoLnRlc3QudHNgIHJlLW1lYXN1cmVzIGV2ZXJ5XG4gICAgICogb25lIHNvIHRoaXMgbm90ZSBjYW5ub3QgcXVpZXRseSBnbyBzdGFsZTpcbiAgICAgKlxuICAgICAqIC0gKipBIGZsb3cgY2Fubm90IG5vcm1hbGl6ZS4qKiBgc2VydmljZS1hdXRvbWF0aW9uYCdzIGByZXNvbHZlVG9rZW5gXG4gICAgICogICB1bmRlcnN0YW5kcyBleGFjdGx5IG9uZSBmdW5jdGlvbiBmb3JtLCBgL14oTk9XfFRPREFZKVxccypcXChcXHMqXFwpXHUyMDI2L2AuXG4gICAgICogICBge0xPV0VSKHgpfWAsIGB7VFJJTSh4KX1gIGFuZCBge3gudG9Mb3dlckNhc2UoKX1gIGFsbCByZXNvbHZlIHRvXG4gICAgICogICBgdW5kZWZpbmVkYCAoZXZlcnkgYmFyZSBpZGVudGlmaWVyIGlzIHN1YnN0aXR1dGVkIGJlZm9yZSB0aGUgZXhwcmVzc2lvblxuICAgICAqICAgaXMgZXZhbHVhdGVkLCBzbyBubyBzdHJpbmcgbWV0aG9kIGlzIHJlYWNoYWJsZSksIGFuZCBhbiB1bndyYXBwZWRcbiAgICAgKiAgIGBMT1dFUih7eH0pYCBpbnRlcnBvbGF0ZXMgbGl0ZXJhbGx5IHRvIGBcIkxPV0VSKEFjbWUgQ29ycClcImAuXG4gICAgICogLSAqKkEgZm9ybXVsYSBmaWVsZCBjYW5ub3QgYmUgdGhlIG1hdGNoIGtleS4qKiBgZHJpdmVyLXNxbGAnc1xuICAgICAqICAgYGZpZWxkSGFzQ29sdW1uYCByZXR1cm5zIGZhbHNlIGZvciBgdHlwZTogJ2Zvcm11bGEnYCwgc28gYSBjb21wdXRlZFxuICAgICAqICAgdmFsdWUgaGFzIG5vIHBoeXNpY2FsIGNvbHVtbiBhbmQgbm90aGluZyBjYW4gZmlsdGVyIG9uIGl0LlxuICAgICAqIC0gKipgJHJlZ2V4YCBpcyBub3QgYW4gYW5zd2VyLioqIE9uIGBkcml2ZXItc3FsYCBpdCBkb2VzIG5vdCBydW4gYXMgYVxuICAgICAqICAgcmVnZXggYXQgYWxsOiBpdCBjb21waWxlcyB0byBgTElLRSAnJXZhbHVlJSdgLCBhIFNVQlNUUklORyBtYXRjaCwgc29cbiAgICAgKiAgIGBcIkFjbWUgQ29ycFwiYCBhbHNvIG1hdGNoZXMgYFwiTm90IEFjbWUgQ29ycCBMdGRcImAuIEl0IGNhbm5vdCBjb2xsYXBzZVxuICAgICAqICAgaW50ZXJuYWwgd2hpdGVzcGFjZSwgdGhlIGxlYWRpbmcgd2lsZGNhcmQgZGVmZWF0cyB0aGUgaW5kZXgsIGFuZCBvbiB0aGVcbiAgICAgKiAgIGluLW1lbW9yeSBkcml2ZXIgaXQgZG9lcyBjb21waWxlIHVzZXItY29udHJvbGxlZCB0ZXh0IGludG8gYSBgUmVnRXhwYC5cbiAgICAgKlxuICAgICAqIFNvIHRoZSBjYW5vbmljYWwgZm9ybSBpcyBlc3RhYmxpc2hlZCBieSB0aGUgUFJPRFVDRVIgYXQgd3JpdGUgdGltZSBcdTIwMTQgdGhlXG4gICAgICogc2FtZSBkb2N0cmluZSBgY3JtX2xlYWQuZW1haWxgIC8gYGNybV9jb250YWN0LmVtYWlsYCBmb2xsb3cgXHUyMDE0IGFuZCB0aGVcbiAgICAgKiByZWFkZXIgZG9lcyBhIHBsYWluLCBpbmRleGVkIGVxdWFsaXR5IG1hdGNoLiBUaGUgb3RoZXIgc2lkZSBvZiB0aGF0XG4gICAgICogY29tcGFyaXNvbiBpcyBgY3JtX2xlYWQuY29tcGFueV9ub3JtYWxpemVkYCwgd2hpY2ggZXhpc3RzIGZvciB0aGUgc2FtZVxuICAgICAqIHJlYXNvbjogYSBmbG93IGNhbiBjb21wYXJlIHR3byBzdG9yZWQgY29sdW1ucywgaXQgY2Fubm90IGNvbXB1dGUgZWl0aGVyLlxuICAgICAqXG4gICAgICogIyMjIFdoYXQgaXQgaG9sZHNcbiAgICAgKlxuICAgICAqIGBuYW1lYCwgdHJpbW1lZCwgbG93ZXItY2FzZWQsIHdpdGggcnVucyBvZiBpbnRlcm5hbCB3aGl0ZXNwYWNlIGNvbGxhcHNlZFxuICAgICAqIHRvIG9uZSBzcGFjZS4gTm90aGluZyBlbHNlIFx1MjAxNCBub3JtYWxpemUtdGhlbi1FWEFDVC4gRnV6enkgbWF0Y2hpbmdcbiAgICAgKiAocHVuY3R1YXRpb24gZm9sZGluZywgbGVnYWwtc3VmZml4IHN0cmlwcGluZywgZWRpdCBkaXN0YW5jZSkgaXNcbiAgICAgKiBkZWxpYmVyYXRlbHkgb3V0IG9mIHNjb3BlOyBpdCB0dXJucyBhIGxvb2t1cCBpbnRvIGEgcmFua2luZyBwcm9ibGVtIGFuZFxuICAgICAqIG5lZWRzIGEgaHVtYW4gcmV2aWV3IGFmZm9yZGFuY2UgdGhpcyBhcHAgZG9lcyBub3QgaGF2ZS5cbiAgICAgKlxuICAgICAqIERlcml2ZWQsIG5ldmVyIGF1dGhvcmVkOiBgYWNjb3VudC5ob29rLnRzYCByZWNvbXB1dGVzIGl0IG9uIGV2ZXJ5IHdyaXRlXG4gICAgICogdGhhdCBjYXJyaWVzIGBuYW1lYCwgYW5kIGxlYXZlcyBpdCBhbG9uZSBvdGhlcndpc2UuIGByZWFkb25seWAga2VlcHNcbiAgICAgKiB1c2VyL0FQSSB3cml0ZXMgb2ZmIGl0IChJTlNFUlQgaXMgZXhlbXB0IGZyb20gdGhlIHN0cmlwIGFuZCBVUERBVEUgc3RyaXBzXG4gICAgICogb25seSBDQUxMRVItc3VwcGxpZWQga2V5cywgc28gdGhlIGhvb2sncyBvd24gd3JpdGUgYWx3YXlzIHN1cnZpdmVzKTtcbiAgICAgKiBgaGlkZGVuYCBrZWVwcyBhIG1hY2hpbmUtb3duZWQgY29sdW1uIG91dCBvZiBmb3JtcyBhbmQgcGlja2VycyBcdTIwMTQgdGhlIHNhbWVcbiAgICAgKiBwYWlyaW5nIGBjcm1fZm9yZWNhc3Quc2VlZF9rZXlgIHVzZXMuXG4gICAgICovXG4gICAgbmFtZV9ub3JtYWxpemVkOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBOYW1lIChOb3JtYWxpemVkKScsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ01hdGNoIGtleSBmb3IgbGVhZCBjb252ZXJzaW9uOiBBY2NvdW50IE5hbWUgbG93ZXItY2FzZWQsIHRyaW1tZWQsIHdpdGggaW50ZXJuYWwgd2hpdGVzcGFjZSBjb2xsYXBzZWQuIE1haW50YWluZWQgYnkgdGhlIGFjY291bnRfcHJvdGVjdGlvbiBob29rIFx1MjAxNCBuZXZlciBlZGl0IGRpcmVjdGx5LicsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICAgIG1heExlbmd0aDogMjU1LFxuICAgICAgZ3JvdXA6ICdzeXN0ZW0nLFxuICAgIH0pLFxuXG4gICAgLy8gQURSLTAwNzkgcmVjb3JkIHRpdGxlICh3YXMgdGl0bGVGb3JtYXQgJ3thY2NvdW50X251bWJlcn0gLSB7bmFtZX0nKS5cbiAgICBkaXNwbGF5X3RpdGxlOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnRGlzcGxheSBUaXRsZScsXG4gICAgICBleHByZXNzaW9uOiBGYHJlY29yZC5hY2NvdW50X251bWJlciArIFwiIC0gXCIgKyByZWNvcmQubmFtZWAsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydHkncyByZWdpc3RlcmVkIGlkZW50aXR5IGluIGEgZ292ZXJubWVudCByZWdpc3RyeS5cbiAgICAgKlxuICAgICAqIFx1MjZENCBOT1QgbmFtZWQgYWZ0ZXIgb25lIGNvdW50cnkncyByZWdpc3RyeSwgYW5kIHRoYXQgaXMgdGhlIHdob2xlIGRlc2lnblxuICAgICAqIGNvbnN0cmFpbnQgKFJFUS0wMDAzICpEaXNwb3NpdGlvbiAmIHJhdGlvbmFsZSopLiBUaGUgcmVxdWlyZW1lbnQgYXJyaXZlZFxuICAgICAqIGFzIFx1NzkzRVx1NEYxQVx1NEZFMVx1NzUyOFx1NEVFM1x1NzgwMSBiZWNhdXNlIHRoZSBjdXN0b21lciByZWdpc3RlcnMgaW4gQ2hpbmE7IGEgSmFwYW5lc2UgaW5zdGFsbFxuICAgICAqIHdyaXRlcyBcdTZDRDVcdTRFQkFcdTc1NkFcdTUzRjcgaGVyZSwgYSBHZXJtYW4gb25lIGEgSGFuZGVsc3JlZ2lzdGVybnVtbWVyLCBhIFVTIG9uZSBhblxuICAgICAqIEVJTi4gQSBgdW5pZmllZF9zb2NpYWxfY3JlZGl0X2NvZGVgIGZpZWxkIHdvdWxkIGNhcnJ5IG9uZSBjb3VudHJ5J3NcbiAgICAgKiByZWdpc3RyeSBpbiBpdHMgTkFNRSwgd2hlcmUgbm8gaW5zdGFsbCBjYW4gcmVuYW1lIGl0IFx1MjAxNCBzbyB0aGUgY29yZSBmaWVsZFxuICAgICAqIGlzIGdlbmVyaWMgYW5kIHRoZSByZWdpc3RyeSBpdCBjYW1lIGZyb20gaXMgdGhlIGluc3RhbGwncyBvd24ga25vd2xlZGdlLlxuICAgICAqXG4gICAgICogXHUyNkEwXHVGRTBGIERpc3RpbmN0IGZyb20gYGFjY291bnRfbnVtYmVyYCBhYm92ZSwgd2hpY2ggaXMgT1VSIHNlcXVlbmNlXG4gICAgICogKGBGaWVsZC5hdXRvbnVtYmVyYCwgYEFDQy17MDAwMDAwfWApIGFuZCBhbHJlYWR5IHNwZW50IGFzIGhhbGYgdGhlIHJlY29yZFxuICAgICAqIHRpdGxlLiBUaGF0IGlzIGFuIGlkZW50aWZpZXIgd2UgaXNzdWU7IHRoaXMgaXMgb25lIHdlIHdlcmUgZ2l2ZW4sIGFuZFxuICAgICAqIGludm9pY2luZywgY3JlZGl0IGNoZWNrcyBhbmQgZW50aXR5IHJlc29sdXRpb24ga2V5IG9uIHRoZSBsYXR0ZXIuXG4gICAgICpcbiAgICAgKiBgc2VhcmNoYWJsZWAgKyB0aGUgYHNlYXJjaGFibGVGaWVsZHNgIGVudHJ5IGFib3ZlIGlzIFJFUS0wMDAzIGFjY2VwdGFuY2VcbiAgICAgKiAxIFx1MjAxNCB0aGUgdmFsdWUgaXMgZmluZGFibGUgZnJvbSBnbG9iYWwgc2VhcmNoIGFuZCB0aGUgbG9va3VwIHBpY2tlci4gSXQgaXNcbiAgICAgKiBpbmRleGVkIGJlbG93IGZvciB0aGF0IHJlYWQgcGF0aC5cbiAgICAgKlxuICAgICAqIFx1MjZENCBOT1QgYHVuaXF1ZTogdHJ1ZWAuIFJlZnVzaW5nIGEgc2F2ZSBiZWNhdXNlIHR3byByb3dzIGNhcnJ5IHRoZSBzYW1lXG4gICAgICogcmVnaXN0ZXJlZCBpZGVudGl0eSBpcyBhIGRhdGEtcXVhbGl0eSBQT0xJQ1ksIGFuZCB0aGlzIHJlcG8gaGFzIGFscmVhZHlcbiAgICAgKiBjaG9zZW4gdGhlIHNvZnQgc2hhcGUgZm9yIHRoYXQgcXVlc3Rpb24gb25jZSBcdTIwMTQgdGhlIGhhcmQgdW5pcXVlIG9uXG4gICAgICogYGNybV9sZWFkLmVtYWlsYCB3YXMgcmVtb3ZlZCBiZWNhdXNlIHJlZnVzaW5nIGEgcmVwZWF0IGlzIHdvcnNlIHRoYW5cbiAgICAgKiByZWNvcmRpbmcgaXQuIFRoZSBzYW1lIHJlYXNvbmluZyBgbmFtZV9ub3JtYWxpemVkYCByZWNvcmRzOiBhIG1hdGNoIGtleSxcbiAgICAgKiBub3QgYSBwb2xpY3kuIERlZHVwbGljYXRpb24gaXMgYSByZXZpZXcgYWZmb3JkYW5jZSB0aGlzIGFwcCBkb2VzIG5vdCBoYXZlLlxuICAgICAqL1xuICAgIHJlZ2lzdHJhdGlvbl9udW1iZXI6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdSZWdpc3RyYXRpb24gTnVtYmVyJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlRoZSBjb3VudGVycGFydHkncyByZWdpc3RlcmVkIGlkZW50aXR5IGFzIGlzc3VlZCBieSBpdHMgb3duIGdvdmVybm1lbnQgcmVnaXN0cnkgXHUyMDE0IHdoaWNoZXZlciByZWdpc3RyeSB0aGF0IGlzLiBOb3QgdGhlIEFjY291bnQgTnVtYmVyLCB3aGljaCB3ZSBpc3N1ZS5cIixcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBtYXhMZW5ndGg6IDY0LFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICAvKipcbiAgICAgKiBXaGF0IHRoaXMgYWNjb3VudCBtYXkgYmUgdXNlZCBmb3IgY29tbWVyY2lhbGx5IFx1MjAxNCB0aGUgY2F0ZWdvcnkgdGhhdCBHQVRFU1xuICAgICAqIGNhcGFiaWxpdHkgcmF0aGVyIHRoYW4gbWVyZWx5IGNsYXNzaWZ5aW5nIChSRVEtMDAwMywgdGhlIHJlY29yZCdzIG1vc3RcbiAgICAgKiB2YWx1YWJsZSBwcmltaXRpdmU6ICpzb21lIGNvdW50ZXJwYXJ0aWVzIGFyZSBwYXlhYmxlIGJ1dCBub3Qgc2VsbGFibGUqKS5cbiAgICAgKlxuICAgICAqICMjIFdoeSBhIGZpZWxkIEJFU0lERSBgdHlwZWAsIGFuZCBub3QgZm91ciBtb3JlIG9wdGlvbnMgb24gaXRcbiAgICAgKlxuICAgICAqIFJFUS0wMDAzIGxlYXZlcyB0aGlzIG9wZW4gKFwiZWl0aGVyIG5ldyBvcHRpb25zIG9uIGB0eXBlYCBvciBhIGZpZWxkXG4gICAgICogYmVzaWRlIGl0LCBkZWNpZGVkIHdoZW4gYnVpbHRcIikuIEl0IGlzIGEgc2VwYXJhdGUgZmllbGQgYmVjYXVzZSBgdHlwZWBcbiAgICAgKiBpcyBhIFJFTEFUSU9OU0hJUC1TVEFHRSBheGlzIFx1MjAxNCBwcm9zcGVjdCBcdTIxOTIgY3VzdG9tZXIgXHUyMTkyIGZvcm1lciwgcGx1c1xuICAgICAqIHBhcnRuZXIgXHUyMDE0IGFuZCBpdCBhbHJlYWR5IGhhcyB0d28gcmVhZGVycyB0aGF0IHdvdWxkIGJlIGJyb2tlbiBieSBhIHZhbHVlXG4gICAgICogbWVhbmluZyBcIm1heSBub3QgYmUgc29sZCB0b1wiOiBgYWNjb3VudC5ob29rLnRzYCBwcm9tb3RlcyBvbiBpdCwgYW5kXG4gICAgICogYG9wcG9ydHVuaXR5Lmhvb2sudHNgIGZsaXBzIGEgd29uIGRlYWwncyBhY2NvdW50IHRvIGBjdXN0b21lcmAuIEFuXG4gICAgICogYGFnZW5jeWAgb3B0aW9uIG9uIGB0eXBlYCB3b3VsZCB0aGVyZWZvcmUgYmUgb3ZlcndyaXR0ZW4gaW50byBgY3VzdG9tZXJgXG4gICAgICogYnkgdGhlIGZpcnN0IHdvbiBkZWFsIGJvb2tlZCBhZ2FpbnN0IGl0LCBzaWxlbnRseSB1bi1yZXN0cmljdGluZyB0aGVcbiAgICAgKiBhY2NvdW50LiBUaGUgdHdvIGF4ZXMgYXJlIGluZGVwZW5kZW50IFx1MjAxNCBhbiBhZ2VuY3kgY2FuIGJlIGEgcHJvc3BlY3QsIGFcbiAgICAgKiBjdXN0b21lciBvciBhIGZvcm1lciBjdXN0b21lciBcdTIwMTQgc28gdGhleSBhcmUgdHdvIGZpZWxkcy5cbiAgICAgKlxuICAgICAqICMjIEdlbmVyaWMgdmFsdWVzIG9ubHlcbiAgICAgKlxuICAgICAqIFJFUS0wMDAzIHJ1bGVzIHRoZSBjdXN0b21lcidzIG93biB2b2NhYnVsYXJ5IChcdTYyREJcdTY4MDdcdTRFRTNcdTc0MDZcdTUxNkNcdTUzRjggXHUyMDI2KSAqKkMqKjpcbiAgICAgKiBvdmVybGF5IGNvbmZpZ3VyYXRpb24sIFx1MjZENCBuZXZlciBjb21taXR0ZWQgaW50byBjb3JlLiBDb3JlIHNoaXBzIHRoZVxuICAgICAqIGNhcGFiaWxpdHkgZGlzdGluY3Rpb24gaXRzZWxmOyBhbiBpbnN0YWxsIG1hcHMgaXRzIG1hcmtldCdzIGNhdGVnb3JpZXNcbiAgICAgKiBvbnRvIHRoZXNlIHR3byB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAjIyBXaGF0IHJlYWRzIGl0OiBgb3Bwb3J0dW5pdHkuaG9vay50c2AgYGJlZm9yZUluc2VydGBcbiAgICAgKlxuICAgICAqIFJFUS0wMDAzIGlzIGV4cGxpY2l0IHRoYXQgXCJhIGNhdGVnb3J5IG5vIHJ1bGUgcmVhZHMgaXMgcHJvc2UsIGFuZCB0aGVcbiAgICAgKiBydWxlIGlzIHRoZSBwb2ludFwiLCBzbyB0aGlzIGZpZWxkIHNoaXBzIFdJVEggaXRzIHJlYWRlci4gVGhlIHJlYWRlciBpcyBhXG4gICAgICogaG9vaywgYW5kIHdoaWNoIGNvbnN0cnVjdCBjYXJyaWVzIHRoZSBnYXRlIGlzIGEgbWFpbnRhaW5lciBydWxpbmdcbiAgICAgKiAoMjAyNi0wOS0xNiksIHF1b3RlZCB2ZXJiYXRpbSBhbmQga2VwdCB1bnRyYW5zbGF0ZWQ6XG4gICAgICpcbiAgICAgKiAgIFx1MzAwQ1x1OTVGOFx1OTVFOFx1OEQ3MCBgb3Bwb3J0dW5pdHkuaG9vay50c2AgXHU3Njg0IGBiZWZvcmVJbnNlcnRgXHVGRjBDXHU3NTI4IGhvb2sgXHU3Njg0IGBjdHguYXBpYCBcdThCRkJcdTVCQTJcdTYyMzdcdTdDN0JcdTUyMkJcdTMwMDJcbiAgICAgKiAgICBSRVEtMDAwMyBcdTdCMkMgMTI4IFx1ODg0Q1x1NzY4NCBgdmFsaWRhdGlvbnNbXWAgXHU0RTBFXHU4QkU1XHU4QkIwXHU1RjU1XHU4MUVBXHU1REYxXHU3Njg0XHU5QThDXHU2NTM2XHU3QjJDIDIgXHU2NzYxXHU1MUIyXHU3QTgxXHVGRjBDXHU0RUU1XHU5QThDXHU2NTM2XHU0RTNBXHU1MUM2XHUzMDAyXHUzMDBEXG4gICAgICpcbiAgICAgKiBcdTI2RDQgRG8gTk9UIHJlc3RhdGUgdGhlIGdhdGUgYXMgdGhlIGB2YWxpZGF0aW9uc1tdYCBlbnRyeSBSRVEtMDAwMyBsaW5lXG4gICAgICogMTI4IG5hbWVzLiBUV08gaW5kZXBlbmRlbnQgbWVhc3VyZW1lbnRzIHNheSBpdCBjYW5ub3QgYmUgdGhhdCwgYW5kIGJvdGhcbiAgICAgKiBhcmUgcmVjb3JkZWQgaGVyZSBiZWNhdXNlIGVhY2ggYWxvbmUgd291bGQgYmUgdGFsa2VkIHBhc3Q6XG4gICAgICpcbiAgICAgKiAgIDEuICoqSXQgd291bGQgYnJpY2sgaGlzdG9yeS4qKiBBIHZhbGlkYXRpb24gaXMgZXZhbHVhdGVkIGFnYWluc3RcbiAgICAgKiAgICAgIGB7Li4ucHJldmlvdXMsIC4uLmRhdGF9YCBvbiBFVkVSWSB3cml0ZSwgc28gXCJhbHJlYWR5IGxpbmtlZCB0byBhXG4gICAgICogICAgICByZXN0cmljdGVkIGFjY291bnRcIiBhbmQgXCJsaW5raW5nIG5vd1wiIGFyZSB0aGUgc2FtZSBzdGF0ZSBhbmQgZXZlcnlcbiAgICAgKiAgICAgIGxhdGVyIGVkaXQgdG8gZXZlcnkgaGlzdG9yaWNhbCBvcHBvcnR1bml0eSB3b3VsZCBiZSByZWZ1c2VkIFx1MjAxNCB0aGVcbiAgICAgKiAgICAgIGV4YWN0IHRoaW5nIFJFUS0wMDAzIGFjY2VwdGFuY2UgMiBmb3JiaWRzIChcIm9wcG9ydHVuaXRpZXMgdGhhdFxuICAgICAqICAgICAgYWxyZWFkeSBwb2ludCBhdCBpdCBrZWVwIHdvcmtpbmcgYW5kIGtlZXAgYmVpbmcgZWRpdGFibGVcIikuXG4gICAgICogICAgICBgbGVhZC5ob29rLnRzYCBjYXJyaWVzIHRoZSBzYW1lIGZpbmRpbmcgZm9yIGl0cyBvd24gZ2F0ZS5cbiAgICAgKiAgIDIuICoqSXQgY2Fubm90IHJlYWQgdGhlIGFjY291bnQgYXQgYWxsLioqIEEgcHJlZGljYXRlIGlzIGV2YWx1YXRlZCBieVxuICAgICAqICAgICAgYGNoZWNrUHJlZGljYXRlKHJ1bGUsIG1lcmdlZCwgcHJldmlvdXMpYCBvdmVyIHBsYWluIGRhdGEgb2JqZWN0cyBcdTIwMTRcbiAgICAgKiAgICAgIHRoZSBvcHBvcnR1bml0eSdzIE9XTiBzdG9yZWQgY29sdW1ucy4gYHJlY29yZC5jcm1fYWNjb3VudC50eXBlYFxuICAgICAqICAgICAgZG9lcyBub3QgdHJhdmVyc2UgdGhlIGxvb2t1cCAobWVhc3VyZWQ6IGBydW50aW1lOiBObyBzdWNoIGtleTpcbiAgICAgKiAgICAgIHR5cGVgKSwgYW5kIGBvcy5sb29rdXAoLi4uKWAgaGFzIG5vIG92ZXJsb2FkIGJlY2F1c2UgYGJ1aWxkU2NvcGUoKWBcbiAgICAgKiAgICAgIGluIGBAb2JqZWN0c3RhY2svZm9ybXVsYWAgY29tcG9zZXMgYG9zYCBmcm9tIG9ubHkgYGN0eC51c2VyYCAvXG4gICAgICogICAgICBgY3R4Lm9yZ2AgLyBgY3R4LmVudmAgYW5kIG5ldmVyIGJpbmRzIGBjdHguYXBpYCAobWVhc3VyZWQ6XG4gICAgICogICAgICBgcnVudGltZTogZm91bmQgbm8gbWF0Y2hpbmcgb3ZlcmxvYWQgZm9yICdkeW4ubG9va3VwKHN0cmluZyxcbiAgICAgKiAgICAgIGR5biknYDsgZmlsZWQgdXBzdHJlYW0gYXMgb2JqZWN0c3RhY2sjMTgzMTgpLiBBbiB1bmV2YWx1YWJsZVxuICAgICAqICAgICAgcHJlZGljYXRlIFJFSkVDVFMgVEhFIFdSSVRFLCBzbyBhdXRob3JpbmcgaXQgbGl0ZXJhbGx5IHJlZnVzZXNcbiAgICAgKiAgICAgIGV2ZXJ5IG9wcG9ydHVuaXR5IHdyaXRlLCBpbnNlcnQgYW5kIHVwZGF0ZSBhbGlrZS5cbiAgICAgKlxuICAgICAqIFx1MjZBMFx1RkUwRiBUaGUgaG9vaydzIGBjdHguYXBpYCBpcyBhIERJRkZFUkVOVCBzdXJmYWNlIGZyb20gdGhlIGZvcm11bGFcbiAgICAgKiBgRXZhbENvbnRleHQuYXBpYCB0aGF0IG1lYXN1cmVtZW50IDIgaXMgYWJvdXQsIGFuZCB0aGUgdHdvIGFyZSByb3V0aW5lbHlcbiAgICAgKiBjb25mdXNlZC4gVGhlIGhvb2sgb25lIGlzIGxpdmUgYW5kIHVzZWQgfjIwIHRpbWVzIGFjcm9zc1xuICAgICAqIGBzcmMvc2FsZXMvb2JqZWN0cy8qLmhvb2sudHNgOyBpdHMgc2hhcGUgaXMgYC4vX2hvb2stYXBpLnRzYCwgcGlubmVkXG4gICAgICogYWdhaW5zdCBhIHJlYWwgZW5naW5lIGJ5IGB0ZXN0L2hvb2stcXVlcnktcHJlZGljYXRlLnRlc3QudHNgIGFuZFxuICAgICAqIGB0ZXN0L2hvb2std3JpdGUtc2hhcGUudGVzdC50c2AuIG9iamVjdHN0YWNrIzE4MzE4IGRvZXMgbm90IGJsb2NrIHRoaXNcbiAgICAgKiBmaWVsZC5cbiAgICAgKlxuICAgICAqIFx1MjZENCBEbyBOT1QgXCJmaXhcIiBhbnl0aGluZyBoZXJlIGJ5IGRlbm9ybWFsaXNpbmcgdGhpcyB2YWx1ZSBvbnRvXG4gICAgICogYGNybV9vcHBvcnR1bml0eWA6IGEgY29weSBuZWVkcyBhIHdyaXRlciBhbmQgZ29lcyBzdGFsZSB0aGUgbW9tZW50IGFuXG4gICAgICogYWNjb3VudCBpcyByZWNsYXNzaWZpZWQsIGFuZCBhbnl0aGluZyBhYmxlIHRvIHdyaXRlIHRoZSBjb3B5IGlzIGFibGUgdG9cbiAgICAgKiBzaW1wbHkgcmVmdXNlLlxuICAgICAqL1xuICAgIGNvbW1lcmNpYWxfY2FwYWJpbGl0eTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnQ29tbWVyY2lhbCBDYXBhYmlsaXR5JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdXaGV0aGVyIG5ldyBidXNpbmVzcyBtYXkgYmUgb3BlbmVkIGFnYWluc3QgdGhpcyBhY2NvdW50LiBTZXR0bGVtZW50IE9ubHkgYWNjb3VudHMgc3RheSBmdWxseSB1c2FibGUgZm9yIGJpbGxpbmcgYW5kIHBheW1lbnQsIGJ1dCBubyBuZXcgb3Bwb3J0dW5pdHkgbWF5IGJlIGxpbmtlZCB0byB0aGVtLicsXG4gICAgICBkZWZhdWx0VmFsdWU6ICdmdWxsJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0Z1bGwnLCB2YWx1ZTogJ2Z1bGwnLCBjb2xvcjogJyMwMEFBMDAnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTZXR0bGVtZW50IE9ubHknLCB2YWx1ZTogJ3NldHRsZW1lbnRfb25seScsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICAvLyBTZWxlY3QgZmllbGRzIHdpdGggY3VzdG9tIG9wdGlvbnNcbiAgICB0eXBlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdBY2NvdW50IFR5cGUnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdQcm9zcGVjdCcsIHZhbHVlOiAncHJvc3BlY3QnLCBjb2xvcjogJyNGRkE1MDAnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDdXN0b21lcicsIHZhbHVlOiAnY3VzdG9tZXInLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQYXJ0bmVyJywgdmFsdWU6ICdwYXJ0bmVyJywgY29sb3I6ICcjMDAwMEZGJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRm9ybWVyIEN1c3RvbWVyJywgdmFsdWU6ICdmb3JtZXInLCBjb2xvcjogJyM5OTk5OTknIH0sXG4gICAgICBdXG4gICAgfSksXG5cbiAgICBpbmR1c3RyeTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnSW5kdXN0cnknLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICAvLyBDYW5vbmljYWwgc2V0IHNoYXJlZCB3aXRoIExlYWQgKCM0OTApOiBsZWFkX2NvbnZlcnNpb24gY29waWVzXG4gICAgICAvLyBgbGVhZFJlY29yZC5pbmR1c3RyeWAgb250byB0aGUgYWNjb3VudCBpdCBjcmVhdGVzLCBzbyB0aGlzIG11c3RcbiAgICAgIC8vIGFjY2VwdCBldmVyeSBMZWFkIHZhbHVlLlxuICAgICAgb3B0aW9uczogWy4uLklORFVTVFJZX09QVElPTlNdLFxuICAgIH0pLFxuXG4gICAgZGVzY3JpcHRpb246IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGxhYmVsOiAnRGVzY3JpcHRpb24nLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICAvLyBOdW1iZXIgZmllbGRzXG4gICAgYW5udWFsX3JldmVudWU6IEZpZWxkLmN1cnJlbmN5KHtcbiAgICAgIGxhYmVsOiAnQW5udWFsIFJldmVudWUnLFxuICAgICAgbWluOiAwLFxuICAgICAgZ3JvdXA6ICdmaW5hbmNpYWxzJyxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIC8qKlxuICAgICAqIFJvbGxlZC11cCBhbm51YWwgcmV2ZW51ZSBvZiB0aGlzIGFjY291bnQncyBkaXJlY3QgY2hpbGRyZW4uXG4gICAgICpcbiAgICAgKiBcdTI2QTBcdUZFMEYgRElSRUNUIGNoaWxkcmVuIG9ubHksIG9uZSBsZXZlbCBcdTIwMTQgdGhlIGVuZ2luZSBhZ2dyZWdhdGVzIG92ZXIgdGhlIHJvd3NcbiAgICAgKiB3aG9zZSBgcGFyZW50X2FjY291bnRgIGlzIHRoaXMgYWNjb3VudCwgbm90IG92ZXIgYSB0cmFuc2l0aXZlIGNsb3N1cmUuIEFcbiAgICAgKiBncmFuZHBhcmVudCBzaG93cyB0aGUgc3VtIG9mIGl0cyBvd24gY2hpbGRyZW4sIGFuZCB0aGUgZG9jcyBzYXkgc287XG4gICAgICogYW55dGhpbmcgZWxzZSBuZWVkcyBhIGRpZmZlcmVudCAoYW5kIG11Y2ggbW9yZSBleHBlbnNpdmUpIHByaW1pdGl2ZSB0aGFuXG4gICAgICogdGhlIG9uZSB0aGUgcGxhdGZvcm0gc2hpcHMuXG4gICAgICpcbiAgICAgKiBTZWxmLXJlZmVyZW5jaW5nIHJvbGwtdXBzIGFyZSB3b3J0aCBtZWFzdXJpbmcgcmF0aGVyIHRoYW4gYXNzdW1pbmcsXG4gICAgICogYmVjYXVzZSBwYXJlbnQgYW5kIGNoaWxkIGFyZSB0aGUgc2FtZSBvYmplY3QgYW5kIHRoZSBlbmdpbmUncyBzdW1tYXJ5XG4gICAgICogaW5kZXggaXMga2V5ZWQgYnkgY2hpbGQgb2JqZWN0LiBgdGVzdC9kZWNvcmF0aXZlLWZpZWxkLXN3ZWVwLnRlc3QudHNgXG4gICAgICogZHJpdmVzIGFsbCBmb3VyIGxlZ3Mgb2YgdGhlIGxpZmVjeWNsZSAoaW5zZXJ0LCByYWlzZSwgcmUtcGFyZW50LCBkZWxldGUpXG4gICAgICogc28gYSBwbGF0Zm9ybSByZWdyZXNzaW9uIGNhbm5vdCBxdWlldGx5IHR1cm4gdGhpcyBiYWNrIGludG8gZGVjb3JhdGlvbi5cbiAgICAgKi9cbiAgICBjaGlsZF9hY2NvdW50X3JldmVudWU6IEZpZWxkLnN1bW1hcnkoe1xuICAgICAgbGFiZWw6ICdDaGlsZCBBY2NvdW50IFJldmVudWUnLFxuICAgICAgZ3JvdXA6ICdmaW5hbmNpYWxzJyxcbiAgICAgIHNjYWxlOiAyLFxuICAgICAgc3VtbWFyeU9wZXJhdGlvbnM6IHtcbiAgICAgICAgb2JqZWN0OiAnY3JtX2FjY291bnQnLFxuICAgICAgICBmaWVsZDogJ2FubnVhbF9yZXZlbnVlJyxcbiAgICAgICAgZnVuY3Rpb246ICdzdW0nLFxuICAgICAgICByZWxhdGlvbnNoaXBGaWVsZDogJ3BhcmVudF9hY2NvdW50JyxcbiAgICAgIH0sXG4gICAgfSksXG5cbiAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiBGaWVsZC5udW1iZXIoe1xuICAgICAgbGFiZWw6ICdFbXBsb3llZXMnLFxuICAgICAgbWluOiAwLFxuICAgICAgZ3JvdXA6ICdmaW5hbmNpYWxzJyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBCdXNpbmVzcyBwcm9maWxlIChSRVEtMDAwMyBzdGVwIDMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gR2VuZXJpYyBCMkIgc2FsZXMgaW50ZWxsaWdlbmNlLCBub3QgSVQtc2VydmljZXMgdm9jYWJ1bGFyeTogd2hvIGhvbGRzIHRoZVxuICAgIC8vIGFjY291bnQgdG9kYXksIGhvdyBtdWNoIHRoZXJlIGlzIHRvIHdpbiB0aGlzIHllYXIsIGFuZCBob3cgdGhleSBwYXkuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgYGFubnVhbF9yZXZlbnVlYCBhYm92ZSBhbnN3ZXJzIG5vbmUgb2YgdGhlc2UgXHUyMDE0IGl0IGlzIHRoZSBhY2NvdW50J3MgT1dOXG4gICAgLy8gdHVybm92ZXIsIHdoYXQgdGhlIGNvdW50ZXJwYXJ0eSBlYXJucywgd2hlcmVhcyB0aGUgYnVkZ2V0IGJlbG93IGlzIHdoYXRcbiAgICAvLyBpdCB3aWxsIFNQRU5EIHdpdGggdmVuZG9ycy4gUmV1c2luZyBvbmUgZm9yIHRoZSBvdGhlciBpcyB0aGUgbWlzdGFrZSB0aGlzXG4gICAgLy8gZ3JvdXAgZXhpc3RzIHRvIHByZXZlbnQuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgYHBucG0gdmFsaWRhdGVgIHJlcG9ydHMgYWxsIHRocmVlIGFzIFwiY2Fycmllci1vbmx5IFx1MjAxNCBkZWNsYXJlZCBidXRcbiAgICAvLyBub3RoaW5nIGluIHRoaXMgc3RhY2sgcmVhZHMgb3IgZGlzcGxheXMgaXRcIiwgYW5kIHRoYXQgcmVhZGluZyBpcyBFWFBFQ1RFRFxuICAgIC8vIGhlcmUgcmF0aGVyIHRoYW4gYSBkZWZlY3QgdG8gdGlkeSBhd2F5LiBUaGUgbGl2ZW5lc3MgZGlhZ25vc3RpYyBjb3VudHNcbiAgICAvLyB2aWV3IGNvbHVtbnMsIGZvcm0gc2VjdGlvbnMsIHBhZ2UgYmluZGluZ3MsIGZsb3cgbm9kZXMsIGZvcm11bGFzLCBob29rc1xuICAgIC8vIGFuZCBhY3Rpb25zIGFzIHNpdGVzOyBpdCBkb2VzIE5PVCBjb3VudCBgZmllbGRHcm91cHNgIG1lbWJlcnNoaXAsIHdoaWNoXG4gICAgLy8gaXMgcHJlY2lzZWx5IHRoZSBERVJJVkVEIGxheW91dCBSRVEtMDAwMyBhY2NlcHRhbmNlIDMgYXNrcyBmb3IgKFwicmVuZGVyXG4gICAgLy8gYXMgdGhlaXIgb3duIGdyb3VwIFx1MjAyNiB3aXRob3V0IGFueSBgcmVjb3JkOmRldGFpbHNgIHNlY3Rpb24gYmVpbmdcbiAgICAvLyBhdXRob3JlZFwiKS4gVGhlc2UgYXJlIGRhdGEtZW50cnkgZmllbGRzIGEgcGVyc29uIGZpbGxzIGluIGFuZCBhIHBlcnNvblxuICAgIC8vIHJlYWRzIG9mZiB0aGUgZGVyaXZlZCBmb3JtLiBcdTI2RDQgRG8gTk9UIGFuc3dlciB0aGUgd2FybmluZyBieSBhdXRob3JpbmcgYVxuICAgIC8vIGByZWNvcmQ6ZGV0YWlsc2Agc2VjdGlvbiBcdTIwMTQgdGhhdCBpcyB0aGUgZXNjYXBlIGhhdGNoIEFHRU5UUy5tZCByZXNlcnZlc1xuICAgIC8vIGZvciBhIG5hbWVkIGN1c3RvbWVyIGRlbWFuZCwgYW5kIGl0IHdvdWxkIHRyYWRlIGFjY2VwdGFuY2UgMyBmb3IgYVxuICAgIC8vIHF1aWV0ZXIgbG9nLiBObyBndWFyZCByZWFkcyB0aGlzIHdhcm5pbmcuXG5cbiAgICBpbmN1bWJlbnRfdmVuZG9yOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnSW5jdW1iZW50IFZlbmRvcicsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBzdXBwbGllciBjdXJyZW50bHkgaG9sZGluZyB0aGlzIGFjY291bnQgZm9yIHRoZSBzcGVuZCB3ZSBhcmUgY2hhc2luZy4nLFxuICAgICAgbWF4TGVuZ3RoOiAyNTUsXG4gICAgICBncm91cDogJ2J1c2luZXNzX3Byb2ZpbGUnLFxuICAgIH0pLFxuXG4gICAgYW5udWFsX3B1cmNoYXNpbmdfYnVkZ2V0OiBGaWVsZC5jdXJyZW5jeSh7XG4gICAgICBsYWJlbDogJ0FubnVhbCBQdXJjaGFzaW5nIEJ1ZGdldCcsXG4gICAgICBkZXNjcmlwdGlvbjogXCJXaGF0IHRoaXMgYWNjb3VudCBleHBlY3RzIHRvIFNQRU5EIHdpdGggdmVuZG9ycyB0aGlzIHllYXIgXHUyMDE0IG5vdCBpdHMgb3duIHJldmVudWUuXCIsXG4gICAgICBtaW46IDAsXG4gICAgICBncm91cDogJ2J1c2luZXNzX3Byb2ZpbGUnLFxuICAgIH0pLFxuXG4gICAgLy8gUGF5bWVudCB0ZXJtcyBhcyBhIHNlbGVjdCwgbm90IGZyZWUgdGV4dDogaXQgaXMgcmVhZCBieSBhIHBlcnNvbiBzaXppbmdcbiAgICAvLyBjYXNoLWZsb3cgcmlzaywgYW5kIGEgcGlja2xpc3Qga2VlcHMgdGhhdCBkb21haW4ga25vd2FibGUuIFRoZSB2YWx1ZXMgYXJlXG4gICAgLy8gdGhlIG5ldC10ZXJtcyBsYWRkZXIgZXZlcnkgQjJCIGluc3RhbGwgc2hhcmVzOyBhIGN1c3RvbWVyIHdob3NlIGNvbnRyYWN0c1xuICAgIC8vIHVzZSBhIGRpZmZlcmVudCBsYWRkZXIgb3ZlcmxheXMgaXRzIG93bi5cbiAgICBwYXltZW50X2N5Y2xlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdQYXltZW50IEN5Y2xlJyxcbiAgICAgIGdyb3VwOiAnYnVzaW5lc3NfcHJvZmlsZScsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdQcmVwYWlkJywgdmFsdWU6ICdwcmVwYWlkJyB9LFxuICAgICAgICB7IGxhYmVsOiAnTmV0IDMwJywgdmFsdWU6ICduZXRfMzAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdOZXQgNjAnLCB2YWx1ZTogJ25ldF82MCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ05ldCA5MCcsIHZhbHVlOiAnbmV0XzkwJyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIC8vIENvbnRhY3QgSW5mb3JtYXRpb25cbiAgICBwaG9uZTogRmllbGQudGV4dCh7XG4gICAgICBsYWJlbDogJ1Bob25lJyxcbiAgICAgIGZvcm1hdDogJ3Bob25lJyxcbiAgICAgIGdyb3VwOiAnY29udGFjdF9pbmZvJyxcbiAgICB9KSxcblxuICAgIHdlYnNpdGU6IEZpZWxkLnVybCh7XG4gICAgICBsYWJlbDogJ1dlYnNpdGUnLFxuICAgICAgZ3JvdXA6ICdjb250YWN0X2luZm8nLFxuICAgIH0pLFxuXG4gICAgLy8gU3RydWN0dXJlZCBBZGRyZXNzIGZpZWxkIChuZXcgZmllbGQgdHlwZSlcbiAgICBiaWxsaW5nX2FkZHJlc3M6IEZpZWxkLmFkZHJlc3Moe1xuICAgICAgbGFiZWw6ICdCaWxsaW5nIEFkZHJlc3MnLFxuICAgICAgZ3JvdXA6ICdjb250YWN0X2luZm8nLFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogRmxhdCBwcm9qZWN0aW9uIG9mIGBiaWxsaW5nX2FkZHJlc3MuY291bnRyeWAuXG4gICAgICpcbiAgICAgKiAjIyMgV2h5IHRoZSBmbGF0IGNvbHVtbiBleGlzdHMgXHUyMDE0IHRoZSB0cmFwIHRoYXQgY2F0Y2hlcyBldmVyeSBydWxlXG4gICAgICogIyMjIGF1dGhvcmVkIGFnYWluc3QgYW4gYGFkZHJlc3NgXG4gICAgICpcbiAgICAgKiBcdTI2QTBcdUZFMEYgYGJpbGxpbmdfYWRkcmVzc2AgaXMgYW4gYGFkZHJlc3NgIGZpZWxkOiB0aGUgcGxhdGZvcm0gc3RvcmVzIHRoZSB3aG9sZVxuICAgICAqIHtzdHJlZXQsIGNpdHksIHN0YXRlLCBwb3N0YWxDb2RlLCBjb3VudHJ5LCBjb3VudHJ5Q29kZSwgZm9ybWF0dGVkfSB2YWx1ZVxuICAgICAqIGluIE9ORSBjb2x1bW4uIEEgc2hhcmluZyBydWxlJ3MgQ0VMIGNvbmRpdGlvbiBpcyBjb21waWxlZCB0byBhXG4gICAgICogcHVzaGRvd24tYWJsZSBgRmlsdGVyQ29uZGl0aW9uYCBieSBgY29tcGlsZUNlbFRvRmlsdGVyYCwgYW5kIHRoYXQgY29tcGlsZXJcbiAgICAgKiByZWplY3RzIGV2ZXJ5IHBhdGggcmVhY2hpbmcgSU5TSURFIHN1Y2ggYSB2YWx1ZTpcbiAgICAgKlxuICAgICAqICAgICByZWNvcmQuYmlsbGluZ19hZGRyZXNzLmNvdW50cnkgaW4gW1wiVVNcIixcIkNBXCIsXCJNWFwiXVxuICAgICAqICAgICAgIFx1MjE5MiB1bnN1cHBvcnRlZDogY3Jvc3Mtb2JqZWN0L25lc3RlZCBmaWVsZCBwYXRoXG4gICAgICogICAgICAgICBcInJlY29yZC5iaWxsaW5nX2FkZHJlc3MuY291bnRyeVwiIGlzIG5vdCBwdXNoZG93bi1hYmxlXG4gICAgICpcbiAgICAgKiBgcGx1Z2luLXNoYXJpbmdgIHRoZW4gcmVmdXNlcyB0byBzZWVkIHRoZSBydWxlIHJhdGhlciB0aGFuIGRlZ3JhZGUgaXQgdG9cbiAgICAgKiBtYXRjaC1hbGwsIHNvIHRoZSBydWxlIGlzIGRyb3BwZWQgb24gZXZlcnkgYm9vdCBhbmQgaXRzIHJlY2lwaWVudHMgZ2V0XG4gICAgICogbm90aGluZyBhdCBhbGwuIE1lYXN1cmVkOiB0aGUgYmxvY2tlciBpcyB0aGUgTkVTVEVEIFBBVEgsIG5vdCB0aGVcbiAgICAgKiBgaW4gWy4uLl1gIG9wZXJhdG9yIFx1MjAxNCBgaW4gWy4uLl1gLCBgPT1gLCBgIT1gLCBgPGAsIGA+YCwgYCYmYCwgYHx8YCwgYCFgLFxuICAgICAqIGBzdGFydHNXaXRoKClgIGFuZCBgPT0gbnVsbGAgYWxsIGNvbXBpbGUgZmluZSBhZ2FpbnN0IGEgRkxBVCBmaWVsZC5cbiAgICAgKiBSZXdyaXRpbmcgdGhlIGNvbmRpdGlvbiBhcyBhIGRpc2p1bmN0aW9uIG9mIGA9PWAgdGhlcmVmb3JlIGRvZXMgTk9UIGhlbHA7XG4gICAgICogb25seSBhIGZsYXQgY29sdW1uIGRvZXMuIGB0ZXN0L3NoYXJpbmctc2VlZGluZy50ZXN0LnRzYCBtZWFzdXJlcyB0aGF0XG4gICAgICogbWF0cml4IGluc3RlYWQgb2YgYXNzdW1pbmcgaXQuXG4gICAgICpcbiAgICAgKiAjIyMgV2hhdCBpdCBob2xkc1xuICAgICAqXG4gICAgICogYGJpbGxpbmdfYWRkcmVzcy5jb3VudHJ5YCwgdHJpbW1lZCwgaW50ZXJuYWwgd2hpdGVzcGFjZSBjb2xsYXBzZWQsIGFuZFxuICAgICAqIHVwcGVyLWNhc2VkIFx1MjAxNCBub3RoaW5nIGVsc2UuIEl0IGlzIHdoYXQgd2FzIFRZUEVELCBzbyBpdCBpcyBzdGlsbCBmcmVlXG4gICAgICogdGV4dCBhbmQgc3RpbGwgY2FwYWJsZSBvZiBob2xkaW5nIGBEZXV0c2NobGFuZGAuIE5vdGhpbmcgbWF0Y2hlcyBhZ2FpbnN0XG4gICAgICogaXQ6IGB0ZXJyaXRvcnlgIGJlbG93IGNsYXNzaWZpZXMgaXQsIGFuZCBhbiB1bnJlY29nbmlzZWQgc3BlbGxpbmcgbGFuZHMgaW5cbiAgICAgKiBhIHN0YXRlZCBgb3RoZXJgLiBgY291bnRyeUNvZGVgIGlzIGRlbGliZXJhdGVseSBub3QgY29uc3VsdGVkOyBzZWUgdGhlXG4gICAgICogbm90ZSBpbiBgYWNjb3VudC5ob29rLnRzYCBmb3Igd2h5IHRoZSBJU08gc2xvdCBpcyBub3QgdGhlIGlucHV0LlxuICAgICAqXG4gICAgICogRGVyaXZlZCwgbmV2ZXIgYXV0aG9yZWQ6IGBhY2NvdW50Lmhvb2sudHNgIHJlY29tcHV0ZXMgaXQgb24gZXZlcnkgd3JpdGVcbiAgICAgKiB0aGF0IGNhcnJpZXMgYGJpbGxpbmdfYWRkcmVzc2AsIGFuZCBsZWF2ZXMgaXQgdW50b3VjaGVkIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICBiaWxsaW5nX2NvdW50cnk6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdCaWxsaW5nIENvdW50cnknLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdEZXJpdmVkIGZyb20gQmlsbGluZyBBZGRyZXNzIFx1MjAxNCB0aGUgY291bnRyeSBleGFjdGx5IGFzIGl0IHdhcyBlbnRlcmVkLCB0cmltbWVkIGFuZCB1cHBlci1jYXNlZC4gVGVycml0b3J5IGlzIGNsYXNzaWZpZWQgZnJvbSBpdC4nLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBtYXhMZW5ndGg6IDY0LFxuICAgICAgZ3JvdXA6ICdjb250YWN0X2luZm8nLFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogVGVycml0b3J5IFx1MjAxNCB0aGUgZGVjbGFyZWQgdmFsdWUgdGhlIHRlcnJpdG9yeSBzaGFyaW5nIHJ1bGVzIGZpbHRlciBvbi5cbiAgICAgKlxuICAgICAqICMjIyBXaHkgYSBzZWxlY3QgYW5kIG5vdCB0aGUgY291bnRyeVxuICAgICAqXG4gICAgICogTWF0Y2hpbmcgZnJlZS10ZXh0IGBiaWxsaW5nX2NvdW50cnlgIGFnYWluc3QgYSBsaXN0IG9mIGNvdW50cnkgY29kZXNcbiAgICAgKiBpbnNpZGUgYSBDRUwgc3RyaW5nIG1lYW5zIGFuIGFjY291bnQgd2hvc2UgYWRkcmVzcyByZWFkcyBgVW5pdGVkIFN0YXRlc2BcbiAgICAgKiBiZWxvbmdzIHRvIE5PIHRlcnJpdG9yeSwgc2lsZW50bHkgXHUyMDE0IHRoZSBtZXRhZGF0YSBzYXlzIHRlcnJpdG9yeSBzaGFyaW5nXG4gICAgICogd29ya3MgYW5kIGZvciB0aGF0IGFjY291bnQgaXQgZG9lcyBub3RoaW5nLCB3aXRoIG5vIGVycm9yIGFueXdoZXJlLiBBXG4gICAgICogYHNlbGVjdGAgbWFrZXMgdGhlIGRvbWFpbiBrbm93YWJsZTogdGhyZWUgdmFsdWVzLCBkZWNsYXJlZCwgZXZlcnkgb25lXG4gICAgICogcmVhY2hhYmxlLCBhbmQgYW4gYWNjb3VudCBvdXRzaWRlIHRoZSBzdGFmZmVkIHRlcnJpdG9yaWVzIHNheXMgYG90aGVyYFxuICAgICAqIHJhdGhlciB0aGFuIG5vdGhpbmcuXG4gICAgICpcbiAgICAgKiBJdCBhbHNvIGNvbGxhcHNlcyBmb3VyIGNvcGllcyBvZiB0aGUgY291bnRyeSBsaXN0ICh0d28gQ0VMIHN0cmluZ3MgYW5kXG4gICAgICogc2l4IGxvY2FsaXNlZCBkb2N1bWVudGF0aW9uIHRhYmxlcykgaW50byBvbmUgYXV0aG9yZWQgdGFibGUgaW5cbiAgICAgKiBgLi9fdGVycml0b3J5LnRzYC4gQWRkaW5nIGEgY291bnRyeSBpcyBhIGxpbmUgdGhlcmU7IHRoZSBzaGFyaW5nIHJ1bGVzLFxuICAgICAqIHRoaXMgcGlja2xpc3QgYW5kIHRoZSBkb2NzIGFsbCBmb2xsb3csIGFuZFxuICAgICAqIGB0ZXN0L3RlcnJpdG9yeS1zaW5nbGUtc291cmNlLnRlc3QudHNgIGZhaWxzIGlmIGFueSBvZiB0aGVtIGRvZXMgbm90LlxuICAgICAqXG4gICAgICogIyMjIFJlYWRvbmx5LCBhbmQgYWx3YXlzIHN0YXRlZFxuICAgICAqXG4gICAgICogRGVyaXZlZCBieSBgYWNjb3VudF9wcm90ZWN0aW9uYCBmcm9tIGBiaWxsaW5nX2FkZHJlc3MuY291bnRyeWAsIG5ldmVyXG4gICAgICogYXV0aG9yZWQgXHUyMDE0IGNvcnJlY3RpbmcgYW4gYWNjb3VudCdzIHRlcnJpdG9yeSBtZWFucyBjb3JyZWN0aW5nIGl0c1xuICAgICAqIGFkZHJlc3MsIHdoaWNoIGtlZXBzIE9ORSBmYWN0IGJlaGluZCB0aGUgY2xhc3NpZmljYXRpb24uIEV2ZXJ5IGluc2VydFxuICAgICAqIHN0YXRlcyBpdCAoYW4gYWNjb3VudCB3aXRoIG5vIGFkZHJlc3MgYXQgYWxsIGlzIGBvdGhlcmApLCBhbmQgYW4gdXBkYXRlXG4gICAgICogdGhhdCBkb2VzIG5vdCBjYXJyeSB0aGUgYWRkcmVzcyBsZWF2ZXMgaXQgYWxvbmUuXG4gICAgICovXG4gICAgdGVycml0b3J5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdUZXJyaXRvcnknLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdEZXJpdmVkIGZyb20gQmlsbGluZyBBZGRyZXNzIFx1MjAxNCB0aGUgc2FsZXMgdGVycml0b3J5IHRoaXMgYWNjb3VudCBiZWxvbmdzIHRvLiBBY2NvdW50cyBvdXRzaWRlIHRoZSBzdGFmZmVkIHRlcnJpdG9yaWVzIGFyZSBPdGhlci4nLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBvcHRpb25zOiBbLi4uVEVSUklUT1JZX09QVElPTlNdLFxuICAgICAgZ3JvdXA6ICdjb250YWN0X2luZm8nLFxuICAgIH0pLFxuXG4gICAgLy8gT2ZmaWNlIExvY2F0aW9uIChuZXcgZmllbGQgdHlwZSlcbiAgICBvZmZpY2VfbG9jYXRpb246IEZpZWxkLmxvY2F0aW9uKHtcbiAgICAgIGxhYmVsOiAnT2ZmaWNlIExvY2F0aW9uJyxcbiAgICAgIGdyb3VwOiAnY29udGFjdF9pbmZvJyxcbiAgICB9KSxcblxuICAgIC8vIFJlbGF0aW9uc2hpcCBmaWVsZHNcblxuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IGhpZXJhcmNoeS4gYGNoaWxkX2FjY291bnRfcmV2ZW51ZWAgYmVsb3cgaXMgaXRzIG9uZSByZWFkZXIgXHUyMDE0XG4gICAgICogdGhlIHBsYXRmb3JtIGNvbXB1dGVzIHJvbGwtdXAgc3VtbWFyaWVzIGl0c2VsZiwgc28gdGhlIGhvbmVzdCBjb25zdW1lciBpc1xuICAgICAqIGEgc2luZ2xlIGRlY2xhcmF0aW9uIHJhdGhlciB0aGFuIGhhbmQtd3JpdHRlbiByZWNvbXB1dGUgaG9va3MuXG4gICAgICovXG4gICAgcGFyZW50X2FjY291bnQ6IEZpZWxkLmxvb2t1cCgnY3JtX2FjY291bnQnLCB7XG4gICAgICBsYWJlbDogJ1BhcmVudCBBY2NvdW50JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUGFyZW50IGNvbXBhbnkgaW4gaGllcmFyY2h5JyxcbiAgICAgIGdyb3VwOiAnb3duZXJzaGlwJyxcbiAgICB9KSxcblxuICAgIC8vIEJvb2xlYW4gZmllbGRcbiAgICBpc19hY3RpdmU6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdBY3RpdmUnLFxuICAgICAgZGVmYXVsdFZhbHVlOiB0cnVlLFxuICAgICAgZ3JvdXA6ICdvd25lcnNoaXAnLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogV2hlcmUgdGhpcyBhY2NvdW50IHN0YW5kcyBpbiBpdHMgc2lnbi1vZmYgKFJFUS0wMDAzIHN0ZXAgNSAvIGFjY2VwdGFuY2UgNCkuXG4gICAgICpcbiAgICAgKiBgcmVhZG9ubHlgLCBzbyBvbmx5IHRoZSBwbGF0Zm9ybSdzIG93biBhcHByb3ZhbCB3cml0ZSByZWFjaGVzIGl0OiBhXG4gICAgICogdXNlcidzIGluc2VydCBvciBlZGl0IHRoYXQgbmFtZXMgdGhpcyBjb2x1bW4gaGFzIGl0IHN0cmlwcGVkIChtZWFzdXJlZFxuICAgICAqIG9uIDE3LjcuMCBmb3IgYGFwcHJvdmVkYCwgYHBlbmRpbmdgIGFuZCBgcmVqZWN0ZWRgIGFsaWtlLCAjMjA2NykuXG4gICAgICpcbiAgICAgKiBcdTI2RDQgTk9UIGEgc2Vjb25kIGJvb2xlYW4gYmVzaWRlIGBpc19hY3RpdmVgLCB3aGljaCBSRVEtMDAwMyBydWxlcyBvdXQgYnlcbiAgICAgKiBuYW1lLiBgaXNfYWN0aXZlYCBhbnN3ZXJzIFwiaXMgdGhpcyBhY2NvdW50IGxpdmUgYXQgYWxsXCI7IHRoaXMgYW5zd2Vyc1xuICAgICAqIFwiaGFzIHRoZSByZWNvcmQgYmVlbiBzaWduZWQgb2ZmXCIsIGFuZCBjb2xsYXBzaW5nIHRoZW0gd291bGQgbWFrZVxuICAgICAqIGRlYWN0aXZhdGluZyBhbiBhY2NvdW50IGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gcmVqZWN0aW5nIG9uZS5cbiAgICAgKlxuICAgICAqIFx1MjZBMFx1RkUwRiBTaGlwcyB3aXRoIE5PIGRlZmF1bHQsIGFuZCB0aGF0IGlzIHdoYXQga2VlcHMgdGhlIGdhdGUgYXJtZWQgKCMyMDY3KS5cbiAgICAgKiBBIG5ldyBhY2NvdW50IGlzIGJvcm4gYmxhbmssIGBhY2NvdW50X2FwcHJvdmFsYCBzdGFydHMgb24gdGhlIGJsYW5rLCBhbmRcbiAgICAgKiBpdHMgYXBwcm92YWwgbm9kZSBvcGVucyB0aGUgcmVxdWVzdDsgdGhlIG5vZGUncyBgYXBwcm92YWxTdGF0dXNGaWVsZGBcbiAgICAgKiBtaXJyb3IgdGhlbiB3cml0ZXMgYHBlbmRpbmdgIChwbHVnaW4tYXBwcm92YWxzIGBvcGVuTm9kZVJlcXVlc3RgKSBiZWZvcmVcbiAgICAgKiB0aGUgY3JlYXRlIHJldHVybnM7IG9ubHkgdGhlIGNyZWF0ZSdzIG93biByZXNwb25zZSBib2R5IHN0aWxsIHNob3dzIHRoZVxuICAgICAqIGJsYW5rIHJvdyBpdCBpbnNlcnRlZC4gU28gd2l0aCBhcHByb3ZhbHMgaW4gdGhlIGNvbXBvc2l0aW9uIFJFUS0wMDAzXG4gICAgICogYWNjZXB0YW5jZSA0IGhvbGRzIGluIGFzIG1hbnkgd29yZHMgKFwiQSBuZXdseSBjcmVhdGVkIGFjY291bnQgc2l0cyBpbiBhXG4gICAgICogcGVuZGluZyBzdGF0ZSwgYXBwZWFycyBpbiB0aGUgcGxhdGZvcm0gYXBwcm92YWwgaW5ib3ggXHUyMDI2XCIpLCBhbmQgYHBlbmRpbmdgXG4gICAgICogYWx3YXlzIGhhcyBhIHJlcXVlc3QgYmVoaW5kIGl0LiBXaXRob3V0IGFwcHJvdmFscyAoYSBwbGFuIG9yIGVkaXRpb25cbiAgICAgKiB0aGF0IG9taXRzIHRoZSBjYXBhYmlsaXR5KSBub3RoaW5nIG9wZW5zIGEgcmVxdWVzdCwgc28gbm90aGluZyB3cml0ZXNcbiAgICAgKiBgcGVuZGluZ2A6IHRoZSBhY2NvdW50IHN0YXlzIGJsYW5rIGFuZCBlZGl0YWJsZSBpbnN0ZWFkIG9mIHJlYWRpbmdcbiAgICAgKiBcImxvY2tlZCBmb3IgYXBwcm92YWxcIiBmb3JldmVyLCB3aGljaCBpcyB3aGF0IGEgc2hpcHBlZCBgcGVuZGluZ2AgZGVmYXVsdFxuICAgICAqIGRpZCwgc2luY2UgdGhlIGNvbnNvbGUgZGVyaXZlcyBpdHMgbG9jayBmcm9tIHRoaXMgY29sdW1uJ3MgdmFsdWUuXG4gICAgICpcbiAgICAgKiBcdTI2RDQgRG8gbm90IHJlc3RvcmUgYGRlZmF1bHRWYWx1ZTogJ3BlbmRpbmcnYCwgbm9yIGFuIG9wdGlvbi1sZXZlbFxuICAgICAqIGBkZWZhdWx0OiB0cnVlYCBvbiBQZW5kaW5nICh0aGUgZm9ybSB3b3VsZCBwcmVzZWxlY3QgaXQpLiBBbiBpbnN0YWxsXG4gICAgICogdGhhdCB3YW50cyBubyBhY2NvdW50IHNpZ24tb2ZmIEFERFMgYGRlZmF1bHRWYWx1ZTogJ2FwcHJvdmVkJ2A7IHRoZVxuICAgICAqIGZsb3cncyBzdGFydCBjb25kaXRpb24gaXMgdGhlbiBmYWxzZSBmb3IgZXZlcnkgcmVjb3JkIGFuZCB0aGUgZ2F0ZSBpc1xuICAgICAqIG9mZiwgc3dpdGNoYWJsZSBhbmQgaW5lcnQuIFRoYXQgaXMgdGhlIHNhbWUga2luZCBvZiBvZmYgc3dpdGNoXG4gICAgICogYGNybV9sZWFkLmNvbnZlcnNpb25fYXBwcm92YWxfc3RhdHVzYCByZWNvcmRzLCBhbmQgXHUyNkQ0IE5PVCB0aGUgZmxvdydzXG4gICAgICogYHN0YXR1c2AsIGZvciB0aGUgcmVhc29ucyBtZWFzdXJlZCBpbiBgbGVhZC1jb252ZXJzaW9uLWFwcHJvdmFsLmZsb3cudHNgLlxuICAgICAqXG4gICAgICogXHUyNkQ0IFRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBgbm90X3JlcXVpcmVkYCB2YWx1ZS4gQmxhbmsgYWxyZWFkeSBzYXlzXG4gICAgICogXCJubyByZXF1ZXN0IGhhcyBiZWVuIG9wZW5lZFwiLCBhbmQgYGFwcHJvdmVkYCBhbHJlYWR5IHNwZWxscyBcIm5vdGhpbmcgdG9cbiAgICAgKiBkZWNpZGVcIi5cbiAgICAgKi9cbiAgICBhcHByb3ZhbF9zdGF0dXM6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ0FwcHJvdmFsIFN0YXR1cycsXG4gICAgICBncm91cDogJ293bmVyc2hpcCcsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ1BlbmRpbmcnLCB2YWx1ZTogJ3BlbmRpbmcnLCBjb2xvcjogJyNGRkE1MDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdBcHByb3ZlZCcsIHZhbHVlOiAnYXBwcm92ZWQnLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWplY3RlZCcsIHZhbHVlOiAncmVqZWN0ZWQnLCBjb2xvcjogJyNGRjAwMDAnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgLy8gQnJhbmQgY29sb3IgKG5ldyBmaWVsZCB0eXBlKVxuICAgIGJyYW5kX2NvbG9yOiBGaWVsZC5jb2xvcih7XG4gICAgICBsYWJlbDogJ0JyYW5kIENvbG9yJyxcbiAgICAgIGdyb3VwOiAnYnJhbmRpbmcnLFxuICAgIH0pLFxuXG4gICAgLy8gQ29tcGFueSBsb2dvICh1cGxvYWRlZCBpbWFnZSkuIGBhY2NlcHRgIC8gYG1heFNpemVgIGFyZSBzZXJ2ZXItZW5mb3JjZWRcbiAgICAvLyBmcm9tIEBvYmplY3RzdGFjayAxNyBcdTIwMTQgc2VlIHRoZSBub3RlIG9uIGBjcm1fcHJvZHVjdC5pbWFnZWAuXG4gICAgbG9nbzogRmllbGQuaW1hZ2Uoe1xuICAgICAgbGFiZWw6ICdDb21wYW55IExvZ28nLFxuICAgICAgZ3JvdXA6ICdicmFuZGluZycsXG4gICAgICBhY2NlcHQ6IFsnaW1hZ2UvcG5nJywgJ2ltYWdlL2pwZWcnLCAnaW1hZ2Uvc3ZnK3htbCcsICdpbWFnZS93ZWJwJ10sXG4gICAgICBtYXhTaXplOiAyICogMTAyNCAqIDEwMjQsXG4gICAgfSksXG5cbiAgICAvLyBEYXRlIGZpZWxkXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgTk9UIGByZWFkb25seWAsIGFuZCBpdCBtdXN0IG5vdCBiZWNvbWUgcmVhZG9ubHkuIFRoaXMgaXMgdGhlIHNpZ25hbFxuICAgIC8vIGBhdF9yaXNrX2FjY291bnRzYCBhbmQgYGN1c3RvbWVyX2NodXJuX3NpZ25hbHNgIGFyZSBidWlsdCBvbiwgYW5kIGl0IGlzXG4gICAgLy8gd3JpdHRlbiBieSBPTkUgcGF0aDogYW5vdGhlciBvYmplY3QncyBob29rIGNhbGxpbmdcbiAgICAvLyBgYXBpLm9iamVjdCgnY3JtX2FjY291bnQnKS51cGRhdGUoeyBsYXN0X2FjdGl2aXR5X2RhdGUgfSwgXHUyMDI2KWAuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgUGxhdGZvcm0gY29uc3RyYWludDogYHN0cmlwUmVhZG9ubHlGaWVsZHNgIGRlbGV0ZXMgYSByZWFkb25seSBrZXkgZnJvbVxuICAgIC8vIGFueSBwYXlsb2FkIHdob3NlIENBTExFUiBzdXBwbGllZCBpdCwgZm9yIGV2ZXJ5IGNvbnRleHQgdGhhdCBpcyBub3RcbiAgICAvLyBgaXNTeXN0ZW1gIFx1MjAxNCBhbmQgYSBob29rJ3MgYGN0eC5hcGlgIGlzIGEgYFNjb3BlZENvbnRleHRgIG92ZXIgdGhlIEFDVElOR1xuICAgIC8vIFVTRVIncyBleGVjdXRpb24gY29udGV4dCwgbm90IGEgc3lzdGVtIG9uZS4gU28gYSByZWFkb25seSBmaWVsZCBhIGhvb2tcbiAgICAvLyB3cml0ZXMgaXMgc2lsZW50bHkgZHJvcHBlZDogdGhlIGVuZ2luZSBsb2dzIGBGaWVsZCAnXHUyMDI2JyBpcyByZWFkLW9ubHkgXHUyMDE0XG4gICAgLy8gaWdub3JpbmcgaW5jb21pbmcgY2hhbmdlYCBhbmQgdGhlIGNvbHVtbiBzdGF5cyBudWxsIGZvcmV2ZXIuXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgYGNybV9jYW1wYWlnbl9tZW1iZXIuYWRkZWRfZGF0ZWAgd2FzIGNpdGVkIGhlcmUgYXMgYSB0d2luIGFuZCBpcyBOT1RcbiAgICAvLyBvbmUgXHUyMDE0IGl0IHdhcyBydWxlZCBgcmVhZG9ubHk6IHRydWVgIGluICMxNjY3IHByZWNpc2VseSBiZWNhdXNlIGl0c1xuICAgIC8vIHdyaXRlcnMgYXJlIElOU0VSVHMsIHdoaWNoIHRoZSBzdHJpcCBuZXZlciByZWFjaGVzLiBUSElTIGZpZWxkIGlzIGFuXG4gICAgLy8gVVBEQVRFIHRocm91Z2ggYSBob29rJ3MgYGN0eC5hcGlgLCB3aGljaCBpcyB0aGUgb25lIHNoYXBlIHRoYXQgY2Fubm90IGJlXG4gICAgLy8gYHJlYWRvbmx5YC4gTm90ZSB0aGUgcnVsZVxuICAgIC8vIGlzIGFib3V0IHRoZSBDT05URVhULCBub3QgYWJvdXQgaG9va3Mgb3IgZmxvd3MgYXMgc3VjaCBcdTIwMTQgYSBob29rIHN0YW1waW5nXG4gICAgLy8gaXRzIG93biBgY3R4LmlucHV0LmRhdGFgIHN1cnZpdmVzLCBhbmQgYSBmbG93IHN1cnZpdmVzIHdoZW4gaXRzIGBydW5Bc2BcbiAgICAvLyBpcyBgJ3N5c3RlbSdgIChtZWFzdXJlZDogYHRlc3QvcmVhZG9ubHktd3JpdGUtc2VtYW50aWNzLnRlc3QudHNgLCAjMTQyOTtcbiAgICAvLyBgY3JtX2Nhc2UuaXNfc2xhX3Zpb2xhdGVkYCBpcyBjaXRlZCBlbHNld2hlcmUgYXMgYSB0d2luIG9mIHRoaXMgZmllbGRcbiAgICAvLyBhbmQgaXMgTk9UIG9uZSBcdTIwMTQgaXRzIHdyaXRlciBpcyBhIHN5c3RlbSBmbG93KS4gVGhpcyBmaWVsZCBzdGF5cyBvdXQgb2ZcbiAgICAvLyBldmVyeSBmb3JtIHNlY3Rpb24gaW5zdGVhZCwgd2hpY2ggaXMgdGhlIHByb3RlY3Rpb24gdGhhdCBhY3R1YWxseVxuICAgIC8vIGhvbGRzLiBgdGVzdC9hY3Rpdml0eS1yZWNlbmN5LnRlc3QudHNgIHByb3Zlc1xuICAgIC8vIHRoZSB3cml0ZSBsYW5kcyBcdTIwMTQgYW5kIGZhaWxzIGlmIHRoZSBmbGFnIGNvbWVzIGJhY2suXG4gICAgbGFzdF9hY3Rpdml0eV9kYXRlOiBGaWVsZC5kYXRlKHtcbiAgICAgIGxhYmVsOiAnTGFzdCBBY3Rpdml0eSBEYXRlJyxcbiAgICAgIGdyb3VwOiAnc3lzdGVtJyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDdXN0b21lciBTdWNjZXNzIC8gQWNjb3VudCBIZWFsdGggXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgdGllcjogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnQ3VzdG9tZXIgVGllcicsXG4gICAgICBncm91cDogJ293bmVyc2hpcCcsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdTdHJhdGVnaWMnLCAgdmFsdWU6ICdzdHJhdGVnaWMnLCAgY29sb3I6ICcjN0MzQUVEJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRW50ZXJwcmlzZScsIHZhbHVlOiAnZW50ZXJwcmlzZScsIGNvbG9yOiAnIzQxNjlFMScgfSxcbiAgICAgICAgeyBsYWJlbDogJ01pZC1NYXJrZXQnLCB2YWx1ZTogJ21pZF9tYXJrZXQnLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTTUInLCAgICAgICAgdmFsdWU6ICdzbWInLCAgICAgICAgY29sb3I6ICcjRkZBNTAwJywgZGVmYXVsdDogdHJ1ZSB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIHNlZ21lbnQ6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ1NlZ21lbnQnLFxuICAgICAgZ3JvdXA6ICdvd25lcnNoaXAnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnTmV0IE5ldycsICAgIHZhbHVlOiAnbmV0X25ldycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0dyb3d0aCcsICAgICB2YWx1ZTogJ2dyb3d0aCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0F0IFJpc2snLCAgICB2YWx1ZTogJ2F0X3Jpc2snIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdGFibGUnLCAgICAgdmFsdWU6ICdzdGFibGUnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgaGVhbHRoX3Njb3JlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdIZWFsdGggU2NvcmUnLFxuICAgICAgZ3JvdXA6ICdvd25lcnNoaXAnLFxuICAgICAgZGVzY3JpcHRpb246ICdDU00tbWFpbnRhaW5lZCBoZWFsdGggaW5kaWNhdG9yJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0hlYWx0aHknLCAgICB2YWx1ZTogJ2hlYWx0aHknLCAgICBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdXYXRjaGluZycsICAgdmFsdWU6ICd3YXRjaGluZycsICAgY29sb3I6ICcjRkZBNTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQXQgUmlzaycsICAgIHZhbHVlOiAnYXRfcmlzaycsICAgIGNvbG9yOiAnI0ZGNDUwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0NodXJuaW5nJywgICB2YWx1ZTogJ2NodXJuaW5nJywgICBjb2xvcjogJyNGRjAwMDAnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNkQ0IE5vIGFjY291bnQtbGV2ZWwgcmVuZXdhbCBtb2RlbCBoZXJlLCBvbiBwdXJwb3NlLiBSZW5ld2FsIGlzIGFcbiAgICAvLyBDT05UUkFDVC1sZXZlbCBwcm9jZXNzIHdpdGggZXhhY3RseSBvbmUgaG9tZSBcdTIwMTQgYGNybV9jb250cmFjdC5lbmRfZGF0ZWAgK1xuICAgIC8vIGByZW5ld2FsX25vdGljZV9kYXlzYCwgc3dlcHQgZGFpbHkgYnkgYHNyYy9yZXZlbnVlL2Zsb3dzL2NvbnRyYWN0LXJlbmV3YWwuZmxvdy50c2AsXG4gICAgLy8gd2hpY2ggYm9va3MgdGhlIHRhc2sgYW5kIG5vdGlmaWVzIHRoZSBDT05UUkFDVCBvd25lcjsgdGhlIHVzZXItZmFjaW5nXG4gICAgLy8gcXVldWUgaXMgdGhhdCBvYmplY3QncyBgcmVuZXdhbF9jYWxlbmRhcmAgdmlldy4gQSBgcmVuZXdhbF9vd25lcmAgL1xuICAgIC8vIGBuZXh0X3JlbmV3YWxfZGF0ZWAgcGFpciBoZXJlIHdvdWxkIGJlIGRlY2xhcmVkIGFuZCBpbmVydCwgdGVsbGluZyBhblxuICAgIC8vIGFkbWluIGEgcmVuZXdhbCByZWFjaGVzIHRoZSBDU00gdGhleSBuYW1lZCB3aGVuIG5vdGhpbmcgd291bGQuIElmIGFuXG4gICAgLy8gYWNjb3VudC1sZXZlbCByZW5ld2FsIG93bmVyIGlzIGV2ZXIgd2FudGVkLCBpdCBpcyBhIGNoYW5nZSB0byB0aGF0IGZsb3dcbiAgICAvLyBwbHVzIGEgcmVhbCB3cml0ZXIgZm9yIHRoZSBkYXRlIFx1MjAxNCBub3QgYSBzZWNvbmQgcGFpciBvZiBmaWVsZHMuXG4gIH0sXG4gIFxuICAvLyBEYXRhYmFzZSBpbmRleGVzIGZvciBwZXJmb3JtYW5jZVxuICAvL1xuICAvLyBcdTI2QTBcdUZFMEYgTm8gYHsgZmllbGRzOiBbJ25hbWUnXSwgdW5pcXVlOiB0cnVlIH1gIGhlcmUuIEFjY291bnQtbmFtZSB1bmlxdWVuZXNzIGlzXG4gIC8vIGRlY2xhcmVkIG9uIHRoZSBgbmFtZWAgZmllbGQgaXRzZWxmLCB3aGljaCB0aGUgZnJhbWV3b3JrIGJ1aWxkcyBhcyB0aGVcbiAgLy8gdGVuYW50IGNvbXBvc2l0ZSBgKG9yZ2FuaXphdGlvbl9pZCwgbmFtZSlgLiBEZWNsYXJpbmcgdGhlIHNpbmdsZS1jb2x1bW5cbiAgLy8gaW5kZXggdG9vIG1ha2VzIHRoZSBwbGF0Zm9ybS13aWRlIGNvbnN0cmFpbnQgd2luIGFuZCBsZWF2ZXMgdGhlIHBlci10ZW5hbnRcbiAgLy8gb25lIHVucmVhY2hhYmxlIChmcmFtZXdvcmsjMzk5MSBgdW5pcXVlL2RvdWJsZS1kZWNsYXJhdGlvbmApIFx1MjAxNCB0aGUgc2FtZVxuICAvLyB0cmFwIGBjcm1fY29udGFjdGAsIGBjcm1fbGVhZGAgYW5kIGBjcm1fcHJvZHVjdGAgZG9jdW1lbnQuIFR3b1xuICAvLyBvcmdhbml6YXRpb25zIG11c3QgYmUgYWJsZSB0byBlYWNoIGhhdmUgdGhlaXIgb3duIFwiQWNtZSBDb3JwXCIuXG4gIGluZGV4ZXM6IFtcbiAgICB7IGZpZWxkczogWydvd25lcl9pZCddIH0sXG4gICAgeyBmaWVsZHM6IFsndHlwZScsICdpc19hY3RpdmUnXSB9LFxuICAgIC8vIFRoZSB0ZXJyaXRvcnkgc2hhcmluZyBydWxlcyBmaWx0ZXIgb24gdGhpcyBjb2x1bW4sIHNvIGl0IGlzIHJlYWQgb24gZXZlcnlcbiAgICAvLyBhY2NvdW50IHF1ZXJ5IGEgdGVycml0b3J5IHJlY2lwaWVudCBtYWtlcy4gYGJpbGxpbmdfY291bnRyeWAgY2FycmllcyBub1xuICAgIC8vIGluZGV4IG9mIGl0cyBvd246IG5vdGhpbmcgZmlsdGVycyBvbiBpdCBcdTIwMTQgaXQgaXMgZGlzcGxheWVkLCBhbmQgY2xhc3NpZmllZFxuICAgIC8vIGludG8gdGhpcyBjb2x1bW4gYnkgdGhlIGhvb2suXG4gICAgeyBmaWVsZHM6IFsndGVycml0b3J5J10gfSxcbiAgICAvLyBMZWFkIGNvbnZlcnNpb24gZmlsdGVycyBvbiB0aGlzIGNvbHVtbiBvbiBldmVyeSBjb252ZXJzaW9uIFx1MjAxNCB0aGUgY29sdW1uXG4gICAgLy8gZXhpc3RzIHRvIHJlcGxhY2UgYW4gdW5pbmRleGVkIGAkcmVnZXhgIHNjYW4uIFBsYWluIGluZGV4LCBOT1RcbiAgICAvLyBgdW5pcXVlOiB0cnVlYCwgZGVsaWJlcmF0ZWx5OlxuICAgIC8vXG4gICAgLy8gMS4gUGVyLXRlbmFudCB1bmlxdWVuZXNzIG9mIGFjY291bnQgbmFtZXMgaXMgYWxyZWFkeSBkZWNsYXJlZCBvbiB0aGVcbiAgICAvLyAgICBgbmFtZWAgZmllbGQuIEEgdW5pcXVlIGBuYW1lX25vcm1hbGl6ZWRgIHdvdWxkIFNVQlNVTUUgaXQgKGVxdWFsIG5hbWVzXG4gICAgLy8gICAgbm9ybWFsaXplIGVxdWFsbHkpIGFuZCBmb3JjZSB0aGF0IGNvbnN0cmFpbnQgdG8gYmUgcmUtZGVjaWRlZC5cbiAgICAvLyAyLiBUaGlzIGNvbHVtbiBpcyBhIE1BVENIIGtleSwgbm90IGEgcG9saWN5LiBSZWplY3RpbmcgYSBuZWFyLWR1cGxpY2F0ZVxuICAgIC8vICAgIG5hbWUgb3V0cmlnaHQgaXMgYSBzZXBhcmF0ZSBkYXRhLXF1YWxpdHkgZGVjaXNpb24sIGFuZCB0aGlzIHJlcG8gaGFzXG4gICAgLy8gICAgYWxyZWFkeSBjaG9zZW4gdGhlIHNvZnQgc2hhcGUgZm9yIHRoYXQgcXVlc3Rpb24gb25jZSAodGhlIGhhcmQgdW5pcXVlXG4gICAgLy8gICAgb24gYGNybV9sZWFkLmVtYWlsYCB3YXMgcmVtb3ZlZCBiZWNhdXNlIHJlZnVzaW5nIGEgcmVwZWF0IGVucXVpcnkgaXNcbiAgICAvLyAgICB3b3JzZSB0aGFuIHJlY29yZGluZyBpdCkuXG4gICAgLy8gMy4gXHUyNkEwXHVGRTBGIE1lYXN1cmVkIGhhemFyZDogYGNyZWF0ZV9pbmRleGAgRkFJTFMgb24gYW55IGRlcGxveW1lbnQgYWxyZWFkeVxuICAgIC8vICAgIGhvbGRpbmcgYEFjbWUgQ29ycGAgYW5kIGBBQ01FICBDb3JwYCBzZXBhcmF0ZWx5LCBzbyBhIHVuaXF1ZSBpbmRleFxuICAgIC8vICAgIGNvdWxkIG5vdCBiZSBhbiB1cGdyYWRlIHN0ZXAgd2l0aG91dCBhIG1lcmdlIHBhc3MgZmlyc3QuIFRoYXQgaGF6YXJkXG4gICAgLy8gICAgaXMgYm91bmRlZCB0b2RheSBPTkxZIGJlY2F1c2UgdGhpcyByZXBvJ3MgZGVwbG95bWVudCBzaGFwZSBpcyBmcmVzaFxuICAgIC8vICAgIGluc3RhbGxzIFx1MjAxNCBzZWUgZG9jcy9NQUlOVEVOQU5DRS5tZCBcdTAwQTczLjMuIFRoZSBjb25jbHVzaW9uIGlzIGNvbmRpdGlvbmFsXG4gICAgLy8gICAgb24gdGhhdCBwcmVtaXNlLCBub3QgdW5pdmVyc2FsLlxuICAgIC8vXG4gICAgLy8gQ29uc2VxdWVuY2UsIHJlY29yZGVkIHJhdGhlciB0aGFuIGhpZGRlbjogdHdvIGFjY291bnRzIENBTiBzdGlsbCBob2xkIHRoZVxuICAgIC8vIHNhbWUgbm9ybWFsaXplZCBuYW1lIGlmIHNvbWV0aGluZyBvdXRzaWRlIHRoZSBmbG93IGNyZWF0ZXMgdGhlbSwgYW5kXG4gICAgLy8gYGdldF9yZWNvcmRgIGhhcyBubyBgc29ydGAgb3B0aW9uLCBzbyB0aGUgY29udmVyc2lvbiB3b3VsZCByZXVzZSBhblxuICAgIC8vIGFyYml0cmFyeSBvbmUuIFJldXNpbmcgb25lIG9mIE4gaXMgc3RpbGwgYmV0dGVyIHRoYW4gY3JlYXRpbmcgdGhlIE4rMXRoLlxuICAgIHsgZmllbGRzOiBbJ25hbWVfbm9ybWFsaXplZCddIH0sXG4gICAgLy8gYHNlYXJjaGFibGVGaWVsZHNgIGNhcnJpZXMgYHJlZ2lzdHJhdGlvbl9udW1iZXJgLCBhbmQgdGhlIG5vdGUgYXQgdGhlIHRvcFxuICAgIC8vIG9mIHRoaXMgZmlsZSByZWNvcmRzIHdoeSB0aG9zZSBtdXN0IGJlIHJlYWwsIGluZGV4ZWQgY29sdW1ucy5cbiAgICB7IGZpZWxkczogWydyZWdpc3RyYXRpb25fbnVtYmVyJ10gfSxcbiAgXSxcbiAgXG4gIC8vIEFQSSBzdXJmYWNlICsgY2FwYWJpbGl0aWVzLiBgZmlsZXNgIGFuZCBgZmVlZHNgIGFyZSBsaXZlIGFuZCBlbmZvcmNlZCAoc2VlXG4gIC8vIHRoZSBjYW5vbmljYWwgbm90ZSBpbiBgc3JjL3NhbGVzL29iamVjdHMvaW5kZXgudHNgKS4gRmllbGQgaGlzdG9yeSBsaXZlcyBvblxuICAvLyBpbmRpdmlkdWFsIGBGaWVsZC50cmFja0hpc3RvcnlgIChBRFItMDA1Mik7IGdsb2JhbCBzZWFyY2ggdXNlc1xuICAvLyBgc2VhcmNoYWJsZUZpZWxkc2AgLyBwZXItZmllbGQgYHNlYXJjaGFibGVgLlxuICBlbmFibGU6IHtcbiAgICBhcGlFbmFibGVkOiB0cnVlLCAgICAgICAvLyBFeHBvc2UgdmlhIFJFU1QvR3JhcGhRTFxuICAgIGFwaU1ldGhvZHM6IFsnZ2V0JywgJ2xpc3QnLCAnY3JlYXRlJywgJ3VwZGF0ZScsICdkZWxldGUnXSwgLy8gV2hpdGVsaXN0IGFsbG93ZWQgQVBJIG9wZXJhdGlvbnNcbiAgICAvLyBDb250cmFjdHMsIG9yZyBjaGFydHMgYW5kIFJGUHMgbGl2ZSBvbiB0aGUgYWNjb3VudCByZWNvcmQuIE9wdC1pbiAoc3BlY1xuICAgIC8vIGRlZmF1bHQgZmFsc2UpOyBhdHRhY2gvZG93bmxvYWQvZGVsZXRlIGF1dGhvcml0eSBpcyB0aGUgcGFyZW50IHJlY29yZCdzXG4gICAgLy8gb3duLCBzbyB0aGlzIGFkZHMgYSBzdXJmYWNlLCBub3QgYSBncmFudC5cbiAgICBmaWxlczogdHJ1ZSxcbiAgfSxcbiAgXG4gIC8vIFx1MjZBMFx1RkUwRiBObyBgd29ya2Zsb3dzW11gIGhlcmUsIGFuZCBub25lIGlzIHBvc3NpYmxlOiBvYmplY3QgYHdvcmtmbG93c1tdYCB3ZXJlXG4gIC8vIHJlbW92ZWQgZnJvbSB0aGUgcGxhdGZvcm0uIEZpZWxkIHVwZGF0ZXMgbGl2ZSBpbiB0aGlzIG9iamVjdCdzIGAqLmhvb2sudHNgO1xuICAvLyBzY2hlZHVsZWQgc3RhdHVzIGZsaXBzIGFuZCBub3RpZmljYXRpb25zIGxpdmUgaW4gYHNyYy8qL2Zsb3dzLyouZmxvdy50c2AuXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvX3BpY2tsaXN0cy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvX3BpY2tsaXN0cy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBTZWxlY3RPcHRpb24gfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcblxuLyoqXG4gKiBDYW5vbmljYWwgcGlja2xpc3QgdmFsdWUgc2V0cyBzaGFyZWQgYWNyb3NzIG9iamVjdHMsIGZsb3dzLCBhbmQgYWN0aW9ucy5cbiAqXG4gKiBTZXZlcmFsIGZpZWxkcyBjYXJyeSB0aGUgc2FtZSBidXNpbmVzcyB2b2NhYnVsYXJ5IG9uIG1vcmUgdGhhbiBvbmUgb2JqZWN0XG4gKiAoYGxlYWRfc291cmNlYCBvbiBMZWFkL0NvbnRhY3QvT3Bwb3J0dW5pdHksIGBpbmR1c3RyeWAgb24gTGVhZC9BY2NvdW50LFxuICogYHNhbHV0YXRpb25gIG9uIExlYWQvQ29udGFjdCwgYHBheW1lbnRfdGVybXNgIG9uIFF1b3RlL0NvbnRyYWN0KSwgYW5kIGEgZmV3XG4gKiBmbG93cy9hY3Rpb25zIHJlLWRlY2xhcmUgYW4gb2JqZWN0J3Mgb3duIG9wdGlvbnMgaW5saW5lIChUYXNrIGB0eXBlYCBpbiB0aGVcbiAqIHNjaGVkdWxlX2ZvbGxvd3VwIHNjcmVlbiwgT3Bwb3J0dW5pdHkgYHN0YWdlYCBpbiBtYXNzX3VwZGF0ZV9zdGFnZSkuIEVhY2hcbiAqIGNvcHkgZHJpZnRlZCBpbmRlcGVuZGVudGx5ICgjNDkwKTogdGhlIGxlYWRfY29udmVyc2lvbiBmbG93IGNvcGllc1xuICogYGxlYWRSZWNvcmQuaW5kdXN0cnlgIC8gYGxlYWRSZWNvcmQubGVhZF9zb3VyY2VgIHZlcmJhdGltIG9udG8gdGhlIGNyZWF0ZWRcbiAqIEFjY291bnQvT3Bwb3J0dW5pdHksIHNvIGFueSBMZWFkLW9ubHkgdmFsdWUgKGBsb2dpc3RpY3NgLCBgd2ViaW5hcmAsIFx1MjAyNilcbiAqIGJlY2FtZSBhbiBpbGxlZ2FsIGVudW0gdmFsdWUgb24gdGhlIHRhcmdldCBvYmplY3QuXG4gKlxuICogRGVjbGFyaW5nIHRoZSBzZXQgT05DRSBoZXJlIGFuZCBzcHJlYWRpbmcgaXQgaW50byBldmVyeSBkZWNsYXJhdGlvbiBrZWVwc1xuICogdGhlIHZvY2FidWxhcmllcyBpZGVudGljYWwgYnkgY29uc3RydWN0aW9uLiBDcm9zcy1vYmplY3QgY29waWVzIChmbG93cyxcbiAqIGNvbnZlcnNpb24gbWFwcGluZ3MpIGFyZSB0aGVuIGFsd2F5cyBsZWdhbC5cbiAqXG4gKiBOT1RFOiBzcHJlYWQgKGBbLi4uWF1gKSBhdCBldmVyeSB1c2Ugc2l0ZSBzbyBlYWNoIE9iamVjdFNjaGVtYSBnZXRzIGl0cyBvd25cbiAqIGFycmF5IGluc3RhbmNlIFx1MjAxNCBzY2hlbWFzIG11c3Qgbm90IGFsaWFzIG9uZSBhbm90aGVyJ3MgbWV0YWRhdGEuXG4gKi9cblxuLyoqIFNhbHV0YXRpb24gXHUyMDE0IExlYWQgKyBDb250YWN0LiBTdXBlcnNldCAoaW5jbC4gYHByb2ZgLCBmb3JtZXJseSBDb250YWN0LW9ubHkpLiAqL1xuZXhwb3J0IGNvbnN0IFNBTFVUQVRJT05fT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gIHsgbGFiZWw6ICdNci4nLCB2YWx1ZTogJ21yJyB9LFxuICB7IGxhYmVsOiAnTXMuJywgdmFsdWU6ICdtcycgfSxcbiAgeyBsYWJlbDogJ01ycy4nLCB2YWx1ZTogJ21ycycgfSxcbiAgeyBsYWJlbDogJ0RyLicsIHZhbHVlOiAnZHInIH0sXG4gIHsgbGFiZWw6ICdQcm9mLicsIHZhbHVlOiAncHJvZicgfSxcbl07XG5cbi8qKlxuICogSW5kdXN0cnkgXHUyMDE0IExlYWQgKyBBY2NvdW50LiBTdXBlcnNldCAoZm9ybWVybHkgMTUgb24gTGVhZCwgNiBvbiBBY2NvdW50KTtcbiAqIGxlYWRfY29udmVyc2lvbiBjb3BpZXMgYGxlYWRSZWNvcmQuaW5kdXN0cnlgIG9udG8gdGhlIGNyZWF0ZWQgQWNjb3VudCwgc29cbiAqIEFjY291bnQgTVVTVCBhY2NlcHQgZXZlcnkgTGVhZCB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IElORFVTVFJZX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnVGVjaG5vbG9neScsICAgICAgICAgIHZhbHVlOiAndGVjaG5vbG9neScgfSxcbiAgeyBsYWJlbDogJ1NvZnR3YXJlIC8gU2FhUycsICAgICB2YWx1ZTogJ3NvZnR3YXJlJyB9LFxuICB7IGxhYmVsOiAnRmluYW5jZScsICAgICAgICAgICAgIHZhbHVlOiAnZmluYW5jZScgfSxcbiAgeyBsYWJlbDogJ0hlYWx0aGNhcmUnLCAgICAgICAgICB2YWx1ZTogJ2hlYWx0aGNhcmUnIH0sXG4gIHsgbGFiZWw6ICdSZXRhaWwnLCAgICAgICAgICAgICAgdmFsdWU6ICdyZXRhaWwnIH0sXG4gIHsgbGFiZWw6ICdNYW51ZmFjdHVyaW5nJywgICAgICAgdmFsdWU6ICdtYW51ZmFjdHVyaW5nJyB9LFxuICB7IGxhYmVsOiAnRWR1Y2F0aW9uJywgICAgICAgICAgIHZhbHVlOiAnZWR1Y2F0aW9uJyB9LFxuICB7IGxhYmVsOiAnUmVhbCBFc3RhdGUnLCAgICAgICAgIHZhbHVlOiAncmVhbF9lc3RhdGUnIH0sXG4gIHsgbGFiZWw6ICdNZWRpYSAmIEVudGVydGFpbm1lbnQnLCB2YWx1ZTogJ21lZGlhJyB9LFxuICB7IGxhYmVsOiAnTG9naXN0aWNzJywgICAgICAgICAgIHZhbHVlOiAnbG9naXN0aWNzJyB9LFxuICB7IGxhYmVsOiAnSG9zcGl0YWxpdHknLCAgICAgICAgIHZhbHVlOiAnaG9zcGl0YWxpdHknIH0sXG4gIHsgbGFiZWw6ICdFbmVyZ3kgJiBVdGlsaXRpZXMnLCAgdmFsdWU6ICdlbmVyZ3knIH0sXG4gIHsgbGFiZWw6ICdHb3Zlcm5tZW50JywgICAgICAgICAgdmFsdWU6ICdnb3Zlcm5tZW50JyB9LFxuICB7IGxhYmVsOiAnTm9uLXByb2ZpdCcsICAgICAgICAgIHZhbHVlOiAnbm9ucHJvZml0JyB9LFxuICB7IGxhYmVsOiAnT3RoZXInLCAgICAgICAgICAgICAgIHZhbHVlOiAnb3RoZXInIH0sXG5dO1xuXG4vKipcbiAqIExlYWQgU291cmNlIFx1MjAxNCBMZWFkICsgQ29udGFjdCArIE9wcG9ydHVuaXR5LiBTdXBlcnNldCAoZm9ybWVybHkgMTIvNS82KTtcbiAqIGxlYWRfY29udmVyc2lvbiBjb3BpZXMgYGxlYWRSZWNvcmQubGVhZF9zb3VyY2VgIG9udG8gdGhlIGNyZWF0ZWRcbiAqIE9wcG9ydHVuaXR5LCBzbyBPcHBvcnR1bml0eSBNVVNUIGFjY2VwdCBldmVyeSBMZWFkIHZhbHVlLlxuICovXG5leHBvcnQgY29uc3QgTEVBRF9TT1VSQ0VfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gIHsgbGFiZWw6ICdXZWInLCAgICAgICAgICAgICB2YWx1ZTogJ3dlYicgfSxcbiAgeyBsYWJlbDogJ1JlZmVycmFsJywgICAgICAgIHZhbHVlOiAncmVmZXJyYWwnIH0sXG4gIHsgbGFiZWw6ICdFdmVudCAvIFRyYWRlIFNob3cnLCB2YWx1ZTogJ2V2ZW50JyB9LFxuICB7IGxhYmVsOiAnV2ViaW5hcicsICAgICAgICAgdmFsdWU6ICd3ZWJpbmFyJyB9LFxuICB7IGxhYmVsOiAnUGFydG5lcicsICAgICAgICAgdmFsdWU6ICdwYXJ0bmVyJyB9LFxuICB7IGxhYmVsOiAnQWR2ZXJ0aXNlbWVudCcsICAgdmFsdWU6ICdhZHZlcnRpc2VtZW50JyB9LFxuICB7IGxhYmVsOiAnUGFpZCBTZWFyY2gnLCAgICAgdmFsdWU6ICdwYWlkX3NlYXJjaCcgfSxcbiAgeyBsYWJlbDogJ1NvY2lhbCBNZWRpYScsICAgIHZhbHVlOiAnc29jaWFsJyB9LFxuICB7IGxhYmVsOiAnQ29udGVudCAvIEJsb2cnLCAgdmFsdWU6ICdjb250ZW50JyB9LFxuICB7IGxhYmVsOiAnQ29sZCBDYWxsJywgICAgICAgdmFsdWU6ICdjb2xkX2NhbGwnIH0sXG4gIHsgbGFiZWw6ICdFbWFpbCBDYW1wYWlnbicsICB2YWx1ZTogJ2VtYWlsX2NhbXBhaWduJyB9LFxuICB7IGxhYmVsOiAnT3RoZXInLCAgICAgICAgICAgdmFsdWU6ICdvdGhlcicgfSxcbl07XG5cbi8qKlxuICogUGF5bWVudCBUZXJtcyBcdTIwMTQgUXVvdGUgKyBDb250cmFjdC4gU3VwZXJzZXQgKGluY2wuIGBkdWVfb25fcmVjZWlwdGAsXG4gKiBmb3JtZXJseSBRdW90ZS1vbmx5KTogYW4gYWNjZXB0ZWQgcXVvdGUncyB0ZXJtcyBjYXJyeSBvdmVyIHRvIHRoZSBjb250cmFjdCxcbiAqIHNvIHRoZSBjb250cmFjdCB2b2NhYnVsYXJ5IG11c3QgY292ZXIgZXZlcnkgcXVvdGUgdmFsdWUuXG4gKlxuICogVGhlIGNhcnJ5LW92ZXIgaXMgYHF1b3RlX2FjY2VwdGVkX2NvbnRyYWN0X2RyYWZ0YCBpbiBgc3JjL3JldmVudWUvb2JqZWN0cy9xdW90ZS5ob29rLnRzYCwgbmFtZWRcbiAqIGhlcmUgYmVjYXVzZSB0aGlzIHJhdGlvbmFsZSBzcGVudCBpdHMgZmlyc3QgbW9udGhzIHVuZW5mb3JjZWQgKCM4NzMpOiB0aGVcbiAqIGhvb2sgZHJhZnRlZCB0aGUgY29udHJhY3Qgd2l0aG91dCBgcGF5bWVudF90ZXJtc2AsIHNvIGV2ZXJ5IGFjY2VwdGVkIHF1b3RlXG4gKiBwcm9kdWNlZCBhIGNvbnRyYWN0IG9uIHRoZSBgbmV0XzMwYCBvcHRpb24gZGVmYXVsdCBiZWxvdyByZWdhcmRsZXNzIG9mIHdoYXRcbiAqIHdhcyBuZWdvdGlhdGVkIFx1MjAxNCBhIHNoYXJlZCB2b2NhYnVsYXJ5IGp1c3RpZmllZCBieSBhIGNvcHkgdGhhdCBkaWQgbm90IGV4aXN0LlxuICogQSBjb21tZW50IHRoYXQgbmFtZXMgaXRzIGVuZm9yY2VyIGNhbiBiZSBjaGVja2VkOyB0aGlzIG9uZSBjb3VsZCBub3QgYmUuXG4gKi9cbmV4cG9ydCBjb25zdCBQQVlNRU5UX1RFUk1TX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnTmV0IDE1JywgdmFsdWU6ICduZXRfMTUnIH0sXG4gIHsgbGFiZWw6ICdOZXQgMzAnLCB2YWx1ZTogJ25ldF8zMCcsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBsYWJlbDogJ05ldCA2MCcsIHZhbHVlOiAnbmV0XzYwJyB9LFxuICB7IGxhYmVsOiAnTmV0IDkwJywgdmFsdWU6ICduZXRfOTAnIH0sXG4gIHsgbGFiZWw6ICdEdWUgb24gUmVjZWlwdCcsIHZhbHVlOiAnZHVlX29uX3JlY2VpcHQnIH0sXG5dO1xuXG4vKipcbiAqIFRhc2sgVHlwZSBcdTIwMTQgY3JtX3Rhc2sudHlwZSwgYWxzbyByZS1yZW5kZXJlZCBhcyB0aGUgYGFjdGl2aXR5VHlwZWAgc2VsZWN0IGluXG4gKiB0aGUgc2NoZWR1bGVfZm9sbG93dXAgc2NyZWVuIGZsb3cgKHdoaWNoIGhhZCBkcmlmdGVkIHRvIGEgNS12YWx1ZSBjb3B5XG4gKiBtaXNzaW5nIGBvdGhlcmApLlxuICovXG5leHBvcnQgY29uc3QgVEFTS19UWVBFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnQ2FsbCcsIHZhbHVlOiAnY2FsbCcgfSxcbiAgeyBsYWJlbDogJ0VtYWlsJywgdmFsdWU6ICdlbWFpbCcgfSxcbiAgeyBsYWJlbDogJ01lZXRpbmcnLCB2YWx1ZTogJ21lZXRpbmcnIH0sXG4gIHsgbGFiZWw6ICdGb2xsb3ctdXAnLCB2YWx1ZTogJ2ZvbGxvd191cCcgfSxcbiAgeyBsYWJlbDogJ0RlbW8nLCB2YWx1ZTogJ2RlbW8nIH0sXG4gIHsgbGFiZWw6ICdPdGhlcicsIHZhbHVlOiAnb3RoZXInIH0sXG5dO1xuXG4vKipcbiAqIE9wcG9ydHVuaXR5IFN0YWdlIFx1MjAxNCBjcm1fb3Bwb3J0dW5pdHkuc3RhZ2UsIGFsc28gcmUtcmVuZGVyZWQgYXMgdGhlIGBzdGFnZWBcbiAqIHBhcmFtIG9mIHRoZSBtYXNzX3VwZGF0ZV9zdGFnZSBhY3Rpb24uIENvbG9ycy9kZWZhdWx0IG9ubHkgbWF0dGVyIG9uIHRoZVxuICogb2JqZWN0IHNjaGVtYTsgdXNlIHtAbGluayBwbGFpbk9wdGlvbnN9IHdoZXJlIGEgc2NyZWVuL3BhcmFtIHNlbGVjdCB3YW50c1xuICogYmFyZSBsYWJlbC92YWx1ZSBwYWlycy5cbiAqL1xuZXhwb3J0IGNvbnN0IE9QUE9SVFVOSVRZX1NUQUdFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnUHJvc3BlY3RpbmcnLCB2YWx1ZTogJ3Byb3NwZWN0aW5nJywgY29sb3I6ICcjODA4MDgwJywgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IGxhYmVsOiAnUXVhbGlmaWNhdGlvbicsIHZhbHVlOiAncXVhbGlmaWNhdGlvbicsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgeyBsYWJlbDogJ05lZWRzIEFuYWx5c2lzJywgdmFsdWU6ICduZWVkc19hbmFseXNpcycsIGNvbG9yOiAnI0ZGRDcwMCcgfSxcbiAgeyBsYWJlbDogJ1Byb3Bvc2FsJywgdmFsdWU6ICdwcm9wb3NhbCcsIGNvbG9yOiAnIzQxNjlFMScgfSxcbiAgeyBsYWJlbDogJ05lZ290aWF0aW9uJywgdmFsdWU6ICduZWdvdGlhdGlvbicsIGNvbG9yOiAnIzkzNzBEQicgfSxcbiAgeyBsYWJlbDogJ0Nsb3NlZCBXb24nLCB2YWx1ZTogJ2Nsb3NlZF93b24nLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gIHsgbGFiZWw6ICdDbG9zZWQgTG9zdCcsIHZhbHVlOiAnY2xvc2VkX2xvc3QnLCBjb2xvcjogJyNGRjAwMDAnIH0sXG5dO1xuXG4vKipcbiAqIEV2ZW50IFR5cGUgXHUyMDE0IGNybV9ldmVudC50eXBlLCBhbmQgdGhlIGBraW5kYCBkaXNjcmltaW5hdG9yIHRoZSBwZXItb2JqZWN0XG4gKiBhY3Rpdml0eSBhY3Rpb25zIHN0YW1wIG9uIHRoZSBgY3JtX2V2ZW50YCByb3cgdGhleSBpbnNlcnQgKCM1OTIpLlxuICpcbiAqIERpc3RpbmN0IGZyb20ge0BsaW5rIFRBU0tfVFlQRV9PUFRJT05TfSBvbiBwdXJwb3NlOiBhIFRhc2sgaXMgc29tZXRoaW5nIGEgcmVwXG4gKiBzdGlsbCBvd2VzIHNvbWVvbmUsIGFuIEV2ZW50IGlzIGFuIGludGVyYWN0aW9uIHRoYXQgb2NjdXBpZXMgYSBzbG90IG9uIHRoZVxuICogY2FsZW5kYXIuIGBlbWFpbGAgaXMgdGhlcmVmb3JlIGFic2VudCBoZXJlIChhbiBlbWFpbCBpcyBub3QgYSBtZWV0aW5nIHNsb3Q7XG4gKiBpdCBzdGF5cyBhIGBzeXNfZW1haWxgICsgYHN5c19hY3Rpdml0eWAgcGFpcikgYW5kIGB3ZWJpbmFyYCAvIGBvbnNpdGVfdmlzaXRgXG4gKiBhcmUgcHJlc2VudCwgYmVjYXVzZSB0aG9zZSBhcmUgdGhlIG1lZXRpbmcgc2hhcGVzIGEgcmVwIGJvb2tzLlxuICovXG5leHBvcnQgY29uc3QgRVZFTlRfVFlQRV9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgeyBsYWJlbDogJ01lZXRpbmcnLCAgICAgIHZhbHVlOiAnbWVldGluZycsICAgICAgIGNvbG9yOiAnIzQxNjlFMScsIGRlZmF1bHQ6IHRydWUgfSxcbiAgeyBsYWJlbDogJ0NhbGwnLCAgICAgICAgIHZhbHVlOiAnY2FsbCcsICAgICAgICAgIGNvbG9yOiAnIzAwQUEwMCcgfSxcbiAgeyBsYWJlbDogJ0RlbW8nLCAgICAgICAgIHZhbHVlOiAnZGVtbycsICAgICAgICAgIGNvbG9yOiAnIzkzNzBEQicgfSxcbiAgeyBsYWJlbDogJ1dlYmluYXInLCAgICAgIHZhbHVlOiAnd2ViaW5hcicsICAgICAgIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgeyBsYWJlbDogJ09uc2l0ZSBWaXNpdCcsIHZhbHVlOiAnb25zaXRlX3Zpc2l0JywgIGNvbG9yOiAnIzBFQTVFOScgfSxcbiAgeyBsYWJlbDogJ090aGVyJywgICAgICAgIHZhbHVlOiAnb3RoZXInLCAgICAgICAgIGNvbG9yOiAnIzgwODA4MCcgfSxcbl07XG5cbi8qKlxuICogRXZlbnQgU3RhdHVzIFx1MjAxNCBjcm1fZXZlbnQuc3RhdHVzLlxuICpcbiAqIFRoZSBgcGxhbm5lZGAgXHUyMTkyIGBoZWxkYCB0cmFuc2l0aW9uIGlzIHdoYXQgc2VwYXJhdGVzIFwiYSBtZWV0aW5nIGlzIGJvb2tlZFwiXG4gKiBmcm9tIFwiYW4gaW50ZXJhY3Rpb24gaGFwcGVuZWRcIiwgYW5kIG9ubHkgdGhlIHNlY29uZCBvbmUgYnVtcHNcbiAqIGBjcm1fYWNjb3VudC5sYXN0X2FjdGl2aXR5X2RhdGVgIChzZWUgYGV2ZW50Lmhvb2sudHNgKS4gV2l0aG91dCB0aGF0IHNwbGl0IGFcbiAqIG1lZXRpbmcgYm9va2VkIGZvciBuZXh0IHF1YXJ0ZXIgd291bGQgcmVzZXQgdGhlIGNodXJuIGNsb2NrIHRvZGF5LlxuICovXG5leHBvcnQgY29uc3QgRVZFTlRfU1RBVFVTX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnUGxhbm5lZCcsICAgdmFsdWU6ICdwbGFubmVkJywgICBjb2xvcjogJyM0MTY5RTEnLCBkZWZhdWx0OiB0cnVlIH0sXG4gIHsgbGFiZWw6ICdIZWxkJywgICAgICB2YWx1ZTogJ2hlbGQnLCAgICAgIGNvbG9yOiAnIzAwQUEwMCcgfSxcbiAgeyBsYWJlbDogJ0NhbmNlbGxlZCcsIHZhbHVlOiAnY2FuY2VsbGVkJywgY29sb3I6ICcjOTk5OTk5JyB9LFxuICB7IGxhYmVsOiAnTm8gU2hvdycsICAgdmFsdWU6ICdub19zaG93JywgICBjb2xvcjogJyNGRjQ1MDAnIH0sXG5dO1xuXG4vKipcbiAqIEF0dGVuZGVlIFJlc3BvbnNlIFx1MjAxNCBjcm1fZXZlbnRfYXR0ZW5kZWUucmVzcG9uc2UuXG4gKlxuICogVGhlIHJlYXNvbiBhdHRlbmRlZXMgYXJlIFJFQ09SRFMgcmF0aGVyIHRoYW4gYSBKU09OIHN0cmluZyBvbiB0aGUgYWN0aXZpdHlcbiAqICgjNTkyIGFjY2VwdGFuY2UpOiBhIHBlci1hdHRlbmRlZSByZXNwb25zZSBvbmx5IGV4aXN0cyBpZiB0aGUgYXR0ZW5kZWUgZG9lcy5cbiAqL1xuZXhwb3J0IGNvbnN0IEFUVEVOREVFX1JFU1BPTlNFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnTm8gUmVzcG9uc2UnLCB2YWx1ZTogJ25vX3Jlc3BvbnNlJywgY29sb3I6ICcjODA4MDgwJywgZGVmYXVsdDogdHJ1ZSB9LFxuICB7IGxhYmVsOiAnQWNjZXB0ZWQnLCAgICB2YWx1ZTogJ2FjY2VwdGVkJywgICAgY29sb3I6ICcjMDBBQTAwJyB9LFxuICB7IGxhYmVsOiAnRGVjbGluZWQnLCAgICB2YWx1ZTogJ2RlY2xpbmVkJywgICAgY29sb3I6ICcjRkYwMDAwJyB9LFxuICB7IGxhYmVsOiAnVGVudGF0aXZlJywgICB2YWx1ZTogJ3RlbnRhdGl2ZScsICAgY29sb3I6ICcjRkZBNTAwJyB9LFxuXTtcblxuLyoqXG4gKiBQb2x5bW9ycGhpYyBcIlJlbGF0ZWQgVG9cIiB0eXBlIFx1MjAxNCBjcm1fdGFzay5yZWxhdGVkX3RvX3R5cGUgYW5kXG4gKiBjcm1fZXZlbnQucmVsYXRlZF90b190eXBlLlxuICpcbiAqIEJvdGggYWN0aXZpdHkgb2JqZWN0cyBjYXJyeSB0aGUgc2FtZSBmaXZlIGByZWxhdGVkX3RvXypgIGxvb2t1cHMsIGFuZCBib3RoXG4gKiBob29rcyBidWJibGUgcmVjZW5jeSB0aHJvdWdoIHRoZSBzYW1lIGByZWxhdGVkX3RvX3R5cGUgXHUyMTkyIGxvb2t1cCBmaWVsZGAgbWFwLlxuICogRGVjbGFyZWQgb25jZSBzbyB0aGUgdm9jYWJ1bGFyeSBvZiB0aGUgZGlzY3JpbWluYXRvciBjYW5ub3QgZHJpZnQgZnJvbSB0aGVcbiAqIHNldCBvZiBsb29rdXBzIHRoYXQgYmFjayBpdCBcdTIwMTQgYSBkcmlmdCB0aGF0IHJlYWRzIGFzIFwidGhlIGJ1YmJsZSBzaWxlbnRseVxuICogc3RvcHBlZCBmaXJpbmcgZm9yIG9uZSBvYmplY3QgdHlwZVwiLlxuICovXG5leHBvcnQgY29uc3QgUkVMQVRFRF9UT19UWVBFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnQWNjb3VudCcsICAgICB2YWx1ZTogJ2NybV9hY2NvdW50JyB9LFxuICB7IGxhYmVsOiAnQ29udGFjdCcsICAgICB2YWx1ZTogJ2NybV9jb250YWN0JyB9LFxuICB7IGxhYmVsOiAnT3Bwb3J0dW5pdHknLCB2YWx1ZTogJ2NybV9vcHBvcnR1bml0eScgfSxcbiAgeyBsYWJlbDogJ0xlYWQnLCAgICAgICAgdmFsdWU6ICdjcm1fbGVhZCcgfSxcbiAgeyBsYWJlbDogJ0Nhc2UnLCAgICAgICAgdmFsdWU6ICdjcm1fY2FzZScgfSxcbl07XG5cbi8qKlxuICogRHVwbGljYXRlIE9mIFx1MjAxNCBjcm1fbGVhZC5kdXBsaWNhdGVfb2ZfdHlwZSwgdGhlIGRpc2NyaW1pbmF0b3IgaGFsZiBvZiB0aGVcbiAqIGBkdXBsaWNhdGVfb2ZfbGVhZGAgLyBgZHVwbGljYXRlX29mX2NvbnRhY3RgIHBhaXIgKCM1OTgpLlxuICpcbiAqIFR3byB2b2NhYnVsYXJpZXMsIGRlbGliZXJhdGVseSwgYW5kIHRoZSBzcGxpdCBpcyB0aGUgZW5mb3JjZW1lbnQ6XG4gKlxuICogICAtIHtAbGluayBEVVBMSUNBVEVfT0ZfVFlQRV9BVVRIT1JBQkxFX09QVElPTlN9IGlzIHdoYXQgYSBodW1hbiBtYXkgcGljay4gRWFjaFxuICogICAgIHZhbHVlIG5hbWVzIGFuIG9iamVjdCwgYW5kIGBsZWFkLm9iamVjdC50c2AgcGFpcnMgaXQgd2l0aCB0aGF0IG9iamVjdCdzXG4gKiAgICAgbG9va3VwIHRocm91Z2ggYHJlcXVpcmVkV2hlbmAsIHNvIGNob29zaW5nIG9uZSBkZW1hbmRzIGEgcmVjb3JkLlxuICogICAtIHtAbGluayBEVVBMSUNBVEVfT0ZfVFlQRV9PUFRJT05TfSBpcyB3aGF0IHRoZSBDT0xVTU4gbWF5IGhvbGQuIEl0IGlzIHRoZVxuICogICAgIGF1dGhvcmFibGUgc2V0IHBsdXMge0BsaW5rIERVUExJQ0FURV9PRl9UWVBFX0VSQVNFRH0sIGEgdG9tYnN0b25lIG5vXG4gKiAgICAgYXV0aG9yIHdyaXRlcy5cbiAqXG4gKiBUaGUgZm9ybSBzcHJlYWRzIHRoZSBhdXRob3JhYmxlIHNldCAoYHNyYy9zYWxlcy92aWV3cy9sZWFkLnZpZXcudHNgKSBhbmQgdGhlIG9iamVjdFxuICogc3ByZWFkcyB0aGUgZnVsbCBvbmUsIHNvIHRoZSB0b21ic3RvbmUgaXMgdW5waWNrYWJsZSBCWSBDT05TVFJVQ1RJT04gcmF0aGVyXG4gKiB0aGFuIGJ5IGEgaGFuZC1tYWludGFpbmVkIGV4Y2x1c2lvbiBsaXN0OiBhIGZvdXJ0aCBhdXRob3JhYmxlIG9iamVjdCB0eXBlXG4gKiBhZGRlZCBiZWxvdyByZWFjaGVzIHRoZSBmb3JtIGF1dG9tYXRpY2FsbHksIGFuZCB0aGUgdG9tYnN0b25lIG5ldmVyIGRvZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBEVVBMSUNBVEVfT0ZfVFlQRV9BVVRIT1JBQkxFX09QVElPTlM6IFNlbGVjdE9wdGlvbltdID0gW1xuICB7IGxhYmVsOiAnTGVhZCcsICAgIHZhbHVlOiAnY3JtX2xlYWQnIH0sXG4gIHsgbGFiZWw6ICdDb250YWN0JywgdmFsdWU6ICdjcm1fY29udGFjdCcgfSxcbl07XG5cbi8qKlxuICogVGhlIHRvbWJzdG9uZSAoIzExNjQpOiBcInRoaXMgbGVhZCB3YXMgY29uZmlybWVkIGEgZHVwbGljYXRlIG9mIGEgcmVjb3JkIHRoYXRcbiAqIGhhcyBzaW5jZSBiZWVuIGVyYXNlZC5cIlxuICpcbiAqIEl0IGV4aXN0cyBiZWNhdXNlIG9uIHRoZSByZWNvcmQgXHUyMDE0IHdoaWNoIGlzIGFsbCBhIHZhbGlkYXRpb24gY2FuIHNlZSwgYmVpbmdcbiAqIGV2YWx1YXRlZCBhZ2FpbnN0IGB7Li4ucHJldmlvdXMsIC4uLmRhdGF9YCBcdTIwMTQgXCJ0aGUgcG9pbnRlciB3YXMgZXJhc2VkXCIgYW5kXG4gKiBcInRoaXMgY2xhaW0gbmV2ZXIgbmFtZWQgYW55b25lXCIgd2VyZSB0aGUgU0FNRSBzdGF0ZS4gRXZlcnkgd2F5IG9mIHRlYWNoaW5nIGFcbiAqIHJ1bGUgdG8gdG9sZXJhdGUgdGhlIGZpcnN0IGFsc28gYWRtaXR0ZWQgdGhlIHNlY29uZCwgd2hpY2ggaXMgd2h5IHRoZSBlcmFzdXJlXG4gKiBwYXRoIGNvdWxkIG5vdCBiZSBjbGVhcmVkIGJ5IHJlbGF4aW5nIGFueXRoaW5nIChtZWFzdXJlZCBpbiBmdWxsIG9uICMxMTY0KS5cbiAqIEdpdmluZyB0aGUgdHdvIHN0YXRlcyBkaWZmZXJlbnQgdmFsdWVzIG1ha2VzIHRoZW0gZGlmZmVyZW50IGZhY3RzLCBhbmQgdGhlblxuICogbm8gcnVsZSBoYXMgdG8gYmUgbG9vc2VuZWQgYXQgYWxsOiB0aGUgYHJlcXVpcmVkV2hlbmAgcGFpcmluZyBmaXJlcyBvbmx5IG9uXG4gKiBgY3JtX2xlYWRgIC8gYGNybV9jb250YWN0YCBzbyBpdCBuZXZlciBzZWVzIHRoaXMgdmFsdWUsIGFuZFxuICogYGR1cGxpY2F0ZV9kaXNxdWFsaWZpY2F0aW9uX3JlcXVpcmVzX3N1cnZpdm9yYCBhc2tzIGZvciBhIE5PTi1CTEFOSyB0eXBlLFxuICogd2hpY2ggdGhpcyBpcy5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgbm90IGFuIG9iamVjdCBuYW1lOiBpdCBpcyB0aGUgYW5zd2VyIHRvIFwid2hpY2ggb2JqZWN0IGhvbGRzIHRoZVxuICogc3Vydml2b3JcIiB3aGVuIHRoZSBhbnN3ZXIgaXMgXCJub25lLCBhbnkgbW9yZVwiLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBgbGVhZF9kdXBsaWNhdGVfY2hlY2tgIChgbGVhZC5ob29rLnRzYCwgam9iIDFjKSBpcyB0aGUgT05MWSB3cml0ZXIsIGFuZCBpdFxuICogc3BlbGxzIHRoZSB2YWx1ZSBhcyBhbiBpbmxpbmUgbGl0ZXJhbCBcdTIwMTQgTDIgaG9vayBib2RpZXMgcnVuIGJvZHktb25seSBpbiB0aGVcbiAqIFF1aWNrSlMgc2FuZGJveCwgc28gYSBtb2R1bGUgY29uc3RhbnQgcmVzb2x2ZXMgYXQgYXV0aG9yaW5nIHRpbWUgYW5kIGFycml2ZXNcbiAqIGFzIGB1bmRlZmluZWRgIChzYW1lIGNvbnN0cmFpbnQgYXMgdGhlIFNMQSBtYXRyaXggaW4gYGNhc2UuaG9vay50c2ApLiBUaGUgdHdvXG4gKiBzcGVsbGluZ3MgYXJlIHBpbm5lZCB0b2dldGhlciwgYW5kIHRoZSB3cml0ZXIgcGlubmVkIHRvIHRoYXQgb25lIHNpdGUsIGJ5XG4gKiBgdGVzdC9sZWFkLWR1cGxpY2F0ZS1tYW5hZ2VtZW50LnRlc3QudHNgLlxuICovXG5leHBvcnQgY29uc3QgRFVQTElDQVRFX09GX1RZUEVfRVJBU0VEID0gJ2VyYXNlZCc7XG5cbi8qKiBUaGUgZnVsbCBjb2x1bW4gdm9jYWJ1bGFyeTogd2hhdCBhbiBhdXRob3IgbWF5IHBpY2ssIHBsdXMgdGhlIHRvbWJzdG9uZS4gKi9cbmV4cG9ydCBjb25zdCBEVVBMSUNBVEVfT0ZfVFlQRV9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgLi4uRFVQTElDQVRFX09GX1RZUEVfQVVUSE9SQUJMRV9PUFRJT05TLFxuICB7IGxhYmVsOiAnRXJhc2VkIFJlY29yZCcsIHZhbHVlOiBEVVBMSUNBVEVfT0ZfVFlQRV9FUkFTRUQgfSxcbl07XG5cbi8qKiBQcm9qZWN0IGEgY2Fub25pY2FsIHNldCBkb3duIHRvIGJhcmUgYHsgbGFiZWwsIHZhbHVlIH1gIHBhaXJzIGZvciBmbG93XG4gKiBzY3JlZW5zIGFuZCBhY3Rpb24gcGFyYW1zLCB3aGljaCBkb24ndCB1bmRlcnN0YW5kIGNvbG9yL2RlZmF1bHQga2V5cy4gKi9cbmV4cG9ydCBjb25zdCBwbGFpbk9wdGlvbnMgPSAob3B0aW9uczogU2VsZWN0T3B0aW9uW10pOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdID0+XG4gIG9wdGlvbnMubWFwKCh7IGxhYmVsLCB2YWx1ZSB9KSA9PiAoeyBsYWJlbCwgdmFsdWUgfSkpO1xuXG4vKipcbiAqIE5lZWQgVHlwZSBcdTIwMTQgYGNybV9sZWFkLm5lZWRfdHlwZWAsIHRoZSBhbnN3ZXIgdG8gXCJ3aGF0IGlzIHRoaXMgcHJvc3BlY3RcbiAqIGFza2luZyBmb3JcIiAoUkVRLTAwMDUgc3RlcCA2LCBcdTk3MDBcdTZDNDJcdTdDN0JcdTU3OEIpLlxuICpcbiAqIEEgR0VORVJJQyBTVEFSVEVSIFNFVCwgYW5kIHRoYXQgaXMgdGhlIGRpc3Bvc2l0aW9uIHJhdGhlciB0aGFuIGFuIGFwb2xvZ3lcbiAqIGZvciBhIHNob3J0IGxpc3Q6IFJFUS0wMDA1IHJ1bGVzIHRoZSAqc2xvdCogc3RhbmRhcmQgYW5kIHRoZSAqdmFsdWVzKlxuICogY29uZmlndXJhdGlvbiBcdTIwMTQgXCJhIGN1c3RvbWVyJ3Mgb3duIGRlbWFuZCB0YXhvbm9teSBpcyBvdmVybGF5IGNvbmZpZ3VyYXRpb25cbiAqIHRoZSBzYW1lIHdheSBgaW5kdXN0cnlgIHZhbHVlcyBhcmVcIi4gU28gdGhlc2Ugc2V2ZW4gYXJlIHRoZSB2b2NhYnVsYXJ5IGFcbiAqIGZyZXNoIGluc3RhbGwgcm91dGVzIGFuZCByZXBvcnRzIG9uIHVudGlsIGFuIG92ZXJsYXkgcmVwbGFjZXMgdGhlbSwgYW5kXG4gKiByZXBsYWNpbmcgdGhlbSBpcyBhIG9uZS1zaXRlIGVkaXQgYmVjYXVzZSB0aGUgc2V0IGlzIGRlY2xhcmVkIGhlcmUuXG4gKlxuICogXHUyNkEwXHVGRTBGIE5PVCB0aGUgc2FtZSBheGlzIGFzIGBjcm1fb3Bwb3J0dW5pdHkudHlwZWAsIGFuZCBcdTI2RDQgbmV2ZXIgZm9sZGVkIGludG8gaXQuXG4gKiBUaGF0IGZpZWxkIGFuc3dlcnMgXCJpcyB0aGlzIG5ldyBidXNpbmVzcywgYW4gdXBncmFkZSwgYSByZW5ld2FsIG9yIGFuXG4gKiBleHBhbnNpb25cIiBcdTIwMTQgdGhlIGN1c3RvbWVyIFJFTEFUSU9OU0hJUCB0aGUgZGVhbCBjaGFuZ2VzLiBUaGlzIG9uZSBhbnN3ZXJzXG4gKiB3aGF0IHRoZSBidXllciB3YW50cyBkZWxpdmVyZWQsIHdoaWNoIGlzIG9ydGhvZ29uYWw6IGEgcmVuZXdhbCBvZiBhIHN1cHBvcnRcbiAqIGNvbnRyYWN0IGFuZCBhIHJlbmV3YWwgb2YgYSBjb25zdWx0aW5nIGVuZ2FnZW1lbnQgZGlmZmVyIGhlcmUgYW5kIG5vdCB0aGVyZS5cbiAqIFRoZXkgYXJlIGRlbGliZXJhdGVseSBub3Qgc2hhcmVkLCBzbyBcdTI2RDQgZG8gbm90IHNwcmVhZCB0aGlzIHNldCBvbnRvXG4gKiBgY3JtX29wcG9ydHVuaXR5YCB0byBtYWtlIGEgY29udmVyc2lvbiBtYXBwaW5nIHBvc3NpYmxlLlxuICpcbiAqIFNJTkdMRS12YWx1ZWQsIGZvciB0aGUgcmVhc29uIGBjcm1fY29udGFjdC5idXlpbmdfZnVuY3Rpb25gIHJlY29yZHM6IGFcbiAqIGdyb3VwZWQgbGlzdCB2aWV3IGFuc3dlcnMgd2l0aCBvbmUgc2VydmVyLXNpZGUgYWdncmVnYXRlIHBlciByYXcgc3RvcmVkXG4gKiB2YWx1ZSwgc28gYSBgbXVsdGlwbGU6IHRydWVgIGNvbHVtbiBncm91cHMgYnkgdGhlIENPTUJJTkFUSU9OIGFuZCBsb3NlcyB0aGVcbiAqIGdyb3VwYWJpbGl0eSBSRVEtMDAwNSBhY2NlcHRhbmNlIDEgYXNrcyBmb3IuXG4gKi9cbmV4cG9ydCBjb25zdCBMRUFEX05FRURfVFlQRV9PUFRJT05TOiBTZWxlY3RPcHRpb25bXSA9IFtcbiAgeyBsYWJlbDogJ05ldyBJbXBsZW1lbnRhdGlvbicsICAgdmFsdWU6ICduZXdfaW1wbGVtZW50YXRpb24nIH0sXG4gIHsgbGFiZWw6ICdFeHBhbnNpb24nLCAgICAgICAgICAgIHZhbHVlOiAnZXhwYW5zaW9uJyB9LFxuICB7IGxhYmVsOiAnUmVwbGFjZW1lbnQnLCAgICAgICAgICB2YWx1ZTogJ3JlcGxhY2VtZW50JyB9LFxuICB7IGxhYmVsOiAnUmVuZXdhbCcsICAgICAgICAgICAgICB2YWx1ZTogJ3JlbmV3YWwnIH0sXG4gIHsgbGFiZWw6ICdDb25zdWx0aW5nJywgICAgICAgICAgIHZhbHVlOiAnY29uc3VsdGluZycgfSxcbiAgeyBsYWJlbDogJ1N1cHBvcnQgJiBNYWludGVuYW5jZScsIHZhbHVlOiAnc3VwcG9ydCcgfSxcbiAgeyBsYWJlbDogJ090aGVyJywgICAgICAgICAgICAgICAgdmFsdWU6ICdvdGhlcicgfSxcbl07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL190ZXJyaXRvcnkudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL190ZXJyaXRvcnkudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgU2VsZWN0T3B0aW9uIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5cbi8qKlxuICogVGVycml0b3J5IFx1MjAxNCB0aGUgT05FIHBsYWNlIHRoZSBjb3VudHJ5LXRvLXRlcnJpdG9yeSBtYXBwaW5nIGlzIGF1dGhvcmVkLlxuICpcbiAqIFx1MjZENCBUZXJyaXRvcnkgaXMgYSBkZWNsYXJlZCBgc2VsZWN0YCBvbiBgY3JtX2FjY291bnRgLCBkZXJpdmVkIGZyb20gdGhlIGJpbGxpbmdcbiAqIGNvdW50cnkgYnkgYGFjY291bnRfcHJvdGVjdGlvbmAsIGFuZCB0aGUgc2hhcmluZyBydWxlcyBjb21wYXJlXG4gKiBgcmVjb3JkLnRlcnJpdG9yeWAgYWdhaW5zdCBhIGRlY2xhcmVkIHZhbHVlLiBBIGNvdW50cnkgc3RyaW5nIGlzIG5ldmVyXG4gKiBjb21wYXJlZCBhZ2Fpbi4gTWF0Y2hpbmcgZnJlZSB0ZXh0IGluc2lkZSBhIENFTCBjb25kaXRpb24gZmFpbHMgZm91ciB3YXlzLFxuICogYWxsIG9mIHRoZW0gc2lsZW50OiBhbiBhY2NvdW50IHdob3NlIGNvdW50cnkgcmVhZHMgYFVuaXRlZCBTdGF0ZXNgIHJhdGhlclxuICogdGhhbiBgVVNgIGxhbmRzIGluIE5PIHRlcnJpdG9yeSB3aXRoIG5vdGhpbmcgZXJyb3JlZDsgYWRkaW5nIGEgY291bnRyeSBtZWFuc1xuICogZWRpdGluZyBhIENFTCBzdHJpbmcgQU5EIHRocmVlIGxvY2FsaXNlZCB0YWJsZXMgd2l0aCBub3RoaW5nIHRvIGZhaWwgaWYgeW91XG4gKiBlZGl0IGZld2VyIHRoYW4gYWxsIGZvdXI7IGEgd3JvbmcgY29kZSAoYFVLYCBmb3IgYEdCYCkgY2Fubm90IGJlIGNvcnJlY3RlZFxuICogd2l0aG91dCBldmljdGluZyBldmVyeSBhY2NvdW50IGFscmVhZHkgdHlwZWQgdGhhdCB3YXk7IGFuZCBmcmVlIHRleHQgaGFzIG5vXG4gKiBlbnVtZXJhYmxlIERPTUFJTiwgc28gbm8gYXV0aG9yaW5nIHN1cmZhY2UsIGltcG9ydCBtYXBwaW5nIG9yIGdlbmVyYXRlZCBzZWVkXG4gKiBjYW4gYmUgY2hlY2tlZCBhZ2FpbnN0IGl0LlxuICpcbiAqICMjIyBUaGUgdGhyZWUgYXV0aG9yZWQgdGFibGVzLCBhbmQgZXZlcnl0aGluZyBkZXJpdmVkIGZyb20gdGhlbVxuICpcbiAqIHtAbGluayBURVJSSVRPUllfT1BUSU9OU30gKHRoZSBwaWNrbGlzdCksIHtAbGluayBURVJSSVRPUllfQ09VTlRSSUVTfSAod2hpY2hcbiAqIGNvdW50cmllcyBhIHRlcnJpdG9yeSBjb3ZlcnMpIGFuZCB7QGxpbmsgQ09VTlRSWV9BTElBU0VTfSAoaG93IGVsc2UgYSBjb3VudHJ5XG4gKiBtYXkgYmUgc3BlbGxlZCkgYXJlIEFVVEhPUkVELiB7QGxpbmsgQ09VTlRSWV9URVJSSVRPUll9IGFuZFxuICoge0BsaW5rIHRlcnJpdG9yeUZvcn0gYXJlIERFUklWRUQgZnJvbSB0aGVtLCBhbmQgc28gYXJlIHRoZSBzaGFyaW5nIHJ1bGVcbiAqIGNvbmRpdGlvbnMsIHRoZSBhY2NvdW50IGZvcm0ncyBwaWNrbGlzdCBhbmQgdGhlIGRvY3VtZW50YXRpb24gdGFibGVzIFx1MjAxNCBzZWVcbiAqIGB0ZXN0L3RlcnJpdG9yeS1zaW5nbGUtc291cmNlLnRlc3QudHNgLCB3aGljaCBwaW5zIGV2ZXJ5IGRlcml2YXRpb24uXG4gKlxuICogIyMjIFx1MjZBMFx1RkUwRiBXaHkgYGFjY291bnQuaG9vay50c2Agc3RpbGwgY2FycmllcyBhIGNvcHkgb2YgdGhpcyBtYXBcbiAqXG4gKiBJdCBoYXMgdG8uIEEgaG9vayBoYW5kbGVyIGlzIGxvd2VyZWQgdG8gYSBtZXRhZGF0YS1vbmx5IGBib2R5LnNvdXJjZWAgYW5kXG4gKiBldmFsdWF0ZWQgaW5zaWRlIFF1aWNrSlMgd2l0aCBOTyBtb2R1bGUgc2NvcGU6IGEgcmVmZXJlbmNlIHRvIGFueXRoaW5nXG4gKiBleHBvcnRlZCBoZXJlIGlzIG5vdCBhIGNsb3N1cmUgYXQgcnVudGltZSwgaXQgaXMgYSBgUmVmZXJlbmNlRXJyb3JgLlxuICogYGV4dHJhY3RIb29rQm9keWAgcmVqZWN0cyBzdWNoIGEgaGFuZGxlciBvdXRyaWdodFxuICogKGBkZXRlY3RGcmVlSWRlbnRpZmllcnNgKSwgYW5kIGB0ZXN0L2FjdGlvbi1zYW5kYm94LnRlc3QudHNgIGZhaWxzIHRoZVxuICogYnVpbGQncyBvd24gbG93ZXJpbmcgcGFzcyBmb3IgZXZlcnkgcmVnaXN0ZXJlZCBob29rLiBTbyB0aGUgZGVyaXZhdGlvbiBjYW5ub3RcbiAqIGltcG9ydCB0aGlzIG1vZHVsZSBcdTIwMTQgdGhlIHRhYmxlIGhhcyB0byBiZSBpbmxpbmUgaW4gdGhlIGhhbmRsZXIuXG4gKlxuICogYHRlc3QvdGVycml0b3J5LXNpbmdsZS1zb3VyY2UudGVzdC50c2AgY2xvc2VzIHRoYXQgZ2FwIGZyb20gYm90aCBkaXJlY3Rpb25zOlxuICogaXQgcGFyc2VzIHRoZSBpbmxpbmUgdGFibGUgb3V0IG9mIHRoZSBMT1dFUkVEIGJvZHkgc291cmNlIGFuZCBhc3NlcnRzIGRlZXBcbiAqIGVxdWFsaXR5IHdpdGgge0BsaW5rIENPVU5UUllfVEVSUklUT1JZfSAoc28gYSBjb3VudHJ5IGFkZGVkIHRvIGVpdGhlciBzaWRlXG4gKiBhbG9uZSBpcyByZWQpLCBhbmQgaXQgcnVucyB0aGUgcmVhbCBib2R5IGluIHRoZSByZWFsIHNhbmRib3ggb3ZlciBldmVyeVxuICogZGVjbGFyZWQgc3BlbGxpbmcgYW5kIGFzc2VydHMgdGhlIHRlcnJpdG9yeSBpdCBwcm9kdWNlcy4gVGhlIG1hcCBpcyB0aGVyZWZvcmVcbiAqIGF1dGhvcmVkIG9uY2UgZXZlbiB0aG91Z2ggaXQgaXMgc3RvcmVkIHR3aWNlLlxuICpcbiAqICMjIyBTY29wZSBvZiB0aGUgY291bnRyeSBsaXN0XG4gKlxuICogVGhpcyBpcyBhIFNQRUxMSU5HIHRhYmxlIGZvciB0aGUgY291bnRyaWVzIHRoZSB0d28gc3RhZmZlZCB0ZXJyaXRvcmllcyBjb3ZlcixcbiAqIG5vdCBhIHdvcmxkIGNvdW50cnkgbGlzdC4gVGhlIHZhbHVlIGRvbWFpbiBpcyBgbmFgIC8gYGVtZWFgIC8gYG90aGVyYDtcbiAqIGV2ZXJ5dGhpbmcgZWxzZSBcdTIwMTQgYFNHYCwgYEpQYCwgYW4gZW1wdHkgYWRkcmVzcyBcdTIwMTQgaXMgYG90aGVyYCwgZXhwbGljaXRseS5cbiAqL1xuXG4vKiogVGhlIGRlY2xhcmVkIHRlcnJpdG9yeSBkb21haW4uIGBvdGhlcmAgaXMgYSBzdGF0ZWQgZmFjdCwgbmV2ZXIgYSBibGFuay4gKi9cbmV4cG9ydCB0eXBlIFRlcnJpdG9yeSA9ICduYScgfCAnZW1lYScgfCAnb3RoZXInO1xuXG4vKipcbiAqIFRoZSBzdG9yZWQgdmFsdWVzLCBuYW1lZC4gRXZlcnkgb3RoZXIgZGVjbGFyYXRpb24gaW4gdGhlIHJlcG8gdGhhdCBuZWVkcyBvbmVcbiAqIHNwZWxscyBpdCB0aHJvdWdoIGhlcmUgXHUyMDE0IGluY2x1ZGluZyB0aGUgc2hhcmluZyBydWxlIGNvbmRpdGlvbnMsIHdoZXJlIGBQYFxuICogcXVvdGVzIHRoZSBpbnRlcnBvbGF0ZWQgdmFsdWUgKGByZWNvcmQudGVycml0b3J5ID09IFwibmFcImApLCBzbyBhIHJlbmFtZSBvZiBhXG4gKiB0ZXJyaXRvcnkgdmFsdWUgY2Fubm90IGJlIGFwcGxpZWQgdG8gdGhlIHBpY2tsaXN0IGFuZCBtaXNzZWQgaW4gdGhlIHJ1bGVzLlxuICovXG5leHBvcnQgY29uc3QgVEVSUklUT1JZOiBSZWNvcmQ8J05BJyB8ICdFTUVBJyB8ICdPVEhFUicsIFRlcnJpdG9yeT4gPSB7XG4gIE5BOiAnbmEnLFxuICBFTUVBOiAnZW1lYScsXG4gIE9USEVSOiAnb3RoZXInLFxufTtcblxuLyoqXG4gKiBUaGUgYWNjb3VudCBwaWNrbGlzdC4gYG90aGVyYCBpcyBkZWxpYmVyYXRlbHkgYSBWQUxVRSBhbmQgbm90IGFuIGVtcHR5XG4gKiBzdHJpbmc6IFwidGhpcyBhY2NvdW50IGJlbG9uZ3MgdG8gbm8gdGVycml0b3J5XCIgYW5kIFwibm9ib2R5IGZpbGxlZCB0aGlzIGluXCJcbiAqIGFyZSBkaWZmZXJlbnQgZmFjdHMsIGFuZCBmcmVlIHRleHQgY291bGQgbm90IHRlbGwgdGhlbSBhcGFydCAoIzYzOSkuXG4gKi9cbmV4cG9ydCBjb25zdCBURVJSSVRPUllfT1BUSU9OUzogU2VsZWN0T3B0aW9uW10gPSBbXG4gIHsgbGFiZWw6ICdOb3J0aCBBbWVyaWNhJywgdmFsdWU6IFRFUlJJVE9SWS5OQSwgY29sb3I6ICcjMDA3MEQyJyB9LFxuICB7IGxhYmVsOiAnRU1FQScsIHZhbHVlOiBURVJSSVRPUlkuRU1FQSwgY29sb3I6ICcjN0MzQUVEJyB9LFxuICB7IGxhYmVsOiAnT3RoZXInLCB2YWx1ZTogVEVSUklUT1JZLk9USEVSLCBjb2xvcjogJyM5OTk5OTknIH0sXG5dO1xuXG4vKiogVGhlIHRlcnJpdG9yeSBldmVyeSB1bm1hcHBlZCBjb3VudHJ5IGZhbGxzIGludG8uICovXG5leHBvcnQgY29uc3QgVEVSUklUT1JZX0ZBTExCQUNLOiBUZXJyaXRvcnkgPSBURVJSSVRPUlkuT1RIRVI7XG5cbi8qKlxuICogV2hpY2ggY291bnRyaWVzIGVhY2ggc3RhZmZlZCB0ZXJyaXRvcnkgY292ZXJzLCBieSBJU08gMzE2Ni0xIGFscGhhLTIgY29kZS5cbiAqXG4gKiBgb3RoZXJgIGlzIGFic2VudCBvbiBwdXJwb3NlIFx1MjAxNCBpdCBpcyB0aGUgRkFMTEJBQ0ssIHJlYWNoZWQgYnkgZXZlcnkgY291bnRyeVxuICogbm90IG5hbWVkIGhlcmUsIHNvIGxpc3RpbmcgY291bnRyaWVzIHVuZGVyIGl0IHdvdWxkIGJlIGEgc2Vjb25kIHdheSB0byBzYXlcbiAqIHRoZSBzYW1lIHRoaW5nLiBUaGUgZG9jdW1lbnRhdGlvbiB0YWJsZXMgcmVuZGVyIHRoaXMgcmVjb3JkIHBsdXMgb25lIHJvd1xuICogc3RhdGluZyB0aGUgZmFsbGJhY2suXG4gKi9cbmV4cG9ydCBjb25zdCBURVJSSVRPUllfQ09VTlRSSUVTOiBSZWNvcmQ8RXhjbHVkZTxUZXJyaXRvcnksICdvdGhlcic+LCByZWFkb25seSBzdHJpbmdbXT4gPSB7XG4gIG5hOiBbJ1VTJywgJ0NBJywgJ01YJ10sXG4gIGVtZWE6IFsnR0InLCAnREUnLCAnRlInLCAnSVQnLCAnRVMnXSxcbn07XG5cbi8qKlxuICogQWNjZXB0ZWQgYWx0ZXJuYXRpdmUgc3BlbGxpbmdzLCBtYXBwZWQgdG8gdGhlIGNhbm9uaWNhbCBjb2RlLlxuICpcbiAqIEF1dGhvcmVkIGluIERJU1BMQVkgZm9ybSAoYFVuaXRlZCBTdGF0ZXNgLCBub3QgYFVOSVRFRCBTVEFURVNgKSBiZWNhdXNlIHRoaXNcbiAqIGlzIHdoYXQgdGhlIGRvY3VtZW50YXRpb24gdGFibGVzIHJlbmRlciBcdTIwMTQge0BsaW5rIENPVU5UUllfVEVSUklUT1JZfSBhcHBsaWVzXG4gKiB7QGxpbmsgbm9ybWFsaXplQ291bnRyeX0gd2hlbiBpdCBmbGF0dGVucyB0aGVtLCBzbyB0aGUgbG9va3VwIGlzXG4gKiBjYXNlLWluc2Vuc2l0aXZlIHdpdGhvdXQgdGhlIGF1dGhvcmVkIHRhYmxlIGhhdmluZyB0byBiZSBzaG91dGVkLlxuICpcbiAqIGBVSyAtPiBHQmAgaXMgZGVsaWJlcmF0ZTogYFVLYCBpcyBub3QgdGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb2RlIGZvciB0aGVcbiAqIFVuaXRlZCBLaW5nZG9tLCBidXQgdGhlIHN0b2NrIExvbmRvbiBhY2NvdW50IGFuZCBldmVyeSBjdXN0b21lciByZWNvcmQgdHlwZWRcbiAqIHRoZSBzYW1lIHdheSBtdXN0IGtlZXAgbGFuZGluZyBpbiBgZW1lYWAuIEJlY2F1c2UgdGhlIHJ1bGVzIG5vIGxvbmdlciBjb21wYXJlXG4gKiBhIGNvdW50cnkgYXQgYWxsLCBgR0JgIGNhbiBiZSBjYW5vbmljYWwgQU5EIGBVS2AgY2FuIGtlZXAgd29ya2luZy5cbiAqXG4gKiBFbmdsaXNoIG5hbWVzIGFyZSBoZXJlIGJlY2F1c2UgdGhleSBhcmUgd2hhdCBhIENTViBpbXBvcnQsIGEgZ2VuZXJhdGVkIHNlZWRcbiAqIG9yIGEgcGVyc29uIHR5cGluZyBpbnRvIHRoZSBhZGRyZXNzIGZvcm0gYWN0dWFsbHkgcHJvZHVjZXMuIE5hdGl2ZS1sYW5ndWFnZVxuICogc3BlbGxpbmdzIGFyZSBOT1Q6IHRoZXkgYXJlIHVuYm91bmRlZCwgYW5kIHRoZSBmYWlsdXJlIHRoZXkgd291bGQgcHJldmVudCBpc1xuICogbm93IHZpc2libGUgKGBvdGhlcmApIHJhdGhlciB0aGFuIHNpbGVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IENPVU5UUllfQUxJQVNFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ1VuaXRlZCBTdGF0ZXMnOiAnVVMnLFxuICAnVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhJzogJ1VTJyxcbiAgVVNBOiAnVVMnLFxuICBDYW5hZGE6ICdDQScsXG4gIE1leGljbzogJ01YJyxcbiAgVUs6ICdHQicsXG4gICdVbml0ZWQgS2luZ2RvbSc6ICdHQicsXG4gICdHcmVhdCBCcml0YWluJzogJ0dCJyxcbiAgR2VybWFueTogJ0RFJyxcbiAgRnJhbmNlOiAnRlInLFxuICBJdGFseTogJ0lUJyxcbiAgU3BhaW46ICdFUycsXG59O1xuXG4vKipcbiAqIEV2ZXJ5IGFjY2VwdGVkIHNwZWxsaW5nIHRvIGl0cyB0ZXJyaXRvcnkgXHUyMDE0IHRoZSBmbGF0dGVuZWQgZm9ybSB0aGUgaG9vayBib2R5XG4gKiBjYXJyaWVzIGlubGluZSBhbmQgYHRlc3QvdGVycml0b3J5LXNpbmdsZS1zb3VyY2UudGVzdC50c2AgcGlucyBpdCBhZ2FpbnN0LlxuICpcbiAqIERlcml2ZWQsIG5ldmVyIGF1dGhvcmVkOiBhZGQgYSBjb3VudHJ5IHRvIHtAbGluayBURVJSSVRPUllfQ09VTlRSSUVTfSBvciBhXG4gKiBzcGVsbGluZyB0byB7QGxpbmsgQ09VTlRSWV9BTElBU0VTfSBhbmQgaXQgYXBwZWFycyBoZXJlLCBpbiB0aGUgZG9jcyB0YWJsZXNcbiAqIGFuZCAob25jZSB0aGUgaG9vaydzIGlubGluZSBjb3B5IGlzIHVwZGF0ZWQsIHdoaWNoIHRoZSBwaW4gdGVzdCBmb3JjZXMpIGluXG4gKiB0aGUgZGVyaXZhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IENPVU5UUllfVEVSUklUT1JZOiBSZWNvcmQ8c3RyaW5nLCBUZXJyaXRvcnk+ID0gKCgpID0+IHtcbiAgY29uc3QgbWFwOiBSZWNvcmQ8c3RyaW5nLCBUZXJyaXRvcnk+ID0ge307XG4gIGZvciAoY29uc3QgW3RlcnJpdG9yeSwgY291bnRyaWVzXSBvZiBPYmplY3QuZW50cmllcyhURVJSSVRPUllfQ09VTlRSSUVTKSkge1xuICAgIGZvciAoY29uc3QgY29kZSBvZiBjb3VudHJpZXMpIG1hcFtjb2RlXSA9IHRlcnJpdG9yeSBhcyBUZXJyaXRvcnk7XG4gIH1cbiAgZm9yIChjb25zdCBbYWxpYXMsIGNvZGVdIG9mIE9iamVjdC5lbnRyaWVzKENPVU5UUllfQUxJQVNFUykpIHtcbiAgICBjb25zdCB0ZXJyaXRvcnkgPSBtYXBbY29kZV07XG4gICAgaWYgKCF0ZXJyaXRvcnkpIHtcbiAgICAgIC8vIEEgc3BlbGxpbmcgcG9pbnRpbmcgYXQgYSBjb3VudHJ5IG5vIHRlcnJpdG9yeSBjb3ZlcnMgd291bGQgcmVzb2x2ZSB0b1xuICAgICAgLy8gYG90aGVyYCBhbmQgcmVhZCBhcyBkZWxpYmVyYXRlLiBGYWlsaW5nIGF0IG1vZHVsZSBsb2FkIG1ha2VzIGl0IGFcbiAgICAgIC8vIGJ1aWxkLXRpbWUgZXJyb3IgaW5zdGVhZCBvZiBhIHdyb25nIGFuc3dlciBhdCBydW50aW1lLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDT1VOVFJZX0FMSUFTRVM6IFwiJHthbGlhc31cIiBwb2ludHMgYXQgXCIke2NvZGV9XCIsIHdoaWNoIG5vIHRlcnJpdG9yeSBjb3ZlcnNgKTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gbm9ybWFsaXplQ291bnRyeShhbGlhcyk7XG4gICAgaWYgKG1hcFtrZXldICYmIG1hcFtrZXldICE9PSB0ZXJyaXRvcnkpIHtcbiAgICAgIC8vIFR3byBzcGVsbGluZ3MgdGhhdCBub3JtYWxpc2UgdG8gdGhlIHNhbWUga2V5IGFuZCBkaXNhZ3JlZTogbGFzdCB3cml0ZVxuICAgICAgLy8gd291bGQgd2luLCBzaWxlbnRseSwgYW5kIHRoZSBsb3NlcidzIHRlcnJpdG9yeSB3b3VsZCBqdXN0IGJlIHdyb25nLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDT1VOVFJZX0FMSUFTRVM6IFwiJHthbGlhc31cIiBjb2xsaWRlcyB3aXRoIGFuIGVudHJ5IG1hcHBlZCB0byBcIiR7bWFwW2tleV19XCJgKTtcbiAgICB9XG4gICAgbWFwW2tleV0gPSB0ZXJyaXRvcnk7XG4gIH1cbiAgcmV0dXJuIG1hcDtcbn0pKCk7XG5cbi8qKlxuICogVGhlIG9uZSBub3JtYWxpc2F0aW9uIHJ1bGU6IHRyaW0sIGNvbGxhcHNlIGludGVybmFsIHdoaXRlc3BhY2UsIHVwcGVyLWNhc2UuXG4gKlxuICogYGNybV9hY2NvdW50LmJpbGxpbmdfY291bnRyeWAgc3RvcmVzIGV4YWN0bHkgdGhpcyBmb3JtLCBhbmQgZXZlcnkga2V5IGFib3ZlXG4gKiBpcyB3cml0dGVuIGluIGl0LCBzbyB0aGUgbG9va3VwIGlzIGEgcGxhaW4gcHJvcGVydHkgcmVhZC4gYGRlIGAsIGAgREVgIGFuZFxuICogYFVuaXRlZCAgU3RhdGVzYCBhcmUgYWxsIGhhbmRsZWQgaGVyZSByYXRoZXIgdGhhbiBieSBhIHRvbGVyYW50IGxvb2t1cCBcdTIwMTRcbiAqIG9uZSBydWxlLCBhcHBsaWVkIG9uY2UsIGluc3RlYWQgb2YgYSBzZXQgb2YgZmFsbGJhY2tzIGF0IGVhY2ggcmVhZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ291bnRyeSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKS50b1VwcGVyQ2FzZSgpIDogJyc7XG59XG5cbi8qKlxuICogVGhlIHRlcnJpdG9yeSBhIGNvdW50cnkgc3RyaW5nIGJlbG9uZ3MgdG8uIFRvdGFsOiBldmVyeSBpbnB1dCBoYXMgYW4gYW5zd2VyLFxuICogYW5kIGFuIHVucmVjb2duaXNlZCBvbmUgaXMgYG90aGVyYCByYXRoZXIgdGhhbiBibGFuay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlcnJpdG9yeUZvcih2YWx1ZTogdW5rbm93bik6IFRlcnJpdG9yeSB7XG4gIHJldHVybiBDT1VOVFJZX1RFUlJJVE9SWVtub3JtYWxpemVDb3VudHJ5KHZhbHVlKV0gPz8gVEVSUklUT1JZX0ZBTExCQUNLO1xufVxuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0cy9jb250YWN0Lm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvY29udGFjdC5vYmplY3QudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IE9iamVjdFNjaGVtYSwgRmllbGQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB7IEYgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgeyBTQUxVVEFUSU9OX09QVElPTlMsIExFQURfU09VUkNFX09QVElPTlMgfSBmcm9tICcuL19waWNrbGlzdHMnO1xuXG5leHBvcnQgY29uc3QgQ29udGFjdCA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX2NvbnRhY3QnLFxuICBsYWJlbDogJ0NvbnRhY3QnLFxuICBwbHVyYWxMYWJlbDogJ0NvbnRhY3RzJyxcbiAgaWNvbjogJ3VzZXInLFxuICBkZXNjcmlwdGlvbjogJ1Blb3BsZSBhc3NvY2lhdGVkIHdpdGggYWNjb3VudHMnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIE1hc3Rlci1kZXRhaWwgY2hpbGQgb2YgY3JtX2FjY291bnQgXHUyMDE0IGluaGVyaXRzIHRoZSBhY2NvdW50J3Mgc2hhcmluZy5cbiAgc2hhcmluZ01vZGVsOiAnY29udHJvbGxlZF9ieV9wYXJlbnQnLFxuICBcbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2lkZW50aXR5JywgICAgICAgIGxhYmVsOiAnSWRlbnRpdHknLCAgICAgICAgICAgICBpY29uOiAndXNlcicgfSxcbiAgICB7IGtleTogJ2FjY291bnRfaW5mbycsICAgIGxhYmVsOiAnQWNjb3VudCAmIFRpdGxlJywgICAgICBpY29uOiAnYnJpZWZjYXNlJyB9LFxuICAgIHsga2V5OiAnYnV5aW5nX2NlbnRyZScsICAgbGFiZWw6ICdCdXlpbmcgQ2VudHJlJywgICAgICAgIGljb246ICd1c2VycycgfSxcbiAgICB7IGtleTogJ2NvbnRhY3RfaW5mbycsICAgIGxhYmVsOiAnQ29udGFjdCBJbmZvcm1hdGlvbicsICBpY29uOiAncGhvbmUnIH0sXG4gICAgeyBrZXk6ICdtYWlsaW5nX2FkZHJlc3MnLCBsYWJlbDogJ01haWxpbmcgQWRkcmVzcycsICAgICAgaWNvbjogJ21hcC1waW4nLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ2FkZGl0aW9uYWwnLCAgICAgIGxhYmVsOiAnQWRkaXRpb25hbCBJbmZvJywgICAgICBpY29uOiAnaW5mbycsIGNvbGxhcHNlOiAnY29sbGFwc2VkJyB9LFxuICAgIHsga2V5OiAncHJlZmVyZW5jZXMnLCAgICAgbGFiZWw6ICdDb21tdW5pY2F0aW9uIFByZWZlcmVuY2VzJywgaWNvbjogJ2JlbGwtb2ZmJywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gUGxhdGZvcm0gb3duZXJzaGlwIGFuY2hvciBcdTIwMTQgY2Fub25pY2FsIG5vdGUgaW4gYGFjY291bnQub2JqZWN0LnRzYCAoIzU0OCkuXG4gICAgb3duZXJfaWQ6IEZpZWxkLmxvb2t1cCgnc3lzX3VzZXInLCB7XG4gICAgICBsYWJlbDogJ0NvbnRhY3QgT3duZXInLFxuICAgICAgZ3JvdXA6ICdhY2NvdW50X2luZm8nLFxuICAgICAgc3lzdGVtOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IGZhbHNlLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgLy8gTmFtZSBmaWVsZHNcbiAgICBzYWx1dGF0aW9uOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdTYWx1dGF0aW9uJyxcbiAgICAgIGdyb3VwOiAnaWRlbnRpdHknLFxuICAgICAgLy8gQ2Fub25pY2FsIHNldCBzaGFyZWQgd2l0aCBMZWFkICgjNDkwKSBcdTIwMTQgc2VlIF9waWNrbGlzdHMudHMuXG4gICAgICBvcHRpb25zOiBbLi4uU0FMVVRBVElPTl9PUFRJT05TXSxcbiAgICB9KSxcbiAgICBmaXJzdF9uYW1lOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnRmlyc3QgTmFtZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIGdyb3VwOiAnaWRlbnRpdHknLFxuICAgIH0pLFxuICAgIGxhc3RfbmFtZTogRmllbGQudGV4dCh7XG4gICAgICBsYWJlbDogJ0xhc3QgTmFtZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIGdyb3VwOiAnaWRlbnRpdHknLFxuICAgIH0pLFxuXG4gICAgLy8gRm9ybXVsYSBmaWVsZCAtIEZ1bGwgbmFtZVxuICAgIC8vIGBzYWx1dGF0aW9uYCBpcyBhIHBpY2tsaXN0LCBzbyB0aGUgZm9ybXVsYSBzZWVzIHRoZSByYXcgVkFMVUUgKGBtc2AsIGBkcmApLFxuICAgIC8vIG5vdCB0aGUgbGFiZWwgXHUyMDE0IG5hbWVzIHJlbmRlcmVkIGFzIFwibXMgRW1pbHkgRGF2aXNcIiBpbiBsaXN0cyBhbmQgZGV0YWlsc1xuICAgIC8vICgjNDYxKS4gVGhlIGZvcm11bGEgbGFuZ3VhZ2UgaGFzIG5vIHByb3Blci1jYXNlIG9yIG9wdGlvbi1sYWJlbCBsb29rdXAsIGFuZFxuICAgIC8vIGhhcmRjb2RpbmcgXCJNcy5cIiB3b3VsZCBkZWZlYXQgdHJhbnNsYXRpb24sIHNvIHRoZSBuYW1lIGlzIGJ1aWx0IGZyb20gdGhlXG4gICAgLy8gbmFtZSBmaWVsZHMgYWxvbmU7IHNhbHV0YXRpb24gc3RheXMgaXRzIG93biAodHJhbnNsYXRlZCkgZmllbGQuXG4gICAgZnVsbF9uYW1lOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnRnVsbCBOYW1lJyxcbiAgICAgIGV4cHJlc3Npb246IEZgam9pbk5vbkVtcHR5KFtyZWNvcmQuZmlyc3RfbmFtZSwgcmVjb3JkLmxhc3RfbmFtZV0sICcgJylgLFxuICAgICAgZ3JvdXA6ICdpZGVudGl0eScsXG4gICAgfSksXG5cbiAgICAvLyBBdmF0YXIgZmllbGQuIGBhY2NlcHRgIC8gYG1heFNpemVgIGFyZSBzZXJ2ZXItZW5mb3JjZWQgZnJvbVxuICAgIC8vIEBvYmplY3RzdGFjayAxNyBcdTIwMTQgc2VlIHRoZSBub3RlIG9uIGBjcm1fcHJvZHVjdC5pbWFnZWAuXG4gICAgYXZhdGFyOiBGaWVsZC5hdmF0YXIoe1xuICAgICAgbGFiZWw6ICdQcm9maWxlIFBpY3R1cmUnLFxuICAgICAgZ3JvdXA6ICdpZGVudGl0eScsXG4gICAgICBhY2NlcHQ6IFsnaW1hZ2UvcG5nJywgJ2ltYWdlL2pwZWcnLCAnaW1hZ2Uvd2VicCddLFxuICAgICAgbWF4U2l6ZTogMiAqIDEwMjQgKiAxMDI0LFxuICAgIH0pLFxuXG4gICAgLy8gUmVsYXRpb25zaGlwOiBMaW5rIHRvIEFjY291bnQgKE1hc3Rlci1EZXRhaWwpXG4gICAgY3JtX2FjY291bnQ6IEZpZWxkLm1hc3RlckRldGFpbCgnY3JtX2FjY291bnQnLCB7XG4gICAgICBsYWJlbDogJ0FjY291bnQnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZScsICAvLyBEZWxldGUgY29udGFjdHMgd2hlbiBhY2NvdW50IGlzIGRlbGV0ZWRcbiAgICAgIGdyb3VwOiAnYWNjb3VudF9pbmZvJyxcbiAgICB9KSxcblxuICAgIC8vIFByb2Zlc3Npb25hbCBJbmZvcm1hdGlvblxuICAgIHRpdGxlOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnSm9iIFRpdGxlJyxcbiAgICAgIGdyb3VwOiAnYWNjb3VudF9pbmZvJyxcbiAgICB9KSxcblxuICAgIGRlcGFydG1lbnQ6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ0RlcGFydG1lbnQnLFxuICAgICAgZ3JvdXA6ICdhY2NvdW50X2luZm8nLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnRXhlY3V0aXZlJywgdmFsdWU6ICdleGVjdXRpdmUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTYWxlcycsIHZhbHVlOiAnc2FsZXMnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdNYXJrZXRpbmcnLCB2YWx1ZTogJ21hcmtldGluZycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0VuZ2luZWVyaW5nJywgdmFsdWU6ICdlbmdpbmVlcmluZycgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1cHBvcnQnLCB2YWx1ZTogJ3N1cHBvcnQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdGaW5hbmNlJywgdmFsdWU6ICdmaW5hbmNlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnSHVtYW4gUmVzb3VyY2VzJywgdmFsdWU6ICdocicgfSxcbiAgICAgICAgeyBsYWJlbDogJ09wZXJhdGlvbnMnLCB2YWx1ZTogJ29wZXJhdGlvbnMnIH0sXG4gICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgQnV5aW5nIGNlbnRyZSAoUkVRLTAwMDQpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gVGhlIHRocmVlIGF0dHJpYnV0ZXMgdGhhdCB0dXJuIGFuIGFjY291bnQncyBjb250YWN0IGxpc3QgZnJvbSBhXG4gICAgLy8gRElSRUNUT1JZIGludG8gYSBNQVA6IHdoYXQgdGhpcyBwZXJzb24gZG9lcyBpbiB0aGUgcHVyY2hhc2UgZGVjaXNpb24sXG4gICAgLy8gd2hlcmUgdGhleSBzdGFuZCBvbiB1cywgYW5kIGhvdyBzdHJvbmcgb3VyIHJlbGF0aW9uc2hpcCB3aXRoIHRoZW0gaXMuXG4gICAgLy8gYHRpdGxlYCBhYm92ZSBpcyB0aGUgZW1wbG95ZXIncyBqb2IgdGl0bGUgYW5kIGBpc19wcmltYXJ5YCBiZWxvdyBpcyBhXG4gICAgLy8gb25lLWJpdCBhbnN3ZXIgdG8gXCJ3aG8gZG8gd2UgY2FsbFwiIFx1MjAxNCBuZWl0aGVyIG9mIHRoZW0gaXMgdGhpcyBmYWN0LlxuICAgIC8vXG4gICAgLy8gXHUyNkQ0IFJlYWQgYnkgcGVvcGxlIGFuZCBieSByZXBvcnRpbmcsIG5ldmVyIGJ5IGEgZ2F0ZS4gTm8gaG9vaywgbm8gZmxvd1xuICAgIC8vIGFuZCBubyB2YWxpZGF0aW9uIGlzIGF1dGhvcmVkIGFnYWluc3QgYW55IG9mIHRoZSB0aHJlZSwgbm9uZSBpc1xuICAgIC8vIGByZXF1aXJlZGAsIGFuZCBub25lIGNhcnJpZXMgYW4gb3B0aW9uIGBkZWZhdWx0YDogYSBjb250YWN0IHdpdGggYWxsXG4gICAgLy8gdGhyZWUgYmxhbmsgc2F2ZXMgZXhhY3RseSBhcyBpdCBkaWQgYmVmb3JlIHRoaXMgZ3JvdXAgZXhpc3RlZFxuICAgIC8vIChSRVEtMDAwNCBhY2NlcHRhbmNlIDQpLiBUaGV5IGFyZSBzYWxlcyBpbnRlbGxpZ2VuY2UsIGFuZCBBR0VOVFMubWRcbiAgICAvLyBtZXRhZGF0YSBzZW1hbnRpY3MgcnVsZSA4IGlzIHdoYXQga2VlcHMgYSBtYWNoaW5lIHNpZ25hbCBmcm9tIHJlZnVzaW5nXG4gICAgLy8gYSB3cml0ZS5cbiAgICAvLyBcdTI2QTBcdUZFMEYgYGJ1eWluZ19mdW5jdGlvbmAsIG5vdCBgYnV5aW5nX3JvbGVgIFx1MjAxNCBhbmQgJ0J1eWluZyBGdW5jdGlvbicsIG5vdFxuICAgIC8vICdCdXlpbmcgUm9sZScuIGBzZWN1cml0eS1yb2xlLXdvcmRgIChhbiBhdXRob3ItdGltZSBydWxlLCBBRFItMDA5MCBEMylcbiAgICAvLyByZWZ1c2VzIHRoZSB3b3JkIGByb2xlYCBvbiBCT1RILCBtZWFzdXJlZCBvbiB0aGlzIGJyYW5jaCBhcyB0d29cbiAgICAvLyBzdWNjZXNzaXZlIGBwbnBtIHZhbGlkYXRlYCBleGl0LTEgcnVuczogZmlyc3QgdGhlIGZpZWxkIG5hbWUsIHRoZW4gdGhlXG4gICAgLy8gbGFiZWwsIGJlY2F1c2UgXCJhZG1pbnMgbXVzdCBtZWV0IE9ORSB2b2NhYnVsYXJ5XCIgYW5kIGByb2xlYCBpcyB0aGVcbiAgICAvLyBwbGF0Zm9ybSdzIHNlY3VyaXR5IHZvY2FidWxhcnkgKHBlcm1pc3Npb25fc2V0IC8gcG9zaXRpb24gL1xuICAgIC8vIGJ1c2luZXNzX3VuaXQpLiBJdHMgb3duIHJlbWVkeSBwcmVzY3JpYmVzIHRoZSByZXBsYWNlbWVudCB1c2VkIGhlcmUgXHUyMDE0XG4gICAgLy8gXCJhIGRvbWFpbiB3b3JkIChlLmcuICdmdW5jdGlvbicsICdkdXR5JylcIi5cbiAgICAvL1xuICAgIC8vIFRoZSBydWxlJ3Mgc3VyZmFjZSBpcyB0aGUgRU5HTElTSCBvbmUgaXQgY2FuIHJlYWQ6IGl0IG1hdGNoZXNcbiAgICAvLyBgL1xcYnJvbGUocyk/XFxiL2lgIG92ZXIgb2JqZWN0L2ZpZWxkL2FjdGlvbi9wZXJtaXNzaW9uLXNldC9wb3NpdGlvbi9hcHBcbiAgICAvLyBkZWNsYXJhdGlvbnMgYW5kIGRvZXMgbm90IHJlYWNoIHRoZSBsb2NhbGUgcGFja3MuIFNvIHRoZSB0aHJlZVxuICAgIC8vIG5vbi1FbmdsaXNoIHBhY2tzIGtlZXAgdGhlIG5hdHVyYWwgYnVzaW5lc3MgdGVybSBmb3IgdGhpcyBjb25jZXB0IGluXG4gICAgLy8gdGhlaXIgb3duIGxhbmd1YWdlICh6aC1DTiBcdTkxQzdcdThEMkRcdTg5RDJcdTgyNzIsIGVzLUVTIFJvbCBkZSBDb21wcmEsIGphLUpQIFx1OENGQ1x1OENCN1x1NUY3OVx1NTI3MilcbiAgICAvLyBcdTIwMTQgc2FtZSBmYWN0LCBlYWNoIHdyaXR0ZW4gdGhlIHdheSBpdHMgcmVhZGVyIHNheXMgaXQuXG4gICAgYnV5aW5nX2Z1bmN0aW9uOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdCdXlpbmcgRnVuY3Rpb24nLFxuICAgICAgZ3JvdXA6ICdidXlpbmdfY2VudHJlJyxcbiAgICAgIC8vIFNJTkdMRS12YWx1ZWQsIGFuZCBSRVEtMDAwNCBsZWZ0IHRoYXQgY2FsbCB0byB0aGUgaW1wbGVtZW50aW5nIFBSLlxuICAgICAgLy8gYG11bHRpcGxlOiB0cnVlYCB3b3VsZCBjb3N0IHRoZSBmaWVsZCB0aGUgcHJvcGVydHkgYWNjZXB0YW5jZSAyIGFza3NcbiAgICAgIC8vIGZvcjogYEdyb3VwaW5nQ29uZmlnU2NoZW1hYCAoYEBvYmplY3RzdGFjay9zcGVjL3VpYCwgdGhlIGluc3RhbGxlZFxuICAgICAgLy8gcGluKSBhbnN3ZXJzIGEgZ3JvdXBlZCBsaXN0IHdpdGggT05FIHNlcnZlci1zaWRlIGFnZ3JlZ2F0ZSBxdWVyeSwgYW5kXG4gICAgICAvLyBpdHMgYEdyb3VwaW5nRmllbGRTY2hlbWEuZmllbGRgIHNheXMgdGhlIGdyb3VwIGhlYWRlciBcImNhcnJpZXMgaXRzXG4gICAgICAvLyByYXcgc3RvcmVkIHZhbHVlXCIgXHUyMDE0IHNvIGEgbXVsdGktdmFsdWVkIGNvbHVtbiBncm91cHMgYnkgdGhlXG4gICAgICAvLyBDT01CSU5BVElPTi4gYGRlY2lzaW9uX21ha2VyYCArIGB1c2VyYCB3b3VsZCBiZWNvbWUgYSBncm91cCBvZiBpdHNcbiAgICAgIC8vIG93biBpbnN0ZWFkIG9mIGZlZWRpbmcgYm90aCwgd2hpY2ggaXMgdGhlIG9wcG9zaXRlIG9mIHJlYWRpbmcgYW5cbiAgICAgIC8vIGFjY291bnQgYXMgYSBtYXAuIEEgcGVyc29uIHdobyBpcyBnZW51aW5lbHkgdHdvIHRoaW5ncyBpcyByZWNvcmRlZCBhc1xuICAgICAgLy8gdGhlIHJvbGUgdGhhdCBnb3Zlcm5zIFRISVMgZGVjaXNpb247IHRoZSBzZWNvbmQgb25lIGlzIGFscmVhZHlcbiAgICAgIC8vIGxlZ2libGUgZnJvbSBgdGl0bGVgIC8gYGRlcGFydG1lbnRgLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBzaXggYXJlIHRoZSBnZW5lcmljIGJ1eWluZy1jZW50cmUgc2xvdHMgZXZlcnkgaW5kdXN0cnkgcmVhZHMgdGhlXG4gICAgICAvLyBzYW1lIHdheSBcdTIwMTQgXHUyNkQ0IGRlbGliZXJhdGVseSBub3Qgb25lIGNvbXBhbnkncyByb2xlIG1vZGVsLlxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnRGVjaXNpb24gTWFrZXInLCAgICAgIHZhbHVlOiAnZGVjaXNpb25fbWFrZXInIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFY29ub21pYyBCdXllcicsICAgICAgdmFsdWU6ICdlY29ub21pY19idXllcicgfSxcbiAgICAgICAgeyBsYWJlbDogJ1RlY2huaWNhbCBFdmFsdWF0b3InLCB2YWx1ZTogJ3RlY2huaWNhbF9ldmFsdWF0b3InIH0sXG4gICAgICAgIHsgbGFiZWw6ICdVc2VyJywgICAgICAgICAgICAgICAgdmFsdWU6ICd1c2VyJyB9LFxuICAgICAgICB7IGxhYmVsOiAnSW5mbHVlbmNlcicsICAgICAgICAgIHZhbHVlOiAnaW5mbHVlbmNlcicgfSxcbiAgICAgICAgeyBsYWJlbDogJ0dhdGVrZWVwZXInLCAgICAgICAgICB2YWx1ZTogJ2dhdGVrZWVwZXInIH0sXG4gICAgICBdXG4gICAgfSksXG5cbiAgICBhdHRpdHVkZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnQXR0aXR1ZGUgdG8gVXMnLFxuICAgICAgZ3JvdXA6ICdidXlpbmdfY2VudHJlJyxcbiAgICAgIC8vIE9SREVSRUQsIG1vc3QgdG8gbGVhc3QgZmF2b3VyYWJsZSBcdTIwMTQgZGVjbGFyYXRpb24gb3JkZXIgSVMgdGhlIG9yZGVyIGFcbiAgICAgIC8vIHBpY2tsaXN0IGFuZCBhIGdyb3VwZWQgbGlzdCBwcmVzZW50LCBzbyB0aGUgbGFkZGVyIGlzIGF1dGhvcmVkIHJhdGhlclxuICAgICAgLy8gdGhhbiBkZXNjcmliZWQuIEEgYmxhbmsgbWVhbnMgbm9ib2R5IGhhcyBmb3JtZWQgYSB2aWV3IHlldCwgd2hpY2ggaXNcbiAgICAgIC8vIGEgZGlmZmVyZW50IGZhY3QgZnJvbSBgbmV1dHJhbGAuXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdDaGFtcGlvbicsICAgdmFsdWU6ICdjaGFtcGlvbicgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1cHBvcnRpdmUnLCB2YWx1ZTogJ3N1cHBvcnRpdmUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdOZXV0cmFsJywgICAgdmFsdWU6ICduZXV0cmFsJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU2tlcHRpY2FsJywgIHZhbHVlOiAnc2tlcHRpY2FsJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQmxvY2tlcicsICAgIHZhbHVlOiAnYmxvY2tlcicgfSxcbiAgICAgIF1cbiAgICB9KSxcblxuICAgIHJlbGF0aW9uc2hpcF9zdHJlbmd0aDogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnUmVsYXRpb25zaGlwIFN0cmVuZ3RoJyxcbiAgICAgIGdyb3VwOiAnYnV5aW5nX2NlbnRyZScsXG4gICAgICAvLyBPUkRFUkVELCB3ZWFrZXN0IHRvIHN0cm9uZ2VzdC4gXHUyNkQ0IE5vdCBhIGZyZWUtdGV4dCBzY29yZSwgYW5kIFx1MjZENCBub3RcbiAgICAgIC8vIGRlcml2ZWQgZnJvbSBgbGFzdF9jb250YWN0ZWRfZGF0ZWAgYmVsb3c6IHJlY2VuY3kgaXMgbWFjaGluZS13cml0dGVuXG4gICAgICAvLyBhbmQgbWVhc3VyZXMgc29tZXRoaW5nIGVsc2UgXHUyMDE0IGEgd2Vla2x5IGNhbGwgd2l0aCBzb21lb25lIHdobyB3aWxsIG5vdFxuICAgICAgLy8gdGFrZSBvdXIgc2lkZSBpcyBub3QgYSBzdHJvbmcgcmVsYXRpb25zaGlwLiBBIGJsYW5rIG1lYW5zIHVuYXNzZXNzZWQ7XG4gICAgICAvLyBgZGlzdGFudGAgaXMgYW4gYXNzZXNzbWVudCB0aGF0IGNhbWUgYmFjayB3ZWFrLlxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnRGlzdGFudCcsICAgICAgICAgICAgICB2YWx1ZTogJ2Rpc3RhbnQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdBY3F1YWludGFuY2UnLCAgICAgICAgIHZhbHVlOiAnYWNxdWFpbnRhbmNlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnV29ya2luZyBSZWxhdGlvbnNoaXAnLCB2YWx1ZTogJ3dvcmtpbmcnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdHJvbmcnLCAgICAgICAgICAgICAgIHZhbHVlOiAnc3Ryb25nJyB9LFxuICAgICAgICB7IGxhYmVsOiAnVHJ1c3RlZCBBZHZpc29yJywgICAgICB2YWx1ZTogJ3RydXN0ZWRfYWR2aXNvcicgfSxcbiAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE5vIGByZXBvcnRzX3RvYC4gVGhlIG9yZyBjaGFydCB3YXMgZGVjbGFyZWQgYW5kIG5ldmVyIGJ1aWx0OiBubyBwYWdlXG4gICAgLy8gcmVuZGVyZWQgdGhlIHRyZWUgdGhlIGNvbnRhY3QgZG9jcyBwcm9taXNlZCwgbm8gc2tpbGwgcmVhZCB0aGUgY2hhaW4gd2hlblxuICAgIC8vIHN1bW1hcmlzaW5nIGFuIGFjY291bnQsIGFuZCBubyBmbG93IGVzY2FsYXRlZCBhbG9uZyBpdC4gU2hhcmluZyBkZXJpdmVzXG4gICAgLy8gZnJvbSB0aGUgbWFzdGVyIGBjcm1fYWNjb3VudGAsIG5ldmVyIGZyb20gdGhpcyBsb29rdXAuXG5cbiAgICAvLyBDb250YWN0IEluZm9ybWF0aW9uXG4gICAgZW1haWw6IEZpZWxkLmVtYWlsKHtcbiAgICAgIGxhYmVsOiAnRW1haWwnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIHVuaXF1ZTogdHJ1ZSxcbiAgICAgIGdyb3VwOiAnY29udGFjdF9pbmZvJyxcbiAgICB9KSxcblxuICAgIHBob25lOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnUGhvbmUnLFxuICAgICAgZm9ybWF0OiAncGhvbmUnLFxuICAgICAgZ3JvdXA6ICdjb250YWN0X2luZm8nLFxuICAgIH0pLFxuXG4gICAgbW9iaWxlOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnTW9iaWxlJyxcbiAgICAgIGZvcm1hdDogJ3Bob25lJyxcbiAgICAgIGdyb3VwOiAnY29udGFjdF9pbmZvJyxcbiAgICB9KSxcblxuICAgIC8vIE1haWxpbmcgQWRkcmVzcyBcdTIwMTQgb25lIHN0cnVjdHVyZWQgYGFkZHJlc3NgIHZhbHVlLCB0aGUgc2FtZSBzaGFwZSBhc1xuICAgIC8vIGBjcm1fYWNjb3VudC5iaWxsaW5nX2FkZHJlc3NgIGFuZCBgY3JtX2xlYWQuYWRkcmVzc2AsIGJlY2F1c2UgYSBwb3N0YWxcbiAgICAvLyBhZGRyZXNzIGlzIG9uZSBmYWN0IGFuZCBBR0VOVFMubWQncyBmaWVsZC10eXBlIGd1aWRhbmNlIG5hbWVzXG4gICAgLy8gYEZpZWxkLmFkZHJlc3MoKWAgZm9yIGl0IChydWxpbmcgb24gIzE4MzY7IGl0IHJlcGxhY2VkIGZpdmUgZmxhdFxuICAgIC8vIGBtYWlsaW5nXypgIHRleHQgZmllbGRzLCBjb252ZXJ0ZWQgYnkgYHNjcmlwdHMvYmFja2ZpbGwtY29udGFjdC1tYWlsaW5nLWFkZHJlc3MudHNgKS5cbiAgICBtYWlsaW5nX2FkZHJlc3M6IEZpZWxkLmFkZHJlc3Moe1xuICAgICAgbGFiZWw6ICdNYWlsaW5nIEFkZHJlc3MnLFxuICAgICAgZ3JvdXA6ICdtYWlsaW5nX2FkZHJlc3MnLFxuICAgIH0pLFxuXG4gICAgLy8gQWRkaXRpb25hbCBJbmZvcm1hdGlvblxuICAgIC8vXG4gICAgLy8gTm8gYGJpcnRoZGF0ZWAuIE5vdGhpbmcgZ3JlZXRlZCwgc2VnbWVudGVkIG9yIHJlcG9ydGVkIG9uIGl0LCBhbmQgYW5cbiAgICAvLyBpbXBvcnRhYmxlIGRhdGUgb2YgYmlydGggd2l0aCBubyBjb25zdW1lciBpcyBwZXJzb25hbCBkYXRhIGhlbGQgZm9yIG5vXG4gICAgLy8gc3RhdGVkIHB1cnBvc2UgXHUyMDE0IHRoZSBvbmUgZmllbGQgb24gdGhpcyBvYmplY3Qgd2hlcmUgXCJkZWNsYXJlZCBidXQgaW5lcnRcIlxuICAgIC8vIGFsc28gY2FycmllcyBhIGRhdGEtcHJvdGVjdGlvbiBjb3N0LlxuXG4gICAgbGVhZF9zb3VyY2U6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ0xlYWQgU291cmNlJyxcbiAgICAgIGdyb3VwOiAnYWRkaXRpb25hbCcsXG4gICAgICAvLyBDYW5vbmljYWwgc2V0IHNoYXJlZCB3aXRoIExlYWQgKyBPcHBvcnR1bml0eSAoIzQ5MCkgXHUyMDE0IGEgY29udmVydGVkXG4gICAgICAvLyBsZWFkJ3Mgc291cmNlIG11c3QgcmVtYWluIHJlcHJlc2VudGFibGUgb24gdGhlIGNvbnRhY3QuXG4gICAgICBvcHRpb25zOiBbLi4uTEVBRF9TT1VSQ0VfT1BUSU9OU10sXG4gICAgfSksXG5cbiAgICBkZXNjcmlwdGlvbjogRmllbGQubWFya2Rvd24oe1xuICAgICAgbGFiZWw6ICdEZXNjcmlwdGlvbicsXG4gICAgICBncm91cDogJ2FkZGl0aW9uYWwnLFxuICAgIH0pLFxuXG4gICAgLy8gRmxhZ3NcbiAgICBpc19wcmltYXJ5OiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGxhYmVsOiAnUHJpbWFyeSBDb250YWN0JyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmlwdGlvbjogJ0lzIHRoaXMgdGhlIG1haW4gY29udGFjdCBmb3IgdGhlIGFjY291bnQ/JyxcbiAgICAgIGdyb3VwOiAncHJlZmVyZW5jZXMnLFxuICAgIH0pLFxuXG4gICAgZG9fbm90X2NhbGw6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdEbyBOb3QgQ2FsbCcsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZ3JvdXA6ICdwcmVmZXJlbmNlcycsXG4gICAgfSksXG5cbiAgICBlbWFpbF9vcHRfb3V0OiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGxhYmVsOiAnRW1haWwgT3B0IE91dCcsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZ3JvdXA6ICdwcmVmZXJlbmNlcycsXG4gICAgfSksXG5cbiAgICAvLyBJbnRlcmFjdGlvbiByZWNlbmN5IGZvciB0aGUgUEVSU09OICgjNTkyKS4gYGNybV9hY2NvdW50YCBjYXJyaWVzXG4gICAgLy8gYGxhc3RfYWN0aXZpdHlfZGF0ZWAgZm9yIHRoZSBjb21wYW55IGFuZCBgY3JtX2xlYWRgIGNhcnJpZXNcbiAgICAvLyBgbGFzdF9jb250YWN0ZWRfZGF0ZWAgZm9yIGEgcHJvc3BlY3Q7IHRoZSBjb250YWN0IFx1MjAxNCB0aGUgcmVjb3JkIGEgcmVwXG4gICAgLy8gYWN0dWFsbHkgY2FsbHMgYW5kIGVtYWlscyBcdTIwMTQgaGFkIG5laXRoZXIsIHNvIFwid2hlbiBkaWQgYW55b25lIGxhc3Qgc3BlYWtcbiAgICAvLyB0byBvdXIgY2hhbXBpb24/XCIgd2FzIHVuYW5zd2VyYWJsZS5cbiAgICAvL1xuICAgIC8vIFdyaXR0ZW4gYnkgdGhlIGFjdGl2aXR5IGJ1YmJsZSBpbiBgZXZlbnQuaG9vay50c2AgLyBgdGFzay5ob29rLnRzYCBhbmQgYnlcbiAgICAvLyBgc2VuZF9lbWFpbGAuIERlbGliZXJhdGVseSBOT1QgYHJlYWRvbmx5YDogYSByZWFkb25seSBmaWVsZCBpcyBzdHJpcHBlZFxuICAgIC8vIGZyb20gZXZlcnkgbm9uLXN5c3RlbSB3cml0ZSB3aG9zZSBjYWxsZXIgc3VwcGxpZWQgdGhlIGtleSAoIzI5NDgpLCB3aGljaFxuICAgIC8vIGlzIGV4YWN0bHkgaG93IHRoZSBhY2NvdW50IGFuZCBsZWFkIGNvbHVtbnMgYWJvdmUgZW5kZWQgdXAgcGVybWFuZW50bHlcbiAgICAvLyBudWxsLiBJdCBpcyBrZXB0IG9mZiB0aGUgZm9ybSBzZWN0aW9ucyBpbnN0ZWFkLlxuICAgIGxhc3RfY29udGFjdGVkX2RhdGU6IEZpZWxkLmRhdGV0aW1lKHtcbiAgICAgIGxhYmVsOiAnTGFzdCBDb250YWN0ZWQnLFxuICAgICAgZ3JvdXA6ICdhZGRpdGlvbmFsJyxcbiAgICB9KSxcbiAgfSxcbiAgXG4gIC8vIEVuYWJsZSBmZWF0dXJlc1xuICAvLyBBUEkgc3VyZmFjZS4gSGlzdG9yeSBcdTIxOTIgRmllbGQudHJhY2tIaXN0b3J5IChBRFItMDA1MikuXG4gIGVuYWJsZToge1xuICAgIGFwaUVuYWJsZWQ6IHRydWUsXG4gICAgLy8gIzYwMiBcdTIwMTQgc2lnbmVkIE5EQXMsIGJ1c2luZXNzIGNhcmRzLCBtZWV0aW5nIG5vdGVzIGF0dGFjaCB0byB0aGUgcGVyc29uLlxuICAgIC8vIFNlZSB0aGUgY2Fub25pY2FsIGNhcGFiaWxpdHkgbm90ZSBpbiBgc3JjL3NhbGVzL29iamVjdHMvaW5kZXgudHNgLlxuICAgIGZpbGVzOiB0cnVlLFxuICB9LFxuICBcbiAgLy8gRGF0YWJhc2UgaW5kZXhlcyBmb3IgcGVyZm9ybWFuY2VcbiAgLy9cbiAgLy8gTk9URTogbm8gYHsgZmllbGRzOiBbJ2VtYWlsJ10sIHVuaXF1ZTogdHJ1ZSB9YCBoZXJlLiBFbWFpbCB1bmlxdWVuZXNzIGlzXG4gIC8vIGRlY2xhcmVkIG9uIHRoZSBmaWVsZCBpdHNlbGYgKGB1bmlxdWU6IHRydWVgKSwgd2hpY2ggc2luY2UgZnJhbWV3b3JrICMzNjk2XG4gIC8vIG1hdGVyaWFsaXplcyBhcyB0aGUgdGVuYW50IGNvbXBvc2l0ZSBgKG9yZ2FuaXphdGlvbl9pZCwgZW1haWwpYCBcdTIwMTQgdW5pcXVlXG4gIC8vIFdJVEhJTiBhbiBvcmdhbml6YXRpb24sIHdoaWNoIGlzIHdoYXQgYSBtdWx0aS10ZW5hbnQgQ1JNIHdhbnRzICh0d28gb3Jnc1xuICAvLyBtYXkgZWFjaCBrbm93IGpvaG5AYWNtZS5jb20pLiBBIGRlY2xhcmVkIHNpbmdsZS1jb2x1bW4gaW5kZXggaXMgdGFrZW5cbiAgLy8gdmVyYmF0aW0sIGkuZS4gcGxhdGZvcm0td2lkZSwgc28gZGVjbGFyaW5nIGJvdGggbGVmdCB0aGUgZ2xvYmFsIGluZGV4XG4gIC8vIGVuZm9yY2luZyB0aGUgb2xkIGJlaGF2aW91ciBhbmQgdGhlIHBlci10ZW5hbnQgY29uc3RyYWludCB1bnJlYWNoYWJsZVxuICAvLyAoZnJhbWV3b3JrIzM5OTEgYHVuaXF1ZS9kb3VibGUtZGVjbGFyYXRpb25gKS5cbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ2NybV9hY2NvdW50J10gfSxcbiAgICB7IGZpZWxkczogWydvd25lcl9pZCddIH0sXG4gICAgeyBmaWVsZHM6IFsnbGFzdF9uYW1lJywgJ2ZpcnN0X25hbWUnXSB9LFxuICBdLFxuICBcbiAgLy8gRGlzcGxheSBjb25maWd1cmF0aW9uLiBBRFItMDA3OSBgbmFtZUZpZWxkYCBuYW1lcyB0aGUgcmVhbCBmaWVsZCBob2xkaW5nXG4gIC8vIHRoZSByZWNvcmQgdGl0bGUgXHUyMDE0IGhlcmUgdGhlIGBmdWxsX25hbWVgIGZvcm11bGEgZmllbGQgZGVmaW5lZCBhYm92ZS5cbiAgbmFtZUZpZWxkOiAnZnVsbF9uYW1lJyxcbiAgLy8gRXhwbGljaXQgc2VhcmNoIHRhcmdldHMgKEFEUi0wMDYxKS4gUkVRVUlSRUQgYmVjYXVzZSBuYW1lRmllbGQgaXMgYVxuICAvLyBGT1JNVUxBIChkaXNwbGF5X3RpdGxlL2Z1bGxfbmFtZSk6IHdpdGhvdXQgdGhpcywgJHNlYXJjaCBhdXRvLWRlZmF1bHRzIHRvXG4gIC8vIHRoZSBmb3JtdWxhIGZpZWxkLCB3aGljaCBpc24ndCBhIHJlYWwgY29sdW1uLCBzbyB0aGUgbG9va3VwIHBpY2tlciArIGdsb2JhbFxuICAvLyBzZWFyY2ggc2lsZW50bHkgcmV0dXJuIHplcm8uIFRoZXNlIGFyZSByZWFsLCBpbmRleGVkIGNvbHVtbnMuXG4gIHNlYXJjaGFibGVGaWVsZHM6IFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnLCAnZW1haWwnXSxcbiAgaGlnaGxpZ2h0RmllbGRzOiBbJ2Z1bGxfbmFtZScsICdlbWFpbCcsICdjcm1fYWNjb3VudCcsICdwaG9uZSddLFxuICBcbiAgLy8gXHUyNkEwXHVGRTBGIE5vIHN0YW5kYWxvbmUgYHR5cGU6ICd1bmlxdWUnYCB2YWxpZGF0aW9uIGV4aXN0cyBvbiB0aGlzIHBsYXRmb3JtXG4gIC8vIChBRFItMDAzMiB2YWxpZGF0aW9uIHVuaW9uKS4gRW1haWwgdW5pcXVlbmVzcyBpcyBlbmZvcmNlZCBieSB0aGVcbiAgLy8gZmllbGQtbGV2ZWwgYHVuaXF1ZTogdHJ1ZWAgYWJvdmUsIHNjb3BlZCBwZXIgb3JnYW5pemF0aW9uLlxuXG4gIC8vIFx1MjZBMFx1RkUwRiBObyBgd29ya2Zsb3dzW11gIGhlcmUsIGFuZCBub25lIGlzIHBvc3NpYmxlOiBvYmplY3QgYHdvcmtmbG93c1tdYCB3ZXJlXG4gIC8vIHJlbW92ZWQgZnJvbSB0aGUgcGxhdGZvcm0uIEZpZWxkIHVwZGF0ZXMgbGl2ZSBpbiB0aGlzIG9iamVjdCdzIGAqLmhvb2sudHNgO1xuICAvLyBzY2hlZHVsZWQgc3RhdHVzIGZsaXBzIGFuZCBub3RpZmljYXRpb25zIGxpdmUgaW4gYHNyYy8qL2Zsb3dzLyouZmxvdy50c2AuXG59KTsiLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2V2ZW50Lm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvZXZlbnQub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgT2JqZWN0U2NoZW1hLCBGaWVsZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHtcbiAgRVZFTlRfU1RBVFVTX09QVElPTlMsXG4gIEVWRU5UX1RZUEVfT1BUSU9OUyxcbiAgUkVMQVRFRF9UT19UWVBFX09QVElPTlMsXG59IGZyb20gJy4vX3BpY2tsaXN0cyc7XG5cbi8qKlxuICogRXZlbnQgXHUyMDE0IGEgZmlyc3QtY2xhc3MgaW50ZXJhY3Rpb24gcmVjb3JkICgjNTkyKS5cbiAqXG4gKiAjIFdoeSB0aGlzIG9iamVjdCBleGlzdHNcbiAqXG4gKiBUaGUgQ1JNIGNvdWxkIG5vdCBhbnN3ZXIgKlwid2hhdCBoYXBwZW5lZCB3aXRoIHRoaXMgY3VzdG9tZXIsIGFuZCB3aGVuP1wiKi5cbiAqIGBjcm1fdGFzay50eXBlYCBvZmZlcmVkIGEgYG1lZXRpbmdgIHZhbHVlIHdpdGggbm8gc3RhcnQgdGltZSwgbm8gZW5kIHRpbWUsXG4gKiBubyBsb2NhdGlvbiBhbmQgbm8gYXR0ZW5kZWVzLCBhbmQgYGxvZ19tZWV0aW5nYCBzdHVmZmVkIHRoZSBhdHRlbmRlZSBsaXN0XG4gKiBpbnRvIGEgSlNPTiBzdHJpbmcgaW5zaWRlIGBzeXNfYWN0aXZpdHkubWV0YWRhdGFgIFx1MjAxNCBhIHBheWxvYWQgbm8gbGlzdCB2aWV3XG4gKiBjYW4gZmlsdGVyLCBubyBkYXRhc2V0IGNhbiBncm91cCBieSwgYW5kIG5vIHJlcG9ydCBjYW4gY291bnQuXG4gKlxuICogYGNybV9ldmVudGAgaXMgdGhlIHF1ZXJ5YWJsZSBoYWxmIG9mIHRoYXQgc3Rvcnk6IG9uZSByb3cgcGVyIGludGVyYWN0aW9uXG4gKiB0aGF0IG9jY3VwaWVzIGEgc2xvdCBvbiBzb21lb25lJ3MgY2FsZW5kYXIsIHdoZXRoZXIgaXQgYWxyZWFkeSBoYXBwZW5lZCAoYVxuICogbG9nZ2VkIGNhbGwpIG9yIGlzIGJvb2tlZCBmb3IgbmV4dCBUdWVzZGF5IChhIHNjaGVkdWxlZCBtZWV0aW5nKS5cbiAqXG4gKiAjIFRoZSBUYXNrIC8gRXZlbnQgc3BsaXRcbiAqXG4gKiBgY3JtX3Rhc2tgIHN0YXlzIHdoYXQgaXQgd2FzIFx1MjAxNCBzb21ldGhpbmcgYSByZXAgc3RpbGwgKm93ZXMqIHNvbWVvbmUsIGR1ZSBvblxuICogYSBkYXRlLiBgY3JtX2V2ZW50YCBpcyBzb21ldGhpbmcgdGhhdCAqb2NjdXJzKiwgYmV0d2VlbiB0d28gdGltZXN0YW1wcywgd2l0aFxuICogcGVvcGxlIGluIHRoZSByb29tLiBUaGUgdHdvIG9iamVjdHMgZGVsaWJlcmF0ZWx5IGRvIE5PVCBtZXJnZTogYSB0by1kbyBsaXN0XG4gKiBzb3J0ZWQgYnkgZHVlIGRhdGUgYW5kIGEgY2FsZW5kYXIgc2NhbGVkIGJ5IGR1cmF0aW9uIGFyZSBkaWZmZXJlbnQgc3VyZmFjZXMsXG4gKiBhbmQgZXZlcnkgQ1JNIHRoYXQgY29sbGFwc2VkIHRoZW0gZW5kZWQgdXAgd2l0aCBhIFwiZHVyYXRpb25cIiBjb2x1bW4gdGhhdCBpc1xuICogbnVsbCBvbiA5MCUgb2Ygcm93cy5cbiAqXG4gKiBFbWFpbHMgYXJlIHRoZSB0aGlyZCBzaGFwZSBhbmQgc3RheSBvdXQ6IGFuIGVtYWlsIGlzIG5vdCBhIGNhbGVuZGFyIHNsb3QsIHNvXG4gKiBgc2VuZF9lbWFpbGAga2VlcHMgd3JpdGluZyBgc3lzX2VtYWlsYCArIGBzeXNfYWN0aXZpdHlgIChpdCBkb2VzIG5vdyBhbHNvXG4gKiBzdGFtcCBjb250YWN0IHJlY2VuY3kgXHUyMDE0IHNlZSBgY29udGFjdC5hY3Rpb25zLnRzYCkuXG4gKlxuICogIyBgc3RhdHVzYCBpcyB3aGF0IG1ha2VzIHRoZSBjaHVybiBzaWduYWwgaG9uZXN0XG4gKlxuICogT25seSBhIGBoZWxkYCBldmVudCBidW1wcyBgY3JtX2FjY291bnQubGFzdF9hY3Rpdml0eV9kYXRlYCAvXG4gKiBgY3JtX2xlYWQubGFzdF9jb250YWN0ZWRfZGF0ZWAgKHNlZSBgZXZlbnQuaG9vay50c2ApLiBBIG1lZXRpbmcgKmJvb2tlZCogZm9yXG4gKiBuZXh0IHF1YXJ0ZXIgaXMgbm90IGFuIGludGVyYWN0aW9uIHRoYXQgaGFwcGVuZWQsIGFuZCBsZXR0aW5nIGl0IHJlc2V0IHRoZVxuICogcmVjZW5jeSBjbG9jayBpcyBwcmVjaXNlbHkgaG93IGFuIFwiYXQgcmlza1wiIHJlcG9ydCBsZWFybnMgdG8gbGllLlxuICovXG5leHBvcnQgY29uc3QgRXZlbnQgPSBPYmplY3RTY2hlbWEuY3JlYXRlKHtcbiAgbmFtZTogJ2NybV9ldmVudCcsXG4gIGxhYmVsOiAnRXZlbnQnLFxuICBwbHVyYWxMYWJlbDogJ0V2ZW50cycsXG4gIGljb246ICdjYWxlbmRhci1kYXlzJyxcbiAgZGVzY3JpcHRpb246ICdNZWV0aW5ncywgY2FsbHMgYW5kIG90aGVyIHNjaGVkdWxlZCBpbnRlcmFjdGlvbnMgd2l0aCBjdXN0b21lcnMnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIE1pcnJvcnMgYGNybV90YXNrYDogYW4gZXZlbnRcbiAgLy8gaXMgYSBwZXJzb25hbCBhY3Rpdml0eSByZWNvcmQsIG93bmVkIGJ5IHRoZSByZXAgd2hvIHJhbiBpdC5cbiAgc2hhcmluZ01vZGVsOiAncHJpdmF0ZScsXG5cbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2Jhc2ljJywgICAgbGFiZWw6ICdFdmVudCBJbmZvcm1hdGlvbicsIGljb246ICdpbmZvJyB9LFxuICAgIHsga2V5OiAnc2NoZWR1bGUnLCBsYWJlbDogJ1NjaGVkdWxlJywgICAgICAgICAgaWNvbjogJ2NhbGVuZGFyJyB9LFxuICAgIHsga2V5OiAncmVsYXRlZCcsICBsYWJlbDogJ1JlbGF0ZWQgUmVjb3JkcycsICAgaWNvbjogJ2xpbmsnIH0sXG4gICAgeyBrZXk6ICdvdXRjb21lJywgIGxhYmVsOiAnT3V0Y29tZScsICAgICAgICAgICBpY29uOiAnY2xpcGJvYXJkLWNoZWNrJywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gUGxhdGZvcm0gb3duZXJzaGlwIGFuY2hvciBcdTIwMTQgY2Fub25pY2FsIG5vdGUgaW4gYGFjY291bnQub2JqZWN0LnRzYCAoIzU0OCkuXG4gICAgb3duZXJfaWQ6IEZpZWxkLmxvb2t1cCgnc3lzX3VzZXInLCB7XG4gICAgICBsYWJlbDogJ0Fzc2lnbmVkIFRvJyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgc3lzdGVtOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IGZhbHNlLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEV2ZW50IEluZm9ybWF0aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHN1YmplY3Q6IEZpZWxkLnRleHQoe1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ1N1YmplY3QnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBtYXhMZW5ndGg6IDI1NSxcbiAgICB9KSxcblxuICAgIHR5cGU6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnRXZlbnQgVHlwZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgLy8gRmllbGQtbGV2ZWwgZGVmYXVsdCwgbm90IGp1c3QgdGhlIG9wdGlvbiBmbGFnOiB0aGUgb3B0aW9uIGBkZWZhdWx0YFxuICAgICAgLy8gb25seSBwcmVzZWxlY3RzIGluIHNvbWUgZm9ybSBzdXJmYWNlcywgc28gYSBxdWljay1jcmVhdGUgb3BlbmVkIGZyb20gYVxuICAgICAgLy8gcmVsYXRlZCBsaXN0IGxlZnQgdGhpcyByZXF1aXJlZCBmaWVsZCBibGFuayAoc2FtZSBkZWZlY3QgY3JtX3Rhc2suc3RhdHVzXG4gICAgICAvLyBjYXJyaWVzIGEgbm90ZSBhYm91dCkuXG4gICAgICBkZWZhdWx0VmFsdWU6ICdtZWV0aW5nJyxcbiAgICAgIG9wdGlvbnM6IFsuLi5FVkVOVF9UWVBFX09QVElPTlNdLFxuICAgIH0pLFxuXG4gICAgc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ1N0YXR1cycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgICAgZGVmYXVsdFZhbHVlOiAncGxhbm5lZCcsXG4gICAgICBvcHRpb25zOiBbLi4uRVZFTlRfU1RBVFVTX09QVElPTlNdLFxuICAgIH0pLFxuXG4gICAgZGVzY3JpcHRpb246IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbGFiZWw6ICdEZXNjcmlwdGlvbicsXG4gICAgfSksXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgU2NoZWR1bGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgc3RhcnRfZGF0ZXRpbWU6IEZpZWxkLmRhdGV0aW1lKHtcbiAgICAgIGdyb3VwOiAnc2NoZWR1bGUnLFxuICAgICAgbGFiZWw6ICdTdGFydCcsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgIH0pLFxuXG4gICAgZW5kX2RhdGV0aW1lOiBGaWVsZC5kYXRldGltZSh7XG4gICAgICBncm91cDogJ3NjaGVkdWxlJyxcbiAgICAgIGxhYmVsOiAnRW5kJyxcbiAgICB9KSxcblxuICAgIGFsbF9kYXk6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgZ3JvdXA6ICdzY2hlZHVsZScsXG4gICAgICBsYWJlbDogJ0FsbCBEYXkgRXZlbnQnLFxuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICB9KSxcblxuICAgIC8vIERlcml2ZWQgaW4gYGV2ZW50Lmhvb2sudHNgIGZyb20gc3RhcnQvZW5kLiBOT1QgYHJlYWRvbmx5YDogdGhlIGZpZWxkIGlzXG4gICAgLy8gYWxzbyB3aGF0IHRoZSBhY3Rpdml0eSBhY3Rpb25zIHN1cHBseSBkaXJlY3RseSB3aGVuIGEgcmVwIGxvZ3MgYSBjYWxsXG4gICAgLy8gdGhhdCB0b29rIDIwIG1pbnV0ZXMsIGFuZCBhIHJlYWRvbmx5IGZpZWxkIGlzIHN0cmlwcGVkIGZyb20gYW55IHdyaXRlXG4gICAgLy8gd2hvc2UgQ0FMTEVSIHN1cHBsaWVkIHRoZSBrZXkgKCMyOTQ4KSBcdTIwMTQgaW5jbHVkaW5nIGFuIGFjdGlvbiBib2R5IHJ1bm5pbmdcbiAgICAvLyB1bmRlciB0aGUgcmVwJ3Mgb3duIGNvbnRleHQuIERlcml2YXRpb24gaW5zaWRlIHRoaXMgb2JqZWN0J3Mgb3duXG4gICAgLy8gYmVmb3JlLWhvb2sgaXMgdW5hZmZlY3RlZCBlaXRoZXIgd2F5ICh0aGUgc3RyaXAga2V5cyBvZmYgdGhlIGNhbGxlcidzXG4gICAgLy8gcGF5bG9hZCwgbm90IHRoZSBwb3N0LWhvb2sgZG9jdW1lbnQpLCBzbyBsZWF2aW5nIGl0IHdyaXRhYmxlIGNvc3RzXG4gICAgLy8gbm90aGluZyBhbmQga2VlcHMgYGxvZ19jYWxsYCBob25lc3QuXG4gICAgZHVyYXRpb25fbWludXRlczogRmllbGQubnVtYmVyKHtcbiAgICAgIGdyb3VwOiAnc2NoZWR1bGUnLFxuICAgICAgbGFiZWw6ICdEdXJhdGlvbiAobWludXRlcyknLFxuICAgICAgbWluOiAwLFxuICAgICAgc2NhbGU6IDAsXG4gICAgfSksXG5cbiAgICBsb2NhdGlvbjogRmllbGQudGV4dCh7XG4gICAgICBncm91cDogJ3NjaGVkdWxlJyxcbiAgICAgIGxhYmVsOiAnTG9jYXRpb24nLFxuICAgICAgbWF4TGVuZ3RoOiAyNTUsXG4gICAgICBkZXNjcmlwdGlvbjogJ1Jvb20sIGFkZHJlc3MsIG9yIG1lZXRpbmcgbGluaycsXG4gICAgfSksXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgUmVsYXRlZCBSZWNvcmRzIChwb2x5bW9ycGhpYywgc2FtZSBzaGFwZSBhcyBjcm1fdGFzaykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgcmVsYXRlZF90b190eXBlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgZ3JvdXA6ICdyZWxhdGVkJyxcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBUbyBUeXBlJyxcbiAgICAgIG9wdGlvbnM6IFsuLi5SRUxBVEVEX1RPX1RZUEVfT1BUSU9OU10sXG4gICAgfSksXG5cbiAgICByZWxhdGVkX3RvX2FjY291bnQ6IEZpZWxkLmxvb2t1cCgnY3JtX2FjY291bnQnLCB7XG4gICAgICBncm91cDogJ3JlbGF0ZWQnLFxuICAgICAgbGFiZWw6ICdSZWxhdGVkIEFjY291bnQnLFxuICAgIH0pLFxuXG4gICAgcmVsYXRlZF90b19jb250YWN0OiBGaWVsZC5sb29rdXAoJ2NybV9jb250YWN0Jywge1xuICAgICAgZ3JvdXA6ICdyZWxhdGVkJyxcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBDb250YWN0JyxcbiAgICB9KSxcblxuICAgIHJlbGF0ZWRfdG9fb3Bwb3J0dW5pdHk6IEZpZWxkLmxvb2t1cCgnY3JtX29wcG9ydHVuaXR5Jywge1xuICAgICAgZ3JvdXA6ICdyZWxhdGVkJyxcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBPcHBvcnR1bml0eScsXG4gICAgfSksXG5cbiAgICByZWxhdGVkX3RvX2xlYWQ6IEZpZWxkLmxvb2t1cCgnY3JtX2xlYWQnLCB7XG4gICAgICBncm91cDogJ3JlbGF0ZWQnLFxuICAgICAgbGFiZWw6ICdSZWxhdGVkIExlYWQnLFxuICAgIH0pLFxuXG4gICAgcmVsYXRlZF90b19jYXNlOiBGaWVsZC5sb29rdXAoJ2NybV9jYXNlJywge1xuICAgICAgZ3JvdXA6ICdyZWxhdGVkJyxcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBDYXNlJyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBPdXRjb21lIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIG91dGNvbWVfbm90ZXM6IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGdyb3VwOiAnb3V0Y29tZScsXG4gICAgICBsYWJlbDogJ091dGNvbWUgTm90ZXMnLFxuICAgICAgZGVzY3JpcHRpb246ICdXaGF0IHdhcyBhZ3JlZWQsIGFuZCB3aGF0IGhhcHBlbnMgbmV4dCcsXG4gICAgfSksXG5cbiAgICAvLyBObyBgaXNfcGFzdGAgLyBgaXNfdXBjb21pbmdgIGJvb2xlYW4uIEEgd3JpdGUtdGltZSBzbmFwc2hvdCBvZiBcImhhcyB0aGlzXG4gICAgLy8gaGFwcGVuZWQgeWV0XCIgaXMgc3RhbGUgdGhlIG1vbWVudCB0aGUgY2xvY2sgcGFzc2VzIGl0LCBhbmQgdGhlIGFwcCBoYXNcbiAgICAvLyBhbHJlYWR5IGJlZW4gYnVybnQgYnkgZXhhY3RseSB0aGF0IChgY3JtX3Rhc2suaXNfb3ZlcmR1ZWAgXHUyMDE0IHNlZSB0aGVcbiAgICAvLyBgb3ZlcmR1ZV90YXNrc2AgdmlldydzIGxhYmVsIG5vdGUpLiBgc3RhdHVzYCBpcyB0aGUgYXV0aG9yZWQsIG5vbi1kZWNheWluZ1xuICAgIC8vIHNpZ25hbCwgYW5kIHRoZSB1cGNvbWluZy9wYXN0IHZpZXdzIGZpbHRlciBvbiBpdCBhbmQgc29ydCBieVxuICAgIC8vIGBzdGFydF9kYXRldGltZWAgaW5zdGVhZC5cbiAgfSxcblxuICAvLyBBUEkgc3VyZmFjZS4gSGlzdG9yeSBcdTIxOTIgRmllbGQudHJhY2tIaXN0b3J5IChBRFItMDA1MikuXG4gIGVuYWJsZToge1xuICAgIGFwaUVuYWJsZWQ6IHRydWUsXG4gIH0sXG5cbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ3N0YXJ0X2RhdGV0aW1lJ10gfSxcbiAgICB7IGZpZWxkczogWydvd25lcl9pZCddIH0sXG4gICAgeyBmaWVsZHM6IFsnc3RhdHVzJ10gfSxcbiAgICB7IGZpZWxkczogWydyZWxhdGVkX3RvX2FjY291bnQnXSB9LFxuICAgIHsgZmllbGRzOiBbJ3JlbGF0ZWRfdG9fb3Bwb3J0dW5pdHknXSB9LFxuICBdLFxuXG4gIC8vIEFEUi0wMDc5OiBgbmFtZUZpZWxkYCBuYW1lcyB0aGUgcmVhbCBmaWVsZCBob2xkaW5nIHRoZSByZWNvcmQgdGl0bGUuXG4gIG5hbWVGaWVsZDogJ3N1YmplY3QnLFxuICBoaWdobGlnaHRGaWVsZHM6IFsnc3ViamVjdCcsICd0eXBlJywgJ3N0YXR1cycsICdzdGFydF9kYXRldGltZScsICdvd25lcl9pZCddLFxuICBzZWFyY2hhYmxlRmllbGRzOiBbJ3N1YmplY3QnLCAnbG9jYXRpb24nXSxcblxuICAvLyBQcmVkaWNhdGVzIGJlbG93IGFyZSBUT1RBTDogZXZlcnkgYHJlY29yZC54YCByZWFkIGlzIGBoYXMoKWAtZ3VhcmRlZCwgc28gdGhlXG4gIC8vIHJ1bGUgcmV0dXJucyBhIHZlcmRpY3QgZXZlbiB3aGVuIHRoZSBtZXJnZWQgcmVjb3JkIGhhcyBubyBzdWNoIGtleS4gU2VlXG4gIC8vIEFHRU5UUy5tZCBcIlZhbGlkYXRpb24gcHJlZGljYXRlcyBtdXN0IGJlIFRPVEFMXCIgYW5kXG4gIC8vIHRlc3Qvb2JqZWN0LXZhbGlkYXRpb24tcHJlZGljYXRlcy50ZXN0LnRzLCB3aGljaCBmYWlscyB0aGUgYnVpbGQgb3RoZXJ3aXNlLlxuICB2YWxpZGF0aW9uczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdlbmRfYWZ0ZXJfc3RhcnQnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdUaGUgZW5kIHRpbWUgbXVzdCBiZSBhZnRlciB0aGUgc3RhcnQgdGltZScsXG4gICAgICAvLyBCT1RIIGd1YXJkcywgb24gYm90aCBvcGVyYW5kcywgYmVjYXVzZSB0aGV5IGFuc3dlciBkaWZmZXJlbnQgaGF6YXJkc1xuICAgICAgLy8gKEFHRU5UUy5tZCBcIlZhbGlkYXRpb24gcHJlZGljYXRlcyBtdXN0IGJlIFRPVEFMXCIpOlxuICAgICAgLy8gICBcdTAwQjcgYGhhcyguLi4pYCAgXHUyMDE0IGFic2VudCBrZXkuIE9uIGEgZHJpdmVyIHRoYXQgc3RvcmVzIG9ubHkgdGhlIGNvbHVtbnNcbiAgICAgIC8vICAgICBhIHJvdyB3YXMgd3JpdHRlbiB3aXRoLCBhbiBhYnNlbnQgYGVuZF9kYXRldGltZWAgYWJvcnRzIHRoZSB3aG9sZVxuICAgICAgLy8gICAgIHByZWRpY2F0ZSB1bmRlciBzdHJpY3QgQ0VMLCBhbmQgZnJvbSAxNy4wLjAtcmMuMiB0aGF0IGFib3J0IFJFSkVDVFNcbiAgICAgIC8vICAgICB0aGUgc2F2ZSByYXRoZXIgdGhhbiBza2lwcGluZyB0aGUgcnVsZSAoIzQ2NDkpLlxuICAgICAgLy8gICBcdTAwQjcgYCE9IG51bGxgICAgXHUyMDE0IHByZXNlbnQtYnV0LW51bGwuIGBkeW48bnVsbD4gPCBkeW5gIGFib3J0cyB0b28sIGFuZFxuICAgICAgLy8gICAgIGBoYXMoKWAgc2F5cyBub3RoaW5nIGFib3V0IGl0LlxuICAgICAgLy8gQW4gb3JkZXJpbmcgY29tcGFyaXNvbiBuZWVkcyBib3RoOyBuZWl0aGVyIHN1YnN0aXR1dGVzIGZvciB0aGUgb3RoZXIuXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5zdGFydF9kYXRldGltZSkgJiYgaGFzKHJlY29yZC5lbmRfZGF0ZXRpbWUpICYmIHJlY29yZC5zdGFydF9kYXRldGltZSAhPSBudWxsICYmIHJlY29yZC5lbmRfZGF0ZXRpbWUgIT0gbnVsbCAmJiAhaXNCbGFuayhyZWNvcmQuZW5kX2RhdGV0aW1lKSAmJiByZWNvcmQuZW5kX2RhdGV0aW1lIDwgcmVjb3JkLnN0YXJ0X2RhdGV0aW1lYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdyZWxhdGVkX3RvX3JlcXVpcmVkJyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6ICdBdCBsZWFzdCBvbmUgcmVsYXRlZCByZWNvcmQgc2hvdWxkIGJlIHNlbGVjdGVkJyxcbiAgICAgIGNvbmRpdGlvbjogUGAoIWhhcyhyZWNvcmQucmVsYXRlZF90b19hY2NvdW50KSB8fCBpc0JsYW5rKHJlY29yZC5yZWxhdGVkX3RvX2FjY291bnQpKSAmJiAoIWhhcyhyZWNvcmQucmVsYXRlZF90b19jb250YWN0KSB8fCBpc0JsYW5rKHJlY29yZC5yZWxhdGVkX3RvX2NvbnRhY3QpKSAmJiAoIWhhcyhyZWNvcmQucmVsYXRlZF90b19vcHBvcnR1bml0eSkgfHwgaXNCbGFuayhyZWNvcmQucmVsYXRlZF90b19vcHBvcnR1bml0eSkpICYmICghaGFzKHJlY29yZC5yZWxhdGVkX3RvX2xlYWQpIHx8IGlzQmxhbmsocmVjb3JkLnJlbGF0ZWRfdG9fbGVhZCkpICYmICghaGFzKHJlY29yZC5yZWxhdGVkX3RvX2Nhc2UpIHx8IGlzQmxhbmsocmVjb3JkLnJlbGF0ZWRfdG9fY2FzZSkpYCxcbiAgICB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2V2ZW50X2F0dGVuZGVlLm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvZXZlbnRfYXR0ZW5kZWUub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBleHByZXNzaW9uIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgT2JqZWN0U2NoZW1hLCBGaWVsZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgQVRURU5ERUVfUkVTUE9OU0VfT1BUSU9OUyB9IGZyb20gJy4vX3BpY2tsaXN0cyc7XG5cbi8qKlxuICogVGhlIHdheXMgYW4gYXR0ZW5kZWUgcm93IGNhbiBuYW1lIGEgcGVyc29uIFx1MjAxNCBPTkUgZGVjbGFyYXRpb24sIG5vdCB0d28gbGlzdHNcbiAqIHRoYXQgaGFwcGVuIHRvIGxpbmUgdXAuXG4gKlxuICogYGF0dGVuZGVlX3R5cGVgIGlzIHRoZSBkaXNjcmltaW5hdG9yIGFuZCBlYWNoIG9mIHRoZSBmb3VyIGNvbHVtbnMgYmVsb3cgaXMgYVxuICogcmVzb2x1dGlvbi4gXHUyNkQ0IEF1dGhvcmluZyB0aGUgdHdvIHNlcGFyYXRlbHkgbGV0cyB0aGVtIGRyaWZ0LCBhbmQgdGhlIGZhaWx1cmVcbiAqIGlzIHNpbGVudDogYSB0eXBlIHdpdGggbm8gbWF0Y2hpbmcgcmVzb2x1dGlvbiBtZWFucyBhbiBleHRlcm5hbCBndWVzdCBjYW5cbiAqIG9ubHkgYmUgU1RPUkVEIE1JU0xBQkVMTEVEIChhIHJvdyBjbGFpbWluZyB0byBiZSBhIENvbnRhY3Qgd2hpbGUgcG9pbnRpbmcgYXRcbiAqIG5vIGNvbnRhY3QgaXMgQUNDRVBURUQsIGFuZCBhbiBvbWl0dGVkIHR5cGUgZmFsbHMgdG8gdGhlIGZpZWxkIGRlZmF1bHQpLlxuICpcbiAqIERlcml2aW5nIEJPVEggdGhlIHBpY2tsaXN0IGFuZCB0aGUgdHdvIHJ1bGVzIGZyb20gdGhpcyB0YWJsZSBpcyB0aGUgcG9pbnQ6IGFcbiAqIGZpZnRoIHJlc29sdXRpb24gY2Fubm90IGJlIGFkZGVkIHdpdGhvdXQgaXRzIHR5cGUsIGFuZCBhIHR5cGUgY2Fubm90IGJlIGFkZGVkXG4gKiB3aXRob3V0IHNheWluZyB3aGljaCBjb2x1bW4gaXQgbmFtZXMgXHUyMDE0IHRoZSBmYWlsdXJlIGlzIG5vdCBleHByZXNzaWJsZSBpbiB0aGlzXG4gKiBzaGFwZS4gRXZlcnl0aGluZyBkb3duc3RyZWFtIChvcHRpb25zLCBgYXR0ZW5kZWVfcmVzb2x2ZXNgLFxuICogYGF0dGVuZGVlX3R5cGVfZXhjbHVzaXZlYCkgaXMgZ2VuZXJhdGVkIGJlbG93OyBub3RoaW5nIHJlcGVhdHMgdGhlIHBhaXJpbmcuXG4gKiBgdGVzdC9hdHRlbmRlZS10eXBlLXJlc29sdXRpb24udGVzdC50c2AgcGlucyBpdC5cbiAqXG4gKiBBZGRpbmcgYSByb3cgaGVyZSBpcyBhIHVzZXItdmlzaWJsZSBwaWNrbGlzdCBjaGFuZ2U6IGl0IG5lZWRzIGEgbGFiZWwgaW4gYWxsXG4gKiBmb3VyIGxvY2FsZSBwYWNrcyAoYHRlc3QvaTE4bi1yZWZlcmVuY2VzLnRlc3QudHNgIGZhaWxzIG90aGVyd2lzZSkgYW5kIGFcbiAqIGNoYW5nZXNldC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFUVEVOREVFX1JFU09MVVRJT05TID0gW1xuICB7IHZhbHVlOiAnY29udGFjdCcsICBjb2x1bW46ICdjcm1fY29udGFjdCcsICAgbGFiZWw6ICdDb250YWN0JywgIGNvbG9yOiAnIzQxNjlFMScgfSxcbiAgeyB2YWx1ZTogJ2xlYWQnLCAgICAgY29sdW1uOiAnY3JtX2xlYWQnLCAgICAgIGxhYmVsOiAnTGVhZCcsICAgICBjb2xvcjogJyNGRkE1MDAnIH0sXG4gIHsgdmFsdWU6ICd1c2VyJywgICAgIGNvbHVtbjogJ3N5c191c2VyJywgICAgICBsYWJlbDogJ1VzZXInLCAgICAgY29sb3I6ICcjMDBBQTAwJyB9LFxuICB7IHZhbHVlOiAnZXh0ZXJuYWwnLCBjb2x1bW46ICdleHRlcm5hbF9uYW1lJywgbGFiZWw6ICdFeHRlcm5hbCcsIGNvbG9yOiAnIzhBOEE4QScgfSxcbl0gYXMgY29uc3Q7XG5cbi8qKiBBIG5ldyBhdHRlbmRlZSByb3cgaXMgYSBDb250YWN0IHVudGlsIHRoZSBhdXRob3Igc2F5cyBvdGhlcndpc2UuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BVFRFTkRFRV9UWVBFID0gJ2NvbnRhY3QnO1xuXG4vLyBUaGUgcHJlZGljYXRlIGZyYWdtZW50cyBiZWxvdyBhcmUgdGhlIFRPVEFMIHNoYXBlcyBmcm9tIHRoZSBob3VzZSBydWxlIGluXG4vLyBgdGVzdC9vYmplY3QtdmFsaWRhdGlvbi1wcmVkaWNhdGVzLnRlc3QudHNgOiBldmVyeSBgcmVjb3JkLnhgIHJlYWQgY2FycmllcyBpdHNcbi8vIG93biBgaGFzKHJlY29yZC54KWAgaW4gdGhlIHNhbWUgZXhwcmVzc2lvbiwgc28gdGhlIHJ1bGUgcmV0dXJucyBhIHZlcmRpY3Qgb24gYVxuLy8gbWVyZ2VkIHJlY29yZCB3aXRoIGFic2VudCBrZXlzIGluc3RlYWQgb2YgYWJvcnRpbmcgKGFuZCwgZnJvbSAxNy4wLjAtcmMuMixcbi8vIHJlamVjdGluZyB0aGUgd3JpdGUgaXQgY291bGQgbm90IGp1ZGdlKS5cbmNvbnN0IGJsYW5rID0gKGY6IHN0cmluZykgPT4gYCghaGFzKHJlY29yZC4ke2Z9KSB8fCBpc0JsYW5rKHJlY29yZC4ke2Z9KSlgO1xuY29uc3QgZmlsbGVkID0gKGY6IHN0cmluZykgPT4gYChoYXMocmVjb3JkLiR7Zn0pICYmICFpc0JsYW5rKHJlY29yZC4ke2Z9KSlgO1xuY29uc3QgdHlwZUlzID0gKHY6IHN0cmluZykgPT4gYChoYXMocmVjb3JkLmF0dGVuZGVlX3R5cGUpICYmIHJlY29yZC5hdHRlbmRlZV90eXBlID09IFwiJHt2fVwiKWA7XG5jb25zdCB0eXBlSXNOb3QgPSAodjogc3RyaW5nKSA9PiBgKGhhcyhyZWNvcmQuYXR0ZW5kZWVfdHlwZSkgJiYgcmVjb3JkLmF0dGVuZGVlX3R5cGUgIT0gXCIke3Z9XCIpYDtcblxuLyoqXG4gKiBWaW9sYXRpb24gcHJlZGljYXRlcyBcdTIwMTQgdmFsaWRhdGlvbnMgZmlyZSB3aGVuIHRoZSBjb25kaXRpb24gaXMgVFJVRS5cbiAqXG4gKiBUaGV5IGFyZSB0aGUgdHdvIGhhbHZlcyBvZiBcImRlY2xhcmVkID0gZW5mb3JjZWRcIiwgc3BsaXQgc28gZWFjaCBjb25kaXRpb25cbiAqIGNhcnJpZXMgaXRzIG93biB3b3JkaW5nOiBhIHJvdyBtaXNzaW5nIHRoZSBwYXJ0eSBpdHMgdHlwZSBuYW1lcyBpcyBhXG4gKiBkaWZmZXJlbnQgbWlzdGFrZSBmcm9tIGEgcm93IG5hbWluZyBhIHBhcnR5IGl0cyB0eXBlIGRvZXMgbm90LlxuICpcbiAqIEEgcmVjb3JkIHdob3NlIGBhdHRlbmRlZV90eXBlYCBpcyBhYnNlbnQgc2F0aXNmaWVzIG5laXRoZXIgKGV2ZXJ5IGZyYWdtZW50IGlzXG4gKiBgaGFzKClgLWd1YXJkZWQgb24gaXQpLCB3aGljaCBpcyBkZWxpYmVyYXRlOiBcIm5vIHR5cGUgYXQgYWxsXCIgaXMgdGhlIFJFUVVJUkVEXG4gKiBmaWVsZCdzIGpvYiBcdTIwMTQgYEF0dGVuZGVlIFR5cGUgaXMgcmVxdWlyZWRgIG5hbWVzIHRoZSByZWFsIG9ic3RhY2xlLCBhbmQgYVxuICogc2Vjb25kIHJ1bGUgc2F5aW5nIHNvIHdvdWxkIG9ubHkgc2hhZG93IGl0LlxuICovXG5jb25zdCBSRVNPTFZFU19DT05ESVRJT04gPSBBVFRFTkRFRV9SRVNPTFVUSU9OU1xuICAubWFwKChyKSA9PiBgKCR7dHlwZUlzKHIudmFsdWUpfSAmJiAke2JsYW5rKHIuY29sdW1uKX0pYClcbiAgLmpvaW4oJyB8fCAnKTtcblxuY29uc3QgRVhDTFVTSVZFX0NPTkRJVElPTiA9IEFUVEVOREVFX1JFU09MVVRJT05TXG4gIC5tYXAoKHIpID0+IGAoJHtmaWxsZWQoci5jb2x1bW4pfSAmJiAke3R5cGVJc05vdChyLnZhbHVlKX0pYClcbiAgLmpvaW4oJyB8fCAnKTtcblxuLyoqXG4gKiBgcmVxdWlyZWRXaGVuYCBmb3Igb25lIHBhcnR5IGNvbHVtbiBcdTIwMTQgdGhlIFNBTUUgY29ycmVzcG9uZGVuY2UgdGhlIHR3byBydWxlc1xuICogZW5mb3JjZSwgYXNrZWQgb25lIGxheWVyIGVhcmxpZXIgc28gdGhlIGZvcm0gbWFya3MgdGhlIGNvbHVtbiB0aGUgY2hvc2VuIHR5cGVcbiAqIG5hbWVzIGluc3RlYWQgb2YgbGV0dGluZyB0aGUgc2F2ZSBkaXNjb3ZlciBpdCBpcyBlbXB0eS4gRGVyaXZlZCBmcm9tXG4gKiBgQVRURU5ERUVfUkVTT0xVVElPTlNgIGxpa2UgZXZlcnl0aGluZyBlbHNlIGhlcmU6IGEgZmlmdGggcmVzb2x1dGlvbiBnZXRzIGl0c1xuICogaGludCBmb3IgZnJlZSBhbmQgY2Fubm90IGdldCBpdCB3cm9uZy5cbiAqXG4gKiBUaGlzIGlzIGEgSElOVCwgbm90IHRoZSBjb250cmFjdC4gYGF0dGVuZGVlX3Jlc29sdmVzYCBhbmRcbiAqIGBhdHRlbmRlZV90eXBlX2V4Y2x1c2l2ZWAgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUgYXJlIHRoZSBjb250cmFjdCBldmVyeVxuICogd3JpdGVyIG1lZXRzIFx1MjAxNCBSRVNULCBPYmplY3RRTCwgc2VlZHMsIGZsb3dzIFx1MjAxNCBhbmQgbm90aGluZyBoZXJlIHJlbGF4ZXNcbiAqIGVpdGhlci4gXHUyNkEwXHVGRTBGIGByZXF1aXJlZFdoZW5gIGlzIGEgdHJhbnNpdGlvbiBnYXRlLCBub3QgYW4gaW52YXJpYW50OiBpdCBhc2tzIHRoZVxuICogd3JpdGUgaW4gZnJvbnQgb2YgaXQgZm9yIHRoZSBjb2x1bW4sIGl0IGRvZXMgbm90IHN0YXRlIGEgcHJvcGVydHkgb2Ygc3RvcmVkXG4gKiByb3dzLiBUaGUgZHVwbGljYXRpb24gaXMgZGVsaWJlcmF0ZSBhbmQgdmlzaWJsZSBcdTIwMTQgYSBSRVNUIGluc2VydCBvbWl0dGluZyB0aGVcbiAqIG5hbWVkIGNvbHVtbiBhbnN3ZXJzIHR3aWNlLCBvbmNlIHBlciBsYXllciwgYW5kIHRoZSBhY2NlcHRlZCBzZXQgaXNcbiAqIHVuY2hhbmdlZC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgVGhlIHByZWRpY2F0ZSBpcyBUT1RBTCAoYGhhcygpYC1ndWFyZGVkIHZpYSBgdHlwZUlzYCksIHRoZSBzYW1lIGhvdXNlIHJ1bGVcbiAqIEFHRU5UUy5tZCBzdGF0ZXMgZm9yIGV2ZXJ5IGF1dGhvcmVkIENFTCBwcmVkaWNhdGUuIGByZXF1aXJlZFdoZW5gIGZhaWxzXG4gKiBDTE9TRUQgaW4gdGhlIENvbnNvbGUgXHUyMDE0IGFuIHVuZXZhbHVhYmxlIHByZWRpY2F0ZSBkZW1hbmRzIG5vdGhpbmcgXHUyMDE0IHNvIGFuXG4gKiB1bmd1YXJkZWQgb25lIHdvdWxkIHJlYWQgYXMgZW5mb3JjZWQgaGVyZSBhbmQgcmVxdWlyZSBub3RoaW5nIGF0IHRoZSBmb3JtLlxuICpcbiAqICMgXHUyNkQ0IFdoeSB0aGVyZSBpcyBubyBgdmlzaWJsZVdoZW5gIGJlc2lkZSBpdFxuICpcbiAqIFx1MjZBMFx1RkUwRiBQbGF0Zm9ybSBjb25zdHJhaW50LCBtZWFzdXJlZCBpbiB0aGUgYnJvd3NlciBvbiAxNy4xLjA6IHRoZSBDb25zb2xlIGhpZGVzXG4gKiBhIHBvcHVsYXRlZCBmaWVsZCBXSVRIT1VUIGNsZWFyaW5nIGl0IGFuZCBzdWJtaXRzIHRoZSBzdGFsZSB2YWx1ZSBhbnl3YXkuXG4gKiBGaWxsIENvbnRhY3QsIHRoZW4gY2hhbmdlIHRoZSB0eXBlIHRvIExlYWQgXHUyMDE0IHRoZSBDb250YWN0IGNvbHVtbiBsZWF2ZXMgdGhlXG4gKiBET00sIGl0cyB2YWx1ZSBzdGF5cyBpbiBmb3JtIHN0YXRlLCBhbmQgdGhlIHdyaXRlIGNhcnJpZXMgaXQ6XG4gKlxuICogICAgIFBPU1QgIHtcImF0dGVuZGVlX3R5cGVcIjpcImxlYWRcIiwgXHUyMDI2LCBcImNybV9jb250YWN0XCI6XCJBRXdQZmZia012eC1PbEM0XCIsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY3JtX2xlYWRcIjpcIjBBTV96YmRqdUxjWE1kbkxcIn1cbiAqICAgICA0MDAgICBBbiBhdHRlbmRlZSBuYW1lcyBleGFjdGx5IG9uZSBwYXJ0eSBcdTIwMTQgY2xlYXIgZXZlcnkgcGFydHkgY29sdW1uXG4gKiAgICAgICAgICAgaXRzIEF0dGVuZGVlIFR5cGUgZG9lcyBub3QgbmFtZVxuICpcbiAqIFx1MjAxNCBzbyB0aGUgcm93IGlzIHJlZnVzZWQsIGNvcnJlY3RseSwgYnkgYSBtZXNzYWdlIG5hbWluZyBhIGNvbHVtbiBubyBsb25nZXIgb25cbiAqIHNjcmVlbiB0byBjbGVhci4gT24gdGhlIEVESVQgcGF0aCBpdCBpcyBhIGRlYWQgZW5kIHJhdGhlciB0aGFuIGEgcHV6emxlOlxuICogcmV0eXBpbmcgYSBzdG9yZWQgYGNvbnRhY3RgIHJvdyB0byBgdXNlcmAgcmUtc2VuZHMgdGhlIHN0b3JlZCBgY3JtX2NvbnRhY3RgXG4gKiBvbiBldmVyeSBhdHRlbXB0LCBhbmQgdGhlIENvbnNvbGUgb2ZmZXJzIG5vIHdheSB0byBlbXB0eSBpdC4gVG9kYXkncyBmb3JtIGlzXG4gKiB3b3JzZS1sb29raW5nIGFuZCBzdHJpY3RseSBtb3JlIHVzYWJsZTogdGhlIG9mZmVuZGluZyBjb2x1bW4gaXMgdmlzaWJsZSwgc29cbiAqIHRoZSBlcnJvciBjYW4gYmUgYWN0ZWQgb24uXG4gKlxuICogTm90aGluZyBpbiBgQG9iamVjdHN0YWNrL3NwZWNgIDE3LjEuMCBvciB0aGUgc2hpcHBlZCBDb25zb2xlIGNsZWFycyBhIHZhbHVlXG4gKiB3aGVuIGl0cyBmaWVsZCBnb2VzIGludmlzaWJsZSBcdTIwMTQgbm8gYGNsZWFyT25IaWRlYC1zaGFwZWQga2V5IGV4aXN0cyBvbiBlaXRoZXJcbiAqIHN1cmZhY2UgXHUyMDE0IHNvIGB2aXNpYmxlV2hlbmAgaGVyZSBjYW5ub3QgYmUgcGFpcmVkIGludG8gc2FmZXR5IGZyb20gdGhpcyByZXBvLlxuICogVGhlIGhhbGYgdGhhdCB3b3VsZCBuZWVkIHRvIGNoYW5nZSBpcyB1cHN0cmVhbTsgaXQgaXMgdGhlIHNhbWVcbiAqIGZhaWwtb3Blbi9zdGFsZS1zdGF0ZSBmYW1pbHkgYXMgdGhlIG5vdGUgaW4gYHNyYy9zYWxlcy92aWV3cy9sZWFkLnZpZXcudHNgLiBcdTI2RDQgRG9cbiAqIG5vdCBhZGQgYHZpc2libGVXaGVuYCB0byB0aGVzZSBmb3VyIGNvbHVtbnMgdW50aWwgYSBoaWRkZW4gZmllbGQgc3RvcHMgYmVpbmdcbiAqIHN1Ym1pdHRlZDsgdGhlIHJ1bGVzIGFib3ZlIHdpbGwga2VlcCByZWZ1c2luZyB0aGUgcm93LCBidXQgdGhlIHBlcnNvbiBpblxuICogZnJvbnQgb2YgdGhlIGZvcm0gd2lsbCBoYXZlIG5vIHdheSB0byBmaXggaXQuXG4gKi9cbmNvbnN0IHBhcnR5Rm9ybUhpbnRzID0gKGNvbHVtbjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHJlc29sdXRpb24gPSBBVFRFTkRFRV9SRVNPTFVUSU9OUy5maW5kKChyKSA9PiByLmNvbHVtbiA9PT0gY29sdW1uKTtcbiAgaWYgKCFyZXNvbHV0aW9uKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBObyBhdHRlbmRlZSByZXNvbHV0aW9uIGRlY2xhcmVzIHRoZSBjb2x1bW4gXCIke2NvbHVtbn1cImApO1xuICB9XG4gIHJldHVybiB7XG4gICAgcmVxdWlyZWRXaGVuOiBleHByZXNzaW9uKHR5cGVJcyhyZXNvbHV0aW9uLnZhbHVlKSwgJ2NlbCcpLFxuICB9O1xufTtcblxuLyoqXG4gKiBFdmVudCBBdHRlbmRlZSBcdTIwMTQgd2hvIHdhcyBpbiB0aGUgcm9vbS5cbiAqXG4gKiAjIFdoeSBhIGp1bmN0aW9uIG9iamVjdCwgYW5kIG5vdCBtdWx0aS12YWx1ZSBsb29rdXBzXG4gKlxuICogXCJBdHRlbmRlZXMgYXJlIHF1ZXJ5YWJsZSBSRUNPUkRTLCBub3QgSlNPTiBzdHJpbmdzXCIsIGFuZCB0aHJlZSBwcm9wZXJ0aWVzXG4gKiBkZWNpZGUgdGhlIHNoYXBlOlxuICpcbiAqICAxLiAqKkF0dGVuZGVlcyBhcmUgaGV0ZXJvZ2VuZW91cy4qKiBBIGN1c3RvbWVyIG1lZXRpbmcgaGFzIGludGVybmFsIHBlb3BsZVxuICogICAgIChgc3lzX3VzZXJgKSwgZXhpc3RpbmcgY3VzdG9tZXJzIChgY3JtX2NvbnRhY3RgKSBhbmQgcHJvc3BlY3RzXG4gKiAgICAgKGBjcm1fbGVhZGApIGluIGl0LiBBIGBGaWVsZC5sb29rdXAoLi4uLCB7IG11bHRpcGxlOiB0cnVlIH0pYCBwb2ludHMgYXRcbiAqICAgICBleGFjdGx5IE9ORSBvYmplY3QsIHNvIGEgbXVsdGktbG9va3VwIGRlc2lnbiBuZWVkcyB0aHJlZSBwYXJhbGxlbFxuICogICAgIG11bHRpLWxvb2t1cHMgYW5kIG5vIHdheSB0byBvcmRlciBvciBkZS1kdXBsaWNhdGUgYWNyb3NzIHRoZW0uXG4gKiAgMi4gKipBbiBhdHRlbmRlZSBjYXJyaWVzIGl0cyBvd24gYXR0cmlidXRlcy4qKiBgcmVzcG9uc2VgIGFuZCBgaXNfb3JnYW5pemVyYFxuICogICAgIGJlbG9uZyB0byB0aGUgKnBhaXJpbmcqIG9mIGEgcGVyc29uIGFuZCBhbiBldmVudCwgbm90IHRvIGVpdGhlciBzaWRlLiBBXG4gKiAgICAgbXVsdGktdmFsdWUgbG9va3VwIHN0b3JlcyBhIGJhcmUgaWQgYXJyYXkgd2l0aCBub3doZXJlIHRvIGhhbmcgdGhlbS5cbiAqICAzLiAqKkEganVuY3Rpb24gaXMgcXVlcnlhYmxlLioqIFwiTWVldGluZ3MgdGhpcyByZXAgYXR0ZW5kZWRcIiwgXCJjb250YWN0cyB3aG9cbiAqICAgICBkZWNsaW5lZCB0d2ljZSB0aGlzIHF1YXJ0ZXJcIiBhbmQgXCJhY2NvdW50cyB3aG9zZSBjaGFtcGlvbiBoYXMgbm90XG4gKiAgICAgYXR0ZW5kZWQgYW55dGhpbmcgaW4gOTAgZGF5c1wiIGFyZSBhbGwgYGZpbmQoKWAgY2FsbHMgb24gdGhpcyBvYmplY3QuXG4gKiAgICAgQWdhaW5zdCBhbiBpZCBhcnJheSBpbnNpZGUgYSBtdWx0aS12YWx1ZSBjb2x1bW4gdGhleSBhcmUgbm90IGV4cHJlc3NpYmxlXG4gKiAgICAgaW4gT2JqZWN0UUwgYXQgYWxsLlxuICpcbiAqIFRoaXMgbWlycm9ycyBgY3JtX2NhbXBhaWduX21lbWJlcmAsIHRoZSBhcHAncyBleGlzdGluZyBqdW5jdGlvbiwgZG93biB0byB0aGVcbiAqIGF1dG9udW1iZXIgYG5hbWVGaWVsZGAgYW5kIHRoZSBgY29udHJvbGxlZF9ieV9wYXJlbnRgIE9XRC5cbiAqXG4gKiAjIEFjY2VzcyBkZXJpdmVzIGZyb20gdGhlIGV2ZW50XG4gKlxuICogYHNoYXJpbmdNb2RlbDogJ2NvbnRyb2xsZWRfYnlfcGFyZW50J2AgKEFEUi0wMDU1KS4gVGhlIHJlbGF0aW9uIHJlc29sdmVyXG4gKiBhY2NlcHRzIHRoZSBSRVFVSVJFRCBgY3JtX2V2ZW50YCBsb29rdXAgYXMgdGhlIHBhcmVudCwgc28gbm8gbWFzdGVyLWRldGFpbFxuICogY29udmVyc2lvbiBpcyBuZWVkZWQgXHUyMDE0IHNhbWUgY29uc3RydWN0aW9uIGFzIGBjcm1fY2FtcGFpZ25fbWVtYmVyYC5cbiAqXG4gKiBSZWFkcyBhcmUgZmlsdGVyZWQgdG8gYXR0ZW5kZWVzIHdob3NlIGBjcm1fZXZlbnRgIHRoZSBjYWxsZXIgY2FuIHJlYWQsIGFuZFxuICogYWRkaW5nIG9yIHVwZGF0aW5nIGFuIGF0dGVuZGVlIHJlcXVpcmVzIGVkaXQgYWNjZXNzIHRvIHRoYXQgZXZlbnQuIFx1MjZBMFx1RkUwRiBUaGF0XG4gKiBkZXJpdmF0aW9uIHJlc29sdmVzIHRocm91Z2ggdGhlIHNhbWUgcGF0aHMgYSBkaXJlY3QgcmVhZCBvZiB0aGUgZXZlbnQgdGFrZXMgXHUyMDE0XG4gKiBvd25lcnNoaXAgc2NvcGUgYW5kIGBzeXNfcmVjb3JkX3NoYXJlYCBncmFudHMgZm9sZGVkIGluLCBub3QgdGhlIG1hc3RlcidzXG4gKiByb3ctbGV2ZWwgc2VjdXJpdHkgcG9saWNpZXMgYWxvbmUuIFRoZSBkaXN0aW5jdGlvbiBpcyBub3QgYWNhZGVtaWM6IGFuXG4gKiBlYXJsaWVyIHBsYXRmb3JtIHZlcnNpb24gY29uc3VsdGVkIG1hc3RlciBSTFMgcG9saWNpZXMgT05MWSwgdW5kZXIgYSBTWVNURU1cbiAqIGNvbnRleHQsIGFuZCBIb3RDUk0gYXV0aG9ycyBub25lIG9uIGBjcm1fZXZlbnRgIFx1MjAxNCBzbyBldmVyeSBhdHRlbmRlZSByb3cgb2ZcbiAqIGV2ZXJ5IG1lZXRpbmcgcmVhY2hlZCBldmVyeSBob2xkZXIgb2Ygb2JqZWN0LWxldmVsIHJlYWQuXG4gKiBgdGVzdC9wYXJlbnQtZGVyaXZlZC1yZWFjaC50ZXN0LnRzYCBwaW5zIHRoZSBuYXJyb3cgYmVoYXZpb3VyIGFuZCB3YXMgd3JpdHRlblxuICogdG8gZ28gcmVkIHRoZSBkYXkgdGhlIHBsYXRmb3JtIGNoYW5nZWQgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBFdmVudEF0dGVuZGVlID0gT2JqZWN0U2NoZW1hLmNyZWF0ZSh7XG4gIG5hbWU6ICdjcm1fZXZlbnRfYXR0ZW5kZWUnLFxuICBsYWJlbDogJ0V2ZW50IEF0dGVuZGVlJyxcbiAgcGx1cmFsTGFiZWw6ICdFdmVudCBBdHRlbmRlZXMnLFxuICBpY29uOiAndXNlcnMnLFxuICBkZXNjcmlwdGlvbjogJ0EgcGVyc29uIGludml0ZWQgdG8gb3IgcHJlc2VudCBhdCBhbiBldmVudCcsXG5cbiAgc2hhcmluZ01vZGVsOiAnY29udHJvbGxlZF9ieV9wYXJlbnQnLFxuXG4gIC8vIEFEUi0wMDc5OiBqdW5jdGlvbiByb3dzIGhhdmUgbm8gZGVyaXZhYmxlIHRleHQgdGl0bGU7IHBvaW50IHRoZSBjYW5vbmljYWxcbiAgLy8gbmFtZUZpZWxkIGF0IHRoZSBzdG9yZWQgYXV0b251bWJlciBleHBsaWNpdGx5IChhdXRvbnVtYmVyIGlzIG5vdCBpbiB0aGVcbiAgLy8gYXV0by1kZXJpdmF0aW9uIHdoaXRlbGlzdCkuXG4gIG5hbWVGaWVsZDogJ2F0dGVuZGVlX251bWJlcicsXG5cbiAgaGlnaGxpZ2h0RmllbGRzOiBbJ2NybV9ldmVudCcsICdhdHRlbmRlZV90eXBlJywgJ3Jlc3BvbnNlJywgJ2lzX29yZ2FuaXplciddLFxuXG4gIGZpZWxkR3JvdXBzOiBbXG4gICAgeyBrZXk6ICdiYXNpYycsICAgIGxhYmVsOiAnQXR0ZW5kZWUnLCAgIGljb246ICd1c2VyJyB9LFxuICAgIHsga2V5OiAncmVzcG9uc2UnLCBsYWJlbDogJ0ludml0YXRpb24nLCBpY29uOiAnbWFpbC1jaGVjaycgfSxcbiAgXSxcblxuICBmaWVsZHM6IHtcbiAgICBhdHRlbmRlZV9udW1iZXI6IEZpZWxkLmF1dG9udW1iZXIoe1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ0F0dGVuZGVlIE51bWJlcicsXG4gICAgICBmb3JtYXQ6ICdFQS17MDAwMDB9JyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjZBMFx1RkUwRiBEZWxpYmVyYXRlbHkgbGVmdCBvbiB0aGUgc3BlYyBkZWZhdWx0LCBhbmQgTk9UIGNhc2NhZGVkIHdpdGggdGhlIHBhcnR5XG4gICAgLy8gbG9va3VwcyBiZWxvdy4gQmVjYXVzZSBpdCBpcyBSRVFVSVJFRCwgdGhlIGVuZ2luZSBlc2NhbGF0ZXMgdGhlIHN0b3JlZFxuICAgIC8vIGBzZXRfbnVsbGAgdG8gYSByZWZ1c2FsIGF0IGRlbGV0ZSB0aW1lLCB3aXRoIGEgbWVzc2FnZSBuYW1pbmcgdGhlIHJlYWxcbiAgICAvLyBvYnN0YWNsZSBpbnN0ZWFkIG9mIGFuIHVucmVsYXRlZCBydWxlOiBcIkNhbm5vdCBkZWxldGUgY3JtX2V2ZW50ICguLi4pOiAzXG4gICAgLy8gZGVwZW5kZW50IGNybV9ldmVudF9hdHRlbmRlZSByZWNvcmQocykgcmVmZXJlbmNlIGl0IHZpYSBjcm1fZXZlbnRcbiAgICAvLyAoY3JtX2V2ZW50IGlzIHJlcXVpcmVkLCBzbyBpdCBjYW5ub3QgYmUgY2xlYXJlZCkuXCIgVGhhdCBpcyB0aGUgY29ycmVjdFxuICAgIC8vIGFuc3dlciBvbiB0aGlzIHNpZGUsIGZvciB0aGUgc2FtZSByZWFzb24gYGNybV9jYW1wYWlnbl9tZW1iZXIuY3JtX2NhbXBhaWduYFxuICAgIC8vIGtlZXBzIGl0OiBhIG1lZXRpbmcncyBhdHRlbmRlZSBsaXN0IGlzIHRoZSBtZWV0aW5nJ3MgaGlzdG9yaWNhbCByZWNvcmQsXG4gICAgLy8gbm90IGEgcGVyLXBlcnNvbiBhcnRlZmFjdC4gYHRlc3QvZXZlbnQtYXR0ZW5kZWUtY2FzY2FkZS50ZXN0LnRzYCBwaW5zIHRoZVxuICAgIC8vIHJlc29sdmVkIHZhbHVlIHNvIGEgY29weS1wYXN0ZSBvZiB0aGUgdGhyZWUgY2FzY2FkZXMgY2Fubm90IHJlYWNoIGhlcmUuXG4gICAgY3JtX2V2ZW50OiBGaWVsZC5sb29rdXAoJ2NybV9ldmVudCcsIHtcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbGFiZWw6ICdFdmVudCcsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgIH0pLFxuXG4gICAgLy8gVGhlIGRpc2NyaW1pbmF0b3Igc2F5cyB3aGljaCBvZiB0aGUgZm91ciBjb2x1bW5zIGJlbG93IGlzIHRoZSBsaXZlIG9uZS4gSXRcbiAgICAvLyBpcyBhdXRob3JlZCByYXRoZXIgdGhhbiBkZXJpdmVkIHNvIGEgcXVlcnkgY2FuIGZpbHRlciBcImludGVybmFsIGF0dGVuZGVlc1xuICAgIC8vIG9ubHlcIiB3aXRob3V0IGZvdXIgT1InZCBudWxsIGNoZWNrcy4gVGhlIG9wdGlvbnMgYXJlIEdFTkVSQVRFRCBmcm9tIHRoZVxuICAgIC8vIHJlc29sdXRpb24gdGFibGUgcmF0aGVyIHRoYW4gcmV0eXBlZCBcdTIwMTQgc2VlIHRoZSBub3RlIGF0IHRoZSB0b3Agb2YgdGhpc1xuICAgIC8vIGZpbGUgZm9yIHdoeSB0aGUgcGFpcmluZyBpcyBkZWNsYXJlZCBvbmNlLlxuICAgIGF0dGVuZGVlX3R5cGU6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnQXR0ZW5kZWUgVHlwZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgZGVmYXVsdFZhbHVlOiBERUZBVUxUX0FUVEVOREVFX1RZUEUsXG4gICAgICBvcHRpb25zOiBBVFRFTkRFRV9SRVNPTFVUSU9OUy5tYXAoKHIpID0+ICh7XG4gICAgICAgIGxhYmVsOiByLmxhYmVsLFxuICAgICAgICB2YWx1ZTogci52YWx1ZSxcbiAgICAgICAgY29sb3I6IHIuY29sb3IsXG4gICAgICAgIC4uLihyLnZhbHVlID09PSBERUZBVUxUX0FUVEVOREVFX1RZUEUgPyB7IGRlZmF1bHQ6IHRydWUgfSA6IHt9KSxcbiAgICAgIH0pKSxcbiAgICB9KSxcblxuICAgIC8vIFx1MjZENCBgZGVsZXRlQmVoYXZpb3I6ICdjYXNjYWRlJ2Agb24gQUxMIFRIUkVFIHBhcnR5IGxvb2t1cHMsIG5vdCB0aGUgZGVmYXVsdC5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBQbGF0Zm9ybSBjb25zdHJhaW50OiBhIGxvb2t1cCBkZWZhdWx0cyB0byBgc2V0X251bGxgLCBhbmQgdGhlIGVuZ2luZVxuICAgIC8vIGltcGxlbWVudHMgYHNldF9udWxsYCBieSBVUERBVElORyB0aGUgcm93IHRoYXQgaG9sZHMgaXQuIE9uIGEgY29sdW1uIGFcbiAgICAvLyB2YWxpZGF0aW9uIHJ1bGUgcmVhZHMsIHRoYXQgbWFrZXMgdGhlIHJlZmVyZW5jZWQgcGFydHkgcGVybWFuZW50bHlcbiAgICAvLyBVTkRFTEVUQUJMRTogY2xlYXJpbmcgdGhpcyBjb2x1bW4gbGVhdmVzIHRoZSByb3cgdGhlIGVuZ2luZSBqdXN0IGVkaXRlZCBpblxuICAgIC8vIHZpb2xhdGlvbiBvZiBgYXR0ZW5kZWVfcmVzb2x2ZXNgIGJlbG93LCBhbmQgdGhlIHdob2xlIGRlbGV0ZSByb2xscyBiYWNrXG4gICAgLy8gd2l0aCBhbiBlcnJvciBuYW1pbmcgYW4gb2JqZWN0IHRoZSBjYWxsZXIgbmV2ZXIgYWRkcmVzc2VkLiBUaGUgc2FtZVxuICAgIC8vIGNvbnN0cnVjdGlvbiBiaXRlcyBgY3JtX2NhbXBhaWduX21lbWJlcmAuXG4gICAgLy9cbiAgICAvLyBgZXh0ZXJuYWxfbmFtZWAgaXMgdGhlIGZvdXJ0aCByZXNvbHV0aW9uLCBidXQgaXQgaXMgYmxhbmsgb24gZXZlcnkgcm93IHRoZVxuICAgIC8vIHByb2R1Y3QgYWN0dWFsbHkgd3JpdGVzIChgc3JjL3NhbGVzL2FjdGlvbnMvYWN0aXZpdHktYWN0aW9ucy50c2AgbG9ncyBhdHRlbmRlZXNcbiAgICAvLyB3aXRoIGEgcGFydHkgcmVmZXJlbmNlIGFuZCBuZXZlciBhbiBleHRlcm5hbCBuYW1lKSwgc28gaXQgcmVzY3VlcyBub3RoaW5nLlxuICAgIC8vXG4gICAgLy8gQ2FzY2FkZSByYXRoZXIgdGhhbiBgcmVzdHJpY3RgOiBhbiBhdHRlbmRlZSByb3cgaXMgYSBKVU5DVElPTiB3aG9zZSB3aG9sZVxuICAgIC8vIG1lYW5pbmcgaXMgXCJ0aGlzIHBlcnNvbiB3YXMgaW4gdGhpcyByb29tXCIuIE9uY2UgdGhlIHBlcnNvbiBpcyBnb25lIHRoZSByb3dcbiAgICAvLyBkZW5vdGVzIG5vdGhpbmcsIGFuZCB0aGUgcXVlcnkgaXQgZXhpc3RzIHRvIHNlcnZlIChcIm1lZXRpbmdzIHRoaXMgcGVyc29uXG4gICAgLy8gYXR0ZW5kZWRcIikgaGFzIGxvc3QgaXRzIHN1YmplY3QuIGByZXN0cmljdGAgd291bGQgcHJvZHVjZSBhbiBhY2N1cmF0ZVxuICAgIC8vIG1lc3NhZ2UgYnV0IGtlZXAgdGhlIHBlcnNvbiB1bmRlbGV0YWJsZSB1bnRpbCBzb21lb25lIGRlbGV0ZWQgdGhlaXJcbiAgICAvLyBhdHRlbmRhbmNlIGJ5IGhhbmQsIGFuZCB1bmRlbGV0YWJsZSBQRU9QTEUgaXMgdGhlIGltcGFjdCBiZWluZyBmaXhlZC5cbiAgICAvLyBDYXNjYWRlIGFsc28gbGVhdmVzIG5vIHJlYWNoYWJsZSBzdGF0ZSBpbiB3aGljaCBhIHN0b3JlZCBhdHRlbmRlZSByb3dcbiAgICAvLyBicmVha3MgaXRzIG93biBvYmplY3QncyBydWxlLlxuICAgIGNybV9jb250YWN0OiBGaWVsZC5sb29rdXAoJ2NybV9jb250YWN0Jywge1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ0NvbnRhY3QnLFxuICAgICAgZGVsZXRlQmVoYXZpb3I6ICdjYXNjYWRlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2V0IHdoZW4gdGhlIGF0dGVuZGVlIGlzIGFuIGV4aXN0aW5nIGN1c3RvbWVyIGNvbnRhY3QnLFxuICAgICAgLi4ucGFydHlGb3JtSGludHMoJ2NybV9jb250YWN0JyksXG4gICAgfSksXG5cbiAgICBjcm1fbGVhZDogRmllbGQubG9va3VwKCdjcm1fbGVhZCcsIHtcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbGFiZWw6ICdMZWFkJyxcbiAgICAgIGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NldCB3aGVuIHRoZSBhdHRlbmRlZSBpcyBzdGlsbCBhbiB1bmNvbnZlcnRlZCBsZWFkJyxcbiAgICAgIC4uLnBhcnR5Rm9ybUhpbnRzKCdjcm1fbGVhZCcpLFxuICAgIH0pLFxuXG4gICAgLy8gYHN5c191c2VyYCBnZXRzIHRoZSBTQU1FIGFuc3dlciBhcyB0aGUgdHdvIENSTSBwYXJ0aWVzLCBhbmQgaXQgd2FzIHdvcnRoIGFcbiAgICAvLyBzZWNvbmQgbG9vayByYXRoZXIgdGhhbiBhIGNvcHktcGFzdGU6XG4gICAgLy9cbiAgICAvLyAgXHUwMEI3IERlbGV0aW5nIGEgdXNlciBpcyBhIHJlYWwsIHJlYWNoYWJsZSBvcGVyYXRpb24uIEdlbmVyaWMgQ1JVRCBkZWxldGUgb25cbiAgICAvLyAgICB0aGUgaWRlbnRpdHkgdGFibGUgaXMgb2ZmIChgc3lzX3VzZXJgIHNoaXBzIGBhcGlNZXRob2RzOiBbJ2dldCcsXG4gICAgLy8gICAgJ2xpc3QnLCAndXBkYXRlJywgJ2J1bGsnXWApLCBidXQgYmV0dGVyLWF1dGgncyBvd24gcm91dGVzIFx1MjAxNFxuICAgIC8vICAgIGAvYXBpL3YxL2F1dGgvZGVsZXRlLXVzZXJgLCB3aGljaCB0aGUgcGxhdGZvcm0ncyBgc3lzX3VzZXJgIG9iamVjdFxuICAgIC8vICAgIHN1cmZhY2VzIGFzIHRoZSBcIkRlbGV0ZSBNeSBBY2NvdW50XCIgcmVjb3JkIGFjdGlvbiwgYW5kXG4gICAgLy8gICAgYC9hcGkvdjEvYXV0aC9hZG1pbi9yZW1vdmUtdXNlcmAgXHUyMDE0IHJlc29sdmUgYHVzZXJgIHRvIGBzeXNfdXNlcmAgYW5kXG4gICAgLy8gICAgbGFuZCBvbiBgZGF0YUVuZ2luZS5kZWxldGUoLi4uKWAsIGkuZS4gdGhlIFNBTUUgT2JqZWN0UUwgZGVsZXRlIHRoYXRcbiAgICAvLyAgICBydW5zIHRoZSByZWZlcmVudGlhbCBwYXNzLiBTbyBgc2V0X251bGxgIGhlcmUgaXMgbm90IGRvcm1hbnQ6IGl0IGJyZWFrc1xuICAgIC8vICAgIGFjY291bnQgZXJhc3VyZSBmb3IgYW55IGNvbGxlYWd1ZSB3aG8gZXZlciBhdHRlbmRlZCBhIG1lZXRpbmcuXG4gICAgLy8gIFx1MDBCNyBUaGUgYXBwJ3Mgc2hpcHBlZCBzdGFuY2UgaXMgYWxyZWFkeSBcImEgZGVsZXRlZCB1c2VyJ3MgcmVmZXJlbmNlc1xuICAgIC8vICAgIGRlZ3JhZGVcIi4gRVZFUlkgb3RoZXIgYHN5c191c2VyYCBsb29rdXAgaW4gSG90Q1JNIChldmVyeSBgb3duZXJfaWRgLFxuICAgIC8vICAgIHBsdXMgYHByb2R1Y3RfbWFuYWdlcmApIGlzIGBzZXRfbnVsbGAgYW5kIE5PIHZhbGlkYXRpb24gcnVsZSByZWFkcyBhbnlcbiAgICAvLyAgICBvZiB0aGVtIFx1MjAxNCB0aGUgcnVsZSBiZWxvdyBpcyB0aGUgb25seSBvbmUgaW4gdGhlIGFwcCB0aGF0IHJlYWRzIGEgdXNlclxuICAgIC8vICAgIHJlZmVyZW5jZSBhdCBhbGwsIHdoaWNoIGlzIHByZWNpc2VseSB3aHkgdGhpcyBpcyB0aGUgb25seSBsb29rdXAgd2hlcmVcbiAgICAvLyAgICB0aGUgZGVmYXVsdCBtaXNiZWhhdmVzLiBgcmVzdHJpY3RgIGhlcmUgd291bGQgbWFrZSB0aGlzIGp1bmN0aW9uIHRoZVxuICAgIC8vICAgIE9ORSBhcHAgcm93IGFibGUgdG8gdmV0byBhIHBsYXRmb3JtIGlkZW50aXR5IGVyYXN1cmUgXHUyMDE0IGFuIGFwcCBvYmplY3RcbiAgICAvLyAgICBob2xkaW5nIGEgYHByb3RlY3Rpb246IHsgbG9jazogJ2Z1bGwnIH1gLCBiZXR0ZXItYXV0aC1tYW5hZ2VkIHRhYmxlXG4gICAgLy8gICAgaG9zdGFnZSwgc3VyZmFjaW5nIGFzIGFuIG9wYXF1ZSBmYWlsdXJlIGZyb20gYW4gYXV0aCByb3V0ZS4gVGhhdCBpcyBhXG4gICAgLy8gICAgbGF5ZXJpbmcgaW52ZXJzaW9uLCBub3QgYSBmaXguXG4gICAgLy8gIFx1MDBCNyBUaGUgY29zdCBvZiBjYXNjYWRlIGlzIGJvdW5kZWQgYW5kIGlzIHRoZSByaWdodCBoYWxmIHRvIGxvc2U6IHRoZVxuICAgIC8vICAgIG1lZXRpbmcgaXRzZWxmIChgY3JtX2V2ZW50YCBcdTIwMTQgc3ViamVjdCwgdGltZXMsIG91dGNvbWUgbm90ZXMpIHN1cnZpdmVzXG4gICAgLy8gICAgdW50b3VjaGVkOyBvbmx5IHRoZSBwZXItcGVyc29uIHJvdyBnb2VzLCBhbmQgaXQgZ29lcyBiZWNhdXNlIHRoZVxuICAgIC8vICAgIHBlcnNvbidzIGlkZW50aXR5IHJlY29yZCB3YXMgZXJhc2VkLiBEZWFjdGl2YXRpb24sIG5vdCBkZWxldGlvbiwgaXMgdGhlXG4gICAgLy8gICAgb3JkaW5hcnkgb2ZmYm9hcmRpbmcgcGF0aCAodGhlIHBsYXRmb3JtIHNoaXBzIGJhbi91bmJhbiksIGFuZCBpdFxuICAgIC8vICAgIHRvdWNoZXMgbm90aGluZyBoZXJlLlxuICAgIHN5c191c2VyOiBGaWVsZC5sb29rdXAoJ3N5c191c2VyJywge1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ1VzZXInLFxuICAgICAgZGVsZXRlQmVoYXZpb3I6ICdjYXNjYWRlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2V0IHdoZW4gdGhlIGF0dGVuZGVlIGlzIGEgY29sbGVhZ3VlJyxcbiAgICAgIC4uLnBhcnR5Rm9ybUhpbnRzKCdzeXNfdXNlcicpLFxuICAgIH0pLFxuXG4gICAgLy8gRnJlZSB0ZXh0IGlzIHRoZSBMQVNUIHJlc29ydCwgbm90IHRoZSBkZWZhdWx0OiBpdCBleGlzdHMgb25seSBmb3IgdGhlXG4gICAgLy8gZ2VudWluZWx5IHVubW9kZWxsZWQgZ3Vlc3QgKGEgcHJvc3BlY3QncyBsYXd5ZXIgd2hvIGlzIGluIG5vIENSTSBvYmplY3QpLlxuICAgIC8vIEl0IGlzIHRoZSByZXNvbHV0aW9uIG9mIE9ORSBhdHRlbmRlZSB0eXBlIFx1MjAxNCBgZXh0ZXJuYWxgIFx1MjAxNCBhbmQgdGhlIHJ1bGVzXG4gICAgLy8gYmVsb3cgZW5mb3JjZSB0aGF0IGJvdGggd2F5czogYW4gYGV4dGVybmFsYCByb3cgbXVzdCBmaWxsIGl0LCBhbmQgbm9cbiAgICAvLyBvdGhlciB0eXBlIG1heS4gSXQgaXMgbm90IGEgcGxhY2UgdG8gcGFzdGUgYSBsaXN0LCBhbmQgbm90IGEgbm90ZSBmaWVsZFxuICAgIC8vIHRvIGhhbmcgb2ZmIGEgQ29udGFjdCByb3cuXG4gICAgZXh0ZXJuYWxfbmFtZTogRmllbGQudGV4dCh7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnRXh0ZXJuYWwgQXR0ZW5kZWUnLFxuICAgICAgbWF4TGVuZ3RoOiAyNTUsXG4gICAgICBkZXNjcmlwdGlvbjogJ05hbWUgb2YgYW4gYXR0ZW5kZWUgd2hvIGlzIGluIG5vIENSTSBvYmplY3QgXHUyMDE0IHNldCB3aGVuIEF0dGVuZGVlIFR5cGUgaXMgRXh0ZXJuYWwnLFxuICAgICAgLi4ucGFydHlGb3JtSGludHMoJ2V4dGVybmFsX25hbWUnKSxcbiAgICB9KSxcblxuICAgIHJlc3BvbnNlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgZ3JvdXA6ICdyZXNwb25zZScsXG4gICAgICBsYWJlbDogJ1Jlc3BvbnNlJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgICBkZWZhdWx0VmFsdWU6ICdub19yZXNwb25zZScsXG4gICAgICBvcHRpb25zOiBbLi4uQVRURU5ERUVfUkVTUE9OU0VfT1BUSU9OU10sXG4gICAgfSksXG5cbiAgICBpc19vcmdhbml6ZXI6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgZ3JvdXA6ICdyZXNwb25zZScsXG4gICAgICBsYWJlbDogJ09yZ2FuaXplcicsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNkQ0IE5PVCBgcmVhZG9ubHlgIFx1MjAxNCBidXQgdGhlIGNyb3NzLXJlZmVyZW5jZSB0aGlzIG5vdGUgdXNlZCB0byBjYXJyeSBpc1xuICAgIC8vIHJldGlyZWQsIG5vdCBtZXJlbHkgcmV3b3JkZWQ6IGBjcm1fY2FtcGFpZ25fbWVtYmVyLmFkZGVkX2RhdGVgIHdhcyBydWxlZFxuICAgIC8vIGByZWFkb25seTogdHJ1ZWAgaW4gIzE2NjcsIHNvIGl0IGlzIG5vIGxvbmdlciBhIHByZWNlZGVudCBmb3Iga2VlcGluZyBhblxuICAgIC8vIGluc2VydC1zdGFtcGVkIGNvbHVtbiBvcGVuLCBhbmQgdGhlIHJlYXNvbiBpdCBjaXRlZCAoXCJ0aGUgZW5naW5lIHN0cmlwcyBhXG4gICAgLy8gcmVhZG9ubHkga2V5IHRoZSBDQUxMRVIgc3VwcGxpZWRcIikgZG9lcyBub3QgcmVhY2ggYW4gSU5TRVJUIGF0IGFsbCBcdTIwMTQgdGhlXG4gICAgLy8gc3RyaXAgaXMgYW4gVVBEQVRFLXBhdGggcnVsZSAoYHRlc3QvcmVhZG9ubHktd3JpdGUtc2VtYW50aWNzLnRlc3QudHNgKS5cbiAgICAvLyBXaGF0IGhvbGRzIGl0IG9wZW4gaXMgbm93IE1FQVNVUkVEICgjMTc0NywgdGhlIHBlci13cml0ZXIgY2Vuc3VzICMxNDM1XG4gICAgLy8gcmFuIGZvciB0aGUgb3RoZXIgdGhyZWUpLCBub3QgXCJub2JvZHkgaGFzIHJ1bGVkIG9uIGl0XCI6IHRoaXMgY29sdW1uIGhhcyBhXG4gICAgLy8gdXNlci1jb250ZXh0IFVQREFURSB3cml0ZXIsIHdoaWNoIG5vbmUgb2YgdGhlIHRocmVlIGNvbHVtbnMgIzE2NjYgLyAjMTY2N1xuICAgIC8vIG1vdmVkIGhhZC4gVGhlIGNlbnN1cywgaW4gZnVsbDpcbiAgICAvLyAgIFx1MjAyMiB0aGUgZmlmdGVlbiBnZW5lcmF0ZWQgYWN0aXZpdHkgYWN0aW9ucyAoNSBgQUNUSVZJVFlfVEFSR0VUU2AgXHUwMEQ3IDNcbiAgICAvLyAgICAga2luZHMsIG9uZSBzaGFyZWQgYm9keSBpbiBgYWN0aXZpdHktYWN0aW9ucy50c2ApIElOU0VSVCBpdCwgYW5kIGFuXG4gICAgLy8gICAgIGFjdGlvbiBib2R5IHJ1bnMgYGlzU3lzdGVtYCBcdTIwMTQgZXhlbXB0IHR3aWNlIG92ZXI7XG4gICAgLy8gICBcdTIwMjIgdGhlIHR3byBgc2VydmljZS5zZWVkLnRzYCBhdHRlbmRlZSBzZWVkcyB3cml0ZSBpdCwgYW5kIHRoZWlyXG4gICAgLy8gICAgIGBtb2RlOiAndXBzZXJ0J2AgcmVwbGF5IFVQREFURSBpcyBleGVtcHQgdG9vLCBiZWNhdXNlIHNlZWQgd3JpdGVzIGFyZVxuICAgIC8vICAgICBgaXNTeXN0ZW1gIChgZmxvdy1zY2hlZHVsZWQudGVzdC50c2AgcGlucyB0aGF0IHZpYSBvd25lcmxlc3Mgcm93cyk7XG4gICAgLy8gICBcdTIwMjIgdGhlIHJlY29yZCBmb3JtIFx1MjAxNCBgZXZlbnRfYXR0ZW5kZWUudmlldy50c2AgbGlzdHMgaXQgaW4gdGhlXG4gICAgLy8gICAgIGBpbnZpdGF0aW9uYCBzZWN0aW9uLCBBVVRIT1JFRCByYXRoZXIgdGhhbiBzeW50aGVzaXplZCwgYW5kIHRoZSBmb3VyXG4gICAgLy8gICAgIHByb2ZpbGVzIHRoYXQgbmFtZSB0aGUgb2JqZWN0IGFsbCBncmFudCBgYWxsb3dFZGl0YC4gQSByZXAgY29ycmVjdGluZ1xuICAgIC8vICAgICBJbnZpdGVkIG9uIGEgc2F2ZWQgcm93IGlzIGEgbm9uLWBpc1N5c3RlbWAgVVBEQVRFIGNhcnJ5aW5nIGFcbiAgICAvLyAgICAgY2FsbGVyLXN1cHBsaWVkIGtleTogcHJlY2lzZWx5IHdoYXQgdGhlIHN0cmlwIGRlbGV0ZXMuIFRoZSB0aHJlZVxuICAgIC8vICAgICBmbGlwcGVkIGNvbHVtbnMgYXBwZWFyIGluIE5PIGZvcm0gc2VjdGlvbiBhbnl3aGVyZSBpbiBgc3JjLyovdmlld3MvYCxcbiAgICAvLyAgICAgYGNybV9vcHBvcnR1bml0eWAncyBhdXRob3JlZCBmb3JtIGluY2x1ZGVkLlxuICAgIC8vIFx1MkI1MCBJdCBpcyBhbHNvIG5vdCB0aGUgc2FtZSBLSU5EIG9mIGNvbHVtbi4gYGFkZGVkX2RhdGVgIC8gYGFwcHJvdmVkX2RhdGVgXG4gICAgLy8gYXJlIHN0YW1wZWQgYHtOT1coKX1gIGJ5IHRoZSB3cml0ZXIsIHNvIHRoZWlyIHZhbHVlIElTIHRoZSB3cml0ZSBtb21lbnQ7XG4gICAgLy8gYGludml0ZWRfZGF0ZWAgcmVjb3JkcyB3aGVuIHRoZSBpbnZpdGF0aW9uIHdlbnQgb3V0LCBhbmQgdGhlIHNlZWQgZGF0ZXMgaXRcbiAgICAvLyAzLTEwIGRheXMgYmVmb3JlIGl0cyBvd24gZXZlbnQsIHBlciByb3cuIEEgY29sdW1uIHdob3NlIHZhbHVlIGlzIG5vdCB0aGVcbiAgICAvLyB3cml0ZSBtb21lbnQgaXMgb25lIGEgcGVyc29uIGNhbiBiZSByaWdodCBhYm91dC4gXHUyNkQ0IERvIG5vdCBmbGlwIGl0IG9uIHRoZVxuICAgIC8vIHN0cmVuZ3RoIG9mIHRoZSBzaWJsaW5nIHJ1bGluZy5cbiAgICBpbnZpdGVkX2RhdGU6IEZpZWxkLmRhdGV0aW1lKHtcbiAgICAgIGdyb3VwOiAncmVzcG9uc2UnLFxuICAgICAgbGFiZWw6ICdJbnZpdGVkJyxcbiAgICB9KSxcbiAgfSxcblxuICBpbmRleGVzOiBbXG4gICAgeyBmaWVsZHM6IFsnY3JtX2V2ZW50J10gfSxcbiAgICB7IGZpZWxkczogWydjcm1fY29udGFjdCddIH0sXG4gICAgeyBmaWVsZHM6IFsnc3lzX3VzZXInXSB9LFxuICBdLFxuXG4gIC8vIFx1MjZBMFx1RkUwRiBQcmVkaWNhdGVzIGJlbG93IGFyZSBUT1RBTDogZXZlcnkgYHJlY29yZC54YCByZWFkIGlzIGBoYXMoKWAtZ3VhcmRlZCwgc29cbiAgLy8gdGhlIHJ1bGUgcmV0dXJucyBhIHZlcmRpY3QgZXZlbiB3aGVuIHRoZSBtZXJnZWQgcmVjb3JkIGhhcyBubyBzdWNoIGtleS4gU2VlXG4gIC8vIEFHRU5UUy5tZCBcIlZhbGlkYXRpb24gcHJlZGljYXRlcyBtdXN0IGJlIFRPVEFMXCIgYW5kXG4gIC8vIHRlc3Qvb2JqZWN0LXZhbGlkYXRpb24tcHJlZGljYXRlcy50ZXN0LnRzLCB3aGljaCBmYWlscyB0aGUgYnVpbGQgb3RoZXJ3aXNlLlxuICAvL1xuICAvLyBCb3RoIHJ1bGVzIGFyZSBHRU5FUkFURUQgZnJvbSBgQVRURU5ERUVfUkVTT0xVVElPTlNgIGF0IHRoZSB0b3Agb2YgdGhpc1xuICAvLyBmaWxlLiBcdTI2QTBcdUZFMEYgYGV4cHJlc3Npb24oLi4uLCAnY2VsJylgIGlzIHRoZSBzYW1lIGVudmVsb3BlIHRoZSBgYFBgXHUyMDI2YCBgYCB0YWdcbiAgLy8gcHJvZHVjZXMsIGJ1dCB0aGUgdGFnIEpTT04tcXVvdGVzIGFuIGludGVycG9sYXRlZCBzdHJpbmcgYW5kIHNvIGNhbm5vdFxuICAvLyBzcGxpY2UgYSBzb3VyY2UgZnJhZ21lbnQgXHUyMDE0IHdoaWNoIGlzIHdoeSB0aGVzZSB1c2UgdGhlIGZ1bmN0aW9uIGZvcm0uIFRoZVxuICAvLyBwYWlyaW5nIGlzIGRlY2xhcmVkIG9uY2UgYW5kIHJlYWQgdHdpY2U7IHNlZSB0aGUgbm90ZSB1cCB0aGVyZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICAvLyBUaGUgdHlwZSdzIG93biBjb2x1bW4gbXVzdCBiZSBmaWxsZWQuXG4gICAge1xuICAgICAgbmFtZTogJ2F0dGVuZGVlX3Jlc29sdmVzJyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOlxuICAgICAgICAnQW4gYXR0ZW5kZWUgbXVzdCBmaWxsIHRoZSBwYXJ0eSBpdHMgQXR0ZW5kZWUgVHlwZSBuYW1lcyBcdTIwMTQgYSBDb250YWN0IHJvdyBuZWVkcyBhIENvbnRhY3QsIGFuIEV4dGVybmFsIHJvdyBuZWVkcyBhbiBFeHRlcm5hbCBBdHRlbmRlZSBuYW1lJyxcbiAgICAgIGNvbmRpdGlvbjogZXhwcmVzc2lvbihSRVNPTFZFU19DT05ESVRJT04sICdjZWwnKSxcbiAgICB9LFxuICAgIC8vIFx1MjAyNmFuZCBubyBvdGhlciBjb2x1bW4gbWF5IGJlIGZpbGxlZC4gVGhlIHNlcGFyYXRlIHJ1bGUgaXMgZGVsaWJlcmF0ZTogb25lXG4gICAgLy8gY29uZGl0aW9uLCBvbmUgd29yZGluZy4gRm9sZGluZyBib3RoIGludG8gYGF0dGVuZGVlX3Jlc29sdmVzYCB3b3VsZCBtYWtlXG4gICAgLy8gaXRzIG1lc3NhZ2UgYSBsaWUgZm9yIGhhbGYgdGhlIHJvd3MgaXQgcmVqZWN0cywgYW5kIFwieW91IGZpbGxlZCB0aGUgd3JvbmdcbiAgICAvLyBjb2x1bW5cIiBpcyBub3QgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gYXMgXCJ5b3UgZmlsbGVkIG5vdGhpbmdcIi5cbiAgICB7XG4gICAgICBuYW1lOiAnYXR0ZW5kZWVfdHlwZV9leGNsdXNpdmUnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6XG4gICAgICAgICdBbiBhdHRlbmRlZSBuYW1lcyBleGFjdGx5IG9uZSBwYXJ0eSBcdTIwMTQgY2xlYXIgZXZlcnkgcGFydHkgY29sdW1uIGl0cyBBdHRlbmRlZSBUeXBlIGRvZXMgbm90IG5hbWUnLFxuICAgICAgY29uZGl0aW9uOiBleHByZXNzaW9uKEVYQ0xVU0lWRV9DT05ESVRJT04sICdjZWwnKSxcbiAgICB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2ZvcmVjYXN0Lm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvZm9yZWNhc3Qub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBPYmplY3RTY2hlbWEsIEZpZWxkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBGLCBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuXG4vKipcbiAqIEZvcmVjYXN0IE9iamVjdFxuICpcbiAqIE1vbnRobHkgLyBxdWFydGVybHkgc25hcHNob3Qgb2YgcGlwZWxpbmUgYnkgb3duZXIuIEVhY2ggcmVjb3JkIGhvbGRzXG4gKiB0aGUgYWdncmVnYXRlZCBhbW91bnRzIGF0IHRoZSBtb21lbnQgb2Ygc25hcHNob3QsIHNvIHRyZW5kIHJlcG9ydHNcbiAqIChcImhvdyBkaWQgb3VyIFEzIGZvcmVjYXN0IGNoYW5nZSB3ZWVrIG92ZXIgd2Vlaz9cIikgY2FuIGJlIGJ1aWx0XG4gKiB3aXRob3V0IHJlLWFnZ3JlZ2F0aW5nIG9wcG9ydHVuaXR5IGhpc3RvcnkuXG4gKlxuICogV3JpdHRlbiBieTpcbiAqICAgXHUyMDIyIGBzcmMvc2FsZXMvZmxvd3MvZm9yZWNhc3Qtc25hcHNob3QuZmxvdy50c2AgXHUyMDE0IHRoZSBgZm9yZWNhc3Rfc25hcHNob3RgXG4gKiAgICAgc2NoZWR1bGVkIGZsb3csIG5pZ2h0bHkgYXQgMDM6MDAsIG9uZSBjdXJyZW50LXF1YXJ0ZXIgcm93IHBlciBhY3RpdmVcbiAqICAgICBvcHBvcnR1bml0eSBvd25lciAoIzU5MCkuIEl0IG5ldmVyIHRvdWNoZXMgYHF1b3RhYC5cbiAqICAgXHUyMDIyIGByZXZlbnVlX2ZvcmVjYXN0aW5nYCBBSSBza2lsbCBvbiBkZW1hbmRcbiAqICAgXHUyMDIyIGBmb3JlY2FzdC5ob29rLnRzYCBkZXJpdmVzIHRoZSBwZXJpb2QgZmFtaWx5ICsgYHNuYXBzaG90X2RhdGVgIG9uIGV2ZXJ5XG4gKiAgICAgd3JpdGU7IGl0IGNyZWF0ZXMgbm90aGluZyBvbiBpdHMgb3duLlxuICpcbiAqIEZvcmVjYXN0IGNhdGVnb3JpZXMgZm9sbG93IHRoZSBzdGFuZGFyZCBTYWxlc2ZvcmNlIGxhZGRlciwgYW5kIHRoZSBidWNrZXRzXG4gKiBhcmUgQ1VNVUxBVElWRSBcdTIwMTQgZWFjaCBpcyBhIHN1YnNldCBvZiB0aGUgb25lIGFib3ZlIGl0OlxuICogICBwaXBlbGluZSAgXHUyMTkyIGFsbCBvcGVuIG9wcHMgY2xvc2luZyBpbiB0aGUgcGVyaW9kXG4gKiAgIGJlc3RfY2FzZSBcdTIxOTIgb3BlbiBvcHBzIHdob3NlIGZvcmVjYXN0X2NhdGVnb3J5IGlzIGJlc3RfY2FzZSBPUiBjb21taXRcbiAqICAgY29tbWl0ICAgIFx1MjE5MiBvcGVuIG9wcHMgd2hvc2UgZm9yZWNhc3RfY2F0ZWdvcnkgaXMgY29tbWl0XG4gKiAgIGNsb3NlZCAgICBcdTIxOTIgYWxyZWFkeS13b24gYW1vdW50IGluIHRoZSBwZXJpb2RcbiAqXG4gKiBUaGUgYnVja2V0IGJvdW5kYXJ5IGlzIHRoZSBzdG9yZWQgYGZvcmVjYXN0X2NhdGVnb3J5YCBjb2x1bW4gKGRlcml2ZWQgZnJvbVxuICogYHN0YWdlYCBieSB0aGUgb3Bwb3J0dW5pdHkgbGlmZWN5Y2xlIGhvb2spLCBOT1QgYSBwcm9iYWJpbGl0eSB0aHJlc2hvbGQgXHUyMDE0XG4gKiBvbmUgZGVmaW5pdGlvbiwgc2hhcmVkIHdpdGggdGhlIFwiQ29tbWl0ICYgQmVzdCBDYXNlXCIgb3Bwb3J0dW5pdHkgdmlldyBhbmRcbiAqIHRoZSBgcGlwZWxpbmVfYnlfZm9yZWNhc3RfY2F0ZWdvcnlgIGRhc2hib2FyZCB3aWRnZXQuXG4gKi9cbmV4cG9ydCBjb25zdCBGb3JlY2FzdCA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX2ZvcmVjYXN0JyxcbiAgbGFiZWw6ICdGb3JlY2FzdCcsXG4gIHBsdXJhbExhYmVsOiAnRm9yZWNhc3RzJyxcbiAgaWNvbjogJ3RyZW5kaW5nLXVwJyxcbiAgZGVzY3JpcHRpb246ICdQZXJpb2RpYyBwaXBlbGluZSBzbmFwc2hvdCBieSBvd25lciB1c2VkIGZvciByZXZlbnVlIGZvcmVjYXN0aW5nLicsXG5cbiAgLy8gT1dEIGlzIGFuIGF1dGhvcmVkIGRlY2lzaW9uIChBRFItMDA5MCBEMS9ENykuIEZvcmVjYXN0cyBhcmUgcGVyc29uYWwgdG8gdGhlXG4gIC8vIG93bmVyLlxuICBzaGFyaW5nTW9kZWw6ICdwcml2YXRlJyxcbiAgLy8gQURSLTAwNzkgcmVjb3JkIHRpdGxlLiBcdTI2QTBcdUZFMEYgQSBmb3JtdWxhIGNhbm5vdCBkb3Qtd2FsayBhIGxvb2t1cCAoQURSLTAwNzIpLCBzb1xuICAvLyBgZGlzcGxheV90aXRsZWAgY29tcG9zZXMgbG9jYWwgZmllbGRzIG9ubHk6IHBlcmlvZF9sYWJlbCArIChwZXJpb2Rfc3RhcnQpLlxuICBuYW1lRmllbGQ6ICdkaXNwbGF5X3RpdGxlJyxcbiAgLy8gXHUyNkEwXHVGRTBGIEV4cGxpY2l0IHNlYXJjaCB0YXJnZXRzIChBRFItMDA2MSksIFJFUVVJUkVEIGJlY2F1c2UgYG5hbWVGaWVsZGAgaXMgYVxuICAvLyBGT1JNVUxBOiB3aXRob3V0IHRoaXMsIGAkc2VhcmNoYCBhdXRvLWRlZmF1bHRzIHRvIHRoZSBmb3JtdWxhIGZpZWxkLCB3aGljaFxuICAvLyBpcyBub3QgYSByZWFsIGNvbHVtbiwgc28gdGhlIGxvb2t1cCBwaWNrZXIgYW5kIGdsb2JhbCBzZWFyY2ggc2lsZW50bHlcbiAgLy8gcmV0dXJuIHplcm8uIFRoZXNlIGFyZSByZWFsLCBpbmRleGVkIGNvbHVtbnMuXG4gIHNlYXJjaGFibGVGaWVsZHM6IFsncGVyaW9kX2xhYmVsJ10sXG4gIGhpZ2hsaWdodEZpZWxkczogWydvd25lcl9pZCcsICdwZXJpb2QnLCAncGVyaW9kX3N0YXJ0JywgJ2NvbW1pdF9hbW91bnQnLCAnY2xvc2VkX2Ftb3VudCddLFxuXG4gIGZpZWxkR3JvdXBzOiBbXG4gICAgeyBrZXk6ICdiYXNpYycsICAgbGFiZWw6ICdTbmFwc2hvdCcsICAgIGljb246ICdpbmZvJyB9LFxuICAgIHsga2V5OiAnYW1vdW50cycsIGxhYmVsOiAnQW1vdW50cycsICAgICBpY29uOiAnZG9sbGFyLXNpZ24nIH0sXG4gICAgeyBrZXk6ICdtZXRhJywgICAgbGFiZWw6ICdTb3VyY2UnLCAgICAgIGljb246ICdkYXRhYmFzZScsIGNvbGxhcHNlOiAnY29sbGFwc2VkJyB9LFxuICBdLFxuXG4gIGZpZWxkczoge1xuICAgIC8vIFBsYXRmb3JtIG93bmVyc2hpcCBhbmNob3IgXHUyMDE0IGNhbm9uaWNhbCBub3RlIGluIGBhY2NvdW50Lm9iamVjdC50c2AgKCM1NDgpLlxuICAgIG93bmVyX2lkOiBGaWVsZC5sb29rdXAoJ3N5c191c2VyJywge1xuICAgICAgbGFiZWw6ICdPd25lcicsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIHN5c3RlbTogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiBmYWxzZSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuXG4gICAgcGVyaW9kOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdQZXJpb2QnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnTW9udGgnLCAgIHZhbHVlOiAnbW9udGgnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdRdWFydGVyJywgdmFsdWU6ICdxdWFydGVyJyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIC8vIFdvcmRpbmcgbWlycm9ycyB0aGUgdHdvIHJlZnVzYWwgbWVzc2FnZXMgdGhpcyBmaWVsZCBpcyBib3VuZCBieVxuICAgIC8vIChgcGVyaW9kX3N0YXJ0X2ZpcnN0X29mX3BlcmlvZGAgLyBgcXVhcnRlcl9zdGFydHNfb25fcXVhcnRlcl9ib3VuZGFyeWAsXG4gICAgLy8gYm90aCBiZWxvdykgc28gdGhlIGZvcm0gYW5kIHRoZSByZWplY3Rpb24gYWdyZWUgb24gdGhlIHNhbWUgcnVsZVxuICAgIC8vIGluc3RlYWQgb2YgZGVzY3JpYmluZyB0d28gZGlmZmVyZW50IG9uZXMgKCMxMDg1KS5cbiAgICBwZXJpb2Rfc3RhcnQ6IEZpZWxkLmRhdGUoe1xuICAgICAgbGFiZWw6ICdQZXJpb2QgU3RhcnQnLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdNdXN0IGJlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHBlcmlvZCBcdTIwMTQgZS5nLiAyMDI2LTA4LTAxIGZvciBBdWcgMjAyNi4gQSBxdWFydGVybHkgZm9yZWNhc3QgbXVzdCBhZGRpdGlvbmFsbHkgc3RhcnQgb24gYSBxdWFydGVyIGJvdW5kYXJ5OiBKYW51YXJ5IDEsIEFwcmlsIDEsIEp1bHkgMSBvciBPY3RvYmVyIDEuJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICB9KSxcblxuICAgIC8vIFN0aWxsIG5vdCByZWFkLW9ubHk6IGBmb3JlY2FzdC5ob29rLnRzYCBmaWxscyBpdCBvbmx5IHdoZW4gdGhlIHdyaXRlXG4gICAgLy8gbGVhdmVzIGl0IHVuc2V0LCBhbmQgYHNyYy9zYWxlcy9kYXRhL2ZvcmVjYXN0LnNlZWQudHNgIGhhbmQtZmlsbHMgaXQgb24gZXZlcnlcbiAgICAvLyBzZWVkZWQgcm93IFx1MjAxNCBzbyBoYW5kLWVudHJ5IGlzIGEgY2FwYWJpbGl0eSB0aGlzIGFwcCB1c2VzLiBBIGhhbmQtZmlsbGVkXG4gICAgLy8gdmFsdWUgaXMgcGlubmVkIHRvIHRoZSBzYW1lIGNhbGVuZGFyIHBlcmlvZCBgcGVyaW9kX3N0YXJ0YCBpc1xuICAgIC8vIChgcGVyaW9kX2VuZF9tYXRjaGVzX2NhbGVuZGFyX3BlcmlvZGAgYmVsb3cpLCBhbmQgdGhlIGRlc2NyaXB0aW9uIHN0YXRlc1xuICAgIC8vIHRoYXQgcnVsZSByYXRoZXIgdGhhbiB0aGUgd2Vha2VyIGBwZXJpb2RfZW5kX2FmdGVyX3N0YXJ0YCBpdCBzdWJzdW1lczpcbiAgICAvLyB0aGUgZm9ybSBzYXlzIHdoYXQgaXMgYWN0dWFsbHkgZW5mb3JjZWQuXG4gICAgcGVyaW9kX2VuZDogRmllbGQuZGF0ZSh7XG4gICAgICBsYWJlbDogJ1BlcmlvZCBFbmQnLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdOb3JtYWxseSBkZXJpdmVkIGF1dG9tYXRpY2FsbHkgZnJvbSBQZXJpb2QgYW5kIFBlcmlvZCBTdGFydC4gSWYgc2V0IGJ5IGhhbmQsIGl0IG11c3QgYmUgdGhlIGxhc3QgZGF5IG9mIHRoYXQgcGVyaW9kIFx1MjAxNCBlLmcuIDIwMjYtMDktMzAgZm9yIGEgcXVhcnRlciBzdGFydGluZyAyMDI2LTA3LTAxLCBvciAyMDI2LTA4LTMxIGZvciBBdWcgMjAyNi4nLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuXG4gICAgcGVyaW9kX2xhYmVsOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnUGVyaW9kIExhYmVsJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSHVtYW4tZnJpZW5kbHkgbGFiZWwsIGUuZy4gXCJRMyAyMDI2XCIgb3IgXCJBdWcgMjAyNlwiLicsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICB9KSxcblxuICAgIC8vIEFEUi0wMDc5IHJlY29yZCB0aXRsZS4gXHUyNkEwXHVGRTBGIEEgZm9ybXVsYSBjYW5ub3QgZG90LXdhbGsgYSBsb29rdXAgKEFEUi0wMDcyKSxcbiAgICAvLyBzbyB0aGlzIGNvbXBvc2VzIGxvY2FsIGZpZWxkcyBvbmx5OyBgcGVyaW9kX3N0YXJ0YCAoYSBkYXRlKSBpc1xuICAgIC8vIHN0cmluZygpLWNvZXJjZWQgZm9yIGNvbmNhdC5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBUaGUgY29lcmNpb24gaXMgYHN0cmluZygpYCwgTk9UIGB0ZXh0KClgLiBgdGV4dGAgaXMgbm90IGEgcmVnaXN0ZXJlZFxuICAgIC8vIENFTCBmdW5jdGlvbiBcdTIwMTQgaXQgaXMgYWJzZW50IGZyb20gYENFTF9TVERMSUJfRlVOQ1RJT05TYCBcdTIwMTQgc28gYSBmb3JtdWxhXG4gICAgLy8gdXNpbmcgaXQgZmF1bHRzIGF0IHJ1bnRpbWUgYW5kIGxlYXZlcyB0aGUgcmVjb3JkJ3MgYG5hbWVGaWVsZGAgbnVsbC4gVGhlXG4gICAgLy8gYXV0aG9yLXRpbWUgYGV4cHJlc3Npb24taW52YWxpZGAgcnVsZSBub3cgUkVQT1JUUyBpdCAoXCJmb3VuZCBubyBtYXRjaGluZ1xuICAgIC8vIG92ZXJsb2FkIGZvciAndGV4dChkeW4pJ1wiKSBpbnN0ZWFkIG9mIGxldHRpbmcgYSBicm9rZW4gZm9ybXVsYSB0aHJvdWdoIHRvXG4gICAgLy8gbnVsbCBzaWxlbnRseS4gYHN0cmluZ2AgaXMgdGhlIGNhdGFsb2cncyBjb2VyY2lvbiwgYWxvbmdzaWRlXG4gICAgLy8gYGludGAvYGJvb2xgL2Bkb3VibGVgL2B0aW1lc3RhbXBgLlxuICAgIGRpc3BsYXlfdGl0bGU6IEZpZWxkLmZvcm11bGEoe1xuICAgICAgbGFiZWw6ICdEaXNwbGF5IFRpdGxlJyxcbiAgICAgIGV4cHJlc3Npb246IEZgcmVjb3JkLnBlcmlvZF9sYWJlbCArIFwiIChcIiArIHN0cmluZyhyZWNvcmQucGVyaW9kX3N0YXJ0KSArIFwiKVwiYCxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuXG4gICAgc25hcHNob3RfZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBsYWJlbDogJ1NuYXBzaG90IERhdGUnLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgZGF5IHRoaXMgc25hcHNob3Qgd2FzIGNhcHR1cmVkLicsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgZ3JvdXA6ICdtZXRhJyxcbiAgICB9KSxcblxuICAgIHF1b3RhOiBGaWVsZC5jdXJyZW5jeSh7XG4gICAgICBsYWJlbDogJ1F1b3RhJyxcbiAgICAgIG1pbjogMCxcbiAgICAgIGdyb3VwOiAnYW1vdW50cycsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICBwaXBlbGluZV9hbW91bnQ6IEZpZWxkLmN1cnJlbmN5KHtcbiAgICAgIGxhYmVsOiAnUGlwZWxpbmUnLFxuICAgICAgZGVzY3JpcHRpb246ICdTdW0gb2YgYWxsIG9wZW4gb3Bwb3J0dW5pdGllcyBjbG9zaW5nIGluIHRoaXMgcGVyaW9kIChhbnkgc3RhZ2UpLicsXG4gICAgICBtaW46IDAsXG4gICAgICBncm91cDogJ2Ftb3VudHMnLFxuICAgIH0pLFxuXG4gICAgYmVzdF9jYXNlX2Ftb3VudDogRmllbGQuY3VycmVuY3koe1xuICAgICAgbGFiZWw6ICdCZXN0IENhc2UnLFxuICAgICAgZGVzY3JpcHRpb246ICdPcGVuIG9wcG9ydHVuaXRpZXMgaW4gdGhlIEJlc3QgQ2FzZSBvciBDb21taXQgZm9yZWNhc3QgY2F0ZWdvcnkuJyxcbiAgICAgIG1pbjogMCxcbiAgICAgIGdyb3VwOiAnYW1vdW50cycsXG4gICAgfSksXG5cbiAgICBjb21taXRfYW1vdW50OiBGaWVsZC5jdXJyZW5jeSh7XG4gICAgICBsYWJlbDogJ0NvbW1pdCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ09wZW4gb3Bwb3J0dW5pdGllcyBpbiB0aGUgQ29tbWl0IGZvcmVjYXN0IGNhdGVnb3J5IChvd25lci1jb21taXR0ZWQpLicsXG4gICAgICBtaW46IDAsXG4gICAgICBncm91cDogJ2Ftb3VudHMnLFxuICAgIH0pLFxuXG4gICAgY2xvc2VkX2Ftb3VudDogRmllbGQuY3VycmVuY3koe1xuICAgICAgbGFiZWw6ICdDbG9zZWQgV29uJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQWxyZWFkeS1jbG9zZWQtd29uIGFtb3VudCBpbiB0aGlzIHBlcmlvZC4nLFxuICAgICAgbWluOiAwLFxuICAgICAgZ3JvdXA6ICdhbW91bnRzJyxcbiAgICB9KSxcblxuICAgIGV4cGVjdGVkX2Ftb3VudDogRmllbGQuZm9ybXVsYSh7XG4gICAgICBsYWJlbDogJ0V4cGVjdGVkJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2xvc2VkIFdvbiArIENvbW1pdCBcdTIwMTQgd2hhdCB0aGUgb3duZXIgcmVhc29uYWJseSBleHBlY3RzIHRvIGxhbmQuJyxcbiAgICAgIGV4cHJlc3Npb246IEZgY29hbGVzY2UocmVjb3JkLmNsb3NlZF9hbW91bnQsIDApICsgY29hbGVzY2UocmVjb3JkLmNvbW1pdF9hbW91bnQsIDApYCxcbiAgICAgIHNjYWxlOiAyLFxuICAgICAgZ3JvdXA6ICdhbW91bnRzJyxcbiAgICB9KSxcblxuICAgIGF0dGFpbm1lbnRfcGN0OiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnQXR0YWlubWVudCAlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2xvc2VkIFdvbiBcdTAwRjcgUXVvdGEgXHUwMEQ3IDEwMC4gUmVhZHMgMCUgdW50aWwgYSBwb3NpdGl2ZSBxdW90YSBpcyBzZXQuJyxcbiAgICAgIGV4cHJlc3Npb246IEZgY29hbGVzY2UocmVjb3JkLnF1b3RhLCAwKSA+IDAgPyAoY29hbGVzY2UocmVjb3JkLmNsb3NlZF9hbW91bnQsIDApICogMTAwLjApIC8gcmVjb3JkLnF1b3RhIDogMC4wYCxcbiAgICAgIHNjYWxlOiAyLFxuICAgICAgZ3JvdXA6ICdhbW91bnRzJyxcbiAgICB9KSxcblxuICAgIGNvdmVyYWdlX3JhdGlvOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnQ292ZXJhZ2UgUmF0aW8nLFxuICAgICAgZGVzY3JpcHRpb246ICdQaXBlbGluZSBcdTAwRjcgKFF1b3RhIFx1MjIxMiBDbG9zZWQgV29uKSBcdTIwMTQgd2hldGhlciBlbm91Z2ggcGlwZWxpbmUgcmVtYWlucyB0byBjb3ZlciB0aGUgZ2FwLiBSZWFkcyAwIG9uY2UgdGhlIHF1b3RhIGlzIGFscmVhZHkgbWV0LicsXG4gICAgICBleHByZXNzaW9uOiBGYChjb2FsZXNjZShyZWNvcmQucXVvdGEsIDApIC0gY29hbGVzY2UocmVjb3JkLmNsb3NlZF9hbW91bnQsIDApKSA+IDAgPyBjb2FsZXNjZShyZWNvcmQucGlwZWxpbmVfYW1vdW50LCAwKSAvIChyZWNvcmQucXVvdGEgLSBjb2FsZXNjZShyZWNvcmQuY2xvc2VkX2Ftb3VudCwgMCkpIDogMC4wYCxcbiAgICAgIHNjYWxlOiAyLFxuICAgICAgZ3JvdXA6ICdhbW91bnRzJyxcbiAgICB9KSxcblxuICAgIHNvdXJjZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnU291cmNlJyxcbiAgICAgIGdyb3VwOiAnbWV0YScsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdTY2hlZHVsZWQgc25hcHNob3QnLCB2YWx1ZTogJ3NjaGVkdWxlZCcsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ0FJIHNraWxsJywgICAgICAgICAgIHZhbHVlOiAnYWknIH0sXG4gICAgICAgIHsgbGFiZWw6ICdNYW51YWwgZW50cnknLCAgICAgICB2YWx1ZTogJ21hbnVhbCcgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICBub3RlczogRmllbGQudGV4dCh7XG4gICAgICBsYWJlbDogJ05vdGVzJyxcbiAgICAgIG1heExlbmd0aDogMTAwMCxcbiAgICAgIGdyb3VwOiAnbWV0YScsXG4gICAgfSksXG5cbiAgICAvLyBGaXh0dXJlIGlkZW50aXR5IFx1MjAxNCB0aGUgc2VlZCBsb2FkZXIncyBgZXh0ZXJuYWxJZGAsIGFuZCBub3RoaW5nIGVsc2UuXG4gICAgLy9cbiAgICAvLyBgY3JtX2ZvcmVjYXN0YCBpcyBhIFBFUi1PV05FUiBzbmFwc2hvdDogaXRzIHJlYWwgaWRlbnRpdHkgaXNcbiAgICAvLyAob3duZXJfaWQsIHBlcmlvZCwgcGVyaW9kX3N0YXJ0KSwgYW5kIGV2ZXJ5IG90aGVyIGNvbHVtbiBpcyBhIHJlbmRlcmluZyBvZlxuICAgIC8vIHBhcnQgb2YgdGhhdC4gYHBlcmlvZF9sYWJlbGAgaW4gcGFydGljdWxhciBuYW1lcyBhIFNFVCBvZiByb3dzIG9uY2UgdGhlXG4gICAgLy8gYGZvcmVjYXN0X3NuYXBzaG90YCBzd2VlcCB3cml0ZXMgb25lIHJvdyBwZXIgYWN0aXZlIG93bmVyIHBlciBxdWFydGVyIFx1MjAxNFxuICAgIC8vIHRoZXkgYWxsIHJlYWQgJ1EzIDIwMjYnIFx1MjAxNCBzbyB1cHNlcnRpbmcgb24gdGhhdCBsYWJlbCBsZXRzIGEgcmUtc2VlZCBtYXRjaCxcbiAgICAvLyBhbmQgb3ZlcndyaXRlLCBhIHJlYWwgcmVwJ3Mgc25hcHNob3QuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgVGhlIHRydWUgY29tcG9zaXRlIGBleHRlcm5hbElkOiBbJ293bmVyX2lkJywgJ3BlcmlvZCcsICdwZXJpb2Rfc3RhcnQnXWBcbiAgICAvLyBpcyBub3QgYXZhaWxhYmxlIGhlcmU6IGEgc2VlZCBjYW5ub3QgbmFtZSBhIHVzZXIgKHNlZSB0aGUgbm90ZSBpblxuICAgIC8vIGBvYmplY3RzdGFjay5jb21wb3NpdGlvbi50c2AsIFwiQSBzZWVkIGNhbid0IG5hbWUgYSB1c2VyXCIpLCBzbyBgb3duZXJfaWRgXG4gICAgLy8gaXMgbnVsbCBvbiBldmVyeSBzZWVkZWQgcm93LCBhbmRcbiAgICAvLyB0aGUgbG9hZGVyJ3MgYGV4dGVybmFsSWRLZXlgIHJldHVybnMgXCJcIiBhcyBzb29uIGFzIGFueSBwYXJ0IGlzIGVtcHR5LiBBblxuICAgIC8vIGVtcHR5IGtleSBuZXZlciBtYXRjaGVzLCBzbyB1cHNlcnQgZGVncmFkZXMgdG8gaW5zZXJ0LW9uLWV2ZXJ5LXJlcGxheS5cbiAgICAvLyBEcm9wcGluZyBgb3duZXJfaWRgIGRvZXMgbm90IHJlc2N1ZSBpdDogYSBydW50aW1lIHJvdyBmb3IgdGhlIGN1cnJlbnRcbiAgICAvLyBxdWFydGVyIGNhcnJpZXMgZXhhY3RseSB0aGUgc2FtZSAocGVyaW9kLCBwZXJpb2Rfc3RhcnQpLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIGBtb2RlOiAnaW5zZXJ0J2AgZG9lcyBOT1QgbWVhbiBcImluc2VydCBvbmNlXCIgXHUyMDE0IHRoZSBsb2FkZXIgaW5zZXJ0c1xuICAgIC8vIHVuY29uZGl0aW9uYWxseSBvbiBldmVyeSByZXBsYXkgYm9vdCAoZnJhbWV3b3JrIzM0MzQpLiBgJ2lnbm9yZSdgIGlzIHRoZVxuICAgIC8vIHJlYWwgaW5zZXJ0LW9uY2UgbW9kZSwgYnV0IGl0IGRlY2lkZXMgXCJhbHJlYWR5IHRoZXJlP1wiIGZyb20gdGhlIHNhbWVcbiAgICAvLyBgZXh0ZXJuYWxJZGAsIHNvIG9uIGEgYnJva2VuIGtleSBpdCB3b3VsZCBTS0lQIHRoZSBkZW1vIHJvdyBiZWNhdXNlIGEgcmVhbFxuICAgIC8vIHJlcCdzIHJvdyBhbHJlYWR5IGNsYWltZWQgJ1EzIDIwMjYnLiBGaXhpbmcgdGhlIGlkZW50aXR5IGlzIGEgcHJlcmVxdWlzaXRlXG4gICAgLy8gZWl0aGVyIHdheS4gSGVuY2UgdGhpcyBzeW50aGV0aWMsIHNlZWRlci1vbmx5IGtleS5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBgcmVhZG9ubHlgIGlzIHRoZSBsb2FkLWJlYXJpbmcgcGFydCwgbm90IGRlY29yYXRpb246IHNlZWQgd3JpdGVzIHJ1blxuICAgIC8vIGB7IGlzU3lzdGVtOiB0cnVlIH1gIGFuZCBieXBhc3MgcmVhZG9ubHkgc3RyaXBwaW5nLCB3aGlsZSByZWFkb25seVxuICAgIC8vIHN0cmlwcGluZyBkb2VzIGd1YXJkIHVzZXIvQVBJIHdyaXRlcyBcdTIwMTQgc28gYSBnZW51aW5lIGZvcmVjYXN0IHJvdyBjYW4gbmV2ZXJcbiAgICAvLyBhY3F1aXJlIGEgYHNlZWRfa2V5YCBhbmQgY2FuIG5ldmVyIGJlIG1hdGNoZWQgYnkgYSByZS1zZWVkLiBUaGF0IGlzIHdoYXRcbiAgICAvLyBtYWtlcyB0aGUgZml4IHN0cnVjdHVyYWwgcmF0aGVyIHRoYW4gYSBuYW1pbmcgY29udmVudGlvbi4gYGhpZGRlbmAga2VlcHMgYVxuICAgIC8vIGZpeHR1cmVzLW9ubHkgY29sdW1uIG91dCBvZiBmb3JtcyBhbmQgcGlja2Vycy5cbiAgICBzZWVkX2tleTogRmllbGQudGV4dCh7XG4gICAgICBsYWJlbDogJ1NlZWQgS2V5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGVtby1maXh0dXJlIGlkZW50aXR5LiBXcml0dGVuIG9ubHkgYnkgdGhlIHNlZWQgbG9hZGVyOyBlbXB0eSBvbiBldmVyeSByZWFsIHNuYXBzaG90LicsXG4gICAgICBtYXhMZW5ndGg6IDY0LFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgICBncm91cDogJ21ldGEnLFxuICAgIH0pLFxuICB9LFxuXG4gIGluZGV4ZXM6IFtcbiAgICB7IGZpZWxkczogWydvd25lcl9pZCcsICdwZXJpb2Rfc3RhcnQnLCAncGVyaW9kJ10gfSxcbiAgICB7IGZpZWxkczogWydzbmFwc2hvdF9kYXRlJ10gfSxcbiAgICB7IGZpZWxkczogWydwZXJpb2Rfc3RhcnQnXSB9LFxuICBdLFxuXG4gIC8vIEFQSSBzdXJmYWNlLiBIaXN0b3J5IFx1MjE5MiBGaWVsZC50cmFja0hpc3RvcnkgKEFEUi0wMDUyKS5cbiAgZW5hYmxlOiB7XG4gICAgYXBpRW5hYmxlZDogdHJ1ZSxcbiAgICBhcGlNZXRob2RzOiBbJ2dldCcsICdsaXN0JywgJ2NyZWF0ZScsICd1cGRhdGUnLCAnZGVsZXRlJ10sXG4gIH0sXG5cbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAncGVyaW9kX2VuZF9hZnRlcl9zdGFydCcsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ1BlcmlvZCBFbmQgbXVzdCBiZSBhZnRlciBQZXJpb2QgU3RhcnQuJyxcbiAgICAgIC8vIGA8PWAsIG5vdCBgPGA6IHRoZSBydWxlIG5hbWUgc2F5cyBcImFmdGVyXCIgYW5kIGEgZm9yZWNhc3QgcGVyaW9kIGlzIGFcbiAgICAgIC8vIG1vbnRoIG9yIGEgcXVhcnRlciwgbmV2ZXIgYSBzaW5nbGUgaW5zdGFudCwgc28gYHBlcmlvZF9lbmQgPT1cbiAgICAgIC8vIHBlcmlvZF9zdGFydGAgaXMgYSB6ZXJvLWxlbmd0aCBwZXJpb2QgcmF0aGVyIHRoYW4gYSB2YWxpZCBvbmUuIFNhbWVcbiAgICAgIC8vIG9wZXJhdG9yIGFuZCB3b3JkaW5nIGFzIHRoZSBgZW5kX2FmdGVyX3N0YXJ0YCB0d2lucyBvblxuICAgICAgLy8gY2FtcGFpZ24vY29udHJhY3QuXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5wZXJpb2RfZW5kKSAmJiByZWNvcmQucGVyaW9kX2VuZCAhPSBudWxsICYmIGhhcyhyZWNvcmQucGVyaW9kX3N0YXJ0KSAmJiByZWNvcmQucGVyaW9kX3N0YXJ0ICE9IG51bGwgJiYgcmVjb3JkLnBlcmlvZF9lbmQgPD0gcmVjb3JkLnBlcmlvZF9zdGFydGAsXG4gICAgfSxcbiAgICAvLyBBIGhhbmQtZmlsbGVkIGBwZXJpb2Rfc3RhcnRgIG11c3QgYmUgdGhlIGZpcnN0IGRheSBvZiB0aGUgY2FsZW5kYXIgcGVyaW9kXG4gICAgLy8gaXQgbGFiZWxzLiBNYWludGFpbmVyIHJ1bGluZyAyMDI2LTA4LTExOiBcdTMwMENcdTYzQTVcdTUzRDdcdTRGNjBcdTc2ODRcdTUxNjhcdTkwRThcdTVFRkFcdThCQUVcdTMwMEQgXHUyMDE0IHJlZnVzZVxuICAgIC8vIHJhdGhlciB0aGFuIGFjY2VwdCBvciBzbmFwLlxuICAgIC8vXG4gICAgLy8gVGhlIGhvb2sgZGVyaXZlcyBgcGVyaW9kX2VuZGAgYXMgXCJzdGFydCArIG9uZSBwZXJpb2RcIiBcdTIwMTQgYSBST0xMSU5HIHdpbmRvdy5cbiAgICAvLyBUaGF0IGlzIGNhbGVuZGFyLXRydWUgZm9yIGEgc3RhcnQgb24gYSBib3VuZGFyeSBhbmQgZHJpZnRzIGZvciBhbnl0aGluZ1xuICAgIC8vIGVsc2U6IGBwZXJpb2Q6ICdxdWFydGVyJ2AgKyBgcGVyaW9kX3N0YXJ0OiAyMDI2LTA4LTE1YCBkZXJpdmVzXG4gICAgLy8gYHBlcmlvZF9lbmQ6IDIwMjYtMTAtMzFgIHVuZGVyIGBwZXJpb2RfbGFiZWw6ICdRMyAyMDI2J2AsIGEgd2luZG93XG4gICAgLy8gbGFiZWxsZWQgUTMgdGhhdCByZWFjaGVzIGEgbW9udGggaW50byBRNC4gVGhlIHJvdyBpcyBpbnRlcm5hbGx5XG4gICAgLy8gaW5jb25zaXN0ZW50IGluIGEgd2F5IG5vIGNvbnN1bWVyIGNhbiBkZXRlY3Q6IGV2ZXJ5IFwidGhpcyBxdWFydGVyXCJcbiAgICAvLyBlcXVhbHMtZmlsdGVyIHJlYWRzIGBwZXJpb2Rfc3RhcnRgLCBhbmQgdGhlIG5pZ2h0bHkgc3dlZXAgc2VsZWN0cyB0aGVcbiAgICAvLyBjdXJyZW50IHJvdyBieSBgcGVyaW9kX3N0YXJ0IDw9IHRvZGF5IDw9IHBlcmlvZF9lbmRgLlxuICAgIC8vXG4gICAgLy8gVGhlc2UgcnVsZXMgYXJlIHRoZSBPTkUgZW5mb3JjZW1lbnQgcG9pbnQgXHUyMDE0IGRlbGliZXJhdGVseSBub3QgYSB0aHJvdyBpblxuICAgIC8vIGBmb3JlY2FzdC5ob29rLnRzYCBhcyB3ZWxsLiBcdTI2QTBcdUZFMEYgQSBkZWNsYXJlZCBydWxlIGlzIHRoZSBzaGFwZSB0aGUgcGxhdGZvcm1cbiAgICAvLyBjYW4gYWN0IG9uOiBpdCByZWZ1c2VzIHRoZSB3cml0ZSB3aXRoIGEgYFZhbGlkYXRpb25FcnJvcmAgL1xuICAgIC8vIGBWQUxJREFUSU9OX0ZBSUxFRGAgZW52ZWxvcGUgKEhUVFAgNDAwKSBvbiB0aGUgcmVjb3JkIGZvcm0sIG9uIHRoZSBBUEkgYW5kXG4gICAgLy8gb24gYSBzZWVkJ3Mgc3lzdGVtIHdyaXRlIGFsaWtlLCB3aGVyZSBhIGhvb2sgdGhyb3cgaXMgYSBiYXJlIGBFcnJvcmAuIFRoZVxuICAgIC8vIGRlcml2YXRpb24gaXMgbGVmdCBhbG9uZTogd2l0aCB0aGUgc3RhcnQgcGlubmVkIHRvIGEgYm91bmRhcnksIFwic3RhcnQgK1xuICAgIC8vIG9uZSBwZXJpb2RcIiBJUyB0aGUgY2FsZW5kYXIgcGVyaW9kLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFdIWSBBIFJFR0VYIEFORCBOT1QgREFURSBBUklUSE1FVElDOiB0aGUgQ0VMIHN0ZGxpYiB0aGlzIGFwcCBjb21waWxlc1xuICAgIC8vIGFnYWluc3QgKGBDRUxfU1RETElCX0ZVTkNUSU9OU2ApIGhhcyBubyBtb250aC9kYXkgYWNjZXNzb3IgXHUyMDE0IHRoZSBkYXRlXG4gICAgLy8gZnVuY3Rpb25zIGFyZSBgdG9kYXlgL2BkYXlzQmV0d2VlbmAvYGFkZERheXNgL2BhZGRNb250aHNgL2BkYXRlYCBcdTIwMTQgc28gXCJ0aGVcbiAgICAvLyAxc3Qgb2YgaXRzIG1vbnRoXCIgaXMgbm90IGV4cHJlc3NpYmxlIGFzIGFyaXRobWV0aWMuIEJvdGggZHJpdmVycyB0aGlzIGFwcFxuICAgIC8vIGNhbiBydW4gb24gaGFuZCBgcGVyaW9kX3N0YXJ0YCBiYWNrIGFzIGEgYFlZWVktTU0tRERgIHN0cmluZywgYW5kIGFuIElTT1xuICAgIC8vICpkYXRldGltZSogc3RyaW5nIHN0aWxsIG1hdGNoZXMgdGhlc2UgcHJlZml4LWFuY2hvcmVkIHBhdHRlcm5zLiBBIGNhbGxlclxuICAgIC8vIHRoYXQgd3JpdGVzIGEgSlMgYERhdGVgIG9iamVjdCBpcyB0aGUgb25lIHNoYXBlIGBzdHJpbmcoKWAgaGFzIG5vIG92ZXJsb2FkXG4gICAgLy8gZm9yOyB0aGUgZW5naW5lIHRoZW4gcmVqZWN0cyB0aGF0IHdyaXRlIG5hbWluZyB0aGUgcnVsZSByYXRoZXIgdGhhblxuICAgIC8vIGFkbWl0dGluZyBpdCwgYW5kIG5vIHdyaXRlciBpbiB0aGlzIGFwcCBkb2VzIHRoYXQuXG4gICAge1xuICAgICAgbmFtZTogJ3BlcmlvZF9zdGFydF9maXJzdF9vZl9wZXJpb2QnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdQZXJpb2QgU3RhcnQgbXVzdCBiZSB0aGUgZmlyc3QgZGF5IG9mIHRoZSBwZXJpb2QgXHUyMDE0IGUuZy4gMjAyNi0wOC0wMSBmb3IgQXVnIDIwMjYuJyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnBlcmlvZF9zdGFydCkgJiYgcmVjb3JkLnBlcmlvZF9zdGFydCAhPSBudWxsICYmICFtYXRjaGVzKHN0cmluZyhyZWNvcmQucGVyaW9kX3N0YXJ0KSwgXCJeWzAtOV17NH0tWzAtOV17Mn0tMDFcIilgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ3F1YXJ0ZXJfc3RhcnRzX29uX3F1YXJ0ZXJfYm91bmRhcnknLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIC8vIFRoZSBtb250aCBydWxlIGFib3ZlIGFscmVhZHkgcmVqZWN0cyBhbnkgbm9uLTFzdCBkYXksIHNvIHRoaXMgb25lIG9ubHlcbiAgICAgIC8vIGV2ZXIgYWRkcyB0aGUgcXVhcnRlci1tb250aCBoYWxmOiAyMDI2LTA4LTAxIGlzIGEgdmFsaWQgbW9udGggc3RhcnQgYW5kXG4gICAgICAvLyBub3QgYSB2YWxpZCBxdWFydGVyIHN0YXJ0LlxuICAgICAgbWVzc2FnZTogJ0EgcXVhcnRlcmx5IGZvcmVjYXN0IG11c3Qgc3RhcnQgb24gYSBxdWFydGVyIGJvdW5kYXJ5IFx1MjAxNCBKYW51YXJ5IDEsIEFwcmlsIDEsIEp1bHkgMSBvciBPY3RvYmVyIDEuJyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnBlcmlvZCkgJiYgcmVjb3JkLnBlcmlvZCA9PSBcInF1YXJ0ZXJcIiAmJiBoYXMocmVjb3JkLnBlcmlvZF9zdGFydCkgJiYgcmVjb3JkLnBlcmlvZF9zdGFydCAhPSBudWxsICYmICFtYXRjaGVzKHN0cmluZyhyZWNvcmQucGVyaW9kX3N0YXJ0KSwgXCJeWzAtOV17NH0tKDAxfDA0fDA3fDEwKS0wMVwiKWAsXG4gICAgfSxcbiAgICAvLyBcdTIwMjZhbmQgdGhlIE9USEVSIGVuZCBvZiB0aGUgc2FtZSB3aW5kb3cuIFRoZSB0d28gcnVsZXMgYWJvdmUgcGluIHRoZSBTVEFSVDtcbiAgICAvLyBgcGVyaW9kX2VuZGAgc3RheXMgcmVhY2hhYmxlLCBiZWNhdXNlIHRoZSBob29rIGRlcml2ZXMgaXQgb25seSB3aGVuIHRoZVxuICAgIC8vIHdyaXRlIGxlYXZlcyBpdCB1bnNldCBhbmQgdGhlIGZpZWxkIHNpdHMgZWRpdGFibGUgb24gdGhlIHJlY29yZCBmb3JtLlxuICAgIC8vIFdpdGhvdXQgdGhpcyBydWxlLCBgcGVyaW9kOiAncXVhcnRlcidgICsgYHBlcmlvZF9zdGFydDogMjAyNi0wNy0wMWAgKGFcbiAgICAvLyBib3VuZGFyeSB0aGUgcnVsZXMgYWJvdmUgYWRtaXQpICsgYSBoYW5kLXR5cGVkIGBwZXJpb2RfZW5kOiAyMDI3LTA1LTE1YCBpc1xuICAgIC8vIEFETUlUVEVEIHVuZGVyIGBwZXJpb2RfbGFiZWw6ICdRMyAyMDI2J2AgXHUyMDE0IGEgdGVuLW1vbnRoIHdpbmRvdyBsYWJlbGxlZCBhc1xuICAgIC8vIG9uZSBxdWFydGVyLCByZWFjaGVkIHRocm91Z2ggdGhlIG90aGVyIGZpZWxkLlxuICAgIC8vXG4gICAgLy8gV0hZIEEgUlVMRSBBTkQgTk9UIEEgUkVBRC1PTkxZIEZJRUxEOiBkZXJpdmluZyBgcGVyaW9kX2VuZGAgYWx3YXlzIGFuZFxuICAgIC8vIGxvY2tpbmcgdGhlIGZvcm0gYnJlYWtzIHRoZSBkZW1vIHNlZWQgXHUyMDE0XG4gICAgLy8gYHNyYy9zYWxlcy9kYXRhL2ZvcmVjYXN0LnNlZWQudHNgIGhhbmQtZmlsbHMgaXQgb24gZXZlcnkgc2VlZGVkIHJvdy5cbiAgICAvLyBIYW5kLWVudHJ5IHN0YXlzOyBpdCBpcyBub3cgYm91bmRlZC5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBXSFkgYHR5cGU6ICdzY3JpcHQnYCBBTkQgTk9UIEEgRklFTEQgQ09OU1RSQUlOVDogYSBmaWVsZCBib3VuZCBqdWRnZXNcbiAgICAvLyBvbmx5IHRoZSB2YWx1ZSBiZWluZyB3cml0dGVuLCBzbyBhIHJvdyBhbHJlYWR5IHN0b3JlZCB3cm9uZyBrZWVwc1xuICAgIC8vIGFjY2VwdGluZyBlZGl0cyBmb3JldmVyOyBhIHNjcmlwdCB2YWxpZGF0aW9uIGlzIGV2YWx1YXRlZCBhZ2FpbnN0IHRoZVxuICAgIC8vIE1FUkdFRCByZWNvcmQgb24gZXZlcnkgd3JpdGUgYW5kIGlzIHRoZXJlZm9yZSBhIHRydWUgaW52YXJpYW50LlxuICAgIC8vIGB0ZXN0L2ZvcmVjYXN0LXBlcmlvZC1lbmQtYm91bmRhcnkudGVzdC50c2AgcGlucyBib3RoIGhhbHZlcyBcdTIwMTQgYSBsZWdhY3lcbiAgICAvLyByb3cgaXMgcmVmdXNlZCBvbiBpdHMgbmV4dCB1bnJlbGF0ZWQgZWRpdCwgYW5kIHRoZSByZXBhaXIgaXMgYWRtaXR0ZWQuXG4gICAgLy9cbiAgICAvLyBXSFkgREFURSBBUklUSE1FVElDIEhFUkUgV0hFTiBUSEUgVFdPIFJVTEVTIEFCT1ZFIFVTRSBBIFJFR0VYOiBub3QgdGFzdGUuXG4gICAgLy8gVGhvc2UgcnVsZXMgaW5zcGVjdCBPTkUgZGF0ZSdzIGNvbXBvbmVudHMgKFwiaXMgdGhpcyB0aGUgMXN0IG9mIGl0c1xuICAgIC8vIG1vbnRoP1wiKSwgYW5kIHRoZSBDRUwgc3RkbGliIGhhcyBubyBtb250aC9kYXkgYWNjZXNzb3IuIFRoaXMgcnVsZSBjb21wYXJlc1xuICAgIC8vIFRXTyBkYXRlcywgd2hpY2ggYGFkZE1vbnRoc2AvYGFkZERheXNgL2BkYXlzQmV0d2VlbmAgZXhwcmVzcyBkaXJlY3RseS5cbiAgICAvL1xuICAgIC8vIFRoZSBwcmVkaWNhdGUgc2F5cyBcIm9uZSBwZXJpb2QgbG9uZ1wiLCBhbmQgdGhhdCBpcyB0aGUgc2FtZSBjbGFpbSBhcyBcImVuZHNcbiAgICAvLyBvbiB0aGUgY2FsZW5kYXIgYm91bmRhcnlcIiBPTkxZIGJlY2F1c2UgdGhlIHR3byBydWxlcyBhYm92ZSBwaW4gdGhlIHN0YXJ0XG4gICAgLy8gdG8gb25lLiBUaGF0IGNvdXBsaW5nIGlzIGRlbGliZXJhdGU6IHRoZSB0aHJlZSBhcmUgb25lIHNldCBlbmZvcmNpbmcgb25lXG4gICAgLy8gaW52YXJpYW50IChhIHJvdydzIHdpbmRvdyBpcyBleGFjdGx5IHRoZSBjYWxlbmRhciBwZXJpb2QgaXQgaXMgbGFiZWxsZWRcbiAgICAvLyB3aXRoKSwgbm90IHRocmVlIGluZGVwZW5kZW50IGdhdGVzLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIGBkYXlzQmV0d2VlbihhLCBiKSAhPSAwYCByYXRoZXIgdGhhbiBgYSA9PSBiYDogYm90aCBkcml2ZXJzIHRoaXMgYXBwXG4gICAgLy8gcnVucyBvbiBoYW5kIGRhdGVzIGJhY2sgYXMgYFlZWVktTU0tRERgIHN0cmluZ3Mgd2hpbGUgYGFkZERheXNgIHJldHVybnMgYVxuICAgIC8vIHRpbWVzdGFtcCwgYW5kIGEgc3RyaW5nIG5ldmVyIGA9PWAgYSB0aW1lc3RhbXAgXHUyMDE0IHRoZSBydWxlIHdvdWxkIGJlXG4gICAgLy8gcGVybWFuZW50bHkgZ3JlZW4uIGBkYXlzQmV0d2VlbmAgcHV0cyBib3RoIHNpZGVzIHRocm91Z2ggdGhlIHNhbWVcbiAgICAvLyBgdG9EYXRlYCwgc28gdGhlIHN0cmluZywgYW4gSVNPIGRhdGV0aW1lIHNwZWxsaW5nIGFuZCBhIEpTIGBEYXRlYCBhbGxcbiAgICAvLyBjb21wYXJlIGFsaWtlLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoZSBgIT0gbnVsbGAgZ3VhcmRzIGFyZSBsb2FkLWJlYXJpbmcgZm9yIGEgVEhJUkQgaGF6YXJkIGJleW9uZCB0aGUgdHdvXG4gICAgLy8gQUdFTlRTLm1kIG5hbWVzOiBgZGF5c0JldHdlZW4obnVsbCwgXHUyMDI2KWAgcmVhY2hlcyBgQmlnSW50KE5hTilgIGFuZCBUSFJPV1MsXG4gICAgLy8gd2hpY2ggdGhlIGVuZ2luZSByZXBvcnRzIGFzIGBwcmVkaWNhdGUgZmFpbGVkIHRvIGV2YWx1YXRlYCBcdTIwMTQgYSBydWxlIHRoYXRcbiAgICAvLyBjYW5ub3QgYW5zd2VyLCBpLmUuIGEgcmVqZWN0ZWQgb3JkaW5hcnkgc2F2ZS4gVGhpcyBwcmVkaWNhdGUgaGFzIG5vXG4gICAgLy8gb3JkZXJpbmcgb3BlcmF0b3IsIHNvIGBvYmplY3QtdmFsaWRhdGlvbi1wcmVkaWNhdGVzLnRlc3QudHNgJ3NcbiAgICAvLyB1bmd1YXJkZWQtY29tcGFyaXNvbiBzd2VlcCBkb2VzIG5vdCBjb3ZlciBpdDsgdGhlIHBpbiBsaXZlcyBpblxuICAgIC8vIGB0ZXN0L2ZvcmVjYXN0LXBlcmlvZC1lbmQtYm91bmRhcnkudGVzdC50c2AgaW5zdGVhZC5cbiAgICB7XG4gICAgICBuYW1lOiAncGVyaW9kX2VuZF9tYXRjaGVzX2NhbGVuZGFyX3BlcmlvZCcsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTpcbiAgICAgICAgJ1BlcmlvZCBFbmQgbXVzdCBiZSB0aGUgbGFzdCBkYXkgb2YgdGhlIHBlcmlvZCBcdTIwMTQgZS5nLiAyMDI2LTA5LTMwIGZvciBhIHF1YXJ0ZXIgc3RhcnRpbmcgMjAyNi0wNy0wMSwgb3IgMjAyNi0wOC0zMSBmb3IgQXVnIDIwMjYuJyxcbiAgICAgIC8vIFNwZWxsZWQgb3V0IHBlciBwZXJpb2QgdmFsdWUgaW5zdGVhZCBvZiBhIHRlcm5hcnkgb24gdGhlIG1vbnRoIGNvdW50OlxuICAgICAgLy8gYW4gdW5kZWNsYXJlZCBgcGVyaW9kYCBpcyByZWZ1c2VkIEJZIE5BTUUgYnkgdGhlIHBpY2tsaXN0IChcIlBlcmlvZCBtdXN0XG4gICAgICAvLyBiZSBvbmUgb2Y6IG1vbnRoLCBxdWFydGVyXCIsIG1lYXN1cmVkKSwgc28gdGhpcyBydWxlIGp1ZGdlcyBvbmx5IHRoZSB0d29cbiAgICAgIC8vIHZhbHVlcyBpdCB1bmRlcnN0YW5kcyBhbmQgbGVhdmVzIHRoZSByZXN0IHRvIHRoZSBzY2hlbWEuXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5wZXJpb2QpICYmIHJlY29yZC5wZXJpb2QgIT0gbnVsbCAmJiBoYXMocmVjb3JkLnBlcmlvZF9zdGFydCkgJiYgcmVjb3JkLnBlcmlvZF9zdGFydCAhPSBudWxsICYmIGhhcyhyZWNvcmQucGVyaW9kX2VuZCkgJiYgcmVjb3JkLnBlcmlvZF9lbmQgIT0gbnVsbCAmJiAoKHJlY29yZC5wZXJpb2QgPT0gXCJtb250aFwiICYmIGRheXNCZXR3ZWVuKHJlY29yZC5wZXJpb2RfZW5kLCBhZGREYXlzKGFkZE1vbnRocyhyZWNvcmQucGVyaW9kX3N0YXJ0LCAxKSwgLTEpKSAhPSAwKSB8fCAocmVjb3JkLnBlcmlvZCA9PSBcInF1YXJ0ZXJcIiAmJiBkYXlzQmV0d2VlbihyZWNvcmQucGVyaW9kX2VuZCwgYWRkRGF5cyhhZGRNb250aHMocmVjb3JkLnBlcmlvZF9zdGFydCwgMyksIC0xKSkgIT0gMCkpYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdzbmFwc2hvdF9hbW91bnRzX25vbl9uZWdhdGl2ZScsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ1NuYXBzaG90IGFtb3VudHMgY2Fubm90IGJlIG5lZ2F0aXZlLicsXG4gICAgICBjb25kaXRpb246IFBgKGhhcyhyZWNvcmQucGlwZWxpbmVfYW1vdW50KSAmJiByZWNvcmQucGlwZWxpbmVfYW1vdW50ICE9IG51bGwgJiYgcmVjb3JkLnBpcGVsaW5lX2Ftb3VudCA8IDApIHx8IChoYXMocmVjb3JkLmJlc3RfY2FzZV9hbW91bnQpICYmIHJlY29yZC5iZXN0X2Nhc2VfYW1vdW50ICE9IG51bGwgJiYgcmVjb3JkLmJlc3RfY2FzZV9hbW91bnQgPCAwKSB8fCAoaGFzKHJlY29yZC5jb21taXRfYW1vdW50KSAmJiByZWNvcmQuY29tbWl0X2Ftb3VudCAhPSBudWxsICYmIHJlY29yZC5jb21taXRfYW1vdW50IDwgMCkgfHwgKGhhcyhyZWNvcmQuY2xvc2VkX2Ftb3VudCkgJiYgcmVjb3JkLmNsb3NlZF9hbW91bnQgIT0gbnVsbCAmJiByZWNvcmQuY2xvc2VkX2Ftb3VudCA8IDApYCxcbiAgICB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2xlYWQub2JqZWN0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0cy9sZWFkLm9iamVjdC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgT2JqZWN0U2NoZW1hLCBGaWVsZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgRiwgUCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB7XG4gIFNBTFVUQVRJT05fT1BUSU9OUyxcbiAgSU5EVVNUUllfT1BUSU9OUyxcbiAgTEVBRF9TT1VSQ0VfT1BUSU9OUyxcbiAgTEVBRF9ORUVEX1RZUEVfT1BUSU9OUyxcbiAgRFVQTElDQVRFX09GX1RZUEVfT1BUSU9OUyxcbn0gZnJvbSAnLi9fcGlja2xpc3RzJztcblxuZXhwb3J0IGNvbnN0IExlYWQgPSBPYmplY3RTY2hlbWEuY3JlYXRlKHtcbiAgbmFtZTogJ2NybV9sZWFkJyxcbiAgbGFiZWw6ICdMZWFkJyxcbiAgcGx1cmFsTGFiZWw6ICdMZWFkcycsXG4gIGljb246ICd1c2VyLXBsdXMnLFxuICBkZXNjcmlwdGlvbjogJ1BvdGVudGlhbCBjdXN0b21lcnMgbm90IHlldCBxdWFsaWZpZWQnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIE93bmVyLXdvcmtlZCBxdWV1ZS5cbiAgc2hhcmluZ01vZGVsOiAncHJpdmF0ZScsXG4gIFxuICBmaWVsZEdyb3VwczogW1xuICAgIHsga2V5OiAnaWRlbnRpdHknLCAgICAgbGFiZWw6ICdJZGVudGl0eScsICAgICAgICAgICBpY29uOiAndXNlci1wbHVzJyB9LFxuICAgIHsga2V5OiAnY29tcGFueV9pbmZvJywgbGFiZWw6ICdDb21wYW55IEluZm9ybWF0aW9uJywgaWNvbjogJ2J1aWxkaW5nJyB9LFxuICAgIHsga2V5OiAnY29udGFjdF9pbmZvJywgbGFiZWw6ICdDb250YWN0IEluZm9ybWF0aW9uJywgaWNvbjogJ3Bob25lJyB9LFxuICAgIHsga2V5OiAncXVhbGlmaWNhdGlvbicsIGxhYmVsOiAnUXVhbGlmaWNhdGlvbicsICAgICBpY29uOiAnc3RhcicgfSxcbiAgICB7IGtleTogJ2Fzc2lnbm1lbnQnLCAgIGxhYmVsOiAnQXNzaWdubWVudCcsICAgICAgICAgaWNvbjogJ3VzZXInIH0sXG4gICAgeyBrZXk6ICdhZGRyZXNzJywgICAgICBsYWJlbDogJ0FkZHJlc3MnLCAgICAgICAgICAgIGljb246ICdtYXAtcGluJywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gICAgeyBrZXk6ICdhZGRpdGlvbmFsJywgICBsYWJlbDogJ0FkZGl0aW9uYWwgSW5mbycsICAgIGljb246ICdpbmZvJywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gICAgeyBrZXk6ICdwcmVmZXJlbmNlcycsICBsYWJlbDogJ0NvbW11bmljYXRpb24gUHJlZmVyZW5jZXMnLCBpY29uOiAnYmVsbC1vZmYnLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ2NvbnZlcnNpb24nLCAgIGxhYmVsOiAnQ29udmVyc2lvbicsICAgICAgICAgaWNvbjogJ2NoZWNrLWNpcmNsZScsIGNvbGxhcHNlOiAnY29sbGFwc2VkJyB9LFxuICAgIHsga2V5OiAnZHVwbGljYXRlcycsICAgbGFiZWw6ICdEdXBsaWNhdGUgTWFuYWdlbWVudCcsIGljb246ICdjb3B5JywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gUGxhdGZvcm0gb3duZXJzaGlwIGFuY2hvciBcdTIwMTQgY2Fub25pY2FsIG5vdGUgaW4gYGFjY291bnQub2JqZWN0LnRzYCAoIzU0OCkuXG4gICAgb3duZXJfaWQ6IEZpZWxkLmxvb2t1cCgnc3lzX3VzZXInLCB7XG4gICAgICBsYWJlbDogJ0xlYWQgT3duZXInLFxuICAgICAgZ3JvdXA6ICdhc3NpZ25tZW50JyxcbiAgICAgIHN5c3RlbTogdHJ1ZSxcbiAgICAgIHJlYWRvbmx5OiBmYWxzZSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIC8vIFBlcnNvbmFsIEluZm9ybWF0aW9uXG4gICAgc2FsdXRhdGlvbjogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnU2FsdXRhdGlvbicsXG4gICAgICBncm91cDogJ2lkZW50aXR5JyxcbiAgICAgIC8vIENhbm9uaWNhbCBzZXQgc2hhcmVkIHdpdGggQ29udGFjdCAoIzQ5MCkgXHUyMDE0IHNlZSBfcGlja2xpc3RzLnRzLlxuICAgICAgb3B0aW9uczogWy4uLlNBTFVUQVRJT05fT1BUSU9OU10sXG4gICAgfSksXG5cbiAgICBmaXJzdF9uYW1lOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnRmlyc3QgTmFtZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIGdyb3VwOiAnaWRlbnRpdHknLFxuICAgIH0pLFxuXG4gICAgbGFzdF9uYW1lOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnTGFzdCBOYW1lJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgZ3JvdXA6ICdpZGVudGl0eScsXG4gICAgfSksXG5cbiAgICAvLyBcdTI2QTBcdUZFMEYgYHNhbHV0YXRpb25gIGlzIGEgcGlja2xpc3QsIHNvIGEgZm9ybXVsYSBzZWVzIHRoZSByYXcgVkFMVUUgKGBtc2AsXG4gICAgLy8gYGRyYCksIG5vdCB0aGUgbGFiZWwgXHUyMDE0IGluY2x1ZGluZyBpdCByZW5kZXJzIG5hbWVzIGFzIFwibXMgRW1pbHkgRGF2aXNcIiBpblxuICAgIC8vIGxpc3RzIGFuZCBkZXRhaWxzLiBEcm9wcGVkIGhlcmUgYW5kIGZyb20gYGRpc3BsYXlfdGl0bGVgIGJlbG93LCBtYXRjaGluZ1xuICAgIC8vIENvbnRhY3QuXG4gICAgZnVsbF9uYW1lOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnRnVsbCBOYW1lJyxcbiAgICAgIGV4cHJlc3Npb246IEZgam9pbk5vbkVtcHR5KFtyZWNvcmQuZmlyc3RfbmFtZSwgcmVjb3JkLmxhc3RfbmFtZV0sICcgJylgLFxuICAgICAgZ3JvdXA6ICdpZGVudGl0eScsXG4gICAgfSksXG5cbiAgICAvLyBBRFItMDA3OSByZWNvcmQgdGl0bGUgKHdhcyB0aXRsZUZvcm1hdCAne2Z1bGxfbmFtZX0gLSB7Y29tcGFueX0nKS5cbiAgICAvLyBDb21wb3NlZCBmcm9tIHRoZSBzYW1lIHNvdXJjZSBmaWVsZHMgYXMgYGZ1bGxfbmFtZWAgKG5vdCBmb3JtdWxhLW9uLWZvcm11bGEpXG4gICAgLy8gcGx1cyBgY29tcGFueWAsIHNvIHRoZSB0aXRsZSByZXNvbHZlcyBmcm9tIHJlYWwgc3RvcmVkIHZhbHVlcy5cbiAgICBkaXNwbGF5X3RpdGxlOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnRGlzcGxheSBUaXRsZScsXG4gICAgICBleHByZXNzaW9uOiBGYGpvaW5Ob25FbXB0eShbcmVjb3JkLmZpcnN0X25hbWUsIHJlY29yZC5sYXN0X25hbWVdLCAnICcpICsgXCIgLSBcIiArIHJlY29yZC5jb21wYW55YCxcbiAgICAgIGdyb3VwOiAnaWRlbnRpdHknLFxuICAgIH0pLFxuXG4gICAgLy8gQ29tcGFueSBJbmZvcm1hdGlvblxuICAgIGNvbXBhbnk6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdDb21wYW55JyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgZ3JvdXA6ICdjb21wYW55X2luZm8nLFxuICAgIH0pLFxuXG4gICAgLyoqXG4gICAgICogQ2FzZS0gYW5kIHdoaXRlc3BhY2UtZm9sZGVkIGNvcHkgb2YgYGNvbXBhbnlgIFx1MjAxNCB0aGUgdmFsdWUgbGVhZCBjb252ZXJzaW9uXG4gICAgICogY29tcGFyZXMgYWdhaW5zdCBgY3JtX2FjY291bnQubmFtZV9ub3JtYWxpemVkYC5cbiAgICAgKlxuICAgICAqICMjIyBXaHkgdGhlIExFQUQgbmVlZHMgb25lIHRvb1xuICAgICAqXG4gICAgICogXHUyNkEwXHVGRTBGIEEgbm9ybWFsaXplZCBjb2x1bW4gb24gYGNybV9hY2NvdW50YCBhbG9uZSBmaXhlcyBub3RoaW5nOiB0aGVcbiAgICAgKiBjb252ZXJzaW9uIGZsb3cgd291bGQgdGhlbiBjb21wYXJlIGEgcmF3IGNvbXBhbnkgc3RyaW5nIGFnYWluc3QgYSBmb2xkZWRcbiAgICAgKiBhY2NvdW50IG5hbWUsIGFuZCBgXCJBQ01FICBDb3JwXCJgIHN0aWxsIHdvdWxkIG5vdCBtYXRjaCBgYWNtZSBjb3JwYC4gQm90aFxuICAgICAqIHNpZGVzIGhhdmUgdG8gYmUgY2Fub25pY2FsLCBhbmQgdGhlIGZsb3cgY2FuIGNhbm9uaWNhbGl6ZSBuZWl0aGVyIFx1MjAxNFxuICAgICAqIGBzZXJ2aWNlLWF1dG9tYXRpb25gJ3MgYHJlc29sdmVUb2tlbmAgYWNjZXB0cyBleGFjdGx5IG9uZSBmdW5jdGlvbiBmb3JtXG4gICAgICogKGBOT1coKWAgLyBgVE9EQVkoKWApLCBzbyBge0xPV0VSKHgpfWAsIGB7VFJJTSh4KX1gIGFuZFxuICAgICAqIGB7eC50b0xvd2VyQ2FzZSgpfWAgYWxsIHJlc29sdmUgdG8gYHVuZGVmaW5lZGAuIFNlZSB0aGUgZmllbGQgY29tbWVudCBvblxuICAgICAqIGBjcm1fYWNjb3VudC5uYW1lX25vcm1hbGl6ZWRgIGZvciB0aGUgZnVsbCBtZWFzdXJlbWVudC5cbiAgICAgKlxuICAgICAqIGBjb21wYW55YCBpdHNlbGYgaXMgTk9UIGZvbGRlZCBpbiBwbGFjZTogaXQgaXMgdGhlIGRpc3BsYXkgdmFsdWUsIGl0IGlzXG4gICAgICogY29waWVkIHZlcmJhdGltIG9udG8gdGhlIGFjY291bnQgdGhlIGNvbnZlcnNpb24gY3JlYXRlcywgYW5kIGxvd2VyLWNhc2luZ1xuICAgICAqIGl0IHdvdWxkIHNoaXAgYGFjbWUgY29ycGAgYXMgYSBjdXN0b21lci12aXNpYmxlIGFjY291bnQgbmFtZS4gVGhhdCBpcyB0aGVcbiAgICAgKiBvbmUgd2F5IHRoaXMgZGlmZmVycyBmcm9tIGBlbWFpbGAsIHdoaWNoIGhhcyBubyBtZWFuaW5nZnVsIGNhc2UgYW5kIHNvIGlzXG4gICAgICogY2Fub25pY2FsaXplZCBpbiBwbGFjZS5cbiAgICAgKlxuICAgICAqIERlcml2ZWQsIG5ldmVyIGF1dGhvcmVkOiBgbGVhZF9kdXBsaWNhdGVfY2hlY2tgIHJlY29tcHV0ZXMgaXQgb24gZXZlcnlcbiAgICAgKiB3cml0ZSB0aGF0IGNhcnJpZXMgYGNvbXBhbnlgLiBOb3QgaW5kZXhlZCBcdTIwMTQgbm90aGluZyBmaWx0ZXJzIG9uIGl0OyBpdCBpc1xuICAgICAqIHJlYWQgb2ZmIHRoZSBsZWFkIHJlY29yZCB0aGUgZmxvdyBhbHJlYWR5IGZldGNoZWQuXG4gICAgICovXG4gICAgY29tcGFueV9ub3JtYWxpemVkOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnQ29tcGFueSAoTm9ybWFsaXplZCknLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdNYXRjaCBrZXkgZm9yIGxlYWQgY29udmVyc2lvbjogQ29tcGFueSBsb3dlci1jYXNlZCwgdHJpbW1lZCwgd2l0aCBpbnRlcm5hbCB3aGl0ZXNwYWNlIGNvbGxhcHNlZC4gTWFpbnRhaW5lZCBieSB0aGUgbGVhZF9kdXBsaWNhdGVfY2hlY2sgaG9vayBcdTIwMTQgbmV2ZXIgZWRpdCBkaXJlY3RseS4nLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBoaWRkZW46IHRydWUsXG4gICAgICBtYXhMZW5ndGg6IDI1NSxcbiAgICAgIGdyb3VwOiAnY29tcGFueV9pbmZvJyxcbiAgICB9KSxcblxuICAgIHRpdGxlOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnSm9iIFRpdGxlJyxcbiAgICAgIGdyb3VwOiAnY29tcGFueV9pbmZvJyxcbiAgICB9KSxcblxuICAgIGluZHVzdHJ5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdJbmR1c3RyeScsXG4gICAgICBncm91cDogJ2NvbXBhbnlfaW5mbycsXG4gICAgICAvLyBDYW5vbmljYWwgc2V0IHNoYXJlZCB3aXRoIEFjY291bnQgKCM0OTApOiBsZWFkX2NvbnZlcnNpb24gY29waWVzIHRoaXNcbiAgICAgIC8vIHZhbHVlIG9udG8gdGhlIGNyZWF0ZWQgQWNjb3VudCwgc28gYm90aCBvYmplY3RzIE1VU1QgYWdyZWUuXG4gICAgICBvcHRpb25zOiBbLi4uSU5EVVNUUllfT1BUSU9OU10sXG4gICAgfSksXG5cbiAgICAvLyBcdTI2QTBcdUZFMEYgTk9UIGB1bmlxdWVgLiBBIGhhcmQgdW5pcXVlbmVzcyBjb25zdHJhaW50IG9uIGEgbGVhZCdzIGVtYWlsIHNheXMgYVxuICAgIC8vIHBlcnNvbiBtYXkgZW5xdWlyZSBvbmNlLCBldmVyLCBhbmQgdGhlIGRhdGFiYXNlIGVuZm9yY2VzIGl0IGJ5IFJFSkVDVElOR1xuICAgIC8vIHRoZSBzZWNvbmQgZW5xdWlyeSBcdTIwMTQgdHVybmluZyBhbiBvcmRpbmFyeSBmb2xsb3ctdXAgaW50byBhIDUwMCBvbiB0aGVcbiAgICAvLyBwdWJsaWMgZm9ybS4gUmVhbCBmdW5uZWxzIHJlLWNhcHR1cmUgdGhlIHNhbWUgYWRkcmVzcyByb3V0aW5lbHkuXG4gICAgLy8gRHVwbGljYXRlcyBhcmUgYSBmYWN0IHRvIGJlIFJFQ09SREVELCBub3QgYW4gZXJyb3I6IGBsZWFkX2R1cGxpY2F0ZV9jaGVja2BcbiAgICAvLyBpbiBsZWFkLmhvb2sudHMgbGlua3MgdGhlIG5ldyBsZWFkIHRvIHRoZSByZWNvcmQgaXQgcmVwZWF0cyAoc2VlIHRoZVxuICAgIC8vIGBkdXBsaWNhdGVzYCBmaWVsZCBncm91cCBiZWxvdykuIFRoZSBwbGFpbiBpbmRleCBiZWxvdyBpcyB3aGF0IGtlZXBzIHRoZVxuICAgIC8vIGNvbHVtbiBpbmRleGVkIGluIHRoZSBjb25zdHJhaW50J3MgYWJzZW5jZSBcdTIwMTQgdGhlIGludGFrZSBkZWR1cGUgbG9va3VwLCB0aGVcbiAgICAvLyBgY3JtX2xlYWRfaW1wb3J0YCB1cHNlcnQga2V5IGFuZCB0aGUgY29udmVyc2lvbiBmbG93IGFsbCByZWFkIGxlYWRzIGJ5XG4gICAgLy8gZW1haWwgb24gZXZlcnkgd3JpdGUuXG4gICAgZW1haWw6IEZpZWxkLmVtYWlsKHtcbiAgICAgIGxhYmVsOiAnRW1haWwnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGdyb3VwOiAnY29udGFjdF9pbmZvJyxcbiAgICB9KSxcblxuICAgIHBob25lOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnUGhvbmUnLFxuICAgICAgZm9ybWF0OiAncGhvbmUnLFxuICAgICAgZ3JvdXA6ICdjb250YWN0X2luZm8nLFxuICAgIH0pLFxuXG4gICAgbW9iaWxlOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnTW9iaWxlJyxcbiAgICAgIGZvcm1hdDogJ3Bob25lJyxcbiAgICAgIGdyb3VwOiAnY29udGFjdF9pbmZvJyxcbiAgICB9KSxcblxuICAgIHdlYnNpdGU6IEZpZWxkLnVybCh7XG4gICAgICBsYWJlbDogJ1dlYnNpdGUnLFxuICAgICAgZ3JvdXA6ICdjb250YWN0X2luZm8nLFxuICAgIH0pLFxuXG4gICAgLy8gTGVhZCBRdWFsaWZpY2F0aW9uXG4gICAgc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdMZWFkIFN0YXR1cycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICAgIC8vIEZpZWxkLWxldmVsIGRlZmF1bHQ6IG9wdGlvbi1sZXZlbCBgZGVmYXVsdDogdHJ1ZWAgb25seSBwcmVzZWxlY3RzIGluXG4gICAgICAvLyBVSSBmb3JtcyBhZnRlciBmaXJzdCBwYWludDsgdGhlIHF1aWNrLWNyZWF0ZSBkaWFsb2cgYW5kIEFQSSBpbnNlcnRzXG4gICAgICAvLyBuZWVkIGEgcmVhbCBkZWZhdWx0VmFsdWUgKHNlZSBhcHByb3ZhbF9zdGF0dXMgZm9yIHRoZSBzYW1lIGxlc3NvbikuXG4gICAgICBkZWZhdWx0VmFsdWU6ICduZXcnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnTmV3JywgdmFsdWU6ICduZXcnLCBjb2xvcjogJyM4MDgwODAnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDb250YWN0ZWQnLCB2YWx1ZTogJ2NvbnRhY3RlZCcsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1F1YWxpZmllZCcsIHZhbHVlOiAncXVhbGlmaWVkJywgY29sb3I6ICcjNDE2OUUxJyB9LFxuICAgICAgICB7IGxhYmVsOiAnVW5xdWFsaWZpZWQnLCB2YWx1ZTogJ3VucXVhbGlmaWVkJywgY29sb3I6ICcjRkYwMDAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQ29udmVydGVkJywgdmFsdWU6ICdjb252ZXJ0ZWQnLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICBdXG4gICAgfSksXG5cbiAgICByYXRpbmc6IEZpZWxkLnJhdGluZyg1LCB7XG4gICAgICBsYWJlbDogJ0xlYWQgU2NvcmUnLFxuICAgICAgZGVzY3JpcHRpb246ICdMZWFkIHF1YWxpdHkgc2NvcmUgKDEtNSBzdGFycyknLFxuICAgICAgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICB9KSxcblxuICAgIGxlYWRfc291cmNlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdMZWFkIFNvdXJjZScsXG4gICAgICBncm91cDogJ3F1YWxpZmljYXRpb24nLFxuICAgICAgLy8gQ2Fub25pY2FsIHNldCBzaGFyZWQgd2l0aCBDb250YWN0ICsgT3Bwb3J0dW5pdHkgKCM0OTApOiBsZWFkX2NvbnZlcnNpb25cbiAgICAgIC8vIGNvcGllcyB0aGlzIHZhbHVlIG9udG8gdGhlIGNyZWF0ZWQgT3Bwb3J0dW5pdHksIHNvIGFsbCB0aHJlZSBNVVNUIGFncmVlLlxuICAgICAgb3B0aW9uczogWy4uLkxFQURfU09VUkNFX09QVElPTlNdLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIERlbWFuZDogd2hhdCB0aGlzIHByb3NwZWN0IHdhbnRzLCBhbmQgd2hhdCBpdCBpcyB3b3J0aCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIFJFUS0wMDA1IHN0ZXBzIDYtNy4gQm90aCBmaWVsZHMgYXJlIGluIGBxdWFsaWZpY2F0aW9uYCBiZWNhdXNlIHRoZXkgQVJFXG4gICAgLy8gcXVhbGlmaWNhdGlvbiBkYXRhIFx1MjAxNCB3aGF0IHRoZSBidXllciBpcyBhc2tpbmcgZm9yIGFuZCBob3cgYmlnIGl0IGlzIGFyZVxuICAgIC8vIHRoZSB0d28gZmFjdHMgYSByZXAgd2VpZ2hzIGJlZm9yZSB3b3JraW5nIGEgbGVhZCBcdTIwMTQgYW5kIG5laXRoZXIgaXNcbiAgICAvLyByZXF1aXJlZDogYSBsZWFkIGNhcHR1cmVkIG9mZiB0aGUgcHVibGljIGZvcm0gaGFzIG5laXRoZXIsIGFuZCBzYXZlc1xuICAgIC8vIGV4YWN0bHkgYXMgaXQgZGlkIGJlZm9yZS5cblxuICAgIG5lZWRfdHlwZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnTmVlZCBUeXBlJyxcbiAgICAgIGdyb3VwOiAncXVhbGlmaWNhdGlvbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ1doYXQgdGhpcyBwcm9zcGVjdCBpcyBhc2tpbmcgZm9yLiBSb3V0aW5nLCBwcmlvcml0aXNhdGlvbiBhbmQgZGVtYW5kIHJlcG9ydGluZyByZWFkIHRoaXMuJyxcbiAgICAgIC8vIEdlbmVyaWMgc3RhcnRlciB2b2NhYnVsYXJ5LCBkZWNsYXJlZCBvbmNlIGluIGBfcGlja2xpc3RzLnRzYCBcdTIwMTQgc2VlIHRoZVxuICAgICAgLy8gbm90ZSB0aGVyZSBmb3Igd2h5IGl0IGlzIE5PVCBzaGFyZWQgd2l0aCBgY3JtX29wcG9ydHVuaXR5LnR5cGVgLlxuICAgICAgb3B0aW9uczogWy4uLkxFQURfTkVFRF9UWVBFX09QVElPTlNdLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNkQ0IE5FVkVSIGNvbmZsYXRlZCB3aXRoIGBhbm51YWxfcmV2ZW51ZWAsIHdoaWNoIHNpdHMgdHdvIGdyb3VwcyBiZWxvdyBpblxuICAgIC8vIGBhZGRpdGlvbmFsYCBhbmQgYW5zd2VycyBhIGRpZmZlcmVudCBxdWVzdGlvbjogdGhhdCBpcyB0aGUgcHJvc3BlY3RcbiAgICAvLyBDT01QQU5ZJ3Mgb3duIHR1cm5vdmVyLCBhIHNpemUgc2lnbmFsLCBhbmQgaXQgaXMgdGhlIHZhbHVlXG4gICAgLy8gYGxlYWRfY29udmVyc2lvbmAgY29waWVzIG9udG8gdGhlIGFjY291bnQgaXQgY3JlYXRlcy4gVGhpcyBpcyB0aGUgdmFsdWVcbiAgICAvLyBvZiB0aGUgREVNQU5EIFx1MjAxNCB0aGUgbnVtYmVyIHRoYXQgYmVjb21lcyBgY3JtX29wcG9ydHVuaXR5LmFtb3VudGAgd2hlbiB0aGVcbiAgICAvLyBsZWFkIGNvbnZlcnRzLCBhbmQgdGhlIG9ubHkgZmlndXJlIHRoZSBwaXBlbGluZSBoYXMgYmVmb3JlIHRoZW4uXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgTm9yIGlzIGl0IGEgc2Vjb25kIGNvcHkgb2YgYGNybV9vcHBvcnR1bml0eS5hbW91bnRgLiBUaGUgb3Bwb3J0dW5pdHknc1xuICAgIC8vIGFtb3VudCBpcyBhIGNvbW1pdHRlZCBkZWFsIGZpZ3VyZSBhIHJlcCBkZWZlbmRzIGluIGEgZm9yZWNhc3Q7IHRoaXMgaXMgYW5cbiAgICAvLyBlc3RpbWF0ZSB0YWtlbiBiZWZvcmUgcXVhbGlmaWNhdGlvbiwgYW5kIHRoZSBjb252ZXJzaW9uIHNjcmVlbiBpcyB3aGVyZSBhXG4gICAgLy8gaHVtYW4gdHVybnMgb25lIGludG8gdGhlIG90aGVyIChpdCBQUkVGSUxMUyBmcm9tIGhlcmUgXHUyMDE0IHNlZSB0aGVcbiAgICAvLyBgb3Bwb3J0dW5pdHlBbW91bnRgIHNjcmVlbiBmaWVsZCBpbiBgbGVhZC1jb252ZXJzaW9uLmZsb3cudHNgIFx1MjAxNCByYXRoZXJcbiAgICAvLyB0aGFuIGNvcHlpbmcgc2lsZW50bHksIHNvIHRoZSByZXAgY29uZmlybXMgdGhlIG51bWJlciB0aGF0IGVudGVycyB0aGVcbiAgICAvLyBmb3JlY2FzdCkuXG4gICAgZXN0aW1hdGVkX2Ftb3VudDogRmllbGQuY3VycmVuY3koe1xuICAgICAgbGFiZWw6ICdFc3RpbWF0ZWQgQW1vdW50JyxcbiAgICAgIGdyb3VwOiAncXVhbGlmaWNhdGlvbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0VzdGltYXRlZCB2YWx1ZSBvZiB0aGlzIGRlbWFuZCwgYmVmb3JlIHF1YWxpZmljYXRpb24uIFByZWZpbGxzIHRoZSBkZWFsIGFtb3VudCBhdCBjb252ZXJzaW9uLicsXG4gICAgfSksXG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgVGhlIGNvbnZlcnNpb24gYXBwcm92YWwgZ2F0ZSAoUkVRLTAwMDUgc3RlcCA3KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBgZGVmYXVsdFZhbHVlOiAnbm90X3JlcXVpcmVkJ2AgSVMgVEhFIEdBVEUnUyBPRkYgU1dJVENILCBhbmQgaXQgaXMgdGhlXG4gICAgLy8gb25lIGxpbmUgYW4gaW5zdGFsbCBjaGFuZ2VzIHRvIGFybSBpdC4gUkVRLTAwMDU6IFwiVGhlIGdhdGUgbXVzdCBiZVxuICAgIC8vIGNvbmZpZ3VyYWJsZSBcdTIwMTQgb2ZmIGJ5IGRlZmF1bHQuIEEgc2luZ2xlLXNlbGxlciBpbnN0YWxsIG11c3Qgbm90IGJlIGZvcmNlZFxuICAgIC8vIHRocm91Z2ggYW4gYXBwcm92YWwgdG8gY29udmVydCBhIGxlYWQuXCJcbiAgICAvL1xuICAgIC8vICAgT0ZGIChzaGlwcGVkKSAgZXZlcnkgbGVhZCBpcyBib3JuIGBub3RfcmVxdWlyZWRgOyBub3RoaW5nIGV2ZXIgd3JpdGVzXG4gICAgLy8gICAgICAgICAgICAgICAgICBgcGVuZGluZ2AsIHNvIGBsZWFkX2NvbnZlcnNpb25fYXBwcm92YWxgIG5ldmVyIGVudGVycyxcbiAgICAvLyAgICAgICAgICAgICAgICAgIHRoZSBDb252ZXJ0IGJ1dHRvbiBuZXZlciBoaWRlcyBhbmQgdGhlIHdyaXRlLXBhdGggZ2F0ZSBpblxuICAgIC8vICAgICAgICAgICAgICAgICAgYGxlYWQuaG9vay50c2AgbmV2ZXIgZmlyZXMuIENvbnZlcnNpb24gYmVoYXZlcyBFWEFDVExZIGFzXG4gICAgLy8gICAgICAgICAgICAgICAgICBpdCBkaWQgYmVmb3JlIHRoaXMgZmllbGQgZXhpc3RlZC5cbiAgICAvLyAgIE9OICAgICAgICAgICAgIGNoYW5nZSB0aGlzIG9uZSB2YWx1ZSB0byBgJ3BlbmRpbmcnYC4gRXZlcnkgbGVhZCBpcyB0aGVuXG4gICAgLy8gICAgICAgICAgICAgICAgICBib3JuIHBlbmRpbmcsIGBsZWFkX2NvbnZlcnNpb25fYXBwcm92YWxgIG9wZW5zIGl0c1xuICAgIC8vICAgICAgICAgICAgICAgICAgcmVxdWVzdCwgYW5kIGNvbnZlcnNpb24gaXMgcmVmdXNlZCB1bnRpbCBhbiBhcHByb3ZlclxuICAgIC8vICAgICAgICAgICAgICAgICAgZGVjaWRlcy5cbiAgICAvL1xuICAgIC8vIExlYWRzIHRoYXQgcHJlZGF0ZSB0aGUgc3dpdGNoIGtlZXAgd2hhdGV2ZXIgdGhleSB3ZXJlIGJvcm4gd2l0aCwgd2hpY2ggaXNcbiAgICAvLyB0aGUgcG9pbnQ6IGFybWluZyB0aGUgZ2F0ZSBkb2VzIG5vdCBpbnZhbGlkYXRlIG9yIHJlLW9wZW4gYSBzaW5nbGVcbiAgICAvLyBleGlzdGluZyByZWNvcmQgKFJFUS0wMDA1IGFjY2VwdGFuY2UgNCkuIFRoaXMgaXMgYSBUUkFOU0lUSU9OIEdBVEUsIG5vdCBhblxuICAgIC8vIGludmFyaWFudCAoQUdFTlRTLm1kIG1ldGFkYXRhIHNlbWFudGljcyBydWxlIDcpIFx1MjAxNCB3aGF0IGlzIHJlZnVzZWQgaXMgdGhlXG4gICAgLy8gQUNUIG9mIGNvbnZlcnRpbmcsIGV2YWx1YXRlZCBhZ2FpbnN0IGBwcmV2aW91c2AgaW4gYGxlYWQuaG9vay50c2AsIG5ldmVyXG4gICAgLy8gdGhlIHN0YXRlIG9mIGEgcmVjb3JkIHRoYXQgaXMgYWxyZWFkeSBjb252ZXJ0ZWQuXG4gICAgLy9cbiAgICAvLyBTaGFwZSBjb3BpZWQgZnJvbSBgY3JtX29wcG9ydHVuaXR5LmFwcHJvdmFsX3N0YXR1c2A6IGByZWFkb25seTogdHJ1ZWBcbiAgICAvLyBwbHVzIGEgUkVBTCBmaWVsZC1sZXZlbCBgZGVmYXVsdFZhbHVlYCwgXHUyNkQ0IG5vdCBvbmx5IGFuIG9wdGlvbi1sZXZlbFxuICAgIC8vIGBkZWZhdWx0OiB0cnVlYCBcdTIwMTQgdGhlIHNhbWUgbGVzc29uIGBzdGF0dXNgIGFib3ZlIHJlY29yZHMsIGFuZCB0aGUgcmVhc29uXG4gICAgLy8gdGhhdCBmaWVsZCdzIG93biBjb21tZW50IGdpdmVzOiBhbiBvcHRpb24gZGVmYXVsdCBvbmx5IHByZXNlbGVjdHMgaW4gVUlcbiAgICAvLyBmb3JtcyBhZnRlciBmaXJzdCBwYWludCwgc28gYSBxdWljay1jcmVhdGUgZGlhbG9nIG9yIGFuIEFQSSBpbnNlcnQgd291bGRcbiAgICAvLyBsYW5kIGEgbnVsbCBhbmQgYSBudWxsIG1hdGNoZXMgbm8gZmxvdyBlbnRyeSBjb25kaXRpb24uXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgRG8gTk9UIGFkZCBhbiBcImFwcHJvdmVkXCIgdmFsdWUgdG8gYHN0YXR1c2AgaW5zdGVhZC4gVGhhdCBzZWxlY3QgaXMgdGhlXG4gICAgLy8gcXVhbGlmaWNhdGlvbiBsaWZlY3ljbGU7IGEgc2l4dGggdmFsdWUgdGhlcmUgd291bGQgYnJlYWsgdGhlXG4gICAgLy8gYGNvbnZlcnRfbGVhZGAgcHJlZGljYXRlLCB0aGUgYGxlYWRfc3RhdHVzX3Byb2dyZXNzaW9uYCB0cmFuc2l0aW9ucyBhbmRcbiAgICAvLyB0aGUgc2VlZGVkIHJvd3MsIGFuZCB3b3VsZCBjb25mbGF0ZSBcInRoaXMgbGVhZCBpcyB3b3J0aCB3b3JraW5nXCIgd2l0aFxuICAgIC8vIFwic29tZW9uZSBzaWduZWQgb2ZmIG9uIGNvbnZlcnRpbmcgaXRcIi5cbiAgICBjb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1czogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnQ29udmVyc2lvbiBBcHByb3ZhbCcsXG4gICAgICBncm91cDogJ3F1YWxpZmljYXRpb24nLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1doZXRoZXIgdGhpcyBsZWFkIGhhcyBiZWVuIHNpZ25lZCBvZmYgZm9yIGNvbnZlcnNpb24uIE5vdCBSZXF1aXJlZCBtZWFucyBubyBhcHByb3ZhbCBpcyBhc2tlZCBmb3IgXHUyMDE0IHRoZSBzaGlwcGVkIGRlZmF1bHQuJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogJ25vdF9yZXF1aXJlZCcsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdOb3QgUmVxdWlyZWQnLCB2YWx1ZTogJ25vdF9yZXF1aXJlZCcsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ1BlbmRpbmcnLCB2YWx1ZTogJ3BlbmRpbmcnLCBjb2xvcjogJyNGRkE1MDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdBcHByb3ZlZCcsIHZhbHVlOiAnYXBwcm92ZWQnLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWplY3RlZCcsIHZhbHVlOiAncmVqZWN0ZWQnLCBjb2xvcjogJyNGRjAwMDAnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgLy8gQXNzaWdubWVudFxuXG4gICAgLy8gQ29udmVyc2lvbiB0cmFja2luZy5cbiAgICAvLyBcdTI2RDQgTk9UIGByZWFkb25seWA6IHRoZSBgbGVhZF9jb252ZXJzaW9uYCBmbG93J3MgYG1hcmtfY29udmVydGVkYCBub2RlXG4gICAgLy8gVVBEQVRFcyB0aGlzIGNvbHVtbiBhbmQgdGhlIGZvdXIgYGNvbnZlcnRlZF8qYCBvbmVzIGJlbG93LCBhbmQgdGhhdCBmbG93XG4gICAgLy8gZGVjbGFyZXMgbm8gYHJ1bkFzYCBcdTIwMTQgc28gaXQgcnVucyBhdCB0aGUgZW5naW5lIGRlZmF1bHQgYCd1c2VyJ2AsIHdoaWNoIGlzXG4gICAgLy8gYWxzbyB3aGVyZSBob3VzZSBydWxlIDkga2VlcHMgYSBzY3JlZW4gZmxvdy4gYHN0cmlwUmVhZG9ubHlGaWVsZHNgIHJ1bnNcbiAgICAvLyB1bmRlciBgaWYgKCFvcEN0eC5jb250ZXh0Py5pc1N5c3RlbSlgIGFuZCBkZWxldGVzIGV2ZXJ5IHJlYWRvbmx5IGtleSB0aGVcbiAgICAvLyBDQUxMRVIgc3VwcGxpZWQsIHNvIGByZWFkb25seWAgaGVyZSB3b3VsZCBzaWxlbnRseSB1bi1jb252ZXJ0IGV2ZXJ5XG4gICAgLy8gY29udmVyc2lvbi5cbiAgICAvLyBcdTI2QTBcdUZFMEYgVGhlIG90aGVyIHdyaXRlciBpcyB1bmFmZmVjdGVkLCBhbmQgaXMgbm90IHRoZSByZWFzb246IHRoZVxuICAgIC8vIGd1ZXN0LXN1Ym1pc3Npb24gc2FuaXRpc2VyIGluIGBsZWFkLmhvb2sudHNgIEFTU0lHTlMgdGhlc2Ugb25cbiAgICAvLyBgYmVmb3JlSW5zZXJ0YCwgYW5kIGhvb2std3JpdHRlbiBrZXlzIGFyZSBub3QgY2FsbGVyLXN1cHBsaWVkIFx1MjAxNCBub3IgZG9lc1xuICAgIC8vIHRoZSBzdHJpcCBydW4gb24gSU5TRVJUIGF0IGFsbC4gTWVhc3VyZWQgaW5cbiAgICAvLyBgdGVzdC9yZWFkb25seS13cml0ZS1zZW1hbnRpY3MudGVzdC50c2AuXG4gICAgLy8gXHUyMUQyIERlY2xhcmluZyB0aGVzZSBgcmVhZG9ubHlgIHdvdWxkIG5lZWQgdGhlIGZsb3cncyB3cml0ZSBFTEVWQVRFRCwgd2hpY2hcbiAgICAvLyBpcyBhIHByaXZpbGVnZSBkZWNpc2lvbiBvbiB0aGUgbWFpbnRhaW5lcidzIGZsb29yLCBub3QgdGhpcyBmaWxlJ3MgKCMxNDM1KS5cbiAgICAvLyBFZGl0LXByb3RlY3Rpb24gaXMgdGhlIGBiZWZvcmVVcGRhdGVgIGd1YXJkIGluIGBsZWFkLmhvb2sudHNgLCB3aGljaFxuICAgIC8vIHJlamVjdHMgYW55IFVTRVIgZWRpdCB0byBhIGNvbnZlcnRlZCBsZWFkIG91dHNpZGUgYSBzbWFsbCBhbGxvdy1saXN0IFx1MjAxNFxuICAgIC8vIGFuZCBpdCBpcyB0aGUgT05MWSBndWFyZCwgZGVsaWJlcmF0ZWx5OiBhIHNjcmlwdCB2YWxpZGF0aW9uIGJlc2lkZSBpdFxuICAgIC8vIG5ldmVyIGZpcmVzLCBiZWNhdXNlIHRoZSBob29rJ3MgdGhyb3cgYWx3YXlzIHdpbnMgdGhlIHJhY2UuXG4gICAgaXNfY29udmVydGVkOiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGxhYmVsOiAnQ29udmVydGVkJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBncm91cDogJ2NvbnZlcnNpb24nLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgY29udmVydGVkX2FjY291bnQ6IEZpZWxkLmxvb2t1cCgnY3JtX2FjY291bnQnLCB7XG4gICAgICBsYWJlbDogJ0NvbnZlcnRlZCBBY2NvdW50JyxcbiAgICAgIGdyb3VwOiAnY29udmVyc2lvbicsXG4gICAgfSksXG5cbiAgICBjb252ZXJ0ZWRfY29udGFjdDogRmllbGQubG9va3VwKCdjcm1fY29udGFjdCcsIHtcbiAgICAgIGxhYmVsOiAnQ29udmVydGVkIENvbnRhY3QnLFxuICAgICAgZ3JvdXA6ICdjb252ZXJzaW9uJyxcbiAgICB9KSxcblxuICAgIGNvbnZlcnRlZF9vcHBvcnR1bml0eTogRmllbGQubG9va3VwKCdjcm1fb3Bwb3J0dW5pdHknLCB7XG4gICAgICBsYWJlbDogJ0NvbnZlcnRlZCBPcHBvcnR1bml0eScsXG4gICAgICBncm91cDogJ2NvbnZlcnNpb24nLFxuICAgIH0pLFxuXG4gICAgY29udmVydGVkX2RhdGU6IEZpZWxkLmRhdGV0aW1lKHtcbiAgICAgIGxhYmVsOiAnQ29udmVydGVkIERhdGUnLFxuICAgICAgZ3JvdXA6ICdjb252ZXJzaW9uJyxcbiAgICB9KSxcblxuICAgIC8vIEFkZHJlc3MgKHVzaW5nIG5ldyBhZGRyZXNzIGZpZWxkIHR5cGUpXG4gICAgYWRkcmVzczogRmllbGQuYWRkcmVzcyh7XG4gICAgICBsYWJlbDogJ0FkZHJlc3MnLFxuICAgICAgZ3JvdXA6ICdhZGRyZXNzJyxcbiAgICB9KSxcblxuICAgIC8vIEFkZGl0aW9uYWwgSW5mb1xuICAgIGFubnVhbF9yZXZlbnVlOiBGaWVsZC5jdXJyZW5jeSh7XG4gICAgICBsYWJlbDogJ0FubnVhbCBSZXZlbnVlJyxcbiAgICAgIGdyb3VwOiAnYWRkaXRpb25hbCcsXG4gICAgfSksXG5cbiAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiBGaWVsZC5udW1iZXIoe1xuICAgICAgbGFiZWw6ICdOdW1iZXIgb2YgRW1wbG95ZWVzJyxcbiAgICAgIGdyb3VwOiAnYWRkaXRpb25hbCcsXG4gICAgfSksXG5cbiAgICBkZXNjcmlwdGlvbjogRmllbGQubWFya2Rvd24oe1xuICAgICAgbGFiZWw6ICdEZXNjcmlwdGlvbicsXG4gICAgICBncm91cDogJ2FkZGl0aW9uYWwnLFxuICAgIH0pLFxuXG4gICAgLy8gQ3VzdG9tIG5vdGVzIHdpdGggcmljaCB0ZXh0IGZvcm1hdHRpbmdcbiAgICBub3RlczogRmllbGQucmljaHRleHQoe1xuICAgICAgbGFiZWw6ICdOb3RlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1dvcmtpbmcgbm90ZXMgb24gdGhpcyBsZWFkIFx1MjAxNCBzdXBwb3J0cyBmb3JtYXR0aW5nLicsXG4gICAgICBncm91cDogJ2FkZGl0aW9uYWwnLFxuICAgIH0pLFxuXG4gICAgLy8gRmxhZ3NcbiAgICBkb19ub3RfY2FsbDogRmllbGQuYm9vbGVhbih7XG4gICAgICBsYWJlbDogJ0RvIE5vdCBDYWxsJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBncm91cDogJ3ByZWZlcmVuY2VzJyxcbiAgICB9KSxcblxuICAgIGVtYWlsX29wdF9vdXQ6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdFbWFpbCBPcHQgT3V0JyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBncm91cDogJ3ByZWZlcmVuY2VzJyxcbiAgICB9KSxcblxuICAgIC8vIEZvbGxvdy11cCAmIGRpc3F1YWxpZmljYXRpb24gdHJhY2tpbmdcbiAgICBuZXh0X2ZvbGxvd3VwX2RhdGU6IEZpZWxkLmRhdGUoe1xuICAgICAgbGFiZWw6ICdOZXh0IEZvbGxvdy11cCBEYXRlJyxcbiAgICAgIGdyb3VwOiAncXVhbGlmaWNhdGlvbicsXG4gICAgfSksXG5cbiAgICAvLyBOT1QgYHJlYWRvbmx5YCAoIzU5MikgXHUyMDE0IHNlZSB0aGUgbG9uZyBub3RlIG9uXG4gICAgLy8gYGNybV9hY2NvdW50Lmxhc3RfYWN0aXZpdHlfZGF0ZWAuIFRoZSBhY3Rpdml0eSBidWJibGUgd3JpdGVzIHRoaXMgZnJvbVxuICAgIC8vIGFub3RoZXIgb2JqZWN0J3MgaG9vaywgYW5kIGEgcmVhZG9ubHkgZmllbGQgaXMgc3RyaXBwZWQgZnJvbSBhbnlcbiAgICAvLyBub24tc3lzdGVtIHdyaXRlIHdob3NlIGNhbGxlciBzdXBwbGllZCB0aGUga2V5ICgjMjk0OCksIHNvIGV2ZXJ5IGJ1YmJsZVxuICAgIC8vIGludG8gdGhpcyBjb2x1bW4gd2FzIHNpbGVudGx5IGRpc2NhcmRlZC5cbiAgICBsYXN0X2NvbnRhY3RlZF9kYXRlOiBGaWVsZC5kYXRldGltZSh7XG4gICAgICBsYWJlbDogJ0xhc3QgQ29udGFjdGVkJyxcbiAgICAgIGdyb3VwOiAncXVhbGlmaWNhdGlvbicsXG4gICAgfSksXG5cbiAgICBkaXNxdWFsaWZpY2F0aW9uX3JlYXNvbjogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnRGlzcXVhbGlmaWNhdGlvbiBSZWFzb24nLFxuICAgICAgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUmVxdWlyZWQgd2hlbiBzdGF0dXMgaXMgVW5xdWFsaWZpZWQnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnTm90IGEgRml0JywgICAgICAgICB2YWx1ZTogJ25vdF9hX2ZpdCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ05vIEJ1ZGdldCcsICAgICAgICAgdmFsdWU6ICdub19idWRnZXQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdXcm9uZyBQZXJzb25hJywgICAgIHZhbHVlOiAnd3JvbmdfcGVyc29uYScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1VucmVhY2hhYmxlJywgICAgICAgdmFsdWU6ICd1bnJlYWNoYWJsZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0R1cGxpY2F0ZScsICAgICAgICAgdmFsdWU6ICdkdXBsaWNhdGUnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDb21wZXRpdG9yJywgICAgICAgIHZhbHVlOiAnY29tcGV0aXRvcicgfSxcbiAgICAgICAgeyBsYWJlbDogJ090aGVyJywgICAgICAgICAgICAgdmFsdWU6ICdvdGhlcicgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgRHVwbGljYXRlIG1hbmFnZW1lbnQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBgZGlzcXVhbGlmaWNhdGlvbl9yZWFzb246ICdkdXBsaWNhdGUnYCBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIHJlY29yZFxuICAgIC8vIHNheXMgV0hBVCBpdCBkdXBsaWNhdGVzIFx1MjAxNCBvdGhlcndpc2UgdGhlIFwiZHVwbGljYXRlXCIgYmFyIG9uIHRoZVxuICAgIC8vIGRpc3F1YWxpZmljYXRpb24gYnJlYWtkb3duIHBvaW50cyBhdCBub3RoaW5nIHlvdSBjYW4gb3Blbi5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBUaGUgc3Vydml2aW5nIHJlY29yZCBjYW4gbGl2ZSBvbiBlaXRoZXIgb2JqZWN0IFx1MjAxNCBhIHN0aWxsLW9wZW4gbGVhZCwgb3JcbiAgICAvLyBhIGNvbnRhY3QgdGhlIHByb3NwZWN0IGFscmVhZHkgYmVjYW1lIFx1MjAxNCBhbmQgYEZpZWxkLmxvb2t1cGAgdGFrZXMgZXhhY3RseVxuICAgIC8vIG9uZSB0YXJnZXQgKGBGaWVsZC5sb29rdXAoWydjcm1fbGVhZCcsJ2NybV9jb250YWN0J10pYCBpcyByZWplY3RlZCBhdFxuICAgIC8vIHNjaGVtYSBwYXJzZTogXCJyZWZlcmVuY2U6IGV4cGVjdGVkIHN0cmluZywgcmVjZWl2ZWQgYXJyYXlcIikuIFNvIHRoZSBsaW5rXG4gICAgLy8gaXMgdGhlIHNhbWUgVFlQRS1ESVNDUklNSU5BVE9SIHNoYXBlIGBjcm1fdGFzay5yZWxhdGVkX3RvXypgIGFscmVhZHkgdXNlczpcbiAgICAvLyBvbmUgc2VsZWN0IG5hbWluZyB0aGUgb2JqZWN0LCBvbmUgbG9va3VwIHBlciBvYmplY3QsIGFuZCB0aGUgcGFpcmluZ1xuICAgIC8vIGVuZm9yY2VkIGRlY2xhcmF0aXZlbHkuXG4gICAgLy9cbiAgICAvLyBUaGUgdm9jYWJ1bGFyeSBpcyBUV08gc2V0cywgZGVjbGFyZWQgYW5kIHNwbGl0IGluIGBfcGlja2xpc3RzLnRzYDogdGhlIHR3b1xuICAgIC8vIG9iamVjdCBuYW1lcyBhbiBhdXRob3IgbWF5IHBpY2ssIHBsdXMgYGVyYXNlZGAgXHUyMDE0IGEgdG9tYnN0b25lIHRoZSBmb3JtIGRvZXNcbiAgICAvLyBub3Qgb2ZmZXIgYW5kIG9ubHkgYGxlYWRfZHVwbGljYXRlX2NoZWNrYCBldmVyIHdyaXRlcy5cbiAgICAvL1xuICAgIC8vIFRoZSB0b21ic3RvbmUgaXMgd2hhdCBsZXRzIGFuIGVyYXN1cmUgQ09NUExFVEUgYWdhaW5zdCBhIGxlYWQgYSBodW1hblxuICAgIC8vIGNvbmZpcm1lZCBhcyBhIGR1cGxpY2F0ZSwgd2l0aG91dCByZWxheGluZyBvbmUgcnVsZSwgc28gcmVhZCBpdCBhcyBhXG4gICAgLy8gY29uc3RyYWludCByYXRoZXIgdGhhbiBhcyBhIHNwYXJlIHZhbHVlOiBgcmVxdWlyZWRXaGVuYCBiZWxvdyBwYWlycyBvbmx5XG4gICAgLy8gYGNybV9sZWFkYCAvIGBjcm1fY29udGFjdGAsIHNvIGEgdG9tYnN0b25lZCB0eXBlIG5ldmVyIGZpcmVzIGVpdGhlclxuICAgIC8vIHBhaXJpbmcgYW5kIG5ldmVyIGRlbWFuZHMgYSBwb2ludGVyIHRvIGEgcmVjb3JkIHRoYXQgaXMgZ29uZTsgYW5kXG4gICAgLy8gYGR1cGxpY2F0ZV9kaXNxdWFsaWZpY2F0aW9uX3JlcXVpcmVzX3N1cnZpdm9yYCBhc2tzIGZvciBhIE5PTi1CTEFOSyB0eXBlXG4gICAgLy8gcGx1cyBgZHVwbGljYXRlX3N0YXR1cyA9PSBcImNvbmZpcm1lZFwiYCwgYm90aCBvZiB3aGljaCBhIHRvbWJzdG9uZWQgbGVhZFxuICAgIC8vIHN0aWxsIHNhdGlzZmllcyBcdTIwMTQgc28gdGhlIHZlcmRpY3QgYSByZXZpZXdlciByZWNvcmRlZCBzdXJ2aXZlcyB0aGUgZXJhc3VyZVxuICAgIC8vIGluc3RlYWQgb2YgYmVpbmcgZGVsZXRlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIHNvbWVvbmUgZWxzZSdzIEdEUFIgcmVxdWVzdC5cbiAgICBkdXBsaWNhdGVfb2ZfdHlwZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnRHVwbGljYXRlIE9mJyxcbiAgICAgIGdyb3VwOiAnZHVwbGljYXRlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1doaWNoIG9iamVjdCBob2xkcyB0aGUgc3Vydml2aW5nIHJlY29yZCB0aGlzIGxlYWQgcmVwZWF0cy4nLFxuICAgICAgb3B0aW9uczogWy4uLkRVUExJQ0FURV9PRl9UWVBFX09QVElPTlNdLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoZSB0eXBlXHUyMTk0bG9va3VwIHBhaXJpbmcgaXMgYHJlcXVpcmVkV2hlbmAsIG5vdCBhIHNjcmlwdCB2YWxpZGF0aW9uOlxuICAgIC8vIFwidGhlIGxvb2t1cCBuYW1lZCBieSB0aGUgdHlwZSBtdXN0IGJlIHBvcHVsYXRlZFwiIGlzIGV4YWN0bHkgYSBjb25kaXRpb25hbFxuICAgIC8vIHdyaXRlIGNvbnRyYWN0LCB0aGUgZW5naW5lIGV2YWx1YXRlcyBpdCBvbiBpbnNlcnQgYW5kIHVwZGF0ZSwgYW5kIGl0XG4gICAgLy8gcmVwb3J0cyBhZ2FpbnN0IHRoZSBGSUVMRCwgc28gdGhlIGZvcm0gbWFya3MgdGhlIGVtcHR5IGxvb2t1cCBpbnN0ZWFkIG9mXG4gICAgLy8gc2hvd2luZyBhIHJlY29yZC1sZXZlbCBlcnJvci4gKGBjcm1fdGFza2Agc3RhdGVzIHRoZSBzYW1lIGludGVudCBhcyBhXG4gICAgLy8gd2FybmluZy1zZXZlcml0eSBzY3JpcHQgcnVsZSBiZWNhdXNlIGl0IHByZWRhdGVzIGByZXF1aXJlZFdoZW5gLFxuICAgIC8vIEFEUi0wMTEzLilcbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBgaGFzKC4uLilgIGlzIGxvYWQtYmVhcmluZywgbm90IGRlY29yYXRpb24uIEEgYmFyZVxuICAgIC8vIGByZWNvcmQuZHVwbGljYXRlX29mX3R5cGUgPT0gXCJjcm1fbGVhZFwiYCBhYm9ydHMgd2l0aCBgTm8gc3VjaCBrZXlgIG9uIGFueVxuICAgIC8vIHJlY29yZCB3aG9zZSBtZXJnZWQgc2hhcGUgb21pdHMgdGhlIGNvbHVtbiwgYW5kIHRoZSBlbmdpbmUncyByZXNwb25zZSB0byBhXG4gICAgLy8gcHJlZGljYXRlIHRoYXQgZmFpbHMgdG8gZXZhbHVhdGUgaXMgdG8gU0tJUCBpdCAoXCJyZXF1aXJlZFdoZW4gZm9yXG4gICAgLy8gJ2R1cGxpY2F0ZV9vZl9sZWFkJyBmYWlsZWQgdG8gZXZhbHVhdGUgXHUyMDE0IHNraXBwZWRcIikuIFRoZSBydWxlIHdvdWxkIHRoZW5cbiAgICAvLyByZWFkIGFzIGVuZm9yY2VkIGFuZCByZXF1aXJlIG5vdGhpbmcgYXQgYWxsLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIEJvdGggbG9va3VwcyB0YWtlIHRoZSBzcGVjIGRlZmF1bHQgYGRlbGV0ZUJlaGF2aW9yOiAnc2V0X251bGwnYCwgYW5kXG4gICAgLy8gdGhhdCBpcyBkZWxpYmVyYXRlOiBhIGxlYWQgaXMgYSBmaXJzdC1jbGFzcyByZWNvcmQgdGhhdCBoYXBwZW5zIHRvIGNhcnJ5IGFcbiAgICAvLyBmbGFnLCBzbyBgY2FzY2FkZWAgd291bGQgZGVzdHJveSB0aGUgbGVhZCBiZWNhdXNlIHRoZSByZWNvcmQgaXQgd2FzXG4gICAgLy8gY29tcGFyZWQgYWdhaW5zdCB3YXMgZGVsZXRlZC4gV2hhdCBrZWVwcyB0aGUgcGFpcmluZyBob25lc3QgdW5kZXIgYVxuICAgIC8vIGBzZXRfbnVsbGAgY2xlYXIgaXMgdGhlIHJldGlyZW1lbnQgYmxvY2sgaW4gYGxlYWRfZHVwbGljYXRlX2NoZWNrYFxuICAgIC8vIChgbGVhZC5ob29rLnRzYCwgam9iIDFjKTogd2hlbiBhIHdyaXRlIGxlYXZlcyB0aGUgbmFtZWQgbG9va3VwIGJsYW5rIGl0XG4gICAgLy8gZHJvcHMgYGR1cGxpY2F0ZV9vZl90eXBlYCBhbmQgYGR1cGxpY2F0ZV9zdGF0dXNgIGluIHRoZSBzYW1lIHdyaXRlLCBzbyB0aGVcbiAgICAvLyBwYWlyIGlzIG5ldmVyIGxlZnQgaGFsZi1zdGF0ZWQgYW5kIHRoaXMgcnVsZSBuZXZlciBoYXMgdG8gYmUgbG9vc2VuZWQgdG9cbiAgICAvLyB0b2xlcmF0ZSBvbmUuIFJlYWQgdGhhdCBub3RlIGJlZm9yZSBjaGFuZ2luZyBlaXRoZXIgcHJlZGljYXRlLlxuICAgIGR1cGxpY2F0ZV9vZl9sZWFkOiBGaWVsZC5sb29rdXAoJ2NybV9sZWFkJywge1xuICAgICAgbGFiZWw6ICdEdXBsaWNhdGUgT2YgTGVhZCcsXG4gICAgICBncm91cDogJ2R1cGxpY2F0ZXMnLFxuICAgICAgcmVxdWlyZWRXaGVuOiBQYGhhcyhyZWNvcmQuZHVwbGljYXRlX29mX3R5cGUpICYmIHJlY29yZC5kdXBsaWNhdGVfb2ZfdHlwZSA9PSBcImNybV9sZWFkXCJgLFxuICAgIH0pLFxuXG4gICAgZHVwbGljYXRlX29mX2NvbnRhY3Q6IEZpZWxkLmxvb2t1cCgnY3JtX2NvbnRhY3QnLCB7XG4gICAgICBsYWJlbDogJ0R1cGxpY2F0ZSBPZiBDb250YWN0JyxcbiAgICAgIGdyb3VwOiAnZHVwbGljYXRlcycsXG4gICAgICByZXF1aXJlZFdoZW46IFBgaGFzKHJlY29yZC5kdXBsaWNhdGVfb2ZfdHlwZSkgJiYgcmVjb3JkLmR1cGxpY2F0ZV9vZl90eXBlID09IFwiY3JtX2NvbnRhY3RcImAsXG4gICAgfSksXG5cbiAgICAvLyBNYWNoaW5lIHN1c3BpY2lvbiBhbmQgaHVtYW4gdmVyZGljdCBhcmUgT05FIGZpZWxkIHdpdGggdHdvIHZhbHVlcywgbm90IHR3b1xuICAgIC8vIHBhcmFsbGVsIHNldHMgb2YgbGluayBmaWVsZHM6IHRoZSBpbnRha2UgaG9vayB3cml0ZXMgYHN1c3BlY3RlZGAgYW5kIG9ubHlcbiAgICAvLyBldmVyIHdoZW4gdGhpcyBpcyBibGFuayAobGVhZC5ob29rLnRzKSwgc28gYSBodW1hbidzIGBjb25maXJtZWRgIHN1cnZpdmVzXG4gICAgLy8gZXZlcnkgbGF0ZXIgd3JpdGUsIGFuZCBib3RoIHN0YXRlcyBzdGF5IHF1ZXJ5YWJsZSBvZmYgb25lIGNvbHVtbi5cbiAgICBkdXBsaWNhdGVfc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdEdXBsaWNhdGUgU3RhdHVzJyxcbiAgICAgIGdyb3VwOiAnZHVwbGljYXRlcycsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1N1c3BlY3RlZCA9IGZsYWdnZWQgYXV0b21hdGljYWxseSBhdCBpbnRha2UuIENvbmZpcm1lZCA9IGEgaHVtYW4gdmVyaWZpZWQgdGhlIG1hdGNoLicsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdTdXNwZWN0ZWQnLCB2YWx1ZTogJ3N1c3BlY3RlZCcsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0NvbmZpcm1lZCcsIHZhbHVlOiAnY29uZmlybWVkJywgY29sb3I6ICcjRkYwMDAwJyB9LFxuICAgICAgXSxcbiAgICB9KSxcbiAgfSxcblxuICAvLyBMaWZlY3ljbGUgdHJhbnNpdGlvbnMgYXJlIGVuZm9yY2VkIHZpYSBhIGBzdGF0ZV9tYWNoaW5lYCB2YWxpZGF0aW9uIHJ1bGVcbiAgLy8gKHNlZSB2YWxpZGF0aW9uc1tdIGJlbG93KS4gXHUyNkEwXHVGRTBGIFRoZXJlIGlzIG5vIHRvcC1sZXZlbCBgc3RhdGVNYWNoaW5lc2Aga2V5IG9uXG4gIC8vIHRoZSBwbGF0Zm9ybSBcdTIwMTQgc3RhdHVzIHN0YXRlIG1hY2hpbmVzIGFyZSBleHByZXNzZWQgaW4gdGhlIHZhbGlkYXRpb24gdW5pb24uXG5cbiAgLy8gRGF0YWJhc2UgaW5kZXhlcyBmb3IgcGVyZm9ybWFuY2VcbiAgLy9cbiAgLy8gXHUyNkEwXHVGRTBGIGBlbWFpbGAgaXMgaW5kZXhlZCBidXQgTk9UIHVuaXF1ZSwgYW5kIHRoZSBpbmRleCBtdXN0IHN0YXkgZXhwbGljaXQ6IGl0XG4gIC8vIHVzZWQgdG8gZXhpc3Qgb25seSBhcyBhIHNpZGUgZWZmZWN0IG9mIGEgZmllbGQtbGV2ZWwgYHVuaXF1ZTogdHJ1ZWAsIHNvXG4gIC8vIGRyb3BwaW5nIHRoYXQgY29uc3RyYWludCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBkcm9wcGVkIHRoZSBpbmRleCB3aXRoIGl0IGFuZFxuICAvLyBsZWZ0IHRocmVlIHJlYWQgcGF0aHMgXHUyMDE0IHRoZSBgbGVhZF9kdXBsaWNhdGVfY2hlY2tgIGludGFrZSBsb29rdXAsIHRoZVxuICAvLyBgY3JtX2xlYWRfaW1wb3J0YCB1cHNlcnQga2V5IGFuZCB0aGUgY29udmVyc2lvbiBmbG93IFx1MjAxNCBzY2FubmluZyB0aGUgdGFibGVcbiAgLy8gb24gZXZlcnkgd3JpdGUuXG4gIC8vXG4gIC8vIFx1MjZENCBEbyBOT1QgYWRkIGB1bmlxdWU6IHRydWVgIGJhY2sgaGVyZTogYSBzaW5nbGUtY29sdW1uIHVuaXF1ZSBpbmRleCBtYWtlc1xuICAvLyB0aGUgcGxhdGZvcm0td2lkZSBjb25zdHJhaW50IHdpbiBvdmVyIHRoZSBwZXItdGVuYW50IGNvbXBvc2l0ZVxuICAvLyAoZnJhbWV3b3JrIzM5OTEpLCBzbyB0d28gb3JnYW5pemF0aW9ucyBjb3VsZCBub3Qgd29yayB0aGUgc2FtZSBhZGRyZXNzXG4gIC8vIGluZGVwZW5kZW50bHkuIFVuaXF1ZW5lc3MgaXMgbm90IHRoZSBydWxlIHRoaXMgb2JqZWN0IHdhbnRzIGF0IGFsbC5cbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ293bmVyX2lkJ10gfSxcbiAgICB7IGZpZWxkczogWydzdGF0dXMnXSB9LFxuICAgIHsgZmllbGRzOiBbJ2NvbXBhbnknXSB9LFxuICAgIHsgZmllbGRzOiBbJ2VtYWlsJ10gfSxcbiAgXSxcbiAgXG4gIC8vIEFQSSBzdXJmYWNlLiBIaXN0b3J5IFx1MjE5MiBGaWVsZC50cmFja0hpc3RvcnkgKEFEUi0wMDUyKS5cbiAgZW5hYmxlOiB7XG4gICAgYXBpRW5hYmxlZDogdHJ1ZSxcbiAgfSxcbiAgXG4gIC8vIEFEUi0wMDc5IHJlY29yZCB0aXRsZSBcdTIwMTQgdGhlIGBkaXNwbGF5X3RpdGxlYCBmb3JtdWxhIGZpZWxkIGRlZmluZWQgYWJvdmUuXG4gIG5hbWVGaWVsZDogJ2Rpc3BsYXlfdGl0bGUnLFxuICAvLyBFeHBsaWNpdCBzZWFyY2ggdGFyZ2V0cyAoQURSLTAwNjEpLiBSRVFVSVJFRCBiZWNhdXNlIG5hbWVGaWVsZCBpcyBhXG4gIC8vIEZPUk1VTEEgKGRpc3BsYXlfdGl0bGUvZnVsbF9uYW1lKTogd2l0aG91dCB0aGlzLCAkc2VhcmNoIGF1dG8tZGVmYXVsdHMgdG9cbiAgLy8gdGhlIGZvcm11bGEgZmllbGQsIHdoaWNoIGlzbid0IGEgcmVhbCBjb2x1bW4sIHNvIHRoZSBsb29rdXAgcGlja2VyICsgZ2xvYmFsXG4gIC8vIHNlYXJjaCBzaWxlbnRseSByZXR1cm4gemVyby4gVGhlc2UgYXJlIHJlYWwsIGluZGV4ZWQgY29sdW1ucy5cbiAgc2VhcmNoYWJsZUZpZWxkczogWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsICdjb21wYW55JywgJ2VtYWlsJ10sXG4gIGhpZ2hsaWdodEZpZWxkczogWydmdWxsX25hbWUnLCAnY29tcGFueScsICdlbWFpbCcsICdzdGF0dXMnLCAnb3duZXJfaWQnXSxcbiAgXG4gIC8vIFJlbW92ZWQ6IGxpc3Rfdmlld3MgYW5kIGZvcm1fdmlld3MgYmVsb25nIGluIFVJIGNvbmZpZ3VyYXRpb24sIG5vdCBvYmplY3QgZGVmaW5pdGlvblxuICBcbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnZW1haWxfcmVxdWlyZWQnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdFbWFpbCBpcyByZXF1aXJlZCcsXG4gICAgICBjb25kaXRpb246IFBgIWhhcyhyZWNvcmQuZW1haWwpIHx8IGlzQmxhbmsocmVjb3JkLmVtYWlsKWAsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBUaGUgZmllbGQgZGVzY3JpcHRpb24gcHJvbWlzZXMgXCJSZXF1aXJlZCB3aGVuIHN0YXR1cyBpcyBVbnF1YWxpZmllZFwiO1xuICAgICAgLy8gdGhpcyBpcyB3aGF0IGVuZm9yY2VzIGl0LiBBIGxlYWQgaW4gYHVucXVhbGlmaWVkYCB3aXRoIG5vIHJlY29yZGVkXG4gICAgICAvLyByZWFzb24gbG9zZXMgdGhlIG9uZSBkYXR1bSBhIGRpc3F1YWxpZmljYXRpb24gcmV2aWV3IG5lZWRzLiBTYW1lIHNoYXBlXG4gICAgICAvLyBhcyBgY3JtX2Nhc2UuZXNjYWxhdGlvbl9yZWFzb25fcmVxdWlyZWRgLlxuICAgICAgbmFtZTogJ2Rpc3F1YWxpZmljYXRpb25fcmVhc29uX3JlcXVpcmVkJyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRGlzcXVhbGlmaWNhdGlvbiByZWFzb24gaXMgcmVxdWlyZWQgd2hlbiBhIGxlYWQgaXMgVW5xdWFsaWZpZWQnLFxuICAgICAgY29uZGl0aW9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwidW5xdWFsaWZpZWRcIiAmJiAoIWhhcyhyZWNvcmQuZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24pIHx8IGlzQmxhbmsocmVjb3JkLmRpc3F1YWxpZmljYXRpb25fcmVhc29uKSlgLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gXCJEaXNxdWFsaWZpZWQgYXMgYSBkdXBsaWNhdGVcIiBoYXMgdG8gbmFtZSB0aGUgc3Vydml2b3IuXG4gICAgICAvL1xuICAgICAgLy8gU2FtZSBzaGFwZSBhcyBgZGlzcXVhbGlmaWNhdGlvbl9yZWFzb25fcmVxdWlyZWRgIGRpcmVjdGx5IGFib3ZlIFx1MjAxNCBhXG4gICAgICAvLyBkZWNsYXJhdGl2ZSBjb25kaXRpb24gZXZhbHVhdGVkIGJ5IHRoZSBlbmdpbmUgb24gaW5zZXJ0IGFuZCB1cGRhdGUsIHdpdGhcbiAgICAgIC8vIG5vIGhvb2sgaW52b2x2ZWQuIFRoZSB0d28gY2xhdXNlcyBhcmUgdGhlIHR3byB0aGluZ3MgdGhlIGZpZWxkLWxldmVsXG4gICAgICAvLyBgcmVxdWlyZWRXaGVuYCBvbiB0aGUgbG9va3VwcyBjYW5ub3Qgc2F5OlxuICAgICAgLy9cbiAgICAgIC8vICAgMS4gYGR1cGxpY2F0ZV9vZl90eXBlYCBtdXN0IGJlIGNob3Nlbiwgd2hpY2ggaXMgd2hhdCBtYWtlcyBleGFjdGx5IG9uZVxuICAgICAgLy8gICAgICBvZiB0aGUgdHdvIGByZXF1aXJlZFdoZW5gIHByZWRpY2F0ZXMgZmlyZSBhbmQgZGVtYW5kIGl0cyBsb29rdXAuXG4gICAgICAvLyAgIDIuIGBkdXBsaWNhdGVfc3RhdHVzYCBtdXN0IGJlIGBjb25maXJtZWRgIFNQRUNJRklDQUxMWS4gYHJlcXVpcmVkV2hlbmBcbiAgICAgIC8vICAgICAgYXNrcyB3aGV0aGVyIGEgZmllbGQgaXMgcG9wdWxhdGVkLCBub3Qgd2hhdCBpdCBob2xkcyBcdTIwMTQgYW5kIGEgbGVhZFxuICAgICAgLy8gICAgICBjbG9zZWQgb24gdGhlIG1hY2hpbmUncyBgc3VzcGVjdGVkYCBndWVzcyBpcyBwcmVjaXNlbHkgdGhlIG91dGNvbWVcbiAgICAgIC8vICAgICAgdGhpcyBydWxlIGV4aXN0cyB0byBwcmV2ZW50LiBBIGh1bWFuIGhhcyB0byBsb29rIGFuZCBhZ3JlZS5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgRXZlcnkgZmllbGQgcmVmZXJlbmNlIGlzIHdyYXBwZWQgaW4gYGhhcyguLi4pYCwgYW5kIHRoYXQgaXMgd2hhdCBtYWtlc1xuICAgICAgLy8gdGhpcyBhbiBlbmZvcmNlZCBydWxlIHJhdGhlciB0aGFuIGEgZGVjb3JhdGl2ZSBvbmUuIFRoZSBlbmdpbmUgZXZhbHVhdGVzXG4gICAgICAvLyBhIHZhbGlkYXRpb24gYWdhaW5zdCBgey4uLnByZXZpb3VzLCAuLi5kYXRhfWAgYW5kIGZpbGxzIGFic2VudCBmaWVsZHNcbiAgICAgIC8vIHdpdGggbnVsbCBvbiBJTlNFUlQgXHUyMDE0IGJ1dCBub3Qgb24gVVBEQVRFLCB3aGVyZSBgcHJldmlvdXNgIGlzIHdoYXRldmVyXG4gICAgICAvLyB0aGUgZHJpdmVyIHJldHVybmVkLCBhbmQgYSBkcml2ZXIgdGhhdCBzdG9yZXMgb25seSB0aGUgY29sdW1ucyBhIHJvdyB3YXNcbiAgICAgIC8vIHdyaXR0ZW4gd2l0aCBoYW5kcyBiYWNrIGEgcmVjb3JkIHdpdGggbm8gYGR1cGxpY2F0ZV9zdGF0dXNgIGtleSBhdCBhbGwuXG4gICAgICAvLyBTdHJpY3QgQ0VMIHRoZW4gYWJvcnRzIHRoZSB3aG9sZSBwcmVkaWNhdGUgd2l0aCBgTm8gc3VjaCBrZXlgLCBhbmQgYVxuICAgICAgLy8gcHJlZGljYXRlIHRoYXQgZmFpbHMgdG8gZXZhbHVhdGUgaXMgU0tJUFBFRCwgbm90IGZhaWxlZDpcbiAgICAgIC8vXG4gICAgICAvLyAgICAgV0FSTiBWYWxpZGF0aW9uIHJ1bGUgJ1x1MjAyNicgcHJlZGljYXRlIGZhaWxlZCB0byBldmFsdWF0ZSAoXHUyMDI2KSBcdTIwMTQgc2tpcHBlZFxuICAgICAgLy9cbiAgICAgIC8vIFRoZSB1bmd1YXJkZWQgZmlyc3QgZHJhZnQgb2YgdGhpcyBydWxlIGxldCBhIGxlYWQgYmUgY2xvc2VkIGFzIGFcbiAgICAgIC8vIGR1cGxpY2F0ZSB3aXRoIG5vIHN1cnZpdm9yIG5hbWVkLCBzaWxlbnRseSwgb24gdGhlIGluLW1lbW9yeSBkcml2ZXIgXHUyMDE0XG4gICAgICAvLyB0aGUgZHJpdmVyIHRoZSB3aG9sZSB0ZXN0IHN1aXRlIHJ1bnMgb24uXG4gICAgICBuYW1lOiAnZHVwbGljYXRlX2Rpc3F1YWxpZmljYXRpb25fcmVxdWlyZXNfc3Vydml2b3InLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6XG4gICAgICAgICdEaXNxdWFsaWZ5aW5nIGEgbGVhZCBhcyBEdXBsaWNhdGUgcmVxdWlyZXMgbmFtaW5nIHRoZSBzdXJ2aXZpbmcgcmVjb3JkIGFuZCBzZXR0aW5nIER1cGxpY2F0ZSBTdGF0dXMgdG8gQ29uZmlybWVkJyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmRpc3F1YWxpZmljYXRpb25fcmVhc29uKSAmJiByZWNvcmQuZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24gPT0gXCJkdXBsaWNhdGVcIiAmJiAhKGhhcyhyZWNvcmQuZHVwbGljYXRlX29mX3R5cGUpICYmICFpc0JsYW5rKHJlY29yZC5kdXBsaWNhdGVfb2ZfdHlwZSkgJiYgaGFzKHJlY29yZC5kdXBsaWNhdGVfc3RhdHVzKSAmJiByZWNvcmQuZHVwbGljYXRlX3N0YXR1cyA9PSBcImNvbmZpcm1lZFwiKWAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnbGVhZF9zdGF0dXNfcHJvZ3Jlc3Npb24nLFxuICAgICAgdHlwZTogJ3N0YXRlX21hY2hpbmUnLFxuICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGxlYWQgc3RhdHVzIHRyYW5zaXRpb24nLFxuICAgICAgZmllbGQ6ICdzdGF0dXMnLFxuICAgICAgLy8gQ29udmVyc2lvbiAoXHUyMTkyIGNvbnZlcnRlZCkgaXMgYWxsb3dlZCBmcm9tIGFueSB3b3JrZWQtb3BlbiBzdGF0dXMgc28gdGhlXG4gICAgICAvLyBDb252ZXJ0IGFjdGlvbidzIHdpZGVuZWQgdmlzaWJpbGl0eSAobmV3L2NvbnRhY3RlZC9xdWFsaWZpZWQpIG5ldmVyIHRyaXBzXG4gICAgICAvLyBhIHNwdXJpb3VzIFwiaW52YWxpZCB0cmFuc2l0aW9uXCIgd2FybmluZyB3aGVuIHRoZSBmbG93IHN0YW1wc1xuICAgICAgLy8gc3RhdHVzOidjb252ZXJ0ZWQnLlxuICAgICAgdHJhbnNpdGlvbnM6IHtcbiAgICAgICAgbmV3OiBbJ2NvbnRhY3RlZCcsICdxdWFsaWZpZWQnLCAndW5xdWFsaWZpZWQnLCAnY29udmVydGVkJ10sXG4gICAgICAgIGNvbnRhY3RlZDogWydxdWFsaWZpZWQnLCAndW5xdWFsaWZpZWQnLCAnY29udmVydGVkJ10sXG4gICAgICAgIHF1YWxpZmllZDogWydjb252ZXJ0ZWQnLCAndW5xdWFsaWZpZWQnXSxcbiAgICAgICAgdW5xdWFsaWZpZWQ6IFsnbmV3J10sXG4gICAgICAgIGNvbnZlcnRlZDogW10sXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG4gIFxuICAvLyBcdTI2QTBcdUZFMEYgTm8gYHdvcmtmbG93c1tdYCBoZXJlLCBhbmQgbm9uZSBpcyBwb3NzaWJsZTogb2JqZWN0IGB3b3JrZmxvd3NbXWAgd2VyZVxuICAvLyByZW1vdmVkIGZyb20gdGhlIHBsYXRmb3JtLiBGaWVsZCB1cGRhdGVzIGxpdmUgaW4gdGhpcyBvYmplY3QncyBgKi5ob29rLnRzYDtcbiAgLy8gc2NoZWR1bGVkIHN0YXR1cyBmbGlwcyBhbmQgbm90aWZpY2F0aW9ucyBsaXZlIGluIGBzcmMvKi9mbG93cy8qLmZsb3cudHNgLlxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL29wcG9ydHVuaXR5Lm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvb3Bwb3J0dW5pdHkub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBPYmplY3RTY2hlbWEsIEZpZWxkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBGLCBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgTEVBRF9TT1VSQ0VfT1BUSU9OUywgT1BQT1JUVU5JVFlfU1RBR0VfT1BUSU9OUyB9IGZyb20gJy4vX3BpY2tsaXN0cyc7XG5cbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eSA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgbGFiZWw6ICdPcHBvcnR1bml0eScsXG4gIHBsdXJhbExhYmVsOiAnT3Bwb3J0dW5pdGllcycsXG4gIGljb246ICdkb2xsYXItc2lnbicsXG4gIGRlc2NyaXB0aW9uOiAnU2FsZXMgb3Bwb3J0dW5pdGllcyBhbmQgZGVhbHMgaW4gdGhlIHBpcGVsaW5lJyxcblxuICAvLyBBRFItMDA5MCBEMS9ENzogT1dEIGlzIGFuIGF1dGhvcmVkIGRlY2lzaW9uLiBPd25lciArIGhpZ2gtdmFsdWUgbWFuYWdlbWVudCBzaGFyaW5nIHJ1bGUuXG4gIHNoYXJpbmdNb2RlbDogJ3ByaXZhdGUnLFxuICAvLyBcdTI2QTBcdUZFMEYgQURSLTAwNzkgYG5hbWVGaWVsZGAgaXMgYSBGSUVMRCwgbm90IGEgcmVuZGVyIHRlbXBsYXRlLCBhbmQgYSBGT1JNVUxBXG4gIC8vIHNlZXMgdGhlIHN0b3JlZCBzZWxlY3QgVkFMVUUgcmF0aGVyIHRoYW4gaXRzIHRyYW5zbGF0ZWQgbGFiZWwgXHUyMDE0IHNvIGFcbiAgLy8gYCd7bmFtZX0gLSB7c3RhZ2V9J2AgdGl0bGUgcmVuZGVycyBldmVyeSBkZWFsIFwiRW50ZXJwcmlzZSBEZWFsIC1cbiAgLy8gY2xvc2VkX3dvblwiIGluIGxvb2t1cHMsIHJlbGF0ZWQgbGlzdHMgYW5kIHNlYXJjaCwgaW4gZXZlcnkgbG9jYWxlLiBUaGVcbiAgLy8gZm9ybXVsYSBsYW5ndWFnZSBoYXMgbm8gb3B0aW9uLWxhYmVsIGxvb2t1cCwgc28gdGhlIHRpdGxlIGlzIHRoZSBwbGFpblxuICAvLyBgbmFtZWAgY29sdW1uOyBgc3RhZ2VgIHN0aWxsIGxlYWRzIHRoZSBoaWdobGlnaHQgc3RyaXAgYmVsb3csIHRyYW5zbGF0ZWQuXG4gIG5hbWVGaWVsZDogJ25hbWUnLFxuICAvLyBFeHBsaWNpdCBzZWFyY2ggdGFyZ2V0cyAoQURSLTAwNjEpLiBgbmFtZWAgaXMgYSByZWFsIGluZGV4ZWQgY29sdW1uLCBzb1xuICAvLyAkc2VhcmNoIHJlc29sdmVzIG9uIGl0cyBvd24gaGVyZTsgdGhlIGxpc3QgaXMga2VwdCBleHBsaWNpdCB0byBwaW4gdGhlXG4gIC8vIGludGVudCAob3RoZXIgb2JqZWN0cyB3aG9zZSBuYW1lRmllbGQgSVMgYSBmb3JtdWxhIHJlbHkgb24gaXQpLlxuICBzZWFyY2hhYmxlRmllbGRzOiBbJ25hbWUnXSxcbiAgaGlnaGxpZ2h0RmllbGRzOiBbJ25hbWUnLCAnY3JtX2FjY291bnQnLCAnYW1vdW50JywgJ3N0YWdlJywgJ293bmVyX2lkJ10sXG5cbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2Jhc2ljJywgICAgICAgbGFiZWw6ICdCYXNpYyBJbmZvcm1hdGlvbicsICAgaWNvbjogJ2RvbGxhci1zaWduJyB9LFxuICAgIHsga2V5OiAnZmluYW5jaWFscycsICBsYWJlbDogJ0ZpbmFuY2lhbHMnLCAgICAgICAgICBpY29uOiAndHJlbmRpbmctdXAnIH0sXG4gICAgeyBrZXk6ICdzYWxlc19wcm9jZXNzJywgbGFiZWw6ICdTYWxlcyBQcm9jZXNzJywgICAgIGljb246ICd0YXJnZXQnIH0sXG4gICAgeyBrZXk6ICdxdWFsaWZpY2F0aW9uJywgbGFiZWw6ICdRdWFsaWZpY2F0aW9uJywgICAgIGljb246ICdmaWx0ZXInIH0sXG4gICAgeyBrZXk6ICduYXJyYXRpdmUnLCAgIGxhYmVsOiAnRGVhbCBOYXJyYXRpdmUnLCAgICAgIGljb246ICdib29rLW9wZW4nIH0sXG4gICAgeyBrZXk6ICdjbGFzc2lmaWNhdGlvbicsIGxhYmVsOiAnQ2xhc3NpZmljYXRpb24nLCAgIGljb246ICd0YWcnIH0sXG4gICAgeyBrZXk6ICdjYW1wYWlnbicsIGxhYmVsOiAnQ2FtcGFpZ25zJywgaWNvbjogJ2ZsYWcnLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ25vdGVzJywgICAgICAgbGFiZWw6ICdOb3RlcyAmIE5leHQgU3RlcHMnLCAgaWNvbjogJ2ZpbGUtdGV4dCcgfSxcbiAgICB7IGtleTogJ2NybV9mb3JlY2FzdCcsICAgIGxhYmVsOiAnRm9yZWNhc3QgJiBNZXRyaWNzJywgIGljb246ICdiYXItY2hhcnQnLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgXSxcblxuICBmaWVsZHM6IHtcbiAgICAvLyBQbGF0Zm9ybSBvd25lcnNoaXAgYW5jaG9yIFx1MjAxNCBjYW5vbmljYWwgbm90ZSBpbiBgYWNjb3VudC5vYmplY3QudHNgICgjNTQ4KS5cbiAgICBvd25lcl9pZDogRmllbGQubG9va3VwKCdzeXNfdXNlcicsIHtcbiAgICAgIGxhYmVsOiAnT3Bwb3J0dW5pdHkgT3duZXInLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBzeXN0ZW06IHRydWUsXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBCYXNpYyBJbmZvcm1hdGlvblxuICAgIG5hbWU6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdPcHBvcnR1bml0eSBOYW1lJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICAvLyAoTm8gYGRpc3BsYXlfdGl0bGVgIGZvcm11bGEgXHUyMDE0IHNlZSBgbmFtZUZpZWxkYCBhYm92ZTogY29tcG9zaW5nIHRoZSB0aXRsZVxuICAgIC8vIGZyb20gYHN0YWdlYCBsZWFrZWQgdGhlIHJhdyBzZWxlY3QgdmFsdWUgaW50byBldmVyeSByZW5kZXJlZCB0aXRsZS4pXG5cbiAgICAvLyBSZWxhdGlvbnNoaXBzXG4gICAgY3JtX2FjY291bnQ6IEZpZWxkLmxvb2t1cCgnY3JtX2FjY291bnQnLCB7XG4gICAgICBsYWJlbDogJ0FjY291bnQnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuXG4gICAgcHJpbWFyeV9jb250YWN0OiBGaWVsZC5sb29rdXAoJ2NybV9jb250YWN0Jywge1xuICAgICAgbGFiZWw6ICdQcmltYXJ5IENvbnRhY3QnLFxuICAgICAgLy8gQG9iamVjdHN0YWNrIDEyOiBzdHJpbmdbXSBgcmVmZXJlbmNlRmlsdGVyc2AgaXMgZGVhZCAobm90IHJlYWQgYnkgdGhlXG4gICAgICAvLyBwaWNrZXIpOyBgZGVwZW5kc09uYCBpcyB0aGUgbGl2ZSBjYXNjYWRpbmcgZm9ybSBcdTIwMTQgc2NvcGVzIGNvbnRhY3RzIHRvIHRoZVxuICAgICAgLy8gb3Bwb3J0dW5pdHkncyBgY3JtX2FjY291bnRgIChBRFItMDA0OSkuXG4gICAgICBkZXBlbmRzT246IFsnY3JtX2FjY291bnQnXSxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuXG5cbiAgICAvLyBGaW5hbmNpYWwgSW5mb3JtYXRpb25cbiAgICBhbW91bnQ6IEZpZWxkLmN1cnJlbmN5KHtcbiAgICAgIGxhYmVsOiAnQW1vdW50JyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBtaW46IDAsXG4gICAgICBncm91cDogJ2ZpbmFuY2lhbHMnLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgZXhwZWN0ZWRfcmV2ZW51ZTogRmllbGQuY3VycmVuY3koe1xuICAgICAgbGFiZWw6ICdFeHBlY3RlZCBSZXZlbnVlJyxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLCAgLy8gQ2FsY3VsYXRlZCBmaWVsZFxuICAgICAgZ3JvdXA6ICdmaW5hbmNpYWxzJyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBRdWFsaWZpY2F0aW9uIChSRVEtMDAwNiBzdGVwIDgpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gVGhlIHN0YW5kYXJkIHRyaWFnZSB2b2NhYnVsYXJ5IG9mIGEgc2VsbGVyIHRoYXQgY2Fubm90IHB1cnN1ZSBldmVyeVxuICAgIC8vIGRlYWwuIGBmb3JlY2FzdF9jYXRlZ29yeWAgYW5zd2VycyBhIGRpZmZlcmVudCBxdWVzdGlvbiBcdTIwMTQgaXQgaXMgdGhlXG4gICAgLy8gZm9yZWNhc3Qgcm9sbC11cCBidWNrZXQsIGRlcml2ZWQgZnJvbSBgc3RhZ2VgIFx1MjAxNCBzbyBub25lIG9mIHRoaXMgaXNcbiAgICAvLyBmb2xkZWQgaW50byBpdC4gR0VORVJJQyB2YWx1ZXMgb25seTogYSBjdXN0b21lcidzIG93biBncmFkaW5nIHNjYWxlIGlzXG4gICAgLy8gb3ZlcmxheSBjb25maWd1cmF0aW9uIChSRVEtMDAwNiBhY2NlcHRhbmNlIDUpLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIGBwbnBtIHZhbGlkYXRlYCByZXBvcnRzIHRoZSBmaWVsZHMgaW4gdGhpcyBibG9jaywgaW4gdGhlIG5hcnJhdGl2ZVxuICAgIC8vIGJsb2NrIGJlbG93LCBhbmQgdGhlIGN1c3RvbWVyLXNpZGUgZGF0ZXMgYXMgXCJjYXJyaWVyLW9ubHkgXHUyMDE0IGRlY2xhcmVkXG4gICAgLy8gYnV0IG5vdGhpbmcgaW4gdGhpcyBzdGFjayByZWFkcyBvciBkaXNwbGF5cyBpdFwiLCBhbmQgdGhhdCByZWFkaW5nIGlzXG4gICAgLy8gRVhQRUNURUQgaGVyZSByYXRoZXIgdGhhbiBhIGRlZmVjdCB0byB0aWR5IGF3YXkuIFRoZSBsaXZlbmVzc1xuICAgIC8vIGRpYWdub3N0aWMgY291bnRzIHZpZXcgY29sdW1ucywgZm9ybSBzZWN0aW9ucywgcGFnZSBiaW5kaW5ncywgZmxvd1xuICAgIC8vIG5vZGVzLCBmb3JtdWxhcywgaG9va3MgYW5kIGFjdGlvbnMgYXMgc2l0ZXM7IGl0IGRvZXMgTk9UIGNvdW50XG4gICAgLy8gYGZpZWxkR3JvdXBzYCBtZW1iZXJzaGlwLCB3aGljaCBpcyBwcmVjaXNlbHkgdGhlIERFUklWRUQgbGF5b3V0XG4gICAgLy8gUkVRLTAwMDYgYWNjZXB0YW5jZSAxIGFza3MgZm9yLiBcdTI2RDQgRG8gTk9UIGFuc3dlciB0aGUgd2FybmluZyBieVxuICAgIC8vIGF1dGhvcmluZyBhIGByZWNvcmQ6ZGV0YWlsc2Agc2VjdGlvbiBcdTIwMTQgdGhhdCBpcyB0aGUgZXNjYXBlIGhhdGNoXG4gICAgLy8gQUdFTlRTLm1kIHJlc2VydmVzIGZvciBhIG5hbWVkIGN1c3RvbWVyIGRlbWFuZCwgYW5kIGl0IHdvdWxkIHRyYWRlXG4gICAgLy8gYWNjZXB0YW5jZSAxIGZvciBhIHF1aWV0ZXIgbG9nLiBgY3JtX2FjY291bnRgJ3MgYnVzaW5lc3MtcHJvZmlsZSBibG9ja1xuICAgIC8vIGNhcnJpZXMgdGhlIHNhbWUgdmVyZGljdCBvbiBgbWFpbmAgZm9yIHRoZSBzYW1lIHJlYXNvbiAoIzE5NDgpLlxuICAgIHdpbGxfYmlkOiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGxhYmVsOiAnV2lsbCBCaWQnLFxuICAgICAgZGVzY3JpcHRpb246ICdXaGV0aGVyIHdlIGludGVuZCB0byBiaWQuIFVuc2V0IG1lYW5zIHRoZSBkZWNpc2lvbiBpcyBvcGVuLicsXG4gICAgICBncm91cDogJ3F1YWxpZmljYXRpb24nLFxuICAgIH0pLFxuXG4gICAgY29udHJvbGxhYmlsaXR5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdDb250cm9sbGFiaWxpdHknLFxuICAgICAgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0hpZ2gnLCB2YWx1ZTogJ2hpZ2gnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdNZWRpdW0nLCB2YWx1ZTogJ21lZGl1bScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0xvdycsIHZhbHVlOiAnbG93JyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIHByaW9yaXR5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdQcmlvcml0eScsXG4gICAgICBncm91cDogJ3F1YWxpZmljYXRpb24nLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnSGlnaCcsIHZhbHVlOiAnaGlnaCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ01lZGl1bScsIHZhbHVlOiAnbWVkaXVtJyB9LFxuICAgICAgICB7IGxhYmVsOiAnTG93JywgdmFsdWU6ICdsb3cnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgZGVhbF9sZXZlbDogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnRGVhbCBMZXZlbCcsXG4gICAgICBncm91cDogJ3F1YWxpZmljYXRpb24nLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnU3RyYXRlZ2ljJywgdmFsdWU6ICdzdHJhdGVnaWMnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdLZXknLCB2YWx1ZTogJ2tleScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N0YW5kYXJkJywgdmFsdWU6ICdzdGFuZGFyZCcgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICAvLyBUaGUgRkFDVCBvZiBzdWJjb250cmFjdGluZyBpcyBnZW5lcmljIGFuZCBiZWxvbmdzIGluIGNvcmU7IHRoZVxuICAgIC8vIGN1c3RvbWVyJ3Mgc3VwcGxpZXIgbGlzdCBpcyBub3QgYW5kIGlzIG5vdCBwcm9wb3NlZCBoZXJlLlxuICAgIGlzX3N1YmNvbnRyYWN0ZWQ6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdJbnZvbHZlcyBTdWJjb250cmFjdGluZycsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICB9KSxcblxuICAgIHN1YmNvbnRyYWN0aW5nX25vdGU6IEZpZWxkLnRleHRhcmVhKHtcbiAgICAgIGxhYmVsOiAnU3ViY29udHJhY3RpbmcgTm90ZScsXG4gICAgICBncm91cDogJ3F1YWxpZmljYXRpb24nLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFRoZSBcdTdBQ0JcdTk4NzkgKHF1YWxpZmljYXRpb24pIGdhdGU6IHRoZSByZXAncyByZXF1ZXN0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gUkVRLTAwMDYgc3RlcCAxMTogXHUzMDBDXHU5NTAwXHU1NTJFXHU3QUNCXHU5ODc5XHU5NzAwXHU4RDcwXHU1QkExXHU2Mjc5XHU2RDQxXHU3QTBCXHVGRjFCXHU2NUIwXHU1ODlFXHU1NTQ2XHU2NzNBXHU1M0VGXHU4RERGXHU4RkRCXHVGRjBDXHU3QUNCXHU5ODc5XHU5MDFBXHU4RkM3XHU1NDBFXHU2NUI5XHU1M0VGXHU2NkY0XHU2NUIwXHU5NjM2XHU2QkI1XHUzMDAxXG4gICAgLy8gXHU2Mjk1XHU2ODA3XHUzMDAxXHU4RDYyXHU0RTIyXHU1MzU1XHU2NENEXHU0RjVDXHUzMDAyXHUzMDBEIFRoZSByZXAgQVNLUyBmb3IgXHU3QUNCXHU5ODc5IGJ5IHRpY2tpbmcgdGhpcyBib3gsIGFuZFxuICAgIC8vIGBvcHBvcnR1bml0eV9xdWFsaWZpY2F0aW9uX2FwcHJvdmFsYCBvcGVucyBvbmUgYXBwcm92YWwgd2hlbiBpdCB0dXJucyBvblxuICAgIC8vICh0aGUgVFJBTlNJVElPTiwgbm90IHRoZSBjdXJyZW50IHZhbHVlKS4gQSByZWplY3Rpb24gY2xlYXJzIGl0LCBzb1xuICAgIC8vIHRpY2tpbmcgaXQgYWdhaW4gaXMgYSBmcmVzaCByZXF1ZXN0IFx1MjAxNCB0aGUgcm9sZSBgcmVxdWVzdGVkX3N0YXR1c2AgcGxheXNcbiAgICAvLyBmb3IgdGhlIHN0YXR1cy1jaGFuZ2UgZ2F0ZSwgYXMgYSBib29sZWFuIGJlY2F1c2UgXHU3QUNCXHU5ODc5IGFza3MgZm9yIG9uZSB0aGluZy5cbiAgICAvL1xuICAgIC8vIGBkZWZhdWx0VmFsdWU6IGZhbHNlYCBpcyBsb2FkLWJlYXJpbmcgZm9yIHRoZSBzdGFydCBjb25kaXRpb246IGV2ZXJ5IGRlYWxcbiAgICAvLyBib3JuIGFmdGVyIHRoaXMgY29sdW1uIHRoZW4gU1RPUkVTIHRoZSBrZXksIHNvIGBoYXMocHJldmlvdXMuXHUyMDI2KWAgaG9sZHNcbiAgICAvLyBvbiBldmVyeSBkcml2ZXIgYW5kIHRoZSBvZmZcdTIxOTJvbiB0cmFuc2l0aW9uIGlzIHZpc2libGUuIE5vdCByZWFkb25seTogdGhpc1xuICAgIC8vIGlzIHRoZSBvbmUgaGFsZiBvZiB0aGUgZ2F0ZSBhIHBlcnNvbiB3cml0ZXMuIEluZXJ0IHdoaWxlIHRoZSBnYXRlIGlzXG4gICAgLy8gb2ZmIFx1MjAxNCBub3RoaW5nIHJlYWRzIGl0IHVubGVzcyBhbiBpbnN0YWxsIGFybXMgdGhlIHZlcmRpY3QgYmVsb3cuXG4gICAgcXVhbGlmaWNhdGlvbl9yZXF1ZXN0ZWQ6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdSZXF1ZXN0IFF1YWxpZmljYXRpb24gQXBwcm92YWwnLFxuICAgICAgZGVzY3JpcHRpb246ICdUaWNrIHRvIHNlbmQgdGhpcyBkZWFsIGZvciBxdWFsaWZpY2F0aW9uIGFwcHJvdmFsLiBBIHJlamVjdGlvbiBjbGVhcnMgaXQ7IHRpY2sgaXQgYWdhaW4gdG8gYXNrIGFnYWluLicsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBUaGUgXHU3QUNCXHU5ODc5IGdhdGUncyBzd2l0Y2ggQU5EIGl0cyB2ZXJkaWN0IGNvbHVtbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBUaGlzIGBkZWZhdWx0VmFsdWVgIElTIHRoZSBzd2l0Y2gsIGV4YWN0bHkgYXMgb25cbiAgICAvLyBgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXNgIGJlbG93LCBhbmQgc2hpcHBlZCBpdCBpcyBgbm90X3JlcXVpcmVkYDpcbiAgICAvLyB0aGUgZ2F0ZSBpcyBPRkYgYnkgZGVmYXVsdCAoUkVRLTAwMDYgKkRpc3Bvc2l0aW9uKjogXCJCb3RoIGdhdGVzIG11c3QgYmVcbiAgICAvLyBjb25maWd1cmFibGUgXHUyMDE0IG9mZiBieSBkZWZhdWx0XCIpLiBObyBkZWFsIGlzIGJvcm4gYHBlbmRpbmdgLCB0aGUgZmxvdydzXG4gICAgLy8gc3RhcnQgY29uZGl0aW9uIGFuZCB0aGUgYG9wcG9ydHVuaXR5X2xpZmVjeWNsZWAgcmVmdXNhbCBhcmUgZmFsc2UgZm9yXG4gICAgLy8gZXZlcnkgcmVjb3JkIHRoYXQgaGFzIGV2ZXIgZXhpc3RlZCwgYW5kIGEgc3RhZ2UgbW92ZSwgV2lsbCBCaWQgYW5kIGFcbiAgICAvLyBkaXJlY3QgY2xvc2Ugd29yayBleGFjdGx5IGFzIHRoZXkgZG8gd2l0aG91dCBpdC4gQW4gaW5zdGFsbCBBUk1TIHRoZSBnYXRlXG4gICAgLy8gYnkgY2hhbmdpbmcgdGhpcyBvbmUgdmFsdWUgdG8gYCdwZW5kaW5nJ2A7IGRlYWxzIHRoYXQgYWxyZWFkeSBleGlzdCBrZWVwXG4gICAgLy8gYG5vdF9yZXF1aXJlZGAsIHNvIGFybWluZyBpdCBpbnZhbGlkYXRlcyBubyByZWNvcmQuIFx1MjZENCBOb3QgdGhlIGZsb3cnc1xuICAgIC8vIGBzdGF0dXNgIFx1MjAxNCBgbGVhZC1jb252ZXJzaW9uLWFwcHJvdmFsLmZsb3cudHNgIHJlY29yZHMgd2h5LlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIEl0cyBPV04gY29sdW1uIFx1MjAxNCBcdTI2RDQgbmV2ZXIgYGFwcHJvdmFsX3N0YXR1c2AgKHRoZSBhbW91bnQtdGllcmVkXG4gICAgLy8gZmxvdydzOyBpdHMgZW50cnkga2V5cyBvbiBgbm90X3JlcXVpcmVkYCwgc28gc2hhcmluZyB3b3VsZCByZS1hcm0gaXQpIGFuZFxuICAgIC8vIFx1MjZENCBuZXZlciBgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXNgIChvbmUgZ2F0ZSdzIHZlcmRpY3Qgd291bGQgZXJhc2VcbiAgICAvLyB0aGUgb3RoZXIncywgYW5kIHRoZSBzdGVwLTE0IGhvb2sgcmVhZHMgdGhhdCBjb2x1bW4gaW5wdXQtZmlyc3QpLlxuICAgIC8vXG4gICAgLy8gYHJlYWRvbmx5OiB0cnVlYCBvbiB0aGUgIzE2NjYgZ3JvdW5kczogdGhlIG9ubHkgd3JpdGVycyBhcmUgdGhlIGdhdGUnc1xuICAgIC8vIG93biBgcnVuQXM6ICdzeXN0ZW0nYCBmbG93IGFuZCB0aGUgaW5zZXJ0IGRlZmF1bHQsIGFuZCBib3RoIHN1cnZpdmUgdGhlXG4gICAgLy8gcmVhZG9ubHkgc3RyaXAuIEEgdXNlci1zdXBwbGllZCB2ZXJkaWN0IGlzIHN0cmlwcGVkIEJFRk9SRSB0aGVcbiAgICAvLyBgYmVmb3JlVXBkYXRlYCBob29rcyBydW4gXHUyMDE0IG1lYXN1cmVkIG9uIDE3LjYuMCB3aXRoIGEgcmVhbCBPYmplY3RRTDogYVxuICAgIC8vIHVzZXIgdXBkYXRlIG9mIGB7IHN0YWdlLCBxdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1czogJ2FwcHJvdmVkJyB9YFxuICAgIC8vIHJlYWNoZWQgdGhlIGhvb2tzIGFzIGB7IGlkLCBzdGFnZSB9YCBhbmQgd2FzIHJlZnVzZWQgNDA5IFx1MjAxNCBzbyB0aGVcbiAgICAvLyBpbnB1dC1maXJzdCByZWFkIGluIGBvcHBvcnR1bml0eV9saWZlY3ljbGVgIGNhbm5vdCBiZSBmZWQgYW4gYGFwcHJvdmVkYFxuICAgIC8vIGJ5IGhhbmQuXG4gICAgcXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXM6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ1F1YWxpZmljYXRpb24gQXBwcm92YWwnLFxuICAgICAgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgZGVmYXVsdFZhbHVlOiAnbm90X3JlcXVpcmVkJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ05vdCBSZXF1aXJlZCcsIHZhbHVlOiAnbm90X3JlcXVpcmVkJywgZGVmYXVsdDogdHJ1ZSB9LFxuICAgICAgICB7IGxhYmVsOiAnUGVuZGluZycsIHZhbHVlOiAncGVuZGluZycsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0FwcHJvdmVkJywgdmFsdWU6ICdhcHByb3ZlZCcsIGNvbG9yOiAnIzAwQUEwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1JlamVjdGVkJywgdmFsdWU6ICdyZWplY3RlZCcsIGNvbG9yOiAnI0ZGMDAwMCcgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICAvLyBTYWxlcyBQcm9jZXNzXG4gICAgc3RhZ2U6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ1N0YWdlJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBncm91cDogJ3NhbGVzX3Byb2Nlc3MnLFxuICAgICAgLy8gQURSLTAwNTIgXHUwMEE3NWIuMSBcdTIwMTQgdGhlIHBsYXRmb3JtIGF1dG8tcmVuZGVycyBlYWNoIHN0YWdlIGNoYW5nZSBvbiB0aGVcbiAgICAgIC8vIGFjdGl2aXR5IHRpbWVsaW5lIGFzIFwiU3RhZ2U6IFByb3Bvc2FsIFx1MjE5MiBOZWdvdGlhdGlvblwiIChubyBob29rIGNvZGUpLlxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgICAgLy8gQ2Fub25pY2FsIHNldCAoIzQ5MCkgXHUyMDE0IHRoZSBtYXNzX3VwZGF0ZV9zdGFnZSBhY3Rpb24gcmVuZGVycyB0aGUgc2FtZVxuICAgICAgLy8gbGlzdDsgc2VlIF9waWNrbGlzdHMudHMuXG4gICAgICBvcHRpb25zOiBbLi4uT1BQT1JUVU5JVFlfU1RBR0VfT1BUSU9OU10sXG4gICAgfSksXG5cbiAgICBwcm9iYWJpbGl0eTogRmllbGQucGVyY2VudCh7XG4gICAgICBsYWJlbDogJ1Byb2JhYmlsaXR5ICglKScsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEwMCxcbiAgICAgIGRlZmF1bHRWYWx1ZTogMTAsXG4gICAgICBncm91cDogJ3NhbGVzX3Byb2Nlc3MnLFxuICAgIH0pLFxuXG4gICAgLy8gSW1wb3J0YW50IERhdGVzXG4gICAgY2xvc2VfZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBsYWJlbDogJ0Nsb3NlIERhdGUnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGdyb3VwOiAnc2FsZXNfcHJvY2VzcycsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBOTyBgY3JlYXRlZF9kYXRlYCBoZXJlOiB0aGUgcGxhdGZvcm0gYWxyZWFkeSBpbmplY3RzIGBjcmVhdGVkX2F0YCBvblxuICAgIC8vIGV2ZXJ5IG9iamVjdCwgYW5kIHRoaXMgZHVwbGljYXRlIGhhZCBubyB3cml0ZXIgYXQgYWxsIFx1MjAxNCBub3QgdGhlIHNlZWRcbiAgICAvLyBkYXRhLCBub3QgYSBob29rLCBub3QgYSBmbG93IFx1MjAxNCBzbyBpdCB3YXMgcGVybWFuZW50bHkgbnVsbCB3aGlsZVxuICAgIC8vIGBjcmVhdGVkX2F0YCBjYXJyaWVkIHRoZSByZWFsIHZhbHVlICgjNTc1IEIyKS4gU3VyZmFjZXMgdGhhdCBuZWVkIHRoZVxuICAgIC8vIGNyZWF0aW9uIGluc3RhbnQgcmVhZCBgY3JlYXRlZF9hdGAgKHNlZSB0aGUgZGVhbF90aW1lbGluZSB2aWV3KS5cbiAgICAvL1xuICAgIC8vIFN0YWdlLWFnZSBjbG9jayAoIzQ4OSkuIFRoaXMgaXMgdGhlIFNUT1JFRCBoYWxmIG9mIHRoZSBwYWlyOiBhIHJlYWwsXG4gICAgLy8gaW5kZXhlZCBkYXRlIGNvbHVtbiwgc28gaXQgaXMgd2hhdCBhdXRvbWF0aW9uIGFuZCB2aWV3cyBtYXkgZmlsdGVyIGFuZFxuICAgIC8vIHNvcnQgb24uIGBkYXlzX2luX3N0YWdlYCBiZWxvdyBpcyBhIGZvcm11bGEgZGVyaXZlZCBmcm9tIGl0LlxuICAgIC8vIGBvcHBvcnR1bml0eV9saWZlY3ljbGVgIHN0YW1wcyBpdCBvbiBpbnNlcnQgYW5kIHJlLXN0YW1wcyBpdCBvbiBldmVyeVxuICAgIC8vIHN0YWdlIGNoYW5nZTsgcmVhZG9ubHkgYmVjYXVzZSBub3RoaW5nIGJ1dCB0aGF0IGhvb2sgc2hvdWxkIG1vdmUgaXRcbiAgICAvLyAoYmVmb3JlLWhvb2sgd3JpdGVzIHN1cnZpdmUgcmVhZG9ubHkgc3RyaXBwaW5nIFx1MjAxNCBvbmx5IGNhbGxlci1zdXBwbGllZFxuICAgIC8vIGtleXMgYXJlIGRyb3BwZWQpLlxuICAgIHN0YWdlX2VudHJ5X2RhdGU6IEZpZWxkLmRhdGUoe1xuICAgICAgbGFiZWw6ICdTdGFnZSBFbnRyeSBEYXRlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGF0ZSB0aGlzIG9wcG9ydHVuaXR5IGVudGVyZWQgaXRzIGN1cnJlbnQgc3RhZ2UuJyxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgICAgZ3JvdXA6ICdzYWxlc19wcm9jZXNzJyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBUaGUgY3VzdG9tZXIncyBvd24gcHJvY3VyZW1lbnQgY2FsZW5kYXIgKFJFUS0wMDA2IHN0ZXAgOCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgTmV2ZXIgZm9sZGVkIGludG8gYGNsb3NlX2RhdGVgOiB0aGF0IGlzIGEgc2luZ2xlIGRhdGUgYW5kIGl0IGlzIE9VUlxuICAgIC8vIGV4cGVjdGVkIGNsb3NlLiBUaGVzZSBhcmUgdGhyZWUgZGlzdGluY3QgQlVZRVItc2lkZSBldmVudHMsIGFuZFxuICAgIC8vIFJFUS0wMDA2IGFjY2VwdGFuY2UgMiByZXF1aXJlcyB0aGVtIHRvIGJlIHJlcG9ydGFibGUgaW5kZXBlbmRlbnRseSBvZlxuICAgIC8vIHRoZSBmb3JlY2FzdCBjbG9zZSBkYXRlIFx1MjAxNCBzZWUgdGhlIGB0ZW5kZXJfdGhpc19xdWFydGVyYCBsaXN0IHZpZXcsXG4gICAgLy8gd2hpY2ggcHJlZGljYXRlcyBvbiBgZXhwZWN0ZWRfdGVuZGVyX2RhdGVgIGFsb25lLlxuICAgIGN1c3RvbWVyX2luaXRpYXRpb25fZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBsYWJlbDogJ0N1c3RvbWVyIEluaXRpYXRpb24gRGF0ZScsXG4gICAgICBncm91cDogJ3NhbGVzX3Byb2Nlc3MnLFxuICAgIH0pLFxuXG4gICAgZXhwZWN0ZWRfdGVuZGVyX2RhdGU6IEZpZWxkLmRhdGUoe1xuICAgICAgbGFiZWw6ICdFeHBlY3RlZCBUZW5kZXIgRGF0ZScsXG4gICAgICBncm91cDogJ3NhbGVzX3Byb2Nlc3MnLFxuICAgIH0pLFxuXG4gICAgZXhwZWN0ZWRfc2lnbmluZ19kYXRlOiBGaWVsZC5kYXRlKHtcbiAgICAgIGxhYmVsOiAnRXhwZWN0ZWQgU2lnbmluZyBEYXRlJyxcbiAgICAgIGdyb3VwOiAnc2FsZXNfcHJvY2VzcycsXG4gICAgfSksXG5cbiAgICBleHBlY3RlZF90ZW5kZXJfYW1vdW50OiBGaWVsZC5jdXJyZW5jeSh7XG4gICAgICBsYWJlbDogJ0V4cGVjdGVkIFRlbmRlciBBbW91bnQnLFxuICAgICAgbWluOiAwLFxuICAgICAgZ3JvdXA6ICdzYWxlc19wcm9jZXNzJyxcbiAgICB9KSxcblxuICAgIGV4cGVjdGVkX3NpZ25pbmdfYW1vdW50OiBGaWVsZC5jdXJyZW5jeSh7XG4gICAgICBsYWJlbDogJ0V4cGVjdGVkIFNpZ25pbmcgQW1vdW50JyxcbiAgICAgIG1pbjogMCxcbiAgICAgIGdyb3VwOiAnc2FsZXNfcHJvY2VzcycsXG4gICAgfSksXG5cbiAgICAvLyBBZGRpdGlvbmFsIENsYXNzaWZpY2F0aW9uXG4gICAgdHlwZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnT3Bwb3J0dW5pdHkgVHlwZScsXG4gICAgICBncm91cDogJ2NsYXNzaWZpY2F0aW9uJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ05ldyBCdXNpbmVzcycsIHZhbHVlOiAnbmV3X2J1c2luZXNzJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRXhpc3RpbmcgQ3VzdG9tZXIgLSBVcGdyYWRlJywgdmFsdWU6ICdleGlzdGluZ191cGdyYWRlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRXhpc3RpbmcgQ3VzdG9tZXIgLSBSZW5ld2FsJywgdmFsdWU6ICdleGlzdGluZ19yZW5ld2FsJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRXhpc3RpbmcgQ3VzdG9tZXIgLSBFeHBhbnNpb24nLCB2YWx1ZTogJ2V4aXN0aW5nX2V4cGFuc2lvbicgfSxcbiAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFx1MjZENCBCRVNJREUgYHR5cGVgLCBuZXZlciByZXBsYWNpbmcgb3Igb3ZlcmxvYWRpbmcgaXQ6IGB0eXBlYCdzIGZvdXJcbiAgICAvLyB2YWx1ZXMgYXJlIGEgUkVMQVRJT05TSElQIHRheG9ub215IHRoYXQgYG9wcG9ydHVuaXR5Lmhvb2sudHNgIGFuZFxuICAgIC8vIHJlcG9ydGluZyByZWFkLiBHZW5lcmljIGRlbGl2ZXJ5LW1vZGVsIHZhbHVlcyBvbmx5IFx1MjAxNCB0aGUgY3VzdG9tZXIncyBvd25cbiAgICAvLyBsaW5lLW9mLWJ1c2luZXNzIGxpc3QgaXMgb3ZlcmxheSAoUkVRLTAwMDYgYWNjZXB0YW5jZSA1KS5cbiAgICBidXNpbmVzc19saW5lOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdCdXNpbmVzcyBMaW5lJyxcbiAgICAgIGdyb3VwOiAnY2xhc3NpZmljYXRpb24nLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnUHJvZHVjdCcsIHZhbHVlOiAncHJvZHVjdCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1Byb2Zlc3Npb25hbCBTZXJ2aWNlcycsIHZhbHVlOiAnc2VydmljZXMnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDb25zdWx0aW5nJywgdmFsdWU6ICdjb25zdWx0aW5nJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU3VwcG9ydCAmIE1haW50ZW5hbmNlJywgdmFsdWU6ICdzdXBwb3J0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnT3RoZXInLCB2YWx1ZTogJ290aGVyJyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIGxlYWRfc291cmNlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdMZWFkIFNvdXJjZScsXG4gICAgICBncm91cDogJ2NsYXNzaWZpY2F0aW9uJyxcbiAgICAgIC8vIENhbm9uaWNhbCBzZXQgc2hhcmVkIHdpdGggTGVhZCArIENvbnRhY3QgKCM0OTApOiBsZWFkX2NvbnZlcnNpb25cbiAgICAgIC8vIGNvcGllcyBgbGVhZFJlY29yZC5sZWFkX3NvdXJjZWAgb250byB0aGUgb3Bwb3J0dW5pdHkgaXQgY3JlYXRlcywgc29cbiAgICAgIC8vIHRoaXMgbXVzdCBhY2NlcHQgZXZlcnkgTGVhZCB2YWx1ZS5cbiAgICAgIG9wdGlvbnM6IFsuLi5MRUFEX1NPVVJDRV9PUFRJT05TXSxcbiAgICB9KSxcblxuXG4gICAgLy8gQ2FtcGFpZ24gdHJhY2tpbmdcbiAgICBjcm1fY2FtcGFpZ246IEZpZWxkLmxvb2t1cCgnY3JtX2NhbXBhaWduJywge1xuICAgICAgbGFiZWw6ICdDYW1wYWlnbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ01hcmtldGluZyBjYW1wYWlnbiB0aGF0IGdlbmVyYXRlZCB0aGlzIG9wcG9ydHVuaXR5JyxcbiAgICAgIGdyb3VwOiAnY2FtcGFpZ24nLFxuICAgIH0pLFxuXG4gICAgLy8gU2FsZXMgY3ljbGUgbWV0cmljc1xuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIEZPUk1VTEEsIG5vdCBhIHN0b3JlZCBjb3VudGVyLiBBcyBhIHBsYWluIG51bWJlciBjb2x1bW4gbm90aGluZyBldmVyXG4gICAgLy8gcmFpc2VzIGl0OiB0aGUgaG9vayByZXNldHMgaXQgdG8gMCBvbiBhIHN0YWdlIGNoYW5nZSBhbmQgbm8gc3dlZXBcbiAgICAvLyBpbmNyZW1lbnRzIGl0LCBzbyBgZGF5c19pbl9zdGFnZSA+IDE0YCBtYXRjaGVzIG9ubHkgcm93cyBhIHNlZWQgaGFyZGNvZGVkXG4gICAgLy8gYW5kIHRoZSBgb3Bwb3J0dW5pdHlfc3RhZ25hdGlvbmAgZmxvdyBuZXZlciBmaXJlcyBvbiByZWFsIGRhdGEuIERlcml2aW5nXG4gICAgLy8gaXQgZnJvbSBgc3RhZ2VfZW50cnlfZGF0ZWAgaXMgY29ycmVjdCBvbiBldmVyeSByZWFkIGFuZCBjb3N0cyBubyBuaWdodGx5XG4gICAgLy8gZnVsbC10YWJsZSBwYXNzLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoZSB0cmFkZS1vZmY6IGZvcm11bGFzIGFyZSBldmFsdWF0ZWQgQUZURVIgdGhlIHF1ZXJ5ICh0aGUgZW5naW5lJ3NcbiAgICAvLyBgYXBwbHlGb3JtdWxhUGxhbmAgd2Fsa3MgdGhlIHJldHVybmVkIHJvd3MpLCBzbyB0aGlzIGlzIG5vdCBhIHJlYWwgY29sdW1uXG4gICAgLy8gYW5kIENBTk5PVCBhcHBlYXIgaW4gYSBmaWx0ZXIgb3IgYSBzb3J0LiBBbnl0aGluZyB0aGF0IG5lZWRzIHRvICpzZWxlY3QqXG4gICAgLy8gc3RhbGxlZCBkZWFscyBwcmVkaWNhdGVzIG9uIGBzdGFnZV9lbnRyeV9kYXRlYCBpbnN0ZWFkIFx1MjAxNCBzZWVcbiAgICAvLyBgb3Bwb3J0dW5pdHktc3RhZ25hdGlvbi5mbG93LnRzYCBhbmQgdGhlIGBzdGFsZV9vcHBvcnR1bml0aWVzYCB2aWV3LlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIGBoYXMoKWAgKyBudWxsIGd1YXJkOiBgZGF5c0JldHdlZW4obnVsbCwgXHUyMDI2KWAgZmF1bHRzIGFuZCB0aGUgd2hvbGUgZmllbGRcbiAgICAvLyBzaWxlbnRseSBldmFsdWF0ZXMgdG8gbnVsbCwgc28gYW4gdW5zdGFtcGVkIHJvdyBpcyBzcGVsbGVkIG91dCBhcyBudWxsXG4gICAgLy8gcmF0aGVyIHRoYW4gYXJyaXZpbmcgdGhlcmUgYnkgYWNjaWRlbnQuXG4gICAgZGF5c19pbl9zdGFnZTogRmllbGQuZm9ybXVsYSh7XG4gICAgICBsYWJlbDogJ0RheXMgaW4gQ3VycmVudCBTdGFnZScsXG4gICAgICBleHByZXNzaW9uOiBGYGhhcyhyZWNvcmQuc3RhZ2VfZW50cnlfZGF0ZSkgJiYgcmVjb3JkLnN0YWdlX2VudHJ5X2RhdGUgIT0gbnVsbCA/IGRheXNCZXR3ZWVuKHJlY29yZC5zdGFnZV9lbnRyeV9kYXRlLCB0b2RheSgpKSA6IG51bGxgLFxuICAgICAgcmV0dXJuVHlwZTogJ251bWJlcicsXG4gICAgICBncm91cDogJ2NybV9mb3JlY2FzdCcsXG4gICAgfSksXG5cbiAgICAvLyBBZGRpdGlvbmFsIGluZm9ybWF0aW9uXG4gICAgZGVzY3JpcHRpb246IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGxhYmVsOiAnRGVzY3JpcHRpb24nLFxuICAgICAgZ3JvdXA6ICdub3RlcycsXG4gICAgfSksXG5cbiAgICBuZXh0X3N0ZXA6IEZpZWxkLnRleHRhcmVhKHtcbiAgICAgIGxhYmVsOiAnTmV4dCBTdGVwcycsXG4gICAgICBncm91cDogJ25vdGVzJyxcbiAgICB9KSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBEZWFsIG5hcnJhdGl2ZSAoUkVRLTAwMDYgc3RlcCAxMCkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBUaGUgc3RhbmRhcmQgZGVhbC1yZXZpZXcgbmFycmF0aXZlLCBzcGxpdCBvdXQgb2YgYGRlc2NyaXB0aW9uYCBzbyBlYWNoXG4gICAgLy8gcGFydCBpcyByZXZpZXdhYmxlLCB0ZW1wbGF0YWJsZSBhbmQgKGxhdGVyKSByZXBvcnRhYmxlIG9uIGl0cyBvd24gXHUyMDE0XG4gICAgLy8gXHUyNkQ0IG5vdCBtb3JlIHByb3NlIGNyYW1tZWQgaW50byBvbmUgbWFya2Rvd24gZmllbGQuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgYHBheW1lbnRfdGVybXNgIGlzIFBST1NFIGhlcmUgYW5kIGEgc2VsZWN0IG9uIGBjcm1fcXVvdGVgIC9cbiAgICAvLyBgY3JtX2NvbnRyYWN0YDogd2hhdCBhIHJlcCByZWNvcmRzIG1pZC1wdXJzdWl0IGlzIHRoZSBzaGFwZSBvZiBhIHRlcm1cbiAgICAvLyBzdGlsbCBiZWluZyBuZWdvdGlhdGVkLCBub3QgdGhlIG5ldC10ZXJtcyBsYWRkZXIgYSBzaWduZWQgZG9jdW1lbnRcbiAgICAvLyBjYXJyaWVzLiBcdTI2RDQgRG8gbm90IFwidW5pZnlcIiBpdCBvbnRvIFBBWU1FTlRfVEVSTVNfT1BUSU9OUyBcdTIwMTQgdGhhdCB3b3VsZFxuICAgIC8vIGZvcmNlIGEgaGFsZi1hZ3JlZWQgdGVybSBpbnRvIGEgY2xvc2VkIHZvY2FidWxhcnkuXG4gICAgLy9cbiAgICAvLyBBbGwgZm91ciBhcmUgYEZpZWxkLnRleHRhcmVhYCAoUkVRLTAwMDYgbmFtZXMgbWFya2Rvd24gT1IgdGV4dGFyZWEgcGVyXG4gICAgLy8gZmllbGQpLiBNZWFzdXJlZCBvbiB0aGUgMTcuNi4wIGNvbnNvbGUsIHRoZSBEZXRhaWxzIHRhYidzIGVkaXQgbW9kZSBcdTIwMTRcbiAgICAvLyB0aGUgc3VyZmFjZSB0aGVzZSBmaWVsZHMgcmVuZGVyIG9uIFx1MjAxNCBoYXMgbm8gbWFya2Rvd24gZWRpdG9yLCBzbyBhXG4gICAgLy8gbWFya2Rvd24gZmllbGQgaGVyZSBjb3VsZCBiZSByZWFkIGJ1dCBuZXZlciB3cml0dGVuLiBUaGUgbWFpbnRhaW5lclxuICAgIC8vIHJ1bGVkIHRleHRhcmVhIGZvciB0aGUgdGhyZWUgdGhhdCB3ZXJlIG1hcmtkb3duICgyMDI2LTEwLTAzLCBvbiAjMTk1MDpcbiAgICAvLyBcdTMwMENcdTY1MzlcdTYyMTAgdGV4dGFyZWEoXHU2M0E4XHU4MzUwKVx1MzAwRCkuXG4gICAgY3VzdG9tZXJfYmFja2dyb3VuZDogRmllbGQudGV4dGFyZWEoe1xuICAgICAgbGFiZWw6ICdDdXN0b21lciBCYWNrZ3JvdW5kJyxcbiAgICAgIGdyb3VwOiAnbmFycmF0aXZlJyxcbiAgICB9KSxcblxuICAgIHByb2plY3RfYmFja2dyb3VuZDogRmllbGQudGV4dGFyZWEoe1xuICAgICAgbGFiZWw6ICdQcm9qZWN0IEJhY2tncm91bmQnLFxuICAgICAgZ3JvdXA6ICduYXJyYXRpdmUnLFxuICAgIH0pLFxuXG4gICAgcmlza19hbmFseXNpczogRmllbGQudGV4dGFyZWEoe1xuICAgICAgbGFiZWw6ICdSaXNrIEFuYWx5c2lzJyxcbiAgICAgIGdyb3VwOiAnbmFycmF0aXZlJyxcbiAgICB9KSxcblxuICAgIHBheW1lbnRfdGVybXM6IEZpZWxkLnRleHRhcmVhKHtcbiAgICAgIGxhYmVsOiAnUGF5bWVudCBUZXJtcycsXG4gICAgICBncm91cDogJ25hcnJhdGl2ZScsXG4gICAgfSksXG5cbiAgICAvLyBGbGFnc1xuICAgIGlzX3ByaXZhdGU6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdQcml2YXRlJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBncm91cDogJ2NybV9mb3JlY2FzdCcsXG4gICAgfSksXG5cbiAgICBmb3JlY2FzdF9jYXRlZ29yeTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnRm9yZWNhc3QgQ2F0ZWdvcnknLFxuICAgICAgZ3JvdXA6ICdjcm1fZm9yZWNhc3QnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnUGlwZWxpbmUnLCB2YWx1ZTogJ3BpcGVsaW5lJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQmVzdCBDYXNlJywgdmFsdWU6ICdiZXN0X2Nhc2UnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDb21taXQnLCB2YWx1ZTogJ2NvbW1pdCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ09taXR0ZWQnLCB2YWx1ZTogJ29taXR0ZWQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDbG9zZWQnLCB2YWx1ZTogJ2Nsb3NlZCcgfSxcbiAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEFwcHJvdmFsIHdvcmtmbG93IHRyYWNraW5nLlxuICAgIC8vIFx1MkI1MCBgcmVhZG9ubHk6IHRydWVgIFx1MjAxNCBERUNMQVJFRCwgYW5kIHRoZSBkZWNsYXJhdGlvbiBpcyB0aGUgaG9uZXN0IG9uZVxuICAgIC8vIHJhdGhlciB0aGFuIGEgaG9wZWZ1bCBvbmUuIEF1ZGl0ZWQgcGVyIHdyaXRlciAoIzE2NjYpOiBldmVyeSB3cml0ZXIgb2ZcbiAgICAvLyB0aGlzIGNvbHVtbiBhbmQgb2YgYGFwcHJvdmVkX2RhdGVgIGlzIGVsZXZhdGVkIG9yIGFuIGluc2VydC5cbiAgICAvLyBgb3Bwb3J0dW5pdHlfYXBwcm92YWxgIGRlY2xhcmVzIGBydW5BczogJ3N5c3RlbSdgLCBhbmRcbiAgICAvLyBgb3Bwb3J0dW5pdHlfYXBwcm92YWxfb25fY3JlYXRlYCBpbmhlcml0cyBpdCBieSBzcHJlYWRpbmcgdGhhdCBmbG93LCBzb1xuICAgIC8vIGByZXNvbHZlUnVuRGF0YUNvbnRleHRgIGhhbmRzIHRoZSBlbmdpbmUgYGlzU3lzdGVtOiB0cnVlYCBhbmQgdGhlXG4gICAgLy8gYGlmICghb3BDdHguY29udGV4dD8uaXNTeXN0ZW0pYCBzdHJpcCBicmFuY2ggaXMgc2tpcHBlZCBvdXRyaWdodDsgdGhlXG4gICAgLy8gYGFwcHJvdmFsYCBub2RlJ3Mgb3duIGBhcHByb3ZhbFN0YXR1c0ZpZWxkYCB3cml0ZSBydW5zIGluc2lkZSB0aG9zZSBzYW1lXG4gICAgLy8gc3lzdGVtIHJ1bnM7IHNlZWRzIHdyaXRlIG9uIElOU0VSVCwgd2hpY2ggdGhlIHN0cmlwIG5ldmVyIHRvdWNoZXMuIE5vXG4gICAgLy8gdmlldywgcGFnZSBvciBhY3Rpb24gd3JpdGVzIGVpdGhlciBjb2x1bW4uIFx1MjFEMiBObyB3cml0ZXIgbG9zZXMgaXRzIHdyaXRlLlxuICAgIC8vIFJ1bGVkICMxNjY2IChkaXJlY3RvciBzZWF0LCBkZWNpc2lvbiBiYXRjaCAjNzQsIDIwMjYtMDktMDcpOiBcIkRlY2xhcmVkID1cbiAgICAvLyBlbmZvcmNlZFwiIGFwcGxpZXMgdG8gdGhlIGF1ZGl0IHN1cmZhY2UgdG9vLiBcdTI2RDQgVGhlIGhhbmQtZWRpdCBlc2NhcGUgaGF0Y2hcbiAgICAvLyBcdTIwMTQgYW4gYWRtaW4gY2xlYXJpbmcgYSBzdHVjayBhcHByb3ZhbCBieSB0eXBpbmcgb3ZlciB0aGUgc3RhbXAgXHUyMDE0IGlzIGdpdmVuXG4gICAgLy8gdXAgT04gUFVSUE9TRTogYSBzdHVjayBhcHByb3ZhbCBpcyBhIHBsYXRmb3JtIG9yIGZsb3cgZGVmZWN0IHRvIGJlIGZpeGVkXG4gICAgLy8gYXMgb25lLCBub3QgYSByZWFzb24gdG8ga2VlcCBhbiBhdWRpdCBzdGFtcCBoYW5kLWVkaXRhYmxlLiBcdTI2RDQgRG8gbm90XG4gICAgLy8gcmVpbnRyb2R1Y2UgYSBieXBhc3MsIGFuZCBkbyBub3Qgc29mdGVuIGVpdGhlciBjb2x1bW4gYmFjayB0byBlZGl0YWJsZVxuICAgIC8vIHdpdGhvdXQgYSBuZXcgcnVsaW5nLiBCb3RoIGhhbHZlcyBhcmUgcGlubmVkIGluXG4gICAgLy8gYHRlc3QvYXVkaXQtc3RhbXAtcmVhZG9ubHkudGVzdC50c2A6IHRoZSBzeXN0ZW0gcGF0aCBzdGlsbCBsYW5kcyBib3RoXG4gICAgLy8gc3RhbXBzLCBhbmQgYSBwbGFpbiB1c2VyLWNvbnRleHQgVVBEQVRFIG9mIGVpdGhlciBpcyBzdHJpcHBlZC5cbiAgICAvLyBcdTI2QTBcdUZFMEYgYGRlZmF1bHRWYWx1ZWAgYXQgRklFTEQgbGV2ZWw6IG9wdGlvbi1sZXZlbCBgZGVmYXVsdDogdHJ1ZWBcbiAgICAvLyBvbmx5IHByZXNlbGVjdHMgaW4gVUkgZm9ybXMgXHUyMDE0IEFQSSBhbmQgZmxvdyBpbnNlcnRzIGxhbmQgbnVsbCB3aXRob3V0IGl0LFxuICAgIC8vIGFuZCBhIG51bGwgYGFwcHJvdmFsX3N0YXR1c2AgbmV2ZXIgbWF0Y2hlcyB0aGUgZmxvdydzIGVudHJ5IGNvbmRpdGlvbi5cbiAgICBhcHByb3ZhbF9zdGF0dXM6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ0FwcHJvdmFsIFN0YXR1cycsXG4gICAgICBncm91cDogJ3NhbGVzX3Byb2Nlc3MnLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBkZWZhdWx0VmFsdWU6ICdub3RfcmVxdWlyZWQnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnTm90IFJlcXVpcmVkJywgdmFsdWU6ICdub3RfcmVxdWlyZWQnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdQZW5kaW5nJywgdmFsdWU6ICdwZW5kaW5nJywgY29sb3I6ICcjRkZBNTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQXBwcm92ZWQnLCB2YWx1ZTogJ2FwcHJvdmVkJywgY29sb3I6ICcjMDBBQTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUmVqZWN0ZWQnLCB2YWx1ZTogJ3JlamVjdGVkJywgY29sb3I6ICcjRkYwMDAwJyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIGFwcHJvdmVkX2RhdGU6IEZpZWxkLmRhdGV0aW1lKHtcbiAgICAgIGxhYmVsOiAnQXBwcm92ZWQgRGF0ZScsXG4gICAgICBncm91cDogJ3NhbGVzX3Byb2Nlc3MnLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgVGhlIHN0YXR1cy1jaGFuZ2UgZ2F0ZSdzIHN3aXRjaCBBTkQgaXRzIHZlcmRpY3QgY29sdW1uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoaXMgYGRlZmF1bHRWYWx1ZWAgSVMgdGhlIHN3aXRjaCwgYW5kIHNoaXBwZWQgaXQgaXMgYG5vdF9yZXF1aXJlZGAsXG4gICAgLy8gc28gdGhlIGdhdGUgaXMgT0ZGIGJ5IGRlZmF1bHQgXHUyMDE0IFJFUS0wMDA2IGFjY2VwdGFuY2UgMzogXCJ3aXRoIGl0IG9mZlxuICAgIC8vICh0aGUgZGVmYXVsdCksIHRoZSBleGlzdGluZyBhbW91bnQtdGllcmVkIGJlaGF2aW91ciBvZlxuICAgIC8vIGBvcHBvcnR1bml0eS1hcHByb3ZhbC5mbG93LnRzYCBpcyBiaXQtZm9yLWJpdCB3aGF0IGl0IGlzIHRvZGF5XCIuIE5vXG4gICAgLy8gcmVjb3JkIGlzIGV2ZXIgYm9ybiBgcGVuZGluZ2AsIGBvcHBvcnR1bml0eV9zdGF0dXNfY2hhbmdlX2FwcHJvdmFsYCdzXG4gICAgLy8gc3RhcnQgY29uZGl0aW9uIGlzIGZhbHNlIGZvciBldmVyeSByb3cgdGhhdCBoYXMgZXZlciBleGlzdGVkLCBhbmRcbiAgICAvLyBub3RoaW5nIGFib3V0IHRoZSBhbW91bnQtdGllcmVkIGZsb3cgY2hhbmdlcy4gQW4gaW5zdGFsbCBBUk1TIHRoZSBnYXRlXG4gICAgLy8gYnkgY2hhbmdpbmcgdGhpcyBvbmUgdmFsdWUgdG8gYCdwZW5kaW5nJ2AuXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgTm90IHRoZSBmbG93J3MgYHN0YXR1c2AsIGZvciB0aGUgcmVhc29uXG4gICAgLy8gYGxlYWQtY29udmVyc2lvbi1hcHByb3ZhbC5mbG93LnRzYCByZWNvcmRzIGFuZCBtZWFzdXJlZDogYGRyYWZ0YCBzdGlsbFxuICAgIC8vIGZpcmVzIGl0cyB0cmlnZ2VycywgYW5kIGBvYnNvbGV0ZWAgY29tcG9zZXMgd2l0aCB0aGUgaW5zdGFsbGF0aW9uJ3NcbiAgICAvLyBhY3RpdmF0aW9uIGxlZGdlciBpbnRvIGEgZ2F0ZSBubyBpbnN0YWxsIGNhbiBldmVyIHR1cm4gT04uXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgRGVsaWJlcmF0ZWx5IE5PVCBgYXBwcm92YWxfc3RhdHVzYC4gVGhhdCBjb2x1bW4gaXMgdGhlIGFtb3VudC10aWVyZWRcbiAgICAvLyBmbG93J3MsIGFuZCBzaGFyaW5nIGl0IHdvdWxkIG1ha2UgZWl0aGVyIGdhdGUncyB2ZXJkaWN0IGVyYXNlIHRoZVxuICAgIC8vIG90aGVyJ3MgXHUyMDE0IGFuZCByZS10cmlnZ2VyIHRoZSBhbW91bnQgZmxvdywgd2hvc2UgZW50cnkgY29uZGl0aW9uIGtleXMgb25cbiAgICAvLyBgYXBwcm92YWxfc3RhdHVzID09IFwibm90X3JlcXVpcmVkXCJgLlxuICAgIC8vXG4gICAgLy8gYHJlYWRvbmx5OiB0cnVlYCBvbiB0aGUgc2FtZSBhdWRpdGVkIGdyb3VuZHMgYXMgYGFwcHJvdmFsX3N0YXR1c2BcbiAgICAvLyAoIzE2NjYpOiB0aGUgb25seSB3cml0ZXJzIGFyZSB0aGUgZ2F0ZSdzIG93biBgcnVuQXM6ICdzeXN0ZW0nYCBmbG93IGFuZFxuICAgIC8vIHRoZSBpbnNlcnQgZGVmYXVsdCwgYW5kIGJvdGggc3Vydml2ZSB0aGUgcmVhZG9ubHkgc3RyaXAuXG4gICAgLy8gV2hhdCB0aGUgcmVwIGlzIEFTS0lORyBmb3IsIFx1MjZENCBuZXZlciB0aGUgc3RhZ2UgaXRzZWxmOiBSRVEtMDAwNlxuICAgIC8vIGFjY2VwdGFuY2UgMyByZXF1aXJlcyB0aGUgc3RhZ2Ugbm90IHRvIG1vdmUgdW50aWwgdGhlIHJlcXVlc3QgaXNcbiAgICAvLyBkZWNpZGVkLCBhbmQgYSBgcmVjb3JkX2NoYW5nZWAgZmxvdyBiaW5kcyBhbiBBRlRFUiBob29rIFx1MjAxNCBieSB0aGUgdGltZSBpdFxuICAgIC8vIHJ1bnMsIGEgc3RhZ2UgdGhlIHJlcCB3cm90ZSBoYXMgYWxyZWFkeSBtb3ZlZC4gU28gdGhlIHJlcCB3cml0ZXMgdGhlXG4gICAgLy8gcmVxdWVzdCBoZXJlICh3aXRoIHRoZSB3aW4vbG9zcyByZWFzb24pLCBhbmQgdGhlIGFwcHJvdmVkIGRlY2lzaW9uXG4gICAgLy8gd3JpdGVzIGBzdGFnZWAgXHUyMDE0IHRoZSBjdXN0b21lcidzIG93biBzdGVwIDE0LCBcdTMwMENcdTkwMUFcdThGQzdcdTU0MEVcdTU1NDZcdTY3M0FcdTcyQjZcdTYwMDFcdTZCNjNcdTVGMEZcdTc1MUZcdTY1NDhcdTMwMEQuXG4gICAgLy9cbiAgICAvLyBWYWx1ZXMgQVJFIHRoZSB0d28gc3RhZ2UgdmFsdWVzLCBzbyB0aGUgZmxvdydzIGFwcHJvdmUgYnJhbmNoIGNhbiBhcHBseVxuICAgIC8vIGl0IHdpdGggYHN0YWdlOiAne29wcFJlY29yZC5yZXF1ZXN0ZWRfc3RhdHVzfSdgIGFuZCBubyBtYXBwaW5nIHRhYmxlIGNhblxuICAgIC8vIGRyaWZ0LiBOb3QgcmVhZG9ubHk6IHRoaXMgaXMgdGhlIG9uZSBoYWxmIG9mIHRoZSBnYXRlIGEgcGVyc29uIHdyaXRlcy5cbiAgICAvLyBJbmVydCB3aGlsZSB0aGUgZ2F0ZSBpcyBvZmYgXHUyMDE0IG5vdGhpbmcgcmVhZHMgaXQgdW5sZXNzIHRoZSBpbnN0YWxsIGFybXNcbiAgICAvLyBgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXNgLlxuICAgIHJlcXVlc3RlZF9zdGF0dXM6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ1JlcXVlc3RlZCBTdGF0dXMnLFxuICAgICAgZ3JvdXA6ICdzYWxlc19wcm9jZXNzJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ1dvbicsIHZhbHVlOiAnY2xvc2VkX3dvbicgfSxcbiAgICAgICAgeyBsYWJlbDogJ0xvc3QnLCB2YWx1ZTogJ2Nsb3NlZF9sb3N0JyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIHN0YXR1c19jaGFuZ2VfYXBwcm92YWxfc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdTdGF0dXMgQ2hhbmdlIEFwcHJvdmFsJyxcbiAgICAgIGdyb3VwOiAnc2FsZXNfcHJvY2VzcycsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogJ25vdF9yZXF1aXJlZCcsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdOb3QgUmVxdWlyZWQnLCB2YWx1ZTogJ25vdF9yZXF1aXJlZCcsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ1BlbmRpbmcnLCB2YWx1ZTogJ3BlbmRpbmcnLCBjb2xvcjogJyNGRkE1MDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdBcHByb3ZlZCcsIHZhbHVlOiAnYXBwcm92ZWQnLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdSZWplY3RlZCcsIHZhbHVlOiAncmVqZWN0ZWQnLCBjb2xvcjogJyNGRjAwMDAnIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFdpbiAvIExvc3MgYW5hbHlzaXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgVGhlIHJlYXNvbiBpcyBjYXB0dXJlZCBBVCBDTE9TRSwgYW5kIHRoYXQgaXMgZW5mb3JjZWQsIG5vdCByZXF1ZXN0ZWQuXG4gICAgLy8gTGVhdmluZyBib3RoIGZpZWxkcyBvcHRpb25hbCBtZWFucyBldmVyeSBzZWVkZWQgYW5kIHVzZXItY2xvc2VkIGRlYWxcbiAgICAvLyBsYW5kcyB3aXRoIHRoZW0gZW1wdHkgYW5kIHRoZSB3aW4vbG9zcyB3aWRnZXRzIGJlbG93IGhhdmUgbm90aGluZyB0byBkcmF3LlxuICAgIC8vXG4gICAgLy8gYHJlcXVpcmVkV2hlbmAsIG5vdCBhIHNjcmlwdCB2YWxpZGF0aW9uLCBmb3IgdGhlIHNhbWUgcmVhc29uXG4gICAgLy8gYGNybV9sZWFkLmR1cGxpY2F0ZV9vZl9sZWFkYCB1c2VzIGl0IChBRFItMDExMyk6IFwidGhpcyBmaWVsZCBtdXN0IGhvbGQgYVxuICAgIC8vIHZhbHVlIHdoZW4gdGhlIHJlY29yZCBsb29rcyBsaWtlIFhcIiBpcyBleGFjdGx5IGEgY29uZGl0aW9uYWwgd3JpdGVcbiAgICAvLyBjb250cmFjdCwgdGhlIGVuZ2luZSBldmFsdWF0ZXMgaXQgb24gaW5zZXJ0IEFORCB1cGRhdGUgaW5zaWRlXG4gICAgLy8gYGV2YWx1YXRlVmFsaWRhdGlvblJ1bGVzYCwgYW5kIGl0IHJlcG9ydHMgYWdhaW5zdCB0aGUgRklFTEQgXHUyMDE0IHNvIHRoZSBmb3JtXG4gICAgLy8gbWFya3MgdGhlIGVtcHR5IHBpY2tsaXN0IGluc3RlYWQgb2Ygc2hvd2luZyBhIHJlY29yZC1sZXZlbCBiYW5uZXIuIEl0IGlzXG4gICAgLy8gQUxTTyB0aGUgb25seSBzaGFwZSB0aGUgZnJlZXplIGJlbG93IGxlYXZlcyB1c2FibGU6IG9uY2UgYSBkZWFsIGlzIGNsb3NlZCxcbiAgICAvLyBgb3Bwb3J0dW5pdHkuaG9vay50c2AgcmVmdXNlcyBldmVyeSB1c2VyIGVkaXQgb3V0c2lkZSB0aGUgbmFycmF0aXZlXG4gICAgLy8gZmllbGRzLCBzbyBhIHJlYXNvbiBub3QgY2FwdHVyZWQgaW4gdGhlIGNsb3Npbmcgd3JpdGUgY2FuIG5ldmVyIGJlIGFkZGVkXG4gICAgLy8gYWZ0ZXJ3YXJkcy4gQ2xvc2UgdGltZSBpcyB0aGUgb25seSBjaGFuY2UuXG4gICAgLy8gYHRlc3Qvd2luLWxvc3MtY2FwdHVyZS50ZXN0LnRzYCBkcml2ZXMgYm90aCBwcmVkaWNhdGVzIHRocm91Z2ggYSByZWFsXG4gICAgLy8gT2JqZWN0UUwgb3ZlciBhIHJlYWwgZHJpdmVyLCBvbiBpbnNlcnQgYW5kIG9uIHVwZGF0ZS5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBgaGFzKC4uLilgIGlzIGxvYWQtYmVhcmluZy4gQSBiYXJlIGByZWNvcmQuc3RhZ2UgPT0gXCJjbG9zZWRfbG9zdFwiYFxuICAgIC8vIGFib3J0cyB3aXRoIGBObyBzdWNoIGtleWAgb24gYW55IG1lcmdlZCByZWNvcmQgdGhhdCBvbWl0cyB0aGUgY29sdW1uLCBhbmRcbiAgICAvLyB0aGUgZW5naW5lJ3MgYW5zd2VyIHRvIGEgcHJlZGljYXRlIHRoYXQgY2Fubm90IGV2YWx1YXRlIGlzIHRvIFNLSVAgaXRcbiAgICAvLyAoXCJyZXF1aXJlZFdoZW4gZm9yICdsb3NzX3JlYXNvbicgZmFpbGVkIHRvIGV2YWx1YXRlIFx1MjAxNCBza2lwcGVkXCIpLCB3aGljaFxuICAgIC8vIHdvdWxkIG1ha2UgdGhpcyByZWFkIGFzIGVuZm9yY2VkIHdoaWxlIHJlcXVpcmluZyBub3RoaW5nIGF0IGFsbC5cbiAgICB3aW5fcmVhc29uOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdXaW4gUmVhc29uJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnV2h5IHRoaXMgZGVhbCB3YXMgd29uLiBSZXF1aXJlZCB0byBjbG9zZSBhbiBvcHBvcnR1bml0eSBhcyBXb24uJyxcbiAgICAgIGdyb3VwOiAnY2xhc3NpZmljYXRpb24nLFxuICAgICAgcmVxdWlyZWRXaGVuOiBQYGhhcyhyZWNvcmQuc3RhZ2UpICYmIHJlY29yZC5zdGFnZSA9PSBcImNsb3NlZF93b25cImAsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdCZXR0ZXIgUHJvZHVjdCcsIHZhbHVlOiAnYmV0dGVyX3Byb2R1Y3QnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdCZXR0ZXIgUHJpY2UnLCB2YWx1ZTogJ2JldHRlcl9wcmljZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0V4aXN0aW5nIFJlbGF0aW9uc2hpcCcsIHZhbHVlOiAncmVsYXRpb25zaGlwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQmV0dGVyIFN1cHBvcnQnLCB2YWx1ZTogJ2JldHRlcl9zdXBwb3J0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnQmVzdCBGaXQgLyBGZWF0dXJlcycsIHZhbHVlOiAnYmVzdF9maXQnIH0sXG4gICAgICAgIC8vIFdyaXR0ZW4gYnkgdGhlIG1hY2hpbmUsIG5vdCBjaG9zZW4gYnkgYSByZXA6IGBxdW90ZV9vbl9hY2NlcHRlZGBcbiAgICAgICAgLy8gKHF1b3RlLmhvb2sudHMpIHdpbnMgdGhlIGRlYWwgdGhlIG1vbWVudCBhIGN1c3RvbWVyIGFjY2VwdHMgdGhlXG4gICAgICAgIC8vIHF1b3RlLCBhbmQgbm8gaHVtYW4gaXMgaW4gdGhhdCB3cml0ZSB0byBhdHRyaWJ1dGUgaXQuIE5hbWluZyB0aGVcbiAgICAgICAgLy8gYXV0b21hdGVkIHBhdGggaXMgdGhpcyByZXBvJ3MgZXhpc3RpbmcgaWRpb20gZm9yIGV4YWN0bHkgdGhhdCBzcGxpdFxuICAgICAgICAvLyAoYGNybV9sZWFkLmR1cGxpY2F0ZV9zdGF0dXNgID0gbWFjaGluZSBgc3VzcGVjdGVkYCB2cyBodW1hblxuICAgICAgICAvLyBgY29uZmlybWVkYCkgYW5kIGl0IGtlZXBzIHRoZSBydWxlIGV4Y2VwdGlvbi1mcmVlOiBldmVyeSBjbG9zZWRfd29uXG4gICAgICAgIC8vIHJvdyBjYXJyaWVzIGEgcmVhc29uLCBhbmQgYW4gYW5hbHlzdCBjYW4gc3RpbGwgdGVsbCBhIENQUSBjbG9zZSBmcm9tXG4gICAgICAgIC8vIGEgcmVwJ3MgYXR0cmlidXRpb24gaW5zdGVhZCBvZiByZWFkaW5nIGEgZmFicmljYXRlZCBcIkJldHRlciBQcm9kdWN0XCIuXG4gICAgICAgIHsgbGFiZWw6ICdRdW90ZSBBY2NlcHRlZCcsIHZhbHVlOiAncXVvdGVfYWNjZXB0ZWQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdPdGhlcicsIHZhbHVlOiAnb3RoZXInIH0sXG4gICAgICBdLFxuICAgIH0pLFxuXG4gICAgbG9zc19yZWFzb246IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ0xvc3MgUmVhc29uJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnV2h5IHRoaXMgZGVhbCB3YXMgbG9zdC4gUmVxdWlyZWQgdG8gY2xvc2UgYW4gb3Bwb3J0dW5pdHkgYXMgTG9zdC4nLFxuICAgICAgZ3JvdXA6ICdjbGFzc2lmaWNhdGlvbicsXG4gICAgICByZXF1aXJlZFdoZW46IFBgaGFzKHJlY29yZC5zdGFnZSkgJiYgcmVjb3JkLnN0YWdlID09IFwiY2xvc2VkX2xvc3RcImAsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdQcmljZSBUb28gSGlnaCcsIHZhbHVlOiAncHJpY2UnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdMb3N0IHRvIENvbXBldGl0b3InLCB2YWx1ZTogJ2NvbXBldGl0b3InIH0sXG4gICAgICAgIHsgbGFiZWw6ICdObyBCdWRnZXQnLCB2YWx1ZTogJ25vX2J1ZGdldCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ05vIERlY2lzaW9uJywgdmFsdWU6ICdub19kZWNpc2lvbicgfSxcbiAgICAgICAgeyBsYWJlbDogJ0JhZCBUaW1pbmcnLCB2YWx1ZTogJ3RpbWluZycgfSxcbiAgICAgICAgeyBsYWJlbDogJ01pc3NpbmcgRmVhdHVyZXMnLCB2YWx1ZTogJ2ZlYXR1cmVzJyB9LFxuICAgICAgICB7IGxhYmVsOiAnT3RoZXInLCB2YWx1ZTogJ290aGVyJyB9LFxuICAgICAgXSxcbiAgICB9KSxcblxuICAgIGxvc3NfZGV0YWlsczogRmllbGQudGV4dGFyZWEoe1xuICAgICAgbGFiZWw6ICdMb3NzL1dpbiBEZXRhaWxzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRnJlZS10ZXh0IGNvbnRleHQgYmVoaW5kIHRoZSB3aW4gb3IgbG9zcyByZWFzb24uJyxcbiAgICAgIGdyb3VwOiAnY2xhc3NpZmljYXRpb24nLFxuICAgIH0pLFxuICB9LFxuICBcbiAgLy8gRGF0YWJhc2UgaW5kZXhlcyBmb3IgcGVyZm9ybWFuY2VcbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ25hbWUnXSB9LFxuICAgIHsgZmllbGRzOiBbJ2NybV9hY2NvdW50J10gfSxcbiAgICB7IGZpZWxkczogWydvd25lcl9pZCddIH0sXG4gICAgeyBmaWVsZHM6IFsnc3RhZ2UnXSB9LFxuICAgIHsgZmllbGRzOiBbJ2Nsb3NlX2RhdGUnXSB9LFxuICAgIC8vIFRoZSBzdGFnbmF0aW9uIHN3ZWVwIGZpbHRlcnMgb24gdGhpcyBldmVyeSBtb3JuaW5nLlxuICAgIHsgZmllbGRzOiBbJ3N0YWdlX2VudHJ5X2RhdGUnXSB9LFxuICBdLFxuICBcbiAgLy8gRW5hYmxlIGFkdmFuY2VkIGZlYXR1cmVzXG4gIC8vXG4gIC8vIFN0YWdlL2Ftb3VudCBoaXN0b3J5IGlzIHRyYWNrZWQgcGVyLWZpZWxkIHZpYSBgRmllbGQudHJhY2tIaXN0b3J5YFxuICAvLyAoQURSLTAwNTIpLiBcdTI2QTBcdUZFMEYgT3duZXJzaGlwIGlzIE5PVDogaXQgbGl2ZXMgb24gdGhlIHBsYXRmb3JtJ3MgaW5qZWN0ZWRcbiAgLy8gYG93bmVyX2lkYCwgd2hpY2ggY2FycmllcyBubyBgdHJhY2tIaXN0b3J5YCBmbGFnIFx1MjAxNCBhIHRyYW5zZmVyIGlzIHJlY29yZGVkXG4gIC8vIGluIHRoZSBjb21wbGlhbmNlIGF1ZGl0IGxvZyAoYHN5c19hdWRpdF9sb2dgLCB1bmNvbmRpdGlvbmFsKSByYXRoZXIgdGhhbiBvblxuICAvLyB0aGUgYWN0aXZpdHkgZmVlZC5cbiAgZW5hYmxlOiB7XG4gICAgYXBpRW5hYmxlZDogdHJ1ZSxcbiAgICBhcGlNZXRob2RzOiBbJ2dldCcsICdsaXN0JywgJ2NyZWF0ZScsICd1cGRhdGUnLCAnZGVsZXRlJ10sIC8vIFdoaXRlbGlzdCBhbGxvd2VkIEFQSSBvcGVyYXRpb25zXG4gICAgLy8gIzYwMiBcdTIwMTQgcHJvcG9zYWxzLCByZWRsaW5lcyBhbmQgc2lnbmVkIG9yZGVycyBiZWxvbmcgb24gdGhlIGRlYWwuXG4gICAgLy8gU2VlIHRoZSBjYW5vbmljYWwgY2FwYWJpbGl0eSBub3RlIGluIGBzcmMvc2FsZXMvb2JqZWN0cy9pbmRleC50c2AuXG4gICAgZmlsZXM6IHRydWUsXG4gIH0sXG5cbiAgLy8gQURSLTAwNTIgXHUwMEE3NWIuMiBcdTIwMTQgZGVjbGFyYXRpdmUgbWlsZXN0b25lIGFjdGl2aXR5LiBXaGVuIGBzdGFnZWAgZW50ZXJzIHRoZXNlXG4gIC8vIHZhbHVlcyB0aGUgcGxhdGZvcm0gZW1pdHMgYSBzZW1hbnRpYyB0aW1lbGluZSBlbnRyeSAobm8gaG9vayBjb2RlKS5cbiAgLy8gQ29tYmluZWQgd2l0aCB0aGUgZmllbGQtbGV2ZWwgYHRyYWNrSGlzdG9yeWAgYWJvdmUgKHN0YWdlLWNoYW5nZSByb3dzKSB0aGlzXG4gIC8vIHJlcGxhY2VzIGFueSBoYW5kLWNvZGVkIGFjdGl2aXR5IGhvb2suXG4gIGFjdGl2aXR5TWlsZXN0b25lczogW1xuICAgIHsgZmllbGQ6ICdzdGFnZScsIHZhbHVlOiAnY2xvc2VkX3dvbicsIHN1bW1hcnk6ICdEZWFsIHdvbiBcdTIwMTQge25hbWV9JywgdHlwZTogJ2NvbXBsZXRlZCcgfSxcbiAgICB7IGZpZWxkOiAnc3RhZ2UnLCB2YWx1ZTogJ2Nsb3NlZF9sb3N0Jywgc3VtbWFyeTogJ0RlYWwgbG9zdCBcdTIwMTQge25hbWV9JywgdHlwZTogJ2NvbXBsZXRlZCcgfSxcbiAgXSxcblxuICAvLyBSZW1vdmVkOiBsaXN0X3ZpZXdzIGFuZCBmb3JtX3ZpZXdzIGJlbG9uZyBpbiBVSSBjb25maWd1cmF0aW9uLCBub3Qgb2JqZWN0IGRlZmluaXRpb25cbiAgXG4gIC8vIExpZmVjeWNsZSB0cmFuc2l0aW9ucyBhcmUgZW5mb3JjZWQgdmlhIGEgYHN0YXRlX21hY2hpbmVgIHZhbGlkYXRpb24gcnVsZVxuICAvLyAoc2VlIHZhbGlkYXRpb25zW10gYmVsb3cpLiBcdTI2QTBcdUZFMEYgVGhlcmUgaXMgbm8gdG9wLWxldmVsIGBzdGF0ZU1hY2hpbmVzYCBrZXkgb25cbiAgLy8gdGhlIHBsYXRmb3JtIFx1MjAxNCBzdGF0dXMgc3RhdGUgbWFjaGluZXMgbGl2ZSBpbiB0aGUgdmFsaWRhdGlvbiB1bmlvbi5cblxuICAvLyBWYWxpZGF0aW9uIFJ1bGVzXG4gIC8vXG4gIC8vIFByZWRpY2F0ZXMgYmVsb3cgYXJlIFRPVEFMOiBldmVyeSBgcmVjb3JkLnhgIHJlYWQgaXMgYGhhcygpYC1ndWFyZGVkLCBzbyB0aGVcbiAgLy8gcnVsZSByZXR1cm5zIGEgdmVyZGljdCBldmVuIHdoZW4gdGhlIG1lcmdlZCByZWNvcmQgaGFzIG5vIHN1Y2gga2V5LiBTZWVcbiAgLy8gQUdFTlRTLm1kIFwiVmFsaWRhdGlvbiBwcmVkaWNhdGVzIG11c3QgYmUgVE9UQUxcIiBhbmRcbiAgLy8gdGVzdC9vYmplY3QtdmFsaWRhdGlvbi1wcmVkaWNhdGVzLnRlc3QudHMsIHdoaWNoIGZhaWxzIHRoZSBidWlsZCBvdGhlcndpc2UuXG4gIHZhbGlkYXRpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2Nsb3NlX2RhdGVfZnV0dXJlJyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6ICdDbG9zZSBkYXRlIHNob3VsZCBub3QgYmUgaW4gdGhlIHBhc3QgdW5sZXNzIG9wcG9ydHVuaXR5IGlzIGNsb3NlZCcsXG4gICAgICAvLyBBbiBhYnNlbnQgYHN0YWdlYCBrZXkgbWVhbnMgXCJubyBzdGFnZSByZWNvcmRlZFwiLCB3aGljaCBpcyBub3QgYSBjbG9zZWRcbiAgICAgIC8vIHN0YWdlIFx1MjAxNCBoZW5jZSBgIWhhcyhyZWNvcmQuc3RhZ2UpIHx8IChcdTIwMjYpYCByYXRoZXIgdGhhbiBhIGxlYWRpbmdcbiAgICAgIC8vIGBoYXMocmVjb3JkLnN0YWdlKSAmJmAsIHdoaWNoIHdvdWxkIHN1cHByZXNzIHRoZSB3YXJuaW5nIGluc3RlYWQuXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5jbG9zZV9kYXRlKSAmJiByZWNvcmQuY2xvc2VfZGF0ZSAhPSBudWxsICYmIHJlY29yZC5jbG9zZV9kYXRlIDwgdG9kYXkoKSAmJiAoIWhhcyhyZWNvcmQuc3RhZ2UpIHx8IChyZWNvcmQuc3RhZ2UgIT0gXCJjbG9zZWRfd29uXCIgJiYgcmVjb3JkLnN0YWdlICE9IFwiY2xvc2VkX2xvc3RcIikpYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdhbW91bnRfcG9zaXRpdmUnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdBbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybycsXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5hbW91bnQpICYmIHJlY29yZC5hbW91bnQgIT0gbnVsbCAmJiByZWNvcmQuYW1vdW50IDw9IDBgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ29wcG9ydHVuaXR5X3N0YWdlX3Byb2dyZXNzaW9uJyxcbiAgICAgIHR5cGU6ICdzdGF0ZV9tYWNoaW5lJyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiAnSW52YWxpZCBvcHBvcnR1bml0eSBzdGFnZSB0cmFuc2l0aW9uJyxcbiAgICAgIGZpZWxkOiAnc3RhZ2UnLFxuICAgICAgdHJhbnNpdGlvbnM6IHtcbiAgICAgICAgLy8gYFx1MjE5MiBwcm9wb3NhbGAgaXMgbGVnYWwgZnJvbSBldmVyeSBwcmUtcHJvcG9zYWwgc3RhZ2U6IHRoZVxuICAgICAgICAvLyBxdW90ZV9nZW5lcmF0aW9uIGZsb3cgZmFzdC1mb3J3YXJkcyB0aGUgZGVhbCB0byBgcHJvcG9zYWxgIHdoZW4gYVxuICAgICAgICAvLyBxdW90ZSBpcyBnZW5lcmF0ZWQsIHdoaWNoIGNhbiBoYXBwZW4gYXQgYW55IG9wZW4gc3RhZ2UuXG4gICAgICAgIHByb3NwZWN0aW5nOiBbJ3F1YWxpZmljYXRpb24nLCAncHJvcG9zYWwnLCAnY2xvc2VkX2xvc3QnXSxcbiAgICAgICAgcXVhbGlmaWNhdGlvbjogWyduZWVkc19hbmFseXNpcycsICdwcm9wb3NhbCcsICdjbG9zZWRfbG9zdCddLFxuICAgICAgICBuZWVkc19hbmFseXNpczogWydwcm9wb3NhbCcsICdjbG9zZWRfbG9zdCddLFxuICAgICAgICAvLyBgcHJvcG9zYWwgXHUyMTkyIGNsb3NlZF93b25gIGlzIGxlZ2FsOiB0aGUgcXVvdGVfb25fYWNjZXB0ZWQgaG9vayBjbG9zZXNcbiAgICAgICAgLy8gdGhlIGxpbmtlZCBkZWFsIGRpcmVjdGx5IGZyb20gdGhlIENQUSBwYXRoIChxdW90ZV9nZW5lcmF0aW9uIHBhcmtzXG4gICAgICAgIC8vIHRoZSBvcHBvcnR1bml0eSBhdCBgcHJvcG9zYWxgOyBhbiBhY2NlcHRlZCBxdW90ZSB3aW5zIGl0IHdpdGhvdXQgYVxuICAgICAgICAvLyBzZXBhcmF0ZSBuZWdvdGlhdGlvbiBzdGVwKS5cbiAgICAgICAgcHJvcG9zYWw6IFsnbmVnb3RpYXRpb24nLCAnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddLFxuICAgICAgICBuZWdvdGlhdGlvbjogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10sXG4gICAgICAgIGNsb3NlZF93b246IFtdLFxuICAgICAgICBjbG9zZWRfbG9zdDogW10sXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG4gIFxuICAvLyBcdTI2QTBcdUZFMEYgYHByb2JhYmlsaXR5YCBhbmQgYGV4cGVjdGVkX3JldmVudWVgIGFyZSBOT1QgY29tcHV0ZWQgZGVjbGFyYXRpdmVseS5cbiAgLy8gVGhleSBhcmUgZGVyaXZlZCBpbiBgb3Bwb3J0dW5pdHkuaG9vay50c2AgKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggPVxuICAvLyBzdGFnZSBcdTIxOTIgU1RBR0VfUFJPQkFCSUxJVFkpOyBrZWVwaW5nIHRoZSBtYXRoIGluIG9uZSBwbGFjZSBhdm9pZHMgZHJpZnRcbiAgLy8gYmV0d2VlbiBhIGRlY2xhcmF0aXZlIENBU0UoKSB0YWJsZSBhbmQgdGhlIGhvb2sncyBsb29rdXAgdGFibGUuXG4gIC8vXG4gIC8vIFx1MjZBMFx1RkUwRiBObyBgd29ya2Zsb3dzW11gIGhlcmUsIGFuZCBub25lIGlzIHBvc3NpYmxlOiBvYmplY3QgYHdvcmtmbG93c1tdYCB3ZXJlXG4gIC8vIHJlbW92ZWQgZnJvbSB0aGUgcGxhdGZvcm0uIEZpZWxkIHVwZGF0ZXMgbGl2ZSBpbiB0aGlzIG9iamVjdCdzIGAqLmhvb2sudHNgO1xuICAvLyBzY2hlZHVsZWQgc3RhdHVzIGZsaXBzIGFuZCBub3RpZmljYXRpb25zIGxpdmUgaW4gYHNyYy8qL2Zsb3dzLyouZmxvdy50c2AuXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvdGFzay5vYmplY3QudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL3Rhc2sub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBPYmplY3RTY2hlbWEsIEZpZWxkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgVEFTS19UWVBFX09QVElPTlMgfSBmcm9tICcuL19waWNrbGlzdHMnO1xuXG5leHBvcnQgY29uc3QgVGFzayA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX3Rhc2snLFxuICBsYWJlbDogJ1Rhc2snLFxuICBwbHVyYWxMYWJlbDogJ1Rhc2tzJyxcbiAgaWNvbjogJ2NoZWNrLXNxdWFyZScsXG4gIGRlc2NyaXB0aW9uOiAnQWN0aXZpdGllcyBhbmQgdG8tZG8gaXRlbXMnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIFBlcnNvbmFsIGFjdGl2aXR5IHJlY29yZHMuXG4gIHNoYXJpbmdNb2RlbDogJ3ByaXZhdGUnLFxuXG4gIC8vIEV2ZXJ5IG90aGVyIGJ1c2luZXNzIG9iamVjdCB3aXRoIGEgZGV0YWlsIHBhZ2UgZ3JvdXBzIGl0cyBmaWVsZHM7IHRhc2sgd2FzXG4gIC8vIG9uZSBvZiB0aGUgdHdvIHRoYXQgZGlkIG5vdCwgc28gaXRzIGRldGFpbCBwYWdlIGZlbGwgYmFjayB0byBvbmUgZmxhdCBncmlkXG4gIC8vIHdoZXJlIHRoZSBmaXZlIHBvbHltb3JwaGljIGByZWxhdGVkX3RvXypgIGxvb2t1cHMgYW5kIHRoZSByZWN1cnJlbmNlXG4gIC8vIG1hY2hpbmVyeSBzYXQgaW5saW5lIHdpdGggdGhlIHN1YmplY3QuIFRoZSBrZXlzIG1pcnJvciB0aGUgc2VjdGlvbnMgdGhlXG4gIC8vIHRhc2sgZm9ybSBhbHJlYWR5IHVzZXMgKFRhc2sgLyBSZWxhdGVkIFJlY29yZHMgLyBSZWN1cnJlbmNlICYgRWZmb3J0KSBzb1xuICAvLyB0aGUgdHdvIHN1cmZhY2VzIGFncmVlLlxuICBmaWVsZEdyb3VwczogW1xuICAgIHsga2V5OiAnYmFzaWMnLCAgICAgIGxhYmVsOiAnVGFzayBJbmZvcm1hdGlvbicsIGljb246ICdpbmZvJyB9LFxuICAgIHsga2V5OiAnc2NoZWR1bGluZycsIGxhYmVsOiAnU2NoZWR1bGluZycsICAgICAgIGljb246ICdjYWxlbmRhcicgfSxcbiAgICAvLyBObyAnYXNzaWdubWVudCcgZ3JvdXA6IHRoZSBhc3NpZ25lZSAoYG93bmVyX2lkYCkgd2FzIGl0cyBvbmx5IG1lbWJlciwgYW5kXG4gICAgLy8gdGhlIHN5bnRoZXNpemVkIGRldGFpbCBwYWdlIGhvaXN0cyBpdCBpbnRvIHRoZSBoaWdobGlnaHQgc3RyaXAgXHUyMDE0IHNvIHRoZVxuICAgIC8vIGdyb3VwIHJlbmRlcmVkIG9uIGZvcm1zIGFuZCBuZXZlciBvbiBkZXRhaWwgcGFnZXNcbiAgICAvLyAoYGZpZWxkLWdyb3VwLXNoYWRvd2VkYCkuIEl0IGxpdmVzIGluIGBiYXNpY2AgYWxvbmdzaWRlXG4gICAgLy8gc3ViamVjdC9zdGF0dXMvcHJpb3JpdHkgaW5zdGVhZC5cbiAgICB7IGtleTogJ3JlbGF0ZWQnLCAgICBsYWJlbDogJ1JlbGF0ZWQgUmVjb3JkcycsICBpY29uOiAnbGluaycgfSxcbiAgICB7IGtleTogJ3JlY3VycmVuY2UnLCBsYWJlbDogJ1JlY3VycmVuY2UnLCAgICAgICBpY29uOiAncmVmcmVzaC1jY3cnLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ2VmZm9ydCcsICAgICBsYWJlbDogJ1Byb2dyZXNzICYgRWZmb3J0JywgaWNvbjogJ2FjdGl2aXR5JywgICBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ3N5c3RlbScsICAgICBsYWJlbDogJ1N5c3RlbScsICAgICAgICAgICBpY29uOiAnZGF0YWJhc2UnLCAgICBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgXSxcblxuICBmaWVsZHM6IHtcbiAgICAvLyBQbGF0Zm9ybSBvd25lcnNoaXAgYW5jaG9yIFx1MjAxNCBjYW5vbmljYWwgbm90ZSBpbiBgYWNjb3VudC5vYmplY3QudHNgICgjNTQ4KS5cbiAgICBvd25lcl9pZDogRmllbGQubG9va3VwKCdzeXNfdXNlcicsIHtcbiAgICAgIGxhYmVsOiAnQXNzaWduZWQgVG8nLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBzeXN0ZW06IHRydWUsXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBUYXNrIEluZm9ybWF0aW9uXG4gICAgc3ViamVjdDogRmllbGQudGV4dCh7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnU3ViamVjdCcsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG1heExlbmd0aDogMjU1LFxuICAgIH0pLFxuICAgIFxuICAgIGRlc2NyaXB0aW9uOiBGaWVsZC5tYXJrZG93bih7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnRGVzY3JpcHRpb24nLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFRhc2sgTWFuYWdlbWVudFxuICAgIHN0YXR1czogRmllbGQuc2VsZWN0KHtcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICAgIC8vIEZpZWxkLWxldmVsIGRlZmF1bHQsIG5vdCBqdXN0IHRoZSBvcHRpb24gZmxhZzogdGhlIG9wdGlvbiBgZGVmYXVsdGBcbiAgICAgIC8vIG9ubHkgcHJlc2VsZWN0cyBpbiBzb21lIGZvcm0gc3VyZmFjZXMsIHNvIGEgcXVpY2stY3JlYXRlIG1vZGFsIG9wZW5lZFxuICAgICAgLy8gZnJvbSBhIHJlbGF0ZWQgbGlzdCBsZWZ0IHRoaXMgcmVxdWlyZWQgZmllbGQgYmxhbmsgYW5kIHRoZSByZXAgaGFkIHRvXG4gICAgICAvLyBwaWNrIFwiTm90IFN0YXJ0ZWRcIiBieSBoYW5kIGV2ZXJ5IHRpbWUuXG4gICAgICBkZWZhdWx0VmFsdWU6ICdub3Rfc3RhcnRlZCcsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdOb3QgU3RhcnRlZCcsIHZhbHVlOiAnbm90X3N0YXJ0ZWQnLCBjb2xvcjogJyM4MDgwODAnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdJbiBQcm9ncmVzcycsIHZhbHVlOiAnaW5fcHJvZ3Jlc3MnLCBjb2xvcjogJyNGRkE1MDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdXYWl0aW5nJywgdmFsdWU6ICd3YWl0aW5nJywgY29sb3I6ICcjRkZENzAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQ29tcGxldGVkJywgdmFsdWU6ICdjb21wbGV0ZWQnLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdEZWZlcnJlZCcsIHZhbHVlOiAnZGVmZXJyZWQnLCBjb2xvcjogJyM5OTk5OTknIH0sXG4gICAgICBdXG4gICAgfSksXG5cbiAgICBwcmlvcml0eTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbGFiZWw6ICdQcmlvcml0eScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgICAgLy8gYG5vcm1hbGAgaXMgdGhlIGRlZmF1bHQgcmF0aGVyIHRoYW4gYGxvd2A6IGEgcmVwIGZpbGluZyBhIHRvLWRvIGhhc1xuICAgICAgLy8gbWFkZSBubyBwcmlvcml0eSBqdWRnZW1lbnQsIGFuZCBkZWZhdWx0aW5nIGV2ZXJ5dGhpbmcgdG8gTG93IG1hZGUgdGhlXG4gICAgICAvLyBmaWVsZCBtZWFuaW5nbGVzcyAobm90aGluZyBldmVyIHNvcnRlZCBhYm92ZSB0aGUgbm9pc2UpLlxuICAgICAgZGVmYXVsdFZhbHVlOiAnbm9ybWFsJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0xvdycsIHZhbHVlOiAnbG93JywgY29sb3I6ICcjNDE2OUUxJyB9LFxuICAgICAgICB7IGxhYmVsOiAnTm9ybWFsJywgdmFsdWU6ICdub3JtYWwnLCBjb2xvcjogJyMwMEFBMDAnLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdIaWdoJywgdmFsdWU6ICdoaWdoJywgY29sb3I6ICcjRkZBNTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnVXJnZW50JywgdmFsdWU6ICd1cmdlbnQnLCBjb2xvcjogJyNGRjAwMDAnIH0sXG4gICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTb3J0YWJsZSBvcmRpbmFsIGZvciBgcHJpb3JpdHlgIFx1MjAxNCBzZWUgY3JtX2Nhc2UucHJpb3JpdHlfcmFuay4gU29ydGluZyBvblxuICAgIC8vIHRoZSBzZWxlY3QgaXRzZWxmIGNvbXBhcmVzIHJhdyBzdHJpbmdzIChub3JtYWwgPiBsb3cgPiBoaWdoID4gdXJnZW50KSxcbiAgICAvLyB3aGljaCBwdXNoZXMgdXJnZW50IHdvcmsgdG8gdGhlIGJvdHRvbSBvZiB0aGUgdG8tZG8gcXVldWUuXG4gICAgLy9cbiAgICAvLyBgMGAgaXMgdGhlIFVOUkFOS0VEIHNlbnRpbmVsLCBpZGVudGljYWwgdG8gY3JtX2Nhc2UucHJpb3JpdHlfcmFuay4gXHUyNkQ0IEl0XG4gICAgLy8gbXVzdCBzdGF5IGlkZW50aWNhbCBvbiBib3RoOiBhIGRpZmZlcmluZyBzZW50aW5lbCBvcmRlcnMgdGhlIHNhbWUgdW5rbm93blxuICAgIC8vIHByaW9yaXR5IGRpZmZlcmVudGx5IG9uIHRoZSB0d28gb2JqZWN0cywgYW5kIGAyYCBoZXJlIHdvdWxkIG1ha2UgYW5cbiAgICAvLyB1bnJhbmtlZCB0YXNrIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBnZW51aW5lIGBub3JtYWxgLlxuICAgIHByaW9yaXR5X3Jhbms6IEZpZWxkLm51bWJlcih7XG4gICAgICBsYWJlbDogJ1ByaW9yaXR5IFJhbmsnLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBkZWZhdWx0VmFsdWU6IDAsXG4gICAgfSksXG5cbiAgICB0eXBlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ1Rhc2sgVHlwZScsXG4gICAgICAvLyBDYW5vbmljYWwgc2V0ICgjNDkwKSBcdTIwMTQgdGhlIHNjaGVkdWxlX2ZvbGxvd3VwIHNjcmVlbiByZW5kZXJzIHRoZSBzYW1lXG4gICAgICAvLyBsaXN0OyBzZWUgX3BpY2tsaXN0cy50cy5cbiAgICAgIG9wdGlvbnM6IFsuLi5UQVNLX1RZUEVfT1BUSU9OU10sXG4gICAgfSksXG4gICAgXG4gICAgLy8gRGF0ZXNcbiAgICBkdWVfZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBncm91cDogJ3NjaGVkdWxpbmcnLFxuICAgICAgbGFiZWw6ICdEdWUgRGF0ZScsXG4gICAgfSksXG4gICAgXG4gICAgcmVtaW5kZXJfZGF0ZTogRmllbGQuZGF0ZXRpbWUoe1xuICAgICAgZ3JvdXA6ICdzY2hlZHVsaW5nJyxcbiAgICAgIGxhYmVsOiAnUmVtaW5kZXIgRGF0ZS9UaW1lJyxcbiAgICB9KSxcbiAgICBcbiAgICBjb21wbGV0ZWRfZGF0ZTogRmllbGQuZGF0ZXRpbWUoe1xuICAgICAgZ3JvdXA6ICdzY2hlZHVsaW5nJyxcbiAgICAgIGxhYmVsOiAnQ29tcGxldGVkIERhdGUnLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgfSksXG4gICAgXG4gICAgLy8gUmVsYXRlZCBUbyAoUG9seW1vcnBoaWMgcmVsYXRpb25zaGlwIC0gY2FuIGxpbmsgdG8gbXVsdGlwbGUgb2JqZWN0IHR5cGVzKVxuICAgIHJlbGF0ZWRfdG9fdHlwZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGdyb3VwOiAncmVsYXRlZCcsXG4gICAgICBsYWJlbDogJ1JlbGF0ZWQgVG8gVHlwZScsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdBY2NvdW50JywgdmFsdWU6ICdjcm1fYWNjb3VudCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0NvbnRhY3QnLCB2YWx1ZTogJ2NybV9jb250YWN0JyB9LFxuICAgICAgICB7IGxhYmVsOiAnT3Bwb3J0dW5pdHknLCB2YWx1ZTogJ2NybV9vcHBvcnR1bml0eScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0xlYWQnLCB2YWx1ZTogJ2NybV9sZWFkJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQ2FzZScsIHZhbHVlOiAnY3JtX2Nhc2UnIH0sXG4gICAgICBdXG4gICAgfSksXG4gICAgXG4gICAgcmVsYXRlZF90b19hY2NvdW50OiBGaWVsZC5sb29rdXAoJ2NybV9hY2NvdW50Jywge1xuICAgICAgZ3JvdXA6ICdyZWxhdGVkJyxcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBBY2NvdW50JyxcbiAgICB9KSxcbiAgICBcbiAgICByZWxhdGVkX3RvX2NvbnRhY3Q6IEZpZWxkLmxvb2t1cCgnY3JtX2NvbnRhY3QnLCB7XG4gICAgICBncm91cDogJ3JlbGF0ZWQnLFxuICAgICAgbGFiZWw6ICdSZWxhdGVkIENvbnRhY3QnLFxuICAgIH0pLFxuICAgIFxuICAgIHJlbGF0ZWRfdG9fb3Bwb3J0dW5pdHk6IEZpZWxkLmxvb2t1cCgnY3JtX29wcG9ydHVuaXR5Jywge1xuICAgICAgZ3JvdXA6ICdyZWxhdGVkJyxcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBPcHBvcnR1bml0eScsXG4gICAgfSksXG4gICAgXG4gICAgcmVsYXRlZF90b19sZWFkOiBGaWVsZC5sb29rdXAoJ2NybV9sZWFkJywge1xuICAgICAgZ3JvdXA6ICdyZWxhdGVkJyxcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBMZWFkJyxcbiAgICB9KSxcbiAgICBcbiAgICByZWxhdGVkX3RvX2Nhc2U6IEZpZWxkLmxvb2t1cCgnY3JtX2Nhc2UnLCB7XG4gICAgICBncm91cDogJ3JlbGF0ZWQnLFxuICAgICAgbGFiZWw6ICdSZWxhdGVkIENhc2UnLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFJlY3VycmVuY2UgKGZvciByZWN1cnJpbmcgdGFza3MpXG4gICAgaXNfcmVjdXJyaW5nOiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGdyb3VwOiAncmVjdXJyZW5jZScsXG4gICAgICBsYWJlbDogJ1JlY3VycmluZyBUYXNrJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgfSksXG4gICAgXG4gICAgcmVjdXJyZW5jZV90eXBlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgZ3JvdXA6ICdyZWN1cnJlbmNlJyxcbiAgICAgIGxhYmVsOiAnUmVjdXJyZW5jZSBUeXBlJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0RhaWx5JywgdmFsdWU6ICdkYWlseScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1dlZWtseScsIHZhbHVlOiAnd2Vla2x5JyB9LFxuICAgICAgICB7IGxhYmVsOiAnTW9udGhseScsIHZhbHVlOiAnbW9udGhseScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1llYXJseScsIHZhbHVlOiAneWVhcmx5JyB9LFxuICAgICAgXVxuICAgIH0pLFxuICAgIFxuICAgIHJlY3VycmVuY2VfaW50ZXJ2YWw6IEZpZWxkLm51bWJlcih7XG4gICAgICBncm91cDogJ3JlY3VycmVuY2UnLFxuICAgICAgbGFiZWw6ICdSZWN1cnJlbmNlIEludGVydmFsJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogMSxcbiAgICAgIG1pbjogMSxcbiAgICB9KSxcbiAgICBcbiAgICByZWN1cnJlbmNlX2VuZF9kYXRlOiBGaWVsZC5kYXRlKHtcbiAgICAgIGdyb3VwOiAncmVjdXJyZW5jZScsXG4gICAgICBsYWJlbDogJ1JlY3VycmVuY2UgRW5kIERhdGUnLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIEZsYWdzXG4gICAgaXNfY29tcGxldGVkOiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGdyb3VwOiAnc3lzdGVtJyxcbiAgICAgIGxhYmVsOiAnSXMgQ29tcGxldGVkJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICB9KSxcbiAgICBcbiAgICBpc19vdmVyZHVlOiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGdyb3VwOiAnc3lzdGVtJyxcbiAgICAgIGxhYmVsOiAnSXMgT3ZlcmR1ZScsXG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBTZXQgYnkgdGhlIGB0YXNrX2R1ZV9yZW1pbmRlcmAgc2NoZWR1bGUgZmxvdyBvbmNlIGEgcmVtaW5kZXIgaGFzIGZpcmVkXG4gICAgLy8gKHRoZSBzd2VlcCBkZS1kdXBzIG9uIGByZW1pbmRlcl9kYXRlYCwgd2hpY2ggaXQgY2xlYXJzOyB0aGlzIGZsYWcgaXMgdGhlXG4gICAgLy8gYXVkaXQgdHJhaWwpLCBhbmQgZGVmYXVsdGVkIHRvIGBmYWxzZWAgYnkgYHRhc2suaG9vay50c2Agb24gaW5zZXJ0LlxuICAgIC8vXG4gICAgLy8gTk9UIHJlYWRvbmx5IFx1MjAxNCBidXQgdGhlIG9sZCByZWFzb24gaGVyZSAoXCIxNi54IGRyb3BzIGZsb3cgd3JpdGVzIHRvXG4gICAgLy8gcmVhZG9ubHkgZmllbGRzXCIpIGRvZXMgbm90IHN1cnZpdmUgbWVhc3VyZW1lbnQuIFRha2VuIG9uIDE3LjEuMCxcbiAgICAvLyBSRS1UQUtFTiBvbiAxNy4yLjAgKCMxNDYwKSBhbmQgUkUtQ09ORklSTUVEIG9uIDE3LjMuMCAoIzE2NzYpIFx1MjAxNCB0aGUgcGluXG4gICAgLy8gYXQgZWFjaCBvZiB0aG9zZSB0YWtpbmdzOyBub3QgcmUtdGFrZW4gb24gMTcuNC4wIChQUiAjMTgxNCwgIzE4MDcpIG9yXG4gICAgLy8gMTcuNS4wIFx1MjAxNCBzYW1lIHZlcmRpY3QgYWxsIHRocmVlIHRpbWVzOiBgdGFza19kdWVfcmVtaW5kZXJgXG4gICAgLy8gZGVjbGFyZXMgYHJ1bkFzOiAnc3lzdGVtJ2AsIHNvIGl0cyB3cml0ZSBXT1VMRCBzdXJ2aXZlIGFcbiAgICAvLyBgcmVhZG9ubHk6IHRydWVgLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoZSBvdGhlciBoYWxmIG9mIHRoYXQgcmVhc29uIEVYUElSRUQgYXQgMTcuNC4wIGFuZCBpcyBcdTI2RDQgTk9UXG4gICAgLy8gcmVudW1iZXJlZCBoZXJlOiBcInRoZSBpbnNlcnQgcGF0aCBpcyBleGVtcHQgZnJvbSB0aGUgc3RyaXBcIiBoZWxkIHRocm91Z2hcbiAgICAvLyAxNy4zLjAgYW5kIHdhcyByZXZlcnNlZCBhcyBhIGRlY2xhcmVkIEJSRUFLSU5HIGNoYW5nZSBcdTIwMTQgdGhlIHJldGlyZW1lbnRcbiAgICAvLyBpcyByZWNvcmRlZCBpbiB0aGUgSU5TRVJULXBhdGggc2VjdGlvbiBvZlxuICAgIC8vIGB0ZXN0L3JlYWRvbmx5LXdyaXRlLXNlbWFudGljcy50ZXN0LnRzYCAoIzE0MjkpIGFuZCBpblxuICAgIC8vIGBjYW1wYWlnbl9tZW1iZXIub2JqZWN0LnRzYC4gTmVpdGhlciBoYWxmIG1vdmVzIHRoaXMgZmllbGQsIHdoaWNoIGlzIG5vdFxuICAgIC8vIGByZWFkb25seWAgYXQgYWxsLiBMZWZ0IHdyaXRhYmxlIGFzLWlzOyBmbGlwcGluZyBpdCBpcyBhIHNlcGFyYXRlXG4gICAgLy8gZGVjaXNpb24sIG5vdCBhIGNvbW1lbnQgZml4LlxuICAgIHJlbWluZGVyX3NlbnQ6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgZ3JvdXA6ICdzeXN0ZW0nLFxuICAgICAgbGFiZWw6ICdSZW1pbmRlciBTZW50JyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgfSksXG5cbiAgICAvLyBQcm9ncmVzc1xuICAgIHByb2dyZXNzX3BlcmNlbnQ6IEZpZWxkLnBlcmNlbnQoe1xuICAgICAgZ3JvdXA6ICdlZmZvcnQnLFxuICAgICAgbGFiZWw6ICdQcm9ncmVzcyAoJSknLFxuICAgICAgbWluOiAwLFxuICAgICAgbWF4OiAxMDAsXG4gICAgICBkZWZhdWx0VmFsdWU6IDAsXG4gICAgfSksXG4gICAgXG4gICAgLy8gTm8gdGltZSB0cmFja2luZy4gYGVzdGltYXRlZF9ob3Vyc2AgLyBgYWN0dWFsX2hvdXJzYCB3ZXJlIGRlY2xhcmVkIGFuZFxuICAgIC8vIGluZXJ0OiBubyByb2xsdXAgc3VtbWVkIHRoZW0gb250byBhIGNhc2Ugb3IgYW4gb3Bwb3J0dW5pdHksIG5vIHZhcmlhbmNlXG4gICAgLy8gcmVwb3J0IGNvbXBhcmVkIHRoZW0sIGFuZCBub3RoaW5nIHdhcm5lZCB3aGVuIGFjdHVhbCBvdmVycmFuIGVzdGltYXRlLlxuICAgIC8vIEVmZm9ydCBvbiBhIHRhc2sgaXMgYHByb2dyZXNzX3BlcmNlbnRgLCB3aGljaCB0aGUgdGFzayB2aWV3cyBkbyByZWFkLlxuICB9LFxuICBcbiAgLy8gQVBJIHN1cmZhY2UuIEhpc3RvcnkgXHUyMTkyIEZpZWxkLnRyYWNrSGlzdG9yeSAoQURSLTAwNTIpLlxuICBlbmFibGU6IHtcbiAgICBhcGlFbmFibGVkOiB0cnVlLFxuICB9LFxuICBcbiAgLy8gRGF0YWJhc2UgaW5kZXhlcyBmb3IgcGVyZm9ybWFuY2VcbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ3N0YXR1cyddIH0sXG4gICAgeyBmaWVsZHM6IFsncHJpb3JpdHknXSB9LFxuICAgIHsgZmllbGRzOiBbJ293bmVyX2lkJ10gfSxcbiAgICB7IGZpZWxkczogWydkdWVfZGF0ZSddIH0sXG4gIF0sXG4gIFxuICAvLyBBRFItMDA3OTogcmVuZGVyLW9ubHkgYHRpdGxlRm9ybWF0YCByZXRpcmVkIGluIGZhdm9yIG9mIGBuYW1lRmllbGRgLFxuICAvLyB3aGljaCBuYW1lcyB0aGUgcmVhbCBmaWVsZCBob2xkaW5nIHRoZSByZWNvcmQgdGl0bGUgKGhlcmU6IGBzdWJqZWN0YCkuXG4gIG5hbWVGaWVsZDogJ3N1YmplY3QnLFxuICBoaWdobGlnaHRGaWVsZHM6IFsnc3ViamVjdCcsICdzdGF0dXMnLCAncHJpb3JpdHknLCAnZHVlX2RhdGUnLCAnb3duZXJfaWQnXSxcbiAgXG4gIC8vIFJlbW92ZWQ6IGxpc3Rfdmlld3MgYW5kIGZvcm1fdmlld3MgYmVsb25nIGluIFVJIGNvbmZpZ3VyYXRpb24sIG5vdCBvYmplY3QgZGVmaW5pdGlvblxuICBcbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnY29tcGxldGVkX2RhdGVfcmVxdWlyZWQnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdDb21wbGV0ZWQgZGF0ZSBpcyByZXF1aXJlZCB3aGVuIHN0YXR1cyBpcyBDb21wbGV0ZWQnLFxuICAgICAgY29uZGl0aW9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwiY29tcGxldGVkXCIgJiYgKCFoYXMocmVjb3JkLmNvbXBsZXRlZF9kYXRlKSB8fCBpc0JsYW5rKHJlY29yZC5jb21wbGV0ZWRfZGF0ZSkpYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdyZWN1cnJlbmNlX2ZpZWxkc19yZXF1aXJlZCcsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ1JlY3VycmVuY2UgdHlwZSBpcyByZXF1aXJlZCBmb3IgcmVjdXJyaW5nIHRhc2tzJyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmlzX3JlY3VycmluZykgJiYgcmVjb3JkLmlzX3JlY3VycmluZyA9PSB0cnVlICYmICghaGFzKHJlY29yZC5yZWN1cnJlbmNlX3R5cGUpIHx8IGlzQmxhbmsocmVjb3JkLnJlY3VycmVuY2VfdHlwZSkpYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdyZWxhdGVkX3RvX3JlcXVpcmVkJyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgIG1lc3NhZ2U6ICdBdCBsZWFzdCBvbmUgcmVsYXRlZCByZWNvcmQgc2hvdWxkIGJlIHNlbGVjdGVkJyxcbiAgICAgIGNvbmRpdGlvbjogUGAoIWhhcyhyZWNvcmQucmVsYXRlZF90b19hY2NvdW50KSB8fCBpc0JsYW5rKHJlY29yZC5yZWxhdGVkX3RvX2FjY291bnQpKSAmJiAoIWhhcyhyZWNvcmQucmVsYXRlZF90b19jb250YWN0KSB8fCBpc0JsYW5rKHJlY29yZC5yZWxhdGVkX3RvX2NvbnRhY3QpKSAmJiAoIWhhcyhyZWNvcmQucmVsYXRlZF90b19vcHBvcnR1bml0eSkgfHwgaXNCbGFuayhyZWNvcmQucmVsYXRlZF90b19vcHBvcnR1bml0eSkpICYmICghaGFzKHJlY29yZC5yZWxhdGVkX3RvX2xlYWQpIHx8IGlzQmxhbmsocmVjb3JkLnJlbGF0ZWRfdG9fbGVhZCkpICYmICghaGFzKHJlY29yZC5yZWxhdGVkX3RvX2Nhc2UpIHx8IGlzQmxhbmsocmVjb3JkLnJlbGF0ZWRfdG9fY2FzZSkpYCxcbiAgICB9LFxuICBdLFxuICBcbiAgLy8gXHUyNkEwXHVGRTBGIE5vIGB3b3JrZmxvd3NbXWAgaGVyZSwgYW5kIG5vbmUgaXMgcG9zc2libGU6IG9iamVjdCBgd29ya2Zsb3dzW11gIHdlcmVcbiAgLy8gcmVtb3ZlZCBmcm9tIHRoZSBwbGF0Zm9ybS4gRmllbGQgdXBkYXRlcyBsaXZlIGluIHRoaXMgb2JqZWN0J3MgYCouaG9vay50c2A7XG4gIC8vIHNjaGVkdWxlZCBzdGF0dXMgZmxpcHMgYW5kIG5vdGlmaWNhdGlvbnMgbGl2ZSBpbiBgc3JjLyovZmxvd3MvKi5mbG93LnRzYC5cbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvYWN0aW9ucy9hY3Rpdml0eS1hY3Rpb25zLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FjdGlvbnNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvYWN0aW9ucy9hY3Rpdml0eS1hY3Rpb25zLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEFjdGlvbiB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcbmltcG9ydCAqIGFzIHNhbGVzT2JqZWN0cyBmcm9tICcuLi9vYmplY3RzJztcblxuLyoqXG4gKiBBY3Rpdml0eS1sb2dnaW5nIGFjdGlvbnMgXHUyMDE0IGBsb2dfY2FsbGAsIGBsb2dfbWVldGluZ2AsIGBzY2hlZHVsZV9tZWV0aW5nYC5cbiAqXG4gKiAoSXQgd2FzIGBzcmMvYWN0aW9ucy9nbG9iYWwuYWN0aW9ucy50c2AgdW50aWwgdGhlIEFEUi0wMTMwIGxheW91dDogbm90aGluZ1xuICogaGVyZSBpcyBhICpnbG9iYWwqIGFjdGlvbiwgYW5kIG5vdGhpbmcgY2FuIGJlIFx1MjAxNCBzZWUgdGhlIGRpc3BhdGNoZXIgbm90ZSBvblxuICogYG9iamVjdE5hbWVgIGJlbG93LiBUaGUgbmFtZSBub3cgc2F5cyB3aGF0IGl0IGJ1aWxkcy4pXG4gKlxuICogIyBXaHkgdGhlIGZhY3RvcnkgbGl2ZXMgaW4gdGhlIFNBTEVTIHBhY2thZ2VcbiAqXG4gKiBGb3VyIG9mIHRoZSBmaXZlIGhvc3Qgb2JqZWN0cyBcdTIwMTQgYGNybV9sZWFkYCwgYGNybV9jb250YWN0YCwgYGNybV9hY2NvdW50YCxcbiAqIGBjcm1fb3Bwb3J0dW5pdHlgIFx1MjAxNCBhcmUgc2FsZXMnLCBhcyBpcyB0aGUgYGNybV9ldmVudGAgZXZlcnkgYWN0aW9uIHdyaXRlcy5cbiAqIFRoZSBmaWZ0aCwgYGNybV9jYXNlYCwgaXMgc2VydmljZSdzLCBhbmQgdW5kZXIgcGxhbiBpdGVtIDcgYSBzb3VyY2UgbW9yZSB0aGFuXG4gKiBvbmUgcGFja2FnZSBuZWVkcyB0YWtlcyB0aGUgbG93ZXN0IHBhY2thZ2UgYWxsIGl0cyBjb25zdW1lcnMgZGVwZW5kIG9uLiBTb1xuICogdGhlIGZhY3RvcnkgaXMgaGVyZSBhbmQgYHNyYy9zZXJ2aWNlL2FjdGlvbnMvY2FzZS1hY3Rpdml0eS5hY3Rpb25zLnRzYFxuICogaW5zdGFudGlhdGVzIHRoZSBjYXNlIHRyaXBsZSBmcm9tIGl0IGFsb25nIHRoZSBzZXJ2aWNlIC0+IHNhbGVzIGVkZ2UuIE9uZVxuICogY29weSwgbmV2ZXIgdHdvLlxuICpcbiAqICMgVGhlIHR3byBydWxlcyB0aGlzIGZhbWlseSBleGlzdHMgdG8gaG9sZFxuICpcbiAqICAxLiAqKlNjb3BlLioqIFRoZSBhY3Rpb25zIGFyZSBHRU5FUkFURUQgcGVyIG9iamVjdDogb25lIHJlZ2lzdGVyZWQgYWN0aW9uXG4gKiAgICAgcGVyIChraW5kIFx1MDBENyBvYmplY3QpLiBcdTI2RDQgTmV2ZXIgcGluIGFuIGFjdGl2aXR5IGFjdGlvbiB0byBhIHNpbmdsZSBvYmplY3QsXG4gKiAgICAgYW5kIG5ldmVyIGF1dGhvciBvbmUgd2l0aG91dCBhbiBgb2JqZWN0TmFtZWAgXHUyMDE0IHRoZSBydW50aW1lIGtleXMgdGhlXG4gKiAgICAgcmVnaXN0cnkgb24gYDxvYmplY3ROYW1lPjo8YWN0aW9uLm5hbWU+YCBhbmQgdGhlIGRpc3BhdGNoZXIgcHJvYmVzXG4gKiAgICAgYDxvYmplY3ROYW1lPmAgZmlyc3QsIHNvIGEgc2luZ2xlLW9iamVjdCBhY3Rpb24gaXMgdW5yZWFjaGFibGUgZnJvbSBldmVyeVxuICogICAgIG90aGVyIG9iamVjdCBhIHJlcCBzZWxscyB0bywgYW5kIGFuIG9iamVjdC1sZXNzIG9uZSBpcyB1bnJlYWNoYWJsZVxuICogICAgIGV2ZXJ5d2hlcmUuXG4gKiAgMi4gKipTaGFwZS4qKiBFYWNoIG9mIHRoZXNlIGFjdGlvbnMgaW5zZXJ0cyBhIHJlYWwgYGNybV9ldmVudGAsIHJlYWxcbiAqICAgICBgY3JtX2V2ZW50X2F0dGVuZGVlYCByb3dzLCBhbmQga2VlcHMgdGhlIGBzeXNfYWN0aXZpdHlgIHJvdyBwdXJlbHkgYXMgdGhlXG4gKiAgICAgdW5pZmllZC10aW1lbGluZSBwb2ludGVyIChBRFItMDA1MiBgc291cmNlX29iamVjdGAgLyBgc291cmNlX2lkYCksIHRoZVxuICogICAgIHNhbWUgd2F5IGBzZW5kX2VtYWlsYCBwb2ludHMgYXQgaXRzIGBzeXNfZW1haWxgLiBcdTI2RDQgTmV2ZXIgbW92ZSB0aGF0XG4gKiAgICAgc3RydWN0dXJlIGJhY2sgaW50byBhIGBtZXRhZGF0YWAgSlNPTiBibG9iOiBhIGJsb2IgaXMgbm90IGRhdGEgXHUyMDE0IG5vIHZpZXdcbiAqICAgICBmaWx0ZXJzIGl0LCBubyBkYXRhc2V0IGdyb3VwcyBieSBpdCwgbm8gcmVwb3J0IGNvdW50cyBpdC5cbiAqXG4gKiAjIExpdmUgcGxhdGZvcm0gd29ya2Fyb3VuZFxuICpcbiAqIGBzY2hlZHVsZV9tZWV0aW5nYCBjb2xsZWN0cyBpdHMgc3RhcnQgYXMgYSBgZGF0ZWAgKyBgdGltZWAgUEFJUiByYXRoZXIgdGhhblxuICogYXMgb25lIGBkYXRldGltZWAgcGFyYW0sIGJlY2F1c2UgYSBgZGF0ZXRpbWVgIGFjdGlvbiBwYXJhbSBjYW5ub3QgYmVcbiAqIHN1Ym1pdHRlZCBmcm9tIHRoZSBDb25zb2xlIGF0IGFsbCAob2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjNTA2MSkuIEJvdGggdGhlXG4gKiBib2R5IGFuZCB0aGUgcGFyYW0gbGlzdCBjYXJyeSB0aGUgZnVsbCByZWFzb25pbmcgYW5kIHRoZSByZXZlcnQgaW5zdHJ1Y3Rpb24uXG4gKlxuICogVGhlIHJlY2VuY3kgYnViYmxlIChgY3JtX2FjY291bnQubGFzdF9hY3Rpdml0eV9kYXRlYCxcbiAqIGBjcm1fbGVhZC5sYXN0X2NvbnRhY3RlZF9kYXRlYCwgYGNybV9jb250YWN0Lmxhc3RfY29udGFjdGVkX2RhdGVgKSBpc1xuICogZGVsaWJlcmF0ZWx5IE5PVCB3cml0dGVuIGhlcmUuIEl0IGhhbmdzIG9mZiBgY3JtX2V2ZW50YCdzIG93biBob29rLCBzbyBhblxuICogZXZlbnQgY3JlYXRlZCBmcm9tIHRoZSBjYWxlbmRhciwgZnJvbSBhbiBpbXBvcnQsIG9yIGZyb20gYSBmdXR1cmUgZmxvdyBidW1wc1xuICogcmVjZW5jeSBleGFjdGx5IGxpa2Ugb25lIGNyZWF0ZWQgZnJvbSB0aGlzIGJ1dHRvbi4gT25lIHdyaXRlciwgbm90IG9uZSBwZXJcbiAqIGVudHJ5IHBvaW50LlxuICovXG5cbi8qKlxuICogYG9iamVjdE5hbWVgIFx1MjE5MiB0aGUgb2JqZWN0J3MgREVDTEFSRUQgYG5hbWVGaWVsZGAsIGRlcml2ZWQgZnJvbSB0aGUgb2JqZWN0XG4gKiBkZWZpbml0aW9ucyByYXRoZXIgdGhhbiBoYW5kLWxpc3RlZC5cbiAqXG4gKiBcdTI2RDQgTmV2ZXIgc3RhbXAgYHJlY29yZF9sYWJlbGAgZnJvbSBgY3R4LnJlY29yZD8ubmFtZWA6IGBuYW1lYCBpcyBub3QgdGhlXG4gKiBkaXNwbGF5IGZpZWxkIG9uIGFsbW9zdCBhbnl0aGluZyBoZXJlIFx1MjAxNCBtb3N0IG9iamVjdHMgZGVjbGFyZSBhIGRpZmZlcmVudFxuICogYG5hbWVGaWVsZGAgKGBkaXNwbGF5X3RpdGxlYCwgYGZ1bGxfbmFtZWAsIGBzdWJqZWN0YCwgYGNvbnRyYWN0X251bWJlcmAsIFx1MjAyNilcbiAqIGFuZCBoYXZlIG5vIGBuYW1lYCBjb2x1bW4gYXQgYWxsLCBzbyB0aGUgbGFiZWwgbGFuZHMgYG51bGxgLlxuICpcbiAqIERlcml2aW5nIHRoZSBtYXAga2VlcHMgaXQgY29ycmVjdCB3aGVuIGFuIG9iamVjdCByZXRhcmdldHMgaXRzIGBuYW1lRmllbGRgLlxuICogVGhlIGxvb2t1cCBoYXBwZW5zIGF0IEFVVEhPUklORyB0aW1lIChlYWNoIGFjdGlvbiBrbm93cyBpdHMgb3duIG9iamVjdCksIHNvXG4gKiB0aGUgYm9keSBjYXJyaWVzIHRoZSByZXNvbHZlZCBmaWVsZCBuYW1lIHJhdGhlciB0aGFuIGEgdGFibGUgaXQgY291bGQgbWlzc1xuICogb24uXG4gKlxuICogVGhlIG9iamVjdCBkZWZpbml0aW9ucyBhcmUgcGFzc2VkIElOIHJhdGhlciB0aGFuIGltcG9ydGVkIGhlcmUsIGJlY2F1c2UgdGhlXG4gKiBmaXZlIGhvc3Qgb2JqZWN0cyBubyBsb25nZXIgbGl2ZSBpbiBvbmUgZGlyZWN0b3J5OiBgY3JtX2Nhc2VgIGlzIHNlcnZpY2Uncy5cbiAqIEEgcGFja2FnZSBoYW5kcyB7QGxpbmsgYWN0aXZpdHlBY3Rpb25zRm9yfSBpdHMgb3duIG9iamVjdCBiYXJyZWwsIHNvIHRoZSBtYXBcbiAqIGlzIHN0aWxsIGRlcml2ZWQgZnJvbSB0aGUgcmVhbCBkZWZpbml0aW9uIG9mIHRoZSBvYmplY3QgYmVpbmcgYm91bmQgYW5kIG5vXG4gKiBwYWNrYWdlIHJlYWNoZXMgaW50byBhbm90aGVyJ3MuXG4gKi9cbnR5cGUgTmFtZUZpZWxkU291cmNlID0geyBuYW1lPzogdW5rbm93bjsgbmFtZUZpZWxkPzogdW5rbm93biB9O1xuXG5jb25zdCBuYW1lRmllbGRNYXAgPSAob2JqZWN0RGVmczogUmVjb3JkPHN0cmluZywgTmFtZUZpZWxkU291cmNlPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPT5cbiAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC52YWx1ZXMob2JqZWN0RGVmcylcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChvKTogbyBpcyB7IG5hbWU6IHN0cmluZzsgbmFtZUZpZWxkOiBzdHJpbmcgfSA9PlxuICAgICAgICAgIHR5cGVvZiBvPy5uYW1lID09PSAnc3RyaW5nJyAmJiB0eXBlb2Ygbz8ubmFtZUZpZWxkID09PSAnc3RyaW5nJyxcbiAgICAgIClcbiAgICAgIC5tYXAoKG8pID0+IFtvLm5hbWUsIG8ubmFtZUZpZWxkXSksXG4gICk7XG5cbi8qKlxuICogVGhlIG9iamVjdHMgYSByZXAgY2FuIGxvZyBhbiBpbnRlcmFjdGlvbiBhZ2FpbnN0LCBhbmQgdGhlIGBjcm1fZXZlbnRgXG4gKiBsb29rdXAgdGhhdCByZWNvcmRzIHRoZSBsaW5rLlxuICpcbiAqIFRoZSBrZXlzIGFyZSBleGFjdGx5IGBjcm1fZXZlbnQucmVsYXRlZF90b190eXBlYCdzIG9wdGlvbnNcbiAqIChgUkVMQVRFRF9UT19UWVBFX09QVElPTlNgKSwgYW5kIHRoZSB2YWx1ZXMgZXhhY3RseSB0aGUgYHJlbGF0ZWRfdG9fKmBcbiAqIGxvb2t1cHMgdGhhdCBiYWNrIHRoZW0uIGB0ZXN0L2FjdGl2aXR5LWFjdGlvbnMudGVzdC50c2AgcGlucyB0aGF0IGFncmVlbWVudFxuICogYWdhaW5zdCB0aGUgb2JqZWN0IGRlZmluaXRpb24sIHNvIGFkZGluZyBhIHNpeHRoIGByZWxhdGVkX3RvXypgIGZpZWxkXG4gKiB3aXRob3V0IGV4dGVuZGluZyB0aGlzIG1hcCBmYWlscyBpbiBDSSBpbnN0ZWFkIG9mIHByb2R1Y2luZyBhbiBhY3Rpb24gdGhhdFxuICogd3JpdGVzIGFuIGV2ZW50IGxpbmtlZCB0byBub3RoaW5nLlxuICovXG5leHBvcnQgY29uc3QgQUNUSVZJVFlfVEFSR0VUUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgY3JtX2xlYWQ6ICdyZWxhdGVkX3RvX2xlYWQnLFxuICBjcm1fY29udGFjdDogJ3JlbGF0ZWRfdG9fY29udGFjdCcsXG4gIGNybV9hY2NvdW50OiAncmVsYXRlZF90b19hY2NvdW50JyxcbiAgY3JtX29wcG9ydHVuaXR5OiAncmVsYXRlZF90b19vcHBvcnR1bml0eScsXG4gIGNybV9jYXNlOiAncmVsYXRlZF90b19jYXNlJyxcbn07XG5cbi8qKiBKUyBzdHJpbmcgbGl0ZXJhbCwgc2FmZWx5IHF1b3RlZCBmb3Igc3BsaWNpbmcgaW50byBhIGJvZHkgc291cmNlLiAqL1xuY29uc3QgbGl0ID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT4gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuXG4vKipcbiAqIFRoZSBhY3RpbmcgdXNlcidzIGRpc3BsYXkgbmFtZSwgYXMgYWN0aW9uLWJvZHkgU09VUkNFIFRFWFQuXG4gKlxuICogU2hhcmVkIHZlcmJhdGltIGJ5IGV2ZXJ5IGJvZHkgdGhhdCB3cml0ZXMgYHN5c19hY3Rpdml0eS5hY3Rvcl9uYW1lYDogdGhlXG4gKiBhY3Rpdml0eSBmYW1pbHkgYmVsb3cgYW5kIGBzZW5kX2VtYWlsYCBpbiBgY29udGFjdC5hY3Rpb25zLnRzYC5cbiAqXG4gKiAjIFdoeSBhIHN0cmluZyBhbmQgbm90IGEgZnVuY3Rpb25cbiAqXG4gKiBBbiBhY3Rpb24gYm9keSBpcyBzaGlwcGVkIEJPRFktT05MWSBhbmQgZXZhbHVhdGVkIGluIGEgUXVpY2tKUyBzYW5kYm94IHdpdGhcbiAqIG5vIG1vZHVsZSBzY29wZSwgc28gYSBzaGFyZWQgaGVscGVyIGNhbGxlZCBmcm9tIGEgYm9keSBpcyBub3QgYSBjbG9zdXJlIGF0XG4gKiBydW50aW1lIFx1MjAxNCBpdCBpcyBhIGBSZWZlcmVuY2VFcnJvcmAgKGB0ZXN0L2hlbHBlcnMvYWN0aW9uLXNhbmRib3gudHNgIHN0YXRlc1xuICogdGhlIHNhbWUgY29uc3RyYWludCBmb3IgdGhlIHNoYXJlZCBsaW5lLWl0ZW0gcHJpY2UgZmlsbCkuIEEgc3RyaW5nIHNwbGljZWQgYXRcbiAqIEFVVEhPUklORyB0aW1lLCB3aGlsZSBOb2RlIGJ1aWxkcyB0aGUgbWV0YWRhdGEsIGhhcyBubyBzdWNoIHByb2JsZW06IHdoYXRcbiAqIHJlYWNoZXMgdGhlIHNhbmRib3ggaXMgb25lIHNlbGYtY29udGFpbmVkIGJvZHkgd2l0aCB0aGlzIHRleHQgaW5saW5lZCxcbiAqIGV4YWN0bHkgYXMgaWYgaXQgaGFkIGJlZW4gdHlwZWQgdGhlcmUuIGB0ZXN0L2FjdGlvbi1zYW5kYm94LnRlc3QudHNgIGV4ZWN1dGVzXG4gKiBib3RoIGJvZGllcyB1bmRlciB0aGUgcmVhbCBydW5uZXIgQU5EIHBpbnMgdGhhdCBib3RoIHN0aWxsIGNvbnRhaW4gdGhpc1xuICogY29uc3RhbnQsIHNvIHRoZSB0d28gY2FsbCBzaXRlcyBjYW5ub3QgZHJpZnQgaW50byBkaXNhZ3JlZWluZy5cbiAqXG4gKiAjIENvbnRyYWN0IGZvciBhIHNwbGljZSBzaXRlXG4gKlxuICogU3BsaWNlIGludG8gYSBib2R5IHRoYXQgaGFzIGFscmVhZHkgZGVjbGFyZWQgYHVzZXJJZGAgKGBjdHgudXNlcj8uaWQgPz8gbnVsbGApXG4gKiBhbmQgd2hvc2UgYWN0aW9uIGRlY2xhcmVzIGBhcGkucmVhZGAuIEFmdGVyd2FyZHMgYGFjdG9yTmFtZWAgaG9sZHMgYVxuICogbm9uLWJsYW5rIGRpc3BsYXkgbmFtZSBcdTIwMTQgdGhlIGlkIG9ubHkgYXMgYSBsYXN0IHJlc29ydCwgbmV2ZXIgYG51bGxgLlxuICovXG5leHBvcnQgY29uc3QgQUNUT1JfTkFNRV9SRVNPTFVUSU9OX1NPVVJDRSA9IGAvLyBUaGUgYWN0aW5nIHVzZXIncyBESVNQTEFZIG5hbWUsIGZvciB0aGUgc3lzX2FjdGl2aXR5IHJvdyAoIzY3MyAvICM2NzgpLlxuICAgICAgLy9cbiAgICAgIC8vIFBMQVRGT1JNIFdPUktBUk9VTkQuIFxcYGN0eC51c2VyLm5hbWVcXGAgaXMgbm90IGEgZGlzcGxheSBuYW1lIG9uIHRoZVxuICAgICAgLy8gZGlzcGF0Y2ggcGF0aCB0aGUgQ29uc29sZSB1c2VzOiB0aGUgUkVTVCBhY3Rpb24gZGlzcGF0Y2hlciBidWlsZHMgdGhlXG4gICAgICAvLyBib2R5J3MgdXNlciBhcyBcXGB7IGlkOiBlYy51c2VySWQsIG5hbWU6IGVjLnVzZXJJZCwgXHUyMDI2IH1cXGAgXHUyMDE0IHRoZSBrZXkgaXNcbiAgICAgIC8vIHByZXNlbnQgYW5kIGNhcnJpZXMgdGhlIHJhdyBpZCwgc28gXFxgY3R4LnVzZXI/Lm5hbWVcXGAgcmVhZHMgYXMgYVxuICAgICAgLy8gcGxhdXNpYmxlIHN0cmluZyBhbmQgc2lsZW50bHkgd3JvdGUgaWRzIGxpa2VcbiAgICAgIC8vIFwiZ3JERXlMb0lnbnVuSjJNN1kybXVMZ2N1UWJEVVQwczJcIiBpbnRvIFxcYHN5c19hY3Rpdml0eS5hY3Rvcl9uYW1lXFxgXG4gICAgICAvLyAoQG9iamVjdHN0YWNrL3J1bnRpbWUgMTcuMC4wLXJjLjIsIGRpc3QvaW5kZXguanM6NTM5Ny01Mzk5KS4gVGhlIE1DUFxuICAgICAgLy8gZGlzcGF0Y2hlciBkb2VzIHRyeSBhIGRpc3BsYXkgbmFtZSBmaXJzdFxuICAgICAgLy8gKFxcYGVjLnVzZXJOYW1lID8/IGVjLnVzZXJEaXNwbGF5TmFtZSA/PyBlYy51c2VySWRcXGAsIGRpc3QvaW5kZXguanM6MTc3NilcbiAgICAgIC8vIGJ1dCBub3RoaW5nIGluIHRoZSBpbnN0YWxsZWQgcGxhdGZvcm0gZXZlciBwb3B1bGF0ZXMgZWl0aGVyIGZpZWxkLCBzb1xuICAgICAgLy8gaXQgZmFsbHMgYmFjayB0byB0aGUgaWQgdG9vLlxuICAgICAgLy9cbiAgICAgIC8vIFNvIHRoZSBuYW1lIGlzIHJlc29sdmVkIEhFUkUsIGZyb20gXFxgc3lzX3VzZXIubmFtZVxcYCAodGhlIGNvbHVtbiB0aGVcbiAgICAgIC8vIHBsYXRmb3JtIGl0c2VsZiB0cmVhdHMgYXMgdGhlIHByb2ZpbGUgZGlzcGxheSBuYW1lKSwgd2l0aCB0aGUgaWQga2VwdFxuICAgICAgLy8gYXMgdGhlIGxhc3QgcmVzb3J0IFx1MjAxNCBhbiBvcGFxdWUgaWQgaXMgYmFkLCBhIGJsYW5rIGFjdG9yIGlzIHdvcnNlLlxuICAgICAgLy8gQSBuYW1lIHRoYXQgZGlmZmVycyBmcm9tIHRoZSBpZCBpcyB0YWtlbiBhcyBhbHJlYWR5LXJlc29sdmVkLCB3aGljaCBpc1xuICAgICAgLy8gd2hhdCBtYWtlcyB0aGlzIG9uZSBxdWVyeSBhbmQgbm90IGEgcXVlcnkgcGVyIGFjdGl2aXR5IHdyaXRlLlxuICAgICAgLy9cbiAgICAgIC8vIERFTEVURSBUSElTIG9uY2UgdGhlIHBsYXRmb3JtIGRlbGl2ZXJzIGEgZGlzcGxheSBuYW1lIG9uIGN0eC51c2VyLm5hbWVcbiAgICAgIC8vIGZvciBSRVNULWRpc3BhdGNoZWQgYWN0aW9uIGJvZGllczogZXZlcnkgc3BsaWNlIHNpdGUgY29sbGFwc2VzIGJhY2sgdG9cbiAgICAgIC8vIFxcYGFjdG9yX25hbWU6IGN0eC51c2VyPy5uYW1lXFxgIChvYmplY3RzdGFjay1haS9vYmplY3RzdGFjayM1MzcyKS5cbiAgICAgIGNvbnN0IGN0eE5hbWUgPSBjdHgudXNlcj8ubmFtZSA/IFN0cmluZyhjdHgudXNlci5uYW1lKS50cmltKCkgOiAnJztcbiAgICAgIGxldCBhY3Rvck5hbWUgPSBjdHhOYW1lICYmIGN0eE5hbWUgIT09IHVzZXJJZCA/IGN0eE5hbWUgOiAnJztcbiAgICAgIGlmICghYWN0b3JOYW1lICYmIHVzZXJJZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgY3R4LmFwaS5vYmplY3QoJ3N5c191c2VyJykuZmluZCh7XG4gICAgICAgICAgICB3aGVyZTogeyBpZDogdXNlcklkIH0sXG4gICAgICAgICAgICBmaWVsZHM6IFsnbmFtZSddLFxuICAgICAgICAgICAgdG9wOiAxLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHVzZXJzID0gQXJyYXkuaXNBcnJheShmb3VuZCkgPyBmb3VuZCA6IChmb3VuZD8ucmVjb3JkcyA/PyBbXSk7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB1c2Vycy5sZW5ndGggJiYgdXNlcnNbMF0ubmFtZSA/IFN0cmluZyh1c2Vyc1swXS5uYW1lKS50cmltKCkgOiAnJztcbiAgICAgICAgICBpZiAocmVzb2x2ZWQpIGFjdG9yTmFtZSA9IHJlc29sdmVkO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gQSBkZW5pZWQgb3IgdW5hdmFpbGFibGUgc3lzX3VzZXIgcmVhZCBtdXN0IG5vdCBmYWlsIHRoZSBsb2cgXHUyMDE0IHRoZVxuICAgICAgICAgIC8vIGludGVyYWN0aW9uIHRoZSByZXAganVzdCByZWNvcmRlZCBtYXR0ZXJzIG1vcmUgdGhhbiBpdHMgbGFiZWwuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghYWN0b3JOYW1lKSBhY3Rvck5hbWUgPSB1c2VySWQ7YDtcblxuLyoqXG4gKiBUaGUgYXV0aG9yZWQgZGlmZmVyZW5jZSBiZXR3ZWVuIG9uZSBhY3Rpdml0eSBhY3Rpb24gYW5kIHRoZSBuZXh0LlxuICpcbiAqIEV2ZXJ5dGhpbmcgdGhlIHZhcmlhbnRzIHNoYXJlIGxpdmVzIGluIHtAbGluayBhY3Rpdml0eUFjdGlvbn07IHRoaXMgdHlwZSBpc1xuICogdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygd2hhdCBhIHZhcmlhbnQgaXMgc3RpbGwgYWxsb3dlZCB0byBkaWZmZXIgb24uIFx1MjZENCBOZXZlclxuICogaGFuZC1jb3B5IG9uZSB2YXJpYW50IGludG8gYW5vdGhlcjogYGxvZ19jYWxsYCBhbmQgYGxvZ19tZWV0aW5nYCB3ZXJlXG4gKiBuZWFyLXZlcmJhdGltIGNvcGllcyBvbmNlIFx1MjAxNCBpZGVudGljYWwgYm9kaWVzIGFwYXJ0IGZyb20gYSBzdW1tYXJ5IHByZWZpeCBhbmRcbiAqIGEgbWV0YWRhdGEga2V5IFx1MjAxNCBhbmQgZHJpZnRlZCBpbnRvIGRpc2FncmVlaW5nIGFib3V0IHdoZXRoZXIgYGR1cmF0aW9uYCBpc1xuICogcmVxdWlyZWQuXG4gKi9cbnR5cGUgQWN0aXZpdHlTcGVjID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGljb246IHN0cmluZztcbiAgLyoqIGBjcm1fZXZlbnQudHlwZWAgZm9yIHRoZSByb3cgdGhpcyBhY3Rpb24gd3JpdGVzLiAqL1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgLyoqIGBjcm1fZXZlbnQuc3RhdHVzYDogYGhlbGRgIGZvciBzb21ldGhpbmcgdGhhdCBoYXBwZW5lZCwgYHBsYW5uZWRgIGZvciBhIGJvb2tpbmcuICovXG4gIGV2ZW50U3RhdHVzOiAnaGVsZCcgfCAncGxhbm5lZCc7XG4gIC8qKiBTdGFtcGVkIGluIGZyb250IG9mIHRoZSBhY3Rpdml0eSBzdW1tYXJ5OyBgJydgIGZvciBjYWxscy4gKi9cbiAgc3VtbWFyeVByZWZpeDogc3RyaW5nO1xuICAvKiogU3ViamVjdCB1c2VkIHdoZW4gdGhlIHVzZXIgc3VibWl0cyB0aGUgZm9ybSB3aXRoIHRoZSBmaWVsZCBibGFuay4gKi9cbiAgZGVmYXVsdFN1YmplY3Q6IHN0cmluZztcbiAgc3ViamVjdExhYmVsOiBzdHJpbmc7XG4gIG5vdGVzTGFiZWw6IHN0cmluZztcbiAgLyoqIEJvb2tlZC1pbi10aGUtZnV0dXJlIHZhcmlhbnRzIGNvbGxlY3QgYSBzdGFydCBkYXRlICsgd2FsbCBjbG9jayBhbmQgYSBsb2NhdGlvbi4gKi9cbiAgY29sbGVjdHNTY2hlZHVsZT86IGJvb2xlYW47XG4gIHN1Y2Nlc3NNZXNzYWdlOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEJ1aWxkIG9uZSBhY3Rpdml0eSBhY3Rpb24sIGJvdW5kIHRvIG9uZSBvYmplY3QuXG4gKlxuICogYGR1cmF0aW9uYCBpcyBPUFRJT05BTCBldmVyeXdoZXJlLiBJdCB3YXMgYHJlcXVpcmVkOiB0cnVlYCBmb3IgY2FsbHMgYW5kXG4gKiBgcmVxdWlyZWQ6IGZhbHNlYCBmb3IgbWVldGluZ3Mgd2l0aCBub3RoaW5nIGRvY3VtZW50aW5nIHRoZSBzcGxpdDsgb3B0aW9uYWxcbiAqIGlzIHRoZSBkaXJlY3Rpb24gdGhhdCBrZWVwcyBldmVyeSBmb3JtIHN1Ym1pdHRhYmxlLCBhbmQgaXQgaXMgdGhlIG9uZSB0aGVcbiAqIGJvZHkgaXMgd3JpdHRlbiBmb3IuXG4gKi9cbmZ1bmN0aW9uIGFjdGl2aXR5QWN0aW9uKHNwZWM6IEFjdGl2aXR5U3BlYywgb2JqZWN0TmFtZTogc3RyaW5nLCBuYW1lRmllbGQ6IHN0cmluZyk6IEFjdGlvbiB7XG4gIGNvbnN0IHJlbGF0ZWRGaWVsZCA9IEFDVElWSVRZX1RBUkdFVFNbb2JqZWN0TmFtZV07XG4gIGlmICghcmVsYXRlZEZpZWxkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYGFjdGl2aXR5QWN0aW9uOiAnJHtvYmplY3ROYW1lfScgaXMgbm90IGFuIGFjdGl2aXR5IHRhcmdldCBcdTIwMTQgZXh0ZW5kIEFDVElWSVRZX1RBUkdFVFMgYCArXG4gICAgICAgICd0b2dldGhlciB3aXRoIGNybV9ldmVudC5yZWxhdGVkX3RvX3R5cGUgYW5kIGl0cyByZWxhdGVkX3RvXyogbG9va3VwLicsXG4gICAgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG5hbWU6IHNwZWMubmFtZSxcbiAgICBsYWJlbDogc3BlYy5sYWJlbCxcbiAgICAvLyBPYmplY3Qtc2NvcGVkLCBvbmUgcmVnaXN0cmF0aW9uIHBlciBvYmplY3QuIFRoZSBydW50aW1lIHJlZ2lzdGVycyBhIGJvZHlcbiAgICAvLyBhY3Rpb24gdW5kZXIgYDxvYmplY3ROYW1lPjo8bmFtZT5gIGFuZCB0aGUgZGlzcGF0Y2hlciBwcm9iZXNcbiAgICAvLyBgPG9iamVjdE5hbWU+YCB0aGVuIGAqYDsgYSBib2R5IGFjdGlvbiB3aXRoIG5vIG9iamVjdE5hbWUgbGFuZHMgdW5kZXIgYVxuICAgIC8vICdnbG9iYWwnIGtleSBub3RoaW5nIGV2ZXIgcHJvYmVzIChcIkFjdGlvbiAnbG9nX2NhbGwnIG9uIG9iamVjdCAnKicgbm90XG4gICAgLy8gZm91bmRcIiwgdmVyaWZpZWQgMjAyNi0wNy0yOCkuIFx1MjZENCBOZXZlciBhdXRob3IgYW4gb2JqZWN0LWxlc3MgYm9keSBhY3Rpb24uXG4gICAgb2JqZWN0TmFtZSxcbiAgICBpY29uOiBzcGVjLmljb24sXG4gICAgLy8gc2NyaXB0LCBub3QgbW9kYWw6IG1vZGFsIHN1Ym1pdHMgZGllIG9uIEdFVCAvYXBpL3YxL21ldGEvb2JqZWN0Lzx0YXJnZXQ+XG4gICAgLy8gXHUyMTkyIDQwMCBpbiAxNi4xLjA7IHNjcmlwdCBhY3Rpb25zIFBPU1QgL2FwaS92MS9hY3Rpb25zLy4uLiBhbmQgZXhlY3V0ZS5cbiAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICBib2R5OiB7XG4gICAgICBsYW5ndWFnZTogJ2pzJyxcbiAgICAgIHNvdXJjZTogYFxuICAgICAgY29uc3QgT0JKRUNUX05BTUUgPSAke2xpdChvYmplY3ROYW1lKX07XG4gICAgICBjb25zdCBSRUxBVEVEX0ZJRUxEID0gJHtsaXQocmVsYXRlZEZpZWxkKX07XG4gICAgICBjb25zdCBOQU1FX0ZJRUxEID0gJHtsaXQobmFtZUZpZWxkKX07XG4gICAgICBjb25zdCBFVkVOVF9UWVBFID0gJHtsaXQoc3BlYy5ldmVudFR5cGUpfTtcbiAgICAgIGNvbnN0IEVWRU5UX1NUQVRVUyA9ICR7bGl0KHNwZWMuZXZlbnRTdGF0dXMpfTtcblxuICAgICAgY29uc3QgcmVjb3JkID0gY3R4LnJlY29yZCA/PyB7fTtcbiAgICAgIGNvbnN0IHJlY29yZElkID0gY3R4LnJlY29yZElkID8/IHJlY29yZC5pZCA/PyBudWxsO1xuICAgICAgY29uc3QgdXNlcklkID0gY3R4LnVzZXI/LmlkID8/IG51bGw7XG4gICAgICBjb25zdCBub3dJc28gPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG5cbiAgICAgICR7QUNUT1JfTkFNRV9SRVNPTFVUSU9OX1NPVVJDRX1cblxuICAgICAgY29uc3Qgc3ViamVjdCA9IGlucHV0LnN1YmplY3QgPyBTdHJpbmcoaW5wdXQuc3ViamVjdCkgOiAke2xpdChzcGVjLmRlZmF1bHRTdWJqZWN0KX07XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IGlucHV0LmR1cmF0aW9uID8gTnVtYmVyKGlucHV0LmR1cmF0aW9uKSA6IDA7XG4gICAgICBjb25zdCBub3RlcyA9IGlucHV0Lm5vdGVzID8gU3RyaW5nKGlucHV0Lm5vdGVzKSA6ICcnO1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBpbnB1dC5sb2NhdGlvbiA/IFN0cmluZyhpbnB1dC5sb2NhdGlvbikgOiAnJztcblxuICAgICAgLy8gQSBib29raW5nIHN0YXRlcyBpdHMgb3duIHN0YXJ0OyBhIGxvZyBpcyBcImp1c3Qgbm93XCIuXG4gICAgICAvL1xuICAgICAgLy8gV09SS0FST1VORCBmb3Igb2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjNTA2MSBcdTIwMTQgdGhlIHN0YXJ0IGlzIGNvbGxlY3RlZFxuICAgICAgLy8gYXMgYSBDQUxFTkRBUiBEQVkgKyBhIFdBTEwgQ0xPQ0sgKFxcYHN0YXJ0X2RhdGVcXGAgLyBcXGBzdGFydF90aW1lXFxgKSBhbmRcbiAgICAgIC8vIGpvaW5lZCBoZXJlLCBpbnN0ZWFkIG9mIGFzIG9uZSBcXGB0eXBlOiAnZGF0ZXRpbWUnXFxgIHBhcmFtLiBBIGRhdGV0aW1lXG4gICAgICAvLyBwYXJhbSBpcyB1bnVzYWJsZSBmcm9tIHRoZSBDb25zb2xlOiBpdCByZW5kZXJzIGFzIGEgem9uZS1sZXNzXG4gICAgICAvLyBcXGA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCI+XFxgIGFuZCBQT1NUcyB0aGUgcmF3IHZhbHVlXG4gICAgICAvLyAoXCIyMDI2LTA4LTEwVDE1OjAwXCIpLCB3aGljaCB0aGUgcnVudGltZSdzIGFjdGlvbi1wYXJhbSB2YWxpZGF0b3IgcmVqZWN0c1xuICAgICAgLy8gd2l0aCA0MDAgXCJleHBlY3RlZCBhbiBJU08tODYwMSBpbnN0YW50IHdpdGggZXhwbGljaXQgem9uZVwiIFx1MjAxNCBubyB1c2VyXG4gICAgICAvLyBpbnB1dCBjYW4gcGFzcy4gXFxgZGF0ZVxcYCBhbmQgXFxgdGltZVxcYCBhcmUgdGhlIHR3byBwYXJhbSB0eXBlcyB3aG9zZVxuICAgICAgLy8gcmVuZGVyZXIgb3V0cHV0IChcIllZWVktTU0tRERcIiAvIFwiSEg6TU1cIikgdGhlIHZhbGlkYXRvciBhY2NlcHRzIHZlcmJhdGltLFxuICAgICAgLy8gc28gdGhlIHBhaXIgaXMgc3VibWl0dGFibGUgd2hlcmUgdGhlIHNpbmdsZSBkYXRldGltZSBuZXZlciB3YXMuXG4gICAgICAvL1xuICAgICAgLy8gVElNRVpPTkU6IHRoZSB3YWxsIGNsb2NrIGlzIGludGVycHJldGVkIGFzICoqVVRDKiosIGFuZCBib3RoIHBhcmFtXG4gICAgICAvLyBsYWJlbHMgc2F5IHNvLiBVVEMgaXMgdGhlIG9ubHkgem9uZSB0aGlzIGJvZHkgY2FuIGFwcGx5IGRldGVybWluaXN0aWNhbGx5XG4gICAgICAvLyBcdTIwMTQgdGhlIHNhbmRib3ggY29udGV4dCBjYXJyaWVzIG5vIHVzZXIgb3Igb3JnIHRpbWV6b25lIChcXGBjdHgudXNlclxcYCBpc1xuICAgICAgLy8gaWQvbmFtZS9lbWFpbCksIGFuZCByZWFkaW5nIHRoZSBzZXJ2ZXIncyBsb2NhbCB6b25lIHdvdWxkIG1ha2UgdGhlIHNhbWVcbiAgICAgIC8vIGlucHV0IG1lYW4gZGlmZmVyZW50IGluc3RhbnRzIG9uIGRpZmZlcmVudCBob3N0cyBhbmQgaW4gdGVzdHMuIEV2ZXJ5dGhpbmdcbiAgICAgIC8vIGVsc2UgdGhpcyBhcHAgd3JpdGVzIGlzIGxpa2V3aXNlIGEgVVRDIGluc3RhbnQgKFxcYG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxcYCkuXG4gICAgICAvL1xuICAgICAgLy8gV2hlbiAjNTA2MSBsYW5kcyAodGhlIENvbnNvbGUgc2VyaWFsaXppbmcgZGF0ZXRpbWUtbG9jYWwgaW4gdGhlXG4gICAgICAvLyBicm93c2VyJ3Mgem9uZSksIHRoaXMgcmV2ZXJ0cyB0byBPTkUgXFxgdHlwZTogJ2RhdGV0aW1lJ1xcYCBwYXJhbSBhbmQgdGhlXG4gICAgICAvLyB6b25lIGJlY29tZXMgdGhlIHVzZXIncyBvd24gXHUyMDE0IHNlZSBcXGBjb2xsZWN0c1NjaGVkdWxlXFxgIGluIHRoaXMgZmlsZS5cbiAgICAgIGxldCBzdGFydElzbyA9IG5vd0lzbztcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGlucHV0LnN0YXJ0X2RhdGUgPyBTdHJpbmcoaW5wdXQuc3RhcnRfZGF0ZSkudHJpbSgpIDogJyc7XG4gICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGlucHV0LnN0YXJ0X3RpbWUgPyBTdHJpbmcoaW5wdXQuc3RhcnRfdGltZSkudHJpbSgpIDogJzAwOjAwJztcbiAgICAgICAgLy8gJ0hIOk1NJyBhbmQgJ0hIOk1NOlNTJyBhcmUgYm90aCBzaGFwZXMgdGhlIHZhbGlkYXRvciBsZXRzIHRocm91Z2guXG4gICAgICAgIGNvbnN0IGNsb2NrID0gc3RhcnRUaW1lLmxlbmd0aCA9PT0gNSA/IHN0YXJ0VGltZSArICc6MDAnIDogc3RhcnRUaW1lO1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgRGF0ZShzdGFydERhdGUgKyAnVCcgKyBjbG9jayArICcuMDAwWicpO1xuICAgICAgICAvLyBBbiB1bnBhcnNlYWJsZSB2YWx1ZSBmYWxscyBiYWNrIHRvIG5vdyByYXRoZXIgdGhhbiB3cml0aW5nIE5hTiBpbnRvIGFcbiAgICAgICAgLy8gcmVxdWlyZWQgY29sdW1uLlxuICAgICAgICBpZiAoIWlzTmFOKHBhcnNlZC5nZXRUaW1lKCkpKSBzdGFydElzbyA9IHBhcnNlZC50b0lTT1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICAvLyAxLiB0aGUgaW50ZXJhY3Rpb24gaXRzZWxmLCBhcyBhIHF1ZXJ5YWJsZSByZWNvcmQuXG4gICAgICBjb25zdCBldmVudERvYyA9IHtcbiAgICAgICAgc3ViamVjdDogc3ViamVjdCxcbiAgICAgICAgdHlwZTogRVZFTlRfVFlQRSxcbiAgICAgICAgc3RhdHVzOiBFVkVOVF9TVEFUVVMsXG4gICAgICAgIHN0YXJ0X2RhdGV0aW1lOiBzdGFydElzbyxcbiAgICAgICAgLy8gTG9hZC1iZWFyaW5nLCBub3QgZGVjb3JhdGlvbjogYW4gYWN0aW9uIGJvZHkgZXhlY3V0ZXMgd2l0aFxuICAgICAgICAvLyBpc1N5c3RlbTogdHJ1ZSAocnVudGltZSBidWlsZEFjdGlvbkV4ZWN1dGlvbkNvbnRleHQpLCB3aGljaFxuICAgICAgICAvLyBzaG9ydC1jaXJjdWl0cyB0aGUgc2VjdXJpdHkgbWlkZGxld2FyZSBcdTIwMTQgc28gdGhlIGluc2VydC10aW1lXG4gICAgICAgIC8vIGF1dG8tc3RhbXAgb2Ygb3duZXJfaWQgbmV2ZXIgZmlyZXMgaGVyZS4gT21pdHRpbmcgaXQgd291bGQgbGFuZCB0aGVcbiAgICAgICAgLy8gaW50ZXJhY3Rpb24gb3duZXJsZXNzLCBpLmUuIGludmlzaWJsZSBpbiBcIk15IFx1MjAyNlwiIGFuZCB1bmVkaXRhYmxlIHVuZGVyXG4gICAgICAgIC8vIGEgcHJpdmF0ZSBPV0QgKCM1NDgsIHRoZSAjNjIyIGZhaWx1cmUgbW9kZSkuXG4gICAgICAgIG93bmVyX2lkOiB1c2VySWQsXG4gICAgICAgIHJlbGF0ZWRfdG9fdHlwZTogT0JKRUNUX05BTUUsXG4gICAgICB9O1xuICAgICAgaWYgKGR1cmF0aW9uID4gMCkgZXZlbnREb2MuZHVyYXRpb25fbWludXRlcyA9IGR1cmF0aW9uO1xuICAgICAgaWYgKGxvY2F0aW9uKSBldmVudERvYy5sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgICAgaWYgKG5vdGVzKSBldmVudERvYy5kZXNjcmlwdGlvbiA9IG5vdGVzO1xuICAgICAgaWYgKHJlY29yZElkKSBldmVudERvY1tSRUxBVEVEX0ZJRUxEXSA9IHJlY29yZElkO1xuICAgICAgY29uc3QgZXZlbnQgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2V2ZW50JykuaW5zZXJ0KGV2ZW50RG9jKTtcbiAgICAgIGNvbnN0IGV2ZW50SWQgPSBldmVudD8uaWQgPz8gbnVsbDtcblxuICAgICAgLy8gMi4gYXR0ZW5kZWVzLCBhcyByb3dzIFx1MjAxNCB0aGUgcG9pbnQgb2YgIzU5Mi5cbiAgICAgIC8vIEEgbXVsdGktbG9va3VwIHBhcmFtIG1heSBhcnJpdmUgYXMgYW4gYXJyYXkgb3IsIG9uIGEgc3VyZmFjZSB0aGF0XG4gICAgICAvLyByZW5kZXJzIGl0IHNpbmdsZS12YWx1ZWQsIGFzIG9uZSBzY2FsYXIuIE5vcm1hbGlzaW5nIGJvdGggaXMgbm90IGFcbiAgICAgIC8vIGxlbmllbnQgcGFyc2Ugb2YgYXV0aG9yZWQgbWV0YWRhdGE6IGl0IGlzIHRoZSBjb25zb2xlJ3Mgb3duIGlucHV0XG4gICAgICAvLyBzaGFwZSwgd2hpY2ggdGhpcyBib2R5IGRvZXMgbm90IGNvbnRyb2wuXG4gICAgICBjb25zdCB0b0xpc3QgPSAodikgPT4ge1xuICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB2ID09PSB1bmRlZmluZWQgfHwgdiA9PT0gJycpIHJldHVybiBbXTtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodikgPyB2IDogW3ZdO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGF0dGVuZGVlcyA9IFtdO1xuICAgICAgaWYgKHVzZXJJZCkge1xuICAgICAgICBhdHRlbmRlZXMucHVzaCh7IGF0dGVuZGVlX3R5cGU6ICd1c2VyJywgc3lzX3VzZXI6IHVzZXJJZCwgaXNfb3JnYW5pemVyOiB0cnVlLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9KTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSByZWNvcmQgdGhlIGFjdGlvbiB3YXMgZmlyZWQgZnJvbSBJUyBhbiBhdHRlbmRlZSB3aGVuIGl0IGlzIGFcbiAgICAgIC8vIHBlcnNvbi4gT24gYW4gYWNjb3VudCAvIG9wcG9ydHVuaXR5IC8gY2FzZSBpdCBpcyBub3QsIHNvIG5vdGhpbmcgaXNcbiAgICAgIC8vIGludmVudGVkIGZvciBpdCBcdTIwMTQgdGhlIGV2ZW50J3MgcmVsYXRlZF90b18qIGxpbmsgYWxyZWFkeSByZWNvcmRzIGl0LlxuICAgICAgaWYgKE9CSkVDVF9OQU1FID09PSAnY3JtX2NvbnRhY3QnICYmIHJlY29yZElkKSB7XG4gICAgICAgIGF0dGVuZGVlcy5wdXNoKHsgYXR0ZW5kZWVfdHlwZTogJ2NvbnRhY3QnLCBjcm1fY29udGFjdDogcmVjb3JkSWQsIHJlc3BvbnNlOiAnbm9fcmVzcG9uc2UnIH0pO1xuICAgICAgfVxuICAgICAgaWYgKE9CSkVDVF9OQU1FID09PSAnY3JtX2xlYWQnICYmIHJlY29yZElkKSB7XG4gICAgICAgIGF0dGVuZGVlcy5wdXNoKHsgYXR0ZW5kZWVfdHlwZTogJ2xlYWQnLCBjcm1fbGVhZDogcmVjb3JkSWQsIHJlc3BvbnNlOiAnbm9fcmVzcG9uc2UnIH0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjIG9mIHRvTGlzdChpbnB1dC5hdHRlbmRlZV9jb250YWN0cykpIHtcbiAgICAgICAgYXR0ZW5kZWVzLnB1c2goeyBhdHRlbmRlZV90eXBlOiAnY29udGFjdCcsIGNybV9jb250YWN0OiBTdHJpbmcoYyksIHJlc3BvbnNlOiAnbm9fcmVzcG9uc2UnIH0pO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB1IG9mIHRvTGlzdChpbnB1dC5hdHRlbmRlZV91c2VycykpIHtcbiAgICAgICAgYXR0ZW5kZWVzLnB1c2goeyBhdHRlbmRlZV90eXBlOiAndXNlcicsIHN5c191c2VyOiBTdHJpbmcodSksIHJlc3BvbnNlOiAnbm9fcmVzcG9uc2UnIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWVuID0ge307XG4gICAgICBjb25zdCBhdHRlbmRlZUlkcyA9IFtdO1xuICAgICAgZm9yIChjb25zdCBhIG9mIGF0dGVuZGVlcykge1xuICAgICAgICBjb25zdCB3aG8gPSBhLnN5c191c2VyID8/IGEuY3JtX2NvbnRhY3QgPz8gYS5jcm1fbGVhZCA/PyAnJztcbiAgICAgICAgY29uc3Qga2V5ID0gYS5hdHRlbmRlZV90eXBlICsgJzonICsgd2hvO1xuICAgICAgICBpZiAoc2VlbltrZXldKSBjb250aW51ZTtcbiAgICAgICAgc2VlbltrZXldID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgZG9jID0gT2JqZWN0LmFzc2lnbih7fSwgYSwgeyBjcm1fZXZlbnQ6IGV2ZW50SWQsIGludml0ZWRfZGF0ZTogbm93SXNvIH0pO1xuICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2V2ZW50X2F0dGVuZGVlJykuaW5zZXJ0KGRvYyk7XG4gICAgICAgIGlmIChyb3c/LmlkKSBhdHRlbmRlZUlkcy5wdXNoKHJvdy5pZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIHRoZSB1bmlmaWVkLXRpbWVsaW5lIHBvaW50ZXIuXG4gICAgICAvLyBcXGBtZXRhZGF0YVxcYCBubyBsb25nZXIgY2FycmllcyB0aGUgYXR0ZW5kZWUgbGlzdDogaXQgaXMgYSBkaXNwbGF5IGhpbnRcbiAgICAgIC8vIGJlc2lkZSBhIHJlYWwgcmVjb3JkIG5vdywgbm90IHRoZSByZWNvcmQgaXRzZWxmLiBBRFItMDA1MlxuICAgICAgLy8gc291cmNlX29iamVjdC9zb3VyY2VfaWQgaXMgdGhlIHF1ZXJ5YWJsZSBkcmlsbCB0byB0aGUgY3JtX2V2ZW50IHJvdy5cbiAgICAgIGNvbnN0IHN1bW1hcnkgPSBkdXJhdGlvbiA/IHN1YmplY3QgKyAnICgnICsgZHVyYXRpb24gKyAnIG1pbiknIDogc3ViamVjdDtcbiAgICAgIGNvbnN0IGFjdGl2aXR5ID0gYXdhaXQgY3R4LmFwaS5vYmplY3QoJ3N5c19hY3Rpdml0eScpLmluc2VydCh7XG4gICAgICAgIHR5cGU6IEVWRU5UX1NUQVRVUyA9PT0gJ2hlbGQnID8gJ2NvbXBsZXRlZCcgOiAnc2NoZWR1bGVkJyxcbiAgICAgICAgc3VtbWFyeTogJHtsaXQoc3BlYy5zdW1tYXJ5UHJlZml4KX0gKyBzdW1tYXJ5LFxuICAgICAgICBhY3Rvcl9pZDogdXNlcklkLFxuICAgICAgICBhY3Rvcl9uYW1lOiBhY3Rvck5hbWUsXG4gICAgICAgIG9iamVjdF9uYW1lOiBPQkpFQ1RfTkFNRSxcbiAgICAgICAgcmVjb3JkX2lkOiByZWNvcmRJZCxcbiAgICAgICAgLy8gIzUxNCBpdGVtIDI6IHRoZSBvYmplY3QncyBERUNMQVJFRCBuYW1lRmllbGQsIG5vdCBhIGhhcmRjb2RlZCBuYW1lLlxuICAgICAgICByZWNvcmRfbGFiZWw6IHJlY29yZFtOQU1FX0ZJRUxEXSA/PyBudWxsLFxuICAgICAgICBzb3VyY2Vfb2JqZWN0OiAnY3JtX2V2ZW50JyxcbiAgICAgICAgc291cmNlX2lkOiBldmVudElkLFxuICAgICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGtpbmQ6IEVWRU5UX1RZUEUsXG4gICAgICAgICAgZHVyYXRpb25fbWludXRlczogZHVyYXRpb24sXG4gICAgICAgICAgbm90ZXM6IG5vdGVzLFxuICAgICAgICAgIGF0dGVuZGVlX2NvdW50OiBhdHRlbmRlZUlkcy5sZW5ndGgsXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIDQuIFNMQSBmaXJzdC1yZXNwb25zZSBzdGFtcCBcdTIwMTQgTk9UIGhlcmUuICM1NzUgQjIgb3JpZ2luYWxseSBzdGFtcGVkXG4gICAgICAvLyBcXGBjcm1fY2FzZS5maXJzdF9yZXNwb25zZV9kYXRlXFxgIGZyb20gdGhpcyBib2R5LCB3aGljaCBtZWFudCB0aGUgbWV0cmljXG4gICAgICAvLyB3YXMgb25seSBldmVyIHdyaXR0ZW4gd2hlbiB0aGUgaW50ZXJhY3Rpb24gd2FzIHJlY29yZGVkIHRocm91Z2ggdGhlIHR3b1xuICAgICAgLy8gYnV0dG9ucyB0aGlzIGZhY3RvcnkgYnVpbGRzOyBhbiBldmVudCBjcmVhdGVkIGFueSBvdGhlciB3YXkgbGVmdCBpdFxuICAgICAgLy8gbnVsbCwgdW5kZXIgYSBjb21tZW50IGFza2luZyBldmVyeSBmdXR1cmUgYXV0aG9yIHRvIHJlbWVtYmVyLiAjNTk1XG4gICAgICAvLyBtb3ZlZCB0aGUgc3RhbXAgdG8gXFxgZXZlbnRfYWN0aXZpdHlfYnViYmxlXFxgIGluXG4gICAgICAvLyBcXGBzcmMvc2FsZXMvb2JqZWN0cy9ldmVudC5ob29rLnRzXFxgLCB3aGljaCBhbHJlYWR5IGZpcmVzIG9uIGV4YWN0bHkgdGhlXG4gICAgICAvLyBjb25kaXRpb24gdGhhdCBtYXR0ZXJzIChcImEgaGVsZCBldmVudCwgb24gaXRzIHRyYW5zaXRpb24gaW50byBoZWxkXCIpXG4gICAgICAvLyBhbmQgYWxyZWFkeSByZXNvbHZlcyBcXGByZWxhdGVkX3RvX2Nhc2VcXGAuIFN0ZXAgMSBhYm92ZSB3cml0ZXMgdGhhdFxuICAgICAgLy8gZXZlbnQsIHNvIHRoaXMgYWN0aW9uIHN0aWxsIHN0YW1wcyB0aGUgY2FzZSBcdTIwMTQgdGhyb3VnaCBvbmUgd3JpdGVyXG4gICAgICAvLyBpbnN0ZWFkIG9mIGEgY29udmVudGlvbi4gRG8gbm90IHJlaW50cm9kdWNlIGEgY29weSBoZXJlOiB0d28gd3JpdGVyc1xuICAgICAgLy8gcmFjaW5nIG9uIGEgXCJmaXJzdFwiIHRpbWVzdGFtcCBpcyBob3cgaXQgYmVjb21lcyBhIFwibGFzdFwiIG9uZS5cblxuICAgICAgcmV0dXJuIHsgZXZlbnRJZDogZXZlbnRJZCwgYWN0aXZpdHlJZDogYWN0aXZpdHk/LmlkID8/IG51bGwsIGF0dGVuZGVlSWRzOiBhdHRlbmRlZUlkcyB9O1xuICAgIGAsXG4gICAgICBjYXBhYmlsaXRpZXM6IFsnYXBpLnJlYWQnLCAnYXBpLndyaXRlJ10sXG4gICAgICB0aW1lb3V0TXM6IDUwMDAsXG4gICAgfSxcbiAgICBsb2NhdGlvbnM6IFsncmVjb3JkX2hlYWRlcicsICdsaXN0X2l0ZW0nLCAncmVjb3JkX3JlbGF0ZWQnXSxcbiAgICBwYXJhbXM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3N1YmplY3QnLFxuICAgICAgICBsYWJlbDogc3BlYy5zdWJqZWN0TGFiZWwsXG4gICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICB9LFxuICAgICAgLy8gV09SS0FST1VORCBvYmplY3RzdGFjay1haS9vYmplY3RzdGFjayM1MDYxIFx1MjAxNCBvbmUgYHR5cGU6ICdkYXRldGltZSdgXG4gICAgICAvLyBwYXJhbSAoXCJTdGFydHMgQXRcIikgaXMgd2hhdCB0aGlzIFdBTlRTIHRvIGJlLCBhbmQgaXQgaXMgdW51c2FibGU6IHRoZVxuICAgICAgLy8gQ29uc29sZSByZW5kZXJzIGl0IGFzIGEgem9uZS1sZXNzIGA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCI+YCBhbmRcbiAgICAgIC8vIFBPU1RzIHRoZSByYXcgdmFsdWUsIHdoaWNoIHRoZSBhY3Rpb24tcGFyYW0gdmFsaWRhdG9yIHJlamVjdHMgd2l0aCBhXG4gICAgICAvLyA0MDAgKGBleHBlY3RlZCBhbiBJU08tODYwMSBpbnN0YW50IHdpdGggZXhwbGljaXQgem9uZWApLiBUaGUgcmVuZGVyZXInc1xuICAgICAgLy8gb3V0cHV0IHNoYXBlIGFuZCB0aGUgdmFsaWRhdG9yJ3MgYWNjZXB0ZWQgc2hhcGUgZG8gbm90IGludGVyc2VjdCwgc29cbiAgICAgIC8vIE5PIHVzZXIgaW5wdXQgY2FuIHN1Ym1pdCB0aGUgYWN0aW9uIFx1MjAxNCByZXByb2R1Y2VkIGZyb20gYm90aCB0aGUgbGlzdC1yb3dcbiAgICAgIC8vIG1lbnUgYW5kIHRoZSByZWNvcmQgaGVhZGVyLlxuICAgICAgLy9cbiAgICAgIC8vIGBkYXRlYCBhbmQgYHRpbWVgIGFyZSB0aGUgdHdvIHBhcmFtIHR5cGVzIHdoZXJlIHRoZXkgRE8gaW50ZXJzZWN0OiB0aGVcbiAgICAgIC8vIENvbnNvbGUgcmVuZGVycyBuYXRpdmUgYDxpbnB1dCB0eXBlPVwiZGF0ZVwiPmAgLyBgPGlucHV0IHR5cGU9XCJ0aW1lXCI+YFxuICAgICAgLy8gcGlja2VycyAoYHVpLWNvbXBvbmVudHNgIERhdGVGaWVsZCAvIFRpbWVGaWVsZCwgYm90aCBlbWl0dGluZ1xuICAgICAgLy8gYGUudGFyZ2V0LnZhbHVlYCB2ZXJiYXRpbSkgYW5kIHRoZSB2YWxpZGF0b3IncyBgQ2FsZW5kYXJEYXRlVmFsdWVTY2hlbWFgXG4gICAgICAvLyAvYENsb2NrVGltZVZhbHVlU2NoZW1hYCBhY2NlcHQgZXhhY3RseSBgWVlZWS1NTS1ERGAgYW5kIGBISDpNTWAuIFR3b1xuICAgICAgLy8gbmF0aXZlIHBpY2tlcnMgYXJlIGFsc28gYmV0dGVyIFVYIHRoYW4gb25lIGZyZWUtdGV4dCBib3gsIHdoaWNoIGlzIHRoZVxuICAgICAgLy8gb3RoZXIgc2hhcGUgdGhhdCB3b3VsZCBoYXZlIHN1Ym1pdHRlZC5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgem9uZSBpcyBzdGF0ZWQgaW4gdGhlIExBQkVMUywgbm90IGluIGBoZWxwVGV4dGA6IHRoZSBDb25zb2xlJ3NcbiAgICAgIC8vIGFjdGlvbi1wYXJhbSBmb3JtIGZvcndhcmRzIG9ubHkgbmFtZS9sYWJlbC90eXBlL3JlcXVpcmVkL3BsYWNlaG9sZGVyL1xuICAgICAgLy8gb3B0aW9ucy9tdWx0aXBsZS9hY2NlcHQvbWF4U2l6ZSB0byB0aGUgZmllbGQgd2lkZ2V0LCBzbyBhIGBoZWxwVGV4dGBcbiAgICAgIC8vIGhlcmUgd291bGQgbmV2ZXIgcmVhY2ggdGhlIHVzZXIuXG4gICAgICAvL1xuICAgICAgLy8gUkVWRVJUIFdIRU4gIzUwNjEgTEFORFM6IGJhY2sgdG9cbiAgICAgIC8vICAgeyBuYW1lOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0cyBBdCcsIHR5cGU6ICdkYXRldGltZScsIHJlcXVpcmVkOiB0cnVlIH1cbiAgICAgIC8vIGFuZCBkcm9wIHRoZSBqb2luIGluIHRoZSBib2R5IGFib3ZlLlxuICAgICAgLi4uKHNwZWMuY29sbGVjdHNTY2hlZHVsZVxuICAgICAgICA/IChbXG4gICAgICAgICAgICB7IG5hbWU6ICdzdGFydF9kYXRlJywgbGFiZWw6ICdTdGFydCBEYXRlIChVVEMpJywgdHlwZTogJ2RhdGUnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBuYW1lOiAnc3RhcnRfdGltZScsIGxhYmVsOiAnU3RhcnQgVGltZSAoVVRDKScsIHR5cGU6ICd0aW1lJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2xvY2F0aW9uJywgbGFiZWw6ICdMb2NhdGlvbicsIHR5cGU6ICd0ZXh0JywgcmVxdWlyZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgXSBhcyBOb25OdWxsYWJsZTxBY3Rpb25bJ3BhcmFtcyddPilcbiAgICAgICAgOiBbXSksXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdkdXJhdGlvbicsXG4gICAgICAgIGxhYmVsOiAnRHVyYXRpb24gKG1pbnV0ZXMpJyxcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICAvLyBUd28gdHlwZWQgbG9va3Vwcywgbm90IG9uZSBmcmVlLXRleHQgYm94OiB0aGUgcGxhdGZvcm0gaGFzIG5vXG4gICAgICAvLyBwb2x5bW9ycGhpYyBwaWNrZXIsIGFuZCB0eXBlZCBsb29rdXBzIHByb2R1Y2UgcXVlcnlhYmxlIHJvd3Mgd2hlcmUgYVxuICAgICAgLy8gdGV4dCBib3ggcHJvZHVjZXMgYSBjb21tYS1zZXBhcmF0ZWQgc2VudGVuY2Ugbm90aGluZyBjYW4gZmlsdGVyIG9uLlxuICAgICAge1xuICAgICAgICBuYW1lOiAnYXR0ZW5kZWVfY29udGFjdHMnLFxuICAgICAgICBsYWJlbDogJ0NvbnRhY3QgQXR0ZW5kZWVzJyxcbiAgICAgICAgdHlwZTogJ2xvb2t1cCcsXG4gICAgICAgIHJlZmVyZW5jZTogJ2NybV9jb250YWN0JyxcbiAgICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdhdHRlbmRlZV91c2VycycsXG4gICAgICAgIGxhYmVsOiAnSW50ZXJuYWwgQXR0ZW5kZWVzJyxcbiAgICAgICAgdHlwZTogJ2xvb2t1cCcsXG4gICAgICAgIHJlZmVyZW5jZTogJ3N5c191c2VyJyxcbiAgICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdub3RlcycsXG4gICAgICAgIGxhYmVsOiBzcGVjLm5vdGVzTGFiZWwsXG4gICAgICAgIHR5cGU6ICd0ZXh0YXJlYScsXG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBzdWNjZXNzTWVzc2FnZTogc3BlYy5zdWNjZXNzTWVzc2FnZSxcbiAgICByZWZyZXNoQWZ0ZXI6IHRydWUsXG4gIH07XG59XG5cbmNvbnN0IExPR19DQUxMX1NQRUM6IEFjdGl2aXR5U3BlYyA9IHtcbiAgbmFtZTogJ2xvZ19jYWxsJyxcbiAgbGFiZWw6ICdMb2cgYSBDYWxsJyxcbiAgaWNvbjogJ3Bob25lJyxcbiAgZXZlbnRUeXBlOiAnY2FsbCcsXG4gIGV2ZW50U3RhdHVzOiAnaGVsZCcsXG4gIHN1bW1hcnlQcmVmaXg6ICcnLFxuICBkZWZhdWx0U3ViamVjdDogJ1VudGl0bGVkIENhbGwnLFxuICBzdWJqZWN0TGFiZWw6ICdDYWxsIFN1YmplY3QnLFxuICBub3Rlc0xhYmVsOiAnQ2FsbCBOb3RlcycsXG4gIHN1Y2Nlc3NNZXNzYWdlOiAnQ2FsbCBsb2dnZWQgc3VjY2Vzc2Z1bGx5IScsXG59O1xuXG5jb25zdCBMT0dfTUVFVElOR19TUEVDOiBBY3Rpdml0eVNwZWMgPSB7XG4gIG5hbWU6ICdsb2dfbWVldGluZycsXG4gIGxhYmVsOiAnTG9nIGEgTWVldGluZycsXG4gIGljb246ICdjYWxlbmRhci1jaGVjaycsXG4gIGV2ZW50VHlwZTogJ21lZXRpbmcnLFxuICBldmVudFN0YXR1czogJ2hlbGQnLFxuICBzdW1tYXJ5UHJlZml4OiAnTWVldGluZzogJyxcbiAgZGVmYXVsdFN1YmplY3Q6ICdVbnRpdGxlZCBNZWV0aW5nJyxcbiAgc3ViamVjdExhYmVsOiAnTWVldGluZyBTdWJqZWN0JyxcbiAgbm90ZXNMYWJlbDogJ01lZXRpbmcgTm90ZXMnLFxuICBzdWNjZXNzTWVzc2FnZTogJ01lZXRpbmcgbG9nZ2VkIHN1Y2Nlc3NmdWxseSEnLFxufTtcblxuY29uc3QgU0NIRURVTEVfTUVFVElOR19TUEVDOiBBY3Rpdml0eVNwZWMgPSB7XG4gIG5hbWU6ICdzY2hlZHVsZV9tZWV0aW5nJyxcbiAgbGFiZWw6ICdTY2hlZHVsZSBhIE1lZXRpbmcnLFxuICBpY29uOiAnY2FsZW5kYXItcGx1cycsXG4gIGV2ZW50VHlwZTogJ21lZXRpbmcnLFxuICAvLyBgcGxhbm5lZGAsIGFuZCB0aGF0IGlzIHRoZSB3aG9sZSBkaWZmZXJlbmNlIHRoYXQgbWF0dGVyczogYSBib29raW5nIG11c3RcbiAgLy8gTk9UIHJlc2V0IHRoZSBjdXN0b21lcidzIHJlY2VuY3kgY2xvY2sgKHNlZSBldmVudC5ob29rLnRzKS5cbiAgZXZlbnRTdGF0dXM6ICdwbGFubmVkJyxcbiAgc3VtbWFyeVByZWZpeDogJ01lZXRpbmcgc2NoZWR1bGVkOiAnLFxuICBkZWZhdWx0U3ViamVjdDogJ1VudGl0bGVkIE1lZXRpbmcnLFxuICBzdWJqZWN0TGFiZWw6ICdNZWV0aW5nIFN1YmplY3QnLFxuICBub3Rlc0xhYmVsOiAnQWdlbmRhJyxcbiAgY29sbGVjdHNTY2hlZHVsZTogdHJ1ZSxcbiAgc3VjY2Vzc01lc3NhZ2U6ICdNZWV0aW5nIHNjaGVkdWxlZCEnLFxufTtcblxuLyoqIFRoZSB0aHJlZSBhY3Rpdml0eSBraW5kcywgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIG9uIGEgcmVjb3JkIGhlYWRlci4gKi9cbmV4cG9ydCBjb25zdCBBQ1RJVklUWV9TUEVDX05BTUVTID0gWydsb2dfY2FsbCcsICdsb2dfbWVldGluZycsICdzY2hlZHVsZV9tZWV0aW5nJ10gYXMgY29uc3Q7XG5cbmNvbnN0IEFDVElWSVRZX1NQRUNTOiBBY3Rpdml0eVNwZWNbXSA9IFtMT0dfQ0FMTF9TUEVDLCBMT0dfTUVFVElOR19TUEVDLCBTQ0hFRFVMRV9NRUVUSU5HX1NQRUNdO1xuXG4vKipcbiAqIFRoZSB0aHJlZSBhY3Rpdml0eSBhY3Rpb25zIGZvciBPTkUgaG9zdCBvYmplY3QgXHUyMDE0IHRoZSBmYWN0b3J5IGV2ZXJ5IHBhY2thZ2VcbiAqIHdpdGggYW4gYWN0aXZpdHkgdGFyZ2V0IGNhbGxzLlxuICpcbiAqIFJldHVybmVkIGtleWVkIGJ5IGtpbmQgcmF0aGVyIHRoYW4gYXMgYSBsaXN0LCBzbyB0aGUgbmFtZWQgZXhwb3J0cyBiZWxvdyByZWFkXG4gKiBhcyB0aGVtc2VsdmVzIGFuZCBhIGNhbGxlciBjYW5ub3QgcGljayB0aGUgd3JvbmcgaW5kZXguIEVhY2ggcGFja2FnZSBjYWxsc1xuICogdGhpcyBPTkNFIHBlciBob3N0IG9iamVjdCBhbmQgZXhwb3J0cyB0aGUgdGhyZWUgaXQgZ2V0cyBiYWNrLCBzbyBhIHBhZ2UgdGhhdFxuICogaW1wb3J0cyBgTG9nQ2FsbEFjdGlvbmAgYW5kIHRoZSBiYXJyZWwgdGhhdCByZWdpc3RlcnMgaXQgaG9sZCB0aGUgU0FNRVxuICogb2JqZWN0OiB0d28gc3RydWN0dXJhbGx5LWlkZW50aWNhbCBhY3Rpb25zIHVuZGVyIG9uZSBgPG9iamVjdE5hbWU+OjxuYW1lPmBcbiAqIHJlZ2lzdHJ5IGtleSBpcyBhIGR1cGxpY2F0ZSByZWdpc3RyYXRpb24gdGhlIHJ1bnRpbWUgd2FybnMgYWJvdXQsIGFuZCBvbmUgb2ZcbiAqIHRoZW0gc2lsZW50bHkgbG9zZXMuXG4gKlxuICogYG9iamVjdERlZnNgIGlzIHRoZSBjYWxsaW5nIHBhY2thZ2UncyBvYmplY3QgYmFycmVsIFx1MjAxNCBzZWUgdGhlIG5vdGUgb25cbiAqIHtAbGluayBuYW1lRmllbGRNYXB9IGZvciB3aHkgdGhlIGRlZmluaXRpb25zIGFycml2ZSBhcyBhbiBhcmd1bWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFjdGl2aXR5QWN0aW9uc0ZvciA9IChcbiAgb2JqZWN0TmFtZTogc3RyaW5nLFxuICBvYmplY3REZWZzOiBSZWNvcmQ8c3RyaW5nLCBOYW1lRmllbGRTb3VyY2U+LFxuKTogUmVjb3JkPCh0eXBlb2YgQUNUSVZJVFlfU1BFQ19OQU1FUylbbnVtYmVyXSwgQWN0aW9uPiA9PiB7XG4gIC8vIGA/PyAnbmFtZSdgIG9ubHkgZmlyZXMgZm9yIGFuIG9iamVjdCB0aGF0IGRlY2xhcmVzIG5vIG5hbWVGaWVsZCBhdCBhbGwsXG4gIC8vIHdoaWNoIG5vIGJ1c2luZXNzIG9iamVjdCBpbiB0aGlzIGFwcCBkb2VzLlxuICBjb25zdCBuYW1lRmllbGQgPSBuYW1lRmllbGRNYXAob2JqZWN0RGVmcylbb2JqZWN0TmFtZV0gPz8gJ25hbWUnO1xuICBjb25zdCBidWlsdCA9IEFDVElWSVRZX1NQRUNTLm1hcCgoc3BlYykgPT4gYWN0aXZpdHlBY3Rpb24oc3BlYywgb2JqZWN0TmFtZSwgbmFtZUZpZWxkKSk7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoYnVpbHQubWFwKChhKSA9PiBbYS5uYW1lLCBhXSkpIGFzIFJlY29yZDxcbiAgICAodHlwZW9mIEFDVElWSVRZX1NQRUNfTkFNRVMpW251bWJlcl0sXG4gICAgQWN0aW9uXG4gID47XG59O1xuXG4vKlxuICogVGhlIGZhbWlseSwgbmFtZWQuIGBzcmMvc2FsZXMvYWN0aW9ucy9pbmRleC50c2AgcmUtZXhwb3J0cyBleGFjdGx5IHRoZXNlIFx1MjAxNFxuICogdGhlIHN0YWNrIGlzIGJ1aWx0IGZyb20gYE9iamVjdC52YWx1ZXMoYWN0aW9ucylgLCBzbyBldmVyeSBleHBvcnQgaXQgZm9yd2FyZHNcbiAqIG11c3QgYmUgb25lIEFjdGlvbiwgbmV2ZXIgYSBsaXN0IG9mIHRoZW0uXG4gKlxuICogU3BlbGxlZCBvdXQgcmF0aGVyIHRoYW4gbG9vcGVkIGZvciBncmVwLWFiaWxpdHk6IFwid2hpY2ggc3VyZmFjZSBjYW4gbG9nIGFcbiAqIGNhbGwgb24gYSBsZWFkP1wiIGhhcyB0byBiZSBhbnN3ZXJhYmxlIHdpdGggb25lIHNlYXJjaCwgYW5kIEFHRU5UUy5tZCB0cmFkZXNcbiAqIHZlcmJvc2l0eSBmb3IgZXhhY3RseSB0aGF0IGV2ZXJ5d2hlcmUgZWxzZSB0b28uXG4gKi9cbmNvbnN0IGxlYWRBY3Rpdml0eUFjdGlvbnMgPSBhY3Rpdml0eUFjdGlvbnNGb3IoJ2NybV9sZWFkJywgc2FsZXNPYmplY3RzKTtcbmNvbnN0IGNvbnRhY3RBY3Rpdml0eUFjdGlvbnMgPSBhY3Rpdml0eUFjdGlvbnNGb3IoJ2NybV9jb250YWN0Jywgc2FsZXNPYmplY3RzKTtcbmNvbnN0IGFjY291bnRBY3Rpdml0eUFjdGlvbnMgPSBhY3Rpdml0eUFjdGlvbnNGb3IoJ2NybV9hY2NvdW50Jywgc2FsZXNPYmplY3RzKTtcbmNvbnN0IG9wcG9ydHVuaXR5QWN0aXZpdHlBY3Rpb25zID0gYWN0aXZpdHlBY3Rpb25zRm9yKCdjcm1fb3Bwb3J0dW5pdHknLCBzYWxlc09iamVjdHMpO1xuXG5leHBvcnQgY29uc3QgTGVhZExvZ0NhbGxBY3Rpb246IEFjdGlvbiA9IGxlYWRBY3Rpdml0eUFjdGlvbnMubG9nX2NhbGw7XG5leHBvcnQgY29uc3QgTGVhZExvZ01lZXRpbmdBY3Rpb246IEFjdGlvbiA9IGxlYWRBY3Rpdml0eUFjdGlvbnMubG9nX21lZXRpbmc7XG5leHBvcnQgY29uc3QgTGVhZFNjaGVkdWxlTWVldGluZ0FjdGlvbjogQWN0aW9uID0gbGVhZEFjdGl2aXR5QWN0aW9ucy5zY2hlZHVsZV9tZWV0aW5nO1xuXG5leHBvcnQgY29uc3QgQ29udGFjdExvZ0NhbGxBY3Rpb246IEFjdGlvbiA9IGNvbnRhY3RBY3Rpdml0eUFjdGlvbnMubG9nX2NhbGw7XG5leHBvcnQgY29uc3QgQ29udGFjdExvZ01lZXRpbmdBY3Rpb246IEFjdGlvbiA9IGNvbnRhY3RBY3Rpdml0eUFjdGlvbnMubG9nX21lZXRpbmc7XG5leHBvcnQgY29uc3QgQ29udGFjdFNjaGVkdWxlTWVldGluZ0FjdGlvbjogQWN0aW9uID0gY29udGFjdEFjdGl2aXR5QWN0aW9ucy5zY2hlZHVsZV9tZWV0aW5nO1xuXG5leHBvcnQgY29uc3QgQWNjb3VudExvZ0NhbGxBY3Rpb246IEFjdGlvbiA9IGFjY291bnRBY3Rpdml0eUFjdGlvbnMubG9nX2NhbGw7XG5leHBvcnQgY29uc3QgQWNjb3VudExvZ01lZXRpbmdBY3Rpb246IEFjdGlvbiA9IGFjY291bnRBY3Rpdml0eUFjdGlvbnMubG9nX21lZXRpbmc7XG5leHBvcnQgY29uc3QgQWNjb3VudFNjaGVkdWxlTWVldGluZ0FjdGlvbjogQWN0aW9uID0gYWNjb3VudEFjdGl2aXR5QWN0aW9ucy5zY2hlZHVsZV9tZWV0aW5nO1xuXG5leHBvcnQgY29uc3QgT3Bwb3J0dW5pdHlMb2dDYWxsQWN0aW9uOiBBY3Rpb24gPSBvcHBvcnR1bml0eUFjdGl2aXR5QWN0aW9ucy5sb2dfY2FsbDtcbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eUxvZ01lZXRpbmdBY3Rpb246IEFjdGlvbiA9IG9wcG9ydHVuaXR5QWN0aXZpdHlBY3Rpb25zLmxvZ19tZWV0aW5nO1xuZXhwb3J0IGNvbnN0IE9wcG9ydHVuaXR5U2NoZWR1bGVNZWV0aW5nQWN0aW9uOiBBY3Rpb24gPSBvcHBvcnR1bml0eUFjdGl2aXR5QWN0aW9ucy5zY2hlZHVsZV9tZWV0aW5nO1xuXG4vKlxuICogVGhlIGBjcm1fY2FzZWAtc2NvcGVkIHRyaXBsZSBpcyBOT1QgYnVpbHQgaGVyZS4gYGNybV9jYXNlYCBpcyB0aGUgc2VydmljZVxuICogcGFja2FnZSdzIG9iamVjdCwgc28gc2VydmljZSBpbnN0YW50aWF0ZXMgaXQgZnJvbSB0aGlzIGZhY3RvcnkgXHUyMDE0IHNlZVxuICogYHNyYy9zZXJ2aWNlL2FjdGlvbnMvY2FzZS1hY3Rpdml0eS5hY3Rpb25zLnRzYCwgd2hpY2gga2VlcHMgdGhlIG9yaWdpbmFsXG4gKiBgTG9nQ2FsbEFjdGlvbmAgLyBgTG9nTWVldGluZ0FjdGlvbmAgLyBgQ2FzZVNjaGVkdWxlTWVldGluZ0FjdGlvbmAgZXhwb3J0XG4gKiBuYW1lcyBiZWNhdXNlIGBzcmMvc2VydmljZS9wYWdlcy9jYXNlX2RldGFpbC5wYWdlLnRzYCBpbXBvcnRzIHRoZW0gYnkgdGhvc2VcbiAqIG5hbWVzLlxuICovXG5cbi8vIFx1MjZENCBOZXZlciBhZGQgYSBnbG9iYWwgKG9iamVjdC1sZXNzKSBib2R5IGFjdGlvbiBoZXJlOiBpdCByZWdpc3RlcnMgdW5kZXIgdGhlXG4vLyAnZ2xvYmFsJyBrZXkgdGhlIGRpc3BhdGNoZXIgbmV2ZXIgcHJvYmVzIFx1MjAxNCBzZWUgdGhlIG5vdGUgb24gYG9iamVjdE5hbWVgXG4vLyBhYm92ZS4gQ1NWIGV4cG9ydCBpbiBwYXJ0aWN1bGFyIG5lZWRzIG5vIGFjdGlvbiBhdCBhbGw7IHRoZSBsaXN0IGdyaWRzJ1xuLy8gYnVpbHQtaW4gYGV4cG9ydE9wdGlvbnM6IFsnY3N2JywgJ3hsc3gnXWAgYWxyZWFkeSBjb3ZlciBpdC5cbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvYWN0aW9ucy9jYXNlLWFjdGl2aXR5LmFjdGlvbnMudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9hY3Rpb25zXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvYWN0aW9ucy9jYXNlLWFjdGl2aXR5LmFjdGlvbnMudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCAqIGFzIHNlcnZpY2VPYmplY3RzIGZyb20gJy4uL29iamVjdHMnO1xuaW1wb3J0IHsgYWN0aXZpdHlBY3Rpb25zRm9yIH0gZnJvbSAnLi4vLi4vc2FsZXMvYWN0aW9ucy9hY3Rpdml0eS1hY3Rpb25zJztcblxuLyoqXG4gKiBUaGUgYGNybV9jYXNlYC1zY29wZWQgYWN0aXZpdHkgdHJpcGxlIFx1MjAxNCBgbG9nX2NhbGxgLCBgbG9nX21lZXRpbmdgLFxuICogYHNjaGVkdWxlX21lZXRpbmdgIG9uIGEgY2FzZS5cbiAqXG4gKiBUaGVzZSB0aHJlZSB1c2VkIHRvIGJlIGJ1aWx0IGFsb25nc2lkZSB0aGUgb3RoZXIgdHdlbHZlIGluIHdoYXQgaXMgbm93XG4gKiBgc3JjL3NhbGVzL2FjdGlvbnMvYWN0aXZpdHktYWN0aW9ucy50c2AuIGBjcm1fY2FzZWAgaXMgdGhpcyBwYWNrYWdlJ3Mgb2JqZWN0LFxuICogc28gdGhlIEFDVElPTlMgYXV0aG9yZWQgYWdhaW5zdCBpdCBhcmUgdGhpcyBwYWNrYWdlJ3MgdG9vIChwbGFuIGl0ZW0gNTogYW5cbiAqIGl0ZW0gbGl2ZXMgd2l0aCB0aGUgb2JqZWN0IGl0IGlzIGF1dGhvcmVkIGFnYWluc3QpIFx1MjAxNCBidXQgdGhlIGZhY3RvcnkgdGhhdFxuICogYnVpbGRzIHRoZW0gaXMgbm90IGR1cGxpY2F0ZWQuIEl0IHN0YXlzIGluIHNhbGVzLCB3aGVyZSB0aGUgb3RoZXIgZm91ciBob3N0XG4gKiBvYmplY3RzIGFuZCB0aGUgYGNybV9ldmVudGAgZXZlcnkgb25lIG9mIHRoZXNlIHdyaXRlcyBsaXZlLCBhbmQgc2VydmljZVxuICogaW1wb3J0cyBpdCBhbG9uZyB0aGUgb25lIGVkZ2UgQURSLTAxMzAgYWxsb3dzIGEgbW9kdWxlIHRvIGltcG9ydCBvbjpcbiAqIHNlcnZpY2UgLT4gc2FsZXMsIG5ldmVyIHNpZGV3YXlzLCBuZXZlciBhIHNlY29uZCBjb3B5LlxuICpcbiAqIFRoZSBleHBvcnQgbmFtZXMgYXJlIHRoZSBvcmlnaW5hbHMgXHUyMDE0IGBMb2dDYWxsQWN0aW9uYCwgYExvZ01lZXRpbmdBY3Rpb25gLFxuICogYENhc2VTY2hlZHVsZU1lZXRpbmdBY3Rpb25gLCB3aXRoIG5vIGBDYXNlYCBwcmVmaXggb24gdGhlIGZpcnN0IHR3byBcdTIwMTQgYmVjYXVzZVxuICogYHNyYy9zZXJ2aWNlL2luZGV4LnRzYCByZWdpc3RlcnMgdGhlbSBieSB0aG9zZSBuYW1lcywgYW5kIHRoZSBQUiB0aGF0IG1vdmVkXG4gKiB0aGlzIGZpbGUgcmVuYW1lZCBub3RoaW5nIGl0IGV4cG9ydHMuIChUaGUgY2FzZSBwYWdlIG5hbWVzIHRoZW0gYnkgYWN0aW9uIGlkXG4gKiBzaW5jZSAjMTY1Mywgbm90IGJ5IHRoZXNlIGV4cG9ydHMuKVxuICpcbiAqIE5vIGA6IEFjdGlvbmAgYW5ub3RhdGlvbiBvbiB0aGUgdGhyZWU6IGBhY3Rpdml0eUFjdGlvbnNGb3JgIGFscmVhZHkgcmV0dXJuc1xuICogYFJlY29yZDxraW5kLCBBY3Rpb24+YCwgc28gZWFjaCBleHBvcnQgaXMgdHlwZWQgYEFjdGlvbmAgd2l0aG91dCBvbmUgKCMyMDcyXG4gKiBkcm9wcGVkIHRoZSB0aHJlZSwgYW5kIHRoZSB0eXBlLW9ubHkgaW1wb3J0IHRoZXkgbmVlZGVkLCB0byBwYXkgZm9yIHRoZSBjYXNlXG4gKiBoZWFkZXIncyB0aHJlZSBuZXcgYWN0aW9uIGlkcyB1bmRlciB0aGUgYHNyYy9zZXJ2aWNlYCB0b2tlbiBjZWlsaW5nKS5cbiAqL1xuY29uc3QgY2FzZUFjdGl2aXR5QWN0aW9ucyA9IGFjdGl2aXR5QWN0aW9uc0ZvcignY3JtX2Nhc2UnLCBzZXJ2aWNlT2JqZWN0cyk7XG5cbmV4cG9ydCBjb25zdCBMb2dDYWxsQWN0aW9uID0gY2FzZUFjdGl2aXR5QWN0aW9ucy5sb2dfY2FsbDtcbmV4cG9ydCBjb25zdCBMb2dNZWV0aW5nQWN0aW9uID0gY2FzZUFjdGl2aXR5QWN0aW9ucy5sb2dfbWVldGluZztcbmV4cG9ydCBjb25zdCBDYXNlU2NoZWR1bGVNZWV0aW5nQWN0aW9uID0gY2FzZUFjdGl2aXR5QWN0aW9ucy5zY2hlZHVsZV9tZWV0aW5nO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9hY3Rpb25zL2tub3dsZWRnZV9hcnRpY2xlLmFjdGlvbnMudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9hY3Rpb25zXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvYWN0aW9ucy9rbm93bGVkZ2VfYXJ0aWNsZS5hY3Rpb25zLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEFjdGlvbiB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcbmltcG9ydCB7IFAgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogS25vd2xlZGdlIGFydGljbGUgZmVlZGJhY2sgYWN0aW9ucy5cbiAqXG4gKiBUaGUgdHdvIGJ1dHRvbnMgdGhhdCBtYWtlIGBoZWxwZnVsX2NvdW50YCAvIGBub3RfaGVscGZ1bF9jb3VudGAgbW92ZS4gTmVpdGhlclxuICogd3JpdGVzIGEgY291bnRlcjogZWFjaCByZWNvcmRzIHRoZSByZWFkZXIncyBvd24gYGNybV9hcnRpY2xlX2ZlZWRiYWNrYCByb3csXG4gKiBhbmQgYGFydGljbGVfZmVlZGJhY2tfbWV0cmljc19yZWZyZXNoYCByZWNvdW50cyB0aGUgYXJ0aWNsZSBmcm9tIHRoYXQgdGFibGUuXG4gKiBUaGUgZnVsbCByZWFzb25pbmcgZm9yIHRoZSBpbmRpcmVjdGlvbiBcdTIwMTQgYSBzYW5kYm94ZWQgYWN0aW9uIGJvZHkgY2Fubm90XG4gKiBVUERBVEUgYSBzaGFyaW5nLXJ1bGVkIG9iamVjdCwgdGhlIGFydGljbGUgaXMgd3JpdGUtb3duZWQsIGFuZCB0aGVyZSBpcyBub1xuICogYXRvbWljIGluY3JlbWVudCBcdTIwMTQgaXMgb24gYHNyYy9zZXJ2aWNlL29iamVjdHMvYXJ0aWNsZV9mZWVkYmFjay5vYmplY3QudHNgLlxuICpcbiAqICMjIyBPbmUgYm9keSwgZ2VuZXJhdGVkIHR3aWNlXG4gKlxuICogYGZlZWRiYWNrQm9keSh2ZXJkaWN0KWAgY29tcG9zZXMgdGhlIHNvdXJjZSBzdHJpbmcgYm90aCBhY3Rpb25zIHNoaXAuIFRoaXMgaXNcbiAqIEZBQ1RPUlkgY29tcG9zaXRpb24sIHdoaWNoIGlzIGFsbG93ZWQgYW5kIGlzIHdoYXQgYF9jYXNlLWFzc2lnbm1lbnQudHNgIGRvZXNcbiAqIGZvciBob29rczogdGhlIHN0cmluZyBpdCByZXR1cm5zIGlzIGNvbXBsZXRlIGFuZCBzZWxmLWNvbnRhaW5lZCwgc28gdGhlIGJvZHlcbiAqIHRoYXQgcmVhY2hlcyB0aGUgUXVpY2tKUyBzYW5kYm94IHJlYWNoZXMgZm9yIG5vIG1vZHVsZSBzY29wZS4gXHUyNkQ0IE5ldmVyIHdyaXRlXG4gKiB0aGUgb3RoZXIgc2hhcGUgXHUyMDE0IGEgYm9keSB0aGF0IENBTExTIGEgc2hhcmVkIGZ1bmN0aW9uIGF0IHJ1bnRpbWUgbG93ZXJzIHRvIGFcbiAqIGBSZWZlcmVuY2VFcnJvcmAsIGJlY2F1c2UgdGhlIGJvZHkgc2hpcHMgd2l0aG91dCBpdHMgbW9kdWxlXG4gKiAoYHRlc3QvYWN0aW9uLXNhbmRib3gudGVzdC50c2AgZmFpbHMgdGhlIGJ1aWxkIG9uIGl0LCBhbmRcbiAqIGB0ZXN0L2tub3dsZWRnZS1mZWVkYmFjay50ZXN0LnRzYCBwaW5zIHRoYXQgdGhlc2UgdHdvIGJvZGllcyBzdGF5XG4gKiBjaGFyYWN0ZXItaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIHZlcmRpY3QpLlxuICpcbiAqICMjIyBSZS12b3RpbmcgVVBEQVRFUyByYXRoZXIgdGhhbiBpbnNlcnRpbmdcbiAqXG4gKiBgY3JtX2FydGljbGVfZmVlZGJhY2tgIGNhcnJpZXMgYSB1bmlxdWUgaW5kZXggb25cbiAqIChgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCwgYG93bmVyX2lkYCksIHNvIGEgcmVhZGVyIHdobyBjbGlja3MgSGVscGZ1bCBhbmRcbiAqIHRoZW4gTm90IEhlbHBmdWwgbXVzdCBtb3ZlIHRoZWlyIGV4aXN0aW5nIHJvdywgbm90IGFkZCBhIHNlY29uZCBvbmUuIFRoZVxuICogYm9keSB0aGVyZWZvcmUgcmVhZHMgZmlyc3QuIFdpdGhvdXQgdGhlIGRlZHVwZSB0aGUgY291bnRlcnMgd291bGQgYW5zd2VyXG4gKiBcImhvdyBtYW55IGNsaWNrc1wiLCBhbmQgb25lIGVudGh1c2lhc3RpYyByZWFkZXIgY291bGQgb3V0LXZvdGUgYSBkZXBhcnRtZW50LlxuICpcbiAqIGBvd25lcl9pZGAgaXMgc2V0IEVYUExJQ0lUTFk6IGFuIGFjdGlvbiBib2R5IHJ1bnMgYGlzU3lzdGVtYCwgc28gbm90aGluZ1xuICogc3RhbXBzIHRoZSBvd25lcnNoaXAgYW5jaG9yIGZvciBpdCAodGhlIHNhbWUgbm90ZSBgY2xvbmVfb3Bwb3J0dW5pdHlgXG4gKiBjYXJyaWVzKS4gSXQgaXMgdGhlIHZvdGVyJ3MgaWRlbnRpdHkgdGhhdCBrZXlzIHRoZSBkZWR1cGUsIHNvIGdldHRpbmcgaXQgZnJvbVxuICogYGN0eC51c2VyYCBpcyBsb2FkLWJlYXJpbmcgcmF0aGVyIHRoYW4gdGlkeSBcdTIwMTQgYSBudWxsIG93bmVyIHdvdWxkIGNvbGxhcHNlXG4gKiBldmVyeSBhbm9ueW1vdXMtbG9va2luZyB2b3RlIG9udG8gb25lIHJvdy5cbiAqL1xuY29uc3QgZmVlZGJhY2tCb2R5ID0gKHZlcmRpY3Q6ICdoZWxwZnVsJyB8ICdub3RfaGVscGZ1bCcpOiBzdHJpbmcgPT4gYFxuICAgICAgY29uc3QgaWQgPSBjdHgucmVjb3JkSWQ7XG4gICAgICBpZiAoIWlkKSB0aHJvdyBuZXcgRXJyb3IoJ3N1Ym1pdF9hcnRpY2xlX2ZlZWRiYWNrIHJlcXVpcmVzIGEgcmVjb3JkSWQnKTtcbiAgICAgIGNvbnN0IHVzZXJJZCA9IGN0eC51c2VyPy5pZCA/PyBudWxsO1xuICAgICAgaWYgKCF1c2VySWQpIHRocm93IG5ldyBFcnJvcignU2lnbiBpbiB0byByYXRlIGFuIGFydGljbGUuJyk7XG5cbiAgICAgIC8vIE9uZSByb3cgcGVyIChhcnRpY2xlLCByZWFkZXIpIFx1MjAxNCB0aGUgdW5pcXVlIGluZGV4IHNheXMgc28sIGFuZCB0aGlzXG4gICAgICAvLyByZWFkIGlzIHdoYXQga2VlcHMgYSBtaW5kLWNoYW5nZSBhbiBVUERBVEUgaW5zdGVhZCBvZiBhIGR1cGxpY2F0ZS5cbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgY3R4LmFwaS5vYmplY3QoJ2NybV9hcnRpY2xlX2ZlZWRiYWNrJykuZmluZE9uZSh7XG4gICAgICAgIHdoZXJlOiB7IGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogaWQsIG93bmVyX2lkOiB1c2VySWQgfSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcuaWQpIHtcbiAgICAgICAgaWYgKGV4aXN0aW5nLnZlcmRpY3QgPT09ICcke3ZlcmRpY3R9Jykge1xuICAgICAgICAgIHJldHVybiB7IG9rOiB0cnVlLCBpZDogZXhpc3RpbmcuaWQsIHZlcmRpY3Q6ICcke3ZlcmRpY3R9JywgY2hhbmdlZDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2FydGljbGVfZmVlZGJhY2snKS51cGRhdGUoXG4gICAgICAgICAgeyBpZDogZXhpc3RpbmcuaWQsIHZlcmRpY3Q6ICcke3ZlcmRpY3R9JyB9LFxuICAgICAgICAgIHsgd2hlcmU6IHsgaWQ6IGV4aXN0aW5nLmlkIH0gfSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIGlkOiBleGlzdGluZy5pZCwgdmVyZGljdDogJyR7dmVyZGljdH0nLCBjaGFuZ2VkOiB0cnVlIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluc2VydGVkID0gYXdhaXQgY3R4LmFwaS5vYmplY3QoJ2NybV9hcnRpY2xlX2ZlZWRiYWNrJykuaW5zZXJ0KHtcbiAgICAgICAgY3JtX2tub3dsZWRnZV9hcnRpY2xlOiBpZCxcbiAgICAgICAgdmVyZGljdDogJyR7dmVyZGljdH0nLFxuICAgICAgICBvd25lcl9pZDogdXNlcklkLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBvazogdHJ1ZSwgaWQ6IGluc2VydGVkPy5pZCA/PyBudWxsLCB2ZXJkaWN0OiAnJHt2ZXJkaWN0fScsIGNoYW5nZWQ6IHRydWUgfTtcbiAgICBgO1xuXG4vKipcbiAqIE9ubHkgUFVCTElTSEVEIGFydGljbGVzIGNvbGxlY3Qgdm90ZXMuIEEgZHJhZnQncyBjb3VudGVycyB3b3VsZCBkZXNjcmliZSBhXG4gKiB2ZXJzaW9uIG5vIHJlYWRlciBvdXRzaWRlIHRoZSBhdXRob3JpbmcgdGVhbSBldmVyIHNhdywgYW5kIHRoZSByZXZpZXcgcXVldWVcbiAqIHJlYWRzIHRoZXNlIG51bWJlcnMgYXMgYSBzaWduYWwgYWJvdXQgbGl2ZSBjb250ZW50LlxuICovXG5jb25zdCBwdWJsaXNoZWRPbmx5ID0gUGBoYXMocmVjb3JkLnN0YXR1cykgJiYgcmVjb3JkLnN0YXR1cyA9PSBcInB1Ymxpc2hlZFwiYDtcblxuZXhwb3J0IGNvbnN0IE1hcmtBcnRpY2xlSGVscGZ1bEFjdGlvbjogQWN0aW9uID0ge1xuICBuYW1lOiAnbWFya19hcnRpY2xlX2hlbHBmdWwnLFxuICBsYWJlbDogJ0hlbHBmdWwnLFxuICBvYmplY3ROYW1lOiAnY3JtX2tub3dsZWRnZV9hcnRpY2xlJyxcbiAgaWNvbjogJ3RodW1icy11cCcsXG4gIHR5cGU6ICdzY3JpcHQnLFxuICBib2R5OiB7XG4gICAgbGFuZ3VhZ2U6ICdqcycsXG4gICAgc291cmNlOiBmZWVkYmFja0JvZHkoJ2hlbHBmdWwnKSxcbiAgICBjYXBhYmlsaXRpZXM6IFsnYXBpLnJlYWQnLCAnYXBpLndyaXRlJ10sXG4gICAgdGltZW91dE1zOiA1MDAwLFxuICB9LFxuICBsb2NhdGlvbnM6IFsncmVjb3JkX2hlYWRlciddLFxuICB2aXNpYmxlOiBwdWJsaXNoZWRPbmx5LFxuICBzdWNjZXNzTWVzc2FnZTogJ1RoYW5rcyBcdTIwMTQgcmVjb3JkZWQgYXMgaGVscGZ1bC4nLFxuICByZWZyZXNoQWZ0ZXI6IHRydWUsXG59O1xuXG5leHBvcnQgY29uc3QgTWFya0FydGljbGVOb3RIZWxwZnVsQWN0aW9uOiBBY3Rpb24gPSB7XG4gIG5hbWU6ICdtYXJrX2FydGljbGVfbm90X2hlbHBmdWwnLFxuICBsYWJlbDogJ05vdCBIZWxwZnVsJyxcbiAgb2JqZWN0TmFtZTogJ2NybV9rbm93bGVkZ2VfYXJ0aWNsZScsXG4gIGljb246ICd0aHVtYnMtZG93bicsXG4gIHR5cGU6ICdzY3JpcHQnLFxuICBib2R5OiB7XG4gICAgbGFuZ3VhZ2U6ICdqcycsXG4gICAgc291cmNlOiBmZWVkYmFja0JvZHkoJ25vdF9oZWxwZnVsJyksXG4gICAgY2FwYWJpbGl0aWVzOiBbJ2FwaS5yZWFkJywgJ2FwaS53cml0ZSddLFxuICAgIHRpbWVvdXRNczogNTAwMCxcbiAgfSxcbiAgbG9jYXRpb25zOiBbJ3JlY29yZF9oZWFkZXInXSxcbiAgdmlzaWJsZTogcHVibGlzaGVkT25seSxcbiAgc3VjY2Vzc01lc3NhZ2U6ICdUaGFua3MgXHUyMDE0IHJlY29yZGVkIGFzIG5vdCBoZWxwZnVsLicsXG4gIHJlZnJlc2hBZnRlcjogdHJ1ZSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2Rhc2hib2FyZHMvc2VydmljZS5kYXNoYm9hcmQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9kYXNoYm9hcmRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZGFzaGJvYXJkcy9zZXJ2aWNlLmRhc2hib2FyZC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBEYXNoYm9hcmQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogVGhlIG9uZSBkYXRhc2V0IGV2ZXJ5IHdpZGdldCBiZWxvdyBiaW5kcyAoYGNhc2VfbWV0cmljc2ApLCB3cml0dGVuIG9uY2UgYW5kXG4gKiBwYXNzZWQgYnkgc2hvcnRoYW5kIChgZGF0YXNldCxgKSByYXRoZXIgdGhhbiBzcGVsbGVkIG91dCBvbiBlYWNoIHdpZGdldC5cbiAqL1xuY29uc3QgZGF0YXNldCA9ICdjYXNlX21ldHJpY3MnO1xuXG4vKipcbiAqIEN1c3RvbWVyIFNlcnZpY2UgRGFzaGJvYXJkXG4gKlxuICogQ2FzZSBsb2FkLCBTTEEgaGVhbHRoLCBhbmQgcmVzb2x1dGlvbiBwZXJmb3JtYW5jZSBmb3IgdGhlIHN1cHBvcnQgdGVhbS5cbiAqIFVzZXMgc2VtYW50aWMgY29sb3JWYXJpYW50IHRva2VucyAod2FybmluZy9kYW5nZXIvc3VjY2VzcykgYW5kIGNoYXJ0Q29uZmlnXG4gKiBwYWxldHRlcyBpbnN0ZWFkIG9mIHJhdyBoZXggdmFsdWVzLCBtaXJyb3JpbmcgdGhlIHBvbGlzaGVkIENSTSBkYXNoYm9hcmRcbiAqIHJlZmVyZW5jZSBhdCBodHRwczovL2dpdGh1Yi5jb20vb2JqZWN0c3RhY2stYWkvb2JqZWN0dWkvdHJlZS9tYWluL2V4YW1wbGVzL2NybS5cbiAqXG4gKiBObyBLUEkgdGlsZSBkZWNsYXJlcyBhIGB0cmVuZGAuIEEgcGVyaW9kLW92ZXItcGVyaW9kIGRlbHRhIGlzIGEgbWVhc3VyZW1lbnQsXG4gKiBzbyBpdCBoYXMgdG8gY29tZSBmcm9tIGEgcmVhbCBjb21wYXJpc29uIHF1ZXJ5ICh3aWRnZXQgYGNvbXBhcmVUb2ApIG9uY2UgdGhlXG4gKiByZW5kZXJlciBzdXBwb3J0cyBpdCBmb3IgZGF0YXNldCBtZXRyaWNzIFx1MjAxNCB0aGUgcGVyY2VudGFnZXMgdGhpcyBmaWxlIHVzZWQgdG9cbiAqIGNhcnJ5IHdlcmUgdHlwZWQgYnkgaGFuZCBhbmQgcmVjb21wdXRlZCBieSBub3RoaW5nLCBzbyB0aGV5IGtlcHQgYXNzZXJ0aW5nXG4gKiB0aGUgc2FtZSBcIi02LjIlIHZzIGxhc3Qgd2Vla1wiIG9uIGFueSBkYXRhLCBpbmNsdWRpbmcgYW4gZW1wdHkgZGF0YWJhc2UuXG4gKiBTYW1lIHJ1bGUgYXMgdGhlIGV4ZWN1dGl2ZSBkYXNoYm9hcmQgKCM1MDAsICM1ODcpLlxuICovXG5leHBvcnQgY29uc3QgU2VydmljZURhc2hib2FyZDogRGFzaGJvYXJkID0ge1xuICBuYW1lOiAnc2VydmljZV9kYXNoYm9hcmQnLFxuICBsYWJlbDogJ0N1c3RvbWVyIFNlcnZpY2UnLFxuICBkZXNjcmlwdGlvbjogJ0Nhc2UgbG9hZCwgU0xBIGhlYWx0aCwgYW5kIHJlc29sdXRpb24gcGVyZm9ybWFuY2UnLFxuXG4gIGNvbHVtbnM6IDEyLFxuICBnYXA6IDQsXG4gIHJlZnJlc2hJbnRlcnZhbFNlY29uZHM6IDYwLCAvLyAxIG1pbnV0ZSBcdTIwMTQgc2VydmljZSBkZXNrcyBuZWVkIGZyZXNoIG51bWJlcnNcblxuICBoZWFkZXI6IHtcbiAgICBzaG93VGl0bGU6IHRydWUsXG4gICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgIC8vIEhlYWRlciBhY3Rpb24gYnV0dG9ucyByZW1vdmVkOiBgY3JlYXRlX2Nhc2VgIGlzIG5vdCBhIGRlZmluZWQgYWN0aW9uIGFuZFxuICAgIC8vIGAvb2JqZWN0cy9jYXNlP293bmVyPWN1cnJlbnRfdXNlcmAgLyBgL3JlcG9ydHMvc2xhYCBhcmUgbm90IGluLWFwcCB2aWV3XG4gICAgLy8gcm91dGVzIFx1MjAxNCBhbGwgdGhyZWUgd2VyZSBkZWFkLiBSZS1hZGQgcmVhbCwgd2lyZWQtdXAgYWN0aW9ucyBoZXJlIHdoZW4gYXZhaWxhYmxlLlxuICB9LFxuXG4gIC8vIEhpc3RvcmljYWwgbm90ZSAoIzQ2MCBcdTIxOTIgIzExNTcpOiB0aGlzIGRhc2hib2FyZCBzaGlwcGVkIHdpdGhvdXQgYSBkYXRlXG4gIC8vIHBpY2tlciBmcm9tIFBSICM1NDYgdW50aWwgdGhlIDE3LjAuMCBHQSB1cGdyYWRlLCBiZWNhdXNlIHdpbmRvd2luZyBhXG4gIC8vIGBGaWVsZC5kYXRldGltZSgpYCBjb3VsZCBub3QgYmUgY29tcGFyZWQgXHUyMDE0IGBkcml2ZXItc3FsYCAxNi4xLjAgY29lcmNlZFxuICAvLyBkYXRldGltZSBib3VuZHMgdG8gZXBvY2gtbXMgSU5URUdFUiB3aGlsZSBldmVyeSBkYXRldGltZSBpbiB0aGUgZGF0YWJhc2UgaXNcbiAgLy8gSVNPIFRFWFQsIHNvIGAkZ3RlYCBtYXRjaGVkIGV2ZXJ5dGhpbmcgYW5kIGAkbHRlYCBtYXRjaGVkIG5vdGhpbmcgYW5kIHRoZVxuICAvLyB3aG9sZSBkYXNoYm9hcmQgcmVhZCB6ZXJvcy4gQm90aCBuYW1lZCBwcmVjb25kaXRpb25zIGFyZSBmaXhlZCBhbmRcbiAgLy8gcmVsZWFzZWQ6IG9iamVjdHN0YWNrIzM5MTIgKHRoZSBjb2VyY2lvbikgYW5kIG9iamVjdHN0YWNrIzM3NzcgKGEgYmFyZS1kYXRlXG4gIC8vIGAkbHRlYCBkcm9wcGluZyBzYW1lLWRheSByb3dzKS4gVGhlIHdpbmRvdyBiZWxvdyBpcyBub3QgcmVzdG9yZWQgb24gdGhlXG4gIC8vIHN0cmVuZ3RoIG9mIHRob3NlIGNsb3N1cmVzIGFsb25lIFx1MjAxNCBgdGVzdC9kYXNoYm9hcmQtZGF0ZS1yYW5nZS13aW5kb3cudGVzdC50c2BcbiAgLy8gZXhlY3V0ZXMgaXQgYWdhaW5zdCBhIHJlYWwgU1FMaXRlIGRhdGFiYXNlIGFuZCBjb21wYXJlcyBldmVyeSB3aWRnZXQgdG8gYVxuICAvLyBncm91bmQgdHJ1dGggY29tcHV0ZWQgaW4gdGhlIHNhbWUgcnVuLCBzbyBhIHJlLXJlZ3Jlc3Npb24gZmFpbHMgQ0kgaGVyZVxuICAvLyByYXRoZXIgdGhhbiBiZWluZyBkaXNjb3ZlcmVkIGFzIGFuIGFsbC16ZXJvIGRhc2hib2FyZCBhZ2Fpbi5cbiAgLy9cbiAgLy8gVGhlIHJhbmdlIHdpbmRvd3MgYGNyZWF0ZWRfYXRgLCB0aGUgcGxhdGZvcm0ncyBjcmVhdGlvbiBzdGFtcCAoIzE5OTIpLiBJdFxuICAvLyB1c2VkIHRvIHdpbmRvdyBgY3JlYXRlZF9kYXRlYCwgd2hpY2ggbm90aGluZyB3cm90ZSBvbiBhIHJlYWwgY2FzZSwgc29cbiAgLy8gZXZlcnkgY2FzZSBjcmVhdGVkIHRocm91Z2ggdGhlIFVJIG9yIFJFU1QgZmVsbCBvdXRzaWRlIGV2ZXJ5IHJhbmdlLlxuICBkYXRlUmFuZ2U6IHsgZmllbGQ6ICdjcmVhdGVkX2F0JywgZGVmYXVsdFJhbmdlOiAnbGFzdF85MF9kYXlzJywgYWxsb3dDdXN0b21SYW5nZTogdHJ1ZSB9LFxuXG4gIGdsb2JhbEZpbHRlcnM6IFtcbiAgICB7XG4gICAgICBmaWVsZDogJ293bmVyX2lkJyxcbiAgICAgIGxhYmVsOiB7IGVuOiAnQWdlbnQnLCAnemgtQ04nOiAnXHU4RDFGXHU4RDIzXHU0RUJBJywgJ2VzLUVTJzogJ1Byb3BpZXRhcmlvIGRlbCBDYXNvJywgJ2phLUpQJzogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgc2NvcGU6ICdkYXNoYm9hcmQnLFxuICAgICAgb3B0aW9uc0Zyb206IHsgb2JqZWN0OiAnc3lzX3VzZXInLCB2YWx1ZUZpZWxkOiAnaWQnLCBsYWJlbEZpZWxkOiAnbmFtZScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZpZWxkOiAncHJpb3JpdHknLFxuICAgICAgbGFiZWw6IHsgZW46ICdQcmlvcml0eScsICd6aC1DTic6ICdcdTRGMThcdTUxNDhcdTdFQTcnLCAnZXMtRVMnOiAnUHJpb3JpZGFkJywgJ2phLUpQJzogJ1x1NTEyQVx1NTE0OFx1NUVBNicgfSxcbiAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgc2NvcGU6ICdkYXNoYm9hcmQnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICAvLyB6aC1DTiBgY3JpdGljYWxgIGlzIFx1NEUyNVx1OTFDRCwgbmV2ZXIgXHU3RDI3XHU2MDI1IFx1MjAxNCBcdTdEMjdcdTYwMjUgYmVsb25ncyB0byBjcm1fdGFzay5wcmlvcml0eS51cmdlbnRcbiAgICAgICAgLy8gYW5kIHRoZSB0d28gdm9jYWJ1bGFyaWVzIGFyZSBkaXN0aW5jdCBzZXRzIChydWxpbmcgIzEzNDIpLiBTYW1lIHdvcmRpbmcgYXNcbiAgICAgICAgLy8gYG9iamVjdHMuY3JtX2Nhc2UuZmllbGRzLnByaW9yaXR5Lm9wdGlvbnNgIGluIGV2ZXJ5IGxvY2FsZSBwYWNrLlxuICAgICAgICB7IHZhbHVlOiAnY3JpdGljYWwnLCBsYWJlbDogeyBlbjogJ0NyaXRpY2FsJywgJ3poLUNOJzogJ1x1NEUyNVx1OTFDRCcsICdlcy1FUyc6ICdDclx1MDBFRHRpY2EnLCAnamEtSlAnOiAnXHU5MUNEXHU1OTI3JyB9IH0sXG4gICAgICAgIHsgdmFsdWU6ICdoaWdoJywgICAgIGxhYmVsOiB7IGVuOiAnSGlnaCcsICd6aC1DTic6ICdcdTlBRDgnLCAnZXMtRVMnOiAnQWx0YScsICdqYS1KUCc6ICdcdTlBRDgnIH0gfSxcbiAgICAgICAgeyB2YWx1ZTogJ21lZGl1bScsICAgbGFiZWw6IHsgZW46ICdNZWRpdW0nLCAnemgtQ04nOiAnXHU0RTJEJywgJ2VzLUVTJzogJ01lZGlhJywgJ2phLUpQJzogJ1x1NEUyRCcgfSB9LFxuICAgICAgICB7IHZhbHVlOiAnbG93JywgICAgICBsYWJlbDogeyBlbjogJ0xvdycsICd6aC1DTic6ICdcdTRGNEUnLCAnZXMtRVMnOiAnQmFqYScsICdqYS1KUCc6ICdcdTRGNEUnIH0gfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXSxcblxuICB3aWRnZXRzOiBbXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyAxOiBDYXNlLUxvYWQgS1BJcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBpZDogJ29wZW5fY2FzZXMnLFxuICAgICAgdGl0bGU6ICdPcGVuIENhc2VzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2FzZXMgdGhhdCBhcmUgbm90IHlldCBjbG9zZWQnLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgaXNfY2xvc2VkOiBmYWxzZSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnb3JhbmdlJyxcbiAgICAgIGRhdGFzZXQsIHZhbHVlczogWydjYXNlX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMCwgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdjcml0aWNhbF9jYXNlcycsXG4gICAgICB0aXRsZTogJ0NyaXRpY2FsIENhc2VzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3BlbiBjYXNlcyBtYXJrZWQgYXMgY3JpdGljYWwgcHJpb3JpdHknLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgcHJpb3JpdHk6ICdjcml0aWNhbCcsIGlzX2Nsb3NlZDogZmFsc2UgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2RhbmdlcicsXG4gICAgICBkYXRhc2V0LCB2YWx1ZXM6IFsnY2FzZV9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDMsIHk6IDAsIHc6IDMsIGg6IDIgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnYXZnX3Jlc29sdXRpb25fdGltZScsXG4gICAgICB0aXRsZTogJ0F2ZyBSZXNvbHV0aW9uIFRpbWUnLFxuICAgICAgZGVzY3JpcHRpb246ICdNZWFuIHRpbWUgdG8gY2xvc2UsIGluIGhvdXJzJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IGlzX2Nsb3NlZDogdHJ1ZSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnYmx1ZScsXG4gICAgICBkYXRhc2V0LCB2YWx1ZXM6IFsnYXZnX3Jlc29sdXRpb24nXSxcbiAgICAgIGxheW91dDogeyB4OiA2LCB5OiAwLCB3OiAzLCBoOiAyIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ3NsYV92aW9sYXRpb25zJyxcbiAgICAgIHRpdGxlOiAnU0xBIFZpb2xhdGlvbnMnLFxuICAgICAgZGVzY3JpcHRpb246ICdDYXNlcyB0aGF0IGJyZWFjaGVkIHRoZWlyIFNMQScsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIC8vIENvdW50ZWQgYXQgUkVBRCB0aW1lICgjMjA3MCk6IGEgY2FzZSBhbHJlYWR5IGZsYWdnZWQsIE9SIGEgY2FzZSBzdGlsbFxuICAgICAgLy8gb3BlbiB3aG9zZSBkZWFkbGluZSBoYXMgcGFzc2VkLiBUaGUgc2Vjb25kIGJyYW5jaCBpcyB0aGUgc2VsZWN0aW9uXG4gICAgICAvLyBgY2FzZV9zbGFfbW9uaXRvcmAgc3dlZXBzIFx1MjAxNCBzYW1lIHN0YXR1cyBzZXQsIHNhbWUgc3RyaWN0IGAkbHRgIGF0IHRoZVxuICAgICAgLy8gY3VycmVudCBpbnN0YW50IChge25vd31gIGlzIHRoYXQgaW5zdGFudCBpbiBhIHF1ZXJ5IGZpbHRlcjsgYHtOT1coKX1gXG4gICAgICAvLyBpbiBhIGZsb3cgdGVtcGxhdGUpIFx1MjAxNCBzbyB0aGUgdGlsZSByZWFkcyB0cnVlIG9uIGEgZGVwbG95bWVudCB0aGF0IHJ1bnNcbiAgICAgIC8vIG5vIHNjaGVkdWxlZCB3b3JrLCB3aGVyZSBub3RoaW5nIGZsYWdzIGFuIG9wZW4gYnJlYWNoLiBJdCBjb3VudHM7IGl0XG4gICAgICAvLyBkb2VzIG5vdCBhY3Q6IGVzY2FsYXRpb24gYW5kIHRoZSBvd25lcidzIGFsZXJ0IHN0aWxsIG5lZWQgdGhlIHN3ZWVwLlxuICAgICAgLy8gYHRlc3QvY2FzZS1zbGEtYnJlYWNoLW9uLWNsb3NlLnRlc3QudHNgIHBpbnMgdGhlIHR3byB0byBvbmUgc2VsZWN0aW9uLlxuICAgICAgZmlsdGVyOiB7XG4gICAgICAgICRvcjogW1xuICAgICAgICAgIHsgaXNfc2xhX3Zpb2xhdGVkOiB0cnVlIH0sXG4gICAgICAgICAgeyBzdGF0dXM6IHsgJG5pbjogWydyZXNvbHZlZCcsICdjbG9zZWQnXSB9LCBzbGFfZHVlX2RhdGU6IHsgJGx0OiAne25vd30nIH0gfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICd3YXJuaW5nJyxcbiAgICAgIGRhdGFzZXQsIHZhbHVlczogWydjYXNlX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogOSwgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgUm93IDI6IERpc3RyaWJ1dGlvbiBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBpZDogJ2Nhc2VzX2J5X3N0YXR1cycsXG4gICAgICB0aXRsZTogJ0Nhc2VzIGJ5IFN0YXR1cycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1dvcmtsb2FkIGRpc3RyaWJ1dGlvbiBhY3Jvc3MgdGhlIHBpcGVsaW5lJyxcbiAgICAgIHR5cGU6ICdkb251dCcsXG4gICAgICBmaWx0ZXI6IHsgaXNfY2xvc2VkOiBmYWxzZSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnYmx1ZScsXG4gICAgICBkYXRhc2V0LCBkaW1lbnNpb25zOiBbJ3N0YXR1cyddLCB2YWx1ZXM6IFsnY2FzZV9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDIsIHc6IDQsIGg6IDQgfSxcbiAgICAgIGNoYXJ0Q29uZmlnOiB7XG4gICAgICAgIHNob3dMZWdlbmQ6IHRydWUsXG4gICAgICAgIHNob3dEYXRhTGFiZWxzOiB0cnVlLFxuICAgICAgICBjb2xvcnM6IFsnIzBFQTVFOScsICcjMDZCNkQ0JywgJyMxNEI4QTYnLCAnIzEwQjk4MScsICcjRjU5RTBCJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdjYXNlc19ieV9wcmlvcml0eScsXG4gICAgICB0aXRsZTogJ0Nhc2VzIGJ5IFByaW9yaXR5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3BlbiBjYXNlIG1peCBieSB1cmdlbmN5JyxcbiAgICAgIHR5cGU6ICdwaWUnLFxuICAgICAgZmlsdGVyOiB7IGlzX2Nsb3NlZDogZmFsc2UgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ3dhcm5pbmcnLFxuICAgICAgZGF0YXNldCwgZGltZW5zaW9uczogWydwcmlvcml0eSddLCB2YWx1ZXM6IFsnY2FzZV9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDQsIHk6IDIsIHc6IDQsIGg6IDQgfSxcbiAgICAgIGNoYXJ0Q29uZmlnOiB7XG4gICAgICAgIHNob3dMZWdlbmQ6IHRydWUsXG4gICAgICAgIHNob3dEYXRhTGFiZWxzOiB0cnVlLFxuICAgICAgICAvLyBjcml0aWNhbCBcdTIxOTIgaGlnaCBcdTIxOTIgbWVkaXVtIFx1MjE5MiBsb3dcbiAgICAgICAgY29sb3JzOiBbJyNEQzI2MjYnLCAnI0Y5NzMxNicsICcjRjU5RTBCJywgJyMxMEI5ODEnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2Nhc2VzX2J5X29yaWdpbicsXG4gICAgICB0aXRsZTogJ0Nhc2VzIGJ5IE9yaWdpbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ1doZXJlIG91ciBjYXNlcyBhcmUgY29taW5nIGZyb20nLFxuICAgICAgdHlwZTogJ2JhcicsXG4gICAgICBjb2xvclZhcmlhbnQ6ICdwdXJwbGUnLFxuICAgICAgZGF0YXNldCwgZGltZW5zaW9uczogWydvcmlnaW4nXSwgdmFsdWVzOiBbJ2Nhc2VfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiA4LCB5OiAyLCB3OiA0LCBoOiA0IH0sXG4gICAgICBjaGFydENvbmZpZzoge1xuICAgICAgICBzaG93TGVnZW5kOiBmYWxzZSxcbiAgICAgICAgc2hvd0RhdGFMYWJlbHM6IHRydWUsXG4gICAgICAgIGNvbG9yczogWycjOEI1Q0Y2J10sXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgUm93IDM6IFZvbHVtZSAmIFNMQSBUcmVuZHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgaWQ6ICdkYWlseV9jYXNlX3ZvbHVtZScsXG4gICAgICB0aXRsZTogJ0RhaWx5IENhc2UgVm9sdW1lJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTmV3IGNhc2VzIGNyZWF0ZWQgb3ZlciB0aGUgbGFzdCAzMCBkYXlzJyxcbiAgICAgIHR5cGU6ICdhcmVhJyxcbiAgICAgIGZpbHRlcjogeyBjcmVhdGVkX2F0OiB7ICRndGU6ICd7MzBfZGF5c19hZ299JyB9IH0sXG4gICAgICAvLyBPcHRlZCBvdXQgT04gUFVSUE9TRSwgcmUtZGVjaWRlZCBpbiAjMTE1NyByYXRoZXIgdGhhbiBpbmhlcml0ZWQuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIGZsb29yIGFib3ZlIGlzIG5vIGxvbmdlciBpbmVydDogb24gMTcuMC4wIGB7MzBfZGF5c19hZ299YCByZXNvbHZlc1xuICAgICAgLy8gdG8gYSBzdGFydC1vZi1kYXkgYm91bmQgdGhlIGRyaXZlciBjb21wYXJlcyBjb3JyZWN0bHkgKG1lYXN1cmVkLCB3aXRoIGFcbiAgICAgIC8vIGdyb3VuZCB0cnV0aCwgaW4gYHRlc3QvZGFzaGJvYXJkLWRhdGUtcmFuZ2Utd2luZG93LnRlc3QudHNgKSwgc28gdGhpc1xuICAgICAgLy8gY2hhcnQgcmVhbGx5IGRvZXMgcGxvdCB0aGUgbGFzdCAzMCBkYXlzIGFuZCBpdHMgdGl0bGUgaXMgdHJ1ZSBhZ2Fpbi5cbiAgICAgIC8vIFRoYXQgaXMgZXhhY3RseSB3aHkgaXQgbXVzdCBub3QgZm9sbG93IHRoZSBwaWNrZXI6IHRoZSBkYXNoYm9hcmQgcmFuZ2VcbiAgICAgIC8vIGlzIEFORGVkIGludG8gZXZlcnkgYm91bmQgd2lkZ2V0LCBzbyBhIHJlYWRlciB3aG8gc2VsZWN0cyBcImxhc3QgNyBkYXlzXCJcbiAgICAgIC8vIHdvdWxkIGdldCBhIDctZGF5IGNoYXJ0IHN0aWxsIGxhYmVsbGVkIFwibGFzdCAzMCBkYXlzXCIuIFNlbGYtZGVzY3JpYmVkXG4gICAgICAvLyB3aW5kb3dzIG9wdCBvdXQgXHUyMDE0IHRoZSBzYW1lIHJ1bGUgdGhlIEV4ZWN1dGl2ZSBkYXNoYm9hcmQncyBZVEQgdGlsZVxuICAgICAgLy8gZm9sbG93cywgcGlubmVkIGJ5IGB0ZXN0L2FjdGlvbi1yZWZlcmVuY2VzLnRlc3QudHNgLiBCaW5kaW5nIGl0IGluc3RlYWRcbiAgICAgIC8vIHdvdWxkIG1lYW4gZHJvcHBpbmcgdGhpcyBmaWx0ZXIgYW5kIHJldGl0bGluZyB0aGUgd2lkZ2V0IGluIGFsbCBmb3VyXG4gICAgICAvLyBsb2NhbGUgYnVuZGxlczsgdGhlIGZpeGVkIDMwLWRheSB2b2x1bWUgdHJlbmQgYmVzaWRlIGEgOTAtZGF5IGNhc2UgbG9hZFxuICAgICAgLy8gaXMgdGhlIGludGVuZGVkIHJlYWRpbmcuXG4gICAgICBmaWx0ZXJCaW5kaW5nczogeyBkYXRlUmFuZ2U6IGZhbHNlIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdibHVlJyxcbiAgICAgIGRhdGFzZXQsIGRpbWVuc2lvbnM6IFsnY3JlYXRlZF9hdCddLCB2YWx1ZXM6IFsnY2FzZV9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDYsIHc6IDgsIGg6IDQgfSxcbiAgICAgIGNoYXJ0Q29uZmlnOiB7XG4gICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlLFxuICAgICAgICBzaG93RGF0YUxhYmVsczogZmFsc2UsXG4gICAgICAgIGNvbG9yczogWycjMEVBNUU5J10sXG4gICAgICAgIGludGVyYWN0aW9uOiB7IHRvb2x0aXBzOiB0cnVlLCBicnVzaDogdHJ1ZSB9LFxuICAgICAgfSxcbiAgICAgIG9wdGlvbnM6IHsgZGF0ZUdyYW51bGFyaXR5OiAnZGF5JyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdzbGFfY29tcGxpYW5jZV9nYXVnZScsXG4gICAgICB0aXRsZTogJ1NMQSBDb21wbGlhbmNlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUGVyY2VudCBvZiBjYXNlcyByZXNvbHZlZCB3aXRoaW4gU0xBIHRoaXMgcGVyaW9kJyxcbiAgICAgIHR5cGU6ICdnYXVnZScsXG4gICAgICBmaWx0ZXI6IHsgaXNfY2xvc2VkOiB0cnVlIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdzdWNjZXNzJyxcbiAgICAgIC8vIFBsb3RzIENPTVBMSUFOQ0UsIHRoZSBxdWFudGl0eSB0aGUgdGl0bGUsIHRoZSBkZXNjcmlwdGlvbiwgdGhlXG4gICAgICAvLyBzdWNjZXNzIGNvbG91cmluZyBhbmQgdGhlIDAuOTUgdGFyZ2V0IGxpbmUgYWxsIG5hbWUgKCMxMjEzKS4gSXQgdXNlZFxuICAgICAgLy8gdG8gcGxvdCBgYXZnX3NsYV92aW9sYXRlZGAgXHUyMDE0IHRoZSBjb21wbGVtZW50IFx1MjAxNCB3aXRoIGBvcHRpb25zLmludmVydGBcbiAgICAgIC8vIGFza2luZyB0aGUgcmVuZGVyZXIgdG8gZmxpcCBpdC4gYGludmVydGAgaXMgbm90IGEgZGVjbGFyZWQga2V5IG9uXG4gICAgICAvLyBgRGFzaGJvYXJkV2lkZ2V0T3B0aW9uc1NjaGVtYWA7IGl0IHJvZGUgdGhlIGAucGFzc3Rocm91Z2goKWAsIG5vdGhpbmdcbiAgICAgIC8vIGNvdWxkIHJlcG9ydCBpdCBpbmVydCwgYW5kIHRoZSBnYXVnZSByZWFkIDAuMCUgb24gYW4gb3JnIHdpdGggMTAwJVxuICAgICAgLy8gY29tcGxpYW5jZS4gVGhlIGtleSBpcyBnb25lIHJhdGhlciB0aGFuIGxlZnQgcHJldGVuZGluZzogYSBtZWFzdXJlXG4gICAgICAvLyB0aGF0IG1lYW5zIHdoYXQgdGhlIHdpZGdldCBzYXlzIGlzIHRoZSBmaXgsIGFuZCB0aGUgbWVhc3VyZSdzIG93blxuICAgICAgLy8gbGFiZWwgcHJpbnRzIHVuZGVyIHRoZSBudW1iZXIsIHNvIHRoZSB0d28gY2Fubm90IGRyaWZ0IGFwYXJ0IGFnYWluLlxuICAgICAgZGF0YXNldCwgdmFsdWVzOiBbJ3NsYV9jb21wbGlhbmNlX3JhdGUnXSxcbiAgICAgIGxheW91dDogeyB4OiA4LCB5OiA2LCB3OiA0LCBoOiA0IH0sXG4gICAgICBjaGFydENvbmZpZzoge1xuICAgICAgICBzaG93TGVnZW5kOiBmYWxzZSxcbiAgICAgICAgc2hvd0RhdGFMYWJlbHM6IHRydWUsXG4gICAgICAgIGNvbG9yczogWycjMTBCOTgxJywgJyNGNTlFMEInLCAnI0VGNDQ0NCddLFxuICAgICAgICBhbm5vdGF0aW9uczogW1xuICAgICAgICAgIHsgdHlwZTogJ2xpbmUnLCBheGlzOiAneScsIHZhbHVlOiAwLjk1LCBsYWJlbDogJ1RhcmdldCcsIHN0eWxlOiAnZGFzaGVkJywgY29sb3I6ICcjMTBCOTgxJyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIC8vIFRoZSB0YXJnZXQgbGluZSB3YXMgd3JpdHRlbiBmb3IgQ09NUExJQU5DRSBhbmQgaXMgdW5jaGFuZ2VkOiBpdCB3YXNcbiAgICAgIC8vIGFsd2F5cyByaWdodCBcdTIwMTQgaXQgd2FzIHRoZSBwbG90dGVkIHZhbHVlIHRoYXQgZGlzYWdyZWVkIHdpdGggaXQuIChUaGVcbiAgICAgIC8vIGdyZWVuL2FtYmVyL3JlZCBgb3B0aW9ucy50aHJlc2hvbGRzYCBsYWRkZXIgYmVzaWRlIGl0IHdhcyBkZWxldGVkIGluXG4gICAgICAvLyAxNy42LjAncyBzdHJpY3QgY2xlYW51cDogbm8gZGFzaGJvYXJkIHJlbmRlcmVyIHJlYWRzIHdpZGdldFxuICAgICAgLy8gYHRocmVzaG9sZHNgLCBzbyBpdCBuZXZlciBjb2xvdXJlZCBhbnl0aGluZy4pXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSb3cgNDogS25vd2xlZGdlIGRlZmxlY3Rpb24gKCM2MDEpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gVGhlIGRlZmxlY3Rpb24gbWV0cmljIHRoZSBjYXJkIGFza3MgdGhlIHNlcnZpY2UgZGFzaGJvYXJkIHRvIHNob3csIGFuZFxuICAgIC8vIHRoZSByZWFzb24gaXQgaXMgVEhSRUUgdGlsZXMgcmF0aGVyIHRoYW4gb25lOiBhIHJhdGlvIHdpZGdldCBvbiBpdHMgb3duXG4gICAgLy8gaXMgdW5yZWFkYWJsZSBcdTIwMTQgMTAwJSBjb3VsZCBiZSBcIjQwIG9mIDQwXCIgb3IgXCIxIG9mIDFcIiwgYW5kIGEgYmxhbmsgcmF0ZVxuICAgIC8vIGNvdWxkIGJlIFwibm8gY2xvc2VkIGNhc2VzXCIgb3IgXCJubyBLQiByZXNvbHV0aW9uc1wiIChtZWFzdXJlZDogYSBmaWx0ZXJlZFxuICAgIC8vIG1lYXN1cmUgY29udHJpYnV0ZXMgTk8gcm93IGZvciBhIGdyb3VwIGl0IHNlbGVjdHMgbm90aGluZyBpbiwgc28gdGhlXG4gICAgLy8gcmF0ZSBjb21lcyBiYWNrIGFic2VudCwgbm90IDApLiBOdW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIHRoZXJlZm9yZSBzaGlwXG4gICAgLy8gYmVzaWRlIHRoZSBwZXJjZW50YWdlLCB0aGUgc2FtZSBydWxlIHRoZSBzYWxlcyBkYXNoYm9hcmQncyB3aW4gcmF0ZVxuICAgIC8vIGZvbGxvd3MgYWZ0ZXIgIzYxNC5cbiAgICB7XG4gICAgICBpZDogJ2tiX2RlZmxlY3Rpb25fcmF0ZScsXG4gICAgICB0aXRsZTogJ0tCIERlZmxlY3Rpb24gUmF0ZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NoYXJlIG9mIGNsb3NlZCBjYXNlcyByZXNvbHZlZCB3aXRoIGEga25vd2xlZGdlIGFydGljbGUnLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBjb2xvclZhcmlhbnQ6ICdzdWNjZXNzJyxcbiAgICAgIGRhdGFzZXQsIHZhbHVlczogWydrYl9kZWZsZWN0aW9uX3JhdGUnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAxMCwgdzogNCwgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdrYl9yZXNvbHZlZF9jYXNlcycsXG4gICAgICB0aXRsZTogJ1Jlc29sdmVkIGJ5IEtCJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2xvc2VkIGNhc2VzIHBvaW50aW5nIGF0IHRoZSBhcnRpY2xlIHRoYXQgcmVzb2x2ZWQgdGhlbScsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgZGF0YXNldCwgdmFsdWVzOiBbJ2tiX3Jlc29sdmVkX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogNCwgeTogMTAsIHc6IDQsIGg6IDIgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnY2xvc2VkX2Nhc2VzX3RvdGFsJyxcbiAgICAgIHRpdGxlOiAnQ2xvc2VkIENhc2VzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRlbm9taW5hdG9yIGJlaGluZCB0aGUgZGVmbGVjdGlvbiByYXRlJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgY29sb3JWYXJpYW50OiAnZGVmYXVsdCcsXG4gICAgICBkYXRhc2V0LCB2YWx1ZXM6IFsnY2xvc2VkX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogOCwgeTogMTAsIHc6IDQsIGg6IDIgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAndG9wX3Jlc29sdmluZ19hcnRpY2xlcycsXG4gICAgICB0aXRsZTogJ1RvcCBSZXNvbHZpbmcgQXJ0aWNsZXMnLFxuICAgICAgZGVzY3JpcHRpb246ICdLbm93bGVkZ2UgYXJ0aWNsZXMgcmFua2VkIGJ5IHRoZSBjbG9zZWQgY2FzZXMgdGhleSByZXNvbHZlZCcsXG4gICAgICB0eXBlOiAndGFibGUnLFxuICAgICAgZmlsdGVyOiB7IGlzX2Nsb3NlZDogdHJ1ZSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnZGVmYXVsdCcsXG4gICAgICBkYXRhc2V0LCBkaW1lbnNpb25zOiBbJ3Jlc29sdmVkX2FydGljbGUnXSwgdmFsdWVzOiBbJ2tiX3Jlc29sdmVkX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMCwgeTogMTIsIHc6IDEyLCBoOiA0IH0sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHNvcnRCeTogJ2tiX3Jlc29sdmVkX2NvdW50JyxcbiAgICAgICAgc29ydE9yZGVyOiAnZGVzYycsXG4gICAgICAgIGxpbWl0OiAxMCxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSb3cgNTogTXkgT3BlbiBDYXNlcyBieSBQcmlvcml0eSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvLyBBIGRhc2hib2FyZCBgdGFibGVgIGJpbmRzIHRvIGFuIGFuYWx5dGljcyBjdWJlIGFuZCBhZ2dyZWdhdGVzOyBpdCBjYW5ub3RcbiAgICAvLyBsaXN0IGluZGl2aWR1YWwgY2FzZXMgKEFEUi0wMDIxKSBcdTIwMTQgZm9yIHRoZSBjYXNlLWJ5LWNhc2UgcXVldWUsIHVzZSB0aGVcbiAgICAvLyBteV9vcGVuX2Nhc2VzIExpc3RWaWV3IChcIk15IENhc2VzXCIgaW4gdGhlIE15IFdvcmsgbmF2IGdyb3VwKS5cbiAgICAvLyBge2N1cnJlbnRfdXNlcl9pZH1gIHNjb3BlcyB3aGF0IHRoaXMgd2lkZ2V0IFNIT1dTOyBpdCBpcyBwcmVzZW50YXRpb25cbiAgICAvLyBzY29wZSwgbm90IGFuIGFjY2VzcyBib3VuZGFyeSBcdTIwMTQgcm93LWxldmVsIHNlY3VyaXR5IG93bnMgdGhhdCAoIzUxMCkuXG4gICAge1xuICAgICAgaWQ6ICdteV9vcGVuX2Nhc2VzX2J5X3ByaW9yaXR5JyxcbiAgICAgIHRpdGxlOiAnTXkgT3BlbiBDYXNlcyBieSBQcmlvcml0eScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1lvdXIgb3BlbiBjYXNlcyBhbmQgdGhlaXIgU0xBLXZpb2xhdGlvbiByYXRlLCBicm9rZW4gZG93biBieSBwcmlvcml0eScsXG4gICAgICB0eXBlOiAndGFibGUnLFxuICAgICAgZmlsdGVyOiB7IGlzX2Nsb3NlZDogZmFsc2UsIG93bmVyX2lkOiAne2N1cnJlbnRfdXNlcl9pZH0nIH0sXG4gICAgICAvLyBPcHRzIG91dCBvZiB0aGUgQWdlbnQgZ2xvYmFsIGZpbHRlciAoa2V5ZWQgYnkgaXRzIGZpZWxkLCBgb3duZXJfaWRgKTpcbiAgICAgIC8vIEFORGluZyBhbiBhZ2VudCBwaWNrIGludG8gXCJtaW5lXCIgZW1wdGllcyB0aGUgd2lkZ2V0IGZvciBhbnlvbmUgZWxzZS5cbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IG93bmVyX2lkOiBmYWxzZSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnZGVmYXVsdCcsXG4gICAgICBkYXRhc2V0LCBkaW1lbnNpb25zOiBbJ3ByaW9yaXR5J10sIHZhbHVlczogWydjYXNlX2NvdW50JywgJ2F2Z19zbGFfdmlvbGF0ZWQnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAxNiwgdzogMTIsIGg6IDQgfSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgc29ydEJ5OiAnY2FzZV9jb3VudCcsXG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuICAgICAgICBsaW1pdDogMTAsXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9kYXRhc2V0cy9jYXNlLmRhdGFzZXQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9kYXRhc2V0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2RhdGFzZXRzL2Nhc2UuZGF0YXNldC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lRGF0YXNldCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBDYXNlIGFuYWx5dGljcyBkYXRhc2V0IChBRFItMDAyMSkgXHUyMDE0IHRoZSBzZW1hbnRpYyBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZVxuICogU2VydmljZSBkYXNoYm9hcmQncyBjYXNlIGNvdW50cywgcmVzb2x1dGlvbiB0aW1lIGFuZCBTTEEgY29tcGxpYW5jZS5cbiAqL1xuZXhwb3J0IGNvbnN0IENhc2VEYXRhc2V0ID0gZGVmaW5lRGF0YXNldCh7XG4gIG5hbWU6ICdjYXNlX21ldHJpY3MnLFxuICBsYWJlbDogJ0Nhc2UgTWV0cmljcycsXG4gIGRlc2NyaXB0aW9uOiAnU2VtYW50aWMgbGF5ZXIgZm9yIHN1cHBvcnQtY2FzZSBjb3VudHMsIHJlc29sdXRpb24gdGltZSBhbmQgU0xBJyxcbiAgb2JqZWN0OiAnY3JtX2Nhc2UnLFxuXG4gIGRpbWVuc2lvbnM6IFtcbiAgICB7IG5hbWU6ICdzdGF0dXMnLCBsYWJlbDogJ1N0YXR1cycsIGZpZWxkOiAnc3RhdHVzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICB7IG5hbWU6ICdwcmlvcml0eScsIGxhYmVsOiAnUHJpb3JpdHknLCBmaWVsZDogJ3ByaW9yaXR5JywgdHlwZTogJ3N0cmluZycgfSxcbiAgICB7IG5hbWU6ICdvcmlnaW4nLCBsYWJlbDogJ09yaWdpbicsIGZpZWxkOiAnb3JpZ2luJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICB7IG5hbWU6ICd0eXBlJywgbGFiZWw6ICdUeXBlJywgZmllbGQ6ICd0eXBlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAvLyBUaGUgcGxhdGZvcm0ncyBjcmVhdGlvbiBzdGFtcCAoIzE5OTIpIFx1MjAxNCB0aGUgc2FtZSBkaW1lbnNpb25cbiAgICAvLyBgYWNjb3VudF9tZXRyaWNzYCBhbmQgYGxlYWRfbWV0cmljc2AgZGVjbGFyZSwgYnVja2V0ZWQgYnkgZGF5IGhlcmUuXG4gICAgeyBuYW1lOiAnY3JlYXRlZF9hdCcsIGxhYmVsOiAnQ3JlYXRlZCcsIGZpZWxkOiAnY3JlYXRlZF9hdCcsIHR5cGU6ICdkYXRlJywgZGF0ZUdyYW51bGFyaXR5OiAnZGF5JyB9LFxuICAgIC8vIEFydGljbGUgcmFua2luZyBieSByZXNvbHV0aW9ucyAoIzYwMSkgXHUyMDE0IGdyb3VwIGNsb3NlZCBjYXNlcyBieSB0aGVcbiAgICAvLyBhcnRpY2xlIHRoYXQgcmVzb2x2ZWQgdGhlbS4gYHR5cGU6ICdsb29rdXAnYCwgdGhlIHNhbWUgc3BlbGxpbmcgdGhlXG4gICAgLy8gYG93bmVyYCBkaW1lbnNpb24gb24gYG9wcG9ydHVuaXR5X21ldHJpY3NgIHVzZXMgZm9yIGBvd25lcl9pZGAuXG4gICAgeyBuYW1lOiAncmVzb2x2ZWRfYXJ0aWNsZScsIGxhYmVsOiAnUmVzb2x2aW5nIEFydGljbGUnLCBmaWVsZDogJ3Jlc29sdmVkX2J5X2FydGljbGUnLCB0eXBlOiAnbG9va3VwJyB9LFxuICBdLFxuXG4gIG1lYXN1cmVzOiBbXG4gICAgeyBuYW1lOiAnY2FzZV9jb3VudCcsIGxhYmVsOiAnQ2FzZXMnLCBhZ2dyZWdhdGU6ICdjb3VudCcgfSxcbiAgICB7IG5hbWU6ICdhdmdfcmVzb2x1dGlvbicsIGxhYmVsOiAnQXZnIFJlc29sdXRpb24gKGgpJywgYWdncmVnYXRlOiAnYXZnJywgZmllbGQ6ICdyZXNvbHV0aW9uX3RpbWVfaG91cnMnLCBmb3JtYXQ6ICcwLjAnIH0sXG4gICAgeyBuYW1lOiAnYXZnX3NsYV92aW9sYXRlZCcsIGxhYmVsOiAnU0xBIFZpb2xhdGlvbiBSYXRlJywgYWdncmVnYXRlOiAnYXZnJywgZmllbGQ6ICdpc19zbGFfdmlvbGF0ZWQnLCBmb3JtYXQ6ICcwLjAlJyB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEtub3dsZWRnZSBkZWZsZWN0aW9uICgjNjAxKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIFwiJSBvZiBjbG9zZWQgY2FzZXMgcmVzb2x2ZWQgd2l0aCBhbiBhcnRpY2xlXCIuIEJ1aWx0IHRvIHRoZSBzaGFwZVxuICAgIC8vIGBvcHBvcnR1bml0eV9tZXRyaWNzLndpbl9yYXRlYCBhcnJpdmVkIGF0IHRoZSBoYXJkIHdheSAoIzU5My8jNjE0KTogdGhlXG4gICAgLy8gdHdvIGhhbHZlcyBvZiB0aGUgcmF0aW8gYXJlIGRlY2xhcmVkIEhFUkUgYXMgbmFtZWQgbWVhc3VyZXMsIG9uY2UsIHNvIG5vXG4gICAgLy8gd2lkZ2V0IGltcHJvdmlzZXMgYSBkZW5vbWluYXRvciBcdTIwMTQgYSB3cm9uZyBkZW5vbWluYXRvciBkb2VzIG5vdCBlcnJvciwgaXRcbiAgICAvLyByZXR1cm5zIGEgcGxhdXNpYmxlIG51bWJlci5cbiAgICAvL1xuICAgIC8vIEVhY2ggaGFsZiBjYXJyaWVzIGl0cyBPV04gYGZpbHRlcmAsIHdoaWNoIHRoZSBleGVjdXRvciBydW5zIGFzIGFcbiAgICAvLyBzdWItcXVlcnkgYW5kIG1lcmdlcyBiYWNrIG9uIHRoZSBzZWxlY3RlZCBkaW1lbnNpb25zLiBBIHdpZGdldC1sZXZlbFxuICAgIC8vIGZpbHRlciBjYW5ub3QgZXhwcmVzcyB0aGlzOiBpdCB3b3VsZCBuYXJyb3cgQk9USCBoYWx2ZXMgdG8gdGhlIHNhbWUgcm93XG4gICAgLy8gc2V0LCB3aGljaCBpcyBob3cgeW91IGVuZCB1cCBkaXZpZGluZyBhIG51bWJlciBieSBpdHNlbGYuXG4gICAgLy9cbiAgICAvLyBga2JfcmVzb2x2ZWRfY291bnRgIGNvdW50cyB0aGUgQ09MVU1OLCBub3QgdGhlIHJvd3M6IGBjb3VudCg8ZmllbGQ+KWBcbiAgICAvLyBjb3VudHMgbm9uLU5VTEwgdmFsdWVzLCBzbyBpdCBuZWVkcyBubyBgJG5lOiBudWxsYCBwcmVkaWNhdGUgYW5kIG5vXG4gICAgLy8gcGFyYWxsZWwgYm9vbGVhbiBmbGFnIHRvIGRyaWZ0IG91dCBvZiBzdGVwIHdpdGggdGhlIGxvb2t1cC4gTUVBU1VSRUQgb25cbiAgICAvLyAxNy4wLjAtcmMuNiBhZ2FpbnN0IGJvdGggZHJpdmVycyBcdTIwMTQgdGhlIG51bWJlcnMgYXJlIHBpbm5lZCBpblxuICAgIC8vIGB0ZXN0L2tub3dsZWRnZS1kZWZsZWN0aW9uLnRlc3QudHNgLiBUaGUgb25lIHRoaW5nIGl0IENBTk5PVCBkaXNjb3VudCBpc1xuICAgIC8vIGFuIGVtcHR5IHN0cmluZywgd2hpY2ggaXMgbm9uLU5VTEw7IHRoYXQgaXMgd2h5IHRoZSBibGFuayBpcyBub3JtYWxpc2VkXG4gICAgLy8gdG8gTlVMTCBhdCB3cml0ZSB0aW1lIGJ5IGBjYXNlX3Jlc29sdXRpb25fYXJ0aWNsZV9ub3JtYWxpemVgLCBhbmQgd2h5XG4gICAgLy8gdGhhdCBob29rIGlzIHBhcnQgb2YgdGhpcyBtZXRyaWMgcmF0aGVyIHRoYW4gYSB0aWR5LXVwIGJlc2lkZSBpdC5cbiAgICAvL1xuICAgIC8vIEV2ZXJ5IHdpZGdldCB0aGF0IHNob3dzIGBrYl9kZWZsZWN0aW9uX3JhdGVgIGFsc28gc2hvd3NcbiAgICAvLyBga2JfcmVzb2x2ZWRfY291bnRgIGFuZCBgY2xvc2VkX2NvdW50YCBiZXNpZGUgaXQsIHNvIGEgcmVhZGVyIGNhbiBjaGVja1xuICAgIC8vIHRoZSBhcml0aG1ldGljIHRoYXQgcHJvZHVjZWQgdGhlIHBlcmNlbnRhZ2UuXG4gICAgeyBuYW1lOiAnY2xvc2VkX2NvdW50JywgbGFiZWw6ICdDbG9zZWQgQ2FzZXMnLCBhZ2dyZWdhdGU6ICdjb3VudCcsIGZpbHRlcjogeyBpc19jbG9zZWQ6IHRydWUgfSB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdrYl9yZXNvbHZlZF9jb3VudCcsXG4gICAgICBsYWJlbDogJ1Jlc29sdmVkIGJ5IEtCJyxcbiAgICAgIGFnZ3JlZ2F0ZTogJ2NvdW50JyxcbiAgICAgIGZpZWxkOiAncmVzb2x2ZWRfYnlfYXJ0aWNsZScsXG4gICAgICBmaWx0ZXI6IHsgaXNfY2xvc2VkOiB0cnVlIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAna2JfZGVmbGVjdGlvbl9yYXRlJyxcbiAgICAgIGxhYmVsOiAnS0IgRGVmbGVjdGlvbiBSYXRlJyxcbiAgICAgIGRlcml2ZWQ6IHsgb3A6ICdyYXRpbycsIG9mOiBbJ2tiX3Jlc29sdmVkX2NvdW50JywgJ2Nsb3NlZF9jb3VudCddIH0sXG4gICAgICBmb3JtYXQ6ICcwJScsXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTTEEgY29tcGxpYW5jZSAoIzEyMTMpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gVGhlIHNlcnZpY2UgZGFzaGJvYXJkJ3MgZ2F1Z2UgYXNrcyBcImFyZSB3ZSBtZWV0aW5nIFNMQT9cIiwgc28gdGhlIG51bWJlclxuICAgIC8vIGl0IHBsb3RzIGhhcyB0byBCRSBjb21wbGlhbmNlLiBJdCB1c2VkIHRvIHBsb3QgYGF2Z19zbGFfdmlvbGF0ZWRgIFx1MjAxNCB0aGVcbiAgICAvLyBjb21wbGVtZW50IFx1MjAxNCBhbmQgYXNrIHRoZSByZW5kZXJlciB0byBmbGlwIGl0IHdpdGggYG9wdGlvbnMuaW52ZXJ0YC4gVGhhdFxuICAgIC8vIGtleSBpcyBub3QgZGVjbGFyZWQgYnkgYERhc2hib2FyZFdpZGdldE9wdGlvbnNTY2hlbWFgOyBpdCByaWRlcyB0aGVcbiAgICAvLyBzY2hlbWEncyBgLnBhc3N0aHJvdWdoKClgLCBzbyBubyB2YWxpZGF0b3IsIGxpbnQgcnVsZSBvciBnYXRlIGNvdWxkIGV2ZXJcbiAgICAvLyB0ZWxsIHRoZSBhdXRob3IgaXQgZG9lcyBub3RoaW5nIFx1MjAxNCBhbmQgbm9uZSBkaWQuIFRoZSBnYXVnZSByZWFkIDAuMCUgb25cbiAgICAvLyBhbiBvcmcgd2l0aCAxMDAlIGNvbXBsaWFuY2UuXG4gICAgLy9cbiAgICAvLyBTcGVsbGVkIGFzIGEgcmF0aW8gb2YgdHdvIGNvdW50cyByYXRoZXIgdGhhbiBgMSAtIGF2Z19zbGFfdmlvbGF0ZWRgXG4gICAgLy8gYmVjYXVzZSBgRGVyaXZlZE1lYXN1cmVPcGAgb3BlcmFuZHMgYXJlIE1FQVNVUkUgTkFNRVMgb25seSAoYG9mOlxuICAgIC8vIHN0cmluZ1tdYCBcdTIwMTQgXCJubyByYXcgZmllbGRzLCBubyByYXcgU1FMXCIpLCBzbyB0aGVyZSBpcyBubyBsaXRlcmFsIGAxYCB0b1xuICAgIC8vIHN1YnRyYWN0IGZyb20uIGBkaWZmZXJlbmNlYCBjYW5ub3QgZXhwcmVzcyBpdCBlaXRoZXIuIFRoaXMgaXMgdGhlIGNhcmQnc1xuICAgIC8vIG93biBzZWNvbmQgb3B0aW9uIGFuZCB0aGUgc3BlYydzIHNhbmN0aW9uZWQgc2hhcGUgXHUyMDE0IHRoZSBvbmVcbiAgICAvLyBga2JfZGVmbGVjdGlvbl9yYXRlYCBhYm92ZSBhbHJlYWR5IHVzZXMuXG4gICAgLy9cbiAgICAvLyBgaXNfc2xhX3Zpb2xhdGVkOiBmYWxzZWAsIG5vdCBgJG5lOiB0cnVlYDogdGhlIGZpZWxkIGRlY2xhcmVzXG4gICAgLy8gYGRlZmF1bHRWYWx1ZTogZmFsc2VgLCBhbmQgTUVBU1VSRUQgb24gYm90aCBkcml2ZXJzIHRoaXMgYXBwIHJ1bnMsIGFcbiAgICAvLyBjbG9zZWQgY2FzZSBpbnNlcnRlZCB3aXRob3V0IHRoZSBjb2x1bW4gc3RvcmVzIGBmYWxzZWAgcmF0aGVyIHRoYW4gTlVMTC5cbiAgICAvLyBTbyBgc2xhX21ldF9jb3VudCArIHZpb2xhdGVkID0gY2xvc2VkX2NvdW50YCBob2xkcyB3aXRoIG5vIE5VTEwgaG9sZS5cbiAgICAvLyBCb3RoIHNwZWxsaW5ncyBtZWFzdXJlZCBpZGVudGljYWwgKDIgb2YgMywgYm90aCBkcml2ZXJzKTsgdGhlIHBsYWluIG9uZVxuICAgIC8vIGlzIHRoZSBvbmUgdGhhdCByZWFkcyBhcyB3aGF0IGl0IG1lYW5zLlxuICAgIC8vXG4gICAgLy8gVGhlIGRlbm9taW5hdG9yIGlzIGBjbG9zZWRfY291bnRgLCBhbHJlYWR5IGRlY2xhcmVkIGFib3ZlIFx1MjAxNCB0aGUgc2FtZVxuICAgIC8vIG1lYXN1cmUgdGhlIGBjbG9zZWRfY2FzZXNfdG90YWxgIHRpbGUgc2hvd3MsIHNvIGEgcmVhZGVyIGNhbiBjaGVjayB0aGVcbiAgICAvLyBwZXJjZW50YWdlIGFnYWluc3QgYSBudW1iZXIgb24gdGhlIHNhbWUgcGFnZS4gQW4gZW1wdHkgbnVtZXJhdG9yIGdyb3VwXG4gICAgLy8gZG9lcyBOT1QgYmxhbmsgdGhlIHJhdGU6IHRoZSBleGVjdXRvciBmaWxscyBhIGBjb3VudGAgY29sdW1uJ3MgZW1wdHlcbiAgICAvLyBncm91cCB3aXRoIDAgQkVGT1JFIGV2YWx1YXRpbmcgZGVyaXZlZCBtZWFzdXJlcywgc28gYSBmdWxseS1icmVhY2hlZCBvcmdcbiAgICAvLyByZWFkcyAwJSwgbm90IGJsYW5rLiBBIHplcm8gREVOT01JTkFUT1IgKG5vIGNsb3NlZCBjYXNlcyBhdCBhbGwpIGRvZXNcbiAgICAvLyByZXR1cm4gbnVsbCBcdTIwMTQgXCJubyBkYXRhXCIsIHdoaWNoIGlzIHRoZSBob25lc3QgcmVhZGluZy5cbiAgICB7IG5hbWU6ICdzbGFfbWV0X2NvdW50JywgbGFiZWw6ICdDYXNlcyBXaXRoaW4gU0xBJywgYWdncmVnYXRlOiAnY291bnQnLCBmaWx0ZXI6IHsgaXNfY2xvc2VkOiB0cnVlLCBpc19zbGFfdmlvbGF0ZWQ6IGZhbHNlIH0gfSxcbiAgICB7XG4gICAgICBuYW1lOiAnc2xhX2NvbXBsaWFuY2VfcmF0ZScsXG4gICAgICBsYWJlbDogJ1NMQSBDb21wbGlhbmNlIFJhdGUnLFxuICAgICAgZGVyaXZlZDogeyBvcDogJ3JhdGlvJywgb2Y6IFsnc2xhX21ldF9jb3VudCcsICdjbG9zZWRfY291bnQnXSB9LFxuICAgICAgZm9ybWF0OiAnMCUnLFxuICAgIH0sXG4gIF0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9fYnVuZGxlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvX2J1bmRsZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBFbWFpbFRlbXBsYXRlRGVmaW5pdGlvbiB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbi8qKlxuICogVGhlIG9uZSBzcGVsbGluZyBvZiBcImEgbG9jYWxlIHBhY2sgYmVjb21lcyBgc3lzX2VtYWlsX3RlbXBsYXRlYCByb3dzXCIsXG4gKiBzaGFyZWQgYnkgZXZlcnkgcGFja2FnZSB0aGF0IG93bnMgbm90aWZpY2F0aW9uIHRlbXBsYXRlcy5cbiAqXG4gKiBgRW1haWxUZW1wbGF0ZURlZmluaXRpb25gIGNhcnJpZXMgT05FIGBsb2NhbGVgIHBlciByb3csIHNvIGFuIG4tbGFuZ3VhZ2VcbiAqIGJ1bmRsZSBpcyBuIHJvd3Mgb2YgdGhlIHNhbWUgYG5hbWVgIFx1MjAxNCB0aGF0IGlzIHRoZSBzcGVjJ3Mgb3duIGtleSwgbm90IGFcbiAqIGNvbnZlbnRpb24gdGhpcyByZXBvIHBpY2tlZC4gV3JpdGluZyB0aG9zZSByb3dzIG91dCBieSBoYW5kIHdvdWxkIG1lYW5cbiAqIHJlcGVhdGluZyBgbmFtZWAgYW5kIHRoZSByb3cgc2NhZmZvbGRpbmcgZm91ciB0aW1lcyBwZXJcbiAqIHRlbXBsYXRlOyBoZXJlIGVhY2ggbG9jYWxlIHBhY2sgc3RhdGVzIG9ubHkgd2hhdCBhY3R1YWxseSBkaWZmZXJzIGJldHdlZW5cbiAqIGxhbmd1YWdlcyAodGhlIGxhYmVsIGFuZCB0aGUgdHdvIGJvZGllcykgYW5kIHRoaXMgaGVscGVyIHByb2R1Y2VzIHRoZSByb3dzLlxuICpcbiAqIEl0IGxpdmVzIGluIGBzcmMvc2FsZXMvYCBiZWNhdXNlIGBzcmMvc2VydmljZS9gIGFuZCBgc3JjL3JldmVudWUvYCBib3RoIG5lZWRcbiAqIGl0OiBhIHNvdXJjZSBtb3JlIHRoYW4gb25lIHBhY2thZ2UgbmVlZHMgaGFzIG9uZSBkZXRlcm1pbmlzdGljIGhvbWUsIHRoZVxuICogbG93ZXN0IHBhY2thZ2UgYWxsIGl0cyBjb25zdW1lcnMgZGVwZW5kIG9uIChBR0VOVFMubWQgaW1wb3J0IHJ1bGUgMiksIGFuZFxuICogbW9kdWxlcyBpbXBvcnQgaXQgYWxvbmcgdGhlaXIgZWRnZSBpbnRvIHNhbGVzIFx1MjAxNCB0aGUgc2FtZSBwbGFjZW1lbnQgYXNcbiAqIGBmbG93cy9fZ3VhcmRlZC1pdGVyYXRpb24udHNgIGFuZCBgb2JqZWN0cy9faG9vay1hcGkudHNgLlxuICovXG5cbi8qKlxuICogV2hhdCBvbmUgdGVtcGxhdGUgbG9va3MgbGlrZSBpbiBPTkUgbGFuZ3VhZ2UgXHUyMDE0IGV2ZXJ5IGZpZWxkIG9mXG4gKiBgRW1haWxUZW1wbGF0ZURlZmluaXRpb25gIHdob3NlIHZhbHVlIGlzIGdlbnVpbmVseSBwZXItbG9jYWxlLlxuICpcbiAqIGBsYWJlbGAgaXMgaW4gaGVyZSBiZWNhdXNlIGl0IGlzIHRoZSBTdHVkaW8gZGlzcGxheSBuYW1lIGFuIGFkbWluaXN0cmF0b3JcbiAqIHJlYWRzLCBzbyBpdCBsb2NhbGl6ZXMgd2l0aCB0aGUgY29udGVudDsgYG5hbWVgIGFuZCBgbG9jYWxlYCBhcmUgbm90LCBhbmRcbiAqIHtAbGluayBidW5kbGV9IHN1cHBsaWVzIHRoZW0gb25jZSBwZXIgcm93LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsaXplZEVtYWlsVGVtcGxhdGUge1xuICAvKiogU3R1ZGlvIGRpc3BsYXkgbGFiZWwgZm9yIHRoaXMgdGVtcGxhdGUsIGluIHRoaXMgbGFuZ3VhZ2UuICovXG4gIGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBTdWJqZWN0IGxpbmU7IGB7e3Zhcn19YCBob2xlcyBhcmUgZmlsbGVkIGZyb20gdGhlIG5vdGlmeSBub2RlJ3MgYHRlbXBsYXRlRGF0YWAuICovXG4gIHN1YmplY3Q6IHN0cmluZztcbiAgLyoqIEhUTUwgYm9keTsgc2FtZSBge3t2YXJ9fWAgaG9sZXMuIGBib2R5VGV4dGAgaXMgZGVyaXZlZCBieSB0aGUgc2VydmljZSB3aGVuIG9taXR0ZWQuICovXG4gIGJvZHlIdG1sOiBzdHJpbmc7XG59XG5cbi8qKiBPbmUgbGFuZ3VhZ2UncyBmYWNlIG9mIGV2ZXJ5IHRlbXBsYXRlIGEgcGFja2FnZSBvd25zLCBrZXllZCBieSB0ZW1wbGF0ZSBuYW1lLiAqL1xuZXhwb3J0IHR5cGUgRW1haWxUZW1wbGF0ZVBhY2sgPSBSZWNvcmQ8c3RyaW5nLCBMb2NhbGl6ZWRFbWFpbFRlbXBsYXRlPjtcblxuLyoqXG4gKiBDcm9zcyBhIHBhY2thZ2UncyBsb2NhbGUgcGFja3MgaW50byB0aGUgZmxhdCBgKG5hbWUsIGxvY2FsZSlgIHJvd3NcbiAqIGBkZWZpbmVTdGFjayh7IGVtYWlsVGVtcGxhdGVzIH0pYCB0YWtlcy5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgVGhlIEVOR0xJU0ggcGFjayBpcyByZWdpc3RlcmVkIHVuZGVyIGBlbi1VU2AsIG5vdCBgZW5gLCBhbmQgdGhhdCBpcyB0aGVcbiAqIHJlc29sdXRpb24gbGFkZGVyJ3MgZG9pbmcgcmF0aGVyIHRoYW4gYSBzdHlsZSBjaG9pY2UuXG4gKiBgRW1haWxTZXJ2aWNlLnJlc29sdmVBbmRSZW5kZXJUZW1wbGF0ZWAgbWF0Y2hlcyBgKG5hbWUsIGxvY2FsZSlgIEVYQUNUTFksXG4gKiB0aGVuIHJldHJpZXMgZXhhY3RseSBvbmNlIGFnYWluc3QgaXRzIG93biBgREVGQVVMVF9URU1QTEFURV9MT0NBTEVgIFx1MjAxNCB0aGVcbiAqIGxpdGVyYWwgYCdlbi1VUydgLiBBIHJlY2lwaWVudCB3aG9zZSBgc3lzX3VzZXIubG9jYWxlYCBpcyB0aGlzIGFwcCdzIGRlZmF1bHRcbiAqIGAnZW4nYCB0aGVyZWZvcmUgbWlzc2VzIG9uIHRoZSBmaXJzdCBwcm9iZSBhbmQgbGFuZHMgb24gdGhlIHNlY29uZDsgYVxuICogcmVjaXBpZW50IGNhcnJ5aW5nIGAnZW4tVVMnYCAob3IgYW55IGxvY2FsZSB0aGlzIGFwcCBzaGlwcyBubyBwYWNrIGZvcilcbiAqIGxhbmRzIG9uIGl0IGRpcmVjdGx5LiBUYWdnaW5nIHRoZSByb3dzIGAnZW4nYCBpbnN0ZWFkIHdvdWxkIGludmVydCB0aGF0OlxuICogYCdlbi1VUydgIGlzIGEgdHJ1dGh5IHByZWZlcnJlZCBsb2NhbGUsIHNvIHRoZSB0aGlyZCBwcm9iZSBpcyBza2lwcGVkIGFuZFxuICogdGhlIHNlbmQgZmFpbHMgd2l0aCBgVEVNUExBVEVfTk9UX0ZPVU5EYC4gYCdlbi1VUydgIGlzIHRoZSB0YWcgdGhhdCBjYW5ub3RcbiAqIHN0cmFuZCBhIHJlY2lwaWVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGJ1bmRsZSA9IChwYWNrczogUmVjb3JkPHN0cmluZywgRW1haWxUZW1wbGF0ZVBhY2s+KTogRW1haWxUZW1wbGF0ZURlZmluaXRpb25bXSA9PlxuICBPYmplY3QuZW50cmllcyhwYWNrcykuZmxhdE1hcCgoW2xvY2FsZSwgcGFja10pID0+XG4gICAgT2JqZWN0LmVudHJpZXMocGFjaykubWFwKChbbmFtZSwgcm93XSkgPT4gKHsgbmFtZSwgbG9jYWxlLCAuLi5yb3cgfSkpKTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzL2VuLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzL2VuLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEVtYWlsVGVtcGxhdGVQYWNrIH0gZnJvbSAnLi4vLi4vc2FsZXMvZW1haWwtdGVtcGxhdGVzL19idW5kbGUnO1xuXG4vKipcbiAqIEVuZ2xpc2ggKGVuLVVTKSBcdTIwMTQgdGhlIHNlcnZpY2UgcGFja2FnZSdzIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZXMuXG4gKlxuICogRXZlcnkgc3RyaW5nIGlzIHRoZSB0ZXh0IGl0cyBgbm90aWZ5YCBub2RlIGFscmVhZHkgc2VudCwgd2l0aCB0aGUgZmxvdydzXG4gKiBge3Zhci5wYXRofWAgaW50ZXJwb2xhdGlvbnMgcmUtZXhwcmVzc2VkIGFzIHRoZSBge3trZXl9fWAgaG9sZXMgdGhlIHJlbmRlcmVyXG4gKiBmaWxscyBmcm9tIHRoYXQgbm9kZSdzIGB0ZW1wbGF0ZURhdGFgLiBcdTI2QTBcdUZFMEYgVGFnZ2VkIGBlbi1VU2AsIG5vdCBgZW5gIFx1MjAxNCBzZWUgdGhlXG4gKiByZXNvbHV0aW9uLWxhZGRlciBub3RlIG9uIGBidW5kbGUoKWAuXG4gKi9cbmV4cG9ydCBjb25zdCBlbjogRW1haWxUZW1wbGF0ZVBhY2sgPSB7XG4gICdjcm0uY2FzZV9lc2NhbGF0ZWQnOiB7XG4gICAgbGFiZWw6ICdDYXNlIEVzY2FsYXRlZCcsXG4gICAgc3ViamVjdDogJ0Nhc2UgZXNjYWxhdGVkOiB7e2Nhc2VfbnVtYmVyfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+Q2FzZSB7e2Nhc2VfbnVtYmVyfX0gKHt7cHJpb3JpdHl9fSkgaGFzIGJlZW4gYXV0by1lc2NhbGF0ZWQgb24gY3JpdGljYWwgcHJpb3JpdHkuIE93bmVyc2hpcCBwYXNzZXMgdG8gdGhlIHNlcnZpY2UgbWFuYWdlciB3aXRoIHRoZSBsaWdodGVzdCBsb2FkOyB3aGlsZSBub2JvZHkgaG9sZHMgdGhhdCBwb3NpdGlvbiB0aGUgY2FzZSBzdGF5cyB3aXRoIHlvdS4gT3BlbiB0aGUgY2FzZSB0byBzZWUgd2hvIG93bnMgaXQgbm93LjwvcD4nLFxuICB9LFxuICAnY3JtLmNhc2Vfc2xhX2JyZWFjaCc6IHtcbiAgICBsYWJlbDogJ0Nhc2UgU0xBIEJyZWFjaGVkJyxcbiAgICBzdWJqZWN0OiAnU0xBIGJyZWFjaGVkOiBjYXNlIHt7Y2FzZV9udW1iZXJ9fScsXG4gICAgYm9keUh0bWw6ICc8cD5DYXNlIHt7Y2FzZV9udW1iZXJ9fSAoe3twcmlvcml0eX19KSBwYXNzZWQgaXRzIFNMQSBkdWUgZGF0ZSBhbmQgaGFzIGJlZW4gYXV0by1lc2NhbGF0ZWQuPC9wPicsXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXMvemgtQ04udHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXMvemgtQ04udHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZVBhY2sgfSBmcm9tICcuLi8uLi9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvX2J1bmRsZSc7XG5cbi8qKiBcdTdCODBcdTRGNTNcdTRFMkRcdTY1ODcgKHpoLUNOKSBcdTIwMTQgdGhlIHNlcnZpY2UgcGFja2FnZSdzIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZXMuIFNlZSBgZW4udHNgLiAqL1xuZXhwb3J0IGNvbnN0IHpoQ046IEVtYWlsVGVtcGxhdGVQYWNrID0ge1xuICAnY3JtLmNhc2VfZXNjYWxhdGVkJzoge1xuICAgIGxhYmVsOiAnXHU1REU1XHU1MzU1XHU1REYyXHU1MzQ3XHU3RUE3JyxcbiAgICBzdWJqZWN0OiAnXHU1REU1XHU1MzU1XHU1REYyXHU1MzQ3XHU3RUE3XHVGRjFBe3tjYXNlX251bWJlcn19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NURFNVx1NTM1NSB7e2Nhc2VfbnVtYmVyfX1cdUZGMDh7e3ByaW9yaXR5fX1cdUZGMDlcdTU2RTBcdTRFMjVcdTkxQ0RcdTdFQTdcdTUyMkJcdTVERjJcdTgxRUFcdTUyQThcdTUzNDdcdTdFQTdcdTMwMDJcdTYyNDBcdTY3MDlcdTY3NDNcdTVDMDZcdThGNkNcdTRFQTRcdTdFRDlcdTVGNTNcdTUyNERcdThEMUZcdTgzNzdcdTY3MDBcdThGN0JcdTc2ODRcdTY3MERcdTUyQTFcdTdFQ0ZcdTc0MDZcdUZGMUJcdTgyRTVcdThCRTVcdTgwNENcdTRGNERcdTY2ODJcdTY1RTBcdTRFQkFcdTYyQzVcdTRFRkJcdUZGMENcdTVERTVcdTUzNTVcdTRFQ0RcdTVGNTJcdTYwQThcdTYyNDBcdTY3MDlcdTMwMDJcdThCRjdcdTYyNTNcdTVGMDBcdTVERTVcdTUzNTVcdTY3RTVcdTc3MEJcdTVGNTNcdTUyNERcdThEMUZcdThEMjNcdTRFQkFcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5jYXNlX3NsYV9icmVhY2gnOiB7XG4gICAgbGFiZWw6ICdcdTVERTVcdTUzNTUgU0xBIFx1OEQ4NVx1NjVGNicsXG4gICAgc3ViamVjdDogJ1NMQSBcdThEODVcdTY1RjZcdUZGMUFcdTVERTVcdTUzNTUge3tjYXNlX251bWJlcn19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NURFNVx1NTM1NSB7e2Nhc2VfbnVtYmVyfX1cdUZGMDh7e3ByaW9yaXR5fX1cdUZGMDlcdTVERjJcdThEODVcdThGQzcgU0xBIFx1NTIzMFx1NjcxRlx1NjVGNlx1OTVGNFx1RkYwQ1x1NUU3Nlx1NURGMlx1ODFFQVx1NTJBOFx1NTM0N1x1N0VBN1x1MzAwMjwvcD4nLFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzL2phLUpQLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZW1haWwtdGVtcGxhdGVzL2phLUpQLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEVtYWlsVGVtcGxhdGVQYWNrIH0gZnJvbSAnLi4vLi4vc2FsZXMvZW1haWwtdGVtcGxhdGVzL19idW5kbGUnO1xuXG4vKiogXHU2NUU1XHU2NzJDXHU4QTlFIChqYS1KUCkgXHUyMDE0IHRoZSBzZXJ2aWNlIHBhY2thZ2UncyBub3RpZmljYXRpb24gdGVtcGxhdGVzLiBTZWUgYGVuLnRzYC4gKi9cbmV4cG9ydCBjb25zdCBqYUpQOiBFbWFpbFRlbXBsYXRlUGFjayA9IHtcbiAgJ2NybS5jYXNlX2VzY2FsYXRlZCc6IHtcbiAgICBsYWJlbDogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA2RVx1MzBBOFx1MzBCOVx1MzBBQlx1MzBFQ1x1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGMycsXG4gICAgc3ViamVjdDogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA0Q1x1MzBBOFx1MzBCOVx1MzBBQlx1MzBFQ1x1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGM1x1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1Rjoge3tjYXNlX251bWJlcn19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1MzBCMVx1MzBGQ1x1MzBCOSB7e2Nhc2VfbnVtYmVyfX1cdUZGMDh7e3ByaW9yaXR5fX1cdUZGMDlcdTMwNkZcdTkxQ0RcdTU5MjdcdTVFQTZcdTMwNENcdTlBRDhcdTMwNDRcdTMwNUZcdTMwODFcdTgxRUFcdTUyRDVcdTc2ODRcdTMwNkJcdTMwQThcdTMwQjlcdTMwQUJcdTMwRUNcdTMwRkNcdTMwQjdcdTMwRTdcdTMwRjNcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDJcdTYyNDBcdTY3MDlcdTZBMjlcdTMwNkZcdThDQTBcdTgzNzdcdTMwNkVcdTY3MDBcdTMwODJcdThFRkRcdTMwNDRcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjlcdTMwREVcdTMwQ0RcdTMwRkNcdTMwQjhcdTMwRTNcdTMwRkNcdTMwNkJcdTc5RkJcdTMwOEFcdTMwN0VcdTMwNTlcdTMwMDJcdTMwNURcdTMwNkVcdTVGNzlcdTgwNzdcdTMwNkJcdThBQjBcdTMwODJcdTMwNDRcdTMwNkFcdTMwNDRcdTk1OTNcdTMwNkZcdTMwMDFcdTMwQjFcdTMwRkNcdTMwQjlcdTMwNkZcdTMwNDJcdTMwNkFcdTMwNUZcdTMwNkVcdTMwN0VcdTMwN0VcdTMwNjdcdTMwNTlcdTMwMDJcdTMwQjFcdTMwRkNcdTMwQjlcdTMwOTJcdTk1OEJcdTMwNDRcdTMwNjZcdTczRkVcdTU3MjhcdTMwNkVcdTYyNDBcdTY3MDlcdTgwMDVcdTMwOTJcdTMwNTRcdTc4QkFcdThBOERcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5jYXNlX3NsYV9icmVhY2gnOiB7XG4gICAgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTMwNkUgU0xBIFx1OEQ4NVx1OTA0RScsXG4gICAgc3ViamVjdDogJ1NMQSBcdThEODVcdTkwNEU6IFx1MzBCMVx1MzBGQ1x1MzBCOSB7e2Nhc2VfbnVtYmVyfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHUzMEIxXHUzMEZDXHUzMEI5IHt7Y2FzZV9udW1iZXJ9fVx1RkYwOHt7cHJpb3JpdHl9fVx1RkYwOVx1MzA2RiBTTEEgXHU2NzFGXHU5NjUwXHUzMDkyXHU5MDRFXHUzMDRFXHUzMDVGXHUzMDVGXHUzMDgxXHUzMDAxXHU4MUVBXHU1MkQ1XHU3Njg0XHUzMDZCXHUzMEE4XHUzMEI5XHUzMEFCXHUzMEVDXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyPC9wPicsXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXMvZXMtRVMudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXMvZXMtRVMudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZVBhY2sgfSBmcm9tICcuLi8uLi9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvX2J1bmRsZSc7XG5cbi8qKiBFc3BhXHUwMEYxb2wgKGVzLUVTKSBcdTIwMTQgdGhlIHNlcnZpY2UgcGFja2FnZSdzIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZXMuIFNlZSBgZW4udHNgLiAqL1xuZXhwb3J0IGNvbnN0IGVzRVM6IEVtYWlsVGVtcGxhdGVQYWNrID0ge1xuICAnY3JtLmNhc2VfZXNjYWxhdGVkJzoge1xuICAgIGxhYmVsOiAnQ2FzbyBlc2NhbGFkbycsXG4gICAgc3ViamVjdDogJ0Nhc28gZXNjYWxhZG86IHt7Y2FzZV9udW1iZXJ9fScsXG4gICAgYm9keUh0bWw6ICc8cD5FbCBjYXNvIHt7Y2FzZV9udW1iZXJ9fSAoe3twcmlvcml0eX19KSBzZSBoYSBlc2NhbGFkbyBhdXRvbVx1MDBFMXRpY2FtZW50ZSBwb3IgcHJpb3JpZGFkIGNyXHUwMEVEdGljYS4gTGEgcHJvcGllZGFkIHBhc2EgYWwgcmVzcG9uc2FibGUgZGUgc2VydmljaW8gY29uIG1lbm9zIGNhcmdhOyBtaWVudHJhcyBuYWRpZSBvY3VwZSBlc2UgcHVlc3RvLCBlbCBjYXNvIHNpZ3VlIHNpZW5kbyB0dXlvLiBBYnJlIGVsIGNhc28gcGFyYSB2ZXIgcXVpXHUwMEU5biBsbyB0aWVuZSBhaG9yYS48L3A+JyxcbiAgfSxcbiAgJ2NybS5jYXNlX3NsYV9icmVhY2gnOiB7XG4gICAgbGFiZWw6ICdTTEEgZGVsIGNhc28gaW5jdW1wbGlkbycsXG4gICAgc3ViamVjdDogJ1NMQSBpbmN1bXBsaWRvOiBjYXNvIHt7Y2FzZV9udW1iZXJ9fScsXG4gICAgYm9keUh0bWw6ICc8cD5FbCBjYXNvIHt7Y2FzZV9udW1iZXJ9fSAoe3twcmlvcml0eX19KSBzdXBlclx1MDBGMyBzdSBmZWNoYSBsXHUwMEVEbWl0ZSBkZSBTTEEgeSBzZSBoYSBlc2NhbGFkbyBhdXRvbVx1MDBFMXRpY2FtZW50ZS48L3A+JyxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2VtYWlsLXRlbXBsYXRlcy9jcm0uZW1haWwtdGVtcGxhdGUudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9lbWFpbC10ZW1wbGF0ZXMvY3JtLmVtYWlsLXRlbXBsYXRlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEVtYWlsVGVtcGxhdGVEZWZpbml0aW9uIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcbmltcG9ydCB7IGJ1bmRsZSB9IGZyb20gJy4uLy4uL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9fYnVuZGxlJztcbmltcG9ydCB7IGVuIH0gZnJvbSAnLi9lbic7XG5pbXBvcnQgeyB6aENOIH0gZnJvbSAnLi96aC1DTic7XG5pbXBvcnQgeyBqYUpQIH0gZnJvbSAnLi9qYS1KUCc7XG5pbXBvcnQgeyBlc0VTIH0gZnJvbSAnLi9lcy1FUyc7XG5cbi8qKlxuICogU2VydmljZSBcdTIwMTQgZXZlcnkgYHN5c19lbWFpbF90ZW1wbGF0ZWAgcm93IHRoaXMgcGFja2FnZSdzIGBub3RpZnlgIG5vZGVzIG5hbWUuXG4gKlxuICogRm91ciBsb2NhbGUgcGFja3MgY3Jvc3NlZCB3aXRoIHR3byB0ZW1wbGF0ZSBuYW1lcy4gYGJ1bmRsZSgpYCBpcyBpbXBvcnRlZFxuICogYWxvbmcgdGhpcyBtb2R1bGUncyBlZGdlIGludG8gc2FsZXMsIHRoZSBvbmUgZGV0ZXJtaW5pc3RpYyBob21lIGZvciBhIHNvdXJjZVxuICogbW9yZSB0aGFuIG9uZSBwYWNrYWdlIG5lZWRzLlxuICovXG5leHBvcnQgY29uc3QgU2VydmljZUVtYWlsVGVtcGxhdGVzOiBFbWFpbFRlbXBsYXRlRGVmaW5pdGlvbltdID0gYnVuZGxlKHtcbiAgJ2VuLVVTJzogZW4sXG4gICd6aC1DTic6IHpoQ04sXG4gICdqYS1KUCc6IGphSlAsXG4gICdlcy1FUyc6IGVzRVMsXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZmxvd3MvY2FzZS1lc2NhbGF0aW9uLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2Zsb3dzL2Nhc2UtZXNjYWxhdGlvbi5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKiBDYXNlIEVzY2FsYXRpb24gXHUyMDE0IGF1dG8tZXNjYWxhdGUgaGlnaC1wcmlvcml0eSBjYXNlcyAqL1xuZXhwb3J0IGNvbnN0IENhc2VFc2NhbGF0aW9uRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2Nhc2VfZXNjYWxhdGlvbicsXG4gIGxhYmVsOiAnQ2FzZSBFc2NhbGF0aW9uIFByb2Nlc3MnLFxuICBkZXNjcmlwdGlvbjogJ0F1dG9tYXRpY2FsbHkgZXNjYWxhdGUgaGlnaC1wcmlvcml0eSBjYXNlcycsXG4gIHR5cGU6ICdyZWNvcmRfY2hhbmdlJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gQSByZWNvcmQtY2hhbmdlIGZsb3cgZmlyZWQgYnkgYSBTWVNURU0gd3JpdGUgY2FycmllcyBubyB0cmlnZ2VyIHVzZXJcbiAgLy8gZWl0aGVyIFx1MjAxNCB0aGUgdXNlci1sZXNzIGV4cG9zdXJlIGlzIE5PVCBzY2hlZHVsZS1vbmx5IChBRFItMDA0OSksIGFuZCB0aGVcbiAgLy8gcGxhdGZvcm0ncyBvd24gYnVpbGQtdGltZSBsaW50IGNhbm5vdCBzZWUgdGhpcyBzaGFwZVxuICAvLyBiZWNhdXNlIGl0IGlzIG9ubHkga25vd2FibGUgYXQgcnVuIHRpbWUuIE1lYXN1cmVkIG9uIDE3LjAuMC1yYy4yOiBhXG4gIC8vIHVzZXItbGVzcyBydW4gcmVmdXNlcyB0aGUgdmVyeSBmaXJzdCBkYXRhIG5vZGUgXHUyMDE0IFwiW3J1bkFzXSByZWZ1c2luZyBhIGRhdGFcbiAgLy8gb3BlcmF0aW9uIChvYmplY3QgJ2NybV9jYXNlJywgZXZlbnQgJ3JlY29yZC1hZnRlci11cGRhdGUnKVwiIFx1MjAxNCBzbyBhIGNhc2VcbiAgLy8gcmFpc2VkIGJ5IHRoZSBzZWVkIGxvYWRlciwgYW4gaW50ZWdyYXRpb24sIG9yIGFub3RoZXIgcnVuQXM6J3N5c3RlbSdcbiAgLy8gZmxvdydzIHdyaXRlIHNpbGVudGx5IGtlZXBzIGl0cyBjcml0aWNhbCBwcmlvcml0eSBmb3JldmVyLlxuICAvL1xuICAvLyBFbGV2YXRpbmcgdGhlIFVTRVItZHJpdmVuIHJ1bnMgdG9vIGlzIGNvcnJlY3QgaGVyZTogZXNjYWxhdGlvbiBpcyBhXG4gIC8vIHNlcnZpY2UtbGV2ZWwgcG9saWN5LCBub3QgdGhlIHdyaXRlcidzIG93biBlZGl0LiBCb3RoIGRhdGEgbm9kZXMgYXJlIGtleWVkXG4gIC8vIHRvIGB7cmVjb3JkLmlkfWAgXHUyMDE0IHRoZSByb3cgdGhhdCBqdXN0IGZpcmVkIHRoZSB0cmlnZ2VyIFx1MjAxNCBzbyB1c2VyIHNjb3BlXG4gIC8vIGJ1eXMgbm8gcmVzdHJpY3Rpb24gdGhhdCBtYXR0ZXJzLCB3aGlsZSBpdCBkb2VzIGFkZCBhIGZhaWx1cmUgbW9kZTogYW5cbiAgLy8gYWdlbnQgbWF5IGxlZ2l0aW1hdGVseSByYWlzZSBhIGNhc2Ugd2l0aG91dCBob2xkaW5nIGVkaXQgcmlnaHRzIG9uIHRoZVxuICAvLyBlc2NhbGF0aW9uIGxpZmVjeWNsZSBmaWVsZHMgKGBpc19lc2NhbGF0ZWRgIC8gYGVzY2FsYXRlZF9kYXRlYCAvIGBzdGF0dXNgKS5cbiAgLy8gVGhpcyBhbHNvIHB1dHMgdGhlIGZsb3cgb24gdGhlIHNhbWUgZm9vdGluZyBhcyBgY2FzZV9zbGFfbW9uaXRvcmAsIHdoaWNoXG4gIC8vIHBlcmZvcm1zIHRoZSBzYW1lIGVzY2FsYXRpb24gb24gYSBzY2hlZHVsZSB1bmRlciBgcnVuQXM6ICdzeXN0ZW0nYC5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuXG4gIHZhcmlhYmxlczogW1xuICAgIHsgbmFtZTogJ2Nhc2VJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gIF0sXG5cbiAgbm9kZXM6IFtcbiAgICB7XG4gICAgICAvLyBUcmlnZ2VyIHdpcmluZyAoNy40KTogYmluZCB0byBhZnRlclVwZGF0ZSBhbmQgZ2F0ZSBvbiB0aGUgY3JpdGljYWxcbiAgICAgIC8vIHRyYW5zaXRpb24uIFRoZSByZS1maXJlIGd1YXJkIE1VU1QgTk9UIHJlbHkgb24gdGhlIGJvb2xlYW5cbiAgICAgIC8vIGBpc19lc2NhbGF0ZWRgOiB0aGlzIGZsb3cncyBvd24gZXNjYWxhdGlvbiB3cml0ZSByZS10cmlnZ2Vyc1xuICAgICAgLy8gcmVjb3JkLWFmdGVyLXVwZGF0ZSwgYW5kIG9uIFNRTGl0ZS9saWJzcWwgYSBib29sZWFuIHBlcnNpc3RzIGFzIGludGVnZXJcbiAgICAgIC8vIGAxYCwgc28gYHJlY29yZC5pc19lc2NhbGF0ZWQgIT0gdHJ1ZWAgaXMgYDEgIT0gdHJ1ZWAgPSB0cnVlIFx1MjAxNCB0aGUgZ3VhcmRcbiAgICAgIC8vIG5ldmVyIHRyaXBzIGFuZCB0aGUgZmxvdyBsb29wcyBmb3JldmVyIChpdCB3ZWRnZWQgYSBmaXJzdC1ib290IHNlZWQgb25cbiAgICAgIC8vIDIwMjYtMDctMDYpLiBJbnN0ZWFkOlxuICAgICAgLy8gLSBgZXNjYWxhdGVkX2RhdGUgPT0gbnVsbGAgbWFya3MgXCJuZXZlciBlc2NhbGF0ZWRcIiAodGhlIGVzY2FsYXRpb24gd3JpdGVcbiAgICAgIC8vICAgc3RhbXBzIGl0LCBzdXBwcmVzc2luZyB0aGUgc2Vjb25kIGZpcmUgQU5EIGFueSByZS1lc2NhbGF0aW9uIHdoZW4gYW5cbiAgICAgIC8vICAgYWdlbnQgbGF0ZXIgbW92ZXMgdGhlIGNhc2UgYmFjayB0byBpbl9wcm9ncmVzcyB0byB3b3JrIGl0KTtcbiAgICAgIC8vIC0gdGhlIHN0YXR1cyB0ZXJtcyBrZWVwIHRoZSBmbG93IG9mZiBjYXNlcyBhbHJlYWR5IGVzY2FsYXRlZCBvciBhbHJlYWR5XG4gICAgICAvLyAgIGZpbmlzaGVkIFx1MjAxNCB3aXRob3V0IHRoZW0gYSBjcml0aWNhbCBjYXNlIGNvdWxkIG5ldmVyIGJlIHJlc29sdmVkIG9yXG4gICAgICAvLyAgIGNsb3NlZCAodGhlIGZsb3cgd291bGQgeWFuayBgc3RhdHVzYCBzdHJhaWdodCBiYWNrIHRvIGBlc2NhbGF0ZWRgKS5cbiAgICAgIGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2Nhc2UnLFxuICAgICAgICB0cmlnZ2VyVHlwZTogJ3JlY29yZC1hZnRlci11cGRhdGUnLFxuICAgICAgICAvLyBBbHNvIHN1cHByZXNzIG9uIGNsb3NlZC9yZXNvbHZlZDogY2xvc2luZyBhIGNyaXRpY2FsIGNhc2UgaXMgaXRzZWxmXG4gICAgICAgIC8vIGFuIGFmdGVyVXBkYXRlLCBhbmQgd2l0aCBvbmx5IHRoZSBgIT0gXCJlc2NhbGF0ZWRcImAgZ3VhcmQgdGhpcyBmbG93XG4gICAgICAgIC8vIHJlLWVzY2FsYXRlZCB0aGUgY2FzZSB0aGUgbW9tZW50IGl0IHdhcyBjbG9zZWQgKG9ic2VydmVkIGxpdmU6XG4gICAgICAgIC8vIGNsb3NlX2Nhc2Ugd3JvdGUgc3RhdHVzIFwiY2xvc2VkXCIsIHRoaXMgZmxvdyBpbW1lZGlhdGVseSByZXdyb3RlIGl0XG4gICAgICAgIC8vIHRvIFwiZXNjYWxhdGVkXCIpLiBTdGF0dXMgc3RyaW5ncyBhcmUgdGhlIHJlbGlhYmxlIGd1YXJkIFx1MjAxNCBjb21wYXJpbmdcbiAgICAgICAgLy8gdGhlIGJvb2xlYW4gaXNfY2xvc2VkIHN1ZmZlcnMgdGhlIFNRTGl0ZSBgMSAhPSB0cnVlYCB0cmFwIGFib3ZlLlxuICAgICAgICAvLyBgZXNjYWxhdGVkX2RhdGUgPT0gbnVsbGAgYWRkaXRpb25hbGx5IGtlZXBzIGEgY2FzZSB0aGF0IHdhcyBhbHJlYWR5XG4gICAgICAgIC8vIGVzY2FsYXRlZCBvbmNlICh0aGVuIHJlb3BlbmVkKSBmcm9tIGJlaW5nIGVzY2FsYXRlZCBhZ2Fpbi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVE9UQUxJVFk6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBjYXJyaWVzIGEgYGhhcyhyZWNvcmQueClgXG4gICAgICAgIC8vIGd1YXJkIFx1MjAxNCBzZWUgdGhlIGhvdXNlLXJ1bGUgYmxvY2sgaW5cbiAgICAgICAgLy8gYHRlc3QvZmxvdy1jb25kaXRpb24tdG90YWxpdHkudGVzdC50c2AuIE1lYXN1cmVkIGVuZC10by1lbmQgb25cbiAgICAgICAgLy8gZHJpdmVyLW1lbW9yeTogYSBjYXNlIEJPUk4gY3JpdGljYWwgaXMgc3RvcmVkIHdpdGhvdXQgYW5cbiAgICAgICAgLy8gYGVzY2FsYXRlZF9kYXRlYCBjb2x1bW4gYXQgYWxsLCBgcmVjb3JkLmVzY2FsYXRlZF9kYXRlID09IG51bGxgXG4gICAgICAgIC8vIGFib3J0ZWQgd2l0aCBgTm8gc3VjaCBrZXk6IGVzY2FsYXRlZF9kYXRlYCwgYW5kIHRoaXMgZmxvdyBuZXZlciByYW5cbiAgICAgICAgLy8gb24gdGhlIHZlcnkgcG9wdWxhdGlvbiBpdCBleGlzdHMgZm9yLiBUaGUgZ3VhcmRzIGJlbG93IHByZXNlcnZlIHRoZVxuICAgICAgICAvLyBwcmVkaWNhdGUncyBhbnN3ZXIgb24gZXZlcnkgc2hhcGUgd2hlcmUgaXQgcHJldmlvdXNseSBoYWQgb25lLlxuICAgICAgICAvLyBgZXNjYWxhdGVkX2RhdGVgIGFic2VudCBtZWFucyB0aGUgc2FtZSBhcyBudWxsIChcIm5ldmVyIGVzY2FsYXRlZFwiKTtcbiAgICAgICAgLy8gYW4gYWJzZW50IGBzdGF0dXNgIGNhbm5vdCBiZSBhIHRlcm1pbmFsIHN0YXR1cywgc28gaXQgbXVzdCBub3RcbiAgICAgICAgLy8gc3VwcHJlc3MgdGhlIGVzY2FsYXRpb24uXG4gICAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnByaW9yaXR5KSAmJiByZWNvcmQucHJpb3JpdHkgPT0gXCJjcml0aWNhbFwiXG4gICAgICAgICAgJiYgKCFoYXMocmVjb3JkLmVzY2FsYXRlZF9kYXRlKSB8fCByZWNvcmQuZXNjYWxhdGVkX2RhdGUgPT0gbnVsbClcbiAgICAgICAgICAmJiAoIWhhcyhyZWNvcmQuc3RhdHVzKVxuICAgICAgICAgICAgfHwgKHJlY29yZC5zdGF0dXMgIT0gXCJlc2NhbGF0ZWRcIiAmJiByZWNvcmQuc3RhdHVzICE9IFwicmVzb2x2ZWRcIiAmJiByZWNvcmQuc3RhdHVzICE9IFwiY2xvc2VkXCIpKWAsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdnZXRfY2FzZScsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdHZXQgQ2FzZSBSZWNvcmQnLFxuICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fY2FzZScsIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZC5pZGAgfSwgb3V0cHV0VmFyaWFibGU6ICdjYXNlUmVjb3JkJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gVGhlIGBsYWJlbGAgbmFtZXMgd2hhdCB0aGlzIG5vZGUgYWN0dWFsbHkgZG9lczogaXQgZmxhZ3MgdGhlIGNhc2UgYXNcbiAgICAgIC8vIGVzY2FsYXRlZCAoc2VlIGBmaWVsZHNgIGJlbG93KSBhbmQgcmVhc3NpZ25zIG5vdGhpbmcuIFRoZSBgaWRgIGtlZXBzXG4gICAgICAvLyBpdHMgb3JpZ2luYWwgYGFzc2lnbl9zZW5pb3JfYWdlbnRgIHNwZWxsaW5nIG9uIHB1cnBvc2UgXHUyMDE0IGBlZGdlc1tdYFxuICAgICAgLy8gcmVmZXJlbmNlIG5vZGVzIGJ5IGlkLCBhbmQgYENhc2VFc2NhbGF0aW9uT25DcmVhdGVGbG93YCByZXdyaXRlcyB0aGVcbiAgICAgIC8vIG5vZGUgbGlzdCBieSBpZCwgc28gcmVuYW1pbmcgb25lIGlzIGEgYmVoYXZpb3VyIGNoYW5nZSwgbm90IGEgd29yZGluZ1xuICAgICAgLy8gZml4LlxuICAgICAgaWQ6ICdhc3NpZ25fc2VuaW9yX2FnZW50JywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ0ZsYWcgYXMgRXNjYWxhdGVkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2Nhc2UnLCBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sXG4gICAgICAgIC8vIGBlc2NhbGF0aW9uX3JlYXNvbmAgbXVzdCBiZSBzZXQgd2hlbmV2ZXIgYGlzX2VzY2FsYXRlZGAgZmxpcHMgdHJ1ZSBcdTIwMTQgdGhlXG4gICAgICAgIC8vIG9iamVjdCdzIGBlc2NhbGF0aW9uX3JlYXNvbl9yZXF1aXJlZGAgdmFsaWRhdGlvbiByZWplY3RzIHRoZSB3cml0ZVxuICAgICAgICAvLyBvdGhlcndpc2UgKHdoaWNoIHNpbGVudGx5IGFib3J0ZWQgdGhpcyBmbG93IHVudGlsIGl0IHdhcyBzdXBwbGllZCkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFx1MjZENCBUaGlzIG5vZGUgd3JpdGVzIE5PIG93bmVyLCBhbmQgY2Fubm90OiByZWFzc2lnbmluZyBmcm9tIGEgZmxvd1xuICAgICAgICAvLyB3b3VsZCBtZWFuIGB7Y2FzZVJlY29yZC5vd25lcl9pZC5tYW5hZ2VyfWAsIGFuZCBhIGZsb3cgdGVtcGxhdGVcbiAgICAgICAgLy8gY2Fubm90IHRyYXZlcnNlIGEgbG9va3VwIFx1MjAxNCBpdCBpbnRlcnBvbGF0ZXMgdG8gdGhlIGxpdGVyYWwgXCJ1bmRlZmluZWRcIlxuICAgICAgICAvLyBhbmQgd291bGQgb3JwaGFuIHRoZSBjYXNlIHVuZGVyIGEgcGhhbnRvbSBvd25lci4gVGhlIGhhbmQtb2ZmIGRvZXMgbm90XG4gICAgICAgIC8vIG5lZWQgdG8gaGFwcGVuIGhlcmU6IHRoaXMgdmVyeSB1cGRhdGUgZmlyZXMgdGhlXG4gICAgICAgIC8vIGBjYXNlX2VzY2FsYXRpb25fcmVhc3NpZ25gIGJlZm9yZVVwZGF0ZSBob29rXG4gICAgICAgIC8vIChgc3JjL3NlcnZpY2Uvb2JqZWN0cy9fY2FzZS1hc3NpZ25tZW50LnRzYCksIHdoaWNoIHB1dHMgdGhlIGNhc2Ugd2l0aCB0aGVcbiAgICAgICAgLy8gbGVhc3QtbG9hZGVkIGhvbGRlciBvZiB0aGUgZmxhdCBgc2VydmljZV9tYW5hZ2VyYCBwb3NpdGlvbiBcdTIwMTQgYSBwb29sLFxuICAgICAgICAvLyB3aGljaCB0aGUgYXBwIGNhbiByZXNvbHZlLCByYXRoZXIgdGhhbiBhIG1hbmFnZXIgY2hhaW4sIHdoaWNoIGl0XG4gICAgICAgIC8vIGNhbm5vdC4gV2l0aCB0aGF0IHBvb2wgdW5zdGFmZmVkIHRoZSBjYXNlIGtlZXBzIGl0cyBvd25lciBhbmQgdGhpc1xuICAgICAgICAvLyB3cml0ZSBpcyB1bmNoYW5nZWQuXG4gICAgICAgIGZpZWxkczogeyBpc19lc2NhbGF0ZWQ6IHRydWUsIGVzY2FsYXRpb25fcmVhc29uOiAnQXV0by1lc2NhbGF0ZWQ6IGNyaXRpY2FsIHByaW9yaXR5JywgZXNjYWxhdGVkX2RhdGU6IGNlbGBpc29EYXRldGltZShub3coKSlgLCBzdGF0dXM6ICdlc2NhbGF0ZWQnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgLy8gTm8gYGNyZWF0ZV90YXNrYCBub2RlIGhlcmU6IHRoZSBlc2NhbGF0aW9uIHdyaXRlIGFib3ZlIGZsaXBzIGBzdGF0dXNgIHRvXG4gICAgLy8gYGVzY2FsYXRlZGAsIHdoaWNoIGZpcmVzIHRoZSBgY2FzZV9zdGF0dXNfc2lkZV9lZmZlY3RzYCBob29rIFx1MjAxNCB0aGUgc2luZ2xlXG4gICAgLy8gb3duZXIgb2YgZXNjYWxhdGlvbiBmb2xsb3ctdXAgdGFza3MgKGl0IGFsc28gY292ZXJzIHRoZSBgZXNjYWxhdGVfY2FzZWBcbiAgICAvLyBhY3Rpb24gYW5kIHRoZSBTTEEgbW9uaXRvcikuIEEgc2Vjb25kIHRhc2sgbm9kZSBoZXJlIHByb2R1Y2VkIGR1cGxpY2F0ZSxcbiAgICAvLyBkaXNhZ3JlZWluZyB0YXNrcyAoY2FzZSBvd25lci9oaWdoIHZzIGFjY291bnQgb3duZXIvdXJnZW50KSBwZXIgZXNjYWxhdGlvbi5cbiAgICB7XG4gICAgICAvLyBHYXRld2F5IG9ubHkgXHUyMDE0IHRoZSBsaXZlIHByZWRpY2F0ZSBpcyBvbiB0aGUgb3V0LWVkZ2UgYGU0YC4gVGhlIGVuZ2luZVxuICAgICAgLy8gbmV2ZXIgcmVhZHMgYSBgZGVjaXNpb25gIG5vZGUncyBzaW5ndWxhciBgY29uZmlnLmNvbmRpdGlvbmAsIHNvIGEgY29weVxuICAgICAgLy8gaGVyZSB3b3VsZCByZXN0YXRlIHRoZSBnYXRlIHdpdGhvdXQgQkVJTkcgdGhlIGdhdGVcbiAgICAgIC8vIChgZmxvdy1pbmVydC1ub2RlLWNvbmRpdGlvbmApOyBgcG5wbSBsaW50YCBcdTIwMTQgYG9zIGxpbnQgLS1zdHJpY3RgIFx1MjAxNFxuICAgICAgLy8gZmFpbHMgb24gdGhhdC5cbiAgICAgIC8vXG4gICAgICAvLyBXaHkgdGhlIGdhdGUgZXhpc3RzOiBgY3JtX2Nhc2Uub3duZXJfaWRgIGlzIE5VTExBQkxFIGFuZCBhbiB1bm93bmVkIGNhc2VcbiAgICAgIC8vIGlzIGFuIG9yZGluYXJ5IHN0YXRlIFx1MjAxNCB0aGlzIHJlcG8gc2hpcHMgYHNjcmlwdHMvYmFja2ZpbGwtb3duZXItaWQudHNgXG4gICAgICAvLyBhbmQgYHBucG0gYmFja2ZpbGw6b3duZXJgIHByZWNpc2VseSBiZWNhdXNlIG93bmVybGVzcyByb3dzIGhhcHBlbiwgYW5kXG4gICAgICAvLyBvcmRpbmFyeSBSRVNUIGNyZWF0aW9uIC8gaW1wb3J0IHJlYWNoIHRoZSBzYW1lIHN0YXRlLiBgbm90aWZ5X3RlYW1gXG4gICAgICAvLyBiZWxvdyBhZGRyZXNzZXMgZXhhY3RseSBPTkUgcmVjaXBpZW50LCBzbyBhbiBvd25lcmxlc3MgY2FzZSBsZWF2ZXMgaXRcbiAgICAgIC8vIHdpdGggYW4gZW1wdHkgc2xhdGUsIHdoaWNoIHRoZSBidWlsdGluIG5vZGUgdHJlYXRzIGFzIGEgSEFSRCBmYWlsdXJlOlxuICAgICAgLy8gYGV4ZWN1dGVgIHJldHVybnMgYHN1Y2Nlc3M6IGZhbHNlYCwgYGV4ZWN1dGVOb2RlYCB0dXJucyB0aGF0IGludG8gYVxuICAgICAgLy8gdGhyb3csIGFuZCB0aGUgcnVuIGVuZHMgYHN0YXR1czogJ2ZhaWxlZCdgLlxuICAgICAgLy9cbiAgICAgIC8vIEJMQVNUIFJBRElVUywgc3RhdGVkIHByZWNpc2VseSBiZWNhdXNlIGl0IGRpZmZlcnMgZnJvbSB0aGUgc2libGluZ1xuICAgICAgLy8gZGVmZWN0IGluIGBjYXNlX3NsYV9tb25pdG9yYCBhbmQgdGhlIGRpZmZlcmVuY2UgaXMgc3RydWN0dXJhbDogdGhlc2UgdHdvXG4gICAgICAvLyBhcmUgYHJlY29yZF9jaGFuZ2VgIGZsb3dzIHdpdGggTk8gbG9vcCwgc28gb25lIG93bmVybGVzcyBjYXNlIGtpbGxzIG9ubHlcbiAgICAgIC8vIGl0cyBPV04gcnVuIFx1MjAxNCB0aGVyZSBpcyBubyBxdWV1ZSBvZiBvdGhlciByZWNvcmRzIGJlaGluZCBpdC4gQSBgc2NoZWR1bGVgXG4gICAgICAvLyBmbG93IHdob3NlIHdvcmsgc2l0cyBpbnNpZGUgYSBgbG9vcGAgYXdhaXRzIGBydW5SZWdpb25gIHdpdGggbm9cbiAgICAgIC8vIHRyeS9jYXRjaCwgYW5kIHRoZXJlIG9uZSBvd25lcmxlc3Mgcm93IHRha2VzIGRvd24gZXZlcnkgcmVjb3JkIG9yZGVyZWRcbiAgICAgIC8vIGJlaGluZCBpdC5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2RDQgVGhlIGdhdGUgc2l0cyBBRlRFUiBgYXNzaWduX3Nlbmlvcl9hZ2VudGAsIHdoaWNoIHN0YXlzXG4gICAgICAvLyBVTkNPTkRJVElPTkFMOiB0aGUgZXNjYWxhdGlvbiBpdHNlbGYgbXVzdCBzdGlsbCBsYW5kIChtZWFzdXJlZFxuICAgICAgLy8gYGlzX2VzY2FsYXRlZDogdHJ1ZWAsIGBzdGF0dXM6ICdlc2NhbGF0ZWQnYCBvbiBldmVyeSBmYWlsaW5nIHJ1biksIHNvIGFuXG4gICAgICAvLyBvd25lcmxlc3MgY3JpdGljYWwgY2FzZSBzdGF5cyB2aXNpYmxlIGluIHZpZXdzIGFuZCByZXBvcnRzLiBPbmx5IHRoZVxuICAgICAgLy8gbm90aWZ5IGlzIGdhdGVkIFx1MjAxNCBhbmQgaGVyZSB0aGF0IGxvc2VzIG5vdGhpbmcgYSByZWFkZXIgd291bGQgd2FudCxcbiAgICAgIC8vIGJlY2F1c2UgYGNhc2VSZWNvcmRgIGlzIHJlYWQgYnkgYGdldF9jYXNlYCBVUFNUUkVBTSBvZiB0aGUgZXNjYWxhdGlvblxuICAgICAgLy8gd3JpdGUsIHNvIGB7Y2FzZVJlY29yZC5vd25lcl9pZH1gIGlzIGRlbGliZXJhdGVseSB0aGUgb3duZXIgdGhlIGNhc2UgaGFkXG4gICAgICAvLyBCRUZPUkUgdGhlIGhhbmQtb2ZmLiBXaXRoIG5vIHN1Y2ggcGVyc29uIHRoZXJlIGlzIG5vIFwicHJldmlvdXMgb3duZXJcIlxuICAgICAgLy8gZm9yIHRoZSBtZXNzYWdlIHRvIGJlIGFkZHJlc3NlZCB0by5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgVGhpcyBndWFyZCBpcyBleGFjdGx5IHRoZSBkdXBsaWNhdGlvbiBvYmplY3RzdGFjayMxMzY4MiBleGlzdHMgdG9cbiAgICAgIC8vIHJldGlyZSBcdTIwMTQgYG5vdGlmeWAgc2hvdWxkIHRyZWF0IGFuIGVtcHR5IGF1ZGllbmNlIGFzIGEgUkVDT1JERUQgU0tJUFxuICAgICAgLy8gcmF0aGVyIHRoYW4gYSBoYXJkIGZhaWx1cmUuIFdoZW4gdGhhdCBsYW5kcywgZGVsZXRlIHRoaXMgbm9kZSBhbmQgZWRnZVxuICAgICAgLy8gYGU0YCdzIHByZWRpY2F0ZSBoZXJlLCBhbmQgdGhlIHNhbWUgcGFpciBpbiBgY2FzZS1zbGEtbW9uaXRvci5mbG93LnRzYC5cbiAgICAgIGlkOiAnY2hlY2tfb3duZXInLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0Nhc2UgSGFzIGFuIE93bmVyPycsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBBRFItMDAxMjogdGhlIGRlZGljYXRlZCBgbm90aWZ5YCBub2RlIGRpc3BhdGNoZXMgdGhyb3VnaCB0aGUgbWVzc2FnaW5nXG4gICAgICAvLyBzZXJ2aWNlIChpbmJveCArIGVtYWlsICsgcHVzaCkuIFRoZSBsZWdhY3kgYHNjcmlwdGAgKyBgYWN0aW9uVHlwZTonZW1haWwnYFxuICAgICAgLy8gc2hhcGUgaXMgYSBuby1vcCBzdHViIGluIDcuNCBhbmQgbmV2ZXIgZGVsaXZlcmVkIGFueXRoaW5nLlxuICAgICAgLy8gT3duZXIgb25seTogYHtjYXNlUmVjb3JkLm93bmVyX2lkLm1hbmFnZXJ9YCBjYW5ub3QgdHJhdmVyc2UgYSBsb29rdXAgaW5cbiAgICAgIC8vIGZsb3cgdGVtcGxhdGVzIFx1MjAxNCBpdCBpbnRlcnBvbGF0ZXMgdG8gdGhlIGxpdGVyYWwgXCJ1bmRlZmluZWRcIi5cbiAgICAgIC8vIFRoZSBgbGFiZWxgIG5hbWVzIHRoZSBzaW5nbGUgcmVjaXBpZW50IHRoaXMgbm9kZSBoYXMgKGByZWNpcGllbnRzYFxuICAgICAgLy8gYmVsb3cpOyB0aGUgYGlkYCBrZWVwcyBpdHMgYG5vdGlmeV90ZWFtYCBzcGVsbGluZyBiZWNhdXNlIGBlZGdlc1tdYFxuICAgICAgLy8gcmVmZXJlbmNlIGl0LiBDZi4gdGhlIHNhbWUgbm9kZSBpbiBgY2FzZS1zbGEtbW9uaXRvci5mbG93LnRzYCwgd2hvc2VcbiAgICAgIC8vIGxhYmVsIGFscmVhZHkgc2F5cyBgQWxlcnQgT3duZXJgLlxuICAgICAgaWQ6ICdub3RpZnlfdGVhbScsIHR5cGU6ICdub3RpZnknLCBsYWJlbDogJ05vdGlmeSBDYXNlIE93bmVyJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBPd25lciBvbmx5LCBhbmQgdGhlIG93bmVyIGl0IHJlYWNoZXMgaXMgdGhlIG9uZSB0aGUgY2FzZSBoYWQgQkVGT1JFXG4gICAgICAgIC8vIHRoZSBlc2NhbGF0aW9uOiBgY2FzZVJlY29yZGAgd2FzIHJlYWQgYnkgYGdldF9jYXNlYCB1cHN0cmVhbSBvZiB0aGVcbiAgICAgICAgLy8gd3JpdGUsIHNvIGB7Y2FzZVJlY29yZC5vd25lcl9pZH1gIGlzIHRoZSBhZ2VudCBiZWluZyBoYW5kZWQgb2ZmIGZyb21cbiAgICAgICAgLy8gXHUyMDE0IGV4YWN0bHkgdGhlIHBlcnNvbiB0aGlzIG1lc3NhZ2UgaXMgZm9yLiBGbG93IHRlbXBsYXRlcyBjYW5ub3RcbiAgICAgICAgLy8gdHJhdmVyc2UgYSBsb29rdXAgKHNlZSB0aGUgbm90ZSBvbiBgYXNzaWduX3Nlbmlvcl9hZ2VudGAgYWJvdmUpOlxuICAgICAgICAvLyBge2Nhc2VSZWNvcmQub3duZXJfaWQubWFuYWdlcn1gIGFuZCBge2Nhc2VSZWNvcmQuY3JtX2FjY291bnQubmFtZX1gXG4gICAgICAgIC8vIGJvdGggaW50ZXJwb2xhdGUgdG8gdGhlIGxpdGVyYWwgc3RyaW5nIFwidW5kZWZpbmVkXCIgXHUyMDE0IGEgcGhhbnRvbVxuICAgICAgICAvLyByZWNpcGllbnQgYW5kIGEgZ2FyYmxlZCBib2R5LlxuICAgICAgICByZWNpcGllbnRzOiBbY2VsYGNhc2VSZWNvcmQub3duZXJfaWRgXSxcbiAgICAgICAgY2hhbm5lbHM6IFsnaW5ib3gnLCAnZW1haWwnXSxcbiAgICAgICAgc2V2ZXJpdHk6ICdjcml0aWNhbCcsXG4gICAgICAgIHRvcGljOiAnY2FzZV9lc2NhbGF0ZWQnLFxuICAgICAgICAvLyBcdTI2QTBcdUZFMEYgVGhlIGJvZHkgXHUyMDE0IG5vdyBgY3JtLmNhc2VfZXNjYWxhdGVkYCBpbiBgLi4vZW1haWwtdGVtcGxhdGVzL2AsIG9uZVxuICAgICAgICAvLyByb3cgcGVyIGxvY2FsZSBcdTIwMTQgbXVzdCBzdGF5IHRydWUgb24gQk9USCBvdXRjb21lcy4gXCJJdCByZW1haW5zXG4gICAgICAgIC8vIGFzc2lnbmVkIHRvIHlvdVwiIGlzIGZhbHNlIHdoZW5ldmVyIHRoZSBoYW5kLW9mZiBmaW5kcyBhIG1hbmFnZXI7IHRoZVxuICAgICAgICAvLyBvcHBvc2l0ZSBjbGFpbSAoXCJpdCBoYXMgYmVlbiByZWFzc2lnbmVkXCIpIGlzIGZhbHNlIHdoZW5ldmVyIHRoZVxuICAgICAgICAvLyBgc2VydmljZV9tYW5hZ2VyYCBwb29sIGlzIHVuc3RhZmZlZCwgd2hpY2ggaXMgdGhlIGZpcnN0LWluc3RhbGwgbm9ybS5cbiAgICAgICAgLy8gU28gaXQgc3RhdGVzIHRoZSBydWxlIGFuZCBwb2ludHMgYXQgdGhlIHJlY29yZCBmb3IgdGhlIGFuc3dlciwgaW5cbiAgICAgICAgLy8gZXZlcnkgbGFuZ3VhZ2UuXG4gICAgICAgIHRlbXBsYXRlOiAnY3JtLmNhc2VfZXNjYWxhdGVkJyxcbiAgICAgICAgdGVtcGxhdGVEYXRhOiB7IGNhc2VfbnVtYmVyOiBjZWxgY2FzZVJlY29yZC5jYXNlX251bWJlcmAsIHByaW9yaXR5OiBjZWxgY2FzZVJlY29yZC5wcmlvcml0eWAgfSxcbiAgICAgICAgYWN0aW9uVXJsOiAnL2NybV9jYXNlL3t7cmVjb3JkLmlkfX0nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG5cbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ2dldF9jYXNlJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAnZ2V0X2Nhc2UnLCB0YXJnZXQ6ICdhc3NpZ25fc2VuaW9yX2FnZW50JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UzJywgc291cmNlOiAnYXNzaWduX3Nlbmlvcl9hZ2VudCcsIHRhcmdldDogJ2NoZWNrX293bmVyJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gVGhlIGdhdGUuIEEgYGRlY2lzaW9uYCB3aXRoIG5vIG1hdGNoaW5nIG91dC1lZGdlIHNpbXBseSBlbmRzIHRoZSBydW5cbiAgICAvLyBoZXJlLCBhZnRlciB0aGUgZXNjYWxhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uXG4gICAgLy9cbiAgICAvLyBUT1RBTElUWTogYGNhc2VSZWNvcmRgIGlzIGEgYGdldF9yZWNvcmRgIE9VVFBVVCBcdTIwMTQgYSByYXcgZHJpdmVyIHJvdywgc3BhcnNlXG4gICAgLy8gaW4gdGhlIHdheSBgZHJpdmVyLW1lbW9yeWAgLyBgZHJpdmVyLW1vbmdvZGJgIHN0b3JlIG9ubHkgdGhlIGNvbHVtbnMgYSByb3dcbiAgICAvLyB3YXMgd3JpdHRlbiB3aXRoIFx1MjAxNCBzbyBvbmx5IGBoYXMoKWAgaXMgdG90YWwsIGFuZCBpdCBtdXN0IGJlIGB2YXJzLmAtc2NvcGVkXG4gICAgLy8gKG1lYXN1cmVkOiBiYXJlIGBoYXMoY2FzZVJlY29yZC5vd25lcl9pZClgIHN0aWxsIGFib3J0cyB3aXRoIGBVbmtub3duXG4gICAgLy8gdmFyaWFibGVgIG9uIGFuIHVuYm91bmQgcm9vdCwgd2hpbGUgYGhhcyh2YXJzLmNhc2VSZWNvcmQpYCBhbnN3ZXJzXG4gICAgLy8gYGZhbHNlYCkuXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgRVZFUlkgVEVSTSBJUyBMT0FELUJFQVJJTkcgXHUyMDE0IGRvIG5vdCBzaW1wbGlmeSB0aGlzIHByZWRpY2F0ZS4gVGhlIGxhc3RcbiAgICAvLyBvbmUgTUlSUk9SUyBUSEUgTk9USUZZIE5PREUnUyBPV04gZW1wdGluZXNzIHJ1bGUgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcgYXRcbiAgICAvLyBpdDogYnVpbHRpbiBgbm90aWZ5YCBidWlsZHMgaXRzIGF1ZGllbmNlIHdpdGggYFN0cmluZyh2KS50cmltKClgICtcbiAgICAvLyBgLmZpbHRlcihCb29sZWFuKWAsIHNvIG51bGwsIHVuZGVmaW5lZCwgYCcnYCBhbmQgYW55IGFsbC13aGl0ZXNwYWNlIHZhbHVlXG4gICAgLy8gYWxsIGNvbGxhcHNlIHRvIHRoZSBzYW1lIGVtcHR5IHNsYXRlLiBFYWNoIHRlcm0gd2FzIG1lYXN1cmVkIHRocm91Z2hcbiAgICAvLyBgZXZhbHVhdGVDb25kaXRpb25gIG9uIHRoZSBzaGFwZSBpdCBhbG9uZSBjb3ZlcnMsIGJ5IGRyb3BwaW5nIGl0IGFuZFxuICAgIC8vIHJlY29yZGluZyB3aGF0IHRoZSByZXN0IGRvOlxuICAgIC8vICAgLSBgaGFzKHZhcnMuY2FzZVJlY29yZClgIFx1MjAxNCBhbiBVTkJPVU5EIHJvb3QuIFdpdGhvdXQgaXQgdGhlIHByZWRpY2F0ZVxuICAgIC8vICAgICBhYm9ydHMgd2l0aCBgTm8gc3VjaCBrZXk6IGNhc2VSZWNvcmRgLiBgZ2V0X2Nhc2VgIGJpbmRzIHRoZSB2YXJpYWJsZVxuICAgIC8vICAgICBvbiBldmVyeSBwYXRoIGhlcmUgKGl0IHNldHMgaXQgZXZlbiB3aGVuIGl0IG1hdGNoZWQgbm90aGluZyksIHNvIHRoaXNcbiAgICAvLyAgICAgdGVybSBpcyB3aGF0IGtlZXBzIGEgZnV0dXJlIGdyYXBoIGVkaXQgZnJvbSB0dXJuaW5nIGEgZ2F0ZSBpbnRvIGFuXG4gICAgLy8gICAgIGFib3J0IFx1MjAxNCBhbmQgdGhlIGB2YXJzLmAtc2NvcGVkIGBoYXMoKWAgcGFpciBpcyB0aGUgaG91c2UgcnVsZVxuICAgIC8vICAgICBgdGVzdC9mbG93LXZhcmlhYmxlLWNvbmRpdGlvbnMudGVzdC50c2AgZW5mb3JjZXMuXG4gICAgLy8gICAtIGBoYXModmFycy5jYXNlUmVjb3JkLm93bmVyX2lkKWAgXHUyMDE0IHRoZSBBQlNFTlQga2V5LiBXaXRob3V0IGl0LFxuICAgIC8vICAgICBgdmFycy5jYXNlUmVjb3JkLm93bmVyX2lkICE9IG51bGxgIGFib3J0cyB3aXRoIGBObyBzdWNoIGtleTogb3duZXJfaWRgLlxuICAgIC8vICAgLSBgdmFycy5jYXNlUmVjb3JkLm93bmVyX2lkICE9IG51bGxgIFx1MjAxNCB0aGUgZXhwbGljaXQgTlVMTC4gV2l0aG91dCBpdCB0aGVcbiAgICAvLyAgICAgd3JhcCBpcyBoYW5kZWQgb25lIGFuZCBhYm9ydHMgd2l0aCBgbm8gbWF0Y2hpbmcgb3ZlcmxvYWQgZm9yXG4gICAgLy8gICAgICdzdHJpbmcobnVsbCknYCwgc28gdGhpcyB0ZXJtIG11c3Qgc2hvcnQtY2lyY3VpdCBpbiBmcm9udCBvZiBpdC5cbiAgICAvLyAgIC0gYHN0cmluZyguLi4pLnRyaW0oKSAhPSBcIlwiYCBcdTIwMTQgdGhlIEJMQU5LL3doaXRlc3BhY2UgaWQuIGAnICAgJyAhPSBcIlwiYCBpc1xuICAgIC8vICAgICBUUlVFIGluIENFTCwgc28gYSBnYXRlIHdyaXR0ZW4gdGhhdCB3YXkgb3BlbnMgZm9yIGEgd2hpdGVzcGFjZVxuICAgIC8vICAgICBgb3duZXJfaWRgIGFuZCByZXByb2R1Y2VzIHRoaXMgdmVyeSBkZWZlY3Qgb25lIGlucHV0IG5hcnJvd2VyLiBUaGVcbiAgICAvLyAgICAgYHN0cmluZygpYCB3cmFwIGlzIG5vdCBkZWNvcmF0aW9uIGVpdGhlcjogbWVhc3VyZWQsIGEgYmFyZSBgLnRyaW0oKWBcbiAgICAvLyAgICAgb24gYSBudW1lcmljIGlkIGFib3J0cyB3aXRoIGBubyBtYXRjaGluZyBvdmVybG9hZCBmb3JcbiAgICAvLyAgICAgJ2RvdWJsZS50cmltKCknYCBhbmQgYC5tYXRjaGVzKClgIHdpdGggYCdkb3VibGUubWF0Y2hlcyhzdHJpbmcpJ2AgXHUyMDE0IGFcbiAgICAvLyAgICAgdGhyb3duIGNvbmRpdGlvbiwgdGhlIGZhdWx0IG1vZGUgdGhpcyBnYXRlIGV4aXN0cyB0byByZW1vdmUuXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgRG8gTk9UIGFkZCBhIGB2YXJzLmNhc2VSZWNvcmQgIT0gbnVsbGAgdGVybSBmb3IgdGhlIHJvdyB0aGF0IGlzIEdPTkUgYnlcbiAgICAvLyB0aGUgdGltZSBgZ2V0X2Nhc2VgIHJlYWRzIGl0LiBNZWFzdXJlZCBJTkVSVDogYGdldF9yZWNvcmRgIHdpdGggbm8gbWF0Y2hcbiAgICAvLyBzZXRzIHRoZSB2YXJpYWJsZSB0byBgbnVsbGAsIGtleSBwcmVzZW50LCBhbmQgYGhhcygpYCBvbiBhIG51bGwgYmFzZVxuICAgIC8vIGFuc3dlcnMgYGZhbHNlYCByYXRoZXIgdGhhbiBhYm9ydGluZywgc28gdGhlIGZvdXIgdGVybXMgYWJvdmUgYWxyZWFkeVxuICAgIC8vIGNsb3NlIHRoYXQgc2hhcGUgKGB0ZXN0L2Zsb3ctZXNjYWxhdGlvbi1vd25lcmxlc3MtY2FzZS50ZXN0LnRzYCBjb3ZlcnNcbiAgICAvLyBpdCkuIEEgdGVybSB0aGF0IGNhbm5vdCBjaGFuZ2UgYW4gYW5zd2VyIGlzIGFuIGluZXJ0IGNvcHksIG5vdCBkZWZlbmNlIGluXG4gICAgLy8gZGVwdGguXG4gICAgeyBpZDogJ2U0Jywgc291cmNlOiAnY2hlY2tfb3duZXInLCB0YXJnZXQ6ICdub3RpZnlfdGVhbScsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGBoYXModmFycy5jYXNlUmVjb3JkKSAmJiBoYXModmFycy5jYXNlUmVjb3JkLm93bmVyX2lkKVxuICAgICAgJiYgdmFycy5jYXNlUmVjb3JkLm93bmVyX2lkICE9IG51bGwgJiYgc3RyaW5nKHZhcnMuY2FzZVJlY29yZC5vd25lcl9pZCkudHJpbSgpICE9IFwiXCJgLCBsYWJlbDogJ0hhcyBvd25lcicgfSxcbiAgICB7IGlkOiAnZTUnLCBzb3VyY2U6ICdub3RpZnlfdGVhbScsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcblxuLyoqXG4gKiBJbnNlcnQtdGltZSB0d2luIG9mIGBjYXNlX2VzY2FsYXRpb25gOiBhIHJlY29yZC1jaGFuZ2UgZmxvdyBiaW5kcyBleGFjdGx5IG9uZVxuICogaG9vayBldmVudCwgc28gdGhlIGFmdGVyVXBkYXRlIGZsb3cgYWJvdmUgbmV2ZXIgc2VlcyBjYXNlcyB0aGF0IGFyZSBCT1JOXG4gKiBjcml0aWNhbCAocGhvbmUtaW4gUDFzIFx1MjAxNCB0aGUgY29tbW9uIHBhdGgpLiBTYW1lIG5vZGVzL2VkZ2VzLCBvbmx5IHRoZSBzdGFydFxuICogbm9kZSBpcyByZWJvdW5kIHRvIGFmdGVySW5zZXJ0LiBUaGUgYGVzY2FsYXRlZF9kYXRlID09IG51bGxgICsgc3RhdHVzIGd1YXJkXG4gKiBjYXJyaWVzIG92ZXIgdW50b3VjaGVkIChhIGNhc2UgYm9ybiBjcml0aWNhbCBoYXMgbmVpdGhlcikuXG4gKi9cbmV4cG9ydCBjb25zdCBDYXNlRXNjYWxhdGlvbk9uQ3JlYXRlRmxvdzogRmxvdyA9IHtcbiAgLi4uQ2FzZUVzY2FsYXRpb25GbG93LFxuICBuYW1lOiAnY2FzZV9lc2NhbGF0aW9uX29uX2NyZWF0ZScsXG4gIGxhYmVsOiAnQ2FzZSBFc2NhbGF0aW9uIFByb2Nlc3MgKG9uIGNyZWF0ZSknLFxuICBkZXNjcmlwdGlvbjogJ0VzY2FsYXRlIGNhc2VzIGNyZWF0ZWQgY3JpdGljYWwgKGluc2VydC10aW1lIHR3aW4gb2YgY2FzZV9lc2NhbGF0aW9uKScsXG4gIG5vZGVzOiBDYXNlRXNjYWxhdGlvbkZsb3cubm9kZXMubWFwKChuKSA9PlxuICAgIG4uaWQgPT09ICdzdGFydCdcbiAgICAgID8geyAuLi5uLCBjb25maWc6IHsgLi4ubi5jb25maWcsIHRyaWdnZXJUeXBlOiAncmVjb3JkLWFmdGVyLWNyZWF0ZScgfSB9XG4gICAgICA6IG4sXG4gICksXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9mbG93cy9jYXNlLWFjdGlvbnMuZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZmxvd3MvY2FzZS1hY3Rpb25zLmZsb3cudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGNlbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcbmltcG9ydCB7IENMQUlNQUJMRV9UQVJHRVRfU1RBVFVTRVMgfSBmcm9tICcuLi9vYmplY3RzL19jYXNlLWFzc2lnbm1lbnQnO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIFNjcmVlbiBmbG93cyBiZWhpbmQgdGhlIENsYWltIENhc2UgLyBFc2NhbGF0ZSBDYXNlIC8gQ2xvc2UgQ2FzZSBoZWFkZXJcbiAqIGFjdGlvbnMuXG4gKlxuICogXHUyNkQ0IE5ldmVyIHJlLWV4cHJlc3MgdGhlc2UgYXMgYGJvZHlgLXR5cGVkIGFjdGlvbnMgKHZlcmlmaWVkIGFnYWluc3QgdGhlXG4gKiBydW5uaW5nIDE2LjEuMCBjb25zb2xlLCAyMDI2LTA3LTI4KTpcbiAqXG4gKiAgLSBgdHlwZTogJ21vZGFsJ2AgbmV2ZXIgZXhlY3V0ZXMgdGhlIGJvZHkgYXQgYWxsIFx1MjAxNCBvbiBzdWJtaXQgdGhlIGNvbnNvbGVcbiAqICAgIHJlc29sdmVzIHRoZSBhY3Rpb24gYHRhcmdldGAgYXMgYW4gT0JKRUNUIG5hbWUgYW5kIGRpZXMgb25cbiAqICAgIGBHRVQgL2FwaS92MS9tZXRhL29iamVjdC88dGFyZ2V0PmAgXHUyMTkyIDQwMCAoXCJFcnJvciBsb2FkaW5nIGZvcm1cIikuXG4gKiAgLSBgdHlwZTogJ3NjcmlwdCdgIERPRVMgcmVhY2ggYFBPU1QgL2FwaS92MS9hY3Rpb25zLy4uLmAsIGJ1dCBhIGJvZHkgdGhhdFxuICogICAgVVBEQVRFUyBhIHJlY29yZCBvbiBhbiBvYmplY3Qgd2l0aCBzaGFyaW5nIHJ1bGVzIGlzIHJlamVjdGVkIGJ5IHRoZVxuICogICAgc2hhcmluZyBtaWRkbGV3YXJlIChcIkZPUkJJRERFTjogaW5zdWZmaWNpZW50IHByaXZpbGVnZXMgdG8gdXBkYXRlXG4gKiAgICBjcm1fY2FzZSBcdTIwMjZcIikgXHUyMDE0IHRoZSBzYW5kYm94IGV4ZWN1dGlvbiBjb250ZXh0IGRvZXMgbm90IGNhcnJ5IHRoZSBjYWxsZXJcbiAqICAgIGlkZW50aXR5LCBzbyBgY2FuRWRpdGAgZmFpbHMgZXZlbiBmb3IgdGhlIHJlY29yZCBvd25lci4gSW5zZXJ0cyBhcmVcbiAqICAgIHVuYWZmZWN0ZWQgKGNsb25lX29wcG9ydHVuaXR5IHdvcmtzKSwgdXBkYXRlcyBhcmUgbm90LlxuICogIC0gU2NyZWVuIGZsb3dzIGV4ZWN1dGUgdGhyb3VnaCB0aGUgYXV0b21hdGlvbiBzZXJ2aWNlLCB3aG9zZVxuICogICAgYHVwZGF0ZV9yZWNvcmRgIG5vZGVzIGRlbW9uc3RyYWJseSB3cml0ZSBgY3JtX2Nhc2VgICh0aGVcbiAqICAgIGNhc2VfZXNjYWxhdGlvbiByZWNvcmQtY2hhbmdlIGZsb3cgZG9lcyBleGFjdGx5IHRoYXQgaW4gcHJvZHVjdGlvbikuXG4gKlxuICogU2FtZSBtZWNoYW5pc20gYXMgYHNjaGVkdWxlX2ZvbGxvd3VwYCAvIGBsZWFkX2NvbnZlcnNpb25gLlxuICovXG5leHBvcnQgY29uc3QgRXNjYWxhdGVDYXNlRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2VzY2FsYXRlX2Nhc2UnLFxuICBsYWJlbDogJ0VzY2FsYXRlIENhc2UnLFxuICBkZXNjcmlwdGlvbjogJ0NvbGxlY3QgYW4gZXNjYWxhdGlvbiByZWFzb24sIHRoZW4gZmxhZyBhbmQgcmUtcHJpb3JpdGlzZSB0aGUgY2FzZS4nLFxuICB0eXBlOiAnc2NyZWVuJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcblxuICB2YXJpYWJsZXM6IFtcbiAgICAvLyBNVVNUIGJlIGByZWNvcmRJZGAgXHUyMDE0IHRoZSBjb25zb2xlJ3MgZmxvdy1hY3Rpb24gY29udHJhY3Qgc2VlZHMgb25seSB0aGF0XG4gICAgLy8gbmFtZSAoYW5kIGl0cyBjYW1lbENhc2Ugb2JqZWN0IGFsaWFzKTsgYSBjdXN0b20gbmFtZSBhcnJpdmVzIHVuZGVmaW5lZC5cbiAgICB7IG5hbWU6ICdyZWNvcmRJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAncmVhc29uJywgdHlwZTogJ3RleHQnLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgXSxcblxuICBub2RlczogW1xuICAgIHsgaWQ6ICdzdGFydCcsIHR5cGU6ICdzdGFydCcsIGxhYmVsOiAnU3RhcnQnLCBjb25maWc6IHsgb2JqZWN0TmFtZTogJ2NybV9jYXNlJyB9IH0sXG4gICAge1xuICAgICAgaWQ6ICdzY3JlZW5fMScsIHR5cGU6ICdzY3JlZW4nLCBsYWJlbDogJ0VzY2FsYXRlIENhc2UnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogJ3JlYXNvbicsIGxhYmVsOiAnRXNjYWxhdGlvbiBSZWFzb24nLCB0eXBlOiAndGV4dGFyZWEnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSBVU0VSLUNPTlRFWFQgaGFsZiBvZiB0aGUgZXNjYWxhdGlvbi4gRXZlcnl0aGluZyBoZXJlIGlzIGFcbiAgICAgIC8vIGNvbHVtbiB0aGUgYWN0aW5nIGFnZW50IG1heSBsZWdpdGltYXRlbHkgd3JpdGUsIHNvIGl0IGlzIHdyaXR0ZW4gd2l0aFxuICAgICAgLy8gdGhlaXIgaWRlbnRpdHkgXHUyMDE0IHRoaXMgZmxvdyBzdGF5cyBgcnVuQXM6ICd1c2VyJ2AuXG4gICAgICAvL1xuICAgICAgLy8gICBlc2NhbGF0aW9uX3JlYXNvbiAgdGhlIGFnZW50J3Mgb3duIHNjcmVlbiBpbnB1dFxuICAgICAgLy8gICBwcmlvcml0eSAgICAgICAgICAgYW4gb3JkaW5hcnkgZWRpdGFibGUgZmllbGRcbiAgICAgIC8vICAgc3RhdHVzICAgICAgICAgICAgIG9yZGluYXJ5LCBhbmQgdGhlIGhvb2sgdHJpZ2dlciAoYmVsb3cpXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHR3byBzdGFtcHMgYSBwZXJzb24gbmV2ZXIgdHlwZXMgXHUyMDE0IGBpc19lc2NhbGF0ZWRgIGFuZFxuICAgICAgLy8gYGVzY2FsYXRlZF9kYXRlYCBcdTIwMTQgYXJlIGByZWFkb25seTogdHJ1ZWAgb24gYGNybV9jYXNlYCBhbmQgYXJlIHdyaXR0ZW5cbiAgICAgIC8vIGJ5IHRoZSBgY2FzZV9lc2NhbGF0aW9uX3N0YW1wYCBzdWJmbG93IHRoYXQgZm9sbG93cywgd2l0aCB0aGUgc3lzdGVtXG4gICAgICAvLyBjb250ZXh0LiBTZWUgYHNyYy9zZXJ2aWNlL2Zsb3dzL2Nhc2UtZXNjYWxhdGlvbi1zdGFtcC5mbG93LnRzYC5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgYHN0YXR1czogJ2VzY2FsYXRlZCdgIE1VU1Qgc3RheSBpbiB0aGlzIG5vZGUsIGFuZCBub3Qgb25seSBiZWNhdXNlXG4gICAgICAvLyBpdCBpcyB1c2VyLXdyaXRhYmxlOiBpdCBpcyB0aGUgdHJpZ2dlciBib3RoIGVzY2FsYXRpb24gaG9va3Mga2V5IG9mZiBcdTIwMTRcbiAgICAgIC8vIGBjYXNlX2VzY2FsYXRpb25fcmVhc3NpZ25gIChgX2Nhc2UtYXNzaWdubWVudC50c2ApIGdhdGVzIG9uXG4gICAgICAvLyBgaW5wdXQuc3RhdHVzICE9PSAnZXNjYWxhdGVkJyB8fCBwcmV2aW91cy5zdGF0dXMgPT09ICdlc2NhbGF0ZWQnYCwgYW5kXG4gICAgICAvLyBgY2FzZV9zdGF0dXNfc2lkZV9lZmZlY3RzYCAoYGNhc2UuaG9vay50c2ApIHJlYWRzIHRoZSBzYW1lIHRyYW5zaXRpb24uXG4gICAgICAvLyBLZWVwaW5nIGl0IGhlcmUga2VlcHMgdGhlIG93bmVyc2hpcCBoYW5kLW9mZiBhbmQgdGhlIHNpZGUtZWZmZWN0IHRhc2tzXG4gICAgICAvLyBmaXJpbmcgZnJvbSB0aGUgQUNUSU5HIFVTRVIncyB3cml0ZSwgZXhhY3RseSBhcyB0aGV5IGRpZCBiZWZvcmUgdGhlXG4gICAgICAvLyBzcGxpdC4gTW92aW5nIGl0IGludG8gdGhlIGVsZXZhdGVkIHN1YmZsb3cgd291bGQgc2lsZW50bHkgcmUtYXR0cmlidXRlXG4gICAgICAvLyBib3RoIHRvIHRoZSBzeXN0ZW0uXG4gICAgICAvL1xuICAgICAgLy8gSXQgaXMgYWxzbyB3aGF0IHN1cHByZXNzZXMgYSBkb3VibGUtZmlyZSBvZiB0aGUgYXV0b21hdGljXG4gICAgICAvLyBgY2FzZV9lc2NhbGF0aW9uYCByZWNvcmQtY2hhbmdlIGZsb3cuXG4gICAgICBpZDogJ2VzY2FsYXRlJywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ0VzY2FsYXRlIENhc2UnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fY2FzZScsXG4gICAgICAgIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZElkYCB9LFxuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBlc2NhbGF0aW9uX3JlYXNvbjogY2VsYHJlYXNvbmAsXG4gICAgICAgICAgc3RhdHVzOiAnZXNjYWxhdGVkJyxcbiAgICAgICAgICBwcmlvcml0eTogJ2NyaXRpY2FsJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBUaGUgRUxFVkFURUQgaGFsZiwgYW5kIHRoZSBvbmx5IGVsZXZhdGlvbiBpbiB0aGlzIGZsb3c6IG9uZVxuICAgICAgLy8gYHJ1bkFzOiAnc3lzdGVtJ2AgZmxvdywgb25lIGB1cGRhdGVfcmVjb3JkYCwgdHdvIHJlYWRvbmx5IGNvbHVtbnMuXG4gICAgICAvLyBUaGUgbWFpbnRhaW5lci1hcHByb3ZlZCBkaXJlY3Rpb24gXHUyMDE0IGVsZXZhdGUgdGhlIHdyaXRlLCBub3QgdGhlIGZsb3cuXG4gICAgICAvL1xuICAgICAgLy8gXHUyNkEwXHVGRTBGIFRISVMgTk9ERSBNVVNUIFJVTiBBRlRFUiBgZXNjYWxhdGVgLCBOT1QgQkVGT1JFLiBgY3JtX2Nhc2VgJ3NcbiAgICAgIC8vIGBlc2NhbGF0aW9uX3JlYXNvbl9yZXF1aXJlZGAgdmFsaWRhdGlvbiByZWplY3RzIGFueSB3cml0ZSB3aG9zZSBtZXJnZWRcbiAgICAgIC8vIHJlY29yZCBoYXMgYGlzX2VzY2FsYXRlZCA9PSB0cnVlYCBhbmQgYSBibGFuayBgZXNjYWxhdGlvbl9yZWFzb25gLiBUaGVcbiAgICAgIC8vIHJlYXNvbiBpcyB3cml0dGVuIGJ5IHRoZSBub2RlIGFib3ZlLCBzbyBieSB0aGUgdGltZSB0aGUgZmxhZyBmbGlwcyBpdFxuICAgICAgLy8gaXMgYWxyZWFkeSBzdG9yZWQuIFJldmVyc2luZyB0aGVzZSB0d28gbm9kZXMgZmlyZXMgdGhhdCB2YWxpZGF0aW9uXG4gICAgICAvLyBhZ2FpbnN0IGEgcmVjb3JkIHdpdGggbm8gcmVhc29uIHlldCBhbmQgdGhlIHN0YW1wIGlzIHJlamVjdGVkLlxuICAgICAgLy9cbiAgICAgIC8vIFx1MjZENCBEbyBub3QgXCJzaW1wbGlmeVwiIHRoaXMgYnkgZ2l2aW5nIFRISVMgZmxvdyBgcnVuQXM6ICdzeXN0ZW0nYCBhbmRcbiAgICAgIC8vIGZvbGRpbmcgdGhlIHN0YW1wIGJhY2sgaW50byB0aGUgbm9kZSBhYm92ZS4gVGhhdCBpcyBvcHRpb24gQSwgY29zdGVkXG4gICAgICAvLyBhbmQgZXhwbGljaXRseSBub3QgYWRvcHRlZDogaXQgZWxldmF0ZXMgZXZlcnkgd3JpdGUgdGhpcyBzY3JlZW4gZmxvd1xuICAgICAgLy8gbWFrZXMgYW5kIHN0b3BzIGl0IGNhcnJ5aW5nIHRoZSBhY3RpbmcgdXNlcidzIGNvbnRleHQgZG93bnN0cmVhbS5cbiAgICAgIC8vIGBBR0VOVFMubWRgIGhvdXNlIHJ1bGUgOSBzdGF0ZXMgaXQgYXMgc3RhbmRpbmcgcG9saWN5LlxuICAgICAgaWQ6ICdzdGFtcF9lc2NhbGF0aW9uJywgdHlwZTogJ3N1YmZsb3cnLCBsYWJlbDogJ1N0YW1wIEVzY2FsYXRpb24gRmxhZ3MnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGZsb3dOYW1lOiAnY2FzZV9lc2NhbGF0aW9uX3N0YW1wJyxcbiAgICAgICAgaW5wdXQ6IHsgcmVjb3JkSWQ6IGNlbGByZWNvcmRJZGAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdzY3JlZW5fMScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ3NjcmVlbl8xJywgdGFyZ2V0OiAnZXNjYWxhdGUnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdlc2NhbGF0ZScsIHRhcmdldDogJ3N0YW1wX2VzY2FsYXRpb24nLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTQnLCBzb3VyY2U6ICdzdGFtcF9lc2NhbGF0aW9uJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuXG5leHBvcnQgY29uc3QgQ2xvc2VDYXNlRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2Nsb3NlX2Nhc2UnLFxuICBsYWJlbDogJ0Nsb3NlIENhc2UnLFxuICBkZXNjcmlwdGlvbjogJ0NvbGxlY3QgdGhlIHJlc29sdXRpb24sIHRoZW4gY2xvc2UgdGhlIGNhc2UgYW5kIHN0b3AgdGhlIFNMQSBjbG9jay4nLFxuICB0eXBlOiAnc2NyZWVuJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gYGlzX2Nsb3NlZGAgaXMgYSByZWFkb25seSBsaWZlY3ljbGUgZmllbGQuIFRoaXMgdHJ1c3RlZCBzY3JlZW4gZmxvdyBvd25zXG4gIC8vIHRoZSB0cmFuc2l0aW9uIGFuZCBtdXN0IHRoZXJlZm9yZSBydW4gd2l0aCB0aGUgc3lzdGVtIHdyaXRlci5cbiAgLy9cbiAgLy8gXHUyNkQ0IEEgSElTVE9SSUNBTCBQUkVDRURFTlQsIE5PVCBBIFBPTElDWSBcdTIwMTQgZG8gbm90IGNpdGUgdGhpcyBsaW5lIHRvIGp1c3RpZnlcbiAgLy8gZWxldmF0aW5nIGFub3RoZXIgc2NyZWVuIGZsb3cgKCMxNDM0LCB0aGUgbWFpbnRhaW5lciBydWxpbmcgdGhhdCBzZXR0bGVkXG4gIC8vIGl0KS4gVGhlIHN0YW5kaW5nIHJ1bGUgaXMgdGhlIG9wcG9zaXRlIG9uZTogYSBzY3JlZW4gZmxvdyBzdGF5c1xuICAvLyBgcnVuQXM6ICd1c2VyJ2AgYW5kIGEgd3JpdGUgdGhhdCBnZW51aW5lbHkgbmVlZHMgZWxldmF0aW9uIGlzIHNwbGl0IGludG8gYVxuICAvLyBkZWRpY2F0ZWQgYHN5c3RlbWAgc3ViLWZsb3cgcmVhY2hlZCBieSBhIGBzdWJmbG93YCBub2RlIFx1MjAxNCBzZWVcbiAgLy8gYGVzY2FsYXRlX2Nhc2VgIGFib3ZlIGFuZCBgc3JjL3NlcnZpY2UvZmxvd3MvY2FzZS1lc2NhbGF0aW9uLXN0YW1wLmZsb3cudHNgLlxuICAvLyBcIlJlYWRvbmx5IHN0cmlwcGVkIG15IHdyaXRlLCBzbyBJIG1hZGUgdGhlIGZsb3cgc3lzdGVtXCIgaXMgdGhlIHBhdHRlcm5cbiAgLy8gdGhhdCBydWxpbmcgZXhpc3RzIHRvIHN0b3AgYmVpbmcgY29waWVkOyBgQUdFTlRTLm1kYCBob3VzZSBydWxlIDkgY2Fycmllc1xuICAvLyBpdCBhcyBob3VzZSBwb2xpY3kuIFRoaXMgZmxvdyBwcmVkYXRlcyB0aGF0IHJ1bGUgYW5kIGhhcyBub3QgYmVlblxuICAvLyByZS1zaGFwZWQgdG8gbWF0Y2ggaXQuXG4gIHJ1bkFzOiAnc3lzdGVtJyxcblxuICB2YXJpYWJsZXM6IFtcbiAgICB7IG5hbWU6ICdyZWNvcmRJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAncmVzb2x1dGlvbicsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAncmVzb2x2ZWRfYnlfYXJ0aWNsZScsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gIF0sXG5cbiAgbm9kZXM6IFtcbiAgICB7IGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0JywgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fY2FzZScgfSB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSBcImF0dGFjaCB0aGUgYXJ0aWNsZSB0aGF0IHJlc29sdmVkIGl0XCIgYWZmb3JkYW5jZS4gT3B0aW9uYWxcbiAgICAgIC8vIG9uIHB1cnBvc2U6IG1vc3QgY2FzZXMgYXJlIG5vdCByZXNvbHZlZCBvdXQgb2YgdGhlIGtub3dsZWRnZSBiYXNlLCBhbmRcbiAgICAgIC8vIGEgcmVxdWlyZWQgZmllbGQgaGVyZSB3b3VsZCBiZSBhbnN3ZXJlZCB3aXRoIGEganVuayB2YWx1ZSByYXRoZXIgdGhhblxuICAgICAgLy8gbGVmdCBob25lc3QgXHUyMDE0IHdoaWNoIGlzIHdvcnNlIHRoYW4gYW4gYWJzZW50IGxpbmsgZm9yIGEgbWVhc3VyZSB3aG9zZVxuICAgICAgLy8gd2hvbGUgam9iIGlzIHRvIHNheSBob3cgT0ZURU4gdGhlIEtCIHJlc29sdmVzIGEgY2FzZS5cbiAgICAgIC8vXG4gICAgICAvLyBgcmVmZXJlbmNlYCBuYW1lcyB0aGUgb2JqZWN0IHRoZSBwaWNrZXIgb2ZmZXJzLiBVcCB0b1xuICAgICAgLy8gYEBvYmplY3RzdGFjay9zcGVjQDE3LjQuMGAgYSBzY3JlZW4gZmllbGQgaGFkIG5vIHN1Y2gga2V5LCBzbyB0aGlzXG4gICAgICAvLyBgdHlwZTogJ2xvb2t1cCdgIGZpZWxkIGhhZCBub3RoaW5nIHRvIHJlc29sdmUgYSByZWNvcmQgcGlja2VyIGZyb207XG4gICAgICAvLyAxNy41LjAgYWRkZWQgYHJlZmVyZW5jZWAgdG8gYFNjcmVlbkZpZWxkQ29uZmlnU2NoZW1hYCBhbmQgbWFkZSBpdFxuICAgICAgLy8gUkVRVUlSRUQgb24gYSBsb29rdXAgc2NyZWVuIGZpZWxkICgjMTc5MTMpIFx1MjAxNCB0aGUgc3RhY2sgZG9lcyBub3QgbG9hZFxuICAgICAgLy8gd2l0aG91dCBpdC4gSXQgaXMgdGhlIHNhbWUgdGFyZ2V0IHRoZSBjYXNlJ3Mgb3duIGByZXNvbHZlZF9ieV9hcnRpY2xlYFxuICAgICAgLy8gbG9va3VwIGRlY2xhcmVzIChgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCkuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIGBSZXNvbHZlZCBieSBBcnRpY2xlYCBsb29rdXAgaW4gdGhlIGNhc2UncyBSZXNvbHV0aW9uIGdyb3VwLCBvbiB0aGVcbiAgICAgIC8vIHJlY29yZCBmb3JtLCB3cml0ZXMgdGhlIHNhbWUgY29sdW1uOyB0aGUgYWN0aW9uIGlzXG4gICAgICAvLyBgcmVmcmVzaEFmdGVyOiB0cnVlYCwgc28gdGhlIHJlY29yZCBmb3JtIGlzIHdoYXQgdGhlIGFnZW50IGxhbmRzIG9uXG4gICAgICAvLyBpbW1lZGlhdGVseSBhZnRlciBjbG9zaW5nLlxuICAgICAgaWQ6ICdzY3JlZW5fMScsIHR5cGU6ICdzY3JlZW4nLCBsYWJlbDogJ0Nsb3NlIENhc2UnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogJ3Jlc29sdXRpb24nLCBsYWJlbDogJ1Jlc29sdXRpb24nLCB0eXBlOiAndGV4dGFyZWEnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICdyZXNvbHZlZF9ieV9hcnRpY2xlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnUmVzb2x2ZWQgYnkgQXJ0aWNsZSAob3B0aW9uYWwpJyxcbiAgICAgICAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgICAgICAgcmVmZXJlbmNlOiAnY3JtX2tub3dsZWRnZV9hcnRpY2xlJyxcbiAgICAgICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIGByZXNvbHZlZF9ieV9hcnRpY2xlYCBpcyB3cml0dGVuIHVuY29uZGl0aW9uYWxseSwgYW5kIGEgYmxhbmsgb25lIGlzXG4gICAgICAvLyBub3JtYWxpc2VkIHRvIE5VTEwgYnkgYGNhc2VfcmVzb2x1dGlvbl9hcnRpY2xlX25vcm1hbGl6ZWBcbiAgICAgIC8vIChgc3JjL3NlcnZpY2Uvb2JqZWN0cy9jYXNlLmhvb2sudHNgKSByYXRoZXIgdGhhbiBicmFuY2hlZCBhcm91bmQgaGVyZTogTUVBU1VSRURcbiAgICAgIC8vIG9uIHRoZSByZWFsIGVuZ2luZSwgYSBzY3JlZW4gZmllbGQgbGVmdCBlbXB0eSByZXN1bWVzIGFzIGAnJ2AgYW5kIGxhbmRzXG4gICAgICAvLyBhcyBhbiBlbXB0eSBzdHJpbmcsIHdoaWNoIGBjb3VudChyZXNvbHZlZF9ieV9hcnRpY2xlKWAgY291bnRzLiBBXG4gICAgICAvLyBgZGVjaXNpb25gIG5vZGUgY291bGQgbm90IGhhdmUgYnJhbmNoZWQgaXQgZWl0aGVyIFx1MjAxNCB0aGlzIHJlcG8gaGFzXG4gICAgICAvLyBtZWFzdXJlZCBgZGVjaXNpb24uY29uZmlnLmNvbmRpdGlvbmAgdG8gYmUgaW5lcnQgbWV0YWRhdGFcbiAgICAgIC8vIChgdGVzdC93aW4tbG9zcy1jYXB0dXJlLnRlc3QudHNgJ3MgdGFibGUgb2YgZml2ZSBzdWNoIHN1cmZhY2VzKS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgcmVhZCBpcyBndWFyZGVkIGJlY2F1c2UgdGhlIGZpZWxkIGlzIG9wdGlvbmFsOiBhIHJlc3VtZSB0aGF0IG9taXRzXG4gICAgICAvLyBpdCBsZWF2ZXMgdGhlIHZhcmlhYmxlIHVuYm91bmQsIHdoaWNoIHRoZSAxNy54IHRlbXBsYXRlIHdyb3RlIGFzIG5vdGhpbmdcbiAgICAgIC8vICh0aGUgc3RvcmVkIGxpbmsgbGVmdCBhbG9uZSkgYW5kIENFTCByZWZ1c2VzLiBUaGUgZ3VhcmQgd3JpdGVzIE5VTExcbiAgICAgIC8vIHRoZXJlIFx1MjAxNCB0aGUgdmFsdWUgYSBibGFuayBmaWVsZCBhbHJlYWR5IGxhbmRzIGFzIGFmdGVyIHRoZSBub3JtYWxpemVcbiAgICAgIC8vIGhvb2sgXHUyMDE0IHNvIGFuIG9taXR0ZWQgYW5zd2VyIGFuZCBhbiBlbXB0eSBvbmUgbm93IGNsb3NlIHRoZSBjYXNlIGFsaWtlLlxuICAgICAgaWQ6ICdjbG9zZScsIHR5cGU6ICd1cGRhdGVfcmVjb3JkJywgbGFiZWw6ICdDbG9zZSBDYXNlJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2Nhc2UnLFxuICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmRJZGAgfSxcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgaXNfY2xvc2VkOiB0cnVlLFxuICAgICAgICAgIHJlc29sdXRpb246IGNlbGByZXNvbHV0aW9uYCxcbiAgICAgICAgICBzdGF0dXM6ICdjbG9zZWQnLFxuICAgICAgICAgIHJlc29sdmVkX2J5X2FydGljbGU6IGNlbGBoYXModmFycy5yZXNvbHZlZF9ieV9hcnRpY2xlKSA/IHJlc29sdmVkX2J5X2FydGljbGUgOiBudWxsYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdzY3JlZW5fMScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ3NjcmVlbl8xJywgdGFyZ2V0OiAnY2xvc2UnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdjbG9zZScsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcblxuLyoqXG4gKiBDbGFpbSBDYXNlIFx1MjAxNCB0aGUgdHJpYWdlIGNsYWltIGdlc3R1cmUsIGdpdmVuIGEgYnV0dG9uLlxuICpcbiAqICMjIFdoYXQgdGhpcyBmbG93IGlzLCBhbmQgd2hhdCBpdCBkZWxpYmVyYXRlbHkgaXMgTk9UXG4gKlxuICogVGhlIGNsYWltIGFscmVhZHkgZXhpc3RzIGFzIGJlaGF2aW91cjogYW4gYWdlbnQgbW92ZXMgYW4gdW5vd25lZCBjYXNlIG91dCBvZlxuICogKipVbmFzc2lnbmVkIFx1MjAxNCB0cmlhZ2UqKiBieSBzZXR0aW5nIGl0cyBzdGF0dXMgdG8gb25lIHRoYXQgbWVhbnMgYSBwZXJzb24gaXNcbiAqIG9uIGl0LCBhbmQgYGNhc2Vfc2VsZl9jbGFpbWAgKGBzcmMvc2VydmljZS9vYmplY3RzL19jYXNlLWFzc2lnbm1lbnQudHNgLCBwcmlvcml0eVxuICogMjYwKSBzdGFtcHMgYG93bmVyX2lkYCB3aXRoIHRoZSBjYWxsZXIuIFRoaXMgZmxvdyBpcyB0aGUgc2NyZWVuIHRoYXQgc2F5cyBzby5cbiAqXG4gKiBJdCBpcyAqKnB1cmUgVUkgb3ZlciB0aGUgZXhpc3Rpbmcgc2VhbSoqLiBJdHMgb25lIHdyaXRlIGlzIHRoZVxuICogU1RBVFVTIE1PVkUuIEl0IGRvZXMgbm90IHdyaXRlIGBvd25lcl9pZGAsIGFuZCB0aGF0IGlzIG5vdCBhIHN0eWxlIGNob2ljZTpcbiAqXG4gKiAgLSB0aGUgb3duZXJzaGlwLXRyYW5zZmVyIGdhdGUgcmVmdXNlcyBhbnkgcGF5bG9hZCBjYXJyeWluZyBgb3duZXJfaWRgIGluIHRoZVxuICogICAgc2hhcmluZyBNSURETEVXQVJFLCB1cHN0cmVhbSBvZiB0aGUgaG9vayBwaGFzZSwgYW5kIGEgc2NyZWVuIGZsb3cnc1xuICogICAgYHVwZGF0ZV9yZWNvcmRgIHJ1bnMgYXMgdGhlIGNhbGxlciBcdTIwMTQgc28gYSBmbG93IHRoYXQgd3JvdGUgdGhlIGNvbHVtbiB3b3VsZFxuICogICAgYmUgcmVmdXNlZCBleGFjdGx5IGxpa2UgYSBoYW5kLXdyaXR0ZW4gdXBkYXRlLCBsb3VkbHkgYW5kIGFsd2F5cztcbiAqICAtIGFuZCBgY2FzZV9zZWxmX2NsYWltYCBndWFyZCAyIHN0YW5kcyBkb3duIHRoZSBtb21lbnQgYG93bmVyX2lkYCBpcyBhbHJlYWR5XG4gKiAgICBpbiB0aGUgcGF5bG9hZCwgc28gZXZlbiBhIGNhbGxlciBob2xkaW5nIGBhbGxvd1RyYW5zZmVyYCB3b3VsZCB0YWtlIHRoZVxuICogICAgY2xhaW0gc2VhbSBvdXQgb2YgdGhlIHBpY3R1cmUgcmF0aGVyIHRoYW4gZHJpdmUgaXQuXG4gKlxuICogT3duZXJzaGlwIHRoZXJlZm9yZSBrZWVwcyBleGFjdGx5IE9ORSB3cml0ZXIuIGB0ZXN0L2NsYWltLWNhc2Utb25lLW93bmVyLXdyaXRlci50ZXN0LnRzYFxuICogaXMgdGhhdCBzZW50ZW5jZSB0dXJuZWQgaW50byBhIGd1YXJkLCBzbyBpdCBpcyBlbmZvcmNlZCByYXRoZXIgdGhhbiBpbnRlbmRlZC5cbiAqXG4gKiAjIyBXaHkgYHJ1bkFzOiAndXNlcidgLCBzcGVsbGVkIG91dCByYXRoZXIgdGhhbiBkZWZhdWx0ZWRcbiAqXG4gKiBIb3VzZSBydWxlIDkgKGBBR0VOVFMubWRgKSBhbHJlYWR5IHNheXMgYSBzY3JlZW4gZmxvdyBzdGF5cyBgcnVuQXM6ICd1c2VyJ2AsXG4gKiBidXQgaGVyZSB0aGUgZGVmYXVsdCBpcyBMT0FELUJFQVJJTkcgYW5kIHdvcnRoIHJlYWRpbmcgdHdpY2U6IGBjYXNlX3NlbGZfY2xhaW1gXG4gKiByZXR1cm5zIGVhcmx5IGZvciBhIHdyaXRlIHdpdGggbm8gdXNlciwgYW5kIGFnYWluIGZvciBgY3R4LnNlc3Npb24uaXNTeXN0ZW1gLlxuICogQW4gZWxldmF0ZWQgcnVuIG9mIHRoaXMgZmxvdyB3b3VsZCBtb3ZlIHRoZSBzdGF0dXMgYW5kIGNsYWltIE5PVEhJTkcgXHUyMDE0IHRoZVxuICogY2FzZSB3b3VsZCBsZWF2ZSB0aGUgdHJpYWdlIHRhYiBzdGlsbCBvd25lcmxlc3MuIFRoZSBkZWNsYXJhdGlvbiBpcyBleHBsaWNpdFxuICogc28gdGhlIG5leHQgYXV0aG9yIHNlZXMgdGhlIGNvdXBsaW5nIGJlZm9yZSByZWFjaGluZyBmb3IgZWxldmF0aW9uLlxuICpcbiAqICMjIFdoeSBhIHNjcmVlbiwgYW5kIHdoeSB0aGUgcGlja2VyIGlzIGRlcml2ZWRcbiAqXG4gKiBUaGUgdGhyZWUgc3RhdHVzZXMgdGhhdCBjbGFpbSBhcmUgb25lIGNvbmNlcHQgd2l0aCB0aHJlZSBmYWNlcywgYW5kIHdoaWNoIG9uZVxuICogYW4gYWdlbnQgcGlja3MgaXMgcmVhbCBpbmZvcm1hdGlvbiAoYHdhaXRpbmdfY3VzdG9tZXJgIHN0cmFpZ2h0IG9mZiBhIHRyaWFnZVxuICogcm93IGlzIGEgZGlmZmVyZW50IGRheSdzIHdvcmsgZnJvbSBgaW5fcHJvZ3Jlc3NgKS4gVGhlIG9wdGlvbnMgYXJlIGJ1aWx0IGZyb21cbiAqIHtAbGluayBDTEFJTUFCTEVfVEFSR0VUX1NUQVRVU0VTfSBcdTIwMTQgdGhlIHNlYW0ncyBvd24gZGVjbGFyZWQgc2V0IFx1MjAxNCByYXRoZXIgdGhhblxuICogaGFuZC1jb3BpZWQuIFx1MjZENCBOZXZlciBoYW5kLWNvcHkgdGhlIHN1YnNldDogaXQgc2lsZW50bHkgZHJvcHMgYW4gb3B0aW9uIGZyb21cbiAqIHRoZSBwaWNrZXIgYW5kIG5vdGhpbmcgbm90aWNlcy4gQSBmb3VydGggY2xhaW1hYmxlIHN0YXR1cyBtYWtlcyB0aGUgbGFiZWwgbWFwXG4gKiBiZWxvdyBhIENPTVBJTEUgZXJyb3IgcmF0aGVyIHRoYW4gYSBxdWlldGx5IHNob3J0IHBpY2tlci5cbiAqL1xuY29uc3QgQ0xBSU1fU1RBVFVTX0xBQkVMOiBSZWNvcmQ8KHR5cGVvZiBDTEFJTUFCTEVfVEFSR0VUX1NUQVRVU0VTKVtudW1iZXJdLCBzdHJpbmc+ID0ge1xuICBpbl9wcm9ncmVzczogJ0luIFByb2dyZXNzJyxcbiAgd2FpdGluZ19jdXN0b21lcjogJ1dhaXRpbmcgb24gQ3VzdG9tZXInLFxuICB3YWl0aW5nX3N1cHBvcnQ6ICdXYWl0aW5nIG9uIFN1cHBvcnQnLFxufTtcblxuLyoqIFRoZSBwaWNrZXIsIGRlcml2ZWQgZnJvbSB0aGUgc2VhbSdzIHNldC4gTGFiZWxzIGFyZSBwaW5uZWQgdG8gYGNybV9jYXNlLnN0YXR1c2AncyBvd24uICovXG5jb25zdCBDTEFJTV9TVEFUVVNfT1BUSU9OUyA9IENMQUlNQUJMRV9UQVJHRVRfU1RBVFVTRVMubWFwKCh2YWx1ZSkgPT4gKHtcbiAgdmFsdWUsXG4gIGxhYmVsOiBDTEFJTV9TVEFUVVNfTEFCRUxbdmFsdWVdLFxufSkpO1xuXG5leHBvcnQgY29uc3QgQ2xhaW1DYXNlRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2NsYWltX2Nhc2UnLFxuICBsYWJlbDogJ0NsYWltIENhc2UnLFxuICBkZXNjcmlwdGlvbjogJ1Rha2UgYW4gdW5vd25lZCBjYXNlIG91dCBvZiB0cmlhZ2UgYnkgbW92aW5nIGl0IHRvIGEgc3RhdHVzIHRoYXQgbWVhbnMgeW91IGFyZSBvbiBpdC4nLFxuICB0eXBlOiAnc2NyZWVuJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gTG9hZC1iZWFyaW5nLCBub3QgYm9pbGVycGxhdGUgXHUyMDE0IHNlZSB0aGUgaGVhZGVyLiBBIHN5c3RlbSBydW4gY2xhaW1zIG5vYm9keS5cbiAgcnVuQXM6ICd1c2VyJyxcblxuICB2YXJpYWJsZXM6IFtcbiAgICAvLyBNVVNUIGJlIGByZWNvcmRJZGAgXHUyMDE0IHRoZSBjb25zb2xlJ3MgZmxvdy1hY3Rpb24gY29udHJhY3Qgc2VlZHMgb25seSB0aGF0XG4gICAgLy8gbmFtZSAoYW5kIGl0cyBjYW1lbENhc2Ugb2JqZWN0IGFsaWFzKTsgYSBjdXN0b20gbmFtZSBhcnJpdmVzIHVuZGVmaW5lZC5cbiAgICB7IG5hbWU6ICdyZWNvcmRJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAnY2xhaW1TdGF0dXMnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICBdLFxuXG4gIG5vZGVzOiBbXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCcsIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX2Nhc2UnIH0gfSxcbiAgICB7XG4gICAgICBpZDogJ3NjcmVlbl8xJywgdHlwZTogJ3NjcmVlbicsIGxhYmVsOiAnQ2xhaW0gQ2FzZScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ2NsYWltU3RhdHVzJywgbGFiZWw6ICdXb3JraW5nIHN0YXR1cycsIHR5cGU6ICdzZWxlY3QnLCByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJ2luX3Byb2dyZXNzJyxcbiAgICAgICAgICAgIG9wdGlvbnM6IENMQUlNX1NUQVRVU19PUFRJT05TLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gXHUyNkQ0IGBzdGF0dXNgIGlzIHRoZSBPTkxZIGZpZWxkIHRoaXMgbm9kZSBtYXkgZXZlciBjYXJyeS4gQWRkaW5nXG4gICAgICAvLyBgb3duZXJfaWRgIGhlcmUgZG9lcyBub3QgXCJtYWtlIHRoZSBjbGFpbSBleHBsaWNpdFwiIFx1MjAxNCBpdCBtYWtlcyB0aGUgd3JpdGVcbiAgICAgIC8vIHJlZnVzZWQgYnkgdGhlIHRyYW5zZmVyIGdhdGUgYmVmb3JlIGFueSBob29rIHJ1bnMsIGFuZCBpdCB0YWtlc1xuICAgICAgLy8gYGNhc2Vfc2VsZl9jbGFpbWAgb3V0IG9mIHRoZSBwYXRoIG9uIHRoZSBvbmUgY2FsbGVyIGl0IHdvdWxkIHJlYWNoLlxuICAgICAgLy8gVGhlIGd1YXJkIGJlc2lkZSB0aGlzIGZpbGUgZmFpbHMgb24gYW55IHN1Y2ggYWRkaXRpb24uXG4gICAgICBpZDogJ2NsYWltJywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ0NsYWltIENhc2UnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fY2FzZScsXG4gICAgICAgIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZElkYCB9LFxuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBzdGF0dXM6IGNlbGBjbGFpbVN0YXR1c2AsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIHsgaWQ6ICdlMScsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAnc2NyZWVuXzEnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdzY3JlZW5fMScsIHRhcmdldDogJ2NsYWltJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UzJywgc291cmNlOiAnY2xhaW0nLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHMvX2Nhc2UtYXNzaWdubWVudC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL19jYXNlLWFzc2lnbm1lbnQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB0eXBlIHsgSG9va0FwaSB9IGZyb20gJy4uLy4uL3NhbGVzL29iamVjdHMvX2hvb2stYXBpJztcblxuLyoqXG4gKiBcdTI1NTBcdTI1NTBcdTI1NTAgQ2FzZSBvd25lcnNoaXAgYXNzaWdubWVudCBcdTIwMTQgdGhlIGFwcC1sZXZlbCBzdGFuZC1pbiBmb3IgYSBtaXNzaW5nIHF1ZXVlIFx1MjU1MFx1MjU1MFxuICpcbiAqICMgXHUyNkQ0IFRoaXMgbW9kdWxlIGlzIGEgU1RPUEdBUC4gSXQgaXMgdGhlIGNvZGUgdG8gZGVsZXRlLlxuICpcbiAqIFNhbGVzZm9yY2Utc2hhcGVkIGNhc2UgaW50YWtlIHJvdXRlcyBhbiBvd25lcmxlc3MgY2FzZSBpbnRvIGEgUVVFVUUgYW5kIGxldHNcbiAqIGFnZW50cyBwdWxsIGZyb20gaXQuIE9iamVjdFN0YWNrIGhhcyBubyBxdWV1ZSBlbmdpbmU6IGBzeXNfcXVldWVgIGRvZXMgbm90XG4gKiBleGlzdCwgYW5kIHRoZSBgcXVldWVgIHNoYXJpbmctcmVjaXBpZW50IGFuZCBhcHByb3ZlciBlbnVtIG1lbWJlcnMgYXJlXG4gKiBkZXByZWNhdGVkIHVwc3RyZWFtLiBTbyBhIHdlYi10by1jYXNlIHN1Ym1pc3Npb24gXHUyMDE0IHdob3NlIGBvd25lcl9pZGAgaXNcbiAqIGRlbGliZXJhdGVseSBzdHJpcHBlZCBieSB0aGUgZ3Vlc3Qtc2FuaXRpc2F0aW9uIGJyYW5jaCBvZiBgY2FzZV9zbGFfZGVmYXVsdHNgXG4gKiBcdTIwMTQgaGFzIG5vd2hlcmUgdG8gc2l0IGFuZCBsYW5kcyB3aXRoIG5vYm9keSBhY2NvdW50YWJsZSBmb3IgaXQuXG4gKlxuICogVGhpcyBtb2R1bGUgc3Vic3RpdHV0ZXMgYSBsb2FkLWJhbGFuY2VkIHJvdW5kLXJvYmluIGZvciB0aGUgbWlzc2luZyBxdWV1ZSwgYXRcbiAqIHRoZSBhcHAgbGF5ZXIsIHRoZSBzYW1lIHdheSBgbGVhZF9hdXRvX2Fzc2lnbmAgKGBsZWFkLmhvb2sudHNgKSBkb2VzIGZvclxuICogaW5ib3VuZCBsZWFkcy4gKipXaGVuIGEgcGxhdGZvcm0gYHN5c19xdWV1ZWAgb3IgYXNzaWdubWVudC1ydWxlIGVuZ2luZSBsYW5kcyxcbiAqIHRoaXMgd2hvbGUgbW9kdWxlIGlzIHJlY2xhaW1lZCBcdTIwMTQgbm90IGFkYXB0ZWQuKiogSXRzIHJlcGxhY2VtZW50IGlzXG4gKiBkZWNsYXJhdGl2ZSBxdWV1ZSBtZXRhZGF0YTsgYSBob29rIHRoYXQgcGlja3MgYW4gb3duZXIgYnkgY291bnRpbmcgcm93cyBpcyBub3RcbiAqIHNvbWV0aGluZyB0byBrZWVwIGFsb25nc2lkZSBvbmUuIERlbGV0ZSB0aGUgbW9kdWxlLCBkZWxldGUgaXRzIGhvb2tzIGZyb21cbiAqIGBjYXNlLmhvb2sudHNgLCBhbmQgcmUtcG9pbnQgdGhlIHRyaWFnZSB2aWV3IGF0IHRoZSBxdWV1ZS5cbiAqXG4gKiBJdCBpcyBhIE1PRFVMRSByYXRoZXIgdGhhbiBhIGJyYW5jaCBpbiBgY2FzZS5ob29rLnRzYCBzbyB0aGF0IFwid2hvIHNob3VsZCBvd25cbiAqIHRoaXMgY2FzZVwiIGhhcyBPTkUgaG9tZTogYWxsIHRocmVlIGZhY3RvcmllcyBiZWxvdyByZWFkIGEgUE9TSVRJT04gUE9PTCBhbmRcbiAqIHBpY2sgaXRzIGxlYXN0LWxvYWRlZCBob2xkZXIsIGRpZmZlcmluZyBvbmx5IGluIHBvb2wsIHNlYW0gYW5kIHRyaWdnZXIuXG4gKlxuICogIyBcdTI2QTBcdUZFMEYgVGhlIEwyIHNhbmRib3ggY29uc3RyYWludCBcdTIwMTQgdGhlIHNoYXBlIGV2ZXJ5IGhhbmRsZXIgaGVyZSBtdXN0IHRha2VcbiAqXG4gKiBMMiBob29rIGJvZGllcyBydW4gQk9EWS1PTkxZIGluc2lkZSBRdWlja0pTOiB0aGUgaGFuZGxlciBpcyBsb3dlcmVkIHRvIGFcbiAqIHNvdXJjZSBzdHJpbmcgd2l0aCBubyBtb2R1bGUgc2NvcGUsIHNvIGEgYm9keSByZWZlcmVuY2luZyBhbiBpbXBvcnQsIGFcbiAqIHRvcC1sZXZlbCBjb25zdCBvciBhIGZhY3RvcnkgUEFSQU1FVEVSIGlzIGEgYFJlZmVyZW5jZUVycm9yYCBhdCBydW50aW1lLCBub3RcbiAqIGEgY2xvc3VyZS4gYHRlc3QvYWN0aW9uLXNhbmRib3gudGVzdC50c2AgbG93ZXJzIGV2ZXJ5IGhvb2sgaW4gYGFsbEhvb2tzYCB3aXRoXG4gKiB0aGUgQ0xJIGJ1aWxkJ3Mgb3duIGV4dHJhY3Rpb24gcGFzcyBhbmQgZmFpbHMgdGhlIG9uZXMgdGhhdCBsZWFrLlxuICpcbiAqIFNvIHNoYXJpbmcgaGVyZSBpcyBhdXRob3JpbmctdGltZSBzaGFyaW5nOiB0aGUgRkFDVE9SWSBjb21wb3NlcyB0aGUgaG9vayBhbmRcbiAqIG93bnMgdGhlIGRvYywgdGhlIGNvbnN0YW50cyBhbmQgdGhlIGNvbnRyYWN0OyB0aGUgaGFuZGxlciBib2R5IGNsb3NlcyBvdmVyXG4gKiBub3RoaW5nIGJ1dCBpdHMgb3duIGBjdHhgIGFuZCBzcGVsbHMgaXRzIGxpdGVyYWxzIElOTElORS4gVGhlIGR1cGxpY2F0aW9uIGlzXG4gKiBub3QgYWNjaWRlbnRhbCBcdTIwMTQgaXQgaXMgdGhlIG9ubHkgc2hhcGUgdGhlIHJ1bnRpbWUgYWNjZXB0cyBcdTIwMTQgYW5kIHdoYXQga2VlcHMgaXRcbiAqIGhvbmVzdCBpcyBhIGJlaGF2aW91cmFsIHBpbjogYHRlc3QvY2FzZS1hc3NpZ25tZW50LnRlc3QudHNgIGRyaXZlcyB0aGUgcmVhbFxuICogaGFuZGxlciBhbmQgYXNzZXJ0cyB0aGUgcG9vbCBpdCBxdWVyaWVzIGlzIGV4YWN0bHlcbiAqIHtAbGluayBTRVJWSUNFX0FHRU5UX1BPU0lUSU9OfSwgc28gY29uc3RhbnQgYW5kIGxpdGVyYWwgY2Fubm90IGRyaWZ0IHF1aWV0bHkuXG4gKlxuICogIyBcdTI2QTBcdUZFMEYgVGhlIG93bmVyc2hpcC10cmFuc2ZlciBnYXRlICgjMzAwNCksIGFuZCB0aGUgdGhyZWUgZG9vcnMgdGhyb3VnaCBpdFxuICpcbiAqIFN0YW1waW5nIGFub3RoZXIgdXNlcidzIGBvd25lcl9pZGAgaXMgYW4gb3duZXJzaGlwIFRSQU5TRkVSLCBkZW5pZWQgdW5sZXNzXG4gKiB0aGUgY2FsbGVyIGhvbGRzIGBhbGxvd1RyYW5zZmVyYCBvbiB0aGUgb2JqZWN0IChgQG9iamVjdHN0YWNrL3NwZWNgXG4gKiBgc2VjdXJpdHkvcGVybWlzc2lvbi56b2QudHNgKS4gYGNybV9jYXNlLmFsbG93VHJhbnNmZXJgIGlzIE5PVCBncmFudGVkIHRvXG4gKiBgc2VydmljZV9hZ2VudGAsIGFuZCBncmFudGluZyBpdCB3b3VsZCB3aWRlbiB3aGF0IGFuIGFnZW50IG1heSBkbyB0byBhIGNhc2VcbiAqIGdlbmVyYWxseSBcdTIwMTQgYSBwZXJtaXNzaW9uLW1vZGVsIGNoYW5nZSwgbm90IGEgaG9vayBjaGFuZ2UuXG4gKlxuICogVGhlIGdhdGUgaXMgYW4gb3BlcmF0aW9uIG1pZGRsZXdhcmUgd3JhcHBpbmcgdGhlIHdob2xlIGNhbGwsIHNvIHdoYXQgaXQgc2Vlc1xuICogZGVwZW5kcyBlbnRpcmVseSBvbiB0aGUgc2VhbSBhIHdyaXRlIHVzZXMuIE1lYXN1cmVkIGFnYWluc3QgdGhlIGZ1bGwgc2hpcHBlZFxuICogc3RhY2sgKE9iamVjdFFMICsgYHBsdWdpbi1zZWN1cml0eWAgKyBgcGx1Z2luLXNoYXJpbmdgIG92ZXIgdGhpcyBhcHAncyBvd25cbiAqIGBvYmplY3RzdGFjay5jb25maWcudHNgKSwgd2l0aCBuZWdhdGl2ZSBjb250cm9scyBwcm92aW5nIHRoZSBvYnNlcnZhdGlvbnMgYXJlXG4gKiBub3QgdmFjdW91cywgYW5kIHBpbm5lZCBpbiBgdGVzdC9jYXNlLWFzc2lnbm1lbnQudGVzdC50c2AgYW5kXG4gKiBgdGVzdC9vd25lcnNoaXAtbW9kZWwudGVzdC50c2A6XG4gKlxuICogICBcdTI0NjAgQSBgYmVmb3JlSW5zZXJ0YCAvIGBiZWZvcmVVcGRhdGVgIGhvb2sgU1RBTVBJTkcgYG93bmVyX2lkYCBvbnRvIGEgcGF5bG9hZFxuICogICAgICB0aGF0IGRpZCBub3QgY2FycnkgdGhlIGtleSBpcyBJTlZJU0lCTEUgdG8gdGhlIGdhdGUgXHUyMDE0IHRoZSBtaWRkbGV3YXJlXG4gKiAgICAgIG9ic2VydmVzIHRoZSBwYXlsb2FkIGFzIGF1dGhvcmVkLCBhbmQgdGhlIHN0b3JlZCByb3cgY2FycmllcyB0aGUgc3RhbXAuXG4gKiAgICAgIFRoaXMgaXMgdGhlIGRvb3IgYWxsIHRocmVlIGZhY3RvcmllcyBoZXJlIHVzZSwgYW5kIGl0IGlzIHdoeSBub25lIG9mXG4gKiAgICAgIHRoZW0gbmVlZHMgYSBwZXJtaXNzaW9uIGdyYW50LlxuICogICBcdTI0NjEgQSBob29rJ3MgYGN0eC5hcGlgIFdSSVRFIGlzIGEgZnJlc2ggb3BlcmF0aW9uIGNhcnJ5aW5nIHRoZSBjYWxsZXInc1xuICogICAgICBpZGVudGl0eSwgc28gdGhlIGdhdGUgRE9FUyBzZWUgaXQuIFRoYXQgaXMgd2h5IGBjYXNlX3N0YXR1c19zaWRlX2VmZmVjdHNgXG4gKiAgICAgIG9wZW5pbmcgYW4gZXNjYWxhdGlvbiB0YXNrIHVuZGVyIHRoZSBhY2NvdW50IG93bmVyIG5lZWRzXG4gKiAgICAgIGBzZXJ2aWNlX2FnZW50LmNybV90YXNrLmFsbG93VHJhbnNmZXJgLlxuICogICBcdTI0NjIgQSBjYWxsZXItc3VwcGxpZWQgYG93bmVyX2lkYCBpcyByZWZ1c2VkIElOU0lERSB0aGUgbWlkZGxld2FyZSwgdXBzdHJlYW1cbiAqICAgICAgb2YgdGhlIGhvb2sgcGhhc2UgXHUyMDE0IHRoZSBob29rIG5ldmVyIGZpcmVzIGF0IGFsbC4gTm8gaG9vayBjYW4gYXBwcm92ZSxcbiAqICAgICAgbGF1bmRlciBvciBhZGp1ZGljYXRlIGEgcGF5bG9hZCB0aGF0IGNhcnJpZXMgdGhlIGtleS5cbiAqXG4gKiBcdTIxRDIgXCJBbiBhZ2VudCBtYXkgc2V0IGBvd25lcl9pZGAgdG8gdGhlbXNlbHZlc1wiIGlzIG5vdCBpbXBsZW1lbnRhYmxlIGFzIGFuXG4gKiBhZGp1ZGljYXRlZCB3cml0ZS4gSXQgSVMgaW1wbGVtZW50YWJsZSBvbmUgbGV2ZWwgdXAsIGFzIGEgR0VTVFVSRSB0aGUgaG9va1xuICogaW50ZXJwcmV0czoge0BsaW5rIGNyZWF0ZUNhc2VTZWxmQ2xhaW19LlxuICpcbiAqIFx1MjZBMFx1RkUwRiBJZiBhIHBsYXRmb3JtIHJlbGVhc2UgbW92ZXMgdGhlIGdhdGUgZG93bnN0cmVhbSBvZiB0aGUgaG9vayBwaGFzZSwgZG9vciBcdTI0NjBcbiAqIGZsaXBzIGFuZCB0aG9zZSB0ZXN0cyBnbyByZWQuIFRoZSBzaWduYWwgaXMgdGhlbiB0byBncmFudCBgYWxsb3dUcmFuc2ZlcmBcbiAqIGRlbGliZXJhdGVseSBvciB0byBzdG9wIGFzc2lnbmluZyBpbiBhIGhvb2sgXHUyMDE0IE5PVCB0byB3aWRlbiB0aGUgcGVybWlzc2lvblxuICogbW9kZWwgdG8gbWFrZSBhIHJlZCB0ZXN0IGdyZWVuLlxuICovXG5cbi8qKiBUaGUgcG9zaXRpb24gd2hvc2UgaG9sZGVycyBmb3JtIHRoZSBjYXNlIGludGFrZSBwb29sIChgc3lzX3VzZXJfcG9zaXRpb25gKS4gKi9cbmV4cG9ydCBjb25zdCBTRVJWSUNFX0FHRU5UX1BPU0lUSU9OID0gJ3NlcnZpY2VfYWdlbnQnO1xuXG4vKiogVGhlIHBvc2l0aW9uIEVTQ0FMQVRFRCBjYXNlcyBhcmUgcm91dGVkIHRvLiAqL1xuZXhwb3J0IGNvbnN0IFNFUlZJQ0VfTUFOQUdFUl9QT1NJVElPTiA9ICdzZXJ2aWNlX21hbmFnZXInO1xuXG4vKipcbiAqIFN0YXR1c2VzIHRoYXQgbWVhbiBcInRoaXMgY2FzZSBpcyBubyBsb25nZXIgbGl2ZSB3b3JrXCIuXG4gKlxuICogTG9hZCBiYWxhbmNpbmcgY291bnRzIE9QRU4gY2FzZXMsIGFuZCBgaXNfY2xvc2VkYCBpcyB0aGUgd3JvbmcgcHJlZGljYXRlOlxuICogaXQgb25seSBmbGlwcyBvbiBgY2xvc2VkYCwgc28gYSBwaWxlIG9mIGByZXNvbHZlZGAgY2FzZXMgd291bGQga2VlcCBjb3VudGluZ1xuICogYWdhaW5zdCBhbiBhZ2VudCB3aG8gaGFzIGFscmVhZHkgZmluaXNoZWQgdGhlbS4gYGNhc2Vfc2xhX21vbml0b3JgIHNldHRsZXMgaXRcbiAqIHRoZSBzYW1lIHdheSBcdTIwMTQgc2VlIHRoZSBgJG5pbmAgbm90ZSBpbiBgc3JjL3NlcnZpY2UvZmxvd3MvY2FzZS1zbGEtbW9uaXRvci5mbG93LnRzYCxcbiAqIHdoaWNoIGFsc28gcmVjb3JkcyB0aGF0IGNvbXBhcmluZyB0aGUgYm9vbGVhbiBgaXNfY2xvc2VkYCB3YWxrcyBpbnRvIHRoZVxuICogU1FMaXRlIGAxICE9IHRydWVgIHRyYXAuXG4gKi9cbmV4cG9ydCBjb25zdCBDTE9TRURfQ0FTRV9TVEFUVVNFUyA9IFsncmVzb2x2ZWQnLCAnY2xvc2VkJ10gYXMgY29uc3Q7XG5cbi8qKiBDYXAgb24gdGhlIHBvb2wgcmVhZCBcdTIwMTQgdGhlIHNhbWUgYm91bmQgYGxlYWRfYXV0b19hc3NpZ25gIHVzZXMuICovXG5leHBvcnQgY29uc3QgUE9PTF9RVUVSWV9MSU1JVCA9IDEwMDA7XG5cbi8qKlxuICogVGhlIHN0YXR1c2VzIHRoYXQgbWVhbiBcImEgaHVtYW4gaGFzIHBpY2tlZCB0aGlzIGNhc2UgdXAgYW5kIGl0IGlzIG5vdFxuICogZmluaXNoZWRcIiBcdTIwMTQgdGhlIGdlc3R1cmUge0BsaW5rIGNyZWF0ZUNhc2VTZWxmQ2xhaW19IHJlYWRzIGFzIGEgY2xhaW0uXG4gKlxuICogT25lIGNvbmNlcHQsIG5vdCB0aHJlZSBhcmJpdHJhcnkgcGlja3M6IGVhY2ggc2F5cyBhIHBlcnNvbiBpcyBlbmdhZ2VkIGFuZCB0aGVcbiAqIHdvcmsgaXMgc3RpbGwgbGl2ZS4gVGhlIGZvdXIgc3RhdHVzZXMgTk9UIGhlcmUgYXJlIGV4Y2x1ZGVkIGZvciBhIHJlYXNvblxuICogYXBpZWNlOlxuICpcbiAqICAgLSBgbmV3YCBcdTIwMTQgdGhlIHN0YXRlIGEgdHJpYWdlIHJvdyBpcyBhbHJlYWR5IElOLiBOb3QgYSBtb3ZlLCBzbyBub3QgYSBjbGFpbS5cbiAqICAgLSBgZXNjYWxhdGVkYCBcdTIwMTQge0BsaW5rIGNyZWF0ZUNhc2VFc2NhbGF0aW9uUmVhc3NpZ259IG93bnMgdGhhdCB0cmFuc2l0aW9uXG4gKiAgICAgYW5kIHJvdXRlcyB0byB0aGUgYHNlcnZpY2VfbWFuYWdlcmAgcG9vbC4gVHdvIGhvb2tzIGFuc3dlcmluZyBcIndobyBvd25zXG4gKiAgICAgdGhpcyBjYXNlXCIgZm9yIG9uZSBzdGF0dXMgY2hhbmdlIGlzIHRoZSBcIm9uZSBvcGVyYXRpb24sIHR3b1xuICogICAgIGltcGxlbWVudGF0aW9uc1wiIHNoYXBlIHRoaXMgbW9kdWxlIGV4aXN0cyB0byBwcmV2ZW50LlxuICogICAtIGByZXNvbHZlZGAgLyBgY2xvc2VkYCBcdTIwMTQgZmluaXNoaW5nIGEgY2FzZSBpcyBub3QgcGlja2luZyBpdCB1cC4gQW4gYWdlbnRcbiAqICAgICBtYXkgc3RpbGwgcmVzb2x2ZSBhbiB1bm93bmVkIGNhc2Ugc3RyYWlnaHQgb3V0IG9mIHRyaWFnZSAodGhlIHNoYXJlXG4gKiAgICAgZ3JhbnRzIGVkaXQpOyB0aGF0IHJlY29yZHMgdGhlbSBpbiBgdXBkYXRlZF9ieWAgYW5kIGxlYXZlcyB0aGUgb3duZXJzaGlwXG4gKiAgICAgY29sdW1uIGhvbmVzdCBhYm91dCB0aGUgZmFjdCB0aGF0IG5vYm9keSBldmVyIHRvb2sgdGhlIHdvcmsuXG4gKlxuICogXHUyNkEwXHVGRTBGIERlY2xhcmVkIGhlcmUgZm9yIHRoZSBkb2MgYW5kIHRoZSB0ZXN0cyBcdTIwMTQgdGhlIGhhbmRsZXIgYm9keSBzcGVsbHMgdGhlIHNhbWVcbiAqIHRocmVlIHN0cmluZ3MgSU5MSU5FLCBiZWNhdXNlIHRoZSBMMiBzYW5kYm94IGdpdmVzIGl0IG5vIG1vZHVsZSBzY29wZSAoc2VlXG4gKiB0aGlzIGZpbGUncyBoZWFkZXIpLiBgdGVzdC91bmFzc2lnbmVkLWNhc2UtdHJpYWdlLXJlYWNoLnRlc3QudHNgIGRyaXZlcyBldmVyeVxuICogb25lIG9mIHRoZW0gdGhyb3VnaCB0aGUgcmVhbCBlbmdpbmUsIHNvIHRoZSBjb3BpZXMgY2Fubm90IGRyaWZ0LlxuICovXG5leHBvcnQgY29uc3QgQ0xBSU1BQkxFX1RBUkdFVF9TVEFUVVNFUyA9IFtcbiAgJ2luX3Byb2dyZXNzJyxcbiAgJ3dhaXRpbmdfY3VzdG9tZXInLFxuICAnd2FpdGluZ19zdXBwb3J0Jyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogUm91bmQtcm9iaW4gYXNzaWdubWVudCBmb3Igb3duZXJsZXNzIG5ldyBjYXNlcy5cbiAqXG4gKiBBIGNhc2UgY3JlYXRlZCB3aXRob3V0IGFuIG93bmVyIFx1MjAxNCBhIHdlYi10by1jYXNlIHN1Ym1pc3Npb24sIGFuIGVtYWlsLXRvLWNhc2VcbiAqIGltcG9ydCwgYW4gQVBJIGNhcHR1cmUgXHUyMDE0IGlzIGFzc2lnbmVkIHRvIHRoZSBzZXJ2aWNlIGFnZW50IHdpdGggdGhlIEZFV0VTVFxuICogT1BFTiBjYXNlcy4gTGVhc3QtbG9hZGVkIGlzIGEgc2VsZi1iYWxhbmNpbmcgcm91bmQtcm9iaW46IG5vIHJvdGF0aW9uXG4gKiBjb3VudGVyLCBubyBzdG9yZWQgY3Vyc29yLCBubyBjb29yZGluYXRpb24gYmV0d2VlbiBjb25jdXJyZW50IGluc2VydHMuIEl0XG4gKiB3cml0ZXMgYG93bmVyX2lkYCwgdGhlIHBsYXRmb3JtIG93bmVyc2hpcCBhbmNob3IgdGhhdCBPV0QsIHNoYXJpbmcgcnVsZXMgYW5kXG4gKiB0aGUgXCJNeSBPcGVuIENhc2VzXCIgdmlldyBhbGwgcmVhZCwgc28gdGhlIGFnZW50IHJlYWxseSBvd25zIHRoZSBjYXNlIHJhdGhlclxuICogdGhhbiBtZXJlbHkgYmVpbmcgbmFtZWQgb24gaXQuXG4gKlxuICogIyMgUHJpb3JpdHkgMjUwOiBpdCBNVVNUIHJ1biBhZnRlciBgY2FzZV9zbGFfZGVmYXVsdHNgICgyMDApXG4gKlxuICogSG9va3MgcnVuIGluIEFTQ0VORElORyBwcmlvcml0eSBvcmRlciwgYW5kIGBjYXNlX3NsYV9kZWZhdWx0c2AgaXMgd2hlcmUgdGhlXG4gKiBndWVzdC1zYW5pdGlzYXRpb24gYnJhbmNoIGFzc2lnbnMgYGlucHV0Lm93bmVyX2lkID0gbnVsbGAgdG8gZHJvcCBhXG4gKiBjbGllbnQtc3Bvb2ZlZCBvd25lciBmcm9tIGFuIGFub255bW91cyBzdWJtaXNzaW9uLiBBc3NpZ25pbmcgZmlyc3QgYW5kIGJlaW5nXG4gKiBzdHJpcHBlZCBhZnRlcndhcmRzIHdvdWxkIGxhbmQgZXZlcnkgd2ViLXRvLWNhc2Ugb3duZXJsZXNzIFx1MjAxNCB0aGUgZXhhY3QgY2FzZVxuICogdGhpcyBob29rIGV4aXN0cyBmb3IuIGB0ZXN0L2Nhc2UtYXNzaWdubWVudC50ZXN0LnRzYCBwaW5zIHRoZSBvcmRlcmluZy5cbiAqXG4gKiAjIyBUaGUgZW1wdHkgcG9vbCBpcyB0aGUgRklSU1QtSU5TVEFMTCBOT1JNLCBub3QgYW4gZWRnZSBjYXNlXG4gKlxuICogYHN5c191c2VyX3Bvc2l0aW9uYCBtZW1iZXJzaGlwIGlzIHJ1bnRpbWUgZGF0YS4gQmVmb3JlIGFueW9uZSBob2xkcyB0aGVcbiAqIGBzZXJ2aWNlX2FnZW50YCBwb3NpdGlvbiB0aGUgcG9vbCBpcyBlbXB0eSBhbmQgdGhpcyBob29rIGlzIGEgTk8tT1A6IHRoZSBjYXNlXG4gKiBpcyBjcmVhdGVkIGFuZCBzdGF5cyBvd25lcmxlc3MuIE5ldmVyIGJsb2NraW5nIGludGFrZSBpcyBjb3JyZWN0LCBidXQgc2lsZW50XG4gKiBvd25lcmxlc3NuZXNzIGhpZGVzIHRoZSBwcm9ibGVtLCBzbyB0aGUgbm8tb3AgcGF0aCBoYXMgYSBVSSBjb3VudGVycGFydCBcdTIwMTQgdGhlXG4gKiBgdW5hc3NpZ25lZF90cmlhZ2VgIHBpbm5lZCB0YWIgb24gYGNybV9jYXNlYCAoYHNyYy9zZXJ2aWNlL3ZpZXdzL2Nhc2Uudmlldy50c2ApIHNob3dzXG4gKiBleGFjdGx5IHRoZSBjYXNlcyB0aGlzIGhvb2sgY291bGQgbm90IHBsYWNlLlxuICpcbiAqICMjIEJlc3QtZWZmb3J0LCBhbHdheXNcbiAqXG4gKiBBdXRvLWFzc2lnbm1lbnQgaXMgYW4gRU5IQU5DRU1FTlQgYW5kIG11c3QgbmV2ZXIgcmVqZWN0IHRoZSBpbnNlcnQuIEFuXG4gKiBhbm9ueW1vdXMgV2ViLXRvLUNhc2Ugc3VibWlzc2lvbiBydW5zIHVuZGVyIHRoZSBwdWJsaWMtZm9ybSBncmFudCwgd2hpY2hcbiAqIHBlcm1pdHMgY3JlYXRlL3JlYWQtYmFjayBvbiBgY3JtX2Nhc2VgIGFuZCBERU5JRVMgYGZpbmRgIG9uXG4gKiBgc3lzX3VzZXJfcG9zaXRpb25gOyBsZXR0aW5nIHRoYXQgZGVuaWFsIHByb3BhZ2F0ZSB3b3VsZCA0MDMgdGhlIHdob2xlXG4gKiBzdWJtaXNzaW9uIGFuZCBicmVhayB0aGUgcHVibGljIHN1cHBvcnQgZm9ybS4gU28gZXZlcnkgcmVhZCBpcyB3cmFwcGVkIGFuZFxuICogQU5ZIGZhaWx1cmUgbGVhdmVzIHRoZSBjYXNlIG93bmVybGVzcyBmb3IgdGhlIHRyaWFnZSB2aWV3IHRvIHN1cmZhY2UuXG4gKlxuICogQHBhcmFtIGhvb2tOYW1lIHJlZ2lzdHJ5IG5hbWUgZm9yIHRoZSBob29rIChtZXRhZGF0YSBvbmx5IFx1MjAxNCBuZXZlciByZWFkIGJ5XG4gKiAgIHRoZSBib2R5LCB3aGljaCB0aGUgc2FuZGJveCB3b3VsZCBub3QgbGV0IGl0IGJlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNhc2VSb3VuZFJvYmluQXNzaWduKGhvb2tOYW1lID0gJ2Nhc2VfYXV0b19hc3NpZ24nKTogSG9vayB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogaG9va05hbWUsXG4gICAgb2JqZWN0OiAnY3JtX2Nhc2UnLFxuICAgIGV2ZW50czogWydiZWZvcmVJbnNlcnQnXSxcbiAgICBwcmlvcml0eTogMjUwLFxuICAgIGRlc2NyaXB0aW9uOiAnQXNzaWduIG93bmVybGVzcyBuZXcgY2FzZXMgdG8gdGhlIGxlYXN0LWxvYWRlZCBzZXJ2aWNlIGFnZW50LicsXG4gICAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICAgIC8vIFJlc3BlY3QgYW4gZXhwbGljaXQgLyBjcmVhdG9yLWFzc2lnbmVkIG93bmVyLiBPbiBhbnkgd3JpdGUgdGhhdCBjYXJyaWVzXG4gICAgICAvLyBhIHVzZXIgdGhlIHNlY3VyaXR5IG1pZGRsZXdhcmUgaGFzIEFMUkVBRFkgc3RhbXBlZCBgb3duZXJfaWRgIHRvIHRoYXRcbiAgICAgIC8vIHVzZXIgYnkgdGhlIHRpbWUgdGhpcyBydW5zLCBzbyB0aGlzIGlzIGFsc28gd2hhdCBrZWVwcyB0aGUgcm91bmQtcm9iaW5cbiAgICAgIC8vIHNjb3BlZCB0byBnZW51aW5lbHkgb3duZXJsZXNzIGludGFrZSByYXRoZXIgdGhhbiBmaXJpbmcgb24gZXZlcnlcbiAgICAgIC8vIGFnZW50LWNyZWF0ZWQgY2FzZS5cbiAgICAgIGlmICh0eXBlb2YgaW5wdXQub3duZXJfaWQgPT09ICdzdHJpbmcnICYmIGlucHV0Lm93bmVyX2lkKSByZXR1cm47XG4gICAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWFwaSkgcmV0dXJuO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGUgcG9vbCA9IGhvbGRlcnMgb2YgdGhlIGBzZXJ2aWNlX2FnZW50YCBwb3NpdGlvbi4gVGhpcyBsaXRlcmFsIGlzXG4gICAgICAgIC8vIHRoZSBleHBvcnRlZCBTRVJWSUNFX0FHRU5UX1BPU0lUSU9OOyB0aGUgc2FuZGJveCBmb3JiaWRzIHJlYWRpbmcgdGhlXG4gICAgICAgIC8vIGNvbnN0YW50IGhlcmUsIGFuZCBgdGVzdC9jYXNlLWFzc2lnbm1lbnQudGVzdC50c2AgcGlucyB0aGUgcGFyaXR5LlxuICAgICAgICBjb25zdCBob2xkZXJzID0gYXdhaXQgYXBpLm9iamVjdCgnc3lzX3VzZXJfcG9zaXRpb24nKS5maW5kKHtcbiAgICAgICAgICB3aGVyZTogeyBwb3NpdGlvbjogJ3NlcnZpY2VfYWdlbnQnIH0sIGZpZWxkczogWyd1c2VyX2lkJ10sIHRvcDogMTAwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGFnZW50SWRzID0gQXJyYXkuZnJvbShcbiAgICAgICAgICBuZXcgU2V0KFxuICAgICAgICAgICAgKGhvbGRlcnMgPz8gW10pXG4gICAgICAgICAgICAgIC5tYXAoKHIpID0+ICh0eXBlb2Ygci51c2VyX2lkID09PSAnc3RyaW5nJyA/IHIudXNlcl9pZCA6ICcnKSlcbiAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICAvLyBObyBwb29sIFx1MjE5MiBsZWF2ZSB0aGUgY2FzZSBvd25lcmxlc3MgKG5vLW9wKS4gVGhlIGB1bmFzc2lnbmVkX3RyaWFnZWBcbiAgICAgICAgLy8gdmlldyBpcyB3aGF0IG1ha2VzIHRoaXMgdmlzaWJsZSBpbnN0ZWFkIG9mIHNpbGVudC5cbiAgICAgICAgaWYgKGFnZW50SWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIEZld2VzdCBPUEVOIGNhc2VzIHdpbnMuIGAkbmluYCBvdmVyIHN0YXR1c2VzIHJhdGhlciB0aGFuXG4gICAgICAgIC8vIGBpc19jbG9zZWQ6IGZhbHNlYDogYSByZXNvbHZlZCBjYXNlIGlzIGZpbmlzaGVkIHdvcmsgYW5kIG11c3Qgc3RvcFxuICAgICAgICAvLyBjb3VudGluZyBhZ2FpbnN0IGl0cyBhZ2VudCAoc2FtZSBwcmVkaWNhdGUgYXMgYGNhc2Vfc2xhX21vbml0b3JgKS5cbiAgICAgICAgbGV0IGJlc3Q6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGJlc3RDb3VudCA9IEluZmluaXR5O1xuICAgICAgICBmb3IgKGNvbnN0IGFnZW50SWQgb2YgYWdlbnRJZHMpIHtcbiAgICAgICAgICBjb25zdCBvcGVuQ291bnQgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fY2FzZScpLmNvdW50KHtcbiAgICAgICAgICAgIHdoZXJlOiB7IG93bmVyX2lkOiBhZ2VudElkLCBzdGF0dXM6IHsgJG5pbjogWydyZXNvbHZlZCcsICdjbG9zZWQnXSB9IH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKG9wZW5Db3VudCA8IGJlc3RDb3VudCkge1xuICAgICAgICAgICAgYmVzdENvdW50ID0gb3BlbkNvdW50O1xuICAgICAgICAgICAgYmVzdCA9IGFnZW50SWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChiZXN0KSBpbnB1dC5vd25lcl9pZCA9IGJlc3Q7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gU3dhbGxvdzogYXNzaWdubWVudCBtdXN0IG5ldmVyIGJsb2NrIGNhc2UgY3JlYXRpb24uIFRoZSBjb21tb24gY2FzZVxuICAgICAgICAvLyBpcyB0aGUgYW5vbnltb3VzIHB1YmxpYy1mb3JtIGNvbnRleHQsIHdoaWNoIGNhbm5vdCByZWFkXG4gICAgICAgIC8vIGBzeXNfdXNlcl9wb3NpdGlvbmAgXHUyMDE0IHRoZSBjYXNlIGlzIHN0aWxsIGNhcHR1cmVkLCBvd25lcmxlc3MsIGFuZCB0aGVcbiAgICAgICAgLy8gdHJpYWdlIHZpZXcgc3VyZmFjZXMgaXQuIChObyBgY29uc29sZWAgaGVyZSBcdTIwMTQgdGhlIEwyIGhvb2sgc2FuZGJveFxuICAgICAgICAvLyBkb2VzIG5vdCBkZWZpbmUgb25lLilcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEhhbmQgYW4gZXNjYWxhdGluZyBjYXNlIHRvIHRoZSBsZWFzdC1sb2FkZWQgc2VydmljZSBtYW5hZ2VyLlxuICpcbiAqIE9uIHRoZSBlc2NhbGF0aW9uIFRSQU5TSVRJT04gdGhlIGNhc2UgbW92ZXMgdG8gdGhlIGhvbGRlciBvZlxuICoge0BsaW5rIFNFUlZJQ0VfTUFOQUdFUl9QT1NJVElPTn0gd2l0aCB0aGUgZmV3ZXN0IG9wZW4gY2FzZXMgXHUyMDE0IHRoZSBzYW1lXG4gKiBsZWFzdC1sb2FkZWQgYmFsYW5jZSB0aGUgaW50YWtlIHJvdW5kLXJvYmluIGNvbXB1dGVzLCBhZ2FpbnN0IGEgZGlmZmVyZW50XG4gKiBwb29sLiBXaXRob3V0IGl0LCBlc2NhbGF0aW9uIGlzIG9ubHkgYSBmbGFnLCBhIHN0YXR1cyBhbmQgYW4gaW5ib3ggbWVzc2FnZTpcbiAqIHRoZSBhZ2VudCB3aG8gY291bGQgbm90IGdldCB0byB0aGUgY2FzZSBpbiB0aW1lIHN0YXlzIHRoZSBvbmx5IHBlcnNvbiB3aG8gY2FuXG4gKiB3b3JrIGl0LlxuICpcbiAqIFx1MjZBMFx1RkUwRiBQb3NpdGlvbnMgYXJlIEZMQVQgKGBzcmMvc2FsZXMvc2hhcmluZy9wb3NpdGlvbnMudHNgKSwgc28gXCJ0aGUgb3duZXIncyBtYW5hZ2VyXCJcbiAqIGlzIG5vdCByZXNvbHZhYmxlIGluIHRoaXMgYXBwIFx1MjAxNCBhbmQgYSBmbG93IHRlbXBsYXRlIHJlZmVyZW5jaW5nIGEgbG9va3VwXG4gKiB0cmF2ZXJzYWwgc3VjaCBhcyBge2Nhc2VSZWNvcmQub3duZXJfaWQubWFuYWdlcn1gIGludGVycG9sYXRlcyB0byB0aGUgbGl0ZXJhbFxuICogc3RyaW5nIGB1bmRlZmluZWRgIHJhdGhlciB0aGFuIGZhaWxpbmcuIFRoYXQgaXMgd2h5IHRoZSBoYW5kLW9mZiBpcyBhIGhvb2tcbiAqIGFuZCBub3QgYSBmbG93LCBhbmQgd2h5IHRoZSBwb29sIHN1YnN0aXR1dGVzIGZvciB0aGUgY2hhaW4uXG4gKlxuICogIyMgYGJlZm9yZVVwZGF0ZWAsIG5vdCBgYWZ0ZXJVcGRhdGVgXG4gKlxuICogVGhlIGBhZnRlclVwZGF0ZWAgc2hhcGUgKGEgYGN0eC5hcGlgIHdyaXRlKSBpcyBhIGZyZXNoIG9wZXJhdGlvbiBhbmQgaXNcbiAqIHRoZXJlZm9yZSBWSVNJQkxFIHRvIHRoZSB0cmFuc2ZlciBnYXRlIFx1MjAxNCBpdCB3b3VsZCBuZWVkIGBjcm1fY2FzZS5hbGxvd1RyYW5zZmVyYFxuICogb24gYHNlcnZpY2VfYWdlbnRgLCB3aWRlbmluZyB3aGF0IGFuIGFnZW50IG1heSBkbyB0byBhIGNhc2UgZ2VuZXJhbGx5LiBUaGVcbiAqIGBiZWZvcmVVcGRhdGVgIGRvb3IgaXMgaW52aXNpYmxlIHRvIHRoZSBnYXRlICh0aGlzIG1vZHVsZSdzIGhlYWRlciwgZG9vciBcdTI0NjApLFxuICogc28gdGhlIGhhbmQtb2ZmIGNvc3RzIG5vIHBlcm1pc3Npb24gY2hhbmdlLlxuICpcbiAqIEl0IGFsc28gZGlzcG9zZXMgb2YgcmUtZW50cmFuY3kgcmF0aGVyIHRoYW4gZ3VhcmRpbmcgaXQ6IHRoZSBob29rIHBlcmZvcm1zIE5PXG4gKiBvcGVyYXRpb24sIG11dGF0aW5nIHRoZSBwYXlsb2FkIG9mIHRoZSB1cGRhdGUgYWxyZWFkeSBpbiBmbGlnaHQsIHNvIHRoZXJlIGlzXG4gKiBubyBzZWNvbmQgd3JpdGUgYW5kIG5vIHNlY29uZCBgcmVjb3JkLWFmdGVyLXVwZGF0ZWAgZXZlbnQgZm9yXG4gKiBgY2FzZV9lc2NhbGF0aW9uYCBvciBgY2FzZV9zdGF0dXNfc2lkZV9lZmZlY3RzYCB0byBmaXJlIG9uLiBUaGUgcHJlZGljYXRlIGlzXG4gKiBhIFRSQU5TSVRJT04gcmF0aGVyIHRoYW4gYSBzdGF0ZSwgc28gaXQgaXMgZmFsc2Ugb24gYSByZXBsYXksIGFuZCB0aGUgd3JpdGVcbiAqIGlzIGlkZW1wb3RlbnQgXHUyMDE0IGEgY2FzZSBhbHJlYWR5IG93bmVkIGJ5IGEgcG9vbCBtZW1iZXIgaXMgbGVmdCBhbG9uZS5cbiAqIGB0ZXN0L2Nhc2UtYXNzaWdubWVudC50ZXN0LnRzYCBkcml2ZXMgYWxsIHRocmVlIHByb3BlcnRpZXMuXG4gKlxuICogIyMgVGhlIFNMQSBzd2VlcCByZWFjaGVzIHRoaXMgaG9vaywgYW5kIGRlcGVuZHMgb24gaXQgKCMxNDA1KVxuICpcbiAqIGBjYXNlX3NsYV9tb25pdG9yYCdzIGBmbGFnX2JyZWFjaGAgbm9kZSB3cml0ZXMgYHN0YXR1czogJ2VzY2FsYXRlZCdgIG9uIGV2ZXJ5XG4gKiBicmVhY2hlZCBjYXNlLCB3aGljaCBJUyB0aGUgdHJhbnNpdGlvbiBiZWxvdyBcdTIwMTQgc28gdGhlIHNjaGVkdWxlZCBzd2VlcCBwdXRzIGFuXG4gKiBvd25lcmxlc3MgYnJlYWNoZWQgY2FzZSB0aHJvdWdoIHRoaXMgYXNzaWdubWVudCB3aXRob3V0IGFueSBmbG93LWNhbGxhYmxlXG4gKiBzZWFtLCBhbmQgdGhlIGZsb3cgdGhlbiByZS1yZWFkcyB0aGUgY2FzZSAoYHJlbG9hZF9jYXNlYCkgdG8gYWxlcnQgdGhlIG93bmVyXG4gKiB0aGlzIGhvb2sgcHJvZHVjZWQuIFx1MjZBMFx1RkUwRiBUaGF0IG1ha2VzIHRoZSBUUkFOU0lUSU9OIHByZWRpY2F0ZSBsb2FkLWJlYXJpbmcgZm9yIGFcbiAqIHNlY29uZCBjYWxsZXI6IG5hcnJvd2luZyBpdCB0byByZWNvcmQtdHJpZ2dlcmVkIGVzY2FsYXRpb25zLCBvciBtb3ZpbmcgdGhlXG4gKiBhc3NpZ25tZW50IHRvIGFuIGBhZnRlclVwZGF0ZWAgd3JpdGUsIHNpbGVudGx5IHJldHVybnMgdGhlIHN3ZWVwIHRvIGFsZXJ0aW5nXG4gKiBub2JvZHkgZm9yIGFuIHVub3duZWQgYnJlYWNoLiBgdGVzdC9mbG93LXNsYS1vd25lcmxlc3MtYXNzaWdubWVudC50ZXN0LnRzYFxuICogZHJpdmVzIHRoZSByZWFsIGZsb3cgdGhyb3VnaCB0aGUgcmVhbCBob29rIGNoYWluIGFuZCBnb2VzIHJlZCBpZiBpdCBkb2VzLlxuICpcbiAqICMjIFRoZSBlbXB0eSBwb29sOiBhIG5vLW9wIHRoYXQgaXMgc3RpbGwgVklTSUJMRVxuICpcbiAqIGBzeXNfdXNlcl9wb3NpdGlvbmAgbWVtYmVyc2hpcCBpcyBydW50aW1lIGRhdGEsIGFuZCBgc2VydmljZV9tYW5hZ2VyYCBpc1xuICogdW5zdGFmZmVkIG9uIGEgZnJlc2ggaW5zdGFsbC4gXHUyNkEwXHVGRTBGIFRoZSBkZW1vIG9yZyBpcyBOTyBMT05HRVIgb25lIG9mIHRob3NlOiAjMTEwMlxuICogc3RhZmZzIFRvbWFzIE9rYWZvciBpbnRvIHRoZSBwb3NpdGlvbiAoYHNyYy9zYWxlcy9zaGFyaW5nL2RlbW8tc3RhZmZpbmcudHNgKSwgc28gdGhlXG4gKiBleGVtcGxhciBub3cgZGVtb25zdHJhdGVzIHRoZSBoYW5kLW9mZiByYXRoZXIgdGhhbiB0aGUgc3RhbmQtZG93biBcdTIwMTQgd2hpY2ggaXNcbiAqIGFsc28gd2hhdCBtYWtlcyB0aGUgc3dlZXAncyBhc3NpZ25tZW50IHZpc2libGUgb24gdGhpcyByZXBvJ3Mgb3duIHNlZWQuXG4gKlxuICogV2l0aCBubyBwb29sIHRoZSBjYXNlIGtlZXBzXG4gKiBpdHMgb3duZXIgYW5kIHRoZSBlc2NhbGF0aW9uIGNvbXBsZXRlcyBhcyBiZWZvcmUuIFVubGlrZSB0aGUgaW50YWtlIHBhdGggdGhhdFxuICogbmVlZHMgbm8gbmV3IHN1cmZhY2UgdG8gc3RheSB2aXNpYmxlOiBhbiBlc2NhbGF0ZWQgY2FzZSBpcyBub3Qgb3duZXJsZXNzLCBpdFxuICogc2l0cyBpbiB0aGUgYGVzY2FsYXRlZF9jYXNlc2AgdmlldywgYW5kIGBjYXNlX2VzY2FsYXRpb25fc2hhcmluZ2AgYWxyZWFkeVxuICogZ3JhbnRzIGV2ZXJ5IGBzZXJ2aWNlX21hbmFnZXJgIGVkaXQgYWNjZXNzIHRvIG9wZW4gY3JpdGljYWwgY2FzZXMuXG4gKlxuICogIyMgQmVzdC1lZmZvcnQsIGFsd2F5c1xuICpcbiAqIFJlYXNzaWdubWVudCBpcyBhbiBFTkhBTkNFTUVOVCB0byB0aGUgZXNjYWxhdGlvbiwgbmV2ZXIgYSBwcmVjb25kaXRpb24uIEFcbiAqIHJlYWQgZGVuaWFsLCBhbiBlbXB0eSBwb29sIG9yIGFueSBvdGhlciBmYWlsdXJlIGxlYXZlcyB0aGUgY2FzZSB3aXRoIGl0c1xuICogY3VycmVudCBvd25lciBhbmQgbGV0cyB0aGUgZXNjYWxhdGlvbiB3cml0ZSB0aHJvdWdoIHVudG91Y2hlZC5cbiAqXG4gKiAjIyBgcnVuQXM6ICdzeXN0ZW0nYCAoIzIwMTQpLCBhbmQgdGhlIG9yZ2FuaXphdGlvbiBwaW5cbiAqXG4gKiBUaGUgcG9vbCBpcyBgc3lzX3VzZXJfcG9zaXRpb25gLCB3aGljaCBhIHNlcnZpY2UgYWdlbnQgbWF5IG5vdCByZWFkIFx1MjAxNCBzbyBhblxuICogYWdlbnQgZXNjYWxhdGluZyB0aGVpciBvd24gY2FzZSAodGhlIHJlY29yZCBmb3JtLCBvciB0aGUgYGVzY2FsYXRlX2Nhc2VgXG4gKiBhY3Rpb24sIHdob3NlIGBlc2NhbGF0ZWAgbm9kZSBkZWxpYmVyYXRlbHkga2VlcHMgdGhlIHN0YXR1cyB3cml0ZSBpbiB0aGVcbiAqIGFjdGluZyB1c2VyJ3MgY29udGV4dCkgd2FzIHJlZnVzZWQgdGhlIHJlYWQsIHN0b29kIGRvd24sIGFuZCB0aGUgY2FzZSBzdGF5ZWRcbiAqIHdpdGggdGhlIGFnZW50IHdobyBjb3VsZCBub3QgZ2V0IHRvIGl0OyBvbmx5IHRoZSBTTEEgc3dlZXAncyBzeXN0ZW0gd3JpdGVcbiAqIHJlYWNoZWQgdGhlIHBvb2wuIENob29zaW5nIHRoZSBlc2NhbGF0aW9uIGRlc2sgaXMgdGhlIGJ1c2luZXNzJ3Mgcm91dGluZywgbm90XG4gKiB0aGUgYWdlbnQncyBwcml2aWxlZ2UsIHNvIHRoZSBob29rIGVsZXZhdGVzLiBXaGF0IGVsZXZhdGlvbiByZWFjaGVzIGlzIHRoZVxuICogdHdvIFJFQURTOiB0aGUgaG9vayBzdGlsbCBpc3N1ZXMgbm8gd3JpdGUgb2YgaXRzIG93biAoZG9vciBcdTI0NjAgYWJvdmUpLCBzbyBpdFxuICogbmVlZHMgbm8gdHJhbnNmZXIgZ3JhbnQgYW5kIG1vdmVzIG5vdGhpbmcgdGhlIGVzY2FsYXRpb24gd3JpdGUgaXMgbm90XG4gKiBhbHJlYWR5IG1vdmluZy5cbiAqXG4gKiBBR0VOVFMubWQgcnVsZSAxMDogdGhlIHBvb2wgYW5kIHRoZSBsb2FkIGNvdW50cyBhcmUgb3JnYW5pemF0aW9uLU5FVVRSQUxcbiAqIHByZWRpY2F0ZXMgKGEgcG9zaXRpb24gbmFtZSwgYW4gb3duZXIgaWQpLCBzbyBib3RoIGFyZSBwaW5uZWQgdG8gdGhlXG4gKiBlc2NhbGF0aW5nIGNhc2UncyBvd24gYG9yZ2FuaXphdGlvbl9pZGAgd2hlbiBpdCBjYXJyaWVzIG9uZS4gQSBwZXJzb24nc1xuICogZXNjYWxhdGlvbiBpcyBhbHJlYWR5IGNvbmZpbmVkIGJ5IHRoZSBkcml2ZXIgXHUyMDE0IHRoZSBlbGV2YXRlZCBgY3R4LmFwaWAga2VlcHNcbiAqIHRoZSB0cmlnZ2VyJ3MgdGVuYW50IFx1MjAxNCBidXQgdGhlIFNMQSBzd2VlcCB3cml0ZXMgYXMgdGhlIHN5c3RlbSB3aXRoIG5vXG4gKiB0ZW5hbnQgYXQgYWxsLCBhbmQgd2l0aG91dCB0aGUgcGluIGl0cyBlc2NhbGF0aW9uIHdvdWxkIHBpY2sgdGhlXG4gKiBsZWFzdC1sb2FkZWQgbWFuYWdlciBvZiBBTlkgb3JnYW5pemF0aW9uLiBBIGNhc2Ugd2l0aCBubyBvcmdhbml6YXRpb24gKGFcbiAqIHNpbmdsZS1vcmdhbml6YXRpb24gaW5zdGFsbCkgaGFzIG5vIHdhbGwgdG8gc3RheSBpbnNpZGUsIGFuZCBpcyBub3QgcGlubmVkLlxuICogUGlubmVkLCBhIG1hbmFnZXIgd2hvc2UgcG9zaXRpb24gYXNzaWdubWVudCBpcyBnbG9iYWwgKG5vIG9yZ2FuaXphdGlvbilcbiAqIGRvZXMgbm90IHJlY2VpdmUgYSB0ZW5hbnQncyBjYXNlLlxuICpcbiAqIEBwYXJhbSBob29rTmFtZSByZWdpc3RyeSBuYW1lIGZvciB0aGUgaG9vayAobWV0YWRhdGEgb25seSBcdTIwMTQgbmV2ZXIgcmVhZCBieVxuICogICB0aGUgYm9keSwgd2hpY2ggdGhlIHNhbmRib3ggd291bGQgbm90IGxldCBpdCBiZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDYXNlRXNjYWxhdGlvblJlYXNzaWduKGhvb2tOYW1lID0gJ2Nhc2VfZXNjYWxhdGlvbl9yZWFzc2lnbicpOiBIb29rIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBob29rTmFtZSxcbiAgICBvYmplY3Q6ICdjcm1fY2FzZScsXG4gICAgZXZlbnRzOiBbJ2JlZm9yZVVwZGF0ZSddLFxuICAgIHByaW9yaXR5OiAyNTAsXG4gICAgcnVuQXM6ICdzeXN0ZW0nLFxuICAgIGRlc2NyaXB0aW9uOiAnSGFuZCBhIGNhc2UgYmVpbmcgZXNjYWxhdGVkIHRvIHRoZSBsZWFzdC1sb2FkZWQgc2VydmljZSBtYW5hZ2VyLicsXG4gICAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAgIC8vIEQzIHN0YW5kLWRvd246IHRoZSBlc2NhbGF0aW9uIFRSQU5TSVRJT04gaXMgcmVhZCBvZmYgdGhpcyByb3cnc1xuICAgICAgLy8gYHByZXZpb3VzYCwgc28gb24gYSBwcmVkaWNhdGUgdXBkYXRlIHRoZSBuZXcgb3duZXIgd291bGQgYmUgd3JpdHRlbiB0b1xuICAgICAgLy8gZXZlcnkgbWF0Y2hlZCBjYXNlLiBgZXZlbnRzYCBpcyBgYmVmb3JlVXBkYXRlYCBvbmx5LCBzbyB0aGUgZXZlbnQgaGFsZlxuICAgICAgLy8gb2YgdGhlIGlkaW9tIGluIGBmb3JlY2FzdC5ob29rLnRzYCB3b3VsZCBiZSBhIGNvbnN0YW50IGhlcmUuXG4gICAgICBpZiAoY3R4LmRpc3BhdGNoPy5tb2RlID09PSAncGVyLXJvdycpIHJldHVybjtcblxuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gY3R4O1xuICAgICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgICBpZiAoIXByZXZpb3VzKSByZXR1cm47XG5cbiAgICAgIC8vIFRoZSBlc2NhbGF0aW9uIFRSQU5TSVRJT04sIG5vdCB0aGUgZXNjYWxhdGVkIFNUQVRFOiBhIHN0YXRlIHByZWRpY2F0ZVxuICAgICAgLy8gcmUtZmlyZXMgb24gYW55IHdyaXRlIHRoYXQgbGVhdmVzIHRoZSBzdGF0dXMgYWxvbmUsIGluY2x1ZGluZyBhIHJlcGxheVxuICAgICAgLy8gb2YgdGhpcyB2ZXJ5IHVwZGF0ZS4gQ29tcGFyaW5nIHN0YXR1cyBzdHJpbmdzIGFsc28gc3RheXMgY2xlYXIgb2YgdGhlXG4gICAgICAvLyBTUUxpdGUgYm9vbGVhbiB0cmFwIHRoYXQgYGlzX2VzY2FsYXRlZCAhPSB0cnVlYCB3YWxrcyBpbnRvLlxuICAgICAgaWYgKGlucHV0LnN0YXR1cyAhPT0gJ2VzY2FsYXRlZCcgfHwgcHJldmlvdXMuc3RhdHVzID09PSAnZXNjYWxhdGVkJykgcmV0dXJuO1xuXG4gICAgICAvLyBBbiBleHBsaWNpdCBvd25lciBpbiB0aGUgU0FNRSBwYXlsb2FkIHdpbnM6IGEgbWFudWFsIFwiZXNjYWxhdGUgYW5kIGhhbmRcbiAgICAgIC8vIGl0IHRvIERhbmFcIiBtdXN0IG5vdCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgcG9vbCdzIGFyaXRobWV0aWMuXG4gICAgICBpZiAodHlwZW9mIGlucHV0Lm93bmVyX2lkID09PSAnc3RyaW5nJyAmJiBpbnB1dC5vd25lcl9pZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWFwaSkgcmV0dXJuO1xuXG4gICAgICAvLyBUaGUgZXNjYWxhdGluZyBjYXNlJ3Mgb3duIG9yZ2FuaXphdGlvbiBcdTIwMTQgdGhlIHJ1bGUtMTAgcGluIG9uIGJvdGhcbiAgICAgIC8vIHJlYWRzIGJlbG93LiBSZWFkIG9mZiB0aGUgc3RvcmVkIHJvdzogYW4gdXBkYXRlIHBheWxvYWQgZG9lcyBub3QgY2FycnlcbiAgICAgIC8vIGl0LCBhbmQgdGhlIHBsYXRmb3JtIHN0YW1wZWQgaXQgdGhlcmUuXG4gICAgICBjb25zdCBvcmdhbml6YXRpb25JZCA9XG4gICAgICAgIHR5cGVvZiBwcmV2aW91cy5vcmdhbml6YXRpb25faWQgPT09ICdzdHJpbmcnICYmIHByZXZpb3VzLm9yZ2FuaXphdGlvbl9pZCAhPT0gJydcbiAgICAgICAgICA/IHByZXZpb3VzLm9yZ2FuaXphdGlvbl9pZFxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaW5Pcmdhbml6YXRpb246IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSBvcmdhbml6YXRpb25JZCA/IHsgb3JnYW5pemF0aW9uX2lkOiBvcmdhbml6YXRpb25JZCB9IDoge307XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoZSBwb29sID0gaG9sZGVycyBvZiB0aGUgYHNlcnZpY2VfbWFuYWdlcmAgcG9zaXRpb24uIFRoaXMgbGl0ZXJhbCBpc1xuICAgICAgICAvLyB0aGUgZXhwb3J0ZWQgU0VSVklDRV9NQU5BR0VSX1BPU0lUSU9OOyB0aGUgc2FuZGJveCBmb3JiaWRzIHJlYWRpbmcgdGhlXG4gICAgICAgIC8vIGNvbnN0YW50IGhlcmUsIGFuZCBgdGVzdC9jYXNlLWFzc2lnbm1lbnQudGVzdC50c2AgcGlucyB0aGUgcGFyaXR5LlxuICAgICAgICBjb25zdCBob2xkZXJzID0gYXdhaXQgYXBpLm9iamVjdCgnc3lzX3VzZXJfcG9zaXRpb24nKS5maW5kKHtcbiAgICAgICAgICB3aGVyZTogeyBwb3NpdGlvbjogJ3NlcnZpY2VfbWFuYWdlcicsIC4uLmluT3JnYW5pemF0aW9uIH0sIGZpZWxkczogWyd1c2VyX2lkJ10sIHRvcDogMTAwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG1hbmFnZXJJZHMgPSBBcnJheS5mcm9tKFxuICAgICAgICAgIG5ldyBTZXQoXG4gICAgICAgICAgICAoaG9sZGVycyA/PyBbXSlcbiAgICAgICAgICAgICAgLm1hcCgocikgPT4gKHR5cGVvZiByLnVzZXJfaWQgPT09ICdzdHJpbmcnID8gci51c2VyX2lkIDogJycpKVxuICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICAgIC8vIE5vIHBvb2wgXHUyMTkyIHRoZSBjYXNlIGtlZXBzIGl0cyBvd25lciBhbmQgdGhlIGVzY2FsYXRpb24gc3RpbGwgbGFuZHMuXG4gICAgICAgIGlmIChtYW5hZ2VySWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIEFscmVhZHkgd2l0aCB0aGUgcG9vbCBcdTIxOTIgbGVhdmUgaXQgYWxvbmUuIFRoaXMgaXMgd2hhdCBtYWtlcyB0aGUgd3JpdGVcbiAgICAgICAgLy8gaWRlbXBvdGVudDogYSBtYW5hZ2VyIGVzY2FsYXRpbmcgdGhlaXIgb3duIGNhc2UsIG9yIGEgc2Vjb25kXG4gICAgICAgIC8vIGVzY2FsYXRpb24gb2YgYSBjYXNlIGhhbmRlZCBvdmVyIG9uY2UgYWxyZWFkeSwgbW92ZXMgbm90aGluZy5cbiAgICAgICAgY29uc3QgY3VycmVudE93bmVyID1cbiAgICAgICAgICAodHlwZW9mIHByZXZpb3VzLm93bmVyX2lkID09PSAnc3RyaW5nJyAmJiBwcmV2aW91cy5vd25lcl9pZCkgfHwgJyc7XG4gICAgICAgIGlmIChjdXJyZW50T3duZXIgJiYgbWFuYWdlcklkcy5pbmRleE9mKGN1cnJlbnRPd25lcikgIT09IC0xKSByZXR1cm47XG5cbiAgICAgICAgLy8gRmV3ZXN0IE9QRU4gY2FzZXMgd2lucyBcdTIwMTQgc2FtZSBwcmVkaWNhdGUgYXMgdGhlIGludGFrZSByb3VuZC1yb2JpbjpcbiAgICAgICAgLy8gYCRuaW5gIG92ZXIgc3RhdHVzZXMgcmF0aGVyIHRoYW4gYGlzX2Nsb3NlZDogZmFsc2VgLCBiZWNhdXNlIGFcbiAgICAgICAgLy8gcmVzb2x2ZWQgY2FzZSBpcyBmaW5pc2hlZCB3b3JrIGFuZCBtdXN0IHN0b3AgY291bnRpbmcuXG4gICAgICAgIGxldCBiZXN0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBiZXN0Q291bnQgPSBJbmZpbml0eTtcbiAgICAgICAgZm9yIChjb25zdCBtYW5hZ2VySWQgb2YgbWFuYWdlcklkcykge1xuICAgICAgICAgIGNvbnN0IG9wZW5Db3VudCA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9jYXNlJykuY291bnQoe1xuICAgICAgICAgICAgd2hlcmU6IHsgb3duZXJfaWQ6IG1hbmFnZXJJZCwgc3RhdHVzOiB7ICRuaW46IFsncmVzb2x2ZWQnLCAnY2xvc2VkJ10gfSwgLi4uaW5Pcmdhbml6YXRpb24gfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAob3BlbkNvdW50IDwgYmVzdENvdW50KSB7XG4gICAgICAgICAgICBiZXN0Q291bnQgPSBvcGVuQ291bnQ7XG4gICAgICAgICAgICBiZXN0ID0gbWFuYWdlcklkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYmVzdCkgaW5wdXQub3duZXJfaWQgPSBiZXN0O1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFN3YWxsb3c6IHRoZSBoYW5kLW9mZiBtdXN0IG5ldmVyIHJlamVjdCB0aGUgZXNjYWxhdGlvbi4gQSBmYWlsZWRcbiAgICAgICAgLy8gcG9vbCByZWFkIGxlYXZlcyB0aGUgY2FzZSB3aGVyZSBpdCBpcywgZXNjYWxhdGVkLlxuICAgICAgICAvLyAoTm8gYGNvbnNvbGVgIGhlcmUgXHUyMDE0IHRoZSBMMiBob29rIHNhbmRib3ggZG9lcyBub3QgZGVmaW5lIG9uZS4pXG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBMZXQgYSB1c2VyIENMQUlNIGFuIHVub3duZWQgY2FzZSBvdXQgb2YgdHJpYWdlLlxuICpcbiAqIENvbnRyYWN0OiBhIGNhbGxlciBtYXkgdGFrZSBvd25lcnNoaXAgb25seSBmb3IgVEhFTVNFTFZFUywgb25seSB3aGlsZSB0aGVcbiAqIGNhc2UgaXMgdW5vd25lZCwgYW5kIG9ubHkgd2hpbGUgaXQgaXMgbm90IGNsb3NlZC5cbiAqXG4gKiAjIyBXaHkgdGhlIGNsYWltIGlzIGEgR0VTVFVSRSwgbm90IGEgdmFsdWUgdGhlIGNhbGxlciBzdXBwbGllc1xuICpcbiAqIFx1MjZBMFx1RkUwRiBUaGUgb3duZXJzaGlwLXRyYW5zZmVyIGdhdGUgKCMzMDA0KSByZWplY3RzIGEgcGF5bG9hZCBjYXJyeWluZyBgb3duZXJfaWRgXG4gKiBJTlNJREUgdGhlIG9wZXJhdGlvbiBtaWRkbGV3YXJlLCB1cHN0cmVhbSBvZiB0aGUgaG9vayBwaGFzZSBcdTIwMTQgdGhlIGhvb2sgbmV2ZXJcbiAqIGZpcmVzLCBzbyBpdCBjYW5ub3QgYXBwcm92ZSwgbGF1bmRlciBvciBhZGp1ZGljYXRlIHN1Y2ggYSB3cml0ZSAoZG9vciBcdTI0NjIgaW5cbiAqIHRoaXMgbW9kdWxlJ3MgaGVhZGVyKS4gXCJMZXQgdGhlIGFnZW50IHdyaXRlIGB7IG93bmVyX2lkOiA8c2VsZj4gfWAgYW5kIGhhdmUgYVxuICogaG9vayB2ZXQgaXRcIiBpcyB0aGVyZWZvcmUgbm90IGltcGxlbWVudGFibGUgYXQgYWxsLlxuICpcbiAqIFNvIHRoZSBjbGFpbSBpcyBzcGVsbGVkIGFzIGEgTU9WRTogdGhlIGNhbGxlciBwdXRzIGFuIHVub3duZWQgb3BlbiBjYXNlIGludG9cbiAqIGEgc3RhdHVzIG1lYW5pbmcgdGhleSBwaWNrZWQgaXQgdXAgKHtAbGluayBDTEFJTUFCTEVfVEFSR0VUX1NUQVRVU0VTfSkgYW5kXG4gKiB0aGlzIGhvb2sgc3RhbXBzIGBjdHgudXNlci5pZGAsIHRoZSBvbmx5IHVzZXIgaWQgaXQgaGFzLiBUaGF0IGludmVydHMgdGhlXG4gKiBzYWZldHkgYnVyZGVuIGluIHRoZSBhcHAncyBmYXZvdXIgXHUyMDE0IFwiY2xhaW0gaXQgZm9yIHNvbWVib2R5IGVsc2VcIiBhbmQgXCJjbGFpbVxuICogYW4gb3duZWQgY2FzZVwiIGhhdmUgbm8gc3BlbGxpbmcsIGJlY2F1c2UgdGhlIGhvb2sgcmVhZHMgbm8gdGFyZ2V0IGZyb20gdGhlXG4gKiBwYXlsb2FkIGFuZCBpcyBpbmVydCB1bmxlc3MgdGhlIFNUT1JFRCByb3cgaXMgb3duZXJsZXNzLiBUaGUgYWx0ZXJuYXRpdmUsXG4gKiBncmFudGluZyBgY3JtX2Nhc2UuYWxsb3dUcmFuc2ZlcmAsIGNhbm5vdCBleHByZXNzIFwidG8geW91cnNlbGYgb25seVwiOiBpdFxuICogd291bGQgbGV0IGFuIGFnZW50IHJlYXNzaWduIGFueSBjYXNlIHRoZXkgY2FuIGVkaXQsIHRvIGFueW9uZS5cbiAqIGBzcmMvc2FsZXMvcHJvZmlsZXMvc2VydmljZS1hZ2VudC5wcm9maWxlLnRzYCBuZWVkcyBubyBuZXcgZ3JhbnQgZm9yIHRoaXMgaG9vay5cbiAqXG4gKiAjIyBUaGUgZm91ciBib3VuZGFyaWVzXG4gKlxuICogfCB3cml0ZSwgYXMgYSBgc2VydmljZV9hZ2VudGAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvdXRjb21lIHxcbiAqIHwgLS0tIHwgLS0tIHxcbiAqIHwgYHsgc3RhdHVzOiAnaW5fcHJvZ3Jlc3MnIH1gIG9uIGFuIHVub3duZWQgT1BFTiBjYXNlIHwgY2xhaW1lZCBcdTIwMTQgb3duZXIgYmVjb21lcyB0aGUgY2FsbGVyIHxcbiAqIHwgdGhlIHNhbWUgb24gYSBjYXNlIG93bmVkIGJ5IFNPTUVCT0RZIEVMU0UgICAgICAgICAgIHwgcmVmdXNlZDogbm8gcmVhY2gsIGFuZCBndWFyZCAzIGJlbG93IHxcbiAqIHwgYHsgb3duZXJfaWQ6IDxhbnlvbmU+IH1gLCB1bm93bmVkIG9yIG5vdCAgICAgICAgICAgIHwgcmVmdXNlZCBieSB0aGUgdHJhbnNmZXIgZ2F0ZSwgdXBzdHJlYW0gfFxuICogfCB0aGUgc2FtZSBvbiBhbiB1bm93bmVkIENMT1NFRCBjYXNlICAgICAgICAgICAgICAgICAgfCByZWZ1c2VkOiBub3Qgc2hhcmVkLCBhbmQgZ3VhcmQgNCBiZWxvdyB8XG4gKlxuICogRWFjaCBndWFyZCBpcyBkb3VibGVkIG9uIHB1cnBvc2U6IGBjYXNlX3VuYXNzaWduZWRfdHJpYWdlX3NoYXJpbmdgIGFscmVhZHlcbiAqIGhpZGVzIGEgY2xvc2VkIG9yIG90aGVyd2lzZS1vd25lZCBjYXNlIGZyb20gYW4gYWdlbnQsIGJ1dCB0aGlzIGhvb2sgYWxzbyBydW5zXG4gKiBmb3IgY2FsbGVycyB0aGF0IHJ1bGUgZG9lcyBub3QgY29uc3RyYWluIChhbiBhZG1pbiwgYSBtYW5hZ2VyIGhvbGRpbmcgdGhlXG4gKiBlc2NhbGF0aW9uIHNoYXJlKS4gYHRlc3QvdW5hc3NpZ25lZC1jYXNlLXRyaWFnZS1yZWFjaC50ZXN0LnRzYCBkcml2ZXMgYm90aFxuICogbGF5ZXJzIHNlcGFyYXRlbHkgc28gbmVpdGhlciBjYW4gcGFzcyBvbiB0aGUgb3RoZXIncyBiZWhhbGYuXG4gKlxuICogIyMgUmUtZW50cmFuY3lcbiAqXG4gKiBUaGUgaG9vayBwZXJmb3JtcyBOTyBvcGVyYXRpb24gXHUyMDE0IGl0IG11dGF0ZXMgdGhlIHBheWxvYWQgb2YgdGhlIHVwZGF0ZSBhbHJlYWR5XG4gKiBpbiBmbGlnaHQsIHNvIHRoZXJlIGlzIG5vIHNlY29uZCB3cml0ZSBhbmQgbm8gc2Vjb25kIGByZWNvcmQtYWZ0ZXItdXBkYXRlYFxuICogZXZlbnQgZm9yIGBjYXNlX2VzY2FsYXRpb25gLCBgY2FzZV9zbGFfbW9uaXRvcmAgb3IgYGNhc2Vfc3RhdHVzX3NpZGVfZWZmZWN0c2BcbiAqIHRvIHJlLWZpcmUgb24uIEl0cyBwcmVkaWNhdGUgaXMgYSBUUkFOU0lUSU9OLCBub3QgYSBzdGF0ZSwgc28gaXQgaXMgZmFsc2Ugb25cbiAqIGEgcmVwbGF5OyBhbmQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNsYWltIHRoZSBzdG9yZWQgcm93IEhBUyBhbiBvd25lciwgc28gZ3VhcmRcbiAqIDMgc3RvcHMgZXZlcnkgbGF0ZXIgcnVuLiBJdCBjYW5ub3QgY29sbGlkZSB3aXRoIHRoZSBlc2NhbGF0aW9uIGhhbmQtb2ZmOlxuICogYGVzY2FsYXRlZGAgaXMgZGVsaWJlcmF0ZWx5IG5vdCBjbGFpbWFibGUsIGFuZCBhdCBwcmlvcml0eSAyNjAgdGhpcyBydW5zXG4gKiBhZnRlciBgY2FzZV9lc2NhbGF0aW9uX3JlYXNzaWduYCAoMjUwKSBhbmQgc3RhbmRzIGRvd24gdGhlIG1vbWVudCBgb3duZXJfaWRgXG4gKiBpcyBhbHJlYWR5IGluIHRoZSBwYXlsb2FkLlxuICpcbiAqICMjIFdobyB0aGlzIHJ1bnMgZm9yXG4gKlxuICogQSBjbGFpbSBpcyBzb21ldGhpbmcgYSBQRVJTT04gZG9lcywgc28gYSB3cml0ZSB3aXRoIG5vIHVzZXIgKGEgc2VlZCwgYVxuICogc3lzdGVtLWNvbnRleHQgbWlncmF0aW9uLCB0aGUgYW5vbnltb3VzIHdlYi10by1jYXNlIHBhdGgpIG5ldmVyIGNsYWltcyBcdTIwMTRcbiAqIG93bmVybGVzcyBpbnRha2Ugc3RheXMgb3duZXJsZXNzIGFuZCBzdGF5cyBpbiB0aGUgdHJpYWdlIHRhYi4gQSB3cml0ZVxuICogY2FycnlpbmcgYSByZWFsIHVzZXIgaWQgY2xhaW1zIGZvciB0aGF0IHVzZXIsIHdob2V2ZXIgdGhleSBhcmUuXG4gKlxuICogQHBhcmFtIGhvb2tOYW1lIHJlZ2lzdHJ5IG5hbWUgZm9yIHRoZSBob29rIChtZXRhZGF0YSBvbmx5IFx1MjAxNCBuZXZlciByZWFkIGJ5XG4gKiAgIHRoZSBib2R5LCB3aGljaCB0aGUgc2FuZGJveCB3b3VsZCBub3QgbGV0IGl0IGJlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNhc2VTZWxmQ2xhaW0oaG9va05hbWUgPSAnY2FzZV9zZWxmX2NsYWltJyk6IEhvb2sge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGhvb2tOYW1lLFxuICAgIG9iamVjdDogJ2NybV9jYXNlJyxcbiAgICBldmVudHM6IFsnYmVmb3JlVXBkYXRlJ10sXG4gICAgcHJpb3JpdHk6IDI2MCxcbiAgICBkZXNjcmlwdGlvbjogJ0xldCBhIHVzZXIgY2xhaW0gYW4gdW5vd25lZCBvcGVuIGNhc2UgYnkgcGlja2luZyBpdCB1cDsgdGhlIG93bmVyIHdyaXR0ZW4gaXMgYWx3YXlzIHRoZSBjYWxsZXIuJyxcbiAgICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgICAgLy8gRDMgc3RhbmQtZG93bjogZXZlcnkgZ3VhcmQgYmVsb3cgaXMgZGVjaWRlZCBhZ2FpbnN0IHRoaXMgcm93J3NcbiAgICAgIC8vIGBwcmV2aW91c2AsIHNvIGEgcHJlZGljYXRlIHVwZGF0ZSB3b3VsZCBjbGFpbSByb3dzIHRoZSBjYWxsZXIgbmV2ZXJcbiAgICAgIC8vIHBpY2tlZCB1cC4gYGJlZm9yZVVwZGF0ZWAtb25seSwgYXMgYWJvdmUuXG4gICAgICBpZiAoY3R4LmRpc3BhdGNoPy5tb2RlID09PSAncGVyLXJvdycpIHJldHVybjtcblxuICAgICAgY29uc3QgeyBpbnB1dCB9ID0gY3R4O1xuICAgICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgICBpZiAoIXByZXZpb3VzKSByZXR1cm47XG5cbiAgICAgIC8vIDEuIEEgY2xhaW0gaXMgc29tZXRoaW5nIGEgUEVSU09OIGRvZXMuIEEgc3lzdGVtIG9yIHNlZWQgd3JpdGUgbGVhdmVzXG4gICAgICAvLyAgICB0aGUgY2FzZSBvd25lcmxlc3MgZm9yIHRoZSB0cmlhZ2UgdGFiIHRvIGtlZXAgc2hvd2luZy5cbiAgICAgIGNvbnN0IGNsYWltYW50ID0gY3R4LnVzZXI/LmlkO1xuICAgICAgaWYgKHR5cGVvZiBjbGFpbWFudCAhPT0gJ3N0cmluZycgfHwgIWNsYWltYW50KSByZXR1cm47XG4gICAgICBpZiAoY3R4LnNlc3Npb24/LmlzU3lzdGVtKSByZXR1cm47XG5cbiAgICAgIC8vIDIuIEFuIGV4cGxpY2l0IGBvd25lcl9pZGAgaW4gdGhlIHBheWxvYWQgV0lOUyBhbmQgaXMgbmV2ZXIgdG91Y2hlZC4gRm9yXG4gICAgICAvLyAgICBhbiBhZ2VudCB0aGF0IGJyYW5jaCBpcyB1bnJlYWNoYWJsZSAodGhlIHRyYW5zZmVyIGdhdGUgcmVmdXNlcyBzdWNoXG4gICAgICAvLyAgICBhIHBheWxvYWQgdXBzdHJlYW0pLCBzbyBpbiBwcmFjdGljZSBpdCBtZWFucyBhIGNhbGxlciB3aG9cbiAgICAgIC8vICAgIGxlZ2l0aW1hdGVseSBob2xkcyBgYWxsb3dUcmFuc2ZlcmAgZ2V0cyB0aGUgb3duZXIgdGhleSBuYW1lZC5cbiAgICAgIGlmICgnb3duZXJfaWQnIGluIGlucHV0KSByZXR1cm47XG5cbiAgICAgIC8vIDMuIE9ubHkgYW4gVU5PV05FRCBjYXNlIGNhbiBiZSBjbGFpbWVkLiBDb3ZlcnMgYm90aCBzdG9yYWdlIHNoYXBlcyBvZlxuICAgICAgLy8gICAgXCJubyBvd25lclwiOiB0aGUga2V5IEFCU0VOVCAobWVtb3J5L21vbmdvKSBhbmQgdGhlIGNvbHVtbiBOVUxMIChTUUwpLlxuICAgICAgaWYgKHR5cGVvZiBwcmV2aW91cy5vd25lcl9pZCA9PT0gJ3N0cmluZycgJiYgcHJldmlvdXMub3duZXJfaWQpIHJldHVybjtcblxuICAgICAgLy8gNC4gXHUyMDI2YW5kIG9ubHkgb25lIHRoYXQgaXMgbm90IENMT1NFRC4gXHUyNkEwXHVGRTBGIFRoaXMgZ3VhcmQgYW5kIHRoZSB0cmlhZ2VcbiAgICAgIC8vICAgIHNoYXJpbmcgZ3JhbnQgZHJhdyBESUZGRVJFTlQgbGluZXMgb24gcHVycG9zZSwgYW5kIFx1MjZENCBuZWl0aGVyIGlzIHRvXG4gICAgICAvLyAgICBiZSBcImFsaWduZWRcIiBvbnRvIHRoZSBvdGhlci4gYGNhc2VfdW5hc3NpZ25lZF90cmlhZ2Vfc2hhcmluZ2BcbiAgICAgIC8vICAgIChgc3JjL3NlcnZpY2Uvc2hhcmluZy9jYXNlLnNoYXJpbmcudHNgKSBleGNsdWRlcyBgcmVzb2x2ZWRgIGFzIHdlbGwgYXNcbiAgICAgIC8vICAgIGBjbG9zZWRgLCBiZWNhdXNlIGEgcmVzb2x2ZWQgdW5vd25lZCBjYXNlIGlzIGhpc3RvcnksIG5vdCBiYWNrbG9nLFxuICAgICAgLy8gICAgYW5kIHRoZSB0YWIncyByb3cgY291bnQgaGFzIHRvIGtlZXAgbWVhbmluZyBcIndvcmsgd2FpdGluZyBmb3IgYVxuICAgICAgLy8gICAgaHVtYW5cIi4gVGhpcyBndWFyZCBzdG9wcyBhdCBgY2xvc2VkYCBhbG9uZSwgYmVjYXVzZSBSRU9QRU5JTkcgYVxuICAgICAgLy8gICAgcmVzb2x2ZWQgY2FzZSBJUyBwaWNraW5nIHRoZSB3b3JrIHVwLCBzbyB3aG9ldmVyIGRvZXMgaXQgc2hvdWxkXG4gICAgICAvLyAgICBiZWNvbWUgaXRzIG93bmVyLiBUaGUgZ2FwIGJldHdlZW4gdGhlIHR3byBsaW5lcyBpcyBsaXZlIGZvciBleGFjdGx5XG4gICAgICAvLyAgICB0aGUgY2FsbGVycyB0aGF0IHJ1bGUgZG9lcyBub3QgcmVhY2ggXHUyMDE0IHRoZSBhZG1pbiwgdGhlIG1hbmFnZXJcbiAgICAgIC8vICAgIGhvbGRpbmcgdGhlIGVzY2FsYXRpb24gc2hhcmUgXHUyMDE0IHdoaWNoIGlzIHdoeVxuICAgICAgLy8gICAgYHRlc3QvdW5hc3NpZ25lZC1jYXNlLXRyaWFnZS1yZWFjaC50ZXN0LnRzYCBkcml2ZXMgdGhlIGNsb3NlZCBndWFyZFxuICAgICAgLy8gICAgb25jZSBwZXIgbGF5ZXIsIHRoZSBzZWNvbmQgdGltZSB3aXRoIGFuIGFjdG9yIHRoYXQgQ0FOIHJlYWNoIHRoZVxuICAgICAgLy8gICAgcm93LlxuICAgICAgLy9cbiAgICAgIC8vICAgIFx1MjZBMFx1RkUwRiBUaGUgYGlzX2Nsb3NlZCA9PSBmYWxzZWAgY29uZGl0aW9ucyBlbHNld2hlcmUgaW4gdGhhdCBzaGFyaW5nXG4gICAgICAvLyAgICBmaWxlIGFyZSBOT1QgdGhpcyBncmFudCBhbmQgTk9UIGRyaWZ0OiB0aGV5IGJlbG9uZyB0byB0aGUgbWFuYWdlclxuICAgICAgLy8gICAgYW5kIGRpcmVjdG9yIHJ1bGVzIG9uIGNyaXRpY2FsLXByaW9yaXR5IGNhc2VzLCB3aGljaCBrZWVwIHN0YW5kaW5nXG4gICAgICAvLyAgICByZWFjaCB0aHJvdWdoIHRoZSBgcmVzb2x2ZWQgXHUyMTkyIGNsb3NlZGAgcmV2aWV3IHdpbmRvdyBieSB0aGVpciBvd25cbiAgICAgIC8vICAgIHJ1bGluZy4gVGhlaXIgXHUyNkEwXHVGRTBGIGhlYWRlcnMgY2FycnkgaXQ7IFx1MjZENCBkbyBub3QgcmVhZCB0aGVtIGFzIHRoaXMgb25lLlxuICAgICAgLy9cbiAgICAgIC8vICAgIGBzdGF0dXNgIGlzIHJlYWQgZmlyc3QgYmVjYXVzZSBpdCBpcyBhIHN0cmluZyBvbiBldmVyeSBkcml2ZXI7XG4gICAgICAvLyAgICBgaXNfY2xvc2VkYCBpcyBhY2NlcHRlZCBhcyBgdHJ1ZWAgb3IgYDFgIGJlY2F1c2UgU1FMaXRlIGhhbmRzXG4gICAgICAvLyAgICBib29sZWFucyBiYWNrIGFzIGludGVnZXJzLlxuICAgICAgaWYgKHByZXZpb3VzLnN0YXR1cyA9PT0gJ2Nsb3NlZCcpIHJldHVybjtcbiAgICAgIGlmIChwcmV2aW91cy5pc19jbG9zZWQgPT09IHRydWUgfHwgcHJldmlvdXMuaXNfY2xvc2VkID09PSAxKSByZXR1cm47XG5cbiAgICAgIC8vIDUuIFRoZSBnZXN0dXJlOiB0aGUgc3RhdHVzIE1PVkVTIHRvIG9uZSBtZWFuaW5nIGEgaHVtYW4gcGlja2VkIHRoZSBjYXNlXG4gICAgICAvLyAgICB1cC4gSW5saW5lIGNvcGllcyBvZiBDTEFJTUFCTEVfVEFSR0VUX1NUQVRVU0VTIFx1MjAxNCB0aGUgc2FuZGJveCBmb3JiaWRzXG4gICAgICAvLyAgICByZWFkaW5nIHRoZSBjb25zdGFudCBoZXJlOyBgdGVzdC91bmFzc2lnbmVkLWNhc2UtdHJpYWdlLXJlYWNoLnRlc3QudHNgXG4gICAgICAvLyAgICBwaW5zIHRoZSB0d28gaW4gc3RlcC4gYGVzY2FsYXRlZGAgaXMgYWJzZW50IG9uIHB1cnBvc2U6IHRoYXRcbiAgICAgIC8vICAgIHRyYW5zaXRpb24gYmVsb25ncyB0byBgY2FzZV9lc2NhbGF0aW9uX3JlYXNzaWduYC5cbiAgICAgIGNvbnN0IG5leHQgPSBpbnB1dC5zdGF0dXM7XG4gICAgICBpZiAodHlwZW9mIG5leHQgIT09ICdzdHJpbmcnIHx8IG5leHQgPT09IHByZXZpb3VzLnN0YXR1cykgcmV0dXJuO1xuICAgICAgaWYgKG5leHQgIT09ICdpbl9wcm9ncmVzcycgJiYgbmV4dCAhPT0gJ3dhaXRpbmdfY3VzdG9tZXInICYmIG5leHQgIT09ICd3YWl0aW5nX3N1cHBvcnQnKSByZXR1cm47XG5cbiAgICAgIC8vIFRoZSBvbmx5IHVzZXIgaWQgdGhpcyBob29rIGhhcywgYW5kIHRoZSBvbmx5IG9uZSBpdCBjYW4gd3JpdGUuXG4gICAgICBpbnB1dC5vd25lcl9pZCA9IGNsYWltYW50O1xuICAgIH0sXG4gIH07XG59XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2Zsb3dzL2Nhc2UtZXNjYWxhdGlvbi1zdGFtcC5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZmxvd3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9mbG93cy9jYXNlLWVzY2FsYXRpb24tc3RhbXAuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIFRoZSBlc2NhbGF0aW9uIFNUQU1QIFx1MjAxNCB0aGUgb25lIGVsZXZhdGVkIHN0ZXAgYmVoaW5kIHRoZSBFc2NhbGF0ZSBDYXNlXG4gKiBhY3Rpb24gKG1haW50YWluZXItYXBwcm92ZWQpLlxuICpcbiAqICMjIFdoeSB0aGlzIGZsb3cgZXhpc3RzIGF0IGFsbFxuICpcbiAqIGBjcm1fY2FzZS5pc19lc2NhbGF0ZWRgIGFuZCBgZXNjYWxhdGVkX2RhdGVgIGFyZSBgcmVhZG9ubHk6IHRydWVgOiBub2JvZHlcbiAqIHR5cGVzIHRoZW0sIHNvIHRoYXQgaXMgdGhlIGhvbmVzdCBkZWNsYXJhdGlvbi4gQnV0IHRoZSBwbGF0Zm9ybSdzIHJlYWRvbmx5XG4gKiBzdHJpcCBpcyBvbmUgYnJhbmNoIG9mIHRoZSBVUERBVEUgcGF0aCBcdTIwMTRcbiAqIGBpZiAoIW9wQ3R4LmNvbnRleHQ/LmlzU3lzdGVtKWAsIG92ZXIgQ0FMTEVSLXN1cHBsaWVkIGtleXMgXHUyMDE0IHNvIGEgZmxvdyB3cml0ZVxuICogdG8gYSByZWFkb25seSBjb2x1bW4gc3Vydml2ZXMgZXhhY3RseSB3aGVuIHRoYXQgZmxvdydzIGVmZmVjdGl2ZSBgcnVuQXNgIGlzXG4gKiBgJ3N5c3RlbSdgICh0aGUgZW5naW5lIGRlZmF1bHRzIGl0IHRvIGAndXNlcidgKS4gVGhlIGBlc2NhbGF0ZV9jYXNlYCBzY3JlZW5cbiAqIGZsb3cgaXMgaW52b2tlZCBieSBhIHBlcnNvbiBmcm9tIHRoZSBVSSBhbmQgTVVTVCBrZWVwIHJ1bm5pbmcgYXMgdGhhdFxuICogcGVyc29uLCBzbyBpdCBjYW5ub3QgbWFrZSB0aGlzIHdyaXRlIGl0c2VsZi5cbiAqXG4gKiBUaGUgcmVzb2x1dGlvbiBpcyB0byBlbGV2YXRlIHRoZSBXUklURSwgbm90IHRoZSBGTE9XOiBgZXNjYWxhdGVfY2FzZWAgc3RheXNcbiAqIGBydW5BczogJ3VzZXInYCBhbmQgY2FsbHMgdGhpcyBkZWRpY2F0ZWQgYHJ1bkFzOiAnc3lzdGVtJ2AgZmxvdyB0aHJvdWdoIGFcbiAqIGBzdWJmbG93YCBub2RlLiBFdmVyeXRoaW5nIHRoZSBhZ2VudCBkb2VzIGtlZXBzIHRoZWlyIGlkZW50aXR5OyBvbmx5IHRoZXNlXG4gKiB0d28gc3RhbXBlZCBjb2x1bW5zIGFyZSB3cml0dGVuIHdpdGggdGhlIGVsZXZhdGVkIGNvbnRleHQuXG4gKlxuICogXHUyNkQ0IERvIE5PVCBmb2xkIHRoaXMgYmFjayBpbnRvIGBlc2NhbGF0ZV9jYXNlYCBieSBnaXZpbmcgdGhhdCBmbG93XG4gKiBgcnVuQXM6ICdzeXN0ZW0nYC4gVGhhdCBvcHRpb24gd2FzIGNvc3RlZCBhbmQgZXhwbGljaXRseSBOT1QgYWRvcHRlZDogaXRcbiAqIGVsZXZhdGVzIGV2ZXJ5IHdyaXRlIHRoZSBzY3JlZW4gZmxvdyBtYWtlcywgbm90IGp1c3QgdGhlc2UgdHdvLCBhbmQgaXQgc3RvcHNcbiAqIHRoZSBmbG93IGNhcnJ5aW5nIHRoZSBhY3RpbmcgdXNlcidzIGNvbnRleHQgZm9yIGFueXRoaW5nIGRvd25zdHJlYW0gdGhhdFxuICogcmVhZHMgaXQuIFNlZSBgQUdFTlRTLm1kYCBob3VzZSBydWxlIDkgKFwiRWxldmF0ZSBhcyBsaXR0bGUgYXMgcG9zc2libGVcIikuXG4gKlxuICogIyMgTWVhc3VyZWQsIG5vdCBhc3N1bWVkXG4gKlxuICogVGhlIGRpcmVjdGlvbiByZXN0cyBvbiBvbmUgZmFsc2lmaWFibGUgcHJlbWlzZSBcdTIwMTQgdGhhdCBhIGNhbGxlZSBmbG93J3Mgb3duXG4gKiBgcnVuQXNgIGdvdmVybnMgaXRzIHdyaXRlcyByYXRoZXIgdGhhbiBpbmhlcml0aW5nIHRoZSBjYWxsZXIncyBjb250ZXh0IFx1MjAxNCBhbmRcbiAqIGl0IGlzIG1lYXN1cmVkIGFnYWluc3QgYSByZWFsIGVuZ2luZSBpblxuICogYHRlc3QvcmVhZG9ubHktd3JpdGUtc2VtYW50aWNzLnRlc3QudHNgIChcImEgc3lzdGVtIHN1YmZsb3cgY2FsbGVkIGZyb20gYVxuICogdXNlciBwYXJlbnRcIikuIFRoYXQgbWVhc3VyZW1lbnQgcmVwb3J0cyB0aHJlZSB0aGluZ3M6XG4gKlxuICogIC0gYSBgcnVuQXM6ICdzeXN0ZW0nYCBjYWxsZWUgaW52b2tlZCBmcm9tIGEgYHJ1bkFzOiAndXNlcidgIHBhcmVudCBoYXMgaXRzXG4gKiAgICB3cml0ZSB0byBhIGByZWFkb25seWAgY29sdW1uIFNVUlZJVkU7XG4gKiAgLSB0aGUgc2FtZSBjYWxsZWUgZGVjbGFyZWQgYHJ1bkFzOiAndXNlcidgIGlzIFNUUklQUEVEIFx1MjAxNCBzbyBpdCBpcyB0aGVcbiAqICAgIGNhbGxlZSdzIGRlY2xhcmF0aW9uIHRoYXQgZGVjaWRlcywgbm90IHRoZSBzdWJmbG93IGhvcDtcbiAqICAtIHRoZSBwYXJlbnQncyBvd24gbGF0ZXIgd3JpdGUgdG8gYSByZWFkb25seSBjb2x1bW4gaXMgU1RJTEwgc3RyaXBwZWQgXHUyMDE0IHRoZVxuICogICAgZWxldmF0aW9uIGlzIHNjb3BlZCB0byB0aGlzIHJ1biBhbmQgZG9lcyBub3QgbGVhayBiYWNrIHVwLlxuICpcbiAqIFRoZSBtZWNoYW5pc20gaXMgYHJlc29sdmVSdW5Db250ZXh0YFxuICogKGBAb2JqZWN0c3RhY2svc2VydmljZS1hdXRvbWF0aW9uYCksIHdoaWNoIHJlLWFzc2VydHNcbiAqIGBydW5BczogZmxvdy5ydW5BcyA/PyAndXNlcidgIEFGVEVSIHNwcmVhZGluZyB0aGUgY2FsbGVyJ3MgY29udGV4dCwgc28gdGhlXG4gKiBjYWxsZWUncyBvd24gZGVjbGFyYXRpb24gd2luczogXCJhIENPUFksIG5ldmVyIG11dGF0aW5nIHRoZSBjYWxsZXIncyBjb250ZXh0LFxuICogc28gdGhlIGVsZXZhdGlvbiBpcyBzY29wZWQgdG8gdGhpcyBydW4gYW5kIHRoZSBjYWxsZXIncyBpZGVudGl0eSBpcyByZXN0b3JlZFxuICogd2hlbiB0aGUgcnVuIHJldHVybnNcIiAoQURSLTAwNDkpLlxuICpcbiAqICMjIFx1MjZENCBXaGF0IHRoaXMgZmxvdyBkZWxpYmVyYXRlbHkgZG9lcyBOT1Qgd3JpdGVcbiAqXG4gKiBPbmx5IHRoZSB0d28gY29sdW1ucyBhIHBlcnNvbiBuZXZlciB0eXBlczpcbiAqXG4gKiAgIGlzX2VzY2FsYXRlZCAgICBzdGFtcGVkIGhlcmVcbiAqICAgZXNjYWxhdGVkX2RhdGUgIHN0YW1wZWQgaGVyZVxuICpcbiAqIGBlc2NhbGF0aW9uX3JlYXNvbmAgaXMgdGhlIGFnZW50J3Mgc2NyZWVuIGlucHV0IGFuZCBgcHJpb3JpdHlgIC8gYHN0YXR1c2BcbiAqIGFyZSBvcmRpbmFyeSBlZGl0YWJsZSBjb2x1bW5zIFx1MjAxNCBhbGwgdGhyZWUgc3RheSBpbiBgZXNjYWxhdGVfY2FzZWAsIHdyaXR0ZW5cbiAqIHdpdGggdGhlIFVTRVIncyBjb250ZXh0LiBNb3ZpbmcgYGVzY2FsYXRpb25fcmVhc29uYCBoZXJlIChvciBkZWNsYXJpbmcgaXRcbiAqIGByZWFkb25seWApIHdvdWxkIG1ha2UgdGhlIHBsYXRmb3JtIHNpbGVudGx5IHN0cmlwIHRoZSByZWFzb24gdGhlIGFnZW50IGp1c3RcbiAqIHR5cGVkIFx1MjAxNCB0aGUgZXhhY3QgaGFybSB0aGlzIHNwbGl0IGV4aXN0cyB0byBwcmV2ZW50LCBpbnZlcnRlZCBvbnRvIHVzZXIgaW5wdXQuXG4gKlxuICogXHUyNkEwXHVGRTBGIE9SREVSSU5HIElTIExPQUQtQkVBUklORywgYW5kIGl0IGlzIHdoeSB0aGlzIGZsb3cgcnVucyBMQVNUIHJhdGhlciB0aGFuXG4gKiBmaXJzdC4gYGNybV9jYXNlYCdzIGBlc2NhbGF0aW9uX3JlYXNvbl9yZXF1aXJlZGAgdmFsaWRhdGlvbiByZWplY3RzIGFueSB3cml0ZVxuICogd2hvc2UgbWVyZ2VkIHJlY29yZCBoYXMgYGlzX2VzY2FsYXRlZCA9PSB0cnVlYCB3aXRoIGEgYmxhbmtcbiAqIGBlc2NhbGF0aW9uX3JlYXNvbmAuIGBlc2NhbGF0ZV9jYXNlYCB0aGVyZWZvcmUgd3JpdGVzIHRoZSByZWFzb24gRklSU1QgYW5kXG4gKiBjYWxscyB0aGlzIGZsb3cgQUZURVIsIHNvIHRoZSByZWFzb24gaXMgYWxyZWFkeSBzdG9yZWQgd2hlbiB0aGUgZmxhZyBmbGlwcy5cbiAqIFN0YW1waW5nIGZpcnN0IHdvdWxkIGZpcmUgdGhhdCB2YWxpZGF0aW9uIGFnYWluc3QgYSByZWNvcmQgdGhhdCBkb2VzIG5vdCB5ZXRcbiAqIGNhcnJ5IGEgcmVhc29uLiBCT1RIIG9yZGVycyBhcmUgbWVhc3VyZWQgaW5cbiAqIGB0ZXN0L3JlYWRvbmx5LXdyaXRlLXNlbWFudGljcy50ZXN0LnRzYCAoXCJvcmRlcmluZzogdGhlIHJlYXNvbiBtdXN0IGJlIHN0b3JlZFxuICogQkVGT1JFIHRoZSBmbGFnIGZsaXBzXCIpLCBpbmNsdWRpbmcgdGhlIGNvdW50ZXJmYWN0dWFsOiBzdGFtcGluZyBmaXJzdCBpc1xuICogcmVmdXNlZCBieSB0aGF0IHZhbGlkYXRpb24sIGFuZCBiZWNhdXNlIGEgYHN1YmZsb3dgIG5vZGUgcmVwb3J0cyBpdHMgY2hpbGQnc1xuICogZmFpbHVyZSB0aGUgcnVuIGFib3J0cyBiZWZvcmUgdGhlIHJlYXNvbiBpcyB3cml0dGVuIGVpdGhlciBcdTIwMTQgdGhlIGFnZW50IGxvc2VzXG4gKiB0aGUgd2hvbGUgZXNjYWxhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IENhc2VFc2NhbGF0aW9uU3RhbXBGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnY2FzZV9lc2NhbGF0aW9uX3N0YW1wJyxcbiAgbGFiZWw6ICdTdGFtcCBDYXNlIEVzY2FsYXRpb24nLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnV3JpdGUgdGhlIHR3byByZWFkb25seSBlc2NhbGF0aW9uIHN0YW1wcyAoaXNfZXNjYWxhdGVkLCBlc2NhbGF0ZWRfZGF0ZSkgd2l0aCB0aGUgc3lzdGVtIGNvbnRleHQuIENhbGxlZCBieSBlc2NhbGF0ZV9jYXNlIHRocm91Z2ggYSBzdWJmbG93IG5vZGUuJyxcbiAgdHlwZTogJ2F1dG9sYXVuY2hlZCcsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG5cbiAgLy8gXHUyQjUwIFRIRSBFTlRJUkUgUE9JTlQgT0YgVEhJUyBGSUxFLiBUaGlzIGlzIHRoZSBvbmx5IGVsZXZhdGlvbiBpbiB0aGVcbiAgLy8gZXNjYWxhdGUgcGF0aCwgYW5kIGl0IGNvdmVycyBleGFjdGx5IG9uZSBgdXBkYXRlX3JlY29yZGAgbm9kZS5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuXG4gIHZhcmlhYmxlczogW1xuICAgIC8vIFN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIncyBgc3ViZmxvd2Agbm9kZSwgd2hvc2UgYGlucHV0YCBlbnZlbG9wZSByZWFkcyBpdHMgb3duIGByZWNvcmRJZGAuXG4gICAgeyBuYW1lOiAncmVjb3JkSWQnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICBdLFxuXG4gIG5vZGVzOiBbXG4gICAgLy8gYGNvbmZpZzoge31gIG1hdGNoZXMgdGhlIHNoYXBlIG1lYXN1cmVkIGluXG4gICAgLy8gYHRlc3QvcmVhZG9ubHktd3JpdGUtc2VtYW50aWNzLnRlc3QudHNgOiBhbiBhdXRvbGF1bmNoZWQgY2FsbGVlIGlzIGhhbmRlZFxuICAgIC8vIGl0cyBwYXJhbXMgYnkgdGhlIGBzdWJmbG93YCBleGVjdXRvciBhbmQgcmVzb2x2ZXMgbm8gdHJpZ2dlciByZWNvcmQgb2ZcbiAgICAvLyBpdHMgb3duLCBzbyB0aGVyZSBpcyBubyBgb2JqZWN0TmFtZWAgZm9yIHRoZSBzdGFydCBub2RlIHRvIGxvYWQuXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCcsIGNvbmZpZzoge30gfSxcbiAgICB7XG4gICAgICBpZDogJ3N0YW1wJywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ1N0YW1wIEVzY2FsYXRpb24gRmxhZ3MnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fY2FzZScsXG4gICAgICAgIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZElkYCB9LFxuICAgICAgICAvLyBcdTI2RDQgRG8gbm90IGFkZCBmaWVsZHMgaGVyZS4gRXZlcnkgY29sdW1uIGluIHRoaXMgbm9kZSBpcyB3cml0dGVuIHdpdGhcbiAgICAgICAgLy8gdGhlIGVsZXZhdGVkIGNvbnRleHQ7IGFueXRoaW5nIGEgdXNlciBjYW4gbGVnaXRpbWF0ZWx5IHR5cGUgYmVsb25nc1xuICAgICAgICAvLyBpbiBgZXNjYWxhdGVfY2FzZWAgaW5zdGVhZC5cbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgaXNfZXNjYWxhdGVkOiB0cnVlLFxuICAgICAgICAgIGVzY2FsYXRlZF9kYXRlOiBjZWxgaXNvRGF0ZXRpbWUobm93KCkpYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdzdGFtcCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ3N0YW1wJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9mbG93cy9jYXNlLXNsYS1tb25pdG9yLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2Zsb3dzL2Nhc2Utc2xhLW1vbml0b3IuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUCwgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xuaW1wb3J0IHsgZ3VhcmRlZCB9IGZyb20gJy4uLy4uL3NhbGVzL2Zsb3dzL19ndWFyZGVkLWl0ZXJhdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogQ2FzZSBTTEEgTW9uaXRvciBcdTIwMTQgc2NoZWR1bGVkIGJyZWFjaCBkZXRlY3Rpb24uXG4gKlxuICogQ29tcGxlbWVudHMgYGNhc2VfZXNjYWxhdGlvbmAgKHdoaWNoIHJlYWN0cyB0byAqcHJpb3JpdHkqIHRoZSBtb21lbnQgYSBjYXNlXG4gKiBpcyBzYXZlZCkgYnkgYWRkaW5nIHRoZSBtaXNzaW5nICp0aW1lKiBkaW1lbnNpb24uIFRoZSBzY2hlbWEgY2Fycmllc1xuICogYHNsYV9kdWVfZGF0ZWAgYW5kIGBpc19zbGFfdmlvbGF0ZWRgLCBidXQgbm90aGluZyB3YXRjaGVkIHRoZSBjbG9jayBcdTIwMTQgYSBjYXNlXG4gKiBjb3VsZCBzaWxlbnRseSBibG93IGl0cyBTTEEuIFRoaXMgZmxvdyBzd2VlcHMgb3BlbiAobm90IHJlc29sdmVkL2Nsb3NlZClcbiAqIGNhc2VzIHdob3NlIGBzbGFfZHVlX2RhdGVgIGhhcyBwYXNzZWQsIHN0YW1wcyB0aGUgYnJlYWNoLCBlc2NhbGF0ZXMsIGFuZFxuICogYWxlcnRzIHRoZSBvd25lci5cbiAqXG4gKiBBIGJyZWFjaGVkIGNhc2Ugd2l0aCBOTyBvd25lciBpcyB0aGUgaGFyZCBjYXNlLCBhbmQgaXQgaXMgYW5zd2VyZWQgaW4gdHdvXG4gKiBoYWx2ZXMuIFRoZSBlc2NhbGF0aW9uIHRoZSBzd2VlcCB3cml0ZXMgaXMgaXRzZWxmIHdoYXQgZ2l2ZXMgdGhlIGNhc2UgYW5cbiAqIG93bmVyIFx1MjAxNCBgY2FzZV9lc2NhbGF0aW9uX3JlYXNzaWduYCByaWRlcyBvbiB0aGF0IHVwZGF0ZSBhbmQgaGFuZHMgdGhlIGNhc2UgdG9cbiAqIHRoZSBsZWFzdC1sb2FkZWQgYHNlcnZpY2VfbWFuYWdlcmAgXHUyMDE0IHNvIHRoaXMgZmxvdyByZS1yZWFkcyB0aGUgY2FzZVxuICogYWZ0ZXJ3YXJkcyBhbmQgYWxlcnRzIHdob2V2ZXIgaXQgbm93IGJlbG9uZ3MgdG8uIFdoZW4gdGhlIHBvb2wgaXMgZW1wdHkgdGhlXG4gKiBhc3NpZ25tZW50IGlzIGEgbm8tb3AsIHRoZSBjYXNlIHN0YXlzIHVub3duZWQsIHRoZSBhbGVydCBpcyBza2lwcGVkIGF0IGFcbiAqIG5hbWVkIGdhdGUsIGFuZCB0aGUgUlVOIFNVUlZJVkVTOiB0aGUgYnJlYWNoIGlzIHN0aWxsIHJlY29yZGVkIGFuZCBldmVyeVxuICogb3RoZXIgYnJlYWNoZWQgY2FzZSBpcyBzdGlsbCBzd2VwdC4gXHUyNkQ0IE5vIGZhbGxiYWNrIHJlY2lwaWVudCwgbm9cbiAqIG1hbmFnZXItY2hhaW4gZG90LXdhbGssIG5vIGhhcmQgZmFpbHVyZSAobWFpbnRhaW5lciBydWxpbmcgMjAyNi0wOS0wMykuXG4gKlxuICogQ2FwYWJpbGl0aWVzIGV4ZXJjaXNlZDogc2NoZWR1bGVkIHRyaWdnZXIgKyBgbG9vcGAgKyBgdXBkYXRlX3JlY29yZGAgK1xuICogYGdldF9yZWNvcmRgICsgYG5vdGlmeWAuXG4gKi9cblxuLyoqXG4gKiBcIlRoZSBjYXNlIGluIGhhbmQgY2FycmllcyBhbiBvd25lciB0aGUgYG5vdGlmeWAgbm9kZSBjYW4gYWRkcmVzcy5cIlxuICpcbiAqIEF1dGhvcmVkIE9OQ0UgYW5kIHVzZWQgb24gdHdvIGVkZ2VzIChgYjJgIGFuZCBgYjVgKSBiZWNhdXNlIHRoZSB0d28gYXNrIHRoZVxuICogc2FtZSBxdWVzdGlvbiBhdCB0d28gcG9pbnRzIGluIHRoZSBpdGVyYXRpb24gXHUyMDE0IGJlZm9yZSB0aGUgc3dlZXAncyB3cml0ZSBhbmRcbiAqIGFmdGVyIGl0IFx1MjAxNCBhbmQgYSBoYW5kLWNvcGllZCBzZWNvbmQgc3BlbGxpbmcgaXMgZXhhY3RseSB0aGUgZHJpZnQgbWVhc3VyZWQgb25cbiAqIGRlY2lzaW9uIG5vZGVzLiB7QGxpbmsgQ0FTRV9IQVNfTk9fT1dORVJ9IGlzIGl0cyBjb21wbGVtZW50LlxuICpcbiAqIFRPVEFMSVRZOiBgY3VycmVudENhc2VgIGlzIGEgTE9PUCBJVEVNIG92ZXIgYGNhc2VMaXN0YCwgd2hpY2hcbiAqIGBnZXRfcmVjb3JkYCBmaWxsZWQgZnJvbSBgZGF0YS5maW5kYCBcdTIwMTQgZXZlcnkgZWxlbWVudCBpcyBhIHJhdyBkcml2ZXIgcm93LFxuICogc3BhcnNlIGluIHRoZSB3YXkgYSByYXcgZHJpdmVyIHJvdyBpcy4gQSBjYXNlIHRoYXQgd2FzIG5ldmVyIHdyaXR0ZW4gd2l0aFxuICogYW4gYG93bmVyX2lkYCBjb2x1bW4gY2FycmllcyBubyBrZXkgYXQgYWxsLCBzbyBgaGFzKClgIGlzIHRoZSBvbmx5IHRvdGFsXG4gKiBhY2Nlc3NvcjsgYW4gdW5ndWFyZGVkIGB2YXJzLmN1cnJlbnRDYXNlLm93bmVyX2lkICE9IG51bGxgIGFib3J0cyB3aXRoXG4gKiBgTm8gc3VjaCBrZXlgIGFuZCB0YWtlcyB0aGUgcnVuIGRvd24gdGhlIHNhbWUgd2F5IGFuIGVtcHR5IHJlY2lwaWVudCBzbGF0ZVxuICogb25jZSBkaWQuXG4gKlxuICogRXZlcnkgdGVybSBpcyBsb2FkLWJlYXJpbmcsIGFuZCB0aGUgbGFzdCBvbmUgTUlSUk9SUyBUSEUgTk9USUZZIE5PREUnUyBPV05cbiAqIGVtcHRpbmVzcyBydWxlIHJhdGhlciB0aGFuIGd1ZXNzaW5nIGF0IGl0OiBidWlsdGluIGBub3RpZnlgIGJ1aWxkcyBpdHNcbiAqIGF1ZGllbmNlIHdpdGggYFN0cmluZyh2KS50cmltKClgICsgYC5maWx0ZXIoQm9vbGVhbilgLCBzbyBudWxsLCB1bmRlZmluZWQsXG4gKiBgJydgIEFORCBhbnkgYWxsLXdoaXRlc3BhY2UgdmFsdWUgYWxsIGNvbGxhcHNlIHRvIHRoZSBzYW1lIGVtcHR5IHNsYXRlLlxuICogTWVhc3VyZWQ6IGAnICAgJyAhPSBcIlwiYCBpcyBUUlVFIGluIENFTCwgc28gYSBnYXRlIHdyaXR0ZW4gdGhhdCB3YXkgb3BlbmVkIGZvclxuICogYSB3aGl0ZXNwYWNlIGBvd25lcl9pZGAgYW5kIHJlcHJvZHVjZWQgdGhpcyB2ZXJ5IGRlZmVjdCBvbmUgaW5wdXQgbmFycm93ZXIuXG4gKiBgc3RyaW5nKC4uLikudHJpbSgpICE9IFwiXCJgIGlzIHRoZSBzYW1lIHByZWRpY2F0ZSB0aGUgbm9kZSBhcHBsaWVzLCBpbiBDRUwuXG4gKlxuICogVGhlIGBzdHJpbmcoKWAgd3JhcCBpcyBub3QgZGVjb3JhdGlvbjogYmFyZSBgLm1hdGNoZXMoKWAgLyBgLnRyaW0oKWAgb24gYVxuICogbm9uLXN0cmluZyBpZCBmYWlscyB3aXRoIGBubyBtYXRjaGluZyBvdmVybG9hZGAsIHdoaWNoIGlzIGEgdGhyb3duIGNvbmRpdGlvblxuICogXHUyMDE0IHRoZSBmYXVsdCBtb2RlIHRoaXMgZmxvdyBleGlzdHMgdG8ga2VlcCBvdXQuIGBzdHJpbmcoKWAgaXMgdG90YWwgZm9yIGV2ZXJ5XG4gKiBub24tbnVsbCBzY2FsYXIsIGFuZCB0aGUgYCE9IG51bGxgIHRlcm0gaW4gZnJvbnQgc2hvcnQtY2lyY3VpdHMgYmVmb3JlIGl0IGNhblxuICogYmUgaGFuZGVkIGEgbnVsbCAoYHN0cmluZyhudWxsKWAgaGFzIG5vIG92ZXJsb2FkIGVpdGhlcikuXG4gKi9cbmNvbnN0IENBU0VfSEFTX09XTkVSID0gKCkgPT4gUGBoYXModmFycy5jdXJyZW50Q2FzZSkgJiYgaGFzKHZhcnMuY3VycmVudENhc2Uub3duZXJfaWQpXG4gICYmIHZhcnMuY3VycmVudENhc2Uub3duZXJfaWQgIT0gbnVsbCAmJiBzdHJpbmcodmFycy5jdXJyZW50Q2FzZS5vd25lcl9pZCkudHJpbSgpICE9IFwiXCJgO1xuXG4vKipcbiAqIFRoZSBleGFjdCBjb21wbGVtZW50IG9mIHtAbGluayBDQVNFX0hBU19PV05FUn0sIGluIHRoZSBvcHBvc2l0ZSBwb2xhcml0eSB0aGVcbiAqIGhvdXNlIHJ1bGUgcHJlc2NyaWJlcyBmb3IgYSBwYXJ0aXRpb24gKGAhaGFzKHgpIHx8IFx1MjAyNiBgKS5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgYGhhcyh2YXJzLmN1cnJlbnRDYXNlKWAgbGVhZHMgQk9USCBwcmVkaWNhdGVzIHJhdGhlciB0aGFuIGJlaW5nIG5lZ2F0ZWRcbiAqIGhlcmUsIHNvIHRoZSB0d28gZWRnZXMgcGFydGl0aW9uIG9ubHkgdGhlIGNhc2VzIHdoZXJlIHRoZSBpdGVyYXRvciBpcyBib3VuZC5cbiAqIFRoYXQgYXN5bW1ldHJ5IGlzIGRlbGliZXJhdGU6IHdpdGggbm8gYGN1cnJlbnRDYXNlYCBhdCBhbGwgTkVJVEhFUiBlZGdlXG4gKiBtYXRjaGVzIGFuZCB0aGUgaXRlcmF0aW9uIHNpbXBseSBlbmRzIFx1MjAxNCB0aGUgcHJlLWV4aXN0aW5nIGJlaGF2aW91ciBcdTIwMTQgaW5zdGVhZFxuICogb2Ygcm91dGluZyBhbiB1bmJpbmRhYmxlIHJvdyBpbnRvIGByZWxvYWRfY2FzZWAsIHdob3NlIGB7Y3VycmVudENhc2UuaWR9YFxuICogZmlsdGVyIHRva2VuIHdvdWxkIHRoZW4gcmVzb2x2ZSB0byBub3RoaW5nIGFuZCBtYWtlIGBnZXRfcmVjb3JkYCBSRUZVU0UgdGhlXG4gKiBzdGVwLCBraWxsaW5nIHRoZSBydW4gZm9yIHRoZSBleGFjdCByZWFzb24gdGhpcyBmbG93IHdhcyByZXBhaXJlZC5cbiAqL1xuY29uc3QgQ0FTRV9IQVNfTk9fT1dORVIgPSAoKSA9PiBQYGhhcyh2YXJzLmN1cnJlbnRDYXNlKSAmJiAoIWhhcyh2YXJzLmN1cnJlbnRDYXNlLm93bmVyX2lkKVxuICB8fCB2YXJzLmN1cnJlbnRDYXNlLm93bmVyX2lkID09IG51bGwgfHwgc3RyaW5nKHZhcnMuY3VycmVudENhc2Uub3duZXJfaWQpLnRyaW0oKSA9PSBcIlwiKWA7XG5cbmV4cG9ydCBjb25zdCBDYXNlU2xhTW9uaXRvckZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICdjYXNlX3NsYV9tb25pdG9yJyxcbiAgbGFiZWw6ICdDYXNlIFNMQSBNb25pdG9yJyxcbiAgZGVzY3JpcHRpb246ICdIb3VybHkgc3dlZXA6IGZsYWcgYW5kIGVzY2FsYXRlIG9wZW4gY2FzZXMgdGhhdCBoYXZlIGJyZWFjaGVkIHRoZWlyIFNMQSBkdWUgZGF0ZS4nLFxuICB0eXBlOiAnc2NoZWR1bGUnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBTY2hlZHVsZWQgcnVucyBoYXZlIG5vIHRyaWdnZXIgdXNlciwgc28gdW5kZXIgdGhlIGRlZmF1bHQgcnVuQXM6J3VzZXInIHRoZVxuICAvLyBkYXRhIG5vZGVzIGV4ZWN1dGUgVU5TQ09QRUQgYW55d2F5LiBEZWNsYXJlIHJ1bkFzOidzeXN0ZW0nIHRvIG1ha2UgdGhhdFxuICAvLyBSTFMtYnlwYXNzaW5nIGVsZXZhdGlvbiBleHBsaWNpdCBhbmQgaW50ZW5kZWQgKEFEUi0wMDQ5KS5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuXG4gIHZhcmlhYmxlczogW10sXG5cbiAgbm9kZXM6IFtcbiAgICB7IGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0IChob3VybHkpJywgY29uZmlnOiB7IHNjaGVkdWxlOiAnMCAqICogKiAqJyB9IH0sXG4gICAge1xuICAgICAgaWQ6ICdxdWVyeV9icmVhY2hlZCcsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdGaW5kIEJyZWFjaGVkIENhc2VzJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2Nhc2UnLFxuICAgICAgICAvLyBcdTI2RDQgYCRuaW5gIG9uIGBzdGF0dXNgLCBuZXZlciBgaXNfY2xvc2VkOiBmYWxzZWA6IGEgY2FzZSBpbiBgcmVzb2x2ZWRgXG4gICAgICAgIC8vIGhhcyBtZXQgaXRzIFNMQSBcdTIwMTQgd29yayBpcyBmaW5pc2hlZCBcdTIwMTQgYnV0IGBpc19jbG9zZWRgIG9ubHkgZmxpcHMgb25cbiAgICAgICAgLy8gYGNsb3NlZGAsIHNvIHRoZSBib29sZWFuIGZpbHRlciBzdGFtcHMgZmFsc2UgYnJlYWNoZXMgb24gcmVzb2x2ZWRcbiAgICAgICAgLy8gY2FzZXMgYW5kIGRyYWdzIHRoZW0gYmFjayB0byBgZXNjYWxhdGVkYC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYCRsdGAgaXMgYGNhc2VTbGFCcmVhY2hlZGAgKGBzcmMvc2VydmljZS9vYmplY3RzL19jYXNlLXNsYS50c2ApIHJlYWRcbiAgICAgICAgLy8gd2l0aCBcIm5vd1wiIGFzIHRoZSBpbnN0YW50OiBTVFJJQ1RMWSBwYXN0IGR1ZS4gSXRzIG90aGVyIGhhbGYgaXNcbiAgICAgICAgLy8gYGNhc2Vfc2xhX2RlZmF1bHRzYCwgd2hpY2ggYXBwbGllcyB0aGUgc2FtZSBydWxlIG9uIHRoZSB3cml0ZSB0aGF0XG4gICAgICAgIC8vIHNldHRsZXMgYSBjYXNlIFx1MjAxNCBzbyBhIGNhc2Ugc2V0dGxlZCBsYXRlIGlzIGZsYWdnZWQgZXZlbiB3aGVuIHRoaXNcbiAgICAgICAgLy8gc3dlZXAgbmV2ZXIgcmVhY2hlZCBpdCwgb3IgbmV2ZXIgcnVucyAoIzIwNzApLlxuICAgICAgICAvL1xuICAgICAgICAvLyBcIk5vd1wiIGlzIHRoZSBxdWVyeSBlbmdpbmUncyBvd24gYHtub3d9YCBwbGFjZWhvbGRlciwgd2hpY2ggYW5cbiAgICAgICAgLy8gMTguMC4wLW5leHQuMCBmaWx0ZXIgb3BlcmFuZCBsZWF2ZXMgdG8gdGhlIGVuZ2luZSBhcyB3cml0dGVuLiBJdFxuICAgICAgICAvLyByZW5kZXJzIHRoZSBpbnN0YW50J3MgSVNPIHRleHQsIGFzIHRoZSByZXRpcmVkIGB7Tk9XKCl9YCBmbG93IHRva2VuXG4gICAgICAgIC8vIGRpZCwgYW5kIGl0IGlzIHRoZSBzcGVsbGluZyB0aGUgU0xBIFZpb2xhdGlvbnMgdGlsZSByZWFkcywgc28gdGhlXG4gICAgICAgIC8vIHN3ZWVwIGFuZCB0aGUgdGlsZSBzYXkgXCJwYXN0IGR1ZVwiIGluIG9uZSB3b3JkaW5nLlxuICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICBzdGF0dXM6IHsgJG5pbjogWydyZXNvbHZlZCcsICdjbG9zZWQnXSB9LFxuICAgICAgICAgIGlzX3NsYV92aW9sYXRlZDogZmFsc2UsXG4gICAgICAgICAgc2xhX2R1ZV9kYXRlOiB7ICRsdDogJ3tub3d9JyB9LFxuICAgICAgICB9LFxuICAgICAgICBsaW1pdDogNTAwLFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2Nhc2VMaXN0JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2xvb3BfY2FzZXMnLCB0eXBlOiAnbG9vcCcsIGxhYmVsOiAnRm9yIEVhY2ggQnJlYWNoZWQgQ2FzZScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgY29sbGVjdGlvbjogY2VsYGNhc2VMaXN0YCxcbiAgICAgICAgaXRlcmF0b3JWYXJpYWJsZTogJ2N1cnJlbnRDYXNlJyxcbiAgICAgICAgYm9keTogZ3VhcmRlZCgnY2FzZScsIHtcbiAgICAgICAgICBub2RlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogJ2ZsYWdfYnJlYWNoJywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ0ZsYWcgU0xBIEJyZWFjaCcsXG4gICAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fY2FzZScsXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7IGlkOiBjZWxgY3VycmVudENhc2UuaWRgIH0sXG4gICAgICAgICAgICAgICAgLy8gYGVzY2FsYXRpb25fcmVhc29uYCBtdXN0IGFjY29tcGFueSBgaXNfZXNjYWxhdGVkOiB0cnVlYCBcdTIwMTQgdGhlXG4gICAgICAgICAgICAgICAgLy8gb2JqZWN0J3MgYGVzY2FsYXRpb25fcmVhc29uX3JlcXVpcmVkYCB2YWxpZGF0aW9uIChzZXZlcml0eTpcbiAgICAgICAgICAgICAgICAvLyBlcnJvcikgcmVqZWN0cyB0aGUgd2hvbGUgd3JpdGUgb3RoZXJ3aXNlLCB0dXJuaW5nIHRoaXMgc3dlZXBcbiAgICAgICAgICAgICAgICAvLyBpbnRvIGEgc2lsZW50IG5vLW9wIChjZi4gdGhlIHNhbWUgZml4IGluIGNhc2VfZXNjYWxhdGlvbikuXG4gICAgICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgICAgICBpc19zbGFfdmlvbGF0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICBpc19lc2NhbGF0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICBzdGF0dXM6ICdlc2NhbGF0ZWQnLFxuICAgICAgICAgICAgICAgICAgZXNjYWxhdGVkX2RhdGU6IGNlbGBpc29EYXRldGltZShub3coKSlgLFxuICAgICAgICAgICAgICAgICAgZXNjYWxhdGlvbl9yZWFzb246ICdBdXRvLWVzY2FsYXRlZDogU0xBIGR1ZSBkYXRlIGJyZWFjaGVkJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gR2F0ZXdheSBvbmx5IFx1MjAxNCB0aGUgcHJlZGljYXRlIGxpdmVzIG9uIHRoZSBvdXQtZWRnZS5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gYGNybV9jYXNlLm93bmVyX2lkYCBpcyBOVUxMQUJMRSBhbmQgYW4gdW5vd25lZCBjYXNlIGlzIGFuXG4gICAgICAgICAgICAgIC8vIG9yZGluYXJ5IHN0YXRlICh0aGlzIHJlcG8gc2hpcHMgYHNjcmlwdHMvYmFja2ZpbGwtb3duZXItaWQudHNgIC9cbiAgICAgICAgICAgICAgLy8gYHBucG0gYmFja2ZpbGw6b3duZXJgIHByZWNpc2VseSBiZWNhdXNlIG93bmVybGVzcyByb3dzIGhhcHBlbjtcbiAgICAgICAgICAgICAgLy8gb3JkaW5hcnkgUkVTVCBjcmVhdGlvbiBhbmQgaW1wb3J0IHJlYWNoIGl0IHRvbykuIFRoZSBgbm90aWZ5YFxuICAgICAgICAgICAgICAvLyBub2RlIGJlbG93IGFkZHJlc3NlcyBleGFjdGx5IG9uZSByZWNpcGllbnQsIHNvIGFuIG93bmVybGVzcyBjYXNlXG4gICAgICAgICAgICAgIC8vIGxlZnQgaXQgd2l0aCBhbiBlbXB0eSBzbGF0ZSBcdTIwMTQgd2hpY2ggdGhlIGJ1aWx0aW4gbm9kZSB0cmVhdHMgYXMgYVxuICAgICAgICAgICAgICAvLyBIQVJEIGZhaWx1cmUsIGFuZCB0aGF0IGZhaWx1cmUgaXMgbm90IHNjb3BlZCB0byB0aGUgb25lIGNhc2U6XG4gICAgICAgICAgICAgIC8vIGBleGVjdXRlTm9kZWAgdGhyb3dzLCBgcnVuUmVnaW9uYCByZXRocm93cywgYW5kIHRoZSBgbG9vcGAgbm9kZVxuICAgICAgICAgICAgICAvLyBhd2FpdHMgaXQgd2l0aCBubyB0cnkvY2F0Y2gsIHNvIHRoZSB3aG9sZSBzd2VlcCBkaWVkIG9uIHRoZVxuICAgICAgICAgICAgICAvLyBvd25lcmxlc3Mgcm93IGFuZCBldmVyeSBicmVhY2hlZCBjYXNlIE9SREVSRUQgQkVISU5EIElUIHdhc1xuICAgICAgICAgICAgICAvLyBuZXZlciBldmVuIGZsYWdnZWQuIE1lYXN1cmVkLCBub3QgYXNzdW1lZCBcdTIwMTQgc2VlXG4gICAgICAgICAgICAgIC8vIGB0ZXN0L2Zsb3ctc2xhLW93bmVybGVzcy1jYXNlLnRlc3QudHNgLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBUaGUgZ2F0ZSBzaXRzIEFGVEVSIGBmbGFnX2JyZWFjaGAgb24gcHVycG9zZS4gYGZsYWdfYnJlYWNoYCBpc1xuICAgICAgICAgICAgICAvLyB1bmNvbmRpdGlvbmFsLCBzbyBhbiBvd25lcmxlc3MgYnJlYWNoIGlzIHN0aWxsIFJFQ09SREVEIG9uIHRoZVxuICAgICAgICAgICAgICAvLyByZWNvcmQgXHUyMDE0IHZpc2libGUgaW4gdmlld3MgYW5kIHJlcG9ydHMsIHdoZXJlIGEgc2VydmljZSBtYW5hZ2VyXG4gICAgICAgICAgICAgIC8vIGZpbmRzIGl0LiBHYXRpbmcgYm90aCB3b3VsZCB0cmFkZSBhIGRlYWQgcnVuIGZvciBhIHNpbGVudGx5XG4gICAgICAgICAgICAgIC8vIGRyb3BwZWQgYWxlcnQgb24gZXhhY3RseSB0aGUgY2FzZXMgbW9zdCBsaWtlbHkgdG8gYmUgbmVnbGVjdGVkLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBUaGUgb3duZXJsZXNzIGJyYW5jaCBpcyBub3QgYSBkZWFkIGVuZDogaXQgZ29lcyB0b1xuICAgICAgICAgICAgICAvLyBgcmVsb2FkX2Nhc2VgLCBiZWNhdXNlIGJ5IHRoZSB0aW1lIHRoZSBnYXRlIGlzIHJlYWNoZWQgdGhlXG4gICAgICAgICAgICAgIC8vIHN3ZWVwJ3Mgb3duIHdyaXRlIG1heSBBTFJFQURZIEhBVkUgR0lWRU4gVEhFIENBU0UgQU4gT1dORVIgXHUyMDE0XG4gICAgICAgICAgICAgIC8vIHNlZSB0aGF0IG5vZGUgKG1haW50YWluZXIgcnVsaW5nIDIwMjYtMDktMDMsIG9wdGlvbiBDKS5cbiAgICAgICAgICAgICAgaWQ6ICdjaGVja19vd25lcicsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnQ2FzZSBIYXMgYW4gT3duZXI/JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIFJlLXJlYWQgdGhlIGNhc2UgdGhlIHN3ZWVwIGp1c3Qgd3JvdGUuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFx1MjZBMFx1RkUwRiBUSEUgQVNTSUdOTUVOVCBJUyBOT1QgQVVUSE9SRUQgSEVSRSwgQU5EIE1VU1QgTk9UIEJFLlxuICAgICAgICAgICAgICAvLyBgZmxhZ19icmVhY2hgIHdyaXRlcyBgc3RhdHVzOiAnZXNjYWxhdGVkJ2AsIGFuZCB0aGF0IElTIHRoZVxuICAgICAgICAgICAgICAvLyBlc2NhbGF0aW9uIHRyYW5zaXRpb24gYGNhc2VfZXNjYWxhdGlvbl9yZWFzc2lnbmBcbiAgICAgICAgICAgICAgLy8gKGBzcmMvc2VydmljZS9vYmplY3RzL19jYXNlLWFzc2lnbm1lbnQudHNgLCBgYmVmb3JlVXBkYXRlYCwgcHJpb3JpdHlcbiAgICAgICAgICAgICAgLy8gMjUwKSBmaXJlcyBvbjogaXQgc3RhbXBzIHRoZSBsZWFzdC1sb2FkZWQgaG9sZGVyIG9mIHRoZVxuICAgICAgICAgICAgICAvLyBgc2VydmljZV9tYW5hZ2VyYCBwb3NpdGlvbiBvbnRvIHRoZSBwYXlsb2FkIG9mIHRoZSB1cGRhdGVcbiAgICAgICAgICAgICAgLy8gYWxyZWFkeSBpbiBmbGlnaHQuIFNvIHRoZSBzd2VlcCBkb2VzIG5vdCBuZWVkIGEgc2VhbSB0byBcImNhbGxcIlxuICAgICAgICAgICAgICAvLyB0aGUgYXNzaWdubWVudCBcdTIwMTQgcGVyZm9ybWluZyB0aGUgdHJhbnNpdGlvbiBJUyBwdXR0aW5nIHRoZSBjYXNlXG4gICAgICAgICAgICAgIC8vIHRocm91Z2ggaXQsIGFuZCB0aGUgYXBwIGtlZXBzIE9ORSBhbnN3ZXIgdG8gXCJ3aG8gc2hvdWxkIG93blxuICAgICAgICAgICAgICAvLyB0aGlzIGNhc2VcIiBpbnN0ZWFkIG9mIGEgZmxvdy1zaGFwZWQgc2Vjb25kIGltcGxlbWVudGF0aW9uIG9mXG4gICAgICAgICAgICAgIC8vIGxlYXN0LWxvYWRlZCBiYWxhbmNpbmcuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIE1FQVNVUkVELCBub3QgYXNzdW1lZCAoYHRlc3QvZmxvdy1zbGEtb3duZXJsZXNzLWNhc2UudGVzdC50c2BcbiAgICAgICAgICAgICAgLy8gZHJpdmVzIHRoZSByZWFsIGZsb3csIHRoZSByZWFsIGVuZ2luZSBhbmQgdGhlIHJlYWwgaG9va3MpOiB3aXRoXG4gICAgICAgICAgICAgIC8vIGEgc3RhZmZlZCBwb29sIGFuIG93bmVybGVzcyBicmVhY2hlZCBjYXNlIGNvbWVzIGJhY2sgb3duZWQ7IHdpdGhcbiAgICAgICAgICAgICAgLy8gYW4gZW1wdHkgcG9vbCB0aGUgaG9vayBzdGFuZHMgZG93biBhbmQgdGhlIGNhc2UgY29tZXMgYmFja1xuICAgICAgICAgICAgICAvLyBvd25lcmxlc3MuIE5vIHNlY29uZCB3cml0ZSwgbm8gcmUtZW50cnksIG5vIGxvb3AgXHUyMDE0IHRoZSBob29rXG4gICAgICAgICAgICAgIC8vIG11dGF0ZXMgdGhlIGluLWZsaWdodCBwYXlsb2FkIGFuZCBpc3N1ZXMgbm8gb3BlcmF0aW9uIG9mIGl0c1xuICAgICAgICAgICAgICAvLyBvd24uXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFx1MjZENCBUaGUgUkVBRCBpcyB3aGF0IHRoaXMgbm9kZSBpcyBmb3IsIG5vdCBhIHNlY29uZCB3cml0ZTpcbiAgICAgICAgICAgICAgLy8gYGN1cnJlbnRDYXNlYCBpcyB0aGUgbG9vcCBpdGVtIGJvdW5kIGJ5IGBxdWVyeV9icmVhY2hlZGAgQkVGT1JFXG4gICAgICAgICAgICAgIC8vIGBmbGFnX2JyZWFjaGAgcmFuLCBzbyB0aGUgb3duZXIgdGhlIHN3ZWVwIGp1c3QgYXNzaWduZWQgaXNcbiAgICAgICAgICAgICAgLy8gaW52aXNpYmxlIHRvIGl0IGFuZCBge2N1cnJlbnRDYXNlLm93bmVyX2lkfWAgYWRkcmVzc2VzIHRoZVxuICAgICAgICAgICAgICAvLyBwcmUtd3JpdGUgc3RhdGUuIFJlLWJpbmRpbmcgdGhlIFNBTUUgdmFyaWFibGUgaXMgd2hhdCBtYWtlcyB0aGVcbiAgICAgICAgICAgICAgLy8gcmVzdCBvZiB0aGUgaXRlcmF0aW9uIFx1MjAxNCB0aGUgZ2F0ZSBiZWxvdyBhbmQgdGhlIG5vdGlmeSBub2RlJ3NcbiAgICAgICAgICAgICAgLy8gd2hvbGUgdGVtcGxhdGUgXHUyMDE0IHJlYWQgdGhlIGNhc2UgYXMgaXQgbm93IHN0YW5kcywgd2l0aCBubyBzZWNvbmRcbiAgICAgICAgICAgICAgLy8gbm90aWZ5IG5vZGUgdG8ga2VlcCBpbiBzdGVwLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBObyBgbGltaXRgOiBgZ2V0X3JlY29yZGAgY2FsbHMgYGZpbmRPbmVgIGF0IG9yIGJlbG93IDEgYW5kIGJpbmRzXG4gICAgICAgICAgICAgIC8vIHRoZSBzaW5nbGUgcm93IGl0c2VsZiwgd2hpY2ggaXMgd2hhdCBge2N1cnJlbnRDYXNlLjxmaWVsZD59YFxuICAgICAgICAgICAgICAvLyBuZWVkcy4gQSBtaXNzIGJpbmRzIGBudWxsYCBcdTIwMTQgYGdldF9yZWNvcmRgIGFsd2F5cyBiaW5kcyBcdTIwMTQgd2hpY2hcbiAgICAgICAgICAgICAgLy8gYGNoZWNrX2Fzc2lnbmVkYCBiZWxvdyBpcyB0aGVyZSB0byByZWFkLlxuICAgICAgICAgICAgICBpZDogJ3JlbG9hZF9jYXNlJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ1JlLXJlYWQgQ2FzZSBBZnRlciBFc2NhbGF0aW9uJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9jYXNlJyxcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGBjdXJyZW50Q2FzZS5pZGAgfSxcbiAgICAgICAgICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2N1cnJlbnRDYXNlJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIEdhdGV3YXkgb25seSBcdTIwMTQgdGhlIHByZWRpY2F0ZSBsaXZlcyBvbiB0aGUgb3V0LWVkZ2UuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFRoZSBydWxlZCBlbXB0eS1wb29sIGNsYXVzZSwgYXMgYSBnYXRlIHJhdGhlciB0aGFuIGEgZmFpbHVyZTpcbiAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgYHNlcnZpY2VfbWFuYWdlcmAgcG9vbCByZXNvbHZlcyBlbXB0eSB0aGUgaG9vayBhc3NpZ25zXG4gICAgICAgICAgICAgIC8vIG5vYm9keSwgdGhlIHJlLXJlYWQgY2FzZSBpcyBzdGlsbCBvd25lcmxlc3MsIG5vIGVkZ2UgbWF0Y2hlcyBhbmRcbiAgICAgICAgICAgICAgLy8gdGhlIGl0ZXJhdGlvbiBlbmRzLiBUaGUgYnJlYWNoIHN0YXlzIG9uIHRoZSByZWNvcmQgYW5kIGluIHRoZVxuICAgICAgICAgICAgICAvLyBydW4gc3VtbWFyeSwgdGhlIG5vdGlmaWNhdGlvbiBpcyBza2lwcGVkIGF0IGEgTkFNRUQgZ2F0ZSwgYW5kXG4gICAgICAgICAgICAgIC8vIHRoZSBydW4gc3Vydml2ZXMuIFx1MjZENCBObyBoYXJkIGZhaWx1cmUsIG5vIGZhbGxiYWNrIHJlY2lwaWVudCwgbm9cbiAgICAgICAgICAgICAgLy8gbWFuYWdlci1jaGFpbiBkb3Qtd2Fsay5cbiAgICAgICAgICAgICAgaWQ6ICdjaGVja19hc3NpZ25lZCcsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnRXNjYWxhdGlvbiBGb3VuZCBhbiBPd25lcj8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gT3duZXIgb25seTogYHtjdXJyZW50Q2FzZS5vd25lcl9pZC5tYW5hZ2VyfWAgY2Fubm90IHRyYXZlcnNlIGFcbiAgICAgICAgICAgICAgLy8gbG9va3VwIGluIGZsb3cgdGVtcGxhdGVzIFx1MjAxNCBpdCBpbnRlcnBvbGF0ZXMgdG8gdGhlIGxpdGVyYWxcbiAgICAgICAgICAgICAgLy8gXCJ1bmRlZmluZWRcIiAoY2YuIGNhc2VfZXNjYWxhdGlvbiAvIG9wcG9ydHVuaXR5X3dvbl9hbGVydCkuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFJlYWNoZWQgZnJvbSBCT1RIIGdhdGVzLCBhbmQgdGhlIHdob2xlIHRlbXBsYXRlIHJlYWRzXG4gICAgICAgICAgICAgIC8vIGBjdXJyZW50Q2FzZWAgZWl0aGVyIHdheTogb24gdGhlIG93bmVkIGJyYW5jaCB0aGF0IGlzIHRoZSByb3dcbiAgICAgICAgICAgICAgLy8gYHF1ZXJ5X2JyZWFjaGVkYCBib3VuZCwgb24gdGhlIG93bmVybGVzcyBicmFuY2ggdGhlIHJvd1xuICAgICAgICAgICAgICAvLyBgcmVsb2FkX2Nhc2VgIHJlLWJvdW5kLiBPbmUgbm9kZSwgb25lIHdvcmRpbmcsIG9uZSByZWNpcGllbnRcbiAgICAgICAgICAgICAgLy8gcnVsZSBcdTIwMTQgYSBzZWNvbmQgbm90aWZ5IG5vZGUgd291bGQgYmUgdGhlIHNhbWUgYWxlcnQgYXV0aG9yZWRcbiAgICAgICAgICAgICAgLy8gdHdpY2UsIGZyZWUgdG8gZHJpZnQgb24gdGhlIGhhbGYgbm9ib2R5IGlzIGxvb2tpbmcgYXQuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFx1MjZBMFx1RkUwRiBUSEUgUkVDSVBJRU5UIElTIFJVTEVELCBOT1QgSU5DSURFTlRBTCBcdTIwMTQgIzE1MzUsIG1haW50YWluZXJcbiAgICAgICAgICAgICAgLy8gcnVsaW5nIDIwMjYtMDktMDcsIG9wdGlvbiBBLiBPbiBhIGJyZWFjaGVkXG4gICAgICAgICAgICAgIC8vIGNhc2UgdGhhdCBBTFJFQURZIEhBUyBBTiBPV05FUiwgYGZsYWdfYnJlYWNoYCB3cml0ZXNcbiAgICAgICAgICAgICAgLy8gYHN0YXR1czogJ2VzY2FsYXRlZCdgIGFuZCBgY2FzZV9lc2NhbGF0aW9uX3JlYXNzaWduYCBoYW5kcyB0aGVcbiAgICAgICAgICAgICAgLy8gY2FzZSB0byB0aGUgbGVhc3QtbG9hZGVkIGBzZXJ2aWNlX21hbmFnZXJgIGluc2lkZSB0aGF0IHNhbWVcbiAgICAgICAgICAgICAgLy8gd3JpdGUgXHUyMDE0IHlldCB0aGlzIG5vZGUgYWRkcmVzc2VzIGBjdXJyZW50Q2FzZWAgYXNcbiAgICAgICAgICAgICAgLy8gYHF1ZXJ5X2JyZWFjaGVkYCBib3VuZCBpdCwgQkVGT1JFIHRoZSBoYW5kLW9mZi4gU28gdGhlIGJyZWFjaFxuICAgICAgICAgICAgICAvLyBhbGVydCBkZWxpYmVyYXRlbHkgcmVhY2hlcyB0aGUgYWdlbnQgdGhlIGNhc2UgaXMgYmVpbmcgdGFrZW5cbiAgICAgICAgICAgICAgLy8gRlJPTSwgbm90IHRoZSBtYW5hZ2VyIHdobyBub3cgb3ducyBpdC5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gSXQgaXMgdGhlIFNBTUUgZXRpcXVldHRlIGBjYXNlX2VzY2FsYXRpb25gIGFscmVhZHkgc3RhdGVzIGluXG4gICAgICAgICAgICAgIC8vIGBjb250ZW50L2RvY3Mvc2VydmljZS9zbGEtYW5kLWVzY2FsYXRpb24ubWR4YCBcdTIwMTQgXCJ0aGVcbiAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIGdvZXMgdG8gdGhlIHByZXZpb3VzIG93bmVyIGFsb25lXCIgXHUyMDE0IGFuZCB0aGF0IHBhZ2VcbiAgICAgICAgICAgICAgLy8gbm93IHN0YXRlcyBpdCBmb3IgdGhpcyBzd2VlcCB0b28uIE9uZSBlc2NhbGF0aW9uIGV0aXF1ZXR0ZVxuICAgICAgICAgICAgICAvLyBhY3Jvc3MgYm90aCBtZWNoYW5pc21zLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBcdTI2RDQgRG8gbm90IFwiZml4XCIgdGhpcyBpbnRvIGFuIGFsZXJ0IGZvciB0aGUgbmV3IG93bmVyLiBUaGF0IGlzXG4gICAgICAgICAgICAgIC8vIG9wdGlvbiBDLCBhbmQgaXQgd291bGQgaGF2ZSB0byByZS1ydWxlIGBjYXNlX2VzY2FsYXRpb25gIGluIHRoZVxuICAgICAgICAgICAgICAvLyBzYW1lIHN0cm9rZSBcdTIwMTQgXHUyNkQ0IG5ldmVyIG9uZSBtZWNoYW5pc20gb25seS5cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy8gYHRlc3QvZmxvdy1zbGEtb3duZXJsZXNzLWFzc2lnbm1lbnQudGVzdC50c2AgcGlucyB0aGUgcGFpcmluZ1xuICAgICAgICAgICAgICAvLyAodGhlIG93bmVkIGJyZWFjaCBJUyBoYW5kZWQgb3ZlciBBTkQgaXRzIGFsZXJ0IHN0aWxsIGdvZXMgdG9cbiAgICAgICAgICAgICAgLy8gdGhlIHByZS1oYW5kLW9mZiBvd25lciksIGFuZCByZWNvcmRzIHRoZSBydWxpbmcncyBkZWNsYXJlZCBnYXBcbiAgICAgICAgICAgICAgLy8gYXMgbWVhc3VyZWQ6IHRoZSBoYW5kLW9mZiBob29rIGlzc3VlcyBubyBub3RpY2Ugb2YgaXRzIG93biwgc29cbiAgICAgICAgICAgICAgLy8gdGhlIHJlY2VpdmluZyBtYW5hZ2VyIGlzIHRvbGQgbm90aGluZyBieSB0aGlzIHJ1bi5cbiAgICAgICAgICAgICAgaWQ6ICdub3RpZnlfdGVhbScsIHR5cGU6ICdub3RpZnknLCBsYWJlbDogJ0FsZXJ0IE93bmVyJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgLy8gT3duZXIgb25seSBcdTIwMTQgYHtjdXJyZW50Q2FzZS5vd25lcl9pZC5tYW5hZ2VyfWAgZG90LXdhbGtzIGFcbiAgICAgICAgICAgICAgICAvLyBsb29rdXAsIHdoaWNoIGZsb3cgdGVtcGxhdGVzIGludGVycG9sYXRlIGFzIFwidW5kZWZpbmVkXCIuXG4gICAgICAgICAgICAgICAgcmVjaXBpZW50czogW2NlbGBjdXJyZW50Q2FzZS5vd25lcl9pZGBdLFxuICAgICAgICAgICAgICAgIGNoYW5uZWxzOiBbJ2luYm94JywgJ2VtYWlsJ10sXG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdjcml0aWNhbCcsXG4gICAgICAgICAgICAgICAgdG9waWM6ICdjYXNlX3NsYV9icmVhY2gnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnY3JtLmNhc2Vfc2xhX2JyZWFjaCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVEYXRhOiB7XG4gICAgICAgICAgICAgICAgICBjYXNlX251bWJlcjogY2VsYGN1cnJlbnRDYXNlLmNhc2VfbnVtYmVyYCwgcHJpb3JpdHk6IGNlbGBjdXJyZW50Q2FzZS5wcmlvcml0eWAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhY3Rpb25Vcmw6ICcvY3JtX2Nhc2Uve3tjdXJyZW50Q2FzZS5pZH19JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBlZGdlczogW1xuICAgICAgICAgICAgeyBpZDogJ2IxJywgc291cmNlOiAnZmxhZ19icmVhY2gnLCB0YXJnZXQ6ICdjaGVja19vd25lcicsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgICAgLy8gVGhlIHR3byBvdXQtZWRnZXMgb2YgYGNoZWNrX293bmVyYCBhcmUgYW4gZXhhY3QgUEFSVElUSU9OIG9mIHRoZVxuICAgICAgICAgICAgLy8gY2FzZXMgd2hlcmUgYGN1cnJlbnRDYXNlYCBpcyBib3VuZCAoc2VlIHtAbGluayBDQVNFX0hBU19PV05FUn0gL1xuICAgICAgICAgICAgLy8ge0BsaW5rIENBU0VfSEFTX05PX09XTkVSfSkgXHUyMDE0IG5ldmVyIGEgYGRlZmF1bHRgIGVkZ2UgYWxvbmdzaWRlIGFcbiAgICAgICAgICAgIC8vIGNvbmRpdGlvbmFsIG9uZSwgd2hpY2ggd291bGQgdHJhdmVyc2UgQk9USCBhbmQgbm90aWZ5IHR3aWNlLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFx1MjZBMFx1RkUwRiBUaGUgb3duZWQgYnJhbmNoIHJlYWRzIGBjdXJyZW50Q2FzZWAgYXMgYHF1ZXJ5X2JyZWFjaGVkYCBib3VuZFxuICAgICAgICAgICAgLy8gaXQsIGRlbGliZXJhdGVseTogYSBjYXNlIHRoYXQgYWxyZWFkeSBoYWQgYW5cbiAgICAgICAgICAgIC8vIG93bmVyIGtlZXBzIGFsZXJ0aW5nIFRIQVQgb3duZXIsIHdoaWNoIGlzIHdoYXQgdGhlIHN3ZWVwIGhhc1xuICAgICAgICAgICAgLy8gYWx3YXlzIGRvbmUuIFx1MjZBMFx1RkUwRiBUaGF0IGlzIFJVTEVEIGludGVudCBub3csIG5vIGxvbmdlciBhbiBvcGVuXG4gICAgICAgICAgICAvLyBxdWVzdGlvbiBcdTIwMTQgdGhlIGBub3RpZnlfdGVhbWAgbm9kZSBjYXJyaWVzIHRoZSBydWxpbmcuXG4gICAgICAgICAgICB7IGlkOiAnYjInLCBzb3VyY2U6ICdjaGVja19vd25lcicsIHRhcmdldDogJ25vdGlmeV90ZWFtJywgdHlwZTogJ2NvbmRpdGlvbmFsJywgY29uZGl0aW9uOiBDQVNFX0hBU19PV05FUigpLCBsYWJlbDogJ0hhcyBvd25lcicgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiMycsIHNvdXJjZTogJ2NoZWNrX293bmVyJywgdGFyZ2V0OiAncmVsb2FkX2Nhc2UnLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IENBU0VfSEFTX05PX09XTkVSKCksIGxhYmVsOiAnTm8gb3duZXIgXHUyMDE0IHJlLXJlYWQgYWZ0ZXIgZXNjYWxhdGlvbicgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiNCcsIHNvdXJjZTogJ3JlbG9hZF9jYXNlJywgdGFyZ2V0OiAnY2hlY2tfYXNzaWduZWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAgICAgICAgIC8vIEJvdGggYnJhbmNoZXMgY29udmVyZ2Ugb24gdGhlIE9ORSBub3RpZnkgbm9kZSwgd2hpY2ggaXMgd2h5IHRoZVxuICAgICAgICAgICAgLy8gcmUtcmVhZCByZS1iaW5kcyBgY3VycmVudENhc2VgIHJhdGhlciB0aGFuIGEgc2Vjb25kIHZhcmlhYmxlOiB0aGVcbiAgICAgICAgICAgIC8vIHJlY2lwaWVudCwgdGhlIHRpdGxlLCB0aGUgbWVzc2FnZSBhbmQgdGhlIGFjdGlvbiBVUkwgYXJlIGF1dGhvcmVkXG4gICAgICAgICAgICAvLyBvbmNlIGFuZCBjYW5ub3QgZHJpZnQgaW50byB0d28gdmVyc2lvbnMgb2YgdGhlIHNhbWUgYWxlcnQuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQSBnYXRlIHdpdGggbm8gbWF0Y2hpbmcgZWRnZSBzaW1wbHkgZW5kcyB0aGUgaXRlcmF0aW9uLCBzbyBhblxuICAgICAgICAgICAgLy8gb3duZXJsZXNzIGNhc2UgdGhlIHBvb2wgY291bGQgbm90IHBsYWNlIGlzIHNraXBwZWQgYW5kIHRoZSBsb29wXG4gICAgICAgICAgICAvLyBtb3ZlcyBvbiB0byB0aGUgbmV4dCBicmVhY2hlZCBjYXNlIFx1MjAxNCB0aGUgcnVuIHN1cnZpdmVzLCB3aGljaCBpc1xuICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5IHRoaXMgZmxvdyB3YXMgcmVwYWlyZWQgZm9yLlxuICAgICAgICAgICAgeyBpZDogJ2I1Jywgc291cmNlOiAnY2hlY2tfYXNzaWduZWQnLCB0YXJnZXQ6ICdub3RpZnlfdGVhbScsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogQ0FTRV9IQVNfT1dORVIoKSwgbGFiZWw6ICdFc2NhbGF0aW9uIGFzc2lnbmVkIGFuIG93bmVyJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG5cbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ3F1ZXJ5X2JyZWFjaGVkJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAncXVlcnlfYnJlYWNoZWQnLCB0YXJnZXQ6ICdsb29wX2Nhc2VzJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UzJywgc291cmNlOiAnbG9vcF9jYXNlcycsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL19ndWFyZGVkLWl0ZXJhdGlvbi50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9fZ3VhcmRlZC1pdGVyYXRpb24udHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogUGVyLWl0ZXJhdGlvbiBjb250YWlubWVudCBmb3IgYGxvb3BgIGJvZGllcyBcdTIwMTQgdGhlIG9uZSBzcGVsbGluZywgaW4gb25lIHBsYWNlLlxuICpcbiAqICMjIFRoZSBkZWZlY3QgdGhpcyBjbG9zZXNcbiAqXG4gKiBgbG9vcC1ub2RlLnRzYCBpdGVyYXRlcyBpdHMgYm9keSB3aXRoIGEgYmFyZSBgYXdhaXRgIGFuZCBoYXMgbm8gYHRyeWAvYGNhdGNoYFxuICogYXQgYWxsLCBzbyBhIGJvZHkgbm9kZSB0aGF0IHJldHVybnMgYHN1Y2Nlc3M6IGZhbHNlYCBvciB0aHJvd3MgcHJvcGFnYXRlc1xuICogc3RyYWlnaHQgb3V0IG9mIHRoZSBjb250YWluZXIuIFRoZSBmaXJzdCBmYWlsaW5nIGl0ZW0gdGhlcmVmb3JlIGVuZHMgdGhlXG4gKiBXSE9MRSBydW46IGV2ZXJ5IGxhdGVyIGl0ZW0gaXMgbmV2ZXIgcHJvY2Vzc2VkLCBhbmQgdGhlIHdvcmsgYWxyZWFkeSBkb25lIGlzXG4gKiBub3QgZXZlbiByZXBvcnRlZC4gTWVhc3VyZWQgYnkgdGhlIHBsYXRmb3JtIG9uIHRoZSByZWFsIGVuZ2luZSBcdTIwMTQgYSA1LWl0ZW1cbiAqIHN3ZWVwIGZhaWxpbmcgYXQgaXRlbSAzIHRvdWNoZWQgMyBpdGVtcyBhbmQgcmVwb3J0ZWQgYGFjdGVkOiAwYC5cbiAqXG4gKiBUaGF0IGlzIHdoYXQgYG9iamVjdHN0YWNrIGxpbnRgJ3MgYGZsb3ctbG9vcC1ib2R5LXVuY29udGFpbmVkYCBuYW1lcywgYW5kIHRoZVxuICogY29udGFpbm1lbnQgaXQgcHJlc2NyaWJlcyBpcyBhIGB0cnlfY2F0Y2hgIElOU0lERSB0aGUgYm9keSB3aXRoIHRoZSByZWFsIHdvcmtcbiAqIG1vdmVkIGludG8gaXRzIGB0cnlgIHJlZ2lvbi5cbiAqXG4gKiAjIyBXaHkgYSBoZWxwZXIgcmF0aGVyIHRoYW4gdGhlIGxpdGVyYWwgMjJ4IHNwZWxsaW5nXG4gKlxuICogV3JpdGluZyB0aGUgYHRyeV9jYXRjaGAgb3V0IGF0IGVhY2ggb2YgdGhlIDIyIHdhcm5lZCBsb29wcyByZS1pbmRlbnRzIGV2ZXJ5XG4gKiBib2R5IGJ5IHR3byBsZXZlbHMsIGFuZCB0aGUgcmUtaW5kZW50YXRpb24gQUxPTkUgbWVhc3VyZWQgfjEsMzI3IHRva2VucyBvdmVyXG4gKiB0aGUgYGJ1c2luZXNzIHNlbWFudGljc2AgY2VpbGluZyBvZiBgcG5wbSBoeWdpZW5lOnRva2Vuc2AgXHUyMDE0IGEgY2VpbGluZyB0aGF0XG4gKiBtb3ZlcyBvbmx5IG9uIGEgbWFpbnRhaW5lciBydWxpbmcuIFRoZSByYXRjaGV0IHN0cmlwcyBjb21tZW50cywgc28gc2xpbW1pbmdcbiAqIHByb3NlIGNhbm5vdCBidXkgdGhhdCBiYWNrIGVpdGhlci5cbiAqXG4gKiBUaGlzIGhlbHBlciB3cmFwcyB0aGUgYm9keSBmcm9tIE9VVFNJREUgaW5zdGVhZC4gQXQgZWFjaCBzaXRlIGBib2R5OiB7YFxuICogYmVjb21lcyBgYm9keTogZ3VhcmRlZCgnPGtleT4nLCB7YCBhbmQgdGhlIGNsb3NpbmcgYH0sYCBiZWNvbWVzIGB9KSxgLCBzbyB0aGVcbiAqIGJvZHkga2VlcHMgaXRzIG93biBpbmRlbnRhdGlvbiBieXRlLWZvci1ieXRlIGFuZCB0aGUgd2hvbGUgY2hhbmdlIGNvc3RzIGEgZmV3XG4gKiB0b2tlbnMgcGVyIGxvb3AgaW5zdGVhZCBvZiBzaXh0eS5cbiAqXG4gKiAjIyBWZXJpZmllZCBhZ2FpbnN0IHRoZSBwaW5uZWQgYEBvYmplY3RzdGFjay8qYCB0aGlzIHJlcG8gaW5zdGFsbHNcbiAqXG4gKiBGaXJzdCB0YWtlbiBvbiAxNy4zLjA7IFJFLVRBS0VOIG9uIDE3LjQuMCAoIzE4ODMsIGFmdGVyIHRoZSBQUiAjMTgxNCBidW1wO1xuICogbm90IHJlLXRha2VuIG9uIDE3LjUuMCksIHNhbWUgdmVyZGljdDogYSA1LWl0ZW0gc3dlZXAgd2hvc2UgYm9keSBmYWlscyBvbiBldmVyeSBpdGVtXG4gKiByYW4gdG8gY29tcGxldGlvbiBcdTIwMTQgYWxsIDUgaXRlbXMgdG91Y2hlZCwgcnVuIGBzdWNjZXNzOiB0cnVlYCBcdTIwMTQgd2hlcmUgdGhlXG4gKiBzYW1lIHN3ZWVwIHdpdGggdGhlIGJvZHkgVU5XUkFQUEVEIHN0b3BwZWQgYXQgdGhlIGZpcnN0IGZhaWx1cmUgd2l0aCAxIGl0ZW1cbiAqIHRvdWNoZWQgYW5kIHRoZSBydW4gYGZhaWxlZGAuIFRoYXQgY29udHJhc3QgSVMgdGhlIG1lYXN1cmVtZW50OyBhIGd1YXJkZWRcbiAqIHJ1biBhbG9uZSBjYW5ub3QgdGVsbCBjb250YWlubWVudCBmcm9tIGEgYm9keSB0aGF0IG5ldmVyIGZhaWxlZC5cbiAqXG4gKiAoTm90IGFnYWluc3QgdGhlIHBsYXRmb3JtIHNvdXJjZSB0cmVlIFx1MjAxNCB0aGUgY29udGFpbm1lbnQgaGFzIHRvIHdvcmsgb24gdGhlXG4gKiBhcnRpZmFjdCB0aGF0IGFjdHVhbGx5IHNoaXBzIGhlcmUuKVxuICpcbiAqICAgLSBgdHJ5X2NhdGNoYCBpcyByZWdpc3RlcmVkIGJ5IHRoZSBwaW5uZWQgZW5naW5lIChgcmVnaXN0ZXJUcnlDYXRjaE5vZGVgKSxcbiAqICAgICBydW5zIGl0cyBgdHJ5YCByZWdpb24sIGFuZCBvbiBhIGNhdWdodCBmYWlsdXJlIHJ1bnMgYGNhdGNoYCBhbmQgcmV0dXJuc1xuICogICAgIGBzdWNjZXNzOiB0cnVlYC4gVGhhdCBgc3VjY2VzczogdHJ1ZWAgaXMgd2hhdCBsZXRzIHRoZSBsb29wIGNvbnRpbnVlLlxuICogICAtIEEgYmFyZSBgYXNzaWdubWVudGAgbm9kZSB3aXRoIG5vIGBjb25maWdgIHJldHVybnMgYHN1Y2Nlc3M6IHRydWVgOiBpdHNcbiAqICAgICBleGVjdXRvciBmb2xkcyBhbiBhYnNlbnQgY29uZmlnIHRvIHplcm8gYXNzaWdubWVudHMsIGFuZCBgY29uZmlnYCBpc1xuICogICAgIG9wdGlvbmFsIG9uIGBGbG93Tm9kZVNjaGVtYWAuIFRoYXQgaXMgd2h5IHRoZSBtaW5pbWFsIGhhbmRsZXIgaXMgbGVnYWwsXG4gKiAgICAgYW5kIGl0IGlzIHRoZSBleGFjdCBoYW5kbGVyIHRoZSBsaW50IHJ1bGUncyBvd24gaGludCBwcmVzY3JpYmVzLlxuICogICAtIFRoZSBmYWlsZWQgYXR0ZW1wdCdzIHN0ZXBzIGFyZSBrZXB0IGluIHRoZSBydW4gbG9nIEFIRUFEIG9mIHRoZSBoYW5kbGVyJ3NcbiAqICAgICAoYGNoaWxkU3RlcHM6IFsuLi5mYWlsZWRBdHRlbXB0U3RlcHMsIC4uLmNhdGNoU3RlcHNdYCksIHNvIGEgc2tpcHBlZCBpdGVtXG4gKiAgICAgc3RheXMgdmlzaWJsZSB3aXRoIGl0cyBvd24gYHN0YXR1czogJ2ZhaWx1cmUnYCBzdGVwIGFuZCB0aGUgaGFuZGxlciBkb2VzXG4gKiAgICAgbm90IG5lZWQgdG8gcmUtcmVjb3JkIGl0LlxuICogICAtIGBjYXRjaGAgbmVlZHMgbm8gYGVkZ2VzYCAoYEZsb3dSZWdpb25TY2hlbWEuZWRnZXNgIGNhcnJpZXMgYC5kZWZhdWx0KFtdKWApXG4gKiAgICAgYW5kIG5vIGBlcnJvclZhcmlhYmxlYCAoaXQgZGVmYXVsdHMgdG8gYCRlcnJvcmApLiBBIG9uZS1ub2RlIHJlZ2lvbiBpc1xuICogICAgIHNpbmdsZS1lbnRyeS9zaW5nbGUtZXhpdCwgd2hpY2ggaXMgd2hhdCBgYW5hbHl6ZVJlZ2lvbmAgcmVxdWlyZXMuXG4gKlxuICogIyMgV2hhdCBpdCBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgZG9cbiAqXG4gKiBUaGUgaGFuZGxlciBzd2FsbG93cyB0aGUgaXRlbSBhbmQgbW92ZXMgb24uIEl0IGRvZXMgbm90IHJldHJ5IChubyBgcmV0cnlgXG4gKiBwb2xpY3kgaXMgZGVjbGFyZWQsIHNvIG9uZSBhdHRlbXB0IGlzIG1hZGUpLCBkb2VzIG5vdCBub3RpZnksIGFuZCBkb2VzIG5vdFxuICogYWNjdW11bGF0ZSBhIGZhaWx1cmUgbGlzdCBcdTIwMTQgYSBzd2VlcCB0aGF0IHJlcG9ydHMgaXRzIHNraXBzIGlzIGEgcHJvZHVjdFxuICogZmVhdHVyZSB0aGlzIGNhcmQgZG9lcyBub3QgaGF2ZSBhIHJ1bGluZyBmb3IuIFRoZSBydW4gbG9nIGlzIHRoZSByZWNvcmQuXG4gKlxuICogXHUyNkQ0IE5vdCBldmVyeSBsb29wIHdhbnRzIHRoaXMuIEEgc3dlZXAgTUVBTlQgdG8gc3RvcCBhdCBpdHMgZmlyc3QgZmFpbHVyZSBpcyBhXG4gKiBsZWdpdGltYXRlIHJlYWRpbmcgYW5kIGtlZXBzIGl0cyB3YXJuaW5nLCBzbyBkZWNpZGUgcGVyIGxvb3AgcmF0aGVyIHRoYW5cbiAqIHdyYXBwaW5nIGV2ZXJ5IHdhcm5lZCBzaXRlIGJ5IHJlZmxleC5cbiAqL1xuXG4vKipcbiAqIEEgY29udHJvbC1mbG93IHJlZ2lvbiwgc3RydWN0dXJhbGx5LiBEZWxpYmVyYXRlbHkgbG9vc2VyIHRoYW4gdGhlIHNwZWMnc1xuICogYEZsb3dSZWdpb25gOiB0aGUgbG9vcCBib2RpZXMgdGhpcyB3cmFwcyBsaXZlIHVuZGVyIGBjb25maWdgLCB3aGljaCB0aGUgZmxvd1xuICogc2NoZW1hIHR5cGVzIGFzIGBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPmAsIHNvIHRpZ2h0ZW5pbmcgdGhlIHBhcmFtZXRlciBoZXJlXG4gKiB3b3VsZCB0eXBlLWNoZWNrIHRoZSBib2RpZXMgZm9yIHRoZSBmaXJzdCB0aW1lIGFuZCB0dXJuIGEgbWVjaGFuaWNhbCB3cmFwXG4gKiBpbnRvIGEgdHlwaW5nIGNoYW5nZS4gU2FtZSBzaGFwZSBpbiwgc2FtZSBzaGFwZSBvdXQuXG4gKi9cbnR5cGUgUmVnaW9uID0geyBub2RlczogdW5rbm93bltdOyBlZGdlcz86IHVua25vd25bXSB9O1xuXG4vKipcbiAqIFdyYXAgYSBsb29wIGJvZHkgcmVnaW9uIHNvIG9uZSBmYWlsaW5nIGl0ZW0gaXMgY29udGFpbmVkIHRvIHRoYXQgaXRlcmF0aW9uLlxuICpcbiAqIGBrZXlgIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBpdHMgZmxvdyBcdTIwMTQgaXQgbmFtZXMgdGhlIHR3byBub2RlcyB0aGlzIGFkZHNcbiAqIChgZ3VhcmRfPGtleT5gIGFuZCBgaGFuZGxlZF88a2V5PmApLCBhbmQgbm9kZSBpZHMgY29sbGlkZSBmbG93LXdpZGUuXG4gKi9cbmV4cG9ydCBjb25zdCBndWFyZGVkID0gKGtleTogc3RyaW5nLCByZWdpb246IFJlZ2lvbik6IFJlZ2lvbiA9PiAoe1xuICBub2RlczogW3tcbiAgICBpZDogYGd1YXJkXyR7a2V5fWAsXG4gICAgdHlwZTogJ3RyeV9jYXRjaCcsXG4gICAgbGFiZWw6ICdHdWFyZGVkIEl0ZXJhdGlvbicsXG4gICAgY29uZmlnOiB7XG4gICAgICB0cnk6IHJlZ2lvbixcbiAgICAgIGNhdGNoOiB7IG5vZGVzOiBbeyBpZDogYGhhbmRsZWRfJHtrZXl9YCwgdHlwZTogJ2Fzc2lnbm1lbnQnLCBsYWJlbDogJ1NraXAgVGhpcyBJdGVtJyB9XSB9LFxuICAgIH0sXG4gIH1dLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHMvYXJ0aWNsZV9mZWVkYmFjay5ob29rLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2Uvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHMvYXJ0aWNsZV9mZWVkYmFjay5ob29rLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tDb250ZXh0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEhvb2tBcGkgfSBmcm9tICcuLi8uLi9zYWxlcy9vYmplY3RzL19ob29rLWFwaSc7XG5cbi8qKlxuICogVGhlIHdyaXRlciBiZWhpbmQgdGhlIGtub3dsZWRnZSBhcnRpY2xlJ3MgZW5nYWdlbWVudCBjb3VudGVycyAoIzYwMSkuXG4gKlxuICogYGNybV9rbm93bGVkZ2VfYXJ0aWNsZS5oZWxwZnVsX2NvdW50YCBhbmQgYG5vdF9oZWxwZnVsX2NvdW50YCB3ZXJlIGRlY2xhcmVkXG4gKiBgcmVhZG9ubHk6IHRydWVgIHdpdGggYSBgZGVmYXVsdFZhbHVlOiAwYCBhbmQgTk8gd3JpdGVyIGFueXdoZXJlIFx1MjAxNCBvbiB0aGVcbiAqIHBsYXRmb3JtIG9yIGluIHRoaXMgYXBwIFx1MjAxNCBzbyB0aGV5IHdlcmUgc3RydWN0dXJhbGx5IHBpbm5lZCBhdCB6ZXJvIHdoaWxlIHRoZVxuICogYXJ0aWNsZSBncmlkIHNob3dlZCBhIFwiSGVscGZ1bCBWb3Rlc1wiIGNvbHVtbiBhbmQgc3VtbWVkIGl0LiBUaGF0IGlzIHRoZSBzYW1lXG4gKiBkZWZlY3QgYGNybV9jYW1wYWlnbl9tZW1iZXJgJ3MgZW5nYWdlbWVudCBsaWZlY3ljbGUgd2FzIHJldGlyZWQgZm9yICgjNTk3KSxcbiAqIGFuZCBBRFItMDA0OSdzIGVuZm9yY2Utb3ItcmVtb3ZlIGxlYXZlcyBleGFjdGx5IHR3byBob25lc3QgZW5kaW5nczogZ2l2ZSB0aGVcbiAqIGZpZWxkIGEgd3JpdGVyLCBvciBkZWxldGUgaXQuIEZlZWRiYWNrIG9uIGEga25vd2xlZGdlIGFydGljbGUgaGFzIGEgcmVhbFxuICogY29uc3VtZXIgXHUyMDE0IHRoZSByZXZpZXcgcXVldWUgYW4gYXV0aG9yIHdvcmtzIGZyb20gXHUyMDE0IHNvIHRoZXNlIHR3byBnZXQgYVxuICogd3JpdGVyLiBgdmlld19jb3VudGAsIHdoaWNoIGhhcyBub25lIGF2YWlsYWJsZSwgd2FzIGRlbGV0ZWQ7IHRoZSByZWFzb25pbmdcbiAqIGlzIG9uIGBjcm1fa25vd2xlZGdlX2FydGljbGVgIGl0c2VsZi5cbiAqXG4gKiAjIyMgUmVjb3VudCwgbmV2ZXIgaW5jcmVtZW50XG4gKlxuICogRXZlcnkgZXZlbnQgcmVjb21wdXRlcyBib3RoIGNvdW50ZXJzIGZyb20gYGNybV9hcnRpY2xlX2ZlZWRiYWNrYCByYXRoZXIgdGhhblxuICogYWRkaW5nIG9uZSB0byB3aGF0IGlzIHRoZXJlLiBUaGF0IG1ha2VzIHRoZSB3cml0ZSBpZGVtcG90ZW50IChhIHJlcGxheWVkXG4gKiBob29rIGNhbm5vdCBkb3VibGUtY291bnQpLCBzZWxmLWhlYWxpbmcgKGFuIGFkbWluIGRlbGV0aW5nIGEgYm9ndXMgdm90ZSByb3dcbiAqIGlzIHJlZmxlY3RlZCBvbiB0aGUgbmV4dCBldmVudCwgYW5kIGEgZnVsbCByZWNvdW50IGZpeGVzIGFueSBoaXN0b3JpY2FsXG4gKiBkcmlmdCBpbiBvbmUgcGFzcyksIGFuZCBzYWZlIHVuZGVyIGNvbmN1cnJlbmN5ICh0d28gc2ltdWx0YW5lb3VzIHZvdGVzIGJvdGhcbiAqIGNvbnZlcmdlIG9uIHRoZSB0cnVlIGNvdW50LCB3aGVyZSB0d28gcmVhZC1tb2RpZnktd3JpdGVzIGxvc2Ugb25lKS4gVGhlXG4gKiBjb3VudGVycyB0aGVyZWZvcmUgY2Fubm90IGRyaWZ0IGZyb20gdGhlaXIgb3duIGV2aWRlbmNlIFx1MjAxNCB3aGljaCBpcyB3aGF0IG1ha2VzXG4gKiBgcmVhZG9ubHk6IHRydWVgIGFuIGhvbmVzdCBkZWNsYXJhdGlvbiBhZ2FpbiByYXRoZXIgdGhhbiBhIGRlc2NyaXB0aW9uIG9mXG4gKiBwYXJhbHlzaXMuXG4gKlxuICogYGFmdGVyRGVsZXRlYCBpcyBpbiB0aGUgZXZlbnQgc2V0IGZvciB0aGUgc2FtZSByZWFzb246IHRoZSBjYW1wYWlnbiBqdW5jdGlvblxuICogbGVhcm5lZCB0aGUgaGFyZCB3YXkgKCM2OTYpIHRoYXQgYSBqdW5jdGlvbiByb3cncyBkaXNhcHBlYXJhbmNlIGlzIGEgbWV0cmljXG4gKiBjaGFuZ2UsIGFuZCBhIGNvdW50ZXIgdGhhdCBvbmx5IGV2ZXIgZ29lcyB1cCBpcyBhIGRpZmZlcmVudCBraW5kIG9mIGxpZS5cbiAqXG4gKiBgYXN5bmM6IHRydWVgICsgYG9uRXJyb3I6ICdsb2cnYCBtaXJyb3JzIGBjYW1wYWlnbl9tZW1iZXJfbWV0cmljc19yZWZyZXNoYDpcbiAqIHRoZSByZWFkZXIncyB2b3RlIGlzIHRoZSB1c2VyJ3MgYWN0aW9uIGFuZCBtdXN0IG5vdCBmYWlsIGJlY2F1c2UgdGhlIGFydGljbGVcbiAqIHJvdyBpcyBtb21lbnRhcmlseSBsb2NrZWQuIEEgbWlzc2VkIHJlZnJlc2ggaXMgY29ycmVjdGVkIGJ5IHRoZSBuZXh0IHZvdGU7XG4gKiBhIHJlamVjdGVkIHdyaXRlIGxvc2VzIHRoZSB2b3RlIGl0c2VsZi5cbiAqXG4gKiBgcnVuQXM6ICdzeXN0ZW0nYCAoIzIwMTQsIEFHRU5UUy5tZCBydWxlIDkpLiBUaGUgY291bnRlcnMgYXJlIGByZWFkb25seWAsXG4gKiBhbmQgdGhlIGVuZ2luZSBkcm9wcyBhIHJlYWRvbmx5IGtleSBhIG5vbi1zeXN0ZW0gY2FsbGVyIHdyaXRlcyBcdTIwMTQgc28gYSByZWNvdW50XG4gKiBmaXJlZCBieSBhIFBFUlNPTidzIG93biB3cml0ZSBvZiBhIHZvdGUgKGFuIGFkbWluIHdpdGhkcmF3aW5nIG9uZSkgY29tbWl0dGVkXG4gKiB3aXRob3V0IHRoZSBjb3VudGVycyBhbmQgdGhlIGFydGljbGUga2VwdCBjb3VudGluZyB0aGUgd2l0aGRyYXduIHZvdGUuIFRoZVxuICogcmVjb3VudCBpcyB0aGUgYXJ0aWNsZSdzIHdyaXRlciwgbm90IHRoZSB2b3RlcidzLCBzbyB0aGUgaG9vayBlbGV2YXRlczsgdGhlXG4gKiB2b3RlIGl0c2VsZiBzdGF5cyB0aGUgY2FsbGVyJ3Mgd3JpdGUuIEVsZXZhdGlvbiBpcyBub3QgYW5vbnltaXR5OiB0aGVcbiAqIGFydGljbGUncyBgdXBkYXRlZF9ieWAgc3RpbGwgbmFtZXMgdGhlIHBlcnNvbi4gT3JnYW5pemF0aW9uIChydWxlIDEwKTogZXZlcnlcbiAqIHJlYWQgYW5kIHdyaXRlIGlzIGtleWVkIHRvIHRoZSB0cmlnZ2VyaW5nIHZvdGUncyBvd24gYXJ0aWNsZSwgYW5kIHRoZVxuICogZWxldmF0ZWQgYGN0eC5hcGlgIGtlZXBzIHRoZSB0cmlnZ2VyJ3MgdGVuYW50LCBzbyB0aGUgZHJpdmVyJ3Mgb3JnYW5pemF0aW9uXG4gKiBwcmVkaWNhdGUgc3RpbGwgYXBwbGllcy5cbiAqXG4gKiBObyBsb29wOiB0aGlzIHdyaXRlcyBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCwgd2hvc2Ugb3duIGhvb2tcbiAqIChga25vd2xlZGdlX2FydGljbGVfcHVibGlzaF90aW1lc3RhbXBzYCkgZmlyZXMgb24gYGJlZm9yZSpgIGFuZCByZXR1cm5zXG4gKiBpbW1lZGlhdGVseSB1bmxlc3MgdGhlIHJlY29yZCBpcyBwdWJsaXNoZWQgXHUyMDE0IGFuZCBlaXRoZXIgd2F5IGl0IGlzc3VlcyBub1xuICogd3JpdGUgYWdhaW5zdCBgY3JtX2FydGljbGVfZmVlZGJhY2tgLCBzbyBub3RoaW5nIHJlLWVudGVycyBoZXJlLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBUaGUgcmVjb3VudCBibG9jayBpcyB3cml0dGVuIG91dCBJTkxJTkUgYW5kIGlzIG5vdCBzaGFyZWQgd2l0aFxuICogYGNhbXBhaWduX21lbWJlci5ob29rLnRzYCdzIHN0cnVjdHVyYWxseSBzaW1pbGFyIGJsb2NrLiBBIGhvb2sgaGFuZGxlciBsb3dlcnNcbiAqIHRvIGEgbWV0YWRhdGEtb25seSwgYm9keS1vbmx5IHNjcmlwdDogYSByZWZlcmVuY2UgdG8gbW9kdWxlIHNjb3BlIFx1MjAxNCBhblxuICogaW1wb3J0LCBhIHRvcC1sZXZlbCBjb25zdCwgYSBzaGFyZWQgZmFjdG9yeSdzIHBhcmFtZXRlciBcdTIwMTQgaXMgYVxuICogYFJlZmVyZW5jZUVycm9yYCBhdCBydW50aW1lLCBub3QgYSBjbG9zdXJlLCBhbmQgYSBoYW5kbGVyIHRoYXQgcmVhY2hlcyBmb3JcbiAqIG9uZSBzaWxlbnRseSBzdG9wcyBsb3dlcmluZyAoYHRlc3QvYWN0aW9uLXNhbmRib3gudGVzdC50c2AgZmFpbHMgdGhlIGJ1aWxkIG9uXG4gKiBpdCkuIEhvb2tzIG1heSBiZSBjb21wb3NlZCBieSBhIEZBQ1RPUlkgKGBfY2FzZS1hc3NpZ25tZW50LnRzYCBkb2VzIGV4YWN0bHlcbiAqIHRoYXQpOyB0aGUgbG9naWMgaW5zaWRlIGEgYm9keSBtYXkgbm90IGJlIGltcG9ydGVkLlxuICovXG5jb25zdCBhcnRpY2xlRmVlZGJhY2tNZXRyaWNzUmVmcmVzaDogSG9vayA9IHtcbiAgbmFtZTogJ2FydGljbGVfZmVlZGJhY2tfbWV0cmljc19yZWZyZXNoJyxcbiAgb2JqZWN0OiAnY3JtX2FydGljbGVfZmVlZGJhY2snLFxuICBldmVudHM6IFsnYWZ0ZXJJbnNlcnQnLCAnYWZ0ZXJVcGRhdGUnLCAnYWZ0ZXJEZWxldGUnXSxcbiAgcHJpb3JpdHk6IDgwMCxcbiAgYXN5bmM6IHRydWUsXG4gIG9uRXJyb3I6ICdsb2cnLFxuICBydW5BczogJ3N5c3RlbScsXG4gIGRlc2NyaXB0aW9uOiAnUmVjb3VudCBhbiBhcnRpY2xlXHUyMDE5cyBoZWxwZnVsIC8gbm90LWhlbHBmdWwgdm90ZXMgZnJvbSBjcm1fYXJ0aWNsZV9mZWVkYmFjay4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IGFwaSA9IGN0eC5hcGkgYXMgSG9va0FwaSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFwaSkgcmV0dXJuO1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICAvLyBCb3RoIHNpZGVzIG9uIHVwZGF0ZTogbW92aW5nIGEgdm90ZSBiZXR3ZWVuIGFydGljbGVzIGhhcyB0byByZWNvdW50IHRoZVxuICAgIC8vIGFydGljbGUgaXQgTEVGVCBhcyB3ZWxsIGFzIHRoZSBvbmUgaXQgYXJyaXZlZCBhdC5cbiAgICBjb25zdCBhcnRpY2xlSWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFtcbiAgICAgIHR5cGVvZiBpbnB1dD8uY3JtX2tub3dsZWRnZV9hcnRpY2xlID09PSAnc3RyaW5nJyA/IGlucHV0LmNybV9rbm93bGVkZ2VfYXJ0aWNsZSA6ICcnLFxuICAgICAgdHlwZW9mIHByZXZpb3VzPy5jcm1fa25vd2xlZGdlX2FydGljbGUgPT09ICdzdHJpbmcnXG4gICAgICAgID8gKHByZXZpb3VzLmNybV9rbm93bGVkZ2VfYXJ0aWNsZSBhcyBzdHJpbmcpXG4gICAgICAgIDogJycsXG4gICAgXS5maWx0ZXIoQm9vbGVhbikpKTtcblxuICAgIGZvciAoY29uc3QgaWQgb2YgYXJ0aWNsZUlkcykge1xuICAgICAgY29uc3QgaGVscGZ1bCA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9hcnRpY2xlX2ZlZWRiYWNrJykuY291bnQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fa25vd2xlZGdlX2FydGljbGU6IGlkLCB2ZXJkaWN0OiAnaGVscGZ1bCcgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgbm90SGVscGZ1bCA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9hcnRpY2xlX2ZlZWRiYWNrJykuY291bnQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fa25vd2xlZGdlX2FydGljbGU6IGlkLCB2ZXJkaWN0OiAnbm90X2hlbHBmdWwnIH0sXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV9rbm93bGVkZ2VfYXJ0aWNsZScpLnVwZGF0ZSh7XG4gICAgICAgIGlkLFxuICAgICAgICBoZWxwZnVsX2NvdW50OiBoZWxwZnVsLFxuICAgICAgICBub3RfaGVscGZ1bF9jb3VudDogbm90SGVscGZ1bCxcbiAgICAgIH0sIHsgd2hlcmU6IHsgaWQgfSB9KTtcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBbYXJ0aWNsZUZlZWRiYWNrTWV0cmljc1JlZnJlc2hdO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL2Nhc2UuaG9vay50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL2Nhc2UuaG9vay50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBIb29rLCBIb29rQ29udGV4dCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHR5cGUgeyBIb29rQXBpIH0gZnJvbSAnLi4vLi4vc2FsZXMvb2JqZWN0cy9faG9vay1hcGknO1xuaW1wb3J0IHtcbiAgY3JlYXRlQ2FzZVJvdW5kUm9iaW5Bc3NpZ24sXG4gIGNyZWF0ZUNhc2VFc2NhbGF0aW9uUmVhc3NpZ24sXG4gIGNyZWF0ZUNhc2VTZWxmQ2xhaW0sXG59IGZyb20gJy4vX2Nhc2UtYXNzaWdubWVudCc7XG5cbi8qKlxuICogQ2FzZSBTTEEgJiBlc2NhbGF0aW9uIGhvb2suXG4gKlxuICogLSBTdGFtcHMgYHNsYV9kdWVfZGF0ZWAgb24gYSBjYXNlIHRoYXQgaGFzIG5vbmUsIGZyb20gdGhlIHByaW9yaXR5IFx1MDBENyBhY2NvdW50XG4gKiAgIHRpZXIgbWF0cml4IGluIGBfY2FzZS1zbGEudHNgLlxuICogLSBSZWNvcmRzIGBpc19zbGFfdmlvbGF0ZWRgIG9uIHRoZSB3cml0ZSB0aGF0IHJlc29sdmVzIG9yIGNsb3NlcyBhIGNhc2UgYWZ0ZXJcbiAqICAgaXRzIGBzbGFfZHVlX2RhdGVgIFx1MjAxNCB0aGUgaGFsZiBvZiB0aGUgYnJlYWNoIHJ1bGUgbm8gc2NoZWR1bGUgY2FuIG1pc3MuXG4gKiAtIE9uIGVzY2FsYXRpb246IGNyZWF0ZXMgYSBmb2xsb3ctdXAgdGFzayBPV05FRCBCWSB0aGUgYWNjb3VudCBvd25lciAodGhlXG4gKiAgIHNpbmdsZSBvd25lciBvZiBlc2NhbGF0aW9uIHRhc2tzIFx1MjAxNCBmbG93cyBtdXN0IG5vdCBjcmVhdGUgdGhlaXIgb3duKS5cbiAqICAgT3duaW5nIGl0LCBub3QgbWVyZWx5IGxhYmVsbGluZyBpdDogYG93bmVyX2lkYCBpcyB0aGUgb25lIG93bmVyc2hpcCBjb2x1bW4sXG4gKiAgIHNvIHRoZSBwZXJzb24gdGhlIHRhc2sgbmFtZXMgaXMgdGhlIHBlcnNvbiB3aG8gY2FuIHdvcmsgaXQuXG4gKiAtIE9uIGByZXNvbHZlZGA6IGJ1bXBzIGFjY291bnQgYGxhc3RfYWN0aXZpdHlfZGF0ZWAgXHUyMDE0IGl0cyBvd24gaG9vayxcbiAqICAgYGNhc2VfcmVzb2x1dGlvbl9hY2NvdW50X2FjdGl2aXR5YCwgYmVjYXVzZSBpdCBpcyB0aGUgb25lIHdyaXRlIGhlcmUgdGhhdFxuICogICBuZWVkcyBlbGV2YXRpb24gKCMyMDE0KS5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgT3duZXJzaGlwIGFzc2lnbm1lbnQgaXMgTk9UIGhlcmU6IGFsbCB0aHJlZSBhbnN3ZXJzIHRvIFwid2hvIHNob3VsZCBvd25cbiAqIHRoaXMgY2FzZVwiIGxpdmUgaW4gYF9jYXNlLWFzc2lnbm1lbnQudHNgIFx1MjAxNCB0aGUgb3duZXJsZXNzLWludGFrZSByb3VuZC1yb2JpbixcbiAqIHRoZSBlc2NhbGF0aW9uIGhhbmQtb2ZmIHRvIHRoZSBgc2VydmljZV9tYW5hZ2VyYCBwb29sLCBhbmQgdGhlIHRyaWFnZVxuICogc2VsZi1jbGFpbS4gT25lIG1vZHVsZSwgc28gdGhlIGFwcCBuZXZlciBncm93cyB0d28gaW5kZXBlbmRlbnRseS1hdXRob3JlZFxuICogb3duZXJzaGlwIHBhdGhzIG9uIGBjcm1fY2FzZWA7IGl0cyBob29rcyBhcmUgY29tcG9zZWQgaW50byB0aGlzIG1vZHVsZSdzXG4gKiBkZWZhdWx0IGV4cG9ydCBiZWxvdywgc28gdGhlIHJlZ2lzdHJ5IHN0aWxsIHNlZXMgb25lIGBjcm1fY2FzZWAgaG9vayBzZXQuIEluXG4gKiBwYXJ0aWN1bGFyIHRoZSBlc2NhbGF0aW9uIGhhbmQtb2ZmIGlzIGRlbGliZXJhdGVseSBOT1QgYSBicmFuY2ggb2ZcbiAqIGBjYXNlX3N0YXR1c19zaWRlX2VmZmVjdHNgIGJlbG93OiB0aGF0IGhvb2sgd3JpdGVzIHRocm91Z2ggYGN0eC5hcGlgLCBhIHNlYW1cbiAqIHRoZSAjMzAwNCB0cmFuc2ZlciBndWFyZCBDQU4gc2VlICh3aGljaCB3b3VsZCBkZW1hbmRcbiAqIGBjcm1fY2FzZS5hbGxvd1RyYW5zZmVyYCkgYW5kIGEgc2Vjb25kIHdyaXRlIHRoYXQgcmUtZW50ZXJzIHRoZSByZWNvcmQtY2hhbmdlXG4gKiB0cmlnZ2VyIHN1cmZhY2UuIEJvdGggbWVhc3VyZW1lbnRzIGFyZSBpbiBgX2Nhc2UtYXNzaWdubWVudC50c2AncyBoZWFkZXIuXG4gKi9cblxuY29uc3QgY2FzZVZhbGlkYXRpb246IEhvb2sgPSB7XG4gIG5hbWU6ICdjYXNlX3NsYV9kZWZhdWx0cycsXG4gIG9iamVjdDogJ2NybV9jYXNlJyxcbiAgZXZlbnRzOiBbJ2JlZm9yZUluc2VydCcsICdiZWZvcmVVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDIwMCxcbiAgZGVzY3JpcHRpb246ICdBcHBseSB0aGUgcHJpb3JpdHkgXHUwMEQ3IGFjY291bnQtdGllciBTTEEgbWF0cml4IGFuZCB0aGUgY2FzZSBsaWZlY3ljbGUgZGVmYXVsdHMuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvLyBEMyBzdGFuZC1kb3duOiBhIHByZWRpY2F0ZSB1cGRhdGUgaGFzIE9ORSBwYXlsb2FkIGZvciBldmVyeSBtYXRjaGVkIHJvdyxcbiAgICAvLyBzbyB0aGUgYGN0eC5wcmV2aW91c2AtY29uZGl0aW9uZWQgd3JpdGVzIGJlbG93IHdvdWxkIGxhbmQgb24gcm93cyB0aGF0XG4gICAgLy8gZGlkIG5vdCBlYXJuIHRoZW0gXHUyMDE0IHJlZnVzZWQgYXMgYSBkaXZlcmdpbmcga2V5IHNldCwgb3Igc3RvcmVkIHNpbGVudGx5XG4gICAgLy8gZnJvbSB0aGUgbGFzdCByb3cuIEZ1bGwgYWNjb3VudCBhbmQgdGhlIG1lYXN1cmVtZW50OiBgZm9yZWNhc3QuaG9vay50c2AuXG4gICAgaWYgKGN0eC5ldmVudCA9PT0gJ2JlZm9yZVVwZGF0ZScgJiYgY3R4LmRpc3BhdGNoPy5tb2RlID09PSAncGVyLXJvdycpIHJldHVybjtcblxuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBHdWVzdCAod2ViLXRvLWNhc2UpIHNhbml0aXNhdGlvbi4gT1ZFUldSSVRFIHdpdGggYSBzYWZlIHZhbHVlIFx1MjAxNCBuZXZlclxuICAgIC8vIGBkZWxldGVgLlxuICAgIC8vXG4gICAgLy8gXHUyNzA1IEhJU1RPUlksIFJFU09MVkVEIFx1MjAxNCBhbmQgdGhlIGNvbmNsdXNpb24gaXMgdW5jaGFuZ2VkLiBUaHJvdWdoIDE3LjIuMCxcbiAgICAvLyBgZGVsZXRlIGN0eC5pbnB1dC48ZmllbGQ+YCBpbiBhIGhvb2sgd2FzIGEgU0lMRU5UIE5PLU9QOiBPYmplY3RRTCBoYW5kcyBhXG4gICAgLy8gaG9vayBgY3R4LmlucHV0YCBhcyBgeyBkYXRhLCBvcHRpb25zIH1gIGJlaGluZCBhIGZsYXQtcmVjb3JkIFByb3h5XG4gICAgLy8gKGBpbnN0YWxsRmxhdElucHV0YCwgYEBvYmplY3RzdGFjay9vYmplY3RxbGAgYHNyYy9ob29rLXdyYXBwZXJzLnRzYCkgdGhhdFxuICAgIC8vIHRyYXBwZWQgYGdldGAgLyBgc2V0YCAvIGBoYXNgIC8gYG93bktleXNgIC8gYGdldE93blByb3BlcnR5RGVzY3JpcHRvcmAgYW5kXG4gICAgLy8gcm91dGVkIGVhY2ggaW50byBgZGF0YWAgXHUyMDE0IGJ1dCBkZWNsYXJlZCBubyBgZGVsZXRlUHJvcGVydHlgIHRyYXAsIHNvIHRoZVxuICAgIC8vIGRlbGV0ZSBmZWxsIHRocm91Z2ggdG8gdGhlIFdSQVBQRVIsIG9uZSBsZXZlbCBhYm92ZSB0aGUgcmVjb3JkOlxuICAgIC8vXG4gICAgLy8gICBkZWxldGUgaW5wdXQub3duZXJfaWQgICAtPiByZXR1cm5lZCBUUlVFICAoSlMgcmVwb3J0ZWQgc3VjY2VzcylcbiAgICAvLyAgICdvd25lcl9pZCcgaW4gaW5wdXQgICAgIC0+IHN0aWxsIHRydWVcbiAgICAvLyAgIGlucHV0Lm93bmVyX2lkICAgICAgICAgIC0+IHN0aWxsIHRoZSBjYWxsZXIncyB2YWx1ZVxuICAgIC8vXG4gICAgLy8gRmlmdGVlbiBzdWNoIHN0YXRlbWVudHMgYWNyb3NzIHR3byBpbnRha2UgaG9va3MgZGlkIG5vdGhpbmcgaW4gcHJvZHVjdGlvblxuICAgIC8vIHdoaWxlIHRoZWlyIHRlc3RzIHBhc3NlZCAoIzExMzMpLiBUaGlzIGJsb2NrIHdhcyByZXdyaXR0ZW4gdG8gQVNTSUdOLlxuICAgIC8vXG4gICAgLy8gVGhlIGJsb2NrIGFib3ZlIHByZWRpY3RlZCBpdHMgb3duIHRyaWdnZXIgXHUyMDE0IFwiYSBwbGF0Zm9ybSByZWxlYXNlIHRoYXRcbiAgICAvLyBQT1NUREFURVMgMjAyNi0wOC0yNlwiIFx1MjAxNCBhbmQgdGhhdCByZWxlYXNlIGlzICoqMTcuMy4wKiosIHNvIGV2ZXJ5IGxhdGVyXG4gICAgLy8gcGluIGNhcnJpZXMgdGhlIGZpeC4gb2JqZWN0c3RhY2sjMTIyNzcgc2hpcHBlZDogdGhlIGluLXByb2Nlc3MgUHJveHlcbiAgICAvLyB0cmFwcyBgZGVsZXRlUHJvcGVydHlgLCBhbmQgdGhlIHNhbmRib3ggcGF0aCBkaWZmcyBkZWxldGlvbnMgYWdhaW5zdCB0aGVcbiAgICAvLyBlbnRyeSBzbmFwc2hvdCByYXRoZXIgdGhhbiB3cml0aW5nIG11dGF0aW9ucyBob21lIHdpdGggYE9iamVjdC5hc3NpZ25gLFxuICAgIC8vIHdoaWNoIGNhbm5vdCByZXByZXNlbnQgYSByZW1vdmFsLiBSZS1tZWFzdXJlZCB0aHJvdWdoIHRoZSBlbmdpbmUncyBvd25cbiAgICAvLyBgd3JhcERlY2xhcmF0aXZlSG9va2AgaW4gYHRlc3QvaG9vay1pbnB1dC1zaGFwZS50ZXN0LnRzYCwgd2hpY2ggbm93IHBpbnNcbiAgICAvLyB0aGUgbmV3IGNvbnRyYWN0IGluIGJvdGggZGlyZWN0aW9ucy5cbiAgICAvL1xuICAgIC8vIFx1MjZENCBUaGUgdHJhcCBhcnJpdmluZyBpcyBOT1QgYSBsaWNlbmNlIHRvIHNwZWxsIHRoaXMgYmxvY2sgd2l0aCBgZGVsZXRlYC5cbiAgICAvLyBXaGF0IHRoZXNlIGxpbmVzIFdSSVRFIGlzIGxvYWQtYmVhcmluZyBpbmRlcGVuZGVudGx5IG9mIGhvdyBpdCBpcyBzcGVsbGVkOlxuICAgIC8vIGBjYXNlX2F1dG9fYXNzaWduYCBzdGFuZHMgZG93biBvbmx5IG9uIGEgbm9uLWVtcHR5IFNUUklORyBgb3duZXJfaWRgLCBzb1xuICAgIC8vIHRoZSBjb2x1bW4gbXVzdCBhcnJpdmUgYG51bGxgIHJhdGhlciB0aGFuIEFCU0VOVCAoc2VlIHRoZSBgbnVsbGAgbm90ZVxuICAgIC8vIGJlbG93KS4gUmVtb3ZpbmcgYSBrZXkgYW5kIHdyaXRpbmcgYG51bGxgIGFyZSBkaWZmZXJlbnQgZG93bnN0cmVhbSwgc29cbiAgICAvLyBzd2l0Y2hpbmcgdG8gYGRlbGV0ZWAgd291bGQgYmUgYSBiZWhhdmlvdXIgY2hhbmdlIG9uIHRoZSBwdWJsaWMtZm9ybVxuICAgIC8vIGJvdW5kYXJ5LCBub3QgYSByZS1zcGVsbGluZy4gQXNzaWduIFx1MjAxNCBmb3IgdGhlIHJlYXNvbiwgbm90IHRoZSBjb25zdHJhaW50LlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIGBudWxsYCByYXRoZXIgdGhhbiBgJydgIG9yIGB1bmRlZmluZWRgLCBhbGwgdGhyZWUgbWVhc3VyZWQgb24gdGhlXG4gICAgLy8gd3JpdGUgcGF0aDogYG51bGxgIHN0b3JlcyBhcyBudWxsLCBgJydgIHN0b3JlcyBhcyBhbiBlbXB0eSBzdHJpbmcgKHdyb25nXG4gICAgLy8gaW4gYSBsb29rdXAgXHUyMDE0IHNlZSBgY2FzZV9yZXNvbHV0aW9uX2FydGljbGVfbm9ybWFsaXplYCBiZWxvdyksIGFuZFxuICAgIC8vIGB1bmRlZmluZWRgIHN0b3JlcyB0aGUgS0VZIHdpdGggYW4gdW5kZWZpbmVkIHZhbHVlIHJhdGhlciB0aGFuIG9taXR0aW5nXG4gICAgLy8gaXQsIHdoaWNoIGlzIG5vdCB0aGUgc2FtZSBhcyBhYnNlbnQgYW5kIGlzIHdoYXQgYSBgaGFzKClgLWd1YXJkZWQgQ0VMXG4gICAgLy8gcHJlZGljYXRlIHRoZW4gdHJpcHMgb3Zlci4gYG51bGxgIGlzIGFsc28gd2hhdCB0aGUgZG93bnN0cmVhbSBvd25lclxuICAgIC8vIHdyaXRlciByZWFkcyBhcyBcIm93bmVybGVzc1wiOiBgY2FzZV9hdXRvX2Fzc2lnbmAgc3RhbmRzIGRvd24gb25seSBvbiBhXG4gICAgLy8gbm9uLWVtcHR5IFNUUklORyBgb3duZXJfaWRgLCBzbyBhIG51bGxlZCBjb2x1bW4gc3RpbGwgcmVhY2hlcyB0aGVcbiAgICAvLyByb3VuZC1yb2Jpbi5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBgIWN0eC5zZXNzaW9uPy5pc1N5c3RlbWAgaXMgbG9hZC1iZWFyaW5nLiBBIHByZWRpY2F0ZSBvZlxuICAgIC8vIGAhY3R4LnByZXZpb3VzICYmICFjdHgudXNlcj8uaWRgIGNvbmZsYXRlcyB0aGUgdHdvIGNhbGxlcnMgdGhhdCBib3RoXG4gICAgLy8gYXJyaXZlIHdpdGhvdXQgYSB1c2VyIGlkOiBhbiBhbm9ueW1vdXMgd2ViLXRvLWNhc2Ugc3VibWl0dGVyICh1bnRydXN0ZWQsXG4gICAgLy8gdGhlIGNhbGxlciB0aGlzIGJyYW5jaCBleGlzdHMgZm9yKSBhbmQgYSBTWVNURU0gd3JpdGUgXHUyMDE0IHNlZWQgbG9hZCxcbiAgICAvLyBiYWNrZmlsbCwgZGVtbyBib290c3RyYXAsIG1pZ3JhdGlvbiBcdTIwMTQgdGhlIG1vc3QgdHJ1c3RlZCBjYWxsZXIgdGhlcmUgaXMuXG4gICAgLy8gRWxzZXdoZXJlIGluIHRoaXMgYXBwIHRoYXQgc2FtZSBhYnNlbmNlIGlzIHJlYWQgdGhlIG9wcG9zaXRlIHdheTpcbiAgICAvLyBgbGVhZF9hdXRvbWF0aW9uYCdzIGNvbnZlcnRlZC1sZWFkIGxvY2sgdHJlYXRzIGAhY3R4LnVzZXI/LmlkYCBhcyBcInN5c3RlbVxuICAgIC8vIHdyaXRlLCBhbGxvdyBpdFwiLiBXaXRob3V0IHRoZSBuYXJyb3dpbmcsIGEgc3lzdGVtIGluc2VydCB0aGF0IG5hbWVzIGFuXG4gICAgLy8gb3duZXIgaGFzIHRoYXQgb3duZXIgYmxhbmtlZCBhbmQgZXZlcnkgc2VlZGVkIG9yIGJhY2tmaWxsZWQgY2FzZSBsYW5kc1xuICAgIC8vIG93bmVybGVzcyAoZWlnaHQgY2FzZXMgaW4gYHRlc3QvdW5hc3NpZ25lZC1jYXNlLXRyaWFnZS1yZWFjaC50ZXN0LnRzYFxuICAgIC8vIGluc2VydCBvd25lZCBjYXNlcyBleGFjdGx5IHRoYXQgd2F5KS4gYGN0eC5zZXNzaW9uLmlzU3lzdGVtYCBpcyB0aGVcbiAgICAvLyBkaXNjcmltaW5hdG9yOiBhIHN5c3RlbSBjb250ZXh0IGFycml2ZXMgYXMgYHNlc3Npb246IHsgaXNTeXN0ZW06IHRydWUgfWBcbiAgICAvLyBhbmQgYW4gYW5vbnltb3VzIG9uZSBjYXJyaWVzIG5vIHNlc3Npb24gYXQgYWxsLiBOYXJyb3dpbmcgb25seSBldmVyXG4gICAgLy8gUkVNT1ZFUyBjYWxsZXJzIGZyb20gdGhlIGJyYW5jaCwgc28gbm90aGluZyBzYW5pdGlzZWQgdG9kYXkgc3RvcHMgYmVpbmcuXG4gICAgLy9cbiAgICAvLyBgZXNjYWxhdGlvbl9yZWFzb25gIGlzIHN0cmlwcGVkIEFMT05HU0lERSBgaXNfZXNjYWxhdGVkYCwgYW5kIHRoZSBwYWlyIGlzXG4gICAgLy8gd2h5OiBjbGVhbmluZyBvbmx5IHRoZSBGTEFHIGxlYXZlcyB0aGUgcHJvc2UgdGhhdCBleHBsYWlucyB0aGUgZmxhZ1xuICAgIC8vIHdyaXRhYmxlLCBzbyBhIGNhc2UgY291bGQgY2FycnkgYSBzdGF0ZWQgZXNjYWxhdGlvbiByZWFzb24gd2hpbGVcbiAgICAvLyBgaXNfZXNjYWxhdGVkYCBpcyBmYWxzZSBcdTIwMTQgYSBjb250cmFkaWN0aW9uIG9uIHRoZSByZWNvcmQgcGFnZSdzIG93blxuICAgIC8vIGBlc2NhbGF0aW9uYCBmaWVsZCBncm91cCwgd2hlcmUgYSBzZXJ2aWNlIGFnZW50IHJlYWRzIGJvdGguIEl0IElTIGFcbiAgICAvLyB3aWRlbmluZyBvZiBhIHNlY3VyaXR5IGNvbnRyb2wsIHNvIGl0IGlzIGFyZ3VlZCByYXRoZXIgdGhhbiBhc3N1bWVkOlxuICAgIC8vIGBlc2NhbGF0aW9uX3JlYXNvbmAgaXMgcGlwZWxpbmUsIG5vdCBhIGZhY3QgYSBzdWJtaXR0ZXIgc3RhdGVzIGFib3V0XG4gICAgLy8gdGhlbXNlbHZlcyBcdTIwMTQgdGhlIHJ1bGUgdGhpcyBicmFuY2ggZGVjbGFyZXMgXHUyMDE0IGFuZCBldmVyeSByZWFsIHdyaXRlciBpc1xuICAgIC8vIHN0YWZmLXNpZGUgKGBjYXNlX2VzY2FsYXRpb25gLCBgY2FzZV9zbGFfbW9uaXRvcmAsIHRoZSBgZXNjYWxhdGVfY2FzZWBcbiAgICAvLyBzY3JlZW4gZmxvdykuIFRoZSBwdWJsaWMgYHdlYl90b19jYXNlYCBmb3JtIChgc3JjL3NlcnZpY2Uvdmlld3MvY2FzZS52aWV3LnRzYClcbiAgICAvLyBjb2xsZWN0cyBleGFjdGx5IGBzdWJqZWN0YCwgYGRlc2NyaXB0aW9uYCwgYHR5cGVgIGFuZCBgcHJpb3JpdHlgLCBzb1xuICAgIC8vIG51bGxpbmcgdGhpcyBkcm9wcyBub3RoaW5nIGFueSBndWVzdCBzdXJmYWNlIGFza3MgZm9yLiBgZ3Vlc3RfcG9ydGFsYFxuICAgIC8vIGdyYW50cyBgY3JtX2Nhc2UuYWxsb3dDcmVhdGVgIGF0IHRoZSBPQkpFQ1QgbGV2ZWwgd2l0aCBubyBmaWVsZFxuICAgIC8vIGFsbG93LWxpc3QsIHdoaWNoIGlzIHByZWNpc2VseSB3aHkgdGhpcyBicmFuY2ggaXMgdGhlIGZpZWxkLWxldmVsIGNvbnRyb2xcbiAgICAvLyBhbmQgd2h5IGFuIG9taXNzaW9uIGZyb20gaXQgaXMgYSBob2xlIHJhdGhlciB0aGFuIGEgc2Vjb25kIGxheWVyLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoZSBtaWRkbGV3YXJlIHBhdGggaXMgTUVBU1VSRUQsIGFuZCB0aGUgYW5zd2VyIGJvdW5kcyB3aGF0IHRoaXNcbiAgICAvLyBicmFuY2ggbWF5IGNsYWltLiBBIHJlYWwgYW5vbnltb3VzIHdyaXRlIGRvZXMgTk9UIHJlYWNoIHRoZXNlIGNvbHVtbnMgb25cbiAgICAvLyB0aGUgc2hpcHBlZCBhcHAgdG9kYXkgXHUyMDE0IGFuZCB0aGlzIGJyYW5jaCBpcyBub3Qgd2hhdCBzdG9wcyBpdC4gRHJpdmVuXG4gICAgLy8gYWdhaW5zdCBhIHJlYWwgc2VydmVyIChgb2JqZWN0c3RhY2sgc3RhcnRgLCB0aGUgcHJvZHVjdGlvbiBwbHVnaW4gc2V0OlxuICAgIC8vIEF1dGgsIFNlY3VyaXR5LCBTaGFyaW5nLCBSZXN0QVBJKSwgdW5hdXRoZW50aWNhdGVkIG92ZXIgSFRUUDpcbiAgICAvL1xuICAgIC8vICAgUE9TVCAgL2FwaS92MS9kYXRhL2NybV9jYXNlICAgICAgICAgNDAxIFVOQVVUSEVOVElDQVRFRFxuICAgIC8vICAgUEFUQ0ggL2FwaS92MS9kYXRhL2NybV9jYXNlLzppZCAgICAgNDAxIFVOQVVUSEVOVElDQVRFRFxuICAgIC8vICAgUE9TVCAgL2FwaS92MS9hY3Rpb25zLy4uLiAgICAgICAgICAgNDAxIFVOQVVUSEVOVElDQVRFRFxuICAgIC8vICAgUE9TVCAgL2FwaS92MS9tY3AgICAgICAgICAgICAgICAgICAgNDAxIFVOQVVUSEVOVElDQVRFRFxuICAgIC8vICAgUE9TVCAgL2FwaS92MS9mb3Jtcy9zdXBwb3J0L3N1Ym1pdCAgMjAxIFx1MjAxNCB0aGUgT05FIGFub255bW91cyB3cml0ZSBwYXRoXG4gICAgLy9cbiAgICAvLyBhbmQgdGhhdCBzdXJ2aXZpbmcgcm91dGUgZmlsdGVycyB0aGUgYm9keSBhZ2FpbnN0IGFuIGFsbG93LWxpc3QgYnVpbHRcbiAgICAvLyBmcm9tIHRoZSBtYXRjaGVkIGZvcm0gdmlldydzIE9XTiBkZWNsYXJlZCBzZWN0aW9ucyAoYEBvYmplY3RzdGFjay9yZXN0YCxcbiAgICAvLyBgcmVnaXN0ZXJGb3JtRW5kcG9pbnRzYCksIHNvIGEgcGxhbnRlZCBpbnRlcm5hbCBmaWVsZCBpcyBkcm9wcGVkIGJlZm9yZVxuICAgIC8vIE9iamVjdFFMIGFuZCBiZWZvcmUgdGhpcyBob29rLlxuICAgIC8vIFx1MjZENCBTbyBkbyBOT1Qgd3JpdGUgZG93biB0aGF0IGEgZ3Vlc3QgcmVhY2hlcyB0aGVzZSBjb2x1bW5zIGluIHByb2R1Y3Rpb24uXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgQW5kIGRvIG5vdCByZWFkIHRoYXQgYXMgXCJ0aGlzIGJyYW5jaCBpcyBjb3NtZXRpY1wiLiBUaGF0IGFsbG93LWxpc3QgaXNcbiAgICAvLyB0aGUgZm9ybSdzIEZJRUxEIExJU1QgXHUyMDE0IGEgcHJvZHVjdCBkZWNpc2lvbiwgbm90IGEgc2VjdXJpdHkgZGVjbGFyYXRpb24gXHUyMDE0XG4gICAgLy8gYW5kICMxNTA1IG1lYXN1cmVkIGl0IGJ5IHdpZGVuaW5nIGl0OiBPTkUgbGluZSBhZGRlZCB0byBgd2ViX3RvX2Nhc2VgJ3NcbiAgICAvLyBzZWN0aW9ucyBhbmQgdGhlIHNhbWUgYW5vbnltb3VzIFBPU1Qgc3RvcmVkIHRoZSBwbGFudGVkIHZhbHVlLCB3aGlsZSBhXG4gICAgLy8gZmllbGQgbGVmdCBvZmYgdGhlIHdpZGVuZWQgZm9ybSBzdGF5ZWQgbnVsbCBpbiB0aGUgc2FtZSByZXF1ZXN0LiBUaGF0IGlzXG4gICAgLy8gd2hhdCBpZGVudGlmaWVzIHRoZSBmb3JtIGxpc3QgYXMgdGhlIG9ubHkgdGhpbmcgaG9sZGluZywgYW5kIHRoaXMgYnJhbmNoXG4gICAgLy8gYXMgdGhlIGxheWVyIHRoYXQgaGFzIHRvIGhvbGQgd2hlbiBpdCBtb3Zlcy4gXHUyNkEwXHVGRTBGIFRoYXQgbWVhc3VyZW1lbnQgd2FzXG4gICAgLy8gdGFrZW4gb24gYGN1c3RvbWVyX3JhdGluZ2AgLyBgY3VzdG9tZXJfZmVlZGJhY2tgLCB3aGljaCAjMTQyOCBoYXMgc2luY2VcbiAgICAvLyByZXRpcmVkIHVuZGVyIEFEUi0wMDQ5IFx1MjAxNCB0aGUgdHdvIGNvbHVtbnMgYXJlIGdvbmUsIHNvIHRoZSBicmFuY2ggbm9cbiAgICAvLyBsb25nZXIgc3RyaXBzIHRoZW07IHRoZSBtZWNoYW5pc20gdGhlIG1lYXN1cmVtZW50IGVzdGFibGlzaGVkIGlzXG4gICAgLy8gdW5jaGFuZ2VkIGFuZCBnb3Zlcm5zIGV2ZXJ5IGZpZWxkIGl0IHN0aWxsIGFzc2lnbnMuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgRmllbGQtbGV2ZWwgcGVybWlzc2lvbnMgYXJlIG5vdCBhIHNlY29uZCBsYXllciBiZWhpbmQgdGhpcyBicmFuY2gsIGFuZFxuICAgIC8vIHRoYXQgd2FzIHJlLW1lYXN1cmVkIGFnYWluc3QgdGhlIGluc3RhbGxlZCB0cmVlIHJhdGhlciB0aGFuIHRha2VuIG9uXG4gICAgLy8gcmVwb3J0OiBgUGVybWlzc2lvbkV2YWx1YXRvci5nZXRGaWVsZFBlcm1pc3Npb25zYCBidWlsZHMgaXRzIG1hc2sgT05MWVxuICAgIC8vIGZyb20gYDxvYmplY3Q+LjxmaWVsZD5gIGtleXMgYSBwZXJtaXNzaW9uIHNldCBuYW1lcyBpbiBpdHMgYGZpZWxkc2AgbWFwLFxuICAgIC8vIGFuZCBgRmllbGRNYXNrZXIuZGV0ZWN0Rm9yYmlkZGVuV3JpdGVzYCByZXR1cm5zIGVhcmx5IG9uIGFuIGVtcHR5IG1hc2tcbiAgICAvLyBhbmQgb3RoZXJ3aXNlIGZsYWdzIG9ubHkgbmFtZXMgcHJlc2VudCBpbiBpdC4gYGd1ZXN0X3BvcnRhbGAgZGVjbGFyZXMgbm9cbiAgICAvLyBgZmllbGRzYCBrZXkgYXQgYWxsLCBzbyBpdHMgbWFzayBpcyBlbXB0eSBhbmQgdGhlIHdyaXRlIGd1YXJkIGlzIHNraXBwZWRcbiAgICAvLyBvdXRyaWdodCBcdTIwMTQgYSBmaWVsZCBOTyBwcm9maWxlIG5hbWVzIGlzIHVucmVzdHJpY3RlZCwgbm90IHJlc3RyaWN0ZWQuXG4gICAgLy9cbiAgICAvLyBOdWxsaW5nIGBlc2NhbGF0aW9uX3JlYXNvbmAgY2Fubm90IHRyaXAgdGhlIG9iamVjdCdzXG4gICAgLy8gYGVzY2FsYXRpb25fcmVhc29uX3JlcXVpcmVkYCB2YWxpZGF0aW9uOiB0aGF0IHJ1bGUgZmlyZXMgb25seSBvblxuICAgIC8vIGBpc19lc2NhbGF0ZWQgPT0gdHJ1ZWAsIHRoaXMgc2FtZSBicmFuY2ggZm9yY2VzIGBpc19lc2NhbGF0ZWQgPSBmYWxzZWAsXG4gICAgLy8gYW5kIG9uIHRoZSBlbmdpbmUncyBpbnNlcnQgcGF0aCBgdmFsaWRhdGVSZWNvcmRgIC9cbiAgICAvLyBgZXZhbHVhdGVWYWxpZGF0aW9uUnVsZXNgIHJ1biBBRlRFUiB0aGUgYGJlZm9yZUluc2VydGAgaG9va3MsIGFnYWluc3QgdGhlXG4gICAgLy8gcm93IHRoZSBob29rIGhhcyBhbHJlYWR5IHJld3JpdHRlbi5cbiAgICBjb25zdCBpc0d1ZXN0U3VibWlzc2lvbiA9ICFjdHgucHJldmlvdXMgJiYgIWN0eC51c2VyPy5pZCAmJiAhY3R4LnNlc3Npb24/LmlzU3lzdGVtO1xuICAgIGlmIChpc0d1ZXN0U3VibWlzc2lvbikge1xuICAgICAgaWYgKCFpbnB1dC5vcmlnaW4pICAgaW5wdXQub3JpZ2luICAgPSAnd2ViJztcbiAgICAgIGlmICghaW5wdXQuc3RhdHVzKSAgIGlucHV0LnN0YXR1cyAgID0gJ25ldyc7XG4gICAgICAvLyBcdTI2QTBcdUZFMEYgTm8gYHByaW9yaXR5YCBkZWZhdWx0IGhlcmUsIGFuZCB0aGUgYWJzZW5jZSBpcyBkZWxpYmVyYXRlLiBBXG4gICAgICAvLyBgaWYgKCFpbnB1dC5wcmlvcml0eSkgaW5wdXQucHJpb3JpdHkgPSAnbWVkaXVtJ2AgbGluZSBoZXJlIGNhbiBuZXZlclxuICAgICAgLy8gZXhlY3V0ZTogYGNybV9jYXNlLnByaW9yaXR5YCBkZWNsYXJlcyBpdHMgYGxvd2Agb3B0aW9uIGBkZWZhdWx0OiB0cnVlYCxcbiAgICAgIC8vIGFuZCBvbiB0aGUgZW5naW5lJ3Mgb3duIGluc2VydCBwYXRoIGBhcHBseUZpZWxkRGVmYXVsdHNgIHByb2R1Y2VzIHRoZVxuICAgICAgLy8gcm93IHRoYXQgQkVDT01FUyBgY3R4LmlucHV0LmRhdGFgIGJlZm9yZSBgdHJpZ2dlckhvb2tzKCdiZWZvcmVJbnNlcnQnKWBcbiAgICAgIC8vIGlzIGNhbGxlZCBcdTIwMTQgc28gdGhlIHNsb3QgaXMgYWxyZWFkeSBmdWxsIGV2ZXJ5IHRpbWUgdGhpcyBicmFuY2ggcnVucy5cbiAgICAgIC8vIFN1Y2ggYSBsaW5lIHJlYWRzIGFzIGEgZGVjbGFyZWQgaW50ZW50IChcImd1ZXN0IHN1Ym1pc3Npb25zIHN0YXJ0IGF0XG4gICAgICAvLyBtZWRpdW1cIikgdGhhdCB0aGUgYXBwIGRvZXMgbm90IGhvbm91ci4gV2hldGhlciBhIHdlYi1zdWJtaXR0ZWQgY2FzZVxuICAgICAgLy8gU0hPVUxEIG91dHJhbmsgYSBzdGFmZi1jcmVhdGVkIG9uZSBpcyBhIHByb2R1Y3QgcXVlc3Rpb24sIGFuZCBpdCBpcyBub3RcbiAgICAgIC8vIHNldHRsZWQgYnkgbGVhdmluZyBkZWFkIGNvZGUgaGVyZSB0aGF0IHNheXMgaXQgYWxyZWFkeSBpcy5cbiAgICAgIGlucHV0Lm93bmVyX2lkICAgICAgICAgID0gbnVsbDtcbiAgICAgIGlucHV0LmlzX2VzY2FsYXRlZCAgICAgID0gZmFsc2U7XG4gICAgICBpbnB1dC5lc2NhbGF0aW9uX3JlYXNvbiA9IG51bGw7XG4gICAgICBpbnB1dC5pbnRlcm5hbF9ub3RlcyAgICA9IG51bGw7XG4gICAgICBpbnB1dC5yZXNvbHV0aW9uICAgICAgICA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcHJpb3JpdHkgPVxuICAgICAgKHR5cGVvZiBpbnB1dC5wcmlvcml0eSA9PT0gJ3N0cmluZycgJiYgaW5wdXQucHJpb3JpdHkpIHx8XG4gICAgICAodHlwZW9mIGN0eC5wcmV2aW91cz8ucHJpb3JpdHkgPT09ICdzdHJpbmcnICYmIChjdHgucHJldmlvdXMucHJpb3JpdHkgYXMgc3RyaW5nKSkgfHxcbiAgICAgIHVuZGVmaW5lZDtcblxuICAgIC8vIE1hdGVyaWFsaXNlIHRoZSB1cmdlbmN5IG9yZGluYWwgc28gcXVldWUgdmlld3MgY2FuIHNvcnQgYnkgaXQuIFNvcnRpbmcgb25cbiAgICAvLyBgcHJpb3JpdHlgIGl0c2VsZiBjb21wYXJlcyByYXcgc3RyaW5ncyBhbmQgaW52ZXJ0cyB1cmdlbmN5XG4gICAgLy8gKG1lZGl1bSA+IGxvdyA+IGhpZ2ggPiBjcml0aWNhbCkuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgVGhlIG1hcCBpcyBkZWNsYXJlZCBJTkxJTkUgYW5kIGR1cGxpY2F0ZWQgaW4gdGFzay5ob29rLnRzIG9uIHB1cnBvc2U6XG4gICAgLy8gTDIgaG9vayBib2RpZXMgcnVuIGJvZHktb25seSBpbiB0aGUgUXVpY2tKUyBzYW5kYm94LCBzbyBhIHNoYXJlZCBtb2R1bGVcbiAgICAvLyBjb25zdGFudCByZXNvbHZlcyBhdCBhdXRob3JpbmcgdGltZSBhbmQgYXJyaXZlcyBhcyBgdW5kZWZpbmVkYC4gVGhlIHR3b1xuICAgIC8vIG1hcHMga2V5IG9mZiBkaWZmZXJlbnQgdm9jYWJ1bGFyaWVzIChtZWRpdW0gdnMgbm9ybWFsKSwgYnV0IHRoZSBVTktOT1dOXG4gICAgLy8gZmFsbGJhY2sgbXVzdCBzdGF5IGlkZW50aWNhbCBvbiBib3RoIG9iamVjdHMgXHUyMDE0IGAwYCwgdGhlIHVucmFua2VkIHNlbnRpbmVsXG4gICAgLy8gdGhhdCBzb3J0cyBiZWxvdyBldmVyeSByZWFsIHJhbmsuIGB0ZXN0L3ByaW9yaXR5LXJhbmstcGFyaXR5LnRlc3QudHNgXG4gICAgLy8gcGlucyB0aGF0IGFncmVlbWVudC5cbiAgICBpZiAocHJpb3JpdHkpIHtcbiAgICAgIGNvbnN0IHJhbms6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7IGxvdzogMSwgbWVkaXVtOiAyLCBoaWdoOiAzLCBjcml0aWNhbDogNCB9O1xuICAgICAgaW5wdXQucHJpb3JpdHlfcmFuayA9IHJhbmtbcHJpb3JpdHldID8/IDA7XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFNMQSBwb2xpY3kgbWF0cml4OiBwcmlvcml0eSBcdTAwRDcgYWNjb3VudCB0aWVyIFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gVGhlIGNhbm9uaWNhbCB3cml0ZS11cCBcdTIwMTQgdGhlIHVuaXQsIGFuZCB3aHkgdGhlIGBjcml0aWNhbGAgcm93IGlzIGZsYXQgYXRcbiAgICAvLyA0IFx1MjAxNCBsaXZlcyBpbiBgX2Nhc2Utc2xhLnRzYC5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBUaGUgdGFibGUgaXMgZGVjbGFyZWQgSU5MSU5FIGFuZCBkdXBsaWNhdGVkIGluIGBfY2FzZS1zbGEudHNgIG9uXG4gICAgLy8gcHVycG9zZSwgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyB0aGUgYHJhbmtgIG1hcCBhYm92ZTogTDIgaG9vayBib2RpZXMgcnVuXG4gICAgLy8gYm9keS1vbmx5IGluIHRoZSBRdWlja0pTIHNhbmRib3gsIHNvIGEgc2hhcmVkIG1vZHVsZSBjb25zdGFudCByZXNvbHZlcyBhdFxuICAgIC8vIGF1dGhvcmluZyB0aW1lIGFuZCBhcnJpdmVzIGFzIGB1bmRlZmluZWRgLiBUaGUgc2VlZCBtb2R1bGUgaW1wb3J0cyB0aGVcbiAgICAvLyByZWFsIGNvbnN0YW50OyB0aGlzIGJvZHkgY2Fubm90LiBgdGVzdC9jYXNlLXNsYS1tYXRyaXgudGVzdC50c2AgcGlucyBhbGxcbiAgICAvLyBzaXh0ZWVuIGNlbGxzIGJ5IGRyaXZpbmcgVEhJUyBoYW5kbGVyLCBzbyB0aGUgY29waWVzIGNhbm5vdCBkcmlmdC5cbiAgICBpZiAocHJpb3JpdHkgJiYgIWlucHV0LnNsYV9kdWVfZGF0ZSAmJiAhY3R4LnByZXZpb3VzPy5zbGFfZHVlX2RhdGUpIHtcbiAgICAgIGNvbnN0IHNsYUNhbGVuZGFySG91cnM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIG51bWJlcj4+ID0ge1xuICAgICAgICBjcml0aWNhbDogeyBzdHJhdGVnaWM6IDQsIGVudGVycHJpc2U6IDQsIG1pZF9tYXJrZXQ6IDQsIHNtYjogNCB9LFxuICAgICAgICBoaWdoOiB7IHN0cmF0ZWdpYzogNiwgZW50ZXJwcmlzZTogOCwgbWlkX21hcmtldDogOCwgc21iOiA4IH0sXG4gICAgICAgIG1lZGl1bTogeyBzdHJhdGVnaWM6IDI0LCBlbnRlcnByaXNlOiAzNiwgbWlkX21hcmtldDogNDgsIHNtYjogNDggfSxcbiAgICAgICAgbG93OiB7IHN0cmF0ZWdpYzogOTYsIGVudGVycHJpc2U6IDEyMCwgbWlkX21hcmtldDogMTY4LCBzbWI6IDE2OCB9LFxuICAgICAgfTtcbiAgICAgIC8vIGBzbWJgIGlzIGJvdGggdGhlIGxvb3Nlc3QgY29sdW1uIGFuZCB0aGUgYHRpZXJgIGZpZWxkJ3Mgb3duIGRlZmF1bHQsIHNvXG4gICAgICAvLyBhbiB1bmNsYXNzaWZpZWQgYWNjb3VudCBhbmQgYW4gVU5SRUFEQUJMRSBvbmUgbGFuZCBvbiB0aGUgc2FtZSBjZWxsLlxuICAgICAgLy8gRXJyaW5nIGxvb3NlIGlzIHRoZSBzYWZlIGRpcmVjdGlvbjogYSB0aWdodGVyIGRlYWRsaW5lIGludmVudGVkIG91dCBvZlxuICAgICAgLy8gYSBwZXJtaXNzaW9uIGVycm9yIHdvdWxkIG1hbnVmYWN0dXJlIGJyZWFjaGVzLlxuICAgICAgY29uc3QgREVGQVVMVF9USUVSID0gJ3NtYic7XG4gICAgICBjb25zdCByb3cgPSBzbGFDYWxlbmRhckhvdXJzW3ByaW9yaXR5XTtcbiAgICAgIC8vIEFuIHVucmVjb2duaXNlZCBwcmlvcml0eSBnZXRzIG5vIGNsb2NrIGF0IGFsbCByYXRoZXIgdGhhbiBhIGd1ZXNzZWRcbiAgICAgIC8vIG9uZSBcdTIwMTQgdGhlIHNhbWUgcmVmdXNhbC10by1pbnZlbnQgYXMgdGhlIGAwYCB1bnJhbmtlZCBzZW50aW5lbCBhYm92ZS5cbiAgICAgIGlmIChyb3cpIHtcbiAgICAgICAgbGV0IHRpZXIgPSBERUZBVUxUX1RJRVI7XG4gICAgICAgIC8vIE9ubHkgcGF5IGZvciB0aGUgYWNjb3VudCByZWFkIHdoZW4gdGhlIHJvdyBhY3R1YWxseSB2YXJpZXMgYnkgdGllci5cbiAgICAgICAgLy8gVGhlIGBjcml0aWNhbGAgcm93IGRvZXMgbm90LCB3aGljaCBpcyB3aGF0IG1ha2VzIGEgY3JpdGljYWwgY2FzZVxuICAgICAgICAvLyBiZWhhdmUgRVhBQ1RMWSBhcyBpdCBkaWQgYmVmb3JlIHRoaXMgaG9vayBsZWFybmVkIGFib3V0IGFjY291bnRzIFx1MjAxNFxuICAgICAgICAvLyBzYW1lIDQgaG91cnMsIHNhbWUgYWJzZW5jZSBvZiBhbnkgZGVwZW5kZW5jeSBvbiBgY3R4LmFwaWAuXG4gICAgICAgIGNvbnN0IHZhcmllc0J5VGllciA9XG4gICAgICAgICAgcm93LnN0cmF0ZWdpYyAhPT0gcm93LmVudGVycHJpc2UgfHxcbiAgICAgICAgICByb3cuZW50ZXJwcmlzZSAhPT0gcm93Lm1pZF9tYXJrZXQgfHxcbiAgICAgICAgICByb3cubWlkX21hcmtldCAhPT0gcm93LnNtYjtcbiAgICAgICAgY29uc3QgYWNjb3VudElkID1cbiAgICAgICAgICAodHlwZW9mIGlucHV0LmNybV9hY2NvdW50ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jcm1fYWNjb3VudCkgfHxcbiAgICAgICAgICAodHlwZW9mIGN0eC5wcmV2aW91cz8uY3JtX2FjY291bnQgPT09ICdzdHJpbmcnICYmIChjdHgucHJldmlvdXMuY3JtX2FjY291bnQgYXMgc3RyaW5nKSkgfHxcbiAgICAgICAgICB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh2YXJpZXNCeVRpZXIgJiYgYWNjb3VudElkICYmIGFwaSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZCA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9hY2NvdW50JykuZmluZCh7XG4gICAgICAgICAgICAgIHdoZXJlOiB7IGlkOiBhY2NvdW50SWQgfSwgZmllbGRzOiBbJ3RpZXInXSwgdG9wOiAxLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByb3dzID0gQXJyYXkuaXNBcnJheShmb3VuZCkgPyBmb3VuZCA6IFtdO1xuICAgICAgICAgICAgY29uc3Qgc3RvcmVkID0gcm93cy5sZW5ndGggPyByb3dzWzBdLnRpZXIgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHN0b3JlZCA9PT0gJ3N0cmluZycgJiYgc3RvcmVkKSB0aWVyID0gc3RvcmVkO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQgdGllciByZXNvbHV0aW9uOiB0aGUgYW5vbnltb3VzIHdlYi10by1jYXNlIGdyYW50IGNhblxuICAgICAgICAgICAgLy8gY3JlYXRlIGEgY2FzZSBhbmQgcmVhZCBub3RoaW5nIGVsc2UsIGFuZCBhIGRlbmlhbCB0aGVyZSBtdXN0IG5vdFxuICAgICAgICAgICAgLy8gcmVqZWN0IHRoZSBzdWJtaXNzaW9uLiBGYWxsaW5nIHRocm91Z2ggbGVhdmVzIGB0aWVyYCBvbiB0aGVcbiAgICAgICAgICAgIC8vIGRlZmF1bHQgY29sdW1uLiAoTm8gYGNvbnNvbGVgIGluIHRoZSBMMiBob29rIHNhbmRib3ggXHUyMDE0IGNmLiAjNDcxLilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaG91cnMgPSByb3dbdGllcl0gPz8gcm93W0RFRkFVTFRfVElFUl07XG4gICAgICAgIC8vIE1pbGxpc2Vjb25kcywgbm90IGBzZXRIb3VycyhnZXRIb3VycygpICsgbilgOiB0aGUgbGF0dGVyIGRvZXMgTE9DQUxcbiAgICAgICAgLy8gY2FsZW5kYXIgYXJpdGhtZXRpYywgc28gb24gYSBob3N0IGluIGEgRFNULW9ic2VydmluZyB6b25lIFwiKzQgaG91cnNcIlxuICAgICAgICAvLyBzaWxlbnRseSBiZWNvbWVzIDMgb3IgNSByZWFsIGhvdXJzIGFjcm9zcyBhIHRyYW5zaXRpb24gXHUyMDE0IGFuZCBhIDE2OGhcbiAgICAgICAgLy8gTG93LXByaW9yaXR5IGNsb2NrIGNyb3NzZXMgb25lIHR3aWNlIGEgeWVhciBieSBjb25zdHJ1Y3Rpb24uIFRoZXNlXG4gICAgICAgIC8vIGFyZSBlbGFwc2VkIGhvdXJzLCBzbyBhZGQgZWxhcHNlZCBtaWxsaXNlY29uZHMuXG4gICAgICAgIGlucHV0LnNsYV9kdWVfZGF0ZSA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBob3VycyAqIDNfNjAwXzAwMCkudG9JU09TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbG9zZWQgZmxhZy9kYXRlICsgcmVzb2x1dGlvbiB0aW1lLlxuICAgIGNvbnN0IGVmZlN0YXR1cyA9XG4gICAgICAodHlwZW9mIGlucHV0LnN0YXR1cyA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3RhdHVzKSB8fFxuICAgICAgKHR5cGVvZiBjdHgucHJldmlvdXM/LnN0YXR1cyA9PT0gJ3N0cmluZycgJiYgKGN0eC5wcmV2aW91cy5zdGF0dXMgYXMgc3RyaW5nKSkgfHxcbiAgICAgIHVuZGVmaW5lZDtcblxuICAgIC8vIGBpc19jbG9zZWRgIGlzIERFUklWRUQgZnJvbSBgc3RhdHVzYCwgb24gZXZlcnkgd3JpdGUgaW5jbHVkaW5nIGEgZ3Vlc3Qncy5cbiAgICAvLyBcdTI2RDQgTmV2ZXIgbWFrZSB0aGUgcmVjb21wdXRlIGNvbmRpdGlvbmFsIG9uIHRoZSBjYWxsZXI6IGEgZ3Vlc3Qnc1xuICAgIC8vIGBzdGF0dXM6ICdjbG9zZWQnYCBzdG9yZWQgYWxvbmdzaWRlIGBpc19jbG9zZWQ6IGZhbHNlYCBjb250cmFkaWN0c1xuICAgIC8vIGl0c2VsZiwgYW5kIGV2ZXJ5IGNvbnN1bWVyIGtleWVkIG9uIHRoZSBmbGFnIFx1MjAxNCB0aGUgcGlubmVkXG4gICAgLy8gYHVuYXNzaWduZWRfdHJpYWdlYCB2aWV3LCB0aGUgYGNhc2VfdW5hc3NpZ25lZF90cmlhZ2Vfc2hhcmluZ2AgcnVsZSBcdTIwMTRcbiAgICAvLyByZWFkcyBzdWNoIGEgY2FzZSBhcyBvcGVuIGJhY2tsb2cgZm9yZXZlci4gQSBkZXJpdmVkIGNvbHVtbiBpcyBkZXJpdmVkIG9uXG4gICAgLy8gZXZlcnkgd3JpdGUgb3IgaXQgaXMgbm90IGRlcml2ZWQgYXQgYWxsOyB0aGUgZ3Vlc3QncyBvd24gYGlzX2Nsb3NlZGAgaXNcbiAgICAvLyBzdGlsbCBpZ25vcmVkLCBiZWNhdXNlIHRoaXMgcmVjb21wdXRlIG92ZXJ3cml0ZXMgd2hhdGV2ZXIgdGhleSBzZW50LlxuICAgIGlmICh0eXBlb2YgZWZmU3RhdHVzID09PSAnc3RyaW5nJykgaW5wdXQuaXNfY2xvc2VkID0gZWZmU3RhdHVzID09PSAnY2xvc2VkJztcblxuICAgIGlmICghaXNHdWVzdFN1Ym1pc3Npb24pIHtcbiAgICAgIGNvbnN0IGJlY2FtZUNsb3NlZCA9IGlucHV0LnN0YXR1cyA9PT0gJ2Nsb3NlZCcgJiYgY3R4LnByZXZpb3VzPy5zdGF0dXMgIT09ICdjbG9zZWQnO1xuICAgICAgaWYgKGJlY2FtZUNsb3NlZCAmJiAhaW5wdXQuY2xvc2VkX2RhdGUgJiYgIWN0eC5wcmV2aW91cz8uY2xvc2VkX2RhdGUpIHtcbiAgICAgICAgaW5wdXQuY2xvc2VkX2RhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNsb3NlZERhdGUgPVxuICAgICAgICAodHlwZW9mIGlucHV0LmNsb3NlZF9kYXRlID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jbG9zZWRfZGF0ZSkgfHxcbiAgICAgICAgKHR5cGVvZiBjdHgucHJldmlvdXM/LmNsb3NlZF9kYXRlID09PSAnc3RyaW5nJyAmJiAoY3R4LnByZXZpb3VzLmNsb3NlZF9kYXRlIGFzIHN0cmluZykpIHx8XG4gICAgICAgIHVuZGVmaW5lZDtcbiAgICAgIC8vIFRoZSBjcmVhdGlvbiBpbnN0YW50IGlzIHRoZSBwbGF0Zm9ybSdzIGBjcmVhdGVkX2F0YCAoIzE5OTIpOiBzdGFtcGVkXG4gICAgICAvLyBieSBgc3lzX3N0YW1wX2F1ZGl0X2luc2VydGAgYmVmb3JlIHRoaXMgaG9vayBydW5zIG9uIGFuIGluc2VydCAoYVxuICAgICAgLy8gc2VlZCByb3cga2VlcHMgaXRzIGF1dGhvcmVkIHZhbHVlKSwgYW5kIHJlYWQgYmFjayBvZmYgdGhlIHN0b3JlZCByb3dcbiAgICAgIC8vIG9uIGFuIHVwZGF0ZS5cbiAgICAgIGNvbnN0IGNyZWF0ZWREYXRlID1cbiAgICAgICAgKHR5cGVvZiBpbnB1dC5jcmVhdGVkX2F0ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jcmVhdGVkX2F0KSB8fFxuICAgICAgICAodHlwZW9mIGN0eC5wcmV2aW91cz8uY3JlYXRlZF9hdCA9PT0gJ3N0cmluZycgJiYgKGN0eC5wcmV2aW91cy5jcmVhdGVkX2F0IGFzIHN0cmluZykpIHx8XG4gICAgICAgIHVuZGVmaW5lZDtcbiAgICAgIGlmIChjbG9zZWREYXRlICYmIGNyZWF0ZWREYXRlKSB7XG4gICAgICAgIGNvbnN0IGhycyA9IChuZXcgRGF0ZShjbG9zZWREYXRlKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShjcmVhdGVkRGF0ZSkuZ2V0VGltZSgpKSAvIDNfNjAwXzAwMDtcbiAgICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShocnMpICYmIGhycyA+PSAwKSBpbnB1dC5yZXNvbHV0aW9uX3RpbWVfaG91cnMgPSBNYXRoLnJvdW5kKGhycyAqIDEwKSAvIDEwO1xuICAgICAgfVxuXG4gICAgICAvLyBcdTI1MDBcdTI1MDAgVGhlIGJyZWFjaCBpcyByZWNvcmRlZCB3aGVuIHRoZSBjbG9jayBzdG9wcyAoIzIwNzApIFx1MjUwMFx1MjUwMFxuICAgICAgLy9cbiAgICAgIC8vIGBjYXNlX3NsYV9tb25pdG9yYCBmbGFncyBhIGJyZWFjaCBvbmx5IHdoaWxlIGEgY2FzZSBpcyBsaXZlIHdvcmssIGFuZFxuICAgICAgLy8gb25seSB3aGVyZSBzY2hlZHVsZWQgd29yayBydW5zLiBBIGNhc2UgcmVzb2x2ZWQgb3IgY2xvc2VkIGFmdGVyIGl0c1xuICAgICAgLy8gYHNsYV9kdWVfZGF0ZWAgdGhlcmVmb3JlIGtlcHQgYGlzX3NsYV92aW9sYXRlZDogZmFsc2VgIGZvciBnb29kLCBhbmRcbiAgICAgIC8vIHRoZSBjbG9zZWQtY2FzZSBzdXJmYWNlcyAoYHNsYV9wZXJmb3JtYW5jZWAsIHRoZSBjb21wbGlhbmNlIGdhdWdlKVxuICAgICAgLy8gY291bnRlZCBpdCBhcyBtZXQuIFRoZSB3cml0ZSB0aGF0IHRha2VzIHRoZSBjYXNlIG91dCBvZiBsaXZlIHdvcmsgaXNcbiAgICAgIC8vIHRoZSBtb21lbnQgaXRzIGNsb2NrIHN0b3BzLCBzbyB0aGF0IHdyaXRlIHJlY29yZHMgYSBsYXRlIGZpbmlzaC5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgcnVsZSBpcyBgY2FzZVNsYUJyZWFjaGVkYCBpbiBgX2Nhc2Utc2xhLnRzYDsgdGhlIHN0YXR1cyBzZXQgaXNcbiAgICAgIC8vIGBDTE9TRURfQ0FTRV9TVEFUVVNFU2AgaW4gYF9jYXNlLWFzc2lnbm1lbnQudHNgLiBCb3RoIGFyZSBzcGVsbGVkXG4gICAgICAvLyBpbmxpbmUgYmVjYXVzZSB0aGlzIGJvZHkgaGFzIG5vIG1vZHVsZSBzY29wZTpcbiAgICAgIC8vIGB0ZXN0L2Nhc2Utc2xhLWJyZWFjaC1vbi1jbG9zZS50ZXN0LnRzYCBkcml2ZXMgdGhlIGxvd2VyZWQgYm9keVxuICAgICAgLy8gYWdhaW5zdCB0aGUgaGVscGVyLCBhbmQgYHRlc3QvbGl2ZS13b3JrLXByZWRpY2F0ZS1wYXJpdHkudGVzdC50c2AgcGluc1xuICAgICAgLy8gdGhlIHNldCBieSBuYW1lLiBPbmx5IHRoZSBFTlRSWSBpbnRvIHRoZSBzZXQgaXMganVkZ2VkIChhXG4gICAgICAvLyByZXNvbHZlZCBcdTIxOTIgY2xvc2VkIHdyaXRlIHN0b3BwZWQgbm8gY2xvY2spLCBhIGNhc2Ugd2l0aCBubyBkdWUgZGF0ZSBpc1xuICAgICAgLy8gbGVmdCBhbG9uZSwgYW5kIHRoZSBmbGFnIGlzIG5ldmVyIGNsZWFyZWQgXHUyMDE0IGEgYnJlYWNoIHN0YXlzIHJlY29yZGVkLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBzdG9wIGluc3RhbnQgaXMgdGhlIGBjbG9zZWRfZGF0ZWAgdGhpcyB3cml0ZSBjYXJyaWVzIFx1MjAxNCB0aGUgc3RhbXBcbiAgICAgIC8vIGFib3ZlLCBvciBhIHN5c3RlbSB3cml0ZXIncyBvd24gXHUyMDE0IGVsc2Ugbm93LiBUaGUgZmxhZyBpcyB3cml0dGVuIG9udG9cbiAgICAgIC8vIHRoaXMgcmVjb3JkJ3Mgb3duIHBheWxvYWQsIHdoaWNoIGlzIG5vdCBhIGNhbGxlci1zdXBwbGllZCBrZXksIHNvIHRoZVxuICAgICAgLy8gYWdlbnQncyBgZWRpdGFibGU6IGZhbHNlYCBtYXNrIG9uIGl0IGRvZXMgbm90IHJlZnVzZSB0aGUgYWdlbnQncyBjbG9zZS5cbiAgICAgIGNvbnN0IHNldHRsZWRTdGF0dXNlcyA9IFsncmVzb2x2ZWQnLCAnY2xvc2VkJ107XG4gICAgICBpZiAoc2V0dGxlZFN0YXR1c2VzLmluY2x1ZGVzKFN0cmluZyhlZmZTdGF0dXMpKSAmJiAhc2V0dGxlZFN0YXR1c2VzLmluY2x1ZGVzKFN0cmluZyhjdHgucHJldmlvdXM/LnN0YXR1cykpKSB7XG4gICAgICAgIGNvbnN0IGR1ZSA9IGlucHV0LnNsYV9kdWVfZGF0ZSAhPT0gdW5kZWZpbmVkID8gaW5wdXQuc2xhX2R1ZV9kYXRlIDogY3R4LnByZXZpb3VzPy5zbGFfZHVlX2RhdGU7XG4gICAgICAgIGNvbnN0IHN0b3BwZWRBdCA9ICh0eXBlb2YgaW5wdXQuY2xvc2VkX2RhdGUgPT09ICdzdHJpbmcnICYmIGlucHV0LmNsb3NlZF9kYXRlKSB8fCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgIGlmICh0eXBlb2YgZHVlID09PSAnc3RyaW5nJyAmJiBEYXRlLnBhcnNlKGR1ZSkgPCBEYXRlLnBhcnNlKHN0b3BwZWRBdCkpIGlucHV0LmlzX3NsYV92aW9sYXRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY2FzZVNpZGVFZmZlY3RzOiBIb29rID0ge1xuICBuYW1lOiAnY2FzZV9zdGF0dXNfc2lkZV9lZmZlY3RzJyxcbiAgb2JqZWN0OiAnY3JtX2Nhc2UnLFxuICBldmVudHM6IFsnYWZ0ZXJVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDgwMCxcbiAgYXN5bmM6IHRydWUsXG4gIG9uRXJyb3I6ICdsb2cnLFxuICBkZXNjcmlwdGlvbjogJ09wZW4gdGhlIGVzY2FsYXRpb24gZm9sbG93LXVwIHRhc2sgZm9yIHRoZSBhY2NvdW50IG93bmVyLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gY3R4O1xuICAgIGNvbnN0IHByZXZpb3VzID0gY3R4LnByZXZpb3VzO1xuICAgIGlmICghcHJldmlvdXMpIHJldHVybjtcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcblxuICAgIGNvbnN0IGNhc2VJZCA9XG4gICAgICAodHlwZW9mIGlucHV0LmlkID09PSAnc3RyaW5nJyAmJiBpbnB1dC5pZCkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXMuaWQgPT09ICdzdHJpbmcnID8gKHByZXZpb3VzLmlkIGFzIHN0cmluZykgOiB1bmRlZmluZWQpO1xuICAgIGNvbnN0IGFjY291bnRJZCA9XG4gICAgICAodHlwZW9mIGlucHV0LmNybV9hY2NvdW50ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jcm1fYWNjb3VudCkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXMuY3JtX2FjY291bnQgPT09ICdzdHJpbmcnICYmIHByZXZpb3VzLmNybV9hY2NvdW50KSB8fFxuICAgICAgdW5kZWZpbmVkO1xuXG4gICAgLy8gRXNjYWxhdGlvbjogb3BlbiB0YXNrIGZvciB0aGUgYWNjb3VudCBvd25lci5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBgb3duZXJfaWRgIGlzIHRoZSBwbGF0Zm9ybSBvd25lcnNoaXAgYW5jaG9yLCBhbmQgcGxhbnRpbmcgYSByZWNvcmRcbiAgICAvLyB1bmRlciBBTk9USEVSIHVzZXIgaXMgYSB0cmFuc2ZlcjogdGhlICMzMDA0IGd1YXJkIGRlbmllcyBpdCB1bmxlc3MgdGhlXG4gICAgLy8gY2FsbGVyIGhvbGRzIGBhbGxvd1RyYW5zZmVyYC4gVGhpcyBpbnNlcnQgcnVucyBvbiBgY3R4LmFwaWAsIHdoaWNoXG4gICAgLy8gY2FycmllcyB0aGUgQ0FMTEVSJ3MgY29udGV4dCAobm90IGEgc3lzdGVtIG9uZSksIHNvIHRoZSBndWFyZCBhcHBsaWVzIFx1MjAxNFxuICAgIC8vIGhlbmNlIHRoZSBgY3JtX3Rhc2suYWxsb3dUcmFuc2ZlcmAgZ3JhbnQgb24gYHNlcnZpY2VfYWdlbnRgIChzZWVcbiAgICAvLyBgc3JjL3NhbGVzL3Byb2ZpbGVzL3NlcnZpY2UtYWdlbnQucHJvZmlsZS50c2AsIGFuZCB0aGUgY2Fub25pY2FsIG5vdGUgaW5cbiAgICAvLyBgc3JjL3NhbGVzL3Byb2ZpbGVzL2luZGV4LnRzYCkuIE9uZSBvd25lcnNoaXAgY29sdW1uIG1lYW5zIG9uZSBhbnN3ZXIsIGFuZCB0aGVcbiAgICAvLyBhbnN3ZXIgaXMgdGhlIHBlcnNvbiB3aG8gbXVzdCBhY3QuXG4gICAgLy9cbiAgICAvLyBUaGUgQ0FTRSBpdHNlbGYgaGFzIGFscmVhZHkgY2hhbmdlZCBoYW5kcyBieSB0aGUgdGltZSB0aGlzIHJ1bnMsIG9uIHRoZVxuICAgIC8vIGBiZWZvcmVVcGRhdGVgIHNlYW0gb2YgdGhpcyB2ZXJ5IHVwZGF0ZSAoYGNhc2VfZXNjYWxhdGlvbl9yZWFzc2lnbmApIFx1MjAxNCBzb1xuICAgIC8vIHRoaXMgaG9vayBzdGlsbCB3cml0ZXMgbm8gYGNybV9jYXNlLm93bmVyX2lkYCBhbmQgbmVlZHMgbm9cbiAgICAvLyBgY3JtX2Nhc2UuYWxsb3dUcmFuc2ZlcmAuIFRoZSB0YXNrIGFuZCB0aGUgY2FzZSBhcmUgdHdvIGRpZmZlcmVudFxuICAgIC8vIGhhbmQtb2ZmczogdGhlIHRhc2sgZ29lcyB0byB0aGUgQUNDT1VOVCBvd25lciAoY29tbWVyY2lhbCBmb2xsb3ctdXApLCB0aGVcbiAgICAvLyBjYXNlIHRvIGEgc2VydmljZSBtYW5hZ2VyICh0aGUgd29yayBpdHNlbGYpLlxuICAgIGlmIChpbnB1dC5zdGF0dXMgPT09ICdlc2NhbGF0ZWQnICYmIHByZXZpb3VzLnN0YXR1cyAhPT0gJ2VzY2FsYXRlZCcgJiYgYWNjb3VudElkKSB7XG4gICAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2FjY291bnQnKS5maW5kT25lKHsgd2hlcmU6IHsgaWQ6IGFjY291bnRJZCB9IH0pO1xuICAgICAgY29uc3Qgb3duZXJJZCA9IChhY2NvdW50IGFzIHsgb3duZXJfaWQ/OiBzdHJpbmcgfSB8IG51bGwpPy5vd25lcl9pZCA/PyBjdHgudXNlcj8uaWQ7XG4gICAgICAvLyBVVEMgY2FsZW5kYXIgZm9yIHRoZSBzdGVwLCBtYXRjaGluZyB0aGUgYHRvSVNPU3RyaW5nKClgIHJlbmRlciBiZWxvd1xuICAgICAgLy8gKHNhbWUgc2hhcGUgYXMgYGxlYWQuaG9vay50c2AgLyBgb3Bwb3J0dW5pdHkuaG9vay50c2ApOiBhIGxvY2FsXG4gICAgICAvLyBgc2V0RGF0ZWAgc3RlcCBwcmVzZXJ2ZXMgd2FsbC1jbG9jayB0aW1lLCBzbyBhIG9uZS1kYXkgZm9sbG93LXVwIGZpbGVkXG4gICAgICAvLyBhY3Jvc3MgYSBzcHJpbmctZm9yd2FyZCBsYW5kcyBvbiB0aGUgZGF5IG9mIHRoZSBlc2NhbGF0aW9uIGl0c2VsZi5cbiAgICAgIGNvbnN0IGR1ZSA9IG5ldyBEYXRlKCk7XG4gICAgICBkdWUuc2V0VVRDRGF0ZShkdWUuZ2V0VVRDRGF0ZSgpICsgMSk7XG4gICAgICAvLyBUaXRsZSB0aGUgdGFzayB3aXRoIHdoYXQgdGhlIHJlYWRlciBhbHJlYWR5IGtub3dzIHRoZSBjYXNlIGJ5ICgjMTIwOCkuXG4gICAgICAvLyBUaXRsZSB0aGUgdGFzayB3aXRoIHdoYXQgdGhlIHJlYWRlciBhbHJlYWR5IGtub3dzIHRoZSBjYXNlIGJ5LiBUaGVcbiAgICAgIC8vIFBSSU1BUlkgS0VZIGlzIG5vdCB0aGF0OiBldmVyeSBjYXNlIHN1cmZhY2UgaW4gdGhpcyBhcHAgKHJlY29yZCBwYWdlcyxcbiAgICAgIC8vIGxpc3Qgdmlld3MsIGJyZWFkY3J1bWJzLCB0aGUgYGRpc3BsYXlfdGl0bGVgIGZvcm11bGEgb24gYGNybV9jYXNlYClcbiAgICAgIC8vIG5hbWVzIGEgY2FzZSBgQ0FTRS0wMDAzOWAsIHNvIGEgcXVldWUgb2YgdXJnZW50IHJvd3MgZGlmZmVyaW5nIG9ubHkgaW5cbiAgICAgIC8vIGEgMTYtY2hhcmFjdGVyIG9wYXF1ZSBpZCBpcyBhIHF1ZXVlIG5vYm9keSBjYW4gdHJpYWdlLiBUaGUgaWQgaXMgbm90XG4gICAgICAvLyBsb3N0IFx1MjAxNCBpdCB0cmF2ZWxzIGluIGByZWxhdGVkX3RvX2Nhc2VgIGJlbG93LCB3aGVyZSBhIHJlbGF0aW9uc2hpcFxuICAgICAgLy8gYmVsb25ncy5cbiAgICAgIC8vXG4gICAgICAvLyBCb3RoIHBhcnRzIGFyZSByZWFkIG9mZiBgcHJldmlvdXNgLCBub3QgZmV0Y2hlZDogYW4gYGFmdGVyVXBkYXRlYFxuICAgICAgLy8gcHJlLWltYWdlIGlzIHRoZSBXSE9MRSBzdG9yZWQgcm93IChgZHJpdmVyLmZpbmRPbmVgIHdpdGggbm9cbiAgICAgIC8vIHByb2plY3Rpb24pLCBzbyBgY2FzZV9udW1iZXJgIFx1MjAxNCBhbiBlbmdpbmUtaXNzdWVkIGF1dG9udW1iZXIsIG5ldmVyXG4gICAgICAvLyBwcmVzZW50IG9uIGFuIHVwZGF0ZSBwYXlsb2FkIFx1MjAxNCBhbmQgYHN1YmplY3RgIGFyZSBib3RoIGFscmVhZHkgaW4gaGFuZC5cbiAgICAgIC8vIGBzdWJqZWN0YCBzdGlsbCBwcmVmZXJzIGBpbnB1dGAsIHNpbmNlIGFuIHVwZGF0ZSBtYXkgYmUgY2hhbmdpbmcgaXQgaW5cbiAgICAgIC8vIHRoaXMgdmVyeSB3cml0ZS5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgVGhlIDI1NSBjYXAgaXMgbm90IGNvc21ldGljLiBgY3JtX3Rhc2suc3ViamVjdGAgZGVjbGFyZXNcbiAgICAgIC8vIGBtYXhMZW5ndGg6IDI1NWAgYW5kIHRoZSBlbmdpbmUgRU5GT1JDRVMgaXQsIHdoaWxlIGBjcm1fY2FzZS5zdWJqZWN0YFxuICAgICAgLy8gYWxsb3dzIHRoZSBzYW1lIDI1NSBcdTIwMTQgc28gYEVzY2FsYXRlZDogYCArIG51bWJlciArIHNlcGFyYXRvciArIGFcbiAgICAgIC8vIG1heC1sZW5ndGggY2FzZSBzdWJqZWN0IGlzIDI3OSBjaGFyYWN0ZXJzIGFuZCB0aGUgaW5zZXJ0IGlzIFJFSkVDVEVELlxuICAgICAgLy8gVGhpcyBob29rIGlzIGBhc3luYzogdHJ1ZWAgKyBgb25FcnJvcjogJ2xvZydgLCBzbyB0aGF0IHJlamVjdGlvblxuICAgICAgLy8gc3VyZmFjZXMgbm93aGVyZTogdGhlIGVzY2FsYXRpb24gdGFzayB3b3VsZCBzaW1wbHkgbmV2ZXIgZXhpc3QuXG4gICAgICAvLyBUcnVuY2F0aW5nIHRoZSBUQUlMIGtlZXBzIHRoZSBpZGVudGlmaWVyIFx1MjAxNCB0aGUgZGlzY3JpbWluYXRpbmcgaGFsZiBcdTIwMTRcbiAgICAgIC8vIGludGFjdCBpbiBhIGNvbHVtbiB0aGF0IHZpc2libHkgdHJ1bmNhdGVzIGFueXdheS5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgQ29tcG9zZWQgSU5MSU5FIHJhdGhlciB0aGFuIGluIGEgc2hhcmVkIGhlbHBlcjogaG9vayBib2RpZXMgc2hpcFxuICAgICAgLy8gYm9keS1vbmx5IHRocm91Z2ggUXVpY2tKUywgYW5kIGEgbW9kdWxlLXNjb3BlIHJlZmVyZW5jZSBtYWtlc1xuICAgICAgLy8gYGV4dHJhY3RIb29rQm9keWAgdGhyb3cgXHUyMDE0IHdoaWNoIHRoZSBDTEkgYnVpbGQgQ0FUQ0hFUywgc2lsZW50bHlcbiAgICAgIC8vIGJ1bmRsaW5nIHRoZSBjbG9zdXJlIGluc3RlYWQsIHdpdGggbm8gZ2F0ZSBnb2luZyByZWQuIFRoZSBwaW4gcnVucyB0aGlzXG4gICAgICAvLyBvdXQgb2YgdGhlIExPV0VSRUQgYm9keSBmb3IgZXhhY3RseSB0aGF0IHJlYXNvblxuICAgICAgLy8gKGB0ZXN0L2VzY2FsYXRpb24tdGFzay1zdWJqZWN0LnRlc3QudHNgKS5cbiAgICAgIGNvbnN0IGNhc2VOdW1iZXIgPSB0eXBlb2YgcHJldmlvdXMuY2FzZV9udW1iZXIgPT09ICdzdHJpbmcnID8gcHJldmlvdXMuY2FzZV9udW1iZXIudHJpbSgpIDogJyc7XG4gICAgICBjb25zdCBjYXNlU3ViamVjdCA9XG4gICAgICAgICh0eXBlb2YgaW5wdXQuc3ViamVjdCA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3ViamVjdC50cmltKCkpIHx8XG4gICAgICAgICh0eXBlb2YgcHJldmlvdXMuc3ViamVjdCA9PT0gJ3N0cmluZycgJiYgcHJldmlvdXMuc3ViamVjdC50cmltKCkpIHx8XG4gICAgICAgICcnO1xuICAgICAgY29uc3QgbGFiZWwgPSBbY2FzZU51bWJlciwgY2FzZVN1YmplY3RdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgXHUwMEI3ICcpO1xuICAgICAgY29uc3QgdGl0bGVkID0gbGFiZWwgPyBgRXNjYWxhdGVkOiAke2xhYmVsfWAgOiAnRXNjYWxhdGVkIGNhc2UgbmVlZHMgYXR0ZW50aW9uJztcbiAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV90YXNrJykuaW5zZXJ0KHtcbiAgICAgICAgc3ViamVjdDogdGl0bGVkLmxlbmd0aCA+IDI1NSA/IGAke3RpdGxlZC5zbGljZSgwLCAyNTQpfVx1MjAyNmAgOiB0aXRsZWQsXG4gICAgICAgIHN0YXR1czogJ25vdF9zdGFydGVkJyxcbiAgICAgICAgcHJpb3JpdHk6ICd1cmdlbnQnLFxuICAgICAgICB0eXBlOiAnZm9sbG93X3VwJyxcbiAgICAgICAgZHVlX2RhdGU6IGR1ZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKSxcbiAgICAgICAgb3duZXJfaWQ6IG93bmVySWQsXG4gICAgICAgIHJlbGF0ZWRfdG9fdHlwZTogJ2NybV9jYXNlJyxcbiAgICAgICAgcmVsYXRlZF90b19jYXNlOiBjYXNlSWQsXG4gICAgICAgIHJlbGF0ZWRfdG9fYWNjb3VudDogYWNjb3VudElkLFxuICAgICAgfSk7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBSZXNvbHV0aW9uIHJvbGx1cDogYSBjYXNlIHJlYWNoaW5nIGByZXNvbHZlZGAgYnVtcHMgaXRzIGFjY291bnQnc1xuICogYGxhc3RfYWN0aXZpdHlfZGF0ZWAuXG4gKlxuICogXHUyNkQ0IE5vIGRhdGUgaXMgc3RhbXBlZCBvbiB0aGUgQ0FTRSBcdTIwMTQgYGNsb3NlZF9kYXRlYCBiZWxvbmdzIGV4Y2x1c2l2ZWx5IHRvIHRoZVxuICogYGNsb3NlZGAgdHJhbnNpdGlvbiAoc3RhbXBlZCBieSBgY2FzZV9zbGFfZGVmYXVsdHNgKS4gV3JpdGluZyBpdCBhcyBhIHByb3h5XG4gKiBmb3IgYSByZXNvbHZlZC1kYXRlIGJvdGggY29ycnVwdHMgcmVzb2x1dGlvbiBtZXRyaWNzIChhIHJlc29sdmVkLXRoZW4tY2xvc2VkXG4gKiBjYXNlIGtlZXBzIGl0cyByZXNvbHZlIHRpbWUgYXMgaXRzIGNsb3NlIHRpbWUpIGFuZCByZS1lbnRlcnMgdGhlXG4gKiByZWNvcmQtY2hhbmdlIHRyaWdnZXIgc3VyZmFjZS5cbiAqXG4gKiAjIyBgcnVuQXM6ICdzeXN0ZW0nYCwgYW5kIHdoeSB0aGlzIGlzIGl0cyBvd24gaG9vayAoIzIwMTQpXG4gKlxuICogQ2FzZXMgYXJlIHJlc29sdmVkIGJ5IHNlcnZpY2UgYWdlbnRzLCBhbmQgYW4gYWdlbnQgaG9sZHMgbm8gZWRpdCByaWdodCBvblxuICogYWNjb3VudHMgXHUyMDE0IHNvIGFzIHRoZSBjYWxsZXIgdGhlIGJ1bXAgd2FzIHJlZnVzZWQsIGBvbkVycm9yOiAnbG9nJ2Agc3dhbGxvd2VkXG4gKiBpdCwgYW5kIGFuIGFnZW50J3MgcmVzb2x2ZSBuZXZlciByZWFjaGVkIHRoZSBhY2NvdW50J3MgYWN0aXZpdHkgY2xvY2suIFRoZVxuICogY2xvY2sgaXMgdGhlIGFjY291bnQncyBkZXJpdmVkIGZhY3QsIG5vdCB0aGUgYWdlbnQncyBlZGl0LCBzbyB0aGUgd3JpdGUgaXNcbiAqIGVsZXZhdGVkLiBJdCBpcyBzcGxpdCBvdXQgb2YgYGNhc2Vfc3RhdHVzX3NpZGVfZWZmZWN0c2AgYmVjYXVzZSBgcnVuQXNgIGlzXG4gKiBwZXIgaG9vayBhbmQgdGhhdCBob29rJ3Mgb3RoZXIgd3JpdGUgXHUyMDE0IHRoZSBlc2NhbGF0aW9uIHRhc2sgXHUyMDE0IG5lZWRzIG5vXG4gKiBlbGV2YXRpb246IHRoZSBhZ2VudCdzIG5hcnJvdyBgY3JtX3Rhc2suYWxsb3dUcmFuc2ZlcmAgZ3JhbnQgZXhpc3RzIGZvciBpdFxuICogKGBzZXJ2aWNlLWFnZW50LnByb2ZpbGUudHNgKS4gRWxldmF0aW5nIGFzIGxpdHRsZSBhcyBwb3NzaWJsZSAoQUdFTlRTLm1kIHJ1bGVcbiAqIDkpIG1lYW5zIHRoaXMgb25lIHdyaXRlLiBFbGV2YXRpb24gaXMgbm90IGFub255bWl0eTogdGhlIGFjY291bnQnc1xuICogYHVwZGF0ZWRfYnlgIHN0aWxsIG5hbWVzIHRoZSBhZ2VudC4gT3JnYW5pemF0aW9uIChydWxlIDEwKTogaXQgd3JpdGVzIG9ubHlcbiAqIHRoZSBhY2NvdW50IHRoZSB0cmlnZ2VyaW5nIGNhc2UgbmFtZXMsIGFuZCB0aGUgZWxldmF0ZWQgYGN0eC5hcGlgIGtlZXBzIHRoZVxuICogdHJpZ2dlcidzIHRlbmFudC5cbiAqL1xuY29uc3QgY2FzZVJlc29sdXRpb25BY2NvdW50QWN0aXZpdHk6IEhvb2sgPSB7XG4gIG5hbWU6ICdjYXNlX3Jlc29sdXRpb25fYWNjb3VudF9hY3Rpdml0eScsXG4gIG9iamVjdDogJ2NybV9jYXNlJyxcbiAgZXZlbnRzOiBbJ2FmdGVyVXBkYXRlJ10sXG4gIHByaW9yaXR5OiA4MDAsXG4gIGFzeW5jOiB0cnVlLFxuICBvbkVycm9yOiAnbG9nJyxcbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICBkZXNjcmlwdGlvbjogJ0J1bXAgdGhlIGFjY291bnRcdTIwMTlzIGxhc3QgYWN0aXZpdHkgZGF0ZSB3aGVuIGEgY2FzZSBpcyByZXNvbHZlZC4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICBpZiAoIXByZXZpb3VzKSByZXR1cm47XG4gICAgaWYgKGlucHV0LnN0YXR1cyAhPT0gJ3Jlc29sdmVkJyB8fCBwcmV2aW91cy5zdGF0dXMgPT09ICdyZXNvbHZlZCcpIHJldHVybjtcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcbiAgICBjb25zdCBhY2NvdW50SWQgPVxuICAgICAgKHR5cGVvZiBpbnB1dC5jcm1fYWNjb3VudCA9PT0gJ3N0cmluZycgJiYgaW5wdXQuY3JtX2FjY291bnQpIHx8XG4gICAgICAodHlwZW9mIHByZXZpb3VzLmNybV9hY2NvdW50ID09PSAnc3RyaW5nJyAmJiBwcmV2aW91cy5jcm1fYWNjb3VudCkgfHxcbiAgICAgIHVuZGVmaW5lZDtcbiAgICBpZiAoIWFjY291bnRJZCkgcmV0dXJuO1xuICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV9hY2NvdW50JykudXBkYXRlKFxuICAgICAgeyBpZDogYWNjb3VudElkLCBsYXN0X2FjdGl2aXR5X2RhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCkgfSxcbiAgICAgIHsgd2hlcmU6IHsgaWQ6IGFjY291bnRJZCB9IH0sXG4gICAgKTtcbiAgfSxcbn07XG5cbi8qKlxuICogT3duZXJsZXNzLWludGFrZSByb3VuZC1yb2JpbiwgY29tcG9zZWQgZnJvbSBgX2Nhc2UtYXNzaWdubWVudC50c2AuXG4gKlxuICogXHUyNkEwXHVGRTBGIExpc3RlZCBBRlRFUiBgY2FzZV9zbGFfZGVmYXVsdHNgIGhlcmUgZm9yIHJlYWRhYmlsaXR5IG9ubHkgXHUyMDE0IHJ1bnRpbWVcbiAqIG9yZGVyaW5nIGlzIGRlY2lkZWQgYnkgYHByaW9yaXR5YCAoMjUwIHZzIDIwMCksIG5vdCBieSBhcnJheSBwb3NpdGlvbiwgYW5kIGl0XG4gKiBpcyBsb2FkLWJlYXJpbmc6IGBjYXNlX3NsYV9kZWZhdWx0c2Agc3RyaXBzIGEgZ3Vlc3Qtc3VwcGxpZWQgYG93bmVyX2lkYCBhbmRcbiAqIHRoaXMgaG9vayBtdXN0IHJ1biBhZnRlciB0aGUgc3RyaXAsIG5ldmVyIGJlZm9yZSBpdC5cbiAqL1xuY29uc3QgY2FzZUF1dG9Bc3NpZ246IEhvb2sgPSBjcmVhdGVDYXNlUm91bmRSb2JpbkFzc2lnbigpO1xuXG4vKipcbiAqIEVzY2FsYXRpb24gaGFuZC1vZmYgdG8gdGhlIGBzZXJ2aWNlX21hbmFnZXJgIHBvb2wsIGNvbXBvc2VkIGZyb21cbiAqIGBfY2FzZS1hc3NpZ25tZW50LnRzYC5cbiAqXG4gKiBSdW5zIG9uIGBiZWZvcmVVcGRhdGVgIGFuZCBtdXRhdGVzIHRoZSBlc2NhbGF0aW9uIHdyaXRlIGl0c2VsZiBcdTIwMTQgaXQgaXNzdWVzIG5vXG4gKiBvcGVyYXRpb24gb2YgaXRzIG93biwgd2hpY2ggaXMgd2hhdCBrZWVwcyBpdCBvZmYgdGhlIHJlY29yZC1jaGFuZ2UgdHJpZ2dlclxuICogc3VyZmFjZS5cbiAqL1xuY29uc3QgY2FzZUVzY2FsYXRpb25SZWFzc2lnbjogSG9vayA9IGNyZWF0ZUNhc2VFc2NhbGF0aW9uUmVhc3NpZ24oKTtcblxuLyoqXG4gKiBUcmlhZ2Ugc2VsZi1jbGFpbSwgY29tcG9zZWQgZnJvbSBgX2Nhc2UtYXNzaWdubWVudC50c2AuXG4gKlxuICogQW4gYWdlbnQgd2hvIG1vdmVzIGFuIHVub3duZWQgb3BlbiBjYXNlIGludG8gYSB3b3JrZWQgc3RhdHVzIGJlY29tZXMgaXRzXG4gKiBvd25lci4gXHUyNkEwXHVGRTBGIFByaW9yaXR5IDI2MCBwdXRzIGl0IEFGVEVSIHRoZSBlc2NhbGF0aW9uIGhhbmQtb2ZmICgyNTApLCBhbmQgaXRcbiAqIHN0YW5kcyBkb3duIHdoZW5ldmVyIGBvd25lcl9pZGAgaXMgYWxyZWFkeSBpbiB0aGUgcGF5bG9hZCBcdTIwMTQgc28gdGhlIHR3b1xuICogb3duZXJzaGlwIHdyaXRlcnMgb24gdGhpcyBzZWFtIGNhbm5vdCBib3RoIHNwZWFrLiBMaWtlIHRoZSBoYW5kLW9mZiBpdCBpc3N1ZXNcbiAqIG5vIG9wZXJhdGlvbiBvZiBpdHMgb3duOyB1bmxpa2UgZWl0aGVyIHNpYmxpbmcgaXQgcmVhZHMgbm8gcG9vbCwgYmVjYXVzZSB0aGVcbiAqIG9ubHkgdXNlciBpZCBpdCBjYW4gd3JpdGUgaXMgdGhlIGNhbGxlcidzIG93bi5cbiAqL1xuY29uc3QgY2FzZVNlbGZDbGFpbTogSG9vayA9IGNyZWF0ZUNhc2VTZWxmQ2xhaW0oKTtcblxuLyoqXG4gKiBOb3JtYWxpc2UgYSBCTEFOSyBgcmVzb2x2ZWRfYnlfYXJ0aWNsZWAgdG8gTlVMTC5cbiAqXG4gKiBBZGRpdGl2ZSBhbmQgZGVsaWJlcmF0ZWx5IGluZGVwZW5kZW50IG9mIGV2ZXJ5dGhpbmcgYWJvdmU6IGl0IHRvdWNoZXMgbm9cbiAqIG93bmVyc2hpcCBjb2x1bW4gYW5kIGlzc3VlcyBubyBvcGVyYXRpb24gb2YgaXRzIG93bi5cbiAqXG4gKiAjIyMgV2h5IGl0IGhhcyB0byBleGlzdFxuICpcbiAqIGByZXNvbHZlZF9ieV9hcnRpY2xlYCBpcyB0aGUgY29sdW1uIHRoZSBkZWZsZWN0aW9uIHJhdGlvIG9uIGBjYXNlX21ldHJpY3NgXG4gKiBjb3VudHMgKGBrYl9yZXNvbHZlZF9jb3VudGAgPSBgY291bnQocmVzb2x2ZWRfYnlfYXJ0aWNsZSlgIG92ZXIgY2xvc2VkIGNhc2VzKS5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgUGxhdGZvcm0gYmVoYXZpb3VyLCBtZWFzdXJlZCBhZ2FpbnN0IHRoZSByZWFsIGF1dG9tYXRpb24gZW5naW5lOiBhblxuICogb3B0aW9uYWwgU0NSRUVOIGZpZWxkIHRoZSBhZ2VudCBsZWF2ZXMgZW1wdHkgZG9lcyBub3QgYXJyaXZlIGFzIFwiYWJzZW50XCIgXHUyMDE0XG4gKiB0aGUgcmVzdW1lIGNhcnJpZXMgYCcnYCwgYW5kIGB1cGRhdGVfcmVjb3JkYCB3cml0ZXMgdGhhdCBlbXB0eSBzdHJpbmcgaW50b1xuICogdGhlIGNvbHVtbjpcbiAqXG4gKiAgIHN1cHBsaWVkIGAna2ExJ2AgXHUyMTkyIGByZXNvbHZlZF9ieV9hcnRpY2xlOiBcImthMVwiYFxuICogICBsZWZ0IGJsYW5rICAgICAgIFx1MjE5MiBgcmVzb2x2ZWRfYnlfYXJ0aWNsZTogXCJcImAgICAgICBcdTIxOTAgY291bnRlZCBieSBjb3VudChjb2wpXG4gKiAgIGtleSBvbWl0dGVkICAgICAgXHUyMTkyIGNvbHVtbiBub3Qgd3JpdHRlbiBhdCBhbGwgICAgICBcdTIxOTAgY29ycmVjdFxuICpcbiAqIFNRTCBgY291bnQoY29sdW1uKWAgY291bnRzIGV2ZXJ5IE5PTi1OVUxMIHZhbHVlLCBhbmQgYCcnYCBpcyBub3QgTlVMTC4gU29cbiAqIHdpdGhvdXQgdGhpcyBob29rIGV2ZXJ5IGNhc2UgY2xvc2VkIFdJVEhPVVQgYW4gYXJ0aWNsZSBsYW5kcyBpbiB0aGUgbnVtZXJhdG9yXG4gKiBhbmQgdGhlIGRlZmxlY3Rpb24gcmF0ZSByZWFkcyAxMDAlIG9uIGEgZGFzaGJvYXJkIHRoYXQgcmFpc2VzIG5vIGVycm9yIHdoaWxlXG4gKiBkb2luZyBpdCBcdTIwMTQgYSB3cm9uZyByYXRpbyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgcmlnaHQgb25lLlxuICpcbiAqIEZpeGluZyBpdCBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSBtZWFzdXJlIGlzIGRlbGliZXJhdGU6IGFuIGVtcHR5IHN0cmluZyBpbiBhXG4gKiBsb29rdXAgY29sdW1uIGlzIHdyb25nIGZvciB0aGUgcmVjb3JkIGZvcm0sIHRoZSBsaXN0IHZpZXdzLCB0aGUgcmVwb3J0cyBhbmRcbiAqIGFueSBmdXR1cmUgcmVhZGVyIHRvbywgc28gaXQgaXMgdGhlIFNUT1JFRCB2YWx1ZSB0aGF0IGlzIGNvcnJlY3RlZC4gVGVhY2hpbmdcbiAqIG9uZSBtZWFzdXJlIHRvIGRpc2NvdW50IGAnJ2AgaXMgYSBsZW5pZW50IGNvbnN1bWVyIHBhcGVyaW5nIG92ZXIgYmFkIGRhdGEsXG4gKiBhbmQgdGhlIG5leHQgcmVhZGVyIHdvdWxkIG5vdCBrbm93IHRvIGNvcHkgaXQuXG4gKiBgdGVzdC9rbm93bGVkZ2UtZGVmbGVjdGlvbi50ZXN0LnRzYCBwaW5zIGJvdGggaGFsdmVzLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBUaGUgYmxhbmsgdGVzdCBpcyBzcGVsbGVkIGlubGluZSByYXRoZXIgdGhhbiBsaWZ0ZWQgaW50byBhIHNoYXJlZCBoZWxwZXI6XG4gKiBob29rIGhhbmRsZXJzIGxvd2VyIHRvIGEgbWV0YWRhdGEtb25seSBib2R5IGFuZCBhIGZyZWUgaWRlbnRpZmllciB3b3VsZCBwdXNoXG4gKiB0aGlzIG9uZSBpbnRvIHRoZSBsZWdhY3kgcnVudGltZSBidW5kbGUgaW5zdGVhZFxuICogKGB0ZXN0L2FjdGlvbi1zYW5kYm94LnRlc3QudHNgIGZhaWxzIHRoZSBidWlsZCBvbiBpdCkuXG4gKi9cbmNvbnN0IGNhc2VSZXNvbHV0aW9uQXJ0aWNsZU5vcm1hbGl6ZTogSG9vayA9IHtcbiAgbmFtZTogJ2Nhc2VfcmVzb2x1dGlvbl9hcnRpY2xlX25vcm1hbGl6ZScsXG4gIG9iamVjdDogJ2NybV9jYXNlJyxcbiAgZXZlbnRzOiBbJ2JlZm9yZUluc2VydCcsICdiZWZvcmVVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDE1MCxcbiAgZGVzY3JpcHRpb246ICdOb3JtYWxpc2UgYSBibGFuayByZXNvbHZlZF9ieV9hcnRpY2xlIHRvIG51bGwgc28gdGhlIGRlZmxlY3Rpb24gbWVhc3VyZSBjb3VudHMgb25seSByZWFsIGxpbmtzLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gY3R4O1xuICAgIC8vIE9ubHkgYSB3cml0ZSB0aGF0IENBUlJJRVMgdGhlIGtleSBpcyBub3JtYWxpc2VkLiBBbiB1cGRhdGUgdGhhdCBuZXZlclxuICAgIC8vIG1lbnRpb25zIHRoZSBjb2x1bW4gbXVzdCBub3QgY2xlYXIgYSBsaW5rIHNvbWVib2R5IGVsc2Ugc2V0LlxuICAgIGlmICghKCdyZXNvbHZlZF9ieV9hcnRpY2xlJyBpbiBpbnB1dCkpIHJldHVybjtcbiAgICBjb25zdCB2YWx1ZSA9IGlucHV0LnJlc29sdmVkX2J5X2FydGljbGU7XG4gICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbnB1dC5yZXNvbHZlZF9ieV9hcnRpY2xlID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUudHJpbSgpID09PSAnJykge1xuICAgICAgaW5wdXQucmVzb2x2ZWRfYnlfYXJ0aWNsZSA9IG51bGw7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgW1xuICBjYXNlVmFsaWRhdGlvbixcbiAgY2FzZUF1dG9Bc3NpZ24sXG4gIGNhc2VFc2NhbGF0aW9uUmVhc3NpZ24sXG4gIGNhc2VTZWxmQ2xhaW0sXG4gIGNhc2VSZXNvbHV0aW9uQXJ0aWNsZU5vcm1hbGl6ZSxcbiAgY2FzZVNpZGVFZmZlY3RzLFxuICBjYXNlUmVzb2x1dGlvbkFjY291bnRBY3Rpdml0eSxcbl07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHMva25vd2xlZGdlX2FydGljbGUuaG9vay50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL2tub3dsZWRnZV9hcnRpY2xlLmhvb2sudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcblxuLyoqXG4gKiBLbm93bGVkZ2UgYXJ0aWNsZSBsaWZlY3ljbGUgaG9vay5cbiAqXG4gKiBPbiB0aGUgRklSU1QgcHVibGlzaCwgc3RhbXBzIGBwdWJsaXNoZWRfYXRgIGFuZCBgbGFzdF9yZXZpZXdlZF9hdGAuIE9uIGV2ZXJ5XG4gKiBsYXRlciB3cml0ZSB0aGF0IGxlYXZlcyB0aGUgYXJ0aWNsZSBwdWJsaXNoZWQgXHUyMDE0IGFuIG9yZGluYXJ5IGVkaXQsIG9yIGFcbiAqIHJlLXB1Ymxpc2ggYWZ0ZXIgYXJjaGl2aW5nIFx1MjAxNCByZWZyZXNoZXMgYGxhc3RfcmV2aWV3ZWRfYXRgIG9ubHksIHNvIGFkbWluXG4gKiBcInN0YWxlIGFydGljbGVcIiByZXBvcnRzIGtlZXAgd29ya2luZyB3aGlsZSB0aGUgb3JpZ2luYWwgcHVibGlzaCBkYXRlIHN0YXlzXG4gKiBwdXQuXG4gKlxuICogXCJGaXJzdCBwdWJsaXNoXCIgaXMgZGVjaWRlZCBieSB3aGV0aGVyIHRoZSByZWNvcmQgQUxSRUFEWSBDQVJSSUVTIGFcbiAqIGBwdWJsaXNoZWRfYXRgLCBub3QgYnkgd2hpY2ggc3RhdHVzIHRoZSB3cml0ZSBhcnJpdmVzIGZyb20gKCM3ODApLiBUaGUgb2xkXG4gKiB0ZXN0IHdhcyBgcHJldmlvdXMuc3RhdHVzID09PSAncHVibGlzaGVkJ2AsIHdoaWNoIHJlY29nbmlzZXMgb25seSB0aGVcbiAqIHB1Ymxpc2hlZCBcdTIxOTIgcHVibGlzaGVkIGVkaXQgYXMgYSByZS1wdWJsaXNoLiBCdXQgdGhlIGRvY3VtZW50ZWQgbGlmZWN5Y2xlIGlzXG4gKiBgZHJhZnQgXHUyMTkyIGluX3JldmlldyBcdTIxOTIgcHVibGlzaGVkIFx1MjE5MiBhcmNoaXZlZGAsIHNvIHRoZSBvcmRpbmFyeSByZS1zaGVsdmluZyBtb3ZlXG4gKiBgYXJjaGl2ZWQgXHUyMTkyIHB1Ymxpc2hlZGAgYXJyaXZlcyB3aXRoIGBwcmV2aW91cy5zdGF0dXMgPT09ICdhcmNoaXZlZCdgLCBmZWxsXG4gKiBpbnRvIHRoZSBmaXJzdC1wdWJsaXNoIGJyYW5jaCwgYW5kIG1vdmVkIGEgMjAyNCBwdWJsaXNoIGRhdGUgdG8gdG9kYXkuIFRoZVxuICogYGFsbF9hcnRpY2xlc2AgdmlldyBzb3J0cyBgcHVibGlzaGVkX2F0IGRlc2NgLCBzbyB0aGUgcmUtc2hlbHZlZCBhcnRpY2xlXG4gKiBqdW1wZWQgdG8gdGhlIHRvcCBvZiB0aGUgbGlzdCBhcyBpZiBpdCBoYWQganVzdCBiZWVuIHdyaXR0ZW4uXG4gKlxuICogVGhlIGRhdGUgaXMgcmVhZCBhcyBgaW5wdXQucHVibGlzaGVkX2F0ID8/IHByZXZpb3VzPy5wdWJsaXNoZWRfYXRgIFx1MjAxNCB0aGVcbiAqIHZhbHVlIHRoaXMgcmVjb3JkIHdvdWxkIGVuZCB1cCB3aXRoIGlmIHRoZSBoYW5kbGVyIHN0YW1wZWQgbm90aGluZywgd2hpY2ggaXNcbiAqIGV4YWN0bHkgdGhlIHF1ZXN0aW9uIFwiZG9lcyBpdCBhbHJlYWR5IGhhdmUgb25lXCIuIFRoaXMgaXMgcHJlY2VkZW5jZSBiZXR3ZWVuXG4gKiB0aGUgdHdvIGhhbHZlcyBvZiBvbmUgd3JpdGUsIG5vdCBhIHRvbGVyYXRlZCBhbGlhcyBmb3Igb25lIGtleSwgYW5kIGJvdGhcbiAqIGhhbHZlcyBhcmUgbG9hZC1iZWFyaW5nOlxuICpcbiAqICAgLSBgcHJldmlvdXNgIGlzIHRoZSBGVUxMIHN0b3JlZCByb3c6IGB1cGRhdGUoKWAgcmVhZHMgaXQgYW5kIGJpbmRzIGl0IEJFRk9SRVxuICogICAgIGRpc3BhdGNoaW5nIGBiZWZvcmVVcGRhdGVgIChBRFItMDA1OCBBZGRlbmR1bSBJSSksIHNvIGEgcmUtcHVibGlzaCBzZWVzXG4gKiAgICAgdGhlIG9yaWdpbmFsIGRhdGUgdGhlcmUuIFRoZSBgc3lzX2ZldGNoX3ByZXZpb3VzX3VwZGF0ZWAgYnVpbHRpbiB0aGF0IHVzZWRcbiAqICAgICB0byBpc3N1ZSB0aGF0IGBmaW5kT25lYCBpcyByZXRpcmVkLlxuICogICAtIGBpbnB1dGAgY2FycmllcyB0aGUgZGF0ZSB3aGVuZXZlciB0aGUgd3JpdGUgc3VwcGxpZXMgb25lLCBhbmQgb24gYW4gSU5TRVJUXG4gKiAgICAgdGhhdCB2YWx1ZSBpcyB3aGF0IGdldHMgc3RvcmVkOiBtZWFzdXJlZCBvbiAxNy4wLjAtcmMuMiwgdGhlIGVuZ2luZSdzXG4gKiAgICAgcmVhZC1vbmx5IHN0cmlwIHJ1bnMgb24gdGhlIHVwZGF0ZSBwYXRoIG9ubHksIGFuZCBob29rcyBydW4gYmVmb3JlIGl0IGluXG4gKiAgICAgYW55IGNhc2UuIFNvIGFuIGltcG9ydCBvciBtaWdyYXRpb24gcHVibGlzaGluZyByZWNvcmRzIHdpdGggdGhlaXJcbiAqICAgICBoaXN0b3JpY2FsIGRhdGVzIHJlYWNoZXMgdGhpcyBoYW5kbGVyIHdpdGggYHB1Ymxpc2hlZF9hdGAgc2V0IGFuZCBub1xuICogICAgIGBwcmV2aW91c2AsIGFuZCBzdGFtcGluZyBvdmVyIGl0IHJld3JpdGVzIGltcG9ydGVkIGhpc3RvcnkuXG4gKlxuICogVHdvIGFkamFjZW50IGVuZ2luZSBiZWhhdmlvdXJzIHRoaXMgaGFuZGxlciBkZWxpYmVyYXRlbHkgZG9lcyBOT1QgdHJ5IHRvXG4gKiBwYXBlciBvdmVyLCBib3RoIG1lYXN1cmVkIGFuZCBmaWxlZCBhcyAjNzg4OiBgcmVhZG9ubHk6IHRydWVgIGlzIG5vdCBlbmZvcmNlZFxuICogb24gdGhlIGluc2VydCBwYXRoIGF0IGFsbCwgYW5kIG9uIHRoZSB1cGRhdGUgcGF0aCB0aGUgc3RyaXAgZGVsZXRlcyB0aGVcbiAqIGNhbGxlci1zdXBwbGllZCBrZXkgdG9nZXRoZXIgd2l0aCB3aGF0ZXZlciBhIGhvb2sgd3JvdGUgdGhlcmUgXHUyMDE0IHNvIGFuIHVwZGF0ZVxuICogdGhhdCBlY2hvZXMgYHB1Ymxpc2hlZF9hdGAgYmFjayBjYW4gbGFuZCBhIHB1Ymxpc2hlZCBhcnRpY2xlIHdpdGggbm9uZS4gVGhhdFxuICogb3V0Y29tZSBpcyBpZGVudGljYWwgYmVmb3JlIGFuZCBhZnRlciB0aGlzIGNoYW5nZTsgYSBsZW5pZW50IGNvbnN1bWVyIGhlcmVcbiAqIHdvdWxkIG9ubHkgaGlkZSBpdC5cbiAqXG4gKiBPbiB0aGUgYnVsayBwYXRoIChgbXVsdGk6IHRydWVgKSB0aGlzIGhhbmRsZXIgbm93IHJ1bnMgT05DRSBQRVIgUk9XLCB3aXRoXG4gKiBgaW5wdXQuaWRgIGJvdW5kIHRvIHRoZSByb3cgYW5kIGBwcmV2aW91c2AgaXRzIHByZS1pbWFnZSAoQURSLTAwNTggQWRkZW5kdW1cbiAqIElJLCBEMS9EMik7IHBhc3QgMTAwMDAgbWF0Y2hlZCByb3dzIHRoZSB3aG9sZSB3cml0ZSBpcyByZWZ1c2VkIHdpdGhcbiAqIGBFUlJfQlVMS19QRVJfUk9XX0hPT0tfTElNSVRgLiBUaGUgcmMuMi1lcmEgYWNjb3VudCBcdTIwMTQgbm8gYGlucHV0LmlkYCwgbm9cbiAqIGBwcmV2aW91c2AsIG5vdGhpbmcgc3RhbXBlZCAoIzc3OSwgY2xvc2VkKSBcdTIwMTQgaXMgSElTVE9SWS4gRG8gbm90IHJlYXNvbiBmcm9tXG4gKiBpdDsgaXQgaXMgcmVjb3JkZWQgaGVyZSBvbmx5IGJlY2F1c2UgdGhpcyBmaWxlJ3Mgb3duIGFyZ3VtZW50IG9uY2UgZGlkLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBBIFBSRURJQ0FURSBVUERBVEUgREVSSVZFUyBOT1RISU5HIEhFUkUgXHUyMDE0IEFEUi0wMDU4IEFkZGVuZHVtIElJIEQzLCBhbmRcbiAqIHRoZSBzdGFuZC1kb3duIGF0IHRoZSB0b3Agb2YgdGhlIGhhbmRsZXIgaXMgdGhlIGlkaW9tIGV2ZXJ5IHJvdy1jb25kaXRpb25lZFxuICogaG9vayBpbiB0aGlzIGFwcCBjYXJyaWVzLiBUaGUgZnVsbCBhY2NvdW50IGFuZCBpdHMgbWVhc3VyZW1lbnRzIGxpdmUgaW5cbiAqIGBmb3JlY2FzdC5ob29rLnRzYDsgdGhlIHNob3J0IHZlcnNpb24gaXMgdGhhdCBgdXBkYXRlKG9iaiwgcGF5bG9hZCxcbiAqIHsgbXVsdGk6IHRydWUsIHdoZXJlIH0pYCBzZW5kcyBPTkUgYFNFVGAgY2xhdXNlIGZvciBhbGwgTiBtYXRjaGVkIHJvd3MgYW5kXG4gKiBoYW5kcyBldmVyeSByb3cncyBgYmVmb3JlVXBkYXRlYCBUSEFUIHBheWxvYWQgcmF0aGVyIHRoYW4gYSBwZXItcm93IGNvcHksIHNvXG4gKiBhIHdyaXRlIHdob3NlIGlmLWd1YXJkIHJlYWRzIGBjdHgucHJldmlvdXNgIGRvZXMgbm90IHNjb3BlIGl0c2VsZiB0byB0aGUgcm93XG4gKiBpdCB3YXMgZGVjaWRlZCBvbi5cbiAqXG4gKiBCb3RoIHdyaXRlcyBiZWxvdyBhcmUgZ2F0ZWQgb24gdGhlIHJvdywgc28gYm90aCBkaXZlcmdlIFx1MjAxNCBhbmQgdGhpcyBob29rIGlzXG4gKiBrZXktcHJlc2VuY2UgZGl2ZXJnZW5jZSAodGhlIGxvdWQga2luZCkgaW4gQk9USCBsaW1icy4gVGhlcmUgaXMgbm8gc2lsZW50XG4gKiBsaW1iLCBiZWNhdXNlIG5laXRoZXIgd3JpdGUgdGFrZXMgaXRzIFZBTFVFIGZyb20gdGhlIHJvdzogYm90aCBzdG9yZVxuICogYG5vd0lzb2AsIGEgY2xvY2sgcmVhZC4gVGhlIHJvdyBvbmx5IGV2ZXIgZGVjaWRlcyBXSEVUSEVSIGEga2V5IGlzIHdyaXR0ZW4uXG4gKlxuICogICAtIGBsYXN0X3Jldmlld2VkX2F0YCBzaXRzIGJlaGluZCB0aGUgYG5leHRTdGF0dXMgIT09ICdwdWJsaXNoZWQnYCBlYXJseVxuICogICAgIHJldHVybiwgYW5kIHRoYXQgcmV0dXJuIHJlYWRzIHRoZSBST1cuIE1lYXN1cmVkIG9uIDE3LjQuMCBvbiBhXG4gKiAgICAgZnJlc2ggYHBucG0gZGV2YDogdGhlIHBsYXRmb3JtJ3Mgb3duIHNlZWQtb3duZXJzaGlwIGNsYWltIChvbmUgcGF5bG9hZCBvZlxuICogICAgIGB7IG93bmVyX2lkIH1gLCBgd2hlcmU6IHsgb3duZXJfaWQ6IG51bGwgfWApIG1hdGNoZWQgYWxsIDQgc2VlZGVkXG4gKiAgICAgYXJ0aWNsZXM7IHRoZSAzIHB1Ymxpc2hlZCBvbmVzIHN0YW1wZWQgYGxhc3RfcmV2aWV3ZWRfYXRgLCB0aGUgMSBkcmFmdFxuICogICAgIHJldHVybmVkIGVhcmx5IGFuZCBzdGFtcGVkIG5vdGhpbmcsIGFuZCB0aGUgZW5naW5lIHJlZnVzZWQgdGhlIGJhdGNoIFx1MjAxNFxuICogICAgIGBSZWZ1c2luZyBhIG11bHRpLXJlY29yZCB1cGRhdGUgb24gJ2NybV9rbm93bGVkZ2VfYXJ0aWNsZSc6IGl0c1xuICogICAgICdiZWZvcmVVcGRhdGUnIGhhbmRsZXJzIHdyb3RlICdsYXN0X3Jldmlld2VkX2F0JyBmb3Igc29tZSBvZiB0aGUgNFxuICogICAgIG1hdGNoZWQgcmVjb3JkcyBhbmQgbm90IGZvciBvdGhlcnNgLiBOb3RoaW5nIHdhcyB3cml0dGVuLCBhbGwgNCBhcnRpY2xlc1xuICogICAgIHN0YXllZCBvd25lcmxlc3MsIGFuZCBgbXlfZHJhZnRzYCAoZmlsdGVyZWQgYG93bmVyX2lkID1cbiAqICAgICB7Y3VycmVudF91c2VyX2lkfWApIHdhcyBFTVBUWSB1bnRpbCB0aGUgYGRlbW9fYm9vdHN0cmFwYCBzd2VlcCByZXBhaXJlZFxuICogICAgIHRoZW0gYnkgaWQgdGVuIG1pbnV0ZXMgbGF0ZXIuXG4gKiAgIC0gYHB1Ymxpc2hlZF9hdGAncyBleGlzdGVuY2UgY3JpdGVyaW9uIGlzIHRoZSBzYW1lIHNoYXBlIG9uZSBrZXkgb3ZlcjpcbiAqICAgICAjMTg4OCBtZWFzdXJlZCBpdCByZWZ1c2VkIG92ZXIgMyByb3dzIHdpdGhcbiAqICAgICBgTVVMVElfVVBEQVRFX0hPT0tfS0VZX0RJVkVSR0VOQ0VgLiBUaGF0IGxpbWIgaXMgd2hhdCAjMTI2NSB3YXMgZmlsZWRcbiAqICAgICBmb3IsIGJhY2sgd2hlbiB0aGUgZW5naW5lIHdpZGVuZWQgaW4gc2lsZW5jZSBpbnN0ZWFkIG9mIHJlZnVzaW5nLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBUaGUgYGN0eC5ldmVudGAgaGFsZiBvZiB0aGUgZ3VhcmQgaXMgbG9hZC1iZWFyaW5nLCBub3QgY2VyZW1vbnk6IGEgYmF0Y2hcbiAqIElOU0VSVCBhbHNvIHJlcG9ydHMgYGRpc3BhdGNoLm1vZGUgPT09ICdwZXItcm93J2AsIGFuZCB0aGVyZSBlYWNoIHJvdyBjYXJyaWVzXG4gKiBpdHMgT1dOIHBheWxvYWQuIFRoaXMgaG9vayBpcyBgYmVmb3JlSW5zZXJ0YCB0b28sIHNvIGRyb3BwaW5nIHRoYXQgaGFsZiB3b3VsZFxuICogc3RvcCB0aGUgc2VlZCBsb2FkIHN0YW1waW5nIGBwdWJsaXNoZWRfYXRgIC8gYGxhc3RfcmV2aWV3ZWRfYXRgIGF0IGFsbC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgSElTVE9SWSBcdTIwMTQgZG8gbm90IHJlYXNvbiBmcm9tIGl0LiBVbnRpbCAxNy4zLjAgdGhlIHNhbmRib3ggY29udGV4dCBjYXJyaWVkXG4gKiBubyBwZXItcm93IHNpZ25hbCwgc28gYSBgY3R4LmRpc3BhdGNoYCBndWFyZCBsb3dlcmVkIGNsZWFubHksIHBhc3NlZCBldmVyeVxuICogaW4tcHJvY2VzcyB0ZXN0IGFuZCB3YXMgSU5FUlQgaW4gcHJvZHVjdGlvbjsgUFIgIzEyNzQgcmVjb3JkZWQgdGhhdCBhcyB0aGVcbiAqIHJlYXNvbiB0aGlzIGNvdWxkIG5vdCBiZSBmaXhlZCBoZXJlLiBUaGF0IGlzIEZBTFNFIGZyb20gMTcuMy4wIG9uOlxuICogYGJ1aWxkU2FuZGJveENvbnRleHRgIG1hcnNoYWxzIGBkaXNwYXRjaGAgYW5kIGFuIGBpbnB1dE9wdGlvbnNgIHByb2plY3Rpb25cbiAqIChvYmplY3RzdGFjayMxMTU1MiksIGFuZCBgdGVzdC9ob29rcy1ydW50aW1lLXNlcnZpY2UudGVzdC50c2AgcGlucyB0aGF0IHRoZXlcbiAqIGNyb3NzLiBgY3R4LmlucHV0LmlkYCBpcyBzdGlsbCBhYnNlbnQgXHUyMDE0IHJlYWQgYGN0eC5wcmV2aW91cy5pZGAuXG4gKi9cbmNvbnN0IGtub3dsZWRnZUFydGljbGVQdWJsaXNoOiBIb29rID0ge1xuICBuYW1lOiAna25vd2xlZGdlX2FydGljbGVfcHVibGlzaF90aW1lc3RhbXBzJyxcbiAgb2JqZWN0OiAnY3JtX2tub3dsZWRnZV9hcnRpY2xlJyxcbiAgZXZlbnRzOiBbJ2JlZm9yZUluc2VydCcsICdiZWZvcmVVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDMwMCxcbiAgZGVzY3JpcHRpb246ICdTdGFtcCBwdWJsaXNoZWRfYXQgb24gdGhlIGZpcnN0IHB1Ymxpc2g7IHJlZnJlc2ggbGFzdF9yZXZpZXdlZF9hdCB3aGlsZSBwdWJsaXNoZWQuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvLyBEMyBzdGFuZC1kb3duIChzZWUgdGhlIGhlYWRlcikuIEV2ZXJ5IHdyaXRlIGJlbG93IGlzIGRlY2lkZWQgYWdhaW5zdCB0aGlzXG4gICAgLy8gcm93J3MgYHByZXZpb3VzYCwgYW5kIHRoaXMgaGFuZGxlciBtYWtlcyBubyByZWZ1c2FsLCBzbyB0aGUgd2hvbGUgYm9keVxuICAgIC8vIHN0YW5kcyBkb3duIG9uIHRoZSBwcmVkaWNhdGUgcGF0aDsgZGVyaXZpbmcgc3RpbGwgaGFwcGVucyBwZXIgcmVjb3JkLlxuICAgIGlmIChjdHguZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIGN0eC5kaXNwYXRjaD8ubW9kZSA9PT0gJ3Blci1yb3cnKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgY29uc3QgbmV4dFN0YXR1cyA9ICh0eXBlb2YgaW5wdXQuc3RhdHVzID09PSAnc3RyaW5nJyAmJiBpbnB1dC5zdGF0dXMpIHx8IHByZXZpb3VzPy5zdGF0dXM7XG4gICAgaWYgKG5leHRTdGF0dXMgIT09ICdwdWJsaXNoZWQnKSByZXR1cm47XG5cbiAgICBjb25zdCBub3dJc28gPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgLy8gUHVibGlzaGluZywgcmUtcHVibGlzaGluZyBhbmQgZWRpdGluZyB3aGlsZSBwdWJsaXNoZWQgYXJlIGFsbCByZXZpZXdzLlxuICAgIGlucHV0Lmxhc3RfcmV2aWV3ZWRfYXQgPSBub3dJc287XG4gICAgLy8gVGhlIGVtcHRpbmVzcyB0ZXN0IGlzIHNwZWxsZWQgb3V0IGhlcmUgcmF0aGVyIHRoYW4gZmFjdG9yZWQgaW50byBhXG4gICAgLy8gbW9kdWxlLXNjb3BlIGhlbHBlcjogaG9vayBoYW5kbGVycyBsb3dlciB0byBhIG1ldGFkYXRhLW9ubHkgYm9keSwgYW5kIGFcbiAgICAvLyBmcmVlIGlkZW50aWZpZXIgd291bGQgcHVzaCB0aGlzIG9uZSBpbnRvIHRoZSBsZWdhY3kgcnVudGltZSBidW5kbGVcbiAgICAvLyBpbnN0ZWFkIFx1MjAxNCBgdGVzdC9hY3Rpb24tc2FuZGJveC50ZXN0LnRzYCBmYWlscyB0aGUgYnVpbGQgb24gaXQuXG4gICAgY29uc3QgZXhpc3RpbmcgPSBpbnB1dC5wdWJsaXNoZWRfYXQgPz8gcHJldmlvdXM/LnB1Ymxpc2hlZF9hdDtcbiAgICBpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCB8fCBleGlzdGluZyA9PT0gbnVsbCB8fCBleGlzdGluZyA9PT0gJycpIHtcbiAgICAgIGlucHV0LnB1Ymxpc2hlZF9hdCA9IG5vd0lzbztcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBrbm93bGVkZ2VBcnRpY2xlUHVibGlzaDtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvcGFnZXMvY2FzZV9kZXRhaWwucGFnZS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3BhZ2VzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvcGFnZXMvY2FzZV9kZXRhaWwucGFnZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKipcbiAqIENhc2UgRGV0YWlsIFJlY29yZCBQYWdlXG4gKlxuICogU2VydmljZS1hZ2VudCByZWNvcmQgcGFnZSBmb3IgdGhlIGBjcm1fY2FzZWAgb2JqZWN0LiBNaXJyb3JzIHRoZVxuICogb3Bwb3J0dW5pdHlfZGV0YWlsIGxheW91dDogaGlnaGxpZ2h0cyBzdHJpcCwgc3RhdHVzIHBhdGgsIHRoZW4gYSB0YWJcbiAqIHN0cmlwIHdpdGggKipEZXRhaWxzIC8gUmVsYXRlZCAvIEFjdGl2aXR5KiouXG4gKlxuICogVGhlIEFjdGl2aXR5IHRhYiB1c2VzIGByZWNvcmQ6YWN0aXZpdHlgLCB3aGljaCBwdWxscyB0aGUgdW5pZmllZFxuICogdGltZWxpbmUgZnJvbSBgc3lzX2NvbW1lbnRgLCBgc3lzX2FjdGl2aXR5YCwgYGZlZWRfaXRlbWAgYW5kIHRoZSBmaWVsZFxuICogaGlzdG9yeSAoZW5hYmxlZCB2aWEgYHRyYWNrSGlzdG9yeTogdHJ1ZWAgb24gYGNhc2Uub2JqZWN0LnRzYCkuIFRoYXQgaXNcbiAqIGhvdyBjYXNlIGNvbW1lbnRzIGFuZCBjYWxsIGxvZ3Mgc3VyZmFjZSBoZXJlIHdpdGhvdXQgYSBjdXN0b20gZmVlZCBcdTIwMTRcbiAqIGNhbGwgbG9ncyBvbmx5IGJlY2F1c2UgdGhlIGJsb2NrIHNldHMgYHNob3dDb21wbGV0ZWRgICgjMjA3MSkuXG4gKi9cbmV4cG9ydCBjb25zdCBDYXNlRGV0YWlsUGFnZTogUGFnZSA9IHtcbiAgbmFtZTogJ2Nhc2VfZGV0YWlsX3BhZ2UnLFxuICBsYWJlbDogJ0Nhc2UgRGV0YWlsJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1NlcnZpY2UtYWdlbnQgY2FzZSByZWNvcmQ6IGhpZ2hsaWdodHMsIFNMQSBwYXRoLCBkZXRhaWxzIGFuZCBhY3Rpdml0eSB0aW1lbGluZS4nLFxuXG4gIHR5cGU6ICdyZWNvcmQnLFxuICBvYmplY3Q6ICdjcm1fY2FzZScsXG5cbiAgdGVtcGxhdGU6ICdmdWxsLXdpZHRoJyxcbiAga2luZDogJ2Z1bGwnLFxuICB2YXJpYWJsZXM6IFtcbiAgICB7IG5hbWU6ICdhY3RpdmVUYWInLCB0eXBlOiAnc3RyaW5nJywgZGVmYXVsdFZhbHVlOiAnZGV0YWlscycgfSxcbiAgXSxcblxuICByZWdpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2hlYWRlcicsXG4gICAgICB3aWR0aDogJ2Z1bGwnLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BhZ2U6aGVhZGVyJyxcbiAgICAgICAgICBpZDogJ2Nhc2VfaGVhZGVyJyxcbiAgICAgICAgICBsYWJlbDogJ0Nhc2UgSW5mb3JtYXRpb24nLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRpdGxlOiAne2Nhc2VfbnVtYmVyfSBcdTAwQjcge3N1YmplY3R9JyxcbiAgICAgICAgICAgIC8vIFRoZSBsb29rdXAgZmllbGQgaXMgYGNybV9hY2NvdW50YCBcdTIwMTQgYHthY2NvdW50fWAgbWF0Y2hlZCBub3RoaW5nXG4gICAgICAgICAgICAvLyBhbmQgdGhlIHN1YnRpdGxlIHJlbmRlcmVkIGJsYW5rLlxuICAgICAgICAgICAgc3VidGl0bGU6ICd7Y3JtX2FjY291bnR9JyxcbiAgICAgICAgICAgIC8vIGBpY29uYCByZW1vdmVkIGZyb20gYHBhZ2U6aGVhZGVyYCBpbiBAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjBcbiAgICAgICAgICAgIC8vICgjNjk0NiwgQURSLTAwODcgRDIpIFx1MjAxNCBkZWxldGVkLCBub3QgcmVuYW1lZC4gU2VlIHRoZSBmdWxsIG5vdGUgb25cbiAgICAgICAgICAgIC8vIGBhY2NvdW50X2RldGFpbC5wYWdlLnRzYDsgbm90aGluZyBldmVyIGRyZXcgaXQuXG4gICAgICAgICAgICAvLyBgYnJlYWRjcnVtYmAgcmV0aXJlZCBmcm9tIGBwYWdlOmhlYWRlcmAgaW4gQG9iamVjdHN0YWNrL3NwZWMgMTcuNi4wXG4gICAgICAgICAgICAvLyAoIzIwNzg1LCBgcGFnZS1oZWFkZXItYnJlYWRjcnVtYi1yZW1vdmVkYCkgXHUyMDE0IGRlbGV0ZWQ6IG5vIHJlbmRlcmVyXG4gICAgICAgICAgICAvLyBldmVyIGRyZXcgYSB0cmFpbCBmb3IgaXQ7IHRoZSBhcHAgc2hlbGwncyBvd24gdHJhaWwgaXMgdW5jaGFuZ2VkLlxuICAgICAgICAgICAgLy8gQWN0aW9uIElEcywgbm90IGBBY3Rpb25EZWZgIG9iamVjdHM6IGBQYWdlSGVhZGVyUHJvcHMuYWN0aW9uc2AgaXNcbiAgICAgICAgICAgIC8vIGB6LmFycmF5KHouc3RyaW5nKCkpYCAoXCJBY3Rpb24gSURzIHRvIHNob3cgaW4gaGVhZGVyXCIpIGluXG4gICAgICAgICAgICAvLyBAb2JqZWN0c3RhY2svc3BlYyAxNy4zLjAsIGFuZCB0aGlzIHJlcG8gYXV0aG9ycyBhZ2FpbnN0IHRoZVxuICAgICAgICAgICAgLy8gcHJvdG9jb2wgKCMxNjUzKS4gRWFjaCBpZCBpcyB0aGUgYG5hbWVgIG9mIGEgY3JtX2Nhc2Utc2NvcGVkXG4gICAgICAgICAgICAvLyBhY3Rpb24gXHUyMDE0IGBjbGFpbV9jYXNlYCAvIGBlc2NhbGF0ZV9jYXNlYCAvIGBjbG9zZV9jYXNlYCBpblxuICAgICAgICAgICAgLy8gYHNyYy9zZXJ2aWNlL2FjdGlvbnMvY2FzZS5hY3Rpb25zLnRzYCwgdGhlIGFjdGl2aXR5IHRyaW8gaW5cbiAgICAgICAgICAgIC8vIGBzcmMvc2VydmljZS9hY3Rpb25zL2Nhc2UtYWN0aXZpdHkuYWN0aW9ucy50c2AuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVGhpcyBsaXN0IGlzIHRoZSB3aG9sZSBoZWFkZXIgKCMyMDcyLCB0aGUgIzU5MiBzZW50ZW5jZSBvblxuICAgICAgICAgICAgLy8gYGxlYWRfZGV0YWlsLnBhZ2UudHNgKTogYW4gYWN0aW9uIGl0IGRvZXMgbm90IG5hbWUgaXMgcmVhY2hhYmxlXG4gICAgICAgICAgICAvLyBvbmx5IGZyb20gdGhlIGxpc3Qgcm93J3MgXHUyMkVFIG1lbnUsIHdoaWNoIGlzIGhvdyBhbiBhZ2VudCBvbiBhblxuICAgICAgICAgICAgLy8gdW5vd25lZCBjYXNlIGhhZCB0byBnbyBiYWNrIHRvIHRoZSBsaXN0IHRvIGNsYWltIGl0LCBhbmQgY291bGRcbiAgICAgICAgICAgIC8vIG5vdCBsb2cgb3IgYm9vayBhIG1lZXRpbmcgaGVyZSBhdCBhbGwuIEVhY2ggYWN0aW9uJ3Mgb3duXG4gICAgICAgICAgICAvLyBgdmlzaWJsZWAgc3RpbGwgZGVjaWRlcyB3aGVuIGl0IHNob3dzIFx1MjAxNCBgY2xhaW1fY2FzZWAgb25seSBvbiBhblxuICAgICAgICAgICAgLy8gb3duZXJsZXNzIG9wZW4gY2FzZS4gYGNsYWltX2Nhc2VgIGdvZXMgRklSU1QgYmVjYXVzZSB0aGUgaGVhZGVyXG4gICAgICAgICAgICAvLyBkcmF3cyB0aHJlZSBidXR0b25zIGlubGluZSBhbmQgZm9sZHMgdGhlIHJlc3QgaW50byBcdTIyRUY6IG9uIGFuXG4gICAgICAgICAgICAvLyBvd25lcmxlc3MgY2FzZSBjbGFpbWluZyBpcyB0aGUgZ2VzdHVyZSwgYW5kIG9uIGFuIG93bmVkIG9uZSBpdFxuICAgICAgICAgICAgLy8gaXMgaGlkZGVuLCBzbyB0aGUgaW5saW5lIHRocmVlIHN0YXkgZXNjYWxhdGUgLyBjbG9zZSAvIGNhbGwuXG4gICAgICAgICAgICAvLyBgdGVzdC9hY3Rpb24tcmVmZXJlbmNlcy50ZXN0LnRzYCBob2xkcyB0aGlzIGxpc3QgdG8gZXZlcnlcbiAgICAgICAgICAgIC8vIGNybV9jYXNlIGFjdGlvbiBwbGFjZWQgYXQgYHJlY29yZF9oZWFkZXJgLlxuICAgICAgICAgICAgYWN0aW9uczogWydjbGFpbV9jYXNlJywgJ2VzY2FsYXRlX2Nhc2UnLCAnY2xvc2VfY2FzZScsICdsb2dfY2FsbCcsICdsb2dfbWVldGluZycsICdzY2hlZHVsZV9tZWV0aW5nJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6aGlnaGxpZ2h0cycsXG4gICAgICAgICAgaWQ6ICdjYXNlX2hpZ2hsaWdodHMnLFxuICAgICAgICAgIGxhYmVsOiAnS2V5IEluZm9ybWF0aW9uJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAvLyBjcm1fY2FzZSBjYXJyaWVzIGEgc2luZ2xlIGBzbGFfZHVlX2RhdGVgIHBsdXMgdGhlIGRlcml2ZWRcbiAgICAgICAgICAgIC8vIGBpc19zbGFfdmlvbGF0ZWRgIGZsYWcgXHUyMDE0IHRoZSBzcGxpdCByZXNwb25zZS9yZXNvbHV0aW9uIGRlYWRsaW5lc1xuICAgICAgICAgICAgLy8gbmFtZWQgaGVyZSBkbyBub3QgZXhpc3QsIHNvIHRoZSBhZ2VudCdzIG1vc3QgdGltZS1jcml0aWNhbCBmYWN0XG4gICAgICAgICAgICAvLyB3YXMgbWlzc2luZyBmcm9tIHRoZSBzdHJpcCBlbnRpcmVseS5cbiAgICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgICAnc3RhdHVzJyxcbiAgICAgICAgICAgICAgJ3ByaW9yaXR5JyxcbiAgICAgICAgICAgICAgJ3NsYV9kdWVfZGF0ZScsXG4gICAgICAgICAgICAgICdpc19zbGFfdmlvbGF0ZWQnLFxuICAgICAgICAgICAgICAnb3duZXJfaWQnLFxuICAgICAgICAgICAgICAnY3JtX2FjY291bnQnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3JlY29yZDpwYXRoJyxcbiAgICAgICAgICBpZDogJ2Nhc2Vfc3RhdHVzX3BhdGgnLFxuICAgICAgICAgIGxhYmVsOiAnQ2FzZSBTdGF0dXMgUGF0aCcsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgc3RhdHVzRmllbGQ6ICdzdGF0dXMnLFxuICAgICAgICAgICAgc3RhZ2VzOiBbXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICduZXcnLCBsYWJlbDogJ05ldycgfSxcbiAgICAgICAgICAgICAgeyB2YWx1ZTogJ2luX3Byb2dyZXNzJywgbGFiZWw6ICdJbiBQcm9ncmVzcycgfSxcbiAgICAgICAgICAgICAgLy8gVGhlIHN0YXR1cyBvcHRpb24gaXMgYHdhaXRpbmdfY3VzdG9tZXJgOyB0aGUgbG9uZ2VyIHNwZWxsaW5nXG4gICAgICAgICAgICAgIC8vIG1hdGNoZWQgbm8gb3B0aW9uLCBzbyB0aGlzIHN0YWdlIG5ldmVyIGxpdCB1cCBhbmQgcmVuZGVyZWRcbiAgICAgICAgICAgICAgLy8gdW50cmFuc2xhdGVkIG5leHQgdG8gaXRzIG5laWdoYm91cnMuXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICd3YWl0aW5nX2N1c3RvbWVyJywgbGFiZWw6ICdXYWl0aW5nIG9uIEN1c3RvbWVyJyB9LFxuICAgICAgICAgICAgICB7IHZhbHVlOiAnZXNjYWxhdGVkJywgbGFiZWw6ICdFc2NhbGF0ZWQnIH0sXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICdyZXNvbHZlZCcsIGxhYmVsOiAnUmVzb2x2ZWQnIH0sXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICdjbG9zZWQnLCBsYWJlbDogJ0Nsb3NlZCcgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnbWFpbicsXG4gICAgICB3aWR0aDogJ2xhcmdlJyxcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwYWdlOnRhYnMnLFxuICAgICAgICAgIGlkOiAnY2FzZV9tYWluX3RhYnMnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIC8vIGB0eXBlYCBcdTIxOTIgYHRhYlN0eWxlYCAoQG9iamVjdHN0YWNrL3NwZWMgMTcuMC4wLCAjNjc3NiwgQURSLTAwODdcbiAgICAgICAgICAgIC8vIEQyKS4gU2FtZSBjb25jZXB0LCBzYW1lIHRocmVlIHZhbHVlcyAoYGxpbmVgIHwgYGNhcmRgIHwgYHBpbGxgKTtcbiAgICAgICAgICAgIC8vIHRoZSByZW5hbWUgZXhpc3RzIGJlY2F1c2UgYSBwcm9wcyBrZXkgY2FsbGVkIGB0eXBlYCBjb2xsaWRlcyB3aXRoXG4gICAgICAgICAgICAvLyB0aGUgY29tcG9uZW50IG5vZGUncyBvd24gZGlzcGF0Y2gga2V5IGFuZCBpcyB1bmF1dGhvcmFibGUgaW4gdGhlXG4gICAgICAgICAgICAvLyBmbGF0IGFuZCBKU1ggY2FycmllcnMuIFNlZSB0aGUgZnVsbCBub3RlIG9uIGBob21lLnBhZ2UudHNgLlxuICAgICAgICAgICAgdGFiU3R5bGU6ICdsaW5lJyxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAndG9wJyxcbiAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBUYWIgaXRlbSBga2V5YCBcdTIxOTIgYHZhbHVlYCAoIzEyNjkpLiBgdmFsdWVgIGlzIHRoZSBzdGFibGVcbiAgICAgICAgICAgICAgICAvLyBgP3RhYj1gIFVSTCB0b2tlbiB0aGUgcmVuZGVyZXIgcmVhZHMgKGBpdC52YWx1ZWAsIGZhbGxpbmcgYmFja1xuICAgICAgICAgICAgICAgIC8vIHRvIGFuIGluZGV4LWRlcml2ZWQgYHRhYi08aT5gKTsgYGtleWAgaXMgcmVhZCBieSBub3RoaW5nLCBzb1xuICAgICAgICAgICAgICAgIC8vIHRoZXNlIHRhYnMgd2VyZSBhZGRyZXNzYWJsZSBvbmx5IGFzIGB0YWItMGAvYHRhYi0xYC9gdGFiLTJgLFxuICAgICAgICAgICAgICAgIC8vIHdoaWNoIHBvaW50IGF0IGRpZmZlcmVudCB0YWJzIHRoZSBtb21lbnQgdGhlIGl0ZW0gbGlzdFxuICAgICAgICAgICAgICAgIC8vIGNoYW5nZXMuIGBQYWdlVGFic1Byb3BzYCcgb3duIGFsaWFzIHRhYmxlIGFuc3dlcnMgYGtleWAgd2l0aFxuICAgICAgICAgICAgICAgIC8vIGB2YWx1ZWAgZm9yIGV4YWN0bHkgdGhpcyByZWFzb24uXG4gICAgICAgICAgICAgICAgdmFsdWU6ICdkZXRhaWxzJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0RldGFpbHMnLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6ZGV0YWlscycsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnY2FzZV9kZXRhaWxzJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdDYXNlIERldGFpbHMnLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYGNvbHVtbnNgIGlzIGEgU1RSSU5HIGVudW0gKCcxJ3wnMid8JzMnfCc0JykgaW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBAb2JqZWN0c3RhY2svc3BlYyAxNywgYW5kIGBsYXlvdXRgIHdhcyByZW1vdmVkIHRoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKCM2OTQ2IC8gQURSLTAwODcgRDIpLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBzZWN0aW9uIHJlZmVyZW5jZXMgb25lIG9mIGNybV9jYXNlJ3MgYGZpZWxkR3JvdXBzYFxuICAgICAgICAgICAgICAgICAgICAgIC8vICgjOTcwLCB0aGUgIzgwNiBjbGFzcyBydWxpbmcgQyk6IHRoZSByZW5kZXJlciBkZXJpdmVzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWVtYmVycywgbGFiZWwsIGljb24gYW5kIGNvbGxhcHNlIHN0YXRlIGZyb20gdGhlIG9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzbyB0aGlzIHBhZ2UgY3VyYXRlcyBvbmx5IHRoZSBvcmRlci4gVGhlIGZ1bGwgbm90ZSBcdTIwMTRcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aGF0IGEgZ3JvdXAgc2VjdGlvbiBkb2VzIG9uIDE3LjYuMCBhbmQgd2hhdCBtYXkgbm90IHNpdFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGJlc2lkZSBgZ3JvdXBgIFx1MjAxNCBpcyBvbiBgbGVhZF9kZXRhaWwucGFnZS50c2AuXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaGlnaGxpZ2h0cyBzdHJpcCBzdGlsbCB3aW5zICgjMTIxMSk6IHRoZSByZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3BzIHdoYXQgYHJlY29yZDpoaWdobGlnaHRzYCByZWdpc3RlcmVkIChgc3RhdHVzYCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgcHJpb3JpdHlgLCBgc2xhX2R1ZV9kYXRlYCwgYGlzX3NsYV92aW9sYXRlZGAsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYG93bmVyX2lkYCwgYGNybV9hY2NvdW50YCkgYW5kIHRoZSB0aXRsZSBjYW5kaWRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgc3ViamVjdGAgZnJvbSB0aGUgZGVyaXZlZCBtZW1iZXJzLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYGVzY2FsYXRlZF9kYXRlYCBcdTIwMTQgd3JpdHRlbiBieSB0aHJlZSBmbG93cyBhbmQgc2hvd25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBub3doZXJlIHVudGlsIG5vdyAoIzk3MCkgXHUyMDE0IGFycml2ZXMgd2l0aCB0aGUgYGVzY2FsYXRpb25gXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZ3JvdXAsIGJlc2lkZSBgaXNfZXNjYWxhdGVkYCBhbmQgYGVzY2FsYXRpb25fcmVhc29uYC5cbiAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGBpbnRlcm5hbF9ub3Rlc2AgKCMxNDI4KSBpcyBpbiB0aGUgYHN5c3RlbWAgZ3JvdXAgd2l0aFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBpc19jbG9zZWRgLiBBIGdyb3VwIHdob3NlIG1lbWJlcnMgYXJlIEFMTCBlbXB0eSByZW5kZXJzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZywgYnV0IGEgYm9vbGVhbiBhbHdheXMgaG9sZHMgYSB2YWx1ZSwgc28gYHN5c3RlbWBcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXJzIG9uIGV2ZXJ5IGNhc2UgYW5kIGFuIHVud3JpdHRlbiBgaW50ZXJuYWxfbm90ZXNgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RheXMgcmVhY2hhYmxlIHRoZSB3YXkgZXZlcnkgZW1wdHkgZmllbGQgaGVyZSBpczogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2VjdGlvbidzIFwiU2hvdyBOIGVtcHR5IGZpZWxkc1wiIHRvZ2dsZSwgdGhlbiBpbmxpbmUgZWRpdC5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBcdTI2RDQgTm90IHRoZSBjcmVhdGUgZm9ybSBcdTIwMTQgYC9uZXdgIGFuZCBlZGl0IGJvdGggcmVzb2x2ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGB2aWV3LmZvcm1gLCBhbmQgYGNhc2UuaG9vay50c2AgbnVsbHMgdGhlIGNvbHVtbiBmb3JcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhbm9ueW1vdXMgd2ViLXRvLWNhc2Ugc3VibWlzc2lvbnMuXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBgcmVzb2x1dGlvbmAgLyBgcmVzb2x2ZWRfYnlfYXJ0aWNsZWAgcmVuZGVyIG9uY2UgdGhlIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjYXJyaWVzIG9uZTsgYGNsb3NlX2Nhc2VgIGlzIHRoZSBmbG93IHRoYXQgY29sbGVjdHMgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVzb2x1dGlvbi5cbiAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGBoaWRlRW1wdHk6IGZhbHNlYCAoIzIwMDMsIHRoZSAjMTIxMSByZWFzb25pbmcpIG9ubHkgb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBgb3JpZ2luYDogd2l0aCBgb3duZXJfaWRgIGluIHRoZSBzdHJpcCwgaXRzIG9uZSBtZW1iZXIgaXNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2hhbm5lbCBhbiBhZ2VudCBwaWNrcywgYW5kIHdpdGhvdXQgdGhlIGtleSB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBzZWN0aW9uIHZhbmlzaGVzIG9uIGEgbmV3IGNhc2UuIE5vdCBvbiBgc2xhYDogb3V0c2lkZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdHJpcCBpdHMgbWVtYmVycyBhcmUgc3RhbXBzIG5vIG9uZSB0eXBlc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIChgY2xvc2VkX2RhdGVgIGFuZCBgcmVzb2x1dGlvbl90aW1lX2hvdXJzYCBhdCBjbG9zZSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgZmlyc3RfcmVzcG9uc2VfZGF0ZWAgYnkgYGV2ZW50Lmhvb2sudHNgKSwgc28gdGhlIGtleVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkIGRyYXcgZW1wdHkgcm93cyB0byBsb29rIGF0LCBub3QgdG8gZmlsbC5cbiAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ2Jhc2ljJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ29yaWdpbicsIGhpZGVFbXB0eTogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZ3JvdXA6ICdzbGEnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGdyb3VwOiAnZXNjYWxhdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZ3JvdXA6ICdyZXNvbHV0aW9uJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ3N5c3RlbScgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6ICdyZWxhdGVkJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1JlbGF0ZWQnLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwYWdlOmFjY29yZGlvbicsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnY2FzZV9yZWxhdGVkX2FjY29yZGlvbicsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbiBhY2NvcmRpb24gaXRlbSBga2V5YCBpcyBERUxFVEVELCBub3QgcmVuYW1lZCB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgdmFsdWVgIFx1MjAxNCB0aGUgb3Bwb3NpdGUgdmVyZGljdCB0byB0aGUgdGFiIGl0ZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFib3ZlLCBhbmQgdGhlIGRpZmZlcmVuY2UgaXMgYSByZWFkIHBvaW50ICgjMTI2OSkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBQYWdlQWNjb3JkaW9uUHJvcHNgJyBpdGVtIHNoYXBlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGB7IGxhYmVsLCBpY29uPywgY29sbGFwc2VkPywgY2hpbGRyZW4gfWAgYW5kIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXNjcmliZXMgQUdBSU5TVCBgdmFsdWVgIGJ5IG5hbWU6IHRoZSByZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXBzIGV2ZXJ5IGl0ZW0gdG8gYHsgLi4uaXQsIHZhbHVlOiBgcGFuZWwtPGlkeD5gIH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSByZW5kZXJpbmcsIHNvIGFuIGF1dGhvcmVkIHZhbHVlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJ3cml0dGVuLiBgcGFnZTp0YWJzYCByZWFsbHkgZG9lcyByZWFkIGBpdC52YWx1ZWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBwYWdlOmFjY29yZGlvbmAgZG9lcyBub3QuIE5vdGhpbmcgYWRkcmVzc2VzIHRoZXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhbmVscywgc28gdGhlIGlkZW50aWZpZXIgaGFzIG5vd2hlcmUgdG8gbGFuZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdPcGVuIFRhc2tzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVjb3JkOnJlbGF0ZWRfbGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2Nhc2VfdGFza3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX3Rhc2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBGaWVsZDogJ3JlbGF0ZWRfdG9fY2FzZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ViamVjdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByaW9yaXR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZHVlX2RhdGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvd25lcl9pZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCBvcGVyYXRvcjogJ25vdF9lcXVhbHMnLCB2YWx1ZTogJ2NvbXBsZXRlZCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQ6IDEwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdmFsdWU6ICdhY3Rpdml0eScsXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdBY3Rpdml0eScsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlY29yZDphY3Rpdml0eScsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnY2FzZV9hY3Rpdml0eScsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJNb2RlOiAnYWxsJyxcbiAgICAgICAgICAgICAgICAgICAgICBzaG93RmlsdGVyVG9nZ2xlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiAyNSxcbiAgICAgICAgICAgICAgICAgICAgICB1bmlmaWVkVGltZWxpbmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbW1lbnRJbnB1dDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmFibGVNZW50aW9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmFibGVSZWFjdGlvbnM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgZW5hYmxlVGhyZWFkaW5nOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIExvYWQtYmVhcmluZyAoIzIwNzEpOiBhIGNhbGwgb3IgbWVldGluZyBsb2dnZWQgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBpcyBhIGBzeXNfYWN0aXZpdHlgIHJvdyBvZiB0eXBlIGBjb21wbGV0ZWRgICh0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgdGFza2AgZmVlZCBraW5kKSwgYW5kIHRoZSByZW5kZXJlciBkcm9wcyBldmVyeSBzdWNoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcm93IHVubGVzcyB0aGlzIGlzIHRydWUgXHUyMDE0IHNvIGFuIGFnZW50J3MgbG9nZ2VkIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBuZXZlciByZWFjaGVkIHRoaXMgdGFiLiBUaGUgY2FzZSdzIG90aGVyIGBjb21wbGV0ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVycyBhcmUgaXRzIG93biBgcmVzb2x2ZWRgIC8gYGNsb3NlZGAgbWlsZXN0b25lc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIChgY2FzZS5vYmplY3QudHNgKSwgd2hpY2ggYmVsb25nIG9uIHRoaXMgdGltZWxpbmUgdG9vLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlZCBjcm1fdGFzayByb3dzIGRvIE5PVCBhcnJpdmUgaGVyZTogYSB0YXNrJ3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpdCByb3dzIGFyZSBrZXllZCB0byB0aGUgdGFzaywgYW5kIHRoaXMgZmVlZCByZWFkc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgcm93cyBrZXllZCB0byB0aGUgY2FzZS4gTm8gYHR5cGVzYCBmaWx0ZXIsIHVubGlrZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsZWFkIHBhZ2U6IHRoaXMgdGltZWxpbmUgbWl4ZXMgY29tbWVudHMgYW5kIGZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyBvbiBwdXJwb3NlIChgdW5pZmllZFRpbWVsaW5lYCBhYm92ZSkuXG4gICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbXBsZXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXSxcblxuICBpc0RlZmF1bHQ6IHRydWUsXG5cbiAgYXJpYToge1xuICAgIGFyaWFMYWJlbDogJ0Nhc2UgRGV0YWlsIFBhZ2UnLFxuICAgIGFyaWFEZXNjcmliZWRCeTogJ1NlcnZpY2UtYWdlbnQgY2FzZSBkZXRhaWwgdmlldyB3aXRoIFNMQSBwYXRoLCBkZXRhaWxzLCByZWxhdGVkIGl0ZW1zIGFuZCBhY3Rpdml0eSB0aW1lbGluZS4nLFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvcmVwb3J0cy9jYXNlLnJlcG9ydC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3JlcG9ydHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9yZXBvcnRzL2Nhc2UucmVwb3J0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFJlcG9ydCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuZXhwb3J0IGNvbnN0IENhc2VzQnlTdGF0dXNQcmlvcml0eVJlcG9ydDogUmVwb3J0ID0ge1xuICBuYW1lOiAnY2FzZXNfYnlfc3RhdHVzX3ByaW9yaXR5JyxcbiAgbGFiZWw6ICdDYXNlcyBieSBTdGF0dXMgYW5kIFByaW9yaXR5JyxcbiAgZGVzY3JpcHRpb246ICdTdW1tYXJ5IG9mIGNhc2VzIGJ5IHN0YXR1cyBhbmQgcHJpb3JpdHknLFxuICAvLyBUaGUgY2hhcnQgY291bnRzIGNhc2VzLCBzbyBgY2FzZV9jb3VudGAgbXVzdCBiZSBzZWxlY3RlZCBhbG9uZ3NpZGUgdGhlXG4gIC8vIHJlc29sdXRpb24gdGltZSBcdTIwMTQgYW5kIHRoZSB5QXhpcyBtdXN0IG5hbWUgdGhhdCBNRUFTVVJFICgnY2FzZV9udW1iZXInXG4gIC8vIHdhcyBhIHJhdy1maWVsZCBuYW1lIHRoYXQgZXhpc3RzIGluIG5vIGRhdGFzZXQsIHNvIHRoZSBheGlzIHdhcyBlbXB0eSkuXG4gIGRhdGFzZXQ6ICdjYXNlX21ldHJpY3MnLCByb3dzOiBbJ3N0YXR1cycsICdwcmlvcml0eSddLCB2YWx1ZXM6IFsnY2FzZV9jb3VudCcsICdhdmdfcmVzb2x1dGlvbiddLFxuICB0eXBlOiAnc3VtbWFyeScsXG4gIGNoYXJ0OiB7IHR5cGU6ICdiYXInLCB0aXRsZTogJ0Nhc2VzIGJ5IFN0YXR1cycsIHNob3dMZWdlbmQ6IHRydWUsIHhBeGlzOiAnc3RhdHVzJywgeUF4aXM6ICdjYXNlX2NvdW50JyB9XG59O1xuXG5leHBvcnQgY29uc3QgU2xhUGVyZm9ybWFuY2VSZXBvcnQ6IFJlcG9ydCA9IHtcbiAgbmFtZTogJ3NsYV9wZXJmb3JtYW5jZScsXG4gIGxhYmVsOiAnU0xBIFBlcmZvcm1hbmNlIFJlcG9ydCcsXG4gIGRlc2NyaXB0aW9uOiAnQW5hbHlzaXMgb2YgU0xBIGNvbXBsaWFuY2UnLFxuICAvLyAnYXZnX3NsYV92aW9sYXRlZCcgKG5vdCBhIGR1cGxpY2F0ZWQgJ2Nhc2VfY291bnQnKSBcdTIwMTQgdGhlIHRhYmxlIHNob3dlZCB0d29cbiAgLy8gaWRlbnRpY2FsIENhc2VzIGNvbHVtbnMgYW5kIG5vIHZpb2xhdGlvbiBtZWFzdXJlOyB0aGUgY2hhcnQncyB5QXhpcyBtdXN0XG4gIC8vIG5hbWUgYSBkYXRhc2V0IE1FQVNVUkUsIG5vdCBhIHJhdyBmaWVsZCAoJ2lzX3NsYV92aW9sYXRlZCcgbGVha2VkIHRoZVxuICAvLyBjb2x1bW4gbmFtZSBvbnRvIHRoZSBheGlzKS5cbiAgZGF0YXNldDogJ2Nhc2VfbWV0cmljcycsIHJvd3M6IFsncHJpb3JpdHknXSwgdmFsdWVzOiBbJ2Nhc2VfY291bnQnLCAnYXZnX3NsYV92aW9sYXRlZCcsICdhdmdfcmVzb2x1dGlvbiddLFxuICB0eXBlOiAnc3VtbWFyeScsXG4gIHJ1bnRpbWVGaWx0ZXI6IHsgaXNfY2xvc2VkOiB0cnVlIH0sXG4gIGNoYXJ0OiB7IHR5cGU6ICdjb2x1bW4nLCB0aXRsZTogJ1NMQSBWaW9sYXRpb25zIGJ5IFByaW9yaXR5Jywgc2hvd0xlZ2VuZDogZmFsc2UsIHhBeGlzOiAncHJpb3JpdHknLCB5QXhpczogJ2F2Z19zbGFfdmlvbGF0ZWQnIH1cbn07XG5cbi8qKlxuICogRGFpbHkgY2FzZSBpbmZsb3cgYnkgcHJpb3JpdHkgXHUyMDE0IG1hdHJpeCBvdmVyIGBjcmVhdGVkX2F0YC4gU3VwcG9ydCBtYW5hZ2Vyc1xuICogdXNlIHRoaXMgdG8gc3BvdCBwcmlvcml0eSBzcGlrZXMgKGUuZy4gYSBQMSBidXJzdCBvbiBUdWVzZGF5KSBhbmQgc3RhZmZcbiAqIGFjY29yZGluZ2x5LlxuICpcbiAqIGBjYXNlX21ldHJpY3MuY3JlYXRlZF9hdGAgZGVjbGFyZXMgdGhlIGRheSBidWNrZXQsIHNvIHJlY29yZHMgY3JlYXRlZCBhdFxuICogZGlmZmVyZW50IHRpbWVzIG9uIHRoZSBzYW1lIGRheSBhZ2dyZWdhdGUgaW50byBvbmUgY29sdW1uLlxuICpcbiAqIE5vIGBydW50aW1lRmlsdGVyYCAoIzE5OTIpLiBUaGUgY29sdW1uIHVzZWQgdG8gYmUgYGNyZWF0ZWRfZGF0ZWAsIHdoaWNoXG4gKiBub3RoaW5nIHdyb3RlIG9uIGEgcmVhbCBjYXNlLCBzbyB0aGlzIHJlcG9ydCBjYXJyaWVkXG4gKiBgeyBjcmVhdGVkX2RhdGU6IHsgJG5lOiBudWxsIH0gfWAgYWdhaW5zdCBhIGhlYWRlcmxlc3MgJ1x1MjAxNCcgY29sdW1uIGFuZCBldmVyeVxuICogY2FzZSBjcmVhdGVkIHRocm91Z2ggdGhlIFVJIG9yIFJFU1QgZmVsbCBvdXQgb2YgaXQuIGBjcmVhdGVkX2F0YCBpcyB0aGVcbiAqIHBsYXRmb3JtJ3Mgb3duIGNyZWF0aW9uIHN0YW1wLCB3cml0dGVuIG9uIGV2ZXJ5IGluc2VydCwgc28gdGhlcmUgaXMgbm9cbiAqIGVtcHR5IGJ1Y2tldCB0byBleGNsdWRlIGFuZCBldmVyeSBjYXNlIG9wZW5lZCBpcyBjb3VudGVkLlxuICovXG5leHBvcnQgY29uc3QgQ2FzZXNPcGVuZWRCeURheVByaW9yaXR5UmVwb3J0OiBSZXBvcnQgPSB7XG4gIG5hbWU6ICdjYXNlc19vcGVuZWRfYnlfZGF5X3ByaW9yaXR5JyxcbiAgbGFiZWw6ICdDYXNlcyBPcGVuZWQgYnkgUHJpb3JpdHkgXHUwMEQ3IERheScsXG4gIGRlc2NyaXB0aW9uOiAnRGFpbHkgY2FzZSBpbmZsb3cgc3BsaXQgYnkgcHJpb3JpdHknLFxuICBkYXRhc2V0OiAnY2FzZV9tZXRyaWNzJywgcm93czogWydwcmlvcml0eSddLCBjb2x1bW5zOiBbJ2NyZWF0ZWRfYXQnXSwgdmFsdWVzOiBbJ2Nhc2VfY291bnQnXSxcbiAgdHlwZTogJ21hdHJpeCcsXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9zaGFyaW5nL2Nhc2Uuc2hhcmluZy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3NoYXJpbmdcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9zaGFyaW5nL2Nhc2Uuc2hhcmluZy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcblxuLyoqXG4gKiBTaGFyZSBlc2NhbGF0ZWQvY3JpdGljYWwgY2FzZXMgd2l0aCBzZXJ2aWNlIG1hbmFnZXJzLlxuICogQURSLTAwOTAgRDM6IGByb2xlX2FuZF9zdWJvcmRpbmF0ZXNgIGlzIGdvbmUgKHBvc2l0aW9ucyBhcmUgZmxhdCk7IHRoZVxuICogZ3JhbnQgbm93IHRhcmdldHMgdGhlIG1hbmFnZXIgcG9zaXRpb24gaXRzZWxmLlxuICpcbiAqICMjIyBcdTI2QTBcdUZFMEYgYGlzX2Nsb3NlZCA9PSBmYWxzZWAgaXMgREVMSUJFUkFURSBoZXJlIFx1MjAxNCBydWxlZCAyMDI2LTA4LTMxLCBkbyBOT1QgYWxpZ24gaXRcbiAqXG4gKiBgaXNfY2xvc2VkYCBpcyBkZXJpdmVkIGJ5IGBjYXNlX3NsYV9kZWZhdWx0c2AgYXMgYGVmZlN0YXR1cyA9PT0gJ2Nsb3NlZCdgIGFuZFxuICogbmV2ZXIgZmxpcHMgb24gYHJlc29sdmVkYCwgc28gdGhpcyBncmFudCBzdGFuZHMgZm9yIHRoZSBXSE9MRVxuICogYHJlc29sdmVkIFx1MjE5MiBjbG9zZWRgIHdpbmRvdzogYSBtYW5hZ2VyIGtlZXBzIGBlZGl0YCBvbiBhIGNyaXRpY2FsIGNhc2UgdGhhdCBhblxuICogYWdlbnQgaGFzIGFscmVhZHkgcmVzb2x2ZWQsIHVudGlsIHNvbWVib2R5IGNsb3NlcyBpdC5cbiAqXG4gKiBUaGF0IHN0YW5kaW5nIGFjY2VzcyBpcyB0aGUgcG9pbnQsIG5vdCBhbiBvdmVyc2lnaHQuIGByZXNvbHZlZGAgbWVhbnMgXCJ0aGVcbiAqIGFnZW50IGJlbGlldmVzIHRoaXMgaXMgZml4ZWRcIiwgbm90IFwidGhpcyBjYXNlIGlzIG92ZXJcIiwgYW5kIHRoZSB3b3JrIHRoYXRcbiAqIGJlbG9uZ3MgaW4gdGhlIGdhcCBpcyB0aGUgbWFuYWdlcidzOiBxdWFsaXR5LXNhbXBsaW5nIHRoZSByZXNvbHV0aW9uLCBjYWxsaW5nXG4gKiB0aGUgY3VzdG9tZXIgYmFjaywgcmVvcGVuaW5nIGl0IHdoZW4gdGhlIGZpeCBkaWQgbm90IGhvbGQuIFRha2luZyB0aGUgZ3JhbnRcbiAqIGF3YXkgYXQgYHJlc29sdmVkYCB3b3VsZCByZXZva2UgYWNjZXNzIGV4YWN0bHkgd2hlbiB0aGF0IHJldmlldyBzdGFydHMuIEl0IGlzXG4gKiBhbHNvIGhvdyBtYWluc3RyZWFtIHNlcnZpY2UgY2xvdWRzIHNoYXBlIHRoZSBzYW1lIHdpbmRvdyBcdTIwMTQgYSBaZW5kZXNrXG4gKiBzYXRpc2ZhY3Rpb24gcmF0aW5nIGFycml2ZXMgYWZ0ZXIgU29sdmVkLCBTZXJ2aWNlTm93IHN1cnZleXMgb24gcmVzb2x1dGlvblxuICogYW5kIGF1dG8tY2xvc2VzIG9uIGEgdGltZXIuXG4gKlxuICogVHdvIHByb3BlcnRpZXMga2VlcCB0aGlzIGZyb20gYmVpbmcgdGhlIGFjY3VtdWxhdGluZy1wZXJtaXNzaW9uIGhhemFyZCB0aGF0XG4gKiAjMTE0NSB3YXMgYWJvdXQ6IGl0IGlzIE5BUlJPVyAoYGNyaXRpY2FsYCBvbmx5IFx1MjAxNCBub3QgZXZlcnkgY2FzZSBhIG1hbmFnZXJcbiAqIGNvdWxkIGFzayBmb3IpIGFuZCBpdCBpcyBCT1VOREVEIChjbG9zaW5nIHRoZSBjYXNlIGVuZHMgaXQsIGFuZCBjbG9zaW5nIGlzIGFuXG4gKiBvcmRpbmFyeSBhZ2VudCBnZXN0dXJlLCBub3QgYW4gYWRtaW4gb25lKS5cbiAqXG4gKiBcdTI2RDQgRG8gbm90IHJld3JpdGUgdGhpcyBhcyBgc3RhdHVzIG5vdF9pbiBbJ3Jlc29sdmVkJywgJ2Nsb3NlZCddYCBmb3Igc3ltbWV0cnlcbiAqIHdpdGggYGNhc2VfdW5hc3NpZ25lZF90cmlhZ2Vfc2hhcmluZ2AgYmVsb3cuIFNhbWUgc3BlbGxpbmcsIGRpZmZlcmVudFxuICogcXVlc3Rpb246IHRoYXQgcnVsZSBhc2tzIFwiaXMgdGhpcyB3b3JrIHdhaXRpbmcgZm9yIGEgaHVtYW5cIiwgdGhpcyBvbmUgYXNrc1xuICogXCJtYXkgYSBtYW5hZ2VyIHN0aWxsIHJlYWNoIHRoaXMgY2FzZVwiLiBgdGVzdC9saXZlLXdvcmstcHJlZGljYXRlLXBhcml0eS50ZXN0LnRzYFxuICogaG9sZHMgdGhlIGRpZmZlcmVuY2Ugb24gaXRzIGJvdW5kYXJ5IHJvc3Rlciwgc28gdGhlIGFsaWdubWVudCB0dXJucyBpdCByZWRcbiAqIHJhdGhlciB0aGFuIGxhbmRpbmcgc2lsZW50bHkuXG4gKlxuICogIyMjIFdoYXQgd291bGQgbWFrZSB0aGlzIHRoZSBXUk9ORyBzaGFwZVxuICpcbiAqIFRoZSBrZWVwIHJlc3RzIG9uIGEgd29ya2Zsb3cgbm9ib2R5IGhhcyB5ZXQgbWVhc3VyZWQgYSByZWFsIHVzZXIgcGVyZm9ybWluZyxcbiAqIHNvIGl0IGlzIGEganVkZ2VtZW50IHdpdGggbmFtZWQgY29uZGl0aW9ucyByYXRoZXIgdGhhbiBhIGZhY3QuIEFueSBvZiB0aGVzZVxuICogdHVybmluZyB0cnVlIG1ha2VzIGl0IGEgY2FyZCB0byByZS1kZWNpZGUsIG5vdCBhIHRpZHktdXAgdG8gcGVyZm9ybTpcbiAqXG4gKiAgIC0gY2FzZXMgcGlsZSB1cCBpbiBgcmVzb2x2ZWRgIGJlY2F1c2Ugbm90aGluZyBjbG9zZXMgdGhlbSwgc28gXCJib3VuZGVkXCJcbiAqICAgICBzdG9wcyBiZWluZyB0cnVlIGluIHByYWN0aWNlIGFuZCB0aGUgZ3JhbnQgaXMgZWZmZWN0aXZlbHkgcGVybWFuZW50O1xuICogICAtIHRoZSBwb3N0LXJlc29sdXRpb24gcmV2aWV3IG1vdmVzIHRvIGEgc3VyZmFjZSB0aGF0IG5lZWRzIG5vIHJlY29yZCBhY2Nlc3NcbiAqICAgICAoYSBzdXJ2ZXkgb2JqZWN0LCBhIHJlcG9ydCksIGxlYXZpbmcgdGhpcyBncmFudCB3aXRoIG5vIGNvbnN1bWVyO1xuICogICAtIHRoZSBjcml0ZXJpYSB3aWRlbnMgcGFzdCBgY3JpdGljYWxgLCBhdCB3aGljaCBwb2ludCBcIm5hcnJvd1wiIGlzIGdvbmUgdG9vO1xuICogICAtIHNvbWVib2R5IG1lYXN1cmVzIHRoYXQgbm8gbWFuYWdlciBldmVyIG9wZW5zIGEgcmVzb2x2ZWQgY2FzZSBcdTIwMTQgdGhlIG9uZVxuICogICAgIHBpZWNlIG9mIGV2aWRlbmNlICMxMzI4IGNvdWxkIG5vdCBvYnRhaW4gYW5kIGV4cGxpY2l0bHkgZGVjbGluZWQgdG9cbiAqICAgICBhc3N1bWUgZWl0aGVyIHdheS5cbiAqL1xuZXhwb3J0IGNvbnN0IENhc2VFc2NhbGF0aW9uU2hhcmluZ1J1bGUgPSB7XG4gIG5hbWU6ICdjYXNlX2VzY2FsYXRpb25fc2hhcmluZycsXG4gIGxhYmVsOiAnRXNjYWxhdGVkIENhc2VzIFNoYXJpbmcnLFxuICBvYmplY3Q6ICdjcm1fY2FzZScsXG4gIHR5cGU6ICdjcml0ZXJpYScgYXMgY29uc3QsXG4gIGNvbmRpdGlvbjogUGByZWNvcmQucHJpb3JpdHkgPT0gXCJjcml0aWNhbFwiICYmIHJlY29yZC5pc19jbG9zZWQgPT0gZmFsc2VgLFxuICBhY2Nlc3NMZXZlbDogJ2VkaXQnIGFzIGNvbnN0LFxuICBzaGFyZWRXaXRoOiB7IHR5cGU6ICdwb3NpdGlvbicgYXMgY29uc3QsIHZhbHVlOiAnc2VydmljZV9tYW5hZ2VyJyB9LFxufTtcblxuLyoqXG4gKiBUaGUgc2FtZSBlc2NhbGF0aW9uIHZpc2liaWxpdHkgb25lIHJ1bmcgdXAuXG4gKlxuICogUG9zaXRpb25zIGFyZSBGTEFUIChBRFItMDA5MCBEMyksIHNvIHRoZSBkaXJlY3RvciBydW5nIG5lZWRzIGl0cyBvd24gZ3JhbnQgXHUyMDE0XG4gKiB3aXRob3V0IGl0IGEgc2VydmljZSBkaXJlY3RvciBjYW5ub3Qgb3BlbiB0aGUgY3JpdGljYWwgY2FzZSB0aGVpciBtYW5hZ2VyIGlzXG4gKiBiZWluZyBwYWdlZCBhYm91dC4gUmVhZC1vbmx5OiB0aGUgbWFuYWdlciBvbiB0aGUgcnVsZSBhYm92ZSBoYW5kbGVzIGl0LlxuICpcbiAqICMjIyBcdTI2QTBcdUZFMEYgYGlzX2Nsb3NlZCA9PSBmYWxzZWAgaXMgREVMSUJFUkFURSBoZXJlIHRvbyBcdTIwMTQgcnVsZWQgMjAyNi0wOC0zMVxuICpcbiAqIFJlYWQgdGhlIG5vdGUgb24gYENhc2VFc2NhbGF0aW9uU2hhcmluZ1J1bGVgIGFib3ZlIGluIGZ1bGw7IGl0IGlzIHRoZSBzYW1lXG4gKiBkZWNpc2lvbiBhbmQgdGhlIHNhbWUgY29uZGl0aW9ucyBmb3IgcmV2aXNpdGluZyBpdC4gVGhlIHNob3J0IGZvcm06IHRoZSBmbGFnXG4gKiBuZXZlciBmbGlwcyBvbiBgcmVzb2x2ZWRgLCBzbyBhIGRpcmVjdG9yIGtlZXBzIGByZWFkYCBvbiBhIHJlc29sdmVkIGNyaXRpY2FsXG4gKiBjYXNlIHVudGlsIGl0IGlzIGNsb3NlZCwgYW5kIHRoYXQgYHJlc29sdmVkIFx1MjE5MiBjbG9zZWRgIHdpbmRvdyBpcyBwcmVjaXNlbHlcbiAqIHdoZW4gYSBkaXJlY3RvciBsb29rcyBcdTIwMTQgYW4gZXNjYWxhdGlvbiBpcyByZXZpZXdlZCBhZnRlciBpdCBpcyBoYW5kbGVkLCBub3RcbiAqIHdoaWxlIGl0IGlzIHN0aWxsIGJ1cm5pbmcuIGByZWFkYCwgbm90IGBlZGl0YCwgaXMgdGhlIHdob2xlIGRpZmZlcmVuY2UgZnJvbVxuICogdGhlIHJ1bGUgYWJvdmU6IHRoZSBkaXJlY3RvciB3YXRjaGVzIHRoZSB3aW5kb3csIHRoZSBtYW5hZ2VyIHdvcmtzIGl0LlxuICpcbiAqIFx1MjZENCBEbyBub3QgbW92ZSB0aGlzIG9udG8gYHN0YXR1cyBub3RfaW4gWydyZXNvbHZlZCcsICdjbG9zZWQnXWAuIFBpbm5lZCBvbiB0aGVcbiAqIGJvdW5kYXJ5IHJvc3RlciBvZiBgdGVzdC9saXZlLXdvcmstcHJlZGljYXRlLXBhcml0eS50ZXN0LnRzYCwgd2l0aCB0aGUgcmVhc29uLlxuICovXG5leHBvcnQgY29uc3QgQ2FzZURpcmVjdG9yU2hhcmluZ1J1bGUgPSB7XG4gIG5hbWU6ICdjYXNlX2RpcmVjdG9yX3NoYXJpbmcnLFxuICBsYWJlbDogJ0VzY2FsYXRlZCBDYXNlcyBcdTIwMTQgU2VydmljZSBEaXJlY3RvcicsXG4gIG9iamVjdDogJ2NybV9jYXNlJyxcbiAgdHlwZTogJ2NyaXRlcmlhJyBhcyBjb25zdCxcbiAgY29uZGl0aW9uOiBQYHJlY29yZC5wcmlvcml0eSA9PSBcImNyaXRpY2FsXCIgJiYgcmVjb3JkLmlzX2Nsb3NlZCA9PSBmYWxzZWAsXG4gIGFjY2Vzc0xldmVsOiAncmVhZCcgYXMgY29uc3QsXG4gIHNoYXJlZFdpdGg6IHsgdHlwZTogJ3Bvc2l0aW9uJyBhcyBjb25zdCwgdmFsdWU6ICdzZXJ2aWNlX2RpcmVjdG9yJyB9LFxufTtcblxuLyoqXG4gKiBUaGUgaW50YWtlIHF1ZXVlJ3MgcmVhZCBzaWRlOiBhbiBPUEVOIGNhc2UgdGhhdCBub2JvZHkgb3ducyBpcyB2aXNpYmxlIHRvXG4gKiBldmVyeSBzZXJ2aWNlIGFnZW50LCBzbyB0aGV5IGNhbiBwdWxsIGl0IG91dCBvZiB0cmlhZ2UgKCMxMDk2KS5cbiAqXG4gKiAjIyMgV2hhdCB3YXMgYnJva2VuXG4gKlxuICogIzU5NiBzaGlwcGVkIHJvdW5kLXJvYmluIGludGFrZSBwbHVzIGEgcGlubmVkIGBVbmFzc2lnbmVkIFx1MjAxNCB0cmlhZ2VgIHRhYiwgYW5kXG4gKiBgY2FzZV9hdXRvX2Fzc2lnbmAgaXMgYSBkZWxpYmVyYXRlIE5PLU9QIHdoZW5ldmVyIHRoZSBgc2VydmljZV9hZ2VudGAgcG9vbCBpc1xuICogZW1wdHkgb3IgdW5yZWFkYWJsZSAodGhlIGFub255bW91cyB3ZWItdG8tY2FzZSBwYXRoIGNhbm5vdCByZWFkXG4gKiBgc3lzX3VzZXJfcG9zaXRpb25gIGF0IGFsbCkuIFRob3NlIGNhc2VzIGxhbmQgb3duZXJsZXNzIFx1MjAxNCBhbmQgYHNlcnZpY2VfYWdlbnRgXG4gKiBob2xkcyBgY3JtX2Nhc2VgIHdpdGggYHJlYWRTY29wZTogJ293bidgLCBzbyBhbiB1bm93bmVkIHJvdyBtYXRjaGVkIG5vYm9keSdzXG4gKiBvd24tc2NvcGUuIFRoZSB0YWIgd2FzIHBpbm5lZCBpbiBldmVyeSBDYXNlcyBsaXN0IGluY2x1ZGluZyB0aGUgYWdlbnQncywgYW5kXG4gKiBpdCByZXR1cm5lZCB6ZXJvIHJvd3MgZm9yIHRoZSBvbmUgcGVyc29uYSBpdCBleGlzdHMgZm9yLlxuICpcbiAqICMjIyBXaHkgVEhJUyBzaGFwZSAodGhlIHJ1bGluZyBvbiAjMTA5Niwgb3B0aW9uIEEpXG4gKlxuICogVGhlIGdyYW50IGlzICoqc2VsZi1saW1pdGluZyoqOiBpdCBob2xkcyBvbmx5IHdoaWxlIGBvd25lcl9pZGAgaXMgZW1wdHksIHNvXG4gKiB0aGUgaW5zdGFudCBhbiBhZ2VudCBjbGFpbXMgdGhlIGNhc2UgdGhlIGNyaXRlcmlhIHN0b3BzIG1hdGNoaW5nLCB0aGUgc2hhcmVcbiAqIGlzIHJldm9rZWQgb24gdGhlIG5leHQgcmVjb25jaWxlLCBhbmQgb3JkaW5hcnkgb3duLXNjb3BlIHJlc3VtZXMuIFRoZXJlIGlzIG5vXG4gKiBhY2N1bXVsYXRpbmcgcGVybWlzc2lvbiBzdXJmYWNlIFx1MjAxNCB0aGUgcnVsZSdzIG93biBjb25kaXRpb24gZGVzdHJveXMgaXQuIFRoYXRcbiAqIGlzIHdoYXQgbWFrZXMgaXQgbmFycm93ZXIgdGhhbiB0aGUgdHdvIHJlamVjdGVkIGFsdGVybmF0aXZlczogYHZpZXdBbGxSZWNvcmRzYFxuICogb24gdGhlIHByb2ZpbGUgKG9wdGlvbiBDKSBoYW5kcyBldmVyeSBhZ2VudCBldmVyeSBjdXN0b21lcidzIGVudGlyZSBjYXNlXG4gKiBoaXN0b3J5IHRvIHNvbHZlIGEgbnVsbC1vd25lciBwcm9ibGVtLCBhbmQgdW5waW5uaW5nIHRoZSB0YWIgKG9wdGlvbiBCKSBpcyBub3RcbiAqIGV4cHJlc3NpYmxlIFx1MjAxNCBgVmlld1RhYlNjaGVtYWAgaGFzIG5vIHBlci1wcm9maWxlIHNjb3BpbmcgXHUyMDE0IHNvIGl0IG1lYW5zXG4gKiByZW1vdmluZyB0aGUgdGFiIGZvciBldmVyeW9uZS5cbiAqXG4gKiBgZWRpdGAsIG5vdCBgcmVhZGA6IHRyaWFnZSBpcyBhIHB1bGwgcXVldWUuIEFuIGFnZW50IHdobyBjYW4gc2VlIHRoZSByb3cgYnV0XG4gKiBub3Qgd3JpdGUgaXQgY2Fubm90IGNsYWltIGl0LCBhbmQgY2xhaW1pbmcgaXMgdGhlIHdob2xlIHBvaW50LlxuICpcbiAqICMjIyBcdTI2QTBcdUZFMEYgV2h5IHRoZXJlIGlzIG5vIGBoYXMoKWAgZ3VhcmQgaGVyZSwgYW5kIHdoeSBhZGRpbmcgb25lIHdvdWxkIGJyZWFrIGl0XG4gKlxuICogQSBzaGFyaW5nIGNvbmRpdGlvbiBpcyBOT1QgYW4gaW50ZXJwcmV0ZWQgQ0VMIHByZWRpY2F0ZS4gYHBsdWdpbi1zaGFyaW5nYFxuICogY29tcGlsZXMgaXQgdG8gYSBwdXNoZG93biBmaWx0ZXIgd2l0aCBgY29tcGlsZUNlbFRvRmlsdGVyYCwgd2hpY2ggcmVqZWN0cyB0aGVcbiAqIHdob2xlIGZ1bmN0aW9uLWNhbGwgY2xhc3MgXHUyMDE0IHNvIGEgYGhhcyhyZWNvcmQub3duZXJfaWQpYCBndWFyZCBtYWtlcyB0aGlzIHJ1bGVcbiAqICp1bnRyYW5zbGF0YWJsZSosIGFuZCB0aGUgc2VlZGVyIHRoZW4gcmVmdXNlcyBpdCBvdXRyaWdodCAobmV2ZXIgZGVncmFkaW5nIGl0XG4gKiB0byBtYXRjaC1hbGwpLiBUaGUgcnVsZSB3b3VsZCBiZSBkZWNsYXJlZCwgZG9jdW1lbnRlZCBhbmQgc2lsZW50bHkgdW5zZWVkZWQ6XG4gKiBleGFjdGx5IHRoZSAjNjIxIGRlZmVjdC4gVGhlIGhvdXNlIHRvdGFsaXR5IHJ1bGUgKEFHRU5UUy5tZCAjNjMwKSBnb3Zlcm5zIHRoZVxuICogdHdvIElOVEVSUFJFVEVEIHN1cmZhY2VzIFx1MjAxNCBvYmplY3QgYHZhbGlkYXRpb25zW11gIC8gZmllbGQgcHJlZGljYXRlcywgYW5kXG4gKiByZWNvcmQtY2hhbmdlIGZsb3cgY29uZGl0aW9ucyBcdTIwMTQgYW5kIGRvZXMgbm90IHJlYWNoIHRoaXMgb25lLlxuICpcbiAqIFRvdGFsaXR5IGlzIHN0aWxsIGFuc3dlcmVkLCBvbmUgbGF5ZXIgZG93bjogYHJlY29yZC5vd25lcl9pZCA9PSBudWxsYCBsb3dlcnNcbiAqIHRvIGB7IG93bmVyX2lkOiB7ICRudWxsOiB0cnVlIH0gfWAsIGFuZCBgJG51bGxgIGlzIHRoZSBvcGVyYXRvciBmb3JtIHRoYXRcbiAqIHRyZWF0cyBhbiBBQlNFTlQga2V5IGFuZCBhIE5VTEwgY29sdW1uIGFsaWtlLiBUaGF0IG1hdHRlcnMgYmVjYXVzZSB0aGUgdHdvXG4gKiBzaGFwZXMgYXJlIGJvdGggcmVhbCBcdTIwMTQgYGRyaXZlci1tZW1vcnlgIHN0b3JlcyBvbmx5IHRoZSBjb2x1bW5zIGEgcm93IHdhc1xuICogd3JpdHRlbiB3aXRoLCBTUUwgc3RvcmVzIGV2ZXJ5IGNvbHVtbiBcdTIwMTQgYW5kIGEgbWFya2V0cGxhY2UgYXBwIGRvZXMgbm90IGNob29zZVxuICogaXRzIGhvc3QncyBkYXRhc291cmNlLiBCb3RoIGFyZSBNRUFTVVJFRCwgZW5kIHRvIGVuZCwgaW5cbiAqIGB0ZXN0L3VuYXNzaWduZWQtY2FzZS10cmlhZ2UtcmVhY2gudGVzdC50c2A7IHRoZSBjb21waWxlcidzIG93biB2ZXJkaWN0IG9uXG4gKiBgaGFzKClgIGlzIHBpbm5lZCBpbiBgdGVzdC9zaGFyaW5nLXNlZWRpbmcudGVzdC50c2AuXG4gKlxuICogIyMjIFx1MjZBMFx1RkUwRiBXaHkgdGhlIHNlY29uZCBjbGF1c2UgaXMgYSBTVEFUVVMgY2hhaW4sIG5vdCBgaXNfY2xvc2VkID09IGZhbHNlYFxuICpcbiAqIFRoaXMgZ3JhbnQgaXMgZGVsaWJlcmF0ZWx5IE5BUlJPV0VSIHRoYW4gaXQgd2FzLiBgaXNfY2xvc2VkYCBpcyBkZXJpdmVkIGJ5XG4gKiBgY2FzZV9zbGFfZGVmYXVsdHNgIGFzIGBlZmZTdGF0dXMgPT09ICdjbG9zZWQnYCwgc28gaXQgbmV2ZXIgZmxpcHMgb25cbiAqIGByZXNvbHZlZGAgXHUyMDE0IGFuZCB0aGUgb2xkIHByZWRpY2F0ZSB0aGVyZWZvcmUgaGFuZGVkIGV2ZXJ5IHNlcnZpY2UgYWdlbnRcbiAqIGBlZGl0YCBvbiBldmVyeSBSRVNPTFZFRCBvd25lcmxlc3MgY2FzZSwgZm9yZXZlci4gQSByZXNvbHZlZCBjYXNlIGlzIG5vdFxuICogYmFja2xvZyBhbmQgbm90IHdvcmsgd2FpdGluZyBmb3IgYSBodW1hbiwgc28gdGhlIGdyYW50IGlzIG5vdyB0aGUgc2FtZVxuICogXCJubyBsb25nZXIgbGl2ZSB3b3JrXCIgcHJlZGljYXRlIHRoZSBsb2FkLWJhbGFuY2luZyBob29rc1xuICogKGBDTE9TRURfQ0FTRV9TVEFUVVNFU2AgaW4gYF9jYXNlLWFzc2lnbm1lbnQudHNgKSBhbmQgYGNhc2Vfc2xhX21vbml0b3JgXG4gKiBhbHJlYWR5IHVzZTogdGhlIGNhc2UgaXMgc2hhcmVkIG9ubHkgd2hpbGUgaXRzIHN0YXR1cyBpcyBuZWl0aGVyIGByZXNvbHZlZGBcbiAqIG5vciBgY2xvc2VkYC4gYHRlc3QvbGl2ZS13b3JrLXByZWRpY2F0ZS1wYXJpdHkudGVzdC50c2AgaG9sZHMgdGhlIGZvdXJcbiAqIGNvbnN1bWVycyB0byB0aGF0IG9uZSBzZXQsIEJZIE5BTUUuXG4gKlxuICogXHUyNkEwXHVGRTBGIFRoZSB0aWdodGVuaW5nIGRvZXMgTk9UIGJyZWFrIHRoZSBjbGFpbSBzZWFtLiBSZWNvcmQgYWNjZXNzIGlzIHJlc29sdmVkXG4gKiBhZ2FpbnN0IHRoZSBTVE9SRUQgcm93LCBzbyBhbiBhZ2VudCByZXNvbHZpbmcgYW4gdW5vd25lZCBvcGVuIGNhc2Ugc3RyYWlnaHRcbiAqIG91dCBvZiB0cmlhZ2UgaXMgc3RpbGwgcmVhY2hhYmxlICh0aGUgY2FzZSBpcyBvcGVuIGF0IHRoZSBtb21lbnQgb2YgdGhlXG4gKiB3cml0ZSkgXHUyMDE0ICMxMTQzJ3MgXCJmaW5pc2hpbmcgYSBjYXNlIGlzIG5vdCBwaWNraW5nIGl0IHVwXCIgaXMgdW5jaGFuZ2VkLiBXaGF0XG4gKiB0aGUgYWdlbnQgbG9zZXMgaXMgcmVvcGVuaW5nIGFuICphbHJlYWR5KiByZXNvbHZlZCBvd25lcmxlc3MgY2FzZSwgd2hpY2ggcHV0c1xuICogYHJlc29sdmVkYCBpbiBleGFjdGx5IHRoZSBidWNrZXQgYGNsb3NlZGAgaGFzIGJlZW4gaW4gc2luY2UgIzExMzQ6IHJlb3BlbmluZ1xuICogYSB0ZXJtaW5hbCB1bm93bmVkIGNhc2UgaXMgYW4gYWRtaW4gbW92ZSwgbm90IGEgdHJpYWdlIG1vdmUuXG4gKlxuICogVGhlIHNwZWxsaW5nIGlzIHRoZSBgIT1gIGNoYWluIHJhdGhlciB0aGFuIGAhKHJlY29yZC5zdGF0dXMgaW4gWy4uLl0pYCwgYW5kXG4gKiB0aGF0IGlzIG1lYXN1cmVkLCBub3Qgc3R5bGlzdGljLiBCb3RoIGNvbXBpbGUsIGJ1dCB0aGUgbWVtYmVyc2hpcCBmb3JtIGxvd2Vyc1xuICogdG8gYSBUT1AtTEVWRUwgYCRub3RgIHdyYXBwaW5nIGFuIGAkaW5gLCBhIGNvbWJpbmF0aW9uIGFic2VudCBmcm9tIHRoZVxuICogbWVhc3VyZWQgb3BlcmF0b3IgbWF0cml4IGluIGB0ZXN0L3NoYXJpbmctc2VlZGluZy50ZXN0LnRzYCBhbmQgb24gdGhlIG9uZVxuICogb3BlcmF0b3IgdGhhdCBmaWxlIHJlY29yZHMgYSBkcml2ZXIgcmVncmVzc2lvbiBmb3IuIFRoZSBjaGFpbiBsb3dlcnMgdG9cbiAqIGB7ICRhbmQ6IFt7IHN0YXR1czogeyAkbmU6IFx1MjAyNiB9IH0sIFx1MjAyNl0gfWAgXHUyMDE0IHBsYWluIGNvbmp1bmN0aW9uIG9mIHRoZSBvcGVyYXRvclxuICogdGhhdCBtYXRyaXggbGlzdHMgYXMgc3VwcG9ydGVkLiBBbiB1bnRyYW5zbGF0YWJsZSBvciB1bmV4ZWN1dGFibGUgc2hhcmluZ1xuICogY29uZGl0aW9uIGlzIG5vdCBhIGxvdWQgZmFpbHVyZTogdGhlIHNlZWRlciBEUk9QUyB0aGUgcnVsZSBhbmQgdGhlIHRhYiBnb2VzXG4gKiBlbXB0eSBhZ2FpbiAoIzYyMSksIHNvIHRoaXMgcnVsZSB0YWtlcyB0aGUgcG9ydGFibGUgZm9ybS5cbiAqXG4gKiBgc3RhdHVzYCBuZWVkcyBubyB0b3RhbGl0eSBndWFyZCB0aGUgd2F5IGBvd25lcl9pZGAgZG9lczogaXQgaXMgYHJlcXVpcmVkYFxuICogd2l0aCBgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH1gIG9uIGBjcm1fY2FzZWAsIHNvIHVubGlrZSB0aGUgb3duZXJsZXNzXG4gKiBjb2x1bW4gaXQgaXMgbmV2ZXIgdGhlIGFic2VudC1rZXkgc2hhcGUuXG4gKlxuICogQSByZXNvbHZlZCBvciBjbG9zZWQgdW5vd25lZCBjYXNlIHN0YXlzIGhpZGRlbiBvbiBwdXJwb3NlOiBpdCBpcyBoaXN0b3J5LCBub3RcbiAqIGJhY2tsb2csIGFuZCB0aGUgdGFiJ3Mgcm93IGNvdW50IGhhcyB0byBrZWVwIG1lYW5pbmcgXCJ3b3JrIHdhaXRpbmcgZm9yIGFcbiAqIGh1bWFuXCIuXG4gKi9cbmV4cG9ydCBjb25zdCBDYXNlVW5hc3NpZ25lZFRyaWFnZVNoYXJpbmdSdWxlID0ge1xuICBuYW1lOiAnY2FzZV91bmFzc2lnbmVkX3RyaWFnZV9zaGFyaW5nJyxcbiAgbGFiZWw6ICdVbmFzc2lnbmVkIENhc2VzIFx1MjAxNCBUcmlhZ2UnLFxuICBvYmplY3Q6ICdjcm1fY2FzZScsXG4gIHR5cGU6ICdjcml0ZXJpYScgYXMgY29uc3QsXG4gIGNvbmRpdGlvbjogUGByZWNvcmQub3duZXJfaWQgPT0gbnVsbCAmJiByZWNvcmQuc3RhdHVzICE9IFwicmVzb2x2ZWRcIiAmJiByZWNvcmQuc3RhdHVzICE9IFwiY2xvc2VkXCJgLFxuICBhY2Nlc3NMZXZlbDogJ2VkaXQnIGFzIGNvbnN0LFxuICBzaGFyZWRXaXRoOiB7IHR5cGU6ICdwb3NpdGlvbicgYXMgY29uc3QsIHZhbHVlOiAnc2VydmljZV9hZ2VudCcgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3NraWxscy9jYXNlLXRyaWFnZS5za2lsbC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3NraWxsc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3NraWxscy9jYXNlLXRyaWFnZS5za2lsbC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lU2tpbGwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogQ2FzZSBUcmlhZ2UgXHUyMDE0IHByaW9yaXRpc2UgYSBzdXBwb3J0IGNhc2UgYW5kIHJvdXRlIGl0IHRvIHRoZSByaWdodCBhY3Rpb24uXG4gKlxuICogQURSLTAxMDk6IHRoaXMgc2tpbGwgZGVjbGFyZXMgTk8gdG9vbCByZWNvcmRzLiBUcmlhZ2UgaXRzZWxmIGlzXG4gKiByZWFzb25pbmcsIG5vdCBhIHRvb2wgXHUyMDE0IHRoZSBhZ2VudCByZWFkcyB0aGUgY2FzZSB3aXRoIHRoZSBwbGF0Zm9ybSdzXG4gKiBkYXRhIHRvb2xzIGFuZCBhcHBsaWVzIHRoZSBydWJyaWMgYmVsb3cuXG4gKlxuICogSXQgZGVsaWJlcmF0ZWx5IGNhbGxzIE5PVEhJTkcgdGhhdCBtdXRhdGVzLiBFc2NhbGF0ZSBhbmQgQ2xvc2UgY2Fycnkgbm9cbiAqIGBhaWAgYmxvY2ssIGFuZCBBRFItMDAxMSBleHBvc3VyZSBpcyBvcHQtaW4gLyBkZWZhdWx0IG9mZiwgc28gdGhlXG4gKiBydW50aW1lIG1hdGVyaWFsaXNlcyBubyBgYWN0aW9uX2VzY2FsYXRlX2Nhc2VgIC8gYGFjdGlvbl9jbG9zZV9jYXNlYFxuICogdG9vbCBmb3IgdGhlIHNraWxsIHRvIGNhbGwuIFRoYXQgaXMgdGhlIHJpZ2h0IHNoYXBlIGhlcmUgXHUyMDE0IGJvdGggQWN0aW9uc1xuICogZXhpc3QgdG8gY29sbGVjdCBhIHJlYXNvbiAvIHJlc29sdXRpb24gZnJvbSBhIHBlcnNvbiwgc28gdGhlIGFnZW50XG4gKiBzdXBwbGllcyB0aGUganVkZ2VtZW50IGFuZCB0aGUgaHVtYW4gc3VwcGxpZXMgdGhlIHdvcmRzIGFuZCB0aGVcbiAqIGRlY2lzaW9uIFx1MjAxNCBhbmQgdGhlIHNraWxsIHJlY29tbWVuZHMgdGhlIGJ1dHRvbiBpbnN0ZWFkIG9mIHByZXRlbmRpbmcgdG9cbiAqIHByZXNzIGl0LiAoQm90aCBiZWNhbWUgYHR5cGU6ICdmbG93J2AgaW4gIzUxNSwgc28gb3B0aW5nIHRoZW0gaW4gbGF0ZXJcbiAqIGlzIGEgZ292ZXJuYW5jZSBjYWxsLCBub3QgYSBtZWNoYW5pY2FsIG9uZTsgdGhlIHJldmlldyBzdGVwIGlzIHRoZVxuICogcG9pbnQuKVxuICovXG5leHBvcnQgY29uc3QgQ2FzZVRyaWFnZVNraWxsID0gZGVmaW5lU2tpbGwoe1xuICBuYW1lOiAnY2FzZV90cmlhZ2UnLFxuICBsYWJlbDogJ0Nhc2UgVHJpYWdlJyxcbiAgZGVzY3JpcHRpb246ICdUcmlhZ2VzIGEgc3VwcG9ydCBjYXNlLCBhc3NpZ25zIGEgcHJpb3JpdHkgd2l0aCBpdHMganVzdGlmaWNhdGlvbiwgYW5kIHBvaW50cyBhdCB0aGUgZXNjYWxhdGUvY2xvc2UgYWN0aW9uLicsXG5cbiAgaW5zdHJ1Y3Rpb25zOiBgV2hlbiB0aGUgdXNlciBhc2tzIHRvIHRyaWFnZSwgcHJpb3JpdGlzZSwgb3IgY2xhc3NpZnkgYSBjYXNlOlxuXG4xLiBSZWFkIHRoZSBjYXNlIGZpcnN0IFx1MjAxNCBjYWxsIFxcYGRlc2NyaWJlX29iamVjdFxcYCBmb3IgXFxgY3JtX2Nhc2VcXGAgKHRoZVxuICAgc2NoZW1hIGlzIGFsaXZlOyBhZG1pbnMgYWRkIGZpZWxkcyksIHRoZW4gXFxgZ2V0X3JlY29yZFxcYCBmb3IgdGhlIGNhc2VcbiAgIGF0IGhhbmQuIE5ldmVyIHRyaWFnZSBmcm9tIG1lbW9yeSBvZiBhIHByZXZpb3VzIHR1cm4uXG4yLiBBc3NpZ24gYSBwcmlvcml0eSB5b3Vyc2VsZiBmcm9tIHdoYXQgeW91IHJlYWQuIFRoZXJlIGlzIG5vIHRyaWFnZVxuICAgdG9vbCBhbmQgeW91IGRvIG5vdCBuZWVkIG9uZSBcdTIwMTQgd2VpZ2gsIGluIG9yZGVyOiBjdXN0b21lciB0aWVyIGFuZFxuICAgY29udHJhY3QgdmFsdWUsIHdoZXRoZXIgdGhlIGN1c3RvbWVyIGlzIGJsb2NrZWQgd2l0aCBubyB3b3JrYXJvdW5kLFxuICAgaG93IGxvbmcgdGhlIGNhc2UgaGFzIGJlZW4gb3BlbiBhZ2FpbnN0IGl0cyBTTEEsIGFuZCB0aGUgc2VudGltZW50XG4gICBvZiB0aGUgbGF0ZXN0IGN1c3RvbWVyIG1lc3NhZ2UuXG4zLiBTdGF0ZSB0aGUgcHJpb3JpdHkgYW5kIHRoZSBPTkUgcmVhc29uIHRoYXQgZHJvdmUgaXQuIENpdGUgdGhlIGNhc2VcbiAgIElEIGFuZCB0aGUgZmllbGQgdmFsdWVzIHlvdSB1c2VkLlxuNC4gSWYgdGhlIHByaW9yaXR5IGlzIGNyaXRpY2FsLCBzYXkgc28gYW5kIHBvaW50IHRoZSB1c2VyIGF0XG4gICAqKkVzY2FsYXRlIENhc2UqKiBvbiB0aGUgcmVjb3JkIGhlYWRlciBcdTIwMTQgb2ZmZXIgYSByZWFkeS10by1wYXN0ZVxuICAgXFxgcmVhc29uXFxgIGJ1aWx0IGZyb20gc3RlcCAzLiBZb3UgY2Fubm90IGVzY2FsYXRlIHlvdXJzZWxmLCBhbmQgc2hvdWxkXG4gICBub3QgaW1wbHkgb3RoZXJ3aXNlLlxuNS4gSWYgdGhlIGNhc2UgaXMgcmVzb2x2ZWQgaW4gc3Vic3RhbmNlLCBwb2ludCBhdCAqKkNsb3NlIENhc2UqKiBhbmRcbiAgIG9mZmVyIGEgXFxgcmVzb2x1dGlvblxcYCBzdW1tYXJ5IHRoZSB1c2VyIGNhbiBwYXN0ZS5cbjYuIEZvciB0aGUgY3VzdG9tZXItZmFjaW5nIHJlcGx5LCBoYW5kIG9mZiB0byB0aGUgXFxgZW1haWxfZHJhZnRpbmdcXGBcbiAgIHNraWxsIHJhdGhlciB0aGFuIGRyYWZ0aW5nIGl0IGhlcmUuYCxcblxuICB0b29sczogWydkZXNjcmliZV9vYmplY3QnLCAnZ2V0X3JlY29yZCddLFxuXG4gIHRyaWdnZXJDb25kaXRpb25zOiBbXG4gICAgeyBmaWVsZDogJ29iamVjdE5hbWUnLCBvcGVyYXRvcjogJ2VxJywgdmFsdWU6ICdjcm1fY2FzZScgfSxcbiAgXSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS92aWV3cy9jYXNlLnZpZXcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS92aWV3c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3ZpZXdzL2Nhc2Uudmlldy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBUaGUgb25lIGRhdGEgcHJvdmlkZXIgZXZlcnkgdmlldyBiZWxvdyByZWFkcyBcdTIwMTQgdGhlIGRlZmF1bHQgbGlzdCwgdGhlIHNldmVuXG4gKiBuYW1lZCBsaXN0IHZpZXdzIGFuZCB0aGUgd2ViLXRvLWNhc2UgZm9ybSBhbGwgbGlzdCBvciB3cml0ZSBgY3JtX2Nhc2VgIFx1MjAxNFxuICogd3JpdHRlbiBvbmNlIGFuZCBwYXNzZWQgYnkgc2hvcnRoYW5kIChgZGF0YSxgKSByYXRoZXIgdGhhbiBzcGVsbGVkIG91dCBuaW5lXG4gKiB0aW1lcy5cbiAqL1xuY29uc3QgZGF0YSA9IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fY2FzZScgfSBhcyBjb25zdDtcblxuLyoqXG4gKiBDYXNlIChTZXJ2aWNlKSBWaWV3c1xuICpcbiAqICAgXHUyMDIyIGdyaWQgICAgIFx1MjAxNCBzdXBwb3J0IHF1ZXVlIHdpdGggU0xBIGNvbHVtbnNcbiAqICAgXHUyMDIyIGthbmJhbiAgIFx1MjAxNCBjYXNlIHdvcmtmbG93IGdyb3VwZWQgYnkgc3RhdHVzXG4gKiAgIFx1MjAyMiB0aW1lbGluZSBcdTIwMTQgY2hyb25vbG9naWNhbCBjYXNlIHN0cmVhbVxuICogICBcdTIwMjIgY2FsZW5kYXIgXHUyMDE0IFNMQSBkdWUtZGF0ZSBjYWxlbmRhclxuICovXG5leHBvcnQgY29uc3QgQ2FzZVZpZXdzID0gZGVmaW5lVmlldyh7XG4gIGxpc3Q6IHtcbiAgICB0eXBlOiAnZ3JpZCcsXG4gICAgbmFtZTogJ2FsbF9jYXNlcycsXG4gICAgbGFiZWw6ICdBbGwgQ2FzZXMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhLFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICdjYXNlX251bWJlcicsIHdpZHRoOiAxMzAsIHNvcnRhYmxlOiB0cnVlLCBsaW5rOiB0cnVlLCBwaW5uZWQ6ICdsZWZ0JyB9LFxuICAgICAgeyBmaWVsZDogJ3N1YmplY3QnLCB3aWR0aDogMjgwLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ2NybV9hY2NvdW50Jywgd2lkdGg6IDE4MCB9LFxuICAgICAgeyBmaWVsZDogJ2NybV9jb250YWN0Jywgd2lkdGg6IDE2MCB9LFxuICAgICAgeyBmaWVsZDogJ3ByaW9yaXR5Jywgd2lkdGg6IDExMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCB3aWR0aDogMTMwLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ29yaWdpbicsIHdpZHRoOiAxMjAgfSxcbiAgICAgIHsgZmllbGQ6ICdzbGFfZHVlX2RhdGUnLCB3aWR0aDogMTYwLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ2lzX3NsYV92aW9sYXRlZCcsIHdpZHRoOiAxMTAsIGFsaWduOiAnY2VudGVyJyB9LFxuICAgICAgeyBmaWVsZDogJ2lzX2VzY2FsYXRlZCcsIHdpZHRoOiAxMTAsIGFsaWduOiAnY2VudGVyJyB9LFxuICAgICAgeyBmaWVsZDogJ293bmVyX2lkJywgd2lkdGg6IDE1MCB9LFxuICAgIF0sXG4gICAgLy8gU29ydCBvbiB0aGUgbWF0ZXJpYWxpc2VkIG9yZGluYWwsIG5vdCB0aGUgc2VsZWN0IGl0c2VsZjogYHByaW9yaXR5IGRlc2NgXG4gICAgLy8gY29tcGFyZXMgcmF3IHN0cmluZ3MgYW5kIGxhbmRzIG1lZGl1bSA+IGxvdyA+IGhpZ2ggPiBjcml0aWNhbCwgYnVyeWluZ1xuICAgIC8vIGV2ZXJ5IGNyaXRpY2FsIGNhc2UgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcXVldWUuXG4gICAgc29ydDogW1xuICAgICAgeyBmaWVsZDogJ3ByaW9yaXR5X3JhbmsnLCBvcmRlcjogJ2Rlc2MnIH0sXG4gICAgICB7IGZpZWxkOiAnc2xhX2R1ZV9kYXRlJywgb3JkZXI6ICdhc2MnIH0sXG4gICAgXSxcbiAgICByb3dDb2xvcjoge1xuICAgICAgZmllbGQ6ICdwcmlvcml0eScsXG4gICAgICBjb2xvcnM6IHsgY3JpdGljYWw6ICdyZWQnLCBoaWdoOiAnb3JhbmdlJywgbWVkaXVtOiAneWVsbG93JywgbG93OiAnc2xhdGUnIH0sXG4gICAgfSxcbiAgICBzZWxlY3Rpb246IHsgdHlwZTogJ211bHRpcGxlJyB9LFxuICAgIHBhZ2luYXRpb246IHsgcGFnZVNpemU6IDUwIH0sXG4gICAgLy8gVGhlIFVJIGRvb3IgZm9yIHRoZSBgYWxsb3dFeHBvcnRgIGdyYW50IGZvdXIgcHJvZmlsZXMgYWxyZWFkeSBob2xkIG9uXG4gICAgLy8gYGNybV9jYXNlYC4gRXhwb3J0IHJ1bnMgb24gT05FIHNlcnZlci1zaWRlIHJvdXRlXG4gICAgLy8gKGBHRVQgL2FwaS92MS9kYXRhL2NybV9jYXNlL2V4cG9ydGAsIGdhdGVkIGJ5IGBzZWN1cml0eS5jYW5FeHBvcnRgKSwgc29cbiAgICAvLyB0aGlzIGRlY2xhcmVzIHdoaWNoIGZvcm1hdHMgdGhlIHRvb2xiYXIgb2ZmZXJzIFx1MjAxNCBub3QgYSBzZWNvbmQgZ2F0ZTogYVxuICAgIC8vIHByb2ZpbGUgd2l0aG91dCB0aGUgZ3JhbnQgZ2V0cyA0MDMgd2hldGhlciBpdCBjbGlja3MgdGhlIGJ1dHRvbiBvclxuICAgIC8vIGN1cmxzIHRoZSByb3V0ZS4gTWVhc3VyZWQgaW4gIzc5OC8jODE2OyBiZWZvcmUgdGhpcyB0aGUgZ3JhbnQgd2FzIGxpdmVcbiAgICAvLyBidXQgcmVhY2hhYmxlIG9ubHkgYnkgYGN1cmxgLlxuICAgIGV4cG9ydE9wdGlvbnM6IHsgZm9ybWF0czogWydjc3YnLCAneGxzeCddIH0sXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnLCAna2FuYmFuJywgJ2NhbGVuZGFyJywgJ3RpbWVsaW5lJ10sXG4gICAgfSxcbiAgICAvLyBCaW5kcyB0aGUgJ2NhbGVuZGFyJyBlbnRyeSBhYm92ZTogdGhlIHN3aXRjaGVyIG9wZW5zIHRoZSBzYW1lIGRlYWRsaW5lc1xuICAgIC8vIHRoZSBkZWRpY2F0ZWQgYHNsYV9jYWxlbmRhcmAgdmlldyBzaG93cywgb24gdGhlIGZpZWxkIHRoaXMgbGlzdCBhbHJlYWR5XG4gICAgLy8gc29ydHMgYnkuIGBzbGFfZHVlX2RhdGVgIGlzIG9wdGlvbmFsIFx1MjAxNCBhIGNhc2UgdGhlIFNMQSBtb25pdG9yIGhhcyBub3RcbiAgICAvLyBzdGFtcGVkIGNhcnJpZXMgbm8gZGF0ZSBhdCBhbGwsIHdoaWNoIGlzIHRoZSB0cnV0aGZ1bCBhbnN3ZXI7IHRoZVxuICAgIC8vIGFsdGVybmF0aXZlIHRoZSBwbGF0Zm9ybSByZWZ1c2VzIGlzIGEgZ3Vlc3NlZCBmaWVsZCBwdXR0aW5nIGV2ZXJ5IHN1Y2hcbiAgICAvLyBjYXNlIG9uIHRvZGF5LlxuICAgIGNhbGVuZGFyOiB7XG4gICAgICBzdGFydERhdGVGaWVsZDogJ3NsYV9kdWVfZGF0ZScsXG4gICAgICB0aXRsZUZpZWxkOiAnc3ViamVjdCcsXG4gICAgICBjb2xvckZpZWxkOiAncHJpb3JpdHknLFxuICAgIH0sXG4gICAgLy8gRXNjYWxhdGUgc3RyYWlnaHQgZnJvbSB0aGUgcXVldWU6IGVzY2FsYXRlX2Nhc2UncyBvd25cbiAgICAvLyBgbG9jYXRpb25zOiBbJ2xpc3RfaXRlbSddYCBhdXRvLWluamVjdHMgdGhlIHJvdy1tZW51IGl0ZW0uXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgLyoqIFNlcnZpY2Ugd29ya2Zsb3cgYm9hcmQgKi9cbiAgICBjYXNlX3dvcmtmbG93OiB7XG4gICAgICBuYW1lOiAnY2FzZV93b3JrZmxvdycsXG4gICAgICB0eXBlOiAna2FuYmFuJyxcbiAgICAgIGxhYmVsOiAnU2VydmljZSBXb3JrZmxvdycsXG4gICAgICBkYXRhLFxuICAgICAgY29sdW1uczogWydjYXNlX251bWJlcicsICdzdWJqZWN0JywgJ3ByaW9yaXR5JywgJ3NsYV9kdWVfZGF0ZSddLFxuICAgICAga2FuYmFuOiB7XG4gICAgICAgIGdyb3VwQnlGaWVsZDogJ3N0YXR1cycsXG4gICAgICAgIGNvbHVtbnM6IFsnY2FzZV9udW1iZXInLCAnc3ViamVjdCcsICdjcm1fYWNjb3VudCcsICdwcmlvcml0eScsICdvd25lcl9pZCddLFxuICAgICAgfSxcbiAgICAgIGZpbHRlcjogW3sgZmllbGQ6ICdpc19jbG9zZWQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiBmYWxzZSB9XSxcbiAgICAgIG5hdmlnYXRpb246IHsgbW9kZTogJ2RyYXdlcicsIHdpZHRoOiAnNjQwcHgnIH0sXG4gICAgfSxcblxuICAgIC8qKiBTTEEgY2FsZW5kYXIgKi9cbiAgICBzbGFfY2FsZW5kYXI6IHtcbiAgICAgIG5hbWU6ICdzbGFfY2FsZW5kYXInLFxuICAgICAgdHlwZTogJ2NhbGVuZGFyJyxcbiAgICAgIGxhYmVsOiAnU0xBIENhbGVuZGFyJyxcbiAgICAgIGRhdGEsXG4gICAgICBjb2x1bW5zOiBbJ2Nhc2VfbnVtYmVyJywgJ3N1YmplY3QnLCAncHJpb3JpdHknXSxcbiAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnc2xhX2R1ZV9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ3N1YmplY3QnLFxuICAgICAgICBjb2xvckZpZWxkOiAncHJpb3JpdHknLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLyoqIENocm9ub2xvZ2ljYWwgY2FzZSBzdHJlYW0gKi9cbiAgICBjYXNlX3RpbWVsaW5lOiB7XG4gICAgICBuYW1lOiAnY2FzZV90aW1lbGluZScsXG4gICAgICB0eXBlOiAndGltZWxpbmUnLFxuICAgICAgbGFiZWw6ICdDYXNlIFRpbWVsaW5lJyxcbiAgICAgIGRhdGEsXG4gICAgICBjb2x1bW5zOiBbJ2Nhc2VfbnVtYmVyJywgJ3N1YmplY3QnXSxcbiAgICAgIHRpbWVsaW5lOiB7XG4gICAgICAgIC8vIGBjcmVhdGVkX2F0YCwgdGhlIHBsYXRmb3JtJ3Mgb3duIGNyZWF0aW9uIHN0YW1wIFx1MjAxNCB0aGUgb2JqZWN0J3NcbiAgICAgICAgLy8gZHVwbGljYXRlIGBjcmVhdGVkX2RhdGVgIHdhcyByZW1vdmVkIGluICMxOTkyIGJlY2F1c2Ugbm90aGluZyB3cm90ZVxuICAgICAgICAvLyBpdCBvbiBhIHJlYWwgY2FzZSwgc28gZXZlcnkgdXNlci1jcmVhdGVkIGNhc2Ugc3RhcnRlZCBpdHMgYmFyIGF0XG4gICAgICAgIC8vIG51bGwuIFNhbWUgc3BlbGxpbmcgYXMgYGRlYWxfdGltZWxpbmVgIG9uIGNybV9vcHBvcnR1bml0eSAoIzU3NSBCMikuXG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnY3JlYXRlZF9hdCcsXG4gICAgICAgIGVuZERhdGVGaWVsZDogJ2Nsb3NlZF9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ3N1YmplY3QnLFxuICAgICAgICBncm91cEJ5RmllbGQ6ICdvd25lcl9pZCcsXG4gICAgICAgIGNvbG9yRmllbGQ6ICdzdGF0dXMnLFxuICAgICAgICBzY2FsZTogJ2RheScsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWdlbnQncyBwZXJzb25hbCBxdWV1ZTogdGhlIGNhc2VzIHRoZW1zZWx2ZXMsIG9uZSByb3cgZWFjaC4gSXRzXG4gICAgICogYWdncmVnYXRlIGNvdW50ZXJwYXJ0IGlzIHNlcnZpY2VfZGFzaGJvYXJkJ3MgXCJNeSBPcGVuIENhc2VzIGJ5XG4gICAgICogUHJpb3JpdHlcIiAoIzUxMCkgXHUyMDE0IGEgZGFzaGJvYXJkIHdpZGdldCBjb3VudHMsIGl0IGNhbm5vdCBsaXN0LlxuICAgICAqL1xuICAgIG15X29wZW5fY2FzZXM6IHtcbiAgICAgIG5hbWU6ICdteV9vcGVuX2Nhc2VzJyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnTXkgT3BlbiBDYXNlcycsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhLFxuICAgICAgY29sdW1uczogWydjYXNlX251bWJlcicsICdzdWJqZWN0JywgJ2NybV9hY2NvdW50JywgJ3ByaW9yaXR5JywgJ3N0YXR1cycsICdzbGFfZHVlX2RhdGUnXSxcbiAgICAgIC8vIFx1MjZBMFx1RkUwRiBgc3RhdHVzIG5vdF9pbiBDTE9TRURfQ0FTRV9TVEFUVVNFU2AsIE5PVCBgaXNfY2xvc2VkID09IGZhbHNlYDogdGhlXG4gICAgICAvLyBmbGFnIGlzIGRlcml2ZWQgYXMgYGVmZlN0YXR1cyA9PT0gJ2Nsb3NlZCdgIGFuZCBuZXZlciBmbGlwcyBvblxuICAgICAgLy8gYHJlc29sdmVkYCwgc28gdGhlIGZsYWcgc3BlbGxpbmcgbGlzdGVkIGV2ZXJ5IFJFU09MVkVEIGNhc2UgdW5kZXIgYSB0YWJcbiAgICAgIC8vIGxhYmVsbGVkIFwiTXkgT3BlbiBDYXNlc1wiIFx1MjAxNCBtZWFzdXJlZCBvbiB0aGUgc2VlZGVkIGRlbW8gcG9wdWxhdGlvbiwgdGhlXG4gICAgICAvLyBmbGFnIHJldHVybmVkIDMwIG9mIDM4IGNhc2VzIGFuZCA3IG9mIHRob3NlIDMwIHdlcmUgcmVzb2x2ZWQuIEEgcmVzb2x2ZWRcbiAgICAgIC8vIGNhc2UgaXMgZmluaXNoZWQgd29yayBhd2FpdGluZyBjbG9zdXJlLCBub3QgYW4gb3BlbiBxdWV1ZSwgYW5kIHRoZVxuICAgICAgLy8gbWFpbnN0cmVhbSBzZXJ2aWNlLWNsb3VkIHJlYWRpbmcgb2YgXCJvcGVuXCIgZXhjbHVkZXMgaXQgKFplbmRlc2sncyBvcGVuXG4gICAgICAvLyBzZXQgb21pdHMgU29sdmVkOyBTZXJ2aWNlTm93J3MgT09UQiBPcGVuIGZpbHRlciBpc1xuICAgICAgLy8gYHN0YXRlIG5vdCBpbiAoUmVzb2x2ZWQsIENsb3NlZCwgQ2FuY2VsbGVkKWApLiBSdWxlZCAyMDI2LTA4LTMxOyBwaW5uZWQgYnlcbiAgICAgIC8vIGB0ZXN0L2xpdmUtd29yay1wcmVkaWNhdGUtcGFyaXR5LnRlc3QudHNgICgjMTE0NSksIHdob3NlIGNvbnN1bWVyIHJvc3RlclxuICAgICAgLy8gdGhpcyB2aWV3IGpvaW5lZCBpbiB0aGUgc2FtZSBjaGFuZ2UuXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgeyBmaWVsZDogJ293bmVyX2lkJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ3tjdXJyZW50X3VzZXJfaWR9JyB9LFxuICAgICAgICB7IGZpZWxkOiAnc3RhdHVzJywgb3BlcmF0b3I6ICdub3RfaW4nLCB2YWx1ZTogWydyZXNvbHZlZCcsICdjbG9zZWQnXSB9LFxuICAgICAgXSxcbiAgICAgIHNvcnQ6IFtcbiAgICAgICAgeyBmaWVsZDogJ3ByaW9yaXR5X3JhbmsnLCBvcmRlcjogJ2Rlc2MnIH0sXG4gICAgICAgIHsgZmllbGQ6ICdzbGFfZHVlX2RhdGUnLCBvcmRlcjogJ2FzYycgfSxcbiAgICAgIF0sXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVuYXNzaWduZWQgXHUyMDE0IHRyaWFnZSAoIzU5NikuIFRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgcXVldWUgc3Vic3RpdHV0ZS5cbiAgICAgKlxuICAgICAqIGBjYXNlX2F1dG9fYXNzaWduYCAoYHNyYy9zZXJ2aWNlL29iamVjdHMvX2Nhc2UtYXNzaWdubWVudC50c2ApIGlzIGEgTk8tT1Agd2hlbmV2ZXJcbiAgICAgKiB0aGUgYHNlcnZpY2VfYWdlbnRgIHBvb2wgaXMgZW1wdHksIGFuZCBhbiBlbXB0eSBwb29sIGlzIHRoZSBGSVJTVC1JTlNUQUxMXG4gICAgICogTk9STSByYXRoZXIgdGhhbiBhbiBlZGdlIGNhc2U6IGBzeXNfdXNlcl9wb3NpdGlvbmAgbWVtYmVyc2hpcCBpcyBydW50aW1lXG4gICAgICogZGF0YSwgc28gb24gYSBmcmVzaCBvcmcgXHUyMDE0IGFuZCBhbnkgdGltZSBldmVyeSBhZ2VudCBoYXMgYmVlbiB1bmFzc2lnbmVkXG4gICAgICogZnJvbSB0aGUgcG9zaXRpb24gXHUyMDE0IGFuIGluYm91bmQgd2ViLXRvLWNhc2UgbGFuZHMgb3duZXJsZXNzLiBCZXN0LWVmZm9ydFxuICAgICAqIGFzc2lnbm1lbnQgYWxzbyBzdGFuZHMgZG93biBvbiBhIHBlcm1pc3Npb24gZGVuaWFsICh0aGUgYW5vbnltb3VzXG4gICAgICogcHVibGljLWZvcm0gY29udGV4dCBjYW5ub3QgcmVhZCBgc3lzX3VzZXJfcG9zaXRpb25gIGF0IGFsbCkuXG4gICAgICpcbiAgICAgKiBUaG9zZSBjYXNlcyB1c2VkIHRvIGJlIGludmlzaWJsZTogbm8gdmlldyBmaWx0ZXJlZCBvbiB0aGUgYWJzZW5jZSBvZiBhblxuICAgICAqIG93bmVyLCBzbyBhbiB1bm93bmVkIGNhc2UgYXBwZWFyZWQgaW4gYEFsbCBDYXNlc2Agd2l0aCBhIGJsYW5rIE93bmVyXG4gICAgICogY29sdW1uIGFuZCBub3RoaW5nIGRpc3Rpbmd1aXNoZWQgaXQgZnJvbSB0aGUgcmVzdC4gVGhpcyB2aWV3IGlzIHRoZVxuICAgICAqIHN0YW5kaW5nIGFuc3dlciBcdTIwMTQgc2lsZW5jZSByZXBsYWNlZCBieSBhIHBpbm5lZCB0YWIgd2hvc2Ugcm93IGNvdW50IElTIHRoZVxuICAgICAqIGludGFrZSBiYWNrbG9nLlxuICAgICAqXG4gICAgICogYGlzX251bGxgIG9uIGBvd25lcl9pZGAsIG5vdCBgZXF1YWxzOiBudWxsYDogdGhlIG93bmVybGVzcyBzaGFwZSBpcyBhblxuICAgICAqIEFCU0VOVCBjb2x1bW4gb24gZHJpdmVyLW1lbW9yeSAoc2VlIHRoZSB0b3RhbGl0eSBub3RlIGluXG4gICAgICogYGNhc2UtZXNjYWxhdGlvbi5mbG93LnRzYCwgd2hlcmUgYHJlY29yZC5lc2NhbGF0ZWRfZGF0ZSA9PSBudWxsYCBhYm9ydGVkXG4gICAgICogd2l0aCBgTm8gc3VjaCBrZXlgKSBhcyB3ZWxsIGFzIGEgTlVMTCBvbmUgb24gU1FMLCBhbmQgb25seSB0aGUgb3BlcmF0b3JcbiAgICAgKiBmb3JtIGFuc3dlcnMgdGhlIHNhbWUgd2F5IGZvciBib3RoLlxuICAgICAqXG4gICAgICogVGhlIHByZWRpY2F0ZSBmb3IgXCJubyBsb25nZXIgbGl2ZSB3b3JrXCIgaXMgYHN0YXR1cyBub3RfaW4gWydyZXNvbHZlZCcsXG4gICAgICogJ2Nsb3NlZCddYCwgTk9UIGBpc19jbG9zZWQgPT0gZmFsc2VgLiBgaXNfY2xvc2VkYCBpcyBkZXJpdmVkIGJ5XG4gICAgICogYGNhc2Vfc2xhX2RlZmF1bHRzYCBhcyBgZWZmU3RhdHVzID09PSAnY2xvc2VkJ2AsIHNvIGl0IG5ldmVyIGZsaXBzIG9uXG4gICAgICogYHJlc29sdmVkYCBcdTIwMTQgYW5kIGEgcmVzb2x2ZWQgb3duZXJsZXNzIGNhc2Ugc2F0aXNmaWVkIGJvdGggb2YgdGhpcyB2aWV3J3NcbiAgICAgKiBvbGQgZmlsdGVycyBhbmQgc2F0IGhlcmUgZm9yZXZlciwgd2hpY2ggaXMgbmVpdGhlciBcImFycml2ZXMgd2l0aCBub1xuICAgICAqIG93bmVyXCIgbm9yIFwid29yayB3YWl0aW5nIGZvciBhIGh1bWFuXCIuIGBub3RfaW5gIGxvd2VycyB0byB0aGUgYCRuaW5gIHRoZVxuICAgICAqIGxvYWQtYmFsYW5jaW5nIGhvb2tzIGFuZCBgY2FzZV9zbGFfbW9uaXRvcmAgYWxyZWFkeSB1c2UgZm9yIHRoZSBzYW1lXG4gICAgICogY29uY2VwdCwgc28gdGhlIGZvdXIgY29uc3VtZXJzIG5vdyBzdGF0ZSBvbmUgcHJlZGljYXRlOyB0aGUgcm9zdGVyIHRoYXRcbiAgICAgKiBob2xkcyB0aGVtIHRvZ2V0aGVyIGJ5IE5BTUUgaXMgYHRlc3QvbGl2ZS13b3JrLXByZWRpY2F0ZS1wYXJpdHkudGVzdC50c2AuXG4gICAgICogYGNsb3NlZGAgc3RheXMgZXhjbHVkZWQgZm9yIHRoZSByZWFzb24gaXQgYWx3YXlzIHdhczogaGlzdG9yeSwgbm90XG4gICAgICogYmFja2xvZy5cbiAgICAgKlxuICAgICAqIFx1MjZBMFx1RkUwRiBXSE8gQUNUVUFMTFkgU0VFUyBST1dTIEhFUkUgaXMgZGVjaWRlZCBieSByZWNvcmQtbGV2ZWwgYWNjZXNzLCBub3QgYnlcbiAgICAgKiB0aGlzIHZpZXcsIGFuZCB0aGUgYW5zd2VyIHRvZGF5IGlzIG5hcnJvd2VyIHRoYW4gdGhlIHRhYiBzdWdnZXN0cy4gQVxuICAgICAqIHZpZXcgdGFiIGNhcnJpZXMgbm8gcm9sZSBzY29waW5nIFx1MjAxNCBgVmlld1RhYlNjaGVtYWAgaGFzIGBwaW5uZWRgLFxuICAgICAqIGBpc0RlZmF1bHRgIGFuZCBhIGJvb2xlYW4gYHZpc2libGVgLCBhbmQgbm90aGluZyBwZXItcHJvZmlsZSBcdTIwMTQgc28gdGhpcyBpc1xuICAgICAqIHBpbm5lZCBmb3IgZXZlcnlvbmUgd2hvIGNhbiBvcGVuIENhc2VzLCB3aGlsZSB0aGUgUk9XUyByZXNvbHZlIHBlclxuICAgICAqIHByb2ZpbGU6XG4gICAgICpcbiAgICAgKiAgIC0gYHN5c3RlbV9hZG1pbmAgXHUyMDE0IGB2aWV3QWxsUmVjb3Jkc2AsIHNvIHRoZSBmdWxsIGJhY2tsb2cuIFRoaXMgaXMgdGhlXG4gICAgICogICAgIHBlcnNvbmEgdGhlIGVtcHR5LXBvb2wgc3RhdGUgaXMgRk9SOiBhbiBlbXB0eSBgc2VydmljZV9hZ2VudGAgcG9vbCBpc1xuICAgICAqICAgICBmaXhlZCBieSBzdGFmZmluZyBgc3lzX3VzZXJfcG9zaXRpb25gLCB3aGljaCBvbmx5IGFuIGFkbWluIGNhbiBkby5cbiAgICAgKiAgIC0gYHNhbGVzX21hbmFnZXJgIFx1MjAxNCBgdmlld0FsbFJlY29yZHNgLCByZWFkLW9ubHkuXG4gICAgICogICAtIGEgc2VydmljZSBtYW5hZ2VyIC8gZGlyZWN0b3IgXHUyMDE0IHRoZSBjcml0aWNhbCwgb3BlbiBzbGljZSBvbmx5LCB2aWEgdGhlXG4gICAgICogICAgIGV4aXN0aW5nIGBjYXNlX2VzY2FsYXRpb25fc2hhcmluZ2AgLyBgY2FzZV9kaXJlY3Rvcl9zaGFyaW5nYCBjcml0ZXJpYVxuICAgICAqICAgICBydWxlcyAoYHNyYy9zZXJ2aWNlL3NoYXJpbmcvY2FzZS5zaGFyaW5nLnRzYCkuXG4gICAgICogICAtIGBzZXJ2aWNlX2FnZW50YCBcdTIwMTQgYHJlYWRTY29wZTogJ293bidgIG9uIGBjcm1fY2FzZWAsIGFuZCBhbiB1bm93bmVkXG4gICAgICogICAgIHJvdyBpcyBvd25lZCBieSBub2JvZHksIHNvICoqYW4gYWdlbnQncyB0cmlhZ2UgdGFiIGlzIGVtcHR5KiouXG4gICAgICpcbiAgICAgKiBUaGUgbGFzdCBsaW5lIGlzIGEgcmVhbCBnYXAgZm9yIHRoZSBcImFnZW50IHB1bGxzIGZyb20gdGhlIHF1ZXVlXCIgc3RvcnlcbiAgICAgKiBhbmQgaXMgZGVsaWJlcmF0ZWx5IE5PVCBjbG9zZWQgaGVyZTogZ3JhbnRpbmcgc2VydmljZSByb2xlcyBzaWdodCBvZlxuICAgICAqIHVub3duZWQgY2FzZXMgaXMgYSBzaGFyaW5nLW1vZGVsIGNoYW5nZSAoYSBuZXcgY3JpdGVyaWEgcnVsZSwgb3IgYVxuICAgICAqIGByZWFkU2NvcGVgIHdpZGVuaW5nKSwgd2hpY2ggaXMgb3V0c2lkZSB0aGlzIGNhcmQncyBmaWxlIHN1cmZhY2UgYW5kIGlzXG4gICAgICogZXhhY3RseSB0aGUga2luZCBvZiBxdWlldCBwZXJtaXNzaW9uIHdpZGVuaW5nIHRoZSAjNTk2IHJ1bGluZyBydWxlcyBvdXQuXG4gICAgICogRmlsZWQgYXMgIzEwOTYgZm9yIGEgZGVjaXNpb24sIHdpdGggdGhlIHJlYWNoIHRhYmxlIGFib3ZlIGFuZCB0aGUgdGhyZWVcbiAgICAgKiBvcHRpb25zIHByaWNlZC5cbiAgICAgKi9cbiAgICB1bmFzc2lnbmVkX3RyaWFnZToge1xuICAgICAgbmFtZTogJ3VuYXNzaWduZWRfdHJpYWdlJyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnVW5hc3NpZ25lZCBcdTIwMTQgdHJpYWdlJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGEsXG4gICAgICBjb2x1bW5zOiBbJ2Nhc2VfbnVtYmVyJywgJ3N1YmplY3QnLCAnY3JtX2FjY291bnQnLCAnY3JtX2NvbnRhY3QnLCAncHJpb3JpdHknLCAnc3RhdHVzJywgJ29yaWdpbicsICdzbGFfZHVlX2RhdGUnXSxcbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAnb3duZXJfaWQnLCBvcGVyYXRvcjogJ2lzX251bGwnIH0sXG4gICAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCBvcGVyYXRvcjogJ25vdF9pbicsIHZhbHVlOiBbJ3Jlc29sdmVkJywgJ2Nsb3NlZCddIH0sXG4gICAgICBdLFxuICAgICAgLy8gU2FtZSBvcmRlcmluZyBhcyB0aGUgbWFpbiBxdWV1ZTogdXJnZW5jeSBmaXJzdCAob24gdGhlIG1hdGVyaWFsaXNlZFxuICAgICAgLy8gb3JkaW5hbCwgbmV2ZXIgdGhlIHJhdyBzZWxlY3QpLCB0aGVuIHNvb25lc3QgZGVhZGxpbmUuXG4gICAgICBzb3J0OiBbXG4gICAgICAgIHsgZmllbGQ6ICdwcmlvcml0eV9yYW5rJywgb3JkZXI6ICdkZXNjJyB9LFxuICAgICAgICB7IGZpZWxkOiAnc2xhX2R1ZV9kYXRlJywgb3JkZXI6ICdhc2MnIH0sXG4gICAgICBdLFxuICAgICAgcm93Q29sb3I6IHtcbiAgICAgICAgZmllbGQ6ICdwcmlvcml0eScsXG4gICAgICAgIGNvbG9yczogeyBjcml0aWNhbDogJ3JlZCcsIGhpZ2g6ICdvcmFuZ2UnLCBtZWRpdW06ICd5ZWxsb3cnLCBsb3c6ICdzbGF0ZScgfSxcbiAgICAgIH0sXG4gICAgICAvLyBUaGUgZW1wdHkgc3RhdGUgY2FycmllcyB0aGUgb3BlcmF0aW9uYWwgaW5zdHJ1Y3Rpb24sIGJlY2F1c2UgXCJubyByb3dzXCJcbiAgICAgIC8vIGhlcmUgaXMgYW1iaWd1b3VzIG9uIGl0cyBvd246IGl0IG1lYW5zIGVpdGhlciBcInRoZSByb3VuZC1yb2JpbiBwbGFjZWRcbiAgICAgIC8vIGV2ZXJ5dGhpbmdcIiAoZ29vZCkgb3IgXCJubyBjYXNlIGhhcyBhcnJpdmVkIHlldFwiIChhbHNvIGZpbmUpIFx1MjAxNCBhbmQgdGhlXG4gICAgICAvLyByZWFkZXIgbW9zdCBsaWtlbHkgdG8gYmUgbG9va2luZyBpcyBzb21lb25lIHdobyBqdXN0IGZvdW5kIHRoZSB0YWJcbiAgICAgIC8vIGZ1bGwgYW5kIG5lZWRzIHRvIGtub3cgd2h5LlxuICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICB0aXRsZTogJ05vdGhpbmcgd2FpdGluZyBmb3IgdHJpYWdlJyxcbiAgICAgICAgbWVzc2FnZTogJ0V2ZXJ5IGNhc2UgaGFzIGFuIG93bmVyLiBDYXNlcyBhcHBlYXIgaGVyZSB3aGVuIHRoZXkgYXJyaXZlIHdpdGggbm8gb3duZXIgXHUyMDE0IHR5cGljYWxseSBhIHdlYi10by1jYXNlIHN1Ym1pc3Npb24gdGhhdCBhcnJpdmVkIHdoaWxlIG5vYm9keSBoZWxkIHRoZSBTZXJ2aWNlIEFnZW50IHBvc2l0aW9uLicsXG4gICAgICAgIGljb246ICdpbmJveCcsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBlc2NhbGF0ZWRfY2FzZXM6IHtcbiAgICAgIG5hbWU6ICdlc2NhbGF0ZWRfY2FzZXMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdFc2NhbGF0ZWQgQ2FzZXMnLFxuICAgICAgdXNlckFjdGlvbnM6IHsgZWRpdElubGluZTogdHJ1ZSB9LFxuICAgICAgZGF0YSxcbiAgICAgIGNvbHVtbnM6IFsnY2FzZV9udW1iZXInLCAnc3ViamVjdCcsICdjcm1fYWNjb3VudCcsICdwcmlvcml0eScsICdzbGFfZHVlX2RhdGUnLCAnb3duZXJfaWQnXSxcbiAgICAgIGZpbHRlcjogW3sgZmllbGQ6ICdpc19lc2NhbGF0ZWQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiB0cnVlIH1dLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICdwcmlvcml0eV9yYW5rJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU0xBLWF0LXJpc2s6IG9wZW4gY2FzZXMgYXQgSGlnaCBvciBDcml0aWNhbCBwcmlvcml0eSBuZWVkaW5nIGF0dGVudGlvbi5cbiAgICAgKlxuICAgICAqIFx1MjZBMFx1RkUwRiBOYW1lcyB3aGF0IHRoZSBmaWx0ZXIgYmVsb3cgYWN0dWFsbHkgc2VsZWN0cy4gVGhpcyByZWFkXG4gICAgICogXCJoaWdoL3VyZ2VudFwiIHVudGlsICMxMzMzIFx1MjAxNCBidXQgYGNybV9jYXNlLnByaW9yaXR5YCBpc1xuICAgICAqIGxvdy9tZWRpdW0vaGlnaC9jcml0aWNhbCAoYGNhc2Uub2JqZWN0LnRzOjEzOC0xNDJgKSBhbmQgaGFzIE5PIGB1cmdlbnRgO1xuICAgICAqIHRoYXQgdmFsdWUgYmVsb25ncyB0byBgY3JtX3Rhc2tgLiBUaGUgbWlycm9yLWltYWdlIGNyb3NzaW5nIGFscmVhZHlcbiAgICAgKiBzaGlwcGVkIGEgcmVhbCBkZWZlY3Qgb25jZSAoYHRhc2sudmlldy50czozNWAgXHUyMDE0IENhc2UgY29sb3VyIGtleXMgb24gdGhlXG4gICAgICogdGFzayB2aWV3IGxlZnQgZXZlcnkgdXJnZW50IGFuZCBub3JtYWwgcm93IHVuY29sb3VyZWQpLCBhbmQgdGhlXG4gICAgICogZGlyZWN0aW9uIHRoYXQgY29zdCBzb21ldGhpbmcgd2FzIHRoZSBvbmUgd2hlcmUgdGhlIGNvbW1lbnQgd2FzXG4gICAgICogYmVsaWV2ZWQuIFR3byBvdmVybGFwcGluZy1idXQtdW5lcXVhbCB2b2NhYnVsYXJpZXM6IGtlZXAgdGhlbSBhcGFydC5cbiAgICAgKi9cbiAgICBzbGFfYXRfcmlzazoge1xuICAgICAgbmFtZTogJ3NsYV9hdF9yaXNrJyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnXHUyM0YwIFNMQSBhdCBSaXNrJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGEsXG4gICAgICBjb2x1bW5zOiBbJ2Nhc2VfbnVtYmVyJywgJ3N1YmplY3QnLCAnY3JtX2FjY291bnQnLCAncHJpb3JpdHknLCAnc2xhX2R1ZV9kYXRlJywgJ293bmVyX2lkJ10sXG4gICAgICAvLyBPcGVyYXRvci1vbmx5IGZpbHRlciBcdTIwMTQgc29ydCBieSBTTEEgZHVlIGRhdGUgYXNjZW5kaW5nIHNvIHRoZSBzb29uZXN0XG4gICAgICAvLyBzdXJmYWNlIGZpcnN0LiAoVGhlIHZpZXcgcnVudGltZSBkb2VzIG5vdCBpbnRlcnBvbGF0ZSBge05PVygpICsgNGh9YC4pXG4gICAgICAvL1xuICAgICAgLy8gXHUyNkEwXHVGRTBGIGBzdGF0dXMgbm90X2luIENMT1NFRF9DQVNFX1NUQVRVU0VTYCwgTk9UIGBpc19jbG9zZWQgPT0gZmFsc2VgOiB0aGVcbiAgICAgIC8vIGZsYWcgaXMgZGVyaXZlZCBhcyBgZWZmU3RhdHVzID09PSAnY2xvc2VkJ2AgYW5kIG5ldmVyIGZsaXBzIG9uXG4gICAgICAvLyBgcmVzb2x2ZWRgLCBzbyB0aGUgZmxhZyBzcGVsbGluZyBsaXN0ZWQgcmVzb2x2ZWQgY2FzZXMgYXMgYXQgcmlzayB3aGlsZVxuICAgICAgLy8gYGNhc2Vfc2xhX21vbml0b3JgIFx1MjAxNCB0aGUgYXV0b21hdGlvbiB0aGF0IE9XTlMgU0xBIFx1MjAxNCBoYWQgYWxyZWFkeVxuICAgICAgLy8gZXhjbHVkZWQgdGhlbSAoYHN0YXR1czogeyAkbmluOiBbJ3Jlc29sdmVkJywgJ2Nsb3NlZCddIH1gKS4gVGhlIHRhYiBhXG4gICAgICAvLyBodW1hbiByZWFkcyBhbmQgdGhlIHN3ZWVwIHRoYXQgYWN0cyBtdXN0IGFuc3dlciB0aGlzIG9uZSBxdWVzdGlvbiB0aGVcbiAgICAgIC8vIHNhbWUgd2F5LiBQaW5uZWQgYnkgYHRlc3QvbGl2ZS13b3JrLXByZWRpY2F0ZS1wYXJpdHkudGVzdC50c2AgKCMxMTQ1KS5cbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAnc3RhdHVzJywgb3BlcmF0b3I6ICdub3RfaW4nLCB2YWx1ZTogWydyZXNvbHZlZCcsICdjbG9zZWQnXSB9LFxuICAgICAgICB7IGZpZWxkOiAncHJpb3JpdHknLCBvcGVyYXRvcjogJ2luJywgdmFsdWU6IFsnaGlnaCcsICdjcml0aWNhbCddIH0sXG4gICAgICBdLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICdzbGFfZHVlX2RhdGUnLCBvcmRlcjogJ2FzYycgfV0sXG4gICAgfSxcbiAgfSxcblxuICAvKipcbiAgICogVGhlIHJlY29yZCBmb3JtIFx1MjAxNCBhbmQsIGJlY2F1c2UgdGhlIHBsYXRmb3JtIGhhcyBPTkUsIHRoZSBDUkVBVEUgZm9ybSB0b28uXG4gICAqXG4gICAqICMjIFx1MjZBMFx1RkUwRiBUaGlzIG9iamVjdCdzIGBmb3JtYCBJUyB0aGUgY3JlYXRlIGRpYWxvZyAoIzEyMTQgaXRlbSAzKVxuICAgKlxuICAgKiBNZWFzdXJlZCBhZ2FpbnN0IHRoZSBjb25zb2xlIHRoaXMgYXBwIHNoaXBwZWQgYXQgdGhhdCB0YWtpbmdcbiAgICogKGBAb2JqZWN0c3RhY2svY29uc29sZWAgMTcuMS4wLCBgZGlzdC9hc3NldHMvYDsgdGhpcyBidW5kbGUgcmVhZCB3YXMgXHUyNkQ0IE5PVFxuICAgKiByZS10YWtlbiBvbiBhbnkgbGF0ZXIgcGluKSwgQk9USFxuICAgKiBlbnRyeSBwb2ludHMgdGhhdCBvcGVuIGEgY2FzZSBmb3JtIHJlc29sdmVcbiAgICogaXQgdGhlIHNhbWUgd2F5IGFuZCBuZWl0aGVyIHRha2VzIGEgY3JlYXRlL2VkaXQgYXJndW1lbnQ6XG4gICAqXG4gICAqICAgUmVjb3JkRm9ybVBhZ2UgKGAve29iamVjdH0vbmV3YCwgYC97b2JqZWN0fS9yZWNvcmQve2lkfS9lZGl0YClcbiAgICogICAgICAgdmlldy5mb3JtID8/IHZpZXcuZm9ybVZpZXdzPy5kZWZhdWx0XG4gICAqICAgdXNlQWN0aW9uTW9kYWwgKHRoZSBgKyBOZXdgIG1vZGFsIG9mZiBhIGxpc3QgdmlldylcbiAgICogICAgICAgdmlldy5mb3JtID8/IHZpZXcuZm9ybVZpZXdzPy5kZWZhdWx0XG4gICAqXG4gICAqIFx1MjFEMiBUaGVyZSBpcyBubyBjcmVhdGUtb25seSBmb3JtIHRvIGF1dGhvci4gYExpc3RWaWV3U2NoZW1hLmFkZFJlY29yZGBcbiAgICogY2FycmllcyBhIGBmb3JtVmlld2Aga2V5IGluIGBAb2JqZWN0c3RhY2svc3BlY2AsIGJ1dCBOTyBjb25zb2xlIGNvZGUgcGF0aFxuICAgKiByZWFkcyBpdCAodGhlIHN0cmluZyBhcHBlYXJzIG9ubHkgaW4gdGhlIHZpZXcgZGVzaWduZXIncyBvd24gaTE4biB0YWJsZSksXG4gICAqIHNvIHBvaW50aW5nIGl0IGF0IGEgc2Vjb25kIGZvcm0gdmlldyB3b3VsZCBzaGlwIGFuIEFEUi0wMDQ5XG4gICAqIGRlY2xhcmVkLWJ1dC11bmVuZm9yY2VkIHNoYXBlIGFuZCBjaGFuZ2Ugbm90aGluZyBvbiBzY3JlZW4uXG4gICAqXG4gICAqIFx1MjFEMiBUaGVyZWZvcmUgdGhlIGNyZWF0ZS1zYWZlIGZpZWxkIHNldCBoYXMgdG8gQkUgdGhpcyBmb3JtJ3MgZmllbGQgc2V0LlxuICAgKiBUaGF0IGlzIHdoeSB0aGUgU0xBIGFuZCBSZXNvbHV0aW9uIHNlY3Rpb25zIGFyZSBnb25lIHJhdGhlciB0aGFuIGdhdGVkLlxuICAgKlxuICAgKiAjIyBcdTI2RDQgV2h5IHRoZSB0YWIgc3RyaXAgd2FzIG5vdCB0aGUgb2JqZWN0J3MgYGZpZWxkR3JvdXBzYFxuICAgKlxuICAgKiBgY3JtX2Nhc2UuZmllbGRHcm91cHNgIGRlY2xhcmVzIFNJWCBncm91cHMgKENhc2UgSW5mb3JtYXRpb24gLyBPcmlnaW4gJlxuICAgKiBSb3V0aW5nIC8gU0xBICYgUHJpb3JpdHkgLyBSZXNvbHV0aW9uIC8gRXNjYWxhdGlvbiAvIFN5c3RlbSkgYW5kIHRoZVxuICAgKiBkaWFsb2cgc2hvd2VkIFRIUkVFIHRhYnMgXHUyMDE0IHRoZXNlIHNlY3Rpb25zLiBUaGUgcmVuZGVyZXIgb25seSByZWFjaGVzIGZvclxuICAgKiBgZmllbGRHcm91cHNgIG9uIGl0cyBBVVRPLURFUklWRUQgcGF0aCwgdGFrZW4gd2hlbiBhIGZvcm0gYXV0aG9ycyBub1xuICAgKiBgc2VjdGlvbnNgIGF0IGFsbDsgYW4gYXV0aG9yZWQgYHNlY3Rpb25zYCBhcnJheSB3aW5zIG91dHJpZ2h0LiBTb1xuICAgKiBgc3JjL3NlcnZpY2Uvb2JqZWN0cy9jYXNlLm9iamVjdC50c2AgaXMgbm90IHBhcnQgb2YgdGhpcyBzdXJmYWNlLlxuICAgKlxuICAgKiAjIyBcdTI2QTBcdUZFMEYgQXV0aG9yaW5nIGBzZWN0aW9uc2AgT1BUUyBPVVQgb2YgdGhlIGNyZWF0ZS1tb2RlIGZpZWxkIHN0cmlwXG4gICAqXG4gICAqIFRoYXQgYXV0by1kZXJpdmVkIHBhdGggYWxzbyBydW5zIHR3byBmaWx0ZXJzIHRoZSBhdXRob3JlZCBwYXRoIG5ldmVyIHNlZXNcbiAgICogKGBwbHVnaW4tZm9ybWA6IGBRZWAgXHUyMTkyIGBxZWAgZHJvcHMgYHJlYWRvbmx5YC9gaGlkZGVuYCBmaWVsZHMsIGFuZCBvblxuICAgKiBgbW9kZSA9PT0gJ2NyZWF0ZSdgIGBKZWAgYWRkaXRpb25hbGx5IGRyb3BzIGZvcm11bGEgLyBzdW1tYXJ5IC8gYXV0b251bWJlclxuICAgKiBmaWVsZHMpLiBBbiBhdXRob3JlZCBzZWN0aW9uIHJlbmRlcnMgaXRzIGxpc3QgVkVSQkFUSU0uIFRoYXQgaXMgdGhlIHdob2xlXG4gICAqIG1lY2hhbmlzbSBiZWhpbmQgdGhpcyBkZWZlY3Q6IHRoZSBwbGF0Zm9ybSB3b3VsZCBoYXZlIGhpZGRlblxuICAgKiBgY3JlYXRlZF9kYXRlYCAocmV0aXJlZCBpbiAjMTk5MiksIGBjbG9zZWRfZGF0ZWAsIGByZXNvbHV0aW9uX3RpbWVfaG91cnNgXG4gICAqIGFuZCBgaXNfY2xvc2VkYCBmcm9tIGEgY3JlYXRvciBieSBpdHNlbGYsIGFuZCBuYW1pbmcgdGhlbSBpbiBhIHNlY3Rpb24gcHV0XG4gICAqIHRoZW0gYmFjay5cbiAgICpcbiAgICogIyMgXHUyNkQ0IFdoeSBub3QgZ2F0ZSB0aGUgb2xkIHNlY3Rpb25zIG9uIGEgcHJlZGljYXRlIGluc3RlYWRcbiAgICpcbiAgICogQSBzZWN0aW9uLWxldmVsIGB2aXNpYmxlV2hlbmAgaXMgcGFyc2VkIGJ5IGBGb3JtU2VjdGlvblNjaGVtYWAgYW5kIHJlYWQgYnlcbiAgICogTk9USElORyBpbiB0aGUgZm9ybSByZW5kZXJlciAob25seSBGSUVMRC1sZXZlbCBgdmlzaWJsZVdoZW5gIGlzXG4gICAqIGV2YWx1YXRlZCksIHNvIGl0IHdvdWxkIGhpZGUgbm90aGluZy4gQW5kIGZpZWxkLWxldmVsIHByZWRpY2F0ZSBldmFsdWF0aW9uXG4gICAqIEZBSUxTIE9QRU4gXHUyMDE0IGFuIHVuZXZhbHVhYmxlIHByZWRpY2F0ZSByZW5kZXJzIHRoZSBmaWVsZCB2aXNpYmxlLCB3aXRoIG5vXG4gICAqIGRpYWdub3N0aWMgKHRoZSBob3VzZSBydWxlIGF0IHRoZSB0b3Agb2YgYGxlYWQudmlldy50c2AsIHVwc3RyZWFtXG4gICAqIG9iamVjdHN0YWNrLWFpL29iamVjdHN0YWNrIzUxNDkpLiBBIGdhdGUgdGhhdCBmYWlscyBvcGVuIGlzIG5vdCBhIGdhdGUgZm9yXG4gICAqIGEgZGF0YS1pbnRlZ3JpdHkgY29udHJvbCwgd2hpY2ggaXMgd2hhdCB0aGlzIG9uZSBpcy5cbiAgICpcbiAgICogIyMgV2hhdCBhIGNyZWF0b3IgbWF5IGF1dGhvciBoZXJlLCBhbmQgd2h5IHRoZSByZXN0IGxlZnRcbiAgICpcbiAgICogRXZlcnl0aGluZyBiZWxvdyBpcyBhIGZhY3QgdGhlIHBlcnNvbiByYWlzaW5nIHRoZSBjYXNlIEhBUyBhdCBpbnRha2UuXG4gICAqIGBjYXNlX251bWJlcmAgc3RheXMgYmVjYXVzZSBpdCBpcyBgcmVhZG9ubHk6IHRydWVgIG9uIHRoZSBvYmplY3QsIHNvIHRoZVxuICAgKiByZW5kZXJlciBkaXNhYmxlcyBpdCBcdTIwMTQgaXQgaXMgc2hvd24sIG5ldmVyIGF1dGhvcmVkLlxuICAgKlxuICAgKiBUaGUgcmVtb3ZlZCBmaWVsZHMgYXJlIGFsbCB3cml0dGVuIGJ5IHRoZSBsaWZlY3ljbGUsIGFuZCBldmVyeSBvbmUgb2YgdGhlbVxuICAgKiBzdGlsbCBoYXMgdGhlIHN1cmZhY2UgaXQgYmVsb25ncyBvbiAocGlubmVkIGluXG4gICAqIGB0ZXN0L2Nhc2UtY3JlYXRlLWZvcm0tbmFycm93aW5nLnRlc3QudHNgLCBib3RoIGRpcmVjdGlvbnMpOlxuICAgKlxuICAgKiAgIGNsb3NlZF9kYXRlICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OyBgY2FzZV90aW1lbGluZWAgZW5kXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0cyBzdGFydCBpcyB0aGUgcGxhdGZvcm0nc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBjcmVhdGVkX2F0YDsgYGNyZWF0ZWRfZGF0ZWAgd2FzXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0aXJlZCBpbiAjMTk5MilcbiAgICogICBzbGFfZHVlX2RhdGUgICAgICAgICAgICAgICAgICAgICBgY2FzZS5ob29rLnRzYCBzdGFtcHMgaXQgZnJvbSB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSBcdTAwRDcgdGllciBtYXRyaXg7IGxpc3QgY29sdW1uLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnQga2V5LCBgc2xhX2NhbGVuZGFyLnN0YXJ0RGF0ZUZpZWxkYCxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWwtcGFnZSBoaWdobGlnaHRzXG4gICAqICAgZmlyc3RfcmVzcG9uc2VfZGF0ZSAgICAgICAgICAgICAgYGV2ZW50Lmhvb2sudHNgIGlzIGl0cyBTSU5HTEUgd3JpdGVyXG4gICAqICAgcmVzb2x1dGlvbl90aW1lX2hvdXJzICAgICAgICAgICAgcmVhZG9ubHk7IGRlcml2ZWQgYXQgY2xvc2U7IGRldGFpbCBwYWdlXG4gICAqICAgaXNfc2xhX3Zpb2xhdGVkICAgICAgICAgICAgICAgICAgbGlzdCBjb2x1bW4gKyBkZXRhaWwtcGFnZSBoaWdobGlnaHRzXG4gICAqICAgaXNfZXNjYWxhdGVkLCBlc2NhbGF0aW9uX3JlYXNvbiAgd3JpdHRlbiBieSBgY2FzZV9lc2NhbGF0aW9uYCAvXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGNhc2Vfc2xhX21vbml0b3JgIC8gYGVzY2FsYXRlX2Nhc2VgO1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbCBwYWdlJ3MgU3RhdHVzICYgU0xBIHNlY3Rpb25cbiAgICogICByZXNvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWwgcGFnZSdzIERlc2NyaXB0aW9uIHNlY3Rpb25cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhlIGByZXNvbHV0aW9uX3JlcXVpcmVkX29uX2Nsb3NlYFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb24gc3RpbGwgaGFzIGl0cyBzdXJmYWNlKVxuICAgKiAgIGlzX2Nsb3NlZCAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5OyBkZXJpdmVkIGZyb20gYHN0YXR1c2BcbiAgICpcbiAgICogXHUyNkEwXHVGRTBGIGBpbnRlcm5hbF9ub3Rlc2AsIGBjdXN0b21lcl9yYXRpbmdgIGFuZCBgY3VzdG9tZXJfZmVlZGJhY2tgIGxlZnQgd2l0aFxuICAgKiB0aGUgUmVzb2x1dGlvbiBzZWN0aW9uIGFuZCBoYWQgTk8gb3RoZXIgYXV0aG9yaW5nIHN1cmZhY2UgYXQgYWxsLiAjMTQyOFxuICAgKiBzZXR0bGVkIGJvdGggaGFsdmVzIG9mIHRoYXQsIGFuZCBuZWl0aGVyIGFuc3dlciB3YXMgXCJwdXQgdGhlbSBiYWNrIGhlcmVcIjpcbiAgICpcbiAgICogICBpbnRlcm5hbF9ub3RlcyAgICAgICAgICAgICAgICAgICBgY2FzZV9kZXRhaWwucGFnZS50c2AncyBEZXNjcmlwdGlvblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIGF1dGhvcmVkIGJ5IGlubGluZSBlZGl0IFx1MjAxNFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWZmIHByb3NlIGFuIGFnZW50IHdyaXRlcyB3aGlsZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUktJTkcgYSBjYXNlLCB3aGljaCBpcyB3aHkgaXQgZGlkIG5vdFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWUgYmFjayB0byB0aGlzIGZvcm0uIFRoZSBndWVzdFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaCBvZiBgY2FzZS5ob29rLnRzYCBudWxscyB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gb24gYW5vbnltb3VzIGludGFrZSwgc28gYW5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRha2Ugc3VyZmFjZSBmb3IgaXQgd291bGQgYmUgYVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UgZm9yIGEgdmFsdWUgdGhlIGFwcCBkaXNjYXJkcy5cbiAgICpcbiAgICogICBjdXN0b21lcl9yYXRpbmcsICAgICAgICAgICAgICAgICBSRVRJUkVEIHVuZGVyIEFEUi0wMDQ5IGVuZm9yY2Utb3ItcmVtb3ZlXG4gICAqICAgY3VzdG9tZXJfZmVlZGJhY2sgICAgICAgICAgICAgICAgKG1haW50YWluZXIgcnVsaW5nLCBkZWNpc2lvbiBiYXRjaCAjMjEsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAyNi0wOS0wMykuIE5laXRoZXIgY29sdW1uIGV4aXN0cyBvblxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBjcm1fY2FzZWAgYW55IG1vcmUsIHNvIHRoZXJlIGlzIG5vdGhpbmdcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXJlIHRvIG9taXQgYW5kIG5vdGhpbmcgYW55d2hlcmUgdG9cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3IuXG4gICAqXG4gICAqIFx1MjZENCBEbyBub3QgcmUtaW50cm9kdWNlIGVpdGhlciBmaWVsZCwgaGVyZSBvciBlbHNld2hlcmUuIFRoZSBydWxpbmcgd2FzIG5vdFxuICAgKiBcIm5vIHJvb20gb24gdGhpcyBmb3JtXCI6IGEgc2F0aXNmYWN0aW9uIHNjb3JlIHR5cGVkIGJ5IHRoZSBwZXJzb24gYmVpbmdcbiAgICogc2NvcmVkIGlzIG5vdCB0aGUgc2FtZSBmYWN0IGFzIG9uZSB0aGUgY3VzdG9tZXIgZ2F2ZSwgYW5kIG5laXRoZXIgZmllbGQgd2FzXG4gICAqIG5hbWVkIGluIEFOWSBwcm9maWxlJ3MgYGZpZWxkc2AgbWFwIFx1MjAxNCB3aGljaCBvbiB0aGlzIHBsYXRmb3JtIG1lYW5zXG4gICAqIHVucmVzdHJpY3RlZCwgbm90IHJlc3RyaWN0ZWQuIGBjYXNlX2NzYXRfZm9sbG93dXBgLCB3aG9zZSBvbmx5IHB1cnBvc2Ugd2FzXG4gICAqIHRvIG5vdGlmeSB0aGUgY2FzZSBvd25lciB0byBsb2cgYSByYXRpbmcsIHdhcyByZXRpcmVkIGluIHRoZSBzYW1lIGNoYW5nZS5cbiAgICogQSBjdXN0b21lci1hbnN3ZXJlZCBzdXJ2ZXkgaXMgYSBmZWF0dXJlIGFuZCB3b3VsZCBhcnJpdmUgYXMgaXRzIG93biBjYXJkLFxuICAgKiBub3QgYXMgdHdvIGlucHV0cyBhZGRlZCBiYWNrIGhlcmUuXG4gICAqXG4gICAqIGB0eXBlOiAnc2ltcGxlJ2AsIG5vdCBgJ3RhYmJlZCdgOiBvbmUgc2VjdGlvbiBpcyBub3QgYSB0YWIgc3RyaXAuXG4gICAqL1xuICBmb3JtOiB7XG4gICAgdHlwZTogJ3NpbXBsZScsXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2Nhc2UnLFxuICAgICAgICBsYWJlbDogJ0Nhc2UnLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAnY2FzZV9udW1iZXInLFxuICAgICAgICAgIHsgZmllbGQ6ICdzdWJqZWN0JywgcmVxdWlyZWQ6IHRydWUsIHNwYW46ICdmdWxsJyB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdjcm1fYWNjb3VudCcsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgICAgJ2NybV9jb250YWN0JyxcbiAgICAgICAgICB7IGZpZWxkOiAnc3RhdHVzJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICAncHJpb3JpdHknLFxuICAgICAgICAgICdvcmlnaW4nLFxuICAgICAgICAgICdvd25lcl9pZCcsXG4gICAgICAgICAgLy8gUmVxdWlyZWQgb24gdGhlIG9iamVjdCB3aXRoIG5vIGRlZmF1bHQgXHUyMDE0IGEgZm9ybSB3aXRob3V0IGl0IGNvdWxkXG4gICAgICAgICAgLy8gbmV2ZXIgc2F2ZSBhIG5ldyBjYXNlLlxuICAgICAgICAgIHsgZmllbGQ6ICdkZXNjcmlwdGlvbicsIHJlcXVpcmVkOiB0cnVlLCBzcGFuOiAnZnVsbCcgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBuYW1lZCBmb3JtIHZpZXdzLlxuICAgKlxuICAgKiBgd2ViX3RvX2Nhc2VgIGlzIGEgUFVCTElDIC8gQU5PTllNT1VTIHN1cHBvcnQgZm9ybSAoU2FsZXNmb3JjZVxuICAgKiBXZWItdG8tQ2FzZSBlcXVpdmFsZW50KS4gSG9zdGVkIGF0IGAvZm9ybXMvc3VwcG9ydGAgYW5kIGVtYmVkZGFibGUgaW5cbiAgICogYSBoZWxwIGNlbnRlci4gR3Vlc3RzIGNhbiBPTkxZIHN1Ym1pdCBcdTIwMTQgdGhlIGBndWVzdF9wb3J0YWxgIHByb2ZpbGVcbiAgICogZGVuaWVzIHJlYWQvZWRpdC9kZWxldGUgb24gYGNybV9jYXNlYC4gSW50ZXJuYWwgZmllbGRzIChzdGF0dXMsIG9yaWdpbixcbiAgICogb3duZXJfaWQsIFNMQSkgYXJlIHN0YW1wZWQgYnkgYGNhc2UuaG9vay50c2AgYWZ0ZXIgYSBndWVzdCBzdWJtaXNzaW9uLlxuICAgKiBgcHJpb3JpdHlgIGlzIE5PVCBvbmUgb2YgdGhlbTogdGhpcyBmb3JtIGFza3MgdGhlIGd1ZXN0IGZvciBpdCwgYW5kIGFuXG4gICAqIHVuc2V0IG9uZSBpcyBmaWxsZWQgYnkgdGhlIGBsb3dgIG9wdGlvbiBgY3JtX2Nhc2UucHJpb3JpdHlgIGRlY2xhcmVzXG4gICAqIGBkZWZhdWx0OiB0cnVlYC4gRmllbGQgZGVmYXVsdHMgYXJlIGFwcGxpZWQgYmVmb3JlIGBiZWZvcmVJbnNlcnRgLCBzbyB0aGVcbiAgICogaG9vayBvbmx5IGV2ZXIgcmVhZHMgYHByaW9yaXR5YCAodG8gZGVyaXZlIGBwcmlvcml0eV9yYW5rYCkuXG4gICAqL1xuICBmb3JtVmlld3M6IHtcbiAgICB3ZWJfdG9fY2FzZToge1xuICAgICAgdHlwZTogJ3NpbXBsZScsXG4gICAgICBkYXRhLFxuICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdob3dfY2FuX3dlX2hlbHAnLFxuICAgICAgICAgIGxhYmVsOiAnSG93IGNhbiB3ZSBoZWxwPycsXG4gICAgICAgICAgY29sdW1uczogMSxcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdzdWJqZWN0JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnU2hvcnQgc3VtbWFyeSBvZiB0aGUgaXNzdWUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ1N0ZXBzIHRvIHJlcHJvZHVjZSwgZXJyb3IgbWVzc2FnZXMsIHNjcmVlbnNob3RzLi4uJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAndHlwZScsXG4gICAgICAgICAgICAgIGhlbHBUZXh0OiAnUGljayB0aGUgb3B0aW9uIHRoYXQgYmVzdCBtYXRjaGVzIHlvdXIgaXNzdWUuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAncHJpb3JpdHknLFxuICAgICAgICAgICAgICBoZWxwVGV4dDogJ0NyaXRpY2FsIGlzc3VlcyBzaG91bGQgYWxzbyBiZSByZXBvcnRlZCB2aWEgcGhvbmUuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBzaGFyaW5nOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGFsbG93QW5vbnltb3VzOiB0cnVlLFxuICAgICAgICBwdWJsaWNMaW5rOiAnL2Zvcm1zL3N1cHBvcnQnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3ZpZXdzL2tub3dsZWRnZV9hcnRpY2xlLnZpZXcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS92aWV3c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL3ZpZXdzL2tub3dsZWRnZV9hcnRpY2xlLnZpZXcudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZVZpZXcgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogS25vd2xlZGdlIEFydGljbGUgVmlld3NcbiAqXG4gKiAgIFx1MjAyMiBncmlkICAgICAgXHUyMDE0IGFnZW50LWZhY2luZyBhcnRpY2xlIHF1ZXVlIChzdGF0dXMgLyBjYXRlZ29yeSAvIGF1ZGllbmNlKVxuICogICBcdTIwMjIgcHVibGlzaGVkIFx1MjAxNCBwdWJsaWMgYXJ0aWNsZXMgb25seVxuICogICBcdTIwMjIgbXkgZHJhZnRzIFx1MjAxNCB0aGUgYXV0aG9yJ3Mgb3duIGRyYWZ0cyBhbmQgaW4tcmV2aWV3IGFydGljbGVzXG4gKlxuICogQSBmb3VydGggdGFiLCBgc3RhbGVfYXJ0aWNsZXNgICgnUmV2aWV3IFF1ZXVlIFx1MDBCNyBPbGRlc3QgRmlyc3QnKSwgc2hpcHBlZCBoZXJlXG4gKiB1bnRpbCAjNzgxIGFuZCBpcyBkZWxpYmVyYXRlbHkgYWJzZW50OiB0aGUgbWFpbnRhaW5lciBydWxlZCB0aGUga25vd2xlZGdlXG4gKiByZXZpZXcgcXVldWUgb3V0IG9mIHRoZSBwcm9kdWN0IHJhdGhlciB0aGFuIHNldHRsaW5nIHdoZXRoZXIgaXQgc2hvdWxkIGhhdmVcbiAqIGJlY29tZSBhIHJlYWwgMTgwLWRheSBjdXQuIFx1MjZENCBEbyBub3QgcmVpbnN0YXRlIGl0IGFzIGEgcmFua2luZyBlaXRoZXIgXHUyMDE0IHRoZVxuICogcnVsaW5nIHJlbW92ZWQgdGhlIEZFQVRVUkUsIG5vdCBqdXN0IHRoZSB3aW5kb3cgcXVlc3Rpb24uXG4gKlxuICogYGxhc3RfcmV2aWV3ZWRfYXRgIGlzIHVudG91Y2hlZCBieSB0aGF0IHJlbW92YWwgYW5kIHN0YXlzIGEgZGF0YS1sYXllclxuICogZmllbGQ6IHRoZSBwdWJsaXNoIGhvb2sgc3RpbGwgc3RhbXBzIGl0LCBhbmQgdGhlIEVuZ2FnZW1lbnQgZm9ybSBzZWN0aW9uXG4gKiBiZWxvdyBzdGlsbCBzaG93cyBpdC4gV2hldGhlciB0aGUgZmllbGQgaXRzZWxmIHNob3VsZCByZXRpcmUgaXMgYSBzZXBhcmF0ZVxuICogcXVlc3Rpb24gYW5kIGlzIG5vdCBhbnN3ZXJlZCBoZXJlLlxuICovXG5leHBvcnQgY29uc3QgS25vd2xlZGdlQXJ0aWNsZVZpZXdzID0gZGVmaW5lVmlldyh7XG4gIGxpc3Q6IHtcbiAgICB0eXBlOiAnZ3JpZCcsXG4gICAgbmFtZTogJ2FsbF9hcnRpY2xlcycsXG4gICAgbGFiZWw6ICdBbGwgQXJ0aWNsZXMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2tub3dsZWRnZV9hcnRpY2xlJyB9LFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICdhcnRpY2xlX251bWJlcicsIHdpZHRoOiAxMjAsIGxpbms6IHRydWUsIHBpbm5lZDogJ2xlZnQnLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ3RpdGxlJywgICAgICAgICAgd2lkdGg6IDMyMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdjYXRlZ29yeScsICAgICAgIHdpZHRoOiAxNjAgfSxcbiAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCAgICAgICAgIHdpZHRoOiAxMzAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAnYXVkaWVuY2UnLCAgICAgICB3aWR0aDogMTEwIH0sXG4gICAgICB7IGZpZWxkOiAnbGFuZ3VhZ2UnLCAgICAgICB3aWR0aDogMTEwIH0sXG4gICAgICB7IGZpZWxkOiAnb3duZXJfaWQnLCAgICAgICAgICB3aWR0aDogMTUwIH0sXG4gICAgICB7IGZpZWxkOiAncHVibGlzaGVkX2F0JywgICB3aWR0aDogMTYwLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ2hlbHBmdWxfY291bnQnLCAgd2lkdGg6IDExMCwgYWxpZ246ICdyaWdodCcsIHN1bW1hcnk6ICdzdW0nIH0sXG4gICAgXSxcbiAgICBzb3J0OiBbeyBmaWVsZDogJ3B1Ymxpc2hlZF9hdCcsIG9yZGVyOiAnZGVzYycgfV0sXG4gICAgZ3JvdXBpbmc6IHsgZmllbGRzOiBbeyBmaWVsZDogJ2NhdGVnb3J5Jywgb3JkZXI6ICdhc2MnIH1dIH0sXG4gICAgc2VsZWN0aW9uOiB7IHR5cGU6ICdtdWx0aXBsZScgfSxcbiAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiA1MCB9LFxuICAgIHJvd0NvbG9yOiB7XG4gICAgICBmaWVsZDogJ3N0YXR1cycsXG4gICAgICBjb2xvcnM6IHsgZHJhZnQ6ICdzbGF0ZScsIGluX3JldmlldzogJ2FtYmVyJywgcHVibGlzaGVkOiAnZW1lcmFsZCcsIGFyY2hpdmVkOiAnZ3JheScgfSxcbiAgICB9LFxuICAgIGFwcGVhcmFuY2U6IHtcbiAgICAgIHNob3dEZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGFsbG93ZWRWaXN1YWxpemF0aW9uczogWydncmlkJywgJ2thbmJhbiddLFxuICAgIH0sXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgcHVibGlzaGVkX2FydGljbGVzOiB7XG4gICAgICBuYW1lOiAncHVibGlzaGVkX2FydGljbGVzJyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnUHVibGlzaGVkJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fa25vd2xlZGdlX2FydGljbGUnIH0sXG4gICAgICBjb2x1bW5zOiBbJ2FydGljbGVfbnVtYmVyJywgJ3RpdGxlJywgJ2NhdGVnb3J5JywgJ2F1ZGllbmNlJywgJ2hlbHBmdWxfY291bnQnLCAnbm90X2hlbHBmdWxfY291bnQnLCAncHVibGlzaGVkX2F0J10sXG4gICAgICBmaWx0ZXI6IFt7IGZpZWxkOiAnc3RhdHVzJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ3B1Ymxpc2hlZCcgfV0sXG4gICAgICBzb3J0OiBbeyBmaWVsZDogJ2hlbHBmdWxfY291bnQnLCBvcmRlcjogJ2Rlc2MnIH1dLFxuICAgIH0sXG4gICAgbXlfZHJhZnRzOiB7XG4gICAgICBuYW1lOiAnbXlfZHJhZnRzJyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnTXkgRHJhZnRzJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fa25vd2xlZGdlX2FydGljbGUnIH0sXG4gICAgICBjb2x1bW5zOiBbJ2FydGljbGVfbnVtYmVyJywgJ3RpdGxlJywgJ2NhdGVnb3J5JywgJ3N0YXR1cycsICd1cGRhdGVkX2F0J10sXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgeyBmaWVsZDogJ3N0YXR1cycsIG9wZXJhdG9yOiAnaW4nLCAgICAgdmFsdWU6IFsnZHJhZnQnLCAnaW5fcmV2aWV3J10gfSxcbiAgICAgICAgLy8gYHtjdXJyZW50X3VzZXJfaWR9YCBpcyB0aGUgb25seSB1c2VyIHRva2VuIHRoZSB2aWV3IHJ1bnRpbWUgcmVzb2x2ZXMuXG4gICAgICAgIHsgZmllbGQ6ICdvd25lcl9pZCcsICBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiAne2N1cnJlbnRfdXNlcl9pZH0nIH0sXG4gICAgICBdLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICd1cGRhdGVkX2F0Jywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICB9LFxuICB9LFxuXG4gIGZvcm06IHtcbiAgICB0eXBlOiAnc2ltcGxlJyxcbiAgICBzZWN0aW9uczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnYXJ0aWNsZScsXG4gICAgICAgIGxhYmVsOiAnQXJ0aWNsZScsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICdhcnRpY2xlX251bWJlcicsXG4gICAgICAgICAgeyBmaWVsZDogJ3RpdGxlJywgcmVxdWlyZWQ6IHRydWUsIHNwYW46ICdmdWxsJyB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdzdW1tYXJ5Jywgc3BhbjogJ2Z1bGwnIH0sXG4gICAgICAgICAgJ2NhdGVnb3J5JyxcbiAgICAgICAgICAndGFncycsXG4gICAgICAgICAgJ3N0YXR1cycsXG4gICAgICAgICAgJ2F1ZGllbmNlJyxcbiAgICAgICAgICAnbGFuZ3VhZ2UnLFxuICAgICAgICAgICdvd25lcl9pZCcsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnY29udGVudCcsXG4gICAgICAgIGxhYmVsOiAnQ29udGVudCcsXG4gICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgIGZpZWxkczogWydib2R5J10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBgbmFtZWAgYWxvbmdzaWRlIGBsYWJlbGAgKCMxMTAwKTogYSBmb3JtIHNlY3Rpb24gZGVjbGFyaW5nIG9ubHkgYVxuICAgICAgICAvLyBsYWJlbCByZW5kZXJzIGl0cyBFTkdMSVNIIGxhYmVsIHVuZGVyIGV2ZXJ5IGxvY2FsZSwgYW5kIG5laXRoZXIgdGhlXG4gICAgICAgIC8vIGV4aXN0aW5nIGkxOG4gdGVzdHMgbm9yIHRoZSBgaTE4bi9taXNzaW5nLSpgIGdhdGUgY2FuIHNlZSBpdCBcdTIwMTQgdGhlXG4gICAgICAgIC8vIGhlYWRpbmcgaGFzIG5vIGtleSBmb3IgYSB0cmFuc2xhdG9yIHRvIG1pc3MuIFRoaXMgc2VjdGlvbiBpcyBuYW1lZFxuICAgICAgICAvLyBiZWNhdXNlIHRoaXMgY2hhbmdlIGVkaXRzIGl0IChgdmlld19jb3VudGAgd2FzIHJlbW92ZWQgZnJvbSBpdCwgIzYwMSk7XG4gICAgICAgIC8vIHRoZSBhcHAtd2lkZSBzd2VlcCBvZiB0aGUgb3RoZXIgaGVhZGluZ3MgaXMgIzExMDAncyBqb2IsIGhlbGQgYmVoaW5kXG4gICAgICAgIC8vIHRoaXMgY2FyZCBwcmVjaXNlbHkgc28gdGhlIHR3byBkbyBub3QgY29sbGlkZSBpbiB0aGUgbG9jYWxlIHBhY2tzLlxuICAgICAgICBuYW1lOiAnZW5nYWdlbWVudCcsXG4gICAgICAgIGxhYmVsOiAnRW5nYWdlbWVudCcsXG4gICAgICAgIGNvbHVtbnM6IDMsXG4gICAgICAgIGZpZWxkczogWydoZWxwZnVsX2NvdW50JywgJ25vdF9oZWxwZnVsX2NvdW50JywgJ3B1Ymxpc2hlZF9hdCcsICdsYXN0X3Jldmlld2VkX2F0JywgJ3JlbGF0ZWRfdG9fY2FzZSddLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHMvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBSZXZlbnVlIG9iamVjdCBiYXJyZWwuXG4gKlxuICogUmUtZXhwb3J0cyB0aGlzIHBhY2thZ2UncyAqLm9iamVjdC50cyBkZWZpbml0aW9uczsgdGhlIGAqLmhvb2sudHNgIGZpbGVzXG4gKiBiZXNpZGUgdGhlbSByZWdpc3RlciB0aHJvdWdoIGAuL2hvb2tzLnRzYC4gVGhlIGNhbm9uaWNhbCBub3RlIG9uIHRoZVxuICogY29sbGFib3JhdGlvbiBjYXBhYmlsaXRpZXMgKGBlbmFibGUuZmlsZXNgLCBgZW5hYmxlLmZlZWRzYCkgdGhhdCBldmVyeVxuICogb2JqZWN0IGluIHRoaXMgYXBwIHBvaW50cyBhdCBpcyB3cml0dGVuIG9uY2UsIGluXG4gKiBgc3JjL3NhbGVzL29iamVjdHMvaW5kZXgudHNgLlxuICovXG5cbmV4cG9ydCB7IENvbnRyYWN0IH0gZnJvbSAnLi9jb250cmFjdC5vYmplY3QnO1xuZXhwb3J0IHsgT3Bwb3J0dW5pdHlMaW5lSXRlbSB9IGZyb20gJy4vb3Bwb3J0dW5pdHlfbGluZV9pdGVtLm9iamVjdCc7XG5leHBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi9wcm9kdWN0Lm9iamVjdCc7XG5leHBvcnQgeyBRdW90ZSB9IGZyb20gJy4vcXVvdGUub2JqZWN0JztcbmV4cG9ydCB7IFF1b3RlTGluZUl0ZW0gfSBmcm9tICcuL3F1b3RlX2xpbmVfaXRlbS5vYmplY3QnO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL2NvbnRyYWN0Lm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL2NvbnRyYWN0Lm9iamVjdC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgT2JqZWN0U2NoZW1hLCBGaWVsZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgUCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB7IFBBWU1FTlRfVEVSTVNfT1BUSU9OUyB9IGZyb20gJy4uLy4uL3NhbGVzL29iamVjdHMvX3BpY2tsaXN0cyc7XG5cbi8qKlxuICogQ29udHJhY3QgT2JqZWN0XG4gKiBSZXByZXNlbnRzIGxlZ2FsIGNvbnRyYWN0cyB3aXRoIGN1c3RvbWVyc1xuICovXG5leHBvcnQgY29uc3QgQ29udHJhY3QgPSBPYmplY3RTY2hlbWEuY3JlYXRlKHtcbiAgbmFtZTogJ2NybV9jb250cmFjdCcsXG4gIGxhYmVsOiAnQ29udHJhY3QnLFxuICBwbHVyYWxMYWJlbDogJ0NvbnRyYWN0cycsXG4gIGljb246ICdmaWxlLXBlbi1saW5lJyxcbiAgZGVzY3JpcHRpb246ICdMZWdhbCBjb250cmFjdHMgYW5kIGFncmVlbWVudHMnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIE1hc3Rlci1kZXRhaWwgY2hpbGQgb2ZcbiAgLy8gY3JtX2FjY291bnQgXHUyMDE0IGEgY29udHJhY3QgSVMgYWNjb3VudCBkYXRhOiByZWFjaGFibGUgYnkgd2hvZXZlciBjYW4gcmVhY2hcbiAgLy8gdGhlIGFjY291bnQsIGVkaXRhYmxlIGJ5IHdob2V2ZXIgY2FuIGVkaXQgaXQgKCM1NDksIHJ1bGluZyAyMDI2LTA4LTMxKS5cbiAgc2hhcmluZ01vZGVsOiAnY29udHJvbGxlZF9ieV9wYXJlbnQnLFxuICAvLyBBRFItMDA3OTogcmVuZGVyLW9ubHkgYHRpdGxlRm9ybWF0YCByZXRpcmVkIGluIGZhdm9yIG9mIGBuYW1lRmllbGRgLlxuICAvLyBPcmlnaW5hbCB0ZW1wbGF0ZSB3YXMgJ3tjb250cmFjdF9udW1iZXJ9IC0ge2NybV9hY2NvdW50Lm5hbWV9Jy4gVGhlXG4gIC8vIGBjcm1fYWNjb3VudC5uYW1lYCBzZWdtZW50IGlzIGEgbG9va3VwIERPVC1XQUxLLCB3aGljaCBhIGZvcm11bGEgZmllbGRcbiAgLy8gY2Fubm90IHJlZmVyZW5jZSAoQURSLTAwNzIpLCBzbyBpdCBpcyBEUk9QUEVELiBPbmx5IHRoZSBsb2NhbFxuICAvLyBgY29udHJhY3RfbnVtYmVyYCAoYXV0b251bWJlcikgcmVtYWlucywgc28gbm8gZm9ybXVsYSBpcyBuZWVkZWQgXHUyMDE0IHBvaW50XG4gIC8vIGBuYW1lRmllbGRgIHN0cmFpZ2h0IGF0IGl0LlxuICBuYW1lRmllbGQ6ICdjb250cmFjdF9udW1iZXInLFxuICBoaWdobGlnaHRGaWVsZHM6IFsnY29udHJhY3RfbnVtYmVyJywgJ2NybV9hY2NvdW50JywgJ3N0YXR1cycsICdzdGFydF9kYXRlJywgJ2VuZF9kYXRlJ10sXG5cbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2Jhc2ljJywgICAgIGxhYmVsOiAnQ29udHJhY3QgSW5mb3JtYXRpb24nLCBpY29uOiAnaW5mbycgfSxcbiAgICB7IGtleTogJ3BhcnRpZXMnLCAgIGxhYmVsOiAnUGFydGllcycsICAgICAgICAgICAgICBpY29uOiAndXNlcnMnIH0sXG4gICAgeyBrZXk6ICd0ZXJtcycsICAgICBsYWJlbDogJ1Rlcm1zICYgRGF0ZXMnLCAgICAgICAgaWNvbjogJ2NhbGVuZGFyJyB9LFxuICAgIHsga2V5OiAndmFsdWUnLCAgICAgbGFiZWw6ICdDb250cmFjdCBWYWx1ZScsICAgICAgIGljb246ICdkb2xsYXItc2lnbicgfSxcbiAgICB7IGtleTogJ3N0YXR1cycsICAgIGxhYmVsOiAnU3RhdHVzICYgQXBwcm92YWwnLCAgICBpY29uOiAnY2hlY2stY2lyY2xlJyB9LFxuICAgIHsga2V5OiAncmVuZXdhbCcsICAgbGFiZWw6ICdSZW5ld2FsJywgICAgICAgICAgICAgIGljb246ICdyZWZyZXNoLWNjdycsIGNvbGxhcHNlOiAnY29sbGFwc2VkJyB9LFxuICBdLFxuXG4gIGZpZWxkczoge1xuICAgIC8vIFBsYXRmb3JtIG93bmVyc2hpcCBhbmNob3IgXHUyMDE0IGNhbm9uaWNhbCBub3RlIGluIGBhY2NvdW50Lm9iamVjdC50c2AgKCM1NDgpLlxuICAgIG93bmVyX2lkOiBGaWVsZC5sb29rdXAoJ3N5c191c2VyJywge1xuICAgICAgbGFiZWw6ICdDb250cmFjdCBPd25lcicsXG4gICAgICBncm91cDogJ3BhcnRpZXMnLFxuICAgICAgc3lzdGVtOiB0cnVlLFxuICAgICAgcmVhZG9ubHk6IGZhbHNlLFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgLy8gQXV0b051bWJlciBmaWVsZFxuICAgIGNvbnRyYWN0X251bWJlcjogRmllbGQuYXV0b251bWJlcih7XG4gICAgICBsYWJlbDogJ0NvbnRyYWN0IE51bWJlcicsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGZvcm1hdDogJ0NUUi17MDAwMH0nLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFJlbGF0aW9uc2hpcHMgXHUyMDE0IHRoZSBtYXN0ZXIgdGhlIE9XRCBkZXJpdmVzIGZyb20uIEF1dGhvcmVkIGFzXG4gICAgLy8gbWFzdGVyLWRldGFpbCBzbyB0aGUgbWFzdGVyIGlzIG5vdCBkZWNpZGVkIGJ5IGRlY2xhcmF0aW9uIG9yZGVyIGFnYWluc3RcbiAgICAvLyB0aGUgcmVxdWlyZWQgYGNybV9jb250YWN0YCBsb29rdXAgYmVsb3cgKG9iamVjdHN0YWNrIzE0NzQ3KS5cbiAgICBjcm1fYWNjb3VudDogRmllbGQubWFzdGVyRGV0YWlsKCdjcm1fYWNjb3VudCcsIHtcbiAgICAgIGxhYmVsOiAnQWNjb3VudCcsXG4gICAgICBncm91cDogJ3BhcnRpZXMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZScsXG4gICAgfSksXG4gICAgXG4gICAgY3JtX2NvbnRhY3Q6IEZpZWxkLmxvb2t1cCgnY3JtX2NvbnRhY3QnLCB7XG4gICAgICBsYWJlbDogJ1ByaW1hcnkgQ29udGFjdCcsXG4gICAgICBncm91cDogJ3BhcnRpZXMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIC8vIEBvYmplY3RzdGFjayAxMjogc3RyaW5nW10gYHJlZmVyZW5jZUZpbHRlcnNgIGlzIGRlYWQgKG5vdCByZWFkIGJ5IHRoZVxuICAgICAgLy8gcGlja2VyKTsgYGRlcGVuZHNPbmAgaXMgdGhlIGxpdmUgY2FzY2FkaW5nLWxvb2t1cCBmb3JtIFx1MjAxNCBzY29wZXMgY29udGFjdHNcbiAgICAgIC8vIHRvIHRoZSBjb250cmFjdCdzIGBjcm1fYWNjb3VudGAgKEFEUi0wMDQ5KS5cbiAgICAgIGRlcGVuZHNPbjogWydjcm1fYWNjb3VudCddLFxuICAgIH0pLFxuXG4gICAgY3JtX29wcG9ydHVuaXR5OiBGaWVsZC5sb29rdXAoJ2NybV9vcHBvcnR1bml0eScsIHtcbiAgICAgIGxhYmVsOiAnUmVsYXRlZCBPcHBvcnR1bml0eScsXG4gICAgICBncm91cDogJ3BhcnRpZXMnLFxuICAgICAgLy8gU2NvcGUgb3Bwb3J0dW5pdGllcyB0byB0aGUgY29udHJhY3QncyBhY2NvdW50ICh3YXMgZGVhZCByZWZlcmVuY2VGaWx0ZXJzKS5cbiAgICAgIGRlcGVuZHNPbjogWydjcm1fYWNjb3VudCddLFxuICAgIH0pLFxuICAgIFxuXG4gICAgLy8gU3RhdHVzXG4gICAgc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgZ3JvdXA6ICdzdGF0dXMnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnRHJhZnQnLCB2YWx1ZTogJ2RyYWZ0JywgY29sb3I6ICcjOTk5OTk5JywgZGVmYXVsdDogdHJ1ZSB9LFxuICAgICAgICB7IGxhYmVsOiAnSW4gQXBwcm92YWwnLCB2YWx1ZTogJ2luX2FwcHJvdmFsJywgY29sb3I6ICcjRkZBNTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQWN0aXZhdGVkJywgdmFsdWU6ICdhY3RpdmF0ZWQnLCBjb2xvcjogJyMwMEFBMDAnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdFeHBpcmVkJywgdmFsdWU6ICdleHBpcmVkJywgY29sb3I6ICcjRkYwMDAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnVGVybWluYXRlZCcsIHZhbHVlOiAndGVybWluYXRlZCcsIGNvbG9yOiAnIzY2NjY2NicgfSxcbiAgICAgIF0sXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIENvbnRyYWN0IFRlcm1zXG4gICAgY29udHJhY3RfdGVybV9tb250aHM6IEZpZWxkLm51bWJlcih7XG4gICAgICBsYWJlbDogJ0NvbnRyYWN0IFRlcm0gKE1vbnRocyknLFxuICAgICAgZ3JvdXA6ICd0ZXJtcycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgbWluOiAxLFxuICAgIH0pLFxuICAgIFxuICAgIHN0YXJ0X2RhdGU6IEZpZWxkLmRhdGUoe1xuICAgICAgbGFiZWw6ICdTdGFydCBEYXRlJyxcbiAgICAgIGdyb3VwOiAndGVybXMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICB9KSxcbiAgICBcbiAgICBlbmRfZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBsYWJlbDogJ0VuZCBEYXRlJyxcbiAgICAgIGdyb3VwOiAndGVybXMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBGaW5hbmNpYWxcbiAgICBjb250cmFjdF92YWx1ZTogRmllbGQuY3VycmVuY3koeyBcbiAgICAgIGxhYmVsOiAnQ29udHJhY3QgVmFsdWUnLFxuICAgICAgZ3JvdXA6ICd2YWx1ZScsXG4gICAgICBtaW46IDAsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgIH0pLFxuICAgIFxuICAgIGJpbGxpbmdfZnJlcXVlbmN5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdCaWxsaW5nIEZyZXF1ZW5jeScsXG4gICAgICBncm91cDogJ3ZhbHVlJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ01vbnRobHknLCB2YWx1ZTogJ21vbnRobHknLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdRdWFydGVybHknLCB2YWx1ZTogJ3F1YXJ0ZXJseScgfSxcbiAgICAgICAgeyBsYWJlbDogJ0FubnVhbGx5JywgdmFsdWU6ICdhbm51YWxseScgfSxcbiAgICAgICAgeyBsYWJlbDogJ09uZS10aW1lJywgdmFsdWU6ICdvbmVfdGltZScgfSxcbiAgICAgIF1cbiAgICB9KSxcbiAgICBcbiAgICBwYXltZW50X3Rlcm1zOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdQYXltZW50IFRlcm1zJyxcbiAgICAgIGdyb3VwOiAndmFsdWUnLFxuICAgICAgLy8gQ2Fub25pY2FsIHNldCBzaGFyZWQgd2l0aCBRdW90ZTogYW4gYWNjZXB0ZWQgcXVvdGUncyB0ZXJtcyAoaW5jbC5cbiAgICAgIC8vIGR1ZV9vbl9yZWNlaXB0KSBtdXN0IHN1cnZpdmUgdGhlIGNvcHkgb250byB0aGUgY29udHJhY3QuIFRoYXQgY29weSBpc1xuICAgICAgLy8gYHF1b3RlX2FjY2VwdGVkX2NvbnRyYWN0X2RyYWZ0YCAoc3JjL3JldmVudWUvb2JqZWN0cy9xdW90ZS5ob29rLnRzKS4gVGhpcyBmaWVsZCdzIGBuZXRfMzBgXG4gICAgICAvLyBvcHRpb24gZGVmYXVsdCBhcHBsaWVzIG9ubHkgd2hlbiB0aGUgcXVvdGUgaXRzZWxmIGNhcnJpZWQgbm8gdGVybSxcbiAgICAgIC8vIHdoaWNoIGlzIHRoZSBpbnRlbmRlZCBmYWxsLXRocm91Z2gsIG5vdCBhIGdhcC5cbiAgICAgIG9wdGlvbnM6IFsuLi5QQVlNRU5UX1RFUk1TX09QVElPTlNdLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFJlbmV3YWxcbiAgICBhdXRvX3JlbmV3YWw6IEZpZWxkLmJvb2xlYW4oe1xuICAgICAgbGFiZWw6ICdBdXRvIFJlbmV3YWwnLFxuICAgICAgZ3JvdXA6ICdyZW5ld2FsJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgfSksXG4gICAgXG4gICAgcmVuZXdhbF9ub3RpY2VfZGF5czogRmllbGQubnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnUmVuZXdhbCBOb3RpY2UgKERheXMpJyxcbiAgICAgIGdyb3VwOiAncmVuZXdhbCcsXG4gICAgICBtaW46IDAsXG4gICAgICBkZWZhdWx0VmFsdWU6IDMwLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIExlZ2FsXG4gICAgY29udHJhY3RfdHlwZTogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnQ29udHJhY3QgVHlwZScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ1N1YnNjcmlwdGlvbicsIHZhbHVlOiAnc3Vic2NyaXB0aW9uJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU2VydmljZSBBZ3JlZW1lbnQnLCB2YWx1ZTogJ3NlcnZpY2UnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdMaWNlbnNlJywgdmFsdWU6ICdsaWNlbnNlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUGFydG5lcnNoaXAnLCB2YWx1ZTogJ3BhcnRuZXJzaGlwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnTkRBJywgdmFsdWU6ICduZGEnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdNU0EnLCB2YWx1ZTogJ21zYScgfSxcbiAgICAgIF1cbiAgICB9KSxcbiAgICBcbiAgICBzaWduZWRfZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBsYWJlbDogJ1NpZ25lZCBEYXRlJyxcbiAgICAgIGdyb3VwOiAnc3RhdHVzJyxcbiAgICB9KSxcbiAgICBcbiAgICBzaWduZWRfYnk6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdTaWduZWQgQnknLFxuICAgICAgZ3JvdXA6ICdzdGF0dXMnLFxuICAgICAgbWF4TGVuZ3RoOiAyNTUsXG4gICAgfSksXG4gICAgXG4gICAgZG9jdW1lbnRfdXJsOiBGaWVsZC51cmwoe1xuICAgICAgbGFiZWw6ICdDb250cmFjdCBEb2N1bWVudCcsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBUZXJtcyAmIENvbmRpdGlvbnNcbiAgICBzcGVjaWFsX3Rlcm1zOiBGaWVsZC5tYXJrZG93bih7XG4gICAgICBsYWJlbDogJ1NwZWNpYWwgVGVybXMnLFxuICAgICAgZ3JvdXA6ICd0ZXJtcycsXG4gICAgfSksXG4gICAgXG4gICAgZGVzY3JpcHRpb246IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGxhYmVsOiAnRGVzY3JpcHRpb24nLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG4gICAgXG4gICAgLy8gQmlsbGluZyBBZGRyZXNzXG4gICAgYmlsbGluZ19hZGRyZXNzOiBGaWVsZC5hZGRyZXNzKHtcbiAgICAgIGxhYmVsOiAnQmlsbGluZyBBZGRyZXNzJyxcbiAgICAgIGdyb3VwOiAndmFsdWUnLFxuICAgIH0pLFxuICB9LFxuICBcbiAgLy8gRGF0YWJhc2UgaW5kZXhlc1xuICBpbmRleGVzOiBbXG4gICAgeyBmaWVsZHM6IFsnY3JtX2FjY291bnQnXSB9LFxuICAgIHsgZmllbGRzOiBbJ3N0YXR1cyddIH0sXG4gICAgeyBmaWVsZHM6IFsnc3RhcnRfZGF0ZSddIH0sXG4gICAgeyBmaWVsZHM6IFsnZW5kX2RhdGUnXSB9LFxuICAgIHsgZmllbGRzOiBbJ293bmVyX2lkJ10gfSxcbiAgXSxcbiAgXG4gIC8vIEVuYWJsZSBhZHZhbmNlZCBmZWF0dXJlc1xuICAvLyBBUEkgc3VyZmFjZS4gSGlzdG9yeSBcdTIxOTIgRmllbGQudHJhY2tIaXN0b3J5IChBRFItMDA1MikuXG4gIGVuYWJsZToge1xuICAgIGFwaUVuYWJsZWQ6IHRydWUsXG4gICAgYXBpTWV0aG9kczogWydnZXQnLCAnbGlzdCcsICdjcmVhdGUnLCAndXBkYXRlJywgJ2RlbGV0ZSddLFxuICAgIC8vICM2MDIgXHUyMDE0IHRoZSBleGVjdXRlZCBjb250cmFjdCBpdHNlbGYuIGBkb2N1bWVudF91cmxgIHJlbWFpbnMgdGhlIHBvaW50ZXJcbiAgICAvLyB0byBhbiBleHRlcm5hbCBETVMgY29weTsgdGhpcyBpcyB3aGVyZSB0aGUgZmlsZSBhY3R1YWxseSBsaXZlcy5cbiAgICAvLyBTZWUgdGhlIGNhbm9uaWNhbCBjYXBhYmlsaXR5IG5vdGUgaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYC5cbiAgICBmaWxlczogdHJ1ZSxcbiAgfSxcbiAgXG4gIC8vIFZhbGlkYXRpb24gUnVsZXNcbiAgLy9cbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnZW5kX2FmdGVyX3N0YXJ0JyxcbiAgICAgIHR5cGU6ICdzY3JpcHQnLFxuICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICBtZXNzYWdlOiAnRW5kIERhdGUgbXVzdCBiZSBhZnRlciBTdGFydCBEYXRlJyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmVuZF9kYXRlKSAmJiByZWNvcmQuZW5kX2RhdGUgIT0gbnVsbCAmJiBoYXMocmVjb3JkLnN0YXJ0X2RhdGUpICYmIHJlY29yZC5zdGFydF9kYXRlICE9IG51bGwgJiYgcmVjb3JkLmVuZF9kYXRlIDw9IHJlY29yZC5zdGFydF9kYXRlYCxcbiAgICB9LFxuICAgIC8vIE5PVEU6IHRoZSBgdmFsaWRfY29udHJhY3RfdGVybWAgd2FybmluZyAobW9udGhzLWJldHdlZW4gdGVybSBjaGVjaykgd2FzXG4gICAgLy8gZHJvcHBlZCBpbiB0aGUgOS44LjAgdXBncmFkZSBcdTIwMTQgaXRzIENFTCBwcmVkaWNhdGUgdXNlZCBgbW9udGhzQmV0d2VlbigpYCxcbiAgICAvLyB3aGljaCA5LjguMCdzIGFsaWduZWQgQ0VMIHN0ZGxpYiAoQURSLTAwMzIpIG5vIGxvbmdlciBwcm92aWRlcy4gSXQgd2FzIGFcbiAgICAvLyBub24tYmxvY2tpbmcgd2FybmluZzsgdGhlIGhhcmQgZW5kLWRhdGU+c3RhcnQtZGF0ZSBydWxlIGFib3ZlIHJlbWFpbnMuXG4gICAge1xuICAgICAgLy8gIzU3NSBCNC4gTGlrZSBgY3JtX3F1b3RlYCwgdGhpcyBvYmplY3Qgc2hpcHBlZCBhIGxpZmVjeWNsZSB2b2NhYnVsYXJ5XG4gICAgICAvLyB3aXRoIG5vIHRyYW5zaXRpb24gY29uc3RyYWludCBhbmQgbm8gc3RhdHVzIGd1YXJkIGluIGBjb250cmFjdC5ob29rLnRzYFxuICAgICAgLy8gXHUyMDE0IHNvIGBkcmFmdCBcdTIxOTIgYWN0aXZhdGVkYCB3YXMgYSBsZWdhbCBtb3ZlLCBhY3RpdmF0aW5nIGFuIGFncmVlbWVudCB0aGF0XG4gICAgICAvLyBuZXZlciBwYXNzZWQgYXBwcm92YWwuIEFjdGl2YXRpb24gaXMgdGhlIGNvbnNlcXVlbnRpYWwgZWRnZSBoZXJlOlxuICAgICAgLy8gYGNvbnRyYWN0X29uX2FjdGl2YXRpb25gIHN0YW1wcyBgc2lnbmVkX2RhdGVgLCBwcm9tb3RlcyB0aGUgYWNjb3VudCB0b1xuICAgICAgLy8gYGN1c3RvbWVyYCwgYW5kIHRoZSByZW5ld2FsIGZsb3cgc3RhcnRzIGNvdW50aW5nIGZyb20gaXQuXG4gICAgICBuYW1lOiAnY29udHJhY3Rfc3RhdHVzX3Byb2dyZXNzaW9uJyxcbiAgICAgIHR5cGU6ICdzdGF0ZV9tYWNoaW5lJyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiAnSW52YWxpZCBjb250cmFjdCBzdGF0dXMgdHJhbnNpdGlvbicsXG4gICAgICBmaWVsZDogJ3N0YXR1cycsXG4gICAgICB0cmFuc2l0aW9uczoge1xuICAgICAgICBkcmFmdDogWydpbl9hcHByb3ZhbCcsICd0ZXJtaW5hdGVkJ10sXG4gICAgICAgIC8vIEFwcHJvdmFsIGVpdGhlciBsYW5kcyAoYGFjdGl2YXRlZGApIG9yIHNlbmRzIHRoZSBwYXBlcndvcmsgYmFjay5cbiAgICAgICAgaW5fYXBwcm92YWw6IFsnZHJhZnQnLCAnYWN0aXZhdGVkJywgJ3Rlcm1pbmF0ZWQnXSxcbiAgICAgICAgLy8gYFx1MjE5MiBleHBpcmVkYCBpcyB0aGUgY29udHJhY3RfZXhwaXJhdGlvbiBmbG93LCB3aG9zZSBvd24gc3dlZXAgZmlsdGVyXG4gICAgICAgIC8vIGlzIGBzdGF0dXM6ICdhY3RpdmF0ZWQnYCBcdTIwMTQgbm90aGluZyBlbHNlIGFnZXMgb3V0LlxuICAgICAgICBhY3RpdmF0ZWQ6IFsnZXhwaXJlZCcsICd0ZXJtaW5hdGVkJ10sXG4gICAgICAgIC8vIEJvdGggZW5kcyBhcmUgdGVybWluYWw6IGEgcmVuZXdhbCBpcyBhIE5FVyBjb250cmFjdCAodGhlXG4gICAgICAgIC8vIGNvbnRyYWN0X3JlbmV3YWwgZmxvdyBmaWxlcyBhIHRhc2ssIGl0IGRvZXMgbm90IHJldml2ZSB0aGUgb2xkIHJvdykuXG4gICAgICAgIGV4cGlyZWQ6IFtdLFxuICAgICAgICB0ZXJtaW5hdGVkOiBbXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgXSxcbiAgXG4gIC8vIFdvcmtmbG93IFJ1bGVzXG4gIC8vIFx1MjZBMFx1RkUwRiBObyBgd29ya2Zsb3dzW11gIGhlcmUsIGFuZCBub25lIGlzIHBvc3NpYmxlOiBvYmplY3QgYHdvcmtmbG93c1tdYCB3ZXJlXG4gIC8vIHJlbW92ZWQgZnJvbSB0aGUgcGxhdGZvcm0uIEZpZWxkIHVwZGF0ZXMgbGl2ZSBpbiB0aGlzIG9iamVjdCdzIGAqLmhvb2sudHNgO1xuICAvLyBzY2hlZHVsZWQgc3RhdHVzIGZsaXBzIGFuZCBub3RpZmljYXRpb25zIGxpdmUgaW4gYHNyYy8qL2Zsb3dzLyouZmxvdy50c2AuXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9vcHBvcnR1bml0eV9saW5lX2l0ZW0ub2JqZWN0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHMvb3Bwb3J0dW5pdHlfbGluZV9pdGVtLm9iamVjdC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgT2JqZWN0U2NoZW1hLCBGaWVsZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgRiwgUCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcblxuLyoqXG4gKiBPcHBvcnR1bml0eSBMaW5lIEl0ZW1cbiAqXG4gKiBJbmRpdmlkdWFsIHByb2R1Y3Qvc2VydmljZSBlbnRyeSBvbiBhbiBPcHBvcnR1bml0eS4gVG9nZXRoZXIsIGFsbCBsaW5lIGl0ZW1zXG4gKiByb2xsIHVwIHRvIHRoZSBPcHBvcnR1bml0eSBhbW91bnQuIFJlcXVpcmVkIGZvciBhbnkgcmVhbGlzdGljIHNhbGVzIHByb2Nlc3NcbiAqIHdoZXJlIHRoZSBkZWFsIHZhbHVlIGNvbWVzIGZyb20gYSBjb25maWd1cmVkIHNldCBvZiBwcm9kdWN0cyByYXRoZXIgdGhhblxuICogYSBzaW5nbGUgdHlwZWQtaW4gdG90YWwuXG4gKi9cbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eUxpbmVJdGVtID0gT2JqZWN0U2NoZW1hLmNyZWF0ZSh7XG4gIG5hbWU6ICdjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtJyxcbiAgbGFiZWw6ICdPcHBvcnR1bml0eSBMaW5lIEl0ZW0nLFxuICBwbHVyYWxMYWJlbDogJ09wcG9ydHVuaXR5IExpbmUgSXRlbXMnLFxuICBpY29uOiAncGFja2FnZScsXG4gIGRlc2NyaXB0aW9uOiAnQSBzaW5nbGUgcHJvZHVjdCBsaW5lIG9uIGFuIE9wcG9ydHVuaXR5JyxcblxuICAvLyBBRFItMDA5MCBEMS9ENzogT1dEIGlzIGFuIGF1dGhvcmVkIGRlY2lzaW9uLiBBIGxpbmUgaXRlbSBoYXMgbm8gbWVhbmluZ1xuICAvLyBhcGFydCBmcm9tIGl0cyBkZWFsLCBzbyBpdHMgcmVjb3JkIGFjY2VzcyBERVJJVkVTIGZyb20gdGhlIG9wcG9ydHVuaXR5XG4gIC8vIChBRFItMDA1NSksIGFuZCBhcyBvZiAxNy4wLjAtcmMuNCB0aGF0IGRlcml2YXRpb24gbWVhbnMgd2hhdCBpdCBzYXlzLlxuICAvL1xuICAvLyBcdTI2QTBcdUZFMEYgUmVhZHMgQVJFIGZpbHRlcmVkIHRvIGxpbmUgaXRlbXMgd2hvc2UgYGNybV9vcHBvcnR1bml0eWAgdGhlIGNhbGxlciBjYW5cbiAgLy8gcmVhZCwgYW5kIG1hc3RlciBhY2Nlc3NpYmlsaXR5IHJlc29sdmVzIHRocm91Z2ggdGhlIHNhbWUgcGF0aHMgYSBkaXJlY3RcbiAgLy8gcmVhZCBvZiB0aGUgb3Bwb3J0dW5pdHkgdGFrZXMgXHUyMDE0IG93bmVyc2hpcCBhbmQgYHN5c19yZWNvcmRfc2hhcmVgIGdyYW50c1xuICAvLyBpbmNsdWRlZCwgTk9UIHRoZSBtYXN0ZXIncyByb3ctbGV2ZWwgc2VjdXJpdHkgcG9saWNpZXMgYWxvbmUuIFNvIGEgcmVwXG4gIC8vIHJlYWRzIHRoZSBsaW5lcyBvZiB0aGUgZGVhbHMgaW4gdGhlaXIgb3duIGJvb2sgcGx1cyBhbnl0aGluZyBzaGFyZWQgdG9cbiAgLy8gdGhlbSwgYW5kIHRoZSBwcml2YXRlLWRlYWwgUkxTIGZpbHRlciBjYXJyaWVkIGJ5IHRoZSBgc2FsZXNfbWFuYWdlcmAgYW5kXG4gIC8vIGBtYXJrZXRpbmdfdXNlcmAgc2V0cyBuYXJyb3dzIG9uIHRvcCBvZiB0aGF0IHJhdGhlciB0aGFuIGJlaW5nIHRoZSBvbmx5XG4gIC8vIHRoaW5nIHRoYXQgbmFycm93cy4gVGhlIHBhcmVudC13cml0ZSBnYXRlIGRlcml2ZXMgdGhlIHNhbWUgd2F5OiBhIGxpbmVcbiAgLy8gd2hvc2Ugb3Bwb3J0dW5pdHkgdGhlIGNhbGxlciBjYW5ub3QgZWRpdCBpcyByZWZ1c2VkLlxuICAvL1xuICAvLyBgdGVzdC9wYXJlbnQtZGVyaXZlZC1yZWFjaC50ZXN0LnRzYCBwaW5zIHRoZSBuYXJyb3cgc2VtYW50aWNzIGFuZCB3YXNcbiAgLy8gd3JpdHRlbiB0byBnbyByZWQgdGhlIGRheSB0aGUgcGxhdGZvcm0gd2lkZW5zIHRoZW06IHdpdGggdGhlIG1hc3RlciBzZXRcbiAgLy8gcmVzb2x2ZWQgZnJvbSBSTFMgcG9saWNpZXMgYWxvbmUsIGFueSBjYWxsZXIgd2l0aG91dCB0aGUgcHJpdmF0ZS1kZWFsXG4gIC8vIHBvbGljeSBcdTIwMTQgYHNhbGVzX3JlcGAgaW5jbHVkZWQgXHUyMDE0IHJlYWNoZXMgRVZFUlkgb3Bwb3J0dW5pdHkncyBsaW5lcy5cbiAgLy8gQURSLTAwNTUncyByZWxhdGlvbiByZXNvbHZlciBhY2NlcHRzIGEgUkVRVUlSRUQgTE9PS1VQIGFzIHRoZSBwYXJlbnQsIHNvXG4gIC8vIHRoaXMgd29ya3Mgd2l0aG91dCBjb252ZXJ0aW5nIHRoZSByZWxhdGlvbnNoaXAgdG8gbWFzdGVyLWRldGFpbC5cbiAgLy9cbiAgLy8gXHUyNkQ0IE5vdCBgcHJpdmF0ZWA6IHRoaXMgb2JqZWN0IGhhcyBubyBvd25lciBvZiBpdHMgb3duLCBzbyBgcHJpdmF0ZWAgZmFsbHNcbiAgLy8gYmFjayB0byB0aGUgcGxhdGZvcm0ncyBhdXRvLXN0YW1wZWQgYG93bmVyX2lkYCAod2hvZXZlciBpbnNlcnRlZCB0aGUgcm93KSBcdTIwMTRcbiAgLy8gYW5kIHRoZSByZXAgd2hvIG93bnMgdGhlIGRlYWwgdGhlbiBjYW5ub3Qgc2VlIGEgbGluZSB0aGUgcXVvdGUtZ2VuZXJhdGlvblxuICAvLyBmbG93IG9yIHRoZWlyIG1hbmFnZXIgYWRkZWQgdG8gaXQuXG4gIHNoYXJpbmdNb2RlbDogJ2NvbnRyb2xsZWRfYnlfcGFyZW50JyxcblxuICAvLyBQZXItZmllbGQgaGlzdG9yeSBpcyBvcHQtaW4gdmlhIGBGaWVsZC50cmFja0hpc3RvcnlgIChBRFItMDA1MiksIHNldCBvblxuICAvLyBxdWFudGl0eS91bml0X3ByaWNlL2Rpc2NvdW50IGJlbG93LiBNYXN0ZXItZGV0YWlsIGNoaWxkcmVuIHN0aWxsIGluaGVyaXRcbiAgLy8gdGhlIG1hc3RlcidzIHNoYXJpbmcgYXV0b21hdGljYWxseS5cblxuICBoaWdobGlnaHRGaWVsZHM6IFsnY3JtX3Byb2R1Y3QnLCAncXVhbnRpdHknLCAndW5pdF9wcmljZScsICd0b3RhbF9wcmljZSddLFxuXG4gIC8vIFR3byBncm91cHMsIGRlcml2ZWQgZnJvbSB0aGUgbmluZSBmaWVsZHMgdGhpcyBvYmplY3QgYWN0dWFsbHkgZGVjbGFyZXNcbiAgLy8gcmF0aGVyIHRoYW4gY29waWVkIG9mZiBhIG5laWdoYm91ciAoIzE0NTMpLiBUaGUgc3BsaXQgaXMgdGhlIG9uZSB0aGVcbiAgLy8gYXJpdGhtZXRpYyBhbHJlYWR5IG1ha2VzOiBldmVyeXRoaW5nIGB0b3RhbF9wcmljZWAgbXVsdGlwbGllcyB0b2dldGhlciBpc1xuICAvLyBgcHJpY2luZ2AsIGV2ZXJ5dGhpbmcgdGhhdCBzYXlzIFdISUNIIGxpbmUgdGhpcyBpcyBpcyBgYmFzaWNgLlxuICAvL1xuICAvLyBgcXVhbnRpdHlgIGlzIGEgcHJpY2luZyBmaWVsZCBoZXJlLCBub3QgYW4gaWRlbnRpdHkgb25lIFx1MjAxNCBpdCBpcyBhIGZhY3RvciBpblxuICAvLyBgdG90YWxfcHJpY2VgLCBhbmQgc2VwYXJhdGluZyBpdCBmcm9tIHRoZSBwcmljZSBpdCBtdWx0aXBsaWVzIHdvdWxkIHB1dCB0aGVcbiAgLy8gdHdvIGhhbHZlcyBvZiBvbmUgcHJvZHVjdCBvbiB0d28gc2VjdGlvbnMuIGBjcm1fcXVvdGVfbGluZV9pdGVtYCB0YWtlcyB0aGVcbiAgLy8gc2FtZSBzcGxpdCBvdmVyIGl0cyB0ZW4gZmllbGRzLCBhbmQgdGhlIHBhcmVudHMgYWdyZWU6IGBjcm1fcXVvdGVgIGFuZFxuICAvLyBgY3JtX3Byb2R1Y3RgIGJvdGgga2VlcCBldmVyeSBtb25leSBmaWVsZCBpbiBgcHJpY2luZ2AgXHUyMDE0IGBjcm1fcXVvdGVgJ3NcbiAgLy8gYHRheGAgaW5jbHVkZWQgXHUyMDE0IGFuZCBib3RoIGtlZXAgYGRlc2NyaXB0aW9uYCBpbiBgYmFzaWNgLlxuICAvL1xuICAvLyBcdTI2QTBcdUZFMEYgTmVpdGhlciBncm91cCBtYXkgYmUgYSBzdWJzZXQgb2YgdGhlIGhpZ2hsaWdodCBzdHJpcDogYSBzeW50aGVzaXplZFxuICAvLyBkZXRhaWwgcGFnZSBob2lzdHMgdGhlIHRpdGxlIHBsdXMgdGhlIGZpcnN0IGZvdXIgYGhpZ2hsaWdodEZpZWxkc2Agb3V0IG9mXG4gIC8vIHRoZSBib2R5LCBzbyBhbiBhbGwtaG9pc3RlZCBncm91cCByZW5kZXJzIG9uIGZvcm1zIGFuZCBub3doZXJlIGVsc2VcbiAgLy8gKGBmaWVsZC1ncm91cC1zaGFkb3dlZGA7IGBwbnBtIGxpbnRgIFx1MjAxNCBgb3MgbGludCAtLXN0cmljdGAgXHUyMDE0IGZhaWxzIG9uIGl0KS5cbiAgLy8gYGJhc2ljYCBrZWVwcyBjcm1fb3Bwb3J0dW5pdHkvZGVzY3JpcHRpb24vbGluZV9udW1iZXIgYW5kIGBwcmljaW5nYCBrZWVwc1xuICAvLyBsaXN0X3ByaWNlL2Rpc2NvdW50IG91dHNpZGUgdGhhdCBzdHJpcCwgc28gYm90aCBzdXJ2aXZlIHRoZSBob2lzdC5cbiAgZmllbGRHcm91cHM6IFtcbiAgICB7IGtleTogJ2Jhc2ljJywgICBsYWJlbDogJ0xpbmUgSXRlbScsIGljb246ICdwYWNrYWdlJyB9LFxuICAgIHsga2V5OiAncHJpY2luZycsIGxhYmVsOiAnUHJpY2luZycsICAgaWNvbjogJ2RvbGxhci1zaWduJyB9LFxuICBdLFxuXG4gIGZpZWxkczoge1xuICAgIC8vIFRoZSBwYXJlbnQgbGluaywgYW5kIHRoZSBPTkUgZmllbGQgb24gdGhpcyBvYmplY3QgdGhhdCBkZWNpZGVzIHdoZXRoZXIgdGhlXG4gICAgLy8gZGVhbCBpdCBiZWxvbmdzIHRvIGNhbiBiZSBkZWxldGVkIGF0IGFsbCAoIzcyNykuXG4gICAgLy9cbiAgICAvLyBEZWNsYXJpbmcgbm90aGluZyBoZXJlIGRvZXMgbm90IG1lYW4gXCJubyBvcGluaW9uXCI6IGBGaWVsZC5sb29rdXBgIHJlc29sdmVzXG4gICAgLy8gYGRlbGV0ZUJlaGF2aW9yYCB0byB0aGUgc3BlYyBkZWZhdWx0IGBzZXRfbnVsbGAsIGFuZCB0aGUgZW5naW5lJ3NcbiAgICAvLyBgY2FzY2FkZURlbGV0ZVJlbGF0aW9uc2AgZXNjYWxhdGVzIGEgYHNldF9udWxsYCBkZWZhdWx0IG9uIGEgUkVRVUlSRURcbiAgICAvLyBsb29rdXAgdG8gYHJlc3RyaWN0YCBcdTIwMTQgYSBOT1QgTlVMTCBjb2x1bW4gY2Fubm90IGJlIGNsZWFyZWQuIFNvIHRoZSBzaWxlbnRcbiAgICAvLyBkZWZhdWx0IG1hZGUgZXZlcnkgaXRlbWlzZWQgb3Bwb3J0dW5pdHkgdW5kZWxldGFibGUsIHdpdGggYSBtZXNzYWdlIHRoYXRcbiAgICAvLyB0b2xkIHRoZSBBUEkgY2FsbGVyIHRvIGBzZXQgZGVsZXRlQmVoYXZpb3I6J2Nhc2NhZGUnYCBvbiB0aGlzIHZlcnkgZmllbGQ6XG4gICAgLy9cbiAgICAvLyAgICAgREVMRVRFIC9hcGkvdjEvZGF0YS9jcm1fb3Bwb3J0dW5pdHkvPGlkPlxuICAgIC8vICAgICBcdTIxOTIgNDA5IERFTEVURV9SRVNUUklDVEVEIFwiXHUyMDI2MSBkZXBlbmRlbnQgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbVxuICAgIC8vICAgICAgIHJlY29yZChzKSByZWZlcmVuY2UgaXQgdmlhIGNybV9vcHBvcnR1bml0eVx1MjAyNlwiXG4gICAgLy9cbiAgICAvLyBgY2FzY2FkZWAgaXMgdGhlIHNlbWFudGljcyB0aGlzIG9iamVjdCBhbHJlYWR5IGNsYWltcyB0d2ljZSBvdmVyOiB0aGVcbiAgICAvLyBoZWFkZXIgY29tbWVudCBzYXlzIGEgbGluZSBoYXMgbm8gbWVhbmluZyBhcGFydCBmcm9tIGl0cyBkZWFsLCBhbmRcbiAgICAvLyBgb3Bwb3J0dW5pdHlfbGluZV9pdGVtLmhvb2sudHNgIGRlcml2ZXMgYGNybV9vcHBvcnR1bml0eS5hbW91bnRgIEZST00gdGhlXG4gICAgLy8gbGluZSBzZXQuIEEgcmVjb3JkIHdob3NlIHBhcmVudCBpcyBnb25lIGRlbm90ZXMgbm90aGluZyBhbmQgd291bGQga2VlcCBhXG4gICAgLy8gZGVhZCBkZWFsJ3MgcmV2ZW51ZSBpbiB0aGUgbGluZS1sZXZlbCByZXBvcnRzLlxuICAgIC8vXG4gICAgLy8gVGhpcyBpcyBkZWxpYmVyYXRlbHkgTk9UIHRoZSBjYW1wYWlnbi9ldmVudCBhbnN3ZXIgKCM2OTYsICM3MTEga2VwdFxuICAgIC8vIGBjcm1fY2FtcGFpZ25fbWVtYmVyLmNybV9jYW1wYWlnbmAgYW5kIGBjcm1fZXZlbnRfYXR0ZW5kZWUuY3JtX2V2ZW50YCBvblxuICAgIC8vIHRoZSByZXN0cmljdGluZyBkZWZhdWx0KTogYSBtZW1iZXIgbGlzdCBpcyBhIGNhbXBhaWduJ3MgaGlzdG9yaWNhbCByZWNvcmRcbiAgICAvLyBhbmQgc3Vydml2ZXMgb24gaXRzIG93biB0ZXJtcy4gQSBwcmljZSBsaW5lIGRvZXMgbm90LlxuICAgIGNybV9vcHBvcnR1bml0eTogRmllbGQubWFzdGVyRGV0YWlsKCdjcm1fb3Bwb3J0dW5pdHknLCB7XG4gICAgICBsYWJlbDogJ09wcG9ydHVuaXR5JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZScsXG4gICAgfSksXG5cbiAgICAvLyBEZWxpYmVyYXRlbHkgbGVmdCBvbiB0aGUgZGVmYXVsdCwgd2hpY2ggdGhlIHNhbWUgZXNjYWxhdGlvbiB0dXJucyBpbnRvXG4gICAgLy8gYHJlc3RyaWN0YDogZGVsZXRpbmcgYSBjYXRhbG9nIHByb2R1Y3QgbXVzdCBOT1Qgc2hyZWQgdGhlIHByaWNlZCBoaXN0b3J5XG4gICAgLy8gb2YgZGVhbHMgdGhhdCBzb2xkIGl0LiBgcHJvZHVjdC5ob29rLnRzYCdzIG93biBgYmVmb3JlRGVsZXRlYCBzYXlzIHRoZVxuICAgIC8vIHNhbWUgdGhpbmcgaW4gd29yZHMgKFwiU2V0IGlzX2FjdGl2ZT1mYWxzZSB0byByZXRpcmUgaW5zdGVhZFwiKS5cbiAgICBjcm1fcHJvZHVjdDogRmllbGQubG9va3VwKCdjcm1fcHJvZHVjdCcsIHtcbiAgICAgIGxhYmVsOiAnUHJvZHVjdCcsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgfSksXG5cbiAgICBkZXNjcmlwdGlvbjogRmllbGQudGV4dCh7XG4gICAgICBsYWJlbDogJ0Rlc2NyaXB0aW9uJyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbWF4TGVuZ3RoOiA1MDAsXG4gICAgfSksXG5cbiAgICBxdWFudGl0eTogRmllbGQubnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnUXVhbnRpdHknLFxuICAgICAgZ3JvdXA6ICdwcmljaW5nJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBzY2FsZTogMixcbiAgICAgIG1pbjogMCxcbiAgICAgIGRlZmF1bHRWYWx1ZTogMSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIGxpc3RfcHJpY2U6IEZpZWxkLmN1cnJlbmN5KHtcbiAgICAgIGxhYmVsOiAnTGlzdCBQcmljZScsXG4gICAgICBncm91cDogJ3ByaWNpbmcnLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgICBkZXNjcmlwdGlvbjogXCJBdXRvLXBvcHVsYXRlZCBmcm9tIHRoZSBwcm9kdWN0J3MgTGlzdCBQcmljZS5cIixcbiAgICB9KSxcblxuICAgIHVuaXRfcHJpY2U6IEZpZWxkLmN1cnJlbmN5KHtcbiAgICAgIGxhYmVsOiAnU2FsZXMgUHJpY2UnLFxuICAgICAgZ3JvdXA6ICdwcmljaW5nJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBkZXNjcmlwdGlvbjogJ05lZ290aWF0ZWQgdW5pdCBwcmljZSAobWF5IGRpZmZlciBmcm9tIGxpc3QgcHJpY2UpJyxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIGRpc2NvdW50OiBGaWVsZC5wZXJjZW50KHtcbiAgICAgIGxhYmVsOiAnRGlzY291bnQgJScsXG4gICAgICBncm91cDogJ3ByaWNpbmcnLFxuICAgICAgc2NhbGU6IDIsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEwMCxcbiAgICAgIGRlZmF1bHRWYWx1ZTogMCxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIHRvdGFsX3ByaWNlOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnVG90YWwnLFxuICAgICAgZ3JvdXA6ICdwcmljaW5nJyxcbiAgICAgIGV4cHJlc3Npb246IEZgcmVjb3JkLnF1YW50aXR5ICogcmVjb3JkLnVuaXRfcHJpY2UgKiAoMSAtIHJlY29yZC5kaXNjb3VudCAvIDEwMClgLFxuICAgIH0pLFxuXG4gICAgbGluZV9udW1iZXI6IEZpZWxkLm51bWJlcih7XG4gICAgICBsYWJlbDogJ0xpbmUgIycsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIHNjYWxlOiAwLFxuICAgICAgcmVhZG9ubHk6IHRydWUsXG4gICAgfSksXG4gIH0sXG5cbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAndW5pdF9wcmljZV9wb3NpdGl2ZScsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ1NhbGVzIHByaWNlIGNhbm5vdCBiZSBuZWdhdGl2ZScsXG4gICAgICAvLyBCb3RoIGd1YXJkcyBhcmUgbG9hZC1iZWFyaW5nLCBub3QgZGVmZW5zaXZlIG5vaXNlLiBgaGFzKC4uLilgIGFuc3dlcnNcbiAgICAgIC8vIFwiaXMgdGhlIGtleSBwcmVzZW50IGF0IGFsbFwiOiBvbiB1cGRhdGUgdGhlIHByZWRpY2F0ZSBzZWVzXG4gICAgICAvLyBgey4uLnByZXZpb3VzLCAuLi5kYXRhfWAsIGFuZCBhIGRyaXZlciB0aGF0IHN0b3JlcyBvbmx5IHdyaXR0ZW4gY29sdW1uc1xuICAgICAgLy8gcmV0dXJucyBubyBrZXksIHdoaWNoIGFib3J0cyB0aGUgd2hvbGUgcHJlZGljYXRlIGFuZCBzaWxlbnRseSBza2lwcyB0aGVcbiAgICAgIC8vIHJ1bGUgKCM2MzApLiBgIT0gbnVsbGAgYW5zd2VycyBcImRvZXMgaXQgaG9sZCBhIHZhbHVlXCI6IHN0cmljdCBDRUxcbiAgICAgIC8vIEFCT1JUUyBvbiBgbnVsbCA8IDBgIGluc3RlYWQgb2YgZXZhbHVhdGluZyBpdCBmYWxzZSwgc28gdGhlIHVuZ3VhcmRlZFxuICAgICAgLy8gZm9ybSBsZWZ0IHRoaXMgcnVsZSBpbmVydCBvbiBhIGJsYW5rIHByaWNlIFx1MjAxNCBpdCBuZXZlciBmaXJlZCBhdCBhbGwsXG4gICAgICAvLyB3aGljaCBpcyB0aGUgb3Bwb3NpdGUgb2Ygd2hhdCBhIHZhbGlkYXRpb24gaXMgZm9yLiBUaGUgYG51bGxgIGhhemFyZCBpc1xuICAgICAgLy8gd3JpdHRlbiB1cCBhdCBgYWNjb3VudC5vYmplY3QudHM6MjQ0LTI0NWA7IHRoZSBzYW1lLW5hbWVkIHJ1bGUgaW5cbiAgICAgIC8vIGBxdW90ZV9saW5lX2l0ZW0ub2JqZWN0LnRzYCBoYXMgY2FycmllZCB0aGF0IGd1YXJkIGFsbCBhbG9uZy5cbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnVuaXRfcHJpY2UpICYmIHJlY29yZC51bml0X3ByaWNlICE9IG51bGwgJiYgcmVjb3JkLnVuaXRfcHJpY2UgPCAwYCxcbiAgICB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHMvcHJvZHVjdC5vYmplY3QudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9wcm9kdWN0Lm9iamVjdC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgT2JqZWN0U2NoZW1hLCBGaWVsZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgRiwgUCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcblxuLyoqXG4gKiBQcm9kdWN0IE9iamVjdFxuICogUmVwcmVzZW50cyBwcm9kdWN0cy9zZXJ2aWNlcyBvZmZlcmVkIGJ5IHRoZSBjb21wYW55XG4gKi9cbmV4cG9ydCBjb25zdCBQcm9kdWN0ID0gT2JqZWN0U2NoZW1hLmNyZWF0ZSh7XG4gIG5hbWU6ICdjcm1fcHJvZHVjdCcsXG4gIGxhYmVsOiAnUHJvZHVjdCcsXG4gIHBsdXJhbExhYmVsOiAnUHJvZHVjdHMnLFxuICBpY29uOiAnYm94JyxcbiAgZGVzY3JpcHRpb246ICdQcm9kdWN0cyBhbmQgc2VydmljZXMgb2ZmZXJlZCBieSB0aGUgY29tcGFueScsXG5cbiAgLy8gQURSLTAwOTAgRDEvRDc6IE9XRCBpcyBhbiBhdXRob3JlZCBkZWNpc2lvbi4gUHJvZHVjdCBjYXRhbG9nIGlzIG9yZy12aXNpYmxlOyBvbmx5IG93bmVycyBlZGl0LlxuICBzaGFyaW5nTW9kZWw6ICdwdWJsaWNfcmVhZCcsXG4gIC8vIEFEUi0wMDc5OiByZW5kZXItb25seSBgdGl0bGVGb3JtYXRgIHJldGlyZWQgaW4gZmF2b3Igb2YgYG5hbWVGaWVsZGAsXG4gIC8vIHdoaWNoIG5hbWVzIGEgcmVhbCBmaWVsZC4gVGhlIGZvcm1lciB0ZW1wbGF0ZSBjb21wb3NlZCB0d28gbG9jYWwgZmllbGRzLCBzb1xuICAvLyBhIGBkaXNwbGF5X3RpdGxlYCBmb3JtdWxhIGZpZWxkIHJlcHJvZHVjZXMgaXQgZm9yIHRoZSByZWNvcmQgdGl0bGUuXG4gIG5hbWVGaWVsZDogJ2Rpc3BsYXlfdGl0bGUnLFxuICAvLyBFeHBsaWNpdCBzZWFyY2ggdGFyZ2V0cyAoQURSLTAwNjEpLiBSRVFVSVJFRCBiZWNhdXNlIG5hbWVGaWVsZCBpcyBhXG4gIC8vIEZPUk1VTEEgKGRpc3BsYXlfdGl0bGUvZnVsbF9uYW1lKTogd2l0aG91dCB0aGlzLCAkc2VhcmNoIGF1dG8tZGVmYXVsdHMgdG9cbiAgLy8gdGhlIGZvcm11bGEgZmllbGQsIHdoaWNoIGlzbid0IGEgcmVhbCBjb2x1bW4sIHNvIHRoZSBsb29rdXAgcGlja2VyICsgZ2xvYmFsXG4gIC8vIHNlYXJjaCBzaWxlbnRseSByZXR1cm4gemVyby4gVGhlc2UgYXJlIHJlYWwsIGluZGV4ZWQgY29sdW1ucy5cbiAgc2VhcmNoYWJsZUZpZWxkczogWyduYW1lJywgJ3Byb2R1Y3RfY29kZScsICdza3UnXSxcbiAgaGlnaGxpZ2h0RmllbGRzOiBbJ3Byb2R1Y3RfY29kZScsICduYW1lJywgJ2NhdGVnb3J5JywgJ2lzX2FjdGl2ZSddLFxuXG4gIGZpZWxkR3JvdXBzOiBbXG4gICAgeyBrZXk6ICdiYXNpYycsICAgIGxhYmVsOiAnUHJvZHVjdCBJbmZvcm1hdGlvbicsIGljb246ICdpbmZvJyB9LFxuICAgIHsga2V5OiAncHJpY2luZycsICBsYWJlbDogJ1ByaWNpbmcnLCAgICAgICAgICAgICBpY29uOiAnZG9sbGFyLXNpZ24nIH0sXG4gICAgeyBrZXk6ICdtZXRhZGF0YScsIGxhYmVsOiAnUmVzb3VyY2VzJywgICAgICAgICAgIGljb246ICdsaW5rJywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gQXV0b051bWJlciBmaWVsZCAtIFVuaXF1ZSBwcm9kdWN0IGlkZW50aWZpZXJcbiAgICBwcm9kdWN0X2NvZGU6IEZpZWxkLmF1dG9udW1iZXIoe1xuICAgICAgbGFiZWw6ICdQcm9kdWN0IENvZGUnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBmb3JtYXQ6ICdQUkQtezAwMDB9JyxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBCYXNpYyBJbmZvcm1hdGlvblxuICAgIG5hbWU6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdQcm9kdWN0IE5hbWUnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgc2VhcmNoYWJsZTogdHJ1ZSxcbiAgICAgIG1heExlbmd0aDogMjU1LFxuICAgIH0pLFxuXG4gICAgLy8gQURSLTAwNzkgcmVjb3JkIHRpdGxlICh3YXMgdGl0bGVGb3JtYXQgJ3twcm9kdWN0X2NvZGV9IC0ge25hbWV9JykuXG4gICAgZGlzcGxheV90aXRsZTogRmllbGQuZm9ybXVsYSh7XG4gICAgICBsYWJlbDogJ0Rpc3BsYXkgVGl0bGUnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBleHByZXNzaW9uOiBGYHJlY29yZC5wcm9kdWN0X2NvZGUgKyBcIiAtIFwiICsgcmVjb3JkLm5hbWVgLFxuICAgIH0pLFxuXG4gICAgZGVzY3JpcHRpb246IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGxhYmVsOiAnRGVzY3JpcHRpb24nLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG5cbiAgICAvLyBDYXRlZ29yaXphdGlvblxuICAgIGNhdGVnb3J5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdDYXRlZ29yeScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ1NvZnR3YXJlJywgdmFsdWU6ICdzb2Z0d2FyZScsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ0hhcmR3YXJlJywgdmFsdWU6ICdoYXJkd2FyZScgfSxcbiAgICAgICAgeyBsYWJlbDogJ1NlcnZpY2UnLCB2YWx1ZTogJ3NlcnZpY2UnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTdWJzY3JpcHRpb24nLCB2YWx1ZTogJ3N1YnNjcmlwdGlvbicgfSxcbiAgICAgICAgeyBsYWJlbDogJ1N1cHBvcnQnLCB2YWx1ZTogJ3N1cHBvcnQnIH0sXG4gICAgICBdXG4gICAgfSksXG4gICAgXG4gICAgZmFtaWx5OiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdQcm9kdWN0IEZhbWlseScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0VudGVycHJpc2UgU29sdXRpb25zJywgdmFsdWU6ICdlbnRlcnByaXNlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU01CIFNvbHV0aW9ucycsIHZhbHVlOiAnc21iJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUHJvZmVzc2lvbmFsIFNlcnZpY2VzJywgdmFsdWU6ICdzZXJ2aWNlcycgfSxcbiAgICAgICAgeyBsYWJlbDogJ0Nsb3VkIFNlcnZpY2VzJywgdmFsdWU6ICdjbG91ZCcgfSxcbiAgICAgIF1cbiAgICB9KSxcbiAgICBcbiAgICAvLyBQcmljaW5nXG4gICAgbGlzdF9wcmljZTogRmllbGQuY3VycmVuY3koeyBcbiAgICAgIGxhYmVsOiAnTGlzdCBQcmljZScsXG4gICAgICBncm91cDogJ3ByaWNpbmcnLFxuICAgICAgbWluOiAwLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICB9KSxcbiAgICBcbiAgICBjb3N0OiBGaWVsZC5jdXJyZW5jeSh7IFxuICAgICAgbGFiZWw6ICdDb3N0JyxcbiAgICAgIGdyb3VwOiAncHJpY2luZycsXG4gICAgICBtaW46IDAsXG4gICAgfSksXG4gICAgXG4gICAgLy8gU0tVXG4gICAgLy9cbiAgICAvLyBgcXVhbnRpdHlfb25faGFuZGAgLyBgcmVvcmRlcl9wb2ludGAgd2VyZSByZW1vdmVkIHdpdGggdGhlIHJlc3Qgb2YgdGhlXG4gICAgLy8gaW52ZW50b3J5IHN1cmZhY2U6IG5vdGhpbmcgaW4gdGhpcyBhcHAgZGVjcmVtZW50ZWQgc3RvY2ssIGFuZCB0aGUgXCJMb3dcbiAgICAvLyBTdG9ja1wiIHZpZXcgdGhleSBmZWQgY29tcGFyZWQgYWdhaW5zdCBhIGhhcmRjb2RlZCAxMCByYXRoZXIgdGhhbiB0aGVcbiAgICAvLyByZW9yZGVyIHBvaW50IGJlc2lkZSBpdC4gSG90Q1JNIHNlbGxzIGZyb20gYSBjYXRhbG9nOyB3YXJlaG91c2Ugc3RhdGVcbiAgICAvLyBiZWxvbmdzIHRvIHRoZSBzeXN0ZW0gb2YgcmVjb3JkIHRoYXQgb3ducyBpdC5cbiAgICBza3U6IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdTS1UnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBtYXhMZW5ndGg6IDUwLFxuICAgICAgdW5pcXVlOiB0cnVlLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFN0YXR1c1xuICAgIGlzX2FjdGl2ZTogRmllbGQuYm9vbGVhbih7XG4gICAgICBsYWJlbDogJ0FjdGl2ZScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogdHJ1ZSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBSZWxhdGlvbnNoaXBzXG4gICAgcHJvZHVjdF9tYW5hZ2VyOiBGaWVsZC5sb29rdXAoJ3N5c191c2VyJywge1xuICAgICAgbGFiZWw6ICdQcm9kdWN0IE1hbmFnZXInLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgfSksXG4gICAgXG4gICAgLy8gSW1hZ2VzIGFuZCBBc3NldHNcbiAgICAvLyBgYWNjZXB0YCAvIGBtYXhTaXplYCBhcmUgZGVjbGFyYWJsZSBBTkQgc2VydmVyLWVuZm9yY2VkIGZyb21cbiAgICAvLyBAb2JqZWN0c3RhY2sgMTcgKEFEUi0wMTA0IEQzIHdhdmUgMikuIEJlZm9yZSB0aGF0IHRoZSB1cGxvYWQgd2lkZ2V0IHJlYWRcbiAgICAvLyB0aGVtIGJ1dCBgRmllbGRTY2hlbWFgIGRyb3BwZWQgdGhlbSBhdCBwYXJzZSwgc28gdGhlIGNvbnN0cmFpbnQgZXhpc3RlZFxuICAgIC8vIG9ubHkgaW4gdGhlIGJyb3dzZXIgYW5kIGFueSBkaXJlY3QgQVBJIGNhbGxlciB3YWxrZWQgcGFzdCBpdC5cbiAgICBpbWFnZTogRmllbGQuaW1hZ2Uoe1xuICAgICAgbGFiZWw6ICdQcm9kdWN0IEltYWdlJyxcbiAgICAgIGdyb3VwOiAnbWV0YWRhdGEnLFxuICAgICAgYWNjZXB0OiBbJ2ltYWdlL3BuZycsICdpbWFnZS9qcGVnJywgJ2ltYWdlL3dlYnAnXSxcbiAgICAgIG1heFNpemU6IDUgKiAxMDI0ICogMTAyNCxcbiAgICB9KSxcblxuICAgIGRhdGFzaGVldDogRmllbGQuZmlsZSh7XG4gICAgICBsYWJlbDogJ0RhdGFzaGVldCcsXG4gICAgICBncm91cDogJ21ldGFkYXRhJyxcbiAgICAgIGFjY2VwdDogWydhcHBsaWNhdGlvbi9wZGYnXSxcbiAgICAgIG1heFNpemU6IDIwICogMTAyNCAqIDEwMjQsXG4gICAgfSksXG5cbiAgICAvLyBgYmlsbGluZ190eXBlYCBhbmQgYHVuaXRfb2ZfbWVhc3VyZWAgd2VyZSByZW1vdmVkIHdpdGggdGhlIHRheCBmbGFnOiBib3RoXG4gICAgLy8gd2VyZSBzZWVkZWQgb24gYWxsIDEzIGNhdGFsb2cgcHJvZHVjdHMgYW5kIHJlYWQgYnkgbm90aGluZyBcdTIwMTQgbm8gcXVvdGVcbiAgICAvLyB0b3RhbCwgbm8gcmV2ZW51ZS1yZWNvZ25pdGlvbiByZXBvcnQgYW5kIG5vIGxpbmUtaXRlbSBiZWhhdmlvdXIgZXZlclxuICAgIC8vIGNvbnN1bHRlZCBlaXRoZXIuIEEgcGlja2xpc3QgdGhhdCBvbmx5IGV2ZXIgcmVuZGVycyBpdHNlbGYgaXMgYVxuICAgIC8vIG1haW50ZW5hbmNlIG9ibGlnYXRpb24gKGZvdXIgbG9jYWxlcywgYW4gaW1wb3J0IGNvbHVtbiwgZXZlcnkgZnV0dXJlXG4gICAgLy8gbWlncmF0aW9uKSBjaGFyZ2VkIGFnYWluc3QgYSBjYXBhYmlsaXR5IHRoYXQgZG9lcyBub3QgZXhpc3QuXG4gIH0sXG4gIFxuICAvLyBEYXRhYmFzZSBpbmRleGVzXG4gIC8vXG4gIC8vIE5vIGB7IGZpZWxkczogWydza3UnXSwgdW5pcXVlOiB0cnVlIH1gIGhlcmU6IHRoZSBmaWVsZC1sZXZlbCBgdW5pcXVlOiB0cnVlYFxuICAvLyBhbHJlYWR5IGJ1aWxkcyB0aGUgdGVuYW50IGNvbXBvc2l0ZSBgKG9yZ2FuaXphdGlvbl9pZCwgc2t1KWAgc2luY2VcbiAgLy8gZnJhbWV3b3JrICMzNjk2LiBEZWNsYXJpbmcgdGhlIHNpbmdsZS1jb2x1bW4gaW5kZXggdG9vIG1hZGUgdGhlXG4gIC8vIHBsYXRmb3JtLXdpZGUgY29uc3RyYWludCB3aW4gYW5kIGxlZnQgdGhlIHBlci10ZW5hbnQgb25lIHVucmVhY2hhYmxlXG4gIC8vIChmcmFtZXdvcmsjMzk5MSkgXHUyMDE0IGFuIFNLVSBpcyB1bmlxdWUgaW5zaWRlIGEgY2F0YWxvZ3VlLCBhbmQgdHdvXG4gIC8vIG9yZ2FuaXphdGlvbnMgbWF5IGxlZ2l0aW1hdGVseSBib3RoIHN0b2NrIFwiQUJDLTEyM1wiLlxuICBpbmRleGVzOiBbXG4gICAgeyBmaWVsZHM6IFsnbmFtZSddIH0sXG4gICAgeyBmaWVsZHM6IFsnY2F0ZWdvcnknXSB9LFxuICAgIHsgZmllbGRzOiBbJ2lzX2FjdGl2ZSddIH0sXG4gIF0sXG4gIFxuICAvLyBFbmFibGUgYWR2YW5jZWQgZmVhdHVyZXNcbiAgLy8gQVBJIHN1cmZhY2UuIEhpc3RvcnkgXHUyMTkyIEZpZWxkLnRyYWNrSGlzdG9yeSAoQURSLTAwNTIpLlxuICBlbmFibGU6IHtcbiAgICBhcGlFbmFibGVkOiB0cnVlLFxuICAgIGFwaU1ldGhvZHM6IFsnZ2V0JywgJ2xpc3QnLCAnY3JlYXRlJywgJ3VwZGF0ZScsICdkZWxldGUnXSxcbiAgfSxcbiAgXG4gIC8vIFZhbGlkYXRpb24gUnVsZXNcbiAgLy9cbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAncHJpY2VfcG9zaXRpdmUnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdMaXN0IFByaWNlIG11c3QgYmUgcG9zaXRpdmUnLFxuICAgICAgLy8gVHdvIGRpc3RpbmN0IGd1YXJkcywgYm90aCByZXF1aXJlZC4gYGhhcyguLi4pYCBhbnN3ZXJzIFwiaXMgdGhlIGtleVxuICAgICAgLy8gdGhlcmUgYXQgYWxsXCIgXHUyMDE0IG9uIHVwZGF0ZSB0aGUgbWVyZ2VkIHJlY29yZCBpcyBgey4uLnByZXZpb3VzLCAuLi5kYXRhfWBcbiAgICAgIC8vIGFuZCBhIGRyaXZlciB0aGF0IHN0b3JlcyBvbmx5IHdyaXR0ZW4gY29sdW1ucyBoYW5kcyBiYWNrIG5vIGtleSwgd2hpY2hcbiAgICAgIC8vIGFib3J0cyB0aGUgd2hvbGUgcHJlZGljYXRlICgjNjMwKS4gYCE9IG51bGxgIHRoZW4gYW5zd2VycyBcImRvZXMgaXQgaG9sZFxuICAgICAgLy8gYSB2YWx1ZVwiIFx1MjAxNCBzdHJpY3QgQ0VMIGNhbm5vdCBjb21wYXJlIGR5bjxudWxsPiA8IGludCwgdGhlIGhhemFyZFxuICAgICAgLy8gd3JpdHRlbiB1cCBvbiBgYWNjb3VudC5vYmplY3QudHNgLiBgbGlzdF9wcmljZWAgaXMgYHJlcXVpcmVkYCwgYnV0IHRoZVxuICAgICAgLy8gcnVsZSBhbHNvIHJ1bnMgb24gcGFydGlhbCB1cGRhdGVzIHRoYXQgb21pdCBpdC5cbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmxpc3RfcHJpY2UpICYmIHJlY29yZC5saXN0X3ByaWNlICE9IG51bGwgJiYgcmVjb3JkLmxpc3RfcHJpY2UgPCAwYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdjb3N0X2xlc3NfdGhhbl9wcmljZScsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiAnQ29zdCBzaG91bGQgYmUgbGVzcyB0aGFuIExpc3QgUHJpY2UnLFxuICAgICAgLy8gQm90aCBvcGVyYW5kcyBuZWVkIGJvdGggZ3VhcmRzOiBgY29zdGAgaXMgb3B0aW9uYWwgYW5kIGFic2VudCBvbiBldmVyeVxuICAgICAgLy8gc2VlZGVkIHByb2R1Y3QsIHNvIHRoaXMgd2FybmluZyBoYXMgbmV2ZXIgb25jZSBldmFsdWF0ZWQuXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5jb3N0KSAmJiByZWNvcmQuY29zdCAhPSBudWxsICYmIGhhcyhyZWNvcmQubGlzdF9wcmljZSkgJiYgcmVjb3JkLmxpc3RfcHJpY2UgIT0gbnVsbCAmJiByZWNvcmQuY29zdCA+PSByZWNvcmQubGlzdF9wcmljZWAsXG4gICAgfSxcbiAgXSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL3F1b3RlLm9iamVjdC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL3F1b3RlLm9iamVjdC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgT2JqZWN0U2NoZW1hLCBGaWVsZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgRiwgUCwgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgUEFZTUVOVF9URVJNU19PUFRJT05TIH0gZnJvbSAnLi4vLi4vc2FsZXMvb2JqZWN0cy9fcGlja2xpc3RzJztcbmltcG9ydCB7IFFVT1RFX0RJU0NPVU5UX0NFSUxJTkcgfSBmcm9tICcuLi8uLi9zYWxlcy9vYmplY3RzL190aHJlc2hvbGRzJztcblxuLyoqXG4gKiBRdW90ZSBPYmplY3RcbiAqIFJlcHJlc2VudHMgcHJpY2UgcXVvdGVzIHNlbnQgdG8gY3VzdG9tZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBRdW90ZSA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX3F1b3RlJyxcbiAgbGFiZWw6ICdRdW90ZScsXG4gIHBsdXJhbExhYmVsOiAnUXVvdGVzJyxcbiAgaWNvbjogJ2ZpbGUtdGV4dCcsXG4gIGRlc2NyaXB0aW9uOiAnUHJpY2UgcXVvdGVzIGZvciBjdXN0b21lcnMnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIE1hc3Rlci1kZXRhaWwgY2hpbGQgb2ZcbiAgLy8gY3JtX2FjY291bnQgXHUyMDE0IGEgcXVvdGUgaXMgcmVhY2hhYmxlIGJ5IHdob2V2ZXIgY2FuIHJlYWNoIGl0cyBhY2NvdW50LCBhbmRcbiAgLy8gaXRzIGxpbmUgaXRlbXMgZGVyaXZlIG9uZSBsZXZlbCBmdXJ0aGVyICgjNTQ5LCBydWxpbmcgMjAyNi0wOC0zMSkuXG4gIHNoYXJpbmdNb2RlbDogJ2NvbnRyb2xsZWRfYnlfcGFyZW50JyxcbiAgLy8gQURSLTAwNzk6IHJlbmRlci1vbmx5IGB0aXRsZUZvcm1hdGAgcmV0aXJlZCBpbiBmYXZvciBvZiBgbmFtZUZpZWxkYCxcbiAgLy8gd2hpY2ggbmFtZXMgYSByZWFsIGZpZWxkLiBUaGUgZm9ybWVyIHRlbXBsYXRlIGNvbXBvc2VkIHR3byBsb2NhbCBmaWVsZHMsIHNvXG4gIC8vIGEgYGRpc3BsYXlfdGl0bGVgIGZvcm11bGEgZmllbGQgcmVwcm9kdWNlcyBpdCBmb3IgdGhlIHJlY29yZCB0aXRsZS5cbiAgbmFtZUZpZWxkOiAnZGlzcGxheV90aXRsZScsXG4gIC8vIEV4cGxpY2l0IHNlYXJjaCB0YXJnZXRzIChBRFItMDA2MSkuIFJFUVVJUkVEIGJlY2F1c2UgbmFtZUZpZWxkIGlzIGFcbiAgLy8gRk9STVVMQSAoZGlzcGxheV90aXRsZS9mdWxsX25hbWUpOiB3aXRob3V0IHRoaXMsICRzZWFyY2ggYXV0by1kZWZhdWx0cyB0b1xuICAvLyB0aGUgZm9ybXVsYSBmaWVsZCwgd2hpY2ggaXNuJ3QgYSByZWFsIGNvbHVtbiwgc28gdGhlIGxvb2t1cCBwaWNrZXIgKyBnbG9iYWxcbiAgLy8gc2VhcmNoIHNpbGVudGx5IHJldHVybiB6ZXJvLiBUaGVzZSBhcmUgcmVhbCwgaW5kZXhlZCBjb2x1bW5zLlxuICBzZWFyY2hhYmxlRmllbGRzOiBbJ25hbWUnLCAncXVvdGVfbnVtYmVyJ10sXG4gIGhpZ2hsaWdodEZpZWxkczogWydxdW90ZV9udW1iZXInLCAnbmFtZScsICdjcm1fYWNjb3VudCcsICdzdGF0dXMnLCAndG90YWxfcHJpY2UnXSxcblxuICBmaWVsZEdyb3VwczogW1xuICAgIHsga2V5OiAnYmFzaWMnLCAgICAgbGFiZWw6ICdRdW90ZSBJbmZvcm1hdGlvbicsIGljb246ICdpbmZvJyB9LFxuICAgIHsga2V5OiAncHJpY2luZycsICAgbGFiZWw6ICdQcmljaW5nJywgICAgICAgICAgIGljb246ICdkb2xsYXItc2lnbicgfSxcbiAgICB7IGtleTogJ3Rlcm1zJywgICAgIGxhYmVsOiAnVGVybXMgJiBWYWxpZGl0eScsICBpY29uOiAnY2FsZW5kYXInIH0sXG4gICAgeyBrZXk6ICdhZGRyZXNzJywgICBsYWJlbDogJ0FkZHJlc3NlcycsICAgICAgICAgaWNvbjogJ21hcC1waW4nLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgICB7IGtleTogJ3N5c3RlbScsICAgIGxhYmVsOiAnU3lzdGVtJywgICAgICAgICAgICBpY29uOiAnZGF0YWJhc2UnLCBjb2xsYXBzZTogJ2NvbGxhcHNlZCcgfSxcbiAgXSxcblxuICBmaWVsZHM6IHtcbiAgICAvLyBQbGF0Zm9ybSBvd25lcnNoaXAgYW5jaG9yIFx1MjAxNCBjYW5vbmljYWwgbm90ZSBpbiBgYWNjb3VudC5vYmplY3QudHNgICgjNTQ4KS5cbiAgICBvd25lcl9pZDogRmllbGQubG9va3VwKCdzeXNfdXNlcicsIHtcbiAgICAgIGxhYmVsOiAnUXVvdGUgT3duZXInLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBzeXN0ZW06IHRydWUsXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBBdXRvTnVtYmVyIGZpZWxkXG4gICAgcXVvdGVfbnVtYmVyOiBGaWVsZC5hdXRvbnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnUXVvdGUgTnVtYmVyJyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgZm9ybWF0OiAnUVRFLXswMDAwfScsXG4gICAgfSksXG4gICAgXG4gICAgLy8gQmFzaWMgSW5mb3JtYXRpb25cbiAgICBuYW1lOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnUXVvdGUgTmFtZScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBzZWFyY2hhYmxlOiB0cnVlLFxuICAgICAgbWF4TGVuZ3RoOiAyNTUsXG4gICAgfSksXG5cbiAgICAvLyBBRFItMDA3OSByZWNvcmQgdGl0bGUgKHdhcyB0aXRsZUZvcm1hdCAne3F1b3RlX251bWJlcn0gLSB7bmFtZX0nKS5cbiAgICBkaXNwbGF5X3RpdGxlOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnRGlzcGxheSBUaXRsZScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGV4cHJlc3Npb246IEZgcmVjb3JkLnF1b3RlX251bWJlciArIFwiIC0gXCIgKyByZWNvcmQubmFtZWAsXG4gICAgfSksXG5cbiAgICAvLyBSZWxhdGlvbnNoaXBzIFx1MjAxNCB0aGUgbWFzdGVyIHRoZSBPV0QgZGVyaXZlcyBmcm9tIChhdXRob3JlZCwgbm90IHBvc2l0aW9uYWwpLlxuICAgIGNybV9hY2NvdW50OiBGaWVsZC5tYXN0ZXJEZXRhaWwoJ2NybV9hY2NvdW50Jywge1xuICAgICAgbGFiZWw6ICdBY2NvdW50JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZScsXG4gICAgfSksXG4gICAgXG4gICAgY3JtX2NvbnRhY3Q6IEZpZWxkLmxvb2t1cCgnY3JtX2NvbnRhY3QnLCB7XG4gICAgICBsYWJlbDogJ0NvbnRhY3QnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICAvLyBPcHRpb25hbCBBVCBEUkFGVCBUSU1FLCByZXF1aXJlZCBmcm9tIGBwcmVzZW50ZWRgIG9uICgjMTAxNykuXG4gICAgICAvL1xuICAgICAgLy8gcXVvdGVfZ2VuZXJhdGlvbiBtYXBzIHRoZSBvcHBvcnR1bml0eSdzIGBwcmltYXJ5X2NvbnRhY3RgLCB3aGljaCBpc1xuICAgICAgLy8gaXRzZWxmIG9wdGlvbmFsIFx1MjAxNCBhIGZsYXQgYHJlcXVpcmVkOiB0cnVlYCBoZXJlIG1lYW50IGNvbnRhY3QtbGVzc1xuICAgICAgLy8gb3Bwb3J0dW5pdGllcyBjb3VsZCBuZXZlciBkcmFmdCBhIHF1b3RlIGF0IGFsbC4gU28gdGhlIHJlY2lwaWVudCBpc1xuICAgICAgLy8gbmFpbGVkIGRvd24gYnkgdGhlIHRpbWUgYSBxdW90ZSBpcyBQUkVTRU5URUQsIG5vdCB3aGVuIGl0IGlzIGRyYWZ0ZWQuXG4gICAgICAvLyBUaGF0IHNlbnRlbmNlIHNhdCBpbiB0aGlzIGNvbW1lbnQgZm9yIHRoZSBmaWVsZCdzIHdob2xlIGxpZmUgd2l0aFxuICAgICAgLy8gbm90aGluZyBlbmZvcmNpbmcgaXQ6IG5vIHJ1bGUgc3RvcHBlZCBhIGNvbnRhY3QtbGVzcyBxdW90ZSByZWFjaGluZ1xuICAgICAgLy8gYHByZXNlbnRlZGAgb3IgYGFjY2VwdGVkYCwgYW5kIHRoZSBiaWxsIGNhbWUgZHVlIG9uZSBvYmplY3Qgb3Zlci5cbiAgICAgIC8vIGBjcm1fY29udHJhY3QuY3JtX2NvbnRhY3RgIGlzIGByZXF1aXJlZGAgKyBgbm90TnVsbGAsIHNvIGFjY2VwdGluZyBzdWNoXG4gICAgICAvLyBhIHF1b3RlIG1hZGUgYHF1b3RlX29uX2FjY2VwdGVkYCBmYWlsIHRvIGRyYWZ0IHRoZSBjb250cmFjdCBcdTIwMTQgc2luY2VcbiAgICAgIC8vICM3MTQvIzEwMTMgdGhhdCBmYWlsdXJlIGlzIGhvbmVzdCBhbmQgbm8gbG9uZ2VyIHN3YWxsb3dzIHRoZSBjbG9zZS13b25cbiAgICAgIC8vIGxlZywgYnV0IHRoZSBob29rIGlzIGBhc3luY2AgKyBgb25FcnJvcjogJ2xvZydgLCBzbyB0aGUgYWNjZXB0aW5nIHdyaXRlXG4gICAgICAvLyBzdGlsbCBhbnN3ZXJzIDIwMCBhbmQgdGhlIG9ubHkgZXZpZGVuY2UgaXMgYSBzZXJ2ZXIgbG9nIG5vYm9keSByZWFkcy5cbiAgICAgIC8vIGByZXF1aXJlZFdoZW5gIG1vdmVzIHRoZSBzYW1lIHJlZnVzYWwgdG8gdGhlIHN5bmNocm9ub3VzLCBzb21lb25lLWlzLVxuICAgICAgLy8gd2F0Y2hpbmcgbW9tZW50OiB0aGUgcmVwIGlzIHRvbGQgb24gdGhlIHdyaXRlIHRoYXQgdHVybnMgdGhlIHF1b3RlXG4gICAgICAvLyBvdXR3YXJkLCBhZ2FpbnN0IHRoZSBmaWVsZCwgd2l0aCB0aGUgcXVvdGUgc3RpbGwgZWRpdGFibGUuXG4gICAgICAvL1xuICAgICAgLy8gV0hZIEVYQUNUTFkgYHByZXNlbnRlZGAgKyBgYWNjZXB0ZWRgLCBhbmQgbm90IHRoZSBvdGhlciB0d28gdGVybWluYWxcbiAgICAgIC8vIHN0YXRlcy4gQm90aCBvZiB0aG9zZSBhcmUgcmVhY2hhYmxlIFdJVEhPVVQgdGhlIHF1b3RlIGV2ZXIgYmVpbmcgc2VudFxuICAgICAgLy8gKHNlZSB0aGUgYHF1b3RlX3N0YXR1c19wcm9ncmVzc2lvbmAgdHJhbnNpdGlvbnMgYmVsb3cpOlxuICAgICAgLy8gICBcdTIwMjIgYGV4cGlyZWRgIFx1MjAxNCB0aGUgYHF1b3RlX2V4cGlyYXRpb25gIGZsb3cgc3dlZXBzIG9uIGBleHBpcmF0aW9uX2RhdGVgXG4gICAgICAvLyAgICAgYWxvbmUgYW5kIGV4cGlyZXMgbmV2ZXItc2VudCBkcmFmdHMgYXMgcmVhZGlseSBhcyBwcmVzZW50ZWQgb25lcy5cbiAgICAgIC8vICAgICBSZXF1aXJpbmcgYSByZWNpcGllbnQgdGhlcmUgd291bGQgbWFrZSBhIG5pZ2h0bHkgc3lzdGVtIHdyaXRlIGZhaWxcbiAgICAgIC8vICAgICBvbiBleGFjdGx5IHRoZSBxdW90ZXMgdGhhdCBoYXZlIG5vIHJlY2lwaWVudCBCRUNBVVNFIG5vYm9keSBzZW50XG4gICAgICAvLyAgICAgdGhlbSwgYW5kIHRoZSBzd2VlcCdzIGBydW5BczogJ3N5c3RlbSdgIHdvdWxkIG5vdCBleGVtcHQgaXQgXHUyMDE0IHRoZVxuICAgICAgLy8gICAgIGdhdGUgYXBwbGllcyBvbiB3cml0ZSwgbm90IG9uIGFjdG9yLlxuICAgICAgLy8gICBcdTIwMjIgYHJlamVjdGVkYCBcdTIwMTQgbGVnYWwgc3RyYWlnaHQgZnJvbSBgaW5fcmV2aWV3YCwgaS5lLiBhIHF1b3RlIGtpbGxlZFxuICAgICAgLy8gICAgIGludGVybmFsbHkgYmVmb3JlIGFueW9uZSBzYXcgaXQuIERlbWFuZGluZyBhIGNvbnRhY3QgdG8gZmlsZSB0aGF0XG4gICAgICAvLyAgICAgdmVyZGljdCBhc2tzIGZvciBhIHJlY2lwaWVudCB0aGUgcXVvdGUgbmV2ZXIgaGFkLlxuICAgICAgLy8gTmVpdGhlciBzdGF0ZSBwYXNzZXMgYW55dGhpbmcgb24gdG8gYSBjb250cmFjdCwgc28gbmVpdGhlciBuZWVkcyBvbmUuXG4gICAgICAvL1xuICAgICAgLy8gXHUyNkEwXHVGRTBGIGBoYXMocmVjb3JkLnN0YXR1cylgIGlzIGxvYWQtYmVhcmluZywgbm90IGRlY29yYXRpb24gXHUyMDE0IHRoZSBzYW1lIHRyYXBcbiAgICAgIC8vIGRvY3VtZW50ZWQgYXQgYGxlYWQub2JqZWN0LnRzYCdzIGR1cGxpY2F0ZSBsb29rdXBzOiBhIGJhcmVcbiAgICAgIC8vIGByZWNvcmQuc3RhdHVzID09IFwicHJlc2VudGVkXCJgIGFib3J0cyB3aXRoIGBObyBzdWNoIGtleWAgb24gYW55IG1lcmdlZFxuICAgICAgLy8gcmVjb3JkIHRoYXQgc2ltcGx5IG9taXRzIHRoZSBjb2x1bW4sIGFuZCB0aGUgZW5naW5lJ3MgYW5zd2VyIHRvIGFcbiAgICAgIC8vIHByZWRpY2F0ZSB0aGF0IGZhaWxzIHRvIGV2YWx1YXRlIGlzIHRvIFNLSVAgaXQgKFwicmVxdWlyZWRXaGVuIGZvclxuICAgICAgLy8gJ2NybV9jb250YWN0JyBmYWlsZWQgdG8gZXZhbHVhdGUgXHUyMDE0IHNraXBwZWRcIikuIFRoZSBydWxlIHdvdWxkIHRoZW4gcmVhZFxuICAgICAgLy8gYXMgZW5mb3JjZWQgYW5kIHJlcXVpcmUgbm90aGluZyBhdCBhbGwuXG4gICAgICAvL1xuICAgICAgLy8gQG9iamVjdHN0YWNrIDEyOiBzdHJpbmdbXSBgcmVmZXJlbmNlRmlsdGVyc2AgaXMgZGVhZCAobm90IHJlYWQgYnkgdGhlXG4gICAgICAvLyBwaWNrZXIpOyBgZGVwZW5kc09uYCBpcyB0aGUgbGl2ZSBjYXNjYWRpbmcgZm9ybSBcdTIwMTQgc2NvcGVzIGNvbnRhY3RzIHRvIHRoZVxuICAgICAgLy8gcXVvdGUncyBgY3JtX2FjY291bnRgIChBRFItMDA0OSkuXG4gICAgICBkZXBlbmRzT246IFsnY3JtX2FjY291bnQnXSxcbiAgICAgIHJlcXVpcmVkV2hlbjogUGBoYXMocmVjb3JkLnN0YXR1cykgJiYgKHJlY29yZC5zdGF0dXMgPT0gXCJwcmVzZW50ZWRcIiB8fCByZWNvcmQuc3RhdHVzID09IFwiYWNjZXB0ZWRcIilgLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdSZXF1aXJlZCBvbmNlIHRoZSBxdW90ZSBpcyBQcmVzZW50ZWQgb3IgQWNjZXB0ZWQgXHUyMDE0IHRoZSBkcmFmdGVkIGNvbnRyYWN0IHRha2VzIGl0cyBQcmltYXJ5IENvbnRhY3QgZnJvbSBoZXJlLicsXG4gICAgfSksXG5cbiAgICBjcm1fb3Bwb3J0dW5pdHk6IEZpZWxkLmxvb2t1cCgnY3JtX29wcG9ydHVuaXR5Jywge1xuICAgICAgbGFiZWw6ICdPcHBvcnR1bml0eScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIC8vIFNjb3BlIG9wcG9ydHVuaXRpZXMgdG8gdGhlIHF1b3RlJ3MgYWNjb3VudCAod2FzIGRlYWQgcmVmZXJlbmNlRmlsdGVycykuXG4gICAgICBkZXBlbmRzT246IFsnY3JtX2FjY291bnQnXSxcbiAgICB9KSxcblxuXG4gICAgLy8gU3RhdHVzXG4gICAgc3RhdHVzOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdEcmFmdCcsIHZhbHVlOiAnZHJhZnQnLCBjb2xvcjogJyM5OTk5OTknLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgIHsgbGFiZWw6ICdJbiBSZXZpZXcnLCB2YWx1ZTogJ2luX3JldmlldycsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1ByZXNlbnRlZCcsIHZhbHVlOiAncHJlc2VudGVkJywgY29sb3I6ICcjNDE2OUUxJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQWNjZXB0ZWQnLCB2YWx1ZTogJ2FjY2VwdGVkJywgY29sb3I6ICcjMDBBQTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUmVqZWN0ZWQnLCB2YWx1ZTogJ3JlamVjdGVkJywgY29sb3I6ICcjRkYwMDAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRXhwaXJlZCcsIHZhbHVlOiAnZXhwaXJlZCcsIGNvbG9yOiAnIzY2NjY2NicgfSxcbiAgICAgIF0sXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIERhdGVzXG4gICAgcXVvdGVfZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBsYWJlbDogJ1F1b3RlIERhdGUnLFxuICAgICAgZ3JvdXA6ICd0ZXJtcycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgZGVmYXVsdFZhbHVlOiBjZWxgdG9kYXkoKWAsXG4gICAgfSksXG4gICAgXG4gICAgZXhwaXJhdGlvbl9kYXRlOiBGaWVsZC5kYXRlKHtcbiAgICAgIGxhYmVsOiAnRXhwaXJhdGlvbiBEYXRlJyxcbiAgICAgIGdyb3VwOiAndGVybXMnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBQcmljaW5nXG4gICAgLy8gc3VidG90YWwvZGlzY291bnRfYW1vdW50L3RvdGFsX3ByaWNlIGFyZSBOT1QgYHJlYWRvbmx5YCwgYW5kIHRoZSB3cml0ZXJcbiAgICAvLyB0aGF0IGRlY2lkZXMgaXQgaXMgdGhlIExJTkUtSVRFTSBST0xMVVAgXHUyMDE0IG5vdCB0aGUgZmxvdyB0aGlzIG5vdGUgdXNlZCB0b1xuICAgIC8vIG5hbWUuIGBxdW90ZV90b3RhbF9yb2xsdXBgIChgcXVvdGVfbGluZV9pdGVtLmhvb2sudHNgKSByZWNvbXB1dGVzIGFsbFxuICAgIC8vIHRocmVlIG9uIGV2ZXJ5IGxpbmUgaW5zZXJ0L3VwZGF0ZS9kZWxldGUgdGhyb3VnaFxuICAgIC8vIGBhcGkub2JqZWN0KCdjcm1fcXVvdGUnKS51cGRhdGUoLi4uKWA6IGEgY3Jvc3MtcmVjb3JkIHdyaXRlIHZpYSBgY3R4LmFwaWAsXG4gICAgLy8gd2hpY2ggaXMgYSBgU2NvcGVkQ29udGV4dGAgb3ZlciB0aGUgQUNUSU5HIFVTRVIncyBjb250ZXh0LiBUaGUga2V5cyBhcmVcbiAgICAvLyB0aGVyZWZvcmUgQ0FMTEVSLXN1cHBsaWVkIHRvIGEgbm9uLWBpc1N5c3RlbWAgVVBEQVRFLCBleGFjdGx5IHdoYXRcbiAgICAvLyBgc3RyaXBSZWFkb25seUZpZWxkc2AgZGVsZXRlcyBcdTIwMTQgd2l0aCBgcmVhZG9ubHlgIG9uLCBhIHF1b3RlJ3MgdG90YWxzIHdvdWxkXG4gICAgLy8gZnJlZXplIGF0IHdoYXRldmVyIHRoZSBmbG93IGZpcnN0IHNlZWRlZCBhbmQgbmV2ZXIgdHJhY2sgaXRzIGxpbmVzIGFnYWluLlxuICAgIC8vIFx1MjZBMFx1RkUwRiBgcXVvdGVfZ2VuZXJhdGlvbmAgd3JpdGVzIHRoZW0gdG9vLCBidXQgYXQgQ1JFQVRFIHRpbWUsIGFuZCB0aGUgc3RyaXBcbiAgICAvLyBpcyBhbiBVUERBVEUtcGF0aCBydWxlIFx1MjAxNCB0aGF0IHdyaXRlIHdvdWxkIHN1cnZpdmUgYHJlYWRvbmx5YCB1bnRvdWNoZWQuXG4gICAgLy8gVGhlIHJldGlyZWQgMTYueCBjbGFpbSByZXN0ZWQgb24gdGhhdCBjcmVhdGUtdGltZSB3cml0ZSwgd2hpY2ggaXMgaG93IHRoaXNcbiAgICAvLyBub3RlIHJlYWNoZWQgYSByaWdodCBjb25jbHVzaW9uIGZyb20gdGhlIHdyb25nIHdyaXRlci5cbiAgICAvLyBNZWFzdXJlZCBpbiBgdGVzdC9yZWFkb25seS13cml0ZS1zZW1hbnRpY3MudGVzdC50c2AgKGluc2VydCBpcyBleGVtcHQpIGFuZFxuICAgIC8vIGB0ZXN0L2FjdGl2aXR5LXJlY2VuY3kudGVzdC50c2AgKHRoZSBgY3R4LmFwaWAgc3RyaXAsIG9uIHRoZSByZWFsIGVuZ2luZSkuXG4gICAgc3VidG90YWw6IEZpZWxkLmN1cnJlbmN5KHsgXG4gICAgICBsYWJlbDogJ1N1YnRvdGFsJyxcbiAgICAgIGdyb3VwOiAncHJpY2luZycsXG4gICAgfSksXG4gICAgXG4gICAgZGlzY291bnQ6IEZpZWxkLnBlcmNlbnQoe1xuICAgICAgbGFiZWw6ICdEaXNjb3VudCAlJyxcbiAgICAgIGdyb3VwOiAncHJpY2luZycsXG4gICAgICBzY2FsZTogMixcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogMTAwLFxuICAgIH0pLFxuICAgIFxuICAgIGRpc2NvdW50X2Ftb3VudDogRmllbGQuY3VycmVuY3koeyBcbiAgICAgIGxhYmVsOiAnRGlzY291bnQgQW1vdW50JyxcbiAgICAgIGdyb3VwOiAncHJpY2luZycsXG4gICAgfSksXG4gICAgXG4gICAgdGF4OiBGaWVsZC5jdXJyZW5jeSh7IFxuICAgICAgbGFiZWw6ICdUYXgnLFxuICAgICAgZ3JvdXA6ICdwcmljaW5nJyxcbiAgICB9KSxcbiAgICBcbiAgICBzaGlwcGluZ19oYW5kbGluZzogRmllbGQuY3VycmVuY3koeyBcbiAgICAgIGxhYmVsOiAnU2hpcHBpbmcgJiBIYW5kbGluZycsXG4gICAgICBncm91cDogJ3ByaWNpbmcnLFxuICAgIH0pLFxuICAgIFxuICAgIHRvdGFsX3ByaWNlOiBGaWVsZC5jdXJyZW5jeSh7IFxuICAgICAgbGFiZWw6ICdUb3RhbCBQcmljZScsXG4gICAgICBncm91cDogJ3ByaWNpbmcnLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIFRlcm1zXG4gICAgcGF5bWVudF90ZXJtczogRmllbGQuc2VsZWN0KHtcbiAgICAgIGxhYmVsOiAnUGF5bWVudCBUZXJtcycsXG4gICAgICBncm91cDogJ3Rlcm1zJyxcbiAgICAgIC8vIENhbm9uaWNhbCBzZXQgc2hhcmVkIHdpdGggQ29udHJhY3QgKCM0OTApIFx1MjAxNCBzZWUgX3BpY2tsaXN0cy50cy5cbiAgICAgIG9wdGlvbnM6IFsuLi5QQVlNRU5UX1RFUk1TX09QVElPTlNdLFxuICAgIH0pLFxuICAgIFxuICAgIHNoaXBwaW5nX3Rlcm1zOiBGaWVsZC50ZXh0KHtcbiAgICAgIGxhYmVsOiAnU2hpcHBpbmcgVGVybXMnLFxuICAgICAgZ3JvdXA6ICd0ZXJtcycsXG4gICAgICBtYXhMZW5ndGg6IDI1NSxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBCaWxsaW5nICYgU2hpcHBpbmcgQWRkcmVzc1xuICAgIGJpbGxpbmdfYWRkcmVzczogRmllbGQuYWRkcmVzcyh7XG4gICAgICBsYWJlbDogJ0JpbGxpbmcgQWRkcmVzcycsXG4gICAgICBncm91cDogJ2FkZHJlc3MnLFxuICAgIH0pLFxuXG4gICAgc2hpcHBpbmdfYWRkcmVzczogRmllbGQuYWRkcmVzcyh7XG4gICAgICBsYWJlbDogJ1NoaXBwaW5nIEFkZHJlc3MnLFxuICAgICAgZ3JvdXA6ICdhZGRyZXNzJyxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBOb3Rlc1xuICAgIGRlc2NyaXB0aW9uOiBGaWVsZC5tYXJrZG93bih7XG4gICAgICBsYWJlbDogJ0Rlc2NyaXB0aW9uJyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuICAgIFxuICAgIGludGVybmFsX25vdGVzOiBGaWVsZC50ZXh0YXJlYSh7XG4gICAgICBsYWJlbDogJ0ludGVybmFsIE5vdGVzJyxcbiAgICAgIGdyb3VwOiAnc3lzdGVtJyxcbiAgICB9KSxcbiAgfSxcbiAgXG4gIC8vIERhdGFiYXNlIGluZGV4ZXNcbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ2NybV9hY2NvdW50J10gfSxcbiAgICB7IGZpZWxkczogWydjcm1fb3Bwb3J0dW5pdHknXSB9LFxuICAgIHsgZmllbGRzOiBbJ293bmVyX2lkJ10gfSxcbiAgICB7IGZpZWxkczogWydzdGF0dXMnXSB9LFxuICAgIHsgZmllbGRzOiBbJ3F1b3RlX2RhdGUnXSB9LFxuICBdLFxuICBcbiAgLy8gRW5hYmxlIGFkdmFuY2VkIGZlYXR1cmVzXG4gIC8vIEFQSSBzdXJmYWNlLiBIaXN0b3J5IFx1MjE5MiBGaWVsZC50cmFja0hpc3RvcnkgKEFEUi0wMDUyKS5cbiAgZW5hYmxlOiB7XG4gICAgYXBpRW5hYmxlZDogdHJ1ZSxcbiAgICBhcGlNZXRob2RzOiBbJ2dldCcsICdsaXN0JywgJ2NyZWF0ZScsICd1cGRhdGUnLCAnZGVsZXRlJ10sXG4gICAgLy8gIzYwMiBcdTIwMTQgdGhlIGdlbmVyYXRlZCBxdW90ZSBQREYgYW5kIHRoZSBjdXN0b21lcidzIGNvdW50ZXJzaWduZWQgY29weS5cbiAgICAvLyBTZWUgdGhlIGNhbm9uaWNhbCBjYXBhYmlsaXR5IG5vdGUgaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYC5cbiAgICBmaWxlczogdHJ1ZSxcbiAgfSxcbiAgXG4gIC8vIFZhbGlkYXRpb24gUnVsZXNcbiAgLy9cbiAgLy8gUHJlZGljYXRlcyBiZWxvdyBhcmUgVE9UQUw6IGV2ZXJ5IGByZWNvcmQueGAgcmVhZCBpcyBgaGFzKClgLWd1YXJkZWQsIHNvIHRoZVxuICAvLyBydWxlIHJldHVybnMgYSB2ZXJkaWN0IGV2ZW4gd2hlbiB0aGUgbWVyZ2VkIHJlY29yZCBoYXMgbm8gc3VjaCBrZXkuIFNlZVxuICAvLyBBR0VOVFMubWQgXCJWYWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTFwiIGFuZFxuICAvLyB0ZXN0L29iamVjdC12YWxpZGF0aW9uLXByZWRpY2F0ZXMudGVzdC50cywgd2hpY2ggZmFpbHMgdGhlIGJ1aWxkIG90aGVyd2lzZS5cbiAgdmFsaWRhdGlvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnZXhwaXJhdGlvbl9hZnRlcl9xdW90ZScsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0V4cGlyYXRpb24gRGF0ZSBtdXN0IGJlIGFmdGVyIFF1b3RlIERhdGUnLFxuICAgICAgY29uZGl0aW9uOiBQYGhhcyhyZWNvcmQuZXhwaXJhdGlvbl9kYXRlKSAmJiByZWNvcmQuZXhwaXJhdGlvbl9kYXRlICE9IG51bGwgJiYgaGFzKHJlY29yZC5xdW90ZV9kYXRlKSAmJiByZWNvcmQucXVvdGVfZGF0ZSAhPSBudWxsICYmIHJlY29yZC5leHBpcmF0aW9uX2RhdGUgPD0gcmVjb3JkLnF1b3RlX2RhdGVgLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gIzU5OS4gVGhlIG9ubHkgZGlzY291bnQgY29uc3RyYWludCB0aGlzIG9iamVjdCBldmVyIGhhZCB3YXMgdGhlIGZpZWxkJ3NcbiAgICAgIC8vIG93biBgbWF4OiAxMDBgIFx1MjAxNCB0aGUgYXJpdGhtZXRpYyBkb21haW4gb2YgYSBwZXJjZW50YWdlIFx1MjAxNCBzbyBhIHJlcCBjb3VsZFxuICAgICAgLy8gcHV0IDkwJSBvZmYgYSAkOTlLIGRlYWwgb24gYSBxdW90ZSBhbmQgbm90aGluZyBhbnl3aGVyZSBvYmplY3RlZDogdGhlXG4gICAgICAvLyBhcHByb3ZhbCBmbG93IGtleXMgb24gdGhlIG9wcG9ydHVuaXR5J3MgQU1PVU5ULCBhbmQgJDk5SyBpcyB1bmRlciB0aGVcbiAgICAgIC8vIGxhcmdlLWRlYWwgbGluZS4gVGhpcyBpcyB0aGUgcG9saWN5IGNlaWxpbmcgdGhhdCBjb25zdHJhaW50IG5ldmVyIHdhcy5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgQSBwcmVkaWNhdGUgb2YgYHJlY29yZC5kaXNjb3VudCA+IDEwMGAgaGVyZSB3b3VsZCBiZSBERUFEOiBmaWVsZC1sZXZlbFxuICAgICAgLy8gYm91bmRzIGFyZSBldmFsdWF0ZWQgQkVGT1JFIG9iamVjdCB2YWxpZGF0aW9ucywgc28gYGRpc2NvdW50OiAxNTBgIGlzXG4gICAgICAvLyBhbHJlYWR5IHJlZnVzZWQgYnkgYG1heDogMTAwYCB3aXRoIGBjb2RlOiAnbWF4X3ZhbHVlJ2AgYW5kIHRoZSBtZXNzYWdlXG4gICAgICAvLyBcIkRpc2NvdW50ICUgbXVzdCBiZSBcdTIyNjQgMTAwXCIsIGFuZCB0aGUgcnVsZSdzIG93biBtZXNzYWdlIGlzIHVucmVhY2hhYmxlIG9uXG4gICAgICAvLyBldmVyeSBpbnB1dCB0aGF0IGNvdWxkIHJlYWNoIGl0LlxuICAgICAgLy9cbiAgICAgIC8vICMjIyBXaHkgYSBzY3JpcHQgdmFsaWRhdGlvbiBhbmQgbm90IGEgbG93ZXIgYG1heGAgb24gdGhlIGZpZWxkXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyBpcyBhbiBJTlZBUklBTlQgXHUyMDE0IFwiYSBxdW90ZSdzIGRpc2NvdW50IG1heSBuZXZlciBleGNlZWQgdGhlXG4gICAgICAvLyBjZWlsaW5nXCIgXHUyMDE0IG5vdCBhIHRyYW5zaXRpb24gY29uZGl0aW9uLCBhbmQgIzEwNjkgaXMgb3BlbiBvbiBleGFjdGx5XG4gICAgICAvLyB0aGF0IGRpc3RpbmN0aW9uIGZvciBgcmVxdWlyZWRXaGVuYC4gQm90aCBpbnN0cnVtZW50cyB3ZXJlIG1lYXN1cmVkXG4gICAgICAvLyBhZ2FpbnN0IGEgcm93IHN0b3JlZCBhYm92ZSB0aGUgY2VpbGluZyBiZWZvcmUgdGhlIHJ1bGUgZXhpc3RlZFxuICAgICAgLy8gKGB0ZXN0L3F1b3RlLWRpc2NvdW50LWNlaWxpbmcudGVzdC50c2AgcnVucyB0aGUgbWVhc3VyZW1lbnQpOlxuICAgICAgLy9cbiAgICAgIC8vICAgRmllbGQucGVyY2VudCh7IG1heDogNjAgfSkgICBsZWdhY3kgcm93LCB1bnJlbGF0ZWQgZWRpdCBcdTIxOTIgQURNSVRURURcbiAgICAgIC8vICAgdGhpcyBydWxlICAgICAgICAgICAgICAgICAgICBsZWdhY3kgcm93LCB1bnJlbGF0ZWQgZWRpdCBcdTIxOTIgUkVGVVNFRFxuICAgICAgLy9cbiAgICAgIC8vIEEgZmllbGQgYm91bmQgY2hlY2tzIHRoZSB2YWx1ZSBiZWluZyBXUklUVEVOOyBhIHNjcmlwdCB2YWxpZGF0aW9uIGlzXG4gICAgICAvLyBldmFsdWF0ZWQgYWdhaW5zdCB0aGUgTUVSR0VEIHJlY29yZCBvbiBldmVyeSB3cml0ZS4gU28gYG1heGAgY2Fycmllc1xuICAgICAgLy8gdGhlIHNhbWUgc2lsZW50IGxlZ2FjeSBob2xlICMxMDY5IGRlc2NyaWJlcywgaW4gYSBzZWNvbmQgaW5zdHJ1bWVudCxcbiAgICAgIC8vIGFuZCB0aGUgcnVsZSBkb2VzIG5vdC4gVGhlIGNvc3Qgb2YgdGhlIGludmFyaWFudCwgc3RhdGVkIHJhdGhlciB0aGFuXG4gICAgICAvLyBoaWRkZW46IGFuIG92ZXItY2VpbGluZyByb3cgaXMgZnJvemVuIHRvIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSByZXBhaXIgXHUyMDE0XG4gICAgICAvLyBicmluZ2luZyB0aGUgZGlzY291bnQgYmFjayB1bmRlciB0aGUgY2VpbGluZyBpcyBhZG1pdHRlZCwgYW5kIGlzIGFuXG4gICAgICAvLyBvcmRpbmFyeSBlZGl0LiBIb3RDUk0gc2hpcHMgbm8gc3VjaCByb3cgKGRlZXBlc3Qgc2VlZGVkIGRpc2NvdW50OiAyMCUpLlxuICAgICAgLy9cbiAgICAgIC8vIGBtYXg6IDEwMGAgc3RheXMgb24gdGhlIGZpZWxkIGFzIHRoZSBkb21haW4gb2YgYSBwZXJjZW50YWdlLiBUaGUgcG9saWN5XG4gICAgICAvLyBudW1iZXIgbGl2ZXMgaW4gYF90aHJlc2hvbGRzLnRzYCwgaW50ZXJwb2xhdGVkIGludG8gYm90aCB0aGUgcHJlZGljYXRlXG4gICAgICAvLyBhbmQgdGhlIG1lc3NhZ2Ugc28gdGhlIHR3byBjYW5ub3QgZGlzYWdyZWUuXG4gICAgICBuYW1lOiAnZGlzY291bnRfd2l0aGluX2NlaWxpbmcnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6IGBEaXNjb3VudCBjYW5ub3QgZXhjZWVkICR7UVVPVEVfRElTQ09VTlRfQ0VJTElOR30lYCxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmRpc2NvdW50KSAmJiByZWNvcmQuZGlzY291bnQgIT0gbnVsbCAmJiByZWNvcmQuZGlzY291bnQgPiAke1FVT1RFX0RJU0NPVU5UX0NFSUxJTkd9YCxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vICM1NzUgQjQuIGBjcm1fcXVvdGVgIGhhZCBhIGZ1bGwgbGlmZWN5Y2xlIHZvY2FidWxhcnkgYW5kIG5vIHRyYW5zaXRpb25cbiAgICAgIC8vIGNvbnN0cmFpbnQgd2hhdHNvZXZlciBcdTIwMTQgbm9yIGEgc3RhdHVzIGd1YXJkIGluIGBxdW90ZS5ob29rLnRzYCBcdTIwMTQgc28gYVxuICAgICAgLy8gcXVvdGUgY291bGQgZ28gc3RyYWlnaHQgZnJvbSBgZHJhZnRgIHRvIGBhY2NlcHRlZGAsIHdoaWNoIGluIENQUSB0ZXJtc1xuICAgICAgLy8gaXMgYSBzaWduZWQgbnVtYmVyIG5vYm9keSByZXZpZXdlZCBvciBzZW50LiBgd2FybmluZ2Agc2V2ZXJpdHkgbWF0Y2hlc1xuICAgICAgLy8gdGhlIGxlYWQgLyBvcHBvcnR1bml0eSAvIGNhc2UgbWFjaGluZXM6IGl0IGZsYWdzIHRoZSBqdW1wIG9uIHRoZSByZWNvcmRcbiAgICAgIC8vIHdpdGhvdXQgYmxvY2tpbmcgYSBzdXBwb3J0LWRyaXZlbiBjb3JyZWN0aW9uLlxuICAgICAgbmFtZTogJ3F1b3RlX3N0YXR1c19wcm9ncmVzc2lvbicsXG4gICAgICB0eXBlOiAnc3RhdGVfbWFjaGluZScsXG4gICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgbWVzc2FnZTogJ0ludmFsaWQgcXVvdGUgc3RhdHVzIHRyYW5zaXRpb24nLFxuICAgICAgZmllbGQ6ICdzdGF0dXMnLFxuICAgICAgdHJhbnNpdGlvbnM6IHtcbiAgICAgICAgLy8gYFx1MjE5MiBleHBpcmVkYCBpcyBsZWdhbCBmcm9tIGV2ZXJ5IFVOU0VUVExFRCBzdGF0ZTogdGhlIHF1b3RlX2V4cGlyYXRpb25cbiAgICAgICAgLy8gZmxvdyBzd2VlcHMgb24gYGV4cGlyYXRpb25fZGF0ZWAgYWxvbmUgYW5kIGV4cGlyZXMgZHJhZnRzIHRoYXQgd2VyZVxuICAgICAgICAvLyBuZXZlciBzZW50IGFzIHJlYWRpbHkgYXMgcHJlc2VudGVkIG9uZXMuXG4gICAgICAgIGRyYWZ0OiBbJ2luX3JldmlldycsICdleHBpcmVkJ10sXG4gICAgICAgIGluX3JldmlldzogWydkcmFmdCcsICdwcmVzZW50ZWQnLCAncmVqZWN0ZWQnLCAnZXhwaXJlZCddLFxuICAgICAgICBwcmVzZW50ZWQ6IFsnYWNjZXB0ZWQnLCAncmVqZWN0ZWQnLCAnZXhwaXJlZCddLFxuICAgICAgICAvLyBgYWNjZXB0ZWRgIGFuZCBgZXhwaXJlZGAgYXJlIHRlcm1pbmFsLCBhbmQgbm90IG9ubHkgYnkgY29udmVudGlvbiBcdTIwMTRcbiAgICAgICAgLy8gYHF1b3RlX3ByaWNpbmdfZ3VhcmRgIGluIHF1b3RlLmhvb2sudHMgZnJlZXplcyBib3RoLCBhbGxvd2luZyBlZGl0c1xuICAgICAgICAvLyB0byBgaW50ZXJuYWxfbm90ZXNgIGFuZCBub3RoaW5nIGVsc2UuXG4gICAgICAgIGFjY2VwdGVkOiBbXSxcbiAgICAgICAgZXhwaXJlZDogW10sXG4gICAgICAgIC8vIEEgcmVqZWN0ZWQgcXVvdGUgaXMgbm90IGZyb3plbjogdGhlIHJlcCByZXZpc2VzIHRoZSBudW1iZXJzIGFuZFxuICAgICAgICAvLyByZS1pc3N1ZXMsIHdoaWNoIHN0YXJ0cyBhZ2FpbiBhdCBgZHJhZnRgLlxuICAgICAgICByZWplY3RlZDogWydkcmFmdCddLFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxuICBcbiAgLy8gV29ya2Zsb3cgUnVsZXNcbiAgLy8gXHUyNkEwXHVGRTBGIE5vIGB3b3JrZmxvd3NbXWAgaGVyZSwgYW5kIG5vbmUgaXMgcG9zc2libGU6IG9iamVjdCBgd29ya2Zsb3dzW11gIHdlcmVcbiAgLy8gcmVtb3ZlZCBmcm9tIHRoZSBwbGF0Zm9ybS4gRmllbGQgdXBkYXRlcyBsaXZlIGluIHRoaXMgb2JqZWN0J3MgYCouaG9vay50c2A7XG4gIC8vIHNjaGVkdWxlZCBzdGF0dXMgZmxpcHMgYW5kIG5vdGlmaWNhdGlvbnMgbGl2ZSBpbiBgc3JjLyovZmxvd3MvKi5mbG93LnRzYC5cbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0cy9fdGhyZXNob2xkcy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvX3RocmVzaG9sZHMudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogQ29tbWVyY2lhbCBnb3Zlcm5hbmNlIHRocmVzaG9sZHMgXHUyMDE0IHRoZSBtb25leSBsaW5lcyB0aGlzIGFwcCBkcmF3cywgYXV0aG9yZWRcbiAqIE9OQ0UuXG4gKlxuICogXCJXaGF0IGNvdW50cyBhcyBhIGxhcmdlIGRlYWxcIiBpcyBvbmUgYnVzaW5lc3MgcXVlc3Rpb24gd2l0aCBmb3VyIGNvbnN1bWVyczpcbiAqIHRoZSBhcHByb3ZhbCBlbnRyeSBnYXRlIGFuZCB0aGUgd29uLWRlYWwgYWxlcnQgKGBzcmMvc2FsZXMvZmxvd3MvYCksIGFuZCB0aGVcbiAqIHNhbGVzLWRpcmVjdG9yIGFuZCBleGVjdXRpdmUgcnVsZXMgKGBzcmMvc2FsZXMvc2hhcmluZy9vcHBvcnR1bml0eS5zaGFyaW5nLnRzYCkuXG4gKiBFYWNoIGludGVycG9sYXRlcyB0aGUgY29uc3RhbnQgYmVsb3csIGFuZCBlYWNoIGN1dHMgYXQgYD49YC5cbiAqXG4gKiBcdTI2RDQgQm90aCBoYWx2ZXMgYXJlIGxvYWQtYmVhcmluZywgYW5kIG5laXRoZXIgbWF5IGRyaWZ0LiBGb3VyIGluZGVwZW5kZW50XG4gKiBsaXRlcmFscyBtZWFuIGEgZGVwbG95bWVudCB0aGF0IHJhaXNlcyB0aGUgYmFyIGluIG9uZSBwbGFjZSBzaGlwcyBhIHByb2R1Y3RcbiAqIHdoZXJlIGEgZGVhbCBpcyBsYXJnZSBlbm91Z2ggZm9yIHRoZSBkaXJlY3RvciB0byAqc2VlKiBhbmQgbm90IGxhcmdlIGVub3VnaFxuICogdG8gKmFwcHJvdmUqIFx1MjAxNCBnb3Zlcm5hbmNlIG5hcnJvd2VyIHRoYW4gdmlzaWJpbGl0eSwgd2hpY2ggaXMgdGhlXG4gKiBjb3VudGVyLWludHVpdGl2ZSBkaXJlY3Rpb24gdGhlIG5leHQgYXV0aG9yIHdpbGwgYXNzdW1lIHRoZSByZXZlcnNlIG9mLlxuICogTWFpbnRhaW5lciBydWxpbmc6ICoqYSBkZWFsIGF0IHRoZSBsaW5lIGlzIGEgbGFyZ2UgZGVhbCoqLCBzbyBldmVyeSBzaXRlIGN1dHNcbiAqIGF0IGA+PWAgcmF0aGVyIHRoYW4gYD5gLiBgdGVzdC9kZWFsLXRocmVzaG9sZC1wYXJpdHkudGVzdC50c2AgcmVhZHMgdGhlXG4gKiBjb21waWxlZCBDRUwgb2YgZXZlcnkgZmxvdyBjb25kaXRpb24gYW5kIHNoYXJpbmcgcnVsZSBiYWNrIG91dCBvZiB0aGUgc2hpcHBlZFxuICogbWV0YWRhdGEgYW5kIGZhaWxzIGlmIGFueSBzaXRlIHN0b3BzIGFncmVlaW5nIG9uIHRoZSBudW1iZXIgT1IgdGhlIG9wZXJhdG9yLlxuICpcbiAqIElmIGEgcmVhc29uIGV2ZXIgYXBwZWFycyBmb3IgbGVhZGVyc2hpcCB0byBzZWUgYSBkZWFsIHRoYXQgbmVlZHMgbm8gYXBwcm92YWwsXG4gKiB0aGF0IHJlYXNvbiBiZWxvbmdzICoqaGVyZSoqLCBuZXh0IHRvIHRoZSBjb25zdGFudCwgYW5kIHRoZSBzcGxpdCBiZWNvbWVzIGFcbiAqIGRlc2lnbiBpbnN0ZWFkIG9mIGRyaWZ0LiBOb3RoaW5nIGluIHRoaXMgcmVwbyBtYWtlcyB0aGF0IGFyZ3VtZW50IHRvZGF5LlxuICpcbiAqIGBISUdIX1ZBTFVFX0RFQUxfQU1PVU5UYCBiZWxvdyBpcyBkZWxpYmVyYXRlbHkgTk9UIHBhcnQgb2YgdGhhdCBndWFyYW50ZWU6XG4gKiBpdHMgYD5gIGFuZCBgPD1gIGhhbHZlcyBhcmUgb25lIGJyYW5jaCBzdGF0ZWQgaW4gY29tcGxlbWVudGFyeSBwb2xhcml0eSxcbiAqIHdoaWNoIG11c3QgUEFSVElUSU9OIHJhdGhlciB0aGFuIGFncmVlLiBUd28gb3BlcmF0b3JzIHRoZXJlIGFyZSB0aGUgZGVzaWduLlxuICovXG5cbi8qKlxuICogQSBcImxhcmdlIGRlYWxcIiBcdTIwMTQgdGhlIGFtb3VudCBhdCB3aGljaCBhbiBvcHBvcnR1bml0eSBzdG9wcyBiZWluZyByb3V0aW5lLlxuICpcbiAqIENvbnN1bWVkIGJ5IHRoZSBhcHByb3ZhbCBlbnRyeSBnYXRlLCB0aGUgd29uLWRlYWwgYWxlcnQgYW5kIGJvdGggbGFyZ2UtZGVhbFxuICogc2hhcmluZyBydWxlcy4gYHNyYy9kb2NzL2NybV9zYWxlcy5tZGAgYW5kIGBzcmMvZG9jcy9jcm1fYWRtaW4ubWRgIHB1Ymxpc2hcbiAqIHRoaXMgbnVtYmVyIHRvIHVzZXJzLCBhbmQgYHRlc3QvZG9jcy1kcmlmdC50ZXN0LnRzYCBmYWlscyBpZiB0aGV5IGRyaWZ0IGZyb21cbiAqIHdoYXQgdGhlIGZsb3dzIGFjdHVhbGx5IHNoaXAuXG4gKi9cbmV4cG9ydCBjb25zdCBMQVJHRV9ERUFMX0FNT1VOVCA9IDEwMF8wMDA7XG5cbi8qKlxuICogVGhlIHNlY29uZCBhcHByb3ZhbCB0aWVyIFx1MjAxNCBhYm92ZSB0aGlzIGEgU2FsZXMgRGlyZWN0b3Igc2lnbnMgb2ZmIGFzIHdlbGwgYXNcbiAqIHRoZSBtYW5hZ2VyLiBDb25zdW1lZCBieSB0aGUgYGNoZWNrX2hpZ2hfdmFsdWVgIGJyYW5jaCBvZlxuICogYG9wcG9ydHVuaXR5LWFwcHJvdmFsLmZsb3cudHNgLCBpbiBib3RoIHBvbGFyaXRpZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBISUdIX1ZBTFVFX0RFQUxfQU1PVU5UID0gNTAwXzAwMDtcblxuLyoqXG4gKiBUaGUgaGFyZCBjZWlsaW5nIG9uIGEgZGlzY291bnQgcGVyY2VudGFnZSwgaW4gcGVyY2VudCBcdTIwMTQgb24gYSBxdW90ZSwgYW5kIG9uXG4gKiBlYWNoIG9mIGl0cyBsaW5lIGl0ZW1zLlxuICpcbiAqICMjIyBPbmUgbnVtYmVyLCB0d28gcnVsZXMsIGJlY2F1c2UgYSBxdW90ZSdzIHRvdGFsIGhhcyB0d28gbXVsdGlwbGllcnNcbiAqXG4gKiBgY3JtX3F1b3RlLmRpc2NvdW50X3dpdGhpbl9jZWlsaW5nYCBhbmRcbiAqIGBjcm1fcXVvdGVfbGluZV9pdGVtLmRpc2NvdW50X3dpdGhpbl9jZWlsaW5nYCBib3RoIGludGVycG9sYXRlIHRoaXMgY29uc3RhbnQuXG4gKiBUaGUgc2Vjb25kIGlzIG5vdCBhIGNvcHkgZm9yIHN5bW1ldHJ5J3Mgc2FrZTogdGhlIHF1b3RlLWxldmVsIHBlcmNlbnRhZ2UgYW5kXG4gKiB0aGUgcGVyLWxpbmUgcGVyY2VudGFnZSBhcmUgSU5ERVBFTkRFTlQgaW5wdXRzIHRvIHRoZSBzYW1lIHRvdGFsXG4gKiAoYHF1b3RlX3RvdGFsX3JvbGx1cGAgZGlzY291bnRzIGVhY2ggbGluZSwgc3VtcywgdGhlbiBhcHBsaWVzIHRoZSBxdW90ZSdzXG4gKiBwZXJjZW50YWdlIHRvIHRoZSBzdW0pLCBzbyBhIHF1b3RlIGF0IGBkaXNjb3VudDogMGAgd2l0aCBldmVyeSBsaW5lIGF0IDkwJVxuICogY2xlYXJzIHRoZSBxdW90ZS1sZXZlbCBydWxlIG91dHJpZ2h0IGFuZCBzdGlsbCBwcmljZXMgOTAlIGJlbG93IGxpc3QuXG4gKiBDZWlsaW5nIG9uZSBtdWx0aXBsaWVyIGFuZCB0aGUgb3RoZXIgaXMgdGhlIHdheSBhcm91bmQgaXQuXG4gKlxuICogXHUyNkEwXHVGRTBGIFdoYXQgdGhpcyBjb25zdGFudCBkb2VzIE5PVCBzZXR0bGUgaXMgd2hhdCB0aGUgY2VpbGluZyBtZWFucyBvbmNlIHRoZSB0d29cbiAqIG11bHRpcGxpZXJzIENPTVBPVU5EIFx1MjAxNCA2MCUgcGVyIGxpbmUgYW5kIDYwJSBvbiB0aGUgcXVvdGUgaXMgfjg0JSBlZmZlY3RpdmUuXG4gKiBUaGF0IGlzIGFuIG9wZW4gYnVzaW5lc3MtcG9saWN5IHF1ZXN0aW9uLCBhbmQgbmVpdGhlciBydWxlIHByZXRlbmRzIHRvIGFuc3dlclxuICogaXQuXG4gKlxuICogIyMjIFdoeSA2MCwgYW5kIHdoeSBvbmx5IG9uZSBudW1iZXJcbiAqXG4gKiBUaGUgY2VpbGluZyBpcyBBQlNPTFVURSBcdTIwMTQgdGhlcmUgaXMgbm8gYXBwcm92YWwgcGF0aCB0byB1bmJsb2NrIGEgcXVvdGUgYWJvdmVcbiAqIGl0LiBBIGJsb2NraW5nIHJ1bGUgd2l0aCBubyBvdmVycmlkZSBoYXMgdG8gc2l0IHdoZXJlIHJlZnVzaW5nIGlzXG4gKiB1bmFtYmlndW91c2x5IHJpZ2h0LCBub3Qgd2hlcmUgcmV2aWV3aW5nIHdvdWxkIGJlIHVzZWZ1bC4gMzAlIHdvdWxkIHJlZnVzZVxuICogYWdncmVzc2l2ZS1idXQtcmVhbCBjb21tZXJjaWFsIGRlYWxzIG91dHJpZ2h0IGFuZCBsZWF2ZSB0aGUgcmVwIG5vdGhpbmcgdG8gZG9cbiAqIGFib3V0IGl0OyA2MCUgcmVmdXNlcyBcImEgcmVwIGNhbiBnaXZlIDkwJSBvZmYgYSAkOTlLIGRlYWwgYW5kIG5vdGhpbmcgcmV2aWV3c1xuICogaXRcIiB3aGlsZSBsZWF2aW5nIGdlbnVpbmUgc3RyYXRlZ2ljIHByaWNpbmcgYWxvbmUuIFRoZSBzdG9jayBjYXRhbG9ndWVcbiAqIGFncmVlczogdGhlIGRlZXBlc3QgZGlzY291bnQgSG90Q1JNIHNlZWRzIGFueXdoZXJlIGlzIDIwJVxuICogKGBzcmMvPHBrZz4vZGF0YS8qLnNlZWQudHNgKS5cbiAqXG4gKiBcdTI2RDQgVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIFNPRlQgY2VpbGluZyBjb25zdGFudCBiZXNpZGUgaXQuIEEgc29mdCB0aWVyIGhhc1xuICogZXhhY3RseSBvbmUgcG9zc2libGUgY29uc3VtZXIgXHUyMDE0IGRpc2NvdW50LXRyaWdnZXJlZCBhcHByb3ZhbCByb3V0aW5nIFx1MjAxNCB3aGljaFxuICogZG9lcyBub3QgZXhpc3QgeWV0LCBhbmQgXHUyNkEwXHVGRTBGIGEgYHNldmVyaXR5OiAnd2FybmluZydgIHNjcmlwdCB2YWxpZGF0aW9uIGlzXG4gKiBhZG1pdHRlZCBieSB0aGlzIHBsYXRmb3JtIHdpdGggKm5vIG9ic2VydmFibGUgc3VyZmFjZSBhdCBhbGwqOiBubyB3YXJuaW5nIG9uXG4gKiB0aGUgcmVzdWx0LCBub3RoaW5nIGluIHRoZSBlbnZlbG9wZS4gRGVjbGFyaW5nIHRoZSBudW1iZXIgbm93IHdvdWxkIGFkZCBhXG4gKiBzaXh0aCBlbnRyeSB0byB0aGUgXCJkZWNsYXJlZCBhbmQgdGhlbiBub3QgYXBwbGllZFwiIHRhYmxlIGluXG4gKiBgdGVzdC93aW4tbG9zcy1jYXB0dXJlLnRlc3QudHNgLiBUaGUgc29mdCB0aWVyIHJldHVybnMgd2l0aCB0aGUgcm91dGluZyB0aGF0XG4gKiBnaXZlcyBpdCBhIGpvYi5cbiAqXG4gKiAjIyMgV2h5IHRoaXMgaXMgYSB2YWxpZGF0aW9uIHJ1bGUgYW5kIG5vdCBgRmllbGQucGVyY2VudCh7IG1heCB9KWBcbiAqXG4gKiBcdTI2QTBcdUZFMEYgUGxhdGZvcm0gY29uc3RyYWludCwgbWVhc3VyZWQgYm90aCB3YXlzIG9uIGEgbGVnYWN5IHJvdyBhbHJlYWR5IGFib3ZlIHRoZVxuICogY2VpbGluZyAoYHRlc3QvcXVvdGUtZGlzY291bnQtY2VpbGluZy50ZXN0LnRzYCk6IGEgZmllbGQtbGV2ZWwgYG1heGBcbiAqIHZhbGlkYXRlcyB0aGUgV1JJVFRFTiBWQUxVRSBvbmx5LCBzbyBhIHJvdyBzdG9yZWQgYWJvdmUgdGhlIGNlaWxpbmcgYmVmb3JlXG4gKiB0aGUgcnVsZSBleGlzdGVkIGtlZXBzIGFjY2VwdGluZyBlZGl0cyBmb3JldmVyIFx1MjAxNCB0aGUgc2FtZSBzaWxlbnQgbGVnYWN5IGhvbGVcbiAqIGByZXF1aXJlZFdoZW5gIGhhcy4gQSBgdHlwZTogJ3NjcmlwdCdgIHZhbGlkYXRpb24gaXMgZXZhbHVhdGVkIGFnYWluc3QgdGhlXG4gKiBNRVJHRUQgcmVjb3JkIG9uIGV2ZXJ5IHdyaXRlLCBzbyBpdCBpcyBhIHRydWUgaW52YXJpYW50LiBCb3RoIGZpZWxkcyBrZWVwXG4gKiBgbWF4OiAxMDBgIGFzIHRoZSBhcml0aG1ldGljIGRvbWFpbiBvZiBhIHBlcmNlbnRhZ2U7IHRoZSBwb2xpY3kgbGluZSBsaXZlcyBpblxuICogdGhlIHJ1bGVzLlxuICovXG5leHBvcnQgY29uc3QgUVVPVEVfRElTQ09VTlRfQ0VJTElORyA9IDYwO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL3F1b3RlX2xpbmVfaXRlbS5vYmplY3QudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9xdW90ZV9saW5lX2l0ZW0ub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBPYmplY3RTY2hlbWEsIEZpZWxkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBGLCBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgUVVPVEVfRElTQ09VTlRfQ0VJTElORyB9IGZyb20gJy4uLy4uL3NhbGVzL29iamVjdHMvX3RocmVzaG9sZHMnO1xuXG4vKipcbiAqIFF1b3RlIExpbmUgSXRlbVxuICpcbiAqIEluZGl2aWR1YWwgbGluZSBvbiBhIFF1b3RlLiBRdW90ZXMgZ2VuZXJhdGVkIGZyb20gYW4gT3Bwb3J0dW5pdHkgdHlwaWNhbGx5XG4gKiBjbG9uZSBpdHMgT3Bwb3J0dW5pdHlMaW5lSXRlbXMgaW50byBRdW90ZUxpbmVJdGVtcyBzbyBwcmljaW5nIGNhbiBkaXZlcmdlXG4gKiBhZnRlciB0aGUgcXVvdGUgaXMgc2VudCB3aXRob3V0IGFmZmVjdGluZyB0aGUgdW5kZXJseWluZyBvcHBvcnR1bml0eS5cbiAqL1xuZXhwb3J0IGNvbnN0IFF1b3RlTGluZUl0ZW0gPSBPYmplY3RTY2hlbWEuY3JlYXRlKHtcbiAgbmFtZTogJ2NybV9xdW90ZV9saW5lX2l0ZW0nLFxuICBsYWJlbDogJ1F1b3RlIExpbmUgSXRlbScsXG4gIHBsdXJhbExhYmVsOiAnUXVvdGUgTGluZSBJdGVtcycsXG4gIGljb246ICdwYWNrYWdlJyxcbiAgZGVzY3JpcHRpb246ICdBIHNpbmdsZSBwcm9kdWN0IGxpbmUgb24gYSBRdW90ZScsXG5cbiAgLy8gT1dEIGlzIGFuIGF1dGhvcmVkIGRlY2lzaW9uIChBRFItMDA5MCBEMS9ENykuIFJlY29yZCBhY2Nlc3MgREVSSVZFUyBmcm9tXG4gIC8vIHRoZSBxdW90ZSAoQURSLTAwNTUpLlxuICAvL1xuICAvLyBcdTI2QTBcdUZFMEYgUmVhZHMgQVJFIGZpbHRlcmVkIHRvIGxpbmVzIHdob3NlIGBjcm1fcXVvdGVgIHRoZSBjYWxsZXIgY2FuIHJlYWQsIGFuZFxuICAvLyBcImNhbiByZWFkXCIgcmVzb2x2ZXMgdGhyb3VnaCB0aGUgc2FtZSBwYXRocyBhIGRpcmVjdCByZWFkIG9mIHRoZSBxdW90ZSB0YWtlc1xuICAvLyBcdTIwMTQgb3duZXIgc2NvcGUgYW5kIGBzeXNfcmVjb3JkX3NoYXJlYCBncmFudHMgaW5jbHVkZWQsIE5PVCB0aGUgbWFzdGVyJ3NcbiAgLy8gcm93LWxldmVsIHNlY3VyaXR5IHBvbGljaWVzIGFsb25lLiBBIHJlcCB3aG8gb3ducyBvbmUgcXVvdGUgcmVhZHMgdGhhdFxuICAvLyBxdW90ZSdzIGxpbmVzIGFuZCBubyBvdGhlcnMuIFRoZSBwYXJlbnQtd3JpdGUgZ2F0ZSBkZXJpdmVzIHRoZSBzYW1lIHdheTogYVxuICAvLyBsaW5lIHdob3NlIHF1b3RlIHRoZSBjYWxsZXIgY2Fubm90IGVkaXQgaXMgcmVmdXNlZCB3aXRoIGFcbiAgLy8gYFBlcm1pc3Npb25EZW5pZWRFcnJvcmAgbmFtaW5nIHRoZSBtYXN0ZXIuXG4gIC8vXG4gIC8vIGB0ZXN0L3BhcmVudC1kZXJpdmVkLXJlYWNoLnRlc3QudHNgIHBpbnMgdGhvc2Ugc2VtYW50aWNzIHdpdGggcG9zaXRpdmVcbiAgLy8gY29udHJvbHMsIHNvIGEgcmVncmVzc2lvbiBpcyBjYXVnaHQgaW4gZWl0aGVyIGRpcmVjdGlvbiBcdTIwMTQgaXQgd2FzIHdyaXR0ZW4gdG9cbiAgLy8gZ28gcmVkIHRoZSBkYXkgdGhlIHBsYXRmb3JtIHdpZGVucyB0aGVtOiB3aXRoIHRoZSBkZXJpdmF0aW9uIGNvbnN1bHRpbmdcbiAgLy8gbWFzdGVyIFJMUyBwb2xpY2llcyBvbmx5LCB1bmRlciBhIFNZU1RFTSBjb250ZXh0LCBhbmQgbm8gcG9saWN5IGF1dGhvcmVkIG9uXG4gIC8vIGBjcm1fcXVvdGVgLCB0aGUgbWFzdGVyIHNldCBpcyBFVkVSWSBxdW90ZSBhbmQgYSBsaW5lIGl0ZW0gaXMgcmVhZGFibGUgXHUyMDE0XG4gIC8vIGFuZCB3cml0YWJsZSBcdTIwMTQgYnkgZXZlcnkgaG9sZGVyIG9mIG9iamVjdC1sZXZlbCByZWFkIG9uIHRoaXMgb2JqZWN0LiBUaGVcbiAgLy8gcmVsYXRpb24gcmVzb2x2ZXIgYWNjZXB0cyBhIFJFUVVJUkVEIExPT0tVUCBhcyB0aGUgcGFyZW50LCBzbyBub1xuICAvLyBtYXN0ZXItZGV0YWlsIGNvbnZlcnNpb24gaXMgbmVlZGVkLlxuICAvL1xuICAvLyBcdTI2RDQgTm90IGBwcml2YXRlYDogd2l0aCBubyBvd25lciBmaWVsZCBvbiB0aGlzIG9iamVjdCB0aGF0IHJlc29sdmVzIHRvIHRoZVxuICAvLyBwbGF0Zm9ybSdzIGF1dG8tc3RhbXBlZCBgb3duZXJfaWRgIFx1MjAxNCB0aGUgcm93J3MgaW5zZXJ0ZXIgXHUyMDE0IHNvIGxpbmVzIGNsb25lZFxuICAvLyBvbnRvIGEgcXVvdGUgYnkgdGhlIGBxdW90ZV9nZW5lcmF0aW9uYCBmbG93IGFyZSBpbnZpc2libGUgdG8gdGhlIHJlcCB3aG9cbiAgLy8gb3ducyB0aGUgcXVvdGUuXG4gIHNoYXJpbmdNb2RlbDogJ2NvbnRyb2xsZWRfYnlfcGFyZW50JyxcblxuICAvLyBQZXItZmllbGQgaGlzdG9yeSBpcyBvcHQtaW4gdmlhIGBGaWVsZC50cmFja0hpc3RvcnlgIChBRFItMDA1MiksIHNldCBvblxuICAvLyBxdWFudGl0eS91bml0X3ByaWNlL2Rpc2NvdW50IGJlbG93LiBNYXN0ZXItZGV0YWlsIGNoaWxkcmVuIHN0aWxsIGluaGVyaXRcbiAgLy8gdGhlIG1hc3RlcidzIHNoYXJpbmcgYXV0b21hdGljYWxseS5cblxuICBoaWdobGlnaHRGaWVsZHM6IFsnY3JtX3Byb2R1Y3QnLCAncXVhbnRpdHknLCAndW5pdF9wcmljZScsICd0b3RhbF9wcmljZSddLFxuXG4gIC8vIFRoZSBzYW1lIHR3by1ncm91cCBzcGxpdCBhcyBgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbWAgKCMxNDUzKSwgZGVyaXZlZFxuICAvLyBmcm9tIHRoZSB0ZW4gZmllbGRzIGRlY2xhcmVkIGhlcmU6IGV2ZXJ5IGZhY3RvciBgdG90YWxfcHJpY2VgIG11bHRpcGxpZXNcbiAgLy8gaXMgYHByaWNpbmdgLCBldmVyeXRoaW5nIHRoYXQgc2F5cyBXSElDSCBsaW5lIHRoaXMgaXMgaXMgYGJhc2ljYC5cbiAgLy9cbiAgLy8gXHUyNkEwXHVGRTBGIE5laXRoZXIgZ3JvdXAgbWF5IGJlIGEgc3Vic2V0IG9mIHRoZSBoaWdobGlnaHQgc3RyaXAgXHUyMDE0IHNlZSB0aGUgdHdpblxuICAvLyBvYmplY3QgZm9yIHRoZSBob2lzdGluZyBydWxlIHRoaXMgc2F0aXNmaWVzLlxuICBmaWVsZEdyb3VwczogW1xuICAgIHsga2V5OiAnYmFzaWMnLCAgIGxhYmVsOiAnTGluZSBJdGVtJywgaWNvbjogJ3BhY2thZ2UnIH0sXG4gICAgeyBrZXk6ICdwcmljaW5nJywgbGFiZWw6ICdQcmljaW5nJywgICBpY29uOiAnZG9sbGFyLXNpZ24nIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gVGhlIHBhcmVudCBsaW5rIFx1MjAxNCBzYW1lIGRlY2lzaW9uLCBzYW1lIHJlYXNvbmluZywgYXNcbiAgICAvLyBgb3Bwb3J0dW5pdHlfbGluZV9pdGVtLmNybV9vcHBvcnR1bml0eWAgKCM3MjcpOyByZWFkIHRoZSBsb25nIG5vdGUgdGhlcmUuXG4gICAgLy8gSW4gc2hvcnQ6IGRlY2xhcmluZyBub3RoaW5nIHJlc29sdmVzIHRvIHRoZSBzcGVjIGRlZmF1bHQgYHNldF9udWxsYCwgd2hpY2hcbiAgICAvLyB0aGUgZW5naW5lIGVzY2FsYXRlcyB0byBgcmVzdHJpY3RgIG9uIGEgUkVRVUlSRUQgbG9va3VwLCBzbyBldmVyeSBxdW90ZVxuICAgIC8vIHRoYXQgaGFkIGJlZW4gaXRlbWlzZWQgcmVmdXNlZCB0byBkZWxldGUgd2l0aCBhIDQwOSBxdW90aW5nIHRoaXMgZmllbGQuXG4gICAgLy8gQSBxdW90ZSBsaW5lIGlzIHN1Ym9yZGluYXRlIHRvIGl0cyBxdW90ZSAoYHF1b3RlX2xpbmVfaXRlbS5ob29rLnRzYCByb2xsc1xuICAgIC8vIHRoZSBxdW90ZSdzIHN1YnRvdGFsL3RvdGFsIFVQIGZyb20gdGhlc2Ugcm93cyksIHNvIGl0IGdvZXMgd2l0aCBpdC5cbiAgICBjcm1fcXVvdGU6IEZpZWxkLm1hc3RlckRldGFpbCgnY3JtX3F1b3RlJywge1xuICAgICAgbGFiZWw6ICdRdW90ZScsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgc3RvcmFnZTogeyBub3ROdWxsOiB0cnVlIH0sXG4gICAgICBkZWxldGVCZWhhdmlvcjogJ2Nhc2NhZGUnLFxuXG4gICAgICAvLyBDdXJhdGVzIHRoZSBsaW5lLWl0ZW1zIHBhbmVsIG9uIGEgcXVvdGUncyBkZXRhaWwgcGFnZSAoIzExOTkpIFx1MjAxNCB0aGVcbiAgICAgIC8vIG1lY2hhbmlzbSB0aGF0IHBhbmVsIHJlYWRzIGZpcnN0ICgjOTQ0OyB0aGUgbG9uZyBub3RlIGlzIG9uXG4gICAgICAvLyBgY3JtX2NhbXBhaWduX21lbWJlci5jcm1fY2FtcGFpZ25gKS4gQSBTVVBFUlNFVCBvZiB0aGUgZmFsbGJhY2sgaXRcbiAgICAgIC8vIHJlcGxhY2VzIChgaGlnaGxpZ2h0RmllbGRzYCBtaW51cyB0aGlzIGxvb2t1cDogUHJvZHVjdCAvIFF1YW50aXR5IC9cbiAgICAgIC8vIFNhbGVzIFByaWNlIC8gVG90YWwpIHBsdXMgYHN1YnRvdGFsYCwgdGhlIGxpbmUncyBwcmljZSBhZnRlciBpdHMgb3duXG4gICAgICAvLyBkaXNjb3VudCBcdTIwMTQgdGhlIGZvcm11bGEgd2FzIGV2YWx1YXRlZCBvbiBldmVyeSByZWFkIGFuZCBzaG93biBpbiBubyBsaXN0LlxuICAgICAgLy9cbiAgICAgIC8vIFx1MjZENCBOb3QgYWRkZWQgdG8gYGhpZ2hsaWdodEZpZWxkc2A6IHRoZSBkZXRhaWwgcGFnZSBob2lzdHMgdGhlIGZpcnN0XG4gICAgICAvLyBmb3VyIG9mIHRoYXQgc3RyaXAsIHNvIGEgZmlmdGggZW50cnkgbmV2ZXIgcmVhY2hlcyB0aGUgc3RyaXAsIGFuZFxuICAgICAgLy8gcmVvcmRlcmluZyBpdCB3b3VsZCBldmljdCBgdG90YWxfcHJpY2VgIGZyb20gdGhlIHJlY29yZCdzIGhlYWRlci5cbiAgICAgIHJlbGF0ZWRMaXN0Q29sdW1uczogWydjcm1fcHJvZHVjdCcsICdxdWFudGl0eScsICd1bml0X3ByaWNlJywgJ3N1YnRvdGFsJywgJ3RvdGFsX3ByaWNlJ10sXG4gICAgfSksXG5cbiAgICAvLyBMZWZ0IG9uIHRoZSByZXN0cmljdGluZyBkZWZhdWx0IG9uIHB1cnBvc2UgXHUyMDE0IHNlZSB0aGUgdHdpbiBvYmplY3Q6IGFcbiAgICAvLyBwcm9kdWN0J3MgY2F0YWxvZyBlbnRyeSBtdXN0IG5vdCB0YWtlIHByaWNlZCBxdW90ZSBoaXN0b3J5IHdpdGggaXQuXG4gICAgY3JtX3Byb2R1Y3Q6IEZpZWxkLmxvb2t1cCgnY3JtX3Byb2R1Y3QnLCB7XG4gICAgICBsYWJlbDogJ1Byb2R1Y3QnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgIH0pLFxuXG4gICAgZGVzY3JpcHRpb246IEZpZWxkLnRleHQoe1xuICAgICAgbGFiZWw6ICdEZXNjcmlwdGlvbicsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIG1heExlbmd0aDogNTAwLFxuICAgIH0pLFxuXG4gICAgcXVhbnRpdHk6IEZpZWxkLm51bWJlcih7XG4gICAgICBsYWJlbDogJ1F1YW50aXR5JyxcbiAgICAgIGdyb3VwOiAncHJpY2luZycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgc2NhbGU6IDIsXG4gICAgICBtaW46IDAsXG4gICAgICBkZWZhdWx0VmFsdWU6IDEsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICBsaXN0X3ByaWNlOiBGaWVsZC5jdXJyZW5jeSh7XG4gICAgICBsYWJlbDogJ0xpc3QgUHJpY2UnLFxuICAgICAgZ3JvdXA6ICdwcmljaW5nJyxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgIH0pLFxuXG4gICAgdW5pdF9wcmljZTogRmllbGQuY3VycmVuY3koe1xuICAgICAgbGFiZWw6ICdTYWxlcyBQcmljZScsXG4gICAgICBncm91cDogJ3ByaWNpbmcnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIGRpc2NvdW50OiBGaWVsZC5wZXJjZW50KHtcbiAgICAgIGxhYmVsOiAnRGlzY291bnQgJScsXG4gICAgICBncm91cDogJ3ByaWNpbmcnLFxuICAgICAgc2NhbGU6IDIsXG4gICAgICBtaW46IDAsXG4gICAgICBtYXg6IDEwMCxcbiAgICAgIGRlZmF1bHRWYWx1ZTogMCxcbiAgICAgIHRyYWNrSGlzdG9yeTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIHN1YnRvdGFsOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGxhYmVsOiAnU3VidG90YWwnLFxuICAgICAgZ3JvdXA6ICdwcmljaW5nJyxcbiAgICAgIGV4cHJlc3Npb246IEZgcmVjb3JkLnF1YW50aXR5ICogcmVjb3JkLnVuaXRfcHJpY2UgKiAoMSAtIHJlY29yZC5kaXNjb3VudCAvIDEwMClgLFxuICAgIH0pLFxuXG4gICAgLy8gQSBsaW5lIGNhcnJpZXMgbm8gdGF4OiB0YXggaXMgdGhlIHF1b3RlJ3Mgb3duIGFtb3VudCAoIzIwNjkpLCBzbyBUb3RhbCBpc1xuICAgIC8vIGBzdWJ0b3RhbGAncyBleHByZXNzaW9uLCBub3QgYSByZWFkIG9mIGBzdWJ0b3RhbGAgXHUyMDE0IGEgZm9ybXVsYSByZWFkaW5nIGFcbiAgICAvLyBmb3JtdWxhIGRlcGVuZHMgb24gaHlkcmF0aW9uIG9yZGVyIChgbGVhZC5vYmplY3QudHM6NjEtNjRgKS5cbiAgICB0b3RhbF9wcmljZTogRmllbGQuZm9ybXVsYSh7XG4gICAgICBsYWJlbDogJ1RvdGFsJyxcbiAgICAgIGdyb3VwOiAncHJpY2luZycsXG4gICAgICBleHByZXNzaW9uOiBGYHJlY29yZC5xdWFudGl0eSAqIHJlY29yZC51bml0X3ByaWNlICogKDEgLSByZWNvcmQuZGlzY291bnQgLyAxMDApYCxcbiAgICB9KSxcblxuICAgIGxpbmVfbnVtYmVyOiBGaWVsZC5udW1iZXIoe1xuICAgICAgbGFiZWw6ICdMaW5lICMnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBzY2FsZTogMCxcbiAgICAgIHJlYWRvbmx5OiB0cnVlLFxuICAgIH0pLFxuICB9LFxuXG4gIC8vIFByZWRpY2F0ZXMgYmVsb3cgYXJlIFRPVEFMOiBldmVyeSBgcmVjb3JkLnhgIHJlYWQgaXMgYGhhcygpYC1ndWFyZGVkLCBzbyB0aGVcbiAgLy8gcnVsZSByZXR1cm5zIGEgdmVyZGljdCBldmVuIHdoZW4gdGhlIG1lcmdlZCByZWNvcmQgaGFzIG5vIHN1Y2gga2V5LiBTZWVcbiAgLy8gQUdFTlRTLm1kIFwiVmFsaWRhdGlvbiBwcmVkaWNhdGVzIG11c3QgYmUgVE9UQUxcIiBhbmRcbiAgLy8gdGVzdC9vYmplY3QtdmFsaWRhdGlvbi1wcmVkaWNhdGVzLnRlc3QudHMsIHdoaWNoIGZhaWxzIHRoZSBidWlsZCBvdGhlcndpc2UuXG4gIHZhbGlkYXRpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ3VuaXRfcHJpY2VfcG9zaXRpdmUnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6ICdTYWxlcyBwcmljZSBjYW5ub3QgYmUgbmVnYXRpdmUnLFxuICAgICAgY29uZGl0aW9uOiBQYGhhcyhyZWNvcmQudW5pdF9wcmljZSkgJiYgcmVjb3JkLnVuaXRfcHJpY2UgIT0gbnVsbCAmJiByZWNvcmQudW5pdF9wcmljZSA8IDBgLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gIzEwODYuIFRoZSBvdGhlciBoYWxmIG9mICM1OTkncyBjZWlsaW5nLCBhbmQgdGhlIHJlYXNvbiB0aGF0IGNhcmQncyBvd25cbiAgICAgIC8vIGFjY2VwdGFuY2UgY3JpdGVyaW9uIFx1MjAxNCBcImEgcXVvdGUgd2l0aCBhIDkwJSBsaW5lIGRpc2NvdW50IGNhbm5vdCByZWFjaFxuICAgICAgLy8gYHByZXNlbnRlZGBcIiBcdTIwMTQgd2FzIG5vdCBtZXQgYnkgdGhlIHF1b3RlLWxldmVsIHJ1bGUgYWxvbmUuXG4gICAgICAvL1xuICAgICAgLy8gIyMjIFRoZSB3YWxrLWFyb3VuZCB0aGlzIGNsb3Nlc1xuICAgICAgLy9cbiAgICAgIC8vIEEgcXVvdGUncyB0b3RhbCBoYXMgVFdPIGluZGVwZW5kZW50IGRpc2NvdW50IG11bHRpcGxpZXJzLCBhbmRcbiAgICAgIC8vIGBxdW90ZV90b3RhbF9yb2xsdXBgIGNvbXBvc2VzIHRoZW06XG4gICAgICAvL1xuICAgICAgLy8gICBzdWJ0b3RhbCAgICAgICAgPSBcdTAzQTMgbGluZSAocXVhbnRpdHkgXHUwMEQ3IHVuaXRfcHJpY2UgXHUwMEQ3ICgxIFx1MjIxMiBMSU5FIGRpc2NvdW50LzEwMCkpXG4gICAgICAvLyAgIGRpc2NvdW50X2Ftb3VudCA9IHN1YnRvdGFsIFx1MDBENyBRVU9URSBkaXNjb3VudCVcbiAgICAgIC8vXG4gICAgICAvLyAjNTk5IHB1dCBhIGNlaWxpbmcgb24gdGhlIHNlY29uZCBvbmUgb25seS4gU28gYSBxdW90ZSBhdFxuICAgICAgLy8gYGRpc2NvdW50OiAwYCBcdTIwMTQgd2hpY2ggY2xlYXJzIGBkaXNjb3VudF93aXRoaW5fY2VpbGluZ2Agb24gYGNybV9xdW90ZWBcbiAgICAgIC8vIG91dHJpZ2h0IFx1MjAxNCB3aXRoIGV2ZXJ5IGxpbmUgYXQgYGRpc2NvdW50OiA5MGAgcHJpY2VzIDkwJSBiZWxvdyBsaXN0LCBhbmRcbiAgICAgIC8vIG5vdGhpbmcgb2JqZWN0ZWQ6IHRoaXMgb2JqZWN0J3Mgb25seSBkaXNjb3VudCBjb25zdHJhaW50IHdhcyB0aGVcbiAgICAgIC8vIGZpZWxkJ3Mgb3duIGBtYXg6IDEwMGAsIHRoZSBhcml0aG1ldGljIGRvbWFpbiBvZiBhIHBlcmNlbnRhZ2UuIEFuXG4gICAgICAvLyBpbnZhcmlhbnQgd2l0aCBhIGRvY3VtZW50ZWQgd2Fsay1hcm91bmQgaXMgd29yc2UgdGhhbiBubyBpbnZhcmlhbnQsXG4gICAgICAvLyBiZWNhdXNlIGEgcmVhZGVyIChodW1hbiBvciBBSSkgY2l0ZXMgdGhlIHJ1bGUgYXMgdGhlIGd1YXJhbnRlZS5cbiAgICAgIC8vXG4gICAgICAvLyAjIyMgU2FtZSBjb25zdGFudCwgc2FtZSBpbnN0cnVtZW50LCBkZWxpYmVyYXRlbHlcbiAgICAgIC8vXG4gICAgICAvLyBUaGUgbnVtYmVyIGlzIGBRVU9URV9ESVNDT1VOVF9DRUlMSU5HYCBcdTIwMTQgaW1wb3J0ZWQsIG5ldmVyIHJldHlwZWQsIHNvIHRoZVxuICAgICAgLy8gdHdvIGNlaWxpbmdzIGFyZSBvbmUgcG9saWN5IGFuZCBjYW5ub3QgZHJpZnQgaW50byB0d28uIFRoZSBpbnN0cnVtZW50IGlzXG4gICAgICAvLyBhIGB0eXBlOiAnc2NyaXB0J2AgdmFsaWRhdGlvbiBmb3IgdGhlIHJlYXNvbiAjNTk5IG1lYXN1cmVkIG9uIHRoZSBxdW90ZVxuICAgICAgLy8gKGFuZCB0aGlzIGNhcmQgcmUtbWVhc3VyZWQgb24gdGhpcyBvYmplY3QsIGluXG4gICAgICAvLyBgdGVzdC9xdW90ZS1kaXNjb3VudC1jZWlsaW5nLnRlc3QudHNgKTogYSBmaWVsZC1sZXZlbCBgbWF4YCB2YWxpZGF0ZXNcbiAgICAgIC8vIG9ubHkgdGhlIHZhbHVlIGJlaW5nIFdSSVRURU4sIHNvIGEgbGluZSBzdG9yZWQgYWJvdmUgdGhlIGNlaWxpbmcgYmVmb3JlXG4gICAgICAvLyB0aGUgcnVsZSBleGlzdGVkIGtlZXBzIGFjY2VwdGluZyBlZGl0cyBmb3JldmVyLCB3aGlsZSBhIHNjcmlwdFxuICAgICAgLy8gdmFsaWRhdGlvbiBpcyBldmFsdWF0ZWQgYWdhaW5zdCB0aGUgTUVSR0VEIHJlY29yZCBvbiBldmVyeSB3cml0ZSBhbmQgaXNcbiAgICAgIC8vIHRoZXJlZm9yZSBhIHRydWUgaW52YXJpYW50LiBgbWF4OiAxMDBgIHN0YXlzIG9uIHRoZSBmaWVsZCBhcyB0aGUgZG9tYWluXG4gICAgICAvLyBvZiBhIHBlcmNlbnRhZ2U7IHRoZSBwb2xpY3kgbGluZSBsaXZlcyBoZXJlLlxuICAgICAgLy9cbiAgICAgIC8vICMjIyBXaGF0IHRoaXMgcnVsZSBkb2VzIE5PVCBkZWNpZGVcbiAgICAgIC8vXG4gICAgICAvLyA2MCUgcGVyIGxpbmUgQU5EIDYwJSBvbiB0aGUgcXVvdGUgc3RpbGwgY29tcG91bmRzIHRvIH44NCUgRUZGRUNUSVZFLlxuICAgICAgLy8gV2hldGhlciB0aGUgY2VpbGluZyBzaG91bGQgYmUgcmVhZCBhZ2FpbnN0IHRoZSBlZmZlY3RpdmUgZGlzY291bnQgaXMgYVxuICAgICAgLy8gYnVzaW5lc3MtcG9saWN5IHF1ZXN0aW9uIHdpdGggbm8gYW5zd2VyIGluIHRoaXMgY29kZWJhc2UsIGFuZCBpdCBpc1xuICAgICAgLy8gb3BlbiBhcyAjMTEwOSBcdTIwMTQgZGVsaWJlcmF0ZWx5IG5vdCBndWVzc2VkIGhlcmUuIEEgcGVyLWxpbmUgY2VpbGluZyBpc1xuICAgICAgLy8gY29ycmVjdCB1bmRlciBlaXRoZXIgYW5zd2VyOiBpdCBpcyB0aGUgd2hvbGUgcG9saWN5IGlmIHRoZSBhbnN3ZXIgaXNcbiAgICAgIC8vIHBlci1saW5lLCBhbmQgYSBjb21wb25lbnQgb2YgaXQgaWYgdGhlIGFuc3dlciBpcyBlZmZlY3RpdmUuXG4gICAgICBuYW1lOiAnZGlzY291bnRfd2l0aGluX2NlaWxpbmcnLFxuICAgICAgdHlwZTogJ3NjcmlwdCcsXG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIC8vIE5hbWVzIHRoZSBMSU5FLCBiZWNhdXNlIHRoZSBxdW90ZSBjYXJyaWVzIGEgc2FtZS1uYW1lZCBydWxlIHdpdGggaXRzXG4gICAgICAvLyBvd24gbWVzc2FnZTogb24gYSByZWZ1c2VkIHNhdmUgdGhlIHJlcCBtdXN0IGJlIGFibGUgdG8gdGVsbCB3aGljaCBvZlxuICAgICAgLy8gdGhlIHR3byBudW1iZXJzIHRoZSBwbGF0Zm9ybSBpcyBvYmplY3RpbmcgdG8uXG4gICAgICBtZXNzYWdlOiBgTGluZSBkaXNjb3VudCBjYW5ub3QgZXhjZWVkICR7UVVPVEVfRElTQ09VTlRfQ0VJTElOR30lYCxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmRpc2NvdW50KSAmJiByZWNvcmQuZGlzY291bnQgIT0gbnVsbCAmJiByZWNvcmQuZGlzY291bnQgPiAke1FVT1RFX0RJU0NPVU5UX0NFSUxJTkd9YCxcbiAgICB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0cy9pbmRleC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0cy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBNYXJrZXRpbmcgb2JqZWN0IGJhcnJlbC5cbiAqXG4gKiBSZS1leHBvcnRzIHRoaXMgcGFja2FnZSdzICoub2JqZWN0LnRzIGRlZmluaXRpb25zOyB0aGUgYCouaG9vay50c2AgZmlsZXNcbiAqIGJlc2lkZSB0aGVtIHJlZ2lzdGVyIHRocm91Z2ggYC4vaG9va3MudHNgLiBUaGUgY2Fub25pY2FsIG5vdGUgb24gdGhlXG4gKiBjb2xsYWJvcmF0aW9uIGNhcGFiaWxpdGllcyAoYGVuYWJsZS5maWxlc2AsIGBlbmFibGUuZmVlZHNgKSB0aGF0IGV2ZXJ5XG4gKiBvYmplY3QgaW4gdGhpcyBhcHAgcG9pbnRzIGF0IGlzIHdyaXR0ZW4gb25jZSwgaW5cbiAqIGBzcmMvc2FsZXMvb2JqZWN0cy9pbmRleC50c2AuXG4gKi9cblxuZXhwb3J0IHsgQ2FtcGFpZ24gfSBmcm9tICcuL2NhbXBhaWduLm9iamVjdCc7XG5leHBvcnQgeyBDYW1wYWlnbk1lbWJlciB9IGZyb20gJy4vY2FtcGFpZ25fbWVtYmVyLm9iamVjdCc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbi5vYmplY3QudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL29iamVjdHMvY2FtcGFpZ24ub2JqZWN0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBPYmplY3RTY2hlbWEsIEZpZWxkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBGLCBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuXG4vKipcbiAqIENhbXBhaWduIE9iamVjdFxuICogUmVwcmVzZW50cyBtYXJrZXRpbmcgY2FtcGFpZ25zXG4gKi9cbmV4cG9ydCBjb25zdCBDYW1wYWlnbiA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX2NhbXBhaWduJyxcbiAgbGFiZWw6ICdDYW1wYWlnbicsXG4gIHBsdXJhbExhYmVsOiAnQ2FtcGFpZ25zJyxcbiAgaWNvbjogJ21lZ2FwaG9uZScsXG4gIGRlc2NyaXB0aW9uOiAnTWFya2V0aW5nIGNhbXBhaWducyBhbmQgaW5pdGlhdGl2ZXMnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIENhbXBhaWduIGNhdGFsb2cgaXMgb3JnLXZpc2libGU7IG9ubHkgb3duZXJzIGVkaXQuXG4gIHNoYXJpbmdNb2RlbDogJ3B1YmxpY19yZWFkJyxcbiAgLy8gQURSLTAwNzk6IHJlbmRlci1vbmx5IGB0aXRsZUZvcm1hdGAgcmV0aXJlZCBpbiBmYXZvciBvZiBgbmFtZUZpZWxkYCxcbiAgLy8gd2hpY2ggbmFtZXMgYSByZWFsIGZpZWxkLiBUaGUgZm9ybWVyIHRlbXBsYXRlIGNvbXBvc2VkIHR3byBsb2NhbCBmaWVsZHMsIHNvXG4gIC8vIGEgYGRpc3BsYXlfdGl0bGVgIGZvcm11bGEgZmllbGQgcmVwcm9kdWNlcyBpdCBmb3IgdGhlIHJlY29yZCB0aXRsZS5cbiAgbmFtZUZpZWxkOiAnZGlzcGxheV90aXRsZScsXG4gIC8vIEV4cGxpY2l0IHNlYXJjaCB0YXJnZXRzIChBRFItMDA2MSkuIFJFUVVJUkVEIGJlY2F1c2UgbmFtZUZpZWxkIGlzIGFcbiAgLy8gRk9STVVMQSAoZGlzcGxheV90aXRsZS9mdWxsX25hbWUpOiB3aXRob3V0IHRoaXMsICRzZWFyY2ggYXV0by1kZWZhdWx0cyB0b1xuICAvLyB0aGUgZm9ybXVsYSBmaWVsZCwgd2hpY2ggaXNuJ3QgYSByZWFsIGNvbHVtbiwgc28gdGhlIGxvb2t1cCBwaWNrZXIgKyBnbG9iYWxcbiAgLy8gc2VhcmNoIHNpbGVudGx5IHJldHVybiB6ZXJvLiBUaGVzZSBhcmUgcmVhbCwgaW5kZXhlZCBjb2x1bW5zLlxuICBzZWFyY2hhYmxlRmllbGRzOiBbJ25hbWUnLCAnY2FtcGFpZ25fY29kZSddLFxuICBoaWdobGlnaHRGaWVsZHM6IFsnY2FtcGFpZ25fY29kZScsICduYW1lJywgJ3R5cGUnLCAnc3RhdHVzJywgJ3N0YXJ0X2RhdGUnXSxcblxuICAvLyBFdmVyeSBvdGhlciBidXNpbmVzcyBvYmplY3Qgd2l0aCBhIGRldGFpbCBwYWdlIGdyb3VwcyBpdHMgZmllbGRzOyBjYW1wYWlnblxuICAvLyB3YXMgb25lIG9mIHRoZSB0d28gdGhhdCBkaWQgbm90LCBzbyBpdHMgZGV0YWlsIHBhZ2UgZmVsbCBiYWNrIHRvIG9uZSBmbGF0XG4gIC8vIDMwLWZpZWxkIGdyaWQgd2l0aCB0aGUgUk9JIGZvcm11bGFzIHNpdHRpbmcgbmV4dCB0byB0aGUgY2FtcGFpZ24gbmFtZS4gVGhlXG4gIC8vIGxhYmVscyBtaXJyb3IgdGhlIHNlY3Rpb25zIHRoZSBjYW1wYWlnbiBmb3JtIHVzZXMgKENhbXBhaWduIEluZm9ybWF0aW9uIC9cbiAgLy8gU2NoZWR1bGUgLyBCdWRnZXQgJiBST0kgLyBQZXJmb3JtYW5jZSkgc28gdGhlIHR3byBzdXJmYWNlcyBhZ3JlZSBcdTIwMTQgdGhlXG4gIC8vIGZvcm0ncyBvbGQgdGhyZWUtc2VjdGlvbiBzaGFwZSBidXJpZWQgdGhlIHR3byBtYW51YWwtZW50cnkgY29zdCBmaWVsZHMgaW4gYVxuICAvLyBjb21iaW5lZCBcIlNjaGVkdWxlICYgQnVkZ2V0XCIgcm93IGFuZCB3YXMgc3BsaXQgdG8gbWF0Y2ggdGhpcyBvbmUgKCM1OTcpLlxuICBmaWVsZEdyb3VwczogW1xuICAgIHsga2V5OiAnYmFzaWMnLCAgICAgIGxhYmVsOiAnQ2FtcGFpZ24gSW5mb3JtYXRpb24nLCBpY29uOiAnbWVnYXBob25lJyB9LFxuICAgIHsga2V5OiAnc2NoZWR1bGUnLCAgIGxhYmVsOiAnU2NoZWR1bGUnLCAgICAgICAgICAgICBpY29uOiAnY2FsZW5kYXInIH0sXG4gICAgeyBrZXk6ICdidWRnZXQnLCAgICAgbGFiZWw6ICdCdWRnZXQgJiBST0knLCAgICAgICAgIGljb246ICdkb2xsYXItc2lnbicgfSxcbiAgICB7IGtleTogJ21ldHJpY3MnLCAgICBsYWJlbDogJ1BlcmZvcm1hbmNlJywgICAgICAgICAgaWNvbjogJ2Jhci1jaGFydCcgfSxcbiAgICB7IGtleTogJ2Fzc2lnbm1lbnQnLCBsYWJlbDogJ093bmVyc2hpcCcsICAgICAgICAgICAgaWNvbjogJ3VzZXInIH0sXG4gICAgeyBrZXk6ICdhc3NldHMnLCAgICAgbGFiZWw6ICdDYW1wYWlnbiBBc3NldHMnLCAgICAgIGljb246ICdsaW5rJywgY29sbGFwc2U6ICdjb2xsYXBzZWQnIH0sXG4gIF0sXG5cbiAgZmllbGRzOiB7XG4gICAgLy8gUGxhdGZvcm0gb3duZXJzaGlwIGFuY2hvciBcdTIwMTQgY2Fub25pY2FsIG5vdGUgaW4gYGFjY291bnQub2JqZWN0LnRzYCAoIzU0OCkuXG4gICAgb3duZXJfaWQ6IEZpZWxkLmxvb2t1cCgnc3lzX3VzZXInLCB7XG4gICAgICBsYWJlbDogJ0NhbXBhaWduIE93bmVyJyxcbiAgICAgIGdyb3VwOiAnYXNzaWdubWVudCcsXG4gICAgICBzeXN0ZW06IHRydWUsXG4gICAgICByZWFkb25seTogZmFsc2UsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgfSksXG5cbiAgICAvLyBBdXRvTnVtYmVyIGZpZWxkXG4gICAgY2FtcGFpZ25fY29kZTogRmllbGQuYXV0b251bWJlcih7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnQ2FtcGFpZ24gQ29kZScsXG4gICAgICBmb3JtYXQ6ICdDUEctezAwMDB9JyxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBCYXNpYyBJbmZvcm1hdGlvblxuICAgIG5hbWU6IEZpZWxkLnRleHQoe1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ0NhbXBhaWduIE5hbWUnLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIHNlYXJjaGFibGU6IHRydWUsXG4gICAgICBtYXhMZW5ndGg6IDI1NSxcbiAgICB9KSxcblxuICAgIC8vIEFEUi0wMDc5IHJlY29yZCB0aXRsZSAod2FzIHRpdGxlRm9ybWF0ICd7Y2FtcGFpZ25fY29kZX0gLSB7bmFtZX0nKS5cbiAgICBkaXNwbGF5X3RpdGxlOiBGaWVsZC5mb3JtdWxhKHtcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbGFiZWw6ICdEaXNwbGF5IFRpdGxlJyxcbiAgICAgIGV4cHJlc3Npb246IEZgcmVjb3JkLmNhbXBhaWduX2NvZGUgKyBcIiAtIFwiICsgcmVjb3JkLm5hbWVgLFxuICAgIH0pLFxuXG4gICAgZGVzY3JpcHRpb246IEZpZWxkLm1hcmtkb3duKHtcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgbGFiZWw6ICdEZXNjcmlwdGlvbicsXG4gICAgfSksXG4gICAgXG4gICAgLy8gVHlwZSAmIENoYW5uZWxcbiAgICB0eXBlOiBGaWVsZC5zZWxlY3Qoe1xuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICBsYWJlbDogJ0NhbXBhaWduIFR5cGUnLFxuICAgICAgb3B0aW9uczogW1xuICAgICAgICB7IGxhYmVsOiAnRW1haWwnLCB2YWx1ZTogJ2VtYWlsJywgZGVmYXVsdDogdHJ1ZSB9LFxuICAgICAgICB7IGxhYmVsOiAnV2ViaW5hcicsIHZhbHVlOiAnd2ViaW5hcicgfSxcbiAgICAgICAgeyBsYWJlbDogJ1RyYWRlIFNob3cnLCB2YWx1ZTogJ3RyYWRlX3Nob3cnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDb25mZXJlbmNlJywgdmFsdWU6ICdjb25mZXJlbmNlJyB9LFxuICAgICAgICB7IGxhYmVsOiAnRGlyZWN0IE1haWwnLCB2YWx1ZTogJ2RpcmVjdF9tYWlsJyB9LFxuICAgICAgICB7IGxhYmVsOiAnU29jaWFsIE1lZGlhJywgdmFsdWU6ICdzb2NpYWxfbWVkaWEnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdDb250ZW50IE1hcmtldGluZycsIHZhbHVlOiAnY29udGVudCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1BhcnRuZXIgTWFya2V0aW5nJywgdmFsdWU6ICdwYXJ0bmVyJyB9LFxuICAgICAgXVxuICAgIH0pLFxuICAgIFxuICAgIGNoYW5uZWw6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnUHJpbWFyeSBDaGFubmVsJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ0RpZ2l0YWwnLCB2YWx1ZTogJ2RpZ2l0YWwnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdTb2NpYWwnLCB2YWx1ZTogJ3NvY2lhbCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0VtYWlsJywgdmFsdWU6ICdlbWFpbCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0V2ZW50cycsIHZhbHVlOiAnZXZlbnRzJyB9LFxuICAgICAgICB7IGxhYmVsOiAnUGFydG5lcicsIHZhbHVlOiAncGFydG5lcicgfSxcbiAgICAgIF1cbiAgICB9KSxcbiAgICBcbiAgICAvLyBTdGF0dXNcbiAgICBzdGF0dXM6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGxhYmVsOiAnU3RhdHVzJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyBsYWJlbDogJ1BsYW5uaW5nJywgdmFsdWU6ICdwbGFubmluZycsIGNvbG9yOiAnIzk5OTk5OScsIGRlZmF1bHQ6IHRydWUgfSxcbiAgICAgICAgeyBsYWJlbDogJ0luIFByb2dyZXNzJywgdmFsdWU6ICdpbl9wcm9ncmVzcycsIGNvbG9yOiAnI0ZGQTUwMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ0NvbXBsZXRlZCcsIHZhbHVlOiAnY29tcGxldGVkJywgY29sb3I6ICcjMDBBQTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQWJvcnRlZCcsIHZhbHVlOiAnYWJvcnRlZCcsIGNvbG9yOiAnI0ZGMDAwMCcgfSxcbiAgICAgIF0sXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgdHJhY2tIaXN0b3J5OiB0cnVlLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIERhdGVzXG4gICAgc3RhcnRfZGF0ZTogRmllbGQuZGF0ZSh7XG4gICAgICBncm91cDogJ3NjaGVkdWxlJyxcbiAgICAgIGxhYmVsOiAnU3RhcnQgRGF0ZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgIH0pLFxuICAgIFxuICAgIGVuZF9kYXRlOiBGaWVsZC5kYXRlKHtcbiAgICAgIGdyb3VwOiAnc2NoZWR1bGUnLFxuICAgICAgbGFiZWw6ICdFbmQgRGF0ZScsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgIH0pLFxuICAgIFxuICAgIC8vIEJ1ZGdldCAmIFJPSVxuICAgIGJ1ZGdldGVkX2Nvc3Q6IEZpZWxkLmN1cnJlbmN5KHsgXG4gICAgICBncm91cDogJ2J1ZGdldCcsXG4gICAgICBsYWJlbDogJ0J1ZGdldGVkIENvc3QnLFxuICAgICAgbWluOiAwLFxuICAgIH0pLFxuICAgIFxuICAgIGFjdHVhbF9jb3N0OiBGaWVsZC5jdXJyZW5jeSh7IFxuICAgICAgZ3JvdXA6ICdidWRnZXQnLFxuICAgICAgbGFiZWw6ICdBY3R1YWwgQ29zdCcsXG4gICAgICBtaW46IDAsXG4gICAgfSksXG4gICAgXG4gICAgZXhwZWN0ZWRfcmV2ZW51ZTogRmllbGQuY3VycmVuY3koeyBcbiAgICAgIGdyb3VwOiAnYnVkZ2V0JyxcbiAgICAgIGxhYmVsOiAnRXhwZWN0ZWQgUmV2ZW51ZScsXG4gICAgICBtaW46IDAsXG4gICAgfSksXG4gICAgXG4gICAgLy8gXHUyNkQ0IE5PVCBgcmVhZG9ubHlgIChoZXJlIGFuZCBvbiB0aGUgbnVtXyogc25hcHNob3QgZmllbGRzIGJlbG93KSwgYW5kIHRoZVxuICAgIC8vIHJlYXNvbiBob2xkcyBvbiB0aGUgcGlubmVkIGVuZ2luZSByYXRoZXIgdGhhbiBvbiB0aGUgcmV0aXJlZCAxNi54IGNsYWltXG4gICAgLy8gdGhpcyBub3RlIHVzZWQgdG8gY2FycnkuIFRoZSBtZXRyaWMgYmxvY2sgXHUyMDE0IGBDQU1QQUlHTl9NRVRSSUNfRklFTERTYCBpblxuICAgIC8vIGBjYW1wYWlnbi5ob29rLnRzYCBcdTIwMTQgaXMgd3JpdHRlbiBieSBGT1VSIHJlZnJlc2ggaG9va3MsIG5vdCBieSB0aGVcbiAgICAvLyBsb25nLXJldGlyZWQgYGNhbXBhaWduX3NuYXBzaG90X21ldHJpY3NgOiBgY2FtcGFpZ25fbWV0cmljc19yZWZyZXNoYCxcbiAgICAvLyBgY2FtcGFpZ25fYXR0cmlidXRpb25fcmVmcmVzaGAsIGBjYW1wYWlnbl9sZWFkX2NvbnZlcnNpb25fcmVmcmVzaGAgYW5kXG4gICAgLy8gYGNhbXBhaWduX21lbWJlcl9tZXRyaWNzX3JlZnJlc2hgLiBFdmVyeSBvbmUgb2YgdGhlbSB3cml0ZXNcbiAgICAvLyBgYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduJykudXBkYXRlKC4uLilgLCBhbmQgbm9uZSBkZWNsYXJlcyBgSG9vay5ydW5Bc2AsXG4gICAgLy8gd2hpY2ggZGVmYXVsdHMgdG8gYCdpbmhlcml0J2AgXHUyMDE0IHNvIGBjdHguYXBpYCBpcyBhIGBTY29wZWRDb250ZXh0YCBvdmVyIHRoZVxuICAgIC8vIEFDVElORyBVU0VSJ3MgY29udGV4dCwgYW5kIHRoZSBrZXlzIGFyZSBDQUxMRVItc3VwcGxpZWQgdG8gYVxuICAgIC8vIG5vbi1gaXNTeXN0ZW1gIFVQREFURSwgZXhhY3RseSB3aGF0IGBzdHJpcFJlYWRvbmx5RmllbGRzYCBkZWxldGVzLiBUaGVpclxuICAgIC8vIGxlYXN0LXByaXZpbGVnZWQgdHJpZ2dlciBpcyBhbiBvcmRpbmFyeSB1c2VyIGVkaXQgXHUyMDE0IGEgcmVwIG1vdmluZyBhXG4gICAgLy8gY2FtcGFpZ24ncyBzdGF0dXMsIHNhdmluZyBhbiBvcHBvcnR1bml0eSwgZW5yb2xsaW5nIGEgbWVtYmVyIFx1MjAxNCBzb1xuICAgIC8vIGByZWFkb25seWAgaGVyZSB3b3VsZCBmcmVlemUgdGhlIHdob2xlIGJsb2NrIGF0IGl0cyBzZWVkZWQgdmFsdWVzLlxuICAgIC8vIE1lYXN1cmVkIGluIGB0ZXN0L2FjdGl2aXR5LXJlY2VuY3kudGVzdC50c2AsIHdoaWNoIHJ1bnMgdGhpcyBzYW1lXG4gICAgLy8gYGN0eC5hcGlgIHNoYXBlIHRocm91Z2ggdGhlIHJlYWwgZW5naW5lIHVuZGVyIGEgcGxhaW4gdXNlciBjb250ZXh0LlxuICAgIGFjdHVhbF9yZXZlbnVlOiBGaWVsZC5jdXJyZW5jeSh7IFxuICAgICAgZ3JvdXA6ICdidWRnZXQnLFxuICAgICAgbGFiZWw6ICdBY3R1YWwgUmV2ZW51ZScsXG4gICAgICBtaW46IDAsXG4gICAgfSksXG4gICAgXG4gICAgLy8gTWV0cmljc1xuICAgIHRhcmdldF9zaXplOiBGaWVsZC5udW1iZXIoe1xuICAgICAgZ3JvdXA6ICdtZXRyaWNzJyxcbiAgICAgIGxhYmVsOiAnVGFyZ2V0IFNpemUnLFxuICAgICAgZGVzY3JpcHRpb246ICdUYXJnZXQgbnVtYmVyIG9mIGxlYWRzL2NvbnRhY3RzJyxcbiAgICAgIG1pbjogMCxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBOT1QgYHJlYWRvbmx5YDogd3JpdHRlbiBieSB0aGUgc2FtZSBmb3VyIHJlZnJlc2ggaG9va3MsIGFuZCBmb3IgdGhlIHNhbWVcbiAgICAvLyByZWFzb24gXHUyMDE0IHNlZSB0aGUgbm90ZSBvbiBgYWN0dWFsX3JldmVudWVgIGFib3ZlLlxuICAgIC8vIERlZmluaXRpb246IHRvdGFsIG1lbWJlcnMgZW5yb2xsZWQuXG4gICAgbnVtX3NlbnQ6IEZpZWxkLm51bWJlcih7XG4gICAgICBncm91cDogJ21ldHJpY3MnLFxuICAgICAgbGFiZWw6ICdOdW1iZXIgU2VudCcsXG4gICAgICBtaW46IDAsXG4gICAgfSksXG4gICAgXG4gICAgbnVtX3Jlc3BvbnNlczogRmllbGQubnVtYmVyKHtcbiAgICAgIGdyb3VwOiAnbWV0cmljcycsXG4gICAgICBsYWJlbDogJ051bWJlciBvZiBSZXNwb25zZXMnLFxuICAgICAgbWluOiAwLFxuICAgIH0pLFxuICAgIFxuICAgIG51bV9sZWFkczogRmllbGQubnVtYmVyKHtcbiAgICAgIGdyb3VwOiAnbWV0cmljcycsXG4gICAgICBsYWJlbDogJ051bWJlciBvZiBMZWFkcycsXG4gICAgICBtaW46IDAsXG4gICAgfSksXG4gICAgXG4gICAgbnVtX2NvbnZlcnRlZF9sZWFkczogRmllbGQubnVtYmVyKHtcbiAgICAgIGdyb3VwOiAnbWV0cmljcycsXG4gICAgICBsYWJlbDogJ0NvbnZlcnRlZCBMZWFkcycsXG4gICAgICBtaW46IDAsXG4gICAgfSksXG4gICAgXG4gICAgbnVtX29wcG9ydHVuaXRpZXM6IEZpZWxkLm51bWJlcih7XG4gICAgICBncm91cDogJ21ldHJpY3MnLFxuICAgICAgbGFiZWw6ICdPcHBvcnR1bml0aWVzIENyZWF0ZWQnLFxuICAgICAgbWluOiAwLFxuICAgIH0pLFxuICAgIFxuICAgIG51bV93b25fb3Bwb3J0dW5pdGllczogRmllbGQubnVtYmVyKHtcbiAgICAgIGdyb3VwOiAnbWV0cmljcycsXG4gICAgICBsYWJlbDogJ1dvbiBPcHBvcnR1bml0aWVzJyxcbiAgICAgIG1pbjogMCxcbiAgICB9KSxcbiAgICBcbiAgICAvLyBDYWxjdWxhdGVkIE1ldHJpY3MgKEZvcm11bGEgRmllbGRzKVxuICAgIHJlc3BvbnNlX3JhdGU6IEZpZWxkLmZvcm11bGEoe1xuICAgICAgZ3JvdXA6ICdtZXRyaWNzJyxcbiAgICAgIGxhYmVsOiAnUmVzcG9uc2UgUmF0ZSAlJyxcbiAgICAgIGV4cHJlc3Npb246IEZgY29hbGVzY2UocmVjb3JkLm51bV9zZW50LCAwKSA+IDAgPyAoY29hbGVzY2UocmVjb3JkLm51bV9yZXNwb25zZXMsIDApICogMTAwLjApIC8gcmVjb3JkLm51bV9zZW50IDogMC4wYCxcbiAgICAgIHNjYWxlOiAyLFxuICAgIH0pLFxuICAgIFxuICAgIHJvaTogRmllbGQuZm9ybXVsYSh7XG4gICAgICBncm91cDogJ2J1ZGdldCcsXG4gICAgICBsYWJlbDogJ1JPSSAlJyxcbiAgICAgIGV4cHJlc3Npb246IEZgY29hbGVzY2UocmVjb3JkLmFjdHVhbF9jb3N0LCAwKSA+IDAgPyAoKGNvYWxlc2NlKHJlY29yZC5hY3R1YWxfcmV2ZW51ZSwgMCkgLSByZWNvcmQuYWN0dWFsX2Nvc3QpICogMTAwLjApIC8gcmVjb3JkLmFjdHVhbF9jb3N0IDogMC4wYCxcbiAgICAgIHNjYWxlOiAyLFxuICAgIH0pLFxuICAgIFxuICAgIC8vIE5vIGBwYXJlbnRfY2FtcGFpZ25gLiBDYW1wYWlnbiBoaWVyYXJjaHkgd2FzIGRlY2xhcmVkIGFuZCBuZXZlciB1c2VkOiBub1xuICAgIC8vIHBhZ2UsIGRvYyBvciByZXBvcnQgbWVudGlvbmVkIGl0LCBhbmQgdGhlIGhvbmVzdCBjb25zdW1lciBmb3IgaXQgXHUyMDE0IGFcbiAgICAvLyByb2xsZWQtdXAgUk9JIFx1MjAxNCBjYW5ub3QgYmUgb25lIGRlY2xhcmF0aW9uLiBgcm9pYCBoZXJlIGlzIGEgZm9ybXVsYSBvdmVyXG4gICAgLy8gdGhpcyBjYW1wYWlnbidzIE9XTiBgYWN0dWFsX2Nvc3RgIC8gYGFjdHVhbF9yZXZlbnVlYCwgc28gYSBoaWVyYXJjaHkgUk9JXG4gICAgLy8gd291bGQgcHV0IGEgc2Vjb25kLCBkaWZmZXJlbnRseS1zY29wZWQgUk9JIG9uIHRoZSBzYW1lIHJlY29yZCBhbmQgbGVhdmVcbiAgICAvLyBldmVyeSByZWFkZXIgdG8gZ3Vlc3Mgd2hpY2ggb25lIHRoZXkgd2VyZSBsb29raW5nIGF0LlxuICAgIFxuICAgIC8vIENhbXBhaWduIEFzc2V0c1xuICAgIGxhbmRpbmdfcGFnZV91cmw6IEZpZWxkLnVybCh7XG4gICAgICBncm91cDogJ2Fzc2V0cycsXG4gICAgICBsYWJlbDogJ0xhbmRpbmcgUGFnZScsXG4gICAgfSksXG4gICAgXG4gICAgaXNfYWN0aXZlOiBGaWVsZC5ib29sZWFuKHtcbiAgICAgIGdyb3VwOiAnYXNzZXRzJyxcbiAgICAgIGxhYmVsOiAnQWN0aXZlJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogdHJ1ZSxcbiAgICB9KSxcbiAgfSxcbiAgXG4gIC8vIERhdGFiYXNlIGluZGV4ZXNcbiAgaW5kZXhlczogW1xuICAgIHsgZmllbGRzOiBbJ25hbWUnXSB9LFxuICAgIHsgZmllbGRzOiBbJ3R5cGUnXSB9LFxuICAgIHsgZmllbGRzOiBbJ3N0YXR1cyddIH0sXG4gICAgeyBmaWVsZHM6IFsnc3RhcnRfZGF0ZSddIH0sXG4gICAgeyBmaWVsZHM6IFsnb3duZXJfaWQnXSB9LFxuICBdLFxuICBcbiAgLy8gRW5hYmxlIGFkdmFuY2VkIGZlYXR1cmVzXG4gIC8vIEFQSSBzdXJmYWNlLiBIaXN0b3J5IFx1MjE5MiBGaWVsZC50cmFja0hpc3RvcnkgKEFEUi0wMDUyKS5cbiAgZW5hYmxlOiB7XG4gICAgYXBpRW5hYmxlZDogdHJ1ZSxcbiAgICBhcGlNZXRob2RzOiBbJ2dldCcsICdsaXN0JywgJ2NyZWF0ZScsICd1cGRhdGUnLCAnZGVsZXRlJ10sXG4gIH0sXG4gIFxuICAvLyBWYWxpZGF0aW9uIFJ1bGVzXG4gIC8vXG4gIC8vIFByZWRpY2F0ZXMgYmVsb3cgYXJlIFRPVEFMOiBldmVyeSBgcmVjb3JkLnhgIHJlYWQgaXMgYGhhcygpYC1ndWFyZGVkLCBzbyB0aGVcbiAgLy8gcnVsZSByZXR1cm5zIGEgdmVyZGljdCBldmVuIHdoZW4gdGhlIG1lcmdlZCByZWNvcmQgaGFzIG5vIHN1Y2gga2V5LiBTZWVcbiAgLy8gQUdFTlRTLm1kIFwiVmFsaWRhdGlvbiBwcmVkaWNhdGVzIG11c3QgYmUgVE9UQUxcIiBhbmRcbiAgLy8gdGVzdC9vYmplY3QtdmFsaWRhdGlvbi1wcmVkaWNhdGVzLnRlc3QudHMsIHdoaWNoIGZhaWxzIHRoZSBidWlsZCBvdGhlcndpc2UuXG4gIHZhbGlkYXRpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2VuZF9hZnRlcl9zdGFydCcsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0VuZCBEYXRlIG11c3QgYmUgYWZ0ZXIgU3RhcnQgRGF0ZScsXG4gICAgICAvLyBgPD1gLCBub3QgYDxgOiB0aGUgbWVzc2FnZSBwcm9taXNlcyBcImFmdGVyXCIsIHNvIGEgY2FtcGFpZ24gdGhhdCBlbmRzXG4gICAgICAvLyB0aGUgZGF5IGl0IHN0YXJ0cyBpcyBhIHZpb2xhdGlvbi4gTWF0Y2hlcyBgY3JtX2NvbnRyYWN0YCdzIHR3aW4gcnVsZVxuICAgICAgLy8gYW5kIGBjcm1fZm9yZWNhc3QucGVyaW9kX2VuZF9hZnRlcl9zdGFydGAgKCM1MTQgaXRlbSAxMikuXG4gICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5lbmRfZGF0ZSkgJiYgcmVjb3JkLmVuZF9kYXRlICE9IG51bGwgJiYgaGFzKHJlY29yZC5zdGFydF9kYXRlKSAmJiByZWNvcmQuc3RhcnRfZGF0ZSAhPSBudWxsICYmIHJlY29yZC5lbmRfZGF0ZSA8PSByZWNvcmQuc3RhcnRfZGF0ZWAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnYWN0dWFsX2Nvc3Rfd2l0aGluX2J1ZGdldCcsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnd2FybmluZycsXG4gICAgICBtZXNzYWdlOiAnQWN0dWFsIENvc3QgZXhjZWVkcyBCdWRnZXRlZCBDb3N0JyxcbiAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmFjdHVhbF9jb3N0KSAmJiByZWNvcmQuYWN0dWFsX2Nvc3QgIT0gbnVsbCAmJiBoYXMocmVjb3JkLmJ1ZGdldGVkX2Nvc3QpICYmIHJlY29yZC5idWRnZXRlZF9jb3N0ICE9IG51bGwgJiYgcmVjb3JkLmFjdHVhbF9jb3N0ID4gcmVjb3JkLmJ1ZGdldGVkX2Nvc3RgLFxuICAgIH0sXG4gIF0sXG4gIFxuICAvLyBXb3JrZmxvdyBSdWxlc1xuICAvLyBcdTI2QTBcdUZFMEYgTm8gYHdvcmtmbG93c1tdYCBoZXJlLCBhbmQgbm9uZSBpcyBwb3NzaWJsZTogb2JqZWN0IGB3b3JrZmxvd3NbXWAgd2VyZVxuICAvLyByZW1vdmVkIGZyb20gdGhlIHBsYXRmb3JtLiBGaWVsZCB1cGRhdGVzIGxpdmUgaW4gdGhpcyBvYmplY3QncyBgKi5ob29rLnRzYDtcbiAgLy8gc2NoZWR1bGVkIHN0YXR1cyBmbGlwcyBhbmQgbm90aWZpY2F0aW9ucyBsaXZlIGluIGBzcmMvKi9mbG93cy8qLmZsb3cudHNgLlxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbl9tZW1iZXIub2JqZWN0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9vYmplY3RzL2NhbXBhaWduX21lbWJlci5vYmplY3QudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IE9iamVjdFNjaGVtYSwgRmllbGQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB7IFAgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogQ2FtcGFpZ24gTWVtYmVyIE9iamVjdFxuICpcbiAqIExpbmtzIGEgTGVhZCBPUiBDb250YWN0IHRvIGEgQ2FtcGFpZ24gYW5kIHRyYWNrcyB0aGUgcmVzcG9uc2VcbiAqIGxpZmVjeWNsZSBgc2VudCBcdTIxOTIgcmVzcG9uZGVkIC8gY29udmVydGVkIC8gdW5zdWJzY3JpYmVkYC5cbiAqIFVzZWQgYnkgdGhlIGNhbXBhaWduLWVucm9sbG1lbnQgZmxvdyBhbmQgYnkgUk9JIGRhc2hib2FyZHMuXG4gKlxuICogXHUyNkEwXHVGRTBGIFRoZSBsaWZlY3ljbGUgc3RvcHMgd2hlcmUgdGhlIHBsYXRmb3JtJ3Mgd3JpdGVycyBzdG9wICgjNTk3KS4gSXQgdXNlZCB0b1xuICogcmVhZCBgU2VudCBcdTIxOTIgT3BlbmVkIFx1MjE5MiBDbGlja2VkIFx1MjE5MiBSZXNwb25kZWQgXHUyMTkyIENvbnZlcnRlZGAgd2l0aCBgYm91bmNlZGAgYmVzaWRlXG4gKiBpdCwgcGx1cyBgZmlyc3Rfb3BlbmVkX2RhdGVgIC8gYGZpcnN0X2NsaWNrZWRfZGF0ZWAgc3RhbXBzIFx1MjAxNCBzaXggdmFsdWVzIGFuZFxuICogdHdvIGNvbHVtbnMgdGhhdCBOT1RISU5HIGluIHRoaXMgYXBwIG9yIG9uIHRoZSBwbGF0Zm9ybSBjb3VsZCBldmVyIHdyaXRlLlxuICogYEBvYmplY3RzdGFjay9wbHVnaW4tZW1haWxgIGlzIFwidHJhbnNwb3J0LXBsdWdnYWJsZSBPVVRCT1VORCBkZWxpdmVyeSB3aXRoXG4gKiBzeXNfZW1haWwgcGVyc2lzdGVuY2VcIjogaXRzIGBzeXNfZW1haWwuc3RhdHVzYCB2b2NhYnVsYXJ5IGlzXG4gKiBgcXVldWVkIHwgc2VudCB8IGZhaWxlZGAsIHRoZXJlIGlzIG5vIG9wZW4vY2xpY2sgd2ViaG9vaywgbm8gYm91bmNlXG4gKiBpbmdlc3Rpb24sIGFuZCBubyB0cmFja2luZyBwaXhlbCBhbnl3aGVyZSBpbiB0aGUgaW5zdGFsbGVkIHBsYXRmb3JtXG4gKiAobWVhc3VyZWQgb24gMTcuMC4wLXJjLjYpLiBTbyBhbiBhdXRob3IgcmVhZGluZyB0aGlzIG9iamVjdCB3YXMgcHJvbWlzZWRcbiAqIGVuZ2FnZW1lbnQgdHJhY2tpbmcgdGhlIHByb2R1Y3QgY2Fubm90IGRlbGl2ZXIsIGFuZCBldmVyeSBvbmUgb2YgdGhvc2VcbiAqIHZhbHVlcyB3b3VsZCBoYXZlIHN0YXllZCBhdCBpdHMgZGVmYXVsdCBmb3JldmVyLlxuICpcbiAqIFJlbW92ZWQgcmF0aGVyIHRoYW4gd2lyZWQsIHBlciBBRFItMDA0OSdzIGVuZm9yY2Utb3ItcmVtb3ZlIHNwaXJpdDogdGhleVxuICogY29tZSBiYWNrIHRoZSBkYXkgYSByZWFsIHRyYWNraW5nIGludGVncmF0aW9uIGV4aXN0cyB0byB3cml0ZSB0aGVtLCBhbmQgbm90XG4gKiBiZWZvcmUuIFdoYXQgc3Vydml2ZXMgaXMgdGhlIHBhcnQgd2l0aCBhIHJlYWwgd3JpdGVyIFx1MjAxNCBzZWUgdGhlIHdyaXRlciB0YWJsZVxuICogYmVzaWRlIGVhY2ggZmllbGQgYmVsb3cuXG4gKi9cbmV4cG9ydCBjb25zdCBDYW1wYWlnbk1lbWJlciA9IE9iamVjdFNjaGVtYS5jcmVhdGUoe1xuICBuYW1lOiAnY3JtX2NhbXBhaWduX21lbWJlcicsXG4gIGxhYmVsOiAnQ2FtcGFpZ24gTWVtYmVyJyxcbiAgcGx1cmFsTGFiZWw6ICdDYW1wYWlnbiBNZW1iZXJzJyxcbiAgaWNvbjogJ3VzZXItcGx1cycsXG4gIGRlc2NyaXB0aW9uOiAnTWVtYmVyc2hpcCBhbmQgcmVzcG9uc2UgdHJhY2tpbmcgZm9yIG1hcmtldGluZyBjYW1wYWlnbnMnLFxuXG4gIC8vIEFEUi0wMDkwIEQxL0Q3OiBPV0QgaXMgYW4gYXV0aG9yZWQgZGVjaXNpb24uIE1lbWJlcnNoaXAgaXMgYW4gYXR0cmlidXRlIG9mXG4gIC8vIHRoZSBjYW1wYWlnbiwgc28gcmVjb3JkIGFjY2VzcyBERVJJVkVTIGZyb20gaXQgKEFEUi0wMDU1KS4gVGhlIHJlbGF0aW9uXG4gIC8vIHJlc29sdmVyIGFjY2VwdHMgdGhlIFJFUVVJUkVEIGBjcm1fY2FtcGFpZ25gIExPT0tVUCBhcyB0aGUgcGFyZW50LCBzbyBub1xuICAvLyBtYXN0ZXItZGV0YWlsIGNvbnZlcnNpb24gaXMgbmVlZGVkLlxuICAvL1xuICAvLyBUaGUgZGVyaXZhdGlvbiBkZWxpdmVycyBleGFjdGx5IFwibWVtYmVycyB3aG9zZSBgY3JtX2NhbXBhaWduYCB0aGUgY2FsbGVyXG4gIC8vIGNhbiByZWFkXCIuIFx1MjZBMFx1RkUwRiBNYXN0ZXIgYWNjZXNzaWJpbGl0eSByZXNvbHZlcyB0aHJvdWdoIHRoZSBzYW1lIHBhdGhzIGEgZGlyZWN0XG4gIC8vIHJlYWQgb2YgdGhlIGNhbXBhaWduIHRha2VzIFx1MjAxNCBvd25lcnNoaXAgYW5kIGBzeXNfcmVjb3JkX3NoYXJlYCBncmFudHMgZm9sZGVkXG4gIC8vIGluIEFMT05HU0lERSB0aGUgbWFzdGVyJ3Mgcm93LWxldmVsIHNlY3VyaXR5IHBvbGljaWVzLCBub3QgdGhlIHBvbGljaWVzXG4gIC8vIGFsb25lLiBgdGVzdC9wYXJlbnQtZGVyaXZlZC1yZWFjaC50ZXN0LnRzYCBwaW5zIHRoYXQsIGFuZCB3YXMgd3JpdHRlbiB0byBnb1xuICAvLyByZWQgdGhlIGRheSB0aGUgcGxhdGZvcm0gY2hhbmdlcyBpdDogYW4gZWFybGllciB2ZXJzaW9uIGNvbnN1bHRlZCBtYXN0ZXJcbiAgLy8gUkxTIE9OTFksIHVuZGVyIGEgU1lTVEVNIGNvbnRleHQsIHNvIHdpdGggbm8gcG9saWN5IG5hcnJvd2luZyBhIFNFTEVDVCBvblxuICAvLyBgY3JtX2NhbXBhaWduYCBhIG1lbWJlciByb3cgd2FzIHJlYWRhYmxlIGJ5IGV2ZXJ5IGhvbGRlciBvZiBvYmplY3QtbGV2ZWxcbiAgLy8gcmVhZCBvbiB0aGlzIG9iamVjdC5cbiAgLy9cbiAgLy8gXHUyNkEwXHVGRTBGIFRoZSB3cml0ZSBzaWRlIHJlYWNoZXMgZnVydGhlciB0aGFuIHJlYWRzOiB0aGUgcGxhdGZvcm0nc1xuICAvLyBgbWVtYmVyX2RlZmF1bHRgIHNldCBjYXJyaWVzIGFuIG93bmVyLW9ubHktd3JpdGVzIFJMUyBwb2xpY3kgb24gdXBkYXRlcyxcbiAgLy8gYW5kIGJlY2F1c2UgdGhlIGRlcml2YXRpb24gZm9sZHMgbWFzdGVyIFJMUyBpbiwgdGhhdCBwb2xpY3kgcmVhY2hlcyB0aHJvdWdoXG4gIC8vIHRvIG1lbWJlciB3cml0ZXMgXHUyMDE0IHNlZSB0aGUgYG1hcmtldGluZ19jYW1wYWlnbl91cGRhdGVzYCBub3RlIGluXG4gIC8vIGBzcmMvc2FsZXMvcHJvZmlsZXMvbWFya2V0aW5nLXVzZXIucHJvZmlsZS50c2AuXG4gIC8vXG4gIC8vIFx1MjZENCBOb3QgYHByaXZhdGVgOiB3aXRoIG5vIG93bmVyIGZpZWxkIG9uIHRoZSBqdW5jdGlvbiByb3cgdGhhdCByZXNvbHZlcyB0b1xuICAvLyBcIndob2V2ZXIgaW5zZXJ0ZWQgaXRcIiwgd2hpY2ggaXMgbm9ib2R5J3MgaWRlYSBvZiBjYW1wYWlnbiBtZW1iZXJzaGlwIGFuZFxuICAvLyBoaWRlcyByb3dzIHdyaXR0ZW4gYnkgdGhlIGVucm9sbG1lbnQgZmxvdy5cbiAgc2hhcmluZ01vZGVsOiAnY29udHJvbGxlZF9ieV9wYXJlbnQnLFxuXG4gIC8vIFBlci1maWVsZCBoaXN0b3J5IGlzIG9wdC1pbiB2aWEgYEZpZWxkLnRyYWNrSGlzdG9yeWAgKEFEUi0wMDUyKSwgc2V0IG9uXG4gIC8vIGBzdGF0dXNgIGJlbG93IFx1MjAxNCB0aGVyZSBpcyBubyBvYmplY3QtbGV2ZWwgaGlzdG9yeSBmbGFnLlxuXG4gIC8vIEFEUi0wMDc5OiBqdW5jdGlvbiByb3dzIGhhdmUgbm8gZGVyaXZhYmxlIHRleHQgdGl0bGU7IHBvaW50IHRoZSBjYW5vbmljYWxcbiAgLy8gbmFtZUZpZWxkIGF0IHRoZSBzdG9yZWQgYXV0b251bWJlciBleHBsaWNpdGx5IChhdXRvbnVtYmVyIGlzIG5vdCBpbiB0aGVcbiAgLy8gYXV0by1kZXJpdmF0aW9uIHdoaXRlbGlzdCkuXG4gIG5hbWVGaWVsZDogJ21lbWJlcl9udW1iZXInLFxuXG4gIC8vIExvYWQtYmVhcmluZyBvbiBUV08gc3VyZmFjZXMsIGFuZCB0aGUgc2Vjb25kIG9uZSBpcyB3aHkgdGhpcyBsaXN0IGlzIG5vdFxuICAvLyB0aGUgc2lkZSB0aGF0IGdhdmUgd2F5IHRvIGZpeCBgZmllbGQtZ3JvdXAtc2hhZG93ZWRgIGJlbG93ICgjNzE1KS4gQmVzaWRlcyB0aGVcbiAgLy8gZGV0YWlsIGhpZ2hsaWdodCBzdHJpcCwgaXQgaXMgd2hhdCBjdXJhdGVzIHRoZSBtZW1iZXJzIHBhbmVsIG9uIGFcbiAgLy8gY2FtcGFpZ24ncyBkZXRhaWwgcGFnZTogYSByZWxhdGVkIGxpc3QgdGFrZXMgaXRzIGNvbHVtbnMgZnJvbSB0aGUgY2hpbGQnc1xuICAvLyBgaGlnaGxpZ2h0RmllbGRzYCBtaW51cyB0aGUgbG9va3VwIGl0IGlzIHNjb3BlZCBieSwgYW5kIHRoaXMgb2JqZWN0IHNoaXBzXG4gIC8vIG5vIHZpZXcgYXQgYWxsLCBzbyBkcm9wcGluZyBgY3JtX2xlYWRgL2Bjcm1fY29udGFjdGAgaGVyZSB3b3VsZCBsZWF2ZSB0aGF0XG4gIC8vIHBhbmVsIHNob3dpbmcgU3RhdHVzIC8gUmVzcG9uc2UgRGF0ZSBhbmQgbm8gcGVyc29uIFx1MjAxNCBtZWFzdXJlZCBhbmQgcGlubmVkIGluXG4gIC8vIGB0ZXN0L3ZpZXctcmVmZXJlbmNlcy50ZXN0LnRzYCAoIzk0NCkuXG4gIGhpZ2hsaWdodEZpZWxkczogWydjcm1fY2FtcGFpZ24nLCAnY3JtX2xlYWQnLCAnY3JtX2NvbnRhY3QnLCAnc3RhdHVzJywgJ3Jlc3BvbnNlX2RhdGUnXSxcblxuICAvLyBCb3RoIGdyb3VwcyByZW5kZXIgb24gZGV0YWlsIHBhZ2VzIGFzIHdlbGwgYXMgb24gZm9ybXMsIGFuZCBrZWVwaW5nIHRoZW1cbiAgLy8gdGhhdCB3YXkgaXMgYSBjb25zdHJhaW50IG9uIHRoZSB0d28gbGlzdHMgYWJvdmUsIG5vdCBhIGZyZWUgY2hvaWNlICgjNzE1KS5cbiAgLy8gQSBzeW50aGVzaXplZCBkZXRhaWwgcGFnZSBob2lzdHMgdGhlIHJlY29yZCB0aXRsZSBwbHVzIHRoZSBmaXJzdCBmb3VyXG4gIC8vIGhpZ2hsaWdodEZpZWxkcyBvdXQgb2YgdGhlIGJvZHksIHNvIGEgZ3JvdXAgd2hvc2UgZXZlcnkgZmllbGQgaXMgaG9pc3RlZFxuICAvLyBrZWVwcyBpdHMgaGVhZGluZyBvbiBmb3JtcyBhbmQgc2lsZW50bHkgZGlzYXBwZWFycyBmcm9tIGRldGFpbCBwYWdlc1xuICAvLyAoYGZpZWxkLWdyb3VwLXNoYWRvd2VkYCkuXG4gIC8vIGBiYXNpY2Agd2FzIGV4YWN0bHkgdGhhdDogbWVtYmVyX251bWJlciBpcyB0aGUgdGl0bGUsIGFuZCBjYW1wYWlnbi9sZWFkL1xuICAvLyBjb250YWN0IGFyZSB0aGUgZmlyc3QgdGhyZWUgb2YgdGhlIHN0cmlwLiBgYWRkZWRfZGF0ZWAgXHUyMDE0IHRoZSBlbnJvbGxtZW50XG4gIC8vIHN0YW1wLCB3aGljaCBkZXNjcmliZXMgdGhlIE1FTUJFUlNISVAgcmF0aGVyIHRoYW4gdGhlIHBlcnNvbidzIHJlc3BvbnNlIFx1MjAxNFxuICAvLyBzaXRzIGhlcmUgcmF0aGVyIHRoYW4gdW5kZXIgYHJlc3BvbnNlYCBzbyB0aGUgZ3JvdXAgaGFzIHNvbWV0aGluZyBvZiBpdHNcbiAgLy8gb3duIHRvIHNob3cuIFNhbWUgcmVzb2x1dGlvbiBhcyBgY3JtX3Rhc2tgJ3Mgc2hhZG93ZWQgYGFzc2lnbm1lbnRgIGdyb3VwXG4gIC8vICgjNTgyKTogbW92ZSB0aGUgZmllbGQgdG8gdGhlIGdyb3VwIGl0IHJlYWRzIHVuZGVyLCBsZWF2ZSB0aGUgc3RyaXAgYWxvbmUuXG4gIGZpZWxkR3JvdXBzOiBbXG4gICAgeyBrZXk6ICdiYXNpYycsICAgIGxhYmVsOiAnQmFzaWMgSW5mb3JtYXRpb24nLCBpY29uOiAnaW5mbycgfSxcbiAgICB7IGtleTogJ3Jlc3BvbnNlJywgbGFiZWw6ICdSZXNwb25zZSBUcmFja2luZycsIGljb246ICdhY3Rpdml0eScgfSxcbiAgXSxcblxuICBmaWVsZHM6IHtcbiAgICBtZW1iZXJfbnVtYmVyOiBGaWVsZC5hdXRvbnVtYmVyKHtcbiAgICAgIGxhYmVsOiAnTWVtYmVyIE51bWJlcicsXG4gICAgICBmb3JtYXQ6ICdDTS17MDAwMDB9JyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgIH0pLFxuXG4gICAgY3JtX2NhbXBhaWduOiBGaWVsZC5sb29rdXAoJ2NybV9jYW1wYWlnbicsIHtcbiAgICAgIGxhYmVsOiAnQ2FtcGFpZ24nLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICBzdG9yYWdlOiB7IG5vdE51bGw6IHRydWUgfSxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuXG4gICAgICAvLyBDdXJhdGVzIHRoZSBtZW1iZXJzIHBhbmVsIG9uIGEgY2FtcGFpZ24gXHUyMDE0IGFuZCBpdCBpcyB0aGUgT05FIG1lY2hhbmlzbVxuICAgICAgLy8gdGhhdCBhY3R1YWxseSByZWFjaGVzIHRoYXQgcGFuZWwuIE1lYXN1cmVkIGluICM5NDQgYW5kIHJlc3RhdGVkIGluXG4gICAgICAvLyBgdGVzdC92aWV3LXJlZmVyZW5jZXMudGVzdC50c2A6IGEgZGV0YWlsLXBhZ2UgcmVsYXRlZCBsaXN0IHJlYWRzXG4gICAgICAvLyBgcmVsYXRlZExpc3RDb2x1bW5zYCBvbiB0aGUgQ0hJTEQncyBsb29rdXAgZmlyc3QsIGFuZCBvbmx5IHdpdGhvdXQgaXRcbiAgICAgIC8vIGZhbGxzIGJhY2sgdG8gdGhlIGNoaWxkJ3MgYGhpZ2hsaWdodEZpZWxkc2AgbWludXMgdGhpcyBsb29rdXAuIFRoZVxuICAgICAgLy8gY2hpbGQncyBgbGlzdGAgdmlldyBpcyBuZXZlciBjb25zdWx0ZWQsIHdoaWNoIGlzIHdoeSBhdXRob3Jpbmcgb25lXG4gICAgICAvLyBoZXJlIHdvdWxkIG5vdCBoYXZlIHNob3duIGFueXRoaW5nLlxuICAgICAgLy9cbiAgICAgIC8vIEl0IGlzIGEgU1VQRVJTRVQgb2YgdGhlIGZhbGxiYWNrIGl0IHJlcGxhY2VzIFx1MjAxNCBMZWFkIC8gQ29udGFjdCAvXG4gICAgICAvLyBTdGF0dXMgLyBSZXNwb25zZSBEYXRlLCBpbiB0aGF0IG9yZGVyIFx1MjAxNCBwbHVzIHRoZSBvbmUgY29sdW1uIHRoZSBwYW5lbFxuICAgICAgLy8gd2FzIG1pc3NpbmcuIGBhZGRlZF9kYXRlYCBpcyB0aGUgZW5yb2xsbWVudCBzdGFtcDogYHJlYWRvbmx5OiB0cnVlYFxuICAgICAgLy8gKCMxNjY3KSBhbmQgd3JpdHRlbiBvbiBldmVyeSBlbnJvbGxtZW50IGJ5IHRoZSB0d28gZWxldmF0ZWQgc3ViLWZsb3dzXG4gICAgICAvLyAjMTgwNyBidWlsdCBmb3IgaXQsIHNvIGEgbWFya2V0ZXIgY291bGQgc2VlIFdIRU4gYSBtZW1iZXIgcmVzcG9uZGVkXG4gICAgICAvLyBidXQgbm90IHdoZW4gdGhleSB3ZXJlIGFkZGVkLCBvbiBhIHJlZ2lzdGVyIHdob3NlIHdob2xlIHN1YmplY3QgaXNcbiAgICAgIC8vIHRoZSBlbnJvbGxtZW50LiBJdCBzaXRzIGFmdGVyIHRoZSBwZXJzb24gYW5kIGJlZm9yZSB0aGUgcmVzcG9uc2VcbiAgICAgIC8vIGxpZmVjeWNsZSwgd2hpY2ggaXMgdGhlIG9yZGVyIHRoZSByb3cgaGFwcGVucyBpbi5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2RDQgRGVsaWJlcmF0ZWx5IE5PVCBzb2x2ZWQgYnkgYWRkaW5nIGBhZGRlZF9kYXRlYCB0b1xuICAgICAgLy8gYGhpZ2hsaWdodEZpZWxkc2A6IHRoYXQgc3RyaXAgaXMgaG9pc3RlZCBvdXQgb2YgdGhlIGRldGFpbCBib2R5LCBhbmRcbiAgICAgIC8vIGBhZGRlZF9kYXRlYCBpcyB0aGUgb25seSBmaWVsZCBpbiB0aGUgYGJhc2ljYCBncm91cCB0aGF0IGlzIG5laXRoZXJcbiAgICAgIC8vIHRoZSByZWNvcmQgdGl0bGUgbm9yIGFscmVhZHkgaW4gdGhlIHN0cmlwIFx1MjAxNCBob2lzdGluZyBpdCB3b3VsZCBsZWF2ZVxuICAgICAgLy8gdGhlIGdyb3VwIHdpdGggbm90aGluZyBvZiBpdHMgb3duIGFuZCBzaWxlbnRseSB2YW5pc2ggaXRzIGhlYWRpbmdcbiAgICAgIC8vIGZyb20gZXZlcnkgZGV0YWlsIHBhZ2UgKGBmaWVsZC1ncm91cC1zaGFkb3dlZGAsIHRoZSB0cmFwIHRoZSBub3RlXG4gICAgICAvLyBhYm92ZSB0aGlzIG9iamVjdCdzIGBmaWVsZEdyb3Vwc2AgcmVjb3JkcyBiZWluZyByZXNjdWVkIGZyb20pLlxuICAgICAgcmVsYXRlZExpc3RDb2x1bW5zOiBbJ2NybV9sZWFkJywgJ2NybV9jb250YWN0JywgJ2FkZGVkX2RhdGUnLCAnc3RhdHVzJywgJ3Jlc3BvbnNlX2RhdGUnXSxcbiAgICB9KSxcblxuICAgIC8vIGBkZWxldGVCZWhhdmlvcjogJ2Nhc2NhZGUnYCBvbiBCT1RIIHBhcnR5IGxvb2t1cHMgKCM2OTYpLiBBIGxvb2t1cFxuICAgIC8vIGRlZmF1bHRzIHRvIGBzZXRfbnVsbGAsIGFuZCB0aGF0IGRlZmF1bHQgbWFkZSBldmVyeSBlbnJvbGxlZCBwZXJzb25cbiAgICAvLyBwZXJtYW5lbnRseSB1bmRlbGV0YWJsZTogZGVsZXRpbmcgdGhlIGxlYWQgY2xlYXJlZCB0aGlzIGNvbHVtbiwgdGhlXG4gICAgLy8gY2xlYXJlZCByb3cgaW5zdGFudGx5IHZpb2xhdGVkIGBsZWFkX29yX2NvbnRhY3RfcmVxdWlyZWRgIGJlbG93LCBhbmQgdGhlXG4gICAgLy8gd2hvbGUgZGVsZXRlIHJvbGxlZCBiYWNrIHdpdGggYSA0MDAgbmFtaW5nIGFuIG9iamVjdCB0aGUgY2FsbGVyIG5ldmVyXG4gICAgLy8gdG91Y2hlZCAoXCJBIGNhbXBhaWduIG1lbWJlciBtdXN0IHJlZmVyZW5jZSBlaXRoZXIgYSBMZWFkIG9yIGEgQ29udGFjdFwiLFxuICAgIC8vIGBcIm9iamVjdFwiOlwiY3JtX2xlYWRcImApLiBBIEdEUFIgXCJkZWxldGUgdGhpcyBwZXJzb25cIiByZXF1ZXN0IGNvdWxkIG5vdCBiZVxuICAgIC8vIHNlcnZlZCB0aHJvdWdoIHRoZSBBUEkgb3IgdGhlIFVJLlxuICAgIC8vXG4gICAgLy8gQ2FzY2FkZSByYXRoZXIgdGhhbiBgcmVzdHJpY3RgOiB0aGlzIGlzIGEgSlVOQ1RJT04gcm93IHdob3NlIGVudGlyZVxuICAgIC8vIG1lYW5pbmcgaXMgXCJ0aGlzIHBlcnNvbiBpcyBlbnJvbGxlZCBpbiB0aGlzIGNhbXBhaWduXCIuIE9uY2UgdGhlIHBlcnNvbiBpc1xuICAgIC8vIGdvbmUgdGhlIHJvdyBkZW5vdGVzIG5vdGhpbmcsIHNvIGtlZXBpbmcgaXQgKHJlc3RyaWN0KSB3b3VsZCBvbmx5IHRyYWRlXG4gICAgLy8gb25lIHVuZGVsZXRhYmxlIHBlcnNvbiBmb3IgYSBtYW51YWwgdW4tZW5yb2wgY2hvcmUsIGFuZCB0aGUgaW1wYWN0IHRoaXNcbiAgICAvLyBmaXhlcyBpcyB1bmRlbGV0YWJsZSBwZW9wbGUsIG5vdCBhIGNvbmZ1c2luZyBtZXNzYWdlLiBDYXNjYWRlIGFsc28gbWFrZXNcbiAgICAvLyB0aGUgb2JqZWN0J3Mgb3duIHJ1bGUgdW5mYWxzaWZpYWJsZSBieSBjb25zdHJ1Y3Rpb246IHRoZXJlIGlzIG5vIGxvbmdlciBhXG4gICAgLy8gcmVhY2hhYmxlIHN0YXRlIGluIHdoaWNoIGEgc3RvcmVkIG1lbWJlciByb3cgYnJlYWtzIGl0LlxuICAgIGNybV9sZWFkOiBGaWVsZC5sb29rdXAoJ2NybV9sZWFkJywge1xuICAgICAgbGFiZWw6ICdMZWFkJyxcbiAgICAgIGdyb3VwOiAnYmFzaWMnLFxuICAgICAgZGVsZXRlQmVoYXZpb3I6ICdjYXNjYWRlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2V0IHdoZW4gdGhlIG1lbWJlciB3YXMgYSBMZWFkIGF0IGVucm9sbG1lbnQgdGltZScsXG4gICAgfSksXG5cbiAgICBjcm1fY29udGFjdDogRmllbGQubG9va3VwKCdjcm1fY29udGFjdCcsIHtcbiAgICAgIGxhYmVsOiAnQ29udGFjdCcsXG4gICAgICBncm91cDogJ2Jhc2ljJyxcbiAgICAgIGRlbGV0ZUJlaGF2aW9yOiAnY2FzY2FkZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NldCB3aGVuIHRoZSBtZW1iZXIgaXMgYW4gZXhpc3RpbmcgQ29udGFjdCcsXG4gICAgfSksXG5cbiAgICAvLyBcdTJCNTAgYHJlYWRvbmx5OiB0cnVlYCBcdTIwMTQgREVDTEFSRUQsIGFuZCBpdCBzdGlsbCBjb3N0cyBubyB3cml0ZXIgaXRzIHdyaXRlLFxuICAgIC8vIGJ1dCB0aGUgcmVhc29uIENIQU5HRUQgb24gdGhlIEBvYmplY3RzdGFjay8qIDE3LjQuMCBtaWdyYXRpb24uIEl0IHVzZWQgdG9cbiAgICAvLyBiZSBcInRoZSBzdHJpcCBpcyBhbiBVUERBVEUtcGF0aCBydWxlIGFuZCBldmVyeSB3cml0ZXIgaGVyZSBpcyBhbiBJTlNFUlRcIi5cbiAgICAvLyBvYmplY3RxbCAxNy40LjAgcmV0aXJlZCB0aGF0OiBhIHN0YXRpYyByZWFkb25seSBmaWVsZCBpcyBub3cgc3RyaXBwZWQgZnJvbVxuICAgIC8vIGEgTk9OLVNZU1RFTSBjYWxsZXIncyBJTlNFUlQgcGF5bG9hZCBpbnNpZGUgYGVuZ2luZS5pbnNlcnRgIHRvbywgc28gYW5cbiAgICAvLyBvcmRpbmFyeSB1c2VyLWNvbnRleHQgY3JlYXRlIG5vIGxvbmdlciBzZWVkcyB0aGlzIGNvbHVtbi5cbiAgICAvL1xuICAgIC8vIEV2ZXJ5IHdyaXRlciBpcyB0aGVyZWZvcmUgZWxldmF0ZWQgbm93LCBhbmQgdGhlIGVsZXZhdGlvbiBpcyBzY29wZWQgYXNcbiAgICAvLyBuYXJyb3dseSBhcyBBR0VOVFMubWQgaG91c2UgcnVsZSA5IHJlcXVpcmVzIFx1MjAxNCB0aGUgYGNhbXBhaWduX2Vucm9sbG1lbnRgXG4gICAgLy8gU0NSRUVOIGZsb3cgc3RheXMgYHJ1bkFzOiAndXNlcidgIGFuZCBoYW5kcyBvbmx5IHRoZSBpbnNlcnQgdG9cbiAgICAvLyBgY2FtcGFpZ25fbGVhZF9tZW1iZXJfZW5yb2xsYCAvIGBjYW1wYWlnbl9jb250YWN0X21lbWJlcl9lbnJvbGxgXG4gICAgLy8gKGBydW5BczogJ3N5c3RlbSdgLCBvbmUgYGNyZWF0ZV9yZWNvcmRgIGVhY2gpOyB0aGUgbWFya2V0aW5nIHNlZWQgaXMgYVxuICAgIC8vIHN5c3RlbSB3cml0ZSBhbHJlYWR5LiBOb3RoaW5nIHVwZGF0ZXMgaXQ6IHRoZXJlIGlzIG5vIGB1cGRhdGVfcmVjb3JkYFxuICAgIC8vIG5vZGUsIG5vIGhvb2sgYW5kIG5vIGFjdGlvbiB0aGF0IHdyaXRlcyBgYWRkZWRfZGF0ZWAuIFRoaXMgY29sdW1uJ3Mgb3duXG4gICAgLy8gdHdvIGhhbHZlcyBhcmUgcGlubmVkIGluIGB0ZXN0L2F1ZGl0LXN0YW1wLXJlYWRvbmx5LnRlc3QudHNgIFx1MjAxNCB0aGVcbiAgICAvLyBlbnJvbGxtZW50IHdyaXRlcnMgc3RpbGwgc3RhbXAgaXQsIGFuZCBhIHVzZXItY29udGV4dCBVUERBVEUgaXMgc3RyaXBwZWQuXG4gICAgLy8gUnVsZWQgIzE2NjcgKGRpcmVjdG9yIHNlYXQsIGRlY2lzaW9uIGJhdGNoICM3NCwgMjAyNi0wOS0wNyk6IGFuXG4gICAgLy8gZW5yb2xsbWVudCBzdGFtcCBub2JvZHkgaXMgbWVhbnQgdG8gaGFuZC1lZGl0IGdldHMgdGhlIGRlY2xhcmF0aW9uIHRoYXRcbiAgICAvLyBzYXlzIHNvLiBcdTI2RDQgVGhlIDE2LnggY2xhaW0gdGhpcyBub3RlIHVzZWQgdG8gY2FycnkgKFwiZXZlcnkgbWVtYmVyIGxhbmRlZFxuICAgIC8vIHdpdGggYSBudWxsIEFkZGVkIERhdGUgd2hpbGUgdGhlIGZsYWcgd2FzIG9uXCIpIGRlc2NyaWJlZCBhbiBlbmdpbmUgdGhpc1xuICAgIC8vIHJlcG8gbm8gbG9uZ2VyIHJ1bnM7IFx1MjZENCBkbyBub3QgcmVzdXJyZWN0IGl0IGFzIGEgcmVhc29uIHRvIG9wZW4gdGhlXG4gICAgLy8gY29sdW1uIGJhY2sgdXAuXG4gICAgLy9cbiAgICAvLyBHcm91cGVkIHVuZGVyIGBiYXNpY2AsIG5vdCBgcmVzcG9uc2VgICgjNzE1KTogaXQgcmVjb3JkcyB3aGVuIHRoZVxuICAgIC8vIG1lbWJlcnNoaXAgd2FzIGNyZWF0ZWQsIHdoaWNoIGlzIGEgZmFjdCBhYm91dCB0aGUgZW5yb2xsbWVudCwgbm90IGEgc3RlcFxuICAgIC8vIGluIHRoZSByZXNwb25zZSBsaWZlY3ljbGUgdGhlIG90aGVyIHN0YW1wcyB0cmFjay5cbiAgICBhZGRlZF9kYXRlOiBGaWVsZC5kYXRldGltZSh7XG4gICAgICBsYWJlbDogJ0FkZGVkIERhdGUnLFxuICAgICAgZ3JvdXA6ICdiYXNpYycsXG4gICAgICByZWFkb25seTogdHJ1ZSxcbiAgICB9KSxcblxuICAgIC8vIFdyaXRlcnMsIG9uZSBwZXIgc3Vydml2aW5nIHZhbHVlICgjNTk3KTpcbiAgICAvLyAgIHNlbnQgICAgICAgICBcdTIwMTQgY2FtcGFpZ25fZW5yb2xsbWVudCBmbG93LCBgY3JlYXRlX2NhbXBhaWduYCAobGVhZHMpIGFuZFxuICAgIC8vICAgICAgICAgICAgICAgICAgYGFkZF9jb250YWN0X3RvX2NhbXBhaWduYCAoY29udGFjdHMpIHN0YW1wIGl0IG9uIGluc2VydC5cbiAgICAvLyAgIHJlc3BvbmRlZCAgICBcdTIwMTQgdGhlIGBtYXJrX3Jlc3BvbmRlZGAgYWN0aW9uIChzcmMvbWFya2V0aW5nL2FjdGlvbnMvY2FtcGFpZ24uYWN0aW9ucy50cykuXG4gICAgLy8gICBjb252ZXJ0ZWQgICAgXHUyMDE0IHRoZSBtZW1iZXIncyBsZWFkIGNvbnZlcnRpbmc7IGBjYW1wYWlnbl9sZWFkX2NvbnZlcnNpb25fcmVmcmVzaGBcbiAgICAvLyAgICAgICAgICAgICAgICAgIChzcmMvc2FsZXMvb2JqZWN0cy9sZWFkLmNhbXBhaWduLW1ldHJpY3MuaG9vay50cykgcHJvbW90ZXNcbiAgICAvLyAgICAgICAgICAgICAgICAgIHRoZSByb3cgd2hlbiBgY3JtX2xlYWQuaXNfY29udmVydGVkYCBmbGlwcy5cbiAgICAvLyAgIHVuc3Vic2NyaWJlZCBcdTIwMTQgc2V0IGJ5IGEgcmVwIChvciBhbiBvcHQtb3V0IHJlcXVlc3QpIG9uIHRoZSBtZW1iZXIgcm93O1xuICAgIC8vICAgICAgICAgICAgICAgICAgYGNhbXBhaWduX21lbWJlcl9vcHRvdXRfc3luY2Agcm91bmQtdHJpcHMgaXQgdG8gdGhlXG4gICAgLy8gICAgICAgICAgICAgICAgICBsZWFkL2NvbnRhY3QncyBgZW1haWxfb3B0X291dGAsIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlXG4gICAgLy8gICAgICAgICAgICAgICAgICBlbnJvbGxtZW50IGZsb3cncyBvcHQtb3V0IGZpbHRlciBob25vdXIgaXQgbmV4dCBydW4uXG4gICAgLy9cbiAgICAvLyBgb3BlbmVkYCAvIGBjbGlja2VkYCAvIGBib3VuY2VkYCB3ZXJlIHJlbW92ZWQgaGVyZSBcdTIwMTQgc2VlIHRoZSBvYmplY3RcbiAgICAvLyBkb2NibG9jay4gTm90aGluZyBvbiB0aGUgcGxhdGZvcm0gY2FuIHByb2R1Y2UgdGhlbS5cbiAgICBzdGF0dXM6IEZpZWxkLnNlbGVjdCh7XG4gICAgICBsYWJlbDogJ1N0YXR1cycsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgIHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9LFxuICAgICAgZ3JvdXA6ICdyZXNwb25zZScsXG4gICAgICB0cmFja0hpc3Rvcnk6IHRydWUsXG4gICAgICBvcHRpb25zOiBbXG4gICAgICAgIHsgbGFiZWw6ICdTZW50JywgICAgICB2YWx1ZTogJ3NlbnQnLCAgICAgIGRlZmF1bHQ6IHRydWUsIGNvbG9yOiAnI0EwQTBBMCcgfSxcbiAgICAgICAgeyBsYWJlbDogJ1Jlc3BvbmRlZCcsIHZhbHVlOiAncmVzcG9uZGVkJywgY29sb3I6ICcjMDBBQTAwJyB9LFxuICAgICAgICB7IGxhYmVsOiAnQ29udmVydGVkJywgdmFsdWU6ICdjb252ZXJ0ZWQnLCBjb2xvcjogJyM3QzNBRUQnIH0sXG4gICAgICAgIHsgbGFiZWw6ICdVbnN1YnNjcmliZWQnLCB2YWx1ZTogJ3Vuc3Vic2NyaWJlZCcsIGNvbG9yOiAnI0ZGMDAwMCcgfSxcbiAgICAgIF0sXG4gICAgfSksXG5cbiAgICAvLyBXcml0dGVuIGJ5IHRoZSBgbWFya19yZXNwb25kZWRgIGFjdGlvbiwgYW5kIGJ5XG4gICAgLy8gYGNhbXBhaWduX21lbWJlcl9saWZlY3ljbGVgIHdoZW4gaXQgYmFjay1maWxscyBhIG1lbWJlciB3aG9zZSByZXNwb25zZVxuICAgIC8vIHdhcyByZWNvcmRlZCBieSBmbGlwcGluZyBgc3RhdHVzYCBkaXJlY3RseS5cbiAgICByZXNwb25zZV9kYXRlOiBGaWVsZC5kYXRldGltZSh7XG4gICAgICBsYWJlbDogJ1Jlc3BvbnNlIERhdGUnLFxuICAgICAgZ3JvdXA6ICdyZXNwb25zZScsXG4gICAgfSksXG5cbiAgICAvLyBLZXB0IGluIGxvY2tzdGVwIHdpdGggYHN0YXR1cyA9PSBcInJlc3BvbmRlZFwiYCBieVxuICAgIC8vIGBjYW1wYWlnbl9tZW1iZXJfbGlmZWN5Y2xlYCAoYmVmb3JlSW5zZXJ0L2JlZm9yZVVwZGF0ZSkgXHUyMDE0IGEgYm9vbGVhbiB0aGF0XG4gICAgLy8gZGlzYWdyZWVzIHdpdGggdGhlIHN0YXR1cyBpdCBzdW1tYXJpc2VzIGlzIHRoZSBzaGFwZSB0aGUgcmVzcG9uc2VcbiAgICAvLyBzdXJmYWNlcyBjYW5ub3QgcmVuZGVyLCBhbmQgaXQgaXMgd2hhdCBgdGVzdC9zZWVkLWNvbnNpc3RlbmN5LnRlc3QudHNgXG4gICAgLy8gYWxyZWFkeSBwaW5zIG9uIHRoZSBzZWVkIHNpZGUuXG4gICAgaGFzX3Jlc3BvbmRlZDogRmllbGQuYm9vbGVhbih7XG4gICAgICBsYWJlbDogJ0hhcyBSZXNwb25kZWQnLFxuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGdyb3VwOiAncmVzcG9uc2UnLFxuICAgIH0pLFxuICB9LFxuXG4gIC8vIFByZWRpY2F0ZXMgYmVsb3cgYXJlIFRPVEFMOiBldmVyeSBgcmVjb3JkLnhgIHJlYWQgaXMgYGhhcygpYC1ndWFyZGVkLCBzbyB0aGVcbiAgLy8gcnVsZSByZXR1cm5zIGEgdmVyZGljdCBldmVuIHdoZW4gdGhlIG1lcmdlZCByZWNvcmQgaGFzIG5vIHN1Y2gga2V5LiBTZWVcbiAgLy8gQUdFTlRTLm1kIFwiVmFsaWRhdGlvbiBwcmVkaWNhdGVzIG11c3QgYmUgVE9UQUxcIiBhbmRcbiAgLy8gdGVzdC9vYmplY3QtdmFsaWRhdGlvbi1wcmVkaWNhdGVzLnRlc3QudHMsIHdoaWNoIGZhaWxzIHRoZSBidWlsZCBvdGhlcndpc2UuXG4gIHZhbGlkYXRpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2xlYWRfb3JfY29udGFjdF9yZXF1aXJlZCcsXG4gICAgICB0eXBlOiAnc2NyaXB0JyxcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgbWVzc2FnZTogJ0EgY2FtcGFpZ24gbWVtYmVyIG11c3QgcmVmZXJlbmNlIGVpdGhlciBhIExlYWQgb3IgYSBDb250YWN0JyxcbiAgICAgIGNvbmRpdGlvbjogUGAoIWhhcyhyZWNvcmQuY3JtX2xlYWQpIHx8IGlzQmxhbmsocmVjb3JkLmNybV9sZWFkKSkgJiYgKCFoYXMocmVjb3JkLmNybV9jb250YWN0KSB8fCBpc0JsYW5rKHJlY29yZC5jcm1fY29udGFjdCkpYCxcbiAgICB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9hY3Rpb25zL2luZGV4LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FjdGlvbnNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvYWN0aW9ucy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBBY3Rpb24gRGVmaW5pdGlvbnMgQmFycmVsXG4gKlxuICogRXhwb3J0cyBDUk0gYWN0aW9uIG1ldGFkYXRhLiBFdmVyeSBhY3Rpb24gc2hpcHMgYW4gaW5saW5lIG1ldGFkYXRhXG4gKiBgYm9keWAgKHNhbmRib3hlZCBKUykgc28gdGhlIEFwcFBsdWdpbiBhdXRvLWJpbmRzIHRoZSBoYW5kbGVyIGF0XG4gKiBib290IFx1MjAxNCBubyBpbXBlcmF0aXZlIGBlbmdpbmUucmVnaXN0ZXJBY3Rpb24oLi4uKWAgd2lyaW5nIGlzIG5lZWRlZC5cbiAqXG4gKiBgQ29udmVydExlYWRBY3Rpb25gIGlzIHRoZSBvbmx5IGV4Y2VwdGlvbjogaXQgaXMgYSBgZmxvd2AtdHlwZWRcbiAqIGFjdGlvbiBhbmQgdGhlIHNjcmVlbiBmbG93IHVuZGVyIGBzcmMvc2FsZXMvZmxvd3MvbGVhZC1jb252ZXJzaW9uLmZsb3cudHNgXG4gKiBjYXJyaWVzIHRoZSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IHsgQWRkQ29udGFjdFRvQ2FtcGFpZ25BY3Rpb24sIE1hcmtQcmltYXJ5Q29udGFjdEFjdGlvbiwgU2VuZEVtYWlsQWN0aW9uIH0gZnJvbSAnLi9jb250YWN0LmFjdGlvbnMnO1xuLy8gQWN0aXZpdHkgbG9nZ2luZzogb25lIHJlZ2lzdHJhdGlvbiBwZXIgKGtpbmQgXHUwMEQ3IG9iamVjdCkuIEV2ZXJ5IGV4cG9ydFxuLy8gZm9yd2FyZGVkIGZyb20gaGVyZSBtdXN0IGJlIE9ORSBBY3Rpb24gXHUyMDE0IHRoZSBzdGFjayBpcyBidWlsdCBmcm9tXG4vLyBgT2JqZWN0LnZhbHVlcyhhY3Rpb25zKWAsIHNvIGFuIGV4cG9ydGVkIGFycmF5IGFycml2ZXMgYXMgYSBuZXN0ZWQgbGlzdCBhbmRcbi8vIGZhaWxzIHRoZSBzY2hlbWEgcGFyc2UuIFx1MjZENCBOZXZlciByZS1leHBvcnQgYGFjdGl2aXR5QWN0aW9uc0ZvcmAgKHRoZSBmYWN0b3J5KVxuLy8gZnJvbSBoZXJlOyB0aGUgYGNybV9jYXNlYCB0cmlwbGUgaXQgYWxzbyBidWlsZHMgaXMgc2VydmljZSdzIGFuZCBpcyBmb3J3YXJkZWRcbi8vIGJ5IGBzcmMvc2VydmljZS9hY3Rpb25zL2luZGV4LnRzYC5cbmV4cG9ydCB7XG4gIExlYWRMb2dDYWxsQWN0aW9uLCBMZWFkTG9nTWVldGluZ0FjdGlvbiwgTGVhZFNjaGVkdWxlTWVldGluZ0FjdGlvbixcbiAgQ29udGFjdExvZ0NhbGxBY3Rpb24sIENvbnRhY3RMb2dNZWV0aW5nQWN0aW9uLCBDb250YWN0U2NoZWR1bGVNZWV0aW5nQWN0aW9uLFxuICBBY2NvdW50TG9nQ2FsbEFjdGlvbiwgQWNjb3VudExvZ01lZXRpbmdBY3Rpb24sIEFjY291bnRTY2hlZHVsZU1lZXRpbmdBY3Rpb24sXG4gIE9wcG9ydHVuaXR5TG9nQ2FsbEFjdGlvbiwgT3Bwb3J0dW5pdHlMb2dNZWV0aW5nQWN0aW9uLCBPcHBvcnR1bml0eVNjaGVkdWxlTWVldGluZ0FjdGlvbixcbn0gZnJvbSAnLi9hY3Rpdml0eS1hY3Rpb25zJztcbmV4cG9ydCB7IENvbnZlcnRMZWFkQWN0aW9uLCBDcmVhdGVDYW1wYWlnbkFjdGlvbiwgU2NoZWR1bGVGb2xsb3dVcEFjdGlvbiB9IGZyb20gJy4vbGVhZC5hY3Rpb25zJztcbmV4cG9ydCB7IENsb25lT3Bwb3J0dW5pdHlBY3Rpb24sIE1hc3NVcGRhdGVTdGFnZUFjdGlvbiwgR2VuZXJhdGVRdW90ZUFjdGlvbiB9IGZyb20gJy4vb3Bwb3J0dW5pdHkuYWN0aW9ucyc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9hY3Rpb25zL2NvbnRhY3QuYWN0aW9ucy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9hY3Rpb25zXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FjdGlvbnMvY29udGFjdC5hY3Rpb25zLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEFjdGlvbiB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcbmltcG9ydCB7IFAgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgeyBBQ1RPUl9OQU1FX1JFU09MVVRJT05fU09VUkNFIH0gZnJvbSAnLi9hY3Rpdml0eS1hY3Rpb25zJztcblxuLyoqXG4gKiBNYXJrIENvbnRhY3QgYXMgUHJpbWFyeS5cbiAqXG4gKiBEZW1vbnN0cmF0ZXMgdGhlIEwyIG1ldGFkYXRhLWJvZHkgYWN0aW9uIHNoYXBlLiBUaGUgYGJvZHkuc291cmNlYCBydW5zXG4gKiBpbiB0aGUgUXVpY2tKUyBzYW5kYm94IHZpYSBgYWN0aW9uQm9keVJ1bm5lckZhY3RvcnlgLiBUaGUgc2NyaXB0IHJlY2VpdmVzXG4gKiBgKGlucHV0LCBjdHgpYCB3aGVyZSBgY3R4LnJlY29yZElkYCBpcyB0aGUgY29udGFjdCBpZCBmcm9tIHRoZSBhY3Rpb25cbiAqIFVSTCBhbmQgYGN0eC5hcGkub2JqZWN0KCdjcm1fY29udGFjdCcpLnVwZGF0ZSguLi4pYCBpcyBnYXRlZCBieSBgYXBpLndyaXRlYC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1hcmtQcmltYXJ5Q29udGFjdEFjdGlvbjogQWN0aW9uID0ge1xuICBuYW1lOiAnbWFya19wcmltYXJ5JyxcbiAgbGFiZWw6ICdNYXJrIGFzIFByaW1hcnkgQ29udGFjdCcsXG4gIG9iamVjdE5hbWU6ICdjcm1fY29udGFjdCcsXG4gIGljb246ICdzdGFyJyxcbiAgdHlwZTogJ3NjcmlwdCcsXG4gIGJvZHk6IHtcbiAgICBsYW5ndWFnZTogJ2pzJyxcbiAgICBzb3VyY2U6IGBcbiAgICAgIGNvbnN0IGlkID0gY3R4LnJlY29yZElkO1xuICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKCdtYXJrX3ByaW1hcnkgcmVxdWlyZXMgYSByZWNvcmRJZCcpO1xuICAgICAgYXdhaXQgY3R4LmFwaS5vYmplY3QoJ2NybV9jb250YWN0JykudXBkYXRlKHsgaWQsIGlzX3ByaW1hcnk6IHRydWUgfSwgeyB3aGVyZTogeyBpZCB9IH0pO1xuICAgICAgcmV0dXJuIHsgb2s6IHRydWUsIGlkLCBpc19wcmltYXJ5OiB0cnVlIH07XG4gICAgYCxcbiAgICBjYXBhYmlsaXRpZXM6IFsnYXBpLndyaXRlJ10sXG4gICAgdGltZW91dE1zOiAyMDAwLFxuICB9LFxuICBsb2NhdGlvbnM6IFsncmVjb3JkX2hlYWRlcicsICdsaXN0X2l0ZW0nXSxcbiAgdmlzaWJsZTogUGBoYXMocmVjb3JkLmlzX3ByaW1hcnkpICYmIHJlY29yZC5pc19wcmltYXJ5ID09IGZhbHNlYCxcbiAgY29uZmlybVRleHQ6ICdNYXJrIHRoaXMgY29udGFjdCBhcyB0aGUgcHJpbWFyeSBjb250YWN0IGZvciB0aGUgYWNjb3VudD8nLFxuICBzdWNjZXNzTWVzc2FnZTogJ0NvbnRhY3QgbWFya2VkIGFzIHByaW1hcnkhJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcblxuLyoqXG4gKiBBZGQgc2VsZWN0ZWQgY29udGFjdHMgdG8gYSBDYW1wYWlnbi5cbiAqXG4gKiBUaGUgY29udGFjdC1zaWRlIG1pcnJvciBvZiBgY3JlYXRlX2NhbXBhaWduYCBvbiBgY3JtX2xlYWRgLCBhbmQgdGhlIG9ubHlcbiAqIHdyaXRlciBvZiBgY3JtX2NhbXBhaWduX21lbWJlci5jcm1fY29udGFjdGAgXHUyMDE0IHRoZSBsb29rdXAgdGhhdCBsZXRzIGEgY2FtcGFpZ25cbiAqIHJlYWNoIGV4aXN0aW5nIGN1c3RvbWVycyBhbmQgbm90IG9ubHkgbGVhZHMuIEV2ZXJ5IGRlc2lnbiBkZWNpc2lvbiBiZWxvdyBpc1xuICogY29waWVkIGRlbGliZXJhdGVseSBmcm9tIHRoZSBsZWFkIGFjdGlvbiByYXRoZXIgdGhhbiByZS1kZXJpdmVkLCBzbyB0aGUgdHdvXG4gKiBwYXRocyBjYW5ub3QgZHJpZnQ6XG4gKlxuICogICAtIFBFUi1SRUNPUkQgZGlzcGF0Y2guIGBzcmMvc2FsZXMvdmlld3MvY29udGFjdC52aWV3LnRzYCB3aXJlcyB0aGlzIGFzIHRoZVxuICogICAgIEJBUkUtU1RSSU5HIGZvcm0gKGBidWxrQWN0aW9uczogWydhZGRfY29udGFjdF90b19jYW1wYWlnbiddYCksIHdoaWNoIHRoZVxuICogICAgIHJlbmRlcmVyIGZhbnMgb3V0IG9uY2UgcGVyIHNlbGVjdGVkIHJvdyB3aXRoIHRoYXQgcm93J3MgYHJlY29yZElkYCBhbmQgTk9cbiAqICAgICBzZWxlY3Rpb24gYXJyYXkuIFRoZSBib2R5IHJlYWRzIGBjdHgucmVjb3JkSWRgIGFuZCBub3RoaW5nIGVsc2UuIFx1MjZENCBOZXZlclxuICogICAgIGFkZCBhbiBgaW5wdXQuc2VsZWN0ZWRJZHNgIHJlYWQ6IG9ubHkgdGhlIGFnZ3JlZ2F0ZSBjb250cmFjdCBpbmplY3RzIHRoZVxuICogICAgIHVuZGVyc2NvcmUtcHJlZml4ZWQgYnVpbHRpbiwgYW5kIHRoZSBzdHJpY3QgcGFyYW1zIGdhdGUgKEFEUi0wMTA0KVxuICogICAgIHJlZnVzZXMgYW4gdW5kZWNsYXJlZCBgc2VsZWN0ZWRJZHNgIHBhcmFtIG91dHJpZ2h0LlxuICogICAtIGB0eXBlOiAnc2NyaXB0J2AgKyBgcGFyYW1zYCwgbmV2ZXIgYHR5cGU6ICdtb2RhbCdgIFx1MjAxNCBhIG1vZGFsIGFjdGlvbiBoYXNcbiAqICAgICBubyBzZXJ2ZXIgZGlzcGF0Y2gsIHNvIGl0cyBib2R5IG5ldmVyIHJ1bnMuXG4gKiAgIC0gVGhlIGNhbXBhaWduIHBhcmFtIGlzIEZJRUxELUJBQ0tFRCAoYGZpZWxkYCArIGBvYmplY3RPdmVycmlkZWApIHNvIHRoZVxuICogICAgIGNvbnNvbGUgcmVzb2x2ZXMgYSByZWNvcmQgcGlja2VyIGZyb21cbiAqICAgICBgY3JtX2NhbXBhaWduX21lbWJlci5jcm1fY2FtcGFpZ25gLiBBIGJhcmUgYHsgdHlwZTogJ2xvb2t1cCcgfWAgY2Fubm90XG4gKiAgICAgcmVzb2x2ZSBhIHRhcmdldCBvYmplY3QgYW5kIGRlZ3JhZGVzIHRvIGEgcGFzdGUtdGhlLUlEIHRleHRib3guXG4gKlxuICogT25lIGRlbGliZXJhdGUgZGlmZmVyZW5jZTogdGhlIGRlZHVwZSByZWFkIHNjb3BlcyBvbiBgY3JtX2NvbnRhY3RgLCBzbyBhXG4gKiBwZXJzb24gZW5yb2xsZWQgYXMgYSBMRUFEIGFuZCBhZ2FpbiBhcyBhIENPTlRBQ1QgaXMgbm90IHRyZWF0ZWQgYXMgYVxuICogZHVwbGljYXRlLiBUaG9zZSBhcmUgdHdvIGRpZmZlcmVudCByZWNvcmRzIG9mIHR3byBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyxcbiAqIGFuZCBgY3JtX2NhbXBhaWduX21lbWJlcmAga2V5cyB0aGVtIHNlcGFyYXRlbHkgKHNlZSB0aGUgdHdvIHNlZWQgZGF0YXNldHMgaW5cbiAqIGBzcmMvbWFya2V0aW5nL2RhdGEvbWFya2V0aW5nLnNlZWQudHNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFkZENvbnRhY3RUb0NhbXBhaWduQWN0aW9uOiBBY3Rpb24gPSB7XG4gIG5hbWU6ICdhZGRfY29udGFjdF90b19jYW1wYWlnbicsXG4gIGxhYmVsOiAnQWRkIHRvIENhbXBhaWduJyxcbiAgb2JqZWN0TmFtZTogJ2NybV9jb250YWN0JyxcbiAgaWNvbjogJ3NlbmQnLFxuICB0eXBlOiAnc2NyaXB0JyxcbiAgYm9keToge1xuICAgIGxhbmd1YWdlOiAnanMnLFxuICAgIHNvdXJjZTogYFxuICAgICAgLy8gVmFsdWUga2V5ID0gdGhlIHBhcmFtJ3MgZmllbGQgbmFtZSAoJ2NybV9jYW1wYWlnbicpIHNpbmNlIHRoZSBwYXJhbVxuICAgICAgLy8gb21pdHMgYW4gZXhwbGljaXQgJ25hbWUnLiBJbnNlcnQgdXNlcyB0aGUgUkVBTCBsb29rdXAgZmllbGQgbmFtZXMgb25cbiAgICAgIC8vIGNybV9jYW1wYWlnbl9tZW1iZXIgKGNybV9jYW1wYWlnbiAvIGNybV9jb250YWN0KS5cbiAgICAgIGNvbnN0IGNhbXBhaWduSWQgPSBpbnB1dC5jcm1fY2FtcGFpZ24gPz8gbnVsbDtcbiAgICAgIGlmICghY2FtcGFpZ25JZCkgdGhyb3cgbmV3IEVycm9yKCdhZGRfY29udGFjdF90b19jYW1wYWlnbiByZXF1aXJlcyBhIGNhbXBhaWduIGlkJyk7XG4gICAgICBjb25zdCBpZHMgPSBjdHgucmVjb3JkSWQgPyBbY3R4LnJlY29yZElkXSA6IFtdO1xuICAgICAgaWYgKCFpZHMubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2FkZF9jb250YWN0X3RvX2NhbXBhaWduOiBubyBjb250YWN0IHNlbGVjdGVkJyk7XG4gICAgICBjb25zdCByYXcgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduX21lbWJlcicpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGNhbXBhaWduSWQgfSxcbiAgICAgICAgZmllbGRzOiBbJ2NybV9jb250YWN0J10sXG4gICAgICAgIHRvcDogNTAwMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZXhpc3RpbmdSb3dzID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3IDogKHJhdz8ucmVjb3JkcyA/PyBbXSk7XG4gICAgICBjb25zdCBleGlzdGluZyA9IG5ldyBTZXQoZXhpc3RpbmdSb3dzLm1hcCgocikgPT4gci5jcm1fY29udGFjdCkpO1xuICAgICAgY29uc3QgaW5zZXJ0ZWQgPSBbXTtcbiAgICAgIGxldCBza2lwcGVkID0gMDtcbiAgICAgIGZvciAoY29uc3QgY29udGFjdElkIG9mIGlkcykge1xuICAgICAgICBpZiAoZXhpc3RpbmcuaGFzKGNvbnRhY3RJZCkpIHsgc2tpcHBlZCsrOyBjb250aW51ZTsgfVxuICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduX21lbWJlcicpLmluc2VydCh7XG4gICAgICAgICAgY3JtX2NhbXBhaWduOiBjYW1wYWlnbklkLFxuICAgICAgICAgIGNybV9jb250YWN0OiBjb250YWN0SWQsXG4gICAgICAgICAgc3RhdHVzOiAnc2VudCcsXG4gICAgICAgIH0pO1xuICAgICAgICBpbnNlcnRlZC5wdXNoKHJvdz8uaWQgPz8gbnVsbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjYW1wYWlnbklkLCBjb3VudDogaW5zZXJ0ZWQubGVuZ3RoLCBza2lwcGVkLCBpZHM6IGluc2VydGVkIH07XG4gICAgYCxcbiAgICBjYXBhYmlsaXRpZXM6IFsnYXBpLnJlYWQnLCAnYXBpLndyaXRlJ10sXG4gICAgdGltZW91dE1zOiAxMDAwMCxcbiAgfSxcbiAgbG9jYXRpb25zOiBbJ2xpc3RfdG9vbGJhcicsICdsaXN0X2l0ZW0nXSxcbiAgcGFyYW1zOiBbXG4gICAge1xuICAgICAgZmllbGQ6ICdjcm1fY2FtcGFpZ24nLFxuICAgICAgb2JqZWN0T3ZlcnJpZGU6ICdjcm1fY2FtcGFpZ25fbWVtYmVyJyxcbiAgICAgIGxhYmVsOiAnQ2FtcGFpZ24nLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgLy8gQW4gb3B0ZWQtb3V0IGNvbnRhY3QgbXVzdCBub3QgYmUgYWRkZWQgdG8gYSBjYW1wYWlnbiBieSBoYW5kIGVpdGhlciBcdTIwMTQgdGhlXG4gIC8vIGVucm9sbG1lbnQgZmxvdyBhbHJlYWR5IGZpbHRlcnMgdGhlbSBvdXQsIGFuZCBhIG1hbnVhbCBhZGQtdG8tY2FtcGFpZ24gaXNcbiAgLy8gdGhlIG9idmlvdXMgd2F5IGFyb3VuZCBhIGZpbHRlciBub2JvZHkgcmVtZW1iZXJzIGlzIHRoZXJlLiBTYW1lIHByZWRpY2F0ZVxuICAvLyB0aGUgYHNlbmRfZW1haWxgIGFjdGlvbiB1c2VzLlxuICB2aXNpYmxlOiBQYGhhcyhyZWNvcmQuZW1haWxfb3B0X291dCkgJiYgcmVjb3JkLmVtYWlsX29wdF9vdXQgPT0gZmFsc2VgLFxuICBzdWNjZXNzTWVzc2FnZTogJ0NvbnRhY3RzIGFkZGVkIHRvIGNhbXBhaWduIScsXG4gIHJlZnJlc2hBZnRlcjogdHJ1ZSxcbn07XG5cbi8qKlxuICogU2VuZCBFbWFpbCB0byBDb250YWN0LlxuICpcbiAqIE1vZGFsLXR5cGVkIGFjdGlvbjogY29sbGVjdHMgc3ViamVjdCArIGJvZHksIHRoZW4gbG9ncyBhbiBgYWN0aXZpdHlgXG4gKiByZWNvcmQgdmlhIHRoZSBtZXRhZGF0YSBib2R5LiBSdW5zIHNhbmRib3hlZCB1bmRlciBgYXBpLndyaXRlYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNlbmRFbWFpbEFjdGlvbjogQWN0aW9uID0ge1xuICBuYW1lOiAnc2VuZF9lbWFpbCcsXG4gIGxhYmVsOiAnU2VuZCBFbWFpbCcsXG4gIG9iamVjdE5hbWU6ICdjcm1fY29udGFjdCcsXG4gIGljb246ICdtYWlsJyxcbiAgLy8gc2NyaXB0LCBub3QgbW9kYWw6IG1vZGFsIHN1Ym1pdHMgZGllIG9uIEdFVCAvYXBpL3YxL21ldGEvb2JqZWN0Lzx0YXJnZXQ+XG4gIC8vIFx1MjE5MiA0MDAgaW4gMTYuMS4wOyBzY3JpcHQgYWN0aW9ucyBQT1NUIC9hcGkvdjEvYWN0aW9ucy8uLi4gYW5kIGV4ZWN1dGUuXG4gIHR5cGU6ICdzY3JpcHQnLFxuICBib2R5OiB7XG4gICAgbGFuZ3VhZ2U6ICdqcycsXG4gICAgc291cmNlOiBgXG4gICAgICBjb25zdCByZWNvcmQgPSBjdHgucmVjb3JkID8/IHt9O1xuICAgICAgY29uc3QgcmVjaXBpZW50SWQgPSBjdHgucmVjb3JkSWQgPz8gcmVjb3JkLmlkID8/IG51bGw7XG4gICAgICBjb25zdCB0byA9IHJlY29yZC5lbWFpbCA/IFN0cmluZyhyZWNvcmQuZW1haWwpIDogJyc7XG4gICAgICBjb25zdCBmcm9tID0gY3R4LnVzZXI/LmVtYWlsID8/ICdub3JlcGx5QGhvdGNybS5sb2NhbCc7XG4gICAgICBjb25zdCB1c2VySWQgPSBjdHgudXNlcj8uaWQgPz8gbnVsbDtcbiAgICAgIGNvbnN0IHN1YmplY3QgPSBpbnB1dC5zdWJqZWN0ID8gU3RyaW5nKGlucHV0LnN1YmplY3QpIDogKCdFbWFpbCB0byAnICsgdG8pO1xuICAgICAgY29uc3QgYm9keSA9IGlucHV0LmJvZHkgPyBTdHJpbmcoaW5wdXQuYm9keSkgOiAnJztcbiAgICAgIGNvbnN0IGVtYWlsID0gYXdhaXQgY3R4LmFwaS5vYmplY3QoJ3N5c19lbWFpbCcpLmluc2VydCh7XG4gICAgICAgIGZyb21fYWRkcmVzczogZnJvbSxcbiAgICAgICAgdG9fYWRkcmVzc2VzOiB0byxcbiAgICAgICAgc3ViamVjdCxcbiAgICAgICAgYm9keV90ZXh0OiBib2R5LFxuICAgICAgICBzdGF0dXM6ICdxdWV1ZWQnLFxuICAgICAgICByZWxhdGVkX29iamVjdDogJ2NybV9jb250YWN0JyxcbiAgICAgICAgcmVsYXRlZF9pZDogcmVjaXBpZW50SWQsXG4gICAgICAgIHNlbnRfYnk6IHVzZXJJZCxcbiAgICAgIH0pO1xuXG4gICAgICAke0FDVE9SX05BTUVfUkVTT0xVVElPTl9TT1VSQ0V9XG5cbiAgICAgIC8vIFN1cmZhY2UgdGhlIGVtYWlsIG9uIHRoZSBjb250YWN0J3MgdW5pZmllZCBhY3Rpdml0eSB0aW1lbGluZVxuICAgICAgLy8gKHRoZSBhdWRpdCB3cml0ZXIgb25seSBsb2dzIGdlbmVyaWMgQ1JVRDsgdGhpcyBpcyB0aGUgc2VtYW50aWMgZXZlbnQpLlxuICAgICAgY29uc3QgYWN0aXZpdHkgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnc3lzX2FjdGl2aXR5JykuaW5zZXJ0KHtcbiAgICAgICAgdHlwZTogJ2NvbXBsZXRlZCcsXG4gICAgICAgIHN1bW1hcnk6ICdFbWFpbDogJyArIHN1YmplY3QsXG4gICAgICAgIGFjdG9yX2lkOiB1c2VySWQsXG4gICAgICAgIGFjdG9yX25hbWU6IGFjdG9yTmFtZSxcbiAgICAgICAgb2JqZWN0X25hbWU6ICdjcm1fY29udGFjdCcsXG4gICAgICAgIHJlY29yZF9pZDogcmVjaXBpZW50SWQsXG4gICAgICAgIHJlY29yZF9sYWJlbDogcmVjb3JkLmZ1bGxfbmFtZSA/PyByZWNvcmQubmFtZSA/PyB0byxcbiAgICAgICAgLy8gQURSLTAwNTIgQWN0aXZpdHlQb2ludGVyOiBzdHJ1Y3R1cmVkIHBvaW50ZXIgdG8gdGhlIHJpY2ggc291cmNlIGVudGl0eVxuICAgICAgICAvLyAodGhlIHN5c19lbWFpbCByb3cpIHNvIHRoZSB0aW1lbGluZSByZW5kZXJzIGEgXCJWaWV3IHNvdXJjZSBcdTIxOTJcIiBkcmlsbCB0b1xuICAgICAgICAvLyB0aGUgZnVsbCBlbWFpbCBcdTIwMTQgdGhlIHF1ZXJ5YWJsZSByZXBsYWNlbWVudCBmb3Igc3Rhc2hpbmcgdGhlIGlkIGluIG1ldGFkYXRhLlxuICAgICAgICBzb3VyY2Vfb2JqZWN0OiAnc3lzX2VtYWlsJyxcbiAgICAgICAgc291cmNlX2lkOiBlbWFpbD8uaWQgPz8gbnVsbCxcbiAgICAgICAgbWV0YWRhdGE6IEpTT04uc3RyaW5naWZ5KHsga2luZDogJ2VtYWlsJywgdG8sIHN1YmplY3QgfSksXG4gICAgICB9KTtcbiAgICAgIC8vICM1OTIgc2NvcGUgaXRlbSAzOiBldmVyeSBhY3Rpdml0eSB3cml0ZXIgYnVtcHMgaW50ZXJhY3Rpb24gcmVjZW5jeS5cbiAgICAgIC8vIEFuIGVtYWlsIGlzIGFuIGludGVyYWN0aW9uIGJ1dCBOT1QgYSBjYWxlbmRhciBzbG90LCBzbyBpdCB3cml0ZXMgbm9cbiAgICAgIC8vIFxcYGNybV9ldmVudFxcYCBcdTIwMTQgd2hpY2ggbWVhbnMgaXQgY2Fubm90IHJpZGUgdGhlIGV2ZW50IGhvb2sncyBidWJibGUgYW5kXG4gICAgICAvLyBoYXMgdG8gc3RhbXAgdGhlIHR3byB0aW1lc3RhbXBzIGl0c2VsZi4gQm90aCBjb2x1bW5zIGFyZSBkZWxpYmVyYXRlbHlcbiAgICAgIC8vIG5vbi1yZWFkb25seSAoc2VlIGNybV9hY2NvdW50Lmxhc3RfYWN0aXZpdHlfZGF0ZSdzIG5vdGUpOiBhIHJlYWRvbmx5XG4gICAgICAvLyBmaWVsZCBpcyBzdHJpcHBlZCBmcm9tIGFueSBub24tc3lzdGVtIHdyaXRlIHdob3NlIGNhbGxlciBzdXBwbGllZCB0aGVcbiAgICAgIC8vIGtleSAoIzI5NDgpLCBhbmQgYW4gYWN0aW9uIGJvZHkgcnVucyB1bmRlciB0aGUgc2VuZGluZyByZXAncyBjb250ZXh0LlxuICAgICAgaWYgKHJlY2lwaWVudElkKSB7XG4gICAgICAgIGNvbnN0IG5vd0lzbyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2NvbnRhY3QnKS51cGRhdGUoXG4gICAgICAgICAgICB7IGlkOiByZWNpcGllbnRJZCwgbGFzdF9jb250YWN0ZWRfZGF0ZTogbm93SXNvIH0sXG4gICAgICAgICAgICB7IHdoZXJlOiB7IGlkOiByZWNpcGllbnRJZCB9IH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyAvKiBiZXN0LWVmZm9ydCByZWNlbmN5OyBuZXZlciBmYWlsIHRoZSBzZW5kICovIH1cbiAgICAgICAgY29uc3QgYWNjb3VudElkID0gcmVjb3JkLmNybV9hY2NvdW50ID8gU3RyaW5nKHJlY29yZC5jcm1fYWNjb3VudCkgOiBudWxsO1xuICAgICAgICBpZiAoYWNjb3VudElkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGN0eC5hcGkub2JqZWN0KCdjcm1fYWNjb3VudCcpLnVwZGF0ZShcbiAgICAgICAgICAgICAgeyBpZDogYWNjb3VudElkLCBsYXN0X2FjdGl2aXR5X2RhdGU6IG5vd0lzby5zbGljZSgwLCAxMCkgfSxcbiAgICAgICAgICAgICAgeyB3aGVyZTogeyBpZDogYWNjb3VudElkIH0gfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkgeyAvKiBiZXN0LWVmZm9ydCByZWNlbmN5OyBuZXZlciBmYWlsIHRoZSBzZW5kICovIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHsgZW1haWxJZDogZW1haWw/LmlkLCBhY3Rpdml0eUlkOiBhY3Rpdml0eT8uaWQgfTtcbiAgICBgLFxuICAgIGNhcGFiaWxpdGllczogWydhcGkucmVhZCcsICdhcGkud3JpdGUnXSxcbiAgICB0aW1lb3V0TXM6IDUwMDAsXG4gIH0sXG4gIGxvY2F0aW9uczogWydyZWNvcmRfaGVhZGVyJywgJ2xpc3RfaXRlbSddLFxuICB2aXNpYmxlOiBQYGhhcyhyZWNvcmQuZW1haWxfb3B0X291dCkgJiYgcmVjb3JkLmVtYWlsX29wdF9vdXQgPT0gZmFsc2VgLFxuICBwYXJhbXM6IFtcbiAgICB7IG5hbWU6ICdzdWJqZWN0JywgbGFiZWw6ICdTdWJqZWN0JywgdHlwZTogJ3RleHQnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHsgbmFtZTogJ2JvZHknLCBsYWJlbDogJ0JvZHknLCB0eXBlOiAndGV4dGFyZWEnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICBdLFxuICByZWZyZXNoQWZ0ZXI6IGZhbHNlLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FjdGlvbnMvbGVhZC5hY3Rpb25zLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FjdGlvbnNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvYWN0aW9ucy9sZWFkLmFjdGlvbnMudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgQWN0aW9uIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuaW1wb3J0IHsgUCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcblxuLyoqXG4gKiBDb252ZXJ0IExlYWQgdG8gQWNjb3VudCwgQ29udGFjdCwgYW5kIE9wcG9ydHVuaXR5LlxuICpcbiAqIEZsb3ctdHlwZWQgYWN0aW9uOiBpbnZvY2F0aW9uIGlzIGRlbGVnYXRlZCB0byB0aGUgYGxlYWRfY29udmVyc2lvbmBcbiAqIGZsb3cgZGVmaW5lZCB1bmRlciBgc3JjL3NhbGVzL2Zsb3dzL2AuIFRoZSBmbG93IGVuZ2luZSBoYW5kbGVzIHRoZSBzY3JlZW5cbiAqICsgc2VydmVyIHN0ZXBzOyBubyBtZXRhZGF0YSBib2R5IGlzIHJlcXVpcmVkIGhlcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBDb252ZXJ0TGVhZEFjdGlvbjogQWN0aW9uID0ge1xuICBuYW1lOiAnY29udmVydF9sZWFkJyxcbiAgbGFiZWw6ICdDb252ZXJ0IExlYWQnLFxuICBvYmplY3ROYW1lOiAnY3JtX2xlYWQnLFxuICBpY29uOiAnYXJyb3ctcmlnaHQtY2lyY2xlJyxcbiAgdHlwZTogJ2Zsb3cnLFxuICB0YXJnZXQ6ICdsZWFkX2NvbnZlcnNpb24nLFxuICBsb2NhdGlvbnM6IFsncmVjb3JkX2hlYWRlcicsICdsaXN0X2l0ZW0nXSxcbiAgLy8gQ29udmVydCBpcyB0aGUgbGVhZCdzIG1vc3QgYmFzaWMgb3V0Y29tZSBcdTIwMTQgc3VyZmFjZSBpdCBvbiBBTlkgb3BlbiBsZWFkXG4gIC8vIChuZXcgLyBjb250YWN0ZWQgLyBxdWFsaWZpZWQpLCBub3QganVzdCBxdWFsaWZpZWQuIEdhdGluZyB0byBxdWFsaWZpZWQtb25seVxuICAvLyBoaWQgdGhlIGJ1dHRvbiBvbiBtb3N0IHNlZWRlZCBsZWFkcywgc28gaXQgcmVhZCBhcyBcImNvbnZlcnNpb24gaXMgbWlzc2luZ1wiLlxuICAvLyBPbmx5IGFscmVhZHktY29udmVydGVkIG9yIGRpc3F1YWxpZmllZCBsZWFkcyBoaWRlIGl0LlxuICAvL1xuICAvLyBUT1RBTElUWSAoQUdFTlRTLm1kIFx1MjE5MiBcIlZhbGlkYXRpb24gcHJlZGljYXRlcyBtdXN0IGJlIFRPVEFMXCIsICM2MzApOiBldmVyeVxuICAvLyBgcmVjb3JkLnhgIHJlYWQgY2FycmllcyBhIGBoYXMocmVjb3JkLngpYCwgYW5kIHRoZSBndWFyZHMgYXJlIGFycmFuZ2VkIHRvXG4gIC8vIGZhaWwgQ0xPU0VEIFx1MjAxNCBhbiB1bmtub3duIHJlY29yZCBoaWRlcyB0aGUgYnV0dG9uLiBUaGF0IGFycmFuZ2VtZW50IGlzIGFcbiAgLy8gTUVBU1VSRU1FTlQsIG5vdCBhIHByZWZlcmVuY2UuIE1lYXN1cmVkIGluIHRoZSBicm93c2VyIG9uIGNvbnNvbGUgMTcuNC4wIGJ5XG4gIC8vIGluc3RydW1lbnRpbmcgdGhlIHNoaXBwZWQgcHJlZGljYXRlIGV2YWx1YXRvcjogdGhlIHJlY29yZCBwYWdlIGV2YWx1YXRlcyB0aGlzXG4gIC8vIHByZWRpY2F0ZSB0d2ljZSBhZ2FpbnN0IGFuIEVNUFRZIHJlY29yZCAoYHJlY29yZGAgaXMgYHt9YCwgemVybyBrZXlzKSBiZWZvcmVcbiAgLy8gdGhlIHJvdyBsYW5kcywgdGhlbiByZS1ldmFsdWF0ZXMgaXQgYWdhaW5zdCB0aGUgZnVsbCByb3cuIFNvIGFuIGFic2VudFxuICAvLyBgc3RhdHVzYCBoZXJlIG1lYW5zIFwibm8gcmVjb3JkIHlldFwiLCBuZXZlciBcImEgbGVhZCB3aXRoIG5vIHN0YXR1c1wiIFx1MjAxNCBhIGxlYWRcbiAgLy8gd2l0aCBubyBzdGF0dXMgY2Fubm90IGV4aXN0LCBzaW5jZSBgc3RhdHVzYCBpcyBgcmVxdWlyZWRgIHdpdGhcbiAgLy8gYHN0b3JhZ2U6IHsgbm90TnVsbDogdHJ1ZSB9YCBhbmQgYGRlZmF1bHRWYWx1ZTogJ25ldydgIChzcmMvc2FsZXMvb2JqZWN0cy9sZWFkLm9iamVjdC50cyksXG4gIC8vIGFuZCB0aGUgUkVTVCBwYXlsb2FkIHRoaXMgc3VyZmFjZSByZWFkcyBjYXJyaWVzIGV2ZXJ5IGRlY2xhcmVkIGNvbHVtbi5cbiAgLy8gRmFpbC1vcGVuIChgIWhhcyhyZWNvcmQuc3RhdHVzKSB8fCBcdTIwMjZgKSB3b3VsZCB0aGVyZWZvcmUgYnV5IG5vdGhpbmcgYW5kIGNvc3RcbiAgLy8gc29tZXRoaW5nIHJlYWw6IENvbnZlcnQgd291bGQgZmxhc2ggb24gYSBkaXNxdWFsaWZpZWQgbGVhZCBmb3IgdGhlXG4gIC8vIHByZS1oeWRyYXRpb24gYmVhdCwgb24gYW4gSVJSRVZFUlNJQkxFIGFjdGlvbi5cbiAgLy8gVW5ndWFyZGVkLCBzdHJpY3QgQ0VMIGFib3J0ZWQgdGhlIHdob2xlIHByZWRpY2F0ZSBvbiB0aG9zZSB0d28gcmVuZGVyc1xuICAvLyAoYFtydW50aW1lXSBObyBzdWNoIGtleTogc3RhdHVzYCkgYW5kIG9iamVjdC11aSBmZWxsIGJhY2sgdG8gaXRzIG93blxuICAvLyBgZmFsbGJhY2s6IGZhbHNlYCwgc28gdGhpcyBzcGVsbGluZyBzdGF0ZXMgdGhlIHBvbGljeSB0aGUgZXJyb3IgcGF0aCB3YXNcbiAgLy8gYWxyZWFkeSBhcHBseWluZyBcdTIwMTQgbWludXMgdGhlIGNvbnNvbGUgd2FybmluZyBvbiBldmVyeSBsZWFkIHBhZ2UgbG9hZC4gKCMxODkwKVxuICAvL1xuICAvLyBcdTI2QTBcdUZFMEYgVGhlIGFwcHJvdmFsIHRlcm0gaXMgdGhlIE9ORSBmYWlsLU9QRU4gcmVhZCBpbiB0aGlzIHByZWRpY2F0ZSwgYW5kIHRoZVxuICAvLyBhc3ltbWV0cnkgaXMgZGVsaWJlcmF0ZSByYXRoZXIgdGhhbiBhbiBvdmVyc2lnaHQgaW4gYW4gb3RoZXJ3aXNlXG4gIC8vIGZhaWwtY2xvc2VkIGFycmFuZ2VtZW50IChSRVEtMDAwNSBzdGVwIDcpLiBUaGUgdHdvIHRlcm1zIGFib3ZlIGZhaWwgY2xvc2VkXG4gIC8vIGJlY2F1c2UgYW4gYWJzZW50IGBzdGF0dXNgIG1lYW5zIFwibm8gcmVjb3JkIHlldFwiIFx1MjAxNCBhIGxlYWQgd2l0aCBubyBzdGF0dXNcbiAgLy8gY2Fubm90IGV4aXN0LCBzaW5jZSBgc3RhdHVzYCBpcyBgcmVxdWlyZWRgIHdpdGggYSBgZGVmYXVsdFZhbHVlYC4gQW4gYWJzZW50XG4gIC8vIGBjb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1c2AgbWVhbnMgc29tZXRoaW5nIGVsc2UgZW50aXJlbHk6IGEgbGVhZCB3cml0dGVuXG4gIC8vIGJlZm9yZSB0aGUgY29sdW1uIGV4aXN0ZWQsIHdoaWNoIG11c3QgY29udmVydCB0aGUgd2F5IGl0IGFsd2F5cyBkaWQuIEFuZFxuICAvLyB0aGUgc2hpcHBlZCBgbm90X3JlcXVpcmVkYCBkZWZhdWx0IGlzIHRoZSBnYXRlJ3MgT0ZGIHBvc2l0aW9uLCBzbyB0cmVhdGluZ1xuICAvLyBcIm5vdCBvbmUgb2YgdGhlIHR3byByZWZ1c2luZyB2ZXJkaWN0c1wiIGFzIGNvbnZlcnRpYmxlIGlzIHdoYXQgbWFrZXMgdGhlXG4gIC8vIGRlZmF1bHQgaW5zdGFsbCBiZWhhdmUgZXhhY3RseSBhcyBpdCBkaWQgYmVmb3JlIHRoaXMgZmllbGQuIGBsZWFkLmhvb2sudHNgXG4gIC8vIGFuZCBgbGVhZC1jb252ZXJzaW9uLmZsb3cudHNgJ3MgYGRlY2lzaW9uX2FwcHJvdmFsYCBjYXJyeSB0aGUgc2FtZSBwb2xhcml0eVxuICAvLyBcdTIwMTQgdGhlIHRocmVlIHN1cmZhY2VzIGhhdmUgdG8gYWdyZWUgYWJvdXQgd2hhdCBcIm9mZlwiIG1lYW5zLCBvciB0aGUgYnV0dG9uXG4gIC8vIGRpc2FwcGVhcnMgb24gbGVhZHMgdGhlIHdyaXRlIHBhdGggd291bGQgaGFwcGlseSBjb252ZXJ0LlxuICAvL1xuICAvLyBcdTI2RDQgSGlkaW5nIHRoaXMgYnV0dG9uIGlzIE5PVCB0aGUgZ2F0ZS4gSXQgaXMgdGhlIGNvdXJ0ZXN5IGhhbGY7IHRoZSBjb250cm9sXG4gIC8vIGlzIHRoZSBgYmVmb3JlVXBkYXRlYCByZWZ1c2FsIGluIGBsZWFkLmhvb2sudHNgLCB3aGljaCBhIFJFU1QgY2FsbGVyIGNhbm5vdFxuICAvLyByb3V0ZSBhcm91bmQuXG4gIHZpc2libGU6IFBgaGFzKHJlY29yZC5pc19jb252ZXJ0ZWQpICYmIHJlY29yZC5pc19jb252ZXJ0ZWQgPT0gZmFsc2UgJiYgaGFzKHJlY29yZC5zdGF0dXMpICYmIHJlY29yZC5zdGF0dXMgIT0gXCJ1bnF1YWxpZmllZFwiICYmIHJlY29yZC5zdGF0dXMgIT0gXCJjb252ZXJ0ZWRcIlxuICAgICYmICghaGFzKHJlY29yZC5jb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1cykgfHwgKHJlY29yZC5jb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1cyAhPSBcInBlbmRpbmdcIiAmJiByZWNvcmQuY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXMgIT0gXCJyZWplY3RlZFwiKSlgLFxuICAvLyBOTyBgY29uZmlybVRleHRgLiBBIHNjcmVlbiBmbG93IElTIHRoZSBjb25maXJtYXRpb24sIGFuZCB0aGlzIG9uZSBvcGVuc1xuICAvLyBgQ29udmVyc2lvbiBEZXRhaWxzYCBcdTIwMTQgYSBzY3JlZW4gY2FycnlpbmcgdGhlIGRlY2lzaW9uIChgQ3JlYXRlXG4gIC8vIE9wcG9ydHVuaXR5P2AsIGFuZCB0aGUgZGVhbCdzIG5hbWUgYW5kIGFtb3VudCksIGEgQ2FuY2VsIGJ1dHRvbiwgYW5kIHRoZVxuICAvLyBzdXNwZWN0ZWQtZHVwbGljYXRlIHdhcm5pbmcgdGhhdCBzYXlzIHNvbWV0aGluZyBUUlVFIGFib3V0IFRISVMgbGVhZC4gQVxuICAvLyBkaWFsb2cgaW4gZnJvbnQgb2YgaXQgY29zdHMgZXZlcnkgY29udmVyc2lvbiBvbmUgZXh0cmEgY2xpY2sgdG8gYW5zd2VyIGFcbiAgLy8gcXVlc3Rpb24gaXQgY2Fubm90IGhlbHAgYW55b25lIGFuc3dlci4gQ29uZmlybXMgYXJlIGZvciBERVNUUlVDVElWRSBhY3Rpb25zXG4gIC8vIHdpdGggbm8gZm9sbG93LXVwIFVJIFx1MjAxNCBgY2xvc2VfY2FzZWAgLyBgZXNjYWxhdGVfY2FzZWAgaW4gYGNhc2UuYWN0aW9ucy50c2BcbiAgLy8gYXJlIHRoZSBzaGFwZSB0aGF0IHN0aWxsIGVhcm5zIG9uZS5cbiAgLy9cbiAgLy8gTWVjaGFuaXNtLCBtZWFzdXJlZCBvbiB0aGUgY29uc29sZSB0aGlzIGFwcCBwaW5uZWQgYXQgdGhhdCB0YWtpbmdcbiAgLy8gKEBvYmplY3RzdGFjay9jb25zb2xlIDE3LjMuMCwgYGRpc3QvYXNzZXRzL2A7IHRoaXMgYnVuZGxlIHJlYWQgd2FzIFx1MjZENCBOT1RcbiAgLy8gcmUtdGFrZW4gb24gYW55IGxhdGVyIHBpbiBcdTIwMTQgMTcuNC4wLCBQUiAjMTgxNCwgb3IgMTcuNS4wKSByYXRoZXIgdGhhblxuICAvLyBhc3N1bWVkOiB0aGUgcnVubmVyIGdhdGVzIHRoZSBkaWFsb2cgb25cbiAgLy8gdGhlIGtleSdzIHByZXNlbmNlIGFsb25lIFx1MjAxNFxuICAvLyAgICAgaWYgKGFjdGlvbi5jb25maXJtVGV4dCAmJiAhYXdhaXQgY29uZmlybUhhbmRsZXIoZXZhbHVhdGUoYWN0aW9uLmNvbmZpcm1UZXh0KSkpXG4gIC8vICAgICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnQWN0aW9uIGNhbmNlbGxlZCBieSB1c2VyJyB9O1xuICAvLyBcdTIwMTQgc28gUkVNT1ZJTkcgdGhlIGtleSBpcyB3aGF0IHJlbW92ZXMgdGhlIGRpYWxvZzsgdGhlcmUgaXMgbm8gYGNvbmZpcm06XG4gIC8vIGZhbHNlYCB0byB3cml0ZSwgYW5kIG5vIG90aGVyIGtleSByZS1yYWlzZXMgaXQuXG4gIHN1Y2Nlc3NNZXNzYWdlOiAnTGVhZCBjb252ZXJ0ZWQgc3VjY2Vzc2Z1bGx5IScsXG4gIHJlZnJlc2hBZnRlcjogdHJ1ZSxcbiAgLy8gQURSLTAwMTEgXHUyMDE0IG9wdCB0aGlzIEFjdGlvbiBpbiB0byBBSSwgd2hpY2ggbWF0ZXJpYWxpc2VzIHRoZVxuICAvLyBgYWN0aW9uX2NvbnZlcnRfbGVhZGAgdG9vbCB0aGUgYGxlYWRfcXVhbGlmaWNhdGlvbmAgc2tpbGwgcmVmZXJlbmNlcy5cbiAgLy8gRmxvdy10eXBlZCB3aXRoIGEgdGFyZ2V0LCBzbyBpdCBoYXMgYSBoZWFkbGVzcyBwYXRoLiBgcmVxdWlyZXNDb25maXJtYXRpb25gXG4gIC8vIGlzIHRoZSBvbmx5IGtleSB0aGUgQUkgcGF0aCByZWFkczogYGFjdGlvbkxvb2tzRGVzdHJ1Y3RpdmVgIGNvbnN1bHRzXG4gIC8vIGBhaS5yZXF1aXJlc0NvbmZpcm1hdGlvbmAgYW5kIG5vdGhpbmcgZWxzZSwgYW5kIHRoZSBjb25zb2xlJ3NcbiAgLy8gY29uZmlybS1kaWFsb2cgc3RyaW5nIHJlYWNoZWQgbm8gQUkgY29kZSBcdTIwMTQgc28gZHJvcHBpbmcgYGNvbmZpcm1UZXh0YCBhYm92ZVxuICAvLyBsZWF2ZXMgdGhlIEFJIGFwcHJvdmFsIHNpZ25hbCBleGFjdGx5IHdoZXJlIGl0IHdhcy4gVGhlIGZsYWcgaXMgU1VSRkFDRUQsXG4gIC8vIG5vdCBlbmZvcmNlZCBcdTIwMTQgYGxpc3RfYWN0aW9uc2AgcmVwb3J0cyBgcmVxdWlyZXNDb25maXJtYXRpb246IHRydWVgIGFuZCB0aGVcbiAgLy8gY2FsbGluZyBjbGllbnQgZGVjaWRlcyB3aGF0IHRvIGRvIHdpdGggaXQsIHdoaWxlIGBydW5fYWN0aW9uYCBkaXNwYXRjaGVzXG4gIC8vIHRoZSBmbG93IHdpdGggbm8gc2VydmVyLXNpZGUgcGF1c2UuIEl0IHdhcm5zIHRoZSBjYWxsZXIgdGhhdCB0aGlzIGlzXG4gIC8vIGlycmV2ZXJzaWJsZTsgaXQgaXMgbm90IGEgbG9jay5cbiAgYWk6IHtcbiAgICBleHBvc2VkOiB0cnVlLFxuICAgIHJlcXVpcmVzQ29uZmlybWF0aW9uOiB0cnVlLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0NvbnZlcnRzIGEgcXVhbGlmaWVkIGxlYWQgaW50byBhbiBhY2NvdW50LCBjb250YWN0IGFuZCBvcHBvcnR1bml0eS4gSXJyZXZlcnNpYmxlIFx1MjAxNCByZXF1aXJlcyBodW1hbiBhcHByb3ZhbCBiZWZvcmUgaXQgcnVucy4nLFxuICB9LFxufTtcblxuLyoqXG4gKiBTY2hlZHVsZSB0aGUgbmV4dCBmb2xsb3ctdXAgb24gYSBsZWFkLlxuICpcbiAqIFRoZSBnYXAgdGhpcyBmaWxsczogYGxvZ19jYWxsYCAvIGBsb2dfbWVldGluZ2AgcmVjb3JkIHdoYXQgYWxyZWFkeSBoYXBwZW5lZFxuICogKGEgYHN5c19hY3Rpdml0eWAgdGltZWxpbmUgZW50cnkpLCBidXQgbm90aGluZyBwdXQgdGhlIE5FWFQgdG91Y2ggb24gdGhlXG4gKiByZXAncyBsaXN0LiBGaWxpbmcgdGhhdCBmb2xsb3ctdXAgbWVhbnQgbGVhdmluZyB0aGUgbGVhZCwgb3BlbmluZyB0aGVcbiAqIFJlbGF0ZWQgdGFiLCBmaW5kaW5nIHRoZSBUYXNrcyBibG9jaywgYW5kIGhhbmQtcGlja2luZyB0aGUgbGVhZCBiYWNrIGFzIHRoZVxuICogcGFyZW50IFx1MjAxNCBmb3VyIHN0ZXBzIGZvciB0aGUgc2luZ2xlIG1vc3QgY29tbW9uIHRoaW5nIGEgcmVwIGRvZXMgYWZ0ZXIgYSBjYWxsLlxuICpcbiAqIEZsb3ctdHlwZWQsIG5vdCBgdHlwZTogJ21vZGFsJ2A6IG1vZGFsIGFjdGlvbnMgYXJlIG5vbi1mdW5jdGlvbmFsIGluIDE2LjEuMFxuICogKHRoZSBjb25zb2xlIHJlc29sdmVzIHRoZSBhY3Rpb24ncyBgdGFyZ2V0YCBhcyBhbiBvYmplY3QgbmFtZSwgc28gc3VibWl0dGluZ1xuICogb25lIGRpZXMgb24gYEdFVCAvYXBpL3YxL21ldGEvb2JqZWN0Lzx0YXJnZXQ+YCBcdTIxOTIgNDAwIFx1MjAxNCByZXByb2R1Y2libGUgb24gdGhlXG4gKiBwcmUtZXhpc3RpbmcgYGxvZ19jYWxsYCB0b28pLiBUaGUgc2NyZWVuIGZsb3cgdW5kZXJcbiAqIGBzcmMvc2FsZXMvZmxvd3Mvc2NoZWR1bGUtZm9sbG93dXAuZmxvdy50c2AgY29sbGVjdHMgdGhlIHNhbWUgZmllbGRzIGFuZCBkb2VzIHRoZVxuICogd3JpdGU7IHRoYXQgbWVjaGFuaXNtIGlzIHByb3ZlbiBieSBgY29udmVydF9sZWFkYCBhYm92ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNjaGVkdWxlRm9sbG93VXBBY3Rpb246IEFjdGlvbiA9IHtcbiAgbmFtZTogJ3NjaGVkdWxlX2ZvbGxvd3VwJyxcbiAgbGFiZWw6ICdTY2hlZHVsZSBGb2xsb3ctdXAnLFxuICBvYmplY3ROYW1lOiAnY3JtX2xlYWQnLFxuICBpY29uOiAnY2FsZW5kYXItcGx1cycsXG4gIHR5cGU6ICdmbG93JyxcbiAgdGFyZ2V0OiAnc2NoZWR1bGVfZm9sbG93dXAnLFxuICBsb2NhdGlvbnM6IFsncmVjb3JkX2hlYWRlcicsICdsaXN0X2l0ZW0nXSxcbiAgLy8gQSBjb252ZXJ0ZWQgb3IgZGlzcXVhbGlmaWVkIGxlYWQgaGFzIG5vIG5leHQgdG91Y2ggdG8gc2NoZWR1bGUuXG4gIHZpc2libGU6IFBgaGFzKHJlY29yZC5pc19jb252ZXJ0ZWQpICYmIHJlY29yZC5pc19jb252ZXJ0ZWQgPT0gZmFsc2UgJiYgaGFzKHJlY29yZC5zdGF0dXMpICYmIHJlY29yZC5zdGF0dXMgIT0gXCJ1bnF1YWxpZmllZFwiICYmIHJlY29yZC5zdGF0dXMgIT0gXCJjb252ZXJ0ZWRcImAsXG4gIHN1Y2Nlc3NNZXNzYWdlOiAnRm9sbG93LXVwIHNjaGVkdWxlZC4nLFxuICByZWZyZXNoQWZ0ZXI6IHRydWUsXG4gIC8vIEFEUi0wMDExIFx1MjAxNCBtYXRlcmlhbGlzZXMgYGFjdGlvbl9zY2hlZHVsZV9mb2xsb3d1cGAgZm9yIHRoZVxuICAvLyBgbGVhZF9xdWFsaWZpY2F0aW9uYCBza2lsbC4gQWRkaXRpdmUgYW5kIHJldmVyc2libGUsIHNvIG5vIGFwcHJvdmFsIGdhdGUuXG4gIGFpOiB7XG4gICAgZXhwb3NlZDogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdTY2hlZHVsZXMgdGhlIG5leHQgZm9sbG93LXVwIHRhc2sgb24gYSBsZWFkLCBhc3NpZ25lZCB0byBpdHMgb3duZXIsIHNvIHRoZSBuZXh0IHRvdWNoIGxhbmRzIG9uIHRoZSByZXAgbGlzdC4nLFxuICB9LFxufTtcblxuLyoqXG4gKiBBZGQgc2VsZWN0ZWQgbGVhZHMgdG8gYSBDYW1wYWlnbi5cbiAqXG4gKiBTY3JpcHQtdHlwZWQgYWN0aW9uOiBjb2xsZWN0cyBhIGNhbXBhaWduIGlkIChwYXJhbSBkaWFsb2cpIHRoZW4gd3JpdGVzIG9uZVxuICogYGNybV9jYW1wYWlnbl9tZW1iZXJgIHJlY29yZCBmb3IgdGhlIGRpc3BhdGNoZWQgbGVhZCwgc2tpcHBpbmcgbGVhZHMgYWxyZWFkeVxuICogb24gdGhlIGNhbXBhaWduLiBUaGUgY2hvc2VuIGNhbXBhaWduIGFycml2ZXMgYXMgYGlucHV0LmNybV9jYW1wYWlnbmA7IHRoZVxuICogbGVhZCBhcnJpdmVzIGFzIGBjdHgucmVjb3JkSWRgLlxuICpcbiAqIFBFUi1SRUNPUkQgZGlzcGF0Y2gsIGRlbGliZXJhdGVseS4gYHNyYy9zYWxlcy92aWV3cy9sZWFkLnZpZXcudHNgIHdpcmVzIHRoaXMgYXMgdGhlXG4gKiBCQVJFLVNUUklORyBmb3JtIFx1MjAxNCBgYnVsa0FjdGlvbnM6IFsnY3JlYXRlX2NhbXBhaWduJ11gIFx1MjAxNCBhbmQgdGhhdCBzdHJpbmcgaXMgYVxuICogZGlzcGF0Y2ggY29udHJhY3QsIG5vdCBhIHNwZWxsaW5nIG9mIHRoZSBvdGhlciBvbmU6XG4gKlxuICogICAtIGJhcmUgc3RyaW5nICAgIFx1MjE5MiB0aGUgcmVuZGVyZXIgcHJvbW90ZXMgdGhlIGFjdGlvbiB0byBhIGRlZiBjYXJyeWluZyBpdHNcbiAqICAgICBvd24gbGFiZWwgLyBpY29uIC8gcGFyYW1zIC8gYHZpc2libGVgIGFuZCBkaXNwYXRjaGVzIGl0IE9OQ0UgUEVSIHNlbGVjdGVkXG4gKiAgICAgcm93LCBlYWNoIGNhbGwgY2FycnlpbmcgdGhhdCByb3cncyBgcmVjb3JkSWRgIGFuZCBOTyBzZWxlY3Rpb24gYXJyYXkuIEFcbiAqICAgICAxMC1sZWFkIHNlbGVjdGlvbiBpcyAxMCBkaXNwYXRjaGVzIHRocm91Z2ggdGhpcyBib2R5LCBvbmUgbGVhZCBlYWNoLlxuICogICAtIGBidWxrQWN0aW9uRGVmc2AgKyBgZXhlY3V0aW9uOiAnYWdncmVnYXRlJ2AgXHUyMTkyIE9ORSBkaXNwYXRjaCBmb3IgdGhlIHdob2xlXG4gKiAgICAgc2VsZWN0aW9uLCBldmVyeSBpZCBpbiB0aGUgYnVpbHRpbiBgcGFyYW1zLl9zZWxlY3RlZElkc2AgYW5kIG5vXG4gKiAgICAgYHJlY29yZElkYCAoc2VlIGBtYXNzX3VwZGF0ZV9zdGFnZWAgaW4gYG9wcG9ydHVuaXR5LmFjdGlvbnMudHNgKS5cbiAqXG4gKiBTbyBtdWx0aS1zZWxlY3QgZW5yb2xsbWVudCBhbHJlYWR5IHdvcmtzIGhlcmUgXHUyMDE0IGl0IGp1c3QgYXJyaXZlcyBvbmUgbGVhZCBhdCBhXG4gKiB0aW1lLiBUaGlzIGJvZHkgcmVhZHMgYGN0eC5yZWNvcmRJZGAgYW5kIG5vdGhpbmcgZWxzZSwgd2hpY2ggaXMgZXhhY3RseSB3aGF0XG4gKiB0aGUgZmFuLW91dCBkZWxpdmVycy5cbiAqXG4gKiBcdTI2RDQgTmV2ZXIgYWRkIGFuIGBpbnB1dC5zZWxlY3RlZElkc2AgcmVhZCAobm8gdW5kZXJzY29yZSkuIE5vdGhpbmcgY2FuIGRlbGl2ZXJcbiAqIHRoYXQga2V5IG9uIGVpdGhlciBjb250cmFjdCwgc28gaXQgaXMgZGVhZCBjb2RlIGFuZCBub3QgYSBmYWxsYmFjazogYVxuICogdG9wLWxldmVsIGBzZWxlY3RlZElkc2AgaXMgbmV2ZXIgbWVyZ2VkIGludG8gdGhlIHBhcmFtcyBiYWcsIGFuZCBhXG4gKiBgcGFyYW1zLnNlbGVjdGVkSWRzYCBpcyByZWZ1c2VkIGJ5IHRoZSBzdHJpY3QgcGFyYW1zIGdhdGUgKEFEUi0wMTA0KSB3aXRoXG4gKiBgVW5rbm93biBhY3Rpb24gcGFyYW0gXCJzZWxlY3RlZElkc1wiIFx1MjAxNCBub3QgZGVjbGFyZWQgb24gdGhpcyBhY3Rpb25gLiBUaGUgb25seVxuICogc2VsZWN0aW9uIGNoYW5uZWwgaXMgdGhlIHVuZGVyc2NvcmUtcHJlZml4ZWQgYnVpbHRpbiwgYW5kIG9ubHkgdGhlIGFnZ3JlZ2F0ZVxuICogY29udHJhY3QgaW5qZWN0cyBpdCAoYEBvYmplY3RzdGFjay9zcGVjYCBgdWkvYWN0aW9uLXBhcmFtcy56b2QudHNgLFxuICogYEFDVElPTl9QQVJBTV9CVUlMVElOX0tFWVNgKS5cbiAqXG4gKiBTd2l0Y2hpbmcgdGhpcyBhY3Rpb24gdG8gdGhlIGFnZ3JlZ2F0ZSBjb250cmFjdCB3b3VsZCBiZSBhIFBST0RVQ1QgY2hhbmdlIFx1MjAxNFxuICogb25lIGF1ZGl0IGVudHJ5IGFuZCBvbmUgZGVkdXBlIHJlYWQgcGVyIHJ1biBpbnN0ZWFkIG9mIHBlciBsZWFkLCBhbmRcbiAqIGFsbC1vci1ub3RoaW5nIGZhaWx1cmUgc2VtYW50aWNzIFx1MjAxNCBzbyBpdCBuZWVkcyBgbGVhZC52aWV3LnRzYCBjaGFuZ2VkIHdpdGggaXRcbiAqIGFuZCBpcyBkZWxpYmVyYXRlbHkgbm90IGRvbmUgaGVyZS5cbiAqL1xuZXhwb3J0IGNvbnN0IENyZWF0ZUNhbXBhaWduQWN0aW9uOiBBY3Rpb24gPSB7XG4gIG5hbWU6ICdjcmVhdGVfY2FtcGFpZ24nLFxuICBsYWJlbDogJ0FkZCB0byBDYW1wYWlnbicsXG4gIG9iamVjdE5hbWU6ICdjcm1fbGVhZCcsXG4gIGljb246ICdzZW5kJyxcbiAgLy8gc2NyaXB0LCBub3QgbW9kYWwgXHUyMDE0IGEgYHR5cGU6ICdtb2RhbCdgIGFjdGlvbiBoYXMgTk8gc2VydmVyIGRpc3BhdGNoIGF0IGFsbDpcbiAgLy8gdGhlIHJlbmRlcmVyIGp1c3Qgb3BlbnMgaXRzIGB0YXJnZXRgLCBhbmQgdGhlIHJ1bnRpbWUgcmVmdXNlcyBpdCBvdmVyIFJFU1RcbiAgLy8gKGBoZWFkbGVzc0FjdGlvblR5cGVFcnJvcmAsIDQwMCBcImEgY2xpZW50LXNpZGUgYWN0aW9uIHdpdGggbm8gc2VydmVyXG4gIC8vIGRpc3BhdGNoXCIpLCBzbyBpdHMgYGJvZHlgIG5ldmVyIHJ1bnMuIFRvIGNvbGxlY3QgaW5wdXQgYW5kIHRoZW4gcnVuXG4gIC8vIHNlcnZlci1zaWRlLCB0aGUgc2hhcGUgaXMgYHR5cGU6ICdzY3JpcHQnYCArIGBwYXJhbXNgIFx1MjAxNCB0aGUgcnVubmVyIGNvbGxlY3RzXG4gIC8vIHRoZSBzYW1lIGRpYWxvZy4gU2VlIFNjaGVkdWxlRm9sbG93VXBBY3Rpb24uXG4gIHR5cGU6ICdzY3JpcHQnLFxuICBib2R5OiB7XG4gICAgbGFuZ3VhZ2U6ICdqcycsXG4gICAgc291cmNlOiBgXG4gICAgICAvLyBWYWx1ZSBrZXkgPSB0aGUgcGFyYW0ncyBmaWVsZCBuYW1lICgnY3JtX2NhbXBhaWduJykgc2luY2UgdGhlIHBhcmFtXG4gICAgICAvLyBvbWl0cyBhbiBleHBsaWNpdCAnbmFtZScuIEluc2VydCB1c2VzIHRoZSBSRUFMIGxvb2t1cCBmaWVsZCBuYW1lcyBvblxuICAgICAgLy8gY3JtX2NhbXBhaWduX21lbWJlciAoY3JtX2NhbXBhaWduIC8gY3JtX2xlYWQpIFx1MjAxNCBub3QgdGhlIGdlbmVyaWNcbiAgICAgIC8vIGNhbXBhaWduX2lkIC8gbGVhZF9pZCBhbiBlYXJsaWVyIHJldmlzaW9uIG9mIHRoZSBkb2MgZXhhbXBsZSB0YXVnaHQsXG4gICAgICAvLyB3aGljaCBkb24ndCBleGlzdCBoZXJlIGFuZCBsZWZ0IGNybV9jYW1wYWlnbiBudWxsIFx1MjE5MiAnQ2FtcGFpZ24gcmVxdWlyZWQnXG4gICAgICAvLyB2YWxpZGF0aW9uIGZhaWx1cmUuXG4gICAgICBjb25zdCBjYW1wYWlnbklkID0gaW5wdXQuY3JtX2NhbXBhaWduID8/IG51bGw7XG4gICAgICBpZiAoIWNhbXBhaWduSWQpIHRocm93IG5ldyBFcnJvcignY3JlYXRlX2NhbXBhaWduIHJlcXVpcmVzIGEgY2FtcGFpZ24gaWQnKTtcbiAgICAgIC8vIE9uZSBsZWFkIHBlciBkaXNwYXRjaCBcdTIwMTQgdGhlIGJhcmUtc3RyaW5nIFxcYGJ1bGtBY3Rpb25zXFxgIHdpcmluZyBmYW5zIHRoaXNcbiAgICAgIC8vIGJvZHkgb3V0IG9uY2UgcGVyIHNlbGVjdGVkIHJvdyAoc2VlIHRoZSBub3RlIGFib3ZlKS4gXFxgaWRzXFxgIHN0YXlzIGFcbiAgICAgIC8vIGxpc3Qgc28gdGhlIGRlZHVwZSArIHNraXAgbG9vcCBiZWxvdyByZWFkcyB0aGUgc2FtZSBvbiBib3RoIGNvbnRyYWN0cyxcbiAgICAgIC8vIHNob3VsZCB0aGlzIGFjdGlvbiBldmVyIG1vdmUgdG8gYW4gYWdncmVnYXRlIGRlZi5cbiAgICAgIGNvbnN0IGlkcyA9IGN0eC5yZWNvcmRJZCA/IFtjdHgucmVjb3JkSWRdIDogW107XG4gICAgICBpZiAoIWlkcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignY3JlYXRlX2NhbXBhaWduOiBubyBsZWFkIHNlbGVjdGVkJyk7XG4gICAgICAvLyBTa2lwIGxlYWRzIGFscmVhZHkgb24gdGhpcyBjYW1wYWlnbiBcdTIwMTQgdGhlIG1vZGFsIGNvcHkgcHJvbWlzZXNcbiAgICAgIC8vIGR1cGxpY2F0ZXMgYXJlIHNraXBwZWQsIGFuZCByZS1ydW5uaW5nIHRoZSBhY3Rpb24gb24gdGhlIHNhbWVcbiAgICAgIC8vIHNlbGVjdGlvbiBtdXN0IG5vdCBkb3VibGUtY291bnQgbWFya2V0aW5nIHRvdWNoZXMuXG4gICAgICBjb25zdCByYXcgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduX21lbWJlcicpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGNhbXBhaWduSWQgfSxcbiAgICAgICAgZmllbGRzOiBbJ2NybV9sZWFkJ10sXG4gICAgICAgIHRvcDogNTAwMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZXhpc3RpbmdSb3dzID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3IDogKHJhdz8ucmVjb3JkcyA/PyBbXSk7XG4gICAgICBjb25zdCBleGlzdGluZyA9IG5ldyBTZXQoZXhpc3RpbmdSb3dzLm1hcCgocikgPT4gci5jcm1fbGVhZCkpO1xuICAgICAgY29uc3QgaW5zZXJ0ZWQgPSBbXTtcbiAgICAgIGxldCBza2lwcGVkID0gMDtcbiAgICAgIGZvciAoY29uc3QgbGVhZElkIG9mIGlkcykge1xuICAgICAgICBpZiAoZXhpc3RpbmcuaGFzKGxlYWRJZCkpIHsgc2tpcHBlZCsrOyBjb250aW51ZTsgfVxuICAgICAgICBjb25zdCByb3cgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduX21lbWJlcicpLmluc2VydCh7XG4gICAgICAgICAgY3JtX2NhbXBhaWduOiBjYW1wYWlnbklkLFxuICAgICAgICAgIGNybV9sZWFkOiBsZWFkSWQsXG4gICAgICAgICAgc3RhdHVzOiAnc2VudCcsXG4gICAgICAgIH0pO1xuICAgICAgICBpbnNlcnRlZC5wdXNoKHJvdz8uaWQgPz8gbnVsbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBjYW1wYWlnbklkLCBjb3VudDogaW5zZXJ0ZWQubGVuZ3RoLCBza2lwcGVkLCBpZHM6IGluc2VydGVkIH07XG4gICAgYCxcbiAgICBjYXBhYmlsaXRpZXM6IFsnYXBpLnJlYWQnLCAnYXBpLndyaXRlJ10sXG4gICAgdGltZW91dE1zOiAxMDAwMCxcbiAgfSxcbiAgLy8gbGlzdF9pdGVtIGdpdmVzIGV2ZXJ5IHJvdyBhIHdvcmtpbmcgcmVjb3JkLXNjb3BlZCBlbnRyeSBwb2ludC4gVGhlXG4gIC8vIGxpc3RfdG9vbGJhciBidXR0b24gaXMgc2luZ2xlLXJlY29yZCBieSBjb25zdHJ1Y3Rpb246IHdpdGggbm8gYF9zZWxlY3RlZElkc2BcbiAgLy8gaW4gdGhlIGJhZyB0aGUgZGlzcGF0Y2hlciByZXNvbHZlcyBhIHJlY29yZElkIGZyb20gdGhlIGdyaWQgc2VsZWN0aW9uLCBhbmQgYVxuICAvLyBtdWx0aS1yb3cgc2VsZWN0aW9uIHRoZXJlIGlzIGFtYmlndW91cywgc28gaXQgaXMgcmVmdXNlZCBjbGllbnQtc2lkZSB3aXRoXG4gIC8vIFwiVGhpcyBhY3Rpb24gcnVucyBvbiBhIHNpbmdsZSByZWNvcmQgXHUyMDE0IHNlbGVjdCBleGFjdGx5IG9uZSByb3cuXCJcbiAgLy8gTXVsdGktbGVhZCBlbnJvbGxtZW50IGlzIHRoZSBTRUxFQ1RJT04tQkFSIGJ1dHRvbiBpbnN0ZWFkLCB3aGljaCB0aGUgdmlldydzXG4gIC8vIGBidWxrQWN0aW9uczogWydjcmVhdGVfY2FtcGFpZ24nXWAgcHJvZHVjZXMgYW5kIHdoaWNoIGZhbnMgb3V0IHBlciByb3cuXG4gIGxvY2F0aW9uczogWydsaXN0X3Rvb2xiYXInLCAnbGlzdF9pdGVtJ10sXG4gIHBhcmFtczogW1xuICAgIC8vIEZpZWxkLWJhY2tlZCBwYXJhbTogYGZpZWxkYCArIGBvYmplY3RPdmVycmlkZWAgbWFrZSB0aGUgY29uc29sZSByZXNvbHZlXG4gICAgLy8gdGhlIHdpZGdldCBmcm9tIGNybV9jYW1wYWlnbl9tZW1iZXIuY3JtX2NhbXBhaWduIChhIGxvb2t1cCBcdTIxOTIgY3JtX2NhbXBhaWduKSxcbiAgICAvLyByZW5kZXJpbmcgYSBSRUNPUkQgUElDS0VSLiBBIGJhcmUgYHsgdHlwZTonbG9va3VwJyB9YCB3aXRoIG5vIGZpZWxkIGNhbid0XG4gICAgLy8gcmVzb2x2ZSBhIHRhcmdldCBvYmplY3QgYW5kIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gYSBwYXN0ZS10aGUtSUQgdGV4dGJveC5cbiAgICB7XG4gICAgICBmaWVsZDogJ2NybV9jYW1wYWlnbicsXG4gICAgICBvYmplY3RPdmVycmlkZTogJ2NybV9jYW1wYWlnbl9tZW1iZXInLFxuICAgICAgbGFiZWw6ICdDYW1wYWlnbicsXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9XG4gIF0sXG4gIHN1Y2Nlc3NNZXNzYWdlOiAnTGVhZHMgYWRkZWQgdG8gY2FtcGFpZ24hJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FjdGlvbnMvb3Bwb3J0dW5pdHkuYWN0aW9ucy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9hY3Rpb25zXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FjdGlvbnMvb3Bwb3J0dW5pdHkuYWN0aW9ucy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBBY3Rpb24gfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5pbXBvcnQgeyBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgT1BQT1JUVU5JVFlfU1RBR0VfT1BUSU9OUywgcGxhaW5PcHRpb25zIH0gZnJvbSAnLi4vb2JqZWN0cy9fcGlja2xpc3RzJztcblxuLyoqXG4gKiBDbG9uZSBPcHBvcnR1bml0eS5cbiAqXG4gKiBTY3JpcHQtdHlwZWQgYWN0aW9uOiBjbG9uZXMgdGhlIGN1cnJlbnQgcmVjb3JkIGludG8gYSBuZXdcbiAqIGBwcm9zcGVjdGluZ2Atc3RhZ2Ugb3Bwb3J0dW5pdHkuIFJ1bnMgc2FuZGJveGVkIHVuZGVyIGBhcGkucmVhZGBcbiAqICh0byBmZXRjaCB0aGUgc291cmNlKSBhbmQgYGFwaS53cml0ZWAgKHRvIHdyaXRlIHRoZSBjb3B5KS5cbiAqL1xuZXhwb3J0IGNvbnN0IENsb25lT3Bwb3J0dW5pdHlBY3Rpb246IEFjdGlvbiA9IHtcbiAgbmFtZTogJ2Nsb25lX29wcG9ydHVuaXR5JyxcbiAgbGFiZWw6ICdDbG9uZSBPcHBvcnR1bml0eScsXG4gIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICBpY29uOiAnY29weScsXG4gIHR5cGU6ICdzY3JpcHQnLFxuICBib2R5OiB7XG4gICAgbGFuZ3VhZ2U6ICdqcycsXG4gICAgc291cmNlOiBgXG4gICAgICBjb25zdCBpZCA9IGN0eC5yZWNvcmRJZDtcbiAgICAgIGlmICghaWQpIHRocm93IG5ldyBFcnJvcignY2xvbmVfb3Bwb3J0dW5pdHkgcmVxdWlyZXMgYSByZWNvcmRJZCcpO1xuICAgICAgLy8gUmVhZCB0aGUgc291cmNlIGZyb20gY3R4LnJlY29yZCAoc2VlZGVkIGJ5IHRoZSBydW5uZXIgZm9yIHJlY29yZC1zY29wZWRcbiAgICAgIC8vIGFjdGlvbnMgXHUyMDE0IHNhbWUgc291cmNlIHNlbmRfZW1haWwgdXNlcykuIFRoaXMgYXZvaWRzIHRoZSBpbi1zYW5kYm94XG4gICAgICAvLyBmaW5kKCkgdGhhdCBwcmV2aW91c2x5IGZhdWx0ZWQsIFdISUxFIHN0aWxsIGNvcHlpbmcgdGhlIFJFUVVJUkVEIGZpZWxkc1xuICAgICAgLy8gKGNybV9hY2NvdW50IC8gYW1vdW50IC8gY2xvc2VfZGF0ZSkuIFRoZSBvbGQgbWluaW1hbCBpbnNlcnQgc2V0IG9ubHlcbiAgICAgIC8vIG5hbWUrc3RhZ2UsIHNvIGV2ZXJ5IGNsb25lIGZhaWxlZCB0aGUgb2JqZWN0J3MgcmVxdWlyZWQtZmllbGQgKyBhbW91bnQ+MFxuICAgICAgLy8gdmFsaWRhdGlvbnMgYXQgcnVudGltZSBhbmQgbm8gb3Bwb3J0dW5pdHkgd2FzIGV2ZXIgY3JlYXRlZC5cbiAgICAgIGNvbnN0IHNyYyA9IGN0eC5yZWNvcmQgPz8ge307XG4gICAgICBpZiAoIXNyYy5jcm1fYWNjb3VudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nsb25lX29wcG9ydHVuaXR5OiBzb3VyY2UgYWNjb3VudCBub3QgbG9hZGVkOyBjYW5ub3QgY2xvbmUuJyk7XG4gICAgICB9XG4gICAgICAvLyBHaXZlIHRoZSBjbG9uZSBhIGZyZXNoIDkwLWRheSBjbG9zZSBob3Jpem9uIHNvIGEgY29waWVkIHBhc3QgZGF0ZSBjYW4ndFxuICAgICAgLy8gdHJpcCB0aGUgXCJjbG9zZSBkYXRlIGluIHRoZSBwYXN0XCIgdmFsaWRhdGlvbiBvbiBhIG5ldyBwcm9zcGVjdGluZyBkZWFsLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBzdGVwIGlzIG9uIHRoZSBVVEMgY2FsZW5kYXIgYmVjYXVzZSB0aGUgcmVuZGVyIGJlbG93IGlzXG4gICAgICAvLyAoXFxgdG9JU09TdHJpbmcoKVxcYCkuIFRoZSBiYXNlIGlzIFxcYG5ldyBEYXRlKClcXGAgXHUyMDE0IGFuIGluc3RhbnQsIG5vdCBhXG4gICAgICAvLyBzdG9yZWQgXFxgWVlZWS1NTS1ERFxcYCBcdTIwMTQgc28gdW5saWtlIHF1b3RlLmhvb2svdGFzay5ob29rIHRoZXJlIGlzIG5vXG4gICAgICAvLyBVVEMtbWlkbmlnaHQgYW5jaG9yIGJlaW5nIHJlYWQgYmFjayBvbiB0aGUgd3JvbmcgY2FsZW5kYXIgaGVyZTsgdGhlXG4gICAgICAvLyBvbmx5IG1peHR1cmUgd2FzIHRoZSBzdGVwIGl0c2VsZi4gQSBsb2NhbCBcXGBnZXREYXRlXFxgL1xcYHNldERhdGVcXGAgc3RlcFxuICAgICAgLy8gcHJlc2VydmVzIFdBTEwtQ0xPQ0sgdGltZSwgc28gYSA5MC1kYXkgd2luZG93IGNvbnRhaW5pbmcgYSBEU1RcbiAgICAgIC8vIHRyYW5zaXRpb24gaXMgMjMgaCBvciAyNSBoIGxvbmcgYW5kIHRoZSByZW5kZXJlZCBVVEMgZGF5IGxhbmRzIG9uZSBvZmZcbiAgICAgIC8vIHdoZW5ldmVyIHRoZSBjbG9uZSBpbnN0YW50IGlzIHdpdGhpbiBhbiBob3VyIG9mIGEgVVRDIGRheSBib3VuZGFyeS5cbiAgICAgIGNvbnN0IGhvcml6b24gPSBuZXcgRGF0ZSgpO1xuICAgICAgaG9yaXpvbi5zZXRVVENEYXRlKGhvcml6b24uZ2V0VVRDRGF0ZSgpICsgOTApO1xuICAgICAgY29uc3QgaW5zZXJ0ZWQgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykuaW5zZXJ0KHtcbiAgICAgICAgbmFtZTogJ0NvcHkgb2YgJyArIChzcmMubmFtZSA/PyAoJ29wcG9ydHVuaXR5ICcgKyBpZCkpLFxuICAgICAgICBjcm1fYWNjb3VudDogc3JjLmNybV9hY2NvdW50LFxuICAgICAgICBwcmltYXJ5X2NvbnRhY3Q6IHNyYy5wcmltYXJ5X2NvbnRhY3QgPz8gbnVsbCxcbiAgICAgICAgYW1vdW50OiBzcmMuYW1vdW50ID8/IDEsXG4gICAgICAgIHN0YWdlOiAncHJvc3BlY3RpbmcnLFxuICAgICAgICBwcm9iYWJpbGl0eTogMTAsXG4gICAgICAgIGNsb3NlX2RhdGU6IGhvcml6b24udG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCksXG4gICAgICAgIHR5cGU6IHNyYy50eXBlID8/IG51bGwsXG4gICAgICAgIGxlYWRfc291cmNlOiBzcmMubGVhZF9zb3VyY2UgPz8gbnVsbCxcbiAgICAgICAgY3JtX2NhbXBhaWduOiBzcmMuY3JtX2NhbXBhaWduID8/IG51bGwsXG4gICAgICAgIC8vIEV4cGxpY2l0IGJlY2F1c2UgYW4gYWN0aW9uIGJvZHkgcnVucyBcXGBpc1N5c3RlbVxcYCwgc28gbm90aGluZyBzdGFtcHNcbiAgICAgICAgLy8gXFxgb3duZXJfaWRcXGAgZm9yIGl0IFx1MjAxNCBzZWUgdGhlIG5vdGUgaW4gYWN0aXZpdHktYWN0aW9ucy50cyAoIzU0OCkuXG4gICAgICAgIG93bmVyX2lkOiBjdHgudXNlcj8uaWQgPz8gbnVsbCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgaWQ6IGluc2VydGVkPy5pZCA/PyBudWxsIH07XG4gICAgYCxcbiAgICBjYXBhYmlsaXRpZXM6IFsnYXBpLnJlYWQnLCAnYXBpLndyaXRlJ10sXG4gICAgdGltZW91dE1zOiA1MDAwLFxuICB9LFxuICBsb2NhdGlvbnM6IFsncmVjb3JkX2hlYWRlcicsICdyZWNvcmRfbW9yZSddLFxuICBzdWNjZXNzTWVzc2FnZTogJ09wcG9ydHVuaXR5IGNsb25lZCBzdWNjZXNzZnVsbHkhJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcblxuLyoqXG4gKiBNYXNzIFVwZGF0ZSBPcHBvcnR1bml0eSBTdGFnZS5cbiAqXG4gKiBCb3RoIGludm9jYXRpb24gaGFsdmVzIHdvcms6XG4gKlxuICogICAtIFNJTkdMRSByZWNvcmQgKHJvdyBzZWxlY3Rpb24gLyB0b29sYmFyIHdpdGggb25lIHJvdyk6IHRoZSBjb25zb2xlIFBPU1RzXG4gKiAgICAgYHsgcmVjb3JkSWQsIHBhcmFtczogeyBzdGFnZSB9IH1gIGFuZCB0aGUgYm9keSByZWFkcyBgY3R4LnJlY29yZElkYC5cbiAqICAgLSBNVUxUSSByZWNvcmQ6IHRoZSBzZWxlY3Rpb24gYXJyaXZlcyBpbiB0aGUgQlVJTFQtSU4gYF9zZWxlY3RlZElkc2BcbiAqICAgICBwYXJhbSBcdTIwMTQgbGVhZGluZyB1bmRlcnNjb3JlIFx1MjAxNCBpbmplY3RlZCBieSB0aGUgZ3JpZCByZW5kZXJlciBmb3IgdGhlXG4gKiAgICAgdmlldydzIGBidWxrQWN0aW9uRGVmc2AgZW50cnkgd2l0aCBgZXhlY3V0aW9uOiAnYWdncmVnYXRlJ2AsIHdoaWNoXG4gKiAgICAgZGlzcGF0Y2hlcyB0aGlzIGFjdGlvbiBPTkNFIGZvciB0aGUgd2hvbGUgc2VsZWN0aW9uIChubyBgcmVjb3JkSWRgKS5cbiAqXG4gKiBUaGF0IHVuZGVyc2NvcmUgaXMgdGhlIHdob2xlIG9mIHRoZSBjb250cmFjdC4gQSBzY3JpcHQgYm9keSdzIGBpbnB1dGAgSVMgdGhlXG4gKiBhY3Rpb24ncyBwYXJhbXMgYmFnIChgQG9iamVjdHN0YWNrL3J1bnRpbWVgIGBzYW5kYm94L2JvZHktcnVubmVyLnRzOjMzOGApLCBhbmRcbiAqIGBfc2VsZWN0ZWRJZHNgIGlzIG9uZSBvZiB0aGUgcGFyYW1zIGdhdGUncyBidWlsdGluIGtleXMgKGBAb2JqZWN0c3RhY2svc3BlY2BcbiAqIGB1aS9hY3Rpb24tcGFyYW1zLnpvZC50czo3MGAsIGFsb25nc2lkZSBgcmVjb3JkSWRgIC8gYG9iamVjdE5hbWVgKS4gRXZlcnlcbiAqIG90aGVyIHNoYXBlIGlzIHVuZGVjbGFyZWQgYW5kIGNhbm5vdCBhcnJpdmU6IGEgdG9wLWxldmVsIGBzZWxlY3RlZElkc2AgaXNcbiAqIG5ldmVyIG1lcmdlZCBpbnRvIHRoZSBiYWcsIGFuZCBhIGBwYXJhbXMuc2VsZWN0ZWRJZHNgIHdpdGhvdXQgdGhlIHVuZGVyc2NvcmVcbiAqIGlzIHJlZnVzZWQgYnkgdGhlIHN0cmljdCBwYXJhbXMgZ2F0ZSAoQURSLTAxMDQpLiBUaGUgY29uc29sZSdzIG93biBcInNlbGVjdFxuICogZXhhY3RseSBvbmUgcm93XCIgdG9hc3QgZmlyZXMgcHJlY2lzZWx5IHdoZW4gYF9zZWxlY3RlZElkc2Agd2FzIE5PVCBpbmplY3RlZCxcbiAqIHdoaWNoIGlzIHdoYXQgaGFwcGVucyB0byBhIHZpZXcgY2Fycnlpbmcgbm8gYnVsayBkZWNsYXJhdGlvbiBhdCBhbGwgXHUyMDE0IHJlYWRcbiAqIHRoYXQgdG9hc3QgYXMgYSBtaXNzaW5nIGRlY2xhcmF0aW9uIG9uIHRoZSB2aWV3LCBuZXZlciBhcyBhIHBsYXRmb3JtIGxpbWl0LlxuICpcbiAqIFx1MjZENCBEbyBOT1QgZGVjbGFyZSBgX3NlbGVjdGVkSWRzYCBpbiBgcGFyYW1zYCBiZWxvdzogYnVpbHRpbiBrZXlzIGFyZSBpbmplY3RlZFxuICogYnkgdGhlIHJlbmRlcmVyLCBhbmQgdGhlIGdhdGUgYWRtaXRzIHRoZW0gd2l0aG91dCBhIGRlY2xhcmF0aW9uIChkZWNsYXJpbmcgb25lXG4gKiBpcyBub3QgYSBzdXBwb3J0ZWQgYXV0aG9yaW5nIG1vdmUpLiBcdTI2RDQgRG8gTk9UIHJlLWFkZCBhIG5vLXVuZGVyc2NvcmVcbiAqIGBpbnB1dC5zZWxlY3RlZElkc2AgcmVhZCBlaXRoZXIgXHUyMDE0IG5vdGhpbmcgY2FuIGRlbGl2ZXIgdGhhdCBrZXksIHNvIGl0IHdvdWxkXG4gKiBiZSBhIGxpbWIgdGhhdCBvbmx5IGV2ZXIgcmVhZHMgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBjb25zdCBNYXNzVXBkYXRlU3RhZ2VBY3Rpb246IEFjdGlvbiA9IHtcbiAgbmFtZTogJ21hc3NfdXBkYXRlX3N0YWdlJyxcbiAgbGFiZWw6ICdVcGRhdGUgU3RhZ2UnLFxuICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgaWNvbjogJ2xheWVycycsXG4gIHR5cGU6ICdzY3JpcHQnLFxuICBib2R5OiB7XG4gICAgbGFuZ3VhZ2U6ICdqcycsXG4gICAgc291cmNlOiBgXG4gICAgICBjb25zdCBuZXdTdGFnZSA9IGlucHV0LnN0YWdlID8/IG51bGw7XG4gICAgICBpZiAoIW5ld1N0YWdlKSB0aHJvdyBuZXcgRXJyb3IoJ21hc3NfdXBkYXRlX3N0YWdlIHJlcXVpcmVzIGEgc3RhZ2UnKTtcbiAgICAgIC8vIFNlbGVjdGlvbiBmaXJzdCwgc2luZ2xlIHJlY29yZCBhcyB0aGUgZmFsbGJhY2suIEFuIGFnZ3JlZ2F0ZSBkaXNwYXRjaFxuICAgICAgLy8gY2FycmllcyB0aGUgd2hvbGUgc2VsZWN0aW9uIGluIFxcYF9zZWxlY3RlZElkc1xcYCBhbmQgTk8gcmVjb3JkSWQ7IGFcbiAgICAgIC8vIHNpbmdsZS1yZWNvcmQgZGlzcGF0Y2ggY2FycmllcyByZWNvcmRJZCBhbmQgbm8gc2VsZWN0aW9uLiBUaGUgdHdvIGFyZVxuICAgICAgLy8gbmV2ZXIgYm90aCBwcmVzZW50LCBzbyB0aGUgb3JkZXIgb25seSBkZWNpZGVzIHdoaWNoIHNoYXBlIHdpbnMgaWYgdGhlXG4gICAgICAvLyBwbGF0Zm9ybSBldmVyIHNlbmRzIGJvdGguXG4gICAgICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmlzQXJyYXkoaW5wdXQuX3NlbGVjdGVkSWRzKSA/IGlucHV0Ll9zZWxlY3RlZElkcyA6IFtdO1xuICAgICAgY29uc3QgaWRzID0gc2VsZWN0ZWQubGVuZ3RoID8gc2VsZWN0ZWQgOiAoY3R4LnJlY29yZElkID8gW2N0eC5yZWNvcmRJZF0gOiBbXSk7XG4gICAgICBpZiAoIWlkcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignbWFzc191cGRhdGVfc3RhZ2U6IG5vIG9wcG9ydHVuaXR5IHNlbGVjdGVkJyk7XG4gICAgICBjb25zdCBtaXNzZWQgPSBbXTtcbiAgICAgIGxldCBmaXJzdENhdXNlID0gJyc7XG4gICAgICBsZXQgdXBkYXRlZCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgICAvLyBcXGB1cGRhdGUoZGF0YSwgb3B0aW9ucylcXGAgXHUyMDE0IFxcYGN0eC5hcGlcXGAgaXMgdGhlIGVuZ2luZSByZXBvIGZhY2FkZSwgd2hvc2VcbiAgICAgICAgLy8gdXBkYXRlIHRha2VzIGEgRE9DVU1FTlQsIG5vdCBhbiBpZC4gXFxgdXBkYXRlQnlJZChpZCwgZGF0YSlcXGAgZXhpc3RzIG9uXG4gICAgICAgIC8vIE9iamVjdFJlcG9zaXRvcnkgYnV0IE5PVCBvbiB0aGUgZmFjYWRlIHRoZSBydW50aW1lIGJ1aWxkcyB3aGVuIGl0IGhhc1xuICAgICAgICAvLyBubyBzY29wZWQgY29udGV4dCwgc28gdGhpcyBzcGVsbGluZyBpcyB0aGUgb25seSBvbmUgbGl2ZSBvbiBib3RoLlxuICAgICAgICAvL1xuICAgICAgICAvLyBBbiBpZCB0aGF0IG1hdGNoZXMgbm8gcm93IGlzIGEgTUlTUywgbm90IGFuIGFib3J0LCBhbmQgdGhlIGVuZ2luZSBoYXNcbiAgICAgICAgLy8gYW5zd2VyZWQgaXQgYm90aCB3YXlzOiB0aHJvdWdoIEBvYmplY3RzdGFjay8qIDE3LjAuMC1yYy42IFxcYHVwZGF0ZVxcYFxuICAgICAgICAvLyBSRVNPTFZFRCBXSVRIIE5VTEwsIGFuZCBmcm9tIDE3LjAuMCBpdCBSRUpFQ1RTIChSRUNPUkRfTk9UX0ZPVU5EIC9cbiAgICAgICAgLy8gNDA0KS4gQm90aCBhcmUgaGFuZGxlZCBoZXJlLCBhbmQgbmVpdGhlciBtYXkgZW5kIHRoZSBsb29wIFx1MjAxNCBhblxuICAgICAgICAvLyB1bmNhdWdodCByZWplY3Rpb24gb24gdGhlIGZpcnN0IHN0YWxlIGlkIHdvdWxkIGxlYXZlIGV2ZXJ5IGlkIGFmdGVyXG4gICAgICAgIC8vIGl0IHVuYXR0ZW1wdGVkLCBzbyByZS1ydW5uaW5nIHRoZSBhY3Rpb24gb3ZlciB0aGUgc2FtZSBzZWxlY3Rpb25cbiAgICAgICAgLy8gd291bGQgZmFpbCBhdCB0aGUgc2FtZSByb3cgZm9yZXZlciBhbmQgdGhlIGxpdmUgcm93cyBiZWhpbmQgaXQgY291bGRcbiAgICAgICAgLy8gbmV2ZXIgYmUgY292ZXJlZC4gVGhhdCBpcyBzdHJpY3RseSB3b3JzZSB0aGFuIHRoZSBzaWxlbnQtc3VjY2Vzc1xuICAgICAgICAvLyBmYWlsdXJlICM1ODggcHVsbGVkIHRoaXMgYnV0dG9uIGZvciwgYmVjYXVzZSBpdCBpcyB1bnJlY292ZXJhYmxlXG4gICAgICAgIC8vIGZyb20gdGhlIFVJLiBDb2xsZWN0IHRoZSBtaXNzLCBrZWVwIGdvaW5nLCByZWplY3Qgb25jZSBhdCB0aGUgZW5kLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGUgY2F0Y2ggaXMgZGVsaWJlcmF0ZWx5IGNhdXNlLUFHTk9TVElDIFx1MjAxNCBidXQgTk9UIGJlY2F1c2UgdGhlIGNhdXNlXG4gICAgICAgIC8vIGlzIGludmlzaWJsZS4gUmVhZCBvbiAxNy40LjAgKFxcYGhvc3RFcnJvclRvVm1cXGA7IG5vdCByZS1yZWFkIG9uIDE3LjUuMCksIGEgaG9zdFxuICAgICAgICAvLyByZWplY3Rpb24gcmVhY2hlcyBhIGJvZHkgYXMgXFxgbmFtZVxcYCBhbmQgXFxgbWVzc2FnZVxcYCBwbHVzLCB3aGVuIHRoZSBob3N0XG4gICAgICAgIC8vIGVycm9yIGNhcnJpZXMgdGhlbSwgXFxgY29kZVxcYCwgXFxgc3RhdHVzXFxgLCBcXGBmaWVsZHNcXGAgYW5kIFxcYHVzZXJNZXNzYWdlXFxgIFx1MjAxNFxuICAgICAgICAvLyBub3RoaW5nIGVsc2UsIHNvIGEgc3RhbGUgaWQgYXJyaXZlcyBicmFuY2hhYmxlIGFzXG4gICAgICAgIC8vIFxcYGNvZGUgPT09ICdSRUNPUkRfTk9UX0ZPVU5EJ1xcYCB3aGlsZSBcXGBkZXRhaWxzXFxgIHJlYWxseSBpcyBkcm9wcGVkLiBUaGVcbiAgICAgICAgLy8gYnJhbmNoIGlzIG5vdCB0YWtlbiBiZWNhdXNlIGV2ZXJ5IGNhdXNlIGhhcyB0aGUgc2FtZSBvdXRjb21lIGhlcmUgXHUyMDE0XG4gICAgICAgIC8vIHRoZSByb3cgZGlkIG5vdCBtb3ZlLCBzbyBjb2xsZWN0IGl0IGFuZCBrZWVwIGdvaW5nIFx1MjAxNCBhbmQgbmFycm93aW5nXG4gICAgICAgIC8vIHRoZSBjYXRjaCB0byBhIHJvc3RlciBvZiBrbm93biBjb2RlcyB3b3VsZCBsZXQgYW4gdW5saXN0ZWQgY2F1c2VcbiAgICAgICAgLy8gYWJvcnQgdGhlIGxvb3AsIHRoZSBmYWlsdXJlIHRoZSBwYXJhZ3JhcGggYWJvdmUgZm9yYmlkcy4gTWVzc2FnZSB0ZXh0XG4gICAgICAgIC8vIGlzIGVuZ2luZSB3b3JkaW5nIGFuZCBub3QgY29udHJhY3QsIHNvIFxcYGZpcnN0Q2F1c2VcXGAgaXMgY2FycmllZFxuICAgICAgICAvLyB2ZXJiYXRpbSBhbmQgbmV2ZXIgcGFyc2VkLlxuICAgICAgICBsZXQgcm93ID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByb3cgPSBhd2FpdCBjdHguYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykudXBkYXRlKFxuICAgICAgICAgICAgeyBpZDogaWQsIHN0YWdlOiBuZXdTdGFnZSB9LFxuICAgICAgICAgICAgeyB3aGVyZTogeyBpZDogaWQgfSB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJvdyA9IG51bGw7XG4gICAgICAgICAgaWYgKCFmaXJzdENhdXNlKSBmaXJzdENhdXNlID0gKGVyciAmJiBlcnIubWVzc2FnZSkgPyBTdHJpbmcoZXJyLm1lc3NhZ2UpIDogU3RyaW5nKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ291bnQgb25seSB3aGF0IGNhbWUgYmFjazogY291bnRpbmcgdGhlIEFUVEVNUFQgaXMgaG93IGEgc3RhbGUgb3JcbiAgICAgICAgLy8gaW52aXNpYmxlIGlkIHR1cm5zIGludG8gYSBzdWNjZXNzIHRvYXN0IGZvciBhIHdyaXRlIHRoYXQgbmV2ZXJcbiAgICAgICAgLy8gaGFwcGVuZWQgKCM1ODgpLlxuICAgICAgICBpZiAocm93KSB7IHVwZGF0ZWQrKzsgfSBlbHNlIHsgbWlzc2VkLnB1c2goaWQpOyB9XG4gICAgICB9XG4gICAgICAvLyBBZ2dyZWdhdGUgZGlzcGF0Y2ggaXMgYWxsLW9yLW5vdGhpbmcgKG9iamVjdHVpIzMxMzkpOiBhIGhhbmRsZXIgdGhhdFxuICAgICAgLy8gY2Fubm90IGNvdmVyIHRoZSB3aG9sZSBzZWxlY3Rpb24gbXVzdCByZWplY3QgcmF0aGVyIHRoYW4gcmVwb3J0IHBhcnRpYWxcbiAgICAgIC8vIHdvcmssIGJlY2F1c2UgdGhlIGJhciBvZmZlcnMgbm8gcGVyLXJvdyByZXRyeSBcdTIwMTQgdGhlIHJldHJ5IElTIHJlLXJ1bm5pbmdcbiAgICAgIC8vIHRoZSBhY3Rpb24gb3ZlciB0aGUgc2VsZWN0aW9uLCB3aGljaCBpcyBzYWZlIGhlcmUgc2luY2Ugc2V0dGluZyBhIHN0YWdlXG4gICAgICAvLyBpcyBpZGVtcG90ZW50LiBSb3dzIGFscmVhZHkgbW92ZWQgaW4gdGhpcyBydW4ga2VlcCB0aGUgbmV3IHN0YWdlOyB0aGVcbiAgICAgIC8vIGVycm9yIG5hbWVzIHRoZSBvbmVzIHRoYXQgZGlkIG5vdCBzbyB0aGUgcmVwIGNhbiBzZWUgdGhlIGRpZmZlcmVuY2UuXG4gICAgICBpZiAobWlzc2VkLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ21hc3NfdXBkYXRlX3N0YWdlOiAnICsgbWlzc2VkLmxlbmd0aCArICcgb2YgJyArIGlkcy5sZW5ndGhcbiAgICAgICAgICArICcgc2VsZWN0ZWQgb3Bwb3J0dW5pdGllcyBjb3VsZCBub3QgYmUgdXBkYXRlZCAoJyArIG1pc3NlZC5qb2luKCcsICcpXG4gICAgICAgICAgKyAnKS4gUmUtcnVuIHRoZSBhY3Rpb24gb24gdGhlIHNlbGVjdGlvbiB0byByZXRyeS4nXG4gICAgICAgICAgKyAoZmlyc3RDYXVzZSA/ICcgRmlyc3QgY2F1c2U6ICcgKyBmaXJzdENhdXNlIDogJycpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBzdGFnZTogbmV3U3RhZ2UsIHVwZGF0ZWQgfTtcbiAgICBgLFxuICAgIGNhcGFiaWxpdGllczogWydhcGkud3JpdGUnXSxcbiAgICB0aW1lb3V0TXM6IDEwMDAwLFxuICB9LFxuICBsb2NhdGlvbnM6IFsnbGlzdF90b29sYmFyJ10sXG4gIHBhcmFtczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdzdGFnZScsXG4gICAgICBsYWJlbDogJ05ldyBTdGFnZScsXG4gICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgLy8gTWlycm9ycyBjcm1fb3Bwb3J0dW5pdHkuc3RhZ2UgZXhhY3RseSBcdTIwMTQgc2VlIF9waWNrbGlzdHMudHMuXG4gICAgICBvcHRpb25zOiBwbGFpbk9wdGlvbnMoT1BQT1JUVU5JVFlfU1RBR0VfT1BUSU9OUyksXG4gICAgfVxuICBdLFxuICBzdWNjZXNzTWVzc2FnZTogJ09wcG9ydHVuaXRpZXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkhJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIFF1b3RlIGZyb20gdGhpcyBPcHBvcnR1bml0eS5cbiAqXG4gKiBGbG93LXR5cGVkIGFjdGlvbjogbGF1bmNoZXMgdGhlIGBxdW90ZV9nZW5lcmF0aW9uYCBzY3JlZW4gZmxvdyAobmFtZSxcbiAqIHZhbGlkaXR5LCBkaXNjb3VudCkgd2hpY2ggY3JlYXRlcyB0aGUgZHJhZnQgY3JtX3F1b3RlIGFuZCBtb3ZlcyB0aGUgZGVhbFxuICogdG8gYHByb3Bvc2FsYC4gV2l0aG91dCB0aGlzIGFjdGlvbiB0aGUgZmxvdyB3YXMgdW5yZWFjaGFibGUgZnJvbSB0aGUgVUkgXHUyMDE0XG4gKiB0aGUgQ1BRIGxlZyAob3Bwb3J0dW5pdHkgXHUyMTkyIHF1b3RlKSBoYWQgbm8gZW50cnkgcG9pbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBHZW5lcmF0ZVF1b3RlQWN0aW9uOiBBY3Rpb24gPSB7XG4gIG5hbWU6ICdnZW5lcmF0ZV9xdW90ZScsXG4gIGxhYmVsOiAnR2VuZXJhdGUgUXVvdGUnLFxuICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgaWNvbjogJ3JlY2VpcHQnLFxuICB0eXBlOiAnZmxvdycsXG4gIHRhcmdldDogJ3F1b3RlX2dlbmVyYXRpb24nLFxuICAvLyBNaXJyb3IgY2xvbmVfb3Bwb3J0dW5pdHkncyBwbGFjZW1lbnQgKGhlYWRlciArIG92ZXJmbG93IG1lbnUpIHNvIHRoZSBhY3Rpb25cbiAgLy8gaXMgcmVhY2hhYmxlIGJvdGggYXMgYSBwcmltYXJ5IGJ1dHRvbiBhbmQgZnJvbSB0aGUgXCJcdTIwMjZcIiBtZW51IG9uIG5hcnJvd1xuICAvLyB2aWV3cG9ydHMgd2hlcmUgdGhlIGhlYWRlciBjb2xsYXBzZXMuXG4gIGxvY2F0aW9uczogWydyZWNvcmRfaGVhZGVyJywgJ3JlY29yZF9tb3JlJywgJ2xpc3RfaXRlbSddLFxuICB2aXNpYmxlOiBQYGhhcyhyZWNvcmQuc3RhZ2UpICYmIHJlY29yZC5zdGFnZSAhPSBcImNsb3NlZF93b25cIiAmJiByZWNvcmQuc3RhZ2UgIT0gXCJjbG9zZWRfbG9zdFwiYCxcbiAgc3VjY2Vzc01lc3NhZ2U6ICdRdW90ZSBjcmVhdGVkIGZyb20gb3Bwb3J0dW5pdHkhJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9hY3Rpb25zL2luZGV4LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9hY3Rpb25zXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9hY3Rpb25zL2luZGV4LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIE1hcmtldGluZyBhY3Rpb24gYmFycmVsLlxuICpcbiAqIFRoZSBkb2N0cmluZSBmb3IgdGhpcyBtZXRhZGF0YSB0eXBlIGlzIHdyaXR0ZW4gb25jZSwgaW5cbiAqIGBzcmMvc2FsZXMvYWN0aW9ucy9pbmRleC50c2A7IHRoaXMgZmlsZSBpcyB0aGUgbWFya2V0aW5nIHBhY2thZ2UncyBoYWxmIG9mXG4gKiB0aGUgc2FtZSBmaWxlLWJ5LWZpbGUgcmVnaXN0cmF0aW9uLlxuICovXG5leHBvcnQgeyBFbnJvbGxMZWFkc0FjdGlvbiwgTWFya1Jlc3BvbmRlZEFjdGlvbiB9IGZyb20gJy4vY2FtcGFpZ24uYWN0aW9ucyc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvYWN0aW9ucy9jYW1wYWlnbi5hY3Rpb25zLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9hY3Rpb25zXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9hY3Rpb25zL2NhbXBhaWduLmFjdGlvbnMudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgQWN0aW9uIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuaW1wb3J0IHsgUCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcblxuLyoqXG4gKiBFbnJvbGwgbGVhZHMgb3IgY29udGFjdHMgaW50byB0aGlzIGNhbXBhaWduLlxuICpcbiAqIEZsb3ctdHlwZWQgYWN0aW9uOiBsYXVuY2hlcyB0aGUgYGNhbXBhaWduX2Vucm9sbG1lbnRgIHNjcmVlbiBmbG93IChwaWNrIHRoZVxuICogbWVtYmVyIHNpZGUgYW5kIGl0cyBzZWdtZW50LCBlbnJvbGwgZXZlcnlvbmUgZWxpZ2libGUpLiBUaGlzIGFjdGlvbiBpcyB0aGVcbiAqIGZsb3cncyBlbnRyeSBwb2ludCwgZm9sbG93aW5nIHRoZSBwcm92ZW4gYGNvbnZlcnRfbGVhZGAgLyBgZ2VuZXJhdGVfcXVvdGVgXG4gKiBwYXR0ZXJuIFx1MjAxNCB0aGUgY29uc29sZSdzIGZsb3ctYWN0aW9uIHRyaWdnZXIgc2VuZHMgYHsgcmVjb3JkSWQsIG9iamVjdE5hbWUgfWAuXG4gKlxuICogXHUyNkQ0IE5ldmVyIHJlbmFtZSBgZW5yb2xsX2xlYWRzYCB0byBtYXRjaCB0aGUgXCJFbnJvbGwgTWVtYmVyc1wiIGxhYmVsLiBBbiBhY3Rpb25cbiAqIG5hbWUgaXMgYSBkaXNwYXRjaCBpZGVudGlmaWVyIHRoYXQgdmlld3MsIGRvY3MgYW5kIHRoZSBhdWRpdCB0cmFpbCByZWZlcmVuY2VcbiAqIGJ5IHN0cmluZzsgdGhlIGxhYmVsIGFscmVhZHkgY2FycmllcyB0aGUgd29yZCBjb3JyZWN0bHkuXG4gKi9cbmV4cG9ydCBjb25zdCBFbnJvbGxMZWFkc0FjdGlvbjogQWN0aW9uID0ge1xuICBuYW1lOiAnZW5yb2xsX2xlYWRzJyxcbiAgbGFiZWw6ICdFbnJvbGwgTWVtYmVycycsXG4gIG9iamVjdE5hbWU6ICdjcm1fY2FtcGFpZ24nLFxuICBpY29uOiAndXNlci1wbHVzJyxcbiAgdHlwZTogJ2Zsb3cnLFxuICB0YXJnZXQ6ICdjYW1wYWlnbl9lbnJvbGxtZW50JyxcbiAgbG9jYXRpb25zOiBbJ3JlY29yZF9oZWFkZXInLCAncmVjb3JkX21vcmUnXSxcbiAgLy8gRW5yb2xsbWVudCBvbmx5IG1ha2VzIHNlbnNlIHdoaWxlIHRoZSBjYW1wYWlnbiBpcyBvcGVuIFx1MjAxNCB0aGUgZmxvd1xuICAvLyBkb3VibGUtY2hlY2tzIHRoaXMgc2VydmVyLXNpZGUuXG4gIHZpc2libGU6IFBgaGFzKHJlY29yZC5zdGF0dXMpICYmIChyZWNvcmQuc3RhdHVzID09IFwicGxhbm5pbmdcIiB8fCByZWNvcmQuc3RhdHVzID09IFwiaW5fcHJvZ3Jlc3NcIilgLFxuICBzdWNjZXNzTWVzc2FnZTogJ0VsaWdpYmxlIG1lbWJlcnMgZW5yb2xsZWQgaW4gY2FtcGFpZ24uJyxcbiAgcmVmcmVzaEFmdGVyOiB0cnVlLFxufTtcblxuLyoqXG4gKiBNYXJrIGEgY2FtcGFpZ24gbWVtYmVyIGFzIGhhdmluZyByZXNwb25kZWQuXG4gKlxuICogVGhlIHdyaXRlciBmb3IgdGhlIGByZXNwb25kZWRgIHN0YXR1cywgb24gdGhlIG1lbWJlciByb3cgcmF0aGVyIHRoYW4gb24gdGhlXG4gKiBjYW1wYWlnbjogYSByZXAgaGVhcnMgYmFjayBmcm9tIG9uZSBwZXJzb24sIGFuZCBvbmUgbWVtYmVyc2hpcCBjaGFuZ2VzLlxuICogYG51bV9yZXNwb25zZXNgIGFuZCBgcmVzcG9uc2VfcmF0ZWAgYXJlIGNvbXB1dGVkIG9mZiB0aGF0IHN0YXR1cywgc28gYW4gYXBwXG4gKiB3aXRoIG5vIHdyaXRlciBmb3IgaXQgcmVwb3J0cyBhIHN0cnVjdHVyYWwgemVybyBvbiBldmVyeSBjYW1wYWlnbi5cbiAqXG4gKiBUaGUgYm9keSBzdGFtcHMgYWxsIHRocmVlIHJlc3BvbnNlIGZpZWxkcyB0b2dldGhlciwgcmF0aGVyIHRoYW4gcmVseWluZyBvblxuICogYGNhbXBhaWduX21lbWJlcl9saWZlY3ljbGVgIHRvIGJhY2stZmlsbCB0d28gb2YgdGhlbS4gQm90aCBwYXRocyBhcmVcbiAqIGV4ZXJjaXNlZCAoYSByZXAgY2FuIGFsc28gZmxpcCBgc3RhdHVzYCBvbiB0aGUgcmVjb3JkIGl0c2VsZiwgd2hpY2ggdGhlIGhvb2tcbiAqIGNhdGNoZXMpIGJ1dCBhbiBhY3Rpb24gdGhhdCB3cml0ZXMgYSBzdGF0dXMgYW5kIGxlYXZlcyB0aGUgcmVjb3JkIGludGVybmFsbHlcbiAqIGluY29uc2lzdGVudCBmb3IgdGhlIGxlbmd0aCBvZiBhIGhvb2sgZGlzcGF0Y2ggaXMgYSBzaGFwZSB0aGUgZGV0YWlsIHBhZ2UgY2FuXG4gKiByZW5kZXIgbWlkLWZsaWdodCwgYW5kIHRoaXMgb25lIGlzIGNoZWFwIHRvIGdldCByaWdodCBhdCB0aGUgc291cmNlLlxuICpcbiAqIGByZWNvcmRfaGVhZGVyYCArIGBsaXN0X2l0ZW1gOiBgY3JtX2NhbXBhaWduX21lbWJlcmAgc2hpcHMgbm8gdmlldyBvZiBpdHNcbiAqIG93biBcdTIwMTQgaXRzIHJvd3MgYXJlIHN1cmZhY2VkIGJ5IHRoZSBtZW1iZXJzIHJlbGF0ZWQgbGlzdCBvbiBhIGNhbXBhaWduJ3NcbiAqIGRldGFpbCBwYWdlIChjb2x1bW5zIGNvbWUgZnJvbSBgaGlnaGxpZ2h0RmllbGRzYCksIGFuZCBgbGlzdF9pdGVtYCBpcyB0aGVcbiAqIHBlci1yb3cgZW50cnkgcG9pbnQgdGhlcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBNYXJrUmVzcG9uZGVkQWN0aW9uOiBBY3Rpb24gPSB7XG4gIG5hbWU6ICdtYXJrX3Jlc3BvbmRlZCcsXG4gIGxhYmVsOiAnTWFyayBSZXNwb25kZWQnLFxuICBvYmplY3ROYW1lOiAnY3JtX2NhbXBhaWduX21lbWJlcicsXG4gIGljb246ICdyZXBseScsXG4gIC8vIHNjcmlwdCwgbm90IG1vZGFsIFx1MjAxNCBhIGB0eXBlOiAnbW9kYWwnYCBhY3Rpb24gaGFzIG5vIHNlcnZlciBkaXNwYXRjaCBhdCBhbGxcbiAgLy8gYW5kIGl0cyBib2R5IG5ldmVyIHJ1bnMgKHNlZSBgY3JlYXRlX2NhbXBhaWduYCdzIG5vdGUgaW4gbGVhZC5hY3Rpb25zLnRzKS5cbiAgdHlwZTogJ3NjcmlwdCcsXG4gIGJvZHk6IHtcbiAgICBsYW5ndWFnZTogJ2pzJyxcbiAgICBzb3VyY2U6IGBcbiAgICAgIGNvbnN0IGlkID0gY3R4LnJlY29yZElkO1xuICAgICAgaWYgKCFpZCkgdGhyb3cgbmV3IEVycm9yKCdtYXJrX3Jlc3BvbmRlZCByZXF1aXJlcyBhIHJlY29yZElkJyk7XG4gICAgICBjb25zdCByZXNwb25kZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgIGF3YWl0IGN0eC5hcGkub2JqZWN0KCdjcm1fY2FtcGFpZ25fbWVtYmVyJykudXBkYXRlKFxuICAgICAgICB7IGlkLCBzdGF0dXM6ICdyZXNwb25kZWQnLCBoYXNfcmVzcG9uZGVkOiB0cnVlLCByZXNwb25zZV9kYXRlOiByZXNwb25kZWRBdCB9LFxuICAgICAgICB7IHdoZXJlOiB7IGlkIH0gfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyBpZCwgc3RhdHVzOiAncmVzcG9uZGVkJywgcmVzcG9uc2VfZGF0ZTogcmVzcG9uZGVkQXQgfTtcbiAgICBgLFxuICAgIGNhcGFiaWxpdGllczogWydhcGkud3JpdGUnXSxcbiAgICB0aW1lb3V0TXM6IDUwMDAsXG4gIH0sXG4gIGxvY2F0aW9uczogWydyZWNvcmRfaGVhZGVyJywgJ2xpc3RfaXRlbSddLFxuICAvLyBBbHJlYWR5LXJlc3BvbmRlZCBhbmQgY29udmVydGVkIG1lbWJlcnMgaGF2ZSBub3RoaW5nIHRvIHJlY29yZDsgYW5cbiAgLy8gdW5zdWJzY3JpYmVkIG1lbWJlciBtdXN0IG5vdCBiZSBkcmFnZ2VkIGJhY2sgaW50byB0aGUgZnVubmVsIGJ5IGFcbiAgLy8gbWlzLWNsaWNrIChgY2FtcGFpZ25fbWVtYmVyX29wdG91dF9zeW5jYCBoYXMgYWxyZWFkeSBvcHRlZCB0aGF0IHBlcnNvbiBvdXRcbiAgLy8gb2YgZW1haWwsIGFuZCB0aGlzIGFjdGlvbiB3b3VsZCBub3QgdW5kbyB0aGF0IFx1MjAxNCBsZWF2aW5nIHRoZSB0d28gcmVjb3Jkc1xuICAvLyBkaXNhZ3JlZWluZyBhYm91dCB0aGUgc2FtZSBwZXJzb24pLlxuICB2aXNpYmxlOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwic2VudFwiYCxcbiAgc3VjY2Vzc01lc3NhZ2U6ICdSZXNwb25zZSByZWNvcmRlZCBvbiB0aGlzIGNhbXBhaWduIG1lbWJlci4nLFxuICByZWZyZXNoQWZ0ZXI6IHRydWUsXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGFzaGJvYXJkcy9pbmRleC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXNoYm9hcmRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Rhc2hib2FyZHMvaW5kZXgudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogRGFzaGJvYXJkIERlZmluaXRpb25zIEJhcnJlbFxuICpcbiAqICMjIFR3byBpMThuIHN1cmZhY2VzIG9uIGEgZGFzaGJvYXJkLCBhbmQgb25seSBvbmUgb2YgdGhlbSByZXNvbHZlcyAoIzE4MjIpXG4gKlxuICogYEBvYmplY3RzdGFjay9zcGVjYCB0eXBlcyBCT1RIIGBHbG9iYWxGaWx0ZXJTY2hlbWEubGFiZWxgIGFuZFxuICogYENoYXJ0QXhpc1NjaGVtYS50aXRsZWAgYXMgYEkxOG5MYWJlbFNjaGVtYWAgXHUyMDE0IGB6LnVuaW9uKFt6LnN0cmluZygpLFxuICogSW5saW5lTG9jYWxlTWFwU2NoZW1hXSlgIFx1MjAxNCBzbyBib3RoIGFjY2VwdCBgeyBlbiwgJ3poLUNOJywgXHUyMDI2IH1gLiBPbmx5IHRoZVxuICogZmlsdGVyIGhhbGYgaXMgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgdmlld2VyJ3MgbG9jYWxlLiBNZWFzdXJlZCBvblxuICogYEBvYmplY3RzdGFjay9jb25zb2xlQDE3LjQuMGAsIGRyaXZpbmcgdGhlIHJlYWwgQ29uc29sZSBpbiBDaHJvbWl1bSwgbm90XG4gKiByZWFkIG9mZiBhIGRvY2Jsb2NrOlxuICpcbiAqICAgLSBGSUxURVIgYGxhYmVsYCBhbmQgc3RhdGljIG9wdGlvbiBgbGFiZWxgIFx1MjE5MiBsb2NhbGUtYXdhcmUuIFRoZSByZW5kZXJlclxuICogICAgIGNhbGxzIHRoZSBpbmxpbmUtbWFwIHJlc29sdmVyIHdpdGggdGhlIGFjdGl2ZSBsYW5ndWFnZSwgc28gYHpoLUNOYFxuICogICAgIHJlbmRlcnMgdGhlIGB6aC1DTmAgdmFsdWUgYW5kIGBqYS1KUGAgdGhlIGBqYS1KUGAgb25lLiBUaGlzIGlzIHRoZVxuICogICAgIHNwZWxsaW5nIGV2ZXJ5IGBnbG9iYWxGaWx0ZXJzW11gIGVudHJ5IGluIHRoaXMgZm9sZGVyIHVzZXMuXG4gKiAgIC0gQVhJUyBgdGl0bGVgIFx1MjE5MiBOT1QgbG9jYWxlLWF3YXJlIG9uIDE3LjQuMCAodGhlIGF4aXMgbm9ybWFsaXNlciB0b29rIHRoZVxuICogICAgIG1hcCdzIEZJUlNUIHZhbHVlLCB3aGF0ZXZlciB0aGUgdmlld2VyJ3MgbG9jYWxlKS4gU2luY2VcbiAqICAgICBgQG9iamVjdHN0YWNrL3NwZWNAMTcuNS4wYCB0aGUgcXVlc3Rpb24gbm8gbG9uZ2VyIGFyaXNlcyBmb3IgdGhpc1xuICogICAgIGZvbGRlcjogYSBkYXRhc2V0LWJvdW5kIHdpZGdldCdzIGBjaGFydENvbmZpZ2AgcmVmdXNlcyBgdHlwZWAsIGB4QXhpc2AsXG4gKiAgICAgYHlBeGlzYCBhbmQgYHNlcmllc2AgKEFEUi0wMDIxIFx1MDBCNyBBRFItMDA0OSBEMikgXHUyMDE0IHRoZSB3aWRnZXQncyBgdHlwZWAsXG4gKiAgICAgYGRpbWVuc2lvbnNgIGFuZCBgdmFsdWVzYCBhcmUgdGhlIG9ubHkgYmluZGluZyBcdTIwMTQgc28gbm8gd2lkZ2V0IGhlcmVcbiAqICAgICBjYXJyaWVzIGFuIGF4aXMgdGl0bGUgYW55IG1vcmUuXG4gKlxuICogXHUyNkEwXHVGRTBGIGBHbG9iYWxGaWx0ZXJTY2hlbWEub2JqZWN0YCBcdTIwMTQgZG9jdW1lbnRlZCB1cHN0cmVhbSBhcyByZXNvbHZpbmcgYVxuICogZmlsdGVyJ3MgZmllbGQgYW5kIG9wdGlvbiBsYWJlbHMgdGhyb3VnaCBgZmllbGRzLjxvYmplY3Q+LjxmaWVsZD5gIFx1MjAxNCBpc1xuICogSU5FUlQgaW4gdGhpcyBDb25zb2xlIGJ1aWxkLiBNZWFzdXJlZDogYSBmaWx0ZXIgY2FycnlpbmcgYG9iamVjdGAgYW5kIG5vXG4gKiBgbGFiZWxgIHJlbmRlcmVkIHRoZSByYXcgZmllbGQgbmFtZSAoYHR5cGVgLCBub3QgXHU3QzdCXHU1NzhCKSBhbmQgbGVmdCBpdHMgb3B0aW9uXG4gKiBsYWJlbHMgRW5nbGlzaC4gVGhlIGRlZmluaXRpb24gYnVpbGRlciBuZXZlciBjb3BpZXMgYG9iamVjdGAgb3V0IG9mIHRoZVxuICogYXV0aG9yZWQgZmlsdGVyLiBcdTI2RDQgRG8gbm90IHJlYWNoIGZvciBpdCBpbnN0ZWFkIG9mIGFuIGlubGluZSBtYXAuXG4gKi9cblxuZXhwb3J0IHsgQWN0aXZpdHlEYXNoYm9hcmQgfSBmcm9tICcuL2FjdGl2aXR5LmRhc2hib2FyZCc7XG5leHBvcnQgeyBDcm1PdmVydmlld0Rhc2hib2FyZCB9IGZyb20gJy4vY3JtLmRhc2hib2FyZCc7XG5leHBvcnQgeyBFeGVjdXRpdmVEYXNoYm9hcmQgfSBmcm9tICcuL2V4ZWN1dGl2ZS5kYXNoYm9hcmQnO1xuZXhwb3J0IHsgU2FsZXNEYXNoYm9hcmQgfSBmcm9tICcuL3NhbGVzLmRhc2hib2FyZCc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXNoYm9hcmRzL2FjdGl2aXR5LmRhc2hib2FyZC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXNoYm9hcmRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Rhc2hib2FyZHMvYWN0aXZpdHkuZGFzaGJvYXJkLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IERhc2hib2FyZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBTYWxlcyBBY3Rpdml0eSAmIEN1c3RvbWVyIEhlYWx0aCBEYXNoYm9hcmQgKCM1OTIpLlxuICpcbiAqIFRoZSBhcHAgaGFkICoqbm8gYWN0aXZpdHkgbWV0cmljIG9mIGFueSBraW5kKio6IGNhbGxzIHBlciByZXAsIG1lZXRpbmdzXG4gKiBib29rZWQgYW5kIGFjdGl2aXR5IHBlciBkZWFsIHdlcmUgdW5hbnN3ZXJhYmxlIGJlY2F1c2UgdGhlIG9ubHkgdHJhY2Ugb2YgYW5cbiAqIGludGVyYWN0aW9uIHdhcyBhIGBzeXNfYWN0aXZpdHlgIHJvdyB3aXRoIHRoZSBpbnRlcmVzdGluZyBwYXJ0IGluc2lkZSBhIEpTT05cbiAqIHN0cmluZywgYW5kIGB0YXNrX21ldHJpY3NgIGhhZCBzaGlwcGVkIHdpdGggbm8gd2lkZ2V0IHVzaW5nIGl0IGF0IGFsbC4gVGhpc1xuICogZGFzaGJvYXJkIGlzIHdoYXQgYGNybV9ldmVudGAgbWFrZXMgcG9zc2libGUsIGFuZCBpdCBpcyB3aGVyZSB0aGUgY2h1cm4gc3RvcnlcbiAqIGZpbmFsbHkgaGFzIG51bWJlcnMgYmVoaW5kIGl0LlxuICpcbiAqICMgTm8gYGRhdGVSYW5nZWAsIGRlbGliZXJhdGVseSBcdTIwMTQgYSBkZXNpZ24gY2hvaWNlLCBub3QgYSBibG9ja2VkIG9uZVxuICpcbiAqIGBjcm1fZXZlbnQuc3RhcnRfZGF0ZXRpbWVgIGlzIGEgYEZpZWxkLmRhdGV0aW1lKClgLCB0aGUgZXhhY3QgY29sdW1uIHNoYXBlXG4gKiB0aGF0IG9uY2UgemVyb2VkIHRoZSBTZXJ2aWNlIGRhc2hib2FyZCAoIzQ2MCk6IGBkcml2ZXItc3FsYCAxNi4xLjAgY29lcmNlZCBhXG4gKiBkYXRldGltZSBmaWx0ZXIgYm91bmQgdG8gZXBvY2gtbWlsbGlzZWNvbmQgSU5URUdFUiB3aGlsZSBldmVyeSBkYXRldGltZSBpblxuICogdGhlIGRhdGFiYXNlIGlzIElTTyBURVhULCBhbmQgU1FMaXRlIG9yZGVycyBldmVyeSBJTlRFR0VSIGJlZm9yZSBldmVyeSBURVhUIFx1MjAxNFxuICogc28gYCRndGVgIG1hdGNoZWQgZXZlcnkgcm93IChubyBmbG9vcikgYW5kIGAkbHRlYCBtYXRjaGVkIG5vbmUgKGVtcHR5XG4gKiBkYXNoYm9hcmQpLiBUaGF0IGlzIGhpc3RvcnksIG5vdCBhIGxpdmUgY29uc3RyYWludC4gQm90aCBuYW1lZCBwcmVjb25kaXRpb25zXG4gKiBhcmUgZml4ZWQgYW5kIHJlbGVhc2VkOiBvYmplY3RzdGFjayMzOTEyICh0aGUgY29lcmNpb24pIGFuZCBvYmplY3RzdGFjayMzNzc3XG4gKiAoYSBiYXJlLWRhdGUgYCRsdGVgIGRyb3BwaW5nIHNhbWUtZGF5IHJvd3MpIFx1MjAxNCBib3RoIHVuZGVyIHRoZSAqKjE3LjAuMCoqXG4gKiBoZWFkaW5nIG9mIHRoZSBpbnN0YWxsZWQgYGRyaXZlci1zcWxgIGFuZCBgc2VydmljZS1hbmFseXRpY3NgIENIQU5HRUxPR3MsXG4gKiBhbmQgZXZlcnkgcGluIHNpbmNlIDE3LjAuMCBjYXJyaWVzIGJvdGguIGBzZXJ2aWNlLmRhc2hib2FyZC50c2AgcmVjb3Jkc1xuICogdGhlIHNhbWUgdHdvXG4gKiBjbG9zdXJlcywgd2hpY2ggaXMgd2h5ICMxMTU3IHJlc3RvcmVkIHRoZSBTZXJ2aWNlIHBpY2tlcjsgdGhlIHR3byBmaWxlc1xuICogYWdyZWUsIGFuZCBuZWl0aGVyIHN0YXRlcyBhbiB1cHN0cmVhbSBmaXggYXMgYW4gdW5tZXQgcHJlY29uZGl0aW9uLlxuICpcbiAqIFRoZSByZWFzb24gdGhpcyBkYXNoYm9hcmQgc3RpbGwgY2FycmllcyBubyBwaWNrZXIgaXMgdGhlcmVmb3JlIGEgUFJPRFVDVFxuICogb25lLCBhbmQgaXQgc3RhbmRzIG9uIGl0cyBvd246IGJvdGggcXVlc3Rpb25zIGEgZGF0ZSByYW5nZSB3b3VsZCBhbnN3ZXIgYXJlXG4gKiBhbHJlYWR5IGFuc3dlcmVkIGhlcmUsIGJ5IHdpZGdldHMgYSBkYXNoYm9hcmQgcmFuZ2Ugd291bGQgbmFycm93IHJhdGhlciB0aGFuXG4gKiBzZXJ2ZSBcdTIwMTQgdGhlIHJ1bnRpbWUgQU5EcyBgZGF0ZVJhbmdlYCBpbnRvIGV2ZXJ5IHdpZGdldCBxdWVyeS5cbiAqXG4gKiAgIC0gVGhlIHRyZW5kIGlzIG9uIGFuIEFYSVMsIG5vdCBpbiBhIGZpbHRlci4gYGFjdGl2aXR5X2J5X3dlZWtgIGdyb3VwcyBvblxuICogICAgIHRoZSBgZXZlbnRfbWV0cmljcy5zdGFydF9kYXRldGltZWAgZGltZW5zaW9uLCB3aGljaCBkZWNsYXJlc1xuICogICAgIGBkYXRlR3JhbnVsYXJpdHk6ICd3ZWVrJ2A7IFwiaXMgdGhlIHRlYW0gc3BlZWRpbmcgdXAgb3IgZ29pbmcgcXVpZXQ/XCIgaXNcbiAqICAgICByZWFkIEFDUk9TUyB0aGUgaGlzdG9yeSwgc28gYSBwaWNrZXIgd291bGQgdHJ1bmNhdGUgdGhlIGF4aXMgdGhhdCBpcyB0aGVcbiAqICAgICB3aG9sZSBwb2ludCBvZiB0aGUgY2hhcnQuXG4gKiAgIC0gUmVjZW5jeSBpcyBhbHJlYWR5IFNFTEYtU0NPUEVELiBUaGUgdGhyZWUgcXVpZXQtYWNjb3VudCB0aWxlcyBlYWNoIGNhcnJ5XG4gKiAgICAgdGhlaXIgb3duIHdpbmRvdyBvbiBgY3JtX2FjY291bnQubGFzdF9hY3Rpdml0eV9kYXRlYCBcdTIwMTQgYCRsdGBcbiAqICAgICBgezMwX2RheXNfYWdvfWAgLyBgezYwX2RheXNfYWdvfWAgLyBgezkwX2RheXNfYWdvfWAgXHUyMDE0IGFuZCBcInF1aWV0IGZvciA5MFxuICogICAgIGRheXNcIiBtZWFucyBuaW5ldHkgZGF5cywgbm90IG5pbmV0eSBkYXlzIHJlLWN1dCBieSB3aGF0ZXZlciB0aGUgcGlja2VyXG4gKiAgICAgc2F5cy4gT24gdGhlIHNpYmxpbmcgZGFzaGJvYXJkcyB0aGF0IERPIGhhdmUgb25lLCB0aGF0IGlzIHNwZWxsZWRcbiAqICAgICBgZmlsdGVyQmluZGluZ3M6IHsgZGF0ZVJhbmdlOiBmYWxzZSB9YDsgaGVyZSBpdCB3b3VsZCBoYXZlIHRvIGJlIHNwZWxsZWRcbiAqICAgICBvbiBldmVyeSB0aWxlIHRoYXQgbWF0dGVycy5cbiAqXG4gKiBcdTIxRDIgQWRkaW5nIGEgcGlja2VyIGlzIGEgcHJvZHVjdCBqdWRnZW1lbnQgdG8gYmUgbWFkZSBvbiBpdHMgbWVyaXRzLCBub3QgYVxuICogcGxhdGZvcm0gdW5ibG9jayB0byBiZSBjb2xsZWN0ZWQuIElmIGl0IGlzIGV2ZXIgbWFkZSwgdGhlIHdvcmsgaXMgYVxuICogYGRhdGVSYW5nZWAgcGx1cyBleHBsaWNpdCBgZmlsdGVyQmluZGluZ3NgIG9wdC1vdXRzIG9uIHRoZSB3aWRnZXRzIGFib3ZlLlxuICpcbiAqIE5vIEtQSSB0aWxlIGRlY2xhcmVzIGEgYHRyZW5kYDogYSBwZXJpb2Qtb3Zlci1wZXJpb2QgZGVsdGEgaXMgYSBtZWFzdXJlbWVudFxuICogYW5kIGhhcyB0byBjb21lIGZyb20gYSByZWFsIGNvbXBhcmlzb24gcXVlcnksIG5vdCBmcm9tIGEgbnVtYmVyIHR5cGVkIGJ5XG4gKiBoYW5kICgjNTAwLCAjNTg3KS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFjdGl2aXR5RGFzaGJvYXJkOiBEYXNoYm9hcmQgPSB7XG4gIG5hbWU6ICdzYWxlc19hY3Rpdml0eV9kYXNoYm9hcmQnLFxuICBsYWJlbDogJ1NhbGVzIEFjdGl2aXR5JyxcbiAgZGVzY3JpcHRpb246ICdXaG8gaXMgdGFsa2luZyB0byBjdXN0b21lcnMsIGhvdyBvZnRlbiwgYW5kIHdoaWNoIGFjY291bnRzIGhhdmUgZ29uZSBxdWlldCcsXG5cbiAgY29sdW1uczogMTIsXG4gIGdhcDogNCxcbiAgcmVmcmVzaEludGVydmFsU2Vjb25kczogMzAwLFxuXG4gIGhlYWRlcjoge1xuICAgIHNob3dUaXRsZTogdHJ1ZSxcbiAgICBzaG93RGVzY3JpcHRpb246IHRydWUsXG4gIH0sXG5cbiAgZ2xvYmFsRmlsdGVyczogW1xuICAgIHtcbiAgICAgIGZpZWxkOiAnb3duZXJfaWQnLFxuICAgICAgbGFiZWw6IHsgZW46ICdSZXAnLCAnemgtQ04nOiAnXHU5NTAwXHU1NTJFXHU0RUUzXHU4ODY4JywgJ2VzLUVTJzogJ1JlcHJlc2VudGFudGUnLCAnamEtSlAnOiAnXHU2MkM1XHU1RjUzXHU4MDA1JyB9LFxuICAgICAgdHlwZTogJ2xvb2t1cCcsXG4gICAgICBzY29wZTogJ2Rhc2hib2FyZCcsXG4gICAgICBvcHRpb25zRnJvbTogeyBvYmplY3Q6ICdzeXNfdXNlcicsIHZhbHVlRmllbGQ6ICdpZCcsIGxhYmVsRmllbGQ6ICduYW1lJyB9LFxuICAgIH0sXG4gIF0sXG5cbiAgd2lkZ2V0czogW1xuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSb3cgMTogd2hhdCBoYXBwZW5lZCwgYW5kIHdoYXQgaXMgYm9va2VkIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGlkOiAnaW50ZXJhY3Rpb25zX2hlbGQnLFxuICAgICAgdGl0bGU6ICdJbnRlcmFjdGlvbnMgTG9nZ2VkJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2FsbHMgYW5kIG1lZXRpbmdzIHRoYXQgYWN0dWFsbHkgaGFwcGVuZWQnLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgc3RhdHVzOiAnaGVsZCcgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ3N1Y2Nlc3MnLFxuICAgICAgZGF0YXNldDogJ2V2ZW50X21ldHJpY3MnLCB2YWx1ZXM6IFsnZXZlbnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAwLCB3OiAzLCBoOiAyIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ21lZXRpbmdzX2Jvb2tlZCcsXG4gICAgICB0aXRsZTogJ01lZXRpbmdzIEJvb2tlZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ01lZXRpbmdzIG9uIHRoZSBjYWxlbmRhciB0aGF0IGhhdmUgbm90IGhhcHBlbmVkIHlldCcsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGZpbHRlcjogeyBzdGF0dXM6ICdwbGFubmVkJywgdHlwZTogJ21lZXRpbmcnIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdibHVlJyxcbiAgICAgIGRhdGFzZXQ6ICdldmVudF9tZXRyaWNzJywgdmFsdWVzOiBbJ2V2ZW50X2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMywgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdjdXN0b21lcl9taW51dGVzJyxcbiAgICAgIHRpdGxlOiAnQ3VzdG9tZXIgTWludXRlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIHRpbWUgc3BlbnQgaW4gZnJvbnQgb2YgY3VzdG9tZXJzJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IHN0YXR1czogJ2hlbGQnIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdwdXJwbGUnLFxuICAgICAgZGF0YXNldDogJ2V2ZW50X21ldHJpY3MnLCB2YWx1ZXM6IFsndG90YWxfbWludXRlcyddLFxuICAgICAgbGF5b3V0OiB7IHg6IDYsIHk6IDAsIHc6IDMsIGg6IDIgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEZpcnN0IHdpZGdldCBpbiB0aGUgYXBwIHRvIHVzZSBgdGFza19tZXRyaWNzYC4gVGhlIGRhdGFzZXQgc2hpcHBlZCB3aXRoXG4gICAgICAvLyB0aGUgXCJNeSBEYXlcIiB3b3JrIGFuZCB0aGVuIGhhZCBubyBjb25zdW1lciBhdCBhbGwgKCM1OTIpIFx1MjAxNCBhIHNlbWFudGljXG4gICAgICAvLyBsYXllciBub2JvZHkgcXVlcmllcyBpcyBhIG1haW50ZW5hbmNlIGNvc3Qgd2l0aCBubyByZWFkZXIuXG4gICAgICBpZDogJ3Rhc2tzX2NvbXBsZXRlZCcsXG4gICAgICB0aXRsZTogJ1Rhc2tzIENvbXBsZXRlZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ZvbGxvdy11cHMgY2xvc2VkIG91dCBcdTIwMTQgdGhlIG90aGVyIGhhbGYgb2YgYWN0aXZpdHknLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgaXNfY29tcGxldGVkOiB0cnVlIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdvcmFuZ2UnLFxuICAgICAgZGF0YXNldDogJ3Rhc2tfbWV0cmljcycsIHZhbHVlczogWyd0YXNrX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogOSwgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgUm93IDI6IHdobywgYW5kIHdoZW4gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgaWQ6ICdhY3Rpdml0eV9ieV9yZXAnLFxuICAgICAgdGl0bGU6ICdBY3Rpdml0eSBieSBSZXAnLFxuICAgICAgZGVzY3JpcHRpb246ICdMb2dnZWQgaW50ZXJhY3Rpb25zIHBlciBvd25lciBcdTIwMTQgdGhlIGNvdmVyYWdlIHF1ZXN0aW9uJyxcbiAgICAgIHR5cGU6ICdiYXInLFxuICAgICAgZmlsdGVyOiB7IHN0YXR1czogJ2hlbGQnIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdzdWNjZXNzJyxcbiAgICAgIGRhdGFzZXQ6ICdldmVudF9tZXRyaWNzJywgZGltZW5zaW9uczogWydvd25lciddLCB2YWx1ZXM6IFsnZXZlbnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAyLCB3OiA2LCBoOiA0IH0sXG4gICAgICBjaGFydENvbmZpZzoge1xuICAgICAgICBzaG93TGVnZW5kOiBmYWxzZSxcbiAgICAgICAgc2hvd0RhdGFMYWJlbHM6IHRydWUsXG4gICAgICAgIGNvbG9yczogWycjMTBCOTgxJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdhY3Rpdml0eV9ieV93ZWVrJyxcbiAgICAgIHRpdGxlOiAnQWN0aXZpdHkgVm9sdW1lIGJ5IFdlZWsnLFxuICAgICAgZGVzY3JpcHRpb246ICdJbnRlcmFjdGlvbnMgcGVyIHdlZWsgXHUyMDE0IGlzIHRoZSB0ZWFtIHNwZWVkaW5nIHVwIG9yIGdvaW5nIHF1aWV0PycsXG4gICAgICB0eXBlOiAnYXJlYScsXG4gICAgICBmaWx0ZXI6IHsgc3RhdHVzOiAnaGVsZCcgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgLy8gVGhlIHdlZWsgYnVja2V0IGxpdmVzIG9uIHRoZSBESU1FTlNJT04sIG5vdCBpbiBhIGZpbHRlciBcdTIwMTQgc2VlIHRoZVxuICAgICAgLy8gaGVhZGVyIG5vdGUgb24gd2h5IHRoZSB0cmVuZCBiZWxvbmdzIG9uIGFuIGF4aXMgaGVyZS4gVGhlIGRhdGV0aW1lXG4gICAgICAvLyBmaWx0ZXIgYm91bmQgaXRzZWxmIHdvcmtzIChvYmplY3RzdGFjayMzOTEyIC8gIzM3NzcsIDE3LjAuMCk7IHB1dHRpbmdcbiAgICAgIC8vIHRoZSB0cmVuZCBpbiBhIGZpbHRlciB3b3VsZCBuYXJyb3cgaXQsIHdoaWNoIGlzIGEgZGlmZmVyZW50IG9iamVjdGlvbi5cbiAgICAgIGRhdGFzZXQ6ICdldmVudF9tZXRyaWNzJywgZGltZW5zaW9uczogWydzdGFydF9kYXRldGltZSddLCB2YWx1ZXM6IFsnZXZlbnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiA2LCB5OiAyLCB3OiA2LCBoOiA0IH0sXG4gICAgICBjaGFydENvbmZpZzoge1xuICAgICAgICBzaG93TGVnZW5kOiBmYWxzZSxcbiAgICAgICAgc2hvd0RhdGFMYWJlbHM6IGZhbHNlLFxuICAgICAgICBjb2xvcnM6IFsnIzBFQTVFOSddLFxuICAgICAgICBpbnRlcmFjdGlvbjogeyB0b29sdGlwczogdHJ1ZSwgYnJ1c2g6IHRydWUgfSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSb3cgMzogd2hhdCB0aGUgYWN0aXZpdHkgaXMgYWJvdXQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgaWQ6ICdhY3Rpdml0eV9taXgnLFxuICAgICAgdGl0bGU6ICdBY3Rpdml0eSBNaXgnLFxuICAgICAgZGVzY3JpcHRpb246ICdDYWxscyB2cyBtZWV0aW5ncyB2cyBkZW1vcycsXG4gICAgICB0eXBlOiAnZG9udXQnLFxuICAgICAgZmlsdGVyOiB7IHN0YXR1czogJ2hlbGQnIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdwdXJwbGUnLFxuICAgICAgZGF0YXNldDogJ2V2ZW50X21ldHJpY3MnLCBkaW1lbnNpb25zOiBbJ3R5cGUnXSwgdmFsdWVzOiBbJ2V2ZW50X2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMCwgeTogNiwgdzogNCwgaDogNCB9LFxuICAgICAgY2hhcnRDb25maWc6IHtcbiAgICAgICAgc2hvd0xlZ2VuZDogdHJ1ZSxcbiAgICAgICAgc2hvd0RhdGFMYWJlbHM6IHRydWUsXG4gICAgICAgIGNvbG9yczogWycjNDE2OUUxJywgJyMxMEI5ODEnLCAnIzhCNUNGNicsICcjRjU5RTBCJywgJyMwRUE1RTknLCAnIzk0QTNCOCddLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnYWN0aXZpdHlfYnlfcmVjb3JkX3R5cGUnLFxuICAgICAgdGl0bGU6ICdXaGVyZSB0aGUgQWN0aXZpdHkgTGFuZHMnLFxuICAgICAgZGVzY3JpcHRpb246ICdXaGljaCBwYXJ0IG9mIHRoZSBmdW5uZWwgaXMgZ2V0dGluZyBhdHRlbnRpb24nLFxuICAgICAgdHlwZTogJ2JhcicsXG4gICAgICBmaWx0ZXI6IHsgc3RhdHVzOiAnaGVsZCcgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgZGF0YXNldDogJ2V2ZW50X21ldHJpY3MnLCBkaW1lbnNpb25zOiBbJ3JlbGF0ZWRfdG9fdHlwZSddLCB2YWx1ZXM6IFsnZXZlbnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiA0LCB5OiA2LCB3OiA0LCBoOiA0IH0sXG4gICAgICBjaGFydENvbmZpZzoge1xuICAgICAgICBzaG93TGVnZW5kOiBmYWxzZSxcbiAgICAgICAgc2hvd0RhdGFMYWJlbHM6IHRydWUsXG4gICAgICAgIGNvbG9yczogWycjNDE2OUUxJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gXCJBY3Rpdml0eSBwZXIgb3BlbiBkZWFsXCIgYXMgdHdvIGhvbmVzdCBudW1iZXJzIHJhdGhlciB0aGFuIG9uZVxuICAgICAgLy8gZmFicmljYXRlZCByYXRpbzogdGhlIHNlbWFudGljIGxheWVyIGhhcyBubyBjcm9zcy1kYXRhc2V0IGNhbGN1bGF0ZWRcbiAgICAgIC8vIG1lYXN1cmUsIHNvIGEgc2luZ2xlIFwiMS44IGFjdGl2aXRpZXMvZGVhbFwiIHRpbGUgd291bGQgaGF2ZSB0byBiZVxuICAgICAgLy8gY29tcHV0ZWQgYnkgdGhlIHJlbmRlcmVyIG92ZXIgdHdvIGluZGVwZW5kZW50IHF1ZXJpZXMgXHUyMDE0IHdoaWNoIG5vdGhpbmdcbiAgICAgIC8vIGRvZXMgdG9kYXkuIEEgbWFuYWdlciByZWFkcyB0aGUgcGFpcjsgYSBtYWRlLXVwIHF1b3RpZW50IHdvdWxkIHJlYWQgYXNcbiAgICAgIC8vIG1lYXN1cmVkLiBGaWxlZCBhcyBhIGZvbGxvdy11cCByYXRoZXIgdGhhbiBmYWtlZCBoZXJlLlxuICAgICAgaWQ6ICdkZWFsX2FjdGl2aXR5JyxcbiAgICAgIHRpdGxlOiAnSW50ZXJhY3Rpb25zIG9uIERlYWxzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTG9nZ2VkIGludGVyYWN0aW9ucyBsaW5rZWQgdG8gYW4gb3Bwb3J0dW5pdHkgXHUyMDE0IHJlYWQgYWdhaW5zdCBPcGVuIERlYWxzIFx1MjE5MicsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGZpbHRlcjogeyBzdGF0dXM6ICdoZWxkJywgcmVsYXRlZF90b190eXBlOiAnY3JtX29wcG9ydHVuaXR5JyB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnc3VjY2VzcycsXG4gICAgICBkYXRhc2V0OiAnZXZlbnRfbWV0cmljcycsIHZhbHVlczogWydldmVudF9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDgsIHk6IDYsIHc6IDIsIGg6IDQgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnb3Blbl9kZWFsc19mb3JfYWN0aXZpdHknLFxuICAgICAgdGl0bGU6ICdPcGVuIERlYWxzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3Bwb3J0dW5pdGllcyBzdGlsbCBpbiBwbGF5JyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiB7ICRuaW46IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0gfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsnb3BwX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMTAsIHk6IDYsIHc6IDIsIGg6IDQgfSxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyA0OiB0aGUgY2h1cm4gc3RvcnksIG5vdyBiYWNrZWQgYnkgYSByZWFsIHNpZ25hbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvLyBUaGVzZSB3aW5kb3cgYGNybV9hY2NvdW50Lmxhc3RfYWN0aXZpdHlfZGF0ZWAsIHdoaWNoIGlzIGEgYEZpZWxkLmRhdGUoKWBcbiAgICAvLyAoVEVYVCBgWVlZWS1NTS1ERGApIFx1MjAxNCB0aGUgc2FtZSBzaGFwZSBgY3VzdG9tZXJfY2h1cm5fc2lnbmFsc2AgYWxyZWFkeVxuICAgIC8vIGZpbHRlcnMgc2FmZWx5LiBVbnRpbCAjNTkyIHRoZSBjb2x1bW4gd2FzIHdyaXR0ZW4gYnkgbm90aGluZyBhdCBhbGw6IHRoZVxuICAgIC8vIGJ1YmJsZSB0aGF0IGZlZCBpdCB3YXMgc2lsZW50bHkgZGlzY2FyZGVkIG9uIGV2ZXJ5IGludm9jYXRpb24gYmVjYXVzZVxuICAgIC8vIHRoZSBmaWVsZCB3YXMgYHJlYWRvbmx5YCAoIzI5NDgpLiBUaGVzZSB0aHJlZSB0aWxlcyBhcmUgdGhlIHJlYXNvbiB0aGF0XG4gICAgLy8gbWF0dGVyZWQuXG4gICAge1xuICAgICAgaWQ6ICdxdWlldF9hY2NvdW50c18zMCcsXG4gICAgICB0aXRsZTogJ1F1aWV0IDMwKyBEYXlzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQWN0aXZlIGFjY291bnRzIHdpdGggbm8gbG9nZ2VkIGludGVyYWN0aW9uIGluIGEgbW9udGgnLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgaXNfYWN0aXZlOiB0cnVlLCBsYXN0X2FjdGl2aXR5X2RhdGU6IHsgJGx0OiAnezMwX2RheXNfYWdvfScgfSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnd2FybmluZycsXG4gICAgICBkYXRhc2V0OiAnYWNjb3VudF9tZXRyaWNzJywgdmFsdWVzOiBbJ2FjY291bnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAxMCwgdzogNCwgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdxdWlldF9hY2NvdW50c182MCcsXG4gICAgICB0aXRsZTogJ1F1aWV0IDYwKyBEYXlzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVHdvIG1vbnRocyBvZiBzaWxlbmNlIFx1MjAxNCB0aGUgYXQtcmlzayB0aHJlc2hvbGQnLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgaXNfYWN0aXZlOiB0cnVlLCBsYXN0X2FjdGl2aXR5X2RhdGU6IHsgJGx0OiAnezYwX2RheXNfYWdvfScgfSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnb3JhbmdlJyxcbiAgICAgIGRhdGFzZXQ6ICdhY2NvdW50X21ldHJpY3MnLCB2YWx1ZXM6IFsnYWNjb3VudF9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDQsIHk6IDEwLCB3OiA0LCBoOiAyIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ3F1aWV0X2FjY291bnRzXzkwJyxcbiAgICAgIHRpdGxlOiAnUXVpZXQgOTArIERheXMnLFxuICAgICAgZGVzY3JpcHRpb246ICdBIHF1YXJ0ZXIgd2l0aCBubyBjb250YWN0IFx1MjAxNCBpbnRlcnZlbmUgb3Igd3JpdGUgaXQgb2ZmJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IGlzX2FjdGl2ZTogdHJ1ZSwgbGFzdF9hY3Rpdml0eV9kYXRlOiB7ICRsdDogJ3s5MF9kYXlzX2Fnb30nIH0gfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2RhbmdlcicsXG4gICAgICBkYXRhc2V0OiAnYWNjb3VudF9tZXRyaWNzJywgdmFsdWVzOiBbJ2FjY291bnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiA4LCB5OiAxMCwgdzogNCwgaDogMiB9LFxuICAgIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGFzaGJvYXJkcy9zaGFyZWQtd2lkZ2V0cy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXNoYm9hcmRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Rhc2hib2FyZHMvc2hhcmVkLXdpZGdldHMudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRGFzaGJvYXJkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG50eXBlIFdpZGdldCA9IERhc2hib2FyZFsnd2lkZ2V0cyddW251bWJlcl07XG50eXBlIFdpZGdldExheW91dCA9IFdpZGdldFsnbGF5b3V0J107XG5cbi8qKlxuICogV2lkZ2V0cyBzaGFyZWQgdmVyYmF0aW0gYWNyb3NzIGRhc2hib2FyZHMuXG4gKlxuICogVGhlIHBpcGVsaW5lIGZ1bm5lbCBhcHBlYXJlZCB3b3JkLWZvci13b3JkIGluIHRoZSBDUk0sIFNhbGVzIGFuZCBFeGVjdXRpdmVcbiAqIGRhc2hib2FyZHMsIGFuZCB0aGUgYXZnLWRlYWwtc2l6ZSBLUEkgaW4gQ1JNIGFuZCBTYWxlcyBcdTIwMTQgdGhyZWUgY29waWVzIG9mXG4gKiBcIndoYXQgY291bnRzIGFzIG9wZW4gcGlwZWxpbmVcIiB0aGF0IGNvdWxkIChhbmQgZGlkKSBkcmlmdCBpbmRlcGVuZGVudGx5LlxuICogRWFjaCBmYWN0b3J5IG93bnMgdGhlIHNlbWFudGljIGRlZmluaXRpb24gb25jZTsgY2FsbGVycyBwb3NpdGlvbiBpdCB3aXRoXG4gKiBgbGF5b3V0YCBhbmQgbWF5IG5hcnJvdyBwcmVzZW50YXRpb24tb25seSBkZXRhaWxzIHZpYSBgb3ZlcnJpZGVzYC5cbiAqL1xuXG4vKipcbiAqIE9wZW4tcGlwZWxpbmUgZnVubmVsIGJ5IHNhbGVzIHN0YWdlIFx1MjAxNCBpZGVudGljYWwgc2VtYW50aWNzIGV2ZXJ5d2hlcmUuXG4gKlxuICogTm8gYGNoYXJ0Q29uZmlnYDogYSBkYXRhc2V0LWJvdW5kIHdpZGdldCBpcyBwYWludGVkIHdpdGggdGhlIGNvbnNvbGUncyBvd25cbiAqIHRoZW1lIHRva2Vucywgc28gdGhlIHBhbGV0dGUgdGhpcyBmYWN0b3J5IHVzZWQgdG8gZGVjbGFyZSBuZXZlciBhcHBsaWVkLlxuICogVmVyaWZpZWQgaW4gdGhlIGJyb3dzZXIgYWdhaW5zdCAxNi4xLjAgXHUyMDE0IGV2ZXJ5IGZpbGwgaW4gdGhlIHJlbmRlcmVkIGZ1bm5lbCBpc1xuICogYGhzbCh2YXIoLS1jaGFydC0xKSlgIFx1MjAyNiBgaHNsKHZhcigtLWNoYXJ0LTUpKWAsIGFuZCBub25lIG9mIHRoZSBmaXZlIGhleCBjb2xvcnNcbiAqIChgIzBFQTVFOWAgXHUyMDI2IGAjMjJDNTVFYCkgcmVhY2hlcyB0aGUgRE9NLiBLZWVwaW5nIHRoZSBibG9jayB3b3VsZCBsZWF2ZVxuICogZGVjb3JhdGlvbiB0aGF0IHJlYWRzIGFzIGlmIGl0IHdlcmUgaW4gZWZmZWN0ICgjNTAwKS5cbiAqXG4gKiBObyBgY29sb3JWYXJpYW50YCBlaXRoZXIsIG9uIHRoZSBzYW1lIGV2aWRlbmNlOiB0aGUgZXhlY3V0aXZlIGRhc2hib2FyZCdzIEtQSVxuICogdGlsZXMgZGVjbGFyZSBmb3VyIGRpZmZlcmVudCB2YXJpYW50cyAoYHN1Y2Nlc3NgLCBgYmx1ZWAsIGBwdXJwbGVgLCBgb3JhbmdlYClcbiAqIGFuZCByZW5kZXIgd2l0aCBieXRlLWlkZW50aWNhbCBiYWNrZ3JvdW5kLCBib3JkZXIgYW5kIHZhbHVlIGNvbG91cnMuXG4gKi9cbmV4cG9ydCBjb25zdCBwaXBlbGluZUJ5U3RhZ2VGdW5uZWxXaWRnZXQgPSAobGF5b3V0OiBXaWRnZXRMYXlvdXQpOiBXaWRnZXQgPT4gKHtcbiAgaWQ6ICdwaXBlbGluZV9ieV9zdGFnZScsXG4gIHRpdGxlOiAnUGlwZWxpbmUgYnkgU3RhZ2UnLFxuICBkZXNjcmlwdGlvbjogJ09wZW4gb3Bwb3J0dW5pdHkgdmFsdWUgYXQgZWFjaCBzYWxlcyBzdGFnZScsXG4gIHR5cGU6ICdmdW5uZWwnLFxuICBmaWx0ZXI6IHsgc3RhZ2U6IHsgJG5pbjogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfSB9LFxuICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnc3RhZ2UnXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICBsYXlvdXQsXG4gIHN1cHByZXNzV2FybmluZ3M6IFsnY2hhcnQtY29uZmlnLW1pc3NpbmcnXSwgLy8gaW50ZW50aW9uYWwgZGVmYXVsdCByZW5kZXJpbmdcbn0pO1xuXG4vKipcbiAqIEF2Zy1kZWFsLXNpemUgS1BJIG92ZXIgY2xvc2VkLXdvbiBkZWFscy4gVGhlIG1lYXN1cmUgaXMgZml4ZWQ7IHRoZSB0aW1lXG4gKiBzY29waW5nIGxlZ2l0aW1hdGVseSBkaWZmZXJzIHBlciBkYXNoYm9hcmQgKENSTSBmb2xsb3dzIHRoZSBkYXNoYm9hcmQgZGF0ZVxuICogcGlja2VyLCBTYWxlcyBwaW5zIGl0c2VsZiB0byBRVEQpLCBzbyBjYWxsZXJzIHBhc3MgaXQgaW4uXG4gKlxuICogTm8gZHJpbGwtdGhyb3VnaDogYC9yZXBvcnRzL2F2Zy1kZWFsLXNpemVgIG1hdGNoZWQgbm8gcmVnaXN0ZXJlZCByZXBvcnQsIGFuZFxuICogbm8gcmVwb3J0IGNvdmVycyBhdmVyYWdlIGRlYWwgc2l6ZSwgc28gdGhlIGJ1dHRvbiB3YXMgZGVhZCBvbiBldmVyeSBkYXNoYm9hcmRcbiAqIHRoYXQgdXNlZCB0aGlzIGZhY3RvcnkgKCM1MjcpLiBSZS1hZGQgb25lIGhlcmUgd2hlbiBzdWNoIGEgcmVwb3J0IHNoaXBzIFx1MjAxNFxuICogc2hhcmluZyB0aGUgd2lkZ2V0IG1lYW5zIHNoYXJpbmcgdGhlIGZpeC5cbiAqL1xuZXhwb3J0IGNvbnN0IGF2Z0RlYWxTaXplTWV0cmljV2lkZ2V0ID0gKFxuICBsYXlvdXQ6IFdpZGdldExheW91dCxcbiAgb3ZlcnJpZGVzOiBQYXJ0aWFsPFdpZGdldD4gPSB7fSxcbik6IFdpZGdldCA9PiAoe1xuICBpZDogJ2F2Z19kZWFsX3NpemUnLFxuICB0aXRsZTogJ0F2ZyBEZWFsIFNpemUnLFxuICBkZXNjcmlwdGlvbjogJ0F2ZXJhZ2UgdmFsdWUgb2YgY2xvc2VkLXdvbiBkZWFscycsXG4gIHR5cGU6ICdtZXRyaWMnLFxuICBmaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfd29uJyB9LFxuICBjb2xvclZhcmlhbnQ6ICdvcmFuZ2UnLFxuICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIHZhbHVlczogWydhdmdfYW1vdW50J10sXG4gIGxheW91dCxcbiAgLi4ub3ZlcnJpZGVzLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXNoYm9hcmRzL2NybS5kYXNoYm9hcmQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGFzaGJvYXJkc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXNoYm9hcmRzL2NybS5kYXNoYm9hcmQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRGFzaGJvYXJkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuaW1wb3J0IHsgYXZnRGVhbFNpemVNZXRyaWNXaWRnZXQsIHBpcGVsaW5lQnlTdGFnZUZ1bm5lbFdpZGdldCB9IGZyb20gJy4vc2hhcmVkLXdpZGdldHMnO1xuXG4vKipcbiAqIENSTSBPdmVydmlldyBEYXNoYm9hcmRcbiAqXG4gKiBTaW5nbGUtcGFnZSBzbmFwc2hvdCBvZiByZXZlbnVlLCBwaXBlbGluZSwgYW5kIGN1c3RvbWVyIGFjdGl2aXR5LiBEZXNpZ25lZFxuICogdG8gbWlycm9yIHRoZSBwb2xpc2hlZCBDUk0gZGFzaGJvYXJkIHJlZmVyZW5jZSBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL29iamVjdHN0YWNrLWFpL29iamVjdHVpL3RyZWUvbWFpbi9leGFtcGxlcy9jcm0vc3JjL2Rhc2hib2FyZHNcbiAqIFx1MjAxNCBLUEkgdGlsZXMsIGFuIGFyZWEtY2hhcnQgcmV2ZW51ZSB0cmVuZCwgYSBsZWFkLXNvdXJjZSBkb251dCwgYVxuICogcGlwZWxpbmUgZnVubmVsLCBhbmQgYSByZWNlbnQtZGVhbHMgdGFibGUuXG4gKlxuICogVGhpcyBkYXNoYm9hcmQgaW50ZW50aW9uYWxseSB1c2VzIHRoZSBmcmFtZXdvcmsncyBmaXJzdC1jbGFzcyBtZXRhZGF0YSBmaWVsZHNcbiAqIChjb2xvclZhcmlhbnQsIGNoYXJ0Q29uZmlnLCBoZWFkZXIsIGRhdGVSYW5nZSwgZGVzY3JpcHRpb25zLCBhY3Rpb24gYnV0dG9ucylcbiAqIHJhdGhlciB0aGFuIGFkLWhvYyBoZXggc3RyaW5ncyBzdHVmZmVkIGludG8gYG9wdGlvbnMuY29sb3JgLlxuICpcbiAqIE5vIEtQSSB0aWxlIGRlY2xhcmVzIGEgYHRyZW5kYC4gQSBwZXJpb2Qtb3Zlci1wZXJpb2QgZGVsdGEgaXMgYSBtZWFzdXJlbWVudCxcbiAqIHNvIGl0IGhhcyB0byBjb21lIGZyb20gYSByZWFsIGNvbXBhcmlzb24gcXVlcnkgKHdpZGdldCBgY29tcGFyZVRvYCkgb25jZSB0aGVcbiAqIHJlbmRlcmVyIHN1cHBvcnRzIGl0IGZvciBkYXRhc2V0IG1ldHJpY3MgXHUyMDE0IHRoZSBwZXJjZW50YWdlcyB0aGlzIGZpbGUgdXNlZCB0b1xuICogY2Fycnkgd2VyZSB0eXBlZCBieSBoYW5kIGFuZCByZWNvbXB1dGVkIGJ5IG5vdGhpbmcsIHNvIHRoZXkga2VwdCBhc3NlcnRpbmdcbiAqIHRoZSBzYW1lIFwiKzEyLjUlIHZzIGxhc3QgbW9udGhcIiBvbiBhbnkgZGF0YSwgaW5jbHVkaW5nIGFuIGVtcHR5IGRhdGFiYXNlLlxuICogU2FtZSBydWxlIGFzIHRoZSBleGVjdXRpdmUgZGFzaGJvYXJkICgjNTAwLCAjNTg3KS5cbiAqL1xuZXhwb3J0IGNvbnN0IENybU92ZXJ2aWV3RGFzaGJvYXJkOiBEYXNoYm9hcmQgPSB7XG4gIG5hbWU6ICdjcm1fb3ZlcnZpZXdfZGFzaGJvYXJkJyxcbiAgbGFiZWw6ICdDUk0gT3ZlcnZpZXcnLFxuICBkZXNjcmlwdGlvbjogJ1JldmVudWUgbWV0cmljcywgcGlwZWxpbmUgYW5hbHl0aWNzLCBhbmQgZGVhbCBpbnNpZ2h0cycsXG5cbiAgY29sdW1uczogMTIsXG4gIGdhcDogNCxcbiAgcmVmcmVzaEludGVydmFsU2Vjb25kczogMzAwLFxuXG4gIGhlYWRlcjoge1xuICAgIHNob3dUaXRsZTogdHJ1ZSxcbiAgICBzaG93RGVzY3JpcHRpb246IHRydWUsXG4gICAgLy8gSGVhZGVyIGFjdGlvbiBidXR0b25zIHJlbW92ZWQ6IGBjcmVhdGVfb3Bwb3J0dW5pdHlgIC8gYGNyZWF0ZV9sZWFkYCBhcmUgbm90XG4gICAgLy8gZGVmaW5lZCBhY3Rpb25zIGFuZCBgL3JlcG9ydHNgIGlzIG5vdCBhbiBpbi1hcHAgdmlldyByb3V0ZSBcdTIwMTQgYWxsIHRocmVlIHdlcmVcbiAgICAvLyBkZWFkLiBSZS1hZGQgcmVhbCwgd2lyZWQtdXAgYWN0aW9ucyBoZXJlIHdoZW4gYXZhaWxhYmxlLlxuICB9LFxuXG4gIGRhdGVSYW5nZToge1xuICAgIGZpZWxkOiAnY2xvc2VfZGF0ZScsXG4gICAgZGVmYXVsdFJhbmdlOiAndGhpc19xdWFydGVyJyxcbiAgICBhbGxvd0N1c3RvbVJhbmdlOiB0cnVlLFxuICB9LFxuXG4gIGdsb2JhbEZpbHRlcnM6IFtcbiAgICB7XG4gICAgICBmaWVsZDogJ293bmVyX2lkJyxcbiAgICAgIGxhYmVsOiB7IGVuOiAnT3duZXInLCAnemgtQ04nOiAnXHU4RDFGXHU4RDIzXHU0RUJBJywgJ2VzLUVTJzogJ1Jlc3BvbnNhYmxlJywgJ2phLUpQJzogJ1x1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgc2NvcGU6ICdkYXNoYm9hcmQnLFxuICAgICAgb3B0aW9uc0Zyb206IHsgb2JqZWN0OiAnc3lzX3VzZXInLCB2YWx1ZUZpZWxkOiAnaWQnLCBsYWJlbEZpZWxkOiAnbmFtZScgfSxcbiAgICB9LFxuICBdLFxuXG4gIHdpZGdldHM6IFtcbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgS1BJIFJvdyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBpZDogJ3RvdGFsX3JldmVudWUnLFxuICAgICAgdGl0bGU6ICdUb3RhbCBSZXZlbnVlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2xvc2VkLXdvbiByZXZlbnVlIHRoaXMgcGVyaW9kJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiAnY2xvc2VkX3dvbicgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ3N1Y2Nlc3MnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsndG90YWxfYW1vdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMCwgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdhY3RpdmVfZGVhbHMnLFxuICAgICAgdGl0bGU6ICdBY3RpdmUgRGVhbHMnLFxuICAgICAgZGVzY3JpcHRpb246ICdPcGVuIG9wcG9ydHVuaXRpZXMgaW4gdGhlIHBpcGVsaW5lJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiB7ICRuaW46IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0gfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsnb3BwX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMywgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICd3b25fZGVhbHMnLFxuICAgICAgdGl0bGU6ICdXb24gRGVhbHMnLFxuICAgICAgZGVzY3JpcHRpb246ICdDbG9zZWQtd29uIGRlYWxzIHRoaXMgcGVyaW9kJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiAnY2xvc2VkX3dvbicgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ3B1cnBsZScsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIHZhbHVlczogWydvcHBfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiA2LCB5OiAwLCB3OiAzLCBoOiAyIH0sXG4gICAgfSxcbiAgICAvLyBObyBvdmVycmlkZXMgbGVmdCBvbmNlIHRoZSBmYWJyaWNhdGVkIHRyZW5kIGlzIGdvbmUuXG4gICAgYXZnRGVhbFNpemVNZXRyaWNXaWRnZXQoeyB4OiA5LCB5OiAwLCB3OiAzLCBoOiAyIH0pLFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENoYXJ0cyBSb3cgMSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBpZDogJ3JldmVudWVfdHJlbmRzJyxcbiAgICAgIHRpdGxlOiAnUmV2ZW51ZSBUcmVuZHMnLFxuICAgICAgZGVzY3JpcHRpb246ICdDbG9zZWQtd29uIHJldmVudWUgb3ZlciB0aGUgbGFzdCAxMiBtb250aHMnLFxuICAgICAgdHlwZTogJ2FyZWEnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiAnY2xvc2VkX3dvbicsIGNsb3NlX2RhdGU6IHsgJGd0ZTogJ3sxMl9tb250aHNfYWdvfScgfSB9LFxuICAgICAgZmlsdGVyQmluZGluZ3M6IHsgZGF0ZVJhbmdlOiBmYWxzZSB9LCAvLyBzZWxmLXNjb3BlZCB0byAxMiBtb250aHMgXHUyMDE0IHRoZSBkYXRlIHBpY2tlciBtdXN0IG5vdCBuYXJyb3cgaXRcbiAgICAgIGNvbG9yVmFyaWFudDogJ3N1Y2Nlc3MnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCBkaW1lbnNpb25zOiBbJ2Nsb3NlX2RhdGUnXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDIsIHc6IDksIGg6IDQgfSxcbiAgICAgIGNoYXJ0Q29uZmlnOiB7XG4gICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlLFxuICAgICAgICBzaG93RGF0YUxhYmVsczogZmFsc2UsXG4gICAgICAgIGNvbG9yczogWycjMTBCOTgxJ10sXG4gICAgICAgIGludGVyYWN0aW9uOiB7IHRvb2x0aXBzOiB0cnVlLCBicnVzaDogdHJ1ZSB9LFxuICAgICAgfSxcbiAgICAgIG9wdGlvbnM6IHsgZGF0ZUdyYW51bGFyaXR5OiAnbW9udGgnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2xlYWRfc291cmNlJyxcbiAgICAgIHRpdGxlOiAnTGVhZCBTb3VyY2UnLFxuICAgICAgZGVzY3JpcHRpb246ICdQaXBlbGluZSB2YWx1ZSBieSBhY3F1aXNpdGlvbiBjaGFubmVsJyxcbiAgICAgIHR5cGU6ICdkb251dCcsXG4gICAgICBjb2xvclZhcmlhbnQ6ICdwdXJwbGUnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCBkaW1lbnNpb25zOiBbJ2xlYWRfc291cmNlJ10sIHZhbHVlczogWyd0b3RhbF9hbW91bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiA5LCB5OiAyLCB3OiAzLCBoOiA0IH0sXG4gICAgICBjaGFydENvbmZpZzoge1xuICAgICAgICBzaG93TGVnZW5kOiB0cnVlLFxuICAgICAgICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgICAgICAgY29sb3JzOiBbJyM0RjQ2RTUnLCAnIzA2QjZENCcsICcjMTBCOTgxJywgJyNGNTlFMEInLCAnI0VGNDQ0NCcsICcjOEI1Q0Y2J10sXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ2hhcnRzIFJvdyAyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHBpcGVsaW5lQnlTdGFnZUZ1bm5lbFdpZGdldCh7IHg6IDAsIHk6IDYsIHc6IDYsIGg6IDQgfSksXG4gICAge1xuICAgICAgaWQ6ICd0b3BfcHJvZHVjdHMnLFxuICAgICAgdGl0bGU6ICdUb3AgUHJvZHVjdHMnLFxuICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBsaXN0LXByaWNlIHJldmVudWUgYnkgcHJvZHVjdCBjYXRlZ29yeScsXG4gICAgICB0eXBlOiAnYmFyJyxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgLy8gY3JtX3Byb2R1Y3QgaGFzIG5vIGBjbG9zZV9kYXRlYCwgc28gdGhlIGRhdGUgcGlja2VyIHdvdWxkIGZhaWwgaXQgd2l0aFxuICAgICAgLy8gYG5vIHN1Y2ggY29sdW1uYC4gT2JqZWN0U3RhY2sgMTUgKGZyYW1ld29yayMyNTAxKSBpbmplY3RzIGV2ZXJ5IGRhc2hib2FyZFxuICAgICAgLy8gZmlsdGVyIChkYXRlUmFuZ2UgKyBnbG9iYWxGaWx0ZXJzKSBpbnRvIGVhY2ggd2lkZ2V0J3MgcXVlcnkuXG4gICAgICAvLyBUaGUgYG93bmVyX2lkYCBvcHQtb3V0IGlzIFNFTUFOVElDLCBub3Qgc3RydWN0dXJhbDogc2luY2UgIzU0OCBldmVyeVxuICAgICAgLy8gYnVzaW5lc3Mgb2JqZWN0IGNhcnJpZXMgdGhlIGluamVjdGVkIGBvd25lcl9pZGAsIHNvIHRoZSBmaWx0ZXIgd291bGQgbm93XG4gICAgICAvLyByZXNvbHZlIFx1MjAxNCBpdCBqdXN0IG1lYW5zIG5vdGhpbmcgb24gYSBzaGFyZWQgcHJvZHVjdCBjYXRhbG9nLCB3aGVyZSB0aGVcbiAgICAgIC8vIGNvbHVtbiByZWNvcmRzIHdob2V2ZXIgY3JlYXRlZCB0aGUgZW50cnkuXG4gICAgICBmaWx0ZXJCaW5kaW5nczogeyBkYXRlUmFuZ2U6IGZhbHNlLCBvd25lcl9pZDogZmFsc2UgfSxcbiAgICAgIGRhdGFzZXQ6ICdwcm9kdWN0X21ldHJpY3MnLCBkaW1lbnNpb25zOiBbJ2NhdGVnb3J5J10sIHZhbHVlczogWydsaXN0X3ByaWNlX3N1bSddLFxuICAgICAgbGF5b3V0OiB7IHg6IDYsIHk6IDYsIHc6IDYsIGg6IDQgfSxcbiAgICAgIGNoYXJ0Q29uZmlnOiB7XG4gICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlLFxuICAgICAgICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgICAgICAgY29sb3JzOiBbJyM0RjQ2RTUnXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBQaXBlbGluZSBieSBPd25lciBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvLyBBIGRhc2hib2FyZCBgdGFibGVgIGJpbmRzIHRvIGFuIGFuYWx5dGljcyBkYXRhc2V0IChhIGN1YmUpLCBzbyBpdCBtdXN0XG4gICAgLy8gYWdncmVnYXRlIFx1MjAxNCBpdCBjYW5ub3QgbGlzdCByYXcgcmVjb3JkcyAoQURSLTAwMjEpLiBUaGUgcHJldmlvdXNcbiAgICAvLyBcIlJlY2VudCBPcHBvcnR1bml0aWVzXCIgdGFibGUgc2VsZWN0ZWQgb25seSB0aGUgYG9wcF9jb3VudGAgbWVhc3VyZSB3aXRoXG4gICAgLy8gbm8gZGltZW5zaW9uLCB3aGljaCByZW5kZXJzIGEgc2luZ2xlIHN1bW1hcnkgcm93LCBub3QgYSBwZXItZGVhbCBsaXN0LlxuICAgIC8vIEZvciBhIHRydWUgcGVyLXJlY29yZCBsaXN0aW5nLCBzdXJmYWNlIGFuIG9iamVjdC1ib3VuZCBMaXN0VmlldyB0aHJvdWdoXG4gICAgLy8gYXBwIG5hdmlnYXRpb24gaW5zdGVhZCAoQURSLTAwMTcpLiBIZXJlIHdlIGdyb3VwIGJ5IG93bmVyIGZvciBhIHJlcFxuICAgIC8vIHBpcGVsaW5lIGJyZWFrZG93biB0aGF0IHJlbmRlcnMgb25lIHJvdyBwZXIgb3duZXIuXG4gICAge1xuICAgICAgaWQ6ICdwaXBlbGluZV9ieV9vd25lcicsXG4gICAgICB0aXRsZTogJ1BpcGVsaW5lIGJ5IE93bmVyJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3BlbiBwaXBlbGluZSB2YWx1ZSBhbmQgZGVhbCBjb3VudCBwZXIgc2FsZXMgcmVwJyxcbiAgICAgIHR5cGU6ICd0YWJsZScsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6IHsgJG5pbjogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnZGVmYXVsdCcsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnb3duZXInXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCcsICdvcHBfY291bnQnLCAnYXZnX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDEwLCB3OiAxMiwgaDogNCB9LFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBzb3J0Qnk6ICd0b3RhbF9hbW91bnQnLFxuICAgICAgICBzb3J0T3JkZXI6ICdkZXNjJyxcbiAgICAgICAgbGltaXQ6IDEwLFxuICAgICAgfSxcbiAgICB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Rhc2hib2FyZHMvZXhlY3V0aXZlLmRhc2hib2FyZC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXNoYm9hcmRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Rhc2hib2FyZHMvZXhlY3V0aXZlLmRhc2hib2FyZC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBEYXNoYm9hcmQsIElubGluZUxvY2FsZU1hcCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcbmltcG9ydCB7IExFQURfU09VUkNFX09QVElPTlMgfSBmcm9tICcuLi9vYmplY3RzL19waWNrbGlzdHMnO1xuaW1wb3J0IHsgcGlwZWxpbmVCeVN0YWdlRnVubmVsV2lkZ2V0IH0gZnJvbSAnLi9zaGFyZWQtd2lkZ2V0cyc7XG5cbi8qKlxuICogYGxlYWRfc291cmNlYCBmaWx0ZXIgb3B0aW9uIGxhYmVscywga2V5ZWQgYnkgdGhlIENBTk9OSUNBTCBzdG9yZWQgdmFsdWUuXG4gKlxuICogT25seSB0aGUgV09SRElORyBpcyB3cml0dGVuIGhlcmUuIFRoZSBST1NURVIgaXMgZGVyaXZlZCBiZWxvdyBmcm9tXG4gKiB7QGxpbmsgTEVBRF9TT1VSQ0VfT1BUSU9OU30gXHUyMDE0IHRoZSBvbmUgY29uc3RhbnQgYGNybV9sZWFkYCwgYGNybV9jb250YWN0YCBhbmRcbiAqIGBjcm1fb3Bwb3J0dW5pdHlgIGVhY2ggc3ByZWFkIGludG8gdGhlaXIgb3duIGBsZWFkX3NvdXJjZWAgZmllbGQgXHUyMDE0IHNvIHRoaXNcbiAqIGNvbnRyb2wgY2FuIG9ubHkgZXZlciBvZmZlciB2YWx1ZXMgYSByZWNvcmQgY2FuIGFjdHVhbGx5IGhvbGQuIEl0IHVzZWQgdG9cbiAqIGhhbmQtY29weSBzaXggb2YgdGhlIHR3ZWx2ZSwgYW5kIG9uZSBvZiB0aG9zZSBzaXggd2FzIHNwZWxsZWQgYGFkdmVydGlzaW5nYFxuICogYWdhaW5zdCBhIGNhbm9uaWNhbCBgYWR2ZXJ0aXNlbWVudGA6IHBpY2tpbmcgaXQgQU5EZWQgYSB0ZXJtIG5vIHJvdyBtYXRjaGVzXG4gKiBpbnRvIGV2ZXJ5IGJvdW5kIHdpZGdldCBhbmQgdGhlIHdob2xlIGRhc2hib2FyZCByZWFkIHplcm8gd2l0aCBubyBlcnJvciBhbmRcbiAqIG5vIGVtcHR5IHN0YXRlICgjMTg0OSkuXG4gKlxuICogQSB2YWx1ZSBhZGRlZCB0byB0aGUgY29uc3RhbnQgd2l0aCBubyByb3cgaGVyZSByZW5kZXJzIGBsYWJlbDogdW5kZWZpbmVkYCxcbiAqIHdoaWNoIGBwbnBtIHZhbGlkYXRlYCByZWplY3RzIGJ5IG5hbWUgXHUyMDE0IHRoZSByb3N0ZXIgY2Fubm90IGRyaWZ0IGJhY2tcbiAqIHNpbGVudGx5LCB3aGljaCBpcyB0aGUgcHJvcGVydHkgYSBzZWNvbmQgaGFuZC1jb3B5IGNvdWxkIG5vdCBoYXZlLlxuICpcbiAqIFRoZSBzdHJpbmdzIGFyZSB0aGUgbGFuZ3VhZ2UgcGFja3MnIG93biwgY29waWVkIGZyb21cbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zLzxsb2NhbGU+L29iamVjdHMucGlwZWxpbmUudHNgXG4gKiAoYGNybV9sZWFkLmZpZWxkcy5sZWFkX3NvdXJjZS5vcHRpb25zYDsgamEtSlAgcmVzb2x2ZXMgdGhlbSB0aHJvdWdoXG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9fc2hhcmVkLnRzYCksIHNvIHRoZSBmaWx0ZXIgYmFyIGRvZXMgbm90IGNvaW4gYVxuICogc2Vjb25kIHZvY2FidWxhcnkgZm9yIGEgdmFsdWUgdGhlIHJlY29yZCBwYWdlIGFscmVhZHkgbGFiZWxzLiBUaGV5IGFyZVxuICogc3BlbGxlZCBpbmxpbmUgcmF0aGVyIHRoYW4gcmVhY2hlZCB0aHJvdWdoIGBHbG9iYWxGaWx0ZXJTY2hlbWEub2JqZWN0YCxcbiAqIHdoaWNoIGlzIGluZXJ0IGluIHRoaXMgQ29uc29sZSBidWlsZCBcdTIwMTQgbWVhc3VyZWQgb24gIzE4MjIsIHNlZSBgLi9pbmRleC50c2AuXG4gKi9cbmNvbnN0IExFQURfU09VUkNFX0ZJTFRFUl9MQUJFTFM6IFJlY29yZDxcbiAgc3RyaW5nLFxuICBJbmxpbmVMb2NhbGVNYXAgJiBSZWNvcmQ8J2VuJyB8ICd6aC1DTicgfCAnZXMtRVMnIHwgJ2phLUpQJywgc3RyaW5nPlxuPiA9IHtcbiAgd2ViOiAgICAgICAgICAgICB7IGVuOiAnV2ViJywgICAgICAgICAgICAgJ3poLUNOJzogJ1x1N0Y1MVx1N0FEOScsICAgICAgJ2VzLUVTJzogJ1dlYicsICAgICAgICAgICAgICAgICdqYS1KUCc6ICdcdTMwQTZcdTMwQTdcdTMwRDYnIH0sXG4gIHJlZmVycmFsOiAgICAgICAgeyBlbjogJ1JlZmVycmFsJywgICAgICAgICd6aC1DTic6ICdcdTYzQThcdTgzNTAnLCAgICAgICdlcy1FUyc6ICdSZWZlcmVuY2lhJywgICAgICAgICAnamEtSlAnOiAnXHU3RDM5XHU0RUNCJyB9LFxuICBldmVudDogICAgICAgICAgIHsgZW46ICdFdmVudCAvIFRyYWRlIFNob3cnLCAnemgtQ04nOiAnXHU2RDNCXHU1MkE4IC8gXHU1QzU1XHU0RjFBJywgJ2VzLUVTJzogJ0V2ZW50byAvIEZlcmlhJywgJ2phLUpQJzogJ1x1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOFx1MzBGQlx1NUM1NVx1NzkzQVx1NEYxQScgfSxcbiAgd2ViaW5hcjogICAgICAgICB7IGVuOiAnV2ViaW5hcicsICAgICAgICAgJ3poLUNOJzogJ1x1N0VCRlx1NEUwQVx1NzgxNFx1OEJBOFx1NEYxQScsICdlcy1FUyc6ICdTZW1pbmFyaW8gV2ViJywgICAgICAnamEtSlAnOiAnXHUzMEE2XHUzMEE3XHUzMEQzXHUzMENBXHUzMEZDJyB9LFxuICBwYXJ0bmVyOiAgICAgICAgIHsgZW46ICdQYXJ0bmVyJywgICAgICAgICAnemgtQ04nOiAnXHU1NDA4XHU0RjVDXHU0RjE5XHU0RjM0JywgICAnZXMtRVMnOiAnU29jaW8nLCAgICAgICAgICAgICAgJ2phLUpQJzogJ1x1MzBEMVx1MzBGQ1x1MzBDOFx1MzBDQVx1MzBGQycgfSxcbiAgYWR2ZXJ0aXNlbWVudDogICB7IGVuOiAnQWR2ZXJ0aXNlbWVudCcsICAgJ3poLUNOJzogJ1x1NUU3Rlx1NTQ0QScsICAgICAgJ2VzLUVTJzogJ1B1YmxpY2lkYWQnLCAgICAgICAgICdqYS1KUCc6ICdcdTVFODNcdTU0NEEnIH0sXG4gIHBhaWRfc2VhcmNoOiAgICAgeyBlbjogJ1BhaWQgU2VhcmNoJywgICAgICd6aC1DTic6ICdcdTRFRDhcdThEMzlcdTY0MUNcdTdEMjInLCAgICdlcy1FUyc6ICdCXHUwMEZBc3F1ZWRhIGRlIFBhZ28nLCAgICdqYS1KUCc6ICdcdTY3MDlcdTY1OTlcdTY5MUNcdTdEMjInIH0sXG4gIHNvY2lhbDogICAgICAgICAgeyBlbjogJ1NvY2lhbCBNZWRpYScsICAgICd6aC1DTic6ICdcdTc5M0VcdTRFQTRcdTVBOTJcdTRGNTMnLCAgICdlcy1FUyc6ICdSZWRlcyBTb2NpYWxlcycsICAgICAnamEtSlAnOiAnXHUzMEJEXHUzMEZDXHUzMEI3XHUzMEUzXHUzMEVCXHUzMEUxXHUzMEM3XHUzMEEzXHUzMEEyJyB9LFxuICBjb250ZW50OiAgICAgICAgIHsgZW46ICdDb250ZW50IC8gQmxvZycsICAnemgtQ04nOiAnXHU1MTg1XHU1QkI5IC8gXHU1MzVBXHU1QkEyJywgJ2VzLUVTJzogJ0NvbnRlbmlkbyAvIEJsb2cnLCAgJ2phLUpQJzogJ1x1MzBCM1x1MzBGM1x1MzBDNlx1MzBGM1x1MzBDNFx1MzBGQlx1MzBENlx1MzBFRFx1MzBCMCcgfSxcbiAgY29sZF9jYWxsOiAgICAgICB7IGVuOiAnQ29sZCBDYWxsJywgICAgICAgJ3poLUNOJzogJ1x1OTY0Q1x1NzUxRlx1NjJEQ1x1OEJCRicsICAgJ2VzLUVTJzogJ0xsYW1hZGEgZW4gRnJcdTAwRURvJywgICAgJ2phLUpQJzogJ1x1MzBCM1x1MzBGQ1x1MzBFQlx1MzBDOVx1MzBCM1x1MzBGQ1x1MzBFQicgfSxcbiAgZW1haWxfY2FtcGFpZ246ICB7IGVuOiAnRW1haWwgQ2FtcGFpZ24nLCAgJ3poLUNOJzogJ1x1OTBBRVx1NEVGNlx1ODQyNVx1OTUwMCcsICAgJ2VzLUVTJzogJ0NhbXBhXHUwMEYxYSBkZSBFbWFpbCcsICAgJ2phLUpQJzogJ1x1MzBFMVx1MzBGQ1x1MzBFQlx1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGMycgfSxcbiAgb3RoZXI6ICAgICAgICAgICB7IGVuOiAnT3RoZXInLCAgICAgICAgICAgJ3poLUNOJzogJ1x1NTE3Nlx1NEVENicsICAgICAgJ2VzLUVTJzogJ090cm8nLCAgICAgICAgICAgICAgICdqYS1KUCc6ICdcdTMwNURcdTMwNkVcdTRFRDYnIH0sXG59O1xuXG4vKipcbiAqIEV4ZWN1dGl2ZSBPdmVydmlldyBEYXNoYm9hcmRcbiAqXG4gKiBIaWdoLWxldmVsIHJldmVudWUsIGN1c3RvbWVyLCBhbmQgcGlwZWxpbmUgS1BJcyBmb3IgY29tcGFueSBsZWFkZXJzaGlwLlxuICpcbiAqIFdpZGdldHMgaGVyZSBhcmUgZGF0YXNldC1ib3VuZCAoQURSLTAwMjEpLCBhbmQgdGhlIGNvbnNvbGUncyBkYXRhc2V0IHdpZGdldFxuICogcmVhZHMgT05MWTogdHlwZSwgZGF0YXNldCwgZGltZW5zaW9ucywgdmFsdWVzLCBmaWx0ZXIsIGZpbHRlckJpbmRpbmdzLCBhbmRcbiAqIGxheW91dC4gSXQgYnVpbGRzIGNoYXJ0cyBhbmQgdGFibGVzIGZyb20gdGhlIGRhdGFzZXQncyBvd24gZmllbGQgbWV0YWRhdGFcbiAqIChsYWJlbHMsIGZvcm1hdHMpLCBzbyBwZXItd2lkZ2V0IGBjaGFydENvbmZpZ2AsIGBjb2xvclZhcmlhbnRgLCB3aWRnZXQtbGV2ZWxcbiAqIGBhY3Rpb24qYCwgYW5kIGZyZWUtZm9ybSBgb3B0aW9uc2AgKGljb25zLCBmb3JtYXRzLCBzdGF0aWMgdHJlbmRzLCB0YWJsZVxuICogY29sdW1uIHNwZWNzKSBhcmUgbmV2ZXIgcmVhZCBcdTIwMTQgZG9uJ3QgcmUtYWRkIHRoZW0uIEluIHBhcnRpY3VsYXIsIG1ldHJpYy10aWxlXG4gKiB0cmVuZCBkZWx0YXMgbXVzdCBjb21lIGZyb20gcmVhbCBjb21wYXJpc29uIHF1ZXJpZXMgKHdpZGdldCBgY29tcGFyZVRvYClcbiAqIG9uY2UgdGhlIHJlbmRlcmVyIHN1cHBvcnRzIHRoZW0gZm9yIGRhdGFzZXQgbWV0cmljczsgaGFyZGNvZGVkIHBlcmNlbnRhZ2VzXG4gKiBwcmV2aW91c2x5IGNhcnJpZWQgaGVyZSB3ZXJlIGZhYnJpY2F0aW9ucyBhbmQgd2VyZSByZW1vdmVkICgjNTAwKS5cbiAqIERhdGUgYnVja2V0aW5nIGlzIGxpa2V3aXNlIHNlcnZlci1zaWRlIChhIGRhdGFzZXQgZGltZW5zaW9uJ3NcbiAqIGBkYXRlR3JhbnVsYXJpdHlgLCBub3Qgd2lkZ2V0IG9wdGlvbnMpIFx1MjAxNCBidXQgc2VlIHRoZSBub3RlIGluXG4gKiBgb3Bwb3J0dW5pdHlfbWV0cmljc2AgZm9yIHdoeSB0aGUgdHJlbmQgd2lkZ2V0cyBzdGlsbCBncm91cCBieSByYXcgZGF0ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBFeGVjdXRpdmVEYXNoYm9hcmQ6IERhc2hib2FyZCA9IHtcbiAgbmFtZTogJ2V4ZWN1dGl2ZV9kYXNoYm9hcmQnLFxuICBsYWJlbDogJ0V4ZWN1dGl2ZSBPdmVydmlldycsXG4gIGRlc2NyaXB0aW9uOiAnSGlnaC1sZXZlbCByZXZlbnVlLCBjdXN0b21lciwgYW5kIHBpcGVsaW5lIEtQSXMgZm9yIGxlYWRlcnNoaXAnLFxuXG4gIGNvbHVtbnM6IDEyLFxuICBnYXA6IDQsXG4gIHJlZnJlc2hJbnRlcnZhbFNlY29uZHM6IDMwMCwgLy8gNSBtaW51dGVzXG5cbiAgaGVhZGVyOiB7XG4gICAgc2hvd1RpdGxlOiB0cnVlLFxuICAgIHNob3dEZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAvLyBIZWFkZXIgYWN0aW9uIGJ1dHRvbnMgcmVtb3ZlZDogdGhleSByZWZlcmVuY2VkIGFjdGlvbnMvcm91dGVzIHRoYXQgd2VyZVxuICAgIC8vIG5ldmVyIGltcGxlbWVudGVkIChgZXhwb3J0X2Rhc2hib2FyZF9wZGZgLCBgc2NoZWR1bGVfZGFzaGJvYXJkX2VtYWlsYCxcbiAgICAvLyBgY3VzdG9taXplX2Rhc2hib2FyZGAgYXJlIG5vdCBkZWZpbmVkIGFueXdoZXJlKSwgc28gdGhleSByZW5kZXJlZCBhcyBkZWFkXG4gICAgLy8gYnV0dG9ucy4gUmUtYWRkIHJlYWwsIHdpcmVkLXVwIGFjdGlvbnMgaGVyZSBpZiB0aGVzZSBmZWF0dXJlcyBsYW5kLlxuICB9LFxuXG4gIGRhdGVSYW5nZToge1xuICAgIGZpZWxkOiAnY2xvc2VfZGF0ZScsXG4gICAgZGVmYXVsdFJhbmdlOiAndGhpc19xdWFydGVyJyxcbiAgICBhbGxvd0N1c3RvbVJhbmdlOiB0cnVlLFxuICB9LFxuXG4gIGdsb2JhbEZpbHRlcnM6IFtcbiAgICB7XG4gICAgICBmaWVsZDogJ293bmVyX2lkJyxcbiAgICAgIGxhYmVsOiB7IGVuOiAnT3duZXInLCAnemgtQ04nOiAnXHU4RDFGXHU4RDIzXHU0RUJBJywgJ2VzLUVTJzogJ1Jlc3BvbnNhYmxlJywgJ2phLUpQJzogJ1x1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgc2NvcGU6ICdkYXNoYm9hcmQnLFxuICAgICAgb3B0aW9uc0Zyb206IHsgb2JqZWN0OiAnc3lzX3VzZXInLCB2YWx1ZUZpZWxkOiAnaWQnLCBsYWJlbEZpZWxkOiAnbmFtZScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZpZWxkOiAnbGVhZF9zb3VyY2UnLFxuICAgICAgbGFiZWw6IHsgZW46ICdMZWFkIFNvdXJjZScsICd6aC1DTic6ICdcdTdFQkZcdTdEMjJcdTY3NjVcdTZFOTAnLCAnZXMtRVMnOiAnT3JpZ2VuIGRlbCBQcm9zcGVjdG8nLCAnamEtSlAnOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMEJEXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICBzY29wZTogJ2Rhc2hib2FyZCcsXG4gICAgICAvLyBSb3N0ZXIgZGVyaXZlZCwgd29yZGluZyBmcm9tIHRoZSBsYW5ndWFnZSBwYWNrcyBcdTIwMTQgc2VlXG4gICAgICAvLyBMRUFEX1NPVVJDRV9GSUxURVJfTEFCRUxTIGFib3ZlLiBPcmRlciBmb2xsb3dzIHRoZSBjYW5vbmljYWwgY29uc3RhbnQuXG4gICAgICBvcHRpb25zOiBMRUFEX1NPVVJDRV9PUFRJT05TLm1hcCgoeyB2YWx1ZSB9KSA9PiAoe1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgbGFiZWw6IExFQURfU09VUkNFX0ZJTFRFUl9MQUJFTFNbU3RyaW5nKHZhbHVlKV0sXG4gICAgICB9KSksXG4gICAgfSxcbiAgXSxcblxuICB3aWRnZXRzOiBbXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyAxOiBIZWFkbGluZSBLUElzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGlkOiAndG90YWxfcmV2ZW51ZV95dGQnLFxuICAgICAgdGl0bGU6ICdUb3RhbCBSZXZlbnVlIChZVEQpJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2xvc2VkLXdvbiByZXZlbnVlIHRoaXMgeWVhcicsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGZpbHRlcjogeyBzdGFnZTogJ2Nsb3NlZF93b24nLCBjbG9zZV9kYXRlOiB7ICRndGU6ICd7Y3VycmVudF95ZWFyX3N0YXJ0fScgfSB9LFxuICAgICAgLy8gU2VsZi1zY29wZWQgdG8gWVREOyB3aXRob3V0IHRoaXMgdGhlIGluamVjdGVkIGRhc2hib2FyZCBkYXRlUmFuZ2VcbiAgICAgIC8vIChkZWZhdWx0IHRoaXNfcXVhcnRlcikgaXMgQU5EZWQgaW4gYW5kIHRoZSB0aWxlIHNob3dzIHF1YXJ0ZXIgcmV2ZW51ZS5cbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UgfSxcbiAgICAgIGRhdGFzZXQ6ICdvcHBvcnR1bml0eV9tZXRyaWNzJywgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDAsIHc6IDMsIGg6IDIgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAndG90YWxfYWNjb3VudHMnLFxuICAgICAgdGl0bGU6ICdBY3RpdmUgQWNjb3VudHMnLFxuICAgICAgZGVzY3JpcHRpb246ICdDdXN0b21lcnMgd2l0aCBhdCBsZWFzdCBvbmUgYWN0aXZlIHJlbGF0aW9uc2hpcCcsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGZpbHRlcjogeyBpc19hY3RpdmU6IHRydWUgfSxcbiAgICAgIC8vIGNybV9hY2NvdW50IGhhcyBuZWl0aGVyIGBjbG9zZV9kYXRlYCBub3IgYGxlYWRfc291cmNlYDsgb3B0IHRoaXMgd2lkZ2V0XG4gICAgICAvLyBvdXQgb2YgYm90aCBkYXNoYm9hcmQgZmlsdGVycyBib3VuZCB0byB0aG9zZSBmaWVsZHMuIE9iamVjdFN0YWNrIDE1XG4gICAgICAvLyAoZnJhbWV3b3JrIzI1MDEpIGluamVjdHMgZXZlcnkgZGFzaGJvYXJkIGZpbHRlciAoZGF0ZVJhbmdlICsgZ2xvYmFsRmlsdGVycylcbiAgICAgIC8vIGludG8gZWFjaCB3aWRnZXQncyBxdWVyeSwgc28gYSB3aWRnZXQgb24gYW4gb2JqZWN0IGxhY2tpbmcgYSBmaWx0ZXIgZmllbGRcbiAgICAgIC8vIGZhaWxzIHdpdGggYG5vIHN1Y2ggY29sdW1uYC4gY3JtX2FjY291bnQgRE9FUyBoYXZlIGBvd25lcl9pZGAgKGluamVjdGVkXG4gICAgICAvLyBpbnRvIGV2ZXJ5IGJ1c2luZXNzIG9iamVjdCwgIzU0OCksIHNvIHRoZSBvd25lciBmaWx0ZXIgaXMgbGVmdCB0byBhcHBseS5cbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UsIGxlYWRfc291cmNlOiBmYWxzZSB9LFxuICAgICAgZGF0YXNldDogJ2FjY291bnRfbWV0cmljcycsIHZhbHVlczogWydhY2NvdW50X2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMywgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICd0b3RhbF9jb250YWN0cycsXG4gICAgICB0aXRsZTogJ1RvdGFsIENvbnRhY3RzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUGVvcGxlIGluIG91ciBhZGRyZXNzIGJvb2snLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXJCaW5kaW5nczogeyBkYXRlUmFuZ2U6IGZhbHNlIH0sIC8vIGNybV9jb250YWN0IGhhcyBubyBjbG9zZV9kYXRlIFx1MjAxNCBvcHQgb3V0IG9mIHRoZSBkYXRlIHBpY2tlclxuICAgICAgZGF0YXNldDogJ2NvbnRhY3RfbWV0cmljcycsIHZhbHVlczogWydjb250YWN0X2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogNiwgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdvcGVuX2xlYWRzJyxcbiAgICAgIHRpdGxlOiAnT3BlbiBMZWFkcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1VuY29udmVydGVkIGxlYWRzIGluIHRoZSBmdW5uZWwnLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgaXNfY29udmVydGVkOiBmYWxzZSB9LFxuICAgICAgZmlsdGVyQmluZGluZ3M6IHsgZGF0ZVJhbmdlOiBmYWxzZSB9LCAvLyBjcm1fbGVhZCBoYXMgbm8gY2xvc2VfZGF0ZSBcdTIwMTQgb3B0IG91dCBvZiB0aGUgZGF0ZSBwaWNrZXJcbiAgICAgIGRhdGFzZXQ6ICdsZWFkX21ldHJpY3MnLCB2YWx1ZXM6IFsnbGVhZF9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDksIHk6IDAsIHc6IDMsIGg6IDIgfSxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyAyOiBSZXZlbnVlIEFuYWx5c2lzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGlkOiAncmV2ZW51ZV90cmVuZCcsXG4gICAgICB0aXRsZTogJ1JldmVudWUgVHJlbmQnLFxuICAgICAgZGVzY3JpcHRpb246ICdDbG9zZWQtd29uIHJldmVudWUgb3ZlciB0aGUgbGFzdCAxMiBtb250aHMnLFxuICAgICAgdHlwZTogJ2FyZWEnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiAnY2xvc2VkX3dvbicsIGNsb3NlX2RhdGU6IHsgJGd0ZTogJ3sxMl9tb250aHNfYWdvfScgfSB9LFxuICAgICAgZmlsdGVyQmluZGluZ3M6IHsgZGF0ZVJhbmdlOiBmYWxzZSB9LCAvLyBzZWxmLXNjb3BlZCB0byAxMiBtb250aHMgXHUyMDE0IHRoZSBkYXRlIHBpY2tlciBtdXN0IG5vdCBuYXJyb3cgaXRcbiAgICAgIGRhdGFzZXQ6ICdvcHBvcnR1bml0eV9tZXRyaWNzJywgZGltZW5zaW9uczogWydjbG9zZV9kYXRlJ10sIHZhbHVlczogWyd0b3RhbF9hbW91bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAyLCB3OiA4LCBoOiA0IH0sXG4gICAgICAvLyBEZWZhdWx0IHJlbmRlcmluZyBpcyBpbnRlbnRpb25hbDogdGhlIGRhdGFzZXQgd2lkZ2V0IHBsb3RzIHRoZSBzZWxlY3RlZFxuICAgICAgLy8gZGltZW5zaW9uIFx1MDBENyB2YWx1ZXMgZGlyZWN0bHk7IGEgY2hhcnRDb25maWcgd291bGQgZHVwbGljYXRlIHRoZW0gaW5lcnRseS5cbiAgICAgIHN1cHByZXNzV2FybmluZ3M6IFsnY2hhcnQtY29uZmlnLW1pc3NpbmcnXSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAncmV2ZW51ZV9ieV9pbmR1c3RyeScsXG4gICAgICB0aXRsZTogJ1JldmVudWUgYnkgSW5kdXN0cnknLFxuICAgICAgZGVzY3JpcHRpb246ICdZVEQgY2xvc2VkLXdvbiByZXZlbnVlIHNwbGl0IGJ5IGN1c3RvbWVyIGluZHVzdHJ5JyxcbiAgICAgIHR5cGU6ICdkb251dCcsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfd29uJywgY2xvc2VfZGF0ZTogeyAkZ3RlOiAne2N1cnJlbnRfeWVhcl9zdGFydH0nIH0gfSxcbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UgfSwgLy8gc2VsZi1zY29wZWQgdG8gWVREIFx1MjAxNCB0aGUgZGF0ZSBwaWNrZXIgbXVzdCBub3QgbmFycm93IGl0XG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnYWNjb3VudF9pbmR1c3RyeSddLCB2YWx1ZXM6IFsndG90YWxfYW1vdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogOCwgeTogMiwgdzogNCwgaDogNCB9LFxuICAgICAgc3VwcHJlc3NXYXJuaW5nczogWydjaGFydC1jb25maWctbWlzc2luZyddLCAvLyBpbnRlbnRpb25hbCBkZWZhdWx0IHJlbmRlcmluZyAoc2VlIHJldmVudWVfdHJlbmQpXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSb3cgMzogUGlwZWxpbmUgJiBBY3Rpdml0eSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvLyBUaGUgZnVubmVsIG5vdyBjb21lcyBmcm9tIHRoZSBzaGFyZWQgZmFjdG9yeSAoIzUzOSk7IGl0cyByZW1haW5pbmcgaW5lcnRcbiAgICAvLyBjb25maWcgbGl2ZXMgaW4gc2hhcmVkLXdpZGdldHMudHMgYW5kIGlzIG91dCBvZiB0aGlzIFBSJ3Mgc2NvcGUuXG4gICAgcGlwZWxpbmVCeVN0YWdlRnVubmVsV2lkZ2V0KHsgeDogMCwgeTogNiwgdzogNiwgaDogNCB9KSxcbiAgICB7XG4gICAgICBpZDogJ25ld19hY2NvdW50c19ieV9tb250aCcsXG4gICAgICB0aXRsZTogJ05ldyBBY2NvdW50cycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0FjY291bnQgY3JlYXRpb24gY2FkZW5jZSBcdTIwMTQgbGFzdCA2IG1vbnRocycsXG4gICAgICB0eXBlOiAnYmFyJyxcbiAgICAgIGZpbHRlcjogeyBjcmVhdGVkX2F0OiB7ICRndGU6ICd7Nl9tb250aHNfYWdvfScgfSB9LFxuICAgICAgZmlsdGVyQmluZGluZ3M6IHsgZGF0ZVJhbmdlOiBmYWxzZSwgbGVhZF9zb3VyY2U6IGZhbHNlIH0sIC8vIGNybV9hY2NvdW50IGhhcyBubyBjbG9zZV9kYXRlL2xlYWRfc291cmNlOyBzY29wZXMgaXRzZWxmIGJ5IGNyZWF0ZWRfYXRcbiAgICAgIGRhdGFzZXQ6ICdhY2NvdW50X21ldHJpY3MnLCBkaW1lbnNpb25zOiBbJ2NyZWF0ZWRfYXQnXSwgdmFsdWVzOiBbJ2FjY291bnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiA2LCB5OiA2LCB3OiA2LCBoOiA0IH0sXG4gICAgICBzdXBwcmVzc1dhcm5pbmdzOiBbJ2NoYXJ0LWNvbmZpZy1taXNzaW5nJ10sIC8vIGludGVudGlvbmFsIGRlZmF1bHQgcmVuZGVyaW5nIChzZWUgcmV2ZW51ZV90cmVuZClcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyA0OiBSZXZlbnVlIGJ5IEluZHVzdHJ5IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vIEEgZGFzaGJvYXJkIGB0YWJsZWAgYmluZHMgdG8gYW4gYW5hbHl0aWNzIGN1YmUsIHNvIGl0IGFnZ3JlZ2F0ZXMgcmF0aGVyXG4gICAgLy8gdGhhbiBsaXN0aW5nIHJhdyBhY2NvdW50cyAoQURSLTAwMjEpLiBUaGUgcHJldmlvdXMgXCJUb3AgQWNjb3VudHMgYnlcbiAgICAvLyBSZXZlbnVlXCIgdGFibGUgc2VsZWN0ZWQgb25seSB0aGUgYGFjY291bnRfY291bnRgIG1lYXN1cmUgd2l0aCBub1xuICAgIC8vIGRpbWVuc2lvbiBcdTIwMTQgYSBzaW5nbGUgc3VtbWFyeSByb3csIG5vdCBhIGN1c3RvbWVyIHJhbmtpbmcuIEdyb3VwaW5nIGJ5XG4gICAgLy8gaW5kdXN0cnkgZ2l2ZXMgYSByZWFsIG11bHRpLXJvdyBicmVha2Rvd24gb2YgYm9vay1vZi1idXNpbmVzcyBieSBzZWN0b3I7XG4gICAgLy8gZm9yIGEgcGVyLWFjY291bnQgbGlzdCwgdXNlIGFuIG9iamVjdC1ib3VuZCBMaXN0VmlldyAoQURSLTAwMTcpLlxuICAgIC8vIENvbHVtbiBoZWFkZXJzIGFuZCBudW1iZXIgZm9ybWF0cyBjb21lIGZyb20gdGhlIGRhdGFzZXQncyBkaW1lbnNpb24gYW5kXG4gICAgLy8gbWVhc3VyZSBtZXRhZGF0YS5cbiAgICB7XG4gICAgICBpZDogJ2FjY291bnRzX2J5X2luZHVzdHJ5JyxcbiAgICAgIHRpdGxlOiAnQWNjb3VudHMgYnkgSW5kdXN0cnknLFxuICAgICAgZGVzY3JpcHRpb246ICdUb3RhbCBhbm51YWwgcmV2ZW51ZSBhbmQgYWNjb3VudCBjb3VudCBwZXIgaW5kdXN0cnknLFxuICAgICAgdHlwZTogJ3RhYmxlJyxcbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UsIGxlYWRfc291cmNlOiBmYWxzZSB9LCAvLyBjcm1fYWNjb3VudCBoYXMgbm8gY2xvc2VfZGF0ZS9sZWFkX3NvdXJjZSBcdTIwMTQgb3B0IG91dCBvZiBib3RoXG4gICAgICBkYXRhc2V0OiAnYWNjb3VudF9tZXRyaWNzJywgZGltZW5zaW9uczogWydpbmR1c3RyeSddLCB2YWx1ZXM6IFsnYW5udWFsX3JldmVudWVfc3VtJywgJ2FjY291bnRfY291bnQnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAxMCwgdzogMTIsIGg6IDQgfSxcbiAgICB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Rhc2hib2FyZHMvc2FsZXMuZGFzaGJvYXJkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Rhc2hib2FyZHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGFzaGJvYXJkcy9zYWxlcy5kYXNoYm9hcmQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRGFzaGJvYXJkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuaW1wb3J0IHsgYXZnRGVhbFNpemVNZXRyaWNXaWRnZXQsIHBpcGVsaW5lQnlTdGFnZUZ1bm5lbFdpZGdldCB9IGZyb20gJy4vc2hhcmVkLXdpZGdldHMnO1xuXG4vKipcbiAqIFNhbGVzIFBlcmZvcm1hbmNlIERhc2hib2FyZFxuICpcbiAqIFBpcGVsaW5lIGFuYWx5dGljcywgd2luIHJhdGUgdHJlbmRzLCBhbmQgcmVwIHBlcmZvcm1hbmNlIGZvciB0aGUgc2FsZXMgdGVhbS5cbiAqIE1vZGVsZWQgYWZ0ZXIgdGhlIHBvbGlzaGVkIENSTSBkYXNoYm9hcmQgcmVmZXJlbmNlIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vb2JqZWN0c3RhY2stYWkvb2JqZWN0dWkvdHJlZS9tYWluL2V4YW1wbGVzL2NybS5cbiAqXG4gKiBObyBLUEkgdGlsZSBkZWNsYXJlcyBhIGB0cmVuZGAuIEEgcGVyaW9kLW92ZXItcGVyaW9kIGRlbHRhIGlzIGEgbWVhc3VyZW1lbnQsXG4gKiBzbyBpdCBoYXMgdG8gY29tZSBmcm9tIGEgcmVhbCBjb21wYXJpc29uIHF1ZXJ5ICh3aWRnZXQgYGNvbXBhcmVUb2ApIG9uY2UgdGhlXG4gKiByZW5kZXJlciBzdXBwb3J0cyBpdCBmb3IgZGF0YXNldCBtZXRyaWNzIFx1MjAxNCB0aGUgcGVyY2VudGFnZXMgdGhpcyBmaWxlIHVzZWQgdG9cbiAqIGNhcnJ5IHdlcmUgdHlwZWQgYnkgaGFuZCBhbmQgcmVjb21wdXRlZCBieSBub3RoaW5nLCBzbyB0aGV5IGtlcHQgYXNzZXJ0aW5nXG4gKiB0aGUgc2FtZSBcIis4LjQlIHZzIGxhc3QgcXVhcnRlclwiIG9uIGFueSBkYXRhLCBpbmNsdWRpbmcgYW4gZW1wdHkgZGF0YWJhc2UuXG4gKiBTYW1lIHJ1bGUgYXMgdGhlIGV4ZWN1dGl2ZSBkYXNoYm9hcmQgKCM1MDAsICM1ODcpLlxuICovXG5leHBvcnQgY29uc3QgU2FsZXNEYXNoYm9hcmQ6IERhc2hib2FyZCA9IHtcbiAgbmFtZTogJ3NhbGVzX2Rhc2hib2FyZCcsXG4gIGxhYmVsOiAnU2FsZXMgUGVyZm9ybWFuY2UnLFxuICBkZXNjcmlwdGlvbjogJ1BpcGVsaW5lIGFuYWx5dGljcywgd2luIHJhdGUgdHJlbmRzLCBhbmQgcmVwIHBlcmZvcm1hbmNlJyxcblxuICBjb2x1bW5zOiAxMixcbiAgZ2FwOiA0LFxuICByZWZyZXNoSW50ZXJ2YWxTZWNvbmRzOiAxODAsIC8vIDMgbWludXRlc1xuXG4gIGhlYWRlcjoge1xuICAgIHNob3dUaXRsZTogdHJ1ZSxcbiAgICAvLyBLZWVwIHRoZSBvcGVuaW5nIEtQSSByb3cgaW4gdGhlIGZpcnN0IHZpZXdwb3J0IGZvciBhIGxpdmUgZGVtby4gVGhlXG4gICAgLy8gZGVzY3JpcHRpb24gcmVtYWlucyBhdmFpbGFibGUgaW4gZGFzaGJvYXJkIG1ldGFkYXRhIGFuZCB0cmFuc2xhdGlvbnMuXG4gICAgc2hvd0Rlc2NyaXB0aW9uOiBmYWxzZSxcbiAgICAvLyBIZWFkZXIgYWN0aW9uIGJ1dHRvbnMgcmVtb3ZlZDogYGNyZWF0ZV9vcHBvcnR1bml0eWAgLyBgZXhwb3J0X2Rhc2hib2FyZF9wZGZgXG4gICAgLy8gYXJlIG5vdCBkZWZpbmVkIGFjdGlvbnMsIGFuZCBgL3JlcG9ydHMvZm9yZWNhc3RgIG1hdGNoZXMgbm8gcmVwb3J0IHJvdXRlIFx1MjAxNFxuICAgIC8vIGFsbCB0aHJlZSB3ZXJlIGRlYWQuIFJlLWFkZCByZWFsLCB3aXJlZC11cCBhY3Rpb25zIGhlcmUgd2hlbiBhdmFpbGFibGUuXG4gIH0sXG5cbiAgZGF0ZVJhbmdlOiB7XG4gICAgZmllbGQ6ICdjbG9zZV9kYXRlJyxcbiAgICBkZWZhdWx0UmFuZ2U6ICd0aGlzX3F1YXJ0ZXInLFxuICAgIGFsbG93Q3VzdG9tUmFuZ2U6IHRydWUsXG4gIH0sXG5cbiAgZ2xvYmFsRmlsdGVyczogW1xuICAgIHtcbiAgICAgIGZpZWxkOiAnb3duZXJfaWQnLFxuICAgICAgbGFiZWw6IHsgZW46ICdTYWxlcyBSZXAnLCAnemgtQ04nOiAnXHU5NTAwXHU1NTJFXHU0RUUzXHU4ODY4JywgJ2VzLUVTJzogJ1JlcHJlc2VudGFudGUgZGUgVmVudGFzJywgJ2phLUpQJzogJ1x1NTVCNlx1Njk2RFx1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgc2NvcGU6ICdkYXNoYm9hcmQnLFxuICAgICAgb3B0aW9uc0Zyb206IHsgb2JqZWN0OiAnc3lzX3VzZXInLCB2YWx1ZUZpZWxkOiAnaWQnLCBsYWJlbEZpZWxkOiAnbmFtZScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZpZWxkOiAndHlwZScsXG4gICAgICBsYWJlbDogeyBlbjogJ0RlYWwgVHlwZScsICd6aC1DTic6ICdcdTU1NDZcdTY3M0FcdTdDN0JcdTU3OEInLCAnZXMtRVMnOiAnVGlwbyBkZSBPcG9ydHVuaWRhZCcsICdqYS1KUCc6ICdcdTU1NDZcdThBQzdcdTMwQkZcdTMwQTRcdTMwRDcnIH0sXG4gICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgIHNjb3BlOiAnZGFzaGJvYXJkJyxcbiAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgeyB2YWx1ZTogJ25ld19idXNpbmVzcycsICAgICAgIGxhYmVsOiB7IGVuOiAnTmV3IEJ1c2luZXNzJywgJ3poLUNOJzogJ1x1NjVCMFx1NEUxQVx1NTJBMScsICdlcy1FUyc6ICdOdWV2byBOZWdvY2lvJywgJ2phLUpQJzogJ1x1NjVCMFx1ODk4Rlx1MzBEM1x1MzBCOFx1MzBDRFx1MzBCOScgfSB9LFxuICAgICAgICB7IHZhbHVlOiAnZXhpc3RpbmdfdXBncmFkZScsICAgbGFiZWw6IHsgZW46ICdFeGlzdGluZyBDdXN0b21lciAtIFVwZ3JhZGUnLCAnemgtQ04nOiAnXHU4MDAxXHU1QkEyXHU2MjM3XHU1MzQ3XHU3RUE3JywgJ2VzLUVTJzogJ0NsaWVudGUgRXhpc3RlbnRlIC0gTWVqb3JhJywgJ2phLUpQJzogJ1x1NjVFMlx1NUI1OFx1OTg2N1x1NUJBMiAtIFx1MzBBMlx1MzBDM1x1MzBEN1x1MzBCMFx1MzBFQ1x1MzBGQ1x1MzBDOScgfSB9LFxuICAgICAgICB7IHZhbHVlOiAnZXhpc3RpbmdfcmVuZXdhbCcsICAgbGFiZWw6IHsgZW46ICdFeGlzdGluZyBDdXN0b21lciAtIFJlbmV3YWwnLCAnemgtQ04nOiAnXHU4MDAxXHU1QkEyXHU2MjM3XHU3RUVEXHU3RUE2JywgJ2VzLUVTJzogJ0NsaWVudGUgRXhpc3RlbnRlIC0gUmVub3ZhY2lcdTAwRjNuJywgJ2phLUpQJzogJ1x1NjVFMlx1NUI1OFx1OTg2N1x1NUJBMiAtIFx1NjZGNFx1NjVCMCcgfSB9LFxuICAgICAgICB7IHZhbHVlOiAnZXhpc3RpbmdfZXhwYW5zaW9uJywgbGFiZWw6IHsgZW46ICdFeGlzdGluZyBDdXN0b21lciAtIEV4cGFuc2lvbicsICd6aC1DTic6ICdcdTgwMDFcdTVCQTJcdTYyMzdcdTYyRDNcdTVDNTUnLCAnZXMtRVMnOiAnQ2xpZW50ZSBFeGlzdGVudGUgLSBFeHBhbnNpXHUwMEYzbicsICdqYS1KUCc6ICdcdTY1RTJcdTVCNThcdTk4NjdcdTVCQTIgLSBcdTYyRTFcdTU5MjcnIH0gfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXSxcblxuICB3aWRnZXRzOiBbXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyAxOiBQaXBlbGluZSBLUElzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGlkOiAndG90YWxfcGlwZWxpbmVfdmFsdWUnLFxuICAgICAgdGl0bGU6ICdUb3RhbCBQaXBlbGluZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1N1bSBvZiBvcGVuIG9wcG9ydHVuaXR5IHZhbHVlJyxcbiAgICAgIHR5cGU6ICdtZXRyaWMnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiB7ICRuaW46IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0gfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsndG90YWxfYW1vdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMCwgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdjbG9zZWRfd29uX3F0ZCcsXG4gICAgICB0aXRsZTogJ0Nsb3NlZCBXb24gKFFURCknLFxuICAgICAgZGVzY3JpcHRpb246ICdSZXZlbnVlIGNsb3NlZCB0aGlzIHF1YXJ0ZXInLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfd29uJywgY2xvc2VfZGF0ZTogeyAkZ3RlOiAne2N1cnJlbnRfcXVhcnRlcl9zdGFydH0nIH0gfSxcbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UgfSwgLy8gc2VsZi1zY29wZWQgdG8gUVREIFx1MjAxNCB0aGUgZGF0ZSBwaWNrZXIgbXVzdCBub3QgcmUtd2luZG93IGl0XG4gICAgICBjb2xvclZhcmlhbnQ6ICdzdWNjZXNzJyxcbiAgICAgIGRhdGFzZXQ6ICdvcHBvcnR1bml0eV9tZXRyaWNzJywgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDMsIHk6IDAsIHc6IDMsIGg6IDIgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnb3Blbl9vcHBvcnR1bml0aWVzJyxcbiAgICAgIHRpdGxlOiAnT3BlbiBPcHBvcnR1bml0aWVzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQWN0aXZlIGRlYWxzIGluIGZsaWdodCcsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGZpbHRlcjogeyBzdGFnZTogeyAkbmluOiBbJ2Nsb3NlZF93b24nLCAnY2xvc2VkX2xvc3QnXSB9IH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdvcmFuZ2UnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsnb3BwX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogNiwgeTogMCwgdzogMywgaDogMiB9LFxuICAgIH0sXG4gICAgYXZnRGVhbFNpemVNZXRyaWNXaWRnZXQoeyB4OiA5LCB5OiAwLCB3OiAzLCBoOiAyIH0sIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnQXZlcmFnZSB2YWx1ZSBvZiBjbG9zZWQtd29uIGRlYWxzIHRoaXMgcXVhcnRlcicsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfd29uJywgY2xvc2VfZGF0ZTogeyAkZ3RlOiAne2N1cnJlbnRfcXVhcnRlcl9zdGFydH0nIH0gfSxcbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UgfSwgLy8gc2VsZi1zY29wZWQgdG8gUVREIFx1MjAxNCB0aGUgZGF0ZSBwaWNrZXIgbXVzdCBub3QgcmUtd2luZG93IGl0XG4gICAgICBjb2xvclZhcmlhbnQ6ICdwdXJwbGUnLFxuICAgIH0pLFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyAyOiBXaW4gLyBMb3NzIEtQSXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBUaGUgcmF0aW8gYW5kIGl0cyB0d28gaW5wdXRzIHNpdCBzaWRlIGJ5IHNpZGUgT04gUFVSUE9TRSAoIzU5MykuIEEgd2luXG4gICAgLy8gcmF0ZSBpcyB0aGUgZmFpbHVyZSBtb2RlICM2MTQgc2hpcHBlZDogYSB3cm9uZyBkZW5vbWluYXRvciByYWlzZXMgbm9cbiAgICAvLyBlcnJvciwgaXQganVzdCBwcmludHMgYSBwbGF1c2libGUgcGVyY2VudGFnZS4gU2hvd2luZyBcIjYyJVwiIG5leHQgdG9cbiAgICAvLyBcIjggd29uXCIgYW5kIFwiNSBsb3N0XCIgbWVhbnMgYSByZWFkZXIgY2FuIGNoZWNrIHRoZSBhcml0aG1ldGljIGF0IGFcbiAgICAvLyBnbGFuY2UsIGFuZCBhIGhhbGYgdGhhdCBzaWxlbnRseSBsb3NlcyBpdHMgZmlsdGVyIHN0b3BzIGJlaW5nIGludmlzaWJsZS5cbiAgICAvL1xuICAgIC8vIEFsbCB0aHJlZSB3aW5kb3dzIGFyZSB0aGUgc2FtZSBzZWxmLXNjb3BlZCAxMiBtb250aHMgKGBkYXRlUmFuZ2U6IGZhbHNlYFxuICAgIC8vIHNvIHRoZSBoZWFkZXIncyBkYXRlIHBpY2tlciBjYW5ub3QgcmUtd2luZG93IG9uZSBvZiB0aGVtIGFuZCBub3QgdGhlXG4gICAgLy8gb3RoZXJzIFx1MjAxNCB0aHJlZSB0aWxlcyBvdmVyIHRocmVlIGRpZmZlcmVudCB3aW5kb3dzIHdvdWxkIGJlIHdvcnNlIHRoYW5cbiAgICAvLyBubyB0aWxlcyBhdCBhbGwpLlxuICAgIHtcbiAgICAgIC8vIE5PVEU6IG5vIGBzdGFnZWAgZmlsdGVyIGhlcmUsIGFuZCB0aGF0IGlzIGRlbGliZXJhdGUuIEJvdGggaGFsdmVzIG9mXG4gICAgICAvLyB0aGUgcmF0aW8gY29tZSBmcm9tIHRoZSBEQVRBU0VUJ3Mgb3duIG1lYXN1cmUgZmlsdGVycyBcdTIwMTQgYHdvbl9jb3VudGBcbiAgICAgIC8vIG92ZXIgY2xvc2VkX3dvbiwgYGRlY2lkZWRfY291bnRgIG92ZXIgY2xvc2VkX3dvbiArIGNsb3NlZF9sb3N0IFx1MjAxNCBzb1xuICAgICAgLy8gb3BlbiBwaXBlbGluZSBpcyBleGNsdWRlZCBieSB0aGUgbWVhc3VyZXMuIEEgd2lkZ2V0LWxldmVsXG4gICAgICAvLyBgc3RhZ2U6IHskaW46IFsuLi5dfWAgZmlsdGVyIHdvdWxkIG5hcnJvdyBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yXG4gICAgICAvLyBhbGlrZSwgd2hpY2ggaXMgaG93IGEgcmF0aW8gcXVpZXRseSBiZWNvbWVzIGEgZGl2aXNpb24gYnkgaXRzZWxmLlxuICAgICAgaWQ6ICd3aW5fcmF0ZV8xMm0nLFxuICAgICAgdGl0bGU6ICdXaW4gUmF0ZSAoMTJNKScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0RlYWxzIHdvbiBhcyBhIHNoYXJlIG9mIGFsbCBkZWFscyBzZXR0bGVkIGluIHRoZSBsYXN0IDEyIG1vbnRocycsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGZpbHRlcjogeyBjbG9zZV9kYXRlOiB7ICRndGU6ICd7MTJfbW9udGhzX2Fnb30nIH0gfSxcbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ3N1Y2Nlc3MnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsnd2luX3JhdGUnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAyLCB3OiA0LCBoOiAyIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ3dvbl9kZWFsc18xMm0nLFxuICAgICAgdGl0bGU6ICdEZWFscyBXb24gKDEyTSknLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgbnVtZXJhdG9yIG9mIHRoZSB3aW4gcmF0ZScsXG4gICAgICB0eXBlOiAnbWV0cmljJyxcbiAgICAgIGZpbHRlcjogeyBjbG9zZV9kYXRlOiB7ICRndGU6ICd7MTJfbW9udGhzX2Fnb30nIH0gfSxcbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2JsdWUnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsnd29uX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogNCwgeTogMiwgdzogNCwgaDogMiB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdsb3N0X2RlYWxzXzEybScsXG4gICAgICB0aXRsZTogJ0RlYWxzIExvc3QgKDEyTSknLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgb3RoZXIgaGFsZiBvZiB0aGUgd2luLXJhdGUgZGVub21pbmF0b3InLFxuICAgICAgdHlwZTogJ21ldHJpYycsXG4gICAgICBmaWx0ZXI6IHsgY2xvc2VfZGF0ZTogeyAkZ3RlOiAnezEyX21vbnRoc19hZ299JyB9IH0sXG4gICAgICBmaWx0ZXJCaW5kaW5nczogeyBkYXRlUmFuZ2U6IGZhbHNlIH0sXG4gICAgICBjb2xvclZhcmlhbnQ6ICdvcmFuZ2UnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCB2YWx1ZXM6IFsnbG9zdF9jb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDgsIHk6IDIsIHc6IDQsIGg6IDIgfSxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyAzOiBQaXBlbGluZSAmIFRyZW5kcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICBwaXBlbGluZUJ5U3RhZ2VGdW5uZWxXaWRnZXQoeyB4OiAwLCB5OiA0LCB3OiA2LCBoOiA0IH0pLFxuICAgIHtcbiAgICAgIGlkOiAnbW9udGhseV9yZXZlbnVlX3RyZW5kJyxcbiAgICAgIHRpdGxlOiAnTW9udGhseSBSZXZlbnVlIFRyZW5kJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2xvc2VkLXdvbiByZXZlbnVlLCBsYXN0IDEyIG1vbnRocycsXG4gICAgICB0eXBlOiAnYXJlYScsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfd29uJywgY2xvc2VfZGF0ZTogeyAkZ3RlOiAnezEyX21vbnRoc19hZ299JyB9IH0sXG4gICAgICBmaWx0ZXJCaW5kaW5nczogeyBkYXRlUmFuZ2U6IGZhbHNlIH0sIC8vIHNlbGYtc2NvcGVkIHRvIDEyIG1vbnRocyBcdTIwMTQgdGhlIGRhdGUgcGlja2VyIG11c3Qgbm90IG5hcnJvdyBpdFxuICAgICAgY29sb3JWYXJpYW50OiAnc3VjY2VzcycsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnY2xvc2VfZGF0ZSddLCB2YWx1ZXM6IFsndG90YWxfYW1vdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogNiwgeTogNCwgdzogNiwgaDogNCB9LFxuICAgICAgY2hhcnRDb25maWc6IHtcbiAgICAgICAgc2hvd0xlZ2VuZDogZmFsc2UsXG4gICAgICAgIHNob3dEYXRhTGFiZWxzOiBmYWxzZSxcbiAgICAgICAgY29sb3JzOiBbJyMxMEI5ODEnXSxcbiAgICAgICAgLy8gTm8gcXVvdGEgYW5ub3RhdGlvbiBsaW5lOiBDaGFydEFubm90YXRpb25TY2hlbWEgb25seSB0YWtlcyBhIFNUQVRJQ1xuICAgICAgICAvLyB2YWx1ZSwgYW5kIHRoZSByZWFsIHF1b3RhcyBsaXZlIHBlci1vd25lci9wZXItcGVyaW9kIGluXG4gICAgICAgIC8vIGNybV9mb3JlY2FzdC5xdW90YSAoc2VlZGVkIDUwMGtcdTIwMTMxLjVNIFx1MjAxNCB0aGUgb2xkIGhhcmRjb2RlZCAxMDAwMDAgd2FzXG4gICAgICAgIC8vIGZpY3Rpb24pLiBRdW90YSB2cy4gYWN0dWFsIGlzIHRoZSBxdW90YV9hdHRhaW5tZW50X2J5X3JlcCB0YWJsZVxuICAgICAgICAvLyBiZWxvdywgYm91bmQgdG8gdGhlIGZvcmVjYXN0X21ldHJpY3MgZGF0YXNldC5cbiAgICAgICAgaW50ZXJhY3Rpb246IHsgdG9vbHRpcHM6IHRydWUsIGJydXNoOiB0cnVlIH0sXG4gICAgICB9LFxuICAgICAgb3B0aW9uczogeyBkYXRlR3JhbnVsYXJpdHk6ICdtb250aCcgfSxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyA0OiBQZXJmb3JtYW5jZSBCcmVha2Rvd24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgaWQ6ICdwaXBlbGluZV9ieV9mb3JlY2FzdF9jYXRlZ29yeScsXG4gICAgICB0aXRsZTogJ1BpcGVsaW5lIGJ5IEZvcmVjYXN0IENhdGVnb3J5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnT3BlbiBwaXBlbGluZSBncm91cGVkIGJ5IHNhbGVzIGZvcmVjYXN0IGNhdGVnb3J5JyxcbiAgICAgIHR5cGU6ICdob3Jpem9udGFsLWJhcicsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6IHsgJG5pbjogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnYmx1ZScsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnZm9yZWNhc3RfY2F0ZWdvcnknXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDgsIHc6IDYsIGg6IDQgfSxcbiAgICAgIGNoYXJ0Q29uZmlnOiB7XG4gICAgICAgIHNob3dMZWdlbmQ6IGZhbHNlLFxuICAgICAgICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgICAgICAgY29sb3JzOiBbJyM0RjQ2RTUnXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2xlYWRfc291cmNlX2JyZWFrZG93bicsXG4gICAgICB0aXRsZTogJ0xlYWQgU291cmNlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnV2hlcmUgb3VyIHBpcGVsaW5lIGlzIGNvbWluZyBmcm9tJyxcbiAgICAgIHR5cGU6ICdkb251dCcsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6IHsgJG5pbjogWydjbG9zZWRfbG9zdCddIH0gfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ3B1cnBsZScsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnbGVhZF9zb3VyY2UnXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDYsIHk6IDgsIHc6IDYsIGg6IDQgfSxcbiAgICAgIGNoYXJ0Q29uZmlnOiB7XG4gICAgICAgIHNob3dMZWdlbmQ6IHRydWUsXG4gICAgICAgIHNob3dEYXRhTGFiZWxzOiB0cnVlLFxuICAgICAgICBjb2xvcnM6IFsnIzRGNDZFNScsICcjMDZCNkQ0JywgJyMxMEI5ODEnLCAnI0Y1OUUwQicsICcjRUY0NDQ0JywgJyM4QjVDRjYnXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSb3cgNTogUmVwIExlYWRlcmJvYXJkIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vIEEgZGFzaGJvYXJkIGB0YWJsZWAgYmluZHMgdG8gYW4gYW5hbHl0aWNzIGN1YmUgYW5kIGFnZ3JlZ2F0ZXM7IGl0IGNhbm5vdFxuICAgIC8vIGxpc3QgcmF3IGRlYWxzIChBRFItMDAyMSkuIFRoZSBwcmV2aW91cyBcIlRvcCBPcGVuIE9wcG9ydHVuaXRpZXNcIiB0YWJsZVxuICAgIC8vIHNlbGVjdGVkIG9ubHkgYG9wcF9jb3VudGAgd2l0aCBubyBkaW1lbnNpb24gXHUyMDE0IG9uZSBzdW1tYXJ5IHJvdywgbm90IGEgZGVhbFxuICAgIC8vIHJhbmtpbmcuIEdyb3VwaW5nIG9wZW4gcGlwZWxpbmUgYnkgb3duZXIgeWllbGRzIGEgcmVwIGxlYWRlcmJvYXJkIChvbmVcbiAgICAvLyByb3cgcGVyIHJlcCkuIEZvciBhIHBlci1kZWFsIGxpc3QsIHN1cmZhY2UgYW4gb2JqZWN0LWJvdW5kIExpc3RWaWV3XG4gICAgLy8gdGhyb3VnaCBhcHAgbmF2aWdhdGlvbiAoQURSLTAwMTcpLlxuICAgIHtcbiAgICAgIGlkOiAnb3Blbl9waXBlbGluZV9ieV9vd25lcicsXG4gICAgICB0aXRsZTogJ09wZW4gUGlwZWxpbmUgYnkgT3duZXInLFxuICAgICAgZGVzY3JpcHRpb246ICdJbi1mbGlnaHQgcGlwZWxpbmUgdmFsdWUsIGRlYWwgY291bnQgYW5kIGF2ZyB3aW4gcHJvYmFiaWxpdHkgcGVyIHJlcCcsXG4gICAgICB0eXBlOiAndGFibGUnLFxuICAgICAgZmlsdGVyOiB7IHN0YWdlOiB7ICRuaW46IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0gfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2RlZmF1bHQnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCBkaW1lbnNpb25zOiBbJ293bmVyJ10sIHZhbHVlczogWyd0b3RhbF9hbW91bnQnLCAnb3BwX2NvdW50JywgJ2F2Z19wcm9iYWJpbGl0eSddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDEyLCB3OiAxMiwgaDogNCB9LFxuICAgICAgb3B0aW9uczoge1xuICAgICAgICBzb3J0Qnk6ICd0b3RhbF9hbW91bnQnLFxuICAgICAgICBzb3J0T3JkZXI6ICdkZXNjJyxcbiAgICAgICAgbGltaXQ6IDEwLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFJvdyA2OiBRdW90YSBBdHRhaW5tZW50IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vIFRoZSByZWFsIHBlci1yZXAgcXVvdGEgZGF0YSAoY3JtX2ZvcmVjYXN0LnF1b3RhKSBzdXJmYWNlZCBhcyBhIHRhYmxlOlxuICAgIC8vIGRhc2hib2FyZCBjaGFydCBhbm5vdGF0aW9ucyBjYW5ub3QgcmVmZXJlbmNlIGEgZGF0YXNldCAoc3RhdGljIHZhbHVlc1xuICAgIC8vIG9ubHkpLCBzbyBxdW90YSB2cy4gYWN0dWFsIGdldHMgaXRzIG93biB3aWRnZXQgaW5zdGVhZCBvZiBhIGZha2UgbGluZS5cbiAgICB7XG4gICAgICBpZDogJ3F1b3RhX2F0dGFpbm1lbnRfYnlfcmVwJyxcbiAgICAgIHRpdGxlOiAnUXVvdGEgQXR0YWlubWVudCBieSBSZXAnLFxuICAgICAgZGVzY3JpcHRpb246ICdDdXJyZW50LXF1YXJ0ZXIgcXVvdGEsIGNsb3NlZCByZXZlbnVlIGFuZCBhdHRhaW5tZW50IHBlciByZXAsIGZyb20gZm9yZWNhc3Qgc25hcHNob3RzJyxcbiAgICAgIHR5cGU6ICd0YWJsZScsXG4gICAgICBjb2xvclZhcmlhbnQ6ICdkZWZhdWx0JyxcbiAgICAgIC8vIGNybV9mb3JlY2FzdCBoYXMgbmVpdGhlciBgY2xvc2VfZGF0ZWAgbm9yIGB0eXBlYDsgb3B0IG91dCBvZiB0aGVcbiAgICAgIC8vIGRhc2hib2FyZCBmaWx0ZXJzIGJvdW5kIHRvIHRob3NlIGZpZWxkcyAoZnJhbWV3b3JrIzI1MDEgaW5qZWN0cyBldmVyeVxuICAgICAgLy8gZGFzaGJvYXJkIGZpbHRlciBpbnRvIGVhY2ggd2lkZ2V0IHF1ZXJ5KS4gYG93bmVyYCBleGlzdHMgYW5kIGFwcGxpZXMuXG4gICAgICBmaWx0ZXJCaW5kaW5nczogeyBkYXRlUmFuZ2U6IGZhbHNlLCB0eXBlOiBmYWxzZSB9LFxuICAgICAgLy8gT05FIHBlcmlvZCwgb3IgdGhlIG51bWJlcnMgYXJlIG5vbnNlbnNlICgjNjE0KS4gYGNybV9mb3JlY2FzdGAgaG9sZHMgYVxuICAgICAgLy8gcm93IHBlciBvd25lciBQRVIgUEVSSU9ELCBhbmQgYHF1b3RhX3N1bWAgLyBgY2xvc2VkX3N1bWAgYXJlIHBsYWluXG4gICAgICAvLyBgc3VtYCBtZWFzdXJlcyBcdTIwMTQgc28gYW4gdW5waW5uZWQgcXVlcnkgYWRkcyB0aGlzIHF1YXJ0ZXIncyBxdW90YSB0byB0aGlzXG4gICAgICAvLyBtb250aCdzIHF1b3RhIHRvIGV2ZXJ5IHNldHRsZWQgcXVhcnRlcidzIHF1b3RhIGFuZCBsYWJlbHMgdGhlIHRvdGFsXG4gICAgICAvLyBcIlF1b3RhXCIuIE9uIHRoZSBzaGlwcGVkIHNlZWRzIHRoYXQgdHVybmVkIGEgcmVwJ3MgcmVhbCAxLDUwMCwwMDBcbiAgICAgIC8vIHF1YXJ0ZXJseSBxdW90YSBpbnRvIDcsOTQwLDAwMCwgd2l0aCBhdHRhaW5tZW50IHdyb25nIGJ5IHRoZSBzYW1lXG4gICAgICAvLyBjb25zdHJ1Y3Rpb24gKDg5JSBpbnN0ZWFkIG9mIDU1JSkuXG4gICAgICAvL1xuICAgICAgLy8gQm90aCBoYWx2ZXMgb2YgdGhlIGtleSBhcmUgbmVlZGVkLiBgcGVyaW9kOiAncXVhcnRlcidgIGFsb25lIHN0aWxsIHN1bXNcbiAgICAgIC8vIGV2ZXJ5IHF1YXJ0ZXIgZXZlciBzbmFwc2hvdHRlZDsgYHBlcmlvZF9zdGFydGAgYWxvbmUgc3RpbGwgbWVyZ2VzIHRoZVxuICAgICAgLy8gcXVhcnRlciByb3cgd2l0aCB0aGUgbW9udGggcm93IHRoYXQgb3BlbnMgdGhlIHNhbWUgcXVhcnRlciAoUTMgYW5kIEp1bHlcbiAgICAgIC8vIGJvdGggc3RhcnQgb24gdGhlIDFzdCkuIFRvZ2V0aGVyIHRoZXkgbmFtZSBleGFjdGx5IG9uZSBzbmFwc2hvdCBwZXJcbiAgICAgIC8vIG93bmVyIFx1MjAxNCB0aGUgc2FtZSAob3duZXIsIHBlcmlvZCwgcGVyaW9kX3N0YXJ0KSB0dXBsZSB0aGUgc25hcHNob3Qgc3dlZXBcbiAgICAgIC8vIHVwc2VydHMgb24gYW5kIHRoZSBvYmplY3QgaW5kZXhlcy5cbiAgICAgIC8vXG4gICAgICAvLyBge2N1cnJlbnRfcXVhcnRlcl9zdGFydH1gIGlzIHJlc29sdmVkIGJ5IHRoZSBBTkFMWVRJQ1MgcGF0aCwgdmVyaWZpZWRcbiAgICAgIC8vIHJhdGhlciB0aGFuIGFzc3VtZWQ6IGBxdWVyeURhdGFzZXRgIHJ1bnMgYm90aCB0aGUgZGF0YXNldCBmaWx0ZXIgYW5kIHRoZVxuICAgICAgLy8gd2lkZ2V0J3MgYHJ1bnRpbWVGaWx0ZXJgIHRocm91Z2ggYHJlc29sdmVGaWx0ZXJUb2tlbnNgLCB3aGljaFxuICAgICAgLy8gdW5kZXJzdGFuZHMgYHsoY3VycmVudHxsYXN0fG5leHQpXyh3ZWVrfG1vbnRofHF1YXJ0ZXJ8eWVhcilfKHN0YXJ0fGVuZCl9YFxuICAgICAgLy8gYW5kIHRocm93cyBgRklMVEVSX1RPS0VOX1VOS05PV05gIG9uIGFueXRoaW5nIGVsc2UuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIExJU1QgcGF0aCByZXNvbHZlcyB0aGUgc2FtZSBtYWNyb3MsIGFuZCBoYXMgc2luY2UgMTcuMC4wLXJjLjA6XG4gICAgICAvLyBgcmVzb2x2ZUZpbHRlclRva2VucygpYCB3YXMgd2lyZWQgaW50byB0aGUgT2JqZWN0UUwgUkVBRCBwYXRoIChvYmplY3RxbFxuICAgICAgLy8gYGZlYXQoZmlsdGVycyk6IGV2YWx1YXRlIHtmaWx0ZXItdG9rZW59IHBsYWNlaG9sZGVycyBzZXJ2ZXItc2lkZWAsXG4gICAgICAvLyAjMzU4MikgYWhlYWQgb2YgdGhlIG1pZGRsZXdhcmUgY2hhaW4sIGNvdmVyaW5nIGBmaW5kYCAvIGBmaW5kT25lYCAvXG4gICAgICAvLyBgY291bnRgIC8gYGFnZ3JlZ2F0ZWAgXHUyMDE0IHRoZSBvbmUgZ2F0ZSBldmVyeSBzZXJ2ZXItc2lkZSByZWFkIHBhc3Nlc1xuICAgICAgLy8gdGhyb3VnaCwgc2F2ZWQtdmlldyBmaWx0ZXJzIGluY2x1ZGVkLiBTbyB0aGlzIHdpZGdldCdzIGZpbHRlciBhbmQgYVxuICAgICAgLy8gc2F2ZWQgdmlldydzIGZpbHRlciBub3cgcmVhZCB0aGUgc2FtZSB3YXksIGFuZCB0aGUgc2libGluZ1xuICAgICAgLy8gYHRoaXNfcXVhcnRlcl9mb3JlY2FzdHNgIGluIGBzcmMvc2FsZXMvdmlld3MvZm9yZWNhc3Qudmlldy50c2AgcGlucyB0aGlzIHNhbWVcbiAgICAgIC8vIHF1YXJ0ZXIgd2l0aCB0aGlzIHNhbWUgbWFjcm8uIE1lYXN1cmVkLCBub3QgaW5mZXJyZWQ6XG4gICAgICAvLyBgdGVzdC9mb3JlY2FzdC1jdXJyZW50LXF1YXJ0ZXItdmlldy50ZXN0LnRzYCBydW5zIGJvdGggZmlsdGVyIHNoYXBlcyBcdTIwMTRcbiAgICAgIC8vIHRoZSBgcGVyaW9kX3N0YXJ0YCBlcXVhbGl0eSAoIzczMCkgYW5kIHRoZSBgY2xvc2VfZGF0ZWAgcmFuZ2UgKCM3NDMpIFx1MjAxNFxuICAgICAgLy8gdGhyb3VnaCBhIHJlYWwgZW5naW5lIGFuZCBwaW5zIGEgdGhyZWUtd2F5IG91dGNvbWUgKGN1cnJlbnQgcXVhcnRlclxuICAgICAgLy8gb25seTogbm90IHplcm8gcm93cywgbm90IGV2ZXJ5IHF1YXJ0ZXIpLiBGaXJzdCB0YWtlbiBvbiAxNy4wLjAtcmMuMjtcbiAgICAgIC8vIFJFLVJVTiAyMDI2LTA5LTAzIG9uIDE3LjIuMCAoIzE0NjcpLCBSRS1SVU4gb24gMTcuMy4wICgjMTY3NiwgdGhlIFBSXG4gICAgICAvLyAjMTU3NyBwaW4pIGFuZCBSRS1SVU4gYWdhaW4gb24gMTcuNC4wIChQUiAjMTgxNCwgIzE4MDcpIFx1MjAxNCBncmVlbiBhbGxcbiAgICAgIC8vIGZvdXIgdGltZXMsIHNvIHRoZSBvdXRjb21lIGhlbGQgb24gZXZlcnkgcGluIGl0IHdhcyB0YWtlbiBvbiwgbm90XG4gICAgICAvLyBvbmx5IHRoZSBmaXJzdC4gTm90IHlldCByZS1ydW4gb24gMTcuNS4wLlxuICAgICAgLy9cbiAgICAgIC8vIFdoYXQgc3Rvb2QgaGVyZSBiZWZvcmUgZGVzY3JpYmVkIHRoZSB0d28gcGF0aHMgYXMgYXN5bW1ldHJpYyBhbmQgdG9sZFxuICAgICAgLy8gdGhlIG5leHQgYXV0aG9yIG5vdCB0byBnZW5lcmFsaXNlIGJldHdlZW4gdGhlbS4gVGhhdCB3YXMgdHJ1ZSBvblxuICAgICAgLy8gQG9iamVjdHN0YWNrIDE2LjEuMCBhbmQgZXhwaXJlZCBhdCByYy4wICgjNzQ0KS5cbiAgICAgIC8vXG4gICAgICAvLyBDb3N0IG9mIHBpbm5pbmcgdG8gdGhlIENVUlJFTlQgcXVhcnRlciByYXRoZXIgdGhhbiB0aGUgbGF0ZXN0IG9uZTogZm9yXG4gICAgICAvLyB0aGUgZmV3IGhvdXJzIGJldHdlZW4gYSBxdWFydGVyIGJvdW5kYXJ5IGFuZCB0aGUgMDM6MDAgc3dlZXAgdGhhdCBvcGVuc1xuICAgICAgLy8gdGhlIG5ldyByb3csIHRoZSB0YWJsZSBpcyBlbXB0eS4gRW1wdHkgaXMgdGhlIGhvbmVzdCBzdGF0ZSBcdTIwMTQgdGhlXG4gICAgICAvLyBhbHRlcm5hdGl2ZSByZW5kZXJzIGxhc3QgcXVhcnRlcidzIGF0dGFpbm1lbnQgdW5kZXIgYSBoZWFkZXIgdGhhdCBzYXlzXG4gICAgICAvLyB0aGlzIG9uZS5cbiAgICAgIGZpbHRlcjogeyBwZXJpb2Q6ICdxdWFydGVyJywgcGVyaW9kX3N0YXJ0OiAne2N1cnJlbnRfcXVhcnRlcl9zdGFydH0nIH0sXG4gICAgICBkYXRhc2V0OiAnZm9yZWNhc3RfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnb3duZXInXSwgdmFsdWVzOiBbJ3F1b3RhX3N1bScsICdjbG9zZWRfc3VtJywgJ2F0dGFpbm1lbnQnXSxcbiAgICAgIGxheW91dDogeyB4OiAwLCB5OiAxNiwgdzogMTIsIGg6IDQgfSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgc29ydEJ5OiAnYXR0YWlubWVudCcsXG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuICAgICAgICBsaW1pdDogMTAsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgUm93IDc6IFdpbiAvIExvc3MgYW5hbHlzaXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBUaHJlZSB3aWRnZXRzIG92ZXIgdGhlIHNldHRsZWQgaGFsZiBvZiB0aGUgcGlwZWxpbmUgKCM1OTMpLiBFYWNoIG9mIHRoZVxuICAgIC8vIHR3byB3aW4tcmF0ZSBicmVha2Rvd25zIGlzIGEgVEFCTEUsIG5vdCBhIGJhciBjaGFydCwgYW5kIHRoYXQgaXMgdGhlXG4gICAgLy8gd2hvbGUgZGVzaWduOiBhIGJhciBvZiBcIjY3JVwiIGlzIHVuZmFsc2lmaWFibGUsIHdoZXJlYXMgYSByb3cgcmVhZGluZ1xuICAgIC8vIFwiV29uIDIgXHUwMEI3IExvc3QgMSBcdTAwQjcgU2V0dGxlZCAzIFx1MDBCNyA2NyVcIiBjYXJyaWVzIGl0cyBvd24gcHJvb2YuIFBlcnR1cmIgZWl0aGVyXG4gICAgLy8gaGFsZiBcdTIwMTQgd2luIGEgZGVhbCB0aGF0IHdhcyBsb3N0LCBvciBsb3NlIG9uZSB0aGF0IHdhcyB3b24gXHUyMDE0IGFuZCB0aHJlZSBvZlxuICAgIC8vIHRob3NlIGZvdXIgbnVtYmVycyBtb3ZlLiBgdGVzdC93aW4tbG9zcy1jYXB0dXJlLnRlc3QudHNgIGRvZXMgZXhhY3RseVxuICAgIC8vIHRoYXQgYWdhaW5zdCB0aGUgcmVhbCBkYXRhc2V0IGV4ZWN1dG9yIGFuZCB0aGUgcmVhbCBzZWVkcy5cbiAgICAvL1xuICAgIC8vIEJvdGggdGFibGVzIG9wdCBvdXQgb2YgdGhlIGhlYWRlcidzIGBjbG9zZV9kYXRlYCB3aW5kb3dcbiAgICAvLyAoYGRhdGVSYW5nZTogZmFsc2VgKSBmb3IgdGhlIHJlYXNvbiB0aGUgcXVvdGEgdGFibGUgZG9lczogYSB3aW4gcmF0ZSBvdmVyXG4gICAgLy8gXCJ0aGlzIHF1YXJ0ZXJcIiBvbiBhIGRlbW8gZGF0YWJhc2UgaXMgY29tcHV0ZWQgZnJvbSB3aGljaGV2ZXIgb25lIG9yIHR3b1xuICAgIC8vIGRlYWxzIGhhcHBlbiB0byBoYXZlIHNldHRsZWQgaW5zaWRlIGl0LCB3aGljaCBpcyBub2lzZSB3ZWFyaW5nIHRoZVxuICAgIC8vIGNvc3R1bWUgb2YgYSBLUEkuIFR3ZWx2ZSBtb250aHMgaXMgdGhlIHNhbWUgd2luZG93IHRoZSByb3ctMiB0aWxlcyBhbmRcbiAgICAvLyB0aGUgcmV2ZW51ZSB0cmVuZCB1c2UsIHNvIHRoZSBkYXNoYm9hcmQgdGVsbHMgb25lIGNvbnNpc3RlbnQgc3RvcnkuXG4gICAge1xuICAgICAgaWQ6ICd3aW5fcmF0ZV9ieV9vd25lcicsXG4gICAgICB0aXRsZTogJ1dpbiAvIExvc3MgYnkgUmVwJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGVhbHMgd29uLCBkZWFscyBsb3N0IGFuZCB3aW4gcmF0ZSBwZXIgcmVwIFx1MjAxNCBsYXN0IDEyIG1vbnRocycsXG4gICAgICB0eXBlOiAndGFibGUnLFxuICAgICAgZmlsdGVyOiB7IGNsb3NlX2RhdGU6IHsgJGd0ZTogJ3sxMl9tb250aHNfYWdvfScgfSB9LFxuICAgICAgZmlsdGVyQmluZGluZ3M6IHsgZGF0ZVJhbmdlOiBmYWxzZSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnZGVmYXVsdCcsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsXG4gICAgICBkaW1lbnNpb25zOiBbJ293bmVyJ10sXG4gICAgICB2YWx1ZXM6IFsnd29uX2NvdW50JywgJ2xvc3RfY291bnQnLCAnZGVjaWRlZF9jb3VudCcsICd3aW5fcmF0ZScsICd3b25fYW1vdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMCwgeTogMjAsIHc6IDYsIGg6IDQgfSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgc29ydEJ5OiAnZGVjaWRlZF9jb3VudCcsXG4gICAgICAgIHNvcnRPcmRlcjogJ2Rlc2MnLFxuICAgICAgICBsaW1pdDogMTAsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICd3aW5fcmF0ZV9ieV9sZWFkX3NvdXJjZScsXG4gICAgICB0aXRsZTogJ1dpbiAvIExvc3MgYnkgTGVhZCBTb3VyY2UnLFxuICAgICAgZGVzY3JpcHRpb246ICdXaGljaCBzb3VyY2VzIHByb2R1Y2UgZGVhbHMgdGhhdCBhY3R1YWxseSBjbG9zZSBcdTIwMTQgbGFzdCAxMiBtb250aHMnLFxuICAgICAgdHlwZTogJ3RhYmxlJyxcbiAgICAgIGZpbHRlcjogeyBjbG9zZV9kYXRlOiB7ICRndGU6ICd7MTJfbW9udGhzX2Fnb30nIH0gfSxcbiAgICAgIGZpbHRlckJpbmRpbmdzOiB7IGRhdGVSYW5nZTogZmFsc2UgfSxcbiAgICAgIGNvbG9yVmFyaWFudDogJ2RlZmF1bHQnLFxuICAgICAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLFxuICAgICAgZGltZW5zaW9uczogWydsZWFkX3NvdXJjZSddLFxuICAgICAgdmFsdWVzOiBbJ3dvbl9jb3VudCcsICdsb3N0X2NvdW50JywgJ2RlY2lkZWRfY291bnQnLCAnd2luX3JhdGUnLCAnd29uX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDYsIHk6IDIwLCB3OiA2LCBoOiA0IH0sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHNvcnRCeTogJ2RlY2lkZWRfY291bnQnLFxuICAgICAgICBzb3J0T3JkZXI6ICdkZXNjJyxcbiAgICAgICAgbGltaXQ6IDEyLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSBsb3NzLXJlYXNvbiBicmVha2Rvd24gdGhlIGZpZWxkcyB3ZXJlIGRlY2xhcmVkIGZvciBhbmQgbmV2ZXIgZ290LlxuICAgICAgLy9cbiAgICAgIC8vIGBsb3NzX3JlYXNvbmAgaXMgbWFuZGF0b3J5IG9uIGV2ZXJ5IGBjbG9zZWRfbG9zdGAgcmVjb3JkIChzZWVcbiAgICAgIC8vIGNybV9vcHBvcnR1bml0eSksIHNvIHRoaXMgY2hhcnQgaGFzIG5vIFwidW5hdHRyaWJ1dGVkXCIgc2xpY2UgdG9cbiAgICAgIC8vIGFwb2xvZ2lzZSBmb3IgXHUyMDE0IGFuIGVtcHR5IGNoYXJ0IGhlcmUgbWVhbnMgbm8gbG9zc2VzIGluIHRoZSB3aW5kb3csXG4gICAgICAvLyBuZXZlciBcIm5vYm9keSBmaWxsZWQgdGhlIGZpZWxkIGluXCIuXG4gICAgICAvL1xuICAgICAgLy8gQ291bnRzLCBub3QgYW1vdW50czogdGhlIHF1ZXN0aW9uIGEgbG9zcyByZXZpZXcgYXNrcyBpcyBcImhvdyBvZnRlbiBkaWRcbiAgICAgIC8vIHdlIGxvc2UgZm9yIHRoaXMgcmVhc29uXCIsIGFuZCBvbmUgbGFyZ2UgbG9zdCBkZWFsIHNob3VsZCBub3Qgb3V0d2VpZ2hcbiAgICAgIC8vIGZpdmUgcmVjdXJyaW5nIGZlYXR1cmUgZ2Fwcy4gYGxvc3RfYW1vdW50YCBpcyBkZWNsYXJlZCBvbiB0aGUgZGF0YXNldFxuICAgICAgLy8gZm9yIHRoZSByZXZlbnVlIHZpZXcgb2YgdGhlIHNhbWUgcXVlc3Rpb24uXG4gICAgICBpZDogJ2xvc3NfcmVhc29uX2JyZWFrZG93bicsXG4gICAgICB0aXRsZTogJ1doeSBXZSBMb3NlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTG9zdCBkZWFscyBieSByZWFzb24gXHUyMDE0IGxhc3QgMTIgbW9udGhzJyxcbiAgICAgIHR5cGU6ICdkb251dCcsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfbG9zdCcsIGNsb3NlX2RhdGU6IHsgJGd0ZTogJ3sxMl9tb250aHNfYWdvfScgfSB9LFxuICAgICAgZmlsdGVyQmluZGluZ3M6IHsgZGF0ZVJhbmdlOiBmYWxzZSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnb3JhbmdlJyxcbiAgICAgIGRhdGFzZXQ6ICdvcHBvcnR1bml0eV9tZXRyaWNzJywgZGltZW5zaW9uczogWydsb3NzX3JlYXNvbiddLCB2YWx1ZXM6IFsnb3BwX2NvdW50J10sXG4gICAgICBsYXlvdXQ6IHsgeDogMCwgeTogMjQsIHc6IDEyLCBoOiA0IH0sXG4gICAgICBjaGFydENvbmZpZzoge1xuICAgICAgICBzaG93TGVnZW5kOiB0cnVlLFxuICAgICAgICBzaG93RGF0YUxhYmVsczogdHJ1ZSxcbiAgICAgICAgY29sb3JzOiBbJyNFRjQ0NDQnLCAnI0Y1OUUwQicsICcjOEI1Q0Y2JywgJyMwNkI2RDQnLCAnIzRGNDZFNScsICcjMTBCOTgxJywgJyM2NDc0OEInXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBSb3cgOTogUGl2b3QgXHUyMDE0IFN0YWdlIFx1MDBENyBMZWFkIFNvdXJjZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBpZDogJ3BpcGVsaW5lX3N0YWdlX2J5X3NvdXJjZScsXG4gICAgICB0aXRsZTogJ1BpcGVsaW5lIGJ5IFN0YWdlIFx1MDBENyBMZWFkIFNvdXJjZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0Nyb3NzLXRhYiBvZiBvcGVuIG9wcG9ydHVuaXR5IGFtb3VudCBieSBzdGFnZSBhbmQgc291cmNlJyxcbiAgICAgIHR5cGU6ICdwaXZvdCcsXG4gICAgICBmaWx0ZXI6IHsgc3RhZ2U6IHsgJG5pbjogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfSB9LFxuICAgICAgY29sb3JWYXJpYW50OiAnZGVmYXVsdCcsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIGRpbWVuc2lvbnM6IFsnc3RhZ2UnLCAnbGVhZF9zb3VyY2UnXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICAgICAgbGF5b3V0OiB7IHg6IDAsIHk6IDI4LCB3OiAxMiwgaDogNCB9LFxuICAgIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHMvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHMvaW5kZXgudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKiBBbmFseXRpY3MgZGF0YXNldCBiYXJyZWwgKEFEUi0wMDIxKS4gKi9cblxuZXhwb3J0IHsgT3Bwb3J0dW5pdHlEYXRhc2V0IH0gZnJvbSAnLi9vcHBvcnR1bml0eS5kYXRhc2V0JztcbmV4cG9ydCB7IEFjY291bnREYXRhc2V0IH0gZnJvbSAnLi9hY2NvdW50LmRhdGFzZXQnO1xuZXhwb3J0IHsgQ29udGFjdERhdGFzZXQgfSBmcm9tICcuL2NvbnRhY3QuZGF0YXNldCc7XG5leHBvcnQgeyBMZWFkRGF0YXNldCB9IGZyb20gJy4vbGVhZC5kYXRhc2V0JztcbmV4cG9ydCB7IFRhc2tEYXRhc2V0IH0gZnJvbSAnLi90YXNrLmRhdGFzZXQnO1xuZXhwb3J0IHsgRXZlbnREYXRhc2V0IH0gZnJvbSAnLi9ldmVudC5kYXRhc2V0JztcbmV4cG9ydCB7IEZvcmVjYXN0RGF0YXNldCB9IGZyb20gJy4vZm9yZWNhc3QuZGF0YXNldCc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0cy9vcHBvcnR1bml0eS5kYXRhc2V0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGFzZXRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGFzZXRzL29wcG9ydHVuaXR5LmRhdGFzZXQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZURhdGFzZXQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogT3Bwb3J0dW5pdHkgYW5hbHl0aWNzIGRhdGFzZXQgKEFEUi0wMDIxKS5cbiAqXG4gKiBUaGUgc2luZ2xlIHNlbWFudGljIHNvdXJjZSBvZiB0cnV0aCBmb3IgcGlwZWxpbmUgbWV0cmljcyBhY3Jvc3MgdGhlIFNhbGVzLFxuICogQ1JNIGFuZCBFeGVjdXRpdmUgZGFzaGJvYXJkcy4gV2lkZ2V0cyBiaW5kIHRvIHRoaXMgZGF0YXNldCBhbmQgc2VsZWN0XG4gKiBtZWFzdXJlcyBCWSBOQU1FIChgdG90YWxfYW1vdW50YCwgYGF2Z19hbW91bnRgLCBgb3BwX2NvdW50YCkgc28gXCJwaXBlbGluZVxuICogcmV2ZW51ZVwiIG1lYW5zIHRoZSBzYW1lIHRoaW5nIGV2ZXJ5d2hlcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eURhdGFzZXQgPSBkZWZpbmVEYXRhc2V0KHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X21ldHJpY3MnLFxuICBsYWJlbDogJ09wcG9ydHVuaXR5IE1ldHJpY3MnLFxuICBkZXNjcmlwdGlvbjogJ1NlbWFudGljIGxheWVyIGZvciBzYWxlcy1waXBlbGluZSBjb3VudHMgYW5kIGFtb3VudHMnLFxuICBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknLFxuXG4gIC8vIEluY2x1ZGUgdGhlIGFjY291bnQgcmVsYXRpb25zaGlwIHNvIGRpbWVuc2lvbnMgY2FuIHRyYXZlcnNlIGl0ICh0aGUgam9pbiBpc1xuICAvLyBkZXJpdmVkIGZyb20gdGhlIGBjcm1fYWNjb3VudGAgbG9va3VwIFx1MjAxNCBubyBoYW5kLXdyaXR0ZW4gT04gY2xhdXNlKS5cbiAgaW5jbHVkZTogWydjcm1fYWNjb3VudCddLFxuXG4gIGRpbWVuc2lvbnM6IFtcbiAgICB7IG5hbWU6ICdzdGFnZScsIGxhYmVsOiAnU3RhZ2UnLCBmaWVsZDogJ3N0YWdlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICB7IG5hbWU6ICdsZWFkX3NvdXJjZScsIGxhYmVsOiAnTGVhZCBTb3VyY2UnLCBmaWVsZDogJ2xlYWRfc291cmNlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICB7IG5hbWU6ICdmb3JlY2FzdF9jYXRlZ29yeScsIGxhYmVsOiAnRm9yZWNhc3QgQ2F0ZWdvcnknLCBmaWVsZDogJ2ZvcmVjYXN0X2NhdGVnb3J5JywgdHlwZTogJ3N0cmluZycgfSxcbiAgICB7IG5hbWU6ICd0eXBlJywgbGFiZWw6ICdEZWFsIFR5cGUnLCBmaWVsZDogJ3R5cGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIC8vIFNlbWFudGljIG5hbWUgYG93bmVyYDsgY29sdW1uIGBvd25lcl9pZGAsIHRoZSBwbGF0Zm9ybSBhbmNob3IgKCM1NDgpLlxuICAgIHsgbmFtZTogJ293bmVyJywgbGFiZWw6ICdPd25lcicsIGZpZWxkOiAnb3duZXJfaWQnLCB0eXBlOiAnbG9va3VwJyB9LFxuICAgIC8vIFdpbi9sb3NzIGF0dHJpYnV0aW9uICgjNTkzKS4gQm90aCBjb2x1bW5zIGFyZSBub3cgbWFuZGF0b3J5IGF0IGNsb3NlXG4gICAgLy8gKGByZXF1aXJlZFdoZW5gIG9uIGNybV9vcHBvcnR1bml0eSksIHNvIGdyb3VwaW5nIGJ5IGVpdGhlciBvbmUgb3ZlclxuICAgIC8vIHNldHRsZWQgZGVhbHMgaGFzIG5vIFwidW5hdHRyaWJ1dGVkXCIgYnVja2V0IHRvIGV4cGxhaW4gYXdheS5cbiAgICB7IG5hbWU6ICd3aW5fcmVhc29uJywgbGFiZWw6ICdXaW4gUmVhc29uJywgZmllbGQ6ICd3aW5fcmVhc29uJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICB7IG5hbWU6ICdsb3NzX3JlYXNvbicsIGxhYmVsOiAnTG9zcyBSZWFzb24nLCBmaWVsZDogJ2xvc3NfcmVhc29uJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAvLyB2MTcgZml4ZXMgc2NvcGVkIGFnZ3JlZ2F0ZSBleGVjdXRpb24gYW5kIFNRTGl0ZSdzIGVwb2NoIGJ1Y2tldGluZy5cbiAgICAvLyBUcmVuZHMgYW5kIHF1YXJ0ZXIgY292ZXJhZ2UgbmVlZCBkaWZmZXJlbnQgYnVja2V0cyBvdmVyIHRoZSBzYW1lIGZpZWxkLFxuICAgIC8vIHNvIGVhY2ggb25lIGlzIGl0cyBvd24gc2VtYW50aWMgZGltZW5zaW9uLlxuICAgIHsgbmFtZTogJ2Nsb3NlX2RhdGUnLCBsYWJlbDogJ0Nsb3NlIERhdGUnLCBmaWVsZDogJ2Nsb3NlX2RhdGUnLCB0eXBlOiAnZGF0ZScsIGRhdGVHcmFudWxhcml0eTogJ21vbnRoJyB9LFxuICAgIHsgbmFtZTogJ2Nsb3NlX3F1YXJ0ZXInLCBsYWJlbDogJ0Nsb3NlIFF1YXJ0ZXInLCBmaWVsZDogJ2Nsb3NlX2RhdGUnLCB0eXBlOiAnZGF0ZScsIGRhdGVHcmFudWxhcml0eTogJ3F1YXJ0ZXInIH0sXG4gICAgLy8gQ3Jvc3Mtb2JqZWN0IGRpbWVuc2lvbjogYWNjb3VudCBpbmR1c3RyeSB2aWEgdGhlIGNybV9hY2NvdW50IHJlbGF0aW9uc2hpcC5cbiAgICB7IG5hbWU6ICdhY2NvdW50X2luZHVzdHJ5JywgbGFiZWw6ICdBY2NvdW50IEluZHVzdHJ5JywgZmllbGQ6ICdjcm1fYWNjb3VudC5pbmR1c3RyeScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIF0sXG5cbiAgbWVhc3VyZXM6IFtcbiAgICB7IG5hbWU6ICdvcHBfY291bnQnLCBsYWJlbDogJ09wcG9ydHVuaXRpZXMnLCBhZ2dyZWdhdGU6ICdjb3VudCcgfSxcbiAgICB7IG5hbWU6ICd0b3RhbF9hbW91bnQnLCBsYWJlbDogJ1RvdGFsIEFtb3VudCcsIGFnZ3JlZ2F0ZTogJ3N1bScsIGZpZWxkOiAnYW1vdW50JywgZm9ybWF0OiAnMCwwJyB9LFxuICAgIHsgbmFtZTogJ2F2Z19hbW91bnQnLCBsYWJlbDogJ0F2ZyBEZWFsIFNpemUnLCBhZ2dyZWdhdGU6ICdhdmcnLCBmaWVsZDogJ2Ftb3VudCcsIGZvcm1hdDogJzAsMCcgfSxcbiAgICB7IG5hbWU6ICdhdmdfcHJvYmFiaWxpdHknLCBsYWJlbDogJ0F2ZyBQcm9iYWJpbGl0eScsIGFnZ3JlZ2F0ZTogJ2F2ZycsIGZpZWxkOiAncHJvYmFiaWxpdHknLCBmb3JtYXQ6ICcwJScgfSxcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBXaW4gcmF0ZSAoIzU5MykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBBIHJhdGlvIGlzIHRoZSBtb3N0IGRhbmdlcm91cyBraW5kIG9mIG1lYXN1cmU6IGEgd3JvbmcgZGVub21pbmF0b3IgZG9lc1xuICAgIC8vIG5vdCBlcnJvciwgaXQgcmV0dXJucyBhIHBsYXVzaWJsZSBudW1iZXIgKCM2MTQgcmVuZGVyZWQgYSAxLDUwMCwwMDBcbiAgICAvLyBxdW90YSBhcyA3LDk0MCwwMDAgYmVjYXVzZSBhIGZpbHRlciB3YXMgbWlzc2luZyBvbmUgb2YgaXRzIHR3byBoYWx2ZXMpLlxuICAgIC8vIFNvIHRoZSB0d28gaGFsdmVzIGFyZSBkZWNsYXJlZCBoZXJlLCBPTkNFLCBhcyBuYW1lZCBtZWFzdXJlcyBcdTIwMTQgbm90XG4gICAgLy8gaW1wcm92aXNlZCBwZXIgd2lkZ2V0IFx1MjAxNCBhbmQgZXZlcnkgd2lkZ2V0IHRoYXQgc2hvd3MgYHdpbl9yYXRlYCBhbHNvXG4gICAgLy8gc2hvd3MgYHdvbl9jb3VudGAgYW5kIGBsb3N0X2NvdW50YCBiZXNpZGUgaXQsIHNvIHRoZSByZWFkZXIgY2FuIGNoZWNrXG4gICAgLy8gdGhlIGFyaXRobWV0aWMgdGhhdCBwcm9kdWNlZCB0aGUgcGVyY2VudGFnZS5cbiAgICAvL1xuICAgIC8vIEVhY2ggY2FycmllcyBpdHMgT1dOIGBmaWx0ZXJgLCB3aGljaCB0aGUgZXhlY3V0b3IgaG9ub3VycyBieSBydW5uaW5nXG4gICAgLy8gdGhhdCBtZWFzdXJlIGFzIGl0cyBvd24gc3ViLXF1ZXJ5IGFuZCBtZXJnaW5nIHRoZSByZXN1bHQgYmFjayBvbiB0aGVcbiAgICAvLyBzZWxlY3RlZCBkaW1lbnNpb25zLiBUaGF0IGlzIHdoYXQgbGV0cyBvbmUgd2lkZ2V0IHJvdyBob2xkIFwid29uIDIsIGxvc3RcbiAgICAvLyAxLCA2NyVcIiBcdTIwMTQgdGhlIGNvdW50cyBhcmUgb3ZlciBkaWZmZXJlbnQgcm93IHNldHMsIGFuZCBvbmx5IGFcbiAgICAvLyBtZWFzdXJlLWxldmVsIGZpbHRlciBjYW4gc2F5IHNvLiBBIHdpZGdldC1sZXZlbCBgZmlsdGVyYCBjYW5ub3Q6IGl0XG4gICAgLy8gbmFycm93cyB0aGUgd2hvbGUgcm93IHNldCBhdCBvbmNlLCB3aGljaCBpcyBleGFjdGx5IGhvdyB5b3UgZW5kIHVwXG4gICAgLy8gZGl2aWRpbmcgYSBudW1iZXIgYnkgaXRzZWxmLlxuICAgIC8vXG4gICAgLy8gYGRlY2lkZWRfY291bnRgIGlzIGRlbGliZXJhdGVseSBpdHMgb3duIGZpbHRlcmVkIGNvdW50IGFuZCBOT1RcbiAgICAvLyBgZGVyaXZlZDogeyBvcDogJ3N1bScsIG9mOiBbJ3dvbl9jb3VudCcsICdsb3N0X2NvdW50J10gfWAuIE1lYXN1cmVkIG9uXG4gICAgLy8gMTcuMC4wLXJjLjE6IGEgZmlsdGVyZWQgbWVhc3VyZSBjb250cmlidXRlcyBOTyByb3cgZm9yIGEgZ3JvdXAgaXRzXG4gICAgLy8gZmlsdGVyIHNlbGVjdHMgbm90aGluZyBpbiBcdTIwMTQgdGhlIGNvdW50IGNvbWVzIGJhY2sgYWJzZW50LCBub3QgMCBcdTIwMTQgYW5kIGFcbiAgICAvLyBkZXJpdmVkIG1lYXN1cmUgb3ZlciBhbiBhYnNlbnQgaW5wdXQgZXZhbHVhdGVzIHRvIG51bGwuIFN1bW1pbmcgdGhlIHR3b1xuICAgIC8vIHdvdWxkIHRoZXJlZm9yZSBibGFuayB0aGUgd2luIHJhdGUgb2YgYW55IHJlcCB3aG8gaGFzIG5ldmVyIGxvc3QgYSBkZWFsXG4gICAgLy8gKDEwMCUsIHRoZSBncm91cCB5b3UgbGVhc3Qgd2FudCB0byBoaWRlKS4gQ291bnRpbmcgdGhlIHVuaW9uIGRpcmVjdGx5XG4gICAgLy8ga2VlcHMgdGhlIGRlbm9taW5hdG9yIHByZXNlbnQgd2hlbmV2ZXIgdGhlIGdyb3VwIGhhcyBhbnkgc2V0dGxlZCBkZWFsIGF0XG4gICAgLy8gYWxsLiBUaGUgcmVtYWluaW5nIGFzeW1tZXRyeSBcdTIwMTQgYSBncm91cCB3aXRoIGxvc3NlcyBidXQgTk8gd2lucyByZXBvcnRzIGFcbiAgICAvLyBudWxsIHdpbiByYXRlIHJhdGhlciB0aGFuIDAlIFx1MjAxNCBpcyBhIHBsYXRmb3JtIGJlaGF2aW91ciwgbm90IHNvbWV0aGluZyBhXG4gICAgLy8gd2lkZ2V0IGNhbiBwYXBlciBvdmVyOyBpdCBpcyBwaW5uZWQgYnkgYHRlc3Qvd2luLWxvc3MtY2FwdHVyZS50ZXN0LnRzYFxuICAgIC8vIGFuZCBmaWxlZCBhcyAjNjU2LiBUaGUgdGFibGVzIHNob3cgYGxvc3RfY291bnRgIG5leHQgdG8gYHdpbl9yYXRlYFxuICAgIC8vIHByZWNpc2VseSBzbyB0aGF0IGEgYmxhbmsgcmF0ZSByZWFkcyBhcyBcIjAgd2lucyBvdXQgb2YgM1wiLCBub3QgYXNcbiAgICAvLyBcIm5vIGRhdGFcIi5cbiAgICB7IG5hbWU6ICd3b25fY291bnQnLCBsYWJlbDogJ1dvbiBEZWFscycsIGFnZ3JlZ2F0ZTogJ2NvdW50JywgZmlsdGVyOiB7IHN0YWdlOiAnY2xvc2VkX3dvbicgfSB9LFxuICAgIHsgbmFtZTogJ2xvc3RfY291bnQnLCBsYWJlbDogJ0xvc3QgRGVhbHMnLCBhZ2dyZWdhdGU6ICdjb3VudCcsIGZpbHRlcjogeyBzdGFnZTogJ2Nsb3NlZF9sb3N0JyB9IH0sXG4gICAge1xuICAgICAgbmFtZTogJ2RlY2lkZWRfY291bnQnLFxuICAgICAgbGFiZWw6ICdTZXR0bGVkIERlYWxzJyxcbiAgICAgIGFnZ3JlZ2F0ZTogJ2NvdW50JyxcbiAgICAgIGZpbHRlcjogeyBzdGFnZTogeyAkaW46IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0gfSxcbiAgICB9LFxuICAgIHsgbmFtZTogJ3dvbl9hbW91bnQnLCBsYWJlbDogJ1dvbiBSZXZlbnVlJywgYWdncmVnYXRlOiAnc3VtJywgZmllbGQ6ICdhbW91bnQnLCBmaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfd29uJyB9LCBmb3JtYXQ6ICcwLDAnIH0sXG4gICAgeyBuYW1lOiAnbG9zdF9hbW91bnQnLCBsYWJlbDogJ0xvc3QgUmV2ZW51ZScsIGFnZ3JlZ2F0ZTogJ3N1bScsIGZpZWxkOiAnYW1vdW50JywgZmlsdGVyOiB7IHN0YWdlOiAnY2xvc2VkX2xvc3QnIH0sIGZvcm1hdDogJzAsMCcgfSxcbiAgICB7IG5hbWU6ICd3aW5fcmF0ZScsIGxhYmVsOiAnV2luIFJhdGUnLCBkZXJpdmVkOiB7IG9wOiAncmF0aW8nLCBvZjogWyd3b25fY291bnQnLCAnZGVjaWRlZF9jb3VudCddIH0sIGZvcm1hdDogJzAlJyB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0cy9hY2NvdW50LmRhdGFzZXQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHMvYWNjb3VudC5kYXRhc2V0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBkZWZpbmVEYXRhc2V0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKiogQWNjb3VudCBhbmFseXRpY3MgZGF0YXNldCAoQURSLTAwMjEpLiAqL1xuZXhwb3J0IGNvbnN0IEFjY291bnREYXRhc2V0ID0gZGVmaW5lRGF0YXNldCh7XG4gIG5hbWU6ICdhY2NvdW50X21ldHJpY3MnLFxuICBsYWJlbDogJ0FjY291bnQgTWV0cmljcycsXG4gIGRlc2NyaXB0aW9uOiAnU2VtYW50aWMgbGF5ZXIgZm9yIGFjY291bnQgY291bnRzIGJ5IGluZHVzdHJ5IC8gdHlwZScsXG4gIG9iamVjdDogJ2NybV9hY2NvdW50JyxcbiAgZGltZW5zaW9uczogW1xuICAgIHsgbmFtZTogJ2luZHVzdHJ5JywgbGFiZWw6ICdJbmR1c3RyeScsIGZpZWxkOiAnaW5kdXN0cnknLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIHsgbmFtZTogJ3R5cGUnLCBsYWJlbDogJ1R5cGUnLCBmaWVsZDogJ3R5cGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIHsgbmFtZTogJ2NyZWF0ZWRfYXQnLCBsYWJlbDogJ0NyZWF0ZWQnLCBmaWVsZDogJ2NyZWF0ZWRfYXQnLCB0eXBlOiAnZGF0ZScsIGRhdGVHcmFudWxhcml0eTogJ21vbnRoJyB9LFxuICBdLFxuICBtZWFzdXJlczogW1xuICAgIHsgbmFtZTogJ2FjY291bnRfY291bnQnLCBsYWJlbDogJ0FjY291bnRzJywgYWdncmVnYXRlOiAnY291bnQnIH0sXG4gICAgeyBuYW1lOiAnYW5udWFsX3JldmVudWVfc3VtJywgbGFiZWw6ICdBbm51YWwgUmV2ZW51ZScsIGFnZ3JlZ2F0ZTogJ3N1bScsIGZpZWxkOiAnYW5udWFsX3JldmVudWUnLCBmb3JtYXQ6ICcwLDAnIH0sXG4gIF0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGFzZXRzL2NvbnRhY3QuZGF0YXNldC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0cy9jb250YWN0LmRhdGFzZXQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZURhdGFzZXQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKiBDb250YWN0IGFuYWx5dGljcyBkYXRhc2V0IChBRFItMDAyMSkuICovXG5leHBvcnQgY29uc3QgQ29udGFjdERhdGFzZXQgPSBkZWZpbmVEYXRhc2V0KHtcbiAgbmFtZTogJ2NvbnRhY3RfbWV0cmljcycsXG4gIGxhYmVsOiAnQ29udGFjdCBNZXRyaWNzJyxcbiAgZGVzY3JpcHRpb246ICdTZW1hbnRpYyBsYXllciBmb3IgY29udGFjdCBjb3VudHMnLFxuICBvYmplY3Q6ICdjcm1fY29udGFjdCcsXG4gIGRpbWVuc2lvbnM6IFtdLFxuICBtZWFzdXJlczogW3sgbmFtZTogJ2NvbnRhY3RfY291bnQnLCBsYWJlbDogJ0NvbnRhY3RzJywgYWdncmVnYXRlOiAnY291bnQnIH1dLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0cy9sZWFkLmRhdGFzZXQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHMvbGVhZC5kYXRhc2V0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBkZWZpbmVEYXRhc2V0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKiogTGVhZCBhbmFseXRpY3MgZGF0YXNldCAoQURSLTAwMjEpLiAqL1xuZXhwb3J0IGNvbnN0IExlYWREYXRhc2V0ID0gZGVmaW5lRGF0YXNldCh7XG4gIG5hbWU6ICdsZWFkX21ldHJpY3MnLFxuICBsYWJlbDogJ0xlYWQgTWV0cmljcycsXG4gIGRlc2NyaXB0aW9uOiAnU2VtYW50aWMgbGF5ZXIgZm9yIGxlYWQgY291bnRzJyxcbiAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICBkaW1lbnNpb25zOiBbXG4gICAgeyBuYW1lOiAnc3RhdHVzJywgbGFiZWw6ICdTdGF0dXMnLCBmaWVsZDogJ3N0YXR1cycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgeyBuYW1lOiAnbGVhZF9zb3VyY2UnLCBsYWJlbDogJ1NvdXJjZScsIGZpZWxkOiAnbGVhZF9zb3VyY2UnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIHsgbmFtZTogJ2NyZWF0ZWRfYXQnLCBsYWJlbDogJ0NyZWF0ZWQnLCBmaWVsZDogJ2NyZWF0ZWRfYXQnLCB0eXBlOiAnZGF0ZScgfSxcbiAgICB7IG5hbWU6ICdsYXN0X2NvbnRhY3RlZF9kYXRlJywgbGFiZWw6ICdMYXN0IENvbnRhY3RlZCcsIGZpZWxkOiAnbGFzdF9jb250YWN0ZWRfZGF0ZScsIHR5cGU6ICdkYXRlJywgZGF0ZUdyYW51bGFyaXR5OiAnbW9udGgnIH0sXG4gIF0sXG4gIG1lYXN1cmVzOiBbeyBuYW1lOiAnbGVhZF9jb3VudCcsIGxhYmVsOiAnTGVhZHMnLCBhZ2dyZWdhdGU6ICdjb3VudCcgfV0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGFzZXRzL3Rhc2suZGF0YXNldC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0cy90YXNrLmRhdGFzZXQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZURhdGFzZXQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogVGFzayBhbmFseXRpY3MgZGF0YXNldCAoQURSLTAwMjEpLlxuICpcbiAqIEFkZGVkIGZvciB0aGUgXCJNeSBEYXlcIiBkYXNoYm9hcmQgXHUyMDE0IGBjcm1fdGFza2AgaGFkIHZpZXdzLCBzZWVkIGRhdGEgYW5kXG4gKiBhdXRvbWF0aW9uIGJ1dCBubyBzZW1hbnRpYyBsYXllciwgc28gYSByZXAncyBvd24gd29ya2xvYWQgY291bGQgbm90IGJlXG4gKiBjb3VudGVkIG9yIGJyb2tlbiBkb3duIGFueXdoZXJlLlxuICpcbiAqIGBwcmlvcml0eV9yYW5rYCBpcyBleHBvc2VkIGFsb25nc2lkZSBgcHJpb3JpdHlgIHNvIGEgYnJlYWtkb3duIGNhbiBiZVxuICogb3JkZXJlZCBieSB1cmdlbmN5OyBzb3J0aW5nIG9uIHRoZSByYXcgc2VsZWN0IGNvbXBhcmVzIG9wdGlvbiBzdHJpbmdzIGFuZFxuICogaW52ZXJ0cyBpdCAobm9ybWFsID4gbG93ID4gaGlnaCA+IHVyZ2VudCkuXG4gKi9cbmV4cG9ydCBjb25zdCBUYXNrRGF0YXNldCA9IGRlZmluZURhdGFzZXQoe1xuICBuYW1lOiAndGFza19tZXRyaWNzJyxcbiAgbGFiZWw6ICdUYXNrIE1ldHJpY3MnLFxuICBkZXNjcmlwdGlvbjogJ1NlbWFudGljIGxheWVyIGZvciB0YXNrIHdvcmtsb2FkIGFuZCBjb21wbGV0aW9uJyxcbiAgb2JqZWN0OiAnY3JtX3Rhc2snLFxuICBkaW1lbnNpb25zOiBbXG4gICAgeyBuYW1lOiAnc3RhdHVzJywgbGFiZWw6ICdTdGF0dXMnLCBmaWVsZDogJ3N0YXR1cycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgeyBuYW1lOiAncHJpb3JpdHknLCBsYWJlbDogJ1ByaW9yaXR5JywgZmllbGQ6ICdwcmlvcml0eScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgeyBuYW1lOiAncHJpb3JpdHlfcmFuaycsIGxhYmVsOiAnVXJnZW5jeScsIGZpZWxkOiAncHJpb3JpdHlfcmFuaycsIHR5cGU6ICdudW1iZXInIH0sXG4gICAgeyBuYW1lOiAndHlwZScsIGxhYmVsOiAnVHlwZScsIGZpZWxkOiAndHlwZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgeyBuYW1lOiAnZHVlX2RhdGUnLCBsYWJlbDogJ0R1ZSBEYXRlJywgZmllbGQ6ICdkdWVfZGF0ZScsIHR5cGU6ICdkYXRlJyB9LFxuICAgIHsgbmFtZTogJ2lzX292ZXJkdWUnLCBsYWJlbDogJ092ZXJkdWUnLCBmaWVsZDogJ2lzX292ZXJkdWUnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICB7IG5hbWU6ICdpc19jb21wbGV0ZWQnLCBsYWJlbDogJ0NvbXBsZXRlZCcsIGZpZWxkOiAnaXNfY29tcGxldGVkJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gIF0sXG4gIG1lYXN1cmVzOiBbXG4gICAgeyBuYW1lOiAndGFza19jb3VudCcsIGxhYmVsOiAnVGFza3MnLCBhZ2dyZWdhdGU6ICdjb3VudCcgfSxcbiAgICB7IG5hbWU6ICdhdmdfcHJvZ3Jlc3MnLCBsYWJlbDogJ0F2ZyBQcm9ncmVzcycsIGFnZ3JlZ2F0ZTogJ2F2ZycsIGZpZWxkOiAncHJvZ3Jlc3NfcGVyY2VudCcsIGZvcm1hdDogJzAuMCUnIH0sXG4gIF0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGFzZXRzL2V2ZW50LmRhdGFzZXQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHMvZXZlbnQuZGF0YXNldC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lRGF0YXNldCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBFdmVudCBhbmFseXRpY3MgZGF0YXNldCAoQURSLTAwMjEpIFx1MjAxNCB0aGUgc2VtYW50aWMgbGF5ZXIgIzU5MiBuZWVkZWQuXG4gKlxuICogQmVmb3JlIHRoaXMsIHRoZSBhcHAgaGFkIE5PIGFjdGl2aXR5IG1ldHJpYyBvZiBhbnkga2luZDogY2FsbHMgcGVyIHJlcCxcbiAqIG1lZXRpbmdzIGJvb2tlZCBhbmQgYWN0aXZpdHkgcGVyIGRlYWwgd2VyZSBhbGwgdW5hbnN3ZXJhYmxlLCBiZWNhdXNlIHRoZVxuICogb25seSB0cmFjZSBvZiBhbiBpbnRlcmFjdGlvbiB3YXMgYSBgc3lzX2FjdGl2aXR5YCByb3cgd2l0aCB0aGUgaW50ZXJlc3RpbmdcbiAqIHBhcnQgaW5zaWRlIGEgSlNPTiBzdHJpbmcuIGBjcm1fZXZlbnRgIGlzIGEgcmVhbCBvYmplY3QsIHNvIGl0IGdldHMgYSByZWFsXG4gKiBjdWJlLlxuICpcbiAqIGByZWxhdGVkX3RvX3R5cGVgIGlzIGEgZGltZW5zaW9uIGFuZCB0aGUgYHJlbGF0ZWRfdG9fKmAgbG9va3VwcyBhcmUgbm90OlxuICogZ3JvdXBpbmcgYnkgYSBsb29rdXAgaWQgeWllbGRzIGEgY29sdW1uIHBlciByYXcgaWQsIHdoaWNoIHJlYWRzIGFzIG5vaXNlIG9uXG4gKiBhIGNoYXJ0LiBcIldoaWNoIGRlYWxzIGFyZSBzdGFydmVkIG9mIGFjdGl2aXR5XCIgaXMgYW5zd2VyZWQgYnkgZmlsdGVyaW5nIHRvXG4gKiBgcmVsYXRlZF90b190eXBlID0gY3JtX29wcG9ydHVuaXR5YCBhbmQgY291bnRpbmcsIG5vdCBieSBncm91cGluZyBvbiB0aGUgaWQuXG4gKlxuICogYHN0YXJ0X2RhdGV0aW1lYCBkZWNsYXJlcyBgZGF0ZUdyYW51bGFyaXR5OiAnd2VlaydgOiBldmVyeSB3aWRnZXQgYnVpbHQgb25cbiAqIGl0IGFza3MgXCJob3cgbXVjaCBhY3Rpdml0eSBwZXIgd2Vla1wiLCBhbmQgb24gQG9iamVjdHN0YWNrIDE3IGEgYnVja2V0ZWRcbiAqIGRpbWVuc2lvbiBpcyBob25vdXJlZCAoc2VlIGB0ZXN0L2RhdGFzZXQtZ3JhbnVsYXJpdHkudGVzdC50c2AgZm9yIHRoZSAxNi54XG4gKiBoaXN0b3J5IGFuZCB3aHkgdGhlIGJ1Y2tldHMgY291bGQgbm90IGJlIGRlY2xhcmVkIGJlZm9yZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBFdmVudERhdGFzZXQgPSBkZWZpbmVEYXRhc2V0KHtcbiAgbmFtZTogJ2V2ZW50X21ldHJpY3MnLFxuICBsYWJlbDogJ0FjdGl2aXR5IE1ldHJpY3MnLFxuICBkZXNjcmlwdGlvbjogJ1NlbWFudGljIGxheWVyIGZvciBtZWV0aW5ncywgY2FsbHMgYW5kIGludGVyYWN0aW9uIHJlY2VuY3knLFxuICBvYmplY3Q6ICdjcm1fZXZlbnQnLFxuICBkaW1lbnNpb25zOiBbXG4gICAgeyBuYW1lOiAndHlwZScsIGxhYmVsOiAnQWN0aXZpdHkgVHlwZScsIGZpZWxkOiAndHlwZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgeyBuYW1lOiAnc3RhdHVzJywgbGFiZWw6ICdTdGF0dXMnLCBmaWVsZDogJ3N0YXR1cycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgLy8gYG93bmVyYCBpcyB0aGUgU0VNQU5USUMgbmFtZSBldmVyeSB3aWRnZXQvcmVwb3J0IHNlbGVjdHMgYnk7IHRoZSBjb2x1bW5cbiAgICAvLyBiZWhpbmQgaXQgaXMgdGhlIHBsYXRmb3JtIG93bmVyc2hpcCBhbmNob3IgYG93bmVyX2lkYCAoIzU0OCkuXG4gICAgeyBuYW1lOiAnb3duZXInLCBsYWJlbDogJ093bmVyJywgZmllbGQ6ICdvd25lcl9pZCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgeyBuYW1lOiAncmVsYXRlZF90b190eXBlJywgbGFiZWw6ICdSZWxhdGVkIFRvJywgZmllbGQ6ICdyZWxhdGVkX3RvX3R5cGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdzdGFydF9kYXRldGltZScsXG4gICAgICBsYWJlbDogJ0FjdGl2aXR5IFdlZWsnLFxuICAgICAgZmllbGQ6ICdzdGFydF9kYXRldGltZScsXG4gICAgICB0eXBlOiAnZGF0ZScsXG4gICAgICBkYXRlR3JhbnVsYXJpdHk6ICd3ZWVrJyxcbiAgICB9LFxuICBdLFxuICBtZWFzdXJlczogW1xuICAgIHsgbmFtZTogJ2V2ZW50X2NvdW50JywgbGFiZWw6ICdBY3Rpdml0aWVzJywgYWdncmVnYXRlOiAnY291bnQnIH0sXG4gICAge1xuICAgICAgbmFtZTogJ3RvdGFsX21pbnV0ZXMnLFxuICAgICAgbGFiZWw6ICdNaW51dGVzJyxcbiAgICAgIGFnZ3JlZ2F0ZTogJ3N1bScsXG4gICAgICBmaWVsZDogJ2R1cmF0aW9uX21pbnV0ZXMnLFxuICAgICAgZm9ybWF0OiAnMCwwJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdhdmdfbWludXRlcycsXG4gICAgICBsYWJlbDogJ0F2ZyBEdXJhdGlvbicsXG4gICAgICBhZ2dyZWdhdGU6ICdhdmcnLFxuICAgICAgZmllbGQ6ICdkdXJhdGlvbl9taW51dGVzJyxcbiAgICAgIGZvcm1hdDogJzAsMCcsXG4gICAgfSxcbiAgXSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YXNldHMvZm9yZWNhc3QuZGF0YXNldC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhc2V0cy9mb3JlY2FzdC5kYXRhc2V0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBkZWZpbmVEYXRhc2V0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKipcbiAqIEZvcmVjYXN0IGFuYWx5dGljcyBkYXRhc2V0IChBRFItMDAyMSkuXG4gKlxuICogYGNybV9mb3JlY2FzdGAgY2FycmllcyB0aGUgcmVhbCBwZXItb3duZXIsIHBlci1wZXJpb2QgcXVvdGEgYW5kIGF0dGFpbm1lbnRcbiAqIHNuYXBzaG90cywgYnV0IGhhZCBubyBzZW1hbnRpYyBsYXllciBcdTIwMTQgd2hpY2ggaXMgaG93IHRoZSBTYWxlcyBkYXNoYm9hcmRcbiAqIGVuZGVkIHVwIGFubm90YXRpbmcgaXRzIHJldmVudWUgY2hhcnQgd2l0aCBhIGhhcmRjb2RlZCBxdW90YSBvZiAxMDAwMDBcbiAqIHdoaWxlIHRoZSBzZWVkZWQgcXVvdGFzIHJ1biA1MDBrXHUyMDEzMS41TS4gV2lkZ2V0cyB0aGF0IHRhbGsgYWJvdXQgcXVvdGEgbXVzdFxuICogYmluZCBoZXJlIGluc3RlYWQgb2YgaW52ZW50aW5nIG51bWJlcnMuXG4gKlxuICogIyMgVGhlIG1lYXN1cmVzIGFyZSBOT1QgYWRkaXRpdmUgYWNyb3NzIHBlcmlvZHMgKCM2MTQpXG4gKlxuICogT25lIHJvdyBwZXIgb3duZXIgcGVyIHBlcmlvZCwgYW5kIHRoZSB0YWJsZSBkZWxpYmVyYXRlbHkgaG9sZHMgc2V2ZXJhbFxuICogcGVyaW9kcyBhdCBvbmNlIChhIGN1cnJlbnQgcXVhcnRlciwgYSBjdXJyZW50IG1vbnRoLCBzZXZlcmFsIHNldHRsZWQgb25lcykuXG4gKiBgcXVvdGFfc3VtYCBhbmQgZnJpZW5kcyBhcmUgcGxhaW4gYHN1bWBzLCBzbyBhIHF1ZXJ5IHRoYXQgZG9lcyBub3QgcGluIHRoZVxuICogcGVyaW9kIGFkZHMgYSBxdWFydGVyJ3MgcXVvdGEgdG8gYSBtb250aCdzIHF1b3RhIHRvIGxhc3QgcXVhcnRlcidzIHF1b3RhIGFuZFxuICogY2FsbHMgdGhlIHJlc3VsdCBcIlF1b3RhXCIgXHUyMDE0IHRoZSBkZWZlY3QgdGhhdCBzaGlwcGVkIG9uXG4gKiBgcXVvdGFfYXR0YWlubWVudF9ieV9yZXBgIHVudGlsICM2MTQuXG4gKlxuICogRXZlcnkgY29uc3VtZXIgbXVzdCB0aGVyZWZvcmUgbWFrZSB0aGUgcGVyaW9kIHVuYW1iaWd1b3VzLCBvbmUgb2YgdHdvIHdheXM6XG4gKlxuICogICBcdTIwMjIgZ3JvdXAgYnkgYHBlcmlvZF9sYWJlbGAgKHVuaXF1ZSBwZXIgcGVyaW9kLCBzbyBlYWNoIHJvdyBJUyBvbmUgcGVyaW9kKSBcdTIwMTRcbiAqICAgICB0aGUgc2hhcGUgYSBxdW90YS1vdmVyLXRpbWUgdHJlbmQgd2FudHM7IG9yXG4gKiAgIFx1MjAyMiBmaWx0ZXIgdG8gYSBzaW5nbGUgc25hcHNob3Qgd2l0aCBgcGVyaW9kYCArIGBwZXJpb2Rfc3RhcnRgXG4gKiAgICAgKGB7IHBlcmlvZDogJ3F1YXJ0ZXInLCBwZXJpb2Rfc3RhcnQ6ICd7Y3VycmVudF9xdWFydGVyX3N0YXJ0fScgfWApIFx1MjAxNFxuICogICAgIHRoZSBzaGFwZSBhIFwid2hlcmUgZG8gd2Ugc3RhbmQgcmlnaHQgbm93XCIgc2NvcmVib2FyZCB3YW50cy5cbiAqXG4gKiBgdGVzdC9mb3JlY2FzdC1wZXJpb2Qtc2NvcGUudGVzdC50c2AgZmFpbHMgdGhlIGJ1aWxkIGZvciBhbnkgd2lkZ2V0IG9yIHJlcG9ydFxuICogdGhhdCBkb2VzIG5laXRoZXIsIHNvIHRoZSB0cmFwIGNhbm5vdCBiZSB3YWxrZWQgaW50byB0d2ljZS5cbiAqXG4gKiBUaGlzIGNvbnN0cmFpbnQgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhIGRhdGFzZXQtbGV2ZWwgYGZpbHRlcmAgcGlubmluZyB0aGVcbiAqIGxhdGVzdCBxdWFydGVyLiBBIGRhdGFzZXQgZmlsdGVyIGlzIGludmlzaWJsZSBhdCB0aGUgY2FsbCBzaXRlOiBpdCB3b3VsZCBtYWtlXG4gKiB0aGUgdmVyeSB0cmVuZCB0aGUgYHBlcmlvZGAgLyBgcGVyaW9kX2xhYmVsYCBkaW1lbnNpb25zIGV4aXN0IHRvIHNlcnZlIHJldHVyblxuICogYSBzaW5nbGUgcm93LCB3aXRoIG5vdGhpbmcgb24gdGhlIHdpZGdldCB0byBleHBsYWluIHdoeS4gVGhlIGZhaWx1cmUgbW9kZSBvZlxuICogYSBtaXNzaW5nIHdpZGdldCBmaWx0ZXIgaXMgYSBsb3VkIHRlc3Q7IHRoZSBmYWlsdXJlIG1vZGUgb2YgYSBoaWRkZW4gZGF0YXNldFxuICogZmlsdGVyIGlzIHNpbGVudGx5IG1pc3NpbmcgZGF0YS5cbiAqL1xuZXhwb3J0IGNvbnN0IEZvcmVjYXN0RGF0YXNldCA9IGRlZmluZURhdGFzZXQoe1xuICBuYW1lOiAnZm9yZWNhc3RfbWV0cmljcycsXG4gIGxhYmVsOiAnRm9yZWNhc3QgTWV0cmljcycsXG4gIGRlc2NyaXB0aW9uOiAnU2VtYW50aWMgbGF5ZXIgZm9yIHBlci1vd25lciBxdW90YSwgYXR0YWlubWVudCBhbmQgcGlwZWxpbmUgY292ZXJhZ2UnLFxuICBvYmplY3Q6ICdjcm1fZm9yZWNhc3QnLFxuXG4gIGRpbWVuc2lvbnM6IFtcbiAgICAvLyBTZW1hbnRpYyBuYW1lIGBvd25lcmA7IGNvbHVtbiBgb3duZXJfaWRgLCB0aGUgcGxhdGZvcm0gYW5jaG9yICgjNTQ4KS5cbiAgICB7IG5hbWU6ICdvd25lcicsIGxhYmVsOiAnT3duZXInLCBmaWVsZDogJ293bmVyX2lkJywgdHlwZTogJ2xvb2t1cCcgfSxcbiAgICB7IG5hbWU6ICdwZXJpb2QnLCBsYWJlbDogJ1BlcmlvZCBUeXBlJywgZmllbGQ6ICdwZXJpb2QnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIHsgbmFtZTogJ3BlcmlvZF9sYWJlbCcsIGxhYmVsOiAnUGVyaW9kJywgZmllbGQ6ICdwZXJpb2RfbGFiZWwnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIHsgbmFtZTogJ3BlcmlvZF9zdGFydCcsIGxhYmVsOiAnUGVyaW9kIFN0YXJ0JywgZmllbGQ6ICdwZXJpb2Rfc3RhcnQnLCB0eXBlOiAnZGF0ZScgfSxcbiAgXSxcblxuICBtZWFzdXJlczogW1xuICAgIHsgbmFtZTogJ3F1b3RhX3N1bScsIGxhYmVsOiAnUXVvdGEnLCBhZ2dyZWdhdGU6ICdzdW0nLCBmaWVsZDogJ3F1b3RhJywgZm9ybWF0OiAnMCwwJyB9LFxuICAgIHsgbmFtZTogJ2Nsb3NlZF9zdW0nLCBsYWJlbDogJ0Nsb3NlZCcsIGFnZ3JlZ2F0ZTogJ3N1bScsIGZpZWxkOiAnY2xvc2VkX2Ftb3VudCcsIGZvcm1hdDogJzAsMCcgfSxcbiAgICB7IG5hbWU6ICdwaXBlbGluZV9zdW0nLCBsYWJlbDogJ1BpcGVsaW5lJywgYWdncmVnYXRlOiAnc3VtJywgZmllbGQ6ICdwaXBlbGluZV9hbW91bnQnLCBmb3JtYXQ6ICcwLDAnIH0sXG4gICAgeyBuYW1lOiAnY29tbWl0X3N1bScsIGxhYmVsOiAnQ29tbWl0JywgYWdncmVnYXRlOiAnc3VtJywgZmllbGQ6ICdjb21taXRfYW1vdW50JywgZm9ybWF0OiAnMCwwJyB9LFxuICAgIC8vIERlcml2ZWQgcmF0aW8gKEFEUi0wMDIxIFExKSByYXRoZXIgdGhhbiBhdmcoYXR0YWlubWVudF9wY3QpOiBzdW1taW5nXG4gICAgLy8gY2xvc2VkIGFuZCBxdW90YSBiZWZvcmUgZGl2aWRpbmcgd2VpZ2h0cyBldmVyeSByZXAvcGVyaW9kIGJ5IHF1b3RhXG4gICAgLy8gc2l6ZSwgd2hlcmUgYW4gYXZlcmFnZSBvZiBwZXItcm93IHBlcmNlbnRhZ2VzIHdvdWxkIG5vdC5cbiAgICB7IG5hbWU6ICdhdHRhaW5tZW50JywgbGFiZWw6ICdBdHRhaW5tZW50JywgZGVyaXZlZDogeyBvcDogJ3JhdGlvJywgb2Y6IFsnY2xvc2VkX3N1bScsICdxdW90YV9zdW0nXSB9LCBmb3JtYXQ6ICcwJScgfSxcbiAgXSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9kYXRhc2V0cy9pbmRleC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2RhdGFzZXRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YXNldHMvaW5kZXgudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogUmV2ZW51ZSBkYXRhc2V0cyBiYXJyZWwuXG4gKlxuICogVGhlIGRvY3RyaW5lIGZvciB0aGlzIG1ldGFkYXRhIHR5cGUgaXMgd3JpdHRlbiBvbmNlLCBpblxuICogYHNyYy9zYWxlcy9kYXRhc2V0cy9pbmRleC50c2A7IHRoaXMgZmlsZSBpcyB0aGUgcmV2ZW51ZSBwYWNrYWdlJ3MgaGFsZiBvZlxuICogdGhlIHNhbWUgZmlsZS1ieS1maWxlIHJlZ2lzdHJhdGlvbi5cbiAqL1xuXG5leHBvcnQgeyBQcm9kdWN0RGF0YXNldCB9IGZyb20gJy4vcHJvZHVjdC5kYXRhc2V0JztcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YXNldHMvcHJvZHVjdC5kYXRhc2V0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YXNldHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9kYXRhc2V0cy9wcm9kdWN0LmRhdGFzZXQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZURhdGFzZXQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKiBQcm9kdWN0IGFuYWx5dGljcyBkYXRhc2V0IChBRFItMDAyMSkgXHUyMDE0IGNhdGFsb2cgbGlzdC1wcmljZSByb2xsdXBzLiAqL1xuZXhwb3J0IGNvbnN0IFByb2R1Y3REYXRhc2V0ID0gZGVmaW5lRGF0YXNldCh7XG4gIG5hbWU6ICdwcm9kdWN0X21ldHJpY3MnLFxuICBsYWJlbDogJ1Byb2R1Y3QgTWV0cmljcycsXG4gIGRlc2NyaXB0aW9uOiAnU2VtYW50aWMgbGF5ZXIgZm9yIHByb2R1Y3QgY2F0YWxvZyBjb3VudHMgYW5kIGxpc3QgcHJpY2UnLFxuICBvYmplY3Q6ICdjcm1fcHJvZHVjdCcsXG4gIGRpbWVuc2lvbnM6IFtcbiAgICB7IG5hbWU6ICdjYXRlZ29yeScsIGxhYmVsOiAnQ2F0ZWdvcnknLCBmaWVsZDogJ2NhdGVnb3J5JywgdHlwZTogJ3N0cmluZycgfSxcbiAgXSxcbiAgbWVhc3VyZXM6IFtcbiAgICB7IG5hbWU6ICdwcm9kdWN0X2NvdW50JywgbGFiZWw6ICdQcm9kdWN0cycsIGFnZ3JlZ2F0ZTogJ2NvdW50JyB9LFxuICAgIHsgbmFtZTogJ2xpc3RfcHJpY2Vfc3VtJywgbGFiZWw6ICdUb3RhbCBMaXN0IFByaWNlJywgYWdncmVnYXRlOiAnc3VtJywgZmllbGQ6ICdsaXN0X3ByaWNlJywgZm9ybWF0OiAnMCwwJyB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9yZXBvcnRzL2luZGV4LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3JlcG9ydHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcmVwb3J0cy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBSZXBvcnQgRGVmaW5pdGlvbnMgQmFycmVsXG4gKlxuICogIyMgV2h5IHRoZXNlIGZpbGVzIGFubm90YXRlIHdpdGggYFJlcG9ydGAsIG5vdCBgUmVwb3J0SW5wdXRgXG4gKlxuICogT2JqZWN0U3RhY2sgMTcuMC4wLXJjLjYgcmV0aXJlZCB0aGUgYFJlcG9ydElucHV0YCBleHBvcnQgYW5kIG1vdmVkIHRoZSBiYXJlXG4gKiBuYW1lIG9udG8gdGhlIGF1dGhvcmluZyBzaGFwZSwgdW5kZXIgdGhlIEFEUi0wMTIyIGNvbnZlbnRpb24gdGhhdCBgWGAgaXMgdGhlXG4gKiBJTlBVVCB0eXBlIGFuZCBgWFBhcnNlZGAgdGhlIHBvc3QtcGFyc2Ugb25lIChkZWZhdWx0cyBhcHBsaWVkLCB0cmFuc2Zvcm1zXG4gKiBydW4pLiBUaGUgdW5kZXJseWluZyB0eXBlIGlzIHVuY2hhbmdlZCBcdTIwMTQgYHouaW5wdXQ8dHlwZW9mIFJlcG9ydFNjaGVtYT5gLFxuICogZXhhY3RseSB3aGF0IGBSZXBvcnRJbnB1dGAgbmFtZWQgXHUyMDE0IHNvIHRoZSBhbm5vdGF0aW9ucyBiZWxvdyBzdGlsbCBtZWFuXG4gKiBcImF1dGhvcmluZyBzaGFwZTogb3B0aW9uYWwgZmllbGRzIHdpdGggZGVmYXVsdHMgbWF5IGJlIG9taXR0ZWRcIi5cbiAqXG4gKiBUaGUgcmVuYW1lIGlzIHdvcnRoIHdyaXRpbmcgZG93biBiZWNhdXNlIG9uIHJjLjUgdGhlIG5hbWUgYFJlcG9ydGAgbWVhbnQgdGhlXG4gKiBPUFBPU0lURSAoYHouaW5mZXJgLCB0aGUgcGFyc2VkIHNoYXBlKS4gQW55dGhpbmcgdGhhdCB3YXMgYW5ub3RhdGVkIGBSZXBvcnRgXG4gKiBiZWZvcmUgdGhlIHVwZ3JhZGUgc2lsZW50bHkgY2hhbmdlZCBtZWFuaW5nIGluc3RlYWQgb2YgZmFpbGluZyB0byBjb21waWxlO1xuICogb25seSBgUmVwb3J0SW5wdXRgIFx1MjAxNCByZW1vdmVkIG91dHJpZ2h0IFx1MjAxNCBhbm5vdW5jZWQgaXRzZWxmLCB2aWFcbiAqIGB0c2MgLS1ub0VtaXRgLiBUaGUgc2FtZSBzd2FwIGFwcGxpZXMgdG8gYEFjdGlvbmAsIGBEYXNoYm9hcmRgIGFuZCBgUGFnZWAsXG4gKiB3aGljaCB0aGlzIGFwcCBhbHNvIGltcG9ydHMgZnJvbSBgQG9iamVjdHN0YWNrL3NwZWMvdWlgIGFuZCB3aGljaCBhcmUgYWxsXG4gKiB1c2VkIG9uIGF1dGhvcmluZyBsaXRlcmFscywgaS5lLiB0aGUgc2lkZSB0aGUgc3dhcCBtYWRlIG1vcmUgY29ycmVjdC5cbiAqL1xuXG5leHBvcnQgeyBBY2NvdW50c0J5SW5kdXN0cnlUeXBlUmVwb3J0IH0gZnJvbSAnLi9hY2NvdW50LnJlcG9ydCc7XG5leHBvcnQgeyBMZWFkSW5mbG93QnlNb250aFNvdXJjZVJlcG9ydCB9IGZyb20gJy4vbGVhZC5yZXBvcnQnO1xuZXhwb3J0IHtcbiAgT3Bwb3J0dW5pdGllc0J5U3RhZ2VSZXBvcnQsXG4gIFdvbk9wcG9ydHVuaXRpZXNCeU93bmVyUmVwb3J0LFxuICBQaXBlbGluZUNvdmVyYWdlQnlRdWFydGVyUmVwb3J0LFxuICBPcHBvcnR1bml0eUZ1bm5lbEJ5T3duZXJTdGFnZVJlcG9ydCxcbn0gZnJvbSAnLi9vcHBvcnR1bml0eS5yZXBvcnQnO1xuZXhwb3J0IHsgQ3VzdG9tZXJDaHVyblNpZ25hbHNSZXBvcnQgfSBmcm9tICcuL2NodXJuLnJlcG9ydCc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9yZXBvcnRzL2FjY291bnQucmVwb3J0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3JlcG9ydHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcmVwb3J0cy9hY2NvdW50LnJlcG9ydC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBSZXBvcnQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbmV4cG9ydCBjb25zdCBBY2NvdW50c0J5SW5kdXN0cnlUeXBlUmVwb3J0OiBSZXBvcnQgPSB7XG4gIG5hbWU6ICdhY2NvdW50c19ieV9pbmR1c3RyeV90eXBlJyxcbiAgbGFiZWw6ICdBY2NvdW50cyBieSBJbmR1c3RyeSBhbmQgVHlwZScsXG4gIGRlc2NyaXB0aW9uOiAnTWF0cml4IHJlcG9ydCBzaG93aW5nIGFjY291bnRzIGJ5IGluZHVzdHJ5IGFuZCB0eXBlJyxcbiAgZGF0YXNldDogJ2FjY291bnRfbWV0cmljcycsIHJvd3M6IFsnaW5kdXN0cnknXSwgY29sdW1uczogWyd0eXBlJ10sIHZhbHVlczogWydhY2NvdW50X2NvdW50JywgJ2FubnVhbF9yZXZlbnVlX3N1bSddLFxuICB0eXBlOiAnbWF0cml4JyxcbiAgcnVudGltZUZpbHRlcjogeyBpc19hY3RpdmU6IHRydWUgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9yZXBvcnRzL2xlYWQucmVwb3J0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3JlcG9ydHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcmVwb3J0cy9sZWFkLnJlcG9ydC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBSZXBvcnQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogTGVhZCBlbmdhZ2VtZW50IHRyZW5kIFx1MjAxNCBtYXRyaXggb3ZlciBgbGFzdF9jb250YWN0ZWRfZGF0ZWAgKGEgdXNlci1tYW5hZ2VkXG4gKiBkYXRldGltZSwgc28gaXQgY2FuIGJlIHNldCBpbiBzZWVkIGRhdGEgYW5kIHZhcmllZCBhY3Jvc3MgbW9udGhzIGZvciBhXG4gKiByZWFsaXN0aWMgZGVtbykuIExldHMgYSBtYXJrZXRpbmctb3BzIGxlYWQgc3BvdCB3aGljaCBjaGFubmVscyB3ZSdyZVxuICogYWN0aXZlbHkgd29ya2luZyBtb250aC1vdmVyLW1vbnRoLlxuICpcbiAqIGBsZWFkX21ldHJpY3MubGFzdF9jb250YWN0ZWRfZGF0ZWAgZGVjbGFyZXMgdGhlIG1vbnRoIGJ1Y2tldCwgc28gZWFjaCBjb2x1bW5cbiAqIHJlcHJlc2VudHMgb25lIGNhbGVuZGFyIG1vbnRoIGluc3RlYWQgb2YgYSByYXcgdGltZXN0YW1wLlxuICovXG5leHBvcnQgY29uc3QgTGVhZEluZmxvd0J5TW9udGhTb3VyY2VSZXBvcnQ6IFJlcG9ydCA9IHtcbiAgbmFtZTogJ2xlYWRfaW5mbG93X2J5X21vbnRoX3NvdXJjZScsXG4gIGxhYmVsOiAnTGVhZCBFbmdhZ2VtZW50IGJ5IE1vbnRoIFx1MDBENyBTb3VyY2UnLFxuICBkZXNjcmlwdGlvbjogJ0NvbnRhY3RlZC1sZWFkIHZvbHVtZSBwZXIgbW9udGgsIGJyb2tlbiBkb3duIGJ5IGFjcXVpc2l0aW9uIGNoYW5uZWwnLFxuICBkYXRhc2V0OiAnbGVhZF9tZXRyaWNzJywgcm93czogWydsZWFkX3NvdXJjZSddLCBjb2x1bW5zOiBbJ2xhc3RfY29udGFjdGVkX2RhdGUnXSwgdmFsdWVzOiBbJ2xlYWRfY291bnQnXSxcbiAgdHlwZTogJ21hdHJpeCcsXG4gIC8vIEEgbmV2ZXItY29udGFjdGVkIGxlYWQgaGFzIG5vIGVuZ2FnZW1lbnQgbW9udGgsIGFuZCBncm91cGluZyBpdCBwcm9kdWNlZCBhXG4gIC8vIGhlYWRlcmxlc3MgJ1x1MjAxNCcgY29sdW1uIG5leHQgdG8gdGhlIHJlYWwgb25lcy4gVGhpcyByZXBvcnQgY291bnRzIENPTlRBQ1RFRFxuICAvLyBsZWFkcyAoc2VlIHRoZSBsYWJlbC9kZXNjcmlwdGlvbiksIHNvIHRoZSBlbXB0eSBidWNrZXQgaXMgZXhjbHVkZWQgYXQgdGhlXG4gIC8vIHNvdXJjZSByYXRoZXIgdGhhbiByZW5kZXJlZCBhcyBhIG15c3RlcnkgY29sdW1uLlxuICBydW50aW1lRmlsdGVyOiB7IGxhc3RfY29udGFjdGVkX2RhdGU6IHsgJG5lOiBudWxsIH0gfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9yZXBvcnRzL29wcG9ydHVuaXR5LnJlcG9ydC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9yZXBvcnRzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3JlcG9ydHMvb3Bwb3J0dW5pdHkucmVwb3J0LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFJlcG9ydCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuZXhwb3J0IGNvbnN0IE9wcG9ydHVuaXRpZXNCeVN0YWdlUmVwb3J0OiBSZXBvcnQgPSB7XG4gIG5hbWU6ICdvcHBvcnR1bml0aWVzX2J5X3N0YWdlJyxcbiAgbGFiZWw6ICdPcHBvcnR1bml0aWVzIGJ5IFN0YWdlJyxcbiAgZGVzY3JpcHRpb246ICdTdW1tYXJ5IG9mIG9wcG9ydHVuaXRpZXMgZ3JvdXBlZCBieSBzdGFnZScsXG4gIGRhdGFzZXQ6ICdvcHBvcnR1bml0eV9tZXRyaWNzJywgcm93czogWydzdGFnZSddLCB2YWx1ZXM6IFsndG90YWxfYW1vdW50JywgJ2F2Z19wcm9iYWJpbGl0eSddLFxuICB0eXBlOiAnc3VtbWFyeScsXG4gIC8vIGB7Y3VycmVudF95ZWFyX3N0YXJ0fWAgaXMgYSBzcGVjIGRhdGUgbWFjcm8gKERBVEVfTUFDUk9fVE9LRU5TKSByZXNvbHZlZFxuICAvLyBwZXItcXVlcnksIHNvIHRoZSBZVEQgd2luZG93IHJvbGxzIHdpdGggdGltZSBpbnN0ZWFkIG9mIGZyZWV6aW5nIHRoZSB5ZWFyXG4gIC8vIHRoZSBhcnRpZmFjdCB3YXMgYnVpbHQgaW50byBkaXN0L29iamVjdHN0YWNrLmpzb24uXG4gIHJ1bnRpbWVGaWx0ZXI6IHsgc3RhZ2U6IHsgJG5lOiAnY2xvc2VkX2xvc3QnIH0sIGNsb3NlX2RhdGU6IHsgJGd0ZTogJ3tjdXJyZW50X3llYXJfc3RhcnR9JyB9IH0sXG4gIGNoYXJ0OiB7IHR5cGU6ICdiYXInLCB0aXRsZTogJ1BpcGVsaW5lIGJ5IFN0YWdlJywgc2hvd0xlZ2VuZDogdHJ1ZSwgeEF4aXM6ICdzdGFnZScsIHlBeGlzOiAndG90YWxfYW1vdW50JyB9XG59O1xuXG5leHBvcnQgY29uc3QgV29uT3Bwb3J0dW5pdGllc0J5T3duZXJSZXBvcnQ6IFJlcG9ydCA9IHtcbiAgbmFtZTogJ3dvbl9vcHBvcnR1bml0aWVzX2J5X293bmVyJyxcbiAgbGFiZWw6ICdXb24gT3Bwb3J0dW5pdGllcyBieSBPd25lcicsXG4gIGRlc2NyaXB0aW9uOiAnQ2xvc2VkIHdvbiBvcHBvcnR1bml0aWVzIGdyb3VwZWQgYnkgb3duZXInLFxuICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIHJvd3M6IFsnb3duZXInXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCddLFxuICB0eXBlOiAnc3VtbWFyeScsXG4gIHJ1bnRpbWVGaWx0ZXI6IHsgc3RhZ2U6ICdjbG9zZWRfd29uJyB9LFxuICBjaGFydDogeyB0eXBlOiAnY29sdW1uJywgdGl0bGU6ICdSZXZlbnVlIGJ5IFNhbGVzIFJlcCcsIHNob3dMZWdlbmQ6IGZhbHNlLCB4QXhpczogJ293bmVyJywgeUF4aXM6ICd0b3RhbF9hbW91bnQnIH1cbn07XG5cbi8qKlxuICogUXVhcnRlcmx5IHBpcGVsaW5lIGNvdmVyYWdlIFx1MjAxNCB0aGUgbWF0cml4IHZpZXcgdGhhdCBwb3dlcnMgdGhlIGNsYXNzaWNcbiAqIHNhbGVzLW9wcyBcInBpcGVsaW5lIGNvdmVyYWdlXCIgY29udmVyc2F0aW9uOiBlYWNoIGZvcmVjYXN0IGNhdGVnb3J5IGFnYWluc3RcbiAqIHRoZSBxdWFydGVyIHRoZSBkZWFsIGlzIGV4cGVjdGVkIHRvIGNsb3NlIGluLiBgY2xvc2VfcXVhcnRlcmAgaXMgYSBkZWRpY2F0ZWRcbiAqIHF1YXJ0ZXJseSBkaW1lbnNpb24gb3ZlciB0aGUgc2FtZSBmaWVsZDsgdGhlIHRyZW5kIHdpZGdldHMga2VlcCB0aGVpclxuICogbW9udGhseSBgY2xvc2VfZGF0ZWAgZGltZW5zaW9uLlxuICovXG5leHBvcnQgY29uc3QgUGlwZWxpbmVDb3ZlcmFnZUJ5UXVhcnRlclJlcG9ydDogUmVwb3J0ID0ge1xuICBuYW1lOiAncGlwZWxpbmVfY292ZXJhZ2VfYnlfcXVhcnRlcicsXG4gIGxhYmVsOiAnUGlwZWxpbmUgQ292ZXJhZ2UgYnkgRm9yZWNhc3QgXHUwMEQ3IFF1YXJ0ZXInLFxuICBkZXNjcmlwdGlvbjogJ09wZW4gcGlwZWxpbmUgYW1vdW50IGJ5IGZvcmVjYXN0IGNhdGVnb3J5LCBidWNrZXRlZCBieSBjbG9zZSBxdWFydGVyJyxcbiAgZGF0YXNldDogJ29wcG9ydHVuaXR5X21ldHJpY3MnLCByb3dzOiBbJ2ZvcmVjYXN0X2NhdGVnb3J5J10sIGNvbHVtbnM6IFsnY2xvc2VfcXVhcnRlciddLCB2YWx1ZXM6IFsndG90YWxfYW1vdW50JywgJ29wcF9jb3VudCddLFxuICB0eXBlOiAnbWF0cml4JyxcbiAgcnVudGltZUZpbHRlcjogeyBzdGFnZTogeyAkbmluOiBbJ2Nsb3NlZF93b24nLCAnY2xvc2VkX2xvc3QnXSB9IH0sXG59O1xuXG4vKipcbiAqIFNhbGVzLXJlcCBmdW5uZWwgXHUyMDE0IHR3by1sZXZlbCBzdW1tYXJ5IHRoYXQgbWlycm9ycyBob3cgcmVwcyBkcmlsbCBpbnRvIHRoZWlyXG4gKiBvd24gYm9vayBvZiBidXNpbmVzcy4gRXhlcmNpc2VzIG11bHRpLWxldmVsIGByb3dzYCBncm91cGluZyAob3duZXIgXHUyMTkyIHN0YWdlKVxuICogb3ZlciB0aGUgZGF0YXNldCdzIG1lYXN1cmVzLlxuICovXG5leHBvcnQgY29uc3QgT3Bwb3J0dW5pdHlGdW5uZWxCeU93bmVyU3RhZ2VSZXBvcnQ6IFJlcG9ydCA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X2Z1bm5lbF9vd25lcl9zdGFnZScsXG4gIGxhYmVsOiAnT3Bwb3J0dW5pdHkgRnVubmVsIGJ5IE93bmVyIFx1MjE5MiBTdGFnZScsXG4gIGRlc2NyaXB0aW9uOiAnUGVyLXJlcCBzdGFnZS1ieS1zdGFnZSBwaXBlbGluZSBmdW5uZWwnLFxuICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIHJvd3M6IFsnb3duZXInLCAnc3RhZ2UnXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCcsICdvcHBfY291bnQnLCAnYXZnX3Byb2JhYmlsaXR5J10sXG4gIHR5cGU6ICdzdW1tYXJ5JyxcbiAgcnVudGltZUZpbHRlcjogeyBzdGFnZTogeyAkbmU6ICdjbG9zZWRfbG9zdCcgfSB9LFxuICBjaGFydDogeyB0eXBlOiAnZnVubmVsJywgdGl0bGU6ICdQaXBlbGluZSBGdW5uZWwnLCBzaG93TGVnZW5kOiBmYWxzZSwgeEF4aXM6ICdzdGFnZScsIHlBeGlzOiAndG90YWxfYW1vdW50JyB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3JlcG9ydHMvY2h1cm4ucmVwb3J0LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3JlcG9ydHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcmVwb3J0cy9jaHVybi5yZXBvcnQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgUmVwb3J0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKipcbiAqIEN1c3RvbWVyIENodXJuIFNpZ25hbHMgXHUyMDE0IGEgXCJqb2luZWRcIiByZXBvcnQgdGhhdCBnaXZlcyBhIEN1c3RvbWVyIFN1Y2Nlc3NcbiAqIE1hbmFnZXIgYSBvbmUtc2NyZWVuIHZpZXcgb2YgdGhlIGZvdXIgcG9wdWxhdGlvbnMgdGhhdCBtYXR0ZXIgZm9yXG4gKiBwcm9hY3RpdmUgY2h1cm4gaW50ZXJ2ZW50aW9uOlxuICpcbiAqICAgMS4gQ1NNLUZsYWdnZWQgICAgICAgICAgXHUyMDE0IGFjY291bnRzIGEgaHVtYW4gaGFzIG1hcmtlZCBhdF9yaXNrIC8gY2h1cm5pbmdcbiAqICAgMi4gQXQtUmlzayBBY2NvdW50cyAgICAgXHUyMDE0IGFjdGl2ZSBhY2NvdW50cyB3aXRoIG5vIGFjdGl2aXR5IGluIDYwKyBkYXlzXG4gKiAgIDMuIFNpbGVudCBIaWdoLVZhbHVlICAgIFx1MjAxNCBzdHJhdGVnaWMvZW50ZXJwcmlzZSBhY2NvdW50cyBnb25lIHF1aWV0ICg5MCsgZGF5cylcbiAqICAgNC4gUmVjZW50bHkgQ2xvc2VkLUxvc3QgXHUyMDE0IG9wcG9ydHVuaXRpZXMgbG9zdCBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gKlxuICogRWFjaCBibG9jayBpcyBhbiBpbmRlcGVuZGVudCBzdWItcmVwb3J0OyB0aGUgam9pbmVkIHJlbmRlcmVyIHN0YWNrcyB0aGVtXG4gKiB2ZXJ0aWNhbGx5LiBUaGVyZSBpcyBubyBjb250YWluZXItbGV2ZWwgZmlsdGVyIG9uIHRoaXMgcmVwb3J0IFx1MjAxNCBlYWNoIGJsb2NrXG4gKiBjYXJyaWVzIGl0cyBvd24gc2NvcGUgYmVjYXVzZSB0aGV5IHF1ZXJ5IGRpZmZlcmVudCBvYmplY3RzIChgY3JtX2FjY291bnRgLFxuICogYGNybV9vcHBvcnR1bml0eWApIGF0IGRpZmZlcmVudCB0aW1lIGhvcml6b25zLlxuICpcbiAqIEJsb2NrIDEgaXMgZGVsaWJlcmF0ZWx5IEZJUlNUIGFuZCBkZWxpYmVyYXRlbHkgbm90IHRpbWUtd2luZG93ZWQuIEJsb2NrcyAyLTRcbiAqIGFyZSBhbGwgZGVyaXZlZCBzaWduYWxzOiB0aGUgY2xvY2sgc3RvcHBlZCwgdGhlIHRpZXIgaXMgcXVpZXQsIHRoZSBkZWFsIHdhc1xuICogbG9zdC4gYGNybV9hY2NvdW50LmhlYWx0aF9zY29yZWAgaXMgdGhlIG9ubHkgY2h1cm4gc2lnbmFsIGluIHRoZSBtb2RlbCBhXG4gKiBwZXJzb24gKmFzc2VydHMqIFx1MjAxNCBhIENTTSB3aG8gaGFzIGJlZW4gaW4gdGhlIHJvb20gc2V0cyBgYXRfcmlza2Agb3JcbiAqIGBjaHVybmluZ2AgYnkgaGFuZCBcdTIwMTQgc28gaXQgaXMgdGhlIHN0cm9uZ2VzdCBldmlkZW5jZSBvbiB0aGUgcGFnZSBhbmQgaXQgaXNcbiAqIGluZGVwZW5kZW50IG9mIGV2ZXJ5IHdpbmRvdyBiZWxvdyBpdC4gQW4gYWNjb3VudCB0aGF0IGlzIGJlaW5nIHRhbGtlZCB0b1xuICogZGFpbHkgYW5kIGlzIHN0aWxsIGNodXJuaW5nIGlzIGludmlzaWJsZSB0byBibG9ja3MgMi00IGJ5IGNvbnN0cnVjdGlvbiwgYW5kXG4gKiB0aGF0IGFjY291bnQgaXMgdGhlIHdob2xlIHJlYXNvbiB0aGlzIGJsb2NrIGV4aXN0cyAoIzExODYpLlxuICpcbiAqIFRpbWUgd2luZG93cyB1c2UgdGhlIHNwZWMncyBkYXRlLW1hY3JvIHBsYWNlaG9sZGVycyAoYHs2MF9kYXlzX2Fnb31gLCBcdTIwMjYsXG4gKiBEQVRFX01BQ1JPX1RPS0VOUyBpbiBAb2JqZWN0c3RhY2svc3BlYy9kYXRhKSwgd2hpY2ggcmVzb2x2ZSBwZXItcXVlcnkuXG4gKiBDb21wdXRpbmcgdGhlIGRhdGVzIGF0IG1vZHVsZSBsb2FkIGZyb3plIHRoZW0gaW50byBkaXN0L29iamVjdHN0YWNrLmpzb24sXG4gKiBzbyBldmVyeSB3aW5kb3cgc2lsZW50bHkgc3RvcHBlZCByb2xsaW5nIG9uIHRoZSBkYXkgdGhlIGFydGlmYWN0IHdhcyBidWlsdC5cbiAqXG4gKiBKb2luZWQgUmVwb3J0cyBkZW1vbnN0cmF0ZSB0aGUgc3BlYydzIE0zIGNhcGFiaWxpdHk6IG11bHRpLWJsb2NrIGFuYWx5dGljXG4gKiBzdXJmYWNlcyB3aXRoIHNoYXJlZCBjaHJvbWUgYnV0IGluZGVwZW5kZW50IGRhdGEgYmluZGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IEN1c3RvbWVyQ2h1cm5TaWduYWxzUmVwb3J0OiBSZXBvcnQgPSB7XG4gIG5hbWU6ICdjdXN0b21lcl9jaHVybl9zaWduYWxzJyxcbiAgbGFiZWw6ICdDdXN0b21lciBDaHVybiBTaWduYWxzJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1RocmVlLXBhbmVsIGVhcmx5LXdhcm5pbmcgdmlldzogYXQtcmlzayBjdXN0b21lcnMsIHNpbGVudCBoaWdoLXZhbHVlIGFjY291bnRzLCBhbmQgcmVjZW50bHktbG9zdCBvcHBvcnR1bml0aWVzLicsXG4gIHR5cGU6ICdqb2luZWQnLFxuICBibG9ja3M6IFtcbiAgICB7XG4gICAgICAvLyBOYW1lZCBmb3IgdGhlIEFDVE9SLCBub3QgdGhlIHZhbHVlLCBiZWNhdXNlIGBhdF9yaXNrYCBpcyBhbHNvIGFcbiAgICAgIC8vIGBoZWFsdGhfc2NvcmVgIG9wdGlvbiBhbmQgYGF0X3Jpc2tfYWNjb3VudHNgIGlzIGFscmVhZHkgdGhlIGJsb2NrXG4gICAgICAvLyBiZWxvdyAoYSB0aW1lIHdpbmRvdywgbm90aGluZyB0byBkbyB3aXRoIHRoZSBmaWVsZCkuIFRoZSB0d28gYXJlXG4gICAgICAvLyBhbGxvd2VkIHRvIG92ZXJsYXA6IHRoaXMgb25lIGFza3MgXCJ3aG8gZGlkIGEgaHVtYW4gZmxhZ1wiLCB0aGF0IG9uZVxuICAgICAgLy8gYXNrcyBcIndob3NlIGNsb2NrIHN0b3BwZWRcIi5cbiAgICAgIG5hbWU6ICdjc21fZmxhZ2dlZF9hY2NvdW50cycsXG4gICAgICBsYWJlbDogJ0NTTS1GbGFnZ2VkIEFjY291bnRzJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnQWNjb3VudHMgYSBDU00gaGFzIGhhbmQtZmxhZ2dlZCBhcyBhdC1yaXNrIG9yIGNodXJuaW5nLCBncm91cGVkIGJ5IHR5cGUgXHUyMDE0IGh1bWFuIGp1ZGdlbWVudCwgaW5kZXBlbmRlbnQgb2YgdGhlIGFjdGl2aXR5IGNsb2NrLicsXG4gICAgICB0eXBlOiAnc3VtbWFyeScsXG4gICAgICBkYXRhc2V0OiAnYWNjb3VudF9tZXRyaWNzJywgcm93czogWyd0eXBlJ10sIHZhbHVlczogWydhY2NvdW50X2NvdW50J10sXG4gICAgICAvLyBObyBkYXRlIHRlcm0gb24gcHVycG9zZSAoc2VlIHRoZSBoZWFkZXIpLiBgaXNfYWN0aXZlYCBtYXRjaGVzIHRoZSB0d29cbiAgICAgIC8vIGFjY291bnQgYmxvY2tzIGJlbG93OiBhIGRlYWN0aXZhdGVkIGFjY291bnQgaGFzIGFscmVhZHkgY2h1cm5lZCwgc28gaXRcbiAgICAgIC8vIGlzIG5vdCBhIHJldGVudGlvbiBxdWV1ZSBpdGVtLiBHcm91cGluZyBieSBgdHlwZWAgc2VwYXJhdGVzIGEgZmxhZ2dlZFxuICAgICAgLy8gQ1VTVE9NRVIgKHJldmVudWUgYXQgcmlzayB0b2RheSkgZnJvbSBhIGZsYWdnZWQgcHJvc3BlY3Qgb3IgcGFydG5lcixcbiAgICAgIC8vIHdoaWNoIHRoZSBncmlkIHZpZXcgYGNybV9hY2NvdW50LmF0X3Jpc2tfYWNjb3VudHNgIGNhbm5vdCBzaG93IFx1MjAxNCBpdCBpc1xuICAgICAgLy8gc2NvcGVkIHRvIGB0eXBlOiAnY3VzdG9tZXInYCBiZWZvcmUgYW55dGhpbmcgZWxzZS5cbiAgICAgIHJ1bnRpbWVGaWx0ZXI6IHtcbiAgICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgICAgICBoZWFsdGhfc2NvcmU6IHsgJGluOiBbJ2F0X3Jpc2snLCAnY2h1cm5pbmcnXSB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdhdF9yaXNrX2FjY291bnRzJyxcbiAgICAgIGxhYmVsOiAnQXQtUmlzayBBY2NvdW50cycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBhY2NvdW50cyB3aXRoIG5vIGFjdGl2aXR5IGluIDYwKyBkYXlzLCBncm91cGVkIGJ5IGluZHVzdHJ5LicsXG4gICAgICB0eXBlOiAnc3VtbWFyeScsXG4gICAgICBkYXRhc2V0OiAnYWNjb3VudF9tZXRyaWNzJywgcm93czogWydpbmR1c3RyeSddLCB2YWx1ZXM6IFsnYWNjb3VudF9jb3VudCddLFxuICAgICAgcnVudGltZUZpbHRlcjoge1xuICAgICAgICBpc19hY3RpdmU6IHRydWUsXG4gICAgICAgIGxhc3RfYWN0aXZpdHlfZGF0ZTogeyAkbHQ6ICd7NjBfZGF5c19hZ299JyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdzaWxlbnRfaGlnaF92YWx1ZScsXG4gICAgICBsYWJlbDogJ1NpbGVudCBIaWdoLVZhbHVlIEFjY291bnRzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU3RyYXRlZ2ljIGFuZCBlbnRlcnByaXNlIGFjY291bnRzIGdvbmUgcXVpZXQgZm9yIDkwKyBkYXlzLCBncm91cGVkIGJ5IHR5cGUuJyxcbiAgICAgIHR5cGU6ICdzdW1tYXJ5JyxcbiAgICAgIGRhdGFzZXQ6ICdhY2NvdW50X21ldHJpY3MnLCByb3dzOiBbJ3R5cGUnXSwgdmFsdWVzOiBbJ2FjY291bnRfY291bnQnXSxcbiAgICAgIC8vIFwiSGlnaC12YWx1ZVwiIGlzIHRoZSBhY2NvdW50J3MgdGllciwgbm90IGEgcmV2ZW51ZSB0aHJlc2hvbGQ6IHRoZVxuICAgICAgLy8gc3RyYXRlZ2ljL2VudGVycHJpc2UgdGllcnMgYXJlIGV4YWN0bHkgdGhlIGJvb2sgdGhlIENTTSB0ZWFtIG93bnMuXG4gICAgICBydW50aW1lRmlsdGVyOiB7XG4gICAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICAgICAgdGllcjogeyAkaW46IFsnc3RyYXRlZ2ljJywgJ2VudGVycHJpc2UnXSB9LFxuICAgICAgICBsYXN0X2FjdGl2aXR5X2RhdGU6IHsgJGx0OiAnezkwX2RheXNfYWdvfScgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAncmVjZW50bHlfY2xvc2VkX2xvc3QnLFxuICAgICAgbGFiZWw6ICdSZWNlbnRseSBMb3N0IE9wcG9ydHVuaXRpZXMnLFxuICAgICAgZGVzY3JpcHRpb246ICdPcHBvcnR1bml0aWVzIGNsb3NlZC1sb3N0IGluIHRoZSBsYXN0IDMwIGRheXMgXHUyMDE0IGludmVzdGlnYXRlIGJlZm9yZSB0aGUgY3VzdG9tZXIgZnVsbHkgY2h1cm5zLicsXG4gICAgICB0eXBlOiAnc3VtbWFyeScsXG4gICAgICBkYXRhc2V0OiAnb3Bwb3J0dW5pdHlfbWV0cmljcycsIHJvd3M6IFsnb3duZXInXSwgdmFsdWVzOiBbJ3RvdGFsX2Ftb3VudCcsICdvcHBfY291bnQnXSxcbiAgICAgIHJ1bnRpbWVGaWx0ZXI6IHtcbiAgICAgICAgc3RhZ2U6ICdjbG9zZWRfbG9zdCcsXG4gICAgICAgIGNsb3NlX2RhdGU6IHsgJGd0ZTogJ3szMF9kYXlzX2Fnb30nIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3MvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3MvaW5kZXgudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogSW1wb3J0IG1hcHBpbmcgYmFycmVsLlxuICpcbiAqIEVhY2ggZW50cnkgaXMgYSByZXVzYWJsZSwgZ292ZXJuZWQgY29sdW1uXHUyMTkyZmllbGQgcHJvamVjdGlvbiByZWZlcmVuY2VkIGJ5XG4gKiBuYW1lIGZyb20gdGhlIGltcG9ydCBlbmRwb2ludCAoYG1hcHBpbmdOYW1lOiAnY3JtX2FjY291bnRfaW1wb3J0J2ApLCBzbyBhXG4gKiBjdXN0b21lciBsb2FkaW5nIHRoZWlyIG93biBzcHJlYWRzaGVldCBuZXZlciBoYXMgdG8gbWFwIGNvbHVtbnMgYnkgaGFuZC5cbiAqIFRlbXBsYXRlcyB3aXRoIHRoZSBtYXRjaGluZyBoZWFkZXJzIGxpdmUgaW4gYGFzc2V0cy9pbXBvcnQtdGVtcGxhdGVzL2AsIGFuZFxuICogdGhlIGJ1c2luZXNzLWZhY2luZyB3YWxrdGhyb3VnaCBpc1xuICogYGNvbnRlbnQvZG9jcy9ndWlkZXMvaW1wb3J0aW5nLXlvdXItZGF0YS5tZHhgLlxuICovXG5cbmV4cG9ydCB7IEFjY291bnRJbXBvcnRNYXBwaW5nIH0gZnJvbSAnLi9hY2NvdW50X2ltcG9ydC5tYXBwaW5nJztcbmV4cG9ydCB7IENvbnRhY3RJbXBvcnRNYXBwaW5nIH0gZnJvbSAnLi9jb250YWN0X2ltcG9ydC5tYXBwaW5nJztcbmV4cG9ydCB7IExlYWRJbXBvcnRNYXBwaW5nIH0gZnJvbSAnLi9sZWFkX2ltcG9ydC5tYXBwaW5nJztcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL21hcHBpbmdzL2FjY291bnRfaW1wb3J0Lm1hcHBpbmcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3MvYWNjb3VudF9pbXBvcnQubWFwcGluZy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lTWFwcGluZyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgSU5EVVNUUllfU1lOT05ZTVMgfSBmcm9tICcuL19zaGFyZWQnO1xuXG4vKipcbiAqIEFjY291bnQgaW1wb3J0IG1hcHBpbmcgXHUyMDE0IFwiaGVyZSBpcyBteSBhY2NvdW50cyBzcHJlYWRzaGVldCwgbG9hZCBpdFwiLlxuICpcbiAqIFVzZWQgYnkgcGFzc2luZyBgbWFwcGluZ05hbWU6ICdjcm1fYWNjb3VudF9pbXBvcnQnYCB0byB0aGUgaW1wb3J0IGVuZHBvaW50XG4gKiAoYFBPU1QgL2FwaS92MS9kYXRhL2NybV9hY2NvdW50L2ltcG9ydC9qb2JzYCkgaW5zdGVhZCBvZiBoYW5kLWJ1aWxkaW5nIGFcbiAqIHBlci1jb2x1bW4gbWFwcGluZyBpbiB0aGUgcmVxdWVzdC4gVGhlIGNvbHVtbnMgYmVsb3cgYXJlIHRoZSBvbmVzIGEgbm9ybWFsXG4gKiBDUk0vc3ByZWFkc2hlZXQgZXhwb3J0IGNhcnJpZXM7IGBhc3NldHMvaW1wb3J0LXRlbXBsYXRlcy9hY2NvdW50cy5jc3ZgIGlzIGFcbiAqIHJlYWR5LW1hZGUgc2hlZXQgd2l0aCBleGFjdGx5IHRoZXNlIGhlYWRlcnMuXG4gKlxuICogQmVoYXZpb3VyIHdvcnRoIGtub3dpbmcgYmVmb3JlIGNoYW5naW5nIGFueXRoaW5nIGhlcmU6XG4gKlxuICogLSAqKlN0cmljdCBwcm9qZWN0aW9uLioqIEEgbmFtZWQgbWFwcGluZyBlbWl0cyBPTkxZIHRoZSB0YXJnZXRzIGxpc3RlZFxuICogICBiZWxvdyBcdTIwMTQgZXZlcnkgb3RoZXIgY29sdW1uIGluIHRoZSBjdXN0b21lcidzIGZpbGUgaXMgZHJvcHBlZCByYXRoZXIgdGhhblxuICogICBwYXNzZWQgdGhyb3VnaCAoYHBhY2thZ2VzL3Jlc3Qvc3JjL2ltcG9ydC1tYXBwaW5nLnRzYCkuIFRoYXQgaXMgdGhlIHBvaW50OlxuICogICBhbiBleHBvcnQgZnJvbSBhbm90aGVyIHN5c3RlbSBjYXJyaWVzIGRvemVucyBvZiBjb2x1bW5zIHRoYXQgbXVzdCBub3RcbiAqICAgcmVhY2ggdGhlIHdyaXRlIHBhdGguIEl0IGFsc28gbWVhbnMgYSBmaWVsZCB0aGF0IGlzIG5vdCBsaXN0ZWQgaGVyZSBjYW5cbiAqICAgbmV2ZXIgYmUgaW1wb3J0ZWQgdGhyb3VnaCB0aGlzIG1hcHBpbmcuXG4gKiAtICoqVXBzZXJ0IGtleS4qKiBgY3JtX2FjY291bnQubmFtZWAgY2FycmllcyBhIHVuaXF1ZSBpbmRleCwgc28gaXQgaXMgdGhlXG4gKiAgIG5hdHVyYWwgYnVzaW5lc3Mga2V5OiByZS1ydW5uaW5nIHRoZSBzYW1lIGZpbGUgdXBkYXRlcyByYXRoZXIgdGhhblxuICogICBkdXBsaWNhdGVzLiBTb3VyY2UgbmFtZXMgYXJlIG1hdGNoZWQgdmVyYmF0aW0gXHUyMDE0IHRoZSBpbXBvcnQgcGF0aCBoYXMgbm9cbiAqICAgY2FzZS93aGl0ZXNwYWNlIG5vcm1hbGlzYXRpb24gc3RlcCwgc28gXCJBY21lIENvcnBcIiBhbmQgXCJBQ01FIENvcnBcIiBhcmUgdHdvXG4gKiAgIGFjY291bnRzLiBgdHJpbVdoaXRlc3BhY2VgIChvbiBieSBkZWZhdWx0KSByZW1vdmVzIHBhZGRpbmcgb25seS5cbiAqIC0gKipgbW9kZWAgLyBgdXBzZXJ0S2V5YCBhcmUgREVGQVVMVFMuKiogQW4gZXhwbGljaXQgYHdyaXRlTW9kZWAgL1xuICogICBgbWF0Y2hGaWVsZHNgIGluIHRoZSByZXF1ZXN0IHN0aWxsIHdpbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBBY2NvdW50SW1wb3J0TWFwcGluZyA9IGRlZmluZU1hcHBpbmcoe1xuICBuYW1lOiAnY3JtX2FjY291bnRfaW1wb3J0JyxcbiAgbGFiZWw6ICdBY2NvdW50IEltcG9ydCAoQ1NWKScsXG4gIHRhcmdldE9iamVjdDogJ2NybV9hY2NvdW50JyxcbiAgc291cmNlRm9ybWF0OiAnY3N2JywgLy8gYWxzbyBhY2NlcHRlZCBmb3IgLnhsc3ggdXBsb2FkcyBcdTIwMTQgYm90aCBhcmUgdGFidWxhclxuICBtb2RlOiAndXBzZXJ0JyxcbiAgdXBzZXJ0S2V5OiBbJ25hbWUnXSxcblxuICBmaWVsZE1hcHBpbmc6IFtcbiAgICB7IHNvdXJjZTogJ0FjY291bnQgTmFtZScsIHRhcmdldDogJ25hbWUnIH0sXG5cbiAgICB7XG4gICAgICBzb3VyY2U6ICdBY2NvdW50IFR5cGUnLFxuICAgICAgdGFyZ2V0OiAndHlwZScsXG4gICAgICB0cmFuc2Zvcm06ICdtYXAnLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIHZhbHVlTWFwOiB7XG4gICAgICAgICAgJ0NsaWVudCc6ICdjdXN0b21lcicsXG4gICAgICAgICAgJ1Jlc2VsbGVyJzogJ3BhcnRuZXInLFxuICAgICAgICAgICdDaHVybmVkJzogJ2Zvcm1lcicsXG4gICAgICAgICAgJ0xvc3QgQ3VzdG9tZXInOiAnZm9ybWVyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHtcbiAgICAgIHNvdXJjZTogJ0luZHVzdHJ5JyxcbiAgICAgIHRhcmdldDogJ2luZHVzdHJ5JyxcbiAgICAgIHRyYW5zZm9ybTogJ21hcCcsXG4gICAgICBwYXJhbXM6IHsgdmFsdWVNYXA6IElORFVTVFJZX1NZTk9OWU1TIH0sXG4gICAgfSxcblxuICAgIC8vIFRoZSBhY2NvdW50IGhvb2sgcmVqZWN0cyBhIHdlYnNpdGUgdGhhdCBpcyBub3QgaHR0cChzKSBcdTIwMTQga2VlcCBmdWxsIFVSTHNcbiAgICAvLyBpbiB0aGUgc291cmNlIHNoZWV0IChzZWUgYHNyYy9zYWxlcy9vYmplY3RzL2FjY291bnQuaG9vay50c2ApLlxuICAgIHsgc291cmNlOiAnV2Vic2l0ZScsIHRhcmdldDogJ3dlYnNpdGUnIH0sXG4gICAgeyBzb3VyY2U6ICdQaG9uZScsIHRhcmdldDogJ3Bob25lJyB9LFxuICAgIHsgc291cmNlOiAnQW5udWFsIFJldmVudWUnLCB0YXJnZXQ6ICdhbm51YWxfcmV2ZW51ZScgfSxcbiAgICB7IHNvdXJjZTogJ0VtcGxveWVlcycsIHRhcmdldDogJ251bWJlcl9vZl9lbXBsb3llZXMnIH0sXG4gICAgeyBzb3VyY2U6ICdEZXNjcmlwdGlvbicsIHRhcmdldDogJ2Rlc2NyaXB0aW9uJyB9LFxuXG4gICAgLy8gT3duZXIgcmVzb2x1dGlvbi4gVkVSSUZJRUQgYWdhaW5zdCB0aGUgcGxhdGZvcm0gaW1wb3J0IHBhdGhcbiAgICAvLyAoYHBhY2thZ2VzL3Jlc3Qvc3JjL2ltcG9ydC1ydW5uZXIudHNgIFx1MjE5MiBgcmVzb2x2ZVJlZmApOiBhIHJlZmVyZW5jZSBjZWxsXG4gICAgLy8gaXMgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgcmVmZXJlbmNlZCBvYmplY3QgYnkgYGlkYCwgdGhlIGZpZWxkJ3NcbiAgICAvLyBgZGlzcGxheUZpZWxkYCwgdGhlbiBgbmFtZWAgLyBgdGl0bGVgIC8gYGxhYmVsYCAvIGBmdWxsX25hbWVgIC8gYGVtYWlsYCAvXG4gICAgLy8gYHVzZXJuYW1lYC4gYHN5c191c2VyYCBoYXMgYW4gYGVtYWlsYCBjb2x1bW4sIHNvIGFuIG93bmVyLWVtYWlsIGNlbGxcbiAgICAvLyByZXNvbHZlcyB0byB0aGF0IHVzZXIncyBpZCBcdTIwMTQgbm8gc2VwYXJhdGUgcmVzb2x1dGlvbiBzdGVwIGlzIG5lZWRlZCBoZXJlLlxuICAgIC8vIEFuIGFkZHJlc3MgdGhhdCBtYXRjaGVzIG5vIHVzZXIgRkFJTFMgdGhlIHJvdyAoYHJlZmVyZW5jZV9ub3RfZm91bmRgKTtcbiAgICAvLyBsZWF2aW5nIHRoZSBjZWxsIEJMQU5LIGlzIHRoZSBzdXBwb3J0ZWQgZmFsbGJhY2sgXHUyMDE0IHRoZSBzZWN1cml0eVxuICAgIC8vIG1pZGRsZXdhcmUncyBpbnNlcnQtdGltZSBzdGFtcCB0aGVuIG1ha2VzIHRoZSBpbXBvcnRpbmcgdXNlciB0aGUgb3duZXJcbiAgICAvLyAodGhlIGltcG9ydCB3cml0ZSBjYXJyaWVzIHRoZSBpbXBvcnRlcidzIGNvbnRleHQsIG5vdCBgaXNTeXN0ZW1gKS5cbiAgICAvL1xuICAgIC8vIFRoZSB0YXJnZXQgaXMgYG93bmVyX2lkYCwgdGhlIHBsYXRmb3JtIG93bmVyc2hpcCBhbmNob3IgXHUyMDE0ICM1NDggcmV0aXJlZFxuICAgIC8vIHRoZSBhcHAtYXV0aG9yZWQgYG93bmVyYCBsb29rdXAgdGhpcyB1c2VkIHRvIG5hbWUuIEEgcmVzb2x2ZWQgY2VsbCBpc1xuICAgIC8vIHRoZXJlZm9yZSBhbiBvd25lcnNoaXAgVFJBTlNGRVI6IGl0IHBsYW50cyB0aGUgcm93IHVuZGVyIHNvbWVvbmUgb3RoZXJcbiAgICAvLyB0aGFuIHRoZSBpbXBvcnRlciwgd2hpY2ggdGhlICMzMDA0IGd1YXJkIGRlbmllcyB1bmxlc3MgdGhlIGltcG9ydGluZyB1c2VyXG4gICAgLy8gaG9sZHMgYGFsbG93VHJhbnNmZXJgIChzeXN0ZW1fYWRtaW4gLyBzYWxlc19tYW5hZ2VyIGRvKS4gVGhhdCBpcyB0aGVcbiAgICAvLyBpbnRlbmRlZCBwb3N0dXJlIFx1MjAxNCBhIGJ1bGsgZmlsZSB0aGF0IHNpbGVudGx5IHJlYXNzaWducyB0aGUgYm9vayBpc1xuICAgIC8vIGV4YWN0bHkgd2hhdCB0aGUgZ3JhbnQgZXhpc3RzIHRvIGdhdGUuXG4gICAgeyBzb3VyY2U6ICdBY2NvdW50IE93bmVyIEVtYWlsJywgdGFyZ2V0OiAnb3duZXJfaWQnLCB0cmFuc2Zvcm06ICdsb29rdXAnIH0sXG5cbiAgICAvLyBTZWxmLXJlZmVyZW5jZTogYSBwYXJlbnQgbmFtZWQgbGF0ZXIgaW4gdGhlIHNhbWUgZmlsZSBzdGlsbCByZXNvbHZlcyBcdTIwMTRcbiAgICAvLyB0aGUgcnVubmVyIGZsdXNoZXMgYnVmZmVyZWQgY3JlYXRlcyBhbmQgcmV0cmllcyBvbmNlIChmcmFtZXdvcmsjMzE0OCkuXG4gICAgeyBzb3VyY2U6ICdQYXJlbnQgQWNjb3VudCcsIHRhcmdldDogJ3BhcmVudF9hY2NvdW50JywgdHJhbnNmb3JtOiAnbG9va3VwJyB9LFxuXG4gICAgLy8gTk9UIE1BUFBFRCBcdTIwMTQgYGJpbGxpbmdfYWRkcmVzc2AgLyBgb2ZmaWNlX2xvY2F0aW9uYCBhcmUgc3RydWN0dXJlZFxuICAgIC8vIChqc29uLWJhY2tlZCBgYWRkcmVzc2AgLyBgbG9jYXRpb25gKSBmaWVsZHMuIEEgam9pbmVkIHN0cmluZyBpcyBub3QgYVxuICAgIC8vIHdheSBpbjogdGhlIGVuZ2luZSByZWplY3RzIGl0IHBlciByb3cgXHUyMDE0IG1lYXN1cmVkLCBgQmlsbGluZyBBZGRyZXNzIGhhcyBhblxuICAgIC8vIGludmFsaWQgYWRkcmVzcyB2YWx1ZTogSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgb2JqZWN0LCByZWNlaXZlZCBzdHJpbmdgLlxuICAgIC8vIChUaGUgZHJ5IHJ1biBkb2VzIE5PVCBwcmVkaWN0IHRoYXQgcmVqZWN0aW9uOyBpdCByZXBvcnRzIHRoZSByb3cgb2suXG4gICAgLy8gRnJhbWV3b3JrLXNpZGUsIGZpbGVkIGFzIG9iamVjdHN0YWNrLWFpL29iamVjdHN0YWNrIzQ2MzMuKVxuICAgIC8vIEFkZHJlc3MgY29sdW1ucyBhcmUgdGhlcmVmb3JlIGxlZnQgb3V0IG9mIHRoZSBhY2NvdW50IHRlbXBsYXRlLiBBIHRhcmdldFxuICAgIC8vIG1heSBub3cgbmFtZSBhIGRlY2xhcmVkIFBBUlQgb2YgYSBjb21wb3VuZCBmaWVsZCBcdTIwMTQgYGNvbnRhY3RfaW1wb3J0Lm1hcHBpbmcudHNgXG4gICAgLy8gbWFwcyBmaXZlIGNvbHVtbnMgaW50byBgbWFpbGluZ19hZGRyZXNzLnN0cmVldGAgXHUyMDI2IGAuY291bnRyeWAgKCMxODM2KSBcdTIwMTQgc29cbiAgICAvLyBhZGRpbmcgYWRkcmVzcyBjb2x1bW5zIGhlcmUgd291bGQgYmUgYSB0ZW1wbGF0ZSBjaGFuZ2UsIG5vdCBhIHBsYXRmb3JtIGdhcC5cbiAgXSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3MvX3NoYXJlZC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9tYXBwaW5nc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9tYXBwaW5ncy9fc2hhcmVkLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFNoYXJlZCB2YWx1ZSBtYXBzIGZvciB0aGUgaW1wb3J0IG1hcHBpbmdzLlxuICpcbiAqIFRoZSBpbXBvcnQgcGF0aCBhbHJlYWR5IG1hdGNoZXMgYSBwaWNrbGlzdCBjZWxsIGFnYWluc3QgdGhlIGZpZWxkJ3Mgb3B0aW9uXG4gKiBWQUxVRSBleGFjdGx5IGFuZCBpdHMgTEFCRUwgY2FzZS1pbnNlbnNpdGl2ZWx5IChgaW1wb3J0LWNvZXJjZS50c2AgXHUyMTkyXG4gKiBgbWF0Y2hPcHRpb25gKSwgc28gXCJUZWNobm9sb2d5XCIgKGxhYmVsKSBhbmQgXCJ0ZWNobm9sb2d5XCIgKHZhbHVlKSBib3RoIGxhbmRcbiAqIHdpdGhvdXQgYW55IGhlbHAgZnJvbSB1cyBcdTIwMTQgYnV0IGFuIHVwcGVyLWNhc2VkIHZhbHVlIGRvZXMgTk9UOiBcIkhSXCIgaXNcbiAqIG5laXRoZXIgdGhlIHZhbHVlIGBocmAgbm9yIHRoZSBsYWJlbCBcIkh1bWFuIFJlc291cmNlc1wiICgjMTk5OCkuIFRoZXNlIG1hcHNcbiAqIGV4aXN0IG9ubHkgZm9yIHRoZSB2b2NhYnVsYXJ5IGEgc3ByZWFkc2hlZXQgdXNlcyB0aGF0IG1hdGNoZXMgbm8gb3B0aW9uIFx1MjAxNFxuICogdGhlIHdvcmRzIGEgU2FsZXNmb3JjZS9IdWJTcG90L0V4Y2VsIGV4cG9ydCB3cml0ZXMgdGhhdCBIb3RDUk0gaGFzIG5vIG9wdGlvblxuICogZm9yIChcIlNhYVNcIiwgXCJUcmFkZSBTaG93XCIsIFwiQ2xpZW50XCIpLCBhbmQgdGhlIGFiYnJldmlhdGlvbnMgb3VyIG93biBzaGlwcGVkXG4gKiB0ZW1wbGF0ZXMgd3JpdGUgKFwiSFJcIikuIEFueXRoaW5nIG5vdCBsaXN0ZWQgaGVyZSBmYWxscyB0aHJvdWdoXG4gKiB1bnRvdWNoZWQgYW5kIGlzIG1hdGNoZWQgbm9ybWFsbHk7IGFuIHVua25vd24gdmFsdWUgZmFpbHMgaXRzIHJvdyB3aXRoXG4gKiBgaW52YWxpZF9vcHRpb25gIHJhdGhlciB0aGFuIGJlaW5nIHNpbGVudGx5IGRyb3BwZWQuXG4gKlxuICogS2VlcCB0aGVzZSBsaXN0cyBzbWFsbCBhbmQgZGVmZW5zaWJsZS4gVGhleSBhcmUgYSB0cmFuc2xhdGlvbiB0YWJsZSBmb3JcbiAqIGtub3duIHN5bm9ueW1zLCBOT1QgYSBcIm1ha2UgYW55IHNwcmVhZHNoZWV0IHdvcmtcIiBmYWxsYmFjayBcdTIwMTQgZXZlcnkgZW50cnlcbiAqIGhlcmUgaXMgYSB2YWx1ZSBhIHJlYWwgZXhwb3J0IHByb2R1Y2VzLCBhbmQgdGhlIHJvdy1sZXZlbCBlcnJvciBpcyB0aGVcbiAqIGludGVuZGVkIG91dGNvbWUgZm9yIGV2ZXJ5dGhpbmcgZWxzZS5cbiAqL1xuXG4vKiogRm9yZWlnbiBzcGVsbGluZ3MgXHUyMTkyIGBJTkRVU1RSWV9PUFRJT05TYCB2YWx1ZXMgKGBzcmMvc2FsZXMvb2JqZWN0cy9fcGlja2xpc3RzLnRzYCkuICovXG5leHBvcnQgY29uc3QgSU5EVVNUUllfU1lOT05ZTVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdTYWFTJzogJ3NvZnR3YXJlJyxcbiAgJ1NhYXMnOiAnc29mdHdhcmUnLFxuICAnSVQnOiAndGVjaG5vbG9neScsXG4gICdUZWNoJzogJ3RlY2hub2xvZ3knLFxuICAnSW5mb3JtYXRpb24gVGVjaG5vbG9neSc6ICd0ZWNobm9sb2d5JyxcbiAgJ0ZpbmFuY2lhbCBTZXJ2aWNlcyc6ICdmaW5hbmNlJyxcbiAgJ0JhbmtpbmcnOiAnZmluYW5jZScsXG4gICdJbnN1cmFuY2UnOiAnZmluYW5jZScsXG4gICdIZWFsdGggQ2FyZSc6ICdoZWFsdGhjYXJlJyxcbiAgJ1BoYXJtYWNldXRpY2Fscyc6ICdoZWFsdGhjYXJlJyxcbiAgJ0UtY29tbWVyY2UnOiAncmV0YWlsJyxcbiAgJ0Vjb21tZXJjZSc6ICdyZXRhaWwnLFxuICAnQ29uc3VtZXIgR29vZHMnOiAncmV0YWlsJyxcbiAgJ1RyYW5zcG9ydGF0aW9uJzogJ2xvZ2lzdGljcycsXG4gICdVdGlsaXRpZXMnOiAnZW5lcmd5JyxcbiAgJ09pbCAmIEdhcyc6ICdlbmVyZ3knLFxuICAnUHVibGljIFNlY3Rvcic6ICdnb3Zlcm5tZW50JyxcbiAgJ05vbiBQcm9maXQnOiAnbm9ucHJvZml0JyxcbiAgJ05vbi1Qcm9maXQnOiAnbm9ucHJvZml0JyxcbiAgJ05HTyc6ICdub25wcm9maXQnLFxuICAnVHJhdmVsICYgSG9zcGl0YWxpdHknOiAnaG9zcGl0YWxpdHknLFxufTtcblxuLyoqIEZvcmVpZ24gc3BlbGxpbmdzIFx1MjE5MiBgTEVBRF9TT1VSQ0VfT1BUSU9OU2AgdmFsdWVzLiAqL1xuZXhwb3J0IGNvbnN0IExFQURfU09VUkNFX1NZTk9OWU1TOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnV2Vic2l0ZSc6ICd3ZWInLFxuICAnV2ViIFNpdGUnOiAnd2ViJyxcbiAgJ0luYm91bmQnOiAnd2ViJyxcbiAgJ1dvcmQgb2YgbW91dGgnOiAncmVmZXJyYWwnLFxuICAnQ3VzdG9tZXIgUmVmZXJyYWwnOiAncmVmZXJyYWwnLFxuICAnVHJhZGUgU2hvdyc6ICdldmVudCcsXG4gICdDb25mZXJlbmNlJzogJ2V2ZW50JyxcbiAgJ1NlbWluYXInOiAnd2ViaW5hcicsXG4gICdQYXJ0bmVyIFJlZmVycmFsJzogJ3BhcnRuZXInLFxuICAnR29vZ2xlIEFkcyc6ICdwYWlkX3NlYXJjaCcsXG4gICdBZFdvcmRzJzogJ3BhaWRfc2VhcmNoJyxcbiAgJ1NFTSc6ICdwYWlkX3NlYXJjaCcsXG4gICdMaW5rZWRJbic6ICdzb2NpYWwnLFxuICAnRmFjZWJvb2snOiAnc29jaWFsJyxcbiAgJ1gnOiAnc29jaWFsJyxcbiAgJ1R3aXR0ZXInOiAnc29jaWFsJyxcbiAgJ0Jsb2cnOiAnY29udGVudCcsXG4gICdXaGl0ZXBhcGVyJzogJ2NvbnRlbnQnLFxuICAnUGhvbmUgSW5xdWlyeSc6ICdjb2xkX2NhbGwnLFxuICAnT3V0Ym91bmQnOiAnY29sZF9jYWxsJyxcbiAgJ0VtYWlsJzogJ2VtYWlsX2NhbXBhaWduJyxcbiAgJ05ld3NsZXR0ZXInOiAnZW1haWxfY2FtcGFpZ24nLFxufTtcblxuLyoqXG4gKiBTcGVsbGluZ3MgXHUyMTkyIGBjcm1fY29udGFjdC5kZXBhcnRtZW50YCBvcHRpb24gdmFsdWVzLiBUaGUgc2hpcHBlZFxuICogYGFzc2V0cy9pbXBvcnQtdGVtcGxhdGVzL2NvbnRhY3RzLmNzdmAgd3JpdGVzIGVpZ2h0IGRlcGFydG1lbnRzOyBzZXZlbiBhcmVcbiAqIG9wdGlvbiBsYWJlbHMgYW5kIGxhbmQgdW5haWRlZCwgXCJIUlwiIGlzIHRoZSBvbmUgdGhhdCBtYXRjaGVzIG5vdGhpbmcgKCMxOTk4KS5cbiAqIFx1MjZENCBUaGUgdGVtcGxhdGUgaXMgYSBjdXN0b21lci1mYWNpbmcgY29udHJhY3QgKCMxODM2KSBcdTIwMTQgdGhlIGZpeCBsaXZlcyBoZXJlLFxuICogbm90IGluIHRoZSBmaWxlLlxuICovXG5leHBvcnQgY29uc3QgREVQQVJUTUVOVF9TWU5PTllNUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ0hSJzogJ2hyJyxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9tYXBwaW5ncy9jb250YWN0X2ltcG9ydC5tYXBwaW5nLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL21hcHBpbmdzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL21hcHBpbmdzL2NvbnRhY3RfaW1wb3J0Lm1hcHBpbmcudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZU1hcHBpbmcgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB7IERFUEFSVE1FTlRfU1lOT05ZTVMsIExFQURfU09VUkNFX1NZTk9OWU1TIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLyoqXG4gKiBDb250YWN0IGltcG9ydCBtYXBwaW5nIFx1MjAxNCBzZWUgYGFjY291bnRfaW1wb3J0Lm1hcHBpbmcudHNgIGZvciB0aGUgc2hhcmVkXG4gKiBub3RlcyBvbiBzdHJpY3QgcHJvamVjdGlvbiBhbmQgb24gYG1vZGVgIC8gYHVwc2VydEtleWAgYWN0aW5nIGFzIGRlZmF1bHRzLlxuICpcbiAqIENvbnRhY3Qtc3BlY2lmaWMgdGhpbmdzIHRvIGtub3c6XG4gKlxuICogLSAqKkFjY291bnRzIGZpcnN0LioqIGBjcm1fY29udGFjdC5jcm1fYWNjb3VudGAgaXMgYSBSRVFVSVJFRCBtYXN0ZXItZGV0YWlsXG4gKiAgIGxpbmssIHNvIHRoZSBcIkFjY291bnQgTmFtZVwiIGNvbHVtbiBtdXN0IG5hbWUgYW4gYWNjb3VudCB0aGF0IGFscmVhZHlcbiAqICAgZXhpc3RzLiBJbXBvcnQgYWNjb3VudHMgYmVmb3JlIGNvbnRhY3RzOyBhIHJvdyB3aG9zZSBhY2NvdW50IGNhbm5vdCBiZVxuICogICByZXNvbHZlZCBmYWlscyB3aXRoIGByZWZlcmVuY2Vfbm90X2ZvdW5kYCBhbmQgbm90aGluZyBpcyB3cml0dGVuIGZvciBpdC5cbiAqIC0gKipFbWFpbCBpcyB0aGUgYnVzaW5lc3Mga2V5LioqIEl0IGlzIGByZXF1aXJlZGAgKyBgdW5pcXVlYCBvbiB0aGUgb2JqZWN0LFxuICogICBhbmQgYGNybV9jb250YWN0YCdzIGhvb2sgbG93ZXJjYXNlcyBpdCBhbmQgcmVqZWN0cyBhIHNlY29uZCBjb250YWN0IHdpdGhcbiAqICAgdGhlIHNhbWUgYWRkcmVzcyBcdTIwMTQgc28gYHVwc2VydEtleTogWydlbWFpbCddYCBtYXRjaGVzIGhvdyB0aGUgb2JqZWN0XG4gKiAgIGFscmVhZHkgYmVoYXZlcyByYXRoZXIgdGhhbiBpbnZlbnRpbmcgYSBzZWNvbmQgbm90aW9uIG9mIGlkZW50aXR5LlxuICogLSBBZGRyZXNzOiB0aGUgdGVtcGxhdGUncyBmaXZlIGBNYWlsaW5nIFx1MjAyNmAgY29sdW1ucyBzdGF5IGFzIHRoZXkgYXJlLCBhbmRcbiAqICAgZWFjaCBvbmUgdGFyZ2V0cyBhIHBhcnQgb2YgdGhlIHN0cnVjdHVyZWQgYG1haWxpbmdfYWRkcmVzc2AgZmllbGRcbiAqICAgKGBtYWlsaW5nX2FkZHJlc3Muc3RyZWV0YCwgXHUyMDI2KSBcdTIwMTQgdGhlIGN1c3RvbWVyJ3MgZmlsZSBkaWQgbm90IGNoYW5nZSB3aGVuXG4gKiAgIHRoZSBmaXZlIGZsYXQgYG1haWxpbmdfKmAgZmllbGRzIGJlY2FtZSBvbmUgYEZpZWxkLmFkZHJlc3MoKWAgKCMxODM2KS5cbiAqL1xuZXhwb3J0IGNvbnN0IENvbnRhY3RJbXBvcnRNYXBwaW5nID0gZGVmaW5lTWFwcGluZyh7XG4gIG5hbWU6ICdjcm1fY29udGFjdF9pbXBvcnQnLFxuICBsYWJlbDogJ0NvbnRhY3QgSW1wb3J0IChDU1YpJyxcbiAgdGFyZ2V0T2JqZWN0OiAnY3JtX2NvbnRhY3QnLFxuICBzb3VyY2VGb3JtYXQ6ICdjc3YnLFxuICBtb2RlOiAndXBzZXJ0JyxcbiAgdXBzZXJ0S2V5OiBbJ2VtYWlsJ10sXG5cbiAgZmllbGRNYXBwaW5nOiBbXG4gICAgeyBzb3VyY2U6ICdTYWx1dGF0aW9uJywgdGFyZ2V0OiAnc2FsdXRhdGlvbicgfSxcbiAgICB7IHNvdXJjZTogJ0ZpcnN0IE5hbWUnLCB0YXJnZXQ6ICdmaXJzdF9uYW1lJyB9LFxuICAgIHsgc291cmNlOiAnTGFzdCBOYW1lJywgdGFyZ2V0OiAnbGFzdF9uYW1lJyB9LFxuXG4gICAgLy8gUmVxdWlyZWQgbWFzdGVyLWRldGFpbCBwYXJlbnQ7IHJlc29sdmVkIGJ5IGFjY291bnQgbmFtZS5cbiAgICB7IHNvdXJjZTogJ0FjY291bnQgTmFtZScsIHRhcmdldDogJ2NybV9hY2NvdW50JywgdHJhbnNmb3JtOiAnbG9va3VwJyB9LFxuXG4gICAgeyBzb3VyY2U6ICdUaXRsZScsIHRhcmdldDogJ3RpdGxlJyB9LFxuICAgIHtcbiAgICAgIHNvdXJjZTogJ0RlcGFydG1lbnQnLFxuICAgICAgdGFyZ2V0OiAnZGVwYXJ0bWVudCcsXG4gICAgICB0cmFuc2Zvcm06ICdtYXAnLFxuICAgICAgcGFyYW1zOiB7IHZhbHVlTWFwOiBERVBBUlRNRU5UX1NZTk9OWU1TIH0sXG4gICAgfSxcbiAgICB7IHNvdXJjZTogJ0VtYWlsJywgdGFyZ2V0OiAnZW1haWwnIH0sXG4gICAgeyBzb3VyY2U6ICdQaG9uZScsIHRhcmdldDogJ3Bob25lJyB9LFxuICAgIHsgc291cmNlOiAnTW9iaWxlJywgdGFyZ2V0OiAnbW9iaWxlJyB9LFxuXG4gICAgLy8gRml2ZSB0ZW1wbGF0ZSBjb2x1bW5zLCBvbmUgc3RydWN0dXJlZCBmaWVsZDogZWFjaCBjb2x1bW4gbmFtZXMgYSBwYXJ0XG4gICAgLy8gb2YgYG1haWxpbmdfYWRkcmVzc2AsIGFuZCB0aGUgaW1wb3J0IGFzc2VtYmxlcyB0aGUgcGFydHMgb25lIHJvdyBtYXBzXG4gICAgLy8gaW50byB0aGF0IGZpZWxkJ3Mgc2luZ2xlIHZhbHVlLlxuICAgIHsgc291cmNlOiAnTWFpbGluZyBTdHJlZXQnLCB0YXJnZXQ6ICdtYWlsaW5nX2FkZHJlc3Muc3RyZWV0JyB9LFxuICAgIHsgc291cmNlOiAnTWFpbGluZyBDaXR5JywgdGFyZ2V0OiAnbWFpbGluZ19hZGRyZXNzLmNpdHknIH0sXG4gICAgeyBzb3VyY2U6ICdNYWlsaW5nIFN0YXRlJywgdGFyZ2V0OiAnbWFpbGluZ19hZGRyZXNzLnN0YXRlJyB9LFxuICAgIHsgc291cmNlOiAnTWFpbGluZyBQb3N0YWwgQ29kZScsIHRhcmdldDogJ21haWxpbmdfYWRkcmVzcy5wb3N0YWxDb2RlJyB9LFxuICAgIHsgc291cmNlOiAnTWFpbGluZyBDb3VudHJ5JywgdGFyZ2V0OiAnbWFpbGluZ19hZGRyZXNzLmNvdW50cnknIH0sXG5cbiAgICB7XG4gICAgICBzb3VyY2U6ICdMZWFkIFNvdXJjZScsXG4gICAgICB0YXJnZXQ6ICdsZWFkX3NvdXJjZScsXG4gICAgICB0cmFuc2Zvcm06ICdtYXAnLFxuICAgICAgcGFyYW1zOiB7IHZhbHVlTWFwOiBMRUFEX1NPVVJDRV9TWU5PTllNUyB9LFxuICAgIH0sXG5cbiAgICB7IHNvdXJjZTogJ0Rlc2NyaXB0aW9uJywgdGFyZ2V0OiAnZGVzY3JpcHRpb24nIH0sXG5cbiAgICAvLyBPd25lci1lbWFpbCByZXNvbHV0aW9uLCB0aGUgYmxhbmstY2VsbCBmYWxsYmFjaywgYW5kIHdoeSBhIGZpbGxlZCBjZWxsXG4gICAgLy8gbmVlZHMgYGFsbG93VHJhbnNmZXJgOiBzZWUgdGhlIGxvbmcgbm90ZSBpbiBgYWNjb3VudF9pbXBvcnQubWFwcGluZy50c2AuXG4gICAgeyBzb3VyY2U6ICdDb250YWN0IE93bmVyIEVtYWlsJywgdGFyZ2V0OiAnb3duZXJfaWQnLCB0cmFuc2Zvcm06ICdsb29rdXAnIH0sXG4gIF0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL21hcHBpbmdzL2xlYWRfaW1wb3J0Lm1hcHBpbmcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvbWFwcGluZ3MvbGVhZF9pbXBvcnQubWFwcGluZy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lTWFwcGluZyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgSU5EVVNUUllfU1lOT05ZTVMsIExFQURfU09VUkNFX1NZTk9OWU1TIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLyoqXG4gKiBMZWFkIGltcG9ydCBtYXBwaW5nIFx1MjAxNCBzZWUgYGFjY291bnRfaW1wb3J0Lm1hcHBpbmcudHNgIGZvciB0aGUgc2hhcmVkIG5vdGVzXG4gKiBvbiBzdHJpY3QgcHJvamVjdGlvbiBhbmQgb24gYG1vZGVgIC8gYHVwc2VydEtleWAgYWN0aW5nIGFzIGRlZmF1bHRzLlxuICpcbiAqIExlYWQtc3BlY2lmaWMgdGhpbmdzIHRvIGtub3c6XG4gKlxuICogLSAqKkVtYWlsIGlzIHRoZSBidXNpbmVzcyBrZXkqKiAoYHJlcXVpcmVkYCBvbiB0aGUgb2JqZWN0KSwgc28gYSByZS1ydW4gb2ZcbiAqICAgdGhlIHNhbWUgZmlsZSB1cGRhdGVzIHRoZSBleGlzdGluZyBsZWFkIGluc3RlYWQgb2YgY3JlYXRpbmcgYSB0d2luLlxuICogLSAqKmBzdGF0dXNgIGhhcyBhIGRlZmF1bHQgb2YgYG5ld2AqKiBcdTIwMTQgbGVhdmUgdGhlIGNvbHVtbiBibGFuayBhbmQgdGhlIGxlYWRcbiAqICAgbGFuZHMgYXMgTmV3LiBgY3JtX2xlYWRgJ3Mgc3RhdGUgbWFjaGluZSBvbmx5IGFjY2VwdHMgYW4gaW5pdGlhbCBzdGF0dXMsXG4gKiAgIHNvIGltcG9ydGluZyBhIG1pZC1saWZlY3ljbGUgc3RhdHVzIGlzIGEgbm9ybWFsIHdyaXRlIGhlcmUsIG5vdCBhXG4gKiAgIHRyYW5zaXRpb24uXG4gKiAtICoqQSBibGFuayBvd25lciBsYW5kcyB3aXRoIHRoZSBJTVBPUlRFUiwgbm90IHdpdGggYXV0by1hc3NpZ25tZW50LioqXG4gKiAgIGBsZWFkX2F1dG9fYXNzaWduYCAoYHNyYy9zYWxlcy9vYmplY3RzL2xlYWQuaG9vay50c2ApIG9ubHkgcm91dGVzIGEgbGVhZCB3aG9zZVxuICogICBgb3duZXJfaWRgIGlzIHN0aWxsIGVtcHR5IHdoZW4gdGhlIGhvb2sgcnVucyBcdTIwMTQgYW5kIHRoZSBpbXBvcnQgd3JpdGUgY2Fycmllc1xuICogICB0aGUgaW1wb3J0ZXIncyBvd24gY29udGV4dCwgc28gdGhlIHNlY3VyaXR5IG1pZGRsZXdhcmUgaGFzIEFMUkVBRFkgc3RhbXBlZFxuICogICBgb3duZXJfaWRgIHRvIHRoZW0gYnkgdGhlIHRpbWUgYGJlZm9yZUluc2VydGAgcnVucyAodGhlIGd1YXJkIGlzIGFuXG4gKiAgIG9wZXJhdGlvbiBtaWRkbGV3YXJlLCBvdXRzaWRlIHRoZSBob29rIHBoYXNlKS4gTWVhc3VyZWQgb24gYSByZWFsIGltcG9ydFxuICogICBiZWZvcmUgIzU0OCwgd2hlbiBhIGZpZWxkIGBkZWZhdWx0VmFsdWVgIHByb2R1Y2VkIHRoZSBzYW1lIG91dGNvbWUgb25lIHN0ZXBcbiAqICAgZWFybGllcjogYWxsIDUwIHRlbXBsYXRlIHJvd3MgbGFuZGVkIG93bmVkIGJ5IHRoZSBpbXBvcnRpbmcgdXNlciwgbm9uZSBieVxuICogICB0aGUgcm91bmQtcm9iaW4uIEZpbGwgXCJMZWFkIE93bmVyIEVtYWlsXCIgd2hlbiB0aGUgc291cmNlIGZpbGUga25vd3Mgd2hvXG4gKiAgIG93bnMgdGhlIGxlYWQ7IG90aGVyd2lzZSByZWFzc2lnbiBhZnRlciB0aGUgaW1wb3J0LlxuICovXG5leHBvcnQgY29uc3QgTGVhZEltcG9ydE1hcHBpbmcgPSBkZWZpbmVNYXBwaW5nKHtcbiAgbmFtZTogJ2NybV9sZWFkX2ltcG9ydCcsXG4gIGxhYmVsOiAnTGVhZCBJbXBvcnQgKENTViknLFxuICB0YXJnZXRPYmplY3Q6ICdjcm1fbGVhZCcsXG4gIHNvdXJjZUZvcm1hdDogJ2NzdicsXG4gIG1vZGU6ICd1cHNlcnQnLFxuICB1cHNlcnRLZXk6IFsnZW1haWwnXSxcblxuICBmaWVsZE1hcHBpbmc6IFtcbiAgICB7IHNvdXJjZTogJ1NhbHV0YXRpb24nLCB0YXJnZXQ6ICdzYWx1dGF0aW9uJyB9LFxuICAgIHsgc291cmNlOiAnRmlyc3QgTmFtZScsIHRhcmdldDogJ2ZpcnN0X25hbWUnIH0sXG4gICAgeyBzb3VyY2U6ICdMYXN0IE5hbWUnLCB0YXJnZXQ6ICdsYXN0X25hbWUnIH0sXG4gICAgeyBzb3VyY2U6ICdDb21wYW55JywgdGFyZ2V0OiAnY29tcGFueScgfSxcbiAgICB7IHNvdXJjZTogJ1RpdGxlJywgdGFyZ2V0OiAndGl0bGUnIH0sXG5cbiAgICB7XG4gICAgICBzb3VyY2U6ICdJbmR1c3RyeScsXG4gICAgICB0YXJnZXQ6ICdpbmR1c3RyeScsXG4gICAgICB0cmFuc2Zvcm06ICdtYXAnLFxuICAgICAgcGFyYW1zOiB7IHZhbHVlTWFwOiBJTkRVU1RSWV9TWU5PTllNUyB9LFxuICAgIH0sXG5cbiAgICB7IHNvdXJjZTogJ0VtYWlsJywgdGFyZ2V0OiAnZW1haWwnIH0sXG4gICAgeyBzb3VyY2U6ICdQaG9uZScsIHRhcmdldDogJ3Bob25lJyB9LFxuICAgIHsgc291cmNlOiAnTW9iaWxlJywgdGFyZ2V0OiAnbW9iaWxlJyB9LFxuICAgIHsgc291cmNlOiAnV2Vic2l0ZScsIHRhcmdldDogJ3dlYnNpdGUnIH0sXG5cbiAgICB7XG4gICAgICBzb3VyY2U6ICdMZWFkIFN0YXR1cycsXG4gICAgICB0YXJnZXQ6ICdzdGF0dXMnLFxuICAgICAgdHJhbnNmb3JtOiAnbWFwJyxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICB2YWx1ZU1hcDoge1xuICAgICAgICAgICdPcGVuJzogJ25ldycsXG4gICAgICAgICAgJ1dvcmtpbmcnOiAnY29udGFjdGVkJyxcbiAgICAgICAgICAnSW4gUHJvZ3Jlc3MnOiAnY29udGFjdGVkJyxcbiAgICAgICAgICAnTnVydHVyaW5nJzogJ2NvbnRhY3RlZCcsXG4gICAgICAgICAgJ0Rpc3F1YWxpZmllZCc6ICd1bnF1YWxpZmllZCcsXG4gICAgICAgICAgJ0Nsb3NlZCAtIE5vdCBDb252ZXJ0ZWQnOiAndW5xdWFsaWZpZWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAge1xuICAgICAgc291cmNlOiAnTGVhZCBTb3VyY2UnLFxuICAgICAgdGFyZ2V0OiAnbGVhZF9zb3VyY2UnLFxuICAgICAgdHJhbnNmb3JtOiAnbWFwJyxcbiAgICAgIHBhcmFtczogeyB2YWx1ZU1hcDogTEVBRF9TT1VSQ0VfU1lOT05ZTVMgfSxcbiAgICB9LFxuXG4gICAgeyBzb3VyY2U6ICdBbm51YWwgUmV2ZW51ZScsIHRhcmdldDogJ2FubnVhbF9yZXZlbnVlJyB9LFxuICAgIHsgc291cmNlOiAnRW1wbG95ZWVzJywgdGFyZ2V0OiAnbnVtYmVyX29mX2VtcGxveWVlcycgfSxcbiAgICB7IHNvdXJjZTogJ0Rlc2NyaXB0aW9uJywgdGFyZ2V0OiAnZGVzY3JpcHRpb24nIH0sXG5cbiAgICAvLyBPd25lci1lbWFpbCByZXNvbHV0aW9uIGFuZCB0aGUgYGFsbG93VHJhbnNmZXJgIGdhdGUgb24gYSBmaWxsZWQgY2VsbDpcbiAgICAvLyBzZWUgdGhlIGxvbmcgbm90ZSBpbiBgYWNjb3VudF9pbXBvcnQubWFwcGluZy50c2AuIFRoZSBibGFuay1jZWxsXG4gICAgLy8gYmVoYXZpb3VyIGRpZmZlcnMgXHUyMDE0IHNlZSB0aGUgaGVhZGVyIGNvbW1lbnQgYWJvdmUuXG4gICAgeyBzb3VyY2U6ICdMZWFkIE93bmVyIEVtYWlsJywgdGFyZ2V0OiAnb3duZXJfaWQnLCB0cmFuc2Zvcm06ICdsb29rdXAnIH0sXG5cbiAgICAvLyBOT1QgTUFQUEVEIFx1MjAxNCBgY3JtX2xlYWQuYWRkcmVzc2AgaXMgYSBzdHJ1Y3R1cmVkIChqc29uLWJhY2tlZCkgYGFkZHJlc3NgXG4gICAgLy8gZmllbGQ7IHRoZSBpbXBvcnQgcGF0aCBjYW5ub3QgY29tcG9zZSBvbmUgZnJvbSBzZXBhcmF0ZSBzdHJlZXQvY2l0eS9cbiAgICAvLyBwb3N0Y29kZSBjb2x1bW5zLCBhbmQgYSBqb2luZWQgc3RyaW5nIGlzIHJlamVjdGVkIHBlciByb3cuIFNhbWVcbiAgICAvLyByZWFzb25pbmcsIGFuZCB0aGUgc2FtZSBtZWFzdXJlbWVudCwgYXMgdGhlIGFjY291bnQgbWFwcGluZy5cbiAgXSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvYXBwcy9pbmRleC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9hcHBzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2FwcHMvaW5kZXgudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogQXBwIERlZmluaXRpb25zIEJhcnJlbFxuICovXG5cbmV4cG9ydCB7IENybUFwcCB9IGZyb20gJy4vY3JtLmFwcCc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9hcHBzL2NybS5hcHAudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvYXBwc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9hcHBzL2NybS5hcHAudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IEFwcCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLy8gVGhlIGJyYW5kIG1hcmssIGlubGluZWQgYXMgYSBgZGF0YTpgIFVSSSBvZiBgYXNzZXRzL2ljb24uc3ZnYCAoIzIwNTEpLCBzbyBpdFxuLy8gdHJhdmVscyBpbnNpZGUgdGhlIHB1Ymxpc2hlZCBhcnRpZmFjdC4gVGhlIHBhdGggaXQgcmVwbGFjZXMsXG4vLyBgL3J1bnRpbWUvYXNzZXRzL2ljb24uc3ZnYCAoIzczMSksIHJlc29sdmVzIG9ubHkgdW5kZXIgYG9iamVjdHN0YWNrIHNlcnZlYFxuLy8gcnVuIGZyb20gdGhpcyByZXBvIFx1MjAxNCB0aGUgQ0xJJ3MgYGNyZWF0ZVJ1bnRpbWVBc3NldHNQbHVnaW5gIG1vdW50cyB0aGVcbi8vIHByb2plY3QncyBgYXNzZXRzL2AgdGhlcmUuIEEgaG9zdGVkIGluc3RhbGwgcnVucyB0aGUgYXJ0aWZhY3QsIHdoaWNoIGNhcnJpZWRcbi8vIHRoZSBwYXRoIGJ1dCBub3QgdGhlIGZpbGUsIGFuZCBpdHMgcnVudGltZSBtb3VudHMgbm8gYC9ydW50aW1lL2Fzc2V0cy9gOiB0aGVcbi8vIGxvZ28gYW5zd2VyZWQgNDA0IG9uIGV2ZXJ5IGhvc3RlZCBlbnZpcm9ubWVudC4gVGhlIFNWRydzIG93biBieXRlcywgd2l0aCBvbmx5XG4vLyBgJWAsIGAjYCBhbmQgbGluZSBicmVha3MgcGVyY2VudC1lbmNvZGVkOiBhIHJhdyBgI2Agd291bGQgc3RhcnQgYSBVUkwgZnJhZ21lbnRcbi8vIGFuZCBhIHJhdyBuZXdsaW5lIGlzIHN0cmlwcGVkIGJ5IHRoZSBVUkwgcGFyc2VyLiBgYXNzZXRzL2ljb24uc3ZnYCBzdGF5cyB0aGVcbi8vIHNpbmdsZSBzb3VyY2UgXHUyMDE0IGB0ZXN0L2FwcC1icmFuZGluZy1pY29uLnRlc3QudHNgIGRlY29kZXMgdGhpcyBVUkkgYXMgYSBicm93c2VyXG4vLyBkb2VzIGFuZCByZXF1aXJlcyB0aGUgZmlsZSdzIGV4YWN0IGJ5dGVzIGJhY2ssIHNvIGVkaXQgdGhlIGZpbGUsIHRoZW4gdGhpcy5cbmNvbnN0IEhPVENSTV9JQ09OID1cbiAgJ2RhdGE6aW1hZ2Uvc3ZnK3htbCwnICtcbiAgJzxzdmcgd2lkdGg9XCIyNTZcIiBoZWlnaHQ9XCIyNTZcIiB2aWV3Qm94PVwiMCAwIDI1NiAyNTZcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiByb2xlPVwiaW1nXCIgYXJpYS1sYWJlbD1cIkhvdENSTVwiPiUwQScgK1xuICAnICA8cmVjdCB4PVwiMTZcIiB5PVwiMTZcIiB3aWR0aD1cIjIyNFwiIGhlaWdodD1cIjIyNFwiIHJ4PVwiNTZcIiBmaWxsPVwiJTIzRUE1ODBDXCIvPiUwQScgK1xuICAnICA8cGF0aCBkPVwiTTc2IDY0aDQwdjUyaDI0VjY0aDQwdjEyOGgtNDB2LTUyaC0yNHY1Mkg3NnpcIiBmaWxsPVwiJTIzRkZGRkZGXCIvPiUwQScgK1xuICAnPC9zdmc+JTBBJztcblxuLyoqXG4gKiBIb3RDUk0gXHUyMDE0IG5hdmlnYXRpb24uXG4gKlxuICogSW50ZW50aW9uYWxseSBuYXJyb3cuIFRoZSBhcHAgc2VsbHMgb25lIHN0b3J5OiBcInRoZSBDUk0gdGhhdCByZXdyaXRlc1xuICogaXRzZWxmIHdoZW4geW91ciBidXNpbmVzcyBjaGFuZ2VzLFwiIGFuZCBgY29udGVudC9kb2NzL3doYXRzLW5ldy5tZHhgXG4gKiBwcm9taXNlcyBhIG5hdiBcImEgbmV3IHVzZXIgY2FuIGZpbmQgdGhlaXIgd2F5IGFyb3VuZCBpbiAzMCBzZWNvbmRzLlwiXG4gKlxuICogIyMgT25lIGVudHJ5IHBlciBkZXN0aW5hdGlvbiwgb25lIGV4ZW1wbGFyIHBlciBuYXYtaXRlbSB0eXBlICgjMTI1OSlcbiAqXG4gKiBUaGUgc2lkZWJhciBoYWQgZ3Jvd24gdG8gNyBncm91cHMgLyAzMSBpdGVtcywgYWxtb3N0IGVudGlyZWx5IHRocm91Z2ggb25lXG4gKiBwYXR0ZXJuOiB0aGUgc2FtZSBvYmplY3Qgc3VyZmFjZWQgYWdhaW4gYW5kIGFnYWluIHRocm91Z2ggaXRzIG93biB2aWV3cyBcdTIwMTRcbiAqIGBjcm1fZXZlbnRgIGhhZCBmb3VyIGVudHJpZXMsIGBjcm1fb3Bwb3J0dW5pdHlgIHRocmVlIFx1MjAxNCB3aGlsZSBldmVyeSBsaXN0XG4gKiBwYWdlIGFscmVhZHkgY2FycmllcyBhIHZpZXctc3dpdGNoZXIgdGFiIHN0cmlwIHRoYXQgcmVhY2hlcyBhbGwgb2YgdGhlbS5cbiAqIFRob3NlIHJlZHVuZGFudCB2aWV3IGVudHJpZXMgYXJlIGdvbmU7IGVhY2ggcmVtb3ZlZCBkZXN0aW5hdGlvbiBzdGF5cyBvbmVcbiAqIGNsaWNrIGF3YXkgb24gaXRzIG9iamVjdCdzIHRhYiBzdHJpcCBcdTIwMTQgd2hpY2ggdGhlIGNvbnNvbGUgYnVpbGRzIGZyb20gdGhlXG4gKiBWSUVXIERFU0NSSVBUT1JTIGluIGBzcmMvPHBrZz4vdmlld3MvKi52aWV3LnRzYDogdGhlIHByaW1hcnkgYGxpc3RgIHBsdXMgZXZlcnlcbiAqIGBsaXN0Vmlld3NgIGVudHJ5LCBvbmUgdGFiIGVhY2gsIGNhcnJ5aW5nIHRoYXQgdmlldydzIG93biBgbGFiZWxgLiBTb1xuICogcmVhY2hhYmlsaXR5IG5lZWRzIG5vdGhpbmcgYXV0aG9yZWQ7IGEgYGxpc3RWaWV3c2AgZW50cnkgaXMgb24gdGhlIHN0cmlwIGJ5XG4gKiBleGlzdGluZy4gV2hhdCBgdGVzdC92aWV3LXJlZmVyZW5jZXMudGVzdC50c2AgXHUyMTkyIFwiZXZlcnkgbmFtZWQgbGlzdCB2aWV3IGlzXG4gKiByZWFjaGFibGVcIiBob2xkcyBpcyB0aGUgaGFsZiB0aGF0IENBTiBkYW5nbGUgXHUyMDE0IGEgbmF2aWdhdGlvbiBlbnRyeSBuYW1pbmcgYVxuICogdmlldyBubyB2aWV3IGZpbGUgZGVmaW5lcy5cbiAqXG4gKiBXaGF0IGlzIE5PVCB0cmltbWVkIGlzIHRoZSBkZW1vbnN0cmF0aW9uLiBUaGlzIGlzIHRoZSBleGVtcGxhciBhcHAsIGFuZFxuICogbmF2IGl0ZW1zIGNvbWUgaW4gc2l4IGtpbmRzIFx1MjAxNCBwbGFpbiBgb2JqZWN0YCwgb2JqZWN0ICsgYHZpZXdOYW1lYCAoYSB2aWV3XG4gKiBlbnRyeSksIGBwYWdlYCwgYGRhc2hib2FyZGAsIGByZXBvcnRgLCBgY29tcG9uZW50YC4gKipFdmVyeSBraW5kIGtlZXBzIGF0XG4gKiBsZWFzdCBvbmUgZW50cnkqKiwgYmVjYXVzZSBzaG93aW5nIGFuIGF1dGhvciB3aGF0IGVhY2gga2luZCBsb29rcyBsaWtlIGlzXG4gKiBwYXJ0IG9mIHdoYXQgdGhpcyBhcHAgaXMgZm9yLiBgdGVzdC9hcHAtbmF2aWdhdGlvbi1zaGFwZS50ZXN0LnRzYCBwaW5zIHRoYXRcbiAqIGZsb29yLCBzbyBhIGZ1dHVyZSBzbGltbWluZyBwYXNzIGNhbm5vdCBkZWxldGUgdGhlIGxhc3QgZXhlbXBsYXIgb2YgYSBraW5kXG4gKiB3aXRob3V0IGdvaW5nIHJlZC5cbiAqXG4gKiBQZXJzb25hbGlzYXRpb24gcmlkZXMgdGhlIHBsYXRmb3JtJ3MgcGluICsgcmVjZW50IG1lY2hhbmlzbXMgcmF0aGVyIHRoYW5cbiAqIHByZS1tYXRlcmlhbGlzaW5nIGV2ZXJ5IHBvc3NpYmxlIGVudHJ5IGZvciBldmVyeSB1c2VyLlxuICovXG5leHBvcnQgY29uc3QgQ3JtQXBwID0gQXBwLmNyZWF0ZSh7XG4gIG5hbWU6ICdjcm1fZW50ZXJwcmlzZScsXG4gIGxhYmVsOiAnSG90Q1JNJyxcbiAgaWNvbjogJ2JyaWVmY2FzZScsXG4gIC8vIEFEUi0wMDYzIFx1MDBBNzEvXHUwMEE3MiBcdTIwMTQgYGRlZmF1bHRBZ2VudGAgaXMgYSBzdXJmYWNlIGJpbmRpbmcsIG5vdCBhIGN1c3RvbS1hZ2VudFxuICAvLyBzbG90OiB0aGUgb25seSByZXNvbHZhYmxlIHZhbHVlcyBhcmUgdGhlIHR3byBQTEFURk9STSBhZ2VudHMsIGBhc2tgIChkYXRhXG4gIC8vIHN1cmZhY2UpIGFuZCBgYnVpbGRgIChhdXRob3Jpbmcgc3VyZmFjZSkuIEhvdENSTSBpcyBhIGRhdGEgc3VyZmFjZSwgc28gaXRcbiAgLy8gYmluZHMgYGFza2A7IHRoZSBhcHAncyBvd24gQUkgY2FwYWJpbGl0eSBzaGlwcyBhcyBza2lsbHMgKGBzcmMvKi9za2lsbHMvYCksXG4gIC8vIHdoaWNoIGF0dGFjaCB0byB0aGUgcGxhdGZvcm0gYWdlbnRzIGJ5IGBzdXJmYWNlYCBhZmZpbml0eS4gVGhlIGFwcC1hdXRob3JlZFxuICAvLyBhZ2VudHMgdGhpcyBrZXkgdXNlZCB0byBuYW1lIHdlcmUgcmV0aXJlZCBpbiAjNTEyLlxuICBkZWZhdWx0QWdlbnQ6ICdhc2snLFxuICAvLyBgbG9nb2AgYW5kIGBmYXZpY29uYCBhcmUgdGhlIGlubGluZWQgYEhPVENSTV9JQ09OYCBhYm92ZSAoIzIwNTEpLCBuZXZlciBhXG4gIC8vIHNlcnZlciBwYXRoOiBhbiBpbnN0YWxsIHNlcnZlcyBvbmx5IHdoYXQgdGhlIGFydGlmYWN0IGNhcnJpZXMuIFRoZSBjb25zb2xlXG4gIC8vIHBhc3NlcyBlYWNoIHZhbHVlIHRocm91Z2ggdW50b3VjaGVkIFx1MjAxNCBgbG9nb2AgYXMgdGhlIHNpZGViYXIncyBgPGltZyBzcmM+YCxcbiAgLy8gYGZhdmljb25gIGFzIHRoZSBmYXZpY29uIGBsaW5rLmhyZWZgIFx1MjAxNCBhbmQgYSBgZGF0YTpgIFVSSSByZW5kZXJzIGluIGJvdGguXG4gIC8vIGBwcmltYXJ5Q29sb3JgIGlzIHRoZSBpY29uJ3MgdGlsZSBmaWxsICgjMjA2Nik6IHRoZSBtYXJrIGFuZCB0aGUgdGhlbWUgYXJlIG9uZSBvcmFuZ2UuXG4gIGJyYW5kaW5nOiB7XG4gICAgcHJpbWFyeUNvbG9yOiAnI0VBNTgwQycsXG4gICAgbG9nbzogSE9UQ1JNX0lDT04sXG4gICAgZmF2aWNvbjogSE9UQ1JNX0lDT04sXG4gIH0sXG5cbiAgbmF2aWdhdGlvbjogW1xuICAgIC8vIFBpbm5lZCBsYW5kaW5nIFx1MjAxNCBzaW5nbGUgZXhlY3V0aXZlIHZpZXcsIHNpbmdsZSBjbGljayBmcm9tIGxhdW5jaGVyLlxuICAgIHtcbiAgICAgIGlkOiAnbmF2X2hvbWUnLFxuICAgICAgdHlwZTogJ2Rhc2hib2FyZCcsXG4gICAgICBkYXNoYm9hcmROYW1lOiAnZXhlY3V0aXZlX2Rhc2hib2FyZCcsXG4gICAgICBsYWJlbDogJ0hvbWUnLFxuICAgICAgaWNvbjogJ2hvbWUnLFxuICAgIH0sXG5cbiAgICB7XG4gICAgICBpZDogJ2dyb3VwX3NhbGVzJyxcbiAgICAgIHR5cGU6ICdncm91cCcsXG4gICAgICBsYWJlbDogJ1NhbGVzJyxcbiAgICAgIGljb246ICdjaGFydC1saW5lJyxcbiAgICAgIGV4cGFuZGVkOiB0cnVlLFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgeyBpZDogJ25hdl9sZWFkJywgICAgICAgIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX2xlYWQnLCAgICAgICAgbGFiZWw6ICdMZWFkcycsICAgICAgICAgaWNvbjogJ3VzZXItcGx1cycgfSxcbiAgICAgICAgeyBpZDogJ25hdl9hY2NvdW50JywgICAgIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX2FjY291bnQnLCAgICAgbGFiZWw6ICdBY2NvdW50cycsICAgICAgaWNvbjogJ2J1aWxkaW5nJyB9LFxuICAgICAgICAvLyBBRFItMDA0NyBpbnRlcmZhY2UgcGFnZSBcdTIwMTQgdGhlIGN1cmF0ZWQgY291bnRlcnBhcnQgdG8gdGhlIEFjY291bnRzXG4gICAgICAgIC8vIG9iamVjdCBlbnRyeSAocXVpY2sgZmlsdGVycyBvbmx5OyBhY3RpdmF0ZXMgd2l0aCBzcGVjID4gOS4yLjApLlxuICAgICAgICB7IGlkOiAnbmF2X2FjY291bnRfd29ya2JlbmNoJywgdHlwZTogJ3BhZ2UnLCBwYWdlTmFtZTogJ2FjY291bnRfd29ya2JlbmNoJywgbGFiZWw6ICdBY2NvdW50IFdvcmtiZW5jaCcsIGljb246ICdzbGlkZXJzLWhvcml6b250YWwnIH0sXG4gICAgICAgIHsgaWQ6ICduYXZfY29udGFjdCcsICAgICB0eXBlOiAnb2JqZWN0Jywgb2JqZWN0TmFtZTogJ2NybV9jb250YWN0JywgICAgIGxhYmVsOiAnQ29udGFjdHMnLCAgICAgIGljb246ICd1c2VyJyB9LFxuICAgICAgICAvLyBObyBzZXBhcmF0ZSBcIlBpcGVsaW5lXCIgZW50cnk6IHRoZSBrYW5iYW4gYm9hcmQgaXMgYW5vdGhlciB0YWIgb25cbiAgICAgICAgLy8gdGhpcyBzYW1lIGxpc3QgcGFnZSBcdTIwMTQgYHBpcGVsaW5lX2thbmJhbmAgaW5cbiAgICAgICAgLy8gYE9wcG9ydHVuaXR5Vmlld3MubGlzdFZpZXdzYCwgd2hpY2ggdGhlIHN3aXRjaGVyIHB1dHMgb24gdGhlIHN0cmlwXG4gICAgICAgIC8vIHVuZGVyIGl0cyBvd24gbGFiZWwsICpTYWxlcyBQaXBlbGluZSogXHUyMDE0IG9uZSBjbGljayBmcm9tIGhlcmUgYW5kXG4gICAgICAgIC8vIHplcm8gY2xpY2tzIGZ1cnRoZXIgdGhhbiBhIHNlY29uZCBzaWRlYmFyIHJvdy4gVGhlXG4gICAgICAgIC8vIHZpZXctZW50cnkgZXhlbXBsYXIgZHV0eSB0aGlzIGl0ZW0gdXNlZCB0byBjYXJyeSBub3cgc2l0cyB3aXRoIHRoZVxuICAgICAgICAvLyBcIk15IFdvcmtcIiBpdGVtcyBiZWxvdywgd2hpY2ggYXJlIGFsbCBvYmplY3QgKyBgdmlld05hbWVgLlxuICAgICAgICB7IGlkOiAnbmF2X29wcG9ydHVuaXR5JywgdHlwZTogJ29iamVjdCcsIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLCBsYWJlbDogJ09wcG9ydHVuaXRpZXMnLCBpY29uOiAndGFyZ2V0JyB9LFxuICAgICAgICB7IGlkOiAnbmF2X3F1b3RlJywgICAgICAgdHlwZTogJ29iamVjdCcsIG9iamVjdE5hbWU6ICdjcm1fcXVvdGUnLCAgICAgICBsYWJlbDogJ1F1b3RlcycsICAgICAgICBpY29uOiAncmVjZWlwdCcgfSxcbiAgICAgICAgLy8gQ29udHJhY3RzIGNsb3NlIHRoZSBzYWxlcyBjeWNsZTogcXVvdGUgXHUyMTkyIHNpZ25lZCBhZ3JlZW1lbnQgXHUyMTkyIHJlbmV3YWwuXG4gICAgICAgIC8vIFRoZSBvYmplY3QsIGl0cyB2aWV3cyBhbmQgaXRzIHJlbmV3YWwgYXV0b21hdGlvbiBhbGwgc2hpcHBlZCwgYnV0XG4gICAgICAgIC8vIHRoZXJlIHdhcyBubyB3YXkgdG8gcmVhY2ggYW55IG9mIGl0IGZyb20gdGhlIGFwcC5cbiAgICAgICAgeyBpZDogJ25hdl9jb250cmFjdCcsICAgIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX2NvbnRyYWN0JywgICAgbGFiZWw6ICdDb250cmFjdHMnLCAgICAgaWNvbjogJ2ZpbGUtc2lnbmF0dXJlJyB9LFxuICAgICAgICAvLyBQcm9kdWN0cyBzaXQgaGVyZSwgbm90IHVuZGVyIE1hcmtldGluZyAoIzEyNTkpOiB0aGV5IGFyZSB0aGVcbiAgICAgICAgLy8gcmV2ZW51ZSBtYXN0ZXIgZGF0YSBldmVyeSBxdW90ZSBsaW5lIGFuZCBvcHBvcnR1bml0eSBsaW5lIGl0ZW1cbiAgICAgICAgLy8gcG9pbnRzIGF0IFx1MjAxNCBhIHNhbGVzIG9iamVjdCB0aGF0IGhhcHBlbmVkIHRvIGJlIGZpbGVkIG5leHQgdG9cbiAgICAgICAgLy8gY2FtcGFpZ25zLlxuICAgICAgICB7IGlkOiAnbmF2X3Byb2R1Y3QnLCAgICAgdHlwZTogJ29iamVjdCcsIG9iamVjdE5hbWU6ICdjcm1fcHJvZHVjdCcsICAgICBsYWJlbDogJ1Byb2R1Y3RzJywgICAgICBpY29uOiAncGFja2FnZScgfSxcbiAgICAgICAgeyBpZDogJ25hdl9zYWxlc19kYXNoYm9hcmQnLCB0eXBlOiAnZGFzaGJvYXJkJywgZGFzaGJvYXJkTmFtZTogJ3NhbGVzX2Rhc2hib2FyZCcsIGxhYmVsOiAnU2FsZXMgUGVyZm9ybWFuY2UnLCBpY29uOiAnY2hhcnQtbGluZScgfSxcbiAgICAgIF0sXG4gICAgfSxcblxuICAgIHtcbiAgICAgIC8vIEV2ZXJ5dGhpbmcgYSByZXAgb3dlcyBzb21lb25lLiBgY3JtX3Rhc2tgIGhhZCB2aWV3cywgc2VlZCBkYXRhLCBhXG4gICAgICAvLyByZWN1cnJlbmNlIGhvb2sgYW5kIHR3byByZW1pbmRlciBmbG93cywgYW5kIG5vIGVudHJ5IHBvaW50IFx1MjAxNCB0aGUgb25seVxuICAgICAgLy8gd2F5IHRvIHNlZSBhIHRhc2sgd2FzIHRvIG9wZW4gdGhlIHJlY29yZCBpdCBodW5nIG9mZi5cbiAgICAgIGlkOiAnZ3JvdXBfd29yaycsXG4gICAgICB0eXBlOiAnZ3JvdXAnLFxuICAgICAgbGFiZWw6ICdNeSBXb3JrJyxcbiAgICAgIGljb246ICdsaXN0LWNoZWNrcycsXG4gICAgICBleHBhbmRlZDogdHJ1ZSxcbiAgICAgIC8vIFRoZXNlIGFyZSBMaXN0Vmlld3M6IHRoZXkgbGlzdCB0aGUgcmVjb3JkcyB0aGVtc2VsdmVzLCB3aGljaCBhXG4gICAgICAvLyBkYXNoYm9hcmQgd2lkZ2V0IChhbiBhZ2dyZWdhdGUgb3ZlciBhIGRhdGFzZXQsIEFEUi0wMDIxKSBjYW5ub3QuIEJvdGhcbiAgICAgIC8vIHN1cmZhY2VzIHJlc29sdmUgYHtjdXJyZW50X3VzZXJfaWR9YCBzaW5jZSBvYmplY3RzdGFjayMxMjIzMCBcdTIwMTQgdGhlXG4gICAgICAvLyBTZXJ2aWNlIGRhc2hib2FyZCdzIFwiTXkgT3BlbiBDYXNlcyBieSBQcmlvcml0eVwiIGlzIHRoZSBhZ2dyZWdhdGVcbiAgICAgIC8vIGNvdW50ZXJwYXJ0IG9mIFwiTXkgQ2FzZXNcIiAoIzUxMCkuXG4gICAgICAvL1xuICAgICAgLy8gRXZlcnkgaXRlbSBoZXJlIGlzIG9iamVjdCArIGB2aWV3TmFtZWAsIHdoaWNoIG1ha2VzIHRoaXMgZ3JvdXAgdGhlXG4gICAgICAvLyBhcHAncyB2aWV3LWVudHJ5IGV4ZW1wbGFyIHNpbmNlICMxMjU5IHJldGlyZWQgdGhlIFwiUGlwZWxpbmVcIiByb3cuXG4gICAgICAvLyBUaGUgb25lIGV4Y2VwdGlvbiBpcyB0aGUgYXBwcm92YWxzIEluYm94IGF0IHRoZSBib3R0b20gXHUyMDE0IGFcbiAgICAgIC8vIGBjb21wb25lbnRgIGVudHJ5LCBhbmQgdGhlIGFwcCdzIG9ubHkgb25lLlxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgeyBpZDogJ25hdl9teV90YXNrcycsIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX3Rhc2snLCB2aWV3TmFtZTogJ215X29wZW5fdGFza3MnLCBsYWJlbDogJ015IFRhc2tzJywgaWNvbjogJ2NpcmNsZS1jaGVjaycgfSxcbiAgICAgICAgeyBpZDogJ25hdl9teV9kZWFscycsIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5Jywgdmlld05hbWU6ICdteV9vcGVuX2RlYWxzJywgbGFiZWw6ICdNeSBEZWFscycsIGljb246ICd0YXJnZXQnIH0sXG4gICAgICAgIHsgaWQ6ICduYXZfbXlfbGVhZHMnLCB0eXBlOiAnb2JqZWN0Jywgb2JqZWN0TmFtZTogJ2NybV9sZWFkJywgdmlld05hbWU6ICdteV9sZWFkcycsIGxhYmVsOiAnTXkgTGVhZHMnLCBpY29uOiAndXNlci1wbHVzJyB9LFxuICAgICAgICAvLyAjNTkyIFx1MjAxNCB0aGUgcmVwJ3Mgb3duIGNhbGVuZGFyOiBhIGxpc3Qgb2YgZXZlbnRzLCBzbyBhIHZpZXcsIG5vdCBhXG4gICAgICAgIC8vIGRhc2hib2FyZC5cbiAgICAgICAgeyBpZDogJ25hdl9teV9jYWxlbmRhcicsIHR5cGU6ICdvYmplY3QnLCBvYmplY3ROYW1lOiAnY3JtX2V2ZW50Jywgdmlld05hbWU6ICdteV9ldmVudHMnLCBsYWJlbDogJ015IENhbGVuZGFyJywgaWNvbjogJ2NhbGVuZGFyLWRheXMnIH0sXG4gICAgICAgIC8vIE5vIFwiQWxsIFRhc2tzXCIgZW50cnk6IFwiTXkgVGFza3NcIiBvcGVucyB0aGUgYGNybV90YXNrYCBsaXN0IHBhZ2UsXG4gICAgICAgIC8vIHdob3NlIHRhYiBzdHJpcCBsZWFkcyB3aXRoICpBbGwgVGFza3MqIFx1MjAxNCBgVGFza1ZpZXdzLmxpc3RgLCBuYW1lXG4gICAgICAgIC8vIGBhbGxfdGFza3NgLiBJdCBsZWFkcyBiZWNhdXNlIGl0IGlzIHRoZSBvYmplY3QncyBQUklNQVJZIGxpc3Q6IHRoZVxuICAgICAgICAvLyBzd2l0Y2hlciBtb3ZlcyB0aGUgcHJpbWFyeSB0byB0aGUgZnJvbnQgb2YgdGhlIHN0cmlwIGFuZCBtYXJrcyBpdFxuICAgICAgICAvLyBkZWZhdWx0LCBzbyBub3RoaW5nIGhhcyB0byBiZSBhdXRob3JlZCB0byBzYXkgc28uIFRoZSB3aG9sZSBib29rIGlzXG4gICAgICAgIC8vIG9uZSB0YWIgYXdheSwgYW5kIHRoZSBzaWRlYmFyIGtlZXBzIG9uZSByb3cgcGVyIG9iamVjdCBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIHR3by5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gXHUyNTAwXHUyNTAwIFRoZSBhcHByb3ZhbHMgSW5ib3ggbGl2ZXMgaGVyZSwgbm90IGluIGEgZ3JvdXAgb2YgaXRzIG93biAoIzEyNTkpXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEl0IHVzZWQgdG8gYmUgdGhlIHNpbmdsZSBjaGlsZCBvZiBhbiBcIkFwcHJvdmFsc1wiIGdyb3VwLiBJdHMgY29udGVudFxuICAgICAgICAvLyBpcyBhIHBlcnNvbmFsIHF1ZXVlIFx1MjAxNCB0aGUgdGhpbmdzIHdhaXRpbmcgb24gKnlvdSogXHUyMDE0IHdoaWNoIGlzIHdoYXRcbiAgICAgICAgLy8gdGhpcyBncm91cCBpczsgYSBvbmUtaXRlbSBncm91cCBuZXh0IHRvIGl0IHdhcyBzdHJ1Y3R1cmUgd2l0aG91dCBhXG4gICAgICAgIC8vIGRpc3RpbmN0aW9uLiBEaXNzb2x2aW5nIHRoYXQgZ3JvdXAgaXMgd2h5IHRoaXMgZW50cnkgbW92ZWQsIG5vdCBhbnlcbiAgICAgICAgLy8gcnVsZSBhZ2FpbnN0IHNpbmdsZS1pdGVtIGdyb3VwcyAoTWFya2V0aW5nIGlzIG9uZSBhbmQgc3RheXMgb25lKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gXCJJbmJveFwiICh6aC1DTiBcdTVGODVcdTYyMTFcdTVCQTFcdTYyNzkpIG11c3QgbGFuZCBzb21ld2hlcmUgYW4gYXBwcm92ZXIgY2FuIGFjdHVhbGx5XG4gICAgICAgIC8vIGFwcHJvdmUuIEl0IHVzZWQgdG8gYmUgYHR5cGU6ICdvYmplY3QnYCBvbiBgc3lzX2FwcHJvdmFsX3JlcXVlc3RgIFx1MjAxNFxuICAgICAgICAvLyB0aGUgYXBwcm92YWxzIHBsdWdpbidzIHJhdyByZXF1ZXN0IHRhYmxlLCB3aGljaCBpcyByZWFkLW9ubHk6IG5vIHJvd1xuICAgICAgICAvLyBhY3Rpb25zLCBubyBhcHByb3ZlL3JlamVjdCwgb25seSBTaGFyZSBvbiB0aGUgcmVjb3JkIGRldGFpbC4gVGhlIGxhYmVsXG4gICAgICAgIC8vIHByb21pc2VkIGFuIGFjdGlvbiB0aGUgZGVzdGluYXRpb24gY291bGQgbm90IHBlcmZvcm0gKCMxMTIzKS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYGNvbXBvbmVudGAgXHUyMDE0IG5vdCBgdXJsYC4gVGhlIHBsYXRmb3JtJ3MgYXBwcm92YWwgY2VudHJlIGlzIGFcbiAgICAgICAgLy8gZmlyc3QtcGFydHkgY29uc29sZSBzdXJmYWNlIHJlZ2lzdGVyZWQgaW4gdGhlIENvbXBvbmVudFJlZ2lzdHJ5IGFzXG4gICAgICAgIC8vIGBhcHByb3ZhbHM6aW5ib3hgIChyZWdpc3RlcmVkIGJ5IEBvYmplY3RzdGFjay9jb25zb2xlIGl0c2VsZiwgc291cmNlXG4gICAgICAgIC8vIGBAb2JqZWN0LXVpL2NvbnNvbGVgLCByZW5kZXJpbmcgQXBwcm92YWxzSW5ib3hQYWdlKSBcdTIwMTQgZXhhY3RseSB3aGF0IHRoZVxuICAgICAgICAvLyBzcGVjIGRvY3VtZW50cyBgY29tcG9uZW50YCBmb3I6IFwiYSBmaXJzdC1wYXJ0eSBVSSBzaGlwcGVkIHdpdGggdGhlXG4gICAgICAgIC8vIHBsYXRmb3JtIFx1MjAxNCB0eXBpY2FsbHkgYWRtaW4vc2V0dXAgc3VyZmFjZXMgdGhhdCBoYXZlIG5vIHJvdyBpbiBhbnkgZGF0YVxuICAgICAgICAvLyBzdG9yZVwiLiBgdXJsYCBpcyBkb2N1bWVudGVkIGFzIHRoZSAqZXh0ZXJuYWwgbGluayogdHlwZSwgYW5kIHRha2luZyBpdFxuICAgICAgICAvLyB3b3VsZCBtZWFuIGhhcmQtY29kaW5nIGEgY29uc29sZS1pbnRlcm5hbCByb3V0ZSBwbHVzIHRoaXMgYXBwJ3Mgb3duXG4gICAgICAgIC8vIG5hbWUgKGAvYXBwcy9jcm1fZW50ZXJwcmlzZS9zeXN0ZW0vYXBwcm92YWxzYCkgaW50byBtZXRhZGF0YS4gQVxuICAgICAgICAvLyBgY29tcG9uZW50UmVmYCBpbnN0ZWFkIHJlc29sdmVzIGFnYWluc3QgdGhlICpjdXJyZW50KiBhcHAgYmFzZSwgc28gdGhlXG4gICAgICAgIC8vIGVudHJ5IGtlZXBzIHRoZSB1c2VyIGluc2lkZSBIb3RDUk0ncyBzaGVsbCB3aXRob3V0IG5hbWluZyB0aGUgYXBwLCBhbmRcbiAgICAgICAgLy8gYSByZWYgdGhhdCBldmVyIHN0b3BzIHJlc29sdmluZyByZW5kZXJzIGEgbG91ZCBcIkNvbXBvbmVudCBub3RcbiAgICAgICAgLy8gcmVnaXN0ZXJlZFwiIHBhbmVsIHJhdGhlciB0aGFuIHNpbGVudGx5IGJvdW5jaW5nIHRvIHRoZSBjb25zb2xlIGhvbWUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZSByZWFkLW9ubHkgb2JqZWN0IGxpc3QgaXMgbm90IGtlcHQgYXMgYSBzZWNvbmQgXCJoaXN0b3J5XCIgZW50cnk6IHRoZVxuICAgICAgICAvLyBhcHByb3ZhbCBjZW50cmUgYWxyZWFkeSBzdWJzdW1lcyBpdCBcdTIwMTQgTXkgUGVuZGluZyAvIFN1Ym1pdHRlZCBieSBtZSAvXG4gICAgICAgIC8vIEFsbCB0YWJzIHBsdXMgYSBzdGF0dXMgZmlsdGVyIChQZW5kaW5nIC8gQXBwcm92ZWQgLyBSZWplY3RlZCAvXG4gICAgICAgIC8vIFJlY2FsbGVkIC8gUmV0dXJuZWQgZm9yIHJldmlzaW9uKSBcdTIwMTQgc28gYSBzZWNvbmQgZW50cnkgd291bGQgYWRkIGFcbiAgICAgICAgLy8gc3RyaWN0bHkgd2Vha2VyIHZpZXcgb2YgdGhlIHNhbWUgcm93cy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYHJlcXVpcmVzT2JqZWN0YCBpcyByZXRhaW5lZDogaXQgaXMgYSBiYXNlIG5hdi1pdGVtIGZpZWxkIG9uIGV2ZXJ5XG4gICAgICAgIC8vIGl0ZW0gdHlwZSwgc28gdGhlIGVudHJ5IHN0aWxsIGhpZGVzIGl0c2VsZiBvbiBpbnN0YWxscyB3aGVyZVxuICAgICAgICAvLyBAb2JqZWN0c3RhY2svcGx1Z2luLWFwcHJvdmFscyBpcyBhYnNlbnQgYW5kIG5vIGFwcHJvdmFsIGV4aXN0cyB0byBhY3RcbiAgICAgICAgLy8gb24uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoZXJlIGlzIG5vIFwiUHJvY2Vzc2VzXCIgaXRlbSBlaXRoZXI6IEBvYmplY3RzdGFjay9wbHVnaW4tYXBwcm92YWxzXG4gICAgICAgIC8vIHJlZ2lzdGVycyBzeXNfYXBwcm92YWxfcmVxdWVzdCAvIHN5c19hcHByb3ZhbF9hY3Rpb24gL1xuICAgICAgICAvLyBzeXNfYXBwcm92YWxfYXBwcm92ZXIgLyBzeXNfYXBwcm92YWxfZGVsZWdhdGlvbiBcdTIwMTQgYnV0IG5laXRoZXIgYSBiYXJlXG4gICAgICAgIC8vIGBzeXNfYXBwcm92YWxgIG5vciBhIGBzeXNfYXBwcm92YWxfcHJvY2Vzc2Agb2JqZWN0IGV4aXN0cyBpbiBhbnlcbiAgICAgICAgLy8gaW5zdGFsbGVkIHBsdWdpbiAobWVhc3VyZWQgb24gdGhlIDE3LjIuMCByb3N0ZXJzKSxcbiAgICAgICAgLy8gc28gdGhlIG9sZCBpdGVtJ3MgcmVxdWlyZXNPYmplY3QgZ3VhcmQgaGlkIGl0IG9uIGV2ZXJ5IGluc3RhbGwsXG4gICAgICAgIC8vIGZvcmV2ZXIuXG4gICAgICAgIHsgaWQ6ICduYXZfYXBwcm92YWxfcmVxdWVzdHMnLCB0eXBlOiAnY29tcG9uZW50JywgY29tcG9uZW50UmVmOiAnYXBwcm92YWxzOmluYm94JywgbGFiZWw6ICdJbmJveCcsIGljb246ICdpbmJveCcsIHJlcXVpcmVzT2JqZWN0OiAnc3lzX2FwcHJvdmFsX3JlcXVlc3QnIH0sXG4gICAgICBdLFxuICAgIH0sXG5cbiAgICB7XG4gICAgICAvLyAjNTkyIFx1MjAxNCBhY3Rpdml0eSB3YXMgdGhlIGFwcCdzIGxhcmdlc3QgYmxpbmQgc3BvdDogYGNybV9ldmVudGAgYW5kIGl0c1xuICAgICAgLy8gYXR0ZW5kZWUgcm93cyBoYWQgbm93aGVyZSB0byBiZSBzZWVuLCBhbmQgbm8gZGFzaGJvYXJkIGFueXdoZXJlIGNvdW50ZWRcbiAgICAgIC8vIGFuIGludGVyYWN0aW9uLiBLZXB0IGFzIGl0cyBvd24gZ3JvdXAgcmF0aGVyIHRoYW4gYnVyaWVkIHVuZGVyIFNhbGVzLFxuICAgICAgLy8gYmVjYXVzZSBcIndoYXQgaGFwcGVuZWQgd2l0aCB0aGlzIGN1c3RvbWVyLCBhbmQgd2hlbj9cIiBpcyB0aGUgcXVlc3Rpb25cbiAgICAgIC8vIHRoZSB3aG9sZSBiYXRjaCB3YXMgYWJvdXQuXG4gICAgICBpZDogJ2dyb3VwX2FjdGl2aXR5JyxcbiAgICAgIHR5cGU6ICdncm91cCcsXG4gICAgICBsYWJlbDogJ0FjdGl2aXR5JyxcbiAgICAgIGljb246ICdjYWxlbmRhci1kYXlzJyxcbiAgICAgIGV4cGFuZGVkOiB0cnVlLFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgLy8gT25lIHJvdyBmb3IgdGhlIG9iamVjdCwgb25lIGZvciB0aGUgZGFzaGJvYXJkLiBUaGUgY2FsZW5kYXIgYW5kIHRoZVxuICAgICAgICAvLyBpbnRlcmFjdGlvbiBoaXN0b3J5IGFyZSB0d28gbW9yZSB0YWJzIG9uIHRoaXMgc2FtZSBsaXN0IHBhZ2UgXHUyMDE0XG4gICAgICAgIC8vIGBldmVudF9jYWxlbmRhcmAgYW5kIGBoZWxkX2V2ZW50c2AgaW4gYEV2ZW50Vmlld3MubGlzdFZpZXdzYCwgd2hpY2hcbiAgICAgICAgLy8gdGhlIHN3aXRjaGVyIHB1dHMgb24gdGhlIHN0cmlwIHVuZGVyIGVhY2ggdmlldydzIG93biBsYWJlbCBcdTIwMTQgIzEyNTlcbiAgICAgICAgLy8gcmVtb3ZlZCB0aGUgc2lkZWJhciBkdXBsaWNhdGVzLCBub3QgdGhlIHN1cmZhY2VzLiBgY3JtX2V2ZW50YCBoYWRcbiAgICAgICAgLy8gZm91ciBzaWRlYmFyIHJvd3M7XG4gICAgICAgIC8vIGl0IHdhcyB0aGUgc2luZ2xlIGxhcmdlc3Qgc291cmNlIG9mIHRoZSBuYXYncyBncm93dGguXG4gICAgICAgIHsgaWQ6ICduYXZfZXZlbnQnLCAgICAgICAgICB0eXBlOiAnb2JqZWN0JywgICAgb2JqZWN0TmFtZTogJ2NybV9ldmVudCcsICAgbGFiZWw6ICdFdmVudHMnLCAgICAgICAgICBpY29uOiAnY2FsZW5kYXItZGF5cycgfSxcbiAgICAgICAgeyBpZDogJ25hdl9hY3Rpdml0eV9kYXNoYm9hcmQnLCB0eXBlOiAnZGFzaGJvYXJkJywgZGFzaGJvYXJkTmFtZTogJ3NhbGVzX2FjdGl2aXR5X2Rhc2hib2FyZCcsIGxhYmVsOiAnU2FsZXMgQWN0aXZpdHknLCBpY29uOiAnYWN0aXZpdHknIH0sXG4gICAgICBdLFxuICAgIH0sXG5cbiAgICB7XG4gICAgICAvLyBDYW1wYWlnbnMgZHJpdmUgbGVhZF9zb3VyY2UgYW5kIHRoZSBjYW1wYWlnbi1tZW1iZXIgcmVjb3JkcyB0aGF0XG4gICAgICAvLyBcIkFkZCB0byBDYW1wYWlnblwiIHdyaXRlcyBcdTIwMTQgd2l0aCBubyBuYXYgZW50cnkgdGhlIG1hcmtldGluZyBoYWxmIG9mXG4gICAgICAvLyB0aGUgZGF0YSBtb2RlbCB3YXMgaW52aXNpYmxlLlxuICAgICAgLy9cbiAgICAgIC8vIEEgc2luZ2xlLWl0ZW0gZ3JvdXAgb24gcHVycG9zZSAoIzEyNTkpLiBNYXJrZXRpbmcgaXMgYSBkb21haW4gb2YgaXRzXG4gICAgICAvLyBvd24sIGFuZCBhIHJlYWRlciBzY2FubmluZyB0aGUgc2lkZWJhciBmb3IgXCJ3aGVyZSBkb2VzIGNhbXBhaWduIHdvcmtcbiAgICAgIC8vIGxpdmVcIiBmaW5kcyBpdCBieSBuYW1lLiBJdGVtLWNvdW50IHN5bW1ldHJ5IGlzIG5vdCB0aGUgZ29hbDsgdGhlXG4gICAgICAvLyBBcHByb3ZhbHMgZ3JvdXAgd2FzIGRpc3NvbHZlZCBiZWNhdXNlIGl0cyBpdGVtICp3YXMqIHBlcnNvbmFsIHdvcmssXG4gICAgICAvLyBub3QgYmVjYXVzZSBvbmUgY2hpbGQgaXMgdG9vIGZldy5cbiAgICAgIGlkOiAnZ3JvdXBfbWFya2V0aW5nJyxcbiAgICAgIHR5cGU6ICdncm91cCcsXG4gICAgICBsYWJlbDogJ01hcmtldGluZycsXG4gICAgICBpY29uOiAnbWVnYXBob25lJyxcbiAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgIHsgaWQ6ICduYXZfY2FtcGFpZ24nLCB0eXBlOiAnb2JqZWN0Jywgb2JqZWN0TmFtZTogJ2NybV9jYW1wYWlnbicsIGxhYmVsOiAnQ2FtcGFpZ25zJywgaWNvbjogJ21lZ2FwaG9uZScgfSxcbiAgICAgIF0sXG4gICAgfSxcblxuICAgIHtcbiAgICAgIGlkOiAnZ3JvdXBfc2VydmljZScsXG4gICAgICB0eXBlOiAnZ3JvdXAnLFxuICAgICAgbGFiZWw6ICdTZXJ2aWNlJyxcbiAgICAgIGljb246ICdoZWFkc2V0JyxcbiAgICAgIGV4cGFuZGVkOiB0cnVlLFxuICAgICAgLy8gRU1QVFkgT04gUFVSUE9TRSBcdTIwMTQgdGhpcyBncm91cCBpcyBhIENPTlRBSU5FUiwgbm90IGEgbWVudS5cbiAgICAgIC8vXG4gICAgICAvLyBgY3JtX2Nhc2VgLCBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCwgYHNlcnZpY2VfZGFzaGJvYXJkYCBhbmRcbiAgICAgIC8vIGBzbGFfcGVyZm9ybWFuY2VgIGJlbG9uZyB0byBgYXBwLm9iamVjdHN0YWNrLmhvdGNybS5zZXJ2aWNlYCwgYW5kIGFuXG4gICAgICAvLyBhcHAncyBvd24gYG5hdmlnYXRpb25gIG1heSBub3QgbmFtZSBhbm90aGVyIHBhY2thZ2UncyBvYmplY3QgKEFEUi0wMTMwXG4gICAgICAvLyBcdTAwQTcxLjUpOiB0aGUgZW50cnkgZmFpbHMgYXQgYXV0aG9yIHRpbWUgd2l0aCBcInJlZmVyZW5jZXMgb2JqZWN0XG4gICAgICAvLyBgY3JtX2Nhc2VgIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGluIG9iamVjdHNcIi4gVGhlIG1vZHVsZSBwdXRzIGFsbCB0aHJlZVxuICAgICAgLy8gYmFjayB0aHJvdWdoIGBuYXZpZ2F0aW9uQ29udHJpYnV0aW9uc2AgKEFEUi0wMDI5IEQ3KSwgYW5kIGl0IGNhbiBvbmx5XG4gICAgICAvLyBhaW0gYXQgYSBncm91cCB0aGUgYXBwIERFQ0xBUkVTIFx1MjAxNCBhIG1vZHVsZSBjYW5ub3QgY3JlYXRlIG9uZSBpbnNpZGUgYW5cbiAgICAgIC8vIGFwcCBpdCBkb2VzIG5vdCBvd24uIFNvIHRoZSBhcHAgcHVibGlzaGVzIHRoZSBhbmNob3IgYW5kIHRoZSBtb2R1bGVcbiAgICAgIC8vIGZpbGxzIGl0OyBgc3JjL3NlcnZpY2UvaW5kZXgudHNgIGhvbGRzIHRoZSBvdGhlciBoYWxmLCBhbmQgdGhlIHR3b1xuICAgICAgLy8gc2VydmljZSBpdGVtcyBvZiAqTXkgV29yayogYW5kICpJbnNpZ2h0cyogY29tZSBiYWNrIHRoZSBzYW1lIHdheS5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2RDQgRG8gbm90IFwidGlkeVwiIHRoZSBncm91cCBhd2F5OiBkZWxldGluZyBpdCByZWxvY2F0ZXMgYWxsIHRocmVlXG4gICAgICAvLyBjb250cmlidXRlZCBpdGVtcyB0byB0aGUgYXBwJ3MgdG9wIGxldmVsIHdpdGggYVxuICAgICAgLy8gYG5hdl9jb250cmlidXRpb25fZ3JvdXBfbWlzc2luZ2Agd2FybmluZy5cbiAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICB9LFxuXG4gICAge1xuICAgICAgaWQ6ICdncm91cF9pbnNpZ2h0cycsXG4gICAgICB0eXBlOiAnZ3JvdXAnLFxuICAgICAgbGFiZWw6ICdJbnNpZ2h0cycsXG4gICAgICBpY29uOiAnc3BhcmtsZXMnLFxuICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgLy8gVHJpbW1lZCB0byB0aHJlZSBoaWdoLXNpZ25hbCByZXBvcnRzLiBGdWxsIHJlcG9ydCBjYXRhbG9ndWUgc3RpbGxcbiAgICAgICAgLy8gc2hpcHMgYXMgbWV0YWRhdGE7IGFkbWlucyBjYW4gcGluIG1vcmUgZnJvbSB0aGUgcmVwb3J0IHBpY2tlci5cbiAgICAgICAgeyBpZDogJ25hdl9jcm1fZGFzaGJvYXJkJywgICAgICAgICAgICB0eXBlOiAnZGFzaGJvYXJkJywgZGFzaGJvYXJkTmFtZTogJ2NybV9vdmVydmlld19kYXNoYm9hcmQnLCBsYWJlbDogJ0NSTSBPdmVydmlldycsICAgICAgaWNvbjogJ2xheW91dC1kYXNoYm9hcmQnIH0sXG4gICAgICAgIHsgaWQ6ICduYXZfZm9yZWNhc3QnLCAgICAgICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsIG9iamVjdE5hbWU6ICdjcm1fZm9yZWNhc3QnLCAgICAgICAgICAgICAgICAgbGFiZWw6ICdGb3JlY2FzdHMnLCAgICAgICAgIGljb246ICd0cmVuZGluZy11cCcgfSxcbiAgICAgICAgeyBpZDogJ25hdl9yZXBvcnRfcGlwZWxpbmVfY292ZXJhZ2UnLCB0eXBlOiAncmVwb3J0JywgcmVwb3J0TmFtZTogJ3BpcGVsaW5lX2NvdmVyYWdlX2J5X3F1YXJ0ZXInLCBsYWJlbDogJ1BpcGVsaW5lIENvdmVyYWdlJywgaWNvbjogJ2NvbHVtbnMtMycgfSxcbiAgICAgICAgeyBpZDogJ25hdl9yZXBvcnRfbGVhZF9pbmZsb3cnLCAgICAgICB0eXBlOiAncmVwb3J0JywgcmVwb3J0TmFtZTogJ2xlYWRfaW5mbG93X2J5X21vbnRoX3NvdXJjZScsICBsYWJlbDogJ0xlYWQgSW5mbG93JywgICAgICAgaWNvbjogJ3RyZW5kaW5nLXVwJyB9LFxuICAgICAgXSxcbiAgICB9LFxuXG4gIF0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzL2luZGV4LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzL2luZGV4LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFByb2ZpbGUgRGVmaW5pdGlvbnMgQmFycmVsXG4gKlxuICogXHUyNTAwXHUyNTAwXHUyNTAwIGBhbGxvd0V4cG9ydGAgXHUyMDE0IHRoZSBvcHQtaW4gYnVsay1lZ3Jlc3MgYXhpcyAoQG9iamVjdHN0YWNrIDE3LCAjMzU0NCkgXHUyNTAwXHUyNTAwXHUyNTAwXG4gKlxuICogVGhpcyBpcyB0aGUgY2Fub25pY2FsIG5vdGU7IHRoZSBwcm9maWxlcyBwb2ludCBoZXJlLlxuICpcbiAqIEJlZm9yZSAxNy4wIHRoZSBleHBvcnQgYXhpcyB3YXMgYWR2aXNvcnk6IGFuIHVuc2V0IGBhbGxvd0V4cG9ydGAgaW5oZXJpdGVkXG4gKiByZWFkLCBzbyBcImNhbiBsaXN0IFx1MjFEMiBjYW4gZXhwb3J0XCIgYW5kIHRoZSBiaXQgb25seSBldmVyIGhpZCBhIGJ1dHRvbi4gMTcuMFxuICogbWFrZXMgaXQgYSByZWFsIGdhdGUgYW5kIGludmVydHMgdGhlIGRlZmF1bHQgXHUyMDE0IGByZXNvbHZlVXNlckV4cG9ydEFsbG93ZWRgXG4gKiAocGx1Z2luLXNlY3VyaXR5KSByZXR1cm5zIHRydWUgb25seSBmb3IgYW4gZXhwbGljaXQgYGFsbG93RXhwb3J0OiB0cnVlYCwgYW5kXG4gKiBuZWl0aGVyIGB2aWV3QWxsUmVjb3Jkc2Agbm9yIGBtb2RpZnlBbGxSZWNvcmRzYCBzdWJzdGl0dXRlcyBmb3IgaXQuIEFuIHVuc2V0XG4gKiBiaXQgbm93IERFTklFUy5cbiAqXG4gKiBXSEVSRSBpdCBpcyBlbmZvcmNlZCwgbWVhc3VyZWQgb24gYSBydW5uaW5nIGRldiBzZXJ2ZXIgKCM3OTgpLiBPbmUgcm91dGVcbiAqIGNhcnJpZXMgYnVsayBlZ3Jlc3MgaW4gdGhpcyBhcHA6IGBHRVQgL2FwaS92MS9kYXRhLzpvYmplY3QvZXhwb3J0YFxuICogKGBjc3ZgIC8gYHhsc3hgIC8gYGpzb25gKSwgZ2F0ZWQgYnkgYGVuZm9yY2VFeHBvcnRQZXJtaXNzaW9uYCBcdTIxOTJcbiAqIGBzZWN1cml0eS5jYW5FeHBvcnRgIGluIGBAb2JqZWN0c3RhY2svcmVzdGAuIEEgcHJpbmNpcGFsIGhvbGRpbmcgdGhlIGdyYW50XG4gKiBnZXRzIDIwMCBhbmQgdGhlIHJvd3M7IG9uZSB3aXRob3V0IGl0IGdldHMgNDAzIGBFWFBPUlRfTk9UX1BFUk1JVFRFRGAuXG4gKlxuICogQSBsaXN0IHZpZXcncyBgZXhwb3J0T3B0aW9uc2AgaXMgTk9UIGEgc2Vjb25kIGRvb3IgXHUyMDE0IGl0IGRlY2xhcmVzIHdoaWNoXG4gKiBmb3JtYXRzIHRoZSB0b29sYmFyJ3MgRXhwb3J0IGJ1dHRvbiBvZmZlcnMsIGFuZCB0aGF0IGJ1dHRvbiBjYWxscyB0aGUgdmVyeVxuICogc2FtZSByb3V0ZS4gU28gdGhlIGdhdGUgaXMgb2JqZWN0LXdpZGUgYW5kIHJlYWNoYWJsZSB3aXRoIGBjdXJsYCwgd2hpY2ggaXNcbiAqIGV4YWN0bHkgd2h5IGl0IGhhcyB0byBiZSBlbmZvcmNlZCBzZXJ2ZXItc2lkZSByYXRoZXIgdGhhbiBieSBoaWRpbmcgYSBidXR0b24uXG4gKlxuICogU0hBUEUgKEBvYmplY3RzdGFjay9zcGVjIDE3LjAuMCwgIzgwMTAsIG1haW50YWluZXIgcnVsaW5nIDIwMjYtMDgtMTIpOiB0aGVcbiAqIGRlY2xhcmF0aW9uIGlzIHRoZSBPQkpFQ1QgZm9ybSBgZXhwb3J0T3B0aW9uczogeyBmb3JtYXRzOiBbJ2NzdicsICd4bHN4J10gfWAuXG4gKiBUaGUgYmFyZSBhcnJheSB0aGlzIGFwcCB1c2VkIHRocm91Z2ggMTcuMC4wLXJjLjYgaXMgdGhlIGxlZ2FjeSBzcGVsbGluZzsgaXRcbiAqIHN0aWxsIHBhcnNlcyBhbmQgTElGVFMgdG8gYHsgZm9ybWF0czogWy4uLl0gfWAsIHNvIGB6LmlucHV0YCBhY2NlcHRzIGJvdGhcbiAqIHdoaWxlIGB6Lm91dHB1dGAgXHUyMDE0IGV2ZXJ5dGhpbmcgdGhhdCByZWFkcyBsb2FkZWQgbWV0YWRhdGEsIHRoaXMgYXBwJ3Mgb3duXG4gKiBndWFyZHMgaW5jbHVkZWQgXHUyMDE0IG9ubHkgZXZlciBzZWVzIHRoZSBvYmplY3QuIFRoYXQgYXN5bW1ldHJ5IGlzIHdoeSB0aGUgYnVtcFxuICogdG8gMTcuMC4wIGJsaW5kZWQgdGhlIGd1YXJkIGJlbG93IHJhdGhlciB0aGFuIGZhaWxpbmcgaXQ6IHRoZSB2aWV3cyBzdGlsbFxuICogZGVjbGFyZWQgdGhlaXIgc3VyZmFjZXMsIGFuZCBhIHJlYWRlciB0ZXN0aW5nIHRoZSBsZWdhY3kgYXJyYXkncyBgLmxlbmd0aGBcbiAqIHNpbGVudGx5IG1lYXN1cmVkIGB1bmRlZmluZWRgIG9uIGV2ZXJ5IG9uZSBvZiB0aGVtLiBSZWFkIGAuZm9ybWF0c2AuXG4gKiBgJ3BkZidgIGxlZnQgdGhlIGZvcm1hdCBlbnVtIGluIHRoZSBzYW1lIGNoYW5nZSAoIzEzMDEgTk9UX1BMQU5ORUQpOyB0aGlzXG4gKiBhcHAgbmV2ZXIgZGVjbGFyZWQgaXQuXG4gKlxuICogYFJlcG9ydFNlcnZpY2UuYXNzZXJ0RXhwb3J0QWxsb3dlZGAgaXMgYSBnZW51aW5lbHkgc2VwYXJhdGUgZ2F0ZSwgYnV0IGl0XG4gKiBiZWxvbmdzIHRvIHRoZSBgcmVwb3J0c2AgY2FwYWJpbGl0eSAoc2F2ZWQgcmVwb3J0cyArIGVtYWlsZWQgZGlnZXN0cyBvdmVyXG4gKiBgc3lzX3NhdmVkX3JlcG9ydGApLCB3aGljaCB0aGlzIGFwcCBkb2VzIG5vdCByZXF1aXJlIFx1MjAxNCBgL2FwaS92MS9yZXBvcnRzYFxuICogYW5zd2VycyA1MDEgb24gYSBkZWZhdWx0IGJvb3QsIGFuZCB0aGUgQ29uc29sZSdzIHJlcG9ydCBwYWdlIHNoaXBzIG5vIGV4cG9ydFxuICogYWZmb3JkYW5jZSBlaXRoZXIgd2F5LiBJdCBpcyBub3Qgd2hhdCBhbnkgZ3JhbnQgYmVsb3cgbGFuZHMgb24uIERvIG5vdCByZWFkXG4gKiB0aGUgcnVsZSBiZWxvdyBhcyBkZXBlbmRpbmcgb24gaXQ6ICM3OTggd2FzIGZpbGVkIG9uIGV4YWN0bHkgdGhhdCByZWFkaW5nLlxuICpcbiAqIFNvIHRoZSBncmFudHMgYmVsb3cgYXJlIGF1dGhvcmVkLCBub3QgaW5oZXJpdGVkLiBUaGUgcnVsZSwgcGlubmVkIGJ5XG4gKiBgdGVzdC9hdXRob3JpemF0aW9uLWNvdmVyYWdlLnRlc3QudHNgOlxuICpcbiAqICAgYSBwcm9maWxlIGdyYW50cyBgYWxsb3dFeHBvcnRgIG9uIGFuIG9iamVjdCBJRkYgaXQgYWxyZWFkeSBob2xkc1xuICogICBgYWxsb3dSZWFkYCB0aGVyZSBBTkQgdGhlIGFwcCBzaGlwcyBhbiBleHBvcnQgc3VyZmFjZSBmb3IgdGhhdCBvYmplY3QgXHUyMDE0XG4gKiAgIHRoYXQgaXMsIGEgbGlzdCB2aWV3IGRlY2xhcmluZyBgZXhwb3J0T3B0aW9uc2AuXG4gKlxuICogVGhhdCBydWxlIGlzIGFuIEFVVEhPUklORyBESVNDSVBMSU5FIGFib3V0IHdoaWNoIGFmZm9yZGFuY2VzIHRoaXMgYXBwIHNoaXBzLFxuICogbm90IGEgc3RhdGVtZW50IGFib3V0IHJlYWNoYWJpbGl0eTogdGhlIGV4cG9ydCByb3V0ZSBleGlzdHMgZm9yIGV2ZXJ5XG4gKiBBUEktZXhwb3NlZCBvYmplY3QsIHNvIGEgZ3JhbnQgb24gYW55IG9mIHRoZW0gd291bGQgd29yay4gVGhlIGRpc2NpcGxpbmVcbiAqIGtlZXBzIHRoZSBncmFudCBsaXN0IHRvIG9iamVjdHMgYSB1c2VyIGNhbiBhY3R1YWxseSByZWFjaCBhbiBleHBvcnQgZnJvbSxcbiAqIHNvIHRoZSBwZXJtaXNzaW9uIHRhYmxlIHN0YXlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIHByb2R1Y3QgcmF0aGVyIHRoYW4gb2ZcbiAqIHRoZSBwbGF0Zm9ybS4gUmVhY2hhYmlsaXR5IGlzIHBpbm5lZCBzZXBhcmF0ZWx5LCBieSB0aGUgYGVuYWJsZWAgZ3VhcmQgYXRcbiAqIHRoZSBlbmQgb2YgdGhhdCBzYW1lIHRlc3QgZmlsZS5cbiAqXG4gKiBUaGF0IHVuaW9uIGlzIGV4YWN0bHkgYGNybV9hY2NvdW50YCwgYGNybV9jYXNlYCwgYGNybV9jb250YWN0YCwgYGNybV9sZWFkYCxcbiAqIGBjcm1fb3Bwb3J0dW5pdHlgIHRvZGF5LCBlYWNoIGJlaGluZCB0aGUgYGV4cG9ydE9wdGlvbnNgIG9uIGl0cyBvd24gbGlzdFxuICogdmlldy4gQWRkaW5nIGBleHBvcnRPcHRpb25zYCB0byBhIHZpZXcgbWVhbnMgYWRkaW5nIHRoZSBtYXRjaGluZyBncmFudCBoZXJlXG4gKiBpbiB0aGUgc2FtZSBjaGFuZ2UgXHUyMDE0IHRoZSBndWFyZCBmYWlscyBvdGhlcndpc2UsIHdoaWNoIGlzIHRoZSBwb2ludDogYVxuICogc3VyZmFjZSBub2JvZHkgY2FuIHVzZSBpcyB0aGUgZmFpbHVyZSB0aGlzIGF4aXMgZXhpc3RzIHRvIG1ha2UgbG91ZCBpbnN0ZWFkXG4gKiBvZiBzaWxlbnQuXG4gKlxuICogQSBSRVBPUlQgSVMgTk9UIEFOIEVYUE9SVCBTVVJGQUNFLiBUaGUgQ29uc29sZSdzIHJlcG9ydCBwYWdlIHJlbmRlcnMgYSBjaGFydFxuICogYW5kIGEgZGF0YSB0YWJsZSBhbmQgb2ZmZXJzIG5vIGRvd25sb2FkIChtZWFzdXJlZCBvbiBhIHJ1bm5pbmcgc2VydmVyIGluXG4gKiAjNzk4KSwgYW5kIGBSZXBvcnRTZXJ2aWNlYCdzIG93biBleHBvcnQgZ2F0ZSBiZWxvbmdzIHRvIHRoZSBgcmVwb3J0c2BcbiAqIGNhcGFiaWxpdHkgYWJvdmUuIFVudGlsICM4MTcgdGhlIGd1YXJkIGNvdW50ZWQgcmVwb3J0cyBhbnl3YXksIGFuZFxuICogYGNybV9jYXNlYCBodW5nIG9mZiB0aGF0IGxlZyBhbG9uZTogdGhlIGdyYW50IHdhcyBsaXZlIGJ1dCByZWFjaGFibGUgb25seSBieVxuICogYGN1cmxgLCBhbmQgZGVsZXRpbmcgdGhlIGNhc2UgcmVwb3J0cyB3b3VsZCBoYXZlIG1hZGUgdGhlIGd1YXJkIGRlbWFuZCB0aGlzXG4gKiB1c2VmdWwgZ3JhbnQgYmUgZGVsZXRlZCB3aXRoIHRoZW0uICM4MTcgZ2F2ZSB0aGUgQ2FzZXMgbGlzdCB2aWV3IGl0cyBvd25cbiAqIGBleHBvcnRPcHRpb25zYCBhbmQgcmV0aXJlZCB0aGUgcmVwb3J0IGxlZywgc28gYSByZXBvcnQgb3ZlciBzb21lIGZ1dHVyZVxuICogZGF0YXNldCBubyBsb25nZXIgY29uanVyZXMgYSBncmFudCByZXF1aXJlbWVudCBvdXQgb2YgYSBwYWdlIHdpdGggbm9cbiAqIGRvd25sb2FkIGJ1dHRvbi5cbiAqXG4gKiBFeHBvcnQgaXMgUkVBRC1ERVJJVkVEIChgZXhwb3J0IFx1MjI4NiBsaXN0YCksIHNvIHRoZSBncmFudCBvcGVucyB0aGUgZG9vciBidXRcbiAqIGRvZXMgbm90IHdpZGVuIHRoZSByb3dzOiByZWNvcmQgc2NvcGUsIFJMUyBhbmQgc2hhcmluZyBzdGlsbCBhcHBseSBvbiB0b3AuIEFcbiAqIGBzYWxlc19yZXBgIGV4cG9ydGluZyBgY3JtX29wcG9ydHVuaXR5YCBnZXRzIHRoZWlyIG93biBib29rLCBub3QgdGhlIG9yZydzLlxuICpcbiAqIGBndWVzdF9wb3J0YWxgIGRlbGliZXJhdGVseSBjYXJyaWVzIG5vbmUuIFBlciBBRFItMDA5MCBEOSBhIHNldCBob2xkaW5nXG4gKiBgYWxsb3dFeHBvcnRgIGlzIGhpZ2gtcHJpdmlsZWdlIGFuZCBjYW5ub3QgYmUgYm91bmQgdG8gdGhlIGBldmVyeW9uZWAgb3JcbiAqIGBndWVzdGAgYW5jaG9ycyBhdCBhbGwgXHUyMDE0IGdyYW50aW5nIGl0IHRoZXJlIHdvdWxkIGJvdGggaGFuZCBhbm9ueW1vdXNcbiAqIHZpc2l0b3JzIGJ1bGsgdGFibGUgZWdyZXNzIGFuZCBtYWtlIHRoZSBzZXQgdW5iaW5kYWJsZS5cbiAqL1xuLyoqXG4gKiBcdTI1MDBcdTI1MDBcdTI1MDAgYGFsbG93VHJhbnNmZXJgIFx1MjAxNCB0aGUgb3duZXJzaGlwLXRyYW5zZmVyIGF4aXMgKCM1NDgpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICpcbiAqIFRoaXMgaXMgdGhlIGNhbm9uaWNhbCBub3RlOyB0aGUgcHJvZmlsZXMgcG9pbnQgaGVyZS5cbiAqXG4gKiBIb3RDUk0gaGFzIE9ORSBvd25lciBjb2x1bW46IHRoZSBwbGF0Zm9ybSdzIGBvd25lcl9pZGAsIGluamVjdGVkIGludG8gZXZlcnlcbiAqIGJ1c2luZXNzIG9iamVjdCBieSB0aGUgcmVnaXN0cnkgKGBhcHBseVN5c3RlbUZpZWxkc2ApIGFuZCBhdXRvLXN0YW1wZWQgdG8gdGhlXG4gKiBpbnNlcnRpbmcgdXNlci4gSXQgaXMgdGhlIGNvbHVtbiBPV0QsIHNoYXJpbmcgcnVsZXMsIG93bmVyLXNjb3BlIHdpZGVuaW5nIGFuZFxuICogdGhlIGBpc19wcml2YXRlYCByb3cgZmlsdGVyIGFsbCByZWFkIFx1MjAxNCBzbyB3aG9ldmVyIGNhbiB3cml0ZSBpdCBkZWNpZGVzIHdobyBtYXlcbiAqIHNlZSBhbmQgZWRpdCB0aGUgcm93LlxuICpcbiAqIFRoZSBhcHAgdXNlZCB0byBhdXRob3IgaXRzIG93biBgb3duZXJgIGxvb2t1cCBiZXNpZGUgaXQuIFJlYXNzaWduaW5nIHRoYXRcbiAqIGZpZWxkIG1vdmVkIHRoZSByZWNvcmQgaW4gZXZlcnkgbGlzdCBhbmQgcmVwb3J0IGFuZCBtb3ZlZCBOTyBhY2Nlc3MgYXQgYWxsLFxuICogYW5kIGl0IGRpZCBzbyBmb3IgYW55IHVzZXIgd2l0aCBwbGFpbiBlZGl0IHJpZ2h0cyBcdTIwMTQgYSB0cmFuc2ZlciB3aXRoIG5vbmUgb2ZcbiAqIHRoZSB0cmFuc2ZlciBzZW1hbnRpY3MuICM1NDggcmVtb3ZlZCBpdC5cbiAqXG4gKiBXaXRoIG9uZSBjb2x1bW4sIG93bmVyc2hpcCB3cml0ZXMgZ28gdGhyb3VnaCB0aGUgcGxhdGZvcm0ncyBnYXRlOiBhblxuICogaW5zZXJ0IHBsYW50aW5nIGEgcmVjb3JkIHVuZGVyIGFub3RoZXIgdXNlciwgb3IgYW4gdXBkYXRlIHJlYXNzaWduaW5nIC9cbiAqIGRpc293bmluZyBvbmUsIGlzIERFTklFRCB1bmxlc3MgdGhlIGNhbGxlciBob2xkcyBgYWxsb3dUcmFuc2ZlcmAgXHUyMDE0IGVuZm9yY2VkXG4gKiB0b2RheSB0aHJvdWdoIHRoZSBvcmRpbmFyeSBpbnNlcnQvdXBkYXRlIGRvb3IsIG5vdCBtZXJlbHkgZGVjbGFyZWRcbiAqIChgQG9iamVjdHN0YWNrL3NwZWNgIGBwZXJtaXNzaW9uLnpvZC50c2AsIHRoZSAjMzAwNCBvd25lcl9pZCBndWFyZCkuXG4gKiBgbW9kaWZ5QWxsUmVjb3Jkc2AgaW1wbGllcyBpdC4gVHdvIHdyaXRlcyBhcmUgZGVsaWJlcmF0ZWx5IE5PVCB0cmFuc2ZlcnMgYW5kXG4gKiBuZWVkIG5vIGdyYW50OiBhbiBpbnNlcnQgbGVhdmluZyBgb3duZXJfaWRgIGVtcHR5IChhdXRvLXN0YW1wZWQgdG8gdGhlXG4gKiBjYWxsZXIpIGFuZCBhIGZvcm0gc2F2ZSBlY2hvaW5nIHRoZSB1bmNoYW5nZWQgb3duZXIgYmFjay5cbiAqXG4gKiBUaGUgcnVsZSB0aGUgZ3JhbnRzIGJlbG93IGZvbGxvdywgcGlubmVkIGJ5XG4gKiBgdGVzdC9hdXRob3JpemF0aW9uLWNvdmVyYWdlLnRlc3QudHNgOlxuICpcbiAqICAgYGFsbG93VHJhbnNmZXJgIGlzIGdyYW50ZWQgSUZGIHRoZSBzZXQgYWxyZWFkeSBob2xkcyBgYWxsb3dFZGl0YCBvbiB0aGF0XG4gKiAgIG9iamVjdCwgYW5kIG9ubHkgdG8gYHN5c3RlbV9hZG1pbmAgKGV2ZXJ5IGJ1c2luZXNzIG9iamVjdCkgYW5kXG4gKiAgIGBzYWxlc19tYW5hZ2VyYCAoZXhhY3RseSB0aGUgb2JqZWN0cyBpdCBob2xkcyBgbW9kaWZ5QWxsUmVjb3Jkc2Agb24gXHUyMDE0IHRoZVxuICogICBzYWxlcyBib29rIGl0IG93bnMgdGhlIG51bWJlciBmb3IpLlxuICpcbiAqIE9uIHRob3NlIG9iamVjdHMgYG1vZGlmeUFsbFJlY29yZHNgIGFscmVhZHkgaW1wbGllcyB0aGUgYml0LCBzbyBhdXRob3JpbmcgaXRcbiAqIGdyYW50cyBub3RoaW5nIG5ldy4gSXQgaXMgYXV0aG9yZWQgYW55d2F5LCBmb3IgdGhlIHNhbWUgcmVhc29uIGBhbGxvd0V4cG9ydGBcbiAqIGlzOiB0aGUgY2FwYWJpbGl0eSBhIHBlcnNvbmEgaXMgbWVhbnQgdG8gaGF2ZSBzaG91bGQgYmUgcmVhZGFibGUgaW4gdGhlXG4gKiBwcm9maWxlLCBhbmQgaXQgbXVzdCBzdXJ2aXZlIGEgZnV0dXJlIG5hcnJvd2luZyBvZiBgbW9kaWZ5QWxsUmVjb3Jkc2AgcmF0aGVyXG4gKiB0aGFuIGRpc2FwcGVhcmluZyB3aXRoIGl0LiBSZXBzIGFuZCBzZXJ2aWNlIGFnZW50cyBob2xkIG5vIHRyYW5zZmVyIGdyYW50IFx1MjAxNFxuICogZm9yIHRoZW0gb3duZXJzaGlwIGlzIGFzc2lnbmVkLCBuZXZlciB0YWtlbi5cbiAqL1xuXG5leHBvcnQgeyBHdWVzdFBvcnRhbFByb2ZpbGUgfSBmcm9tICcuL2d1ZXN0LXBvcnRhbC5wcm9maWxlJztcbmV4cG9ydCB7IE1hcmtldGluZ1VzZXJQcm9maWxlIH0gZnJvbSAnLi9tYXJrZXRpbmctdXNlci5wcm9maWxlJztcbmV4cG9ydCB7IFNhbGVzTWFuYWdlclByb2ZpbGUgfSBmcm9tICcuL3NhbGVzLW1hbmFnZXIucHJvZmlsZSc7XG5leHBvcnQgeyBTYWxlc1JlcFByb2ZpbGUgfSBmcm9tICcuL3NhbGVzLXJlcC5wcm9maWxlJztcbmV4cG9ydCB7IFNlcnZpY2VBZ2VudFByb2ZpbGUgfSBmcm9tICcuL3NlcnZpY2UtYWdlbnQucHJvZmlsZSc7XG5leHBvcnQgeyBTZXJ2aWNlTWFuYWdlclByb2ZpbGUgfSBmcm9tICcuL3NlcnZpY2UtYWdlbnQucHJvZmlsZSc7XG5leHBvcnQgeyBTeXN0ZW1BZG1pblByb2ZpbGUgfSBmcm9tICcuL3N5c3RlbS1hZG1pbi5wcm9maWxlJztcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzL2d1ZXN0LXBvcnRhbC5wcm9maWxlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzL2d1ZXN0LXBvcnRhbC5wcm9maWxlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIEd1ZXN0IFBvcnRhbCBQcm9maWxlXG4gKlxuICogUGVybWlzc2lvbiBzZXQgYXBwbGllZCB0byBhbm9ueW1vdXMgKHVuYXV0aGVudGljYXRlZCkgdmlzaXRvcnMgd2hvIHN1Ym1pdFxuICogdGhlIHB1YmxpYyBXZWItdG8tTGVhZCBhbmQgV2ViLXRvLUNhc2UgZm9ybXMuXG4gKlxuICogSVJPTi1DTEFEIFJVTEU6IGd1ZXN0cyBtdXN0IE5FVkVSIGJlIGFibGUgdG8gcmVhZCBleGlzdGluZyBDUk0gZGF0YS5cbiAqIFRoZSBvbmx5IHRoaW5nIHRoZXkgY2FuIGRvIGlzIElOU0VSVCBhIG5ldyBgY3JtX2xlYWRgIG9yIGBjcm1fY2FzZWAgcm93IHRocm91Z2hcbiAqIHRoZSBmb3JtIHZpZXdzIHdob3NlIGBzaGFyaW5nLmFsbG93QW5vbnltb3VzID0gdHJ1ZWAuXG4gKlxuICogQW55IG5ldyBvYmplY3QgYWRkZWQgdG8gdGhlIENSTSBzdGFjayBpcyBpbXBsaWNpdGx5IERFTklFRCBmb3IgZ3Vlc3RzIFx1MjAxNFxuICogcHJvZmlsZSBwZXJtaXNzaW9ucyBhcmUgZXhwbGljaXQtYWxsb3cgb25seS5cbiAqXG4gKiBUaGF0IGluY2x1ZGVzIGV2ZXJ5IG9iamVjdCBncmFudGVkIHRvIGludGVybmFsIHByb2ZpbGVzIGJ5ICM0ODguIEluXG4gKiBwYXJ0aWN1bGFyIGBjcm1fa25vd2xlZGdlX2FydGljbGVgIHN0YXlzIGRlbmllZCBldmVuIHRob3VnaCBpdHMgYGF1ZGllbmNlYFxuICogZmllbGQgbWFya3Mgc29tZSBhcnRpY2xlcyBwdWJsaWM6IGEgY3VzdG9tZXItZmFjaW5nIGFydGljbGUgc3VyZmFjZSB3b3VsZCBiZVxuICogc2VydmVkIGJ5IGEgcG9ydGFsIHZpZXcgd2l0aCBgc2hhcmluZy5hbGxvd0Fub255bW91c2AsIG5ldmVyIGJ5IHdpZGVuaW5nIHRoZVxuICogZ3Vlc3Qgc2V0IHRvIHJlYWQgYSBDUk0gb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgR3Vlc3RQb3J0YWxQcm9maWxlID0ge1xuICBuYW1lOiAnZ3Vlc3RfcG9ydGFsJyxcbiAgbGFiZWw6ICdHdWVzdCAoUHVibGljIEZvcm1zKScsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdBbm9ueW1vdXMgdmlzaXRvcnMgc3VibWl0dGluZyBwdWJsaWMgV2ViLXRvLUxlYWQgLyBXZWItdG8tQ2FzZSBmb3Jtcy4gJyArXG4gICAgJ0lOU0VSVC1vbmx5IG9uIGxlYWQgYW5kIGNhc2U7IG5vIHJlYWQvZWRpdC9kZWxldGUgb24gYW55IG9iamVjdC4nLFxuICAvLyBObyBgYWxsb3dFeHBvcnRgIGFueXdoZXJlIGJlbG93LCBkZWxpYmVyYXRlbHk6IHRoaXMgc2V0IGlzIGJvdW5kIHRvIHRoZVxuICAvLyBgZ3Vlc3RgIGFuY2hvciwgYW5kIEFEUi0wMDkwIEQ5IGNsYXNzZXMgYGFsbG93RXhwb3J0YCBhcyBhIGhpZ2gtcHJpdmlsZWdlXG4gIC8vIGJpdCBubyBhbmNob3IgbWF5IGNvbmZlciBcdTIwMTQgdGhlIHNldCB3b3VsZCBzdG9wIGJpbmRpbmcgYXQgYWxsLCBvbiB0b3Agb2ZcbiAgLy8gaGFuZGluZyBhbm9ueW1vdXMgdmlzaXRvcnMgYnVsayB0YWJsZSBlZ3Jlc3MuIFNlZSBgc3JjL3NhbGVzL3Byb2ZpbGVzL2luZGV4LnRzYC5cbiAgb2JqZWN0czoge1xuICAgIGNybV9sZWFkOiB7XG4gICAgICBhbGxvd0NyZWF0ZTogdHJ1ZSxcbiAgICAgIGFsbG93UmVhZDogZmFsc2UsXG4gICAgICBhbGxvd0VkaXQ6IGZhbHNlLFxuICAgICAgYWxsb3dEZWxldGU6IGZhbHNlLFxuICAgICAgdmlld0FsbFJlY29yZHM6IGZhbHNlLFxuICAgICAgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UsXG4gICAgfSxcbiAgICBjcm1fY2FzZToge1xuICAgICAgYWxsb3dDcmVhdGU6IHRydWUsXG4gICAgICBhbGxvd1JlYWQ6IGZhbHNlLFxuICAgICAgYWxsb3dFZGl0OiBmYWxzZSxcbiAgICAgIGFsbG93RGVsZXRlOiBmYWxzZSxcbiAgICAgIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSxcbiAgICAgIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcHJvZmlsZXMvbWFya2V0aW5nLXVzZXIucHJvZmlsZS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlcy9tYXJrZXRpbmctdXNlci5wcm9maWxlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5leHBvcnQgY29uc3QgTWFya2V0aW5nVXNlclByb2ZpbGUgPSB7XG4gIG5hbWU6ICdtYXJrZXRpbmdfdXNlcicsXG4gIGxhYmVsOiAnTWFya2V0aW5nIFVzZXInLFxuICBvYmplY3RzOiB7XG4gICAgLy8gYGFsbG93RXhwb3J0YCB3aGVyZSBhbiBleHBvcnQgc3VyZmFjZSBleGlzdHMgXHUyMDE0IGNhbm9uaWNhbCBub3RlIGluXG4gICAgLy8gYHNyYy9zYWxlcy9wcm9maWxlcy9pbmRleC50c2AuIExlYWQgYW5kIGNvbnRhY3QgbGlzdCBleHBvcnRzIGFyZSBtYXJrZXRpbmcnc1xuICAgIC8vIGNvcmUgdGFyZ2V0aW5nIHdvcmtmbG93OyBhY2NvdW50L29wcG9ydHVuaXR5IGJhY2sgdGhlIGNhbXBhaWduLVJPSVxuICAgIC8vIHJlcG9ydHMuIE5vIGBjcm1fY2FzZWAgZ3JhbnQgaGVyZSwgc28gbm8gZXhwb3J0IGJpdCBmb3IgaXQgZWl0aGVyLlxuICAgIGNybV9sZWFkOiAgICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IHRydWUsICBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSwgYWxsb3dFeHBvcnQ6IHRydWUgfSxcbiAgICBjcm1fYWNjb3VudDogICAgIHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX2NvbnRhY3Q6ICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCAgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIGNybV9jYW1wYWlnbjogICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IHRydWUsICBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIC8vIE9yZy13aWRlIHJlYWQ6IG1hcmtldGluZyBhdHRyaWJ1dGVzIGNhbXBhaWduIFx1MjE5MiBwaXBlbGluZSBST0ksIHdoaWNoIG5lZWRzXG4gICAgLy8gZXZlcnkgb3Bwb3J0dW5pdHksIG5vdCBqdXN0IHNlbGYtb3duZWQuIHZpZXdBbGxSZWNvcmRzIHdhcyBmYWxzZSBoZXJlXG4gICAgLy8gd2hpbGUgZXZlcnkgb3RoZXIgb2JqZWN0IG9uIHRoaXMgc2V0IGlzIHRydWUgXHUyMDE0IGFuIG92ZXJzaWdodCB0aGF0IGhpZCBhbGxcbiAgICAvLyBwaXBlbGluZSBmcm9tIG1hcmtldGluZyAoYW5kIHRyaXBwZWQgc2VjdXJpdHktcHJpdmF0ZS1uby1yZWFkc2NvcGUpLlxuICAgIGNybV9vcHBvcnR1bml0eTogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogZmFsc2UsIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IHRydWUsICBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSwgYWxsb3dFeHBvcnQ6IHRydWUgfSxcbiAgICAvLyBDYW1wYWlnbiBtZW1iZXJzaGlwIGlzIFRISVMgcHJvZmlsZSdzIGNvcmUgd3JpdGUgc3VyZmFjZTogdGhlXG4gICAgLy8gXCJBZGQgdG8gQ2FtcGFpZ25cIiBhY3Rpb24gKGBzcmMvc2FsZXMvYWN0aW9ucy9sZWFkLmFjdGlvbnMudHNgKSBpbnNlcnRzXG4gICAgLy8gYGNybV9jYW1wYWlnbl9tZW1iZXJgIHJvd3MsIGFuZCBiZWZvcmUgIzQ4OCBubyBwZXJtaXNzaW9uIHNldCBncmFudGVkIHRoZVxuICAgIC8vIG9iamVjdCBcdTIwMTQgdGhlIGFjdGlvbiBmYWlsZWQgZm9yIHRoZSBvbmx5IHBlcnNvbmEgbWVhbnQgdG8gcnVuIGl0LiBSb3dzXG4gICAgLy8gZGVyaXZlIGZyb20gdGhlIGNhbXBhaWduIChjb250cm9sbGVkX2J5X3BhcmVudCksIHNvIHRoZXJlIGlzIG5vIHJlY29yZFxuICAgIC8vIHNjb3BlIHRvIGF1dGhvciBcdTIwMTQgYW5kIGFzIG9mIDE3LjAuMC1yYy40IHRoYXQgZGVyaXZhdGlvbiBkb2VzIGZvbGxvdyB0aGVcbiAgICAvLyBjYW1wYWlnbiBncmFudDogTUVBU1VSRUQgYW5kIHBpbm5lZCBieVxuICAgIC8vIGB0ZXN0L3BhcmVudC1kZXJpdmVkLXJlYWNoLnRlc3QudHNgLCBtYXN0ZXIgYWNjZXNzaWJpbGl0eSByZXNvbHZlcyB0aHJvdWdoXG4gICAgLy8gdGhlIHNhbWUgcGF0aHMgYSBkaXJlY3QgcmVhZCBvZiB0aGUgY2FtcGFpZ24gdGFrZXMsIG93bmVyc2hpcCBhbmRcbiAgICAvLyBgc3lzX3JlY29yZF9zaGFyZWAgZ3JhbnRzIGluY2x1ZGVkLiBGb3IgVEhJUyBwcm9maWxlIHRoZSBkZWx0YSBpcyBzbWFsbCBcdTIwMTRcbiAgICAvLyBgY3JtX2NhbXBhaWduYCBpcyBgcHVibGljX3JlYWRgIGFuZCB0aGlzIHNldCBob2xkcyBvcmctd2lkZSBjYW1wYWlnbiByZWFkLFxuICAgIC8vIHNvIHRoZSByb3dzIGFyZSB0aGUgc2FtZSBlaXRoZXIgd2F5IFx1MjAxNCBidXQgdGhlIGdyYW50IGlzIG5vdyBzY29wZSB0aGF0XG4gICAgLy8gZm9sbG93cyB0aGUgY2FtcGFpZ25zIGFib3ZlLCBub3Qgb3JnLXdpZGUgcmVhZCBpbiBmYWN0IGFzIGl0IHdhcyB0aHJvdWdoXG4gICAgLy8gMTcuMC4wLXJjLjMgKG9iamVjdHN0YWNrLWFpL29iamVjdHN0YWNrIzUzODYsICM2OTQpLlxuICAgIC8vIERlbGV0aW5nIG1lbWJlcnNoaXAgaGlzdG9yeSBzdGF5cyBhIG1hbmFnZXIvYWRtaW4gcHJpdmlsZWdlLCBtYXRjaGluZ1xuICAgIC8vIGV2ZXJ5IG90aGVyIG9iamVjdCBoZXJlLlxuICAgIGNybV9jYW1wYWlnbl9tZW1iZXI6IHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICAvLyBSZWFkLW9ubHkgcmVmZXJlbmNlOiBrbm93bGVkZ2UgYXJ0aWNsZXMgZm9yIGNhbXBhaWduIGNvcHlcbiAgICAvLyAocHVibGljX3JlYWQgY2F0YWxvZykuXG4gICAgLy8gUmVhZHMgdGhlIEtCIGFuZCBtYXkgcmF0ZSBpdDsgY2Fubm90IGF1dGhvciBhcnRpY2xlcyAoIzYwMSkuXG4gICAgY3JtX2FydGljbGVfZmVlZGJhY2s6IHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICAvLyBUaGUgcmVjb3JkIEF0dGFjaG1lbnRzIHBhbmVsLCBSRUFEIG9ubHk6IGNhbm9uaWNhbCBub3RlIG9uIGBlbmFibGUuZmlsZXNgXG4gICAgLy8gaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYCAoIzIwMjkpLiBXaGljaCBhdHRhY2htZW50cyBpdCBsaXN0c1xuICAgIC8vIGRlcml2ZXMgZnJvbSB0aGUgcGFyZW50IHJlY29yZDsgdXBsb2FkIGFuZCBkZWxldGUgd2FpdCB1cHN0cmVhbS5cbiAgICBzeXNfYXR0YWNobWVudDogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gVGhlIHJlY29yZCBEaXNjdXNzaW9uIHBhbmVsLCBjb21tZW50cyBhbmQgYWN0aXZpdHk6IGNhbm9uaWNhbCBub3RlIG9uXG4gICAgLy8gYGVuYWJsZS5mZWVkc2AgaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYCAoIzIwMjkpLiBXaGljaCB0aHJlYWRzIGl0XG4gICAgLy8gcmVhY2hlcyBkZXJpdmVzIGZyb20gdGhlIHBhcmVudCByZWNvcmQ7IGRlbGV0aW5nIGEgY29tbWVudCB3YWl0cyB1cHN0cmVhbS5cbiAgICBzeXNfY29tbWVudDogIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIHN5c19hY3Rpdml0eTogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gIH0sXG4gIGZpZWxkczoge1xuICAgIC8vIE1hcmtldGluZyByZWFkcyBwaXBlbGluZSBmb3IgY2FtcGFpZ24gUk9JIGJ1dCBuZXZlciBwcmljZXMgYSBkZWFsLCBhbmRcbiAgICAvLyBhY2NvdW50IGhlYWx0aCBpcyB0aGUgcmVuZXdhbCB0ZWFtJ3MgY2FsbCBcdTIwMTQgcmVhZCwgbmV2ZXIgd3JpdGUgKCM0ODgpLlxuICAgICdjcm1fb3Bwb3J0dW5pdHkuYW1vdW50JzogICB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2UgfSxcbiAgICAnY3JtX2FjY291bnQuaGVhbHRoX3Njb3JlJzogeyByZWFkYWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlIH0sXG4gIH0sXG4gIC8vIFRoZSBzYW1lIHByaXZhdGUtZGVhbCByb3cgZmlsdGVyIHRoZSBzYWxlc19tYW5hZ2VyIHNldCBjYXJyaWVzOiB0aGlzXG4gIC8vIHByb2ZpbGUgYWxzbyBob2xkcyBvcmctd2lkZSBvcHBvcnR1bml0eSByZWFkLCBzbyBpdCBpcyBvbmUgb2YgdGhlIHJlYWRlcnNcbiAgLy8gYGNybV9vcHBvcnR1bml0eS5pc19wcml2YXRlYCBoYXMgdG8gaG9sZCBiYWNrLiBTZWUgc2FsZXMtbWFuYWdlci5wcm9maWxlLnRzXG4gIC8vIGZvciB0aGUgZnVsbCByYXRpb25hbGUuXG4gIHJvd0xldmVsU2VjdXJpdHk6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnb3Bwb3J0dW5pdHlfcHJpdmF0ZV9vd25lcl9vbmx5X21hcmtldGluZycsXG4gICAgICAvLyBBIGRlYWwgZmxhZ2dlZCBQcml2YXRlIGlzIHZpc2libGUgb25seSB0byBpdHMgb3duZXIsIGV2ZW4gdG8gaG9sZGVycyBvZlxuICAgICAgLy8gb3JnLXdpZGUgb3Bwb3J0dW5pdHkgcmVhZC4gKGByb3dMZXZlbFNlY3VyaXR5W10ubGFiZWxgIC8gYGRlc2NyaXB0aW9uYFxuICAgICAgLy8gYXJlIGRpc3BsYXkgY29weSBcdTIwMTQgdGhlIDE3LjcuMCBsaXZlbmVzcyBsZWRnZXIgbWFya3MgYm90aCBsaXZlOiB0aGVcbiAgICAgIC8vIHBlcm1pc3Npb24gZWRpdG9yIGRyYXdzIHRoZW0gb24gdGhlIHBvbGljeSBjYXJkLiBUaGlzIHBvbGljeSBhdXRob3JzXG4gICAgICAvLyBuZWl0aGVyLCBzbyBpdHMgaW50ZW50IGxpdmVzIGluIHRoaXMgY29tbWVudC4pXG4gICAgICBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgb3BlcmF0aW9uOiAnc2VsZWN0JyBhcyBjb25zdCxcbiAgICAgIHVzaW5nOiAnaXNfcHJpdmF0ZSA9PSBmYWxzZSB8fCBvd25lcl9pZCA9PSBjdXJyZW50X3VzZXIuaWQnLFxuICAgIH0sXG4gICAgLy8gVGhlIHBsYXRmb3JtJ3MgYG1lbWJlcl9kZWZhdWx0YCBzZXQgY2FycmllcyBhIHdpbGRjYXJkIG93bmVyLW9ubHktd3JpdGVzXG4gICAgLy8gcG9saWN5IChgY3JlYXRlZF9ieSA9PSBjdXJyZW50X3VzZXIuaWRgIG9uIHVwZGF0ZSksIGFuZCBSTFMgcG9saWNpZXMgYXJlXG4gICAgLy8gT1ItY29tYmluZWQgXHUyMDE0IHNvIHdpdGhvdXQgYSBwb2xpY3kgb2YgaXRzIG93biwgdGhpcyBzZXQncyBhbGxvd0VkaXQgb25cbiAgICAvLyBjYW1wYWlnbnMgb25seSByZWFjaGVzIGNhbXBhaWducyB0aGUgdXNlciBwZXJzb25hbGx5IGNyZWF0ZWQuIFRoYXQgYWxzb1xuICAgIC8vIHNpbGVudGx5IGJyb2tlIFwiQWRkIHRvIENhbXBhaWduXCI6IGVucm9sbGluZyBhIG1lbWJlciBpcyBhIHdyaXRlIERFUklWRURcbiAgICAvLyBmcm9tIHRoZSBjYW1wYWlnbiAoY29udHJvbGxlZF9ieV9wYXJlbnQpLCBzbyBpdCByZXF1aXJlcyBjYW1wYWlnbiBlZGl0IGF0XG4gICAgLy8gdGhlIHJvdyBsZXZlbC4gVGhpcyBpcyB0aGUgb25lIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgQURSLTAwNTUgZGVyaXZhdGlvblxuICAgIC8vIHJlYWxseSBkb2VzIG5hcnJvdzogYSBtYXN0ZXIgUkxTIHBvbGljeSBpcyBleGFjdGx5IHdoYXQgaXQgZm9sZHMgaW4sIHdoaWxlXG4gICAgLy8gb3duZXJzaGlwIGFuZCBgc3lzX3JlY29yZF9zaGFyZWAgZ3JhbnRzIGFyZSBub3QgKHdoaWNoIGlzIHdoeSB0aGUgUkVBRFxuICAgIC8vIHNpZGUgb2YgdGhlc2UgbWVtYmVyIHJvd3MgaXMgb3JnLXdpZGUgXHUyMDE0IHNlZSB0aGUgYGNybV9jYW1wYWlnbl9tZW1iZXJgXG4gICAgLy8gZ3JhbnQgYWJvdmUgYW5kIG9iamVjdHN0YWNrLWFpL29iamVjdHN0YWNrIzUzODYsICM2OTQpLiBUaGlzIHBvbGljeSB3aWRlbnNcbiAgICAvLyBjYW1wYWlnbiB1cGRhdGVzIHRvIGV2ZXJ5IGhvbGRlciBvZiB0aGUgc2V0IFx1MjAxNCBleGFjdGx5IHdoYXQgdGhlIG9iamVjdFxuICAgIC8vIGdyYW50IGFib3ZlIGFscmVhZHkgZGVjbGFyZXMuIGBpZCAhPSBudWxsYFxuICAgIC8vIGlzIHRoZSBwdXNoZG93bi1zYWZlIFwiYWxsIHJvd3NcIiBwcmVkaWNhdGUgKHZlcmlmaWVkOiBjb21waWxlcyB0b1xuICAgIC8vIGB7aWQ6IHskbnVsbDogZmFsc2V9fWApLlxuICAgIHtcbiAgICAgIG5hbWU6ICdtYXJrZXRpbmdfY2FtcGFpZ25fdXBkYXRlcycsXG4gICAgICAvLyBNYXJrZXRpbmcgdXNlcnMgZWRpdCBhbnkgY2FtcGFpZ24gKGFuZCB0aGVyZWJ5IGVucm9sIG1lbWJlcnMgaW50byBpdCksXG4gICAgICAvLyBub3Qgb25seSBjYW1wYWlnbnMgdGhleSBjcmVhdGVkLlxuICAgICAgb2JqZWN0OiAnY3JtX2NhbXBhaWduJyxcbiAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScgYXMgY29uc3QsXG4gICAgICB1c2luZzogJ2lkICE9IG51bGwnLFxuICAgIH0sXG4gICAgLy8gU2FtZSB3aWRlbmluZyBmb3IgdGhlIG1lbWJlciByb3dzIHRoZW1zZWx2ZXM6IHJlc3BvbnNlIHRyYWNraW5nIG1lYW5zXG4gICAgLy8gdXBkYXRpbmcgcm93cyB0aGUgZW5yb2xsbWVudCBmbG93IChzeXN0ZW0gY29udGV4dCkgY3JlYXRlZCwgd2hpY2ggdGhlXG4gICAgLy8gZGVmYXVsdCBvd25lci1vbmx5LXdyaXRlcyBwb2xpY3kgd291bGQgb3RoZXJ3aXNlIGRlbnkuXG4gICAge1xuICAgICAgbmFtZTogJ21hcmtldGluZ19jYW1wYWlnbl9tZW1iZXJfdXBkYXRlcycsXG4gICAgICAvLyBNYXJrZXRpbmcgdXNlcnMgdXBkYXRlIG1lbWJlciByZXNwb25zZSBzdGF0ZSBvbiByb3dzIHRoZXkgZGlkIG5vdFxuICAgICAgLy8gcGVyc29uYWxseSBjcmVhdGUuXG4gICAgICBvYmplY3Q6ICdjcm1fY2FtcGFpZ25fbWVtYmVyJyxcbiAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScgYXMgY29uc3QsXG4gICAgICB1c2luZzogJ2lkICE9IG51bGwnLFxuICAgIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcHJvZmlsZXMvc2FsZXMtbWFuYWdlci5wcm9maWxlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzL3NhbGVzLW1hbmFnZXIucHJvZmlsZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBTYWxlcyBNYW5hZ2VyIFByb2ZpbGVcbiAqXG4gKiBPcmctd2lkZSBvbiB0aGUgc2FsZXMgc3RhY2s6IGEgbWFuYWdlciBvd25zIHRoZSBudW1iZXIsIHNvIHRoZXkgcmVhZCBhbmRcbiAqIG1vZGlmeSBldmVyeSByZXAncyByZWNvcmQgcmF0aGVyIHRoYW4gb25seSB0aGVpciBvd24uXG4gKi9cbmV4cG9ydCBjb25zdCBTYWxlc01hbmFnZXJQcm9maWxlID0ge1xuICBuYW1lOiAnc2FsZXNfbWFuYWdlcicsXG4gIGxhYmVsOiAnU2FsZXMgTWFuYWdlcicsXG4gIG9iamVjdHM6IHtcbiAgICAvLyBgYWxsb3dUcmFuc2ZlcmAgb24gZXhhY3RseSB0aGUgb2JqZWN0cyB0aGlzIHNldCBob2xkcyBgbW9kaWZ5QWxsUmVjb3Jkc2BcbiAgICAvLyBvbiBcdTIwMTQgdGhlIHNhbGVzIGJvb2sgYSBtYW5hZ2VyIHJlYXNzaWducy4gQ2Fub25pY2FsIG5vdGUgaW5cbiAgICAvLyBgc3JjL3NhbGVzL3Byb2ZpbGVzL2luZGV4LnRzYC5cbiAgICAvLyBgYWxsb3dFeHBvcnRgIHdoZXJlIGFuIGV4cG9ydCBzdXJmYWNlIGV4aXN0cyBcdTIwMTQgY2Fub25pY2FsIG5vdGUgaW5cbiAgICAvLyBgc3JjL3NhbGVzL3Byb2ZpbGVzL2luZGV4LnRzYC4gQSBtYW5hZ2VyIG93bnMgdGhlIG51bWJlciwgc28gdGhlIHBpcGVsaW5lIGFuZFxuICAgIC8vIGJvb2sgZXhwb3J0cyB0aGF0IGZlZWQgb2ZmbGluZSBmb3JlY2FzdGluZyBhcmUgcGFydCBvZiB0aGUgam9iLlxuICAgIGNybV9sZWFkOiAgICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IHRydWUsICB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX2FjY291bnQ6ICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogdHJ1ZSwgIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSwgYWxsb3dFeHBvcnQ6IHRydWUgfSxcbiAgICBjcm1fY29udGFjdDogICAgIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiB0cnVlLCAgdmlld0FsbFJlY29yZHM6IHRydWUsICBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlLCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIGNybV9vcHBvcnR1bml0eTogeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IHRydWUsICB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX3F1b3RlOiAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogdHJ1ZSwgIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIC8vIE5vIHdyaXRlU2NvcGU6IGBjcm1fY29udHJhY3RgIGlzIGBjb250cm9sbGVkX2J5X3BhcmVudGAgdW5kZXJcbiAgICAvLyBgY3JtX2FjY291bnRgICgjNTQ5KSwgc28gYSBzY29wZSBoZXJlIHdvdWxkIGJlIGluZXJ0IFx1MjAxNCB0aGUgd3JpdGUgZ2F0ZVxuICAgIC8vIGFza3MgZm9yIEVESVQgb24gdGhlIGFjY291bnQgaW5zdGVhZCwgd2hpY2ggdGhpcyBzZXQgaG9sZHMgb3JnLXdpZGVcbiAgICAvLyAoYG1vZGlmeUFsbFJlY29yZHNgIGFib3ZlKS4gVGhhdCByZXRpcmVzIHRoZSAjODgwIGdhcCBvbiBCT1RIIGVkaXRpb25zOlxuICAgIC8vIHRoZSBjb250cmFjdCBhbiBhY2NlcHRlZCBxdW90ZSBkcmFmdHMgaGFuZ3MgdW5kZXIgdGhlIHJlcCwgYW5kIHRoZVxuICAgIC8vIG1hbmFnZXIgZWRpdHMgaXQgYmVjYXVzZSB0aGV5IGNhbiBlZGl0IGl0cyBhY2NvdW50LCBub3QgYmVjYXVzZSBvZiBhXG4gICAgLy8gaGllcmFyY2h5IGRlcHRoLiBgb3duX2FuZF9yZXBvcnRzYCB3YXMgdGhlIGFwcCdzIG9ubHkgYXV0aG9yZWQgaGllcmFyY2h5XG4gICAgLy8gc2NvcGU7IGByZXF1aXJlczogWydoaWVyYXJjaHktc2VjdXJpdHknXWAgc3RheXMgZGVjbGFyZWQgKCMxMzc4IHJ1bGluZykuXG4gICAgLy8gYGFsbG93RGVsZXRlOiBmYWxzZWAgbXVzdCBrZWVwIGhvbGRpbmc7IGBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZWAga2VlcHNcbiAgICAvLyB0aGlzIG9mZiB0aGUgc3VwZXItdXNlciBieXBhc3MuIGB0ZXN0L2NvbnRyYWN0LXdyaXRlLWRlcHRoLnRlc3QudHNgLlxuICAgIGNybV9jb250cmFjdDogICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgY3JtX3Byb2R1Y3Q6ICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBjcm1fY2FtcGFpZ246ICAgIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IHRydWUsICBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIGNybV9jYXNlOiAgICAgICAgeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIGNybV90YXNrOiAgICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IHRydWUsICB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUgfSxcbiAgICAvLyBBIG1hbmFnZXIgY29hY2hlcyBvbiBhY3Rpdml0eSwgc28gdGhpcyBpcyBvcmctd2lkZSByZWFkIEFORCB3cml0ZSBvbiBhXG4gICAgLy8gcHJpdmF0ZSBvYmplY3QgXHUyMDE0IHRoZSBzYW1lIHNoYXBlIHRoZWlyIGBjcm1fdGFza2AgZ3JhbnQgYWxyZWFkeSBoYXMuXG4gICAgLy8gYGNybV9ldmVudF9hdHRlbmRlZWAgaXMgYGNvbnRyb2xsZWRfYnlfcGFyZW50YCAoQURSLTAwNTUpOiBubyBzY29wZSB0b1xuICAgIC8vIGF1dGhvciBcdTIwMTQgb25lIHdvdWxkIGJlIGluZXJ0IG1ldGFkYXRhLiBJdCBuYXJyb3dzIHRvIHRoZSBldmVudHMgdGhpcyBzZXRcbiAgICAvLyBjYW4gcmVhZCwgd2hpY2ggaXMgZXZlcnkgZXZlbnQ6IGB2aWV3QWxsUmVjb3Jkc2Agb24gYGNybV9ldmVudGAgYWJvdmUgcHV0c1xuICAgIC8vIHRoZSB3aG9sZSBhY3Rpdml0eSBzdGFjayBpbiByZWFjaCwgc28gdGhlIGRlcml2ZWQgYXR0ZW5kZWUgcm93cyBmb2xsb3cuXG4gICAgLy8gTUVBU1VSRUQgb24gMTcuMC4wLXJjLjQgYW5kIHBpbm5lZCBieSBgdGVzdC9wYXJlbnQtZGVyaXZlZC1yZWFjaC50ZXN0LnRzYCxcbiAgICAvLyBtYXN0ZXIgYWNjZXNzaWJpbGl0eSByZXNvbHZlcyB0aHJvdWdoIHRoZSBzYW1lIHBhdGhzIGEgZGlyZWN0IHJlYWQgb2YgdGhlXG4gICAgLy8gZXZlbnQgdGFrZXMgXHUyMDE0IG93bmVyc2hpcCBhbmQgYHN5c19yZWNvcmRfc2hhcmVgIGdyYW50cyBmb2xkZWQgaW4sIG5vdCB0aGVcbiAgICAvLyBtYXN0ZXIncyByb3ctbGV2ZWwgc2VjdXJpdHkgcG9saWNpZXMgYWxvbmUuIFVudGlsIDE3LjAuMC1yYy4zIHRoaXMgZ3JhbnRcbiAgICAvLyB3YXMgb3JnLXdpZGUgaW4gRkFDVCByYXRoZXIgdGhhbiBieSBkZXJpdmF0aW9uLCB3aGF0ZXZlciB0aGUgZXZlbnQgZ3JhbnRzXG4gICAgLy8gc2FpZCAoIzY5NCk7IG9iamVjdHN0YWNrLWFpL29iamVjdHN0YWNrIzUzODYgZml4ZWQgdGhhdCB1cHN0cmVhbSBhbmQgaXRcbiAgICAvLyBzaGlwcGVkIGluIHJjLjQuIFNhbWUgbm90ZSBpbiBgc2FsZXMtcmVwLnByb2ZpbGUudHNgLlxuICAgIGNybV9ldmVudDogICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IHRydWUsICB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUgfSxcbiAgICBjcm1fZXZlbnRfYXR0ZW5kZWU6IHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogdHJ1ZSwgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIC8vIFRoZSBmb3JlY2FzdCBJUyB0aGUgbWFuYWdlcidzIGpvYjogdGhleSByZWFkIGV2ZXJ5IHJlcCdzIHNuYXBzaG90IGFuZFxuICAgIC8vIGFkanVzdCB0aGUgY29tbWl0dGVkIG51bWJlciwgc28gdGhpcyBpcyBvcmctd2lkZSByZWFkIEFORCB3cml0ZSBvbiBhXG4gICAgLy8gcHJpdmF0ZSBvYmplY3QgKCM0ODggXHUyMDE0IHRoZSBvYmplY3QgaGFkIG5vIGdyYW50IGF0IGFsbCkuXG4gICAgY3JtX2ZvcmVjYXN0OiAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIC8vIEtub3dsZWRnZSBpcyBzZXJ2aWNlLWF1dGhvcmVkOyBzYWxlcyByZWFkcyBpdCAocHVibGljX3JlYWQgT1dEKS5cbiAgICAvLyBSZWFkcyB0aGUgS0IgYW5kIG1heSByYXRlIGl0OyBjYW5ub3QgYXV0aG9yIGFydGljbGVzICgjNjAxKS5cbiAgICBjcm1fYXJ0aWNsZV9mZWVkYmFjazogeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IHRydWUsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgY3JtX2tub3dsZWRnZV9hcnRpY2xlOiB7IGFsbG93Q3JlYXRlOiBmYWxzZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIC8vIEVucm9sbG1lbnQgaXMgbWFya2V0aW5nJ3Mgam9iOyBhIG1hbmFnZXIgb25seSByZWFkcyB0aGUgbWVtYmVyc2hpcCByb3dzXG4gICAgLy8gYmVoaW5kIGNhbXBhaWduIFJPSS4gYGNybV9jYW1wYWlnbl9tZW1iZXJgIGlzIGBjb250cm9sbGVkX2J5X3BhcmVudGAsIHNvXG4gICAgLy8gbm8gcmVhZFNjb3BlL3ZpZXdBbGxSZWNvcmRzIGFwcGxpZXMgKEFEUi0wMDU1KSBcdTIwMTQgYnV0IHRoZSByb3dzIGRvIG5vdFxuICAgIC8vIFwiZm9sbG93IHRoZSBjYW1wYWlnblwiOiB0aGUgZGVyaXZhdGlvbiByZXNvbHZlcyB0aGUgbWFzdGVyIHNldCB0aHJvdWdoIHRoZVxuICAgIC8vIG1hc3RlcidzIFJMUyBwb2xpY2llcyBvbmx5IChub25lIG5hcnJvdyBhIHNlbGVjdCBvbiBgY3JtX2NhbXBhaWduYCksIHNvXG4gICAgLy8gdGhpcyBpcyBvcmctd2lkZSByZWFkIG9uIGV2ZXJ5IG1lbWJlciByb3cuIFRoZSBwcmFjdGljYWwgZGVsdGEgaXMgc21hbGxcbiAgICAvLyBoZXJlIFx1MjAxNCBgY3JtX2NhbXBhaWduYCBpcyBgcHVibGljX3JlYWRgIGFuZCB0aGlzIHNldCByZWFkcyBldmVyeSBjYW1wYWlnblxuICAgIC8vIGFueXdheSBcdTIwMTQgc28gdGhlIGludGVuZGVkIGRlcml2YXRpb24gd291bGQgcmV0dXJuIHRoZSBzYW1lIHJvd3MuIFNlZVxuICAgIC8vIGBjYW1wYWlnbl9tZW1iZXIub2JqZWN0LnRzYCBhbmQgb2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjNTM4NiAoIzY5NCkuXG4gICAgY3JtX2NhbXBhaWduX21lbWJlcjogICB7IGFsbG93Q3JlYXRlOiBmYWxzZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICAvLyBMaW5lIGl0ZW1zOiBmdWxsIENSVUQgc28gYSBtYW5hZ2VyIGNhbiBmaXggcHJpY2luZyBvbiBhbnkgcmVwJ3MgZGVhbCBvclxuICAgIC8vIHF1b3RlLiBCb3RoIG9iamVjdHMgYXJlIGBjb250cm9sbGVkX2J5X3BhcmVudGAsIHNvIHRoZXJlIGlzIG5vIHNjb3BlIHRvXG4gICAgLy8gYXV0aG9yIFx1MjAxNCBidXQgdGhhdCBkZXJpdmF0aW9uIGRvZXMgbm90IG5hcnJvdyB0aGVzZSByb3dzIHRvIHRoZSBkZWFscyBhbmRcbiAgICAvLyBxdW90ZXMgdGhlIG1hbmFnZXIgY2FuIHJlYWQuIE1FQVNVUkVEIChzZWUgdGhlIG5vdGUgaW5cbiAgICAvLyBgc2FsZXMtcmVwLnByb2ZpbGUudHNgIGFuZCBgdGVzdC9wYXJlbnQtZGVyaXZlZC1yZWFjaC50ZXN0LnRzYCk6IHRoZSBtYXN0ZXJcbiAgICAvLyBzZXQgY29tZXMgZnJvbSB0aGUgbWFzdGVyJ3MgUkxTIHBvbGljaWVzIG9ubHksIG5ldmVyIGZyb20gb3duZXJzaGlwIG9yIGFcbiAgICAvLyBzaGFyZS4gVGhpcyBzZXQgYXV0aG9ycyBvbmUgc3VjaCBwb2xpY3kgXHUyMDE0IHRoZSBwcml2YXRlLWRlYWwgZmlsdGVyIG9uXG4gICAgLy8gYGNybV9vcHBvcnR1bml0eWAgYmVsb3cgXHUyMDE0IGFuZCBub25lIG9uIGBjcm1fcXVvdGVgLCBzbyBxdW90ZSBsaW5lcyBhcmVcbiAgICAvLyBvcmctd2lkZSwgYW5kIG9wcG9ydHVuaXR5IGxpbmVzIGFyZSBib3VuZGVkIGJ5IHRoYXQgcG9saWN5IGFuZCBub3RoaW5nXG4gICAgLy8gZWxzZSAodGhlIGd1YXJkIHRlc3QgcGlucyB0aGUgcXVvdGUgY2hhaW47IHRoZSBvcHBvcnR1bml0eSBzaWRlIGZvbGxvd3NcbiAgICAvLyBmcm9tIHRoZSBzYW1lIG1lYXN1cmVkIG1lY2hhbmlzbSkuIFVwc3RyZWFtIGdhcDpcbiAgICAvLyBvYmplY3RzdGFjay1haS9vYmplY3RzdGFjayM1Mzg2ICgjNjk0KS5cbiAgICBjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtOiB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBjcm1fcXVvdGVfbGluZV9pdGVtOiAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICAvLyBUaGUgcmVjb3JkIEF0dGFjaG1lbnRzIHBhbmVsLCBSRUFEIG9ubHk6IGNhbm9uaWNhbCBub3RlIG9uIGBlbmFibGUuZmlsZXNgXG4gICAgLy8gaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYCAoIzIwMjkpLiBXaGljaCBhdHRhY2htZW50cyBpdCBsaXN0c1xuICAgIC8vIGRlcml2ZXMgZnJvbSB0aGUgcGFyZW50IHJlY29yZDsgdXBsb2FkIGFuZCBkZWxldGUgd2FpdCB1cHN0cmVhbS5cbiAgICBzeXNfYXR0YWNobWVudDogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gVGhlIHJlY29yZCBEaXNjdXNzaW9uIHBhbmVsLCBjb21tZW50cyBhbmQgYWN0aXZpdHk6IGNhbm9uaWNhbCBub3RlIG9uXG4gICAgLy8gYGVuYWJsZS5mZWVkc2AgaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYCAoIzIwMjkpLiBXaGljaCB0aHJlYWRzIGl0XG4gICAgLy8gcmVhY2hlcyBkZXJpdmVzIGZyb20gdGhlIHBhcmVudCByZWNvcmQ7IGRlbGV0aW5nIGEgY29tbWVudCB3YWl0cyB1cHN0cmVhbS5cbiAgICBzeXNfY29tbWVudDogIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIHN5c19hY3Rpdml0eTogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gIH0sXG4gIGZpZWxkczoge1xuICAgIC8vIFNlbnNpdGl2ZSBmaWVsZHMgYSBtYW5hZ2VyIG11c3Qgc2VlIGluIGZ1bGwuIEF1dGhvcmVkIGV4cGxpY2l0bHkgcmF0aGVyXG4gICAgLy8gdGhhbiBsZWZ0IGFic2VudDogdGhlc2UgYXJlIHRoZSBmaWVsZHMgb3RoZXIgc2V0cyBtYXNrLCBhbmQgYW4gdW5hdXRob3JlZFxuICAgIC8vIGdyYW50IHJlYWRzIGFzIGFuIG92ZXJzaWdodCBpbnN0ZWFkIG9mIGEgZGVjaXNpb24gKCM0ODgpLlxuICAgICdjcm1fb3Bwb3J0dW5pdHkuYW1vdW50JzogICB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogdHJ1ZSB9LFxuICAgICdjcm1fYWNjb3VudC5oZWFsdGhfc2NvcmUnOiB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogdHJ1ZSB9LFxuICAgICdjcm1fcXVvdGUuaW50ZXJuYWxfbm90ZXMnOiB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogdHJ1ZSB9LFxuICAgIC8vIENhc2UgaW50ZXJuYWwgbm90ZXMgYXJlIHRoZSBzZXJ2aWNlIHRlYW0ncyB3b3JraW5nIG1lbW9yeTogYSBzYWxlc1xuICAgIC8vIG1hbmFnZXIgcmVhZHMgdGhlbSBmb3IgYWNjb3VudCBjb250ZXh0IGJ1dCBuZXZlciBlZGl0cyB0aGVtLlxuICAgICdjcm1fY2FzZS5pbnRlcm5hbF9ub3Rlcyc6ICB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2UgfSxcbiAgfSxcbiAgLy8gQURSLTAwNTg6IGBjcm1fb3Bwb3J0dW5pdHkuaXNfcHJpdmF0ZWAgaXMgc2V0dGFibGUgaW4gdGhlIG9wcG9ydHVuaXR5IGZvcm1cbiAgLy8gKGBvcHBvcnR1bml0eS52aWV3LnRzYCkgYW5kLCBiZWZvcmUgdGhpcyBydWxlLCB3YXMgcmVhZCBieSBub3RoaW5nIFx1MjAxNCBhXG4gIC8vIGNoZWNrYm94IHRoYXQgcHJvbWlzZWQgY29uZmlkZW50aWFsaXR5IGFuZCBkZWxpdmVyZWQgbm9uZS4gT3JnLXdpZGUgcmVhZGVyc1xuICAvLyBhcmUgZXhhY3RseSB3aG8gaXQgaGFzIHRvIGhvbGQgYmFjaywgc28gdGhlIHNldCB0aGF0IGdyYW50c1xuICAvLyBgdmlld0FsbFJlY29yZHNgIG9uIG9wcG9ydHVuaXRpZXMgYWxzbyBjYXJyaWVzIHRoZSByb3cgZmlsdGVyIHRoYXQgaG9ub3Vyc1xuICAvLyBpdC4gQ29tcGlsZXMgdG8gYHsgJG9yOiBbeyBpc19wcml2YXRlOiBmYWxzZSB9LCB7IG93bmVyX2lkOiA8Y2FsbGVyPiB9XSB9YC5cbiAgLy9cbiAgLy8gYG93bmVyX2lkYCwgbm90IHRoZSBhcHAtYXV0aG9yZWQgYG93bmVyYCBsb29rdXAgdGhpcyB1c2VkIHRvIG5hbWU6ICM1NDhcbiAgLy8gcmV0aXJlZCB0aGF0IGZpZWxkLiBUaGUgcHJlZGljYXRlIG5vdyBrZXlzIG9uIHRoZSBTQU1FIGNvbHVtbiB0aGUgT1dEIC9cbiAgLy8gc2hhcmluZyBvd25lci1tYXRjaCByZWFkcywgc28gXCJpdHMgb3duZXJcIiBtZWFucyBvbmUgdGhpbmcgYXBwLXdpZGUuXG4gIHJvd0xldmVsU2VjdXJpdHk6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnb3Bwb3J0dW5pdHlfcHJpdmF0ZV9vd25lcl9vbmx5JyxcbiAgICAgIC8vIEEgZGVhbCBmbGFnZ2VkIFByaXZhdGUgaXMgdmlzaWJsZSBvbmx5IHRvIGl0cyBvd25lciwgZXZlbiB0byBob2xkZXJzIG9mXG4gICAgICAvLyBvcmctd2lkZSBvcHBvcnR1bml0eSByZWFkLiAoYHJvd0xldmVsU2VjdXJpdHlbXS5sYWJlbGAgLyBgZGVzY3JpcHRpb25gXG4gICAgICAvLyBhcmUgZGlzcGxheSBjb3B5IFx1MjAxNCB0aGUgMTcuNy4wIGxpdmVuZXNzIGxlZGdlciBtYXJrcyBib3RoIGxpdmU6IHRoZVxuICAgICAgLy8gcGVybWlzc2lvbiBlZGl0b3IgZHJhd3MgdGhlbSBvbiB0aGUgcG9saWN5IGNhcmQuIFRoaXMgcG9saWN5IGF1dGhvcnNcbiAgICAgIC8vIG5laXRoZXIsIHNvIGl0cyBpbnRlbnQgbGl2ZXMgaW4gdGhpcyBjb21tZW50LilcbiAgICAgIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICBvcGVyYXRpb246ICdzZWxlY3QnIGFzIGNvbnN0LFxuICAgICAgdXNpbmc6ICdpc19wcml2YXRlID09IGZhbHNlIHx8IG93bmVyX2lkID09IGN1cnJlbnRfdXNlci5pZCcsXG4gICAgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlcy9zYWxlcy1yZXAucHJvZmlsZS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlcy9zYWxlcy1yZXAucHJvZmlsZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuZXhwb3J0IGNvbnN0IFNhbGVzUmVwUHJvZmlsZSA9IHtcbiAgbmFtZTogJ3NhbGVzX3JlcCcsXG4gIGxhYmVsOiAnU2FsZXMgUmVwcmVzZW50YXRpdmUnLFxuICAvLyBBIHJlcCdzIGJvb2sgb2YgYnVzaW5lc3MgaXMgcHJpdmF0ZSBieSBkZXNpZ24gKG93biByZWNvcmRzICsgd2hhdGV2ZXIgYVxuICAvLyBzaGFyaW5nIHJ1bGUgb3IgdGVhbSBncmFudCBleHRlbmRzKS4gVGhlIG9iamVjdHMgYmVsb3cgY2FycnkgYW4gZXhwbGljaXRcbiAgLy8gYHJlYWRTY29wZTogJ293bidgIHNvIHRoZSBpbnRlbnQgaXMgYXV0aG9yZWQsIG5vdCBpbmZlcnJlZCBcdTIwMTQgdGhpcyBib3RoXG4gIC8vIHNpbGVuY2VzIHRoZSBgc2VjdXJpdHktcHJpdmF0ZS1uby1yZWFkc2NvcGVgIGxpdmVuZXNzIHdhcm5pbmcgYW5kIHBpbnMgdGhlXG4gIC8vIGJlaGF2aW9yOiB3aXRob3V0IGl0LCBhIHByaXZhdGUtT1dEIG9iamVjdCB3aXRoIGFsbG93UmVhZCBidXQgbm8gc2NvcGUgaXNcbiAgLy8gYW4gdW5kZXItc3BlY2lmaWVkIGdyYW50IHRoZSBlbmdpbmUgcmVhZHMgYXMgXCJvd24gb25seVwiIGFueXdheS5cbiAgLy9cbiAgLy8gV2hhdCB3aWRlbnMgdGhhdCBzY29wZSB0b2RheSBpcyBuYXJyb3dlciB0aGFuIGl0IHNvdW5kczogdGhlIHRlcnJpdG9yeSAvXG4gIC8vIGFjY291bnQtdGVhbSBydWxlcyBhcmUgYXV0aG9yZWQgb24gYGNybV9hY2NvdW50YCBPTkxZLCBhbmQgYSBzaGFyaW5nIHJ1bGVcbiAgLy8gd2lkZW5zIHRoZSBvYmplY3QgaXQgbmFtZXMgXHUyMDE0IG5vdCB0aGUgcmVjb3JkcyBoYW5naW5nIG9mZiBpdC4gU28gYSByZXAgd2hvXG4gIC8vIHJlY2VpdmVzIGFuIGFjY291bnQgdGhyb3VnaCBhIHRlcnJpdG9yeSBydWxlIHJlYWRzIHRoYXQgYWNjb3VudCwgd2hpbGUgdGhlXG4gIC8vIHRhc2tzIG9uIGl0IHN0YXkgb3duLW9ubHkgYW5kIG9wcG9ydHVuaXRpZXMgd2lkZW4gb25seSB0aHJvdWdoIHRoZVxuICAvLyA+PSAkMTAwayBsZWFkZXJzaGlwIHJ1bGVzLiBRdW90ZXMgYW5kIGNvbnRyYWN0cyBhcmUgdGhlIGV4Y2VwdGlvbiBzaW5jZVxuICAvLyAjNTQ5IChydWxpbmcgMjAyNi0wOC0zMSk6IGJvdGggYXJlIGBjb250cm9sbGVkX2J5X3BhcmVudGAgdW5kZXIgdGhlXG4gIC8vIGFjY291bnQsIHNvIHRoZXkgYXJyaXZlIHdpdGggaXQgXHUyMDE0IHRoZSBzYW1lIGRlcml2YXRpb24gYXMgY29udGFjdHMuXG4gIC8vXG4gIC8vIFRoZSBgY29udHJvbGxlZF9ieV9wYXJlbnRgIGdyYW50cyBiZWxvdyByZWFkIGFzIG5hcnJvdywgYW5kIGFzIG9mXG4gIC8vIDE3LjAuMC1yYy40IHRoZXkgQVJFLiBNRUFTVVJFRCBhbmQgcGlubmVkIGJ5XG4gIC8vIGB0ZXN0L3BhcmVudC1kZXJpdmVkLXJlYWNoLnRlc3QudHNgOiB0aGUgQURSLTAwNTUgZGVyaXZhdGlvbiByZXNvbHZlcyBtYXN0ZXJcbiAgLy8gYWNjZXNzaWJpbGl0eSB0aHJvdWdoIHRoZSBzYW1lIHBhdGhzIGEgZGlyZWN0IHJlYWQgb2YgdGhlIG1hc3RlciB0YWtlcyBcdTIwMTRcbiAgLy8gb3duZXIgc2NvcGUgQU5EIGBzeXNfcmVjb3JkX3NoYXJlYCBncmFudHMsIG5vdCB0aGUgbWFzdGVyJ3Mgcm93LWxldmVsXG4gIC8vIHNlY3VyaXR5IHBvbGljaWVzIGFsb25lLiBBIHJlcCBob2xkaW5nIE9ORSBhY2NvdW50IHRocm91Z2ggYSB0ZXJyaXRvcnkgcnVsZVxuICAvLyByZWFkcyB0aGF0IGFjY291bnQncyBjb250YWN0cyBhbmQgbm8gb3RoZXJzLCBhbmQgcmVhZHMgbGluZSBpdGVtcyBvbmx5IHVuZGVyXG4gIC8vIHRoZSBxdW90ZXMgdGhleSBjYW4gcmVhY2guIFdyaXRlcyBkZXJpdmUgdGhlIHNhbWUgd2F5OiBhIGNoaWxkIG9mIGEgbWFzdGVyXG4gIC8vIHRoZSByZXAgY2Fubm90IGVkaXQgaXMgcmVmdXNlZC4gU28gZWFjaCBncmFudCBiZWxvdyBpcyBib3VuZGVkIGJ5IHRoZVxuICAvLyBwYXJlbnQncyBzaGFyaW5nLCB3aGljaCBpcyB3aGF0IGl0IGxvb2tzIGxpa2UuXG4gIC8vXG4gIC8vIFVudGlsIDE3LjAuMC1yYy4zIHRoZSBzYW1lIGdyYW50cyB3ZXJlIG9yZy13aWRlIHJlYWRzIGFuZCB0aGlzIG5vdGUgc2FpZCBzb1xuICAvLyAoIzY5NCk6IHRoZSBkZXJpdmF0aW9uIGNvbnN1bHRlZCBtYXN0ZXIgUkxTIHBvbGljaWVzIG9ubHksIGFuZCBIb3RDUk1cbiAgLy8gYXV0aG9ycyBub25lLCBzbyB0aGUgbWFzdGVyIHNldCB3YXMgZXZlcnkgcmVjb3JkLlxuICAvLyBvYmplY3RzdGFjay1haS9vYmplY3RzdGFjayM1Mzg2IGZpeGVkIHRoYXQgdXBzdHJlYW0gYW5kIGl0IHNoaXBwZWQgaW4gcmMuNC5cbiAgb2JqZWN0czoge1xuICAgIC8vIGBhbGxvd0V4cG9ydGAgd2hlcmUgYW4gZXhwb3J0IHN1cmZhY2UgZXhpc3RzIFx1MjAxNCBjYW5vbmljYWwgbm90ZSBpblxuICAgIC8vIGBzcmMvc2FsZXMvcHJvZmlsZXMvaW5kZXgudHNgLiBTYWZlIGFsb25nc2lkZSBgcmVhZFNjb3BlOiAnb3duJ2A6IGV4cG9ydCBpc1xuICAgIC8vIHJlYWQtZGVyaXZlZCwgc28gYSByZXAncyBDU1YgY2FycmllcyB0aGVpciBvd24gYm9vaywgbm90IHRoZSBvcmcncy5cbiAgICBjcm1fbGVhZDogICAgICAgIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UsIHJlYWRTY29wZTogJ293bicgYXMgY29uc3QsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX2FjY291bnQ6ICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCAgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLCByZWFkU2NvcGU6ICdvd24nIGFzIGNvbnN0LCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIC8vIE5PIHJlYWRTY29wZTogYGNybV9jb250YWN0YCBpcyBgY29udHJvbGxlZF9ieV9wYXJlbnRgIChtYXN0ZXItZGV0YWlsIHRvXG4gICAgLy8gY3JtX2FjY291bnQpLCBzbyBhIGByZWFkU2NvcGVgIGhlcmUgaXMgaW5lcnQgXHUyMDE0IHRoZSBzaGFyaW5nIHNlcnZpY2Ugb25seVxuICAgIC8vIGFwcGxpZXMgb3duZXIgc2NvcGUgdG8gYHByaXZhdGVgIG9iamVjdHMgXHUyMDE0IGFuZCBpdCByZWFkIGFzIGEgcHJvbWlzZSB0aGVcbiAgICAvLyBlbmdpbmUgbmV2ZXIga2VwdDogaXQgc2FpZCBcIm93biBjb250YWN0cyBvbmx5XCIgd2hpbGUgYWNjZXNzIGRlcml2ZWQgZnJvbVxuICAgIC8vIHRoZSBwYXJlbnQgKCM0ODgpLiBUaGF0IGRlcml2YXRpb24gbm93IGRlbGl2ZXJzIGV4YWN0bHkgXCJ0aGUgYWNjb3VudHMgdGhlXG4gICAgLy8gcmVwIGNhbiByZWFkXCI6IG1lYXN1cmVkIG9uIDE3LjAuMC1yYy40LCBhIHJlcCBob2xkaW5nIG9uZSB0ZXJyaXRvcnlcbiAgICAvLyBhY2NvdW50IHJlYWRzIFRIQVQgYWNjb3VudCdzIGNvbnRhY3RzIGFuZCBubyBvdGhlcnMgKHNlZSB0aGUgbm90ZSBhdCB0aGVcbiAgICAvLyB0b3Agb2YgdGhpcyBmaWxlLCAjNjk0KS5cbiAgICBjcm1fY29udGFjdDogICAgIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX29wcG9ydHVuaXR5OiB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCAgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLCByZWFkU2NvcGU6ICdvd24nIGFzIGNvbnN0LCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIC8vIE5PIHJlYWRTY29wZSBvbiBxdW90ZS9jb250cmFjdCBlaXRoZXI6IGJvdGggYXJlIGBjb250cm9sbGVkX2J5X3BhcmVudGBcbiAgICAvLyB1bmRlciBgY3JtX2FjY291bnRgICgjNTQ5KSwgc28gYSBzY29wZSBoZXJlIHdvdWxkIGJlIGluZXJ0LiBBIHJlcCByZWFkc1xuICAgIC8vIHRoZSBxdW90ZXMgYW5kIGNvbnRyYWN0cyBvZiBldmVyeSBhY2NvdW50IHRoZXkgY2FuIHJlYWNoLCBlZGl0cyB0aGVcbiAgICAvLyBxdW90ZXMgb2YgYWNjb3VudHMgdGhleSBjYW4gZWRpdCwgYW5kIG5ldmVyIGVkaXRzIGEgY29udHJhY3QgKG9iamVjdFxuICAgIC8vIGdhdGUpLiBgdGVzdC9wYXJlbnQtZGVyaXZlZC1yZWFjaC50ZXN0LnRzYCBtZWFzdXJlcyBib3RoIGxldmVscy5cbiAgICBjcm1fcXVvdGU6ICAgICAgIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBjcm1fY29udHJhY3Q6ICAgIHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBjcm1fcHJvZHVjdDogICAgIHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBjcm1fY2FtcGFpZ246ICAgIHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBjcm1fY2FzZTogICAgICAgIHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UsIHJlYWRTY29wZTogJ293bicgYXMgY29uc3QsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX3Rhc2s6ICAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCAgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IHRydWUsICB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLCByZWFkU2NvcGU6ICdvd24nIGFzIGNvbnN0IH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQWN0aXZpdHkgKCM1OTIpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vIGBjcm1fZXZlbnRgIGlzIGBwcml2YXRlYCBsaWtlIGBjcm1fdGFza2AgXHUyMDE0IGEgcGVyc29uYWwgYWN0aXZpdHkgcmVjb3JkIFx1MjAxNFxuICAgIC8vIHNvIGFuIGV4cGxpY2l0IHJlY29yZCBzY29wZSBpcyByZXF1aXJlZCBhbG9uZ3NpZGUgYWxsb3dSZWFkIChhbiBvbWl0dGVkXG4gICAgLy8gc2NvcGUgc2lsZW50bHkgbWVhbnMgXCJvd24gb25seVwiIGFuZCByZWFkcyBhcyBhbiB1bm1hZGUgZGVjaXNpb24pLlxuICAgIC8vIGBjcm1fZXZlbnRfYXR0ZW5kZWVgIGlzIGBjb250cm9sbGVkX2J5X3BhcmVudGAsIHNvIGF1dGhvcmluZyBhIHJlYWRTY29wZVxuICAgIC8vIGhlcmUgd291bGQgYmUgaW5lcnQgbWV0YWRhdGEgdGhlIGVuZ2luZSBuZXZlciBhcHBsaWVzLiBJdHMgcm93cyBuYXJyb3cgdG9cbiAgICAvLyB0aGUgZXZlbnRzIHRoZSByZXAgY2FuIHJlYWQgXHUyMDE0IHdoaWNoLCBgY3JtX2V2ZW50YCBiZWluZyBwcml2YXRlIGFuZFxuICAgIC8vIG93bi1zY29wZWQsIGlzIHRoZWlyIG93biBjYWxlbmRhciAoc2VlIHRoZSBub3RlIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLFxuICAgIC8vICM2OTQpLlxuICAgIGNybV9ldmVudDogICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiB0cnVlLCAgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSwgcmVhZFNjb3BlOiAnb3duJyBhcyBjb25zdCB9LFxuICAgIGNybV9ldmVudF9hdHRlbmRlZTogeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gUmVmZXJlbmNlIGNhdGFsb2cgKHB1YmxpY19yZWFkIE9XRCk6IHJlcHMgcmVhZCBrbm93bGVkZ2UgYXJ0aWNsZXMsIHdoaWNoXG4gICAgLy8gYXJlIGF1dGhvcmVkIGJ5IHNlcnZpY2UuXG4gICAgLy8gUmVhZHMgdGhlIEtCIGFuZCBtYXkgcmF0ZSBpdDsgY2Fubm90IGF1dGhvciBhcnRpY2xlcyAoIzYwMSkuXG4gICAgY3JtX2FydGljbGVfZmVlZGJhY2s6IHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gRm9yZWNhc3Qgc25hcHNob3RzIGFyZSB3cml0dGVuIGJ5IHRoZSBuaWdodGx5IGBmb3JlY2FzdC5ob29rYCBqb2IgYW5kIHRoZVxuICAgIC8vIGByZXZlbnVlX2ZvcmVjYXN0aW5nYCBza2lsbCwgbmV2ZXIgYnkgaGFuZCBcdTIwMTQgcmVhZC1vbmx5LCBhbmQgb25seSB0aGUgcmVwJ3NcbiAgICAvLyBvd24gc25hcHNob3RzIChwcml2YXRlIE9XRCArIGV4cGxpY2l0IG93biBzY29wZSwgYXMgYWJvdmUpLlxuICAgIGNybV9mb3JlY2FzdDogICAgICAgICAgeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLCByZWFkU2NvcGU6ICdvd24nIGFzIGNvbnN0IH0sXG4gICAgLy8gUHJvZHVjdCBsaW5lcyBvbiBkZWFscyBhbmQgcXVvdGVzLiBCb3RoIG9iamVjdHMgYXJlXG4gICAgLy8gYGNvbnRyb2xsZWRfYnlfcGFyZW50YCwgc28gdGhlcmUgaXMgbm8gcmVhZFNjb3BlIHRvIGF1dGhvciBcdTIwMTQgb25lIHdvdWxkIGJlXG4gICAgLy8gaW5lcnQgbWV0YWRhdGEuIFRoYXQgZGVyaXZhdGlvbiBzY29wZXMgYSByZXAgdG8gdGhlIGxpbmVzIHVuZGVyIHRoZSBkZWFsc1xuICAgIC8vIGFuZCBxdW90ZXMgdGhleSBjYW4gcmVhY2g6IG1lYXN1cmVkIG9uIDE3LjAuMC1yYy40LCBhIHJlcCByZWFkcyB0aGUgbGluZXNcbiAgICAvLyBvZiB0aGUgb25lIHF1b3RlIHRoZXkgb3duIGFuZCBub25lIG9mIHRoZSBvdGhlcnMgKHNlZSB0aGUgbm90ZSBhdCB0aGUgdG9wXG4gICAgLy8gb2YgdGhpcyBmaWxlLCAjNjk0KS4gV2l0aG91dCB0aGVzZSBncmFudHMgdGhlIG9wcG9ydHVuaXR5IFwiUHJvZHVjdHNcIlxuICAgIC8vIHJlbGF0ZWQgbGlzdCBhbmQgdGhlIHdob2xlIENQUSBwYXRoIHdlcmUgZGVuaWVkIGZvciBldmVyeSBub24tYWRtaW4gdXNlclxuICAgIC8vICgjNDg4KS5cbiAgICBjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtOiB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBjcm1fcXVvdGVfbGluZV9pdGVtOiAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICAvLyBXaGljaCBjYW1wYWlnbiBzb3VyY2VkIGEgbGVhZCBcdTIwMTQgcmVhZC1vbmx5IGNvbnRleHQsIGRlcml2ZWQgZnJvbSB0aGVcbiAgICAvLyBjYW1wYWlnbiAoY29udHJvbGxlZF9ieV9wYXJlbnQpLiBFbnJvbGxtZW50IGJlbG9uZ3MgdG8gbWFya2V0aW5nX3VzZXIuXG4gICAgY3JtX2NhbXBhaWduX21lbWJlcjogICAgICAgeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gVGhlIHJlY29yZCBBdHRhY2htZW50cyBwYW5lbCwgUkVBRCBvbmx5OiBjYW5vbmljYWwgbm90ZSBvbiBgZW5hYmxlLmZpbGVzYFxuICAgIC8vIGluIGBzcmMvc2FsZXMvb2JqZWN0cy9pbmRleC50c2AgKCMyMDI5KS4gV2hpY2ggYXR0YWNobWVudHMgaXQgbGlzdHNcbiAgICAvLyBkZXJpdmVzIGZyb20gdGhlIHBhcmVudCByZWNvcmQ7IHVwbG9hZCBhbmQgZGVsZXRlIHdhaXQgdXBzdHJlYW0uXG4gICAgc3lzX2F0dGFjaG1lbnQ6IHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogZmFsc2UsIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIC8vIFRoZSByZWNvcmQgRGlzY3Vzc2lvbiBwYW5lbCwgY29tbWVudHMgYW5kIGFjdGl2aXR5OiBjYW5vbmljYWwgbm90ZSBvblxuICAgIC8vIGBlbmFibGUuZmVlZHNgIGluIGBzcmMvc2FsZXMvb2JqZWN0cy9pbmRleC50c2AgKCMyMDI5KS4gV2hpY2ggdGhyZWFkcyBpdFxuICAgIC8vIHJlYWNoZXMgZGVyaXZlcyBmcm9tIHRoZSBwYXJlbnQgcmVjb3JkOyBkZWxldGluZyBhIGNvbW1lbnQgd2FpdHMgdXBzdHJlYW0uXG4gICAgc3lzX2NvbW1lbnQ6ICB7IGFsbG93Q3JlYXRlOiB0cnVlLCAgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICBzeXNfYWN0aXZpdHk6IHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogZmFsc2UsIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICB9LFxuICBmaWVsZHM6IHtcbiAgICAnY3JtX2FjY291bnQuYW5udWFsX3JldmVudWUnOiAgICAgeyByZWFkYWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlIH0sXG4gICAgJ2NybV9hY2NvdW50LmRlc2NyaXB0aW9uJzogICAgICAgIHsgcmVhZGFibGU6IHRydWUsIGVkaXRhYmxlOiB0cnVlIH0sXG4gICAgJ2NybV9vcHBvcnR1bml0eS5hbW91bnQnOiAgICAgICAgIHsgcmVhZGFibGU6IHRydWUsIGVkaXRhYmxlOiB0cnVlIH0sXG4gICAgJ2NybV9vcHBvcnR1bml0eS5wcm9iYWJpbGl0eSc6ICAgIHsgcmVhZGFibGU6IHRydWUsIGVkaXRhYmxlOiB0cnVlIH0sXG4gICAgLy8gSGVhbHRoIHNjb3JlIGRyaXZlcyB0aGUgcmVuZXdhbCBib29rIGFuZCB0aGUgYXQtcmlzayB2aWV3czogcmVwcyBzZWUgaXQsXG4gICAgLy8gdGhlIHJlbmV3YWwvQ1MgcHJvY2VzcyBzZXRzIGl0LiBSZWFkYWJsZSAodGhlIGBhdF9yaXNrX2FjY291bnRzYCB2aWV3XG4gICAgLy8gZmlsdGVycyBhbmQgc29ydHMgb24gaXQsIGFuZCBhIG1hc2tlZCBmaWVsZCBjYW5ub3QgYmUgZmlsdGVyZWQpIGJ1dCBuZXZlclxuICAgIC8vIHJlcC1lZGl0YWJsZSBcdTIwMTQgaXQgd2FzIHByZXZpb3VzbHkgdW5hdXRob3JlZCBvbiBldmVyeSBzZXQgKCM0ODgpLlxuICAgICdjcm1fYWNjb3VudC5oZWFsdGhfc2NvcmUnOiAgICAgICB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2UgfSxcbiAgICAvLyBRdW90ZSBpbnRlcm5hbCBub3RlcyBzdGF5IHJlcC1lZGl0YWJsZTogYHF1b3RlLmhvb2tgIGRlbGliZXJhdGVseSBrZWVwc1xuICAgIC8vIHRoZW0gd3JpdGFibGUgYWZ0ZXIgYSBxdW90ZSBpcyBzZW50LCB3aGVuIG5vdGhpbmcgZWxzZSBpcy5cbiAgICAnY3JtX3F1b3RlLmludGVybmFsX25vdGVzJzogICAgICAgeyByZWFkYWJsZTogdHJ1ZSwgZWRpdGFibGU6IHRydWUgfSxcbiAgICAvLyBDYXNlIGludGVybmFsIG5vdGVzIGFyZSB0aGUgc2VydmljZSB0ZWFtJ3MgcHJpdmF0ZSB3b3JraW5nIG5vdGVzLiBBIHJlcFxuICAgIC8vIHJlYWRzIHRoZSBjYXNlIChvd24gc2NvcGUpIGZvciBhY2NvdW50IGNvbnRleHQ7IHRoZSBhZ2VudC1vbmx5IGNvbW1lbnRhcnlcbiAgICAvLyBpbnNpZGUgaXQgaXMgbWFza2VkIFx1MjAxNCBubyB2aWV3IGZpbHRlcnMgb3Igc29ydHMgb24gdGhpcyBmaWVsZCwgc28gbWFza2luZ1xuICAgIC8vIGNvc3RzIG5vdGhpbmcgYnV0IHRoZSB2YWx1ZSBpdHNlbGYuXG4gICAgJ2NybV9jYXNlLmludGVybmFsX25vdGVzJzogICAgICAgIHsgcmVhZGFibGU6IGZhbHNlLCBlZGl0YWJsZTogZmFsc2UgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlcy9zZXJ2aWNlLWFnZW50LnByb2ZpbGUudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcHJvZmlsZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcHJvZmlsZXMvc2VydmljZS1hZ2VudC5wcm9maWxlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5leHBvcnQgY29uc3QgU2VydmljZUFnZW50UHJvZmlsZSA9IHtcbiAgbmFtZTogJ3NlcnZpY2VfYWdlbnQnLFxuICBsYWJlbDogJ1NlcnZpY2UgQWdlbnQnLFxuICBvYmplY3RzOiB7XG4gICAgLy8gUmVmZXJlbmNlIGNvbnRleHQgYW4gYWdlbnQgbmVlZHMgdG8gd29yayBBTlkgdGlja2V0IFx1MjAxNCBhIGN1c3RvbWVyJ3MgY2FzZXNcbiAgICAvLyBhcmUgbWVhbmluZ2xlc3Mgd2l0aG91dCBzZWVpbmcgdGhlIGFjY291bnQvY29udGFjdCBiZWhpbmQgdGhlbSwgc28gdGhlc2VcbiAgICAvLyBhcmUgb3JnLXZpc2libGUgcmVhZHMgKHZpZXdBbGxSZWNvcmRzOiB0cnVlKSwgTk9UIG93bi1vbmx5LiBUaGlzIHdhcyB0aGVcbiAgICAvLyBzZWN1cml0eS1wcml2YXRlLW5vLXJlYWRzY29wZSB3YXJuaW5nJ3MgcmVhbCBzaWduYWw6IGFsbG93UmVhZCBvbiBhXG4gICAgLy8gcHJpdmF0ZSBvYmplY3Qgd2l0aCBubyBzY29wZSBoYWQgc2lsZW50bHkgbG9ja2VkIGFnZW50cyBvdXQgb2YgZXZlcnlcbiAgICAvLyBhY2NvdW50IHRoZXkgZGlkbid0IHBlcnNvbmFsbHkgb3duLlxuICAgIC8vIGBhbGxvd0V4cG9ydGAgd2hlcmUgYW4gZXhwb3J0IHN1cmZhY2UgZXhpc3RzIFx1MjAxNCBjYW5vbmljYWwgbm90ZSBpblxuICAgIC8vIGBzcmMvc2FsZXMvcHJvZmlsZXMvaW5kZXgudHNgLiBgY3JtX29wcG9ydHVuaXR5YCBjYXJyaWVzIG5vIGV4cG9ydCBiaXQ6IHRoaXNcbiAgICAvLyBzZXQgaGFzIG5vIHJlYWQgb24gaXQgYXQgYWxsLCBhbmQgdGhlIGF4aXMgbmV2ZXIgd2lkZW5zIHJlYWQuXG4gICAgY3JtX2xlYWQ6ICAgICAgICB7IGFsbG93Q3JlYXRlOiBmYWxzZSwgYWxsb3dSZWFkOiB0cnVlLCAgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlLCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIGNybV9hY2NvdW50OiAgICAgeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogZmFsc2UsIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IHRydWUsICBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSwgYWxsb3dFeHBvcnQ6IHRydWUgfSxcbiAgICBjcm1fY29udGFjdDogICAgIHsgYWxsb3dDcmVhdGU6IGZhbHNlLCBhbGxvd1JlYWQ6IHRydWUsICBhbGxvd0VkaXQ6IHRydWUsICBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCAgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX29wcG9ydHVuaXR5OiB7IGFsbG93Q3JlYXRlOiBmYWxzZSwgYWxsb3dSZWFkOiBmYWxzZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gQ2FzZXMgKyB0YXNrczogYW4gYWdlbnQncyBvd24gcXVldWUgYnkgZGVmYXVsdCAocmVhZFNjb3BlOiAnb3duJykuXG4gICAgLy8gQ3Jvc3MtYWdlbnQgdmlzaWJpbGl0eSBleGlzdHMgZm9yIENBU0VTIG9ubHkgXHUyMDE0IHRoZSBlc2NhbGF0aW9uIHJ1bGVzIHdpZGVuXG4gICAgLy8gb3BlbiBjcml0aWNhbCBjYXNlcyB0byBzZXJ2aWNlX21hbmFnZXIgLyBzZXJ2aWNlX2RpcmVjdG9yLiBgY3JtX3Rhc2tgIGhhc1xuICAgIC8vIG5vIHNoYXJpbmcgcnVsZSBhdCBhbGwsIHNvIGFuIGFnZW50IHJlYWRpbmcgYW4gYWNjb3VudCBvcmctd2lkZSBzdGlsbFxuICAgIC8vIHNlZXMgb25seSB0aGVpciBvd24gdGFza3Mgb24gaXQgKCM1NDkpLlxuICAgIGNybV9jYXNlOiAgICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSwgcmVhZFNjb3BlOiAnb3duJyBhcyBjb25zdCwgYWxsb3dFeHBvcnQ6IHRydWUgfSxcbiAgICAvLyBgYWxsb3dUcmFuc2ZlcmAgb24gYGNybV90YXNrYCBPTkxZIFx1MjAxNCBjYW5vbmljYWwgbm90ZSBpblxuICAgIC8vIGBzcmMvc2FsZXMvcHJvZmlsZXMvaW5kZXgudHNgLiBOYXJyb3cgYW5kIGxvYWQtYmVhcmluZzogZXNjYWxhdGluZyBhIGNhc2UgZmlyZXNcbiAgICAvLyBgY2FzZV9zdGF0dXNfc2lkZV9lZmZlY3RzYCwgd2hpY2ggb3BlbnMgdGhlIGZvbGxvdy11cCB0YXNrIE9XTkVEIEJZIHRoZVxuICAgIC8vIGFjY291bnQgb3duZXIgKGBjYXNlLmhvb2sudHNgKS4gVGhhdCBpbnNlcnQgcnVucyBvbiBgY3R4LmFwaWAgd2l0aCB0aGVcbiAgICAvLyBhZ2VudCdzIG93biBjb250ZXh0LCBzbyBwbGFudGluZyBpdCB1bmRlciBhbm90aGVyIHVzZXIgaXMgYSB0cmFuc2ZlciBhbmRcbiAgICAvLyBpcyBkZW5pZWQgd2l0aG91dCB0aGlzIGJpdCBcdTIwMTQgdGhlIGNhc2UgdXBkYXRlIHdvdWxkIGZhaWwgd2l0aCBpdC4gVGhpcyBpc1xuICAgIC8vIFwiYXNzaWduIHdvcmsgdG8gYSBjb2xsZWFndWVcIiwgbm90IFwicmVhc3NpZ24gdGhlIHRpY2tldFwiOiB0aGUgYWdlbnQgaG9sZHNcbiAgICAvLyBubyB0cmFuc2ZlciBncmFudCBvbiBgY3JtX2Nhc2VgIG9yIGFueSBjdXN0b21lciByZWNvcmQuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgRXNjYWxhdGlvbiBET0VTIG5vdyBtb3ZlIGEgY2FzZSB0byB0aGUgYHNlcnZpY2VfbWFuYWdlcmAgcG9vbCAoIzEwNzApLFxuICAgIC8vIGFuZCBpdCBkb2VzIHNvIHdpdGggbm8gYGNybV9jYXNlYCBncmFudCBoZXJlIFx1MjAxNCBkZWxpYmVyYXRlbHkuIFRoYXRcbiAgICAvLyBoYW5kLW9mZiBydW5zIG9uIHRoZSBgYmVmb3JlVXBkYXRlYCBzZWFtLCB3aGljaCB0aGUgIzMwMDQgZ3VhcmQgY2Fubm90XG4gICAgLy8gc2VlIChtZWFzdXJlZCwgdGhyZWUgcmVhZGluZ3MsIGluIGBfY2FzZS1hc3NpZ25tZW50LnRzYCdzIGhlYWRlciBhbmRcbiAgICAvLyBwaW5uZWQgaW4gYHRlc3QvY2FzZS1hc3NpZ25tZW50LnRlc3QudHNgKSwgc28gdGhlIGNhc2UgbW92ZXMgYXMgcGFydCBvZlxuICAgIC8vIHRoZSBlc2NhbGF0aW9uIHdyaXRlIHRoZSBhdXRvbWF0aW9uIGlzIGFscmVhZHkgcGVyZm9ybWluZyByYXRoZXIgdGhhbiBhc1xuICAgIC8vIGFuIGFnZW50LWluaXRpYXRlZCB0cmFuc2Zlci4gRG9pbmcgaXQgdGhlIG90aGVyIHdheSBcdTIwMTQgYSBgY3R4LmFwaWAgd3JpdGVcbiAgICAvLyBmcm9tIGBhZnRlclVwZGF0ZWAgXHUyMDE0IFdPVUxEIG5lZWQgYGNybV9jYXNlLmFsbG93VHJhbnNmZXJgIGhlcmUsIHdoaWNoXG4gICAgLy8gd291bGQgbGV0IGFuIGFnZW50IHJlYXNzaWduIGFueSBjYXNlIHRoZXkgY2FuIGVkaXQuIFRoYXQgaXMgYVxuICAgIC8vIHBlcm1pc3Npb24tbW9kZWwgZGVjaXNpb24gYW5kIGlzIG5vdCBiZWluZyB0YWtlbiBhcyBhIHNpZGUgZWZmZWN0IG9mIGFcbiAgICAvLyBob29rOiB0aGlzIGxpbmUgc3RheXMgYGNybV90YXNrYCBvbmx5LlxuICAgIGNybV90YXNrOiAgICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiB0cnVlLCAgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSwgcmVhZFNjb3BlOiAnb3duJyBhcyBjb25zdCwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIC8vICM1OTIgXHUyMDE0IGBsb2dfY2FsbGAgLyBgbG9nX21lZXRpbmdgIGFyZSBzY29wZWQgdG8gYGNybV9jYXNlYCB0b28sIGFuZCBhblxuICAgIC8vIGFnZW50IHdobyBjYW5ub3QgSU5TRVJUIGEgYGNybV9ldmVudGAgZ2V0cyBhIGJ1dHRvbiB0aGF0IDQwM3MuIFNhbWVcbiAgICAvLyBvd24tc2NvcGVkIHNoYXBlIGFzIHRoZWlyIHRhc2tzLlxuICAgIGNybV9ldmVudDogICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiB0cnVlLCAgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSwgcmVhZFNjb3BlOiAnb3duJyBhcyBjb25zdCB9LFxuICAgIGNybV9ldmVudF9hdHRlbmRlZTogeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgY3JtX3Byb2R1Y3Q6ICAgICB7IGFsbG93Q3JlYXRlOiBmYWxzZSwgYWxsb3dSZWFkOiB0cnVlLCAgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gVGhlIGtub3dsZWRnZSBiYXNlIGlzIHRoaXMgdGVhbSdzIG93biBzdXJmYWNlOiBhZ2VudHMgZHJhZnQgYW5kIHJldmlzZVxuICAgIC8vIGFydGljbGVzIChkcmFmdCBcdTIxOTIgaW5fcmV2aWV3IFx1MjE5MiBwdWJsaXNoZWQgaXMgZW5mb3JjZWQgYnkgdGhlIEtCIGZsb3csIG5vdCBieVxuICAgIC8vIENSVUQpLCBhbmQgcmVhZCBldmVyeSBwdWJsaXNoZWQgYXJ0aWNsZSByZWdhcmRsZXNzIG9mIGF1dGhvci4gQXJjaGl2aW5nXG4gICAgLy8gaXMgZGVzdHJ1Y3RpdmUtYnktcG9saWN5LCBzbyBkZWxldGlvbiBzdGF5cyB3aXRoIGFkbWlucy4gQmVmb3JlICM0ODggdGhlXG4gICAgLy8gb2JqZWN0IGhhZCBubyBncmFudCBhdCBhbGwgXHUyMDE0IHRoZSBcIktub3dsZWRnZVwiIG5hdiBpdGVtIHdhcyBkZW5pZWQgZm9yXG4gICAgLy8gZXZlcnlvbmUsIGluY2x1ZGluZyB0aGUgYWdlbnRzIGl0IHdhcyBidWlsdCBmb3IuXG4gICAgLy8gQWdlbnRzIHJhdGUgdGhlIGFydGljbGVzIHRoZXkgdXNlIHRvIGNsb3NlIGNhc2VzICgjNjAxKS4gQ3JlYXRlICsgZWRpdFxuICAgIC8vIHRoZWlyIE9XTiByb3cgKGBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZWAga2VlcHMgdGhlbSBvZmYgZXZlcnlvbmUgZWxzZSdzXG4gICAgLy8gdm90ZSk7IG5vIGRlbGV0ZSBcdTIwMTQgYSB3aXRoZHJhd24gb3BpbmlvbiBpcyBhIGNoYW5nZWQgdmVyZGljdCwgbm90IGFuXG4gICAgLy8gZXJhc2VkIG9uZS5cbiAgICBjcm1fYXJ0aWNsZV9mZWVkYmFjazogeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IHRydWUsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgY3JtX2tub3dsZWRnZV9hcnRpY2xlOiB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICAvLyBUaGUgcmVjb3JkIEF0dGFjaG1lbnRzIHBhbmVsLCBSRUFEIG9ubHk6IGNhbm9uaWNhbCBub3RlIG9uIGBlbmFibGUuZmlsZXNgXG4gICAgLy8gaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYCAoIzIwMjkpLiBXaGljaCBhdHRhY2htZW50cyBpdCBsaXN0c1xuICAgIC8vIGRlcml2ZXMgZnJvbSB0aGUgcGFyZW50IHJlY29yZDsgdXBsb2FkIGFuZCBkZWxldGUgd2FpdCB1cHN0cmVhbS5cbiAgICBzeXNfYXR0YWNobWVudDogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgLy8gVGhlIHJlY29yZCBEaXNjdXNzaW9uIHBhbmVsLCBjb21tZW50cyBhbmQgYWN0aXZpdHk6IGNhbm9uaWNhbCBub3RlIG9uXG4gICAgLy8gYGVuYWJsZS5mZWVkc2AgaW4gYHNyYy9zYWxlcy9vYmplY3RzL2luZGV4LnRzYCAoIzIwMjkpLiBXaGljaCB0aHJlYWRzIGl0XG4gICAgLy8gcmVhY2hlcyBkZXJpdmVzIGZyb20gdGhlIHBhcmVudCByZWNvcmQ7IGRlbGV0aW5nIGEgY29tbWVudCB3YWl0cyB1cHN0cmVhbS5cbiAgICBzeXNfY29tbWVudDogIHsgYWxsb3dDcmVhdGU6IHRydWUsICBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgIGFsbG93RGVsZXRlOiBmYWxzZSwgdmlld0FsbFJlY29yZHM6IGZhbHNlLCBtb2RpZnlBbGxSZWNvcmRzOiBmYWxzZSB9LFxuICAgIHN5c19hY3Rpdml0eTogeyBhbGxvd0NyZWF0ZTogZmFsc2UsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiBmYWxzZSwgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gIH0sXG4gIGZpZWxkczoge1xuICAgICdjcm1fY2FzZS5pc19zbGFfdmlvbGF0ZWQnOiAgICAgICAgeyByZWFkYWJsZTogdHJ1ZSwgZWRpdGFibGU6IGZhbHNlIH0sXG4gICAgJ2NybV9jYXNlLnJlc29sdXRpb25fdGltZV9ob3Vycyc6ICB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2UgfSxcbiAgICAvLyBJbnRlcm5hbCBub3RlcyBhcmUgdGhlIGFnZW50J3Mgd29ya2luZyBtZW1vcnkgb24gYSB0aWNrZXQgXHUyMDE0IGZ1bGwgYWNjZXNzXG4gICAgLy8gaGVyZSwgcmVhZC1vbmx5IGZvciBzYWxlc19tYW5hZ2VyLCBtYXNrZWQgZm9yIHNhbGVzX3JlcCAoIzQ4OCkuXG4gICAgJ2NybV9jYXNlLmludGVybmFsX25vdGVzJzogICAgICAgICB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogdHJ1ZSB9LFxuICAgIC8vIEFjY291bnQgaGVhbHRoIGlzIHJlbmV3YWwtdGVhbSBkYXRhIGFuIGFnZW50IHJlYWRzIGZvciBjb250ZXh0IG9ubHkuXG4gICAgJ2NybV9hY2NvdW50LmhlYWx0aF9zY29yZSc6ICAgICAgICB7IHJlYWRhYmxlOiB0cnVlLCBlZGl0YWJsZTogZmFsc2UgfSxcbiAgfSxcbn07XG5cbi8qKlxuICogVGhlIFNFUlZJQ0UgTUFOQUdFUiBiaW5kaW5nICgjMTc3OSkgXHUyMDE0IHRoZSBzYW1lIHNldCwgdW5kZXIgdGhlIHBvc2l0aW9uJ3MgbmFtZS5cbiAqXG4gKiAjIyMgV2hhdCB3YXMgcnVsZWRcbiAqXG4gKiBgc2VydmljZV9tYW5hZ2VyYCBpcyBhIGRlY2xhcmVkIHBvc2l0aW9uIChgc3JjL3NhbGVzL3NoYXJpbmcvcG9zaXRpb25zLnRzYCkgdGhhdFxuICogYGNhc2VfZXNjYWxhdGlvbl9zaGFyaW5nYCBuYW1lcyBhbmQgdGhhdCBgY2FzZV9lc2NhbGF0aW9uX3JlYXNzaWduYCByb3V0ZXNcbiAqIGVzY2FsYXRpbmcgY2FzZXMgdG8gXHUyMDE0IG1lYXN1cmVkLCAzNSBvZiB0aGVtIG9uIGEgZGVtbyBib3ggXHUyMDE0IGFuZCBubyBwZXJtaXNzaW9uXG4gKiBzZXQgcmVhY2hlZCBpdCwgc28gdGhlIHBlcnNvbmEgd2FzIGRlbmllZCBldmVyeSBDUk0gb2JqZWN0ICg0MDMpLiBEaXJlY3RvclxuICogc2VhdCwgZGVjaXNpb24gYmF0Y2ggIzkyLCAyMDI2LTA5LTA4LCB1bmRlciB0aGUgbWFpbnRhaW5lcidzIHN0YW5kaW5nXG4gKiBcdTMwMENcdTdFRTdcdTdFRURcdTUxQjNcdTdCNTZcdTMwMEQgZGVsZWdhdGlvbjogYmluZCB0aGUgRVhJU1RJTkcgYHNlcnZpY2VfYWdlbnRgIHNldCB0byB0aGVcbiAqIGBzZXJ2aWNlX21hbmFnZXJgIHBvc2l0aW9uLiBcdTI2RDQgQiAoYXV0aG9yIGEgbWFuYWdlci1zcGVjaWZpYyBwcm9maWxlKSB3YXNcbiAqIHJlZnVzZWQgXHUyMDE0IG5vIG1lYXN1cmVkIHB1bGxlciBmb3IgYSBtYW5hZ2VyLW9ubHkgZ3JhbnQuIFx1MjZENCBDIChyZXJvdXRlIHRoZVxuICogZXNjYWxhdGlvbiBwb29sKSB3YXMgcmVmdXNlZCBcdTIwMTQgaXQgZGVsZXRlcyB0aGUgcGVyc29uYSdzIHJlYXNvbiB0byBleGlzdC5cbiAqXG4gKiAjIyMgV2h5IHRoZSBiaW5kaW5nIGlzIGEgTkFNRSBhbmQgbm90IGEga2V5IFx1MjAxNCBtZWFzdXJlZCwgbm90IGluZmVycmVkXG4gKlxuICogVGhlcmUgaXMgbm8gYXV0aG9yYWJsZSBiaW5kaW5nIG9uIGVpdGhlciBzaWRlLiBgUGVybWlzc2lvblNldFNjaGVtYWAgcmVqZWN0c1xuICogYHByb2ZpbGVzYCAvIGByb2xlc2AgLyBgdXNlcnNgLCBhbmQgYFBvc2l0aW9uU2NoZW1hYCByZWplY3RzIGBwZXJtaXNzaW9uU2V0c2BcbiAqIHdpdGggaXRzIG93biBwcmVzY3JpcHRpb246IGNhcGFiaWxpdHkgcmVhY2hlcyBhIHBvc2l0aW9uIE9OTFkgdGhyb3VnaFxuICogYHN5c19wb3NpdGlvbl9wZXJtaXNzaW9uX3NldGAgcm93cywgXCJjcmVhdGVkIGluIFNldHVwIG9yIGJ5IGFuIGFwcCdzXG4gKiBga2VybmVsOnJlYWR5YCBiaW5kZXJcIiBcdTIwMTQgYW5kIGEgcHVyZS1tZXRhZGF0YSBhcHAgc2hpcHMgbmVpdGhlci5cbiAqXG4gKiBXaGF0IGl0IHNoaXBzIGluc3RlYWQgaXMgYSBuYW1lLiBNZWFzdXJlZCBvbiBhIGZyZXNoIDE3LjMuMCBTUUxpdGUgYm94OlxuICogYHN5c19wb3NpdGlvbl9wZXJtaXNzaW9uX3NldGAgaG9sZHMgZXhhY3RseSBPTkUgcm93IChgZXZlcnlvbmVgIFx1MjE5MlxuICogYG1lbWJlcl9kZWZhdWx0YCwgdGhlIEFEUi0wMDkwIEQ1IGJhc2VsaW5lIHRoZSBwbGF0Zm9ybSBiaW5kcyBpdHNlbGYpLCBhbmRcbiAqIHlldCBgUE9TVCAvYXBpL3YxL3NlY3VyaXR5L2V4cGxhaW5gIGZvciBhIGBzZXJ2aWNlX2FnZW50YCBwb3NpdGlvbiBob2xkZXJcbiAqIGFuc3dlcnMgYHBlcm1pc3Npb25TZXRzOiBbc2VydmljZV9hZ2VudCwgbWVtYmVyX2RlZmF1bHRdYCwgY3JlZGl0aW5nIHRoZVxuICogb2JqZWN0LWxldmVsIGdyYW50IHRvIGBbc2VydmljZV9hZ2VudF1gIGB2aWE6IHBvc2l0aW9uOnNlcnZpY2VfYWdlbnRgLiBUaGVcbiAqIHJlc29sdmVyIGlzIGByZXNvbHZlUGVybWlzc2lvblNldHMoKWAgaW4gYEBvYmplY3RzdGFjay9wbHVnaW4tc2VjdXJpdHlgOiBpdFxuICogbWF0Y2hlcyB0aGUgY2FsbGVyJ3MgUE9TSVRJT04gTkFNRVMgYWdhaW5zdCBkZWNsYXJlZCBgUGVybWlzc2lvblNldC5uYW1lYCxcbiAqIHNvIGEgc2V0IG5hbWVkIGZvciBhIHBvc2l0aW9uIGlzIGJvdW5kIHRvIGl0IHdpdGggbm8gcm93IGF0IGFsbC5cbiAqXG4gKiBcdTIxRDIgRm9yIHRoaXMgYXBwLCBcImJpbmQgc2V0IFggdG8gcG9zaXRpb24gUFwiIGhhcyBleGFjdGx5IG9uZSBzcGVsbGluZzogZGVjbGFyZVxuICogWCdzIGdyYW50cyB1bmRlciB0aGUgbmFtZSBQLiBIZW5jZSB0aGlzIGV4cG9ydCByYXRoZXIgdGhhbiBhIG5ldyBmaWxlLlxuICpcbiAqICMjIyBXaHkgYSBzcHJlYWQgYW5kIG5vdCBhIGNvcHlcbiAqXG4gKiBgb2JqZWN0c2AgYW5kIGBmaWVsZHNgIGFyZSBjYXJyaWVkIGJ5IFJFRkVSRU5DRSwgc28gdGhlIHR3byBwZXJzb25hcyBzaGFyZVxuICogb25lIGdyYW50IHRhYmxlIGFuZCBjYW5ub3QgZHJpZnQ6IG5vdGhpbmcgaGVyZSBjYW4gd2lkZW4gdGhlIGFnZW50J3MgZ3JhbnRzLFxuICogYW5kIGEgZnV0dXJlIGVkaXQgdG8gdGhlbSBsYW5kcyBvbiBib3RoIGF0IG9uY2UuIFRoYXQgaXMgdGhlIHJ1bGluZydzIG93blxuICogZmluZGluZyBcdTIwMTQgZXNjYWxhdGlvbiBoYW5kbGluZyBpcyB0aGUgc2FtZSBvYmplY3QgYWNjZXNzIGFzIHdvcmtpbmcgYSB0aWNrZXQgXHUyMDE0XG4gKiBleHByZXNzZWQgaW4gYSB3YXkgdGhlIG5leHQgcmVhZGVyIGNhbm5vdCBoYWxmLWFwcGx5LiBcdTI2RDQgRG8gbm90IGV4cGFuZCB0aGlzXG4gKiBpbnRvIGEgbGl0ZXJhbCBzZWNvbmQgZ3JhbnQgdGFibGUgdG8gXCJtYWtlIGl0IGV4cGxpY2l0XCI7IHRoYXQgd291bGQgYmVcbiAqIG9wdGlvbiBCLCByZWZ1c2VkLCBhbmQgaXQgd291bGQgbGV0IHRoZSB0d28gc2lsZW50bHkgZGl2ZXJnZS5cbiAqXG4gKiAjIyMgUmV2ZXJzYWwgKHJ1bGluZyBpdGVtIDQpXG4gKlxuICogSWYgYSBjdXN0b21lciBuZWVkcyBhIG1hbmFnZXIgZ3JhbnQgdGhhdCBESUZGRVJTIGZyb20gYW4gYWdlbnQncywgaXQgY29tZXNcbiAqIGJhY2sgYXMgYSBwcm9kdWN0IGNhcmQgd2l0aCB0aGUgcHVsbGVyIG5hbWVkIFx1MjAxNCBhbmQgb25seSB0aGVuIGRvZXMgdGhpcyBiZWNvbWVcbiAqIGFuIGF1dGhvcmVkIHNldCBvZiBpdHMgb3duLlxuICovXG5leHBvcnQgY29uc3QgU2VydmljZU1hbmFnZXJQcm9maWxlID0ge1xuICAuLi5TZXJ2aWNlQWdlbnRQcm9maWxlLFxuICBuYW1lOiAnc2VydmljZV9tYW5hZ2VyJyxcbiAgbGFiZWw6ICdTZXJ2aWNlIE1hbmFnZXInLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzL3N5c3RlbS1hZG1pbi5wcm9maWxlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3Byb2ZpbGVzL3N5c3RlbS1hZG1pbi5wcm9maWxlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFN5c3RlbSBBZG1pbmlzdHJhdG9yIFByb2ZpbGVcbiAqXG4gKiBUaGUgYWRtaW4gc2V0IG11c3QgY292ZXIgRVZFUlkgYnVzaW5lc3Mgb2JqZWN0IHRoaXMgYXBwIHNoaXBzLiBQZXJtaXNzaW9uXG4gKiBzZXRzIGFyZSBleHBsaWNpdC1hbGxvdyBvbmx5IChzZWUgYGd1ZXN0LXBvcnRhbC5wcm9maWxlLnRzYCksIHNvIGFuIG9iamVjdFxuICogbWlzc2luZyBmcm9tIHRoaXMgbWFwIGlzIHBlcm1pc3Npb24tZGVuaWVkIGZvciBhZG1pbnMgdG9vOiB0aGUgb2JqZWN0LWxldmVsXG4gKiBDUlVEIGdhdGUgcmVqZWN0cyB0aGUgY2FsbCBiZWZvcmUgT1dELCBzaGFyaW5nIG9yIGB2aWV3X2FsbF9kYXRhYCBpcyBldmVyXG4gKiBjb25zdWx0ZWQuIGB0ZXN0L2F1dGhvcml6YXRpb24tY292ZXJhZ2UudGVzdC50c2AgcGlucyB0aGF0IGNvdmVyYWdlIHNvIGEgbmV3XG4gKiBvYmplY3QgY2Fubm90IHNoaXAgd2l0aG91dCBsYW5kaW5nIGhlcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBTeXN0ZW1BZG1pblByb2ZpbGUgPSB7XG4gIG5hbWU6ICdzeXN0ZW1fYWRtaW4nLFxuICBsYWJlbDogJ1N5c3RlbSBBZG1pbmlzdHJhdG9yJyxcbiAgb2JqZWN0czoge1xuICAgIC8vIGBhbGxvd1RyYW5zZmVyYCBvbiBldmVyeSBvYmplY3QgXHUyMDE0IGNhbm9uaWNhbCBub3RlIGluIGBzcmMvc2FsZXMvcHJvZmlsZXMvaW5kZXgudHNgLlxuICAgIC8vIFRoZSBhZG1pbiBpcyB0aGUgcGVyc29uYSB0aGF0IHJlYXNzaWducyBvd25lcnNoaXAgd2hlbiBzb21lb25lIGxlYXZlcy5cbiAgICAvLyBgYWxsb3dFeHBvcnRgIG9uIHRoZSBmaXZlIG9iamVjdHMgd2l0aCBhbiBleHBvcnQgc3VyZmFjZSBcdTIwMTQgc2VlIHRoZVxuICAgIC8vIGNhbm9uaWNhbCBub3RlIGluIGBzcmMvc2FsZXMvcHJvZmlsZXMvaW5kZXgudHNgLiBJdCBpcyBhdXRob3JlZCBldmVuIGhlcmU6XG4gICAgLy8gMTcuMCBnYXRlcyBleHBvcnQgb24gdGhlIGV4cGxpY2l0IGJpdCwgYW5kIGBtb2RpZnlBbGxSZWNvcmRzYCBkb2VzIG5vdFxuICAgIC8vIHN0YW5kIGluIGZvciBpdCwgc28gd2l0aG91dCB0aGVzZSBhbiBhZG1pbiBjYW5ub3QgZXhwb3J0IGVpdGhlci5cbiAgICBjcm1fbGVhZDogICAgICAgIHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogdHJ1ZSwgdmlld0FsbFJlY29yZHM6IHRydWUsIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX2FjY291bnQ6ICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlLCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIGNybV9jb250YWN0OiAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSwgYWxsb3dFeHBvcnQ6IHRydWUgfSxcbiAgICBjcm1fb3Bwb3J0dW5pdHk6IHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogdHJ1ZSwgdmlld0FsbFJlY29yZHM6IHRydWUsIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUsIGFsbG93RXhwb3J0OiB0cnVlIH0sXG4gICAgY3JtX3F1b3RlOiAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlIH0sXG4gICAgY3JtX2NvbnRyYWN0OiAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlIH0sXG4gICAgY3JtX3Byb2R1Y3Q6ICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlIH0sXG4gICAgY3JtX2NhbXBhaWduOiAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlIH0sXG4gICAgY3JtX2Nhc2U6ICAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlLCBhbGxvd0V4cG9ydDogdHJ1ZSB9LFxuICAgIGNybV90YXNrOiAgICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIGNybV9ldmVudDogICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIGNybV9ldmVudF9hdHRlbmRlZTogeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIC8vIFRoZSBvYmplY3RzIGJlbG93IHNoaXBwZWQgd2l0aCBuYXZpZ2F0aW9uLCB2aWV3cywgaG9va3MgYW5kIHNlZWQgZGF0YVxuICAgIC8vIGJ1dCBubyBncmFudCBpbiBBTlkgcGVybWlzc2lvbiBzZXQgKCM0ODgpOiBcIktub3dsZWRnZVwiIGFuZCBcIkZvcmVjYXN0c1wiXG4gICAgLy8gd2VyZSBwZXJtaXNzaW9uLWRlbmllZCBuYXYgaXRlbXMgZm9yIGV2ZXJ5IHVzZXIsIGFkbWlucyBpbmNsdWRlZC5cbiAgICBjcm1fZm9yZWNhc3Q6ICAgICAgICAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlIH0sXG4gICAgY3JtX2FydGljbGVfZmVlZGJhY2s6ICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogICAgIHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogdHJ1ZSwgdmlld0FsbFJlY29yZHM6IHRydWUsIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUgfSxcbiAgICAvLyBEZXRhaWwgcm93cy4gVGhlaXIgUkVDT1JELWxldmVsIGFjY2VzcyBkZXJpdmVzIGZyb20gdGhlIG1hc3RlclxuICAgIC8vIChBRFItMDA1NSBgY29udHJvbGxlZF9ieV9wYXJlbnRgKSwgYnV0IG9iamVjdC1sZXZlbCBDUlVEIGlzIGEgc2VwYXJhdGVcbiAgICAvLyBnYXRlIHRoYXQgaXMgbmV2ZXIgZGVyaXZlZCBcdTIwMTQgaXQgaGFzIHRvIGJlIGdyYW50ZWQgZXhwbGljaXRseSBoZXJlLlxuICAgIGNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW06IHsgYWxsb3dDcmVhdGU6IHRydWUsIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCBhbGxvd0RlbGV0ZTogdHJ1ZSwgdmlld0FsbFJlY29yZHM6IHRydWUsIG1vZGlmeUFsbFJlY29yZHM6IHRydWUsIGFsbG93VHJhbnNmZXI6IHRydWUgfSxcbiAgICBjcm1fcXVvdGVfbGluZV9pdGVtOiAgICAgICB7IGFsbG93Q3JlYXRlOiB0cnVlLCBhbGxvd1JlYWQ6IHRydWUsIGFsbG93RWRpdDogdHJ1ZSwgYWxsb3dEZWxldGU6IHRydWUsIHZpZXdBbGxSZWNvcmRzOiB0cnVlLCBtb2RpZnlBbGxSZWNvcmRzOiB0cnVlLCBhbGxvd1RyYW5zZmVyOiB0cnVlIH0sXG4gICAgY3JtX2NhbXBhaWduX21lbWJlcjogICAgICAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IHRydWUsIGFsbG93RGVsZXRlOiB0cnVlLCB2aWV3QWxsUmVjb3JkczogdHJ1ZSwgbW9kaWZ5QWxsUmVjb3JkczogdHJ1ZSwgYWxsb3dUcmFuc2ZlcjogdHJ1ZSB9LFxuICAgIC8vIFRoZSByZWNvcmQgQXR0YWNobWVudHMgcGFuZWwsIFJFQUQgb25seTogY2Fub25pY2FsIG5vdGUgb24gYGVuYWJsZS5maWxlc2BcbiAgICAvLyBpbiBgc3JjL3NhbGVzL29iamVjdHMvaW5kZXgudHNgICgjMjAyOSkuIFdoaWNoIGF0dGFjaG1lbnRzIGl0IGxpc3RzXG4gICAgLy8gZGVyaXZlcyBmcm9tIHRoZSBwYXJlbnQgcmVjb3JkOyB1cGxvYWQgYW5kIGRlbGV0ZSB3YWl0IHVwc3RyZWFtLlxuICAgIHN5c19hdHRhY2htZW50OiB7IGFsbG93Q3JlYXRlOiBmYWxzZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgICAvLyBUaGUgcmVjb3JkIERpc2N1c3Npb24gcGFuZWwsIGNvbW1lbnRzIGFuZCBhY3Rpdml0eTogY2Fub25pY2FsIG5vdGUgb25cbiAgICAvLyBgZW5hYmxlLmZlZWRzYCBpbiBgc3JjL3NhbGVzL29iamVjdHMvaW5kZXgudHNgICgjMjAyOSkuIFdoaWNoIHRocmVhZHMgaXRcbiAgICAvLyByZWFjaGVzIGRlcml2ZXMgZnJvbSB0aGUgcGFyZW50IHJlY29yZDsgZGVsZXRpbmcgYSBjb21tZW50IHdhaXRzIHVwc3RyZWFtLlxuICAgIHN5c19jb21tZW50OiAgeyBhbGxvd0NyZWF0ZTogdHJ1ZSwgIGFsbG93UmVhZDogdHJ1ZSwgYWxsb3dFZGl0OiB0cnVlLCAgYWxsb3dEZWxldGU6IGZhbHNlLCB2aWV3QWxsUmVjb3JkczogZmFsc2UsIG1vZGlmeUFsbFJlY29yZHM6IGZhbHNlIH0sXG4gICAgc3lzX2FjdGl2aXR5OiB7IGFsbG93Q3JlYXRlOiBmYWxzZSwgYWxsb3dSZWFkOiB0cnVlLCBhbGxvd0VkaXQ6IGZhbHNlLCBhbGxvd0RlbGV0ZTogZmFsc2UsIHZpZXdBbGxSZWNvcmRzOiBmYWxzZSwgbW9kaWZ5QWxsUmVjb3JkczogZmFsc2UgfSxcbiAgfSxcbiAgc3lzdGVtUGVybWlzc2lvbnM6IFtcbiAgICAndmlld19zZXR1cCcsICdtYW5hZ2VfdXNlcnMnLCAnY3VzdG9taXplX2FwcGxpY2F0aW9uJyxcbiAgICAndmlld19hbGxfZGF0YScsICdtb2RpZnlfYWxsX2RhdGEnLCAnbWFuYWdlX3Byb2ZpbGVzJyxcbiAgICAnbWFuYWdlX3JvbGVzJywgJ21hbmFnZV9zaGFyaW5nJyxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBUcmFuc2xhdGlvbiBEZWZpbml0aW9ucyBCYXJyZWxcbiAqL1xuXG5leHBvcnQgeyBDcm1UcmFuc2xhdGlvbnMgfSBmcm9tICcuL2NybS50cmFuc2xhdGlvbic7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vYXBwLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lblwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vYXBwLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbi8qKlxuICogRW5nbGlzaCAoZW4pIFx1MjAxNCBldmVyeSB0cmFuc2xhdGlvbiBuYW1lc3BhY2UgRVhDRVBUIGBvYmplY3RzYDpcbiAqIGBhcHBzYCwgYG1lc3NhZ2VzYCwgYGRhc2hib2FyZHNgLCBgcGFnZXNgLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICogRXZlcnl0aGluZyB0aGF0IGlzIG5vdCBgb2JqZWN0c2AgbGl2ZXMgaW4gYC4vYXBwLnRzYDsgYG9iamVjdHNgIFx1MjAxNCA2OS03OCUgb2ZcbiAqIGV2ZXJ5IGJ1bmRsZSBcdTIwMTQgaXMgb25lIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5LCBhbmQgYSBkZXRhaWwgb2JqZWN0XG4gKiBmb2xsb3dzIGl0cyBtYXN0ZXIuIEEgbmV3IHJvdyBnb2VzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LCBuZXZlciBpblxuICogd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuOiB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0IHRoZSA3MCVcbiAqIGFkdmlzb3J5IGJhbmQgYHBucG0gaHlnaWVuZWAgcHJpbnRzLiBGdWxsIHJ1bGUgYW5kIHJhdGlvbmFsZTpcbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuLnRzYC5cbiAqXG4gKiBBIG5hbWVzcGFjZSBgVHJhbnNsYXRpb25EYXRhYCBnYWlucyBsYXRlciBsYW5kcyBoZXJlIHRvbywgYW5kIHRoZSByb29tIGlzXG4gKiBtZWFzdXJlZDogdGhpcyBmaWxlIGlzIHRoZSBzbWFsbGVyIGhhbGYgb2YgdGhlIGJ1bmRsZSwgYW5kIHRoZSBzY2hlbWEgYm91bmRzXG4gKiBob3cgbWFueSBuYW1lc3BhY2VzIGNhbiBldmVyIGFycml2ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGFwcFN1cmZhY2U6IE9taXQ8VHJhbnNsYXRpb25EYXRhLCAnb2JqZWN0cyc+ID0ge1xuICBhcHBzOiB7XG4gICAgY3JtX2VudGVycHJpc2U6IHtcbiAgICAgIGxhYmVsOiAnSG90Q1JNJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ3VzdG9tZXIgcmVsYXRpb25zaGlwIG1hbmFnZW1lbnQgZm9yIHNhbGVzLCBzZXJ2aWNlLCBhbmQgbWFya2V0aW5nJyxcbiAgICAgIG5hdmlnYXRpb246IHtcbiAgICAgICAgZ3JvdXBfYWN0aXZpdHk6IHsgbGFiZWw6ICdBY3Rpdml0eScgfSxcbiAgICAgICAgZ3JvdXBfc2FsZXM6IHsgbGFiZWw6ICdTYWxlcycgfSxcbiAgICAgICAgZ3JvdXBfc2VydmljZTogeyBsYWJlbDogJ1NlcnZpY2UnIH0sXG4gICAgICAgIGdyb3VwX21hcmtldGluZzogeyBsYWJlbDogJ01hcmtldGluZycgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgbWVzc2FnZXM6IHtcbiAgICAnY29tbW9uLnNhdmUnOiAnU2F2ZScsXG4gICAgJ2NvbW1vbi5jYW5jZWwnOiAnQ2FuY2VsJyxcbiAgICAnY29tbW9uLmRlbGV0ZSc6ICdEZWxldGUnLFxuICAgICdjb21tb24uZWRpdCc6ICdFZGl0JyxcbiAgICAnY29tbW9uLmNyZWF0ZSc6ICdDcmVhdGUnLFxuICAgICdjb21tb24uc2VhcmNoJzogJ1NlYXJjaCcsXG4gICAgJ2NvbW1vbi5maWx0ZXInOiAnRmlsdGVyJyxcbiAgICAnY29tbW9uLmV4cG9ydCc6ICdFeHBvcnQnLFxuICAgICdjb21tb24uYmFjayc6ICdCYWNrJyxcbiAgICAnY29tbW9uLmNvbmZpcm0nOiAnQ29uZmlybScsXG4gICAgJ25hdi5zYWxlcyc6ICdTYWxlcycsXG4gICAgJ25hdi5zZXJ2aWNlJzogJ1NlcnZpY2UnLFxuICAgICduYXYubWFya2V0aW5nJzogJ01hcmtldGluZycsXG4gICAgJ25hdi5wcm9kdWN0cyc6ICdQcm9kdWN0cycsXG4gICAgJ25hdi5hbmFseXRpY3MnOiAnQW5hbHl0aWNzJyxcbiAgICAnc3VjY2Vzcy5zYXZlZCc6ICdSZWNvcmQgc2F2ZWQgc3VjY2Vzc2Z1bGx5JyxcbiAgICAnc3VjY2Vzcy5jb252ZXJ0ZWQnOiAnTGVhZCBjb252ZXJ0ZWQgc3VjY2Vzc2Z1bGx5JyxcbiAgICAnY29uZmlybS5kZWxldGUnOiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHJlY29yZD8nLFxuICAgICdjb25maXJtLmNvbnZlcnRfbGVhZCc6ICdDb252ZXJ0IHRoaXMgbGVhZCB0byBhY2NvdW50LCBjb250YWN0LCBhbmQgb3Bwb3J0dW5pdHk/JyxcbiAgICAnZXJyb3IucmVxdWlyZWQnOiAnVGhpcyBmaWVsZCBpcyByZXF1aXJlZCcsXG4gICAgJ2Vycm9yLmxvYWRfZmFpbGVkJzogJ0ZhaWxlZCB0byBsb2FkIGRhdGEnLFxuICB9LFxuICBkYXNoYm9hcmRzOiB7XG4gICAgc2FsZXNfYWN0aXZpdHlfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ1NhbGVzIEFjdGl2aXR5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnV2hvIGlzIHRhbGtpbmcgdG8gY3VzdG9tZXJzLCBob3cgb2Z0ZW4sIGFuZCB3aGljaCBhY2NvdW50cyBoYXZlIGdvbmUgcXVpZXQnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICBpbnRlcmFjdGlvbnNfaGVsZDogeyB0aXRsZTogJ0ludGVyYWN0aW9ucyBMb2dnZWQnLCBkZXNjcmlwdGlvbjogJ0NhbGxzIGFuZCBtZWV0aW5ncyB0aGF0IGFjdHVhbGx5IGhhcHBlbmVkJyB9LFxuICAgICAgICBtZWV0aW5nc19ib29rZWQ6IHsgdGl0bGU6ICdNZWV0aW5ncyBCb29rZWQnLCBkZXNjcmlwdGlvbjogJ01lZXRpbmdzIG9uIHRoZSBjYWxlbmRhciB0aGF0IGhhdmUgbm90IGhhcHBlbmVkIHlldCcgfSxcbiAgICAgICAgY3VzdG9tZXJfbWludXRlczogeyB0aXRsZTogJ0N1c3RvbWVyIE1pbnV0ZXMnLCBkZXNjcmlwdGlvbjogJ1RvdGFsIHRpbWUgc3BlbnQgaW4gZnJvbnQgb2YgY3VzdG9tZXJzJyB9LFxuICAgICAgICB0YXNrc19jb21wbGV0ZWQ6IHsgdGl0bGU6ICdUYXNrcyBDb21wbGV0ZWQnLCBkZXNjcmlwdGlvbjogJ0ZvbGxvdy11cHMgY2xvc2VkIG91dCBcdTIwMTQgdGhlIG90aGVyIGhhbGYgb2YgYWN0aXZpdHknIH0sXG4gICAgICAgIGFjdGl2aXR5X2J5X3JlcDogeyB0aXRsZTogJ0FjdGl2aXR5IGJ5IFJlcCcsIGRlc2NyaXB0aW9uOiAnTG9nZ2VkIGludGVyYWN0aW9ucyBwZXIgb3duZXInIH0sXG4gICAgICAgIGFjdGl2aXR5X2J5X3dlZWs6IHsgdGl0bGU6ICdBY3Rpdml0eSBWb2x1bWUgYnkgV2VlaycsIGRlc2NyaXB0aW9uOiAnSW50ZXJhY3Rpb25zIHBlciB3ZWVrJyB9LFxuICAgICAgICBhY3Rpdml0eV9taXg6IHsgdGl0bGU6ICdBY3Rpdml0eSBNaXgnLCBkZXNjcmlwdGlvbjogJ0NhbGxzIHZzIG1lZXRpbmdzIHZzIGRlbW9zJyB9LFxuICAgICAgICBhY3Rpdml0eV9ieV9yZWNvcmRfdHlwZTogeyB0aXRsZTogJ1doZXJlIHRoZSBBY3Rpdml0eSBMYW5kcycsIGRlc2NyaXB0aW9uOiAnV2hpY2ggcGFydCBvZiB0aGUgZnVubmVsIGlzIGdldHRpbmcgYXR0ZW50aW9uJyB9LFxuICAgICAgICBkZWFsX2FjdGl2aXR5OiB7IHRpdGxlOiAnSW50ZXJhY3Rpb25zIG9uIERlYWxzJywgZGVzY3JpcHRpb246ICdMb2dnZWQgaW50ZXJhY3Rpb25zIGxpbmtlZCB0byBhbiBvcHBvcnR1bml0eScgfSxcbiAgICAgICAgb3Blbl9kZWFsc19mb3JfYWN0aXZpdHk6IHsgdGl0bGU6ICdPcGVuIERlYWxzJywgZGVzY3JpcHRpb246ICdPcHBvcnR1bml0aWVzIHN0aWxsIGluIHBsYXknIH0sXG4gICAgICAgIHF1aWV0X2FjY291bnRzXzMwOiB7IHRpdGxlOiAnUXVpZXQgMzArIERheXMnLCBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBhY2NvdW50cyB3aXRoIG5vIGxvZ2dlZCBpbnRlcmFjdGlvbiBpbiBhIG1vbnRoJyB9LFxuICAgICAgICBxdWlldF9hY2NvdW50c182MDogeyB0aXRsZTogJ1F1aWV0IDYwKyBEYXlzJywgZGVzY3JpcHRpb246ICdUd28gbW9udGhzIG9mIHNpbGVuY2UgXHUyMDE0IHRoZSBhdC1yaXNrIHRocmVzaG9sZCcgfSxcbiAgICAgICAgcXVpZXRfYWNjb3VudHNfOTA6IHsgdGl0bGU6ICdRdWlldCA5MCsgRGF5cycsIGRlc2NyaXB0aW9uOiAnQSBxdWFydGVyIHdpdGggbm8gY29udGFjdCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcm1fb3ZlcnZpZXdfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ0NSTSBPdmVydmlldycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1JldmVudWUgbWV0cmljcywgcGlwZWxpbmUgYW5hbHl0aWNzLCBhbmQgZGVhbCBpbnNpZ2h0cycsXG4gICAgICB3aWRnZXRzOiB7XG4gICAgICAgIHRvdGFsX3JldmVudWU6IHsgdGl0bGU6ICdUb3RhbCBSZXZlbnVlJywgZGVzY3JpcHRpb246ICdDbG9zZWQtd29uIHJldmVudWUgdGhpcyBwZXJpb2QnIH0sXG4gICAgICAgIGFjdGl2ZV9kZWFsczogeyB0aXRsZTogJ0FjdGl2ZSBEZWFscycsIGRlc2NyaXB0aW9uOiAnT3BlbiBvcHBvcnR1bml0aWVzIGluIHRoZSBwaXBlbGluZScgfSxcbiAgICAgICAgd29uX2RlYWxzOiB7IHRpdGxlOiAnV29uIERlYWxzJywgZGVzY3JpcHRpb246ICdDbG9zZWQtd29uIGRlYWxzIHRoaXMgcGVyaW9kJyB9LFxuICAgICAgICBhdmdfZGVhbF9zaXplOiB7IHRpdGxlOiAnQXZnIERlYWwgU2l6ZScsIGRlc2NyaXB0aW9uOiAnQXZlcmFnZSB2YWx1ZSBvZiBjbG9zZWQtd29uIGRlYWxzJyB9LFxuICAgICAgICByZXZlbnVlX3RyZW5kczogeyB0aXRsZTogJ1JldmVudWUgVHJlbmRzJywgZGVzY3JpcHRpb246ICdDbG9zZWQtd29uIHJldmVudWUgb3ZlciB0aGUgbGFzdCAxMiBtb250aHMnIH0sXG4gICAgICAgIGxlYWRfc291cmNlOiB7IHRpdGxlOiAnTGVhZCBTb3VyY2UnLCBkZXNjcmlwdGlvbjogJ1BpcGVsaW5lIHZhbHVlIGJ5IGFjcXVpc2l0aW9uIGNoYW5uZWwnIH0sXG4gICAgICAgIHBpcGVsaW5lX2J5X3N0YWdlOiB7IHRpdGxlOiAnUGlwZWxpbmUgYnkgU3RhZ2UnLCBkZXNjcmlwdGlvbjogJ09wZW4gb3Bwb3J0dW5pdHkgdmFsdWUgYXQgZWFjaCBzYWxlcyBzdGFnZScgfSxcbiAgICAgICAgdG9wX3Byb2R1Y3RzOiB7IHRpdGxlOiAnVG9wIFByb2R1Y3RzJywgZGVzY3JpcHRpb246ICdUb3RhbCBsaXN0LXByaWNlIHJldmVudWUgYnkgcHJvZHVjdCBjYXRlZ29yeScgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfb3duZXI6IHsgdGl0bGU6ICdQaXBlbGluZSBieSBPd25lcicsIGRlc2NyaXB0aW9uOiAnT3BlbiBwaXBlbGluZSB2YWx1ZSBhbmQgZGVhbCBjb3VudCBwZXIgc2FsZXMgcmVwJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGV4ZWN1dGl2ZV9kYXNoYm9hcmQ6IHtcbiAgICAgIGxhYmVsOiAnRXhlY3V0aXZlIE92ZXJ2aWV3JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSGlnaC1sZXZlbCByZXZlbnVlLCBjdXN0b21lciwgYW5kIHBpcGVsaW5lIEtQSXMgZm9yIGxlYWRlcnNoaXAnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICB0b3RhbF9yZXZlbnVlX3l0ZDogeyB0aXRsZTogJ1RvdGFsIFJldmVudWUgKFlURCknLCBkZXNjcmlwdGlvbjogJ0Nsb3NlZC13b24gcmV2ZW51ZSB0aGlzIHllYXInIH0sXG4gICAgICAgIHRvdGFsX2FjY291bnRzOiB7IHRpdGxlOiAnQWN0aXZlIEFjY291bnRzJywgZGVzY3JpcHRpb246ICdDdXN0b21lcnMgd2l0aCBhdCBsZWFzdCBvbmUgYWN0aXZlIHJlbGF0aW9uc2hpcCcgfSxcbiAgICAgICAgdG90YWxfY29udGFjdHM6IHsgdGl0bGU6ICdUb3RhbCBDb250YWN0cycsIGRlc2NyaXB0aW9uOiAnUGVvcGxlIGluIG91ciBhZGRyZXNzIGJvb2snIH0sXG4gICAgICAgIG9wZW5fbGVhZHM6IHsgdGl0bGU6ICdPcGVuIExlYWRzJywgZGVzY3JpcHRpb246ICdVbmNvbnZlcnRlZCBsZWFkcyBpbiB0aGUgZnVubmVsJyB9LFxuICAgICAgICByZXZlbnVlX3RyZW5kOiB7IHRpdGxlOiAnUmV2ZW51ZSBUcmVuZCcsIGRlc2NyaXB0aW9uOiAnQ2xvc2VkLXdvbiByZXZlbnVlIG92ZXIgdGhlIGxhc3QgMTIgbW9udGhzJyB9LFxuICAgICAgICByZXZlbnVlX2J5X2luZHVzdHJ5OiB7IHRpdGxlOiAnUmV2ZW51ZSBieSBJbmR1c3RyeScsIGRlc2NyaXB0aW9uOiAnWVREIGNsb3NlZC13b24gcmV2ZW51ZSBzcGxpdCBieSBjdXN0b21lciBpbmR1c3RyeScgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfc3RhZ2U6IHsgdGl0bGU6ICdQaXBlbGluZSBieSBTdGFnZScsIGRlc2NyaXB0aW9uOiAnT3BlbiBvcHBvcnR1bml0eSB2YWx1ZSBhdCBlYWNoIHNhbGVzIHN0YWdlJyB9LFxuICAgICAgICBuZXdfYWNjb3VudHNfYnlfbW9udGg6IHsgdGl0bGU6ICdOZXcgQWNjb3VudHMnLCBkZXNjcmlwdGlvbjogJ0FjY291bnQgY3JlYXRpb24gY2FkZW5jZSBcdTIwMTQgbGFzdCA2IG1vbnRocycgfSxcbiAgICAgICAgYWNjb3VudHNfYnlfaW5kdXN0cnk6IHsgdGl0bGU6ICdBY2NvdW50cyBieSBJbmR1c3RyeScsIGRlc2NyaXB0aW9uOiAnVG90YWwgYW5udWFsIHJldmVudWUgYW5kIGFjY291bnQgY291bnQgcGVyIGluZHVzdHJ5JyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHNhbGVzX2Rhc2hib2FyZDoge1xuICAgICAgbGFiZWw6ICdTYWxlcyBQZXJmb3JtYW5jZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1BpcGVsaW5lIGFuYWx5dGljcywgd2luIHJhdGUgdHJlbmRzLCBhbmQgcmVwIHBlcmZvcm1hbmNlJyxcbiAgICAgIHdpZGdldHM6IHtcbiAgICAgICAgdG90YWxfcGlwZWxpbmVfdmFsdWU6IHsgdGl0bGU6ICdUb3RhbCBQaXBlbGluZScsIGRlc2NyaXB0aW9uOiAnU3VtIG9mIG9wZW4gb3Bwb3J0dW5pdHkgdmFsdWUnIH0sXG4gICAgICAgIGNsb3NlZF93b25fcXRkOiB7IHRpdGxlOiAnQ2xvc2VkIFdvbiAoUVREKScsIGRlc2NyaXB0aW9uOiAnUmV2ZW51ZSBjbG9zZWQgdGhpcyBxdWFydGVyJyB9LFxuICAgICAgICBvcGVuX29wcG9ydHVuaXRpZXM6IHsgdGl0bGU6ICdPcGVuIE9wcG9ydHVuaXRpZXMnLCBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBkZWFscyBpbiBmbGlnaHQnIH0sXG4gICAgICAgIGF2Z19kZWFsX3NpemU6IHsgdGl0bGU6ICdBdmcgRGVhbCBTaXplJywgZGVzY3JpcHRpb246ICdBdmVyYWdlIHZhbHVlIG9mIGNsb3NlZC13b24gZGVhbHMgdGhpcyBxdWFydGVyJyB9LFxuICAgICAgICBwaXBlbGluZV9ieV9zdGFnZTogeyB0aXRsZTogJ1BpcGVsaW5lIGJ5IFN0YWdlJywgZGVzY3JpcHRpb246ICdPcGVuIG9wcG9ydHVuaXR5IHZhbHVlIGF0IGVhY2ggc2FsZXMgc3RhZ2UnIH0sXG4gICAgICAgIG1vbnRobHlfcmV2ZW51ZV90cmVuZDogeyB0aXRsZTogJ01vbnRobHkgUmV2ZW51ZSBUcmVuZCcsIGRlc2NyaXB0aW9uOiAnQ2xvc2VkLXdvbiByZXZlbnVlLCBsYXN0IDEyIG1vbnRocycgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfZm9yZWNhc3RfY2F0ZWdvcnk6IHsgdGl0bGU6ICdQaXBlbGluZSBieSBGb3JlY2FzdCBDYXRlZ29yeScsIGRlc2NyaXB0aW9uOiAnT3BlbiBwaXBlbGluZSBncm91cGVkIGJ5IHNhbGVzIGZvcmVjYXN0IGNhdGVnb3J5JyB9LFxuICAgICAgICBsZWFkX3NvdXJjZV9icmVha2Rvd246IHsgdGl0bGU6ICdMZWFkIFNvdXJjZScsIGRlc2NyaXB0aW9uOiAnV2hlcmUgb3VyIHBpcGVsaW5lIGlzIGNvbWluZyBmcm9tJyB9LFxuICAgICAgICBvcGVuX3BpcGVsaW5lX2J5X293bmVyOiB7IHRpdGxlOiAnT3BlbiBQaXBlbGluZSBieSBPd25lcicsIGRlc2NyaXB0aW9uOiAnSW4tZmxpZ2h0IHBpcGVsaW5lIHZhbHVlLCBkZWFsIGNvdW50IGFuZCBhdmcgd2luIHByb2JhYmlsaXR5IHBlciByZXAnIH0sXG4gICAgICAgIHF1b3RhX2F0dGFpbm1lbnRfYnlfcmVwOiB7IHRpdGxlOiAnUXVvdGEgQXR0YWlubWVudCBieSBSZXAnLCBkZXNjcmlwdGlvbjogJ0N1cnJlbnQtcXVhcnRlciBxdW90YSwgY2xvc2VkIHJldmVudWUgYW5kIGF0dGFpbm1lbnQgcGVyIHJlcCwgZnJvbSBmb3JlY2FzdCBzbmFwc2hvdHMnIH0sXG4gICAgICAgIHBpcGVsaW5lX3N0YWdlX2J5X3NvdXJjZTogeyB0aXRsZTogJ1BpcGVsaW5lIGJ5IFN0YWdlIFx1MDBENyBMZWFkIFNvdXJjZScsIGRlc2NyaXB0aW9uOiAnQ3Jvc3MtdGFiIG9mIG9wZW4gb3Bwb3J0dW5pdHkgYW1vdW50IGJ5IHN0YWdlIGFuZCBzb3VyY2UnIH0sXG4gICAgICAgIHdpbl9yYXRlXzEybTogeyB0aXRsZTogJ1dpbiBSYXRlICgxMk0pJywgZGVzY3JpcHRpb246ICdEZWFscyB3b24gYXMgYSBzaGFyZSBvZiBhbGwgZGVhbHMgc2V0dGxlZCBpbiB0aGUgbGFzdCAxMiBtb250aHMnIH0sXG4gICAgICAgIHdvbl9kZWFsc18xMm06IHsgdGl0bGU6ICdEZWFscyBXb24gKDEyTSknLCBkZXNjcmlwdGlvbjogJ1RoZSBudW1lcmF0b3Igb2YgdGhlIHdpbiByYXRlJyB9LFxuICAgICAgICBsb3N0X2RlYWxzXzEybTogeyB0aXRsZTogJ0RlYWxzIExvc3QgKDEyTSknLCBkZXNjcmlwdGlvbjogJ1RoZSBvdGhlciBoYWxmIG9mIHRoZSB3aW4tcmF0ZSBkZW5vbWluYXRvcicgfSxcbiAgICAgICAgd2luX3JhdGVfYnlfb3duZXI6IHsgdGl0bGU6ICdXaW4gLyBMb3NzIGJ5IFJlcCcsIGRlc2NyaXB0aW9uOiAnRGVhbHMgd29uLCBkZWFscyBsb3N0IGFuZCB3aW4gcmF0ZSBwZXIgcmVwIFx1MjAxNCBsYXN0IDEyIG1vbnRocycgfSxcbiAgICAgICAgd2luX3JhdGVfYnlfbGVhZF9zb3VyY2U6IHsgdGl0bGU6ICdXaW4gLyBMb3NzIGJ5IExlYWQgU291cmNlJywgZGVzY3JpcHRpb246ICdXaGljaCBzb3VyY2VzIHByb2R1Y2UgZGVhbHMgdGhhdCBhY3R1YWxseSBjbG9zZSBcdTIwMTQgbGFzdCAxMiBtb250aHMnIH0sXG4gICAgICAgIGxvc3NfcmVhc29uX2JyZWFrZG93bjogeyB0aXRsZTogJ1doeSBXZSBMb3NlJywgZGVzY3JpcHRpb246ICdMb3N0IGRlYWxzIGJ5IHJlYXNvbiBcdTIwMTQgbGFzdCAxMiBtb250aHMnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgc2VydmljZV9kYXNoYm9hcmQ6IHtcbiAgICAgIGxhYmVsOiAnQ3VzdG9tZXIgU2VydmljZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0Nhc2UgbG9hZCwgU0xBIGhlYWx0aCwgYW5kIHJlc29sdXRpb24gcGVyZm9ybWFuY2UnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICBvcGVuX2Nhc2VzOiB7IHRpdGxlOiAnT3BlbiBDYXNlcycsIGRlc2NyaXB0aW9uOiAnQ2FzZXMgdGhhdCBhcmUgbm90IHlldCBjbG9zZWQnIH0sXG4gICAgICAgIGNyaXRpY2FsX2Nhc2VzOiB7IHRpdGxlOiAnQ3JpdGljYWwgQ2FzZXMnLCBkZXNjcmlwdGlvbjogJ09wZW4gY2FzZXMgbWFya2VkIGFzIGNyaXRpY2FsIHByaW9yaXR5JyB9LFxuICAgICAgICBhdmdfcmVzb2x1dGlvbl90aW1lOiB7IHRpdGxlOiAnQXZnIFJlc29sdXRpb24gVGltZScsIGRlc2NyaXB0aW9uOiAnTWVhbiB0aW1lIHRvIGNsb3NlLCBpbiBob3VycycgfSxcbiAgICAgICAgc2xhX3Zpb2xhdGlvbnM6IHsgdGl0bGU6ICdTTEEgVmlvbGF0aW9ucycsIGRlc2NyaXB0aW9uOiAnQ2FzZXMgdGhhdCBicmVhY2hlZCB0aGVpciBTTEEnIH0sXG4gICAgICAgIGNhc2VzX2J5X3N0YXR1czogeyB0aXRsZTogJ0Nhc2VzIGJ5IFN0YXR1cycsIGRlc2NyaXB0aW9uOiAnV29ya2xvYWQgZGlzdHJpYnV0aW9uIGFjcm9zcyB0aGUgcGlwZWxpbmUnIH0sXG4gICAgICAgIGNhc2VzX2J5X3ByaW9yaXR5OiB7IHRpdGxlOiAnQ2FzZXMgYnkgUHJpb3JpdHknLCBkZXNjcmlwdGlvbjogJ09wZW4gY2FzZSBtaXggYnkgdXJnZW5jeScgfSxcbiAgICAgICAgY2FzZXNfYnlfb3JpZ2luOiB7IHRpdGxlOiAnQ2FzZXMgYnkgT3JpZ2luJywgZGVzY3JpcHRpb246ICdXaGVyZSBvdXIgY2FzZXMgYXJlIGNvbWluZyBmcm9tJyB9LFxuICAgICAgICBkYWlseV9jYXNlX3ZvbHVtZTogeyB0aXRsZTogJ0RhaWx5IENhc2UgVm9sdW1lJywgZGVzY3JpcHRpb246ICdOZXcgY2FzZXMgY3JlYXRlZCBvdmVyIHRoZSBsYXN0IDMwIGRheXMnIH0sXG4gICAgICAgIHNsYV9jb21wbGlhbmNlX2dhdWdlOiB7IHRpdGxlOiAnU0xBIENvbXBsaWFuY2UnLCBkZXNjcmlwdGlvbjogJ1BlcmNlbnQgb2YgY2FzZXMgcmVzb2x2ZWQgd2l0aGluIFNMQSB0aGlzIHBlcmlvZCcgfSxcbiAgICAgICAga2JfZGVmbGVjdGlvbl9yYXRlOiB7IHRpdGxlOiAnS0IgRGVmbGVjdGlvbiBSYXRlJywgZGVzY3JpcHRpb246ICdTaGFyZSBvZiBjbG9zZWQgY2FzZXMgcmVzb2x2ZWQgd2l0aCBhIGtub3dsZWRnZSBhcnRpY2xlJyB9LFxuICAgICAgICBrYl9yZXNvbHZlZF9jYXNlczogeyB0aXRsZTogJ1Jlc29sdmVkIGJ5IEtCJywgZGVzY3JpcHRpb246ICdDbG9zZWQgY2FzZXMgcG9pbnRpbmcgYXQgdGhlIGFydGljbGUgdGhhdCByZXNvbHZlZCB0aGVtJyB9LFxuICAgICAgICBjbG9zZWRfY2FzZXNfdG90YWw6IHsgdGl0bGU6ICdDbG9zZWQgQ2FzZXMnLCBkZXNjcmlwdGlvbjogJ1RoZSBkZW5vbWluYXRvciBiZWhpbmQgdGhlIGRlZmxlY3Rpb24gcmF0ZScgfSxcbiAgICAgICAgdG9wX3Jlc29sdmluZ19hcnRpY2xlczogeyB0aXRsZTogJ1RvcCBSZXNvbHZpbmcgQXJ0aWNsZXMnLCBkZXNjcmlwdGlvbjogJ0tub3dsZWRnZSBhcnRpY2xlcyByYW5rZWQgYnkgdGhlIGNsb3NlZCBjYXNlcyB0aGV5IHJlc29sdmVkJyB9LFxuICAgICAgICBteV9vcGVuX2Nhc2VzX2J5X3ByaW9yaXR5OiB7IHRpdGxlOiAnTXkgT3BlbiBDYXNlcyBieSBQcmlvcml0eScsIGRlc2NyaXB0aW9uOiAnWW91ciBvcGVuIGNhc2VzIGFuZCB0aGVpciBTTEEtdmlvbGF0aW9uIHJhdGUsIGJyb2tlbiBkb3duIGJ5IHByaW9yaXR5JyB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBwYWdlczoge1xuICAgIGFjY291bnRfZGV0YWlsX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBEZXRhaWwnLFxuICAgICAgZGVzY3JpcHRpb246ICdTbG90dGVkIGFjY291bnQgcmVjb3JkIHBhZ2UgXHUyMDE0IGN1c3RvbSBoZWFkZXIgKyBwZXJzaXN0ZW50IGRpc2N1c3Npb24gZmVlZC4nLFxuICAgICAgLy8gUmVxdWlyZWQsIHRob3VnaCBpdCBlcXVhbHMgdGhlIHBhZ2Ugc291cmNlOiBhIG1pc3NpbmcgYHRpdGxlYCBmYWxsc1xuICAgICAgLy8gYmFjayB0byBgbGFiZWxgLCBhbmQgdGhlIGhlYWRlciB0aGVuIHJlYWQgXCJBY2NvdW50IERldGFpbFwiIGluc3RlYWQgb2ZcbiAgICAgIC8vIHRoZSBhY2NvdW50J3MgbmFtZSAoIzIwNDIpLlxuICAgICAgdGl0bGU6ICd7bmFtZX0nLFxuICAgICAgc3VidGl0bGU6ICd7aW5kdXN0cnl9IFx1MDBCNyB7dHlwZX0nLFxuICAgIH0sXG4gICAgYWNjb3VudF93b3JrYmVuY2g6IHtcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBXb3JrYmVuY2gnLFxuICAgICAgZGVzY3JpcHRpb246ICdDdXJhdGVkIGFjY291bnQgbGlzdCBmb3IgdGhlIHNhbGVzIHRlYW06IHF1aWNrIGZpbHRlcnMgb25seSwgbm8gdmlldyBtYW5hZ2VtZW50LicsXG4gICAgfSxcbiAgICBhcHBfbGF1bmNoZXJfcGFnZToge1xuICAgICAgbGFiZWw6ICdBcHAgTGF1bmNoZXInLFxuICAgICAgZGVzY3JpcHRpb246ICdDZW50cmFsIGh1YiBmb3IgYWNjZXNzaW5nIGFsbCBhcHBsaWNhdGlvbnMnLFxuICAgICAgc3VidGl0bGU6ICdTZWxlY3QgYW4gYXBwIHRvIGdldCBzdGFydGVkJyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgYXBwX3NlYXJjaDogeyBsYWJlbDogJ1NlYXJjaCBBcHBzJyB9LFxuICAgICAgICBhcHBfZ3JpZDogeyBsYWJlbDogJ0FwcGxpY2F0aW9uIEdyaWQnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY2FzZV9kZXRhaWxfcGFnZToge1xuICAgICAgbGFiZWw6ICdDYXNlIERldGFpbCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NlcnZpY2UtYWdlbnQgY2FzZSByZWNvcmQ6IGhpZ2hsaWdodHMsIFNMQSBwYXRoLCBkZXRhaWxzIGFuZCBhY3Rpdml0eSB0aW1lbGluZS4nLFxuICAgICAgdGl0bGU6ICd7Y2FzZV9udW1iZXJ9IFx1MDBCNyB7c3ViamVjdH0nLFxuICAgICAgc3VidGl0bGU6ICd7Y3JtX2FjY291bnR9JyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgY2FzZV9oaWdobGlnaHRzOiB7IGxhYmVsOiAnS2V5IEluZm9ybWF0aW9uJyB9LFxuICAgICAgICBjYXNlX3N0YXR1c19wYXRoOiB7IGxhYmVsOiAnQ2FzZSBTdGF0dXMgUGF0aCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsZWFkX2RldGFpbF9wYWdlOiB7XG4gICAgICBsYWJlbDogJ0xlYWQgRGV0YWlsJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ29tcHJlaGVuc2l2ZSBsZWFkIGRldGFpbCBwYWdlIHdpdGggaGlnaGxpZ2h0cywgZGV0YWlscywgYW5kIHJlbGF0ZWQgaW5mb3JtYXRpb24nLFxuICAgICAgdGl0bGU6ICd7Zmlyc3RfbmFtZX0ge2xhc3RfbmFtZX0nLFxuICAgICAgc3VidGl0bGU6ICd7Y29tcGFueX0nLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBsZWFkX2R1cGxpY2F0ZV9hbGVydF9jb25maXJtZWQ6IHsgbGFiZWw6ICdDb25maXJtZWQgRHVwbGljYXRlIEFsZXJ0JyB9LFxuICAgICAgICBsZWFkX2R1cGxpY2F0ZV9hbGVydF9zdXNwZWN0ZWQ6IHsgbGFiZWw6ICdTdXNwZWN0ZWQgRHVwbGljYXRlIEFsZXJ0JyB9LFxuICAgICAgICBsZWFkX2hpZ2hsaWdodHM6IHsgbGFiZWw6ICdLZXkgSW5mb3JtYXRpb24nIH0sXG4gICAgICAgIGxlYWRfcGF0aDogeyBsYWJlbDogJ0xlYWQgU3RhdHVzIFBhdGgnIH0sXG4gICAgICAgIG1haW5fdGFiczogeyBsYWJlbDogJ0xlYWQgSW5mb3JtYXRpb24gVGFicycgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBvcHBvcnR1bml0eV9kZXRhaWxfcGFnZToge1xuICAgICAgbGFiZWw6ICdPcHBvcnR1bml0eSBEZXRhaWwnLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdDb21wcmVoZW5zaXZlIG9wcG9ydHVuaXR5IGRldGFpbCBwYWdlIHdpdGggcGF0aCwgaGlnaGxpZ2h0cywgZGV0YWlscywgYW5kIHJlbGF0ZWQgbGlzdHMnLFxuICAgICAgdGl0bGU6ICd7bmFtZX0nLFxuICAgICAgc3VidGl0bGU6ICd7Y3JtX2FjY291bnR9JyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgb3BwX2hpZ2hsaWdodHM6IHsgbGFiZWw6ICdLZXkgSW5mb3JtYXRpb24nIH0sXG4gICAgICAgIG9wcF9zdGFnZV9wYXRoOiB7IGxhYmVsOiAnT3Bwb3J0dW5pdHkgU3RhZ2UgUGF0aCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzYWxlc19ob21lX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnU2FsZXMgSG9tZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1NhbGVzIHRlYW0gaG9tZSBwYWdlIHdpdGgga2V5IG1ldHJpY3MgYW5kIHF1aWNrIGFjdGlvbnMnLFxuICAgICAgdGl0bGU6ICdTYWxlcyBEYXNoYm9hcmQnLFxuICAgICAgc3VidGl0bGU6ICdXZWxjb21lIGJhY2snLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBxdWlja19jcmVhdGU6IHsgdGl0bGU6ICdRdWljayBDcmVhdGUnLCBsYWJlbDogJ1F1aWNrIENyZWF0ZScgfSxcbiAgICAgICAga2V5X21ldHJpY3M6IHsgdGl0bGU6ICdLZXkgUGVyZm9ybWFuY2UgSW5kaWNhdG9ycycsIGxhYmVsOiAnS2V5IE1ldHJpY3MnIH0sXG4gICAgICAgIGhvbWVfdGFiczogeyBsYWJlbDogJ0hvbWUgVGFicycgfSxcbiAgICAgICAgYWlfYnJpZWZpbmc6IHtcbiAgICAgICAgICB0aXRsZTogJ0FzayB0aGUgQUkgQXNzaXN0YW50JyxcbiAgICAgICAgICBsYWJlbDogJ1RvZGF5IHdpdGggdGhlIEFJIEFzc2lzdGFudCcsXG4gICAgICAgIH0sXG4gICAgICAgIHVwY29taW5nX2V2ZW50czogeyB0aXRsZTogJ1VwY29taW5nIEV2ZW50cycsIGxhYmVsOiAnVXBjb21pbmcgRXZlbnRzJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHV0aWxpdHlfYmFyX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnVXRpbGl0eSBCYXInLFxuICAgICAgZGVzY3JpcHRpb246ICdRdWljayBhY2Nlc3MgdXRpbGl0eSBiYXIgd2l0aCBmbG9hdGluZyB0b29scycsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIG5vdGlmaWNhdGlvbnNfcGFuZWw6IHsgbGFiZWw6ICdOb3RpZmljYXRpb25zJyB9LFxuICAgICAgICBxdWlja19ub3RlczogeyB0aXRsZTogJ1F1aWNrIE5vdGVzJywgbGFiZWw6ICdRdWljayBOb3RlcycgfSxcbiAgICAgICAgcXVpY2tfc2VhcmNoOiB7IGxhYmVsOiAnUXVpY2sgU2VhcmNoJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9fc2hhcmVkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lblwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vX3NoYXJlZC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBFbmdsaXNoIChlbikgXHUyMDE0IHZhbHVlcyBzaGFyZWQgYnkgbW9yZSB0aGFuIG9uZSBwYXJ0IG9mIHRoaXMgYnVuZGxlLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICogRXZlcnl0aGluZyB0aGF0IGlzIG5vdCBgb2JqZWN0c2AgbGl2ZXMgaW4gYC4vYXBwLnRzYDsgYG9iamVjdHNgIFx1MjAxNCA2OS03OCUgb2ZcbiAqIGV2ZXJ5IGJ1bmRsZSBcdTIwMTQgaXMgb25lIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5LCBhbmQgYSBkZXRhaWwgb2JqZWN0XG4gKiBmb2xsb3dzIGl0cyBtYXN0ZXIuIEEgbmV3IHJvdyBnb2VzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LCBuZXZlciBpblxuICogd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuOiB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0IHRoZSA3MCVcbiAqIGFkdmlzb3J5IGJhbmQgYHBucG0gaHlnaWVuZWAgcHJpbnRzLiBGdWxsIHJ1bGUgYW5kIHJhdGlvbmFsZTpcbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuLnRzYC5cbiAqXG4gKiBFdmVyeSBjb25zdGFudCBoZXJlIGlzIHNwcmVhZCBpbnRvIG9iamVjdCByb3dzIHRoYXQgbGl2ZSBpbiBNT1JFIFRIQU4gT05FXG4gKiBmYW1pbHkgZmlsZSwgc28gaXQgY2Fubm90IHNpdCBpbiBhbnkgb25lIG9mIHRoZW0uIEEgdmFsdWUgdXNlZCBieSBleGFjdGx5XG4gKiBvbmUgZmFtaWx5IGxpdmVzIGluIHRoYXQgZmFtaWx5J3MgZmlsZSBpbnN0ZWFkIFx1MjAxNCB0aGF0IHNwbGl0IGlzIG1lY2hhbmljYWwsXG4gKiBub3QgYSBqdWRnZW1lbnQgY2FsbC5cbiAqL1xuXG4vKipcbiAqIFRoZSBhY3Rpdml0eSBmYW1pbHkgKCM1OTIpIFx1MjAxNCBgbG9nX2NhbGxgLCBgbG9nX21lZXRpbmdgIGFuZFxuICogYHNjaGVkdWxlX21lZXRpbmdgIGFyZSByZWdpc3RlcmVkIG9uY2UgUEVSIE9CSkVDVCAobGVhZCwgY29udGFjdCwgYWNjb3VudCxcbiAqIG9wcG9ydHVuaXR5LCBjYXNlKSwgYmVjYXVzZSBhIGJvZHkgYWN0aW9uIHdpdGggbm8gYG9iamVjdE5hbWVgIGxhbmRzIHVuZGVyIGFcbiAqIGRpc3BhdGNoZXIga2V5IG5vdGhpbmcgcHJvYmVzICgjNTA5KS4gVGhlIGxhYmVscyBhcmUgaWRlbnRpY2FsIG9uIGV2ZXJ5IG9uZVxuICogb2YgdGhlbSwgc28gdGhleSBhcmUgZGVjbGFyZWQgb25jZSBoZXJlIGFuZCBzcHJlYWQgaW50byBlYWNoIG9iamVjdCdzXG4gKiBgX2FjdGlvbnNgIFx1MjAxNCBmaWZ0ZWVuIGhhbmQtY29waWVkIGJsb2NrcyBwZXIgbG9jYWxlIGlzIGhvdyBhIHRyYW5zbGF0aW9uIHNldFxuICogZHJpZnRzLlxuICovXG5leHBvcnQgY29uc3QgYWN0aXZpdHlBY3Rpb25zID0ge1xuICBsb2dfY2FsbDoge1xuICAgIGxhYmVsOiAnTG9nIGEgQ2FsbCcsXG4gICAgc3VjY2Vzc01lc3NhZ2U6ICdDYWxsIGxvZ2dlZCBzdWNjZXNzZnVsbHkhJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN1YmplY3Q6IHsgbGFiZWw6ICdDYWxsIFN1YmplY3QnIH0sXG4gICAgICBkdXJhdGlvbjogeyBsYWJlbDogJ0R1cmF0aW9uIChtaW51dGVzKScgfSxcbiAgICAgIGF0dGVuZGVlX2NvbnRhY3RzOiB7IGxhYmVsOiAnQ29udGFjdCBBdHRlbmRlZXMnIH0sXG4gICAgICBhdHRlbmRlZV91c2VyczogeyBsYWJlbDogJ0ludGVybmFsIEF0dGVuZGVlcycgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnQ2FsbCBOb3RlcycgfSxcbiAgICB9LFxuICB9LFxuICBsb2dfbWVldGluZzoge1xuICAgIGxhYmVsOiAnTG9nIGEgTWVldGluZycsXG4gICAgc3VjY2Vzc01lc3NhZ2U6ICdNZWV0aW5nIGxvZ2dlZCBzdWNjZXNzZnVsbHkhJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN1YmplY3Q6IHsgbGFiZWw6ICdNZWV0aW5nIFN1YmplY3QnIH0sXG4gICAgICBkdXJhdGlvbjogeyBsYWJlbDogJ0R1cmF0aW9uIChtaW51dGVzKScgfSxcbiAgICAgIGF0dGVuZGVlX2NvbnRhY3RzOiB7IGxhYmVsOiAnQ29udGFjdCBBdHRlbmRlZXMnIH0sXG4gICAgICBhdHRlbmRlZV91c2VyczogeyBsYWJlbDogJ0ludGVybmFsIEF0dGVuZGVlcycgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnTWVldGluZyBOb3RlcycgfSxcbiAgICB9LFxuICB9LFxuICBzY2hlZHVsZV9tZWV0aW5nOiB7XG4gICAgbGFiZWw6ICdTY2hlZHVsZSBhIE1lZXRpbmcnLFxuICAgIHN1Y2Nlc3NNZXNzYWdlOiAnTWVldGluZyBzY2hlZHVsZWQhJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN1YmplY3Q6IHsgbGFiZWw6ICdNZWV0aW5nIFN1YmplY3QnIH0sXG4gICAgICBzdGFydF9kYXRlOiB7IGxhYmVsOiAnU3RhcnQgRGF0ZSAoVVRDKScgfSxcbiAgICAgIHN0YXJ0X3RpbWU6IHsgbGFiZWw6ICdTdGFydCBUaW1lIChVVEMpJyB9LFxuICAgICAgbG9jYXRpb246IHsgbGFiZWw6ICdMb2NhdGlvbicgfSxcbiAgICAgIGR1cmF0aW9uOiB7IGxhYmVsOiAnRHVyYXRpb24gKG1pbnV0ZXMpJyB9LFxuICAgICAgYXR0ZW5kZWVfY29udGFjdHM6IHsgbGFiZWw6ICdDb250YWN0IEF0dGVuZGVlcycgfSxcbiAgICAgIGF0dGVuZGVlX3VzZXJzOiB7IGxhYmVsOiAnSW50ZXJuYWwgQXR0ZW5kZWVzJyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdBZ2VuZGEnIH0sXG4gICAgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vb2JqZWN0cy5jdXN0b21lci50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW5cIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuL29iamVjdHMuY3VzdG9tZXIudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgT2JqZWN0VHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuaW1wb3J0IHsgYWN0aXZpdHlBY3Rpb25zIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLyoqXG4gKiBFbmdsaXNoIChlbikgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBDVVNUT01FUiBmYW1pbHk6XG4gKiB0aGUgY3VzdG9tZXIgcmVjb3JkIGl0c2VsZiBcdTIwMTQgYWNjb3VudHMgYW5kIHRoZSBwZW9wbGUgYXQgdGhlbS5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fYWNjb3VudGAsIGBjcm1fY29udGFjdGAuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4udHNgLlxuICovXG5leHBvcnQgY29uc3QgY3VzdG9tZXI6IFJlY29yZDxzdHJpbmcsIE9iamVjdFRyYW5zbGF0aW9uRGF0YT4gPSB7XG4gIGNybV9hY2NvdW50OiB7XG4gICAgbGFiZWw6ICdBY2NvdW50JyxcbiAgICBwbHVyYWxMYWJlbDogJ0FjY291bnRzJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGFjY291bnRfbnVtYmVyOiB7IGxhYmVsOiAnQWNjb3VudCBOdW1iZXInIH0sXG4gICAgICByZWdpc3RyYXRpb25fbnVtYmVyOiB7XG4gICAgICAgIGxhYmVsOiAnUmVnaXN0cmF0aW9uIE51bWJlcicsXG4gICAgICAgIGhlbHA6IFwiVGhlIGNvdW50ZXJwYXJ0eSdzIHJlZ2lzdGVyZWQgaWRlbnRpdHkgYXMgaXNzdWVkIGJ5IGl0cyBvd24gZ292ZXJubWVudCByZWdpc3RyeS4gTm90IHRoZSBBY2NvdW50IE51bWJlciwgd2hpY2ggd2UgaXNzdWUuXCIsXG4gICAgICB9LFxuICAgICAgY29tbWVyY2lhbF9jYXBhYmlsaXR5OiB7XG4gICAgICAgIGxhYmVsOiAnQ29tbWVyY2lhbCBDYXBhYmlsaXR5JyxcbiAgICAgICAgaGVscDogJ1doZXRoZXIgbmV3IGJ1c2luZXNzIG1heSBiZSBvcGVuZWQgYWdhaW5zdCB0aGlzIGFjY291bnQuIFNldHRsZW1lbnQgT25seSBhY2NvdW50cyBzdGF5IHVzYWJsZSBmb3IgYmlsbGluZyBhbmQgcGF5bWVudCwgYnV0IG5vIG5ldyBvcHBvcnR1bml0eSBtYXkgYmUgbGlua2VkIHRvIHRoZW0uJyxcbiAgICAgICAgb3B0aW9uczogeyBmdWxsOiAnRnVsbCcsIHNldHRsZW1lbnRfb25seTogJ1NldHRsZW1lbnQgT25seScgfSxcbiAgICAgIH0sXG4gICAgICBpbmN1bWJlbnRfdmVuZG9yOiB7IGxhYmVsOiAnSW5jdW1iZW50IFZlbmRvcicsIGhlbHA6ICdUaGUgc3VwcGxpZXIgY3VycmVudGx5IGhvbGRpbmcgdGhpcyBhY2NvdW50IGZvciB0aGUgc3BlbmQgd2UgYXJlIGNoYXNpbmcuJyB9LFxuICAgICAgYW5udWFsX3B1cmNoYXNpbmdfYnVkZ2V0OiB7IGxhYmVsOiAnQW5udWFsIFB1cmNoYXNpbmcgQnVkZ2V0JywgaGVscDogJ1doYXQgdGhpcyBhY2NvdW50IGV4cGVjdHMgdG8gc3BlbmQgd2l0aCB2ZW5kb3JzIHRoaXMgeWVhciBcdTIwMTQgbm90IGl0cyBvd24gcmV2ZW51ZS4nIH0sXG4gICAgICBwYXltZW50X2N5Y2xlOiB7XG4gICAgICAgIGxhYmVsOiAnUGF5bWVudCBDeWNsZScsXG4gICAgICAgIG9wdGlvbnM6IHsgcHJlcGFpZDogJ1ByZXBhaWQnLCBuZXRfMzA6ICdOZXQgMzAnLCBuZXRfNjA6ICdOZXQgNjAnLCBuZXRfOTA6ICdOZXQgOTAnIH0sXG4gICAgICB9LFxuICAgICAgYXBwcm92YWxfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnQXBwcm92YWwgU3RhdHVzJyxcbiAgICAgICAgaGVscDogJ1doZXJlIHRoaXMgYWNjb3VudCBzdGFuZHMgaW4gaXRzIHNpZ24tb2ZmLiBBIG5ldyBhY2NvdW50IHN0YXJ0cyBQZW5kaW5nIGFuZCBpcyBkZWNpZGVkIGluIHRoZSBhcHByb3ZhbCBpbmJveC4nLFxuICAgICAgICBvcHRpb25zOiB7IHBlbmRpbmc6ICdQZW5kaW5nJywgYXBwcm92ZWQ6ICdBcHByb3ZlZCcsIHJlamVjdGVkOiAnUmVqZWN0ZWQnIH0sXG4gICAgICB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ0FjY291bnQgTmFtZScsIGhlbHA6ICdMZWdhbCBuYW1lIG9mIHRoZSBjb21wYW55IG9yIG9yZ2FuaXphdGlvbicgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUeXBlJyxcbiAgICAgICAgb3B0aW9uczogeyBwcm9zcGVjdDogJ1Byb3NwZWN0JywgY3VzdG9tZXI6ICdDdXN0b21lcicsIHBhcnRuZXI6ICdQYXJ0bmVyJywgZm9ybWVyOiAnRm9ybWVyIEN1c3RvbWVyJyB9LFxuICAgICAgfSxcbiAgICAgIGluZHVzdHJ5OiB7XG4gICAgICAgIGxhYmVsOiAnSW5kdXN0cnknLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgdGVjaG5vbG9neTogJ1RlY2hub2xvZ3knLCBzb2Z0d2FyZTogJ1NvZnR3YXJlIC8gU2FhUycsIGZpbmFuY2U6ICdGaW5hbmNlJyxcbiAgICAgICAgICBoZWFsdGhjYXJlOiAnSGVhbHRoY2FyZScsIHJldGFpbDogJ1JldGFpbCcsIG1hbnVmYWN0dXJpbmc6ICdNYW51ZmFjdHVyaW5nJyxcbiAgICAgICAgICBlZHVjYXRpb246ICdFZHVjYXRpb24nLCByZWFsX2VzdGF0ZTogJ1JlYWwgRXN0YXRlJywgbWVkaWE6ICdNZWRpYSAmIEVudGVydGFpbm1lbnQnLFxuICAgICAgICAgIGxvZ2lzdGljczogJ0xvZ2lzdGljcycsIGhvc3BpdGFsaXR5OiAnSG9zcGl0YWxpdHknLCBlbmVyZ3k6ICdFbmVyZ3kgJiBVdGlsaXRpZXMnLFxuICAgICAgICAgIGdvdmVybm1lbnQ6ICdHb3Zlcm5tZW50Jywgbm9ucHJvZml0OiAnTm9uLXByb2ZpdCcsIG90aGVyOiAnT3RoZXInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFubnVhbF9yZXZlbnVlOiB7IGxhYmVsOiAnQW5udWFsIFJldmVudWUnIH0sXG4gICAgICBjaGlsZF9hY2NvdW50X3JldmVudWU6IHsgbGFiZWw6ICdDaGlsZCBBY2NvdW50IFJldmVudWUnLCBoZWxwOiAnU3VtIG9mIHRoZSBhbm51YWwgcmV2ZW51ZSBvZiB0aGUgZGlyZWN0IGNoaWxkcmVuIG9mIHRoaXMgYWNjb3VudC4nIH0sXG4gICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiB7IGxhYmVsOiAnTnVtYmVyIG9mIEVtcGxveWVlcycgfSxcbiAgICAgIHBob25lOiB7IGxhYmVsOiAnUGhvbmUnIH0sXG4gICAgICB3ZWJzaXRlOiB7IGxhYmVsOiAnV2Vic2l0ZScgfSxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBsYWJlbDogJ0JpbGxpbmcgQWRkcmVzcycgfSxcbiAgICAgIGJpbGxpbmdfY291bnRyeToge1xuICAgICAgICBsYWJlbDogJ0JpbGxpbmcgQ291bnRyeScsXG4gICAgICAgIGhlbHA6ICdEZXJpdmVkIGZyb20gQmlsbGluZyBBZGRyZXNzIFx1MjAxNCB0aGUgY291bnRyeSBleGFjdGx5IGFzIGVudGVyZWQsIHRyaW1tZWQgYW5kIHVwcGVyLWNhc2VkLicsXG4gICAgICB9LFxuICAgICAgdGVycml0b3J5OiB7XG4gICAgICAgIGxhYmVsOiAnVGVycml0b3J5JyxcbiAgICAgICAgaGVscDogJ0Rlcml2ZWQgZnJvbSBCaWxsaW5nIEFkZHJlc3MgXHUyMDE0IHRoZSBzYWxlcyB0ZXJyaXRvcnkgdGhlIHNoYXJpbmcgcnVsZXMgbWF0Y2ggb24uIEFjY291bnRzIG91dHNpZGUgdGhlIHN0YWZmZWQgdGVycml0b3JpZXMgYXJlIE90aGVyLicsXG4gICAgICAgIG9wdGlvbnM6IHsgbmE6ICdOb3J0aCBBbWVyaWNhJywgZW1lYTogJ0VNRUEnLCBvdGhlcjogJ090aGVyJyB9LFxuICAgICAgfSxcbiAgICAgIG9mZmljZV9sb2NhdGlvbjogeyBsYWJlbDogJ09mZmljZSBMb2NhdGlvbicgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnQWNjb3VudCBPd25lcicgfSxcbiAgICAgIHBhcmVudF9hY2NvdW50OiB7IGxhYmVsOiAnUGFyZW50IEFjY291bnQnLCBoZWxwOiAnUGFyZW50IGNvbXBhbnkgaW4gaGllcmFyY2h5JyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwdGlvbicgfSxcbiAgICAgIGlzX2FjdGl2ZTogeyBsYWJlbDogJ0FjdGl2ZScgfSxcbiAgICAgIGxhc3RfYWN0aXZpdHlfZGF0ZTogeyBsYWJlbDogJ0xhc3QgQWN0aXZpdHkgRGF0ZScgfSxcbiAgICAgIGJyYW5kX2NvbG9yOiB7IGxhYmVsOiAnQnJhbmQgQ29sb3InIH0sXG4gICAgICBsb2dvOiB7IGxhYmVsOiAnQ29tcGFueSBMb2dvJyB9LFxuICAgICAgdGllcjoge1xuICAgICAgICBsYWJlbDogJ0N1c3RvbWVyIFRpZXInLFxuICAgICAgICBvcHRpb25zOiB7IHN0cmF0ZWdpYzogJ1N0cmF0ZWdpYycsIGVudGVycHJpc2U6ICdFbnRlcnByaXNlJywgbWlkX21hcmtldDogJ01pZC1NYXJrZXQnLCBzbWI6ICdTTUInIH0sXG4gICAgICB9LFxuICAgICAgc2VnbWVudDoge1xuICAgICAgICBsYWJlbDogJ1NlZ21lbnQnLFxuICAgICAgICBvcHRpb25zOiB7IG5ldF9uZXc6ICdOZXQgTmV3JywgZ3Jvd3RoOiAnR3Jvd3RoJywgYXRfcmlzazogJ0F0IFJpc2snLCBzdGFibGU6ICdTdGFibGUnIH0sXG4gICAgICB9LFxuICAgICAgaGVhbHRoX3Njb3JlOiB7XG4gICAgICAgIGxhYmVsOiAnSGVhbHRoIFNjb3JlJyxcbiAgICAgICAgaGVscDogJ0NTTS1tYWludGFpbmVkIGhlYWx0aCBpbmRpY2F0b3InLFxuICAgICAgICBvcHRpb25zOiB7IGhlYWx0aHk6ICdIZWFsdGh5Jywgd2F0Y2hpbmc6ICdXYXRjaGluZycsIGF0X3Jpc2s6ICdBdCBSaXNrJywgY2h1cm5pbmc6ICdDaHVybmluZycgfSxcbiAgICAgIH0sXG4gICAgICBuYW1lX25vcm1hbGl6ZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdBY2NvdW50IE5hbWUgKE5vcm1hbGl6ZWQpJyxcbiAgICAgICAgaGVscDogJ01hdGNoIGtleSBmb3IgbGVhZCBjb252ZXJzaW9uOiBBY2NvdW50IE5hbWUgbG93ZXItY2FzZWQsIHRyaW1tZWQsIHdpdGggaW50ZXJuYWwgd2hpdGVzcGFjZSBjb2xsYXBzZWQuIE1haW50YWluZWQgYnkgdGhlIGFjY291bnRfcHJvdGVjdGlvbiBob29rIFx1MjAxNCBuZXZlciBlZGl0IGRpcmVjdGx5LicsXG4gICAgICB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ0Rpc3BsYXkgVGl0bGUnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9hY2NvdW50czogeyBsYWJlbDogJ0FsbCBBY2NvdW50cycsIGRlc2NyaXB0aW9uOiAnUHJpbWFyeSBhY2NvdW50IGxpc3Qgd2l0aCByZXZlbnVlICYgaW5kdXN0cnkgc3VtbWFyaWVzJyB9LFxuICAgICAgYWNjb3VudF9nYWxsZXJ5OiB7IGxhYmVsOiAnQWNjb3VudCBDYXJkcycsIGRlc2NyaXB0aW9uOiAnQnJhbmRlZCBhY2NvdW50IGNhcmRzIHdpdGggYnJhbmQtY29sb3IgaGlnaGxpZ2h0cycgfSxcbiAgICAgIGFjY291bnRfbWFwOiB7IGxhYmVsOiAnQWNjb3VudHMgYnkgTG9jYXRpb24nLCBkZXNjcmlwdGlvbjogJ0dlb3NwYXRpYWwgZGlzdHJpYnV0aW9uIG9mIGFjY291bnRzJyB9LFxuICAgICAgZW50ZXJwcmlzZV9hY2NvdW50czogeyBsYWJlbDogJ0VudGVycHJpc2UgQWNjb3VudHMnLCBkZXNjcmlwdGlvbjogJ0FjY291bnRzIHdpdGggdGhlIGhpZ2hlc3QgYW5udWFsIHJldmVudWUnIH0sXG4gICAgICBteV9hY2NvdW50czogeyBsYWJlbDogJ015IEFjY291bnRzJywgZGVzY3JpcHRpb246ICdBY2NvdW50cyBvd25lZCBieSB0aGUgY3VycmVudCB1c2VyJyB9LFxuICAgICAgYXRfcmlza19hY2NvdW50czogeyBsYWJlbDogJ1x1MjZBMFx1RkUwRiBBdC1SaXNrIEFjY291bnRzJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0Jhc2ljIEluZm9ybWF0aW9uJyB9LFxuICAgICAgZmluYW5jaWFsczogeyBsYWJlbDogJ0ZpbmFuY2lhbHMnIH0sXG4gICAgICBidXNpbmVzc19wcm9maWxlOiB7IGxhYmVsOiAnQnVzaW5lc3MgUHJvZmlsZScgfSxcbiAgICAgIGNvbnRhY3RfaW5mbzogeyBsYWJlbDogJ0NvbnRhY3QgSW5mb3JtYXRpb24nIH0sXG4gICAgICBvd25lcnNoaXA6IHsgbGFiZWw6ICdPd25lcnNoaXAgJiBTdGF0dXMnIH0sXG4gICAgICBicmFuZGluZzogeyBsYWJlbDogJ0JyYW5kaW5nJyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnU3lzdGVtJyB9LFxuICAgICAgLy8gRm9ybSBzZWN0aW9uIG5hbWVzIG9uIGFjY291bnQudmlldy50cyAoIzExMDApXG4gICAgICBwcm9maWxlOiB7IGxhYmVsOiAnUHJvZmlsZScgfSxcbiAgICAgIGN1c3RvbWVyX3N1Y2Nlc3M6IHsgbGFiZWw6ICdDdXN0b21lciBTdWNjZXNzJyB9LFxuICAgICAgbG9jYXRpb25zOiB7IGxhYmVsOiAnTG9jYXRpb25zJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwdGlvbicgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7IC4uLmFjdGl2aXR5QWN0aW9ucyB9LFxuICB9LFxuICBjcm1fY29udGFjdDoge1xuICAgIGxhYmVsOiAnQ29udGFjdCcsXG4gICAgcGx1cmFsTGFiZWw6ICdDb250YWN0cycsXG4gICAgZmllbGRzOiB7XG4gICAgICBzYWx1dGF0aW9uOiB7XG4gICAgICAgIGxhYmVsOiAnU2FsdXRhdGlvbicsXG4gICAgICAgIG9wdGlvbnM6IHsgbXI6ICdNci4nLCBtczogJ01zLicsIG1yczogJ01ycy4nLCBkcjogJ0RyLicsIHByb2Y6ICdQcm9mLicgfSxcbiAgICAgIH0sXG4gICAgICBmaXJzdF9uYW1lOiB7IGxhYmVsOiAnRmlyc3QgTmFtZScgfSxcbiAgICAgIGxhc3RfbmFtZTogeyBsYWJlbDogJ0xhc3QgTmFtZScgfSxcbiAgICAgIGZ1bGxfbmFtZTogeyBsYWJlbDogJ0Z1bGwgTmFtZScgfSxcbiAgICAgIGNybV9hY2NvdW50OiB7IGxhYmVsOiAnQWNjb3VudCcgfSxcbiAgICAgIGVtYWlsOiB7IGxhYmVsOiAnRW1haWwnIH0sXG4gICAgICBwaG9uZTogeyBsYWJlbDogJ1Bob25lJyB9LFxuICAgICAgbW9iaWxlOiB7IGxhYmVsOiAnTW9iaWxlJyB9LFxuICAgICAgdGl0bGU6IHsgbGFiZWw6ICdUaXRsZScgfSxcbiAgICAgIGRlcGFydG1lbnQ6IHtcbiAgICAgICAgbGFiZWw6ICdEZXBhcnRtZW50JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGV4ZWN1dGl2ZTogJ0V4ZWN1dGl2ZScsIHNhbGVzOiAnU2FsZXMnLCBtYXJrZXRpbmc6ICdNYXJrZXRpbmcnLFxuICAgICAgICAgIGVuZ2luZWVyaW5nOiAnRW5naW5lZXJpbmcnLCBzdXBwb3J0OiAnU3VwcG9ydCcsIGZpbmFuY2U6ICdGaW5hbmNlJyxcbiAgICAgICAgICBocjogJ0h1bWFuIFJlc291cmNlcycsIG9wZXJhdGlvbnM6ICdPcGVyYXRpb25zJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAvLyBCdXlpbmcgY2VudHJlIChSRVEtMDAwNCkgXHUyMDE0IHRoZSBkZWNpc2lvbiBtYXAuIEVuZ2xpc2ggaXMgdGhlIHNvdXJjZVxuICAgICAgLy8gd29yZGluZyBmb3IgdGhlIG9wdGlvbiBWQUxVRVM7IGV2ZXJ5IG90aGVyIHBhY2sgdHJhbnNsYXRlcyB0aGVzZS5cbiAgICAgIGJ1eWluZ19mdW5jdGlvbjoge1xuICAgICAgICBsYWJlbDogJ0J1eWluZyBGdW5jdGlvbicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkZWNpc2lvbl9tYWtlcjogJ0RlY2lzaW9uIE1ha2VyJywgZWNvbm9taWNfYnV5ZXI6ICdFY29ub21pYyBCdXllcicsXG4gICAgICAgICAgdGVjaG5pY2FsX2V2YWx1YXRvcjogJ1RlY2huaWNhbCBFdmFsdWF0b3InLCB1c2VyOiAnVXNlcicsXG4gICAgICAgICAgaW5mbHVlbmNlcjogJ0luZmx1ZW5jZXInLCBnYXRla2VlcGVyOiAnR2F0ZWtlZXBlcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXR0aXR1ZGU6IHtcbiAgICAgICAgbGFiZWw6ICdBdHRpdHVkZSB0byBVcycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjaGFtcGlvbjogJ0NoYW1waW9uJywgc3VwcG9ydGl2ZTogJ1N1cHBvcnRpdmUnLCBuZXV0cmFsOiAnTmV1dHJhbCcsXG4gICAgICAgICAgc2tlcHRpY2FsOiAnU2tlcHRpY2FsJywgYmxvY2tlcjogJ0Jsb2NrZXInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlbGF0aW9uc2hpcF9zdHJlbmd0aDoge1xuICAgICAgICBsYWJlbDogJ1JlbGF0aW9uc2hpcCBTdHJlbmd0aCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkaXN0YW50OiAnRGlzdGFudCcsIGFjcXVhaW50YW5jZTogJ0FjcXVhaW50YW5jZScsIHdvcmtpbmc6ICdXb3JraW5nIFJlbGF0aW9uc2hpcCcsXG4gICAgICAgICAgc3Ryb25nOiAnU3Ryb25nJywgdHJ1c3RlZF9hZHZpc29yOiAnVHJ1c3RlZCBBZHZpc29yJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ0NvbnRhY3QgT3duZXInIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXB0aW9uJyB9LFxuICAgICAgaXNfcHJpbWFyeTogeyBsYWJlbDogJ1ByaW1hcnkgQ29udGFjdCcsIGhlbHA6ICdJcyB0aGlzIHRoZSBtYWluIGNvbnRhY3QgZm9yIHRoZSBhY2NvdW50PycgfSxcbiAgICAgIGF2YXRhcjogeyBsYWJlbDogJ1Byb2ZpbGUgUGljdHVyZScgfSxcbiAgICAgIG1haWxpbmdfYWRkcmVzczogeyBsYWJlbDogJ01haWxpbmcgQWRkcmVzcycgfSxcbiAgICAgIGxlYWRfc291cmNlOiB7XG4gICAgICAgIGxhYmVsOiAnTGVhZCBTb3VyY2UnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgd2ViOiAnV2ViJywgcmVmZXJyYWw6ICdSZWZlcnJhbCcsIGV2ZW50OiAnRXZlbnQgLyBUcmFkZSBTaG93JyxcbiAgICAgICAgICB3ZWJpbmFyOiAnV2ViaW5hcicsIHBhcnRuZXI6ICdQYXJ0bmVyJywgYWR2ZXJ0aXNlbWVudDogJ0FkdmVydGlzZW1lbnQnLFxuICAgICAgICAgIHBhaWRfc2VhcmNoOiAnUGFpZCBTZWFyY2gnLCBzb2NpYWw6ICdTb2NpYWwgTWVkaWEnLCBjb250ZW50OiAnQ29udGVudCAvIEJsb2cnLFxuICAgICAgICAgIGNvbGRfY2FsbDogJ0NvbGQgQ2FsbCcsIGVtYWlsX2NhbXBhaWduOiAnRW1haWwgQ2FtcGFpZ24nLCBvdGhlcjogJ090aGVyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBkb19ub3RfY2FsbDogeyBsYWJlbDogJ0RvIE5vdCBDYWxsJyB9LFxuICAgICAgZW1haWxfb3B0X291dDogeyBsYWJlbDogJ0VtYWlsIE9wdCBPdXQnIH0sXG4gICAgICBsYXN0X2NvbnRhY3RlZF9kYXRlOiB7IGxhYmVsOiAnTGFzdCBDb250YWN0ZWQnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9jb250YWN0czogeyBsYWJlbDogJ0FsbCBDb250YWN0cycgfSxcbiAgICAgIGNvbnRhY3RfZGlyZWN0b3J5OiB7IGxhYmVsOiAnUGVvcGxlIERpcmVjdG9yeScgfSxcbiAgICAgIHByaW1hcnlfY29udGFjdHM6IHsgbGFiZWw6ICdQcmltYXJ5IENvbnRhY3RzJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBpZGVudGl0eTogeyBsYWJlbDogJ0lkZW50aXR5JyB9LFxuICAgICAgYWNjb3VudF9pbmZvOiB7IGxhYmVsOiAnQWNjb3VudCAmIFRpdGxlJyB9LFxuICAgICAgYnV5aW5nX2NlbnRyZTogeyBsYWJlbDogJ0J1eWluZyBDZW50cmUnIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdDb250YWN0IEluZm9ybWF0aW9uJyB9LFxuICAgICAgbWFpbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnTWFpbGluZyBBZGRyZXNzJyB9LFxuICAgICAgYWRkaXRpb25hbDogeyBsYWJlbDogJ0FkZGl0aW9uYWwgSW5mbycgfSxcbiAgICAgIHByZWZlcmVuY2VzOiB7IGxhYmVsOiAnQ29tbXVuaWNhdGlvbiBQcmVmZXJlbmNlcycgfSxcbiAgICAgIC8vIEZvcm0gc2VjdGlvbiBuYW1lcyBvbiBjb250YWN0LnZpZXcudHMgKCMxMTAwKS4gYGNvbnRhY3RfZGV0YWlsc2AgL1xuICAgICAgLy8gYGNvbW1fcHJlZmVyZW5jZXNgLCBub3QgYGNvbnRhY3RfaW5mb2AgLyBgcHJlZmVyZW5jZXNgIFx1MjAxNCB0aG9zZSBhcmVcbiAgICAgIC8vIGFscmVhZHkgZmllbGRHcm91cCBrZXlzIHdpdGggdGhlaXIgb3duIChsb25nZXIpIHdvcmRpbmcgYWJvdmUuXG4gICAgICBjb250YWN0X2RldGFpbHM6IHsgbGFiZWw6ICdDb250YWN0IEluZm8nIH0sXG4gICAgICBjb21tX3ByZWZlcmVuY2VzOiB7IGxhYmVsOiAnUHJlZmVyZW5jZXMnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgbWFya19wcmltYXJ5OiB7XG4gICAgICAgIGxhYmVsOiAnTWFyayBhcyBQcmltYXJ5IENvbnRhY3QnLFxuICAgICAgICBjb25maXJtVGV4dDogJ01hcmsgdGhpcyBjb250YWN0IGFzIHRoZSBwcmltYXJ5IGNvbnRhY3QgZm9yIHRoZSBhY2NvdW50PycsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnQ29udGFjdCBtYXJrZWQgYXMgcHJpbWFyeSEnLFxuICAgICAgfSxcbiAgICAgIHNlbmRfZW1haWw6IHtcbiAgICAgICAgbGFiZWw6ICdTZW5kIEVtYWlsJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1N1YmplY3QnIH0sXG4gICAgICAgICAgYm9keTogeyBsYWJlbDogJ0JvZHknIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYWRkX2NvbnRhY3RfdG9fY2FtcGFpZ246IHtcbiAgICAgICAgbGFiZWw6ICdBZGQgdG8gQ2FtcGFpZ24nLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ0NvbnRhY3RzIGFkZGVkIHRvIGNhbXBhaWduIScsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGNybV9jYW1wYWlnbjogeyBsYWJlbDogJ0NhbXBhaWduJyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9vYmplY3RzLnBpcGVsaW5lLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lblwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vb2JqZWN0cy5waXBlbGluZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG5pbXBvcnQgeyBhY3Rpdml0eUFjdGlvbnMgfSBmcm9tICcuL19zaGFyZWQnO1xuXG4vKipcbiAqIEVuZ2xpc2ggKGVuKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIFBJUEVMSU5FIGZhbWlseTpcbiAqIGRlbWFuZCBhbmQgdGhlIGRlYWxzIGl0IGJlY29tZXMsIHBsdXMgdGhlIHJvbGwtdXAgdGhhdCBmb3JlY2FzdHMgdGhlbS5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fbGVhZGAsIGBjcm1fb3Bwb3J0dW5pdHlgLCBgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbWAsIGBjcm1fZm9yZWNhc3RgLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICogRXZlcnl0aGluZyB0aGF0IGlzIG5vdCBgb2JqZWN0c2AgbGl2ZXMgaW4gYC4vYXBwLnRzYDsgYG9iamVjdHNgIFx1MjAxNCA2OS03OCUgb2ZcbiAqIGV2ZXJ5IGJ1bmRsZSBcdTIwMTQgaXMgb25lIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5LCBhbmQgYSBkZXRhaWwgb2JqZWN0XG4gKiBmb2xsb3dzIGl0cyBtYXN0ZXIuIEEgbmV3IHJvdyBnb2VzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LCBuZXZlciBpblxuICogd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuOiB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0IHRoZSA3MCVcbiAqIGFkdmlzb3J5IGJhbmQgYHBucG0gaHlnaWVuZWAgcHJpbnRzLiBGdWxsIHJ1bGUgYW5kIHJhdGlvbmFsZTpcbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuLnRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IHBpcGVsaW5lOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fbGVhZDoge1xuICAgIGxhYmVsOiAnTGVhZCcsXG4gICAgcGx1cmFsTGFiZWw6ICdMZWFkcycsXG4gICAgZmllbGRzOiB7XG4gICAgICBmaXJzdF9uYW1lOiB7IGxhYmVsOiAnRmlyc3QgTmFtZScgfSxcbiAgICAgIGxhc3RfbmFtZTogeyBsYWJlbDogJ0xhc3QgTmFtZScgfSxcbiAgICAgIGNvbXBhbnk6IHsgbGFiZWw6ICdDb21wYW55JyB9LFxuICAgICAgdGl0bGU6IHsgbGFiZWw6ICdUaXRsZScgfSxcbiAgICAgIGVtYWlsOiB7IGxhYmVsOiAnRW1haWwnIH0sXG4gICAgICBwaG9uZTogeyBsYWJlbDogJ1Bob25lJyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnU3RhdHVzJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ldzogJ05ldycsIGNvbnRhY3RlZDogJ0NvbnRhY3RlZCcsIHF1YWxpZmllZDogJ1F1YWxpZmllZCcsXG4gICAgICAgICAgdW5xdWFsaWZpZWQ6ICdVbnF1YWxpZmllZCcsIGNvbnZlcnRlZDogJ0NvbnZlcnRlZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbGVhZF9zb3VyY2U6IHtcbiAgICAgICAgbGFiZWw6ICdMZWFkIFNvdXJjZScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB3ZWI6ICdXZWInLCByZWZlcnJhbDogJ1JlZmVycmFsJywgZXZlbnQ6ICdFdmVudCAvIFRyYWRlIFNob3cnLFxuICAgICAgICAgIHdlYmluYXI6ICdXZWJpbmFyJywgcGFydG5lcjogJ1BhcnRuZXInLCBhZHZlcnRpc2VtZW50OiAnQWR2ZXJ0aXNlbWVudCcsXG4gICAgICAgICAgcGFpZF9zZWFyY2g6ICdQYWlkIFNlYXJjaCcsIHNvY2lhbDogJ1NvY2lhbCBNZWRpYScsIGNvbnRlbnQ6ICdDb250ZW50IC8gQmxvZycsXG4gICAgICAgICAgY29sZF9jYWxsOiAnQ29sZCBDYWxsJywgZW1haWxfY2FtcGFpZ246ICdFbWFpbCBDYW1wYWlnbicsIG90aGVyOiAnT3RoZXInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnTGVhZCBPd25lcicgfSxcbiAgICAgIGlzX2NvbnZlcnRlZDogeyBsYWJlbDogJ0NvbnZlcnRlZCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcHRpb24nIH0sXG4gICAgICBzYWx1dGF0aW9uOiB7XG4gICAgICAgIGxhYmVsOiAnU2FsdXRhdGlvbicsXG4gICAgICAgIG9wdGlvbnM6IHsgbXI6ICdNci4nLCBtczogJ01zLicsIG1yczogJ01ycy4nLCBkcjogJ0RyLicsIHByb2Y6ICdQcm9mLicgfSxcbiAgICAgIH0sXG4gICAgICBmdWxsX25hbWU6IHsgbGFiZWw6ICdGdWxsIE5hbWUnIH0sXG4gICAgICBpbmR1c3RyeToge1xuICAgICAgICBsYWJlbDogJ0luZHVzdHJ5JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHRlY2hub2xvZ3k6ICdUZWNobm9sb2d5Jywgc29mdHdhcmU6ICdTb2Z0d2FyZSAvIFNhYVMnLCBmaW5hbmNlOiAnRmluYW5jZScsXG4gICAgICAgICAgaGVhbHRoY2FyZTogJ0hlYWx0aGNhcmUnLCByZXRhaWw6ICdSZXRhaWwnLCBtYW51ZmFjdHVyaW5nOiAnTWFudWZhY3R1cmluZycsXG4gICAgICAgICAgZWR1Y2F0aW9uOiAnRWR1Y2F0aW9uJywgcmVhbF9lc3RhdGU6ICdSZWFsIEVzdGF0ZScsIG1lZGlhOiAnTWVkaWEgJiBFbnRlcnRhaW5tZW50JyxcbiAgICAgICAgICBsb2dpc3RpY3M6ICdMb2dpc3RpY3MnLCBob3NwaXRhbGl0eTogJ0hvc3BpdGFsaXR5JywgZW5lcmd5OiAnRW5lcmd5ICYgVXRpbGl0aWVzJyxcbiAgICAgICAgICBnb3Zlcm5tZW50OiAnR292ZXJubWVudCcsIG5vbnByb2ZpdDogJ05vbi1wcm9maXQnLCBvdGhlcjogJ090aGVyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtb2JpbGU6IHsgbGFiZWw6ICdNb2JpbGUnIH0sXG4gICAgICB3ZWJzaXRlOiB7IGxhYmVsOiAnV2Vic2l0ZScgfSxcbiAgICAgIHJhdGluZzogeyBsYWJlbDogJ0xlYWQgU2NvcmUnLCBoZWxwOiAnTGVhZCBxdWFsaXR5IHNjb3JlICgxLTUgc3RhcnMpJyB9LFxuICAgICAgY29udmVydGVkX2FjY291bnQ6IHsgbGFiZWw6ICdDb252ZXJ0ZWQgQWNjb3VudCcgfSxcbiAgICAgIGNvbnZlcnRlZF9jb250YWN0OiB7IGxhYmVsOiAnQ29udmVydGVkIENvbnRhY3QnIH0sXG4gICAgICBjb252ZXJ0ZWRfb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdDb252ZXJ0ZWQgT3Bwb3J0dW5pdHknIH0sXG4gICAgICBjb252ZXJ0ZWRfZGF0ZTogeyBsYWJlbDogJ0NvbnZlcnRlZCBEYXRlJyB9LFxuICAgICAgYWRkcmVzczogeyBsYWJlbDogJ0FkZHJlc3MnIH0sXG4gICAgICBhbm51YWxfcmV2ZW51ZTogeyBsYWJlbDogJ0FubnVhbCBSZXZlbnVlJyB9LFxuICAgICAgbnVtYmVyX29mX2VtcGxveWVlczogeyBsYWJlbDogJ051bWJlciBvZiBFbXBsb3llZXMnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ05vdGVzJywgaGVscDogJ1dvcmtpbmcgbm90ZXMgb24gdGhpcyBsZWFkIFx1MjAxNCBzdXBwb3J0cyBmb3JtYXR0aW5nLicgfSxcbiAgICAgIGRvX25vdF9jYWxsOiB7IGxhYmVsOiAnRG8gTm90IENhbGwnIH0sXG4gICAgICBlbWFpbF9vcHRfb3V0OiB7IGxhYmVsOiAnRW1haWwgT3B0IE91dCcgfSxcbiAgICAgIGRpc3F1YWxpZmljYXRpb25fcmVhc29uOiB7XG4gICAgICAgIGxhYmVsOiAnRGlzcXVhbGlmaWNhdGlvbiBSZWFzb24nLFxuICAgICAgICBoZWxwOiAnUmVxdWlyZWQgd2hlbiBzdGF0dXMgaXMgVW5xdWFsaWZpZWQnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbm90X2FfZml0OiAnTm90IGEgRml0Jywgbm9fYnVkZ2V0OiAnTm8gQnVkZ2V0Jywgd3JvbmdfcGVyc29uYTogJ1dyb25nIFBlcnNvbmEnLFxuICAgICAgICAgIHVucmVhY2hhYmxlOiAnVW5yZWFjaGFibGUnLCBkdXBsaWNhdGU6ICdEdXBsaWNhdGUnLCBjb21wZXRpdG9yOiAnQ29tcGV0aXRvcicsXG4gICAgICAgICAgb3RoZXI6ICdPdGhlcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZHVwbGljYXRlX29mX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdEdXBsaWNhdGUgT2YnLFxuICAgICAgICBoZWxwOiAnV2hpY2ggb2JqZWN0IGhvbGRzIHRoZSBzdXJ2aXZpbmcgcmVjb3JkIHRoaXMgbGVhZCByZXBlYXRzLicsXG4gICAgICAgIC8vIGBlcmFzZWRgIGlzIGEgdG9tYnN0b25lLCBub3QgYSBjaG9pY2U6IHRoZSBmb3JtIGRvZXMgbm90IG9mZmVyIGl0XG4gICAgICAgIC8vIChzZWUgYHNyYy9zYWxlcy92aWV3cy9sZWFkLnZpZXcudHNgKSwgYnV0IGEgbGVhZCB3aG9zZSBzdXJ2aXZvciB3YXNcbiAgICAgICAgLy8gZGVsZXRlZCBjYXJyaWVzIGl0LCBzbyBpdCBuZWVkcyBhIGxhYmVsIHdoZXJldmVyIHRoZSByZWNvcmQgaXNcbiAgICAgICAgLy8gUkVBRCBcdTIwMTQgZGV0YWlsIHBhZ2UsIGxpc3QgY29sdW1uLCBleHBvcnQuIFVudHJhbnNsYXRlZCBpdCB3b3VsZFxuICAgICAgICAvLyByZW5kZXIgYXMgdGhlIHJhdyBgZXJhc2VkYC5cbiAgICAgICAgb3B0aW9uczogeyBjcm1fbGVhZDogJ0xlYWQnLCBjcm1fY29udGFjdDogJ0NvbnRhY3QnLCBlcmFzZWQ6ICdFcmFzZWQgUmVjb3JkJyB9LFxuICAgICAgfSxcbiAgICAgIGR1cGxpY2F0ZV9vZl9sZWFkOiB7IGxhYmVsOiAnRHVwbGljYXRlIE9mIExlYWQnIH0sXG4gICAgICBkdXBsaWNhdGVfb2ZfY29udGFjdDogeyBsYWJlbDogJ0R1cGxpY2F0ZSBPZiBDb250YWN0JyB9LFxuICAgICAgZHVwbGljYXRlX3N0YXR1czoge1xuICAgICAgICBsYWJlbDogJ0R1cGxpY2F0ZSBTdGF0dXMnLFxuICAgICAgICBoZWxwOiAnU3VzcGVjdGVkID0gZmxhZ2dlZCBhdXRvbWF0aWNhbGx5IGF0IGludGFrZS4gQ29uZmlybWVkID0gYSBodW1hbiB2ZXJpZmllZCB0aGUgbWF0Y2guJyxcbiAgICAgICAgb3B0aW9uczogeyBzdXNwZWN0ZWQ6ICdTdXNwZWN0ZWQnLCBjb25maXJtZWQ6ICdDb25maXJtZWQnIH0sXG4gICAgICB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ0Rpc3BsYXkgVGl0bGUnIH0sXG4gICAgICBjb21wYW55X25vcm1hbGl6ZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdDb21wYW55IChOb3JtYWxpemVkKScsXG4gICAgICAgIGhlbHA6ICdNYXRjaCBrZXkgZm9yIGxlYWQgY29udmVyc2lvbjogQ29tcGFueSBsb3dlci1jYXNlZCwgdHJpbW1lZCwgd2l0aCBpbnRlcm5hbCB3aGl0ZXNwYWNlIGNvbGxhcHNlZC4gTWFpbnRhaW5lZCBieSB0aGUgbGVhZF9kdXBsaWNhdGVfY2hlY2sgaG9vayBcdTIwMTQgbmV2ZXIgZWRpdCBkaXJlY3RseS4nLFxuICAgICAgfSxcbiAgICAgIG5leHRfZm9sbG93dXBfZGF0ZTogeyBsYWJlbDogJ05leHQgRm9sbG93LXVwIERhdGUnIH0sXG4gICAgICBsYXN0X2NvbnRhY3RlZF9kYXRlOiB7IGxhYmVsOiAnTGFzdCBDb250YWN0ZWQnIH0sXG4gICAgICBuZWVkX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdOZWVkIFR5cGUnLFxuICAgICAgICBoZWxwOiAnV2hhdCB0aGlzIHByb3NwZWN0IGlzIGFza2luZyBmb3IuIFJvdXRpbmcsIHByaW9yaXRpc2F0aW9uIGFuZCBkZW1hbmQgcmVwb3J0aW5nIHJlYWQgdGhpcy4nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbmV3X2ltcGxlbWVudGF0aW9uOiAnTmV3IEltcGxlbWVudGF0aW9uJywgZXhwYW5zaW9uOiAnRXhwYW5zaW9uJyxcbiAgICAgICAgICByZXBsYWNlbWVudDogJ1JlcGxhY2VtZW50JywgcmVuZXdhbDogJ1JlbmV3YWwnLCBjb25zdWx0aW5nOiAnQ29uc3VsdGluZycsXG4gICAgICAgICAgc3VwcG9ydDogJ1N1cHBvcnQgJiBNYWludGVuYW5jZScsIG90aGVyOiAnT3RoZXInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGVzdGltYXRlZF9hbW91bnQ6IHtcbiAgICAgICAgbGFiZWw6ICdFc3RpbWF0ZWQgQW1vdW50JyxcbiAgICAgICAgaGVscDogJ0VzdGltYXRlZCB2YWx1ZSBvZiB0aGlzIGRlbWFuZCwgYmVmb3JlIHF1YWxpZmljYXRpb24uIFByZWZpbGxzIHRoZSBkZWFsIGFtb3VudCBhdCBjb252ZXJzaW9uLicsXG4gICAgICB9LFxuICAgICAgY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdDb252ZXJzaW9uIEFwcHJvdmFsJyxcbiAgICAgICAgaGVscDogJ1doZXRoZXIgdGhpcyBsZWFkIGhhcyBiZWVuIHNpZ25lZCBvZmYgZm9yIGNvbnZlcnNpb24uIE5vdCBSZXF1aXJlZCBtZWFucyBubyBhcHByb3ZhbCBpcyBhc2tlZCBmb3IgXHUyMDE0IHRoZSBzaGlwcGVkIGRlZmF1bHQuJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5vdF9yZXF1aXJlZDogJ05vdCBSZXF1aXJlZCcsIHBlbmRpbmc6ICdQZW5kaW5nJyxcbiAgICAgICAgICBhcHByb3ZlZDogJ0FwcHJvdmVkJywgcmVqZWN0ZWQ6ICdSZWplY3RlZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfbGVhZHM6IHtcbiAgICAgICAgbGFiZWw6ICdBbGwgTGVhZHMnLFxuICAgICAgICBlbXB0eVN0YXRlOiB7IHRpdGxlOiAnTm8gTGVhZHMgWWV0JywgbWVzc2FnZTogJ0dldCBzdGFydGVkIGJ5IGNyZWF0aW5nIHlvdXIgZmlyc3QgbGVhZCcgfSxcbiAgICAgIH0sXG4gICAgICBrYW5iYW5fYnlfc3RhdHVzOiB7IGxhYmVsOiAnTGVhZCBQaXBlbGluZScgfSxcbiAgICAgIGNhbGVuZGFyX2J5X2NyZWF0ZWQ6IHsgbGFiZWw6ICdMZWFkIENhbGVuZGFyJyB9LFxuICAgICAgZ2FsbGVyeV92aWV3OiB7IGxhYmVsOiAnTGVhZCBDYXJkcycgfSxcbiAgICAgIG15X2xlYWRzOiB7IGxhYmVsOiAnTXkgTGVhZHMnIH0sXG4gICAgICBoaWdoX3ByaW9yaXR5OiB7IGxhYmVsOiAnSGlnaCBQcmlvcml0eScgfSxcbiAgICAgIGhvdF9sZWFkczogeyBsYWJlbDogJ1x1RDgzRFx1REQyNSBIb3QgTGVhZHMnIH0sXG4gICAgICBzdXNwZWN0ZWRfZHVwbGljYXRlczoge1xuICAgICAgICBsYWJlbDogJ1N1c3BlY3RlZCBEdXBsaWNhdGVzJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnTm8gU3VzcGVjdGVkIER1cGxpY2F0ZXMnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdOb3RoaW5nIHRvIHJldmlldyBcdTIwMTQgZXZlcnkgcmUtY2FwdHVyZWQgZW1haWwgaGFzIGJlZW4gY2hlY2tlZC4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgaWRlbnRpdHk6IHsgbGFiZWw6ICdJZGVudGl0eScgfSxcbiAgICAgIGNvbXBhbnlfaW5mbzogeyBsYWJlbDogJ0NvbXBhbnkgSW5mb3JtYXRpb24nIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdDb250YWN0IEluZm9ybWF0aW9uJyB9LFxuICAgICAgcXVhbGlmaWNhdGlvbjogeyBsYWJlbDogJ1F1YWxpZmljYXRpb24nIH0sXG4gICAgICBhc3NpZ25tZW50OiB7IGxhYmVsOiAnQXNzaWdubWVudCcgfSxcbiAgICAgIGFkZHJlc3M6IHsgbGFiZWw6ICdBZGRyZXNzJyB9LFxuICAgICAgYWRkaXRpb25hbDogeyBsYWJlbDogJ0FkZGl0aW9uYWwgSW5mbycgfSxcbiAgICAgIHByZWZlcmVuY2VzOiB7IGxhYmVsOiAnQ29tbXVuaWNhdGlvbiBQcmVmZXJlbmNlcycgfSxcbiAgICAgIGNvbnZlcnNpb246IHsgbGFiZWw6ICdDb252ZXJzaW9uJyB9LFxuICAgICAgZHVwbGljYXRlczogeyBsYWJlbDogJ0R1cGxpY2F0ZSBNYW5hZ2VtZW50JyB9LFxuICAgICAgLy8gVGhlIGRldGFpbCBwYWdlJ3Mgc2VjdGlvbnMgcmVmZXJlbmNlIHRoZSBncm91cHMgYWJvdmUgKCM4MDYpLCBzbyBpdFxuICAgICAgLy8gaGFzIG5vIHNlY3Rpb24gbmFtZXMgb2YgaXRzIG93bi5cbiAgICAgIC8vIEZvcm0gc2VjdGlvbiBuYW1lcyBvbiBsZWFkLnZpZXcudHMgKCMxMTAwKS4gVGhlIHNlY3Rpb25zIG9mIHRoZVxuICAgICAgLy8gZGVmYXVsdCBmb3JtIGFuZCBvZiBldmVyeSBuYW1lZCBmb3JtVmlldyBsaXZlIGhlcmUgXHUyMDE0IGFkZCBhIGZvcm1cbiAgICAgIC8vIHRoZXJlLCBhZGQgaXRzIHNlY3Rpb24gbmFtZXMgaGVyZS4gYGFkZHJlc3NgIC8gYHF1YWxpZmljYXRpb25gIGFib3ZlXG4gICAgICAvLyBhcmUgcmV1c2VkIChpZGVudGljYWwgZmllbGRHcm91cCB3b3JkaW5nKTsgZXZlcnkgb3RoZXIgbmFtZSBoZXJlIGlzIG5ldy5cbiAgICAgIGNvbnRhY3RfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdDb250YWN0IEluZm9ybWF0aW9uJyB9LFxuICAgICAgbGVhZF9jbGFzc2lmaWNhdGlvbjogeyBsYWJlbDogJ0xlYWQgQ2xhc3NpZmljYXRpb24nIH0sXG4gICAgICBjb21wYW55X2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnQ29tcGFueSBJbmZvcm1hdGlvbicgfSxcbiAgICAgIGFkZGl0aW9uYWxfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdBZGRpdGlvbmFsIEluZm9ybWF0aW9uJyB9LFxuICAgICAgcHJpdmFjeTogeyBsYWJlbDogJ1ByaXZhY3knIH0sXG4gICAgICBnZW5lcmFsOiB7IGxhYmVsOiAnR2VuZXJhbCcgfSxcbiAgICAgIGRldGFpbHM6IHsgbGFiZWw6ICdEZXRhaWxzJyB9LFxuICAgICAgc3RlcF8xX2NvbnRhY3RfZGV0YWlsczogeyBsYWJlbDogJ1N0ZXAgMTogQ29udGFjdCBEZXRhaWxzJyB9LFxuICAgICAgc3RlcF8yX2NvbXBhbnlfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdTdGVwIDI6IENvbXBhbnkgSW5mb3JtYXRpb24nIH0sXG4gICAgICBzdGVwXzNfcXVhbGlmaWNhdGlvbjogeyBsYWJlbDogJ1N0ZXAgMzogUXVhbGlmaWNhdGlvbicgfSxcbiAgICAgIHN0ZXBfNF9yZXZpZXdfYW5kX2NvbnZlcnQ6IHsgbGFiZWw6ICdTdGVwIDQ6IFJldmlldyAmIENvbnZlcnQnIH0sXG4gICAgICBwcmltYXJ5X2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnUHJpbWFyeSBJbmZvcm1hdGlvbicgfSxcbiAgICAgIGV4dGVuZGVkX2RldGFpbHM6IHsgbGFiZWw6ICdFeHRlbmRlZCBEZXRhaWxzJyB9LFxuICAgICAgcXVpY2tfZWRpdDogeyBsYWJlbDogJ1F1aWNrIEVkaXQnIH0sXG4gICAgICB1cGRhdGVfbGVhZF9zdGF0dXM6IHsgbGFiZWw6ICdVcGRhdGUgTGVhZCBTdGF0dXMnIH0sXG4gICAgICB0ZWxsX3VzX2Fib3V0X3lvdXJzZWxmOiB7IGxhYmVsOiAnVGVsbCB1cyBhYm91dCB5b3Vyc2VsZicgfSxcbiAgICAgIGFib3V0X3lvdXJfY29tcGFueTogeyBsYWJlbDogJ0Fib3V0IHlvdXIgY29tcGFueScgfSxcbiAgICAgIGhvd19jYW5fd2VfaGVscDogeyBsYWJlbDogJ0hvdyBjYW4gd2UgaGVscD8nIH0sXG4gICAgICBsZWFkX2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnTGVhZCBJbmZvcm1hdGlvbicgfSxcbiAgICAgIGFkZHJlc3NfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdBZGRyZXNzIEluZm9ybWF0aW9uJyB9LFxuICAgICAgcHJpdmFjeV9wcmVmZXJlbmNlczogeyBsYWJlbDogJ1ByaXZhY3kgUHJlZmVyZW5jZXMnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgY29udmVydF9sZWFkOiB7XG4gICAgICAgIGxhYmVsOiAnQ29udmVydCBMZWFkJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdMZWFkIGNvbnZlcnRlZCBzdWNjZXNzZnVsbHkhJyxcbiAgICAgIH0sXG4gICAgICBjcmVhdGVfY2FtcGFpZ246IHtcbiAgICAgICAgbGFiZWw6ICdBZGQgdG8gQ2FtcGFpZ24nLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ0xlYWRzIGFkZGVkIHRvIGNhbXBhaWduIScsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGNybV9jYW1wYWlnbjogeyBsYWJlbDogJ0NhbXBhaWduJyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNjaGVkdWxlX2ZvbGxvd3VwOiB7XG4gICAgICAgIGxhYmVsOiAnU2NoZWR1bGUgRm9sbG93LXVwJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdGb2xsb3ctdXAgc2NoZWR1bGVkLicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9vcHBvcnR1bml0eToge1xuICAgIGxhYmVsOiAnT3Bwb3J0dW5pdHknLFxuICAgIHBsdXJhbExhYmVsOiAnT3Bwb3J0dW5pdGllcycsXG4gICAgZmllbGRzOiB7XG4gICAgICBuYW1lOiB7IGxhYmVsOiAnT3Bwb3J0dW5pdHkgTmFtZScgfSxcbiAgICAgIGNybV9hY2NvdW50OiB7IGxhYmVsOiAnQWNjb3VudCcgfSxcbiAgICAgIHByaW1hcnlfY29udGFjdDogeyBsYWJlbDogJ1ByaW1hcnkgQ29udGFjdCcgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnT3Bwb3J0dW5pdHkgT3duZXInIH0sXG4gICAgICBhbW91bnQ6IHsgbGFiZWw6ICdBbW91bnQnIH0sXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiB7IGxhYmVsOiAnRXhwZWN0ZWQgUmV2ZW51ZScgfSxcbiAgICAgIHN0YWdlOiB7XG4gICAgICAgIGxhYmVsOiAnU3RhZ2UnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcHJvc3BlY3Rpbmc6ICdQcm9zcGVjdGluZycsIHF1YWxpZmljYXRpb246ICdRdWFsaWZpY2F0aW9uJyxcbiAgICAgICAgICBuZWVkc19hbmFseXNpczogJ05lZWRzIEFuYWx5c2lzJywgcHJvcG9zYWw6ICdQcm9wb3NhbCcsXG4gICAgICAgICAgbmVnb3RpYXRpb246ICdOZWdvdGlhdGlvbicsIGNsb3NlZF93b246ICdDbG9zZWQgV29uJywgY2xvc2VkX2xvc3Q6ICdDbG9zZWQgTG9zdCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcHJvYmFiaWxpdHk6IHsgbGFiZWw6ICdQcm9iYWJpbGl0eSAoJSknIH0sXG4gICAgICBjbG9zZV9kYXRlOiB7IGxhYmVsOiAnQ2xvc2UgRGF0ZScgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUeXBlJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ld19idXNpbmVzczogJ05ldyBCdXNpbmVzcycsXG4gICAgICAgICAgZXhpc3RpbmdfdXBncmFkZTogJ0V4aXN0aW5nIEN1c3RvbWVyIC0gVXBncmFkZScsXG4gICAgICAgICAgZXhpc3RpbmdfcmVuZXdhbDogJ0V4aXN0aW5nIEN1c3RvbWVyIC0gUmVuZXdhbCcsXG4gICAgICAgICAgZXhpc3RpbmdfZXhwYW5zaW9uOiAnRXhpc3RpbmcgQ3VzdG9tZXIgLSBFeHBhbnNpb24nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiB7XG4gICAgICAgIGxhYmVsOiAnRm9yZWNhc3QgQ2F0ZWdvcnknLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcGlwZWxpbmU6ICdQaXBlbGluZScsIGJlc3RfY2FzZTogJ0Jlc3QgQ2FzZScsXG4gICAgICAgICAgY29tbWl0OiAnQ29tbWl0Jywgb21pdHRlZDogJ09taXR0ZWQnLCBjbG9zZWQ6ICdDbG9zZWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcHRpb24nIH0sXG4gICAgICBuZXh0X3N0ZXA6IHsgbGFiZWw6ICdOZXh0IFN0ZXAnIH0sXG4gICAgICBsZWFkX3NvdXJjZToge1xuICAgICAgICBsYWJlbDogJ0xlYWQgU291cmNlJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHdlYjogJ1dlYicsIHJlZmVycmFsOiAnUmVmZXJyYWwnLCBldmVudDogJ0V2ZW50IC8gVHJhZGUgU2hvdycsXG4gICAgICAgICAgd2ViaW5hcjogJ1dlYmluYXInLCBwYXJ0bmVyOiAnUGFydG5lcicsIGFkdmVydGlzZW1lbnQ6ICdBZHZlcnRpc2VtZW50JyxcbiAgICAgICAgICBwYWlkX3NlYXJjaDogJ1BhaWQgU2VhcmNoJywgc29jaWFsOiAnU29jaWFsIE1lZGlhJywgY29udGVudDogJ0NvbnRlbnQgLyBCbG9nJyxcbiAgICAgICAgICBjb2xkX2NhbGw6ICdDb2xkIENhbGwnLCBlbWFpbF9jYW1wYWlnbjogJ0VtYWlsIENhbXBhaWduJywgb3RoZXI6ICdPdGhlcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnQ2FtcGFpZ24nLCBoZWxwOiAnTWFya2V0aW5nIGNhbXBhaWduIHRoYXQgZ2VuZXJhdGVkIHRoaXMgb3Bwb3J0dW5pdHknIH0sXG4gICAgICBkYXlzX2luX3N0YWdlOiB7IGxhYmVsOiAnRGF5cyBpbiBDdXJyZW50IFN0YWdlJyB9LFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZToge1xuICAgICAgICBsYWJlbDogJ1N0YWdlIEVudHJ5IERhdGUnLFxuICAgICAgICBoZWxwOiAnRGF0ZSB0aGlzIG9wcG9ydHVuaXR5IGVudGVyZWQgaXRzIGN1cnJlbnQgc3RhZ2UuJyxcbiAgICAgIH0sXG4gICAgICBpc19wcml2YXRlOiB7IGxhYmVsOiAnUHJpdmF0ZScgfSxcbiAgICAgIGFwcHJvdmFsX3N0YXR1czoge1xuICAgICAgICBsYWJlbDogJ0FwcHJvdmFsIFN0YXR1cycsXG4gICAgICAgIG9wdGlvbnM6IHsgbm90X3JlcXVpcmVkOiAnTm90IFJlcXVpcmVkJywgcGVuZGluZzogJ1BlbmRpbmcnLCBhcHByb3ZlZDogJ0FwcHJvdmVkJywgcmVqZWN0ZWQ6ICdSZWplY3RlZCcgfSxcbiAgICAgIH0sXG4gICAgICBhcHByb3ZlZF9kYXRlOiB7IGxhYmVsOiAnQXBwcm92ZWQgRGF0ZScgfSxcbiAgICAgIHdpbl9yZWFzb246IHtcbiAgICAgICAgbGFiZWw6ICdXaW4gUmVhc29uJyxcbiAgICAgICAgaGVscDogJ1doeSB0aGlzIGRlYWwgd2FzIHdvbi4gUmVxdWlyZWQgdG8gY2xvc2UgYW4gb3Bwb3J0dW5pdHkgYXMgV29uLicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBiZXR0ZXJfcHJvZHVjdDogJ0JldHRlciBQcm9kdWN0JywgYmV0dGVyX3ByaWNlOiAnQmV0dGVyIFByaWNlJywgcmVsYXRpb25zaGlwOiAnRXhpc3RpbmcgUmVsYXRpb25zaGlwJyxcbiAgICAgICAgICBiZXR0ZXJfc3VwcG9ydDogJ0JldHRlciBTdXBwb3J0JywgYmVzdF9maXQ6ICdCZXN0IEZpdCAvIEZlYXR1cmVzJyxcbiAgICAgICAgICBxdW90ZV9hY2NlcHRlZDogJ1F1b3RlIEFjY2VwdGVkJywgb3RoZXI6ICdPdGhlcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbG9zc19yZWFzb246IHtcbiAgICAgICAgbGFiZWw6ICdMb3NzIFJlYXNvbicsXG4gICAgICAgIGhlbHA6ICdXaHkgdGhpcyBkZWFsIHdhcyBsb3N0LiBSZXF1aXJlZCB0byBjbG9zZSBhbiBvcHBvcnR1bml0eSBhcyBMb3N0LicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwcmljZTogJ1ByaWNlIFRvbyBIaWdoJywgY29tcGV0aXRvcjogJ0xvc3QgdG8gQ29tcGV0aXRvcicsIG5vX2J1ZGdldDogJ05vIEJ1ZGdldCcsXG4gICAgICAgICAgbm9fZGVjaXNpb246ICdObyBEZWNpc2lvbicsIHRpbWluZzogJ0JhZCBUaW1pbmcnLCBmZWF0dXJlczogJ01pc3NpbmcgRmVhdHVyZXMnLCBvdGhlcjogJ090aGVyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBsb3NzX2RldGFpbHM6IHtcbiAgICAgICAgbGFiZWw6ICdMb3NzL1dpbiBEZXRhaWxzJyxcbiAgICAgICAgaGVscDogJ0ZyZWUtdGV4dCBjb250ZXh0IGJlaGluZCB0aGUgd2luIG9yIGxvc3MgcmVhc29uLicsXG4gICAgICB9LFxuICAgICAgLy8gUkVRLTAwMDYgXHUyMDE0IHF1YWxpZmljYXRpb24sIHRoZSBjdXN0b21lcidzIHByb2N1cmVtZW50IGNhbGVuZGFyLCB0aGVcbiAgICAgIC8vIGRlYWwgbmFycmF0aXZlLCB0aGUgYnVzaW5lc3MgbGluZSBhbmQgdGhlIHN0YXR1cy1jaGFuZ2UgZ2F0ZS5cbiAgICAgIHdpbGxfYmlkOiB7XG4gICAgICAgIGxhYmVsOiAnV2lsbCBCaWQnLFxuICAgICAgICBoZWxwOiAnV2hldGhlciB3ZSBpbnRlbmQgdG8gYmlkLiBVbnNldCBtZWFucyB0aGUgZGVjaXNpb24gaXMgb3Blbi4nLFxuICAgICAgfSxcbiAgICAgIGNvbnRyb2xsYWJpbGl0eTogeyBsYWJlbDogJ0NvbnRyb2xsYWJpbGl0eScsIG9wdGlvbnM6IHsgaGlnaDogJ0hpZ2gnLCBtZWRpdW06ICdNZWRpdW0nLCBsb3c6ICdMb3cnIH0gfSxcbiAgICAgIHByaW9yaXR5OiB7IGxhYmVsOiAnUHJpb3JpdHknLCBvcHRpb25zOiB7IGhpZ2g6ICdIaWdoJywgbWVkaXVtOiAnTWVkaXVtJywgbG93OiAnTG93JyB9IH0sXG4gICAgICBkZWFsX2xldmVsOiB7IGxhYmVsOiAnRGVhbCBMZXZlbCcsIG9wdGlvbnM6IHsgc3RyYXRlZ2ljOiAnU3RyYXRlZ2ljJywga2V5OiAnS2V5Jywgc3RhbmRhcmQ6ICdTdGFuZGFyZCcgfSB9LFxuICAgICAgaXNfc3ViY29udHJhY3RlZDogeyBsYWJlbDogJ0ludm9sdmVzIFN1YmNvbnRyYWN0aW5nJyB9LFxuICAgICAgc3ViY29udHJhY3Rpbmdfbm90ZTogeyBsYWJlbDogJ1N1YmNvbnRyYWN0aW5nIE5vdGUnIH0sXG4gICAgICBjdXN0b21lcl9pbml0aWF0aW9uX2RhdGU6IHsgbGFiZWw6ICdDdXN0b21lciBJbml0aWF0aW9uIERhdGUnIH0sXG4gICAgICBleHBlY3RlZF90ZW5kZXJfZGF0ZTogeyBsYWJlbDogJ0V4cGVjdGVkIFRlbmRlciBEYXRlJyB9LFxuICAgICAgZXhwZWN0ZWRfc2lnbmluZ19kYXRlOiB7IGxhYmVsOiAnRXhwZWN0ZWQgU2lnbmluZyBEYXRlJyB9LFxuICAgICAgZXhwZWN0ZWRfdGVuZGVyX2Ftb3VudDogeyBsYWJlbDogJ0V4cGVjdGVkIFRlbmRlciBBbW91bnQnIH0sXG4gICAgICBleHBlY3RlZF9zaWduaW5nX2Ftb3VudDogeyBsYWJlbDogJ0V4cGVjdGVkIFNpZ25pbmcgQW1vdW50JyB9LFxuICAgICAgYnVzaW5lc3NfbGluZToge1xuICAgICAgICBsYWJlbDogJ0J1c2luZXNzIExpbmUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcHJvZHVjdDogJ1Byb2R1Y3QnLCBzZXJ2aWNlczogJ1Byb2Zlc3Npb25hbCBTZXJ2aWNlcycsIGNvbnN1bHRpbmc6ICdDb25zdWx0aW5nJyxcbiAgICAgICAgICBzdXBwb3J0OiAnU3VwcG9ydCAmIE1haW50ZW5hbmNlJywgb3RoZXI6ICdPdGhlcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY3VzdG9tZXJfYmFja2dyb3VuZDogeyBsYWJlbDogJ0N1c3RvbWVyIEJhY2tncm91bmQnIH0sXG4gICAgICBwcm9qZWN0X2JhY2tncm91bmQ6IHsgbGFiZWw6ICdQcm9qZWN0IEJhY2tncm91bmQnIH0sXG4gICAgICByaXNrX2FuYWx5c2lzOiB7IGxhYmVsOiAnUmlzayBBbmFseXNpcycgfSxcbiAgICAgIHBheW1lbnRfdGVybXM6IHsgbGFiZWw6ICdQYXltZW50IFRlcm1zJyB9LFxuICAgICAgcmVxdWVzdGVkX3N0YXR1czogeyBsYWJlbDogJ1JlcXVlc3RlZCBTdGF0dXMnLCBvcHRpb25zOiB7IGNsb3NlZF93b246ICdXb24nLCBjbG9zZWRfbG9zdDogJ0xvc3QnIH0gfSxcbiAgICAgIHN0YXR1c19jaGFuZ2VfYXBwcm92YWxfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnU3RhdHVzIENoYW5nZSBBcHByb3ZhbCcsXG4gICAgICAgIG9wdGlvbnM6IHsgbm90X3JlcXVpcmVkOiAnTm90IFJlcXVpcmVkJywgcGVuZGluZzogJ1BlbmRpbmcnLCBhcHByb3ZlZDogJ0FwcHJvdmVkJywgcmVqZWN0ZWQ6ICdSZWplY3RlZCcgfSxcbiAgICAgIH0sXG4gICAgICAvLyBSRVEtMDAwNiBzdGVwIDExIFx1MjAxNCB0aGUgXHU3QUNCXHU5ODc5IChxdWFsaWZpY2F0aW9uKSBhcHByb3ZhbCBnYXRlLlxuICAgICAgcXVhbGlmaWNhdGlvbl9yZXF1ZXN0ZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdSZXF1ZXN0IFF1YWxpZmljYXRpb24gQXBwcm92YWwnLFxuICAgICAgICBoZWxwOiAnVGljayB0byBzZW5kIHRoaXMgZGVhbCBmb3IgcXVhbGlmaWNhdGlvbiBhcHByb3ZhbC4gQSByZWplY3Rpb24gY2xlYXJzIGl0OyB0aWNrIGl0IGFnYWluIHRvIGFzayBhZ2Fpbi4nLFxuICAgICAgfSxcbiAgICAgIHF1YWxpZmljYXRpb25fYXBwcm92YWxfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnUXVhbGlmaWNhdGlvbiBBcHByb3ZhbCcsXG4gICAgICAgIG9wdGlvbnM6IHsgbm90X3JlcXVpcmVkOiAnTm90IFJlcXVpcmVkJywgcGVuZGluZzogJ1BlbmRpbmcnLCBhcHByb3ZlZDogJ0FwcHJvdmVkJywgcmVqZWN0ZWQ6ICdSZWplY3RlZCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIHRlbmRlcl90aGlzX3F1YXJ0ZXI6IHtcbiAgICAgICAgbGFiZWw6ICdUZW5kZXIgVGhpcyBRdWFydGVyJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnTm8gVGVuZGVycyBFeHBlY3RlZCBUaGlzIFF1YXJ0ZXInLFxuICAgICAgICAgIG1lc3NhZ2U6ICdUaGlzIHRhYiBsaXN0cyBvcGVuIGRlYWxzIHdob3NlIGN1c3RvbWVyLXNpZGUgdGVuZGVyIGRhdGUgZmFsbHMgaW5zaWRlIHRoZSBjdXJyZW50IHF1YXJ0ZXIuIFJlY29yZCBFeHBlY3RlZCBUZW5kZXIgRGF0ZSBvbiBhIGRlYWwgdG8gc2VlIGl0IGhlcmUuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvcGVuX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdPcGVuIERlYWxzJyB9LFxuICAgICAgYWxsX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdBbGwgT3Bwb3J0dW5pdGllcycgfSxcbiAgICAgIHBpcGVsaW5lX2thbmJhbjogeyBsYWJlbDogJ1NhbGVzIFBpcGVsaW5lJyB9LFxuICAgICAgY2xvc2VfZGF0ZV9jYWxlbmRhcjogeyBsYWJlbDogJ0ZvcmVjYXN0IENhbGVuZGFyJyB9LFxuICAgICAgZGVhbF90aW1lbGluZTogeyBsYWJlbDogJ0RlYWwgVGltZWxpbmUnIH0sXG4gICAgICBkZWFsX2dhbGxlcnk6IHsgbGFiZWw6ICdEZWFsIENhcmRzJyB9LFxuICAgICAgbXlfb3Blbl9kZWFsczogeyBsYWJlbDogJ015IE9wZW4gRGVhbHMnIH0sXG4gICAgICBzdGFsZV9vcHBvcnR1bml0aWVzOiB7IGxhYmVsOiAnXHUyNkEwXHVGRTBGIFN0YWxlIE9wcG9ydHVuaXRpZXMgXHUwMEI3IExvbmdlc3QgaW4gU3RhZ2UgRmlyc3QnIH0sXG4gICAgICBjbG9zaW5nX3RoaXNfcXVhcnRlcjoge1xuICAgICAgICBsYWJlbDogJ0Nsb3NpbmcgVGhpcyBRdWFydGVyJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnTm8gRGVhbHMgQ2xvc2luZyBUaGlzIFF1YXJ0ZXInLFxuICAgICAgICAgIG1lc3NhZ2U6ICdUaGlzIHRhYiBsaXN0cyBvcGVuIGNvbW1pdCBhbmQgYmVzdC1jYXNlIGRlYWxzIHdpdGggYSBjbG9zZSBkYXRlIGluc2lkZSB0aGUgY3VycmVudCBxdWFydGVyLiBOb3RoaW5nIG1hdGNoZXMgcmlnaHQgbm93IFx1MjAxNCBkZWFscyBjbG9zaW5nIGxhdGVyIGFyZSBvbiB0aGUgT3BlbiBEZWFscyB0YWIuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnQmFzaWMgSW5mb3JtYXRpb24nIH0sXG4gICAgICBmaW5hbmNpYWxzOiB7IGxhYmVsOiAnRmluYW5jaWFscycgfSxcbiAgICAgIHNhbGVzX3Byb2Nlc3M6IHsgbGFiZWw6ICdTYWxlcyBQcm9jZXNzJyB9LFxuICAgICAgY2xhc3NpZmljYXRpb246IHsgbGFiZWw6ICdDbGFzc2lmaWNhdGlvbicgfSxcbiAgICAgIGNhbXBhaWduOiB7IGxhYmVsOiAnQ2FtcGFpZ25zJyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdOb3RlcyAmIE5leHQgU3RlcHMnIH0sXG4gICAgICBxdWFsaWZpY2F0aW9uOiB7IGxhYmVsOiAnUXVhbGlmaWNhdGlvbicgfSxcbiAgICAgIG5hcnJhdGl2ZTogeyBsYWJlbDogJ0RlYWwgTmFycmF0aXZlJyB9LFxuICAgICAgY3JtX2ZvcmVjYXN0OiB7IGxhYmVsOiAnRm9yZWNhc3QgJiBNZXRyaWNzJyB9LFxuICAgICAgLy8gVGhlIGRldGFpbCBwYWdlJ3Mgc2VjdGlvbnMgcmVmZXJlbmNlIHRoZSBncm91cHMgYWJvdmUgKCMxNDUyKSwgc28gaXRcbiAgICAgIC8vIGhhcyBubyBzZWN0aW9uIG5hbWVzIG9mIGl0cyBvd24uXG4gICAgICAvLyBGb3JtIHNlY3Rpb24gbmFtZXMgb24gb3Bwb3J0dW5pdHkudmlldy50cyAoIzExMDApXG4gICAgICBvdmVydmlldzogeyBsYWJlbDogJ092ZXJ2aWV3JyB9LFxuICAgICAgZm9yZWNhc3Q6IHsgbGFiZWw6ICdGb3JlY2FzdCcgfSxcbiAgICAgIHNhbGVzX3N0cmF0ZWd5OiB7IGxhYmVsOiAnU2FsZXMgU3RyYXRlZ3knIH0sXG4gICAgICB3aW5fbG9zczogeyBsYWJlbDogJ1dpbiAvIExvc3MnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgY2xvbmVfb3Bwb3J0dW5pdHk6IHtcbiAgICAgICAgbGFiZWw6ICdDbG9uZSBPcHBvcnR1bml0eScsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnT3Bwb3J0dW5pdHkgY2xvbmVkIHN1Y2Nlc3NmdWxseSEnLFxuICAgICAgfSxcbiAgICAgIG1hc3NfdXBkYXRlX3N0YWdlOiB7XG4gICAgICAgIGxhYmVsOiAnVXBkYXRlIFN0YWdlJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdPcHBvcnR1bml0aWVzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IScsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHN0YWdlOiB7IGxhYmVsOiAnTmV3IFN0YWdlJyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGdlbmVyYXRlX3F1b3RlOiB7XG4gICAgICAgIGxhYmVsOiAnR2VuZXJhdGUgUXVvdGUnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1F1b3RlIGNyZWF0ZWQgZnJvbSBvcHBvcnR1bml0eSEnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtOiB7XG4gICAgbGFiZWw6ICdPcHBvcnR1bml0eSBMaW5lIEl0ZW0nLFxuICAgIHBsdXJhbExhYmVsOiAnT3Bwb3J0dW5pdHkgTGluZSBJdGVtcycsXG4gICAgZGVzY3JpcHRpb246ICdQZXItcHJvZHVjdCBwcmljaW5nIGxpbmVzIHVuZGVyIGFuIG9wcG9ydHVuaXR5JyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNybV9vcHBvcnR1bml0eTogeyBsYWJlbDogJ09wcG9ydHVuaXR5JyB9LFxuICAgICAgY3JtX3Byb2R1Y3Q6IHsgbGFiZWw6ICdQcm9kdWN0JyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwdGlvbicgfSxcbiAgICAgIHF1YW50aXR5OiB7IGxhYmVsOiAnUXVhbnRpdHknIH0sXG4gICAgICBsaXN0X3ByaWNlOiB7IGxhYmVsOiAnTGlzdCBQcmljZScsIGhlbHA6IFwiQXV0by1wb3B1bGF0ZWQgZnJvbSB0aGUgcHJvZHVjdCdzIExpc3QgUHJpY2UuXCIgfSxcbiAgICAgIHVuaXRfcHJpY2U6IHtcbiAgICAgICAgbGFiZWw6ICdTYWxlcyBQcmljZScsXG4gICAgICAgIGhlbHA6ICdOZWdvdGlhdGVkIHVuaXQgcHJpY2UgKG1heSBkaWZmZXIgZnJvbSBsaXN0IHByaWNlKScsXG4gICAgICB9LFxuICAgICAgZGlzY291bnQ6IHsgbGFiZWw6ICdEaXNjb3VudCAlJyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdUb3RhbCcgfSxcbiAgICAgIGxpbmVfbnVtYmVyOiB7IGxhYmVsOiAnTGluZSAjJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0xpbmUgSXRlbScgfSxcbiAgICAgIHByaWNpbmc6IHsgbGFiZWw6ICdQcmljaW5nJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9mb3JlY2FzdDoge1xuICAgIGxhYmVsOiAnRm9yZWNhc3QnLFxuICAgIHBsdXJhbExhYmVsOiAnRm9yZWNhc3RzJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BlcmlvZGljIHBpcGVsaW5lIHNuYXBzaG90IGJ5IG93bmVyIHVzZWQgZm9yIHJldmVudWUgZm9yZWNhc3RpbmcnLFxuICAgIGZpZWxkczoge1xuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdPd25lcicgfSxcbiAgICAgIHBlcmlvZDogeyBsYWJlbDogJ1BlcmlvZCcsIG9wdGlvbnM6IHsgbW9udGg6ICdNb250aCcsIHF1YXJ0ZXI6ICdRdWFydGVyJyB9IH0sXG4gICAgICBwZXJpb2Rfc3RhcnQ6IHtcbiAgICAgICAgbGFiZWw6ICdQZXJpb2QgU3RhcnQnLFxuICAgICAgICBoZWxwOiAnTXVzdCBiZSB0aGUgZmlyc3QgZGF5IG9mIHRoZSBwZXJpb2QgXHUyMDE0IGUuZy4gMjAyNi0wOC0wMSBmb3IgQXVnIDIwMjYuIEEgcXVhcnRlcmx5IGZvcmVjYXN0IG11c3QgYWRkaXRpb25hbGx5IHN0YXJ0IG9uIGEgcXVhcnRlciBib3VuZGFyeTogSmFudWFyeSAxLCBBcHJpbCAxLCBKdWx5IDEgb3IgT2N0b2JlciAxLicsXG4gICAgICB9LFxuICAgICAgcGVyaW9kX2VuZDoge1xuICAgICAgICBsYWJlbDogJ1BlcmlvZCBFbmQnLFxuICAgICAgICBoZWxwOiAnTm9ybWFsbHkgZGVyaXZlZCBhdXRvbWF0aWNhbGx5IGZyb20gUGVyaW9kIGFuZCBQZXJpb2QgU3RhcnQuIElmIHNldCBieSBoYW5kLCBpdCBtdXN0IGJlIHRoZSBsYXN0IGRheSBvZiB0aGF0IHBlcmlvZCBcdTIwMTQgZS5nLiAyMDI2LTA5LTMwIGZvciBhIHF1YXJ0ZXIgc3RhcnRpbmcgMjAyNi0wNy0wMSwgb3IgMjAyNi0wOC0zMSBmb3IgQXVnIDIwMjYuJyxcbiAgICAgIH0sXG4gICAgICBwZXJpb2RfbGFiZWw6IHsgbGFiZWw6ICdQZXJpb2QnLCBoZWxwOiAnSHVtYW4tZnJpZW5kbHkgbGFiZWwsIGUuZy4gXCJRMyAyMDI2XCIgb3IgXCJBdWcgMjAyNlwiLicgfSxcbiAgICAgIHNuYXBzaG90X2RhdGU6IHsgbGFiZWw6ICdTbmFwc2hvdCBEYXRlJywgaGVscDogJ1RoZSBkYXkgdGhpcyBzbmFwc2hvdCB3YXMgY2FwdHVyZWQuJyB9LFxuICAgICAgc291cmNlOiB7XG4gICAgICAgIGxhYmVsOiAnU291cmNlJyxcbiAgICAgICAgb3B0aW9uczogeyBzY2hlZHVsZWQ6ICdTY2hlZHVsZWQgc25hcHNob3QnLCBhaTogJ0FJIHNraWxsJywgbWFudWFsOiAnTWFudWFsIGVudHJ5JyB9LFxuICAgICAgfSxcbiAgICAgIHF1b3RhOiB7IGxhYmVsOiAnUXVvdGEnIH0sXG4gICAgICBwaXBlbGluZV9hbW91bnQ6IHtcbiAgICAgICAgbGFiZWw6ICdQaXBlbGluZScsXG4gICAgICAgIGhlbHA6ICdTdW0gb2YgYWxsIG9wZW4gb3Bwb3J0dW5pdGllcyBjbG9zaW5nIGluIHRoaXMgcGVyaW9kIChhbnkgc3RhZ2UpLicsXG4gICAgICB9LFxuICAgICAgYmVzdF9jYXNlX2Ftb3VudDoge1xuICAgICAgICBsYWJlbDogJ0Jlc3QgQ2FzZScsXG4gICAgICAgIGhlbHA6ICdPcGVuIG9wcG9ydHVuaXRpZXMgaW4gdGhlIEJlc3QgQ2FzZSBvciBDb21taXQgZm9yZWNhc3QgY2F0ZWdvcnkuJyxcbiAgICAgIH0sXG4gICAgICBjb21taXRfYW1vdW50OiB7XG4gICAgICAgIGxhYmVsOiAnQ29tbWl0JyxcbiAgICAgICAgaGVscDogJ09wZW4gb3Bwb3J0dW5pdGllcyBpbiB0aGUgQ29tbWl0IGZvcmVjYXN0IGNhdGVnb3J5IChvd25lci1jb21taXR0ZWQpLicsXG4gICAgICB9LFxuICAgICAgY2xvc2VkX2Ftb3VudDogeyBsYWJlbDogJ0Nsb3NlZCBXb24nLCBoZWxwOiAnQWxyZWFkeS1jbG9zZWQtd29uIGFtb3VudCBpbiB0aGlzIHBlcmlvZC4nIH0sXG4gICAgICBleHBlY3RlZF9hbW91bnQ6IHtcbiAgICAgICAgbGFiZWw6ICdFeHBlY3RlZCcsXG4gICAgICAgIGhlbHA6ICdDbG9zZWQgV29uICsgQ29tbWl0IFx1MjAxNCB3aGF0IHRoZSBvd25lciByZWFzb25hYmx5IGV4cGVjdHMgdG8gbGFuZC4nLFxuICAgICAgfSxcbiAgICAgIGF0dGFpbm1lbnRfcGN0OiB7IGxhYmVsOiAnQXR0YWlubWVudCAlJywgaGVscDogJ0Nsb3NlZCBXb24gXHUwMEY3IFF1b3RhIFx1MDBENyAxMDAuIFJlYWRzIDAlIHVudGlsIGEgcG9zaXRpdmUgcXVvdGEgaXMgc2V0LicgfSxcbiAgICAgIGNvdmVyYWdlX3JhdGlvOiB7XG4gICAgICAgIGxhYmVsOiAnQ292ZXJhZ2UnLFxuICAgICAgICBoZWxwOiAnUGlwZWxpbmUgXHUwMEY3IChRdW90YSBcdTIyMTIgQ2xvc2VkIFdvbikgXHUyMDE0IHdoZXRoZXIgZW5vdWdoIHBpcGVsaW5lIHJlbWFpbnMgdG8gY292ZXIgdGhlIGdhcC4gUmVhZHMgMCBvbmNlIHRoZSBxdW90YSBpcyBhbHJlYWR5IG1ldC4nLFxuICAgICAgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnTm90ZXMnIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnRGlzcGxheSBUaXRsZScgfSxcbiAgICAgIHNlZWRfa2V5OiB7XG4gICAgICAgIGxhYmVsOiAnU2VlZCBLZXknLFxuICAgICAgICBoZWxwOiAnRGVtby1maXh0dXJlIGlkZW50aXR5LiBXcml0dGVuIG9ubHkgYnkgdGhlIHNlZWQgbG9hZGVyOyBlbXB0eSBvbiBldmVyeSByZWFsIHNuYXBzaG90LicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfZm9yZWNhc3RzOiB7IGxhYmVsOiAnQWxsIEZvcmVjYXN0cycgfSxcbiAgICAgIHRoaXNfcXVhcnRlcl9mb3JlY2FzdHM6IHtcbiAgICAgICAgbGFiZWw6ICdUaGlzIFF1YXJ0ZXInLFxuICAgICAgICBlbXB0eVN0YXRlOiB7XG4gICAgICAgICAgdGl0bGU6ICdUaGlzIFF1YXJ0ZXIgSGFzIE5vIFNuYXBzaG90cyBZZXQnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdRdWFydGVybHkgc25hcHNob3RzIGFyZSB3cml0dGVuIGJ5IHRoZSBuaWdodGx5IGZvcmVjYXN0IHN3ZWVwLiBVbnRpbCBpdCBoYXMgcnVuIG9uY2UgZm9yIHRoZSBjdXJyZW50IHF1YXJ0ZXIgdGhpcyB2aWV3IGlzIGVtcHR5IFx1MjAxNCBzZXR0bGVkIHF1YXJ0ZXJzIGFyZSBvbiB0aGUgQWxsIHRhYi4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG15X2ZvcmVjYXN0OiB7IGxhYmVsOiAnTXkgRm9yZWNhc3QnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnU25hcHNob3QnIH0sXG4gICAgICBhbW91bnRzOiB7IGxhYmVsOiAnQW1vdW50cycgfSxcbiAgICAgIG1ldGE6IHsgbGFiZWw6ICdTb3VyY2UnIH0sXG4gICAgICAvLyBGb3JtIHNlY3Rpb24gbmFtZXMgb24gZm9yZWNhc3Qudmlldy50cyAoIzExMDApLiBgYmFzaWNgJ3MgbGFiZWxcbiAgICAgIC8vIG1hdGNoZXMgXCJTbmFwc2hvdFwiIGJ1dCBpdHMga2V5IGRvZXMgbm90LCBzbyB0aGlzIGZvcm0gc2VjdGlvblxuICAgICAgLy8gbmVlZHMgaXRzIG93biBlbnRyeTsgYG5vdGVzYCBoYXMgbm8gZmllbGRHcm91cCBjb3VudGVycGFydCBhdCBhbGwuXG4gICAgICBzbmFwc2hvdDogeyBsYWJlbDogJ1NuYXBzaG90JyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdOb3RlcycgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9vYmplY3RzLmNvbW1lcmNlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lblwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vb2JqZWN0cy5jb21tZXJjZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG4vKipcbiAqIEVuZ2xpc2ggKGVuKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIENPTU1FUkNFIGZhbWlseTpcbiAqIHdoYXQgZ2V0cyBzb2xkIGFuZCBvbiB3aGF0IHBhcGVyIFx1MjAxNCBxdW90ZXMsIGNvbnRyYWN0cywgcHJvZHVjdHMuXG4gKlxuICogUm9zdGVyOiBgY3JtX3F1b3RlYCwgYGNybV9xdW90ZV9saW5lX2l0ZW1gLCBgY3JtX2NvbnRyYWN0YCwgYGNybV9wcm9kdWN0YC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBjb21tZXJjZTogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX3F1b3RlOiB7XG4gICAgbGFiZWw6ICdRdW90ZScsXG4gICAgcGx1cmFsTGFiZWw6ICdRdW90ZXMnLFxuICAgIGZpZWxkczoge1xuICAgICAgcXVvdGVfbnVtYmVyOiB7IGxhYmVsOiAnUXVvdGUgTnVtYmVyJyB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ1F1b3RlIE5hbWUnIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ0FjY291bnQnIH0sXG4gICAgICBjcm1fY29udGFjdDoge1xuICAgICAgICBsYWJlbDogJ0NvbnRhY3QnLFxuICAgICAgICBoZWxwOiAnUmVxdWlyZWQgb25jZSB0aGUgcXVvdGUgaXMgUHJlc2VudGVkIG9yIEFjY2VwdGVkIFx1MjAxNCB0aGUgZHJhZnRlZCBjb250cmFjdCB0YWtlcyBpdHMgUHJpbWFyeSBDb250YWN0IGZyb20gaGVyZS4nLFxuICAgICAgfSxcbiAgICAgIGNybV9vcHBvcnR1bml0eTogeyBsYWJlbDogJ09wcG9ydHVuaXR5JyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdRdW90ZSBPd25lcicgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1N0YXR1cycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkcmFmdDogJ0RyYWZ0JywgaW5fcmV2aWV3OiAnSW4gUmV2aWV3JywgcHJlc2VudGVkOiAnUHJlc2VudGVkJyxcbiAgICAgICAgICBhY2NlcHRlZDogJ0FjY2VwdGVkJywgcmVqZWN0ZWQ6ICdSZWplY3RlZCcsIGV4cGlyZWQ6ICdFeHBpcmVkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBxdW90ZV9kYXRlOiB7IGxhYmVsOiAnUXVvdGUgRGF0ZScgfSxcbiAgICAgIGV4cGlyYXRpb25fZGF0ZTogeyBsYWJlbDogJ0V4cGlyYXRpb24gRGF0ZScgfSxcbiAgICAgIHN1YnRvdGFsOiB7IGxhYmVsOiAnU3VidG90YWwnIH0sXG4gICAgICBkaXNjb3VudDogeyBsYWJlbDogJ0Rpc2NvdW50ICUnIH0sXG4gICAgICBkaXNjb3VudF9hbW91bnQ6IHsgbGFiZWw6ICdEaXNjb3VudCBBbW91bnQnIH0sXG4gICAgICB0YXg6IHsgbGFiZWw6ICdUYXgnIH0sXG4gICAgICBzaGlwcGluZ19oYW5kbGluZzogeyBsYWJlbDogJ1NoaXBwaW5nICYgSGFuZGxpbmcnIH0sXG4gICAgICB0b3RhbF9wcmljZTogeyBsYWJlbDogJ1RvdGFsIFByaWNlJyB9LFxuICAgICAgcGF5bWVudF90ZXJtczoge1xuICAgICAgICBsYWJlbDogJ1BheW1lbnQgVGVybXMnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbmV0XzE1OiAnTmV0IDE1JywgbmV0XzMwOiAnTmV0IDMwJywgbmV0XzYwOiAnTmV0IDYwJyxcbiAgICAgICAgICBuZXRfOTA6ICdOZXQgOTAnLCBkdWVfb25fcmVjZWlwdDogJ0R1ZSBvbiBSZWNlaXB0JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzaGlwcGluZ190ZXJtczogeyBsYWJlbDogJ1NoaXBwaW5nIFRlcm1zJyB9LFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnQmlsbGluZyBBZGRyZXNzJyB9LFxuICAgICAgc2hpcHBpbmdfYWRkcmVzczogeyBsYWJlbDogJ1NoaXBwaW5nIEFkZHJlc3MnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXB0aW9uJyB9LFxuICAgICAgaW50ZXJuYWxfbm90ZXM6IHsgbGFiZWw6ICdJbnRlcm5hbCBOb3RlcycgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdEaXNwbGF5IFRpdGxlJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfcXVvdGVzOiB7IGxhYmVsOiAnQWxsIFF1b3RlcycgfSxcbiAgICAgIHF1b3RlX3BpcGVsaW5lOiB7IGxhYmVsOiAnUXVvdGUgUGlwZWxpbmUnIH0sXG4gICAgICBxdW90ZV9jYWxlbmRhcjogeyBsYWJlbDogJ1F1b3RlIENhbGVuZGFyJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1F1b3RlIEluZm9ybWF0aW9uJyB9LFxuICAgICAgcHJpY2luZzogeyBsYWJlbDogJ1ByaWNpbmcnIH0sXG4gICAgICB0ZXJtczogeyBsYWJlbDogJ1Rlcm1zICYgVmFsaWRpdHknIH0sXG4gICAgICBhZGRyZXNzOiB7IGxhYmVsOiAnQWRkcmVzc2VzJyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnU3lzdGVtJyB9LFxuICAgICAgLy8gRm9ybSBzZWN0aW9uIG5hbWVzIG9uIHF1b3RlLnZpZXcudHMgKCMxMTAwKS4gYHF1b3RlX3Rlcm1zYCwgbm90XG4gICAgICAvLyBgdGVybXNgIFx1MjAxNCBgdGVybXNgIGlzIGFscmVhZHkgdGhlIGZpZWxkR3JvdXAga2V5IGZvciBcIlRlcm1zICYgVmFsaWRpdHlcIi5cbiAgICAgIHF1b3RlOiB7IGxhYmVsOiAnUXVvdGUnIH0sXG4gICAgICB0b3RhbHM6IHsgbGFiZWw6ICdUb3RhbHMnIH0sXG4gICAgICBxdW90ZV90ZXJtczogeyBsYWJlbDogJ1Rlcm1zJyB9LFxuICAgICAgYWRkcmVzc2VzX2FuZF9ub3RlczogeyBsYWJlbDogJ0FkZHJlc3NlcyAmIE5vdGVzJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9xdW90ZV9saW5lX2l0ZW06IHtcbiAgICBsYWJlbDogJ1F1b3RlIExpbmUgSXRlbScsXG4gICAgcGx1cmFsTGFiZWw6ICdRdW90ZSBMaW5lIEl0ZW1zJyxcbiAgICBkZXNjcmlwdGlvbjogJ1Blci1wcm9kdWN0IHByaWNpbmcgbGluZXMgdW5kZXIgYSBxdW90ZScsXG4gICAgZmllbGRzOiB7XG4gICAgICBjcm1fcXVvdGU6IHsgbGFiZWw6ICdRdW90ZScgfSxcbiAgICAgIGNybV9wcm9kdWN0OiB7IGxhYmVsOiAnUHJvZHVjdCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcHRpb24nIH0sXG4gICAgICBxdWFudGl0eTogeyBsYWJlbDogJ1F1YW50aXR5JyB9LFxuICAgICAgbGlzdF9wcmljZTogeyBsYWJlbDogJ0xpc3QgUHJpY2UnIH0sXG4gICAgICB1bml0X3ByaWNlOiB7IGxhYmVsOiAnU2FsZXMgUHJpY2UnIH0sXG4gICAgICBkaXNjb3VudDogeyBsYWJlbDogJ0Rpc2NvdW50ICUnIH0sXG4gICAgICBzdWJ0b3RhbDogeyBsYWJlbDogJ1N1YnRvdGFsJyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdUb3RhbCcgfSxcbiAgICAgIGxpbmVfbnVtYmVyOiB7IGxhYmVsOiAnTGluZSAjJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0xpbmUgSXRlbScgfSxcbiAgICAgIHByaWNpbmc6IHsgbGFiZWw6ICdQcmljaW5nJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9jb250cmFjdDoge1xuICAgIGxhYmVsOiAnQ29udHJhY3QnLFxuICAgIHBsdXJhbExhYmVsOiAnQ29udHJhY3RzJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNvbnRyYWN0X251bWJlcjogeyBsYWJlbDogJ0NvbnRyYWN0IE51bWJlcicgfSxcbiAgICAgIGNybV9hY2NvdW50OiB7IGxhYmVsOiAnQWNjb3VudCcgfSxcbiAgICAgIGNybV9jb250YWN0OiB7IGxhYmVsOiAnUHJpbWFyeSBDb250YWN0JyB9LFxuICAgICAgY3JtX29wcG9ydHVuaXR5OiB7IGxhYmVsOiAnUmVsYXRlZCBPcHBvcnR1bml0eScgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnQ29udHJhY3QgT3duZXInIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZHJhZnQ6ICdEcmFmdCcsIGluX2FwcHJvdmFsOiAnSW4gQXBwcm92YWwnLCBhY3RpdmF0ZWQ6ICdBY3RpdmF0ZWQnLFxuICAgICAgICAgIGV4cGlyZWQ6ICdFeHBpcmVkJywgdGVybWluYXRlZDogJ1Rlcm1pbmF0ZWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNvbnRyYWN0X3Rlcm1fbW9udGhzOiB7IGxhYmVsOiAnQ29udHJhY3QgVGVybSAoTW9udGhzKScgfSxcbiAgICAgIHN0YXJ0X2RhdGU6IHsgbGFiZWw6ICdTdGFydCBEYXRlJyB9LFxuICAgICAgZW5kX2RhdGU6IHsgbGFiZWw6ICdFbmQgRGF0ZScgfSxcbiAgICAgIGNvbnRyYWN0X3ZhbHVlOiB7IGxhYmVsOiAnQ29udHJhY3QgVmFsdWUnIH0sXG4gICAgICBiaWxsaW5nX2ZyZXF1ZW5jeToge1xuICAgICAgICBsYWJlbDogJ0JpbGxpbmcgRnJlcXVlbmN5JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1vbnRobHk6ICdNb250aGx5JywgcXVhcnRlcmx5OiAnUXVhcnRlcmx5JyxcbiAgICAgICAgICBhbm51YWxseTogJ0FubnVhbGx5Jywgb25lX3RpbWU6ICdPbmUtdGltZScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcGF5bWVudF90ZXJtczoge1xuICAgICAgICBsYWJlbDogJ1BheW1lbnQgVGVybXMnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbmV0XzE1OiAnTmV0IDE1JywgbmV0XzMwOiAnTmV0IDMwJywgbmV0XzYwOiAnTmV0IDYwJyxcbiAgICAgICAgICBuZXRfOTA6ICdOZXQgOTAnLCBkdWVfb25fcmVjZWlwdDogJ0R1ZSBvbiBSZWNlaXB0JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhdXRvX3JlbmV3YWw6IHsgbGFiZWw6ICdBdXRvIFJlbmV3YWwnIH0sXG4gICAgICByZW5ld2FsX25vdGljZV9kYXlzOiB7IGxhYmVsOiAnUmVuZXdhbCBOb3RpY2UgKERheXMpJyB9LFxuICAgICAgY29udHJhY3RfdHlwZToge1xuICAgICAgICBsYWJlbDogJ0NvbnRyYWN0IFR5cGUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uOiAnU3Vic2NyaXB0aW9uJywgc2VydmljZTogJ1NlcnZpY2UgQWdyZWVtZW50JywgbGljZW5zZTogJ0xpY2Vuc2UnLFxuICAgICAgICAgIHBhcnRuZXJzaGlwOiAnUGFydG5lcnNoaXAnLCBuZGE6ICdOREEnLCBtc2E6ICdNU0EnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNpZ25lZF9kYXRlOiB7IGxhYmVsOiAnU2lnbmVkIERhdGUnIH0sXG4gICAgICBzaWduZWRfYnk6IHsgbGFiZWw6ICdTaWduZWQgQnknIH0sXG4gICAgICBkb2N1bWVudF91cmw6IHsgbGFiZWw6ICdDb250cmFjdCBEb2N1bWVudCcgfSxcbiAgICAgIHNwZWNpYWxfdGVybXM6IHsgbGFiZWw6ICdTcGVjaWFsIFRlcm1zJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwdGlvbicgfSxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBsYWJlbDogJ0JpbGxpbmcgQWRkcmVzcycgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2NvbnRyYWN0czogeyBsYWJlbDogJ0FsbCBDb250cmFjdHMnIH0sXG4gICAgICByZW5ld2FsX2NhbGVuZGFyOiB7IGxhYmVsOiAnUmVuZXdhbCBDYWxlbmRhcicgfSxcbiAgICAgIGNvbnRyYWN0X2dhbnR0OiB7IGxhYmVsOiAnQ29udHJhY3QgVGVybXMnIH0sXG4gICAgICBjb250cmFjdF90aW1lbGluZTogeyBsYWJlbDogJ0NvbnRyYWN0IFRpbWVsaW5lJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0NvbnRyYWN0IEluZm9ybWF0aW9uJyB9LFxuICAgICAgcGFydGllczogeyBsYWJlbDogJ1BhcnRpZXMnIH0sXG4gICAgICB0ZXJtczogeyBsYWJlbDogJ1Rlcm1zICYgRGF0ZXMnIH0sXG4gICAgICB2YWx1ZTogeyBsYWJlbDogJ0NvbnRyYWN0IFZhbHVlJyB9LFxuICAgICAgc3RhdHVzOiB7IGxhYmVsOiAnU3RhdHVzICYgQXBwcm92YWwnIH0sXG4gICAgICByZW5ld2FsOiB7IGxhYmVsOiAnUmVuZXdhbCcgfSxcbiAgICAgIC8vIEZvcm0gc2VjdGlvbiBuYW1lcyBvbiBjb250cmFjdC52aWV3LnRzICgjMTEwMCkuIGBjb250cmFjdF90ZXJtc2AsXG4gICAgICAvLyBub3QgYHRlcm1zYCBcdTIwMTQgYHRlcm1zYCBpcyBhbHJlYWR5IHRoZSBmaWVsZEdyb3VwIGtleSBmb3IgXCJUZXJtcyAmIERhdGVzXCIuXG4gICAgICBjb250cmFjdF90ZXJtczogeyBsYWJlbDogJ1Rlcm1zJyB9LFxuICAgICAgc2lnbmluZ19hbmRfZG9jdW1lbnRzOiB7IGxhYmVsOiAnU2lnbmluZyAmIERvY3VtZW50cycgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnTm90ZXMnIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX3Byb2R1Y3Q6IHtcbiAgICBsYWJlbDogJ1Byb2R1Y3QnLFxuICAgIHBsdXJhbExhYmVsOiAnUHJvZHVjdHMnLFxuICAgIGZpZWxkczoge1xuICAgICAgcHJvZHVjdF9jb2RlOiB7IGxhYmVsOiAnUHJvZHVjdCBDb2RlJyB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ1Byb2R1Y3QgTmFtZScgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcHRpb24nIH0sXG4gICAgICBjYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ0NhdGVnb3J5JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHNvZnR3YXJlOiAnU29mdHdhcmUnLCBoYXJkd2FyZTogJ0hhcmR3YXJlJywgc2VydmljZTogJ1NlcnZpY2UnLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbjogJ1N1YnNjcmlwdGlvbicsIHN1cHBvcnQ6ICdTdXBwb3J0JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmYW1pbHk6IHtcbiAgICAgICAgbGFiZWw6ICdQcm9kdWN0IEZhbWlseScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBlbnRlcnByaXNlOiAnRW50ZXJwcmlzZSBTb2x1dGlvbnMnLCBzbWI6ICdTTUIgU29sdXRpb25zJyxcbiAgICAgICAgICBzZXJ2aWNlczogJ1Byb2Zlc3Npb25hbCBTZXJ2aWNlcycsIGNsb3VkOiAnQ2xvdWQgU2VydmljZXMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxpc3RfcHJpY2U6IHsgbGFiZWw6ICdMaXN0IFByaWNlJyB9LFxuICAgICAgY29zdDogeyBsYWJlbDogJ0Nvc3QnIH0sXG4gICAgICBza3U6IHsgbGFiZWw6ICdTS1UnIH0sXG4gICAgICBpc19hY3RpdmU6IHsgbGFiZWw6ICdBY3RpdmUnIH0sXG4gICAgICBwcm9kdWN0X21hbmFnZXI6IHsgbGFiZWw6ICdQcm9kdWN0IE1hbmFnZXInIH0sXG4gICAgICBpbWFnZTogeyBsYWJlbDogJ1Byb2R1Y3QgSW1hZ2UnIH0sXG4gICAgICBkYXRhc2hlZXQ6IHsgbGFiZWw6ICdEYXRhc2hlZXQnIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnRGlzcGxheSBUaXRsZScgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX3Byb2R1Y3RzOiB7IGxhYmVsOiAnQWxsIFByb2R1Y3RzJyB9LFxuICAgICAgcHJvZHVjdF9jYXRhbG9nOiB7IGxhYmVsOiAnUHJvZHVjdCBDYXRhbG9nJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1Byb2R1Y3QgSW5mb3JtYXRpb24nIH0sXG4gICAgICBwcmljaW5nOiB7IGxhYmVsOiAnUHJpY2luZycgfSxcbiAgICAgIG1ldGFkYXRhOiB7IGxhYmVsOiAnUmVzb3VyY2VzJyB9LFxuICAgICAgLy8gRm9ybSBzZWN0aW9uIG5hbWVzIG9uIHByb2R1Y3Qudmlldy50cyAoIzExMDApXG4gICAgICBwcm9kdWN0X2luZm86IHsgbGFiZWw6ICdQcm9kdWN0IEluZm8nIH0sXG4gICAgICBwcmljaW5nX2luZm86IHsgbGFiZWw6ICdQcmljaW5nJyB9LFxuICAgICAgbWVkaWE6IHsgbGFiZWw6ICdNZWRpYScgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9vYmplY3RzLnNlcnZpY2UudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9vYmplY3RzLnNlcnZpY2UudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgT2JqZWN0VHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuaW1wb3J0IHsgYWN0aXZpdHlBY3Rpb25zIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLyoqXG4gKiBFbmdsaXNoIChlbikgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBTRVJWSUNFIGZhbWlseTpcbiAqIHBvc3Qtc2FsZSBzdXBwb3J0IFx1MjAxNCBjYXNlcyBhbmQgdGhlIGtub3dsZWRnZSB0aGF0IGRlZmxlY3RzIHRoZW0uXG4gKlxuICogUm9zdGVyOiBgY3JtX2Nhc2VgLCBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCwgYGNybV9hcnRpY2xlX2ZlZWRiYWNrYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXJ2aWNlOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fY2FzZToge1xuICAgIGxhYmVsOiAnQ2FzZScsXG4gICAgcGx1cmFsTGFiZWw6ICdDYXNlcycsXG4gICAgZmllbGRzOiB7XG4gICAgICBjYXNlX251bWJlcjogeyBsYWJlbDogJ0Nhc2UgTnVtYmVyJyB9LFxuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1N1YmplY3QnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXB0aW9uJyB9LFxuICAgICAgY3JtX2FjY291bnQ6IHsgbGFiZWw6ICdBY2NvdW50JyB9LFxuICAgICAgY3JtX2NvbnRhY3Q6IHsgbGFiZWw6ICdDb250YWN0JyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnU3RhdHVzJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ldzogJ05ldycsIGluX3Byb2dyZXNzOiAnSW4gUHJvZ3Jlc3MnLCB3YWl0aW5nX2N1c3RvbWVyOiAnV2FpdGluZyBvbiBDdXN0b21lcicsXG4gICAgICAgICAgd2FpdGluZ19zdXBwb3J0OiAnV2FpdGluZyBvbiBTdXBwb3J0JywgZXNjYWxhdGVkOiAnRXNjYWxhdGVkJyxcbiAgICAgICAgICByZXNvbHZlZDogJ1Jlc29sdmVkJywgY2xvc2VkOiAnQ2xvc2VkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwcmlvcml0eToge1xuICAgICAgICBsYWJlbDogJ1ByaW9yaXR5JyxcbiAgICAgICAgb3B0aW9uczogeyBsb3c6ICdMb3cnLCBtZWRpdW06ICdNZWRpdW0nLCBoaWdoOiAnSGlnaCcsIGNyaXRpY2FsOiAnQ3JpdGljYWwnIH0sXG4gICAgICB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ0Nhc2UgVHlwZScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBxdWVzdGlvbjogJ1F1ZXN0aW9uJywgcHJvYmxlbTogJ1Byb2JsZW0nLFxuICAgICAgICAgIGZlYXR1cmVfcmVxdWVzdDogJ0ZlYXR1cmUgUmVxdWVzdCcsIGJ1ZzogJ0J1ZycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgb3JpZ2luOiB7XG4gICAgICAgIGxhYmVsOiAnQ2FzZSBPcmlnaW4nLFxuICAgICAgICBvcHRpb25zOiB7IGVtYWlsOiAnRW1haWwnLCBwaG9uZTogJ1Bob25lJywgd2ViOiAnV2ViJywgY2hhdDogJ0NoYXQnLCBzb2NpYWxfbWVkaWE6ICdTb2NpYWwgTWVkaWEnIH0sXG4gICAgICB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdDYXNlIE93bmVyJyB9LFxuICAgICAgY2xvc2VkX2RhdGU6IHsgbGFiZWw6ICdDbG9zZWQgRGF0ZScgfSxcbiAgICAgIGZpcnN0X3Jlc3BvbnNlX2RhdGU6IHsgbGFiZWw6ICdGaXJzdCBSZXNwb25zZSBEYXRlJyB9LFxuICAgICAgcmVzb2x1dGlvbl90aW1lX2hvdXJzOiB7IGxhYmVsOiAnUmVzb2x1dGlvbiBUaW1lIChIb3VycyknIH0sXG4gICAgICBzbGFfZHVlX2RhdGU6IHsgbGFiZWw6ICdTTEEgRHVlIERhdGUnLCBoZWxwOiAnU2V0IGZyb20gdGhlIGNhc2UgcHJpb3JpdHkgYW5kIHRoZSBhY2NvdW50XHUyMDE5cyBDdXN0b21lciBUaWVyLCBpbiBjYWxlbmRhciBob3VyczogbmlnaHRzLCB3ZWVrZW5kcyBhbmQgaG9saWRheXMgY291bnQuJyB9LFxuICAgICAgaXNfc2xhX3Zpb2xhdGVkOiB7IGxhYmVsOiAnU0xBIFZpb2xhdGVkJyB9LFxuICAgICAgaXNfZXNjYWxhdGVkOiB7IGxhYmVsOiAnRXNjYWxhdGVkJyB9LFxuICAgICAgZXNjYWxhdGlvbl9yZWFzb246IHsgbGFiZWw6ICdFc2NhbGF0aW9uIFJlYXNvbicgfSxcbiAgICAgIHJlc29sdXRpb246IHsgbGFiZWw6ICdSZXNvbHV0aW9uJyB9LFxuICAgICAgcmVzb2x2ZWRfYnlfYXJ0aWNsZTogeyBsYWJlbDogJ1Jlc29sdmVkIGJ5IEFydGljbGUnLCBoZWxwOiAnS25vd2xlZGdlIGFydGljbGUgdGhhdCByZXNvbHZlZCB0aGlzIGNhc2UgXHUyMDE0IHRoZSBkZWZsZWN0aW9uIHNpZ25hbC4nIH0sXG4gICAgICBpbnRlcm5hbF9ub3RlczogeyBsYWJlbDogJ0ludGVybmFsIE5vdGVzJywgaGVscDogJ0ludGVybmFsIG5vdGVzOyBub3QgdmlzaWJsZSB0byB0aGUgY3VzdG9tZXIuJyB9LFxuICAgICAgaXNfY2xvc2VkOiB7IGxhYmVsOiAnSXMgQ2xvc2VkJyB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ0Rpc3BsYXkgVGl0bGUnIH0sXG4gICAgICBwcmlvcml0eV9yYW5rOiB7IGxhYmVsOiAnUHJpb3JpdHkgUmFuaycgfSxcbiAgICAgIGVzY2FsYXRlZF9kYXRlOiB7IGxhYmVsOiAnRXNjYWxhdGVkIERhdGUnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9jYXNlczogeyBsYWJlbDogJ0FsbCBDYXNlcycgfSxcbiAgICAgIGNhc2Vfd29ya2Zsb3c6IHsgbGFiZWw6ICdTZXJ2aWNlIFdvcmtmbG93JyB9LFxuICAgICAgc2xhX2NhbGVuZGFyOiB7IGxhYmVsOiAnU0xBIENhbGVuZGFyJyB9LFxuICAgICAgY2FzZV90aW1lbGluZTogeyBsYWJlbDogJ0Nhc2UgVGltZWxpbmUnIH0sXG4gICAgICB1bmFzc2lnbmVkX3RyaWFnZToge1xuICAgICAgICBsYWJlbDogJ1VuYXNzaWduZWQgXHUyMDE0IHRyaWFnZScsXG4gICAgICAgIGVtcHR5U3RhdGU6IHtcbiAgICAgICAgICB0aXRsZTogJ05vdGhpbmcgd2FpdGluZyBmb3IgdHJpYWdlJyxcbiAgICAgICAgICBtZXNzYWdlOiAnRXZlcnkgY2FzZSBoYXMgYW4gb3duZXIuIENhc2VzIGFwcGVhciBoZXJlIHdoZW4gdGhleSBhcnJpdmUgd2l0aCBubyBvd25lciBcdTIwMTQgdHlwaWNhbGx5IGEgd2ViLXRvLWNhc2Ugc3VibWlzc2lvbiB0aGF0IGFycml2ZWQgd2hpbGUgbm9ib2R5IGhlbGQgdGhlIFNlcnZpY2UgQWdlbnQgcG9zaXRpb24uJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlc2NhbGF0ZWRfY2FzZXM6IHsgbGFiZWw6ICdFc2NhbGF0ZWQgQ2FzZXMnIH0sXG4gICAgICBteV9vcGVuX2Nhc2VzOiB7IGxhYmVsOiAnTXkgT3BlbiBDYXNlcycgfSxcbiAgICAgIHNsYV9hdF9yaXNrOiB7IGxhYmVsOiAnXHUyM0YwIFNMQSBhdCBSaXNrJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0Nhc2UgSW5mb3JtYXRpb24nIH0sXG4gICAgICBvcmlnaW46IHsgbGFiZWw6ICdPcmlnaW4gJiBSb3V0aW5nJyB9LFxuICAgICAgc2xhOiB7IGxhYmVsOiAnU0xBICYgUHJpb3JpdHknIH0sXG4gICAgICByZXNvbHV0aW9uOiB7IGxhYmVsOiAnUmVzb2x1dGlvbicgfSxcbiAgICAgIGVzY2FsYXRpb246IHsgbGFiZWw6ICdFc2NhbGF0aW9uJyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnU3lzdGVtJyB9LFxuICAgICAgLy8gVGhlIGRldGFpbCBwYWdlJ3Mgc2VjdGlvbnMgcmVmZXJlbmNlIHRoZSBncm91cHMgYWJvdmUgKCM5NzApLCBzbyBpdFxuICAgICAgLy8gaGFzIG5vIHNlY3Rpb24gbmFtZXMgb2YgaXRzIG93bi5cbiAgICAgIC8vIEZvcm0gc2VjdGlvbiBuYW1lcyBvbiBjYXNlLnZpZXcudHMgKCMxMTAwKS5cbiAgICAgIGNhc2U6IHsgbGFiZWw6ICdDYXNlJyB9LFxuICAgICAgaG93X2Nhbl93ZV9oZWxwOiB7IGxhYmVsOiAnSG93IGNhbiB3ZSBoZWxwPycgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7XG4gICAgICAuLi5hY3Rpdml0eUFjdGlvbnMsXG4gICAgICBlc2NhbGF0ZV9jYXNlOiB7XG4gICAgICAgIGxhYmVsOiAnRXNjYWxhdGUgQ2FzZScsXG4gICAgICAgIGNvbmZpcm1UZXh0OiAnVGhpcyB3aWxsIGVzY2FsYXRlIHRoZSBjYXNlIHRvIHRoZSBlc2NhbGF0aW9uIHRlYW0uIENvbnRpbnVlPycsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnQ2FzZSBlc2NhbGF0ZWQgc3VjY2Vzc2Z1bGx5IScsXG4gICAgICB9LFxuICAgICAgY2xvc2VfY2FzZToge1xuICAgICAgICBsYWJlbDogJ0Nsb3NlIENhc2UnLFxuICAgICAgICBjb25maXJtVGV4dDogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjbG9zZSB0aGlzIGNhc2U/JyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdDYXNlIGNsb3NlZCBzdWNjZXNzZnVsbHkhJyxcbiAgICAgIH0sXG4gICAgICBjbGFpbV9jYXNlOiB7XG4gICAgICAgIGxhYmVsOiAnQ2xhaW0gQ2FzZScsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnQ2FzZSBjbGFpbWVkIFx1MjAxNCBpdCBpcyB5b3VycyBub3cuJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX2tub3dsZWRnZV9hcnRpY2xlOiB7XG4gICAgbGFiZWw6ICdLbm93bGVkZ2UgQXJ0aWNsZScsXG4gICAgcGx1cmFsTGFiZWw6ICdLbm93bGVkZ2UgQmFzZScsXG4gICAgZGVzY3JpcHRpb246ICdSZXVzYWJsZSBhbnN3ZXJzIGFuZCBob3ctdG8gZ3VpZGVzIGZvciBjdXN0b21lcnMgYW5kIGFnZW50cycsXG4gICAgZmllbGRzOiB7XG4gICAgICBhcnRpY2xlX251bWJlcjogeyBsYWJlbDogJ0FydGljbGUgIycgfSxcbiAgICAgIHRpdGxlOiB7IGxhYmVsOiAnVGl0bGUnIH0sXG4gICAgICBzdW1tYXJ5OiB7IGxhYmVsOiAnU3VtbWFyeScsIGhlbHA6ICdPbmUtcGFyYWdyYXBoIFRMO0RSIHNob3duIGluIHNlYXJjaCByZXN1bHRzIGFuZCBBSSBjaXRhdGlvbnMuJyB9LFxuICAgICAgYm9keTogeyBsYWJlbDogJ0JvZHknLCBoZWxwOiAnRnVsbCBhcnRpY2xlIGNvbnRlbnQgKE1hcmtkb3duKS4nIH0sXG4gICAgICBjYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ0NhdGVnb3J5JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGdldHRpbmdfc3RhcnRlZDogJ0dldHRpbmcgU3RhcnRlZCcsIGhvd190bzogJ0hvdy1UbycsXG4gICAgICAgICAgdHJvdWJsZXNob290aW5nOiAnVHJvdWJsZXNob290aW5nJywgYmlsbGluZzogJ0JpbGxpbmcgJiBQcmljaW5nJywgYXBpOiAnQVBJICYgSW50ZWdyYXRpb25zJyxcbiAgICAgICAgICByZWxlYXNlX25vdGVzOiAnUmVsZWFzZSBOb3RlcycsIHBvbGljeTogJ1BvbGljeScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdGFnczoge1xuICAgICAgICBsYWJlbDogJ1RhZ3MnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYXV0aDogJ0F1dGgnLCBzc286ICdTU08nLCBtb2JpbGU6ICdNb2JpbGUnLCBlbWFpbDogJ0VtYWlsJyxcbiAgICAgICAgICByZXBvcnRzOiAnUmVwb3J0cycsIHBlcmZvcm1hbmNlOiAnUGVyZm9ybWFuY2UnLCBkYXRhX2ltcG9ydDogJ0RhdGEgSW1wb3J0JyxcbiAgICAgICAgICB3ZWJob29rczogJ1dlYmhvb2tzJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgICBvcHRpb25zOiB7IGRyYWZ0OiAnRHJhZnQnLCBpbl9yZXZpZXc6ICdJbiBSZXZpZXcnLCBwdWJsaXNoZWQ6ICdQdWJsaXNoZWQnLCBhcmNoaXZlZDogJ0FyY2hpdmVkJyB9LFxuICAgICAgfSxcbiAgICAgIGF1ZGllbmNlOiB7XG4gICAgICAgIGxhYmVsOiAnQXVkaWVuY2UnLFxuICAgICAgICBoZWxwOiAnUHVibGljIGFydGljbGVzIGFyZSB2aXNpYmxlIGluIHRoZSBjdXN0b21lciBwb3J0YWw7IGludGVybmFsIGFydGljbGVzIGFyZSBhZ2VudC1vbmx5LicsXG4gICAgICAgIG9wdGlvbnM6IHsgcHVibGljOiAnUHVibGljJywgaW50ZXJuYWw6ICdJbnRlcm5hbCcgfSxcbiAgICAgIH0sXG4gICAgICBsYW5ndWFnZToge1xuICAgICAgICBsYWJlbDogJ0xhbmd1YWdlJyxcbiAgICAgICAgb3B0aW9uczogeyBlbjogJ0VuZ2xpc2gnLCB6aF9jbjogJ1NpbXBsaWZpZWQgQ2hpbmVzZScsIGVzX2VzOiAnU3BhbmlzaCcsIGphX2pwOiAnSmFwYW5lc2UnIH0sXG4gICAgICB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdPd25lcicgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY2FzZTogeyBsYWJlbDogJ1NvdXJjZSBDYXNlJywgaGVscDogJ0Nhc2UgdGhpcyBhcnRpY2xlIHdhcyBhdXRob3JlZCBmcm9tIChvcHRpb25hbCkuJyB9LFxuICAgICAgcHVibGlzaGVkX2F0OiB7IGxhYmVsOiAnUHVibGlzaGVkIEF0JyB9LFxuICAgICAgbGFzdF9yZXZpZXdlZF9hdDogeyBsYWJlbDogJ0xhc3QgUmV2aWV3ZWQnIH0sXG4gICAgICBoZWxwZnVsX2NvdW50OiB7IGxhYmVsOiAnSGVscGZ1bCcsIGhlbHA6ICdSZWNvdW50ZWQgZnJvbSBjcm1fYXJ0aWNsZV9mZWVkYmFjayBcdTIwMTQgbmV2ZXIgdHlwZWQgaW4uJyB9LFxuICAgICAgbm90X2hlbHBmdWxfY291bnQ6IHsgbGFiZWw6ICdOb3QgSGVscGZ1bCcsIGhlbHA6ICdSZWNvdW50ZWQgZnJvbSBjcm1fYXJ0aWNsZV9mZWVkYmFjayBcdTIwMTQgbmV2ZXIgdHlwZWQgaW4uJyB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ0Rpc3BsYXkgVGl0bGUnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9hcnRpY2xlczogeyBsYWJlbDogJ0FsbCBBcnRpY2xlcycgfSxcbiAgICAgIHB1Ymxpc2hlZF9hcnRpY2xlczogeyBsYWJlbDogJ1B1Ymxpc2hlZCcgfSxcbiAgICAgIG15X2RyYWZ0czogeyBsYWJlbDogJ015IERyYWZ0cycgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdBcnRpY2xlIEluZm9ybWF0aW9uJyB9LFxuICAgICAgY29udGVudDogeyBsYWJlbDogJ0NvbnRlbnQnIH0sXG4gICAgICB0YXhvbm9teTogeyBsYWJlbDogJ0NhdGVnb3JpemF0aW9uJyB9LFxuICAgICAgbWV0cmljczogeyBsYWJlbDogJ0VuZ2FnZW1lbnQnIH0sXG4gICAgICBlbmdhZ2VtZW50OiB7IGxhYmVsOiAnRW5nYWdlbWVudCcgfSxcbiAgICAgIC8vIEZvcm0gc2VjdGlvbiBuYW1lIG9uIGtub3dsZWRnZV9hcnRpY2xlLnZpZXcudHMgKCMxMTAwKVxuICAgICAgYXJ0aWNsZTogeyBsYWJlbDogJ0FydGljbGUnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgbWFya19hcnRpY2xlX2hlbHBmdWw6IHtcbiAgICAgICAgbGFiZWw6ICdIZWxwZnVsJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdUaGFua3MgXHUyMDE0IHJlY29yZGVkIGFzIGhlbHBmdWwuJyxcbiAgICAgIH0sXG4gICAgICBtYXJrX2FydGljbGVfbm90X2hlbHBmdWw6IHtcbiAgICAgICAgbGFiZWw6ICdOb3QgSGVscGZ1bCcsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnVGhhbmtzIFx1MjAxNCByZWNvcmRlZCBhcyBub3QgaGVscGZ1bC4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fYXJ0aWNsZV9mZWVkYmFjazoge1xuICAgIGxhYmVsOiAnQXJ0aWNsZSBGZWVkYmFjaycsXG4gICAgcGx1cmFsTGFiZWw6ICdBcnRpY2xlIEZlZWRiYWNrJyxcbiAgICBkZXNjcmlwdGlvbjogJ09uZSByZWFkZXJcdTIwMTlzIGhlbHBmdWwgLyBub3QtaGVscGZ1bCB2ZXJkaWN0IG9uIGEga25vd2xlZGdlIGFydGljbGUnLFxuICAgIGZpZWxkczoge1xuICAgICAgZmVlZGJhY2tfbnVtYmVyOiB7IGxhYmVsOiAnRmVlZGJhY2sgIycgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnUmVhZGVyJyB9LFxuICAgICAgY3JtX2tub3dsZWRnZV9hcnRpY2xlOiB7IGxhYmVsOiAnQXJ0aWNsZScsIGhlbHA6ICdLbm93bGVkZ2UgYXJ0aWNsZSB0aGlzIGZlZWRiYWNrIGlzIGFib3V0LicgfSxcbiAgICAgIHZlcmRpY3Q6IHtcbiAgICAgICAgbGFiZWw6ICdWZXJkaWN0JyxcbiAgICAgICAgb3B0aW9uczogeyBoZWxwZnVsOiAnSGVscGZ1bCcsIG5vdF9oZWxwZnVsOiAnTm90IEhlbHBmdWwnIH0sXG4gICAgICB9LFxuICAgICAgY29tbWVudDogeyBsYWJlbDogJ0NvbW1lbnQnLCBoZWxwOiAnT3B0aW9uYWwgbm90ZSBleHBsYWluaW5nIHRoZSB2ZXJkaWN0IFx1MjAxNCByZWFkIGJ5IHRoZSBhcnRpY2xlXHUyMDE5cyBhdXRob3IuJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0ZlZWRiYWNrJyB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuL29iamVjdHMuYWN0aXZpdHkudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9vYmplY3RzLmFjdGl2aXR5LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbi8qKlxuICogRW5nbGlzaCAoZW4pIFx1MjAxNCBgb2JqZWN0c2AgdHJhbnNsYXRpb25zIGZvciB0aGUgQUNUSVZJVFkgZmFtaWx5OlxuICogdGhlIGludGVyYWN0aW9uIGxvZyBcdTIwMTQgdGFza3MsIGV2ZW50cywgYW5kIHdobyBhdHRlbmRlZC5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fdGFza2AsIGBjcm1fZXZlbnRgLCBgY3JtX2V2ZW50X2F0dGVuZGVlYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBhY3Rpdml0eTogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX3Rhc2s6IHtcbiAgICBsYWJlbDogJ1Rhc2snLFxuICAgIHBsdXJhbExhYmVsOiAnVGFza3MnLFxuICAgIGZpZWxkczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1N1YmplY3QnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXB0aW9uJyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnU3RhdHVzJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5vdF9zdGFydGVkOiAnTm90IFN0YXJ0ZWQnLCBpbl9wcm9ncmVzczogJ0luIFByb2dyZXNzJywgd2FpdGluZzogJ1dhaXRpbmcnLFxuICAgICAgICAgIGNvbXBsZXRlZDogJ0NvbXBsZXRlZCcsIGRlZmVycmVkOiAnRGVmZXJyZWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHByaW9yaXR5OiB7XG4gICAgICAgIGxhYmVsOiAnUHJpb3JpdHknLFxuICAgICAgICBvcHRpb25zOiB7IGxvdzogJ0xvdycsIG5vcm1hbDogJ05vcm1hbCcsIGhpZ2g6ICdIaWdoJywgdXJnZW50OiAnVXJnZW50JyB9LFxuICAgICAgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUYXNrIFR5cGUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY2FsbDogJ0NhbGwnLCBlbWFpbDogJ0VtYWlsJywgbWVldGluZzogJ01lZXRpbmcnLFxuICAgICAgICAgIGZvbGxvd191cDogJ0ZvbGxvdy11cCcsIGRlbW86ICdEZW1vJywgb3RoZXI6ICdPdGhlcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZHVlX2RhdGU6IHsgbGFiZWw6ICdEdWUgRGF0ZScgfSxcbiAgICAgIHJlbWluZGVyX2RhdGU6IHsgbGFiZWw6ICdSZW1pbmRlciBEYXRlL1RpbWUnIH0sXG4gICAgICBjb21wbGV0ZWRfZGF0ZTogeyBsYWJlbDogJ0NvbXBsZXRlZCBEYXRlJyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdBc3NpZ25lZCBUbycgfSxcbiAgICAgIHJlbGF0ZWRfdG9fdHlwZToge1xuICAgICAgICBsYWJlbDogJ1JlbGF0ZWQgVG8gVHlwZScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjcm1fYWNjb3VudDogJ0FjY291bnQnLCBjcm1fY29udGFjdDogJ0NvbnRhY3QnLCBjcm1fb3Bwb3J0dW5pdHk6ICdPcHBvcnR1bml0eScsXG4gICAgICAgICAgY3JtX2xlYWQ6ICdMZWFkJywgY3JtX2Nhc2U6ICdDYXNlJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZWxhdGVkX3RvX2FjY291bnQ6IHsgbGFiZWw6ICdSZWxhdGVkIEFjY291bnQnIH0sXG4gICAgICByZWxhdGVkX3RvX2NvbnRhY3Q6IHsgbGFiZWw6ICdSZWxhdGVkIENvbnRhY3QnIH0sXG4gICAgICByZWxhdGVkX3RvX29wcG9ydHVuaXR5OiB7IGxhYmVsOiAnUmVsYXRlZCBPcHBvcnR1bml0eScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fbGVhZDogeyBsYWJlbDogJ1JlbGF0ZWQgTGVhZCcgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY2FzZTogeyBsYWJlbDogJ1JlbGF0ZWQgQ2FzZScgfSxcbiAgICAgIGlzX3JlY3VycmluZzogeyBsYWJlbDogJ1JlY3VycmluZyBUYXNrJyB9LFxuICAgICAgcmVjdXJyZW5jZV90eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnUmVjdXJyZW5jZSBUeXBlJyxcbiAgICAgICAgb3B0aW9uczogeyBkYWlseTogJ0RhaWx5Jywgd2Vla2x5OiAnV2Vla2x5JywgbW9udGhseTogJ01vbnRobHknLCB5ZWFybHk6ICdZZWFybHknIH0sXG4gICAgICB9LFxuICAgICAgcmVjdXJyZW5jZV9pbnRlcnZhbDogeyBsYWJlbDogJ1JlY3VycmVuY2UgSW50ZXJ2YWwnIH0sXG4gICAgICByZWN1cnJlbmNlX2VuZF9kYXRlOiB7IGxhYmVsOiAnUmVjdXJyZW5jZSBFbmQgRGF0ZScgfSxcbiAgICAgIGlzX2NvbXBsZXRlZDogeyBsYWJlbDogJ0lzIENvbXBsZXRlZCcgfSxcbiAgICAgIGlzX292ZXJkdWU6IHsgbGFiZWw6ICdJcyBPdmVyZHVlJyB9LFxuICAgICAgcHJvZ3Jlc3NfcGVyY2VudDogeyBsYWJlbDogJ1Byb2dyZXNzICglKScgfSxcbiAgICAgIHByaW9yaXR5X3Jhbms6IHsgbGFiZWw6ICdQcmlvcml0eSBSYW5rJyB9LFxuICAgICAgcmVtaW5kZXJfc2VudDogeyBsYWJlbDogJ1JlbWluZGVyIFNlbnQnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF90YXNrczogeyBsYWJlbDogJ0FsbCBUYXNrcycgfSxcbiAgICAgIHRhc2tfYm9hcmQ6IHsgbGFiZWw6ICdUYXNrIEJvYXJkJyB9LFxuICAgICAgdGFza19jYWxlbmRhcjogeyBsYWJlbDogJ1Rhc2sgU2NoZWR1bGUnIH0sXG4gICAgICB0YXNrX2dhbnR0OiB7IGxhYmVsOiAnRXhlY3V0aW9uIFBsYW4nIH0sXG4gICAgICB0YXNrX3RpbWVsaW5lOiB7IGxhYmVsOiAnV29ya2xvZyBUaW1lbGluZScgfSxcbiAgICAgIG15X29wZW5fdGFza3M6IHsgbGFiZWw6ICdNeSBPcGVuIFRhc2tzJyB9LFxuICAgICAgdG9kYXlzX3Rhc2tzOiB7IGxhYmVsOiAnXHVEODNEXHVEQ0M1IE15IFByaW9yaXR5IFRhc2tzJyB9LFxuICAgICAgb3ZlcmR1ZV90YXNrczogeyBsYWJlbDogJ1x1MjNGMCBPcGVuIFRhc2tzIFx1MDBCNyBNb3N0IE92ZXJkdWUgRmlyc3QnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnVGFzayBJbmZvcm1hdGlvbicgfSxcbiAgICAgIHNjaGVkdWxpbmc6IHsgbGFiZWw6ICdTY2hlZHVsaW5nJyB9LFxuICAgICAgcmVsYXRlZDogeyBsYWJlbDogJ1JlbGF0ZWQgUmVjb3JkcycgfSxcbiAgICAgIHJlY3VycmVuY2U6IHsgbGFiZWw6ICdSZWN1cnJlbmNlJyB9LFxuICAgICAgZWZmb3J0OiB7IGxhYmVsOiAnUHJvZ3Jlc3MgJiBFZmZvcnQnIH0sXG4gICAgICBzeXN0ZW06IHsgbGFiZWw6ICdTeXN0ZW0nIH0sXG4gICAgICAvLyBGb3JtIHNlY3Rpb24gbmFtZXMgb24gdGFzay52aWV3LnRzICgjMTEwMClcbiAgICAgIHRhc2s6IHsgbGFiZWw6ICdUYXNrJyB9LFxuICAgICAgcmVsYXRlZF9yZWNvcmRzOiB7IGxhYmVsOiAnUmVsYXRlZCBSZWNvcmRzJyB9LFxuICAgICAgcmVjdXJyZW5jZV9hbmRfZWZmb3J0OiB7IGxhYmVsOiAnUmVjdXJyZW5jZSAmIEVmZm9ydCcgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fZXZlbnQ6IHtcbiAgICBsYWJlbDogJ0V2ZW50JyxcbiAgICBwbHVyYWxMYWJlbDogJ0V2ZW50cycsXG4gICAgZGVzY3JpcHRpb246ICdNZWV0aW5ncywgY2FsbHMgYW5kIG90aGVyIHNjaGVkdWxlZCBpbnRlcmFjdGlvbnMgd2l0aCBjdXN0b21lcnMnLFxuICAgIGZpZWxkczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1N1YmplY3QnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXB0aW9uJyB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ0V2ZW50IFR5cGUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbWVldGluZzogJ01lZXRpbmcnLCBjYWxsOiAnQ2FsbCcsIGRlbW86ICdEZW1vJyxcbiAgICAgICAgICB3ZWJpbmFyOiAnV2ViaW5hcicsIG9uc2l0ZV92aXNpdDogJ09uc2l0ZSBWaXNpdCcsIG90aGVyOiAnT3RoZXInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1N0YXR1cycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwbGFubmVkOiAnUGxhbm5lZCcsIGhlbGQ6ICdIZWxkJywgY2FuY2VsbGVkOiAnQ2FuY2VsbGVkJywgbm9fc2hvdzogJ05vIFNob3cnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnQXNzaWduZWQgVG8nIH0sXG4gICAgICBzdGFydF9kYXRldGltZTogeyBsYWJlbDogJ1N0YXJ0JyB9LFxuICAgICAgZW5kX2RhdGV0aW1lOiB7IGxhYmVsOiAnRW5kJyB9LFxuICAgICAgYWxsX2RheTogeyBsYWJlbDogJ0FsbCBEYXkgRXZlbnQnIH0sXG4gICAgICBkdXJhdGlvbl9taW51dGVzOiB7IGxhYmVsOiAnRHVyYXRpb24gKG1pbnV0ZXMpJyB9LFxuICAgICAgbG9jYXRpb246IHsgbGFiZWw6ICdMb2NhdGlvbicsIGhlbHA6ICdSb29tLCBhZGRyZXNzLCBvciBtZWV0aW5nIGxpbmsnIH0sXG4gICAgICByZWxhdGVkX3RvX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdSZWxhdGVkIFRvIFR5cGUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY3JtX2FjY291bnQ6ICdBY2NvdW50JywgY3JtX2NvbnRhY3Q6ICdDb250YWN0JywgY3JtX29wcG9ydHVuaXR5OiAnT3Bwb3J0dW5pdHknLFxuICAgICAgICAgIGNybV9sZWFkOiAnTGVhZCcsIGNybV9jYXNlOiAnQ2FzZScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmVsYXRlZF90b19hY2NvdW50OiB7IGxhYmVsOiAnUmVsYXRlZCBBY2NvdW50JyB9LFxuICAgICAgcmVsYXRlZF90b19jb250YWN0OiB7IGxhYmVsOiAnUmVsYXRlZCBDb250YWN0JyB9LFxuICAgICAgcmVsYXRlZF90b19vcHBvcnR1bml0eTogeyBsYWJlbDogJ1JlbGF0ZWQgT3Bwb3J0dW5pdHknIH0sXG4gICAgICByZWxhdGVkX3RvX2xlYWQ6IHsgbGFiZWw6ICdSZWxhdGVkIExlYWQnIH0sXG4gICAgICByZWxhdGVkX3RvX2Nhc2U6IHsgbGFiZWw6ICdSZWxhdGVkIENhc2UnIH0sXG4gICAgICBvdXRjb21lX25vdGVzOiB7IGxhYmVsOiAnT3V0Y29tZSBOb3RlcycsIGhlbHA6ICdXaGF0IHdhcyBhZ3JlZWQsIGFuZCB3aGF0IGhhcHBlbnMgbmV4dCcgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2V2ZW50czogeyBsYWJlbDogJ0FsbCBFdmVudHMnIH0sXG4gICAgICBldmVudF9jYWxlbmRhcjogeyBsYWJlbDogJ0V2ZW50IENhbGVuZGFyJyB9LFxuICAgICAgZXZlbnRfdGltZWxpbmU6IHsgbGFiZWw6ICdUZWFtIFNjaGVkdWxlJyB9LFxuICAgICAgbXlfZXZlbnRzOiB7IGxhYmVsOiAnTXkgQ2FsZW5kYXInIH0sXG4gICAgICB1cGNvbWluZ19ldmVudHM6IHsgbGFiZWw6ICdcdUQ4M0RcdURDQzUgVXBjb21pbmcgXHUwMEI3IFNvb25lc3QgRmlyc3QnIH0sXG4gICAgICBoZWxkX2V2ZW50czogeyBsYWJlbDogJ1x1MjcwNSBJbnRlcmFjdGlvbiBIaXN0b3J5JyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0V2ZW50IEluZm9ybWF0aW9uJyB9LFxuICAgICAgc2NoZWR1bGU6IHsgbGFiZWw6ICdTY2hlZHVsZScgfSxcbiAgICAgIHJlbGF0ZWQ6IHsgbGFiZWw6ICdSZWxhdGVkIFJlY29yZHMnIH0sXG4gICAgICBvdXRjb21lOiB7IGxhYmVsOiAnT3V0Y29tZScgfSxcbiAgICAgIC8vIEZvcm0gc2VjdGlvbiBuYW1lcyBvbiBldmVudC52aWV3LnRzICgjMTEwMCkuIGByZWxhdGVkX3JlY29yZHNgLFxuICAgICAgLy8gbm90IGByZWxhdGVkYCBcdTIwMTQgYHJlbGF0ZWRgIGlzIGFscmVhZHkgdGhlIGZpZWxkR3JvdXAga2V5IGFib3ZlLlxuICAgICAgZXZlbnQ6IHsgbGFiZWw6ICdFdmVudCcgfSxcbiAgICAgIHJlbGF0ZWRfcmVjb3JkczogeyBsYWJlbDogJ1JlbGF0ZWQgUmVjb3JkcycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fZXZlbnRfYXR0ZW5kZWU6IHtcbiAgICBsYWJlbDogJ0V2ZW50IEF0dGVuZGVlJyxcbiAgICBwbHVyYWxMYWJlbDogJ0V2ZW50IEF0dGVuZGVlcycsXG4gICAgZGVzY3JpcHRpb246ICdBIHBlcnNvbiBpbnZpdGVkIHRvIG9yIHByZXNlbnQgYXQgYW4gZXZlbnQnLFxuICAgIGZpZWxkczoge1xuICAgICAgYXR0ZW5kZWVfbnVtYmVyOiB7IGxhYmVsOiAnQXR0ZW5kZWUgTnVtYmVyJyB9LFxuICAgICAgY3JtX2V2ZW50OiB7IGxhYmVsOiAnRXZlbnQnIH0sXG4gICAgICBhdHRlbmRlZV90eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnQXR0ZW5kZWUgVHlwZScsXG4gICAgICAgIG9wdGlvbnM6IHsgY29udGFjdDogJ0NvbnRhY3QnLCBsZWFkOiAnTGVhZCcsIHVzZXI6ICdVc2VyJywgZXh0ZXJuYWw6ICdFeHRlcm5hbCcgfSxcbiAgICAgIH0sXG4gICAgICBjcm1fY29udGFjdDogeyBsYWJlbDogJ0NvbnRhY3QnLCBoZWxwOiAnU2V0IHdoZW4gdGhlIGF0dGVuZGVlIGlzIGFuIGV4aXN0aW5nIGN1c3RvbWVyIGNvbnRhY3QnIH0sXG4gICAgICBjcm1fbGVhZDogeyBsYWJlbDogJ0xlYWQnLCBoZWxwOiAnU2V0IHdoZW4gdGhlIGF0dGVuZGVlIGlzIHN0aWxsIGFuIHVuY29udmVydGVkIGxlYWQnIH0sXG4gICAgICBzeXNfdXNlcjogeyBsYWJlbDogJ1VzZXInLCBoZWxwOiAnU2V0IHdoZW4gdGhlIGF0dGVuZGVlIGlzIGEgY29sbGVhZ3VlJyB9LFxuICAgICAgZXh0ZXJuYWxfbmFtZToge1xuICAgICAgICBsYWJlbDogJ0V4dGVybmFsIEF0dGVuZGVlJyxcbiAgICAgICAgaGVscDogJ05hbWUgb2YgYW4gYXR0ZW5kZWUgd2hvIGlzIGluIG5vIENSTSBvYmplY3QgXHUyMDE0IHNldCB3aGVuIEF0dGVuZGVlIFR5cGUgaXMgRXh0ZXJuYWwnLFxuICAgICAgfSxcbiAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgIGxhYmVsOiAnUmVzcG9uc2UnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbm9fcmVzcG9uc2U6ICdObyBSZXNwb25zZScsIGFjY2VwdGVkOiAnQWNjZXB0ZWQnLFxuICAgICAgICAgIGRlY2xpbmVkOiAnRGVjbGluZWQnLCB0ZW50YXRpdmU6ICdUZW50YXRpdmUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGlzX29yZ2FuaXplcjogeyBsYWJlbDogJ09yZ2FuaXplcicgfSxcbiAgICAgIGludml0ZWRfZGF0ZTogeyBsYWJlbDogJ0ludml0ZWQnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9ldmVudF9hdHRlbmRlZXM6IHsgbGFiZWw6ICdFdmVudCBBdHRlbmRlZXMnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnQXR0ZW5kZWUnIH0sXG4gICAgICByZXNwb25zZTogeyBsYWJlbDogJ0ludml0YXRpb24nIH0sXG4gICAgICAvLyBGb3JtIHNlY3Rpb24gbmFtZXMgb24gZXZlbnRfYXR0ZW5kZWUudmlldy50cyAoIzExMDApIFx1MjAxNCBzYW1lIEVuZ2xpc2hcbiAgICAgIC8vIHRleHQgYXMgdGhlIGZpZWxkR3JvdXBzIGFib3ZlLCBidXQgYSBkaXN0aW5jdCBrZXk6IGBhdHRlbmRlZWAgL1xuICAgICAgLy8gYGludml0YXRpb25gIGFyZSBub3QgYGJhc2ljYCAvIGByZXNwb25zZWAuXG4gICAgICBhdHRlbmRlZTogeyBsYWJlbDogJ0F0dGVuZGVlJyB9LFxuICAgICAgaW52aXRhdGlvbjogeyBsYWJlbDogJ0ludml0YXRpb24nIH0sXG4gICAgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZW4vb2JqZWN0cy5tYXJrZXRpbmcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi9vYmplY3RzLm1hcmtldGluZy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG4vKipcbiAqIEVuZ2xpc2ggKGVuKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIE1BUktFVElORyBmYW1pbHk6XG4gKiBkZW1hbmQgZ2VuZXJhdGlvbiBcdTIwMTQgY2FtcGFpZ25zIGFuZCB0aGVpciBtZW1iZXJzaGlwLlxuICpcbiAqIFJvc3RlcjogYGNybV9jYW1wYWlnbmAsIGBjcm1fY2FtcGFpZ25fbWVtYmVyYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBtYXJrZXRpbmc6IFJlY29yZDxzdHJpbmcsIE9iamVjdFRyYW5zbGF0aW9uRGF0YT4gPSB7XG4gIGNybV9jYW1wYWlnbjoge1xuICAgIGxhYmVsOiAnQ2FtcGFpZ24nLFxuICAgIHBsdXJhbExhYmVsOiAnQ2FtcGFpZ25zJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNhbXBhaWduX2NvZGU6IHsgbGFiZWw6ICdDYW1wYWlnbiBDb2RlJyB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ0NhbXBhaWduIE5hbWUnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXB0aW9uJyB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ0NhbXBhaWduIFR5cGUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZW1haWw6ICdFbWFpbCcsIHdlYmluYXI6ICdXZWJpbmFyJywgdHJhZGVfc2hvdzogJ1RyYWRlIFNob3cnLFxuICAgICAgICAgIGNvbmZlcmVuY2U6ICdDb25mZXJlbmNlJywgZGlyZWN0X21haWw6ICdEaXJlY3QgTWFpbCcsIHNvY2lhbF9tZWRpYTogJ1NvY2lhbCBNZWRpYScsXG4gICAgICAgICAgY29udGVudDogJ0NvbnRlbnQgTWFya2V0aW5nJywgcGFydG5lcjogJ1BhcnRuZXIgTWFya2V0aW5nJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjaGFubmVsOiB7XG4gICAgICAgIGxhYmVsOiAnUHJpbWFyeSBDaGFubmVsJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGRpZ2l0YWw6ICdEaWdpdGFsJywgc29jaWFsOiAnU29jaWFsJywgZW1haWw6ICdFbWFpbCcsXG4gICAgICAgICAgZXZlbnRzOiAnRXZlbnRzJywgcGFydG5lcjogJ1BhcnRuZXInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1N0YXR1cycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwbGFubmluZzogJ1BsYW5uaW5nJywgaW5fcHJvZ3Jlc3M6ICdJbiBQcm9ncmVzcycsXG4gICAgICAgICAgY29tcGxldGVkOiAnQ29tcGxldGVkJywgYWJvcnRlZDogJ0Fib3J0ZWQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0YXJ0X2RhdGU6IHsgbGFiZWw6ICdTdGFydCBEYXRlJyB9LFxuICAgICAgZW5kX2RhdGU6IHsgbGFiZWw6ICdFbmQgRGF0ZScgfSxcbiAgICAgIGJ1ZGdldGVkX2Nvc3Q6IHsgbGFiZWw6ICdCdWRnZXRlZCBDb3N0JyB9LFxuICAgICAgYWN0dWFsX2Nvc3Q6IHsgbGFiZWw6ICdBY3R1YWwgQ29zdCcgfSxcbiAgICAgIGV4cGVjdGVkX3JldmVudWU6IHsgbGFiZWw6ICdFeHBlY3RlZCBSZXZlbnVlJyB9LFxuICAgICAgYWN0dWFsX3JldmVudWU6IHsgbGFiZWw6ICdBY3R1YWwgUmV2ZW51ZScgfSxcbiAgICAgIHRhcmdldF9zaXplOiB7IGxhYmVsOiAnVGFyZ2V0IFNpemUnLCBoZWxwOiAnVGFyZ2V0IG51bWJlciBvZiBsZWFkcy9jb250YWN0cycgfSxcbiAgICAgIG51bV9zZW50OiB7IGxhYmVsOiAnTnVtYmVyIFNlbnQnIH0sXG4gICAgICBudW1fcmVzcG9uc2VzOiB7IGxhYmVsOiAnTnVtYmVyIG9mIFJlc3BvbnNlcycgfSxcbiAgICAgIG51bV9sZWFkczogeyBsYWJlbDogJ051bWJlciBvZiBMZWFkcycgfSxcbiAgICAgIG51bV9jb252ZXJ0ZWRfbGVhZHM6IHsgbGFiZWw6ICdDb252ZXJ0ZWQgTGVhZHMnIH0sXG4gICAgICBudW1fb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ09wcG9ydHVuaXRpZXMgQ3JlYXRlZCcgfSxcbiAgICAgIG51bV93b25fb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ1dvbiBPcHBvcnR1bml0aWVzJyB9LFxuICAgICAgcmVzcG9uc2VfcmF0ZTogeyBsYWJlbDogJ1Jlc3BvbnNlIFJhdGUgJScgfSxcbiAgICAgIHJvaTogeyBsYWJlbDogJ1JPSSAlJyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdDYW1wYWlnbiBPd25lcicgfSxcbiAgICAgIGxhbmRpbmdfcGFnZV91cmw6IHsgbGFiZWw6ICdMYW5kaW5nIFBhZ2UnIH0sXG4gICAgICBpc19hY3RpdmU6IHsgbGFiZWw6ICdBY3RpdmUnIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnRGlzcGxheSBUaXRsZScgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2NhbXBhaWduczogeyBsYWJlbDogJ0FsbCBDYW1wYWlnbnMnIH0sXG4gICAgICBjYW1wYWlnbl9nYW50dDogeyBsYWJlbDogJ0NhbXBhaWduIFNjaGVkdWxlJyB9LFxuICAgICAgY2FtcGFpZ25fY2FsZW5kYXI6IHsgbGFiZWw6ICdMYXVuY2ggQ2FsZW5kYXInIH0sXG4gICAgICBjYW1wYWlnbl90aW1lbGluZTogeyBsYWJlbDogJ01hcmtldGluZyBUaW1lbGluZScgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdDYW1wYWlnbiBJbmZvcm1hdGlvbicgfSxcbiAgICAgIHNjaGVkdWxlOiB7IGxhYmVsOiAnU2NoZWR1bGUnIH0sXG4gICAgICBidWRnZXQ6IHsgbGFiZWw6ICdCdWRnZXQgJiBST0knIH0sXG4gICAgICBtZXRyaWNzOiB7IGxhYmVsOiAnUGVyZm9ybWFuY2UnIH0sXG4gICAgICBhc3NpZ25tZW50OiB7IGxhYmVsOiAnT3duZXJzaGlwJyB9LFxuICAgICAgYXNzZXRzOiB7IGxhYmVsOiAnQ2FtcGFpZ24gQXNzZXRzJyB9LFxuICAgIH0sXG4gICAgX2FjdGlvbnM6IHtcbiAgICAgIGVucm9sbF9sZWFkczoge1xuICAgICAgICBsYWJlbDogJ0Vucm9sbCBNZW1iZXJzJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdFbGlnaWJsZSBtZW1iZXJzIGVucm9sbGVkIGluIGNhbXBhaWduLicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9jYW1wYWlnbl9tZW1iZXI6IHtcbiAgICBsYWJlbDogJ0NhbXBhaWduIE1lbWJlcicsXG4gICAgcGx1cmFsTGFiZWw6ICdDYW1wYWlnbiBNZW1iZXJzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0xlYWRzIGFuZCBjb250YWN0cyB0b3VjaGVkIGJ5IGEgY2FtcGFpZ24sIHdpdGggcmVzcG9uc2Ugc3RhdHVzJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIG1lbWJlcl9udW1iZXI6IHsgbGFiZWw6ICdNZW1iZXIgTnVtYmVyJyB9LFxuICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnQ2FtcGFpZ24nIH0sXG4gICAgICBjcm1fbGVhZDogeyBsYWJlbDogJ0xlYWQnLCBoZWxwOiAnU2V0IHdoZW4gdGhlIG1lbWJlciB3YXMgYSBMZWFkIGF0IGVucm9sbG1lbnQgdGltZScgfSxcbiAgICAgIGNybV9jb250YWN0OiB7IGxhYmVsOiAnQ29udGFjdCcsIGhlbHA6ICdTZXQgd2hlbiB0aGUgbWVtYmVyIGlzIGFuIGV4aXN0aW5nIENvbnRhY3QnIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgc2VudDogJ1NlbnQnLCByZXNwb25kZWQ6ICdSZXNwb25kZWQnLFxuICAgICAgICAgIGNvbnZlcnRlZDogJ0NvbnZlcnRlZCcsIHVuc3Vic2NyaWJlZDogJ1Vuc3Vic2NyaWJlZCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYWRkZWRfZGF0ZTogeyBsYWJlbDogJ0FkZGVkIERhdGUnIH0sXG4gICAgICByZXNwb25zZV9kYXRlOiB7IGxhYmVsOiAnUmVzcG9uc2UgRGF0ZScgfSxcbiAgICAgIGhhc19yZXNwb25kZWQ6IHsgbGFiZWw6ICdIYXMgUmVzcG9uZGVkJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0Jhc2ljIEluZm9ybWF0aW9uJyB9LFxuICAgICAgcmVzcG9uc2U6IHsgbGFiZWw6ICdSZXNwb25zZSBUcmFja2luZycgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7XG4gICAgICBtYXJrX3Jlc3BvbmRlZDoge1xuICAgICAgICBsYWJlbDogJ01hcmsgUmVzcG9uZGVkJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdSZXNwb25zZSByZWNvcmRlZCBvbiB0aGlzIGNhbXBhaWduIG1lbWJlci4nLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lbi50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VuLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IGFwcFN1cmZhY2UgfSBmcm9tICcuL2VuL2FwcCc7XG5pbXBvcnQgeyBjdXN0b21lciB9IGZyb20gJy4vZW4vb2JqZWN0cy5jdXN0b21lcic7XG5pbXBvcnQgeyBwaXBlbGluZSB9IGZyb20gJy4vZW4vb2JqZWN0cy5waXBlbGluZSc7XG5pbXBvcnQgeyBjb21tZXJjZSB9IGZyb20gJy4vZW4vb2JqZWN0cy5jb21tZXJjZSc7XG5pbXBvcnQgeyBzZXJ2aWNlIH0gZnJvbSAnLi9lbi9vYmplY3RzLnNlcnZpY2UnO1xuaW1wb3J0IHsgYWN0aXZpdHkgfSBmcm9tICcuL2VuL29iamVjdHMuYWN0aXZpdHknO1xuaW1wb3J0IHsgbWFya2V0aW5nIH0gZnJvbSAnLi9lbi9vYmplY3RzLm1hcmtldGluZyc7XG5cbi8qKlxuICogRW5nbGlzaCAoZW4pIFx1MjAxNCBDUk0gQXBwIFRyYW5zbGF0aW9uc1xuICpcbiAqIFBlci1sb2NhbGUgZmlsZTogb25lIGZpbGUgcGVyIGxhbmd1YWdlLCBmb2xsb3dpbmcgdGhlIGBwZXJfbG9jYWxlYCBjb252ZW50aW9uLlxuICogRWFjaCBmaWxlIGV4cG9ydHMgYSBzaW5nbGUgYFRyYW5zbGF0aW9uRGF0YWAgb2JqZWN0IGZvciBpdHMgbG9jYWxlLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICpcbiAqIFRoaXMgYnVuZGxlIHdhcyBvbmUgZmlsZSBhbmQgaXQgaGFkIHJlYWNoZWQgODguNiUgb2YgdGhlIDEwMEtCIHNvdXJjZSBjYXBcbiAqIGBwbnBtIGh5Z2llbmVgIGVuZm9yY2VzLCBncm93aW5nIH4xLjJLQiBhIGRheS4gSXQgaXMgbm93IGFzc2VtYmxlZCBmcm9tXG4gKiBgLi88bG9jYWxlPi9gLCBvbiBhbiBheGlzIG1lYXN1cmVkIHJhdGhlciB0aGFuIGd1ZXNzZWQ6XG4gKlxuICogICAtIGV2ZXJ5IG5hbWVzcGFjZSB0aGF0IGlzIE5PVCBgb2JqZWN0c2AgXHUyMDE0IGBhcHBzYCwgYG1lc3NhZ2VzYCxcbiAqICAgICBgZGFzaGJvYXJkc2AsIGBkYXRhc2V0c2AsIGBwYWdlc2AsIGFuZCBhbnkgbmFtZXNwYWNlIGBUcmFuc2xhdGlvbkRhdGFgXG4gKiAgICAgZ2FpbnMgbGF0ZXIgXHUyMDE0IGxpdmVzIGluIGBhcHAudHNgLiBNZWFzdXJlZDogdGhvc2UgbmFtZXNwYWNlcyB0b2dldGhlclxuICogICAgIGFyZSB1bmRlciBhIHF1YXJ0ZXIgb2YgdGhlIGJ1bmRsZSwgYW5kIHRoZSBzY2hlbWEgYm91bmRzIGhvdyBtYW55IGNhblxuICogICAgIGV2ZXIgYXJyaXZlLCBzbyBvbmUgZmlsZSBob2xkcyB0aGVtIHdpdGggcm9vbSBsZWZ0O1xuICogICAtIGBvYmplY3RzYCBpcyA2OS03OCUgb2YgZXZlcnkgYnVuZGxlLCBzbyBpdCBpcyBwYXJ0aXRpb25lZCBhZ2Fpbiwgb25lXG4gKiAgICAgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHkgXHUyMDE0IGBjdXN0b21lcmAsIGBwaXBlbGluZWAsIGBjb21tZXJjZWAsXG4gKiAgICAgYHNlcnZpY2VgLCBgYWN0aXZpdHlgLCBgbWFya2V0aW5nYCBcdTIwMTQgYW5kIGEgREVUQUlMIG9iamVjdCBmb2xsb3dzIGl0c1xuICogICAgIG1hc3RlcjogbGluZSBpdGVtcyBmb2xsb3cgdGhlaXIgcXVvdGUgb3Igb3Bwb3J0dW5pdHksXG4gKiAgICAgYGNybV9ldmVudF9hdHRlbmRlZWAgZm9sbG93cyBgY3JtX2V2ZW50YCwgYGNybV9jYW1wYWlnbl9tZW1iZXJgXG4gKiAgICAgZm9sbG93cyBgY3JtX2NhbXBhaWduYCwgYGNybV9hcnRpY2xlX2ZlZWRiYWNrYCBmb2xsb3dzXG4gKiAgICAgYGNybV9rbm93bGVkZ2VfYXJ0aWNsZWAuXG4gKlxuICogQSBuYW1lc3BhY2UgYXhpcyBBTE9ORSB3YXMgbWVhc3VyZWQgYW5kIHJlamVjdGVkOiBpdCBsZWF2ZXMgYG9iamVjdHNgIGF0XG4gKiA2NS43S0IsIDMuOUtCIHVuZGVyIHRoZSBhZHZpc29yeSBiYW5kLCB3aGljaCBgb2JqZWN0c2AgZ3Jvd3RoIGNyb3NzZXMgaW5cbiAqIGFib3V0IG5pbmUgZGF5cy4gVGhlIGZhbWlseSBheGlzIHB1dHMgdGhlIGxhcmdlc3QgcGFydCBhdCAyNC4yJSBvZiB0aGUgY2FwLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBBIG5ldyBvYmplY3QgdHJhbnNsYXRpb24gYmVsb25ncyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseS4gRG8gbm90IGFkZFxuICogaXQgdG8gd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuIFx1MjAxNCB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0XG4gKiB0aGUgYmFuZCwgd2hpY2ggaXMgd2hhdCBzcGxpdCB0aGlzIGJ1bmRsZSBpbiB0aGUgZmlyc3QgcGxhY2UuXG4gKlxuICogXHUyNkEwXHVGRTBGIEEgdmFsdWUgdXNlZCBieSBtb3JlIHRoYW4gb25lIGZhbWlseSBsaXZlcyBpbiBgPGxvY2FsZT4vX3NoYXJlZC50c2AuIEFcbiAqIHZhbHVlIHVzZWQgYnkgZXhhY3RseSBvbmUgZmFtaWx5IGxpdmVzIGluIHRoYXQgZmFtaWx5J3MgZmlsZS5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgVGhlIGtleSBvcmRlciBiZWxvdyBpcyBMT0FELUJFQVJJTkcsIG5vdCBjb3NtZXRpYy4gYG9iamVjdHN0YWNrIGJ1aWxkYFxuICogc2VyaWFsaXNlcyB0aGlzIG9iamVjdCBpbnRvIGBkaXN0L29iamVjdHN0YWNrLmpzb25gIGluIGluc2VydGlvbiBvcmRlciBhbmRcbiAqIG5ldmVyIHNvcnRzIGl0LCBzbyBsaXN0aW5nIHRoZSByb3dzIGhlcmUgXHUyMDE0IHJhdGhlciB0aGFuIHNwcmVhZGluZyB0aGUgZmFtaWx5XG4gKiBmaWxlcyBcdTIwMTQgaXMgd2hhdCBrZWVwcyB0aGUgYnVpbHQgYXJ0aWZhY3QgYnl0ZS1pZGVudGljYWwgYWNyb3NzIHRoZSBzcGxpdC5cbiAqIFRoZSBvcmRlciBpcyB0aGlzIGJ1bmRsZSdzIG93biBoaXN0b3JpY2FsIGFjY3JldGlvbiBvcmRlciBhbmQgZGlmZmVyc1xuICogYmV0d2VlbiBsb2NhbGVzOyByZW9yZGVyaW5nIGl0IHJld3JpdGVzIHRoZSBhcnRpZmFjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVuOiBUcmFuc2xhdGlvbkRhdGEgPSB7XG4gIG9iamVjdHM6IHtcbiAgICBjcm1fYWNjb3VudDogY3VzdG9tZXIuY3JtX2FjY291bnQsXG4gICAgY3JtX2NvbnRhY3Q6IGN1c3RvbWVyLmNybV9jb250YWN0LFxuICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogc2VydmljZS5jcm1fa25vd2xlZGdlX2FydGljbGUsXG4gICAgY3JtX2ZvcmVjYXN0OiBwaXBlbGluZS5jcm1fZm9yZWNhc3QsXG4gICAgY3JtX2xlYWQ6IHBpcGVsaW5lLmNybV9sZWFkLFxuICAgIGNybV9vcHBvcnR1bml0eTogcGlwZWxpbmUuY3JtX29wcG9ydHVuaXR5LFxuICAgIGNybV9jYXNlOiBzZXJ2aWNlLmNybV9jYXNlLFxuICAgIGNybV9jb250cmFjdDogY29tbWVyY2UuY3JtX2NvbnRyYWN0LFxuICAgIGNybV9wcm9kdWN0OiBjb21tZXJjZS5jcm1fcHJvZHVjdCxcbiAgICBjcm1fcXVvdGU6IGNvbW1lcmNlLmNybV9xdW90ZSxcbiAgICBjcm1fdGFzazogYWN0aXZpdHkuY3JtX3Rhc2ssXG4gICAgY3JtX2NhbXBhaWduOiBtYXJrZXRpbmcuY3JtX2NhbXBhaWduLFxuICAgIGNybV9ldmVudDogYWN0aXZpdHkuY3JtX2V2ZW50LFxuICAgIGNybV9ldmVudF9hdHRlbmRlZTogYWN0aXZpdHkuY3JtX2V2ZW50X2F0dGVuZGVlLFxuICAgIGNybV9hcnRpY2xlX2ZlZWRiYWNrOiBzZXJ2aWNlLmNybV9hcnRpY2xlX2ZlZWRiYWNrLFxuICAgIGNybV9jYW1wYWlnbl9tZW1iZXI6IG1hcmtldGluZy5jcm1fY2FtcGFpZ25fbWVtYmVyLFxuICAgIGNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW06IHBpcGVsaW5lLmNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW0sXG4gICAgY3JtX3F1b3RlX2xpbmVfaXRlbTogY29tbWVyY2UuY3JtX3F1b3RlX2xpbmVfaXRlbSxcbiAgfSxcbiAgLi4uYXBwU3VyZmFjZSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vYXBwLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTlwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vYXBwLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IFFVT1RFX0RJU0NPVU5UX0NFSUxJTkcgfSBmcm9tICcuLi8uLi9vYmplY3RzL190aHJlc2hvbGRzJztcblxuLyoqXG4gKiBcdTdCODBcdTRGNTNcdTRFMkRcdTY1ODcgKHpoLUNOKSBcdTIwMTQgZXZlcnkgdHJhbnNsYXRpb24gbmFtZXNwYWNlIEVYQ0VQVCBgb2JqZWN0c2A6XG4gKiBgYXBwc2AsIGBtZXNzYWdlc2AsIGBkYXNoYm9hcmRzYCwgYGRhdGFzZXRzYCwgYHBhZ2VzYCwgYGZsb3dzYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi50c2AuXG4gKlxuICogQSBuYW1lc3BhY2UgYFRyYW5zbGF0aW9uRGF0YWAgZ2FpbnMgbGF0ZXIgbGFuZHMgaGVyZSB0b28sIGFuZCB0aGUgcm9vbSBpc1xuICogbWVhc3VyZWQ6IHRoaXMgZmlsZSBpcyB0aGUgc21hbGxlciBoYWxmIG9mIHRoZSBidW5kbGUsIGFuZCB0aGUgc2NoZW1hIGJvdW5kc1xuICogaG93IG1hbnkgbmFtZXNwYWNlcyBjYW4gZXZlciBhcnJpdmUuXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBTdXJmYWNlOiBPbWl0PFRyYW5zbGF0aW9uRGF0YSwgJ29iamVjdHMnPiA9IHtcbiAgYXBwczoge1xuICAgIGNybV9lbnRlcnByaXNlOiB7XG4gICAgICBsYWJlbDogJ0hvdENSTScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1NkRCNVx1NzZENlx1OTUwMFx1NTUyRVx1MzAwMVx1NjcwRFx1NTJBMVx1NTQ4Q1x1NUUwMlx1NTczQVx1ODQyNVx1OTUwMFx1NzY4NFx1NUJBMlx1NjIzN1x1NTE3M1x1N0NGQlx1N0JBMVx1NzQwNlx1N0NGQlx1N0VERicsXG4gICAgICAvLyBLZXllZCBieSBuYXZpZ2F0aW9uLW5vZGUgYGlkYCAoYSBmbGF0IGtleXNwYWNlIHJlZ2FyZGxlc3Mgb2YgZGVwdGgpLlxuICAgICAgbmF2aWdhdGlvbjoge1xuICAgICAgICBncm91cF9hY3Rpdml0eTogeyBsYWJlbDogJ1x1NkQzQlx1NTJBOCcgfSxcbiAgICAgICAgbmF2X2V2ZW50OiB7IGxhYmVsOiAnXHU2RDNCXHU1MkE4JyB9LFxuICAgICAgICBuYXZfYWN0aXZpdHlfZGFzaGJvYXJkOiB7IGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU2RDNCXHU1MkE4JyB9LFxuICAgICAgICBuYXZfbXlfY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTYyMTFcdTc2ODRcdTY1RTVcdTUzODYnIH0sXG4gICAgICAgIG5hdl9ob21lOiB7IGxhYmVsOiAnXHU5OTk2XHU5ODc1JyB9LFxuXG4gICAgICAgIGdyb3VwX3NhbGVzOiB7IGxhYmVsOiAnXHU5NTAwXHU1NTJFJyB9LFxuICAgICAgICBuYXZfbGVhZDogeyBsYWJlbDogJ1x1N0VCRlx1N0QyMicgfSxcbiAgICAgICAgbmF2X2FjY291bnQ6IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzcnIH0sXG4gICAgICAgIG5hdl9hY2NvdW50X3dvcmtiZW5jaDogeyBsYWJlbDogJ1x1NUJBMlx1NjIzN1x1NURFNVx1NEY1Q1x1NTNGMCcgfSxcbiAgICAgICAgbmF2X2NvbnRhY3Q6IHsgbGFiZWw6ICdcdTgwNTRcdTdDRkJcdTRFQkEnIH0sXG4gICAgICAgIG5hdl9vcHBvcnR1bml0eTogeyBsYWJlbDogJ1x1NTU0Nlx1NjczQScgfSxcbiAgICAgICAgbmF2X3F1b3RlOiB7IGxhYmVsOiAnXHU2MkE1XHU0RUY3JyB9LFxuICAgICAgICBuYXZfY29udHJhY3Q6IHsgbGFiZWw6ICdcdTU0MDhcdTU0MEMnIH0sXG4gICAgICAgIG5hdl9wcm9kdWN0OiB7IGxhYmVsOiAnXHU0RUE3XHU1NEMxJyB9LFxuICAgICAgICBuYXZfc2FsZXNfZGFzaGJvYXJkOiB7IGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU0RTFBXHU3RUU5JyB9LFxuXG4gICAgICAgIGdyb3VwX3dvcms6IHsgbGFiZWw6ICdcdTYyMTFcdTc2ODRcdTVERTVcdTRGNUMnIH0sXG4gICAgICAgIG5hdl9teV90YXNrczogeyBsYWJlbDogJ1x1NjIxMVx1NzY4NFx1NEVGQlx1NTJBMScgfSxcbiAgICAgICAgbmF2X215X2RlYWxzOiB7IGxhYmVsOiAnXHU2MjExXHU3Njg0XHU1NTQ2XHU2NzNBJyB9LFxuICAgICAgICBuYXZfbXlfbGVhZHM6IHsgbGFiZWw6ICdcdTYyMTFcdTc2ODRcdTdFQkZcdTdEMjInIH0sXG4gICAgICAgIG5hdl9teV9jYXNlczogeyBsYWJlbDogJ1x1NjIxMVx1NzY4NFx1NURFNVx1NTM1NScgfSxcbiAgICAgICAgbmF2X2FwcHJvdmFsX3JlcXVlc3RzOiB7IGxhYmVsOiAnXHU1Rjg1XHU2MjExXHU1QkExXHU2Mjc5JyB9LFxuXG4gICAgICAgIGdyb3VwX21hcmtldGluZzogeyBsYWJlbDogJ1x1NUUwMlx1NTczQVx1ODQyNVx1OTUwMCcgfSxcbiAgICAgICAgbmF2X2NhbXBhaWduOiB7IGxhYmVsOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4JyB9LFxuXG4gICAgICAgIGdyb3VwX3NlcnZpY2U6IHsgbGFiZWw6ICdcdTY3MERcdTUyQTEnIH0sXG4gICAgICAgIG5hdl9jYXNlOiB7IGxhYmVsOiAnXHU1REU1XHU1MzU1JyB9LFxuICAgICAgICBuYXZfa25vd2xlZGdlOiB7IGxhYmVsOiAnXHU3N0U1XHU4QkM2XHU1RTkzJyB9LFxuICAgICAgICBuYXZfc2VydmljZV9kYXNoYm9hcmQ6IHsgbGFiZWw6ICdcdTY3MERcdTUyQTFcdTY5ODJcdTg5QzgnIH0sXG5cbiAgICAgICAgZ3JvdXBfaW5zaWdodHM6IHsgbGFiZWw6ICdcdTY1NzBcdTYzNkVcdTZEMUVcdTVCREYnIH0sXG4gICAgICAgIG5hdl9jcm1fZGFzaGJvYXJkOiB7IGxhYmVsOiAnQ1JNIFx1NjAzQlx1ODlDOCcgfSxcbiAgICAgICAgbmF2X2ZvcmVjYXN0OiB7IGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU5ODg0XHU2RDRCJyB9LFxuICAgICAgICBuYXZfcmVwb3J0X3BpcGVsaW5lX2NvdmVyYWdlOiB7IGxhYmVsOiAnXHU3QkExXHU5MDUzXHU4OTg2XHU3NkQ2XHU3Mzg3JyB9LFxuICAgICAgICBuYXZfcmVwb3J0X2xlYWRfaW5mbG93OiB7IGxhYmVsOiAnXHU3RUJGXHU3RDIyXHU2RDQxXHU1MTY1JyB9LFxuICAgICAgICBuYXZfcmVwb3J0X3NsYTogeyBsYWJlbDogJ1NMQSBcdThGQkVcdTYyMTAnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIG1lc3NhZ2VzOiB7XG4gICAgJ2NvbW1vbi5zYXZlJzogJ1x1NEZERFx1NUI1OCcsXG4gICAgJ2NvbW1vbi5jYW5jZWwnOiAnXHU1M0Q2XHU2RDg4JyxcbiAgICAnY29tbW9uLmRlbGV0ZSc6ICdcdTUyMjBcdTk2NjQnLFxuICAgICdjb21tb24uZWRpdCc6ICdcdTdGMTZcdThGOTEnLFxuICAgICdjb21tb24uY3JlYXRlJzogJ1x1NjVCMFx1NUVGQScsXG4gICAgJ2NvbW1vbi5zZWFyY2gnOiAnXHU2NDFDXHU3RDIyJyxcbiAgICAnY29tbW9uLmZpbHRlcic6ICdcdTdCNUJcdTkwMDknLFxuICAgICdjb21tb24uZXhwb3J0JzogJ1x1NUJGQ1x1NTFGQScsXG4gICAgJ2NvbW1vbi5iYWNrJzogJ1x1OEZENFx1NTZERScsXG4gICAgJ2NvbW1vbi5jb25maXJtJzogJ1x1Nzg2RVx1OEJBNCcsXG4gICAgJ25hdi5zYWxlcyc6ICdcdTk1MDBcdTU1MkUnLFxuICAgICduYXYuc2VydmljZSc6ICdcdTY3MERcdTUyQTEnLFxuICAgICduYXYubWFya2V0aW5nJzogJ1x1ODQyNVx1OTUwMCcsXG4gICAgJ25hdi5wcm9kdWN0cyc6ICdcdTRFQTdcdTU0QzEnLFxuICAgICduYXYuYW5hbHl0aWNzJzogJ1x1NjU3MFx1NjM2RVx1NTIwNlx1Njc5MCcsXG4gICAgJ3N1Y2Nlc3Muc2F2ZWQnOiAnXHU4QkIwXHU1RjU1XHU0RkREXHU1QjU4XHU2MjEwXHU1MjlGJyxcbiAgICAnc3VjY2Vzcy5jb252ZXJ0ZWQnOiAnXHU3RUJGXHU3RDIyXHU4RjZDXHU1MzE2XHU2MjEwXHU1MjlGJyxcbiAgICAnY29uZmlybS5kZWxldGUnOiAnXHU3ODZFXHU1QjlBXHU4OTgxXHU1MjIwXHU5NjY0XHU2QjY0XHU4QkIwXHU1RjU1XHU1NDE3XHVGRjFGJyxcbiAgICAnY29uZmlybS5jb252ZXJ0X2xlYWQnOiAnXHU1QzA2XHU2QjY0XHU3RUJGXHU3RDIyXHU4RjZDXHU1MzE2XHU0RTNBXHU1QkEyXHU2MjM3XHUzMDAxXHU4MDU0XHU3Q0ZCXHU0RUJBXHU1NDhDXHU1NTQ2XHU2NzNBXHVGRjFGJyxcbiAgICAnZXJyb3IucmVxdWlyZWQnOiAnXHU2QjY0XHU1QjU3XHU2QkI1XHU0RTNBXHU1RkM1XHU1ODZCXHU5ODc5JyxcbiAgICAnZXJyb3IubG9hZF9mYWlsZWQnOiAnXHU2NTcwXHU2MzZFXHU1MkEwXHU4RjdEXHU1OTMxXHU4RDI1JyxcbiAgfSxcbiAgZGFzaGJvYXJkczoge1xuICAgIHNhbGVzX2FjdGl2aXR5X2Rhc2hib2FyZDoge1xuICAgICAgbGFiZWw6ICdcdTk1MDBcdTU1MkVcdTZEM0JcdTUyQTgnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdThDMDFcdTU3MjhcdTU0OENcdTVCQTJcdTYyMzdcdTZDOUZcdTkwMUFcdTMwMDFcdTk4OTFcdTczODdcdTU5ODJcdTRGNTVcdUZGMENcdTRFRTVcdTUzQ0FcdTU0RUFcdTRFOUJcdTVCQTJcdTYyMzdcdTVERjJcdTdFQ0ZcdTZDODlcdTlFRDgnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICBpbnRlcmFjdGlvbnNfaGVsZDogeyB0aXRsZTogJ1x1NURGMlx1OEJCMFx1NUY1NVx1NEU5Mlx1NTJBOCcsIGRlc2NyaXB0aW9uOiAnXHU3NzFGXHU1QjlFXHU1M0QxXHU3NTFGXHU4RkM3XHU3Njg0XHU5MDFBXHU4QkREXHU0RTBFXHU0RjFBXHU4QkFFJyB9LFxuICAgICAgICBtZWV0aW5nc19ib29rZWQ6IHsgdGl0bGU6ICdcdTVERjJcdTk4ODRcdTdFQTZcdTRGMUFcdThCQUUnLCBkZXNjcmlwdGlvbjogJ1x1NURGMlx1NjM5Mlx1NTE2NVx1NjVFNVx1NTM4Nlx1NEY0Nlx1NUMxQVx1NjcyQVx1NEUzRVx1ODg0Q1x1NzY4NFx1NEYxQVx1OEJBRScgfSxcbiAgICAgICAgY3VzdG9tZXJfbWludXRlczogeyB0aXRsZTogJ1x1NUJBMlx1NjIzN1x1NjNBNVx1ODlFNlx1NTIwNlx1OTQ5Rlx1NjU3MCcsIGRlc2NyaXB0aW9uOiAnXHU5NzYyXHU1NDExXHU1QkEyXHU2MjM3XHU3Njg0XHU2MDNCXHU2NUY2XHU5NTdGJyB9LFxuICAgICAgICB0YXNrc19jb21wbGV0ZWQ6IHsgdGl0bGU6ICdcdTVERjJcdTVCOENcdTYyMTBcdTRFRkJcdTUyQTEnLCBkZXNjcmlwdGlvbjogJ1x1NURGMlx1OTVFRFx1NzNBRlx1NzY4NFx1OERERlx1OEZEQlx1NEU4Qlx1OTg3OVx1MjAxNFx1MjAxNFx1NkQzQlx1NTJBOFx1NzY4NFx1NTNFNlx1NEUwMFx1NTM0QScgfSxcbiAgICAgICAgYWN0aXZpdHlfYnlfcmVwOiB7IHRpdGxlOiAnXHU2MzA5XHU5NTAwXHU1NTJFXHU0RUUzXHU4ODY4XHU3RURGXHU4QkExXHU3Njg0XHU2RDNCXHU1MkE4JywgZGVzY3JpcHRpb246ICdcdTZCQ0ZcdTRGNERcdThEMUZcdThEMjNcdTRFQkFcdThCQjBcdTVGNTVcdTc2ODRcdTRFOTJcdTUyQThcdTY1NzAnIH0sXG4gICAgICAgIGFjdGl2aXR5X2J5X3dlZWs6IHsgdGl0bGU6ICdcdTZCQ0ZcdTU0NjhcdTZEM0JcdTUyQThcdTkxQ0YnLCBkZXNjcmlwdGlvbjogJ1x1NkJDRlx1NTQ2OFx1NEU5Mlx1NTJBOFx1NjU3MCcgfSxcbiAgICAgICAgYWN0aXZpdHlfbWl4OiB7IHRpdGxlOiAnXHU2RDNCXHU1MkE4XHU2Nzg0XHU2MjEwJywgZGVzY3JpcHRpb246ICdcdTkwMUFcdThCRERcdTMwMDFcdTRGMUFcdThCQUVcdTRFMEVcdTZGMTRcdTc5M0FcdTc2ODRcdTUzNjBcdTZCRDQnIH0sXG4gICAgICAgIGFjdGl2aXR5X2J5X3JlY29yZF90eXBlOiB7IHRpdGxlOiAnXHU2RDNCXHU1MkE4XHU4NDNEXHU1NzI4XHU1NEVBXHU5MUNDJywgZGVzY3JpcHRpb246ICdcdTZGMEZcdTY1OTdcdTc2ODRcdTU0RUFcdTRFMkFcdTczQUZcdTgyODJcdTgzQjdcdTVGOTdcdTRFODZcdTUxNzNcdTZDRTgnIH0sXG4gICAgICAgIGRlYWxfYWN0aXZpdHk6IHsgdGl0bGU6ICdcdTU1NDZcdTY3M0FcdTRFMEFcdTc2ODRcdTRFOTJcdTUyQTgnLCBkZXNjcmlwdGlvbjogJ1x1NTE3M1x1ODA1NFx1NTIzMFx1NTU0Nlx1NjczQVx1NzY4NFx1NURGMlx1OEJCMFx1NUY1NVx1NEU5Mlx1NTJBOCcgfSxcbiAgICAgICAgb3Blbl9kZWFsc19mb3JfYWN0aXZpdHk6IHsgdGl0bGU6ICdcdThGREJcdTg4NENcdTRFMkRcdTc2ODRcdTU1NDZcdTY3M0EnLCBkZXNjcmlwdGlvbjogJ1x1NEVDRFx1NTcyOFx1NjNBOFx1OEZEQlx1NzY4NFx1NTU0Nlx1NjczQVx1NjU3MCcgfSxcbiAgICAgICAgcXVpZXRfYWNjb3VudHNfMzA6IHsgdGl0bGU6ICdcdTZDODlcdTlFRDggMzAgXHU1OTI5XHU0RUU1XHU0RTBBJywgZGVzY3JpcHRpb246ICdcdTRFMDBcdTRFMkFcdTY3MDhcdTUxODVcdTZDQTFcdTY3MDlcdTRFRkJcdTRGNTVcdTRFOTJcdTUyQThcdThCQjBcdTVGNTVcdTc2ODRcdTZEM0JcdThEQzNcdTVCQTJcdTYyMzcnIH0sXG4gICAgICAgIHF1aWV0X2FjY291bnRzXzYwOiB7IHRpdGxlOiAnXHU2Qzg5XHU5RUQ4IDYwIFx1NTkyOVx1NEVFNVx1NEUwQScsIGRlc2NyaXB0aW9uOiAnXHU0RTI0XHU0RTJBXHU2NzA4XHU2NUUwXHU4MDU0XHU3Q0ZCXHUyMDE0XHUyMDE0XHU5OENFXHU5NjY5XHU5NjA4XHU1MDNDJyB9LFxuICAgICAgICBxdWlldF9hY2NvdW50c185MDogeyB0aXRsZTogJ1x1NkM4OVx1OUVEOCA5MCBcdTU5MjlcdTRFRTVcdTRFMEEnLCBkZXNjcmlwdGlvbjogJ1x1NjU3NFx1NjU3NFx1NEUwMFx1NEUyQVx1NUI2M1x1NUVBNlx1NkNBMVx1NjcwOVx1ODA1NFx1N0NGQicgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcm1fb3ZlcnZpZXdfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ0NSTSBcdTYwM0JcdTg5QzgnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTY1MzZcdTUxNjVcdTYzMDdcdTY4MDdcdTMwMDFcdTdCQTFcdTkwNTNcdTUyMDZcdTY3OTBcdTRFMEVcdTU1NDZcdTY3M0FcdTZEMUVcdTVCREYnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICB0b3RhbF9yZXZlbnVlOiB7IHRpdGxlOiAnXHU2MDNCXHU2NTM2XHU1MTY1JywgZGVzY3JpcHRpb246ICdcdTY3MkNcdTY3MUZcdTVERjJcdTYyMTBcdTRFQTRcdTY1MzZcdTUxNjUnIH0sXG4gICAgICAgIGFjdGl2ZV9kZWFsczogeyB0aXRsZTogJ1x1NkQzQlx1OERDM1x1NTU0Nlx1NjczQScsIGRlc2NyaXB0aW9uOiAnXHU3QkExXHU5MDUzXHU0RTJEXHU4RkRCXHU4ODRDXHU0RTJEXHU3Njg0XHU1NTQ2XHU2NzNBJyB9LFxuICAgICAgICB3b25fZGVhbHM6IHsgdGl0bGU6ICdcdThENjJcdTUzNTVcdTY1NzAnLCBkZXNjcmlwdGlvbjogJ1x1NjcyQ1x1NjcxRlx1NURGMlx1N0VEM1x1Njg0OFx1NTU0Nlx1NjczQVx1NEUyRFx1OEQ2Mlx1NTM1NVx1NzY4NFx1NjAzQlx1NjU3MCcgfSxcbiAgICAgICAgYXZnX2RlYWxfc2l6ZTogeyB0aXRsZTogJ1x1NUU3M1x1NTc0N1x1OEJBMlx1NTM1NVx1OTFEMVx1OTg5RCcsIGRlc2NyaXB0aW9uOiAnXHU1REYyXHU2MjEwXHU0RUE0XHU1NTQ2XHU2NzNBXHU3Njg0XHU1RTczXHU1NzQ3XHU5MUQxXHU5ODlEJyB9LFxuICAgICAgICByZXZlbnVlX3RyZW5kczogeyB0aXRsZTogJ1x1NjUzNlx1NTE2NVx1OEQ4Qlx1NTJCRicsIGRlc2NyaXB0aW9uOiAnXHU4RkM3XHU1M0JCIDEyIFx1NEUyQVx1NjcwOFx1NzY4NFx1NURGMlx1NjIxMFx1NEVBNFx1NjUzNlx1NTE2NScgfSxcbiAgICAgICAgbGVhZF9zb3VyY2U6IHsgdGl0bGU6ICdcdTdFQkZcdTdEMjJcdTY3NjVcdTZFOTAnLCBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1ODNCN1x1NUJBMlx1NkUyMFx1OTA1M1x1N0VERlx1OEJBMVx1NzY4NFx1N0JBMVx1OTA1M1x1OTFEMVx1OTg5RCcgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfc3RhZ2U6IHsgdGl0bGU6ICdcdTk2MzZcdTZCQjVcdTdCQTFcdTkwNTNcdTUyMDZcdTVFMDMnLCBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1OTYzNlx1NkJCNVx1N0VERlx1OEJBMVx1NzY4NFx1OEZEQlx1ODg0Q1x1NEUyRFx1NTU0Nlx1NjczQVx1OTFEMVx1OTg5RCcgfSxcbiAgICAgICAgdG9wX3Byb2R1Y3RzOiB7IHRpdGxlOiAnXHU3MEVEXHU5NUU4XHU0RUE3XHU1NEMxJywgZGVzY3JpcHRpb246ICdcdTYzMDlcdTRFQTdcdTU0QzFcdTdDN0JcdTUyMkJcdTdFREZcdThCQTFcdTc2ODRcdTc2RUVcdTVGNTVcdTRFRjdcdTY1MzZcdTUxNjUnIH0sXG4gICAgICAgIHBpcGVsaW5lX2J5X293bmVyOiB7IHRpdGxlOiAnXHU2MzA5XHU4RDFGXHU4RDIzXHU0RUJBXHU3RURGXHU4QkExXHU3QkExXHU5MDUzJywgZGVzY3JpcHRpb246ICdcdTU0MDRcdTk1MDBcdTU1MkVcdThEMUZcdThEMjNcdTRFQkFcdTc2ODRcdThGREJcdTg4NENcdTRFMkRcdTdCQTFcdTkwNTNcdTkxRDFcdTk4OURcdTRFMEVcdTU1NDZcdTY3M0FcdTY1NzAnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZXhlY3V0aXZlX2Rhc2hib2FyZDoge1xuICAgICAgbGFiZWw6ICdcdTlBRDhcdTdCQTFcdTYwM0JcdTg5QzgnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTk3NjJcdTU0MTFcdTdCQTFcdTc0MDZcdTVDNDJcdTc2ODRcdTY1MzZcdTUxNjVcdTMwMDFcdTVCQTJcdTYyMzdcdTRFMEVcdTdCQTFcdTkwNTNcdTlBRDhcdTk2MzZcdTYzMDdcdTY4MDcnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICB0b3RhbF9yZXZlbnVlX3l0ZDogeyB0aXRsZTogJ1x1NUU3NFx1NUVBNlx1N0QyRlx1OEJBMVx1NjUzNlx1NTE2NScsIGRlc2NyaXB0aW9uOiAnXHU2NzJDXHU1RTc0XHU1RUE2XHU1REYyXHU2MjEwXHU0RUE0XHU2NTM2XHU1MTY1JyB9LFxuICAgICAgICB0b3RhbF9hY2NvdW50czogeyB0aXRsZTogJ1x1NkQzQlx1OERDM1x1NUJBMlx1NjIzNycsIGRlc2NyaXB0aW9uOiAnXHU4MUYzXHU1QzExXHU1QjU4XHU1NzI4XHU0RTAwXHU5ODc5XHU2RDNCXHU4REMzXHU1MTczXHU3Q0ZCXHU3Njg0XHU1QkEyXHU2MjM3JyB9LFxuICAgICAgICB0b3RhbF9jb250YWN0czogeyB0aXRsZTogJ1x1ODA1NFx1N0NGQlx1NEVCQVx1NjAzQlx1NjU3MCcsIGRlc2NyaXB0aW9uOiAnXHU5MDFBXHU4QkFGXHU1RjU1XHU0RTJEXHU3Njg0XHU4MDU0XHU3Q0ZCXHU0RUJBJyB9LFxuICAgICAgICBvcGVuX2xlYWRzOiB7IHRpdGxlOiAnXHU2NzJBXHU4RjZDXHU1MzE2XHU3RUJGXHU3RDIyJywgZGVzY3JpcHRpb246ICdcdTZGMEZcdTY1OTdcdTRFMkRcdTVDMUFcdTY3MkFcdThGNkNcdTUzMTZcdTc2ODRcdTdFQkZcdTdEMjInIH0sXG4gICAgICAgIHJldmVudWVfdHJlbmQ6IHsgdGl0bGU6ICdcdTY1MzZcdTUxNjVcdThEOEJcdTUyQkYnLCBkZXNjcmlwdGlvbjogJ1x1OEZDN1x1NTNCQiAxMiBcdTRFMkFcdTY3MDhcdTc2ODRcdTVERjJcdTYyMTBcdTRFQTRcdTY1MzZcdTUxNjUnIH0sXG4gICAgICAgIHJldmVudWVfYnlfaW5kdXN0cnk6IHsgdGl0bGU6ICdcdTg4NENcdTRFMUFcdTY1MzZcdTUxNjVcdTUyMDZcdTVFMDMnLCBkZXNjcmlwdGlvbjogJ1x1NjcyQ1x1NUU3NFx1NUVBNlx1NURGMlx1NjIxMFx1NEVBNFx1NjUzNlx1NTE2NVx1NjMwOVx1NUJBMlx1NjIzN1x1ODg0Q1x1NEUxQVx1NjJDNlx1NTIwNicgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfc3RhZ2U6IHsgdGl0bGU6ICdcdTk2MzZcdTZCQjVcdTdCQTFcdTkwNTNcdTUyMDZcdTVFMDMnLCBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1OTYzNlx1NkJCNVx1N0VERlx1OEJBMVx1NzY4NFx1OEZEQlx1ODg0Q1x1NEUyRFx1NTU0Nlx1NjczQVx1OTFEMVx1OTg5RCcgfSxcbiAgICAgICAgbmV3X2FjY291bnRzX2J5X21vbnRoOiB7IHRpdGxlOiAnXHU2NUIwXHU1ODlFXHU1QkEyXHU2MjM3JywgZGVzY3JpcHRpb246ICdcdThGQzdcdTUzQkIgNiBcdTRFMkFcdTY3MDhcdTc2ODRcdTVCQTJcdTYyMzdcdTUyMUJcdTVFRkFcdTgyODJcdTU5NEYnIH0sXG4gICAgICAgIGFjY291bnRzX2J5X2luZHVzdHJ5OiB7IHRpdGxlOiAnXHU2MzA5XHU4ODRDXHU0RTFBXHU3RURGXHU4QkExXHU1QkEyXHU2MjM3JywgZGVzY3JpcHRpb246ICdcdTU0MDRcdTg4NENcdTRFMUFcdTc2ODRcdTVFNzRcdTg0MjVcdTY1MzZcdTYwM0JcdTk4OURcdTRFMEVcdTVCQTJcdTYyMzdcdTY1NzAnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgc2FsZXNfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ1x1OTUwMFx1NTUyRVx1NEUxQVx1N0VFOScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1N0JBMVx1OTA1M1x1NTIwNlx1Njc5MFx1MzAwMVx1OEQ2Mlx1NzM4N1x1OEQ4Qlx1NTJCRlx1NTNDQVx1OTUwMFx1NTUyRVx1NEVFM1x1ODg2OFx1N0VFOVx1NjU0OCcsXG4gICAgICB3aWRnZXRzOiB7XG4gICAgICAgIHRvdGFsX3BpcGVsaW5lX3ZhbHVlOiB7IHRpdGxlOiAnXHU3QkExXHU5MDUzXHU2MDNCXHU5ODlEJywgZGVzY3JpcHRpb246ICdcdTYyNDBcdTY3MDlcdThGREJcdTg4NENcdTRFMkRcdTU1NDZcdTY3M0FcdTkxRDFcdTk4OURcdTU0MDhcdThCQTEnIH0sXG4gICAgICAgIGNsb3NlZF93b25fcXRkOiB7IHRpdGxlOiAnXHU2NzJDXHU1QjYzXHU1RUE2XHU1REYyXHU2MjEwXHU0RUE0JywgZGVzY3JpcHRpb246ICdcdTY3MkNcdTVCNjNcdTVFQTZcdTVERjJcdThENjJcdTVGOTdcdTc2ODRcdTY1MzZcdTUxNjUnIH0sXG4gICAgICAgIG9wZW5fb3Bwb3J0dW5pdGllczogeyB0aXRsZTogJ1x1OEZEQlx1ODg0Q1x1NEUyRFx1NTU0Nlx1NjczQScsIGRlc2NyaXB0aW9uOiAnXHU2QjYzXHU1NzI4XHU2M0E4XHU4RkRCXHU3Njg0XHU2RDNCXHU4REMzXHU1NTQ2XHU2NzNBJyB9LFxuICAgICAgICBhdmdfZGVhbF9zaXplOiB7IHRpdGxlOiAnXHU1RTczXHU1NzQ3XHU4QkEyXHU1MzU1XHU5MUQxXHU5ODlEJywgZGVzY3JpcHRpb246ICdcdTY3MkNcdTVCNjNcdTVFQTZcdTVERjJcdTYyMTBcdTRFQTRcdTU1NDZcdTY3M0FcdTc2ODRcdTVFNzNcdTU3NDdcdTkxRDFcdTk4OUQnIH0sXG4gICAgICAgIHBpcGVsaW5lX2J5X3N0YWdlOiB7IHRpdGxlOiAnXHU5NjM2XHU2QkI1XHU3QkExXHU5MDUzXHU1MjA2XHU1RTAzJywgZGVzY3JpcHRpb246ICdcdTYzMDlcdTk2MzZcdTZCQjVcdTdFREZcdThCQTFcdTc2ODRcdThGREJcdTg4NENcdTRFMkRcdTU1NDZcdTY3M0FcdTkxRDFcdTk4OUQnIH0sXG4gICAgICAgIG1vbnRobHlfcmV2ZW51ZV90cmVuZDogeyB0aXRsZTogJ1x1NjcwOFx1NUVBNlx1NjUzNlx1NTE2NVx1OEQ4Qlx1NTJCRicsIGRlc2NyaXB0aW9uOiAnXHU4RkM3XHU1M0JCIDEyIFx1NEUyQVx1NjcwOFx1NzY4NFx1NURGMlx1NjIxMFx1NEVBNFx1NjUzNlx1NTE2NScgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfZm9yZWNhc3RfY2F0ZWdvcnk6IHsgdGl0bGU6ICdcdTk4ODRcdTZENEJcdTdDN0JcdTUyMkJcdTdCQTFcdTkwNTNcdTUyMDZcdTVFMDMnLCBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1OTg4NFx1NkQ0Qlx1N0M3Qlx1NTIyQlx1N0VERlx1OEJBMVx1NzY4NFx1OEZEQlx1ODg0Q1x1NEUyRFx1N0JBMVx1OTA1M1x1OTFEMVx1OTg5RCcgfSxcbiAgICAgICAgbGVhZF9zb3VyY2VfYnJlYWtkb3duOiB7IHRpdGxlOiAnXHU3RUJGXHU3RDIyXHU2NzY1XHU2RTkwXHU1MjA2XHU1RTAzJywgZGVzY3JpcHRpb246ICdcdTYzMDlcdTY3NjVcdTZFOTBcdTdFREZcdThCQTFcdTc2ODRcdTdFQkZcdTdEMjJcdTY1NzBcdTkxQ0YnIH0sXG4gICAgICAgIG9wZW5fcGlwZWxpbmVfYnlfb3duZXI6IHsgdGl0bGU6ICdcdTYzMDlcdThEMUZcdThEMjNcdTRFQkFcdTdFREZcdThCQTFcdThGREJcdTg4NENcdTRFMkRcdTdCQTFcdTkwNTMnLCBkZXNjcmlwdGlvbjogJ1x1NTQwNFx1OTUwMFx1NTUyRVx1OEQxRlx1OEQyM1x1NEVCQVx1NzY4NFx1OEZEQlx1ODg0Q1x1NEUyRFx1N0JBMVx1OTA1M1x1OTFEMVx1OTg5RFx1MzAwMVx1NTU0Nlx1NjczQVx1NjU3MFx1NEUwRVx1NUU3M1x1NTc0N1x1OEQ2Mlx1NTM1NVx1Njk4Mlx1NzM4NycgfSxcbiAgICAgICAgcXVvdGFfYXR0YWlubWVudF9ieV9yZXA6IHsgdGl0bGU6ICdcdTYzMDlcdTk1MDBcdTU1MkVcdTRFRTNcdTg4NjhcdTdFREZcdThCQTFcdTkxNERcdTk4OURcdThGQkVcdTYyMTAnLCBkZXNjcmlwdGlvbjogJ1x1Njc2NVx1ODFFQVx1OTg4NFx1NkQ0Qlx1NUZFQlx1NzE2N1x1NzY4NFx1NTQwNFx1OTUwMFx1NTUyRVx1NEVFM1x1ODg2OFx1NjcyQ1x1NUI2M1x1NUVBNlx1OTE0RFx1OTg5RFx1MzAwMVx1NURGMlx1NjIxMFx1NEVBNFx1NjUzNlx1NTE2NVx1NEUwRVx1OEZCRVx1NjIxMFx1NzM4NycgfSxcbiAgICAgICAgcGlwZWxpbmVfc3RhZ2VfYnlfc291cmNlOiB7IHRpdGxlOiAnXHU5NjM2XHU2QkI1IFx1MDBENyBcdTdFQkZcdTdEMjJcdTY3NjVcdTZFOTAnLCBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1OTYzNlx1NkJCNVx1NTQ4Q1x1Njc2NVx1NkU5MFx1NEVBNFx1NTNDOVx1N0VERlx1OEJBMVx1OEZEQlx1ODg0Q1x1NEUyRFx1NTU0Nlx1NjczQVx1OTFEMVx1OTg5RCcgfSxcbiAgICAgICAgd2luX3JhdGVfMTJtOiB7IHRpdGxlOiAnXHU4RDYyXHU3Mzg3XHVGRjA4XHU4RkQxIDEyIFx1NEUyQVx1NjcwOFx1RkYwOScsIGRlc2NyaXB0aW9uOiAnXHU4RkQxIDEyIFx1NEUyQVx1NjcwOFx1NURGMlx1N0VEM1x1NTM1NVx1NTU0Nlx1NjczQVx1NEUyRFx1OEQ2Mlx1NTM1NVx1NjI0MFx1NTM2MFx1NzY4NFx1NkJENFx1NEY4QicgfSxcbiAgICAgICAgd29uX2RlYWxzXzEybTogeyB0aXRsZTogJ1x1OEQ2Mlx1NTM1NVx1NjU3MFx1RkYwOFx1OEZEMSAxMiBcdTRFMkFcdTY3MDhcdUZGMDknLCBkZXNjcmlwdGlvbjogJ1x1OEQ2Mlx1NzM4N1x1NzY4NFx1NTIwNlx1NUI1MCcgfSxcbiAgICAgICAgbG9zdF9kZWFsc18xMm06IHsgdGl0bGU6ICdcdTRFMjJcdTUzNTVcdTY1NzBcdUZGMDhcdThGRDEgMTIgXHU0RTJBXHU2NzA4XHVGRjA5JywgZGVzY3JpcHRpb246ICdcdThENjJcdTczODdcdTUyMDZcdTZCQ0RcdTc2ODRcdTUzRTZcdTRFMDBcdTUzNEEnIH0sXG4gICAgICAgIHdpbl9yYXRlX2J5X293bmVyOiB7IHRpdGxlOiAnXHU2MzA5XHU5NTAwXHU1NTJFXHU0RUUzXHU4ODY4XHU3RURGXHU4QkExXHU4RDYyL1x1NEUyMlx1NTM1NScsIGRlc2NyaXB0aW9uOiAnXHU4RkQxIDEyIFx1NEUyQVx1NjcwOFx1NTQwNFx1OTUwMFx1NTUyRVx1NEVFM1x1ODg2OFx1NzY4NFx1OEQ2Mlx1NTM1NVx1NjU3MFx1MzAwMVx1NEUyMlx1NTM1NVx1NjU3MFx1NEUwRVx1OEQ2Mlx1NzM4NycgfSxcbiAgICAgICAgd2luX3JhdGVfYnlfbGVhZF9zb3VyY2U6IHsgdGl0bGU6ICdcdTYzMDlcdTdFQkZcdTdEMjJcdTY3NjVcdTZFOTBcdTdFREZcdThCQTFcdThENjIvXHU0RTIyXHU1MzU1JywgZGVzY3JpcHRpb246ICdcdThGRDEgMTIgXHU0RTJBXHU2NzA4XHU1NEVBXHU0RTlCXHU2NzY1XHU2RTkwXHU1RTI2XHU2NzY1XHU3Njg0XHU1NTQ2XHU2NzNBXHU3NzFGXHU2QjYzXHU2MjEwXHU0RUE0JyB9LFxuICAgICAgICBsb3NzX3JlYXNvbl9icmVha2Rvd246IHsgdGl0bGU6ICdcdTRFMjJcdTUzNTVcdTUzOUZcdTU2RTBcdTUyMDZcdTY3OTAnLCBkZXNjcmlwdGlvbjogJ1x1OEZEMSAxMiBcdTRFMkFcdTY3MDhcdTRFMjJcdTUzNTVcdTYzMDlcdTUzOUZcdTU2RTBcdTUyMDZcdTVFMDMnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgc2VydmljZV9kYXNoYm9hcmQ6IHtcbiAgICAgIGxhYmVsOiAnXHU1QkEyXHU2MjM3XHU2NzBEXHU1MkExJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU1REU1XHU1MzU1XHU4RDFGXHU4RjdEXHUzMDAxU0xBIFx1NTA2NVx1NUVCN1x1NUVBNlx1NEUwRVx1NTkwNFx1NzQwNlx1N0VFOVx1NjU0OCcsXG4gICAgICB3aWRnZXRzOiB7XG4gICAgICAgIG9wZW5fY2FzZXM6IHsgdGl0bGU6ICdcdTY3MkFcdTUxNzNcdTk1RURcdTVERTVcdTUzNTUnLCBkZXNjcmlwdGlvbjogJ1x1NUMxQVx1NjcyQVx1NTE3M1x1OTVFRFx1NzY4NFx1NURFNVx1NTM1NScgfSxcbiAgICAgICAgY3JpdGljYWxfY2FzZXM6IHsgdGl0bGU6ICdcdTRFMjVcdTkxQ0RcdTVERTVcdTUzNTUnLCBkZXNjcmlwdGlvbjogJ1x1NjgwN1x1OEJCMFx1NEUzQVx1NEUyNVx1OTFDRFx1NEYxOFx1NTE0OFx1N0VBN1x1NzY4NFx1NjcyQVx1NTE3M1x1OTVFRFx1NURFNVx1NTM1NScgfSxcbiAgICAgICAgYXZnX3Jlc29sdXRpb25fdGltZTogeyB0aXRsZTogJ1x1NUU3M1x1NTc0N1x1ODlFM1x1NTFCM1x1NjVGNlx1OTU3RicsIGRlc2NyaXB0aW9uOiAnXHU1MTczXHU5NUVEXHU1REU1XHU1MzU1XHU3Njg0XHU1RTczXHU1NzQ3XHU1OTA0XHU3NDA2XHU2NUY2XHU5NTdGXHVGRjA4XHU1QzBGXHU2NUY2XHVGRjA5JyB9LFxuICAgICAgICBzbGFfdmlvbGF0aW9uczogeyB0aXRsZTogJ1NMQSBcdThGRERcdTdFQTYnLCBkZXNjcmlwdGlvbjogJ1x1NURGMlx1OEQ4NVx1NTFGQSBTTEEgXHU3Njg0XHU1REU1XHU1MzU1JyB9LFxuICAgICAgICBjYXNlc19ieV9zdGF0dXM6IHsgdGl0bGU6ICdcdTYzMDlcdTcyQjZcdTYwMDFcdTUyMDZcdTVFMDMnLCBkZXNjcmlwdGlvbjogJ1x1NURFNVx1NTM1NVx1NTcyOFx1NTQwNFx1NTkwNFx1NzQwNlx1OTYzNlx1NkJCNVx1NzY4NFx1NTIwNlx1NUUwMycgfSxcbiAgICAgICAgY2FzZXNfYnlfcHJpb3JpdHk6IHsgdGl0bGU6ICdcdTYzMDlcdTRGMThcdTUxNDhcdTdFQTdcdTUyMDZcdTVFMDMnLCBkZXNjcmlwdGlvbjogJ1x1NjcyQVx1NTE3M1x1OTVFRFx1NURFNVx1NTM1NVx1NjMwOVx1N0QyN1x1NjAyNVx1N0EwQlx1NUVBNlx1NzY4NFx1NTIwNlx1NUUwMycgfSxcbiAgICAgICAgY2FzZXNfYnlfb3JpZ2luOiB7IHRpdGxlOiAnXHU2MzA5XHU2NzY1XHU2RTkwXHU1MjA2XHU1RTAzJywgZGVzY3JpcHRpb246ICdcdTVERTVcdTUzNTVcdTc2ODRcdTY3NjVcdTZFOTBcdTZFMjBcdTkwNTMnIH0sXG4gICAgICAgIGRhaWx5X2Nhc2Vfdm9sdW1lOiB7IHRpdGxlOiAnXHU2QkNGXHU2NUU1XHU1REU1XHU1MzU1XHU5MUNGJywgZGVzY3JpcHRpb246ICdcdThGQzdcdTUzQkIgMzAgXHU1OTI5XHU3Njg0XHU2NUIwXHU1RUZBXHU1REU1XHU1MzU1JyB9LFxuICAgICAgICBzbGFfY29tcGxpYW5jZV9nYXVnZTogeyB0aXRsZTogJ1NMQSBcdThGQkVcdTYyMTBcdTczODcnLCBkZXNjcmlwdGlvbjogJ1x1NjcyQ1x1NjcxRiBTTEEgXHU1MTg1XHU4OUUzXHU1MUIzXHU1REU1XHU1MzU1XHU3Njg0XHU1MzYwXHU2QkQ0JyB9LFxuICAgICAgICBrYl9kZWZsZWN0aW9uX3JhdGU6IHsgdGl0bGU6ICdcdTc3RTVcdThCQzZcdTVFOTNcdThGNkNcdTc5RkJcdTczODcnLCBkZXNjcmlwdGlvbjogJ1x1NURGMlx1NTE3M1x1OTVFRFx1NURFNVx1NTM1NVx1NEUyRFx1NzUzMVx1NzdFNVx1OEJDNlx1NjU4N1x1N0FFMFx1ODlFM1x1NTFCM1x1NzY4NFx1NTM2MFx1NkJENCcgfSxcbiAgICAgICAga2JfcmVzb2x2ZWRfY2FzZXM6IHsgdGl0bGU6ICdcdTc3RTVcdThCQzZcdTVFOTNcdTg5RTNcdTUxQjNcdTY1NzAnLCBkZXNjcmlwdGlvbjogJ1x1NURGMlx1NTE3M1x1ODA1NFx1ODlFM1x1NTFCM1x1NjU4N1x1N0FFMFx1NzY4NFx1NURGMlx1NTE3M1x1OTVFRFx1NURFNVx1NTM1NScgfSxcbiAgICAgICAgY2xvc2VkX2Nhc2VzX3RvdGFsOiB7IHRpdGxlOiAnXHU1REYyXHU1MTczXHU5NUVEXHU1REU1XHU1MzU1JywgZGVzY3JpcHRpb246ICdcdThGNkNcdTc5RkJcdTczODdcdTc2ODRcdTUyMDZcdTZCQ0QnIH0sXG4gICAgICAgIHRvcF9yZXNvbHZpbmdfYXJ0aWNsZXM6IHsgdGl0bGU6ICdcdTg5RTNcdTUxQjNcdTVERTVcdTUzNTVcdTY3MDBcdTU5MUFcdTc2ODRcdTY1ODdcdTdBRTAnLCBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1ODlFM1x1NTFCM1x1NzY4NFx1NURGMlx1NTE3M1x1OTVFRFx1NURFNVx1NTM1NVx1NjU3MFx1NjM5Mlx1NTQwRFx1NzY4NFx1NzdFNVx1OEJDNlx1NjU4N1x1N0FFMCcgfSxcbiAgICAgICAgbXlfb3Blbl9jYXNlc19ieV9wcmlvcml0eTogeyB0aXRsZTogJ1x1NjIxMVx1NzY4NFx1NjcyQVx1NTE3M1x1OTVFRFx1NURFNVx1NTM1NVx1RkYwOFx1NjMwOVx1NEYxOFx1NTE0OFx1N0VBN1x1RkYwOScsIGRlc2NyaXB0aW9uOiAnXHU0RjYwXHU3Njg0XHU2NzJBXHU1MTczXHU5NUVEXHU1REU1XHU1MzU1XHU1M0NBXHU1MTc2IFNMQSBcdThGRERcdTdFQTZcdTczODdcdUZGMENcdTYzMDlcdTRGMThcdTUxNDhcdTdFQTdcdTdFQzZcdTUyMDYnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIC8vIGB0aXRsZWAgLyBgc3VidGl0bGVgIHRyYW5zbGF0ZSB0aGUgcGFnZSdzIGBwYWdlOmhlYWRlcmA7IGB0aXRsZWAgZmFsbHMgYmFja1xuICAvLyB0byBgbGFiZWxgIHdoZW4gb21pdHRlZCwgc28gaXQgaXMgYXV0aG9yZWQgb25seSB3aGVyZSB0aGUgdHdvIGRpZmZlci5cbiAgLy8gSGVhZGVyIHN0cmluZ3MgY2FycnlpbmcgYHtmaWVsZH1gIHRva2VucyBrZWVwIHRoZSB0b2tlbiBzcGVsbGluZyB2ZXJiYXRpbSBcdTIwMTRcbiAgLy8gdGhlIGNvbnNvbGUgc3Vic3RpdHV0ZXMgb24gdGhlIHJhdyBrZXksIHNvIGEgdHJhbnNsYXRlZCB0b2tlbiByZXNvbHZlcyB0b1xuICAvLyBub3RoaW5nIGFuZCB0aGUgaGVhZGVyIHJlbmRlcnMgYmxhbmsuXG4gIGRhdGFzZXRzOiB7XG4gICAgYWNjb3VudF9tZXRyaWNzOiB7XG4gICAgICBsYWJlbDogJ1x1NUJBMlx1NjIzN1x1NjMwN1x1NjgwNycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1ODg0Q1x1NEUxQVx1NEUwRVx1N0M3Qlx1NTc4Qlx1N0VERlx1OEJBMVx1NUJBMlx1NjIzN1x1NjU3MFx1OTFDRlx1NzY4NFx1OEJFRFx1NEU0OVx1NUM0MicsXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIGluZHVzdHJ5OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTg4NENcdTRFMUEnLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTdDN0JcdTU3OEInLFxuICAgICAgICB9LFxuICAgICAgICBjcmVhdGVkX2F0OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTUyMUJcdTVFRkFcdTY1RjZcdTk1RjQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGFjY291bnRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NUJBMlx1NjIzN1x1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICAgIGFubnVhbF9yZXZlbnVlX3N1bToge1xuICAgICAgICAgIGxhYmVsOiAnXHU1RTc0XHU4NDI1XHU2NTM2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjYXNlX21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnXHU1REU1XHU1MzU1XHU2MzA3XHU2ODA3JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU3RURGXHU4QkExXHU1REU1XHU1MzU1XHU2NTcwXHU5MUNGXHUzMDAxXHU4OUUzXHU1MUIzXHU2NUY2XHU5NTdGXHU0RTBFIFNMQSBcdTc2ODRcdThCRURcdTRFNDlcdTVDNDInLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBjcmVhdGVkX2F0OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTUyMUJcdTVFRkFcdTY1RjZcdTk1RjQnLFxuICAgICAgICB9LFxuICAgICAgICBvcmlnaW46IHtcbiAgICAgICAgICBsYWJlbDogJ1x1Njc2NVx1NkU5MCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByaW9yaXR5OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTRGMThcdTUxNDhcdTdFQTcnLFxuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlZF9hcnRpY2xlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTg5RTNcdTUxQjNcdTc1MjhcdTc3RTVcdThCQzZcdTY1ODdcdTdBRTAnLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXM6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NzJCNlx1NjAwMScsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1N0M3Qlx1NTc4QicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbWVhc3VyZXM6IHtcbiAgICAgICAgYXZnX3Jlc29sdXRpb246IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NUU3M1x1NTc0N1x1ODlFM1x1NTFCM1x1NjVGNlx1OTU3Rlx1RkYwOFx1NUMwRlx1NjVGNlx1RkYwOScsXG4gICAgICAgIH0sXG4gICAgICAgIGF2Z19zbGFfdmlvbGF0ZWQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1NMQSBcdThGRERcdTdFQTZcdTczODcnLFxuICAgICAgICB9LFxuICAgICAgICBjYXNlX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVERTVcdTUzNTVcdTY1NzAnLFxuICAgICAgICB9LFxuICAgICAgICBjbG9zZWRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NURGMlx1NTE3M1x1OTVFRFx1NURFNVx1NTM1NScsXG4gICAgICAgIH0sXG4gICAgICAgIGtiX2RlZmxlY3Rpb25fcmF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU3N0U1XHU4QkM2XHU1RTkzXHU4MUVBXHU1MkE5XHU4OUUzXHU1MUIzXHU3Mzg3JyxcbiAgICAgICAgfSxcbiAgICAgICAga2JfcmVzb2x2ZWRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NzdFNVx1OEJDNlx1NUU5M1x1ODlFM1x1NTFCM1x1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICAgIHNsYV9jb21wbGlhbmNlX3JhdGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1NMQSBcdThGQkVcdTY4MDdcdTczODcnLFxuICAgICAgICB9LFxuICAgICAgICBzbGFfbWV0X2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdTTEEgXHU4RkJFXHU2ODA3XHU1REU1XHU1MzU1JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb250YWN0X21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnXHU4MDU0XHU3Q0ZCXHU0RUJBXHU2MzA3XHU2ODA3JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU3RURGXHU4QkExXHU4MDU0XHU3Q0ZCXHU0RUJBXHU2NTcwXHU5MUNGXHU3Njg0XHU4QkVEXHU0RTQ5XHU1QzQyJyxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGNvbnRhY3RfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEVCQVx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZXZlbnRfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdcdTZEM0JcdTUyQThcdTYzMDdcdTY4MDcnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTdFREZcdThCQTFcdTRGMUFcdThCQUVcdTMwMDFcdTkwMUFcdThCRERcdTRFMEVcdTRFOTJcdTUyQThcdTY1QjBcdThGRDFcdTVFQTZcdTc2ODRcdThCRURcdTRFNDlcdTVDNDInLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBvd25lcjoge1xuICAgICAgICAgIGxhYmVsOiAnXHU4RDFGXHU4RDIzXHU0RUJBJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVsYXRlZF90b190eXBlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTVCRjlcdThDNjEnLFxuICAgICAgICB9LFxuICAgICAgICBzdGFydF9kYXRldGltZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU2RDNCXHU1MkE4XHU1NDY4JyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTcyQjZcdTYwMDEnLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTZEM0JcdTUyQThcdTdDN0JcdTU3OEInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGF2Z19taW51dGVzOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVFNzNcdTU3NDdcdTY1RjZcdTk1N0YnLFxuICAgICAgICB9LFxuICAgICAgICBldmVudF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU2RDNCXHU1MkE4XHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgdG90YWxfbWludXRlczoge1xuICAgICAgICAgIGxhYmVsOiAnXHU2MDNCXHU1MjA2XHU5NDlGXHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBmb3JlY2FzdF9tZXRyaWNzOiB7XG4gICAgICBsYWJlbDogJ1x1OTUwMFx1NTUyRVx1OTg4NFx1NkQ0Qlx1NjMwN1x1NjgwNycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1NjMwOVx1OEQxRlx1OEQyM1x1NEVCQVx1N0VERlx1OEJBMVx1OTE0RFx1OTg5RFx1MzAwMVx1OEZCRVx1NjIxMFx1NzM4N1x1NEUwRVx1N0JBMVx1OTA1M1x1ODk4Nlx1NzZENlx1NTAwRFx1NjU3MFx1NzY4NFx1OEJFRFx1NEU0OVx1NUM0MicsXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIG93bmVyOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdThEMUZcdThEMjNcdTRFQkEnLFxuICAgICAgICB9LFxuICAgICAgICBwZXJpb2Q6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTQ2OFx1NjcxRlx1N0M3Qlx1NTc4QicsXG4gICAgICAgIH0sXG4gICAgICAgIHBlcmlvZF9sYWJlbDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1NDY4XHU2NzFGJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGVyaW9kX3N0YXJ0OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTU0NjhcdTY3MUZcdTVGMDBcdTU5Q0InLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGF0dGFpbm1lbnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1OEZCRVx1NjIxMFx1NzM4NycsXG4gICAgICAgIH0sXG4gICAgICAgIGNsb3NlZF9zdW06IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NURGMlx1NjIxMFx1NEVBNCcsXG4gICAgICAgIH0sXG4gICAgICAgIGNvbW1pdF9zdW06IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NjI3Rlx1OEJGQScsXG4gICAgICAgIH0sXG4gICAgICAgIHBpcGVsaW5lX3N1bToge1xuICAgICAgICAgIGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU3QkExXHU5MDUzJyxcbiAgICAgICAgfSxcbiAgICAgICAgcXVvdGFfc3VtOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTkxNERcdTk4OUQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxlYWRfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdcdTdFQkZcdTdEMjJcdTYzMDdcdTY4MDcnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTdFREZcdThCQTFcdTdFQkZcdTdEMjJcdTY1NzBcdTkxQ0ZcdTc2ODRcdThCRURcdTRFNDlcdTVDNDInLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBjcmVhdGVkX2F0OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTUyMUJcdTVFRkFcdTY1RjZcdTk1RjQnLFxuICAgICAgICB9LFxuICAgICAgICBsYXN0X2NvbnRhY3RlZF9kYXRlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTY3MDBcdThGRDFcdTgwNTRcdTdDRkInLFxuICAgICAgICB9LFxuICAgICAgICBsZWFkX3NvdXJjZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU2NzY1XHU2RTkwJyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTcyQjZcdTYwMDEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGxlYWRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgb3Bwb3J0dW5pdHlfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdcdTU1NDZcdTY3M0FcdTYzMDdcdTY4MDcnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTdFREZcdThCQTFcdTk1MDBcdTU1MkVcdTdCQTFcdTkwNTNcdTY1NzBcdTkxQ0ZcdTRFMEVcdTkxRDFcdTk4OURcdTc2ODRcdThCRURcdTRFNDlcdTVDNDInLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBhY2NvdW50X2luZHVzdHJ5OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTg4NENcdTRFMUEnLFxuICAgICAgICB9LFxuICAgICAgICBjbG9zZV9kYXRlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTk4ODRcdThCQTFcdTYyMTBcdTRFQTRcdTY1RTUnLFxuICAgICAgICB9LFxuICAgICAgICBjbG9zZV9xdWFydGVyOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTYyMTBcdTRFQTRcdTVCNjNcdTVFQTYnLFxuICAgICAgICB9LFxuICAgICAgICBmb3JlY2FzdF9jYXRlZ29yeToge1xuICAgICAgICAgIGxhYmVsOiAnXHU5ODg0XHU2RDRCXHU3QzdCXHU1MjJCJyxcbiAgICAgICAgfSxcbiAgICAgICAgbGVhZF9zb3VyY2U6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1Njc2NVx1NkU5MCcsXG4gICAgICAgIH0sXG4gICAgICAgIGxvc3NfcmVhc29uOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTU5MzFcdTUzNTVcdTUzOUZcdTU2RTAnLFxuICAgICAgICB9LFxuICAgICAgICBvd25lcjoge1xuICAgICAgICAgIGxhYmVsOiAnXHU4RDFGXHU4RDIzXHU0RUJBJyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhZ2U6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1OTYzNlx1NkJCNScsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1N0M3Qlx1NTc4QicsXG4gICAgICAgIH0sXG4gICAgICAgIHdpbl9yZWFzb246IHtcbiAgICAgICAgICBsYWJlbDogJ1x1OEQ2Mlx1NTM1NVx1NTM5Rlx1NTZFMCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbWVhc3VyZXM6IHtcbiAgICAgICAgYXZnX2Ftb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1RTczXHU1NzQ3XHU1MzU1XHU3QjE0XHU5MUQxXHU5ODlEJyxcbiAgICAgICAgfSxcbiAgICAgICAgYXZnX3Byb2JhYmlsaXR5OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVFNzNcdTU3NDdcdThENjJcdTUzNTVcdTY5ODJcdTczODcnLFxuICAgICAgICB9LFxuICAgICAgICBkZWNpZGVkX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVERjJcdTVCOUFcdTVDNDBcdTU1NDZcdTY3M0EnLFxuICAgICAgICB9LFxuICAgICAgICBsb3N0X2Ftb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1OTMxXHU1MzU1XHU5MUQxXHU5ODlEJyxcbiAgICAgICAgfSxcbiAgICAgICAgbG9zdF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1OTMxXHU1MzU1XHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgb3BwX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTU1NDZcdTY3M0FcdTY1NzAnLFxuICAgICAgICB9LFxuICAgICAgICB0b3RhbF9hbW91bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NjAzQlx1OTFEMVx1OTg5RCcsXG4gICAgICAgIH0sXG4gICAgICAgIHdpbl9yYXRlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdThENjJcdTUzNTVcdTczODcnLFxuICAgICAgICB9LFxuICAgICAgICB3b25fYW1vdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdThENjJcdTUzNTVcdTkxRDFcdTk4OUQnLFxuICAgICAgICB9LFxuICAgICAgICB3b25fY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1OEQ2Mlx1NTM1NVx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgcHJvZHVjdF9tZXRyaWNzOiB7XG4gICAgICBsYWJlbDogJ1x1NEVBN1x1NTRDMVx1NjMwN1x1NjgwNycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1N0VERlx1OEJBMVx1NEVBN1x1NTRDMVx1NzZFRVx1NUY1NVx1NjU3MFx1OTFDRlx1NEUwRVx1NjgwN1x1NEVGN1x1NzY4NFx1OEJFRFx1NEU0OVx1NUM0MicsXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIGNhdGVnb3J5OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTdDN0JcdTUyMkInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGxpc3RfcHJpY2Vfc3VtOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTY4MDdcdTRFRjdcdTU0MDhcdThCQTEnLFxuICAgICAgICB9LFxuICAgICAgICBwcm9kdWN0X2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTRFQTdcdTU0QzFcdTY1NzAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHRhc2tfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdcdTRFRkJcdTUyQTFcdTYzMDdcdTY4MDcnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTdFREZcdThCQTFcdTRFRkJcdTUyQTFcdTVERTVcdTRGNUNcdTkxQ0ZcdTRFMEVcdTVCOENcdTYyMTBcdTYwQzVcdTUxQjVcdTc2ODRcdThCRURcdTRFNDlcdTVDNDInLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBkdWVfZGF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU2MjJBXHU2QjYyXHU2NUU1XHU2NzFGJyxcbiAgICAgICAgfSxcbiAgICAgICAgaXNfY29tcGxldGVkOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVERjJcdTVCOENcdTYyMTAnLFxuICAgICAgICB9LFxuICAgICAgICBpc19vdmVyZHVlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVERjJcdTkwM0VcdTY3MUYnLFxuICAgICAgICB9LFxuICAgICAgICBwcmlvcml0eToge1xuICAgICAgICAgIGxhYmVsOiAnXHU0RjE4XHU1MTQ4XHU3RUE3JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJpb3JpdHlfcmFuazoge1xuICAgICAgICAgIGxhYmVsOiAnXHU3RDI3XHU2MDI1XHU1RUE2JyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTcyQjZcdTYwMDEnLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTdDN0JcdTU3OEInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGF2Z19wcm9ncmVzczoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1RTczXHU1NzQ3XHU4RkRCXHU1RUE2JyxcbiAgICAgICAgfSxcbiAgICAgICAgdGFza19jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU0RUZCXHU1MkExXHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcGFnZXM6IHtcbiAgICBhY2NvdW50X2RldGFpbF9wYWdlOiB7XG4gICAgICBsYWJlbDogJ1x1NUJBMlx1NjIzN1x1OEJFNlx1NjBDNScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1NjNEMlx1NjlGRFx1NUYwRlx1NUJBMlx1NjIzN1x1OEJCMFx1NUY1NVx1OTg3NVx1MjAxNFx1MjAxNFx1ODFFQVx1NUI5QVx1NEU0OVx1OTg3NVx1NTkzNCArIFx1NUUzOFx1OUE3Qlx1OEJBOFx1OEJCQVx1NTMzQVx1MzAwMicsXG4gICAgICB0aXRsZTogJ3tuYW1lfScsXG4gICAgICBzdWJ0aXRsZTogJ3tpbmR1c3RyeX0gXHUwMEI3IHt0eXBlfScsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIGFjY291bnRfY2hhdHRlcjogeyBsYWJlbDogJ1x1OEJBOFx1OEJCQScgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhY2NvdW50X3dvcmtiZW5jaDoge1xuICAgICAgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTVERTVcdTRGNUNcdTUzRjAnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTk3NjJcdTU0MTFcdTk1MDBcdTU1MkVcdTU2RTJcdTk2MUZcdTc2ODRcdTdDQkVcdTkwMDlcdTVCQTJcdTYyMzdcdTUyMTdcdTg4NjhcdUZGMUFcdTRFQzVcdTYzRDBcdTRGOUJcdTVGRUJcdTYzNzdcdTdCNUJcdTkwMDlcdUZGMENcdTRFMERcdTU0MkJcdTg5QzZcdTU2RkVcdTdCQTFcdTc0MDZcdTMwMDInLFxuICAgIH0sXG4gICAgYXBwX2xhdW5jaGVyX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnXHU1RTk0XHU3NTI4XHU0RTJEXHU1RkMzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU4QkJGXHU5NUVFXHU1MTY4XHU5MEU4XHU1RTk0XHU3NTI4XHU3Njg0XHU3RURGXHU0RTAwXHU1MTY1XHU1M0UzJyxcbiAgICAgIHN1YnRpdGxlOiAnXHU5MDA5XHU2MkU5XHU0RTAwXHU0RTJBXHU1RTk0XHU3NTI4XHU1RjAwXHU1OUNCXHU0RjdGXHU3NTI4JyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgYXBwX3NlYXJjaDogeyBsYWJlbDogJ1x1NjQxQ1x1N0QyMlx1NUU5NFx1NzUyOCcgfSxcbiAgICAgICAgYXBwX2dyaWQ6IHsgbGFiZWw6ICdcdTVFOTRcdTc1MjhcdTdGNTFcdTY4M0MnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY2FzZV9kZXRhaWxfcGFnZToge1xuICAgICAgbGFiZWw6ICdcdTVERTVcdTUzNTVcdThCRTZcdTYwQzUnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTVCQTJcdTY3MERcdTVERTVcdTUzNTVcdThCQjBcdTVGNTVcdTk4NzVcdUZGMUFcdTUxNzNcdTk1MkVcdTRGRTFcdTYwNkZcdTMwMDFTTEEgXHU4RkRCXHU1RUE2XHUzMDAxXHU2NjBFXHU3RUM2XHU0RTBFXHU2RDNCXHU1MkE4XHU2NUY2XHU5NUY0XHU3RUJGXHUzMDAyJyxcbiAgICAgIHRpdGxlOiAne2Nhc2VfbnVtYmVyfSBcdTAwQjcge3N1YmplY3R9JyxcbiAgICAgIHN1YnRpdGxlOiAne2NybV9hY2NvdW50fScsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIGNhc2VfaGlnaGxpZ2h0czogeyBsYWJlbDogJ1x1NTE3M1x1OTUyRVx1NEZFMVx1NjA2RicgfSxcbiAgICAgICAgY2FzZV9zdGF0dXNfcGF0aDogeyBsYWJlbDogJ1x1NURFNVx1NTM1NVx1NzJCNlx1NjAwMVx1OEZEQlx1NUVBNicgfSxcbiAgICAgICAgY2FzZV9kZXRhaWxzOiB7IGxhYmVsOiAnXHU1REU1XHU1MzU1XHU2NjBFXHU3RUM2JyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxlYWRfZGV0YWlsX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnXHU3RUJGXHU3RDIyXHU4QkU2XHU2MEM1JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU1QjhDXHU2NTc0XHU3Njg0XHU3RUJGXHU3RDIyXHU4QkU2XHU2MEM1XHU5ODc1XHVGRjBDXHU1MzA1XHU1NDJCXHU1MTczXHU5NTJFXHU0RkUxXHU2MDZGXHUzMDAxXHU2NjBFXHU3RUM2XHU0RTBFXHU3NkY4XHU1MTczXHU4QkIwXHU1RjU1XHUzMDAyJyxcbiAgICAgIHRpdGxlOiAne2ZpcnN0X25hbWV9IHtsYXN0X25hbWV9JyxcbiAgICAgIHN1YnRpdGxlOiAne2NvbXBhbnl9JyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgbGVhZF9kdXBsaWNhdGVfYWxlcnRfY29uZmlybWVkOiB7IGxhYmVsOiAnXHU1REYyXHU3ODZFXHU4QkE0XHU5MUNEXHU1OTBEXHU2M0QwXHU5MTkyJyB9LFxuICAgICAgICBsZWFkX2R1cGxpY2F0ZV9hbGVydF9zdXNwZWN0ZWQ6IHsgbGFiZWw6ICdcdTc1OTFcdTRGM0NcdTkxQ0RcdTU5MERcdTYzRDBcdTkxOTInIH0sXG4gICAgICAgIGxlYWRfaGlnaGxpZ2h0czogeyBsYWJlbDogJ1x1NTE3M1x1OTUyRVx1NEZFMVx1NjA2RicgfSxcbiAgICAgICAgbGVhZF9wYXRoOiB7IGxhYmVsOiAnXHU3RUJGXHU3RDIyXHU3MkI2XHU2MDAxXHU4RkRCXHU1RUE2JyB9LFxuICAgICAgICBtYWluX3RhYnM6IHsgbGFiZWw6ICdcdTdFQkZcdTdEMjJcdTRGRTFcdTYwNkZcdTY4MDdcdTdCN0VcdTk4NzUnIH0sXG4gICAgICAgIGxlYWRfZGV0YWlsczogeyBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1NjYwRVx1N0VDNicgfSxcbiAgICAgICAgcmVsYXRlZF9hY2NvcmRpb246IHsgbGFiZWw6ICdcdTc2RjhcdTUxNzNcdThCQjBcdTVGNTUnIH0sXG4gICAgICAgIHJlbGF0ZWRfdGFza3M6IHsgdGl0bGU6ICdcdTVGODVcdTUyOUVcdTRFRkJcdTUyQTEnLCBsYWJlbDogJ1x1NEVGQlx1NTJBMScgfSxcbiAgICAgICAgbGVhZF9hY3Rpdml0eTogeyBsYWJlbDogJ1x1NkQzQlx1NTJBOFx1NjVGNlx1OTVGNFx1N0VCRicgfSxcbiAgICAgICAgbGVhZF9oaXN0b3J5OiB7IGxhYmVsOiAnXHU1QjU3XHU2QkI1XHU1Mzg2XHU1M0YyJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG9wcG9ydHVuaXR5X2RldGFpbF9wYWdlOiB7XG4gICAgICBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1OEJFNlx1NjBDNScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1NUI4Q1x1NjU3NFx1NzY4NFx1NTU0Nlx1NjczQVx1OEJFNlx1NjBDNVx1OTg3NVx1RkYwQ1x1NTMwNVx1NTQyQlx1OTYzNlx1NkJCNVx1OEZEQlx1NUVBNlx1MzAwMVx1NTE3M1x1OTUyRVx1NEZFMVx1NjA2Rlx1MzAwMVx1NjYwRVx1N0VDNlx1NEUwRVx1NzZGOFx1NTE3M1x1NTIxN1x1ODg2OFx1MzAwMicsXG4gICAgICB0aXRsZTogJ3tuYW1lfScsXG4gICAgICBzdWJ0aXRsZTogJ3tjcm1fYWNjb3VudH0nLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBvcHBfaGlnaGxpZ2h0czogeyBsYWJlbDogJ1x1NTE3M1x1OTUyRVx1NEZFMVx1NjA2RicgfSxcbiAgICAgICAgb3BwX3N0YWdlX3BhdGg6IHsgbGFiZWw6ICdcdTU1NDZcdTY3M0FcdTk2MzZcdTZCQjVcdThGREJcdTVFQTYnIH0sXG4gICAgICAgIG9wcF9kZXRhaWxzOiB7IGxhYmVsOiAnXHU1NTQ2XHU2NzNBXHU2NjBFXHU3RUM2JyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHNhbGVzX2hvbWVfcGFnZToge1xuICAgICAgbGFiZWw6ICdcdTk1MDBcdTU1MkVcdTRFM0JcdTk4NzUnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTk1MDBcdTU1MkVcdTU2RTJcdTk2MUZcdTRFM0JcdTk4NzVcdUZGMENcdTZDNDdcdTYwM0JcdTUxNzNcdTk1MkVcdTYzMDdcdTY4MDdcdTRFMEVcdTVGRUJcdTYzNzdcdTY0Q0RcdTRGNUMnLFxuICAgICAgdGl0bGU6ICdcdTk1MDBcdTU1MkVcdTc3MEJcdTY3N0YnLFxuICAgICAgc3VidGl0bGU6ICdcdTZCMjJcdThGQ0VcdTU2REVcdTY3NjUnLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBrcGlfcmV2ZW51ZV93b246IHtcbiAgICAgICAgICBsYWJlbDogJ1x1OEQ2Mlx1NTM1NVx1ODQyNVx1NjUzNicsXG4gICAgICAgIH0sXG4gICAgICAgIGtwaV9kZWFsc193b246IHtcbiAgICAgICAgICBsYWJlbDogJ1x1OEQ2Mlx1NTM1NVx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICAgIGtwaV9waXBlbGluZV92YWx1ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU3QkExXHU5MDUzXHU5MUQxXHU5ODlEJyxcbiAgICAgICAgfSxcbiAgICAgICAga3BpX29wZW5fbGVhZHM6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NUYwMFx1NjUzRVx1N0VCRlx1N0QyMicsXG4gICAgICAgIH0sXG4gICAgICAgIGhvbWVfdXBjb21pbmdfZXZlbnRzOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdUQ4M0RcdURDQzUgXHU1MzczXHU1QzA2XHU1RjAwXHU1OUNCIFx1MDBCNyBcdTY3MDBcdThGRDFcdTRGMThcdTUxNDgnLFxuICAgICAgICB9LFxuICAgICAgICBxdWlja19jcmVhdGU6IHsgdGl0bGU6ICdcdTVGRUJcdTkwMUZcdTUyMUJcdTVFRkEnLCBsYWJlbDogJ1x1NUZFQlx1OTAxRlx1NTIxQlx1NUVGQScgfSxcbiAgICAgICAga2V5X21ldHJpY3M6IHsgdGl0bGU6ICdcdTUxNzNcdTk1MkVcdTdFRTlcdTY1NDhcdTYzMDdcdTY4MDcnLCBsYWJlbDogJ1x1NTE3M1x1OTUyRVx1NjMwN1x1NjgwNycgfSxcbiAgICAgICAgaG9tZV90YWJzOiB7IGxhYmVsOiAnXHU0RTNCXHU5ODc1XHU2ODA3XHU3QjdFXHU5ODc1JyB9LFxuICAgICAgICBob21lX215X2xlYWRzOiB7IGxhYmVsOiAnXHU2MjExXHU3Njg0XHU3RUJGXHU3RDIyJyB9LFxuICAgICAgICBob21lX215X2RlYWxzOiB7IGxhYmVsOiAnXHU2MjExXHU3Njg0XHU4RkRCXHU4ODRDXHU0RTJEXHU1NTQ2XHU2NzNBJyB9LFxuICAgICAgICBob21lX215X3Rhc2tzOiB7IGxhYmVsOiAnXHU2MjExXHU3Njg0XHU1Rjg1XHU1MjlFXHU0RUZCXHU1MkExJyB9LFxuICAgICAgICBhaV9icmllZmluZzoge1xuICAgICAgICAgIHRpdGxlOiAnXHU4QkUyXHU5NUVFIEFJIFx1NTJBOVx1NjI0QicsXG4gICAgICAgICAgbGFiZWw6ICdBSSBcdTUyQTlcdTYyNEJcdTRFQ0FcdTY1RTVcdTkwMUZcdTg5QzgnLFxuICAgICAgICB9LFxuICAgICAgICB1cGNvbWluZ19ldmVudHM6IHsgdGl0bGU6ICdcdTUzNzNcdTVDMDZcdTVGMDBcdTU5Q0JcdTc2ODRcdTZEM0JcdTUyQTgnLCBsYWJlbDogJ1x1NTM3M1x1NUMwNlx1NUYwMFx1NTlDQlx1NzY4NFx1NkQzQlx1NTJBOCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB1dGlsaXR5X2Jhcl9wYWdlOiB7XG4gICAgICBsYWJlbDogJ1x1NURFNVx1NTE3N1x1NjgwRicsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1NjBBQ1x1NkQ2RVx1NURFNVx1NTE3N1x1NzY4NFx1NUZFQlx1NjM3N1x1OEJCRlx1OTVFRVx1NjgwRicsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIG5vdGlmaWNhdGlvbnNfcGFuZWw6IHsgbGFiZWw6ICdcdTkwMUFcdTc3RTUnIH0sXG4gICAgICAgIHF1aWNrX25vdGVzOiB7IHRpdGxlOiAnXHU1RkVCXHU5MDFGXHU3QjE0XHU4QkIwJywgbGFiZWw6ICdcdTVGRUJcdTkwMUZcdTdCMTRcdThCQjAnIH0sXG4gICAgICAgIHF1aWNrX3NlYXJjaDogeyBsYWJlbDogJ1x1NUZFQlx1OTAxRlx1NjQxQ1x1N0QyMicgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgLy8gU2NyZWVuLWZsb3cgY29weSAoIzEyMTAsICMxOTc1KS4gS2V5ZWQgYGZsb3dzLjxmbG93Pi5sYWJlbGAsXG4gIC8vIGBzY3JlZW5zLjxub2RlPi50aXRsZWAgYW5kIGBzY3JlZW5zLjxub2RlPi5maWVsZHMuPGZpZWxkPi57bGFiZWwscGxhY2Vob2xkZXJ9YFxuICAvLyBcdTIwMTQgdGhlIGtleXMgYG9zIGxpbnRgJ3MgYGkxOG4vbWlzc2luZy1mbG93YCBuYW1lcywgcmVhZCBieSB0aGUgY29uc29sZSdzXG4gIC8vIGZsb3cgcnVubmVyIHNpbmNlIEBvYmplY3RzdGFjayAxNy43LjAgKHRoZSBzcGVjJ3MgYGZsb3dzYCBsaXZlbmVzcyByb3cgaXNcbiAgLy8gYGxpdmVgIHRoZXJlKS4gQSBzY3JlZW4gd2l0aCBubyBhdXRob3JlZCBgdGl0bGVgIHNob3dzIGl0cyBmbG93J3MgbGFiZWwgaW5cbiAgLy8gZXZlcnkgbG9jYWxlLCBzbyBlYWNoIGBzY3JlZW5fMS50aXRsZWAgcmVwZWF0cyB0aGUgZmxvdyBsYWJlbC4gU2luY2VcbiAgLy8gMTguMC4wLW5leHQuMCB0aHJlZSBtb3JlIHN1cmZhY2VzIGFyZSBrZXlzIHRoZSBlbmdpbmUgcmVhZHMgaW4gdGhlIHJ1bidzXG4gIC8vIGxvY2FsZSwgYW5kIGBpMThuL21pc3NpbmctZmxvd2AgbmFtZXMgZWFjaCBtaXNzaW5nIG9uZTogYSBzZWxlY3QgZmllbGQnc1xuICAvLyBgb3B0aW9ucy48dmFsdWU+YCAod29yZGVkIGFzIHRoZSBvYmplY3QgZmllbGQncyBvd24gb3B0aW9uIGluIHRoaXMgcGFjayksXG4gIC8vIGFuIGF1dGhvcmVkIHNjcmVlbiBgZGVzY3JpcHRpb25gLCBhbmQgYSByZWZ1c2luZyBgZW5kYCBub2RlJ3NcbiAgLy8gYHJlZnVzYWxzLjxub2RlPi5tZXNzYWdlYC4gQSB0cmFuc2xhdGVkIGRlc2NyaXB0aW9uIG9yIG1lc3NhZ2UgaXMgYSB0ZXh0XG4gIC8vIHNsb3QgbGlrZSB0aGUgb25lIGl0IHRyYW5zbGF0ZXMsIHNvIGEgaG9sZSBpbiBpdCBpcyBge3sgfX1gLlxuICAvLyBUaGUgZGlzY291bnQgY2VpbGluZyBpcyBpbnRlcnBvbGF0ZWQgZnJvbSBgUVVPVEVfRElTQ09VTlRfQ0VJTElOR2AsIG5ldmVyXG4gIC8vIHJldHlwZWQ6IHRoZSBudW1iZXIgbGl2ZXMgaW4gYF90aHJlc2hvbGRzLnRzYCBhbG9uZSAoIzE3MTEpLlxuICBmbG93czoge1xuICAgIGNhbXBhaWduX2Vucm9sbG1lbnQ6IHtcbiAgICAgIGxhYmVsOiAnXHU1QzA2XHU2MjEwXHU1NDU4XHU1MkEwXHU1MTY1XHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4JyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1NUMwNlx1NjIxMFx1NTQ1OFx1NTJBMFx1NTE2NVx1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCcsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBtZW1iZXJTb3VyY2U6IHsgbGFiZWw6ICdcdTUyQTBcdTUxNjVcdTc2ODRcdTYyMTBcdTU0NThcdTdDN0JcdTU3OEInLCBvcHRpb25zOiB7IGxlYWRzOiAnXHU3RUJGXHU3RDIyJywgY29udGFjdHM6ICdcdTgwNTRcdTdDRkJcdTRFQkEnIH0gfSxcbiAgICAgICAgICAgIGxlYWRTdGF0dXM6IHsgbGFiZWw6ICdcdTUyQTBcdTUxNjVcdTRFRTVcdTRFMEJcdTcyQjZcdTYwMDFcdTc2ODRcdTdFQkZcdTdEMjInLCBvcHRpb25zOiB7IG5ldzogJ1x1NjVCMFx1NUVGQScsIGNvbnRhY3RlZDogJ1x1NURGMlx1ODA1NFx1N0NGQicsIHF1YWxpZmllZDogJ1x1NURGMlx1Nzg2RVx1OEJBNCcgfSB9LFxuICAgICAgICAgICAgY29udGFjdERlcGFydG1lbnQ6IHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdcdTUyQTBcdTUxNjVcdTRFRTVcdTRFMEJcdTkwRThcdTk1RThcdTc2ODRcdTgwNTRcdTdDRkJcdTRFQkEnLFxuICAgICAgICAgICAgICBvcHRpb25zOiB7IGV4ZWN1dGl2ZTogJ1x1N0JBMVx1NzQwNlx1NUM0MicsIHNhbGVzOiAnXHU5NTAwXHU1NTJFXHU5MEU4JywgbWFya2V0aW5nOiAnXHU1RTAyXHU1NzNBXHU5MEU4JywgZW5naW5lZXJpbmc6ICdcdTVERTVcdTdBMEJcdTkwRTgnLCBzdXBwb3J0OiAnXHU2NTJGXHU2MzAxXHU5MEU4JywgZmluYW5jZTogJ1x1OEQyMlx1NTJBMVx1OTBFOCcsIGhyOiAnXHU0RUJBXHU1MjlCXHU4RDQ0XHU2RTkwJywgb3BlcmF0aW9uczogJ1x1OEZEMFx1ODQyNVx1OTBFOCcgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBlc2NhbGF0ZV9jYXNlOiB7XG4gICAgICBsYWJlbDogJ1x1NTM0N1x1N0VBN1x1NURFNVx1NTM1NScsXG4gICAgICBzY3JlZW5zOiB7IHNjcmVlbl8xOiB7IHRpdGxlOiAnXHU1MzQ3XHU3RUE3XHU1REU1XHU1MzU1JywgZmllbGRzOiB7IHJlYXNvbjogeyBsYWJlbDogJ1x1NTM0N1x1N0VBN1x1NTM5Rlx1NTZFMCcgfSB9IH0gfSxcbiAgICB9LFxuICAgIGNsb3NlX2Nhc2U6IHtcbiAgICAgIGxhYmVsOiAnXHU1MTczXHU5NUVEXHU1REU1XHU1MzU1JyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1NTE3M1x1OTVFRFx1NURFNVx1NTM1NScsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICByZXNvbHV0aW9uOiB7IGxhYmVsOiAnXHU4OUUzXHU1MUIzXHU2NUI5XHU2ODQ4JyB9LFxuICAgICAgICAgICAgcmVzb2x2ZWRfYnlfYXJ0aWNsZTogeyBsYWJlbDogJ1x1OTAxQVx1OEZDN1x1NzdFNVx1OEJDNlx1NjU4N1x1N0FFMFx1ODlFM1x1NTFCM1x1RkYwOFx1NTNFRlx1OTAwOVx1RkYwOScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNsYWltX2Nhc2U6IHtcbiAgICAgIGxhYmVsOiAnXHU4QkE0XHU5ODg2XHU1REU1XHU1MzU1JyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1OEJBNFx1OTg4Nlx1NURFNVx1NTM1NScsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBjbGFpbVN0YXR1czoge1xuICAgICAgICAgICAgICBsYWJlbDogJ1x1NTkwNFx1NzQwNlx1NzJCNlx1NjAwMScsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHsgaW5fcHJvZ3Jlc3M6ICdcdTU5MDRcdTc0MDZcdTRFMkQnLCB3YWl0aW5nX2N1c3RvbWVyOiAnXHU3QjQ5XHU1Rjg1XHU1QkEyXHU2MjM3XHU1NkRFXHU1OTBEJywgd2FpdGluZ19zdXBwb3J0OiAnXHU3QjQ5XHU1Rjg1XHU2NTJGXHU2MzAxXHU1NkRFXHU1OTBEJyB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxlYWRfY29udmVyc2lvbjoge1xuICAgICAgbGFiZWw6ICdcdTdFQkZcdTdEMjJcdThGNkNcdTUzMTZcdTZENDFcdTdBMEInLFxuICAgICAgc2NyZWVuczoge1xuICAgICAgICBzY3JlZW5fMToge1xuICAgICAgICAgIHRpdGxlOiAnXHU3RUJGXHU3RDIyXHU4RjZDXHU1MzE2XHU2RDQxXHU3QTBCJyxcbiAgICAgICAgICAvLyBUaGUgZHVwbGljYXRlIHdhcm5pbmcncyB0ZXh0IGlzIGEgdmFyaWFibGUgdGhlIGZsb3cgYXNzaWduczsgdGhpc1xuICAgICAgICAgIC8vIGtleSBjYW4gb25seSBjYXJyeSB0aGUgaG9sZSB0aGF0IHNob3dzIGl0LlxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAne3tkdXBsaWNhdGVXYXJuaW5nfX0nLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgY3JlYXRlT3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdcdTY2MkZcdTU0MjZcdTUyMUJcdTVFRkFcdTU1NDZcdTY3M0FcdUZGMUYnIH0sXG4gICAgICAgICAgICBvcHBvcnR1bml0eU5hbWU6IHsgbGFiZWw6ICdcdTU1NDZcdTY3M0FcdTU0MERcdTc5RjAnIH0sXG4gICAgICAgICAgICBvcHBvcnR1bml0eUFtb3VudDogeyBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1OTFEMVx1OTg5RCcgfSxcbiAgICAgICAgICAgIGNsb3NlRGF0ZTogeyBsYWJlbDogJ1x1OTg4NFx1OEJBMVx1NjIxMFx1NEVBNFx1NjVFNVx1NjcxRicgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByZWZ1c2VfY29uZmlybWVkX2R1cGxpY2F0ZToge1xuICAgICAgICAgIHRpdGxlOiAnXHU4RjZDXHU1MzE2XHU4OEFCXHU2MkQyXHU3RUREJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdcdThCRTVcdTdFQkZcdTdEMjJcdTc2ODRcdTMwMENcdTkxQ0RcdTU5MERcdTcyQjZcdTYwMDFcdTMwMERcdTRFM0FcdTMwMENcdTVERjJcdTc4NkVcdThCQTRcdTkxQ0RcdTU5MERcdTMwMERcdUZGMUFcdTVCQTFcdTY4MzhcdTRFQkFcdTVERjJcdTVDMDZcdTUxNzZcdTRFMEVcdTczQjBcdTY3MDlcdThCQjBcdTVGNTVcdTZCRDRcdTVCRjlcdUZGMENcdTVFNzZcdThCQjBcdTVGNTVcdTRFM0FcdTkxQ0RcdTU5MERcdTMwMDJcdThGNkNcdTUzMTZcdTRGMUFcdTRFM0FcdTU0MENcdTRFMDBcdTRFNzBcdTVCQjZcdTUxOERcdTUyMUJcdTVFRkFcdTRFMDBcdTRFMkFcdTVCQTJcdTYyMzdcdTMwMDFcdTgwNTRcdTdDRkJcdTRFQkFcdTU0OENcdTU1NDZcdTY3M0FcdTMwMDJcdTY3MkNcdTdFQkZcdTdEMjJcdTc2ODRcdTMwMENcdTkxQ0RcdTU5MERcdTdFQkZcdTdEMjJcdTdCQTFcdTc0MDZcdTMwMERcdTkwRThcdTUyMDZcdTUyMTdcdTUxRkFcdTRFODZcdTRGRERcdTc1NTlcdTc2ODRcdThCQjBcdTVGNTVcdUZGMUJcdThCRjdcdTY1MzlcdTRFM0FcdTRFRTVcdTkxQ0RcdTU5MERcdTRFM0FcdTc1MzFcdTVDMDZcdTZCNjRcdTdFQkZcdTdEMjJcdThCQkVcdTRFM0FcdTMwMENcdTY3MkFcdTkwMUFcdThGQzdcdTMwMERcdTMwMDJcdTUzRUFcdTY3MDlcdTVCQTFcdTY4MzhcdTRFQkFcdTRGRUVcdTY1MzlcdThCRTVcdTdFRDNcdThCQkFcdTU0MEVcdTYyNERcdTgwRkRcdTkxQ0RcdTY1QjBcdThGNkNcdTUzMTZcdTMwMDInLFxuICAgICAgICB9LFxuICAgICAgICByZWZ1c2VfdW5hcHByb3ZlZDoge1xuICAgICAgICAgIHRpdGxlOiAnXHU4RjZDXHU1MzE2XHU4OEFCXHU2MkQyXHU3RUREJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdcdThCRTVcdTdFQkZcdTdEMjJcdTVDMUFcdTY3MkFcdTgzQjdcdTUxQzZcdThGNkNcdTUzMTZcdTMwMDJcdTVGQzVcdTk4N0JcdTc1MzFcdTVCQTFcdTYyNzlcdTRFQkFcdTYyNzlcdTUxQzZcdTU0MEVcdUZGMENcdTYyNERcdTgwRkRcdThGNkNcdTUzMTZcdTRFM0FcdTVCQTJcdTYyMzdcdTMwMDFcdTgwNTRcdTdDRkJcdTRFQkFcdTU0OENcdTU1NDZcdTY3M0FcdUZGMUJcdTdFQkZcdTdEMjJcdTRFMEFcdTc2ODRcdTMwMENcdThGNkNcdTUzMTZcdTVCQTFcdTYyNzlcdTMwMERcdTVCNTdcdTZCQjVcdTY2M0VcdTc5M0FcdThCRTVcdTUxQjNcdTVCOUFcdTRFQ0RcdTU3MjhcdTVGODVcdTVCQTFcdTYyNzlcdThGRDhcdTY2MkZcdTVERjJcdTg4QUJcdTlBNzNcdTU2REVcdTMwMDJcdTU3MjhcdTZCNjRcdTY3MUZcdTk1RjRcdThCRjdcdTdFRTdcdTdFRURcdThEREZcdThGREJcdThCRTVcdTdFQkZcdTdEMjJcdTIwMTRcdTIwMTRcdTVCODNcdTc2ODRcdTRFRkJcdTRGNTVcdTUxODVcdTVCQjlcdTkwRkRcdTZDQTFcdTY3MDlcdTg4QUJcdTUxQkJcdTdFRDNcdTMwMDInLFxuICAgICAgICB9LFxuICAgICAgICByZWZ1c2Vfbm9fbWF0Y2hfa2V5OiB7XG4gICAgICAgICAgdGl0bGU6ICdcdThGNkNcdTUzMTZcdTg4QUJcdTYyRDJcdTdFREQnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ1x1OEJFNVx1N0VCRlx1N0QyMlx1NzY4NFx1NTE2Q1x1NTNGOFx1NkNBMVx1NjcwOVx1NTMzOVx1OTE0RFx1OTUyRVx1RkYwQ1x1NTZFMFx1NkI2NFx1OEY2Q1x1NTMxNlx1NjVFMFx1NkNENVx1NTIyNFx1NjVBRFx1NUI4M1x1NUM1RVx1NEU4RVx1NTRFQVx1NEUyQVx1NUJBMlx1NjIzN1x1RkYwQ1x1NEU1Rlx1NEUwRFx1NEYxQVx1NTNCQlx1NzMxQ1x1NkQ0Qlx1RkYxQVx1NzMxQ1x1NkQ0Qlx1NTNFRlx1ODBGRFx1NEYxQVx1NjI4QVx1ODA1NFx1N0NGQlx1NEVCQVx1NTQ4Q1x1NTU0Nlx1NjczQVx1NUY1Mlx1NTIzMFx1NTNFNlx1NEUwMFx1NEUyQVx1NUJBMlx1NjIzN1x1NTQwRFx1NEUwQlx1MzAwMlx1NEZERFx1NUI1OFx1N0VCRlx1N0QyMlx1NzY4NFx1MzAwQ1x1NTE2Q1x1NTNGOFx1MzAwRFx1NEYxQVx1OTFDRFx1NjVCMFx1NzUxRlx1NjIxMFx1NTMzOVx1OTE0RFx1OTUyRVx1RkYwQ1x1OEJGN1x1OTFDRFx1NjVCMFx1NEZERFx1NUI1OFx1NTQwRVx1NTE4RFx1OEY2Q1x1NTMxNlx1MzAwMlx1NUMxQVx1NjcyQVx1NTIxQlx1NUVGQVx1NEVGQlx1NEY1NVx1OEJCMFx1NUY1NVx1MzAwMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgc2NoZWR1bGVfZm9sbG93dXA6IHtcbiAgICAgIGxhYmVsOiAnXHU1Qjg5XHU2MzkyXHU4RERGXHU4RkRCJyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1NUI4OVx1NjM5Mlx1OERERlx1OEZEQicsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU0RTBCXHU0RTAwXHU2QjY1XHU1MDVBXHU0RUMwXHU0RTQ4XHVGRjFGJyB9LFxuICAgICAgICAgICAgZHVlRGF0ZTogeyBsYWJlbDogJ1x1NjIyQVx1NkI2Mlx1NjVFNVx1NjcxRicgfSxcbiAgICAgICAgICAgIGFjdGl2aXR5VHlwZToge1xuICAgICAgICAgICAgICBsYWJlbDogJ1x1NkQzQlx1NTJBOFx1N0M3Qlx1NTc4QicsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHsgY2FsbDogJ1x1NzUzNVx1OEJERCcsIGVtYWlsOiAnXHU5MEFFXHU0RUY2JywgbWVldGluZzogJ1x1NEYxQVx1OEJBRScsIGZvbGxvd191cDogJ1x1OERERlx1OEZEQicsIGRlbW86ICdcdTZGMTRcdTc5M0EnLCBvdGhlcjogJ1x1NTE3Nlx1NEVENicgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmlvcml0eTogeyBsYWJlbDogJ1x1NEYxOFx1NTE0OFx1N0VBNycsIG9wdGlvbnM6IHsgbG93OiAnXHU0RjRFJywgbm9ybWFsOiAnXHU2NjZFXHU5MDFBJywgaGlnaDogJ1x1OUFEOCcsIHVyZ2VudDogJ1x1N0QyN1x1NjAyNScgfSB9LFxuICAgICAgICAgICAgbm90ZXM6IHsgbGFiZWw6ICdcdTU5MDdcdTZDRTgnIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBxdW90ZV9nZW5lcmF0aW9uOiB7XG4gICAgICBsYWJlbDogJ1x1NEVDRVx1NTU0Nlx1NjczQVx1NzUxRlx1NjIxMFx1NjJBNVx1NEVGN1x1NTM1NScsXG4gICAgICByZWZ1c2FsczogeyByZWZ1c2VfaGVsZDogeyBtZXNzYWdlOiAnXHU5NzAwXHU1MTQ4XHU1QjhDXHU2MjEwXHU3QUNCXHU5ODc5XHU1QkExXHU2Mjc5XHVGRjFBXHU4QkY3XHU1MkZFXHU5MDA5XHUzMDBDXHU3NTMzXHU4QkY3XHU3QUNCXHU5ODc5XHU1QkExXHU2Mjc5XHUzMDBEXHUzMDAyXHU1QzFBXHU2NzJBXHU1MjFCXHU1RUZBXHU0RUZCXHU0RjU1XHU1MTg1XHU1QkI5XHUzMDAyJyB9IH0sXG4gICAgICBzY3JlZW5zOiB7XG4gICAgICAgIHNjcmVlbl8xOiB7XG4gICAgICAgICAgdGl0bGU6ICdcdTRFQ0VcdTU1NDZcdTY3M0FcdTc1MUZcdTYyMTBcdTYyQTVcdTRFRjdcdTUzNTUnLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgcXVvdGVOYW1lOiB7IGxhYmVsOiAnXHU2MkE1XHU0RUY3XHU1NDBEXHU3OUYwJyB9LFxuICAgICAgICAgICAgZXhwaXJhdGlvbkRheXM6IHsgbGFiZWw6ICdcdTY3MDlcdTY1NDhcdTY3MUZcdUZGMDhcdTU5MjlcdUZGMDknIH0sXG4gICAgICAgICAgICBkaXNjb3VudDogeyBsYWJlbDogYFx1NjI5OFx1NjI2MyAlIChcdTIyNjQgJHtRVU9URV9ESVNDT1VOVF9DRUlMSU5HfSlgLCBwbGFjZWhvbGRlcjogYDAtJHtRVU9URV9ESVNDT1VOVF9DRUlMSU5HfWAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9fc2hhcmVkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTlwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vX3NoYXJlZC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBcdTdCODBcdTRGNTNcdTRFMkRcdTY1ODcgKHpoLUNOKSBcdTIwMTQgdmFsdWVzIHNoYXJlZCBieSBtb3JlIHRoYW4gb25lIHBhcnQgb2YgdGhpcyBidW5kbGUuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04udHNgLlxuICpcbiAqIEV2ZXJ5IGNvbnN0YW50IGhlcmUgaXMgc3ByZWFkIGludG8gb2JqZWN0IHJvd3MgdGhhdCBsaXZlIGluIE1PUkUgVEhBTiBPTkVcbiAqIGZhbWlseSBmaWxlLCBzbyBpdCBjYW5ub3Qgc2l0IGluIGFueSBvbmUgb2YgdGhlbS4gQSB2YWx1ZSB1c2VkIGJ5IGV4YWN0bHlcbiAqIG9uZSBmYW1pbHkgbGl2ZXMgaW4gdGhhdCBmYW1pbHkncyBmaWxlIGluc3RlYWQgXHUyMDE0IHRoYXQgc3BsaXQgaXMgbWVjaGFuaWNhbCxcbiAqIG5vdCBhIGp1ZGdlbWVudCBjYWxsLlxuICovXG5cbi8qKlxuICogXHU2RDNCXHU1MkE4XHU1MkE4XHU0RjVDXHU2NUNGXHVGRjA4IzU5Mlx1RkYwOVx1RkYxQWBsb2dfY2FsbGAgLyBgbG9nX21lZXRpbmdgIC8gYHNjaGVkdWxlX21lZXRpbmdgIFx1NTcyOFxuICogXHU3RUJGXHU3RDIyXHUzMDAxXHU4MDU0XHU3Q0ZCXHU0RUJBXHUzMDAxXHU1QkEyXHU2MjM3XHUzMDAxXHU1NTQ2XHU2NzNBXHUzMDAxXHU1REU1XHU1MzU1XHU0RTBBXHU1NDA0XHU2Q0U4XHU1MThDXHU0RTAwXHU2QjIxXHVGRjA4XHU2NUUwIGBvYmplY3ROYW1lYCBcdTc2ODRcdTgxMUFcdTY3MkNcdTUyQThcdTRGNUNcdTRGMUFcdTg0M0RcdTUyMzBcbiAqIFx1OEMwM1x1NUVBNlx1NTY2OFx1NEVDRVx1NEUwRFx1NjNBMlx1NkQ0Qlx1NzY4NFx1OTUyRVx1NEUwQVx1MjAxNFx1MjAxNFx1ODlDMSAjNTA5XHVGRjA5XHUzMDAyXHU0RTk0XHU0RTJBXHU1QkY5XHU4QzYxXHU3Njg0XHU2NTg3XHU2ODQ4XHU1QjhDXHU1MTY4XHU3NkY4XHU1NDBDXHVGRjBDXHU1NkUwXHU2QjY0XHU1NzI4XHU2QjY0XHU1OEYwXHU2NjBFXHU0RTAwXHU2QjIxXHU1RTc2XG4gKiBcdTVDNTVcdTVGMDBcdTUyMzBcdTU0MDRcdTVCRjlcdThDNjFcdTc2ODQgYF9hY3Rpb25zYFx1RkYxQVx1NkJDRlx1NEUyQVx1OEJFRFx1OEEwMFx1NjI0Qlx1NjI4NFx1NTM0MVx1NEU5NFx1NEVGRFx1NkI2M1x1NjYyRlx1OEJEMVx1NjU4N1x1OEQ3MFx1NjgzN1x1NzY4NFx1NUYwMFx1N0FFRlx1MzAwMlxuICovXG5leHBvcnQgY29uc3QgYWN0aXZpdHlBY3Rpb25zID0ge1xuICBsb2dfY2FsbDoge1xuICAgIGxhYmVsOiAnXHU4QkIwXHU1RjU1XHU5MDFBXHU4QkREJyxcbiAgICBzdWNjZXNzTWVzc2FnZTogJ1x1OTAxQVx1OEJERFx1OEJCMFx1NUY1NVx1NjIxMFx1NTI5Rlx1RkYwMScsXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU5MDFBXHU4QkREXHU0RTNCXHU5ODk4JyB9LFxuICAgICAgZHVyYXRpb246IHsgbGFiZWw6ICdcdTY1RjZcdTk1N0ZcdUZGMDhcdTUyMDZcdTk0OUZcdUZGMDknIH0sXG4gICAgICBhdHRlbmRlZV9jb250YWN0czogeyBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEVCQVx1NTNDMlx1NEUwRVx1ODAwNScgfSxcbiAgICAgIGF0dGVuZGVlX3VzZXJzOiB7IGxhYmVsOiAnXHU1MTg1XHU5MEU4XHU1M0MyXHU0RTBFXHU4MDA1JyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdcdTkwMUFcdThCRERcdThCQjBcdTVGNTUnIH0sXG4gICAgfSxcbiAgfSxcbiAgbG9nX21lZXRpbmc6IHtcbiAgICBsYWJlbDogJ1x1OEJCMFx1NUY1NVx1NEYxQVx1OEJBRScsXG4gICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTRGMUFcdThCQUVcdThCQjBcdTVGNTVcdTYyMTBcdTUyOUZcdUZGMDEnLFxuICAgIHBhcmFtczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1x1NEYxQVx1OEJBRVx1NEUzQlx1OTg5OCcgfSxcbiAgICAgIGR1cmF0aW9uOiB7IGxhYmVsOiAnXHU2NUY2XHU5NTdGXHVGRjA4XHU1MjA2XHU5NDlGXHVGRjA5JyB9LFxuICAgICAgYXR0ZW5kZWVfY29udGFjdHM6IHsgbGFiZWw6ICdcdTgwNTRcdTdDRkJcdTRFQkFcdTUzQzJcdTRGMUFcdTRFQkEnIH0sXG4gICAgICBhdHRlbmRlZV91c2VyczogeyBsYWJlbDogJ1x1NTE4NVx1OTBFOFx1NTNDMlx1NEYxQVx1NEVCQScgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHU0RjFBXHU4QkFFXHU3RUFBXHU4OTgxJyB9LFxuICAgIH0sXG4gIH0sXG4gIHNjaGVkdWxlX21lZXRpbmc6IHtcbiAgICBsYWJlbDogJ1x1NUI4OVx1NjM5Mlx1NEYxQVx1OEJBRScsXG4gICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTRGMUFcdThCQUVcdTVERjJcdTVCODlcdTYzOTJcdUZGMDEnLFxuICAgIHBhcmFtczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1x1NEYxQVx1OEJBRVx1NEUzQlx1OTg5OCcgfSxcbiAgICAgIHN0YXJ0X2RhdGU6IHsgbGFiZWw6ICdcdTVGMDBcdTU5Q0JcdTY1RTVcdTY3MUZcdUZGMDhVVENcdUZGMDknIH0sXG4gICAgICBzdGFydF90aW1lOiB7IGxhYmVsOiAnXHU1RjAwXHU1OUNCXHU2NUY2XHU5NUY0XHVGRjA4VVRDXHVGRjA5JyB9LFxuICAgICAgbG9jYXRpb246IHsgbGFiZWw6ICdcdTU3MzBcdTcwQjknIH0sXG4gICAgICBkdXJhdGlvbjogeyBsYWJlbDogJ1x1NjVGNlx1OTU3Rlx1RkYwOFx1NTIwNlx1OTQ5Rlx1RkYwOScgfSxcbiAgICAgIGF0dGVuZGVlX2NvbnRhY3RzOiB7IGxhYmVsOiAnXHU4MDU0XHU3Q0ZCXHU0RUJBXHU1M0MyXHU0RjFBXHU0RUJBJyB9LFxuICAgICAgYXR0ZW5kZWVfdXNlcnM6IHsgbGFiZWw6ICdcdTUxODVcdTkwRThcdTUzQzJcdTRGMUFcdTRFQkEnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ1x1NEYxQVx1OEJBRVx1OEJBRVx1N0EwQicgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9vYmplY3RzLmN1c3RvbWVyLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTlwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vb2JqZWN0cy5jdXN0b21lci50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG5pbXBvcnQgeyBhY3Rpdml0eUFjdGlvbnMgfSBmcm9tICcuL19zaGFyZWQnO1xuXG4vKipcbiAqIFx1N0I4MFx1NEY1M1x1NEUyRFx1NjU4NyAoemgtQ04pIFx1MjAxNCBgb2JqZWN0c2AgdHJhbnNsYXRpb25zIGZvciB0aGUgQ1VTVE9NRVIgZmFtaWx5OlxuICogdGhlIGN1c3RvbWVyIHJlY29yZCBpdHNlbGYgXHUyMDE0IGFjY291bnRzIGFuZCB0aGUgcGVvcGxlIGF0IHRoZW0uXG4gKlxuICogUm9zdGVyOiBgY3JtX2FjY291bnRgLCBgY3JtX2NvbnRhY3RgLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICogRXZlcnl0aGluZyB0aGF0IGlzIG5vdCBgb2JqZWN0c2AgbGl2ZXMgaW4gYC4vYXBwLnRzYDsgYG9iamVjdHNgIFx1MjAxNCA2OS03OCUgb2ZcbiAqIGV2ZXJ5IGJ1bmRsZSBcdTIwMTQgaXMgb25lIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5LCBhbmQgYSBkZXRhaWwgb2JqZWN0XG4gKiBmb2xsb3dzIGl0cyBtYXN0ZXIuIEEgbmV3IHJvdyBnb2VzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LCBuZXZlciBpblxuICogd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuOiB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0IHRoZSA3MCVcbiAqIGFkdmlzb3J5IGJhbmQgYHBucG0gaHlnaWVuZWAgcHJpbnRzLiBGdWxsIHJ1bGUgYW5kIHJhdGlvbmFsZTpcbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOLnRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGN1c3RvbWVyOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fYWNjb3VudDoge1xuICAgIGxhYmVsOiAnXHU1QkEyXHU2MjM3JyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1NUJBMlx1NjIzNycsXG4gICAgZGVzY3JpcHRpb246ICdcdTRFMEVcdTYyMTFcdTRFRUNcdTY3MDlcdTRFMUFcdTUyQTFcdTVGODBcdTY3NjVcdTc2ODRcdTUxNkNcdTUzRjhcdTU0OENcdTdFQzRcdTdFQzcnLFxuICAgIGZpZWxkczoge1xuICAgICAgYWNjb3VudF9udW1iZXI6IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTdGMTZcdTUzRjcnIH0sXG4gICAgICByZWdpc3RyYXRpb25fbnVtYmVyOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3NjdCXHU4QkIwXHU4QkMxXHU0RUY2XHU1M0Y3JyxcbiAgICAgICAgaGVscDogJ1x1NUJGOVx1NjVCOVx1NTcyOFx1NTE3Nlx1NjI0MFx1NUM1RVx1NjUzRlx1NUU5Q1x1NzY3Qlx1OEJCMFx1NjczQVx1NTE3M1x1NTNENlx1NUY5N1x1NzY4NFx1NzY3Qlx1OEJCMFx1NjgwN1x1OEJDNlx1MzAwMlx1NEUwRFx1NTQwQ1x1NEU4RVx1NzUzMVx1NjIxMVx1NjVCOVx1NTNEMVx1NjUzRVx1NzY4NFx1NUJBMlx1NjIzN1x1N0YxNlx1NTNGN1x1MzAwMicsXG4gICAgICB9LFxuICAgICAgY29tbWVyY2lhbF9jYXBhYmlsaXR5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU1NTQ2XHU1MkExXHU4MEZEXHU1MjlCJyxcbiAgICAgICAgaGVscDogJ1x1OEJFNVx1NUJBMlx1NjIzN1x1NjYyRlx1NTQyNlx1NTNFRlx1NEVFNVx1NjI3Rlx1NjNBNVx1NjVCMFx1NEUxQVx1NTJBMVx1MzAwMlx1NEVDNVx1N0VEM1x1N0I5N1x1N0M3Qlx1NUJBMlx1NjIzN1x1NEY5RFx1NzEzNlx1NTNFRlx1NzUyOFx1NEU4RVx1NUYwMFx1Nzk2OFx1NEUwRVx1NjUzNlx1NEVEOFx1NkIzRVx1RkYwQ1x1NEY0Nlx1NEUwRFx1ODBGRFx1NTE3M1x1ODA1NFx1NjVCMFx1NzY4NFx1NTU0Nlx1NjczQVx1MzAwMicsXG4gICAgICAgIG9wdGlvbnM6IHsgZnVsbDogJ1x1NUI4Q1x1NjU3NCcsIHNldHRsZW1lbnRfb25seTogJ1x1NEVDNVx1N0VEM1x1N0I5NycgfSxcbiAgICAgIH0sXG4gICAgICBpbmN1bWJlbnRfdmVuZG9yOiB7IGxhYmVsOiAnXHU3M0IwXHU2NzA5XHU0RjlCXHU1RTk0XHU1NTQ2JywgaGVscDogJ1x1NUY1M1x1NTI0RFx1NjI3Rlx1NjNBNVx1OEJFNVx1NUJBMlx1NjIzN1x1OEZEOVx1OTBFOFx1NTIwNlx1NjUyRlx1NTFGQVx1NzY4NFx1NEY5Qlx1NUU5NFx1NTU0Nlx1MzAwMicgfSxcbiAgICAgIGFubnVhbF9wdXJjaGFzaW5nX2J1ZGdldDogeyBsYWJlbDogJ1x1NUU3NFx1NUVBNlx1OTFDN1x1OEQyRFx1OTg4NFx1N0I5NycsIGhlbHA6ICdcdThCRTVcdTVCQTJcdTYyMzdcdTY3MkNcdTVFNzRcdTVFQTZcdTk4ODRcdThCQTFcdTU0MTFcdTRGOUJcdTVFOTRcdTU1NDZcdTY1MkZcdTUxRkFcdTc2ODRcdTkxRDFcdTk4OURcdUZGMENcdTgwMENcdTk3NUVcdTUxNzZcdTgxRUFcdThFQUJcdTg0MjVcdTY1MzZcdTMwMDInIH0sXG4gICAgICBwYXltZW50X2N5Y2xlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RUQ4XHU2QjNFXHU1NDY4XHU2NzFGJyxcbiAgICAgICAgb3B0aW9uczogeyBwcmVwYWlkOiAnXHU5ODg0XHU0RUQ4JywgbmV0XzMwOiAnMzAgXHU1OTI5JywgbmV0XzYwOiAnNjAgXHU1OTI5JywgbmV0XzkwOiAnOTAgXHU1OTI5JyB9LFxuICAgICAgfSxcbiAgICAgIGFwcHJvdmFsX3N0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1NUJBMVx1NjI3OVx1NzJCNlx1NjAwMScsXG4gICAgICAgIGhlbHA6ICdcdThCRTVcdTVCQTJcdTYyMzdcdTc2ODRcdTVCQTFcdTYyNzlcdThGREJcdTVDNTVcdTMwMDJcdTY1QjBcdTVFRkFcdTVCQTJcdTYyMzdcdTUyMURcdTU5Q0JcdTRFM0FcdTVGODVcdTVCQTFcdTYyNzlcdUZGMENcdTVFNzZcdTU3MjhcdTVCQTFcdTYyNzlcdTY1MzZcdTRFRjZcdTdCQjFcdTRFMkRcdTg4QzFcdTVCOUFcdTMwMDInLFxuICAgICAgICBvcHRpb25zOiB7IHBlbmRpbmc6ICdcdTVGODVcdTVCQTFcdTYyNzknLCBhcHByb3ZlZDogJ1x1NURGMlx1OTAxQVx1OEZDNycsIHJlamVjdGVkOiAnXHU1REYyXHU5QTczXHU1NkRFJyB9LFxuICAgICAgfSxcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTU0MERcdTc5RjAnLCBoZWxwOiAnXHU1MTZDXHU1M0Y4XHU2MjE2XHU3RUM0XHU3RUM3XHU3Njg0XHU2Q0Q1XHU1QjlBXHU1NDBEXHU3OUYwJyB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ1x1N0M3Qlx1NTc4QicsXG4gICAgICAgIG9wdGlvbnM6IHsgcHJvc3BlY3Q6ICdcdTZGNUNcdTU3MjhcdTVCQTJcdTYyMzcnLCBjdXN0b21lcjogJ1x1NkI2M1x1NUYwRlx1NUJBMlx1NjIzNycsIHBhcnRuZXI6ICdcdTU0MDhcdTRGNUNcdTRGMTlcdTRGMzQnLCBmb3JtZXI6ICdcdTUyNERcdTVCQTJcdTYyMzcnIH0sXG4gICAgICB9LFxuICAgICAgaW5kdXN0cnk6IHtcbiAgICAgICAgbGFiZWw6ICdcdTg4NENcdTRFMUEnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgdGVjaG5vbG9neTogJ1x1NzlEMVx1NjI4MCcsIHNvZnR3YXJlOiAnXHU4RjZGXHU0RUY2IC8gU2FhUycsIGZpbmFuY2U6ICdcdTkxRDFcdTg3OEQnLFxuICAgICAgICAgIGhlYWx0aGNhcmU6ICdcdTUzM0JcdTc1OTcnLCByZXRhaWw6ICdcdTk2RjZcdTU1MkUnLCBtYW51ZmFjdHVyaW5nOiAnXHU1MjM2XHU5MDIwJyxcbiAgICAgICAgICBlZHVjYXRpb246ICdcdTY1NTlcdTgwQjInLCByZWFsX2VzdGF0ZTogJ1x1NjIzRlx1NTczMFx1NEVBNycsIG1lZGlhOiAnXHU0RjIwXHU1QTkyXHU1QTMxXHU0RTUwJyxcbiAgICAgICAgICBsb2dpc3RpY3M6ICdcdTcyNjlcdTZENDEnLCBob3NwaXRhbGl0eTogJ1x1OTE1Mlx1NUU5N1x1NjVDNVx1NkUzOCcsIGVuZXJneTogJ1x1ODBGRFx1NkU5MFx1NTE2Q1x1NzUyOFx1NEU4Qlx1NEUxQScsXG4gICAgICAgICAgZ292ZXJubWVudDogJ1x1NjUzRlx1NUU5QycsIG5vbnByb2ZpdDogJ1x1OTc1RVx1ODQyNVx1NTIyOScsIG90aGVyOiAnXHU1MTc2XHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhbm51YWxfcmV2ZW51ZTogeyBsYWJlbDogJ1x1NUU3NFx1ODQyNVx1NjUzNicgfSxcbiAgICAgIGNoaWxkX2FjY291bnRfcmV2ZW51ZTogeyBsYWJlbDogJ1x1NUI1MFx1NTE2Q1x1NTNGOFx1NUU3NFx1ODQyNVx1NjUzNlx1NTQwOFx1OEJBMScsIGhlbHA6ICdcdTY3MkNcdTVCQTJcdTYyMzdcdTc2RjRcdTVDNUVcdTVCNTBcdTUxNkNcdTUzRjhcdTc2ODRcdTVFNzRcdTg0MjVcdTY1MzZcdTU0MDhcdThCQTFcdTMwMDInIH0sXG4gICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiB7IGxhYmVsOiAnXHU1NDU4XHU1REU1XHU0RUJBXHU2NTcwJyB9LFxuICAgICAgcGhvbmU6IHsgbGFiZWw6ICdcdTc1MzVcdThCREQnIH0sXG4gICAgICB3ZWJzaXRlOiB7IGxhYmVsOiAnXHU3RjUxXHU3QUQ5JyB9LFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnXHU4RDI2XHU1MzU1XHU1NzMwXHU1NzQwJyB9LFxuICAgICAgYmlsbGluZ19jb3VudHJ5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU4RDI2XHU1MzU1XHU1NkZEXHU1QkI2JyxcbiAgICAgICAgaGVscDogJ1x1NzUzMVx1OEQyNlx1NTM1NVx1NTczMFx1NTc0MFx1NjNBOFx1NUJGQ1x1MjAxNFx1MjAxNFx1NjMwOVx1NUY1NVx1NTE2NVx1NTM5Rlx1NjgzN1x1NTNCQlx1OTY2NFx1OTk5Nlx1NUMzRVx1N0E3QVx1NjgzQ1x1NUU3Nlx1OEY2Q1x1NEUzQVx1NTkyN1x1NTE5OVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgdGVycml0b3J5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU1MzNBXHU1N0RGJyxcbiAgICAgICAgaGVscDogJ1x1NzUzMVx1OEQyNlx1NTM1NVx1NTczMFx1NTc0MFx1NjNBOFx1NUJGQ1x1MjAxNFx1MjAxNFx1NTMzQVx1NTdERlx1NTE3MVx1NEVBQlx1ODlDNFx1NTIxOVx1NjM2RVx1NkI2NFx1NTMzOVx1OTE0RFx1MzAwMlx1NEUwRFx1NUM1RVx1NEU4RVx1NURGMlx1OTE0RFx1N0Y2RVx1NTMzQVx1NTdERlx1NzY4NFx1NUJBMlx1NjIzN1x1NEUzQVx1MjAxQ1x1NTE3Nlx1NEVENlx1MjAxRFx1MzAwMicsXG4gICAgICAgIG9wdGlvbnM6IHsgbmE6ICdcdTUzMTdcdTdGOEUnLCBlbWVhOiAnXHU2QjI3XHU2RDMyXHUzMDAxXHU0RTJEXHU0RTFDXHU0RTBFXHU5NzVFXHU2RDMyJywgb3RoZXI6ICdcdTUxNzZcdTRFRDYnIH0sXG4gICAgICB9LFxuICAgICAgb2ZmaWNlX2xvY2F0aW9uOiB7IGxhYmVsOiAnXHU1MjlFXHU1MTZDXHU1NzMwXHU3MEI5JyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdThEMUZcdThEMjNcdTRFQkEnIH0sXG4gICAgICBwYXJlbnRfYWNjb3VudDogeyBsYWJlbDogJ1x1NkJDRFx1NTE2Q1x1NTNGOCcsIGhlbHA6ICdcdTVDNDJcdTdFQTdcdTdFRDNcdTY3ODRcdTRFMkRcdTc2ODRcdTZCQ0RcdTUxNkNcdTUzRjgnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ1x1NjNDRlx1OEZGMCcgfSxcbiAgICAgIGlzX2FjdGl2ZTogeyBsYWJlbDogJ1x1NjYyRlx1NTQyNlx1NkQzQlx1OERDMycgfSxcbiAgICAgIGxhc3RfYWN0aXZpdHlfZGF0ZTogeyBsYWJlbDogJ1x1NjcwMFx1OEZEMVx1NkQzQlx1NTJBOFx1NjVFNVx1NjcxRicgfSxcbiAgICAgIGJyYW5kX2NvbG9yOiB7IGxhYmVsOiAnXHU1NEMxXHU3MjRDXHU4MjcyJyB9LFxuICAgICAgbG9nbzogeyBsYWJlbDogJ1x1NTE2Q1x1NTNGOFx1NjgwN1x1OEJDNicgfSxcbiAgICAgIHRpZXI6IHtcbiAgICAgICAgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTUyMDZcdTVDNDInLFxuICAgICAgICBvcHRpb25zOiB7IHN0cmF0ZWdpYzogJ1x1NjIxOFx1NzU2NVx1NUJBMlx1NjIzNycsIGVudGVycHJpc2U6ICdcdTRGMDFcdTRFMUFcdTVCQTJcdTYyMzcnLCBtaWRfbWFya2V0OiAnXHU0RTJEXHU1NzhCXHU1QkEyXHU2MjM3Jywgc21iOiAnXHU0RTJEXHU1QzBGXHU1QkEyXHU2MjM3JyB9LFxuICAgICAgfSxcbiAgICAgIHNlZ21lbnQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTdFQzZcdTUyMDYnLFxuICAgICAgICBvcHRpb25zOiB7IG5ldF9uZXc6ICdcdTUxNjhcdTY1QjBcdTVCQTJcdTYyMzcnLCBncm93dGg6ICdcdTU4OUVcdTk1N0ZcdTVCQTJcdTYyMzcnLCBhdF9yaXNrOiAnXHU5OENFXHU5NjY5XHU1QkEyXHU2MjM3Jywgc3RhYmxlOiAnXHU3QTMzXHU1QjlBXHU1QkEyXHU2MjM3JyB9LFxuICAgICAgfSxcbiAgICAgIGhlYWx0aF9zY29yZToge1xuICAgICAgICBsYWJlbDogJ1x1NTA2NVx1NUVCN1x1NUVBNicsXG4gICAgICAgIGhlbHA6ICdcdTVCQTJcdTYyMzdcdTYyMTBcdTUyOUZcdTdFQ0ZcdTc0MDZcdTdFRjRcdTYyQTRcdTc2ODRcdTUwNjVcdTVFQjdcdTVFQTZcdTYzMDdcdTY4MDcnLFxuICAgICAgICBvcHRpb25zOiB7IGhlYWx0aHk6ICdcdTUwNjVcdTVFQjcnLCB3YXRjaGluZzogJ1x1NTE3M1x1NkNFOCcsIGF0X3Jpc2s6ICdcdTk4Q0VcdTk2NjknLCBjaHVybmluZzogJ1x1NkQ0MVx1NTkzMVx1NEUyRCcgfSxcbiAgICAgIH0sXG4gICAgICBuYW1lX25vcm1hbGl6ZWQ6IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTU0MERcdTc5RjBcdUZGMDhcdTg5QzRcdTgzMDNcdTUzMTZcdUZGMDknLCBoZWxwOiAnXHU3RUJGXHU3RDIyXHU4RjZDXHU1MzE2XHU3Njg0XHU1MzM5XHU5MTREXHU5NTJFXHVGRjFBXHU1QkEyXHU2MjM3XHU1NDBEXHU3OUYwXHU4RjZDXHU1QzBGXHU1MTk5XHUzMDAxXHU1M0JCXHU5NjY0XHU5OTk2XHU1QzNFXHU3QTdBXHU2ODNDXHUzMDAxXHU1MTg1XHU5MEU4XHU4RkRFXHU3RUVEXHU3QTdBXHU3NjdEXHU1NDA4XHU1RTc2XHU0RTNBXHU0RTAwXHU0RTJBXHU3QTdBXHU2ODNDXHUzMDAyXHU3NTMxIGFjY291bnRfcHJvdGVjdGlvbiBcdTk0QTlcdTVCNTBcdTdFRjRcdTYyQTRcdTIwMTRcdTIwMTRcdThCRjdcdTUyRkZcdTc2RjRcdTYzQTVcdTdGMTZcdThGOTFcdTMwMDInIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnXHU2NjNFXHU3OTNBXHU1NDBEXHU3OUYwJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfYWNjb3VudHM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTUxNjhcdTkwRThcdTVCQTJcdTYyMzcnLCBkZXNjcmlwdGlvbjogJ1x1NUJBMlx1NjIzN1x1NEUzQlx1NTIxN1x1ODg2OFx1RkYwQ1x1NTMwNVx1NTQyQlx1ODQyNVx1NjUzNlx1NEUwRVx1ODg0Q1x1NEUxQVx1NjQ1OFx1ODk4MScsXG4gICAgICAgIGJ1bGtBY3Rpb25zOiB7XG4gICAgICAgICAgZGVsZXRlOiB7XG4gICAgICAgICAgICBsYWJlbDogJ1x1NTIyMFx1OTY2NCcsXG4gICAgICAgICAgICBjb25maXJtTGFiZWw6ICdcdTUyMjBcdTk2NjQnLFxuICAgICAgICAgICAgY29uZmlybVRleHQ6ICdcdTc4NkVcdTVCOUFcdTg5ODFcdTZDMzhcdTRFNDVcdTUyMjBcdTk2NjQge3tjb3VudH19IFx1NEUyQVx1NUJBMlx1NjIzN1x1NTQxN1x1RkYxRlx1NkI2NFx1NjRDRFx1NEY1Q1x1NjVFMFx1NkNENVx1NjRBNFx1OTUwMFx1MzAwMicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cmFuc2Zlcl9vd25lcjoge1xuICAgICAgICAgICAgbGFiZWw6ICdcdThGNkNcdTc5RkJcdThEMUZcdThEMjNcdTRFQkEnLFxuICAgICAgICAgICAgY29uZmlybVRleHQ6ICdcdTc4NkVcdTVCOUFcdTg5ODFcdThGNkNcdTc5RkIge3tjb3VudH19IFx1NEUyQVx1NUJBMlx1NjIzN1x1NzY4NFx1OEQxRlx1OEQyM1x1NEVCQVx1NTQxN1x1RkYxRicsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgb3duZXJfaWQ6IHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1x1NjVCMFx1OEQxRlx1OEQyM1x1NEVCQScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBkYXRlX3RpZXI6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnXHU2NkY0XHU2NUIwXHU1QkEyXHU2MjM3XHU3QjQ5XHU3RUE3JyxcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiAnXHU3ODZFXHU1QjlBXHU4OTgxXHU1QzA2IHt7Y291bnR9fSBcdTRFMkFcdTVCQTJcdTYyMzdcdTc2ODRcdTdCNDlcdTdFQTdcdTY2RjRcdTY1QjBcdTRFM0Ege3t0aWVyfX0gXHU1NDE3XHVGRjFGJyxcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICB0aWVyOiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTdCNDlcdTdFQTcnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFjY291bnRfZ2FsbGVyeTogeyBsYWJlbDogJ1x1NUJBMlx1NjIzN1x1NTM2MVx1NzI0NycsIGRlc2NyaXB0aW9uOiAnXHU0RjdGXHU3NTI4XHU1NEMxXHU3MjRDXHU4MjcyXHU5QUQ4XHU0RUFFXHU3Njg0XHU1QkEyXHU2MjM3XHU1MzYxXHU3MjQ3XHU4OUM2XHU1NkZFJyB9LFxuICAgICAgYWNjb3VudF9tYXA6IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTU3MzBcdTU2RkUnLCBkZXNjcmlwdGlvbjogJ1x1NUJBMlx1NjIzN1x1NzY4NFx1NTczMFx1NzQwNlx1NTIwNlx1NUUwMycgfSxcbiAgICAgIGVudGVycHJpc2VfYWNjb3VudHM6IHsgbGFiZWw6ICdcdTRGMDFcdTRFMUFcdTVCQTJcdTYyMzcnLCBkZXNjcmlwdGlvbjogJ1x1NUU3NFx1ODQyNVx1NjUzNlx1NjcwMFx1OUFEOFx1NzY4NFx1NTkyN1x1NUJBMlx1NjIzNycgfSxcbiAgICAgIG15X2FjY291bnRzOiB7IGxhYmVsOiAnXHU2MjExXHU3Njg0XHU1QkEyXHU2MjM3JywgZGVzY3JpcHRpb246ICdcdTc1MzFcdTVGNTNcdTUyNERcdTc1MjhcdTYyMzdcdThEMUZcdThEMjNcdTc2ODRcdTVCQTJcdTYyMzcnIH0sXG4gICAgICBhdF9yaXNrX2FjY291bnRzOiB7IGxhYmVsOiAnXHUyNkEwXHVGRTBGIFx1OThDRVx1OTY2OVx1NUJBMlx1NjIzNycgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTU3RkFcdTY3MkNcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBmaW5hbmNpYWxzOiB7IGxhYmVsOiAnXHU4RDIyXHU1MkExXHU0RkUxXHU2MDZGJyB9LFxuICAgICAgYnVzaW5lc3NfcHJvZmlsZTogeyBsYWJlbDogJ1x1NEUxQVx1NTJBMVx1NEZFMVx1NjA2RicgfSxcbiAgICAgIGNvbnRhY3RfaW5mbzogeyBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEZFMVx1NjA2RicgfSxcbiAgICAgIG93bmVyc2hpcDogeyBsYWJlbDogJ1x1NUY1Mlx1NUM1RVx1NEUwRVx1NzJCNlx1NjAwMScgfSxcbiAgICAgIGJyYW5kaW5nOiB7IGxhYmVsOiAnXHU1NEMxXHU3MjRDJyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnXHU3Q0ZCXHU3RURGJyB9LFxuICAgICAgLy8gYWNjb3VudC52aWV3LnRzIFx1ODg2OFx1NTM1NVx1NTMzQVx1NTc1N1x1NTQwRFx1NzlGMCAoIzExMDApXG4gICAgICBwcm9maWxlOiB7IGxhYmVsOiAnXHU4RDQ0XHU2NTk5JyB9LFxuICAgICAgY3VzdG9tZXJfc3VjY2VzczogeyBsYWJlbDogJ1x1NUJBMlx1NjIzN1x1NjIxMFx1NTI5RicgfSxcbiAgICAgIGxvY2F0aW9uczogeyBsYWJlbDogJ1x1NTczMFx1NTc0MFx1NEZFMVx1NjA2RicgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU2M0NGXHU4RkYwJyB9LFxuICAgIH0sXG4gICAgX2FjdGlvbnM6IHsgLi4uYWN0aXZpdHlBY3Rpb25zIH0sXG4gIH0sXG4gIGNybV9jb250YWN0OiB7XG4gICAgbGFiZWw6ICdcdTgwNTRcdTdDRkJcdTRFQkEnLFxuICAgIHBsdXJhbExhYmVsOiAnXHU4MDU0XHU3Q0ZCXHU0RUJBJyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1NUJBMlx1NjIzN1x1NEUwRVx1NTU0Nlx1NjczQVx1NzY4NFx1NTE3M1x1OTUyRVx1NEVCQVx1NzI2OVx1ODA1NFx1N0NGQlx1NEVCQScsXG4gICAgZmllbGRzOiB7XG4gICAgICBzYWx1dGF0aW9uOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3OUYwXHU4QzEzJyxcbiAgICAgICAgb3B0aW9uczogeyBtcjogJ1x1NTE0OFx1NzUxRicsIG1zOiAnXHU1OTczXHU1OEVCJywgbXJzOiAnXHU1OTJCXHU0RUJBJywgZHI6ICdcdTUzNUFcdTU4RUInLCBwcm9mOiAnXHU2NTU5XHU2Mzg4JyB9LFxuICAgICAgfSxcbiAgICAgIGZpcnN0X25hbWU6IHsgbGFiZWw6ICdcdTU0MEQnIH0sXG4gICAgICBsYXN0X25hbWU6IHsgbGFiZWw6ICdcdTU5RDMnIH0sXG4gICAgICBmdWxsX25hbWU6IHsgbGFiZWw6ICdcdTUxNjhcdTU0MEQnIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ1x1NjI0MFx1NUM1RVx1NUJBMlx1NjIzNycgfSxcbiAgICAgIGVtYWlsOiB7IGxhYmVsOiAnXHU5MEFFXHU3QkIxJyB9LFxuICAgICAgcGhvbmU6IHsgbGFiZWw6ICdcdTc1MzVcdThCREQnIH0sXG4gICAgICBtb2JpbGU6IHsgbGFiZWw6ICdcdTYyNEJcdTY3M0EnIH0sXG4gICAgICB0aXRsZTogeyBsYWJlbDogJ1x1ODA0Q1x1NEY0RCcgfSxcbiAgICAgIGRlcGFydG1lbnQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTkwRThcdTk1RTgnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZXhlY3V0aXZlOiAnXHU3QkExXHU3NDA2XHU1QzQyJywgc2FsZXM6ICdcdTk1MDBcdTU1MkVcdTkwRTgnLCBtYXJrZXRpbmc6ICdcdTVFMDJcdTU3M0FcdTkwRTgnLFxuICAgICAgICAgIGVuZ2luZWVyaW5nOiAnXHU1REU1XHU3QTBCXHU5MEU4Jywgc3VwcG9ydDogJ1x1NjUyRlx1NjMwMVx1OTBFOCcsIGZpbmFuY2U6ICdcdThEMjJcdTUyQTFcdTkwRTgnLFxuICAgICAgICAgIGhyOiAnXHU0RUJBXHU1MjlCXHU4RDQ0XHU2RTkwJywgb3BlcmF0aW9uczogJ1x1OEZEMFx1ODQyNVx1OTBFOCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLy8gXHU5MUM3XHU4RDJEXHU1MUIzXHU3QjU2XHU1NzA4IChSRVEtMDAwNClcdTMwMDJcdTgyRjFcdTY1ODdcdTY4MDdcdTdCN0VcdTY2MkYgJ0J1eWluZyBGdW5jdGlvbicgXHU4MDBDXHU5NzVFICdCdXlpbmcgUm9sZSdcdUZGMUFcbiAgICAgIC8vIFx1NUU3M1x1NTNGMFx1NzY4NCBzZWN1cml0eS1yb2xlLXdvcmQgXHU4OUM0XHU1MjE5XHU1NzI4XHU1QkY5XHU4QzYxXHU1OEYwXHU2NjBFXHU0RTBBXHU0RkREXHU3NTU5XHU0RTg2XHU4MkYxXHU2NTg3IHJvbGUgXHU0RTAwXHU4QkNEXHVGRjA4QURSLTAwOTAgRDNcdUZGMDlcdTMwMDJcbiAgICAgIC8vIFx1OEJFNVx1ODlDNFx1NTIxOVx1NTNFQVx1NTMzOVx1OTE0RFx1ODJGMVx1NjU4N1x1RkYwQ1x1NEUwRFx1OEJGQlx1OEJFRFx1OEEwMFx1NTMwNVx1RkYwQ1x1NjI0MFx1NEVFNVx1NEUyRFx1NjU4N1x1OEZEOVx1OTFDQ1x1NzUyOFx1NjcyQ1x1NTczMFx1OEJGQlx1ODAwNVx1NzcxRlx1NkI2M1x1NTcyOFx1OEJGNFx1NzY4NFx1OEJDRFx1MzAwMlxuICAgICAgYnV5aW5nX2Z1bmN0aW9uOiB7XG4gICAgICAgIGxhYmVsOiAnXHU5MUM3XHU4RDJEXHU4OUQyXHU4MjcyJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGRlY2lzaW9uX21ha2VyOiAnXHU1MUIzXHU3QjU2XHU4MDA1JywgZWNvbm9taWNfYnV5ZXI6ICdcdTk4ODRcdTdCOTdcdTUxQjNcdTdCNTZcdTRFQkEnLFxuICAgICAgICAgIHRlY2huaWNhbF9ldmFsdWF0b3I6ICdcdTYyODBcdTY3MkZcdThCQzRcdTRGMzBcdTRFQkEnLCB1c2VyOiAnXHU0RjdGXHU3NTI4XHU4MDA1JyxcbiAgICAgICAgICBpbmZsdWVuY2VyOiAnXHU1RjcxXHU1NENEXHU4MDA1JywgZ2F0ZWtlZXBlcjogJ1x1NUI4OFx1OTVFOFx1NEVCQScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXR0aXR1ZGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTVCRjlcdTYyMTFcdTUzRjhcdTYwMDFcdTVFQTYnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY2hhbXBpb246ICdcdTYyRTVcdTYyQTRcdTgwMDUnLCBzdXBwb3J0aXZlOiAnXHU2NTJGXHU2MzAxJywgbmV1dHJhbDogJ1x1NEUyRFx1N0FDQicsXG4gICAgICAgICAgc2tlcHRpY2FsOiAnXHU1QjU4XHU3NTkxJywgYmxvY2tlcjogJ1x1NTNDRFx1NUJGOVx1ODAwNScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmVsYXRpb25zaGlwX3N0cmVuZ3RoOiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RTBFXHU5NTAwXHU1NTJFXHU1MTczXHU3Q0ZCXHU1RjNBXHU1RUE2JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGRpc3RhbnQ6ICdcdTc1OEZcdThGREMnLCBhY3F1YWludGFuY2U6ICdcdTRFMDBcdTgyMkNcdThCQTRcdThCQzYnLCB3b3JraW5nOiAnXHU1REU1XHU0RjVDXHU1RjgwXHU2NzY1JyxcbiAgICAgICAgICBzdHJvbmc6ICdcdTUxNzNcdTdDRkJcdTdEMjdcdTVCQzYnLCB0cnVzdGVkX2Fkdmlzb3I6ICdcdTUzRUZcdTRGRTFcdTk4N0VcdTk1RUUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnXHU4MDU0XHU3Q0ZCXHU0RUJBXHU4RDFGXHU4RDIzXHU0RUJBJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdTYzQ0ZcdThGRjAnIH0sXG4gICAgICBpc19wcmltYXJ5OiB7IGxhYmVsOiAnXHU0RTNCXHU4OTgxXHU4MDU0XHU3Q0ZCXHU0RUJBJywgaGVscDogJ1x1NjYyRlx1NTQyNlx1NEUzQVx1OEJFNVx1NUJBMlx1NjIzN1x1NzY4NFx1NEUzQlx1ODk4MVx1ODA1NFx1N0NGQlx1NEVCQVx1RkYxRicgfSxcbiAgICAgIG1haWxpbmdfYWRkcmVzczogeyBsYWJlbDogJ1x1OTBBRVx1NUJDNFx1NTczMFx1NTc0MCcgfSxcbiAgICAgIGxlYWRfc291cmNlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3RUJGXHU3RDIyXHU2NzY1XHU2RTkwJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHdlYjogJ1x1N0Y1MVx1N0FEOScsIHJlZmVycmFsOiAnXHU2M0E4XHU4MzUwJywgZXZlbnQ6ICdcdTZEM0JcdTUyQTggLyBcdTVDNTVcdTRGMUEnLFxuICAgICAgICAgIHdlYmluYXI6ICdcdTdFQkZcdTRFMEFcdTc4MTRcdThCQThcdTRGMUEnLCBwYXJ0bmVyOiAnXHU1NDA4XHU0RjVDXHU0RjE5XHU0RjM0JywgYWR2ZXJ0aXNlbWVudDogJ1x1NUU3Rlx1NTQ0QScsXG4gICAgICAgICAgcGFpZF9zZWFyY2g6ICdcdTRFRDhcdThEMzlcdTY0MUNcdTdEMjInLCBzb2NpYWw6ICdcdTc5M0VcdTRFQTRcdTVBOTJcdTRGNTMnLCBjb250ZW50OiAnXHU1MTg1XHU1QkI5IC8gXHU1MzVBXHU1QkEyJyxcbiAgICAgICAgICBjb2xkX2NhbGw6ICdcdTk2NENcdTc1MUZcdTYyRENcdThCQkYnLCBlbWFpbF9jYW1wYWlnbjogJ1x1OTBBRVx1NEVGNlx1ODQyNVx1OTUwMCcsIG90aGVyOiAnXHU1MTc2XHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBkb19ub3RfY2FsbDogeyBsYWJlbDogJ1x1Nzk4MVx1NkI2Mlx1ODFGNFx1NzUzNScgfSxcbiAgICAgIGVtYWlsX29wdF9vdXQ6IHsgbGFiZWw6ICdcdTYyRDJcdTdFRERcdTkwQUVcdTRFRjYnIH0sXG4gICAgICBsYXN0X2NvbnRhY3RlZF9kYXRlOiB7IGxhYmVsOiAnXHU2NzAwXHU4RkQxXHU4MDU0XHU3Q0ZCXHU2NUY2XHU5NUY0JyB9LFxuICAgICAgYXZhdGFyOiB7IGxhYmVsOiAnXHU1OTM0XHU1MENGJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfY29udGFjdHM6IHsgbGFiZWw6ICdcdTUxNjhcdTkwRThcdTgwNTRcdTdDRkJcdTRFQkEnIH0sXG4gICAgICBjb250YWN0X2RpcmVjdG9yeTogeyBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEVCQVx1NzZFRVx1NUY1NScgfSxcbiAgICAgIHByaW1hcnlfY29udGFjdHM6IHsgbGFiZWw6ICdcdTRFM0JcdTg5ODFcdTgwNTRcdTdDRkJcdTRFQkEnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgbWFya19wcmltYXJ5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU4QkJFXHU0RTNBXHU0RTNCXHU4OTgxXHU4MDU0XHU3Q0ZCXHU0RUJBJyxcbiAgICAgICAgY29uZmlybVRleHQ6ICdcdTY2MkZcdTU0MjZcdTVDMDZcdTZCNjRcdTgwNTRcdTdDRkJcdTRFQkFcdThCQkVcdTRFM0FcdThCRTVcdTVCQTJcdTYyMzdcdTc2ODRcdTRFM0JcdTg5ODFcdTgwNTRcdTdDRkJcdTRFQkFcdUZGMUYnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1NURGMlx1OEJCRVx1NEUzQVx1NEUzQlx1ODk4MVx1ODA1NFx1N0NGQlx1NEVCQVx1RkYwMScsXG4gICAgICB9LFxuICAgICAgc2VuZF9lbWFpbDoge1xuICAgICAgICBsYWJlbDogJ1x1NTNEMVx1OTAwMVx1OTBBRVx1NEVGNicsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHN1YmplY3Q6IHsgbGFiZWw6ICdcdTRFM0JcdTk4OTgnIH0sXG4gICAgICAgICAgYm9keTogeyBsYWJlbDogJ1x1NkI2M1x1NjU4NycgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhZGRfY29udGFjdF90b19jYW1wYWlnbjoge1xuICAgICAgICBsYWJlbDogJ1x1NTJBMFx1NTE2NVx1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCcsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU4MDU0XHU3Q0ZCXHU0RUJBXHU1REYyXHU1MkEwXHU1MTY1XHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4XHVGRjAxJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4JyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgaWRlbnRpdHk6IHsgbGFiZWw6ICdcdThFQUJcdTRFRkRcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBhY2NvdW50X2luZm86IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTRFMEVcdTgwNENcdTUyQTEnIH0sXG4gICAgICBidXlpbmdfY2VudHJlOiB7IGxhYmVsOiAnXHU5MUM3XHU4RDJEXHU1MUIzXHU3QjU2XHU1NzA4JyB9LFxuICAgICAgY29udGFjdF9pbmZvOiB7IGxhYmVsOiAnXHU4MDU0XHU3Q0ZCXHU2NUI5XHU1RjBGJyB9LFxuICAgICAgbWFpbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnXHU5MEFFXHU1QkM0XHU1NzMwXHU1NzQwJyB9LFxuICAgICAgYWRkaXRpb25hbDogeyBsYWJlbDogJ1x1OTY0NFx1NTJBMFx1NEZFMVx1NjA2RicgfSxcbiAgICAgIHByZWZlcmVuY2VzOiB7IGxhYmVsOiAnXHU2QzlGXHU5MDFBXHU1MDRGXHU1OTdEJyB9LFxuICAgICAgLy8gY29udGFjdC52aWV3LnRzIFx1ODg2OFx1NTM1NVx1NTMzQVx1NTc1N1x1NTQwRFx1NzlGMCAoIzExMDApXG4gICAgICBjb250YWN0X2RldGFpbHM6IHsgbGFiZWw6ICdcdTgwNTRcdTdDRkJcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBjb21tX3ByZWZlcmVuY2VzOiB7IGxhYmVsOiAnXHU1MDRGXHU1OTdEXHU4QkJFXHU3RjZFJyB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOL29iamVjdHMucGlwZWxpbmUudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9vYmplY3RzLnBpcGVsaW5lLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IGFjdGl2aXR5QWN0aW9ucyB9IGZyb20gJy4vX3NoYXJlZCc7XG5cbi8qKlxuICogXHU3QjgwXHU0RjUzXHU0RTJEXHU2NTg3ICh6aC1DTikgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBQSVBFTElORSBmYW1pbHk6XG4gKiBkZW1hbmQgYW5kIHRoZSBkZWFscyBpdCBiZWNvbWVzLCBwbHVzIHRoZSByb2xsLXVwIHRoYXQgZm9yZWNhc3RzIHRoZW0uXG4gKlxuICogUm9zdGVyOiBgY3JtX2xlYWRgLCBgY3JtX29wcG9ydHVuaXR5YCwgYGNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW1gLCBgY3JtX2ZvcmVjYXN0YC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBwaXBlbGluZTogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX2xlYWQ6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGRpc3F1YWxpZmljYXRpb25fcmVhc29uX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTdFQkZcdTdEMjJcdTY4MDdcdThCQjBcdTRFM0FcdTRFMERcdTU0MDhcdTY4M0NcdTY1RjZcdTVGQzVcdTk4N0JcdTU4NkJcdTUxOTlcdTUzRDZcdTZEODhcdThENDRcdTY4M0NcdTUzOUZcdTU2RTAnLFxuICAgICAgfSxcbiAgICAgIGR1cGxpY2F0ZV9kaXNxdWFsaWZpY2F0aW9uX3JlcXVpcmVzX3N1cnZpdm9yOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTRFRTVcdTkxQ0RcdTU5MERcdTRFM0FcdTc1MzFcdTUzRDZcdTZEODhcdTdFQkZcdTdEMjJcdThENDRcdTY4M0NcdTY1RjZcdUZGMENcdTVGQzVcdTk4N0JcdTYzMDdcdTY2MEVcdTRGRERcdTc1NTlcdTc2ODRcdThCQjBcdTVGNTVcdTVFNzZcdTVDMDZcdTkxQ0RcdTU5MERcdTcyQjZcdTYwMDFcdThCQkVcdTRFM0FcdTVERjJcdTc4NkVcdThCQTQnLFxuICAgICAgfSxcbiAgICAgIGVtYWlsX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTc1MzVcdTVCNTBcdTkwQUVcdTRFRjZcdTRFM0FcdTVGQzVcdTU4NkJcdTk4NzknLFxuICAgICAgfSxcbiAgICAgIGxlYWRfc3RhdHVzX3Byb2dyZXNzaW9uOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTY1RTBcdTY1NDhcdTc2ODRcdTdFQkZcdTdEMjJcdTcyQjZcdTYwMDFcdTZENDFcdThGNkMnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU3RUJGXHU3RDIyJyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1N0VCRlx1N0QyMicsXG4gICAgZGVzY3JpcHRpb246ICdcdTVDMUFcdTY3MkFcdTc4NkVcdThCQTRcdTc2ODRcdTZGNUNcdTU3MjhcdTVCQTJcdTYyMzcnLFxuICAgIGZpZWxkczoge1xuICAgICAgc2FsdXRhdGlvbjoge1xuICAgICAgICBsYWJlbDogJ1x1NzlGMFx1OEMxMycsXG4gICAgICAgIG9wdGlvbnM6IHsgbXI6ICdcdTUxNDhcdTc1MUYnLCBtczogJ1x1NTk3M1x1NThFQicsIG1yczogJ1x1NTkyQlx1NEVCQScsIGRyOiAnXHU1MzVBXHU1OEVCJywgcHJvZjogJ1x1NjU1OVx1NjM4OCcgfSxcbiAgICAgIH0sXG4gICAgICBmaXJzdF9uYW1lOiB7IGxhYmVsOiAnXHU1NDBEJyB9LFxuICAgICAgbGFzdF9uYW1lOiB7IGxhYmVsOiAnXHU1OUQzJyB9LFxuICAgICAgZnVsbF9uYW1lOiB7IGxhYmVsOiAnXHU1MTY4XHU1NDBEJyB9LFxuICAgICAgY29tcGFueTogeyBsYWJlbDogJ1x1NTE2Q1x1NTNGOCcgfSxcbiAgICAgIHRpdGxlOiB7IGxhYmVsOiAnXHU4MDRDXHU0RjREJyB9LFxuICAgICAgZW1haWw6IHsgbGFiZWw6ICdcdTkwQUVcdTdCQjEnIH0sXG4gICAgICBwaG9uZTogeyBsYWJlbDogJ1x1NzUzNVx1OEJERCcgfSxcbiAgICAgIGluZHVzdHJ5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU4ODRDXHU0RTFBJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHRlY2hub2xvZ3k6ICdcdTc5RDFcdTYyODAnLCBzb2Z0d2FyZTogJ1x1OEY2Rlx1NEVGNiAvIFNhYVMnLCBmaW5hbmNlOiAnXHU5MUQxXHU4NzhEJyxcbiAgICAgICAgICBoZWFsdGhjYXJlOiAnXHU1MzNCXHU3NTk3JywgcmV0YWlsOiAnXHU5NkY2XHU1NTJFJywgbWFudWZhY3R1cmluZzogJ1x1NTIzNlx1OTAyMCcsXG4gICAgICAgICAgZWR1Y2F0aW9uOiAnXHU2NTU5XHU4MEIyJywgcmVhbF9lc3RhdGU6ICdcdTYyM0ZcdTU3MzBcdTRFQTcnLCBtZWRpYTogJ1x1NEYyMFx1NUE5Mlx1NUEzMVx1NEU1MCcsXG4gICAgICAgICAgbG9naXN0aWNzOiAnXHU3MjY5XHU2RDQxJywgaG9zcGl0YWxpdHk6ICdcdTkxNTJcdTVFOTdcdTY1QzVcdTZFMzgnLCBlbmVyZ3k6ICdcdTgwRkRcdTZFOTBcdTUxNkNcdTc1MjhcdTRFOEJcdTRFMUEnLFxuICAgICAgICAgIGdvdmVybm1lbnQ6ICdcdTY1M0ZcdTVFOUMnLCBub25wcm9maXQ6ICdcdTk3NUVcdTg0MjVcdTUyMjknLCBvdGhlcjogJ1x1NTE3Nlx1NEVENicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3MkI2XHU2MDAxJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIC8vIFx1NURGMlx1Nzg2RVx1OEJBNCAvIFx1NjcyQVx1OTAxQVx1OEZDNyBcdTY2MkZcdTU0MENcdTRFMDBcdTRFMkFcdTUyQThcdTRGNUMoXHU3RUJGXHU3RDIyXHU3ODZFXHU4QkE0KVx1NzY4NFx1NkI2M1x1NTNDRFx1NEUyNFx1OTc2MjtcdTUzOUZcdTUxNDhcdTc2ODRcbiAgICAgICAgICAvLyBcdTVERjJcdTc4NkVcdThCQTQgLyBcdTRFMERcdTU0MDhcdTY4M0MgXHU1MUZBXHU4MUVBXHU0RTI0XHU1OTU3XHU4QkY0XHU2Q0Q1LFx1NTcyOFx1NzJCNlx1NjAwMVx1Njc2MVx1NEUwQVx1NUU3Nlx1NjM5Mlx1NjVGNlx1OEJGQlx1OEQ3N1x1Njc2NVx1NEUwRFx1NjIxMFx1NUJGOVx1MzAwMlxuICAgICAgICAgIG5ldzogJ1x1NjVCMFx1NUVGQScsIGNvbnRhY3RlZDogJ1x1NURGMlx1ODA1NFx1N0NGQicsIHF1YWxpZmllZDogJ1x1NURGMlx1Nzg2RVx1OEJBNCcsXG4gICAgICAgICAgdW5xdWFsaWZpZWQ6ICdcdTY3MkFcdTkwMUFcdThGQzcnLCBjb252ZXJ0ZWQ6ICdcdTVERjJcdThGNkNcdTUzMTYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxlYWRfc291cmNlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3RUJGXHU3RDIyXHU2NzY1XHU2RTkwJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHdlYjogJ1x1N0Y1MVx1N0FEOScsIHJlZmVycmFsOiAnXHU2M0E4XHU4MzUwJywgZXZlbnQ6ICdcdTZEM0JcdTUyQTggLyBcdTVDNTVcdTRGMUEnLFxuICAgICAgICAgIHdlYmluYXI6ICdcdTdFQkZcdTRFMEFcdTc4MTRcdThCQThcdTRGMUEnLCBwYXJ0bmVyOiAnXHU1NDA4XHU0RjVDXHU0RjE5XHU0RjM0JywgYWR2ZXJ0aXNlbWVudDogJ1x1NUU3Rlx1NTQ0QScsXG4gICAgICAgICAgcGFpZF9zZWFyY2g6ICdcdTRFRDhcdThEMzlcdTY0MUNcdTdEMjInLCBzb2NpYWw6ICdcdTc5M0VcdTRFQTRcdTVBOTJcdTRGNTMnLCBjb250ZW50OiAnXHU1MTg1XHU1QkI5IC8gXHU1MzVBXHU1QkEyJyxcbiAgICAgICAgICBjb2xkX2NhbGw6ICdcdTk2NENcdTc1MUZcdTYyRENcdThCQkYnLCBlbWFpbF9jYW1wYWlnbjogJ1x1OTBBRVx1NEVGNlx1ODQyNVx1OTUwMCcsIG90aGVyOiAnXHU1MTc2XHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1OEQxRlx1OEQyM1x1NEVCQScgfSxcbiAgICAgIGlzX2NvbnZlcnRlZDogeyBsYWJlbDogJ1x1NURGMlx1OEY2Q1x1NTMxNicgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU2M0NGXHU4RkYwJyB9LFxuICAgICAgbW9iaWxlOiB7IGxhYmVsOiAnXHU2MjRCXHU2NzNBJyB9LFxuICAgICAgd2Vic2l0ZTogeyBsYWJlbDogJ1x1N0Y1MVx1N0FEOScgfSxcbiAgICAgIHJhdGluZzogeyBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1OEJDNFx1NTIwNicsIGhlbHA6ICdcdTdFQkZcdTdEMjJcdThEMjhcdTkxQ0ZcdThCQzRcdTUyMDZcdUZGMDgxLTUgXHU2NjFGXHVGRjA5JyB9LFxuICAgICAgY29udmVydGVkX2FjY291bnQ6IHsgbGFiZWw6ICdcdThGNkNcdTUzMTZcdTVCQTJcdTYyMzcnIH0sXG4gICAgICBjb252ZXJ0ZWRfY29udGFjdDogeyBsYWJlbDogJ1x1OEY2Q1x1NTMxNlx1ODA1NFx1N0NGQlx1NEVCQScgfSxcbiAgICAgIGNvbnZlcnRlZF9vcHBvcnR1bml0eTogeyBsYWJlbDogJ1x1OEY2Q1x1NTMxNlx1NTU0Nlx1NjczQScgfSxcbiAgICAgIGNvbnZlcnRlZF9kYXRlOiB7IGxhYmVsOiAnXHU4RjZDXHU1MzE2XHU2NUU1XHU2NzFGJyB9LFxuICAgICAgYWRkcmVzczogeyBsYWJlbDogJ1x1NTczMFx1NTc0MCcgfSxcbiAgICAgIGFubnVhbF9yZXZlbnVlOiB7IGxhYmVsOiAnXHU1RTc0XHU4NDI1XHU2NTM2JyB9LFxuICAgICAgbnVtYmVyX29mX2VtcGxveWVlczogeyBsYWJlbDogJ1x1NTQ1OFx1NURFNVx1NEVCQVx1NjU3MCcgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHU1OTA3XHU2Q0U4JywgaGVscDogJ1x1NjcyQ1x1N0VCRlx1N0QyMlx1NzY4NFx1NURFNVx1NEY1Q1x1NTkwN1x1NkNFOFx1MjAxNFx1MjAxNFx1NjUyRlx1NjMwMVx1NjgzQ1x1NUYwRlx1NjM5Mlx1NzI0OFx1MzAwMicgfSxcbiAgICAgIGRvX25vdF9jYWxsOiB7IGxhYmVsOiAnXHU3OTgxXHU2QjYyXHU4MUY0XHU3NTM1JyB9LFxuICAgICAgZW1haWxfb3B0X291dDogeyBsYWJlbDogJ1x1NjJEMlx1NjUzNlx1OTBBRVx1NEVGNicgfSxcbiAgICAgIGRpc3F1YWxpZmljYXRpb25fcmVhc29uOiB7XG4gICAgICAgIC8vIFx1NzJCNlx1NjAwMVx1OTFDQ1x1NzY4NCB1bnF1YWxpZmllZCBcdThCRDFcdTRGNUNcdTMwMENcdTY3MkFcdTkwMUFcdThGQzdcdTMwMEQsXHU2MjQwXHU0RUU1XHU4RkQ5XHU5MUNDXHU4RERGXHU3NzQwXHU1M0VCXHUzMDBDXHU2NzJBXHU5MDFBXHU4RkM3XHU1MzlGXHU1NkUwXHUzMDBEXG4gICAgICAgIC8vIFx1ODAwQ1x1NEUwRFx1NjYyRlx1MzAwQ1x1NTNENlx1NkQ4OFx1OEQ0NFx1NjgzQ1x1NTM5Rlx1NTZFMFx1MzAwRFx1MjAxNFx1MjAxNCBcdTRFMjRcdTRFMkFcdTVCNTdcdTZCQjVcdTU3MjhcdTU0MENcdTRFMDBcdTVGMjBcdTg4NjhcdTUzNTVcdTRFMEFcdTRFMEJcdTc2RjhcdTkwQkIsXHU3NTI4XHU4QkNEXHU1RkM1XHU5ODdCXHU2MjEwXHU1QkY5XHUzMDAyXG4gICAgICAgIGxhYmVsOiAnXHU2NzJBXHU5MDFBXHU4RkM3XHU1MzlGXHU1NkUwJyxcbiAgICAgICAgaGVscDogJ1x1NzJCNlx1NjAwMVx1NEUzQVx1MzAwQ1x1NjcyQVx1OTAxQVx1OEZDN1x1MzAwRFx1NjVGNlx1NUZDNVx1NTg2QicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBub3RfYV9maXQ6ICdcdTk3MDBcdTZDNDJcdTRFMERcdTUzMzlcdTkxNEQnLCBub19idWRnZXQ6ICdcdTk4ODRcdTdCOTdcdTRFMERcdThEQjMnLCB3cm9uZ19wZXJzb25hOiAnXHU4MDU0XHU3Q0ZCXHU0RUJBXHU4OUQyXHU4MjcyXHU0RTBEXHU3QjI2JyxcbiAgICAgICAgICB1bnJlYWNoYWJsZTogJ1x1NjVFMFx1NkNENVx1ODA1NFx1N0NGQicsIGR1cGxpY2F0ZTogJ1x1OTFDRFx1NTkwRFx1N0VCRlx1N0QyMicsIGNvbXBldGl0b3I6ICdcdTkwMDlcdTYyRTlcdTRFODZcdTdBREVcdTRFODlcdTVCRjlcdTYyNEInLFxuICAgICAgICAgIG90aGVyOiAnXHU1MTc2XHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBkdXBsaWNhdGVfb2ZfdHlwZToge1xuICAgICAgICBoZWxwOiAnXHU0RkREXHU3NTU5XHU0RTBCXHU2NzY1XHU3Njg0XHU5MEEzXHU2NzYxXHU4QkIwXHU1RjU1XHU2MjQwXHU1QzVFXHU3Njg0XHU1QkY5XHU4QzYxXHU3QzdCXHU1NzhCXHUzMDAyJyxcbiAgICAgICAgbGFiZWw6ICdcdTkxQ0RcdTU5MERcdTRFOEUnLFxuICAgICAgICAvLyBgZXJhc2VkYCBcdTY2MkZcdTU4OTNcdTc4OTFcdTUwM0NcdUZGMENcdTRFMERcdTY2MkZcdTUzRUZcdTkwMDlcdTk4NzlcdUZGMUFcdTg4NjhcdTUzNTVcdTRFMERcdTYzRDBcdTRGOUJcdTVCODNcdUZGMDhcdTg5QzFcbiAgICAgICAgLy8gYHNyYy9zYWxlcy92aWV3cy9sZWFkLnZpZXcudHNgXHVGRjA5XHVGRjBDXHU0RjQ2XHU1RTc4XHU1QjU4XHU4QkIwXHU1RjU1XHU4OEFCXHU1MjIwXHU5NjY0XHU1NDBFXHU3RUJGXHU3RDIyXHU0RjFBXHU1RTI2XHU3NzQwXHU1QjgzXHVGRjBDXG4gICAgICAgIC8vIFx1NjI0MFx1NEVFNVx1NTFFMVx1NjYyRlx1OEJGQlx1NTNENlx1OEJCMFx1NUY1NVx1NzY4NFx1NTczMFx1NjVCOVx1OTBGRFx1OTcwMFx1ODk4MVx1NjgwN1x1N0I3RVx1RkYwQ1x1NTQyNlx1NTIxOVx1NEYxQVx1NjYzRVx1NzkzQVx1NTM5Rlx1NTlDQlx1NTAzQyBgZXJhc2VkYFx1MzAwMlxuICAgICAgICBvcHRpb25zOiB7IGNybV9sZWFkOiAnXHU3RUJGXHU3RDIyJywgY3JtX2NvbnRhY3Q6ICdcdTgwNTRcdTdDRkJcdTRFQkEnLCBlcmFzZWQ6ICdcdThCQjBcdTVGNTVcdTVERjJcdTUyMjBcdTk2NjQnIH0sXG4gICAgICB9LFxuICAgICAgZHVwbGljYXRlX29mX2xlYWQ6IHsgbGFiZWw6ICdcdTkxQ0RcdTU5MERcdTc2ODRcdTdFQkZcdTdEMjInIH0sXG4gICAgICBkdXBsaWNhdGVfb2ZfY29udGFjdDogeyBsYWJlbDogJ1x1OTFDRFx1NTkwRFx1NzY4NFx1ODA1NFx1N0NGQlx1NEVCQScgfSxcbiAgICAgIGR1cGxpY2F0ZV9zdGF0dXM6IHtcbiAgICAgICAgaGVscDogJ1x1NzU5MVx1NEYzQyA9IFx1NUY1NVx1NTE2NVx1NjVGNlx1ODFFQVx1NTJBOFx1NjgwN1x1OEJCMFx1RkYxQlx1NURGMlx1Nzg2RVx1OEJBNCA9IFx1NEVCQVx1NURFNVx1NjgzOFx1NUI5RVx1OEZDN1x1NTMzOVx1OTE0RFx1MzAwMicsXG4gICAgICAgIC8vIFx1NzU5MVx1NEYzQyA9IFx1NUY1NVx1NTE2NVx1NjVGNlx1ODFFQVx1NTJBOFx1NjgwN1x1OEJCMDtcdTVERjJcdTc4NkVcdThCQTQgPSBcdTRFQkFcdTVERTVcdTY4MzhcdTVCRjlcdTU0MEVcdTc2ODRcdTUyMjRcdTVCOUFcdTMwMDJcdTRFMjRcdTgwMDVcdTY2MkZcdTU0MENcdTRFMDBcbiAgICAgICAgLy8gXHU1MjI0XHU2NUFEXHU3Njg0XHU0RTI0XHU0RTJBXHU5NjM2XHU2QkI1LFx1NjI0MFx1NEVFNVx1NTE3MVx1NzUyOFx1NEUwMFx1NEUyQVx1NUI1N1x1NkJCNVx1ODAwQ1x1NEUwRFx1NjYyRlx1NTQwNFx1NTM2MFx1NEUwMFx1NTk1N1x1OTRGRVx1NjNBNVx1NUI1N1x1NkJCNVx1MzAwMlxuICAgICAgICBsYWJlbDogJ1x1OTFDRFx1NTkwRFx1NzJCNlx1NjAwMScsXG4gICAgICAgIG9wdGlvbnM6IHsgc3VzcGVjdGVkOiAnXHU3NTkxXHU0RjNDXHU5MUNEXHU1OTBEJywgY29uZmlybWVkOiAnXHU1REYyXHU3ODZFXHU4QkE0XHU5MUNEXHU1OTBEJyB9LFxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTY2M0VcdTc5M0FcdTU0MERcdTc5RjAnIH0sXG4gICAgICBjb21wYW55X25vcm1hbGl6ZWQ6IHsgbGFiZWw6ICdcdTUxNkNcdTUzRjhcdTU0MERcdTc5RjBcdUZGMDhcdTg5QzRcdTgzMDNcdTUzMTZcdUZGMDknLCBoZWxwOiAnXHU3RUJGXHU3RDIyXHU4RjZDXHU1MzE2XHU3Njg0XHU1MzM5XHU5MTREXHU5NTJFXHVGRjFBXHU1MTZDXHU1M0Y4XHU1NDBEXHU3OUYwXHU4RjZDXHU1QzBGXHU1MTk5XHUzMDAxXHU1M0JCXHU5NjY0XHU5OTk2XHU1QzNFXHU3QTdBXHU2ODNDXHUzMDAxXHU1MTg1XHU5MEU4XHU4RkRFXHU3RUVEXHU3QTdBXHU3NjdEXHU1NDA4XHU1RTc2XHU0RTNBXHU0RTAwXHU0RTJBXHU3QTdBXHU2ODNDXHUzMDAyXHU3NTMxIGxlYWRfZHVwbGljYXRlX2NoZWNrIFx1OTRBOVx1NUI1MFx1N0VGNFx1NjJBNFx1MjAxNFx1MjAxNFx1OEJGN1x1NTJGRlx1NzZGNFx1NjNBNVx1N0YxNlx1OEY5MVx1MzAwMicgfSxcbiAgICAgIG5leHRfZm9sbG93dXBfZGF0ZTogeyBsYWJlbDogJ1x1NEUwQlx1NkIyMVx1OERERlx1OEZEQlx1NjVFNVx1NjcxRicgfSxcbiAgICAgIGxhc3RfY29udGFjdGVkX2RhdGU6IHsgbGFiZWw6ICdcdTY3MDBcdThGRDFcdTgwNTRcdTdDRkJcdTY1RjZcdTk1RjQnIH0sXG4gICAgICBuZWVkX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTk3MDBcdTZDNDJcdTdDN0JcdTU3OEInLFxuICAgICAgICBoZWxwOiAnXHU1QkEyXHU2MjM3XHU2MEYzXHU4OTgxXHU0RUMwXHU0RTQ4XHUzMDAyXHU3RUJGXHU3RDIyXHU1MjA2XHU2RDNFXHUzMDAxXHU0RjE4XHU1MTQ4XHU3RUE3XHU2MzkyXHU1RThGXHU1NDhDXHU5NzAwXHU2QzQyXHU1MjA2XHU2NzkwXHU5MEZEXHU4QkZCXHU4RkQ5XHU0RTJBXHU1QjU3XHU2QkI1XHUzMDAyJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ld19pbXBsZW1lbnRhdGlvbjogJ1x1NjVCMFx1NUVGQVx1NUI5RVx1NjVCRCcsIGV4cGFuc2lvbjogJ1x1NjI2OVx1NUJCOVx1NTg5RVx1OEQyRCcsXG4gICAgICAgICAgcmVwbGFjZW1lbnQ6ICdcdTY2RkZcdTYzNjJcdThGQzFcdTc5RkInLCByZW5ld2FsOiAnXHU3RUVEXHU3RUE2JywgY29uc3VsdGluZzogJ1x1NTRBOFx1OEJFMlx1NjcwRFx1NTJBMScsXG4gICAgICAgICAgc3VwcG9ydDogJ1x1OEZEMFx1N0VGNFx1NjUyRlx1NjMwMScsIG90aGVyOiAnXHU1MTc2XHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlc3RpbWF0ZWRfYW1vdW50OiB7XG4gICAgICAgIGxhYmVsOiAnXHU5ODg0XHU4QkExXHU5MUQxXHU5ODlEJyxcbiAgICAgICAgaGVscDogJ1x1OEQ0NFx1NjgzQ1x1NTIyNFx1NUI5QVx1NEU0Qlx1NTI0RFx1NUJGOVx1OEJFNVx1OTcwMFx1NkM0Mlx1OTFEMVx1OTg5RFx1NzY4NFx1NEYzMFx1N0I5N1x1MzAwMlx1OEY2Q1x1NTMxNlx1NjVGNlx1NzUyOFx1NEU4RVx1OTg4NFx1NTg2Qlx1NTU0Nlx1NjczQVx1OTFEMVx1OTg5RFx1MzAwMicsXG4gICAgICB9LFxuICAgICAgY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdThGNkNcdTUzMTZcdTVCQTFcdTYyNzknLFxuICAgICAgICBoZWxwOiAnXHU4QkU1XHU3RUJGXHU3RDIyXHU2NjJGXHU1NDI2XHU1REYyXHU4M0I3XHU1MUM2XHU4RjZDXHU1MzE2XHUzMDAyXHUzMDBDXHU2NUUwXHU5NzAwXHU1QkExXHU2Mjc5XHUzMDBEXHU4ODY4XHU3OTNBXHU0RTBEXHU4RDcwXHU1QkExXHU2Mjc5XHU2RDQxXHU3QTBCXHUyMDE0XHUyMDE0XHU4RkQ5XHU2NjJGXHU0RUE3XHU1NEMxXHU3Njg0XHU1MUZBXHU1MzgyXHU5RUQ4XHU4QkE0XHU1MDNDXHUzMDAyJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5vdF9yZXF1aXJlZDogJ1x1NjVFMFx1OTcwMFx1NUJBMVx1NjI3OScsIHBlbmRpbmc6ICdcdTVGODVcdTVCQTFcdTYyNzknLFxuICAgICAgICAgIGFwcHJvdmVkOiAnXHU1QkExXHU2Mjc5XHU5MDFBXHU4RkM3JywgcmVqZWN0ZWQ6ICdcdTVCQTFcdTYyNzlcdTlBNzNcdTU2REUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2xlYWRzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1MTY4XHU5MEU4XHU3RUJGXHU3RDIyJyxcbiAgICAgICAgZW1wdHlTdGF0ZTogeyB0aXRsZTogJ1x1OEZEOFx1NkNBMVx1NjcwOVx1N0VCRlx1N0QyMicsIG1lc3NhZ2U6ICdcdTUyMUJcdTVFRkFcdTdCMkNcdTRFMDBcdTY3NjFcdTdFQkZcdTdEMjJcdUZGMENcdTRFQ0VcdThGRDlcdTkxQ0NcdTVGMDBcdTU5Q0InIH0sXG4gICAgICB9LFxuICAgICAga2FuYmFuX2J5X3N0YXR1czogeyBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1NkQ0MVx1NkMzNFx1N0VCRicgfSxcbiAgICAgIGNhbGVuZGFyX2J5X2NyZWF0ZWQ6IHsgbGFiZWw6ICdcdTdFQkZcdTdEMjJcdTY1RTVcdTUzODYnIH0sXG4gICAgICBnYWxsZXJ5X3ZpZXc6IHsgbGFiZWw6ICdcdTdFQkZcdTdEMjJcdTUzNjFcdTcyNDcnIH0sXG4gICAgICBteV9sZWFkczogeyBsYWJlbDogJ1x1NjIxMVx1NzY4NFx1N0VCRlx1N0QyMicgfSxcbiAgICAgIGhpZ2hfcHJpb3JpdHk6IHsgbGFiZWw6ICdcdTlBRDhcdTRGMThcdTUxNDhcdTdFQTcnIH0sXG4gICAgICBob3RfbGVhZHM6IHsgbGFiZWw6ICdcdUQ4M0RcdUREMjUgXHU5QUQ4XHU3MEVEXHU1RUE2XHU3RUJGXHU3RDIyJyB9LFxuICAgICAgc3VzcGVjdGVkX2R1cGxpY2F0ZXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTc1OTFcdTRGM0NcdTkxQ0RcdTU5MERcdTdFQkZcdTdEMjInLFxuICAgICAgICBlbXB0eVN0YXRlOiB7IHRpdGxlOiAnXHU2Q0ExXHU2NzA5XHU3NTkxXHU0RjNDXHU5MUNEXHU1OTBEJywgbWVzc2FnZTogJ1x1NjVFMFx1OTcwMFx1NTkwRFx1NjgzOFx1MjAxNFx1MjAxNFx1NkJDRlx1NEUyQVx1OTFDRFx1NTkwRFx1NUY1NVx1NTE2NVx1NzY4NFx1OTBBRVx1N0JCMVx1OTBGRFx1NURGMlx1NjhDMFx1NjdFNVx1OEZDN1x1MzAwMicgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIC8vIE9iamVjdC1sZXZlbCBzZWN0aW9uIGtleXMgKGxlYWQub2JqZWN0LnRzKSwgdXNlZCBieSByZWNvcmQgZm9ybXMgYW5kXG4gICAgICAvLyBieSB0aGUgZGV0YWlsIHBhZ2UsIHdob3NlIHNlY3Rpb25zIHJlZmVyZW5jZSB0aGVzZSBncm91cHMgKCM4MDYpXG4gICAgICBhZGRyZXNzOiB7IGxhYmVsOiAnXHU1NzMwXHU1NzQwJyB9LFxuICAgICAgaWRlbnRpdHk6IHsgbGFiZWw6ICdcdThFQUJcdTRFRkRcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBjb21wYW55X2luZm86IHsgbGFiZWw6ICdcdTUxNkNcdTUzRjhcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdcdTgwNTRcdTdDRkJcdTY1QjlcdTVGMEYnIH0sXG4gICAgICBxdWFsaWZpY2F0aW9uOiB7IGxhYmVsOiAnXHU4RDQ0XHU2ODNDXHU4QkM0XHU0RjMwJyB9LFxuICAgICAgYXNzaWdubWVudDogeyBsYWJlbDogJ1x1NTIwNlx1OTE0RCcgfSxcbiAgICAgIGFkZGl0aW9uYWw6IHsgbGFiZWw6ICdcdTk2NDRcdTUyQTBcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBwcmVmZXJlbmNlczogeyBsYWJlbDogJ1x1NkM5Rlx1OTAxQVx1NTA0Rlx1NTk3RCcgfSxcbiAgICAgIGNvbnZlcnNpb246IHsgbGFiZWw6ICdcdThGNkNcdTUzMTYnIH0sXG4gICAgICBkdXBsaWNhdGVzOiB7IGxhYmVsOiAnXHU5MUNEXHU1OTBEXHU3RUJGXHU3RDIyXHU3QkExXHU3NDA2JyB9LFxuICAgICAgLy8gbGVhZC52aWV3LnRzIFx1ODg2OFx1NTM1NVx1NTMzQVx1NTc1N1x1NTQwRFx1NzlGMCAoIzExMDApIFx1MjAxNFx1MjAxNCBcdTlFRDhcdThCQTRcdTg4NjhcdTUzNTVcdTRFMEVcdTZCQ0ZcdTRFMDBcdTRFMkFcdTUxNzdcdTU0MEQgZm9ybVZpZXdcbiAgICAgIC8vIFx1NzY4NFx1NTMzQVx1NTc1N1x1NTQwRFx1NUI1N1x1OTBGRFx1NEY0Rlx1NTcyOFx1OEZEOVx1OTFDQ1x1RkYxQVx1OTBBM1x1OEZCOVx1NjVCMFx1NTg5RVx1NEUwMFx1NEUyQVx1ODg2OFx1NTM1NVx1RkYwQ1x1OEZEOVx1OTFDQ1x1NUMzMVx1ODg2NVx1NEUwQVx1NUI4M1x1NzY4NFx1NTMzQVx1NTc1N1x1NTQwRFx1MzAwMlxuICAgICAgY29udGFjdF9pbmZvcm1hdGlvbjogeyBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEZFMVx1NjA2RicgfSxcbiAgICAgIGxlYWRfY2xhc3NpZmljYXRpb246IHsgbGFiZWw6ICdcdTdFQkZcdTdEMjJcdTUyMDZcdTdDN0InIH0sXG4gICAgICBjb21wYW55X2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnXHU1MTZDXHU1M0Y4XHU0RkUxXHU2MDZGJyB9LFxuICAgICAgYWRkaXRpb25hbF9pbmZvcm1hdGlvbjogeyBsYWJlbDogJ1x1OTY0NFx1NTJBMFx1NEZFMVx1NjA2RicgfSxcbiAgICAgIHByaXZhY3k6IHsgbGFiZWw6ICdcdTk2OTBcdTc5QzEnIH0sXG4gICAgICBnZW5lcmFsOiB7IGxhYmVsOiAnXHU1RTM4XHU4OUM0XHU0RkUxXHU2MDZGJyB9LFxuICAgICAgZGV0YWlsczogeyBsYWJlbDogJ1x1OEJFNlx1NjBDNScgfSxcbiAgICAgIHN0ZXBfMV9jb250YWN0X2RldGFpbHM6IHsgbGFiZWw6ICdcdTdCMkNcdTRFMDBcdTZCNjVcdUZGMUFcdTgwNTRcdTdDRkJcdTY1QjlcdTVGMEYnIH0sXG4gICAgICBzdGVwXzJfY29tcGFueV9pbmZvcm1hdGlvbjogeyBsYWJlbDogJ1x1N0IyQ1x1NEU4Q1x1NkI2NVx1RkYxQVx1NTE2Q1x1NTNGOFx1NEZFMVx1NjA2RicgfSxcbiAgICAgIHN0ZXBfM19xdWFsaWZpY2F0aW9uOiB7IGxhYmVsOiAnXHU3QjJDXHU0RTA5XHU2QjY1XHVGRjFBXHU4RDQ0XHU4RDI4XHU1QkExXHU2ODM4JyB9LFxuICAgICAgc3RlcF80X3Jldmlld19hbmRfY29udmVydDogeyBsYWJlbDogJ1x1N0IyQ1x1NTZEQlx1NkI2NVx1RkYxQVx1NUJBMVx1NjgzOFx1NUU3Nlx1OEY2Q1x1NTMxNicgfSxcbiAgICAgIHByaW1hcnlfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdcdTRFM0JcdTg5ODFcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBleHRlbmRlZF9kZXRhaWxzOiB7IGxhYmVsOiAnXHU2MjY5XHU1QzU1XHU0RkUxXHU2MDZGJyB9LFxuICAgICAgcXVpY2tfZWRpdDogeyBsYWJlbDogJ1x1NUZFQlx1OTAxRlx1N0YxNlx1OEY5MScgfSxcbiAgICAgIHVwZGF0ZV9sZWFkX3N0YXR1czogeyBsYWJlbDogJ1x1NjZGNFx1NjVCMFx1N0VCRlx1N0QyMlx1NzJCNlx1NjAwMScgfSxcbiAgICAgIHRlbGxfdXNfYWJvdXRfeW91cnNlbGY6IHsgbGFiZWw6ICdcdThCRjdcdTRFQ0JcdTdFQ0RcdTRFMDBcdTRFMEJcdTYwQThcdTgxRUFcdTVERjEnIH0sXG4gICAgICBhYm91dF95b3VyX2NvbXBhbnk6IHsgbGFiZWw6ICdcdTYwQThcdTc2ODRcdTUxNkNcdTUzRjhcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBob3dfY2FuX3dlX2hlbHA6IHsgbGFiZWw6ICdcdTYyMTFcdTRFRUNcdTgwRkRcdTVFMkVcdTYwQThcdTRFQzBcdTRFNDhcdUZGMUYnIH0sXG4gICAgICBsZWFkX2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnXHU3RUJGXHU3RDIyXHU0RkUxXHU2MDZGJyB9LFxuICAgICAgYWRkcmVzc19pbmZvcm1hdGlvbjogeyBsYWJlbDogJ1x1NTczMFx1NTc0MFx1NEZFMVx1NjA2RicgfSxcbiAgICAgIHByaXZhY3lfcHJlZmVyZW5jZXM6IHsgbGFiZWw6ICdcdTk2OTBcdTc5QzFcdTUwNEZcdTU5N0QnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgY29udmVydF9sZWFkOiB7XG4gICAgICAgIGxhYmVsOiAnXHU4RjZDXHU1MzE2XHU3RUJGXHU3RDIyJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTdFQkZcdTdEMjJcdThGNkNcdTUzMTZcdTYyMTBcdTUyOUZcdUZGMDEnLFxuICAgICAgfSxcbiAgICAgIGNyZWF0ZV9jYW1wYWlnbjoge1xuICAgICAgICBsYWJlbDogJ1x1NTJBMFx1NTE2NVx1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCcsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1REYyXHU1QzA2XHU3RUJGXHU3RDIyXHU1MkEwXHU1MTY1XHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4XHVGRjAxJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4JyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNjaGVkdWxlX2ZvbGxvd3VwOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1Qjg5XHU2MzkyXHU4RERGXHU4RkRCJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdThEREZcdThGREJcdTRFRkJcdTUyQTFcdTVERjJcdTUyMUJcdTVFRkFcdTMwMDInLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fb3Bwb3J0dW5pdHk6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGFtb3VudF9wb3NpdGl2ZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU5MUQxXHU5ODlEXHU1RkM1XHU5ODdCXHU1OTI3XHU0RThFXHU5NkY2JyxcbiAgICAgIH0sXG4gICAgICBjbG9zZV9kYXRlX2Z1dHVyZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU5NjY0XHU5NzVFXHU1NTQ2XHU2NzNBXHU1REYyXHU3RUQzXHU2NzVGXHVGRjBDXHU1NDI2XHU1MjE5XHU5ODg0XHU4QkExXHU2MjEwXHU0RUE0XHU2NUU1XHU0RTBEXHU1RTk0XHU2NUU5XHU0RThFXHU0RUNBXHU1OTI5JyxcbiAgICAgIH0sXG4gICAgICBvcHBvcnR1bml0eV9zdGFnZV9wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU2NUUwXHU2NTQ4XHU3Njg0XHU1NTQ2XHU2NzNBXHU5NjM2XHU2QkI1XHU2RDQxXHU4RjZDJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NTU0Nlx1NjczQScsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTU1NDZcdTY3M0EnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU5NTAwXHU1NTJFXHU2RDQxXHU3QTBCXHU0RTJEXHU3Njg0XHU1NTQ2XHU2NzNBXHU0RTBFXHU0RUE0XHU2NjEzJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdcdTU1NDZcdTY3M0FcdTU0MERcdTc5RjAnIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ1x1NjI0MFx1NUM1RVx1NUJBMlx1NjIzNycgfSxcbiAgICAgIHByaW1hcnlfY29udGFjdDogeyBsYWJlbDogJ1x1NEUzQlx1ODk4MVx1ODA1NFx1N0NGQlx1NEVCQScgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnXHU1NTQ2XHU2NzNBXHU4RDFGXHU4RDIzXHU0RUJBJyB9LFxuICAgICAgYW1vdW50OiB7IGxhYmVsOiAnXHU5MUQxXHU5ODlEJyB9LFxuICAgICAgZXhwZWN0ZWRfcmV2ZW51ZTogeyBsYWJlbDogJ1x1OTg4NFx1NjcxRlx1NjUzNlx1NTE2NScgfSxcbiAgICAgIHN0YWdlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU5NjM2XHU2QkI1JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHByb3NwZWN0aW5nOiAnXHU1QkZCXHU2MjdFXHU1QkEyXHU2MjM3JywgcXVhbGlmaWNhdGlvbjogJ1x1OEQ0NFx1NjgzQ1x1NUJBMVx1NjdFNScsXG4gICAgICAgICAgbmVlZHNfYW5hbHlzaXM6ICdcdTk3MDBcdTZDNDJcdTUyMDZcdTY3OTAnLCBwcm9wb3NhbDogJ1x1NjNEMFx1Njg0OCcsXG4gICAgICAgICAgbmVnb3RpYXRpb246ICdcdThDMDhcdTUyMjQnLCBjbG9zZWRfd29uOiAnXHU2MjEwXHU0RUE0JywgY2xvc2VkX2xvc3Q6ICdcdTU5MzFcdThEMjUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHByb2JhYmlsaXR5OiB7IGxhYmVsOiAnXHU2MjEwXHU0RUE0XHU2OTgyXHU3Mzg3ICglKScgfSxcbiAgICAgIGNsb3NlX2RhdGU6IHsgbGFiZWw6ICdcdTk4ODRcdThCQTFcdTYyMTBcdTRFQTRcdTY1RTVcdTY3MUYnIH0sXG4gICAgICB0eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3QzdCXHU1NzhCJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ld19idXNpbmVzczogJ1x1NjVCMFx1NEUxQVx1NTJBMScsXG4gICAgICAgICAgZXhpc3RpbmdfdXBncmFkZTogJ1x1ODAwMVx1NUJBMlx1NjIzN1x1NTM0N1x1N0VBNycsXG4gICAgICAgICAgZXhpc3RpbmdfcmVuZXdhbDogJ1x1ODAwMVx1NUJBMlx1NjIzN1x1N0VFRFx1N0VBNicsXG4gICAgICAgICAgZXhpc3RpbmdfZXhwYW5zaW9uOiAnXHU4MDAxXHU1QkEyXHU2MjM3XHU2MkQzXHU1QzU1JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ1x1OTg4NFx1NkQ0Qlx1N0M3Qlx1NTIyQicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwaXBlbGluZTogJ1x1N0JBMVx1OTA1MycsIGJlc3RfY2FzZTogJ1x1NjcwMFx1NEY3M1x1NjBDNVx1NTFCNScsXG4gICAgICAgICAgY29tbWl0OiAnXHU2MjdGXHU4QkZBJywgb21pdHRlZDogJ1x1NURGMlx1NjM5Mlx1OTY2NCcsIGNsb3NlZDogJ1x1NURGMlx1NTE3M1x1OTVFRCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdTYzQ0ZcdThGRjAnIH0sXG4gICAgICBuZXh0X3N0ZXA6IHsgbGFiZWw6ICdcdTRFMEJcdTRFMDBcdTZCNjUnIH0sXG4gICAgICBsZWFkX3NvdXJjZToge1xuICAgICAgICBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1Njc2NVx1NkU5MCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB3ZWI6ICdcdTdGNTFcdTdBRDknLCByZWZlcnJhbDogJ1x1NjNBOFx1ODM1MCcsIGV2ZW50OiAnXHU2RDNCXHU1MkE4IC8gXHU1QzU1XHU0RjFBJyxcbiAgICAgICAgICB3ZWJpbmFyOiAnXHU3RUJGXHU0RTBBXHU3ODE0XHU4QkE4XHU0RjFBJywgcGFydG5lcjogJ1x1NTQwOFx1NEY1Q1x1NEYxOVx1NEYzNCcsIGFkdmVydGlzZW1lbnQ6ICdcdTVFN0ZcdTU0NEEnLFxuICAgICAgICAgIHBhaWRfc2VhcmNoOiAnXHU0RUQ4XHU4RDM5XHU2NDFDXHU3RDIyJywgc29jaWFsOiAnXHU3OTNFXHU0RUE0XHU1QTkyXHU0RjUzJywgY29udGVudDogJ1x1NTE4NVx1NUJCOSAvIFx1NTM1QVx1NUJBMicsXG4gICAgICAgICAgY29sZF9jYWxsOiAnXHU5NjRDXHU3NTFGXHU2MkRDXHU4QkJGJywgZW1haWxfY2FtcGFpZ246ICdcdTkwQUVcdTRFRjZcdTg0MjVcdTk1MDAnLCBvdGhlcjogJ1x1NTE3Nlx1NEVENicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4JywgaGVscDogJ1x1NUUyNlx1Njc2NVx1NkI2NFx1NTU0Nlx1NjczQVx1NzY4NFx1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCcgfSxcbiAgICAgIGRheXNfaW5fc3RhZ2U6IHsgbGFiZWw6ICdcdTVGNTNcdTUyNERcdTk2MzZcdTZCQjVcdTU5MjlcdTY1NzAnIH0sXG4gICAgICBzdGFnZV9lbnRyeV9kYXRlOiB7IGxhYmVsOiAnXHU4RkRCXHU1MTY1XHU1RjUzXHU1MjREXHU5NjM2XHU2QkI1XHU2NUU1XHU2NzFGJywgaGVscDogJ1x1NjcyQ1x1NTU0Nlx1NjczQVx1OEZEQlx1NTE2NVx1NUY1M1x1NTI0RFx1OTYzNlx1NkJCNVx1NzY4NFx1NjVFNVx1NjcxRlx1MzAwMicgfSxcbiAgICAgIGlzX3ByaXZhdGU6IHsgbGFiZWw6ICdcdTc5QzFcdTVCQzYnIH0sXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTVCQTFcdTYyNzlcdTcyQjZcdTYwMDEnLFxuICAgICAgICBvcHRpb25zOiB7IG5vdF9yZXF1aXJlZDogJ1x1NjVFMFx1OTcwMFx1NUJBMVx1NjI3OScsIHBlbmRpbmc6ICdcdTVCQTFcdTYyNzlcdTRFMkQnLCBhcHByb3ZlZDogJ1x1NURGMlx1NjI3OVx1NTFDNicsIHJlamVjdGVkOiAnXHU1REYyXHU5QTczXHU1NkRFJyB9LFxuICAgICAgfSxcbiAgICAgIGFwcHJvdmVkX2RhdGU6IHsgbGFiZWw6ICdcdTYyNzlcdTUxQzZcdTY1RjZcdTk1RjQnIH0sXG4gICAgICB3aW5fcmVhc29uOiB7XG4gICAgICAgIGhlbHA6ICdcdThENjJcdTUzNTVcdTUzOUZcdTU2RTBcdTMwMDJcdTVDMDZcdTU1NDZcdTY3M0FcdTUxNzNcdTk1RURcdTRFM0FcIlx1NjIxMFx1NEVBNFwiXHU2NUY2XHU1RkM1XHU1ODZCXHUzMDAyJyxcbiAgICAgICAgbGFiZWw6ICdcdThENjJcdTUzNTVcdTUzOUZcdTU2RTAnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYmV0dGVyX3Byb2R1Y3Q6ICdcdTRFQTdcdTU0QzFcdTY2RjRcdTRGMTgnLCBiZXR0ZXJfcHJpY2U6ICdcdTRFRjdcdTY4M0NcdTY2RjRcdTRGMTgnLCByZWxhdGlvbnNoaXA6ICdcdTVCQTJcdTYyMzdcdTUxNzNcdTdDRkInLFxuICAgICAgICAgIGJldHRlcl9zdXBwb3J0OiAnXHU2NTJGXHU2MzAxXHU2NkY0XHU1OTdEJywgYmVzdF9maXQ6ICdcdTY3MDBcdTRGNzNcdTU5NTFcdTU0MDgnLFxuICAgICAgICAgIHF1b3RlX2FjY2VwdGVkOiAnXHU2MkE1XHU0RUY3XHU4OEFCXHU2M0E1XHU1M0Q3Jywgb3RoZXI6ICdcdTUxNzZcdTRFRDYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxvc3NfcmVhc29uOiB7XG4gICAgICAgIGhlbHA6ICdcdTRFMjJcdTUzNTVcdTUzOUZcdTU2RTBcdTMwMDJcdTVDMDZcdTU1NDZcdTY3M0FcdTUxNzNcdTk1RURcdTRFM0FcIlx1NTkzMVx1OEQyNVwiXHU2NUY2XHU1RkM1XHU1ODZCXHUzMDAyJyxcbiAgICAgICAgbGFiZWw6ICdcdTRFMjJcdTUzNTVcdTUzOUZcdTU2RTAnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcHJpY2U6ICdcdTRFRjdcdTY4M0NcdThGQzdcdTlBRDgnLCBjb21wZXRpdG9yOiAnXHU4RjkzXHU3RUQ5XHU3QURFXHU0RTg5XHU1QkY5XHU2MjRCJywgbm9fYnVkZ2V0OiAnXHU2NUUwXHU5ODg0XHU3Qjk3JyxcbiAgICAgICAgICBub19kZWNpc2lvbjogJ1x1NjcyQVx1NTFCM1x1N0I1NicsIHRpbWluZzogJ1x1NjVGNlx1NjczQVx1NEUwRFx1NTQwOFx1OTAwMicsIGZlYXR1cmVzOiAnXHU1MjlGXHU4MEZEXHU3RjNBXHU1OTMxJywgb3RoZXI6ICdcdTUxNzZcdTRFRDYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxvc3NfZGV0YWlsczogeyBsYWJlbDogJ1x1OEQ2Mi9cdTRFMjJcdTUzNTVcdThCRTZcdTYwQzUnLCBoZWxwOiAnXHU4RDYyXHU1MzU1XHU2MjE2XHU0RTIyXHU1MzU1XHU1MzlGXHU1NkUwXHU3Njg0XHU4ODY1XHU1MTQ1XHU4QkY0XHU2NjBFXHUzMDAyJyB9LFxuICAgICAgLy8gUkVRLTAwMDYgXHUyMDE0IFx1OEQ0NFx1NjgzQ1x1OEJDNFx1NEYzMFx1MzAwMVx1NUJBMlx1NjIzN1x1NEZBN1x1OTFDN1x1OEQyRFx1NjVFNVx1N0EwQlx1MzAwMVx1NTU0Nlx1NjczQVx1NTNEOVx1OEZGMFx1MzAwMVx1NEUxQVx1NTJBMVx1N0VCRlx1NEUwRVx1NzJCNlx1NjAwMVx1NTNEOFx1NjZGNFx1NUJBMVx1NjI3OVx1MzAwMlxuICAgICAgd2lsbF9iaWQ6IHsgbGFiZWw6ICdcdTY2MkZcdTU0MjZcdTYyOTVcdTY4MDcnLCBoZWxwOiAnXHU2MjExXHU2NUI5XHU2NjJGXHU1NDI2XHU2MjUzXHU3Qjk3XHU2Mjk1XHU2ODA3XHUzMDAyXHU3NTU5XHU3QTdBXHU4ODY4XHU3OTNBXHU1QzFBXHU2NzJBXHU1MUIzXHU1QjlBXHUzMDAyJyB9LFxuICAgICAgY29udHJvbGxhYmlsaXR5OiB7IGxhYmVsOiAnXHU1M0VGXHU2M0E3XHU2MDI3Jywgb3B0aW9uczogeyBoaWdoOiAnXHU5QUQ4JywgbWVkaXVtOiAnXHU0RTJEJywgbG93OiAnXHU0RjRFJyB9IH0sXG4gICAgICBwcmlvcml0eTogeyBsYWJlbDogJ1x1NEYxOFx1NTE0OFx1N0VBNycsIG9wdGlvbnM6IHsgaGlnaDogJ1x1OUFEOCcsIG1lZGl1bTogJ1x1NEUyRCcsIGxvdzogJ1x1NEY0RScgfSB9LFxuICAgICAgZGVhbF9sZXZlbDogeyBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1N0VBN1x1NTIyQicsIG9wdGlvbnM6IHsgc3RyYXRlZ2ljOiAnXHU2MjE4XHU3NTY1XHU3RUE3Jywga2V5OiAnXHU5MUNEXHU3MEI5Jywgc3RhbmRhcmQ6ICdcdTY2NkVcdTkwMUEnIH0gfSxcbiAgICAgIGlzX3N1YmNvbnRyYWN0ZWQ6IHsgbGFiZWw6ICdcdTZEODlcdTUzQ0FcdTUyMDZcdTUzMDUnIH0sXG4gICAgICBzdWJjb250cmFjdGluZ19ub3RlOiB7IGxhYmVsOiAnXHU1MjA2XHU1MzA1XHU4QkY0XHU2NjBFJyB9LFxuICAgICAgY3VzdG9tZXJfaW5pdGlhdGlvbl9kYXRlOiB7IGxhYmVsOiAnXHU1QkEyXHU2MjM3XHU3QUNCXHU5ODc5XHU2NUU1XHU2NzFGJyB9LFxuICAgICAgZXhwZWN0ZWRfdGVuZGVyX2RhdGU6IHsgbGFiZWw6ICdcdTk4ODRcdThCQTFcdTYyREJcdTY4MDdcdTY1RTVcdTY3MUYnIH0sXG4gICAgICBleHBlY3RlZF9zaWduaW5nX2RhdGU6IHsgbGFiZWw6ICdcdTk4ODRcdThCQTFcdTdCN0VcdTdFQTZcdTY1RTVcdTY3MUYnIH0sXG4gICAgICBleHBlY3RlZF90ZW5kZXJfYW1vdW50OiB7IGxhYmVsOiAnXHU5ODg0XHU4QkExXHU2MkRCXHU2ODA3XHU5MUQxXHU5ODlEJyB9LFxuICAgICAgZXhwZWN0ZWRfc2lnbmluZ19hbW91bnQ6IHsgbGFiZWw6ICdcdTk4ODRcdThCQTFcdTdCN0VcdTdFQTZcdTkxRDFcdTk4OUQnIH0sXG4gICAgICBidXNpbmVzc19saW5lOiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RTFBXHU1MkExXHU3RUJGJyxcbiAgICAgICAgb3B0aW9uczogeyBwcm9kdWN0OiAnXHU0RUE3XHU1NEMxJywgc2VydmljZXM6ICdcdTRFMTNcdTRFMUFcdTY3MERcdTUyQTEnLCBjb25zdWx0aW5nOiAnXHU1NEE4XHU4QkUyXHU2NzBEXHU1MkExJywgc3VwcG9ydDogJ1x1OEZEMFx1N0VGNFx1NjUyRlx1NjMwMScsIG90aGVyOiAnXHU1MTc2XHU0RUQ2JyB9LFxuICAgICAgfSxcbiAgICAgIGN1c3RvbWVyX2JhY2tncm91bmQ6IHsgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTdCODBcdTRFQ0InIH0sXG4gICAgICBwcm9qZWN0X2JhY2tncm91bmQ6IHsgbGFiZWw6ICdcdTk4NzlcdTc2RUVcdTgwQ0NcdTY2NkYnIH0sXG4gICAgICByaXNrX2FuYWx5c2lzOiB7IGxhYmVsOiAnXHU5OENFXHU5NjY5XHU1MjA2XHU2NzkwJyB9LFxuICAgICAgcGF5bWVudF90ZXJtczogeyBsYWJlbDogJ1x1NEVEOFx1NkIzRVx1Njc2MVx1NkIzRScgfSxcbiAgICAgIHJlcXVlc3RlZF9zdGF0dXM6IHsgbGFiZWw6ICdcdTc1MzNcdThCRjdcdTUzRDhcdTY2RjRcdTcyQjZcdTYwMDEnLCBvcHRpb25zOiB7IGNsb3NlZF93b246ICdcdThENjJcdTUzNTUnLCBjbG9zZWRfbG9zdDogJ1x1NEUyMlx1NTM1NScgfSB9LFxuICAgICAgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTcyQjZcdTYwMDFcdTUzRDhcdTY2RjRcdTVCQTFcdTYyNzknLFxuICAgICAgICBvcHRpb25zOiB7IG5vdF9yZXF1aXJlZDogJ1x1NjVFMFx1OTcwMFx1NUJBMVx1NjI3OScsIHBlbmRpbmc6ICdcdTVCQTFcdTYyNzlcdTRFMkQnLCBhcHByb3ZlZDogJ1x1NURGMlx1NjI3OVx1NTFDNicsIHJlamVjdGVkOiAnXHU1REYyXHU5QTczXHU1NkRFJyB9LFxuICAgICAgfSxcbiAgICAgIC8vIFJFUS0wMDA2IFx1N0IyQyAxMSBcdTZCNjUgXHUyMDE0IFx1N0FDQlx1OTg3OVx1NUJBMVx1NjI3OVx1MzAwMlxuICAgICAgcXVhbGlmaWNhdGlvbl9yZXF1ZXN0ZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTc1MzNcdThCRjdcdTdBQ0JcdTk4NzlcdTVCQTFcdTYyNzknLFxuICAgICAgICBoZWxwOiAnXHU1MkZFXHU5MDA5XHU1NDBFXHU2M0QwXHU0RUE0XHU3QUNCXHU5ODc5XHU1QkExXHU2Mjc5XHUzMDAyXHU1QkExXHU2Mjc5XHU4OEFCXHU5QTczXHU1NkRFXHU2NUY2XHU0RjFBXHU4MUVBXHU1MkE4XHU1M0Q2XHU2RDg4XHU1MkZFXHU5MDA5XHVGRjFCXHU1MThEXHU2QjIxXHU1MkZFXHU5MDA5XHU1MzczXHU1M0VGXHU5MUNEXHU2NUIwXHU3NTMzXHU4QkY3XHUzMDAyJyxcbiAgICAgIH0sXG4gICAgICBxdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1N0FDQlx1OTg3OVx1NUJBMVx1NjI3OScsXG4gICAgICAgIG9wdGlvbnM6IHsgbm90X3JlcXVpcmVkOiAnXHU2NUUwXHU5NzAwXHU1QkExXHU2Mjc5JywgcGVuZGluZzogJ1x1NUJBMVx1NjI3OVx1NEUyRCcsIGFwcHJvdmVkOiAnXHU1REYyXHU2Mjc5XHU1MUM2JywgcmVqZWN0ZWQ6ICdcdTVERjJcdTlBNzNcdTU2REUnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICB0ZW5kZXJfdGhpc19xdWFydGVyOiB7XG4gICAgICAgIGxhYmVsOiAnXHU2NzJDXHU1QjYzXHU1RUE2XHU5ODg0XHU4QkExXHU2MkRCXHU2ODA3JyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnXHU2NzJDXHU1QjYzXHU1RUE2XHU2NjgyXHU2NUUwXHU5ODg0XHU4QkExXHU2MkRCXHU2ODA3XHU3Njg0XHU1NTQ2XHU2NzNBJyxcbiAgICAgICAgICBtZXNzYWdlOiAnXHU2NzJDXHU2ODA3XHU3QjdFXHU5ODc1XHU1MjE3XHU1MUZBXHU1QkEyXHU2MjM3XHU0RkE3XHU5ODg0XHU4QkExXHU2MkRCXHU2ODA3XHU2NUU1XHU2NzFGXHU4NDNEXHU1NzI4XHU1RjUzXHU1MjREXHU1QjYzXHU1RUE2XHU1MTg1XHU3Njg0XHU4RkRCXHU4ODRDXHU0RTJEXHU1NTQ2XHU2NzNBXHUzMDAyXHU1NzI4XHU1NTQ2XHU2NzNBXHU0RTBBXHU1ODZCXHU1MTk5XHUyMDFDXHU5ODg0XHU4QkExXHU2MkRCXHU2ODA3XHU2NUU1XHU2NzFGXHUyMDFEXHU1NDBFXHVGRjBDXHU1QjgzXHU1QzMxXHU0RjFBXHU1MUZBXHU3M0IwXHU1NzI4XHU4RkQ5XHU5MUNDXHUzMDAyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvcGVuX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdcdThGREJcdTg4NENcdTRFMkRcdTU1NDZcdTY3M0EnIH0sXG4gICAgICBhbGxfb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ1x1NTE2OFx1OTBFOFx1NTU0Nlx1NjczQScgfSxcbiAgICAgIHBpcGVsaW5lX2thbmJhbjogeyBsYWJlbDogJ1x1OTUwMFx1NTUyRVx1NkQ0MVx1NkMzNFx1N0VCRicgfSxcbiAgICAgIGNsb3NlX2RhdGVfY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTk4ODRcdTZENEJcdTY1RTVcdTUzODYnIH0sXG4gICAgICBkZWFsX3RpbWVsaW5lOiB7IGxhYmVsOiAnXHU1NTQ2XHU2NzNBXHU2NUY2XHU5NUY0XHU3RUJGJyB9LFxuICAgICAgZGVhbF9nYWxsZXJ5OiB7IGxhYmVsOiAnXHU1NTQ2XHU2NzNBXHU1MzYxXHU3MjQ3JyB9LFxuICAgICAgbXlfb3Blbl9kZWFsczogeyBsYWJlbDogJ1x1NjIxMVx1NzY4NFx1OEZEQlx1ODg0Q1x1NEUyRFx1NTU0Nlx1NjczQScgfSxcbiAgICAgIHN0YWxlX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdcdTI2QTBcdUZFMEYgXHU1MDVDXHU2RURFXHU1NTQ2XHU2NzNBIFx1MDBCNyBcdTYzMDlcdTk2MzZcdTZCQjVcdTUwNUNcdTc1NTlcdTY1RjZcdTk1RjRcdTYzOTJcdTVFOEYnIH0sXG4gICAgICBjbG9zaW5nX3RoaXNfcXVhcnRlcjoge1xuICAgICAgICBsYWJlbDogJ1x1NjcyQ1x1NUI2M1x1NUVBNlx1NUY4NVx1NjIxMFx1NEVBNFx1NTU0Nlx1NjczQScsXG4gICAgICAgIGVtcHR5U3RhdGU6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1NjcyQ1x1NUI2M1x1NUVBNlx1NjY4Mlx1NjVFMFx1NUY4NVx1NjIxMFx1NEVBNFx1NTU0Nlx1NjczQScsXG4gICAgICAgICAgbWVzc2FnZTogJ1x1NjcyQ1x1NjgwN1x1N0I3RVx1OTg3NVx1NTIxN1x1NTFGQVx1OTg4NFx1OEJBMVx1NjIxMFx1NEVBNFx1NjVFNVx1NjcxRlx1ODQzRFx1NTcyOFx1NUY1M1x1NTI0RFx1NUI2M1x1NUVBNlx1NTE4NVx1MzAwMVx1NEUxNFx1NTkwNFx1NEU4RVx1NjI3Rlx1OEJGQVx1RkYwOENvbW1pdFx1RkYwOVx1NjIxNlx1NjcwMFx1NEY3M1x1NTNFRlx1ODBGRFx1RkYwOEJlc3QgQ2FzZVx1RkYwOVx1NzY4NFx1OEZEQlx1ODg0Q1x1NEUyRFx1NTU0Nlx1NjczQVx1MzAwMlx1NUY1M1x1NTI0RFx1NkNBMVx1NjcwOVx1N0IyNlx1NTQwOFx1Njc2MVx1NEVGNlx1NzY4NFx1OEJCMFx1NUY1NVx1MjAxNFx1MjAxNFx1OTg4NFx1OEJBMVx1NjIxMFx1NEVBNFx1NjVFNVx1NjcxRlx1NjZGNFx1NjY1QVx1NzY4NFx1NTU0Nlx1NjczQVx1OEJGN1x1ODlDMVx1MjAxQ1x1OEZEQlx1ODg0Q1x1NEUyRFx1NTU0Nlx1NjczQVx1MjAxRFx1NjgwN1x1N0I3RVx1OTg3NVx1MzAwMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICAvLyBPYmplY3QtbGV2ZWwgc2VjdGlvbiBrZXlzIChvcHBvcnR1bml0eS5vYmplY3QudHMpLCB1c2VkIGJ5IHJlY29yZCBmb3Jtc1xuICAgICAgLy8gYW5kIGJ5IHRoZSBkZXRhaWwgcGFnZSwgd2hvc2Ugc2VjdGlvbnMgcmVmZXJlbmNlIHRoZXNlIGdyb3VwcyAoIzE0NTIpXG4gICAgICBjcm1fZm9yZWNhc3Q6IHsgbGFiZWw6ICdcdTk2MzZcdTZCQjVcdTRFMEVcdTk4ODRcdTZENEInIH0sXG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1NTdGQVx1NjcyQ1x1NEZFMVx1NjA2RicgfSxcbiAgICAgIGZpbmFuY2lhbHM6IHsgbGFiZWw6ICdcdThEMjJcdTUyQTFcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBzYWxlc19wcm9jZXNzOiB7IGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU2RDQxXHU3QTBCJyB9LFxuICAgICAgY2xhc3NpZmljYXRpb246IHsgbGFiZWw6ICdcdTUyMDZcdTdDN0InIH0sXG4gICAgICBjYW1wYWlnbjogeyBsYWJlbDogJ1x1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCcgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHU1OTA3XHU2Q0U4XHU0RTBFXHU0RTBCXHU0RTAwXHU2QjY1JyB9LFxuICAgICAgcXVhbGlmaWNhdGlvbjogeyBsYWJlbDogJ1x1OEQ0NFx1NjgzQ1x1OEJDNFx1NEYzMCcgfSxcbiAgICAgIG5hcnJhdGl2ZTogeyBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1NTNEOVx1OEZGMCcgfSxcbiAgICAgIC8vIG9wcG9ydHVuaXR5LnZpZXcudHMgXHU4ODY4XHU1MzU1XHU1MzNBXHU1NzU3XHU1NDBEXHU3OUYwICgjMTEwMClcbiAgICAgIG92ZXJ2aWV3OiB7IGxhYmVsOiAnXHU2OTgyXHU4OUM4JyB9LFxuICAgICAgZm9yZWNhc3Q6IHsgbGFiZWw6ICdcdTk4ODRcdTZENEInIH0sXG4gICAgICBzYWxlc19zdHJhdGVneTogeyBsYWJlbDogJ1x1OTUwMFx1NTUyRVx1N0I1Nlx1NzU2NScgfSxcbiAgICAgIHdpbl9sb3NzOiB7IGxhYmVsOiAnXHU4RDYyXHU1MzU1L1x1OEY5M1x1NTM1NScgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7XG4gICAgICAuLi5hY3Rpdml0eUFjdGlvbnMsXG4gICAgICBjbG9uZV9vcHBvcnR1bml0eToge1xuICAgICAgICBsYWJlbDogJ1x1NTE0Qlx1OTY4Nlx1NTU0Nlx1NjczQScsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1NTQ2XHU2NzNBXHU1MTRCXHU5Njg2XHU2MjEwXHU1MjlGXHVGRjAxJyxcbiAgICAgIH0sXG4gICAgICBnZW5lcmF0ZV9xdW90ZToge1xuICAgICAgICBsYWJlbDogJ1x1NzUxRlx1NjIxMFx1NjJBNVx1NEVGN1x1NTM1NScsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1REYyXHU2ODM5XHU2MzZFXHU1NTQ2XHU2NzNBXHU1MjFCXHU1RUZBXHU2MkE1XHU0RUY3XHU1MzU1XHVGRjAxJyxcbiAgICAgIH0sXG4gICAgICBtYXNzX3VwZGF0ZV9zdGFnZToge1xuICAgICAgICBsYWJlbDogJ1x1NjZGNFx1NjVCMFx1OTYzNlx1NkJCNScsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1NTQ2XHU2NzNBXHU5NjM2XHU2QkI1XHU1REYyXHU2NkY0XHU2NUIwXHVGRjAxJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgc3RhZ2U6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnXHU2NUIwXHU5NjM2XHU2QkI1JyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgcHJvc3BlY3Rpbmc6ICdcdTVCRkJcdTYyN0VcdTVCQTJcdTYyMzcnLCBxdWFsaWZpY2F0aW9uOiAnXHU4RDQ0XHU2ODNDXHU1QkExXHU2N0U1JyxcbiAgICAgICAgICAgICAgbmVlZHNfYW5hbHlzaXM6ICdcdTk3MDBcdTZDNDJcdTUyMDZcdTY3OTAnLCBwcm9wb3NhbDogJ1x1NjNEMFx1Njg0OCcsXG4gICAgICAgICAgICAgIG5lZ290aWF0aW9uOiAnXHU4QzA4XHU1MjI0JywgY2xvc2VkX3dvbjogJ1x1NjIxMFx1NEVBNCcsIGNsb3NlZF9sb3N0OiAnXHU1OTMxXHU4RDI1JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgdW5pdF9wcmljZV9wb3NpdGl2ZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU5NTAwXHU1NTJFXHU0RUY3XHU2ODNDXHU0RTBEXHU4MEZEXHU0RTNBXHU4RDFGXHU2NTcwJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1NEVBN1x1NTRDMVx1NjYwRVx1N0VDNicsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTU1NDZcdTY3M0FcdTRFQTdcdTU0QzFcdTY2MEVcdTdFQzYnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU1NTQ2XHU2NzNBXHU0RTBCXHU2MzA5XHU0RUE3XHU1NEMxXHU2MkM2XHU1MjA2XHU3Njg0XHU2MkE1XHU0RUY3XHU4ODRDJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNybV9vcHBvcnR1bml0eTogeyBsYWJlbDogJ1x1NTE3M1x1ODA1NFx1NTU0Nlx1NjczQScgfSxcbiAgICAgIGNybV9wcm9kdWN0OiB7IGxhYmVsOiAnXHU0RUE3XHU1NEMxJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdTYzQ0ZcdThGRjAnIH0sXG4gICAgICBxdWFudGl0eTogeyBsYWJlbDogJ1x1NjU3MFx1OTFDRicgfSxcbiAgICAgIGxpc3RfcHJpY2U6IHsgbGFiZWw6ICdcdTY4MDdcdTRFRjcnLCBoZWxwOiAnXHU4MUVBXHU1MkE4XHU1M0Q2XHU4MUVBXHU0RUE3XHU1NEMxXHU3Njg0XHU3NkVFXHU1RjU1XHU0RUY3JyB9LFxuICAgICAgdW5pdF9wcmljZTogeyBsYWJlbDogJ1x1OTUwMFx1NTUyRVx1NTM1NVx1NEVGNycsIGhlbHA6ICdcdTUzNEZcdTU1NDZcdTU0MEVcdTc2ODRcdTUzNTVcdTRFRjdcdUZGMDhcdTUzRUZcdTRFMEVcdTc2RUVcdTVGNTVcdTRFRjdcdTRFMERcdTU0MENcdUZGMDknIH0sXG4gICAgICBkaXNjb3VudDogeyBsYWJlbDogJ1x1NjI5OFx1NjI2M1x1RkYwOCVcdUZGMDknIH0sXG4gICAgICB0b3RhbF9wcmljZTogeyBsYWJlbDogJ1x1NjAzQlx1OEJBMScgfSxcbiAgICAgIGxpbmVfbnVtYmVyOiB7IGxhYmVsOiAnXHU4ODRDXHU1M0Y3JyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1NjYwRVx1N0VDNlx1ODg0QycgfSxcbiAgICAgIHByaWNpbmc6IHsgbGFiZWw6ICdcdTRFRjdcdTY4M0MnIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX2ZvcmVjYXN0OiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBwZXJpb2RfZW5kX2FmdGVyX3N0YXJ0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTU0NjhcdTY3MUZcdTdFRDNcdTY3NUZcdTVGQzVcdTk4N0JcdTY2NUFcdTRFOEVcdTU0NjhcdTY3MUZcdTVGMDBcdTU5Q0JcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIHBlcmlvZF9lbmRfbWF0Y2hlc19jYWxlbmRhcl9wZXJpb2Q6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NTQ2OFx1NjcxRlx1N0VEM1x1Njc1Rlx1NUZDNVx1OTg3Qlx1NjYyRlx1OEJFNVx1NTQ2OFx1NjcxRlx1NzY4NFx1NjcwMFx1NTQwRVx1NEUwMFx1NTkyOVx1MjAxNFx1MjAxNFx1NEY4Qlx1NTk4Mlx1NEVFNSAyMDI2LTA3LTAxIFx1NUYwMFx1NTlDQlx1NzY4NFx1NUI2M1x1NUVBNlx1NUJGOVx1NUU5NCAyMDI2LTA5LTMwXHVGRjBDMjAyNiBcdTVFNzQgOCBcdTY3MDhcdTVCRjlcdTVFOTQgMjAyNi0wOC0zMVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgcGVyaW9kX3N0YXJ0X2ZpcnN0X29mX3BlcmlvZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU1NDY4XHU2NzFGXHU1RjAwXHU1OUNCXHU1RkM1XHU5ODdCXHU2NjJGXHU4QkU1XHU1NDY4XHU2NzFGXHU3Njg0XHU3QjJDXHU0RTAwXHU1OTI5XHUyMDE0XHUyMDE0XHU0RjhCXHU1OTgyIDIwMjYgXHU1RTc0IDggXHU2NzA4XHU1QkY5XHU1RTk0IDIwMjYtMDgtMDFcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIHF1YXJ0ZXJfc3RhcnRzX29uX3F1YXJ0ZXJfYm91bmRhcnk6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NUI2M1x1NUVBNlx1OTg4NFx1NkQ0Qlx1NUZDNVx1OTg3Qlx1NEVDRVx1NUI2M1x1NUVBNlx1OEZCOVx1NzU0Q1x1NUYwMFx1NTlDQlx1MjAxNFx1MjAxNDEgXHU2NzA4IDEgXHU2NUU1XHUzMDAxNCBcdTY3MDggMSBcdTY1RTVcdTMwMDE3IFx1NjcwOCAxIFx1NjVFNVx1NjIxNiAxMCBcdTY3MDggMSBcdTY1RTVcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIHNuYXBzaG90X2Ftb3VudHNfbm9uX25lZ2F0aXZlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTVGRUJcdTcxNjdcdTkxRDFcdTk4OURcdTRFMERcdTgwRkRcdTRFM0FcdThEMUZcdTY1NzBcdTMwMDInLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU5NTAwXHU1NTJFXHU5ODg0XHU2RDRCJyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1OTUwMFx1NTUyRVx1OTg4NFx1NkQ0QicsXG4gICAgZGVzY3JpcHRpb246ICdcdTYzMDlcdTk1MDBcdTU1MkVcdThEMUZcdThEMjNcdTRFQkFcdTVCOUFcdTY3MUZcdThCQjBcdTVGNTVcdTc2ODRcdTdCQTFcdTkwNTNcdTVGRUJcdTcxNjdcdUZGMENcdTc1MjhcdTRFOEVcdTY1MzZcdTUxNjVcdTk4ODRcdTZENEInLFxuICAgIGZpZWxkczoge1xuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdThEMUZcdThEMjNcdTRFQkEnIH0sXG4gICAgICBwZXJpb2Q6IHsgbGFiZWw6ICdcdTU0NjhcdTY3MUYnLCBvcHRpb25zOiB7IG1vbnRoOiAnXHU2NzA4XHU1RUE2JywgcXVhcnRlcjogJ1x1NUI2M1x1NUVBNicgfSB9LFxuICAgICAgcGVyaW9kX3N0YXJ0OiB7XG4gICAgICAgIGxhYmVsOiAnXHU1NDY4XHU2NzFGXHU4RDc3XHU1OUNCJyxcbiAgICAgICAgaGVscDogJ1x1NUZDNVx1OTg3Qlx1NjYyRlx1NjI0MFx1NTcyOFx1NTQ2OFx1NjcxRlx1NzY4NFx1N0IyQ1x1NEUwMFx1NTkyOVx1MjAxNFx1MjAxNFx1NEY4Qlx1NTk4MiAyMDI2IFx1NUU3NCA4IFx1NjcwOFx1NUJGOVx1NUU5NCAyMDI2LTA4LTAxXHUzMDAyXHU1QjYzXHU1RUE2XHU5ODg0XHU2RDRCXHU4RkQ4XHU1RkM1XHU5ODdCXHU4NDNEXHU1NzI4XHU1QjYzXHU1RUE2XHU4RkI5XHU3NTRDXHU0RTBBXHVGRjFBMSBcdTY3MDggMSBcdTY1RTVcdTMwMDE0IFx1NjcwOCAxIFx1NjVFNVx1MzAwMTcgXHU2NzA4IDEgXHU2NUU1XHU2MjE2IDEwIFx1NjcwOCAxIFx1NjVFNVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgcGVyaW9kX2VuZDoge1xuICAgICAgICBsYWJlbDogJ1x1NTQ2OFx1NjcxRlx1NjIyQVx1NkI2MicsXG4gICAgICAgIGhlbHA6ICdcdTkwMUFcdTVFMzhcdTY4MzlcdTYzNkVcIlx1NTQ2OFx1NjcxRlwiXHU1NDhDXCJcdTU0NjhcdTY3MUZcdThENzdcdTU5Q0JcIlx1ODFFQVx1NTJBOFx1NjNBOFx1N0I5N1x1MzAwMlx1NTk4Mlx1NjI0Qlx1NTJBOFx1NTg2Qlx1NTE5OVx1RkYwQ1x1NUZDNVx1OTg3Qlx1NjYyRlx1OEJFNVx1NTQ2OFx1NjcxRlx1NzY4NFx1NjcwMFx1NTQwRVx1NEUwMFx1NTkyOVx1MjAxNFx1MjAxNFx1NEY4Qlx1NTk4Mlx1OEQ3N1x1NTlDQlx1NEUzQSAyMDI2LTA3LTAxIFx1NzY4NFx1NUI2M1x1NUVBNlx1NUJGOVx1NUU5NCAyMDI2LTA5LTMwXHVGRjBDMjAyNiBcdTVFNzQgOCBcdTY3MDhcdTVCRjlcdTVFOTQgMjAyNi0wOC0zMVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgcGVyaW9kX2xhYmVsOiB7IGxhYmVsOiAnXHU1NDY4XHU2NzFGXHU2ODA3XHU3QjdFJywgaGVscDogJ1x1NjYxM1x1OEJGQlx1NzY4NFx1NTQ2OFx1NjcxRlx1NjgwN1x1N0I3RVx1RkYwQ1x1NEY4Qlx1NTk4MlwiMjAyNiBcdTVFNzRcdTdCMkNcdTRFMDlcdTVCNjNcdTVFQTZcIlx1NjIxNlwiMjAyNiBcdTVFNzQgOCBcdTY3MDhcIlx1MzAwMicgfSxcbiAgICAgIHNuYXBzaG90X2RhdGU6IHsgbGFiZWw6ICdcdTVGRUJcdTcxNjdcdTY1RTVcdTY3MUYnLCBoZWxwOiAnXHU2NzJDXHU2QjIxXHU1RkVCXHU3MTY3XHU3Njg0XHU5MUM3XHU5NkM2XHU2NUU1XHU2NzFGXHUzMDAyJyB9LFxuICAgICAgc291cmNlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU2NzY1XHU2RTkwJyxcbiAgICAgICAgb3B0aW9uczogeyBzY2hlZHVsZWQ6ICdcdTVCOUFcdTY1RjZcdTVGRUJcdTcxNjcnLCBhaTogJ0FJIFx1NjI4MFx1ODBGRCcsIG1hbnVhbDogJ1x1NjI0Qlx1NURFNVx1NUY1NVx1NTE2NScgfSxcbiAgICAgIH0sXG4gICAgICBxdW90YTogeyBsYWJlbDogJ1x1OTE0RFx1OTg5RCcgfSxcbiAgICAgIHBpcGVsaW5lX2Ftb3VudDogeyBsYWJlbDogJ1x1N0JBMVx1OTA1M1x1OTFEMVx1OTg5RCcsIGhlbHA6ICdcdTY3MkNcdTU0NjhcdTY3MUZcdTUxODVcdTYyNDBcdTY3MDlcdTk4ODRcdThCQTFcdTdFRDNcdTUzNTVcdTc2ODRcdThGREJcdTg4NENcdTRFMkRcdTU1NDZcdTY3M0FcdTkxRDFcdTk4OURcdTU0MDhcdThCQTFcdUZGMDhcdTRFMERcdTk2NTBcdTk2MzZcdTZCQjVcdUZGMDlcdTMwMDInIH0sXG4gICAgICBiZXN0X2Nhc2VfYW1vdW50OiB7IGxhYmVsOiAnXHU2NzAwXHU0RjczXHU2MEM1XHU1MUI1JywgaGVscDogJ1x1OTg4NFx1NkQ0Qlx1N0M3Qlx1NTIyQlx1NEUzQVwiXHU2NzAwXHU0RjczXHU2MEM1XHU1MUI1XCJcdTYyMTZcIlx1NjI3Rlx1OEJGQVwiXHU3Njg0XHU4RkRCXHU4ODRDXHU0RTJEXHU1NTQ2XHU2NzNBXHUzMDAyJyB9LFxuICAgICAgY29tbWl0X2Ftb3VudDogeyBsYWJlbDogJ1x1NjI3Rlx1OEJGQVx1OTFEMVx1OTg5RCcsIGhlbHA6ICdcdTk4ODRcdTZENEJcdTdDN0JcdTUyMkJcdTRFM0FcIlx1NjI3Rlx1OEJGQVwiXHU3Njg0XHU4RkRCXHU4ODRDXHU0RTJEXHU1NTQ2XHU2NzNBXHVGRjA4XHU4RDFGXHU4RDIzXHU0RUJBXHU1REYyXHU2MjdGXHU4QkZBXHVGRjA5XHUzMDAyJyB9LFxuICAgICAgY2xvc2VkX2Ftb3VudDogeyBsYWJlbDogJ1x1NURGMlx1NjIxMFx1NEVBNFx1OTFEMVx1OTg5RCcsIGhlbHA6ICdcdTY3MkNcdTU0NjhcdTY3MUZcdTUxODVcdTVERjJcdThENjJcdTUzNTVcdTc2ODRcdTkxRDFcdTk4OURcdTMwMDInIH0sXG4gICAgICBleHBlY3RlZF9hbW91bnQ6IHsgbGFiZWw6ICdcdTk4ODRcdTY3MUZcdTkxRDFcdTk4OUQnLCBoZWxwOiAnXHU1REYyXHU2MjEwXHU0RUE0ICsgXHU2MjdGXHU4QkZBXHUyMDE0XHUyMDE0XHU4RDFGXHU4RDIzXHU0RUJBXHU1NDA4XHU3NDA2XHU5ODg0XHU2NzFGXHU4MEZEXHU2MkZGXHU0RTBCXHU3Njg0XHU5MUQxXHU5ODlEXHUzMDAyJyB9LFxuICAgICAgYXR0YWlubWVudF9wY3Q6IHsgbGFiZWw6ICdcdThGQkVcdTYyMTBcdTczODdcdUZGMDglXHVGRjA5JywgaGVscDogJ1x1NURGMlx1NjIxMFx1NEVBNCBcdTAwRjcgXHU5MTREXHU5ODlEIFx1MDBENyAxMDBcdTMwMDJcdTkxNERcdTk4OURcdTRFM0FcdTZCNjNcdTY1NzBcdTRFNEJcdTUyNERcdTY2M0VcdTc5M0EgMCVcdTMwMDInIH0sXG4gICAgICBjb3ZlcmFnZV9yYXRpbzogeyBsYWJlbDogJ1x1ODk4Nlx1NzZENlx1NTAwRFx1NjU3MCcsIGhlbHA6ICdcdTdCQTFcdTkwNTNcdTkxRDFcdTk4OUQgXHUwMEY3XHVGRjA4XHU5MTREXHU5ODlEIFx1MjIxMiBcdTVERjJcdTYyMTBcdTRFQTRcdUZGMDlcdTIwMTRcdTIwMTRcdTUyMjRcdTY1QURcdTUyNjlcdTRGNTlcdTdGM0FcdTUzRTNcdTY2MkZcdTU0MjZcdTY3MDlcdThEQjNcdTU5MUZcdTdCQTFcdTkwNTNcdTg5ODZcdTc2RDZcdTMwMDJcdTkxNERcdTk4OURcdTVERjJcdThGQkVcdTYyMTBcdTY1RjZcdTY2M0VcdTc5M0EgMFx1MzAwMicgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHU1OTA3XHU2Q0U4JyB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ1x1NjYzRVx1NzkzQVx1NTQwRFx1NzlGMCcgfSxcbiAgICAgIHNlZWRfa2V5OiB7IGxhYmVsOiAnXHU3OUNEXHU1QjUwXHU2ODA3XHU4QkM2JywgaGVscDogJ1x1NkYxNFx1NzkzQVx1NjU3MFx1NjM2RVx1NjgwN1x1OEJDNlx1MzAwMlx1NEVDNVx1NzUzMVx1NzlDRFx1NUI1MFx1NTJBMFx1OEY3RFx1NTY2OFx1NTE5OVx1NTE2NVx1RkYxQlx1NzcxRlx1NUI5RVx1NUZFQlx1NzE2N1x1NEUwQVx1NTlDQlx1N0VDOFx1NEUzQVx1N0E3QVx1MzAwMicgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2ZvcmVjYXN0czogeyBsYWJlbDogJ1x1NTE2OFx1OTBFOFx1OTg4NFx1NkQ0QicgfSxcbiAgICAgIHRoaXNfcXVhcnRlcl9mb3JlY2FzdHM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY3MkNcdTVCNjNcdTVFQTYnLFxuICAgICAgICBlbXB0eVN0YXRlOiB7XG4gICAgICAgICAgdGl0bGU6ICdcdTY3MkNcdTVCNjNcdTVFQTZcdTVDMUFcdTY1RTBcdTVGRUJcdTcxNjcnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdcdTVCNjNcdTVFQTZcdTVGRUJcdTcxNjdcdTc1MzFcdTZCQ0ZcdTY2NUFcdTc2ODRcdTk4ODRcdTZENEJcdTYyNkJcdTYzQ0ZcdTRFRkJcdTUyQTFcdTUxOTlcdTUxNjVcdTMwMDJcdTU3MjhcdTVCODNcdTRFM0FcdTVGNTNcdTUyNERcdTVCNjNcdTVFQTZcdTk5OTZcdTZCMjFcdThERDFcdTVCOENcdTRFNEJcdTUyNERcdUZGMENcdTY3MkNcdTg5QzZcdTU2RkVcdTRFM0FcdTdBN0FcdTIwMTRcdTIwMTRcdTVERjJcdTdFRDNcdTY3NUZcdTc2ODRcdTVCNjNcdTVFQTZcdThCRjdcdTg5QzFcdTIwMUNcdTUxNjhcdTkwRThcdTIwMURcdTY4MDdcdTdCN0VcdTk4NzVcdTMwMDInLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG15X2ZvcmVjYXN0OiB7IGxhYmVsOiAnXHU2MjExXHU3Njg0XHU5ODg0XHU2RDRCJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1NUZFQlx1NzE2NycgfSxcbiAgICAgIGFtb3VudHM6IHsgbGFiZWw6ICdcdTkxRDFcdTk4OUQnIH0sXG4gICAgICBtZXRhOiB7IGxhYmVsOiAnXHU2NzY1XHU2RTkwJyB9LFxuICAgICAgLy8gZm9yZWNhc3Qudmlldy50cyBcdTg4NjhcdTUzNTVcdTUzM0FcdTU3NTdcdTU0MERcdTc5RjAgKCMxMTAwKVxuICAgICAgc25hcHNob3Q6IHsgbGFiZWw6ICdcdTVGRUJcdTcxNjcnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ1x1NTkwN1x1NkNFOCcgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9vYmplY3RzLmNvbW1lcmNlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTlwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vb2JqZWN0cy5jb21tZXJjZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG4vKipcbiAqIFx1N0I4MFx1NEY1M1x1NEUyRFx1NjU4NyAoemgtQ04pIFx1MjAxNCBgb2JqZWN0c2AgdHJhbnNsYXRpb25zIGZvciB0aGUgQ09NTUVSQ0UgZmFtaWx5OlxuICogd2hhdCBnZXRzIHNvbGQgYW5kIG9uIHdoYXQgcGFwZXIgXHUyMDE0IHF1b3RlcywgY29udHJhY3RzLCBwcm9kdWN0cy5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fcXVvdGVgLCBgY3JtX3F1b3RlX2xpbmVfaXRlbWAsIGBjcm1fY29udHJhY3RgLCBgY3JtX3Byb2R1Y3RgLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICogRXZlcnl0aGluZyB0aGF0IGlzIG5vdCBgb2JqZWN0c2AgbGl2ZXMgaW4gYC4vYXBwLnRzYDsgYG9iamVjdHNgIFx1MjAxNCA2OS03OCUgb2ZcbiAqIGV2ZXJ5IGJ1bmRsZSBcdTIwMTQgaXMgb25lIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5LCBhbmQgYSBkZXRhaWwgb2JqZWN0XG4gKiBmb2xsb3dzIGl0cyBtYXN0ZXIuIEEgbmV3IHJvdyBnb2VzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LCBuZXZlciBpblxuICogd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuOiB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0IHRoZSA3MCVcbiAqIGFkdmlzb3J5IGJhbmQgYHBucG0gaHlnaWVuZWAgcHJpbnRzLiBGdWxsIHJ1bGUgYW5kIHJhdGlvbmFsZTpcbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOLnRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbW1lcmNlOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fcXVvdGU6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGRpc2NvdW50X3dpdGhpbl9jZWlsaW5nOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTYyOThcdTYyNjNcdTRFMERcdTgwRkRcdThEODVcdThGQzcgNjAlJyxcbiAgICAgIH0sXG4gICAgICBleHBpcmF0aW9uX2FmdGVyX3F1b3RlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTU5MzFcdTY1NDhcdTY1RTVcdTY3MUZcdTVGQzVcdTk4N0JcdTY2NUFcdTRFOEVcdTYyQTVcdTRFRjdcdTY1RTVcdTY3MUYnLFxuICAgICAgfSxcbiAgICAgIHF1b3RlX3N0YXR1c19wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU2NUUwXHU2NTQ4XHU3Njg0XHU2MkE1XHU0RUY3XHU1MzU1XHU3MkI2XHU2MDAxXHU2RDQxXHU4RjZDJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NjJBNVx1NEVGN1x1NTM1NScsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTYyQTVcdTRFRjdcdTUzNTUnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU1M0QxXHU5MDAxXHU3RUQ5XHU1QkEyXHU2MjM3XHU3Njg0XHU0RUY3XHU2ODNDXHU2MkE1XHU0RUY3JyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIHF1b3RlX251bWJlcjogeyBsYWJlbDogJ1x1NjJBNVx1NEVGN1x1NTM1NVx1N0YxNlx1NTNGNycgfSxcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdcdTYyQTVcdTRFRjdcdTU0MERcdTc5RjAnIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ1x1NjI0MFx1NUM1RVx1NUJBMlx1NjIzNycgfSxcbiAgICAgIGNybV9vcHBvcnR1bml0eTogeyBsYWJlbDogJ1x1NTE3M1x1ODA1NFx1NTU0Nlx1NjczQScgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1NzJCNlx1NjAwMScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkcmFmdDogJ1x1ODM0OVx1N0EzRicsIGluX3JldmlldzogJ1x1NUJBMVx1NjgzOFx1NEUyRCcsIHByZXNlbnRlZDogJ1x1NURGMlx1NjNEMFx1NEVBNCcsIGFjY2VwdGVkOiAnXHU1REYyXHU2M0E1XHU1M0Q3JyxcbiAgICAgICAgICByZWplY3RlZDogJ1x1NURGMlx1NjJEMlx1N0VERCcsIGV4cGlyZWQ6ICdcdTVERjJcdThGQzdcdTY3MUYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRvdGFsX3ByaWNlOiB7IGxhYmVsOiAnXHU2MDNCXHU5MUQxXHU5ODlEJyB9LFxuICAgICAgZGlzY291bnQ6IHsgbGFiZWw6ICdcdTYyOThcdTYyNjMgKCUpJyB9LFxuICAgICAgZXhwaXJhdGlvbl9kYXRlOiB7IGxhYmVsOiAnXHU1MjMwXHU2NzFGXHU2NUU1XHU2NzFGJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdTYzQ0ZcdThGRjAnIH0sXG4gICAgICBjcm1fY29udGFjdDoge1xuICAgICAgICBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEVCQScsXG4gICAgICAgIGhlbHA6ICdcdTYyQTVcdTRFRjdcdThGREJcdTUxNjVcdTMwMENcdTVERjJcdTYzRDBcdTRFQTRcdTMwMERcdTYyMTZcdTMwMENcdTVERjJcdTYzQTVcdTUzRDdcdTMwMERcdTU0MEVcdTVGQzVcdTU4NkIgXHUyMDE0XHUyMDE0IFx1OEQ3N1x1ODM0OVx1NzY4NFx1NTQwOFx1NTQwQ1x1NEVDRVx1OEZEOVx1OTFDQ1x1NTNENlx1NEUzQlx1ODk4MVx1ODA1NFx1N0NGQlx1NEVCQVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdTYyQTVcdTRFRjdcdThEMUZcdThEMjNcdTRFQkEnIH0sXG4gICAgICBxdW90ZV9kYXRlOiB7IGxhYmVsOiAnXHU2MkE1XHU0RUY3XHU2NUU1XHU2NzFGJyB9LFxuICAgICAgc3VidG90YWw6IHsgbGFiZWw6ICdcdTVDMEZcdThCQTEnIH0sXG4gICAgICBkaXNjb3VudF9hbW91bnQ6IHsgbGFiZWw6ICdcdTYyOThcdTYyNjNcdTkxRDFcdTk4OUQnIH0sXG4gICAgICB0YXg6IHsgbGFiZWw6ICdcdTdBMEVcdTk4OUQnIH0sXG4gICAgICBzaGlwcGluZ19oYW5kbGluZzogeyBsYWJlbDogJ1x1OEZEMFx1OEQzOVx1NTNDQVx1NjI0Qlx1N0VFRFx1OEQzOScgfSxcbiAgICAgIHBheW1lbnRfdGVybXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTRFRDhcdTZCM0VcdTY3NjFcdTZCM0UnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbmV0XzE1OiAnMTUgXHU1OTI5XHU4RDI2XHU2NzFGJywgbmV0XzMwOiAnMzAgXHU1OTI5XHU4RDI2XHU2NzFGJywgbmV0XzYwOiAnNjAgXHU1OTI5XHU4RDI2XHU2NzFGJyxcbiAgICAgICAgICBuZXRfOTA6ICc5MCBcdTU5MjlcdThEMjZcdTY3MUYnLCBkdWVfb25fcmVjZWlwdDogJ1x1OEQyN1x1NTIzMFx1NEVEOFx1NkIzRScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc2hpcHBpbmdfdGVybXM6IHsgbGFiZWw6ICdcdThGRDBcdThGOTNcdTY3NjFcdTZCM0UnIH0sXG4gICAgICBiaWxsaW5nX2FkZHJlc3M6IHsgbGFiZWw6ICdcdThEMjZcdTUzNTVcdTU3MzBcdTU3NDAnIH0sXG4gICAgICBzaGlwcGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnXHU2NTM2XHU4RDI3XHU1NzMwXHU1NzQwJyB9LFxuICAgICAgaW50ZXJuYWxfbm90ZXM6IHsgbGFiZWw6ICdcdTUxODVcdTkwRThcdTU5MDdcdTZDRTgnIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnXHU2NjNFXHU3OTNBXHU1NDBEXHU3OUYwJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfcXVvdGVzOiB7IGxhYmVsOiAnXHU1MTY4XHU5MEU4XHU2MkE1XHU0RUY3XHU1MzU1JyB9LFxuICAgICAgcXVvdGVfcGlwZWxpbmU6IHsgbGFiZWw6ICdcdTYyQTVcdTRFRjdcdTZENDFcdTZDMzRcdTdFQkYnIH0sXG4gICAgICBxdW90ZV9jYWxlbmRhcjogeyBsYWJlbDogJ1x1NjJBNVx1NEVGN1x1NjVFNVx1NTM4NicgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTYyQTVcdTRFRjdcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBwcmljaW5nOiB7IGxhYmVsOiAnXHU0RUY3XHU2ODNDJyB9LFxuICAgICAgdGVybXM6IHsgbGFiZWw6ICdcdTY3NjFcdTZCM0VcdTRFMEVcdTY3MDlcdTY1NDhcdTY3MUYnIH0sXG4gICAgICBhZGRyZXNzOiB7IGxhYmVsOiAnXHU1NzMwXHU1NzQwJyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnXHU3Q0ZCXHU3RURGJyB9LFxuICAgICAgLy8gcXVvdGUudmlldy50cyBcdTg4NjhcdTUzNTVcdTUzM0FcdTU3NTdcdTU0MERcdTc5RjAgKCMxMTAwKVxuICAgICAgcXVvdGU6IHsgbGFiZWw6ICdcdTYyQTVcdTRFRjdcdTUzNTUnIH0sXG4gICAgICB0b3RhbHM6IHsgbGFiZWw6ICdcdTU0MDhcdThCQTEnIH0sXG4gICAgICBxdW90ZV90ZXJtczogeyBsYWJlbDogJ1x1Njc2MVx1NkIzRScgfSxcbiAgICAgIGFkZHJlc3Nlc19hbmRfbm90ZXM6IHsgbGFiZWw6ICdcdTU3MzBcdTU3NDBcdTRFMEVcdTU5MDdcdTZDRTgnIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX3F1b3RlX2xpbmVfaXRlbToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgZGlzY291bnRfd2l0aGluX2NlaWxpbmc6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1ODg0Q1x1NjI5OFx1NjI2M1x1NEUwRFx1ODBGRFx1OEQ4NVx1OEZDNyA2MCUnLFxuICAgICAgfSxcbiAgICAgIHVuaXRfcHJpY2VfcG9zaXRpdmU6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1OTUwMFx1NTUyRVx1NEVGN1x1NjgzQ1x1NEUwRFx1ODBGRFx1NEUzQVx1OEQxRlx1NjU3MCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdcdTYyQTVcdTRFRjdcdTUzNTVcdTY2MEVcdTdFQzYnLFxuICAgIHBsdXJhbExhYmVsOiAnXHU2MkE1XHU0RUY3XHU1MzU1XHU2NjBFXHU3RUM2JyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1NjJBNVx1NEVGN1x1NTM1NVx1NEUwQlx1NjMwOVx1NEVBN1x1NTRDMVx1NjJDNlx1NTIwNlx1NzY4NFx1NjJBNVx1NEVGN1x1ODg0QycsXG4gICAgZmllbGRzOiB7XG4gICAgICBjcm1fcXVvdGU6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTYyQTVcdTRFRjdcdTUzNTUnIH0sXG4gICAgICBjcm1fcHJvZHVjdDogeyBsYWJlbDogJ1x1NEVBN1x1NTRDMScgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU2M0NGXHU4RkYwJyB9LFxuICAgICAgcXVhbnRpdHk6IHsgbGFiZWw6ICdcdTY1NzBcdTkxQ0YnIH0sXG4gICAgICBsaXN0X3ByaWNlOiB7IGxhYmVsOiAnXHU2ODA3XHU0RUY3JyB9LFxuICAgICAgdW5pdF9wcmljZTogeyBsYWJlbDogJ1x1OTUwMFx1NTUyRVx1NTM1NVx1NEVGNycgfSxcbiAgICAgIGRpc2NvdW50OiB7IGxhYmVsOiAnXHU2Mjk4XHU2MjYzXHVGRjA4JVx1RkYwOScgfSxcbiAgICAgIHN1YnRvdGFsOiB7IGxhYmVsOiAnXHU1QzBGXHU4QkExJyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdcdTYwM0JcdThCQTEnIH0sXG4gICAgICBsaW5lX251bWJlcjogeyBsYWJlbDogJ1x1ODg0Q1x1NTNGNycgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTY2MEVcdTdFQzZcdTg4NEMnIH0sXG4gICAgICBwcmljaW5nOiB7IGxhYmVsOiAnXHU0RUY3XHU2ODNDJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9jb250cmFjdDoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgZW5kX2FmdGVyX3N0YXJ0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTdFRDNcdTY3NUZcdTY1RTVcdTY3MUZcdTVGQzVcdTk4N0JcdTY2NUFcdTRFOEVcdTVGMDBcdTU5Q0JcdTY1RTVcdTY3MUYnLFxuICAgICAgfSxcbiAgICAgIGNvbnRyYWN0X3N0YXR1c19wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU2NUUwXHU2NTQ4XHU3Njg0XHU1NDA4XHU1NDBDXHU3MkI2XHU2MDAxXHU2RDQxXHU4RjZDJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NTQwOFx1NTQwQycsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTU0MDhcdTU0MEMnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU0RTBFXHU1QkEyXHU2MjM3XHU3QjdFXHU3RjcyXHU3Njg0XHU2Q0Q1XHU1RjhCXHU1NDA4XHU1NDBDJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNvbnRyYWN0X251bWJlcjogeyBsYWJlbDogJ1x1NTQwOFx1NTQwQ1x1N0YxNlx1NTNGNycgfSxcbiAgICAgIGNybV9hY2NvdW50OiB7IGxhYmVsOiAnXHU2MjQwXHU1QzVFXHU1QkEyXHU2MjM3JyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3MkI2XHU2MDAxJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGRyYWZ0OiAnXHU4MzQ5XHU3QTNGJywgaW5fYXBwcm92YWw6ICdcdTVCQTFcdTYyNzlcdTRFMkQnLCBhY3RpdmF0ZWQ6ICdcdTVERjJcdTZGQzBcdTZEM0InLFxuICAgICAgICAgIGV4cGlyZWQ6ICdcdTVERjJcdThGQzdcdTY3MUYnLCB0ZXJtaW5hdGVkOiAnXHU1REYyXHU3RUM4XHU2QjYyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGFydF9kYXRlOiB7IGxhYmVsOiAnXHU1RjAwXHU1OUNCXHU2NUU1XHU2NzFGJyB9LFxuICAgICAgZW5kX2RhdGU6IHsgbGFiZWw6ICdcdTdFRDNcdTY3NUZcdTY1RTVcdTY3MUYnIH0sXG4gICAgICBjb250cmFjdF92YWx1ZTogeyBsYWJlbDogJ1x1NTQwOFx1NTQwQ1x1OTFEMVx1OTg5RCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU2M0NGXHU4RkYwJyB9LFxuICAgICAgY3JtX2NvbnRhY3Q6IHsgbGFiZWw6ICdcdTRFM0JcdTg5ODFcdTgwNTRcdTdDRkJcdTRFQkEnIH0sXG4gICAgICBjcm1fb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTU1NDZcdTY3M0EnIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1NTQwOFx1NTQwQ1x1OEQxRlx1OEQyM1x1NEVCQScgfSxcbiAgICAgIGNvbnRyYWN0X3Rlcm1fbW9udGhzOiB7IGxhYmVsOiAnXHU1NDA4XHU1NDBDXHU2NzFGXHU5NjUwXHVGRjA4XHU2NzA4XHVGRjA5JyB9LFxuICAgICAgYmlsbGluZ19mcmVxdWVuY3k6IHtcbiAgICAgICAgbGFiZWw6ICdcdThCQTFcdThEMzlcdTU0NjhcdTY3MUYnLFxuICAgICAgICBvcHRpb25zOiB7IG1vbnRobHk6ICdcdTYzMDlcdTY3MDgnLCBxdWFydGVybHk6ICdcdTYzMDlcdTVCNjNcdTVFQTYnLCBhbm51YWxseTogJ1x1NjMwOVx1NUU3NCcsIG9uZV90aW1lOiAnXHU0RTAwXHU2QjIxXHU2MDI3JyB9LFxuICAgICAgfSxcbiAgICAgIHBheW1lbnRfdGVybXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTRFRDhcdTZCM0VcdTY3NjFcdTZCM0UnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbmV0XzE1OiAnMTUgXHU1OTI5XHU4RDI2XHU2NzFGJywgbmV0XzMwOiAnMzAgXHU1OTI5XHU4RDI2XHU2NzFGJywgbmV0XzYwOiAnNjAgXHU1OTI5XHU4RDI2XHU2NzFGJyxcbiAgICAgICAgICBuZXRfOTA6ICc5MCBcdTU5MjlcdThEMjZcdTY3MUYnLCBkdWVfb25fcmVjZWlwdDogJ1x1OEQyN1x1NTIzMFx1NEVEOFx1NkIzRScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXV0b19yZW5ld2FsOiB7IGxhYmVsOiAnXHU4MUVBXHU1MkE4XHU3RUVEXHU3RUE2JyB9LFxuICAgICAgcmVuZXdhbF9ub3RpY2VfZGF5czogeyBsYWJlbDogJ1x1N0VFRFx1N0VBNlx1OTAxQVx1NzdFNVx1RkYwOFx1NTkyOVx1RkYwOScgfSxcbiAgICAgIGNvbnRyYWN0X3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTU0MDhcdTU0MENcdTdDN0JcdTU3OEInLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uOiAnXHU4QkEyXHU5NjA1XHU1NDA4XHU1NDBDJywgc2VydmljZTogJ1x1NjcwRFx1NTJBMVx1NTM0Rlx1OEJBRScsIGxpY2Vuc2U6ICdcdTYzODhcdTY3NDNcdThCQjhcdTUzRUYnLFxuICAgICAgICAgIHBhcnRuZXJzaGlwOiAnXHU1NDA4XHU0RjVDXHU1MzRGXHU4QkFFJywgbmRhOiAnXHU0RkREXHU1QkM2XHU1MzRGXHU4QkFFJywgbXNhOiAnXHU0RTNCXHU2NzBEXHU1MkExXHU1MzRGXHU4QkFFJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzaWduZWRfZGF0ZTogeyBsYWJlbDogJ1x1N0I3RVx1N0Y3Mlx1NjVFNVx1NjcxRicgfSxcbiAgICAgIHNpZ25lZF9ieTogeyBsYWJlbDogJ1x1N0I3RVx1N0Y3Mlx1NEVCQScgfSxcbiAgICAgIGRvY3VtZW50X3VybDogeyBsYWJlbDogJ1x1NTQwOFx1NTQwQ1x1NjU4N1x1Njg2MycgfSxcbiAgICAgIHNwZWNpYWxfdGVybXM6IHsgbGFiZWw6ICdcdTcyNzlcdTZCOEFcdTY3NjFcdTZCM0UnIH0sXG4gICAgICBiaWxsaW5nX2FkZHJlc3M6IHsgbGFiZWw6ICdcdThEMjZcdTUzNTVcdTU3MzBcdTU3NDAnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9jb250cmFjdHM6IHsgbGFiZWw6ICdcdTUxNjhcdTkwRThcdTU0MDhcdTU0MEMnIH0sXG4gICAgICByZW5ld2FsX2NhbGVuZGFyOiB7IGxhYmVsOiAnXHU3RUVEXHU3RUE2XHU2NUU1XHU1Mzg2JyB9LFxuICAgICAgY29udHJhY3RfZ2FudHQ6IHsgbGFiZWw6ICdcdTU0MDhcdTU0MENcdTY3NjFcdTZCM0UnIH0sXG4gICAgICBjb250cmFjdF90aW1lbGluZTogeyBsYWJlbDogJ1x1NTQwOFx1NTQwQ1x1NjVGNlx1OTVGNFx1N0VCRicgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTU0MDhcdTU0MENcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBwYXJ0aWVzOiB7IGxhYmVsOiAnXHU3QjdFXHU3RUE2XHU2NUI5JyB9LFxuICAgICAgdGVybXM6IHsgbGFiZWw6ICdcdTY3NjFcdTZCM0VcdTRFMEVcdTY1RTVcdTY3MUYnIH0sXG4gICAgICB2YWx1ZTogeyBsYWJlbDogJ1x1NTQwOFx1NTQwQ1x1OTFEMVx1OTg5RCcgfSxcbiAgICAgIHN0YXR1czogeyBsYWJlbDogJ1x1NzJCNlx1NjAwMVx1NEUwRVx1NUJBMVx1NjI3OScgfSxcbiAgICAgIHJlbmV3YWw6IHsgbGFiZWw6ICdcdTdFRURcdTdFQTYnIH0sXG4gICAgICAvLyBjb250cmFjdC52aWV3LnRzIFx1ODg2OFx1NTM1NVx1NTMzQVx1NTc1N1x1NTQwRFx1NzlGMCAoIzExMDApXG4gICAgICBjb250cmFjdF90ZXJtczogeyBsYWJlbDogJ1x1Njc2MVx1NkIzRScgfSxcbiAgICAgIHNpZ25pbmdfYW5kX2RvY3VtZW50czogeyBsYWJlbDogJ1x1N0I3RVx1N0Y3Mlx1NEUwRVx1NjU4N1x1NEVGNicgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHU1OTA3XHU2Q0U4JyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9wcm9kdWN0OiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBjb3N0X2xlc3NfdGhhbl9wcmljZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU2MjEwXHU2NzJDXHU1RTk0XHU0RjRFXHU0RThFXHU2ODA3XHU0RUY3JyxcbiAgICAgIH0sXG4gICAgICBwcmljZV9wb3NpdGl2ZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU2ODA3XHU0RUY3XHU1RkM1XHU5ODdCXHU0RTNBXHU2QjYzXHU2NTcwJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NEVBN1x1NTRDMScsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTRFQTdcdTU0QzEnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU1MTZDXHU1M0Y4XHU2M0QwXHU0RjlCXHU3Njg0XHU0RUE3XHU1NEMxXHU0RTBFXHU2NzBEXHU1MkExJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIHByb2R1Y3RfY29kZTogeyBsYWJlbDogJ1x1NEVBN1x1NTRDMVx1NEVFM1x1NzgwMScgfSxcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdcdTRFQTdcdTU0QzFcdTU0MERcdTc5RjAnIH0sXG4gICAgICBjYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ1x1NEVBN1x1NTRDMVx1N0M3Qlx1NTIyQicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBzb2Z0d2FyZTogJ1x1OEY2Rlx1NEVGNicsIGhhcmR3YXJlOiAnXHU3ODZDXHU0RUY2Jywgc2VydmljZTogJ1x1NjcwRFx1NTJBMScsXG4gICAgICAgICAgc3Vic2NyaXB0aW9uOiAnXHU4QkEyXHU5NjA1Jywgc3VwcG9ydDogJ1x1NjUyRlx1NjMwMVx1NjcwRFx1NTJBMScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29zdDogeyBsYWJlbDogJ1x1NjIxMFx1NjcyQycgfSxcbiAgICAgIGlzX2FjdGl2ZTogeyBsYWJlbDogJ1x1NjYyRlx1NTQyNlx1NTQyRlx1NzUyOCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU2M0NGXHU4RkYwJyB9LFxuICAgICAgZmFtaWx5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RUE3XHU1NEMxXHU3Q0ZCXHU1MjE3JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGVudGVycHJpc2U6ICdcdTRGMDFcdTRFMUFcdTdFQTdcdTY1QjlcdTY4NDgnLCBzbWI6ICdcdTRFMkRcdTVDMEZcdTRGMDFcdTRFMUFcdTY1QjlcdTY4NDgnLFxuICAgICAgICAgIHNlcnZpY2VzOiAnXHU0RTEzXHU0RTFBXHU2NzBEXHU1MkExJywgY2xvdWQ6ICdcdTRFOTFcdTY3MERcdTUyQTEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxpc3RfcHJpY2U6IHsgbGFiZWw6ICdcdTY4MDdcdTRFRjcnIH0sXG4gICAgICBza3U6IHsgbGFiZWw6ICdTS1UnIH0sXG4gICAgICBwcm9kdWN0X21hbmFnZXI6IHsgbGFiZWw6ICdcdTRFQTdcdTU0QzFcdTdFQ0ZcdTc0MDYnIH0sXG4gICAgICBpbWFnZTogeyBsYWJlbDogJ1x1NEVBN1x1NTRDMVx1NTZGRVx1NzI0NycgfSxcbiAgICAgIGRhdGFzaGVldDogeyBsYWJlbDogJ1x1ODlDNFx1NjgzQ1x1NEU2NicgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTY2M0VcdTc5M0FcdTU0MERcdTc5RjAnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9wcm9kdWN0czogeyBsYWJlbDogJ1x1NTE2OFx1OTBFOFx1NEVBN1x1NTRDMScgfSxcbiAgICAgIHByb2R1Y3RfY2F0YWxvZzogeyBsYWJlbDogJ1x1NEVBN1x1NTRDMVx1NzZFRVx1NUY1NScgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTRFQTdcdTU0QzFcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBwcmljaW5nOiB7IGxhYmVsOiAnXHU0RUY3XHU2ODNDJyB9LFxuICAgICAgbWV0YWRhdGE6IHsgbGFiZWw6ICdcdThENDRcdTZFOTAnIH0sXG4gICAgICAvLyBwcm9kdWN0LnZpZXcudHMgXHU4ODY4XHU1MzU1XHU1MzNBXHU1NzU3XHU1NDBEXHU3OUYwICgjMTEwMClcbiAgICAgIHByb2R1Y3RfaW5mbzogeyBsYWJlbDogJ1x1NEVBN1x1NTRDMVx1NEZFMVx1NjA2RicgfSxcbiAgICAgIHByaWNpbmdfaW5mbzogeyBsYWJlbDogJ1x1NUI5QVx1NEVGNycgfSxcbiAgICAgIG1lZGlhOiB7IGxhYmVsOiAnXHU1QTkyXHU0RjUzJyB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOL29iamVjdHMuc2VydmljZS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ05cIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOL29iamVjdHMuc2VydmljZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG5pbXBvcnQgeyBhY3Rpdml0eUFjdGlvbnMgfSBmcm9tICcuL19zaGFyZWQnO1xuXG4vKipcbiAqIFx1N0I4MFx1NEY1M1x1NEUyRFx1NjU4NyAoemgtQ04pIFx1MjAxNCBgb2JqZWN0c2AgdHJhbnNsYXRpb25zIGZvciB0aGUgU0VSVklDRSBmYW1pbHk6XG4gKiBwb3N0LXNhbGUgc3VwcG9ydCBcdTIwMTQgY2FzZXMgYW5kIHRoZSBrbm93bGVkZ2UgdGhhdCBkZWZsZWN0cyB0aGVtLlxuICpcbiAqIFJvc3RlcjogYGNybV9jYXNlYCwgYGNybV9rbm93bGVkZ2VfYXJ0aWNsZWAsIGBjcm1fYXJ0aWNsZV9mZWVkYmFja2AuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04udHNgLlxuICovXG5leHBvcnQgY29uc3Qgc2VydmljZTogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX2Nhc2U6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIHJlc29sdXRpb25fcmVxdWlyZWRfZm9yX2Nsb3NlZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU1MTczXHU5NUVEXHU1REU1XHU1MzU1XHU2NUY2XHU1RkM1XHU5ODdCXHU1ODZCXHU1MTk5XHU4OUUzXHU1MUIzXHU2NUI5XHU2ODQ4JyxcbiAgICAgIH0sXG4gICAgICBlc2NhbGF0aW9uX3JlYXNvbl9yZXF1aXJlZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU1MzQ3XHU3RUE3XHU1REU1XHU1MzU1XHU2NUY2XHU1RkM1XHU5ODdCXHU1ODZCXHU1MTk5XHU1MzQ3XHU3RUE3XHU1MzlGXHU1NkUwJyxcbiAgICAgIH0sXG4gICAgICBjYXNlX3N0YXR1c19wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU2NUUwXHU2NTQ4XHU3Njg0XHU3MkI2XHU2MDAxXHU2RDQxXHU4RjZDJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NURFNVx1NTM1NScsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTVERTVcdTUzNTUnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU1QkEyXHU2MjM3XHU2NTJGXHU2MzAxXHU1REU1XHU1MzU1XHU0RTBFXHU2NzBEXHU1MkExXHU4QkY3XHU2QzQyJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNhc2VfbnVtYmVyOiB7IGxhYmVsOiAnXHU1REU1XHU1MzU1XHU3RjE2XHU1M0Y3JyB9LFxuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1x1NEUzQlx1OTg5OCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU2M0NGXHU4RkYwJyB9LFxuICAgICAgY3JtX2FjY291bnQ6IHsgbGFiZWw6ICdcdTYyNDBcdTVDNUVcdTVCQTJcdTYyMzcnIH0sXG4gICAgICBjcm1fY29udGFjdDogeyBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEVCQScgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1NzJCNlx1NjAwMScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBuZXc6ICdcdTY1QjBcdTVFRkEnLCBpbl9wcm9ncmVzczogJ1x1NTkwNFx1NzQwNlx1NEUyRCcsXG4gICAgICAgICAgd2FpdGluZ19jdXN0b21lcjogJ1x1N0I0OVx1NUY4NVx1NUJBMlx1NjIzN1x1NTZERVx1NTkwRCcsIHdhaXRpbmdfc3VwcG9ydDogJ1x1N0I0OVx1NUY4NVx1NjUyRlx1NjMwMVx1NTZERVx1NTkwRCcsXG4gICAgICAgICAgZXNjYWxhdGVkOiAnXHU1REYyXHU1MzQ3XHU3RUE3JywgcmVzb2x2ZWQ6ICdcdTVERjJcdTg5RTNcdTUxQjMnLCBjbG9zZWQ6ICdcdTVERjJcdTUxNzNcdTk1RUQnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHByaW9yaXR5OiB7XG4gICAgICAgIC8vIGBjcml0aWNhbGAgTVVTVCBOT1QgcmVuZGVyIFx1N0QyN1x1NjAyNSBcdTIwMTQgdGhhdCB3b3JkIGJlbG9uZ3MgdG9cbiAgICAgICAgLy8gYGNybV90YXNrLnByaW9yaXR5LnVyZ2VudGAsIGFuZCB0aGUgdHdvIHZvY2FidWxhcmllcyBhcmUgZGlmZmVyZW50XG4gICAgICAgIC8vIHNldHMgKGNhc2U6IGxvdy9tZWRpdW0vaGlnaC9jcml0aWNhbCBcdTAwQjcgdGFzazogbG93L25vcm1hbC9oaWdoL3VyZ2VudCkuXG4gICAgICAgIC8vIFdoZW4gYm90aCByZW5kZXJlZCBcdTdEMjdcdTYwMjUgdGhlIHNjcmVlbiBzaG93ZWQgb25lIHdvcmQgZm9yIHR3byB2YWx1ZXMgdGhlXG4gICAgICAgIC8vIG1vZGVsIHRyZWF0cyBhcyBkaXN0aW5jdCwgd2hpY2ggaXMgaG93IGEgY2FzZSB2YWx1ZSBlbmRzIHVwIGluIGEgdGFza1xuICAgICAgICAvLyBwcmVkaWNhdGUgKGBzcmMvc2FsZXMvdmlld3MvdGFzay52aWV3LnRzYCBjYXJyaWVzIHRoZSB0b21ic3RvbmUgb2YgdGhhdFxuICAgICAgICAvLyBjcm9zc2luZykuIE1haW50YWluZXIgcnVsaW5nIDIwMjYtMDgtMzEsICMxMzQyOiBjYXNlIGBjcml0aWNhbGAgaXNcbiAgICAgICAgLy8gXHU0RTI1XHU5MUNELCB0YXNrIGB1cmdlbnRgIGtlZXBzIFx1N0QyN1x1NjAyNS4gZW4vZXMtRVMvamEtSlAgYWxyZWFkeSBzZXBhcmF0ZSB0aGVtXG4gICAgICAgIC8vIChDcml0aWNhbC9VcmdlbnQgXHUwMEI3IENyXHUwMEVEdGljYS9VcmdlbnRlIFx1MDBCNyBcdTkxQ0RcdTU5MjcvXHU3RENBXHU2MDI1KTsgemgtQ04gd2FzIHRoZSBvdXRsaWVyLlxuICAgICAgICBsYWJlbDogJ1x1NEYxOFx1NTE0OFx1N0VBNycsXG4gICAgICAgIG9wdGlvbnM6IHsgbG93OiAnXHU0RjRFJywgbWVkaXVtOiAnXHU0RTJEJywgaGlnaDogJ1x1OUFEOCcsIGNyaXRpY2FsOiAnXHU0RTI1XHU5MUNEJyB9LFxuICAgICAgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTdDN0JcdTU3OEInLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcXVlc3Rpb246ICdcdTU0QThcdThCRTInLCBwcm9ibGVtOiAnXHU2NTQ1XHU5NjlDJywgZmVhdHVyZV9yZXF1ZXN0OiAnXHU1MjlGXHU4MEZEXHU5NzAwXHU2QzQyJywgYnVnOiAnXHU3RjNBXHU5Njc3JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1OEQxRlx1OEQyM1x1NEVCQScgfSxcbiAgICAgIG9yaWdpbjoge1xuICAgICAgICBsYWJlbDogJ1x1NURFNVx1NTM1NVx1Njc2NVx1NkU5MCcsXG4gICAgICAgIG9wdGlvbnM6IHsgZW1haWw6ICdcdTkwQUVcdTRFRjYnLCBwaG9uZTogJ1x1NzUzNVx1OEJERCcsIHdlYjogJ1x1N0Y1MVx1N0FEOScsIGNoYXQ6ICdcdTU3MjhcdTdFQkZcdTVCQTJcdTY3MEQnLCBzb2NpYWxfbWVkaWE6ICdcdTc5M0VcdTRFQTRcdTVBOTJcdTRGNTMnIH0sXG4gICAgICB9LFxuICAgICAgY2xvc2VkX2RhdGU6IHsgbGFiZWw6ICdcdTUxNzNcdTk1RURcdTY1RTVcdTY3MUYnIH0sXG4gICAgICBmaXJzdF9yZXNwb25zZV9kYXRlOiB7IGxhYmVsOiAnXHU5OTk2XHU2QjIxXHU1NENEXHU1RTk0XHU2NUU1XHU2NzFGJyB9LFxuICAgICAgcmVzb2x1dGlvbl90aW1lX2hvdXJzOiB7IGxhYmVsOiAnXHU4OUUzXHU1MUIzXHU4MDE3XHU2NUY2XHVGRjA4XHU1QzBGXHU2NUY2XHVGRjA5JyB9LFxuICAgICAgc2xhX2R1ZV9kYXRlOiB7IGxhYmVsOiAnU0xBIFx1NTIzMFx1NjcxRicsIGhlbHA6ICdcdTYzMDlcdTVERTVcdTUzNTVcdTRGMThcdTUxNDhcdTdFQTdcdTRFMEVcdTYyNDBcdTVDNUVcdTVCQTJcdTYyMzdcdTc2ODRcdTVCQTJcdTYyMzdcdTUyMDZcdTVDNDJcdThCQkVcdTVCOUFcdUZGMENcdTRFRTVcdTY1RTVcdTUzODZcdTVDMEZcdTY1RjZcdThCQTFcdUZGMUFcdTU5MUNcdTk1RjRcdTMwMDFcdTU0NjhcdTY3MkJcdTRFMEVcdTgyODJcdTUwNDdcdTY1RTVcdTkwRkRcdThCQTFcdTUxNjVcdTMwMDInIH0sXG4gICAgICBpc19zbGFfdmlvbGF0ZWQ6IHsgbGFiZWw6ICdTTEEgXHU4RkREXHU1M0NEJyB9LFxuICAgICAgaXNfZXNjYWxhdGVkOiB7IGxhYmVsOiAnXHU1REYyXHU1MzQ3XHU3RUE3JyB9LFxuICAgICAgZXNjYWxhdGlvbl9yZWFzb246IHsgbGFiZWw6ICdcdTUzNDdcdTdFQTdcdTUzOUZcdTU2RTAnIH0sXG4gICAgICByZXNvbHV0aW9uOiB7IGxhYmVsOiAnXHU4OUUzXHU1MUIzXHU2NUI5XHU2ODQ4JyB9LFxuICAgICAgcmVzb2x2ZWRfYnlfYXJ0aWNsZTogeyBsYWJlbDogJ1x1ODlFM1x1NTFCM1x1OEJFNVx1NURFNVx1NTM1NVx1NzY4NFx1NzdFNVx1OEJDNlx1NjU4N1x1N0FFMCcsIGhlbHA6ICdcdTg5RTNcdTUxQjNcdTZCNjRcdTVERTVcdTUzNTVcdTc2ODRcdTc3RTVcdThCQzZcdTVFOTNcdTY1ODdcdTdBRTAgXHUyMDE0XHUyMDE0IFx1OEY2Q1x1NzlGQlx1NzM4N1x1NzY4NFx1N0VERlx1OEJBMVx1NTNFM1x1NUY4NFx1MzAwMicgfSxcbiAgICAgIGludGVybmFsX25vdGVzOiB7IGxhYmVsOiAnXHU1MTg1XHU5MEU4XHU1OTA3XHU2Q0U4JywgaGVscDogJ1x1NTE4NVx1OTBFOFx1NTkwN1x1NkNFOFx1RkYwQ1x1NUJBMlx1NjIzN1x1NEUwRFx1NTNFRlx1ODlDMScgfSxcbiAgICAgIGlzX2Nsb3NlZDogeyBsYWJlbDogJ1x1NjYyRlx1NTQyNlx1NTE3M1x1OTVFRCcgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTY2M0VcdTc5M0FcdTU0MERcdTc5RjAnIH0sXG4gICAgICBwcmlvcml0eV9yYW5rOiB7IGxhYmVsOiAnXHU0RjE4XHU1MTQ4XHU3RUE3XHU2MzkyXHU1RThGJyB9LFxuICAgICAgZXNjYWxhdGVkX2RhdGU6IHsgbGFiZWw6ICdcdTUzNDdcdTdFQTdcdTY1RTVcdTY3MUYnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9jYXNlczogeyBsYWJlbDogJ1x1NTE2OFx1OTBFOFx1NURFNVx1NTM1NScgfSxcbiAgICAgIGNhc2Vfd29ya2Zsb3c6IHsgbGFiZWw6ICdcdTY3MERcdTUyQTFcdTZENDFcdThGNkMnIH0sXG4gICAgICBzbGFfY2FsZW5kYXI6IHsgbGFiZWw6ICdTTEEgXHU2NUU1XHU1Mzg2JyB9LFxuICAgICAgY2FzZV90aW1lbGluZTogeyBsYWJlbDogJ1x1NURFNVx1NTM1NVx1NjVGNlx1OTVGNFx1N0VCRicgfSxcbiAgICAgIHVuYXNzaWduZWRfdHJpYWdlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU2NzJBXHU1MjA2XHU2RDNFIFx1MjAxNCBcdTVGODVcdTUyMDZcdThCQ0EnLFxuICAgICAgICBlbXB0eVN0YXRlOiB7XG4gICAgICAgICAgdGl0bGU6ICdcdTZDQTFcdTY3MDlcdTVGODVcdTUyMDZcdThCQ0FcdTc2ODRcdTVERTVcdTUzNTUnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdcdTYyNDBcdTY3MDlcdTVERTVcdTUzNTVcdTkwRkRcdTY3MDlcdThEMUZcdThEMjNcdTRFQkFcdTMwMDJcdTVGNTNcdTVERTVcdTUzNTVcdTUyMzBcdThGQkVcdTY1RjZcdTZDQTFcdTY3MDlcdThEMUZcdThEMjNcdTRFQkFcdUZGMENcdTVDMzFcdTRGMUFcdTUxRkFcdTczQjBcdTU3MjhcdThGRDlcdTkxQ0MgXHUyMDE0XHUyMDE0IFx1OTAxQVx1NUUzOFx1NjYyRlx1NTcyOFx1NjVFMFx1NEVCQVx1NjJDNVx1NEVGQlx1MzAwQ1x1NUJBMlx1NjcwRFx1NEUxM1x1NTQ1OFx1MzAwRFx1ODA0Q1x1NEY0RFx1NjcxRlx1OTVGNFx1NjNEMFx1NEVBNFx1NzY4NFx1N0Y1MVx1OTg3NVx1OEY2Q1x1NURFNVx1NTM1NVx1MzAwMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZXNjYWxhdGVkX2Nhc2VzOiB7IGxhYmVsOiAnXHU1REYyXHU1MzQ3XHU3RUE3XHU1REU1XHU1MzU1JyB9LFxuICAgICAgbXlfb3Blbl9jYXNlczogeyBsYWJlbDogJ1x1NjIxMVx1NzY4NFx1NUY4NVx1NTkwNFx1NzQwNlx1NURFNVx1NTM1NScgfSxcbiAgICAgIHNsYV9hdF9yaXNrOiB7IGxhYmVsOiAnXHUyM0YwIFNMQSBcdTk4Q0VcdTk2NjlcdTk4ODRcdThCNjYnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgZXNjYWxhdGVfY2FzZToge1xuICAgICAgICBsYWJlbDogJ1x1NTM0N1x1N0VBN1x1NURFNVx1NTM1NScsXG4gICAgICAgIGNvbmZpcm1UZXh0OiAnXHU2QjY0XHU2NENEXHU0RjVDXHU0RjFBXHU1QzA2XHU1REU1XHU1MzU1XHU1MzQ3XHU3RUE3XHU1MjMwXHU1MzQ3XHU3RUE3XHU1OTA0XHU3NDA2XHU1NkUyXHU5NjFGXHVGRjBDXHU2NjJGXHU1NDI2XHU3RUU3XHU3RUVEXHVGRjFGJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTVERTVcdTUzNTVcdTUzNDdcdTdFQTdcdTYyMTBcdTUyOUZcdUZGMDEnLFxuICAgICAgfSxcbiAgICAgIGNsb3NlX2Nhc2U6IHtcbiAgICAgICAgbGFiZWw6ICdcdTUxNzNcdTk1RURcdTVERTVcdTUzNTUnLFxuICAgICAgICBjb25maXJtVGV4dDogJ1x1Nzg2RVx1NUI5QVx1ODk4MVx1NTE3M1x1OTVFRFx1NkI2NFx1NURFNVx1NTM1NVx1NTQxN1x1RkYxRicsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1REU1XHU1MzU1XHU1REYyXHU2MjEwXHU1MjlGXHU1MTczXHU5NUVEXHVGRjAxJyxcbiAgICAgIH0sXG4gICAgICBjbGFpbV9jYXNlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU4QkE0XHU5ODg2XHU1REU1XHU1MzU1JyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTVERTVcdTUzNTVcdTVERjJcdThCQTRcdTk4ODZcdUZGMENcdTczQjBcdTU3MjhcdTVGNTJcdTRGNjBcdThEMUZcdThEMjNcdTMwMDInLFxuICAgICAgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgLy8gY2FzZS52aWV3LnRzIFx1ODg2OFx1NTM1NVx1NTMzQVx1NTc1N1x1NTQwRFx1NzlGMCAoIzExMDApXHUzMDAyXG4gICAgICBjYXNlOiB7IGxhYmVsOiAnXHU1REU1XHU1MzU1JyB9LFxuICAgICAgaG93X2Nhbl93ZV9oZWxwOiB7IGxhYmVsOiAnXHU2MjExXHU0RUVDXHU4MEZEXHU1RTJFXHU2MEE4XHU0RUMwXHU0RTQ4XHVGRjFGJyB9LFxuICAgICAgLy8gT2JqZWN0LWxldmVsIHNlY3Rpb24ga2V5cyAoY2FzZS5vYmplY3QudHMpLCB1c2VkIGJ5IHJlY29yZCBmb3JtcyBhbmRcbiAgICAgIC8vIGJ5IHRoZSBkZXRhaWwgcGFnZSwgd2hvc2Ugc2VjdGlvbnMgcmVmZXJlbmNlIHRoZXNlIGdyb3VwcyAoIzk3MClcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnXHU1REU1XHU1MzU1XHU0RkUxXHU2MDZGJyB9LFxuICAgICAgb3JpZ2luOiB7IGxhYmVsOiAnXHU2NzY1XHU2RTkwXHU0RTBFXHU4REVGXHU3NTMxJyB9LFxuICAgICAgc2xhOiB7IGxhYmVsOiAnU0xBIFx1NEUwRVx1NEYxOFx1NTE0OFx1N0VBNycgfSxcbiAgICAgIHJlc29sdXRpb246IHsgbGFiZWw6ICdcdTg5RTNcdTUxQjNcdTY1QjlcdTY4NDgnIH0sXG4gICAgICBlc2NhbGF0aW9uOiB7IGxhYmVsOiAnXHU1MzQ3XHU3RUE3JyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnXHU3Q0ZCXHU3RURGJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9rbm93bGVkZ2VfYXJ0aWNsZToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgcHVibGlzaGVkX3JlcXVpcmVzX2JvZHk6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NkNBMVx1NjcwOVx1NkI2M1x1NjU4N1x1NzY4NFx1NjU4N1x1N0FFMFx1NjVFMFx1NkNENVx1NTNEMVx1NUUwM1x1MzAwMicsXG4gICAgICB9LFxuICAgICAgcHVibGlzaGVkX3JlcXVpcmVzX3N1bW1hcnk6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NURGMlx1NTNEMVx1NUUwM1x1NzY4NFx1NjU4N1x1N0FFMFx1NUU5NFx1NTg2Qlx1NTE5OVx1NjQ1OFx1ODk4MVx1RkYwQ1x1NEY5Qlx1NjQxQ1x1N0QyMlx1N0VEM1x1Njc5Q1x1NEUwRSBBSSBcdTVGMTVcdTc1MjhcdTRGN0ZcdTc1MjhcdTMwMDInLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU3N0U1XHU4QkM2XHU2NTg3XHU3QUUwJyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1NzdFNVx1OEJDNlx1NUU5MycsXG4gICAgZGVzY3JpcHRpb246ICdcdTk3NjJcdTU0MTFcdTVCQTJcdTYyMzdcdTU0OENcdTU3NTBcdTVFMkRcdTc2ODRcdTUzRUZcdTU5MERcdTc1MjhcdTk1RUVcdTdCNTRcdTRFMEVcdTY0Q0RcdTRGNUNcdTYzMDdcdTUzNTcnLFxuICAgIGZpZWxkczoge1xuICAgICAgYXJ0aWNsZV9udW1iZXI6IHsgbGFiZWw6ICdcdTY1ODdcdTdBRTBcdTdGMTZcdTUzRjcnIH0sXG4gICAgICB0aXRsZTogeyBsYWJlbDogJ1x1NjgwN1x1OTg5OCcgfSxcbiAgICAgIHN1bW1hcnk6IHsgbGFiZWw6ICdcdTY0NThcdTg5ODEnLCBoZWxwOiAnXHU0RTAwXHU2QkI1XHU4QkREXHU2NDU4XHU4OTgxXHVGRjBDXHU2NjNFXHU3OTNBXHU1NzI4XHU2NDFDXHU3RDIyXHU3RUQzXHU2NzlDXHU1NDhDIEFJIFx1NUYxNVx1NzUyOFx1NEUyRFx1MzAwMicgfSxcbiAgICAgIGJvZHk6IHsgbGFiZWw6ICdcdTZCNjNcdTY1ODcnLCBoZWxwOiAnXHU2NTg3XHU3QUUwXHU2QjYzXHU2NTg3XHVGRjA4TWFya2Rvd25cdUZGMDlcdTMwMDInIH0sXG4gICAgICBjYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ1x1NTIwNlx1N0M3QicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQ6ICdcdTUxNjVcdTk1RThcdTYzMDdcdTUzNTcnLCBob3dfdG86ICdcdTY0Q0RcdTRGNUNcdTYzMDdcdTUzNTcnLFxuICAgICAgICAgIHRyb3VibGVzaG9vdGluZzogJ1x1NjU0NVx1OTY5Q1x1NjM5Mlx1NjdFNScsIGJpbGxpbmc6ICdcdThEMjZcdTUyQTFcdTRFMEVcdTRFRjdcdTY4M0MnLCBhcGk6ICdBUEkgXHU0RTBFXHU5NkM2XHU2MjEwJyxcbiAgICAgICAgICByZWxlYXNlX25vdGVzOiAnXHU3MjQ4XHU2NzJDXHU4QkY0XHU2NjBFJyxcbiAgICAgICAgICBwb2xpY3k6ICdcdTY1M0ZcdTdCNTZcdTUyMzZcdTVFQTYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY4MDdcdTdCN0UnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYXV0aDogJ1x1OEVBQlx1NEVGRFx1OEJBNFx1OEJDMScsIHNzbzogJ1x1NTM1NVx1NzBCOVx1NzY3Qlx1NUY1NScsIG1vYmlsZTogJ1x1NzlGQlx1NTJBOFx1N0FFRicsIGVtYWlsOiAnXHU5MEFFXHU0RUY2JyxcbiAgICAgICAgICByZXBvcnRzOiAnXHU2MkE1XHU4ODY4JywgcGVyZm9ybWFuY2U6ICdcdTYwMjdcdTgwRkQnLCBkYXRhX2ltcG9ydDogJ1x1NjU3MFx1NjM2RVx1NUJGQ1x1NTE2NScsIHdlYmhvb2tzOiAnV2ViaG9vaycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3MkI2XHU2MDAxJyxcbiAgICAgICAgb3B0aW9uczogeyBkcmFmdDogJ1x1ODM0OVx1N0EzRicsIGluX3JldmlldzogJ1x1NUJBMVx1NjgzOFx1NEUyRCcsIHB1Ymxpc2hlZDogJ1x1NURGMlx1NTNEMVx1NUUwMycsIGFyY2hpdmVkOiAnXHU1REYyXHU1RjUyXHU2ODYzJyB9LFxuICAgICAgfSxcbiAgICAgIGF1ZGllbmNlOiB7IGxhYmVsOiAnXHU1M0Q3XHU0RjE3Jywgb3B0aW9uczogeyBwdWJsaWM6ICdcdTUxNkNcdTVGMDAnLCBpbnRlcm5hbDogJ1x1NEVDNVx1NTE4NVx1OTBFOCcgfSwgaGVscDogJ1x1NTE2Q1x1NUYwMFx1NjU4N1x1N0FFMFx1NTcyOFx1NUJBMlx1NjIzN1x1OTVFOFx1NjIzN1x1NTNFRlx1ODlDMVx1RkYxQlx1NTE4NVx1OTBFOFx1NjU4N1x1N0FFMFx1NEVDNVx1NUJBMlx1NjcwRFx1NTNFRlx1ODlDMVx1MzAwMicgfSxcbiAgICAgIGxhbmd1YWdlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU4QkVEXHU4QTAwJyxcbiAgICAgICAgb3B0aW9uczogeyBlbjogJ1x1ODJGMVx1OEJFRCcsIHpoX2NuOiAnXHU3QjgwXHU0RjUzXHU0RTJEXHU2NTg3JywgZXNfZXM6ICdcdTg5N0ZcdTczRURcdTcyNTlcdThCRUQnLCBqYV9qcDogJ1x1NjVFNVx1OEJFRCcgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1OEQxRlx1OEQyM1x1NEVCQScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY2FzZTogeyBsYWJlbDogJ1x1Njc2NVx1NkU5MFx1NURFNVx1NTM1NScsIGhlbHA6ICdcdTY3MkNcdTY1ODdcdTYyNDBcdTRGOURcdTYzNkVcdTc2ODRcdTVERTVcdTUzNTVcdUZGMDhcdTUzRUZcdTkwMDlcdUZGMDlcdTMwMDInIH0sXG4gICAgICBwdWJsaXNoZWRfYXQ6IHsgbGFiZWw6ICdcdTUzRDFcdTVFMDNcdTY1RjZcdTk1RjQnIH0sXG4gICAgICBsYXN0X3Jldmlld2VkX2F0OiB7IGxhYmVsOiAnXHU2NzAwXHU4RkQxXHU1OTBEXHU2ODM4JyB9LFxuICAgICAgaGVscGZ1bF9jb3VudDogeyBsYWJlbDogJ1x1NjcwOVx1NzUyOCcsIGhlbHA6ICdcdTc1MzEgY3JtX2FydGljbGVfZmVlZGJhY2sgXHU5MUNEXHU2NUIwXHU3RURGXHU4QkExXHU1Rjk3XHU1MUZBXHVGRjBDXHU0RTBEXHU1M0VGXHU2MjRCXHU1REU1XHU1ODZCXHU1MTk5XHUzMDAyJyB9LFxuICAgICAgbm90X2hlbHBmdWxfY291bnQ6IHsgbGFiZWw6ICdcdTZDQTFcdTc1MjgnLCBoZWxwOiAnXHU3NTMxIGNybV9hcnRpY2xlX2ZlZWRiYWNrIFx1OTFDRFx1NjVCMFx1N0VERlx1OEJBMVx1NUY5N1x1NTFGQVx1RkYwQ1x1NEUwRFx1NTNFRlx1NjI0Qlx1NURFNVx1NTg2Qlx1NTE5OVx1MzAwMicgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTY2M0VcdTc5M0FcdTU0MERcdTc5RjAnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9hcnRpY2xlczogeyBsYWJlbDogJ1x1NTE2OFx1OTBFOFx1NjU4N1x1N0FFMCcgfSxcbiAgICAgIHB1Ymxpc2hlZF9hcnRpY2xlczogeyBsYWJlbDogJ1x1NURGMlx1NTNEMVx1NUUwMycgfSxcbiAgICAgIG15X2RyYWZ0czogeyBsYWJlbDogJ1x1NjIxMVx1NzY4NFx1ODM0OVx1N0EzRicgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTY1ODdcdTdBRTBcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBjb250ZW50OiB7IGxhYmVsOiAnXHU1MTg1XHU1QkI5JyB9LFxuICAgICAgdGF4b25vbXk6IHsgbGFiZWw6ICdcdTUyMDZcdTdDN0InIH0sXG4gICAgICBtZXRyaWNzOiB7IGxhYmVsOiAnXHU0RTkyXHU1MkE4XHU2NTcwXHU2MzZFJyB9LFxuICAgICAgZW5nYWdlbWVudDogeyBsYWJlbDogJ1x1NEU5Mlx1NTJBOFx1NjU3MFx1NjM2RScgfSxcbiAgICAgIC8vIGtub3dsZWRnZV9hcnRpY2xlLnZpZXcudHMgXHU4ODY4XHU1MzU1XHU1MzNBXHU1NzU3XHU1NDBEXHU3OUYwICgjMTEwMClcbiAgICAgIGFydGljbGU6IHsgbGFiZWw6ICdcdTY1ODdcdTdBRTAnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgbWFya19hcnRpY2xlX2hlbHBmdWw6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY3MDlcdTc1MjgnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1NURGMlx1OEJCMFx1NUY1NVx1NEUzQVx1MzAwQ1x1NjcwOVx1NzUyOFx1MzAwRFx1RkYwQ1x1OEMyMlx1OEMyMlx1NTNDRFx1OTk4OFx1MzAwMicsXG4gICAgICB9LFxuICAgICAgbWFya19hcnRpY2xlX25vdF9oZWxwZnVsOiB7XG4gICAgICAgIGxhYmVsOiAnXHU2Q0ExXHU3NTI4JyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTVERjJcdThCQjBcdTVGNTVcdTRFM0FcdTMwMENcdTZDQTFcdTc1MjhcdTMwMERcdUZGMENcdThDMjJcdThDMjJcdTUzQ0RcdTk5ODhcdTMwMDInLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fYXJ0aWNsZV9mZWVkYmFjazoge1xuICAgIGxhYmVsOiAnXHU2NTg3XHU3QUUwXHU1M0NEXHU5OTg4JyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1NjU4N1x1N0FFMFx1NTNDRFx1OTk4OCcsXG4gICAgZGVzY3JpcHRpb246ICdcdThCRkJcdTgwMDVcdTVCRjlcdTY3RDBcdTdCQzdcdTc3RTVcdThCQzZcdTY1ODdcdTdBRTBcdTc2ODRcdTMwMENcdTY3MDlcdTc1MjggLyBcdTZDQTFcdTc1MjhcdTMwMERcdThCQzRcdTRFRjcnLFxuICAgIGZpZWxkczoge1xuICAgICAgZmVlZGJhY2tfbnVtYmVyOiB7IGxhYmVsOiAnXHU1M0NEXHU5OTg4XHU3RjE2XHU1M0Y3JyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdThCRkJcdTgwMDUnIH0sXG4gICAgICBjcm1fa25vd2xlZGdlX2FydGljbGU6IHsgbGFiZWw6ICdcdTY1ODdcdTdBRTAnLCBoZWxwOiAnXHU2NzJDXHU2NzYxXHU1M0NEXHU5OTg4XHU5NDg4XHU1QkY5XHU3Njg0XHU3N0U1XHU4QkM2XHU2NTg3XHU3QUUwXHUzMDAyJyB9LFxuICAgICAgdmVyZGljdDoge1xuICAgICAgICBsYWJlbDogJ1x1OEJDNFx1NEVGNycsXG4gICAgICAgIG9wdGlvbnM6IHsgaGVscGZ1bDogJ1x1NjcwOVx1NzUyOCcsIG5vdF9oZWxwZnVsOiAnXHU2Q0ExXHU3NTI4JyB9LFxuICAgICAgfSxcbiAgICAgIGNvbW1lbnQ6IHsgbGFiZWw6ICdcdTU5MDdcdTZDRTgnLCBoZWxwOiAnXHU1M0VGXHU5MDA5XHU4QkY0XHU2NjBFXHVGRjBDXHU0RjVDXHU4MDA1XHU1M0VGXHU4OUMxXHUzMDAyJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1NTNDRFx1OTk4OCcgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9vYmplY3RzLmFjdGl2aXR5LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTlwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04vb2JqZWN0cy5hY3Rpdml0eS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG4vKipcbiAqIFx1N0I4MFx1NEY1M1x1NEUyRFx1NjU4NyAoemgtQ04pIFx1MjAxNCBgb2JqZWN0c2AgdHJhbnNsYXRpb25zIGZvciB0aGUgQUNUSVZJVFkgZmFtaWx5OlxuICogdGhlIGludGVyYWN0aW9uIGxvZyBcdTIwMTQgdGFza3MsIGV2ZW50cywgYW5kIHdobyBhdHRlbmRlZC5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fdGFza2AsIGBjcm1fZXZlbnRgLCBgY3JtX2V2ZW50X2F0dGVuZGVlYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBhY3Rpdml0eTogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX3Rhc2s6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGNvbXBsZXRlZF9kYXRlX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTcyQjZcdTYwMDFcdTRFM0FcdTVERjJcdTVCOENcdTYyMTBcdTY1RjZcdTVGQzVcdTk4N0JcdTU4NkJcdTUxOTlcdTVCOENcdTYyMTBcdTY1RTVcdTY3MUYnLFxuICAgICAgfSxcbiAgICAgIHJlY3VycmVuY2VfZmllbGRzX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTkxQ0RcdTU5MERcdTRFRkJcdTUyQTFcdTVGQzVcdTk4N0JcdTU4NkJcdTUxOTlcdTkxQ0RcdTU5MERcdTdDN0JcdTU3OEInLFxuICAgICAgfSxcbiAgICAgIHJlbGF0ZWRfdG9fcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1ODFGM1x1NUMxMVx1OTcwMFx1ODk4MVx1OTAwOVx1NjJFOVx1NEUwMFx1Njc2MVx1NTE3M1x1ODA1NFx1OEJCMFx1NUY1NScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdcdTRFRkJcdTUyQTEnLFxuICAgIHBsdXJhbExhYmVsOiAnXHU0RUZCXHU1MkExJyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1NkQzQlx1NTJBOFx1NEUwRVx1NUY4NVx1NTI5RVx1NEU4Qlx1OTg3OScsXG4gICAgZmllbGRzOiB7XG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU0RTNCXHU5ODk4JyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdTYzQ0ZcdThGRjAnIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTcyQjZcdTYwMDEnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbm90X3N0YXJ0ZWQ6ICdcdTY3MkFcdTVGMDBcdTU5Q0InLCBpbl9wcm9ncmVzczogJ1x1OEZEQlx1ODg0Q1x1NEUyRCcsIHdhaXRpbmc6ICdcdTdCNDlcdTVGODVcdTRFMkQnLFxuICAgICAgICAgIGNvbXBsZXRlZDogJ1x1NURGMlx1NUI4Q1x1NjIxMCcsIGRlZmVycmVkOiAnXHU1REYyXHU2M0E4XHU4RkRGJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwcmlvcml0eToge1xuICAgICAgICAvLyBgdXJnZW50YCBLRUVQUyBcdTdEMjdcdTYwMjUsIGFuZCBcdTI2RDQgbm90aGluZyBtYXkgcmUtcG9pbnQgaXQgYXQgYGNybV9jYXNlYCdzXG4gICAgICAgIC8vIHRvcCB2YWx1ZTogdGhlIHR3byB2b2NhYnVsYXJpZXMgYXJlIGRpZmZlcmVudCBzZXRzICh0YXNrOlxuICAgICAgICAvLyBsb3cvbm9ybWFsL2hpZ2gvdXJnZW50IFx1MDBCNyBjYXNlOiBsb3cvbWVkaXVtL2hpZ2gvY3JpdGljYWwpLCBzbyB0aGUgdHdvXG4gICAgICAgIC8vIHpoLUNOIHdvcmRzIG11c3Qgc3RheSBkaWZmZXJlbnQgb3IgdGhlIHNjcmVlbiBzdG9wcyBkaXN0aW5ndWlzaGluZ1xuICAgICAgICAvLyB0d28gdmFsdWVzIHRoZSBtb2RlbCB0cmVhdHMgYXMgZGlzdGluY3QgXHUyMDE0IHRoZSBjcm9zc2luZ1xuICAgICAgICAvLyBgc3JjL3NhbGVzL3ZpZXdzL3Rhc2sudmlldy50c2AgY2FycmllcyB0aGUgdG9tYnN0b25lIG9mLiBNYWludGFpbmVyIHJ1bGluZ1xuICAgICAgICAvLyAyMDI2LTA4LTMxLCAjMTM0MjogXHU3RDI3XHU2MDI1IHN0YXlzIGhlcmUgKHVyZ2VudCBpcyB0aGlzIG9iamVjdCdzIGxpdGVyYWxcbiAgICAgICAgLy8gd29yZCkgYW5kIGNhc2UgYGNyaXRpY2FsYCBtb3ZlZCB0byBcdTRFMjVcdTkxQ0QuXG4gICAgICAgIGxhYmVsOiAnXHU0RjE4XHU1MTQ4XHU3RUE3JyxcbiAgICAgICAgb3B0aW9uczogeyBsb3c6ICdcdTRGNEUnLCBub3JtYWw6ICdcdTY2NkVcdTkwMUEnLCBoaWdoOiAnXHU5QUQ4JywgdXJnZW50OiAnXHU3RDI3XHU2MDI1JyB9LFxuICAgICAgfSxcbiAgICAgIGR1ZV9kYXRlOiB7IGxhYmVsOiAnXHU2MjJBXHU2QjYyXHU2NUU1XHU2NzFGJyB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ1x1NEVGQlx1NTJBMVx1N0M3Qlx1NTc4QicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjYWxsOiAnXHU3NTM1XHU4QkREJywgZW1haWw6ICdcdTkwQUVcdTRFRjYnLCBtZWV0aW5nOiAnXHU0RjFBXHU4QkFFJyxcbiAgICAgICAgICBmb2xsb3dfdXA6ICdcdThEREZcdThGREInLCBkZW1vOiAnXHU2RjE0XHU3OTNBJywgb3RoZXI6ICdcdTUxNzZcdTRFRDYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlbWluZGVyX2RhdGU6IHsgbGFiZWw6ICdcdTYzRDBcdTkxOTJcdTY1RjZcdTk1RjQnIH0sXG4gICAgICBjb21wbGV0ZWRfZGF0ZTogeyBsYWJlbDogJ1x1NUI4Q1x1NjIxMFx1NjVFNVx1NjcxRicgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnXHU4RDFGXHU4RDIzXHU0RUJBJyB9LFxuICAgICAgcmVsYXRlZF90b190eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1MTczXHU4MDU0XHU1QkY5XHU4QzYxXHU3QzdCXHU1NzhCJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGNybV9hY2NvdW50OiAnXHU1QkEyXHU2MjM3JywgY3JtX2NvbnRhY3Q6ICdcdTgwNTRcdTdDRkJcdTRFQkEnLCBjcm1fb3Bwb3J0dW5pdHk6ICdcdTU1NDZcdTY3M0EnLFxuICAgICAgICAgIGNybV9sZWFkOiAnXHU3RUJGXHU3RDIyJywgY3JtX2Nhc2U6ICdcdTVERTVcdTUzNTUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlbGF0ZWRfdG9fYWNjb3VudDogeyBsYWJlbDogJ1x1NTE3M1x1ODA1NFx1NUJBMlx1NjIzNycgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY29udGFjdDogeyBsYWJlbDogJ1x1NTE3M1x1ODA1NFx1ODA1NFx1N0NGQlx1NEVCQScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTU1NDZcdTY3M0EnIH0sXG4gICAgICByZWxhdGVkX3RvX2xlYWQ6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTdFQkZcdTdEMjInIH0sXG4gICAgICByZWxhdGVkX3RvX2Nhc2U6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTVERTVcdTUzNTUnIH0sXG4gICAgICBpc19yZWN1cnJpbmc6IHsgbGFiZWw6ICdcdTkxQ0RcdTU5MERcdTRFRkJcdTUyQTEnIH0sXG4gICAgICByZWN1cnJlbmNlX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTkxQ0RcdTU5MERcdTdDN0JcdTU3OEInLFxuICAgICAgICBvcHRpb25zOiB7IGRhaWx5OiAnXHU2QkNGXHU2NUU1Jywgd2Vla2x5OiAnXHU2QkNGXHU1NDY4JywgbW9udGhseTogJ1x1NkJDRlx1NjcwOCcsIHllYXJseTogJ1x1NkJDRlx1NUU3NCcgfSxcbiAgICAgIH0sXG4gICAgICByZWN1cnJlbmNlX2ludGVydmFsOiB7IGxhYmVsOiAnXHU5MUNEXHU1OTBEXHU5NUY0XHU5Njk0JyB9LFxuICAgICAgcmVjdXJyZW5jZV9lbmRfZGF0ZTogeyBsYWJlbDogJ1x1OTFDRFx1NTkwRFx1N0VEM1x1Njc1Rlx1NjVFNVx1NjcxRicgfSxcbiAgICAgIGlzX2NvbXBsZXRlZDogeyBsYWJlbDogJ1x1NjYyRlx1NTQyNlx1NUI4Q1x1NjIxMCcgfSxcbiAgICAgIGlzX292ZXJkdWU6IHsgbGFiZWw6ICdcdTY2MkZcdTU0MjZcdTkwM0VcdTY3MUYnIH0sXG4gICAgICBwcm9ncmVzc19wZXJjZW50OiB7IGxhYmVsOiAnXHU4RkRCXHU1RUE2XHVGRjA4JVx1RkYwOScgfSxcbiAgICAgIHByaW9yaXR5X3Jhbms6IHsgbGFiZWw6ICdcdTRGMThcdTUxNDhcdTdFQTdcdTYzOTJcdTVFOEYnIH0sXG4gICAgICByZW1pbmRlcl9zZW50OiB7IGxhYmVsOiAnXHU2M0QwXHU5MTkyXHU1REYyXHU1M0QxXHU5MDAxJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1NEVGQlx1NTJBMVx1NEZFMVx1NjA2RicgfSxcbiAgICAgIHNjaGVkdWxpbmc6IHsgbGFiZWw6ICdcdTY1RTVcdTdBMEJcdTVCODlcdTYzOTInIH0sXG4gICAgICByZWxhdGVkOiB7IGxhYmVsOiAnXHU1MTczXHU4MDU0XHU4QkIwXHU1RjU1JyB9LFxuICAgICAgcmVjdXJyZW5jZTogeyBsYWJlbDogJ1x1OTFDRFx1NTkwRFx1ODlDNFx1NTIxOScgfSxcbiAgICAgIHN5c3RlbTogeyBsYWJlbDogJ1x1N0NGQlx1N0VERicgfSxcbiAgICAgIGVmZm9ydDogeyBsYWJlbDogJ1x1OEZEQlx1NUVBNlx1NEUwRVx1NURFNVx1NjVGNicgfSxcbiAgICAgIC8vIHRhc2sudmlldy50cyBcdTg4NjhcdTUzNTVcdTUzM0FcdTU3NTdcdTU0MERcdTc5RjAgKCMxMTAwKVxuICAgICAgdGFzazogeyBsYWJlbDogJ1x1NEVGQlx1NTJBMScgfSxcbiAgICAgIHJlbGF0ZWRfcmVjb3JkczogeyBsYWJlbDogJ1x1NTE3M1x1ODA1NFx1OEJCMFx1NUY1NScgfSxcbiAgICAgIHJlY3VycmVuY2VfYW5kX2VmZm9ydDogeyBsYWJlbDogJ1x1OTFDRFx1NTkwRFx1NEUwRVx1NURFNVx1NjVGNicgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX3Rhc2tzOiB7IGxhYmVsOiAnXHU1MTY4XHU5MEU4XHU0RUZCXHU1MkExJyB9LFxuICAgICAgdGFza19ib2FyZDogeyBsYWJlbDogJ1x1NEVGQlx1NTJBMVx1NzcwQlx1Njc3RicgfSxcbiAgICAgIHRhc2tfY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTRFRkJcdTUyQTFcdTY1RTVcdTdBMEInIH0sXG4gICAgICB0YXNrX2dhbnR0OiB7IGxhYmVsOiAnXHU2MjY3XHU4ODRDXHU4QkExXHU1MjEyJyB9LFxuICAgICAgdGFza190aW1lbGluZTogeyBsYWJlbDogJ1x1NURFNVx1NjVGNlx1NjVGNlx1OTVGNFx1N0VCRicgfSxcbiAgICAgIG15X29wZW5fdGFza3M6IHsgbGFiZWw6ICdcdTYyMTFcdTc2ODRcdTVGODVcdTUyOUVcdTRFRkJcdTUyQTEnIH0sXG4gICAgICB0b2RheXNfdGFza3M6IHsgbGFiZWw6ICdcdUQ4M0RcdURDQzUgXHU2MjExXHU3Njg0XHU0RjE4XHU1MTQ4XHU0RUZCXHU1MkExJyB9LFxuICAgICAgb3ZlcmR1ZV90YXNrczogeyBsYWJlbDogJ1x1MjNGMCBcdTVGODVcdTUyOUVcdTRFRkJcdTUyQTEgXHUwMEI3IFx1NjMwOVx1OTAzRVx1NjcxRlx1NjVGNlx1OTU3Rlx1NjM5Mlx1NUU4RicgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fZXZlbnQ6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGVuZF9hZnRlcl9zdGFydDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU3RUQzXHU2NzVGXHU2NUY2XHU5NUY0XHU1RkM1XHU5ODdCXHU2NjVBXHU0RThFXHU1RjAwXHU1OUNCXHU2NUY2XHU5NUY0JyxcbiAgICAgIH0sXG4gICAgICByZWxhdGVkX3RvX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTgxRjNcdTVDMTFcdTk3MDBcdTg5ODFcdTkwMDlcdTYyRTlcdTRFMDBcdTY3NjFcdTUxNzNcdTgwNTRcdThCQjBcdTVGNTUnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU2RDNCXHU1MkE4JyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1NkQzQlx1NTJBOCcsXG4gICAgZGVzY3JpcHRpb246ICdcdTRFMEVcdTVCQTJcdTYyMzdcdTc2ODRcdTRGMUFcdThCQUVcdTMwMDFcdTkwMUFcdThCRERcdTUzQ0FcdTUxNzZcdTRFRDZcdTVERjJcdTVCODlcdTYzOTJcdTc2ODRcdTRFOTJcdTUyQTgnLFxuICAgIGZpZWxkczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1x1NEUzQlx1OTg5OCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU2M0NGXHU4RkYwJyB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ1x1NkQzQlx1NTJBOFx1N0M3Qlx1NTc4QicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtZWV0aW5nOiAnXHU0RjFBXHU4QkFFJywgY2FsbDogJ1x1NzUzNVx1OEJERCcsIGRlbW86ICdcdTZGMTRcdTc5M0EnLFxuICAgICAgICAgIHdlYmluYXI6ICdcdTdFQkZcdTRFMEFcdTc4MTRcdThCQThcdTRGMUEnLCBvbnNpdGVfdmlzaXQ6ICdcdTRFMEFcdTk1RThcdTYyRENcdThCQkYnLCBvdGhlcjogJ1x1NTE3Nlx1NEVENicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3MkI2XHU2MDAxJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHBsYW5uZWQ6ICdcdTVERjJcdThCQTFcdTUyMTInLCBoZWxkOiAnXHU1REYyXHU0RTNFXHU4ODRDJywgY2FuY2VsbGVkOiAnXHU1REYyXHU1M0Q2XHU2RDg4Jywgbm9fc2hvdzogJ1x1NUJBMlx1NjIzN1x1NjcyQVx1NTIzMCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdThEMUZcdThEMjNcdTRFQkEnIH0sXG4gICAgICBzdGFydF9kYXRldGltZTogeyBsYWJlbDogJ1x1NUYwMFx1NTlDQlx1NjVGNlx1OTVGNCcgfSxcbiAgICAgIGVuZF9kYXRldGltZTogeyBsYWJlbDogJ1x1N0VEM1x1Njc1Rlx1NjVGNlx1OTVGNCcgfSxcbiAgICAgIGFsbF9kYXk6IHsgbGFiZWw6ICdcdTUxNjhcdTU5MjlcdTZEM0JcdTUyQTgnIH0sXG4gICAgICBkdXJhdGlvbl9taW51dGVzOiB7IGxhYmVsOiAnXHU2NUY2XHU5NTdGXHVGRjA4XHU1MjA2XHU5NDlGXHVGRjA5JyB9LFxuICAgICAgbG9jYXRpb246IHsgbGFiZWw6ICdcdTU3MzBcdTcwQjknLCBoZWxwOiAnXHU0RjFBXHU4QkFFXHU1QkE0XHUzMDAxXHU1NzMwXHU1NzQwXHU2MjE2XHU0RjFBXHU4QkFFXHU5NEZFXHU2M0E1JyB9LFxuICAgICAgcmVsYXRlZF90b190eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1MTczXHU4MDU0XHU1QkY5XHU4QzYxXHU3QzdCXHU1NzhCJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGNybV9hY2NvdW50OiAnXHU1QkEyXHU2MjM3JywgY3JtX2NvbnRhY3Q6ICdcdTgwNTRcdTdDRkJcdTRFQkEnLCBjcm1fb3Bwb3J0dW5pdHk6ICdcdTU1NDZcdTY3M0EnLFxuICAgICAgICAgIGNybV9sZWFkOiAnXHU3RUJGXHU3RDIyJywgY3JtX2Nhc2U6ICdcdTVERTVcdTUzNTUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlbGF0ZWRfdG9fYWNjb3VudDogeyBsYWJlbDogJ1x1NTE3M1x1ODA1NFx1NUJBMlx1NjIzNycgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY29udGFjdDogeyBsYWJlbDogJ1x1NTE3M1x1ODA1NFx1ODA1NFx1N0NGQlx1NEVCQScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTU1NDZcdTY3M0EnIH0sXG4gICAgICByZWxhdGVkX3RvX2xlYWQ6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTdFQkZcdTdEMjInIH0sXG4gICAgICByZWxhdGVkX3RvX2Nhc2U6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdTVERTVcdTUzNTUnIH0sXG4gICAgICBvdXRjb21lX25vdGVzOiB7IGxhYmVsOiAnXHU0RjFBXHU1NDBFXHU3RUFBXHU4OTgxJywgaGVscDogJ1x1OEZCRVx1NjIxMFx1NEU4Nlx1NEVDMFx1NEU0OFx1NTE3MVx1OEJDNlx1RkYwQ1x1NEUwQlx1NEUwMFx1NkI2NVx1NTA1QVx1NEVDMFx1NEU0OCcgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTZEM0JcdTUyQThcdTRGRTFcdTYwNkYnIH0sXG4gICAgICBzY2hlZHVsZTogeyBsYWJlbDogJ1x1NjVFNVx1N0EwQlx1NUI4OVx1NjM5MicgfSxcbiAgICAgIHJlbGF0ZWQ6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdThCQjBcdTVGNTUnIH0sXG4gICAgICBvdXRjb21lOiB7IGxhYmVsOiAnXHU3RUQzXHU2NzlDJyB9LFxuICAgICAgLy8gZXZlbnQudmlldy50cyBcdTg4NjhcdTUzNTVcdTUzM0FcdTU3NTdcdTU0MERcdTc5RjAgKCMxMTAwKVxuICAgICAgZXZlbnQ6IHsgbGFiZWw6ICdcdTZEM0JcdTUyQTgnIH0sXG4gICAgICByZWxhdGVkX3JlY29yZHM6IHsgbGFiZWw6ICdcdTUxNzNcdTgwNTRcdThCQjBcdTVGNTUnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9ldmVudHM6IHsgbGFiZWw6ICdcdTUxNjhcdTkwRThcdTZEM0JcdTUyQTgnIH0sXG4gICAgICBldmVudF9jYWxlbmRhcjogeyBsYWJlbDogJ1x1NkQzQlx1NTJBOFx1NjVFNVx1NTM4NicgfSxcbiAgICAgIGV2ZW50X3RpbWVsaW5lOiB7IGxhYmVsOiAnXHU1NkUyXHU5NjFGXHU2NUU1XHU3QTBCJyB9LFxuICAgICAgbXlfZXZlbnRzOiB7IGxhYmVsOiAnXHU2MjExXHU3Njg0XHU2NUU1XHU1Mzg2JyB9LFxuICAgICAgdXBjb21pbmdfZXZlbnRzOiB7IGxhYmVsOiAnXHVEODNEXHVEQ0M1IFx1NTM3M1x1NUMwNlx1NUYwMFx1NTlDQiBcdTAwQjcgXHU2MzA5XHU2NUY2XHU5NUY0XHU1MzQ3XHU1RThGJyB9LFxuICAgICAgaGVsZF9ldmVudHM6IHsgbGFiZWw6ICdcdTI3MDUgXHU0RTkyXHU1MkE4XHU1Mzg2XHU1M0YyJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9ldmVudF9hdHRlbmRlZToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgYXR0ZW5kZWVfcmVzb2x2ZXM6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NTNDMlx1NEUwRVx1ODAwNVx1NUZDNVx1OTg3Qlx1NTg2Qlx1NTE5OVx1NTE3Nlx1NTNDMlx1NEUwRVx1ODAwNVx1N0M3Qlx1NTc4Qlx1NjI0MFx1NjMwN1x1NzY4NFx1NEUwMFx1NjVCOVx1MjAxNFx1MjAxNFx1ODA1NFx1N0NGQlx1NEVCQVx1N0M3Qlx1NTc4Qlx1OTcwMFx1ODk4MVx1NTg2Qlx1NTE5OVx1ODA1NFx1N0NGQlx1NEVCQVx1RkYwQ1x1NTkxNlx1OTBFOFx1N0M3Qlx1NTc4Qlx1OTcwMFx1ODk4MVx1NTg2Qlx1NTE5OVx1NTkxNlx1OTBFOFx1NTNDMlx1NEUwRVx1ODAwNVx1NTlEM1x1NTQwRCcsXG4gICAgICB9LFxuICAgICAgYXR0ZW5kZWVfdHlwZV9leGNsdXNpdmU6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NTNDMlx1NEUwRVx1ODAwNVx1NTNFQVx1ODBGRFx1NjMwN1x1NUI5QVx1NEUwMFx1NjVCOVx1MjAxNFx1MjAxNFx1OEJGN1x1NkUwNVx1N0E3QVx1NTE3Nlx1NTNDMlx1NEUwRVx1ODAwNVx1N0M3Qlx1NTc4Qlx1NjcyQVx1NjMwN1x1NjYwRVx1NzY4NFx1NjI0MFx1NjcwOVx1NUI1N1x1NkJCNScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdcdTZEM0JcdTUyQThcdTUzQzJcdTRFMEVcdTgwMDUnLFxuICAgIHBsdXJhbExhYmVsOiAnXHU2RDNCXHU1MkE4XHU1M0MyXHU0RTBFXHU4MDA1JyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1NTNEN1x1OTA4MFx1NTNDMlx1NTJBMFx1NjIxNlx1NUI5RVx1OTY0NVx1NTFGQVx1NUUyRFx1NkQzQlx1NTJBOFx1NzY4NFx1NEVCQVx1NTQ1OCcsXG4gICAgZmllbGRzOiB7XG4gICAgICBhdHRlbmRlZV9udW1iZXI6IHsgbGFiZWw6ICdcdTUzQzJcdTRFMEVcdTgwMDVcdTdGMTZcdTUzRjcnIH0sXG4gICAgICBjcm1fZXZlbnQ6IHsgbGFiZWw6ICdcdTZEM0JcdTUyQTgnIH0sXG4gICAgICBhdHRlbmRlZV90eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1M0MyXHU0RTBFXHU4MDA1XHU3QzdCXHU1NzhCJyxcbiAgICAgICAgb3B0aW9uczogeyBjb250YWN0OiAnXHU4MDU0XHU3Q0ZCXHU0RUJBJywgbGVhZDogJ1x1N0VCRlx1N0QyMicsIHVzZXI6ICdcdTUxODVcdTkwRThcdTc1MjhcdTYyMzcnLCBleHRlcm5hbDogJ1x1NTkxNlx1OTBFOFx1Njc2NVx1NUJCRScgfSxcbiAgICAgIH0sXG4gICAgICBjcm1fY29udGFjdDogeyBsYWJlbDogJ1x1ODA1NFx1N0NGQlx1NEVCQScsIGhlbHA6ICdcdTUzQzJcdTRFMEVcdTgwMDVcdTY2MkZcdTVERjJcdTY3MDlcdTVCQTJcdTYyMzdcdTgwNTRcdTdDRkJcdTRFQkFcdTY1RjZcdTU4NkJcdTUxOTknIH0sXG4gICAgICBjcm1fbGVhZDogeyBsYWJlbDogJ1x1N0VCRlx1N0QyMicsIGhlbHA6ICdcdTUzQzJcdTRFMEVcdTgwMDVcdTRFQ0RcdTY2MkZcdTY3MkFcdThGNkNcdTUzMTZcdTdFQkZcdTdEMjJcdTY1RjZcdTU4NkJcdTUxOTknIH0sXG4gICAgICBzeXNfdXNlcjogeyBsYWJlbDogJ1x1NTE4NVx1OTBFOFx1NzUyOFx1NjIzNycsIGhlbHA6ICdcdTUzQzJcdTRFMEVcdTgwMDVcdTY2MkZcdTU0MENcdTRFOEJcdTY1RjZcdTU4NkJcdTUxOTknIH0sXG4gICAgICBleHRlcm5hbF9uYW1lOiB7IGxhYmVsOiAnXHU1OTE2XHU5MEU4XHU1M0MyXHU0RTBFXHU4MDA1JywgaGVscDogJ1x1NEUwRFx1NTcyOFx1NEVGQlx1NEY1NSBDUk0gXHU1QkY5XHU4QzYxXHU0RTJEXHU3Njg0XHU1M0MyXHU0RTBFXHU4MDA1XHU1OUQzXHU1NDBEXHUyMDE0XHUyMDE0XHU1M0MyXHU0RTBFXHU4MDA1XHU3QzdCXHU1NzhCXHU0RTNBXHUzMDBDXHU1OTE2XHU5MEU4XHU2NzY1XHU1QkJFXHUzMDBEXHU2NUY2XHU1ODZCXHU1MTk5JyB9LFxuICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgbGFiZWw6ICdcdTU2REVcdTU5MEQnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbm9fcmVzcG9uc2U6ICdcdTY3MkFcdTU2REVcdTU5MEQnLCBhY2NlcHRlZDogJ1x1NURGMlx1NjNBNVx1NTNENycsXG4gICAgICAgICAgZGVjbGluZWQ6ICdcdTVERjJcdTYyRDJcdTdFREQnLCB0ZW50YXRpdmU6ICdcdTVGODVcdTVCOUEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGlzX29yZ2FuaXplcjogeyBsYWJlbDogJ1x1N0VDNFx1N0VDN1x1ODAwNScgfSxcbiAgICAgIGludml0ZWRfZGF0ZTogeyBsYWJlbDogJ1x1OTA4MFx1OEJGN1x1NjVGNlx1OTVGNCcgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTUzQzJcdTRFMEVcdTgwMDUnIH0sXG4gICAgICByZXNwb25zZTogeyBsYWJlbDogJ1x1OTA4MFx1OEJGNycgfSxcbiAgICAgIC8vIGV2ZW50X2F0dGVuZGVlLnZpZXcudHMgXHU4ODY4XHU1MzU1XHU1MzNBXHU1NzU3XHU1NDBEXHU3OUYwICgjMTEwMClcbiAgICAgIGF0dGVuZGVlOiB7IGxhYmVsOiAnXHU1M0MyXHU0RTBFXHU4MDA1JyB9LFxuICAgICAgaW52aXRhdGlvbjogeyBsYWJlbDogJ1x1OTA4MFx1OEJGNycgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2V2ZW50X2F0dGVuZGVlczogeyBsYWJlbDogJ1x1NkQzQlx1NTJBOFx1NTNDMlx1NEUwRVx1ODAwNScgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi9vYmplY3RzLm1hcmtldGluZy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ05cIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOL29iamVjdHMubWFya2V0aW5nLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbi8qKlxuICogXHU3QjgwXHU0RjUzXHU0RTJEXHU2NTg3ICh6aC1DTikgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBNQVJLRVRJTkcgZmFtaWx5OlxuICogZGVtYW5kIGdlbmVyYXRpb24gXHUyMDE0IGNhbXBhaWducyBhbmQgdGhlaXIgbWVtYmVyc2hpcC5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fY2FtcGFpZ25gLCBgY3JtX2NhbXBhaWduX21lbWJlcmAuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvemgtQ04udHNgLlxuICovXG5leHBvcnQgY29uc3QgbWFya2V0aW5nOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fY2FtcGFpZ246IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGVuZF9hZnRlcl9zdGFydDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU3RUQzXHU2NzVGXHU2NUU1XHU2NzFGXHU1RkM1XHU5ODdCXHU2NjVBXHU0RThFXHU1RjAwXHU1OUNCXHU2NUU1XHU2NzFGJyxcbiAgICAgIH0sXG4gICAgICBhY3R1YWxfY29zdF93aXRoaW5fYnVkZ2V0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTVCOUVcdTk2NDVcdTYyMTBcdTY3MkNcdThEODVcdTUxRkFcdTk4ODRcdTdCOTdcdTYyMTBcdTY3MkMnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4JyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCcsXG4gICAgZGVzY3JpcHRpb246ICdcdTVFMDJcdTU3M0FcdTg0MjVcdTk1MDBcdTZEM0JcdTUyQThcdTRFMEVcdTYzQThcdTVFN0YnLFxuICAgIGZpZWxkczoge1xuICAgICAgY2FtcGFpZ25fY29kZTogeyBsYWJlbDogJ1x1NkQzQlx1NTJBOFx1NEVFM1x1NzgwMScgfSxcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdcdTZEM0JcdTUyQThcdTU0MERcdTc5RjAnIH0sXG4gICAgICB0eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3QzdCXHU1NzhCJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGVtYWlsOiAnXHU5MEFFXHU0RUY2XHU4NDI1XHU5NTAwJywgd2ViaW5hcjogJ1x1N0VCRlx1NEUwQVx1NzgxNFx1OEJBOFx1NEYxQScsIHRyYWRlX3Nob3c6ICdcdTVDNTVcdTRGMUEnLFxuICAgICAgICAgIGNvbmZlcmVuY2U6ICdcdTg4NENcdTRFMUFcdTRGMUFcdThCQUUnLCBkaXJlY3RfbWFpbDogJ1x1NzZGNFx1OTBBRScsIHNvY2lhbF9tZWRpYTogJ1x1NzkzRVx1NEVBNFx1NUE5Mlx1NEY1MycsXG4gICAgICAgICAgY29udGVudDogJ1x1NTE4NVx1NUJCOVx1ODQyNVx1OTUwMCcsIHBhcnRuZXI6ICdcdTRGMTlcdTRGMzRcdTgwNTRcdTU0MDhcdTg0MjVcdTk1MDAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1NzJCNlx1NjAwMScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwbGFubmluZzogJ1x1ODlDNFx1NTIxMlx1NEUyRCcsIGluX3Byb2dyZXNzOiAnXHU4RkRCXHU4ODRDXHU0RTJEJyxcbiAgICAgICAgICBjb21wbGV0ZWQ6ICdcdTVERjJcdTVCOENcdTYyMTAnLCBhYm9ydGVkOiAnXHU1REYyXHU0RTJEXHU2QjYyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGFydF9kYXRlOiB7IGxhYmVsOiAnXHU1RjAwXHU1OUNCXHU2NUU1XHU2NzFGJyB9LFxuICAgICAgZW5kX2RhdGU6IHsgbGFiZWw6ICdcdTdFRDNcdTY3NUZcdTY1RTVcdTY3MUYnIH0sXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiB7IGxhYmVsOiAnXHU5ODg0XHU2NzFGXHU2NTM2XHU1MTY1JyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdTYzQ0ZcdThGRjAnIH0sXG4gICAgICBjaGFubmVsOiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RTNCXHU4OTgxXHU2RTIwXHU5MDUzJyxcbiAgICAgICAgb3B0aW9uczogeyBkaWdpdGFsOiAnXHU2NTcwXHU1QjU3XHU2RTIwXHU5MDUzJywgc29jaWFsOiAnXHU3OTNFXHU0RUE0XHU1QTkyXHU0RjUzJywgZW1haWw6ICdcdTkwQUVcdTRFRjYnLCBldmVudHM6ICdcdTdFQkZcdTRFMEJcdTZEM0JcdTUyQTgnLCBwYXJ0bmVyOiAnXHU1NDA4XHU0RjVDXHU0RjE5XHU0RjM0JyB9LFxuICAgICAgfSxcbiAgICAgIGJ1ZGdldGVkX2Nvc3Q6IHsgbGFiZWw6ICdcdTk4ODRcdTdCOTdcdTYyMTBcdTY3MkMnIH0sXG4gICAgICBhY3R1YWxfY29zdDogeyBsYWJlbDogJ1x1NUI5RVx1OTY0NVx1NjIxMFx1NjcyQycgfSxcbiAgICAgIGFjdHVhbF9yZXZlbnVlOiB7IGxhYmVsOiAnXHU1QjlFXHU5NjQ1XHU2NTM2XHU1MTY1JyB9LFxuICAgICAgdGFyZ2V0X3NpemU6IHsgbGFiZWw6ICdcdTc2RUVcdTY4MDdcdTRFQkFcdTY1NzAnLCBoZWxwOiAnXHU3NkVFXHU2ODA3XHU3RUJGXHU3RDIyL1x1ODA1NFx1N0NGQlx1NEVCQVx1NjU3MFx1OTFDRicgfSxcbiAgICAgIG51bV9zZW50OiB7IGxhYmVsOiAnXHU1M0QxXHU5MDAxXHU2NTcwXHU5MUNGJyB9LFxuICAgICAgbnVtX3Jlc3BvbnNlczogeyBsYWJlbDogJ1x1NTRDRFx1NUU5NFx1NjU3MFx1OTFDRicgfSxcbiAgICAgIG51bV9sZWFkczogeyBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1NjU3MFx1OTFDRicgfSxcbiAgICAgIG51bV9jb252ZXJ0ZWRfbGVhZHM6IHsgbGFiZWw6ICdcdTVERjJcdThGNkNcdTUzMTZcdTdFQkZcdTdEMjJcdTY1NzAnIH0sXG4gICAgICBudW1fb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ1x1NURGMlx1NTIxQlx1NUVGQVx1NTU0Nlx1NjczQVx1NjU3MCcgfSxcbiAgICAgIG51bV93b25fb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ1x1NURGMlx1OEQ2Mlx1NUY5N1x1NTU0Nlx1NjczQScgfSxcbiAgICAgIHJlc3BvbnNlX3JhdGU6IHsgbGFiZWw6ICdcdTU0Q0RcdTVFOTRcdTczODdcdUZGMDglXHVGRjA5JyB9LFxuICAgICAgcm9pOiB7IGxhYmVsOiAnXHU2Mjk1XHU4RDQ0XHU1NkRFXHU2MkE1XHU3Mzg3XHVGRjA4JVx1RkYwOScgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnXHU2RDNCXHU1MkE4XHU4RDFGXHU4RDIzXHU0RUJBJyB9LFxuICAgICAgbGFuZGluZ19wYWdlX3VybDogeyBsYWJlbDogJ1x1Nzc0MFx1OTY0Nlx1OTg3NScgfSxcbiAgICAgIGlzX2FjdGl2ZTogeyBsYWJlbDogJ1x1NjYyRlx1NTQyNlx1NTQyRlx1NzUyOCcgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTY2M0VcdTc5M0FcdTU0MERcdTc5RjAnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnXHU2RDNCXHU1MkE4XHU0RkUxXHU2MDZGJyB9LFxuICAgICAgc2NoZWR1bGU6IHsgbGFiZWw6ICdcdTY1RTVcdTdBMEJcdTVCODlcdTYzOTInIH0sXG4gICAgICBidWRnZXQ6IHsgbGFiZWw6ICdcdTk4ODRcdTdCOTdcdTRFMEVcdTYyOTVcdThENDRcdTU2REVcdTYyQTUnIH0sXG4gICAgICBtZXRyaWNzOiB7IGxhYmVsOiAnXHU2NTQ4XHU2NzlDXHU2NTcwXHU2MzZFJyB9LFxuICAgICAgYXNzaWdubWVudDogeyBsYWJlbDogJ1x1NUY1Mlx1NUM1RScgfSxcbiAgICAgIGFzc2V0czogeyBsYWJlbDogJ1x1NkQzQlx1NTJBOFx1N0QyMFx1Njc1MCcgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2NhbXBhaWduczogeyBsYWJlbDogJ1x1NTE2OFx1OTBFOFx1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCcgfSxcbiAgICAgIGNhbXBhaWduX2dhbnR0OiB7IGxhYmVsOiAnXHU2RDNCXHU1MkE4XHU2MzkyXHU2NzFGJyB9LFxuICAgICAgY2FtcGFpZ25fY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTZEM0JcdTUyQThcdTY1RTVcdTUzODYnIH0sXG4gICAgICBjYW1wYWlnbl90aW1lbGluZTogeyBsYWJlbDogJ1x1ODQyNVx1OTUwMFx1NjVGNlx1OTVGNFx1N0VCRicgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7XG4gICAgICBlbnJvbGxfbGVhZHM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTYyNzlcdTkxQ0ZcdTUyQTBcdTUxNjVcdTYyMTBcdTU0NTgnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1N0IyNlx1NTQwOFx1Njc2MVx1NEVGNlx1NzY4NFx1NjIxMFx1NTQ1OFx1NURGMlx1NTJBMFx1NTE2NVx1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOFx1MzAwMicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9jYW1wYWlnbl9tZW1iZXI6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGxlYWRfb3JfY29udGFjdF9yZXF1aXJlZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4XHU2MjEwXHU1NDU4XHU1RkM1XHU5ODdCXHU1MTczXHU4MDU0XHU3RUJGXHU3RDIyXHU2MjE2XHU4MDU0XHU3Q0ZCXHU0RUJBXHU0RTRCXHU0RTAwJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICAvLyBcdTMwMENcdTg0MjVcdTk1MDBcdTZEM0JcdTUyQThcdTYyMTBcdTU0NThcdTMwMEQsIG5vdCBcdTMwMENcdTZEM0JcdTUyQThcdTYyMTBcdTU0NThcdTMwMEQ6IHRoaXMgb2JqZWN0J3MgbWFzdGVyIGlzIGBjcm1fY2FtcGFpZ25gXG4gICAgLy8gKFx1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOCksIHdoaWxlIFx1MzAwQ1x1NkQzQlx1NTJBOFx1MzAwRCBpcyBhbHJlYWR5IHRoaXMgcGFjaydzIGxhYmVsIGZvciBgY3JtX2V2ZW50YCBhbmRcbiAgICAvLyBcdTMwMENcdTZEM0JcdTUyQThcdTUzQzJcdTRFMEVcdTgwMDVcdTMwMEQgaXRzIGNoaWxkIGBjcm1fZXZlbnRfYXR0ZW5kZWVgLiBEcm9wcGluZyBcdTMwMENcdTg0MjVcdTk1MDBcdTMwMEQgcHV0IGFcbiAgICAvLyBtYXJrZXRpbmcgb2JqZWN0IGluc2lkZSB0aGUgY2FsZW5kYXIgZmFtaWx5J3MgbmFtZSBzcGFjZSAoIzgxMCkuXG4gICAgbGFiZWw6ICdcdTg0MjVcdTk1MDBcdTZEM0JcdTUyQThcdTYyMTBcdTU0NTgnLFxuICAgIHBsdXJhbExhYmVsOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4XHU2MjEwXHU1NDU4JyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1ODQyNVx1OTUwMFx1NkQzQlx1NTJBOFx1NjI0MFx1ODlFNlx1OEZCRVx1NzY4NFx1N0VCRlx1N0QyMlx1NEUwRVx1ODA1NFx1N0NGQlx1NEVCQVx1NTNDQVx1NTE3Nlx1NTRDRFx1NUU5NFx1NzJCNlx1NjAwMScsXG4gICAgZmllbGRzOiB7XG4gICAgICBtZW1iZXJfbnVtYmVyOiB7IGxhYmVsOiAnXHU2MjEwXHU1NDU4XHU3RjE2XHU1M0Y3JyB9LFxuICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnXHU4NDI1XHU5NTAwXHU2RDNCXHU1MkE4JyB9LFxuICAgICAgY3JtX2xlYWQ6IHsgbGFiZWw6ICdcdTdFQkZcdTdEMjInLCBoZWxwOiAnXHU2MjEwXHU1NDU4XHU1MkEwXHU1MTY1XHU2NUY2XHU4RUFCXHU0RUZEXHU0RTNBXHU3RUJGXHU3RDIyXHU3Njg0XHVGRjBDXHU4QkIwXHU1RjU1XHU1NzI4XHU2QjY0JyB9LFxuICAgICAgY3JtX2NvbnRhY3Q6IHsgbGFiZWw6ICdcdTgwNTRcdTdDRkJcdTRFQkEnLCBoZWxwOiAnXHU2MjEwXHU1NDU4XHU0RTNBXHU1REYyXHU2NzA5XHU4MDU0XHU3Q0ZCXHU0RUJBXHU3Njg0XHVGRjBDXHU4QkIwXHU1RjU1XHU1NzI4XHU2QjY0JyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3MkI2XHU2MDAxJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHNlbnQ6ICdcdTVERjJcdTUzRDFcdTkwMDEnLCByZXNwb25kZWQ6ICdcdTVERjJcdTU0Q0RcdTVFOTQnLFxuICAgICAgICAgIGNvbnZlcnRlZDogJ1x1NURGMlx1OEY2Q1x1NTMxNicsIHVuc3Vic2NyaWJlZDogJ1x1NURGMlx1OTAwMFx1OEJBMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYWRkZWRfZGF0ZTogeyBsYWJlbDogJ1x1NTJBMFx1NTE2NVx1NjVGNlx1OTVGNCcgfSxcbiAgICAgIHJlc3BvbnNlX2RhdGU6IHsgbGFiZWw6ICdcdTU0Q0RcdTVFOTRcdTY1RjZcdTk1RjQnIH0sXG4gICAgICBoYXNfcmVzcG9uZGVkOiB7IGxhYmVsOiAnXHU1REYyXHU1NENEXHU1RTk0JyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1NTdGQVx1NjcyQ1x1NEZFMVx1NjA2RicgfSxcbiAgICAgIHJlc3BvbnNlOiB7IGxhYmVsOiAnXHU1NENEXHU1RTk0XHU4RERGXHU4RTJBJyB9LFxuICAgIH0sXG4gICAgX2FjdGlvbnM6IHtcbiAgICAgIG1hcmtfcmVzcG9uZGVkOiB7XG4gICAgICAgIGxhYmVsOiAnXHU2ODA3XHU4QkIwXHU0RTNBXHU1REYyXHU1NENEXHU1RTk0JyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTVERjJcdThCQjBcdTVGNTVcdThCRTVcdTg0MjVcdTk1MDBcdTZEM0JcdTUyQThcdTYyMTBcdTU0NThcdTc2ODRcdTU0Q0RcdTVFOTRcdTMwMDInLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy96aC1DTi50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL3poLUNOLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IGFwcFN1cmZhY2UgfSBmcm9tICcuL3poLUNOL2FwcCc7XG5pbXBvcnQgeyBjdXN0b21lciB9IGZyb20gJy4vemgtQ04vb2JqZWN0cy5jdXN0b21lcic7XG5pbXBvcnQgeyBwaXBlbGluZSB9IGZyb20gJy4vemgtQ04vb2JqZWN0cy5waXBlbGluZSc7XG5pbXBvcnQgeyBjb21tZXJjZSB9IGZyb20gJy4vemgtQ04vb2JqZWN0cy5jb21tZXJjZSc7XG5pbXBvcnQgeyBzZXJ2aWNlIH0gZnJvbSAnLi96aC1DTi9vYmplY3RzLnNlcnZpY2UnO1xuaW1wb3J0IHsgYWN0aXZpdHkgfSBmcm9tICcuL3poLUNOL29iamVjdHMuYWN0aXZpdHknO1xuaW1wb3J0IHsgbWFya2V0aW5nIH0gZnJvbSAnLi96aC1DTi9vYmplY3RzLm1hcmtldGluZyc7XG5cbi8qKlxuICogXHU3QjgwXHU0RjUzXHU0RTJEXHU2NTg3ICh6aC1DTikgXHUyMDE0IENSTSBBcHAgVHJhbnNsYXRpb25zXG4gKlxuICogUGVyLWxvY2FsZSBmaWxlOiBvbmUgZmlsZSBwZXIgbGFuZ3VhZ2UsIGZvbGxvd2luZyB0aGUgYHBlcl9sb2NhbGVgIGNvbnZlbnRpb24uXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKlxuICogVGhpcyBidW5kbGUgd2FzIG9uZSBmaWxlIGFuZCBpdCBoYWQgcmVhY2hlZCA4OC42JSBvZiB0aGUgMTAwS0Igc291cmNlIGNhcFxuICogYHBucG0gaHlnaWVuZWAgZW5mb3JjZXMsIGdyb3dpbmcgfjEuMktCIGEgZGF5LiBJdCBpcyBub3cgYXNzZW1ibGVkIGZyb21cbiAqIGAuLzxsb2NhbGU+L2AsIG9uIGFuIGF4aXMgbWVhc3VyZWQgcmF0aGVyIHRoYW4gZ3Vlc3NlZDpcbiAqXG4gKiAgIC0gZXZlcnkgbmFtZXNwYWNlIHRoYXQgaXMgTk9UIGBvYmplY3RzYCBcdTIwMTQgYGFwcHNgLCBgbWVzc2FnZXNgLFxuICogICAgIGBkYXNoYm9hcmRzYCwgYGRhdGFzZXRzYCwgYHBhZ2VzYCwgYW5kIGFueSBuYW1lc3BhY2UgYFRyYW5zbGF0aW9uRGF0YWBcbiAqICAgICBnYWlucyBsYXRlciBcdTIwMTQgbGl2ZXMgaW4gYGFwcC50c2AuIE1lYXN1cmVkOiB0aG9zZSBuYW1lc3BhY2VzIHRvZ2V0aGVyXG4gKiAgICAgYXJlIHVuZGVyIGEgcXVhcnRlciBvZiB0aGUgYnVuZGxlLCBhbmQgdGhlIHNjaGVtYSBib3VuZHMgaG93IG1hbnkgY2FuXG4gKiAgICAgZXZlciBhcnJpdmUsIHNvIG9uZSBmaWxlIGhvbGRzIHRoZW0gd2l0aCByb29tIGxlZnQ7XG4gKiAgIC0gYG9iamVjdHNgIGlzIDY5LTc4JSBvZiBldmVyeSBidW5kbGUsIHNvIGl0IGlzIHBhcnRpdGlvbmVkIGFnYWluLCBvbmVcbiAqICAgICBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSBcdTIwMTQgYGN1c3RvbWVyYCwgYHBpcGVsaW5lYCwgYGNvbW1lcmNlYCxcbiAqICAgICBgc2VydmljZWAsIGBhY3Rpdml0eWAsIGBtYXJrZXRpbmdgIFx1MjAxNCBhbmQgYSBERVRBSUwgb2JqZWN0IGZvbGxvd3MgaXRzXG4gKiAgICAgbWFzdGVyOiBsaW5lIGl0ZW1zIGZvbGxvdyB0aGVpciBxdW90ZSBvciBvcHBvcnR1bml0eSxcbiAqICAgICBgY3JtX2V2ZW50X2F0dGVuZGVlYCBmb2xsb3dzIGBjcm1fZXZlbnRgLCBgY3JtX2NhbXBhaWduX21lbWJlcmBcbiAqICAgICBmb2xsb3dzIGBjcm1fY2FtcGFpZ25gLCBgY3JtX2FydGljbGVfZmVlZGJhY2tgIGZvbGxvd3NcbiAqICAgICBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYC5cbiAqXG4gKiBBIG5hbWVzcGFjZSBheGlzIEFMT05FIHdhcyBtZWFzdXJlZCBhbmQgcmVqZWN0ZWQ6IGl0IGxlYXZlcyBgb2JqZWN0c2AgYXRcbiAqIDY1LjdLQiwgMy45S0IgdW5kZXIgdGhlIGFkdmlzb3J5IGJhbmQsIHdoaWNoIGBvYmplY3RzYCBncm93dGggY3Jvc3NlcyBpblxuICogYWJvdXQgbmluZSBkYXlzLiBUaGUgZmFtaWx5IGF4aXMgcHV0cyB0aGUgbGFyZ2VzdCBwYXJ0IGF0IDI0LjIlIG9mIHRoZSBjYXAuXG4gKlxuICogXHUyNkEwXHVGRTBGIEEgbmV3IG9iamVjdCB0cmFuc2xhdGlvbiBiZWxvbmdzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LiBEbyBub3QgYWRkXG4gKiBpdCB0byB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW4gXHUyMDE0IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3RcbiAqIHRoZSBiYW5kLCB3aGljaCBpcyB3aGF0IHNwbGl0IHRoaXMgYnVuZGxlIGluIHRoZSBmaXJzdCBwbGFjZS5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgQSB2YWx1ZSB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUgZmFtaWx5IGxpdmVzIGluIGA8bG9jYWxlPi9fc2hhcmVkLnRzYC4gQVxuICogdmFsdWUgdXNlZCBieSBleGFjdGx5IG9uZSBmYW1pbHkgbGl2ZXMgaW4gdGhhdCBmYW1pbHkncyBmaWxlLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBUaGUga2V5IG9yZGVyIGJlbG93IGlzIExPQUQtQkVBUklORywgbm90IGNvc21ldGljLiBgb2JqZWN0c3RhY2sgYnVpbGRgXG4gKiBzZXJpYWxpc2VzIHRoaXMgb2JqZWN0IGludG8gYGRpc3Qvb2JqZWN0c3RhY2suanNvbmAgaW4gaW5zZXJ0aW9uIG9yZGVyIGFuZFxuICogbmV2ZXIgc29ydHMgaXQsIHNvIGxpc3RpbmcgdGhlIHJvd3MgaGVyZSBcdTIwMTQgcmF0aGVyIHRoYW4gc3ByZWFkaW5nIHRoZSBmYW1pbHlcbiAqIGZpbGVzIFx1MjAxNCBpcyB3aGF0IGtlZXBzIHRoZSBidWlsdCBhcnRpZmFjdCBieXRlLWlkZW50aWNhbCBhY3Jvc3MgdGhlIHNwbGl0LlxuICogVGhlIG9yZGVyIGlzIHRoaXMgYnVuZGxlJ3Mgb3duIGhpc3RvcmljYWwgYWNjcmV0aW9uIG9yZGVyIGFuZCBkaWZmZXJzXG4gKiBiZXR3ZWVuIGxvY2FsZXM7IHJlb3JkZXJpbmcgaXQgcmV3cml0ZXMgdGhlIGFydGlmYWN0LlxuICovXG5leHBvcnQgY29uc3QgemhDTjogVHJhbnNsYXRpb25EYXRhID0ge1xuICBvYmplY3RzOiB7XG4gICAgY3JtX2FjY291bnQ6IGN1c3RvbWVyLmNybV9hY2NvdW50LFxuICAgIGNybV9jb250YWN0OiBjdXN0b21lci5jcm1fY29udGFjdCxcbiAgICBjcm1fa25vd2xlZGdlX2FydGljbGU6IHNlcnZpY2UuY3JtX2tub3dsZWRnZV9hcnRpY2xlLFxuICAgIGNybV9mb3JlY2FzdDogcGlwZWxpbmUuY3JtX2ZvcmVjYXN0LFxuICAgIGNybV9sZWFkOiBwaXBlbGluZS5jcm1fbGVhZCxcbiAgICBjcm1fcXVvdGU6IGNvbW1lcmNlLmNybV9xdW90ZSxcbiAgICBjcm1fY29udHJhY3Q6IGNvbW1lcmNlLmNybV9jb250cmFjdCxcbiAgICBjcm1fY2FzZTogc2VydmljZS5jcm1fY2FzZSxcbiAgICBjcm1fdGFzazogYWN0aXZpdHkuY3JtX3Rhc2ssXG4gICAgY3JtX2NhbXBhaWduOiBtYXJrZXRpbmcuY3JtX2NhbXBhaWduLFxuICAgIGNybV9wcm9kdWN0OiBjb21tZXJjZS5jcm1fcHJvZHVjdCxcbiAgICBjcm1fb3Bwb3J0dW5pdHk6IHBpcGVsaW5lLmNybV9vcHBvcnR1bml0eSxcbiAgICBjcm1fZXZlbnQ6IGFjdGl2aXR5LmNybV9ldmVudCxcbiAgICBjcm1fZXZlbnRfYXR0ZW5kZWU6IGFjdGl2aXR5LmNybV9ldmVudF9hdHRlbmRlZSxcbiAgICBjcm1fYXJ0aWNsZV9mZWVkYmFjazogc2VydmljZS5jcm1fYXJ0aWNsZV9mZWVkYmFjayxcbiAgICBjcm1fY2FtcGFpZ25fbWVtYmVyOiBtYXJrZXRpbmcuY3JtX2NhbXBhaWduX21lbWJlcixcbiAgICBjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtOiBwaXBlbGluZS5jcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtLFxuICAgIGNybV9xdW90ZV9saW5lX2l0ZW06IGNvbW1lcmNlLmNybV9xdW90ZV9saW5lX2l0ZW0sXG4gIH0sXG4gIC4uLmFwcFN1cmZhY2UsXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQL2FwcC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlBcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQL2FwcC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG5pbXBvcnQgeyBRVU9URV9ESVNDT1VOVF9DRUlMSU5HIH0gZnJvbSAnLi4vLi4vb2JqZWN0cy9fdGhyZXNob2xkcyc7XG5cbi8qKlxuICogXHU2NUU1XHU2NzJDXHU4QTlFIChqYS1KUCkgXHUyMDE0IGV2ZXJ5IHRyYW5zbGF0aW9uIG5hbWVzcGFjZSBFWENFUFQgYG9iamVjdHNgOlxuICogYGFwcHNgLCBgbWVzc2FnZXNgLCBgZGFzaGJvYXJkc2AsIGBkYXRhc2V0c2AsIGBwYWdlc2AsIGBmbG93c2AuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAudHNgLlxuICpcbiAqIEEgbmFtZXNwYWNlIGBUcmFuc2xhdGlvbkRhdGFgIGdhaW5zIGxhdGVyIGxhbmRzIGhlcmUgdG9vLCBhbmQgdGhlIHJvb20gaXNcbiAqIG1lYXN1cmVkOiB0aGlzIGZpbGUgaXMgdGhlIHNtYWxsZXIgaGFsZiBvZiB0aGUgYnVuZGxlLCBhbmQgdGhlIHNjaGVtYSBib3VuZHNcbiAqIGhvdyBtYW55IG5hbWVzcGFjZXMgY2FuIGV2ZXIgYXJyaXZlLlxuICovXG5leHBvcnQgY29uc3QgYXBwU3VyZmFjZTogT21pdDxUcmFuc2xhdGlvbkRhdGEsICdvYmplY3RzJz4gPSB7XG4gIGFwcHM6IHtcbiAgICBjcm1fZW50ZXJwcmlzZToge1xuICAgICAgbGFiZWw6ICdIb3RDUk0nLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTU1QjZcdTY5NkRcdTMwRkJcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjlcdTMwRkJcdTMwREVcdTMwRkNcdTMwQjFcdTMwQzZcdTMwQTNcdTMwRjNcdTMwQjBcdTU0MTFcdTMwNTFcdTk4NjdcdTVCQTJcdTk1QTJcdTRGQzJcdTdCQTFcdTc0MDZcdTMwQjdcdTMwQjlcdTMwQzZcdTMwRTAnLFxuICAgICAgLy8gS2V5ZWQgYnkgbmF2aWdhdGlvbi1ub2RlIGBpZGAgKGEgZmxhdCBrZXlzcGFjZSByZWdhcmRsZXNzIG9mIGRlcHRoKS5cbiAgICAgIG5hdmlnYXRpb246IHtcbiAgICAgICAgbmF2X2hvbWU6IHsgbGFiZWw6ICdcdTMwREJcdTMwRkNcdTMwRTAnIH0sXG5cbiAgICAgICAgZ3JvdXBfc2FsZXM6IHsgbGFiZWw6ICdcdTU1QjZcdTY5NkQnIH0sXG4gICAgICAgIG5hdl9sZWFkOiB7IGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5JyB9LFxuICAgICAgICBuYXZfYWNjb3VudDogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OCcgfSxcbiAgICAgICAgbmF2X2FjY291bnRfd29ya2JlbmNoOiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMEVGXHUzMEZDXHUzMEFGXHUzMEQ5XHUzMEYzXHUzMEMxJyB9LFxuICAgICAgICBuYXZfY29udGFjdDogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNScgfSxcbiAgICAgICAgbmF2X29wcG9ydHVuaXR5OiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3JyB9LFxuICAgICAgICBuYXZfcXVvdGU6IHsgbGFiZWw6ICdcdTg5OEJcdTdBNEQnIH0sXG4gICAgICAgIG5hdl9jb250cmFjdDogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNCcgfSxcbiAgICAgICAgbmF2X3Byb2R1Y3Q6IHsgbGFiZWw6ICdcdTg4RkRcdTU0QzEnIH0sXG4gICAgICAgIG5hdl9zYWxlc19kYXNoYm9hcmQ6IHsgbGFiZWw6ICdcdTU1QjZcdTY5NkRcdTVCOUZcdTdFM0UnIH0sXG5cbiAgICAgICAgZ3JvdXBfd29yazogeyBsYWJlbDogJ1x1MzBERVx1MzBBNFx1MzBFRlx1MzBGQ1x1MzBBRicgfSxcbiAgICAgICAgbmF2X215X3Rhc2tzOiB7IGxhYmVsOiAnXHU3OUMxXHUzMDZFXHUzMEJGXHUzMEI5XHUzMEFGJyB9LFxuICAgICAgICBuYXZfbXlfZGVhbHM6IHsgbGFiZWw6ICdcdTc5QzFcdTMwNkVcdTU1NDZcdThBQzcnIH0sXG4gICAgICAgIG5hdl9teV9sZWFkczogeyBsYWJlbDogJ1x1NzlDMVx1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOScgfSxcbiAgICAgICAgbmF2X215X2Nhc2VzOiB7IGxhYmVsOiAnXHU3OUMxXHUzMDZFXHUzMEIxXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgICBuYXZfbXlfY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTMwREVcdTMwQTRcdTMwQUJcdTMwRUNcdTMwRjNcdTMwQzBcdTMwRkMnIH0sXG4gICAgICAgIG5hdl9hcHByb3ZhbF9yZXF1ZXN0czogeyBsYWJlbDogJ1x1NTNEN1x1NEZFMVx1MzBDOFx1MzBFQ1x1MzBBNCcgfSxcblxuICAgICAgICBncm91cF9hY3Rpdml0eTogeyBsYWJlbDogJ1x1NkQzQlx1NTJENScgfSxcbiAgICAgICAgbmF2X2V2ZW50OiB7IGxhYmVsOiAnXHUzMEE0XHUzMEQ5XHUzMEYzXHUzMEM4JyB9LFxuICAgICAgICBuYXZfYWN0aXZpdHlfZGFzaGJvYXJkOiB7IGxhYmVsOiAnXHU1NUI2XHU2OTZEXHU2RDNCXHU1MkQ1JyB9LFxuXG4gICAgICAgIGdyb3VwX21hcmtldGluZzogeyBsYWJlbDogJ1x1MzBERVx1MzBGQ1x1MzBCMVx1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMCcgfSxcbiAgICAgICAgbmF2X2NhbXBhaWduOiB7IGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzJyB9LFxuXG4gICAgICAgIGdyb3VwX3NlcnZpY2U6IHsgbGFiZWw6ICdcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjknIH0sXG4gICAgICAgIG5hdl9jYXNlOiB7IGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgICBuYXZfa25vd2xlZGdlOiB7IGxhYmVsOiAnXHUzMENBXHUzMEVDXHUzMEMzXHUzMEI4XHUzMEQ5XHUzMEZDXHUzMEI5JyB9LFxuICAgICAgICBuYXZfc2VydmljZV9kYXNoYm9hcmQ6IHsgbGFiZWw6ICdcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjlcdTY5ODJcdTg5ODEnIH0sXG5cbiAgICAgICAgZ3JvdXBfaW5zaWdodHM6IHsgbGFiZWw6ICdcdTMwQTRcdTMwRjNcdTMwQjVcdTMwQTRcdTMwQzgnIH0sXG4gICAgICAgIG5hdl9jcm1fZGFzaGJvYXJkOiB7IGxhYmVsOiAnQ1JNIFx1Njk4Mlx1ODk4MScgfSxcbiAgICAgICAgbmF2X2ZvcmVjYXN0OiB7IGxhYmVsOiAnXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEFEXHUzMEUzXHUzMEI5XHUzMEM4JyB9LFxuICAgICAgICBuYXZfcmVwb3J0X3BpcGVsaW5lX2NvdmVyYWdlOiB7IGxhYmVsOiAnXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHUzMEFCXHUzMEQwXHUzMEVDXHUzMEMzXHUzMEI4JyB9LFxuICAgICAgICBuYXZfcmVwb3J0X2xlYWRfaW5mbG93OiB7IGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU2RDQxXHU1MTY1JyB9LFxuICAgICAgICBuYXZfcmVwb3J0X3NsYTogeyBsYWJlbDogJ1NMQSBcdTVCOUZcdTdFM0UnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIG1lc3NhZ2VzOiB7XG4gICAgJ2NvbW1vbi5zYXZlJzogJ1x1NEZERFx1NUI1OCcsXG4gICAgJ2NvbW1vbi5jYW5jZWwnOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMEJCXHUzMEVCJyxcbiAgICAnY29tbW9uLmRlbGV0ZSc6ICdcdTUyNEFcdTk2NjQnLFxuICAgICdjb21tb24uZWRpdCc6ICdcdTdERThcdTk2QzYnLFxuICAgICdjb21tb24uY3JlYXRlJzogJ1x1NjVCMFx1ODk4Rlx1NEY1Q1x1NjIxMCcsXG4gICAgJ2NvbW1vbi5zZWFyY2gnOiAnXHU2OTFDXHU3RDIyJyxcbiAgICAnY29tbW9uLmZpbHRlcic6ICdcdTMwRDVcdTMwQTNcdTMwRUJcdTMwQkZcdTMwRkMnLFxuICAgICdjb21tb24uZXhwb3J0JzogJ1x1MzBBOFx1MzBBRlx1MzBCOVx1MzBERFx1MzBGQ1x1MzBDOCcsXG4gICAgJ2NvbW1vbi5iYWNrJzogJ1x1NjIzQlx1MzA4QicsXG4gICAgJ2NvbW1vbi5jb25maXJtJzogJ1x1NzhCQVx1OEE4RCcsXG4gICAgJ25hdi5zYWxlcyc6ICdcdTU1QjZcdTY5NkQnLFxuICAgICduYXYuc2VydmljZSc6ICdcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjknLFxuICAgICduYXYubWFya2V0aW5nJzogJ1x1MzBERVx1MzBGQ1x1MzBCMVx1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMCcsXG4gICAgJ25hdi5wcm9kdWN0cyc6ICdcdTg4RkRcdTU0QzEnLFxuICAgICduYXYuYW5hbHl0aWNzJzogJ1x1MzBBMlx1MzBDQVx1MzBFQVx1MzBDNlx1MzBBM1x1MzBBRlx1MzBCOScsXG4gICAgJ3N1Y2Nlc3Muc2F2ZWQnOiAnXHUzMEVDXHUzMEIzXHUzMEZDXHUzMEM5XHUzMDkyXHU0RkREXHU1QjU4XHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGJyxcbiAgICAnc3VjY2Vzcy5jb252ZXJ0ZWQnOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDkyXHU1OTA5XHU2M0RCXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGJyxcbiAgICAnY29uZmlybS5kZWxldGUnOiAnXHUzMDUzXHUzMDZFXHUzMEVDXHUzMEIzXHUzMEZDXHUzMEM5XHUzMDkyXHU1MjRBXHU5NjY0XHUzMDU3XHUzMDY2XHUzMDgyXHUzMDg4XHUzMDhEXHUzMDU3XHUzMDQ0XHUzMDY3XHUzMDU5XHUzMDRCXHVGRjFGJyxcbiAgICAnY29uZmlybS5jb252ZXJ0X2xlYWQnOiAnXHUzMDUzXHUzMDZFXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDkyXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMEZCXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMEZCXHU1NTQ2XHU4QUM3XHUzMDZCXHU1OTA5XHU2M0RCXHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGJyxcbiAgICAnZXJyb3IucmVxdWlyZWQnOiAnXHUzMDUzXHUzMDZFXHU5ODA1XHU3NkVFXHUzMDZGXHU1RkM1XHU5ODA4XHUzMDY3XHUzMDU5JyxcbiAgICAnZXJyb3IubG9hZF9mYWlsZWQnOiAnXHUzMEM3XHUzMEZDXHUzMEJGXHUzMDZFXHU4QUFEXHUzMDdGXHU4RkJDXHUzMDdGXHUzMDZCXHU1OTMxXHU2NTU3XHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGJyxcbiAgfSxcbiAgZGFzaGJvYXJkczoge1xuICAgIHNhbGVzX2FjdGl2aXR5X2Rhc2hib2FyZDoge1xuICAgICAgbGFiZWw6ICdcdTU1QjZcdTY5NkRcdTZEM0JcdTUyRDUnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdThBQjBcdTMwNENcdTMwNjlcdTMwOENcdTMwNjBcdTMwNTFcdTk4NjdcdTVCQTJcdTMwNjhcdThBNzFcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOEJcdTMwNEJcdTMwMDFcdTMwNjlcdTMwNkVcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNENcdTZDODhcdTlFRDlcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOEJcdTMwNEInLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICBpbnRlcmFjdGlvbnNfaGVsZDogeyB0aXRsZTogJ1x1OEExOFx1OTMzMlx1NkUwOFx1MzA3Rlx1MzA2RVx1NUJGRVx1OEE3MScsIGRlc2NyaXB0aW9uOiAnXHU1QjlGXHU5NjlCXHUzMDZCXHU4ODRDXHUzMDhGXHUzMDhDXHUzMDVGXHU5NkZCXHU4QTcxXHUzMDY4XHU0RjFBXHU4QjcwJyB9LFxuICAgICAgICBtZWV0aW5nc19ib29rZWQ6IHsgdGl0bGU6ICdcdThBMkRcdTVCOUFcdTZFMDhcdTMwN0ZcdTMwNkVcdTRGMUFcdThCNzAnLCBkZXNjcmlwdGlvbjogJ1x1MzBBQlx1MzBFQ1x1MzBGM1x1MzBDMFx1MzBGQ1x1NEUwQVx1MzA2Qlx1MzA0Mlx1MzA4QVx1NjcyQVx1NUI5Rlx1NjVCRFx1MzA2RVx1NEYxQVx1OEI3MCcgfSxcbiAgICAgICAgY3VzdG9tZXJfbWludXRlczogeyB0aXRsZTogJ1x1OTg2N1x1NUJBMlx1NjNBNVx1ODlFNlx1NjY0Mlx1OTU5M1x1RkYwOFx1NTIwNlx1RkYwOScsIGRlc2NyaXB0aW9uOiAnXHU5ODY3XHU1QkEyXHUzMDY4XHU1NDExXHUzMDREXHU1NDA4XHUzMDYzXHUzMDVGXHU3RENGXHU2NjQyXHU5NTkzJyB9LFxuICAgICAgICB0YXNrc19jb21wbGV0ZWQ6IHsgdGl0bGU6ICdcdTVCOENcdTRFODZcdTMwQkZcdTMwQjlcdTMwQUYnLCBkZXNjcmlwdGlvbjogJ1x1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1MzA1N1x1MzA1Rlx1MzBENVx1MzBBOVx1MzBFRFx1MzBGQ1x1MzBBMlx1MzBDM1x1MzBENycgfSxcbiAgICAgICAgYWN0aXZpdHlfYnlfcmVwOiB7IHRpdGxlOiAnXHU2MkM1XHU1RjUzXHU4MDA1XHU1MjI1XHUzMDZFXHU2RDNCXHU1MkQ1JywgZGVzY3JpcHRpb246ICdcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNTRcdTMwNjhcdTMwNkVcdThBMThcdTkzMzJcdTZFMDhcdTMwN0ZcdTVCRkVcdThBNzFcdTY1NzAnIH0sXG4gICAgICAgIGFjdGl2aXR5X2J5X3dlZWs6IHsgdGl0bGU6ICdcdTkwMzFcdTZCMjFcdTMwNkVcdTZEM0JcdTUyRDVcdTkxQ0YnLCBkZXNjcmlwdGlvbjogJ1x1OTAzMVx1MzA0Mlx1MzA1Rlx1MzA4QVx1MzA2RVx1NUJGRVx1OEE3MVx1NjU3MCcgfSxcbiAgICAgICAgYWN0aXZpdHlfbWl4OiB7IHRpdGxlOiAnXHU2RDNCXHU1MkQ1XHUzMDZFXHU1MTg1XHU4QTMzJywgZGVzY3JpcHRpb246ICdcdTk2RkJcdThBNzFcdTMwRkJcdTRGMUFcdThCNzBcdTMwRkJcdTMwQzdcdTMwRTJcdTMwNkVcdTZCRDRcdTczODcnIH0sXG4gICAgICAgIGFjdGl2aXR5X2J5X3JlY29yZF90eXBlOiB7IHRpdGxlOiAnXHU2RDNCXHU1MkQ1XHUzMDZFXHU1QkZFXHU4QzYxJywgZGVzY3JpcHRpb246ICdcdTMwRDVcdTMwQTFcdTMwQ0RcdTMwRUJcdTMwNkVcdTMwNjlcdTMwNTNcdTMwNkJcdTZDRThcdTUyOUJcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOEJcdTMwNEInIH0sXG4gICAgICAgIGRlYWxfYWN0aXZpdHk6IHsgdGl0bGU6ICdcdTU1NDZcdThBQzdcdTRFMEFcdTMwNkVcdTVCRkVcdThBNzEnLCBkZXNjcmlwdGlvbjogJ1x1NTU0Nlx1OEFDN1x1MzA2Qlx1N0QxMFx1MzA2NVx1MzA0Rlx1OEExOFx1OTMzMlx1NkUwOFx1MzA3Rlx1NUJGRVx1OEE3MScgfSxcbiAgICAgICAgb3Blbl9kZWFsc19mb3JfYWN0aXZpdHk6IHsgdGl0bGU6ICdcdTMwQUFcdTMwRkNcdTMwRDdcdTMwRjNcdTU1NDZcdThBQzcnLCBkZXNjcmlwdGlvbjogJ1x1OTAzMlx1ODg0Q1x1NEUyRFx1MzA2RVx1NTU0Nlx1OEFDN1x1NjU3MCcgfSxcbiAgICAgICAgcXVpZXRfYWNjb3VudHNfMzA6IHsgdGl0bGU6ICczMCBcdTY1RTVcdTRFRTVcdTRFMEFcdTZDODhcdTlFRDknLCBkZXNjcmlwdGlvbjogJzEgXHUzMDRCXHU2NzA4XHU5NTkzXHU1QkZFXHU4QTcxXHU4QTE4XHU5MzMyXHUzMDZFXHUzMDZBXHUzMDQ0XHUzMEEyXHUzMEFGXHUzMEM2XHUzMEEzXHUzMEQ2XHU1M0Q2XHU1RjE1XHU1MTQ4JyB9LFxuICAgICAgICBxdWlldF9hY2NvdW50c182MDogeyB0aXRsZTogJzYwIFx1NjVFNVx1NEVFNVx1NEUwQVx1NkM4OFx1OUVEOScsIGRlc2NyaXB0aW9uOiAnMiBcdTMwNEJcdTY3MDhcdTMwNkVcdTZDODhcdTlFRDkgXHUyMDE0IFx1MzBFQVx1MzBCOVx1MzBBRlx1OTVCRVx1NTAyNCcgfSxcbiAgICAgICAgcXVpZXRfYWNjb3VudHNfOTA6IHsgdGl0bGU6ICc5MCBcdTY1RTVcdTRFRTVcdTRFMEFcdTZDODhcdTlFRDknLCBkZXNjcmlwdGlvbjogJ1x1NTZEQlx1NTM0QVx1NjcxRlx1MzA2Qlx1MzA4Rlx1MzA1Rlx1MzA4QVx1NjNBNVx1ODlFNlx1MzA2QVx1MzA1NycgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcm1fb3ZlcnZpZXdfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ0NSTSBcdTY5ODJcdTg5ODEnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTU4RjJcdTRFMEFcdTYzMDdcdTZBMTlcdTMwMDFcdTMwRDFcdTMwQTRcdTMwRDdcdTMwRTlcdTMwQTRcdTMwRjNcdTUyMDZcdTY3OTBcdTMwMDFcdTU1NDZcdThBQzdcdTMwQTRcdTMwRjNcdTMwQjVcdTMwQTRcdTMwQzgnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICB0b3RhbF9yZXZlbnVlOiB7IHRpdGxlOiAnXHU3RENGXHU1OEYyXHU0RTBBJywgZGVzY3JpcHRpb246ICdcdTVGNTNcdTY3MUZcdTMwNkVcdTYyMTBcdTdBQ0JcdTZFMDhcdTMwN0ZcdTU4RjJcdTRFMEEnIH0sXG4gICAgICAgIGFjdGl2ZV9kZWFsczogeyB0aXRsZTogJ1x1OTAzMlx1ODg0Q1x1NEUyRFx1MzA2RVx1NTU0Nlx1OEFDNycsIGRlc2NyaXB0aW9uOiAnXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHU0RTBBXHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHU1NTQ2XHU4QUM3JyB9LFxuICAgICAgICB3b25fZGVhbHM6IHsgdGl0bGU6ICdcdTYyMTBcdTdBQ0JcdTU1NDZcdThBQzdcdTY1NzAnLCBkZXNjcmlwdGlvbjogJ1x1NUY1M1x1NjcxRlx1MzA2Qlx1NjIxMFx1N0FDQlx1MzA1N1x1MzA1Rlx1NTU0Nlx1OEFDN1x1MzA2RVx1N0RDRlx1NjU3MCcgfSxcbiAgICAgICAgYXZnX2RlYWxfc2l6ZTogeyB0aXRsZTogJ1x1NUU3M1x1NTc0N1x1NTU0Nlx1OEFDN1x1ODk4Rlx1NkEyMScsIGRlc2NyaXB0aW9uOiAnXHU2MjEwXHU3QUNCXHU2RTA4XHUzMDdGXHU1NTQ2XHU4QUM3XHUzMDZFXHU1RTczXHU1NzQ3XHU5MUQxXHU5ODREJyB9LFxuICAgICAgICByZXZlbnVlX3RyZW5kczogeyB0aXRsZTogJ1x1NThGMlx1NEUwQVx1MzBDOFx1MzBFQ1x1MzBGM1x1MzBDOScsIGRlc2NyaXB0aW9uOiAnXHU5MDRFXHU1M0JCMTJcdTMwNEJcdTY3MDhcdTMwNkVcdTYyMTBcdTdBQ0JcdTZFMDhcdTMwN0ZcdTU4RjJcdTRFMEEnIH0sXG4gICAgICAgIGxlYWRfc291cmNlOiB7IHRpdGxlOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMEJEXHUzMEZDXHUzMEI5JywgZGVzY3JpcHRpb246ICdcdTczNzJcdTVGOTdcdTMwQzFcdTMwRTNcdTMwQ0RcdTMwRUJcdTUyMjVcdTMwNkVcdTMwRDFcdTMwQTRcdTMwRDdcdTMwRTlcdTMwQTRcdTMwRjNcdTkxRDFcdTk4NEQnIH0sXG4gICAgICAgIHBpcGVsaW5lX2J5X3N0YWdlOiB7IHRpdGxlOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4XHU1MjI1XHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzJywgZGVzY3JpcHRpb246ICdcdTU0MDRcdTU1QjZcdTY5NkRcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjhcdTMwNkVcdTMwQUFcdTMwRkNcdTMwRDdcdTMwRjNcdTU1NDZcdThBQzdcdTkxRDFcdTk4NEQnIH0sXG4gICAgICAgIHRvcF9wcm9kdWN0czogeyB0aXRsZTogJ1x1NThGMlx1MzA4Q1x1N0I0Qlx1ODhGRFx1NTRDMScsIGRlc2NyaXB0aW9uOiAnXHU4OEZEXHU1NEMxXHUzMEFCXHUzMEM2XHUzMEI0XHUzMEVBXHU1MjI1XHUzMDZFXHU1QjlBXHU0RkExXHUzMEQ5XHUzMEZDXHUzMEI5XHU1OEYyXHU0RTBBJyB9LFxuICAgICAgICBwaXBlbGluZV9ieV9vd25lcjogeyB0aXRsZTogJ1x1NjJDNVx1NUY1M1x1ODAwNVx1NTIyNVx1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycsIGRlc2NyaXB0aW9uOiAnXHU1NUI2XHU2OTZEXHU2MkM1XHU1RjUzXHU4MDA1XHUzMDU0XHUzMDY4XHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHU5MUQxXHU5ODREXHUzMDY4XHU1NTQ2XHU4QUM3XHU2NTcwJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGV4ZWN1dGl2ZV9kYXNoYm9hcmQ6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEE4XHUzMEIwXHUzMEJDXHUzMEFGXHUzMEM2XHUzMEEzXHUzMEQ2XHU2OTgyXHU4OTgxJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU3RDRDXHU1NUI2XHU1QzY0XHU1NDExXHUzMDUxXHUzMDZFXHU1OEYyXHU0RTBBXHUzMEZCXHU5ODY3XHU1QkEyXHUzMEZCXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHUzMDZFXHU0RTNCXHU4OTgxS1BJJyxcbiAgICAgIHdpZGdldHM6IHtcbiAgICAgICAgdG90YWxfcmV2ZW51ZV95dGQ6IHsgdGl0bGU6ICdcdTVFNzRcdTVFQTZcdTdEMkZcdThBMDhcdTU4RjJcdTRFMEEnLCBkZXNjcmlwdGlvbjogJ1x1NjcyQ1x1NUU3NFx1NUVBNlx1MzA2RVx1NjIxMFx1N0FDQlx1NkUwOFx1MzA3Rlx1NThGMlx1NEUwQScgfSxcbiAgICAgICAgdG90YWxfYWNjb3VudHM6IHsgdGl0bGU6ICdcdTMwQTJcdTMwQUZcdTMwQzZcdTMwQTNcdTMwRDZcdTUzRDZcdTVGMTVcdTUxNDgnLCBkZXNjcmlwdGlvbjogJ1x1NUMxMVx1MzA2QVx1MzA0Rlx1MzA2OFx1MzA4MjFcdTMwNjRcdTMwNkVcdTY3MDlcdTUyQjlcdTMwNkFcdTk1QTJcdTRGQzJcdTMwOTJcdTYzMDFcdTMwNjRcdTk4NjdcdTVCQTInIH0sXG4gICAgICAgIHRvdGFsX2NvbnRhY3RzOiB7IHRpdGxlOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHU2NTcwJywgZGVzY3JpcHRpb246ICdcdTU0MERcdTdDM0ZcdTMwNkJcdTc2N0JcdTkzMzJcdTMwNTVcdTMwOENcdTMwNUZcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDUnIH0sXG4gICAgICAgIG9wZW5fbGVhZHM6IHsgdGl0bGU6ICdcdTMwQUFcdTMwRkNcdTMwRDdcdTMwRjNcdTMwRUFcdTMwRkNcdTMwQzknLCBkZXNjcmlwdGlvbjogJ1x1NjcyQVx1NTkwOVx1NjNEQlx1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOScgfSxcbiAgICAgICAgcmV2ZW51ZV90cmVuZDogeyB0aXRsZTogJ1x1NThGMlx1NEUwQVx1MzBDOFx1MzBFQ1x1MzBGM1x1MzBDOScsIGRlc2NyaXB0aW9uOiAnXHU5MDRFXHU1M0JCMTJcdTMwNEJcdTY3MDhcdTMwNkVcdTYyMTBcdTdBQ0JcdTZFMDhcdTMwN0ZcdTU4RjJcdTRFMEEnIH0sXG4gICAgICAgIHJldmVudWVfYnlfaW5kdXN0cnk6IHsgdGl0bGU6ICdcdTY5NkRcdTdBMkVcdTUyMjVcdTU4RjJcdTRFMEEnLCBkZXNjcmlwdGlvbjogJ1x1NjcyQ1x1NUU3NFx1NUVBNlx1MzA2RVx1NjIxMFx1N0FDQlx1NkUwOFx1MzA3Rlx1NThGMlx1NEUwQVx1MzA5Mlx1Njk2RFx1N0EyRVx1NTIyNVx1MzA2Qlx1NTIwNlx1OTg1RScgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfc3RhZ2U6IHsgdGl0bGU6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjhcdTUyMjVcdTMwRDFcdTMwQTRcdTMwRDdcdTMwRTlcdTMwQTRcdTMwRjMnLCBkZXNjcmlwdGlvbjogJ1x1NTQwNFx1NTVCNlx1Njk2RFx1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCOFx1MzA2RVx1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1NTU0Nlx1OEFDN1x1OTFEMVx1OTg0RCcgfSxcbiAgICAgICAgbmV3X2FjY291bnRzX2J5X21vbnRoOiB7IHRpdGxlOiAnXHU2NUIwXHU4OThGXHU1M0Q2XHU1RjE1XHU1MTQ4JywgZGVzY3JpcHRpb246ICdcdTkwNEVcdTUzQkI2XHUzMDRCXHU2NzA4XHUzMDZFXHU1M0Q2XHU1RjE1XHU1MTQ4XHU0RjVDXHU2MjEwXHUzMERBXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgICBhY2NvdW50c19ieV9pbmR1c3RyeTogeyB0aXRsZTogJ1x1Njk2RFx1N0EyRVx1NTIyNVx1NTNENlx1NUYxNVx1NTE0OCcsIGRlc2NyaXB0aW9uOiAnXHU2OTZEXHU3QTJFXHUzMDU0XHUzMDY4XHUzMDZFXHU1RTc0XHU5NTkzXHU1OEYyXHU0RTBBXHU1NDA4XHU4QTA4XHUzMDY4XHU1M0Q2XHU1RjE1XHU1MTQ4XHU2NTcwJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHNhbGVzX2Rhc2hib2FyZDoge1xuICAgICAgbGFiZWw6ICdcdTU1QjZcdTY5NkRcdTVCOUZcdTdFM0UnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTMwRDFcdTMwQTRcdTMwRDdcdTMwRTlcdTMwQTRcdTMwRjNcdTUyMDZcdTY3OTBcdTMwMDFcdTUyRERcdTczODdcdTMwQzhcdTMwRUNcdTMwRjNcdTMwQzlcdTMwMDFcdTYyQzVcdTVGNTNcdTgwMDVcdTUyMjVcdTMwRDFcdTMwRDVcdTMwQTlcdTMwRkNcdTMwREVcdTMwRjNcdTMwQjknLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICB0b3RhbF9waXBlbGluZV92YWx1ZTogeyB0aXRsZTogJ1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGM1x1NTQwOFx1OEEwOCcsIGRlc2NyaXB0aW9uOiAnXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHU1NTQ2XHU4QUM3XHU5MUQxXHU5ODREXHUzMDZFXHU1NDA4XHU4QTA4JyB9LFxuICAgICAgICBjbG9zZWRfd29uX3F0ZDogeyB0aXRsZTogJ1x1NEVDQVx1NTZEQlx1NTM0QVx1NjcxRlx1NjIxMFx1N0FDQlx1OTg0RCcsIGRlc2NyaXB0aW9uOiAnXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHUzMDZCXHU2MjEwXHU3QUNCXHUzMDU3XHUzMDVGXHU1OEYyXHU0RTBBJyB9LFxuICAgICAgICBvcGVuX29wcG9ydHVuaXRpZXM6IHsgdGl0bGU6ICdcdTMwQUFcdTMwRkNcdTMwRDdcdTMwRjNcdTU1NDZcdThBQzcnLCBkZXNjcmlwdGlvbjogJ1x1OTAzMlx1ODg0Q1x1NEUyRFx1MzA2RVx1MzBBMlx1MzBBRlx1MzBDNlx1MzBBM1x1MzBENlx1NTU0Nlx1OEFDNycgfSxcbiAgICAgICAgYXZnX2RlYWxfc2l6ZTogeyB0aXRsZTogJ1x1NUU3M1x1NTc0N1x1NTU0Nlx1OEFDN1x1ODk4Rlx1NkEyMScsIGRlc2NyaXB0aW9uOiAnXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHUzMDZFXHU2MjEwXHU3QUNCXHU2RTA4XHUzMDdGXHU1NTQ2XHU4QUM3XHUzMDZFXHU1RTczXHU1NzQ3XHU5MUQxXHU5ODREJyB9LFxuICAgICAgICBwaXBlbGluZV9ieV9zdGFnZTogeyB0aXRsZTogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCOFx1NTIyNVx1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycsIGRlc2NyaXB0aW9uOiAnXHU1NDA0XHU1NUI2XHU2OTZEXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4XHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHU1NTQ2XHU4QUM3XHU5MUQxXHU5ODREJyB9LFxuICAgICAgICBtb250aGx5X3JldmVudWVfdHJlbmQ6IHsgdGl0bGU6ICdcdTY3MDhcdTZCMjFcdTU4RjJcdTRFMEFcdTMwQzhcdTMwRUNcdTMwRjNcdTMwQzknLCBkZXNjcmlwdGlvbjogJ1x1OTA0RVx1NTNCQjEyXHUzMDRCXHU2NzA4XHUzMDZFXHU2MjEwXHU3QUNCXHU2RTA4XHUzMDdGXHU1OEYyXHU0RTBBJyB9LFxuICAgICAgICBwaXBlbGluZV9ieV9mb3JlY2FzdF9jYXRlZ29yeTogeyB0aXRsZTogJ1x1NEU4OFx1NkUyQ1x1MzBBQlx1MzBDNlx1MzBCNFx1MzBFQVx1NTIyNVx1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycsIGRlc2NyaXB0aW9uOiAnXHU1OEYyXHU0RTBBXHU0RTg4XHU2RTJDXHUzMEFCXHUzMEM2XHUzMEI0XHUzMEVBXHU1MjI1XHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHU5MUQxXHU5ODREJyB9LFxuICAgICAgICBsZWFkX3NvdXJjZV9icmVha2Rvd246IHsgdGl0bGU6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwQkRcdTMwRkNcdTMwQjknLCBkZXNjcmlwdGlvbjogJ1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGM1x1MzA2RVx1NkQ0MVx1NTE2NVx1NTE0MycgfSxcbiAgICAgICAgb3Blbl9waXBlbGluZV9ieV9vd25lcjogeyB0aXRsZTogJ1x1NjJDNVx1NUY1M1x1ODAwNVx1NTIyNVx1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycsIGRlc2NyaXB0aW9uOiAnXHU1NUI2XHU2OTZEXHU2MkM1XHU1RjUzXHU4MDA1XHUzMDU0XHUzMDY4XHUzMDZFXHU5MDMyXHU4ODRDXHU0RTJEXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHU5MUQxXHU5ODREXHUzMEZCXHU1NTQ2XHU4QUM3XHU2NTcwXHUzMEZCXHU1RTczXHU1NzQ3XHU1MkREXHU3Mzg3JyB9LFxuICAgICAgICBxdW90YV9hdHRhaW5tZW50X2J5X3JlcDogeyB0aXRsZTogJ1x1NjJDNVx1NUY1M1x1ODAwNVx1NTIyNVx1MzBDRVx1MzBFQlx1MzBERVx1OTA1NFx1NjIxMFx1NzJCNlx1NkNDMScsIGRlc2NyaXB0aW9uOiAnXHU0RTg4XHU2RTJDXHUzMEI5XHUzMENBXHUzMEMzXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEMzXHUzMEM4XHUzMDZCXHU1N0ZBXHUzMDY1XHUzMDRGXHU2MkM1XHU1RjUzXHU4MDA1XHU1MjI1XHUzMDZFXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHUzMENFXHUzMEVCXHUzMERFXHUzMEZCXHU2MjEwXHU3RDA0XHU1M0NFXHU3NkNBXHUzMEZCXHU5MDU0XHU2MjEwXHU3Mzg3JyB9LFxuICAgICAgICBwaXBlbGluZV9zdGFnZV9ieV9zb3VyY2U6IHsgdGl0bGU6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjggXHUwMEQ3IFx1MzBFQVx1MzBGQ1x1MzBDOVx1MzBCRFx1MzBGQ1x1MzBCOScsIGRlc2NyaXB0aW9uOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4XHUzMDY4XHUzMEJEXHUzMEZDXHUzMEI5XHU1MjI1XHUzMDZFXHU5MDMyXHU4ODRDXHU0RTJEXHU1NTQ2XHU4QUM3XHU5MUQxXHU5ODREXHUzMDZFXHUzMEFGXHUzMEVEXHUzMEI5XHU5NkM2XHU4QTA4JyB9LFxuICAgICAgICB3aW5fcmF0ZV8xMm06IHsgdGl0bGU6ICdcdTUyRERcdTczODdcdUZGMDhcdTc2RjRcdThGRDExMlx1MzA0Qlx1NjcwOFx1RkYwOScsIGRlc2NyaXB0aW9uOiAnXHU3NkY0XHU4RkQxMTJcdTMwNEJcdTY3MDhcdTMwNkJcdTZDN0FcdTc3NDBcdTMwNTdcdTMwNUZcdTU1NDZcdThBQzdcdTMwNkVcdTMwNDZcdTMwNjFcdTYyMTBcdTdBQ0JcdTMwNTdcdTMwNUZcdTUyNzJcdTU0MDgnIH0sXG4gICAgICAgIHdvbl9kZWFsc18xMm06IHsgdGl0bGU6ICdcdTYyMTBcdTdBQ0JcdTU1NDZcdThBQzdcdTY1NzBcdUZGMDhcdTc2RjRcdThGRDExMlx1MzA0Qlx1NjcwOFx1RkYwOScsIGRlc2NyaXB0aW9uOiAnXHU1MkREXHU3Mzg3XHUzMDZFXHU1MjA2XHU1QjUwJyB9LFxuICAgICAgICBsb3N0X2RlYWxzXzEybTogeyB0aXRsZTogJ1x1NTkzMVx1NkNFOFx1NTU0Nlx1OEFDN1x1NjU3MFx1RkYwOFx1NzZGNFx1OEZEMTEyXHUzMDRCXHU2NzA4XHVGRjA5JywgZGVzY3JpcHRpb246ICdcdTUyRERcdTczODdcdTMwNkVcdTUyMDZcdTZCQ0RcdTMwNkVcdTMwODJcdTMwNDZcdTUzNEFcdTUyMDYnIH0sXG4gICAgICAgIHdpbl9yYXRlX2J5X293bmVyOiB7IHRpdGxlOiAnXHU2MkM1XHU1RjUzXHU4MDA1XHU1MjI1IFx1NTNEN1x1NkNFOFx1RkYwRlx1NTkzMVx1NkNFOCcsIGRlc2NyaXB0aW9uOiAnXHU3NkY0XHU4RkQxMTJcdTMwNEJcdTY3MDhcdTMwNkVcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNTRcdTMwNjhcdTMwNkVcdTYyMTBcdTdBQ0JcdTY1NzBcdTMwRkJcdTU5MzFcdTZDRThcdTY1NzBcdTMwRkJcdTUyRERcdTczODcnIH0sXG4gICAgICAgIHdpbl9yYXRlX2J5X2xlYWRfc291cmNlOiB7IHRpdGxlOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMEJEXHUzMEZDXHUzMEI5XHU1MjI1IFx1NTNEN1x1NkNFOFx1RkYwRlx1NTkzMVx1NkNFOCcsIGRlc2NyaXB0aW9uOiAnXHU1QjlGXHU5NjlCXHUzMDZCXHU2MjEwXHU3QUNCXHUzMDZCXHUzMDY0XHUzMDZBXHUzMDRDXHUzMDhCXHUzMDZFXHUzMDZGXHUzMDY5XHUzMDZFXHUzMEJEXHUzMEZDXHUzMEI5XHUzMDRCIFx1MjAxNCBcdTc2RjRcdThGRDExMlx1MzA0Qlx1NjcwOCcgfSxcbiAgICAgICAgbG9zc19yZWFzb25fYnJlYWtkb3duOiB7IHRpdGxlOiAnXHU1OTMxXHU2Q0U4XHUzMDZFXHU3NDA2XHU3NTMxJywgZGVzY3JpcHRpb246ICdcdTc2RjRcdThGRDExMlx1MzA0Qlx1NjcwOFx1MzA2RVx1NTkzMVx1NkNFOFx1NTU0Nlx1OEFDN1x1MzA5Mlx1NzQwNlx1NzUzMVx1NTIyNVx1MzA2Qlx1OTZDNlx1OEEwOCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzZXJ2aWNlX2Rhc2hib2FyZDoge1xuICAgICAgbGFiZWw6ICdcdTMwQUJcdTMwQjlcdTMwQkZcdTMwREVcdTMwRkNcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjknLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTMwQjFcdTMwRkNcdTMwQjlcdThDQTBcdTgzNzdcdTMwMDFTTEFcdTUwNjVcdTUxNjhcdTYwMjdcdTMwMDFcdTg5RTNcdTZDN0FcdTMwRDFcdTMwRDVcdTMwQTlcdTMwRkNcdTMwREVcdTMwRjNcdTMwQjknLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICBvcGVuX2Nhc2VzOiB7IHRpdGxlOiAnXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHUzMEIxXHUzMEZDXHUzMEI5JywgZGVzY3JpcHRpb246ICdcdTMwN0VcdTMwNjBcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTMwNTVcdTMwOENcdTMwNjZcdTMwNDRcdTMwNkFcdTMwNDRcdTMwQjFcdTMwRkNcdTMwQjknIH0sXG4gICAgICAgIGNyaXRpY2FsX2Nhc2VzOiB7IHRpdGxlOiAnXHU5MUNEXHU1OTI3XHUzMEIxXHUzMEZDXHUzMEI5JywgZGVzY3JpcHRpb246ICdcdTUxMkFcdTUxNDhcdTVFQTZcdTMwMENcdTkxQ0RcdTU5MjdcdTMwMERcdTMwNkVcdTMwQUFcdTMwRkNcdTMwRDdcdTMwRjNcdTMwQjFcdTMwRkNcdTMwQjknIH0sXG4gICAgICAgIGF2Z19yZXNvbHV0aW9uX3RpbWU6IHsgdGl0bGU6ICdcdTVFNzNcdTU3NDdcdTg5RTNcdTZDN0FcdTY2NDJcdTk1OTMnLCBkZXNjcmlwdGlvbjogJ1x1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1MzA3RVx1MzA2N1x1MzA2RVx1NUU3M1x1NTc0N1x1NjY0Mlx1OTU5M1x1RkYwOFx1NjY0Mlx1RkYwOScgfSxcbiAgICAgICAgc2xhX3Zpb2xhdGlvbnM6IHsgdGl0bGU6ICdTTEEgXHU5MDU1XHU1M0NEJywgZGVzY3JpcHRpb246ICdTTEEgXHUzMDkyXHU4RDg1XHU5MDRFXHUzMDU3XHUzMDVGXHUzMEIxXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgICBjYXNlc19ieV9zdGF0dXM6IHsgdGl0bGU6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjlcdTUyMjVcdTMwQjFcdTMwRkNcdTMwQjknLCBkZXNjcmlwdGlvbjogJ1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGM1x1NTE2OFx1NEY1M1x1MzA2RVx1MzBFRlx1MzBGQ1x1MzBBRlx1MzBFRFx1MzBGQ1x1MzBDOVx1NTIwNlx1NUUwMycgfSxcbiAgICAgICAgY2FzZXNfYnlfcHJpb3JpdHk6IHsgdGl0bGU6ICdcdTUxMkFcdTUxNDhcdTVFQTZcdTUyMjVcdTMwQjFcdTMwRkNcdTMwQjknLCBkZXNjcmlwdGlvbjogJ1x1N0RDQVx1NjAyNVx1NUVBNlx1NTIyNVx1MzA2RVx1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1MzBCMVx1MzBGQ1x1MzBCOVx1NjlDQlx1NjIxMCcgfSxcbiAgICAgICAgY2FzZXNfYnlfb3JpZ2luOiB7IHRpdGxlOiAnXHU3NjdBXHU3NTFGXHU2RTkwXHU1MjI1XHUzMEIxXHUzMEZDXHUzMEI5JywgZGVzY3JpcHRpb246ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTMwNkVcdTZENDFcdTUxNjVcdTMwQzFcdTMwRTNcdTMwQ0RcdTMwRUInIH0sXG4gICAgICAgIGRhaWx5X2Nhc2Vfdm9sdW1lOiB7IHRpdGxlOiAnXHU2NUU1XHU2QjIxXHUzMEIxXHUzMEZDXHUzMEI5XHU0RUY2XHU2NTcwJywgZGVzY3JpcHRpb246ICdcdTkwNEVcdTUzQkIzMFx1NjVFNVx1OTU5M1x1MzA2RVx1NjVCMFx1ODk4Rlx1MzBCMVx1MzBGQ1x1MzBCOScgfSxcbiAgICAgICAgc2xhX2NvbXBsaWFuY2VfZ2F1Z2U6IHsgdGl0bGU6ICdTTEEgXHU5MDU0XHU2MjEwXHU3Mzg3JywgZGVzY3JpcHRpb246ICdcdTVGNTNcdTY3MUYgU0xBIFx1NTE4NVx1MzA2Qlx1ODlFM1x1NkM3QVx1MzA1N1x1MzA1Rlx1MzBCMVx1MzBGQ1x1MzBCOVx1MzA2RVx1NTI3Mlx1NTQwOCcgfSxcbiAgICAgICAga2JfZGVmbGVjdGlvbl9yYXRlOiB7IHRpdGxlOiAnXHUzMENBXHUzMEVDXHUzMEMzXHUzMEI4XHU4OUUzXHU2QzdBXHU3Mzg3JywgZGVzY3JpcHRpb246ICdcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTMwNTdcdTMwNUZcdTMwQjFcdTMwRkNcdTMwQjlcdTMwNkVcdTMwNDZcdTMwNjFcdTMwQ0FcdTMwRUNcdTMwQzNcdTMwQjhcdThBMThcdTRFOEJcdTMwNjdcdTg5RTNcdTZDN0FcdTMwNTdcdTMwNUZcdTUyNzJcdTU0MDgnIH0sXG4gICAgICAgIGtiX3Jlc29sdmVkX2Nhc2VzOiB7IHRpdGxlOiAnXHUzMENBXHUzMEVDXHUzMEMzXHUzMEI4XHUzMDY3XHU4OUUzXHU2QzdBJywgZGVzY3JpcHRpb246ICdcdTg5RTNcdTZDN0FcdTMwNTdcdTMwNUZcdThBMThcdTRFOEJcdTMwNENcdTdEMTBcdTMwNjVcdTMwNEZcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTZFMDhcdTMwN0ZcdTMwQjFcdTMwRkNcdTMwQjknIH0sXG4gICAgICAgIGNsb3NlZF9jYXNlc190b3RhbDogeyB0aXRsZTogJ1x1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1NkUwOFx1MzA3Rlx1MzBCMVx1MzBGQ1x1MzBCOScsIGRlc2NyaXB0aW9uOiAnXHUzMENBXHUzMEVDXHUzMEMzXHUzMEI4XHU4OUUzXHU2QzdBXHU3Mzg3XHUzMDZFXHU1MjA2XHU2QkNEJyB9LFxuICAgICAgICB0b3BfcmVzb2x2aW5nX2FydGljbGVzOiB7IHRpdGxlOiAnXHU4OUUzXHU2QzdBXHU0RUY2XHU2NTcwXHUzMDZFXHU1OTFBXHUzMDQ0XHU4QTE4XHU0RThCJywgZGVzY3JpcHRpb246ICdcdTg5RTNcdTZDN0FcdTMwNTdcdTMwNUZcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTZFMDhcdTMwN0ZcdTMwQjFcdTMwRkNcdTMwQjlcdTY1NzBcdTMwNjdcdTRFMjZcdTMwNzlcdTMwNUZcdTMwQ0FcdTMwRUNcdTMwQzNcdTMwQjhcdThBMThcdTRFOEInIH0sXG4gICAgICAgIG15X29wZW5fY2FzZXNfYnlfcHJpb3JpdHk6IHsgdGl0bGU6ICdcdTUxMkFcdTUxNDhcdTVFQTZcdTUyMjVcdTMwNkVcdTc5QzFcdTMwNkVcdTMwQUFcdTMwRkNcdTMwRDdcdTMwRjNcdTMwQjFcdTMwRkNcdTMwQjknLCBkZXNjcmlwdGlvbjogJ1x1MzA0Mlx1MzA2QVx1MzA1Rlx1MzA2RVx1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA2OFx1MzA1RFx1MzA2RVNMQVx1OTA1NVx1NTNDRFx1NzM4N1x1MzA5Mlx1NTEyQVx1NTE0OFx1NUVBNlx1NTIyNVx1MzA2Qlx1OTZDNlx1OEEwOCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgLy8gYHRpdGxlYCAvIGBzdWJ0aXRsZWAgdHJhbnNsYXRlIHRoZSBwYWdlJ3MgYHBhZ2U6aGVhZGVyYDsgYHRpdGxlYCBmYWxscyBiYWNrXG4gIC8vIHRvIGBsYWJlbGAgd2hlbiBvbWl0dGVkLCBzbyBpdCBpcyBhdXRob3JlZCBvbmx5IHdoZXJlIHRoZSB0d28gZGlmZmVyLlxuICAvLyBIZWFkZXIgc3RyaW5ncyBjYXJyeWluZyBge2ZpZWxkfWAgdG9rZW5zIGtlZXAgdGhlIHRva2VuIHNwZWxsaW5nIHZlcmJhdGltIFx1MjAxNFxuICAvLyB0aGUgY29uc29sZSBzdWJzdGl0dXRlcyBvbiB0aGUgcmF3IGtleSwgc28gYSB0cmFuc2xhdGVkIHRva2VuIHJlc29sdmVzIHRvXG4gIC8vIG5vdGhpbmcgYW5kIHRoZSBoZWFkZXIgcmVuZGVycyBibGFuay5cbiAgZGF0YXNldHM6IHtcbiAgICBhY2NvdW50X21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU2MzA3XHU2QTE5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU2OTZEXHU3QTJFXHUzMEZCXHU3QTJFXHU1MjI1XHUzMDU0XHUzMDY4XHUzMDZCXHU1M0Q2XHU1RjE1XHU1MTQ4XHU2NTcwXHUzMDkyXHU5NkM2XHU4QTA4XHUzMDU5XHUzMDhCXHUzMEJCXHUzMERFXHUzMEYzXHUzMEM2XHUzMEEzXHUzMEMzXHUzMEFGXHUzMEVDXHUzMEE0XHUzMEU0XHUzMEZDJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgaW5kdXN0cnk6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1Njk2RFx1N0EyRScsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1N0EyRVx1NTIyNScsXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWF0ZWRfYXQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NEY1Q1x1NjIxMFx1NjVFNScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbWVhc3VyZXM6IHtcbiAgICAgICAgYWNjb3VudF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgYW5udWFsX3JldmVudWVfc3VtOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVFNzRcdTk1OTNcdTU4RjJcdTRFMEEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNhc2VfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTYzMDdcdTZBMTknLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTY1NzBcdTMwRkJcdTg5RTNcdTZDN0FcdTY2NDJcdTk1OTNcdTMwRkJTTEEgXHUzMDkyXHU5NkM2XHU4QTA4XHUzMDU5XHUzMDhCXHUzMEJCXHUzMERFXHUzMEYzXHUzMEM2XHUzMEEzXHUzMEMzXHUzMEFGXHUzMEVDXHUzMEE0XHUzMEU0XHUzMEZDJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgY3JlYXRlZF9hdDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU0RjVDXHU2MjEwXHU2NUU1JyxcbiAgICAgICAgfSxcbiAgICAgICAgb3JpZ2luOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTc2N0FcdTc1MUZcdTUxNDMnLFxuICAgICAgICB9LFxuICAgICAgICBwcmlvcml0eToge1xuICAgICAgICAgIGxhYmVsOiAnXHU1MTJBXHU1MTQ4XHU1RUE2JyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZWRfYXJ0aWNsZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU4OUUzXHU2QzdBXHUzMDZCXHU0RjdGXHU3NTI4XHUzMDU3XHUzMDVGXHUzMENBXHUzMEVDXHUzMEMzXHUzMEI4XHU4QTE4XHU0RThCJyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTdBMkVcdTUyMjUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGF2Z19yZXNvbHV0aW9uOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTVFNzNcdTU3NDdcdTg5RTNcdTZDN0FcdTY2NDJcdTk1OTNcdUZGMDhcdTY2NDJcdTk1OTNcdUZGMDknLFxuICAgICAgICB9LFxuICAgICAgICBhdmdfc2xhX3Zpb2xhdGVkOiB7XG4gICAgICAgICAgbGFiZWw6ICdTTEEgXHU5MDU1XHU1M0NEXHU3Mzg3JyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FzZV9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VkX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTZFMDhcdTMwN0ZcdTMwQjFcdTMwRkNcdTMwQjknLFxuICAgICAgICB9LFxuICAgICAgICBrYl9kZWZsZWN0aW9uX3JhdGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1MzBDQVx1MzBFQ1x1MzBDM1x1MzBCOFx1MzBEOVx1MzBGQ1x1MzBCOVx1ODFFQVx1NURGMVx1ODlFM1x1NkM3QVx1NzM4NycsXG4gICAgICAgIH0sXG4gICAgICAgIGtiX3Jlc29sdmVkX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwQ0FcdTMwRUNcdTMwQzNcdTMwQjhcdTMwRDlcdTMwRkNcdTMwQjlcdTMwNjdcdTg5RTNcdTZDN0FcdTMwNTdcdTMwNUZcdTRFRjZcdTY1NzAnLFxuICAgICAgICB9LFxuICAgICAgICBzbGFfY29tcGxpYW5jZV9yYXRlOiB7XG4gICAgICAgICAgbGFiZWw6ICdTTEEgXHU5MDc1XHU1Qjg4XHU3Mzg3JyxcbiAgICAgICAgfSxcbiAgICAgICAgc2xhX21ldF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnU0xBIFx1MzA5Mlx1NkU4MFx1MzA1Rlx1MzA1N1x1MzA1Rlx1MzBCMVx1MzBGQ1x1MzBCOScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29udGFjdF9tZXRyaWNzOiB7XG4gICAgICBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNVx1NjMwN1x1NkExOScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNVx1NjU3MFx1MzA5Mlx1OTZDNlx1OEEwOFx1MzA1OVx1MzA4Qlx1MzBCQlx1MzBERVx1MzBGM1x1MzBDNlx1MzBBM1x1MzBDM1x1MzBBRlx1MzBFQ1x1MzBBNFx1MzBFNFx1MzBGQycsXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBjb250YWN0X2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTY1NzAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGV2ZW50X21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnXHU2RDNCXHU1MkQ1XHU2MzA3XHU2QTE5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU0RjFBXHU4QjcwXHUzMEZCXHU5MDFBXHU4QTcxXHUzMEZCXHU2M0E1XHU4OUU2XHUzMDZFXHU2NUIwXHUzMDU3XHUzMDU1XHUzMDkyXHU5NkM2XHU4QTA4XHUzMDU5XHUzMDhCXHUzMEJCXHUzMERFXHUzMEYzXHUzMEM2XHUzMEEzXHUzMEMzXHUzMEFGXHUzMEVDXHUzMEE0XHUzMEU0XHUzMEZDJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgb3duZXI6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NjI0MFx1NjcwOVx1ODAwNScsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0ZWRfdG9fdHlwZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU5NUEyXHU5MDIzXHU1MTQ4JyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhcnRfZGF0ZXRpbWU6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NkQzQlx1NTJENVx1OTAzMScsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1czoge1xuICAgICAgICAgIGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5JyxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU2RDNCXHU1MkQ1XHU3QTJFXHU1MjI1JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBhdmdfbWludXRlczoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1RTczXHU1NzQ3XHU2MjQwXHU4OTgxXHU2NjQyXHU5NTkzJyxcbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NkQzQlx1NTJENVx1NEVGNlx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICAgIHRvdGFsX21pbnV0ZXM6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTQwOFx1OEEwOFx1NTIwNlx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZm9yZWNhc3RfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdcdTMwRDVcdTMwQTlcdTMwRkNcdTMwQURcdTMwRTNcdTMwQjlcdTMwQzhcdTYzMDdcdTZBMTknLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNTRcdTMwNjhcdTMwNkVcdTc2RUVcdTZBMTlcdTMwRkJcdTkwNTRcdTYyMTBcdTczODdcdTMwRkJcdTMwRDFcdTMwQTRcdTMwRDdcdTMwRTlcdTMwQTRcdTMwRjNcdTMwQUJcdTMwRDBcdTMwRUNcdTMwQzNcdTMwQjhcdTMwOTJcdTk2QzZcdThBMDhcdTMwNTlcdTMwOEJcdTMwQkJcdTMwREVcdTMwRjNcdTMwQzZcdTMwQTNcdTMwQzNcdTMwQUZcdTMwRUNcdTMwQTRcdTMwRTRcdTMwRkMnLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBvd25lcjoge1xuICAgICAgICAgIGxhYmVsOiAnXHU2MjQwXHU2NzA5XHU4MDA1JyxcbiAgICAgICAgfSxcbiAgICAgICAgcGVyaW9kOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTY3MUZcdTk1OTNcdTdBMkVcdTUyMjUnLFxuICAgICAgICB9LFxuICAgICAgICBwZXJpb2RfbGFiZWw6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NjcxRlx1OTU5MycsXG4gICAgICAgIH0sXG4gICAgICAgIHBlcmlvZF9zdGFydDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU2NzFGXHU5NTkzXHU5NThCXHU1OUNCJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBhdHRhaW5tZW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTkwNTRcdTYyMTBcdTczODcnLFxuICAgICAgICB9LFxuICAgICAgICBjbG9zZWRfc3VtOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTZFMDhcdTMwN0YnLFxuICAgICAgICB9LFxuICAgICAgICBjb21taXRfc3VtOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwQjNcdTMwREZcdTMwQzNcdTMwQzgnLFxuICAgICAgICB9LFxuICAgICAgICBwaXBlbGluZV9zdW06IHtcbiAgICAgICAgICBsYWJlbDogJ1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycsXG4gICAgICAgIH0sXG4gICAgICAgIHF1b3RhX3N1bToge1xuICAgICAgICAgIGxhYmVsOiAnXHU3NkVFXHU2QTE5JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsZWFkX21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU2MzA3XHU2QTE5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU2NTcwXHUzMDkyXHU5NkM2XHU4QTA4XHUzMDU5XHUzMDhCXHUzMEJCXHUzMERFXHUzMEYzXHUzMEM2XHUzMEEzXHUzMEMzXHUzMEFGXHUzMEVDXHUzMEE0XHUzMEU0XHUzMEZDJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgY3JlYXRlZF9hdDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU0RjVDXHU2MjEwXHU2NUU1JyxcbiAgICAgICAgfSxcbiAgICAgICAgbGFzdF9jb250YWN0ZWRfZGF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU2NzAwXHU3RDQyXHU2M0E1XHU4OUU2XHU2NUU1JyxcbiAgICAgICAgfSxcbiAgICAgICAgbGVhZF9zb3VyY2U6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1MzBCRFx1MzBGQ1x1MzBCOScsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1czoge1xuICAgICAgICAgIGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBsZWFkX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTY1NzAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG9wcG9ydHVuaXR5X21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHU2MzA3XHU2QTE5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHU1NUI2XHU2OTZEXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHUzMDZFXHU0RUY2XHU2NTcwXHUzMDY4XHU5MUQxXHU5ODREXHUzMDkyXHU5NkM2XHU4QTA4XHUzMDU5XHUzMDhCXHUzMEJCXHUzMERFXHUzMEYzXHUzMEM2XHUzMEEzXHUzMEMzXHUzMEFGXHUzMEVDXHUzMEE0XHUzMEU0XHUzMEZDJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgYWNjb3VudF9pbmR1c3RyeToge1xuICAgICAgICAgIGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZFXHU2OTZEXHU3QTJFJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VfZGF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU1QjhDXHU0RTg2XHU0RTg4XHU1QjlBXHU2NUU1JyxcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VfcXVhcnRlcjoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1QjhDXHU0RTg2XHU1NkRCXHU1MzRBXHU2NzFGJyxcbiAgICAgICAgfSxcbiAgICAgICAgZm9yZWNhc3RfY2F0ZWdvcnk6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1MzBENVx1MzBBOVx1MzBGQ1x1MzBBRFx1MzBFM1x1MzBCOVx1MzBDOFx1NTMzQVx1NTIwNicsXG4gICAgICAgIH0sXG4gICAgICAgIGxlYWRfc291cmNlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwQkRcdTMwRkNcdTMwQjknLFxuICAgICAgICB9LFxuICAgICAgICBsb3NzX3JlYXNvbjoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1OTMxXHU2Q0U4XHU3NDA2XHU3NTMxJyxcbiAgICAgICAgfSxcbiAgICAgICAgb3duZXI6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NjI0MFx1NjcwOVx1ODAwNScsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YWdlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjgnLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTU1NDZcdThBQzdcdTdBMkVcdTUyMjUnLFxuICAgICAgICB9LFxuICAgICAgICB3aW5fcmVhc29uOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTUzRDdcdTZDRThcdTc0MDZcdTc1MzEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGF2Z19hbW91bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NUU3M1x1NTc0N1x1NTU0Nlx1OEFDN1x1OTFEMVx1OTg0RCcsXG4gICAgICAgIH0sXG4gICAgICAgIGF2Z19wcm9iYWJpbGl0eToge1xuICAgICAgICAgIGxhYmVsOiAnXHU1RTczXHU1NzQ3XHU3OEJBXHU1RUE2JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVjaWRlZF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU2QzdBXHU3NzQwXHUzMDU3XHUzMDVGXHU1NTQ2XHU4QUM3JyxcbiAgICAgICAgfSxcbiAgICAgICAgbG9zdF9hbW91bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTkzMVx1NkNFOFx1OTFEMVx1OTg0RCcsXG4gICAgICAgIH0sXG4gICAgICAgIGxvc3RfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTkzMVx1NkNFOFx1NEVGNlx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICAgIG9wcF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgICAgdG90YWxfYW1vdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTU0MDhcdThBMDhcdTkxRDFcdTk4NEQnLFxuICAgICAgICB9LFxuICAgICAgICB3aW5fcmF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU1M0Q3XHU2Q0U4XHU3Mzg3JyxcbiAgICAgICAgfSxcbiAgICAgICAgd29uX2Ftb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1M0Q3XHU2Q0U4XHU5MUQxXHU5ODREJyxcbiAgICAgICAgfSxcbiAgICAgICAgd29uX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdcdTUzRDdcdTZDRThcdTRFRjZcdTY1NzAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHByb2R1Y3RfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdcdTg4RkRcdTU0QzFcdTYzMDdcdTZBMTknLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTg4RkRcdTU0QzFcdTMwQUJcdTMwQkZcdTMwRURcdTMwQjBcdTMwNkVcdTRFRjZcdTY1NzBcdTMwNjhcdTVCOUFcdTRGQTFcdTMwOTJcdTk2QzZcdThBMDhcdTMwNTlcdTMwOEJcdTMwQkJcdTMwREVcdTMwRjNcdTMwQzZcdTMwQTNcdTMwQzNcdTMwQUZcdTMwRUNcdTMwQTRcdTMwRTRcdTMwRkMnLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBjYXRlZ29yeToge1xuICAgICAgICAgIGxhYmVsOiAnXHUzMEFCXHUzMEM2XHUzMEI0XHUzMEVBJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBsaXN0X3ByaWNlX3N1bToge1xuICAgICAgICAgIGxhYmVsOiAnXHU1QjlBXHU0RkExXHU1NDA4XHU4QTA4JyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJvZHVjdF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU4OEZEXHU1NEMxXHU2NTcwJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB0YXNrX21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEJGXHUzMEI5XHUzMEFGXHU2MzA3XHU2QTE5JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHUzMEJGXHUzMEI5XHUzMEFGXHUzMDZFXHU0RjVDXHU2OTZEXHU5MUNGXHUzMDY4XHU1QjhDXHU0RTg2XHU3MkI2XHU2Q0MxXHUzMDkyXHU5NkM2XHU4QTA4XHUzMDU5XHUzMDhCXHUzMEJCXHUzMERFXHUzMEYzXHUzMEM2XHUzMEEzXHUzMEMzXHUzMEFGXHUzMEVDXHUzMEE0XHUzMEU0XHUzMEZDJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgZHVlX2RhdGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NjcxRlx1OTY1MCcsXG4gICAgICAgIH0sXG4gICAgICAgIGlzX2NvbXBsZXRlZDoge1xuICAgICAgICAgIGxhYmVsOiAnXHU1QjhDXHU0RTg2XHU2RTA4XHUzMDdGJyxcbiAgICAgICAgfSxcbiAgICAgICAgaXNfb3ZlcmR1ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU2NzFGXHU5NjUwXHU4RDg1XHU5MDRFJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJpb3JpdHk6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTEyQVx1NTE0OFx1NUVBNicsXG4gICAgICAgIH0sXG4gICAgICAgIHByaW9yaXR5X3Jhbms6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1N0RDQVx1NjAyNVx1NUVBNicsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1czoge1xuICAgICAgICAgIGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5JyxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgIGxhYmVsOiAnXHU3QTJFXHU1MjI1JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBhdmdfcHJvZ3Jlc3M6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NUU3M1x1NTc0N1x1OTAzMlx1NjM1NycsXG4gICAgICAgIH0sXG4gICAgICAgIHRhc2tfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1MzBCRlx1MzBCOVx1MzBBRlx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIHBhZ2VzOiB7XG4gICAgYWNjb3VudF9kZXRhaWxfcGFnZToge1xuICAgICAgbGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdThBNzNcdTdEMzAnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTMwQjlcdTMwRURcdTMwQzNcdTMwQzhcdTY5Q0JcdTYyMTBcdTMwNkVcdTUzRDZcdTVGMTVcdTUxNDhcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzlcdTMwREFcdTMwRkNcdTMwQjggXHUyMDE0IFx1MzBBQlx1MzBCOVx1MzBCRlx1MzBFMFx1MzBEOFx1MzBDM1x1MzBDMFx1MzBGQ1x1MzA2OFx1NUUzOFx1OEEyRFx1MzA2RVx1MzBDN1x1MzBBM1x1MzBCOVx1MzBBQlx1MzBDM1x1MzBCN1x1MzBFN1x1MzBGM1x1MzBENVx1MzBBM1x1MzBGQ1x1MzBDOVx1MzAwMicsXG4gICAgICB0aXRsZTogJ3tuYW1lfScsXG4gICAgICBzdWJ0aXRsZTogJ3tpbmR1c3RyeX0gXHUwMEI3IHt0eXBlfScsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIGFjY291bnRfY2hhdHRlcjogeyBsYWJlbDogJ1x1MzBDN1x1MzBBM1x1MzBCOVx1MzBBQlx1MzBDM1x1MzBCN1x1MzBFN1x1MzBGMycgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhY2NvdW50X3dvcmtiZW5jaDoge1xuICAgICAgbGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdTMwRUZcdTMwRkNcdTMwQUZcdTMwRDlcdTMwRjNcdTMwQzEnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTU1QjZcdTY5NkRcdTMwQzFcdTMwRkNcdTMwRTBcdTU0MTFcdTMwNTFcdTMwNkJcdTUzQjNcdTkwNzhcdTMwNTdcdTMwNUZcdTUzRDZcdTVGMTVcdTUxNDhcdTMwRUFcdTMwQjlcdTMwQzhcdTMwMDJcdTMwQUZcdTMwQTRcdTMwQzNcdTMwQUZcdTMwRDVcdTMwQTNcdTMwRUJcdTMwQkZcdTMwRkNcdTMwNkVcdTMwN0ZcdTMwNjdcdTMwMDFcdTMwRDNcdTMwRTVcdTMwRkNcdTdCQTFcdTc0MDZcdTMwNkZcdTg4NENcdTMwNDRcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDInLFxuICAgIH0sXG4gICAgYXBwX2xhdW5jaGVyX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEEyXHUzMEQ3XHUzMEVBXHUzMEU5XHUzMEYzXHUzMEMxXHUzMEUzXHUzMEZDJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZFXHUzMEEyXHUzMEQ3XHUzMEVBXHUzMEIxXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzXHUzMDZCXHUzMEEyXHUzMEFGXHUzMEJCXHUzMEI5XHUzMDU5XHUzMDhCXHUzMDVGXHUzMDgxXHUzMDZFXHU3RDcxXHU1NDA4XHUzMENGXHUzMEQ2JyxcbiAgICAgIHN1YnRpdGxlOiAnXHU5NThCXHU1OUNCXHUzMDU5XHUzMDhCXHUzMEEyXHUzMEQ3XHUzMEVBXHUzMDkyXHU5MDc4XHU2MjlFXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0JyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgYXBwX3NlYXJjaDogeyBsYWJlbDogJ1x1MzBBMlx1MzBEN1x1MzBFQVx1MzA5Mlx1NjkxQ1x1N0QyMicgfSxcbiAgICAgICAgYXBwX2dyaWQ6IHsgbGFiZWw6ICdcdTMwQTJcdTMwRDdcdTMwRUFcdTMwQjBcdTMwRUFcdTMwQzNcdTMwQzknIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgY2FzZV9kZXRhaWxfcGFnZToge1xuICAgICAgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdThBNzNcdTdEMzAnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjlcdTYyQzVcdTVGNTNcdTgwMDVcdTU0MTFcdTMwNTFcdTMwNkVcdTMwQjFcdTMwRkNcdTMwQjlcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzlcdTMwREFcdTMwRkNcdTMwQjhcdUZGMUFcdTMwQ0ZcdTMwQTRcdTMwRTlcdTMwQTRcdTMwQzhcdTMwMDFTTEEgXHUzMEQxXHUzMEI5XHUzMDAxXHU4QTczXHU3RDMwXHUzMDAxXHU2RDNCXHU1MkQ1XHUzMEJGXHUzMEE0XHUzMEUwXHUzMEU5XHUzMEE0XHUzMEYzXHUzMDAyJyxcbiAgICAgIHRpdGxlOiAne2Nhc2VfbnVtYmVyfSBcdTAwQjcge3N1YmplY3R9JyxcbiAgICAgIHN1YnRpdGxlOiAne2NybV9hY2NvdW50fScsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIGNhc2VfaGlnaGxpZ2h0czogeyBsYWJlbDogJ1x1OTFDRFx1ODk4MVx1NjBDNVx1NTgzMScgfSxcbiAgICAgICAgY2FzZV9zdGF0dXNfcGF0aDogeyBsYWJlbDogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOVx1MzA2RVx1OTAzMlx1NjM1NycgfSxcbiAgICAgICAgY2FzZV9kZXRhaWxzOiB7IGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHU4QTczXHU3RDMwXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxlYWRfZGV0YWlsX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU4QTczXHU3RDMwJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnXHUzMENGXHUzMEE0XHUzMEU5XHUzMEE0XHUzMEM4XHUzMEZCXHU4QTczXHU3RDMwXHUzMEZCXHU5NUEyXHU5MDIzXHU2MEM1XHU1ODMxXHUzMDkyXHU1MDk5XHUzMDQ4XHUzMDVGXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDZFXHU3RENGXHU1NDA4XHU4QTczXHU3RDMwXHUzMERBXHUzMEZDXHUzMEI4XHUzMDAyJyxcbiAgICAgIHRpdGxlOiAne2ZpcnN0X25hbWV9IHtsYXN0X25hbWV9JyxcbiAgICAgIHN1YnRpdGxlOiAne2NvbXBhbnl9JyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgbGVhZF9kdXBsaWNhdGVfYWxlcnRfY29uZmlybWVkOiB7IGxhYmVsOiAnXHU5MUNEXHU4OTA3XHU3OEJBXHU1QjlBXHUzMDZFXHU4QjY2XHU1NDRBJyB9LFxuICAgICAgICBsZWFkX2R1cGxpY2F0ZV9hbGVydF9zdXNwZWN0ZWQ6IHsgbGFiZWw6ICdcdTkxQ0RcdTg5MDdcdTMwNkVcdTc1OTFcdTMwNDRcdTMwNkVcdThCNjZcdTU0NEEnIH0sXG4gICAgICAgIGxlYWRfaGlnaGxpZ2h0czogeyBsYWJlbDogJ1x1OTFDRFx1ODk4MVx1NjBDNVx1NTgzMScgfSxcbiAgICAgICAgbGVhZF9wYXRoOiB7IGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHUzMDZFXHU5MDMyXHU2MzU3JyB9LFxuICAgICAgICBtYWluX3RhYnM6IHsgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTYwQzVcdTU4MzFcdTMwQkZcdTMwRDYnIH0sXG4gICAgICAgIGxlYWRfZGV0YWlsczogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1OEE3M1x1N0QzMFx1NjBDNVx1NTgzMScgfSxcbiAgICAgICAgcmVsYXRlZF9hY2NvcmRpb246IHsgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzknIH0sXG4gICAgICAgIHJlbGF0ZWRfdGFza3M6IHsgdGl0bGU6ICdcdTY3MkFcdTVCOENcdTRFODZcdTMwNkVcdTMwQkZcdTMwQjlcdTMwQUYnLCBsYWJlbDogJ1x1MzBCRlx1MzBCOVx1MzBBRicgfSxcbiAgICAgICAgbGVhZF9hY3Rpdml0eTogeyBsYWJlbDogJ1x1NkQzQlx1NTJENVx1MzBCRlx1MzBBNFx1MzBFMFx1MzBFOVx1MzBBNFx1MzBGMycgfSxcbiAgICAgICAgbGVhZF9oaXN0b3J5OiB7IGxhYmVsOiAnXHU5ODA1XHU3NkVFXHU1QzY1XHU2Qjc0JyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG9wcG9ydHVuaXR5X2RldGFpbF9wYWdlOiB7XG4gICAgICBsYWJlbDogJ1x1NTU0Nlx1OEFDN1x1OEE3M1x1N0QzMCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCOFx1MzBEMVx1MzBCOVx1MzBGQlx1MzBDRlx1MzBBNFx1MzBFOVx1MzBBNFx1MzBDOFx1MzBGQlx1OEE3M1x1N0QzMFx1MzBGQlx1OTVBMlx1OTAyM1x1MzBFQVx1MzBCOVx1MzBDOFx1MzA5Mlx1NTA5OVx1MzA0OFx1MzA1Rlx1NTU0Nlx1OEFDN1x1MzA2RVx1N0RDRlx1NTQwOFx1OEE3M1x1N0QzMFx1MzBEQVx1MzBGQ1x1MzBCOFx1MzAwMicsXG4gICAgICB0aXRsZTogJ3tuYW1lfScsXG4gICAgICBzdWJ0aXRsZTogJ3tjcm1fYWNjb3VudH0nLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBvcHBfaGlnaGxpZ2h0czogeyBsYWJlbDogJ1x1OTFDRFx1ODk4MVx1NjBDNVx1NTgzMScgfSxcbiAgICAgICAgb3BwX3N0YWdlX3BhdGg6IHsgbGFiZWw6ICdcdTU1NDZcdThBQzdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjhcdTMwNkVcdTkwMzJcdTYzNTcnIH0sXG4gICAgICAgIG9wcF9kZXRhaWxzOiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHU4QTczXHU3RDMwXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHNhbGVzX2hvbWVfcGFnZToge1xuICAgICAgbGFiZWw6ICdcdTU1QjZcdTY5NkRcdTMwREJcdTMwRkNcdTMwRTAnLFxuICAgICAgZGVzY3JpcHRpb246ICdcdTRFM0JcdTg5ODFcdTYzMDdcdTZBMTlcdTMwNjhcdTMwQUZcdTMwQTRcdTMwQzNcdTMwQUZcdTMwQTJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTMwOTJcdTMwN0VcdTMwNjhcdTMwODFcdTMwNUZcdTU1QjZcdTY5NkRcdTMwQzFcdTMwRkNcdTMwRTBcdTMwNkVcdTMwREJcdTMwRkNcdTMwRTBcdTMwREFcdTMwRkNcdTMwQjgnLFxuICAgICAgdGl0bGU6ICdcdTU1QjZcdTY5NkRcdTMwQzBcdTMwQzNcdTMwQjdcdTMwRTVcdTMwRENcdTMwRkNcdTMwQzknLFxuICAgICAgc3VidGl0bGU6ICdcdTMwNEFcdTMwNEJcdTMwNDhcdTMwOEFcdTMwNkFcdTMwNTVcdTMwNDQnLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBrcGlfcmV2ZW51ZV93b246IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTNEN1x1NkNFOFx1NThGMlx1NEUwQScsXG4gICAgICAgIH0sXG4gICAgICAgIGtwaV9kZWFsc193b246IHtcbiAgICAgICAgICBsYWJlbDogJ1x1NTNEN1x1NkNFOFx1NEVGNlx1NjU3MCcsXG4gICAgICAgIH0sXG4gICAgICAgIGtwaV9waXBlbGluZV92YWx1ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHU5MUQxXHU5ODREJyxcbiAgICAgICAgfSxcbiAgICAgICAga3BpX29wZW5fbGVhZHM6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1MzBFQVx1MzBGQ1x1MzBDOScsXG4gICAgICAgIH0sXG4gICAgICAgIGhvbWVfdXBjb21pbmdfZXZlbnRzOiB7XG4gICAgICAgICAgbGFiZWw6ICdcdUQ4M0RcdURDQzUgXHU5NThCXHU1MEFDXHU0RTg4XHU1QjlBIFx1MDBCNyBcdTc2RjRcdThGRDFcdTk4MDYnLFxuICAgICAgICB9LFxuICAgICAgICBxdWlja19jcmVhdGU6IHsgdGl0bGU6ICdcdTMwQUZcdTMwQTRcdTMwQzNcdTMwQUZcdTRGNUNcdTYyMTAnLCBsYWJlbDogJ1x1MzBBRlx1MzBBNFx1MzBDM1x1MzBBRlx1NEY1Q1x1NjIxMCcgfSxcbiAgICAgICAga2V5X21ldHJpY3M6IHsgdGl0bGU6ICdcdTRFM0JcdTg5ODFcdTY5NkRcdTdFM0VcdThBNTVcdTRGQTFcdTYzMDdcdTZBMTknLCBsYWJlbDogJ1x1NEUzQlx1ODk4MVx1NjMwN1x1NkExOScgfSxcbiAgICAgICAgaG9tZV90YWJzOiB7IGxhYmVsOiAnXHUzMERCXHUzMEZDXHUzMEUwXHUzMEJGXHUzMEQ2JyB9LFxuICAgICAgICBob21lX215X2xlYWRzOiB7IGxhYmVsOiAnXHU3OUMxXHUzMDZFXHUzMEVBXHUzMEZDXHUzMEM5JyB9LFxuICAgICAgICBob21lX215X2RlYWxzOiB7IGxhYmVsOiAnXHU3OUMxXHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHU1NTQ2XHU4QUM3JyB9LFxuICAgICAgICBob21lX215X3Rhc2tzOiB7IGxhYmVsOiAnXHU3OUMxXHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHUzMEJGXHUzMEI5XHUzMEFGJyB9LFxuICAgICAgICBhaV9icmllZmluZzoge1xuICAgICAgICAgIHRpdGxlOiAnQUkgXHUzMEEyXHUzMEI3XHUzMEI5XHUzMEJGXHUzMEYzXHUzMEM4XHUzMDZCXHU4Q0VBXHU1NTRGJyxcbiAgICAgICAgICBsYWJlbDogJ1x1NEVDQVx1NjVFNVx1MzA2RSBBSSBcdTMwQTJcdTMwQjdcdTMwQjlcdTMwQkZcdTMwRjNcdTMwQzgnLFxuICAgICAgICB9LFxuICAgICAgICB1cGNvbWluZ19ldmVudHM6IHsgdGl0bGU6ICdcdTRFQ0FcdTVGOENcdTMwNkVcdTRFODhcdTVCOUEnLCBsYWJlbDogJ1x1NEVDQVx1NUY4Q1x1MzA2RVx1NEU4OFx1NUI5QScgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB1dGlsaXR5X2Jhcl9wYWdlOiB7XG4gICAgICBsYWJlbDogJ1x1MzBFNlx1MzBGQ1x1MzBDNlx1MzBBM1x1MzBFQVx1MzBDNlx1MzBBM1x1MzBEMFx1MzBGQycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1x1MzBENVx1MzBFRFx1MzBGQ1x1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMFx1MzBDNFx1MzBGQ1x1MzBFQlx1MzA3OFx1MzA2RVx1MzBBRlx1MzBBNFx1MzBDM1x1MzBBRlx1MzBBMlx1MzBBRlx1MzBCQlx1MzBCOVx1MzBEMFx1MzBGQycsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIG5vdGlmaWNhdGlvbnNfcGFuZWw6IHsgbGFiZWw6ICdcdTkwMUFcdTc3RTUnIH0sXG4gICAgICAgIHF1aWNrX25vdGVzOiB7IHRpdGxlOiAnXHUzMEFGXHUzMEE0XHUzMEMzXHUzMEFGXHUzMEUxXHUzMEUyJywgbGFiZWw6ICdcdTMwQUZcdTMwQTRcdTMwQzNcdTMwQUZcdTMwRTFcdTMwRTInIH0sXG4gICAgICAgIHF1aWNrX3NlYXJjaDogeyBsYWJlbDogJ1x1MzBBRlx1MzBBNFx1MzBDM1x1MzBBRlx1NjkxQ1x1N0QyMicgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgLy8gU2NyZWVuLWZsb3cgY29weSAoIzEyMTAsICMxOTc1KS4gS2V5ZWQgYGZsb3dzLjxmbG93Pi5sYWJlbGAsXG4gIC8vIGBzY3JlZW5zLjxub2RlPi50aXRsZWAgYW5kIGBzY3JlZW5zLjxub2RlPi5maWVsZHMuPGZpZWxkPi57bGFiZWwscGxhY2Vob2xkZXJ9YFxuICAvLyBcdTIwMTQgdGhlIGtleXMgYG9zIGxpbnRgJ3MgYGkxOG4vbWlzc2luZy1mbG93YCBuYW1lcywgcmVhZCBieSB0aGUgY29uc29sZSdzXG4gIC8vIGZsb3cgcnVubmVyIHNpbmNlIEBvYmplY3RzdGFjayAxNy43LjAgKHRoZSBzcGVjJ3MgYGZsb3dzYCBsaXZlbmVzcyByb3cgaXNcbiAgLy8gYGxpdmVgIHRoZXJlKS4gQSBzY3JlZW4gd2l0aCBubyBhdXRob3JlZCBgdGl0bGVgIHNob3dzIGl0cyBmbG93J3MgbGFiZWwgaW5cbiAgLy8gZXZlcnkgbG9jYWxlLCBzbyBlYWNoIGBzY3JlZW5fMS50aXRsZWAgcmVwZWF0cyB0aGUgZmxvdyBsYWJlbC4gU2luY2VcbiAgLy8gMTguMC4wLW5leHQuMCB0aHJlZSBtb3JlIHN1cmZhY2VzIGFyZSBrZXlzIHRoZSBlbmdpbmUgcmVhZHMgaW4gdGhlIHJ1bidzXG4gIC8vIGxvY2FsZSwgYW5kIGBpMThuL21pc3NpbmctZmxvd2AgbmFtZXMgZWFjaCBtaXNzaW5nIG9uZTogYSBzZWxlY3QgZmllbGQnc1xuICAvLyBgb3B0aW9ucy48dmFsdWU+YCAod29yZGVkIGFzIHRoZSBvYmplY3QgZmllbGQncyBvd24gb3B0aW9uIGluIHRoaXMgcGFjayksXG4gIC8vIGFuIGF1dGhvcmVkIHNjcmVlbiBgZGVzY3JpcHRpb25gLCBhbmQgYSByZWZ1c2luZyBgZW5kYCBub2RlJ3NcbiAgLy8gYHJlZnVzYWxzLjxub2RlPi5tZXNzYWdlYC4gQSB0cmFuc2xhdGVkIGRlc2NyaXB0aW9uIG9yIG1lc3NhZ2UgaXMgYSB0ZXh0XG4gIC8vIHNsb3QgbGlrZSB0aGUgb25lIGl0IHRyYW5zbGF0ZXMsIHNvIGEgaG9sZSBpbiBpdCBpcyBge3sgfX1gLlxuICAvLyBUaGUgZGlzY291bnQgY2VpbGluZyBpcyBpbnRlcnBvbGF0ZWQgZnJvbSBgUVVPVEVfRElTQ09VTlRfQ0VJTElOR2AsIG5ldmVyXG4gIC8vIHJldHlwZWQ6IHRoZSBudW1iZXIgbGl2ZXMgaW4gYF90aHJlc2hvbGRzLnRzYCBhbG9uZSAoIzE3MTEpLlxuICBmbG93czoge1xuICAgIGNhbXBhaWduX2Vucm9sbG1lbnQ6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHUzMDZCXHUzMEUxXHUzMEYzXHUzMEQwXHUzMEZDXHUzMDkyXHU3NjdCXHU5MzMyJyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzA2Qlx1MzBFMVx1MzBGM1x1MzBEMFx1MzBGQ1x1MzA5Mlx1NzY3Qlx1OTMzMicsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBtZW1iZXJTb3VyY2U6IHsgbGFiZWw6ICdcdTc2N0JcdTkzMzJcdTMwNTlcdTMwOEJcdTMwRTFcdTMwRjNcdTMwRDBcdTMwRkNcdTMwNkVcdTdBMkVcdTk4NUUnLCBvcHRpb25zOiB7IGxlYWRzOiAnXHUzMEVBXHUzMEZDXHUzMEM5JywgY29udGFjdHM6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDUnIH0gfSxcbiAgICAgICAgICAgIGxlYWRTdGF0dXM6IHsgbGFiZWw6ICdcdTc2N0JcdTkzMzJcdTMwNTlcdTMwOEJcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkVcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLCBvcHRpb25zOiB7IG5ldzogJ1x1NjVCMFx1ODk4RicsIGNvbnRhY3RlZDogJ1x1MzBCM1x1MzBGM1x1MzBCRlx1MzBBRlx1MzBDOFx1NkUwOFx1MzA3RicsIHF1YWxpZmllZDogJ1x1OTA2OVx1NjgzQycgfSB9LFxuICAgICAgICAgICAgY29udGFjdERlcGFydG1lbnQ6IHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdcdTc2N0JcdTkzMzJcdTMwNTlcdTMwOEJcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTMwNkVcdTkwRThcdTk1ODAnLFxuICAgICAgICAgICAgICBvcHRpb25zOiB7IGV4ZWN1dGl2ZTogJ1x1N0Q0Q1x1NTVCNlx1NUM2NCcsIHNhbGVzOiAnXHU1NUI2XHU2OTZEXHU5MEU4JywgbWFya2V0aW5nOiAnXHUzMERFXHUzMEZDXHUzMEIxXHUzMEM2XHUzMEEzXHUzMEYzXHUzMEIwXHU5MEU4JywgZW5naW5lZXJpbmc6ICdcdTMwQThcdTMwRjNcdTMwQjhcdTMwQ0JcdTMwQTJcdTMwRUFcdTMwRjNcdTMwQjBcdTkwRTgnLCBzdXBwb3J0OiAnXHUzMEI1XHUzMEREXHUzMEZDXHUzMEM4XHU5MEU4JywgZmluYW5jZTogJ1x1N0Q0Q1x1NzQwNlx1OTBFOCcsIGhyOiAnXHU0RUJBXHU0RThCXHU5MEU4Jywgb3BlcmF0aW9uczogJ1x1MzBBQVx1MzBEQVx1MzBFQ1x1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGM1x1OTBFOCcgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBlc2NhbGF0ZV9jYXNlOiB7XG4gICAgICBsYWJlbDogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA5Mlx1MzBBOFx1MzBCOVx1MzBBQlx1MzBFQ1x1MzBGQ1x1MzBDOCcsXG4gICAgICBzY3JlZW5zOiB7IHNjcmVlbl8xOiB7IHRpdGxlOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDkyXHUzMEE4XHUzMEI5XHUzMEFCXHUzMEVDXHUzMEZDXHUzMEM4JywgZmllbGRzOiB7IHJlYXNvbjogeyBsYWJlbDogJ1x1MzBBOFx1MzBCOVx1MzBBQlx1MzBFQ1x1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGM1x1NzQwNlx1NzUzMScgfSB9IH0gfSxcbiAgICB9LFxuICAgIGNsb3NlX2Nhc2U6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDkyXHUzMEFGXHUzMEVEXHUzMEZDXHUzMEJBJyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA5Mlx1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQScsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICByZXNvbHV0aW9uOiB7IGxhYmVsOiAnXHU4OUUzXHU2QzdBXHU1MTg1XHU1QkI5JyB9LFxuICAgICAgICAgICAgcmVzb2x2ZWRfYnlfYXJ0aWNsZTogeyBsYWJlbDogJ1x1ODlFM1x1NkM3QVx1MzA2Qlx1NEY3Rlx1MzA2M1x1MzA1Rlx1MzBDQVx1MzBFQ1x1MzBDM1x1MzBCOFx1OEExOFx1NEU4Qlx1RkYwOFx1NEVGQlx1NjEwRlx1RkYwOScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNsYWltX2Nhc2U6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDkyXHU1RjE1XHUzMDREXHU1M0Q3XHUzMDUxXHUzMDhCJyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA5Mlx1NUYxNVx1MzA0RFx1NTNEN1x1MzA1MVx1MzA4QicsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBjbGFpbVN0YXR1czoge1xuICAgICAgICAgICAgICBsYWJlbDogJ1x1NUJGRVx1NUZEQ1x1NzJCNlx1NkNDMScsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHsgaW5fcHJvZ3Jlc3M6ICdcdTVCRkVcdTVGRENcdTRFMkQnLCB3YWl0aW5nX2N1c3RvbWVyOiAnXHU5ODY3XHU1QkEyXHUzMDZFXHU1NkRFXHU3QjU0XHU1Rjg1XHUzMDYxJywgd2FpdGluZ19zdXBwb3J0OiAnXHUzMEI1XHUzMEREXHUzMEZDXHUzMEM4XHUzMDZFXHU1NkRFXHU3QjU0XHU1Rjg1XHUzMDYxJyB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxlYWRfY29udmVyc2lvbjoge1xuICAgICAgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTU5MDlcdTYzREJcdTMwRDdcdTMwRURcdTMwQkJcdTMwQjknLFxuICAgICAgc2NyZWVuczoge1xuICAgICAgICBzY3JlZW5fMToge1xuICAgICAgICAgIHRpdGxlOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU1OTA5XHU2M0RCXHUzMEQ3XHUzMEVEXHUzMEJCXHUzMEI5JyxcbiAgICAgICAgICAvLyBUaGUgZHVwbGljYXRlIHdhcm5pbmcncyB0ZXh0IGlzIGEgdmFyaWFibGUgdGhlIGZsb3cgYXNzaWduczsgdGhpc1xuICAgICAgICAgIC8vIGtleSBjYW4gb25seSBjYXJyeSB0aGUgaG9sZSB0aGF0IHNob3dzIGl0LlxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAne3tkdXBsaWNhdGVXYXJuaW5nfX0nLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgY3JlYXRlT3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdcdTU1NDZcdThBQzdcdTMwOTJcdTRGNUNcdTYyMTBcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdUZGMUYnIH0sXG4gICAgICAgICAgICBvcHBvcnR1bml0eU5hbWU6IHsgbGFiZWw6ICdcdTU1NDZcdThBQzdcdTU0MEQnIH0sXG4gICAgICAgICAgICBvcHBvcnR1bml0eUFtb3VudDogeyBsYWJlbDogJ1x1NTU0Nlx1OEFDN1x1OTFEMVx1OTg0RCcgfSxcbiAgICAgICAgICAgIGNsb3NlRGF0ZTogeyBsYWJlbDogJ1x1NUI4Q1x1NEU4Nlx1NEU4OFx1NUI5QVx1NjVFNScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByZWZ1c2VfY29uZmlybWVkX2R1cGxpY2F0ZToge1xuICAgICAgICAgIHRpdGxlOiAnXHU1OTA5XHU2M0RCXHUzMDZGXHU2MkQyXHU1NDI2XHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU3XHUzMDVGJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdcdTMwNTNcdTMwNkVcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkVcdTkxQ0RcdTg5MDdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjlcdTMwNkZcdTMwMENcdTkxQ0RcdTg5MDdcdTc4QkFcdTVCOUFcdTMwMERcdTMwNjdcdTMwNTlcdTMwMDJcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkNcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNENcdTY1RTJcdTVCNThcdTMwNkVcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzlcdTMwNjhcdTcxNjdcdTU0MDhcdTMwNTdcdTMwMDFcdTkxQ0RcdTg5MDdcdTMwNjdcdTMwNDJcdTMwOEJcdTMwNjhcdThBMThcdTkzMzJcdTMwNTdcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDJcdTU5MDlcdTYzREJcdTMwNTlcdTMwOEJcdTMwNjhcdTMwMDFcdTU0MENcdTMwNThcdThDRkNcdTUxNjVcdTgwMDVcdTMwNkJcdTVCRkVcdTMwNTdcdTMwNjZcdTUzRDZcdTVGMTVcdTUxNDhcdTMwRkJcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTMwRkJcdTU1NDZcdThBQzdcdTMwNENcdTMwODJcdTMwNDYgMSBcdTRFRjZcdTMwNUFcdTMwNjRcdTRGNUNcdTYyMTBcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTlcdTMwMDJcdTZCOEJcdTMwNTlcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzlcdTMwNkZcdTMwNTNcdTMwNkVcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkVcdTMwMENcdTkxQ0RcdTg5MDdcdTdCQTFcdTc0MDZcdTMwMERcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTMwNkJcdTg4NjhcdTc5M0FcdTMwNTVcdTMwOENcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNTlcdTMwMDJcdTRFRTNcdTMwOEZcdTMwOEFcdTMwNkJcdTMwMDFcdTMwNTNcdTMwNkVcdTMwRUFcdTMwRkNcdTMwQzlcdTMwOTJcdTkxQ0RcdTg5MDdcdTMwNjhcdTMwNTdcdTMwNjZcdTRFMERcdTkwNjlcdTY4M0NcdTMwNkJcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDJcdTU5MDlcdTYzREJcdTMwOTJcdTUxOERcdTMwNzNcdTUzRUZcdTgwRkRcdTMwNkJcdTMwNjdcdTMwNERcdTMwOEJcdTMwNkVcdTMwNkZcdTMwMDFcdTMwNURcdTMwNkVcdTUyMjRcdTVCOUFcdTMwOTJcdTg5OEJcdTc2RjRcdTMwNTlcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkNcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNjBcdTMwNTFcdTMwNjdcdTMwNTlcdTMwMDInLFxuICAgICAgICB9LFxuICAgICAgICByZWZ1c2VfdW5hcHByb3ZlZDoge1xuICAgICAgICAgIHRpdGxlOiAnXHU1OTA5XHU2M0RCXHUzMDZGXHU2MkQyXHU1NDI2XHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU3XHUzMDVGJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdcdTMwNTNcdTMwNkVcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkZcdTMwN0VcdTMwNjBcdTU5MDlcdTYzREJcdTMwNkVcdTYyN0ZcdThBOERcdTMwOTJcdTVGOTdcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDJcdTUzRDZcdTVGMTVcdTUxNDhcdTMwRkJcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTMwRkJcdTU1NDZcdThBQzdcdTMwNkJcdTU5MDlcdTYzREJcdTMwNTlcdTMwOEJcdTMwNkJcdTMwNkZcdTMwMDFcdTUxNDhcdTMwNkJcdTYyN0ZcdThBOERcdTgwMDVcdTMwNkVcdTYyN0ZcdThBOERcdTMwNENcdTVGQzVcdTg5ODFcdTMwNjdcdTMwNTlcdTMwMDJcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkVcdTMwMENcdTMwQjNcdTMwRjNcdTMwRDBcdTMwRkNcdTMwQjhcdTMwRTdcdTMwRjNcdTYyN0ZcdThBOERcdTMwMERcdTk4MDVcdTc2RUVcdTMwNjdcdTMwMDFcdTUyMjRcdTY1QURcdTMwNENcdTMwN0VcdTMwNjBcdTYyN0ZcdThBOERcdTVGODVcdTMwNjFcdTMwNEJcdTMwMDFcdTUzNzRcdTRFMEJcdTMwNTVcdTMwOENcdTMwNUZcdTMwNEJcdTMwOTJcdTc4QkFcdThBOERcdTMwNjdcdTMwNERcdTMwN0VcdTMwNTlcdTMwMDJcdTMwNURcdTMwOENcdTMwN0VcdTMwNjdcdTMwNkVcdTk1OTNcdTMwODJcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNzhcdTMwNkVcdTVCRkVcdTVGRENcdTMwNkZcdTdEOUFcdTMwNTFcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDJcdTUxQ0RcdTdENTBcdTMwNTVcdTMwOENcdTMwOEJcdTMwODJcdTMwNkVcdTMwNkZcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDInLFxuICAgICAgICB9LFxuICAgICAgICByZWZ1c2Vfbm9fbWF0Y2hfa2V5OiB7XG4gICAgICAgICAgdGl0bGU6ICdcdTU5MDlcdTYzREJcdTMwNkZcdTYyRDJcdTU0MjZcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUYnLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgJ1x1MzA1M1x1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2RVx1NEYxQVx1NzkzRVx1NTQwRFx1MzA2Qlx1MzA2Rlx1NzE2N1x1NTQwOFx1MzBBRFx1MzBGQ1x1MzA0Q1x1MzA2QVx1MzA0NFx1MzA1Rlx1MzA4MVx1MzAwMVx1NTkwOVx1NjNEQlx1MzA2N1x1MzA2Rlx1MzA2OVx1MzA2RVx1NTNENlx1NUYxNVx1NTE0OFx1MzA2Qlx1NUM1RVx1MzA1OVx1MzA4Qlx1MzA0Qlx1MzA5Mlx1NTIyNFx1NjVBRFx1MzA2N1x1MzA0RFx1MzA1QVx1MzAwMVx1NjNBOFx1NkUyQ1x1MzA4Mlx1MzA1N1x1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMlx1NjNBOFx1NkUyQ1x1MzA1OVx1MzA4Qlx1MzA2OFx1MzAwMVx1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNVx1MzA2OFx1NTU0Nlx1OEFDN1x1MzA0Q1x1NTIyNVx1MzA2RVx1OTg2N1x1NUJBMlx1MzA2RVx1NEUwQlx1MzA2Qlx1NzY3Qlx1OTMzMlx1MzA1NVx1MzA4Q1x1MzA4Qlx1MzA0QVx1MzA1RFx1MzA4Q1x1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVx1MzAwMlx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2RVx1MzAwQ1x1NEYxQVx1NzkzRVx1NTQwRFx1MzAwRFx1MzA5Mlx1NEZERFx1NUI1OFx1MzA1OVx1MzA4Qlx1MzA2OFx1MzBBRFx1MzBGQ1x1MzA0Q1x1NTE4RFx1NEY1Q1x1NjIxMFx1MzA1NVx1MzA4Q1x1MzA4Qlx1MzA2RVx1MzA2N1x1MzAwMVx1MzA4Mlx1MzA0Nlx1NEUwMFx1NUVBNlx1NEZERFx1NUI1OFx1MzA1N1x1MzA2Nlx1MzA0Qlx1MzA4OVx1NTkwOVx1NjNEQlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlx1NEY1NVx1MzA4Mlx1NEY1Q1x1NjIxMFx1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgc2NoZWR1bGVfZm9sbG93dXA6IHtcbiAgICAgIGxhYmVsOiAnXHUzMEQ1XHUzMEE5XHUzMEVEXHUzMEZDXHUzMEEyXHUzMEMzXHUzMEQ3XHUzMDkyXHU4QTJEXHU1QjlBJyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1MzBENVx1MzBBOVx1MzBFRFx1MzBGQ1x1MzBBMlx1MzBDM1x1MzBEN1x1MzA5Mlx1OEEyRFx1NUI5QScsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU2QjIxXHUzMDZFXHUzMEI5XHUzMEM2XHUzMEMzXHUzMEQ3XHUzMDZGXHVGRjFGJyB9LFxuICAgICAgICAgICAgZHVlRGF0ZTogeyBsYWJlbDogJ1x1NjcxRlx1OTY1MCcgfSxcbiAgICAgICAgICAgIGFjdGl2aXR5VHlwZToge1xuICAgICAgICAgICAgICBsYWJlbDogJ1x1NkQzQlx1NTJENVx1N0EyRVx1NTIyNScsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHsgY2FsbDogJ1x1OTZGQlx1OEE3MScsIGVtYWlsOiAnXHUzMEUxXHUzMEZDXHUzMEVCJywgbWVldGluZzogJ1x1NEYxQVx1OEI3MCcsIGZvbGxvd191cDogJ1x1MzBENVx1MzBBOVx1MzBFRFx1MzBGQ1x1MzBBMlx1MzBDM1x1MzBENycsIGRlbW86ICdcdTMwQzdcdTMwRTInLCBvdGhlcjogJ1x1MzA1RFx1MzA2RVx1NEVENicgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmlvcml0eTogeyBsYWJlbDogJ1x1NTEyQVx1NTE0OFx1NUVBNicsIG9wdGlvbnM6IHsgbG93OiAnXHU0RjRFJywgbm9ybWFsOiAnXHU5MDFBXHU1RTM4JywgaGlnaDogJ1x1OUFEOCcsIHVyZ2VudDogJ1x1N0RDQVx1NjAyNScgfSB9LFxuICAgICAgICAgICAgbm90ZXM6IHsgbGFiZWw6ICdcdTMwRTFcdTMwRTInIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBxdW90ZV9nZW5lcmF0aW9uOiB7XG4gICAgICBsYWJlbDogJ1x1NTU0Nlx1OEFDN1x1MzA0Qlx1MzA4OVx1ODk4Qlx1N0E0RFx1MzA5Mlx1NEY1Q1x1NjIxMCcsXG4gICAgICByZWZ1c2FsczogeyByZWZ1c2VfaGVsZDogeyBtZXNzYWdlOiAnXHU1MTQ4XHUzMDZCXHU2ODQ4XHU0RUY2XHU1MzE2XHU2MjdGXHU4QThEXHUzMDRDXHU1RkM1XHU4OTgxXHUzMDY3XHUzMDU5XHUzMDAyXHUzMDBDXHU2ODQ4XHU0RUY2XHU1MzE2XHU2MjdGXHU4QThEXHUzMDkyXHU3NTMzXHU4QUNCXHUzMDBEXHUzMDZCXHUzMEMxXHUzMEE3XHUzMEMzXHUzMEFGXHUzMDkyXHU1MTY1XHUzMDhDXHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyXHU0RjU1XHUzMDgyXHU0RjVDXHU2MjEwXHUzMDU1XHUzMDhDXHUzMDY2XHUzMDQ0XHUzMDdFXHUzMDVCXHUzMDkzXHUzMDAyJyB9IH0sXG4gICAgICBzY3JlZW5zOiB7XG4gICAgICAgIHNjcmVlbl8xOiB7XG4gICAgICAgICAgdGl0bGU6ICdcdTU1NDZcdThBQzdcdTMwNEJcdTMwODlcdTg5OEJcdTdBNERcdTMwOTJcdTRGNUNcdTYyMTAnLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgcXVvdGVOYW1lOiB7IGxhYmVsOiAnXHU4OThCXHU3QTREXHU1NDBEJyB9LFxuICAgICAgICAgICAgZXhwaXJhdGlvbkRheXM6IHsgbGFiZWw6ICdcdTY3MDlcdTUyQjlcdTY3MUZcdTk1OTNcdUZGMDhcdTY1RTVcdUZGMDknIH0sXG4gICAgICAgICAgICBkaXNjb3VudDogeyBsYWJlbDogYFx1NTI3Mlx1NUYxNVx1NzM4NyAlIChcdTIyNjQgJHtRVU9URV9ESVNDT1VOVF9DRUlMSU5HfSlgLCBwbGFjZWhvbGRlcjogYDAtJHtRVU9URV9ESVNDT1VOVF9DRUlMSU5HfWAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9fc2hhcmVkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUFwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvX3NoYXJlZC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBcdTY1RTVcdTY3MkNcdThBOUUgKGphLUpQKSBcdTIwMTQgdmFsdWVzIHNoYXJlZCBieSBtb3JlIHRoYW4gb25lIHBhcnQgb2YgdGhpcyBidW5kbGUuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAudHNgLlxuICpcbiAqIEV2ZXJ5IGNvbnN0YW50IGhlcmUgaXMgc3ByZWFkIGludG8gb2JqZWN0IHJvd3MgdGhhdCBsaXZlIGluIE1PUkUgVEhBTiBPTkVcbiAqIGZhbWlseSBmaWxlLCBzbyBpdCBjYW5ub3Qgc2l0IGluIGFueSBvbmUgb2YgdGhlbS4gQSB2YWx1ZSB1c2VkIGJ5IGV4YWN0bHlcbiAqIG9uZSBmYW1pbHkgbGl2ZXMgaW4gdGhhdCBmYW1pbHkncyBmaWxlIGluc3RlYWQgXHUyMDE0IHRoYXQgc3BsaXQgaXMgbWVjaGFuaWNhbCxcbiAqIG5vdCBhIGp1ZGdlbWVudCBjYWxsLlxuICovXG5cbi8qKlxuICogXHU2RDNCXHU1MkQ1XHUzMEEyXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHU3RkE0XHVGRjA4IzU5Mlx1RkYwOTogYGxvZ19jYWxsYCAvIGBsb2dfbWVldGluZ2AgLyBgc2NoZWR1bGVfbWVldGluZ2AgXHUzMDZGXG4gKiBcdTMwRUFcdTMwRkNcdTMwQzlcdTMwRkJcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTMwRkJcdTUzRDZcdTVGMTVcdTUxNDhcdTMwRkJcdTU1NDZcdThBQzdcdTMwRkJcdTMwQjFcdTMwRkNcdTMwQjlcdTMwNkVcdTU0MDRcdTMwQUFcdTMwRDZcdTMwQjhcdTMwQTdcdTMwQUZcdTMwQzhcdTMwNTRcdTMwNjhcdTMwNkJcdTc2N0JcdTkzMzJcdTMwNTVcdTMwOENcdTMwOEJcbiAqIFx1RkYwOGBvYmplY3ROYW1lYCBcdTMwOTJcdTYzMDFcdTMwNUZcdTMwNkFcdTMwNDRcdTMwQjlcdTMwQUZcdTMwRUFcdTMwRDdcdTMwQzhcdTMwQTJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTMwNkZcdTMwQzdcdTMwQTNcdTMwQjlcdTMwRDFcdTMwQzNcdTMwQzFcdTMwRTNcdTMwNENcdTUzQzJcdTcxNjdcdTMwNTdcdTMwNkFcdTMwNDRcbiAqIFx1MzBBRFx1MzBGQ1x1MzA2Qlx1NzY3Qlx1OTMzMlx1MzA1NVx1MzA4Q1x1MzA4Qlx1MzA1Rlx1MzA4MSBcdTIwMTQgIzUwOVx1RkYwOVx1MzAwMlx1NjU4N1x1OEEwMFx1MzA2RiA1IFx1MzBBQVx1MzBENlx1MzBCOFx1MzBBN1x1MzBBRlx1MzBDOFx1MzA2N1x1NTQwQ1x1NEUwMFx1MzA2QVx1MzA2RVx1MzA2N1x1MzAwMVx1MzA1M1x1MzA1M1x1MzA2N1xuICogXHU0RTAwXHU1RUE2XHUzMDYwXHUzMDUxXHU1QjlBXHU3RkE5XHUzMDU3XHUzMDY2XHU1NDA0IGBfYWN0aW9uc2AgXHUzMDZCXHU1QzU1XHU5NThCXHUzMDU5XHUzMDhCXHUzMDAyXG4gKi9cbmV4cG9ydCBjb25zdCBhY3Rpdml0eUFjdGlvbnMgPSB7XG4gIGxvZ19jYWxsOiB7XG4gICAgbGFiZWw6ICdcdTk2RkJcdThBNzFcdTMwOTJcdThBMThcdTkzMzInLFxuICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU5NkZCXHU4QTcxXHUzMDkyXHU4QTE4XHU5MzMyXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHVGRjAxJyxcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN1YmplY3Q6IHsgbGFiZWw6ICdcdTk2RkJcdThBNzFcdTMwNkVcdTRFRjZcdTU0MEQnIH0sXG4gICAgICBkdXJhdGlvbjogeyBsYWJlbDogJ1x1NjI0MFx1ODk4MVx1NjY0Mlx1OTU5M1x1RkYwOFx1NTIwNlx1RkYwOScgfSxcbiAgICAgIGF0dGVuZGVlX2NvbnRhY3RzOiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDZFXHU1M0MyXHU1MkEwXHU4MDA1JyB9LFxuICAgICAgYXR0ZW5kZWVfdXNlcnM6IHsgbGFiZWw6ICdcdTc5M0VcdTUxODVcdTUzQzJcdTUyQTBcdTgwMDUnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ1x1OTAxQVx1OEE3MVx1MzBFMVx1MzBFMicgfSxcbiAgICB9LFxuICB9LFxuICBsb2dfbWVldGluZzoge1xuICAgIGxhYmVsOiAnXHU0RjFBXHU4QjcwXHUzMDkyXHU4QTE4XHU5MzMyJyxcbiAgICBzdWNjZXNzTWVzc2FnZTogJ1x1NEYxQVx1OEI3MFx1MzA5Mlx1OEExOFx1OTMzMlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1RkYwMScsXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU0RjFBXHU4QjcwXHUzMDZFXHU0RUY2XHU1NDBEJyB9LFxuICAgICAgZHVyYXRpb246IHsgbGFiZWw6ICdcdTYyNDBcdTg5ODFcdTY2NDJcdTk1OTNcdUZGMDhcdTUyMDZcdUZGMDknIH0sXG4gICAgICBhdHRlbmRlZV9jb250YWN0czogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNVx1MzA2RVx1NTNDMlx1NTJBMFx1ODAwNScgfSxcbiAgICAgIGF0dGVuZGVlX3VzZXJzOiB7IGxhYmVsOiAnXHU3OTNFXHU1MTg1XHU1M0MyXHU1MkEwXHU4MDA1JyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdcdThCNzBcdTRFOEJcdTMwRTFcdTMwRTInIH0sXG4gICAgfSxcbiAgfSxcbiAgc2NoZWR1bGVfbWVldGluZzoge1xuICAgIGxhYmVsOiAnXHU0RjFBXHU4QjcwXHUzMDkyXHU4QTJEXHU1QjlBJyxcbiAgICBzdWNjZXNzTWVzc2FnZTogJ1x1NEYxQVx1OEI3MFx1MzA5Mlx1OEEyRFx1NUI5QVx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1RkYwMScsXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU0RjFBXHU4QjcwXHUzMDZFXHU0RUY2XHU1NDBEJyB9LFxuICAgICAgc3RhcnRfZGF0ZTogeyBsYWJlbDogJ1x1OTU4Qlx1NTlDQlx1NjVFNSAoVVRDKScgfSxcbiAgICAgIHN0YXJ0X3RpbWU6IHsgbGFiZWw6ICdcdTk1OEJcdTU5Q0JcdTY2NDJcdTUyM0IgKFVUQyknIH0sXG4gICAgICBsb2NhdGlvbjogeyBsYWJlbDogJ1x1NTgzNFx1NjI0MCcgfSxcbiAgICAgIGR1cmF0aW9uOiB7IGxhYmVsOiAnXHU2MjQwXHU4OTgxXHU2NjQyXHU5NTkzXHVGRjA4XHU1MjA2XHVGRjA5JyB9LFxuICAgICAgYXR0ZW5kZWVfY29udGFjdHM6IHsgbGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTMwNkVcdTUzQzJcdTUyQTBcdTgwMDUnIH0sXG4gICAgICBhdHRlbmRlZV91c2VyczogeyBsYWJlbDogJ1x1NzkzRVx1NTE4NVx1NTNDMlx1NTJBMFx1ODAwNScgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHUzMEEyXHUzMEI4XHUzMEE3XHUzMEYzXHUzMEMwJyB9LFxuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIFx1NTE3MVx1NjcwOVx1MzBENFx1MzBDM1x1MzBBRlx1MzBFQVx1MzBCOVx1MzBDOFx1RkYwOGBfcGlja2xpc3RzLnRzYFx1RkYwOVx1MzA2Rlx1ODkwN1x1NjU3MFx1MzBBQVx1MzBENlx1MzBCOFx1MzBBN1x1MzBBRlx1MzBDOFx1MzA2N1x1NTQwQ1x1NEUwMFx1MzA2RVx1NTAyNFx1OTZDNlx1NTQwOFx1MzA5Mlx1NjMwMVx1MzA2NFx1MzAwMlxuICogXHU4QTMzXHU4QTlFXHUzMDRDXHUzMEFBXHUzMEQ2XHUzMEI4XHUzMEE3XHUzMEFGXHUzMEM4XHUzMDU0XHUzMDY4XHUzMDZCXHUzMDc2XHUzMDhDXHUzMDhCXHUzMDY4XHUzMDAxXHU1NDBDXHUzMDU4XHUzMEQ0XHUzMEMzXHUzMEFGXHUzMEVBXHUzMEI5XHUzMEM4XHUzMDRDXHU3NTNCXHU5NzYyXHUzMDZCXHUzMDg4XHUzMDYzXHUzMDY2XHU1MjI1XHUzMDZFXHU4QTAwXHU4NDQ5XHUzMDY3XG4gKiBcdTg4NjhcdTc5M0FcdTMwNTVcdTMwOENcdTMwOEJcdTRFMERcdTUxNzdcdTU0MDhcdTMwNkJcdTMwNkFcdTMwOEJcdUZGMDgjNDk0XHVGRjA5XHUzMDAyXHUzMDUzXHUzMDUzXHUzMDY3XHU0RTAwXHU1RUE2XHUzMDYwXHUzMDUxXHU1QjlBXHU3RkE5XHUzMDU3XHUzMDY2XHU1NDA0XHU2MjQwXHUzMDZCXHU1QzU1XHU5NThCXHUzMDU5XHUzMDhCXHUzMDAyXG4gKiBcdTMwQURcdTMwRkNcdTMwNkZcdTg4NjhcdTc5M0FcdTMwRTlcdTMwRDlcdTMwRUJcdTMwNjdcdTMwNkZcdTMwNkFcdTMwNEYgKipcdTRGRERcdTVCNThcdTUwMjQqKiBcdTMwNjdcdTMwNDJcdTMwOEJcdTMwNTNcdTMwNjhcdTMwNkJcdTZDRThcdTYxMEZcdUZGMDgjNDk0IFx1MzA2RVx1NEUzQlx1NTZFMFx1RkYwOVx1MzAwMlxuICovXG5leHBvcnQgY29uc3Qgc2FsdXRhdGlvbk9wdGlvbnMgPSB7IG1yOiAnTXIuJywgbXM6ICdNcy4nLCBtcnM6ICdNcnMuJywgZHI6ICdcdTUzNUFcdTU4RUInLCBwcm9mOiAnXHU2NTU5XHU2Mzg4JyB9O1xuXG5leHBvcnQgY29uc3QgaW5kdXN0cnlPcHRpb25zID0ge1xuICB0ZWNobm9sb2d5OiAnXHUzMEM2XHUzMEFGXHUzMENFXHUzMEVEXHUzMEI4XHUzMEZDJywgc29mdHdhcmU6ICdcdTMwQkRcdTMwRDVcdTMwQzhcdTMwQTZcdTMwQTdcdTMwQTIgLyBTYWFTJywgZmluYW5jZTogJ1x1OTFEMVx1ODc4RCcsXG4gIGhlYWx0aGNhcmU6ICdcdTMwRDhcdTMwRUJcdTMwQjlcdTMwQjFcdTMwQTInLCByZXRhaWw6ICdcdTVDMEZcdTU4RjInLCBtYW51ZmFjdHVyaW5nOiAnXHU4OEZEXHU5MDIwJyxcbiAgZWR1Y2F0aW9uOiAnXHU2NTU5XHU4MEIyJywgcmVhbF9lc3RhdGU6ICdcdTRFMERcdTUyRDVcdTc1MjMnLCBtZWRpYTogJ1x1MzBFMVx1MzBDN1x1MzBBM1x1MzBBMlx1MzBGQlx1MzBBOFx1MzBGM1x1MzBCRlx1MzBFMScsXG4gIGxvZ2lzdGljczogJ1x1NzI2OVx1NkQ0MScsIGhvc3BpdGFsaXR5OiAnXHUzMERCXHUzMEI5XHUzMEQ0XHUzMEJGXHUzMEVBXHUzMEM2XHUzMEEzJywgZW5lcmd5OiAnXHUzMEE4XHUzMENEXHUzMEVCXHUzMEFFXHUzMEZDXHUzMEZCXHU1MTZDXHU3NkNBJyxcbiAgZ292ZXJubWVudDogJ1x1NjUzRlx1NUU5Q1x1MzBGQlx1ODg0Q1x1NjUzRicsIG5vbnByb2ZpdDogJ1x1OTc1RVx1NTVCNlx1NTIyOScsIG90aGVyOiAnXHUzMDVEXHUzMDZFXHU0RUQ2Jyxcbn07XG5cbmV4cG9ydCBjb25zdCBsZWFkU291cmNlT3B0aW9ucyA9IHtcbiAgd2ViOiAnXHUzMEE2XHUzMEE3XHUzMEQ2JywgcmVmZXJyYWw6ICdcdTdEMzlcdTRFQ0InLCBldmVudDogJ1x1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOFx1MzBGQlx1NUM1NVx1NzkzQVx1NEYxQScsXG4gIHdlYmluYXI6ICdcdTMwQTZcdTMwQTdcdTMwRDNcdTMwQ0FcdTMwRkMnLCBwYXJ0bmVyOiAnXHUzMEQxXHUzMEZDXHUzMEM4XHUzMENBXHUzMEZDJywgYWR2ZXJ0aXNlbWVudDogJ1x1NUU4M1x1NTQ0QScsXG4gIHBhaWRfc2VhcmNoOiAnXHU2NzA5XHU2NTk5XHU2OTFDXHU3RDIyJywgc29jaWFsOiAnXHUzMEJEXHUzMEZDXHUzMEI3XHUzMEUzXHUzMEVCXHUzMEUxXHUzMEM3XHUzMEEzXHUzMEEyJywgY29udGVudDogJ1x1MzBCM1x1MzBGM1x1MzBDNlx1MzBGM1x1MzBDNFx1MzBGQlx1MzBENlx1MzBFRFx1MzBCMCcsXG4gIGNvbGRfY2FsbDogJ1x1MzBCM1x1MzBGQ1x1MzBFQlx1MzBDOVx1MzBCM1x1MzBGQ1x1MzBFQicsIGVtYWlsX2NhbXBhaWduOiAnXHUzMEUxXHUzMEZDXHUzMEVCXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzJywgb3RoZXI6ICdcdTMwNURcdTMwNkVcdTRFRDYnLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9vYmplY3RzLmN1c3RvbWVyLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUFwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5jdXN0b21lci50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG5pbXBvcnQgeyBhY3Rpdml0eUFjdGlvbnMsIHNhbHV0YXRpb25PcHRpb25zLCBpbmR1c3RyeU9wdGlvbnMsIGxlYWRTb3VyY2VPcHRpb25zIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLyoqXG4gKiBcdTY1RTVcdTY3MkNcdThBOUUgKGphLUpQKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIENVU1RPTUVSIGZhbWlseTpcbiAqIHRoZSBjdXN0b21lciByZWNvcmQgaXRzZWxmIFx1MjAxNCBhY2NvdW50cyBhbmQgdGhlIHBlb3BsZSBhdCB0aGVtLlxuICpcbiAqIFJvc3RlcjogYGNybV9hY2NvdW50YCwgYGNybV9jb250YWN0YC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBjdXN0b21lcjogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX2FjY291bnQ6IHtcbiAgICBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OCcsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDgnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU1RjUzXHU3OTNFXHUzMDY4XHU1M0Q2XHU1RjE1XHUzMDZFXHUzMDQyXHUzMDhCXHU0RjAxXHU2OTZEXHUzMEZCXHU3RDQ0XHU3RTU0JyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGFjY291bnRfbnVtYmVyOiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU3NTZBXHU1M0Y3JyB9LFxuICAgICAgcmVnaXN0cmF0aW9uX251bWJlcjoge1xuICAgICAgICBsYWJlbDogJ1x1NzY3Qlx1OEExOFx1NzU2QVx1NTNGNycsXG4gICAgICAgIGhlbHA6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNENcdTgxRUFcdTU2RkRcdTMwNkVcdTc2N0JcdThBMThcdTZBNUZcdTk1QTJcdTMwNEJcdTMwODlcdTRFQTRcdTRFRDhcdTMwNTVcdTMwOENcdTMwNUZcdTc2N0JcdThBMThcdTRFMEFcdTMwNkVcdThCNThcdTUyMjVcdTc1NkFcdTUzRjdcdTMwMDJcdTVGNTNcdTc5M0VcdTMwNENcdTYzQTFcdTc1NkFcdTMwNTlcdTMwOEJcdTUzRDZcdTVGMTVcdTUxNDhcdTc1NkFcdTUzRjdcdTMwNjhcdTMwNkZcdTc1NzBcdTMwNkFcdTMwOEFcdTMwN0VcdTMwNTlcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIGNvbW1lcmNpYWxfY2FwYWJpbGl0eToge1xuICAgICAgICBsYWJlbDogJ1x1NTU0Nlx1OEFDN1x1NTNFRlx1NTQyNlx1NTMzQVx1NTIwNicsXG4gICAgICAgIGhlbHA6ICdcdTMwNTNcdTMwNkVcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNkJcdTVCRkVcdTMwNTdcdTMwNjZcdTY1QjBcdTg5OEZcdTMwNkVcdTU1NDZcdThBQzdcdTMwOTJcdTk1OEJcdTU5Q0JcdTMwNjdcdTMwNERcdTMwOEJcdTMwNEJcdTMwNjlcdTMwNDZcdTMwNEJcdTMwMDJcdTZDN0FcdTZFMDhcdTMwNkVcdTMwN0ZcdTMwNkVcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNkZcdThBQ0JcdTZDNDJcdTMwRkJcdTUxNjVcdTkxRDFcdTMwNkJcdTMwNkZcdTVGMTVcdTMwNERcdTdEOUFcdTMwNERcdTUyMjlcdTc1MjhcdTMwNjdcdTMwNERcdTMwN0VcdTMwNTlcdTMwNENcdTMwMDFcdTY1QjBcdTg5OEZcdTU1NDZcdThBQzdcdTMwOTJcdTk1QTJcdTkwMjNcdTRFRDhcdTMwNTFcdTMwOEJcdTMwNTNcdTMwNjhcdTMwNkZcdTMwNjdcdTMwNERcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDInLFxuICAgICAgICBvcHRpb25zOiB7IGZ1bGw6ICdcdTUyMzZcdTk2NTBcdTMwNkFcdTMwNTcnLCBzZXR0bGVtZW50X29ubHk6ICdcdTZDN0FcdTZFMDhcdTMwNkVcdTMwN0YnIH0sXG4gICAgICB9LFxuICAgICAgaW5jdW1iZW50X3ZlbmRvcjogeyBsYWJlbDogJ1x1NzNGRVx1ODg0Q1x1MzBEOVx1MzBGM1x1MzBDMFx1MzBGQycsIGhlbHA6ICdcdTVGNTNcdTc5M0VcdTMwNENcdTcyRDlcdTMwNjNcdTMwNjZcdTMwNDRcdTMwOEJcdTY1MkZcdTUxRkFcdTMwOTJcdTczRkVcdTU3MjhcdTUzRDdcdTZDRThcdTMwNTdcdTMwNjZcdTMwNDRcdTMwOEJcdTMwRDlcdTMwRjNcdTMwQzBcdTMwRkNcdTMwMDInIH0sXG4gICAgICBhbm51YWxfcHVyY2hhc2luZ19idWRnZXQ6IHsgbGFiZWw6ICdcdTVFNzRcdTk1OTNcdThBQkZcdTkwNTRcdTRFODhcdTdCOTcnLCBoZWxwOiAnXHUzMDUzXHUzMDZFXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDRDXHU0RUNBXHU1RTc0XHU1RUE2XHUzMEQ5XHUzMEYzXHUzMEMwXHUzMEZDXHUzMDZCXHU2NTJGXHU1MUZBXHUzMDU5XHUzMDhCXHU4OThCXHU4RkJDXHUzMDdGXHU5ODREXHUzMDY3XHUzMDQyXHUzMDhBXHUzMDAxXHU4MUVBXHU3OTNFXHUzMDZFXHU1OEYyXHU0RTBBXHU5QUQ4XHUzMDY3XHUzMDZGXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDAyJyB9LFxuICAgICAgcGF5bWVudF9jeWNsZToge1xuICAgICAgICBsYWJlbDogJ1x1NjUyRlx1NjI1NVx1MzBCNVx1MzBBNFx1MzBBRlx1MzBFQicsXG4gICAgICAgIG9wdGlvbnM6IHsgcHJlcGFpZDogJ1x1NTI0RFx1NjI1NVx1MzA0NCcsIG5ldF8zMDogJzMwXHU2NUU1JywgbmV0XzYwOiAnNjBcdTY1RTUnLCBuZXRfOTA6ICc5MFx1NjVFNScgfSxcbiAgICAgIH0sXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTYyN0ZcdThBOERcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLFxuICAgICAgICBoZWxwOiAnXHUzMDUzXHUzMDZFXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZFXHU2MjdGXHU4QThEXHU3MkI2XHU2Q0MxXHUzMDAyXHU2NUIwXHU4OThGXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZGXHU2MjdGXHU4QThEXHU1Rjg1XHUzMDYxXHUzMDY3XHU0RjVDXHU2MjEwXHUzMDU1XHUzMDhDXHUzMDAxXHU2MjdGXHU4QThEXHUzMEM4XHUzMEVDXHUzMEE0XHUzMDY3XHU1MjI0XHU2NUFEXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU5XHUzMDAyJyxcbiAgICAgICAgb3B0aW9uczogeyBwZW5kaW5nOiAnXHU2MjdGXHU4QThEXHU1Rjg1XHUzMDYxJywgYXBwcm92ZWQ6ICdcdTYyN0ZcdThBOERcdTZFMDhcdTMwN0YnLCByZWplY3RlZDogJ1x1NTM3NFx1NEUwQicgfSxcbiAgICAgIH0sXG4gICAgICBuYW1lOiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU1NDBEJywgaGVscDogJ1x1NEYxQVx1NzkzRVx1MzA3RVx1MzA1Rlx1MzA2Rlx1N0Q0NFx1N0U1NFx1MzA2RVx1NkI2M1x1NUYwRlx1NTQwRFx1NzlGMCcgfSxcbiAgICAgIG5hbWVfbm9ybWFsaXplZDoge1xuICAgICAgICBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1NTQwRFx1RkYwOFx1NkI2M1x1ODk4Rlx1NTMxNlx1RkYwOScsXG4gICAgICAgIGhlbHA6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTU5MDlcdTYzREJcdTMwNkVcdTcxNjdcdTU0MDhcdTMwQURcdTMwRkNcdTMwMDJcdTUzRDZcdTVGMTVcdTUxNDhcdTU0MERcdTMwOTJcdTVDMEZcdTY1ODdcdTVCNTdcdTUzMTZcdTMwNTdcdTMwMDFcdTUyNERcdTVGOENcdTMwNkVcdTdBN0FcdTc2N0RcdTMwOTJcdTk2NjRcdTUzQkJcdTMwNTdcdTMwNjZcdTMwMDFcdTUxODVcdTkwRThcdTMwNkVcdTkwMjNcdTdEOUFcdTMwNTlcdTMwOEJcdTdBN0FcdTc2N0RcdTMwOTIgMSBcdTMwNjRcdTMwNkJcdTMwN0VcdTMwNjhcdTMwODFcdTMwNUZcdTMwODJcdTMwNkVcdTMwMDJhY2NvdW50X3Byb3RlY3Rpb24gXHUzMEQ1XHUzMEMzXHUzMEFGXHUzMDRDXHU4MUVBXHU1MkQ1XHUzMDY3XHU3REFEXHU2MzAxXHUzMDU3XHUzMDdFXHUzMDU5IFx1MjAxNCBcdTc2RjRcdTYzQTVcdTdERThcdTk2QzZcdTMwNTdcdTMwNkFcdTMwNDRcdTMwNjdcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTg4NjhcdTc5M0FcdTU0MEQnIH0sXG4gICAgICB0eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEJGXHUzMEE0XHUzMEQ3JyxcbiAgICAgICAgb3B0aW9uczogeyBwcm9zcGVjdDogJ1x1ODk4Qlx1OEZCQ1x1MzA3Rlx1NUJBMicsIGN1c3RvbWVyOiAnXHU5ODY3XHU1QkEyJywgcGFydG5lcjogJ1x1MzBEMVx1MzBGQ1x1MzBDOFx1MzBDQVx1MzBGQycsIGZvcm1lcjogJ1x1OTA0RVx1NTNCQlx1MzA2RVx1NTNENlx1NUYxNVx1NTE0OCcgfSxcbiAgICAgIH0sXG4gICAgICBpbmR1c3RyeToge1xuICAgICAgICBsYWJlbDogJ1x1Njk2RFx1N0EyRScsXG4gICAgICAgIG9wdGlvbnM6IHsgLi4uaW5kdXN0cnlPcHRpb25zIH0sXG4gICAgICB9LFxuICAgICAgYW5udWFsX3JldmVudWU6IHsgbGFiZWw6ICdcdTVFNzRcdTk1OTNcdTU4RjJcdTRFMEEnIH0sXG4gICAgICBjaGlsZF9hY2NvdW50X3JldmVudWU6IHsgbGFiZWw6ICdcdTVCNTBcdTRGMUFcdTc5M0VcdTVFNzRcdTk1OTNcdTU4RjJcdTRFMEFcdTU0MDhcdThBMDgnLCBoZWxwOiAnXHU3NkY0XHU1QzVFXHUzMDZFXHU1QjUwXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZFXHU1RTc0XHU5NTkzXHU1OEYyXHU0RTBBXHUzMDZFXHU1NDA4XHU4QTA4XHUzMDAyJyB9LFxuICAgICAgbnVtYmVyX29mX2VtcGxveWVlczogeyBsYWJlbDogJ1x1NUY5M1x1Njk2RFx1NTRFMVx1NjU3MCcgfSxcbiAgICAgIHBob25lOiB7IGxhYmVsOiAnXHU5NkZCXHU4QTcxXHU3NTZBXHU1M0Y3JyB9LFxuICAgICAgd2Vic2l0ZTogeyBsYWJlbDogJ1dlYlx1MzBCNVx1MzBBNFx1MzBDOCcgfSxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBsYWJlbDogJ1x1OEFDQlx1NkM0Mlx1NTE0OFx1NEY0Rlx1NjI0MCcgfSxcbiAgICAgIGJpbGxpbmdfY291bnRyeToge1xuICAgICAgICBsYWJlbDogJ1x1OEFDQlx1NkM0Mlx1NTE0OFx1NTZGRCcsXG4gICAgICAgIGhlbHA6ICdcdThBQ0JcdTZDNDJcdTUxNDhcdTRGNEZcdTYyNDBcdTMwNEJcdTMwODlcdTVDMEVcdTUxRkEgXHUyMDE0IFx1NTE2NVx1NTI5Qlx1MzA1NVx1MzA4Q1x1MzA1Rlx1NTZGRFx1NTQwRFx1MzA5Mlx1MzA1RFx1MzA2RVx1MzA3RVx1MzA3RVx1MzAwMVx1NTI0RFx1NUY4Q1x1MzA2RVx1N0E3QVx1NzY3RFx1MzA5Mlx1OTY2NFx1NTNCQlx1MzA1N1x1NTkyN1x1NjU4N1x1NUI1N1x1NTMxNlx1MzA1N1x1MzA1Rlx1NTAyNFx1MzAwMicsXG4gICAgICB9LFxuICAgICAgdGVycml0b3J5OiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEM2XHUzMEVBXHUzMEM4XHUzMEVBXHUzMEZDJyxcbiAgICAgICAgaGVscDogJ1x1OEFDQlx1NkM0Mlx1NTE0OFx1NEY0Rlx1NjI0MFx1MzA0Qlx1MzA4OVx1NUMwRVx1NTFGQSBcdTIwMTQgXHUzMEM2XHUzMEVBXHUzMEM4XHUzMEVBXHUzMEZDXHU1MTcxXHU2NzA5XHUzMEVCXHUzMEZDXHUzMEVCXHUzMDRDXHU3MTY3XHU1NDA4XHUzMDU5XHUzMDhCXHU1NUI2XHU2OTZEXHUzMEM2XHUzMEVBXHUzMEM4XHUzMEVBXHUzMEZDXHUzMDAyXHU2MkM1XHU1RjUzXHUzMEMxXHUzMEZDXHUzMEUwXHUzMDZFXHUzMDZBXHUzMDQ0XHUzMEM2XHUzMEVBXHUzMEM4XHUzMEVBXHUzMEZDXHUzMDZFXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZGXHUzMDBDXHUzMDVEXHUzMDZFXHU0RUQ2XHUzMDBEXHUzMDAyJyxcbiAgICAgICAgb3B0aW9uczogeyBuYTogJ1x1NTMxN1x1N0M3MycsIGVtZWE6ICdFTUVBJywgb3RoZXI6ICdcdTMwNURcdTMwNkVcdTRFRDYnIH0sXG4gICAgICB9LFxuICAgICAgb2ZmaWNlX2xvY2F0aW9uOiB7IGxhYmVsOiAnXHUzMEFBXHUzMEQ1XHUzMEEzXHUzMEI5XHU2MjQwXHU1NzI4XHU1NzMwJyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdTYyNDBcdTY3MDlcdTgwMDUnIH0sXG4gICAgICBwYXJlbnRfYWNjb3VudDogeyBsYWJlbDogJ1x1ODlBQVx1NTNENlx1NUYxNVx1NTE0OCcsIGhlbHA6ICdcdTk2OEVcdTVDNjRcdTY5Q0JcdTkwMjBcdTMwNkJcdTMwNEFcdTMwNTFcdTMwOEJcdTg5QUFcdTRGMUFcdTc5M0UnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ1x1OEFBQ1x1NjYwRScgfSxcbiAgICAgIGlzX2FjdGl2ZTogeyBsYWJlbDogJ1x1NjcwOVx1NTJCOScgfSxcbiAgICAgIGxhc3RfYWN0aXZpdHlfZGF0ZTogeyBsYWJlbDogJ1x1NjcwMFx1N0Q0Mlx1NkQzQlx1NTJENVx1NjVFNScgfSxcbiAgICAgIGJyYW5kX2NvbG9yOiB7IGxhYmVsOiAnXHUzMEQ2XHUzMEU5XHUzMEYzXHUzMEM5XHUzMEFCXHUzMEU5XHUzMEZDJyB9LFxuICAgICAgbG9nbzogeyBsYWJlbDogJ1x1NEYxQVx1NzkzRVx1MzBFRFx1MzBCNCcgfSxcbiAgICAgIHRpZXI6IHtcbiAgICAgICAgbGFiZWw6ICdcdTk4NjdcdTVCQTJcdTMwRTlcdTMwRjNcdTMwQUYnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgc3RyYXRlZ2ljOiAnXHU2MjI2XHU3NTY1XHU5ODY3XHU1QkEyJywgZW50ZXJwcmlzZTogJ1x1MzBBOFx1MzBGM1x1MzBCRlx1MzBGQ1x1MzBEN1x1MzBFOVx1MzBBNFx1MzBCQScsXG4gICAgICAgICAgbWlkX21hcmtldDogJ1x1MzBERlx1MzBDM1x1MzBDOVx1MzBERVx1MzBGQ1x1MzBCMVx1MzBDM1x1MzBDOCcsIHNtYjogJ1x1NEUyRFx1NUMwRlx1NEYwMVx1Njk2RCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc2VnbWVudDoge1xuICAgICAgICBsYWJlbDogJ1x1OTg2N1x1NUJBMlx1MzBCQlx1MzBCMFx1MzBFMVx1MzBGM1x1MzBDOCcsXG4gICAgICAgIG9wdGlvbnM6IHsgbmV0X25ldzogJ1x1NjVCMFx1ODk4Rlx1NzM3Mlx1NUY5NycsIGdyb3d0aDogJ1x1NjIxMFx1OTU3NycsIGF0X3Jpc2s6ICdcdTMwRUFcdTMwQjlcdTMwQUZcdTMwNDJcdTMwOEEnLCBzdGFibGU6ICdcdTVCODlcdTVCOUEnIH0sXG4gICAgICB9LFxuICAgICAgaGVhbHRoX3Njb3JlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEQ4XHUzMEVCXHUzMEI5XHUzMEI5XHUzMEIzXHUzMEEyJyxcbiAgICAgICAgaGVscDogJ1x1MzBBQlx1MzBCOVx1MzBCRlx1MzBERVx1MzBGQ1x1MzBCNVx1MzBBRlx1MzBCQlx1MzBCOVx1NjJDNVx1NUY1M1x1RkYwOENTTVx1RkYwOVx1MzA0Q1x1N0JBMVx1NzQwNlx1MzA1OVx1MzA4Qlx1NTA2NVx1NTE2OFx1NjAyN1x1MzA2RVx1NjMwN1x1NkExOScsXG4gICAgICAgIG9wdGlvbnM6IHsgaGVhbHRoeTogJ1x1ODI2Rlx1NTk3RCcsIHdhdGNoaW5nOiAnXHU4OTgxXHU4OUIzXHU1QkRGJywgYXRfcmlzazogJ1x1MzBFQVx1MzBCOVx1MzBBRlx1MzA0Mlx1MzA4QScsIGNodXJuaW5nOiAnXHU4OUUzXHU3RDA0XHU5MDMyXHU4ODRDXHU0RTJEJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2FjY291bnRzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1MTY4XHU1M0Q2XHU1RjE1XHU1MTQ4JywgZGVzY3JpcHRpb246ICdcdTU4RjJcdTRFMEFcdTMwNjhcdTY5NkRcdTdBMkVcdTMwOTJcdTU0MkJcdTMwODBcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNkVcdTRFMDBcdTg5QTcnLFxuICAgICAgICBidWxrQWN0aW9uczoge1xuICAgICAgICAgIGRlbGV0ZToge1xuICAgICAgICAgICAgbGFiZWw6ICdcdTUyNEFcdTk2NjQnLFxuICAgICAgICAgICAgY29uZmlybUxhYmVsOiAnXHU1MjRBXHU5NjY0JyxcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiAne3tjb3VudH19IFx1NEVGNlx1MzA2RVx1NTNENlx1NUYxNVx1NTE0OFx1MzA5Mlx1NUI4Q1x1NTE2OFx1MzA2Qlx1NTI0QVx1OTY2NFx1MzA1N1x1MzA3RVx1MzA1OVx1MzA0Qlx1RkYxRlx1MzA1M1x1MzA2RVx1NjRDRFx1NEY1Q1x1MzA2Rlx1NTNENlx1MzA4QVx1NkQ4OFx1MzA1Qlx1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cmFuc2Zlcl9vd25lcjoge1xuICAgICAgICAgICAgbGFiZWw6ICdcdTYyNDBcdTY3MDlcdTgwMDVcdTMwNkVcdTU5MDlcdTY2RjQnLFxuICAgICAgICAgICAgY29uZmlybVRleHQ6ICd7e2NvdW50fX0gXHU0RUY2XHUzMDZFXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZFXHU2MjQwXHU2NzA5XHU4MDA1XHUzMDkyXHU1OTA5XHU2NkY0XHUzMDU3XHUzMDdFXHUzMDU5XHUzMDRCXHVGRjFGJyxcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICBvd25lcl9pZDoge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnXHU2NUIwXHUzMDU3XHUzMDQ0XHU2MjQwXHU2NzA5XHU4MDA1JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1cGRhdGVfdGllcjoge1xuICAgICAgICAgICAgbGFiZWw6ICdcdTk4NjdcdTVCQTJcdTMwRTlcdTMwRjNcdTMwQUZcdTMwNkVcdTY2RjRcdTY1QjAnLFxuICAgICAgICAgICAgY29uZmlybVRleHQ6ICd7e2NvdW50fX0gXHU0RUY2XHUzMDZFXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZFXHU5ODY3XHU1QkEyXHUzMEU5XHUzMEYzXHUzMEFGXHUzMDkyIHt7dGllcn19IFx1MzA2Qlx1NjZGNFx1NjVCMFx1MzA1N1x1MzA3RVx1MzA1OVx1MzA0Qlx1RkYxRicsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgdGllcjoge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnXHU5ODY3XHU1QkEyXHUzMEU5XHUzMEYzXHUzMEFGJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhY2NvdW50X2dhbGxlcnk6IHsgbGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdTMwQUJcdTMwRkNcdTMwQzknLCBkZXNjcmlwdGlvbjogJ1x1MzBENlx1MzBFOVx1MzBGM1x1MzBDOVx1MzBBQlx1MzBFOVx1MzBGQ1x1NEVEOFx1MzA0RFx1MzA2RVx1MzBBQlx1MzBGQ1x1MzBDOVx1MzBEM1x1MzBFNVx1MzBGQycgfSxcbiAgICAgIGFjY291bnRfbWFwOiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMERFXHUzMEMzXHUzMEQ3JywgZGVzY3JpcHRpb246ICdcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNkVcdTU3MzBcdTc0MDZcdTc2ODRcdTUyMDZcdTVFMDMnIH0sXG4gICAgICBlbnRlcnByaXNlX2FjY291bnRzOiB7IGxhYmVsOiAnXHUzMEE4XHUzMEYzXHUzMEJGXHUzMEZDXHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEJBXHU1M0Q2XHU1RjE1XHU1MTQ4JywgZGVzY3JpcHRpb246ICdcdTVFNzRcdTU1NDZcdTY3MDBcdTRFMEFcdTRGNERcdTMwNkVcdTRFM0JcdTg5ODFcdTk4NjdcdTVCQTInIH0sXG4gICAgICBteV9hY2NvdW50czogeyBsYWJlbDogJ1x1NzlDMVx1MzA2RVx1NTNENlx1NUYxNVx1NTE0OCcsIGRlc2NyaXB0aW9uOiAnXHU4MUVBXHU1MjA2XHUzMDRDXHU2MjQwXHU2NzA5XHUzMDU5XHUzMDhCXHU1M0Q2XHU1RjE1XHU1MTQ4JyB9LFxuICAgICAgYXRfcmlza19hY2NvdW50czogeyBsYWJlbDogJ1x1MjZBMFx1RkUwRiBcdTMwRUFcdTMwQjlcdTMwQUZcdTMwNkVcdTMwNDJcdTMwOEJcdTUzRDZcdTVGMTVcdTUxNDgnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnXHU1N0ZBXHU2NzJDXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgZmluYW5jaWFsczogeyBsYWJlbDogJ1x1OENBMVx1NTJEOVx1NjBDNVx1NTgzMScgfSxcbiAgICAgIGJ1c2luZXNzX3Byb2ZpbGU6IHsgbGFiZWw6ICdcdTMwRDNcdTMwQjhcdTMwQ0RcdTMwQjlcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdcdTkwMjNcdTdENjFcdTUxNDhcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBvd25lcnNoaXA6IHsgbGFiZWw6ICdcdTYyNDBcdTY3MDlcdTgwMDVcdTMwRkJcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknIH0sXG4gICAgICBicmFuZGluZzogeyBsYWJlbDogJ1x1MzBENlx1MzBFOVx1MzBGM1x1MzBDN1x1MzBBM1x1MzBGM1x1MzBCMCcgfSxcbiAgICAgIHN5c3RlbTogeyBsYWJlbDogJ1x1MzBCN1x1MzBCOVx1MzBDNlx1MzBFMCcgfSxcbiAgICAgIC8vIGFjY291bnQudmlldy50cyBcdTMwNkVcdTMwRDVcdTMwQTlcdTMwRkNcdTMwRTBcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTU0MEQgKCMxMTAwKVxuICAgICAgcHJvZmlsZTogeyBsYWJlbDogJ1x1MzBEN1x1MzBFRFx1MzBENVx1MzBBM1x1MzBGQ1x1MzBFQicgfSxcbiAgICAgIGN1c3RvbWVyX3N1Y2Nlc3M6IHsgbGFiZWw6ICdcdTMwQUJcdTMwQjlcdTMwQkZcdTMwREVcdTMwRkNcdTMwQjVcdTMwQUZcdTMwQkJcdTMwQjknIH0sXG4gICAgICBsb2NhdGlvbnM6IHsgbGFiZWw6ICdcdTYyNDBcdTU3MjhcdTU3MzAnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ1x1OEFBQ1x1NjYwRScgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7IC4uLmFjdGl2aXR5QWN0aW9ucyB9LFxuICB9LFxuICBjcm1fY29udGFjdDoge1xuICAgIGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1JyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNScsXG4gICAgZGVzY3JpcHRpb246ICdcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNkJcdTYyNDBcdTVDNUVcdTMwNTlcdTMwOEJcdTYyQzVcdTVGNTNcdTgwMDUnLFxuICAgIGZpZWxkczoge1xuICAgICAgc2FsdXRhdGlvbjogeyBsYWJlbDogJ1x1NjU2Q1x1NzlGMCcsIG9wdGlvbnM6IHsgLi4uc2FsdXRhdGlvbk9wdGlvbnMgfSB9LFxuICAgICAgZmlyc3RfbmFtZTogeyBsYWJlbDogJ1x1NTQwRCcgfSxcbiAgICAgIGxhc3RfbmFtZTogeyBsYWJlbDogJ1x1NTlEMycgfSxcbiAgICAgIGZ1bGxfbmFtZTogeyBsYWJlbDogJ1x1NkMwRlx1NTQwRCcgfSxcbiAgICAgIGNybV9hY2NvdW50OiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4JyB9LFxuICAgICAgZW1haWw6IHsgbGFiZWw6ICdcdTMwRTFcdTMwRkNcdTMwRUInIH0sXG4gICAgICBwaG9uZTogeyBsYWJlbDogJ1x1OTZGQlx1OEE3MScgfSxcbiAgICAgIG1vYmlsZTogeyBsYWJlbDogJ1x1NjQzQVx1NUUyRlx1OTZGQlx1OEE3MScgfSxcbiAgICAgIHRpdGxlOiB7IGxhYmVsOiAnXHU1Rjc5XHU4MDc3JyB9LFxuICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICBsYWJlbDogJ1x1OTBFOFx1OTU4MCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBleGVjdXRpdmU6ICdcdTdENENcdTU1QjZcdTVDNjQnLCBzYWxlczogJ1x1NTVCNlx1Njk2RFx1OTBFOCcsIG1hcmtldGluZzogJ1x1MzBERVx1MzBGQ1x1MzBCMVx1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMFx1OTBFOCcsXG4gICAgICAgICAgZW5naW5lZXJpbmc6ICdcdTMwQThcdTMwRjNcdTMwQjhcdTMwQ0JcdTMwQTJcdTMwRUFcdTMwRjNcdTMwQjBcdTkwRTgnLCBzdXBwb3J0OiAnXHUzMEI1XHUzMEREXHUzMEZDXHUzMEM4XHU5MEU4JywgZmluYW5jZTogJ1x1N0Q0Q1x1NzQwNlx1OTBFOCcsXG4gICAgICAgICAgaHI6ICdcdTRFQkFcdTRFOEJcdTkwRTgnLCBvcGVyYXRpb25zOiAnXHUzMEFBXHUzMERBXHUzMEVDXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzXHU5MEU4JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAvLyBcdTMwRDBcdTMwQTRcdTMwQTRcdTMwRjNcdTMwQjBcdTMwQkJcdTMwRjNcdTMwQkZcdTMwRkMgKFJFUS0wMDA0KSBcdTIwMTQgXHU2MTBGXHU2MDFEXHU2QzdBXHU1QjlBXHUzMDZFXHUzMERFXHUzMEMzXHUzMEQ3XHUzMDAyXHU4MkYxXHU4QTlFXHUzMEU5XHUzMEQ5XHUzMEVCXHUzMDZGXG4gICAgICAvLyAnQnV5aW5nIFJvbGUnIFx1MzA2N1x1MzA2Rlx1MzA2QVx1MzA0RiAnQnV5aW5nIEZ1bmN0aW9uJ1x1RkYxQXNlY3VyaXR5LXJvbGUtd29yZCBcdTMwRUJcdTMwRkNcdTMwRUJcdTMwNENcbiAgICAgIC8vIFx1NUJBM1x1OEEwMFx1NTA3NFx1MzA2N1x1ODJGMVx1NTM1OFx1OEE5RSByb2xlIFx1MzA5Mlx1NEU4OFx1N0QwNFx1MzA1N1x1MzA2Nlx1MzA0NFx1MzA4QiAoQURSLTAwOTAgRDMpXHUzMDAyXHU1NDBDXHUzMEVCXHUzMEZDXHUzMEVCXHUzMDZGXHU4MkYxXHU4QTlFXHUzMDZFXHUzMDdGXHUzMDkyXG4gICAgICAvLyBcdThBQURcdTMwN0ZcdThBMDBcdThBOUVcdTMwRDFcdTMwQzNcdTMwQUZcdTMwNkJcdTMwNkZcdTUzQ0FcdTMwNzBcdTMwNkFcdTMwNDRcdTMwNUZcdTMwODFcdTMwMDFcdTMwNTNcdTMwNTNcdTMwNjdcdTMwNkZcdTY1RTVcdTY3MkNcdThBOUVcdTMwNjhcdTMwNTdcdTMwNjZcdTgxRUFcdTcxMzZcdTMwNkFcdThBOUVcdTMwOTJcdTRGN0ZcdTMwNDZcdTMwMDJcbiAgICAgIGJ1eWluZ19mdW5jdGlvbjoge1xuICAgICAgICBsYWJlbDogJ1x1OENGQ1x1OENCN1x1NUY3OVx1NTI3MicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkZWNpc2lvbl9tYWtlcjogJ1x1NkM3QVx1ODhDMVx1ODAwNScsIGVjb25vbWljX2J1eWVyOiAnXHU0RTg4XHU3Qjk3XHU2QzdBXHU4OEMxXHU4MDA1JyxcbiAgICAgICAgICB0ZWNobmljYWxfZXZhbHVhdG9yOiAnXHU2MjgwXHU4ODUzXHU4QTU1XHU0RkExXHU4MDA1JywgdXNlcjogJ1x1NTIyOVx1NzUyOFx1ODAwNScsXG4gICAgICAgICAgaW5mbHVlbmNlcjogJ1x1NUY3MVx1OTdGRlx1ODAwNScsIGdhdGVrZWVwZXI6ICdcdTMwQjJcdTMwRkNcdTMwQzhcdTMwQURcdTMwRkNcdTMwRDFcdTMwRkMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGF0dGl0dWRlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU4MUVBXHU3OTNFXHUzMDc4XHUzMDZFXHU2MTRCXHU1RUE2JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGNoYW1waW9uOiAnXHU2M0E4XHU5MDMyXHU4MDA1Jywgc3VwcG9ydGl2ZTogJ1x1NTk3RFx1NjEwRlx1NzY4NCcsIG5ldXRyYWw6ICdcdTRFMkRcdTdBQ0InLFxuICAgICAgICAgIHNrZXB0aWNhbDogJ1x1NjFEMFx1NzU5MVx1NzY4NCcsIGJsb2NrZXI6ICdcdTUzQ0RcdTVCRkVcdTgwMDUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlbGF0aW9uc2hpcF9zdHJlbmd0aDoge1xuICAgICAgICBsYWJlbDogJ1x1OTVBMlx1NEZDMlx1MzA2RVx1NUYzN1x1MzA1NScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkaXN0YW50OiAnXHU3NThFXHU5MDYwJywgYWNxdWFpbnRhbmNlOiAnXHU5ODU0XHU4OThCXHU3N0U1XHUzMDhBJywgd29ya2luZzogJ1x1Njk2RFx1NTJEOVx1NEUwQVx1MzA2RVx1OTVBMlx1NEZDMicsXG4gICAgICAgICAgc3Ryb25nOiAnXHU1RjM3XHUzMDQ0JywgdHJ1c3RlZF9hZHZpc29yOiAnXHU0RkUxXHU5ODNDXHUzMDU1XHUzMDhDXHUzMDhCXHUzMEEyXHUzMEM5XHUzMEQwXHUzMEE0XHUzMEI2XHUzMEZDJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNVx1MzA2RVx1NjI0MFx1NjcwOVx1ODAwNScgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU4QUFDXHU2NjBFJyB9LFxuICAgICAgaXNfcHJpbWFyeTogeyBsYWJlbDogJ1x1NEUzQlx1NjJDNVx1NUY1M1x1ODAwNScsIGhlbHA6ICdcdTMwNTNcdTMwNkVcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNkVcdTRFM0JcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNEJcdTMwNjlcdTMwNDZcdTMwNEInIH0sXG4gICAgICBhdmF0YXI6IHsgbGFiZWw6ICdcdTMwRDdcdTMwRURcdTMwRDVcdTMwQTNcdTMwRkNcdTMwRUJcdTc1M0JcdTUwQ0YnIH0sXG4gICAgICBtYWlsaW5nX2FkZHJlc3M6IHsgbGFiZWw6ICdcdTkwRjVcdTkwMDFcdTUxNDhcdTRGNEZcdTYyNDAnIH0sXG4gICAgICBsZWFkX3NvdXJjZTogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1MzBCRFx1MzBGQ1x1MzBCOScsIG9wdGlvbnM6IHsgLi4ubGVhZFNvdXJjZU9wdGlvbnMgfSB9LFxuICAgICAgZG9fbm90X2NhbGw6IHsgbGFiZWw6ICdcdTk2RkJcdThBNzFcdTYyRDJcdTU0MjYnIH0sXG4gICAgICBlbWFpbF9vcHRfb3V0OiB7IGxhYmVsOiAnXHUzMEUxXHUzMEZDXHUzMEVCXHU5MTREXHU0RkUxXHU1MDVDXHU2QjYyJyB9LFxuICAgICAgbGFzdF9jb250YWN0ZWRfZGF0ZTogeyBsYWJlbDogJ1x1NjcwMFx1N0Q0Mlx1NjNBNVx1ODlFNlx1NjVFNVx1NjY0MicgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2NvbnRhY3RzOiB7IGxhYmVsOiAnXHU1MTY4XHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1JyB9LFxuICAgICAgY29udGFjdF9kaXJlY3Rvcnk6IHsgbGFiZWw6ICdcdThDQUNcdTRFRkJcdTgwMDVcdTMwQzdcdTMwQTNcdTMwRUNcdTMwQUZcdTMwQzhcdTMwRUEnIH0sXG4gICAgICBwcmltYXJ5X2NvbnRhY3RzOiB7IGxhYmVsOiAnXHU0RTNCXHU2MkM1XHU1RjUzXHU4MDA1JyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBpZGVudGl0eTogeyBsYWJlbDogJ1x1NTdGQVx1NjcyQ1x1NjBDNVx1NTgzMScgfSxcbiAgICAgIGFjY291bnRfaW5mbzogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1MzBGQlx1NUY3OVx1ODA3NycgfSxcbiAgICAgIGJ1eWluZ19jZW50cmU6IHsgbGFiZWw6ICdcdTMwRDBcdTMwQTRcdTMwQTRcdTMwRjNcdTMwQjBcdTMwQkJcdTMwRjNcdTMwQkZcdTMwRkMnIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdcdTkwMjNcdTdENjFcdTUxNDhcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBtYWlsaW5nX2FkZHJlc3M6IHsgbGFiZWw6ICdcdTkwRjVcdTkwMDFcdTUxNDhcdTRGNEZcdTYyNDAnIH0sXG4gICAgICBhZGRpdGlvbmFsOiB7IGxhYmVsOiAnXHUzMDVEXHUzMDZFXHU0RUQ2XHUzMDZFXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgcHJlZmVyZW5jZXM6IHsgbGFiZWw6ICdcdTMwQjNcdTMwREZcdTMwRTVcdTMwQ0JcdTMwQjFcdTMwRkNcdTMwQjdcdTMwRTdcdTMwRjNcdThBMkRcdTVCOUEnIH0sXG4gICAgICAvLyBjb250YWN0LnZpZXcudHMgXHUzMDZFXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEUwXHUzMEJCXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHU1NDBEICgjMTEwMClcbiAgICAgIGNvbnRhY3RfZGV0YWlsczogeyBsYWJlbDogJ1x1OTAyM1x1N0Q2MVx1NTE0OFx1NjBDNVx1NTgzMScgfSxcbiAgICAgIGNvbW1fcHJlZmVyZW5jZXM6IHsgbGFiZWw6ICdcdThBMkRcdTVCOUEnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgbWFya19wcmltYXJ5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RTNCXHU2MkM1XHU1RjUzXHU4MDA1XHUzMDZCXHU4QTJEXHU1QjlBJyxcbiAgICAgICAgY29uZmlybVRleHQ6ICdcdTMwNTNcdTMwNkVcdThDQUNcdTRFRkJcdTgwMDVcdTMwOTJcdTUzRDZcdTVGMTVcdTUxNDhcdTMwNkVcdTRFM0JcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNkJcdThBMkRcdTVCOUFcdTMwNTdcdTMwN0VcdTMwNTlcdTMwNEJcdUZGMUYnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1NEUzQlx1NjJDNVx1NUY1M1x1ODAwNVx1MzA2Qlx1OEEyRFx1NUI5QVx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1RkYwMScsXG4gICAgICB9LFxuICAgICAgc2VuZF9lbWFpbDoge1xuICAgICAgICBsYWJlbDogJ1x1MzBFMVx1MzBGQ1x1MzBFQlx1OTAwMVx1NEZFMScsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHN1YmplY3Q6IHsgbGFiZWw6ICdcdTRFRjZcdTU0MEQnIH0sXG4gICAgICAgICAgYm9keTogeyBsYWJlbDogJ1x1NjcyQ1x1NjU4NycgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhZGRfY29udGFjdF90b19jYW1wYWlnbjoge1xuICAgICAgICBsYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzA2Qlx1OEZGRFx1NTJBMCcsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDkyXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHUzMDZCXHU4RkZEXHU1MkEwXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHVGRjAxJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzJyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9vYmplY3RzLnBpcGVsaW5lLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUFwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5waXBlbGluZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBPYmplY3RUcmFuc2xhdGlvbkRhdGEgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG5pbXBvcnQgeyBhY3Rpdml0eUFjdGlvbnMsIHNhbHV0YXRpb25PcHRpb25zLCBpbmR1c3RyeU9wdGlvbnMsIGxlYWRTb3VyY2VPcHRpb25zIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLyoqXG4gKiBcdTY1RTVcdTY3MkNcdThBOUUgKGphLUpQKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIFBJUEVMSU5FIGZhbWlseTpcbiAqIGRlbWFuZCBhbmQgdGhlIGRlYWxzIGl0IGJlY29tZXMsIHBsdXMgdGhlIHJvbGwtdXAgdGhhdCBmb3JlY2FzdHMgdGhlbS5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fbGVhZGAsIGBjcm1fb3Bwb3J0dW5pdHlgLCBgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbWAsIGBjcm1fZm9yZWNhc3RgLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICogRXZlcnl0aGluZyB0aGF0IGlzIG5vdCBgb2JqZWN0c2AgbGl2ZXMgaW4gYC4vYXBwLnRzYDsgYG9iamVjdHNgIFx1MjAxNCA2OS03OCUgb2ZcbiAqIGV2ZXJ5IGJ1bmRsZSBcdTIwMTQgaXMgb25lIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5LCBhbmQgYSBkZXRhaWwgb2JqZWN0XG4gKiBmb2xsb3dzIGl0cyBtYXN0ZXIuIEEgbmV3IHJvdyBnb2VzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LCBuZXZlciBpblxuICogd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuOiB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0IHRoZSA3MCVcbiAqIGFkdmlzb3J5IGJhbmQgYHBucG0gaHlnaWVuZWAgcHJpbnRzLiBGdWxsIHJ1bGUgYW5kIHJhdGlvbmFsZTpcbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQLnRzYC5cbiAqL1xuY29uc3Qgb3Bwb3J0dW5pdHlTdGFnZU9wdGlvbnMgPSB7XG4gIHByb3NwZWN0aW5nOiAnXHU4OThCXHU4RkJDXHUzMDdGXHU4QUJGXHU2N0ZCJywgcXVhbGlmaWNhdGlvbjogJ1x1OTA3OFx1NUI5QScsXG4gIG5lZWRzX2FuYWx5c2lzOiAnXHUzMENCXHUzMEZDXHUzMEJBXHU1MjA2XHU2NzkwJywgcHJvcG9zYWw6ICdcdTYzRDBcdTY4NDgnLFxuICBuZWdvdGlhdGlvbjogJ1x1NEVBNFx1NkUwOScsIGNsb3NlZF93b246ICdcdTYyMTBcdTdBQ0InLCBjbG9zZWRfbG9zdDogJ1x1NEUwRFx1NjIxMFx1N0FDQicsXG59O1xuXG5leHBvcnQgY29uc3QgcGlwZWxpbmU6IFJlY29yZDxzdHJpbmcsIE9iamVjdFRyYW5zbGF0aW9uRGF0YT4gPSB7XG4gIGNybV9sZWFkOiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBkaXNxdWFsaWZpY2F0aW9uX3JlYXNvbl9yZXF1aXJlZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDkyXHUzMDBDXHU1QkZFXHU4QzYxXHU1OTE2XHUzMDBEXHUzMDZCXHUzMDU5XHUzMDhCXHU1ODM0XHU1NDA4XHUzMDZGXHU1OTMxXHU2ODNDXHU3NDA2XHU3NTMxXHUzMDRDXHU1RkM1XHU4OTgxXHUzMDY3XHUzMDU5JyxcbiAgICAgIH0sXG4gICAgICBkdXBsaWNhdGVfZGlzcXVhbGlmaWNhdGlvbl9yZXF1aXJlc19zdXJ2aXZvcjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU5MUNEXHU4OTA3XHUzMDkyXHU3NDA2XHU3NTMxXHUzMDZCXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDkyXHU1OTMxXHU2ODNDXHUzMDY4XHUzMDU5XHUzMDhCXHU1ODM0XHU1NDA4XHUzMDZGXHUzMDAxXHU2QjhCXHUzMDU5XHUzMEVDXHUzMEIzXHUzMEZDXHUzMEM5XHUzMDkyXHU2MzA3XHU1QjlBXHUzMDU3XHUzMDAxXHU5MUNEXHU4OTA3XHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHUzMDkyXHUzMDBDXHU3OEJBXHU4QThEXHU2RTA4XHUzMDdGXHUzMDBEXHUzMDZCXHUzMDU5XHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5JyxcbiAgICAgIH0sXG4gICAgICBlbWFpbF9yZXF1aXJlZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHUzMEUxXHUzMEZDXHUzMEVCXHUzMEEyXHUzMEM5XHUzMEVDXHUzMEI5XHUzMDZGXHU1RkM1XHU5ODA4XHUzMDY3XHUzMDU5JyxcbiAgICAgIH0sXG4gICAgICBsZWFkX3N0YXR1c19wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU3MTIxXHU1MkI5XHUzMDZBXHUzMEVBXHUzMEZDXHUzMEM5XHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHU5MDc3XHU3OUZCXHUzMDY3XHUzMDU5JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOScsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzknLFxuICAgIGRlc2NyaXB0aW9uOiAnXHUzMDdFXHUzMDYwXHU5MDY5XHU2ODNDXHU1MjI0XHU1QjlBXHUzMDkyXHU1M0Q3XHUzMDUxXHUzMDY2XHUzMDQ0XHUzMDZBXHUzMDQ0XHU4OThCXHU4RkJDXHUzMDdGXHU1QkEyJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIHNhbHV0YXRpb246IHsgbGFiZWw6ICdcdTY1NkNcdTc5RjAnLCBvcHRpb25zOiB7IC4uLnNhbHV0YXRpb25PcHRpb25zIH0gfSxcbiAgICAgIGZpcnN0X25hbWU6IHsgbGFiZWw6ICdcdTU0MEQnIH0sXG4gICAgICBsYXN0X25hbWU6IHsgbGFiZWw6ICdcdTU5RDMnIH0sXG4gICAgICBmdWxsX25hbWU6IHsgbGFiZWw6ICdcdTZDMEZcdTU0MEQnIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnXHU4ODY4XHU3OTNBXHU1NDBEJyB9LFxuICAgICAgY29tcGFueTogeyBsYWJlbDogJ1x1NEYxQVx1NzkzRVx1NTQwRCcgfSxcbiAgICAgIGNvbXBhbnlfbm9ybWFsaXplZDoge1xuICAgICAgICBsYWJlbDogJ1x1NEYxQVx1NzkzRVx1NTQwRFx1RkYwOFx1NkI2M1x1ODk4Rlx1NTMxNlx1RkYwOScsXG4gICAgICAgIGhlbHA6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTU5MDlcdTYzREJcdTMwNkVcdTcxNjdcdTU0MDhcdTMwQURcdTMwRkNcdTMwMDJcdTRGMUFcdTc5M0VcdTU0MERcdTMwOTJcdTVDMEZcdTY1ODdcdTVCNTdcdTUzMTZcdTMwNTdcdTMwMDFcdTUyNERcdTVGOENcdTMwNkVcdTdBN0FcdTc2N0RcdTMwOTJcdTk2NjRcdTUzQkJcdTMwNTdcdTMwNjZcdTMwMDFcdTUxODVcdTkwRThcdTMwNkVcdTkwMjNcdTdEOUFcdTMwNTlcdTMwOEJcdTdBN0FcdTc2N0RcdTMwOTIgMSBcdTMwNjRcdTMwNkJcdTMwN0VcdTMwNjhcdTMwODFcdTMwNUZcdTMwODJcdTMwNkVcdTMwMDJsZWFkX2R1cGxpY2F0ZV9jaGVjayBcdTMwRDVcdTMwQzNcdTMwQUZcdTMwNENcdTgxRUFcdTUyRDVcdTMwNjdcdTdEQURcdTYzMDFcdTMwNTdcdTMwN0VcdTMwNTkgXHUyMDE0IFx1NzZGNFx1NjNBNVx1N0RFOFx1OTZDNlx1MzA1N1x1MzA2QVx1MzA0NFx1MzA2N1x1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMicsXG4gICAgICB9LFxuICAgICAgdGl0bGU6IHsgbGFiZWw6ICdcdTVGNzlcdTgwNzcnIH0sXG4gICAgICBlbWFpbDogeyBsYWJlbDogJ1x1MzBFMVx1MzBGQ1x1MzBFQicgfSxcbiAgICAgIHBob25lOiB7IGxhYmVsOiAnXHU5NkZCXHU4QTcxJyB9LFxuICAgICAgaW5kdXN0cnk6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY5NkRcdTdBMkUnLFxuICAgICAgICBvcHRpb25zOiB7IC4uLmluZHVzdHJ5T3B0aW9ucyB9LFxuICAgICAgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBuZXc6ICdcdTY1QjBcdTg5OEYnLCBjb250YWN0ZWQ6ICdcdTMwQjNcdTMwRjNcdTMwQkZcdTMwQUZcdTMwQzhcdTZFMDhcdTMwN0YnLCBxdWFsaWZpZWQ6ICdcdTkwNjlcdTY4M0MnLFxuICAgICAgICAgIHVucXVhbGlmaWVkOiAnXHU0RTBEXHU5MDY5XHU2ODNDJywgY29udmVydGVkOiAnXHU1OTA5XHU2M0RCXHU2RTA4XHUzMDdGJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBsZWFkX3NvdXJjZTogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1MzBCRFx1MzBGQ1x1MzBCOScsIG9wdGlvbnM6IHsgLi4ubGVhZFNvdXJjZU9wdGlvbnMgfSB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTYyNDBcdTY3MDlcdTgwMDUnIH0sXG4gICAgICBpc19jb252ZXJ0ZWQ6IHsgbGFiZWw6ICdcdTU5MDlcdTYzREJcdTZFMDhcdTMwN0YnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ1x1OEFBQ1x1NjYwRScgfSxcbiAgICAgIG1vYmlsZTogeyBsYWJlbDogJ1x1NjQzQVx1NUUyRlx1OTZGQlx1OEE3MScgfSxcbiAgICAgIHdlYnNpdGU6IHsgbGFiZWw6ICdXZWJcdTMwQjVcdTMwQTRcdTMwQzgnIH0sXG4gICAgICByYXRpbmc6IHsgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwQjlcdTMwQjNcdTMwQTInLCBoZWxwOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDZFXHU1NEMxXHU4Q0VBXHUzMEI5XHUzMEIzXHUzMEEyXHVGRjA4MVx1MzAxQzUgXHU2QkI1XHU5NjhFXHVGRjA5JyB9LFxuICAgICAgY29udmVydGVkX2FjY291bnQ6IHsgbGFiZWw6ICdcdTU5MDlcdTYzREJcdTVGOENcdTMwNkVcdTUzRDZcdTVGMTVcdTUxNDgnIH0sXG4gICAgICBjb252ZXJ0ZWRfY29udGFjdDogeyBsYWJlbDogJ1x1NTkwOVx1NjNEQlx1NUY4Q1x1MzA2RVx1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNScgfSxcbiAgICAgIGNvbnZlcnRlZF9vcHBvcnR1bml0eTogeyBsYWJlbDogJ1x1NTkwOVx1NjNEQlx1NUY4Q1x1MzA2RVx1NTU0Nlx1OEFDNycgfSxcbiAgICAgIGNvbnZlcnRlZF9kYXRlOiB7IGxhYmVsOiAnXHU1OTA5XHU2M0RCXHU2NUU1JyB9LFxuICAgICAgYWRkcmVzczogeyBsYWJlbDogJ1x1NEY0Rlx1NjI0MCcgfSxcbiAgICAgIGFubnVhbF9yZXZlbnVlOiB7IGxhYmVsOiAnXHU1RTc0XHU5NTkzXHU1OEYyXHU0RTBBJyB9LFxuICAgICAgbnVtYmVyX29mX2VtcGxveWVlczogeyBsYWJlbDogJ1x1NUY5M1x1Njk2RFx1NTRFMVx1NjU3MCcgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHUzMEUxXHUzMEUyJywgaGVscDogJ1x1MzA1M1x1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2Qlx1OTVBMlx1MzA1OVx1MzA4Qlx1NEY1Q1x1Njk2RFx1MzBFMVx1MzBFMiBcdTIwMTQgXHU2NkY4XHU1RjBGXHU4QTJEXHU1QjlBXHUzMDZCXHU1QkZFXHU1RkRDXHUzMDAyJyB9LFxuICAgICAgZG9fbm90X2NhbGw6IHsgbGFiZWw6ICdcdTk2RkJcdThBNzFcdTYyRDJcdTU0MjYnIH0sXG4gICAgICBlbWFpbF9vcHRfb3V0OiB7IGxhYmVsOiAnXHUzMEUxXHUzMEZDXHUzMEVCXHU5MTREXHU0RkUxXHU1MDVDXHU2QjYyJyB9LFxuICAgICAgbmV4dF9mb2xsb3d1cF9kYXRlOiB7IGxhYmVsOiAnXHU2QjIxXHU1NkRFXHUzMEQ1XHUzMEE5XHUzMEVEXHUzMEZDXHUzMEEyXHUzMEMzXHUzMEQ3XHU2NUU1JyB9LFxuICAgICAgbGFzdF9jb250YWN0ZWRfZGF0ZTogeyBsYWJlbDogJ1x1NjcwMFx1N0Q0Mlx1NjNBNVx1ODlFNlx1NjVFNVx1NjY0MicgfSxcbiAgICAgIG5lZWRfdHlwZToge1xuICAgICAgICBsYWJlbDogJ1x1MzBDQlx1MzBGQ1x1MzBCQVx1N0EyRVx1NTIyNScsXG4gICAgICAgIGhlbHA6ICdcdTMwNTNcdTMwNkVcdTg5OEJcdThGQkNcdTVCQTJcdTMwNENcdTRGNTVcdTMwOTJcdTZDNDJcdTMwODFcdTMwNjZcdTMwNDRcdTMwOEJcdTMwNEJcdTMwMDJcdTUyNzJcdTMwOEFcdTVGNTNcdTMwNjZcdTMwRkJcdTUxMkFcdTUxNDhcdTk4MDZcdTRGNERcdTRFRDhcdTMwNTFcdTMwRkJcdTk3MDBcdTg5ODFcdTUyMDZcdTY3OTBcdTMwNENcdTMwNTNcdTMwNkVcdTk4MDVcdTc2RUVcdTMwOTJcdTUzQzJcdTcxNjdcdTMwNTdcdTMwN0VcdTMwNTlcdTMwMDInLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbmV3X2ltcGxlbWVudGF0aW9uOiAnXHU2NUIwXHU4OThGXHU1QzBFXHU1MTY1JywgZXhwYW5zaW9uOiAnXHU2MkUxXHU1RjM1XHUzMEZCXHU4RkZEXHU1MkEwJyxcbiAgICAgICAgICByZXBsYWNlbWVudDogJ1x1NTE2NVx1MzA4Q1x1NjZGRlx1MzA0OFx1MzBGQlx1NzlGQlx1ODg0QycsIHJlbmV3YWw6ICdcdTY2RjRcdTY1QjAnLCBjb25zdWx0aW5nOiAnXHUzMEIzXHUzMEYzXHUzMEI1XHUzMEVCXHUzMEM2XHUzMEEzXHUzMEYzXHUzMEIwJyxcbiAgICAgICAgICBzdXBwb3J0OiAnXHU0RkREXHU1Qjg4XHUzMEZCXHUzMEI1XHUzMEREXHUzMEZDXHUzMEM4Jywgb3RoZXI6ICdcdTMwNURcdTMwNkVcdTRFRDYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGVzdGltYXRlZF9hbW91bnQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTRFODhcdTYwRjNcdTkxRDFcdTk4NEQnLFxuICAgICAgICBoZWxwOiAnXHUzMEFGXHUzMEFBXHUzMEVBXHUzMEQ1XHUzMEEzXHUzMEIxXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzXHU1MjREXHUzMDZFXHU5NzAwXHU4OTgxXHU5MUQxXHU5ODREXHUzMDZFXHU4OThCXHU3QTREXHUzMDhBXHUzMDAyXHUzMEIzXHUzMEYzXHUzMEQwXHUzMEZDXHUzMEI4XHUzMEU3XHUzMEYzXHU2NjQyXHUzMDZCXHU1NTQ2XHU4QUM3XHU5MUQxXHU5ODREXHUzMDc4XHU1MjFEXHU2NzFGXHU1MDI0XHUzMDY4XHUzMDU3XHUzMDY2XHU1MTY1XHUzMDhBXHUzMDdFXHUzMDU5XHUzMDAyJyxcbiAgICAgIH0sXG4gICAgICBjb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1MzBCM1x1MzBGM1x1MzBEMFx1MzBGQ1x1MzBCOFx1MzBFN1x1MzBGM1x1NjI3Rlx1OEE4RCcsXG4gICAgICAgIGhlbHA6ICdcdTMwNTNcdTMwNkVcdTg5OEJcdThGQkNcdTVCQTJcdTMwNENcdTMwQjNcdTMwRjNcdTMwRDBcdTMwRkNcdTMwQjhcdTMwRTdcdTMwRjNcdTMwNkVcdTYyN0ZcdThBOERcdTMwOTJcdTVGOTdcdTMwNjZcdTMwNDRcdTMwOEJcdTMwNEJcdTMwMDJcdTMwMENcdTYyN0ZcdThBOERcdTRFMERcdTg5ODFcdTMwMERcdTMwNkZcdTYyN0ZcdThBOERcdTMwOTJcdTZDNDJcdTMwODFcdTMwNkFcdTMwNDRcdTcyQjZcdTYxNEJcdTMwNjdcdTMwMDFcdTUxRkFcdTgzNzdcdTY2NDJcdTMwNkVcdTY1RTJcdTVCOUFcdTUwMjRcdTMwNjdcdTMwNTlcdTMwMDInLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbm90X3JlcXVpcmVkOiAnXHU2MjdGXHU4QThEXHU0RTBEXHU4OTgxJywgcGVuZGluZzogJ1x1NjI3Rlx1OEE4RFx1NUY4NVx1MzA2MScsXG4gICAgICAgICAgYXBwcm92ZWQ6ICdcdTYyN0ZcdThBOERcdTZFMDhcdTMwN0YnLCByZWplY3RlZDogJ1x1NTM3NFx1NEUwQicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGlzcXVhbGlmaWNhdGlvbl9yZWFzb246IHtcbiAgICAgICAgbGFiZWw6ICdcdTRFMERcdTkwNjlcdTY4M0NcdTc0MDZcdTc1MzEnLFxuICAgICAgICBoZWxwOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHUzMDRDXHUzMDBDXHU0RTBEXHU5MDY5XHU2ODNDXHUzMDBEXHUzMDZFXHU1ODM0XHU1NDA4XHUzMDZGXHU1RkM1XHU5ODA4JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5vdF9hX2ZpdDogJ1x1MzBDQlx1MzBGQ1x1MzBCQVx1MzA0Q1x1NTQwOFx1MzA4Rlx1MzA2QVx1MzA0NCcsIG5vX2J1ZGdldDogJ1x1NEU4OFx1N0I5N1x1MzA2QVx1MzA1NycsIHdyb25nX3BlcnNvbmE6ICdcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNENcdTc1NzBcdTMwNkFcdTMwOEInLFxuICAgICAgICAgIHVucmVhY2hhYmxlOiAnXHU5MDIzXHU3RDYxXHU0RTBEXHU4MEZEJywgZHVwbGljYXRlOiAnXHU5MUNEXHU4OTA3XHUzMEVBXHUzMEZDXHUzMEM5JywgY29tcGV0aXRvcjogJ1x1N0FGNlx1NTQwOFx1NEVENlx1NzkzRVx1MzA2Qlx1NkM3QVx1NUI5QScsXG4gICAgICAgICAgb3RoZXI6ICdcdTMwNURcdTMwNkVcdTRFRDYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGR1cGxpY2F0ZV9vZl90eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU5MUNEXHU4OTA3XHU1QkZFXHU4QzYxJyxcbiAgICAgICAgaGVscDogJ1x1OTFDRFx1ODkwN1x1NTE0M1x1MzA2OFx1MzA1N1x1MzA2Nlx1NkI4Qlx1MzA4Qlx1MzBFQ1x1MzBCM1x1MzBGQ1x1MzBDOVx1MzA0Q1x1NUM1RVx1MzA1OVx1MzA4Qlx1MzBBQVx1MzBENlx1MzBCOFx1MzBBN1x1MzBBRlx1MzBDOFx1MzA2RVx1N0EyRVx1NTIyNVx1MzAwMicsXG4gICAgICAgIC8vIGBlcmFzZWRgIFx1MzA2Rlx1NTg5M1x1Nzg5MVx1NTAyNFx1MzA2N1x1MzA0Mlx1MzA4QVx1OTA3OFx1NjI5RVx1ODBBMlx1MzA2N1x1MzA2Rlx1MzA2QVx1MzA0NFx1MzAwMlx1MzBENVx1MzBBOVx1MzBGQ1x1MzBFMFx1MzA2Qlx1MzA2Rlx1ODg2OFx1NzkzQVx1MzA1N1x1MzA2QVx1MzA0NFxuICAgICAgICAvLyBcdUZGMDhgc3JjL3NhbGVzL3ZpZXdzL2xlYWQudmlldy50c2AgXHUzMDkyXHU1M0MyXHU3MTY3XHVGRjA5XHUzMDRDXHUzMDAxXHU2QjhCXHU1QjU4XHUzMEVDXHUzMEIzXHUzMEZDXHUzMEM5XHUzMDRDXHU1MjRBXHU5NjY0XHUzMDU1XHUzMDhDXHUzMDVGXG4gICAgICAgIC8vIFx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2Rlx1MzA1M1x1MzA2RVx1NTAyNFx1MzA5Mlx1NEZERFx1NjMwMVx1MzA1OVx1MzA4Qlx1MzA1Rlx1MzA4MVx1MzAwMVx1MzBFQ1x1MzBCM1x1MzBGQ1x1MzBDOVx1MzA5Mlx1OEFBRFx1MzA4MFx1NTgzNFx1NjI0MFx1MzA2N1x1MzA2Rlx1MzBFOVx1MzBEOVx1MzBFQlx1MzA0Q1x1ODk4MVx1MzA4Qlx1MzAwMlxuICAgICAgICBvcHRpb25zOiB7IGNybV9sZWFkOiAnXHUzMEVBXHUzMEZDXHUzMEM5JywgY3JtX2NvbnRhY3Q6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDUnLCBlcmFzZWQ6ICdcdTUyNEFcdTk2NjRcdTZFMDhcdTMwN0ZcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzknIH0sXG4gICAgICB9LFxuICAgICAgZHVwbGljYXRlX29mX2xlYWQ6IHsgbGFiZWw6ICdcdTkxQ0RcdTg5MDdcdTMwNTlcdTMwOEJcdTMwRUFcdTMwRkNcdTMwQzknIH0sXG4gICAgICBkdXBsaWNhdGVfb2ZfY29udGFjdDogeyBsYWJlbDogJ1x1OTFDRFx1ODkwN1x1MzA1OVx1MzA4Qlx1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNScgfSxcbiAgICAgIGR1cGxpY2F0ZV9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTkxQ0RcdTg5MDdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLFxuICAgICAgICBoZWxwOiAnXHUzMDBDXHU5MUNEXHU4OTA3XHUzMDZFXHU3NTkxXHUzMDQ0XHUzMDBEPSBcdTc2N0JcdTkzMzJcdTY2NDJcdTMwNkJcdTgxRUFcdTUyRDVcdTMwNjdcdTRFRDhcdTRFMEVcdTMwMDJcdTMwMENcdTkxQ0RcdTg5MDdcdTc4QkFcdTVCOUFcdTMwMEQ9IFx1NjJDNVx1NUY1M1x1ODAwNVx1MzA0Q1x1NEUwMFx1ODFGNFx1MzA5Mlx1NzhCQVx1OEE4RFx1NkUwOFx1MzA3Rlx1MzAwMicsXG4gICAgICAgIG9wdGlvbnM6IHsgc3VzcGVjdGVkOiAnXHU5MUNEXHU4OTA3XHUzMDZFXHU3NTkxXHUzMDQ0JywgY29uZmlybWVkOiAnXHU5MUNEXHU4OTA3XHU3OEJBXHU1QjlBJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2xlYWRzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1MTY4XHUzMEVBXHUzMEZDXHUzMEM5JyxcbiAgICAgICAgZW1wdHlTdGF0ZTogeyB0aXRsZTogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1MzA0Q1x1MzA3RVx1MzA2MFx1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1Qlx1MzA5MycsIG1lc3NhZ2U6ICdcdTY3MDBcdTUyMURcdTMwNkVcdTMwRUFcdTMwRkNcdTMwQzlcdTMwOTJcdTRGNUNcdTYyMTBcdTMwNTdcdTMwNjZcdTU5Q0JcdTMwODFcdTMwN0VcdTMwNTdcdTMwODdcdTMwNDYnIH0sXG4gICAgICB9LFxuICAgICAga2FuYmFuX2J5X3N0YXR1czogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycgfSxcbiAgICAgIGNhbGVuZGFyX2J5X2NyZWF0ZWQ6IHsgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwQUJcdTMwRUNcdTMwRjNcdTMwQzBcdTMwRkMnIH0sXG4gICAgICBnYWxsZXJ5X3ZpZXc6IHsgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwQUJcdTMwRkNcdTMwQzknIH0sXG4gICAgICBteV9sZWFkczogeyBsYWJlbDogJ1x1NzlDMVx1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOScgfSxcbiAgICAgIGhpZ2hfcHJpb3JpdHk6IHsgbGFiZWw6ICdcdTUxMkFcdTUxNDhcdTVFQTZcdTlBRDgnIH0sXG4gICAgICBob3RfbGVhZHM6IHsgbGFiZWw6ICdcdUQ4M0RcdUREMjUgXHUzMERCXHUzMEMzXHUzMEM4XHUzMEVBXHUzMEZDXHUzMEM5JyB9LFxuICAgICAgc3VzcGVjdGVkX2R1cGxpY2F0ZXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTkxQ0RcdTg5MDdcdTMwNkVcdTc1OTFcdTMwNDRcdTMwNENcdTMwNDJcdTMwOEJcdTMwRUFcdTMwRkNcdTMwQzknLFxuICAgICAgICBlbXB0eVN0YXRlOiB7XG4gICAgICAgICAgdGl0bGU6ICdcdTkxQ0RcdTg5MDdcdTMwNkVcdTc1OTFcdTMwNDRcdTMwNkZcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTMnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdcdTc4QkFcdThBOERcdTMwNkZcdTRFMERcdTg5ODFcdTMwNjdcdTMwNTkgXHUyMDE0IFx1NTE4RFx1NzY3Qlx1OTMzMlx1MzA1NVx1MzA4Q1x1MzA1Rlx1MzBFMVx1MzBGQ1x1MzBFQlx1MzBBMlx1MzBDOVx1MzBFQ1x1MzBCOVx1MzA2Rlx1MzA1OVx1MzA3OVx1MzA2Nlx1MzBDMVx1MzBBN1x1MzBDM1x1MzBBRlx1NkUwOFx1MzA3Rlx1MzA2N1x1MzA1OVx1MzAwMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICAvLyBcdTMwQUFcdTMwRDZcdTMwQjhcdTMwQTdcdTMwQUZcdTMwQzhcdTVCOUFcdTdGQTlcdTMwNkVcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTMwQURcdTMwRkNcdUZGMDhsZWFkLm9iamVjdC50c1x1RkYwOVx1MjAxNCBcdTUxNjVcdTUyOUJcdTMwRDVcdTMwQTlcdTMwRkNcdTMwRTBcdTMwNjhcdTMwMDFcbiAgICAgIC8vIFx1MzA1M1x1MzA4Q1x1MzA4OVx1MzA2RVx1MzBCMFx1MzBFQlx1MzBGQ1x1MzBEN1x1MzA5Mlx1NTNDMlx1NzE2N1x1MzA1OVx1MzA4Qlx1OEE3M1x1N0QzMFx1MzBEQVx1MzBGQ1x1MzBCOFx1MzA2RVx1MzBCQlx1MzBBRlx1MzBCN1x1MzBFN1x1MzBGM1x1RkYwOCM4MDZcdUZGMDlcdTMwNjdcdTRGN0ZcdTc1MjhcbiAgICAgIGFkZHJlc3M6IHsgbGFiZWw6ICdcdTRGNEZcdTYyNDAnIH0sXG4gICAgICBpZGVudGl0eTogeyBsYWJlbDogJ1x1NTdGQVx1NjcyQ1x1NjBDNVx1NTgzMScgfSxcbiAgICAgIGNvbXBhbnlfaW5mbzogeyBsYWJlbDogJ1x1NEYxQVx1NzkzRVx1NjBDNVx1NTgzMScgfSxcbiAgICAgIGNvbnRhY3RfaW5mbzogeyBsYWJlbDogJ1x1OTAyM1x1N0Q2MVx1NTE0OFx1NjBDNVx1NTgzMScgfSxcbiAgICAgIHF1YWxpZmljYXRpb246IHsgbGFiZWw6ICdcdTkwNjlcdTY4M0NcdTUyMjRcdTVCOUEnIH0sXG4gICAgICBhc3NpZ25tZW50OiB7IGxhYmVsOiAnXHU2MkM1XHU1RjUzXHU4MDA1JyB9LFxuICAgICAgYWRkaXRpb25hbDogeyBsYWJlbDogJ1x1MzA1RFx1MzA2RVx1NEVENlx1MzA2RVx1NjBDNVx1NTgzMScgfSxcbiAgICAgIHByZWZlcmVuY2VzOiB7IGxhYmVsOiAnXHUzMEIzXHUzMERGXHUzMEU1XHUzMENCXHUzMEIxXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzXHU4QTJEXHU1QjlBJyB9LFxuICAgICAgY29udmVyc2lvbjogeyBsYWJlbDogJ1x1NTkwOVx1NjNEQicgfSxcbiAgICAgIGR1cGxpY2F0ZXM6IHsgbGFiZWw6ICdcdTkxQ0RcdTg5MDdcdTdCQTFcdTc0MDYnIH0sXG4gICAgICAvLyBsZWFkLnZpZXcudHMgXHUzMDZFXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEUwXHUzMEJCXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHU1NDBEICgjMTEwMCkgXHUyMDE0IFx1MzBDN1x1MzBENVx1MzBBOVx1MzBFQlx1MzBDOFx1MzBENVx1MzBBOVx1MzBGQ1x1MzBFMFx1MzA2OFxuICAgICAgLy8gXHU1NDBEXHU1MjREXHU0RUQ4XHUzMDREIGZvcm1WaWV3IFx1MzA1OVx1MzA3OVx1MzA2Nlx1MzA2RVx1MzBCQlx1MzBBRlx1MzBCN1x1MzBFN1x1MzBGM1x1NTQwRFx1MzA0Q1x1MzA1M1x1MzA1M1x1MzA2Qlx1OTZDNlx1MzA3RVx1MzA4Qlx1MzAwMlx1MzA0Mlx1MzA2MVx1MzA4OVx1MzA2Qlx1MzBENVx1MzBBOVx1MzBGQ1x1MzBFMFx1MzA5MlxuICAgICAgLy8gXHU4RkZEXHU1MkEwXHUzMDU3XHUzMDVGXHUzMDg5XHUzMDAxXHUzMDVEXHUzMDZFXHUzMEJCXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHU1NDBEXHUzMDkyXHUzMDUzXHUzMDUzXHUzMDZCXHU4RkZEXHU1MkEwXHUzMDU5XHUzMDhCXHUzMDAyXG4gICAgICBjb250YWN0X2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnXHU5MDIzXHU3RDYxXHU1MTQ4XHU2MEM1XHU1ODMxJyB9LFxuICAgICAgbGVhZF9jbGFzc2lmaWNhdGlvbjogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1NTIwNlx1OTg1RScgfSxcbiAgICAgIGNvbXBhbnlfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdcdTRGMUFcdTc5M0VcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBhZGRpdGlvbmFsX2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnXHU4RkZEXHU1MkEwXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgcHJpdmFjeTogeyBsYWJlbDogJ1x1MzBEN1x1MzBFOVx1MzBBNFx1MzBEMFx1MzBCN1x1MzBGQycgfSxcbiAgICAgIGdlbmVyYWw6IHsgbGFiZWw6ICdcdTRFMDBcdTgyMkMnIH0sXG4gICAgICBkZXRhaWxzOiB7IGxhYmVsOiAnXHU4QTczXHU3RDMwJyB9LFxuICAgICAgc3RlcF8xX2NvbnRhY3RfZGV0YWlsczogeyBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBDM1x1MzBENzFcdUZGMUFcdTkwMjNcdTdENjFcdTUxNDhcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBzdGVwXzJfY29tcGFueV9pbmZvcm1hdGlvbjogeyBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBDM1x1MzBENzJcdUZGMUFcdTRGMUFcdTc5M0VcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBzdGVwXzNfcXVhbGlmaWNhdGlvbjogeyBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBDM1x1MzBENzNcdUZGMUFcdThDQzdcdTY4M0NcdThBNTVcdTRGQTEnIH0sXG4gICAgICBzdGVwXzRfcmV2aWV3X2FuZF9jb252ZXJ0OiB7IGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEMzXHUzMEQ3NFx1RkYxQVx1NzhCQVx1OEE4RFx1MzA2OFx1NTkwOVx1NjNEQicgfSxcbiAgICAgIHByaW1hcnlfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdcdTRFM0JcdTg5ODFcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBleHRlbmRlZF9kZXRhaWxzOiB7IGxhYmVsOiAnXHU4QTczXHU3RDMwXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgcXVpY2tfZWRpdDogeyBsYWJlbDogJ1x1MzBBRlx1MzBBNFx1MzBDM1x1MzBBRlx1N0RFOFx1OTZDNicgfSxcbiAgICAgIHVwZGF0ZV9sZWFkX3N0YXR1czogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOVx1MzA5Mlx1NjZGNFx1NjVCMCcgfSxcbiAgICAgIHRlbGxfdXNfYWJvdXRfeW91cnNlbGY6IHsgbGFiZWw6ICdcdTMwNDJcdTMwNkFcdTMwNUZcdTMwNkJcdTMwNjRcdTMwNDRcdTMwNjZcdTY1NTlcdTMwNDhcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQnIH0sXG4gICAgICBhYm91dF95b3VyX2NvbXBhbnk6IHsgbGFiZWw6ICdcdThDQjRcdTc5M0VcdTMwNkJcdTMwNjRcdTMwNDRcdTMwNjYnIH0sXG4gICAgICBob3dfY2FuX3dlX2hlbHA6IHsgbGFiZWw6ICdcdTMwNjlcdTMwNkVcdTMwODhcdTMwNDZcdTMwNkFcdTMwNTRcdTc1MjhcdTRFRjZcdTMwNjdcdTMwNTdcdTMwODdcdTMwNDZcdTMwNEJcdUZGMUYnIH0sXG4gICAgICBsZWFkX2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU2MEM1XHU1ODMxJyB9LFxuICAgICAgYWRkcmVzc19pbmZvcm1hdGlvbjogeyBsYWJlbDogJ1x1NEY0Rlx1NjI0MFx1NjBDNVx1NTgzMScgfSxcbiAgICAgIHByaXZhY3lfcHJlZmVyZW5jZXM6IHsgbGFiZWw6ICdcdTMwRDdcdTMwRTlcdTMwQTRcdTMwRDBcdTMwQjdcdTMwRkNcdThBMkRcdTVCOUEnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgY29udmVydF9sZWFkOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU1OTA5XHU2M0RCJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkVcdTU5MDlcdTYzREJcdTMwNkJcdTYyMTBcdTUyOUZcdTMwNTdcdTMwN0VcdTMwNTdcdTMwNUZcdUZGMDEnLFxuICAgICAgfSxcbiAgICAgIGNyZWF0ZV9jYW1wYWlnbjoge1xuICAgICAgICBsYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzA2Qlx1OEZGRFx1NTJBMCcsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHUzMDZCXHU4RkZEXHU1MkEwXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHVGRjAxJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzJyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNjaGVkdWxlX2ZvbGxvd3VwOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEQ1XHUzMEE5XHUzMEVEXHUzMEZDXHUzMEEyXHUzMEMzXHUzMEQ3XHUzMDkyXHU4QTJEXHU1QjlBJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTMwRDVcdTMwQTlcdTMwRURcdTMwRkNcdTMwQTJcdTMwQzNcdTMwRDdcdTMwOTJcdThBMkRcdTVCOUFcdTMwNTdcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDInLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fb3Bwb3J0dW5pdHk6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGFtb3VudF9wb3NpdGl2ZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU5MUQxXHU5ODREXHUzMDZGIDAgXHUzMDg4XHUzMDhBXHU1OTI3XHUzMDREXHUzMDQ0XHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5JyxcbiAgICAgIH0sXG4gICAgICBjbG9zZV9kYXRlX2Z1dHVyZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU1NTQ2XHU4QUM3XHUzMDRDXHUzMEFGXHUzMEVEXHUzMEZDXHUzMEJBXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDhCXHU1ODM0XHU1NDA4XHUzMDkyXHU5NjY0XHUzMDREXHUzMDAxXHU1QjhDXHU0RTg2XHU0RTg4XHU1QjlBXHU2NUU1XHUzMDkyXHU5MDRFXHU1M0JCXHUzMDZCXHU4QTJEXHU1QjlBXHUzMDU5XHUzMDhCXHUzMDUzXHUzMDY4XHUzMDZGXHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzJyxcbiAgICAgIH0sXG4gICAgICBvcHBvcnR1bml0eV9zdGFnZV9wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU3MTIxXHU1MkI5XHUzMDZBXHU1NTQ2XHU4QUM3XHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4XHU5MDc3XHU3OUZCXHUzMDY3XHUzMDU5JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NTU0Nlx1OEFDNycsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTU1NDZcdThBQzcnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHU0RTBBXHUzMDZFXHU1NTQ2XHU4QUM3XHUzMEZCXHU2ODQ4XHU0RUY2JyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdcdTU1NDZcdThBQzdcdTU0MEQnIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OCcgfSxcbiAgICAgIHByaW1hcnlfY29udGFjdDogeyBsYWJlbDogJ1x1NEUzQlx1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHU2MjQwXHU2NzA5XHU4MDA1JyB9LFxuICAgICAgYW1vdW50OiB7IGxhYmVsOiAnXHU5MUQxXHU5ODREJyB9LFxuICAgICAgZXhwZWN0ZWRfcmV2ZW51ZTogeyBsYWJlbDogJ1x1NjcxRlx1NUY4NVx1NTNDRVx1NzZDQScgfSxcbiAgICAgIHN0YWdlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4JyxcbiAgICAgICAgb3B0aW9uczogeyAuLi5vcHBvcnR1bml0eVN0YWdlT3B0aW9ucyB9LFxuICAgICAgfSxcbiAgICAgIHByb2JhYmlsaXR5OiB7IGxhYmVsOiAnXHU3OEJBXHU1RUE2ICglKScgfSxcbiAgICAgIGNsb3NlX2RhdGU6IHsgbGFiZWw6ICdcdTVCOENcdTRFODZcdTRFODhcdTVCOUFcdTY1RTUnIH0sXG4gICAgICB0eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEJGXHUzMEE0XHUzMEQ3JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ld19idXNpbmVzczogJ1x1NjVCMFx1ODk4Rlx1MzBEM1x1MzBCOFx1MzBDRFx1MzBCOScsXG4gICAgICAgICAgZXhpc3RpbmdfdXBncmFkZTogJ1x1NjVFMlx1NUI1OFx1OTg2N1x1NUJBMiAtIFx1MzBBMlx1MzBDM1x1MzBEN1x1MzBCMFx1MzBFQ1x1MzBGQ1x1MzBDOScsXG4gICAgICAgICAgZXhpc3RpbmdfcmVuZXdhbDogJ1x1NjVFMlx1NUI1OFx1OTg2N1x1NUJBMiAtIFx1NjZGNFx1NjVCMCcsXG4gICAgICAgICAgZXhpc3RpbmdfZXhwYW5zaW9uOiAnXHU2NUUyXHU1QjU4XHU5ODY3XHU1QkEyIC0gXHU2MkUxXHU1OTI3JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ1x1NThGMlx1NEUwQVx1NEU4OFx1NkUyQ1x1MzBBQlx1MzBDNlx1MzBCNFx1MzBFQScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwaXBlbGluZTogJ1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycsIGJlc3RfY2FzZTogJ1x1MzBEOVx1MzBCOVx1MzBDOFx1MzBCMVx1MzBGQ1x1MzBCOScsXG4gICAgICAgICAgY29tbWl0OiAnXHUzMEIzXHUzMERGXHUzMEMzXHUzMEM4Jywgb21pdHRlZDogJ1x1OTY2NFx1NTkxNicsIGNsb3NlZDogJ1x1NUI4Q1x1NEU4NicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdThBQUNcdTY2MEUnIH0sXG4gICAgICBuZXh0X3N0ZXA6IHsgbGFiZWw6ICdcdTZCMjFcdTMwNkVcdTMwQjlcdTMwQzZcdTMwQzNcdTMwRDcnIH0sXG4gICAgICBsZWFkX3NvdXJjZTogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOVx1MzBCRFx1MzBGQ1x1MzBCOScsIG9wdGlvbnM6IHsgLi4ubGVhZFNvdXJjZU9wdGlvbnMgfSB9LFxuICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzJywgaGVscDogJ1x1MzA1M1x1MzA2RVx1NTU0Nlx1OEFDN1x1MzA5Mlx1NzUxRlx1MzA3Rlx1NTFGQVx1MzA1N1x1MzA1Rlx1MzBERVx1MzBGQ1x1MzBCMVx1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMFx1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGMycgfSxcbiAgICAgIGRheXNfaW5fc3RhZ2U6IHsgbGFiZWw6ICdcdTczRkVcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjhcdTZFREVcdTU3MjhcdTY1RTVcdTY1NzAnIH0sXG4gICAgICBzdGFnZV9lbnRyeV9kYXRlOiB7IGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4XHU5NThCXHU1OUNCXHU2NUU1JywgaGVscDogJ1x1MzA1M1x1MzA2RVx1NTU0Nlx1OEFDN1x1MzA0Q1x1NzNGRVx1NTcyOFx1MzA2RVx1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCOFx1MzA2Qlx1NTE2NVx1MzA2M1x1MzA1Rlx1NjVFNVx1MzAwMicgfSxcbiAgICAgIGlzX3ByaXZhdGU6IHsgbGFiZWw6ICdcdTk3NUVcdTUxNkNcdTk1OEInIH0sXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTYyN0ZcdThBOERcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLFxuICAgICAgICBvcHRpb25zOiB7IG5vdF9yZXF1aXJlZDogJ1x1NjI3Rlx1OEE4RFx1NEUwRFx1ODk4MScsIHBlbmRpbmc6ICdcdTYyN0ZcdThBOERcdTVGODVcdTMwNjEnLCBhcHByb3ZlZDogJ1x1NjI3Rlx1OEE4RFx1NkUwOFx1MzA3RicsIHJlamVjdGVkOiAnXHU1Mzc0XHU0RTBCJyB9LFxuICAgICAgfSxcbiAgICAgIGFwcHJvdmVkX2RhdGU6IHsgbGFiZWw6ICdcdTYyN0ZcdThBOERcdTY1RTUnIH0sXG4gICAgICAvLyAjNTkzIFx1MjAxNCBcdTU1NDZcdThBQzdcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTY2NDJcdTMwNkJcdTVGQzVcdTk4MDhcdTMwMDJcdTU5MzFcdTZDRThcdTc0MDZcdTc1MzFcdTMwNkZcdTU1QjZcdTY5NkRcdTMwQzBcdTMwQzNcdTMwQjdcdTMwRTVcdTMwRENcdTMwRkNcdTMwQzlcdTMwNkVcbiAgICAgIC8vIFx1NTE4NVx1OEEzM1x1MzBBNlx1MzBBM1x1MzBCOFx1MzBBN1x1MzBDM1x1MzBDOFx1MzA2Qlx1MzA4Mlx1NTFGQVx1MzA4Qlx1MzA1Rlx1MzA4MVx1MzAwMVx1NEZERFx1NUI1OFx1NTAyNFx1MzA0Q1x1MzA1RFx1MzA2RVx1MzA3RVx1MzA3RVx1NzUzQlx1OTc2Mlx1MzA2Qlx1NTFGQVx1MzA2Nlx1MzA2Rlx1MzA0NFx1MzA1MVx1MzA2QVx1MzA0NFx1MzAwMlxuICAgICAgd2luX3JlYXNvbjoge1xuICAgICAgICBsYWJlbDogJ1x1NTNEN1x1NkNFOFx1NzQwNlx1NzUzMScsXG4gICAgICAgIGhlbHA6ICdcdTUzRDdcdTZDRThcdTMwNkJcdTgxRjNcdTMwNjNcdTMwNUZcdTc0MDZcdTc1MzFcdTMwMDJcdTU1NDZcdThBQzdcdTMwOTJcdTMwMENcdTYyMTBcdTdBQ0JcdTMwMERcdTMwNjdcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTMwNTlcdTMwOEJcdTk2OUJcdTMwNkJcdTVGQzVcdTk4MDhcdTMwNjdcdTMwNTlcdTMwMDInLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYmV0dGVyX3Byb2R1Y3Q6ICdcdTg4RkRcdTU0QzFcdTMwNENcdTUxMkFcdTMwOENcdTMwNjZcdTMwNDRcdTMwOEInLCBiZXR0ZXJfcHJpY2U6ICdcdTRGQTFcdTY4M0NcdTMwNENcdTUxMkFcdTMwOENcdTMwNjZcdTMwNDRcdTMwOEInLFxuICAgICAgICAgIHJlbGF0aW9uc2hpcDogJ1x1NjVFMlx1NUI1OFx1MzA2RVx1OTVBMlx1NEZDMicsIGJldHRlcl9zdXBwb3J0OiAnXHUzMEI1XHUzMEREXHUzMEZDXHUzMEM4XHUzMDRDXHU1MTJBXHUzMDhDXHUzMDY2XHUzMDQ0XHUzMDhCJyxcbiAgICAgICAgICBiZXN0X2ZpdDogJ1x1NjcwMFx1OTA2OVx1MzA2QVx1NkE1Rlx1ODBGRFx1MzBGQlx1OTA2OVx1NTQwOFx1NjAyNycsXG4gICAgICAgICAgcXVvdGVfYWNjZXB0ZWQ6ICdcdTg5OEJcdTdBNERcdTYyN0ZcdThBOEQnLCBvdGhlcjogJ1x1MzA1RFx1MzA2RVx1NEVENicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbG9zc19yZWFzb246IHtcbiAgICAgICAgbGFiZWw6ICdcdTU5MzFcdTZDRThcdTc0MDZcdTc1MzEnLFxuICAgICAgICBoZWxwOiAnXHU1OTMxXHU2Q0U4XHUzMDU3XHUzMDVGXHU3NDA2XHU3NTMxXHUzMDAyXHU1NTQ2XHU4QUM3XHUzMDkyXHUzMDBDXHU0RTBEXHU2MjEwXHU3QUNCXHUzMDBEXHUzMDY3XHUzMEFGXHUzMEVEXHUzMEZDXHUzMEJBXHUzMDU5XHUzMDhCXHU5NjlCXHUzMDZCXHU1RkM1XHU5ODA4XHUzMDY3XHUzMDU5XHUzMDAyJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHByaWNlOiAnXHU0RkExXHU2ODNDXHUzMDRDXHU5QUQ4XHUzMDU5XHUzMDRFXHUzMDhCJywgY29tcGV0aXRvcjogJ1x1N0FGNlx1NTQwOFx1NEVENlx1NzkzRVx1MzA2Qlx1NjU1N1x1NTMxNycsXG4gICAgICAgICAgbm9fYnVkZ2V0OiAnXHU0RTg4XHU3Qjk3XHUzMDZBXHUzMDU3Jywgbm9fZGVjaXNpb246ICdcdTYxMEZcdTYwMURcdTZDN0FcdTVCOUFcdTMwNkFcdTMwNTcnLFxuICAgICAgICAgIHRpbWluZzogJ1x1MzBCRlx1MzBBNFx1MzBERlx1MzBGM1x1MzBCMFx1NEUwRFx1OTA2OScsIGZlYXR1cmVzOiAnXHU2QTVGXHU4MEZEXHU0RTBEXHU4REIzJywgb3RoZXI6ICdcdTMwNURcdTMwNkVcdTRFRDYnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxvc3NfZGV0YWlsczogeyBsYWJlbDogJ1x1NTNEN1x1NkNFOFx1MzBGQlx1NTkzMVx1NkNFOFx1MzA2RVx1OEE3M1x1N0QzMCcsIGhlbHA6ICdcdTUzRDdcdTZDRThcdTMwRkJcdTU5MzFcdTZDRThcdTc0MDZcdTc1MzFcdTMwNkVcdTg4RENcdThEQjNcdThBQUNcdTY2MEVcdUZGMDhcdTgxRUFcdTc1MzFcdThBMThcdThGRjBcdUZGMDlcdTMwMDInIH0sXG4gICAgICAvLyBSRVEtMDAwNiBcdTIwMTQgXHU5MDY5XHU2ODNDXHU1MjI0XHU1QjlBXHUzMDAxXHU5ODY3XHU1QkEyXHU1MDc0XHUzMDZFXHU4QUJGXHU5MDU0XHUzMEI5XHUzMEIxXHUzMEI4XHUzMEU1XHUzMEZDXHUzMEVCXHUzMDAxXHU1NTQ2XHU4QUM3XHUzMDZFXHU3RDRDXHU3REVGXHUzMDAxXHU0RThCXHU2OTZEXHU1MzNBXHU1MjA2XHUzMDAxXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHU1OTA5XHU2NkY0XHU2MjdGXHU4QThEXHUzMDAyXG4gICAgICB3aWxsX2JpZDogeyBsYWJlbDogJ1x1NTE2NVx1NjcyRFx1NEU4OFx1NUI5QScsIGhlbHA6ICdcdTUxNjVcdTY3MkRcdTMwNTlcdTMwOEJcdTYxMEZcdTU0MTFcdTMwNENcdTMwNDJcdTMwOEJcdTMwNEJcdTMwNjlcdTMwNDZcdTMwNEJcdTMwMDJcdTY3MkFcdThBMkRcdTVCOUFcdTMwNkZcdTUyMjRcdTY1QURcdTMwNENcdTRGRERcdTc1NTlcdTRFMkRcdTMwNjdcdTMwNDJcdTMwOEJcdTMwNTNcdTMwNjhcdTMwOTJcdTc5M0FcdTMwNTdcdTMwN0VcdTMwNTlcdTMwMDInIH0sXG4gICAgICBjb250cm9sbGFiaWxpdHk6IHsgbGFiZWw6ICdcdTMwQjNcdTMwRjNcdTMwQzhcdTMwRURcdTMwRkNcdTMwRUJcdTVFQTYnLCBvcHRpb25zOiB7IGhpZ2g6ICdcdTlBRDgnLCBtZWRpdW06ICdcdTRFMkQnLCBsb3c6ICdcdTRGNEUnIH0gfSxcbiAgICAgIHByaW9yaXR5OiB7IGxhYmVsOiAnXHU1MTJBXHU1MTQ4XHU1RUE2Jywgb3B0aW9uczogeyBoaWdoOiAnXHU5QUQ4JywgbWVkaXVtOiAnXHU0RTJEJywgbG93OiAnXHU0RjRFJyB9IH0sXG4gICAgICBkZWFsX2xldmVsOiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHUzMEU5XHUzMEYzXHUzMEFGJywgb3B0aW9uczogeyBzdHJhdGVnaWM6ICdcdTYyMjZcdTc1NjUnLCBrZXk6ICdcdTkxQ0RcdTcwQjknLCBzdGFuZGFyZDogJ1x1NkExOVx1NkU5NicgfSB9LFxuICAgICAgaXNfc3ViY29udHJhY3RlZDogeyBsYWJlbDogJ1x1NTkxNlx1NkNFOFx1MzA0Mlx1MzA4QScgfSxcbiAgICAgIHN1YmNvbnRyYWN0aW5nX25vdGU6IHsgbGFiZWw6ICdcdTU5MTZcdTZDRThcdTMwRTFcdTMwRTInIH0sXG4gICAgICBjdXN0b21lcl9pbml0aWF0aW9uX2RhdGU6IHsgbGFiZWw6ICdcdTk4NjdcdTVCQTJcdTMwNkVcdTY4NDhcdTRFRjZcdTUzMTZcdTY1RTUnIH0sXG4gICAgICBleHBlY3RlZF90ZW5kZXJfZGF0ZTogeyBsYWJlbDogJ1x1NTE2NVx1NjcyRFx1NEU4OFx1NUI5QVx1NjVFNScgfSxcbiAgICAgIGV4cGVjdGVkX3NpZ25pbmdfZGF0ZTogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1N0RFMFx1N0Q1MFx1NEU4OFx1NUI5QVx1NjVFNScgfSxcbiAgICAgIGV4cGVjdGVkX3RlbmRlcl9hbW91bnQ6IHsgbGFiZWw6ICdcdTUxNjVcdTY3MkRcdTRFODhcdTVCOUFcdTkxRDFcdTk4NEQnIH0sXG4gICAgICBleHBlY3RlZF9zaWduaW5nX2Ftb3VudDogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1NEU4OFx1NUI5QVx1OTFEMVx1OTg0RCcgfSxcbiAgICAgIGJ1c2luZXNzX2xpbmU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTRFOEJcdTY5NkRcdTUzM0FcdTUyMDYnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcHJvZHVjdDogJ1x1ODhGRFx1NTRDMScsIHNlcnZpY2VzOiAnXHUzMEQ3XHUzMEVEXHUzMEQ1XHUzMEE3XHUzMEMzXHUzMEI3XHUzMEU3XHUzMENBXHUzMEVCXHUzMEI1XHUzMEZDXHUzMEQzXHUzMEI5JywgY29uc3VsdGluZzogJ1x1MzBCM1x1MzBGM1x1MzBCNVx1MzBFQlx1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMCcsXG4gICAgICAgICAgc3VwcG9ydDogJ1x1NEZERFx1NUI4OFx1MzBGQlx1MzBCNVx1MzBERFx1MzBGQ1x1MzBDOCcsIG90aGVyOiAnXHUzMDVEXHUzMDZFXHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjdXN0b21lcl9iYWNrZ3JvdW5kOiB7IGxhYmVsOiAnXHU5ODY3XHU1QkEyXHU2OTgyXHU4OTgxJyB9LFxuICAgICAgcHJvamVjdF9iYWNrZ3JvdW5kOiB7IGxhYmVsOiAnXHUzMEQ3XHUzMEVEXHUzMEI4XHUzMEE3XHUzMEFGXHUzMEM4XHU4MENDXHU2NjZGJyB9LFxuICAgICAgcmlza19hbmFseXNpczogeyBsYWJlbDogJ1x1MzBFQVx1MzBCOVx1MzBBRlx1NTIwNlx1Njc5MCcgfSxcbiAgICAgIHBheW1lbnRfdGVybXM6IHsgbGFiZWw6ICdcdTY1MkZcdTYyNTVcdTY3NjFcdTRFRjYnIH0sXG4gICAgICByZXF1ZXN0ZWRfc3RhdHVzOiB7IGxhYmVsOiAnXHU3NTMzXHU4QUNCXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5Jywgb3B0aW9uczogeyBjbG9zZWRfd29uOiAnXHU1M0Q3XHU2Q0U4JywgY2xvc2VkX2xvc3Q6ICdcdTU5MzFcdTZDRTgnIH0gfSxcbiAgICAgIHN0YXR1c19jaGFuZ2VfYXBwcm92YWxfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHU1OTA5XHU2NkY0XHU2MjdGXHU4QThEJyxcbiAgICAgICAgb3B0aW9uczogeyBub3RfcmVxdWlyZWQ6ICdcdTYyN0ZcdThBOERcdTRFMERcdTg5ODEnLCBwZW5kaW5nOiAnXHU2MjdGXHU4QThEXHU1Rjg1XHUzMDYxJywgYXBwcm92ZWQ6ICdcdTYyN0ZcdThBOERcdTZFMDhcdTMwN0YnLCByZWplY3RlZDogJ1x1NTM3NFx1NEUwQicgfSxcbiAgICAgIH0sXG4gICAgICAvLyBSRVEtMDAwNiBcdTMwQjlcdTMwQzZcdTMwQzNcdTMwRDcgMTEgXHUyMDE0IFx1Njg0OFx1NEVGNlx1NTMxNlx1RkYwOFx1N0FDQlx1OTg3OVx1RkYwOVx1NjI3Rlx1OEE4RFx1MzAwMlxuICAgICAgcXVhbGlmaWNhdGlvbl9yZXF1ZXN0ZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY4NDhcdTRFRjZcdTUzMTZcdTYyN0ZcdThBOERcdTMwOTJcdTc1MzNcdThBQ0InLFxuICAgICAgICBoZWxwOiAnXHUzMEMxXHUzMEE3XHUzMEMzXHUzMEFGXHUzMDU5XHUzMDhCXHUzMDY4XHUzMDUzXHUzMDZFXHU1NTQ2XHU4QUM3XHUzMDkyXHU2ODQ4XHU0RUY2XHU1MzE2XHU2MjdGXHU4QThEXHUzMDZCXHU1NkRFXHUzMDU3XHUzMDdFXHUzMDU5XHUzMDAyXHU1Mzc0XHU0RTBCXHUzMDU1XHUzMDhDXHUzMDhCXHUzMDY4XHUzMEMxXHUzMEE3XHUzMEMzXHUzMEFGXHUzMDRDXHU1OTE2XHUzMDhDXHUzMDdFXHUzMDU5XHUzMDAyXHU1MThEXHU1RUE2XHUzMEMxXHUzMEE3XHUzMEMzXHUzMEFGXHUzMDU5XHUzMDhCXHUzMDY4XHU2NTM5XHUzMDgxXHUzMDY2XHU3NTMzXHU4QUNCXHUzMDY3XHUzMDREXHUzMDdFXHUzMDU5XHUzMDAyJyxcbiAgICAgIH0sXG4gICAgICBxdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1Njg0OFx1NEVGNlx1NTMxNlx1NjI3Rlx1OEE4RCcsXG4gICAgICAgIG9wdGlvbnM6IHsgbm90X3JlcXVpcmVkOiAnXHU2MjdGXHU4QThEXHU0RTBEXHU4OTgxJywgcGVuZGluZzogJ1x1NjI3Rlx1OEE4RFx1NUY4NVx1MzA2MScsIGFwcHJvdmVkOiAnXHU2MjdGXHU4QThEXHU2RTA4XHUzMDdGJywgcmVqZWN0ZWQ6ICdcdTUzNzRcdTRFMEInIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICB0ZW5kZXJfdGhpc19xdWFydGVyOiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHUzMDZCXHU1MTY1XHU2NzJEXHU0RTg4XHU1QjlBJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHUzMDZCXHU1MTY1XHU2NzJEXHU0RTg4XHU1QjlBXHUzMDZFXHU1NTQ2XHU4QUM3XHUzMDZGXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzJyxcbiAgICAgICAgICBtZXNzYWdlOiAnXHUzMDUzXHUzMDZFXHUzMEJGXHUzMEQ2XHUzMDZCXHUzMDZGXHUzMDAxXHU5ODY3XHU1QkEyXHU1MDc0XHUzMDZFXHU1MTY1XHU2NzJEXHU0RTg4XHU1QjlBXHU2NUU1XHUzMDRDXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHU1MTg1XHUzMDZCXHUzMDQyXHUzMDhCXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHU1NTQ2XHU4QUM3XHUzMDRDXHU4ODY4XHU3OTNBXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU5XHUzMDAyXHU1NTQ2XHU4QUM3XHUzMDZCXHUzMDBDXHU1MTY1XHU2NzJEXHU0RTg4XHU1QjlBXHU2NUU1XHUzMDBEXHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU5XHUzMDhCXHUzMDY4XHUzMDAxXHUzMDUzXHUzMDUzXHUzMDZCXHU4ODY4XHU3OTNBXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU5XHUzMDAyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvcGVuX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdcdTkwMzJcdTg4NENcdTRFMkRcdTMwNkVcdTU1NDZcdThBQzcnIH0sXG4gICAgICBhbGxfb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ1x1NTE2OFx1NTU0Nlx1OEFDNycgfSxcbiAgICAgIHBpcGVsaW5lX2thbmJhbjogeyBsYWJlbDogJ1x1MzBCQlx1MzBGQ1x1MzBFQlx1MzBCOVx1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycgfSxcbiAgICAgIGNsb3NlX2RhdGVfY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTRFODhcdTZFMkNcdTMwQUJcdTMwRUNcdTMwRjNcdTMwQzBcdTMwRkMnIH0sXG4gICAgICBkZWFsX3RpbWVsaW5lOiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHUzMEJGXHUzMEE0XHUzMEUwXHUzMEU5XHUzMEE0XHUzMEYzJyB9LFxuICAgICAgZGVhbF9nYWxsZXJ5OiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHUzMEFCXHUzMEZDXHUzMEM5JyB9LFxuICAgICAgbXlfb3Blbl9kZWFsczogeyBsYWJlbDogJ1x1NzlDMVx1MzA2RVx1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1NTU0Nlx1OEFDNycgfSxcbiAgICAgIHN0YWxlX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdcdTI2QTBcdUZFMEYgXHU1MDVDXHU2RURFXHU1NTQ2XHU4QUM3IFx1MDBCNyBcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjhcdTZFREVcdTU3MjhcdTMwNENcdTk1NzdcdTMwNDRcdTk4MDYnIH0sXG4gICAgICBjbG9zaW5nX3RoaXNfcXVhcnRlcjoge1xuICAgICAgICBsYWJlbDogJ1x1NEVDQVx1NTZEQlx1NTM0QVx1NjcxRlx1MzA2Qlx1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1NEU4OFx1NUI5QScsXG4gICAgICAgIGVtcHR5U3RhdGU6IHtcbiAgICAgICAgICB0aXRsZTogJ1x1NEVDQVx1NTZEQlx1NTM0QVx1NjcxRlx1MzA2Qlx1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1NEU4OFx1NUI5QVx1MzA2RVx1NTU0Nlx1OEFDN1x1MzA2Rlx1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1Qlx1MzA5MycsXG4gICAgICAgICAgbWVzc2FnZTogJ1x1MzA1M1x1MzA2RVx1MzBCRlx1MzBENlx1MzA2Qlx1MzA2Rlx1MzAwMVx1NUI4Q1x1NEU4Nlx1NEU4OFx1NUI5QVx1NjVFNVx1MzA0Q1x1NEVDQVx1NTZEQlx1NTM0QVx1NjcxRlx1NTE4NVx1MzA2Qlx1MzA0Mlx1MzA4Qlx1MzBCM1x1MzBERlx1MzBDM1x1MzBDOFx1RkYwRlx1MzBEOVx1MzBCOVx1MzBDOFx1MzBCMVx1MzBGQ1x1MzBCOVx1MzA2RVx1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1NTU0Nlx1OEFDN1x1MzA0Q1x1ODg2OFx1NzkzQVx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1OVx1MzAwMlx1NzNGRVx1NTcyOFx1OEE3Mlx1NUY1M1x1MzA1OVx1MzA4Qlx1NTU0Nlx1OEFDN1x1MzA2Rlx1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMlx1MzA1RFx1MzA4Q1x1NEVFNVx1OTY0RFx1MzA2Qlx1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1MzA1OVx1MzA4Qlx1NTU0Nlx1OEFDN1x1MzA2Rlx1MzAwQ1x1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1NTU0Nlx1OEFDN1x1MzAwRFx1MzBCRlx1MzBENlx1MzA2Qlx1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVx1MzAwMicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICAvLyBcdTMwQUFcdTMwRDZcdTMwQjhcdTMwQTdcdTMwQUZcdTMwQzhcdTVCOUFcdTdGQTlcdTMwNkVcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTMwQURcdTMwRkNcdUZGMDhvcHBvcnR1bml0eS5vYmplY3QudHNcdUZGMDlcdTIwMTQgXHU1MTY1XHU1MjlCXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEUwXHUzMDY4XHUzMDAxXG4gICAgICAvLyBcdTMwNTNcdTMwOENcdTMwODlcdTMwNkVcdTMwQjBcdTMwRUJcdTMwRkNcdTMwRDdcdTMwOTJcdTUzQzJcdTcxNjdcdTMwNTlcdTMwOEJcdThBNzNcdTdEMzBcdTMwREFcdTMwRkNcdTMwQjhcdTMwNkVcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdUZGMDgjMTQ1Mlx1RkYwOVx1MzA2N1x1NEY3Rlx1NzUyOFxuICAgICAgY3JtX2ZvcmVjYXN0OiB7IGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4XHUzMEZCXHU1OEYyXHU0RTBBXHU0RTg4XHU2RTJDJyB9LFxuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTU3RkFcdTY3MkNcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBmaW5hbmNpYWxzOiB7IGxhYmVsOiAnXHU4Q0ExXHU1MkQ5XHU2MEM1XHU1ODMxJyB9LFxuICAgICAgc2FsZXNfcHJvY2VzczogeyBsYWJlbDogJ1x1NTVCNlx1Njk2RFx1MzBEN1x1MzBFRFx1MzBCQlx1MzBCOScgfSxcbiAgICAgIGNsYXNzaWZpY2F0aW9uOiB7IGxhYmVsOiAnXHU1MjA2XHU5ODVFJyB9LFxuICAgICAgY2FtcGFpZ246IHsgbGFiZWw6ICdcdTMwQURcdTMwRTNcdTMwRjNcdTMwREFcdTMwRkNcdTMwRjMnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ1x1MzBFMVx1MzBFMlx1MzBGQlx1NkIyMVx1MzA2RVx1MzBCOVx1MzBDNlx1MzBDM1x1MzBENycgfSxcbiAgICAgIHF1YWxpZmljYXRpb246IHsgbGFiZWw6ICdcdTkwNjlcdTY4M0NcdTUyMjRcdTVCOUEnIH0sXG4gICAgICBuYXJyYXRpdmU6IHsgbGFiZWw6ICdcdTU1NDZcdThBQzdcdTMwNkVcdTdENENcdTdERUYnIH0sXG4gICAgICAvLyBvcHBvcnR1bml0eS52aWV3LnRzIFx1MzA2RVx1MzBENVx1MzBBOVx1MzBGQ1x1MzBFMFx1MzBCQlx1MzBBRlx1MzBCN1x1MzBFN1x1MzBGM1x1NTQwRCAoIzExMDApXG4gICAgICBvdmVydmlldzogeyBsYWJlbDogJ1x1Njk4Mlx1ODk4MScgfSxcbiAgICAgIGZvcmVjYXN0OiB7IGxhYmVsOiAnXHU0RTg4XHU2RTJDJyB9LFxuICAgICAgc2FsZXNfc3RyYXRlZ3k6IHsgbGFiZWw6ICdcdTU1QjZcdTY5NkRcdTYyMjZcdTc1NjUnIH0sXG4gICAgICB3aW5fbG9zczogeyBsYWJlbDogJ1x1NTNEN1x1NkNFOFx1RkYwRlx1NTkzMVx1NkNFOCcgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7XG4gICAgICAuLi5hY3Rpdml0eUFjdGlvbnMsXG4gICAgICBjbG9uZV9vcHBvcnR1bml0eToge1xuICAgICAgICBsYWJlbDogJ1x1NTU0Nlx1OEFDN1x1MzA5Mlx1ODkwN1x1ODhGRCcsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1NTQ2XHU4QUM3XHUzMDkyXHU4OTA3XHU4OEZEXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHVGRjAxJyxcbiAgICAgIH0sXG4gICAgICBtYXNzX3VwZGF0ZV9zdGFnZToge1xuICAgICAgICBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCOFx1NjZGNFx1NjVCMCcsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHU1NTQ2XHU4QUM3XHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4XHUzMDkyXHU2NkY0XHU2NUIwXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHVGRjAxJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgc3RhZ2U6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnXHU2NUIwXHUzMDU3XHUzMDQ0XHUzMEI5XHUzMEM2XHUzMEZDXHUzMEI4JyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHsgLi4ub3Bwb3J0dW5pdHlTdGFnZU9wdGlvbnMgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGdlbmVyYXRlX3F1b3RlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU4OThCXHU3QTREXHUzMDkyXHU0RjVDXHU2MjEwJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTU1NDZcdThBQzdcdTMwNEJcdTMwODlcdTg5OEJcdTdBNERcdTMwOTJcdTRGNUNcdTYyMTBcdTMwNTdcdTMwN0VcdTMwNTdcdTMwNUZcdUZGMDEnLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtOiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICB1bml0X3ByaWNlX3Bvc2l0aXZlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdThDQTlcdTU4RjJcdTRGQTFcdTY4M0NcdTMwOTJcdThDQTBcdTMwNkVcdTUwMjRcdTMwNkJcdTMwNTlcdTMwOEJcdTMwNTNcdTMwNjhcdTMwNkZcdTMwNjdcdTMwNERcdTMwN0VcdTMwNUJcdTMwOTMnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHU1NTQ2XHU1NEMxXHU2NjBFXHU3RDMwJyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1NTU0Nlx1OEFDN1x1NTU0Nlx1NTRDMVx1NjYwRVx1N0QzMCcsXG4gICAgZGVzY3JpcHRpb246ICdcdTU1NDZcdThBQzdcdTkxNERcdTRFMEJcdTMwNkVcdTg4RkRcdTU0QzFcdTUyMjVcdTRGQTFcdTY4M0NcdTY2MEVcdTdEMzBcdTg4NEMnLFxuICAgIGZpZWxkczoge1xuICAgICAgY3JtX29wcG9ydHVuaXR5OiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3JyB9LFxuICAgICAgY3JtX3Byb2R1Y3Q6IHsgbGFiZWw6ICdcdTg4RkRcdTU0QzEnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ1x1OEFBQ1x1NjYwRScgfSxcbiAgICAgIHF1YW50aXR5OiB7IGxhYmVsOiAnXHU2NTcwXHU5MUNGJyB9LFxuICAgICAgbGlzdF9wcmljZTogeyBsYWJlbDogJ1x1NUI5QVx1NEZBMScsIGhlbHA6ICdcdTg4RkRcdTU0QzFcdTMwNkVcdTMwQUJcdTMwQkZcdTMwRURcdTMwQjBcdTRGQTFcdTY4M0NcdTMwNEJcdTMwODlcdTgxRUFcdTUyRDVcdTUxNjVcdTUyOUJcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTknIH0sXG4gICAgICB1bml0X3ByaWNlOiB7IGxhYmVsOiAnXHU4Q0E5XHU1OEYyXHU0RkExXHU2ODNDJywgaGVscDogJ1x1NEVBNFx1NkUwOVx1NUY4Q1x1MzA2RVx1NTM1OFx1NEZBMVx1RkYwOFx1NUI5QVx1NEZBMVx1MzA2OFx1NzU3MFx1MzA2QVx1MzA4Qlx1NTgzNFx1NTQwOFx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVx1RkYwOScgfSxcbiAgICAgIGRpc2NvdW50OiB7IGxhYmVsOiAnXHU1MjcyXHU1RjE1XHU3Mzg3XHVGRjA4JVx1RkYwOScgfSxcbiAgICAgIHRvdGFsX3ByaWNlOiB7IGxhYmVsOiAnXHU1NDA4XHU4QTA4JyB9LFxuICAgICAgbGluZV9udW1iZXI6IHsgbGFiZWw6ICdcdTg4NENcdTc1NkFcdTUzRjcnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnXHU2NjBFXHU3RDMwXHU4ODRDJyB9LFxuICAgICAgcHJpY2luZzogeyBsYWJlbDogJ1x1NEZBMVx1NjgzQycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fZm9yZWNhc3Q6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIHBlcmlvZF9lbmRfYWZ0ZXJfc3RhcnQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NjcxRlx1OTU5M1x1N0Q0Mlx1NEU4Nlx1MzA2Rlx1NjcxRlx1OTU5M1x1OTU4Qlx1NTlDQlx1MzA4OFx1MzA4QVx1NUY4Q1x1MzA2N1x1MzA0Mlx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgcGVyaW9kX2VuZF9tYXRjaGVzX2NhbGVuZGFyX3BlcmlvZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU2NzFGXHU5NTkzXHU3RDQyXHU0RTg2XHUzMDZGXHUzMDVEXHUzMDZFXHU2NzFGXHU5NTkzXHUzMDZFXHU2NzAwXHU3RDQyXHU2NUU1XHUzMDY3XHUzMDQyXHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5XHUzMDAyXHU0RjhCXHVGRjFBMjAyNi0wNy0wMSBcdTk1OEJcdTU5Q0JcdTMwNkVcdTU2REJcdTUzNEFcdTY3MUZcdTMwNkFcdTMwODkgMjAyNi0wOS0zMFx1MzAwMTIwMjYgXHU1RTc0IDggXHU2NzA4XHUzMDZBXHUzMDg5IDIwMjYtMDgtMzFcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIHBlcmlvZF9zdGFydF9maXJzdF9vZl9wZXJpb2Q6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NjcxRlx1OTU5M1x1OTU4Qlx1NTlDQlx1MzA2Rlx1MzA1RFx1MzA2RVx1NjcxRlx1OTU5M1x1MzA2RVx1NTIxRFx1NjVFNVx1MzA2N1x1MzA0Mlx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVx1MzAwMlx1NEY4Qlx1RkYxQTIwMjYgXHU1RTc0IDggXHU2NzA4XHUzMDZBXHUzMDg5IDIwMjYtMDgtMDFcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIHF1YXJ0ZXJfc3RhcnRzX29uX3F1YXJ0ZXJfYm91bmRhcnk6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NTZEQlx1NTM0QVx1NjcxRlx1MzBENVx1MzBBOVx1MzBGQ1x1MzBBRFx1MzBFM1x1MzBCOVx1MzBDOFx1MzA2Rlx1NTZEQlx1NTM0QVx1NjcxRlx1MzA2RVx1NTg4M1x1NzU0Q1x1RkYwODEgXHU2NzA4IDEgXHU2NUU1XHUzMDAxNCBcdTY3MDggMSBcdTY1RTVcdTMwMDE3IFx1NjcwOCAxIFx1NjVFNVx1MzAwMTEwIFx1NjcwOCAxIFx1NjVFNVx1RkYwOVx1MzA0Qlx1MzA4OVx1OTU4Qlx1NTlDQlx1MzA1OVx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgc25hcHNob3RfYW1vdW50c19ub25fbmVnYXRpdmU6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1MzBCOVx1MzBDQVx1MzBDM1x1MzBEN1x1MzBCN1x1MzBFN1x1MzBDM1x1MzBDOFx1OTFEMVx1OTg0RFx1MzA2Rlx1OENBMFx1MzA2RVx1NTAyNFx1MzA2Qlx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdcdTMwRDVcdTMwQTlcdTMwRkNcdTMwQURcdTMwRTNcdTMwQjlcdTMwQzgnLFxuICAgIHBsdXJhbExhYmVsOiAnXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEFEXHUzMEUzXHUzMEI5XHUzMEM4JyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1NjJDNVx1NUY1M1x1ODAwNVx1MzA1NFx1MzA2OFx1MzA2RVx1NUI5QVx1NjcxRlx1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGM1x1MzBCOVx1MzBDQVx1MzBDM1x1MzBEN1x1MzBCN1x1MzBFN1x1MzBDM1x1MzBDOFx1MzA2N1x1NTNDRVx1NzZDQVx1NEU4OFx1NkUyQ1x1MzA2Qlx1NEY3Rlx1NzUyOCcsXG4gICAgZmllbGRzOiB7XG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHBlcmlvZDogeyBsYWJlbDogJ1x1NjcxRlx1OTU5MycsIG9wdGlvbnM6IHsgbW9udGg6ICdcdTY3MDhcdTZCMjEnLCBxdWFydGVyOiAnXHU1NkRCXHU1MzRBXHU2NzFGJyB9IH0sXG4gICAgICBwZXJpb2Rfc3RhcnQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY3MUZcdTk1OTNcdTk1OEJcdTU5Q0InLFxuICAgICAgICBoZWxwOiAnXHU2NzFGXHU5NTkzXHUzMDZFXHU1MjFEXHU2NUU1XHUzMDY3XHUzMDQyXHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5IFx1MjAxNCBcdTRGOEI6IDIwMjYgXHU1RTc0IDggXHU2NzA4XHUzMDZBXHUzMDg5IDIwMjYtMDgtMDFcdTMwMDJcdTU2REJcdTUzNEFcdTY3MUZcdTMwNkVcdTMwRDVcdTMwQTlcdTMwRkNcdTMwQURcdTMwRTNcdTMwQjlcdTMwQzhcdTMwNkZcdTMwNTVcdTMwODlcdTMwNkJcdTU2REJcdTUzNEFcdTY3MUZcdTMwNkVcdTU4ODNcdTc1NENcdUZGMDgxIFx1NjcwOCAxIFx1NjVFNVx1MzBGQjQgXHU2NzA4IDEgXHU2NUU1XHUzMEZCNyBcdTY3MDggMSBcdTY1RTVcdTMwRkIxMCBcdTY3MDggMSBcdTY1RTVcdUZGMDlcdTMwNjdcdTk1OEJcdTU5Q0JcdTMwNTlcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTlcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIHBlcmlvZF9lbmQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY3MUZcdTk1OTNcdTdENDJcdTRFODYnLFxuICAgICAgICBoZWxwOiAnXHU5MDFBXHU1RTM4XHUzMDZGXHUzMDBDXHU2NzFGXHU5NTkzXHUzMDBEXHUzMDY4XHUzMDBDXHU2NzFGXHU5NTkzXHU5NThCXHU1OUNCXHUzMDBEXHUzMDRCXHUzMDg5XHU4MUVBXHU1MkQ1XHU3Njg0XHUzMDZCXHU3Qjk3XHU1MUZBXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU5XHUzMDAyXHU2MjRCXHU1MkQ1XHUzMDY3XHU1MTY1XHU1MjlCXHUzMDU5XHUzMDhCXHU1ODM0XHU1NDA4XHUzMDZGXHUzMDAxXHUzMDVEXHUzMDZFXHU2NzFGXHU5NTkzXHUzMDZFXHU2NzAwXHU3RDQyXHU2NUU1XHUzMDY3XHUzMDQyXHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5IFx1MjAxNCBcdTRGOEI6IDIwMjYtMDctMDEgXHU5NThCXHU1OUNCXHUzMDZFXHU1NkRCXHU1MzRBXHU2NzFGXHUzMDZBXHUzMDg5IDIwMjYtMDktMzBcdTMwMDEyMDI2IFx1NUU3NCA4IFx1NjcwOFx1MzA2QVx1MzA4OSAyMDI2LTA4LTMxXHUzMDAyJyxcbiAgICAgIH0sXG4gICAgICBwZXJpb2RfbGFiZWw6IHtcbiAgICAgICAgbGFiZWw6ICdcdTY3MUZcdTk1OTMnLFxuICAgICAgICBoZWxwOiAnXHUzMDBDMjAyNiBcdTVFNzRcdTdCMkMgMyBcdTU2REJcdTUzNEFcdTY3MUZcdTMwMERcdTMwMEMyMDI2IFx1NUU3NCA4IFx1NjcwOFx1MzAwRFx1MzA2RVx1MzA4OFx1MzA0Nlx1MzA2QVx1OEFBRFx1MzA3Rlx1MzA4NFx1MzA1OVx1MzA0NFx1NjcxRlx1OTU5M1x1MzBFOVx1MzBEOVx1MzBFQlx1MzAwMicsXG4gICAgICB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ1x1ODg2OFx1NzkzQVx1NTQwRCcgfSxcbiAgICAgIHNuYXBzaG90X2RhdGU6IHsgbGFiZWw6ICdcdTMwQjlcdTMwQ0FcdTMwQzNcdTMwRDdcdTMwQjdcdTMwRTdcdTMwQzNcdTMwQzhcdTY1RTUnLCBoZWxwOiAnXHUzMDUzXHUzMDZFXHUzMEI5XHUzMENBXHUzMEMzXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEMzXHUzMEM4XHUzMDkyXHU1M0Q2XHU1Rjk3XHUzMDU3XHUzMDVGXHU2NUU1XHUzMDAyJyB9LFxuICAgICAgc291cmNlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEJEXHUzMEZDXHUzMEI5JyxcbiAgICAgICAgb3B0aW9uczogeyBzY2hlZHVsZWQ6ICdcdTVCOUFcdTY3MUZcdTMwQjlcdTMwQ0FcdTMwQzNcdTMwRDdcdTMwQjdcdTMwRTdcdTMwQzNcdTMwQzgnLCBhaTogJ0FJIFx1MzBCOVx1MzBBRFx1MzBFQicsIG1hbnVhbDogJ1x1NjI0Qlx1NTJENVx1NTE2NVx1NTI5QicgfSxcbiAgICAgIH0sXG4gICAgICBxdW90YTogeyBsYWJlbDogJ1x1MzBBRlx1MzBBOVx1MzBGQ1x1MzBCRicgfSxcbiAgICAgIHBpcGVsaW5lX2Ftb3VudDoge1xuICAgICAgICBsYWJlbDogJ1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycsXG4gICAgICAgIGhlbHA6ICdcdTMwNTNcdTMwNkVcdTY3MUZcdTk1OTNcdTMwNkJcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTRFODhcdTVCOUFcdTMwNkVcdTMwQUFcdTMwRkNcdTMwRDdcdTMwRjNcdTU1NDZcdThBQzdcdTMwNkVcdTU0MDhcdThBMDhcdTkxRDFcdTk4NERcdUZGMDhcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQjhcdTMwOTJcdTU1NEZcdTMwOEZcdTMwNkFcdTMwNDRcdUZGMDlcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIGJlc3RfY2FzZV9hbW91bnQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwRDlcdTMwQjlcdTMwQzhcdTMwQjFcdTMwRkNcdTMwQjknLFxuICAgICAgICBoZWxwOiAnXHU1OEYyXHU0RTBBXHU0RTg4XHU2RTJDXHUzMEFCXHUzMEM2XHUzMEI0XHUzMEVBXHUzMDRDXHUzMDBDXHUzMEQ5XHUzMEI5XHUzMEM4XHUzMEIxXHUzMEZDXHUzMEI5XHUzMDBEXHUzMDdFXHUzMDVGXHUzMDZGXHUzMDBDXHUzMEIzXHUzMERGXHUzMEMzXHUzMEM4XHUzMDBEXHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHU1NTQ2XHU4QUM3XHUzMDAyJyxcbiAgICAgIH0sXG4gICAgICBjb21taXRfYW1vdW50OiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEIzXHUzMERGXHUzMEMzXHUzMEM4JyxcbiAgICAgICAgaGVscDogJ1x1NThGMlx1NEUwQVx1NEU4OFx1NkUyQ1x1MzBBQlx1MzBDNlx1MzBCNFx1MzBFQVx1MzA0Q1x1MzAwQ1x1MzBCM1x1MzBERlx1MzBDM1x1MzBDOFx1MzAwRFx1MzA2RVx1MzBBQVx1MzBGQ1x1MzBEN1x1MzBGM1x1NTU0Nlx1OEFDN1x1RkYwOFx1NjJDNVx1NUY1M1x1ODAwNVx1MzA0Q1x1MzBCM1x1MzBERlx1MzBDM1x1MzBDOFx1NkUwOFx1MzA3Rlx1RkYwOVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgY2xvc2VkX2Ftb3VudDogeyBsYWJlbDogJ1x1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQScsIGhlbHA6ICdcdTMwNTNcdTMwNkVcdTY3MUZcdTk1OTNcdTMwNkJcdTMwNTlcdTMwNjdcdTMwNkJcdTYyMTBcdTdBQ0JcdTMwNTdcdTMwNUZcdTkxRDFcdTk4NERcdTMwMDInIH0sXG4gICAgICBleHBlY3RlZF9hbW91bnQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTRFODhcdTYwRjMnLFxuICAgICAgICBoZWxwOiAnXHUzMEFGXHUzMEVEXHUzMEZDXHUzMEJBICsgXHUzMEIzXHUzMERGXHUzMEMzXHUzMEM4IFx1MjAxNCBcdTYyQzVcdTVGNTNcdTgwMDVcdTMwNENcdTcxMjFcdTc0MDZcdTMwNkFcdTMwNEZcdTc3NDBcdTU3MzBcdTMwOTJcdTg5OEJcdThGQkNcdTMwODFcdTMwOEJcdTkxRDFcdTk4NERcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIGF0dGFpbm1lbnRfcGN0OiB7XG4gICAgICAgIGxhYmVsOiAnXHU5MDU0XHU2MjEwXHU3Mzg3ICUnLFxuICAgICAgICBoZWxwOiAnXHUzMEFGXHUzMEVEXHUzMEZDXHUzMEJBIFx1MDBGNyBcdTMwQUZcdTMwQTlcdTMwRkNcdTMwQkYgXHUwMEQ3IDEwMFx1MzAwMlx1MzBBRlx1MzBBOVx1MzBGQ1x1MzBCRlx1MzA0Q1x1NkI2M1x1MzA2RVx1NTAyNFx1MzA2Qlx1MzA2QVx1MzA4Qlx1MzA3RVx1MzA2N1x1MzA2RiAwJSBcdTMwNjhcdTg4NjhcdTc5M0FcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTlcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIGNvdmVyYWdlX3JhdGlvOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEFCXHUzMEQwXHUzMEVDXHUzMEMzXHUzMEI4JyxcbiAgICAgICAgaGVscDogJ1x1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMyBcdTAwRjdcdUZGMDhcdTMwQUZcdTMwQTlcdTMwRkNcdTMwQkYgXHUyMjEyIFx1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1RkYwOVx1MjAxNCBcdTZCOEJcdTMwOEFcdTMwNkVcdTVERUVcdTUyMDZcdTMwOTJcdTU3Q0JcdTMwODFcdTMwOEJcdTMwRDFcdTMwQTRcdTMwRDdcdTMwRTlcdTMwQTRcdTMwRjNcdTMwNENcdTUzNDFcdTUyMDZcdTMwNEJcdTMwNjlcdTMwNDZcdTMwNEJcdTMwMDJcdTMwQUZcdTMwQTlcdTMwRkNcdTMwQkZcdTkwNTRcdTYyMTBcdTZFMDhcdTMwN0ZcdTMwNkVcdTU4MzRcdTU0MDhcdTMwNkYgMCBcdTMwNjhcdTg4NjhcdTc5M0FcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTlcdTMwMDInLFxuICAgICAgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnXHUzMEUxXHUzMEUyJyB9LFxuICAgICAgc2VlZF9rZXk6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwQjdcdTMwRkNcdTMwQzlcdTMwQURcdTMwRkMnLFxuICAgICAgICBoZWxwOiAnXHUzMEM3XHUzMEUyXHUzMEM3XHUzMEZDXHUzMEJGXHUzMDZFXHU4QjU4XHU1MjI1XHU1QjUwXHUzMDAyXHUzMEI3XHUzMEZDXHUzMEM5XHUzMEVEXHUzMEZDXHUzMEMwXHUzMEZDXHUzMDYwXHUzMDUxXHUzMDRDXHU2NkY4XHUzMDREXHU4RkJDXHUzMDdGXHUzMDAxXHU1QjlGXHU5NjlCXHUzMDZFXHUzMEI5XHUzMENBXHUzMEMzXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEMzXHUzMEM4XHUzMDY3XHUzMDZGXHU1RTM4XHUzMDZCXHU3QTdBXHUzMDY3XHUzMDU5XHUzMDAyJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9mb3JlY2FzdHM6IHsgbGFiZWw6ICdcdTMwNTlcdTMwNzlcdTMwNjZcdTMwNkVcdTMwRDVcdTMwQTlcdTMwRkNcdTMwQURcdTMwRTNcdTMwQjlcdTMwQzgnIH0sXG4gICAgICB0aGlzX3F1YXJ0ZXJfZm9yZWNhc3RzOiB7XG4gICAgICAgIGxhYmVsOiAnXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHUzMDZFXHUzMEI5XHUzMENBXHUzMEMzXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEMzXHUzMEM4XHUzMDZGXHUzMDdFXHUzMDYwXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzJyxcbiAgICAgICAgICBtZXNzYWdlOiAnXHU1NkRCXHU1MzRBXHU2NzFGXHUzMEI5XHUzMENBXHUzMEMzXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEMzXHUzMEM4XHUzMDZGXHU1OTFDXHU5NTkzXHUzMDZFXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEFEXHUzMEUzXHUzMEI5XHUzMEM4XHU5NkM2XHU4QTA4XHUzMDRDXHU2NkY4XHUzMDREXHU4RkJDXHUzMDdGXHUzMDdFXHUzMDU5XHUzMDAyXHU0RUNBXHU1NkRCXHU1MzRBXHU2NzFGXHU1MjA2XHUzMDRDXHU0RTAwXHU1RUE2XHU1QjlGXHU4ODRDXHUzMDU1XHUzMDhDXHUzMDhCXHUzMDdFXHUzMDY3XHUzMDUzXHUzMDZFXHUzMEQzXHUzMEU1XHUzMEZDXHUzMDZGXHU3QTdBXHUzMDY3XHUzMDU5XHUzMDAyXHU3OEJBXHU1QjlBXHU2RTA4XHUzMDdGXHUzMDZFXHU1NkRCXHU1MzRBXHU2NzFGXHUzMDZGXHUzMDBDXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDBEXHUzMEJGXHUzMEQ2XHUzMDZCXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5XHUzMDAyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBteV9mb3JlY2FzdDogeyBsYWJlbDogJ1x1ODFFQVx1NTIwNlx1MzA2RVx1MzBENVx1MzBBOVx1MzBGQ1x1MzBBRFx1MzBFM1x1MzBCOVx1MzBDOCcgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTMwQjlcdTMwQ0FcdTMwQzNcdTMwRDdcdTMwQjdcdTMwRTdcdTMwQzNcdTMwQzgnIH0sXG4gICAgICBhbW91bnRzOiB7IGxhYmVsOiAnXHU5MUQxXHU5ODREJyB9LFxuICAgICAgbWV0YTogeyBsYWJlbDogJ1x1MzBCRFx1MzBGQ1x1MzBCOScgfSxcbiAgICAgIC8vIGZvcmVjYXN0LnZpZXcudHMgXHUzMDZFXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEUwXHUzMEJCXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHU1NDBEICgjMTEwMClcbiAgICAgIHNuYXBzaG90OiB7IGxhYmVsOiAnXHUzMEI5XHUzMENBXHUzMEMzXHUzMEQ3XHUzMEI3XHUzMEU3XHUzMEMzXHUzMEM4JyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdcdTMwRTFcdTMwRTInIH0sXG4gICAgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5jb21tZXJjZS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlBcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQL29iamVjdHMuY29tbWVyY2UudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgT2JqZWN0VHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuLyoqXG4gKiBcdTY1RTVcdTY3MkNcdThBOUUgKGphLUpQKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIENPTU1FUkNFIGZhbWlseTpcbiAqIHdoYXQgZ2V0cyBzb2xkIGFuZCBvbiB3aGF0IHBhcGVyIFx1MjAxNCBxdW90ZXMsIGNvbnRyYWN0cywgcHJvZHVjdHMuXG4gKlxuICogUm9zdGVyOiBgY3JtX3F1b3RlYCwgYGNybV9xdW90ZV9saW5lX2l0ZW1gLCBgY3JtX2NvbnRyYWN0YCwgYGNybV9wcm9kdWN0YC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC50c2AuXG4gKi9cbmNvbnN0IHBheW1lbnRUZXJtc09wdGlvbnMgPSB7XG4gIG5ldF8xNTogJzE1IFx1NjVFNVx1NEVFNVx1NTE4NVx1NjI1NVx1MzA0NCcsIG5ldF8zMDogJzMwIFx1NjVFNVx1NEVFNVx1NTE4NVx1NjI1NVx1MzA0NCcsIG5ldF82MDogJzYwIFx1NjVFNVx1NEVFNVx1NTE4NVx1NjI1NVx1MzA0NCcsXG4gIG5ldF85MDogJzkwIFx1NjVFNVx1NEVFNVx1NTE4NVx1NjI1NVx1MzA0NCcsIGR1ZV9vbl9yZWNlaXB0OiAnXHU4QUNCXHU2QzQyXHU2NkY4XHU1M0Q3XHU5ODE4XHU2NjQyXHU2MjU1XHUzMDQ0Jyxcbn07XG5cbmV4cG9ydCBjb25zdCBjb21tZXJjZTogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX3F1b3RlOiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBkaXNjb3VudF93aXRoaW5fY2VpbGluZzoge1xuICAgICAgICBtZXNzYWdlOiAnXHU1MjcyXHU1RjE1XHU3Mzg3XHUzMDZGIDYwJSBcdTMwOTJcdThEODVcdTMwNDhcdTMwODlcdTMwOENcdTMwN0VcdTMwNUJcdTMwOTMnLFxuICAgICAgfSxcbiAgICAgIGV4cGlyYXRpb25fYWZ0ZXJfcXVvdGU6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1NjcwOVx1NTJCOVx1NjcxRlx1OTY1MFx1MzA2Rlx1ODk4Qlx1N0E0RFx1NjVFNVx1MzA4OFx1MzA4QVx1NUY4Q1x1MzA2N1x1MzA0Mlx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4QVx1MzA3RVx1MzA1OScsXG4gICAgICB9LFxuICAgICAgcXVvdGVfc3RhdHVzX3Byb2dyZXNzaW9uOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTcxMjFcdTUyQjlcdTMwNkFcdTg5OEJcdTdBNERcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjlcdTkwNzdcdTc5RkJcdTMwNjdcdTMwNTknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU4OThCXHU3QTREJyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1ODk4Qlx1N0E0RCcsXG4gICAgZGVzY3JpcHRpb246ICdcdTk4NjdcdTVCQTJcdTMwNkJcdTYzRDBcdTc5M0FcdTMwNTlcdTMwOEJcdTRGQTFcdTY4M0NcdTg5OEJcdTdBNEQnLFxuICAgIGZpZWxkczoge1xuICAgICAgcXVvdGVfbnVtYmVyOiB7IGxhYmVsOiAnXHU4OThCXHU3QTREXHU3NTZBXHU1M0Y3JyB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ1x1ODk4Qlx1N0E0RFx1NTQwRCcgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTg4NjhcdTc5M0FcdTU0MEQnIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OCcgfSxcbiAgICAgIGNybV9jb250YWN0OiB7XG4gICAgICAgIGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1JyxcbiAgICAgICAgaGVscDogJ1x1ODk4Qlx1N0E0RFx1MzA0Q1x1MzAwQ1x1NjNEMFx1NzkzQVx1NkUwOFx1MzA3Rlx1MzAwRFx1MzA3RVx1MzA1Rlx1MzA2Rlx1MzAwQ1x1NjI3Rlx1OEE4RFx1NkUwOFx1MzA3Rlx1MzAwRFx1MzA2Qlx1MzA2QVx1MzA2M1x1MzA1Rlx1NjY0Mlx1NzBCOVx1MzA2N1x1NUZDNVx1OTgwOFx1MzA2N1x1MzA1OVx1MzAwMlx1NEY1Q1x1NjIxMFx1MzA1NVx1MzA4Q1x1MzA4Qlx1NTk1MVx1N0QwNFx1MzA2RVx1NEUzQlx1NjJDNVx1NUY1M1x1ODAwNVx1MzA2Rlx1MzA1M1x1MzA1M1x1MzA0Qlx1MzA4OVx1NUYxNVx1MzA0RFx1N0Q5OVx1MzA0Q1x1MzA4Q1x1MzA3RVx1MzA1OVx1MzAwMicsXG4gICAgICB9LFxuICAgICAgY3JtX29wcG9ydHVuaXR5OiB7IGxhYmVsOiAnXHU1NTQ2XHU4QUM3JyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdTg5OEJcdTdBNERcdTYyQzVcdTVGNTNcdTgwMDUnIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZHJhZnQ6ICdcdTRFMEJcdTY2RjhcdTMwNEQnLCBpbl9yZXZpZXc6ICdcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkNcdTRFMkQnLCBwcmVzZW50ZWQ6ICdcdTYzRDBcdTc5M0FcdTZFMDhcdTMwN0YnLFxuICAgICAgICAgIGFjY2VwdGVkOiAnXHU2MjdGXHU4QThEXHU2RTA4XHUzMDdGJywgcmVqZWN0ZWQ6ICdcdTUzNzRcdTRFMEInLCBleHBpcmVkOiAnXHU2NzFGXHU5NjUwXHU1MjA3XHUzMDhDJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBxdW90ZV9kYXRlOiB7IGxhYmVsOiAnXHU4OThCXHU3QTREXHU2NUU1JyB9LFxuICAgICAgZXhwaXJhdGlvbl9kYXRlOiB7IGxhYmVsOiAnXHU2NzA5XHU1MkI5XHU2NzFGXHU5NjUwJyB9LFxuICAgICAgc3VidG90YWw6IHsgbGFiZWw6ICdcdTVDMEZcdThBMDgnIH0sXG4gICAgICBkaXNjb3VudDogeyBsYWJlbDogJ1x1NTI3Mlx1NUYxNVx1NzM4NyglKScgfSxcbiAgICAgIGRpc2NvdW50X2Ftb3VudDogeyBsYWJlbDogJ1x1NTI3Mlx1NUYxNVx1OTg0RCcgfSxcbiAgICAgIHRheDogeyBsYWJlbDogJ1x1N0EwRVx1OTg0RCcgfSxcbiAgICAgIHNoaXBwaW5nX2hhbmRsaW5nOiB7IGxhYmVsOiAnXHU5MTREXHU5MDAxXHUzMEZCXHU2MjRCXHU2NTcwXHU2NTk5JyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdcdTU0MDhcdThBMDhcdTkxRDFcdTk4NEQnIH0sXG4gICAgICBwYXltZW50X3Rlcm1zOiB7IGxhYmVsOiAnXHU2NTJGXHU2MjU1XHU2NzYxXHU0RUY2Jywgb3B0aW9uczogeyAuLi5wYXltZW50VGVybXNPcHRpb25zIH0gfSxcbiAgICAgIHNoaXBwaW5nX3Rlcm1zOiB7IGxhYmVsOiAnXHU5MTREXHU5MDAxXHU2NzYxXHU0RUY2JyB9LFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnXHU4QUNCXHU2QzQyXHU1MTQ4XHU0RjRGXHU2MjQwJyB9LFxuICAgICAgc2hpcHBpbmdfYWRkcmVzczogeyBsYWJlbDogJ1x1OTE0RFx1OTAwMVx1NTE0OFx1NEY0Rlx1NjI0MCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU4QUFDXHU2NjBFJyB9LFxuICAgICAgaW50ZXJuYWxfbm90ZXM6IHsgbGFiZWw6ICdcdTUxODVcdTkwRThcdTMwRTFcdTMwRTInIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9xdW90ZXM6IHsgbGFiZWw6ICdcdTUxNjhcdTg5OEJcdTdBNEQnIH0sXG4gICAgICBxdW90ZV9waXBlbGluZTogeyBsYWJlbDogJ1x1ODk4Qlx1N0E0RFx1MzBEMVx1MzBBNFx1MzBEN1x1MzBFOVx1MzBBNFx1MzBGMycgfSxcbiAgICAgIHF1b3RlX2NhbGVuZGFyOiB7IGxhYmVsOiAnXHU4OThCXHU3QTREXHUzMEFCXHUzMEVDXHUzMEYzXHUzMEMwXHUzMEZDJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1ODk4Qlx1N0E0RFx1NjBDNVx1NTgzMScgfSxcbiAgICAgIHByaWNpbmc6IHsgbGFiZWw6ICdcdTRGQTFcdTY4M0MnIH0sXG4gICAgICB0ZXJtczogeyBsYWJlbDogJ1x1Njc2MVx1NEVGNlx1MzBGQlx1NjcwOVx1NTJCOVx1NjcxRlx1OTY1MCcgfSxcbiAgICAgIGFkZHJlc3M6IHsgbGFiZWw6ICdcdTRGNEZcdTYyNDAnIH0sXG4gICAgICBzeXN0ZW06IHsgbGFiZWw6ICdcdTMwQjdcdTMwQjlcdTMwQzZcdTMwRTAnIH0sXG4gICAgICAvLyBxdW90ZS52aWV3LnRzIFx1MzA2RVx1MzBENVx1MzBBOVx1MzBGQ1x1MzBFMFx1MzBCQlx1MzBBRlx1MzBCN1x1MzBFN1x1MzBGM1x1NTQwRCAoIzExMDApXG4gICAgICBxdW90ZTogeyBsYWJlbDogJ1x1ODk4Qlx1N0E0RFx1NjZGOCcgfSxcbiAgICAgIHRvdGFsczogeyBsYWJlbDogJ1x1NTQwOFx1OEEwOCcgfSxcbiAgICAgIHF1b3RlX3Rlcm1zOiB7IGxhYmVsOiAnXHU1OTUxXHU3RDA0XHU2NzYxXHU0RUY2JyB9LFxuICAgICAgYWRkcmVzc2VzX2FuZF9ub3RlczogeyBsYWJlbDogJ1x1NEY0Rlx1NjI0MFx1MzA2OFx1NTA5OVx1ODAwMycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fcXVvdGVfbGluZV9pdGVtOiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBkaXNjb3VudF93aXRoaW5fY2VpbGluZzoge1xuICAgICAgICBtZXNzYWdlOiAnXHU2NjBFXHU3RDMwXHUzMDZFXHU1MjcyXHU1RjE1XHU3Mzg3XHUzMDZGIDYwJSBcdTMwOTJcdThEODVcdTMwNDhcdTMwODlcdTMwOENcdTMwN0VcdTMwNUJcdTMwOTMnLFxuICAgICAgfSxcbiAgICAgIHVuaXRfcHJpY2VfcG9zaXRpdmU6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1OENBOVx1NThGMlx1NEZBMVx1NjgzQ1x1MzA5Mlx1OENBMFx1MzA2RVx1NTAyNFx1MzA2Qlx1MzA1OVx1MzA4Qlx1MzA1M1x1MzA2OFx1MzA2Rlx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1Qlx1MzA5MycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdcdTg5OEJcdTdBNERcdTY2MEVcdTdEMzAnLFxuICAgIHBsdXJhbExhYmVsOiAnXHU4OThCXHU3QTREXHU2NjBFXHU3RDMwJyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1ODk4Qlx1N0E0RFx1OTE0RFx1NEUwQlx1MzA2RVx1ODhGRFx1NTRDMVx1NTIyNVx1NEZBMVx1NjgzQ1x1NjYwRVx1N0QzMFx1ODg0QycsXG4gICAgZmllbGRzOiB7XG4gICAgICBjcm1fcXVvdGU6IHsgbGFiZWw6ICdcdTg5OEJcdTdBNEQnIH0sXG4gICAgICBjcm1fcHJvZHVjdDogeyBsYWJlbDogJ1x1ODhGRFx1NTRDMScgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU4QUFDXHU2NjBFJyB9LFxuICAgICAgcXVhbnRpdHk6IHsgbGFiZWw6ICdcdTY1NzBcdTkxQ0YnIH0sXG4gICAgICBsaXN0X3ByaWNlOiB7IGxhYmVsOiAnXHU1QjlBXHU0RkExJyB9LFxuICAgICAgdW5pdF9wcmljZTogeyBsYWJlbDogJ1x1OENBOVx1NThGMlx1NEZBMVx1NjgzQycgfSxcbiAgICAgIGRpc2NvdW50OiB7IGxhYmVsOiAnXHU1MjcyXHU1RjE1XHU3Mzg3XHVGRjA4JVx1RkYwOScgfSxcbiAgICAgIHN1YnRvdGFsOiB7IGxhYmVsOiAnXHU1QzBGXHU4QTA4JyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdcdTU0MDhcdThBMDgnIH0sXG4gICAgICBsaW5lX251bWJlcjogeyBsYWJlbDogJ1x1ODg0Q1x1NzU2QVx1NTNGNycgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTY2MEVcdTdEMzBcdTg4NEMnIH0sXG4gICAgICBwcmljaW5nOiB7IGxhYmVsOiAnXHU0RkExXHU2ODNDJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9jb250cmFjdDoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgZW5kX2FmdGVyX3N0YXJ0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTdENDJcdTRFODZcdTY1RTVcdTMwNkZcdTk1OEJcdTU5Q0JcdTY1RTVcdTMwODhcdTMwOEFcdTVGOENcdTMwNjdcdTMwNDJcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTknLFxuICAgICAgfSxcbiAgICAgIGNvbnRyYWN0X3N0YXR1c19wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnXHU3MTIxXHU1MkI5XHUzMDZBXHU1OTUxXHU3RDA0XHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHU5MDc3XHU3OUZCXHUzMDY3XHUzMDU5JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1NTk1MVx1N0QwNCcsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTU5NTFcdTdEMDQnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU5ODY3XHU1QkEyXHUzMDY4XHU3REUwXHU3RDUwXHUzMDU3XHUzMDVGXHU2Q0Q1XHU3Njg0XHUzMDZBXHU1OTUxXHU3RDA0XHUzMEZCXHU1NDA4XHU2MTBGJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNvbnRyYWN0X251bWJlcjogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1NzU2QVx1NTNGNycgfSxcbiAgICAgIGNybV9hY2NvdW50OiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4JyB9LFxuICAgICAgY3JtX2NvbnRhY3Q6IHsgbGFiZWw6ICdcdTRFM0JcdTYyQzVcdTVGNTNcdTgwMDUnIH0sXG4gICAgICBjcm1fb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTU1NDZcdThBQzcnIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkcmFmdDogJ1x1NEUwQlx1NjZGOFx1MzA0RCcsIGluX2FwcHJvdmFsOiAnXHU2MjdGXHU4QThEXHU0RTJEJywgYWN0aXZhdGVkOiAnXHU2NzA5XHU1MkI5JyxcbiAgICAgICAgICBleHBpcmVkOiAnXHU2NzFGXHU5NjUwXHU1MjA3XHUzMDhDJywgdGVybWluYXRlZDogJ1x1ODlFM1x1N0QwNCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29udHJhY3RfdGVybV9tb250aHM6IHsgbGFiZWw6ICdcdTU5NTFcdTdEMDRcdTY3MUZcdTk1OTNcdUZGMDhcdTY3MDhcdUZGMDknIH0sXG4gICAgICBzdGFydF9kYXRlOiB7IGxhYmVsOiAnXHU5NThCXHU1OUNCXHU2NUU1JyB9LFxuICAgICAgZW5kX2RhdGU6IHsgbGFiZWw6ICdcdTdENDJcdTRFODZcdTY1RTUnIH0sXG4gICAgICBjb250cmFjdF92YWx1ZTogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1OTFEMVx1OTg0RCcgfSxcbiAgICAgIGJpbGxpbmdfZnJlcXVlbmN5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU4QUNCXHU2QzQyXHU5ODNCXHU1RUE2JyxcbiAgICAgICAgb3B0aW9uczogeyBtb250aGx5OiAnXHU2NzA4XHU2QjIxJywgcXVhcnRlcmx5OiAnXHU1NkRCXHU1MzRBXHU2NzFGJywgYW5udWFsbHk6ICdcdTVFNzRcdTZCMjEnLCBvbmVfdGltZTogJ1x1NEUwMFx1NjJFQycgfSxcbiAgICAgIH0sXG4gICAgICBwYXltZW50X3Rlcm1zOiB7IGxhYmVsOiAnXHU2NTJGXHU2MjU1XHU2NzYxXHU0RUY2Jywgb3B0aW9uczogeyAuLi5wYXltZW50VGVybXNPcHRpb25zIH0gfSxcbiAgICAgIGF1dG9fcmVuZXdhbDogeyBsYWJlbDogJ1x1ODFFQVx1NTJENVx1NjZGNFx1NjVCMCcgfSxcbiAgICAgIHJlbmV3YWxfbm90aWNlX2RheXM6IHsgbGFiZWw6ICdcdTY2RjRcdTY1QjBcdTkwMUFcdTc3RTVcdUZGMDhcdTY1RTVcdUZGMDknIH0sXG4gICAgICBjb250cmFjdF90eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1OTUxXHU3RDA0XHU3QTJFXHU1MjI1JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbjogJ1x1MzBCNVx1MzBENlx1MzBCOVx1MzBBRlx1MzBFQVx1MzBEN1x1MzBCN1x1MzBFN1x1MzBGM1x1NTk1MVx1N0QwNCcsIHNlcnZpY2U6ICdcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjlcdTU5NTFcdTdEMDQnLFxuICAgICAgICAgIGxpY2Vuc2U6ICdcdTMwRTlcdTMwQTRcdTMwQkJcdTMwRjNcdTMwQjlcdTU5NTFcdTdEMDQnLCBwYXJ0bmVyc2hpcDogJ1x1MzBEMVx1MzBGQ1x1MzBDOFx1MzBDQVx1MzBGQ1x1MzBCN1x1MzBDM1x1MzBEN1x1NTk1MVx1N0QwNCcsXG4gICAgICAgICAgbmRhOiAnXHU3OUQ4XHU1QkM2XHU0RkREXHU2MzAxXHU1OTUxXHU3RDA0IChOREEpJywgbXNhOiAnXHU1N0ZBXHU2NzJDXHU1OTUxXHU3RDA0IChNU0EpJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzaWduZWRfZGF0ZTogeyBsYWJlbDogJ1x1N0Y3Mlx1NTQwRFx1NjVFNScgfSxcbiAgICAgIHNpZ25lZF9ieTogeyBsYWJlbDogJ1x1N0Y3Mlx1NTQwRFx1ODAwNScgfSxcbiAgICAgIGRvY3VtZW50X3VybDogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1NjZGOFx1OTg1RScgfSxcbiAgICAgIHNwZWNpYWxfdGVybXM6IHsgbGFiZWw6ICdcdTcyNzlcdTdEMDRcdTRFOEJcdTk4MDUnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ1x1OEFBQ1x1NjYwRScgfSxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBsYWJlbDogJ1x1OEFDQlx1NkM0Mlx1NTE0OFx1NEY0Rlx1NjI0MCcgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2NvbnRyYWN0czogeyBsYWJlbDogJ1x1NTE2OFx1NTk1MVx1N0QwNCcgfSxcbiAgICAgIHJlbmV3YWxfY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTY2RjRcdTY1QjBcdTMwQUJcdTMwRUNcdTMwRjNcdTMwQzBcdTMwRkMnIH0sXG4gICAgICBjb250cmFjdF9nYW50dDogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1NjcxRlx1OTU5MycgfSxcbiAgICAgIGNvbnRyYWN0X3RpbWVsaW5lOiB7IGxhYmVsOiAnXHU1OTUxXHU3RDA0XHUzMEJGXHUzMEE0XHUzMEUwXHUzMEU5XHUzMEE0XHUzMEYzJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1NjBDNVx1NTgzMScgfSxcbiAgICAgIHBhcnRpZXM6IHsgbGFiZWw6ICdcdTU5NTFcdTdEMDRcdTVGNTNcdTRFOEJcdTgwMDUnIH0sXG4gICAgICB0ZXJtczogeyBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1Njc2MVx1NEVGNlx1MzBGQlx1NjcxRlx1OTU5MycgfSxcbiAgICAgIHZhbHVlOiB7IGxhYmVsOiAnXHU1OTUxXHU3RDA0XHU5MUQxXHU5ODREJyB9LFxuICAgICAgc3RhdHVzOiB7IGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5XHUzMEZCXHU2MjdGXHU4QThEJyB9LFxuICAgICAgcmVuZXdhbDogeyBsYWJlbDogJ1x1NjZGNFx1NjVCMCcgfSxcbiAgICAgIC8vIGNvbnRyYWN0LnZpZXcudHMgXHUzMDZFXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEUwXHUzMEJCXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHU1NDBEICgjMTEwMClcbiAgICAgIGNvbnRyYWN0X3Rlcm1zOiB7IGxhYmVsOiAnXHU1OTUxXHU3RDA0XHU2NzYxXHU0RUY2JyB9LFxuICAgICAgc2lnbmluZ19hbmRfZG9jdW1lbnRzOiB7IGxhYmVsOiAnXHU3RjcyXHU1NDBEXHUzMDY4XHU2NkY4XHU5ODVFJyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdcdTUwOTlcdTgwMDMnIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX3Byb2R1Y3Q6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGNvc3RfbGVzc190aGFuX3ByaWNlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTUzOUZcdTRGQTFcdTMwNkZcdTVCOUFcdTRGQTFcdTMwODhcdTMwOEFcdTRGNEVcdTMwNEZcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDQnLFxuICAgICAgfSxcbiAgICAgIHByaWNlX3Bvc2l0aXZlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTVCOUFcdTRGQTFcdTMwNkZcdTZCNjNcdTMwNkVcdTUwMjRcdTMwNjdcdTMwNDJcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHU4OEZEXHU1NEMxJyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1ODhGRFx1NTRDMScsXG4gICAgZGVzY3JpcHRpb246ICdcdTgxRUFcdTc5M0VcdTMwNENcdTYzRDBcdTRGOUJcdTMwNTlcdTMwOEJcdTg4RkRcdTU0QzFcdTMwRkJcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjknLFxuICAgIGZpZWxkczoge1xuICAgICAgcHJvZHVjdF9jb2RlOiB7IGxhYmVsOiAnXHU4OEZEXHU1NEMxXHUzMEIzXHUzMEZDXHUzMEM5JyB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ1x1ODhGRFx1NTRDMVx1NTQwRCcgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdcdTg4NjhcdTc5M0FcdTU0MEQnIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ1x1OEFBQ1x1NjYwRScgfSxcbiAgICAgIGNhdGVnb3J5OiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEFCXHUzMEM2XHUzMEI0XHUzMEVBJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHNvZnR3YXJlOiAnXHUzMEJEXHUzMEQ1XHUzMEM4XHUzMEE2XHUzMEE3XHUzMEEyJywgaGFyZHdhcmU6ICdcdTMwQ0ZcdTMwRkNcdTMwQzlcdTMwQTZcdTMwQTdcdTMwQTInLCBzZXJ2aWNlOiAnXHUzMEI1XHUzMEZDXHUzMEQzXHUzMEI5JyxcbiAgICAgICAgICBzdWJzY3JpcHRpb246ICdcdTMwQjVcdTMwRDZcdTMwQjlcdTMwQUZcdTMwRUFcdTMwRDdcdTMwQjdcdTMwRTdcdTMwRjMnLCBzdXBwb3J0OiAnXHUzMEI1XHUzMEREXHUzMEZDXHUzMEM4JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmYW1pbHk6IHtcbiAgICAgICAgbGFiZWw6ICdcdTg4RkRcdTU0QzFcdTMwRDVcdTMwQTFcdTMwREZcdTMwRUEnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZW50ZXJwcmlzZTogJ1x1MzBBOFx1MzBGM1x1MzBCRlx1MzBGQ1x1MzBEN1x1MzBFOVx1MzBBNFx1MzBCQVx1NTQxMVx1MzA1MVx1MzBCRFx1MzBFQVx1MzBFNVx1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGMycsIHNtYjogJ1x1NEUyRFx1NUMwRlx1NEYwMVx1Njk2RFx1NTQxMVx1MzA1MVx1MzBCRFx1MzBFQVx1MzBFNVx1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGMycsXG4gICAgICAgICAgc2VydmljZXM6ICdcdTMwRDdcdTMwRURcdTMwRDVcdTMwQTdcdTMwQzNcdTMwQjdcdTMwRTdcdTMwQ0FcdTMwRUJcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjknLCBjbG91ZDogJ1x1MzBBRlx1MzBFOVx1MzBBNlx1MzBDOVx1MzBCNVx1MzBGQ1x1MzBEM1x1MzBCOScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbGlzdF9wcmljZTogeyBsYWJlbDogJ1x1NUI5QVx1NEZBMScgfSxcbiAgICAgIGNvc3Q6IHsgbGFiZWw6ICdcdTMwQjNcdTMwQjlcdTMwQzgnIH0sXG4gICAgICBza3U6IHsgbGFiZWw6ICdTS1UnIH0sXG4gICAgICBpc19hY3RpdmU6IHsgbGFiZWw6ICdcdTY3MDlcdTUyQjknIH0sXG4gICAgICBwcm9kdWN0X21hbmFnZXI6IHsgbGFiZWw6ICdcdTMwRDdcdTMwRURcdTMwQzBcdTMwQUZcdTMwQzhcdTMwREVcdTMwQ0RcdTMwRkNcdTMwQjhcdTMwRTNcdTMwRkMnIH0sXG4gICAgICBpbWFnZTogeyBsYWJlbDogJ1x1ODhGRFx1NTRDMVx1NzUzQlx1NTBDRicgfSxcbiAgICAgIGRhdGFzaGVldDogeyBsYWJlbDogJ1x1MzBDN1x1MzBGQ1x1MzBCRlx1MzBCN1x1MzBGQ1x1MzBDOCcgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX3Byb2R1Y3RzOiB7IGxhYmVsOiAnXHU1MTY4XHU4OEZEXHU1NEMxJyB9LFxuICAgICAgcHJvZHVjdF9jYXRhbG9nOiB7IGxhYmVsOiAnXHU4OEZEXHU1NEMxXHUzMEFCXHUzMEJGXHUzMEVEXHUzMEIwJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1ODhGRFx1NTRDMVx1NjBDNVx1NTgzMScgfSxcbiAgICAgIHByaWNpbmc6IHsgbGFiZWw6ICdcdTRGQTFcdTY4M0MnIH0sXG4gICAgICBtZXRhZGF0YTogeyBsYWJlbDogJ1x1OTVBMlx1OTAyM1x1OENDN1x1NjU5OScgfSxcbiAgICAgIC8vIHByb2R1Y3Qudmlldy50cyBcdTMwNkVcdTMwRDVcdTMwQTlcdTMwRkNcdTMwRTBcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTU0MEQgKCMxMTAwKVxuICAgICAgcHJvZHVjdF9pbmZvOiB7IGxhYmVsOiAnXHU4OEZEXHU1NEMxXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgcHJpY2luZ19pbmZvOiB7IGxhYmVsOiAnXHU0RkExXHU2ODNDJyB9LFxuICAgICAgbWVkaWE6IHsgbGFiZWw6ICdcdTMwRTFcdTMwQzdcdTMwQTNcdTMwQTInIH0sXG4gICAgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5zZXJ2aWNlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUFwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5zZXJ2aWNlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IGFjdGl2aXR5QWN0aW9ucyB9IGZyb20gJy4vX3NoYXJlZCc7XG5cbi8qKlxuICogXHU2NUU1XHU2NzJDXHU4QTlFIChqYS1KUCkgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBTRVJWSUNFIGZhbWlseTpcbiAqIHBvc3Qtc2FsZSBzdXBwb3J0IFx1MjAxNCBjYXNlcyBhbmQgdGhlIGtub3dsZWRnZSB0aGF0IGRlZmxlY3RzIHRoZW0uXG4gKlxuICogUm9zdGVyOiBgY3JtX2Nhc2VgLCBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCwgYGNybV9hcnRpY2xlX2ZlZWRiYWNrYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXJ2aWNlOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fY2FzZToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgcmVzb2x1dGlvbl9yZXF1aXJlZF9mb3JfY2xvc2VkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTMwOTJcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTMwNTlcdTMwOEJcdTMwNkJcdTMwNkZcdTg5RTNcdTZDN0FcdTUxODVcdTVCQjlcdTMwNENcdTVGQzVcdTg5ODFcdTMwNjdcdTMwNTknLFxuICAgICAgfSxcbiAgICAgIGVzY2FsYXRpb25fcmVhc29uX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTMwOTJcdTMwQThcdTMwQjlcdTMwQUJcdTMwRUNcdTMwRkNcdTMwQjdcdTMwRTdcdTMwRjNcdTMwNTlcdTMwOEJcdTMwNkJcdTMwNkZcdTc0MDZcdTc1MzFcdTMwNENcdTVGQzVcdTg5ODFcdTMwNjdcdTMwNTknLFxuICAgICAgfSxcbiAgICAgIGNhc2Vfc3RhdHVzX3Byb2dyZXNzaW9uOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTcxMjFcdTUyQjlcdTMwNkFcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjlcdTkwNzdcdTc5RkJcdTMwNjdcdTMwNTknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5JyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1MzBCMVx1MzBGQ1x1MzBCOScsXG4gICAgZGVzY3JpcHRpb246ICdcdTMwQUJcdTMwQjlcdTMwQkZcdTMwREVcdTMwRkNcdTMwQjVcdTMwRERcdTMwRkNcdTMwQzhcdTMwNkVcdTMwQjFcdTMwRkNcdTMwQjlcdTMwNjhcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjlcdTRGOURcdTk4M0MnLFxuICAgIGZpZWxkczoge1xuICAgICAgY2FzZV9udW1iZXI6IHsgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTc1NkFcdTUzRjcnIH0sXG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU0RUY2XHU1NDBEJyB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ1x1ODg2OFx1NzkzQVx1NTQwRCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU4QUFDXHU2NjBFJyB9LFxuICAgICAgY3JtX2FjY291bnQ6IHsgbGFiZWw6ICdcdTUzRDZcdTVGMTVcdTUxNDgnIH0sXG4gICAgICBjcm1fY29udGFjdDogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNScgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBuZXc6ICdcdTY1QjBcdTg5OEYnLCBpbl9wcm9ncmVzczogJ1x1NUJGRVx1NUZEQ1x1NEUyRCcsXG4gICAgICAgICAgd2FpdGluZ19jdXN0b21lcjogJ1x1OTg2N1x1NUJBMlx1MzA2RVx1NTZERVx1N0I1NFx1NUY4NVx1MzA2MScsIHdhaXRpbmdfc3VwcG9ydDogJ1x1MzBCNVx1MzBERFx1MzBGQ1x1MzBDOFx1MzA2RVx1NTZERVx1N0I1NFx1NUY4NVx1MzA2MScsXG4gICAgICAgICAgZXNjYWxhdGVkOiAnXHUzMEE4XHUzMEI5XHUzMEFCXHUzMEVDXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzXHU2RTA4JywgcmVzb2x2ZWQ6ICdcdTg5RTNcdTZDN0FcdTZFMDgnLCBjbG9zZWQ6ICdcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTZFMDgnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHByaW9yaXR5OiB7XG4gICAgICAgIGxhYmVsOiAnXHU1MTJBXHU1MTQ4XHU1RUE2JyxcbiAgICAgICAgb3B0aW9uczogeyBsb3c6ICdcdTRGNEUnLCBtZWRpdW06ICdcdTRFMkQnLCBoaWdoOiAnXHU5QUQ4JywgY3JpdGljYWw6ICdcdTkxQ0RcdTU5MjcnIH0sXG4gICAgICB9LFxuICAgICAgcHJpb3JpdHlfcmFuazogeyBsYWJlbDogJ1x1NTEyQVx1NTE0OFx1NUVBNlx1MzBFOVx1MzBGM1x1MzBBRicgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTdBMkVcdTUyMjUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcXVlc3Rpb246ICdcdTU1NEZcdTMwNDRcdTU0MDhcdTMwOEZcdTMwNUInLCBwcm9ibGVtOiAnXHU0RTBEXHU1MTc3XHU1NDA4JyxcbiAgICAgICAgICBmZWF0dXJlX3JlcXVlc3Q6ICdcdTZBNUZcdTgwRkRcdTg5ODFcdTY3MUInLCBidWc6ICdcdTMwRDBcdTMwQjAnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG9yaWdpbjoge1xuICAgICAgICBsYWJlbDogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1NzY3QVx1NzUxRlx1NTE0MycsXG4gICAgICAgIG9wdGlvbnM6IHsgZW1haWw6ICdcdTMwRTFcdTMwRkNcdTMwRUInLCBwaG9uZTogJ1x1OTZGQlx1OEE3MScsIHdlYjogJ1x1MzBBNlx1MzBBN1x1MzBENicsIGNoYXQ6ICdcdTMwQzFcdTMwRTNcdTMwQzNcdTMwQzgnLCBzb2NpYWxfbWVkaWE6ICdcdTMwQkRcdTMwRkNcdTMwQjdcdTMwRTNcdTMwRUJcdTMwRTFcdTMwQzdcdTMwQTNcdTMwQTInIH0sXG4gICAgICB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTYyQzVcdTVGNTNcdTgwMDUnIH0sXG4gICAgICBjbG9zZWRfZGF0ZTogeyBsYWJlbDogJ1x1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1NjVFNScgfSxcbiAgICAgIGZpcnN0X3Jlc3BvbnNlX2RhdGU6IHsgbGFiZWw6ICdcdTUyMURcdTU2REVcdTVGRENcdTdCNTRcdTY1RTUnIH0sXG4gICAgICByZXNvbHV0aW9uX3RpbWVfaG91cnM6IHsgbGFiZWw6ICdcdTg5RTNcdTZDN0FcdTY2NDJcdTk1OTNcdUZGMDhcdTY2NDJcdTk1OTNcdUZGMDknIH0sXG4gICAgICBzbGFfZHVlX2RhdGU6IHsgbGFiZWw6ICdTTEFcdTY3MUZcdTk2NTAnLCBoZWxwOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDZFXHU1MTJBXHU1MTQ4XHU1RUE2XHUzMDY4XHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDZFXHU5ODY3XHU1QkEyXHUzMEU5XHUzMEYzXHUzMEFGXHUzMDRCXHUzMDg5XHU4QTJEXHU1QjlBXHUzMDU1XHUzMDhDXHUzMDAxXHU2NkE2XHU2NjQyXHU5NTkzXHUzMDY3XHU2NTcwXHUzMDQ4XHUzMDdFXHUzMDU5XHUzMDAyXHU1OTFDXHU5NTkzXHUzMEZCXHU5MDMxXHU2NzJCXHUzMEZCXHU3OTVEXHU2NUU1XHUzMDgyXHUzMDU5XHUzMDc5XHUzMDY2XHU1NDJCXHUzMDdFXHUzMDhDXHUzMDdFXHUzMDU5XHUzMDAyJyB9LFxuICAgICAgaXNfc2xhX3Zpb2xhdGVkOiB7IGxhYmVsOiAnU0xBXHU5MDU1XHU1M0NEJyB9LFxuICAgICAgaXNfZXNjYWxhdGVkOiB7IGxhYmVsOiAnXHUzMEE4XHUzMEI5XHUzMEFCXHUzMEVDXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzXHU2RTA4JyB9LFxuICAgICAgZXNjYWxhdGVkX2RhdGU6IHsgbGFiZWw6ICdcdTMwQThcdTMwQjlcdTMwQUJcdTMwRUNcdTMwRkNcdTMwQjdcdTMwRTdcdTMwRjNcdTY1RTUnIH0sXG4gICAgICBlc2NhbGF0aW9uX3JlYXNvbjogeyBsYWJlbDogJ1x1MzBBOFx1MzBCOVx1MzBBQlx1MzBFQ1x1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGM1x1NzQwNlx1NzUzMScgfSxcbiAgICAgIHJlc29sdXRpb246IHsgbGFiZWw6ICdcdTg5RTNcdTZDN0FcdTUxODVcdTVCQjknIH0sXG4gICAgICByZXNvbHZlZF9ieV9hcnRpY2xlOiB7IGxhYmVsOiAnXHU4OUUzXHU2QzdBXHUzMDU3XHUzMDVGXHUzMENBXHUzMEVDXHUzMEMzXHUzMEI4XHU4QTE4XHU0RThCJywgaGVscDogJ1x1MzA1M1x1MzA2RVx1MzBCMVx1MzBGQ1x1MzBCOVx1MzA5Mlx1ODlFM1x1NkM3QVx1MzA1N1x1MzA1Rlx1MzBDQVx1MzBFQ1x1MzBDM1x1MzBCOFx1OEExOFx1NEU4QiBcdTIwMTQgXHU5MDM4XHUzMDg5XHUzMDU3XHU3Mzg3XHUzMDZFXHU2MzA3XHU2QTE5XHUzMDAyJyB9LFxuICAgICAgaW50ZXJuYWxfbm90ZXM6IHsgbGFiZWw6ICdcdTUxODVcdTkwRThcdTMwRTFcdTMwRTInLCBoZWxwOiAnXHU5ODY3XHU1QkEyXHUzMDZCXHUzMDZGXHU4ODY4XHU3OTNBXHUzMDU1XHUzMDhDXHUzMDZBXHUzMDQ0XHU3OTNFXHU1MTg1XHU1NDExXHUzMDUxXHUzMEUxXHUzMEUyJyB9LFxuICAgICAgaXNfY2xvc2VkOiB7IGxhYmVsOiAnXHUzMEFGXHUzMEVEXHUzMEZDXHUzMEJBXHU2RTA4JyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfY2FzZXM6IHsgbGFiZWw6ICdcdTUxNjhcdTMwQjFcdTMwRkNcdTMwQjknIH0sXG4gICAgICBjYXNlX3dvcmtmbG93OiB7IGxhYmVsOiAnXHUzMEI1XHUzMEZDXHUzMEQzXHUzMEI5XHUzMEQ1XHUzMEVEXHUzMEZDJyB9LFxuICAgICAgc2xhX2NhbGVuZGFyOiB7IGxhYmVsOiAnU0xBIFx1MzBBQlx1MzBFQ1x1MzBGM1x1MzBDMFx1MzBGQycgfSxcbiAgICAgIGNhc2VfdGltZWxpbmU6IHsgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTMwQkZcdTMwQTRcdTMwRTBcdTMwRTlcdTMwQTRcdTMwRjMnIH0sXG4gICAgICB1bmFzc2lnbmVkX3RyaWFnZToge1xuICAgICAgICBsYWJlbDogJ1x1NjcyQVx1NTI3Mlx1MzA4QVx1NUY1M1x1MzA2NiBcdTIwMTQgXHUzMEM4XHUzMEVBXHUzMEEyXHUzMEZDXHUzMEI4JyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnXHUzMEM4XHUzMEVBXHUzMEEyXHUzMEZDXHUzMEI4XHU1Rjg1XHUzMDYxXHUzMDZGXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzJyxcbiAgICAgICAgICBtZXNzYWdlOiAnXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZFXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDZCXHU2MjQwXHU2NzA5XHU4MDA1XHUzMDRDXHUzMDQ0XHUzMDdFXHUzMDU5XHUzMDAyXHU2MjQwXHU2NzA5XHU4MDA1XHUzMDZFXHUzMDZBXHUzMDQ0XHUzMEIxXHUzMEZDXHUzMEI5XHUzMDZGXHUzMDUzXHUzMDUzXHUzMDZCXHU4ODY4XHU3OTNBXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU5IFx1MjAxNCBcdTkwMUFcdTVFMzhcdTMwNkZcdTMwMDFcdTMwQjVcdTMwRkNcdTMwRDNcdTMwQjlcdTMwQThcdTMwRkNcdTMwQjhcdTMwQTdcdTMwRjNcdTMwQzhcdTMwNkVcdTgwNzdcdTRGNERcdTMwOTJcdThBQjBcdTMwODJcdTRGRERcdTYzMDFcdTMwNTdcdTMwNjZcdTMwNDRcdTMwNkFcdTMwNDRcdTk1OTNcdTMwNkJcdTVDNEFcdTMwNDRcdTMwNUYgV2ViLXRvLUNhc2UgXHUzMDZFXHU5MDAxXHU0RkUxXHUzMDY3XHUzMDU5XHUzMDAyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlc2NhbGF0ZWRfY2FzZXM6IHsgbGFiZWw6ICdcdTMwQThcdTMwQjlcdTMwQUJcdTMwRUNcdTMwRkNcdTMwQzhcdTMwNTdcdTMwNUZcdTMwQjFcdTMwRkNcdTMwQjknIH0sXG4gICAgICBteV9vcGVuX2Nhc2VzOiB7IGxhYmVsOiAnXHU3OUMxXHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHUzMEIxXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgc2xhX2F0X3Jpc2s6IHsgbGFiZWw6ICdcdTIzRjAgU0xBIFx1MzBFQVx1MzBCOVx1MzBBRlx1MzA0Mlx1MzA4QScgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgLy8gY2FzZS52aWV3LnRzIFx1MzA2RVx1MzBENVx1MzBBOVx1MzBGQ1x1MzBFMFx1MzBCQlx1MzBBRlx1MzBCN1x1MzBFN1x1MzBGM1x1NTQwRCAoIzExMDApXHUzMDAyXG4gICAgICBjYXNlOiB7IGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgaG93X2Nhbl93ZV9oZWxwOiB7IGxhYmVsOiAnXHUzMDY5XHUzMDZFXHUzMDg4XHUzMDQ2XHUzMDZBXHUzMDU0XHU3NTI4XHU0RUY2XHUzMDY3XHUzMDU3XHUzMDg3XHUzMDQ2XHUzMDRCXHVGRjFGJyB9LFxuICAgICAgLy8gXHUzMEFBXHUzMEQ2XHUzMEI4XHUzMEE3XHUzMEFGXHUzMEM4XHU1QjlBXHU3RkE5XHUzMDZFXHUzMEJCXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHUzMEFEXHUzMEZDXHVGRjA4Y2FzZS5vYmplY3QudHNcdUZGMDlcdTIwMTQgXHU1MTY1XHU1MjlCXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEUwXHUzMDY4XHUzMDAxXG4gICAgICAvLyBcdTMwNTNcdTMwOENcdTMwODlcdTMwNkVcdTMwQjBcdTMwRUJcdTMwRkNcdTMwRDdcdTMwOTJcdTUzQzJcdTcxNjdcdTMwNTlcdTMwOEJcdThBNzNcdTdEMzBcdTMwREFcdTMwRkNcdTMwQjhcdTMwNkVcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdUZGMDgjOTcwXHVGRjA5XHUzMDY3XHU0RjdGXHU3NTI4XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1NjBDNVx1NTgzMScgfSxcbiAgICAgIG9yaWdpbjogeyBsYWJlbDogJ1x1NzY3QVx1NzUxRlx1NTE0M1x1MzBGQlx1NjMyRlx1MzA4QVx1NTIwNlx1MzA1MScgfSxcbiAgICAgIHNsYTogeyBsYWJlbDogJ1NMQVx1MzBGQlx1NTEyQVx1NTE0OFx1NUVBNicgfSxcbiAgICAgIHJlc29sdXRpb246IHsgbGFiZWw6ICdcdTg5RTNcdTZDN0EnIH0sXG4gICAgICBlc2NhbGF0aW9uOiB7IGxhYmVsOiAnXHUzMEE4XHUzMEI5XHUzMEFCXHUzMEVDXHUzMEZDXHUzMEI3XHUzMEU3XHUzMEYzJyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnXHUzMEI3XHUzMEI5XHUzMEM2XHUzMEUwJyB9LFxuICAgIH0sXG4gICAgX2FjdGlvbnM6IHtcbiAgICAgIC4uLmFjdGl2aXR5QWN0aW9ucyxcbiAgICAgIGVzY2FsYXRlX2Nhc2U6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwQjFcdTMwRkNcdTMwQjlcdTMwOTJcdTMwQThcdTMwQjlcdTMwQUJcdTMwRUNcdTMwRkNcdTMwQzgnLFxuICAgICAgICBjb25maXJtVGV4dDogJ1x1MzA1M1x1MzA2RVx1MzBCMVx1MzBGQ1x1MzBCOVx1MzA5Mlx1MzBBOFx1MzBCOVx1MzBBQlx1MzBFQ1x1MzBGQ1x1MzBCN1x1MzBFN1x1MzBGM1x1MzBDMVx1MzBGQ1x1MzBFMFx1MzA3OFx1NUYxNVx1MzA0RFx1N0Q5OVx1MzA0RVx1MzA3RVx1MzA1OVx1MzAwMlx1N0Q5QVx1ODg0Q1x1MzA1N1x1MzA3RVx1MzA1OVx1MzA0Qlx1RkYxRicsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDkyXHUzMEE4XHUzMEI5XHUzMEFCXHUzMEVDXHUzMEZDXHUzMEM4XHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHVGRjAxJyxcbiAgICAgIH0sXG4gICAgICBjbG9zZV9jYXNlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDkyXHUzMEFGXHUzMEVEXHUzMEZDXHUzMEJBJyxcbiAgICAgICAgY29uZmlybVRleHQ6ICdcdTMwNTNcdTMwNkVcdTMwQjFcdTMwRkNcdTMwQjlcdTMwOTJcdTMwQUZcdTMwRURcdTMwRkNcdTMwQkFcdTMwNTdcdTMwNjZcdTMwODJcdTMwODhcdTMwOERcdTMwNTdcdTMwNDRcdTMwNjdcdTMwNTlcdTMwNEJcdUZGMUYnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA5Mlx1MzBBRlx1MzBFRFx1MzBGQ1x1MzBCQVx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1RkYwMScsXG4gICAgICB9LFxuICAgICAgY2xhaW1fY2FzZToge1xuICAgICAgICBsYWJlbDogJ1x1MzBCMVx1MzBGQ1x1MzBCOVx1MzA5Mlx1NUYxNVx1MzA0RFx1NTNEN1x1MzA1MVx1MzA4QicsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUzMEIxXHUzMEZDXHUzMEI5XHUzMDkyXHU1RjE1XHUzMDREXHU1M0Q3XHUzMDUxXHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyXHU2MkM1XHU1RjUzXHU4MDA1XHUzMDZGXHUzMDQyXHUzMDZBXHUzMDVGXHUzMDY3XHUzMDU5XHUzMDAyJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX2tub3dsZWRnZV9hcnRpY2xlOiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBwdWJsaXNoZWRfcmVxdWlyZXNfYm9keToge1xuICAgICAgICBtZXNzYWdlOiAnXHU2NzJDXHU2NTg3XHUzMDZFXHUzMDZBXHUzMDQ0XHU4QTE4XHU0RThCXHUzMDZGXHU1MTZDXHU5NThCXHUzMDY3XHUzMDREXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDAyJyxcbiAgICAgIH0sXG4gICAgICBwdWJsaXNoZWRfcmVxdWlyZXNfc3VtbWFyeToge1xuICAgICAgICBtZXNzYWdlOiAnXHU1MTZDXHU5NThCXHU2RTA4XHUzMDdGXHUzMDZFXHU4QTE4XHU0RThCXHUzMDZCXHUzMDZGXHUzMDAxXHU2OTFDXHU3RDIyXHU3RDUwXHU2NzlDXHUzMDY4IEFJIFx1MzA2RVx1NUYxNVx1NzUyOFx1MzA2RVx1MzA1Rlx1MzA4MVx1MzA2Qlx1Njk4Mlx1ODk4MVx1MzA5Mlx1OEExOFx1OEYwOVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdcdTMwQ0FcdTMwRUNcdTMwQzNcdTMwQjhcdThBMThcdTRFOEInLFxuICAgIHBsdXJhbExhYmVsOiAnXHUzMENBXHUzMEVDXHUzMEMzXHUzMEI4XHUzMEQ5XHUzMEZDXHUzMEI5JyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1OTg2N1x1NUJBMlx1MzA2OFx1MzBBOFx1MzBGQ1x1MzBCOFx1MzBBN1x1MzBGM1x1MzBDOFx1MzA0Q1x1NTE4RFx1NTIyOVx1NzUyOFx1MzA2N1x1MzA0RFx1MzA4Qlx1NTZERVx1N0I1NFx1MzA2OFx1MzBDRlx1MzBBNlx1MzBDNFx1MzBGQ1x1MzBBQ1x1MzBBNFx1MzBDOScsXG4gICAgZmllbGRzOiB7XG4gICAgICBhcnRpY2xlX251bWJlcjogeyBsYWJlbDogJ1x1OEExOFx1NEU4Qlx1NzU2QVx1NTNGNycgfSxcbiAgICAgIHRpdGxlOiB7IGxhYmVsOiAnXHUzMEJGXHUzMEE0XHUzMEM4XHUzMEVCJyB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ1x1ODg2OFx1NzkzQVx1NTQwRCcgfSxcbiAgICAgIHN1bW1hcnk6IHsgbGFiZWw6ICdcdTg5ODFcdTdEMDQnLCBoZWxwOiAnXHU2OTFDXHU3RDIyXHU3RDUwXHU2NzlDXHUzMDg0IEFJIFx1MzA2RVx1NUYxNVx1NzUyOFx1MzA2Qlx1ODg2OFx1NzkzQVx1MzA1NVx1MzA4Q1x1MzA4QiAxIFx1NkJCNVx1ODQzRFx1MzA2RVx1ODk4MVx1N0QwNFx1MzAwMicgfSxcbiAgICAgIGJvZHk6IHsgbGFiZWw6ICdcdTY3MkNcdTY1ODcnLCBoZWxwOiAnXHU4QTE4XHU0RThCXHUzMDZFXHU2NzJDXHU2NTg3XHVGRjA4TWFya2Rvd25cdUZGMDlcdTMwMDInIH0sXG4gICAgICBjYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ1x1MzBBQlx1MzBDNlx1MzBCNFx1MzBFQScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQ6ICdcdTMwNkZcdTMwNThcdTMwODFcdTMwNkInLCBob3dfdG86ICdcdTMwQ0ZcdTMwQTZcdTMwQzRcdTMwRkMnLFxuICAgICAgICAgIHRyb3VibGVzaG9vdGluZzogJ1x1MzBDOFx1MzBFOVx1MzBENlx1MzBFQlx1MzBCN1x1MzBFNVx1MzBGQ1x1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMCcsIGJpbGxpbmc6ICdcdThBQ0JcdTZDNDJcdTMwNjhcdTY1OTlcdTkxRDEnLCBhcGk6ICdBUEkgXHUzMDY4XHU5MDIzXHU2NDNBJyxcbiAgICAgICAgICByZWxlYXNlX25vdGVzOiAnXHUzMEVBXHUzMEVBXHUzMEZDXHUzMEI5XHUzMENFXHUzMEZDXHUzMEM4JywgcG9saWN5OiAnXHUzMEREXHUzMEVBXHUzMEI3XHUzMEZDJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0YWdzOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEJGXHUzMEIwJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGF1dGg6ICdcdThBOERcdThBM0MnLCBzc286ICdTU08nLCBtb2JpbGU6ICdcdTMwRTJcdTMwRDBcdTMwQTRcdTMwRUInLCBlbWFpbDogJ1x1MzBFMVx1MzBGQ1x1MzBFQicsXG4gICAgICAgICAgcmVwb3J0czogJ1x1MzBFQ1x1MzBERFx1MzBGQ1x1MzBDOCcsIHBlcmZvcm1hbmNlOiAnXHUzMEQxXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMERFXHUzMEYzXHUzMEI5JyxcbiAgICAgICAgICBkYXRhX2ltcG9ydDogJ1x1MzBDN1x1MzBGQ1x1MzBCRlx1MzBBNFx1MzBGM1x1MzBERFx1MzBGQ1x1MzBDOCcsIHdlYmhvb2tzOiAnV2ViaG9vaycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5JyxcbiAgICAgICAgb3B0aW9uczogeyBkcmFmdDogJ1x1NEUwQlx1NjZGOFx1MzA0RCcsIGluX3JldmlldzogJ1x1MzBFQ1x1MzBEM1x1MzBFNVx1MzBGQ1x1NEUyRCcsIHB1Ymxpc2hlZDogJ1x1NTE2Q1x1OTU4Qlx1NkUwOFx1MzA3RicsIGFyY2hpdmVkOiAnXHUzMEEyXHUzMEZDXHUzMEFCXHUzMEE0XHUzMEQ2JyB9LFxuICAgICAgfSxcbiAgICAgIGF1ZGllbmNlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU1QkZFXHU4QzYxJyxcbiAgICAgICAgaGVscDogJ1x1NTE2Q1x1OTU4Qlx1OEExOFx1NEU4Qlx1MzA2Rlx1MzBBQlx1MzBCOVx1MzBCRlx1MzBERVx1MzBGQ1x1MzBERFx1MzBGQ1x1MzBCRlx1MzBFQlx1MzA2Qlx1ODg2OFx1NzkzQVx1MzA1NVx1MzA4Q1x1MzAwMVx1NzkzRVx1NTE4NVx1OEExOFx1NEU4Qlx1MzA2Rlx1MzBBOFx1MzBGQ1x1MzBCOFx1MzBBN1x1MzBGM1x1MzBDOFx1MzA2RVx1MzA3Rlx1MzA0Q1x1OTVCMlx1ODlBN1x1MzA2N1x1MzA0RFx1MzA3RVx1MzA1OVx1MzAwMicsXG4gICAgICAgIG9wdGlvbnM6IHsgcHVibGljOiAnXHU1MTZDXHU5NThCJywgaW50ZXJuYWw6ICdcdTc5M0VcdTUxODUnIH0sXG4gICAgICB9LFxuICAgICAgbGFuZ3VhZ2U6IHtcbiAgICAgICAgbGFiZWw6ICdcdThBMDBcdThBOUUnLFxuICAgICAgICBvcHRpb25zOiB7IGVuOiAnXHU4MkYxXHU4QTlFJywgemhfY246ICdcdTdDMjFcdTRGNTNcdTVCNTdcdTRFMkRcdTU2RkRcdThBOUUnLCBlc19lczogJ1x1MzBCOVx1MzBEQVx1MzBBNFx1MzBGM1x1OEE5RScsIGphX2pwOiAnXHU2NUU1XHU2NzJDXHU4QTlFJyB9LFxuICAgICAgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnXHU2MjQwXHU2NzA5XHU4MDA1JyB9LFxuICAgICAgcmVsYXRlZF90b19jYXNlOiB7IGxhYmVsOiAnXHU1MTQzXHUzMDZFXHUzMEIxXHUzMEZDXHUzMEI5JywgaGVscDogJ1x1MzA1M1x1MzA2RVx1OEExOFx1NEU4Qlx1MzA2RVx1NTE0M1x1MzA2Qlx1MzA2QVx1MzA2M1x1MzA1Rlx1MzBCMVx1MzBGQ1x1MzBCOVx1RkYwOFx1NEVGQlx1NjEwRlx1RkYwOVx1MzAwMicgfSxcbiAgICAgIHB1Ymxpc2hlZF9hdDogeyBsYWJlbDogJ1x1NTE2Q1x1OTU4Qlx1NjVFNVx1NjY0MicgfSxcbiAgICAgIGxhc3RfcmV2aWV3ZWRfYXQ6IHsgbGFiZWw6ICdcdTY3MDBcdTdENDJcdTMwRUNcdTMwRDNcdTMwRTVcdTMwRkMnIH0sXG4gICAgICBoZWxwZnVsX2NvdW50OiB7IGxhYmVsOiAnXHU1Rjc5XHUzMDZCXHU3QUNCXHUzMDYzXHUzMDVGJywgaGVscDogJ2NybV9hcnRpY2xlX2ZlZWRiYWNrIFx1MzA0Qlx1MzA4OVx1NTE4RFx1OTZDNlx1OEEwOFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1OVx1MzAwMlx1NjI0Qlx1NTE2NVx1NTI5Qlx1MzA2Rlx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMicgfSxcbiAgICAgIG5vdF9oZWxwZnVsX2NvdW50OiB7IGxhYmVsOiAnXHU1Rjc5XHUzMDZCXHU3QUNCXHUzMDVGXHUzMDZBXHUzMDRCXHUzMDYzXHUzMDVGJywgaGVscDogJ2NybV9hcnRpY2xlX2ZlZWRiYWNrIFx1MzA0Qlx1MzA4OVx1NTE4RFx1OTZDNlx1OEEwOFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1OVx1MzAwMlx1NjI0Qlx1NTE2NVx1NTI5Qlx1MzA2Rlx1MzA2N1x1MzA0RFx1MzA3RVx1MzA1Qlx1MzA5M1x1MzAwMicgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2FydGljbGVzOiB7IGxhYmVsOiAnXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZFXHU4QTE4XHU0RThCJyB9LFxuICAgICAgcHVibGlzaGVkX2FydGljbGVzOiB7IGxhYmVsOiAnXHU1MTZDXHU5NThCXHU2RTA4XHUzMDdGJyB9LFxuICAgICAgbXlfZHJhZnRzOiB7IGxhYmVsOiAnXHU4MUVBXHU1MjA2XHUzMDZFXHU0RTBCXHU2NkY4XHUzMDREJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ1x1OEExOFx1NEU4Qlx1NjBDNVx1NTgzMScgfSxcbiAgICAgIGNvbnRlbnQ6IHsgbGFiZWw6ICdcdTMwQjNcdTMwRjNcdTMwQzZcdTMwRjNcdTMwQzQnIH0sXG4gICAgICB0YXhvbm9teTogeyBsYWJlbDogJ1x1NTIwNlx1OTg1RScgfSxcbiAgICAgIG1ldHJpY3M6IHsgbGFiZWw6ICdcdTUyMjlcdTc1MjhcdTcyQjZcdTZDQzEnIH0sXG4gICAgICBlbmdhZ2VtZW50OiB7IGxhYmVsOiAnXHU1MjI5XHU3NTI4XHU3MkI2XHU2Q0MxJyB9LFxuICAgICAgLy8ga25vd2xlZGdlX2FydGljbGUudmlldy50cyBcdTMwNkVcdTMwRDVcdTMwQTlcdTMwRkNcdTMwRTBcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTU0MEQgKCMxMTAwKVxuICAgICAgYXJ0aWNsZTogeyBsYWJlbDogJ1x1OEExOFx1NEU4QicgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7XG4gICAgICBtYXJrX2FydGljbGVfaGVscGZ1bDoge1xuICAgICAgICBsYWJlbDogJ1x1NUY3OVx1MzA2Qlx1N0FDQlx1MzA2M1x1MzA1RicsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUzMDBDXHU1Rjc5XHUzMDZCXHU3QUNCXHUzMDYzXHUzMDVGXHUzMDBEXHUzMDY4XHUzMDU3XHUzMDY2XHU4QTE4XHU5MzMyXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyXHUzMDQyXHUzMDhBXHUzMDRDXHUzMDY4XHUzMDQ2XHUzMDU0XHUzMDU2XHUzMDQ0XHUzMDdFXHUzMDU5XHUzMDAyJyxcbiAgICAgIH0sXG4gICAgICBtYXJrX2FydGljbGVfbm90X2hlbHBmdWw6IHtcbiAgICAgICAgbGFiZWw6ICdcdTVGNzlcdTMwNkJcdTdBQ0JcdTMwNUZcdTMwNkFcdTMwNEJcdTMwNjNcdTMwNUYnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1MzAwQ1x1NUY3OVx1MzA2Qlx1N0FDQlx1MzA1Rlx1MzA2QVx1MzA0Qlx1MzA2M1x1MzA1Rlx1MzAwRFx1MzA2OFx1MzA1N1x1MzA2Nlx1OEExOFx1OTMzMlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMlx1MzA0Mlx1MzA4QVx1MzA0Q1x1MzA2OFx1MzA0Nlx1MzA1NFx1MzA1Nlx1MzA0NFx1MzA3RVx1MzA1OVx1MzAwMicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9hcnRpY2xlX2ZlZWRiYWNrOiB7XG4gICAgbGFiZWw6ICdcdThBMThcdTRFOEJcdTMwRDVcdTMwQTNcdTMwRkNcdTMwQzlcdTMwRDBcdTMwQzNcdTMwQUYnLFxuICAgIHBsdXJhbExhYmVsOiAnXHU4QTE4XHU0RThCXHUzMEQ1XHUzMEEzXHUzMEZDXHUzMEM5XHUzMEQwXHUzMEMzXHUzMEFGJyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1MzBDQVx1MzBFQ1x1MzBDM1x1MzBCOFx1OEExOFx1NEU4Qlx1MzA2Qlx1NUJGRVx1MzA1OVx1MzA4Qlx1OEFBRFx1ODAwNVx1MzA2RVx1MzAwQ1x1NUY3OVx1MzA2Qlx1N0FDQlx1MzA2M1x1MzA1RiAvIFx1NUY3OVx1MzA2Qlx1N0FDQlx1MzA1Rlx1MzA2QVx1MzA0Qlx1MzA2M1x1MzA1Rlx1MzAwRFx1OEE1NVx1NEZBMScsXG4gICAgZmllbGRzOiB7XG4gICAgICBmZWVkYmFja19udW1iZXI6IHsgbGFiZWw6ICdcdTMwRDVcdTMwQTNcdTMwRkNcdTMwQzlcdTMwRDBcdTMwQzNcdTMwQUZcdTc1NkFcdTUzRjcnIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1OEFBRFx1ODAwNScgfSxcbiAgICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogeyBsYWJlbDogJ1x1OEExOFx1NEU4QicsIGhlbHA6ICdcdTMwNTNcdTMwNkVcdTMwRDVcdTMwQTNcdTMwRkNcdTMwQzlcdTMwRDBcdTMwQzNcdTMwQUZcdTMwNkVcdTVCRkVcdThDNjFcdTMwNjhcdTMwNkFcdTMwOEJcdTMwQ0FcdTMwRUNcdTMwQzNcdTMwQjhcdThBMThcdTRFOEJcdTMwMDInIH0sXG4gICAgICB2ZXJkaWN0OiB7XG4gICAgICAgIGxhYmVsOiAnXHU4QTU1XHU0RkExJyxcbiAgICAgICAgb3B0aW9uczogeyBoZWxwZnVsOiAnXHU1Rjc5XHUzMDZCXHU3QUNCXHUzMDYzXHUzMDVGJywgbm90X2hlbHBmdWw6ICdcdTVGNzlcdTMwNkJcdTdBQ0JcdTMwNUZcdTMwNkFcdTMwNEJcdTMwNjNcdTMwNUYnIH0sXG4gICAgICB9LFxuICAgICAgY29tbWVudDogeyBsYWJlbDogJ1x1MzBCM1x1MzBFMVx1MzBGM1x1MzBDOCcsIGhlbHA6ICdcdThBNTVcdTRGQTFcdTMwNkVcdTc0MDZcdTc1MzFcdUZGMDhcdTRFRkJcdTYxMEZcdUZGMDkgXHUyMDE0IFx1OEExOFx1NEU4Qlx1MzA2RVx1NEY1Q1x1NjIxMFx1ODAwNVx1MzA0Q1x1OEFBRFx1MzA3Rlx1MzA3RVx1MzA1OVx1MzAwMicgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTMwRDVcdTMwQTNcdTMwRkNcdTMwQzlcdTMwRDBcdTMwQzNcdTMwQUYnIH0sXG4gICAgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAvb2JqZWN0cy5hY3Rpdml0eS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlBcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQL29iamVjdHMuYWN0aXZpdHkudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgT2JqZWN0VHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuLyoqXG4gKiBcdTY1RTVcdTY3MkNcdThBOUUgKGphLUpQKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIEFDVElWSVRZIGZhbWlseTpcbiAqIHRoZSBpbnRlcmFjdGlvbiBsb2cgXHUyMDE0IHRhc2tzLCBldmVudHMsIGFuZCB3aG8gYXR0ZW5kZWQuXG4gKlxuICogUm9zdGVyOiBgY3JtX3Rhc2tgLCBgY3JtX2V2ZW50YCwgYGNybV9ldmVudF9hdHRlbmRlZWAuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAudHNgLlxuICovXG5jb25zdCByZWxhdGVkVG9UeXBlT3B0aW9ucyA9IHtcbiAgY3JtX2FjY291bnQ6ICdcdTUzRDZcdTVGMTVcdTUxNDgnLCBjcm1fY29udGFjdDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNScsIGNybV9vcHBvcnR1bml0eTogJ1x1NTU0Nlx1OEFDNycsXG4gIGNybV9sZWFkOiAnXHUzMEVBXHUzMEZDXHUzMEM5JywgY3JtX2Nhc2U6ICdcdTMwQjFcdTMwRkNcdTMwQjknLFxufTtcblxuZXhwb3J0IGNvbnN0IGFjdGl2aXR5OiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fdGFzazoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgY29tcGxldGVkX2RhdGVfcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOVx1MzA0Q1x1MzAwQ1x1NUI4Q1x1NEU4Nlx1MzAwRFx1MzA2RVx1NTgzNFx1NTQwOFx1MzA2Rlx1NUI4Q1x1NEU4Nlx1NjVFNVx1MzA0Q1x1NUZDNVx1ODk4MVx1MzA2N1x1MzA1OScsXG4gICAgICB9LFxuICAgICAgcmVjdXJyZW5jZV9maWVsZHNfcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1N0U3MFx1MzA4QVx1OEZENFx1MzA1N1x1MzBCRlx1MzBCOVx1MzBBRlx1MzA2Qlx1MzA2Rlx1N0U3MFx1MzA4QVx1OEZENFx1MzA1N1x1N0EyRVx1NTIyNVx1MzA0Q1x1NUZDNVx1ODk4MVx1MzA2N1x1MzA1OScsXG4gICAgICB9LFxuICAgICAgcmVsYXRlZF90b19yZXF1aXJlZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU5NUEyXHU5MDIzXHUzMEVDXHUzMEIzXHUzMEZDXHUzMEM5XHUzMDkyXHU1QzExXHUzMDZBXHUzMDRGXHUzMDY4XHUzMDgyIDEgXHU0RUY2XHU5MDc4XHU2MjlFXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1MzBCRlx1MzBCOVx1MzBBRicsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTMwQkZcdTMwQjlcdTMwQUYnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHU2RDNCXHU1MkQ1XHUzMDY4IFRvRG8nLFxuICAgIGZpZWxkczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1x1NEVGNlx1NTQwRCcgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnXHU4QUFDXHU2NjBFJyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEI5XHUzMEM2XHUzMEZDXHUzMEJGXHUzMEI5JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5vdF9zdGFydGVkOiAnXHU2NzJBXHU3NzQwXHU2MjRCJywgaW5fcHJvZ3Jlc3M6ICdcdTkwMzJcdTg4NENcdTRFMkQnLCB3YWl0aW5nOiAnXHU1Rjg1XHU2QTVGXHU0RTJEJyxcbiAgICAgICAgICBjb21wbGV0ZWQ6ICdcdTVCOENcdTRFODYnLCBkZWZlcnJlZDogJ1x1NEZERFx1NzU1OScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcHJpb3JpdHk6IHtcbiAgICAgICAgbGFiZWw6ICdcdTUxMkFcdTUxNDhcdTVFQTYnLFxuICAgICAgICBvcHRpb25zOiB7IGxvdzogJ1x1NEY0RScsIG5vcm1hbDogJ1x1OTAxQVx1NUUzOCcsIGhpZ2g6ICdcdTlBRDgnLCB1cmdlbnQ6ICdcdTdEQ0FcdTYwMjUnIH0sXG4gICAgICB9LFxuICAgICAgcHJpb3JpdHlfcmFuazogeyBsYWJlbDogJ1x1NTEyQVx1NTE0OFx1NUVBNlx1MzBFOVx1MzBGM1x1MzBBRicgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwQkZcdTMwQjlcdTMwQUZcdTdBMkVcdTUyMjUnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY2FsbDogJ1x1OTZGQlx1OEE3MScsIGVtYWlsOiAnXHUzMEUxXHUzMEZDXHUzMEVCJywgbWVldGluZzogJ1x1NEYxQVx1OEI3MCcsXG4gICAgICAgICAgZm9sbG93X3VwOiAnXHUzMEQ1XHUzMEE5XHUzMEVEXHUzMEZDXHUzMEEyXHUzMEMzXHUzMEQ3JywgZGVtbzogJ1x1MzBDN1x1MzBFMicsIG90aGVyOiAnXHUzMDVEXHUzMDZFXHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBkdWVfZGF0ZTogeyBsYWJlbDogJ1x1NjcxRlx1OTY1MCcgfSxcbiAgICAgIHJlbWluZGVyX2RhdGU6IHsgbGFiZWw6ICdcdTMwRUFcdTMwREVcdTMwQTRcdTMwRjNcdTMwQzBcdTMwRkNcdTY1RTVcdTY2NDInIH0sXG4gICAgICByZW1pbmRlcl9zZW50OiB7IGxhYmVsOiAnXHUzMEVBXHUzMERFXHUzMEE0XHUzMEYzXHUzMEMwXHUzMEZDXHU5MDAxXHU0RkUxXHU2RTA4XHUzMDdGJyB9LFxuICAgICAgY29tcGxldGVkX2RhdGU6IHsgbGFiZWw6ICdcdTVCOENcdTRFODZcdTY1RTUnIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fdHlwZToge1xuICAgICAgICBsYWJlbDogJ1x1OTVBMlx1OTAyM1x1MzBBQVx1MzBENlx1MzBCOFx1MzBBN1x1MzBBRlx1MzBDOFx1N0EyRVx1NTIyNScsXG4gICAgICAgIG9wdGlvbnM6IHsgLi4ucmVsYXRlZFRvVHlwZU9wdGlvbnMgfSxcbiAgICAgIH0sXG4gICAgICByZWxhdGVkX3RvX2FjY291bnQ6IHsgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTUzRDZcdTVGMTVcdTUxNDgnIH0sXG4gICAgICByZWxhdGVkX3RvX2NvbnRhY3Q6IHsgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDUnIH0sXG4gICAgICByZWxhdGVkX3RvX29wcG9ydHVuaXR5OiB7IGxhYmVsOiAnXHU5NUEyXHU5MDIzXHU1NTQ2XHU4QUM3JyB9LFxuICAgICAgcmVsYXRlZF90b19sZWFkOiB7IGxhYmVsOiAnXHU5NUEyXHU5MDIzXHUzMEVBXHUzMEZDXHUzMEM5JyB9LFxuICAgICAgcmVsYXRlZF90b19jYXNlOiB7IGxhYmVsOiAnXHU5NUEyXHU5MDIzXHUzMEIxXHUzMEZDXHUzMEI5JyB9LFxuICAgICAgaXNfcmVjdXJyaW5nOiB7IGxhYmVsOiAnXHU3RTcwXHUzMDhBXHU4RkQ0XHUzMDU3XHUzMEJGXHUzMEI5XHUzMEFGJyB9LFxuICAgICAgcmVjdXJyZW5jZV90eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHU3RTcwXHUzMDhBXHU4RkQ0XHUzMDU3XHU3QTJFXHU1MjI1JyxcbiAgICAgICAgb3B0aW9uczogeyBkYWlseTogJ1x1NkJDRVx1NjVFNScsIHdlZWtseTogJ1x1NkJDRVx1OTAzMScsIG1vbnRobHk6ICdcdTZCQ0VcdTY3MDgnLCB5ZWFybHk6ICdcdTZCQ0VcdTVFNzQnIH0sXG4gICAgICB9LFxuICAgICAgcmVjdXJyZW5jZV9pbnRlcnZhbDogeyBsYWJlbDogJ1x1N0U3MFx1MzA4QVx1OEZENFx1MzA1N1x1OTU5M1x1OTY5NCcgfSxcbiAgICAgIHJlY3VycmVuY2VfZW5kX2RhdGU6IHsgbGFiZWw6ICdcdTdFNzBcdTMwOEFcdThGRDRcdTMwNTdcdTdENDJcdTRFODZcdTY1RTUnIH0sXG4gICAgICBpc19jb21wbGV0ZWQ6IHsgbGFiZWw6ICdcdTVCOENcdTRFODZcdTZFMDgnIH0sXG4gICAgICBpc19vdmVyZHVlOiB7IGxhYmVsOiAnXHU2NzFGXHU5NjUwXHU4RDg1XHU5MDRFJyB9LFxuICAgICAgcHJvZ3Jlc3NfcGVyY2VudDogeyBsYWJlbDogJ1x1OTAzMlx1NjM1N1x1RkYwOCVcdUZGMDknIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF90YXNrczogeyBsYWJlbDogJ1x1NTE2OFx1MzBCRlx1MzBCOVx1MzBBRicgfSxcbiAgICAgIHRhc2tfYm9hcmQ6IHsgbGFiZWw6ICdcdTMwQkZcdTMwQjlcdTMwQUZcdTMwRENcdTMwRkNcdTMwQzknIH0sXG4gICAgICB0YXNrX2NhbGVuZGFyOiB7IGxhYmVsOiAnXHUzMEJGXHUzMEI5XHUzMEFGXHUzMEFCXHUzMEVDXHUzMEYzXHUzMEMwXHUzMEZDJyB9LFxuICAgICAgdGFza19nYW50dDogeyBsYWJlbDogJ1x1NUI5Rlx1ODg0Q1x1OEEwOFx1NzUzQicgfSxcbiAgICAgIHRhc2tfdGltZWxpbmU6IHsgbGFiZWw6ICdcdTVERTVcdTY1NzBcdTMwQkZcdTMwQTRcdTMwRTBcdTMwRTlcdTMwQTRcdTMwRjMnIH0sXG4gICAgICBteV9vcGVuX3Rhc2tzOiB7IGxhYmVsOiAnXHU3OUMxXHUzMDZFXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHUzMEJGXHUzMEI5XHUzMEFGJyB9LFxuICAgICAgdG9kYXlzX3Rhc2tzOiB7IGxhYmVsOiAnXHVEODNEXHVEQ0M1IFx1NzlDMVx1MzA2RVx1NTEyQVx1NTE0OFx1MzBCRlx1MzBCOVx1MzBBRicgfSxcbiAgICAgIG92ZXJkdWVfdGFza3M6IHsgbGFiZWw6ICdcdTIzRjAgXHUzMEFBXHUzMEZDXHUzMEQ3XHUzMEYzXHUzMEJGXHUzMEI5XHUzMEFGIFx1MDBCNyBcdTY3MUZcdTk2NTBcdThEODVcdTkwNEVcdTMwNENcdTk1NzdcdTMwNDRcdTk4MDYnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnXHUzMEJGXHUzMEI5XHUzMEFGXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgc2NoZWR1bGluZzogeyBsYWJlbDogJ1x1MzBCOVx1MzBCMVx1MzBCOFx1MzBFNVx1MzBGQ1x1MzBFQicgfSxcbiAgICAgIHJlbGF0ZWQ6IHsgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzknIH0sXG4gICAgICByZWN1cnJlbmNlOiB7IGxhYmVsOiAnXHU3RTcwXHUzMDhBXHU4RkQ0XHUzMDU3JyB9LFxuICAgICAgZWZmb3J0OiB7IGxhYmVsOiAnXHU5MDMyXHU2MzU3XHUzMEZCXHU1REU1XHU2NTcwJyB9LFxuICAgICAgc3lzdGVtOiB7IGxhYmVsOiAnXHUzMEI3XHUzMEI5XHUzMEM2XHUzMEUwJyB9LFxuICAgICAgLy8gdGFzay52aWV3LnRzIFx1MzA2RVx1MzBENVx1MzBBOVx1MzBGQ1x1MzBFMFx1MzBCQlx1MzBBRlx1MzBCN1x1MzBFN1x1MzBGM1x1NTQwRCAoIzExMDApXG4gICAgICB0YXNrOiB7IGxhYmVsOiAnXHUzMEJGXHUzMEI5XHUzMEFGJyB9LFxuICAgICAgcmVsYXRlZF9yZWNvcmRzOiB7IGxhYmVsOiAnXHU5NUEyXHU5MDIzXHUzMEVDXHUzMEIzXHUzMEZDXHUzMEM5JyB9LFxuICAgICAgcmVjdXJyZW5jZV9hbmRfZWZmb3J0OiB7IGxhYmVsOiAnXHU3RTcwXHUzMDhBXHU4RkQ0XHUzMDU3XHUzMDY4XHU1REU1XHU2NTcwJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9ldmVudDoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgZW5kX2FmdGVyX3N0YXJ0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTdENDJcdTRFODZcdTY2NDJcdTUyM0JcdTMwNkZcdTk1OEJcdTU5Q0JcdTY2NDJcdTUyM0JcdTMwODhcdTMwOEFcdTVGOENcdTMwNjdcdTMwNDJcdTMwOEJcdTVGQzVcdTg5ODFcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTknLFxuICAgICAgfSxcbiAgICAgIHJlbGF0ZWRfdG9fcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ1x1OTVBMlx1OTAyM1x1MzBFQ1x1MzBCM1x1MzBGQ1x1MzBDOVx1MzA5Mlx1NUMxMVx1MzA2QVx1MzA0Rlx1MzA2OFx1MzA4MiAxIFx1NEVGNlx1OTA3OFx1NjI5RVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdcdTMwQTRcdTMwRDlcdTMwRjNcdTMwQzgnLFxuICAgIHBsdXJhbExhYmVsOiAnXHUzMEE0XHUzMEQ5XHUzMEYzXHUzMEM4JyxcbiAgICBkZXNjcmlwdGlvbjogJ1x1OTg2N1x1NUJBMlx1MzA2OFx1MzA2RVx1NEYxQVx1OEI3MFx1MzBGQlx1OTZGQlx1OEE3MVx1MzA2QVx1MzA2OVx1MzA2RVx1NEU4OFx1NUI5QVx1MzA1NVx1MzA4Q1x1MzA1Rlx1NUJGRVx1OEE3MScsXG4gICAgZmllbGRzOiB7XG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnXHU0RUY2XHU1NDBEJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdThBQUNcdTY2MEUnIH0sXG4gICAgICB0eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEE0XHUzMEQ5XHUzMEYzXHUzMEM4XHU3QTJFXHU1MjI1JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG1lZXRpbmc6ICdcdTRGMUFcdThCNzAnLCBjYWxsOiAnXHU5NkZCXHU4QTcxJywgZGVtbzogJ1x1MzBDN1x1MzBFMicsXG4gICAgICAgICAgd2ViaW5hcjogJ1x1MzBBNlx1MzBBN1x1MzBEM1x1MzBDQVx1MzBGQycsIG9uc2l0ZV92aXNpdDogJ1x1OEEyQVx1NTU0RicsIG90aGVyOiAnXHUzMDVEXHUzMDZFXHU0RUQ2JyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcGxhbm5lZDogJ1x1NEU4OFx1NUI5QScsIGhlbGQ6ICdcdTVCOUZcdTY1QkRcdTZFMDhcdTMwN0YnLCBjYW5jZWxsZWQ6ICdcdTMwQURcdTMwRTNcdTMwRjNcdTMwQkJcdTMwRUInLCBub19zaG93OiAnXHU3MTIxXHU2NUFEXHU2QjIwXHU1RTJEJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIHN0YXJ0X2RhdGV0aW1lOiB7IGxhYmVsOiAnXHU5NThCXHU1OUNCJyB9LFxuICAgICAgZW5kX2RhdGV0aW1lOiB7IGxhYmVsOiAnXHU3RDQyXHU0RTg2JyB9LFxuICAgICAgYWxsX2RheTogeyBsYWJlbDogJ1x1N0Q0Mlx1NjVFNVx1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOCcgfSxcbiAgICAgIGR1cmF0aW9uX21pbnV0ZXM6IHsgbGFiZWw6ICdcdTYyNDBcdTg5ODFcdTY2NDJcdTk1OTNcdUZGMDhcdTUyMDZcdUZGMDknIH0sXG4gICAgICBsb2NhdGlvbjogeyBsYWJlbDogJ1x1NTgzNFx1NjI0MCcsIGhlbHA6ICdcdTRGMUFcdThCNzBcdTVCQTRcdTMwRkJcdTRGNEZcdTYyNDBcdTMwRkJcdTRGMUFcdThCNzBcdTMwRUFcdTMwRjNcdTMwQUYnIH0sXG4gICAgICByZWxhdGVkX3RvX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzlcdTdBMkVcdTUyMjUnLFxuICAgICAgICBvcHRpb25zOiB7IC4uLnJlbGF0ZWRUb1R5cGVPcHRpb25zIH0sXG4gICAgICB9LFxuICAgICAgcmVsYXRlZF90b19hY2NvdW50OiB7IGxhYmVsOiAnXHU5NUEyXHU5MDIzXHU1M0Q2XHU1RjE1XHU1MTQ4JyB9LFxuICAgICAgcmVsYXRlZF90b19jb250YWN0OiB7IGxhYmVsOiAnXHU5NUEyXHU5MDIzXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1JyB9LFxuICAgICAgcmVsYXRlZF90b19vcHBvcnR1bml0eTogeyBsYWJlbDogJ1x1OTVBMlx1OTAyM1x1NTU0Nlx1OEFDNycgfSxcbiAgICAgIHJlbGF0ZWRfdG9fbGVhZDogeyBsYWJlbDogJ1x1OTVBMlx1OTAyM1x1MzBFQVx1MzBGQ1x1MzBDOScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY2FzZTogeyBsYWJlbDogJ1x1OTVBMlx1OTAyM1x1MzBCMVx1MzBGQ1x1MzBCOScgfSxcbiAgICAgIG91dGNvbWVfbm90ZXM6IHsgbGFiZWw6ICdcdTdENTBcdTY3OUNcdTMwRTFcdTMwRTInLCBoZWxwOiAnXHU1NDA4XHU2MTBGXHU0RThCXHU5ODA1XHUzMDY4XHU2QjIxXHUzMDZFXHUzMEEyXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfZXZlbnRzOiB7IGxhYmVsOiAnXHUzMDU5XHUzMDc5XHUzMDY2XHUzMDZFXHUzMEE0XHUzMEQ5XHUzMEYzXHUzMEM4JyB9LFxuICAgICAgZXZlbnRfY2FsZW5kYXI6IHsgbGFiZWw6ICdcdTMwQTRcdTMwRDlcdTMwRjNcdTMwQzhcdTMwQUJcdTMwRUNcdTMwRjNcdTMwQzBcdTMwRkMnIH0sXG4gICAgICBldmVudF90aW1lbGluZTogeyBsYWJlbDogJ1x1MzBDMVx1MzBGQ1x1MzBFMFx1MzBCOVx1MzBCMVx1MzBCOFx1MzBFNVx1MzBGQ1x1MzBFQicgfSxcbiAgICAgIG15X2V2ZW50czogeyBsYWJlbDogJ1x1MzBERVx1MzBBNFx1MzBBQlx1MzBFQ1x1MzBGM1x1MzBDMFx1MzBGQycgfSxcbiAgICAgIHVwY29taW5nX2V2ZW50czogeyBsYWJlbDogJ1x1RDgzRFx1RENDNSBcdTk1OEJcdTUwQUNcdTRFODhcdTVCOUEgXHUwMEI3IFx1NzZGNFx1OEZEMVx1OTgwNicgfSxcbiAgICAgIGhlbGRfZXZlbnRzOiB7IGxhYmVsOiAnXHUyNzA1IFx1NUJGRVx1OEE3MVx1NUM2NVx1NkI3NCcgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTMwQTRcdTMwRDlcdTMwRjNcdTMwQzhcdTYwQzVcdTU4MzEnIH0sXG4gICAgICBzY2hlZHVsZTogeyBsYWJlbDogJ1x1MzBCOVx1MzBCMVx1MzBCOFx1MzBFNVx1MzBGQ1x1MzBFQicgfSxcbiAgICAgIHJlbGF0ZWQ6IHsgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzknIH0sXG4gICAgICBvdXRjb21lOiB7IGxhYmVsOiAnXHU1QjlGXHU2NUJEXHU3RDUwXHU2NzlDJyB9LFxuICAgICAgLy8gZXZlbnQudmlldy50cyBcdTMwNkVcdTMwRDVcdTMwQTlcdTMwRkNcdTMwRTBcdTMwQkJcdTMwQUZcdTMwQjdcdTMwRTdcdTMwRjNcdTU0MEQgKCMxMTAwKVxuICAgICAgZXZlbnQ6IHsgbGFiZWw6ICdcdTMwQTRcdTMwRDlcdTMwRjNcdTMwQzgnIH0sXG4gICAgICByZWxhdGVkX3JlY29yZHM6IHsgbGFiZWw6ICdcdTk1QTJcdTkwMjNcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzknIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX2V2ZW50X2F0dGVuZGVlOiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBhdHRlbmRlZV9yZXNvbHZlczoge1xuICAgICAgICBtZXNzYWdlOiAnXHU1M0MyXHU1MkEwXHU4MDA1XHUzMDZGXHU1M0MyXHU1MkEwXHU4MDA1XHU3QTJFXHU1MjI1XHUzMDRDXHU3OTNBXHUzMDU5XHU3NkY4XHU2MjRCXHUzMDkyXHU2MzA3XHU1QjlBXHUzMDU5XHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5XHUzMDAyXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDZFXHU1ODM0XHU1NDA4XHUzMDZGXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDkyXHUzMDAxXHU3OTNFXHU1OTE2XHUzMDZFXHU1ODM0XHU1NDA4XHUzMDZGXHU3OTNFXHU1OTE2XHU1M0MyXHU1MkEwXHU4MDA1XHU1NDBEXHUzMDkyXHU1MTY1XHU1MjlCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0JyxcbiAgICAgIH0sXG4gICAgICBhdHRlbmRlZV90eXBlX2V4Y2x1c2l2ZToge1xuICAgICAgICBtZXNzYWdlOiAnXHU1M0MyXHU1MkEwXHU4MDA1XHUzMDRDXHU2MzA3XHU1QjlBXHUzMDY3XHUzMDREXHUzMDhCXHU3NkY4XHU2MjRCXHUzMDZGIDEgXHUzMDY0XHUzMDYwXHUzMDUxXHUzMDY3XHUzMDU5XHUzMDAyXHU1M0MyXHU1MkEwXHU4MDA1XHU3QTJFXHU1MjI1XHUzMDRDXHU3OTNBXHUzMDU1XHUzMDZBXHUzMDQ0XHU5ODA1XHU3NkVFXHUzMDZGXHUzMDU5XHUzMDc5XHUzMDY2XHU3QTdBXHUzMDZCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOFx1NTNDMlx1NTJBMFx1ODAwNScsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTMwQTRcdTMwRDlcdTMwRjNcdTMwQzhcdTUzQzJcdTUyQTBcdTgwMDUnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHUzMEE0XHUzMEQ5XHUzMEYzXHUzMEM4XHUzMDZCXHU2MkRCXHU1Rjg1XHUzMDU1XHUzMDhDXHUzMDVGXHUzMDAxXHUzMDdFXHUzMDVGXHUzMDZGXHU1MUZBXHU1RTJEXHUzMDU3XHUzMDVGXHU0RUJBJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGF0dGVuZGVlX251bWJlcjogeyBsYWJlbDogJ1x1NTNDMlx1NTJBMFx1ODAwNVx1NzU2QVx1NTNGNycgfSxcbiAgICAgIGNybV9ldmVudDogeyBsYWJlbDogJ1x1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOCcgfSxcbiAgICAgIGF0dGVuZGVlX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdcdTUzQzJcdTUyQTBcdTgwMDVcdTdBMkVcdTUyMjUnLFxuICAgICAgICBvcHRpb25zOiB7IGNvbnRhY3Q6ICdcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDUnLCBsZWFkOiAnXHUzMEVBXHUzMEZDXHUzMEM5JywgdXNlcjogJ1x1NzkzRVx1NTE4NVx1MzBFNlx1MzBGQ1x1MzBCNlx1MzBGQycsIGV4dGVybmFsOiAnXHU3OTNFXHU1OTE2XHUzMEIyXHUzMEI5XHUzMEM4JyB9LFxuICAgICAgfSxcbiAgICAgIGNybV9jb250YWN0OiB7IGxhYmVsOiAnXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1JywgaGVscDogJ1x1NTNDMlx1NTJBMFx1ODAwNVx1MzA0Q1x1NjVFMlx1NUI1OFx1MzA2RVx1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNVx1MzA2N1x1MzA0Mlx1MzA4Qlx1NTgzNFx1NTQwOFx1MzA2Qlx1OEEyRFx1NUI5QVx1MzA1N1x1MzA3RVx1MzA1OScgfSxcbiAgICAgIGNybV9sZWFkOiB7IGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5JywgaGVscDogJ1x1NTNDMlx1NTJBMFx1ODAwNVx1MzA0Q1x1MzA3RVx1MzA2MFx1NTkwOVx1NjNEQlx1MzA1NVx1MzA4Q1x1MzA2Nlx1MzA0NFx1MzA2QVx1MzA0NFx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2N1x1MzA0Mlx1MzA4Qlx1NTgzNFx1NTQwOFx1MzA2Qlx1OEEyRFx1NUI5QVx1MzA1N1x1MzA3RVx1MzA1OScgfSxcbiAgICAgIHN5c191c2VyOiB7IGxhYmVsOiAnXHU3OTNFXHU1MTg1XHUzMEU2XHUzMEZDXHUzMEI2XHUzMEZDJywgaGVscDogJ1x1NTNDMlx1NTJBMFx1ODAwNVx1MzA0Q1x1NzkzRVx1NTE4NVx1MzA2RVx1NTQwQ1x1NTBEQVx1MzA2N1x1MzA0Mlx1MzA4Qlx1NTgzNFx1NTQwOFx1MzA2Qlx1OEEyRFx1NUI5QVx1MzA1N1x1MzA3RVx1MzA1OScgfSxcbiAgICAgIGV4dGVybmFsX25hbWU6IHsgbGFiZWw6ICdcdTc5M0VcdTU5MTZcdTUzQzJcdTUyQTBcdTgwMDUnLCBoZWxwOiAnQ1JNIFx1MzA2RVx1MzA2OVx1MzA2RVx1MzBBQVx1MzBENlx1MzBCOFx1MzBBN1x1MzBBRlx1MzBDOFx1MzA2Qlx1MzA4Mlx1NUI1OFx1NTcyOFx1MzA1N1x1MzA2QVx1MzA0NFx1NTNDMlx1NTJBMFx1ODAwNVx1MzA2RVx1NkMwRlx1NTQwRCBcdTIwMTQgXHU1M0MyXHU1MkEwXHU4MDA1XHU3QTJFXHU1MjI1XHUzMDRDXHUzMDBDXHU3OTNFXHU1OTE2XHUzMEIyXHUzMEI5XHUzMEM4XHUzMDBEXHUzMDZFXHUzMDY4XHUzMDREXHUzMDZCXHU4QTJEXHU1QjlBXHUzMDU3XHUzMDdFXHUzMDU5JyB9LFxuICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgbGFiZWw6ICdcdTU2REVcdTdCNTQnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbm9fcmVzcG9uc2U6ICdcdTY3MkFcdTU2REVcdTdCNTQnLCBhY2NlcHRlZDogJ1x1NjI3Rlx1OEFGRScsXG4gICAgICAgICAgZGVjbGluZWQ6ICdcdThGOUVcdTkwMDAnLCB0ZW50YXRpdmU6ICdcdTRFRUVcdTYyN0ZcdThBRkUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGlzX29yZ2FuaXplcjogeyBsYWJlbDogJ1x1NEUzQlx1NTBBQ1x1ODAwNScgfSxcbiAgICAgIGludml0ZWRfZGF0ZTogeyBsYWJlbDogJ1x1NjJEQlx1NUY4NVx1NjVFNVx1NjY0MicgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2V2ZW50X2F0dGVuZGVlczogeyBsYWJlbDogJ1x1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOFx1NTNDMlx1NTJBMFx1ODAwNScgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdcdTUzQzJcdTUyQTBcdTgwMDUnIH0sXG4gICAgICByZXNwb25zZTogeyBsYWJlbDogJ1x1NjJEQlx1NUY4NScgfSxcbiAgICAgIC8vIGV2ZW50X2F0dGVuZGVlLnZpZXcudHMgXHUzMDZFXHUzMEQ1XHUzMEE5XHUzMEZDXHUzMEUwXHUzMEJCXHUzMEFGXHUzMEI3XHUzMEU3XHUzMEYzXHU1NDBEICgjMTEwMClcbiAgICAgIGF0dGVuZGVlOiB7IGxhYmVsOiAnXHU1M0MyXHU1MkEwXHU4MDA1JyB9LFxuICAgICAgaW52aXRhdGlvbjogeyBsYWJlbDogJ1x1NjJEQlx1NUY4NScgfSxcbiAgICB9LFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9qYS1KUC9vYmplY3RzLm1hcmtldGluZy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlBcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQL29iamVjdHMubWFya2V0aW5nLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbi8qKlxuICogXHU2NUU1XHU2NzJDXHU4QTlFIChqYS1KUCkgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBNQVJLRVRJTkcgZmFtaWx5OlxuICogZGVtYW5kIGdlbmVyYXRpb24gXHUyMDE0IGNhbXBhaWducyBhbmQgdGhlaXIgbWVtYmVyc2hpcC5cbiAqXG4gKiBSb3N0ZXI6IGBjcm1fY2FtcGFpZ25gLCBgY3JtX2NhbXBhaWduX21lbWJlcmAuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAudHNgLlxuICovXG5leHBvcnQgY29uc3QgbWFya2V0aW5nOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fY2FtcGFpZ246IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGVuZF9hZnRlcl9zdGFydDoge1xuICAgICAgICBtZXNzYWdlOiAnXHU3RDQyXHU0RTg2XHU2NUU1XHUzMDZGXHU5NThCXHU1OUNCXHU2NUU1XHUzMDg4XHUzMDhBXHU1RjhDXHUzMDY3XHUzMDQyXHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5JyxcbiAgICAgIH0sXG4gICAgICBhY3R1YWxfY29zdF93aXRoaW5fYnVkZ2V0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdcdTVCOUZcdTdFM0VcdTMwQjNcdTMwQjlcdTMwQzhcdTMwNENcdTRFODhcdTdCOTdcdTMwQjNcdTMwQjlcdTMwQzhcdTMwOTJcdThEODVcdTMwNDhcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNTknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzJyxcbiAgICBwbHVyYWxMYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGMycsXG4gICAgZGVzY3JpcHRpb246ICdcdTMwREVcdTMwRkNcdTMwQjFcdTMwQzZcdTMwQTNcdTMwRjNcdTMwQjBcdTMwQURcdTMwRTNcdTMwRjNcdTMwREFcdTMwRkNcdTMwRjNcdTMwNjhcdTY1QkRcdTdCNTYnLFxuICAgIGZpZWxkczoge1xuICAgICAgY2FtcGFpZ25fY29kZTogeyBsYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzBCM1x1MzBGQ1x1MzBDOScgfSxcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdcdTMwQURcdTMwRTNcdTMwRjNcdTMwREFcdTMwRkNcdTMwRjNcdTU0MEQnIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnXHU4ODY4XHU3OTNBXHU1NDBEJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdcdThBQUNcdTY2MEUnIH0sXG4gICAgICB0eXBlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHU3QTJFXHU1MjI1JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGVtYWlsOiAnXHUzMEUxXHUzMEZDXHUzMEVCJywgd2ViaW5hcjogJ1x1MzBBNlx1MzBBN1x1MzBEM1x1MzBDQVx1MzBGQycsIHRyYWRlX3Nob3c6ICdcdTVDNTVcdTc5M0FcdTRGMUEnLFxuICAgICAgICAgIGNvbmZlcmVuY2U6ICdcdTMwQUJcdTMwRjNcdTMwRDVcdTMwQTFcdTMwRUNcdTMwRjNcdTMwQjknLCBkaXJlY3RfbWFpbDogJ1x1MzBDMFx1MzBBNFx1MzBFQ1x1MzBBRlx1MzBDOFx1MzBFMVx1MzBGQ1x1MzBFQicsXG4gICAgICAgICAgc29jaWFsX21lZGlhOiAnXHUzMEJEXHUzMEZDXHUzMEI3XHUzMEUzXHUzMEVCXHUzMEUxXHUzMEM3XHUzMEEzXHUzMEEyJywgY29udGVudDogJ1x1MzBCM1x1MzBGM1x1MzBDNlx1MzBGM1x1MzBDNFx1MzBERVx1MzBGQ1x1MzBCMVx1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMCcsXG4gICAgICAgICAgcGFydG5lcjogJ1x1MzBEMVx1MzBGQ1x1MzBDOFx1MzBDQVx1MzBGQ1x1MzBERVx1MzBGQ1x1MzBCMVx1MzBDNlx1MzBBM1x1MzBGM1x1MzBCMCcsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY2hhbm5lbDoge1xuICAgICAgICBsYWJlbDogJ1x1NEUzQlx1ODk4MVx1MzBDMVx1MzBFM1x1MzBDRFx1MzBFQicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBkaWdpdGFsOiAnXHUzMEM3XHUzMEI4XHUzMEJGXHUzMEVCJywgc29jaWFsOiAnXHUzMEJEXHUzMEZDXHUzMEI3XHUzMEUzXHUzMEVCJywgZW1haWw6ICdcdTMwRTFcdTMwRkNcdTMwRUInLFxuICAgICAgICAgIGV2ZW50czogJ1x1MzBBNFx1MzBEOVx1MzBGM1x1MzBDOCcsIHBhcnRuZXI6ICdcdTMwRDFcdTMwRkNcdTMwQzhcdTMwQ0FcdTMwRkMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwbGFubmluZzogJ1x1OEEwOFx1NzUzQlx1NEUyRCcsIGluX3Byb2dyZXNzOiAnXHU1QjlGXHU2NUJEXHU0RTJEJyxcbiAgICAgICAgICBjb21wbGV0ZWQ6ICdcdTVCOENcdTRFODYnLCBhYm9ydGVkOiAnXHU0RTJEXHU2QjYyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGFydF9kYXRlOiB7IGxhYmVsOiAnXHU5NThCXHU1OUNCXHU2NUU1JyB9LFxuICAgICAgZW5kX2RhdGU6IHsgbGFiZWw6ICdcdTdENDJcdTRFODZcdTY1RTUnIH0sXG4gICAgICBidWRnZXRlZF9jb3N0OiB7IGxhYmVsOiAnXHU0RTg4XHU3Qjk3XHUzMEIzXHUzMEI5XHUzMEM4JyB9LFxuICAgICAgYWN0dWFsX2Nvc3Q6IHsgbGFiZWw6ICdcdTVCOUZcdTMwQjNcdTMwQjlcdTMwQzgnIH0sXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiB7IGxhYmVsOiAnXHU0RTg4XHU2RTJDXHU1OEYyXHU0RTBBJyB9LFxuICAgICAgYWN0dWFsX3JldmVudWU6IHsgbGFiZWw6ICdcdTVCOUZcdTUzQ0VcdTc2Q0EnIH0sXG4gICAgICB0YXJnZXRfc2l6ZTogeyBsYWJlbDogJ1x1MzBCRlx1MzBGQ1x1MzBCMlx1MzBDM1x1MzBDOFx1ODk4Rlx1NkEyMScsIGhlbHA6ICdcdTVCRkVcdThDNjFcdTMwNjhcdTMwNTlcdTMwOEJcdTMwRUFcdTMwRkNcdTMwQzlcdTMwRkJcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTMwNkVcdTc2RUVcdTZBMTlcdTRFRjZcdTY1NzAnIH0sXG4gICAgICBudW1fc2VudDogeyBsYWJlbDogJ1x1OTAwMVx1NEZFMVx1NjU3MCcgfSxcbiAgICAgIG51bV9yZXNwb25zZXM6IHsgbGFiZWw6ICdcdTVGRENcdTdCNTRcdTY1NzAnIH0sXG4gICAgICBudW1fbGVhZHM6IHsgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTY1NzAnIH0sXG4gICAgICBudW1fY29udmVydGVkX2xlYWRzOiB7IGxhYmVsOiAnXHU1OTA5XHU2M0RCXHU2RTA4XHUzMEVBXHUzMEZDXHUzMEM5XHU2NTcwJyB9LFxuICAgICAgbnVtX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdcdTRGNUNcdTYyMTBcdTZFMDhcdTU1NDZcdThBQzdcdTY1NzAnIH0sXG4gICAgICBudW1fd29uX29wcG9ydHVuaXRpZXM6IHsgbGFiZWw6ICdcdTUzRDdcdTZDRThcdTU1NDZcdThBQzcnIH0sXG4gICAgICByZXNwb25zZV9yYXRlOiB7IGxhYmVsOiAnXHU1RkRDXHU3QjU0XHU3Mzg3XHVGRjA4JVx1RkYwOScgfSxcbiAgICAgIHJvaTogeyBsYWJlbDogJ1JPSVx1RkYwOCVcdUZGMDknIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIGxhbmRpbmdfcGFnZV91cmw6IHsgbGFiZWw6ICdcdTMwRTlcdTMwRjNcdTMwQzdcdTMwQTNcdTMwRjNcdTMwQjBcdTMwREFcdTMwRkNcdTMwQjgnIH0sXG4gICAgICBpc19hY3RpdmU6IHsgbGFiZWw6ICdcdTY3MDlcdTUyQjknIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9jYW1wYWlnbnM6IHsgbGFiZWw6ICdcdTUxNjhcdTMwQURcdTMwRTNcdTMwRjNcdTMwREFcdTMwRkNcdTMwRjMnIH0sXG4gICAgICBjYW1wYWlnbl9nYW50dDogeyBsYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1NjVFNVx1N0EwQicgfSxcbiAgICAgIGNhbXBhaWduX2NhbGVuZGFyOiB7IGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHUzMEFCXHUzMEVDXHUzMEYzXHUzMEMwXHUzMEZDJyB9LFxuICAgICAgY2FtcGFpZ25fdGltZWxpbmU6IHsgbGFiZWw6ICdcdTMwREVcdTMwRkNcdTMwQjFcdTMwQzZcdTMwQTNcdTMwRjNcdTMwQjBcdTMwQkZcdTMwQTRcdTMwRTBcdTMwRTlcdTMwQTRcdTMwRjMnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgc2NoZWR1bGU6IHsgbGFiZWw6ICdcdTMwQjlcdTMwQjFcdTMwQjhcdTMwRTVcdTMwRkNcdTMwRUInIH0sXG4gICAgICBidWRnZXQ6IHsgbGFiZWw6ICdcdTRFODhcdTdCOTdcdTMwRkJST0knIH0sXG4gICAgICBtZXRyaWNzOiB7IGxhYmVsOiAnXHU1QjlGXHU3RTNFJyB9LFxuICAgICAgYXNzaWdubWVudDogeyBsYWJlbDogJ1x1NjJDNVx1NUY1M1x1ODAwNScgfSxcbiAgICAgIGFzc2V0czogeyBsYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzBBMlx1MzBCQlx1MzBDM1x1MzBDOCcgfSxcbiAgICB9LFxuICAgIF9hY3Rpb25zOiB7XG4gICAgICBlbnJvbGxfbGVhZHM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwRTFcdTMwRjNcdTMwRDBcdTMwRkNcdTMwOTJcdTRFMDBcdTYyRUNcdTc2N0JcdTkzMzInLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1NUJGRVx1OEM2MVx1MzBFMVx1MzBGM1x1MzBEMFx1MzBGQ1x1MzA5Mlx1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzA2Qlx1NzY3Qlx1OTMzMlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9jYW1wYWlnbl9tZW1iZXI6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGxlYWRfb3JfY29udGFjdF9yZXF1aXJlZDoge1xuICAgICAgICBtZXNzYWdlOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHUzMEUxXHUzMEYzXHUzMEQwXHUzMEZDXHUzMDZGXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDdFXHUzMDVGXHUzMDZGXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDZFXHUzMDQ0XHUzMDVBXHUzMDhDXHUzMDRCXHUzMDkyXHU1M0MyXHU3MTY3XHUzMDU5XHUzMDhCXHU1RkM1XHU4OTgxXHUzMDRDXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDU5JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1x1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzBFMVx1MzBGM1x1MzBEMFx1MzBGQycsXG4gICAgcGx1cmFsTGFiZWw6ICdcdTMwQURcdTMwRTNcdTMwRjNcdTMwREFcdTMwRkNcdTMwRjNcdTMwRTFcdTMwRjNcdTMwRDBcdTMwRkMnLFxuICAgIGRlc2NyaXB0aW9uOiAnXHUzMEFEXHUzMEUzXHUzMEYzXHUzMERBXHUzMEZDXHUzMEYzXHUzMDZFXHU1QkZFXHU4QzYxXHUzMDY4XHUzMDZBXHUzMDYzXHUzMDVGXHUzMEVBXHUzMEZDXHUzMEM5XHUzMEZCXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDY4XHUzMDVEXHUzMDZFXHU1M0NEXHU1RkRDXHU3MkI2XHU2Q0MxJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIG1lbWJlcl9udW1iZXI6IHsgbGFiZWw6ICdcdTMwRTFcdTMwRjNcdTMwRDBcdTMwRkNcdTc1NkFcdTUzRjcnIH0sXG4gICAgICBjcm1fY2FtcGFpZ246IHsgbGFiZWw6ICdcdTMwQURcdTMwRTNcdTMwRjNcdTMwREFcdTMwRkNcdTMwRjMnIH0sXG4gICAgICBjcm1fbGVhZDogeyBsYWJlbDogJ1x1MzBFQVx1MzBGQ1x1MzBDOScsIGhlbHA6ICdcdTc2N0JcdTkzMzJcdTY2NDJcdTcwQjlcdTMwNjdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNjBcdTMwNjNcdTMwNUZcdTMwRTFcdTMwRjNcdTMwRDBcdTMwRkNcdTMwNkJcdThBMkRcdTVCOUFcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTknIH0sXG4gICAgICBjcm1fY29udGFjdDogeyBsYWJlbDogJ1x1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNScsIGhlbHA6ICdcdTY1RTJcdTVCNThcdTMwNkVcdTUzRDZcdTVGMTVcdTUxNDhcdThDQUNcdTRFRkJcdTgwMDVcdTMwNjdcdTMwNDJcdTMwOEJcdTMwRTFcdTMwRjNcdTMwRDBcdTMwRkNcdTMwNkJcdThBMkRcdTVCOUFcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTknIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdcdTMwQjlcdTMwQzZcdTMwRkNcdTMwQkZcdTMwQjknLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgc2VudDogJ1x1OTAwMVx1NEZFMVx1NkUwOCcsIHJlc3BvbmRlZDogJ1x1NUZEQ1x1N0I1NFx1NkUwOCcsXG4gICAgICAgICAgY29udmVydGVkOiAnXHU1OTA5XHU2M0RCXHU2RTA4JywgdW5zdWJzY3JpYmVkOiAnXHU5MTREXHU0RkUxXHU1MDVDXHU2QjYyJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhZGRlZF9kYXRlOiB7IGxhYmVsOiAnXHU4RkZEXHU1MkEwXHU2NUU1XHU2NjQyJyB9LFxuICAgICAgcmVzcG9uc2VfZGF0ZTogeyBsYWJlbDogJ1x1NUZEQ1x1N0I1NFx1NjVFNVx1NjY0MicgfSxcbiAgICAgIGhhc19yZXNwb25kZWQ6IHsgbGFiZWw6ICdcdTVGRENcdTdCNTRcdTZFMDgnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnXHU1N0ZBXHU2NzJDXHU2MEM1XHU1ODMxJyB9LFxuICAgICAgcmVzcG9uc2U6IHsgbGFiZWw6ICdcdTUzQ0RcdTVGRENcdTMwQzhcdTMwRTlcdTMwQzNcdTMwQURcdTMwRjNcdTMwQjAnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgbWFya19yZXNwb25kZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdcdTVGRENcdTdCNTRcdTZFMDhcdTMwNkJcdTMwNTlcdTMwOEInLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1MzA1M1x1MzA2RVx1MzBBRFx1MzBFM1x1MzBGM1x1MzBEQVx1MzBGQ1x1MzBGM1x1MzBFMVx1MzBGM1x1MzBEMFx1MzBGQ1x1MzA2RVx1NUZEQ1x1N0I1NFx1MzA5Mlx1OEExOFx1OTMzMlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2phLUpQLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9uc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvamEtSlAudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgVHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuaW1wb3J0IHsgYXBwU3VyZmFjZSB9IGZyb20gJy4vamEtSlAvYXBwJztcbmltcG9ydCB7IGN1c3RvbWVyIH0gZnJvbSAnLi9qYS1KUC9vYmplY3RzLmN1c3RvbWVyJztcbmltcG9ydCB7IHBpcGVsaW5lIH0gZnJvbSAnLi9qYS1KUC9vYmplY3RzLnBpcGVsaW5lJztcbmltcG9ydCB7IGNvbW1lcmNlIH0gZnJvbSAnLi9qYS1KUC9vYmplY3RzLmNvbW1lcmNlJztcbmltcG9ydCB7IHNlcnZpY2UgfSBmcm9tICcuL2phLUpQL29iamVjdHMuc2VydmljZSc7XG5pbXBvcnQgeyBhY3Rpdml0eSB9IGZyb20gJy4vamEtSlAvb2JqZWN0cy5hY3Rpdml0eSc7XG5pbXBvcnQgeyBtYXJrZXRpbmcgfSBmcm9tICcuL2phLUpQL29iamVjdHMubWFya2V0aW5nJztcblxuLyoqXG4gKiBcdTY1RTVcdTY3MkNcdThBOUUgKGphLUpQKSBcdTIwMTQgQ1JNIEFwcCBUcmFuc2xhdGlvbnNcbiAqXG4gKiBQZXItbG9jYWxlIGZpbGU6IG9uZSBmaWxlIHBlciBsYW5ndWFnZSwgZm9sbG93aW5nIHRoZSBgcGVyX2xvY2FsZWAgY29udmVudGlvbi5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqXG4gKiBUaGlzIGJ1bmRsZSB3YXMgb25lIGZpbGUgYW5kIGl0IGhhZCByZWFjaGVkIDg4LjYlIG9mIHRoZSAxMDBLQiBzb3VyY2UgY2FwXG4gKiBgcG5wbSBoeWdpZW5lYCBlbmZvcmNlcywgZ3Jvd2luZyB+MS4yS0IgYSBkYXkuIEl0IGlzIG5vdyBhc3NlbWJsZWQgZnJvbVxuICogYC4vPGxvY2FsZT4vYCwgb24gYW4gYXhpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiBndWVzc2VkOlxuICpcbiAqICAgLSBldmVyeSBuYW1lc3BhY2UgdGhhdCBpcyBOT1QgYG9iamVjdHNgIFx1MjAxNCBgYXBwc2AsIGBtZXNzYWdlc2AsXG4gKiAgICAgYGRhc2hib2FyZHNgLCBgZGF0YXNldHNgLCBgcGFnZXNgLCBhbmQgYW55IG5hbWVzcGFjZSBgVHJhbnNsYXRpb25EYXRhYFxuICogICAgIGdhaW5zIGxhdGVyIFx1MjAxNCBsaXZlcyBpbiBgYXBwLnRzYC4gTWVhc3VyZWQ6IHRob3NlIG5hbWVzcGFjZXMgdG9nZXRoZXJcbiAqICAgICBhcmUgdW5kZXIgYSBxdWFydGVyIG9mIHRoZSBidW5kbGUsIGFuZCB0aGUgc2NoZW1hIGJvdW5kcyBob3cgbWFueSBjYW5cbiAqICAgICBldmVyIGFycml2ZSwgc28gb25lIGZpbGUgaG9sZHMgdGhlbSB3aXRoIHJvb20gbGVmdDtcbiAqICAgLSBgb2JqZWN0c2AgaXMgNjktNzglIG9mIGV2ZXJ5IGJ1bmRsZSwgc28gaXQgaXMgcGFydGl0aW9uZWQgYWdhaW4sIG9uZVxuICogICAgIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5IFx1MjAxNCBgY3VzdG9tZXJgLCBgcGlwZWxpbmVgLCBgY29tbWVyY2VgLFxuICogICAgIGBzZXJ2aWNlYCwgYGFjdGl2aXR5YCwgYG1hcmtldGluZ2AgXHUyMDE0IGFuZCBhIERFVEFJTCBvYmplY3QgZm9sbG93cyBpdHNcbiAqICAgICBtYXN0ZXI6IGxpbmUgaXRlbXMgZm9sbG93IHRoZWlyIHF1b3RlIG9yIG9wcG9ydHVuaXR5LFxuICogICAgIGBjcm1fZXZlbnRfYXR0ZW5kZWVgIGZvbGxvd3MgYGNybV9ldmVudGAsIGBjcm1fY2FtcGFpZ25fbWVtYmVyYFxuICogICAgIGZvbGxvd3MgYGNybV9jYW1wYWlnbmAsIGBjcm1fYXJ0aWNsZV9mZWVkYmFja2AgZm9sbG93c1xuICogICAgIGBjcm1fa25vd2xlZGdlX2FydGljbGVgLlxuICpcbiAqIEEgbmFtZXNwYWNlIGF4aXMgQUxPTkUgd2FzIG1lYXN1cmVkIGFuZCByZWplY3RlZDogaXQgbGVhdmVzIGBvYmplY3RzYCBhdFxuICogNjUuN0tCLCAzLjlLQiB1bmRlciB0aGUgYWR2aXNvcnkgYmFuZCwgd2hpY2ggYG9iamVjdHNgIGdyb3d0aCBjcm9zc2VzIGluXG4gKiBhYm91dCBuaW5lIGRheXMuIFRoZSBmYW1pbHkgYXhpcyBwdXRzIHRoZSBsYXJnZXN0IHBhcnQgYXQgMjQuMiUgb2YgdGhlIGNhcC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgQSBuZXcgb2JqZWN0IHRyYW5zbGF0aW9uIGJlbG9uZ3MgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHkuIERvIG5vdCBhZGRcbiAqIGl0IHRvIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbiBcdTIwMTQgdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdFxuICogdGhlIGJhbmQsIHdoaWNoIGlzIHdoYXQgc3BsaXQgdGhpcyBidW5kbGUgaW4gdGhlIGZpcnN0IHBsYWNlLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBBIHZhbHVlIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSBmYW1pbHkgbGl2ZXMgaW4gYDxsb2NhbGU+L19zaGFyZWQudHNgLiBBXG4gKiB2YWx1ZSB1c2VkIGJ5IGV4YWN0bHkgb25lIGZhbWlseSBsaXZlcyBpbiB0aGF0IGZhbWlseSdzIGZpbGUuXG4gKlxuICogXHUyNkEwXHVGRTBGIFRoZSBrZXkgb3JkZXIgYmVsb3cgaXMgTE9BRC1CRUFSSU5HLCBub3QgY29zbWV0aWMuIGBvYmplY3RzdGFjayBidWlsZGBcbiAqIHNlcmlhbGlzZXMgdGhpcyBvYmplY3QgaW50byBgZGlzdC9vYmplY3RzdGFjay5qc29uYCBpbiBpbnNlcnRpb24gb3JkZXIgYW5kXG4gKiBuZXZlciBzb3J0cyBpdCwgc28gbGlzdGluZyB0aGUgcm93cyBoZXJlIFx1MjAxNCByYXRoZXIgdGhhbiBzcHJlYWRpbmcgdGhlIGZhbWlseVxuICogZmlsZXMgXHUyMDE0IGlzIHdoYXQga2VlcHMgdGhlIGJ1aWx0IGFydGlmYWN0IGJ5dGUtaWRlbnRpY2FsIGFjcm9zcyB0aGUgc3BsaXQuXG4gKiBUaGUgb3JkZXIgaXMgdGhpcyBidW5kbGUncyBvd24gaGlzdG9yaWNhbCBhY2NyZXRpb24gb3JkZXIgYW5kIGRpZmZlcnNcbiAqIGJldHdlZW4gbG9jYWxlczsgcmVvcmRlcmluZyBpdCByZXdyaXRlcyB0aGUgYXJ0aWZhY3QuXG4gKi9cbmV4cG9ydCBjb25zdCBqYUpQOiBUcmFuc2xhdGlvbkRhdGEgPSB7XG4gIG9iamVjdHM6IHtcbiAgICBjcm1fYWNjb3VudDogY3VzdG9tZXIuY3JtX2FjY291bnQsXG4gICAgY3JtX2NvbnRhY3Q6IGN1c3RvbWVyLmNybV9jb250YWN0LFxuICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogc2VydmljZS5jcm1fa25vd2xlZGdlX2FydGljbGUsXG4gICAgY3JtX2ZvcmVjYXN0OiBwaXBlbGluZS5jcm1fZm9yZWNhc3QsXG4gICAgY3JtX2xlYWQ6IHBpcGVsaW5lLmNybV9sZWFkLFxuICAgIGNybV9vcHBvcnR1bml0eTogcGlwZWxpbmUuY3JtX29wcG9ydHVuaXR5LFxuICAgIGNybV9jYXNlOiBzZXJ2aWNlLmNybV9jYXNlLFxuICAgIGNybV9jb250cmFjdDogY29tbWVyY2UuY3JtX2NvbnRyYWN0LFxuICAgIGNybV9wcm9kdWN0OiBjb21tZXJjZS5jcm1fcHJvZHVjdCxcbiAgICBjcm1fcXVvdGU6IGNvbW1lcmNlLmNybV9xdW90ZSxcbiAgICBjcm1fdGFzazogYWN0aXZpdHkuY3JtX3Rhc2ssXG4gICAgY3JtX2NhbXBhaWduOiBtYXJrZXRpbmcuY3JtX2NhbXBhaWduLFxuICAgIGNybV9ldmVudDogYWN0aXZpdHkuY3JtX2V2ZW50LFxuICAgIGNybV9ldmVudF9hdHRlbmRlZTogYWN0aXZpdHkuY3JtX2V2ZW50X2F0dGVuZGVlLFxuICAgIGNybV9hcnRpY2xlX2ZlZWRiYWNrOiBzZXJ2aWNlLmNybV9hcnRpY2xlX2ZlZWRiYWNrLFxuICAgIGNybV9jYW1wYWlnbl9tZW1iZXI6IG1hcmtldGluZy5jcm1fY2FtcGFpZ25fbWVtYmVyLFxuICAgIGNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW06IHBpcGVsaW5lLmNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW0sXG4gICAgY3JtX3F1b3RlX2xpbmVfaXRlbTogY29tbWVyY2UuY3JtX3F1b3RlX2xpbmVfaXRlbSxcbiAgfSxcbiAgLi4uYXBwU3VyZmFjZSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvYXBwLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FU1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvYXBwLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IFFVT1RFX0RJU0NPVU5UX0NFSUxJTkcgfSBmcm9tICcuLi8uLi9vYmplY3RzL190aHJlc2hvbGRzJztcblxuLyoqXG4gKiBFc3BhXHUwMEYxb2wgKGVzLUVTKSBcdTIwMTQgZXZlcnkgdHJhbnNsYXRpb24gbmFtZXNwYWNlIEVYQ0VQVCBgb2JqZWN0c2A6XG4gKiBgYXBwc2AsIGBtZXNzYWdlc2AsIGBkYXNoYm9hcmRzYCwgYGRhdGFzZXRzYCwgYHBhZ2VzYCwgYGZsb3dzYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy50c2AuXG4gKlxuICogQSBuYW1lc3BhY2UgYFRyYW5zbGF0aW9uRGF0YWAgZ2FpbnMgbGF0ZXIgbGFuZHMgaGVyZSB0b28sIGFuZCB0aGUgcm9vbSBpc1xuICogbWVhc3VyZWQ6IHRoaXMgZmlsZSBpcyB0aGUgc21hbGxlciBoYWxmIG9mIHRoZSBidW5kbGUsIGFuZCB0aGUgc2NoZW1hIGJvdW5kc1xuICogaG93IG1hbnkgbmFtZXNwYWNlcyBjYW4gZXZlciBhcnJpdmUuXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBTdXJmYWNlOiBPbWl0PFRyYW5zbGF0aW9uRGF0YSwgJ29iamVjdHMnPiA9IHtcbiAgYXBwczoge1xuICAgIGNybV9lbnRlcnByaXNlOiB7XG4gICAgICBsYWJlbDogJ0hvdENSTScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0dlc3RpXHUwMEYzbiBkZSByZWxhY2lvbmVzIGNvbiBjbGllbnRlcyBwYXJhIHZlbnRhcywgc2VydmljaW8geSBtYXJrZXRpbmcnLFxuICAgICAgLy8gSW5kZXhhZG8gcG9yIGVsIGBpZGAgZGVsIG5vZG8gZGUgbmF2ZWdhY2lcdTAwRjNuIChlc3BhY2lvIGRlIG5vbWJyZXMgcGxhbm8sXG4gICAgICAvLyBzZWEgY3VhbCBzZWEgbGEgcHJvZnVuZGlkYWQgZGVsIG5vZG8pLlxuICAgICAgbmF2aWdhdGlvbjoge1xuICAgICAgICBncm91cF9hY3Rpdml0eTogeyBsYWJlbDogJ0FjdGl2aWRhZCcgfSxcbiAgICAgICAgbmF2X2V2ZW50OiB7IGxhYmVsOiAnRXZlbnRvcycgfSxcbiAgICAgICAgbmF2X2FjdGl2aXR5X2Rhc2hib2FyZDogeyBsYWJlbDogJ0FjdGl2aWRhZCBkZSBWZW50YXMnIH0sXG4gICAgICAgIG5hdl9teV9jYWxlbmRhcjogeyBsYWJlbDogJ01pIENhbGVuZGFyaW8nIH0sXG4gICAgICAgIG5hdl9ob21lOiB7IGxhYmVsOiAnSW5pY2lvJyB9LFxuXG4gICAgICAgIGdyb3VwX3NhbGVzOiB7IGxhYmVsOiAnVmVudGFzJyB9LFxuICAgICAgICBuYXZfbGVhZDogeyBsYWJlbDogJ1Byb3NwZWN0b3MnIH0sXG4gICAgICAgIG5hdl9hY2NvdW50OiB7IGxhYmVsOiAnQ3VlbnRhcycgfSxcbiAgICAgICAgbmF2X2FjY291bnRfd29ya2JlbmNoOiB7IGxhYmVsOiAnTWVzYSBkZSBUcmFiYWpvIGRlIEN1ZW50YXMnIH0sXG4gICAgICAgIG5hdl9jb250YWN0OiB7IGxhYmVsOiAnQ29udGFjdG9zJyB9LFxuICAgICAgICBuYXZfb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdPcG9ydHVuaWRhZGVzJyB9LFxuICAgICAgICBuYXZfcXVvdGU6IHsgbGFiZWw6ICdDb3RpemFjaW9uZXMnIH0sXG4gICAgICAgIG5hdl9jb250cmFjdDogeyBsYWJlbDogJ0NvbnRyYXRvcycgfSxcbiAgICAgICAgbmF2X3Byb2R1Y3Q6IHsgbGFiZWw6ICdQcm9kdWN0b3MnIH0sXG4gICAgICAgIG5hdl9zYWxlc19kYXNoYm9hcmQ6IHsgbGFiZWw6ICdSZW5kaW1pZW50byBkZSBWZW50YXMnIH0sXG5cbiAgICAgICAgZ3JvdXBfd29yazogeyBsYWJlbDogJ01pIFRyYWJham8nIH0sXG4gICAgICAgIG5hdl9teV90YXNrczogeyBsYWJlbDogJ01pcyBUYXJlYXMnIH0sXG4gICAgICAgIG5hdl9teV9kZWFsczogeyBsYWJlbDogJ01pcyBOZWdvY2lvcycgfSxcbiAgICAgICAgbmF2X215X2xlYWRzOiB7IGxhYmVsOiAnTWlzIFByb3NwZWN0b3MnIH0sXG4gICAgICAgIG5hdl9teV9jYXNlczogeyBsYWJlbDogJ01pcyBDYXNvcycgfSxcbiAgICAgICAgbmF2X2FwcHJvdmFsX3JlcXVlc3RzOiB7IGxhYmVsOiAnQmFuZGVqYSBkZSBFbnRyYWRhJyB9LFxuXG4gICAgICAgIGdyb3VwX3NlcnZpY2U6IHsgbGFiZWw6ICdTZXJ2aWNpbycgfSxcbiAgICAgICAgbmF2X2Nhc2U6IHsgbGFiZWw6ICdDYXNvcycgfSxcbiAgICAgICAgbmF2X2tub3dsZWRnZTogeyBsYWJlbDogJ0Nvbm9jaW1pZW50bycgfSxcbiAgICAgICAgbmF2X3NlcnZpY2VfZGFzaGJvYXJkOiB7IGxhYmVsOiAnUmVzdW1lbiBkZSBTZXJ2aWNpbycgfSxcblxuICAgICAgICBncm91cF9tYXJrZXRpbmc6IHsgbGFiZWw6ICdNYXJrZXRpbmcnIH0sXG4gICAgICAgIG5hdl9jYW1wYWlnbjogeyBsYWJlbDogJ0NhbXBhXHUwMEYxYXMnIH0sXG5cbiAgICAgICAgZ3JvdXBfaW5zaWdodHM6IHsgbGFiZWw6ICdBblx1MDBFMWxpc2lzJyB9LFxuICAgICAgICBuYXZfY3JtX2Rhc2hib2FyZDogeyBsYWJlbDogJ1Jlc3VtZW4gQ1JNJyB9LFxuICAgICAgICBuYXZfZm9yZWNhc3Q6IHsgbGFiZWw6ICdQcmV2aXNpb25lcycgfSxcbiAgICAgICAgbmF2X3JlcG9ydF9waXBlbGluZV9jb3ZlcmFnZTogeyBsYWJlbDogJ0NvYmVydHVyYSBkZWwgUGlwZWxpbmUnIH0sXG4gICAgICAgIG5hdl9yZXBvcnRfbGVhZF9pbmZsb3c6IHsgbGFiZWw6ICdFbnRyYWRhIGRlIFByb3NwZWN0b3MnIH0sXG4gICAgICAgIG5hdl9yZXBvcnRfc2xhOiB7IGxhYmVsOiAnQ3VtcGxpbWllbnRvIGRlIFNMQScgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgbWVzc2FnZXM6IHtcbiAgICAnY29tbW9uLnNhdmUnOiAnR3VhcmRhcicsXG4gICAgJ2NvbW1vbi5jYW5jZWwnOiAnQ2FuY2VsYXInLFxuICAgICdjb21tb24uZGVsZXRlJzogJ0VsaW1pbmFyJyxcbiAgICAnY29tbW9uLmVkaXQnOiAnRWRpdGFyJyxcbiAgICAnY29tbW9uLmNyZWF0ZSc6ICdDcmVhcicsXG4gICAgJ2NvbW1vbi5zZWFyY2gnOiAnQnVzY2FyJyxcbiAgICAnY29tbW9uLmZpbHRlcic6ICdGaWx0cmFyJyxcbiAgICAnY29tbW9uLmV4cG9ydCc6ICdFeHBvcnRhcicsXG4gICAgJ2NvbW1vbi5iYWNrJzogJ1ZvbHZlcicsXG4gICAgJ2NvbW1vbi5jb25maXJtJzogJ0NvbmZpcm1hcicsXG4gICAgJ25hdi5zYWxlcyc6ICdWZW50YXMnLFxuICAgICduYXYuc2VydmljZSc6ICdTZXJ2aWNpbycsXG4gICAgJ25hdi5tYXJrZXRpbmcnOiAnTWFya2V0aW5nJyxcbiAgICAnbmF2LnByb2R1Y3RzJzogJ1Byb2R1Y3RvcycsXG4gICAgJ25hdi5hbmFseXRpY3MnOiAnQW5hbFx1MDBFRHRpY2EnLFxuICAgICdzdWNjZXNzLnNhdmVkJzogJ1JlZ2lzdHJvIGd1YXJkYWRvIGV4aXRvc2FtZW50ZScsXG4gICAgJ3N1Y2Nlc3MuY29udmVydGVkJzogJ1Byb3NwZWN0byBjb252ZXJ0aWRvIGV4aXRvc2FtZW50ZScsXG4gICAgJ2NvbmZpcm0uZGVsZXRlJzogJ1x1MDBCRkVzdFx1MDBFMSBzZWd1cm8gZGUgcXVlIGRlc2VhIGVsaW1pbmFyIGVzdGUgcmVnaXN0cm8/JyxcbiAgICAnY29uZmlybS5jb252ZXJ0X2xlYWQnOiAnXHUwMEJGQ29udmVydGlyIGVzdGUgcHJvc3BlY3RvIGVuIGN1ZW50YSwgY29udGFjdG8geSBvcG9ydHVuaWRhZD8nLFxuICAgICdlcnJvci5yZXF1aXJlZCc6ICdFc3RlIGNhbXBvIGVzIG9ibGlnYXRvcmlvJyxcbiAgICAnZXJyb3IubG9hZF9mYWlsZWQnOiAnRXJyb3IgYWwgY2FyZ2FyIGxvcyBkYXRvcycsXG4gIH0sXG4gIGRhc2hib2FyZHM6IHtcbiAgICBzYWxlc19hY3Rpdml0eV9kYXNoYm9hcmQ6IHtcbiAgICAgIGxhYmVsOiAnQWN0aXZpZGFkIGRlIHZlbnRhcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1F1aVx1MDBFOW4gaGFibGEgY29uIGxvcyBjbGllbnRlcywgY29uIHF1XHUwMEU5IGZyZWN1ZW5jaWEgeSBxdVx1MDBFOSBjdWVudGFzIHNlIGhhbiBxdWVkYWRvIGVuIHNpbGVuY2lvJyxcbiAgICAgIHdpZGdldHM6IHtcbiAgICAgICAgaW50ZXJhY3Rpb25zX2hlbGQ6IHsgdGl0bGU6ICdJbnRlcmFjY2lvbmVzIHJlZ2lzdHJhZGFzJywgZGVzY3JpcHRpb246ICdMbGFtYWRhcyB5IHJldW5pb25lcyBxdWUgcmVhbG1lbnRlIG9jdXJyaWVyb24nIH0sXG4gICAgICAgIG1lZXRpbmdzX2Jvb2tlZDogeyB0aXRsZTogJ1JldW5pb25lcyBhZ2VuZGFkYXMnLCBkZXNjcmlwdGlvbjogJ1JldW5pb25lcyBlbiBlbCBjYWxlbmRhcmlvIHF1ZSBhXHUwMEZBbiBubyBvY3VycmVuJyB9LFxuICAgICAgICBjdXN0b21lcl9taW51dGVzOiB7IHRpdGxlOiAnTWludXRvcyBjb24gY2xpZW50ZXMnLCBkZXNjcmlwdGlvbjogJ1RpZW1wbyB0b3RhbCBmcmVudGUgYSBjbGllbnRlcycgfSxcbiAgICAgICAgdGFza3NfY29tcGxldGVkOiB7IHRpdGxlOiAnVGFyZWFzIGNvbXBsZXRhZGFzJywgZGVzY3JpcHRpb246ICdTZWd1aW1pZW50b3MgY2VycmFkb3MgXHUyMDE0IGxhIG90cmEgbWl0YWQgZGUgbGEgYWN0aXZpZGFkJyB9LFxuICAgICAgICBhY3Rpdml0eV9ieV9yZXA6IHsgdGl0bGU6ICdBY3RpdmlkYWQgcG9yIHJlcHJlc2VudGFudGUnLCBkZXNjcmlwdGlvbjogJ0ludGVyYWNjaW9uZXMgcmVnaXN0cmFkYXMgcG9yIHJlc3BvbnNhYmxlJyB9LFxuICAgICAgICBhY3Rpdml0eV9ieV93ZWVrOiB7IHRpdGxlOiAnVm9sdW1lbiBkZSBhY3RpdmlkYWQgcG9yIHNlbWFuYScsIGRlc2NyaXB0aW9uOiAnSW50ZXJhY2Npb25lcyBwb3Igc2VtYW5hJyB9LFxuICAgICAgICBhY3Rpdml0eV9taXg6IHsgdGl0bGU6ICdDb21wb3NpY2lcdTAwRjNuIGRlIGxhIGFjdGl2aWRhZCcsIGRlc2NyaXB0aW9uOiAnTGxhbWFkYXMgdnMgcmV1bmlvbmVzIHZzIGRlbW9zdHJhY2lvbmVzJyB9LFxuICAgICAgICBhY3Rpdml0eV9ieV9yZWNvcmRfdHlwZTogeyB0aXRsZTogJ0RcdTAwRjNuZGUgY2FlIGxhIGFjdGl2aWRhZCcsIGRlc2NyaXB0aW9uOiAnUXVcdTAwRTkgcGFydGUgZGVsIGVtYnVkbyByZWNpYmUgYXRlbmNpXHUwMEYzbicgfSxcbiAgICAgICAgZGVhbF9hY3Rpdml0eTogeyB0aXRsZTogJ0ludGVyYWNjaW9uZXMgZW4gb3BvcnR1bmlkYWRlcycsIGRlc2NyaXB0aW9uOiAnSW50ZXJhY2Npb25lcyB2aW5jdWxhZGFzIGEgdW5hIG9wb3J0dW5pZGFkJyB9LFxuICAgICAgICBvcGVuX2RlYWxzX2Zvcl9hY3Rpdml0eTogeyB0aXRsZTogJ09wb3J0dW5pZGFkZXMgYWJpZXJ0YXMnLCBkZXNjcmlwdGlvbjogJ09wb3J0dW5pZGFkZXMgYVx1MDBGQW4gZW4ganVlZ28nIH0sXG4gICAgICAgIHF1aWV0X2FjY291bnRzXzMwOiB7IHRpdGxlOiAnU2lsZW5jaW8gMzArIGRcdTAwRURhcycsIGRlc2NyaXB0aW9uOiAnQ3VlbnRhcyBhY3RpdmFzIHNpbiBpbnRlcmFjY2lcdTAwRjNuIGVuIHVuIG1lcycgfSxcbiAgICAgICAgcXVpZXRfYWNjb3VudHNfNjA6IHsgdGl0bGU6ICdTaWxlbmNpbyA2MCsgZFx1MDBFRGFzJywgZGVzY3JpcHRpb246ICdEb3MgbWVzZXMgZGUgc2lsZW5jaW8gXHUyMDE0IGVsIHVtYnJhbCBkZSByaWVzZ28nIH0sXG4gICAgICAgIHF1aWV0X2FjY291bnRzXzkwOiB7IHRpdGxlOiAnU2lsZW5jaW8gOTArIGRcdTAwRURhcycsIGRlc2NyaXB0aW9uOiAnVW4gdHJpbWVzdHJlIHNpbiBjb250YWN0bycgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjcm1fb3ZlcnZpZXdfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ1Jlc3VtZW4gQ1JNJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTVx1MDBFOXRyaWNhcyBkZSBpbmdyZXNvcywgYW5hbFx1MDBFRHRpY2EgZGUgcGlwZWxpbmUgZSBpbmZvcm1hY2lcdTAwRjNuIGRlIG9wb3J0dW5pZGFkZXMnLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICB0b3RhbF9yZXZlbnVlOiB7IHRpdGxlOiAnSW5ncmVzb3MgdG90YWxlcycsIGRlc2NyaXB0aW9uOiAnSW5ncmVzb3MgY2VycmFkb3MgZ2FuYWRvcyBlbiBlc3RlIHBlclx1MDBFRG9kbycgfSxcbiAgICAgICAgYWN0aXZlX2RlYWxzOiB7IHRpdGxlOiAnTmVnb2Npb3MgYWN0aXZvcycsIGRlc2NyaXB0aW9uOiAnT3BvcnR1bmlkYWRlcyBhYmllcnRhcyBlbiBlbCBwaXBlbGluZScgfSxcbiAgICAgICAgd29uX2RlYWxzOiB7IHRpdGxlOiAnTmVnb2Npb3MgZ2FuYWRvcycsIGRlc2NyaXB0aW9uOiAnTmVnb2Npb3MgY2VycmFkb3MgZ2FuYWRvcyBlbiBlc3RlIHBlclx1MDBFRG9kbycgfSxcbiAgICAgICAgYXZnX2RlYWxfc2l6ZTogeyB0aXRsZTogJ1RhbWFcdTAwRjFvIG1lZGlvIGRlbCBuZWdvY2lvJywgZGVzY3JpcHRpb246ICdWYWxvciBtZWRpbyBkZSBsb3MgbmVnb2Npb3MgY2VycmFkb3MgZ2FuYWRvcycgfSxcbiAgICAgICAgcmV2ZW51ZV90cmVuZHM6IHsgdGl0bGU6ICdUZW5kZW5jaWEgZGUgaW5ncmVzb3MnLCBkZXNjcmlwdGlvbjogJ0luZ3Jlc29zIGNlcnJhZG9zIGdhbmFkb3MgZGUgbG9zIFx1MDBGQWx0aW1vcyAxMiBtZXNlcycgfSxcbiAgICAgICAgbGVhZF9zb3VyY2U6IHsgdGl0bGU6ICdPcmlnZW4gZGVsIHByb3NwZWN0bycsIGRlc2NyaXB0aW9uOiAnVmFsb3IgZGVsIHBpcGVsaW5lIHBvciBjYW5hbCBkZSBhZHF1aXNpY2lcdTAwRjNuJyB9LFxuICAgICAgICBwaXBlbGluZV9ieV9zdGFnZTogeyB0aXRsZTogJ1BpcGVsaW5lIHBvciBldGFwYScsIGRlc2NyaXB0aW9uOiAnVmFsb3IgZGUgb3BvcnR1bmlkYWRlcyBhYmllcnRhcyBlbiBjYWRhIGV0YXBhIGRlIHZlbnRhJyB9LFxuICAgICAgICB0b3BfcHJvZHVjdHM6IHsgdGl0bGU6ICdQcm9kdWN0b3MgcHJpbmNpcGFsZXMnLCBkZXNjcmlwdGlvbjogJ0luZ3Jlc29zIGEgcHJlY2lvIGRlIGxpc3RhIHBvciBjYXRlZ29yXHUwMEVEYSBkZSBwcm9kdWN0bycgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfb3duZXI6IHsgdGl0bGU6ICdQaXBlbGluZSBwb3IgcmVzcG9uc2FibGUnLCBkZXNjcmlwdGlvbjogJ1ZhbG9yIGRlbCBwaXBlbGluZSBhYmllcnRvIHkgblx1MDBGQW1lcm8gZGUgbmVnb2Npb3MgcG9yIGNvbWVyY2lhbCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBleGVjdXRpdmVfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ1Zpc3RhIGVqZWN1dGl2YScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0tQSSBkZSBhbHRvIG5pdmVsIHNvYnJlIGluZ3Jlc29zLCBjbGllbnRlcyB5IHBpcGVsaW5lIHBhcmEgbGEgZGlyZWNjaVx1MDBGM24nLFxuICAgICAgd2lkZ2V0czoge1xuICAgICAgICB0b3RhbF9yZXZlbnVlX3l0ZDogeyB0aXRsZTogJ0luZ3Jlc29zIHRvdGFsZXMgKFlURCknLCBkZXNjcmlwdGlvbjogJ0luZ3Jlc29zIGNlcnJhZG9zIGdhbmFkb3MgZW4gbG8gcXVlIHZhIGRlbCBhXHUwMEYxbycgfSxcbiAgICAgICAgdG90YWxfYWNjb3VudHM6IHsgdGl0bGU6ICdDdWVudGFzIGFjdGl2YXMnLCBkZXNjcmlwdGlvbjogJ0NsaWVudGVzIGNvbiBhbCBtZW5vcyB1bmEgcmVsYWNpXHUwMEYzbiBhY3RpdmEnIH0sXG4gICAgICAgIHRvdGFsX2NvbnRhY3RzOiB7IHRpdGxlOiAnVG90YWwgZGUgY29udGFjdG9zJywgZGVzY3JpcHRpb246ICdQZXJzb25hcyBlbiBudWVzdHJhIGFnZW5kYScgfSxcbiAgICAgICAgb3Blbl9sZWFkczogeyB0aXRsZTogJ1Byb3NwZWN0b3MgYWJpZXJ0b3MnLCBkZXNjcmlwdGlvbjogJ1Byb3NwZWN0b3Mgc2luIGNvbnZlcnRpciBlbiBlbCBlbWJ1ZG8nIH0sXG4gICAgICAgIHJldmVudWVfdHJlbmQ6IHsgdGl0bGU6ICdUZW5kZW5jaWEgZGUgaW5ncmVzb3MnLCBkZXNjcmlwdGlvbjogJ0luZ3Jlc29zIGNlcnJhZG9zIGdhbmFkb3MgZGUgbG9zIFx1MDBGQWx0aW1vcyAxMiBtZXNlcycgfSxcbiAgICAgICAgcmV2ZW51ZV9ieV9pbmR1c3RyeTogeyB0aXRsZTogJ0luZ3Jlc29zIHBvciBpbmR1c3RyaWEnLCBkZXNjcmlwdGlvbjogJ0luZ3Jlc29zIFlURCBnYW5hZG9zIHNlcGFyYWRvcyBwb3IgaW5kdXN0cmlhIGRlbCBjbGllbnRlJyB9LFxuICAgICAgICBwaXBlbGluZV9ieV9zdGFnZTogeyB0aXRsZTogJ1BpcGVsaW5lIHBvciBldGFwYScsIGRlc2NyaXB0aW9uOiAnVmFsb3IgZGUgb3BvcnR1bmlkYWRlcyBhYmllcnRhcyBlbiBjYWRhIGV0YXBhIGRlIHZlbnRhJyB9LFxuICAgICAgICBuZXdfYWNjb3VudHNfYnlfbW9udGg6IHsgdGl0bGU6ICdDdWVudGFzIG51ZXZhcycsIGRlc2NyaXB0aW9uOiAnUml0bW8gZGUgY3JlYWNpXHUwMEYzbiBkZSBjdWVudGFzIGVuIGxvcyBcdTAwRkFsdGltb3MgNiBtZXNlcycgfSxcbiAgICAgICAgYWNjb3VudHNfYnlfaW5kdXN0cnk6IHsgdGl0bGU6ICdDdWVudGFzIHBvciBzZWN0b3InLCBkZXNjcmlwdGlvbjogJ0luZ3Jlc28gYW51YWwgdG90YWwgeSBuXHUwMEZBbWVybyBkZSBjdWVudGFzIHBvciBzZWN0b3InIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgc2FsZXNfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ1JlbmRpbWllbnRvIGRlIHZlbnRhcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0FuYWxcdTAwRUR0aWNhIGRlIHBpcGVsaW5lLCB0ZW5kZW5jaWFzIGRlIHRhc2EgZGUgXHUwMEU5eGl0byB5IHJlbmRpbWllbnRvIGRlIGxvcyByZXByZXNlbnRhbnRlcycsXG4gICAgICB3aWRnZXRzOiB7XG4gICAgICAgIHRvdGFsX3BpcGVsaW5lX3ZhbHVlOiB7IHRpdGxlOiAnUGlwZWxpbmUgdG90YWwnLCBkZXNjcmlwdGlvbjogJ1N1bWEgZGVsIHZhbG9yIGRlIGxhcyBvcG9ydHVuaWRhZGVzIGFiaWVydGFzJyB9LFxuICAgICAgICBjbG9zZWRfd29uX3F0ZDogeyB0aXRsZTogJ0NlcnJhZG8gZ2FuYWRvICh0cmltZXN0cmUpJywgZGVzY3JpcHRpb246ICdJbmdyZXNvcyBjZXJyYWRvcyBlc3RlIHRyaW1lc3RyZScgfSxcbiAgICAgICAgb3Blbl9vcHBvcnR1bml0aWVzOiB7IHRpdGxlOiAnT3BvcnR1bmlkYWRlcyBhYmllcnRhcycsIGRlc2NyaXB0aW9uOiAnTmVnb2Npb3MgYWN0aXZvcyBlbiBjdXJzbycgfSxcbiAgICAgICAgYXZnX2RlYWxfc2l6ZTogeyB0aXRsZTogJ1RhbWFcdTAwRjFvIG1lZGlvIGRlbCBuZWdvY2lvJywgZGVzY3JpcHRpb246ICdWYWxvciBtZWRpbyBkZSBsb3MgbmVnb2Npb3MgY2VycmFkb3MgZ2FuYWRvcyBlc3RlIHRyaW1lc3RyZScgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfc3RhZ2U6IHsgdGl0bGU6ICdQaXBlbGluZSBwb3IgZXRhcGEnLCBkZXNjcmlwdGlvbjogJ1ZhbG9yIGRlIG9wb3J0dW5pZGFkZXMgYWJpZXJ0YXMgZW4gY2FkYSBldGFwYSBkZSB2ZW50YScgfSxcbiAgICAgICAgbW9udGhseV9yZXZlbnVlX3RyZW5kOiB7IHRpdGxlOiAnVGVuZGVuY2lhIG1lbnN1YWwgZGUgaW5ncmVzb3MnLCBkZXNjcmlwdGlvbjogJ0luZ3Jlc29zIGNlcnJhZG9zIGdhbmFkb3MgZGUgbG9zIFx1MDBGQWx0aW1vcyAxMiBtZXNlcycgfSxcbiAgICAgICAgcGlwZWxpbmVfYnlfZm9yZWNhc3RfY2F0ZWdvcnk6IHsgdGl0bGU6ICdQaXBlbGluZSBwb3IgY2F0ZWdvclx1MDBFRGEgZGUgcHJvblx1MDBGM3N0aWNvJywgZGVzY3JpcHRpb246ICdQaXBlbGluZSBhYmllcnRvIGFncnVwYWRvIHBvciBjYXRlZ29yXHUwMEVEYSBkZSBwcm9uXHUwMEYzc3RpY28gZGUgdmVudGFzJyB9LFxuICAgICAgICBsZWFkX3NvdXJjZV9icmVha2Rvd246IHsgdGl0bGU6ICdPcmlnZW4gZGVsIHByb3NwZWN0bycsIGRlc2NyaXB0aW9uOiAnRGUgZFx1MDBGM25kZSBwcm92aWVuZSBudWVzdHJvIHBpcGVsaW5lJyB9LFxuICAgICAgICBvcGVuX3BpcGVsaW5lX2J5X293bmVyOiB7IHRpdGxlOiAnUGlwZWxpbmUgYWJpZXJ0byBwb3IgcmVzcG9uc2FibGUnLCBkZXNjcmlwdGlvbjogJ1ZhbG9yIGRlbCBwaXBlbGluZSBlbiBjdXJzbywgblx1MDBGQW1lcm8gZGUgbmVnb2Npb3MgeSBwcm9iYWJpbGlkYWQgbWVkaWEgZGUgY2llcnJlIHBvciBjb21lcmNpYWwnIH0sXG4gICAgICAgIHF1b3RhX2F0dGFpbm1lbnRfYnlfcmVwOiB7IHRpdGxlOiAnQ3VtcGxpbWllbnRvIGRlIGN1b3RhIHBvciByZXByZXNlbnRhbnRlJywgZGVzY3JpcHRpb246ICdDdW90YSBkZWwgdHJpbWVzdHJlIGFjdHVhbCwgaW5ncmVzb3MgY2VycmFkb3MgeSBjdW1wbGltaWVudG8gcG9yIHJlcHJlc2VudGFudGUsIHNlZ1x1MDBGQW4gaW5zdGFudFx1MDBFMW5lYXMgZGUgcHJvblx1MDBGM3N0aWNvJyB9LFxuICAgICAgICBwaXBlbGluZV9zdGFnZV9ieV9zb3VyY2U6IHsgdGl0bGU6ICdQaXBlbGluZSBwb3IgRXRhcGEgXHUwMEQ3IE9yaWdlbicsIGRlc2NyaXB0aW9uOiAnVGFibGEgY3J1emFkYSBkZWwgaW1wb3J0ZSBkZSBvcG9ydHVuaWRhZGVzIGFiaWVydGFzIHBvciBldGFwYSB5IG9yaWdlbicgfSxcbiAgICAgICAgd2luX3JhdGVfMTJtOiB7IHRpdGxlOiAnVGFzYSBkZSBcdTAwRTl4aXRvICgxMk0pJywgZGVzY3JpcHRpb246ICdOZWdvY2lvcyBnYW5hZG9zIGNvbW8gcG9yY2VudGFqZSBkZSB0b2RvcyBsb3MgbmVnb2Npb3MgcmVzdWVsdG9zIGVuIGxvcyBcdTAwRkFsdGltb3MgMTIgbWVzZXMnIH0sXG4gICAgICAgIHdvbl9kZWFsc18xMm06IHsgdGl0bGU6ICdOZWdvY2lvcyBnYW5hZG9zICgxMk0pJywgZGVzY3JpcHRpb246ICdFbCBudW1lcmFkb3IgZGUgbGEgdGFzYSBkZSBcdTAwRTl4aXRvJyB9LFxuICAgICAgICBsb3N0X2RlYWxzXzEybTogeyB0aXRsZTogJ05lZ29jaW9zIHBlcmRpZG9zICgxMk0pJywgZGVzY3JpcHRpb246ICdMYSBvdHJhIG1pdGFkIGRlbCBkZW5vbWluYWRvciBkZSBsYSB0YXNhIGRlIFx1MDBFOXhpdG8nIH0sXG4gICAgICAgIHdpbl9yYXRlX2J5X293bmVyOiB7IHRpdGxlOiAnR2FuYWRvcyAvIHBlcmRpZG9zIHBvciByZXByZXNlbnRhbnRlJywgZGVzY3JpcHRpb246ICdOZWdvY2lvcyBnYW5hZG9zLCBuZWdvY2lvcyBwZXJkaWRvcyB5IHRhc2EgZGUgXHUwMEU5eGl0byBwb3IgcmVwcmVzZW50YW50ZSBcdTIwMTQgXHUwMEZBbHRpbW9zIDEyIG1lc2VzJyB9LFxuICAgICAgICB3aW5fcmF0ZV9ieV9sZWFkX3NvdXJjZTogeyB0aXRsZTogJ0dhbmFkb3MgLyBwZXJkaWRvcyBwb3Igb3JpZ2VuIGRlbCBwcm9zcGVjdG8nLCBkZXNjcmlwdGlvbjogJ1F1XHUwMEU5IG9yXHUwMEVEZ2VuZXMgcHJvZHVjZW4gbmVnb2Npb3MgcXVlIHJlYWxtZW50ZSBzZSBjaWVycmFuIFx1MjAxNCBcdTAwRkFsdGltb3MgMTIgbWVzZXMnIH0sXG4gICAgICAgIGxvc3NfcmVhc29uX2JyZWFrZG93bjogeyB0aXRsZTogJ1BvciBxdVx1MDBFOSBwZXJkZW1vcycsIGRlc2NyaXB0aW9uOiAnTmVnb2Npb3MgcGVyZGlkb3MgcG9yIG1vdGl2byBcdTIwMTQgXHUwMEZBbHRpbW9zIDEyIG1lc2VzJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHNlcnZpY2VfZGFzaGJvYXJkOiB7XG4gICAgICBsYWJlbDogJ1NlcnZpY2lvIGFsIGNsaWVudGUnLFxuICAgICAgZGVzY3JpcHRpb246ICdDYXJnYSBkZSBjYXNvcywgc2FsdWQgZGVsIFNMQSB5IHJlbmRpbWllbnRvIGRlIHJlc29sdWNpXHUwMEYzbicsXG4gICAgICB3aWRnZXRzOiB7XG4gICAgICAgIG9wZW5fY2FzZXM6IHsgdGl0bGU6ICdDYXNvcyBhYmllcnRvcycsIGRlc2NyaXB0aW9uOiAnQ2Fzb3MgcXVlIGFcdTAwRkFuIG5vIHNlIGhhbiBjZXJyYWRvJyB9LFxuICAgICAgICBjcml0aWNhbF9jYXNlczogeyB0aXRsZTogJ0Nhc29zIGNyXHUwMEVEdGljb3MnLCBkZXNjcmlwdGlvbjogJ0Nhc29zIGFiaWVydG9zIG1hcmNhZG9zIGNvbW8gcHJpb3JpZGFkIGNyXHUwMEVEdGljYScgfSxcbiAgICAgICAgYXZnX3Jlc29sdXRpb25fdGltZTogeyB0aXRsZTogJ1RpZW1wbyBtZWRpbyBkZSByZXNvbHVjaVx1MDBGM24nLCBkZXNjcmlwdGlvbjogJ1RpZW1wbyBtZWRpbyBoYXN0YSBlbCBjaWVycmUsIGVuIGhvcmFzJyB9LFxuICAgICAgICBzbGFfdmlvbGF0aW9uczogeyB0aXRsZTogJ0luY3VtcGxpbWllbnRvcyBkZSBTTEEnLCBkZXNjcmlwdGlvbjogJ0Nhc29zIHF1ZSBpbmN1bXBsaWVyb24gc3UgU0xBJyB9LFxuICAgICAgICBjYXNlc19ieV9zdGF0dXM6IHsgdGl0bGU6ICdDYXNvcyBwb3IgZXN0YWRvJywgZGVzY3JpcHRpb246ICdEaXN0cmlidWNpXHUwMEYzbiBkZSBsYSBjYXJnYSBhIGxvIGxhcmdvIGRlbCBwaXBlbGluZScgfSxcbiAgICAgICAgY2FzZXNfYnlfcHJpb3JpdHk6IHsgdGl0bGU6ICdDYXNvcyBwb3IgcHJpb3JpZGFkJywgZGVzY3JpcHRpb246ICdNZXpjbGEgZGUgY2Fzb3MgYWJpZXJ0b3MgcG9yIHVyZ2VuY2lhJyB9LFxuICAgICAgICBjYXNlc19ieV9vcmlnaW46IHsgdGl0bGU6ICdDYXNvcyBwb3Igb3JpZ2VuJywgZGVzY3JpcHRpb246ICdEZSBkXHUwMEYzbmRlIHByb3ZpZW5lbiBudWVzdHJvcyBjYXNvcycgfSxcbiAgICAgICAgZGFpbHlfY2FzZV92b2x1bWU6IHsgdGl0bGU6ICdWb2x1bWVuIGRpYXJpbyBkZSBjYXNvcycsIGRlc2NyaXB0aW9uOiAnQ2Fzb3MgbnVldm9zIGNyZWFkb3MgZW4gbG9zIFx1MDBGQWx0aW1vcyAzMCBkXHUwMEVEYXMnIH0sXG4gICAgICAgIHNsYV9jb21wbGlhbmNlX2dhdWdlOiB7IHRpdGxlOiAnQ3VtcGxpbWllbnRvIGRlIFNMQScsIGRlc2NyaXB0aW9uOiAnUG9yY2VudGFqZSBkZSBjYXNvcyByZXN1ZWx0b3MgZGVudHJvIGRlbCBTTEEgZW4gZXN0ZSBwZXJcdTAwRURvZG8nIH0sXG4gICAgICAgIGtiX2RlZmxlY3Rpb25fcmF0ZTogeyB0aXRsZTogJ1Rhc2EgZGUgRGVzdlx1MDBFRG8gcG9yIEtCJywgZGVzY3JpcHRpb246ICdQcm9wb3JjaVx1MDBGM24gZGUgY2Fzb3MgY2VycmFkb3MgcmVzdWVsdG9zIGNvbiB1biBhcnRcdTAwRURjdWxvIGRlIGxhIGJhc2UgZGUgY29ub2NpbWllbnRvJyB9LFxuICAgICAgICBrYl9yZXNvbHZlZF9jYXNlczogeyB0aXRsZTogJ1Jlc3VlbHRvcyBwb3IgS0InLCBkZXNjcmlwdGlvbjogJ0Nhc29zIGNlcnJhZG9zIHF1ZSBzZVx1MDBGMWFsYW4gZWwgYXJ0XHUwMEVEY3VsbyBxdWUgbG9zIHJlc29sdmlcdTAwRjMnIH0sXG4gICAgICAgIGNsb3NlZF9jYXNlc190b3RhbDogeyB0aXRsZTogJ0Nhc29zIENlcnJhZG9zJywgZGVzY3JpcHRpb246ICdFbCBkZW5vbWluYWRvciBkZSBsYSB0YXNhIGRlIGRlc3ZcdTAwRURvJyB9LFxuICAgICAgICB0b3BfcmVzb2x2aW5nX2FydGljbGVzOiB7IHRpdGxlOiAnQXJ0XHUwMEVEY3Vsb3MgcXVlIE1cdTAwRTFzIFJlc3VlbHZlbicsIGRlc2NyaXB0aW9uOiAnQXJ0XHUwMEVEY3Vsb3MgZGUgbGEgYmFzZSBkZSBjb25vY2ltaWVudG8gb3JkZW5hZG9zIHBvciBsb3MgY2Fzb3MgY2VycmFkb3MgcXVlIHJlc29sdmllcm9uJyB9LFxuICAgICAgICBteV9vcGVuX2Nhc2VzX2J5X3ByaW9yaXR5OiB7IHRpdGxlOiAnTWlzIGNhc29zIGFiaWVydG9zIHBvciBwcmlvcmlkYWQnLCBkZXNjcmlwdGlvbjogJ1R1cyBjYXNvcyBhYmllcnRvcyB5IHN1IHRhc2EgZGUgaW5jdW1wbGltaWVudG8gZGUgU0xBLCBkZXNnbG9zYWRvcyBwb3IgcHJpb3JpZGFkJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAvLyBgdGl0bGVgIC8gYHN1YnRpdGxlYCBzb24gbGFzIHByb3BpZWRhZGVzIGRlbCBjb21wb25lbnRlIGBwYWdlOmhlYWRlcmAuXG4gIC8vIExvcyBtYXJjYWRvcmVzIGB7XHUyMDI2fWAgc2Ugc3VzdGl0dXllbiBzb2JyZSBsYSBjYWRlbmEgVFJBRFVDSURBLCBhc1x1MDBFRCBxdWUgZWxcbiAgLy8gdG9rZW4gZGViZSBjb25zZXJ2YXJzZSB0YWwgY3VhbDogdHJhZHVjaWRvLCBubyByZXN1ZWx2ZSB5IHNlIHZlIHZhY1x1MDBFRG8uXG4gIGRhdGFzZXRzOiB7XG4gICAgYWNjb3VudF9tZXRyaWNzOiB7XG4gICAgICBsYWJlbDogJ01cdTAwRTl0cmljYXMgZGUgY3VlbnRhcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NhcGEgc2VtXHUwMEUxbnRpY2EgcGFyYSBlbCByZWN1ZW50byBkZSBjdWVudGFzIHBvciBzZWN0b3IgeSB0aXBvJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgaW5kdXN0cnk6IHtcbiAgICAgICAgICBsYWJlbDogJ1NlY3RvcicsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1RpcG8nLFxuICAgICAgICB9LFxuICAgICAgICBjcmVhdGVkX2F0OiB7XG4gICAgICAgICAgbGFiZWw6ICdDcmVhZG8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGFjY291bnRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0N1ZW50YXMnLFxuICAgICAgICB9LFxuICAgICAgICBhbm51YWxfcmV2ZW51ZV9zdW06IHtcbiAgICAgICAgICBsYWJlbDogJ0luZ3Jlc29zIGFudWFsZXMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNhc2VfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdNXHUwMEU5dHJpY2FzIGRlIGNhc29zJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2FwYSBzZW1cdTAwRTFudGljYSBwYXJhIGVsIHJlY3VlbnRvIGRlIGNhc29zLCBlbCB0aWVtcG8gZGUgcmVzb2x1Y2lcdTAwRjNuIHkgZWwgU0xBJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgY3JlYXRlZF9hdDoge1xuICAgICAgICAgIGxhYmVsOiAnQ3JlYWRvJyxcbiAgICAgICAgfSxcbiAgICAgICAgb3JpZ2luOiB7XG4gICAgICAgICAgbGFiZWw6ICdPcmlnZW4nLFxuICAgICAgICB9LFxuICAgICAgICBwcmlvcml0eToge1xuICAgICAgICAgIGxhYmVsOiAnUHJpb3JpZGFkJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZWRfYXJ0aWNsZToge1xuICAgICAgICAgIGxhYmVsOiAnQXJ0XHUwMEVEY3VsbyBkZSByZXNvbHVjaVx1MDBGM24nLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXM6IHtcbiAgICAgICAgICBsYWJlbDogJ0VzdGFkbycsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1RpcG8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGF2Z19yZXNvbHV0aW9uOiB7XG4gICAgICAgICAgbGFiZWw6ICdSZXNvbHVjaVx1MDBGM24gbWVkaWEgKGgpJyxcbiAgICAgICAgfSxcbiAgICAgICAgYXZnX3NsYV92aW9sYXRlZDoge1xuICAgICAgICAgIGxhYmVsOiAnVGFzYSBkZSBpbmN1bXBsaW1pZW50byBkZWwgU0xBJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FzZV9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnQ2Fzb3MnLFxuICAgICAgICB9LFxuICAgICAgICBjbG9zZWRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0Nhc29zIGNlcnJhZG9zJyxcbiAgICAgICAgfSxcbiAgICAgICAga2JfZGVmbGVjdGlvbl9yYXRlOiB7XG4gICAgICAgICAgbGFiZWw6ICdUYXNhIGRlIGRlc3ZcdTAwRURvIHBvciBiYXNlIGRlIGNvbm9jaW1pZW50bycsXG4gICAgICAgIH0sXG4gICAgICAgIGtiX3Jlc29sdmVkX2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdSZXN1ZWx0b3MgcG9yIGJhc2UgZGUgY29ub2NpbWllbnRvJyxcbiAgICAgICAgfSxcbiAgICAgICAgc2xhX2NvbXBsaWFuY2VfcmF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnVGFzYSBkZSBjdW1wbGltaWVudG8gZGVsIFNMQScsXG4gICAgICAgIH0sXG4gICAgICAgIHNsYV9tZXRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0Nhc29zIGRlbnRybyBkZWwgU0xBJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb250YWN0X21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnTVx1MDBFOXRyaWNhcyBkZSBjb250YWN0b3MnLFxuICAgICAgZGVzY3JpcHRpb246ICdDYXBhIHNlbVx1MDBFMW50aWNhIHBhcmEgZWwgcmVjdWVudG8gZGUgY29udGFjdG9zJyxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGNvbnRhY3RfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0NvbnRhY3RvcycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZXZlbnRfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdNXHUwMEU5dHJpY2FzIGRlIGFjdGl2aWRhZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NhcGEgc2VtXHUwMEUxbnRpY2EgcGFyYSByZXVuaW9uZXMsIGxsYW1hZGFzIHkgcmVjZW5jaWEgZGUgaW50ZXJhY2NpXHUwMEYzbicsXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIG93bmVyOiB7XG4gICAgICAgICAgbGFiZWw6ICdQcm9waWV0YXJpbycsXG4gICAgICAgIH0sXG4gICAgICAgIHJlbGF0ZWRfdG9fdHlwZToge1xuICAgICAgICAgIGxhYmVsOiAnUmVsYWNpb25hZG8gY29uJyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhcnRfZGF0ZXRpbWU6IHtcbiAgICAgICAgICBsYWJlbDogJ1NlbWFuYSBkZSBhY3RpdmlkYWQnLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXM6IHtcbiAgICAgICAgICBsYWJlbDogJ0VzdGFkbycsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICBsYWJlbDogJ1RpcG8gZGUgYWN0aXZpZGFkJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBhdmdfbWludXRlczoge1xuICAgICAgICAgIGxhYmVsOiAnRHVyYWNpXHUwMEYzbiBtZWRpYScsXG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50X2NvdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdBY3RpdmlkYWRlcycsXG4gICAgICAgIH0sXG4gICAgICAgIHRvdGFsX21pbnV0ZXM6IHtcbiAgICAgICAgICBsYWJlbDogJ01pbnV0b3MnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGZvcmVjYXN0X21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnTVx1MDBFOXRyaWNhcyBkZSBwcmV2aXNpXHUwMEYzbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NhcGEgc2VtXHUwMEUxbnRpY2EgcGFyYSBjdW90YSwgY3VtcGxpbWllbnRvIHkgY29iZXJ0dXJhIGRlIHBpcGVsaW5lIHBvciBwcm9waWV0YXJpbycsXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIG93bmVyOiB7XG4gICAgICAgICAgbGFiZWw6ICdQcm9waWV0YXJpbycsXG4gICAgICAgIH0sXG4gICAgICAgIHBlcmlvZDoge1xuICAgICAgICAgIGxhYmVsOiAnVGlwbyBkZSBwZXJpb2RvJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGVyaW9kX2xhYmVsOiB7XG4gICAgICAgICAgbGFiZWw6ICdQZXJpb2RvJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGVyaW9kX3N0YXJ0OiB7XG4gICAgICAgICAgbGFiZWw6ICdJbmljaW8gZGVsIHBlcmlvZG8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGF0dGFpbm1lbnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0N1bXBsaW1pZW50bycsXG4gICAgICAgIH0sXG4gICAgICAgIGNsb3NlZF9zdW06IHtcbiAgICAgICAgICBsYWJlbDogJ0NlcnJhZG8nLFxuICAgICAgICB9LFxuICAgICAgICBjb21taXRfc3VtOiB7XG4gICAgICAgICAgbGFiZWw6ICdDb21wcm9tZXRpZG8nLFxuICAgICAgICB9LFxuICAgICAgICBwaXBlbGluZV9zdW06IHtcbiAgICAgICAgICBsYWJlbDogJ1BpcGVsaW5lJyxcbiAgICAgICAgfSxcbiAgICAgICAgcXVvdGFfc3VtOiB7XG4gICAgICAgICAgbGFiZWw6ICdDdW90YScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGVhZF9tZXRyaWNzOiB7XG4gICAgICBsYWJlbDogJ01cdTAwRTl0cmljYXMgZGUgcHJvc3BlY3RvcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NhcGEgc2VtXHUwMEUxbnRpY2EgcGFyYSBlbCByZWN1ZW50byBkZSBwcm9zcGVjdG9zJyxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgY3JlYXRlZF9hdDoge1xuICAgICAgICAgIGxhYmVsOiAnQ3JlYWRvJyxcbiAgICAgICAgfSxcbiAgICAgICAgbGFzdF9jb250YWN0ZWRfZGF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnXHUwMERBbHRpbW8gY29udGFjdG8nLFxuICAgICAgICB9LFxuICAgICAgICBsZWFkX3NvdXJjZToge1xuICAgICAgICAgIGxhYmVsOiAnT3JpZ2VuJyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgbGFiZWw6ICdFc3RhZG8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lYXN1cmVzOiB7XG4gICAgICAgIGxlYWRfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1Byb3NwZWN0b3MnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG9wcG9ydHVuaXR5X21ldHJpY3M6IHtcbiAgICAgIGxhYmVsOiAnTVx1MDBFOXRyaWNhcyBkZSBvcG9ydHVuaWRhZGVzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2FwYSBzZW1cdTAwRTFudGljYSBwYXJhIGVsIHJlY3VlbnRvIHkgbG9zIGltcG9ydGVzIGRlbCBwaXBlbGluZSBkZSB2ZW50YXMnLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBhY2NvdW50X2luZHVzdHJ5OiB7XG4gICAgICAgICAgbGFiZWw6ICdTZWN0b3IgZGUgbGEgY3VlbnRhJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VfZGF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnRmVjaGEgZGUgY2llcnJlJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VfcXVhcnRlcjoge1xuICAgICAgICAgIGxhYmVsOiAnVHJpbWVzdHJlIGRlIGNpZXJyZScsXG4gICAgICAgIH0sXG4gICAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiB7XG4gICAgICAgICAgbGFiZWw6ICdDYXRlZ29yXHUwMEVEYSBkZSBwcmV2aXNpXHUwMEYzbicsXG4gICAgICAgIH0sXG4gICAgICAgIGxlYWRfc291cmNlOiB7XG4gICAgICAgICAgbGFiZWw6ICdPcmlnZW4gZGVsIHByb3NwZWN0bycsXG4gICAgICAgIH0sXG4gICAgICAgIGxvc3NfcmVhc29uOiB7XG4gICAgICAgICAgbGFiZWw6ICdNb3Rpdm8gZGUgcFx1MDBFOXJkaWRhJyxcbiAgICAgICAgfSxcbiAgICAgICAgb3duZXI6IHtcbiAgICAgICAgICBsYWJlbDogJ1Byb3BpZXRhcmlvJyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhZ2U6IHtcbiAgICAgICAgICBsYWJlbDogJ0V0YXBhJyxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZToge1xuICAgICAgICAgIGxhYmVsOiAnVGlwbyBkZSBuZWdvY2lvJyxcbiAgICAgICAgfSxcbiAgICAgICAgd2luX3JlYXNvbjoge1xuICAgICAgICAgIGxhYmVsOiAnTW90aXZvIGRlIGdhbmFuY2lhJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBhdmdfYW1vdW50OiB7XG4gICAgICAgICAgbGFiZWw6ICdUYW1hXHUwMEYxbyBtZWRpbyBkZWwgbmVnb2NpbycsXG4gICAgICAgIH0sXG4gICAgICAgIGF2Z19wcm9iYWJpbGl0eToge1xuICAgICAgICAgIGxhYmVsOiAnUHJvYmFiaWxpZGFkIG1lZGlhJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVjaWRlZF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnTmVnb2Npb3MgcmVzdWVsdG9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgbG9zdF9hbW91bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0luZ3Jlc29zIHBlcmRpZG9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgbG9zdF9jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnTmVnb2Npb3MgcGVyZGlkb3MnLFxuICAgICAgICB9LFxuICAgICAgICBvcHBfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ09wb3J0dW5pZGFkZXMnLFxuICAgICAgICB9LFxuICAgICAgICB0b3RhbF9hbW91bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0ltcG9ydGUgdG90YWwnLFxuICAgICAgICB9LFxuICAgICAgICB3aW5fcmF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnVGFzYSBkZSBnYW5hbmNpYScsXG4gICAgICAgIH0sXG4gICAgICAgIHdvbl9hbW91bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0luZ3Jlc29zIGdhbmFkb3MnLFxuICAgICAgICB9LFxuICAgICAgICB3b25fY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ05lZ29jaW9zIGdhbmFkb3MnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHByb2R1Y3RfbWV0cmljczoge1xuICAgICAgbGFiZWw6ICdNXHUwMEU5dHJpY2FzIGRlIHByb2R1Y3RvcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NhcGEgc2VtXHUwMEUxbnRpY2EgcGFyYSBlbCByZWN1ZW50byBkZWwgY2F0XHUwMEUxbG9nbyB5IGVsIHByZWNpbyBkZSBsaXN0YScsXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIGNhdGVnb3J5OiB7XG4gICAgICAgICAgbGFiZWw6ICdDYXRlZ29yXHUwMEVEYScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbWVhc3VyZXM6IHtcbiAgICAgICAgbGlzdF9wcmljZV9zdW06IHtcbiAgICAgICAgICBsYWJlbDogJ1ByZWNpbyBkZSBsaXN0YSB0b3RhbCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByb2R1Y3RfY291bnQ6IHtcbiAgICAgICAgICBsYWJlbDogJ1Byb2R1Y3RvcycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgdGFza19tZXRyaWNzOiB7XG4gICAgICBsYWJlbDogJ01cdTAwRTl0cmljYXMgZGUgdGFyZWFzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQ2FwYSBzZW1cdTAwRTFudGljYSBwYXJhIGxhIGNhcmdhIGRlIHRyYWJham8geSBsYSBmaW5hbGl6YWNpXHUwMEYzbiBkZSB0YXJlYXMnLFxuICAgICAgZGltZW5zaW9uczoge1xuICAgICAgICBkdWVfZGF0ZToge1xuICAgICAgICAgIGxhYmVsOiAnRmVjaGEgZGUgdmVuY2ltaWVudG8nLFxuICAgICAgICB9LFxuICAgICAgICBpc19jb21wbGV0ZWQ6IHtcbiAgICAgICAgICBsYWJlbDogJ0NvbXBsZXRhZGEnLFxuICAgICAgICB9LFxuICAgICAgICBpc19vdmVyZHVlOiB7XG4gICAgICAgICAgbGFiZWw6ICdWZW5jaWRhJyxcbiAgICAgICAgfSxcbiAgICAgICAgcHJpb3JpdHk6IHtcbiAgICAgICAgICBsYWJlbDogJ1ByaW9yaWRhZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByaW9yaXR5X3Jhbms6IHtcbiAgICAgICAgICBsYWJlbDogJ1VyZ2VuY2lhJyxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzOiB7XG4gICAgICAgICAgbGFiZWw6ICdFc3RhZG8nLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiB7XG4gICAgICAgICAgbGFiZWw6ICdUaXBvJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWFzdXJlczoge1xuICAgICAgICBhdmdfcHJvZ3Jlc3M6IHtcbiAgICAgICAgICBsYWJlbDogJ1Byb2dyZXNvIG1lZGlvJyxcbiAgICAgICAgfSxcbiAgICAgICAgdGFza19jb3VudDoge1xuICAgICAgICAgIGxhYmVsOiAnVGFyZWFzJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgcGFnZXM6IHtcbiAgICBhY2NvdW50X2RldGFpbF9wYWdlOiB7XG4gICAgICBsYWJlbDogJ0RldGFsbGUgZGUgQ3VlbnRhJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUFx1MDBFMWdpbmEgZGUgcmVnaXN0cm8gZGUgY3VlbnRhIHBvciBzbG90czogY2FiZWNlcmEgcGVyc29uYWxpemFkYSArIGZlZWQgZGUgZGlzY3VzaVx1MDBGM24gcGVybWFuZW50ZS4nLFxuICAgICAgdGl0bGU6ICd7bmFtZX0nLFxuICAgICAgc3VidGl0bGU6ICd7aW5kdXN0cnl9IFx1MDBCNyB7dHlwZX0nLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBhY2NvdW50X2NoYXR0ZXI6IHsgbGFiZWw6ICdEaXNjdXNpXHUwMEYzbicgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhY2NvdW50X3dvcmtiZW5jaDoge1xuICAgICAgbGFiZWw6ICdNZXNhIGRlIFRyYWJham8gZGUgQ3VlbnRhcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0xpc3RhIGRlIGN1ZW50YXMgY3VyYWRhIHBhcmEgZWwgZXF1aXBvIGNvbWVyY2lhbDogc29sbyBmaWx0cm9zIHJcdTAwRTFwaWRvcywgc2luIGdlc3RpXHUwMEYzbiBkZSB2aXN0YXMuJyxcbiAgICB9LFxuICAgIGFwcF9sYXVuY2hlcl9wYWdlOiB7XG4gICAgICBsYWJlbDogJ0xhbnphZG9yIGRlIEFwbGljYWNpb25lcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1B1bnRvIGRlIGFjY2VzbyBjZW50cmFsIGEgdG9kYXMgbGFzIGFwbGljYWNpb25lcycsXG4gICAgICBzdWJ0aXRsZTogJ1NlbGVjY2lvbmUgdW5hIGFwbGljYWNpXHUwMEYzbiBwYXJhIGVtcGV6YXInLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBhcHBfc2VhcmNoOiB7IGxhYmVsOiAnQnVzY2FyIEFwbGljYWNpb25lcycgfSxcbiAgICAgICAgYXBwX2dyaWQ6IHsgbGFiZWw6ICdDdWFkclx1MDBFRGN1bGEgZGUgQXBsaWNhY2lvbmVzJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNhc2VfZGV0YWlsX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnRGV0YWxsZSBkZSBDYXNvJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUFx1MDBFMWdpbmEgZGUgY2FzbyBwYXJhIGVsIGFnZW50ZSBkZSBzZXJ2aWNpbzogZGF0b3MgZGVzdGFjYWRvcywgcHJvZ3Jlc28gZGVsIFNMQSwgZGV0YWxsZXMgeSBjcm9ub2xvZ1x1MDBFRGEgZGUgYWN0aXZpZGFkLicsXG4gICAgICB0aXRsZTogJ3tjYXNlX251bWJlcn0gXHUwMEI3IHtzdWJqZWN0fScsXG4gICAgICBzdWJ0aXRsZTogJ3tjcm1fYWNjb3VudH0nLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBjYXNlX2hpZ2hsaWdodHM6IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIENsYXZlJyB9LFxuICAgICAgICBjYXNlX3N0YXR1c19wYXRoOiB7IGxhYmVsOiAnUHJvZ3Jlc28gZGVsIEVzdGFkbyBkZWwgQ2FzbycgfSxcbiAgICAgICAgY2FzZV9kZXRhaWxzOiB7IGxhYmVsOiAnRGV0YWxsZXMgZGVsIENhc28nIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGVhZF9kZXRhaWxfcGFnZToge1xuICAgICAgbGFiZWw6ICdEZXRhbGxlIGRlIFByb3NwZWN0bycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1BcdTAwRTFnaW5hIGNvbXBsZXRhIGRlIGRldGFsbGUgZGVsIHByb3NwZWN0bywgY29uIGRhdG9zIGRlc3RhY2Fkb3MsIGRldGFsbGVzIGUgaW5mb3JtYWNpXHUwMEYzbiByZWxhY2lvbmFkYScsXG4gICAgICB0aXRsZTogJ3tmaXJzdF9uYW1lfSB7bGFzdF9uYW1lfScsXG4gICAgICBzdWJ0aXRsZTogJ3tjb21wYW55fScsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIGxlYWRfZHVwbGljYXRlX2FsZXJ0X2NvbmZpcm1lZDogeyBsYWJlbDogJ0F2aXNvIGRlIGR1cGxpY2FkbyBjb25maXJtYWRvJyB9LFxuICAgICAgICBsZWFkX2R1cGxpY2F0ZV9hbGVydF9zdXNwZWN0ZWQ6IHsgbGFiZWw6ICdBdmlzbyBkZSBkdXBsaWNhZG8gc29zcGVjaG9zbycgfSxcbiAgICAgICAgbGVhZF9oaWdobGlnaHRzOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBDbGF2ZScgfSxcbiAgICAgICAgbGVhZF9wYXRoOiB7IGxhYmVsOiAnUHJvZ3Jlc28gZGVsIEVzdGFkbyBkZWwgUHJvc3BlY3RvJyB9LFxuICAgICAgICBtYWluX3RhYnM6IHsgbGFiZWw6ICdQZXN0YVx1MDBGMWFzIGRlIEluZm9ybWFjaVx1MDBGM24gZGVsIFByb3NwZWN0bycgfSxcbiAgICAgICAgbGVhZF9kZXRhaWxzOiB7IGxhYmVsOiAnRGV0YWxsZXMgZGVsIFByb3NwZWN0bycgfSxcbiAgICAgICAgcmVsYXRlZF9hY2NvcmRpb246IHsgbGFiZWw6ICdSZWdpc3Ryb3MgUmVsYWNpb25hZG9zJyB9LFxuICAgICAgICByZWxhdGVkX3Rhc2tzOiB7IHRpdGxlOiAnVGFyZWFzIEFiaWVydGFzJywgbGFiZWw6ICdUYXJlYXMnIH0sXG4gICAgICAgIGxlYWRfYWN0aXZpdHk6IHsgbGFiZWw6ICdDcm9ub2xvZ1x1MDBFRGEgZGUgQWN0aXZpZGFkJyB9LFxuICAgICAgICBsZWFkX2hpc3Rvcnk6IHsgbGFiZWw6ICdIaXN0b3JpYWwgZGUgQ2FtcG9zJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIG9wcG9ydHVuaXR5X2RldGFpbF9wYWdlOiB7XG4gICAgICBsYWJlbDogJ0RldGFsbGUgZGUgT3BvcnR1bmlkYWQnLFxuICAgICAgZGVzY3JpcHRpb246ICdQXHUwMEUxZ2luYSBjb21wbGV0YSBkZSBkZXRhbGxlIGRlIGxhIG9wb3J0dW5pZGFkLCBjb24gcmVjb3JyaWRvIGRlIGV0YXBhcywgZGF0b3MgZGVzdGFjYWRvcywgZGV0YWxsZXMgeSBsaXN0YXMgcmVsYWNpb25hZGFzJyxcbiAgICAgIHRpdGxlOiAne25hbWV9JyxcbiAgICAgIHN1YnRpdGxlOiAne2NybV9hY2NvdW50fScsXG4gICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgIG9wcF9oaWdobGlnaHRzOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBDbGF2ZScgfSxcbiAgICAgICAgb3BwX3N0YWdlX3BhdGg6IHsgbGFiZWw6ICdQcm9ncmVzbyBkZSBFdGFwYSBkZSBsYSBPcG9ydHVuaWRhZCcgfSxcbiAgICAgICAgb3BwX2RldGFpbHM6IHsgbGFiZWw6ICdEZXRhbGxlcyBkZSBsYSBPcG9ydHVuaWRhZCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzYWxlc19ob21lX3BhZ2U6IHtcbiAgICAgIGxhYmVsOiAnSW5pY2lvIGRlIFZlbnRhcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1BcdTAwRTFnaW5hIGRlIGluaWNpbyBkZWwgZXF1aXBvIGNvbWVyY2lhbCBjb24gbVx1MDBFOXRyaWNhcyBjbGF2ZSB5IGFjY2lvbmVzIHJcdTAwRTFwaWRhcycsXG4gICAgICB0aXRsZTogJ1BhbmVsIGRlIFZlbnRhcycsXG4gICAgICBzdWJ0aXRsZTogJ0JpZW52ZW5pZG8gZGUgbnVldm8nLFxuICAgICAgY29tcG9uZW50czoge1xuICAgICAgICBrcGlfcmV2ZW51ZV93b246IHtcbiAgICAgICAgICBsYWJlbDogJ0luZ3Jlc29zIChnYW5hZG9zKScsXG4gICAgICAgIH0sXG4gICAgICAgIGtwaV9kZWFsc193b246IHtcbiAgICAgICAgICBsYWJlbDogJ05lZ29jaW9zIGdhbmFkb3MnLFxuICAgICAgICB9LFxuICAgICAgICBrcGlfcGlwZWxpbmVfdmFsdWU6IHtcbiAgICAgICAgICBsYWJlbDogJ1ZhbG9yIGRlbCBwaXBlbGluZScsXG4gICAgICAgIH0sXG4gICAgICAgIGtwaV9vcGVuX2xlYWRzOiB7XG4gICAgICAgICAgbGFiZWw6ICdQcm9zcGVjdG9zIGFiaWVydG9zJyxcbiAgICAgICAgfSxcbiAgICAgICAgaG9tZV91cGNvbWluZ19ldmVudHM6IHtcbiAgICAgICAgICBsYWJlbDogJ1x1RDgzRFx1RENDNSBQclx1MDBGM3hpbW9zIFx1MDBCNyBNXHUwMEUxcyBjZXJjYW5vcyBwcmltZXJvJyxcbiAgICAgICAgfSxcbiAgICAgICAgcXVpY2tfY3JlYXRlOiB7IHRpdGxlOiAnQ3JlYWNpXHUwMEYzbiBSXHUwMEUxcGlkYScsIGxhYmVsOiAnQ3JlYWNpXHUwMEYzbiBSXHUwMEUxcGlkYScgfSxcbiAgICAgICAga2V5X21ldHJpY3M6IHsgdGl0bGU6ICdJbmRpY2Fkb3JlcyBDbGF2ZSBkZSBSZW5kaW1pZW50bycsIGxhYmVsOiAnTVx1MDBFOXRyaWNhcyBDbGF2ZScgfSxcbiAgICAgICAgaG9tZV90YWJzOiB7IGxhYmVsOiAnUGVzdGFcdTAwRjFhcyBkZSBJbmljaW8nIH0sXG4gICAgICAgIGhvbWVfbXlfbGVhZHM6IHsgbGFiZWw6ICdNaXMgUHJvc3BlY3RvcycgfSxcbiAgICAgICAgaG9tZV9teV9kZWFsczogeyBsYWJlbDogJ01pcyBOZWdvY2lvcyBBYmllcnRvcycgfSxcbiAgICAgICAgaG9tZV9teV90YXNrczogeyBsYWJlbDogJ01pcyBUYXJlYXMgQWJpZXJ0YXMnIH0sXG4gICAgICAgIGFpX2JyaWVmaW5nOiB7XG4gICAgICAgICAgdGl0bGU6ICdQcmVnXHUwMEZBbnRhbGUgYWwgQXNpc3RlbnRlIGRlIElBJyxcbiAgICAgICAgICBsYWJlbDogJ0hveSBjb24gZWwgQXNpc3RlbnRlIGRlIElBJyxcbiAgICAgICAgfSxcbiAgICAgICAgdXBjb21pbmdfZXZlbnRzOiB7IHRpdGxlOiAnUHJcdTAwRjN4aW1vcyBFdmVudG9zJywgbGFiZWw6ICdQclx1MDBGM3hpbW9zIEV2ZW50b3MnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgdXRpbGl0eV9iYXJfcGFnZToge1xuICAgICAgbGFiZWw6ICdCYXJyYSBkZSBVdGlsaWRhZGVzJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQmFycmEgZGUgYWNjZXNvIHJcdTAwRTFwaWRvIGNvbiBoZXJyYW1pZW50YXMgZmxvdGFudGVzJyxcbiAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgbm90aWZpY2F0aW9uc19wYW5lbDogeyBsYWJlbDogJ05vdGlmaWNhY2lvbmVzJyB9LFxuICAgICAgICBxdWlja19ub3RlczogeyB0aXRsZTogJ05vdGFzIFJcdTAwRTFwaWRhcycsIGxhYmVsOiAnTm90YXMgUlx1MDBFMXBpZGFzJyB9LFxuICAgICAgICBxdWlja19zZWFyY2g6IHsgbGFiZWw6ICdCXHUwMEZBc3F1ZWRhIFJcdTAwRTFwaWRhJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuICAvLyBTY3JlZW4tZmxvdyBjb3B5ICgjMTIxMCwgIzE5NzUpLiBLZXllZCBgZmxvd3MuPGZsb3c+LmxhYmVsYCxcbiAgLy8gYHNjcmVlbnMuPG5vZGU+LnRpdGxlYCBhbmQgYHNjcmVlbnMuPG5vZGU+LmZpZWxkcy48ZmllbGQ+LntsYWJlbCxwbGFjZWhvbGRlcn1gXG4gIC8vIFx1MjAxNCB0aGUga2V5cyBgb3MgbGludGAncyBgaTE4bi9taXNzaW5nLWZsb3dgIG5hbWVzLCByZWFkIGJ5IHRoZSBjb25zb2xlJ3NcbiAgLy8gZmxvdyBydW5uZXIgc2luY2UgQG9iamVjdHN0YWNrIDE3LjcuMCAodGhlIHNwZWMncyBgZmxvd3NgIGxpdmVuZXNzIHJvdyBpc1xuICAvLyBgbGl2ZWAgdGhlcmUpLiBBIHNjcmVlbiB3aXRoIG5vIGF1dGhvcmVkIGB0aXRsZWAgc2hvd3MgaXRzIGZsb3cncyBsYWJlbCBpblxuICAvLyBldmVyeSBsb2NhbGUsIHNvIGVhY2ggYHNjcmVlbl8xLnRpdGxlYCByZXBlYXRzIHRoZSBmbG93IGxhYmVsLiBTaW5jZVxuICAvLyAxOC4wLjAtbmV4dC4wIHRocmVlIG1vcmUgc3VyZmFjZXMgYXJlIGtleXMgdGhlIGVuZ2luZSByZWFkcyBpbiB0aGUgcnVuJ3NcbiAgLy8gbG9jYWxlLCBhbmQgYGkxOG4vbWlzc2luZy1mbG93YCBuYW1lcyBlYWNoIG1pc3Npbmcgb25lOiBhIHNlbGVjdCBmaWVsZCdzXG4gIC8vIGBvcHRpb25zLjx2YWx1ZT5gICh3b3JkZWQgYXMgdGhlIG9iamVjdCBmaWVsZCdzIG93biBvcHRpb24gaW4gdGhpcyBwYWNrKSxcbiAgLy8gYW4gYXV0aG9yZWQgc2NyZWVuIGBkZXNjcmlwdGlvbmAsIGFuZCBhIHJlZnVzaW5nIGBlbmRgIG5vZGUnc1xuICAvLyBgcmVmdXNhbHMuPG5vZGU+Lm1lc3NhZ2VgLiBBIHRyYW5zbGF0ZWQgZGVzY3JpcHRpb24gb3IgbWVzc2FnZSBpcyBhIHRleHRcbiAgLy8gc2xvdCBsaWtlIHRoZSBvbmUgaXQgdHJhbnNsYXRlcywgc28gYSBob2xlIGluIGl0IGlzIGB7eyB9fWAuXG4gIC8vIFRoZSBkaXNjb3VudCBjZWlsaW5nIGlzIGludGVycG9sYXRlZCBmcm9tIGBRVU9URV9ESVNDT1VOVF9DRUlMSU5HYCwgbmV2ZXJcbiAgLy8gcmV0eXBlZDogdGhlIG51bWJlciBsaXZlcyBpbiBgX3RocmVzaG9sZHMudHNgIGFsb25lICgjMTcxMSkuXG4gIGZsb3dzOiB7XG4gICAgY2FtcGFpZ25fZW5yb2xsbWVudDoge1xuICAgICAgbGFiZWw6ICdJbnNjcmliaXIgbWllbWJyb3MgZW4gbGEgY2FtcGFcdTAwRjFhJyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ0luc2NyaWJpciBtaWVtYnJvcyBlbiBsYSBjYW1wYVx1MDBGMWEnLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgbWVtYmVyU291cmNlOiB7IGxhYmVsOiAnVGlwbyBkZSBtaWVtYnJvIGEgaW5zY3JpYmlyJywgb3B0aW9uczogeyBsZWFkczogJ1Byb3NwZWN0b3MnLCBjb250YWN0czogJ0NvbnRhY3RvcycgfSB9LFxuICAgICAgICAgICAgbGVhZFN0YXR1czogeyBsYWJlbDogJ0luc2NyaWJpciBwcm9zcGVjdG9zIGNvbiBlc3RhZG8nLCBvcHRpb25zOiB7IG5ldzogJ051ZXZvJywgY29udGFjdGVkOiAnQ29udGFjdGFkbycsIHF1YWxpZmllZDogJ0NhbGlmaWNhZG8nIH0gfSxcbiAgICAgICAgICAgIGNvbnRhY3REZXBhcnRtZW50OiB7XG4gICAgICAgICAgICAgIGxhYmVsOiAnSW5zY3JpYmlyIGNvbnRhY3RvcyBkZWwgZGVwYXJ0YW1lbnRvJyxcbiAgICAgICAgICAgICAgb3B0aW9uczogeyBleGVjdXRpdmU6ICdFamVjdXRpdm8nLCBzYWxlczogJ1ZlbnRhcycsIG1hcmtldGluZzogJ01hcmtldGluZycsIGVuZ2luZWVyaW5nOiAnSW5nZW5pZXJcdTAwRURhJywgc3VwcG9ydDogJ1NvcG9ydGUnLCBmaW5hbmNlOiAnRmluYW56YXMnLCBocjogJ1JlY3Vyc29zIEh1bWFub3MnLCBvcGVyYXRpb25zOiAnT3BlcmFjaW9uZXMnIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZXNjYWxhdGVfY2FzZToge1xuICAgICAgbGFiZWw6ICdFc2NhbGFyIENhc28nLFxuICAgICAgc2NyZWVuczogeyBzY3JlZW5fMTogeyB0aXRsZTogJ0VzY2FsYXIgQ2FzbycsIGZpZWxkczogeyByZWFzb246IHsgbGFiZWw6ICdNb3Rpdm8gZGUgRXNjYWxhY2lcdTAwRjNuJyB9IH0gfSB9LFxuICAgIH0sXG4gICAgY2xvc2VfY2FzZToge1xuICAgICAgbGFiZWw6ICdDZXJyYXIgQ2FzbycsXG4gICAgICBzY3JlZW5zOiB7XG4gICAgICAgIHNjcmVlbl8xOiB7XG4gICAgICAgICAgdGl0bGU6ICdDZXJyYXIgQ2FzbycsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICByZXNvbHV0aW9uOiB7IGxhYmVsOiAnUmVzb2x1Y2lcdTAwRjNuJyB9LFxuICAgICAgICAgICAgcmVzb2x2ZWRfYnlfYXJ0aWNsZTogeyBsYWJlbDogJ1Jlc3VlbHRvIGNvbiBhcnRcdTAwRURjdWxvIChvcGNpb25hbCknIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjbGFpbV9jYXNlOiB7XG4gICAgICBsYWJlbDogJ1RvbWFyIENhc28nLFxuICAgICAgc2NyZWVuczoge1xuICAgICAgICBzY3JlZW5fMToge1xuICAgICAgICAgIHRpdGxlOiAnVG9tYXIgQ2FzbycsXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBjbGFpbVN0YXR1czoge1xuICAgICAgICAgICAgICBsYWJlbDogJ0VzdGFkbyBkZSB0cmFiYWpvJyxcbiAgICAgICAgICAgICAgb3B0aW9uczogeyBpbl9wcm9ncmVzczogJ0VuIEN1cnNvJywgd2FpdGluZ19jdXN0b21lcjogJ0VzcGVyYW5kbyBhbCBDbGllbnRlJywgd2FpdGluZ19zdXBwb3J0OiAnRXNwZXJhbmRvIGEgU29wb3J0ZScgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsZWFkX2NvbnZlcnNpb246IHtcbiAgICAgIGxhYmVsOiAnUHJvY2VzbyBkZSBjb252ZXJzaVx1MDBGM24gZGUgcHJvc3BlY3RvJyxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ1Byb2Nlc28gZGUgY29udmVyc2lcdTAwRjNuIGRlIHByb3NwZWN0bycsXG4gICAgICAgICAgLy8gVGhlIGR1cGxpY2F0ZSB3YXJuaW5nJ3MgdGV4dCBpcyBhIHZhcmlhYmxlIHRoZSBmbG93IGFzc2lnbnM7IHRoaXNcbiAgICAgICAgICAvLyBrZXkgY2FuIG9ubHkgY2FycnkgdGhlIGhvbGUgdGhhdCBzaG93cyBpdC5cbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ3t7ZHVwbGljYXRlV2FybmluZ319JyxcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIGNyZWF0ZU9wcG9ydHVuaXR5OiB7IGxhYmVsOiAnXHUwMEJGQ3JlYXIgb3BvcnR1bmlkYWQ/JyB9LFxuICAgICAgICAgICAgb3Bwb3J0dW5pdHlOYW1lOiB7IGxhYmVsOiAnTm9tYnJlIGRlIE9wb3J0dW5pZGFkJyB9LFxuICAgICAgICAgICAgb3Bwb3J0dW5pdHlBbW91bnQ6IHsgbGFiZWw6ICdNb250byBkZSBsYSBPcG9ydHVuaWRhZCcgfSxcbiAgICAgICAgICAgIGNsb3NlRGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIENpZXJyZScgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICByZWZ1c2VfY29uZmlybWVkX2R1cGxpY2F0ZToge1xuICAgICAgICAgIHRpdGxlOiAnQ29udmVyc2lcdTAwRjNuIHJlY2hhemFkYScsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnRWwgRXN0YWRvIGRlbCBEdXBsaWNhZG8gZGUgZXN0ZSBwcm9zcGVjdG8gZXMgQ29uZmlybWFkbzogdW4gcmV2aXNvciBsbyBjb21wYXJcdTAwRjMgY29uIHVuIHJlZ2lzdHJvIGV4aXN0ZW50ZSB5IHJlZ2lzdHJcdTAwRjMgcXVlIGxvIHJlcGl0ZS4gQ29udmVydGlybG8gY3JlYXJcdTAwRURhIHVuYSBzZWd1bmRhIGN1ZW50YSwgY29udGFjdG8geSBvcG9ydHVuaWRhZCBwYXJhIGVsIG1pc21vIGNvbXByYWRvci4gTGEgc2VjY2lcdTAwRjNuIEdlc3RpXHUwMEYzbiBkZSBEdXBsaWNhZG9zIGRlIGVzdGUgcHJvc3BlY3RvIGluZGljYSBlbCByZWdpc3RybyBxdWUgc2UgY29uc2VydmE7IGRlc2NhbGlmaXF1ZSBlc3RlIHByb3NwZWN0byBjb21vIGR1cGxpY2Fkby4gU29sbyB1biByZXZpc29yIHF1ZSBjYW1iaWUgZXNlIHZlcmVkaWN0byB2dWVsdmUgYSBoYWJpbGl0YXIgbGEgY29udmVyc2lcdTAwRjNuLicsXG4gICAgICAgIH0sXG4gICAgICAgIHJlZnVzZV91bmFwcHJvdmVkOiB7XG4gICAgICAgICAgdGl0bGU6ICdDb252ZXJzaVx1MDBGM24gcmVjaGF6YWRhJyxcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICdFc3RlIHByb3NwZWN0byBubyBoYSBzaWRvIGFwcm9iYWRvIHBhcmEgbGEgY29udmVyc2lcdTAwRjNuLiBVbiBhcHJvYmFkb3IgZGViZSBkYXJsZSBlbCB2aXN0byBidWVubyBhbnRlcyBkZSBxdWUgcHVlZGEgY29udmVydGlyc2UgZW4gdW5hIGN1ZW50YSwgdW4gY29udGFjdG8geSB1bmEgb3BvcnR1bmlkYWQ7IGVsIGNhbXBvIEFwcm9iYWNpXHUwMEYzbiBkZSBDb252ZXJzaVx1MDBGM24gZGVsIHByb3NwZWN0byBtdWVzdHJhIHNpIGxhIGRlY2lzaVx1MDBGM24gc2lndWUgcGVuZGllbnRlIG8gZnVlIHJlY2hhemFkYS4gTWllbnRyYXMgdGFudG8sIHNpZ2EgdHJhYmFqYW5kbyBlbCBwcm9zcGVjdG86IG5hZGEgZGUgXHUwMEU5bCBxdWVkYSBibG9xdWVhZG8uJyxcbiAgICAgICAgfSxcbiAgICAgICAgcmVmdXNlX25vX21hdGNoX2tleToge1xuICAgICAgICAgIHRpdGxlOiAnQ29udmVyc2lcdTAwRjNuIHJlY2hhemFkYScsXG4gICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAnTGEgZW1wcmVzYSBkZSBlc3RlIHByb3NwZWN0byBubyB0aWVuZSBjbGF2ZSBkZSBjb2luY2lkZW5jaWEsIGFzXHUwMEVEIHF1ZSBsYSBjb252ZXJzaVx1MDBGM24gbm8gcHVlZGUgc2FiZXIgYSBxdVx1MDBFOSBjdWVudGEgcGVydGVuZWNlIHkgbm8gbG8gdmEgYSBhZGl2aW5hcjogdW5hIHN1cG9zaWNpXHUwMEYzbiBwb2RyXHUwMEVEYSBhcmNoaXZhciBlbCBjb250YWN0byB5IGxhIG9wb3J0dW5pZGFkIGJham8gb3RybyBjbGllbnRlLiBHdWFyZGFyIGxhIEVtcHJlc2EgZGVsIHByb3NwZWN0byByZWNvbnN0cnV5ZSBsYSBjbGF2ZSwgYXNcdTAwRUQgcXVlIGd1XHUwMEUxcmRlbGEgZGUgbnVldm8geSBsdWVnbyBjb252aVx1MDBFOXJ0YWxvLiBObyBzZSBoYSBjcmVhZG8gbmFkYS4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHNjaGVkdWxlX2ZvbGxvd3VwOiB7XG4gICAgICBsYWJlbDogJ1Byb2dyYW1hciBTZWd1aW1pZW50bycsXG4gICAgICBzY3JlZW5zOiB7XG4gICAgICAgIHNjcmVlbl8xOiB7XG4gICAgICAgICAgdGl0bGU6ICdQcm9ncmFtYXIgU2VndWltaWVudG8nLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgc3ViamVjdDogeyBsYWJlbDogJ1x1MDBCRkN1XHUwMEUxbCBlcyBlbCBzaWd1aWVudGUgcGFzbz8nIH0sXG4gICAgICAgICAgICBkdWVEYXRlOiB7IGxhYmVsOiAnRmVjaGEgTFx1MDBFRG1pdGUnIH0sXG4gICAgICAgICAgICBhY3Rpdml0eVR5cGU6IHtcbiAgICAgICAgICAgICAgbGFiZWw6ICdUaXBvIGRlIEFjdGl2aWRhZCcsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IHsgY2FsbDogJ0xsYW1hZGEnLCBlbWFpbDogJ0VtYWlsJywgbWVldGluZzogJ1JldW5pXHUwMEYzbicsIGZvbGxvd191cDogJ1NlZ3VpbWllbnRvJywgZGVtbzogJ0RlbW9zdHJhY2lcdTAwRjNuJywgb3RoZXI6ICdPdHJvJyB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByaW9yaXR5OiB7IGxhYmVsOiAnUHJpb3JpZGFkJywgb3B0aW9uczogeyBsb3c6ICdCYWphJywgbm9ybWFsOiAnTm9ybWFsJywgaGlnaDogJ0FsdGEnLCB1cmdlbnQ6ICdVcmdlbnRlJyB9IH0sXG4gICAgICAgICAgICBub3RlczogeyBsYWJlbDogJ05vdGFzJyB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgcXVvdGVfZ2VuZXJhdGlvbjoge1xuICAgICAgbGFiZWw6ICdHZW5lcmFyIGNvdGl6YWNpXHUwMEYzbiBkZXNkZSBsYSBvcG9ydHVuaWRhZCcsXG4gICAgICByZWZ1c2FsczogeyByZWZ1c2VfaGVsZDogeyBtZXNzYWdlOiAnUHJpbWVybyB2YSBsYSBhcHJvYmFjaVx1MDBGM24gZGUgY2FsaWZpY2FjaVx1MDBGM246IG1hcnF1ZSBTb2xpY2l0YXIgQXByb2JhY2lcdTAwRjNuIGRlIENhbGlmaWNhY2lcdTAwRjNuLiBObyBzZSBjcmVcdTAwRjMgbmFkYS4nIH0gfSxcbiAgICAgIHNjcmVlbnM6IHtcbiAgICAgICAgc2NyZWVuXzE6IHtcbiAgICAgICAgICB0aXRsZTogJ0dlbmVyYXIgY290aXphY2lcdTAwRjNuIGRlc2RlIGxhIG9wb3J0dW5pZGFkJyxcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIHF1b3RlTmFtZTogeyBsYWJlbDogJ05vbWJyZSBkZSBDb3RpemFjaVx1MDBGM24nIH0sXG4gICAgICAgICAgICBleHBpcmF0aW9uRGF5czogeyBsYWJlbDogJ1ZcdTAwRTFsaWRhIHBvciAoZFx1MDBFRGFzKScgfSxcbiAgICAgICAgICAgIGRpc2NvdW50OiB7IGxhYmVsOiBgRGVzY3VlbnRvICUgKFx1MjI2NCAke1FVT1RFX0RJU0NPVU5UX0NFSUxJTkd9KWAsIHBsYWNlaG9sZGVyOiBgMC0ke1FVT1RFX0RJU0NPVU5UX0NFSUxJTkd9YCB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL19zaGFyZWQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy9fc2hhcmVkLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIEVzcGFcdTAwRjFvbCAoZXMtRVMpIFx1MjAxNCB2YWx1ZXMgc2hhcmVkIGJ5IG1vcmUgdGhhbiBvbmUgcGFydCBvZiB0aGlzIGJ1bmRsZS5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy50c2AuXG4gKlxuICogRXZlcnkgY29uc3RhbnQgaGVyZSBpcyBzcHJlYWQgaW50byBvYmplY3Qgcm93cyB0aGF0IGxpdmUgaW4gTU9SRSBUSEFOIE9ORVxuICogZmFtaWx5IGZpbGUsIHNvIGl0IGNhbm5vdCBzaXQgaW4gYW55IG9uZSBvZiB0aGVtLiBBIHZhbHVlIHVzZWQgYnkgZXhhY3RseVxuICogb25lIGZhbWlseSBsaXZlcyBpbiB0aGF0IGZhbWlseSdzIGZpbGUgaW5zdGVhZCBcdTIwMTQgdGhhdCBzcGxpdCBpcyBtZWNoYW5pY2FsLFxuICogbm90IGEganVkZ2VtZW50IGNhbGwuXG4gKi9cblxuLyoqXG4gKiBGYW1pbGlhIGRlIGFjY2lvbmVzIGRlIGFjdGl2aWRhZCAoIzU5Mik6IGBsb2dfY2FsbGAsIGBsb2dfbWVldGluZ2AgeVxuICogYHNjaGVkdWxlX21lZXRpbmdgIHNlIHJlZ2lzdHJhbiB1bmEgdmV6IFBPUiBPQkpFVE8gKHByb3NwZWN0bywgY29udGFjdG8sXG4gKiBjdWVudGEsIG9wb3J0dW5pZGFkLCBjYXNvKSwgcG9ycXVlIHVuYSBhY2NpXHUwMEYzbiBkZSBzY3JpcHQgc2luIGBvYmplY3ROYW1lYFxuICogcXVlZGEgYmFqbyB1bmEgY2xhdmUgcXVlIGVsIGRlc3BhY2hhZG9yIG51bmNhIGNvbnN1bHRhICgjNTA5KS4gTG9zIHRleHRvcyBzb25cbiAqIGlkXHUwMEU5bnRpY29zIGVuIGxvcyBjaW5jbywgYXNcdTAwRUQgcXVlIHNlIGRlY2xhcmFuIHVuYSB2ZXogYXF1XHUwMEVELlxuICovXG5leHBvcnQgY29uc3QgYWN0aXZpdHlBY3Rpb25zID0ge1xuICBsb2dfY2FsbDoge1xuICAgIGxhYmVsOiAnUmVnaXN0cmFyIGxsYW1hZGEnLFxuICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUwMEExTGxhbWFkYSByZWdpc3RyYWRhIGV4aXRvc2FtZW50ZSEnLFxuICAgIHBhcmFtczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ0FzdW50byBkZSBsYSBsbGFtYWRhJyB9LFxuICAgICAgZHVyYXRpb246IHsgbGFiZWw6ICdEdXJhY2lcdTAwRjNuIChtaW51dG9zKScgfSxcbiAgICAgIGF0dGVuZGVlX2NvbnRhY3RzOiB7IGxhYmVsOiAnQ29udGFjdG9zIHBhcnRpY2lwYW50ZXMnIH0sXG4gICAgICBhdHRlbmRlZV91c2VyczogeyBsYWJlbDogJ1BhcnRpY2lwYW50ZXMgaW50ZXJub3MnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ05vdGFzIGRlIGxhIGxsYW1hZGEnIH0sXG4gICAgfSxcbiAgfSxcbiAgbG9nX21lZXRpbmc6IHtcbiAgICBsYWJlbDogJ1JlZ2lzdHJhciByZXVuaVx1MDBGM24nLFxuICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUwMEExUmV1bmlcdTAwRjNuIHJlZ2lzdHJhZGEgZXhpdG9zYW1lbnRlIScsXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnQXN1bnRvIGRlIGxhIHJldW5pXHUwMEYzbicgfSxcbiAgICAgIGR1cmF0aW9uOiB7IGxhYmVsOiAnRHVyYWNpXHUwMEYzbiAobWludXRvcyknIH0sXG4gICAgICBhdHRlbmRlZV9jb250YWN0czogeyBsYWJlbDogJ0NvbnRhY3RvcyBwYXJ0aWNpcGFudGVzJyB9LFxuICAgICAgYXR0ZW5kZWVfdXNlcnM6IHsgbGFiZWw6ICdQYXJ0aWNpcGFudGVzIGludGVybm9zJyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdOb3RhcyBkZSBsYSByZXVuaVx1MDBGM24nIH0sXG4gICAgfSxcbiAgfSxcbiAgc2NoZWR1bGVfbWVldGluZzoge1xuICAgIGxhYmVsOiAnUHJvZ3JhbWFyIHJldW5pXHUwMEYzbicsXG4gICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTAwQTFSZXVuaVx1MDBGM24gcHJvZ3JhbWFkYSEnLFxuICAgIHBhcmFtczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ0FzdW50byBkZSBsYSByZXVuaVx1MDBGM24nIH0sXG4gICAgICBzdGFydF9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgaW5pY2lvIChVVEMpJyB9LFxuICAgICAgc3RhcnRfdGltZTogeyBsYWJlbDogJ0hvcmEgZGUgaW5pY2lvIChVVEMpJyB9LFxuICAgICAgbG9jYXRpb246IHsgbGFiZWw6ICdVYmljYWNpXHUwMEYzbicgfSxcbiAgICAgIGR1cmF0aW9uOiB7IGxhYmVsOiAnRHVyYWNpXHUwMEYzbiAobWludXRvcyknIH0sXG4gICAgICBhdHRlbmRlZV9jb250YWN0czogeyBsYWJlbDogJ0NvbnRhY3RvcyBwYXJ0aWNpcGFudGVzJyB9LFxuICAgICAgYXR0ZW5kZWVfdXNlcnM6IHsgbGFiZWw6ICdQYXJ0aWNpcGFudGVzIGludGVybm9zJyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdBZ2VuZGEnIH0sXG4gICAgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvb2JqZWN0cy5jdXN0b21lci50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL29iamVjdHMuY3VzdG9tZXIudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgT2JqZWN0VHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuaW1wb3J0IHsgYWN0aXZpdHlBY3Rpb25zIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLyoqXG4gKiBFc3BhXHUwMEYxb2wgKGVzLUVTKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIENVU1RPTUVSIGZhbWlseTpcbiAqIHRoZSBjdXN0b21lciByZWNvcmQgaXRzZWxmIFx1MjAxNCBhY2NvdW50cyBhbmQgdGhlIHBlb3BsZSBhdCB0aGVtLlxuICpcbiAqIFJvc3RlcjogYGNybV9hY2NvdW50YCwgYGNybV9jb250YWN0YC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBjdXN0b21lcjogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX2FjY291bnQ6IHtcbiAgICBsYWJlbDogJ0N1ZW50YScsXG4gICAgcGx1cmFsTGFiZWw6ICdDdWVudGFzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0VtcHJlc2FzIHkgb3JnYW5pemFjaW9uZXMgY29uIGxhcyBxdWUgbWFudGVuZW1vcyByZWxhY2lcdTAwRjNuIGNvbWVyY2lhbCcsXG4gICAgZmllbGRzOiB7XG4gICAgICBhY2NvdW50X251bWJlcjogeyBsYWJlbDogJ05cdTAwRkFtZXJvIGRlIEN1ZW50YScgfSxcbiAgICAgIHJlZ2lzdHJhdGlvbl9udW1iZXI6IHtcbiAgICAgICAgbGFiZWw6ICdOXHUwMEZBbWVybyBkZSBSZWdpc3RybycsXG4gICAgICAgIGhlbHA6ICdMYSBpZGVudGlkYWQgcmVnaXN0cmFkYSBkZSBsYSBjb250cmFwYXJ0ZSwgZW1pdGlkYSBwb3Igc3UgcHJvcGlvIHJlZ2lzdHJvIGd1YmVybmFtZW50YWwuIE5vIGVzIGVsIE5cdTAwRkFtZXJvIGRlIEN1ZW50YSwgcXVlIGVtaXRpbW9zIG5vc290cm9zLicsXG4gICAgICB9LFxuICAgICAgY29tbWVyY2lhbF9jYXBhYmlsaXR5OiB7XG4gICAgICAgIGxhYmVsOiAnQ2FwYWNpZGFkIENvbWVyY2lhbCcsXG4gICAgICAgIGhlbHA6ICdTaSBzZSBwdWVkZSBhYnJpciBudWV2byBuZWdvY2lvIGNvbiBlc3RhIGN1ZW50YS4gTGFzIGN1ZW50YXMgZGUgU29sbyBMaXF1aWRhY2lcdTAwRjNuIHNpZ3VlbiBzaWVuZG8gdXRpbGl6YWJsZXMgcGFyYSBmYWN0dXJhY2lcdTAwRjNuIHkgcGFnb3MsIHBlcm8gbm8gc2UgbGVzIHB1ZWRlIHZpbmN1bGFyIG5pbmd1bmEgb3BvcnR1bmlkYWQgbnVldmEuJyxcbiAgICAgICAgb3B0aW9uczogeyBmdWxsOiAnQ29tcGxldGEnLCBzZXR0bGVtZW50X29ubHk6ICdTb2xvIExpcXVpZGFjaVx1MDBGM24nIH0sXG4gICAgICB9LFxuICAgICAgaW5jdW1iZW50X3ZlbmRvcjogeyBsYWJlbDogJ1Byb3ZlZWRvciBBY3R1YWwnLCBoZWxwOiAnRWwgcHJvdmVlZG9yIHF1ZSBhY3R1YWxtZW50ZSBhdGllbmRlIGVsIGdhc3RvIHF1ZSBwZXJzZWd1aW1vcyBlbiBlc3RhIGN1ZW50YS4nIH0sXG4gICAgICBhbm51YWxfcHVyY2hhc2luZ19idWRnZXQ6IHsgbGFiZWw6ICdQcmVzdXB1ZXN0byBBbnVhbCBkZSBDb21wcmFzJywgaGVscDogJ0xvIHF1ZSBlc3RhIGN1ZW50YSBlc3BlcmEgZ2FzdGFyIGNvbiBwcm92ZWVkb3JlcyBlc3RlIGFcdTAwRjFvLCBubyBzdXMgcHJvcGlvcyBpbmdyZXNvcy4nIH0sXG4gICAgICBwYXltZW50X2N5Y2xlOiB7XG4gICAgICAgIGxhYmVsOiAnQ2ljbG8gZGUgUGFnbycsXG4gICAgICAgIG9wdGlvbnM6IHsgcHJlcGFpZDogJ1ByZXBhZ28nLCBuZXRfMzA6ICczMCBkXHUwMEVEYXMnLCBuZXRfNjA6ICc2MCBkXHUwMEVEYXMnLCBuZXRfOTA6ICc5MCBkXHUwMEVEYXMnIH0sXG4gICAgICB9LFxuICAgICAgYXBwcm92YWxfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnRXN0YWRvIGRlIEFwcm9iYWNpXHUwMEYzbicsXG4gICAgICAgIGhlbHA6ICdFbiBxdVx1MDBFOSBwdW50byBkZSBzdSBhcHJvYmFjaVx1MDBGM24gZXN0XHUwMEUxIGVzdGEgY3VlbnRhLiBVbmEgY3VlbnRhIG51ZXZhIGNvbWllbnphIFBlbmRpZW50ZSB5IHNlIGRlY2lkZSBlbiBsYSBiYW5kZWphIGRlIGFwcm9iYWNpb25lcy4nLFxuICAgICAgICBvcHRpb25zOiB7IHBlbmRpbmc6ICdQZW5kaWVudGUnLCBhcHByb3ZlZDogJ0Fwcm9iYWRhJywgcmVqZWN0ZWQ6ICdSZWNoYXphZGEnIH0sXG4gICAgICB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ05vbWJyZSBkZSBDdWVudGEnLCBoZWxwOiAnTm9tYnJlIGxlZ2FsIGRlIGxhIGVtcHJlc2EgdSBvcmdhbml6YWNpXHUwMEYzbicgfSxcbiAgICAgIG5hbWVfbm9ybWFsaXplZDoge1xuICAgICAgICBsYWJlbDogJ05vbWJyZSBkZSBDdWVudGEgKE5vcm1hbGl6YWRvKScsXG4gICAgICAgIGhlbHA6ICdDbGF2ZSBkZSBjb2luY2lkZW5jaWEgcGFyYSBsYSBjb252ZXJzaVx1MDBGM24gZGUgcHJvc3BlY3RvczogZWwgTm9tYnJlIGRlIEN1ZW50YSBlbiBtaW5cdTAwRkFzY3VsYXMsIHNpbiBlc3BhY2lvcyBzb2JyYW50ZXMgeSBjb24gbG9zIGVzcGFjaW9zIGludGVybm9zIHJlZHVjaWRvcyBhIHVuby4gTG8gbWFudGllbmUgZWwgaG9vayBhY2NvdW50X3Byb3RlY3Rpb24gXHUyMDE0IG51bmNhIGxvIGVkaXRlIGRpcmVjdGFtZW50ZS4nLFxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdUXHUwMEVEdHVsbyBNb3N0cmFkbycgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvJyxcbiAgICAgICAgLy8gYGZvcm1lcmAgaXMgJ0Zvcm1lciBDdXN0b21lcicgaW4gYWNjb3VudC5vYmplY3QudHM7IHRoZSBgZW5gIGJ1bmRsZVxuICAgICAgICAvLyBoYWQgdHJ1bmNhdGVkIGl0IHRvICdGb3JtZXInLCBhbmQgdHJhbnNsYXRpbmcgdGhhdCB0cnVuY2F0aW9uIGdhdmVcbiAgICAgICAgLy8gYSBiYXJlICdBbnRlcmlvcicgXHUyMDE0IGFuIGFkamVjdGl2ZSB3aXRoIG5vIG5vdW4sIG5leHQgdG8gdGhyZWUgb3B0aW9uXG4gICAgICAgIC8vIGxhYmVscyB0aGF0IGFyZSBhbGwgbm91bnMuXG4gICAgICAgIG9wdGlvbnM6IHsgcHJvc3BlY3Q6ICdQcm9zcGVjdG8nLCBjdXN0b21lcjogJ0NsaWVudGUnLCBwYXJ0bmVyOiAnU29jaW8nLCBmb3JtZXI6ICdDbGllbnRlIEFudGVyaW9yJyB9LFxuICAgICAgfSxcbiAgICAgIGluZHVzdHJ5OiB7XG4gICAgICAgIGxhYmVsOiAnSW5kdXN0cmlhJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHRlY2hub2xvZ3k6ICdUZWNub2xvZ1x1MDBFRGEnLCBzb2Z0d2FyZTogJ1NvZnR3YXJlIC8gU2FhUycsIGZpbmFuY2U6ICdGaW5hbnphcycsXG4gICAgICAgICAgaGVhbHRoY2FyZTogJ1NhbHVkJywgcmV0YWlsOiAnQ29tZXJjaW8nLCBtYW51ZmFjdHVyaW5nOiAnTWFudWZhY3R1cmEnLFxuICAgICAgICAgIGVkdWNhdGlvbjogJ0VkdWNhY2lcdTAwRjNuJywgcmVhbF9lc3RhdGU6ICdJbm1vYmlsaWFyaWEnLCBtZWRpYTogJ01lZGlvcyB5IEVudHJldGVuaW1pZW50bycsXG4gICAgICAgICAgbG9naXN0aWNzOiAnTG9nXHUwMEVEc3RpY2EnLCBob3NwaXRhbGl0eTogJ0hvc3RlbGVyXHUwMEVEYScsIGVuZXJneTogJ0VuZXJnXHUwMEVEYSB5IFNlcnZpY2lvcyBQXHUwMEZBYmxpY29zJyxcbiAgICAgICAgICBnb3Zlcm5tZW50OiAnR29iaWVybm8nLCBub25wcm9maXQ6ICdTaW4gXHUwMEMxbmltbyBkZSBMdWNybycsIG90aGVyOiAnT3RybycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYW5udWFsX3JldmVudWU6IHsgbGFiZWw6ICdJbmdyZXNvcyBBbnVhbGVzJyB9LFxuICAgICAgY2hpbGRfYWNjb3VudF9yZXZlbnVlOiB7IGxhYmVsOiAnSW5ncmVzb3MgZGUgQ3VlbnRhcyBIaWphcycsIGhlbHA6ICdTdW1hIGRlIGxvcyBpbmdyZXNvcyBhbnVhbGVzIGRlIGxhcyBjdWVudGFzIGhpamFzIGRpcmVjdGFzLicgfSxcbiAgICAgIG51bWJlcl9vZl9lbXBsb3llZXM6IHsgbGFiZWw6ICdOXHUwMEZBbWVybyBkZSBFbXBsZWFkb3MnIH0sXG4gICAgICBwaG9uZTogeyBsYWJlbDogJ1RlbFx1MDBFOWZvbm8nIH0sXG4gICAgICB3ZWJzaXRlOiB7IGxhYmVsOiAnU2l0aW8gV2ViJyB9LFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnRGlyZWNjaVx1MDBGM24gZGUgRmFjdHVyYWNpXHUwMEYzbicgfSxcbiAgICAgIGJpbGxpbmdfY291bnRyeToge1xuICAgICAgICBsYWJlbDogJ1BhXHUwMEVEcyBkZSBGYWN0dXJhY2lcdTAwRjNuJyxcbiAgICAgICAgaGVscDogJ0Rlcml2YWRvIGRlIGxhIERpcmVjY2lcdTAwRjNuIGRlIEZhY3R1cmFjaVx1MDBGM24gXHUyMDE0IGVsIHBhXHUwMEVEcyB0YWwgY29tbyBzZSBpbnRyb2R1am8sIHNpbiBlc3BhY2lvcyB5IGVuIG1heVx1MDBGQXNjdWxhcy4nLFxuICAgICAgfSxcbiAgICAgIHRlcnJpdG9yeToge1xuICAgICAgICBsYWJlbDogJ1RlcnJpdG9yaW8nLFxuICAgICAgICBoZWxwOiAnRGVyaXZhZG8gZGUgbGEgRGlyZWNjaVx1MDBGM24gZGUgRmFjdHVyYWNpXHUwMEYzbiBcdTIwMTQgZWwgdGVycml0b3JpbyBkZSB2ZW50YXMgcXVlIHVzYW4gbGFzIHJlZ2xhcyBkZSBjb21wYXJ0aWNpXHUwMEYzbi4gTGFzIGN1ZW50YXMgZnVlcmEgZGUgbG9zIHRlcnJpdG9yaW9zIGNvbiBlcXVpcG8gYXNpZ25hZG8gc29uIE90cm8uJyxcbiAgICAgICAgb3B0aW9uczogeyBuYTogJ05vcnRlYW1cdTAwRTlyaWNhJywgZW1lYTogJ0VNRUEnLCBvdGhlcjogJ090cm8nIH0sXG4gICAgICB9LFxuICAgICAgb2ZmaWNlX2xvY2F0aW9uOiB7IGxhYmVsOiAnVWJpY2FjaVx1MDBGM24gZGUgT2ZpY2luYScgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnUHJvcGlldGFyaW8gZGUgQ3VlbnRhJyB9LFxuICAgICAgcGFyZW50X2FjY291bnQ6IHsgbGFiZWw6ICdDdWVudGEgTWF0cml6JywgaGVscDogJ0VtcHJlc2EgbWF0cml6IGVuIGxhIGplcmFycXVcdTAwRURhJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwY2lcdTAwRjNuJyB9LFxuICAgICAgaXNfYWN0aXZlOiB7IGxhYmVsOiAnQWN0aXZvJyB9LFxuICAgICAgbGFzdF9hY3Rpdml0eV9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgXHUwMERBbHRpbWEgQWN0aXZpZGFkJyB9LFxuICAgICAgYnJhbmRfY29sb3I6IHsgbGFiZWw6ICdDb2xvciBkZSBNYXJjYScgfSxcbiAgICAgIGxvZ286IHsgbGFiZWw6ICdMb2dvIGRlIGxhIEVtcHJlc2EnIH0sXG4gICAgICB0aWVyOiB7XG4gICAgICAgIGxhYmVsOiAnTml2ZWwgZGUgQ2xpZW50ZScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBzdHJhdGVnaWM6ICdFc3RyYXRcdTAwRTlnaWNvJywgZW50ZXJwcmlzZTogJ0dyYW4gRW1wcmVzYScsXG4gICAgICAgICAgbWlkX21hcmtldDogJ01lZGlhbmEgRW1wcmVzYScsIHNtYjogJ1BZTUUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNlZ21lbnQ6IHtcbiAgICAgICAgbGFiZWw6ICdTZWdtZW50bycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBuZXRfbmV3OiAnQ2xpZW50ZSBOdWV2bycsIGdyb3d0aDogJ0NyZWNpbWllbnRvJyxcbiAgICAgICAgICBhdF9yaXNrOiAnRW4gUmllc2dvJywgc3RhYmxlOiAnRXN0YWJsZScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgaGVhbHRoX3Njb3JlOiB7XG4gICAgICAgIGxhYmVsOiAnXHUwMENEbmRpY2UgZGUgU2FsdWQnLFxuICAgICAgICBoZWxwOiAnSW5kaWNhZG9yIGRlIHNhbHVkIG1hbnRlbmlkbyBwb3IgZWwgQ1NNJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGhlYWx0aHk6ICdTYWx1ZGFibGUnLCB3YXRjaGluZzogJ0VuIE9ic2VydmFjaVx1MDBGM24nLFxuICAgICAgICAgIGF0X3Jpc2s6ICdFbiBSaWVzZ28nLCBjaHVybmluZzogJ0VuIEZ1Z2EnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2FjY291bnRzOiB7XG4gICAgICAgIGxhYmVsOiAnVG9kYXMgbGFzIEN1ZW50YXMnLCBkZXNjcmlwdGlvbjogJ0xpc3RhIG1hZXN0cmEgZGUgY3VlbnRhcyBjb24gaW5ncmVzb3MgZSBpbmR1c3RyaWEnLFxuICAgICAgICBidWxrQWN0aW9uczoge1xuICAgICAgICAgIGRlbGV0ZToge1xuICAgICAgICAgICAgbGFiZWw6ICdFbGltaW5hcicsXG4gICAgICAgICAgICBjb25maXJtTGFiZWw6ICdFbGltaW5hcicsXG4gICAgICAgICAgICBjb25maXJtVGV4dDogJ1x1MDBCRkVsaW1pbmFyIHBlcm1hbmVudGVtZW50ZSB7e2NvdW50fX0gY3VlbnRhKHMpPyBFc3RhIGFjY2lcdTAwRjNuIG5vIHNlIHB1ZWRlIGRlc2hhY2VyLicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cmFuc2Zlcl9vd25lcjoge1xuICAgICAgICAgICAgbGFiZWw6ICdUcmFuc2ZlcmlyIHByb3BpZXRhcmlvJyxcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiAnXHUwMEJGVHJhbnNmZXJpciBsYSBwcm9waWVkYWQgZGUge3tjb3VudH19IGN1ZW50YShzKT8nLFxuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgIG93bmVyX2lkOiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdOdWV2byBwcm9waWV0YXJpbycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBkYXRlX3RpZXI6IHtcbiAgICAgICAgICAgIGxhYmVsOiAnQWN0dWFsaXphciBuaXZlbCcsXG4gICAgICAgICAgICBjb25maXJtVGV4dDogJ1x1MDBCRkFjdHVhbGl6YXIgZWwgbml2ZWwgZGUge3tjb3VudH19IGN1ZW50YShzKSBhIHt7dGllcn19PycsXG4gICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgdGllcjoge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnTml2ZWwgZGUgY2xpZW50ZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYWNjb3VudF9nYWxsZXJ5OiB7IGxhYmVsOiAnR2FsZXJcdTAwRURhIGRlIEN1ZW50YXMnLCBkZXNjcmlwdGlvbjogJ1Zpc3RhIGRlIHRhcmpldGFzIGNvbiBjb2xvcmVzIGRlIG1hcmNhJyB9LFxuICAgICAgYWNjb3VudF9tYXA6IHsgbGFiZWw6ICdNYXBhIGRlIEN1ZW50YXMnLCBkZXNjcmlwdGlvbjogJ0Rpc3RyaWJ1Y2lcdTAwRjNuIGdlb2dyXHUwMEUxZmljYSBkZSBjdWVudGFzJyB9LFxuICAgICAgZW50ZXJwcmlzZV9hY2NvdW50czogeyBsYWJlbDogJ0N1ZW50YXMgRW1wcmVzYXJpYWxlcycsIGRlc2NyaXB0aW9uOiAnQ3VlbnRhcyBjb24gbWF5b3JlcyBpbmdyZXNvcyBhbnVhbGVzJyB9LFxuICAgICAgbXlfYWNjb3VudHM6IHsgbGFiZWw6ICdNaXMgQ3VlbnRhcycsIGRlc2NyaXB0aW9uOiAnQ3VlbnRhcyBhc2lnbmFkYXMgYWwgdXN1YXJpbyBhY3R1YWwnIH0sXG4gICAgICBhdF9yaXNrX2FjY291bnRzOiB7IGxhYmVsOiAnXHUyNkEwXHVGRTBGIEN1ZW50YXMgZW4gUmllc2dvJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gQlx1MDBFMXNpY2EnIH0sXG4gICAgICBmaW5hbmNpYWxzOiB7IGxhYmVsOiAnRGF0b3MgRmluYW5jaWVyb3MnIH0sXG4gICAgICBidXNpbmVzc19wcm9maWxlOiB7IGxhYmVsOiAnUGVyZmlsIGRlIE5lZ29jaW8nIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlIENvbnRhY3RvJyB9LFxuICAgICAgb3duZXJzaGlwOiB7IGxhYmVsOiAnUHJvcGllZGFkIHkgRXN0YWRvJyB9LFxuICAgICAgYnJhbmRpbmc6IHsgbGFiZWw6ICdJZGVudGlkYWQgZGUgTWFyY2EnIH0sXG4gICAgICBzeXN0ZW06IHsgbGFiZWw6ICdTaXN0ZW1hJyB9LFxuICAgICAgLy8gTm9tYnJlcyBkZSBzZWNjaVx1MDBGM24gZGVsIGZvcm11bGFyaW8gZW4gYWNjb3VudC52aWV3LnRzICgjMTEwMClcbiAgICAgIHByb2ZpbGU6IHsgbGFiZWw6ICdQZXJmaWwnIH0sXG4gICAgICBjdXN0b21lcl9zdWNjZXNzOiB7IGxhYmVsOiAnXHUwMEM5eGl0byBkZWwgQ2xpZW50ZScgfSxcbiAgICAgIGxvY2F0aW9uczogeyBsYWJlbDogJ1ViaWNhY2lvbmVzJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwY2lcdTAwRjNuJyB9LFxuICAgIH0sXG4gICAgX2FjdGlvbnM6IHsgLi4uYWN0aXZpdHlBY3Rpb25zIH0sXG4gIH0sXG4gIGNybV9jb250YWN0OiB7XG4gICAgbGFiZWw6ICdDb250YWN0bycsXG4gICAgcGx1cmFsTGFiZWw6ICdDb250YWN0b3MnLFxuICAgIGRlc2NyaXB0aW9uOiAnUGVyc29uYXMgYXNvY2lhZGFzIGEgbGFzIGN1ZW50YXMnLFxuICAgIGZpZWxkczoge1xuICAgICAgLy8gTWlzbW8ganVlZ28gZGUgdmFsb3JlcyBxdWUgYGNybV9sZWFkLnNhbHV0YXRpb25gIFx1MjAxNCB0cmFkXHUwMEZBemNhbnNlIGlndWFsLlxuICAgICAgc2FsdXRhdGlvbjoge1xuICAgICAgICBsYWJlbDogJ1RcdTAwRUR0dWxvJyxcbiAgICAgICAgb3B0aW9uczogeyBtcjogJ1NyLicsIG1zOiAnU3J0YS4nLCBtcnM6ICdTcmEuJywgZHI6ICdEci4nLCBwcm9mOiAnUHJvZi4nIH0sXG4gICAgICB9LFxuICAgICAgZmlyc3RfbmFtZTogeyBsYWJlbDogJ05vbWJyZScgfSxcbiAgICAgIGxhc3RfbmFtZTogeyBsYWJlbDogJ0FwZWxsaWRvJyB9LFxuICAgICAgZnVsbF9uYW1lOiB7IGxhYmVsOiAnTm9tYnJlIENvbXBsZXRvJyB9LFxuICAgICAgY3JtX2FjY291bnQ6IHsgbGFiZWw6ICdDdWVudGEnIH0sXG4gICAgICBlbWFpbDogeyBsYWJlbDogJ0NvcnJlbyBFbGVjdHJcdTAwRjNuaWNvJyB9LFxuICAgICAgcGhvbmU6IHsgbGFiZWw6ICdUZWxcdTAwRTlmb25vJyB9LFxuICAgICAgbW9iaWxlOiB7IGxhYmVsOiAnTVx1MDBGM3ZpbCcgfSxcbiAgICAgIHRpdGxlOiB7IGxhYmVsOiAnQ2FyZ28nIH0sXG4gICAgICBkZXBhcnRtZW50OiB7XG4gICAgICAgIGxhYmVsOiAnRGVwYXJ0YW1lbnRvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGV4ZWN1dGl2ZTogJ0VqZWN1dGl2bycsIHNhbGVzOiAnVmVudGFzJywgbWFya2V0aW5nOiAnTWFya2V0aW5nJyxcbiAgICAgICAgICBlbmdpbmVlcmluZzogJ0luZ2VuaWVyXHUwMEVEYScsIHN1cHBvcnQ6ICdTb3BvcnRlJywgZmluYW5jZTogJ0ZpbmFuemFzJyxcbiAgICAgICAgICBocjogJ1JlY3Vyc29zIEh1bWFub3MnLCBvcGVyYXRpb25zOiAnT3BlcmFjaW9uZXMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIC8vIENlbnRybyBkZSBjb21wcmEgKFJFUS0wMDA0KSBcdTIwMTQgZWwgbWFwYSBkZSBsYSBkZWNpc2lcdTAwRjNuLiBMYSBldGlxdWV0YVxuICAgICAgLy8gaW5nbGVzYSBlcyAnQnV5aW5nIEZ1bmN0aW9uJyB5IG5vICdCdXlpbmcgUm9sZSc6IGxhIHJlZ2xhXG4gICAgICAvLyBzZWN1cml0eS1yb2xlLXdvcmQgcmVzZXJ2YSBsYSBwYWxhYnJhIGluZ2xlc2EgYHJvbGVgIGVuIGxhc1xuICAgICAgLy8gZGVjbGFyYWNpb25lcyAoQURSLTAwOTAgRDMpLiBFc2EgcmVnbGEgc1x1MDBGM2xvIGxlZSBpbmdsXHUwMEU5cyB5IG5vIGFsY2FuemFcbiAgICAgIC8vIGxvcyBwYXF1ZXRlcyBkZSBpZGlvbWEsIGFzXHUwMEVEIHF1ZSBhcXVcdTAwRUQgdmEgZWwgdFx1MDBFOXJtaW5vIG5hdHVyYWwuXG4gICAgICBidXlpbmdfZnVuY3Rpb246IHtcbiAgICAgICAgbGFiZWw6ICdSb2wgZGUgQ29tcHJhJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGRlY2lzaW9uX21ha2VyOiAnRGVjaXNvcicsIGVjb25vbWljX2J1eWVyOiAnQ29tcHJhZG9yIEVjb25cdTAwRjNtaWNvJyxcbiAgICAgICAgICB0ZWNobmljYWxfZXZhbHVhdG9yOiAnRXZhbHVhZG9yIFRcdTAwRTljbmljbycsIHVzZXI6ICdVc3VhcmlvJyxcbiAgICAgICAgICBpbmZsdWVuY2VyOiAnSW5mbHVlbmNpYWRvcicsIGdhdGVrZWVwZXI6ICdHdWFyZGlcdTAwRTFuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhdHRpdHVkZToge1xuICAgICAgICBsYWJlbDogJ0FjdGl0dWQgaGFjaWEgTm9zb3Ryb3MnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY2hhbXBpb246ICdEZWZlbnNvcicsIHN1cHBvcnRpdmU6ICdGYXZvcmFibGUnLCBuZXV0cmFsOiAnTmV1dHJhbCcsXG4gICAgICAgICAgc2tlcHRpY2FsOiAnRXNjXHUwMEU5cHRpY28nLCBibG9ja2VyOiAnQmxvcXVlYWRvcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmVsYXRpb25zaGlwX3N0cmVuZ3RoOiB7XG4gICAgICAgIGxhYmVsOiAnRnVlcnphIGRlIGxhIFJlbGFjaVx1MDBGM24nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZGlzdGFudDogJ0Rpc3RhbnRlJywgYWNxdWFpbnRhbmNlOiAnQ29ub2NpZG8nLCB3b3JraW5nOiAnUmVsYWNpXHUwMEYzbiBkZSBUcmFiYWpvJyxcbiAgICAgICAgICBzdHJvbmc6ICdGdWVydGUnLCB0cnVzdGVkX2Fkdmlzb3I6ICdBc2Vzb3IgZGUgQ29uZmlhbnphJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1Byb3BpZXRhcmlvIGRlIENvbnRhY3RvJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwY2lcdTAwRjNuJyB9LFxuICAgICAgaXNfcHJpbWFyeTogeyBsYWJlbDogJ0NvbnRhY3RvIFByaW5jaXBhbCcsIGhlbHA6ICdcdTAwQkZFcyBlc3RlIGVsIGNvbnRhY3RvIHByaW5jaXBhbCBkZSBsYSBjdWVudGE/JyB9LFxuICAgICAgYXZhdGFyOiB7IGxhYmVsOiAnRm90byBkZSBQZXJmaWwnIH0sXG4gICAgICBtYWlsaW5nX2FkZHJlc3M6IHsgbGFiZWw6ICdEaXJlY2NpXHUwMEYzbiBkZSBDb3JyZW8nIH0sXG4gICAgICAvLyBKdWVnbyBjb21wYXJ0aWRvIGNvbiBgY3JtX2xlYWQubGVhZF9zb3VyY2VgIHlcbiAgICAgIC8vIGBjcm1fb3Bwb3J0dW5pdHkubGVhZF9zb3VyY2VgIFx1MjAxNCBsb3MgdHJlcyBkZWJlbiBjb2luY2lkaXIgbGl0ZXJhbG1lbnRlLlxuICAgICAgbGVhZF9zb3VyY2U6IHtcbiAgICAgICAgbGFiZWw6ICdPcmlnZW4gZGVsIFByb3NwZWN0bycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB3ZWI6ICdXZWInLCByZWZlcnJhbDogJ1JlZmVyZW5jaWEnLCBldmVudDogJ0V2ZW50byAvIEZlcmlhJyxcbiAgICAgICAgICB3ZWJpbmFyOiAnU2VtaW5hcmlvIFdlYicsIHBhcnRuZXI6ICdTb2NpbycsIGFkdmVydGlzZW1lbnQ6ICdQdWJsaWNpZGFkJyxcbiAgICAgICAgICBwYWlkX3NlYXJjaDogJ0JcdTAwRkFzcXVlZGEgZGUgUGFnbycsIHNvY2lhbDogJ1JlZGVzIFNvY2lhbGVzJywgY29udGVudDogJ0NvbnRlbmlkbyAvIEJsb2cnLFxuICAgICAgICAgIGNvbGRfY2FsbDogJ0xsYW1hZGEgZW4gRnJcdTAwRURvJywgZW1haWxfY2FtcGFpZ246ICdDYW1wYVx1MDBGMWEgZGUgRW1haWwnLCBvdGhlcjogJ090cm8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGRvX25vdF9jYWxsOiB7IGxhYmVsOiAnTm8gTGxhbWFyJyB9LFxuICAgICAgZW1haWxfb3B0X291dDogeyBsYWJlbDogJ0V4Y2x1aXIgZGUgQ29ycmVvcycgfSxcbiAgICAgIGxhc3RfY29udGFjdGVkX2RhdGU6IHsgbGFiZWw6ICdcdTAwREFsdGltbyBjb250YWN0bycgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2NvbnRhY3RzOiB7IGxhYmVsOiAnVG9kb3MgbG9zIENvbnRhY3RvcycgfSxcbiAgICAgIGNvbnRhY3RfZGlyZWN0b3J5OiB7IGxhYmVsOiAnRGlyZWN0b3JpbyBkZSBDb250YWN0b3MnIH0sXG4gICAgICBwcmltYXJ5X2NvbnRhY3RzOiB7IGxhYmVsOiAnQ29udGFjdG9zIFByaW5jaXBhbGVzJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBpZGVudGl0eTogeyBsYWJlbDogJ0lkZW50aWRhZCcgfSxcbiAgICAgIGFjY291bnRfaW5mbzogeyBsYWJlbDogJ0N1ZW50YSB5IENhcmdvJyB9LFxuICAgICAgYnV5aW5nX2NlbnRyZTogeyBsYWJlbDogJ0NlbnRybyBkZSBDb21wcmEnIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlIENvbnRhY3RvJyB9LFxuICAgICAgbWFpbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnRGlyZWNjaVx1MDBGM24gZGUgQ29ycmVvJyB9LFxuICAgICAgYWRkaXRpb25hbDogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gQWRpY2lvbmFsJyB9LFxuICAgICAgcHJlZmVyZW5jZXM6IHsgbGFiZWw6ICdQcmVmZXJlbmNpYXMgZGUgQ29tdW5pY2FjaVx1MDBGM24nIH0sXG4gICAgICAvLyBOb21icmVzIGRlIHNlY2NpXHUwMEYzbiBkZWwgZm9ybXVsYXJpbyBlbiBjb250YWN0LnZpZXcudHMgKCMxMTAwKVxuICAgICAgY29udGFjdF9kZXRhaWxzOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBkZSBDb250YWN0bycgfSxcbiAgICAgIGNvbW1fcHJlZmVyZW5jZXM6IHsgbGFiZWw6ICdQcmVmZXJlbmNpYXMnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgbWFya19wcmltYXJ5OiB7XG4gICAgICAgIGxhYmVsOiAnTWFyY2FyIGNvbW8gUHJpbmNpcGFsJyxcbiAgICAgICAgY29uZmlybVRleHQ6ICdcdTAwQkZFc3RhYmxlY2VyIGVzdGUgY29udGFjdG8gY29tbyBjb250YWN0byBwcmluY2lwYWwgZGUgbGEgY3VlbnRhPycsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUwMEExRXN0YWJsZWNpZG8gY29tbyBjb250YWN0byBwcmluY2lwYWwhJyxcbiAgICAgIH0sXG4gICAgICBzZW5kX2VtYWlsOiB7XG4gICAgICAgIGxhYmVsOiAnRW52aWFyIENvcnJlbycsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHN1YmplY3Q6IHsgbGFiZWw6ICdBc3VudG8nIH0sXG4gICAgICAgICAgYm9keTogeyBsYWJlbDogJ0N1ZXJwbycgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhZGRfY29udGFjdF90b19jYW1wYWlnbjoge1xuICAgICAgICBsYWJlbDogJ0FcdTAwRjFhZGlyIGEgQ2FtcGFcdTAwRjFhJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTAwQTFDb250YWN0b3MgYVx1MDBGMWFkaWRvcyBhIGxhIGNhbXBhXHUwMEYxYSEnLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBjcm1fY2FtcGFpZ246IHsgbGFiZWw6ICdDYW1wYVx1MDBGMWEnIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL29iamVjdHMucGlwZWxpbmUudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy9vYmplY3RzLnBpcGVsaW5lLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IGFjdGl2aXR5QWN0aW9ucyB9IGZyb20gJy4vX3NoYXJlZCc7XG5cbi8qKlxuICogRXNwYVx1MDBGMW9sIChlcy1FUykgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBQSVBFTElORSBmYW1pbHk6XG4gKiBkZW1hbmQgYW5kIHRoZSBkZWFscyBpdCBiZWNvbWVzLCBwbHVzIHRoZSByb2xsLXVwIHRoYXQgZm9yZWNhc3RzIHRoZW0uXG4gKlxuICogUm9zdGVyOiBgY3JtX2xlYWRgLCBgY3JtX29wcG9ydHVuaXR5YCwgYGNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW1gLCBgY3JtX2ZvcmVjYXN0YC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBwaXBlbGluZTogUmVjb3JkPHN0cmluZywgT2JqZWN0VHJhbnNsYXRpb25EYXRhPiA9IHtcbiAgY3JtX2xlYWQ6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGRpc3F1YWxpZmljYXRpb25fcmVhc29uX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdFbCBtb3Rpdm8gZGUgZGVzY2FsaWZpY2FjaVx1MDBGM24gZXMgb2JsaWdhdG9yaW8gY3VhbmRvIHVuIHByb3NwZWN0byBubyBlc3RcdTAwRTEgY3VhbGlmaWNhZG8nLFxuICAgICAgfSxcbiAgICAgIGR1cGxpY2F0ZV9kaXNxdWFsaWZpY2F0aW9uX3JlcXVpcmVzX3N1cnZpdm9yOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdEZXNjYWxpZmljYXIgdW4gcHJvc3BlY3RvIGNvbW8gZHVwbGljYWRvIGV4aWdlIG5vbWJyYXIgZWwgcmVnaXN0cm8gc3VwZXJ2aXZpZW50ZSB5IG1hcmNhciBlbCBlc3RhZG8gZGUgZHVwbGljYWRvIGNvbW8gQ29uZmlybWFkbycsXG4gICAgICB9LFxuICAgICAgZW1haWxfcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0VsIGNvcnJlbyBlbGVjdHJcdTAwRjNuaWNvIGVzIG9ibGlnYXRvcmlvJyxcbiAgICAgIH0sXG4gICAgICBsZWFkX3N0YXR1c19wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnVHJhbnNpY2lcdTAwRjNuIGRlIGVzdGFkbyBkZSBwcm9zcGVjdG8gbm8gdlx1MDBFMWxpZGEnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnUHJvc3BlY3RvJyxcbiAgICBwbHVyYWxMYWJlbDogJ1Byb3NwZWN0b3MnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ2xpZW50ZXMgcG90ZW5jaWFsZXMgdG9kYXZcdTAwRURhIHNpbiBjYWxpZmljYXInLFxuICAgIGZpZWxkczoge1xuICAgICAgZmlyc3RfbmFtZTogeyBsYWJlbDogJ05vbWJyZScgfSxcbiAgICAgIGxhc3RfbmFtZTogeyBsYWJlbDogJ0FwZWxsaWRvJyB9LFxuICAgICAgY29tcGFueTogeyBsYWJlbDogJ0VtcHJlc2EnIH0sXG4gICAgICBjb21wYW55X25vcm1hbGl6ZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdFbXByZXNhIChOb3JtYWxpemFkbyknLFxuICAgICAgICBoZWxwOiAnQ2xhdmUgZGUgY29pbmNpZGVuY2lhIHBhcmEgbGEgY29udmVyc2lcdTAwRjNuIGRlIHByb3NwZWN0b3M6IGxhIEVtcHJlc2EgZW4gbWluXHUwMEZBc2N1bGFzLCBzaW4gZXNwYWNpb3Mgc29icmFudGVzIHkgY29uIGxvcyBlc3BhY2lvcyBpbnRlcm5vcyByZWR1Y2lkb3MgYSB1bm8uIExvIG1hbnRpZW5lIGVsIGhvb2sgbGVhZF9kdXBsaWNhdGVfY2hlY2sgXHUyMDE0IG51bmNhIGxvIGVkaXRlIGRpcmVjdGFtZW50ZS4nLFxuICAgICAgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdUXHUwMEVEdHVsbyBNb3N0cmFkbycgfSxcbiAgICAgIHRpdGxlOiB7IGxhYmVsOiAnQ2FyZ28nIH0sXG4gICAgICBlbWFpbDogeyBsYWJlbDogJ0NvcnJlbyBFbGVjdHJcdTAwRjNuaWNvJyB9LFxuICAgICAgcGhvbmU6IHsgbGFiZWw6ICdUZWxcdTAwRTlmb25vJyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnRXN0YWRvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ldzogJ051ZXZvJywgY29udGFjdGVkOiAnQ29udGFjdGFkbycsIHF1YWxpZmllZDogJ0NhbGlmaWNhZG8nLFxuICAgICAgICAgIHVucXVhbGlmaWVkOiAnTm8gQ2FsaWZpY2FkbycsIGNvbnZlcnRlZDogJ0NvbnZlcnRpZG8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxlYWRfc291cmNlOiB7XG4gICAgICAgIGxhYmVsOiAnT3JpZ2VuIGRlbCBQcm9zcGVjdG8nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgd2ViOiAnV2ViJywgcmVmZXJyYWw6ICdSZWZlcmVuY2lhJywgZXZlbnQ6ICdFdmVudG8gLyBGZXJpYScsXG4gICAgICAgICAgd2ViaW5hcjogJ1NlbWluYXJpbyBXZWInLCBwYXJ0bmVyOiAnU29jaW8nLCBhZHZlcnRpc2VtZW50OiAnUHVibGljaWRhZCcsXG4gICAgICAgICAgcGFpZF9zZWFyY2g6ICdCXHUwMEZBc3F1ZWRhIGRlIFBhZ28nLCBzb2NpYWw6ICdSZWRlcyBTb2NpYWxlcycsIGNvbnRlbnQ6ICdDb250ZW5pZG8gLyBCbG9nJyxcbiAgICAgICAgICBjb2xkX2NhbGw6ICdMbGFtYWRhIGVuIEZyXHUwMEVEbycsIGVtYWlsX2NhbXBhaWduOiAnQ2FtcGFcdTAwRjFhIGRlIEVtYWlsJywgb3RoZXI6ICdPdHJvJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1Byb3BpZXRhcmlvJyB9LFxuICAgICAgaXNfY29udmVydGVkOiB7IGxhYmVsOiAnQ29udmVydGlkbycgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcGNpXHUwMEYzbicgfSxcbiAgICAgIC8vIE1pc21vIGp1ZWdvIGRlIHZhbG9yZXMgcXVlIGBjcm1fY29udGFjdC5zYWx1dGF0aW9uYCBcdTIwMTQgdHJhZFx1MDBGQXpjYW5zZSBpZ3VhbC5cbiAgICAgIHNhbHV0YXRpb246IHtcbiAgICAgICAgbGFiZWw6ICdUcmF0YW1pZW50bycsXG4gICAgICAgIG9wdGlvbnM6IHsgbXI6ICdTci4nLCBtczogJ1NydGEuJywgbXJzOiAnU3JhLicsIGRyOiAnRHIuJywgcHJvZjogJ1Byb2YuJyB9LFxuICAgICAgfSxcbiAgICAgIGZ1bGxfbmFtZTogeyBsYWJlbDogJ05vbWJyZSBDb21wbGV0bycgfSxcbiAgICAgIC8vIExvcyAxNSB2YWxvcmVzIHNvbiBsb3MgbWlzbW9zIHF1ZSBlbiBgY3JtX2FjY291bnQuaW5kdXN0cnlgIFx1MjAxNCBkZWJlblxuICAgICAgLy8gY29pbmNpZGlyIGxpdGVyYWxtZW50ZSBlbnRyZSBhbWJhcyBwYW50YWxsYXMuXG4gICAgICBpbmR1c3RyeToge1xuICAgICAgICBsYWJlbDogJ0luZHVzdHJpYScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB0ZWNobm9sb2d5OiAnVGVjbm9sb2dcdTAwRURhJywgc29mdHdhcmU6ICdTb2Z0d2FyZSAvIFNhYVMnLCBmaW5hbmNlOiAnRmluYW56YXMnLFxuICAgICAgICAgIGhlYWx0aGNhcmU6ICdTYWx1ZCcsIHJldGFpbDogJ0NvbWVyY2lvJywgbWFudWZhY3R1cmluZzogJ01hbnVmYWN0dXJhJyxcbiAgICAgICAgICBlZHVjYXRpb246ICdFZHVjYWNpXHUwMEYzbicsIHJlYWxfZXN0YXRlOiAnSW5tb2JpbGlhcmlhJywgbWVkaWE6ICdNZWRpb3MgeSBFbnRyZXRlbmltaWVudG8nLFxuICAgICAgICAgIGxvZ2lzdGljczogJ0xvZ1x1MDBFRHN0aWNhJywgaG9zcGl0YWxpdHk6ICdIb3N0ZWxlclx1MDBFRGEnLCBlbmVyZ3k6ICdFbmVyZ1x1MDBFRGEgeSBTZXJ2aWNpb3MgUFx1MDBGQWJsaWNvcycsXG4gICAgICAgICAgZ292ZXJubWVudDogJ0dvYmllcm5vJywgbm9ucHJvZml0OiAnU2luIFx1MDBDMW5pbW8gZGUgTHVjcm8nLCBvdGhlcjogJ090cm8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1vYmlsZTogeyBsYWJlbDogJ01cdTAwRjN2aWwnIH0sXG4gICAgICB3ZWJzaXRlOiB7IGxhYmVsOiAnU2l0aW8gV2ViJyB9LFxuICAgICAgcmF0aW5nOiB7IGxhYmVsOiAnUHVudHVhY2lcdTAwRjNuIGRlIFByb3NwZWN0bycsIGhlbHA6ICdQdW50dWFjaVx1MDBGM24gZGUgY2FsaWRhZCBkZWwgcHJvc3BlY3RvICgxLTUgZXN0cmVsbGFzKScgfSxcbiAgICAgIG5leHRfZm9sbG93dXBfZGF0ZTogeyBsYWJlbDogJ1ByXHUwMEYzeGltYSBGZWNoYSBkZSBTZWd1aW1pZW50bycgfSxcbiAgICAgIGxhc3RfY29udGFjdGVkX2RhdGU6IHsgbGFiZWw6ICdcdTAwREFsdGltbyBDb250YWN0bycgfSxcbiAgICAgIG5lZWRfdHlwZToge1xuICAgICAgICBsYWJlbDogJ1RpcG8gZGUgTmVjZXNpZGFkJyxcbiAgICAgICAgaGVscDogJ1F1XHUwMEU5IGVzdFx1MDBFMSBwaWRpZW5kbyBlc3RlIHByb3NwZWN0by4gTGEgYXNpZ25hY2lcdTAwRjNuLCBsYSBwcmlvcml6YWNpXHUwMEYzbiB5IGxvcyBpbmZvcm1lcyBkZSBkZW1hbmRhIGxlZW4gZXN0ZSBjYW1wby4nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgbmV3X2ltcGxlbWVudGF0aW9uOiAnTnVldmEgSW1wbGFudGFjaVx1MDBGM24nLCBleHBhbnNpb246ICdBbXBsaWFjaVx1MDBGM24nLFxuICAgICAgICAgIHJlcGxhY2VtZW50OiAnU3VzdGl0dWNpXHUwMEYzbicsIHJlbmV3YWw6ICdSZW5vdmFjaVx1MDBGM24nLCBjb25zdWx0aW5nOiAnQ29uc3VsdG9yXHUwMEVEYScsXG4gICAgICAgICAgc3VwcG9ydDogJ1NvcG9ydGUgeSBNYW50ZW5pbWllbnRvJywgb3RoZXI6ICdPdHJvJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlc3RpbWF0ZWRfYW1vdW50OiB7XG4gICAgICAgIGxhYmVsOiAnSW1wb3J0ZSBFc3RpbWFkbycsXG4gICAgICAgIGhlbHA6ICdWYWxvciBlc3RpbWFkbyBkZSBlc3RhIG5lY2VzaWRhZCwgYW50ZXMgZGUgbGEgY3VhbGlmaWNhY2lcdTAwRjNuLiBQcmVjYXJnYSBlbCBpbXBvcnRlIGRlIGxhIG9wb3J0dW5pZGFkIGFsIGNvbnZlcnRpci4nLFxuICAgICAgfSxcbiAgICAgIGNvbnZlcnNpb25fYXBwcm92YWxfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnQXByb2JhY2lcdTAwRjNuIGRlIENvbnZlcnNpXHUwMEYzbicsXG4gICAgICAgIGhlbHA6ICdTaSBlc3RlIHByb3NwZWN0byB0aWVuZSBlbCB2aXN0byBidWVubyBwYXJhIGNvbnZlcnRpcnNlLiBcdTAwQUJObyBSZXF1ZXJpZGFcdTAwQkIgc2lnbmlmaWNhIHF1ZSBubyBzZSBwaWRlIGFwcm9iYWNpXHUwMEYzbjogZXMgZWwgdmFsb3IgcHJlZGV0ZXJtaW5hZG8gZGUgZlx1MDBFMWJyaWNhLicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBub3RfcmVxdWlyZWQ6ICdObyBSZXF1ZXJpZGEnLCBwZW5kaW5nOiAnUGVuZGllbnRlJyxcbiAgICAgICAgICBhcHByb3ZlZDogJ0Fwcm9iYWRhJywgcmVqZWN0ZWQ6ICdSZWNoYXphZGEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNvbnZlcnRlZF9hY2NvdW50OiB7IGxhYmVsOiAnQ3VlbnRhIENvbnZlcnRpZGEnIH0sXG4gICAgICBjb252ZXJ0ZWRfY29udGFjdDogeyBsYWJlbDogJ0NvbnRhY3RvIENvbnZlcnRpZG8nIH0sXG4gICAgICBjb252ZXJ0ZWRfb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdPcG9ydHVuaWRhZCBDb252ZXJ0aWRhJyB9LFxuICAgICAgY29udmVydGVkX2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBkZSBDb252ZXJzaVx1MDBGM24nIH0sXG4gICAgICBhZGRyZXNzOiB7IGxhYmVsOiAnRGlyZWNjaVx1MDBGM24nIH0sXG4gICAgICBhbm51YWxfcmV2ZW51ZTogeyBsYWJlbDogJ0luZ3Jlc29zIEFudWFsZXMnIH0sXG4gICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiB7IGxhYmVsOiAnTlx1MDBGQW1lcm8gZGUgRW1wbGVhZG9zJyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdOb3RhcycsIGhlbHA6ICdOb3RhcyBkZSB0cmFiYWpvIHNvYnJlIGVzdGUgY2xpZW50ZSBwb3RlbmNpYWw6IGFkbWl0ZSBmb3JtYXRvLicgfSxcbiAgICAgIGRvX25vdF9jYWxsOiB7IGxhYmVsOiAnTm8gTGxhbWFyJyB9LFxuICAgICAgZW1haWxfb3B0X291dDogeyBsYWJlbDogJ0V4Y2x1aXIgZGUgQ29ycmVvcycgfSxcbiAgICAgIGRpc3F1YWxpZmljYXRpb25fcmVhc29uOiB7XG4gICAgICAgIGxhYmVsOiAnTW90aXZvIGRlIE5vIENhbGlmaWNhY2lcdTAwRjNuJyxcbiAgICAgICAgaGVscDogJ09ibGlnYXRvcmlvIGN1YW5kbyBlbCBlc3RhZG8gZXMgTm8gQ2FsaWZpY2FkbycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBub3RfYV9maXQ6ICdObyBFbmNhamEnLCBub19idWRnZXQ6ICdTaW4gUHJlc3VwdWVzdG8nLCB3cm9uZ19wZXJzb25hOiAnUGVyZmlsIEluY29ycmVjdG8nLFxuICAgICAgICAgIHVucmVhY2hhYmxlOiAnSWxvY2FsaXphYmxlJywgZHVwbGljYXRlOiAnRHVwbGljYWRvJywgY29tcGV0aXRvcjogJ0NvbXBldGlkb3InLFxuICAgICAgICAgIG90aGVyOiAnT3RybycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZHVwbGljYXRlX29mX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdEdXBsaWNhZG8gRGUnLFxuICAgICAgICBoZWxwOiAnUXVcdTAwRTkgb2JqZXRvIGNvbnRpZW5lIGVsIHJlZ2lzdHJvIHN1cGVydml2aWVudGUgcXVlIGVzdGUgcHJvc3BlY3RvIHJlcGl0ZS4nLFxuICAgICAgICAvLyBgZXJhc2VkYCBlcyB1bmEgbFx1MDBFMXBpZGEsIG5vIHVuYSBvcGNpXHUwMEYzbjogZWwgZm9ybXVsYXJpbyBubyBsYSBvZnJlY2VcbiAgICAgICAgLy8gKHZlciBgc3JjL3NhbGVzL3ZpZXdzL2xlYWQudmlldy50c2ApLCBwZXJvIHVuIHByb3NwZWN0byBjdXlvIHN1cGVydml2aWVudGVcbiAgICAgICAgLy8gZnVlIGVsaW1pbmFkbyBsYSBsbGV2YSwgYXNcdTAwRUQgcXVlIG5lY2VzaXRhIGV0aXF1ZXRhIGFsbFx1MDBFRCBkb25kZSBlbFxuICAgICAgICAvLyByZWdpc3RybyBzZSBMRUU7IHNpbiB0cmFkdWNpciBzZSBtb3N0cmFyXHUwMEVEYSBlbCB2YWxvciBjcnVkbyBgZXJhc2VkYC5cbiAgICAgICAgb3B0aW9uczogeyBjcm1fbGVhZDogJ1Byb3NwZWN0bycsIGNybV9jb250YWN0OiAnQ29udGFjdG8nLCBlcmFzZWQ6ICdSZWdpc3RybyBFbGltaW5hZG8nIH0sXG4gICAgICB9LFxuICAgICAgZHVwbGljYXRlX29mX2xlYWQ6IHsgbGFiZWw6ICdQcm9zcGVjdG8gRHVwbGljYWRvJyB9LFxuICAgICAgZHVwbGljYXRlX29mX2NvbnRhY3Q6IHsgbGFiZWw6ICdDb250YWN0byBEdXBsaWNhZG8nIH0sXG4gICAgICBkdXBsaWNhdGVfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnRXN0YWRvIGRlbCBEdXBsaWNhZG8nLFxuICAgICAgICBoZWxwOiAnU29zcGVjaG9zbyA9IG1hcmNhZG8gYXV0b21cdTAwRTF0aWNhbWVudGUgZW4gbGEgY2FwdHVyYS4gQ29uZmlybWFkbyA9IHVuYSBwZXJzb25hIHZlcmlmaWNcdTAwRjMgbGEgY29pbmNpZGVuY2lhLicsXG4gICAgICAgIG9wdGlvbnM6IHsgc3VzcGVjdGVkOiAnU29zcGVjaG9zbycsIGNvbmZpcm1lZDogJ0NvbmZpcm1hZG8nIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfbGVhZHM6IHtcbiAgICAgICAgbGFiZWw6ICdUb2RvcyBsb3MgUHJvc3BlY3RvcycsXG4gICAgICAgIGVtcHR5U3RhdGU6IHsgdGl0bGU6ICdUb2Rhdlx1MDBFRGEgbm8gaGF5IHByb3NwZWN0b3MnLCBtZXNzYWdlOiAnRW1waWVjZSBjcmVhbmRvIHN1IHByaW1lciBwcm9zcGVjdG8nIH0sXG4gICAgICB9LFxuICAgICAga2FuYmFuX2J5X3N0YXR1czogeyBsYWJlbDogJ1BpcGVsaW5lIGRlIFByb3NwZWN0b3MnIH0sXG4gICAgICBjYWxlbmRhcl9ieV9jcmVhdGVkOiB7IGxhYmVsOiAnQ2FsZW5kYXJpbyBkZSBQcm9zcGVjdG9zJyB9LFxuICAgICAgZ2FsbGVyeV92aWV3OiB7IGxhYmVsOiAnR2FsZXJcdTAwRURhIGRlIFByb3NwZWN0b3MnIH0sXG4gICAgICBteV9sZWFkczogeyBsYWJlbDogJ01pcyBQcm9zcGVjdG9zJyB9LFxuICAgICAgaGlnaF9wcmlvcml0eTogeyBsYWJlbDogJ0FsdGEgUHJpb3JpZGFkJyB9LFxuICAgICAgaG90X2xlYWRzOiB7IGxhYmVsOiAnXHVEODNEXHVERDI1IFByb3NwZWN0b3MgQ2FsaWVudGVzJyB9LFxuICAgICAgc3VzcGVjdGVkX2R1cGxpY2F0ZXM6IHtcbiAgICAgICAgbGFiZWw6ICdEdXBsaWNhZG9zIFNvc3BlY2hvc29zJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnU2luIGR1cGxpY2Fkb3Mgc29zcGVjaG9zb3MnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdOYWRhIHF1ZSByZXZpc2FyOiBzZSBoYW4gY29tcHJvYmFkbyB0b2RvcyBsb3MgY29ycmVvcyByZWNhcHR1cmFkb3MuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIC8vIENsYXZlcyBkZSBzZWNjaVx1MDBGM24gZGVsIG9iamV0byAobGVhZC5vYmplY3QudHMpIHF1ZSB1c2FuIGxvc1xuICAgICAgLy8gZm9ybXVsYXJpb3MgZGUgcmVnaXN0cm8geSBsYSBwXHUwMEUxZ2luYSBkZSBkZXRhbGxlLCBjdXlhcyBzZWNjaW9uZXNcbiAgICAgIC8vIGhhY2VuIHJlZmVyZW5jaWEgYSBlc3RvcyBncnVwb3MgKCM4MDYpLlxuICAgICAgYWRkcmVzczogeyBsYWJlbDogJ0RpcmVjY2lcdTAwRjNuJyB9LFxuICAgICAgaWRlbnRpdHk6IHsgbGFiZWw6ICdJZGVudGlkYWQnIH0sXG4gICAgICBjb21wYW55X2luZm86IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlIGxhIEVtcHJlc2EnIH0sXG4gICAgICBjb250YWN0X2luZm86IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlIENvbnRhY3RvJyB9LFxuICAgICAgcXVhbGlmaWNhdGlvbjogeyBsYWJlbDogJ0NhbGlmaWNhY2lcdTAwRjNuJyB9LFxuICAgICAgYXNzaWdubWVudDogeyBsYWJlbDogJ0FzaWduYWNpXHUwMEYzbicgfSxcbiAgICAgIGNvbnZlcnNpb246IHsgbGFiZWw6ICdDb252ZXJzaVx1MDBGM24nIH0sXG4gICAgICBhZGRpdGlvbmFsOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBBZGljaW9uYWwnIH0sXG4gICAgICBwcmVmZXJlbmNlczogeyBsYWJlbDogJ1ByZWZlcmVuY2lhcyBkZSBDb211bmljYWNpXHUwMEYzbicgfSxcbiAgICAgIGR1cGxpY2F0ZXM6IHsgbGFiZWw6ICdHZXN0aVx1MDBGM24gZGUgRHVwbGljYWRvcycgfSxcbiAgICAgIC8vIE5vbWJyZXMgZGUgc2VjY2lcdTAwRjNuIGRlbCBmb3JtdWxhcmlvIGVuIGxlYWQudmlldy50cyAoIzExMDApIFx1MjAxNCBhcXVcdTAwRURcbiAgICAgIC8vIHZpdmVuIGxhcyBzZWNjaW9uZXMgZGVsIGZvcm11bGFyaW8gcG9yIGRlZmVjdG8geSBsYXMgZGUgY2FkYSBmb3JtVmlld1xuICAgICAgLy8gY29uIG5vbWJyZTogc2kgc2UgYVx1MDBGMWFkZSB1biBmb3JtdWxhcmlvIGFsbFx1MDBFRCwgc2UgYVx1MDBGMWFkZW4gYXF1XHUwMEVEIHN1c1xuICAgICAgLy8gbm9tYnJlcyBkZSBzZWNjaVx1MDBGM24uXG4gICAgICBjb250YWN0X2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBkZSBDb250YWN0bycgfSxcbiAgICAgIGxlYWRfY2xhc3NpZmljYXRpb246IHsgbGFiZWw6ICdDbGFzaWZpY2FjaVx1MDBGM24gZGVsIExlYWQnIH0sXG4gICAgICBjb21wYW55X2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBkZSBsYSBFbXByZXNhJyB9LFxuICAgICAgYWRkaXRpb25hbF9pbmZvcm1hdGlvbjogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gQWRpY2lvbmFsJyB9LFxuICAgICAgcHJpdmFjeTogeyBsYWJlbDogJ1ByaXZhY2lkYWQnIH0sXG4gICAgICBnZW5lcmFsOiB7IGxhYmVsOiAnR2VuZXJhbCcgfSxcbiAgICAgIGRldGFpbHM6IHsgbGFiZWw6ICdEZXRhbGxlcycgfSxcbiAgICAgIHN0ZXBfMV9jb250YWN0X2RldGFpbHM6IHsgbGFiZWw6ICdQYXNvIDE6IERhdG9zIGRlIENvbnRhY3RvJyB9LFxuICAgICAgc3RlcF8yX2NvbXBhbnlfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdQYXNvIDI6IEluZm9ybWFjaVx1MDBGM24gZGUgbGEgRW1wcmVzYScgfSxcbiAgICAgIHN0ZXBfM19xdWFsaWZpY2F0aW9uOiB7IGxhYmVsOiAnUGFzbyAzOiBDYWxpZmljYWNpXHUwMEYzbicgfSxcbiAgICAgIHN0ZXBfNF9yZXZpZXdfYW5kX2NvbnZlcnQ6IHsgbGFiZWw6ICdQYXNvIDQ6IFJldmlzYXIgeSBDb252ZXJ0aXInIH0sXG4gICAgICBwcmltYXJ5X2luZm9ybWF0aW9uOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBQcmluY2lwYWwnIH0sXG4gICAgICBleHRlbmRlZF9kZXRhaWxzOiB7IGxhYmVsOiAnRGV0YWxsZXMgQW1wbGlhZG9zJyB9LFxuICAgICAgcXVpY2tfZWRpdDogeyBsYWJlbDogJ0VkaWNpXHUwMEYzbiBSXHUwMEUxcGlkYScgfSxcbiAgICAgIHVwZGF0ZV9sZWFkX3N0YXR1czogeyBsYWJlbDogJ0FjdHVhbGl6YXIgRXN0YWRvIGRlbCBMZWFkJyB9LFxuICAgICAgdGVsbF91c19hYm91dF95b3Vyc2VsZjogeyBsYWJlbDogJ0N1XHUwMEU5bnRhbm9zIHNvYnJlIHRpJyB9LFxuICAgICAgYWJvdXRfeW91cl9jb21wYW55OiB7IGxhYmVsOiAnU29icmUgdHUgZW1wcmVzYScgfSxcbiAgICAgIGhvd19jYW5fd2VfaGVscDogeyBsYWJlbDogJ1x1MDBCRkNcdTAwRjNtbyBwb2RlbW9zIGF5dWRhcnRlPycgfSxcbiAgICAgIGxlYWRfaW5mb3JtYXRpb246IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlbCBMZWFkJyB9LFxuICAgICAgYWRkcmVzc19pbmZvcm1hdGlvbjogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gZGUgRGlyZWNjaVx1MDBGM24nIH0sXG4gICAgICBwcml2YWN5X3ByZWZlcmVuY2VzOiB7IGxhYmVsOiAnUHJlZmVyZW5jaWFzIGRlIFByaXZhY2lkYWQnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgY29udmVydF9sZWFkOiB7XG4gICAgICAgIGxhYmVsOiAnQ29udmVydGlyIFByb3NwZWN0bycsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUwMEExUHJvc3BlY3RvIGNvbnZlcnRpZG8gY29uIFx1MDBFOXhpdG8hJyxcbiAgICAgIH0sXG4gICAgICBjcmVhdGVfY2FtcGFpZ246IHtcbiAgICAgICAgbGFiZWw6ICdBZ3JlZ2FyIGEgQ2FtcGFcdTAwRjFhJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTAwQTFQcm9zcGVjdG8gYWdyZWdhZG8gYSBsYSBjYW1wYVx1MDBGMWEhJyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnQ2FtcGFcdTAwRjFhJyB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNjaGVkdWxlX2ZvbGxvd3VwOiB7XG4gICAgICAgIGxhYmVsOiAnUHJvZ3JhbWFyIFNlZ3VpbWllbnRvJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdTZWd1aW1pZW50byBwcm9ncmFtYWRvLicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9vcHBvcnR1bml0eToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgYW1vdW50X3Bvc2l0aXZlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdFbCBpbXBvcnRlIGRlYmUgc2VyIG1heW9yIHF1ZSBjZXJvJyxcbiAgICAgIH0sXG4gICAgICBjbG9zZV9kYXRlX2Z1dHVyZToge1xuICAgICAgICBtZXNzYWdlOiAnTGEgZmVjaGEgZGUgY2llcnJlIG5vIGRlYmVyXHUwMEVEYSBlc3RhciBlbiBlbCBwYXNhZG8gc2Fsdm8gcXVlIGxhIG9wb3J0dW5pZGFkIGVzdFx1MDBFOSBjZXJyYWRhJyxcbiAgICAgIH0sXG4gICAgICBvcHBvcnR1bml0eV9zdGFnZV9wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnVHJhbnNpY2lcdTAwRjNuIGRlIGV0YXBhIGRlIG9wb3J0dW5pZGFkIG5vIHZcdTAwRTFsaWRhJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ09wb3J0dW5pZGFkJyxcbiAgICBwbHVyYWxMYWJlbDogJ09wb3J0dW5pZGFkZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnT3BvcnR1bmlkYWRlcyBkZSB2ZW50YSB5IG5lZ29jaW9zIGVuIGVsIHBpcGVsaW5lJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdOb21icmUgZGUgT3BvcnR1bmlkYWQnIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ0N1ZW50YScgfSxcbiAgICAgIHByaW1hcnlfY29udGFjdDogeyBsYWJlbDogJ0NvbnRhY3RvIFByaW5jaXBhbCcgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnUHJvcGlldGFyaW8gZGUgT3BvcnR1bmlkYWQnIH0sXG4gICAgICBhbW91bnQ6IHsgbGFiZWw6ICdNb250bycgfSxcbiAgICAgIGV4cGVjdGVkX3JldmVudWU6IHsgbGFiZWw6ICdJbmdyZXNvIEVzcGVyYWRvJyB9LFxuICAgICAgc3RhZ2U6IHtcbiAgICAgICAgbGFiZWw6ICdFdGFwYScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwcm9zcGVjdGluZzogJ1Byb3NwZWNjaVx1MDBGM24nLCBxdWFsaWZpY2F0aW9uOiAnQ2FsaWZpY2FjaVx1MDBGM24nLFxuICAgICAgICAgIG5lZWRzX2FuYWx5c2lzOiAnQW5cdTAwRTFsaXNpcyBkZSBOZWNlc2lkYWRlcycsIHByb3Bvc2FsOiAnUHJvcHVlc3RhJyxcbiAgICAgICAgICBuZWdvdGlhdGlvbjogJ05lZ29jaWFjaVx1MDBGM24nLCBjbG9zZWRfd29uOiAnQ2VycmFkYSBHYW5hZGEnLCBjbG9zZWRfbG9zdDogJ0NlcnJhZGEgUGVyZGlkYScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcHJvYmFiaWxpdHk6IHsgbGFiZWw6ICdQcm9iYWJpbGlkYWQgKCUpJyB9LFxuICAgICAgY2xvc2VfZGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIENpZXJyZScgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ld19idXNpbmVzczogJ051ZXZvIE5lZ29jaW8nLFxuICAgICAgICAgIGV4aXN0aW5nX3VwZ3JhZGU6ICdDbGllbnRlIEV4aXN0ZW50ZSAtIE1lam9yYScsXG4gICAgICAgICAgZXhpc3RpbmdfcmVuZXdhbDogJ0NsaWVudGUgRXhpc3RlbnRlIC0gUmVub3ZhY2lcdTAwRjNuJyxcbiAgICAgICAgICBleGlzdGluZ19leHBhbnNpb246ICdDbGllbnRlIEV4aXN0ZW50ZSAtIEV4cGFuc2lcdTAwRjNuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeToge1xuICAgICAgICBsYWJlbDogJ0NhdGVnb3JcdTAwRURhIGRlIFByb25cdTAwRjNzdGljbycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwaXBlbGluZTogJ1BpcGVsaW5lJywgYmVzdF9jYXNlOiAnTWVqb3IgQ2FzbycsXG4gICAgICAgICAgY29tbWl0OiAnQ29tcHJvbWlzbycsIG9taXR0ZWQ6ICdPbWl0aWRhJywgY2xvc2VkOiAnQ2VycmFkYScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwY2lcdTAwRjNuJyB9LFxuICAgICAgbmV4dF9zdGVwOiB7IGxhYmVsOiAnUHJcdTAwRjN4aW1vIFBhc28nIH0sXG4gICAgICBsZWFkX3NvdXJjZToge1xuICAgICAgICBsYWJlbDogJ09yaWdlbiBkZWwgUHJvc3BlY3RvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHdlYjogJ1dlYicsIHJlZmVycmFsOiAnUmVmZXJlbmNpYScsIGV2ZW50OiAnRXZlbnRvIC8gRmVyaWEnLFxuICAgICAgICAgIHdlYmluYXI6ICdTZW1pbmFyaW8gV2ViJywgcGFydG5lcjogJ1NvY2lvJywgYWR2ZXJ0aXNlbWVudDogJ1B1YmxpY2lkYWQnLFxuICAgICAgICAgIHBhaWRfc2VhcmNoOiAnQlx1MDBGQXNxdWVkYSBkZSBQYWdvJywgc29jaWFsOiAnUmVkZXMgU29jaWFsZXMnLCBjb250ZW50OiAnQ29udGVuaWRvIC8gQmxvZycsXG4gICAgICAgICAgY29sZF9jYWxsOiAnTGxhbWFkYSBlbiBGclx1MDBFRG8nLCBlbWFpbF9jYW1wYWlnbjogJ0NhbXBhXHUwMEYxYSBkZSBFbWFpbCcsIG90aGVyOiAnT3RybycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnQ2FtcGFcdTAwRjFhJywgaGVscDogJ0NhbXBhXHUwMEYxYSBkZSBtYXJrZXRpbmcgcXVlIGdlbmVyXHUwMEYzIGVzdGEgb3BvcnR1bmlkYWQnIH0sXG4gICAgICBkYXlzX2luX3N0YWdlOiB7IGxhYmVsOiAnRFx1MDBFRGFzIGVuIEV0YXBhIEFjdHVhbCcgfSxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBkZSBFbnRyYWRhIGEgbGEgRXRhcGEnLCBoZWxwOiAnRmVjaGEgZW4gbGEgcXVlIGVzdGEgb3BvcnR1bmlkYWQgZW50clx1MDBGMyBlbiBzdSBldGFwYSBhY3R1YWwuJyB9LFxuICAgICAgaXNfcHJpdmF0ZTogeyBsYWJlbDogJ1ByaXZhZG8nIH0sXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdFc3RhZG8gZGUgQXByb2JhY2lcdTAwRjNuJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5vdF9yZXF1aXJlZDogJ05vIFJlcXVlcmlkYScsIHBlbmRpbmc6ICdQZW5kaWVudGUnLFxuICAgICAgICAgIGFwcHJvdmVkOiAnQXByb2JhZGEnLCByZWplY3RlZDogJ1JlY2hhemFkYScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXBwcm92ZWRfZGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIEFwcm9iYWNpXHUwMEYzbicgfSxcbiAgICAgIC8vICM1OTMgXHUyMDE0IG9ibGlnYXRvcmlhcyBhbCBjZXJyYXIgbGEgb3BvcnR1bmlkYWQsIHkgZWwgZGVzZ2xvc2UgZGVcbiAgICAgIC8vIG1vdGl2b3MgZGUgcFx1MDBFOXJkaWRhIGxhcyBtdWVzdHJhIGVuIGVsIHBhbmVsIGRlIHZlbnRhcywgYXNcdTAwRUQgcXVlIGVsXG4gICAgICAvLyB2YWxvciBhbG1hY2VuYWRvIG51bmNhIGRlYmUgbGxlZ2FyIGNydWRvIGFsIHNlbGVjdG9yLlxuICAgICAgd2luX3JlYXNvbjoge1xuICAgICAgICBsYWJlbDogJ01vdGl2byBkZSBHYW5hbmNpYScsXG4gICAgICAgIGhlbHA6ICdQb3IgcXVcdTAwRTkgc2UgZ2FuXHUwMEYzIGVzdGUgbmVnb2Npby4gT2JsaWdhdG9yaW8gcGFyYSBjZXJyYXIgdW5hIG9wb3J0dW5pZGFkIGNvbW8gR2FuYWRhLicsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBiZXR0ZXJfcHJvZHVjdDogJ01lam9yIFByb2R1Y3RvJywgYmV0dGVyX3ByaWNlOiAnTWVqb3IgUHJlY2lvJyxcbiAgICAgICAgICByZWxhdGlvbnNoaXA6ICdSZWxhY2lcdTAwRjNuIEV4aXN0ZW50ZScsIGJldHRlcl9zdXBwb3J0OiAnTWVqb3IgU29wb3J0ZScsXG4gICAgICAgICAgYmVzdF9maXQ6ICdNZWpvciBBanVzdGUgLyBGdW5jaW9uYWxpZGFkZXMnLFxuICAgICAgICAgIHF1b3RlX2FjY2VwdGVkOiAnQ290aXphY2lcdTAwRjNuIEFjZXB0YWRhJywgb3RoZXI6ICdPdHJvJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBsb3NzX3JlYXNvbjoge1xuICAgICAgICBsYWJlbDogJ01vdGl2byBkZSBQXHUwMEU5cmRpZGEnLFxuICAgICAgICBoZWxwOiAnUG9yIHF1XHUwMEU5IHNlIHBlcmRpXHUwMEYzIGVzdGUgbmVnb2Npby4gT2JsaWdhdG9yaW8gcGFyYSBjZXJyYXIgdW5hIG9wb3J0dW5pZGFkIGNvbW8gUGVyZGlkYS4nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcHJpY2U6ICdQcmVjaW8gRGVtYXNpYWRvIEFsdG8nLCBjb21wZXRpdG9yOiAnUGVyZGlkYSBhbnRlIENvbXBldGlkb3InLFxuICAgICAgICAgIG5vX2J1ZGdldDogJ1NpbiBQcmVzdXB1ZXN0bycsIG5vX2RlY2lzaW9uOiAnU2luIERlY2lzaVx1MDBGM24nLFxuICAgICAgICAgIHRpbWluZzogJ01vbWVudG8gSW5hZGVjdWFkbycsIGZlYXR1cmVzOiAnRnVuY2lvbmFsaWRhZGVzIEZhbHRhbnRlcycsIG90aGVyOiAnT3RybycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbG9zc19kZXRhaWxzOiB7XG4gICAgICAgIGxhYmVsOiAnRGV0YWxsZXMgZGUgR2FuYW5jaWEvUFx1MDBFOXJkaWRhJyxcbiAgICAgICAgaGVscDogJ0NvbnRleHRvIGVuIHRleHRvIGxpYnJlIGRldHJcdTAwRTFzIGRlbCBtb3Rpdm8gZGUgZ2FuYW5jaWEgbyBwXHUwMEU5cmRpZGEuJyxcbiAgICAgIH0sXG4gICAgICAvLyBSRVEtMDAwNiBcdTIwMTQgY2FsaWZpY2FjaVx1MDBGM24sIGNhbGVuZGFyaW8gZGUgY29tcHJhIGRlbCBjbGllbnRlLCBuYXJyYXRpdmFcbiAgICAgIC8vIGRlbCBuZWdvY2lvLCBsXHUwMEVEbmVhIGRlIG5lZ29jaW8geSBhcHJvYmFjaVx1MDBGM24gZGVsIGNhbWJpbyBkZSBlc3RhZG8uXG4gICAgICB3aWxsX2JpZDoge1xuICAgICAgICBsYWJlbDogJ1ByZXNlbnRhcmVtb3MgT2ZlcnRhJyxcbiAgICAgICAgaGVscDogJ1NpIHRlbmVtb3MgaW50ZW5jaVx1MDBGM24gZGUgcHJlc2VudGFyIG9mZXJ0YS4gU2luIHZhbG9yIHNpZ25pZmljYSBxdWUgbGEgZGVjaXNpXHUwMEYzbiBzaWd1ZSBhYmllcnRhLicsXG4gICAgICB9LFxuICAgICAgY29udHJvbGxhYmlsaXR5OiB7IGxhYmVsOiAnQ29udHJvbGFiaWxpZGFkJywgb3B0aW9uczogeyBoaWdoOiAnQWx0YScsIG1lZGl1bTogJ01lZGlhJywgbG93OiAnQmFqYScgfSB9LFxuICAgICAgcHJpb3JpdHk6IHsgbGFiZWw6ICdQcmlvcmlkYWQnLCBvcHRpb25zOiB7IGhpZ2g6ICdBbHRhJywgbWVkaXVtOiAnTWVkaWEnLCBsb3c6ICdCYWphJyB9IH0sXG4gICAgICBkZWFsX2xldmVsOiB7IGxhYmVsOiAnTml2ZWwgZGVsIE5lZ29jaW8nLCBvcHRpb25zOiB7IHN0cmF0ZWdpYzogJ0VzdHJhdFx1MDBFOWdpY28nLCBrZXk6ICdDbGF2ZScsIHN0YW5kYXJkOiAnRXN0XHUwMEUxbmRhcicgfSB9LFxuICAgICAgaXNfc3ViY29udHJhY3RlZDogeyBsYWJlbDogJ0luY2x1eWUgU3ViY29udHJhdGFjaVx1MDBGM24nIH0sXG4gICAgICBzdWJjb250cmFjdGluZ19ub3RlOiB7IGxhYmVsOiAnTm90YSBkZSBTdWJjb250cmF0YWNpXHUwMEYzbicgfSxcbiAgICAgIGN1c3RvbWVyX2luaXRpYXRpb25fZGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIEluaWNpbyBkZWwgUHJveWVjdG8gKENsaWVudGUpJyB9LFxuICAgICAgZXhwZWN0ZWRfdGVuZGVyX2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBQcmV2aXN0YSBkZSBMaWNpdGFjaVx1MDBGM24nIH0sXG4gICAgICBleHBlY3RlZF9zaWduaW5nX2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBQcmV2aXN0YSBkZSBGaXJtYScgfSxcbiAgICAgIGV4cGVjdGVkX3RlbmRlcl9hbW91bnQ6IHsgbGFiZWw6ICdJbXBvcnRlIFByZXZpc3RvIGRlIExpY2l0YWNpXHUwMEYzbicgfSxcbiAgICAgIGV4cGVjdGVkX3NpZ25pbmdfYW1vdW50OiB7IGxhYmVsOiAnSW1wb3J0ZSBQcmV2aXN0byBkZSBGaXJtYScgfSxcbiAgICAgIGJ1c2luZXNzX2xpbmU6IHtcbiAgICAgICAgbGFiZWw6ICdMXHUwMEVEbmVhIGRlIE5lZ29jaW8nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcHJvZHVjdDogJ1Byb2R1Y3RvJywgc2VydmljZXM6ICdTZXJ2aWNpb3MgUHJvZmVzaW9uYWxlcycsIGNvbnN1bHRpbmc6ICdDb25zdWx0b3JcdTAwRURhJyxcbiAgICAgICAgICBzdXBwb3J0OiAnU29wb3J0ZSB5IE1hbnRlbmltaWVudG8nLCBvdGhlcjogJ090cm8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGN1c3RvbWVyX2JhY2tncm91bmQ6IHsgbGFiZWw6ICdBbnRlY2VkZW50ZXMgZGVsIENsaWVudGUnIH0sXG4gICAgICBwcm9qZWN0X2JhY2tncm91bmQ6IHsgbGFiZWw6ICdBbnRlY2VkZW50ZXMgZGVsIFByb3llY3RvJyB9LFxuICAgICAgcmlza19hbmFseXNpczogeyBsYWJlbDogJ0FuXHUwMEUxbGlzaXMgZGUgUmllc2dvcycgfSxcbiAgICAgIHBheW1lbnRfdGVybXM6IHsgbGFiZWw6ICdDb25kaWNpb25lcyBkZSBQYWdvJyB9LFxuICAgICAgcmVxdWVzdGVkX3N0YXR1czogeyBsYWJlbDogJ0VzdGFkbyBTb2xpY2l0YWRvJywgb3B0aW9uczogeyBjbG9zZWRfd29uOiAnR2FuYWRhJywgY2xvc2VkX2xvc3Q6ICdQZXJkaWRhJyB9IH0sXG4gICAgICBzdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1czoge1xuICAgICAgICBsYWJlbDogJ0Fwcm9iYWNpXHUwMEYzbiBkZWwgQ2FtYmlvIGRlIEVzdGFkbycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBub3RfcmVxdWlyZWQ6ICdObyBSZXF1ZXJpZGEnLCBwZW5kaW5nOiAnUGVuZGllbnRlJyxcbiAgICAgICAgICBhcHByb3ZlZDogJ0Fwcm9iYWRhJywgcmVqZWN0ZWQ6ICdSZWNoYXphZGEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIC8vIFJFUS0wMDA2IHBhc28gMTEgXHUyMDE0IGxhIGFwcm9iYWNpXHUwMEYzbiBkZSBjYWxpZmljYWNpXHUwMEYzbiAoXHU3QUNCXHU5ODc5KS5cbiAgICAgIHF1YWxpZmljYXRpb25fcmVxdWVzdGVkOiB7XG4gICAgICAgIGxhYmVsOiAnU29saWNpdGFyIEFwcm9iYWNpXHUwMEYzbiBkZSBDYWxpZmljYWNpXHUwMEYzbicsXG4gICAgICAgIGhlbHA6ICdNXHUwMEUxcnF1ZWxvIHBhcmEgZW52aWFyIGVzdGUgbmVnb2NpbyBhIGFwcm9iYWNpXHUwMEYzbiBkZSBjYWxpZmljYWNpXHUwMEYzbi4gVW4gcmVjaGF6byBsbyBkZXNtYXJjYTsgdnVlbHZhIGEgbWFyY2FybG8gcGFyYSBzb2xpY2l0YXJsYSBkZSBudWV2by4nLFxuICAgICAgfSxcbiAgICAgIHF1YWxpZmljYXRpb25fYXBwcm92YWxfc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnQXByb2JhY2lcdTAwRjNuIGRlIENhbGlmaWNhY2lcdTAwRjNuJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5vdF9yZXF1aXJlZDogJ05vIFJlcXVlcmlkYScsIHBlbmRpbmc6ICdQZW5kaWVudGUnLFxuICAgICAgICAgIGFwcHJvdmVkOiAnQXByb2JhZGEnLCByZWplY3RlZDogJ1JlY2hhemFkYScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICB0ZW5kZXJfdGhpc19xdWFydGVyOiB7XG4gICAgICAgIGxhYmVsOiAnTGljaXRhY2lvbmVzIGRlIEVzdGUgVHJpbWVzdHJlJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnTm8gaGF5IGxpY2l0YWNpb25lcyBwcmV2aXN0YXMgZXN0ZSB0cmltZXN0cmUnLFxuICAgICAgICAgIG1lc3NhZ2U6ICdFc3RhIHBlc3RhXHUwMEYxYSBtdWVzdHJhIGxvcyBuZWdvY2lvcyBhYmllcnRvcyBjdXlhIGZlY2hhIGRlIGxpY2l0YWNpXHUwMEYzbiBkZWwgY2xpZW50ZSBjYWUgZGVudHJvIGRlbCB0cmltZXN0cmUgYWN0dWFsLiBSZWdpc3RyYSBsYSBGZWNoYSBQcmV2aXN0YSBkZSBMaWNpdGFjaVx1MDBGM24gZW4gdW4gbmVnb2NpbyBwYXJhIHZlcmxvIGFxdVx1MDBFRC4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG9wZW5fb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ09wb3J0dW5pZGFkZXMgQWJpZXJ0YXMnIH0sXG4gICAgICBhbGxfb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ1RvZGFzIGxhcyBPcG9ydHVuaWRhZGVzJyB9LFxuICAgICAgcGlwZWxpbmVfa2FuYmFuOiB7IGxhYmVsOiAnUGlwZWxpbmUgZGUgVmVudGFzJyB9LFxuICAgICAgY2xvc2VfZGF0ZV9jYWxlbmRhcjogeyBsYWJlbDogJ0NhbGVuZGFyaW8gZGUgUHJvblx1MDBGM3N0aWNvJyB9LFxuICAgICAgZGVhbF90aW1lbGluZTogeyBsYWJlbDogJ0xcdTAwRURuZWEgZGUgVGllbXBvJyB9LFxuICAgICAgZGVhbF9nYWxsZXJ5OiB7IGxhYmVsOiAnR2FsZXJcdTAwRURhIGRlIE5lZ29jaW9zJyB9LFxuICAgICAgbXlfb3Blbl9kZWFsczogeyBsYWJlbDogJ01pcyBOZWdvY2lvcyBBYmllcnRvcycgfSxcbiAgICAgIGNsb3NpbmdfdGhpc19xdWFydGVyOiB7XG4gICAgICAgIGxhYmVsOiAnQ2llcnJlcyBkZSBFc3RlIFRyaW1lc3RyZScsXG4gICAgICAgIGVtcHR5U3RhdGU6IHtcbiAgICAgICAgICB0aXRsZTogJ05vIGhheSBuZWdvY2lvcyBxdWUgY2llcnJlbiBlc3RlIHRyaW1lc3RyZScsXG4gICAgICAgICAgbWVzc2FnZTogJ0VzdGEgcGVzdGFcdTAwRjFhIG11ZXN0cmEgbG9zIG5lZ29jaW9zIGFiaWVydG9zIGVuIGNhdGVnb3JcdTAwRURhIENvbXByb21pc28gbyBNZWpvciBDYXNvIGN1eWEgZmVjaGEgZGUgY2llcnJlIGNhZSBkZW50cm8gZGVsIHRyaW1lc3RyZSBhY3R1YWwuIEFob3JhIG1pc21vIG5vIGhheSBuaW5ndW5vOyBsb3MgbmVnb2Npb3MgcXVlIGNpZXJyYW4gbVx1MDBFMXMgYWRlbGFudGUgZXN0XHUwMEUxbiBlbiBsYSBwZXN0YVx1MDBGMWEgTmVnb2Npb3MgQWJpZXJ0b3MuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGFsZV9vcHBvcnR1bml0aWVzOiB7IGxhYmVsOiAnXHUyNkEwXHVGRTBGIE9wb3J0dW5pZGFkZXMgRXN0YW5jYWRhcyBcdTAwQjcgTVx1MDBFMXMgVGllbXBvIGVuIEV0YXBhIFByaW1lcm8nIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIC8vIENsYXZlcyBkZSBzZWNjaVx1MDBGM24gZGVsIG9iamV0byAob3Bwb3J0dW5pdHkub2JqZWN0LnRzKSBxdWUgdXNhbiBsb3NcbiAgICAgIC8vIGZvcm11bGFyaW9zIGRlIHJlZ2lzdHJvIHkgbGEgcFx1MDBFMWdpbmEgZGUgZGV0YWxsZSwgY3V5YXMgc2VjY2lvbmVzXG4gICAgICAvLyBoYWNlbiByZWZlcmVuY2lhIGEgZXN0b3MgZ3J1cG9zICgjMTQ1MikuXG4gICAgICAvL1xuICAgICAgLy8gYGNybV9mb3JlY2FzdGAgZXMgbGEgY2xhdmUgZGVsIGdydXBvIGRlIGNhbXBvcyAoXHUwMEFCRm9yZWNhc3QgJiBNZXRyaWNzXHUwMEJCXG4gICAgICAvLyBlbiBpbmdsXHUwMEU5cykuIEVzdGEgdHJhZHVjY2lcdTAwRjNuIGVzIGFudGVyaW9yIGEgIzE0NTIsIGN1YW5kbyB1bmEgc2VjY2lcdTAwRjNuXG4gICAgICAvLyBkZSBsYSBwXHUwMEUxZ2luYSBkZSBkZXRhbGxlIGNvbiBlbCBtaXNtbyBub21icmUgc2UgdGl0dWxhYmEgXHUwMEFCU3RhZ2UgJlxuICAgICAgLy8gRm9yZWNhc3RcdTAwQkI7IGRlc2RlIGVudG9uY2VzIHNvbG8gbGEgbGVlIGVsIGdydXBvLlxuICAgICAgY3JtX2ZvcmVjYXN0OiB7IGxhYmVsOiAnRXRhcGEgeSBQcmV2aXNpXHUwMEYzbicgfSxcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBCXHUwMEUxc2ljYScgfSxcbiAgICAgIGZpbmFuY2lhbHM6IHsgbGFiZWw6ICdEYXRvcyBGaW5hbmNpZXJvcycgfSxcbiAgICAgIHNhbGVzX3Byb2Nlc3M6IHsgbGFiZWw6ICdQcm9jZXNvIGRlIFZlbnRhJyB9LFxuICAgICAgY2xhc3NpZmljYXRpb246IHsgbGFiZWw6ICdDbGFzaWZpY2FjaVx1MDBGM24nIH0sXG4gICAgICBjYW1wYWlnbjogeyBsYWJlbDogJ0NhbXBhXHUwMEYxYXMnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ05vdGFzIHkgUHJcdTAwRjN4aW1vcyBQYXNvcycgfSxcbiAgICAgIHF1YWxpZmljYXRpb246IHsgbGFiZWw6ICdDYWxpZmljYWNpXHUwMEYzbicgfSxcbiAgICAgIG5hcnJhdGl2ZTogeyBsYWJlbDogJ05hcnJhdGl2YSBkZWwgTmVnb2NpbycgfSxcbiAgICAgIC8vIE5vbWJyZXMgZGUgc2VjY2lcdTAwRjNuIGRlbCBmb3JtdWxhcmlvIGVuIG9wcG9ydHVuaXR5LnZpZXcudHMgKCMxMTAwKVxuICAgICAgb3ZlcnZpZXc6IHsgbGFiZWw6ICdSZXN1bWVuJyB9LFxuICAgICAgZm9yZWNhc3Q6IHsgbGFiZWw6ICdQcmV2aXNpXHUwMEYzbicgfSxcbiAgICAgIHNhbGVzX3N0cmF0ZWd5OiB7IGxhYmVsOiAnRXN0cmF0ZWdpYSBkZSBWZW50YXMnIH0sXG4gICAgICB3aW5fbG9zczogeyBsYWJlbDogJ0dhbmFkYSAvIFBlcmRpZGEnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgY2xvbmVfb3Bwb3J0dW5pdHk6IHtcbiAgICAgICAgbGFiZWw6ICdDbG9uYXIgT3BvcnR1bmlkYWQnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1MDBBMU9wb3J0dW5pZGFkIGNsb25hZGEgY29uIFx1MDBFOXhpdG8hJyxcbiAgICAgIH0sXG4gICAgICBtYXNzX3VwZGF0ZV9zdGFnZToge1xuICAgICAgICBsYWJlbDogJ0FjdHVhbGl6YXIgRXRhcGEnLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1MDBBMUV0YXBhIGRlIG9wb3J0dW5pZGFkIGFjdHVhbGl6YWRhIScsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIC8vIE1pc21vcyB2YWxvcmVzIHF1ZSBgZmllbGRzLnN0YWdlYCBcdTIwMTQgZGViZW4gY29pbmNpZGlyIGxpdGVyYWxtZW50ZS5cbiAgICAgICAgICBzdGFnZToge1xuICAgICAgICAgICAgbGFiZWw6ICdOdWV2YSBFdGFwYScsXG4gICAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICAgIHByb3NwZWN0aW5nOiAnUHJvc3BlY2NpXHUwMEYzbicsIHF1YWxpZmljYXRpb246ICdDYWxpZmljYWNpXHUwMEYzbicsXG4gICAgICAgICAgICAgIG5lZWRzX2FuYWx5c2lzOiAnQW5cdTAwRTFsaXNpcyBkZSBOZWNlc2lkYWRlcycsIHByb3Bvc2FsOiAnUHJvcHVlc3RhJyxcbiAgICAgICAgICAgICAgbmVnb3RpYXRpb246ICdOZWdvY2lhY2lcdTAwRjNuJywgY2xvc2VkX3dvbjogJ0NlcnJhZGEgR2FuYWRhJywgY2xvc2VkX2xvc3Q6ICdDZXJyYWRhIFBlcmRpZGEnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGdlbmVyYXRlX3F1b3RlOiB7XG4gICAgICAgIGxhYmVsOiAnR2VuZXJhciBDb3RpemFjaVx1MDBGM24nLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ1x1MDBBMUNvdGl6YWNpXHUwMEYzbiBjcmVhZGEgZGVzZGUgbGEgb3BvcnR1bmlkYWQhJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgdW5pdF9wcmljZV9wb3NpdGl2ZToge1xuICAgICAgICBtZXNzYWdlOiAnRWwgcHJlY2lvIGRlIHZlbnRhIG5vIHB1ZWRlIHNlciBuZWdhdGl2bycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdMXHUwMEVEbmVhIGRlIE9wb3J0dW5pZGFkJyxcbiAgICBwbHVyYWxMYWJlbDogJ0xcdTAwRURuZWFzIGRlIE9wb3J0dW5pZGFkJyxcbiAgICBkZXNjcmlwdGlvbjogJ0xcdTAwRURuZWFzIGRlIHByZWNpbyBwb3IgcHJvZHVjdG8gZGVudHJvIGRlIHVuYSBvcG9ydHVuaWRhZCcsXG4gICAgZmllbGRzOiB7XG4gICAgICBjcm1fb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdPcG9ydHVuaWRhZCcgfSxcbiAgICAgIGNybV9wcm9kdWN0OiB7IGxhYmVsOiAnUHJvZHVjdG8nIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXBjaVx1MDBGM24nIH0sXG4gICAgICBxdWFudGl0eTogeyBsYWJlbDogJ0NhbnRpZGFkJyB9LFxuICAgICAgbGlzdF9wcmljZTogeyBsYWJlbDogJ1ByZWNpbyBkZSBMaXN0YScsIGhlbHA6ICdTZSByZWxsZW5hIGF1dG9tXHUwMEUxdGljYW1lbnRlIGRlc2RlIGVsIFByZWNpbyBkZSBMaXN0YSBkZWwgcHJvZHVjdG8uJyB9LFxuICAgICAgdW5pdF9wcmljZTogeyBsYWJlbDogJ1ByZWNpbyBkZSBWZW50YScsIGhlbHA6ICdQcmVjaW8gdW5pdGFyaW8gbmVnb2NpYWRvIChwdWVkZSBkaWZlcmlyIGRlbCBwcmVjaW8gZGUgbGlzdGEpJyB9LFxuICAgICAgZGlzY291bnQ6IHsgbGFiZWw6ICdEZXNjdWVudG8gKCUpJyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdUb3RhbCcgfSxcbiAgICAgIGxpbmVfbnVtYmVyOiB7IGxhYmVsOiAnTlx1MDBCQSBkZSBMXHUwMEVEbmVhJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0xcdTAwRURuZWEnIH0sXG4gICAgICBwcmljaW5nOiB7IGxhYmVsOiAnUHJlY2lvcycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fZm9yZWNhc3Q6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIHBlcmlvZF9lbmRfYWZ0ZXJfc3RhcnQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0VsIGZpbiBkZWwgcGVyaW9kbyBkZWJlIHNlciBwb3N0ZXJpb3IgYSBzdSBpbmljaW8uJyxcbiAgICAgIH0sXG4gICAgICBwZXJpb2RfZW5kX21hdGNoZXNfY2FsZW5kYXJfcGVyaW9kOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdFbCBmaW4gZGVsIHBlcmlvZG8gZGViZSBzZXIgZWwgXHUwMEZBbHRpbW8gZFx1MDBFRGEgZGVsIHBlcmlvZG86IHAuIGVqLiAyMDI2LTA5LTMwIHBhcmEgdW4gdHJpbWVzdHJlIHF1ZSBlbXBpZXphIGVsIDIwMjYtMDctMDEsIG8gMjAyNi0wOC0zMSBwYXJhIGFnb3N0byBkZSAyMDI2LicsXG4gICAgICB9LFxuICAgICAgcGVyaW9kX3N0YXJ0X2ZpcnN0X29mX3BlcmlvZDoge1xuICAgICAgICBtZXNzYWdlOiAnRWwgaW5pY2lvIGRlbCBwZXJpb2RvIGRlYmUgc2VyIGVsIHByaW1lciBkXHUwMEVEYSBkZWwgcGVyaW9kbzogcC4gZWouIDIwMjYtMDgtMDEgcGFyYSBhZ29zdG8gZGUgMjAyNi4nLFxuICAgICAgfSxcbiAgICAgIHF1YXJ0ZXJfc3RhcnRzX29uX3F1YXJ0ZXJfYm91bmRhcnk6IHtcbiAgICAgICAgbWVzc2FnZTogJ1VuYSBwcmV2aXNpXHUwMEYzbiB0cmltZXN0cmFsIGRlYmUgY29tZW56YXIgZW4gdW4gbFx1MDBFRG1pdGUgZGUgdHJpbWVzdHJlOiAxIGRlIGVuZXJvLCAxIGRlIGFicmlsLCAxIGRlIGp1bGlvIG8gMSBkZSBvY3R1YnJlLicsXG4gICAgICB9LFxuICAgICAgc25hcHNob3RfYW1vdW50c19ub25fbmVnYXRpdmU6IHtcbiAgICAgICAgbWVzc2FnZTogJ0xvcyBpbXBvcnRlcyBkZSBsYSBpbnN0YW50XHUwMEUxbmVhIG5vIHB1ZWRlbiBzZXIgbmVnYXRpdm9zLicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdQcmV2aXNpXHUwMEYzbicsXG4gICAgcGx1cmFsTGFiZWw6ICdQcmV2aXNpb25lcycsXG4gICAgZGVzY3JpcHRpb246ICdJbnN0YW50XHUwMEUxbmVhIHBlcmlcdTAwRjNkaWNhIGRlbCBwaXBlbGluZSBwb3IgcHJvcGlldGFyaW8gcGFyYSBwcmV2aXNpXHUwMEYzbiBkZSBpbmdyZXNvcycsXG4gICAgZmllbGRzOiB7XG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1Byb3BpZXRhcmlvJyB9LFxuICAgICAgcGVyaW9kOiB7IGxhYmVsOiAnUGVyaW9kbycsIG9wdGlvbnM6IHsgbW9udGg6ICdNZXMnLCBxdWFydGVyOiAnVHJpbWVzdHJlJyB9IH0sXG4gICAgICBwZXJpb2Rfc3RhcnQ6IHtcbiAgICAgICAgbGFiZWw6ICdJbmljaW8gZGVsIHBlcmlvZG8nLFxuICAgICAgICBoZWxwOiAnRGViZSBzZXIgZWwgcHJpbWVyIGRcdTAwRURhIGRlbCBwZXJpb2RvIFx1MjAxNCBwLiBlai4gMjAyNi0wOC0wMSBwYXJhIGFnb3N0byBkZSAyMDI2LiBBZGVtXHUwMEUxcywgdW5hIHByZXZpc2lcdTAwRjNuIHRyaW1lc3RyYWwgZGViZSBjb21lbnphciBlbiB1biBsXHUwMEVEbWl0ZSBkZSB0cmltZXN0cmU6IDEgZGUgZW5lcm8sIDEgZGUgYWJyaWwsIDEgZGUganVsaW8gbyAxIGRlIG9jdHVicmUuJyxcbiAgICAgIH0sXG4gICAgICBwZXJpb2RfZW5kOiB7XG4gICAgICAgIGxhYmVsOiAnRmluIGRlbCBwZXJpb2RvJyxcbiAgICAgICAgaGVscDogJ05vcm1hbG1lbnRlIHNlIGNhbGN1bGEgYXV0b21cdTAwRTF0aWNhbWVudGUgYSBwYXJ0aXIgZGUgUGVyaW9kbyBlIEluaWNpbyBkZWwgcGVyaW9kby4gU2kgc2UgaW50cm9kdWNlIGEgbWFubywgZGViZSBzZXIgZWwgXHUwMEZBbHRpbW8gZFx1MDBFRGEgZGUgZXNlIHBlcmlvZG8gXHUyMDE0IHAuIGVqLiAyMDI2LTA5LTMwIHBhcmEgdW4gdHJpbWVzdHJlIHF1ZSBlbXBpZXphIGVsIDIwMjYtMDctMDEsIG8gMjAyNi0wOC0zMSBwYXJhIGFnb3N0byBkZSAyMDI2LicsXG4gICAgICB9LFxuICAgICAgcGVyaW9kX2xhYmVsOiB7IGxhYmVsOiAnUGVyaW9kbycsIGhlbHA6ICdFdGlxdWV0YSBsZWdpYmxlLCBwLiBlai4gXHUwMEFCVDMgMjAyNlx1MDBCQiBvIFx1MDBBQkFnbyAyMDI2XHUwMEJCLicgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdUXHUwMEVEdHVsbyBNb3N0cmFkbycgfSxcbiAgICAgIHNuYXBzaG90X2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBkZSBpbnN0YW50XHUwMEUxbmVhJywgaGVscDogJ0VsIGRcdTAwRURhIGVuIHF1ZSBzZSBjYXB0dXJcdTAwRjMgZXN0YSBpbnN0YW50XHUwMEUxbmVhLicgfSxcbiAgICAgIHNvdXJjZToge1xuICAgICAgICBsYWJlbDogJ09yaWdlbicsXG4gICAgICAgIG9wdGlvbnM6IHsgc2NoZWR1bGVkOiAnSW5zdGFudFx1MDBFMW5lYSBwcm9ncmFtYWRhJywgYWk6ICdTa2lsbCBkZSBJQScsIG1hbnVhbDogJ0VudHJhZGEgbWFudWFsJyB9LFxuICAgICAgfSxcbiAgICAgIHF1b3RhOiB7IGxhYmVsOiAnQ3VvdGEnIH0sXG4gICAgICBwaXBlbGluZV9hbW91bnQ6IHsgbGFiZWw6ICdQaXBlbGluZScsIGhlbHA6ICdTdW1hIGRlIHRvZGFzIGxhcyBvcG9ydHVuaWRhZGVzIGFiaWVydGFzIHF1ZSBjaWVycmFuIGVuIGVzdGUgcGVyaW9kbyAoZW4gY3VhbHF1aWVyIGV0YXBhKS4nIH0sXG4gICAgICBiZXN0X2Nhc2VfYW1vdW50OiB7IGxhYmVsOiAnTWVqb3IgY2FzbycsIGhlbHA6ICdPcG9ydHVuaWRhZGVzIGFiaWVydGFzIGVuIGxhIGNhdGVnb3JcdTAwRURhIGRlIHByb25cdTAwRjNzdGljbyBNZWpvciBjYXNvIG8gQ29tcHJvbWlzby4nIH0sXG4gICAgICBjb21taXRfYW1vdW50OiB7IGxhYmVsOiAnQ29tcHJvbWlzbycsIGhlbHA6ICdPcG9ydHVuaWRhZGVzIGFiaWVydGFzIGVuIGxhIGNhdGVnb3JcdTAwRURhIGRlIHByb25cdTAwRjNzdGljbyBDb21wcm9taXNvIChjb21wcm9tZXRpZGFzIHBvciBlbCBwcm9waWV0YXJpbykuJyB9LFxuICAgICAgY2xvc2VkX2Ftb3VudDogeyBsYWJlbDogJ0NlcnJhZG8nLCBoZWxwOiAnSW1wb3J0ZSB5YSBjZXJyYWRvIGdhbmFkbyBlbiBlc3RlIHBlcmlvZG8uJyB9LFxuICAgICAgZXhwZWN0ZWRfYW1vdW50OiB7IGxhYmVsOiAnRXNwZXJhZG8nLCBoZWxwOiAnQ2VycmFkbyArIENvbXByb21pc286IGxvIHF1ZSBlbCBwcm9waWV0YXJpbyBlc3BlcmEgcmF6b25hYmxlbWVudGUgY2VycmFyLicgfSxcbiAgICAgIGF0dGFpbm1lbnRfcGN0OiB7IGxhYmVsOiAnQ3VtcGxpbWllbnRvICUnLCBoZWxwOiAnQ2VycmFkbyBcdTAwRjcgQ3VvdGEgXHUwMEQ3IDEwMC4gTXVlc3RyYSAwICUgaGFzdGEgcXVlIHNlIGZpamEgdW5hIGN1b3RhIHBvc2l0aXZhLicgfSxcbiAgICAgIGNvdmVyYWdlX3JhdGlvOiB7IGxhYmVsOiAnQ29iZXJ0dXJhJywgaGVscDogJ1BpcGVsaW5lIFx1MDBGNyAoQ3VvdGEgXHUyMjEyIENlcnJhZG8pOiBzaSBxdWVkYSBwaXBlbGluZSBzdWZpY2llbnRlIHBhcmEgY3VicmlyIGxhIGRpZmVyZW5jaWEuIE11ZXN0cmEgMCBjdWFuZG8geWEgc2UgaGEgYWxjYW56YWRvIGxhIGN1b3RhLicgfSxcbiAgICAgIG5vdGVzOiB7IGxhYmVsOiAnTm90YXMnIH0sXG4gICAgICBzZWVkX2tleToge1xuICAgICAgICBsYWJlbDogJ0NsYXZlIGRlIHNlbWlsbGEnLFxuICAgICAgICBoZWxwOiAnSWRlbnRpZGFkIGRlbCBqdWVnbyBkZSBkYXRvcyBkZSBkZW1vc3RyYWNpXHUwMEYzbi4gU29sbyBsYSBlc2NyaWJlIGVsIGNhcmdhZG9yIGRlIHNlbWlsbGFzOyBlc3RcdTAwRTEgdmFjXHUwMEVEYSBlbiBjdWFscXVpZXIgaW5zdGFudFx1MDBFMW5lYSByZWFsLicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfZm9yZWNhc3RzOiB7IGxhYmVsOiAnVG9kYXMgbGFzIHByZXZpc2lvbmVzJyB9LFxuICAgICAgdGhpc19xdWFydGVyX2ZvcmVjYXN0czoge1xuICAgICAgICBsYWJlbDogJ0VzdGUgdHJpbWVzdHJlJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnQVx1MDBGQW4gbm8gaGF5IGluc3RhbnRcdTAwRTFuZWFzIGRlIGVzdGUgdHJpbWVzdHJlJyxcbiAgICAgICAgICBtZXNzYWdlOiAnTGFzIGluc3RhbnRcdTAwRTFuZWFzIHRyaW1lc3RyYWxlcyBsYXMgZXNjcmliZSBlbCBiYXJyaWRvIG5vY3R1cm5vIGRlIHByZXZpc2lvbmVzLiBIYXN0YSBxdWUgc2UgZWplY3V0ZSB1bmEgdmV6IHBhcmEgZWwgdHJpbWVzdHJlIGFjdHVhbCwgZXN0YSB2aXN0YSBlc3RcdTAwRTEgdmFjXHUwMEVEYTsgbG9zIHRyaW1lc3RyZXMgY2VycmFkb3MgZXN0XHUwMEUxbiBlbiBsYSBwZXN0YVx1MDBGMWEgVG9kYXMuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBteV9mb3JlY2FzdDogeyBsYWJlbDogJ01pIHByZXZpc2lcdTAwRjNuJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0luc3RhbnRcdTAwRTFuZWEnIH0sXG4gICAgICBhbW91bnRzOiB7IGxhYmVsOiAnSW1wb3J0ZXMnIH0sXG4gICAgICBtZXRhOiB7IGxhYmVsOiAnT3JpZ2VuJyB9LFxuICAgICAgLy8gTm9tYnJlcyBkZSBzZWNjaVx1MDBGM24gZGVsIGZvcm11bGFyaW8gZW4gZm9yZWNhc3Qudmlldy50cyAoIzExMDApXG4gICAgICBzbmFwc2hvdDogeyBsYWJlbDogJ0luc3RhbnRcdTAwRTFuZWEnIH0sXG4gICAgICBub3RlczogeyBsYWJlbDogJ05vdGFzJyB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL29iamVjdHMuY29tbWVyY2UudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy9vYmplY3RzLmNvbW1lcmNlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbi8qKlxuICogRXNwYVx1MDBGMW9sIChlcy1FUykgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBDT01NRVJDRSBmYW1pbHk6XG4gKiB3aGF0IGdldHMgc29sZCBhbmQgb24gd2hhdCBwYXBlciBcdTIwMTQgcXVvdGVzLCBjb250cmFjdHMsIHByb2R1Y3RzLlxuICpcbiAqIFJvc3RlcjogYGNybV9xdW90ZWAsIGBjcm1fcXVvdGVfbGluZV9pdGVtYCwgYGNybV9jb250cmFjdGAsIGBjcm1fcHJvZHVjdGAuXG4gKlxuICogU1BMSVQgQVhJUyAoIzEzMTEpOiB0cmFuc2xhdGlvbiBOQU1FU1BBQ0UgZmlyc3QsIHRoZW4gQ1JNIERPTUFJTiBGQU1JTFkuXG4gKiBFdmVyeXRoaW5nIHRoYXQgaXMgbm90IGBvYmplY3RzYCBsaXZlcyBpbiBgLi9hcHAudHNgOyBgb2JqZWN0c2AgXHUyMDE0IDY5LTc4JSBvZlxuICogZXZlcnkgYnVuZGxlIFx1MjAxNCBpcyBvbmUgZmlsZSBwZXIgQ1JNIGRvbWFpbiBmYW1pbHksIGFuZCBhIGRldGFpbCBvYmplY3RcbiAqIGZvbGxvd3MgaXRzIG1hc3Rlci4gQSBuZXcgcm93IGdvZXMgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHksIG5ldmVyIGluXG4gKiB3aGljaGV2ZXIgZmlsZSBpcyBhbHJlYWR5IG9wZW46IHRoYXQgaXMgaG93IG9uZSBmaWxlIHJlLWdyb3dzIHBhc3QgdGhlIDcwJVxuICogYWR2aXNvcnkgYmFuZCBgcG5wbSBoeWdpZW5lYCBwcmludHMuIEZ1bGwgcnVsZSBhbmQgcmF0aW9uYWxlOlxuICogYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMudHNgLlxuICovXG5leHBvcnQgY29uc3QgY29tbWVyY2U6IFJlY29yZDxzdHJpbmcsIE9iamVjdFRyYW5zbGF0aW9uRGF0YT4gPSB7XG4gIGNybV9xdW90ZToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgZGlzY291bnRfd2l0aGluX2NlaWxpbmc6IHtcbiAgICAgICAgbWVzc2FnZTogJ0VsIGRlc2N1ZW50byBubyBwdWVkZSBzdXBlcmFyIGVsIDYwICUnLFxuICAgICAgfSxcbiAgICAgIGV4cGlyYXRpb25fYWZ0ZXJfcXVvdGU6IHtcbiAgICAgICAgbWVzc2FnZTogJ0xhIGZlY2hhIGRlIHZlbmNpbWllbnRvIGRlYmUgc2VyIHBvc3RlcmlvciBhIGxhIGRlIGxhIGNvdGl6YWNpXHUwMEYzbicsXG4gICAgICB9LFxuICAgICAgcXVvdGVfc3RhdHVzX3Byb2dyZXNzaW9uOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdUcmFuc2ljaVx1MDBGM24gZGUgZXN0YWRvIGRlIGNvdGl6YWNpXHUwMEYzbiBubyB2XHUwMEUxbGlkYScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdDb3RpemFjaVx1MDBGM24nLFxuICAgIHBsdXJhbExhYmVsOiAnQ290aXphY2lvbmVzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NvdGl6YWNpb25lcyBkZSBwcmVjaW9zIHBhcmEgY2xpZW50ZXMnLFxuICAgIGZpZWxkczoge1xuICAgICAgcXVvdGVfbnVtYmVyOiB7IGxhYmVsOiAnTlx1MDBGQW1lcm8gZGUgQ290aXphY2lcdTAwRjNuJyB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ1RcdTAwRUR0dWxvIE1vc3RyYWRvJyB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ05vbWJyZSBkZSBDb3RpemFjaVx1MDBGM24nIH0sXG4gICAgICBjcm1fYWNjb3VudDogeyBsYWJlbDogJ0N1ZW50YScgfSxcbiAgICAgIGNybV9jb250YWN0OiB7XG4gICAgICAgIGxhYmVsOiAnQ29udGFjdG8nLFxuICAgICAgICBoZWxwOiAnT2JsaWdhdG9yaW8gZW4gY3VhbnRvIGxhIGNvdGl6YWNpXHUwMEYzbiBwYXNhIGEgUHJlc2VudGFkYSBvIEFjZXB0YWRhOiBlbCBjb250cmF0byBnZW5lcmFkbyB0b21hIGRlIGFxdVx1MDBFRCBzdSBDb250YWN0byBwcmluY2lwYWwuJyxcbiAgICAgIH0sXG4gICAgICBjcm1fb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdPcG9ydHVuaWRhZCcgfSxcbiAgICAgIG93bmVyX2lkOiB7IGxhYmVsOiAnUHJvcGlldGFyaW8gZGUgQ290aXphY2lcdTAwRjNuJyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnRXN0YWRvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGRyYWZ0OiAnQm9ycmFkb3InLCBpbl9yZXZpZXc6ICdFbiBSZXZpc2lcdTAwRjNuJywgcHJlc2VudGVkOiAnUHJlc2VudGFkYScsXG4gICAgICAgICAgYWNjZXB0ZWQ6ICdBY2VwdGFkYScsIHJlamVjdGVkOiAnUmVjaGF6YWRhJywgZXhwaXJlZDogJ0V4cGlyYWRhJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBxdW90ZV9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgQ290aXphY2lcdTAwRjNuJyB9LFxuICAgICAgZXhwaXJhdGlvbl9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgRXhwaXJhY2lcdTAwRjNuJyB9LFxuICAgICAgc3VidG90YWw6IHsgbGFiZWw6ICdTdWJ0b3RhbCcgfSxcbiAgICAgIGRpc2NvdW50OiB7IGxhYmVsOiAnRGVzY3VlbnRvICUnIH0sXG4gICAgICBkaXNjb3VudF9hbW91bnQ6IHsgbGFiZWw6ICdNb250byBkZSBEZXNjdWVudG8nIH0sXG4gICAgICB0YXg6IHsgbGFiZWw6ICdJbXB1ZXN0bycgfSxcbiAgICAgIHNoaXBwaW5nX2hhbmRsaW5nOiB7IGxhYmVsOiAnRW52XHUwMEVEbyB5IE1hbmlwdWxhY2lcdTAwRjNuJyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdQcmVjaW8gVG90YWwnIH0sXG4gICAgICAvLyBNaXNtbyBqdWVnbyBkZSB2YWxvcmVzIHF1ZSBgY3JtX2NvbnRyYWN0LnBheW1lbnRfdGVybXNgIFx1MjAxNCB0cmFkXHUwMEZBemNhbnNlIGlndWFsLlxuICAgICAgcGF5bWVudF90ZXJtczoge1xuICAgICAgICBsYWJlbDogJ1RcdTAwRTlybWlub3MgZGUgUGFnbycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBuZXRfMTU6ICdOZXRvIDE1JywgbmV0XzMwOiAnTmV0byAzMCcsIG5ldF82MDogJ05ldG8gNjAnLCBuZXRfOTA6ICdOZXRvIDkwJyxcbiAgICAgICAgICBkdWVfb25fcmVjZWlwdDogJ1BhZ28gYSBsYSBSZWNlcGNpXHUwMEYzbicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc2hpcHBpbmdfdGVybXM6IHsgbGFiZWw6ICdUXHUwMEU5cm1pbm9zIGRlIEVudlx1MDBFRG8nIH0sXG4gICAgICBiaWxsaW5nX2FkZHJlc3M6IHsgbGFiZWw6ICdEaXJlY2NpXHUwMEYzbiBkZSBGYWN0dXJhY2lcdTAwRjNuJyB9LFxuICAgICAgc2hpcHBpbmdfYWRkcmVzczogeyBsYWJlbDogJ0RpcmVjY2lcdTAwRjNuIGRlIEVudlx1MDBFRG8nIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXBjaVx1MDBGM24nIH0sXG4gICAgICBpbnRlcm5hbF9ub3RlczogeyBsYWJlbDogJ05vdGFzIEludGVybmFzJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfcXVvdGVzOiB7IGxhYmVsOiAnVG9kYXMgbGFzIENvdGl6YWNpb25lcycgfSxcbiAgICAgIHF1b3RlX3BpcGVsaW5lOiB7IGxhYmVsOiAnUGlwZWxpbmUgZGUgQ290aXphY2lvbmVzJyB9LFxuICAgICAgcXVvdGVfY2FsZW5kYXI6IHsgbGFiZWw6ICdDYWxlbmRhcmlvIGRlIENvdGl6YWNpb25lcycgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlIGxhIENvdGl6YWNpXHUwMEYzbicgfSxcbiAgICAgIHByaWNpbmc6IHsgbGFiZWw6ICdQcmVjaW9zJyB9LFxuICAgICAgdGVybXM6IHsgbGFiZWw6ICdUXHUwMEU5cm1pbm9zIHkgVmlnZW5jaWEnIH0sXG4gICAgICBhZGRyZXNzOiB7IGxhYmVsOiAnRGlyZWNjaW9uZXMnIH0sXG4gICAgICBzeXN0ZW06IHsgbGFiZWw6ICdTaXN0ZW1hJyB9LFxuICAgICAgLy8gTm9tYnJlcyBkZSBzZWNjaVx1MDBGM24gZGVsIGZvcm11bGFyaW8gZW4gcXVvdGUudmlldy50cyAoIzExMDApXG4gICAgICBxdW90ZTogeyBsYWJlbDogJ0NvdGl6YWNpXHUwMEYzbicgfSxcbiAgICAgIHRvdGFsczogeyBsYWJlbDogJ1RvdGFsZXMnIH0sXG4gICAgICBxdW90ZV90ZXJtczogeyBsYWJlbDogJ1RcdTAwRTlybWlub3MnIH0sXG4gICAgICBhZGRyZXNzZXNfYW5kX25vdGVzOiB7IGxhYmVsOiAnRGlyZWNjaW9uZXMgeSBOb3RhcycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fcXVvdGVfbGluZV9pdGVtOiB7XG4gICAgX3ZhbGlkYXRpb25zOiB7XG4gICAgICBkaXNjb3VudF93aXRoaW5fY2VpbGluZzoge1xuICAgICAgICBtZXNzYWdlOiAnRWwgZGVzY3VlbnRvIGRlIGxcdTAwRURuZWEgbm8gcHVlZGUgc3VwZXJhciBlbCA2MCAlJyxcbiAgICAgIH0sXG4gICAgICB1bml0X3ByaWNlX3Bvc2l0aXZlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdFbCBwcmVjaW8gZGUgdmVudGEgbm8gcHVlZGUgc2VyIG5lZ2F0aXZvJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ0xcdTAwRURuZWEgZGUgQ290aXphY2lcdTAwRjNuJyxcbiAgICBwbHVyYWxMYWJlbDogJ0xcdTAwRURuZWFzIGRlIENvdGl6YWNpXHUwMEYzbicsXG4gICAgZGVzY3JpcHRpb246ICdMXHUwMEVEbmVhcyBkZSBwcmVjaW8gcG9yIHByb2R1Y3RvIGRlbnRybyBkZSB1bmEgY290aXphY2lcdTAwRjNuJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNybV9xdW90ZTogeyBsYWJlbDogJ0NvdGl6YWNpXHUwMEYzbicgfSxcbiAgICAgIGNybV9wcm9kdWN0OiB7IGxhYmVsOiAnUHJvZHVjdG8nIH0sXG4gICAgICBkZXNjcmlwdGlvbjogeyBsYWJlbDogJ0Rlc2NyaXBjaVx1MDBGM24nIH0sXG4gICAgICBxdWFudGl0eTogeyBsYWJlbDogJ0NhbnRpZGFkJyB9LFxuICAgICAgbGlzdF9wcmljZTogeyBsYWJlbDogJ1ByZWNpbyBkZSBMaXN0YScgfSxcbiAgICAgIHVuaXRfcHJpY2U6IHsgbGFiZWw6ICdQcmVjaW8gZGUgVmVudGEnIH0sXG4gICAgICBkaXNjb3VudDogeyBsYWJlbDogJ0Rlc2N1ZW50byAoJSknIH0sXG4gICAgICBzdWJ0b3RhbDogeyBsYWJlbDogJ1N1YnRvdGFsJyB9LFxuICAgICAgdG90YWxfcHJpY2U6IHsgbGFiZWw6ICdUb3RhbCcgfSxcbiAgICAgIGxpbmVfbnVtYmVyOiB7IGxhYmVsOiAnTlx1MDBCQSBkZSBMXHUwMEVEbmVhJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0xcdTAwRURuZWEnIH0sXG4gICAgICBwcmljaW5nOiB7IGxhYmVsOiAnUHJlY2lvcycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fY29udHJhY3Q6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGVuZF9hZnRlcl9zdGFydDoge1xuICAgICAgICBtZXNzYWdlOiAnTGEgZmVjaGEgZGUgZmluIGRlYmUgc2VyIHBvc3RlcmlvciBhIGxhIGRlIGluaWNpbycsXG4gICAgICB9LFxuICAgICAgY29udHJhY3Rfc3RhdHVzX3Byb2dyZXNzaW9uOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdUcmFuc2ljaVx1MDBGM24gZGUgZXN0YWRvIGRlIGNvbnRyYXRvIG5vIHZcdTAwRTFsaWRhJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ0NvbnRyYXRvJyxcbiAgICBwbHVyYWxMYWJlbDogJ0NvbnRyYXRvcycsXG4gICAgZGVzY3JpcHRpb246ICdDb250cmF0b3MgeSBhY3VlcmRvcyBsZWdhbGVzJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNvbnRyYWN0X251bWJlcjogeyBsYWJlbDogJ05cdTAwRkFtZXJvIGRlIENvbnRyYXRvJyB9LFxuICAgICAgY3JtX2FjY291bnQ6IHsgbGFiZWw6ICdDdWVudGEnIH0sXG4gICAgICBjcm1fY29udGFjdDogeyBsYWJlbDogJ0NvbnRhY3RvIFByaW5jaXBhbCcgfSxcbiAgICAgIGNybV9vcHBvcnR1bml0eTogeyBsYWJlbDogJ09wb3J0dW5pZGFkIFJlbGFjaW9uYWRhJyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdQcm9waWV0YXJpbyBkZWwgQ29udHJhdG8nIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdFc3RhZG8nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZHJhZnQ6ICdCb3JyYWRvcicsIGluX2FwcHJvdmFsOiAnRW4gQXByb2JhY2lcdTAwRjNuJywgYWN0aXZhdGVkOiAnQWN0aXZhZG8nLFxuICAgICAgICAgIGV4cGlyZWQ6ICdFeHBpcmFkbycsIHRlcm1pbmF0ZWQ6ICdSZXNjaW5kaWRvJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjb250cmFjdF90ZXJtX21vbnRoczogeyBsYWJlbDogJ1BsYXpvIGRlbCBDb250cmF0byAoTWVzZXMpJyB9LFxuICAgICAgc3RhcnRfZGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIEluaWNpbycgfSxcbiAgICAgIGVuZF9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgRmluJyB9LFxuICAgICAgY29udHJhY3RfdmFsdWU6IHsgbGFiZWw6ICdWYWxvciBkZWwgQ29udHJhdG8nIH0sXG4gICAgICBiaWxsaW5nX2ZyZXF1ZW5jeToge1xuICAgICAgICBsYWJlbDogJ0ZyZWN1ZW5jaWEgZGUgRmFjdHVyYWNpXHUwMEYzbicsXG4gICAgICAgIG9wdGlvbnM6IHsgbW9udGhseTogJ01lbnN1YWwnLCBxdWFydGVybHk6ICdUcmltZXN0cmFsJywgYW5udWFsbHk6ICdBbnVhbCcsIG9uZV90aW1lOiAnUGFnbyBcdTAwREFuaWNvJyB9LFxuICAgICAgfSxcbiAgICAgIC8vIE1pc21vIGp1ZWdvIGRlIHZhbG9yZXMgcXVlIGBjcm1fcXVvdGUucGF5bWVudF90ZXJtc2AgXHUyMDE0IHRyYWRcdTAwRkF6Y2Fuc2UgaWd1YWwuXG4gICAgICBwYXltZW50X3Rlcm1zOiB7XG4gICAgICAgIGxhYmVsOiAnVFx1MDBFOXJtaW5vcyBkZSBQYWdvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ldF8xNTogJ05ldG8gMTUnLCBuZXRfMzA6ICdOZXRvIDMwJywgbmV0XzYwOiAnTmV0byA2MCcsIG5ldF85MDogJ05ldG8gOTAnLFxuICAgICAgICAgIGR1ZV9vbl9yZWNlaXB0OiAnUGFnbyBhIGxhIFJlY2VwY2lcdTAwRjNuJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhdXRvX3JlbmV3YWw6IHsgbGFiZWw6ICdSZW5vdmFjaVx1MDBGM24gQXV0b21cdTAwRTF0aWNhJyB9LFxuICAgICAgcmVuZXdhbF9ub3RpY2VfZGF5czogeyBsYWJlbDogJ0F2aXNvIGRlIFJlbm92YWNpXHUwMEYzbiAoRFx1MDBFRGFzKScgfSxcbiAgICAgIGNvbnRyYWN0X3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvIGRlIENvbnRyYXRvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIHN1YnNjcmlwdGlvbjogJ1N1c2NyaXBjaVx1MDBGM24nLCBzZXJ2aWNlOiAnQWN1ZXJkbyBkZSBTZXJ2aWNpbycsIGxpY2Vuc2U6ICdMaWNlbmNpYScsXG4gICAgICAgICAgcGFydG5lcnNoaXA6ICdBc29jaWFjaVx1MDBGM24nLCBuZGE6ICdBY3VlcmRvIGRlIENvbmZpZGVuY2lhbGlkYWQgKE5EQSknLFxuICAgICAgICAgIG1zYTogJ0FjdWVyZG8gTWFyY28gZGUgU2VydmljaW9zIChNU0EpJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzaWduZWRfZGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIEZpcm1hJyB9LFxuICAgICAgc2lnbmVkX2J5OiB7IGxhYmVsOiAnRmlybWFkbyBQb3InIH0sXG4gICAgICBkb2N1bWVudF91cmw6IHsgbGFiZWw6ICdEb2N1bWVudG8gZGUgQ29udHJhdG8nIH0sXG4gICAgICBzcGVjaWFsX3Rlcm1zOiB7IGxhYmVsOiAnVFx1MDBFOXJtaW5vcyBFc3BlY2lhbGVzJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwY2lcdTAwRjNuJyB9LFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IGxhYmVsOiAnRGlyZWNjaVx1MDBGM24gZGUgRmFjdHVyYWNpXHUwMEYzbicgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2NvbnRyYWN0czogeyBsYWJlbDogJ1RvZG9zIGxvcyBDb250cmF0b3MnIH0sXG4gICAgICByZW5ld2FsX2NhbGVuZGFyOiB7IGxhYmVsOiAnQ2FsZW5kYXJpbyBkZSBSZW5vdmFjaVx1MDBGM24nIH0sXG4gICAgICBjb250cmFjdF9nYW50dDogeyBsYWJlbDogJ1BsYXpvcyBkZWwgQ29udHJhdG8nIH0sXG4gICAgICBjb250cmFjdF90aW1lbGluZTogeyBsYWJlbDogJ0xcdTAwRURuZWEgZGUgVGllbXBvJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gZGVsIENvbnRyYXRvJyB9LFxuICAgICAgcGFydGllczogeyBsYWJlbDogJ1BhcnRlcycgfSxcbiAgICAgIHRlcm1zOiB7IGxhYmVsOiAnVFx1MDBFOXJtaW5vcyB5IEZlY2hhcycgfSxcbiAgICAgIHZhbHVlOiB7IGxhYmVsOiAnVmFsb3IgZGVsIENvbnRyYXRvJyB9LFxuICAgICAgc3RhdHVzOiB7IGxhYmVsOiAnRXN0YWRvIHkgQXByb2JhY2lcdTAwRjNuJyB9LFxuICAgICAgcmVuZXdhbDogeyBsYWJlbDogJ1Jlbm92YWNpXHUwMEYzbicgfSxcbiAgICAgIC8vIE5vbWJyZXMgZGUgc2VjY2lcdTAwRjNuIGRlbCBmb3JtdWxhcmlvIGVuIGNvbnRyYWN0LnZpZXcudHMgKCMxMTAwKVxuICAgICAgY29udHJhY3RfdGVybXM6IHsgbGFiZWw6ICdUXHUwMEU5cm1pbm9zJyB9LFxuICAgICAgc2lnbmluZ19hbmRfZG9jdW1lbnRzOiB7IGxhYmVsOiAnRmlybWEgeSBEb2N1bWVudG9zJyB9LFxuICAgICAgbm90ZXM6IHsgbGFiZWw6ICdOb3RhcycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fcHJvZHVjdDoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgY29zdF9sZXNzX3RoYW5fcHJpY2U6IHtcbiAgICAgICAgbWVzc2FnZTogJ0VsIGNvc3RlIGRlYmVyXHUwMEVEYSBzZXIgaW5mZXJpb3IgYWwgcHJlY2lvIGRlIGxpc3RhJyxcbiAgICAgIH0sXG4gICAgICBwcmljZV9wb3NpdGl2ZToge1xuICAgICAgICBtZXNzYWdlOiAnRWwgcHJlY2lvIGRlIGxpc3RhIGRlYmUgc2VyIHBvc2l0aXZvJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ1Byb2R1Y3RvJyxcbiAgICBwbHVyYWxMYWJlbDogJ1Byb2R1Y3RvcycsXG4gICAgZGVzY3JpcHRpb246ICdQcm9kdWN0b3MgeSBzZXJ2aWNpb3MgcXVlIG9mcmVjZSBsYSBlbXByZXNhJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIHByb2R1Y3RfY29kZTogeyBsYWJlbDogJ0NcdTAwRjNkaWdvIGRlIFByb2R1Y3RvJyB9LFxuICAgICAgZGlzcGxheV90aXRsZTogeyBsYWJlbDogJ1RcdTAwRUR0dWxvIE1vc3RyYWRvJyB9LFxuICAgICAgbmFtZTogeyBsYWJlbDogJ05vbWJyZSBkZSBQcm9kdWN0bycgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcGNpXHUwMEYzbicgfSxcbiAgICAgIGNhdGVnb3J5OiB7XG4gICAgICAgIGxhYmVsOiAnQ2F0ZWdvclx1MDBFRGEnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgc29mdHdhcmU6ICdTb2Z0d2FyZScsIGhhcmR3YXJlOiAnSGFyZHdhcmUnLCBzZXJ2aWNlOiAnU2VydmljaW8nLFxuICAgICAgICAgIHN1YnNjcmlwdGlvbjogJ1N1c2NyaXBjaVx1MDBGM24nLCBzdXBwb3J0OiAnU29wb3J0ZScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZmFtaWx5OiB7XG4gICAgICAgIGxhYmVsOiAnRmFtaWxpYSBkZSBQcm9kdWN0bycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBlbnRlcnByaXNlOiAnU29sdWNpb25lcyBwYXJhIEdyYW4gRW1wcmVzYScsIHNtYjogJ1NvbHVjaW9uZXMgcGFyYSBQWU1FcycsXG4gICAgICAgICAgc2VydmljZXM6ICdTZXJ2aWNpb3MgUHJvZmVzaW9uYWxlcycsIGNsb3VkOiAnU2VydmljaW9zIGVuIGxhIE51YmUnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGxpc3RfcHJpY2U6IHsgbGFiZWw6ICdQcmVjaW8gZGUgTGlzdGEnIH0sXG4gICAgICBjb3N0OiB7IGxhYmVsOiAnQ29zdG8nIH0sXG4gICAgICBza3U6IHsgbGFiZWw6ICdTS1UnIH0sXG4gICAgICBpc19hY3RpdmU6IHsgbGFiZWw6ICdBY3Rpdm8nIH0sXG4gICAgICBwcm9kdWN0X21hbmFnZXI6IHsgbGFiZWw6ICdHZXJlbnRlIGRlIFByb2R1Y3RvJyB9LFxuICAgICAgaW1hZ2U6IHsgbGFiZWw6ICdJbWFnZW4gZGUgUHJvZHVjdG8nIH0sXG4gICAgICBkYXRhc2hlZXQ6IHsgbGFiZWw6ICdGaWNoYSBUXHUwMEU5Y25pY2EnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9wcm9kdWN0czogeyBsYWJlbDogJ1RvZG9zIGxvcyBQcm9kdWN0b3MnIH0sXG4gICAgICBwcm9kdWN0X2NhdGFsb2c6IHsgbGFiZWw6ICdDYXRcdTAwRTFsb2dvIGRlIFByb2R1Y3RvcycgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlbCBQcm9kdWN0bycgfSxcbiAgICAgIHByaWNpbmc6IHsgbGFiZWw6ICdQcmVjaW9zJyB9LFxuICAgICAgbWV0YWRhdGE6IHsgbGFiZWw6ICdSZWN1cnNvcycgfSxcbiAgICAgIC8vIE5vbWJyZXMgZGUgc2VjY2lcdTAwRjNuIGRlbCBmb3JtdWxhcmlvIGVuIHByb2R1Y3Qudmlldy50cyAoIzExMDApXG4gICAgICBwcm9kdWN0X2luZm86IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIGRlbCBQcm9kdWN0bycgfSxcbiAgICAgIHByaWNpbmdfaW5mbzogeyBsYWJlbDogJ1ByZWNpb3MnIH0sXG4gICAgICBtZWRpYTogeyBsYWJlbDogJ011bHRpbWVkaWEnIH0sXG4gICAgfSxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvb2JqZWN0cy5zZXJ2aWNlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FU1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvb2JqZWN0cy5zZXJ2aWNlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbmltcG9ydCB7IGFjdGl2aXR5QWN0aW9ucyB9IGZyb20gJy4vX3NoYXJlZCc7XG5cbi8qKlxuICogRXNwYVx1MDBGMW9sIChlcy1FUykgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBTRVJWSUNFIGZhbWlseTpcbiAqIHBvc3Qtc2FsZSBzdXBwb3J0IFx1MjAxNCBjYXNlcyBhbmQgdGhlIGtub3dsZWRnZSB0aGF0IGRlZmxlY3RzIHRoZW0uXG4gKlxuICogUm9zdGVyOiBgY3JtX2Nhc2VgLCBgY3JtX2tub3dsZWRnZV9hcnRpY2xlYCwgYGNybV9hcnRpY2xlX2ZlZWRiYWNrYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXJ2aWNlOiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fY2FzZToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgcmVzb2x1dGlvbl9yZXF1aXJlZF9mb3JfY2xvc2VkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdMYSByZXNvbHVjaVx1MDBGM24gZXMgb2JsaWdhdG9yaWEgYWwgY2VycmFyIHVuIGNhc28nLFxuICAgICAgfSxcbiAgICAgIGVzY2FsYXRpb25fcmVhc29uX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdFbCBtb3Rpdm8gZGUgZXNjYWxhZG8gZXMgb2JsaWdhdG9yaW8gYWwgZXNjYWxhciB1biBjYXNvJyxcbiAgICAgIH0sXG4gICAgICBjYXNlX3N0YXR1c19wcm9ncmVzc2lvbjoge1xuICAgICAgICBtZXNzYWdlOiAnVHJhbnNpY2lcdTAwRjNuIGRlIGVzdGFkbyBubyB2XHUwMEUxbGlkYScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdDYXNvJyxcbiAgICBwbHVyYWxMYWJlbDogJ0Nhc29zJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Nhc29zIGRlIHNvcG9ydGUgeSBzb2xpY2l0dWRlcyBkZSBzZXJ2aWNpbyBkZSBjbGllbnRlcycsXG4gICAgZmllbGRzOiB7XG4gICAgICBjYXNlX251bWJlcjogeyBsYWJlbDogJ05cdTAwRkFtZXJvIGRlIENhc28nIH0sXG4gICAgICBkaXNwbGF5X3RpdGxlOiB7IGxhYmVsOiAnVFx1MDBFRHR1bG8gTW9zdHJhZG8nIH0sXG4gICAgICBzdWJqZWN0OiB7IGxhYmVsOiAnQXN1bnRvJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwY2lcdTAwRjNuJyB9LFxuICAgICAgY3JtX2FjY291bnQ6IHsgbGFiZWw6ICdDdWVudGEnIH0sXG4gICAgICBjcm1fY29udGFjdDogeyBsYWJlbDogJ0NvbnRhY3RvJyB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnRXN0YWRvJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIG5ldzogJ051ZXZvJywgaW5fcHJvZ3Jlc3M6ICdFbiBDdXJzbycsXG4gICAgICAgICAgd2FpdGluZ19jdXN0b21lcjogJ0VzcGVyYW5kbyBhbCBDbGllbnRlJywgd2FpdGluZ19zdXBwb3J0OiAnRXNwZXJhbmRvIGEgU29wb3J0ZScsXG4gICAgICAgICAgZXNjYWxhdGVkOiAnRXNjYWxhZG8nLCByZXNvbHZlZDogJ1Jlc3VlbHRvJywgY2xvc2VkOiAnQ2VycmFkbycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcHJpb3JpdHk6IHtcbiAgICAgICAgbGFiZWw6ICdQcmlvcmlkYWQnLFxuICAgICAgICBvcHRpb25zOiB7IGxvdzogJ0JhamEnLCBtZWRpdW06ICdNZWRpYScsIGhpZ2g6ICdBbHRhJywgY3JpdGljYWw6ICdDclx1MDBFRHRpY2EnIH0sXG4gICAgICB9LFxuICAgICAgcHJpb3JpdHlfcmFuazogeyBsYWJlbDogJ1JhbmdvIGRlIFByaW9yaWRhZCcgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvIGRlIENhc28nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcXVlc3Rpb246ICdDb25zdWx0YScsIHByb2JsZW06ICdQcm9ibGVtYScsXG4gICAgICAgICAgZmVhdHVyZV9yZXF1ZXN0OiAnU29saWNpdHVkIGRlIEZ1bmNpb25hbGlkYWQnLCBidWc6ICdFcnJvcicsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLy8gYGVtYWlsYCB5IGBjaGF0YCBzZSBkZWphbiBjb21vIHByXHUwMEU5c3RhbW9zOiBzb24gZWwgdFx1MDBFOXJtaW5vIGhhYml0dWFsIGVuXG4gICAgICAvLyBlc3BhXHUwMEYxb2wgZGUgbmVnb2Npb3MgeSBjb25jdWVyZGFuIGNvbiBgY3JtX2NhbXBhaWduLmNoYW5uZWxgLlxuICAgICAgb3JpZ2luOiB7XG4gICAgICAgIGxhYmVsOiAnT3JpZ2VuIGRlbCBDYXNvJyxcbiAgICAgICAgb3B0aW9uczogeyBlbWFpbDogJ0VtYWlsJywgcGhvbmU6ICdUZWxcdTAwRTlmb25vJywgd2ViOiAnV2ViJywgY2hhdDogJ0NoYXQnLCBzb2NpYWxfbWVkaWE6ICdSZWRlcyBTb2NpYWxlcycgfSxcbiAgICAgIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1Byb3BpZXRhcmlvIGRlbCBDYXNvJyB9LFxuICAgICAgY2xvc2VkX2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBkZSBDaWVycmUnIH0sXG4gICAgICBmaXJzdF9yZXNwb25zZV9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgUHJpbWVyYSBSZXNwdWVzdGEnIH0sXG4gICAgICByZXNvbHV0aW9uX3RpbWVfaG91cnM6IHsgbGFiZWw6ICdUaWVtcG8gZGUgUmVzb2x1Y2lcdTAwRjNuIChIb3JhcyknIH0sXG4gICAgICBzbGFfZHVlX2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBMXHUwMEVEbWl0ZSBTTEEnLCBoZWxwOiAnU2UgZmlqYSBzZWdcdTAwRkFuIGxhIHByaW9yaWRhZCBkZWwgY2FzbyB5IGVsIE5pdmVsIGRlIENsaWVudGUgZGUgbGEgY3VlbnRhLCBlbiBob3JhcyBuYXR1cmFsZXM6IGxhcyBub2NoZXMsIGxvcyBmaW5lcyBkZSBzZW1hbmEgeSBsb3MgZmVzdGl2b3MgY3VlbnRhbi4nIH0sXG4gICAgICBpc19zbGFfdmlvbGF0ZWQ6IHsgbGFiZWw6ICdTTEEgSW5jdW1wbGlkbycgfSxcbiAgICAgIGlzX2VzY2FsYXRlZDogeyBsYWJlbDogJ0VzY2FsYWRvJyB9LFxuICAgICAgZXNjYWxhdGVkX2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBkZSBFc2NhbGFjaVx1MDBGM24nIH0sXG4gICAgICBlc2NhbGF0aW9uX3JlYXNvbjogeyBsYWJlbDogJ01vdGl2byBkZSBFc2NhbGFjaVx1MDBGM24nIH0sXG4gICAgICByZXNvbHV0aW9uOiB7IGxhYmVsOiAnUmVzb2x1Y2lcdTAwRjNuJyB9LFxuICAgICAgcmVzb2x2ZWRfYnlfYXJ0aWNsZTogeyBsYWJlbDogJ1Jlc3VlbHRvIHBvciBBcnRcdTAwRURjdWxvJywgaGVscDogJ0FydFx1MDBFRGN1bG8gZGUgbGEgYmFzZSBkZSBjb25vY2ltaWVudG8gcXVlIHJlc29sdmlcdTAwRjMgZXN0ZSBjYXNvIFx1MjAxNCBsYSBzZVx1MDBGMWFsIGRlIGRlc3ZcdTAwRURvLicgfSxcbiAgICAgIGludGVybmFsX25vdGVzOiB7IGxhYmVsOiAnTm90YXMgSW50ZXJuYXMnLCBoZWxwOiAnTm90YXMgaW50ZXJuYXMgbm8gdmlzaWJsZXMgcGFyYSBlbCBjbGllbnRlJyB9LFxuICAgICAgaXNfY2xvc2VkOiB7IGxhYmVsOiAnRXN0XHUwMEUxIENlcnJhZG8nIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9jYXNlczogeyBsYWJlbDogJ1RvZG9zIGxvcyBDYXNvcycgfSxcbiAgICAgIGNhc2Vfd29ya2Zsb3c6IHsgbGFiZWw6ICdGbHVqbyBkZSBTZXJ2aWNpbycgfSxcbiAgICAgIHNsYV9jYWxlbmRhcjogeyBsYWJlbDogJ0NhbGVuZGFyaW8gU0xBJyB9LFxuICAgICAgY2FzZV90aW1lbGluZTogeyBsYWJlbDogJ0xcdTAwRURuZWEgZGUgVGllbXBvIGRlIENhc29zJyB9LFxuICAgICAgdW5hc3NpZ25lZF90cmlhZ2U6IHtcbiAgICAgICAgbGFiZWw6ICdTaW4gYXNpZ25hciBcdTIwMTQgdHJpYWplJyxcbiAgICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICAgIHRpdGxlOiAnTmFkYSBwZW5kaWVudGUgZGUgdHJpYWplJyxcbiAgICAgICAgICBtZXNzYWdlOiAnVG9kb3MgbG9zIGNhc29zIHRpZW5lbiBwcm9waWV0YXJpby4gTG9zIGNhc29zIGFwYXJlY2VuIGFxdVx1MDBFRCBjdWFuZG8gbGxlZ2FuIHNpbiBwcm9waWV0YXJpbyBcdTIwMTQgbm9ybWFsbWVudGUgdW4gZW52XHUwMEVEbyB3ZWItYS1jYXNvIHJlY2liaWRvIG1pZW50cmFzIG5hZGllIG9jdXBhYmEgZWwgcHVlc3RvIGRlIEFnZW50ZSBkZSBTZXJ2aWNpby4nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGVzY2FsYXRlZF9jYXNlczogeyBsYWJlbDogJ0Nhc29zIEVzY2FsYWRvcycgfSxcbiAgICAgIG15X29wZW5fY2FzZXM6IHsgbGFiZWw6ICdNaXMgQ2Fzb3MgQWJpZXJ0b3MnIH0sXG4gICAgICBzbGFfYXRfcmlzazogeyBsYWJlbDogJ1x1MjNGMCBTTEEgZW4gUmllc2dvJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICAvLyBOb21icmVzIGRlIHNlY2NpXHUwMEYzbiBkZWwgZm9ybXVsYXJpbyBlbiBjYXNlLnZpZXcudHMgKCMxMTAwKS5cbiAgICAgIGNhc2U6IHsgbGFiZWw6ICdDYXNvJyB9LFxuICAgICAgaG93X2Nhbl93ZV9oZWxwOiB7IGxhYmVsOiAnXHUwMEJGQ1x1MDBGM21vIHBvZGVtb3MgYXl1ZGFydGU/JyB9LFxuICAgICAgLy8gQ2xhdmVzIGRlIHNlY2NpXHUwMEYzbiBkZWwgb2JqZXRvIChjYXNlLm9iamVjdC50cykgcXVlIHVzYW4gbG9zXG4gICAgICAvLyBmb3JtdWxhcmlvcyBkZSByZWdpc3RybyB5IGxhIHBcdTAwRTFnaW5hIGRlIGRldGFsbGUsIGN1eWFzIHNlY2Npb25lc1xuICAgICAgLy8gaGFjZW4gcmVmZXJlbmNpYSBhIGVzdG9zIGdydXBvcyAoIzk3MCkuXG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gZGVsIENhc28nIH0sXG4gICAgICBvcmlnaW46IHsgbGFiZWw6ICdPcmlnZW4geSBBc2lnbmFjaVx1MDBGM24nIH0sXG4gICAgICBzbGE6IHsgbGFiZWw6ICdTTEEgeSBQcmlvcmlkYWQnIH0sXG4gICAgICByZXNvbHV0aW9uOiB7IGxhYmVsOiAnUmVzb2x1Y2lcdTAwRjNuJyB9LFxuICAgICAgZXNjYWxhdGlvbjogeyBsYWJlbDogJ0VzY2FsYWNpXHUwMEYzbicgfSxcbiAgICAgIHN5c3RlbTogeyBsYWJlbDogJ1Npc3RlbWEnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgLi4uYWN0aXZpdHlBY3Rpb25zLFxuICAgICAgZXNjYWxhdGVfY2FzZToge1xuICAgICAgICBsYWJlbDogJ0VzY2FsYXIgQ2FzbycsXG4gICAgICAgIGNvbmZpcm1UZXh0OiAnRXN0byBlbnZpYXJcdTAwRTEgZWwgY2FzbyBhbCBlcXVpcG8gZGUgZXNjYWxhY2lcdTAwRjNuLiBcdTAwQkZDb250aW51YXI/JyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdcdTAwQTFDYXNvIGVzY2FsYWRvIGNvbiBcdTAwRTl4aXRvIScsXG4gICAgICB9LFxuICAgICAgY2xvc2VfY2FzZToge1xuICAgICAgICBsYWJlbDogJ0NlcnJhciBDYXNvJyxcbiAgICAgICAgY29uZmlybVRleHQ6ICdcdTAwQkZFc3RcdTAwRTEgc2VndXJvIGRlIHF1ZXJlciBjZXJyYXIgZXN0ZSBjYXNvPycsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnXHUwMEExQ2FzbyBjZXJyYWRvIGNvbiBcdTAwRTl4aXRvIScsXG4gICAgICB9LFxuICAgICAgY2xhaW1fY2FzZToge1xuICAgICAgICBsYWJlbDogJ1RvbWFyIENhc28nLFxuICAgICAgICBzdWNjZXNzTWVzc2FnZTogJ0Nhc28gdG9tYWRvOiBhaG9yYSBlcyBzdXlvLicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9rbm93bGVkZ2VfYXJ0aWNsZToge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgcHVibGlzaGVkX3JlcXVpcmVzX2JvZHk6IHtcbiAgICAgICAgbWVzc2FnZTogJ05vIHNlIHB1ZWRlbiBwdWJsaWNhciBhcnRcdTAwRURjdWxvcyBzaW4gY3VlcnBvLicsXG4gICAgICB9LFxuICAgICAgcHVibGlzaGVkX3JlcXVpcmVzX3N1bW1hcnk6IHtcbiAgICAgICAgbWVzc2FnZTogJ0xvcyBhcnRcdTAwRURjdWxvcyBwdWJsaWNhZG9zIGRlYmVuIHRlbmVyIHVuIHJlc3VtZW4gcGFyYSBsb3MgcmVzdWx0YWRvcyBkZSBiXHUwMEZBc3F1ZWRhIHkgbGFzIGNpdGFzIGRlIElBLicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdBcnRcdTAwRURjdWxvIGRlIENvbm9jaW1pZW50bycsXG4gICAgcGx1cmFsTGFiZWw6ICdCYXNlIGRlIENvbm9jaW1pZW50bycsXG4gICAgZGVzY3JpcHRpb246ICdSZXNwdWVzdGFzIHkgZ3VcdTAwRURhcyByZXV0aWxpemFibGVzIHBhcmEgY2xpZW50ZXMgeSBhZ2VudGVzJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGFydGljbGVfbnVtYmVyOiB7IGxhYmVsOiAnTi5cdTAwQkEgQXJ0XHUwMEVEY3VsbycgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdUXHUwMEVEdHVsbyBNb3N0cmFkbycgfSxcbiAgICAgIHRpdGxlOiB7IGxhYmVsOiAnVFx1MDBFRHR1bG8nIH0sXG4gICAgICBzdW1tYXJ5OiB7IGxhYmVsOiAnUmVzdW1lbicsIGhlbHA6ICdSZXN1bWVuIGRlIHVuIHBcdTAwRTFycmFmbyBxdWUgc2UgbXVlc3RyYSBlbiBsb3MgcmVzdWx0YWRvcyBkZSBiXHUwMEZBc3F1ZWRhIHkgZW4gbGFzIGNpdGFzIGRlIGxhIElBLicgfSxcbiAgICAgIGJvZHk6IHsgbGFiZWw6ICdDb250ZW5pZG8nLCBoZWxwOiAnQ29udGVuaWRvIGNvbXBsZXRvIGRlbCBhcnRcdTAwRURjdWxvIChNYXJrZG93bikuJyB9LFxuICAgICAgY2F0ZWdvcnk6IHtcbiAgICAgICAgbGFiZWw6ICdDYXRlZ29yXHUwMEVEYScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQ6ICdQcmltZXJvcyBwYXNvcycsIGhvd190bzogJ0NcdTAwRjNtbyBoYWNlcmxvJyxcbiAgICAgICAgICB0cm91Ymxlc2hvb3Rpbmc6ICdSZXNvbHVjaVx1MDBGM24gZGUgcHJvYmxlbWFzJywgYmlsbGluZzogJ0ZhY3R1cmFjaVx1MDBGM24nLCBhcGk6ICdBUEkgZSBJbnRlZ3JhY2lvbmVzJyxcbiAgICAgICAgICByZWxlYXNlX25vdGVzOiAnTm90YXMgZGUgdmVyc2lcdTAwRjNuJywgcG9saWN5OiAnUG9sXHUwMEVEdGljYXMnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHRhZ3M6IHtcbiAgICAgICAgbGFiZWw6ICdFdGlxdWV0YXMnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgYXV0aDogJ0F1dGVudGljYWNpXHUwMEYzbicsIHNzbzogJ1NTTycsIG1vYmlsZTogJ01cdTAwRjN2aWwnLCBlbWFpbDogJ0NvcnJlbycsXG4gICAgICAgICAgcmVwb3J0czogJ0luZm9ybWVzJywgcGVyZm9ybWFuY2U6ICdSZW5kaW1pZW50bycsXG4gICAgICAgICAgZGF0YV9pbXBvcnQ6ICdJbXBvcnRhY2lcdTAwRjNuIGRlIGRhdG9zJywgd2ViaG9va3M6ICdXZWJob29rcycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGxhYmVsOiAnRXN0YWRvJyxcbiAgICAgICAgb3B0aW9uczogeyBkcmFmdDogJ0JvcnJhZG9yJywgaW5fcmV2aWV3OiAnRW4gcmV2aXNpXHUwMEYzbicsIHB1Ymxpc2hlZDogJ1B1YmxpY2FkbycsIGFyY2hpdmVkOiAnQXJjaGl2YWRvJyB9LFxuICAgICAgfSxcbiAgICAgIGF1ZGllbmNlOiB7XG4gICAgICAgIGxhYmVsOiAnQXVkaWVuY2lhJyxcbiAgICAgICAgaGVscDogJ0xvcyBhcnRcdTAwRURjdWxvcyBwXHUwMEZBYmxpY29zIHNvbiB2aXNpYmxlcyBlbiBlbCBwb3J0YWwgZGUgY2xpZW50ZXM7IGxvcyBpbnRlcm5vcyBzb2xvIGxvcyB2ZW4gbG9zIGFnZW50ZXMuJyxcbiAgICAgICAgb3B0aW9uczogeyBwdWJsaWM6ICdQXHUwMEZBYmxpY28nLCBpbnRlcm5hbDogJ0ludGVybm8nIH0sXG4gICAgICB9LFxuICAgICAgbGFuZ3VhZ2U6IHtcbiAgICAgICAgbGFiZWw6ICdJZGlvbWEnLFxuICAgICAgICBvcHRpb25zOiB7IGVuOiAnSW5nbFx1MDBFOXMnLCB6aF9jbjogJ0NoaW5vIHNpbXBsaWZpY2FkbycsIGVzX2VzOiAnRXNwYVx1MDBGMW9sJywgamFfanA6ICdKYXBvblx1MDBFOXMnIH0sXG4gICAgICB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdQcm9waWV0YXJpbycgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY2FzZTogeyBsYWJlbDogJ0Nhc28gZGUgb3JpZ2VuJywgaGVscDogJ0Nhc28gYSBwYXJ0aXIgZGVsIGN1YWwgc2UgcmVkYWN0XHUwMEYzIGVzdGUgYXJ0XHUwMEVEY3VsbyAob3BjaW9uYWwpLicgfSxcbiAgICAgIHB1Ymxpc2hlZF9hdDogeyBsYWJlbDogJ1B1YmxpY2FkbyBlbCcgfSxcbiAgICAgIGxhc3RfcmV2aWV3ZWRfYXQ6IHsgbGFiZWw6ICdcdTAwREFsdGltYSByZXZpc2lcdTAwRjNuJyB9LFxuICAgICAgaGVscGZ1bF9jb3VudDogeyBsYWJlbDogJ1x1MDBEQXRpbCcsIGhlbHA6ICdSZWNvbnRhZG8gZGVzZGUgY3JtX2FydGljbGVfZmVlZGJhY2sgXHUyMDE0IG51bmNhIHNlIGVzY3JpYmUgYSBtYW5vLicgfSxcbiAgICAgIG5vdF9oZWxwZnVsX2NvdW50OiB7IGxhYmVsOiAnTm8gXHUwMEZBdGlsJywgaGVscDogJ1JlY29udGFkbyBkZXNkZSBjcm1fYXJ0aWNsZV9mZWVkYmFjayBcdTIwMTQgbnVuY2Egc2UgZXNjcmliZSBhIG1hbm8uJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfYXJ0aWNsZXM6IHsgbGFiZWw6ICdUb2RvcyBsb3MgYXJ0XHUwMEVEY3Vsb3MnIH0sXG4gICAgICBwdWJsaXNoZWRfYXJ0aWNsZXM6IHsgbGFiZWw6ICdQdWJsaWNhZG9zJyB9LFxuICAgICAgbXlfZHJhZnRzOiB7IGxhYmVsOiAnTWlzIGJvcnJhZG9yZXMnIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnSW5mb3JtYWNpXHUwMEYzbiBkZWwgQXJ0XHUwMEVEY3VsbycgfSxcbiAgICAgIGNvbnRlbnQ6IHsgbGFiZWw6ICdDb250ZW5pZG8nIH0sXG4gICAgICB0YXhvbm9teTogeyBsYWJlbDogJ0NhdGVnb3JpemFjaVx1MDBGM24nIH0sXG4gICAgICBtZXRyaWNzOiB7IGxhYmVsOiAnSW50ZXJhY2NpXHUwMEYzbicgfSxcbiAgICAgIGVuZ2FnZW1lbnQ6IHsgbGFiZWw6ICdJbnRlcmFjY2lcdTAwRjNuJyB9LFxuICAgICAgLy8gTm9tYnJlIGRlIHNlY2NpXHUwMEYzbiBkZWwgZm9ybXVsYXJpbyBlbiBrbm93bGVkZ2VfYXJ0aWNsZS52aWV3LnRzICgjMTEwMClcbiAgICAgIGFydGljbGU6IHsgbGFiZWw6ICdBcnRcdTAwRURjdWxvJyB9LFxuICAgIH0sXG4gICAgX2FjdGlvbnM6IHtcbiAgICAgIG1hcmtfYXJ0aWNsZV9oZWxwZnVsOiB7XG4gICAgICAgIGxhYmVsOiAnXHUwMERBdGlsJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdHcmFjaWFzIFx1MjAxNCByZWdpc3RyYWRvIGNvbW8gXHUwMEZBdGlsLicsXG4gICAgICB9LFxuICAgICAgbWFya19hcnRpY2xlX25vdF9oZWxwZnVsOiB7XG4gICAgICAgIGxhYmVsOiAnTm8gXHUwMEZBdGlsJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdHcmFjaWFzIFx1MjAxNCByZWdpc3RyYWRvIGNvbW8gbm8gXHUwMEZBdGlsLicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9hcnRpY2xlX2ZlZWRiYWNrOiB7XG4gICAgbGFiZWw6ICdPcGluaVx1MDBGM24gc29icmUgZWwgQXJ0XHUwMEVEY3VsbycsXG4gICAgcGx1cmFsTGFiZWw6ICdPcGluaW9uZXMgc29icmUgQXJ0XHUwMEVEY3Vsb3MnLFxuICAgIGRlc2NyaXB0aW9uOiAnRWwgdmVyZWRpY3RvIFx1MDBGQXRpbCAvIG5vIFx1MDBGQXRpbCBkZSB1biBsZWN0b3Igc29icmUgdW4gYXJ0XHUwMEVEY3VsbyBkZSBsYSBiYXNlIGRlIGNvbm9jaW1pZW50bycsXG4gICAgZmllbGRzOiB7XG4gICAgICBmZWVkYmFja19udW1iZXI6IHsgbGFiZWw6ICdOLlx1MDBCQSBkZSBPcGluaVx1MDBGM24nIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ0xlY3RvcicgfSxcbiAgICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogeyBsYWJlbDogJ0FydFx1MDBFRGN1bG8nLCBoZWxwOiAnQXJ0XHUwMEVEY3VsbyBkZSBsYSBiYXNlIGRlIGNvbm9jaW1pZW50byBhbCBxdWUgc2UgcmVmaWVyZSBlc3RhIG9waW5pXHUwMEYzbi4nIH0sXG4gICAgICB2ZXJkaWN0OiB7XG4gICAgICAgIGxhYmVsOiAnVmVyZWRpY3RvJyxcbiAgICAgICAgb3B0aW9uczogeyBoZWxwZnVsOiAnXHUwMERBdGlsJywgbm90X2hlbHBmdWw6ICdObyBcdTAwRkF0aWwnIH0sXG4gICAgICB9LFxuICAgICAgY29tbWVudDogeyBsYWJlbDogJ0NvbWVudGFyaW8nLCBoZWxwOiAnTm90YSBvcGNpb25hbCBxdWUgZXhwbGljYSBlbCB2ZXJlZGljdG8gXHUyMDE0IGxhIGxlZSBlbCBhdXRvciBkZWwgYXJ0XHUwMEVEY3Vsby4nIH0sXG4gICAgfSxcbiAgICBfc2VjdGlvbnM6IHtcbiAgICAgIGJhc2ljOiB7IGxhYmVsOiAnT3BpbmlcdTAwRjNuJyB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL29iamVjdHMuYWN0aXZpdHkudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy9vYmplY3RzLmFjdGl2aXR5LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IE9iamVjdFRyYW5zbGF0aW9uRGF0YSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3N5c3RlbSc7XG5cbi8qKlxuICogRXNwYVx1MDBGMW9sIChlcy1FUykgXHUyMDE0IGBvYmplY3RzYCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBBQ1RJVklUWSBmYW1pbHk6XG4gKiB0aGUgaW50ZXJhY3Rpb24gbG9nIFx1MjAxNCB0YXNrcywgZXZlbnRzLCBhbmQgd2hvIGF0dGVuZGVkLlxuICpcbiAqIFJvc3RlcjogYGNybV90YXNrYCwgYGNybV9ldmVudGAsIGBjcm1fZXZlbnRfYXR0ZW5kZWVgLlxuICpcbiAqIFNQTElUIEFYSVMgKCMxMzExKTogdHJhbnNsYXRpb24gTkFNRVNQQUNFIGZpcnN0LCB0aGVuIENSTSBET01BSU4gRkFNSUxZLlxuICogRXZlcnl0aGluZyB0aGF0IGlzIG5vdCBgb2JqZWN0c2AgbGl2ZXMgaW4gYC4vYXBwLnRzYDsgYG9iamVjdHNgIFx1MjAxNCA2OS03OCUgb2ZcbiAqIGV2ZXJ5IGJ1bmRsZSBcdTIwMTQgaXMgb25lIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5LCBhbmQgYSBkZXRhaWwgb2JqZWN0XG4gKiBmb2xsb3dzIGl0cyBtYXN0ZXIuIEEgbmV3IHJvdyBnb2VzIGluIHRoZSBmaWxlIGZvciBJVFMgZmFtaWx5LCBuZXZlciBpblxuICogd2hpY2hldmVyIGZpbGUgaXMgYWxyZWFkeSBvcGVuOiB0aGF0IGlzIGhvdyBvbmUgZmlsZSByZS1ncm93cyBwYXN0IHRoZSA3MCVcbiAqIGFkdmlzb3J5IGJhbmQgYHBucG0gaHlnaWVuZWAgcHJpbnRzLiBGdWxsIHJ1bGUgYW5kIHJhdGlvbmFsZTpcbiAqIGBzcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTLnRzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFjdGl2aXR5OiBSZWNvcmQ8c3RyaW5nLCBPYmplY3RUcmFuc2xhdGlvbkRhdGE+ID0ge1xuICBjcm1fdGFzazoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgY29tcGxldGVkX2RhdGVfcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0xhIGZlY2hhIGRlIGZpbmFsaXphY2lcdTAwRjNuIGVzIG9ibGlnYXRvcmlhIGN1YW5kbyBlbCBlc3RhZG8gZXMgQ29tcGxldGFkYScsXG4gICAgICB9LFxuICAgICAgcmVjdXJyZW5jZV9maWVsZHNfcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0VsIHRpcG8gZGUgcmVjdXJyZW5jaWEgZXMgb2JsaWdhdG9yaW8gcGFyYSBsYXMgdGFyZWFzIHJlY3VycmVudGVzJyxcbiAgICAgIH0sXG4gICAgICByZWxhdGVkX3RvX3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdEZWJlIHNlbGVjY2lvbmFyc2UgYWwgbWVub3MgdW4gcmVnaXN0cm8gcmVsYWNpb25hZG8nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnVGFyZWEnLFxuICAgIHBsdXJhbExhYmVsOiAnVGFyZWFzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0FjdGl2aWRhZGVzIHkgdGFyZWFzIHBlbmRpZW50ZXMnLFxuICAgIGZpZWxkczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ0FzdW50bycgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcGNpXHUwMEYzbicgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ0VzdGFkbycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBub3Rfc3RhcnRlZDogJ05vIEluaWNpYWRhJywgaW5fcHJvZ3Jlc3M6ICdFbiBDdXJzbycsIHdhaXRpbmc6ICdFbiBFc3BlcmEnLFxuICAgICAgICAgIGNvbXBsZXRlZDogJ0NvbXBsZXRhZGEnLCBkZWZlcnJlZDogJ0FwbGF6YWRhJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwcmlvcml0eToge1xuICAgICAgICBsYWJlbDogJ1ByaW9yaWRhZCcsXG4gICAgICAgIG9wdGlvbnM6IHsgbG93OiAnQmFqYScsIG5vcm1hbDogJ05vcm1hbCcsIGhpZ2g6ICdBbHRhJywgdXJnZW50OiAnVXJnZW50ZScgfSxcbiAgICAgIH0sXG4gICAgICBwcmlvcml0eV9yYW5rOiB7IGxhYmVsOiAnUmFuZ28gZGUgUHJpb3JpZGFkJyB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ1RpcG8gZGUgVGFyZWEnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY2FsbDogJ0xsYW1hZGEnLCBlbWFpbDogJ0VtYWlsJywgbWVldGluZzogJ1JldW5pXHUwMEYzbicsXG4gICAgICAgICAgZm9sbG93X3VwOiAnU2VndWltaWVudG8nLCBkZW1vOiAnRGVtb3N0cmFjaVx1MDBGM24nLCBvdGhlcjogJ090cm8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGR1ZV9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgTFx1MDBFRG1pdGUnIH0sXG4gICAgICByZW1pbmRlcl9kYXRlOiB7IGxhYmVsOiAnRmVjaGEvSG9yYSBkZSBSZWNvcmRhdG9yaW8nIH0sXG4gICAgICByZW1pbmRlcl9zZW50OiB7IGxhYmVsOiAnUmVjb3JkYXRvcmlvIEVudmlhZG8nIH0sXG4gICAgICBjb21wbGV0ZWRfZGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIEZpbmFsaXphY2lcdTAwRjNuJyB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdBc2lnbmFkbyBBJyB9LFxuICAgICAgLy8gTG9zIHZhbG9yZXMgc29uIG5vbWJyZXMgZGUgb2JqZXRvOiBzZSByZXV0aWxpemFuIGxhcyBldGlxdWV0YXMgeWFcbiAgICAgIC8vIHRyYWR1Y2lkYXMgZGUgY2FkYSBvYmpldG8gZW4gZXN0ZSBtaXNtbyBwYXF1ZXRlIChpZ3VhbCBxdWVcbiAgICAgIC8vIGBjcm1fZXZlbnQucmVsYXRlZF90b190eXBlYCkuXG4gICAgICByZWxhdGVkX3RvX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvIGRlIE9iamV0byBSZWxhY2lvbmFkbycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBjcm1fYWNjb3VudDogJ0N1ZW50YScsIGNybV9jb250YWN0OiAnQ29udGFjdG8nLCBjcm1fb3Bwb3J0dW5pdHk6ICdPcG9ydHVuaWRhZCcsXG4gICAgICAgICAgY3JtX2xlYWQ6ICdQcm9zcGVjdG8nLCBjcm1fY2FzZTogJ0Nhc28nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJlbGF0ZWRfdG9fYWNjb3VudDogeyBsYWJlbDogJ0N1ZW50YSBSZWxhY2lvbmFkYScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY29udGFjdDogeyBsYWJlbDogJ0NvbnRhY3RvIFJlbGFjaW9uYWRvJyB9LFxuICAgICAgcmVsYXRlZF90b19vcHBvcnR1bml0eTogeyBsYWJlbDogJ09wb3J0dW5pZGFkIFJlbGFjaW9uYWRhJyB9LFxuICAgICAgcmVsYXRlZF90b19sZWFkOiB7IGxhYmVsOiAnUHJvc3BlY3RvIFJlbGFjaW9uYWRvJyB9LFxuICAgICAgcmVsYXRlZF90b19jYXNlOiB7IGxhYmVsOiAnQ2FzbyBSZWxhY2lvbmFkbycgfSxcbiAgICAgIGlzX3JlY3VycmluZzogeyBsYWJlbDogJ1RhcmVhIFJlY3VycmVudGUnIH0sXG4gICAgICByZWN1cnJlbmNlX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvIGRlIFJlY3VycmVuY2lhJyxcbiAgICAgICAgb3B0aW9uczogeyBkYWlseTogJ0RpYXJpYScsIHdlZWtseTogJ1NlbWFuYWwnLCBtb250aGx5OiAnTWVuc3VhbCcsIHllYXJseTogJ0FudWFsJyB9LFxuICAgICAgfSxcbiAgICAgIHJlY3VycmVuY2VfaW50ZXJ2YWw6IHsgbGFiZWw6ICdJbnRlcnZhbG8gZGUgUmVjdXJyZW5jaWEnIH0sXG4gICAgICByZWN1cnJlbmNlX2VuZF9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgRmluIGRlIFJlY3VycmVuY2lhJyB9LFxuICAgICAgaXNfY29tcGxldGVkOiB7IGxhYmVsOiAnRXN0XHUwMEUxIENvbXBsZXRhZG8nIH0sXG4gICAgICBpc19vdmVyZHVlOiB7IGxhYmVsOiAnRXN0XHUwMEUxIFZlbmNpZG8nIH0sXG4gICAgICBwcm9ncmVzc19wZXJjZW50OiB7IGxhYmVsOiAnUHJvZ3Jlc28gKCUpJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfdGFza3M6IHsgbGFiZWw6ICdUb2RhcyBsYXMgVGFyZWFzJyB9LFxuICAgICAgdGFza19ib2FyZDogeyBsYWJlbDogJ1RhYmxlcm8gZGUgVGFyZWFzJyB9LFxuICAgICAgdGFza19jYWxlbmRhcjogeyBsYWJlbDogJ0NhbGVuZGFyaW8gZGUgVGFyZWFzJyB9LFxuICAgICAgdGFza19nYW50dDogeyBsYWJlbDogJ1BsYW4gZGUgRWplY3VjaVx1MDBGM24nIH0sXG4gICAgICB0YXNrX3RpbWVsaW5lOiB7IGxhYmVsOiAnTFx1MDBFRG5lYSBkZSBUaWVtcG8nIH0sXG4gICAgICBteV9vcGVuX3Rhc2tzOiB7IGxhYmVsOiAnTWlzIFRhcmVhcyBBYmllcnRhcycgfSxcbiAgICAgIHRvZGF5c190YXNrczogeyBsYWJlbDogJ1x1RDgzRFx1RENDNSBNaXMgVGFyZWFzIFByaW9yaXRhcmlhcycgfSxcbiAgICAgIG92ZXJkdWVfdGFza3M6IHsgbGFiZWw6ICdcdTIzRjAgVGFyZWFzIEFiaWVydGFzIFx1MDBCNyBNXHUwMEUxcyBWZW5jaWRhcyBQcmltZXJvJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gZGUgbGEgVGFyZWEnIH0sXG4gICAgICBzY2hlZHVsaW5nOiB7IGxhYmVsOiAnUHJvZ3JhbWFjaVx1MDBGM24nIH0sXG4gICAgICByZWxhdGVkOiB7IGxhYmVsOiAnUmVnaXN0cm9zIFJlbGFjaW9uYWRvcycgfSxcbiAgICAgIHJlY3VycmVuY2U6IHsgbGFiZWw6ICdSZWN1cnJlbmNpYScgfSxcbiAgICAgIGVmZm9ydDogeyBsYWJlbDogJ1Byb2dyZXNvIHkgRXNmdWVyem8nIH0sXG4gICAgICBzeXN0ZW06IHsgbGFiZWw6ICdTaXN0ZW1hJyB9LFxuICAgICAgLy8gTm9tYnJlcyBkZSBzZWNjaVx1MDBGM24gZGVsIGZvcm11bGFyaW8gZW4gdGFzay52aWV3LnRzICgjMTEwMClcbiAgICAgIHRhc2s6IHsgbGFiZWw6ICdUYXJlYScgfSxcbiAgICAgIHJlbGF0ZWRfcmVjb3JkczogeyBsYWJlbDogJ1JlZ2lzdHJvcyBSZWxhY2lvbmFkb3MnIH0sXG4gICAgICByZWN1cnJlbmNlX2FuZF9lZmZvcnQ6IHsgbGFiZWw6ICdSZWN1cnJlbmNpYSB5IEVzZnVlcnpvJyB9LFxuICAgIH0sXG4gIH0sXG4gIGNybV9ldmVudDoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgZW5kX2FmdGVyX3N0YXJ0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdMYSBob3JhIGRlIGZpbiBkZWJlIHNlciBwb3N0ZXJpb3IgYSBsYSBkZSBpbmljaW8nLFxuICAgICAgfSxcbiAgICAgIHJlbGF0ZWRfdG9fcmVxdWlyZWQ6IHtcbiAgICAgICAgbWVzc2FnZTogJ0RlYmUgc2VsZWNjaW9uYXJzZSBhbCBtZW5vcyB1biByZWdpc3RybyByZWxhY2lvbmFkbycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbGFiZWw6ICdFdmVudG8nLFxuICAgIHBsdXJhbExhYmVsOiAnRXZlbnRvcycsXG4gICAgZGVzY3JpcHRpb246ICdSZXVuaW9uZXMsIGxsYW1hZGFzIHkgb3RyYXMgaW50ZXJhY2Npb25lcyBwcm9ncmFtYWRhcyBjb24gY2xpZW50ZXMnLFxuICAgIGZpZWxkczoge1xuICAgICAgc3ViamVjdDogeyBsYWJlbDogJ0FzdW50bycgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IGxhYmVsOiAnRGVzY3JpcGNpXHUwMEYzbicgfSxcbiAgICAgIHR5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvIGRlIGV2ZW50bycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBtZWV0aW5nOiAnUmV1bmlcdTAwRjNuJywgY2FsbDogJ0xsYW1hZGEnLCBkZW1vOiAnRGVtb3N0cmFjaVx1MDBGM24nLFxuICAgICAgICAgIHdlYmluYXI6ICdTZW1pbmFyaW8gd2ViJywgb25zaXRlX3Zpc2l0OiAnVmlzaXRhIHByZXNlbmNpYWwnLCBvdGhlcjogJ090cm8nLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHN0YXR1czoge1xuICAgICAgICBsYWJlbDogJ0VzdGFkbycsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBwbGFubmVkOiAnUGxhbmlmaWNhZG8nLCBoZWxkOiAnUmVhbGl6YWRvJywgY2FuY2VsbGVkOiAnQ2FuY2VsYWRvJywgbm9fc2hvdzogJ05vIGFzaXN0aVx1MDBGMycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgb3duZXJfaWQ6IHsgbGFiZWw6ICdBc2lnbmFkbyBhJyB9LFxuICAgICAgc3RhcnRfZGF0ZXRpbWU6IHsgbGFiZWw6ICdJbmljaW8nIH0sXG4gICAgICBlbmRfZGF0ZXRpbWU6IHsgbGFiZWw6ICdGaW4nIH0sXG4gICAgICBhbGxfZGF5OiB7IGxhYmVsOiAnRXZlbnRvIGRlIHRvZG8gZWwgZFx1MDBFRGEnIH0sXG4gICAgICBkdXJhdGlvbl9taW51dGVzOiB7IGxhYmVsOiAnRHVyYWNpXHUwMEYzbiAobWludXRvcyknIH0sXG4gICAgICBsb2NhdGlvbjogeyBsYWJlbDogJ1ViaWNhY2lcdTAwRjNuJywgaGVscDogJ1NhbGEsIGRpcmVjY2lcdTAwRjNuIG8gZW5sYWNlIGRlIGxhIHJldW5pXHUwMEYzbicgfSxcbiAgICAgIHJlbGF0ZWRfdG9fdHlwZToge1xuICAgICAgICBsYWJlbDogJ1RpcG8gZGUgcmVnaXN0cm8gcmVsYWNpb25hZG8nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgY3JtX2FjY291bnQ6ICdDdWVudGEnLCBjcm1fY29udGFjdDogJ0NvbnRhY3RvJywgY3JtX29wcG9ydHVuaXR5OiAnT3BvcnR1bmlkYWQnLFxuICAgICAgICAgIGNybV9sZWFkOiAnUHJvc3BlY3RvJywgY3JtX2Nhc2U6ICdDYXNvJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZWxhdGVkX3RvX2FjY291bnQ6IHsgbGFiZWw6ICdDdWVudGEgcmVsYWNpb25hZGEnIH0sXG4gICAgICByZWxhdGVkX3RvX2NvbnRhY3Q6IHsgbGFiZWw6ICdDb250YWN0byByZWxhY2lvbmFkbycgfSxcbiAgICAgIHJlbGF0ZWRfdG9fb3Bwb3J0dW5pdHk6IHsgbGFiZWw6ICdPcG9ydHVuaWRhZCByZWxhY2lvbmFkYScgfSxcbiAgICAgIHJlbGF0ZWRfdG9fbGVhZDogeyBsYWJlbDogJ1Byb3NwZWN0byByZWxhY2lvbmFkbycgfSxcbiAgICAgIHJlbGF0ZWRfdG9fY2FzZTogeyBsYWJlbDogJ0Nhc28gcmVsYWNpb25hZG8nIH0sXG4gICAgICBvdXRjb21lX25vdGVzOiB7IGxhYmVsOiAnTm90YXMgZGUgcmVzdWx0YWRvJywgaGVscDogJ1F1XHUwMEU5IHNlIGFjb3JkXHUwMEYzIHkgcXVcdTAwRTkgc2lndWUnIH0sXG4gICAgfSxcbiAgICBfdmlld3M6IHtcbiAgICAgIGFsbF9ldmVudHM6IHsgbGFiZWw6ICdUb2RvcyBsb3MgZXZlbnRvcycgfSxcbiAgICAgIGV2ZW50X2NhbGVuZGFyOiB7IGxhYmVsOiAnQ2FsZW5kYXJpbyBkZSBldmVudG9zJyB9LFxuICAgICAgZXZlbnRfdGltZWxpbmU6IHsgbGFiZWw6ICdBZ2VuZGEgZGVsIGVxdWlwbycgfSxcbiAgICAgIG15X2V2ZW50czogeyBsYWJlbDogJ01pIGNhbGVuZGFyaW8nIH0sXG4gICAgICB1cGNvbWluZ19ldmVudHM6IHsgbGFiZWw6ICdcdUQ4M0RcdURDQzUgUHJcdTAwRjN4aW1vcyBcdTAwQjcgTVx1MDBFMXMgY2VyY2Fub3MgcHJpbWVybycgfSxcbiAgICAgIGhlbGRfZXZlbnRzOiB7IGxhYmVsOiAnXHUyNzA1IEhpc3RvcmlhbCBkZSBpbnRlcmFjY2lvbmVzJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gZGVsIEV2ZW50bycgfSxcbiAgICAgIHNjaGVkdWxlOiB7IGxhYmVsOiAnUHJvZ3JhbWFjaVx1MDBGM24nIH0sXG4gICAgICByZWxhdGVkOiB7IGxhYmVsOiAnUmVnaXN0cm9zIFJlbGFjaW9uYWRvcycgfSxcbiAgICAgIG91dGNvbWU6IHsgbGFiZWw6ICdSZXN1bHRhZG8nIH0sXG4gICAgICAvLyBOb21icmVzIGRlIHNlY2NpXHUwMEYzbiBkZWwgZm9ybXVsYXJpbyBlbiBldmVudC52aWV3LnRzICgjMTEwMClcbiAgICAgIGV2ZW50OiB7IGxhYmVsOiAnRXZlbnRvJyB9LFxuICAgICAgcmVsYXRlZF9yZWNvcmRzOiB7IGxhYmVsOiAnUmVnaXN0cm9zIFJlbGFjaW9uYWRvcycgfSxcbiAgICB9LFxuICB9LFxuICBjcm1fZXZlbnRfYXR0ZW5kZWU6IHtcbiAgICBfdmFsaWRhdGlvbnM6IHtcbiAgICAgIGF0dGVuZGVlX3Jlc29sdmVzOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdVbiBhc2lzdGVudGUgZGViZSBpbmRpY2FyIGxhIHBhcnRlIHF1ZSBub21icmEgc3UgdGlwbzogZWwgdGlwbyBDb250YWN0byByZXF1aWVyZSB1biBjb250YWN0byB5IGVsIHRpcG8gRXh0ZXJubyByZXF1aWVyZSB1biBub21icmUgZGUgYXNpc3RlbnRlIGV4dGVybm8nLFxuICAgICAgfSxcbiAgICAgIGF0dGVuZGVlX3R5cGVfZXhjbHVzaXZlOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdVbiBhc2lzdGVudGUgbm9tYnJhIGV4YWN0YW1lbnRlIHVuYSBwYXJ0ZTogYm9ycmUgbGFzIGNvbHVtbmFzIHF1ZSBzdSB0aXBvIGRlIGFzaXN0ZW50ZSBubyBub21icmEnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGxhYmVsOiAnQXNpc3RlbnRlIGFsIGV2ZW50bycsXG4gICAgcGx1cmFsTGFiZWw6ICdBc2lzdGVudGVzIGFsIGV2ZW50bycsXG4gICAgZGVzY3JpcHRpb246ICdQZXJzb25hIGludml0YWRhIG8gcHJlc2VudGUgZW4gdW4gZXZlbnRvJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIGF0dGVuZGVlX251bWJlcjogeyBsYWJlbDogJ05cdTAwRkFtZXJvIGRlIGFzaXN0ZW50ZScgfSxcbiAgICAgIGNybV9ldmVudDogeyBsYWJlbDogJ0V2ZW50bycgfSxcbiAgICAgIGF0dGVuZGVlX3R5cGU6IHtcbiAgICAgICAgbGFiZWw6ICdUaXBvIGRlIGFzaXN0ZW50ZScsXG4gICAgICAgIG9wdGlvbnM6IHsgY29udGFjdDogJ0NvbnRhY3RvJywgbGVhZDogJ1Byb3NwZWN0bycsIHVzZXI6ICdVc3VhcmlvJywgZXh0ZXJuYWw6ICdFeHRlcm5vJyB9LFxuICAgICAgfSxcbiAgICAgIGNybV9jb250YWN0OiB7IGxhYmVsOiAnQ29udGFjdG8nLCBoZWxwOiAnU2UgcmVsbGVuYSBjdWFuZG8gZWwgYXNpc3RlbnRlIGVzIHVuIGNvbnRhY3RvIGRlIGNsaWVudGUgeWEgZXhpc3RlbnRlJyB9LFxuICAgICAgY3JtX2xlYWQ6IHsgbGFiZWw6ICdQcm9zcGVjdG8nLCBoZWxwOiAnU2UgcmVsbGVuYSBjdWFuZG8gZWwgYXNpc3RlbnRlIHNpZ3VlIHNpZW5kbyB1biBwcm9zcGVjdG8gc2luIGNvbnZlcnRpcicgfSxcbiAgICAgIHN5c191c2VyOiB7IGxhYmVsOiAnVXN1YXJpbycsIGhlbHA6ICdTZSByZWxsZW5hIGN1YW5kbyBlbCBhc2lzdGVudGUgZXMgdW4gY29tcGFcdTAwRjFlcm8gZGUgbGEgZW1wcmVzYScgfSxcbiAgICAgIGV4dGVybmFsX25hbWU6IHsgbGFiZWw6ICdBc2lzdGVudGUgZXh0ZXJubycsIGhlbHA6ICdOb21icmUgZGUgdW4gYXNpc3RlbnRlIHF1ZSBubyBlc3RcdTAwRTEgZW4gbmluZ1x1MDBGQW4gb2JqZXRvIGRlbCBDUk06IHNlIHJlbGxlbmEgY3VhbmRvIGVsIHRpcG8gZGUgYXNpc3RlbnRlIGVzIEV4dGVybm8nIH0sXG4gICAgICByZXNwb25zZToge1xuICAgICAgICBsYWJlbDogJ1Jlc3B1ZXN0YScsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBub19yZXNwb25zZTogJ1NpbiByZXNwdWVzdGEnLCBhY2NlcHRlZDogJ0FjZXB0YWRvJyxcbiAgICAgICAgICBkZWNsaW5lZDogJ1JlY2hhemFkbycsIHRlbnRhdGl2ZTogJ1RlbnRhdGl2bycsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgaXNfb3JnYW5pemVyOiB7IGxhYmVsOiAnT3JnYW5pemFkb3InIH0sXG4gICAgICBpbnZpdGVkX2RhdGU6IHsgbGFiZWw6ICdJbnZpdGFkbyBlbCcgfSxcbiAgICB9LFxuICAgIF92aWV3czoge1xuICAgICAgYWxsX2V2ZW50X2F0dGVuZGVlczogeyBsYWJlbDogJ0FzaXN0ZW50ZXMgYWwgZXZlbnRvJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICAvLyBFbCBpbmdsXHUwMEU5cyBlcyBcdTAwQUJBdHRlbmRlZVx1MDBCQiAvIFx1MDBBQkludml0YXRpb25cdTAwQkIsIG5vIGVsIHBhclxuICAgICAgLy8gXHUwMEFCQmFzaWMgSW5mb3JtYXRpb25cdTAwQkIgLyBcdTAwQUJSZXNwb25zZSBUcmFja2luZ1x1MDBCQiBkZSBjcm1fY2FtcGFpZ25fbWVtYmVyLlxuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdBc2lzdGVudGUnIH0sXG4gICAgICByZXNwb25zZTogeyBsYWJlbDogJ0ludml0YWNpXHUwMEYzbicgfSxcbiAgICAgIC8vIE5vbWJyZXMgZGUgc2VjY2lcdTAwRjNuIGRlbCBmb3JtdWxhcmlvIGVuIGV2ZW50X2F0dGVuZGVlLnZpZXcudHMgKCMxMTAwKVxuICAgICAgYXR0ZW5kZWU6IHsgbGFiZWw6ICdBc2lzdGVudGUnIH0sXG4gICAgICBpbnZpdGF0aW9uOiB7IGxhYmVsOiAnSW52aXRhY2lcdTAwRjNuJyB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTL29iamVjdHMubWFya2V0aW5nLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FU1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMvb2JqZWN0cy5tYXJrZXRpbmcudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgT2JqZWN0VHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuLyoqXG4gKiBFc3BhXHUwMEYxb2wgKGVzLUVTKSBcdTIwMTQgYG9iamVjdHNgIHRyYW5zbGF0aW9ucyBmb3IgdGhlIE1BUktFVElORyBmYW1pbHk6XG4gKiBkZW1hbmQgZ2VuZXJhdGlvbiBcdTIwMTQgY2FtcGFpZ25zIGFuZCB0aGVpciBtZW1iZXJzaGlwLlxuICpcbiAqIFJvc3RlcjogYGNybV9jYW1wYWlnbmAsIGBjcm1fY2FtcGFpZ25fbWVtYmVyYC5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqIEV2ZXJ5dGhpbmcgdGhhdCBpcyBub3QgYG9iamVjdHNgIGxpdmVzIGluIGAuL2FwcC50c2A7IGBvYmplY3RzYCBcdTIwMTQgNjktNzglIG9mXG4gKiBldmVyeSBidW5kbGUgXHUyMDE0IGlzIG9uZSBmaWxlIHBlciBDUk0gZG9tYWluIGZhbWlseSwgYW5kIGEgZGV0YWlsIG9iamVjdFxuICogZm9sbG93cyBpdHMgbWFzdGVyLiBBIG5ldyByb3cgZ29lcyBpbiB0aGUgZmlsZSBmb3IgSVRTIGZhbWlseSwgbmV2ZXIgaW5cbiAqIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbjogdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdCB0aGUgNzAlXG4gKiBhZHZpc29yeSBiYW5kIGBwbnBtIGh5Z2llbmVgIHByaW50cy4gRnVsbCBydWxlIGFuZCByYXRpb25hbGU6XG4gKiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy9lcy1FUy50c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBtYXJrZXRpbmc6IFJlY29yZDxzdHJpbmcsIE9iamVjdFRyYW5zbGF0aW9uRGF0YT4gPSB7XG4gIGNybV9jYW1wYWlnbjoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgZW5kX2FmdGVyX3N0YXJ0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdMYSBmZWNoYSBkZSBmaW4gZGViZSBzZXIgcG9zdGVyaW9yIGEgbGEgZGUgaW5pY2lvJyxcbiAgICAgIH0sXG4gICAgICBhY3R1YWxfY29zdF93aXRoaW5fYnVkZ2V0OiB7XG4gICAgICAgIG1lc3NhZ2U6ICdFbCBjb3N0ZSByZWFsIHN1cGVyYSBlbCBjb3N0ZSBwcmVzdXB1ZXN0YWRvJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ0NhbXBhXHUwMEYxYScsXG4gICAgcGx1cmFsTGFiZWw6ICdDYW1wYVx1MDBGMWFzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NhbXBhXHUwMEYxYXMgZSBpbmljaWF0aXZhcyBkZSBtYXJrZXRpbmcnLFxuICAgIGZpZWxkczoge1xuICAgICAgY2FtcGFpZ25fY29kZTogeyBsYWJlbDogJ0NcdTAwRjNkaWdvIGRlIENhbXBhXHUwMEYxYScgfSxcbiAgICAgIGRpc3BsYXlfdGl0bGU6IHsgbGFiZWw6ICdUXHUwMEVEdHVsbyBNb3N0cmFkbycgfSxcbiAgICAgIG5hbWU6IHsgbGFiZWw6ICdOb21icmUgZGUgQ2FtcGFcdTAwRjFhJyB9LFxuICAgICAgZGVzY3JpcHRpb246IHsgbGFiZWw6ICdEZXNjcmlwY2lcdTAwRjNuJyB9LFxuICAgICAgdHlwZToge1xuICAgICAgICBsYWJlbDogJ1RpcG8gZGUgQ2FtcGFcdTAwRjFhJyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGVtYWlsOiAnRW1haWwnLCB3ZWJpbmFyOiAnU2VtaW5hcmlvIFdlYicsIHRyYWRlX3Nob3c6ICdGZXJpYSBDb21lcmNpYWwnLFxuICAgICAgICAgIGNvbmZlcmVuY2U6ICdDb25mZXJlbmNpYScsIGRpcmVjdF9tYWlsOiAnQ29ycmVvIFBvc3RhbCcsIHNvY2lhbF9tZWRpYTogJ1JlZGVzIFNvY2lhbGVzJyxcbiAgICAgICAgICBjb250ZW50OiAnTWFya2V0aW5nIGRlIENvbnRlbmlkb3MnLCBwYXJ0bmVyOiAnTWFya2V0aW5nIGNvbiBTb2Npb3MnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNoYW5uZWw6IHtcbiAgICAgICAgbGFiZWw6ICdDYW5hbCBQcmluY2lwYWwnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgZGlnaXRhbDogJ0RpZ2l0YWwnLCBzb2NpYWw6ICdSZWRlcyBTb2NpYWxlcycsIGVtYWlsOiAnRW1haWwnLFxuICAgICAgICAgIGV2ZW50czogJ0V2ZW50b3MnLCBwYXJ0bmVyOiAnU29jaW9zJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdFc3RhZG8nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgcGxhbm5pbmc6ICdQbGFuaWZpY2FjaVx1MDBGM24nLCBpbl9wcm9ncmVzczogJ0VuIEN1cnNvJyxcbiAgICAgICAgICBjb21wbGV0ZWQ6ICdDb21wbGV0YWRhJywgYWJvcnRlZDogJ0NhbmNlbGFkYScsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc3RhcnRfZGF0ZTogeyBsYWJlbDogJ0ZlY2hhIGRlIEluaWNpbycgfSxcbiAgICAgIGVuZF9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgRmluJyB9LFxuICAgICAgYnVkZ2V0ZWRfY29zdDogeyBsYWJlbDogJ0Nvc3RvIFByZXN1cHVlc3RhZG8nIH0sXG4gICAgICBhY3R1YWxfY29zdDogeyBsYWJlbDogJ0Nvc3RvIFJlYWwnIH0sXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiB7IGxhYmVsOiAnSW5ncmVzb3MgUHJldmlzdG9zJyB9LFxuICAgICAgYWN0dWFsX3JldmVudWU6IHsgbGFiZWw6ICdJbmdyZXNvcyBSZWFsZXMnIH0sXG4gICAgICB0YXJnZXRfc2l6ZTogeyBsYWJlbDogJ1RhbWFcdTAwRjFvIE9iamV0aXZvJywgaGVscDogJ05cdTAwRkFtZXJvIG9iamV0aXZvIGRlIHByb3NwZWN0b3MvY29udGFjdG9zJyB9LFxuICAgICAgbnVtX3NlbnQ6IHsgbGFiZWw6ICdDYW50aWRhZCBFbnZpYWRhJyB9LFxuICAgICAgbnVtX3Jlc3BvbnNlczogeyBsYWJlbDogJ05cdTAwRkFtZXJvIGRlIFJlc3B1ZXN0YXMnIH0sXG4gICAgICBudW1fbGVhZHM6IHsgbGFiZWw6ICdOXHUwMEZBbWVybyBkZSBQcm9zcGVjdG9zJyB9LFxuICAgICAgbnVtX2NvbnZlcnRlZF9sZWFkczogeyBsYWJlbDogJ1Byb3NwZWN0b3MgQ29udmVydGlkb3MnIH0sXG4gICAgICBudW1fb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ09wb3J0dW5pZGFkZXMgQ3JlYWRhcycgfSxcbiAgICAgIG51bV93b25fb3Bwb3J0dW5pdGllczogeyBsYWJlbDogJ09wb3J0dW5pZGFkZXMgR2FuYWRhcycgfSxcbiAgICAgIHJlc3BvbnNlX3JhdGU6IHsgbGFiZWw6ICdUYXNhIGRlIFJlc3B1ZXN0YSAlJyB9LFxuICAgICAgcm9pOiB7IGxhYmVsOiAnUk9JICUnIH0sXG4gICAgICBvd25lcl9pZDogeyBsYWJlbDogJ1Byb3BpZXRhcmlvIGRlIENhbXBhXHUwMEYxYScgfSxcbiAgICAgIGxhbmRpbmdfcGFnZV91cmw6IHsgbGFiZWw6ICdQXHUwMEUxZ2luYSBkZSBBdGVycml6YWplJyB9LFxuICAgICAgaXNfYWN0aXZlOiB7IGxhYmVsOiAnQWN0aXZvJyB9LFxuICAgIH0sXG4gICAgX3ZpZXdzOiB7XG4gICAgICBhbGxfY2FtcGFpZ25zOiB7IGxhYmVsOiAnVG9kYXMgbGFzIENhbXBhXHUwMEYxYXMnIH0sXG4gICAgICBjYW1wYWlnbl9nYW50dDogeyBsYWJlbDogJ1Byb2dyYW1hY2lcdTAwRjNuIGRlIENhbXBhXHUwMEYxYXMnIH0sXG4gICAgICBjYW1wYWlnbl9jYWxlbmRhcjogeyBsYWJlbDogJ0NhbGVuZGFyaW8gZGUgQ2FtcGFcdTAwRjFhcycgfSxcbiAgICAgIGNhbXBhaWduX3RpbWVsaW5lOiB7IGxhYmVsOiAnTFx1MDBFRG5lYSBkZSBUaWVtcG8gZGUgTWFya2V0aW5nJyB9LFxuICAgIH0sXG4gICAgX3NlY3Rpb25zOiB7XG4gICAgICBiYXNpYzogeyBsYWJlbDogJ0luZm9ybWFjaVx1MDBGM24gZGUgQ2FtcGFcdTAwRjFhJyB9LFxuICAgICAgc2NoZWR1bGU6IHsgbGFiZWw6ICdQcm9ncmFtYWNpXHUwMEYzbicgfSxcbiAgICAgIGJ1ZGdldDogeyBsYWJlbDogJ1ByZXN1cHVlc3RvIHkgUk9JJyB9LFxuICAgICAgbWV0cmljczogeyBsYWJlbDogJ1JlbmRpbWllbnRvJyB9LFxuICAgICAgLy8gRWwgaW5nbFx1MDBFOXMgZGUgZXN0ZSBncnVwbyBlcyBcdTAwQUJPd25lcnNoaXBcdTAwQkIsIG5vIFx1MDBBQkFzc2lnbm1lbnRcdTAwQkI6IGFncnVwYSBhbFxuICAgICAgLy8gcHJvcGlldGFyaW8gZGUgbGEgY2FtcGFcdTAwRjFhLCBpZ3VhbCBxdWUgYGNybV9hY2NvdW50Lm93bmVyc2hpcGAuXG4gICAgICBhc3NpZ25tZW50OiB7IGxhYmVsOiAnUHJvcGllZGFkJyB9LFxuICAgICAgYXNzZXRzOiB7IGxhYmVsOiAnUmVjdXJzb3MgZGUgQ2FtcGFcdTAwRjFhJyB9LFxuICAgIH0sXG4gICAgX2FjdGlvbnM6IHtcbiAgICAgIGVucm9sbF9sZWFkczoge1xuICAgICAgICBsYWJlbDogJ0luc2NyaWJpciBNaWVtYnJvcycsXG4gICAgICAgIHN1Y2Nlc3NNZXNzYWdlOiAnTWllbWJyb3MgZWxlZ2libGVzIGluc2NyaXRvcyBlbiBsYSBjYW1wYVx1MDBGMWEuJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgY3JtX2NhbXBhaWduX21lbWJlcjoge1xuICAgIF92YWxpZGF0aW9uczoge1xuICAgICAgbGVhZF9vcl9jb250YWN0X3JlcXVpcmVkOiB7XG4gICAgICAgIG1lc3NhZ2U6ICdVbiBtaWVtYnJvIGRlIGNhbXBhXHUwMEYxYSBkZWJlIHJlZmVyZW5jaWFyIHVuIHByb3NwZWN0byBvIHVuIGNvbnRhY3RvJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsYWJlbDogJ01pZW1icm8gZGUgQ2FtcGFcdTAwRjFhJyxcbiAgICBwbHVyYWxMYWJlbDogJ01pZW1icm9zIGRlIENhbXBhXHUwMEYxYScsXG4gICAgZGVzY3JpcHRpb246ICdQcm9zcGVjdG9zIHkgY29udGFjdG9zIGFsY2FuemFkb3MgcG9yIHVuYSBjYW1wYVx1MDBGMWEsIGNvbiBzdSBlc3RhZG8gZGUgcmVzcHVlc3RhJyxcbiAgICBmaWVsZHM6IHtcbiAgICAgIG1lbWJlcl9udW1iZXI6IHsgbGFiZWw6ICdOXHUwMEZBbWVybyBkZSBNaWVtYnJvJyB9LFxuICAgICAgY3JtX2NhbXBhaWduOiB7IGxhYmVsOiAnQ2FtcGFcdTAwRjFhJyB9LFxuICAgICAgY3JtX2xlYWQ6IHsgbGFiZWw6ICdQcm9zcGVjdG8nLCBoZWxwOiAnU2UgcmVsbGVuYSBjdWFuZG8gZWwgbWllbWJybyBlcmEgdW4gUHJvc3BlY3RvIGVuIGVsIG1vbWVudG8gZGUgbGEgaW5zY3JpcGNpXHUwMEYzbicgfSxcbiAgICAgIGNybV9jb250YWN0OiB7IGxhYmVsOiAnQ29udGFjdG8nLCBoZWxwOiAnU2UgcmVsbGVuYSBjdWFuZG8gZWwgbWllbWJybyBlcyB1biBDb250YWN0byBleGlzdGVudGUnIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgbGFiZWw6ICdFc3RhZG8nLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgc2VudDogJ0VudmlhZG8nLCByZXNwb25kZWQ6ICdSZXNwb25kaWRvJyxcbiAgICAgICAgICBjb252ZXJ0ZWQ6ICdDb252ZXJ0aWRvJywgdW5zdWJzY3JpYmVkOiAnRGFkbyBkZSBCYWphJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhZGRlZF9kYXRlOiB7IGxhYmVsOiAnRmVjaGEgZGUgQWx0YScgfSxcbiAgICAgIHJlc3BvbnNlX2RhdGU6IHsgbGFiZWw6ICdGZWNoYSBkZSBSZXNwdWVzdGEnIH0sXG4gICAgICBoYXNfcmVzcG9uZGVkOiB7IGxhYmVsOiAnSGEgUmVzcG9uZGlkbycgfSxcbiAgICB9LFxuICAgIF9zZWN0aW9uczoge1xuICAgICAgYmFzaWM6IHsgbGFiZWw6ICdJbmZvcm1hY2lcdTAwRjNuIEJcdTAwRTFzaWNhJyB9LFxuICAgICAgcmVzcG9uc2U6IHsgbGFiZWw6ICdTZWd1aW1pZW50byBkZSBSZXNwdWVzdGEnIH0sXG4gICAgfSxcbiAgICBfYWN0aW9uczoge1xuICAgICAgbWFya19yZXNwb25kZWQ6IHtcbiAgICAgICAgbGFiZWw6ICdNYXJjYXIgY29tbyBSZXNwb25kaWRvJyxcbiAgICAgICAgc3VjY2Vzc01lc3NhZ2U6ICdSZXNwdWVzdGEgcmVnaXN0cmFkYSBlbiBlc3RlIG1pZW1icm8gZGUgY2FtcGFcdTAwRjFhLicsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdHJhbnNsYXRpb25zL2VzLUVTLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9uc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvZXMtRVMudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgVHJhbnNsYXRpb25EYXRhIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcblxuaW1wb3J0IHsgYXBwU3VyZmFjZSB9IGZyb20gJy4vZXMtRVMvYXBwJztcbmltcG9ydCB7IGN1c3RvbWVyIH0gZnJvbSAnLi9lcy1FUy9vYmplY3RzLmN1c3RvbWVyJztcbmltcG9ydCB7IHBpcGVsaW5lIH0gZnJvbSAnLi9lcy1FUy9vYmplY3RzLnBpcGVsaW5lJztcbmltcG9ydCB7IGNvbW1lcmNlIH0gZnJvbSAnLi9lcy1FUy9vYmplY3RzLmNvbW1lcmNlJztcbmltcG9ydCB7IHNlcnZpY2UgfSBmcm9tICcuL2VzLUVTL29iamVjdHMuc2VydmljZSc7XG5pbXBvcnQgeyBhY3Rpdml0eSB9IGZyb20gJy4vZXMtRVMvb2JqZWN0cy5hY3Rpdml0eSc7XG5pbXBvcnQgeyBtYXJrZXRpbmcgfSBmcm9tICcuL2VzLUVTL29iamVjdHMubWFya2V0aW5nJztcblxuLyoqXG4gKiBFc3BhXHUwMEYxb2wgKGVzLUVTKSBcdTIwMTQgQ1JNIEFwcCBUcmFuc2xhdGlvbnNcbiAqXG4gKiBQZXItbG9jYWxlIGZpbGU6IG9uZSBmaWxlIHBlciBsYW5ndWFnZSwgZm9sbG93aW5nIHRoZSBgcGVyX2xvY2FsZWAgY29udmVudGlvbi5cbiAqXG4gKiBTUExJVCBBWElTICgjMTMxMSk6IHRyYW5zbGF0aW9uIE5BTUVTUEFDRSBmaXJzdCwgdGhlbiBDUk0gRE9NQUlOIEZBTUlMWS5cbiAqXG4gKiBUaGlzIGJ1bmRsZSB3YXMgb25lIGZpbGUgYW5kIGl0IGhhZCByZWFjaGVkIDg4LjYlIG9mIHRoZSAxMDBLQiBzb3VyY2UgY2FwXG4gKiBgcG5wbSBoeWdpZW5lYCBlbmZvcmNlcywgZ3Jvd2luZyB+MS4yS0IgYSBkYXkuIEl0IGlzIG5vdyBhc3NlbWJsZWQgZnJvbVxuICogYC4vPGxvY2FsZT4vYCwgb24gYW4gYXhpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiBndWVzc2VkOlxuICpcbiAqICAgLSBldmVyeSBuYW1lc3BhY2UgdGhhdCBpcyBOT1QgYG9iamVjdHNgIFx1MjAxNCBgYXBwc2AsIGBtZXNzYWdlc2AsXG4gKiAgICAgYGRhc2hib2FyZHNgLCBgZGF0YXNldHNgLCBgcGFnZXNgLCBhbmQgYW55IG5hbWVzcGFjZSBgVHJhbnNsYXRpb25EYXRhYFxuICogICAgIGdhaW5zIGxhdGVyIFx1MjAxNCBsaXZlcyBpbiBgYXBwLnRzYC4gTWVhc3VyZWQ6IHRob3NlIG5hbWVzcGFjZXMgdG9nZXRoZXJcbiAqICAgICBhcmUgdW5kZXIgYSBxdWFydGVyIG9mIHRoZSBidW5kbGUsIGFuZCB0aGUgc2NoZW1hIGJvdW5kcyBob3cgbWFueSBjYW5cbiAqICAgICBldmVyIGFycml2ZSwgc28gb25lIGZpbGUgaG9sZHMgdGhlbSB3aXRoIHJvb20gbGVmdDtcbiAqICAgLSBgb2JqZWN0c2AgaXMgNjktNzglIG9mIGV2ZXJ5IGJ1bmRsZSwgc28gaXQgaXMgcGFydGl0aW9uZWQgYWdhaW4sIG9uZVxuICogICAgIGZpbGUgcGVyIENSTSBkb21haW4gZmFtaWx5IFx1MjAxNCBgY3VzdG9tZXJgLCBgcGlwZWxpbmVgLCBgY29tbWVyY2VgLFxuICogICAgIGBzZXJ2aWNlYCwgYGFjdGl2aXR5YCwgYG1hcmtldGluZ2AgXHUyMDE0IGFuZCBhIERFVEFJTCBvYmplY3QgZm9sbG93cyBpdHNcbiAqICAgICBtYXN0ZXI6IGxpbmUgaXRlbXMgZm9sbG93IHRoZWlyIHF1b3RlIG9yIG9wcG9ydHVuaXR5LFxuICogICAgIGBjcm1fZXZlbnRfYXR0ZW5kZWVgIGZvbGxvd3MgYGNybV9ldmVudGAsIGBjcm1fY2FtcGFpZ25fbWVtYmVyYFxuICogICAgIGZvbGxvd3MgYGNybV9jYW1wYWlnbmAsIGBjcm1fYXJ0aWNsZV9mZWVkYmFja2AgZm9sbG93c1xuICogICAgIGBjcm1fa25vd2xlZGdlX2FydGljbGVgLlxuICpcbiAqIEEgbmFtZXNwYWNlIGF4aXMgQUxPTkUgd2FzIG1lYXN1cmVkIGFuZCByZWplY3RlZDogaXQgbGVhdmVzIGBvYmplY3RzYCBhdFxuICogNjUuN0tCLCAzLjlLQiB1bmRlciB0aGUgYWR2aXNvcnkgYmFuZCwgd2hpY2ggYG9iamVjdHNgIGdyb3d0aCBjcm9zc2VzIGluXG4gKiBhYm91dCBuaW5lIGRheXMuIFRoZSBmYW1pbHkgYXhpcyBwdXRzIHRoZSBsYXJnZXN0IHBhcnQgYXQgMjQuMiUgb2YgdGhlIGNhcC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgQSBuZXcgb2JqZWN0IHRyYW5zbGF0aW9uIGJlbG9uZ3MgaW4gdGhlIGZpbGUgZm9yIElUUyBmYW1pbHkuIERvIG5vdCBhZGRcbiAqIGl0IHRvIHdoaWNoZXZlciBmaWxlIGlzIGFscmVhZHkgb3BlbiBcdTIwMTQgdGhhdCBpcyBob3cgb25lIGZpbGUgcmUtZ3Jvd3MgcGFzdFxuICogdGhlIGJhbmQsIHdoaWNoIGlzIHdoYXQgc3BsaXQgdGhpcyBidW5kbGUgaW4gdGhlIGZpcnN0IHBsYWNlLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBBIHZhbHVlIHVzZWQgYnkgbW9yZSB0aGFuIG9uZSBmYW1pbHkgbGl2ZXMgaW4gYDxsb2NhbGU+L19zaGFyZWQudHNgLiBBXG4gKiB2YWx1ZSB1c2VkIGJ5IGV4YWN0bHkgb25lIGZhbWlseSBsaXZlcyBpbiB0aGF0IGZhbWlseSdzIGZpbGUuXG4gKlxuICogXHUyNkEwXHVGRTBGIFRoZSBrZXkgb3JkZXIgYmVsb3cgaXMgTE9BRC1CRUFSSU5HLCBub3QgY29zbWV0aWMuIGBvYmplY3RzdGFjayBidWlsZGBcbiAqIHNlcmlhbGlzZXMgdGhpcyBvYmplY3QgaW50byBgZGlzdC9vYmplY3RzdGFjay5qc29uYCBpbiBpbnNlcnRpb24gb3JkZXIgYW5kXG4gKiBuZXZlciBzb3J0cyBpdCwgc28gbGlzdGluZyB0aGUgcm93cyBoZXJlIFx1MjAxNCByYXRoZXIgdGhhbiBzcHJlYWRpbmcgdGhlIGZhbWlseVxuICogZmlsZXMgXHUyMDE0IGlzIHdoYXQga2VlcHMgdGhlIGJ1aWx0IGFydGlmYWN0IGJ5dGUtaWRlbnRpY2FsIGFjcm9zcyB0aGUgc3BsaXQuXG4gKiBUaGUgb3JkZXIgaXMgdGhpcyBidW5kbGUncyBvd24gaGlzdG9yaWNhbCBhY2NyZXRpb24gb3JkZXIgYW5kIGRpZmZlcnNcbiAqIGJldHdlZW4gbG9jYWxlczsgcmVvcmRlcmluZyBpdCByZXdyaXRlcyB0aGUgYXJ0aWZhY3QuXG4gKi9cbmV4cG9ydCBjb25zdCBlc0VTOiBUcmFuc2xhdGlvbkRhdGEgPSB7XG4gIG9iamVjdHM6IHtcbiAgICBjcm1fYWNjb3VudDogY3VzdG9tZXIuY3JtX2FjY291bnQsXG4gICAgY3JtX2NvbnRhY3Q6IGN1c3RvbWVyLmNybV9jb250YWN0LFxuICAgIGNybV9rbm93bGVkZ2VfYXJ0aWNsZTogc2VydmljZS5jcm1fa25vd2xlZGdlX2FydGljbGUsXG4gICAgY3JtX2ZvcmVjYXN0OiBwaXBlbGluZS5jcm1fZm9yZWNhc3QsXG4gICAgY3JtX2xlYWQ6IHBpcGVsaW5lLmNybV9sZWFkLFxuICAgIGNybV9vcHBvcnR1bml0eTogcGlwZWxpbmUuY3JtX29wcG9ydHVuaXR5LFxuICAgIGNybV9jYXNlOiBzZXJ2aWNlLmNybV9jYXNlLFxuICAgIGNybV9jb250cmFjdDogY29tbWVyY2UuY3JtX2NvbnRyYWN0LFxuICAgIGNybV9wcm9kdWN0OiBjb21tZXJjZS5jcm1fcHJvZHVjdCxcbiAgICBjcm1fcXVvdGU6IGNvbW1lcmNlLmNybV9xdW90ZSxcbiAgICBjcm1fdGFzazogYWN0aXZpdHkuY3JtX3Rhc2ssXG4gICAgY3JtX2NhbXBhaWduOiBtYXJrZXRpbmcuY3JtX2NhbXBhaWduLFxuICAgIGNybV9ldmVudDogYWN0aXZpdHkuY3JtX2V2ZW50LFxuICAgIGNybV9ldmVudF9hdHRlbmRlZTogYWN0aXZpdHkuY3JtX2V2ZW50X2F0dGVuZGVlLFxuICAgIGNybV9hcnRpY2xlX2ZlZWRiYWNrOiBzZXJ2aWNlLmNybV9hcnRpY2xlX2ZlZWRiYWNrLFxuICAgIGNybV9jYW1wYWlnbl9tZW1iZXI6IG1hcmtldGluZy5jcm1fY2FtcGFpZ25fbWVtYmVyLFxuICAgIGNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW06IHBpcGVsaW5lLmNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW0sXG4gICAgY3JtX3F1b3RlX2xpbmVfaXRlbTogY29tbWVyY2UuY3JtX3F1b3RlX2xpbmVfaXRlbSxcbiAgfSxcbiAgLi4uYXBwU3VyZmFjZSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvY3JtLnRyYW5zbGF0aW9uLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3RyYW5zbGF0aW9uc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvY3JtLnRyYW5zbGF0aW9uLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IFRyYW5zbGF0aW9uQnVuZGxlIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvc3lzdGVtJztcbmltcG9ydCB7IGVuIH0gZnJvbSAnLi9lbic7XG5pbXBvcnQgeyB6aENOIH0gZnJvbSAnLi96aC1DTic7XG5pbXBvcnQgeyBqYUpQIH0gZnJvbSAnLi9qYS1KUCc7XG5pbXBvcnQgeyBlc0VTIH0gZnJvbSAnLi9lcy1FUyc7XG5cbi8qKlxuICogQ1JNIEFwcCBcdTIwMTQgSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pXG4gKlxuICogRGVtb25zdHJhdGVzICoqcGVyLWxvY2FsZSBmaWxlIHNwbGl0dGluZyoqIGNvbnZlbnRpb246XG4gKiBlYWNoIGxhbmd1YWdlIGlzIGRlZmluZWQgaW4gaXRzIG93biBmaWxlIChgZW4udHNgLCBgemgtQ04udHNgLCBgamEtSlAudHNgLCBgZXMtRVMudHNgKVxuICogYW5kIGFzc2VtYmxlZCBpbnRvIGEgc2luZ2xlIGBUcmFuc2xhdGlvbkJ1bmRsZWAgaGVyZS5cbiAqXG4gKiBFbnRlcnByaXNlLWdyYWRlIG11bHRpLWxhbmd1YWdlIHRyYW5zbGF0aW9ucyBjb3ZlcmluZzpcbiAqIC0gQ29yZSBDUk0gb2JqZWN0czogQWNjb3VudCwgQ29udGFjdCwgTGVhZCwgT3Bwb3J0dW5pdHlcbiAqIC0gU2VsZWN0LWZpZWxkIG9wdGlvbiBsYWJlbHMgZm9yIGVhY2ggb2JqZWN0XG4gKiAtIEFwcCAmIG5hdmlnYXRpb24gZ3JvdXAgbGFiZWxzXG4gKiAtIENvbW1vbiBVSSBtZXNzYWdlcywgdmFsaWRhdGlvbiBtZXNzYWdlc1xuICpcbiAqIFN1cHBvcnRlZCBsb2NhbGVzOiBlbiwgemgtQ04sIGphLUpQLCBlcy1FU1xuICovXG5leHBvcnQgY29uc3QgQ3JtVHJhbnNsYXRpb25zOiBUcmFuc2xhdGlvbkJ1bmRsZSA9IHtcbiAgZW4sXG4gICd6aC1DTic6IHpoQ04sXG4gICdqYS1KUCc6IGphSlAsXG4gICdlcy1FUyc6IGVzRVMsXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3MvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3MvaW5kZXgudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogU2FsZXMgKHRoZSBhcHAgcGFja2FnZSkgdmlld3MgYmFycmVsLlxuICpcbiAqIFRoZSBkb2N0cmluZSBmb3IgdGhpcyBtZXRhZGF0YSB0eXBlIGlzIHdyaXR0ZW4gb25jZSwgaW5cbiAqIGBzcmMvc2FsZXMvdmlld3MvaW5kZXgudHNgOyB0aGlzIGZpbGUgaXMgdGhlIHNhbGVzIHBhY2thZ2UncyBoYWxmIG9mXG4gKiB0aGUgc2FtZSBmaWxlLWJ5LWZpbGUgcmVnaXN0cmF0aW9uLlxuICovXG5cbmV4cG9ydCB7IExlYWRWaWV3cyB9IGZyb20gJy4vbGVhZC52aWV3JztcbmV4cG9ydCB7IEFjY291bnRWaWV3cyB9IGZyb20gJy4vYWNjb3VudC52aWV3JztcbmV4cG9ydCB7IENvbnRhY3RWaWV3cyB9IGZyb20gJy4vY29udGFjdC52aWV3JztcbmV4cG9ydCB7IE9wcG9ydHVuaXR5Vmlld3MgfSBmcm9tICcuL29wcG9ydHVuaXR5LnZpZXcnO1xuZXhwb3J0IHsgVGFza1ZpZXdzIH0gZnJvbSAnLi90YXNrLnZpZXcnO1xuZXhwb3J0IHsgRXZlbnRWaWV3cyB9IGZyb20gJy4vZXZlbnQudmlldyc7XG5leHBvcnQgeyBFdmVudEF0dGVuZGVlVmlld3MgfSBmcm9tICcuL2V2ZW50X2F0dGVuZGVlLnZpZXcnO1xuZXhwb3J0IHsgRm9yZWNhc3RWaWV3cyB9IGZyb20gJy4vZm9yZWNhc3Qudmlldyc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy92aWV3cy9sZWFkLnZpZXcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3MvbGVhZC52aWV3LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcbmltcG9ydCB7IERVUExJQ0FURV9PRl9UWVBFX0FVVEhPUkFCTEVfT1BUSU9OUyB9IGZyb20gJy4uL29iamVjdHMvX3BpY2tsaXN0cyc7XG5cbi8qKlxuICogXHUyNTUwXHUyNTUwXHUyNTUwIEhPVVNFIFJVTEU6IGZvcm0gcHJlZGljYXRlcyBhcmUgYHJlY29yZC5gLWJvdW5kIEFORCBUT1RBTCBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcbiAqXG4gKiBFdmVyeSBgdmlzaWJsZU9uYCAvIGB2aXNpYmxlV2hlbmAgYmVsb3cgaXMgYSBDRUwgcHJlZGljYXRlIHRoZSAqcmVuZGVyZXIqXG4gKiBldmFsdWF0ZXMsIGFuZCBpdCBtdXN0IHNhdGlzZnkgdHdvIHByb3BlcnRpZXMuIGB0ZXN0L3ZpZXctcHJlZGljYXRlLWRpYWxlY3QudGVzdC50c2BcbiAqIGVuZm9yY2VzIGJvdGggYWdhaW5zdCB0aGUgY29tcGlsZWQgc3RhY2ssIHNvIHlvdSBkbyBub3QgaGF2ZSB0byByZW1lbWJlciB0aGVtLlxuICpcbiAqIDEuICoqYHJlY29yZC5gLWJvdW5kLioqIFRoZSBldmFsdWF0aW9uIGNvbnRleHQgYmluZHMgZmllbGQgdmFsdWVzIHVuZGVyIHRoZVxuICogICAgYHJlY29yZGAgbmFtZXNwYWNlIChgYnVpbGRTY29wZWAgaW4gYEBvYmplY3RzdGFjay9mb3JtdWxhYCBiaW5kcyBleGFjdGx5XG4gKiAgICBgcmVjb3JkYCAvIGBwcmV2aW91c2AgLyBgaW5wdXRgIC8gYHVzZXJgIC8gYGN1cnJlbnRfdXNlcmAgLyBgY3R4YCAvIGBvc2ApLlxuICogICAgQSBiYXJlIGZpZWxkIG5hbWUgaXMgYW4gdW5ib3VuZCBpZGVudGlmaWVyLCBzbyBpdCBuZXZlciBldmFsdWF0ZXM6XG4gKlxuICogICAgICAgIGV2YWx1YXRlKCdzdGF0dXMgPT0gXCJ1bnF1YWxpZmllZFwiJywgICAgICAgIHsgcmVjb3JkOiB7IHN0YXR1czogJ25ldycgfSB9KVxuICogICAgICAgICAgXHUyMTkyIG9rOmZhbHNlICB0eXBlICBcIlVua25vd24gdmFyaWFibGU6IHN0YXR1c1wiICAgICAgIFx1MjE5MCBmb3IgRVZFUlkgcmVjb3JkXG4gKiAgICAgICAgZXZhbHVhdGUoJ3JlY29yZC5zdGF0dXMgPT0gXCJ1bnF1YWxpZmllZFwiJywgeyByZWNvcmQ6IHsgc3RhdHVzOiAnbmV3JyB9IH0pXG4gKiAgICAgICAgICBcdTIxOTIgb2s6dHJ1ZSAgIGZhbHNlXG4gKlxuICogMi4gKipUT1RBTCoqIFx1MjAxNCB0aGUgc2FtZSBgaGFzKHJlY29yZC54KWAgcnVsZSBBR0VOVFMubWQgc3RhdGVzIGZvclxuICogICAgYHZhbGlkYXRpb25zW10uY29uZGl0aW9uYCAvIGByZXF1aXJlZFdoZW5gIC8gYHJlYWRvbmx5V2hlbmAgLyBgdmlzaWJsZVdoZW5gXG4gKiAgICAoIzYzMCkuIFByZWZpeGluZyBhbG9uZSBpcyBub3QgZW5vdWdoOiBvbiBhICpicmFuZC1uZXcqIHJlY29yZCB0aGUga2V5IGlzXG4gKiAgICBhYnNlbnQsIGFuZCBzdHJpY3QgQ0VMIGFib3J0cyBvbiB0aGUgcmVhZDpcbiAqXG4gKiAgICAgICAgZXZhbHVhdGUoJ3JlY29yZC5kdXBsaWNhdGVfb2ZfdHlwZSA9PSBcImNybV9sZWFkXCInLCAgICAgICAgICAgICAgICB7IHJlY29yZDoge30gfSlcbiAqICAgICAgICAgIFx1MjE5MiBvazpmYWxzZSAgXCJObyBzdWNoIGtleTogZHVwbGljYXRlX29mX3R5cGVcIlxuICogICAgICAgIGV2YWx1YXRlKCdoYXMocmVjb3JkLmR1cGxpY2F0ZV9vZl90eXBlKSAmJiByZWNvcmQuZHVwbGljYXRlX29mX3R5cGUgPT0gXCJjcm1fbGVhZFwiJyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlY29yZDoge30gfSlcbiAqICAgICAgICAgIFx1MjE5MiBvazp0cnVlICAgZmFsc2VcbiAqXG4gKiBXaHkgYm90aCBtYXR0ZXIgaGVyZSBhbmQgbm90IG9ubHkgaW4gdGhlb3J5ICgjNjg4KTogdGhlIGNvbnNvbGUncyBwcmVkaWNhdGVcbiAqIGV2YWx1YXRpb24gKipmYWlscyBPUEVOKiogXHUyMDE0IGFuIHVuZXZhbHVhYmxlIGB2aXNpYmxlV2hlbmAgZGVmYXVsdHMgdGhlIGZpZWxkIHRvXG4gKiAqdmlzaWJsZSosIHdpdGggbm8gZGlhZ25vc3RpYyBcdTIwMTQgYW5kIGEgdmlzaWJsZSBmaWVsZCBjYXJyaWVzIGl0cyBgcmVxdWlyZWQ6IHRydWVgXG4gKiBpbnRvIGNsaWVudC1zaWRlIHN1Ym1pdCB2YWxpZGF0aW9uLiBTbyBhIHByZWRpY2F0ZSB0aGF0IGNhbm5vdCBhbnN3ZXIgZG9lcyBub3RcbiAqIGRlZ3JhZGUgdG8gXCJzaG93biBidXQgb3B0aW9uYWxcIjsgaXQgbWFrZXMgdGhlIGZvcm0gdW5zYXRpc2ZpYWJsZS4gT24gYGNybV9sZWFkYFxuICogdGhpcyByZW5kZXJlZCBhbGwgZml2ZSBjb25kaXRpb25hbCBkaXNxdWFsaWZpY2F0aW9uIGZpZWxkcyBhdCBvbmNlIGFuZCBkZW1hbmRlZFxuICogYSBuZXcgbGVhZCBiZSBhIGR1cGxpY2F0ZSBvZiAqYm90aCogYSBsZWFkIGFuZCBhIGNvbnRhY3QgXHUyMDE0IG11dHVhbGx5IGV4Y2x1c2l2ZSBieVxuICogZGVzaWduIFx1MjAxNCBzbyBubyBsZWFkIGNvdWxkIGJlIGNyZWF0ZWQgdGhyb3VnaCB0aGUgVUkgYXQgYWxsLiBUaGUgZmFpbC1vcGVuIGhhbGZcbiAqIGlzIHRyYWNrZWQgdXBzdHJlYW0gYXQgb2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjNTE0OTsgdGhlc2UgcHJlZGljYXRlcyBhcmUgdGhlXG4gKiBoYWxmIHRoaXMgcmVwbyBvd25zLCBhbmQgdGhleSBtdXN0IGJlIGFibGUgdG8gYW5zd2VyLlxuICpcbiAqIE51bWVyaWMgY29tcGFyaXNvbnMgY2FycnkgYCE9IG51bGxgIG9uIHRvcCBvZiBgaGFzKC4uLilgLCBtYXRjaGluZyB0aGUgb2JqZWN0XG4gKiBmaWxlczogYGhhcyhyZWNvcmQucmF0aW5nKSAmJiByZWNvcmQucmF0aW5nICE9IG51bGwgJiYgcmVjb3JkLnJhdGluZyA+PSA0YC5cbiAqIFN0cmljdCBDRUwgYWJvcnRzIG9uIGBkeW48bnVsbD4gPCBpbnRgLCB3aGljaCBgaGFzKClgIGFsb25lIGRvZXMgbm90IHByZXZlbnQuXG4gKi9cblxuLyoqXG4gKiBUaGUgZHVwbGljYXRlLWxpbmsgYmxvY2sgKCM1OTgpLCBzcHJlYWQgaW50byBldmVyeSBmb3JtIHRoYXQgb2ZmZXJzXG4gKiBgZGlzcXVhbGlmaWNhdGlvbl9yZWFzb25gLlxuICpcbiAqIGBkdXBsaWNhdGVfZGlzcXVhbGlmaWNhdGlvbl9yZXF1aXJlc19zdXJ2aXZvcmAgb24gYGNybV9sZWFkYCByZWplY3RzIGEgbGVhZFxuICogY2xvc2VkIGFzIFwiRHVwbGljYXRlXCIgdGhhdCBkb2VzIG5vdCBuYW1lIHRoZSByZWNvcmQgaXQgZHVwbGljYXRlcyBhbmQgY29uZmlybVxuICogdGhlIG1hdGNoLiBTbyB0aGUgc2FtZSBydWxlIHRoZSBgZGlzcXVhbGlmaWNhdGlvbl9yZWFzb25gIGZpZWxkIGl0c2VsZiBmb2xsb3dzXG4gKiBhcHBsaWVzIG9uZSBsZXZlbCBkb3duOiBhIGZvcm0gdGhhdCBsZXRzIGEgdXNlciBQSUNLIFwiRHVwbGljYXRlXCIgbXVzdCBhbHNvIGxldFxuICogdGhlbSBzYXRpc2Z5IGl0LCBvciB0aGUgc2F2ZSBmYWlscyB3aXRoIGFuIGVycm9yIHRoZSBmb3JtIGdpdmVzIG5vIHdheSB0b1xuICogY2xlYXIuIERlY2xhcmVkIG9uY2UgYW5kIHJldXNlZCByYXRoZXIgdGhhbiByZXR5cGVkIGVpZ2h0IHRpbWVzIFx1MjAxNCB0aGUgY29waWVzXG4gKiB3b3VsZCBkcmlmdCwgYW5kIGEgZm9ybSB0aGF0IHF1aWV0bHkgbG9zdCB0aGUgYmxvY2sgaXMgZXhhY3RseSB0aGUgZmFpbHVyZVxuICogdGhpcyBzaGFwZSBpcyBtZWFudCB0byBtYWtlIGltcG9zc2libGUuXG4gKlxuICogVGhlIHR3byBsb29rdXBzIG1pcnJvciB0aGUgb2JqZWN0J3MgYHJlcXVpcmVkV2hlbmAgcHJlZGljYXRlczogZWFjaCBhcHBlYXJzXG4gKiBvbmx5IHdoZW4gYGR1cGxpY2F0ZV9vZl90eXBlYCBuYW1lcyBpdHMgb2JqZWN0IFx1MjAxNCBhbmQgbm93IHNheXMgc28gaW4gdGhlIHNhbWVcbiAqIHdvcmRzLCBjaGFyYWN0ZXIgZm9yIGNoYXJhY3RlciBhcyB0aGUgYHJlcXVpcmVkV2hlbmAgb24gdGhvc2UgdHdvIGZpZWxkcyBpblxuICogYGxlYWQub2JqZWN0LnRzYCwgc28gdGhlIGZvcm0gc2hvd3MgYSBsb29rdXAgZXhhY3RseSB3aGVuIHRoZSBzZXJ2ZXIgd2lsbFxuICogZGVtYW5kIGl0LiBgdGVzdC92aWV3LXByZWRpY2F0ZS1kaWFsZWN0LnRlc3QudHNgIHBpbnMgdGhlIHR3byB0b2dldGhlci5cbiAqL1xuY29uc3QgRFVQTElDQVRFX0xJTktfRklFTERTID0gW1xuICB7XG4gICAgZmllbGQ6ICdkdXBsaWNhdGVfb2ZfdHlwZScsXG4gICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgLy8gVGhlIHBpY2tlciBvZmZlcnMgdGhlIEFVVEhPUkFCTEUgaGFsZiBvZiB0aGUgdm9jYWJ1bGFyeSBvbmx5ICgjMTE2NCkuXG4gICAgLy8gYGNybV9sZWFkLmR1cGxpY2F0ZV9vZl90eXBlYCBhbHNvIGFjY2VwdHMgYGVyYXNlZGAsIGEgdG9tYnN0b25lXG4gICAgLy8gYGxlYWRfZHVwbGljYXRlX2NoZWNrYCBzdGFtcHMgd2hlbiB0aGUgZW5naW5lJ3MgcmVmZXJlbmNlIGNsZWFudXAgbnVsbHNcbiAgICAvLyB0aGUgcG9pbnRlciBcdTIwMTQgXCJjb25maXJtZWQgZHVwbGljYXRlIG9mIGEgcmVjb3JkIHRoYXQgaGFzIHNpbmNlIGJlZW5cbiAgICAvLyBlcmFzZWRcIi4gTm9ib2R5IGF1dGhvcnMgdGhhdDogaXQgaXMgYW4gb2JzZXJ2YXRpb24gYWJvdXQgYSBkZWxldGlvbiB0aGF0XG4gICAgLy8gYWxyZWFkeSBoYXBwZW5lZCwgYW5kIG9mZmVyaW5nIGl0IHdvdWxkIGxldCBhIHJldmlld2VyIGNsb3NlIGEgbGVhZCBhcyBhXG4gICAgLy8gZHVwbGljYXRlIG9mIG5vdGhpbmcgd2hpbGUgc2F0aXNmeWluZyBldmVyeSBydWxlIHRoYXQgZXhpc3RzIHRvIHN0b3BcbiAgICAvLyBleGFjdGx5IHRoYXQuIE5hcnJvd2luZyBoZXJlIHJhdGhlciB0aGFuIGRlbGV0aW5nIHRoZSB2YWx1ZSBpcyB0aGUgcG9pbnRcbiAgICAvLyBcdTIwMTQgdGhlIHJlY29yZCBjYW4gc3RpbGwgU0FZIGl0LCBhbmQgdGhlIGZpZWxkIGtlZXBzIGl0cyBsYWJlbCBpbiBhbGwgZm91clxuICAgIC8vIGxvY2FsZXMsIHNvIGEgdG9tYnN0b25lZCBsZWFkIHJlYWRzIGFzIFwiRXJhc2VkIFJlY29yZFwiIG9uIHRoZSBkZXRhaWwgcGFnZVxuICAgIC8vIGluc3RlYWQgb2YgYXMgYSByYXcgZW51bSBub2JvZHkgY2FuIGV4cGxhaW4uXG4gICAgLy9cbiAgICAvLyBTcHJlYWQgZnJvbSBgX3BpY2tsaXN0cy50c2AgcmF0aGVyIHRoYW4gcmV0eXBlZDogdGhlIGF1dGhvcmFibGUgc2V0IGlzXG4gICAgLy8gdGhlIHNvdXJjZSBib3RoIGxpc3RzIGRlcml2ZSBmcm9tLCBzbyBhIGZ1dHVyZSBvYmplY3QgdHlwZSBhZGRlZCB0aGVyZVxuICAgIC8vIHJlYWNoZXMgdGhpcyBwaWNrZXIgYXV0b21hdGljYWxseSBhbmQgdGhlIHRvbWJzdG9uZSBuZXZlciBjYW4uXG4gICAgb3B0aW9uczogWy4uLkRVUExJQ0FURV9PRl9UWVBFX0FVVEhPUkFCTEVfT1BUSU9OU10sXG4gICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24pICYmIHJlY29yZC5kaXNxdWFsaWZpY2F0aW9uX3JlYXNvbiA9PSBcImR1cGxpY2F0ZVwiYCxcbiAgfSxcbiAge1xuICAgIGZpZWxkOiAnZHVwbGljYXRlX29mX2xlYWQnLFxuICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIHZpc2libGVPbjogUGBoYXMocmVjb3JkLmR1cGxpY2F0ZV9vZl90eXBlKSAmJiByZWNvcmQuZHVwbGljYXRlX29mX3R5cGUgPT0gXCJjcm1fbGVhZFwiYCxcbiAgfSxcbiAge1xuICAgIGZpZWxkOiAnZHVwbGljYXRlX29mX2NvbnRhY3QnLFxuICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIHZpc2libGVPbjogUGBoYXMocmVjb3JkLmR1cGxpY2F0ZV9vZl90eXBlKSAmJiByZWNvcmQuZHVwbGljYXRlX29mX3R5cGUgPT0gXCJjcm1fY29udGFjdFwiYCxcbiAgfSxcbiAge1xuICAgIGZpZWxkOiAnZHVwbGljYXRlX3N0YXR1cycsXG4gICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24pICYmIHJlY29yZC5kaXNxdWFsaWZpY2F0aW9uX3JlYXNvbiA9PSBcImR1cGxpY2F0ZVwiYCxcbiAgICBoZWxwVGV4dDogJ0NvbmZpcm1lZCBtZWFucyBhIGh1bWFuIGNoZWNrZWQgdGhlIHR3byByZWNvcmRzIGFuZCB0aGV5IGFyZSB0aGUgc2FtZSBwZXJzb24uJyxcbiAgfSxcbl07XG5cbi8qKlxuICogTGVhZCBWaWV3cyAtIENvbXByZWhlbnNpdmUgVUkgU2hvd2Nhc2VcbiAqIFxuICogVGhpcyBmaWxlIGRlbW9uc3RyYXRlczpcbiAqIDEuIEFsbCA2IEZvcm1WaWV3IGxheW91dCB0eXBlcyAoc2ltcGxlLCB0YWJiZWQsIHdpemFyZCwgc3BsaXQsIGRyYXdlciwgbW9kYWwpXG4gKiAyLiBTZWN0aW9uIGZlYXR1cmVzIChjb2xsYXBzaWJsZSwgMS00IGNvbHVtbiBsYXlvdXRzKVxuICogMy4gRmllbGQtbGV2ZWwgY29udHJvbHMgKHJlYWRvbmx5LCByZXF1aXJlZCwgaGlkZGVuLCBzcGFuLCB2aXNpYmxlT24sIGRlcGVuZHNPbiwgY3VzdG9tIHdpZGdldClcbiAqIDQuIE11bHRpcGxlIG5hbWVkIGZvcm1WaWV3cyBmb3IgZGlmZmVyZW50IHNjZW5hcmlvc1xuICogNS4gVmFyaW91cyBsaXN0IHZpZXcgdHlwZXNcbiAqL1xuZXhwb3J0IGNvbnN0IExlYWRWaWV3cyA9IGRlZmluZVZpZXcoe1xuICAvKipcbiAgICogRGVmYXVsdCBMaXN0IFZpZXcgLSBHcmlkIHdpdGggQWR2YW5jZWQgRmVhdHVyZXNcbiAgICovXG4gIGxpc3Q6IHtcbiAgICB0eXBlOiAnZ3JpZCcsXG4gICAgbmFtZTogJ2FsbF9sZWFkcycsXG4gICAgbGFiZWw6ICdBbGwgTGVhZHMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7XG4gICAgICBwcm92aWRlcjogJ29iamVjdCcsXG4gICAgICBvYmplY3Q6ICdjcm1fbGVhZCcsXG4gICAgfSxcbiAgICBcbiAgICAvLyBDb2x1bW4gQ29uZmlndXJhdGlvbiB3aXRoIEVuaGFuY2VkIEZlYXR1cmVzXG4gICAgY29sdW1uczogW1xuICAgICAge1xuICAgICAgICAvLyBPbmUgbmFtZSBjb2x1bW4sIG5vdCB0d28uIFNwbGl0dGluZyBmaXJzdC9sYXN0IHNwZW50IDMwMHB4IHRvIHNheVxuICAgICAgICAvLyB3aGF0IFwiQWxpY2UgTWFydGluZXpcIiBzYXlzIGluIG9uZSwgYW5kIGh1bmcgdGhlIHJlY29yZCBsaW5rIG9mZiB0aGVcbiAgICAgICAgLy8gZ2l2ZW4gbmFtZSBhbG9uZSBcdTIwMTQgc28gb3BlbmluZyBhIHBlcnNvbiBtZWFudCBhaW1pbmcgYXQgdGhlaXIgZmlyc3RcbiAgICAgICAgLy8gbmFtZSBzcGVjaWZpY2FsbHkuXG4gICAgICAgIGZpZWxkOiAnZnVsbF9uYW1lJyxcbiAgICAgICAgbGFiZWw6ICdOYW1lJyxcbiAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICAgIGxpbms6IHRydWUsIC8vIFByaW1hcnkgbmF2aWdhdGlvbiBsaW5rXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBmaWVsZDogJ2NvbXBhbnknLFxuICAgICAgICBsYWJlbDogJ0NvbXBhbnknLFxuICAgICAgICB3aWR0aDogMjAwLFxuICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZpZWxkOiAnZW1haWwnLFxuICAgICAgICBsYWJlbDogJ0VtYWlsJyxcbiAgICAgICAgd2lkdGg6IDIwMCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZpZWxkOiAnc3RhdHVzJyxcbiAgICAgICAgbGFiZWw6ICdTdGF0dXMnLFxuICAgICAgICB3aWR0aDogMTIwLFxuICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZpZWxkOiAncmF0aW5nJyxcbiAgICAgICAgbGFiZWw6ICdTY29yZScsXG4gICAgICAgIHdpZHRoOiAxMDAsXG4gICAgICAgIGFsaWduOiAnY2VudGVyJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZpZWxkOiAnbGVhZF9zb3VyY2UnLFxuICAgICAgICBsYWJlbDogJ1NvdXJjZScsXG4gICAgICAgIHdpZHRoOiAxMjAsXG4gICAgICB9LFxuICAgICAgLy8gUkVRLTAwMDUgYWNjZXB0YW5jZSAxOiB3aGF0IHRoZSBwcm9zcGVjdCB3YW50cyBhbmQgd2hhdCBpdCBpcyB3b3J0aCxcbiAgICAgIC8vIG9uIHRoZSByb3N0ZXIgYSByZXAgb3BlbnMgZXZlcnkgbW9ybmluZy4gQ29sdW1ucyBhcmUgYWxzbyB3aGF0IHRoZVxuICAgICAgLy8gbGlzdCdzIG93biBmaWx0ZXIgYW5kIGdyb3VwaW5nIGNvbnRyb2xzIG9mZmVyLCB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZVxuICAgICAgLy8gdHdvIEZJTFRFUkFCTEUgYW5kIEdST1VQQUJMRSBoZXJlIHJhdGhlciB0aGFuIG9ubHkgcmVhZGFibGUgXHUyMDE0IHRoZSBzYW1lXG4gICAgICAvLyByZWFkaW5nIGBjb250YWN0LnZpZXcudHNgIHJlY29yZHMgZm9yIHRoZSBidXlpbmctY2VudHJlIGNvbHVtbnMuXG4gICAgICAvLyBgbmVlZF90eXBlYCBpcyBzaW5nbGUtdmFsdWVkIGZvciBleGFjdGx5IHRoYXQgcmVhc29uIChzZWVcbiAgICAgIC8vIGBfcGlja2xpc3RzLnRzYCk6IGEgZ3JvdXBlZCBsaXN0IGFuc3dlcnMgd2l0aCBvbmUgYWdncmVnYXRlIHBlciByYXdcbiAgICAgIC8vIHN0b3JlZCB2YWx1ZSwgc28gYSBtdWx0aS12YWx1ZWQgY29sdW1uIHdvdWxkIGdyb3VwIGJ5IHRoZSBjb21iaW5hdGlvbi5cbiAgICAgIHtcbiAgICAgICAgZmllbGQ6ICduZWVkX3R5cGUnLFxuICAgICAgICBsYWJlbDogJ05lZWQgVHlwZScsXG4gICAgICAgIHdpZHRoOiAxNjAsXG4gICAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZmllbGQ6ICdlc3RpbWF0ZWRfYW1vdW50JyxcbiAgICAgICAgbGFiZWw6ICdFc3QuIEFtb3VudCcsXG4gICAgICAgIHdpZHRoOiAxMzAsXG4gICAgICAgIGFsaWduOiAncmlnaHQnLFxuICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGZpZWxkOiAnb3duZXJfaWQnLFxuICAgICAgICBsYWJlbDogJ093bmVyJyxcbiAgICAgICAgd2lkdGg6IDE1MCxcbiAgICAgIH0sXG4gICAgXSxcbiAgICBcbiAgICBzb3J0OiBbXG4gICAgICB7IGZpZWxkOiAnY3JlYXRlZF9hdCcsIG9yZGVyOiAnZGVzYycgfVxuICAgIF0sXG4gICAgXG4gICAgLy8gQSByb3cgY2xpY2sgb3BlbnMgdGhlIHJlY29yZCBwYWdlLiBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm9cbiAgICAvLyBgbmF2aWdhdGlvbi52aWV3YCBoZXJlOiBtZWFzdXJlZCBpbiB0aGUgYnJvd3NlciBvbiBjb25zb2xlIDE3LjMuMFxuICAgIC8vICgjMTcxNiksIHRoZSBrZXkgaXMgbm90IHJlc29sdmVkIGFzIGEgZm9ybS12aWV3IG5hbWUuIFRoZSBuYXZpZ2F0aW9uXG4gICAgLy8gaG9vayByZWFkcyBpdCBpbnRvIHRoZSBTRUNPTkQgYXJndW1lbnQgb2YgYG9uTmF2aWdhdGVgIFx1MjAxNCB0aGUgc2xvdCB0aGF0XG4gICAgLy8gb3RoZXJ3aXNlIGNhcnJpZXMgdGhlIGxpdGVyYWwgbW9kZSBzdHJpbmcsIGByKHQsIGQgPz8gJ3ZpZXcnKWAgXHUyMDE0IHNvIGl0XG4gICAgLy8gbmFtZWQgbm90aGluZyBhbmQgc2VsZWN0ZWQgbm90aGluZy4gVGhlIHJlY29yZCBwYWdlIGhlcmUgaXMgcmVuZGVyZWQgYnlcbiAgICAvLyBgbGVhZF9kZXRhaWxfcGFnZWAgKGBzcmMvc2FsZXMvcGFnZXMvbGVhZF9kZXRhaWwucGFnZS50c2ApLCBub3QgYnkgYSBuYW1lZFxuICAgIC8vIGZvcm0gdmlldywgYW5kIGNsaWNraW5nIGEgcm93IGJlaGF2ZWQgaWRlbnRpY2FsbHkgd2l0aCB0aGUga2V5IHByZXNlbnQsXG4gICAgLy8gd2l0aCBpdCBhYnNlbnQsIGFuZCBvbiBhIGxpc3QgdGhhdCBuZXZlciBkZWNsYXJlZCBpdC4gYGRldGFpbF9mb3JtYFxuICAgIC8vIGJlbG93IHN0YXlzOiBpdCBpcyB0aGlzIGZpbGUncyBvbmUgVEFCQkVEIGxheW91dCBleGFtcGxlLCBhbmQgaXQgd2FzXG4gICAgLy8gYWxyZWFkeSByZWFjaGFibGUgYnkgbm8gcGF0aC5cbiAgICBuYXZpZ2F0aW9uOiB7XG4gICAgICBtb2RlOiAncGFnZScsXG4gICAgfSxcbiAgICBcbiAgICAvLyBgY29udmVydF9sZWFkYCAvIGBzY2hlZHVsZV9mb2xsb3d1cGAgZGVjbGFyZSBgbG9jYXRpb25zOiBbJ2xpc3RfaXRlbSddYFxuICAgIC8vIGFuZCBhcmUgYXV0by1pbmplY3RlZCBpbnRvIHRoZSBtZW51LiBEbyBub3QgYWRkIHN0cmluZ3MgaGVyZTogdGhlIGxlZ2FjeVxuICAgIC8vIHJvd0FjdGlvbnMgc3VyZmFjZSBvbmx5IGRpc3BhdGNoZXMgZGVmaW5lZCBzdGFjayBhY3Rpb25zLlxuICAgIC8vIEJ1aWx0LWluIGBleHBvcnRPcHRpb25zYCBjb3ZlcnMgQ1NWIGV4cG9ydDsgbm8gZXhwb3J0IGFjdGlvbiBuZWVkZWQuXG4gICAgYnVsa0FjdGlvbnM6IFsnY3JlYXRlX2NhbXBhaWduJ10sXG4gICAgXG4gICAgLy8gRmVhdHVyZXNcbiAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiAyNSwgcGFnZVNpemVPcHRpb25zOiBbMTAsIDI1LCA1MCwgMTAwXSB9LFxuICAgIHJvd0hlaWdodDogJ21lZGl1bScsXG4gICAgZXhwb3J0T3B0aW9uczogeyBmb3JtYXRzOiBbJ2NzdicsICd4bHN4J10gfSxcbiAgICBcbiAgICAvLyBFbXB0eSBTdGF0ZVxuICAgIGVtcHR5U3RhdGU6IHtcbiAgICAgIHRpdGxlOiAnTm8gTGVhZHMgWWV0JyxcbiAgICAgIG1lc3NhZ2U6ICdHZXQgc3RhcnRlZCBieSBjcmVhdGluZyB5b3VyIGZpcnN0IGxlYWQnLFxuICAgICAgaWNvbjogJ3VzZXItcGx1cycsXG4gICAgfSxcbiAgfSxcbiAgXG4gIC8qKlxuICAgKiBEZWZhdWx0IEZvcm0gVmlldyAtIFNJTVBMRSBMYXlvdXRcbiAgICogQmFzaWMgc2VjdGlvbmVkIGZvcm0gd2l0aCBjb2xsYXBzaWJsZSBzZWN0aW9ucyBhbmQgY29sdW1uIGxheW91dHNcbiAgICovXG4gIGZvcm06IHtcbiAgICB0eXBlOiAnc2ltcGxlJyxcbiAgICBcbiAgICBzZWN0aW9uczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnY29udGFjdF9pbmZvcm1hdGlvbicsXG4gICAgICAgIGxhYmVsOiAnQ29udGFjdCBJbmZvcm1hdGlvbicsXG4gICAgICAgIGNvbGxhcHNpYmxlOiB0cnVlLFxuICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgICAgICBjb2x1bW5zOiAyLCAvLyAyLWNvbHVtbiBsYXlvdXRcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmllbGQ6ICdzYWx1dGF0aW9uJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnZmlyc3RfbmFtZScsXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnbGFzdF9uYW1lJyxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgc3BhbjogJ2Z1bGwnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2NvbXBhbnknLFxuICAgICAgICAgICd0aXRsZScsXG4gICAgICAgICAgJ2VtYWlsJyxcbiAgICAgICAgICAncGhvbmUnLFxuICAgICAgICAgICdtb2JpbGUnLFxuICAgICAgICAgICd3ZWJzaXRlJyxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdsZWFkX2NsYXNzaWZpY2F0aW9uJyxcbiAgICAgICAgbGFiZWw6ICdMZWFkIENsYXNzaWZpY2F0aW9uJyxcbiAgICAgICAgY29sbGFwc2libGU6IHRydWUsXG4gICAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgICAgIGNvbHVtbnM6IDMsIC8vIDMtY29sdW1uIGxheW91dFxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmaWVsZDogJ3N0YXR1cycsXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAncmF0aW5nJyxcbiAgICAgICAgICAgIHdpZGdldDogJ3N0YXJfcmF0aW5nJywgLy8gQ3VzdG9tIHdpZGdldFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ2xlYWRfc291cmNlJyxcbiAgICAgICAgICAnaW5kdXN0cnknLFxuICAgICAgICAgIC8vIE9mZmVyZWQsIFx1MjZENCBub3QgYHJlcXVpcmVkYCAoIzIwOTcpOiBhbiBpbnNlcnQgdGhhdCBsZWF2ZXMgaXQgZW1wdHkgaXNcbiAgICAgICAgICAvLyBzdGFtcGVkIHRvIHRoZSBjcmVhdG9yIGJ5IHRoZSBwbGF0Zm9ybSAoc2VlIGBsZWFkLmhvb2sudHNgKSwgc28gYVxuICAgICAgICAgIC8vIHJlcCdzIG5ldyBsZWFkIGlzIHRoZWlycyB3aXRob3V0IGEgcGljaywgYW5kIGEgbWFuYWdlciBjYW4gc3RpbGxcbiAgICAgICAgICAvLyBjaG9vc2UgYW5vdGhlciBvd25lci4gYHJlcXVpcmVkYCBibG9ja2VkIHRoYXQgc2F2ZSBjbGllbnQtc2lkZS5cbiAgICAgICAgICAnb3duZXJfaWQnLFxuICAgICAgICAgIC8vIGBkaXNxdWFsaWZpY2F0aW9uX3JlYXNvbmAgaXMgZW5mb3JjZWQgYnkgdGhlXG4gICAgICAgICAgLy8gYGRpc3F1YWxpZmljYXRpb25fcmVhc29uX3JlcXVpcmVkYCB2YWxpZGF0aW9uIG9uIGNybV9sZWFkLCBzbyBldmVyeVxuICAgICAgICAgIC8vIGZvcm0gdGhhdCBsZXRzIGEgdXNlciBwaWNrIFwiVW5xdWFsaWZpZWRcIiBtdXN0IGFsc28gb2ZmZXIgdGhlIHJlYXNvblxuICAgICAgICAgIC8vIFx1MjAxNCBvdGhlcndpc2UgdGhlIHNhdmUgZmFpbHMgd2l0aCBhbiBlcnJvciB0aGUgZm9ybSBnaXZlcyB5b3Ugbm8gd2F5XG4gICAgICAgICAgLy8gdG8gY2xlYXIuIEhpZGRlbiB1bnRpbCBpdCBhcHBsaWVzLlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24nLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICB2aXNpYmxlT246IFBgaGFzKHJlY29yZC5zdGF0dXMpICYmIHJlY29yZC5zdGF0dXMgPT0gXCJ1bnF1YWxpZmllZFwiYCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC8vIFJFUS0wMDA1IHN0ZXAgNjogXHUzMDBDXHU1ODZCXHU1MTk5XHUyMDI2XHU5NzAwXHU2QzQyXHU3QzdCXHU1NzhCXHUyMDI2XHU5ODg0XHU4QkExXHU5MUQxXHU5ODlEXHUzMDBELiBBIHJlcCB0eXBlcyB0aGVzZSBhdFxuICAgICAgICAgIC8vIGludGFrZSwgc28gdGhleSBuZWVkIGFuIGF1dGhvcmluZyBzdXJmYWNlIFx1MjAxNCBhbmQgdGhpcyBmb3JtIElTIHRoZVxuICAgICAgICAgIC8vIGNyZWF0ZSBkaWFsb2cgKGBSZWNvcmRGb3JtUGFnZWAgYW5kIGB1c2VBY3Rpb25Nb2RhbGAgYm90aCByZXNvbHZlXG4gICAgICAgICAgLy8gYHZpZXcuZm9ybSA/PyB2aWV3LmZvcm1WaWV3cz8uZGVmYXVsdGAsIHNlZSBgY2FzZS52aWV3LnRzYCkuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBcdTI2QTBcdUZFMEYgTmFtZWQgcmF0aGVyIHRoYW4gcmVhY2hlZCB0aHJvdWdoIGEgZ3JvdXAgcmVmZXJlbmNlLCBhbmQgdGhlXG4gICAgICAgICAgLy8gQUdFTlRTLm1kIGxhZGRlcidzIHJ1bmcgMyBhc2tzIGZvciB0aGUgcmVhc29uIGluIHdyaXRpbmcuIEJvdGhcbiAgICAgICAgICAvLyBmaWVsZHMgZGVjbGFyZSBgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJ2Agb24gdGhlIG9iamVjdCwgc28gZXZlcnlcbiAgICAgICAgICAvLyBERVJJVkVEIHN1cmZhY2UgXHUyMDE0IHRoZSBwYWdlIHN5bnRoZXNpemVyLCBhbiBhdXRvLWRlcml2ZWQgZm9ybSBcdTIwMTRcbiAgICAgICAgICAvLyBhbHJlYWR5IGNhcnJpZXMgdGhlbSBmcm9tIGBmaWVsZEdyb3Vwc2AgYWxvbmUgd2l0aCBub3RoaW5nIGF1dGhvcmVkLlxuICAgICAgICAgIC8vIFRoaXMgZm9ybSBpcyBub3Qgb25lIG9mIHRob3NlOiBpdCBhdXRob3JzIGBzZWN0aW9uc2AsIGFuZCBhblxuICAgICAgICAgIC8vIGF1dGhvcmVkIGBzZWN0aW9uc2AgYXJyYXkgd2lucyBvdXRyaWdodCBvdmVyIHRoZSBhdXRvLWRlcml2ZWQgcGF0aC5cbiAgICAgICAgICAvLyBUaGUgcnVuZy0yIGZpeCwgYSBgeyBncm91cDogJ3F1YWxpZmljYXRpb24nIH1gIHNlY3Rpb24sIGNhbm5vdCBiZVxuICAgICAgICAgIC8vIHVzZWQgSEVSRSBzcGVjaWZpY2FsbHk6IHRoaXMgc2VjdGlvbiBpcyBhIENVUkFURUQgY3Jvc3MtZ3JvdXAgc2V0LFxuICAgICAgICAgIC8vIG5vdCBhIG1pcnJvciBvZiB0aGF0IGdyb3VwLiBJdCBhbHJlYWR5IG5hbWVzIGZvdXIgb2YgdGhlIGdyb3VwJ3NcbiAgICAgICAgICAvLyBtZW1iZXJzIHdpdGggcGVyLWZpZWxkIG92ZXJyaWRlcyBhIGdyb3VwIHJlZmVyZW5jZSBjYW5ub3QgY2FycnlcbiAgICAgICAgICAvLyAoYHN0YXR1c2AgcmVxdWlyZWQsIGByYXRpbmdgJ3Mgc3RhciB3aWRnZXQsIGFuZFxuICAgICAgICAgIC8vIGBkaXNxdWFsaWZpY2F0aW9uX3JlYXNvbmAncyBgcmVxdWlyZWRgICsgYHZpc2libGVPbmAgZGlyZWN0bHlcbiAgICAgICAgICAvLyBhYm92ZSksIGFuZCBpdCBib3Jyb3dzIGBpbmR1c3RyeWAgYW5kIGBvd25lcl9pZGAgZnJvbSB0d28gb3RoZXJcbiAgICAgICAgICAvLyBncm91cHMuIEFkZGluZyBhIGdyb3VwIHJlZmVyZW5jZSBiZXNpZGUgaXQgd291bGQgcmVuZGVyIHRob3NlIGZvdXJcbiAgICAgICAgICAvLyBhIHNlY29uZCB0aW1lIGFuZCBwdWxsIGluIGBuZXh0X2ZvbGxvd3VwX2RhdGVgIC9cbiAgICAgICAgICAvLyBgbGFzdF9jb250YWN0ZWRfZGF0ZWAsIHdoaWNoIGFyZSBtYWNoaW5lLXdyaXR0ZW4gYW5kIGRlbGliZXJhdGVseVxuICAgICAgICAgIC8vIGFic2VudCBmcm9tIGV2ZXJ5IGZvcm0uIFx1MjFEMiBUaGUgY3VzdG9tZXIgbmVlZCBpcyByZWFsLCB0aGUgZ3JvdXBcbiAgICAgICAgICAvLyByZWZlcmVuY2UgZ2VudWluZWx5IGNhbm5vdCBleHByZXNzIGl0LCBhbmQgdGhlIHR3byBsaW5lcyBiZWxvdyBhcmVcbiAgICAgICAgICAvLyB3aGF0IHRoYXQgbGVhdmVzLlxuICAgICAgICAgICduZWVkX3R5cGUnLFxuICAgICAgICAgICdlc3RpbWF0ZWRfYW1vdW50JyxcbiAgICAgICAgICAuLi5EVVBMSUNBVEVfTElOS19GSUVMRFMsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnY29tcGFueV9pbmZvcm1hdGlvbicsXG4gICAgICAgIGxhYmVsOiAnQ29tcGFueSBJbmZvcm1hdGlvbicsXG4gICAgICAgIGNvbGxhcHNpYmxlOiB0cnVlLFxuICAgICAgICBjb2xsYXBzZWQ6IHRydWUsIC8vIENvbGxhcHNlZCBieSBkZWZhdWx0XG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICdhbm51YWxfcmV2ZW51ZScsXG4gICAgICAgICAgJ251bWJlcl9vZl9lbXBsb3llZXMnLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2FkZHJlc3MnLFxuICAgICAgICBsYWJlbDogJ0FkZHJlc3MnLFxuICAgICAgICBjb2xsYXBzaWJsZTogdHJ1ZSxcbiAgICAgICAgY29sbGFwc2VkOiB0cnVlLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICAvLyBgY3JtX2xlYWRgIHN0b3JlcyB0aGUgbG9jYXRpb24gaW4gb25lIGNvbXBvc2l0ZSBgRmllbGQuYWRkcmVzc2A7XG4gICAgICAgIC8vIHRoZSBkaXNjcmV0ZSBzdHJlZXQvY2l0eS9zdGF0ZS9wb3N0YWxfY29kZS9jb3VudHJ5IGNvbHVtbnMgdGhpc1xuICAgICAgICAvLyBzZWN0aW9uIHVzZWQgdG8gbGlzdCBkbyBub3QgZXhpc3Qgb24gdGhlIG9iamVjdCwgc28gdGhlIHdob2xlXG4gICAgICAgIC8vIHNlY3Rpb24gcmVuZGVyZWQgYmxhbmsuXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnYWRkcmVzcycsXG4gICAgICAgICAgICBzcGFuOiAnZnVsbCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdhZGRpdGlvbmFsX2luZm9ybWF0aW9uJyxcbiAgICAgICAgbGFiZWw6ICdBZGRpdGlvbmFsIEluZm9ybWF0aW9uJyxcbiAgICAgICAgY29sbGFwc2libGU6IHRydWUsXG4gICAgICAgIGNvbGxhcHNlZDogdHJ1ZSxcbiAgICAgICAgY29sdW1uczogMSwgLy8gU2luZ2xlIGNvbHVtbiBmb3IgdGV4dCBhcmVhc1xuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICdub3RlcycsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncHJpdmFjeScsXG4gICAgICAgIGxhYmVsOiAnUHJpdmFjeScsXG4gICAgICAgIGNvbGxhcHNpYmxlOiB0cnVlLFxuICAgICAgICBjb2xsYXBzZWQ6IHRydWUsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICdkb19ub3RfY2FsbCcsXG4gICAgICAgICAgJ2VtYWlsX29wdF9vdXQnLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICBcbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgTmFtZWQgTGlzdCBWaWV3c1xuICAgKi9cbiAgbGlzdFZpZXdzOiB7XG4gICAgLy8gRGVjbGFyYXRpb24gb3JkZXIgSVMgdGFiIG9yZGVyIGluIHRoZSBjb25zb2xlLiBUaGVzZSB0aHJlZSB3b3JraW5nXG4gICAgLy8gcXVldWVzIHVzZWQgdG8gc2l0IEFGVEVSIHRoZSBrYW5iYW4gLyBjYWxlbmRhciAvIGdhbGxlcnkgdmlld3MsIHdoaWNoXG4gICAgLy8gcHVzaGVkIGFsbCBvZiB0aGVtIGludG8gdGhlIFwiMyBtb3JlXCIgb3ZlcmZsb3cgbWVudSBcdTIwMTQgc28gdGhlIG9uZSBzY3JlZW5cbiAgICAvLyBhIHJlcCBvcGVucyB0aGlzIGxpc3QgZm9yIHdhcyB0aGUgb25lIHRoZXkgaGFkIHRvIGdvIGh1bnRpbmcgZm9yLCB3aGlsZVxuICAgIC8vIHRocmVlIHByZXNlbnRhdGlvbiBtb2RlcyBoZWxkIHRoZSBmcm9udCByb3cuXG5cbiAgICAvKipcbiAgICAgKiBNeSBMZWFkcyBcdTIwMTQgYSByZXAncyBvd24gcXVldWUsIGhvdHRlc3QgZmlyc3QuXG4gICAgICovXG4gICAgbXlfbGVhZHM6IHtcbiAgICAgIG5hbWU6ICdteV9sZWFkcycsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICBsYWJlbDogJ015IExlYWRzJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXI6ICdvYmplY3QnLFxuICAgICAgICBvYmplY3Q6ICdjcm1fbGVhZCcsXG4gICAgICB9LFxuICAgICAgY29sdW1uczogWydmdWxsX25hbWUnLCAnY29tcGFueScsICdlbWFpbCcsICdzdGF0dXMnLCAncmF0aW5nJ10sXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgeyBmaWVsZDogJ293bmVyX2lkJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ3tjdXJyZW50X3VzZXJfaWR9JyB9LFxuICAgICAgXSxcbiAgICAgIHNvcnQ6IFtcbiAgICAgICAgeyBmaWVsZDogJ3JhdGluZycsIG9yZGVyOiAnZGVzYycgfSxcbiAgICAgICAgeyBmaWVsZDogJ2NyZWF0ZWRfYXQnLCBvcmRlcjogJ2Rlc2MnIH1cbiAgICAgIF0sXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhvdCBMZWFkcyBcdTIwMTQgdGhlIHdvcmtpbmcgcXVldWUgZm9yIHRoZSBsZWFkcyByb3V0aW5nIGRlY2xhcmVkIEhPVC5cbiAgICAgKlxuICAgICAqIFwiSG90XCIgaXMgZGVmaW5lZCBpbiBleGFjdGx5IE9ORSBwbGFjZTogdGhlIGBsZWFkX2Fzc2lnbm1lbnRgIGZsb3cnc1xuICAgICAqIGBjaGVja19ob3RgIGRlY2lzaW9uIChlZGdlIGBlMmAsIGByZWNvcmQucmF0aW5nID49IDRgKS4gQ3Jvc3NpbmcgdGhhdFxuICAgICAqIGxpbmUgaXMgd2hhdCBzdGFtcHMgdGhlIDEtZGF5IGZvbGxvdy11cCBTTEEgYW5kIGZpcmVzIHRoZSBcIkhvdCBsZWFkIFx1MjAxNFxuICAgICAqIGFzc2lnbiB3aXRoaW4gMjRoXCIgYWxlcnQgYXQgdGhlIG93bmVyLCBzbyB0aGlzIHF1ZXVlIG11c3QgaG9sZCBwcmVjaXNlbHlcbiAgICAgKiB0aGUgbGVhZHMgdGhhdCBhbGVydCBpcyBhYm91dC4gKEFuIGVhcmxpZXIgY29tbWVudCBoZXJlIGNyZWRpdGVkIGFcbiAgICAgKiBmbGFnZ2luZyB3b3JrZmxvdyB0aGF0IGhhcyBuZXZlciBleGlzdGVkIGluIHRoaXMgcmVwbyBcdTIwMTQgZGVhZCBuYW1lXG4gICAgICogcmVtb3ZlZCwgdGhlIHJvdXRpbmcgZmxvdyBpcyB0aGUgcHJvZHVjZXIuKVxuICAgICAqXG4gICAgICogVGhlIGN1dCB3YXMgYHJhdGluZyA+PSA0LjVgICgjNzY2KS4gYHJhdGluZ2AgaXMgYSBXSE9MRS1zdGFyIGZpZWxkIFx1MjAxNFxuICAgICAqIGBsZWFkLmhvb2sudHNgIHJvdW5kcyBpdHMgY29tcHV0ZWQgc2NvcmUgKFwicm91bmQgdG8gV0hPTEUgc3RhcnNcIiksIHRoZVxuICAgICAqIGBzdGFyX3JhdGluZ2Agd2lkZ2V0IG9mZmVycyBub3RoaW5nIGZpbmVyLCBhbmQgdGhlIG9uZSBzZWVkZWQgNC41IHdhc1xuICAgICAqIGRlbGV0ZWQgZm9yIHRoZSBzYW1lIHJlYXNvbiAoIzU5MSkgXHUyMDE0IHNvIGA+PSA0LjVgIG1lYW50IGA9PSA1YCBvbiBldmVyeVxuICAgICAqIHJvdyB0aGF0IGNhbiBhY3R1YWxseSBleGlzdC4gQSA0LXN0YXIgbGVhZCB3YXMgcm91dGVkIGhvdCwgYWxlcnRlZCBvbixcbiAgICAgKiBhbmQgdGhlbiBtaXNzaW5nIGZyb20gdGhlIHF1ZXVlIGl0cyBvd25lciB3YXMgc2VudCB0by5cbiAgICAgKlxuICAgICAqIFNoYXJpbmcgdGhlIHBvcHVsYXRpb24gd2l0aCBcIkhpZ2ggUHJpb3JpdHlcIiBpcyB0aGUgZGVsaWJlcmF0ZSBjb3N0IG9mXG4gICAgICogaGF2aW5nIG9uZSBkZWZpbml0aW9uIG9mIGhvdCwgbm90IGFuIG92ZXJzaWdodDogYm90aCB2aWV3cyBub3cgc2hvd1xuICAgICAqIHJhdGluZyA+PSA0LCBzdGlsbCBOZXcgb3IgQ29udGFjdGVkLiBXaGF0IGRpZmZlcnMgaXMgd2hhdCB0aGV5IGFyZSBGT1IuXG4gICAgICogSG90IExlYWRzIGlzIHRoZSB3b3JrIG9yZGVyIFx1MjAxNCBzb3J0ZWQgYnkgbmV4dC1mb2xsb3ctdXAgKHRoZSBTTEEgdGhhdFxuICAgICAqIHJvdXRpbmcganVzdCBzdGFtcGVkKSwgd2l0aCBwaG9uZSwgZW1haWwgYW5kIG93bmVyIG9uIHRoZSByb3cgc28gaXQgY2FuXG4gICAgICogYmUgZGlhbGxlZCB0b3AgdG8gYm90dG9tLiBIaWdoIFByaW9yaXR5IGlzIHRoZSBzY2FuIGxpc3QgXHUyMDE0IHNjb3JlLXRpbnRlZFxuICAgICAqIHJvd3MgYW5kIGxlYWQgc291cmNlLCBubyBTTEEgY29sdW1uLCBubyB0aW1lIG9yZGVyaW5nLiBBIDUtc3Rhci1vbmx5XG4gICAgICogcXVldWUsIGlmIGl0IGlzIGV2ZXIgYSByZWFsIG5lZWQsIGdldHMgaXRzIG93biB2aWV3IHVuZGVyIGl0cyBvd24gbmFtZVxuICAgICAqIGluc3RlYWQgb2Ygc3F1YXR0aW5nIG9uIFwiSG90XCIuXG4gICAgICpcbiAgICAgKiBgdGVzdC9ob3QtbGVhZC10aHJlc2hvbGQtcGFyaXR5LnRlc3QudHNgIGRlcml2ZXMgdGhpcyB0aHJlc2hvbGQgYW5kIHRoZVxuICAgICAqIGZsb3cncyBmcm9tIHRoZSBtZXRhZGF0YSBhbmQgZmFpbHMgaWYgdGhleSBkcmlmdCBhcGFydCBhZ2Fpbi5cbiAgICAgKi9cbiAgICBob3RfbGVhZHM6IHtcbiAgICAgIG5hbWU6ICdob3RfbGVhZHMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdcdUQ4M0RcdUREMjUgSG90IExlYWRzJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fbGVhZCcgfSxcbiAgICAgIGNvbHVtbnM6IFsnZnVsbF9uYW1lJywgJ2NvbXBhbnknLCAncGhvbmUnLCAnZW1haWwnLCAncmF0aW5nJywgJ25leHRfZm9sbG93dXBfZGF0ZScsICdvd25lcl9pZCddLFxuICAgICAgLy8gU2FtZSByYXRpbmcgY3V0IGFzIHRoZSBgbGVhZF9hc3NpZ25tZW50YCBob3QgYnJhbmNoLCBzY29wZWQgdG8gdGhlXG4gICAgICAvLyBzdGF0dXNlcyBzdGlsbCB3b3J0aCB3b3JraW5nLiAoT3BlcmF0b3Itb25seSBmaWx0ZXJzOyB0aGUgdmlldyBydW50aW1lXG4gICAgICAvLyBkb2VzIG5vdCByZXNvbHZlIGRhdGUgdGVtcGxhdGUgc3RyaW5ncy4pXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgeyBmaWVsZDogJ3JhdGluZycsIG9wZXJhdG9yOiAnZ3JlYXRlcl90aGFuX29yX2VxdWFsJywgdmFsdWU6IDQgfSxcbiAgICAgICAgeyBmaWVsZDogJ3N0YXR1cycsIG9wZXJhdG9yOiAnaW4nLCB2YWx1ZTogWyduZXcnLCAnY29udGFjdGVkJ10gfSxcbiAgICAgIF0sXG4gICAgICBzb3J0OiBbeyBmaWVsZDogJ25leHRfZm9sbG93dXBfZGF0ZScsIG9yZGVyOiAnYXNjJyB9XSxcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSGlnaCBQcmlvcml0eSBMZWFkc1xuICAgICAqL1xuICAgIGhpZ2hfcHJpb3JpdHk6IHtcbiAgICAgIG5hbWU6ICdoaWdoX3ByaW9yaXR5JyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnSGlnaCBQcmlvcml0eScsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyOiAnb2JqZWN0JyxcbiAgICAgICAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICAgICAgfSxcbiAgICAgIGNvbHVtbnM6IFsnZnVsbF9uYW1lJywgJ2NvbXBhbnknLCAnZW1haWwnLCAnc3RhdHVzJywgJ3JhdGluZycsICdsZWFkX3NvdXJjZSddLFxuICAgICAgZmlsdGVyOiBbXG4gICAgICAgIHsgZmllbGQ6ICdyYXRpbmcnLCBvcGVyYXRvcjogJ2dyZWF0ZXJfdGhhbl9vcl9lcXVhbCcsIHZhbHVlOiA0IH0sXG4gICAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCBvcGVyYXRvcjogJ2luJywgdmFsdWU6IFsnbmV3JywgJ2NvbnRhY3RlZCddIH0sXG4gICAgICBdLFxuICAgICAgcm93Q29sb3I6IHtcbiAgICAgICAgZmllbGQ6ICdyYXRpbmcnLFxuICAgICAgICBjb2xvcnM6IHtcbiAgICAgICAgICAnNSc6ICdncmVlbicsXG4gICAgICAgICAgJzQnOiAnb3JhbmdlJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFN1c3BlY3RlZCBEdXBsaWNhdGVzIFx1MjAxNCB0aGUgcmV2aWV3IHF1ZXVlIGJlaGluZCB0aGUgaW50YWtlIGZsYWcgKCM1OTgpLlxuICAgICAqXG4gICAgICogYGxlYWRfZHVwbGljYXRlX2NoZWNrYCBtYXJrcyBhIHJlLWNhcHR1cmVkIGVtYWlsIGBzdXNwZWN0ZWRgIGFuZCBsaW5rcyBpdFxuICAgICAqIHRvIHRoZSByZWNvcmQgaXQgcmVwZWF0cy4gV2l0aG91dCBhIHBsYWNlIHRvIFNFRSB0aGF0IHNldCwgdGhlIGZsYWcgd291bGRcbiAgICAgKiBiZSBhIGNvbHVtbiBub2JvZHkgcmVhZHM6IHRoZSByZXZpZXdlciBvcGVucyB0aGlzIHF1ZXVlLCBjb21wYXJlcyB0aGUgdHdvXG4gICAgICogcmVjb3JkcywgYW5kIGVpdGhlciBjbGVhcnMgdGhlIGZsYWcgb3IgZGlzcXVhbGlmaWVzIHRoZSBsZWFkIGFzIGFcbiAgICAgKiBjb25maXJtZWQgZHVwbGljYXRlLiBgY29uZmlybWVkYCByb3dzIGRyb3Agb3V0IG9mIHRoZSBxdWV1ZSwgc28gaXQgZHJhaW5zLlxuICAgICAqL1xuICAgIHN1c3BlY3RlZF9kdXBsaWNhdGVzOiB7XG4gICAgICBuYW1lOiAnc3VzcGVjdGVkX2R1cGxpY2F0ZXMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdTdXNwZWN0ZWQgRHVwbGljYXRlcycsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2xlYWQnIH0sXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgICdmdWxsX25hbWUnLCAnY29tcGFueScsICdlbWFpbCcsXG4gICAgICAgICdkdXBsaWNhdGVfb2ZfdHlwZScsICdkdXBsaWNhdGVfb2ZfbGVhZCcsICdkdXBsaWNhdGVfb2ZfY29udGFjdCcsXG4gICAgICAgICdzdGF0dXMnLCAnb3duZXJfaWQnLFxuICAgICAgXSxcbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAnZHVwbGljYXRlX3N0YXR1cycsIG9wZXJhdG9yOiAnZXF1YWxzJywgdmFsdWU6ICdzdXNwZWN0ZWQnIH0sXG4gICAgICBdLFxuICAgICAgLy8gT2xkZXN0IHN1c3BpY2lvbiBmaXJzdDogYW4gdW5yZXZpZXdlZCBkdXBsaWNhdGUgaXMgYSBzZWNvbmQgcmVwIHdvcmtpbmdcbiAgICAgIC8vIHRoZSBzYW1lIHBlcnNvbiwgc28gdGhlIHF1ZXVlIGlzIHdvcmtlZCBmcm9udCB0byBiYWNrLlxuICAgICAgc29ydDogW3sgZmllbGQ6ICdjcmVhdGVkX2F0Jywgb3JkZXI6ICdhc2MnIH1dLFxuICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICB0aXRsZTogJ05vIFN1c3BlY3RlZCBEdXBsaWNhdGVzJyxcbiAgICAgICAgbWVzc2FnZTogJ05vdGhpbmcgdG8gcmV2aWV3IFx1MjAxNCBldmVyeSByZS1jYXB0dXJlZCBlbWFpbCBoYXMgYmVlbiBjaGVja2VkLicsXG4gICAgICAgIGljb246ICdjb3B5JyxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEthbmJhbiBCb2FyZCBWaWV3XG4gICAgICovXG4gICAga2FuYmFuX2J5X3N0YXR1czoge1xuICAgICAgbmFtZTogJ2thbmJhbl9ieV9zdGF0dXMnLFxuICAgICAgdHlwZTogJ2thbmJhbicsXG4gICAgICBsYWJlbDogJ0xlYWQgUGlwZWxpbmUnLFxuICAgICAgZGF0YToge1xuICAgICAgICBwcm92aWRlcjogJ29iamVjdCcsXG4gICAgICAgIG9iamVjdDogJ2NybV9sZWFkJyxcbiAgICAgIH0sXG4gICAgICBjb2x1bW5zOiBbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgJ2NvbXBhbnknLCAnZW1haWwnXSxcbiAgICAgIGthbmJhbjoge1xuICAgICAgICBncm91cEJ5RmllbGQ6ICdzdGF0dXMnLFxuICAgICAgICBzdW1tYXJpemVGaWVsZDogJ2FubnVhbF9yZXZlbnVlJyxcbiAgICAgICAgY29sdW1uczogWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsICdjb21wYW55JywgJ3JhdGluZyddLFxuICAgICAgfSxcbiAgICAgIG5hdmlnYXRpb246IHtcbiAgICAgICAgbW9kZTogJ2RyYXdlcicsIC8vIE9wZW4gaW4gZHJhd2VyIGluc3RlYWQgb2YgbmV3IHBhZ2VcbiAgICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQ2FsZW5kYXIgVmlld1xuICAgICAqL1xuICAgIGNhbGVuZGFyX2J5X2NyZWF0ZWQ6IHtcbiAgICAgIG5hbWU6ICdjYWxlbmRhcl9ieV9jcmVhdGVkJyxcbiAgICAgIHR5cGU6ICdjYWxlbmRhcicsXG4gICAgICBsYWJlbDogJ0xlYWQgQ2FsZW5kYXInLFxuICAgICAgZGF0YToge1xuICAgICAgICBwcm92aWRlcjogJ29iamVjdCcsXG4gICAgICAgIG9iamVjdDogJ2NybV9sZWFkJyxcbiAgICAgIH0sXG4gICAgICBjb2x1bW5zOiBbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgJ2NvbXBhbnknXSxcbiAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnY3JlYXRlZF9hdCcsXG4gICAgICAgIHRpdGxlRmllbGQ6ICdjb21wYW55JyxcbiAgICAgICAgY29sb3JGaWVsZDogJ3N0YXR1cycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogR2FsbGVyeS9DYXJkIFZpZXdcbiAgICAgKi9cbiAgICBnYWxsZXJ5X3ZpZXc6IHtcbiAgICAgIG5hbWU6ICdnYWxsZXJ5X3ZpZXcnLFxuICAgICAgdHlwZTogJ2dhbGxlcnknLFxuICAgICAgbGFiZWw6ICdMZWFkIENhcmRzJyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXI6ICdvYmplY3QnLFxuICAgICAgICBvYmplY3Q6ICdjcm1fbGVhZCcsXG4gICAgICB9LFxuICAgICAgY29sdW1uczogWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsICdjb21wYW55JywgJ2VtYWlsJywgJ3N0YXR1cyddLFxuICAgICAgZ2FsbGVyeToge1xuICAgICAgICBjYXJkU2l6ZTogJ21lZGl1bScsXG4gICAgICAgIHRpdGxlRmllbGQ6ICdjb21wYW55JyxcbiAgICAgICAgdmlzaWJsZUZpZWxkczogWydmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsICdlbWFpbCcsICdwaG9uZScsICdzdGF0dXMnLCAncmF0aW5nJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgXG4gIH0sXG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgTmFtZWQgRm9ybSBWaWV3cyAtIERlbW9uc3RyYXRpbmcgQWxsIDYgTGF5b3V0IFR5cGVzXG4gICAqXG4gICAqIE9uZSBleGFtcGxlIHBlciBsYXlvdXQgdHlwZS4gVGhlIFNJTVBMRSBvbmUgaXMgdGhlIGRlZmF1bHQgYGZvcm1gXG4gICAqIGFib3ZlLCBzbyB0aGlzIGJsb2NrIGNhcnJpZXMgdGhlIG90aGVyIGZpdmUsIHBsdXMgdGhlIHB1YmxpYyBhbmQgdGhlXG4gICAqIGNvbmRpdGlvbmFsLXZpc2liaWxpdHkgZXhhbXBsZXMuIEV2ZXJ5IGxheW91dCBpcyBkZW1vbnN0cmF0ZWQgZXhhY3RseVxuICAgKiBvbmNlIGFjcm9zcyB0aGUgZmlsZTogZWFjaCBlbnRyeSBiZWxvdyBpcyB0aGUgb25seSBleGFtcGxlIG9mIGl0cyBvd24uXG4gICAqL1xuICBmb3JtVmlld3M6IHtcbiAgICAvKipcbiAgICAgKiAyLiBUQUJCRUQgTGF5b3V0XG4gICAgICogT3JnYW5pemUgY29tcGxleCBmb3JtcyB3aXRoIHRhYnNcbiAgICAgKi9cbiAgICBkZXRhaWxfZm9ybToge1xuICAgICAgdHlwZTogJ3RhYmJlZCcsXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2dlbmVyYWwnLFxuICAgICAgICAgIGxhYmVsOiAnR2VuZXJhbCcsXG4gICAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICdzYWx1dGF0aW9uJyxcbiAgICAgICAgICAgICdmaXJzdF9uYW1lJyxcbiAgICAgICAgICAgICdsYXN0X25hbWUnLFxuICAgICAgICAgICAgJ2NvbXBhbnknLFxuICAgICAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgICAgICdlbWFpbCcsXG4gICAgICAgICAgICAncGhvbmUnLFxuICAgICAgICAgICAgJ21vYmlsZScsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdxdWFsaWZpY2F0aW9uJyxcbiAgICAgICAgICBsYWJlbDogJ1F1YWxpZmljYXRpb24nLFxuICAgICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7IGZpZWxkOiAnc3RhdHVzJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHsgZmllbGQ6ICdyYXRpbmcnLCB3aWRnZXQ6ICdzdGFyX3JhdGluZycgfSxcbiAgICAgICAgICAgICdsZWFkX3NvdXJjZScsXG4gICAgICAgICAgICAnaW5kdXN0cnknLFxuICAgICAgICAgICAgJ2FubnVhbF9yZXZlbnVlJyxcbiAgICAgICAgICAgICdudW1iZXJfb2ZfZW1wbG95ZWVzJyxcbiAgICAgICAgICAgIC8vIFNlZSB0aGUgZGVmYXVsdCBmb3JtOiBgdW5xdWFsaWZpZWRgIHJlcXVpcmVzIGEgcmVhc29uLlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWVsZDogJ2Rpc3F1YWxpZmljYXRpb25fcmVhc29uJyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHZpc2libGVPbjogUGBoYXMocmVjb3JkLnN0YXR1cykgJiYgcmVjb3JkLnN0YXR1cyA9PSBcInVucXVhbGlmaWVkXCJgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLkRVUExJQ0FURV9MSU5LX0ZJRUxEUyxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2FkZHJlc3MnLFxuICAgICAgICAgIGxhYmVsOiAnQWRkcmVzcycsXG4gICAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgICAvLyBTaW5nbGUgY29tcG9zaXRlIGBGaWVsZC5hZGRyZXNzYCBcdTIwMTQgc2VlIHRoZSBub3RlIG9uIHRoZSBkZWZhdWx0XG4gICAgICAgICAgLy8gZm9ybSdzIEFkZHJlc3Mgc2VjdGlvbi5cbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHsgZmllbGQ6ICdhZGRyZXNzJywgc3BhbjogJ2Z1bGwnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdkZXRhaWxzJyxcbiAgICAgICAgICBsYWJlbDogJ0RldGFpbHMnLFxuICAgICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgJ25vdGVzJyxcbiAgICAgICAgICAgICdkb19ub3RfY2FsbCcsXG4gICAgICAgICAgICAnZW1haWxfb3B0X291dCcsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiAzLiBXSVpBUkQgTGF5b3V0XG4gICAgICogU3RlcC1ieS1zdGVwIGd1aWRlZCBwcm9jZXNzXG4gICAgICovXG4gICAgbGVhZF9jb252ZXJzaW9uX3dpemFyZDoge1xuICAgICAgdHlwZTogJ3dpemFyZCcsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyOiAnb2JqZWN0JyxcbiAgICAgICAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICAgICAgfSxcbiAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnc3RlcF8xX2NvbnRhY3RfZGV0YWlscycsXG4gICAgICAgICAgbGFiZWw6ICdTdGVwIDE6IENvbnRhY3QgRGV0YWlscycsXG4gICAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHsgZmllbGQ6ICdmaXJzdF9uYW1lJywgcmVxdWlyZWQ6IHRydWUsIHJlYWRvbmx5OiB0cnVlIH0sXG4gICAgICAgICAgICB7IGZpZWxkOiAnbGFzdF9uYW1lJywgcmVxdWlyZWQ6IHRydWUsIHJlYWRvbmx5OiB0cnVlIH0sXG4gICAgICAgICAgICB7IGZpZWxkOiAnZW1haWwnLCByZWFkb25seTogdHJ1ZSwgc3BhbjogJ2Z1bGwnIH0sXG4gICAgICAgICAgICAncGhvbmUnLFxuICAgICAgICAgICAgJ21vYmlsZScsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdzdGVwXzJfY29tcGFueV9pbmZvcm1hdGlvbicsXG4gICAgICAgICAgbGFiZWw6ICdTdGVwIDI6IENvbXBhbnkgSW5mb3JtYXRpb24nLFxuICAgICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7IGZpZWxkOiAnY29tcGFueScsIHJlcXVpcmVkOiB0cnVlLCByZWFkb25seTogdHJ1ZSB9LFxuICAgICAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgICAgICdpbmR1c3RyeScsXG4gICAgICAgICAgICAnYW5udWFsX3JldmVudWUnLFxuICAgICAgICAgICAgJ251bWJlcl9vZl9lbXBsb3llZXMnLFxuICAgICAgICAgICAgJ3dlYnNpdGUnLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnc3RlcF8zX3F1YWxpZmljYXRpb24nLFxuICAgICAgICAgIGxhYmVsOiAnU3RlcCAzOiBRdWFsaWZpY2F0aW9uJyxcbiAgICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgeyBmaWVsZDogJ3N0YXR1cycsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgICAgICAvLyBTZWUgdGhlIGRlZmF1bHQgZm9ybTogYHVucXVhbGlmaWVkYCByZXF1aXJlcyBhIHJlYXNvbi4gVGhlIHN0YXR1c1xuICAgICAgICAgICAgLy8gaXMgZWRpdGFibGUgaW4gdGhpcyBzdGVwLCBzbyB0aGUgd2l6YXJkIGNhbiBsYW5kIHRoZXJlIHRvby5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdkaXNxdWFsaWZpY2F0aW9uX3JlYXNvbicsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICB2aXNpYmxlT246IFBgaGFzKHJlY29yZC5zdGF0dXMpICYmIHJlY29yZC5zdGF0dXMgPT0gXCJ1bnF1YWxpZmllZFwiYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5EVVBMSUNBVEVfTElOS19GSUVMRFMsXG4gICAgICAgICAgICB7IGZpZWxkOiAncmF0aW5nJywgd2lkZ2V0OiAnc3Rhcl9yYXRpbmcnIH0sXG4gICAgICAgICAgICAnbGVhZF9zb3VyY2UnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWVsZDogJ293bmVyX2lkJyxcbiAgICAgICAgICAgICAgLy8gQ29uZGl0aW9uYWwgdmlzaWJpbGl0eS4gYCE9IG51bGxgIG9uIHRvcCBvZiBgaGFzKC4uLilgOiBzdHJpY3RcbiAgICAgICAgICAgICAgLy8gQ0VMIGFib3J0cyBvbiBgZHluPG51bGw+IDwgaW50YCwgd2hpY2ggYGhhcygpYCBhbG9uZSBhbGxvd3MuXG4gICAgICAgICAgICAgIHZpc2libGVPbjogUGBoYXMocmVjb3JkLnJhdGluZykgJiYgcmVjb3JkLnJhdGluZyAhPSBudWxsICYmIHJlY29yZC5yYXRpbmcgPj0gNGAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnc3RlcF80X3Jldmlld19hbmRfY29udmVydCcsXG4gICAgICAgICAgbGFiZWw6ICdTdGVwIDQ6IFJldmlldyAmIENvbnZlcnQnLFxuICAgICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICBoZWxwVGV4dDogJ1JldmlldyBhbGwgaW5mb3JtYXRpb24gYmVmb3JlIGNvbnZlcnRpbmcgdG8gQWNjb3VudCBhbmQgQ29udGFjdCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogNC4gU1BMSVQgTGF5b3V0XG4gICAgICogTWFzdGVyLWRldGFpbCBzcGxpdCB2aWV3XG4gICAgICovXG4gICAgc3BsaXRfZWRpdDoge1xuICAgICAgdHlwZTogJ3NwbGl0JyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXI6ICdvYmplY3QnLFxuICAgICAgICBvYmplY3Q6ICdjcm1fbGVhZCcsXG4gICAgICB9LFxuICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdwcmltYXJ5X2luZm9ybWF0aW9uJyxcbiAgICAgICAgICBsYWJlbDogJ1ByaW1hcnkgSW5mb3JtYXRpb24nLFxuICAgICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAnZmlyc3RfbmFtZScsXG4gICAgICAgICAgICAnbGFzdF9uYW1lJyxcbiAgICAgICAgICAgICdjb21wYW55JyxcbiAgICAgICAgICAgICdlbWFpbCcsXG4gICAgICAgICAgICB7IGZpZWxkOiAnc3RhdHVzJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICAgICdvd25lcl9pZCcsXG4gICAgICAgICAgICAvLyBTZWUgdGhlIGRlZmF1bHQgZm9ybTogYHVucXVhbGlmaWVkYCByZXF1aXJlcyBhIHJlYXNvbi5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdkaXNxdWFsaWZpY2F0aW9uX3JlYXNvbicsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICB2aXNpYmxlT246IFBgaGFzKHJlY29yZC5zdGF0dXMpICYmIHJlY29yZC5zdGF0dXMgPT0gXCJ1bnF1YWxpZmllZFwiYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5EVVBMSUNBVEVfTElOS19GSUVMRFMsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdleHRlbmRlZF9kZXRhaWxzJyxcbiAgICAgICAgICBsYWJlbDogJ0V4dGVuZGVkIERldGFpbHMnLFxuICAgICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAncGhvbmUnLFxuICAgICAgICAgICAgJ21vYmlsZScsXG4gICAgICAgICAgICAndGl0bGUnLFxuICAgICAgICAgICAgJ2luZHVzdHJ5JyxcbiAgICAgICAgICAgICdsZWFkX3NvdXJjZScsXG4gICAgICAgICAgICB7IGZpZWxkOiAncmF0aW5nJywgd2lkZ2V0OiAnc3Rhcl9yYXRpbmcnIH0sXG4gICAgICAgICAgICAnYW5udWFsX3JldmVudWUnLFxuICAgICAgICAgICAgJ251bWJlcl9vZl9lbXBsb3llZXMnLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogNS4gRFJBV0VSIExheW91dFxuICAgICAqIFNpZGUgcGFuZWwgZm9ybSAodHlwaWNhbGx5IG9wZW5lZCBmcm9tIGxpc3QgdmlldylcbiAgICAgKi9cbiAgICBxdWlja19lZGl0X2RyYXdlcjoge1xuICAgICAgdHlwZTogJ2RyYXdlcicsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyOiAnb2JqZWN0JyxcbiAgICAgICAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICAgICAgfSxcbiAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAncXVpY2tfZWRpdCcsXG4gICAgICAgICAgbGFiZWw6ICdRdWljayBFZGl0JyxcbiAgICAgICAgICBjb2x1bW5zOiAxLCAvLyBEcmF3ZXJzIHR5cGljYWxseSB1c2Ugc2luZ2xlIGNvbHVtblxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgeyBmaWVsZDogJ2ZpcnN0X25hbWUnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBmaWVsZDogJ2xhc3RfbmFtZScsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgICAgICAnY29tcGFueScsXG4gICAgICAgICAgICAnZW1haWwnLFxuICAgICAgICAgICAgJ3Bob25lJyxcbiAgICAgICAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBmaWVsZDogJ3JhdGluZycsIHdpZGdldDogJ3N0YXJfcmF0aW5nJyB9LFxuICAgICAgICAgICAgJ2xlYWRfc291cmNlJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdvd25lcl9pZCcsXG4gICAgICAgICAgICAgIC8vIE9ubHkgc2hvdyBvd25lciBhZnRlciBpbml0aWFsIGNvbnRhY3QuIEEgcmVjb3JkIHdpdGggbm8gc3RhdHVzXG4gICAgICAgICAgICAgIC8vIHlldCBoYXMgbm90IGJlZW4gY29udGFjdGVkLCBzbyBgIWlzQmxhbmtgIGtlZXBzIHRoZSBibGFuayBjYXNlXG4gICAgICAgICAgICAgIC8vIG9uIHRoZSBcImhpZGRlblwiIHNpZGUgcmF0aGVyIHRoYW4gbGV0dGluZyBgbnVsbCAhPSBcIm5ld1wiYCBzaG93IGl0LlxuICAgICAgICAgICAgICB2aXNpYmxlT246IFBgaGFzKHJlY29yZC5zdGF0dXMpICYmICFpc0JsYW5rKHJlY29yZC5zdGF0dXMpICYmIHJlY29yZC5zdGF0dXMgIT0gXCJuZXdcImAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gU2VlIHRoZSBkZWZhdWx0IGZvcm06IGB1bnF1YWxpZmllZGAgcmVxdWlyZXMgYSByZWFzb24uXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAnZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24nLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwidW5xdWFsaWZpZWRcImAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uRFVQTElDQVRFX0xJTktfRklFTERTLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogNi4gTU9EQUwgTGF5b3V0XG4gICAgICogRGlhbG9nLWJhc2VkIGZvcm0gZm9yIHF1aWNrIGFjdGlvbnNcbiAgICAgKi9cbiAgICBzdGF0dXNfdXBkYXRlX21vZGFsOiB7XG4gICAgICB0eXBlOiAnbW9kYWwnLFxuICAgICAgZGF0YToge1xuICAgICAgICBwcm92aWRlcjogJ29iamVjdCcsXG4gICAgICAgIG9iamVjdDogJ2NybV9sZWFkJyxcbiAgICAgIH0sXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3VwZGF0ZV9sZWFkX3N0YXR1cycsXG4gICAgICAgICAgbGFiZWw6ICdVcGRhdGUgTGVhZCBTdGF0dXMnLFxuICAgICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7IGZpZWxkOiAnZmlyc3RfbmFtZScsIHJlYWRvbmx5OiB0cnVlIH0sXG4gICAgICAgICAgICB7IGZpZWxkOiAnbGFzdF9uYW1lJywgcmVhZG9ubHk6IHRydWUgfSxcbiAgICAgICAgICAgIHsgZmllbGQ6ICdjb21wYW55JywgcmVhZG9ubHk6IHRydWUgfSxcbiAgICAgICAgICAgIHsgXG4gICAgICAgICAgICAgIGZpZWxkOiAnc3RhdHVzJywgXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICBoZWxwVGV4dDogJ1NlbGVjdCB0aGUgbmV3IHN0YXR1cyBmb3IgdGhpcyBsZWFkJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAncmF0aW5nJyxcbiAgICAgICAgICAgICAgd2lkZ2V0OiAnc3Rhcl9yYXRpbmcnLFxuICAgICAgICAgICAgICAvLyBPbmx5IHNob3cgcmF0aW5nIGZvciBxdWFsaWZpZWQgbGVhZHNcbiAgICAgICAgICAgICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwicXVhbGlmaWVkXCJgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIFRoZSByZWFzb24gcGlja2xpc3QsIG5vdCBqdXN0IGZyZWUtdGV4dCBub3RlczogaXQgaXMgd2hhdCB0aGVcbiAgICAgICAgICAgIC8vIGBkaXNxdWFsaWZpY2F0aW9uX3JlYXNvbl9yZXF1aXJlZGAgdmFsaWRhdGlvbiBjaGVja3MsIGFuZCB0aGlzXG4gICAgICAgICAgICAvLyBtb2RhbCBpcyB0aGUgbWFpbiBwbGFjZSBhIHJlcCBmbGlwcyBhIGxlYWQgdG8gVW5xdWFsaWZpZWQuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAnZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24nLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwidW5xdWFsaWZpZWRcImAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uRFVQTElDQVRFX0xJTktfRklFTERTLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWVsZDogJ25vdGVzJyxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdBZGQgbm90ZXMgYWJvdXQgdGhpcyBzdGF0dXMgY2hhbmdlJyxcbiAgICAgICAgICAgICAgLy8gRnJlZS10ZXh0IGNvbnRleHQgYWxvbmdzaWRlIHRoZSByZWFzb25cbiAgICAgICAgICAgICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwidW5xdWFsaWZpZWRcImAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogNy4gUFVCTElDIC8gQU5PTllNT1VTIFx1MjAxNCBcIldlYi10by1MZWFkXCJcbiAgICAgKlxuICAgICAqIEFpcnRhYmxlLXN0eWxlIHB1YmxpYyBmb3JtIGhvc3RlZCBhdCBgL2Zvcm1zL2NvbnRhY3QtdXNgLiBFbWJlZGRhYmxlXG4gICAgICogdmlhIGlmcmFtZSBvbiBhIG1hcmtldGluZyBzaXRlLiBHdWVzdHMgY2FuIE9OTFkgc3VibWl0IChpbnNlcnQpIFx1MjAxNCB0aGVcbiAgICAgKiBgZ3Vlc3RfcG9ydGFsYCBwcm9maWxlIGRlbmllcyByZWFkL2VkaXQvZGVsZXRlIG9uIGBjcm1fbGVhZGAuXG4gICAgICpcbiAgICAgKiBGaWVsZHMgbm90IG9uIHRoZSBmb3JtIChzdGF0dXMsIGxlYWRfc291cmNlLCBvd25lcl9pZCwgcmF0aW5nKSBhcmUgc3RhbXBlZFxuICAgICAqIGJ5IHRoZSBgbGVhZF9hdXRvbWF0aW9uYCBob29rIGluIGBsZWFkLmhvb2sudHNgIGFmdGVyIGEgZ3Vlc3Qgc3VibWlzc2lvbi5cbiAgICAgKi9cbiAgICB3ZWJfdG9fbGVhZDoge1xuICAgICAgdHlwZTogJ3NpbXBsZScsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyOiAnb2JqZWN0JyxcbiAgICAgICAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICAgICAgfSxcbiAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAndGVsbF91c19hYm91dF95b3Vyc2VsZicsXG4gICAgICAgICAgbGFiZWw6ICdUZWxsIHVzIGFib3V0IHlvdXJzZWxmJyxcbiAgICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgeyBmaWVsZDogJ2ZpcnN0X25hbWUnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBmaWVsZDogJ2xhc3RfbmFtZScsICByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgeyBmaWVsZDogJ2VtYWlsJywgICAgICByZXF1aXJlZDogdHJ1ZSwgc3BhbjogJ2Z1bGwnIH0sXG4gICAgICAgICAgICAncGhvbmUnLFxuICAgICAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2Fib3V0X3lvdXJfY29tcGFueScsXG4gICAgICAgICAgbGFiZWw6ICdBYm91dCB5b3VyIGNvbXBhbnknLFxuICAgICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7IGZpZWxkOiAnY29tcGFueScsIHJlcXVpcmVkOiB0cnVlLCBzcGFuOiAnZnVsbCcgfSxcbiAgICAgICAgICAgICd3ZWJzaXRlJyxcbiAgICAgICAgICAgICdpbmR1c3RyeScsXG4gICAgICAgICAgICAnbnVtYmVyX29mX2VtcGxveWVlcycsXG4gICAgICAgICAgICAnYW5udWFsX3JldmVudWUnLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnaG93X2Nhbl93ZV9oZWxwJyxcbiAgICAgICAgICBsYWJlbDogJ0hvdyBjYW4gd2UgaGVscD8nLFxuICAgICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAnZGVzY3JpcHRpb24nLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdCcmllZmx5IGRlc2NyaWJlIHdoYXQgeW91IGFyZSBsb29raW5nIGZvci4uLicsXG4gICAgICAgICAgICAgIGhlbHBUZXh0OiAnQSBzYWxlcyByZXByZXNlbnRhdGl2ZSB3aWxsIGdldCBiYWNrIHRvIHlvdSB3aXRoaW4gb25lIGJ1c2luZXNzIGRheS4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHNoYXJpbmc6IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgYWxsb3dBbm9ueW1vdXM6IHRydWUsXG4gICAgICAgIHB1YmxpY0xpbms6ICcvZm9ybXMvY29udGFjdC11cycsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZHZhbmNlZCBFeGFtcGxlOiBDb25kaXRpb25hbCBGaWVsZCBWaXNpYmlsaXR5ICYgRGVwZW5kZW5jaWVzXG4gICAgICovXG4gICAgYWR2YW5jZWRfY29uZGl0aW9uYWw6IHtcbiAgICAgIHR5cGU6ICdzaW1wbGUnLFxuICAgICAgZGF0YToge1xuICAgICAgICBwcm92aWRlcjogJ29iamVjdCcsXG4gICAgICAgIG9iamVjdDogJ2NybV9sZWFkJyxcbiAgICAgIH0sXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ2xlYWRfaW5mb3JtYXRpb24nLFxuICAgICAgICAgIGxhYmVsOiAnTGVhZCBJbmZvcm1hdGlvbicsXG4gICAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICdmaXJzdF9uYW1lJyxcbiAgICAgICAgICAgICdsYXN0X25hbWUnLFxuICAgICAgICAgICAgJ2NvbXBhbnknLFxuICAgICAgICAgICAgJ2VtYWlsJyxcbiAgICAgICAgICAgICdzdGF0dXMnLFxuICAgICAgICAgICAgJ2xlYWRfc291cmNlJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdyYXRpbmcnLFxuICAgICAgICAgICAgICB3aWRnZXQ6ICdzdGFyX3JhdGluZycsXG4gICAgICAgICAgICAgIC8vIE9ubHkgc2hvdyBhZnRlciBmaXJzdCBjb250YWN0IFx1MjAxNCBzZWUgdGhlIGRyYXdlciBmb3JtJ3Mgbm90ZSBvblxuICAgICAgICAgICAgICAvLyB3aHkgYmxhbmsgc3RheXMgb24gdGhlIFwiaGlkZGVuXCIgc2lkZS5cbiAgICAgICAgICAgICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiAhaXNCbGFuayhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzICE9IFwibmV3XCJgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdpbmR1c3RyeScsXG4gICAgICAgICAgICAgIGRlcGVuZHNPbjogJ2NvbXBhbnknLCAvLyBJbmR1c3RyeSBvcHRpb25zIGRlcGVuZCBvbiBjb21wYW55XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWVsZDogJ2FubnVhbF9yZXZlbnVlJyxcbiAgICAgICAgICAgICAgLy8gT25seSBmb3IgcXVhbGlmaWVkIGxlYWRzXG4gICAgICAgICAgICAgIHZpc2libGVPbjogUGBoYXMocmVjb3JkLnJhdGluZykgJiYgcmVjb3JkLnJhdGluZyAhPSBudWxsICYmIHJlY29yZC5yYXRpbmcgPj0gM2AsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWVsZDogJ251bWJlcl9vZl9lbXBsb3llZXMnLFxuICAgICAgICAgICAgICB2aXNpYmxlT246IFBgaGFzKHJlY29yZC5yYXRpbmcpICYmIHJlY29yZC5yYXRpbmcgIT0gbnVsbCAmJiByZWNvcmQucmF0aW5nID49IDNgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdvd25lcl9pZCcsXG4gICAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgICB2aXNpYmxlT246IFBgaGFzKHJlY29yZC5zdGF0dXMpICYmIChyZWNvcmQuc3RhdHVzID09IFwiY29udGFjdGVkXCIgfHwgcmVjb3JkLnN0YXR1cyA9PSBcInF1YWxpZmllZFwiKWAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLy8gU2VlIHRoZSBkZWZhdWx0IGZvcm06IGB1bnF1YWxpZmllZGAgcmVxdWlyZXMgYSByZWFzb24uXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOiAnZGlzcXVhbGlmaWNhdGlvbl9yZWFzb24nLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwidW5xdWFsaWZpZWRcImAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uRFVQTElDQVRFX0xJTktfRklFTERTLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWVsZDogJ25vdGVzJyxcbiAgICAgICAgICAgICAgc3BhbjogJ2Z1bGwnLFxuICAgICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgLy8gUmVxdWlyZSBleHBsYW5hdGlvbiBmb3IgdW5xdWFsaWZpZWRcbiAgICAgICAgICAgICAgdmlzaWJsZU9uOiBQYGhhcyhyZWNvcmQuc3RhdHVzKSAmJiByZWNvcmQuc3RhdHVzID09IFwidW5xdWFsaWZpZWRcImAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnYWRkcmVzc19pbmZvcm1hdGlvbicsXG4gICAgICAgICAgbGFiZWw6ICdBZGRyZXNzIEluZm9ybWF0aW9uJyxcbiAgICAgICAgICBjb2xsYXBzaWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb2xsYXBzZWQ6IHRydWUsXG4gICAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgICAvLyBTaW5nbGUgY29tcG9zaXRlIGBGaWVsZC5hZGRyZXNzYCBcdTIwMTQgdGhlIGRpc2NyZXRlIHN0cmVldC9jaXR5L3N0YXRlL1xuICAgICAgICAgIC8vIHBvc3RhbF9jb2RlL2NvdW50cnkgY29sdW1ucyBkbyBub3QgZXhpc3Qgb24gY3JtX2xlYWQuXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7IGZpZWxkOiAnYWRkcmVzcycsIHNwYW46ICdmdWxsJyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAncHJpdmFjeV9wcmVmZXJlbmNlcycsXG4gICAgICAgICAgbGFiZWw6ICdQcml2YWN5IFByZWZlcmVuY2VzJyxcbiAgICAgICAgICBjb2xsYXBzaWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb2xsYXBzZWQ6IHRydWUsXG4gICAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdkb19ub3RfY2FsbCcsXG4gICAgICAgICAgICAgIGhlbHBUZXh0OiAnQ2hlY2sgaWYgdGhpcyBsZWFkIGhhcyByZXF1ZXN0ZWQgbm90IHRvIGJlIGNhbGxlZCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWVsZDogJ2VtYWlsX29wdF9vdXQnLFxuICAgICAgICAgICAgICBoZWxwVGV4dDogJ0NoZWNrIGlmIHRoaXMgbGVhZCBoYXMgb3B0ZWQgb3V0IG9mIGVtYWlsIGNvbW11bmljYXRpb25zJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgfSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3MvYWNjb3VudC52aWV3LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzL2FjY291bnQudmlldy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBBY2NvdW50IFZpZXdzXG4gKlxuICogICBcdTIwMjIgZ3JpZCAgICBcdTIwMTQgcHJpbWFyeSBsaXN0IHdpdGggcmV2ZW51ZSAvIGluZHVzdHJ5IHN1bW1hcmllc1xuICogICBcdTIwMjIgZ2FsbGVyeSBcdTIwMTQgYnJhbmRlZCBhY2NvdW50IGNhcmRzIHdpdGggYnJhbmRfY29sb3IgaGlnaGxpZ2h0c1xuICogICBcdTIwMjIgbWFwICAgICBcdTIwMTQgZ2Vvc3BhdGlhbCBkaXN0cmlidXRpb24gKHVzZXMgb2ZmaWNlX2xvY2F0aW9uKVxuICovXG5leHBvcnQgY29uc3QgQWNjb3VudFZpZXdzID0gZGVmaW5lVmlldyh7XG4gIGxpc3Q6IHtcbiAgICB0eXBlOiAnZ3JpZCcsXG4gICAgbmFtZTogJ2FsbF9hY2NvdW50cycsXG4gICAgbGFiZWw6ICdBbGwgQWNjb3VudHMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2FjY291bnQnIH0sXG4gICAgY29sdW1uczogW1xuICAgICAgeyBmaWVsZDogJ25hbWUnLCB3aWR0aDogMjQwLCBzb3J0YWJsZTogdHJ1ZSwgbGluazogdHJ1ZSwgcGlubmVkOiAnbGVmdCcgfSxcbiAgICAgIHsgZmllbGQ6ICdpbmR1c3RyeScsIHdpZHRoOiAxNDAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAndHlwZScsIHdpZHRoOiAxMzAgfSxcbiAgICAgIHsgZmllbGQ6ICdhbm51YWxfcmV2ZW51ZScsIHdpZHRoOiAxNjAsIGFsaWduOiAncmlnaHQnLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgeyBmaWVsZDogJ251bWJlcl9vZl9lbXBsb3llZXMnLCB3aWR0aDogMTMwLCBhbGlnbjogJ3JpZ2h0Jywgc3VtbWFyeTogJ2F2ZycgfSxcbiAgICAgIHsgZmllbGQ6ICdoZWFsdGhfc2NvcmUnLCB3aWR0aDogMTQwIH0sXG4gICAgXSxcbiAgICBzb3J0OiBbeyBmaWVsZDogJ2FubnVhbF9yZXZlbnVlJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICByb3dDb2xvcjogeyBmaWVsZDogJ2lzX2FjdGl2ZScsIGNvbG9yczogeyB0cnVlOiAnZ3JlZW4nLCBmYWxzZTogJ3NsYXRlJyB9IH0sXG4gICAgc2VsZWN0aW9uOiB7IHR5cGU6ICdtdWx0aXBsZScgfSxcbiAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiA1MCwgcGFnZVNpemVPcHRpb25zOiBbMjUsIDUwLCAxMDBdIH0sXG4gICAgZXhwb3J0T3B0aW9uczogeyBmb3JtYXRzOiBbJ2NzdicsICd4bHN4J10gfSxcbiAgICBjb21wYWN0VG9vbGJhcjogdHJ1ZSxcbiAgICBidWxrQWN0aW9uRGVmczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAndXBkYXRlX3RpZXInLFxuICAgICAgICBsYWJlbDogJ1VwZGF0ZSBUaWVyJyxcbiAgICAgICAgaWNvbjogJ3RhZycsXG4gICAgICAgIG9wZXJhdGlvbjogJ3VwZGF0ZScsXG4gICAgICAgIHBhcmFtczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6ICd0aWVyJyxcbiAgICAgICAgICAgIGxhYmVsOiAnQ3VzdG9tZXIgVGllcicsXG4gICAgICAgICAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnU3RyYXRlZ2ljJywgIHZhbHVlOiAnc3RyYXRlZ2ljJyAgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0VudGVycHJpc2UnLCB2YWx1ZTogJ2VudGVycHJpc2UnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdNaWQtTWFya2V0JywgdmFsdWU6ICdtaWRfbWFya2V0JyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnU01CJywgICAgICAgIHZhbHVlOiAnc21iJyAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgY29uZmlybVRleHQ6ICdVcGRhdGUgdGllciBvbiB7e2NvdW50fX0gYWNjb3VudChzKSB0byB7e3RpZXJ9fT8nLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3RyYW5zZmVyX293bmVyJyxcbiAgICAgICAgbGFiZWw6ICdUcmFuc2ZlciBPd25lcicsXG4gICAgICAgIGljb246ICd1c2VyLWNoZWNrJyxcbiAgICAgICAgb3BlcmF0aW9uOiAndXBkYXRlJyxcbiAgICAgICAgcGFyYW1zOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ293bmVyX2lkJyxcbiAgICAgICAgICAgIGxhYmVsOiAnTmV3IE93bmVyJyxcbiAgICAgICAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgICAgICAgLy8gVGhlIHBsYXRmb3JtIHJlZ2lzdGVycyBgc3lzX3VzZXJgIFx1MjAxNCBgdXNlcmAgbWF0Y2hlcyBubyBvYmplY3QgYW5kXG4gICAgICAgICAgICAvLyByZW5kZXJlZCBhbiBlbXB0eSBwaWNrZXIuXG4gICAgICAgICAgICBvYmplY3Q6ICdzeXNfdXNlcicsXG4gICAgICAgICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBjb25maXJtVGV4dDogJ1RyYW5zZmVyIG93bmVyc2hpcCBvZiB7e2NvdW50fX0gYWNjb3VudChzKT8nLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2RlbGV0ZScsXG4gICAgICAgIGxhYmVsOiAnRGVsZXRlJyxcbiAgICAgICAgaWNvbjogJ3RyYXNoLTInLFxuICAgICAgICB2YXJpYW50OiAnZGFuZ2VyJyxcbiAgICAgICAgb3BlcmF0aW9uOiAnZGVsZXRlJyxcbiAgICAgICAgY29uZmlybVRleHQ6ICdQZXJtYW5lbnRseSBkZWxldGUge3tjb3VudH19IGFjY291bnQocyk/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nLFxuICAgICAgICBjb25maXJtTGFiZWw6ICdEZWxldGUnLFxuICAgICAgfSxcbiAgICBdLFxuICAgIGFwcGVhcmFuY2U6IHtcbiAgICAgIHNob3dEZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGFsbG93ZWRWaXN1YWxpemF0aW9uczogWydncmlkJywgJ2dhbGxlcnknLCAnbWFwJ10sXG4gICAgfSxcbiAgfSxcblxuICBsaXN0Vmlld3M6IHtcbiAgICAvKiogQnJhbmRlZCBhY2NvdW50IGNhcmRzICovXG4gICAgYWNjb3VudF9nYWxsZXJ5OiB7XG4gICAgICBuYW1lOiAnYWNjb3VudF9nYWxsZXJ5JyxcbiAgICAgIHR5cGU6ICdnYWxsZXJ5JyxcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBDYXJkcycsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2FjY291bnQnIH0sXG4gICAgICAvLyBgbG9nb2AgcmlkZXMgaW4gdGhlIHByb2plY3Rpb24gZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGUgdGltZWxpbmUgdmlld1xuICAgICAgLy8gY2FycmllcyBpdHMgZGF0ZSBmaWVsZHM6IHRoZSBsaXN0IGRhdGEgc291cmNlIHByb2plY3RzIHRoZSBjb25maWd1cmVkXG4gICAgICAvLyBjb2x1bW5zLCBhbmQgYGNvdmVyRmllbGRgIHJlYWRzIG9mZiB0aGF0IHByb2plY3Rpb24uXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnaW5kdXN0cnknLCAnYW5udWFsX3JldmVudWUnLCAncGhvbmUnLCAnbG9nbyddLFxuICAgICAgZ2FsbGVyeToge1xuICAgICAgICAvLyBUaGUgY2FyZCBhcnQgdGhpcyB2aWV3IHdhcyBuYW1lZCBmb3IuIFwiQnJhbmRlZCBhY2NvdW50IGNhcmRzXCIgaGFkIGFcbiAgICAgICAgLy8gYnJhbmQgQ09MT1VSIGFuZCBubyBicmFuZCBJTUFHRSBcdTIwMTQgYGNybV9hY2NvdW50LmxvZ29gIGlzIHRoZSBvYmplY3Qnc1xuICAgICAgICAvLyBvbmx5IGltYWdlIGZpZWxkIGFuZCBub3RoaW5nIGRpc3BsYXllZCBpdCwgc28gZXZlcnkgY2FyZCBkcmV3IHRoZVxuICAgICAgICAvLyBzYW1lIGJsYW5rIGNvdmVyLiBgY292ZXJGaXRgIGlzIGxlZnQgdW5zdGF0ZWQ6IHRoZSBzY2hlbWEncyBkZWZhdWx0XG4gICAgICAgIC8vIGlzIHRoZSBjcm9wIHRoZXNlIGNhcmRzIHdhbnQsIGFuZCBtYXRlcmlhbGlzaW5nIGEgZGVmYXVsdCByZXdyaXRlc1xuICAgICAgICAvLyBcInRoZSBhdXRob3Igc2FpZCBub3RoaW5nXCIgaW50byBcInRoZSBhdXRob3IgYXNrZWQgZm9yIHRoaXNcIi5cbiAgICAgICAgY292ZXJGaWVsZDogJ2xvZ28nLFxuICAgICAgICBjYXJkU2l6ZTogJ21lZGl1bScsXG4gICAgICAgIHRpdGxlRmllbGQ6ICduYW1lJyxcbiAgICAgICAgdmlzaWJsZUZpZWxkczogWydpbmR1c3RyeScsICdhbm51YWxfcmV2ZW51ZScsICdudW1iZXJfb2ZfZW1wbG95ZWVzJywgJ3Bob25lJywgJ3dlYnNpdGUnLCAnb3duZXJfaWQnXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdlb3NwYXRpYWwgZGlzdHJpYnV0aW9uLlxuICAgICAqXG4gICAgICogVGhlIGBtYXBgIGJsb2NrIGlzIHdoYXQgQklORFMgdGhlIHZpZXcgdG8gYSBjb29yZGluYXRlIHNvdXJjZS4gV2l0aG91dCBpdFxuICAgICAqIHRoZSByZW5kZXJlciBmYWxscyBiYWNrIHRvIGxpdGVyYWwgZGVmYXVsdCBmaWVsZCBuYW1lcywgd2hpY2ggcmVzb2x2ZSBvblxuICAgICAqIGBjcm1fYWNjb3VudGAgb25seSBieSBsdWNrIFx1MjAxNCB0aGUgdmlldyBkcmF3cyBubyBtYXJrZXIgd2hpbGUgYXV0aG9yaW5nXG4gICAgICogcmVwb3J0cyBzdWNjZXNzIChgdmlldy9sYXlvdXQtd2l0aG91dC1iaW5kaW5nYCkuIGBvZmZpY2VfbG9jYXRpb25gIGlzIHRoZVxuICAgICAqIG9iamVjdCdzIGBGaWVsZC5sb2NhdGlvbiguLi4pYCwgd2hpY2ggaXMgdGhlIG9uZSBmaWVsZCBvbiBgY3JtX2FjY291bnRgXG4gICAgICogY2FycnlpbmcgY29vcmRpbmF0ZXM7IGBiaWxsaW5nX2FkZHJlc3NgIGlzIGFuIGBhZGRyZXNzYCBmaWVsZCBhbmQgaXMgYVxuICAgICAqIHBvc3RhbCBzaGFwZSwgbm90IGEgY29vcmRpbmF0ZSBvbmUsIHNvIGl0IHN0YXlzIGEgY29sdW1uIHJhdGhlciB0aGFuIHRoZVxuICAgICAqIGJpbmRpbmcuIGB0aXRsZUZpZWxkYCBuYW1lcyB0aGUgbWFya2VyIGxhYmVsIFx1MjAxNCBgbmFtZWAsIG5vdCB0aGUgb2JqZWN0J3NcbiAgICAgKiBgbmFtZUZpZWxkYCAoYGRpc3BsYXlfdGl0bGVgKSwgYmVjYXVzZSB0aGUgbWFwJ3Mgb3duIGBjb2x1bW5zYCBzaG93XG4gICAgICogYG5hbWVgIGFuZCB0aGUgdHdvIHNob3VsZCBhZ3JlZS5cbiAgICAgKi9cbiAgICBhY2NvdW50X21hcDoge1xuICAgICAgbmFtZTogJ2FjY291bnRfbWFwJyxcbiAgICAgIHR5cGU6ICdtYXAnLFxuICAgICAgbGFiZWw6ICdBY2NvdW50cyBieSBMb2NhdGlvbicsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2FjY291bnQnIH0sXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnaW5kdXN0cnknLCAnb2ZmaWNlX2xvY2F0aW9uJywgJ2JpbGxpbmdfYWRkcmVzcyddLFxuICAgICAgbWFwOiB7IGxvY2F0aW9uRmllbGQ6ICdvZmZpY2VfbG9jYXRpb24nLCB0aXRsZUZpZWxkOiAnbmFtZScgfSxcbiAgICB9LFxuXG4gICAgLyoqIFRpZXIgYWNjb3VudHM6IEVudGVycHJpc2UgKD49ICQxME0gQVJSKSAqL1xuICAgIGVudGVycHJpc2VfYWNjb3VudHM6IHtcbiAgICAgIG5hbWU6ICdlbnRlcnByaXNlX2FjY291bnRzJyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnRW50ZXJwcmlzZSBBY2NvdW50cycsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2FjY291bnQnIH0sXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnaW5kdXN0cnknLCAnYW5udWFsX3JldmVudWUnLCAnbnVtYmVyX29mX2VtcGxveWVlcycsICdvd25lcl9pZCddLFxuICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ2FubnVhbF9yZXZlbnVlJywgb3BlcmF0b3I6ICdncmVhdGVyX3RoYW5fb3JfZXF1YWwnLCB2YWx1ZTogMTAwMDAwMDAgfV0sXG4gICAgICBzb3J0OiBbeyBmaWVsZDogJ2FubnVhbF9yZXZlbnVlJywgb3JkZXI6ICdkZXNjJyB9XSxcblxuICAgICAgLy8gQURSLTAwNDcgZW5kLXVzZXIgcXVpY2sgZmlsdGVycyAoQWlydGFibGUgXCJVc2VyIGZpbHRlcnNcIiwgRWxlbWVudHM6XG4gICAgICAvLyBkcm9wZG93bnMpLiBgZWxlbWVudDogJ2Ryb3Bkb3duJ2AsIGRlbGliZXJhdGVseSBcdTIwMTQgb24gYW4gb2JqZWN0IGxpc3RcbiAgICAgIC8vIHRoZSB2aWV3IFNXSVRDSEVSIG93bnMgdGhlIHRhYiBiYXIgKGl0IGJ1aWxkcyBvbmUgZW50cnkgcGVyIGBsaXN0YCAvXG4gICAgICAvLyBgbGlzdFZpZXdzYCBkZXNjcmlwdG9yKSwgc28gYSBxdWljay1maWx0ZXIgYmxvY2sgc2hhcGVkIGFzIHRhYnMgaXNcbiAgICAgIC8vIGRyb3BwZWQgdGhlcmU6IHRoZSBjb25zb2xlIGxvZ3MgYGRlZmluZXMgdXNlckZpbHRlcnMgKGVsZW1lbnQ6XG4gICAgICAvLyBcInRhYnNcIiksIHdoaWNoIGFyZSBpZ25vcmVkIG9uIGFuIG9iamVjdCBsaXN0IHZpZXcgKEFEUi0wMDQ3IFwidmlld3NcIlxuICAgICAgLy8gbW9kZSBcdTIwMTQgdGhlIHZpZXcgc3dpdGNoZXIgb3ducyB0aGUgdGFiIGJhciBoZXJlKWAgYW5kIHJlbmRlcnMgbm90aGluZy5cbiAgICAgIC8vIERyb3Bkb3ducyBzaXQgYmVzaWRlIHRoZSBzd2l0Y2hlciBhbmQgYXJlIHVuYWZmZWN0ZWQuXG4gICAgICAvLyBgb3duZXJfaWRgIGlzIHRoZSBwbGF0Zm9ybSBvd25lcnNoaXAgbG9va3VwICgjNTQ4KSBcdTIwMTQgaXQgcmVuZGVycyBhcyBhXG4gICAgICAvLyByZWNvcmQtcGlja2VyIGRyb3Bkb3duLlxuICAgICAgLy8gTk9URTogcmVxdWlyZXMgQG9iamVjdHN0YWNrL3NwZWMgPiA5LjIuMCAoQURSLTAwNDcgVXNlckZpbHRlcnNTY2hlbWEpO1xuICAgICAgLy8gb24gb2xkZXIgc3BlY3MgZGVmaW5lU3RhY2sgc3RyaXBzIHRoaXMgYmxvY2sgXHUyMDE0IGhhcm1sZXNzIG5vLW9wLlxuICAgICAgLi4uKHtcbiAgICAgICAgdXNlckZpbHRlcnM6IHtcbiAgICAgICAgICBlbGVtZW50OiAnZHJvcGRvd24nLFxuICAgICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICAgeyBmaWVsZDogJ2luZHVzdHJ5Jywgc2hvd0NvdW50OiB0cnVlIH0sXG4gICAgICAgICAgICB7IGZpZWxkOiAndHlwZScgfSxcbiAgICAgICAgICAgIHsgZmllbGQ6ICdvd25lcl9pZCcgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICAvLyB0eXBlZCB2aWEgc3ByZWFkLWFzLWFueSB1bnRpbCBAb2JqZWN0c3RhY2svc3BlYyBzaGlwcyBBRFItMDA0N1xuICAgICAgICAvLyAoVXNlckZpbHRlcnNTY2hlbWEgaXMgaW4gZnJhbWV3b3JrIG1haW4sID4gOS4yLjApXG4gICAgICB9IGFzIGFueSksXG4gICAgfSxcblxuICAgIG15X2FjY291bnRzOiB7XG4gICAgICBuYW1lOiAnbXlfYWNjb3VudHMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdNeSBBY2NvdW50cycsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2FjY291bnQnIH0sXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnaW5kdXN0cnknLCAnYW5udWFsX3JldmVudWUnLCAncGhvbmUnLCAnbGFzdF9hY3Rpdml0eV9kYXRlJ10sXG4gICAgICBmaWx0ZXI6IFt7IGZpZWxkOiAnb3duZXJfaWQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiAne2N1cnJlbnRfdXNlcl9pZH0nIH1dLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICdsYXN0X2FjdGl2aXR5X2RhdGUnLCBvcmRlcjogJ2Rlc2MnIH1dLFxuICAgIH0sXG5cbiAgICAvLyBUaGUgYHJlbmV3YWxzX2R1ZWAgdmlldyBpcyBnb25lIHdpdGggdGhlIGZpZWxkcyBpdCB3YXMgYnVpbHQgb24gKCMxMTgxKTpcbiAgICAvLyBib3RoIGl0cyBgaXNfbm90X251bGxgIGZpbHRlciBhbmQgaXRzIHNvcnQga2V5IHdlcmVcbiAgICAvLyBgY3JtX2FjY291bnQubmV4dF9yZW5ld2FsX2RhdGVgLCBzbyB0aGUgdmlldyBjb3VsZCBub3Qgb3V0bGl2ZSB0aGUgZmllbGQuXG4gICAgLy8gTm90aGluZyBpcyBsb3N0IFx1MjAxNCBgY3JtX2NvbnRyYWN0YCBzaGlwcyB0aGUgcmVuZXdhbHMgcXVldWUgdGhhdCB0aGUgZGFpbHlcbiAgICAvLyBzd2VlcCBhY3R1YWxseSBhY3RzIG9uIChgcmVuZXdhbF9jYWxlbmRhcmAsIG92ZXIgYGVuZF9kYXRlYCkuXG5cbiAgICAvKiogQXQtcmlzayBjdXN0b21lcnMgXHUyMDE0IENTTSBhY3Rpb24gcXVldWUgKi9cbiAgICBhdF9yaXNrX2FjY291bnRzOiB7XG4gICAgICBuYW1lOiAnYXRfcmlza19hY2NvdW50cycsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICBsYWJlbDogJ1x1MjZBMFx1RkUwRiBBdC1SaXNrIEFjY291bnRzJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fYWNjb3VudCcgfSxcbiAgICAgIGNvbHVtbnM6IFsnbmFtZScsICd0aWVyJywgJ2hlYWx0aF9zY29yZScsICdzZWdtZW50JywgJ2xhc3RfYWN0aXZpdHlfZGF0ZSddLFxuICAgICAgZmlsdGVyOiBbXG4gICAgICAgIHsgZmllbGQ6ICd0eXBlJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ2N1c3RvbWVyJyB9LFxuICAgICAgICB7IGZpZWxkOiAnaGVhbHRoX3Njb3JlJywgb3BlcmF0b3I6ICdpbicsIHZhbHVlOiBbJ2F0X3Jpc2snLCAnY2h1cm5pbmcnXSB9LFxuICAgICAgXSxcbiAgICAgIHNvcnQ6IFt7IGZpZWxkOiAnaGVhbHRoX3Njb3JlJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICB9LFxuICB9LFxuXG4gIGZvcm06IHtcbiAgICB0eXBlOiAndGFiYmVkJyxcbiAgICBzZWN0aW9uczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAncHJvZmlsZScsXG4gICAgICAgIGxhYmVsOiAnUHJvZmlsZScsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgZmllbGQ6ICduYW1lJywgcmVxdWlyZWQ6IHRydWUsIHNwYW46ICdmdWxsJyB9LFxuICAgICAgICAgICdhY2NvdW50X251bWJlcicsXG4gICAgICAgICAgLy8gYHR5cGVgIChwcm9zcGVjdCAvIGN1c3RvbWVyIC8gcGFydG5lciBcdTIwMjYpIGRyaXZlcyB0aGUgUmVuZXdhbHMgYW5kXG4gICAgICAgICAgLy8gQXQtUmlzayB2aWV3cycgYHR5cGUgPSBjdXN0b21lcmAgZmlsdGVyIFx1MjAxNCB3aXRoIG5vIGZvcm0gZmllbGQgaXRcbiAgICAgICAgICAvLyBjb3VsZCBuZXZlciBiZSBzZXQsIHNvIHRob3NlIHZpZXdzIG1hdGNoZWQgbm90aGluZy5cbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgJ2luZHVzdHJ5JyxcbiAgICAgICAgICAncGhvbmUnLFxuICAgICAgICAgICd3ZWJzaXRlJyxcbiAgICAgICAgICAnb3duZXJfaWQnLFxuICAgICAgICAgICdwYXJlbnRfYWNjb3VudCcsXG4gICAgICAgICAgJ2lzX2FjdGl2ZScsXG4gICAgICAgICAgJ2JyYW5kX2NvbG9yJyxcbiAgICAgICAgICAvLyBUaGUgb3RoZXIgaGFsZiBvZiB0aGUgYGJyYW5kaW5nYCBncm91cC4gV2l0aG91dCBhIGZvcm0gZmllbGQgdGhlcmVcbiAgICAgICAgICAvLyBpcyBubyB1cGxvYWQgY29udHJvbCBhbnl3aGVyZSBpbiB0aGUgYXBwLCBzbyB0aGUgbG9nbyB0aGUgZ2FsbGVyeVxuICAgICAgICAgIC8vIGNhcmRzIG5vdyBjb3ZlciB3aXRoIGNvdWxkIG5ldmVyIGhhdmUgYmVlbiBzZXQuIEZ1bGwgc3BhbjogYW5cbiAgICAgICAgICAvLyBpbWFnZSBkcm9wIHRhcmdldCBpbiBhIGhhbGYtd2lkdGggY2VsbCBpcyBhIHRodW1ibmFpbC1zaXplZCBvbmUuXG4gICAgICAgICAgeyBmaWVsZDogJ2xvZ28nLCBzcGFuOiAnZnVsbCcgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIGBjaGlsZF9hY2NvdW50X3JldmVudWVgIGlzIGEgcm9sbC11cCB0aGUgZW5naW5lIG1haW50YWlucywgc28gaXQgaXNcbiAgICAgICAgLy8gcmVhZC1vbmx5IG9uIHRoZSBmb3JtIGJ5IGNvbnN0cnVjdGlvbiBcdTIwMTQgaXQgaXMgaGVyZSBiZWNhdXNlIGEgaGllcmFyY2h5XG4gICAgICAgIC8vIG5vYm9keSBjYW4gc2VlIHRoZSBlZmZlY3Qgb2YgaXMgdGhlIGRlY29yYXRpb24gdGhpcyBmaWVsZCByZXBsYWNlZC5cbiAgICAgICAgbmFtZTogJ2ZpbmFuY2lhbHMnLFxuICAgICAgICBsYWJlbDogJ0ZpbmFuY2lhbHMnLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFsnYW5udWFsX3JldmVudWUnLCAnbnVtYmVyX29mX2VtcGxveWVlcycsICdjaGlsZF9hY2NvdW50X3JldmVudWUnXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIFRoZSBjdXN0b21lci1zdWNjZXNzIGZpZWxkcyB0aGUgYXRfcmlza19hY2NvdW50cyB2aWV3IGxpc3RzIGFuZFxuICAgICAgICAvLyBmaWx0ZXJzIG9uLiBUaGV5IGV4aXN0ZWQgb24gdGhlIG9iamVjdCBidXQgbm8gZm9ybSBvZmZlcmVkIHRoZW0sIHNvXG4gICAgICAgIC8vIHRoZSBDUyB3b3JraW5nIHF1ZXVlIHN0YXllZCBwZXJtYW5lbnRseSBlbXB0eS4gKGByZW5ld2FsX293bmVyYCBhbmRcbiAgICAgICAgLy8gYG5leHRfcmVuZXdhbF9kYXRlYCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGlzIHNlY3Rpb24gd2l0aCB0aGUgZmllbGRzXG4gICAgICAgIC8vIHRoZW1zZWx2ZXMgXHUyMDE0ICMxMTgxLilcbiAgICAgICAgbmFtZTogJ2N1c3RvbWVyX3N1Y2Nlc3MnLFxuICAgICAgICBsYWJlbDogJ0N1c3RvbWVyIFN1Y2Nlc3MnLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFsndGllcicsICdzZWdtZW50JywgJ2hlYWx0aF9zY29yZSddLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2xvY2F0aW9ucycsXG4gICAgICAgIGxhYmVsOiAnTG9jYXRpb25zJyxcbiAgICAgICAgY29sdW1uczogMSxcbiAgICAgICAgLy8gYGJpbGxpbmdfY291bnRyeWAgYW5kIGB0ZXJyaXRvcnlgIGFyZSByZWFkb25seSBhbmQgZGVyaXZlZCwgYnV0IGJvdGhcbiAgICAgICAgLy8gYXJlIG9uIHRoZSBmb3JtIG9uIHB1cnBvc2U6IGFuIGFkbWluIGFza2luZyBcIndoeSBkb2VzIHRoZSBOQSB0ZWFtIG5vdFxuICAgICAgICAvLyBzZWUgdGhpcyBhY2NvdW50P1wiIHJlYWRzIHRoZSBhbnN3ZXIgb2ZmIHRoZSByZWNvcmQgaW5zdGVhZCBvZlxuICAgICAgICAvLyBndWVzc2luZyBhdCB0aGUgYWRkcmVzcyBibG9iICgjNjIxKS4gYHRlcnJpdG9yeWAgaXMgd2hhdCB0aGUgcnVsZXNcbiAgICAgICAgLy8gYWN0dWFsbHkgbWF0Y2ggKCM2MzkpIGFuZCBgYmlsbGluZ19jb3VudHJ5YCBpcyB0aGUgaW5wdXQgaXQgd2FzXG4gICAgICAgIC8vIGNsYXNzaWZpZWQgZnJvbSwgc28gdGhlIHR3byB0b2dldGhlciBzaG93IHRoZSB3aG9sZSBkZXJpdmF0aW9uIFx1MjAxNFxuICAgICAgICAvLyBpbmNsdWRpbmcgdGhlIGNhc2UgdGhlIHBpY2tsaXN0IGFsb25lIGNhbm5vdCBleHBsYWluLCBhbiBhY2NvdW50XG4gICAgICAgIC8vIHNpdHRpbmcgaW4gYE90aGVyYCBiZWNhdXNlIGl0cyBjb3VudHJ5IHdhcyB0eXBlZCBpbiBhIHNwZWxsaW5nIHRoZVxuICAgICAgICAvLyBtYXBwaW5nIGRvZXMgbm90IGtub3cuXG4gICAgICAgIGZpZWxkczogWydiaWxsaW5nX2FkZHJlc3MnLCAnYmlsbGluZ19jb3VudHJ5JywgJ3RlcnJpdG9yeScsICdvZmZpY2VfbG9jYXRpb24nXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdkZXNjcmlwdGlvbicsXG4gICAgICAgIGxhYmVsOiAnRGVzY3JpcHRpb24nLFxuICAgICAgICBjb2x1bW5zOiAxLFxuICAgICAgICBmaWVsZHM6IFsnZGVzY3JpcHRpb24nXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3MvY29udGFjdC52aWV3LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzL2NvbnRhY3Qudmlldy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBDb250YWN0IFZpZXdzXG4gKlxuICogICBcdTIwMjIgZ3JpZCAgICBcdTIwMTQgcHJpbWFyeSByb3N0ZXIgd2l0aCBhdmF0YXJcbiAqICAgXHUyMDIyIGdhbGxlcnkgXHUyMDE0IHBlb3BsZSBkaXJlY3RvcnkgY2FyZHMgKGF2YXRhciBhcyBjb3ZlcilcbiAqL1xuZXhwb3J0IGNvbnN0IENvbnRhY3RWaWV3cyA9IGRlZmluZVZpZXcoe1xuICBsaXN0OiB7XG4gICAgdHlwZTogJ2dyaWQnLFxuICAgIG5hbWU6ICdhbGxfY29udGFjdHMnLFxuICAgIGxhYmVsOiAnQWxsIENvbnRhY3RzJyxcbiAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9jb250YWN0JyB9LFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICdhdmF0YXInLCB3aWR0aDogNjQsIGFsaWduOiAnY2VudGVyJyB9LFxuICAgICAgeyBmaWVsZDogJ2ZpcnN0X25hbWUnLCB3aWR0aDogMTQwLCBzb3J0YWJsZTogdHJ1ZSwgbGluazogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ2xhc3RfbmFtZScsIHdpZHRoOiAxNDAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAnY3JtX2FjY291bnQnLCB3aWR0aDogMjAwIH0sXG4gICAgICB7IGZpZWxkOiAndGl0bGUnLCB3aWR0aDogMTgwIH0sXG4gICAgICB7IGZpZWxkOiAnZGVwYXJ0bWVudCcsIHdpZHRoOiAxNDAgfSxcbiAgICAgIC8vIFJFUS0wMDA0IGFjY2VwdGFuY2UgMjogdGhlIHRocmVlIGJ1eWluZy1jZW50cmUgYXR0cmlidXRlcyBhcmUgY29sdW1uc1xuICAgICAgLy8gb24gdGhlIGxhbmRpbmcgcm9zdGVyLCB3aGljaCBpcyBhbHJlYWR5IGdyb3VwZWQgYnkgYWNjb3VudCB3aXRoIHRoZVxuICAgICAgLy8gZ3JvdXBzIGNvbGxhcHNlZCBcdTIwMTQgc28gZXhwYW5kaW5nIG9uZSBhY2NvdW50IHJlYWRzIGFzIGEgTUFQICh3aG9cbiAgICAgIC8vIGRlY2lkZXMsIHdobyBpcyBvbiBvdXIgc2lkZSkgaW5zdGVhZCBvZiBhIGRpcmVjdG9yeS4gQ29sdW1ucyBhcmUgYWxzb1xuICAgICAgLy8gd2hhdCB0aGUgbGlzdCdzIG93biBmaWx0ZXIgYW5kIGdyb3VwaW5nIGNvbnRyb2xzIG9mZmVyLlxuICAgICAgeyBmaWVsZDogJ2J1eWluZ19mdW5jdGlvbicsIHdpZHRoOiAxNjAgfSxcbiAgICAgIHsgZmllbGQ6ICdhdHRpdHVkZScsIHdpZHRoOiAxNDAgfSxcbiAgICAgIHsgZmllbGQ6ICdyZWxhdGlvbnNoaXBfc3RyZW5ndGgnLCB3aWR0aDogMTgwIH0sXG4gICAgICB7IGZpZWxkOiAnZW1haWwnLCB3aWR0aDogMjIwIH0sXG4gICAgICB7IGZpZWxkOiAncGhvbmUnLCB3aWR0aDogMTUwIH0sXG4gICAgICB7IGZpZWxkOiAnb3duZXJfaWQnLCB3aWR0aDogMTUwIH0sXG4gICAgXSxcbiAgICBzb3J0OiBbeyBmaWVsZDogJ2xhc3RfbmFtZScsIG9yZGVyOiAnYXNjJyB9XSxcbiAgICBncm91cGluZzogeyBmaWVsZHM6IFt7IGZpZWxkOiAnY3JtX2FjY291bnQnLCBvcmRlcjogJ2FzYycsIGNvbGxhcHNlZDogdHJ1ZSB9XSB9LFxuICAgIHNlbGVjdGlvbjogeyB0eXBlOiAnbXVsdGlwbGUnIH0sXG4gICAgLy8gVGhlIHNlbGVjdGlvbi1iYXIgZW50cnkgcG9pbnQgZm9yIGNhbXBhaWduaW5nIGF0IGV4aXN0aW5nIGN1c3RvbWVyc1xuICAgIC8vICgjNTk3KSwgbWlycm9yaW5nIGBidWxrQWN0aW9uczogWydjcmVhdGVfY2FtcGFpZ24nXWAgb24gdGhlIGxlYWQgZ3JpZC5cbiAgICAvLyBUaGUgYmFyZS1zdHJpbmcgZm9ybSBmYW5zIHRoZSBhY3Rpb24gb3V0IG9uY2UgcGVyIHNlbGVjdGVkIHJvdzsgZG8gbm90XG4gICAgLy8gYWRkIHN0cmluZ3MgZm9yIGBtYXJrX3ByaW1hcnlgIC8gYHNlbmRfZW1haWxgLCB3aGljaCBkZWNsYXJlXG4gICAgLy8gYGxvY2F0aW9uczogWydsaXN0X2l0ZW0nXWAgYW5kIGFyZSBhdXRvLWluamVjdGVkIGludG8gdGhlIHJvdyBtZW51LlxuICAgIGJ1bGtBY3Rpb25zOiBbJ2FkZF9jb250YWN0X3RvX2NhbXBhaWduJ10sXG4gICAgcGFnaW5hdGlvbjogeyBwYWdlU2l6ZTogNTAsIHBhZ2VTaXplT3B0aW9uczogWzI1LCA1MCwgMTAwXSB9LFxuICAgIGV4cG9ydE9wdGlvbnM6IHsgZm9ybWF0czogWydjc3YnLCAneGxzeCddIH0sXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnLCAnZ2FsbGVyeSddLFxuICAgIH0sXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgLyoqIFBlb3BsZSBkaXJlY3RvcnkgKi9cbiAgICBjb250YWN0X2RpcmVjdG9yeToge1xuICAgICAgbmFtZTogJ2NvbnRhY3RfZGlyZWN0b3J5JyxcbiAgICAgIHR5cGU6ICdnYWxsZXJ5JyxcbiAgICAgIGxhYmVsOiAnUGVvcGxlIERpcmVjdG9yeScsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2NvbnRhY3QnIH0sXG4gICAgICBjb2x1bW5zOiBbJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgJ3RpdGxlJywgJ2VtYWlsJ10sXG4gICAgICBnYWxsZXJ5OiB7XG4gICAgICAgIGNvdmVyRmllbGQ6ICdhdmF0YXInLFxuICAgICAgICBjb3ZlckZpdDogJ2NvdmVyJyxcbiAgICAgICAgY2FyZFNpemU6ICdzbWFsbCcsXG4gICAgICAgIHRpdGxlRmllbGQ6ICdsYXN0X25hbWUnLFxuICAgICAgICB2aXNpYmxlRmllbGRzOiBbJ2ZpcnN0X25hbWUnLCAndGl0bGUnLCAnZGVwYXJ0bWVudCcsICdlbWFpbCcsICdwaG9uZScsICdjcm1fYWNjb3VudCddLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgcHJpbWFyeV9jb250YWN0czoge1xuICAgICAgbmFtZTogJ3ByaW1hcnlfY29udGFjdHMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdQcmltYXJ5IENvbnRhY3RzJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fY29udGFjdCcgfSxcbiAgICAgIGNvbHVtbnM6IFsnZmlyc3RfbmFtZScsICdsYXN0X25hbWUnLCAnY3JtX2FjY291bnQnLCAndGl0bGUnLCAnZW1haWwnLCAncGhvbmUnXSxcbiAgICAgIGZpbHRlcjogW3sgZmllbGQ6ICdpc19wcmltYXJ5Jywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogdHJ1ZSB9XSxcbiAgICAgIHNvcnQ6IFt7IGZpZWxkOiAnY3JtX2FjY291bnQnLCBvcmRlcjogJ2FzYycgfV0sXG4gICAgfSxcbiAgfSxcblxuICBmb3JtOiB7XG4gICAgdHlwZTogJ3RhYmJlZCcsXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2lkZW50aXR5JyxcbiAgICAgICAgbGFiZWw6ICdJZGVudGl0eScsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICdzYWx1dGF0aW9uJyxcbiAgICAgICAgICB7IGZpZWxkOiAnZmlyc3RfbmFtZScsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ2xhc3RfbmFtZScsIHJlcXVpcmVkOiB0cnVlLCBzcGFuOiAnZnVsbCcgfSxcbiAgICAgICAgICB7IGZpZWxkOiAnY3JtX2FjY291bnQnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICd0aXRsZScsXG4gICAgICAgICAgJ2RlcGFydG1lbnQnLFxuICAgICAgICAgICdvd25lcl9pZCcsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBSRVEtMDAwNCBhY2NlcHRhbmNlIDE6IHRoZSBidXlpbmctY2VudHJlIGdyb3VwIGlzIHJlbmRlcmVkIEZST01cbiAgICAgICAgLy8gYGZpZWxkR3JvdXBzYCwgd2l0aCBubyBwZXItZmllbGQgZW51bWVyYXRpb24gYXV0aG9yZWQgYW55d2hlcmUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFRoaXMgZm9ybSBhdXRob3JzIGBzZWN0aW9uc2AsIGFuZCBhbiBhdXRob3JlZCBgc2VjdGlvbnNgIGFycmF5IHdpbnNcbiAgICAgICAgLy8gb3V0cmlnaHQgb3ZlciB0aGUgcmVuZGVyZXIncyBgZmllbGRHcm91cHNgIGF1dG8tZGVyaXZhdGlvbiAodGhlXG4gICAgICAgIC8vIG1lY2hhbmlzbSBpcyB3cml0dGVuIHVwIGF0IGxlbmd0aCBpbiBgY2FzZS52aWV3LnRzYCksIHNvIGEgZ3JvdXBcbiAgICAgICAgLy8gZGVjbGFyZWQgb24gdGhlIG9iamVjdCBhbG9uZSB3b3VsZCByZWFjaCB0aGUgU1lOVEhFU0laRUQgZGV0YWlsXG4gICAgICAgIC8vIHBhZ2UgYW5kIG5ldmVyIHRoaXMgZm9ybSBcdTIwMTQgd2hpY2ggaXMgYWxzbyB0aGUgY3JlYXRlIGRpYWxvZy4gVGhlXG4gICAgICAgIC8vIGdyb3VwLXJlZmVyZW5jZSBmb3JtIGlzIHJ1bmcgMiBvZiB0aGUgQUdFTlRTLm1kIGxhZGRlciwgZm9yIGV4YWN0bHlcbiAgICAgICAgLy8gdGhpcyBcInBhcnRpYWwgYXJyYW5nZW1lbnQgaXMgZ2VudWluZWx5IG5lZWRlZFwiIGNhc2U6IGBncm91cDpgXG4gICAgICAgIC8vIGluaGVyaXRzIHRoZSBvYmplY3QncyBgYnV5aW5nX2NlbnRyZWAgbWVtYmVycyAoZXZlcnkgZmllbGQgcG9pbnRpbmdcbiAgICAgICAgLy8gYXQgaXQsIGluIGRlY2xhcmF0aW9uIG9yZGVyKSBhbmQgaXRzIHByZXNlbnRhdGlvbiwgc28gYWRkaW5nIGFcbiAgICAgICAgLy8gZm91cnRoIGF0dHJpYnV0ZSB0byB0aGUgZ3JvdXAgbGF0ZXIgcmVhY2hlcyB0aGlzIGZvcm0gYnkgaXRzZWxmLlxuICAgICAgICAvL1xuICAgICAgICAvLyBcdTI2RDQgYGdyb3VwOmAgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGZpZWxkczpgIGFuZCB3aXRoIGV2ZXJ5IGtleVxuICAgICAgICAvLyB0aGUgZ3JvdXAgaXRzZWxmIGRlY2xhcmVzIChgbmFtZWAsIGBsYWJlbGAsIGBkZXNjcmlwdGlvbmAsXG4gICAgICAgIC8vIGB2aXNpYmxlV2hlbmAsIGBjb2xsYXBzaWJsZWAvYGNvbGxhcHNlZDogdHJ1ZWApIFx1MjAxNCBgY29sdW1uc2AgaXMgbm90XG4gICAgICAgIC8vIG9uZSBvZiB0aG9zZSwgYmVjYXVzZSB0aGUgZ3JvdXAgZGVjbGFyZXMgbm90aGluZyBhYm91dCBsYXlvdXQuXG4gICAgICAgIGdyb3VwOiAnYnV5aW5nX2NlbnRyZScsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBOYW1lZCBgY29udGFjdF9kZXRhaWxzYCwgbm90IGBjb250YWN0X2luZm9gIFx1MjAxNCBgY29udGFjdF9pbmZvYCBpc1xuICAgICAgICAvLyBhbHJlYWR5IGEgZGlzdGluY3QgZmllbGRHcm91cCBrZXkgb24gYGNybV9jb250YWN0YCAoXCJDb250YWN0XG4gICAgICAgIC8vIEluZm9ybWF0aW9uXCIpLCBhbmQgcmV1c2luZyBpdCBoZXJlIHdvdWxkIG1ha2UgdGhpcyBzZWN0aW9uJ3NcbiAgICAgICAgLy8gdHJhbnNsYXRlZCBoZWFkaW5nIGZvbGxvdyB0aGF0IGdyb3VwJ3Mgd29yZGluZyBpbnN0ZWFkIG9mIGl0cyBvd25cbiAgICAgICAgLy8gXCJDb250YWN0IEluZm9cIi5cbiAgICAgICAgbmFtZTogJ2NvbnRhY3RfZGV0YWlscycsXG4gICAgICAgIGxhYmVsOiAnQ29udGFjdCBJbmZvJyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbJ2VtYWlsJywgJ3Bob25lJywgJ21vYmlsZScsICdhdmF0YXInXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIE5hbWVkIGBtYWlsaW5nX2FkZHJlc3NgIFx1MjAxNCBkZWxpYmVyYXRlbHkgdGhlIFNBTUUga2V5IGFzIHRoZVxuICAgICAgICAvLyBgbWFpbGluZ19hZGRyZXNzYCBmaWVsZEdyb3VwIG9uIGBjcm1fY29udGFjdGAsIHdoaWNoIGlzIHRoZSBvcHBvc2l0ZVxuICAgICAgICAvLyBjYWxsIGZyb20gdGhlIHR3byBzZWN0aW9ucyBlaXRoZXIgc2lkZSBvZiBpdCBhbmQgZm9yIHRoZSBzYW1lXG4gICAgICAgIC8vIHJlYXNvbi4gUmV1c2luZyBhIGdyb3VwIGtleSBtYWtlcyB0aGUgc2VjdGlvbidzIHRyYW5zbGF0ZWQgaGVhZGluZ1xuICAgICAgICAvLyBmb2xsb3cgdGhhdCBncm91cCdzIHdvcmRpbmc7IGBjb250YWN0X2RldGFpbHNgIGFuZFxuICAgICAgICAvLyBgY29tbV9wcmVmZXJlbmNlc2Agd2FudGVkIHRoZWlyIG93biBzaG9ydGVyIHdvcmRpbmcsIHNvIHRoZXkgaGFkIHRvXG4gICAgICAgIC8vIGF2b2lkIHRoZSBjb2xsaXNpb24uIFRoaXMgc2VjdGlvbiB3YW50cyBleGFjdGx5IHRoZSBncm91cCdzIHdvcmRpbmdcbiAgICAgICAgLy8gKFwiTWFpbGluZyBBZGRyZXNzXCIpLCB3aGljaCBldmVyeSBsb2NhbGUgYWxyZWFkeSBjYXJyaWVzIHVuZGVyXG4gICAgICAgIC8vIGBvYmplY3RzLmNybV9jb250YWN0Ll9zZWN0aW9ucy5tYWlsaW5nX2FkZHJlc3NgLCBzbyB0aGUgY29sbGlzaW9uIGlzXG4gICAgICAgIC8vIHRoZSBmZWF0dXJlOiBvbmUgaGVhZGluZywgb25lIHRyYW5zbGF0aW9uLCBmb3VyIGxvY2FsZXMsIG5vIG5ldyByb3cuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdoeSB0aGUgc2VjdGlvbiBleGlzdHMgYXQgYWxsOiBhbiBhdXRob3JlZCBgc2VjdGlvbnNgIGFycmF5IHdpbnNcbiAgICAgICAgLy8gb3V0cmlnaHQgb3ZlciB0aGUgcmVuZGVyZXIncyBgZmllbGRHcm91cHNgIGF1dG8tZGVyaXZhdGlvbiAodGhlXG4gICAgICAgIC8vIG1lY2hhbmlzbSBpcyB3cml0dGVuIHVwIGF0IGxlbmd0aCBpbiBgY2FzZS52aWV3LnRzYCksIGFuZCB0aGlzIGZvcm1cbiAgICAgICAgLy8gaXMgYWxzbyB0aGUgQ1JFQVRFIGRpYWxvZy4gV2l0aG91dCB0aGlzIHNlY3Rpb24gdGhlIGFkZHJlc3Mgd2FzXG4gICAgICAgIC8vIHJlYWRhYmxlIG9uIHRoZSBTWU5USEVTSVpFRCBkZXRhaWwgcGFnZSBcdTIwMTQgd2hpY2ggZG9lcyBkZXJpdmUgZnJvbVxuICAgICAgICAvLyBgZmllbGRHcm91cHNgIFx1MjAxNCB3aGlsZSBubyBmb3JtIGluIHRoZSBhcHAgY291bGQgZW50ZXIgb3IgZWRpdCBpdCxcbiAgICAgICAgLy8gZXZlbiB0aG91Z2ggYGNvbnRhY3RfaW1wb3J0Lm1hcHBpbmcudHNgIHdyaXRlcyBpdCBmcm9tIHRoZSBzaGlwcGVkXG4gICAgICAgIC8vIENTViB0ZW1wbGF0ZS4gVGhpcyB0YWIgaXMgdGhlIGF1dGhvcmluZyBoYWxmIG9mIHRoZSBpbXBvcnQgcGF0aC5cbiAgICAgICAgbmFtZTogJ21haWxpbmdfYWRkcmVzcycsXG4gICAgICAgIGxhYmVsOiAnTWFpbGluZyBBZGRyZXNzJyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgLy8gT25lIHN0cnVjdHVyZWQgYGFkZHJlc3NgIGZpZWxkOyBmdWxsIHdpZHRoLCBzbyBpdHMgcGFydHMgbGF5IG91dFxuICAgICAgICAgIC8vIGFzIGEgdW5pdCByYXRoZXIgdGhhbiBpbiBoYWxmIGEgZ3JpZCBjb2x1bW4uXG4gICAgICAgICAgeyBmaWVsZDogJ21haWxpbmdfYWRkcmVzcycsIHNwYW46ICdmdWxsJyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gTmFtZWQgYGNvbW1fcHJlZmVyZW5jZXNgLCBub3QgYHByZWZlcmVuY2VzYCBcdTIwMTQgYHByZWZlcmVuY2VzYCBpc1xuICAgICAgICAvLyBhbHJlYWR5IGEgZGlzdGluY3QgZmllbGRHcm91cCBrZXkgb24gYGNybV9jb250YWN0YCAoXCJDb21tdW5pY2F0aW9uXG4gICAgICAgIC8vIFByZWZlcmVuY2VzXCIpLCBhbmQgcmV1c2luZyBpdCBoZXJlIHdvdWxkIG1ha2UgdGhpcyBzZWN0aW9uJ3NcbiAgICAgICAgLy8gdHJhbnNsYXRlZCBoZWFkaW5nIGZvbGxvdyB0aGF0IGdyb3VwJ3Mgd29yZGluZyBpbnN0ZWFkIG9mIGl0cyBvd25cbiAgICAgICAgLy8gXCJQcmVmZXJlbmNlc1wiLlxuICAgICAgICBuYW1lOiAnY29tbV9wcmVmZXJlbmNlcycsXG4gICAgICAgIGxhYmVsOiAnUHJlZmVyZW5jZXMnLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFsnbGVhZF9zb3VyY2UnLCAnaXNfcHJpbWFyeScsICdkb19ub3RfY2FsbCcsICdlbWFpbF9vcHRfb3V0J10sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzL29wcG9ydHVuaXR5LnZpZXcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3Mvb3Bwb3J0dW5pdHkudmlldy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBPcHBvcnR1bml0eSBWaWV3c1xuICpcbiAqIFNhbGVzIHBpcGVsaW5lIGJlbmVmaXRzIGZyb20gbXVsdGlwbGUgdmlzdWFsaXNhdGlvbnM6XG4gKiAgIFx1MjAyMiBncmlkICAgICBcdTIwMTQgZnVsbCBwaXBlbGluZSBicm93c2luZyAmIGlubGluZSBlZGl0c1xuICogICBcdTIwMjIga2FuYmFuICAgXHUyMDE0IGRyYWctYW5kLWRyb3AgcGlwZWxpbmUgc3RhZ2UgbWFuYWdlbWVudCAoZ3JvdXAgYnkgc3RhZ2UpXG4gKiAgIFx1MjAyMiBjYWxlbmRhciBcdTIwMTQgY2xvc2UtZGF0ZSBmb3JlY2FzdGluZyBvbiBhIG1vbnRobHkgdmlld1xuICogICBcdTIwMjIgdGltZWxpbmUgXHUyMDE0IGNocm9ub2xvZ2ljYWwgZGVhbCBmbG93IGdyb3VwZWQgYnkgb3duZXJcbiAqICAgXHUyMDIyIGdhbGxlcnkgIFx1MjAxNCBwaW5ib2FyZCAvIGV4ZWN1dGl2ZSByZXZpZXcgY2FyZHNcbiAqL1xuZXhwb3J0IGNvbnN0IE9wcG9ydHVuaXR5Vmlld3MgPSBkZWZpbmVWaWV3KHtcbiAgLy8gVGhlIGxhbmRpbmcgdmlldyBpcyBPUEVOIGRlYWxzLCBub3QgZXZlcnkgZGVhbCBldmVyIHJlY29yZGVkLlxuICAvL1xuICAvLyBTb3J0ZWQgYnkgY2xvc2VfZGF0ZSBhc2NlbmRpbmcgYW5kIHVuZmlsdGVyZWQsIFwiQWxsIE9wcG9ydHVuaXRpZXNcIiBvcGVuZWRcbiAgLy8gb24gc2V0dGxlZCBoaXN0b3J5OiB0aGUgZmlyc3Qgc2NyZWVuIHdhcyA3IGNsb3NlZC13b24gYW5kIDQgY2xvc2VkLWxvc3RcbiAgLy8gcmVjb3JkcywgYW5kIGEgcmVwIGhhZCB0byBzY3JvbGwgcGFzdCBtb250aHMgb2YgZmluaXNoZWQgYnVzaW5lc3MgdG8gcmVhY2hcbiAgLy8gYW55dGhpbmcgdGhleSBjb3VsZCBzdGlsbCBhY3Qgb24uIFRoZSBmdWxsIHVuZmlsdGVyZWQgbGlzdCBpcyBzdGlsbCBvbmVcbiAgLy8gY2xpY2sgYXdheSBvbiB0aGUgXCJBbGwgT3Bwb3J0dW5pdGllc1wiIHRhYi5cbiAgbGlzdDoge1xuICAgIHR5cGU6ICdncmlkJyxcbiAgICBuYW1lOiAnb3Blbl9vcHBvcnR1bml0aWVzJyxcbiAgICBsYWJlbDogJ09wZW4gRGVhbHMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX29wcG9ydHVuaXR5JyB9LFxuICAgIGZpbHRlcjogW1xuICAgICAgeyBmaWVsZDogJ3N0YWdlJywgb3BlcmF0b3I6ICdub3RfaW4nLCB2YWx1ZTogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfSxcbiAgICBdLFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICduYW1lJywgd2lkdGg6IDIyMCwgc29ydGFibGU6IHRydWUsIGxpbms6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdjcm1fYWNjb3VudCcsIGxhYmVsOiAnQWNjb3VudCcsIHdpZHRoOiAxODAgfSxcbiAgICAgIHsgZmllbGQ6ICdzdGFnZScsIHdpZHRoOiAxNDAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAnYW1vdW50Jywgd2lkdGg6IDE0MCwgYWxpZ246ICdyaWdodCcsIHNvcnRhYmxlOiB0cnVlLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgeyBmaWVsZDogJ3Byb2JhYmlsaXR5Jywgd2lkdGg6IDExMCwgYWxpZ246ICdyaWdodCcgfSxcbiAgICAgIHsgZmllbGQ6ICdleHBlY3RlZF9yZXZlbnVlJywgd2lkdGg6IDE2MCwgYWxpZ246ICdyaWdodCcsIHN1bW1hcnk6ICdzdW0nIH0sXG4gICAgICB7IGZpZWxkOiAnY2xvc2VfZGF0ZScsIHdpZHRoOiAxNDAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgXSxcbiAgICBzb3J0OiBbeyBmaWVsZDogJ2Nsb3NlX2RhdGUnLCBvcmRlcjogJ2FzYycgfV0sXG4gICAgcm93Q29sb3I6IHtcbiAgICAgIGZpZWxkOiAnc3RhZ2UnLFxuICAgICAgY29sb3JzOiB7XG4gICAgICAgIHByb3NwZWN0aW5nOiAnc2xhdGUnLFxuICAgICAgICBxdWFsaWZpY2F0aW9uOiAnc2t5JyxcbiAgICAgICAgLy8gVGVhbCBzaXRzIGJldHdlZW4gdGhlIGNvb2wgcXVhbGlmaWNhdGlvbiBibHVlIGFuZCB0aGUgd2FybSBwcm9wb3NhbFxuICAgICAgICAvLyBhbWJlciwga2VlcGluZyB0aGUgY29vbFx1MjE5Mndhcm0gZnVubmVsIHJhbXAgcmVhZGFibGUuIE5PVCB0aGUgZ29sZFxuICAgICAgICAvLyBgI0ZGRDcwMGAgdGhpcyBvcHRpb24gY2FycmllcyBpbiBgX3BpY2tsaXN0cy50c2A6IGdvbGQgaXMgb25lIGh1ZVxuICAgICAgICAvLyBzdGVwIGZyb20gcHJvcG9zYWwncyBhbWJlciwgc28gdGhlIHR3byBhZGphY2VudCBzdGFnZXMgd291bGQgdGludFxuICAgICAgICAvLyByb3dzIHRoZSBzYW1lLlxuICAgICAgICAvL1xuICAgICAgICAvLyBWYWx1ZXMgYXJlIGNvbG91ciBOQU1FUywgbm90IGhleDogb2JqZWN0dWkncyBgdXNlUm93Q29sb3JgIHJlc29sdmVzXG4gICAgICAgIC8vIG9ubHkgYSBuYW1lIGZyb20gaXRzIG93biB2b2NhYnVsYXJ5IChvciBhIGZ1bGwgYGJnLSpgIGNsYXNzKSBhbmRcbiAgICAgICAgLy8gdHVybnMgYSBoZXggaW50byBubyBjb2xvdXIgYXQgYWxsIFx1MjAxNCBzbyB1bnRpbCAxNy42LjAncyBsaW50IHNhaWQgc28sXG4gICAgICAgIC8vIHRoaXMgbWFwIHRpbnRlZCBub3RoaW5nLlxuICAgICAgICBuZWVkc19hbmFseXNpczogJ3RlYWwnLFxuICAgICAgICBwcm9wb3NhbDogJ2FtYmVyJyxcbiAgICAgICAgbmVnb3RpYXRpb246ICdwdXJwbGUnLFxuICAgICAgICBjbG9zZWRfd29uOiAnZ3JlZW4nLFxuICAgICAgICBjbG9zZWRfbG9zdDogJ3JlZCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAgcGFnaW5hdGlvbjogeyBwYWdlU2l6ZTogMjUsIHBhZ2VTaXplT3B0aW9uczogWzI1LCA1MCwgMTAwXSB9LFxuICAgIHNlbGVjdGlvbjogeyB0eXBlOiAnbXVsdGlwbGUnIH0sXG4gICAgc2hvd1JlY29yZENvdW50OiB0cnVlLFxuICAgIGV4cG9ydE9wdGlvbnM6IHsgZm9ybWF0czogWydjc3YnLCAneGxzeCddIH0sXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnLCAna2FuYmFuJywgJ2NhbGVuZGFyJywgJ3RpbWVsaW5lJywgJ2dhbGxlcnknXSxcbiAgICB9LFxuICAgIC8vIEJpbmRzIHRoZSAnY2FsZW5kYXInIGVudHJ5IGFib3ZlOiB0aGUgc2FtZSBmb3JlY2FzdCBkYXRlcyB0aGUgZGVkaWNhdGVkXG4gICAgLy8gYGNsb3NlX2RhdGVfY2FsZW5kYXJgIHZpZXcgc2hvd3MsIG9uIHRoZSBmaWVsZCB0aGlzIGxpc3Qgc29ydHMgYnkuXG4gICAgLy8gYGNsb3NlX2RhdGVgIGlzIHJlcXVpcmVkICsgbm90TnVsbCBvbiBjcm1fb3Bwb3J0dW5pdHkuXG4gICAgY2FsZW5kYXI6IHtcbiAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnY2xvc2VfZGF0ZScsXG4gICAgICB0aXRsZUZpZWxkOiAnbmFtZScsXG4gICAgICBjb2xvckZpZWxkOiAnc3RhZ2UnLFxuICAgIH0sXG4gICAgLy8gTGlzdC1sZXZlbCBlbnRyeSBwb2ludHM6IGdlbmVyYXRlX3F1b3RlIHJlYWNoZXMgdGhlIHJvdyBtZW51IHZpYSBpdHNcbiAgICAvLyBvd24gYGxvY2F0aW9uczogWydsaXN0X2l0ZW0nXWAuIEJ1aWx0LWluIGBleHBvcnRPcHRpb25zYCBjb3ZlcnMgQ1NWXG4gICAgLy8gZXhwb3J0LlxuICAgIC8vXG4gICAgLy8gYG1hc3NfdXBkYXRlX3N0YWdlYCBpcyB3aXJlZCBhcyBhbiBBR0dSRUdBVEUgYnVsayBkZWYsIG5vdCBhcyBhIGJhcmVcbiAgICAvLyBgYnVsa0FjdGlvbnM6IFsnbWFzc191cGRhdGVfc3RhZ2UnXWAgc3RyaW5nICgjNTA4KS4gVGhlIHR3byBmb3JtcyBhcmVcbiAgICAvLyBkaWZmZXJlbnQgZGlzcGF0Y2ggY29udHJhY3RzLCBhbmQgb25seSB0aGlzIG9uZSBtb3ZlcyBhIHdob2xlIHNlbGVjdGlvbjpcbiAgICAvL1xuICAgIC8vICAgLSBiYXJlIHN0cmluZyAgXHUyMTkyIHBlci1yZWNvcmQgZmFuLW91dDogdGhlIGFjdGlvbiBpcyBkaXNwYXRjaGVkIE9OQ0UgUEVSXG4gICAgLy8gICAgIHNlbGVjdGVkIHJvdyB3aXRoIGByZWNvcmRJZGAgc2V0LiBOIHJlcXVlc3RzLCBOIHN0YWdlIG1vdmVzLlxuICAgIC8vICAgLSBhZ2dyZWdhdGUgZGVmIFx1MjE5MiBPTkUgZGlzcGF0Y2ggZm9yIHRoZSB3aG9sZSBzZWxlY3Rpb24sIGNhcnJ5aW5nIGV2ZXJ5XG4gICAgLy8gICAgIGlkIGluIHRoZSBidWlsdGluIGBwYXJhbXMuX3NlbGVjdGVkSWRzYCBhbmQgbm8gYHJlY29yZElkYC4gT25lXG4gICAgLy8gICAgIHJlcXVlc3QsIE4gc3RhZ2UgbW92ZXMsIG9uZSBhdWRpdCBlbnRyeS5cbiAgICAvL1xuICAgIC8vIEFnZ3JlZ2F0ZSBpcyB0aGUgcmlnaHQgc2hhcGUgaGVyZSBiZWNhdXNlIHRoZSBib2R5IGFscmVhZHkgbG9vcHMgb3ZlciB0aGVcbiAgICAvLyBzZWxlY3Rpb24gaXRzZWxmLCBhbmQgYmVjYXVzZSB0aGUgcnVuIGlzIGFsbC1vci1ub3RoaW5nOiBhIHBhcnRpYWwgcmVzdWx0XG4gICAgLy8gcmVqZWN0cyBpbnN0ZWFkIG9mIGxlYXZpbmcgdGhlIGJhciByZXBvcnRpbmcgcGVyLXJvdyBzdWNjZXNzIGl0IGNhbm5vdFxuICAgIC8vIGhvbm91ciAoc2VlIHRoZSBib2R5IGluIGBzcmMvc2FsZXMvYWN0aW9ucy9vcHBvcnR1bml0eS5hY3Rpb25zLnRzYCkuXG4gICAgLy9cbiAgICAvLyBgZXhlY3V0aW9uOiAnYWdncmVnYXRlJ2AgaXMgUkVRVUlSRUQgb24gYW4gYG9wZXJhdGlvbjogJ2N1c3RvbSdgIGRlZiBhbmRcbiAgICAvLyBpcyBub3QgYm9pbGVycGxhdGU6IGEgY3VzdG9tIGRlZiB3aXRob3V0IGl0IGhhcyBubyBkaXNwYXRjaGVyLCBzbyB0aGVcbiAgICAvLyBidXR0b24gdGlja3MgZ3JlZW4gb25jZSBwZXIgcm93IGFuZCBkb2VzIG5vdGhpbmcgYXQgYWxsLiBUaGUgc3BlYyByZWZ1c2VzXG4gICAgLy8gdGhhdCBzaGFwZSBhdCBwYXJzZSB0aW1lICgjNDQ1NykgXHUyMDE0IHdoaWNoIGlzIGFsc28gd2hhdCBtYWtlcyB0aGlzXG4gICAgLy8gZGVjbGFyYXRpb24gc2FmZSB0byB0cnVzdCByYXRoZXIgdGhhbiBtZXJlbHkgcHJlc2VudC5cbiAgICAvL1xuICAgIC8vIEhpc3Rvcnk6IHRoaXMgbGlzdCBjYXJyaWVkIHRoZSBiYXJlLXN0cmluZyBmb3JtIHVudGlsICM1ODggcmVtb3ZlZCBpdCBhc1xuICAgIC8vIGEgc2lsZW50IG5vLW9wLCBhbmQgdGhlIHJlbW92YWwgd2FzIHJlYWQgYXMgXCJ0aGUgcGxhdGZvcm0gY2Fubm90IGRlbGl2ZXJcbiAgICAvLyBhIHNlbGVjdGlvblwiIGZvciB0d28gcmVsZWFzZSBjYW5kaWRhdGVzLiBJdCBjb3VsZDogdGhlIGNoYW5uZWwgaXNcbiAgICAvLyBgcGFyYW1zLl9zZWxlY3RlZElkc2AsIHRoZSB1bmRlcnNjb3JlIGlzIGxvYWQtYmVhcmluZywgYW5kIG5vdGhpbmcgd2FzXG4gICAgLy8gaW5qZWN0aW5nIGl0IHByZWNpc2VseSBCRUNBVVNFIHRoaXMgZGVjbGFyYXRpb24gd2FzIGdvbmVcbiAgICAvLyAob2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjNTU2OCwgY2xvc2VkIHdvcmtzLWFzLWRlY2xhcmVkKS5cbiAgICAvL1xuICAgIC8vIFRoZSBkZWYgZGVsaWJlcmF0ZWx5IGNhcnJpZXMgb25seSB0aGUgdGhyZWUga2V5cyB0aGF0IGNob29zZSB0aGUgZGlzcGF0Y2hcbiAgICAvLyBjb250cmFjdC4gTGFiZWwsIGljb24sIHBhcmFtcyAodGhlIE5ldyBTdGFnZSBwaWNrZXIpIGFuZCBgdmlzaWJsZWAgYXJlXG4gICAgLy8gcHJvbW90ZWQgZnJvbSB0aGUgYWN0aW9uIGl0c2VsZiBieSB0aGUgcmVuZGVyZXIsIHNvIHRoZSBkaWFsb2cgYW5kIHRoZVxuICAgIC8vIHRvb2xiYXIgYnV0dG9uIGNhbm5vdCBkcmlmdCBhcGFydCBcdTIwMTQgYW5kIHRoZSBsYWJlbCBzdGF5cyBpMThuLXJlc29sdmVkLFxuICAgIC8vIHdoaWNoIGFuIGlubGluZSBgbGFiZWw6YCBoZXJlIHdvdWxkIG5vdCBiZS5cbiAgICBidWxrQWN0aW9uRGVmczogW1xuICAgICAgeyBuYW1lOiAnbWFzc191cGRhdGVfc3RhZ2UnLCBvcGVyYXRpb246ICdjdXN0b20nLCBleGVjdXRpb246ICdhZ2dyZWdhdGUnIH0sXG4gICAgXSxcbiAgfSxcblxuICBsaXN0Vmlld3M6IHtcbiAgICAvKipcbiAgICAgKiBBbGwgT3Bwb3J0dW5pdGllcyBcdTIwMTQgdGhlIHVuZmlsdGVyZWQgYm9vaywgaW5jbHVkaW5nIGNsb3NlZCBidXNpbmVzcy5cbiAgICAgKlxuICAgICAqIERlbW90ZWQgZnJvbSB0aGUgbGFuZGluZyB2aWV3IChzZWUgdGhlIG5vdGUgb24gYGxpc3RgIGFib3ZlKSBidXQga2VwdFxuICAgICAqIHdob2xlOiByZXBvcnRpbmcsIGF1ZGl0cyBhbmQgd2luL2xvc3MgcmV2aWV3cyBhbGwgbmVlZCB0aGUgY2xvc2VkIHJvd3MsXG4gICAgICogYW5kIGEgbWFuYWdlciByZWFjaGVzIHRoaXMgaW4gb25lIGNsaWNrLlxuICAgICAqL1xuICAgIGFsbF9vcHBvcnR1bml0aWVzOiB7XG4gICAgICBuYW1lOiAnYWxsX29wcG9ydHVuaXRpZXMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdBbGwgT3Bwb3J0dW5pdGllcycsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX29wcG9ydHVuaXR5JyB9LFxuICAgICAgY29sdW1uczogW1xuICAgICAgICB7IGZpZWxkOiAnbmFtZScsIHdpZHRoOiAyMjAsIHNvcnRhYmxlOiB0cnVlLCBsaW5rOiB0cnVlIH0sXG4gICAgICAgIHsgZmllbGQ6ICdjcm1fYWNjb3VudCcsIGxhYmVsOiAnQWNjb3VudCcsIHdpZHRoOiAxODAgfSxcbiAgICAgICAgeyBmaWVsZDogJ3N0YWdlJywgd2lkdGg6IDE0MCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgICAgeyBmaWVsZDogJ2Ftb3VudCcsIHdpZHRoOiAxNDAsIGFsaWduOiAncmlnaHQnLCBzb3J0YWJsZTogdHJ1ZSwgc3VtbWFyeTogJ3N1bScgfSxcbiAgICAgICAgeyBmaWVsZDogJ3Byb2JhYmlsaXR5Jywgd2lkdGg6IDExMCwgYWxpZ246ICdyaWdodCcgfSxcbiAgICAgICAgeyBmaWVsZDogJ2V4cGVjdGVkX3JldmVudWUnLCB3aWR0aDogMTYwLCBhbGlnbjogJ3JpZ2h0Jywgc3VtbWFyeTogJ3N1bScgfSxcbiAgICAgICAgeyBmaWVsZDogJ2Nsb3NlX2RhdGUnLCB3aWR0aDogMTQwLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgICB7IGZpZWxkOiAnb3duZXJfaWQnLCB3aWR0aDogMTUwIH0sXG4gICAgICBdLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICdjbG9zZV9kYXRlJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICAgIHNob3dSZWNvcmRDb3VudDogdHJ1ZSxcbiAgICB9LFxuXG4gICAgLyoqIERyYWctYW5kLWRyb3Agc2FsZXMgcGlwZWxpbmUgKi9cbiAgICBwaXBlbGluZV9rYW5iYW46IHtcbiAgICAgIG5hbWU6ICdwaXBlbGluZV9rYW5iYW4nLFxuICAgICAgdHlwZTogJ2thbmJhbicsXG4gICAgICBsYWJlbDogJ1NhbGVzIFBpcGVsaW5lJyxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknIH0sXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnY3JtX2FjY291bnQnLCAnYW1vdW50JywgJ2Nsb3NlX2RhdGUnLCAnb3duZXJfaWQnXSxcbiAgICAgIGthbmJhbjoge1xuICAgICAgICBncm91cEJ5RmllbGQ6ICdzdGFnZScsXG4gICAgICAgIHN1bW1hcml6ZUZpZWxkOiAnYW1vdW50JyxcbiAgICAgICAgY29sdW1uczogWyduYW1lJywgJ2NybV9hY2NvdW50JywgJ2Ftb3VudCcsICdjbG9zZV9kYXRlJ10sXG4gICAgICB9LFxuICAgICAgLy8gVGhlIGJvYXJkIGlzIHRoZSBhY3RpdmUgd29ya2luZyBwaXBlbGluZS4gQ2xvc2VkIGJ1c2luZXNzIHJlbWFpbnMgaW5cbiAgICAgIC8vIHRoZSBmdWxsIGJvb2sgYW5kIHRoZSBkYXNoYm9hcmQsIHdoaWxlIGV4Y2x1ZGluZyBpdCBoZXJlIGtlZXBzIGFsbFxuICAgICAgLy8gZml2ZSBhY3RpdmUgc3RhZ2VzIHZpc2libGUgYXQgYSBwcmVzZW50YXRpb24tZnJpZW5kbHkgd2lkdGguXG4gICAgICBmaWx0ZXI6IFt7IGZpZWxkOiAnc3RhZ2UnLCBvcGVyYXRvcjogJ25vdF9pbicsIHZhbHVlOiBbJ2Nsb3NlZF93b24nLCAnY2xvc2VkX2xvc3QnXSB9XSxcbiAgICAgIHNvcnQ6IFt7IGZpZWxkOiAnY2xvc2VfZGF0ZScsIG9yZGVyOiAnYXNjJyB9XSxcbiAgICAgIG5hdmlnYXRpb246IHsgbW9kZTogJ2RyYXdlcicsIHdpZHRoOiAnNjQwcHgnIH0sXG4gICAgfSxcblxuICAgIC8qKiBDbG9zZS1kYXRlIGZvcmVjYXN0aW5nIGNhbGVuZGFyICovXG4gICAgY2xvc2VfZGF0ZV9jYWxlbmRhcjoge1xuICAgICAgbmFtZTogJ2Nsb3NlX2RhdGVfY2FsZW5kYXInLFxuICAgICAgdHlwZTogJ2NhbGVuZGFyJyxcbiAgICAgIGxhYmVsOiAnRm9yZWNhc3QgQ2FsZW5kYXInLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScgfSxcbiAgICAgIGNvbHVtbnM6IFsnbmFtZScsICdhbW91bnQnLCAnc3RhZ2UnLCAnb3duZXJfaWQnXSxcbiAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnY2xvc2VfZGF0ZScsXG4gICAgICAgIHRpdGxlRmllbGQ6ICduYW1lJyxcbiAgICAgICAgY29sb3JGaWVsZDogJ3N0YWdlJyxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKiBDaHJvbm9sb2dpY2FsIGRlYWwgZmxvdyAqL1xuICAgIGRlYWxfdGltZWxpbmU6IHtcbiAgICAgIG5hbWU6ICdkZWFsX3RpbWVsaW5lJyxcbiAgICAgIHR5cGU6ICd0aW1lbGluZScsXG4gICAgICBsYWJlbDogJ0RlYWwgVGltZWxpbmUnLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScgfSxcbiAgICAgIGNvbHVtbnM6IFsnbmFtZScsICdjcm1fYWNjb3VudCcsICdhbW91bnQnXSxcbiAgICAgIHRpbWVsaW5lOiB7XG4gICAgICAgIC8vIGBjcmVhdGVkX2F0YCwgdGhlIHBsYXRmb3JtJ3Mgb3duIGNyZWF0aW9uIHN0YW1wIFx1MjAxNCB0aGUgb2JqZWN0J3NcbiAgICAgICAgLy8gZHVwbGljYXRlIGBjcmVhdGVkX2RhdGVgIHdhcyByZW1vdmVkIGluICM1NzUgQjIgYmVjYXVzZSBub3RoaW5nIGV2ZXJcbiAgICAgICAgLy8gd3JvdGUgaXQsIHNvIHRoaXMgdGltZWxpbmUgc3RhcnRlZCBldmVyeSBiYXIgYXQgbnVsbC4gU2FtZSBzcGVsbGluZ1xuICAgICAgICAvLyBhcyB0aGUgbGVhZCBhY3Rpdml0eSBjYWxlbmRhci5cbiAgICAgICAgc3RhcnREYXRlRmllbGQ6ICdjcmVhdGVkX2F0JyxcbiAgICAgICAgZW5kRGF0ZUZpZWxkOiAnY2xvc2VfZGF0ZScsXG4gICAgICAgIHRpdGxlRmllbGQ6ICduYW1lJyxcbiAgICAgICAgZ3JvdXBCeUZpZWxkOiAnb3duZXJfaWQnLFxuICAgICAgICBjb2xvckZpZWxkOiAnc3RhZ2UnLFxuICAgICAgICBzY2FsZTogJ21vbnRoJyxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKiBFeGVjdXRpdmUgcmV2aWV3IGNhcmRzICovXG4gICAgZGVhbF9nYWxsZXJ5OiB7XG4gICAgICBuYW1lOiAnZGVhbF9nYWxsZXJ5JyxcbiAgICAgIHR5cGU6ICdnYWxsZXJ5JyxcbiAgICAgIGxhYmVsOiAnRGVhbCBDYXJkcycsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX29wcG9ydHVuaXR5JyB9LFxuICAgICAgY29sdW1uczogWyduYW1lJywgJ2NybV9hY2NvdW50JywgJ2Ftb3VudCcsICdzdGFnZScsICdjbG9zZV9kYXRlJ10sXG4gICAgICBnYWxsZXJ5OiB7XG4gICAgICAgIGNhcmRTaXplOiAnbWVkaXVtJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ25hbWUnLFxuICAgICAgICB2aXNpYmxlRmllbGRzOiBbJ2NybV9hY2NvdW50JywgJ2Ftb3VudCcsICdzdGFnZScsICdwcm9iYWJpbGl0eScsICdjbG9zZV9kYXRlJywgJ293bmVyX2lkJ10sXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvKiogUGVyc29uYWwgcGlwZWxpbmUgKi9cbiAgICBteV9vcGVuX2RlYWxzOiB7XG4gICAgICBuYW1lOiAnbXlfb3Blbl9kZWFscycsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICBsYWJlbDogJ015IE9wZW4gRGVhbHMnLFxuICAgICAgdXNlckFjdGlvbnM6IHsgZWRpdElubGluZTogdHJ1ZSB9LFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScgfSxcbiAgICAgIGNvbHVtbnM6IFsnbmFtZScsICdjcm1fYWNjb3VudCcsICdzdGFnZScsICdhbW91bnQnLCAnY2xvc2VfZGF0ZSddLFxuICAgICAgLy8gXCJPcGVuXCIgaGFzIHRvIGV4Y2x1ZGUgQk9USCBjbG9zZWQgc3RhZ2VzLiBFeGNsdWRpbmcgb25seSBjbG9zZWRfd29uXG4gICAgICAvLyBtZWFudCBhIHJlcCdzIG93biBxdWV1ZSBvcGVuZWQgb24gdGhlaXIgbG9zdCBkZWFscywgc29ydGVkIHRvIHRoZSB0b3BcbiAgICAgIC8vIGJ5IGNsb3NlX2RhdGUgXHUyMDE0IHRoZSBsZWFzdCBhY3Rpb25hYmxlIHJvd3MgaW4gdGhlIHN5c3RlbS5cbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAnb3duZXJfaWQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiAne2N1cnJlbnRfdXNlcl9pZH0nIH0sXG4gICAgICAgIHsgZmllbGQ6ICdzdGFnZScsIG9wZXJhdG9yOiAnbm90X2luJywgdmFsdWU6IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0sXG4gICAgICBdLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICdjbG9zZV9kYXRlJywgb3JkZXI6ICdhc2MnIH1dLFxuICAgIH0sXG5cbiAgICAvKiogU3RhbGUgT3Bwb3J0dW5pdGllcyBcdTIwMTQgc3RpbGwtb3BlbiBkZWFscywgbG9uZ2VzdC1wYXJrZWQgZmlyc3QgKi9cbiAgICBzdGFsZV9vcHBvcnR1bml0aWVzOiB7XG4gICAgICBuYW1lOiAnc3RhbGVfb3Bwb3J0dW5pdGllcycsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICAvLyBIb25lc3QgbGFiZWw6IHRoaXMgdmlldyBkb2VzIG5vdCBhcHBseSB0aGUgMTQtZGF5IGN1dCBpdHMgYXV0b21hdGlvblxuICAgICAgLy8gdHdpbiAoYG9wcG9ydHVuaXR5X3N0YWduYXRpb25gLCBTVEFMRV9USFJFU0hPTERfREFZUyA9IDE0KSB1c2VzLCBhbmRcbiAgICAgIC8vIGRvZXMgbm90IGNsYWltIHRvLiBUd28gaW5kZXBlbmRlbnQgcmVhc29ucyB3ZXJlIHJlY29yZGVkIGZvciB0aGF0OyBvbmVcbiAgICAgIC8vIHN0aWxsIGhvbGRzIGFuZCBvbmUgaGFzIGV4cGlyZWQsIHNvIHRoZXkgYXJlIHNlcGFyYXRlZCBoZXJlLlxuICAgICAgLy9cbiAgICAgIC8vIFNUSUxMIFRSVUUgXHUyMDE0IGBkYXlzX2luX3N0YWdlYCBpcyBhIEZPUk1VTEEgKCM0ODkpLCBldmFsdWF0ZWQgaW4gSlMgYWZ0ZXJcbiAgICAgIC8vIHRoZSBxdWVyeSwgc28gdGhlIGRhdGEgZW5naW5lIGNhbiBuZWl0aGVyIGZpbHRlciBub3Igc29ydCBvbiBpdC4gQW55XG4gICAgICAvLyBmaWx0ZXIgcGhyYXNlZCBpbiB0ZXJtcyBvZiBgZGF5c19pbl9zdGFnZWAgcmVtYWlucyBpbXBvc3NpYmxlLlxuICAgICAgLy9cbiAgICAgIC8vIEVYUElSRUQgKCM3NDQpIFx1MjAxNCB0aGUgc2Vjb25kIHJlYXNvbiBzYWlkIHRoZSBsaXN0IGRhdGEgcGF0aCByZXNvbHZlcyBub1xuICAgICAgLy8gZGF0ZSBtYWNyb3MsIHNvIGBzdGFnZV9lbnRyeV9kYXRlIDwgezE0X2RheXNfYWdvfWAgd291bGQgc2hpcCB0aGUgdG9rZW5cbiAgICAgIC8vIGFzIGEgbGl0ZXJhbCBhbmQgaW52ZXJ0IHRoZSBjb21wYXJpc29uIGxleGljb2dyYXBoaWNhbGx5ICgnMjAyNi1cdTIwMjYnIHNvcnRzXG4gICAgICAvLyBiZWxvdyAneycsIHNvIGV2ZXJ5IHJvdyBtYXRjaGVkKS4gVGhhdCB3YXMgbWVhc3VyZWQgb24gQG9iamVjdHN0YWNrXG4gICAgICAvLyAxNi4xLjAgYW5kIHN0b3BwZWQgYmVpbmcgdHJ1ZSBhdCAxNy4wLjAtcmMuMCwgd2hlbiBgcmVzb2x2ZUZpbHRlclRva2VucygpYFxuICAgICAgLy8gd2FzIHdpcmVkIGludG8gdGhlIE9iamVjdFFMIHJlYWQgcGF0aCAob2JqZWN0cWwgIzM1ODIpLiBgezE0X2RheXNfYWdvfWBcbiAgICAgIC8vIGlzIGEgZmlyc3QtY2xhc3Mgdm9jYWJ1bGFyeSBtZW1iZXIgXHUyMDE0IGl0IG1hdGNoZXMgdGhlIHBhcmFtZXRlcmlzZWRcbiAgICAgIC8vIGdyYW1tYXIgYERBVEVfTUFDUk9fUEFSQU1fUkVgLCBge05fKG1pbnV0ZXN8aG91cnN8ZGF5c3x3ZWVrc3xtb250aHN8XG4gICAgICAvLyB5ZWFycylfKGFnb3xmcm9tX25vdyl9YCBcdTIwMTQgYW5kIGl0IHJlYWNoZXMgdGhlIGRyaXZlciBhbHJlYWR5IHN1YnN0aXR1dGVkXG4gICAgICAvLyBmb3IgYW4gSVNPIGRhdGUuIE1lYXN1cmVkIG9uIDE3LjAuMC1yYy4yLCBSRS1NRUFTVVJFRCAyMDI2LTA5LTAzIG9uXG4gICAgICAvLyAxNy4yLjAgKCMxNDY3KSwgUkUtUlVOIG9uIDE3LjMuMCAoIzE2NzYsIGFmdGVyIHRoZSBQUiAjMTU3NyBidW1wKSBhbmRcbiAgICAgIC8vIFJFLVJVTiBhZ2FpbiBvbiAxNy40LjAgKCMxODgzLCBhZnRlciB0aGUgUFIgIzE4MTQgYnVtcDsgbm90IHlldCBvblxuICAgICAgLy8gMTcuNS4wKSwgdW5jaGFuZ2VkIGF0IGV2ZXJ5IHRha2luZzogb3ZlciBmb3VyIHJvd3MgcGFya2VkXG4gICAgICAvLyAzMGQgLyAxNWQgLyAxM2QgLyAxZCwgYHN0YWdlX2VudHJ5X2RhdGUgPCB7MTRfZGF5c19hZ299YCByZXR1cm5lZCB0aGVcbiAgICAgIC8vIDMwZCBhbmQgMTVkIHJvd3MgXHUyMDE0IHRoZSBzYW1lIHR3byB0aGUgZXF1aXZhbGVudCBkYXktc3RhcnQgbGl0ZXJhbFxuICAgICAgLy8gcmV0dXJucywgYW5kIG5vdCBhbGwgZm91ciwgd2hpY2ggaXMgd2hhdCBhbiB1bnN1YnN0aXR1dGVkIHRva2VuIHdvdWxkXG4gICAgICAvLyBoYXZlIG1hdGNoZWQuIEl0IGlzIHRoZSBzYW1lIHNlYW1cbiAgICAgIC8vIGBjbG9zaW5nX3RoaXNfcXVhcnRlcmAgXHUyMDE0IHRoZSB2ZXJ5IG5leHQgdmlldyBpbiB0aGlzIGZpbGUgXHUyMDE0IHJlbGllcyBvbixcbiAgICAgIC8vIHBpbm5lZCBhZ2FpbnN0IGEgcmVhbCBlbmdpbmUgaW5cbiAgICAgIC8vIGB0ZXN0L2ZvcmVjYXN0LWN1cnJlbnQtcXVhcnRlci12aWV3LnRlc3QudHNgLlxuICAgICAgLy9cbiAgICAgIC8vIENvcnJlY3RpbmcgdGhhdCBoYWxmIG9mIHRoZSBjb21tZW50IGRvZXMgbm90IGRlY2lkZSBhbnl0aGluZyBhYm91dCB0aGVcbiAgICAgIC8vIGZpbHRlciwgYW5kIGlzIGRlbGliZXJhdGVseSBub3QgYSBsaWNlbmNlIHRvIGNoYW5nZSBpdDogZXhwcmVzc2luZyB0aGVcbiAgICAgIC8vIGN1dCBhcyBgc3RhZ2VfZW50cnlfZGF0ZSA8PSB7MTRfZGF5c19hZ299YCB3b3VsZCBkcm9wIGBkYXlzX2luX3N0YWdlYFxuICAgICAgLy8gZnJvbSB0aGUgcXVlc3Rpb24gZW50aXJlbHkgYW5kIGNoYW5nZSB3aGljaCByb3dzIHRoaXMgdmlldyByZXR1cm5zIFx1MjAxNFxuICAgICAgLy8gaGlkaW5nIHRvZGF5J3MgMTMtZGF5LW9sZCBkZWFscyBmcm9tIGEgbWFuYWdlcidzIHF1ZXVlLiBUaGF0IGlzIGFcbiAgICAgIC8vIEJFSEFWSU9VUiBjaGFuZ2Ugd2l0aCBpdHMgb3duIGlzc3VlICgjNzcwKSwgd2hlcmUgdGhlIG9wZW4gcXVlc3Rpb24gaXNcbiAgICAgIC8vIHdoZXRoZXIgdGhpcyBxdWV1ZSBzaG91bGQgYmUgYSBjdXQgb3IgYSByYW5raW5nIGF0IGFsbCBcdTIwMTQgdGhpcyBsYWJlbFxuICAgICAgLy8gcHJvbWlzZXMgYSByYW5raW5nIGFuZCBob25vdXJzIGl0LiBgc3RhbGVfYXJ0aWNsZXNgIGluXG4gICAgICAvLyBgc3JjL3ZpZXdzL2tub3dsZWRnZV9hcnRpY2xlLnZpZXcudHNgIGNhcnJpZWQgdGhlIHNhbWUgZXhwaXJlZCBwcmVtaXNlXG4gICAgICAvLyBhbmQgd2FzIGNvcnJlY3RlZCBpbiB0aGUgc2FtZSBwYXNzICgjNzY5KTsgdGhhdCB0YWIgd2FzIHRoZW4gREVMRVRFRFxuICAgICAgLy8gb3V0cmlnaHQgKCM3ODEsIHRoZSByZXZpZXcgcXVldWUgcnVsZWQgb3V0IG9mIHRoZSBwcm9kdWN0KSwgc28gaXQgaXMgbm9cbiAgICAgIC8vIGxvbmdlciBhIGNvbXBhcmlzb24gYXZhaWxhYmxlIGluIHRoaXMgdHJlZSBcdTIwMTQgdGhlIHN1cnZpdmluZyBwcmVjZWRlbnRcbiAgICAgIC8vIGZvciBcInJhbmtpbmcsIG5vdCBjdXRcIiBpcyB0aGlzIHZpZXcuIE5vdGhpbmcgYmVsb3cgd2FzIHRvdWNoZWQuXG4gICAgICAvL1xuICAgICAgLy8gQXMgc2hpcHBlZDogb3BlcmF0b3Itb25seSBmaWx0ZXIsIG9yZGVyZWQgYnkgdGhlIHN0b3JlZFxuICAgICAgLy8gYHN0YWdlX2VudHJ5X2RhdGVgIGFzY2VuZGluZyBcdTIwMTQgbG9uZ2VzdC1wYXJrZWQgb24gdG9wLCB3aGljaCBpcyB0aGVcbiAgICAgIC8vIHF1ZXVlIGEgbWFuYWdlciB3b3Jrcy4gVGhlIGBkYXlzX2luX3N0YWdlYCBjb2x1bW4gcHV0cyB0aGVcbiAgICAgIC8vIGBvcHBvcnR1bml0eV9zdGFnbmF0aW9uYCB0aHJlc2hvbGQgaW4gcGxhaW4gc2lnaHQgb24gZXZlcnkgcm93LlxuICAgICAgbGFiZWw6ICdcdTI2QTBcdUZFMEYgU3RhbGUgT3Bwb3J0dW5pdGllcyBcdTAwQjcgTG9uZ2VzdCBpbiBTdGFnZSBGaXJzdCcsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX29wcG9ydHVuaXR5JyB9LFxuICAgICAgY29sdW1uczogWyduYW1lJywgJ2NybV9hY2NvdW50JywgJ3N0YWdlJywgJ2Ftb3VudCcsICdzdGFnZV9lbnRyeV9kYXRlJywgJ2RheXNfaW5fc3RhZ2UnLCAnY2xvc2VfZGF0ZScsICdvd25lcl9pZCddLFxuICAgICAgZmlsdGVyOiBbXG4gICAgICAgIHsgZmllbGQ6ICdzdGFnZScsIG9wZXJhdG9yOiAnbm90X2luJywgdmFsdWU6IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0sXG4gICAgICBdLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICdzdGFnZV9lbnRyeV9kYXRlJywgb3JkZXI6ICdhc2MnIH0sIHsgZmllbGQ6ICdjbG9zZV9kYXRlJywgb3JkZXI6ICdhc2MnIH1dLFxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBUZW5kZXIgZXhwZWN0ZWQgdGhpcyBxdWFydGVyIFx1MjAxNCBSRVEtMDAwNiBhY2NlcHRhbmNlIDIgaW4gb25lIHZpZXcuXG4gICAgICpcbiAgICAgKiBUaGUgcG9pbnQgb2YgdGhlIHZpZXcgaXMgdGhlIHByZWRpY2F0ZTogaXQgd2luZG93c1xuICAgICAqIGBleHBlY3RlZF90ZW5kZXJfZGF0ZWAsIHRoZSBDVVNUT01FUidzIHByb2N1cmVtZW50IGNhbGVuZGFyLCBhbmQgdG91Y2hlc1xuICAgICAqIGBjbG9zZV9kYXRlYCBub3doZXJlIFx1MjAxNCB3aGljaCBpcyB3aGF0IFwicmVwb3J0YWJsZSBpbmRlcGVuZGVudGx5IG9mXG4gICAgICogYGNsb3NlX2RhdGVgXCIgbWVhbnMgYW5kIHdoYXQgYSBzaW5nbGUgZm9yZWNhc3QgZGF0ZSBjb3VsZCBuZXZlciBleHByZXNzLlxuICAgICAqXG4gICAgICogU2FtZSBpbmNsdXNpdmUgYHtjdXJyZW50X3F1YXJ0ZXJfKn1gIGJvdW5kcyBhcyBgY2xvc2luZ190aGlzX3F1YXJ0ZXJgXG4gICAgICogYmVsb3csIGV4YWN0IGZvciB0aGUgc2FtZSBtZWFzdXJlZCByZWFzb246IGJvdGggYm91bmRzIGFyZSBkYXRlIG1hY3Jvc1xuICAgICAqIHJlc29sdmVkIHNlcnZlci1zaWRlLCBhbmQgYGV4cGVjdGVkX3RlbmRlcl9kYXRlYCBpcyBhIGBGaWVsZC5kYXRlKClgXG4gICAgICogc3RvcmVkIGFzIGBZWVlZLU1NLUREYCBURVhULCBzbyB0aGUgaW5jbHVzaXZlIHVwcGVyIGJvdW5kIGRyb3BzIG5vIHJvd3MuXG4gICAgICovXG4gICAgdGVuZGVyX3RoaXNfcXVhcnRlcjoge1xuICAgICAgbmFtZTogJ3RlbmRlcl90aGlzX3F1YXJ0ZXInLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdUZW5kZXIgVGhpcyBRdWFydGVyJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknIH0sXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnY3JtX2FjY291bnQnLCAnZXhwZWN0ZWRfdGVuZGVyX2RhdGUnLCAnZXhwZWN0ZWRfdGVuZGVyX2Ftb3VudCcsICdleHBlY3RlZF9zaWduaW5nX2RhdGUnLCAnc3RhZ2UnLCAnb3duZXJfaWQnXSxcbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAnc3RhZ2UnLCBvcGVyYXRvcjogJ25vdF9pbicsIHZhbHVlOiBbJ2Nsb3NlZF93b24nLCAnY2xvc2VkX2xvc3QnXSB9LFxuICAgICAgICB7IGZpZWxkOiAnZXhwZWN0ZWRfdGVuZGVyX2RhdGUnLCBvcGVyYXRvcjogJ2dyZWF0ZXJfdGhhbl9vcl9lcXVhbCcsIHZhbHVlOiAne2N1cnJlbnRfcXVhcnRlcl9zdGFydH0nIH0sXG4gICAgICAgIHsgZmllbGQ6ICdleHBlY3RlZF90ZW5kZXJfZGF0ZScsIG9wZXJhdG9yOiAnbGVzc190aGFuX29yX2VxdWFsJywgdmFsdWU6ICd7Y3VycmVudF9xdWFydGVyX2VuZH0nIH0sXG4gICAgICBdLFxuICAgICAgc29ydDogW3sgZmllbGQ6ICdleHBlY3RlZF90ZW5kZXJfZGF0ZScsIG9yZGVyOiAnYXNjJyB9XSxcbiAgICAgIC8vIEVtcHR5IGlzIHRoZSBsZWdpdGltYXRlIHN0YXRlIG9uIGEgZnJlc2ggaW5zdGFsbDogbm8gc2VlZCByb3cgY2Fycmllc1xuICAgICAgLy8gYSBjdXN0b21lci1zaWRlIHRlbmRlciBkYXRlLCBzbyB0aGlzIHRhYiBvcGVucyBvbiBub3RoaW5nIHVudGlsIGEgcmVwXG4gICAgICAvLyByZWNvcmRzIG9uZS4gVW5leHBsYWluZWQsIHRoYXQgcmVhZHMgYXMgYnJva2VuLlxuICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICB0aXRsZTogJ05vIFRlbmRlcnMgRXhwZWN0ZWQgVGhpcyBRdWFydGVyJyxcbiAgICAgICAgbWVzc2FnZTogJ1RoaXMgdGFiIGxpc3RzIG9wZW4gZGVhbHMgd2hvc2UgY3VzdG9tZXItc2lkZSB0ZW5kZXIgZGF0ZSBmYWxscyBpbnNpZGUgdGhlIGN1cnJlbnQgcXVhcnRlci4gUmVjb3JkIEV4cGVjdGVkIFRlbmRlciBEYXRlIG9uIGEgZGVhbCB0byBzZWUgaXQgaGVyZS4nLFxuICAgICAgICBpY29uOiAnY2FsZW5kYXItY2xvY2snLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLyoqIENsb3NpbmcgdGhpcyBxdWFydGVyIChjb21taXQgKyBiZXN0X2Nhc2UpIFx1MjAxNCBzYWxlcy1tYW5hZ2VyIGZvcmVjYXN0ICovXG4gICAgY2xvc2luZ190aGlzX3F1YXJ0ZXI6IHtcbiAgICAgIG5hbWU6ICdjbG9zaW5nX3RoaXNfcXVhcnRlcicsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICBsYWJlbDogJ0Nsb3NpbmcgVGhpcyBRdWFydGVyJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknIH0sXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnY3JtX2FjY291bnQnLCAnYW1vdW50JywgJ2ZvcmVjYXN0X2NhdGVnb3J5JywgJ3Byb2JhYmlsaXR5JywgJ2Nsb3NlX2RhdGUnLCAnb3duZXJfaWQnXSxcbiAgICAgIC8vIFRoZSBgY2xvc2VfZGF0ZWAgd2luZG93IGlzIHdoYXQgbWFrZXMgdGhlIGxhYmVsIHRydWUgKCM3NDMpLiBXaXRob3V0XG4gICAgICAvLyBpdCB0aGlzIHZpZXcgcmV0dXJuZWQgRVZFUlkgb3BlbiBjb21taXQvYmVzdC1jYXNlIGRlYWwgd2hlbmV2ZXIgaXRcbiAgICAgIC8vIGNsb3NlZCBcdTIwMTQgYSBkZWFsIHNsYXRlZCBmb3IgbmV4dCBNYXJjaCBzYXQgdW5kZXIgYSBoZWFkaW5nIHRoYXQgc2FpZFxuICAgICAgLy8gXCJDbG9zaW5nIFRoaXMgUXVhcnRlclwiLCBhbmQgc3VtbWluZyB0aGUgQW1vdW50IGNvbHVtbiBnYXZlIGEgbnVtYmVyXG4gICAgICAvLyB0aGF0IHdhcyBub3QgdGhpcyBxdWFydGVyJ3MgY29tbWl0LlxuICAgICAgLy9cbiAgICAgIC8vIEJvdGggYm91bmRzIGFyZSBkYXRlIG1hY3JvcyByZXNvbHZlZCBzZXJ2ZXItc2lkZTogYHJlc29sdmVGaWx0ZXJUb2tlbnMoKWBcbiAgICAgIC8vIHdhcyB3aXJlZCBpbnRvIHRoZSBPYmplY3RRTCByZWFkIHBhdGggaW4gMTcuMC4wLXJjLjAgKG9iamVjdHFsICMzNTgyLFxuICAgICAgLy8gY292ZXJpbmcgZmluZC9maW5kT25lL2NvdW50L2FnZ3JlZ2F0ZSBhaGVhZCBvZiB0aGUgbWlkZGxld2FyZSBjaGFpbiksXG4gICAgICAvLyBzbyBhIHNhdmVkLXZpZXcgZmlsdGVyIHZhbHVlIHJlYWNoZXMgdGhlIGRyaXZlciBhbHJlYWR5IHN1YnN0aXR1dGVkLlxuICAgICAgLy8gTWVhc3VyZWQgb24gMTcuMC4wLXJjLjIsIFJFLU1FQVNVUkVEIDIwMjYtMDktMDMgb24gMTcuMi4wICgjMTQ2NyksXG4gICAgICAvLyBSRS1SVU4gb24gMTcuMy4wICgjMTY3NiwgYWZ0ZXIgdGhlIFBSICMxNTc3IGJ1bXApIGFuZCBSRS1SVU4gYWdhaW4gb25cbiAgICAgIC8vIDE3LjQuMCAoIzE4ODMsIGFmdGVyIHRoZSBQUiAjMTgxNCBidW1wKSwgdW5jaGFuZ2VkIGF0XG4gICAgICAvLyBldmVyeSB0YWtpbmcgXHUyMDE0IHNlZSB0aGUgcnVudGltZSBibG9jayBpblxuICAgICAgLy8gYHRlc3QvZm9yZWNhc3QtY3VycmVudC1xdWFydGVyLXZpZXcudGVzdC50c2AsIHdoaWNoIGlzIHRoYXRcbiAgICAgIC8vIHJlLW1lYXN1cmVtZW50IChub3QgeWV0IHJlLXJ1biBvbiAxNy41LjApLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSB1cHBlciBib3VuZCBpcyBJTkNMVVNJVkUgYWdhaW5zdCBge2N1cnJlbnRfcXVhcnRlcl9lbmR9YCByYXRoZXJcbiAgICAgIC8vIHRoYW4gaGFsZi1vcGVuIGFnYWluc3QgYHtuZXh0X3F1YXJ0ZXJfc3RhcnR9YCwgYW5kIHRoYXQgY2hvaWNlIGlzXG4gICAgICAvLyBkZWxpYmVyYXRlOiBhIGAqX2VuZGAgdG9rZW4gcmVzb2x2ZXMgdG8gdGhlIHBlcmlvZCdzIGxhc3QgY2FsZW5kYXIgREFZXG4gICAgICAvLyAoMjAyNi0wOS0zMCksIHdoaWNoIG9uIGEgYGRhdGV0aW1lYCBjb2x1bW4gd291bGQgc3RvcCBhdCBtaWRuaWdodCBhbmRcbiAgICAgIC8vIHNpbGVudGx5IGRyb3AgdGhhdCBkYXkncyByb3dzIFx1MjAxNCB0aGUgc3BlYyBzYXlzIHRvIHVzZSB0aGUgaGFsZi1vcGVuXG4gICAgICAvLyBmb3JtIHRoZXJlLiBgY2xvc2VfZGF0ZWAgaXMgYEZpZWxkLmRhdGUoKWAsIHN0b3JlZCBhcyBgWVlZWS1NTS1ERGBcbiAgICAgIC8vIFRFWFQgb24gYm90aCBzaWRlcyBvZiB0aGUgY29tcGFyaXNvbiwgc28gdGhlIGluY2x1c2l2ZSBib3VuZCBpcyBleGFjdC5cbiAgICAgIC8vIFRoYXQgaXMgdGhlIHNhbWUgZmllbGQtdHlwZSBwcm9wZXJ0eSBgbWV0YWRhdGEtcmVmZXJlbmNlcy50ZXN0LnRzYFxuICAgICAgLy8gcmVsaWVzIG9uIGZvciB3aHkgdGhlIENSTS9TYWxlcy9FeGVjdXRpdmUgZGFzaGJvYXJkcyBtYXkgd2luZG93XG4gICAgICAvLyBgY2xvc2VfZGF0ZWAgYXQgYWxsICgjNDYwKS4gQm90aCBmb3JtcyB3ZXJlIG1lYXN1cmVkIHRvIHJldHVybiB0aGVcbiAgICAgIC8vIGlkZW50aWNhbCByb3cgc2V0IGhlcmU7IHRoZSBpbmNsdXNpdmUgb25lIHJlYWRzIGFzIHdoYXQgaXQgbWVhbnMuXG4gICAgICBmaWx0ZXI6IFtcbiAgICAgICAgeyBmaWVsZDogJ2ZvcmVjYXN0X2NhdGVnb3J5Jywgb3BlcmF0b3I6ICdpbicsIHZhbHVlOiBbJ2NvbW1pdCcsICdiZXN0X2Nhc2UnXSB9LFxuICAgICAgICB7IGZpZWxkOiAnc3RhZ2UnLCBvcGVyYXRvcjogJ25vdF9pbicsIHZhbHVlOiBbJ2Nsb3NlZF93b24nLCAnY2xvc2VkX2xvc3QnXSB9LFxuICAgICAgICB7IGZpZWxkOiAnY2xvc2VfZGF0ZScsIG9wZXJhdG9yOiAnZ3JlYXRlcl90aGFuX29yX2VxdWFsJywgdmFsdWU6ICd7Y3VycmVudF9xdWFydGVyX3N0YXJ0fScgfSxcbiAgICAgICAgeyBmaWVsZDogJ2Nsb3NlX2RhdGUnLCBvcGVyYXRvcjogJ2xlc3NfdGhhbl9vcl9lcXVhbCcsIHZhbHVlOiAne2N1cnJlbnRfcXVhcnRlcl9lbmR9JyB9LFxuICAgICAgXSxcbiAgICAgIHNvcnQ6IFt7IGZpZWxkOiAnY2xvc2VfZGF0ZScsIG9yZGVyOiAnYXNjJyB9XSxcbiAgICAgIC8vIFNjb3BpbmcgdGhlIGxpc3QgbWFrZXMgXCJlbXB0eVwiIGEgc3RhdGUgYSByZWFsIHVzZXIgbWVldHMsIHNvIGl0IG5lZWRzXG4gICAgICAvLyBjb3B5LiBVbmxpa2UgdGhlIGZvcmVjYXN0IHZpZXcncyAoIzc0NSwgd2hlcmUgdGhlIHN3ZWVwIG93bnMgdGhlXG4gICAgICAvLyB3aW5kb3cgYW5kIGEgZnJlc2ggaW5zdGFsbCBpcyBBTFdBWVMgZW1wdHkgdW50aWwgaXQgcnVucyksIHRoZSBzZWVkc1xuICAgICAgLy8gaGVyZSBkbyBwcm9kdWNlIHJvd3MgZm9yIG1vc3Qgb2YgYSBxdWFydGVyIFx1MjAxNCBzaXggc2VlZGVkIGRlYWxzIHF1YWxpZnlcbiAgICAgIC8vIG9uIGZvcmVjYXN0X2NhdGVnb3J5ICsgc3RhZ2UsIGF0IGBkYXlzRnJvbU5vd2Agb2Zmc2V0cyAxMS8xNC8yNC8zMC8zOC80NS5cbiAgICAgIC8vIEJ1dCBldmVyeSBvbmUgb2YgdGhvc2Ugb2Zmc2V0cyBpcyByZWxhdGl2ZSB0byB0aGUgSU5TVEFMTCBkYXksIHNvIG9uY2VcbiAgICAgIC8vIGZld2VyIHRoYW4gMTEgZGF5cyByZW1haW4gaW4gdGhlIHF1YXJ0ZXIgYWxsIHNpeCBsYW5kIGluIHRoZSBuZXh0IG9uZVxuICAgICAgLy8gYW5kIGEgZnJlc2hseSBzZWVkZWQgZGVtbyBvcGVucyB0aGlzIHRhYiBvbiBub3RoaW5nLiBBIHJlYWwgb3JnIG1lZXRzXG4gICAgICAvLyB0aGUgc2FtZSBzdGF0ZSB3aGVuZXZlciBhIHF1YXJ0ZXIncyBjb21taXQgc2xpcHMgb3V0LiBFbXB0eSBpc1xuICAgICAgLy8gbGVnaXRpbWF0ZSBoZXJlOyB1bmV4cGxhaW5lZCwgaXQgcmVhZHMgYXMgYnJva2VuLlxuICAgICAgZW1wdHlTdGF0ZToge1xuICAgICAgICB0aXRsZTogJ05vIERlYWxzIENsb3NpbmcgVGhpcyBRdWFydGVyJyxcbiAgICAgICAgbWVzc2FnZTogJ1RoaXMgdGFiIGxpc3RzIG9wZW4gY29tbWl0IGFuZCBiZXN0LWNhc2UgZGVhbHMgd2l0aCBhIGNsb3NlIGRhdGUgaW5zaWRlIHRoZSBjdXJyZW50IHF1YXJ0ZXIuIE5vdGhpbmcgbWF0Y2hlcyByaWdodCBub3cgXHUyMDE0IGRlYWxzIGNsb3NpbmcgbGF0ZXIgYXJlIG9uIHRoZSBPcGVuIERlYWxzIHRhYi4nLFxuICAgICAgICBpY29uOiAnY2FsZW5kYXItY2hlY2snLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuXG4gIGZvcm06IHtcbiAgICB0eXBlOiAndGFiYmVkJyxcbiAgICBzZWN0aW9uczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnb3ZlcnZpZXcnLFxuICAgICAgICBsYWJlbDogJ092ZXJ2aWV3JyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ25hbWUnLCByZXF1aXJlZDogdHJ1ZSwgc3BhbjogJ2Z1bGwnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ2NybV9hY2NvdW50JywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICAncHJpbWFyeV9jb250YWN0JyxcbiAgICAgICAgICB7IGZpZWxkOiAnc3RhZ2UnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdhbW91bnQnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICdwcm9iYWJpbGl0eScsXG4gICAgICAgICAgJ2Nsb3NlX2RhdGUnLFxuICAgICAgICAgICdvd25lcl9pZCcsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnZm9yZWNhc3QnLFxuICAgICAgICBsYWJlbDogJ0ZvcmVjYXN0JyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgJ2V4cGVjdGVkX3JldmVudWUnLFxuICAgICAgICAgICdmb3JlY2FzdF9jYXRlZ29yeScsXG4gICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgICdsZWFkX3NvdXJjZScsXG4gICAgICAgICAgJ2NybV9jYW1wYWlnbicsXG4gICAgICAgICAgJ3N0YWdlX2VudHJ5X2RhdGUnLFxuICAgICAgICAgICdkYXlzX2luX3N0YWdlJyxcbiAgICAgICAgICAnaXNfcHJpdmF0ZScsXG4gICAgICAgICAgLy8gUkVRLTAwMDYgc3RlcCA4IFx1MjAxNCB0aGUgY3VzdG9tZXIncyBvd24gcHJvY3VyZW1lbnQgY2FsZW5kYXIuIE5hbWVkXG4gICAgICAgICAgLy8gaGVyZSAoQUdFTlRTLm1kIGxhZGRlciBydW5nIDMpLCBhbmQgdGhlIHJlYXNvbiBpbiB3cml0aW5nOlxuICAgICAgICAgIC8vIGB0ZW5kZXJfdGhpc19xdWFydGVyYCBmaWx0ZXJzIG9uIGBleHBlY3RlZF90ZW5kZXJfZGF0ZWAsIGFuZCBhXG4gICAgICAgICAgLy8gZmlsdGVyZWQgZmllbGQgbm8gZm9ybSBvZmZlcnMgaXMgYSB2aWV3IHRoYXQgY2FuIG5ldmVyIG1hdGNoIGFcbiAgICAgICAgICAvLyBkZWFsIGEgcmVwIGNyZWF0ZWQgdGhyb3VnaCB0aGUgVUkgKGB0ZXN0L21ldGFkYXRhLXJlZmVyZW5jZXNcbiAgICAgICAgICAvLyAudGVzdC50c2ApLiBUaGUgZmllbGRzIGRlY2xhcmUgYGdyb3VwOiAnc2FsZXNfcHJvY2VzcydgLCBzbyBldmVyeVxuICAgICAgICAgIC8vIERFUklWRUQgc3VyZmFjZSBcdTIwMTQgdGhlIHJlY29yZCBwYWdlJ3MgRGV0YWlscyB0YWIgXHUyMDE0IGFscmVhZHkgY2Fycmllc1xuICAgICAgICAgIC8vIHRoZW07IHRoaXMgZm9ybSBhdXRob3JzIGBzZWN0aW9uc2AsIHdoaWNoIHdpbiBvdXRyaWdodCBvdmVyXG4gICAgICAgICAgLy8gZGVyaXZhdGlvbi4gQSBgeyBncm91cDogJ3NhbGVzX3Byb2Nlc3MnIH1gIHJlZmVyZW5jZSBjYW5ub3Qgc3RhbmRcbiAgICAgICAgICAvLyBpbjogaXQgd291bGQgcmVuZGVyIGBzdGFnZWAsIGBwcm9iYWJpbGl0eWAgYW5kIGBjbG9zZV9kYXRlYFxuICAgICAgICAgIC8vIChjdXJhdGVkIGluIE92ZXJ2aWV3LCBgc3RhZ2VgIGByZXF1aXJlZGApIGFuZCBgc3RhZ2VfZW50cnlfZGF0ZWBcbiAgICAgICAgICAvLyAoYWJvdmUpIGEgc2Vjb25kIHRpbWUsIGFuZCBwdWxsIHRoZSBhcHByb3ZhbCB2ZXJkaWN0IGNvbHVtbnMgYW5kXG4gICAgICAgICAgLy8gdGhlIGluZXJ0LWJ5LWRlZmF1bHQgYHJlcXVlc3RlZF9zdGF0dXNgIGludG8gdGhlIGNyZWF0ZSBkaWFsb2cuXG4gICAgICAgICAgJ2N1c3RvbWVyX2luaXRpYXRpb25fZGF0ZScsXG4gICAgICAgICAgJ2V4cGVjdGVkX3RlbmRlcl9kYXRlJyxcbiAgICAgICAgICAnZXhwZWN0ZWRfdGVuZGVyX2Ftb3VudCcsXG4gICAgICAgICAgJ2V4cGVjdGVkX3NpZ25pbmdfZGF0ZScsXG4gICAgICAgICAgJ2V4cGVjdGVkX3NpZ25pbmdfYW1vdW50JyxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICAvLyBSRVEtMDAwNiBhY2NlcHRhbmNlIDEsIEZST00gYGZpZWxkR3JvdXBzYCAoQUdFTlRTLm1kIGxhZGRlciBydW5nIDIpLFxuICAgICAgLy8gdGhlIHdheSBgY29udGFjdC52aWV3LnRzYCByZWZlcmVuY2VzIFJFUS0wMDA0J3MgYnV5aW5nIGNlbnRyZTogdGhpc1xuICAgICAgLy8gZm9ybSBhdXRob3JzIGBzZWN0aW9uc2AsIHdoaWNoIHdpbiBvdXRyaWdodCBvdmVyIHRoZSByZW5kZXJlcidzXG4gICAgICAvLyBgZmllbGRHcm91cHNgIGRlcml2YXRpb24sIHNvIGEgZ3JvdXAgZGVjbGFyZWQgb24gdGhlIG9iamVjdCBhbG9uZVxuICAgICAgLy8gbmV2ZXIgcmVhY2hlcyB0aGlzIGZvcm0gXHUyMDE0IHRoZSBFZGl0IGFuZCBOZXcgZGlhbG9nLiBBIGdyb3VwIHJlZmVyZW5jZVxuICAgICAgLy8gZW51bWVyYXRlcyBub3RoaW5nOyBtZW1iZXJzLCBsYWJlbCBhbmQgaWNvbiBjb21lIGZyb20gdGhlIG9iamVjdC5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgTWVhc3VyZWQgb24gdGhlIDE3LjYuMCBjb25zb2xlOiB0aGUgdGFiYmVkIGRpYWxvZyByZW5kZXJzIE5PIHRhYlxuICAgICAgLy8gZm9yIGEgYHsgZ3JvdXAgfWAgc2VjdGlvbiBcdTIwMTQgdGhpcyBvbmUsIGFuZCB0aGUgY29udGFjdCBmb3JtJ3MgYnV5aW5nXG4gICAgICAvLyBjZW50cmUgb24gYG1haW5gIGFsaWtlLiBUaGF0IGlzIHRoZSBwbGF0Zm9ybSdzIHRvIGZpeCwgYW5kIHRoZXNlIHR3b1xuICAgICAgLy8gbGluZXMgYXJlIHRoZSBjb250cmFjdC1jb3JyZWN0IGZvcm0gd2FpdGluZyBmb3IgaXQgKEFHRU5UUy5tZDogYVxuICAgICAgLy8gcGxhdGZvcm0gZGVmZWN0IGlzIHdhaXRlZCBmb3IsIG5ldmVyIHJvdXRlZCBhcm91bmQpLiBVbnRpbCB0aGVuIGV2ZXJ5XG4gICAgICAvLyBSRVEtMDAwNiBmaWVsZCBpcyBlZGl0ZWQgdGhyb3VnaCB0aGUgRGV0YWlscyB0YWIncyBlZGl0IG1vZGUgXHUyMDE0IHdoaWNoXG4gICAgICAvLyBvZmZlcnMgbm8gbWFya2Rvd24gZWRpdG9yLCB0aGUgcmVhc29uIHRoZSBuYXJyYXRpdmUgZmllbGRzIGFyZVxuICAgICAgLy8gdGV4dGFyZWFzIChzZWUgdGhlIG5vdGUgYWJvdmUgYGN1c3RvbWVyX2JhY2tncm91bmRgKS5cbiAgICAgIHsgZ3JvdXA6ICdxdWFsaWZpY2F0aW9uJywgY29sdW1uczogMiB9LFxuICAgICAgeyBncm91cDogJ25hcnJhdGl2ZScsIGNvbHVtbnM6IDEgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NhbGVzX3N0cmF0ZWd5JyxcbiAgICAgICAgbGFiZWw6ICdTYWxlcyBTdHJhdGVneScsXG4gICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgIC8vIGBjb21wZXRpdG9yc2Agc2F0IGhlcmUgdW50aWwgIzEwNjEgcmV0aXJlZCBpdCBcdTIwMTQgdGhpcyBmb3JtIHNlY3Rpb24gd2FzXG4gICAgICAgIC8vIHRoZSBmaWVsZCdzIE9OTFkgc3VyZmFjZSBhbnl3aGVyZSBpbiB0aGUgYXBwIChub3RoaW5nIHJlYWQgaXQgYmFjaykuXG4gICAgICAgIGZpZWxkczogWyduZXh0X3N0ZXAnXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC8vIFdpbi9sb3NzIGNhcHR1cmUgYXQgY2xvc2UgdGltZS4gVGhlIGZpZWxkcyBleGlzdGVkIG9uIHRoZSBvYmplY3QgZm9yXG4gICAgICAgIC8vIHJlcG9ydGluZyBidXQgbm8gZm9ybSBvZmZlcmVkIHRoZW0sIHNvIGV2ZXJ5IGNsb3NlZCBkZWFsIGxvc3QgaXRzXG4gICAgICAgIC8vIHdoeS13ZS13b24gLyB3aHktd2UtbG9zdCBkYXRhLlxuICAgICAgICBuYW1lOiAnd2luX2xvc3MnLFxuICAgICAgICBsYWJlbDogJ1dpbiAvIExvc3MnLFxuICAgICAgICBjb2xsYXBzaWJsZTogdHJ1ZSxcbiAgICAgICAgY29sbGFwc2VkOiB0cnVlLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFsnd2luX3JlYXNvbicsICdsb3NzX3JlYXNvbicsIHsgZmllbGQ6ICdsb3NzX2RldGFpbHMnLCBzcGFuOiAnZnVsbCcgfV0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzL3Rhc2sudmlldy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy92aWV3c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy92aWV3cy90YXNrLnZpZXcudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZVZpZXcgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogVGFzayBWaWV3c1xuICpcbiAqICAgXHUyMDIyIGdyaWQgICAgIFx1MjAxNCB0by1kbyBsaXN0IHdpdGggY29tcGxldGlvbiBjb250cm9sc1xuICogICBcdTIwMjIga2FuYmFuICAgXHUyMDE0IHdvcmsgYm9hcmQgZ3JvdXBlZCBieSBzdGF0dXNcbiAqICAgXHUyMDIyIGNhbGVuZGFyIFx1MjAxNCBzY2hlZHVsZSBieSBkdWVfZGF0ZVxuICogICBcdTIwMjIgZ2FudHQgICAgXHUyMDE0IGV4ZWN1dGlvbiBwbGFuIGZyb20gcmVtaW5kZXJfZGF0ZSBcdTIxOTIgZHVlX2RhdGVcbiAqICAgXHUyMDIyIHRpbWVsaW5lIFx1MjAxNCBjaHJvbm9sb2dpY2FsIHdvcmtsb2cgZ3JvdXBlZCBieSBvd25lclxuICovXG5leHBvcnQgY29uc3QgVGFza1ZpZXdzID0gZGVmaW5lVmlldyh7XG4gIGxpc3Q6IHtcbiAgICB0eXBlOiAnZ3JpZCcsXG4gICAgbmFtZTogJ2FsbF90YXNrcycsXG4gICAgbGFiZWw6ICdBbGwgVGFza3MnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX3Rhc2snIH0sXG4gICAgLy8gTk8gYHByb2dyZXNzX3BlcmNlbnRgIGNvbHVtbiBoZXJlICgjMTIxNCBpdGVtIDUpLiBUaGUgZGVmYXVsdCBncmlkIHVzZWRcbiAgICAvLyB0byByZW5kZXIgY29tcGxldGlvbiBUSFJFRSB0aW1lcyBvbiBvbmUgcm93IFx1MjAxNCBcdTY2MkZcdTU0MjZcdTVCOENcdTYyMTAgKHRpY2spLCBcdTcyQjZcdTYwMDEsIGFuZFxuICAgIC8vIFx1OEZEQlx1NUVBNiglKSBcdTIwMTQgYW5kIHRoZSBwZXJjZW50IHdhcyB0aGUgb25lIHRoYXQgY2FycmllZCBub3RoaW5nLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoZSBjYXJkIGp1c3RpZmllZCB0aGUgcmVtb3ZhbCBhcyBcImV2ZXJ5IHNlZWRlZCByb3cgaXMgMCVcIi4gVGhhdCBpc1xuICAgIC8vIEZBTFNFIGFzIHN0YXRlZCBhbmQgd2FzIHJlLW1lYXN1cmVkIGJlZm9yZSBkZWxldGluZzogdHdvIG9mIHRoZSBzZXZlblxuICAgIC8vIHNlZWRlZCB0YXNrcyBjYXJyeSAxMDAuIFdoYXQgaXMgVFJVRSBpcyB0aGUgY2xhaW0gdW5kZXJuZWF0aCBpdCBcdTIwMTQgbm9ib2R5XG4gICAgLy8gbWFpbnRhaW5zIGEgcGVyY2VudCBwZXIgdGFzayBcdTIwMTQgYW5kIHRoZSBzZWVkIHNob3dzIGl0IG1vcmUgc2hhcnBseSB0aGFuXG4gICAgLy8gdGhlIGNhcmQgZGlkOlxuICAgIC8vICAgXHUwMEI3IGV2ZXJ5IHZhbHVlIHRoYXQgZXhpc3RzIGlzIDEwMCwgYW5kIGV2ZXJ5IG9uZSBvZiB0aG9zZSByb3dzIGlzXG4gICAgLy8gICAgIGBzdGF0dXM6ICdjb21wbGV0ZWQnYCAoYHNlcnZpY2Uuc2VlZC50c2AgbWlycm9ycyB3aGF0IHRoZSBob29rIHdvdWxkXG4gICAgLy8gICAgIHN0YW1wLCBzaW5jZSBob29rcyBkbyBub3QgcnVuIG92ZXIgc2VlZHMpO1xuICAgIC8vICAgXHUwMEI3IGB0YXNrX2NvbXBsZXRpb25gIHN0YW1wcyAxMDAgb24gdGhlIGNvbXBsZXRlZCB0cmFuc2l0aW9uIGFuZCB3cml0ZXNcbiAgICAvLyAgICAgdGhlIGZpZWxkIGF0IG5vIG90aGVyIHRpbWU7XG4gICAgLy8gICBcdTAwQjcgYm90aCBgaW5fcHJvZ3Jlc3NgIHJvd3Mgc2l0IGF0IDAgXHUyMDE0IHRoZSBvbmUgc3RhdHVzIHdoZXJlIGEgcGVyY2VudFxuICAgIC8vICAgICBjb3VsZCBzYXkgc29tZXRoaW5nIGEgc3RhdHVzIGNhbm5vdCwgYW5kIGl0IHNheXMgbm90aGluZy5cbiAgICAvLyBcdTIxRDIgT24gdGhpcyBncmlkIHRoZSBjb2x1bW4gaXMgYHN0YXR1c2AgcmUtcmVuZGVyZWQgYXQgTE9XRVIgcmVzb2x1dGlvbjogaXRcbiAgICAvLyBjYW5ub3QgdGVsbCBgbm90X3N0YXJ0ZWRgIGZyb20gYGluX3Byb2dyZXNzYCAoYm90aCAwKSwgd2hpbGUgdGhlIGBzdGF0dXNgXG4gICAgLy8gY29sdW1uIGJlc2lkZSBpdCBjYW4uIERyb3BwaW5nIGl0IGxvc2VzIG5vIGZhY3QgdGhpcyByb3cgZG9lcyBub3QgYWxyZWFkeVxuICAgIC8vIGNhcnJ5IHR3aWNlLlxuICAgIC8vXG4gICAgLy8gXHUyNkQ0IFRoZSBGSUVMRCBzdGF5cywgYW5kIHNvIGRvZXMgZXZlcnkgb3RoZXIgcmVhZGVyIFx1MjAxNCB0aGlzIGlzIG9uZSBjb2x1bW5cbiAgICAvLyBvbiBvbmUgdmlldywgbm90IGEgcmV0aXJlbWVudDogYHRhc2tfZ2FudHRgIGZpbGxzIGl0cyBiYXJzIGZyb21cbiAgICAvLyBgZ2FudHQucHJvZ3Jlc3NGaWVsZGAsIGB0YXNrX2JvYXJkYCBhbmQgYG15X29wZW5fdGFza3NgIHNob3cgaXQgKG5laXRoZXJcbiAgICAvLyBjYXJyaWVzIGBzdGF0dXNgIEFORCBgaXNfY29tcGxldGVkYCwgc28gdGhlcmUgaXQgaXMgbm90IGEgdGhpcmQgc3BlbGxpbmcpLFxuICAgIC8vIGBhdmdfcHJvZ3Jlc3NgIGluIGB0YXNrLmRhdGFzZXQudHNgIGFnZ3JlZ2F0ZXMgaXQsIGFuZCB0aGUgRWZmb3J0IHNlY3Rpb25cbiAgICAvLyBvZiB0aGlzIGZpbGUncyBmb3JtIHN0aWxsIGxldHMgYSB1c2VyIGF1dGhvciBvbmUuXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgYGlzX2NvbXBsZXRlZGAgU1RBWVMsIGFuZCBpcyBub3QgdGhlIHNlY29uZCBoYWxmIG9mIHRoaXMgY2xlYW51cDogaXQgaXNcbiAgICAvLyBub3QgYW4gaW5kZXBlbmRlbnQgc2hhZG93IHRoYXQgY2FuIGNvbnRyYWRpY3QgYHN0YXR1c2AgXHUyMDE0IGB0YXNrX2NvbXBsZXRpb25gXG4gICAgLy8gcmVjb21wdXRlcyBpdCBmcm9tIHN0YXR1cyBvbiBldmVyeSBpbnNlcnQgYW5kIHVwZGF0ZVxuICAgIC8vIChgaW5wdXQuaXNfY29tcGxldGVkID0gZWZmU3RhdHVzID09PSAnY29tcGxldGVkJ2ApLCB3aGljaCBpcyBwcmVjaXNlbHkgdGhlXG4gICAgLy8gXCJyZW5kZXIgY29tcGxldGlvbiBmcm9tIHN0YXR1c1wiIHRoZSBjYXJkIGFza3MgZm9yLCBhbHJlYWR5IGRvbmUgYXQgdGhlXG4gICAgLy8gZGF0YSBsYXllci4gSXQgaXMgYWxzbyB0aGlzIGxpc3QncyBmaXJzdCBzb3J0IGtleSBhbmQgaXRzIGNvbXBsZXRpb25cbiAgICAvLyBjb250cm9sLlxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICdpc19jb21wbGV0ZWQnLCB3aWR0aDogNjAsIGFsaWduOiAnY2VudGVyJyB9LFxuICAgICAgeyBmaWVsZDogJ3N1YmplY3QnLCB3aWR0aDogMjgwLCBzb3J0YWJsZTogdHJ1ZSwgbGluazogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ3N0YXR1cycsIHdpZHRoOiAxMzAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAncHJpb3JpdHknLCB3aWR0aDogMTEwLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ2R1ZV9kYXRlJywgd2lkdGg6IDE0MCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdvd25lcl9pZCcsIHdpZHRoOiAxNTAgfSxcbiAgICAgIHsgZmllbGQ6ICdpc19vdmVyZHVlJywgd2lkdGg6IDEwMCwgYWxpZ246ICdjZW50ZXInIH0sXG4gICAgXSxcbiAgICBzb3J0OiBbXG4gICAgICB7IGZpZWxkOiAnaXNfY29tcGxldGVkJywgb3JkZXI6ICdhc2MnIH0sXG4gICAgICB7IGZpZWxkOiAnZHVlX2RhdGUnLCBvcmRlcjogJ2FzYycgfSxcbiAgICBdLFxuICAgIHJvd0NvbG9yOiB7XG4gICAgICAvLyBUYXNrIHByaW9yaXR5IGlzIGxvdy9ub3JtYWwvaGlnaC91cmdlbnQgXHUyMDE0IHRoZSBwcmV2aW91cyBjcml0aWNhbC9tZWRpdW1cbiAgICAgIC8vIGtleXMgd2VyZSBDYXNlIHZhbHVlcywgc28gdXJnZW50IGFuZCBub3JtYWwgcm93cyBnb3Qgbm8gY29sb3IgYXQgYWxsLlxuICAgICAgLy8gQ29sb3JzIG1pcnJvciB0aGUgb3B0aW9uIGNvbG9ycyBvbiBjcm1fdGFzay5wcmlvcml0eS5cbiAgICAgIGZpZWxkOiAncHJpb3JpdHknLFxuICAgICAgY29sb3JzOiB7IHVyZ2VudDogJ3JlZCcsIGhpZ2g6ICdvcmFuZ2UnLCBub3JtYWw6ICdncmVlbicsIGxvdzogJ3NsYXRlJyB9LFxuICAgIH0sXG4gICAgc2VsZWN0aW9uOiB7IHR5cGU6ICdtdWx0aXBsZScgfSxcbiAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiA1MCB9LFxuICAgIGFwcGVhcmFuY2U6IHtcbiAgICAgIHNob3dEZXNjcmlwdGlvbjogdHJ1ZSxcbiAgICAgIGFsbG93ZWRWaXN1YWxpemF0aW9uczogWydncmlkJywgJ2thbmJhbicsICdjYWxlbmRhcicsICdnYW50dCcsICd0aW1lbGluZSddLFxuICAgIH0sXG4gICAgLy8gQmluZHMgdGhlICdjYWxlbmRhcicgZW50cnkgYWJvdmU6IHRoZSBzYW1lIHNjaGVkdWxlIHRoZSBkZWRpY2F0ZWRcbiAgICAvLyBgdGFza19jYWxlbmRhcmAgdmlldyBzaG93cywgb24gdGhlIGZpZWxkIHRoaXMgbGlzdCBzb3J0cyBieS4gYGR1ZV9kYXRlYFxuICAgIC8vIGlzIG9wdGlvbmFsIFx1MjAxNCBhbiB1bmRhdGVkIHRhc2sgc3RheXMgb2ZmIHRoZSBjYWxlbmRhciBpbnN0ZWFkIG9mIGJlaW5nXG4gICAgLy8gZHJvcHBlZCBvbiB0b2RheSBieSBhIGd1ZXNzZWQgZmllbGQuXG4gICAgY2FsZW5kYXI6IHtcbiAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnZHVlX2RhdGUnLFxuICAgICAgdGl0bGVGaWVsZDogJ3N1YmplY3QnLFxuICAgICAgY29sb3JGaWVsZDogJ3ByaW9yaXR5JyxcbiAgICB9LFxuICB9LFxuXG4gIGxpc3RWaWV3czoge1xuICAgIC8qKiBXb3JrIGJvYXJkICovXG4gICAgdGFza19ib2FyZDoge1xuICAgICAgbmFtZTogJ3Rhc2tfYm9hcmQnLFxuICAgICAgdHlwZTogJ2thbmJhbicsXG4gICAgICBsYWJlbDogJ1Rhc2sgQm9hcmQnLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV90YXNrJyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3ByaW9yaXR5JywgJ2R1ZV9kYXRlJywgJ293bmVyX2lkJ10sXG4gICAgICBrYW5iYW46IHtcbiAgICAgICAgZ3JvdXBCeUZpZWxkOiAnc3RhdHVzJyxcbiAgICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3ByaW9yaXR5JywgJ2R1ZV9kYXRlJywgJ3Byb2dyZXNzX3BlcmNlbnQnXSxcbiAgICAgIH0sXG4gICAgICBmaWx0ZXI6IFt7IGZpZWxkOiAnaXNfY29tcGxldGVkJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogZmFsc2UgfV0sXG4gICAgICBuYXZpZ2F0aW9uOiB7IG1vZGU6ICdkcmF3ZXInLCB3aWR0aDogJzUyMHB4JyB9LFxuICAgIH0sXG5cbiAgICAvKiogU2NoZWR1bGUgdmlldyAqL1xuICAgIHRhc2tfY2FsZW5kYXI6IHtcbiAgICAgIG5hbWU6ICd0YXNrX2NhbGVuZGFyJyxcbiAgICAgIHR5cGU6ICdjYWxlbmRhcicsXG4gICAgICBsYWJlbDogJ1Rhc2sgU2NoZWR1bGUnLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV90YXNrJyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3ByaW9yaXR5JywgJ293bmVyX2lkJ10sXG4gICAgICBjYWxlbmRhcjoge1xuICAgICAgICBzdGFydERhdGVGaWVsZDogJ2R1ZV9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ3N1YmplY3QnLFxuICAgICAgICBjb2xvckZpZWxkOiAncHJpb3JpdHknLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLyoqIEV4ZWN1dGlvbiBwbGFuICovXG4gICAgdGFza19nYW50dDoge1xuICAgICAgbmFtZTogJ3Rhc2tfZ2FudHQnLFxuICAgICAgdHlwZTogJ2dhbnR0JyxcbiAgICAgIGxhYmVsOiAnRXhlY3V0aW9uIFBsYW4nLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV90YXNrJyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ293bmVyX2lkJywgJ3Byb2dyZXNzX3BlcmNlbnQnXSxcbiAgICAgIGdhbnR0OiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAncmVtaW5kZXJfZGF0ZScsXG4gICAgICAgIGVuZERhdGVGaWVsZDogJ2R1ZV9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ3N1YmplY3QnLFxuICAgICAgICBwcm9ncmVzc0ZpZWxkOiAncHJvZ3Jlc3NfcGVyY2VudCcsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvKiogV29ya2xvZyB0aW1lbGluZSAqL1xuICAgIHRhc2tfdGltZWxpbmU6IHtcbiAgICAgIG5hbWU6ICd0YXNrX3RpbWVsaW5lJyxcbiAgICAgIHR5cGU6ICd0aW1lbGluZScsXG4gICAgICBsYWJlbDogJ1dvcmtsb2cgVGltZWxpbmUnLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV90YXNrJyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3N0YXR1cyddLFxuICAgICAgdGltZWxpbmU6IHtcbiAgICAgICAgc3RhcnREYXRlRmllbGQ6ICdyZW1pbmRlcl9kYXRlJyxcbiAgICAgICAgZW5kRGF0ZUZpZWxkOiAnZHVlX2RhdGUnLFxuICAgICAgICB0aXRsZUZpZWxkOiAnc3ViamVjdCcsXG4gICAgICAgIGdyb3VwQnlGaWVsZDogJ293bmVyX2lkJyxcbiAgICAgICAgY29sb3JGaWVsZDogJ3N0YXR1cycsXG4gICAgICAgIHNjYWxlOiAnd2VlaycsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBteV9vcGVuX3Rhc2tzOiB7XG4gICAgICBuYW1lOiAnbXlfb3Blbl90YXNrcycsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICBsYWJlbDogJ015IE9wZW4gVGFza3MnLFxuICAgICAgdXNlckFjdGlvbnM6IHsgZWRpdElubGluZTogdHJ1ZSB9LFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV90YXNrJyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3ByaW9yaXR5JywgJ2R1ZV9kYXRlJywgJ3Byb2dyZXNzX3BlcmNlbnQnXSxcbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAnb3duZXJfaWQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiAne2N1cnJlbnRfdXNlcl9pZH0nIH0sXG4gICAgICAgIHsgZmllbGQ6ICdpc19jb21wbGV0ZWQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiBmYWxzZSB9LFxuICAgICAgXSxcbiAgICAgIHNvcnQ6IFt7IGZpZWxkOiAnZHVlX2RhdGUnLCBvcmRlcjogJ2FzYycgfV0sXG4gICAgfSxcblxuICAgIC8qKiBNeSBvcGVuIHByaW9yaXR5IHRhc2tzIFx1MjAxNCBkYWlseSBtb3JuaW5nIHF1ZXVlICovXG4gICAgdG9kYXlzX3Rhc2tzOiB7XG4gICAgICBuYW1lOiAndG9kYXlzX3Rhc2tzJyxcbiAgICAgIHR5cGU6ICdncmlkJyxcbiAgICAgIGxhYmVsOiAnXHVEODNEXHVEQ0M1IE15IFByaW9yaXR5IFRhc2tzJyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fdGFzaycgfSxcbiAgICAgIGNvbHVtbnM6IFsnc3ViamVjdCcsICdwcmlvcml0eScsICdzdGF0dXMnLCAnZHVlX2RhdGUnLCAncmVsYXRlZF90b190eXBlJywgJ293bmVyX2lkJ10sXG4gICAgICAvLyBPcGVyYXRvci1vbmx5IGZpbHRlciBcdTIwMTQgcHJpb3JpdHkgYW5kIHN0YXR1cywgbm8gdG9rZW5zIFx1MjAxNCBhbmQgdGhlIHJlYXNvblxuICAgICAgLy8gcmVjb3JkZWQgaGVyZSBmb3IgdGhhdCBoYXMgZXhwaXJlZCAoIzc4MikuIFR3byBjbGFpbXMgc3Rvb2QgaGVyZTsgYm90aFxuICAgICAgLy8gd2VyZSB3cm9uZyBhbHJlYWR5IG9uIDE3LjAuMC1yYy4yIFx1MjAxNCB0aGUgdmVyc2lvbiB0aGlzIHJlcG8gcGlubmVkIEFUXG4gICAgICAvLyBUSEUgVElNRSB0aGV5IHdlcmUgbWVhc3VyZWQsIG5vdCB0aGUgY3VycmVudCBwaW4gXHUyMDE0IGluIGRpZmZlcmVudFxuICAgICAgLy8gd2F5cy4gXCJXcm9uZ1wiIGlzIGFib3V0IHRob3NlIHR3b1xuICAgICAgLy8gcmV0aXJlZCBjbGFpbXMsIG5vdCBhYm91dCB0aGUgZW5naW5lOiBub3RoaW5nIGluIHRoaXMgYmxvY2sgcmVwb3J0c1xuICAgICAgLy8gYnJva2VuIHBsYXRmb3JtIGJlaGF2aW91ci5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgUkVBRCBUSEUgVkVSU0lPTiBPTiBFQUNIIFJFQURJTkcgQkVMT1cuIFRoZXkgd2VyZSB0YWtlbiBhdFxuICAgICAgLy8gc2V2ZXJhbCBkaWZmZXJlbnQgcGlucyBhbmQgYXJlIGxhYmVsbGVkIGluZGl2aWR1YWxseTsgYSByZWFkaW5nXG4gICAgICAvLyBsYWJlbGxlZCAxNy4yLjAgd2FzIHRha2VuIHRoZXJlIGFuZCBoYXMgTk9UIGJlZW4gcmUtdGFrZW4gb24gYW55IGxhdGVyXG4gICAgICAvLyBwaW4gdW5sZXNzIGl0IHNheXMgc28uXG4gICAgICAvL1xuICAgICAgLy8gYHtjdXJyZW50X3VzZXJfaWR9YCBET0VTIGludGVycG9sYXRlLiBgcmVzb2x2ZUZpbHRlclRva2VucygpYCB3YXMgd2lyZWRcbiAgICAgIC8vIGludG8gdGhlIE9iamVjdFFMIFJFQUQgcGF0aCBhdCAxNy4wLjAtcmMuMCAob2JqZWN0cWwgIzM1ODIpIGFoZWFkIG9mXG4gICAgICAvLyB0aGUgbWlkZGxld2FyZSBjaGFpbiwgY292ZXJpbmcgYGZpbmRgIC8gYGZpbmRPbmVgIC8gYGNvdW50YCAvXG4gICAgICAvLyBgYWdncmVnYXRlYCBcdTIwMTQgc2F2ZWQtdmlldyBmaWx0ZXJzIGluY2x1ZGVkLiBgbXlfb3Blbl90YXNrc2AsIHRoZSB2aWV3XG4gICAgICAvLyBkaXJlY3RseSBhYm92ZSwgc2hpcHMgdGhhdCBleGFjdCB0b2tlbi4gTWVhc3VyZWQgaW4gIzc4NCB3aXRoIHR3byBwcm9iZXNcbiAgICAgIC8vIHRoYXQgc2VwYXJhdGUgdGhlIHRocmVlIHBvc3NpYmxlIG91dGNvbWVzOiBgb3duZXJfaWQgPVxuICAgICAgLy8ge2N1cnJlbnRfb3JnX2lkfWAgcmV0dXJuZWQgMCByb3dzICh0aGUgZmlsdGVyIGlzIG5vdCBiZWluZyBkcm9wcGVkKVxuICAgICAgLy8gd2hpbGUgYG93bmVyX2lkID0ge2N1cnJlbnRfdXNlcl9pZH1gIHJldHVybmVkIGV2ZXJ5IHNlZWRlZCB0YXNrIChub3QgYVxuICAgICAgLy8gbGl0ZXJhbC1zdHJpbmcgY29tcGFyZSBlaXRoZXIgXHUyMDE0IHRoZSBsaXRlcmFsIG1hdGNoZXMgbm8gb3duZXIgYXQgYWxsKS5cbiAgICAgIC8vIFJFLU1FQVNVUkVEIDIwMjYtMDktMDMgb24gMTcuMi4wICgjMTQ2NyksIHVuY2hhbmdlZDogYm90aCBwcm9iZXNcbiAgICAgIC8vIHJlcG9ydGVkIGV4YWN0bHkgdGhvc2UgcmVzdWx0cyB0aGVyZS4gTk9UIHJlLXJ1biBvbiAxNy4zLjAgKCMxNjc2KSBcdTIwMTRcbiAgICAgIC8vIHRoZSB0d28tcHJvYmUgcmVzdWx0IGlzIGEgMTcuMi4wIHJlYWRpbmcsIGFuZCB0aGUgc2VhbSBpdCByZXN0cyBvblxuICAgICAgLy8gKGByZXNvbHZlRmlsdGVyVG9rZW5zKClgIG9uIHRoZSByZWFkIHBhdGgpIHdhcyByZS1jb25maXJtZWQgb24gMTcuNC4wXG4gICAgICAvLyBieSBgdGVzdC9mbG93LWZpbHRlci10b2RheS10b2tlbi50ZXN0LnRzYCAobm90IHlldCByZS1ydW4gb24gMTcuNS4wKS5cbiAgICAgIC8vXG4gICAgICAvLyBge1RPREFZKCl9YCBpcyBub3QgYSBzcGVsbGluZyBvZiBhbnl0aGluZyBhbmQgbmV2ZXIgd2FzLiBUaGUgdm9jYWJ1bGFyeVxuICAgICAgLy8gaXMgYHt0b2RheX1gIC8gYHt5ZXN0ZXJkYXl9YCAvIGB7dG9tb3Jyb3d9YCAvIGB7bm93fWAsIHRoZSBwZXJpb2RcbiAgICAgIC8vIHRva2VucywgYW5kIHRoZSBwYXJhbWV0ZXJpc2VkIGB7Tl9kYXlzX2Fnb31gIGZhbWlseS5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgV0hBVCBDSEFOR0VEIGJldHdlZW4gcmMuMiBhbmQgMTcuNC4wIFx1MjAxNCB0aGUgb25lIHJlYWRpbmcgaW5cbiAgICAgIC8vIHRoaXMgYmxvY2sgdGhhdCBkaWQgTk9UIHN1cnZpdmUgcmUtbWVhc3VyZW1lbnQsIGFuZCB0aGUgcmVhc29uIHRoZVxuICAgICAgLy8gdmVyc2lvbiBxdWFsaWZpZXJzIGhlcmUgYXJlIGxvYWQtYmVhcmluZyByYXRoZXIgdGhhbiBib29ra2VlcGluZy4gT25cbiAgICAgIC8vIHJjLjIgYHtUT0RBWSgpfWAgd2FzIG5vdCBSRUpFQ1RFRCBlaXRoZXI6IHRoZSBwbGFjZWhvbGRlciBncmFtbWFyIHdhc1xuICAgICAgLy8gYC9eXFwkP1xceyhbYS16QS1aMC05X10rKVxcfSQvYCwgcGFyZW50aGVzZXMgZmVsbCBvdXRzaWRlIGl0LFxuICAgICAgLy8gYGNsYXNzaWZ5RmlsdGVyVG9rZW4oJ3tUT0RBWSgpfScpYCByZXR1cm5lZCBudWxsLCBhbmQgdGhlIHN0cmluZ1xuICAgICAgLy8gcmVhY2hlZCB0aGUgZHJpdmVyIHZlcmJhdGltIGFuZCBjb21wYXJlZCBhcyB0ZXh0LiBGcm9tIDE3LjIuMCBvbiBcdTIwMTRcbiAgICAgIC8vIHJlLWNvbmZpcm1lZCBvbiAxNy4zLjAgKCMxNjc2KSBhbmQgYWdhaW4gb24gMTcuNC4wXG4gICAgICAvLyAoIzE4ODMpIGJ5IHRoZSBQUkVNSVNFIGNhc2UgaW5cbiAgICAgIC8vIGB0ZXN0L2Zsb3ctZmlsdGVyLXRvZGF5LXRva2VuLnRlc3QudHNgLCB3aGljaCBkcml2ZXMgYSByZWFsIGVuZ2luZSBcdTIwMTRcbiAgICAgIC8vIHRoYXQgaXMgRkFMU0U6IGBGSUxURVJfVE9LRU5fV1JBUFBFRF9SRWAgaW4gYEBvYmplY3RzdGFjay9zcGVjL2RhdGFgXG4gICAgICAvLyBub3cgcmVhZHMgYC9eXFwkP1xceyhbXnt9XSspXFx9JC9gLCB3aGljaCBET0VTIG1hdGNoIGBUT0RBWSgpYCwgc28gaXRcbiAgICAgIC8vIGNsYXNzaWZpZXMgYXMgYGtpbmQ6ICd1bmtub3duJ2AgYW5kIGByZXNvbHZlRmlsdGVyVG9rZW5zKClgIHRocm93c1xuICAgICAgLy8gYFVua25vd25GaWx0ZXJUb2tlbkVycm9yYCAoYEZJTFRFUl9UT0tFTl9VTktOT1dOYCwgSFRUUCA0MDApIFx1MjAxNCB0aGUgc2FtZVxuICAgICAgLy8gZW52ZWxvcGUgYHtUT0RBWX1gIGdldHMuIFRoZSBjaGFuZ2UgbGFuZGVkIGF0IDE3LjAuMC1yYy42IGFuZCB0aGlzIHJlcG9cbiAgICAgIC8vIGFscmVhZHkgcGlucyBpdCBlbHNld2hlcmU6IGB0ZXN0L2Zsb3ctZmlsdGVyLXRvZGF5LXRva2VuLnRlc3QudHNgXG4gICAgICAvLyAoIzExMDcpLiBUaGF0IGlzIGFsc28gd2h5IHRoZSBgc3JjLyovZmxvd3NgIHN3ZWVwcyB0aGF0IHN0aWxsIHNwZWxsXG4gICAgICAvLyBge1RPREFZKCl9YCB3b3JrIFx1MjAxNCBgaW50ZXJwb2xhdGVGaWx0ZXIoKWAgcmVzb2x2ZXMgaXQgYmVmb3JlIE9iamVjdFFMXG4gICAgICAvLyBzZWVzIHRoZSBmaWx0ZXIgYXQgYWxsLlxuICAgICAgLy9cbiAgICAgIC8vIE1lYXN1cmVkIG9uIHJjLjIgb3ZlciBhIGZvdXItcm93IGBjcm1fdGFza2AgZml4dHVyZSAoZHVlIDMwZCBhZ28gLyAxZFxuICAgICAgLy8gYWdvIC8gdG9kYXkgLyBpbiA3ZCksIGFuZCBSRS1NRUFTVVJFRCAyMDI2LTA5LTAzIG9uIDE3LjIuMCAoIzE0NjcpXG4gICAgICAvLyBvdmVyIHRoZSBzYW1lIGZpeHR1cmUgXHUyMDE0IHRocmVlIHJvd3MgdW5jaGFuZ2VkLCB0aGUgZm91cnRoIG5vdC4gXHUyNkQ0IFRoZVxuICAgICAgLy8gcm93IENPVU5UUyBiZWxvdyBhcmUgYSAxNy4yLjAgcmVhZGluZyBhbmQgd2VyZSBOT1QgcmUtdGFrZW4gb24gMTcuMy4wXG4gICAgICAvLyAoIzE2NzYpOyB3aGF0IFdBUyByZS1jb25maXJtZWQgdGhlcmUgaXMgdGhlIHRocm93L3Jlc29sdmUgdmVyZGljdCBpblxuICAgICAgLy8gdGhlIHJpZ2h0LWhhbmQgY29sdW1uLCBieSBgdGVzdC9mbG93LWZpbHRlci10b2RheS10b2tlbi50ZXN0LnRzYDpcbiAgICAgIC8vXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYy4yICAgICAgICAgICAgICAgMTcuMi4wXG4gICAgICAvLyAgICAgZHVlX2RhdGUgPCAgJ3t0b2RheX0nICAgIC0+ICAyIHJvd3MgKHBhc3QtZHVlKSAgMiByb3dzXG4gICAgICAvLyAgICAgZHVlX2RhdGUgPD0gJ3t0b2RheX0nICAgIC0+ICAzIHJvd3MgICAgICAgICAgICAgMyByb3dzXG4gICAgICAvLyAgICAgZHVlX2RhdGUgPCAgJ3tUT0RBWX0nICAgIC0+ICB0aHJvd3MgICAgICAgICAgICAgdGhyb3dzXG4gICAgICAvLyAgICAgZHVlX2RhdGUgPCAgJ3tUT0RBWSgpfScgIC0+ICBBTEwgNCByb3dzICAgICAgICAgdGhyb3dzXG4gICAgICAvL1xuICAgICAgLy8gKEJvdGggdGhyb3dzIGFyZSBgVW5rbm93bkZpbHRlclRva2VuRXJyb3JgLCBgRklMVEVSX1RPS0VOX1VOS05PV05gLilcbiAgICAgIC8vXG4gICAgICAvLyBTbyB0aGUgIzc0NCBsZXhpY29ncmFwaGljIGludmVyc2lvbiAoJzIwMjYtXHUyMDI2JyBzb3J0cyBiZWxvdyAneycpIGlzIE5PVFxuICAgICAgLy8gc3RpbGwgbGl2ZSBvbiB0aGlzIHBhdGgsIGFuZCBcdTI2RDQgbm90aGluZyBoZXJlIHNob3VsZCBjYXJyeSBhIHdvcmthcm91bmRcbiAgICAgIC8vIGZvciBpdDogb24gcmMuMiBpdCByZWFjaGVkIGV2ZXJ5IHNwZWxsaW5nIHRoZSBncmFtbWFyIGNvdWxkIG5vdCBzZWUsXG4gICAgICAvLyBhbmQgdGhlIDE3LjIuMCBncmFtbWFyIHNlZXMgdGhlbSBhbGwuIFRoZSBhdXRob3ItdGltZSBndWFyZCBpblxuICAgICAgLy8gYHRlc3QvbWV0YWRhdGEtcmVmZXJlbmNlcy50ZXN0LnRzYCBcdTIwMTQgaXQgc2NhbnMgdGhlIGJyb2FkZXJcbiAgICAgIC8vIGAvXFx7KFtee31dKylcXH0vYCBhbmQgcmVqZWN0cyBhbnkgdG9rZW4gbmVpdGhlciBwYXRoIHJlc29sdmVzIFx1MjAxNCBzdGlsbFxuICAgICAgLy8gZWFybnMgaXRzIGtlZXAsIGJ5IGZhaWxpbmcgYXQgYXV0aG9yaW5nIHRpbWUgcmF0aGVyIHRoYW4gYXMgYSA0MDAgaW4gYVxuICAgICAgLy8gdXNlcidzIGZhY2UsIGFuZCBieSBjb3ZlcmluZyB0aGUgYW5hbHl0aWNzIHBhdGggdGhlIGVuZ2luZSBnYXRlIGRvZXNcbiAgICAgIC8vIG5vdC5cbiAgICAgIC8vXG4gICAgICAvLyBDb3JyZWN0aW5nIHRoZSBjb21tZW50IGlzIG5vdCBhIGxpY2VuY2UgdG8gY2hhbmdlIHRoZSBmaWx0ZXIuIFdoZXRoZXJcbiAgICAgIC8vIHRoaXMgdmlldyBzaG91bGQgY2FycnkgYSBkYXRlIGJvdW5kIGF0IGFsbCBcdTIwMTQgYW5kIHdoZXRoZXIgYSBsYWJlbFxuICAgICAgLy8gcmVhZGluZyBcIk15IFByaW9yaXR5IFRhc2tzXCIgb3ZlciBhIGZpbHRlciB3aXRoIG5vIG93bmVyIGNvbmRpdGlvbiBpc1xuICAgICAgLy8gdGhlIHJpZ2h0IG5hbWUgXHUyMDE0IGFyZSBCRUhBVklPVVIgZGVjaXNpb25zIG9uICM3NzAncyBsaW5lIGZvciB0aGUgdGFza1xuICAgICAgLy8gdmlld3MsIG5vdCB0aGlzIG9uZSdzLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBzb3J0IGJlbG93IGlzIGR1ZV9kYXRlLU1BSk9SLCBub3QgcHJpb3JpdHktbWFqb3I6IGBwcmlvcml0eV9yYW5rXG4gICAgICAvLyBkZXNjYCBvbmx5IGJyZWFrcyB0aWVzIGluc2lkZSBhIHNpbmdsZSBkdWUgZGF0ZSwgc28gYSBoaWdoIHRhc2sgZHVlXG4gICAgICAvLyB0b21vcnJvdyBvdXRyYW5rcyBhbiB1cmdlbnQgb25lIGR1ZSBuZXh0IHdlZWsuIE1lYXN1cmVkIG9uIHJjLjIgd2l0aFxuICAgICAgLy8gdGhlIHNoaXBwZWQgc29ydCBvdmVyIGZvdXIgcm93cyBcdTIwMTQgc29vbi91cmdlbnQsIHNvb24vaGlnaCwgbGF0ZXIvdXJnZW50LFxuICAgICAgLy8gbGF0ZXIvaGlnaCwgaW4gdGhhdCBvcmRlci4gV2hhdCBzdG9vZCBoZXJlIHNhaWQgdGhlIHNvcnQgXCJwdXRzIHVyZ2VudFxuICAgICAgLy8gYXQgdG9wXCIsIHdoaWNoIGlzIHdoYXQgdGhlIE9USEVSIGtleSBvcmRlciB3b3VsZCBkby5cbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAnc3RhdHVzJywgb3BlcmF0b3I6ICdpbicsIHZhbHVlOiBbJ25vdF9zdGFydGVkJywgJ2luX3Byb2dyZXNzJ10gfSxcbiAgICAgICAgeyBmaWVsZDogJ3ByaW9yaXR5Jywgb3BlcmF0b3I6ICdpbicsIHZhbHVlOiBbJ2hpZ2gnLCAndXJnZW50J10gfSxcbiAgICAgIF0sXG4gICAgICBzb3J0OiBbeyBmaWVsZDogJ2R1ZV9kYXRlJywgb3JkZXI6ICdhc2MnIH0sIHsgZmllbGQ6ICdwcmlvcml0eV9yYW5rJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICB9LFxuXG4gICAgLyoqIE92ZXJkdWUgLyBvcGVuIHRhc2tzIGFjcm9zcyB0aGUgdGVhbSBcdTIwMTQgc29ydGVkIG9sZGVzdC1kdWUgZmlyc3QgKi9cbiAgICBvdmVyZHVlX3Rhc2tzOiB7XG4gICAgICBuYW1lOiAnb3ZlcmR1ZV90YXNrcycsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICAvLyBIb25lc3QgbGFiZWwuIFR3byBpbmRlcGVuZGVudCByZWFzb25zIHdlcmUgcmVjb3JkZWQgZm9yIGl0OyBvbmUgc3RpbGxcbiAgICAgIC8vIGhvbGRzIGFuZCBvbmUgaGFzIGV4cGlyZWQgKCM3ODIpLCBzbyB0aGV5IGFyZSBzZXBhcmF0ZWQgaGVyZS5cbiAgICAgIC8vXG4gICAgICAvLyBTVElMTCBUUlVFIFx1MjAxNCBgaXNfb3ZlcmR1ZWAgaXMgYSBXUklURS1USU1FIHNuYXBzaG90LiBgdGFzay5ob29rLnRzOjY4YFxuICAgICAgLy8gc3RhbXBzIGl0IGluIGBiZWZvcmVTYXZlYCBvZmYgdGhhdCBtb21lbnQncyBjbG9jayAoYGVmZkR1ZSA8IHRvZGF5U3RyYFxuICAgICAgLy8gYW5kIG5vdCBjb21wbGV0ZWQpIGFuZCBub3RoaW5nIHJlLXN0YW1wcyBpdCBhZnRlcndhcmRzLCBzbyBhIHRhc2sgdGhhdFxuICAgICAgLy8gd2FzIG9uIHRpbWUgd2hlbiBpdCB3YXMgbGFzdCBzYXZlZCBzdGlsbCByZWFkcyBgaXNfb3ZlcmR1ZSA9IGZhbHNlYCB0aGVcbiAgICAgIC8vIGRheSBhZnRlciBpdHMgZHVlIGRhdGUgcGFzc2VzLiBBIGZpbHRlciBvbiB0aGF0IGNvbHVtbiB3b3VsZCBoYW5kIGJhY2tcbiAgICAgIC8vIHRoZSB3cm9uZyByb3dzLCBhbmQgaXQgd291bGQgZ28gd3Jvbmcgc2lsZW50bHkuXG4gICAgICAvL1xuICAgICAgLy8gRVhQSVJFRCBcdTIwMTQgdGhlIG90aGVyIHJlYXNvbiBzYWlkIHRoZSB2aWV3IGxheWVyIGNhbm5vdCByZXNvbHZlXG4gICAgICAvLyBgZHVlX2RhdGUgPCB7VE9EQVkoKX1gLCBhbmQgdGhhdCBvbmx5IGB7Y3VycmVudF91c2VyX2lkfWAgaW50ZXJwb2xhdGVzLlxuICAgICAgLy8gQm90aCBoYWx2ZXMgd2VyZSB3cm9uZyBhbHJlYWR5IG9uIDE3LjAuMC1yYy4yIFx1MjAxNCB0aGUgdmVyc2lvbiB0aGlzIHJlcG9cbiAgICAgIC8vIHBpbm5lZCBBVCBUSEUgVElNRSB0aGV5IHdlcmUgbWVhc3VyZWQsIG5vdCB0aGUgY3VycmVudCBwaW4gXHUyMDE0IGFuZCB0aGVcbiAgICAgIC8vIGZpbGUgc2FpZCB0aGUgb3Bwb3NpdGUgb2ZcbiAgICAgIC8vIGl0c2VsZjogdGhlIG5vdGUgb24gYHRvZGF5c190YXNrc2AgYWJvdmUgYXNzZXJ0ZWQgdGhhdFxuICAgICAgLy8gYHtjdXJyZW50X3VzZXJfaWR9YCBkb2VzIE5PVCBpbnRlcnBvbGF0ZS4gSXQgZG9lcy5cbiAgICAgIC8vIFRoYXQgY29tbWVudCBjYXJyaWVzIHRoZSBtZWFzdXJlbWVudHMgd2l0aCB0aGVpciB2ZXJzaW9ucywgSU5DTFVESU5HXG4gICAgICAvLyB0aGUgb25lIHRoYXQgbW92ZWQ6IGB7VE9EQVkoKX1gIGlzIFJFSkVDVEVEIGZyb20gMTcuMi4wIG9uXG4gICAgICAvLyAoYEZJTFRFUl9UT0tFTl9VTktOT1dOYCwgcmUtY29uZmlybWVkIG9uIDE3LjMuMCBhbmQgYWdhaW4gb25cbiAgICAgIC8vIDE3LjQuMCBieVxuICAgICAgLy8gYHRlc3QvZmxvdy1maWx0ZXItdG9kYXktdG9rZW4udGVzdC50c2ApIHdoZXJlIG9uIHJjLjIgaXQgc2hpcHBlZCB0b1xuICAgICAgLy8gdGhlIGRyaXZlciBhcyB0ZXh0LCBzbyBcImNhbm5vdCByZXNvbHZlIGB7VE9EQVkoKX1gXCIgaXMgd3Jvbmcgb24gdGhlXG4gICAgICAvLyBjdXJyZW50IHBpbiBmb3IgYSBkaWZmZXJlbnQgcmVhc29uIHRoYW4gaXQgd2FzIHdyb25nIG9uIHJjLjIuIFRoZVxuICAgICAgLy8gY2Fub25pY2FsIGB7dG9kYXl9YCByZXNvbHZlcyBvbiB0aGUgcmVhZCBwYXRoIGVpdGhlciB3YXksIHNvIGFcbiAgICAgIC8vIHN0cmljdGx5IHBhc3QtZHVlIGZpbHRlciBJUyBleHByZXNzaWJsZTogYGR1ZV9kYXRlIDwgJ3t0b2RheX0nYFxuICAgICAgLy8gc2VsZWN0ZWQgZXhhY3RseSB0aGUgcGFzdC1kdWUgcm93cyBvdXQgb2YgZm91ciBvbiByYy4yLCBhbmQgZGlkIGFnYWluXG4gICAgICAvLyBvbiAxNy4yLjAgKFJFLU1FQVNVUkVEIDIwMjYtMDktMDM7IHRoYXQgcm93IGNvdW50IHdhcyBub3QgcmUtdGFrZW4gb25cbiAgICAgIC8vIDE3LjMuMCwgd2hlcmUgdGhlIHRva2VuJ3MgcmVzb2x1dGlvbiBpcyByZS1jb25maXJtZWQgYnkgdGhlIHRlc3QgZmlsZVxuICAgICAgLy8gbmFtZWQgYWJvdmUpLlxuICAgICAgLy9cbiAgICAgIC8vIFNvIHRoZSBob25lc3Qgc3RhdGVtZW50IGlzIG5hcnJvd2VyIHRoYW4gdGhlIG9uZSB0aGF0IHN0b29kIGhlcmU6IHRoaXNcbiAgICAgIC8vIHZpZXcgQ0FOIGJlIGdpdmVuIGEgc3RyaWN0bHkgcGFzdC1kdWUgY3V0IHRocm91Z2ggYHt0b2RheX1gLCBhbmQgaXMgbm90XG4gICAgICAvLyBnaXZlbiBvbmUuIEFkZGluZyBpdCBpcyBhIEJFSEFWSU9VUiBjaGFuZ2UsIG5vdCBhIGNvbW1lbnQgY29ycmVjdGlvbiBcdTIwMTRcbiAgICAgIC8vIGl0IHdvdWxkIGRyb3AgdG9kYXkncyBkdWUtdG9kYXkgd29yayBvdXQgb2YgdGhlIHF1ZXVlIGFuZCB0dXJuIGFuXG4gICAgICAvLyBcIk9wZW4gVGFza3NcIiBiYWNrbG9nIGludG8gYSBzdHJpY3Qgb3ZlcmR1ZSBsaXN0LCB3aGljaCBpcyB0aGVcbiAgICAgIC8vIGN1dC12ZXJzdXMtcmFua2luZyBxdWVzdGlvbiBhbHJlYWR5IG9wZW4gb24gIzc3MCBmb3IgdGhlIHRhc2sgdmlld3MuXG4gICAgICAvLyBUaGF0IGFsc28gcmV0aXJlcyB0aGUgZm9sbG93LXVwIHRoaXMgY29tbWVudCB1c2VkIHRvIGVuZCBvbjogYW4gaG91cmx5XG4gICAgICAvLyBmbG93IHJlLXN0YW1waW5nIGBpc19vdmVyZHVlYCB3YXMgcHJvcG9zZWQgYXMgdGhlIE9OTFkgcm91dGUgdG8gYVxuICAgICAgLy8gdHJ1bHktb3ZlcmR1ZSBnYXVnZSwgYmVjYXVzZSB0aGUgZmlsdGVyIHJvdXRlIHdhcyBiZWxpZXZlZCBjbG9zZWQuXG4gICAgICAvLyBUaGVyZSBhcmUgdHdvIHJvdXRlcyBub3csIGFuZCBjaG9vc2luZyBiZXR3ZWVuIHRoZW0gYmVsb25ncyB0byAjNzcwLlxuICAgICAgLy9cbiAgICAgIC8vIEFzIHNoaXBwZWQ6IHRoZSBvcGVuLXRhc2sgYmFja2xvZyBvcmRlcmVkIG1vc3Qtb3ZlcmR1ZS1maXJzdCAob2xkZXN0XG4gICAgICAvLyBkdWUgZGF0ZSBvbiB0b3ApLCB3aGljaCBpcyB0aGUgYWN0aW9uYWJsZSBxdWV1ZSBhIG1hbmFnZXIgd29ya3MuXG4gICAgICBsYWJlbDogJ1x1MjNGMCBPcGVuIFRhc2tzIFx1MDBCNyBNb3N0IE92ZXJkdWUgRmlyc3QnLFxuICAgICAgdXNlckFjdGlvbnM6IHsgZWRpdElubGluZTogdHJ1ZSB9LFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV90YXNrJyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3ByaW9yaXR5JywgJ3N0YXR1cycsICdkdWVfZGF0ZScsICdvd25lcl9pZCddLFxuICAgICAgZmlsdGVyOiBbXG4gICAgICAgIHsgZmllbGQ6ICdpc19jb21wbGV0ZWQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiBmYWxzZSB9LFxuICAgICAgXSxcbiAgICAgIHNvcnQ6IFt7IGZpZWxkOiAnZHVlX2RhdGUnLCBvcmRlcjogJ2FzYycgfV0sXG4gICAgfSxcbiAgfSxcblxuICBmb3JtOiB7XG4gICAgdHlwZTogJ3NpbXBsZScsXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3Rhc2snLFxuICAgICAgICBsYWJlbDogJ1Rhc2snLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICAvLyBgdHlwZWAgKGNhbGwgLyBlbWFpbCAvIG1lZXRpbmcgLyBkZW1vKSBpcyB3aGF0IG1ha2VzIGFuIGFjdGl2aXR5XG4gICAgICAgIC8vIGhpc3RvcnkgcmVhZGFibGUgYW5kIGlzIHRoZSBmaXJzdCB0aGluZyBhIHJlcCByZWFjaGVzIGZvciBhZnRlciB0aGVcbiAgICAgICAgLy8gc3ViamVjdCBcdTIwMTQgaXQgd2FzIG1pc3NpbmcgZW50aXJlbHkuIGBkZXNjcmlwdGlvbmAgY2FwdHVyZXMgd2hhdCB3YXNcbiAgICAgICAgLy8gYWN0dWFsbHkgc2FpZCBvbiB0aGUgY2FsbC4gYHByb2dyZXNzX3BlcmNlbnRgIG1vdmVkIHRvIHRoZSBFZmZvcnRcbiAgICAgICAgLy8gc2VjdGlvbjogYSB0YXNrIGJlaW5nIGZpbGVkIGlzIDAlIGJ5IGRlZmluaXRpb24sIHNvIGEgcGVyY2VudGFnZVxuICAgICAgICAvLyBzbGlkZXIgb24gdGhlIGNyZWF0ZSBmb3JtIGlzIG5vaXNlLlxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IGZpZWxkOiAnc3ViamVjdCcsIHJlcXVpcmVkOiB0cnVlLCBzcGFuOiAnZnVsbCcgfSxcbiAgICAgICAgICB7IGZpZWxkOiAndHlwZScsIHJlcXVpcmVkOiBmYWxzZSB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICdwcmlvcml0eScsXG4gICAgICAgICAgJ2R1ZV9kYXRlJyxcbiAgICAgICAgICAnb3duZXJfaWQnLFxuICAgICAgICAgICdyZW1pbmRlcl9kYXRlJyxcbiAgICAgICAgICB7IGZpZWxkOiAnZGVzY3JpcHRpb24nLCBzcGFuOiAnZnVsbCcgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdyZWxhdGVkX3JlY29yZHMnLFxuICAgICAgICBsYWJlbDogJ1JlbGF0ZWQgUmVjb3JkcycsXG4gICAgICAgIGNvbGxhcHNpYmxlOiB0cnVlLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAncmVsYXRlZF90b19hY2NvdW50JyxcbiAgICAgICAgICAncmVsYXRlZF90b19jb250YWN0JyxcbiAgICAgICAgICAncmVsYXRlZF90b19vcHBvcnR1bml0eScsXG4gICAgICAgICAgJ3JlbGF0ZWRfdG9fbGVhZCcsXG4gICAgICAgICAgJ3JlbGF0ZWRfdG9fY2FzZScsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncmVjdXJyZW5jZV9hbmRfZWZmb3J0JyxcbiAgICAgICAgbGFiZWw6ICdSZWN1cnJlbmNlICYgRWZmb3J0JyxcbiAgICAgICAgY29sbGFwc2libGU6IHRydWUsXG4gICAgICAgIGNvbGxhcHNlZDogdHJ1ZSxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgJ2lzX3JlY3VycmluZycsXG4gICAgICAgICAgJ3JlY3VycmVuY2VfdHlwZScsXG4gICAgICAgICAgJ3JlY3VycmVuY2VfaW50ZXJ2YWwnLFxuICAgICAgICAgICdyZWN1cnJlbmNlX2VuZF9kYXRlJyxcbiAgICAgICAgICAncHJvZ3Jlc3NfcGVyY2VudCcsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzL2V2ZW50LnZpZXcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3MvZXZlbnQudmlldy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBFdmVudCBWaWV3cyAoIzU5MilcbiAqXG4gKiAgIFx1MjAyMiBncmlkICAgICBcdTIwMTQgZXZlcnkgaW50ZXJhY3Rpb24sIG1vc3QgcmVjZW50IGZpcnN0XG4gKiAgIFx1MjAyMiBjYWxlbmRhciBcdTIwMTQgdGhlIHNjaGVkdWxlLCBzdGFydCBcdTIxOTIgZW5kICh0aGUgcGxhdGZvcm0gdmlldyB0eXBlIHRoZSBpc3N1ZSBhc2tzIGZvcilcbiAqICAgXHUyMDIyIHRpbWVsaW5lIFx1MjAxNCB0aGUgc2FtZSByb3dzIGxhaWQgb3V0IHBlciByZXBcbiAqICAgXHUyMDIyIG1pbmUgICAgIFx1MjAxNCBteSBjYWxlbmRhclxuICogICBcdTIwMjIgdXBjb21pbmcgXHUyMDE0IHdoYXQgaXMgYm9va2VkIGJ1dCBoYXMgbm90IGhhcHBlbmVkIHlldFxuICogICBcdTIwMjIgaGVsZCAgICAgXHUyMDE0IHdoYXQgYWN0dWFsbHkgaGFwcGVuZWQsIHRoZSBpbnRlcmFjdGlvbiBoaXN0b3J5XG4gKlxuICogIyBXaHkgbm8gXCJwYXN0IGV2ZW50c1wiIGZpbHRlciBvbiBhIGRhdGVcbiAqXG4gKiBUaGUgbGlzdC12aWV3IGRhdGEgcGF0aCByZXNvbHZlcyBPTkxZIHRoZSB1c2VyIHRva2VucyAoYHtjdXJyZW50X3VzZXJfaWR9YCk7XG4gKiBkYXRlIG1hY3JvcyBzaGlwIHRvIHRoZSBzZXJ2ZXIgYXMgbGl0ZXJhbCBzdHJpbmdzLCBhbmQgYmVjYXVzZVxuICogYCcyMDI2LVx1MjAyNicgPCAne1x1MjAyNidgIGlzIGxleGljb2dyYXBoaWNhbGx5IHRydWUsIGEgYHN0YXJ0X2RhdGV0aW1lIDwge3RvZGF5fWBcbiAqIGZpbHRlciBtYXRjaGVzIHRoZSBGVVRVUkUgcm93cyBpbnN0ZWFkIG9mIHRoZSBwYXN0IG9uZXMgXHUyMDE0IGludmVydGVkLCBub3RcbiAqIG1lcmVseSBlbXB0eSAodGhlIHNhbWUgdHJhcCBgb3ZlcmR1ZV90YXNrc2AgZG9jdW1lbnRzKS4gU28gdGhlIHBhc3QvZnV0dXJlXG4gKiBzcGxpdCBpcyBleHByZXNzZWQgd2l0aCBgc3RhdHVzYCwgd2hpY2ggaXMgYXV0aG9yZWQgYW5kIGRvZXMgbm90IGRlY2F5LCBhbmRcbiAqIHRoZSBvcmRlcmluZyBkb2VzIHRoZSByZXN0LlxuICovXG5leHBvcnQgY29uc3QgRXZlbnRWaWV3cyA9IGRlZmluZVZpZXcoe1xuICBsaXN0OiB7XG4gICAgdHlwZTogJ2dyaWQnLFxuICAgIG5hbWU6ICdhbGxfZXZlbnRzJyxcbiAgICBsYWJlbDogJ0FsbCBFdmVudHMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2V2ZW50JyB9LFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICdzdWJqZWN0Jywgd2lkdGg6IDI4MCwgc29ydGFibGU6IHRydWUsIGxpbms6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICd0eXBlJywgd2lkdGg6IDEyMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCB3aWR0aDogMTIwLCBzb3J0YWJsZTogdHJ1ZSB9LFxuICAgICAgeyBmaWVsZDogJ3N0YXJ0X2RhdGV0aW1lJywgd2lkdGg6IDE4MCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdkdXJhdGlvbl9taW51dGVzJywgd2lkdGg6IDEyMCwgYWxpZ246ICdyaWdodCcgfSxcbiAgICAgIHsgZmllbGQ6ICdsb2NhdGlvbicsIHdpZHRoOiAxODAgfSxcbiAgICAgIHsgZmllbGQ6ICdvd25lcl9pZCcsIHdpZHRoOiAxNTAgfSxcbiAgICBdLFxuICAgIHNvcnQ6IFt7IGZpZWxkOiAnc3RhcnRfZGF0ZXRpbWUnLCBvcmRlcjogJ2Rlc2MnIH1dLFxuICAgIHJvd0NvbG9yOiB7XG4gICAgICAvLyBNaXJyb3JzIHRoZSBvcHRpb24gY29sb3JzIG9uIGNybV9ldmVudC5zdGF0dXMuXG4gICAgICBmaWVsZDogJ3N0YXR1cycsXG4gICAgICBjb2xvcnM6IHsgcGxhbm5lZDogJ2JsdWUnLCBoZWxkOiAnZ3JlZW4nLCBjYW5jZWxsZWQ6ICdzbGF0ZScsIG5vX3Nob3c6ICdvcmFuZ2UnIH0sXG4gICAgfSxcbiAgICBzZWxlY3Rpb246IHsgdHlwZTogJ211bHRpcGxlJyB9LFxuICAgIHBhZ2luYXRpb246IHsgcGFnZVNpemU6IDUwIH0sXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnLCAnY2FsZW5kYXInLCAndGltZWxpbmUnLCAna2FuYmFuJ10sXG4gICAgfSxcbiAgICAvLyBCaW5kcyB0aGUgJ2NhbGVuZGFyJyBlbnRyeSBhYm92ZTogdGhlIHNhbWUgc3BhbiB0aGUgZGVkaWNhdGVkXG4gICAgLy8gYGV2ZW50X2NhbGVuZGFyYCB2aWV3IHNob3dzLiBgc3RhcnRfZGF0ZXRpbWVgIGlzIHJlcXVpcmVkICsgbm90TnVsbDtcbiAgICAvLyBgZW5kX2RhdGV0aW1lYCBpcyBvcHRpb25hbCwgc28gYW4gZXZlbnQgd2l0aG91dCBvbmUgc3RheXMgYSBzaW5nbGUgcG9pbnRcbiAgICAvLyBpbiB0aW1lIHJhdGhlciB0aGFuIGJvcnJvd2luZyBhIG5laWdoYm91cidzIGVuZC5cbiAgICBjYWxlbmRhcjoge1xuICAgICAgc3RhcnREYXRlRmllbGQ6ICdzdGFydF9kYXRldGltZScsXG4gICAgICBlbmREYXRlRmllbGQ6ICdlbmRfZGF0ZXRpbWUnLFxuICAgICAgdGl0bGVGaWVsZDogJ3N1YmplY3QnLFxuICAgICAgY29sb3JGaWVsZDogJ3R5cGUnLFxuICAgIH0sXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgLyoqIFRoZSBjYWxlbmRhciB0aGUgaXNzdWUgYXNrcyBmb3IgXHUyMDE0IHN0YXJ0IFx1MjE5MiBlbmQsIGNvbG91cmVkIGJ5IGtpbmQuICovXG4gICAgZXZlbnRfY2FsZW5kYXI6IHtcbiAgICAgIG5hbWU6ICdldmVudF9jYWxlbmRhcicsXG4gICAgICB0eXBlOiAnY2FsZW5kYXInLFxuICAgICAgbGFiZWw6ICdFdmVudCBDYWxlbmRhcicsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2V2ZW50JyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3R5cGUnLCAnb3duZXJfaWQnXSxcbiAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnc3RhcnRfZGF0ZXRpbWUnLFxuICAgICAgICBlbmREYXRlRmllbGQ6ICdlbmRfZGF0ZXRpbWUnLFxuICAgICAgICB0aXRsZUZpZWxkOiAnc3ViamVjdCcsXG4gICAgICAgIGNvbG9yRmllbGQ6ICd0eXBlJyxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKiBXaG8gaXMgYm9va2VkIHdoZW4gXHUyMDE0IG9uZSBsYW5lIHBlciByZXAuICovXG4gICAgZXZlbnRfdGltZWxpbmU6IHtcbiAgICAgIG5hbWU6ICdldmVudF90aW1lbGluZScsXG4gICAgICB0eXBlOiAndGltZWxpbmUnLFxuICAgICAgbGFiZWw6ICdUZWFtIFNjaGVkdWxlJyxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fZXZlbnQnIH0sXG4gICAgICBjb2x1bW5zOiBbJ3N1YmplY3QnLCAnc3RhdHVzJ10sXG4gICAgICB0aW1lbGluZToge1xuICAgICAgICBzdGFydERhdGVGaWVsZDogJ3N0YXJ0X2RhdGV0aW1lJyxcbiAgICAgICAgZW5kRGF0ZUZpZWxkOiAnZW5kX2RhdGV0aW1lJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ3N1YmplY3QnLFxuICAgICAgICBncm91cEJ5RmllbGQ6ICdvd25lcl9pZCcsXG4gICAgICAgIGNvbG9yRmllbGQ6ICd0eXBlJyxcbiAgICAgICAgc2NhbGU6ICdkYXknLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgbXlfZXZlbnRzOiB7XG4gICAgICBuYW1lOiAnbXlfZXZlbnRzJyxcbiAgICAgIHR5cGU6ICdjYWxlbmRhcicsXG4gICAgICBsYWJlbDogJ015IENhbGVuZGFyJyxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fZXZlbnQnIH0sXG4gICAgICBjb2x1bW5zOiBbJ3N1YmplY3QnLCAndHlwZScsICdsb2NhdGlvbiddLFxuICAgICAgLy8gYHtjdXJyZW50X3VzZXJfaWR9YCBpcyB0aGUgb25lIHRva2VuIHRoZSBsaXN0LXZpZXcgZGF0YSBwYXRoIHJlYWxseVxuICAgICAgLy8gaW50ZXJwb2xhdGVzIChzZWUgY3JtLmFwcC50cydzIFwiTXkgV29ya1wiIG5vdGUpLlxuICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ293bmVyX2lkJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ3tjdXJyZW50X3VzZXJfaWR9JyB9XSxcbiAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnc3RhcnRfZGF0ZXRpbWUnLFxuICAgICAgICBlbmREYXRlRmllbGQ6ICdlbmRfZGF0ZXRpbWUnLFxuICAgICAgICB0aXRsZUZpZWxkOiAnc3ViamVjdCcsXG4gICAgICAgIGNvbG9yRmllbGQ6ICd0eXBlJyxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKiBCb29rZWQsIG5vdCB5ZXQgaGVsZCBcdTIwMTQgc29vbmVzdCBmaXJzdC4gKi9cbiAgICB1cGNvbWluZ19ldmVudHM6IHtcbiAgICAgIG5hbWU6ICd1cGNvbWluZ19ldmVudHMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdcdUQ4M0RcdURDQzUgVXBjb21pbmcgXHUwMEI3IFNvb25lc3QgRmlyc3QnLFxuICAgICAgdXNlckFjdGlvbnM6IHsgZWRpdElubGluZTogdHJ1ZSB9LFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9ldmVudCcgfSxcbiAgICAgIGNvbHVtbnM6IFsnc3ViamVjdCcsICd0eXBlJywgJ3N0YXJ0X2RhdGV0aW1lJywgJ2xvY2F0aW9uJywgJ3JlbGF0ZWRfdG9fdHlwZScsICdvd25lcl9pZCddLFxuICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ3N0YXR1cycsIG9wZXJhdG9yOiAnZXF1YWxzJywgdmFsdWU6ICdwbGFubmVkJyB9XSxcbiAgICAgIHNvcnQ6IFt7IGZpZWxkOiAnc3RhcnRfZGF0ZXRpbWUnLCBvcmRlcjogJ2FzYycgfV0sXG4gICAgfSxcblxuICAgIC8qKiBXaGF0IGFjdHVhbGx5IGhhcHBlbmVkIFx1MjAxNCB0aGUgaW50ZXJhY3Rpb24gaGlzdG9yeSB0aGUgQ1JNIGNvdWxkIG5vdCBzaG93LiAqL1xuICAgIGhlbGRfZXZlbnRzOiB7XG4gICAgICBuYW1lOiAnaGVsZF9ldmVudHMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgbGFiZWw6ICdcdTI3MDUgSW50ZXJhY3Rpb24gSGlzdG9yeScsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2V2ZW50JyB9LFxuICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3R5cGUnLCAnc3RhcnRfZGF0ZXRpbWUnLCAnZHVyYXRpb25fbWludXRlcycsICdyZWxhdGVkX3RvX3R5cGUnLCAnb3duZXJfaWQnXSxcbiAgICAgIGZpbHRlcjogW3sgZmllbGQ6ICdzdGF0dXMnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiAnaGVsZCcgfV0sXG4gICAgICBzb3J0OiBbeyBmaWVsZDogJ3N0YXJ0X2RhdGV0aW1lJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICB9LFxuICB9LFxuXG4gIGZvcm06IHtcbiAgICB0eXBlOiAnc2ltcGxlJyxcbiAgICBzZWN0aW9uczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnZXZlbnQnLFxuICAgICAgICBsYWJlbDogJ0V2ZW50JyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ3N1YmplY3QnLCByZXF1aXJlZDogdHJ1ZSwgc3BhbjogJ2Z1bGwnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ3R5cGUnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdzdGF0dXMnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICdvd25lcl9pZCcsXG4gICAgICAgICAgJ2xvY2F0aW9uJyxcbiAgICAgICAgICB7IGZpZWxkOiAnZGVzY3JpcHRpb24nLCBzcGFuOiAnZnVsbCcgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzY2hlZHVsZScsXG4gICAgICAgIGxhYmVsOiAnU2NoZWR1bGUnLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICB7IGZpZWxkOiAnc3RhcnRfZGF0ZXRpbWUnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgICdlbmRfZGF0ZXRpbWUnLFxuICAgICAgICAgICdhbGxfZGF5JyxcbiAgICAgICAgICAnZHVyYXRpb25fbWludXRlcycsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncmVsYXRlZF9yZWNvcmRzJyxcbiAgICAgICAgbGFiZWw6ICdSZWxhdGVkIFJlY29yZHMnLFxuICAgICAgICBjb2xsYXBzaWJsZTogdHJ1ZSxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgJ3JlbGF0ZWRfdG9fYWNjb3VudCcsXG4gICAgICAgICAgJ3JlbGF0ZWRfdG9fY29udGFjdCcsXG4gICAgICAgICAgJ3JlbGF0ZWRfdG9fb3Bwb3J0dW5pdHknLFxuICAgICAgICAgICdyZWxhdGVkX3RvX2xlYWQnLFxuICAgICAgICAgICdyZWxhdGVkX3RvX2Nhc2UnLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ291dGNvbWUnLFxuICAgICAgICBsYWJlbDogJ091dGNvbWUnLFxuICAgICAgICBjb2xsYXBzaWJsZTogdHJ1ZSxcbiAgICAgICAgY29sbGFwc2VkOiB0cnVlLFxuICAgICAgICBjb2x1bW5zOiAxLFxuICAgICAgICBmaWVsZHM6IFsnb3V0Y29tZV9ub3RlcyddLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy92aWV3cy9ldmVudF9hdHRlbmRlZS52aWV3LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzL2V2ZW50X2F0dGVuZGVlLnZpZXcudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZVZpZXcgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogRXZlbnQgQXR0ZW5kZWUgVmlld3MgKCM1OTIpXG4gKlxuICogQSBqdW5jdGlvbiBvYmplY3QgaXMgbm9ybWFsbHkgZWRpdGVkIGluc2lkZSBpdHMgcGFyZW50J3MgcmVsYXRlZCBsaXN0LCBhbmRcbiAqIGBjcm1fZXZlbnRfYXR0ZW5kZWVgIGlzIG5vIGV4Y2VwdGlvbi4gSXQgY2FycmllcyBubyBuYXZpZ2F0aW9uIGVudHJ5OiBhblxuICogYXR0ZW5kZWUgaXMgbmV2ZXIgc29tZXRoaW5nIHlvdSBnbyBsb29raW5nIGZvciBvbiBpdHMgb3duLCB5b3UgcmVhY2ggaXRcbiAqIHRocm91Z2ggdGhlIG1lZXRpbmcuXG4gKlxuICogIyBXaGF0IGVhY2ggaGFsZiBvZiB0aGlzIGJ1bmRsZSBhY3R1YWxseSByZW5kZXJzIFx1MjAxNCBtZWFzdXJlZCAoIzk0NClcbiAqXG4gKiBUaGlzIGhlYWRlciB1c2VkIHRvIGp1c3RpZnkgYm90aCBoYWx2ZXMgaW4gb25lIHNlbnRlbmNlOiB0aGUgcmVsYXRlZCBsaXN0XG4gKiByZW5kZXJzIFRISVMgdmlldydzIGNvbHVtbnMsIHRoZSBxdWljay1jcmVhdGUgbW9kYWwgcmVuZGVycyBUSElTIGZvcm0sIGFuZFxuICogd2l0aG91dCB0aGVtIHRoZSBwYW5lbCBmYWxscyBiYWNrIHRvIGV2ZXJ5IGNvbHVtbiBpbiBkZWNsYXJhdGlvbiBvcmRlciB3aGlsZVxuICogdGhlIG1vZGFsIG9mZmVycyB0aGUgcmF3IGF1dG9udW1iZXIgXHUyMDE0IFwiZm9yIHRoZSBzYW1lIHJlYXNvblxuICogYGNybV9jYW1wYWlnbl9tZW1iZXJgIGhhcyB0aGVtXCIuIGBjcm1fY2FtcGFpZ25fbWVtYmVyYCBoYXMgbm8gdmlldyBtZXRhZGF0YVxuICogYXQgYWxsLCB3aGljaCBpcyB3aGF0IHNlbnQgIzk0NCBsb29raW5nOyByZS1tZWFzdXJpbmcgdGhlIHBhcmFncmFwaCBhZ2FpbnN0XG4gKiB0aGUgc2hpcHBlZCBDb25zb2xlICgxNy4wLjAtcmMuMykgbGVmdCBvbmx5IHRoZSBmb3JtIGhhbGYgc3RhbmRpbmcuXG4gKlxuICogKipgZm9ybWAgXHUyMDE0IGxpdmUuKiogVGhlIENvbnNvbGUgbWVyZ2VzIGEgdmlldyBidW5kbGUncyBgZm9ybWAgb250byB0aGUgb2JqZWN0XG4gKiBkZWZpbml0aW9uIGl0IGhvbGRzLCBhbmQgdGhlIHJlY29yZCBkcmF3ZXIgYSByZWxhdGVkIGxpc3Qgb3BlbnMgKFwiTmV3XCIgb25cbiAqIHRoZSBwYW5lbCwgZWRpdCBvbiBhIHJvdykgcmVuZGVycyB0aGF0IGZvcm0ncyBgc2VjdGlvbnNgLiBXaGF0IHRoZSBhdXRob3JlZFxuICogZm9ybSBidXlzIGlzIHRoZSBzZWN0aW9uIHNwbGl0IGFuZCB0aGUgZmllbGQgb3JkZXIgXHUyMDE0IG5vdCByZXNjdWUgZnJvbSBhIHJhd1xuICogYXV0b251bWJlciwgYmVjYXVzZSB0aGUgbm8tZm9ybSBmYWxsYmFjayBpcyBub3QgcmF3IGVpdGhlcjogaW4gYGNyZWF0ZWAgbW9kZVxuICogdGhlIGRyYXdlciBkcm9wcyBgYXV0b251bWJlcmAsIGBmb3JtdWxhYCBhbmQgYHN1bW1hcnlgIGZpZWxkcyAoYW5kIGFueXRoaW5nXG4gKiBoaWRkZW4gb3IgcmVhZG9ubHkpIGFuZCBzZWN0aW9ucyB3aGF0ZXZlciBpcyBsZWZ0IGJ5IHRoZSBvYmplY3QncyBvd25cbiAqIGBmaWVsZEdyb3Vwc2AuIGBhdHRlbmRlZV9udW1iZXJgIHdhcyBuZXZlciBvbiBvZmZlci5cbiAqXG4gKiAqKmBsaXN0YCBcdTIwMTQgbm90IHdoYXQgdGhlIHJlbGF0ZWQgbGlzdCByZWFkcy4qKiBBIGRldGFpbC1wYWdlIHJlbGF0ZWQgbGlzdFxuICogdGFrZXMgaXRzIGNvbHVtbnMgZnJvbSB0aGUgQ0hJTEQncyBsb29rdXAgZmllbGQgXHUyMDE0IGByZWxhdGVkTGlzdENvbHVtbnNgIG9uXG4gKiBgY3JtX2V2ZW50YCwgd2hpY2ggdGhpcyBhcHAgYXV0aG9ycyBub3doZXJlIFx1MjAxNCBhbmQgZmFsbHMgYmFjayB0byB0aGUgY2hpbGRcbiAqIG9iamVjdCdzIGBoaWdobGlnaHRGaWVsZHNgIG1pbnVzIHRoZSBwYXJlbnQgbG9va3VwLCBjYXBwZWQgYXQgc2l4LCB3aXRoXG4gKiBjb2x1bW5zIHRoYXQgYXJlIGVtcHR5IG9uIGV2ZXJ5IGZldGNoZWQgcm93IGRyb3BwZWQuIE9ubHkgYW4gb2JqZWN0IHdpdGggbm9cbiAqIGBoaWdobGlnaHRGaWVsZHNgIHJlYWNoZXMgdGhlIGxhc3QgcmVzb3J0LCBhbmQgdGhhdCBpcyBhIGhldXJpc3RpYyBvdmVyIHRoZVxuICogZmllbGQgbWFwICh0aXRsZS1pc2ggbmFtZXMgZmlyc3QsIGF1ZGl0IGNvbHVtbnMgbGFzdCwgYHJpY2hfdGV4dGAgLyBgaHRtbGAgL1xuICogYGpzb25gIGV4Y2x1ZGVkKSBcdTIwMTQgbm90IGRlY2xhcmF0aW9uIG9yZGVyLCBhbmQgbmV2ZXIgdGhpcyB2aWV3LiBTbyB0aGVcbiAqIGF0dGVuZGVlIHBhbmVsIG9uIGEgbWVldGluZyBzaG93cyBgYXR0ZW5kZWVfdHlwZWAsIGByZXNwb25zZWAgYW5kXG4gKiBgaXNfb3JnYW5pemVyYCwgc3RyYWlnaHQgb2ZmIGBjcm1fZXZlbnRfYXR0ZW5kZWUuaGlnaGxpZ2h0RmllbGRzYCwgd2hhdGV2ZXJcbiAqIHRoZSBjb2x1bW5zIGJlbG93IHNheS5cbiAqXG4gKiBUaGUgZ3JpZCBpcyB0aGVyZWZvcmUgcmVhY2hhYmxlIG9ubHkgYXQgdGhpcyBvYmplY3QncyBvd24gbGlzdCBVUkwsIHdoaWNoIG5vXG4gKiBuYXZpZ2F0aW9uIGVudHJ5IGxpbmtzIHRvLiBJdCBpcyBrZXB0IGFzIHRoZSBjdXJhdGVkIGFuc3dlciB0byBcIndoYXQgZG8geW91XG4gKiBzaG93IGFib3V0IGFuIGF0dGVuZGVlXCIsIGFuZCBpdCBpcyB3aGF0IGEgZnV0dXJlIGByZWxhdGVkTGlzdENvbHVtbnNgIHdvdWxkXG4gKiBiZSBjb3BpZWQgZnJvbSBcdTIwMTQgYnV0IG5vdGhpbmcgaW4gdGhpcyByZXBvIG1heSBjaXRlIGl0IGFzIHdoYXQgbWFrZXMgYVxuICogcmVsYXRlZCBsaXN0IHJlYWRhYmxlLiBUaGUgbG9hZC1iZWFyaW5nIG1ldGFkYXRhIGlzIGBoaWdobGlnaHRGaWVsZHNgLCBhbmRcbiAqIGB0ZXN0L3ZpZXctcmVmZXJlbmNlcy50ZXN0LnRzYCBwaW5zIGl0IGZvciBldmVyeSBvYmplY3QgcmVhY2hlZCBvbmx5IHRocm91Z2hcbiAqIGEgcGFyZW50OiBzdHJpcCBpdCBhbmQgdGhlIHBhbmVsIHJlYWxseSBkb2VzIGZhbGwgdG8gdGhlIGhldXJpc3RpYywgd2hpY2hcbiAqIGxlYWRzIHdpdGggdGhlIGF1dG9udW1iZXIgdGhlc2Ugb2JqZWN0cyB1c2UgYXMgdGhlaXIgYG5hbWVGaWVsZGAuXG4gKi9cbmV4cG9ydCBjb25zdCBFdmVudEF0dGVuZGVlVmlld3MgPSBkZWZpbmVWaWV3KHtcbiAgbGlzdDoge1xuICAgIHR5cGU6ICdncmlkJyxcbiAgICBuYW1lOiAnYWxsX2V2ZW50X2F0dGVuZGVlcycsXG4gICAgbGFiZWw6ICdFdmVudCBBdHRlbmRlZXMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2V2ZW50X2F0dGVuZGVlJyB9LFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICdhdHRlbmRlZV90eXBlJywgd2lkdGg6IDEyMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdjcm1fY29udGFjdCcsIHdpZHRoOiAyMDAgfSxcbiAgICAgIHsgZmllbGQ6ICdjcm1fbGVhZCcsIHdpZHRoOiAyMDAgfSxcbiAgICAgIHsgZmllbGQ6ICdzeXNfdXNlcicsIHdpZHRoOiAyMDAgfSxcbiAgICAgIHsgZmllbGQ6ICdleHRlcm5hbF9uYW1lJywgd2lkdGg6IDIwMCB9LFxuICAgICAgeyBmaWVsZDogJ3Jlc3BvbnNlJywgd2lkdGg6IDE0MCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdpc19vcmdhbml6ZXInLCB3aWR0aDogMTAwLCBhbGlnbjogJ2NlbnRlcicgfSxcbiAgICBdLFxuICAgIHNvcnQ6IFt7IGZpZWxkOiAnaXNfb3JnYW5pemVyJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICByb3dDb2xvcjoge1xuICAgICAgLy8gTWlycm9ycyB0aGUgb3B0aW9uIGNvbG9ycyBvbiBjcm1fZXZlbnRfYXR0ZW5kZWUucmVzcG9uc2UuXG4gICAgICBmaWVsZDogJ3Jlc3BvbnNlJyxcbiAgICAgIGNvbG9yczogeyBhY2NlcHRlZDogJ2dyZWVuJywgZGVjbGluZWQ6ICdyZWQnLCB0ZW50YXRpdmU6ICdvcmFuZ2UnLCBub19yZXNwb25zZTogJ3NsYXRlJyB9LFxuICAgIH0sXG4gICAgcGFnaW5hdGlvbjogeyBwYWdlU2l6ZTogMjUgfSxcbiAgfSxcblxuICBmb3JtOiB7XG4gICAgdHlwZTogJ3NpbXBsZScsXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2F0dGVuZGVlJyxcbiAgICAgICAgbGFiZWw6ICdBdHRlbmRlZScsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgZmllbGQ6ICdjcm1fZXZlbnQnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgICAgICAgIHsgZmllbGQ6ICdhdHRlbmRlZV90eXBlJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICAnY3JtX2NvbnRhY3QnLFxuICAgICAgICAgICdjcm1fbGVhZCcsXG4gICAgICAgICAgJ3N5c191c2VyJyxcbiAgICAgICAgICAnZXh0ZXJuYWxfbmFtZScsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaW52aXRhdGlvbicsXG4gICAgICAgIGxhYmVsOiAnSW52aXRhdGlvbicsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydyZXNwb25zZScsICdpc19vcmdhbml6ZXInLCAnaW52aXRlZF9kYXRlJ10sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3ZpZXdzL2ZvcmVjYXN0LnZpZXcudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvdmlld3MvZm9yZWNhc3Qudmlldy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBGb3JlY2FzdCBWaWV3c1xuICpcbiAqICAgXHUyMDIyIGdyaWQgICAgICAgICAgICBcdTIwMTQgZXZlcnkgc25hcHNob3RcbiAqICAgXHUyMDIyIGN1cnJlbnRfcXVhcnRlciBcdTIwMTQgb3duZXJzIFx1MDBENyB0aGlzLXF1YXJ0ZXIgcm93XG4gKiAgIFx1MjAyMiBteV9mb3JlY2FzdCAgICAgXHUyMDE0IGN1cnJlbnQgdXNlcidzIHNuYXBzaG90c1xuICovXG5leHBvcnQgY29uc3QgRm9yZWNhc3RWaWV3cyA9IGRlZmluZVZpZXcoe1xuICBsaXN0OiB7XG4gICAgdHlwZTogJ2dyaWQnLFxuICAgIG5hbWU6ICdhbGxfZm9yZWNhc3RzJyxcbiAgICBsYWJlbDogJ0FsbCBGb3JlY2FzdHMnLFxuICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2ZvcmVjYXN0JyB9LFxuICAgIGNvbHVtbnM6IFtcbiAgICAgIHsgZmllbGQ6ICdvd25lcl9pZCcsICAgICAgICAgICAgd2lkdGg6IDE2MCwgcGlubmVkOiAnbGVmdCcsIGxpbms6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdwZXJpb2RfbGFiZWwnLCAgICAgd2lkdGg6IDEzMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdwZXJpb2Rfc3RhcnQnLCAgICAgd2lkdGg6IDEzMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdzbmFwc2hvdF9kYXRlJywgICAgd2lkdGg6IDEzMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdxdW90YScsICAgICAgICAgICAgd2lkdGg6IDEzMCwgYWxpZ246ICdyaWdodCcsIHN1bW1hcnk6ICdzdW0nIH0sXG4gICAgICB7IGZpZWxkOiAnY2xvc2VkX2Ftb3VudCcsICAgIHdpZHRoOiAxNDAsIGFsaWduOiAncmlnaHQnLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgeyBmaWVsZDogJ2NvbW1pdF9hbW91bnQnLCAgICB3aWR0aDogMTQwLCBhbGlnbjogJ3JpZ2h0Jywgc3VtbWFyeTogJ3N1bScgfSxcbiAgICAgIHsgZmllbGQ6ICdiZXN0X2Nhc2VfYW1vdW50Jywgd2lkdGg6IDE0MCwgYWxpZ246ICdyaWdodCcsIHN1bW1hcnk6ICdzdW0nIH0sXG4gICAgICB7IGZpZWxkOiAncGlwZWxpbmVfYW1vdW50JywgIHdpZHRoOiAxNDAsIGFsaWduOiAncmlnaHQnLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgLy8gTm8gdG90YWwgaGVyZTogYSBmb3JtdWxhIGhhcyBubyBzdG9yZWQgY29sdW1uIHRvIGFnZ3JlZ2F0ZSwgc28gdGhlIHNwZWMgcmVmdXNlcyBgc3VtYCBvbiBhIGBmb3JtdWxhYCBmaWVsZCAoIzE5ODApLlxuICAgICAgeyBmaWVsZDogJ2V4cGVjdGVkX2Ftb3VudCcsICB3aWR0aDogMTQwLCBhbGlnbjogJ3JpZ2h0JyB9LFxuICAgICAgeyBmaWVsZDogJ2F0dGFpbm1lbnRfcGN0JywgICB3aWR0aDogMTMwLCBhbGlnbjogJ3JpZ2h0JyB9LFxuICAgICAgeyBmaWVsZDogJ2NvdmVyYWdlX3JhdGlvJywgICB3aWR0aDogMTMwLCBhbGlnbjogJ3JpZ2h0JyB9LFxuICAgICAgeyBmaWVsZDogJ3NvdXJjZScsICAgICAgICAgICB3aWR0aDogMTMwIH0sXG4gICAgXSxcbiAgICBzb3J0OiBbXG4gICAgICB7IGZpZWxkOiAncGVyaW9kX3N0YXJ0JywgIG9yZGVyOiAnZGVzYycgfSxcbiAgICAgIHsgZmllbGQ6ICdvd25lcl9pZCcsICAgICAgICAgb3JkZXI6ICdhc2MnIH0sXG4gICAgXSxcbiAgICBncm91cGluZzogeyBmaWVsZHM6IFt7IGZpZWxkOiAncGVyaW9kX2xhYmVsJywgb3JkZXI6ICdkZXNjJyB9XSB9LFxuICAgIHBhZ2luYXRpb246IHsgcGFnZVNpemU6IDUwIH0sXG4gICAgYXBwZWFyYW5jZTogeyBhbGxvd2VkVmlzdWFsaXphdGlvbnM6IFsnZ3JpZCddIH0sXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgdGhpc19xdWFydGVyX2ZvcmVjYXN0czoge1xuICAgICAgbmFtZTogJ3RoaXNfcXVhcnRlcl9mb3JlY2FzdHMnLFxuICAgICAgdHlwZTogJ2dyaWQnLFxuICAgICAgLy8gVGhlIGxhYmVsIHByb21pc2VzIHRoZSBDVVJSRU5UIHF1YXJ0ZXIsIGFuZCB0aGUgZmlsdGVyIGRlbGl2ZXJzIGl0LlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSByZXN0cmljdGlvbiB3YXMgZHJvcHBlZCBpbiAjNTE1IG9uIHRoZSBtZWFzdXJlbWVudCB0aGF0IFwidGhlIGxpc3RcbiAgICAgIC8vIGRhdGEgcGF0aCByZXNvbHZlcyBubyBkYXRlIG1hY3JvXCIuIFRoYXQgbWVhc3VyZW1lbnQgd2FzIHRha2VuIG9uXG4gICAgICAvLyBAb2JqZWN0c3RhY2sgMTYuMS4wIGFuZCBoYXMgc2luY2UgZXhwaXJlZDogYHJlc29sdmVGaWx0ZXJUb2tlbnMoKWAgd2FzXG4gICAgICAvLyB3aXJlZCBpbnRvIHRoZSBPYmplY3RRTCBSRUFEIHBhdGggaW4gMTcuMC4wLXJjLjAgKG9iamVjdHFsXG4gICAgICAvLyBgZmVhdChmaWx0ZXJzKTogZXZhbHVhdGUge2ZpbHRlci10b2tlbn0gcGxhY2Vob2xkZXJzIHNlcnZlci1zaWRlYCxcbiAgICAgIC8vICMzNTgyKSBcdTIwMTQgYGZpbmRgL2BmaW5kT25lYC9gY291bnRgL2BhZ2dyZWdhdGVgLCBhaGVhZCBvZiB0aGUgbWlkZGxld2FyZVxuICAgICAgLy8gY2hhaW4sIHdoaWNoIGlzIHRoZSBvbmUgZ2F0ZSBldmVyeSBzZXJ2ZXItc2lkZSByZWFkIHBhc3NlcyB0aHJvdWdoLFxuICAgICAgLy8gc2F2ZWQtdmlldyBmaWx0ZXJzIGluY2x1ZGVkLiBNZWFzdXJlZCByYXRoZXIgdGhhbiBpbmZlcnJlZDtcbiAgICAgIC8vIGB0ZXN0L2ZvcmVjYXN0LWN1cnJlbnQtcXVhcnRlci12aWV3LnRlc3QudHNgIHJ1bnMgVEhJUyBmaWx0ZXIgdGhyb3VnaCBhXG4gICAgICAvLyByZWFsIGVuZ2luZSBhbmQgcGlucyB0aGUgdGhyZWUtd2F5IG91dGNvbWUgKG9uZSBxdWFydGVyIHNlbGVjdGVkLCBub3RcbiAgICAgIC8vIHplcm8gYW5kIG5vdCBhbGwgb2YgdGhlbSkuIEZpcnN0IHRha2VuIG9uIDE3LjAuMC1yYy4yLCBSRS1SVU5cbiAgICAgIC8vIDIwMjYtMDktMDMgb24gMTcuMi4wICgjMTQ2NyksIFJFLVJVTiBvbiAxNy4zLjAgKCMxNjc2LCBhZnRlciB0aGUgUFJcbiAgICAgIC8vICMxNTc3IGJ1bXApIGFuZCBSRS1SVU4gYWdhaW4gb24gMTcuNC4wICgjMTg4MywgYWZ0ZXIgdGhlIFBSICMxODE0XG4gICAgICAvLyBidW1wKSwgZ3JlZW4gYWxsIGZvdXIgdGltZXMuIE5vdCB5ZXQgcmUtcnVuIG9uIDE3LjUuMDsgdGhlIHRlc3QgaXNcbiAgICAgIC8vIHdoYXQgcmUtdGFrZXMgdGhlIHJlYWRpbmcgb24gZWFjaCBuZXcgcGluLlxuICAgICAgLy9cbiAgICAgIC8vIEJvdGggaGFsdmVzIG9mIHRoZSBrZXkgYXJlIGxvYWQtYmVhcmluZywgc2FtZSBhcyB0aGUgcXVvdGEtYXR0YWlubWVudFxuICAgICAgLy8gd2lkZ2V0IGluIGBzcmMvc2FsZXMvZGFzaGJvYXJkcy9zYWxlcy5kYXNoYm9hcmQudHNgOiBgcGVyaW9kOiAncXVhcnRlcidgXG4gICAgICAvLyBhbG9uZSByZXR1cm5zIGV2ZXJ5IHF1YXJ0ZXIgZXZlciBzbmFwc2hvdHRlZCAodGhlICM3MzAgZGVmZWN0KSwgYW5kXG4gICAgICAvLyBgcGVyaW9kX3N0YXJ0YCBhbG9uZSBtZXJnZXMgdGhlIHF1YXJ0ZXIgcm93IHdpdGggdGhlIE1PTlRIIHJvdyB0aGF0XG4gICAgICAvLyBvcGVucyB0aGUgc2FtZSBxdWFydGVyIFx1MjAxNCBRMyBhbmQgSnVseSBib3RoIHN0YXJ0IG9uIHRoZSAxc3QuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIG9sZCBge3RoaXNfcXVhcnRlcl9zdGFydH1gIHNwZWxsaW5nIGlzIG5vdCBtZXJlbHkgdW5yZXNvbHZlZCBub3csXG4gICAgICAvLyBpdCBpcyByZWplY3RlZDogdGhlIHJlc29sdmVyIHRocm93cyBgVW5yZXNvbHZhYmxlIGZpbHRlciBwbGFjZWhvbGRlcmBcbiAgICAgIC8vIGFuZCBuYW1lcyBge2N1cnJlbnRfcXVhcnRlcl9zdGFydH1gIGFzIHRoZSBmaXgsIHNvIHRoZSBzaWxlbnQtZW1wdHlcbiAgICAgIC8vIGZhaWx1cmUgbW9kZSB0aGF0IHJlbW92YWwgd2FzIHJlYWN0aW5nIHRvIGlzIG5vIGxvbmdlciByZWFjaGFibGUuXG4gICAgICBsYWJlbDogJ1RoaXMgUXVhcnRlcicsXG4gICAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2ZvcmVjYXN0JyB9LFxuICAgICAgY29sdW1uczogWydvd25lcl9pZCcsICdxdW90YScsICdjbG9zZWRfYW1vdW50JywgJ2NvbW1pdF9hbW91bnQnLCAnYmVzdF9jYXNlX2Ftb3VudCcsICdwaXBlbGluZV9hbW91bnQnLCAnYXR0YWlubWVudF9wY3QnLCAnY292ZXJhZ2VfcmF0aW8nXSxcbiAgICAgIGZpbHRlcjogW1xuICAgICAgICB7IGZpZWxkOiAncGVyaW9kJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ3F1YXJ0ZXInIH0sXG4gICAgICAgIHsgZmllbGQ6ICdwZXJpb2Rfc3RhcnQnLCBvcGVyYXRvcjogJ2VxdWFscycsIHZhbHVlOiAne2N1cnJlbnRfcXVhcnRlcl9zdGFydH0nIH0sXG4gICAgICBdLFxuICAgICAgLy8gT25lIHNvcnQga2V5LCBiZWNhdXNlIHRoZSBmaWx0ZXIgcGlucyBgcGVyaW9kX3N0YXJ0YCB0byBhIHNpbmdsZSB2YWx1ZVxuICAgICAgLy8gXHUyMDE0IHRoZSBgcGVyaW9kX3N0YXJ0IGRlc2NgIGtleSB0aGF0IHJhbmtlZCBxdWFydGVycyBhZ2FpbnN0IGVhY2ggb3RoZXJcbiAgICAgIC8vIGV4aXN0ZWQgb25seSB0byBmbG9hdCB0aGUgY3VycmVudCBxdWFydGVyIHRvIHRoZSB0b3Agb2YgYW4gdW5zY29wZWRcbiAgICAgIC8vIGxpc3QsIGFuZCBpcyBwcm92YWJseSBpbmVydCBub3cgdGhhdCB0aGUgbGlzdCBob2xkcyBvbmUgcXVhcnRlci5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgdGllYnJlYWtlciBpcyBOT1QgYGF0dGFpbm1lbnRfcGN0IGRlc2NgLCB3aGljaCBpcyBhIEZPUk1VTEEgXHUyMDE0IHRoZVxuICAgICAgLy8gZW5naW5lIGNvbXB1dGVzIGl0IGluIEpTIGFmdGVyIHRoZSBxdWVyeSwgc28gdGhlIGRhdGEgZW5naW5lIG5ldmVyIHNhd1xuICAgICAgLy8gdGhhdCBzb3J0IGtleSBhbmQgdGhlIG9yZGVyaW5nIHdpdGhpbiBhIHF1YXJ0ZXIgd2FzIGFyYml0cmFyeSAoc2FtZVxuICAgICAgLy8gY2xhc3Mgb2YgZGVmZWN0IGFzICM0ODkncyBgZGF5c19pbl9zdGFnZWAgZmlsdGVyKS4gYGNsb3NlZF9hbW91bnRgIGlzXG4gICAgICAvLyB0aGUgc3RvcmVkIG51bWVyYXRvciBiZWhpbmQgYXR0YWlubWVudCBhbmQgcmFua3MgdGhlIHNhbWUgZGlyZWN0aW9uLlxuICAgICAgc29ydDogW1xuICAgICAgICB7IGZpZWxkOiAnY2xvc2VkX2Ftb3VudCcsIG9yZGVyOiAnZGVzYycgfSxcbiAgICAgIF0sXG4gICAgICAvLyBFbXB0eSBpcyB0aGUgaG9uZXN0IHN0YXRlLCBhbmQgaXQgbmVlZHMgdG8gc2F5IHNvLiBUaGUgc2VlZHMgc2hpcCBub1xuICAgICAgLy8gY3VycmVudC1xdWFydGVyIHJvdyBvbiBwdXJwb3NlICgjNzAyIFx1MjAxNCB0aGUgc3dlZXAgb3ducyB0aGF0IHdpbmRvdywgYW5kXG4gICAgICAvLyB0d28gcHJvZHVjZXJzIGluIG9uZSB3aW5kb3cgaXMgd2hhdCBsZWZ0IGEgcGhhbnRvbSBvd25lcmxlc3NcbiAgICAgIC8vIGR1cGxpY2F0ZSksIHNvIG9uIGEgZnJlc2ggaW5zdGFsbCB0aGlzIHZpZXcgaXMgZW1wdHkgdW50aWwgdGhlIDAzOjAwXG4gICAgICAvLyBgZm9yZWNhc3Rfc25hcHNob3RgIHN3ZWVwIGhhcyBydW4gb25jZS4gVGhhdCBpcyB0aGUgc2FtZSB0cmFkZSB0aGVcbiAgICAgIC8vIHF1b3RhLWF0dGFpbm1lbnQgd2lkZ2V0IGFscmVhZHkgdGFrZXM7IHdpdGhvdXQgdGhpcyBjb3B5IHRoZSB1c2VyXG4gICAgICAvLyBjYW5ub3QgdGVsbCBpdCBhcGFydCBmcm9tIGEgYnJva2VuIHZpZXcuXG4gICAgICBlbXB0eVN0YXRlOiB7XG4gICAgICAgIHRpdGxlOiAnVGhpcyBRdWFydGVyIEhhcyBObyBTbmFwc2hvdHMgWWV0JyxcbiAgICAgICAgbWVzc2FnZTogJ1F1YXJ0ZXJseSBzbmFwc2hvdHMgYXJlIHdyaXR0ZW4gYnkgdGhlIG5pZ2h0bHkgZm9yZWNhc3Qgc3dlZXAuIFVudGlsIGl0IGhhcyBydW4gb25jZSBmb3IgdGhlIGN1cnJlbnQgcXVhcnRlciB0aGlzIHZpZXcgaXMgZW1wdHkgXHUyMDE0IHNldHRsZWQgcXVhcnRlcnMgYXJlIG9uIHRoZSBBbGwgdGFiLicsXG4gICAgICAgIGljb246ICdjYWxlbmRhcicsXG4gICAgICB9LFxuICAgIH0sXG4gICAgbXlfZm9yZWNhc3Q6IHtcbiAgICAgIG5hbWU6ICdteV9mb3JlY2FzdCcsXG4gICAgICB0eXBlOiAnZ3JpZCcsXG4gICAgICBsYWJlbDogJ015IEZvcmVjYXN0JyxcbiAgICAgIHVzZXJBY3Rpb25zOiB7IGVkaXRJbmxpbmU6IHRydWUgfSxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fZm9yZWNhc3QnIH0sXG4gICAgICBjb2x1bW5zOiBbJ3BlcmlvZF9sYWJlbCcsICdzbmFwc2hvdF9kYXRlJywgJ3F1b3RhJywgJ2Nsb3NlZF9hbW91bnQnLCAnY29tbWl0X2Ftb3VudCcsICdwaXBlbGluZV9hbW91bnQnLCAnYXR0YWlubWVudF9wY3QnXSxcbiAgICAgIC8vIGB7Y3VycmVudF91c2VyX2lkfWAgaXMgdGhlIG9ubHkgdXNlciB0b2tlbiB0aGUgdmlldyBydW50aW1lIHJlc29sdmVzXG4gICAgICAvLyAoYHtjdXJyZW50X3VzZXJ9YCBzaWxlbnRseSBuZXZlciBtYXRjaGVzKS5cbiAgICAgIGZpbHRlcjogW3sgZmllbGQ6ICdvd25lcl9pZCcsIG9wZXJhdG9yOiAnZXF1YWxzJywgdmFsdWU6ICd7Y3VycmVudF91c2VyX2lkfScgfV0sXG4gICAgICBzb3J0OiBbeyBmaWVsZDogJ3BlcmlvZF9zdGFydCcsIG9yZGVyOiAnZGVzYycgfV0sXG4gICAgfSxcbiAgfSxcblxuICBmb3JtOiB7XG4gICAgdHlwZTogJ3NpbXBsZScsXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NuYXBzaG90JyxcbiAgICAgICAgbGFiZWw6ICdTbmFwc2hvdCcsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydvd25lcl9pZCcsICdwZXJpb2QnLCAncGVyaW9kX3N0YXJ0JywgJ3BlcmlvZF9lbmQnLCAncGVyaW9kX2xhYmVsJywgJ3NuYXBzaG90X2RhdGUnLCAnc291cmNlJ10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnYW1vdW50cycsXG4gICAgICAgIGxhYmVsOiAnQW1vdW50cycsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydxdW90YScsICdjbG9zZWRfYW1vdW50JywgJ2NvbW1pdF9hbW91bnQnLCAnYmVzdF9jYXNlX2Ftb3VudCcsICdwaXBlbGluZV9hbW91bnQnLCAnZXhwZWN0ZWRfYW1vdW50JywgJ2F0dGFpbm1lbnRfcGN0JywgJ2NvdmVyYWdlX3JhdGlvJ10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnbm90ZXMnLFxuICAgICAgICBsYWJlbDogJ05vdGVzJyxcbiAgICAgICAgY29sdW1uczogMSxcbiAgICAgICAgZmllbGRzOiBbJ25vdGVzJ10sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvdmlld3MvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS92aWV3c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL3ZpZXdzL2luZGV4LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFJldmVudWUgdmlld3MgYmFycmVsLlxuICpcbiAqIFRoZSBkb2N0cmluZSBmb3IgdGhpcyBtZXRhZGF0YSB0eXBlIGlzIHdyaXR0ZW4gb25jZSwgaW5cbiAqIGBzcmMvc2FsZXMvdmlld3MvaW5kZXgudHNgOyB0aGlzIGZpbGUgaXMgdGhlIHJldmVudWUgcGFja2FnZSdzIGhhbGYgb2ZcbiAqIHRoZSBzYW1lIGZpbGUtYnktZmlsZSByZWdpc3RyYXRpb24uXG4gKi9cblxuZXhwb3J0IHsgQ29udHJhY3RWaWV3cyB9IGZyb20gJy4vY29udHJhY3Qudmlldyc7XG5leHBvcnQgeyBQcm9kdWN0Vmlld3MgfSBmcm9tICcuL3Byb2R1Y3Qudmlldyc7XG5leHBvcnQgeyBRdW90ZVZpZXdzIH0gZnJvbSAnLi9xdW90ZS52aWV3JztcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvdmlld3MvY29udHJhY3Qudmlldy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL3ZpZXdzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvdmlld3MvY29udHJhY3Qudmlldy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBDb250cmFjdCBWaWV3c1xuICpcbiAqICAgXHUyMDIyIGdyaWQgICAgIFx1MjAxNCBjb250cmFjdCByZWdpc3RlciB3aXRoIHJlbmV3YWwgaW5mb1xuICogICBcdTIwMjIgY2FsZW5kYXIgXHUyMDE0IHN0YXJ0L2VuZCBkYXRlc1xuICogICBcdTIwMjIgZ2FudHQgICAgXHUyMDE0IGNvbnRyYWN0IHRlcm1zIHRpbWVsaW5lXG4gKiAgIFx1MjAyMiB0aW1lbGluZSBcdTIwMTQgY2hyb25vbG9naWNhbCBjb250cmFjdCBzdHJlYW1cbiAqL1xuZXhwb3J0IGNvbnN0IENvbnRyYWN0Vmlld3MgPSBkZWZpbmVWaWV3KHtcbiAgbGlzdDoge1xuICAgIHR5cGU6ICdncmlkJyxcbiAgICBuYW1lOiAnYWxsX2NvbnRyYWN0cycsXG4gICAgbGFiZWw6ICdBbGwgQ29udHJhY3RzJyxcbiAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9jb250cmFjdCcgfSxcbiAgICBjb2x1bW5zOiBbXG4gICAgICB7IGZpZWxkOiAnY29udHJhY3RfbnVtYmVyJywgd2lkdGg6IDE1MCwgbGluazogdHJ1ZSwgcGlubmVkOiAnbGVmdCcgfSxcbiAgICAgIHsgZmllbGQ6ICdjcm1fYWNjb3VudCcsIHdpZHRoOiAyMDAgfSxcbiAgICAgIHsgZmllbGQ6ICdjcm1fb3Bwb3J0dW5pdHknLCB3aWR0aDogMjAwIH0sXG4gICAgICB7IGZpZWxkOiAnc3RhdHVzJywgd2lkdGg6IDEzMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdjb250cmFjdF92YWx1ZScsIHdpZHRoOiAxNDAsIGFsaWduOiAncmlnaHQnLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgeyBmaWVsZDogJ2NvbnRyYWN0X3Rlcm1fbW9udGhzJywgd2lkdGg6IDEzMCwgYWxpZ246ICdyaWdodCcgfSxcbiAgICAgIHsgZmllbGQ6ICdzdGFydF9kYXRlJywgd2lkdGg6IDEzMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdlbmRfZGF0ZScsIHdpZHRoOiAxMzAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAnYXV0b19yZW5ld2FsJywgd2lkdGg6IDExMCwgYWxpZ246ICdjZW50ZXInIH0sXG4gICAgICB7IGZpZWxkOiAnb3duZXJfaWQnLCB3aWR0aDogMTUwIH0sXG4gICAgXSxcbiAgICBzb3J0OiBbeyBmaWVsZDogJ2VuZF9kYXRlJywgb3JkZXI6ICdhc2MnIH1dLFxuICAgIHBhZ2luYXRpb246IHsgcGFnZVNpemU6IDI1IH0sXG4gICAgc2VsZWN0aW9uOiB7IHR5cGU6ICdtdWx0aXBsZScgfSxcbiAgICBhcHBlYXJhbmNlOiB7XG4gICAgICBhbGxvd2VkVmlzdWFsaXphdGlvbnM6IFsnZ3JpZCcsICdjYWxlbmRhcicsICdnYW50dCcsICd0aW1lbGluZSddLFxuICAgIH0sXG4gICAgLy8gQmluZHMgdGhlICdjYWxlbmRhcicgZW50cnkgYWJvdmU6IHJlbmV3YWwgZGF0ZXMsIHNhbWUgYXMgdGhlIGRlZGljYXRlZFxuICAgIC8vIGByZW5ld2FsX2NhbGVuZGFyYCB2aWV3IGFuZCB0aGUgZmllbGQgdGhpcyBsaXN0IHNvcnRzIGJ5LiBBIGNvbnRyYWN0XG4gICAgLy8gY2FsZW5kYXIgYW5zd2VycyBcIndoYXQgcmVuZXdzIHdoZW5cIiBcdTIwMTQgdGhlIHN0YXJ0IC0+IGVuZCB0ZXJtIFNQQU4gaXNcbiAgICAvLyBhbHJlYWR5IGNhcnJpZWQgYnkgYGNvbnRyYWN0X2dhbnR0YCBhbmQgYGNvbnRyYWN0X3RpbWVsaW5lYCwgd2hpY2ggaXNcbiAgICAvLyB3aHkgYGVuZF9kYXRlYCBpcyB0aGUgc3RhcnQgb2YgdGhlIGV2ZW50IGhlcmUgcmF0aGVyIHRoYW4gYW4gZW5kLlxuICAgIGNhbGVuZGFyOiB7XG4gICAgICBzdGFydERhdGVGaWVsZDogJ2VuZF9kYXRlJyxcbiAgICAgIHRpdGxlRmllbGQ6ICdjb250cmFjdF9udW1iZXInLFxuICAgICAgY29sb3JGaWVsZDogJ3N0YXR1cycsXG4gICAgfSxcbiAgfSxcblxuICBsaXN0Vmlld3M6IHtcbiAgICAvKiogUmVuZXdhbCBjYWxlbmRhciAoaGlnaGxpZ2h0cyB1cGNvbWluZyBlbmQgZGF0ZXMpICovXG4gICAgcmVuZXdhbF9jYWxlbmRhcjoge1xuICAgICAgbmFtZTogJ3JlbmV3YWxfY2FsZW5kYXInLFxuICAgICAgdHlwZTogJ2NhbGVuZGFyJyxcbiAgICAgIGxhYmVsOiAnUmVuZXdhbCBDYWxlbmRhcicsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2NvbnRyYWN0JyB9LFxuICAgICAgY29sdW1uczogWydjb250cmFjdF9udW1iZXInLCAnY3JtX2FjY291bnQnLCAnc3RhdHVzJ10sXG4gICAgICBjYWxlbmRhcjoge1xuICAgICAgICBzdGFydERhdGVGaWVsZDogJ2VuZF9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ2NvbnRyYWN0X251bWJlcicsXG4gICAgICAgIGNvbG9yRmllbGQ6ICdzdGF0dXMnLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLyoqIENvbnRyYWN0IHRlcm1zIGdhbnR0ICovXG4gICAgY29udHJhY3RfZ2FudHQ6IHtcbiAgICAgIG5hbWU6ICdjb250cmFjdF9nYW50dCcsXG4gICAgICB0eXBlOiAnZ2FudHQnLFxuICAgICAgbGFiZWw6ICdDb250cmFjdCBUZXJtcycsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2NvbnRyYWN0JyB9LFxuICAgICAgY29sdW1uczogWydjb250cmFjdF9udW1iZXInLCAnY3JtX2FjY291bnQnLCAnY29udHJhY3RfdmFsdWUnXSxcbiAgICAgIGdhbnR0OiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnc3RhcnRfZGF0ZScsXG4gICAgICAgIGVuZERhdGVGaWVsZDogJ2VuZF9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ2NvbnRyYWN0X251bWJlcicsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvKiogQ2hyb25vbG9naWNhbCB0aW1lbGluZSAqL1xuICAgIGNvbnRyYWN0X3RpbWVsaW5lOiB7XG4gICAgICBuYW1lOiAnY29udHJhY3RfdGltZWxpbmUnLFxuICAgICAgdHlwZTogJ3RpbWVsaW5lJyxcbiAgICAgIGxhYmVsOiAnQ29udHJhY3QgVGltZWxpbmUnLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9jb250cmFjdCcgfSxcbiAgICAgIGNvbHVtbnM6IFsnY29udHJhY3RfbnVtYmVyJywgJ2NybV9hY2NvdW50J10sXG4gICAgICB0aW1lbGluZToge1xuICAgICAgICBzdGFydERhdGVGaWVsZDogJ3N0YXJ0X2RhdGUnLFxuICAgICAgICBlbmREYXRlRmllbGQ6ICdlbmRfZGF0ZScsXG4gICAgICAgIHRpdGxlRmllbGQ6ICdjb250cmFjdF9udW1iZXInLFxuICAgICAgICBncm91cEJ5RmllbGQ6ICdjcm1fYWNjb3VudCcsXG4gICAgICAgIGNvbG9yRmllbGQ6ICdzdGF0dXMnLFxuICAgICAgICBzY2FsZTogJ3F1YXJ0ZXInLFxuICAgICAgfSxcbiAgICB9LFxuICB9LFxuXG4gIGZvcm06IHtcbiAgICB0eXBlOiAndGFiYmVkJyxcbiAgICBzZWN0aW9uczogW1xuICAgICAge1xuICAgICAgICBuYW1lOiAncGFydGllcycsXG4gICAgICAgIGxhYmVsOiAnUGFydGllcycsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydjb250cmFjdF9udW1iZXInLCAnY3JtX2FjY291bnQnLCAnY3JtX2NvbnRhY3QnLCAnY3JtX29wcG9ydHVuaXR5JywgJ293bmVyX2lkJywgJ3N0YXR1cyddLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gTmFtZWQgYGNvbnRyYWN0X3Rlcm1zYCwgbm90IGB0ZXJtc2AgXHUyMDE0IGB0ZXJtc2AgaXMgYWxyZWFkeSBhIGRpc3RpbmN0XG4gICAgICAgIC8vIGZpZWxkR3JvdXAga2V5IG9uIGBjcm1fY29udHJhY3RgIChcIlRlcm1zICYgRGF0ZXNcIiksIGFuZCByZXVzaW5nIGl0XG4gICAgICAgIC8vIGhlcmUgd291bGQgbWFrZSB0aGlzIHNlY3Rpb24ncyB0cmFuc2xhdGVkIGhlYWRpbmcgZm9sbG93IHRoYXRcbiAgICAgICAgLy8gZ3JvdXAncyB3b3JkaW5nIGluc3RlYWQgb2YgaXRzIG93biBcIlRlcm1zXCIuXG4gICAgICAgIG5hbWU6ICdjb250cmFjdF90ZXJtcycsXG4gICAgICAgIGxhYmVsOiAnVGVybXMnLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAnY29udHJhY3RfdGVybV9tb250aHMnLFxuICAgICAgICAgICdzdGFydF9kYXRlJyxcbiAgICAgICAgICAnZW5kX2RhdGUnLFxuICAgICAgICAgICdjb250cmFjdF92YWx1ZScsXG4gICAgICAgICAgJ2JpbGxpbmdfZnJlcXVlbmN5JyxcbiAgICAgICAgICAncGF5bWVudF90ZXJtcycsXG4gICAgICAgICAgJ2F1dG9fcmVuZXdhbCcsXG4gICAgICAgICAgJ3JlbmV3YWxfbm90aWNlX2RheXMnLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NpZ25pbmdfYW5kX2RvY3VtZW50cycsXG4gICAgICAgIGxhYmVsOiAnU2lnbmluZyAmIERvY3VtZW50cycsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydzaWduZWRfZGF0ZScsICdzaWduZWRfYnknLCAnZG9jdW1lbnRfdXJsJ10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBUaGUgY29udHJhY3QncyB0d28gbWFya2Rvd24gYm9kaWVzLCB0b2dldGhlciBhbmQgaW4gdGhlIG9yZGVyIGFcbiAgICAgICAgLy8gcmVhZGVyIG5lZWRzIHRoZW0gXHUyMDE0IHRoZSBxdWVzdGlvbiAjMTgyNiBhc2tlZCB0aGlzIGZvcm0gdG8gYW5zd2VyLlxuICAgICAgICAvLyBUaGV5IGFyZSBub3QgcmVkdW5kYW50LCBhbmQgYGNvbnRlbnQvZG9jcy9yZXZlbnVlL2NvbnRyYWN0cy5tZHhgXG4gICAgICAgIC8vIGFscmVhZHkgcnVsZXMgd2hpY2ggaXMgd2hpY2g6ICoqRGVzY3JpcHRpb24qKiBpcyB0aGUgcGxhaW4gc3VtbWFyeVxuICAgICAgICAvLyBvZiB3aGF0IHRoaXMgY29udHJhY3QgaXMgKGRlY2xhcmVkIG9uIHRoZSBgYmFzaWNgIGdyb3VwLCBsaXN0ZWRcbiAgICAgICAgLy8gdGhlcmUgdW5kZXIgXCJDb250cmFjdCBJbmZvcm1hdGlvblwiKSwgd2hpbGUgKipTcGVjaWFsIFRlcm1zKiogaXNcbiAgICAgICAgLy8gd2hlcmUgZXZlcnkgZnJlZS10ZXh0IFRFUk0gZ29lcyBcdTIwMTQgdGhlIGRvYyBzZW5kcyByZW5ld2FsXG4gICAgICAgIC8vIGluc3RydWN0aW9ucywgYW4gdW5saXN0ZWQgYmlsbGluZyBjYWRlbmNlIGFuZCBhbiB1bmxpc3RlZCBwYXltZW50XG4gICAgICAgIC8vIGFycmFuZ2VtZW50IHRvIFNwZWNpYWwgVGVybXMgYnkgbmFtZSwgdGhyZWUgc2VwYXJhdGUgdGltZXMuXG4gICAgICAgIC8vIERlc2NyaXB0aW9uIHdhcyB0aGUgb25lIGZpZWxkIGluIHRoYXQgaW52ZW50b3J5IG5vIGZvcm0gb2ZmZXJlZCwgc29cbiAgICAgICAgLy8gdGhlIHN1bW1hcnkgYSByZWFkZXIgd2FzIHRvbGQgdGhlIHJlY29yZCBjYXJyaWVzIGNvdWxkIG5vdCBiZVxuICAgICAgICAvLyB3cml0dGVuLiBPbmUgY29sdW1uLCBiZWNhdXNlIGJvdGggYXJlIGxvbmctZm9ybS5cbiAgICAgICAgbmFtZTogJ25vdGVzJyxcbiAgICAgICAgbGFiZWw6ICdOb3RlcycsXG4gICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgIGZpZWxkczogWydkZXNjcmlwdGlvbicsICdzcGVjaWFsX3Rlcm1zJywgJ2JpbGxpbmdfYWRkcmVzcyddLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL3ZpZXdzL3Byb2R1Y3Qudmlldy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL3ZpZXdzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvdmlld3MvcHJvZHVjdC52aWV3LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBkZWZpbmVWaWV3IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKipcbiAqIFByb2R1Y3QgVmlld3NcbiAqXG4gKiAgIFx1MjAyMiBncmlkICAgIFx1MjAxNCBjYXRhbG9nIGxpc3RpbmdcbiAqICAgXHUyMDIyIGdhbGxlcnkgXHUyMDE0IHZpc3VhbCBwcm9kdWN0IGNhdGFsb2cgKGBpbWFnZWAgYXMgY292ZXIpXG4gKlxuICogVGhlIGBsb3dfc3RvY2tgIHZpZXcgd2FzIHJlbW92ZWQgd2l0aCB0aGUgaW52ZW50b3J5IGZpZWxkcyBpdCB3YXMgYnVpbHQgb246XG4gKiBpdHMgY29sdW1ucywgaXRzIGZpbHRlciBhbmQgaXRzIHNvcnQga2V5IHdlcmUgYWxsIGBxdWFudGl0eV9vbl9oYW5kYCAvXG4gKiBgcmVvcmRlcl9wb2ludGAsIHNvIGl0IGNvdWxkIG5vdCBvdXRsaXZlIHRoZW0uIEl0IHdhcyBuZXZlciB0aGUgc3RvY2sgcmVwb3J0XG4gKiBpdCBsb29rZWQgbGlrZSBlaXRoZXIgXHUyMDE0IHRoZSBmaWx0ZXIgY29tcGFyZWQgYWdhaW5zdCBhIGhhcmRjb2RlZCAxMCByYXRoZXJcbiAqIHRoYW4gZWFjaCBwcm9kdWN0J3Mgb3duIHJlb3JkZXIgcG9pbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBQcm9kdWN0Vmlld3MgPSBkZWZpbmVWaWV3KHtcbiAgbGlzdDoge1xuICAgIHR5cGU6ICdncmlkJyxcbiAgICBuYW1lOiAnYWxsX3Byb2R1Y3RzJyxcbiAgICBsYWJlbDogJ0FsbCBQcm9kdWN0cycsXG4gICAgdXNlckFjdGlvbnM6IHsgZWRpdElubGluZTogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fcHJvZHVjdCcgfSxcbiAgICBjb2x1bW5zOiBbXG4gICAgICB7IGZpZWxkOiAncHJvZHVjdF9jb2RlJywgd2lkdGg6IDE0MCwgbGluazogdHJ1ZSwgcGlubmVkOiAnbGVmdCcgfSxcbiAgICAgIHsgZmllbGQ6ICduYW1lJywgd2lkdGg6IDI0MCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdjYXRlZ29yeScsIHdpZHRoOiAxNDAgfSxcbiAgICAgIHsgZmllbGQ6ICdmYW1pbHknLCB3aWR0aDogMTQwIH0sXG4gICAgICB7IGZpZWxkOiAnc2t1Jywgd2lkdGg6IDE0MCB9LFxuICAgICAgeyBmaWVsZDogJ2xpc3RfcHJpY2UnLCB3aWR0aDogMTMwLCBhbGlnbjogJ3JpZ2h0Jywgc3VtbWFyeTogJ2F2ZycgfSxcbiAgICAgIHsgZmllbGQ6ICdjb3N0Jywgd2lkdGg6IDEzMCwgYWxpZ246ICdyaWdodCcgfSxcbiAgICAgIHsgZmllbGQ6ICdpc19hY3RpdmUnLCB3aWR0aDogMTAwLCBhbGlnbjogJ2NlbnRlcicgfSxcbiAgICBdLFxuICAgIHNvcnQ6IFt7IGZpZWxkOiAnbmFtZScsIG9yZGVyOiAnYXNjJyB9XSxcbiAgICBncm91cGluZzogeyBmaWVsZHM6IFt7IGZpZWxkOiAnY2F0ZWdvcnknLCBvcmRlcjogJ2FzYycgfV0gfSxcbiAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiA1MCB9LFxuICAgIHNlbGVjdGlvbjogeyB0eXBlOiAnbXVsdGlwbGUnIH0sXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnLCAnZ2FsbGVyeSddLFxuICAgIH0sXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgLyoqIFZpc3VhbCBjYXRhbG9nICovXG4gICAgcHJvZHVjdF9jYXRhbG9nOiB7XG4gICAgICBuYW1lOiAncHJvZHVjdF9jYXRhbG9nJyxcbiAgICAgIHR5cGU6ICdnYWxsZXJ5JyxcbiAgICAgIGxhYmVsOiAnUHJvZHVjdCBDYXRhbG9nJyxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fcHJvZHVjdCcgfSxcbiAgICAgIGNvbHVtbnM6IFsnbmFtZScsICdjYXRlZ29yeScsICdsaXN0X3ByaWNlJ10sXG4gICAgICBnYWxsZXJ5OiB7XG4gICAgICAgIGNvdmVyRmllbGQ6ICdpbWFnZScsXG4gICAgICAgIGNvdmVyRml0OiAnY292ZXInLFxuICAgICAgICBjYXJkU2l6ZTogJ21lZGl1bScsXG4gICAgICAgIHRpdGxlRmllbGQ6ICduYW1lJyxcbiAgICAgICAgdmlzaWJsZUZpZWxkczogWydwcm9kdWN0X2NvZGUnLCAnY2F0ZWdvcnknLCAnZmFtaWx5JywgJ2xpc3RfcHJpY2UnLCAnc2t1J10sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG5cbiAgZm9ybToge1xuICAgIHR5cGU6ICdzaW1wbGUnLFxuICAgIHNlY3Rpb25zOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdwcm9kdWN0X2luZm8nLFxuICAgICAgICBsYWJlbDogJ1Byb2R1Y3QgSW5mbycsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgICdwcm9kdWN0X2NvZGUnLFxuICAgICAgICAgIHsgZmllbGQ6ICduYW1lJywgcmVxdWlyZWQ6IHRydWUsIHNwYW46ICdmdWxsJyB9LFxuICAgICAgICAgICdjYXRlZ29yeScsXG4gICAgICAgICAgJ2ZhbWlseScsXG4gICAgICAgICAgJ3NrdScsXG4gICAgICAgICAgJ3Byb2R1Y3RfbWFuYWdlcicsXG4gICAgICAgICAgJ2lzX2FjdGl2ZScsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAncHJpY2luZ19pbmZvJyxcbiAgICAgICAgbGFiZWw6ICdQcmljaW5nJyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbJ2xpc3RfcHJpY2UnLCAnY29zdCddLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ21lZGlhJyxcbiAgICAgICAgbGFiZWw6ICdNZWRpYScsXG4gICAgICAgIGNvbHVtbnM6IDEsXG4gICAgICAgIGZpZWxkczogWydpbWFnZScsICdkYXRhc2hlZXQnLCAnZGVzY3JpcHRpb24nXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS92aWV3cy9xdW90ZS52aWV3LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvdmlld3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS92aWV3cy9xdW90ZS52aWV3LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBkZWZpbmVWaWV3IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKipcbiAqIFF1b3RlIFZpZXdzXG4gKlxuICogICBcdTIwMjIgZ3JpZCAgICAgXHUyMDE0IHF1b3RlIHJlZ2lzdGVyIHdpdGggdG90YWxzXG4gKiAgIFx1MjAyMiBrYW5iYW4gICBcdTIwMTQgcXVvdGUgd29ya2Zsb3cgZ3JvdXBlZCBieSBzdGF0dXNcbiAqICAgXHUyMDIyIGNhbGVuZGFyIFx1MjAxNCBxdW90ZS1kYXRlIGNhbGVuZGFyXG4gKi9cbmV4cG9ydCBjb25zdCBRdW90ZVZpZXdzID0gZGVmaW5lVmlldyh7XG4gIGxpc3Q6IHtcbiAgICB0eXBlOiAnZ3JpZCcsXG4gICAgbmFtZTogJ2FsbF9xdW90ZXMnLFxuICAgIGxhYmVsOiAnQWxsIFF1b3RlcycsXG4gICAgdXNlckFjdGlvbnM6IHsgZWRpdElubGluZTogdHJ1ZSB9LFxuICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fcXVvdGUnIH0sXG4gICAgY29sdW1uczogW1xuICAgICAgeyBmaWVsZDogJ3F1b3RlX251bWJlcicsIHdpZHRoOiAxNDAsIGxpbms6IHRydWUsIHBpbm5lZDogJ2xlZnQnIH0sXG4gICAgICB7IGZpZWxkOiAnY3JtX2FjY291bnQnLCB3aWR0aDogMjAwIH0sXG4gICAgICB7IGZpZWxkOiAnY3JtX29wcG9ydHVuaXR5Jywgd2lkdGg6IDIwMCB9LFxuICAgICAgeyBmaWVsZDogJ3N0YXR1cycsIHdpZHRoOiAxMzAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAncXVvdGVfZGF0ZScsIHdpZHRoOiAxMzAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAnZXhwaXJhdGlvbl9kYXRlJywgd2lkdGg6IDE0MCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdzdWJ0b3RhbCcsIHdpZHRoOiAxMzAsIGFsaWduOiAncmlnaHQnLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgeyBmaWVsZDogJ2Rpc2NvdW50Jywgd2lkdGg6IDExMCwgYWxpZ246ICdyaWdodCcgfSxcbiAgICAgIHsgZmllbGQ6ICd0YXgnLCB3aWR0aDogMTEwLCBhbGlnbjogJ3JpZ2h0Jywgc3VtbWFyeTogJ3N1bScgfSxcbiAgICAgIHsgZmllbGQ6ICd0b3RhbF9wcmljZScsIHdpZHRoOiAxNDAsIGFsaWduOiAncmlnaHQnLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgeyBmaWVsZDogJ293bmVyX2lkJywgd2lkdGg6IDE1MCB9LFxuICAgIF0sXG4gICAgc29ydDogW3sgZmllbGQ6ICdxdW90ZV9kYXRlJywgb3JkZXI6ICdkZXNjJyB9XSxcbiAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiAyNSB9LFxuICAgIHNlbGVjdGlvbjogeyB0eXBlOiAnbXVsdGlwbGUnIH0sXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnLCAna2FuYmFuJywgJ2NhbGVuZGFyJ10sXG4gICAgfSxcbiAgICAvLyBCaW5kcyB0aGUgJ2NhbGVuZGFyJyBlbnRyeSBhYm92ZTogdGhlIHNhbWUgc3BhbiB0aGUgZGVkaWNhdGVkXG4gICAgLy8gYHF1b3RlX2NhbGVuZGFyYCB2aWV3IHNob3dzLiBgcXVvdGVfZGF0ZWAgYW5kIGBleHBpcmF0aW9uX2RhdGVgIGFyZSBib3RoXG4gICAgLy8gcmVxdWlyZWQgKyBub3ROdWxsIG9uIGNybV9xdW90ZSwgc28gZXZlcnkgcXVvdGUgbGFuZHMgb24gYSByZWFsIHdpbmRvdy5cbiAgICBjYWxlbmRhcjoge1xuICAgICAgc3RhcnREYXRlRmllbGQ6ICdxdW90ZV9kYXRlJyxcbiAgICAgIGVuZERhdGVGaWVsZDogJ2V4cGlyYXRpb25fZGF0ZScsXG4gICAgICB0aXRsZUZpZWxkOiAncXVvdGVfbnVtYmVyJyxcbiAgICAgIGNvbG9yRmllbGQ6ICdzdGF0dXMnLFxuICAgIH0sXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgLyoqIFF1b3RlIHdvcmtmbG93IGJvYXJkICovXG4gICAgcXVvdGVfcGlwZWxpbmU6IHtcbiAgICAgIG5hbWU6ICdxdW90ZV9waXBlbGluZScsXG4gICAgICB0eXBlOiAna2FuYmFuJyxcbiAgICAgIGxhYmVsOiAnUXVvdGUgUGlwZWxpbmUnLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9xdW90ZScgfSxcbiAgICAgIGNvbHVtbnM6IFsncXVvdGVfbnVtYmVyJywgJ2NybV9hY2NvdW50JywgJ3RvdGFsX3ByaWNlJywgJ2V4cGlyYXRpb25fZGF0ZSddLFxuICAgICAga2FuYmFuOiB7XG4gICAgICAgIGdyb3VwQnlGaWVsZDogJ3N0YXR1cycsXG4gICAgICAgIHN1bW1hcml6ZUZpZWxkOiAndG90YWxfcHJpY2UnLFxuICAgICAgICBjb2x1bW5zOiBbJ3F1b3RlX251bWJlcicsICdjcm1fYWNjb3VudCcsICd0b3RhbF9wcmljZScsICdleHBpcmF0aW9uX2RhdGUnXSxcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIC8qKiBRdW90ZS1kYXRlIGNhbGVuZGFyICovXG4gICAgcXVvdGVfY2FsZW5kYXI6IHtcbiAgICAgIG5hbWU6ICdxdW90ZV9jYWxlbmRhcicsXG4gICAgICB0eXBlOiAnY2FsZW5kYXInLFxuICAgICAgbGFiZWw6ICdRdW90ZSBDYWxlbmRhcicsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX3F1b3RlJyB9LFxuICAgICAgY29sdW1uczogWydxdW90ZV9udW1iZXInLCAnY3JtX2FjY291bnQnLCAndG90YWxfcHJpY2UnXSxcbiAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAncXVvdGVfZGF0ZScsXG4gICAgICAgIGVuZERhdGVGaWVsZDogJ2V4cGlyYXRpb25fZGF0ZScsXG4gICAgICAgIHRpdGxlRmllbGQ6ICdxdW90ZV9udW1iZXInLFxuICAgICAgICBjb2xvckZpZWxkOiAnc3RhdHVzJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcblxuICBmb3JtOiB7XG4gICAgdHlwZTogJ3RhYmJlZCcsXG4gICAgc2VjdGlvbnM6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3F1b3RlJyxcbiAgICAgICAgbGFiZWw6ICdRdW90ZScsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIC8vIGBuYW1lYCBpcyByZXF1aXJlZCBvbiBjcm1fcXVvdGUgd2l0aCBubyBkZWZhdWx0IFx1MjAxNCBvbWl0dGluZyBpdCBtYWRlXG4gICAgICAgIC8vIHF1b3RlIGNyZWF0aW9uIHRocm91Z2ggdGhpcyBmb3JtIGltcG9zc2libGUuXG4gICAgICAgIGZpZWxkczogW3sgZmllbGQ6ICduYW1lJywgcmVxdWlyZWQ6IHRydWUsIHNwYW46ICdmdWxsJyB9LCAncXVvdGVfbnVtYmVyJywgJ2NybV9hY2NvdW50JywgJ2NybV9jb250YWN0JywgJ2NybV9vcHBvcnR1bml0eScsICdvd25lcl9pZCcsICdzdGF0dXMnLCAncXVvdGVfZGF0ZScsICdleHBpcmF0aW9uX2RhdGUnXSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd0b3RhbHMnLFxuICAgICAgICBsYWJlbDogJ1RvdGFscycsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydzdWJ0b3RhbCcsICdkaXNjb3VudCcsICdkaXNjb3VudF9hbW91bnQnLCAndGF4JywgJ3NoaXBwaW5nX2hhbmRsaW5nJywgJ3RvdGFsX3ByaWNlJ10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBOYW1lZCBgcXVvdGVfdGVybXNgLCBub3QgYHRlcm1zYCBcdTIwMTQgYHRlcm1zYCBpcyBhbHJlYWR5IGEgZGlzdGluY3RcbiAgICAgICAgLy8gZmllbGRHcm91cCBrZXkgb24gYGNybV9xdW90ZWAgKFwiVGVybXMgJiBWYWxpZGl0eVwiKSwgYW5kIHJldXNpbmcgaXRcbiAgICAgICAgLy8gaGVyZSB3b3VsZCBtYWtlIHRoaXMgc2VjdGlvbidzIHRyYW5zbGF0ZWQgaGVhZGluZyBmb2xsb3cgdGhhdFxuICAgICAgICAvLyBncm91cCdzIHdvcmRpbmcgaW5zdGVhZCBvZiBpdHMgb3duIFwiVGVybXNcIi5cbiAgICAgICAgbmFtZTogJ3F1b3RlX3Rlcm1zJyxcbiAgICAgICAgbGFiZWw6ICdUZXJtcycsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydwYXltZW50X3Rlcm1zJywgJ3NoaXBwaW5nX3Rlcm1zJ10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnYWRkcmVzc2VzX2FuZF9ub3RlcycsXG4gICAgICAgIGxhYmVsOiAnQWRkcmVzc2VzICYgTm90ZXMnLFxuICAgICAgICBjb2x1bW5zOiAxLFxuICAgICAgICBmaWVsZHM6IFsnYmlsbGluZ19hZGRyZXNzJywgJ3NoaXBwaW5nX2FkZHJlc3MnLCAnaW50ZXJuYWxfbm90ZXMnXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL3ZpZXdzL2luZGV4LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy92aWV3c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvdmlld3MvaW5kZXgudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogTWFya2V0aW5nIHZpZXdzIGJhcnJlbC5cbiAqXG4gKiBUaGUgZG9jdHJpbmUgZm9yIHRoaXMgbWV0YWRhdGEgdHlwZSBpcyB3cml0dGVuIG9uY2UsIGluXG4gKiBgc3JjL3NhbGVzL3ZpZXdzL2luZGV4LnRzYDsgdGhpcyBmaWxlIGlzIHRoZSBtYXJrZXRpbmcgcGFja2FnZSdzIGhhbGYgb2ZcbiAqIHRoZSBzYW1lIGZpbGUtYnktZmlsZSByZWdpc3RyYXRpb24uXG4gKi9cblxuZXhwb3J0IHsgQ2FtcGFpZ25WaWV3cyB9IGZyb20gJy4vY2FtcGFpZ24udmlldyc7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvdmlld3MvY2FtcGFpZ24udmlldy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvdmlld3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL3ZpZXdzL2NhbXBhaWduLnZpZXcudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGRlZmluZVZpZXcgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogQ2FtcGFpZ24gVmlld3NcbiAqXG4gKiAgIFx1MjAyMiBncmlkICAgICBcdTIwMTQgcGVyZm9ybWFuY2UgZ3JpZCB3aXRoIGFnZ3JlZ2F0ZWQgS1BJc1xuICogICBcdTIwMjIgZ2FudHQgICAgXHUyMDE0IGNhbXBhaWduIHNjaGVkdWxlIChzdGFydF9kYXRlIFx1MjE5MiBlbmRfZGF0ZSlcbiAqICAgXHUyMDIyIGNhbGVuZGFyIFx1MjAxNCBsYXVuY2ggY2FsZW5kYXJcbiAqICAgXHUyMDIyIHRpbWVsaW5lIFx1MjAxNCBtdWx0aS1jYW1wYWlnbiBjaHJvbm9sb2dpY2FsIHZpZXdcbiAqL1xuZXhwb3J0IGNvbnN0IENhbXBhaWduVmlld3MgPSBkZWZpbmVWaWV3KHtcbiAgbGlzdDoge1xuICAgIHR5cGU6ICdncmlkJyxcbiAgICBuYW1lOiAnYWxsX2NhbXBhaWducycsXG4gICAgbGFiZWw6ICdBbGwgQ2FtcGFpZ25zJyxcbiAgICB1c2VyQWN0aW9uczogeyBlZGl0SW5saW5lOiB0cnVlIH0sXG4gICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9jYW1wYWlnbicgfSxcbiAgICBjb2x1bW5zOiBbXG4gICAgICB7IGZpZWxkOiAnbmFtZScsIHdpZHRoOiAyNDAsIHNvcnRhYmxlOiB0cnVlLCBsaW5rOiB0cnVlLCBwaW5uZWQ6ICdsZWZ0JyB9LFxuICAgICAgeyBmaWVsZDogJ2NoYW5uZWwnLCB3aWR0aDogMTMwIH0sXG4gICAgICB7IGZpZWxkOiAnc3RhdHVzJywgd2lkdGg6IDEzMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdzdGFydF9kYXRlJywgd2lkdGg6IDEzMCwgc29ydGFibGU6IHRydWUgfSxcbiAgICAgIHsgZmllbGQ6ICdlbmRfZGF0ZScsIHdpZHRoOiAxMzAsIHNvcnRhYmxlOiB0cnVlIH0sXG4gICAgICB7IGZpZWxkOiAnYnVkZ2V0ZWRfY29zdCcsIHdpZHRoOiAxNDAsIGFsaWduOiAncmlnaHQnLCBzdW1tYXJ5OiAnc3VtJyB9LFxuICAgICAgeyBmaWVsZDogJ2V4cGVjdGVkX3JldmVudWUnLCB3aWR0aDogMTYwLCBhbGlnbjogJ3JpZ2h0Jywgc3VtbWFyeTogJ3N1bScgfSxcbiAgICBdLFxuICAgIHNvcnQ6IFt7IGZpZWxkOiAnc3RhcnRfZGF0ZScsIG9yZGVyOiAnYXNjJyB9XSxcbiAgICBwYWdpbmF0aW9uOiB7IHBhZ2VTaXplOiAyNSB9LFxuICAgIHNlbGVjdGlvbjogeyB0eXBlOiAnbXVsdGlwbGUnIH0sXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnLCAnZ2FudHQnLCAnY2FsZW5kYXInLCAndGltZWxpbmUnXSxcbiAgICB9LFxuICAgIC8vIEJpbmRzIHRoZSAnY2FsZW5kYXInIGVudHJ5IGFib3ZlOiB0aGUgc3dpdGNoZXIgb3BlbnMgdGhlIHNhbWUgc2NoZWR1bGVcbiAgICAvLyB0aGUgZGVkaWNhdGVkIGBjYW1wYWlnbl9jYWxlbmRhcmAgdmlldyBzaG93cy4gQm90aCBkYXRlcyBhcmUgcmVxdWlyZWQgK1xuICAgIC8vIG5vdE51bGwgb24gY3JtX2NhbXBhaWduLCBzbyBldmVyeSBjYW1wYWlnbiBzcGFucyBhIHRydXRoZnVsIHJhbmdlLlxuICAgIGNhbGVuZGFyOiB7XG4gICAgICBzdGFydERhdGVGaWVsZDogJ3N0YXJ0X2RhdGUnLFxuICAgICAgZW5kRGF0ZUZpZWxkOiAnZW5kX2RhdGUnLFxuICAgICAgdGl0bGVGaWVsZDogJ25hbWUnLFxuICAgICAgY29sb3JGaWVsZDogJ2NoYW5uZWwnLFxuICAgIH0sXG4gIH0sXG5cbiAgbGlzdFZpZXdzOiB7XG4gICAgLyoqIENhbXBhaWduIHNjaGVkdWxlICovXG4gICAgY2FtcGFpZ25fZ2FudHQ6IHtcbiAgICAgIG5hbWU6ICdjYW1wYWlnbl9nYW50dCcsXG4gICAgICB0eXBlOiAnZ2FudHQnLFxuICAgICAgbGFiZWw6ICdDYW1wYWlnbiBTY2hlZHVsZScsXG4gICAgICBkYXRhOiB7IHByb3ZpZGVyOiAnb2JqZWN0Jywgb2JqZWN0OiAnY3JtX2NhbXBhaWduJyB9LFxuICAgICAgY29sdW1uczogWyduYW1lJywgJ2NoYW5uZWwnXSxcbiAgICAgIGdhbnR0OiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnc3RhcnRfZGF0ZScsXG4gICAgICAgIGVuZERhdGVGaWVsZDogJ2VuZF9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ25hbWUnLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLyoqIExhdW5jaCBjYWxlbmRhciAqL1xuICAgIGNhbXBhaWduX2NhbGVuZGFyOiB7XG4gICAgICBuYW1lOiAnY2FtcGFpZ25fY2FsZW5kYXInLFxuICAgICAgdHlwZTogJ2NhbGVuZGFyJyxcbiAgICAgIGxhYmVsOiAnTGF1bmNoIENhbGVuZGFyJyxcbiAgICAgIGRhdGE6IHsgcHJvdmlkZXI6ICdvYmplY3QnLCBvYmplY3Q6ICdjcm1fY2FtcGFpZ24nIH0sXG4gICAgICBjb2x1bW5zOiBbJ25hbWUnLCAnY2hhbm5lbCcsICdzdGF0dXMnXSxcbiAgICAgIGNhbGVuZGFyOiB7XG4gICAgICAgIHN0YXJ0RGF0ZUZpZWxkOiAnc3RhcnRfZGF0ZScsXG4gICAgICAgIGVuZERhdGVGaWVsZDogJ2VuZF9kYXRlJyxcbiAgICAgICAgdGl0bGVGaWVsZDogJ25hbWUnLFxuICAgICAgICBjb2xvckZpZWxkOiAnY2hhbm5lbCcsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvKiogTWFya2V0aW5nIHRpbWVsaW5lICovXG4gICAgY2FtcGFpZ25fdGltZWxpbmU6IHtcbiAgICAgIG5hbWU6ICdjYW1wYWlnbl90aW1lbGluZScsXG4gICAgICB0eXBlOiAndGltZWxpbmUnLFxuICAgICAgbGFiZWw6ICdNYXJrZXRpbmcgVGltZWxpbmUnLFxuICAgICAgZGF0YTogeyBwcm92aWRlcjogJ29iamVjdCcsIG9iamVjdDogJ2NybV9jYW1wYWlnbicgfSxcbiAgICAgIC8vIFRoZSBsaXN0IGRhdGEgc291cmNlIHByb2plY3RzIGNvbmZpZ3VyZWQgY29sdW1ucy4gS2VlcCB0aGUgZGF0ZVxuICAgICAgLy8gZmllbGRzIGluIHRoYXQgcHJvamVjdGlvbiBzbyB0aGUgdGltZWxpbmUgcmVuZGVyZXIgY2FuIGJ1Y2tldCBhbmRcbiAgICAgIC8vIG9yZGVyIGNhbXBhaWducyBmcm9tIHRoZSBzYW1lIHNjaGVkdWxlIGRhdGEgYXMgdGhlIGNhbGVuZGFyL0dhbnR0LlxuICAgICAgY29sdW1uczogWyduYW1lJywgJ2NoYW5uZWwnLCAnc3RhcnRfZGF0ZScsICdlbmRfZGF0ZSddLFxuICAgICAgdGltZWxpbmU6IHtcbiAgICAgICAgc3RhcnREYXRlRmllbGQ6ICdzdGFydF9kYXRlJyxcbiAgICAgICAgZW5kRGF0ZUZpZWxkOiAnZW5kX2RhdGUnLFxuICAgICAgICB0aXRsZUZpZWxkOiAnbmFtZScsXG4gICAgICAgIGdyb3VwQnlGaWVsZDogJ2NoYW5uZWwnLFxuICAgICAgICBjb2xvckZpZWxkOiAnc3RhdHVzJyxcbiAgICAgICAgc2NhbGU6ICdtb250aCcsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG5cbiAgZm9ybToge1xuICAgIHR5cGU6ICd0YWJiZWQnLFxuICAgIHNlY3Rpb25zOiBbXG4gICAgICB7XG4gICAgICAgIC8vIEV2ZXJ5IGZvcm0gc2VjdGlvbiBoZXJlIGNhcnJpZXMgYSBgbmFtZWAgbWF0Y2hpbmcgdGhlIG9iamVjdCdzXG4gICAgICAgIC8vIGZpZWxkR3JvdXAga2V5LCBzbyB0aGUgaGVhZGluZyByZXNvbHZlcyB0aHJvdWdoXG4gICAgICAgIC8vIGBvYmplY3RzLmNybV9jYW1wYWlnbi5fc2VjdGlvbnMuPG5hbWU+LmxhYmVsYCBpbiBhbGwgZm91ciBwYWNrcy4gQVxuICAgICAgICAvLyBuYW1lbGVzcyBzZWN0aW9uIGhhcyBubyBrZXkgYSBidW5kbGUgY2FuIGNhcnJ5IGFuZCByZW5kZXJzIGl0c1xuICAgICAgICAvLyBFbmdsaXNoIGxhYmVsIGluIGV2ZXJ5IGxvY2FsZSBcdTIwMTQgdGhlIHBsYXRmb3JtIHdhcm5zIGFib3V0IGV4YWN0bHkgdGhpc1xuICAgICAgICAvLyBkdXJpbmcgYG9iamVjdHN0YWNrIHZhbGlkYXRlYCwgYW5kIHRoaXMgZm9ybSB3YXMgY2FycnlpbmcgZm91ciBvZlxuICAgICAgICAvLyB0aG9zZSB3YXJuaW5ncyBiZWZvcmUgdGhlICM1OTcgcmVzdHJ1Y3R1cmUgZ2F2ZSBpdCBhIHJlYXNvbiB0byBtb3ZlLlxuICAgICAgICBuYW1lOiAnYmFzaWMnLFxuICAgICAgICBsYWJlbDogJ0NhbXBhaWduIEluZm9ybWF0aW9uJyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ25hbWUnLCByZXF1aXJlZDogdHJ1ZSwgc3BhbjogJ2Z1bGwnIH0sXG4gICAgICAgICAgJ2NhbXBhaWduX2NvZGUnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAnY2hhbm5lbCcsXG4gICAgICAgICAgeyBmaWVsZDogJ3N0YXR1cycsIHJlcXVpcmVkOiB0cnVlIH0sXG4gICAgICAgICAgJ293bmVyX2lkJyxcbiAgICAgICAgICAnaXNfYWN0aXZlJyxcbiAgICAgICAgICAnbGFuZGluZ19wYWdlX3VybCcsXG4gICAgICAgICAgLy8gVGhlIG1hcmtkb3duIGJvZHkgb2YgdGhlIGNhbXBhaWduIGJyaWVmLiBEZWNsYXJlZCBvbiB0aGUgYGJhc2ljYFxuICAgICAgICAgIC8vIGdyb3VwIGFuZCBmaWxsZWQgYnkgc2V2ZW4gb2YgdGhlIHNlZWQgY2FtcGFpZ25zLCBidXQgb21pdHRlZCBmcm9tXG4gICAgICAgICAgLy8gdGhpcyBlbnVtZXJhdGlvbiBcdTIwMTQgc28gdGhlIG9ubHkgc3VyZmFjZSB0aGF0IGNvdWxkIHNob3cgaXQgZGlkIG5vdCxcbiAgICAgICAgICAvLyBhbmQgYSBtYXJrZXRlciBjb3VsZCBuZWl0aGVyIHJlYWQgbm9yIHdyaXRlIHRoZSBicmllZiB0aGV5IHdyb3RlLlxuICAgICAgICAgIHsgZmllbGQ6ICdkZXNjcmlwdGlvbicsIHNwYW46ICdmdWxsJyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NjaGVkdWxlJyxcbiAgICAgICAgbGFiZWw6ICdTY2hlZHVsZScsXG4gICAgICAgIGNvbHVtbnM6IDIsXG4gICAgICAgIGZpZWxkczogWydzdGFydF9kYXRlJywgJ2VuZF9kYXRlJ10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvKipcbiAgICAgICAgICogQnVkZ2V0ICYgUk9JIFx1MjAxNCBhIFNFQ1RJT04gT0YgSVRTIE9XTiwgZGVsaWJlcmF0ZWx5ICgjNTk3KS5cbiAgICAgICAgICpcbiAgICAgICAgICogYGJ1ZGdldGVkX2Nvc3RgIGFuZCBgYWN0dWFsX2Nvc3RgIGFyZSB0aGUgb25seSB0d28gY2FtcGFpZ24gbnVtYmVyc1xuICAgICAgICAgKiB0aGF0IGFyZSBtYW51YWwtZW50cnkgYnkgZGVzaWduOiBub3RoaW5nIG9uIHRoZSBwbGF0Zm9ybSBrbm93cyB3aGF0IGFcbiAgICAgICAgICogdHJhZGUtc2hvdyBib290aCBjb3N0LiBUaGV5IHVzZWQgdG8gc2l0IHNldmVudGggYW5kIGVpZ2h0aCBpbiBhXG4gICAgICAgICAqIHNldmVuLWZpZWxkIFwiU2NoZWR1bGUgJiBCdWRnZXRcIiByb3csIGJlbG93IHRoZSBkYXRlcyBhbmQgYmVzaWRlIHR3b1xuICAgICAgICAgKiByZXZlbnVlIGZpZ3VyZXMgb25lIG9mIHdoaWNoIHRoZSBtZXRyaWMgaG9va3Mgb3duIFx1MjAxNCBzbyB0aGUgdHdvIGZpZWxkc1xuICAgICAgICAgKiBhIG1hcmtldGVyIG11c3QgdHlwZSB3ZXJlIHRoZSBsZWFzdCB2aXNpYmxlIHRoaW5ncyBvbiB0aGUgZm9ybSwgYW5kXG4gICAgICAgICAqIGBhY3R1YWxfY29zdGAgaW4gcGFydGljdWxhciB3ZW50IHVudHlwZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoYXQgaXMgbm90IGEgY29zbWV0aWMgY29tcGxhaW50OiBgcm9pYCBkaXZpZGVzIGJ5IGBhY3R1YWxfY29zdGAsIGFuZFxuICAgICAgICAgKiBpdHMgZm9ybXVsYSBhbnN3ZXJzIGEgZmxhdCBgMC4wYCBmb3IgYW55IGNhbXBhaWduIHdoZXJlIHRoYXQgZmllbGQgaXNcbiAgICAgICAgICogYmxhbmsuIEFuIGVtcHR5IGNvc3QgZmllbGQgcmVuZGVycyBhcyAwJSBST0kgb24gZXZlcnkgY2FtcGFpZ24gXHUyMDE0IHRoZVxuICAgICAgICAgKiBvbmUgbnVtYmVyIHRoZSB3aG9sZSBQZXJmb3JtYW5jZSBzZWN0aW9uIGV4aXN0cyB0byBwcm9kdWNlLCByZWFkaW5nXG4gICAgICAgICAqIGFzIGEgcmVhbCBtZWFzdXJlbWVudCByYXRoZXIgdGhhbiBhcyBtaXNzaW5nIGlucHV0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBTbyB0aGUgY29zdHMgZ2V0IHRoZWlyIG93biBoZWFkaW5nLCBhbmQgYHJvaWAgaXMgZGlzcGxheWVkIEhFUkUgd2l0aFxuICAgICAgICAgKiB0aGVtIHJhdGhlciB0aGFuIGF0IHRoZSBib3R0b20gb2YgUGVyZm9ybWFuY2UsIHdoZXJlIGl0cyBkZXBlbmRlbmN5XG4gICAgICAgICAqIG9uIHR3byBmaWVsZHMgdGhyZWUgc2VjdGlvbnMgYXdheSB3YXMgaW52aXNpYmxlLiBUaGUgaGVhZGluZyBtYXRjaGVzXG4gICAgICAgICAqIHRoZSBvYmplY3QncyBgYnVkZ2V0YCBmaWVsZEdyb3VwLCBzbyB0aGUgZm9ybSBhbmQgdGhlIGRldGFpbCBwYWdlXG4gICAgICAgICAqIGFncmVlIG9uIHdoYXQgdGhpcyBncm91cCBpcyBjYWxsZWQuXG4gICAgICAgICAqL1xuICAgICAgICBuYW1lOiAnYnVkZ2V0JyxcbiAgICAgICAgbGFiZWw6ICdCdWRnZXQgJiBST0knLFxuICAgICAgICBjb2x1bW5zOiAyLFxuICAgICAgICBmaWVsZHM6IFsnYnVkZ2V0ZWRfY29zdCcsICdhY3R1YWxfY29zdCcsICdleHBlY3RlZF9yZXZlbnVlJywgJ2FjdHVhbF9yZXZlbnVlJywgJ3JvaSddLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ21ldHJpY3MnLFxuICAgICAgICBsYWJlbDogJ1BlcmZvcm1hbmNlJyxcbiAgICAgICAgY29sdW1uczogMixcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgJ3RhcmdldF9zaXplJyxcbiAgICAgICAgICAnbnVtX3NlbnQnLFxuICAgICAgICAgICdudW1fcmVzcG9uc2VzJyxcbiAgICAgICAgICAnbnVtX2xlYWRzJyxcbiAgICAgICAgICAnbnVtX2NvbnZlcnRlZF9sZWFkcycsXG4gICAgICAgICAgJ251bV9vcHBvcnR1bml0aWVzJyxcbiAgICAgICAgICAnbnVtX3dvbl9vcHBvcnR1bml0aWVzJyxcbiAgICAgICAgICAncmVzcG9uc2VfcmF0ZScsXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL2luZGV4LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL2luZGV4LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFNhbGVzICh0aGUgYXBwIHBhY2thZ2UpIHBhZ2VzIGJhcnJlbC5cbiAqXG4gKiBUaGUgZG9jdHJpbmUgZm9yIHRoaXMgbWV0YWRhdGEgdHlwZSBpcyB3cml0dGVuIG9uY2UsIGluXG4gKiBgc3JjL3NhbGVzL3BhZ2VzL2luZGV4LnRzYDsgdGhpcyBmaWxlIGlzIHRoZSBzYWxlcyBwYWNrYWdlJ3MgaGFsZiBvZlxuICogdGhlIHNhbWUgZmlsZS1ieS1maWxlIHJlZ2lzdHJhdGlvbi5cbiAqL1xuXG5leHBvcnQgeyBMZWFkRGV0YWlsUGFnZSB9IGZyb20gJy4vbGVhZF9kZXRhaWwucGFnZSc7XG5leHBvcnQgeyBPcHBvcnR1bml0eURldGFpbFBhZ2UgfSBmcm9tICcuL29wcG9ydHVuaXR5X2RldGFpbC5wYWdlJztcbmV4cG9ydCB7IEFjY291bnREZXRhaWxQYWdlIH0gZnJvbSAnLi9hY2NvdW50X2RldGFpbC5wYWdlJztcbmV4cG9ydCB7IEFjY291bnRXb3JrYmVuY2hQYWdlIH0gZnJvbSAnLi9hY2NvdW50X3dvcmtiZW5jaC5wYWdlJztcbmV4cG9ydCB7IFNhbGVzSG9tZVBhZ2UgfSBmcm9tICcuL2hvbWUucGFnZSc7XG5leHBvcnQgeyBBcHBMYXVuY2hlclBhZ2UgfSBmcm9tICcuL2FwcF9sYXVuY2hlci5wYWdlJztcbmV4cG9ydCB7IFV0aWxpdHlCYXJQYWdlIH0gZnJvbSAnLi91dGlsaXR5X2Jhci5wYWdlJztcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL2xlYWRfZGV0YWlsLnBhZ2UudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXMvbGVhZF9kZXRhaWwucGFnZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUGFnZSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcbmltcG9ydCB7IFAgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogTGVhZCBEZXRhaWwgUmVjb3JkIFBhZ2VcbiAqXG4gKiBEZW1vbnN0cmF0ZXMgYSBjb21wcmVoZW5zaXZlIHJlY29yZCBwYWdlIGxheW91dCBzaW1pbGFyIHRvIFNhbGVzZm9yY2UgTGlnaHRuaW5nIFJlY29yZCBQYWdlLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBUZW1wbGF0ZS1iYXNlZCBsYXlvdXQgd2l0aCBuYW1lZCByZWdpb25zXG4gKiAtIFJpY2ggY29tcG9uZW50IGNvbXBvc2l0aW9uIChkZXRhaWxzLCBoaWdobGlnaHRzLCByZWxhdGVkIGxpc3RzKVxuICogLSBDb21wb25lbnQgdmlzaWJpbGl0eSBydWxlc1xuICogLSBQcm9maWxlLWJhc2VkIHBhZ2UgYXNzaWdubWVudFxuICovXG5leHBvcnQgY29uc3QgTGVhZERldGFpbFBhZ2U6IFBhZ2UgPSB7XG4gIG5hbWU6ICdsZWFkX2RldGFpbF9wYWdlJyxcbiAgbGFiZWw6ICdMZWFkIERldGFpbCcsXG4gIGRlc2NyaXB0aW9uOiAnQ29tcHJlaGVuc2l2ZSBsZWFkIGRldGFpbCBwYWdlIHdpdGggaGlnaGxpZ2h0cywgZGV0YWlscywgYW5kIHJlbGF0ZWQgaW5mb3JtYXRpb24nLFxuXG4gIHR5cGU6ICdyZWNvcmQnLFxuICBvYmplY3Q6ICdjcm1fbGVhZCcsXG5cbiAgLy8gVGVtcGxhdGUgZGVmaW5lcyB0aGUgb3ZlcmFsbCBsYXlvdXQgc3RydWN0dXJlLiBXZSB1c2UgYGZ1bGwtd2lkdGhgXG4gIC8vIChzaW5nbGUgY29sdW1uKSBiZWNhdXNlIHRoZSBwcmV2aW91cyBgaGVhZGVyLXNpZGViYXItbWFpbmAgbGF5b3V0XG4gIC8vIHNhbmR3aWNoZWQgdGhlIGhpZ2hsaWdodHMgc3RyaXAgaW50byBhIGNyYW1wZWQgc2lkZWJhciB3aXRoIG5vIG90aGVyXG4gIC8vIG1lYW5pbmdmdWwgc2lkZWJhciBjb250ZW50IFx1MjAxNCBTYWxlc2ZvcmNlIExpZ2h0bmluZyByZWNvcmQgcGFnZXNcbiAgLy8gc2ltaWxhcmx5IGRlZmF1bHQgdG8gYSBzdGFja2VkIGNvbHVtbiBmb3IgbWVkaXVtLWRlbnNpdHkgb2JqZWN0cy5cbiAgdGVtcGxhdGU6ICdmdWxsLXdpZHRoJyxcbiAga2luZDogJ2Z1bGwnLFxuICAvLyBQYWdlLWxldmVsIHN0YXRlIHZhcmlhYmxlc1xuICB2YXJpYWJsZXM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnc2hvd0hpc3RvcnknLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdhY3RpdmVUYWInLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZWZhdWx0VmFsdWU6ICdkZXRhaWxzJyxcbiAgICB9LFxuICBdLFxuXG4gIC8vIFJlZ2lvbnMgY29ycmVzcG9uZCB0byBzbG90cyBpbiB0aGUgdGVtcGxhdGVcbiAgcmVnaW9uczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdoZWFkZXInLFxuICAgICAgd2lkdGg6ICdmdWxsJyxcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgLy8gVGl0bGUgKyBzdWJ0aXRsZSArIGljb24sIHdpdGggcmVjb3JkLWxldmVsIGFjdGlvbnMgcmVuZGVyZWRcbiAgICAgICAgLy8gaW5saW5lIGluIHRoZSBoZWFkZXIncyBhY3Rpb24gc2xvdCB2aWEgdGhlIGZpcnN0LWNsYXNzXG4gICAgICAgIC8vIGBhY3Rpb25zYCBwcm9wZXJ0eSAobm8gc2libGluZyBub2RlLCBubyB2aXN1YWwgb2Zmc2V0IGhhY2spLlxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BhZ2U6aGVhZGVyJyxcbiAgICAgICAgICBpZDogJ2xlYWRfaGVhZGVyJyxcbiAgICAgICAgICBsYWJlbDogJ0xlYWQgSW5mb3JtYXRpb24nLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRpdGxlOiAne2ZpcnN0X25hbWV9IHtsYXN0X25hbWV9JyxcbiAgICAgICAgICAgIHN1YnRpdGxlOiAne2NvbXBhbnl9JyxcbiAgICAgICAgICAgIC8vIGBpY29uYCByZW1vdmVkIGZyb20gYHBhZ2U6aGVhZGVyYCBpbiBAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjBcbiAgICAgICAgICAgIC8vICgjNjk0NiwgQURSLTAwODcgRDIpIFx1MjAxNCBkZWxldGVkLCBub3QgcmVuYW1lZC4gU2VlIHRoZSBmdWxsIG5vdGUgb25cbiAgICAgICAgICAgIC8vIGBhY2NvdW50X2RldGFpbC5wYWdlLnRzYDsgbm90aGluZyBldmVyIGRyZXcgaXQuXG4gICAgICAgICAgICAvLyBgYnJlYWRjcnVtYmAgcmV0aXJlZCBmcm9tIGBwYWdlOmhlYWRlcmAgaW4gQG9iamVjdHN0YWNrL3NwZWMgMTcuNi4wXG4gICAgICAgICAgICAvLyAoIzIwNzg1LCBgcGFnZS1oZWFkZXItYnJlYWRjcnVtYi1yZW1vdmVkYCkgXHUyMDE0IGRlbGV0ZWQ6IG5vIHJlbmRlcmVyXG4gICAgICAgICAgICAvLyBldmVyIGRyZXcgYSB0cmFpbCBmb3IgaXQ7IHRoZSBhcHAgc2hlbGwncyBvd24gdHJhaWwgaXMgdW5jaGFuZ2VkLlxuICAgICAgICAgICAgLy8gQ29udmVydCBpcyB0aGUgb3V0Y29tZTsgc2NoZWR1bGluZyB0aGUgbmV4dCB0b3VjaCBpcyB0aGUgZGFpbHlcbiAgICAgICAgICAgIC8vIGFjdC4gQm90aCBiZWxvbmcgaW4gdGhlIGhlYWRlciBcdTIwMTQgdGhlIGZvbGxvdy11cCB1c2VkIHRvIGJlIGZvdXJcbiAgICAgICAgICAgIC8vIGNsaWNrcyBkZWVwIGluIHRoZSBSZWxhdGVkIHRhYi5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGUgdGhyZWUgYWN0aXZpdHkgYWN0aW9ucyBhcmUgbGlzdGVkIEVYUExJQ0lUTFkgKCM1OTIpOiBhIGN1c3RvbVxuICAgICAgICAgICAgLy8gcmVjb3JkIHBhZ2UgcmVwbGFjZXMgdGhlIHN5bnRoZXNpemVkIGhlYWRlciwgc28gYW4gb2JqZWN0LXNjb3BlZFxuICAgICAgICAgICAgLy8gYWN0aW9uIHRoYXQgaXMgbm90IG5hbWVkIGhlcmUgaXMgdW5yZWFjaGFibGUgZnJvbSB0aGUgcmVjb3JkIFx1MjAxNFxuICAgICAgICAgICAgLy8gb25seSB0aGUgbGlzdC1yb3cgXHUyMkVFIG1lbnUgY2FuIGZpcmUgaXQuIExvZ2dpbmcgdGhlIGNhbGwgeW91IGp1c3RcbiAgICAgICAgICAgIC8vIG1hZGUgaXMgdGhlIHNpbmdsZSBtb3N0IGZyZXF1ZW50IHRoaW5nIGEgcmVwIGRvZXMgb24gYSBsZWFkLCBhbmRcbiAgICAgICAgICAgIC8vIGl0IHdhcyB0d28gbmF2aWdhdGlvbnMgYXdheS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBBY3Rpb24gSURzLCBub3QgYEFjdGlvbkRlZmAgb2JqZWN0czogYFBhZ2VIZWFkZXJQcm9wcy5hY3Rpb25zYCBpc1xuICAgICAgICAgICAgLy8gYHouYXJyYXkoei5zdHJpbmcoKSlgIChcIkFjdGlvbiBJRHMgdG8gc2hvdyBpbiBoZWFkZXJcIikgaW5cbiAgICAgICAgICAgIC8vIEBvYmplY3RzdGFjay9zcGVjIDE3LjMuMCwgYW5kIHRoaXMgcmVwbyBhdXRob3JzIGFnYWluc3QgdGhlXG4gICAgICAgICAgICAvLyBwcm90b2NvbCAoIzE2NTMpLiBFYWNoIGlkIGlzIHRoZSBgbmFtZWAgb2YgYSBjcm1fbGVhZC1zY29wZWRcbiAgICAgICAgICAgIC8vIGFjdGlvbiBcdTIwMTQgYGNvbnZlcnRfbGVhZGAgLyBgc2NoZWR1bGVfZm9sbG93dXBgIGluXG4gICAgICAgICAgICAvLyBgc3JjL3NhbGVzL2FjdGlvbnMvbGVhZC5hY3Rpb25zLnRzYCwgdGhlIGFjdGl2aXR5IHRyaW8gaW5cbiAgICAgICAgICAgIC8vIGBzcmMvc2FsZXMvYWN0aW9ucy9hY3Rpdml0eS1hY3Rpb25zLnRzYC5cbiAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ2NvbnZlcnRfbGVhZCcsXG4gICAgICAgICAgICAgICdzY2hlZHVsZV9mb2xsb3d1cCcsXG4gICAgICAgICAgICAgICdsb2dfY2FsbCcsXG4gICAgICAgICAgICAgICdsb2dfbWVldGluZycsXG4gICAgICAgICAgICAgICdzY2hlZHVsZV9tZWV0aW5nJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gRHVwbGljYXRlIGJhbm5lcnMgXHUyMDE0IE9ORSBQRVIgVkVSRElDVCAoIzEyMDcgXHUwMEI3IHdpZGVuZWQgYnkgIzEyODkgXHUwMEI3XG4gICAgICAgIC8vIHNwbGl0IGJ5ICMxNjI4KS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYGxlYWRfZHVwbGljYXRlX2NoZWNrYCAobGVhZC5ob29rLnRzLCBqb2IgMikgYWxyZWFkeSB3cml0ZXNcbiAgICAgICAgLy8gYGR1cGxpY2F0ZV9zdGF0dXM6ICdzdXNwZWN0ZWQnYCBhbmQgbGlua3MgdGhlIHJlY29yZCB0aGUgbGVhZCByZXBlYXRzXG4gICAgICAgIC8vIFx1MjAxNCB0aGUgZmxhZyBleGlzdGVkLCBhbmQgdGhpcyBwYWdlIG5ldmVyIHJlYWQgaXQuIEEgcmVwIG9wZW5lZCBhXG4gICAgICAgIC8vIGZsYWdnZWQgbGVhZCwgc2F3IGEgcGFnZSBpZGVudGljYWwgdG8gYSBjbGVhbiBvbmUsIGFuZCBjb252ZXJ0ZWQgaXRcbiAgICAgICAgLy8gaW50byBhIHNlY29uZCBhY2NvdW50LCBjb250YWN0IGFuZCBvcHBvcnR1bml0eS4gVGhlc2UgYmFubmVycyBhbmQgdGhlXG4gICAgICAgIC8vIGBkdXBsaWNhdGVzYCBzZWN0aW9uIG9uIHRoZSBEZXRhaWxzIHRhYiBhcmUgdGhlIHJlY29yZC1wYWdlIGhhbGYgb2ZcbiAgICAgICAgLy8gdGhhdCBmaXggXHUyMDE0IHRoZSBiYW5uZXIgaXMgdGhlIGFsYXJtLCB0aGUgc2VjdGlvbiBpcyB0aGUgbGluayB0b1xuICAgICAgICAvLyBjb21wYXJlIGFnYWluc3Q7IHRoZSBjb252ZXJzaW9uIHNjcmVlbiBjYXJyaWVzIHRoZSBvdGhlciBoYWxmLlxuICAgICAgICAvL1xuICAgICAgICAvLyAjIyBXaHkgdGhlcmUgYXJlIFRXTyBvZiB0aGVtICgjMTYyOClcbiAgICAgICAgLy9cbiAgICAgICAgLy8gIzEyMDcgc2hpcHBlZCBvbmUgYmFubmVyIGdhdGVkIG9uIGA9PSBcInN1c3BlY3RlZFwiYCwgd2hpY2ggbGVmdCB0aGVcbiAgICAgICAgLy8gU1RST05HRVIgc3RhdGUgc2lsZW50LiAjMTI4OSB3aWRlbmVkIHRoZSBwcmVkaWNhdGUgdG8gZXZlcnkgdmVyZGljdFxuICAgICAgICAvLyBhbmQsIGJlaW5nIG9uZSBjb21wb25lbnQsIGhhZCB0byBwaWNrIGNvcHkgdGhhdCBuYW1lZCBORUlUSEVSIHN0YXRlOlxuICAgICAgICAvLyBhIGByZWNvcmQ6YWxlcnRgIGNhcnJpZXMgYSBzaW5nbGUgYHZpc2libGVgIGFuZCBhIHNpbmdsZSB0aXRsZS9ib2R5XG4gICAgICAgIC8vIHBhaXIsIGFuZCBgcGlja0xvY2FsaXplZGAgcGlja3MgYnkgTEFOR1VBR0UsIG5vdCBieSByb3cgXHUyMDE0IHNvIG5hbWluZ1xuICAgICAgICAvLyBvbmUgdmVyZGljdCB3b3VsZCBoYXZlIG1pc2xhYmVsbGVkIGV2ZXJ5IGxlYWQgaW4gdGhlIG90aGVyLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaGF0IHdhcyBjb3JyZWN0IGZvciBvbmUgYmFubmVyLCBhbmQgaXQgaXMgd2h5IG9uZSBiYW5uZXIgaXMgbm90XG4gICAgICAgIC8vIGVub3VnaC4gU2luY2UgIzEyODggdGhlIHR3byB2ZXJkaWN0cyBoYXZlIE9QUE9TSVRFIG5leHQgc3RlcHM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgc3VzcGVjdGVkIFx1MjAxNCB0aGUgaW50YWtlIGhvb2sncyBndWVzcy4gQ29udmVyc2lvbiBQUk9DRUVEUzsgdGhlIHJlcFxuICAgICAgICAvLyAgICAgICAgICAgICAgIHNob3VsZCBjb21wYXJlIGFnYWluc3QgdGhlIGxpbmtlZCByZWNvcmQgZmlyc3QuXG4gICAgICAgIC8vICAgY29uZmlybWVkIFx1MjAxNCBhIHJldmlld2VyJ3MgdmVyZGljdC4gQ29udmVyc2lvbiBpcyBSRUZVU0VEIG91dHJpZ2h0XG4gICAgICAgIC8vICAgICAgICAgICAgICAgKGBsZWFkLWNvbnZlcnNpb24uZmxvdy50c2AsIGByZWZ1c2VfY29uZmlybWVkX2R1cGxpY2F0ZWApLlxuICAgICAgICAvL1xuICAgICAgICAvLyBPbmUgc2VudGVuY2UgY2Fubm90IHN0YXRlIGVpdGhlciB3aXRob3V0IGJlaW5nIGZhbHNlIGZvciB0aGUgb3RoZXIsXG4gICAgICAgIC8vIHNvIGl0IHN0YXRlZCBuZWl0aGVyLCBhbmQgdGhlIHJlcCBoYWQgdG8gc2Nyb2xsIHRvIHRoZSBEdXBsaWNhdGVcbiAgICAgICAgLy8gU3RhdHVzIGNoaXAgdG8gbGVhcm4gd2hpY2ggc2l0dWF0aW9uIHRoZXkgd2VyZSBpbi4gQSBiYW5uZXIgdGhhdFxuICAgICAgICAvLyBhbm5vdW5jZXMgc29tZXRoaW5nIGlzIHdyb25nIGJ1dCBub3Qgd2hhdCB0byBkbyBpcyBub3QgZG9pbmcgdGhlIG9uZVxuICAgICAgICAvLyBqb2IgYSBiYW5uZXIgaGFzLiBUd28gY29tcG9uZW50cywgdHdvIHByZWRpY2F0ZXMsIHR3byBuZXh0IHN0ZXBzLlxuICAgICAgICAvL1xuICAgICAgICAvLyBcdTI2QTBcdUZFMEYgVHdvIHNpYmxpbmcgYHJlY29yZDphbGVydGAgbm9kZXMgcmVhbGx5IGRvIEJPVEggcmVuZGVyOiBhIHJlZ2lvblxuICAgICAgICAvLyByZW5kZXJzIGFzIGBjb21wb25lbnRzLm1hcCgobm9kZSwgaSkgPT4gPFNjaGVtYVJlbmRlcmVyIGtleT17bm9kZT8uaWRcbiAgICAgICAgLy8gfHwgZmFsbGJhY2t9IFx1MjAyNj4pYCBcdTIwMTQgcmVhZCBvdXQgb2YgdGhlIHNoaXBwZWQgY29uc29sZSBidW5kbGUgYXQgdGhlXG4gICAgICAgIC8vIGAub2JqZWN0dWktc2hhYCBwaW4gXHUyMDE0IHNvIGVhY2ggaXMgbW91bnRlZCBzZXBhcmF0ZWx5IGFuZCBldmFsdWF0ZXMgaXRzXG4gICAgICAgIC8vIG93biBgdmlzaWJsZWAgYWdhaW5zdCB0aGUgc2FtZSByb3cuIFRoZWlyIGBpZGBzIGFyZSB0aGVpciBSZWFjdCBrZXlzLFxuICAgICAgICAvLyB3aGljaCBpcyB3aHkgdGhlIHR3byBpZHMgZGlmZmVyIHJhdGhlciB0aGFuIHNoYXJpbmcgb25lLlxuICAgICAgICAvL1xuICAgICAgICAvLyBcdTI2QTBcdUZFMEYgYHZpc2libGVgIGlzIHRoZSBPTkUgcmVjb3JkIGNvbXBvbmVudCB3aG9zZSBQUk9QUyBjYXJyeSBhIHJlYWwgcm93XG4gICAgICAgIC8vIHByZWRpY2F0ZTogYHJlY29yZC1hbGVydC50c3hgIGV2YWx1YXRlcyBgcHJvcGVydGllcy52aXNpYmxlYCB0aHJvdWdoXG4gICAgICAgIC8vIGB0b1ByZWRpY2F0ZUlucHV0YCArIGB1c2VDb25kaXRpb25gIGFnYWluc3QgdGhlIHJvd1xuICAgICAgICAvLyAoYHVzZVByZWRpY2F0ZVJlY29yZENvbnRleHRgKSwgdGhlIHNhbWUgcGlwZWxpbmUgYXMgYW4gYWN0aW9uIGJ1dHRvbi5cbiAgICAgICAgLy8gQSBub2RlLWxldmVsIGB2aXNpYmxlV2hlbmAgaXMgYSBkaWZmZXJlbnQgZ2F0ZSBvbmUgdGllciB1cCxcbiAgICAgICAgLy8gZXZhbHVhdGVkIGJ5IGBTY2hlbWFSZW5kZXJlcmAsIGFuZCB0aGUgdHdvIGNvbXBvc2UgYXMgQU5ELiBNZWFzdXJlZFxuICAgICAgICAvLyBvbiB0aGUgMTcuNi4wIHBpbiAoIzE4ODcpLCB0aGF0IHRpZXIgYmluZHMgdGhlIHBhZ2UncyByb3cgYXNcbiAgICAgICAgLy8gYHJlY29yZGAgdG9vIChvYmplY3R1aSM1NDU0KTogdGhpcyBzYW1lIHByZWRpY2F0ZSwgbW92ZWQgdGhlcmUsXG4gICAgICAgIC8vIGdhdGVkIGNvcnJlY3RseSBpbiBib3RoIGRpcmVjdGlvbnMuIGB2aXNpYmxlYCBzdGF5cyBiZWNhdXNlIGl0IGlzXG4gICAgICAgIC8vIHRoZSBnYXRlIGByZWNvcmQ6YWxlcnRgIGRlY2xhcmVzIGluIGl0cyBvd24gcHJvcHMuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFx1MjZBMFx1RkUwRiBgaGFzKClgIGlzIGxvYWQtYmVhcmluZywgYW5kIHRoaXMgc3VyZmFjZSBpcyB0aGUgV09SU1Qgb2YgdGhlIGZvdXJcbiAgICAgICAgLy8gdGhpcyByZXBvIG1lYXN1cmVzIChjZi4gYHRlc3Qvdmlldy1wcmVkaWNhdGUtZGlhbGVjdC50ZXN0LnRzYCk6IHRoZVxuICAgICAgICAvLyByZW5kZXJlcidzIGNhbGwgc2l0ZSBpcyBGQUlMLVNPRlQgXHUyMDE0IGFuIHVuZXZhbHVhYmxlIHByZWRpY2F0ZSBhbnN3ZXJzXG4gICAgICAgIC8vIFNIT1dOLiBTbyBhIGJhcmUgYHJlY29yZC5kdXBsaWNhdGVfc3RhdHVzID09IFwic3VzcGVjdGVkXCJgIHdvdWxkIGFib3J0XG4gICAgICAgIC8vIHdpdGggYE5vIHN1Y2gga2V5YCBvbiBldmVyeSBjbGVhbiBsZWFkIHdob3NlIGRyaXZlciBvbWl0cyB0aGUgY29sdW1uXG4gICAgICAgIC8vIChgZHJpdmVyLW1lbW9yeWAgLyBgZHJpdmVyLW1vbmdvZGJgOyBgZHJpdmVyLXNxbGAgcmV0dXJucyBpdCBhcyBudWxsKVxuICAgICAgICAvLyBhbmQgcHV0IGEgZHVwbGljYXRlIHdhcm5pbmcgb24gbGVhZHMgdGhhdCBhcmUgbm90IGR1cGxpY2F0ZXMuIFRoZVxuICAgICAgICAvLyBndWFyZCBpcyB3aGF0IG1ha2VzIHRoZSBwcmVkaWNhdGUgYW5zd2VyIGBmYWxzZWAgaW5zdGVhZCBvZiBmYXVsdGluZy5cbiAgICAgICAgLy8gUGlubmVkIG9uIHRoZSByZWFsIGVuZ2luZSBpbiBgdGVzdC9sZWFkLWR1cGxpY2F0ZS12aXNpYmlsaXR5LnRlc3QudHNgLlxuICAgICAgICAvL1xuICAgICAgICAvLyBcdTI2RDQgQW5kIHRoZSBndWFyZCBpcyBOT1QgdGhlIHdob2xlIHByZWRpY2F0ZSBcdTIwMTQgYGhhcygpYCBBTE9ORSBpcyB3cm9uZ1xuICAgICAgICAvLyBoZXJlLCBpbiBlaXRoZXIgc2hhcGUuIEl0IGlzIFRSVUUgZm9yIGEga2V5IHRoYXQgaXMgUFJFU0VOVCBBTkQgTlVMTCxcbiAgICAgICAgLy8gd2hpY2ggaXMgcHJlY2lzZWx5IHdoYXQgYGRyaXZlci1zcWxgIGhhbmRzIGJhY2sgZm9yIGEgY2xlYW4gbGVhZFxuICAgICAgICAvLyAobWVhc3VyZWQ6IGBoYXMocmVjb3JkLmR1cGxpY2F0ZV9zdGF0dXMpYCBhZ2FpbnN0XG4gICAgICAgIC8vIGB7IGR1cGxpY2F0ZV9zdGF0dXM6IG51bGwgfWAgYW5zd2VycyBgeyBvazogdHJ1ZSwgdmFsdWU6IHRydWUgfWApLCBzb1xuICAgICAgICAvLyB0aGUgZ3VhcmQgbmVlZHMgYSBjb21wYXJpc29uIGJlc2lkZSBpdCBvciB0aGUgYmFubmVyIGNyaWVzIHdvbGYgb25cbiAgICAgICAgLy8gZXZlcnkgY2xlYW4gbGVhZC4gIzEyODksIGNvdmVyaW5nIGJvdGggdmVyZGljdHMgYXQgb25jZSwgc3BlbGxlZCB0aGF0XG4gICAgICAgIC8vIGNvbXBhcmlzb24gYCYmIFx1MjAyNiAhPSBudWxsYC4gQSBwZXItdmVyZGljdCBiYW5uZXIgc3BlbGxzIGl0IHdpdGggdGhlXG4gICAgICAgIC8vIEVRVUFMSVRZLCB3aGljaCBpcyBzdHJpY3RseSBuYXJyb3dlciBhbmQgc3Vic3VtZXMgaXQ6IG1lYXN1cmVkIG9uXG4gICAgICAgIC8vIHRoaXMgZW5naW5lLCBgbnVsbCA9PSBcInN1c3BlY3RlZFwiYCBpcyBhIGNsZWFuIGBmYWxzZWAsIG5vdCBhIGZhdWx0LFxuICAgICAgICAvLyBhbmQgdGhlIHR3byBzcGVsbGluZ3MgYWdyZWUgb24gZXZlcnkgcmVjb3JkIHNoYXBlIGEgZHJpdmVyIGNhblxuICAgICAgICAvLyBwcm9kdWNlLiBCb3RoIGhhbHZlcyBvZiB0aGUgc2hhcGUgIzEyODkgcnVsZWQgZm9yIGFyZSBpbnRhY3QgXHUyMDE0IHRoZVxuICAgICAgICAvLyBgaGFzKClgIGd1YXJkIHZlcmJhdGltLCBhbmQgYSBjb21wYXJpc29uIHRoYXQgbWFrZXMgXCJzZXRcIiBtZWFuIHNldCBcdTIwMTRcbiAgICAgICAgLy8gYW5kIHRoZSBjb21wYXJpc29uIGdvdCBTVFJJQ1RFUiwgd2hpY2ggaXMgdGhlIHBvaW50IG9mIHRoZSBzcGxpdC4gVGhlXG4gICAgICAgIC8vIHNhbWUgc3BlbGxpbmcgYWxyZWFkeSBzaGlwcyBvbmUgZmlsZSBvdmVyLCBvbiB0aGlzIHNhbWUgZmllbGQ6IHRoZVxuICAgICAgICAvLyBjb252ZXJzaW9uIGZsb3cncyBgZTIxYCAvIGBlMjVgIGVkZ2VzICgjMTI4OCkgcmVhZFxuICAgICAgICAvLyBgaGFzKHZhcnMubGVhZFJlY29yZC5kdXBsaWNhdGVfc3RhdHVzKSAmJiBcdTIwMjYgPT0gXCJzdXNwZWN0ZWRcImAuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFx1MjZENCBOZWl0aGVyIGhhbGYgbWF5IGJlIHNpbXBsaWZpZWQgYXdheS4gQm90aCBhcmUgcGlubmVkLCBzaGFwZSBieVxuICAgICAgICAvLyBzaGFwZSwgaW5jbHVkaW5nIHRoZSByZXZlcnNlIHBpbiB0aGF0IHRoZSB1bmd1YXJkZWQgdGFpbCByZWFsbHkgZG9lc1xuICAgICAgICAvLyBmYXVsdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYFBgIFx1MjAxNCBhbiBleHBsaWNpdCBgeyBkaWFsZWN0OiAnY2VsJyB9YCBlbnZlbG9wZSBcdTIwMTQgaXMgbm90IGRlY29yYXRpb25cbiAgICAgICAgLy8gZWl0aGVyOiBgRXhwcmVzc2lvbkV2YWx1YXRvci5ldmFsdWF0ZUNvbmRpdGlvbmAgcm91dGVzIE9OTFkgdGhlXG4gICAgICAgIC8vIGVudmVsb3BlIHRvIGBAb2JqZWN0c3RhY2svZm9ybXVsYWAncyBDRUwgZW5naW5lLCB3aGVyZSBgaGFzKClgIGlzIGFcbiAgICAgICAgLy8gcmVhbCBmdW5jdGlvbjsgYSBiYXJlIHN0cmluZyB0YWtlcyB0aGUgbGVnYWN5IEpTIHBhdGgsIHdob3NlXG4gICAgICAgIC8vIGBGb3JtdWxhRnVuY3Rpb25zYCBoYXMgbm8gQ0VMIGBoYXMoKWAsIHNvIHRoZSBndWFyZCB3b3VsZCBpdHNlbGYgYmVcbiAgICAgICAgLy8gdGhlIGZhdWx0IHRoYXQgZmFpbHMgc29mdCB0byB2aXNpYmxlLlxuICAgICAgICAvL1xuICAgICAgICAvLyBgdGl0bGVgIC8gYGJvZHlgIGNhcnJ5IGlubGluZSBsb2NhbGUgbWFwcyByYXRoZXIgdGhhbiBwbGFpbiBzdHJpbmdzOlxuICAgICAgICAvLyB0aGlzIHJlbmRlcmVyIHJlc29sdmVzIGJvdGggdGhyb3VnaCBgcGlja0xvY2FsaXplZChcdTIwMjYsIGxhbmd1YWdlKWBcbiAgICAgICAgLy8gKHRoZSBzYW1lIGNhcGFiaWxpdHkgYG9wcG9ydHVuaXR5X2RldGFpbC5wYWdlLnRzYCByZWNvcmRzIHVuZGVyXG4gICAgICAgIC8vICM5NzIpLCBhbmQgYGJvZHlgIGhhcyBubyBvdGhlciBjaGFubmVsIFx1MjAxNCB0aGUgaTE4biBleHRyYWN0b3Inc1xuICAgICAgICAvLyBwZXItY29tcG9uZW50IGNvcHkga2V5cyAoYFBBR0VfQ09NUE9ORU5UX0NPUFlfS0VZU2AsIHJlYWQgb24gMTcuNi4wKVxuICAgICAgICAvLyBhcmUgdGl0bGUvZGVzY3JpcHRpb24vbGFiZWwvcGxhY2Vob2xkZXIvZW1wdHlUZXh0LCBzbyBhIHBsYWluLXN0cmluZ1xuICAgICAgICAvLyBgYm9keWAgd291bGQgc2hpcCBFbmdsaXNoIHRvIGFsbCBmb3VyIGxvY2FsZXMuIEtlZXBpbmcgYm90aCBoYWx2ZXMgb2Ygb25lIGJhbm5lcidzIGNvcHkgaW4gb25lXG4gICAgICAgIC8vIHBsYWNlIGJlYXRzIHNwbGl0dGluZyBgdGl0bGVgIGludG8gdGhlIGxvY2FsZSBwYWNrcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gXHUyQjUwIEVhY2ggYmFubmVyJ3MgY29weSBOQU1FUyBJVFMgT1dOIFZFUkRJQ1QsIGluIHRoZSB2b2NhYnVsYXJ5IHRoZVxuICAgICAgICAvLyBgZHVwbGljYXRlX3N0YXR1c2AgY2hpcCBiZWxvdyBwdWJsaXNoZXMsIGFuZCBuZXZlciB0aGUgb3RoZXIgb25lIFx1MjAxNFxuICAgICAgICAvLyBwaW5uZWQgYWdhaW5zdCB0aGUgb3B0aW9uIGxhYmVscyByZWFkIG91dCBvZiB0aGUgbG9jYWxlIHBhY2tzIGluXG4gICAgICAgIC8vIGB0ZXN0L2xlYWQtZHVwbGljYXRlLXZpc2liaWxpdHkudGVzdC50c2AsIHNvIHJlbmFtaW5nIGFuIG9wdGlvblxuICAgICAgICAvLyByZS1haW1zIHRoZSBhc3NlcnRpb24gcmF0aGVyIHRoYW4gcmV0aXJpbmcgaXQuXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncmVjb3JkOmFsZXJ0JyxcbiAgICAgICAgICBpZDogJ2xlYWRfZHVwbGljYXRlX2FsZXJ0X3N1c3BlY3RlZCcsXG4gICAgICAgICAgbGFiZWw6ICdTdXNwZWN0ZWQgRHVwbGljYXRlIEFsZXJ0JyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAvLyBgd2FybmluZ2AsIG5vdCBgZXJyb3JgOiBjb252ZXJzaW9uIHN0aWxsIFBST0NFRURTIG9uIHRoaXNcbiAgICAgICAgICAgIC8vIHZlcmRpY3QsIGFuZCB0aGUgcmVuZGVyZXIgbWFwcyBgZXJyb3JgIHRvIGByb2xlPVwiYWxlcnRcImAgL1xuICAgICAgICAgICAgLy8gYGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiYCBcdTIwMTQgYW4gaW50ZXJydXB0aW9uIHRoaXMgc3RhdGUgaGFzIG5vdFxuICAgICAgICAgICAgLy8gZWFybmVkLlxuICAgICAgICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgICAgICAgIHZpc2libGU6IFBgaGFzKHJlY29yZC5kdXBsaWNhdGVfc3RhdHVzKSAmJiByZWNvcmQuZHVwbGljYXRlX3N0YXR1cyA9PSBcInN1c3BlY3RlZFwiYCxcbiAgICAgICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICAgIGVuOiAnU3VzcGVjdGVkIGR1cGxpY2F0ZSBcdTIwMTQgY29tcGFyZSBiZWZvcmUgeW91IGNvbnZlcnQnLFxuICAgICAgICAgICAgICAnemgtQ04nOiAnXHU3NTkxXHU0RjNDXHU5MUNEXHU1OTBEXHUyMDE0XHUyMDE0XHU4RjZDXHU2MzYyXHU1MjREXHU4QkY3XHU1MTQ4XHU2QkQ0XHU1QkY5JyxcbiAgICAgICAgICAgICAgJ2phLUpQJzogJ1x1OTFDRFx1ODkwN1x1MzA2RVx1NzU5MVx1MzA0NCBcdTIwMTQgXHU1OTA5XHU2M0RCXHUzMDU5XHUzMDhCXHU1MjREXHUzMDZCXHU3MTY3XHU1NDA4XHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0JyxcbiAgICAgICAgICAgICAgJ2VzLUVTJzogJ0R1cGxpY2FkbyBTb3NwZWNob3NvOiBjb21wYXJlIGFudGVzIGRlIGNvbnZlcnRpcicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICBlbjpcbiAgICAgICAgICAgICAgICAnSW50YWtlIG1hdGNoZWQgdGhpcyBsZWFkIHRvIGEgcmVjb3JkIHRoaXMgYXBwIGFscmVhZHkgaGFzLiBEdXBsaWNhdGUgJ1xuICAgICAgICAgICAgICAgICsgJ01hbmFnZW1lbnQgYmVsb3cgbGlua3MgdGhhdCByZWNvcmQgXHUyMDE0IG9wZW4gaXQgYW5kIGNvbXBhcmUuIFlvdSBjYW4gc3RpbGwgJ1xuICAgICAgICAgICAgICAgICsgJ2NvbnZlcnQgdGhpcyBsZWFkOiB0aGlzIGlzIHRoZSBtYXRjaCBpbnRha2UgZ3Vlc3NlZCBhdCwgbm90IGEgcmV2aWV3ZXJcXCdzICdcbiAgICAgICAgICAgICAgICArICdkZWNpc2lvbi4gQnV0IGlmIGl0IGlzIHRoZSBzYW1lIGJ1eWVyLCBkaXNxdWFsaWZ5IGl0IGluc3RlYWQsIGJlY2F1c2UgJ1xuICAgICAgICAgICAgICAgICsgJ2NvbnZlcnRpbmcgY3JlYXRlcyBhIHNlY29uZCBhY2NvdW50LCBjb250YWN0IGFuZCBvcHBvcnR1bml0eSBmb3IgdGhlbS4nLFxuICAgICAgICAgICAgICAnemgtQ04nOlxuICAgICAgICAgICAgICAgICdcdTVGNTVcdTUxNjVcdTY1RjZcdTUzRDFcdTczQjBcdThCRTVcdTdFQkZcdTdEMjJcdTRFMEVcdTdDRkJcdTdFREZcdTRFMkRcdTVERjJcdTY3MDlcdThCQjBcdTVGNTVcdTUzMzlcdTkxNERcdTMwMDJcdTRFMEJcdTY1QjlcdTMwMENcdTkxQ0RcdTU5MERcdTdFQkZcdTdEMjJcdTdCQTFcdTc0MDZcdTMwMERcdTRFMkRcdTY2MkZcdTVCODNcdTkxQ0RcdTU5MERcdTc2ODRcdTkwQTNcdTY3NjFcdThCQjBcdTVGNTVcdUZGMEMnXG4gICAgICAgICAgICAgICAgKyAnXHU4QkY3XHU1MTQ4XHU2MjUzXHU1RjAwXHU2QkQ0XHU1QkY5XHUzMDAyXHU4QkU1XHU3RUJGXHU3RDIyXHU0RUNEXHU3MTM2XHU1M0VGXHU0RUU1XHU4RjZDXHU2MzYyXHVGRjFBXHU4RkQ5XHU2NjJGXHU1RjU1XHU1MTY1XHU2NUY2XHU3Njg0XHU4MUVBXHU1MkE4XHU1MjI0XHU2NUFEXHVGRjBDXHU0RTBEXHU2NjJGXHU1QkExXHU2ODM4XHU0RUJBXHU3Njg0XHU3RUQzXHU4QkJBXHUzMDAyJ1xuICAgICAgICAgICAgICAgICsgJ1x1NEY0Nlx1ODJFNVx1Nzg2RVx1NUM1RVx1NTQwQ1x1NEUwMFx1NUJBMlx1NjIzN1x1RkYwQ1x1OEJGN1x1NjUzOVx1NEUzQVx1NTNENlx1NkQ4OFx1OEQ0NFx1NjgzQ1x1MjAxNFx1MjAxNFx1OEY2Q1x1NjM2Mlx1NEYxQVx1NEUzQVx1NTQwQ1x1NEUwMFx1NUJBMlx1NjIzN1x1NTE4RFx1NTIxQlx1NUVGQVx1NEUwMFx1NTk1N1x1NUJBMlx1NjIzN1x1MzAwMVx1ODA1NFx1N0NGQlx1NEVCQVx1NTQ4Q1x1NTU0Nlx1NjczQVx1MzAwMicsXG4gICAgICAgICAgICAgICdqYS1KUCc6XG4gICAgICAgICAgICAgICAgJ1x1NzY3Qlx1OTMzMlx1NjY0Mlx1MzA2Qlx1MzAwMVx1MzA1M1x1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA0Q1x1NjVFMlx1NUI1OFx1MzBFQ1x1MzBCM1x1MzBGQ1x1MzBDOVx1MzA2OFx1NEUwMFx1ODFGNFx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMlx1NEUwQlx1MzA2RVx1MzAwQ1x1OTFDRFx1ODkwN1x1N0JBMVx1NzQwNlx1MzAwRFx1MzA2Qlx1OTFDRFx1ODkwN1x1NTE0OFx1MzA2RSdcbiAgICAgICAgICAgICAgICArICdcdTMwRUNcdTMwQjNcdTMwRkNcdTMwQzlcdTMwNENcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNTlcdTMwMDJcdTMwN0VcdTMwNUFcdTk1OEJcdTMwNDRcdTMwNjZcdTcxNjdcdTU0MDhcdTMwNTdcdTMwNjZcdTMwNEZcdTMwNjBcdTMwNTVcdTMwNDRcdTMwMDJcdTMwNTNcdTMwNkVcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkZcdTMwN0VcdTMwNjBcdTU5MDlcdTYzREJcdTMwNjdcdTMwNERcdTMwN0VcdTMwNTlcdTMwMDInXG4gICAgICAgICAgICAgICAgKyAnXHUzMDUzXHUzMDhDXHUzMDZGXHU3NjdCXHU5MzMyXHU2NjQyXHUzMDZFXHU4MUVBXHU1MkQ1XHU1MjI0XHU1QjlBXHUzMDY3XHUzMDQyXHUzMDhBXHUzMDAxXHU2MkM1XHU1RjUzXHU4MDA1XHUzMDZFXHU3RDUwXHU4QUQ2XHUzMDY3XHUzMDZGXHUzMDQyXHUzMDhBXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDAyXHUzMDVGXHUzMDYwXHUzMDU3XHU1NDBDXHUzMDU4XHU3NkY4XHU2MjRCXHUzMDY3J1xuICAgICAgICAgICAgICAgICsgJ1x1MzA0Mlx1MzA4Q1x1MzA3MFx1MzAwMVx1NTkwOVx1NjNEQlx1MzA1Qlx1MzA1QVx1NEUwRFx1OTA2OVx1NjgzQ1x1MzA2Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlx1NTkwOVx1NjNEQlx1MzA1OVx1MzA4Qlx1MzA2OFx1NTQwQ1x1MzA1OFx1NzZGOFx1NjI0Qlx1MzA2Qlx1NTNENlx1NUYxNVx1NTE0OFx1MzBGQlx1NTNENlx1NUYxNVx1NTE0OCdcbiAgICAgICAgICAgICAgICArICdcdThDQUNcdTRFRkJcdTgwMDVcdTMwRkJcdTU1NDZcdThBQzdcdTMwNENcdTMwODJcdTMwNDZcdTRFMDBcdTdENDRcdTRGNUNcdTYyMTBcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTlcdTMwMDInLFxuICAgICAgICAgICAgICAnZXMtRVMnOlxuICAgICAgICAgICAgICAgICdMYSBjYXB0dXJhIGVuY29udHJcdTAwRjMgcXVlIGVzdGUgcHJvc3BlY3RvIGNvaW5jaWRlIGNvbiB1biByZWdpc3RybyBxdWUgeWEgJ1xuICAgICAgICAgICAgICAgICsgJ2V4aXN0ZS4gR2VzdGlcdTAwRjNuIGRlIER1cGxpY2Fkb3MsIG1cdTAwRTFzIGFiYWpvLCBlbmxhemEgZXNlIHJlZ2lzdHJvOiBcdTAwRTFicmFsbyB5ICdcbiAgICAgICAgICAgICAgICArICdjb21wXHUwMEUxcmVsby4gVG9kYXZcdTAwRURhIHB1ZWRlIGNvbnZlcnRpciBlc3RlIHByb3NwZWN0bywgcG9ycXVlIHNlIHRyYXRhIGRlIHVuYSAnXG4gICAgICAgICAgICAgICAgKyAnY29pbmNpZGVuY2lhIGF1dG9tXHUwMEUxdGljYSBkZSBsYSBjYXB0dXJhIHkgbm8gZGVsIHZlcmVkaWN0byBkZSB1bmEgcGVyc29uYS4gJ1xuICAgICAgICAgICAgICAgICsgJ1Blcm8gc2kgZXMgZWwgbWlzbW8gY29tcHJhZG9yLCBkZXNjYWxpZlx1MDBFRHF1ZWxvIGVuIHN1IGx1Z2FyOiBjb252ZXJ0aXJsbyAnXG4gICAgICAgICAgICAgICAgKyAnY3JlYSB1bmEgc2VndW5kYSBjdWVudGEsIGNvbnRhY3RvIHkgb3BvcnR1bmlkYWQgcGFyYSBcdTAwRTlsLicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncmVjb3JkOmFsZXJ0JyxcbiAgICAgICAgICBpZDogJ2xlYWRfZHVwbGljYXRlX2FsZXJ0X2NvbmZpcm1lZCcsXG4gICAgICAgICAgbGFiZWw6ICdDb25maXJtZWQgRHVwbGljYXRlIEFsZXJ0JyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAvLyBgZXJyb3JgLCBhbmQgdGhlIGxldmVsIGlzIHRoZSBtZXNzYWdlOiB0aGlzIGlzIHRoZSBzdGF0ZSBvbiB3aGljaFxuICAgICAgICAgICAgLy8gdGhlIGFwcCBSRUZVU0VTIHRoZSByZXAncyBuZXh0IGNsaWNrLCBhbmQgdGhlIHJlbmRlcmVyIGdpdmVzXG4gICAgICAgICAgICAvLyBgZXJyb3JgIGByb2xlPVwiYWxlcnRcImAgLyBgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCJgIHJhdGhlciB0aGFuIHRoZVxuICAgICAgICAgICAgLy8gcG9saXRlIGByb2xlPVwic3RhdHVzXCJgIGV2ZXJ5IG90aGVyIGxldmVsIGdldHMuIFx1MjZENCBUaGUgc2V2ZXJpdHkgaXNcbiAgICAgICAgICAgIC8vIHByZXNlbnRhdGlvbiBvbmx5IFx1MjAxNCB3aGF0IHRoZSBhcHAgcmVmdXNlcyB3YXMgcnVsZWQgYnkgIzEyODggYW5kXG4gICAgICAgICAgICAvLyBzaGlwcGVkIGJ5IFBSICMxNTU1LCBhbmQgbm90aGluZyBoZXJlIGNoYW5nZXMgaXQuXG4gICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgIHZpc2libGU6IFBgaGFzKHJlY29yZC5kdXBsaWNhdGVfc3RhdHVzKSAmJiByZWNvcmQuZHVwbGljYXRlX3N0YXR1cyA9PSBcImNvbmZpcm1lZFwiYCxcbiAgICAgICAgICAgIHRpdGxlOiB7XG4gICAgICAgICAgICAgIGVuOiAnQ29uZmlybWVkIGR1cGxpY2F0ZSBcdTIwMTQgY29udmVyc2lvbiB3aWxsIGJlIHJlZnVzZWQnLFxuICAgICAgICAgICAgICAnemgtQ04nOiAnXHU1REYyXHU3ODZFXHU4QkE0XHU5MUNEXHU1OTBEXHUyMDE0XHUyMDE0XHU4RjZDXHU2MzYyXHU1QzA2XHU4OEFCXHU2MkQyXHU3RUREJyxcbiAgICAgICAgICAgICAgJ2phLUpQJzogJ1x1OTFDRFx1ODkwN1x1NzhCQVx1NUI5QSBcdTIwMTQgXHU1OTA5XHU2M0RCXHUzMDZGXHU2MkQyXHU1NDI2XHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU5JyxcbiAgICAgICAgICAgICAgJ2VzLUVTJzogJ0R1cGxpY2FkbyBDb25maXJtYWRvOiBsYSBjb252ZXJzaVx1MDBGM24gc2VyXHUwMEUxIHJlY2hhemFkYScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keToge1xuICAgICAgICAgICAgICAvLyBcdTJCNTAgVGhlIG9ubHkgcGxhY2UgYSByZXAgbGVhcm5zIHRoZSBDb252ZXJ0IGJ1dHRvbiB3aWxsIHJlZnVzZVxuICAgICAgICAgICAgICAvLyB0aGVtIEJFRk9SRSB0aGV5IHByZXNzIGl0IFx1MjAxNCB1bnRpbCB0aGlzIGJhbm5lciwgdGhlIHJlZnVzYWxcbiAgICAgICAgICAgICAgLy8gZGlhbG9nIHdhcyB0aGUgZmlyc3QgdGhleSBoZWFyZCBvZiBpdC5cbiAgICAgICAgICAgICAgZW46XG4gICAgICAgICAgICAgICAgJ0EgcmV2aWV3ZXIgY2hlY2tlZCB0aGlzIGxlYWQgYW5kIHJlY29yZGVkIHRoYXQgaXQgcmVwZWF0cyBhIHJlY29yZCB0aGlzIGFwcCAnXG4gICAgICAgICAgICAgICAgKyAnYWxyZWFkeSBoYXMsIHNvIENvbnZlcnQgTGVhZCByZWZ1c2VzIGl0IFx1MjAxNCB0aGlzIGJhbm5lciBpcyB0aGUgb25seSB3YXJuaW5nICdcbiAgICAgICAgICAgICAgICArICd5b3UgZ2V0IGJlZm9yZSB5b3UgcHJlc3MgdGhlIGJ1dHRvbi4gRGlzcXVhbGlmeSB0aGlzIGxlYWQgaW5zdGVhZCwgbmFtaW5nICdcbiAgICAgICAgICAgICAgICArICd0aGUgc3Vydml2aW5nIHJlY29yZCBmcm9tIER1cGxpY2F0ZSBNYW5hZ2VtZW50IGJlbG93LiBJZiB0aGUgdmVyZGljdCBpcyAnXG4gICAgICAgICAgICAgICAgKyAnd3JvbmcsIGEgcmV2aWV3ZXIgcmV2aXNlcyBEdXBsaWNhdGUgU3RhdHVzOyB0aGVyZSBpcyBubyBvdmVycmlkZSBoZXJlLicsXG4gICAgICAgICAgICAgICd6aC1DTic6XG4gICAgICAgICAgICAgICAgJ1x1NUJBMVx1NjgzOFx1NEVCQVx1NURGMlx1NjgzOFx1NUI5RVx1OEJFNVx1N0VCRlx1N0QyMlx1NEUwRVx1N0NGQlx1N0VERlx1NEUyRFx1NURGMlx1NjcwOVx1OEJCMFx1NUY1NVx1OTFDRFx1NTkwRFx1RkYwQ1x1NTZFMFx1NkI2NFx1MzAwQ1x1OEY2Q1x1NjM2Mlx1N0VCRlx1N0QyMlx1MzAwRFx1NEYxQVx1NjJEMlx1N0VERFx1NjI2N1x1ODg0Q1x1MjAxNFx1MjAxNCdcbiAgICAgICAgICAgICAgICArICdcdTY3MkNcdTYzRDBcdTc5M0FcdTY2MkZcdTRGNjBcdTYzMDlcdTRFMEJcdTYzMDlcdTk0QUVcdTUyNERcdTU1MkZcdTRFMDBcdTc2ODRcdTk4ODRcdThCNjZcdTMwMDJcdThCRjdcdTY1MzlcdTRFM0FcdTUzRDZcdTZEODhcdThCRTVcdTdFQkZcdTdEMjJcdTc2ODRcdThENDRcdTY4M0NcdUZGMENcdTVFNzZcdTU3MjhcdTRFMEJcdTY1QjknXG4gICAgICAgICAgICAgICAgKyAnXHUzMDBDXHU5MUNEXHU1OTBEXHU3RUJGXHU3RDIyXHU3QkExXHU3NDA2XHUzMDBEXHU0RTJEXHU2Q0U4XHU2NjBFXHU0RkREXHU3NTU5XHU3Njg0XHU5MEEzXHU2NzYxXHU4QkIwXHU1RjU1XHUzMDAyXHU4MkU1XHU1MjI0XHU1QjlBXHU2NzA5XHU4QkVGXHVGRjBDXHU1RTk0XHU3NTMxXHU1QkExXHU2ODM4XHU0RUJBXHU0RkVFXHU2NTM5J1xuICAgICAgICAgICAgICAgICsgJ1x1MzAwQ1x1OTFDRFx1NTkwRFx1NzJCNlx1NjAwMVx1MzAwRFx1RkYwQ1x1NkI2NFx1NTkwNFx1NEUwRFx1NjNEMFx1NEY5Qlx1NUYzQVx1NTIzNlx1OEY2Q1x1NjM2Mlx1NzY4NFx1NTE2NVx1NTNFM1x1MzAwMicsXG4gICAgICAgICAgICAgICdqYS1KUCc6XG4gICAgICAgICAgICAgICAgJ1x1NjJDNVx1NUY1M1x1ODAwNVx1MzA0Q1x1NzhCQVx1OEE4RFx1MzA1N1x1MzAwMVx1MzA1M1x1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2Rlx1NjVFMlx1NUI1OFx1MzBFQ1x1MzBCM1x1MzBGQ1x1MzBDOVx1MzA2RVx1OTFDRFx1ODkwN1x1MzA2N1x1MzA0Mlx1MzA4Qlx1MzA2OFx1OEExOFx1OTMzMlx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMidcbiAgICAgICAgICAgICAgICArICdcdTMwNURcdTMwNkVcdTMwNUZcdTMwODFcdTMwMENcdTMwRUFcdTMwRkNcdTMwQzlcdTU5MDlcdTYzREJcdTMwMERcdTMwNkZcdTYyRDJcdTU0MjZcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTlcdTMwMDJcdTMwNTNcdTMwNkVcdTkwMUFcdTc3RTVcdTMwNENcdTMwMDFcdTMwRENcdTMwQkZcdTMwRjNcdTMwOTJcdTYyQkNcdTMwNTlcdTUyNERcdTMwNkJcdTVGOTdcdTMwODlcdTMwOENcdTMwOEInXG4gICAgICAgICAgICAgICAgKyAnXHU1NTJGXHU0RTAwXHUzMDZFXHU4QjY2XHU1NDRBXHUzMDY3XHUzMDU5XHUzMDAyXHUzMDUzXHUzMDZFXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDZGXHU0RTBEXHU5MDY5XHU2ODNDXHUzMDZCXHUzMDU3XHUzMDVGXHUzMDQ2XHUzMDQ4XHUzMDY3XHUzMDAxXHU0RTBCXHUzMDZFXHUzMDBDXHU5MUNEXHU4OTA3XHU3QkExXHU3NDA2XHUzMDBEXHUzMDY3XHU2QjhCXHUzMDU5J1xuICAgICAgICAgICAgICAgICsgJ1x1MzBFQ1x1MzBCM1x1MzBGQ1x1MzBDOVx1MzA5Mlx1NjYwRVx1OEExOFx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMlx1NTIyNFx1NUI5QVx1MzA0Q1x1OEFBNFx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA4Qlx1NTgzNFx1NTQwOFx1MzA2Rlx1NjJDNVx1NUY1M1x1ODAwNVx1MzA0Q1x1MzAwQ1x1OTFDRFx1ODkwN1x1MzBCOVx1MzBDNlx1MzBGQ1x1MzBCRlx1MzBCOVx1MzAwRCdcbiAgICAgICAgICAgICAgICArICdcdTMwOTJcdTRGRUVcdTZCNjNcdTMwNTdcdTMwN0VcdTMwNTlcdTMwMDJcdTMwNTNcdTMwNTNcdTMwNkJcdTVGMzdcdTUyMzZcdTU5MDlcdTYzREJcdTMwNkVcdTYyNEJcdTZCQjVcdTMwNkZcdTMwNDJcdTMwOEFcdTMwN0VcdTMwNUJcdTMwOTNcdTMwMDInLFxuICAgICAgICAgICAgICAnZXMtRVMnOlxuICAgICAgICAgICAgICAgICdVbmEgcGVyc29uYSB2ZXJpZmljXHUwMEYzIHF1ZSBlc3RlIHByb3NwZWN0byByZXBpdGUgdW4gcmVnaXN0cm8gcXVlIHlhIGV4aXN0ZSwgJ1xuICAgICAgICAgICAgICAgICsgJ3BvciBsbyBxdWUgQ29udmVydGlyIFByb3NwZWN0byBsbyByZWNoYXphclx1MDBFMTogZXN0ZSBhdmlzbyBlcyBsYSBcdTAwRkFuaWNhICdcbiAgICAgICAgICAgICAgICArICdhZHZlcnRlbmNpYSBhbnRlcyBkZSBwdWxzYXIgZWwgYm90XHUwMEYzbi4gRGVzY2FsaWZpcXVlIGVsIHByb3NwZWN0byBlIGluZGlxdWUgJ1xuICAgICAgICAgICAgICAgICsgJ2VsIHJlZ2lzdHJvIHF1ZSBzb2JyZXZpdmUgZGVzZGUgR2VzdGlcdTAwRjNuIGRlIER1cGxpY2Fkb3MsIG1cdTAwRTFzIGFiYWpvLiBTaSBlbCAnXG4gICAgICAgICAgICAgICAgKyAndmVyZWRpY3RvIGVzIGluY29ycmVjdG8sIHVuYSBwZXJzb25hIGRlYmUgY2FtYmlhciBlbCBFc3RhZG8gZGVsIER1cGxpY2FkbzsgJ1xuICAgICAgICAgICAgICAgICsgJ2FxdVx1MDBFRCBubyBoYXkgZm9ybWEgZGUgZm9yemFyIGxhIGNvbnZlcnNpXHUwMEYzbi4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAvLyBTYWxlc2ZvcmNlLXN0eWxlIEhpZ2hsaWdodHMgUGFuZWw6IGEgaG9yaXpvbnRhbCBzdHJpcCBvZiB0aGVcbiAgICAgICAgLy8gbW9zdC1pbXBvcnRhbnQga2V5IGZhY3RzIGRpcmVjdGx5IHVuZGVyIHRoZSBoZWFkZXIuIFB1bGxlZCBvdXRcbiAgICAgICAgLy8gb2YgdGhlIHNpZGViYXIgc28gaXQgY2FuIHVzZSB0aGUgZnVsbCBwYWdlIHdpZHRoLlxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3JlY29yZDpoaWdobGlnaHRzJyxcbiAgICAgICAgICBpZDogJ2xlYWRfaGlnaGxpZ2h0cycsXG4gICAgICAgICAgbGFiZWw6ICdLZXkgSW5mb3JtYXRpb24nLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGZpZWxkczogWydzdGF0dXMnLCAncmF0aW5nJywgJ2xlYWRfc291cmNlJywgJ293bmVyX2lkJywgJ2VtYWlsJywgJ3Bob25lJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6cGF0aCcsXG4gICAgICAgICAgaWQ6ICdsZWFkX3BhdGgnLFxuICAgICAgICAgIGxhYmVsOiAnTGVhZCBTdGF0dXMgUGF0aCcsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgc3RhdHVzRmllbGQ6ICdzdGF0dXMnLFxuICAgICAgICAgICAgLy8gYGNvbnZlcnRlZGAgaXMgdGhlIHRlcm1pbmFsIFdJTiBzdGF0ZSBhbmQgbXVzdCBiZSBvbiB0aGUgcGF0aCBcdTIwMTRcbiAgICAgICAgICAgIC8vIHdpdGhvdXQgaXQgdGhlIHN0cmlwIHJlYWRzIGFzIGlmIFwiVW5xdWFsaWZpZWRcIiB3ZXJlIHRoZSBnb2FsLCBhbmRcbiAgICAgICAgICAgIC8vIGEgY29udmVydGVkIGxlYWQgaGFkIG5vIHN0YWdlIHRvIGxpZ2h0IHVwIGF0IGFsbC5cbiAgICAgICAgICAgIHN0YWdlczogW1xuICAgICAgICAgICAgICB7IHZhbHVlOiAnbmV3JywgbGFiZWw6ICdOZXcnIH0sXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICdjb250YWN0ZWQnLCBsYWJlbDogJ0NvbnRhY3RlZCcgfSxcbiAgICAgICAgICAgICAgeyB2YWx1ZTogJ3F1YWxpZmllZCcsIGxhYmVsOiAnUXVhbGlmaWVkJyB9LFxuICAgICAgICAgICAgICB7IHZhbHVlOiAnY29udmVydGVkJywgbGFiZWw6ICdDb252ZXJ0ZWQnIH0sXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICd1bnF1YWxpZmllZCcsIGxhYmVsOiAnVW5xdWFsaWZpZWQnIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG5cbiAgICB7XG4gICAgICBuYW1lOiAnbWFpbicsXG4gICAgICB3aWR0aDogJ2xhcmdlJyxcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwYWdlOnRhYnMnLFxuICAgICAgICAgIGlkOiAnbWFpbl90YWJzJyxcbiAgICAgICAgICBsYWJlbDogJ0xlYWQgSW5mb3JtYXRpb24gVGFicycsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgLy8gYHR5cGVgIFx1MjE5MiBgdGFiU3R5bGVgIChAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjAsICM2Nzc2LCBBRFItMDA4N1xuICAgICAgICAgICAgLy8gRDIpLiBTYW1lIHRocmVlIHZhbHVlczsgc2VlIHRoZSBmdWxsIG5vdGUgb24gYGhvbWUucGFnZS50c2AuXG4gICAgICAgICAgICB0YWJTdHlsZTogJ2xpbmUnLFxuICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnRGV0YWlscycsXG4gICAgICAgICAgICAgICAgaWNvbjogJ2luZm8tY2lyY2xlJyxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVjb3JkOmRldGFpbHMnLFxuICAgICAgICAgICAgICAgICAgICBpZDogJ2xlYWRfZGV0YWlscycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnTGVhZCBEZXRhaWxzJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgbGF5b3V0YCB3YXMgUkVNT1ZFRCBmcm9tIGByZWNvcmQ6ZGV0YWlsc2AgaW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjAgKCM2OTQ2LCBBRFItMDA4NyBEMikgYW5kIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlZCB3aXRoIG5vIHN1Y2Nlc3NvcjogaXRzIGBhdXRvYCB8IGBjdXN0b21gXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2VtYW50aWNzIHdlcmUgbmV2ZXIgaW1wbGVtZW50ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBzZWN0aW9uIGlzIGEgR1JPVVAgUkVGRVJFTkNFICgjODA2LCBtYWludGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcnVsaW5nIEMsIGRlY2lzaW9uIGJhdGNoICMyMSwgMjAyNi0wOS0wMykuIGB7IGdyb3VwIH1gXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbmFtZXMgb25lIG9mIGNybV9sZWFkJ3MgYGZpZWxkR3JvdXBzYCwgYW5kIHRoZSByZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcml2ZXMgdGhhdCBzZWN0aW9uJ3MgbWVtYmVycywgbGFiZWwsIGljb24gYW5kIGNvbGxhcHNlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGUgZnJvbSB0aGUgb2JqZWN0IChgZGVyaXZlRmllbGRHcm91cExheW91dGAsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gQURSLTAwODUgXHUwMEE3NSkuIE1lbWJlcnNoaXAgaGFzIE9ORSBkZWNsYXJhdGlvbiBzaXRlIFx1MjAxNCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgZ3JvdXA6YCBvbiBlYWNoIGZpZWxkIGluIGxlYWQub2JqZWN0LnRzIFx1MjAxNCBhbmQgdGhpcyBwYWdlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gY3VyYXRlcyBvbmx5IHRoZSBPUkRFUiwgc28gYSBmaWVsZCBhZGRlZCB0byBhIGdyb3VwIHNob3dzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdXAgaGVyZSB3aXRoIG5vIGVkaXQgdG8gdGhpcyBmaWxlLiBcdTI2RDQgRG8gbm90IGVudW1lcmF0ZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBmaWVsZHM6YCBhZ2FpbiwgYW5kIGRvIG5vdCByZXN0YXRlIGEga2V5IHRoZSBncm91cCBvd25zXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKGBuYW1lYCAvIGBsYWJlbGAgLyBgaWNvbmAgLyBgY29sbGFwc2libGVgIC9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBgZGVmYXVsdENvbGxhcHNlZGApIGJlc2lkZSBgZ3JvdXBgOiB0aGUgc3BlYyByZWZ1c2VzIGJvdGguXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBcdTI2RDQgYHNlY3Rpb25zYCBzdGF5cyBsb2FkLWJlYXJpbmcuIE9taXR0aW5nIGl0IHJlbmRlcnMgYW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBFTVBUWSBEZXRhaWxzIHRhYiwgbm90IGEgYGZpZWxkR3JvdXBzYCBmYWxsYmFjayAoIzgwNiBSMjhcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvbiAxNy4yLjAsICMxNTIxKTsgZGVyaXZhdGlvbiBpcyBwZXIgc2VjdGlvbiwgdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBncm91cDpgLCBuZXZlciBwYWdlLWxldmVsLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTWVhc3VyZWQgb24gQG9iamVjdHN0YWNrL2NvbnNvbGUgMTcuNi4wICgjODA2IFI3MCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkbGVzcyBDaHJvbWl1bSwgd2l0aCBhIGNvbnRyb2wgbGVnOyBvbiAxNy40LjAgUjYxXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZWQgdGhpcyBmb3JtIGNyYXNoaW5nIHRoZSBjb21wb25lbnQpLiBXaGF0IGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBncm91cCBzZWN0aW9uIGRvZXMgdGhlcmUgaXMgdGhlIHJlbmRlcmVyJ3MsIG5vdCBvdXJzOlxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBpdCBsYXlzIG91dCBpdHMgb3duIGNvbHVtbiBjb3VudCAodGhlIHBhZ2UtbGV2ZWxcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYGNvbHVtbnNgIGFib3ZlIGRvZXMgbm90IHJlYWNoIGl0KTtcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIC0gYSBncm91cCB3aG9zZSBtZW1iZXJzIGFyZSBhbGwgZW1wdHkgcmVuZGVycyBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgIChgZHVwbGljYXRlc2Agb24gYSBjbGVhbiBsZWFkKSwgdW5sZXNzIHRoZSBzZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHNheXMgYGhpZGVFbXB0eTogZmFsc2VgO1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBtZW1iZXJzIHRoZSBoaWdobGlnaHRzIHN0cmlwIHJlZ2lzdGVyZWQgYXJlIGRyb3BwZWQsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHNvIGBhc3NpZ25tZW50YCAob25seSBgb3duZXJfaWRgKSByZW5kZXJzIG5vdGhpbmcgb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcyBwYWdlIFx1MjAxNCB0aGUgb3duZXIgaXMgaW4gdGhlIHN0cmlwO1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgLSBhIGdyb3VwIGRlY2xhcmVkIGBjb2xsYXBzZTogJ2NvbGxhcHNlZCdgIHN0YXJ0c1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBjb2xsYXBzZWQ7IGNoYW5naW5nIHRoYXQgaXMgYSBgZmllbGRHcm91cHNgIGRlY2lzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGluIGxlYWQub2JqZWN0LnRzLCBub3QgYSBrZXkgb24gdGhpcyBwYWdlLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYGhpZGVFbXB0eTogZmFsc2VgICgjMjAwMywgdGhlICMxMjExIHJlYXNvbmluZykgc2l0cyBvblxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBncm91cHMgd2hvc2UgZXZlcnkgbWVtYmVyIGEgcmVwIHR5cGVzIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybSBhc2tzIGZvcjogYGNvbnRhY3RfaW5mb2AgKGBtb2JpbGVgIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGB3ZWJzaXRlYCBvbmNlIHRoZSBzdHJpcCB0YWtlcyBgZW1haWxgIGFuZCBgcGhvbmVgKSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgYWRkcmVzc2AsIGFuZCBgYWRkaXRpb25hbGAgKHJldmVudWUsIGhlYWRjb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdGlvbiwgbm90ZXMpLiBXaXRob3V0IGl0IGFsbCB0aHJlZSB2YW5pc2ggb24gYVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZyZXNoIGxlYWQsIHNvIGEgcmVwIGNhbm5vdCBzZWUgd2hhdCBpcyBsZWZ0IHRvIGZpbGwuXG4gICAgICAgICAgICAgICAgICAgICAgLy8gTm90IG9uIGBhc3NpZ25tZW50YDogaXRzIGRlcml2ZWQgbGlzdCBpcyBlbXB0eSwgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcmVyIGRyYXdzIG5vdGhpbmcgZm9yIGFuIGVtcHR5IGxpc3Qgd2hhdGV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgaGlkZUVtcHR5YCBzYXlzLiBOb3Qgb24gYGR1cGxpY2F0ZXNgOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgbGVhZF9kdXBsaWNhdGVfY2hlY2tgIGhvb2sgd3JpdGVzIGl0LlxuICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGdyb3VwOiAnaWRlbnRpdHknIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGdyb3VwOiAnY29tcGFueV9pbmZvJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ2NvbnRhY3RfaW5mbycsIGhpZGVFbXB0eTogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIE5vdCBDYWxsIC8gRW1haWwgT3B0IE91dCwgcmlnaHQgdW5kZXIgdGhlIG51bWJlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcmVwIGlzIGFib3V0IHRvIGRpYWwgKCM4MDYpLlxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ3ByZWZlcmVuY2VzJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ3F1YWxpZmljYXRpb24nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGdyb3VwOiAnYXNzaWdubWVudCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZ3JvdXA6ICdhZGRyZXNzJywgaGlkZUVtcHR5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ2NvbnZlcnNpb24nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgTElOSyBoYWxmIG9mIHRoZSBkdXBsaWNhdGUgYmFubmVycyAoIzEyMDcpOiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdyb3VwIGNhcnJpZXMgYm90aCBzdXJ2aXZvciBsb29rdXBzLCBiZWNhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBgbGVhZF9kdXBsaWNhdGVfY2hlY2tgIG1hdGNoZXMgY29udGFjdHMgYmVmb3JlIGxlYWRzLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT24gYSBjbGVhbiBsZWFkIGV2ZXJ5IG1lbWJlciBpcyBlbXB0eSwgc28gdGhlIHNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcnMgbm90aGluZy4gXHUyNkEwXHVGRTBGIE5vdCB0aGUgaGlnaGxpZ2h0cyBzdHJpcDpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGByZWNvcmQ6aGlnaGxpZ2h0c2AgY2FwcyBgZmllbGRzYCBhdCA3IGFuZCBob2xkcyA2LlxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ2R1cGxpY2F0ZXMnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXNjcmlwdGlvbiBhbmQgTm90ZXMgXHUyMDE0IGtlcHQgbGFzdCwgd2hlcmUgdGhlIHBhZ2Unc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVzY3JpcHRpb24gc2VjdGlvbiBhbHdheXMgc2F0LlxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ2FkZGl0aW9uYWwnLCBoaWRlRW1wdHk6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnUmVsYXRlZCcsXG4gICAgICAgICAgICAgICAgaWNvbjogJ2xpbmsnLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwYWdlOmFjY29yZGlvbicsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAncmVsYXRlZF9hY2NvcmRpb24nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1JlbGF0ZWQgUmVjb3JkcycsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBhbGxvd011bHRpcGxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnVGFza3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnbGlzdC1jaGVja3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6cmVsYXRlZF9saXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAncmVsYXRlZF90YXNrcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1Rhc2tzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV90YXNrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JtX3Rhc2sgbGlua3MgYmFjayB0aHJvdWdoIHRoZSBwb2x5bW9ycGhpY1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgcmVsYXRlZF90b19sZWFkYCBsb29rdXA7IHRoZXJlIGlzIG5vIGBsZWFkX2lkYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2x1bW4sIHNvIHRoZSBvbGQgYmluZGluZyBtYXRjaGVkIG5vdGhpbmcgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbGlzdCByZWFkIFwiMFwiIG5vIG1hdHRlciBob3cgbWFueSBmb2xsb3ctdXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXAgaGFkIGZpbGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBGaWVsZDogJ3JlbGF0ZWRfdG9fbGVhZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6IFsnc3ViamVjdCcsICdzdGF0dXMnLCAncHJpb3JpdHknLCAnZHVlX2RhdGUnLCAnb3duZXJfaWQnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydDogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdkdWVfZGF0ZScsIG9yZGVyOiAnYXNjJyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdPcGVuIFRhc2tzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ3N0YXR1cycsIG9wZXJhdG9yOiAnbm90X2VxdWFscycsIHZhbHVlOiAnY29tcGxldGVkJyB9XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1ZpZXdBbGw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FjdGl2aXR5JyxcbiAgICAgICAgICAgICAgICBpY29uOiAnY2xvY2snLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6YWN0aXZpdHknLFxuICAgICAgICAgICAgICAgICAgICBpZDogJ2xlYWRfYWN0aXZpdHknLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0FjdGl2aXR5IFRpbWVsaW5lJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGB0eXBlc2AgaXMga2V5ZWQgb24gRkVFRCBJVEVNIEtJTkQsIG5ldmVyIG9uIG9iamVjdCBuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKCMxMjA5KS4gVGhlIG9sZCBgWydjcm1fdGFzayddYCB3YXMgbm90IG9uZSBvZiB0aGUga2luZHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvcCBhY2NlcHRzLCBhbmQgbm90aGluZyBhbnl3aGVyZSBlbmZvcmNlZCB0aGF0OiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwYWdlIHNjaGVtYSdzIGBwcm9wZXJ0aWVzYCBpcyBhbiBvcGVuIGJhZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIChgei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpYCkgc28gdGhlIHZhbHVlIHdhc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlZCB2ZXJiYXRpbSwgYW5kIHRoZSByZW5kZXJlcidzIG93biBzYW5pdGlzZXIgZHJvcHNcbiAgICAgICAgICAgICAgICAgICAgICAvLyBtZW1iZXJzIGl0IGRvZXMgbm90IHJlY29nbmlzZSBhbmQgdGhlbiByZWFkcyB0aGUgRU1QVFlcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZW1haW5kZXIgYXMgXCJubyBmaWx0ZXIgYXV0aG9yZWRcIiBcdTIwMTQgbWVhc3VyZWQgb24gdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2hpcHBlZCBidW5kbGUsIGB0eXBlczogWydjcm1fdGFzayddYCwgYHR5cGVzOiBbXWAgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb21pdHRpbmcgYHR5cGVzYCBhbGwgcmVuZGVyIHRoZSBzYW1lIHVuZmlsdGVyZWQgc3RyZWFtLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoYXQgaXMgd2h5IHRoZSB0YWIgc2hvd2VkIGBDcmVhdGVkIExlYWRgIC8gYFVwZGF0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBMZWFkYCBhdWRpdCByb3dzLCB3aGljaCB0aGUgSGlzdG9yeSB0YWIgYWxyZWFkeSBjb3ZlcnMuXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBXaGF0IHRoaXMgY29tcG9uZW50IGNhbiBhY3R1YWxseSBzaG93IGlzIGBzeXNfYWN0aXZpdHlgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2NvcGVkIHRvIHRoZSByZWNvcmQsIHRocm91Z2ggdGhlIHJlbmRlcmVyJ3Mgb3duXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBtYXAgXHUyMDE0IG1lYXN1cmVkLCBub3QgaW5mZXJyZWQ6XG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIHN5c19hY3Rpdml0eS50eXBlICAgICAgZmVlZCBraW5kICAgICAgd3JpdHRlbiBieVxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgY3JlYXRlZC91cGRhdGVkL1x1MjAyNiAgICAgIGZpZWxkX2NoYW5nZSAgIHBsYXRmb3JtIGF1ZGl0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBzeXN0ZW0gICAgICAgICAgICAgICAgIHN5c3RlbSAgICAgICAgIHBsYXRmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBjb21wbGV0ZWQgICAgICAgICAgICAgIHRhc2sgICAgICAgICAgIGxvZ19jYWxsIC9cbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21lZXRpbmcgL1xuICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX2VtYWlsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBzY2hlZHVsZWQgICAgICAgICAgICAgIChkcm9wcGVkKSAgICAgIHNjaGVkdWxlX21lZXRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFNvIGB0YXNrYCBpcyB0aGUga2luZCB0aGF0IGNhcnJpZXMgYSByZXAncyBsb2dnZWRcbiAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcmFjdGlvbnMsIGFuZCBpdCBpcyB0aGUgb25seSByZWFjaGFibGUgb25lIHdvcnRoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmlsdGVyaW5nIHRvLiBgZXZlbnRgIGlzIE5PVCBhZGRlZDogaXQgaXMgYSBsZWdhbCBraW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3AgYWNjZXB0cyBidXQgbm8gYHN5c19hY3Rpdml0eS50eXBlYCBtYXBzIHRvIGl0LFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIGl0IHdvdWxkIGJlIGEgZGVjbGFyZWQgdmFsdWUgZW5mb3JjZWQgYnkgbm90aGluZy5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBgc2NoZWR1bGVkYCByb3dzIGZhbGwgb3V0IG9mIHRoZSBtYXAgdXBzdHJlYW0gXHUyMDE0IGFcbiAgICAgICAgICAgICAgICAgICAgICAvLyBwbGF0Zm9ybSBnYXAsIG5vdCBzb21ldGhpbmcgdG8gd29yayBhcm91bmQgaGVyZS5cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlczogWyd0YXNrJ10sXG4gICAgICAgICAgICAgICAgICAgICAgbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIExvYWQtYmVhcmluZywgbm90IGNvc21ldGljOiB0aGUgcmVuZGVyZXIgc3RyaXBzIGV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYHRhc2tgIGl0ZW0gQkVGT1JFIHRoZSBgdHlwZXNgIGZpbHRlciBydW5zIHVubGVzcyB0aGlzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSwgYW5kIGB0YXNrYCBpdGVtcyBhcmUgZXhhY3RseSB0aGUgYGNvbXBsZXRlZGAgcm93cy5cbiAgICAgICAgICAgICAgICAgICAgICAvLyBgdHlwZXM6IFsndGFzayddYCB3aXRoIHRoZSBvbGQgYHNob3dDb21wbGV0ZWQ6IGZhbHNlYFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcnMgYW4gZW1wdHkgdGFiLlxuICAgICAgICAgICAgICAgICAgICAgIHNob3dDb21wbGV0ZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0hpc3RvcnknLFxuICAgICAgICAgICAgICAgIGljb246ICdoaXN0b3J5JyxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyBgcmVjb3JkOmhpc3RvcnlgIGlzIHRoZSBwbGF0Zm9ybSdzIG93biBhdWRpdCBmZWVkIG92ZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkcyBtYXJrZWQgYHRyYWNrSGlzdG9yeWAgKHN0YXR1cyAvIHJhdGluZykuIE93bmVyc2hpcFxuICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlZCB0byB0aGUgcGxhdGZvcm0ncyBgb3duZXJfaWRgIGluICM1NDgsIHdoaWNoIGNhcnJpZXMgbm9cbiAgICAgICAgICAgICAgICAgICAgLy8gYHRyYWNrSGlzdG9yeWAgZmxhZyBcdTIwMTQgdHJhbnNmZXJzIGxhbmQgaW4gdGhlIGNvbXBsaWFuY2UgYXVkaXRcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nLCBub3Qgb24gdGhpcyBmZWVkLlxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaGFuZC1yb2xsZWQgdmVyc2lvbiBxdWVyaWVkIGFuIG9iamVjdCBuYW1lZFxuICAgICAgICAgICAgICAgICAgICAvLyBgZmllbGRfaGlzdG9yeWAsIHdoaWNoIHRoaXMgYXBwIGRvZXMgbm90IGRlZmluZSwgc28gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHRhYiBjb3VsZCBvbmx5IGV2ZXIgcmVuZGVyIGVtcHR5LlxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVjb3JkOmhpc3RvcnknLFxuICAgICAgICAgICAgICAgICAgICBpZDogJ2xlYWRfaGlzdG9yeScsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnRmllbGQgSGlzdG9yeScsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICBsaW1pdDogMjUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIF0sXG5cbiAgLy8gTWFrZSB0aGlzIHRoZSBkZWZhdWx0IHBhZ2UgZm9yIGxlYWRzXG4gIGlzRGVmYXVsdDogdHJ1ZSxcblxuICAvLyBBUklBIGFjY2Vzc2liaWxpdHlcbiAgYXJpYToge1xuICAgIGFyaWFMYWJlbDogJ0xlYWQgRGV0YWlsIFBhZ2UnLFxuICAgIGFyaWFEZXNjcmliZWRCeTogJ0RldGFpbGVkIHZpZXcgb2YgbGVhZCBpbmZvcm1hdGlvbiB3aXRoIHJlbGF0ZWQgcmVjb3JkcyBhbmQgYWN0aXZpdHknLFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL29wcG9ydHVuaXR5X2RldGFpbC5wYWdlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL29wcG9ydHVuaXR5X2RldGFpbC5wYWdlLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQYWdlIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKipcbiAqIE9wcG9ydHVuaXR5IERldGFpbCBSZWNvcmQgUGFnZVxuICpcbiAqIFNhbGVzZm9yY2UgTGlnaHRuaW5nLXN0eWxlIHJlY29yZCBwYWdlIGZvciB0aGUgYGNybV9vcHBvcnR1bml0eWAgb2JqZWN0LlxuICogTWlycm9ycyB0aGUgbGVhZF9kZXRhaWwgYmx1ZXByaW50OiBzaW5nbGUtY29sdW1uIGZ1bGwtd2lkdGggbGF5b3V0IHdpdGhcbiAqIGEgTGlnaHRuaW5nLXN0eWxlIGhlYWRlciBjaGlwLCBwcmltYXJ5IGFjdGlvbiwga2V5IGhpZ2hsaWdodHMgc3RyaXAgYW5kXG4gKiBzdGF0dXMgcGF0aCwgdGhlbiBhIHRhYiBzdHJpcCBiZWxvdy4gTm8gc2lkZWJhciBcdTIwMTQgc2Vjb25kYXJ5IHdpZGdldHMgc3VjaFxuICogYXMgdGhlIEFJIGFzc2lzdGFudCBsaXZlIGluIHRoZSBmbG9hdGluZyBjb25zb2xlIGNoYXQgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9wcG9ydHVuaXR5RGV0YWlsUGFnZTogUGFnZSA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X2RldGFpbF9wYWdlJyxcbiAgbGFiZWw6ICdPcHBvcnR1bml0eSBEZXRhaWwnLFxuICBkZXNjcmlwdGlvbjogJ0NvbXByZWhlbnNpdmUgb3Bwb3J0dW5pdHkgZGV0YWlsIHBhZ2Ugd2l0aCBwYXRoLCBoaWdobGlnaHRzLCBkZXRhaWxzLCBhbmQgcmVsYXRlZCBsaXN0cycsXG5cbiAgdHlwZTogJ3JlY29yZCcsXG4gIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScsXG5cbiAgdGVtcGxhdGU6ICdmdWxsLXdpZHRoJyxcbiAga2luZDogJ2Z1bGwnLFxuICB2YXJpYWJsZXM6IFtcbiAgICB7IG5hbWU6ICdhY3RpdmVUYWInLCB0eXBlOiAnc3RyaW5nJywgZGVmYXVsdFZhbHVlOiAnZGV0YWlscycgfSxcbiAgXSxcblxuICByZWdpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2hlYWRlcicsXG4gICAgICB3aWR0aDogJ2Z1bGwnLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BhZ2U6aGVhZGVyJyxcbiAgICAgICAgICBpZDogJ29wcF9oZWFkZXInLFxuICAgICAgICAgIGxhYmVsOiAnT3Bwb3J0dW5pdHkgSW5mb3JtYXRpb24nLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRpdGxlOiAne25hbWV9JyxcbiAgICAgICAgICAgIC8vIFRoZSBsb29rdXAgZmllbGQgaXMgYGNybV9hY2NvdW50YCBcdTIwMTQgYHthY2NvdW50fWAgbWF0Y2hlZCBub3RoaW5nXG4gICAgICAgICAgICAvLyBhbmQgdGhlIHN1YnRpdGxlIHJlbmRlcmVkIGJsYW5rLlxuICAgICAgICAgICAgc3VidGl0bGU6ICd7Y3JtX2FjY291bnR9JyxcbiAgICAgICAgICAgIC8vIGBpY29uYCByZW1vdmVkIGZyb20gYHBhZ2U6aGVhZGVyYCBpbiBAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjBcbiAgICAgICAgICAgIC8vICgjNjk0NiwgQURSLTAwODcgRDIpIFx1MjAxNCBkZWxldGVkLCBub3QgcmVuYW1lZC4gU2VlIHRoZSBmdWxsIG5vdGUgb25cbiAgICAgICAgICAgIC8vIGBhY2NvdW50X2RldGFpbC5wYWdlLnRzYDsgbm90aGluZyBldmVyIGRyZXcgaXQuXG4gICAgICAgICAgICAvLyBgYnJlYWRjcnVtYmAgcmV0aXJlZCBmcm9tIGBwYWdlOmhlYWRlcmAgaW4gQG9iamVjdHN0YWNrL3NwZWMgMTcuNi4wXG4gICAgICAgICAgICAvLyAoIzIwNzg1LCBgcGFnZS1oZWFkZXItYnJlYWRjcnVtYi1yZW1vdmVkYCkgXHUyMDE0IGRlbGV0ZWQ6IG5vIHJlbmRlcmVyXG4gICAgICAgICAgICAvLyBldmVyIGRyZXcgYSB0cmFpbCBmb3IgaXQ7IHRoZSBhcHAgc2hlbGwncyBvd24gdHJhaWwgaXMgdW5jaGFuZ2VkLlxuICAgICAgICAgICAgLy8gZ2VuZXJhdGVfcXVvdGUgaXMgdGhlIENQUSBlbnRyeSBwb2ludCAob3Bwb3J0dW5pdHkgXHUyMTkyIHF1b3RlKTsgYVxuICAgICAgICAgICAgLy8gY3VzdG9tIHJlY29yZCBwYWdlIHJlcGxhY2VzIHRoZSBkZWZhdWx0IGhlYWRlciwgc28gdGhlIGFjdGlvblxuICAgICAgICAgICAgLy8gbXVzdCBiZSBsaXN0ZWQgaGVyZSBleHBsaWNpdGx5IG9yIGl0IGlzIHVucmVhY2hhYmxlLiBUaGUgc2FtZVxuICAgICAgICAgICAgLy8gc2VudGVuY2UgaXMgd2h5IHRoZSB0aHJlZSBhY3Rpdml0eSBhY3Rpb25zIGFyZSBuYW1lZCBoZXJlICgjNTkyKTpcbiAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhlbSBhIHJlcCBjYW4gbG9nIGEgY2FsbCBvbiB0aGUgZGVhbCBvbmx5IGZyb20gdGhlIGxpc3RcbiAgICAgICAgICAgIC8vIHJvdydzIFx1MjJFRSBtZW51LCBuZXZlciBmcm9tIHRoZSBkZWFsIGl0c2VsZi5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBBY3Rpb24gSURzLCBub3QgYEFjdGlvbkRlZmAgb2JqZWN0czogYFBhZ2VIZWFkZXJQcm9wcy5hY3Rpb25zYCBpc1xuICAgICAgICAgICAgLy8gYHouYXJyYXkoei5zdHJpbmcoKSlgIChcIkFjdGlvbiBJRHMgdG8gc2hvdyBpbiBoZWFkZXJcIikgaW5cbiAgICAgICAgICAgIC8vIEBvYmplY3RzdGFjay9zcGVjIDE3LjMuMCwgYW5kIHRoaXMgcmVwbyBhdXRob3JzIGFnYWluc3QgdGhlXG4gICAgICAgICAgICAvLyBwcm90b2NvbCAoIzE2NTMpLiBFYWNoIGlkIGlzIHRoZSBgbmFtZWAgb2YgYVxuICAgICAgICAgICAgLy8gY3JtX29wcG9ydHVuaXR5LXNjb3BlZCBhY3Rpb24gXHUyMDE0IGBnZW5lcmF0ZV9xdW90ZWAgL1xuICAgICAgICAgICAgLy8gYGNsb25lX29wcG9ydHVuaXR5YCBpbiBgc3JjL3NhbGVzL2FjdGlvbnMvb3Bwb3J0dW5pdHkuYWN0aW9ucy50c2AsIHRoZVxuICAgICAgICAgICAgLy8gYWN0aXZpdHkgdHJpbyBpbiBgc3JjL3NhbGVzL2FjdGlvbnMvYWN0aXZpdHktYWN0aW9ucy50c2AuXG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICdnZW5lcmF0ZV9xdW90ZScsXG4gICAgICAgICAgICAgICdjbG9uZV9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICdsb2dfY2FsbCcsXG4gICAgICAgICAgICAgICdsb2dfbWVldGluZycsXG4gICAgICAgICAgICAgICdzY2hlZHVsZV9tZWV0aW5nJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6aGlnaGxpZ2h0cycsXG4gICAgICAgICAgaWQ6ICdvcHBfaGlnaGxpZ2h0cycsXG4gICAgICAgICAgbGFiZWw6ICdLZXkgSW5mb3JtYXRpb24nLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGZpZWxkczogWydhbW91bnQnLCAnY2xvc2VfZGF0ZScsICdwcm9iYWJpbGl0eScsICdleHBlY3RlZF9yZXZlbnVlJywgJ293bmVyX2lkJywgJ2NybV9hY2NvdW50J10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6cGF0aCcsXG4gICAgICAgICAgaWQ6ICdvcHBfc3RhZ2VfcGF0aCcsXG4gICAgICAgICAgbGFiZWw6ICdPcHBvcnR1bml0eSBTdGFnZSBQYXRoJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICBzdGF0dXNGaWVsZDogJ3N0YWdlJyxcbiAgICAgICAgICAgIC8vIEV2ZXJ5IGNhbm9uaWNhbCB2YWx1ZSBvZiBgc3RhZ2VgIG11c3QgYXBwZWFyIGhlcmUsIGluIGZ1bm5lbFxuICAgICAgICAgICAgLy8gb3JkZXIgXHUyMDE0IHRoZSBwYXRoIGlzIHRoZSBvbmx5IHBsYWNlIGEgcmVwIHJlYWRzIFwid2hlcmUgaXMgdGhpc1xuICAgICAgICAgICAgLy8gZGVhbFwiLiBgbmVlZHNfYW5hbHlzaXNgIHdhcyBtaXNzaW5nLCBzbyBhIGRlYWwgc2l0dGluZyBpbiB0aGF0XG4gICAgICAgICAgICAvLyBzdGFnZSBsaXQgdXAgTk8gc3RlcCBhdCBhbGwgYW5kIHRoZSBzdHJpcCByZWFkIGFzIGlmIHRoZSBkZWFsXG4gICAgICAgICAgICAvLyBoYWQgc2tpcHBlZCBmcm9tIFF1YWxpZmljYXRpb24gdG8gUHJvcG9zYWwuIFRoZSB0d28gdGVybWluYWxcbiAgICAgICAgICAgIC8vIHN0YWdlcyBzdGF5IGxhc3QgKHdvbiBiZWZvcmUgbG9zdCksIG1hdGNoaW5nIGxlYWRfZGV0YWlsJ3NcbiAgICAgICAgICAgIC8vIGNvbnZlcnRlZC91bnF1YWxpZmllZCB0YWlsLlxuICAgICAgICAgICAgc3RhZ2VzOiBbXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICdwcm9zcGVjdGluZycsIGxhYmVsOiAnUHJvc3BlY3RpbmcnIH0sXG4gICAgICAgICAgICAgIHsgdmFsdWU6ICdxdWFsaWZpY2F0aW9uJywgbGFiZWw6ICdRdWFsaWZpY2F0aW9uJyB9LFxuICAgICAgICAgICAgICB7IHZhbHVlOiAnbmVlZHNfYW5hbHlzaXMnLCBsYWJlbDogJ05lZWRzIEFuYWx5c2lzJyB9LFxuICAgICAgICAgICAgICB7IHZhbHVlOiAncHJvcG9zYWwnLCBsYWJlbDogJ1Byb3Bvc2FsJyB9LFxuICAgICAgICAgICAgICB7IHZhbHVlOiAnbmVnb3RpYXRpb24nLCBsYWJlbDogJ05lZ290aWF0aW9uJyB9LFxuICAgICAgICAgICAgICB7IHZhbHVlOiAnY2xvc2VkX3dvbicsIGxhYmVsOiAnQ2xvc2VkIFdvbicgfSxcbiAgICAgICAgICAgICAgeyB2YWx1ZTogJ2Nsb3NlZF9sb3N0JywgbGFiZWw6ICdDbG9zZWQgTG9zdCcgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnbWFpbicsXG4gICAgICB3aWR0aDogJ2xhcmdlJyxcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwYWdlOnRhYnMnLFxuICAgICAgICAgIGlkOiAnb3BwX21haW5fdGFicycsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgLy8gYHR5cGVgIFx1MjE5MiBgdGFiU3R5bGVgIChAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjAsICM2Nzc2LCBBRFItMDA4N1xuICAgICAgICAgICAgLy8gRDIpLiBTYW1lIHRocmVlIHZhbHVlczsgc2VlIHRoZSBmdWxsIG5vdGUgb24gYGhvbWUucGFnZS50c2AuXG4gICAgICAgICAgICB0YWJTdHlsZTogJ2xpbmUnLFxuICAgICAgICAgICAgcG9zaXRpb246ICd0b3AnLFxuICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIFRhYiBpdGVtIGBrZXlgIFx1MjE5MiBgdmFsdWVgICgjMTI2OSk6IGB2YWx1ZWAgaXMgdGhlIHN0YWJsZVxuICAgICAgICAgICAgICAgIC8vIGA/dGFiPWAgVVJMIHRva2VuIHRoZSByZW5kZXJlciByZWFkcywgYGtleWAgaXMgcmVhZCBieVxuICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcuIFNlZSB0aGUgZnVsbCBub3RlIG9uIGBjYXNlX2RldGFpbC5wYWdlLnRzYC5cbiAgICAgICAgICAgICAgICB2YWx1ZTogJ2RldGFpbHMnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnRGV0YWlscycsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlY29yZDpkZXRhaWxzJyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdvcHBfZGV0YWlscycsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnT3Bwb3J0dW5pdHkgRGV0YWlscycsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBgY29sdW1uc2AgaXMgYSBTVFJJTkcgZW51bSAoJzEnfCcyJ3wnMyd8JzQnKSBpblxuICAgICAgICAgICAgICAgICAgICAgIC8vIEBvYmplY3RzdGFjay9zcGVjIDE3LiBgbGF5b3V0YCBpcyBnb25lIChyZW1vdmVkIGluIHNwZWNcbiAgICAgICAgICAgICAgICAgICAgICAvLyAxNy4wLjAsICM2OTQ2IC8gQURSLTAwODcgRDIpLlxuICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBFdmVyeSBzZWN0aW9uIHJlZmVyZW5jZXMgb25lIG9mIGNybV9vcHBvcnR1bml0eSdzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYGZpZWxkR3JvdXBzYCAoIzE0NTIsIHRoZSAjODA2IGNsYXNzIHJ1bGluZyBDKTogdGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVuZGVyZXIgZGVyaXZlcyBtZW1iZXJzLCBsYWJlbCwgaWNvbiBhbmQgY29sbGFwc2Ugc3RhdGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBvYmplY3QsIHNvIHRoaXMgcGFnZSBjdXJhdGVzIG9ubHkgdGhlIG9yZGVyLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmdWxsIG5vdGUgXHUyMDE0IHdoYXQgYSBncm91cCBzZWN0aW9uIGRvZXMgb24gMTcuNi4wIGFuZFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHdoYXQgbWF5IG5vdCBzaXQgYmVzaWRlIGBncm91cGAgXHUyMDE0IGlzIG9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYGxlYWRfZGV0YWlsLnBhZ2UudHNgLlxuICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGhpZ2hsaWdodHMgc3RyaXAgc3RpbGwgd2lucyAoIzEyMTEpOiB0aGUgcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkcm9wcyBldmVyeSBmaWVsZCBgcmVjb3JkOmhpZ2hsaWdodHNgIHJlZ2lzdGVyZWQsIGFuZCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgdGl0bGUsIGZyb20gdGhlIGRlcml2ZWQgbWVtYmVycy4gU28gYGJhc2ljYCBzaG93c1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGBwcmltYXJ5X2NvbnRhY3RgIG9ubHksIGFuZCBgZmluYW5jaWFsc2AgKGBhbW91bnRgLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGBleHBlY3RlZF9yZXZlbnVlYCwgYm90aCBpbiB0aGUgc3RyaXApIHJlbmRlcnMgbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUgXHUyMDE0IGl0IHN0YXlzIHJlZmVyZW5jZWQgc28gdGhhdCBhIGZpZWxkIGFkZGVkIHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGdyb3VwIHJlYWNoZXMgdGhpcyB0YWIgd2l0aG91dCBhbiBlZGl0IHRvIHRoaXMgZmlsZS5cbiAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGBoaWRlRW1wdHk6IGZhbHNlYCBrZWVwcyBhbiBBTEwtZW1wdHkgc2VjdGlvbiBvbiBzY3JlZW5cbiAgICAgICAgICAgICAgICAgICAgICAvLyAoIzEyMTEpLiBUaGUgcGxhdGZvcm0gZGVmYXVsdCAob2JqZWN0dWkjODYwMyBydWxpbmcgQSlcbiAgICAgICAgICAgICAgICAgICAgICAvLyByZW5kZXJzIHN1Y2ggYSBzZWN0aW9uIGFzIG5vdGhpbmcgYXQgYWxsLCBzbyBvbiBhIGRlYWxcbiAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIG9ubHkgaXRzIHJlcXVpcmVkIGZpZWxkcyB0aGUgZGVhbCdzIHR5cGUgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc291cmNlIChgY2xhc3NpZmljYXRpb25gKSwgaXRzIGNhbXBhaWduIChgY2FtcGFpZ25gKVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBpdHMgZGVzY3JpcHRpb24gYW5kIG5leHQgc3RlcCAoYG5vdGVzYCkgdmFuaXNoZWQgXHUyMDE0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHZlcnkgZmllbGRzIGEgc2VsbGVyIGZpbGxzIGluIGxhdGVyLiBLZXB0LCB0aGV5XG4gICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyBhcyBsYWJlbGxlZCBlbXB0eSByb3dzIHRvIGZpbGwuIE1lYXN1cmVkIG9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gMTcuNi4wIG9uIHN1Y2ggYSBkZWFsOiAyIHNlY3Rpb25zIHJlbmRlciB3aXRob3V0IGl0LCA1XG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBpdC4gTm90IG9uIGBiYXNpY2AgKGl0cyBvbmx5IG1lbWJlciBvdXRzaWRlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIHRpdGxlIGFuZCB0aGUgc3RyaXAgaXMgYHByaW1hcnlfY29udGFjdGApLCBub3Igb25cbiAgICAgICAgICAgICAgICAgICAgICAvLyBgZmluYW5jaWFsc2A6IGJvdGggbWVtYmVycyBzaXQgaW4gdGhlIHN0cmlwLCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAvLyBkZXJpdmVkIGxpc3QgaXMgZW1wdHksIGFuZCB0aGUgcmVuZGVyZXIgZHJhd3Mgbm90aGluZ1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhbiBlbXB0eSBsaXN0IHdoYXRldmVyIGBoaWRlRW1wdHlgIHNheXMuXG4gICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAvLyBgcXVhbGlmaWNhdGlvbmAgYW5kIGBuYXJyYXRpdmVgIChSRVEtMDAwNikgc2l0IHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgYHNhbGVzX3Byb2Nlc3NgLCB0aGUgb3JkZXIgdGhlIG9iamVjdCBkZWNsYXJlc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW0gaW4sIGFuZCBib3RoIGtlZXAgYGhpZGVFbXB0eTogZmFsc2VgIG9uIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVhc29uaW5nOiBldmVyeSBtZW1iZXIgaXMgYSBqdWRnZW1lbnQgb3IgYSBwaWVjZSBvZlxuICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3NlIHRoZSBzZWxsZXIgaXMgZXhwZWN0ZWQgdG8gd3JpdGUgKGJpZCAvIG5vLWJpZCxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBjb250cm9sbGFiaWxpdHksIHByaW9yaXR5LCBkZWFsIGxldmVsLCBzdWJjb250cmFjdGluZztcbiAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZm91ciBuYXJyYXRpdmUgZmllbGRzKSwgbm9uZSBzaXRzIGluIHRoZSBzdHJpcCwgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZGVhbCB0aGF0IHByZWRhdGVzIFJFUS0wMDA2IGNhcnJpZXMgYW55IG9mIHRoZW0gXHUyMDE0IHNvXG4gICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCB0aGUga2V5IGJvdGggc2VjdGlvbnMgdmFuaXNoIG9uIGV2ZXJ5IGV4aXN0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZGVhbCwgd2hpY2ggaXMgZXhhY3RseSB3aGVyZSBhIHNlbGxlciB3b3VsZCBmaWxsIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZ3JvdXA6ICdiYXNpYycgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZ3JvdXA6ICdmaW5hbmNpYWxzJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ2NsYXNzaWZpY2F0aW9uJywgaGlkZUVtcHR5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ2NhbXBhaWduJywgaGlkZUVtcHR5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ3NhbGVzX3Byb2Nlc3MnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGdyb3VwOiAncXVhbGlmaWNhdGlvbicsIGhpZGVFbXB0eTogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgZ3JvdXA6ICduYXJyYXRpdmUnLCBoaWRlRW1wdHk6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7IGdyb3VwOiAnY3JtX2ZvcmVjYXN0JyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBncm91cDogJ25vdGVzJywgaGlkZUVtcHR5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ3JlbGF0ZWQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnUmVsYXRlZCcsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3BhZ2U6YWNjb3JkaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdvcHBfcmVsYXRlZF9hY2NvcmRpb24nLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW9uIGl0ZW0gYGtleWAgaXMgREVMRVRFRCwgbm90IHJlbmFtZWQgdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHZhbHVlYCBcdTIwMTQgdGhlIG9wcG9zaXRlIHZlcmRpY3QgdG8gdGhlIHRhYiBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhYm92ZSwgYmVjYXVzZSB0aGlzIHJlbmRlcmVyIG92ZXJ3cml0ZXMgYHZhbHVlYCB3aXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBwYW5lbC08aW5kZXg+YC4gU2VlIHRoZSBmdWxsIG5vdGUgb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGNhc2VfZGV0YWlsLnBhZ2UudHNgLlxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1F1b3RlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9QRU4gb24gYXJyaXZhbCAoIzEyMTQgaXRlbSA2KS4gQWxsIHRocmVlIHBhbmVsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VkIHRvIHN0YXJ0IHNodXQsIHNvIHRoZSBSZWxhdGVkIHRhYiBvcGVuZWQgb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWUgY2xvc2VkIGJhcnMgd2hvc2UgaGVhZGVycyBhbHJlYWR5IGNhcnJpZWQgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50cyBcdTIwMTQgdGhlIGNsaWNrIGJvdWdodCB0aGUgdXNlciBub3RoaW5nIHRoZSBwYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhZCBub3QgYWxyZWFkeSB0b2xkIHRoZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBjb2xsYXBzZWQ6IGZhbHNlYCBpcyB0aGUgd2hvbGUgbWVjaGFuaXNtLCBhbmQgaXQgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZGVkIGV2ZW4gdGhvdWdoIHRoZSBzY2hlbWEgREVGQVVMVFMgaXQgdG8gZmFsc2U6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZW5kZXJlciBvcGVucyB0aGUgcGFuZWxzIGl0IGZpbmRzIGJ5IHN0cmljdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZGVudGl0eSBcdTIwMTQgYGl0ZW1zLmZpbHRlcihpID0+IGkuY29sbGFwc2VkID09PSBmYWxzZSlgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFx1MjAxNCBzbyBhbiBpdGVtIHRoYXQgc2ltcGx5IG9taXRzIHRoZSBrZXkgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHVuZGVmaW5lZGAsIG5vdCBgZmFsc2VgLCBhbmQgc3RheXMgc2h1dC4gTWVhc3VyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb24gdGhlIEBvYmplY3RzdGFjay9jb25zb2xlIDE3LjMuMCBidW5kbGUgXHUyMDE0IHRoZSBwaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhhdCB0YWtpbmcsIFx1MjZENCBOT1QgcmUtdGFrZW4gb24gMTcuNC4wXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vICgjMTgxNCwgIzE4MDcpIG9yIDE3LjUuMCBcdTIwMTRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBjb21wb25lbnQncyBvd24gZGVzaWduZXIgdGV4dCBzYXlzIHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChcImNvbGxhcHNlZDogZmFsc2Ugb3BlbnMgYSBwYW5lbCBieSBkZWZhdWx0XCIpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBcdTI2QTBcdUZFMEYgT05MWSB0aGUgZmlyc3QgcGFuZWwsIGFuZCB0aGF0IGlzIHRoZSByZW5kZXJlcidzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNob2ljZSByYXRoZXIgdGhhbiBhIHByZWZlcmVuY2U6IHdpdGggYGFsbG93TXVsdGlwbGVgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFic2VudCAoaXQgZGVmYXVsdHMgZmFsc2UpIHRoZSBhY2NvcmRpb24gbW91bnRzIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGB0eXBlPVwic2luZ2xlXCJgIGFuZCB0YWtlcyBgZGVmYXVsdFZhbHVlPXtvcGVuWzBdfWAgXHUyMDE0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uZSBwYW5lbCwgdGhlIGZpcnN0IGluIGRlY2xhcmF0aW9uIG9yZGVyLiBNYXJraW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2R1Y3RzIG9yIE9wZW4gVGFza3MgdG9vIHdvdWxkIGNoYW5nZSBub3RoaW5nIG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjcmVlbi4gT3BlbmluZyBtb3JlIHRoYW4gb25lIG1lYW5zIGRlY2xhcmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgYWxsb3dNdWx0aXBsZTogdHJ1ZWAsIHdoaWNoIGNoYW5nZXMgdGhlIGludGVyYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGVsIChwYW5lbHMgc3RvcCBjbG9zaW5nIGVhY2ggb3RoZXIpIGFuZCBpcyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjYXJkJ3MgYXNrLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBcdTI2RDQgTk9UIFwiZGVmYXVsdC1vcGVuIHRoZSBzZWN0aW9ucyB0aGF0IGhhdmUgcm93c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB0aGUgY2FyZCBhc2tlZCBmb3IgZmlyc3Q6IHRoYXQgaXMgbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3NpYmxlIGhlcmUuIGBjb2xsYXBzZWRgIGlzIGEgc3RhdGljIGJvb2xlYW4gb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBzdHJpY3QgaXRlbSBzaGFwZSAoYGxhYmVsYCAvIGBpY29uYCAvIGBjb2xsYXBzZWRgIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGNoaWxkcmVuYCBcdTIwMTQgbm90aGluZyBlbHNlIHBhcnNlcyksIHRoZSBwYWdlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1dGhvcmVkIG1ldGFkYXRhIGV2YWx1YXRlZCBiZWZvcmUgYW55IHJvdyBpcyByZWFkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIHJlbGF0ZWQgbGlzdHMgYmVsb3cgZmV0Y2ggdGhlaXIgb3duIHJvd3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgbW91bnQuIFJlcG9ydGVkIHJhdGhlciB0aGFuIHdvcmtlZCBhcm91bmQ7IFx1MjZENFxuICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY29tcG9uZW50IGlzIG5vdCB0aGlzIHJlcG8ncyB0byBjaGFuZ2UuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3JlY29yZDpyZWxhdGVkX2xpc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdvcHBfcXVvdGVzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9xdW90ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcEZpZWxkOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogWydxdW90ZV9udW1iZXInLCAnbmFtZScsICdzdGF0dXMnLCAndG90YWxfcHJpY2UnLCAnZXhwaXJhdGlvbl9kYXRlJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiAxMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUHJvZHVjdHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6cmVsYXRlZF9saXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnb3BwX3Byb2R1Y3RzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eV9saW5lX2l0ZW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBGaWVsZDogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6IFsnY3JtX3Byb2R1Y3QnLCAncXVhbnRpdHknLCAndW5pdF9wcmljZScsICd0b3RhbF9wcmljZSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdDogMTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBlbnRyeSBwb2ludCB0aGF0IHdhcyBtaXNzaW5nICgjMTczMSkuIEV2ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9USEVSIHN1cmZhY2UgYWxyZWFkeSB0cmVhdGVkIGxpbmUgaXRlbXMgYXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGl2ZSBcdTIwMTQgdGhyZWUgcHJvZmlsZXMgZ3JhbnQgYGFsbG93Q3JlYXRlYCwgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvY3MgZGVzY3JpYmUgdGhlIGFtb3VudCByb2xsaW5nIHVwIGZyb20gdGhlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGBiaWxsaW5nLWhhbmRvZmYuZmxvdy50c2Anc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgbG9hZF9saW5lX2l0ZW1zYCByZWFkcyB0aGVtIG9uIGV2ZXJ5IHdvbiBkZWFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFx1MjAxNCB3aGlsZSBub3RoaW5nIGluIHRoZSBhcHAgY291bGQgY3JlYXRlIG9uZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gYWN0aW9uLCBubyBsaXN0IHZpZXcsIG5vIG5hdmlnYXRpb24gZW50cnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNlZWQuIEEgcmVwIHdobyB3YW50ZWQgdG8gaXRlbWlzZSBhIGRlYWwgaGFkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHR5cGUgdGhlIEFtb3VudCBieSBoYW5kLiBEZWNsYXJlZCBzdXJmYWNlIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFjaGFibGUgc3VyZmFjZSBub3cgY29pbmNpZGUgYWdhaW4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoYXQgYGFkZGAgd3JpdGVzIGlzIHRoZSB3aG9sZSByZWFzb24gYSBwaWNrZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgc3VmZmljaWVudCBoZXJlLiBJdCBjcmVhdGVzIGEgcm93IGNhcnJ5aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4YWN0bHkgdHdvIGF1dGhvcmVkIGtleXMgXHUyMDE0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGB7IFtyZWxhdGlvbnNoaXBGaWVsZF06IDxvcHBvcnR1bml0eUlkPixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgW2xpbmtGaWVsZF06IDxwaWNrZWRQcm9kdWN0SWQ+IH1gIFx1MjAxNCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBlbHNlLiBPbiB0aGlzIG9iamVjdCB0aGF0IHdvdWxkIGxlYXZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBxdWFudGl0eWAgYW5kIGB1bml0X3ByaWNlYCB1bnNldCwgYW5kIGJvdGggYXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGByZXF1aXJlZGAgKyBgc3RvcmFnZS5ub3ROdWxsYCwgc28gdGhlIGluc2VydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3b3VsZCBiZSByZWZ1c2VkLiBJdCBpcyBub3QsIGJlY2F1c2UgdGhlIHR3b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnYXBzIGFyZSBhbHJlYWR5IGZpbGxlZCBieSBtYWNoaW5lcnkgdGhhdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmVkYXRlcyB0aGlzIGxpc3Q6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgcXVhbnRpdHkgICAtPiB0aGUgZmllbGQncyBvd24gYGRlZmF1bHRWYWx1ZTogMWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB1bml0X3ByaWNlIC0+IGBfbGluZS1pdGVtLXByaWNlLWZpbGwudHNgLCB3aGljaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgb24gYGJlZm9yZUluc2VydGAgc3RhbXBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBgbGlzdF9wcmljZWAgZnJvbSB0aGUgY2hvc2VuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBwcm9kdWN0IGFuZCBkZWZhdWx0cyB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIG5lZ290aWF0ZWQgYHVuaXRfcHJpY2VgIHRvIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZGlzY291bnQgICAtPiB0aGUgZmllbGQncyBvd24gYGRlZmF1bHRWYWx1ZTogMGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0b3RhbF9wcmljZS0+IHRoZSBmb3JtdWxhIG92ZXIgdGhlIHRocmVlIGFib3ZlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBgY3JtX3Byb2R1Y3QubGlzdF9wcmljZWAgaXMgaXRzZWxmIGByZXF1aXJlZGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKyBgbm90TnVsbGAsIHNvIHRoZSBob29rIGNhbiBuZXZlciBmYWlsIHRvIGZpbmQgYVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb3VyY2UuIE1lYXN1cmVkIGVuZC10by1lbmQsIG5vdCByZWFzb25lZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHRlc3Qvb3Bwb3J0dW5pdHktbGluZS1pdGVtLWFkZC1waWNrZXIudGVzdC50c2BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5zZXJ0cyB0aGUgcGlja2VyJ3MgZXhhY3QgdHdvLWtleSBzaGFwZSBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXNzZXJ0cyB0aGUgY29tcGxldGUgcHJpY2VkIHJvdywgd2l0aCBhbiBhYmxhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHVuYmluZHMgdGhlIGhvb2sgYW5kIHNob3dzIHRoZSBzYW1lIGluc2VydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWplY3RlZCBhcyBcIlNhbGVzIFByaWNlIGlzIHJlcXVpcmVkXCIgXHUyMDE0IHNvIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3NlcnRpb24gY2Fubm90IHBhc3MgdmFjdW91c2x5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBcdTI2RDQgRG8gbm90IGFkZCBhIGBsYWJlbGAuIFRoZSBidXR0b24gZmFsbHMgYmFjayB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcGxhdGZvcm0ncyBvd24gbG9jYWxpemVkIFwiQWRkXCI7IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2xhdGlvbiBidW5kbGVzIHJlYWNoIGEgcGFnZSBjb21wb25lbnQgdGhyb3VnaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgcGFnZXMuPHBhZ2U+LmNvbXBvbmVudHMuPGlkPmAsIHdoaWNoIGNhcnJpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGxhYmVsYC9gdGl0bGVgL2BkZXNjcmlwdGlvbmAgZm9yIHRoZSBDT01QT05FTlRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGhhcyBubyByb3V0ZSB0byBhIG5lc3RlZCBgYWRkLmxhYmVsYC4gQVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kLWF1dGhvcmVkIHN0cmluZyBoZXJlIHdvdWxkIHNoaXAgRW5nbGlzaCBpbnRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB6aC1DTiAvIGVzLUVTIC8gamEtSlAgYnVuZGxlcyB3aXRoIG5vIGtleSB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2xhdGUgaXQgdW5kZXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGB2YWx1ZUZpZWxkYCBhbmQgYGxhYmVsRmllbGRgIGFyZSBib3RoIG9taXR0ZWQgb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHVycG9zZSByYXRoZXIgdGhhbiByZXN0YXRlZDogYHZhbHVlRmllbGRgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHRzIHRvIGBpZGAsIHdoaWNoIGlzIHdoYXQgdGhlIGBjcm1fcHJvZHVjdGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9va3VwIHN0b3JlcywgYW5kIGBsYWJlbEZpZWxkYCBkZWZhdWx0cyB0byB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGlja2VkIG9iamVjdCdzIG93biB0aXRsZSBmaWVsZCBcdTIwMTQgYGNybV9wcm9kdWN0YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNsYXJlcyBgbmFtZUZpZWxkOiAnZGlzcGxheV90aXRsZSdgIChBRFItMDA3OSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSBwaWNrZXIgbGFiZWxzIHJvd3MgXCJQUkQtMDAwMSAtIFdpZGdldFwiIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyBPTkUgc291cmNlIG9mIHRydXRoIGZvciBhIHByb2R1Y3QncyB0aXRsZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhhdCBmb3JtdWxhIHRpdGxlIGlzIHNlYXJjaGFibGUgb25seSBiZWNhdXNlIHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYmplY3QgYWxzbyBkZWNsYXJlcyBgc2VhcmNoYWJsZUZpZWxkc2AsIHdoaWNoIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFscmVhZHkgZG9lcyBmb3IgZXhhY3RseSB0aGlzIHJlYXNvbi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja2VyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6ICdjcm1fcHJvZHVjdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIHJldGlyZWQgcHJvZHVjdCBtdXN0IG5vdCBiZSBzZWxsYWJsZSBvbnRvIGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBkZWFsLiBgcHJvZHVjdC5ob29rLnRzYCdzIGBiZWZvcmVEZWxldGVgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmVzIHJldGlyZW1lbnQgYXMgcHJlY2lzZWx5IHRoaXMgZmxhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKFwiU2V0IGlzX2FjdGl2ZT1mYWxzZSB0byByZXRpcmUgaW5zdGVhZFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSBjYXRhbG9nJ3Mgb3duIHJldGlyZW1lbnQgbWVjaGFuaXNtIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGF0IHNjb3BlcyB0aGUgcGlja2VyLiBBbGwgMTMgc2VlZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9kdWN0cyBjYXJyeSBgaXNfYWN0aXZlOiB0cnVlYCwgc28gdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFycm93cyB3aXRob3V0IGVtcHR5aW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ2lzX2FjdGl2ZScsIG9wZXJhdG9yOiAnZXF1YWxzJywgdmFsdWU6IHRydWUgfV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rRmllbGQ6ICdjcm1fcHJvZHVjdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ09wZW4gVGFza3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdyZWNvcmQ6cmVsYXRlZF9saXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnb3BwX3Rhc2tzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV90YXNrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwRmllbGQ6ICdyZWxhdGVkX3RvX29wcG9ydHVuaXR5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uczogWydzdWJqZWN0JywgJ3N0YXR1cycsICdwcmlvcml0eScsICdkdWVfZGF0ZScsICdvd25lcl9pZCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IFt7IGZpZWxkOiAnc3RhdHVzJywgb3BlcmF0b3I6ICdub3RfZXF1YWxzJywgdmFsdWU6ICdjb21wbGV0ZWQnIH1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdDogMTAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogJ2FjdGl2aXR5JyxcbiAgICAgICAgICAgICAgICBsYWJlbDogJ0FjdGl2aXR5JyxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVjb3JkOmFjdGl2aXR5JyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdvcHBfYWN0aXZpdHknLFxuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogYGZpbHRlcnNgIGlzIGRlbGV0ZWQgd2l0aCBub3RoaW5nIHB1dCBpbiBpdHMgcGxhY2UsIGFuZFxuICAgICAgICAgICAgICAgICAgICAgKiB0aGF0IGlzIHRoZSB3aG9sZSBmaW5kaW5nICgjMTI2OSkuXG4gICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAqIEl0IHVzZWQgdG8gcmVhZCBgWydhbGwnLCAndGFza3MnLCAnbWVldGluZ3MnLCAnY2FsbHMnLFxuICAgICAgICAgICAgICAgICAgICAgKiAnZW1haWxzJ11gIFx1MjAxNCBhIHZvY2FidWxhcnkgdGhhdCBleGlzdHMgbm93aGVyZSBpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICogY29udHJhY3QuIGBSZWNvcmRBY3Rpdml0eVByb3BzYCBoYXMgZXhhY3RseSB0d28gZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgICAqIGNoYW5uZWxzIGFuZCBuZWl0aGVyIHRha2VzIHRoYXQgbGlzdDpcbiAgICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAgICogICBgdHlwZXNgICAgICAgXHUyMDE0IGFuIGFycmF5IG9mIEZFRUQgSVRFTSBLSU5EU1xuICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgIChgY29tbWVudGAgfCBgZmllbGRfY2hhbmdlYCB8IGB0YXNrYCB8XG4gICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgYGV2ZW50YCB8IGBlbWFpbGAgfCBgY2FsbGAgfCBcdTIwMjYpLiBOb3RcbiAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICB0aGVzZSB2YWx1ZXM6IGBhbGxgIGlzIG5vdCBhIGtpbmQgYW5kXG4gICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgYG1lZXRpbmdzYCBpcyBub3Qgb25lIGVpdGhlciAodGhlIGtpbmRcbiAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICBpcyBgZXZlbnRgKSwgYW5kIGFsbCBmaXZlIGFyZSBwbHVyYWxcbiAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICB3aGVyZSB0aGUgZW51bSBpcyBzaW5ndWxhci5cbiAgICAgICAgICAgICAgICAgICAgICogICBgZmlsdGVyTW9kZWAgXHUyMDE0IE9ORSBkZWZhdWx0IGZvciB0aGUgcGFuZWwncyBkcm9wZG93bixcbiAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICBmcm9tIGBhbGxgIHwgYGNvbW1lbnRzX29ubHlgIHxcbiAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICBgY2hhbmdlc19vbmx5YCB8IGB0YXNrc19vbmx5YC4gVGhlXG4gICAgICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgZHJvcGRvd24ncyBvcHRpb24gbGlzdCBpcyB0aGUgcmVuZGVyZXIncyxcbiAgICAgICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICBub3QgYXV0aG9yYWJsZS5cbiAgICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAgICogU28gdGhlIGxpc3Qgd2FzIHJlYWNoaW5nIGZvciBhIHRoaXJkIHRoaW5nIFx1MjAxNCBcIm9mZmVyIHRoZXNlXG4gICAgICAgICAgICAgICAgICAgICAqIGZpbHRlciBjaGlwc1wiIFx1MjAxNCB0aGF0IHRoZSBjb21wb25lbnQgZG9lcyBub3QgZXhwb3NlLiBXaGF0XG4gICAgICAgICAgICAgICAgICAgICAqIGl0IHdhbnRlZCBpcyBhbHJlYWR5IGRlbGl2ZXJlZDogYHNob3dGaWx0ZXJUb2dnbGVgXG4gICAgICAgICAgICAgICAgICAgICAqIGRlZmF1bHRzIG9uLCBzbyB0aGUgcGFuZWwgcmVuZGVycyBpdHMgZmlsdGVyIGRyb3Bkb3duLCBhbmRcbiAgICAgICAgICAgICAgICAgICAgICogYGZpbHRlck1vZGVgIGRlZmF1bHRzIHRvIGBhbGxgLCBzbyBpdCBvcGVucyB1bmZpbHRlcmVkLlxuICAgICAgICAgICAgICAgICAgICAgKiBOZWl0aGVyIGlzIHJlc3RhdGVkIGhlcmUsIGJlY2F1c2UgbWF0ZXJpYWxpemluZyBhIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICogdHVybnMgXCJ0aGUgYXV0aG9yIHNhaWQgbm90aGluZ1wiIGludG8gXCJ0aGUgYXV0aG9yIGFza2VkIGZvclxuICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZGVmYXVsdFwiIFx1MjAxNCBhIGRpZmZlcmVudCBmYWN0LCBhbmQgdGhlIG9uZSBhIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAqIGxpdmVuZXNzIGF1ZGl0IHJlYWRzLlxuICAgICAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAgICAgKiBNYXBwaW5nIGl0IG9udG8gYHR5cGVzYCBpbnN0ZWFkIHdhcyBjb25zaWRlcmVkIGFuZFxuICAgICAgICAgICAgICAgICAgICAgKiByZWplY3RlZDogIzEyMDkgY29ycmVjdGVkIGV4YWN0bHkgdGhhdCBtaXN0YWtlIG9uZSBwYWdlXG4gICAgICAgICAgICAgICAgICAgICAqIG92ZXIgKHRoZSBsZWFkIHRpbWVsaW5lJ3MgYHR5cGVzOiBbJ2NybV90YXNrJ11gKSwgYW5kIHRoZVxuICAgICAgICAgICAgICAgICAgICAgKiByZW5kZXJlciBzYW5pdGlzZXMgb3V0LW9mLWVudW0gbWVtYmVycyB0aGVuIHJlYWRzIHRoZVxuICAgICAgICAgICAgICAgICAgICAgKiBFTVBUWSByZW1haW5kZXIgYXMgXCJubyBmaWx0ZXIgYXV0aG9yZWRcIiBcdTIwMTQgc28gYSBiYWQgYHR5cGVzYFxuICAgICAgICAgICAgICAgICAgICAgKiBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG5vIGB0eXBlc2Agb24gc2NyZWVuIHdoaWxlXG4gICAgICAgICAgICAgICAgICAgICAqIGNsYWltaW5nIG90aGVyd2lzZSBpbiBzb3VyY2UuIEEgYHR5cGVzYCBoZXJlIHdvdWxkIGFsc29cbiAgICAgICAgICAgICAgICAgICAgICogYmUgYSBORVcgcmVzdHJpY3Rpb24gbm9ib2R5IGFza2VkIGZvcjogaXQgd291bGQgZHJvcFxuICAgICAgICAgICAgICAgICAgICAgKiBjb21tZW50cyBhbmQgZmllbGQgY2hhbmdlcyBmcm9tIGEgdGltZWxpbmUgdGhhdCBzaG93cyB0aGVtXG4gICAgICAgICAgICAgICAgICAgICAqIHRvZGF5LlxuICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiAyNSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkLWJlYXJpbmcgKCMyMDcxKTogYSBjYWxsIG9yIG1lZXRpbmcgbG9nZ2VkIG9uIHRoZVxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlYWwgaXMgYSBgc3lzX2FjdGl2aXR5YCByb3cgb2YgdHlwZSBgY29tcGxldGVkYCAodGhlXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYHRhc2tgIGZlZWQga2luZCksIGFuZCB0aGUgcmVuZGVyZXIgZHJvcHMgZXZlcnkgc3VjaFxuICAgICAgICAgICAgICAgICAgICAgIC8vIHJvdyB1bmxlc3MgdGhpcyBpcyB0cnVlIFx1MjAxNCBzbyBhIHJlcCdzIGxvZ2dlZCBjYWxsIG5ldmVyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVhY2hlZCB0aGlzIHRhYi4gVGhlIGRlYWwncyBvdGhlciBgY29tcGxldGVkYCB3cml0ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIGl0cyBvd24gd29uIC8gbG9zdCBtaWxlc3RvbmVzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gKGBvcHBvcnR1bml0eS5vYmplY3QudHNgKSwgd2hpY2ggYmVsb25nIGhlcmUgdG9vLlxuICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRlZCBjcm1fdGFzayByb3dzIGRvIE5PVCBhcnJpdmU6IHRoZWlyIGF1ZGl0IHJvd3NcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUga2V5ZWQgdG8gdGhlIHRhc2ssIGFuZCB0aGlzIGZlZWQgcmVhZHMgb25seSByb3dzXG4gICAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZWQgdG8gdGhlIGRlYWwuIE5vciBpcyB0aGlzIHRoZSBgdHlwZXNgIHJlc3RyaWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5vdGUgYWJvdmUgcmVmdXNlczogaXQgYWRkcyByb3dzIGFuZCBmaWx0ZXJzIG5vbmUuXG4gICAgICAgICAgICAgICAgICAgICAgc2hvd0NvbXBsZXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnYXNpZGUnLFxuICAgICAgd2lkdGg6ICdzbWFsbCcsXG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncmVjb3JkOnJlZmVyZW5jZV9yYWlsJyxcbiAgICAgICAgICBpZDogJ29wcF9yZWZlcmVuY2VfcmFpbCcsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBObyBlbnRyeSBkZWNsYXJlcyBhIGB0aXRsZWAgXHUyMDE0IGRlbGliZXJhdGVseSAoIzk3MikuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogVGhlIHJhaWwgcmVzb2x2ZXMgYSBjYXJkJ3MgaGVhZGluZyBhc1xuICAgICAgICAgICAgICogYGVudHJ5LnRpdGxlIHx8IGkxOG4ub2JqZWN0TGFiZWwoeyBuYW1lOiBvYmplY3ROYW1lLCBcdTIwMjYgfSlgLCBzbyBhXG4gICAgICAgICAgICAgKiBsaXRlcmFsIGB0aXRsZWAgZG9lcyBub3QgbWVyZWx5IHByb3ZpZGUgYSBkZWZhdWx0OiBpdCBXSU5TLCBhbmRcbiAgICAgICAgICAgICAqIHRoZSBsb2NhbGUgYnVuZGxlIGlzIG5ldmVyIGNvbnN1bHRlZC4gVGhlIHRocmVlIGxpdGVyYWxzIHRoYXRcbiAgICAgICAgICAgICAqIHVzZWQgdG8gc2l0IGhlcmUgKGBRdW90ZXNgIC8gYFByb2R1Y3RzYCAvIGBPcGVuIFRhc2tzYCkgdGhlcmVmb3JlXG4gICAgICAgICAgICAgKiBwcmludGVkIEVuZ2xpc2ggaW50byBldmVyeSBvbmUgb2YgdGhlIGZvdXIgbG9jYWxlcyB0aGlzIGFwcFxuICAgICAgICAgICAgICogc2hpcHMsIG9uIHRvcCBvZiBgb2JqZWN0cy48bmFtZT4ubGFiZWxgIGFscmVhZHkgYmVpbmcgdHJhbnNsYXRlZFxuICAgICAgICAgICAgICogaW4gYWxsIG9mIHRoZW0uIERyb3BwaW5nIHRoZW0gaGFuZHMgdGhlIGhlYWRpbmcgYmFjayB0byB0aGVcbiAgICAgICAgICAgICAqIHRyYW5zbGF0aW9uIGJ1bmRsZSBcdTIwMTQgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHdoYXQgYW5cbiAgICAgICAgICAgICAqIG9iamVjdCBpcyBjYWxsZWQgXHUyMDE0IHNvIGEgbG9jYWxlIGFkZGVkIGxhdGVyIGlzIGNvdmVyZWQgZm9yIGZyZWUuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQSB0cmFuc2xhdGVkIGxpdGVyYWwgaXMgbm90IGF2YWlsYWJsZSBhcyBhbiBhbHRlcm5hdGl2ZTogdW5saWtlXG4gICAgICAgICAgICAgKiBgcmVjb3JkOmFsZXJ0YCwgd2hvc2UgYHRpdGxlYCBpcyBydW4gdGhyb3VnaCB0aGUgaW5saW5lXG4gICAgICAgICAgICAgKiB0cmFuc2xhdGlvbi1tYXAgcmVzb2x2ZXIsIHRoZSByYWlsIHJlbmRlcnMgYGVudHJ5LnRpdGxlYCBhcyBhXG4gICAgICAgICAgICAgKiByYXcgUmVhY3QgY2hpbGQuIEFuIGB7IGVuLCAnemgtQ04nIH1gIG1hcCBoZXJlIHdvdWxkIG5vdCBiZVxuICAgICAgICAgICAgICogcmVzb2x2ZWQgXHUyMDE0IGl0IHdvdWxkIGJlIGhhbmRlZCB0byBSZWFjdCBhcyBhbiBvYmplY3QuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogVGhlIHRoaXJkIGNhcmQgbG9zaW5nIHRoZSB3b3JkIFwiT3BlblwiIGlzIGEgY29ycmVjdGlvbiwgbm90IGFcbiAgICAgICAgICAgICAqIGNhc3VhbHR5LiBBIHJhaWwgZW50cnkgaGFzIG5vIGZpbHRlciBhdCBhbGwgXHUyMDE0IHRoZSByYWlsIHF1ZXJpZXNcbiAgICAgICAgICAgICAqIGB7ICRmaWx0ZXI6IHsgW3JlbGF0aW9uc2hpcEZpZWxkXTogcGFyZW50SWQgfSwgJHRvcDogbGltaXQgfWAgYW5kXG4gICAgICAgICAgICAgKiByZWFkcyBub3RoaW5nIGVsc2UgXHUyMDE0IHNvIHRoYXQgY2FyZCBhbHdheXMgY291bnRlZCBhbmQgbGlzdGVkIHRoaXNcbiAgICAgICAgICAgICAqIGRlYWwncyB0YXNrcyB3aGF0ZXZlciB0aGVpciBzdGF0dXMuIFRoZSBoZWFkaW5nIGNsYWltZWQgYSBmaWx0ZXJcbiAgICAgICAgICAgICAqIHRoZSBjb21wb25lbnQgY2Fubm90IGFwcGx5LiBUaGUgZ2VudWluZWx5IGZpbHRlcmVkIHZpZXcgaXMgdGhlXG4gICAgICAgICAgICAgKiBgb3BwX3Rhc2tzYCByZWxhdGVkIGxpc3Qgb24gdGhlICpSZWxhdGVkKiB0YWIgYWJvdmUsIHdoaWNoIGRvZXNcbiAgICAgICAgICAgICAqIGNhcnJ5IGBzdGF0dXMgbmVxIGNvbXBsZXRlZGAuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogUGlubmVkIGJ5IGB0ZXN0L21ldGFkYXRhLXJlZmVyZW5jZXMudGVzdC50c2AgKGVudHJpZXMgcmVzb2x2ZSxcbiAgICAgICAgICAgICAqIG5vIGxpdGVyYWwgdGl0bGVzKSBhbmQgYHRlc3QvaTE4bi1yZWZlcmVuY2VzLnRlc3QudHNgIChldmVyeVxuICAgICAgICAgICAgICogcmFpbCBvYmplY3QgaGFzIGEgYGxhYmVsYCBpbiBldmVyeSBsb2NhbGUsIHNvIHRoZSBmYWxsYmFja1xuICAgICAgICAgICAgICogbGFuZHMgb24gYSB0cmFuc2xhdGlvbiByYXRoZXIgdGhhbiBvbiBhIGh1bWFuaXplZCBvYmplY3QgbmFtZSkuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGVudHJpZXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fcXVvdGUnLFxuICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcEZpZWxkOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgICAgICAgICAgICBsaW1pdDogMyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtJyxcbiAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXBGaWVsZDogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICAgbGltaXQ6IDMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX3Rhc2snLFxuICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcEZpZWxkOiAncmVsYXRlZF90b19vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICAgbGltaXQ6IDMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIF0sXG5cbiAgaXNEZWZhdWx0OiB0cnVlLFxuXG4gIGFyaWE6IHtcbiAgICBhcmlhTGFiZWw6ICdPcHBvcnR1bml0eSBEZXRhaWwgUGFnZScsXG4gICAgYXJpYURlc2NyaWJlZEJ5OiAnRGV0YWlsZWQgdmlldyBvZiBvcHBvcnR1bml0eSBpbmZvcm1hdGlvbiB3aXRoIHJlbGF0ZWQgcmVjb3JkcyBhbmQgYWN0aXZpdHknLFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL2FjY291bnRfZGV0YWlsLnBhZ2UudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXMvYWNjb3VudF9kZXRhaWwucGFnZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvdWknO1xuXG4vKipcbiAqIEFjY291bnQgRGV0YWlsIFx1MjAxNCBzbG90dGVkIHJlY29yZCBwYWdlLlxuICpcbiAqIFdlIHVzZSBPYmplY3RVSSdzICoqc2xvdHRlZCBwYWdlKiogcGF0dGVybjogdGhlIGRlZmF1bHQtcGFnZVxuICogc3ludGhlc2l6ZXIgb3ducyBsYXlvdXQgKGhlYWRlciwgaGlnaGxpZ2h0cywgcGF0aCwgdGFicyB3aXRoXG4gKiBEZXRhaWxzL1JlbGF0ZWQvQWN0aXZpdHkvSGlzdG9yeSwgcmVmZXJlbmNlIHJhaWwpLiBXZSBvdmVycmlkZVxuICogdHdvIHNsb3RzOlxuICpcbiAqICAgaGVhZGVyICAgXHUwMEI3IEN1c3RvbSBgcGFnZTpoZWFkZXJgIHdpdGggdGl0bGUgYW5kIHN1YnRpdGxlLiBJdCB1c2VkIHRvXG4gKiAgICAgICAgICAgICAgY2xhaW0gYW4gQUNDT1VOVCBleWVicm93LCBhIGJ1aWxkaW5nIGljb24gYW5kIGEgYnJlYWRjcnVtYlxuICogICAgICAgICAgICAgIGJhY2sgdG8gdGhlIGxpc3Q7IG5vbmUgb2YgdGhlbSBldmVyIGRyZXcgYW55dGhpbmcgKCMxMjY5IGFuZFxuICogICAgICAgICAgICAgIHRoZSBwcm9wcyBub3RlcyBiZWxvdyBcdTIwMTQgYGJyZWFkY3J1bWJgIHJldGlyZWQgaW4gMTcuNi4wKS5cbiAqXG4gKiAgIGRpc2N1c3Npb24gXHUwMEI3IGByZWNvcmQ6Y2hhdHRlcmAgaXMgYWxyZWFkeSBhdXRvLWVtaXR0ZWQsIGJ1dCB3ZVxuICogICAgICAgICAgICAgIHJlLXN0YXRlIGl0IHNvIGl0IEFMV0FZUyBhcHBlYXJzIFx1MjAxNCBldmVuIG9uIGFjY291bnRzXG4gKiAgICAgICAgICAgICAgd2l0aCBubyByZWxhdGVkIGxpc3RzICh0aGUgYXV0by1lbWl0dGVyIHNvbWV0aW1lc1xuICogICAgICAgICAgICAgIHNraXBzIGNoYXR0ZXIgZm9yIGxlYW4gb2JqZWN0cykuIERpc2N1c3Npb24gaXMgY29yZVxuICogICAgICAgICAgICAgIHRvIHRoZSBjaGF0LWZpcnN0IHZpYmUsIGFuZCBpdCBpcyB0aGUgYWNjb3VudCdzXG4gKiAgICAgICAgICAgICAgYWN0aXZpdHkgdGltZWxpbmU6IGl0cyBvbmUgYGZlZWRgIHR1cm5zIG9uIHRoZVxuICogICAgICAgICAgICAgIGNvbXBsZXRlZCByb3dzIGEgbG9nZ2VkIGNhbGwgb3IgbWVldGluZyB3cml0ZXNcbiAqICAgICAgICAgICAgICAoc2VlIHRoZSBzbG90J3Mgbm90ZSkuXG4gKlxuICogV2h5IG5vdCBlbWJlZCBhbiBpbmxpbmUgY2hhdCBwYW5lbD8gYGFpOmNoYXRfd2luZG93YCB3YXMgZHJvcHBlZFxuICogZnJvbSBvYmplY3R1aSAoc2VlIEBvYmplY3QtdWkvbGF5b3V0IENIQU5HRUxPRyA1LngpLiBUaGUgc3VwcG9ydGVkXG4gKiBzdXJmYWNlIGlzIHRoZSBnbG9iYWwgZmxvYXRpbmcgY2hhdGJvdCBtb3VudGVkIGJ5IGFwcC1zaGVsbCwgd2hpY2hcbiAqIHBpY2tzIHVwIGBkZWZhdWx0QWdlbnQ6ICdhc2snYCBmcm9tIHRoaXMgYXBwIGFuZCBpcyBsYXVuY2hlZCBmcm9tXG4gKiB0aGUgRkFCIGF0IHRoZSBib3R0b20tcmlnaHQuXG4gKi9cbmV4cG9ydCBjb25zdCBBY2NvdW50RGV0YWlsUGFnZSA9IHtcbiAgbmFtZTogJ2FjY291bnRfZGV0YWlsX3BhZ2UnLFxuICBsYWJlbDogJ0FjY291bnQgRGV0YWlsJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1Nsb3R0ZWQgYWNjb3VudCByZWNvcmQgcGFnZSBcdTIwMTQgY3VzdG9tIGhlYWRlciArIHBlcnNpc3RlbnQgZGlzY3Vzc2lvbiBmZWVkLicsXG5cbiAgdHlwZTogJ3JlY29yZCcsXG4gIG9iamVjdDogJ2NybV9hY2NvdW50JyxcblxuICBraW5kOiAnc2xvdHRlZCcsXG4gIHJlZ2lvbnM6IFtdLFxuXG4gIHNsb3RzOiB7XG4gICAgaGVhZGVyOiB7XG4gICAgICB0eXBlOiAncGFnZTpoZWFkZXInLFxuICAgICAgaWQ6ICdhY2NvdW50X2hlYWRlcl9zbG90dGVkJyxcbiAgICAgIGxhYmVsOiAnQWNjb3VudCBIZWFkZXIgKHNsb3R0ZWQpJyxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgdGl0bGU6ICd7bmFtZX0nLFxuICAgICAgICBzdWJ0aXRsZTogJ3tpbmR1c3RyeX0gXHUwMEI3IHt0eXBlfScsXG4gICAgICAgIC8vIGBpY29uYCBhbmQgYGV5ZWJyb3dgIGFyZSBHT05FLCBhbmQgZm9yIHR3byBkaWZmZXJlbnQgcmVhc29ucyBcdTIwMTQgYm90aFxuICAgICAgICAvLyBtZWFzdXJlZCBhZ2FpbnN0IHRoZSBjb250cmFjdCByYXRoZXIgdGhhbiBpbmZlcnJlZCBmcm9tIHRoZSB3YXJuaW5nXG4gICAgICAgIC8vIHRleHQgKCMxMjY5KS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gYGljb25gIHdhcyBSRU1PVkVEIGZyb20gYHBhZ2U6aGVhZGVyYCBpbiBAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjBcbiAgICAgICAgLy8gKCM2OTQ2LCBBRFItMDA4NyBEMikuIEl0IGlzIGRlbGV0ZWQgcmF0aGVyIHRoYW4gcmVuYW1lZCBiZWNhdXNlIG5vXG4gICAgICAgIC8vIHJlbmRlcmVyIGV2ZXIgcmVhZCBpdDogb2JqZWN0dWkgcmVzb2x2ZXMgYGljb25gIHBlciBoZWFkZXIgQUNUSU9OXG4gICAgICAgIC8vIChgYWN0aW9uLmljb25gKSBhbmQgbmV2ZXIgb2ZmIHRoZSBoZWFkZXIncyBvd24gcHJvcHMgYmFnLCBhbmQgdGhlXG4gICAgICAgIC8vIGNvbXBvbmVudCByZWdpc3RyeSBuZXZlciBwdWJsaXNoZWQgaXQgYXMgYW4gaW5wdXQgXHUyMDE0IHdoaWNoIGlzIHdoYXQgcHV0XG4gICAgICAgIC8vIHRoZSBrZXkgaW4gb2JqZWN0dWkncyBgVU5QVUJMSVNIRURfRVhFTVBUSU9OU2AgYXMgYSBcInNwZWMgZGVjbGFyZXMgaXQsXG4gICAgICAgIC8vIE5PIHJlbmRlcmVyIHJlYWQgcG9pbnRcIiBlbnRyeS4gVGhlIGhlYWRlcidzIG93biBpZGVudGl0eSBjb21lcyBmcm9tXG4gICAgICAgIC8vIHRoZSByZWNvcmQgY2hyb21lIChgcmVjb3JkQ2hyb21lYCwgb24gYnkgZGVmYXVsdCkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGBleWVicm93YCB3YXMgbmV2ZXIgZGVjbGFyZWQgYnkgYW55dGhpbmcuIEl0IGlzIG5vdCBpblxuICAgICAgICAvLyBgUGFnZUhlYWRlclByb3BzYCwgaXQgaGFzIG5vIGFsaWFzIG9yIHRvbWJzdG9uZSB0aGVyZSwgYW5kIHRoZSBzdHJpbmdcbiAgICAgICAgLy8gXCJleWVicm93XCIgZG9lcyBub3Qgb2NjdXIgYW55d2hlcmUgaW4gb2JqZWN0dWkgXHUyMDE0IG5vIHNjaGVtYSwgbm9cbiAgICAgICAgLy8gcmVnaXN0cnkgaW5wdXQsIG5vIHJlbmRlcmVyLiBTbyB0aGUgQUNDT1VOVCBraWNrZXIgdGhpcyBwYWdlJ3NcbiAgICAgICAgLy8gZG9jYmxvY2sgdXNlZCB0byBwcm9taXNlIGhhcyBuZXZlciByZWFjaGVkIGEgc2NyZWVuOiB0aGUgcHJvcHMgYmFnIGlzXG4gICAgICAgIC8vIGB6LnJlY29yZCh6LnN0cmluZygpLCB6LnVua25vd24oKSlgLCBzbyB0aGUga2V5IHdhcyBjYXJyaWVkIGludG8gdGhlXG4gICAgICAgIC8vIGFydGlmYWN0IGFuZCBkcm9wcGVkIGF0IHJlbmRlci4gRGVsZXRpbmcgaXQgY2hhbmdlcyBub3RoaW5nIGEgdXNlclxuICAgICAgICAvLyBzZWVzOyBpdCBvbmx5IHN0b3BzIHRoZSBzb3VyY2UgY2xhaW1pbmcgYSBraWNrZXIgZXhpc3RzLlxuICAgICAgICAvLyBgYnJlYWRjcnVtYmAgcmV0aXJlZCBmcm9tIGBwYWdlOmhlYWRlcmAgaW4gQG9iamVjdHN0YWNrL3NwZWMgMTcuNi4wXG4gICAgICAgIC8vICgjMjA3ODUsIGBwYWdlLWhlYWRlci1icmVhZGNydW1iLXJlbW92ZWRgKSBcdTIwMTQgZGVsZXRlZDogbm8gcmVuZGVyZXJcbiAgICAgICAgLy8gZXZlciBkcmV3IGEgdHJhaWwgZm9yIGl0OyB0aGUgYXBwIHNoZWxsJ3Mgb3duIHRyYWlsIGlzIHVuY2hhbmdlZC5cbiAgICAgICAgLy8gT3ZlcnJpZGluZyB0aGUgYGhlYWRlcmAgc2xvdCBSRVBMQUNFUyB0aGUgc3ludGhlc2l6ZWQgaGVhZGVyLCBhY3Rpb25zXG4gICAgICAgIC8vIGFuZCBhbGwgXHUyMDE0IHNvIHRoaXMgc2xvdCBoYXMgdG8gcmUtc3RhdGUgZXZlcnkgYWN0aW9uIGl0IHdhbnRzIHRvIGtlZXAuXG4gICAgICAgIC8vIEJlZm9yZSAjNTkyIGl0IG5hbWVkIG5vbmUsIHdoaWNoIGlzIHdoeSBhbiBhY2NvdW50IHJlY29yZCBzaG93ZWQgbm9cbiAgICAgICAgLy8gYWN0aXZpdHkgYnV0dG9ucyBhdCBhbGwgd2hpbGUgdGhlIGxpc3Qgcm93J3MgXHUyMkVFIG1lbnUgc2hvd2VkIHRocmVlLlxuICAgICAgICAvL1xuICAgICAgICAvLyBBY3Rpb24gSURzLCBub3QgYEFjdGlvbkRlZmAgb2JqZWN0czogYFBhZ2VIZWFkZXJQcm9wcy5hY3Rpb25zYCBpc1xuICAgICAgICAvLyBgei5hcnJheSh6LnN0cmluZygpKWAgKFwiQWN0aW9uIElEcyB0byBzaG93IGluIGhlYWRlclwiKSBpblxuICAgICAgICAvLyBAb2JqZWN0c3RhY2svc3BlYyAxNy4zLjAsIGFuZCB0aGlzIHJlcG8gYXV0aG9ycyBhZ2FpbnN0IHRoZSBwcm90b2NvbFxuICAgICAgICAvLyAoIzE2NTMpLiBFYWNoIGlkIGlzIHRoZSBgbmFtZWAgb2YgYSBjcm1fYWNjb3VudC1zY29wZWQgYWN0aW9uIGluXG4gICAgICAgIC8vIGBzcmMvc2FsZXMvYWN0aW9ucy9hY3Rpdml0eS1hY3Rpb25zLnRzYC5cbiAgICAgICAgYWN0aW9uczogWydsb2dfY2FsbCcsICdsb2dfbWVldGluZycsICdzY2hlZHVsZV9tZWV0aW5nJ10sXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBkaXNjdXNzaW9uOiB7XG4gICAgICB0eXBlOiAncmVjb3JkOmNoYXR0ZXInLFxuICAgICAgaWQ6ICdhY2NvdW50X2NoYXR0ZXInLFxuICAgICAgbGFiZWw6ICdEaXNjdXNzaW9uJyxcbiAgICAgIC8qKlxuICAgICAgICogT25lIGBmZWVkYCwgZm9yIG9uZSByZWFzb246IGBzaG93Q29tcGxldGVkYCAoIzIwNzEpLlxuICAgICAgICpcbiAgICAgICAqIFRoaXMgZmVlZCBJUyB0aGUgYWNjb3VudCdzIGFjdGl2aXR5IHRpbWVsaW5lIFx1MjAxNCB0aGUgc2xvdHRlZCBwYWdlXG4gICAgICAgKiBzeW50aGVzaXplcyBubyBBY3Rpdml0eSB0YWIsIHNvIHRoZSBwYW5lbCdzIFwiQWxsIEFjdGl2aXR5XCIgc3RyZWFtIGlzXG4gICAgICAgKiB3aGVyZSBhbiBhY2NvdW50J3MgYHN5c19hY3Rpdml0eWAgcm93cyBzdXJmYWNlLiBBIGNhbGwgb3IgbWVldGluZ1xuICAgICAgICogbG9nZ2VkIG9uIHRoZSBhY2NvdW50IGlzIGEgcm93IG9mIHR5cGUgYGNvbXBsZXRlZGAgKHRoZSBgdGFza2AgZmVlZFxuICAgICAgICoga2luZCksIGFuZCB0aGUgdGltZWxpbmUgZHJvcHMgZXZlcnkgc3VjaCByb3cgdW5sZXNzXG4gICAgICAgKiBgZmVlZC5zaG93Q29tcGxldGVkYCBpcyB0cnVlIFx1MjAxNCBzbyBMb2cgYSBDYWxsIC8gTG9nIGEgTWVldGluZyBvbiBhblxuICAgICAgICogYWNjb3VudCB3cm90ZSBhIHJvdyB0aGF0IGFwcGVhcmVkIG5vd2hlcmUgb24gdGhlIGFjY291bnQuXG4gICAgICAgKlxuICAgICAgICogQXV0aG9yaW5nIGEgYGZlZWRgIGNvc3RzIHR3byBtb3JlIGtleXMsIGFuZCB0aGV5IGFyZSBzdGF0ZWQgcmF0aGVyXG4gICAgICAgKiB0aGFuIGxlZnQgb3V0LiBgUmVjb3JkQ2hhdHRlclJlbmRlcmVyYCBidWlsZHMgYHsgcG9zaXRpb246ICdib3R0b20nLFxuICAgICAgICogY29sbGFwc2libGU6IGZhbHNlLCBmZWVkOiB7IGVuYWJsZVJlYWN0aW9uczogdHJ1ZSwgZW5hYmxlVGhyZWFkaW5nOlxuICAgICAgICogdHJ1ZSwgc2hvd0NvbW1lbnRJbnB1dDogdHJ1ZSB9LCAuLi5zY2hlbWEgfWAgXHUyMDE0IG9uZSBzaGFsbG93IHNwcmVhZCBcdTIwMTQgc29cbiAgICAgICAqIGEgYGZlZWRgIG9mIG91ciBvd24gUkVQTEFDRVMgdGhhdCBkZWZhdWx0IG9iamVjdCB3aG9sZXNhbGUsIGFuZFxuICAgICAgICogYFJlY29yZEFjdGl2aXR5VGltZWxpbmVgIHJlYWRzIGBlbmFibGVSZWFjdGlvbnMgPz8gZmFsc2VgIGFuZFxuICAgICAgICogYGVuYWJsZVRocmVhZGluZyA/PyBmYWxzZWAgb2ZmIHdoYXQgaXMgbGVmdC4gV2l0aG91dCB0aGUgdHdvIGtleXNcbiAgICAgICAqIGJlbG93LCByZWFjdGlvbnMgYW5kIHRocmVhZGluZyB3b3VsZCBzaWxlbnRseSBzd2l0Y2ggb2ZmLlxuICAgICAgICogYHNob3dDb21tZW50SW5wdXRgIG5lZWRzIG5vIHJlc3RhdGluZzogdGhlIHRpbWVsaW5lIHJlYWRzIGl0IGFzXG4gICAgICAgKiBgIT09IGZhbHNlYC5cbiAgICAgICAqXG4gICAgICAgKiBgZmVlZC5lbmFibGVNZW50aW9uc2AgbmVlZHMgbm9uZSBlaXRoZXI6IHRoZSByZW5kZXJlciByZWFkcyBpdCBhc1xuICAgICAgICogYCE9PSBmYWxzZWAgdG9vLiBBbmQgdGhlIG9sZGVyIG5vdGUgc3RpbGwgaG9sZHMgKCMxMjY5KTpcbiAgICAgICAqIGBlbmFibGVDb21tZW50c2AgYW5kIGEgdG9wLWxldmVsIGBlbmFibGVSZWFjdGlvbnNgIC8gYGVuYWJsZU1lbnRpb25zYFxuICAgICAgICogYXJlIG5vdCBgcmVjb3JkOmNoYXR0ZXJgIGtleXMgXHUyMDE0IGBSZWNvcmRDaGF0dGVyUHJvcHNgIGRlY2xhcmVzXG4gICAgICAgKiBgcG9zaXRpb25gLCBgd2lkdGhgLCBgY29sbGFwc2libGVgLCBgZGVmYXVsdENvbGxhcHNlZGAsIGBmZWVkYCBhbmRcbiAgICAgICAqIGBhcmlhYCwgbm90aGluZyBlbHNlLlxuICAgICAgICovXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIGZlZWQ6IHtcbiAgICAgICAgICBzaG93Q29tcGxldGVkOiB0cnVlLFxuICAgICAgICAgIGVuYWJsZVJlYWN0aW9uczogdHJ1ZSxcbiAgICAgICAgICBlbmFibGVUaHJlYWRpbmc6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IGFzIHVua25vd24gYXMgUGFnZTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL2FjY291bnRfd29ya2JlbmNoLnBhZ2UudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXMvYWNjb3VudF93b3JrYmVuY2gucGFnZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUGFnZSB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcblxuLyoqXG4gKiBBY2NvdW50IFdvcmtiZW5jaCBcdTIwMTQgQURSLTAwNDcgaW50ZXJmYWNlIHBhZ2UgKEFpcnRhYmxlIEludGVyZmFjZXMgcGFyaXR5KS5cbiAqXG4gKiBUaGUgYXV0aG9yLWN1cmF0ZWQgY291bnRlcnBhcnQgdG8gdGhlIEFjY291bnRzIG9iamVjdCBuYXYgZW50cnkuIFdoZXJlXG4gKiB0aGUgb2JqZWN0IGVudHJ5IChkYXRhIG1vZGUpIHNob3dzIGV2ZXJ5IGxpc3QgdmlldyBhcyBzd2l0Y2hlciB0YWJzIGFuZFxuICogb2ZmZXJzIHRoZSBmdWxsIHRvb2xiYXIsIHRoaXMgcGFnZSBpcyBkZWxpYmVyYXRlbHkgY2xvc2VkOlxuICpcbiAqICAgXHUyMDIyIGl0IFJFRkVSRU5DRVMgdGhlIGFjY291bnQgZGVmYXVsdCB2aWV3IChgc291cmNlVmlld2ApIFx1MjAxNCBjb2x1bW5zLFxuICogICAgIGJhc2UgZmlsdGVyIGFuZCBzb3J0IGFyZSBpbmhlcml0ZWQsIG5ldmVyIHJlc3RhdGVkICh0aGUgaXJvbiBydWxlKTtcbiAqICAgXHUyMDIyIGVuZCB1c2VycyBnZXQgZXhhY3RseSB0aHJlZSBxdWljayBmaWx0ZXJzOiBpbmR1c3RyeSAod2l0aCByZWNvcmRcbiAqICAgICBjb3VudHMpLCBjdXN0b21lciB0eXBlLCBhbmQgb3duZXJfaWQgKHRoZSBwbGF0Zm9ybSBvd25lcnNoaXAgbG9va3VwIFx1MjAxNFxuICogICAgIHJlbmRlcnMgYXMgYVxuICogICAgIHJlY29yZC1waWNrZXIgZHJvcGRvd24pO1xuICogICBcdTIwMjIgdGhlIHZpc3VhbGl6YXRpb24gaXMgbG9ja2VkIHRvIGdyaWQgKHNpbmdsZS1lbnRyeSB3aGl0ZWxpc3QpO1xuICogICBcdTIwMjIgYWR2YW5jZWQgZmlsdGVyaW5nIC8gdmlldyBtYW5hZ2VtZW50IGFyZSBub3Qgb2ZmZXJlZC5cbiAqXG4gKiBGaWx0ZXIgc2VsZWN0aW9ucyBwZXJzaXN0IGFzIGB1Zl8qYCBVUkwgcGFyYW1zIFx1MjAxNCByZWxvYWQtc2FmZSwgc2hhcmVhYmxlLlxuICpcbiAqIE5PVEU6IGBpbnRlcmZhY2VDb25maWcudXNlckZpbHRlcnNgIHJlcXVpcmVzIEBvYmplY3RzdGFjay9zcGVjID4gOS4yLjBcbiAqIChBRFItMDA0NykuIE9uIG9sZGVyIHNwZWNzIGRlZmluZVN0YWNrIHN0cmlwcyB0aGUgdW5rbm93biBrZXlzIGFuZCB0aGVcbiAqIHBhZ2UgcmVuZGVycyB3aXRob3V0IHRoZSBmaWx0ZXIgYmFyIFx1MjAxNCBhIGhhcm1sZXNzIG5vLW9wIHVudGlsIHRoZVxuICogZGVwZW5kZW5jeSBidW1wIGFjdGl2YXRlcyBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFjY291bnRXb3JrYmVuY2hQYWdlOiBQYWdlID0ge1xuICBuYW1lOiAnYWNjb3VudF93b3JrYmVuY2gnLFxuICBsYWJlbDogJ0FjY291bnQgV29ya2JlbmNoJyxcbiAgZGVzY3JpcHRpb246ICdDdXJhdGVkIGFjY291bnQgbGlzdCBmb3IgdGhlIHNhbGVzIHRlYW06IHF1aWNrIGZpbHRlcnMgb25seSwgbm8gdmlldyBtYW5hZ2VtZW50LicsXG4gIHR5cGU6ICdsaXN0JyxcbiAgb2JqZWN0OiAnY3JtX2FjY291bnQnLFxuICBraW5kOiAnZnVsbCcsXG4gIHRlbXBsYXRlOiAnZGVmYXVsdCcsXG4gIGlzRGVmYXVsdDogZmFsc2UsXG4gIC8vIEludGVyZmFjZSBwYWdlcyBjYXJyeSBubyByZWdpb25zIFx1MjAxNCB0aGUgbGlzdCBzdXJmYWNlIGlzIGdlbmVyYXRlZCBmcm9tXG4gIC8vIGBpbnRlcmZhY2VDb25maWdgIChBRFItMDA0NyksIG5vdCBjb21wb3NlZCBmcm9tIGNvbXBvbmVudHMuXG4gIHJlZ2lvbnM6IFtdLFxuICBpbnRlcmZhY2VDb25maWc6IHtcbiAgICBzb3VyY2U6ICdjcm1fYWNjb3VudCcsXG4gICAgc291cmNlVmlldzogJ2FsbF9hY2NvdW50cycsXG5cbiAgICAuLi4oe1xuICAgICAgdXNlckZpbHRlcnM6IHtcbiAgICAgICAgZWxlbWVudDogJ2Ryb3Bkb3duJyxcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ2luZHVzdHJ5Jywgc2hvd0NvdW50OiB0cnVlIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ3R5cGUnIH0sXG4gICAgICAgICAgeyBmaWVsZDogJ293bmVyX2lkJyB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICAgIC8vIHR5cGVkIHZpYSBzcHJlYWQtYXMtYW55IHVudGlsIEBvYmplY3RzdGFjay9zcGVjIHNoaXBzIEFEUi0wMDQ3XG4gICAgICAvLyAoVXNlckZpbHRlcnNTY2hlbWEgaXMgaW4gZnJhbWV3b3JrIG1haW4sID4gOS4yLjApXG4gICAgfSBhcyBhbnkpLFxuXG4gICAgYXBwZWFyYW5jZToge1xuICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgYWxsb3dlZFZpc3VhbGl6YXRpb25zOiBbJ2dyaWQnXSxcbiAgICB9LFxuXG4gICAgdXNlckFjdGlvbnM6IHtcbiAgICAgIHNvcnQ6IHRydWUsXG4gICAgICBzZWFyY2g6IHRydWUsXG4gICAgICBmaWx0ZXI6IGZhbHNlLFxuICAgICAgcm93SGVpZ2h0OiBmYWxzZSxcbiAgICAgIGFkZFJlY29yZEZvcm06IGZhbHNlLFxuICAgIH0sXG5cbiAgICBzaG93UmVjb3JkQ291bnQ6IHRydWUsXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXMvaG9tZS5wYWdlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL2hvbWUucGFnZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUGFnZSwgUGFnZUNvbXBvbmVudCwgVmlldyB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL3VpJztcbmltcG9ydCB7IEV2ZW50Vmlld3MgfSBmcm9tICcuLi92aWV3cy9ldmVudC52aWV3JztcbmltcG9ydCB7IExlYWRWaWV3cyB9IGZyb20gJy4uL3ZpZXdzL2xlYWQudmlldyc7XG5pbXBvcnQgeyBPcHBvcnR1bml0eVZpZXdzIH0gZnJvbSAnLi4vdmlld3Mvb3Bwb3J0dW5pdHkudmlldyc7XG5pbXBvcnQgeyBUYXNrVmlld3MgfSBmcm9tICcuLi92aWV3cy90YXNrLnZpZXcnO1xuXG4vKipcbiAqIEVtYmVkIG9uZSBvZiBhbiBvYmplY3QncyBPV04gc2F2ZWQgbGlzdCB2aWV3cyBpbiBhIHBhZ2UgcmVnaW9uLlxuICpcbiAqIFRoZSBob21lIHRhYnMgdXNlZCB0byBob2xkIGEgYmFyZSBgeyB0eXBlOiAncGFnZTpzZWN0aW9uJywgcHJvcGVydGllczoge30gfWBcbiAqIGVhY2gsIHdoaWNoIHJlbmRlcnMgYW4gZW1wdHkgYDxzZWN0aW9uPmAgXHUyMDE0IHRocmVlIHRhYiBuYW1lcyBwcm9taXNpbmcgY29udGVudFxuICogb3ZlciB0aHJlZSBibGFuayBwYW5lbHMuIFNhbWUgbGVzc29uIGFzIHRoZSBgcmVjb3JkOmhpZ2hsaWdodHNgIGNhcmQgYmVsb3c6XG4gKiBhIGNvbXBvbmVudCB3aXRoIG5vIGJpbmRpbmcgcmVuZGVycyBub3RoaW5nLCBzaWxlbnRseS5cbiAqXG4gKiBgbGlzdC12aWV3YCBpcyB0aGUgYmxvY2sgdGhhdCByZW5kZXJzIGFuIG9iamVjdCBsaXN0IGluc2lkZSBhIHBhZ2UgKGl0IGlzIGluXG4gKiB0aGUgcGxhdGZvcm0ncyBwdWJsaWMgYmxvY2sgY29udHJhY3QsIEFEUi0wMDgwKSwgYW5kIGl0IHRha2VzIGl0cyBjb2x1bW5zIC9cbiAqIGZpbHRlciAvIHNvcnQgaW5saW5lIFx1MjAxNCB0aGVyZSBpcyBubyB3YXkgZm9yIGEgcGFnZSBjb21wb25lbnQgdG8gbmFtZSBhIHNhdmVkXG4gKiB2aWV3LCBzbyB0aG9zZSB0aHJlZSBrZXlzIGFyZSBSRUFEIE9GRiB0aGUgc2F2ZWQgdmlldyBoZXJlIHJhdGhlciB0aGFuXG4gKiByZXR5cGVkLiBUaGF0IGlzIHRoZSBzYW1lIGlyb24gcnVsZSBgYWNjb3VudF93b3JrYmVuY2gucGFnZS50c2Agc3RhdGVzIGZvclxuICogaW50ZXJmYWNlIHBhZ2VzOiBjb2x1bW5zLCBiYXNlIGZpbHRlciBhbmQgc29ydCBhcmUgaW5oZXJpdGVkLCBuZXZlciByZXN0YXRlZC5cbiAqIFJldHlwaW5nIHRoZW0gd291bGQgaGF2ZSBjcmVhdGVkIGEgc2Vjb25kIGRlZmluaXRpb24gb2YgXCJteSBsZWFkc1wiIHRoYXRcbiAqIGRyaWZ0cyBmcm9tIGBzcmMvc2FsZXMvdmlld3MvbGVhZC52aWV3LnRzYCB0aGUgZmlyc3QgdGltZSBlaXRoZXIgc2lkZSBpcyBlZGl0ZWQuXG4gKlxuICogYHtjdXJyZW50X3VzZXJfaWR9YCBpbiBhIHNhdmVkIHZpZXcncyBmaWx0ZXIgcmVzb2x2ZXMgb24gdGhpcyBwYXRoICh0aGVcbiAqIE9iamVjdFFMIHJlYWQgcGF0aCBydW5zIGByZXNvbHZlRmlsdGVyVG9rZW5zKClgIHNpbmNlIDE3LjAuMC1yYy4wKSwgc29cbiAqIFwibWluZVwiIHJlYWxseSBkb2VzIG1lYW4gbWluZSBoZXJlIFx1MjAxNCBtZWFzdXJlZCB0YWIgYnkgdGFiIGluIHRoZSBicm93c2VyLCBzZWVcbiAqIHRoZSBQUi4gVGhlIG5hdidzIE15IFdvcmsgZ3JvdXAgcmVhY2hlcyB0aGUgU0FNRSB2aWV3cyBieSBuYW1lXG4gKiAoYHNyYy9zYWxlcy9hcHBzL2NybS5hcHAudHNgKTsgdGhlc2UgdGFicyBhcmUgdGhlIGxhbmRpbmctcGFnZSBzaG9ydGN1dCB0byB0aGVtLlxuICovXG5jb25zdCBlbWJlZGRlZExpc3RWaWV3ID0gKGlkOiBzdHJpbmcsIG9iamVjdE5hbWU6IHN0cmluZywgdmlld3M6IFZpZXcsIHZpZXdLZXk6IHN0cmluZyk6IFBhZ2VDb21wb25lbnQgPT4ge1xuICBjb25zdCB2aWV3ID0gdmlld3MubGlzdFZpZXdzPy5bdmlld0tleV07XG4gIC8vIExvdWQsIGF0IGJ1aWxkIHRpbWU6IGEgcmVuYW1lZCBvciBkZWxldGVkIHZpZXcgbXVzdCBub3QgZGVncmFkZSBiYWNrIGludG9cbiAgLy8gYSBibGFuayB0YWIgXHUyMDE0IHRoYXQgaXMgdGhlIGRlZmVjdCB0aGlzIHdob2xlIGNvbXBvbmVudCByZXBsYWNlcy5cbiAgaWYgKCF2aWV3KSB0aHJvdyBuZXcgRXJyb3IoYGhvbWUucGFnZS50czogbm8gc2F2ZWQgdmlldyBcIiR7dmlld0tleX1cIiBvbiAke29iamVjdE5hbWV9YCk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ2xpc3QtdmlldycsXG4gICAgaWQsXG4gICAgbGFiZWw6IHZpZXcubGFiZWwsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgb2JqZWN0TmFtZSxcbiAgICAgIHZpZXdUeXBlOiAnZ3JpZCcsXG4gICAgICBjb2x1bW5zOiB2aWV3LmNvbHVtbnMsXG4gICAgICBmaWx0ZXI6IHZpZXcuZmlsdGVyLFxuICAgICAgc29ydDogdmlldy5zb3J0LFxuICAgIH0sXG4gIH07XG59O1xuXG4vKipcbiAqIFNhbGVzIEhvbWUgUGFnZVxuICpcbiAqIERlbW9uc3RyYXRlcyBhIGhvbWUgcGFnZSBsYXlvdXQgd2l0aCBkYXNoYm9hcmRzIGFuZCBxdWljayBhY2Nlc3Mgd2lkZ2V0cy5cbiAqIFNpbWlsYXIgdG8gU2FsZXNmb3JjZSBMaWdodG5pbmcgSG9tZSBQYWdlLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBEYXNoYm9hcmQtc3R5bGUgbGF5b3V0XG4gKiAtIE11bHRpcGxlIGNvbXBvbmVudCByZWdpb25zXG4gKiAtIEdsb2JhbCBzZWFyY2ggYW5kIG5vdGlmaWNhdGlvbnNcbiAqIC0gUXVpY2sgYWN0aW9uIGNhcmRzXG4gKi9cbmV4cG9ydCBjb25zdCBTYWxlc0hvbWVQYWdlOiBQYWdlID0ge1xuICBuYW1lOiAnc2FsZXNfaG9tZV9wYWdlJyxcbiAgbGFiZWw6ICdTYWxlcyBIb21lJyxcbiAgZGVzY3JpcHRpb246ICdTYWxlcyB0ZWFtIGhvbWUgcGFnZSB3aXRoIGtleSBtZXRyaWNzIGFuZCBxdWljayBhY3Rpb25zJyxcbiAgXG4gIHR5cGU6ICdob21lJyxcbiAgXG4gIHRlbXBsYXRlOiAndGhyZWUtY29sdW1uJyxcbiAga2luZDogJ2Z1bGwnLCAgXG4gIHZhcmlhYmxlczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdzZWxlY3RlZFBlcmlvZCcsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogJ3RoaXNfbW9udGgnLFxuICAgIH0sXG4gIF0sXG4gIFxuICByZWdpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ2hlYWRlcicsXG4gICAgICB3aWR0aDogJ2Z1bGwnLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BhZ2U6aGVhZGVyJyxcbiAgICAgICAgICBpZDogJ2hvbWVfaGVhZGVyJyxcbiAgICAgICAgICBsYWJlbDogJ1NhbGVzIEhvbWUgSGVhZGVyJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB0aXRsZTogJ1NhbGVzIERhc2hib2FyZCcsXG4gICAgICAgICAgICAvLyBXYXMgYFdlbGNvbWUgYmFjaywge2N1cnJlbnRfdXNlci5maXJzdF9uYW1lfWAsIHdoaWNoIHJlbmRlcmVkIGFzXG4gICAgICAgICAgICAvLyBcIldlbGNvbWUgYmFjaywgXCIgXHUyMDE0IHRoZSBuYW1lIHdhcyBuZXZlciBnb2luZyB0byBhcnJpdmUsIGJlY2F1c2VcbiAgICAgICAgICAgIC8vIHRoYXQgb25lIHN0cmluZyBtaXhlcyB0aHJlZSB2b2NhYnVsYXJpZXMgdGhhdCBkbyBub3QgY29tcG9zZTpcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgMS4gYHN1YnRpdGxlYCBpcyBhbiBgSTE4bkxhYmVsYCAoYENvbXBvbmVudFByb3BzTWFwYCxcbiAgICAgICAgICAgIC8vICAgICBgQG9iamVjdHN0YWNrL3NwZWMvdWlgKSBcdTIwMTQgYSBkaXNwbGF5IHN0cmluZyBvciBhbiBpbmxpbmVcbiAgICAgICAgICAgIC8vICAgICBsb2NhbGUgbWFwLCByZXNvbHZlZCBieSBgcmVzb2x2ZUkxOG5MYWJlbGAuIFRoZSBmaWVsZCBoYXMgbm9cbiAgICAgICAgICAgIC8vICAgICB0b2tlbiBwYXNzIGFuZCBubyBleHByZXNzaW9uIHBhc3Mgb2YgaXRzIG93bi5cbiAgICAgICAgICAgIC8vICAyLiBCcmFjZXMgRE8gcmVzb2x2ZSBpbiBhIHBhZ2UgaGVhZGVyLCBidXQgdGhlIHZvY2FidWxhcnkgaXMgdGhlXG4gICAgICAgICAgICAvLyAgICAgQk9VTkQgUkVDT1JEJ3Mgb3duIGZpZWxkcyBcdTIwMTQgYGNhc2VfZGV0YWlsLnBhZ2UudHNgIHJlY29yZHMgdGhlXG4gICAgICAgICAgICAvLyAgICAgbWVhc3VyZW1lbnQsIHdoZXJlIGB7YWNjb3VudH1gIG1hdGNoZWQgbm8gZmllbGQgYW5kIHRoZVxuICAgICAgICAgICAgLy8gICAgIHN1YnRpdGxlIHJlbmRlcmVkIGJsYW5rIHVudGlsIGl0IHdhcyBzcGVsbGVkIGB7Y3JtX2FjY291bnR9YC5cbiAgICAgICAgICAgIC8vICAgICBBIGB0eXBlOiAnaG9tZSdgIHBhZ2UgaGFzIG5vIHJlY29yZCwgc28gbm8gYnJhY2UgdG9rZW4gY2FuXG4gICAgICAgICAgICAvLyAgICAgZXZlciByZXNvbHZlIGhlcmUuXG4gICAgICAgICAgICAvLyAgMy4gYGN1cnJlbnRfdXNlci5maXJzdF9uYW1lYCBpcyBhIENFTCBwYXRoLCBhbmQgQ0VMIGlzIHdyaXR0ZW5cbiAgICAgICAgICAgIC8vICAgICBiYXJlLCBuZXZlciBpbnNpZGUgYHtcdTIwMjZ9YC4gVGhlIG9uZSByZXNvbHZhYmxlIGJyYWNlIHRva2VuIGluXG4gICAgICAgICAgICAvLyAgICAgdGhlIGZpbHRlciB2b2NhYnVsYXJ5IGlzIGB7Y3VycmVudF91c2VyX2lkfWAgb24gaXRzIG93bi5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBBIGdyZWV0aW5nIHRoYXQgbmFtZXMgdGhlIHVzZXIgaXMgbm90IGV4cHJlc3NpYmxlIG9uIGFcbiAgICAgICAgICAgIC8vIHRyYW5zbGF0YWJsZSBsYWJlbCwgc28gdGhlIGxhYmVsIG5vdyBzYXlzIHRoZSBwYXJ0IHRoYXQgaXMgdHJ1ZVxuICAgICAgICAgICAgLy8gaW4gZXZlcnkgbG9jYWxlIGFuZCB0aGUgZm91ciBidW5kbGVzIGNhcnJ5IHRoZSB0cmFuc2xhdGlvbnNcbiAgICAgICAgICAgIC8vIChgcGFnZXMuc2FsZXNfaG9tZV9wYWdlLnN1YnRpdGxlYCkuIFBlcnNvbmFsaXNpbmcgaXQgd291bGQgbmVlZCBhXG4gICAgICAgICAgICAvLyBjb21wb25lbnQgdGhhdCB0YWtlcyB1c2VyIGRhdGEgXHUyMDE0IG5vIHNoaXBwZWQgY29tcG9uZW50IGRvZXNcbiAgICAgICAgICAgIC8vIChgdXNlcjpwcm9maWxlYCBhbmQgaXRzIG5laWdoYm91cnMgYXJlIGBlbXB0eVByb3BzYCByb3dzKSwgc29cbiAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzdGF0aWMgZ3JlZXRpbmcgcmF0aGVyIHRoYW4gYSB3aWRlbmVkIGFjY2VwdCBzdXJmYWNlLlxuICAgICAgICAgICAgc3VidGl0bGU6ICdXZWxjb21lIGJhY2snLFxuICAgICAgICAgICAgLy8gYGljb25gIHJlbW92ZWQgZnJvbSBgcGFnZTpoZWFkZXJgIGluIEBvYmplY3RzdGFjay9zcGVjIDE3LjAuMFxuICAgICAgICAgICAgLy8gKCM2OTQ2LCBBRFItMDA4NyBEMikgXHUyMDE0IGRlbGV0ZWQsIG5vdCByZW5hbWVkLiBTZWUgdGhlIGZ1bGwgbm90ZSBvblxuICAgICAgICAgICAgLy8gYGFjY291bnRfZGV0YWlsLnBhZ2UudHNgOyBub3RoaW5nIGV2ZXIgZHJldyBpdC5cbiAgICAgICAgICAgIC8vIGBicmVhZGNydW1iYCByZXRpcmVkIGZyb20gYHBhZ2U6aGVhZGVyYCBpbiBAb2JqZWN0c3RhY2svc3BlYyAxNy42LjBcbiAgICAgICAgICAgIC8vICgjMjA3ODUsIGBwYWdlLWhlYWRlci1icmVhZGNydW1iLXJlbW92ZWRgKSBcdTIwMTQgZGVsZXRlZDogbm8gcmVuZGVyZXJcbiAgICAgICAgICAgIC8vIGV2ZXIgZHJldyBhIHRyYWlsIGZvciBpdDsgdGhlIGFwcCBzaGVsbCdzIG93biB0cmFpbCBpcyB1bmNoYW5nZWQuXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBcbiAgICB7XG4gICAgICBuYW1lOiAnbGVmdF9zaWRlYmFyJyxcbiAgICAgIHdpZHRoOiAnc21hbGwnLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BhZ2U6Y2FyZCcsXG4gICAgICAgICAgaWQ6ICdxdWlja19jcmVhdGUnLFxuICAgICAgICAgIGxhYmVsOiAnUXVpY2sgQ3JlYXRlJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB0aXRsZTogJ1F1aWNrIENyZWF0ZScsXG4gICAgICAgICAgICBib3JkZXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnbmF2Om1lbnUnLFxuICAgICAgICAgICAgICAgIGlkOiAnY3JlYXRlX21lbnUnLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICAvLyBUaGVyZSBpcyBubyBgUmVjZW50IEl0ZW1zYCBjYXJkIGhlcmUgYW55IG1vcmUsIGFuZCByZS1hZGRpbmcgb25lXG4gICAgICAgIC8vIG5lZWRzIGEgZGF0YSBzb3VyY2UgdGhhdCBkb2VzIG5vdCBleGlzdCB5ZXQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEl0IHNoaXBwZWQgYXMgYSBgcGFnZTpjYXJkYCB3aXRoIGEgdGl0bGUgYW5kIG5vIGJvZHk6IGEgYm9yZGVyZWQgYm94XG4gICAgICAgIC8vIHdpdGggdGhlIHdvcmRzIFwiUmVjZW50IEl0ZW1zXCIgYW5kIG5vdGhpbmcgdW5kZXIgdGhlbSwgb24gdGhlIGxhbmRpbmdcbiAgICAgICAgLy8gcGFnZSBvZiBldmVyeSBgc2FsZXNfcmVwYCAvIGBzYWxlc19tYW5hZ2VyYC4gXCJSZWNlbnRcIiBpcyBwZXItdXNlclxuICAgICAgICAvLyBhY2Nlc3MgaGlzdG9yeSBhY3Jvc3Mgb2JqZWN0cywgYW5kIHRoZSBwbGF0Zm9ybSBwdWJsaXNoZXMgbm8gc291cmNlXG4gICAgICAgIC8vIGZvciBpdCBvbiAxNy4xLjAgXHUyMDE0IGBDb21wb25lbnRQcm9wc01hcGAgaGFzIG5vIHJlY2VudC1yZWNvcmRzXG4gICAgICAgIC8vIGNvbXBvbmVudCwgYW5kIHRoZSB0d28gdGhhdCBzb3VuZCBsaWtlIG9uZSAoYHJlY29yZDphY3Rpdml0eWAsXG4gICAgICAgIC8vIGByZWNvcmQ6aGlzdG9yeWApIGJvdGggcmVhZCB0aGUgcGFnZSdzIEJPVU5EIFJFQ09SRCwgd2hpY2ggYSBob21lXG4gICAgICAgIC8vIHBhZ2UgZG9lcyBub3QgaGF2ZS4gQmluZGluZyBpdCB0byBvbmUgb2JqZWN0J3MgbGlzdCB2aWV3IGluc3RlYWRcbiAgICAgICAgLy8gd291bGQgaGF2ZSBtYWRlIHRoZSB0aXRsZSBsaWUsIHdoaWNoIGlzIHRoZSBkZWZlY3QgIzc3MSBleGlzdHMgdG9cbiAgICAgICAgLy8gcHJldmVudCwgc28gdGhlIGNhcmQgaXMgcmVtb3ZlZCByYXRoZXIgdGhhbiBmaWxsZWQgd2l0aCBzb21ldGhpbmdcbiAgICAgICAgLy8gdGhhdCBpcyBub3QgcmVjZW5jeS4gUmVjb3JkZWQgYXMgIzEyMTc7IHdoZW4gdGhlIHBsYXRmb3JtIHNoaXBzIGFcbiAgICAgICAgLy8gcmVjZW50LXJlY29yZHMgc291cmNlLCB0aGlzIGlzIHdoZXJlIHRoZSBjYXJkIGdvZXMgYmFjay5cbiAgICAgIF0sXG4gICAgfSxcbiAgICBcbiAgICB7XG4gICAgICBuYW1lOiAnbWFpbicsXG4gICAgICB3aWR0aDogJ2xhcmdlJyxcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwYWdlOmNhcmQnLFxuICAgICAgICAgIGlkOiAna2V5X21ldHJpY3MnLFxuICAgICAgICAgIGxhYmVsOiAnS2V5IE1ldHJpY3MnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRpdGxlOiAnS2V5IFBlcmZvcm1hbmNlIEluZGljYXRvcnMnLFxuICAgICAgICAgICAgYm9yZGVyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgLy8gYHJlY29yZDpoaWdobGlnaHRzYCBuZWVkcyBhIGJvdW5kIHJlY29yZCBhbmQgcmVhbCBmaWVsZHM7IGEgaG9tZVxuICAgICAgICAgICAgLy8gcGFnZSBoYXMgbmVpdGhlciwgYW5kIHRoZSBmb3VyIG5hbWVzIGl0IGxpc3RlZCAodG90YWxfcmV2ZW51ZSxcbiAgICAgICAgICAgIC8vIGRlYWxzX3dvbiwgXHUyMDI2KSBleGlzdCBvbiBubyBvYmplY3QgXHUyMDE0IHRoZSBjYXJkIHJlbmRlcmVkIGJsYW5rLlxuICAgICAgICAgICAgLy8gYG9iamVjdC1tZXRyaWNgIHdpZGdldHMgYWdncmVnYXRlIGxpdmUgZGF0YSBpbnN0ZWFkLlxuICAgICAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QtbWV0cmljJyxcbiAgICAgICAgICAgICAgICBpZDogJ2twaV9yZXZlbnVlX3dvbicsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICAgICBsYWJlbDogJ1JldmVudWUgKFdvbiknLFxuICAgICAgICAgICAgICAgICAgaWNvbjogJ2RvbGxhci1zaWduJyxcbiAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZTogeyBmaWVsZDogJ2Ftb3VudCcsIGZ1bmN0aW9uOiAnc3VtJyB9LFxuICAgICAgICAgICAgICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ3N0YWdlJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ2Nsb3NlZF93b24nIH1dLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2JqZWN0LW1ldHJpYycsXG4gICAgICAgICAgICAgICAgaWQ6ICdrcGlfZGVhbHNfd29uJyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiAnRGVhbHMgV29uJyxcbiAgICAgICAgICAgICAgICAgIGljb246ICd0cm9waHknLFxuICAgICAgICAgICAgICAgICAgYWdncmVnYXRlOiB7IGZpZWxkOiAnaWQnLCBmdW5jdGlvbjogJ2NvdW50JyB9LFxuICAgICAgICAgICAgICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ3N0YWdlJywgb3BlcmF0b3I6ICdlcXVhbHMnLCB2YWx1ZTogJ2Nsb3NlZF93b24nIH1dLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2JqZWN0LW1ldHJpYycsXG4gICAgICAgICAgICAgICAgaWQ6ICdrcGlfcGlwZWxpbmVfdmFsdWUnLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgICAgICAgICAgICAgbGFiZWw6ICdQaXBlbGluZSBWYWx1ZScsXG4gICAgICAgICAgICAgICAgICBpY29uOiAnYnJpZWZjYXNlJyxcbiAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZTogeyBmaWVsZDogJ2Ftb3VudCcsIGZ1bmN0aW9uOiAnc3VtJyB9LFxuICAgICAgICAgICAgICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ3N0YWdlJywgb3BlcmF0b3I6ICdub3RfaW4nLCB2YWx1ZTogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfV0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdvYmplY3QtbWV0cmljJyxcbiAgICAgICAgICAgICAgICBpZDogJ2twaV9vcGVuX2xlYWRzJyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2xlYWQnLFxuICAgICAgICAgICAgICAgICAgbGFiZWw6ICdPcGVuIExlYWRzJyxcbiAgICAgICAgICAgICAgICAgIGljb246ICd1c2VyLXBsdXMnLFxuICAgICAgICAgICAgICAgICAgYWdncmVnYXRlOiB7IGZpZWxkOiAnaWQnLCBmdW5jdGlvbjogJ2NvdW50JyB9LFxuICAgICAgICAgICAgICAgICAgZmlsdGVyOiBbeyBmaWVsZDogJ2lzX2NvbnZlcnRlZCcsIG9wZXJhdG9yOiAnZXF1YWxzJywgdmFsdWU6IGZhbHNlIH1dLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncGFnZTp0YWJzJyxcbiAgICAgICAgICBpZDogJ2hvbWVfdGFicycsXG4gICAgICAgICAgbGFiZWw6ICdIb21lIFRhYnMnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogYHR5cGVgIFx1MjE5MiBgdGFiU3R5bGVgIChAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjAsICM2Nzc2LCBBRFItMDA4N1xuICAgICAgICAgICAgICogRDIpLiBUaGUgY29uY2VwdCBhbmQgdGhlIHZhbHVlIHZvY2FidWxhcnkgKGBsaW5lYCB8IGBjYXJkYCB8XG4gICAgICAgICAgICAgKiBgcGlsbGApIGFyZSB1bmNoYW5nZWQ7IG9ubHkgdGhlIHNwZWxsaW5nIG1vdmVkLCBiZWNhdXNlIGEgcHJvcHNcbiAgICAgICAgICAgICAqIGtleSBuYW1lZCBgdHlwZWAgY29sbGlkZXMgd2l0aCB0aGUgcGFnZSBjb21wb25lbnQncyBvd24gZGlzcGF0Y2hcbiAgICAgICAgICAgICAqIGtleTogb2JqZWN0dWkncyBgU2NoZW1hUmVuZGVyZXJgIGhvaXN0cyBgcHJvcGVydGllc2Agb250byB0aGUgbm9kZVxuICAgICAgICAgICAgICogYnV0IGRlbGliZXJhdGVseSBza2lwcyBgdHlwZWAgYW5kIGBpZGAgKG9yIHRoZSBpbm5lciB2YWx1ZSB3b3VsZFxuICAgICAgICAgICAgICogc2hhZG93IHdoaWNoIHJlbmRlcmVyIHRvIGRpc3BhdGNoIHRvKSwgYW5kIGBzZHVpLXBhcnNlcmAgbGlzdHNcbiAgICAgICAgICAgICAqIGB0eXBlYCBpbiBgQkFTRV9QUk9QU2AsIHNvIGEgbWFuaWZlc3QgaW5wdXQgYnkgdGhhdCBuYW1lIGlzIG5ldmVyXG4gICAgICAgICAgICAgKiB2YWxpZGF0ZWQgYXQgYWxsLlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIFJlbmFtaW5nIGlzIGJlaGF2aW91ci1wcmVzZXJ2aW5nIG9uIHRoaXMgcGFnZSBhbmQgb24gdGhlIHRocmVlXG4gICAgICAgICAgICAgKiByZWNvcmQgcGFnZXM6IHRoZSByZW5kZXJlciByZXNvbHZlc1xuICAgICAgICAgICAgICogYHNjaGVtYT8ucHJvcGVydGllcz8udHlwZSB8fCBzY2hlbWE/LnRhYlN0eWxlIHx8ICdsaW5lJ2AsIHNvIGl0XG4gICAgICAgICAgICAgKiBoYXMgYmVlbiBob25vdXJpbmcgdGhlIHJldGlyZWQgc3BlbGxpbmcgYXMgYSBiYWNrLWNvbXBhdCByZWFkIGFsbFxuICAgICAgICAgICAgICogYWxvbmcgYW5kIHBpY2tzIHVwIHRoZSBjYW5vbmljYWwgb25lIHRocm91Z2ggdGhlIHNhbWUgaG9pc3QuXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIHRhYlN0eWxlOiAnY2FyZCcsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3RvcCcsXG4gICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdNeSBMZWFkcycsXG4gICAgICAgICAgICAgICAgaWNvbjogJ3VzZXItcGx1cycsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IFtlbWJlZGRlZExpc3RWaWV3KCdob21lX215X2xlYWRzJywgJ2NybV9sZWFkJywgTGVhZFZpZXdzLCAnbXlfbGVhZHMnKV0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBXYXMgXCJNeSBPcHBvcnR1bml0aWVzXCIsIHdoaWNoIHByb21pc2VzIGV2ZXJ5IGRlYWwgSSBvd247IHRoZVxuICAgICAgICAgICAgICAgIC8vIHZpZXcgYmVoaW5kIGl0IGlzIHRoZSBvcGVuLXBpcGVsaW5lIG9uZSAodGhlIG5hdidzIE15IFdvcmsgPlxuICAgICAgICAgICAgICAgIC8vIE15IERlYWxzIG9wZW5zIHRoZSBzYW1lIGBteV9vcGVuX2RlYWxzYCkuIFRoZSB0YWIgbmFtZSBub3dcbiAgICAgICAgICAgICAgICAvLyBzYXlzIHdoYXQgdGhlIHBhbmVsIHNob3dzLlxuICAgICAgICAgICAgICAgIGxhYmVsOiAnTXkgT3BlbiBEZWFscycsXG4gICAgICAgICAgICAgICAgaWNvbjogJ2RvbGxhci1zaWduJyxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbjogW2VtYmVkZGVkTGlzdFZpZXcoJ2hvbWVfbXlfZGVhbHMnLCAnY3JtX29wcG9ydHVuaXR5JywgT3Bwb3J0dW5pdHlWaWV3cywgJ215X29wZW5fZGVhbHMnKV0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBTYW1lIGNvcnJlY3Rpb246IGBteV9vcGVuX3Rhc2tzYCBleGNsdWRlcyBjb21wbGV0ZWQgdGFza3MuXG4gICAgICAgICAgICAgICAgbGFiZWw6ICdNeSBPcGVuIFRhc2tzJyxcbiAgICAgICAgICAgICAgICBpY29uOiAnbGlzdC1jaGVja3MnLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbZW1iZWRkZWRMaXN0VmlldygnaG9tZV9teV90YXNrcycsICdjcm1fdGFzaycsIFRhc2tWaWV3cywgJ215X29wZW5fdGFza3MnKV0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAgXG4gICAge1xuICAgICAgbmFtZTogJ3JpZ2h0X3NpZGViYXInLFxuICAgICAgd2lkdGg6ICdtZWRpdW0nLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3BhZ2U6Y2FyZCcsXG4gICAgICAgICAgaWQ6ICdhaV9icmllZmluZycsXG4gICAgICAgICAgLy8gVGhlIGFzc2lzdGFudCBpcyB0aGUgUExBVEZPUk0ncyAoYGFza2ApLCBub3QgYW4gYXBwLW93bmVkIHBlcnNvbmE6XG4gICAgICAgICAgLy8gSG90Q1JNIGNvbnRyaWJ1dGVzIHNraWxscywgdGhlIGFnZW50IGxpdmVzIGluIHRoZSBjbG91ZCBzaWRlXG4gICAgICAgICAgLy8gKG1haW50YWluZXIgcnVsaW5nIG9uICM2MTIsIDIwMjYtMDgtMDQpLiBUaGUgcmV0aXJlZCBgc2FsZXNfY29waWxvdGBcbiAgICAgICAgICAvLyBhZ2VudCAoIzUxMiwgQURSLTAwNjMgXHUwMEE3MikgbXVzdCBub3QgYmUgbmFtZWQgaW4gbGl2ZSBVSSBjb3B5IFx1MjAxNCBhbmRcbiAgICAgICAgICAvLyB0aGUgZW50cnkgcG9pbnQgaXMgdGhlIGFzc2lzdGFudCBwYW5lbCB0aGUgcGxhdGZvcm0gb3BlbnMgZnJvbSB0aGVcbiAgICAgICAgICAvLyByaWdodCBlZGdlIG9mIGV2ZXJ5IHBhZ2UsIHdoaWNoIGlzIHRoZSB3b3JkaW5nXG4gICAgICAgICAgLy8gYGNvbnRlbnQvZG9jcy9haS1jb3BpbG90L2luZGV4Lm1keGAgbGFuZGVkIGluICM2MTEvUFIgIzEwMDEuXG4gICAgICAgICAgbGFiZWw6ICdUb2RheSB3aXRoIHRoZSBBSSBBc3Npc3RhbnQnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRpdGxlOiAnQXNrIHRoZSBBSSBBc3Npc3RhbnQnLFxuICAgICAgICAgICAgYm9yZGVyZWQ6IHRydWUsXG4gICAgICAgICAgICAvLyBUaGUgcGFyYWdyYXBoIGlzIGFuIGBlbGVtZW50OnRleHRgIGNoaWxkICgjMTU4MSkuIEl0IHVzZWQgdG8gYmVcbiAgICAgICAgICAgIC8vIGBwcm9wZXJ0aWVzLmRlc2NyaXB0aW9uYCwgd2hpY2ggYHBhZ2U6Y2FyZGAgZG9lcyBub3QgZGVjbGFyZSwgc29cbiAgICAgICAgICAgIC8vIHRoZSBjYXJkIHJlbmRlcmVkIGFzIGEgdGl0bGUgb3ZlciBub3RoaW5nLiBgY29udGVudGAgaXMgbm90IG9uXG4gICAgICAgICAgICAvLyB0aGUgbG9jYWxlIHBhY2sncyBwYWdlLWNvbXBvbmVudCBmYWNlLCBzbyB0aGUgZm91ciBsYW5ndWFnZXNcbiAgICAgICAgICAgIC8vIGxpdmUgaGVyZSBhcyBhbiBpbmxpbmUgbG9jYWxlIG1hcCwgdGhlIHNwZWMncyByb3V0ZSBmb3IgcGFnZVxuICAgICAgICAgICAgLy8gcHJvc2UuIFRoZSAjMTAwMiBwZXJzb25hIGd1YXJkIGluXG4gICAgICAgICAgICAvLyBgdGVzdC9tZXRhZGF0YS1yZWZlcmVuY2VzLnRlc3QudHNgIHJlYWRzIHRoaXMgY2hpbGQuXG4gICAgICAgICAgICBjaGlsZHJlbjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2VsZW1lbnQ6dGV4dCcsXG4gICAgICAgICAgICAgICAgaWQ6ICdhaV9icmllZmluZ190ZXh0JyxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIGVuOiAnT3BlbiB0aGUgYXNzaXN0YW50IHBhbmVsIGZyb20gdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHBhZ2UgYW5kIGFzayBcIndoYXQgc2hvdWxkIEkgZm9jdXMgb24gdG9kYXk/XCIgXHUyMDE0IGl0IHNlZXMgeW91ciBsaXZlIHBpcGVsaW5lLCBzY2hlbWEsIGFuZCBhY2NvdW50cy4nLFxuICAgICAgICAgICAgICAgICAgICAnemgtQ04nOlxuICAgICAgICAgICAgICAgICAgICAgICdcdTRFQ0VcdTk4NzVcdTk3NjJcdTUzRjNcdTRGQTdcdTYyNTNcdTVGMDBcdTUyQTlcdTYyNEJcdTk3NjJcdTY3N0ZcdUZGMENcdThCRTJcdTk1RUVcIlx1NjIxMVx1NEVDQVx1NTkyOVx1NUU5NFx1OEJFNVx1NTE3M1x1NkNFOFx1NEVDMFx1NEU0OFx1RkYxRlwiXHUyMDE0XHUyMDE0XHU1QjgzXHU1M0VGXHU0RUU1XHU1QjlFXHU2NUY2XHU2N0U1XHU3NzBCXHU2MEE4XHU3Njg0XHU5NTAwXHU1NTJFXHU3QkExXHU5MDUzXHUzMDAxXHU2N0I2XHU2Nzg0XHU0RTBFXHU1QkEyXHU2MjM3XHU0RkUxXHU2MDZGXHUzMDAyJyxcbiAgICAgICAgICAgICAgICAgICAgJ2VzLUVTJzpcbiAgICAgICAgICAgICAgICAgICAgICAnQWJyYSBlbCBwYW5lbCBkZWwgYXNpc3RlbnRlIGRlc2RlIGVsIGJvcmRlIGRlcmVjaG8gZGUgbGEgcFx1MDBFMWdpbmEgeSBwcmVndW50ZSBcIlx1MDBCRmVuIHF1XHUwMEU5IGRlYmVyXHUwMEVEYSBjb25jZW50cmFybWUgaG95P1wiIFx1MjAxNCB2ZSBzdSBmbHVqbyBkZSB2ZW50YXMsIGVzcXVlbWEgeSBjdWVudGFzIGVuIHRpZW1wbyByZWFsLicsXG4gICAgICAgICAgICAgICAgICAgICdqYS1KUCc6XG4gICAgICAgICAgICAgICAgICAgICAgJ1x1MzBEQVx1MzBGQ1x1MzBCOFx1NTNGM1x1N0FFRlx1MzA0Qlx1MzA4OVx1MzBBMlx1MzBCN1x1MzBCOVx1MzBCRlx1MzBGM1x1MzBDOFx1MzBEMVx1MzBDRFx1MzBFQlx1MzA5Mlx1OTU4Qlx1MzA0RFx1MzAwMVx1MzAwQ1x1NEVDQVx1NjVFNVx1MzA2Rlx1NEY1NVx1MzA2Qlx1OTZDNlx1NEUyRFx1MzA1OVx1MzA3OVx1MzA0RFx1MzA0Qlx1RkYxRlx1MzAwRFx1MzA2OFx1NUMwQlx1MzA2RFx1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NCBcdTIwMTQgXHUzMEVBXHUzMEEyXHUzMEVCXHUzMEJGXHUzMEE0XHUzMEUwXHUzMDZFXHUzMEQxXHUzMEE0XHUzMEQ3XHUzMEU5XHUzMEE0XHUzMEYzXHUzMDAxXHUzMEI5XHUzMEFEXHUzMEZDXHUzMERFXHUzMDAxXHU1M0Q2XHU1RjE1XHU1MTQ4XHU2MEM1XHU1ODMxXHUzMDkyXHU2MjhBXHU2M0UxXHUzMDU3XHUzMDY2XHUzMDQ0XHUzMDdFXHUzMDU5XHUzMDAyJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwYWdlOmNhcmQnLFxuICAgICAgICAgIGlkOiAndXBjb21pbmdfZXZlbnRzJyxcbiAgICAgICAgICAvLyBXYXMgYENhbGVuZGFyYCAvIFwiVG9kYXkncyBTY2hlZHVsZVwiIG92ZXIgYW4gZW1wdHkgYm9yZGVyZWQgYm94IFx1MjAxNFxuICAgICAgICAgIC8vIHRoZSBjYXJkIGRlY2xhcmVkIG5vIGJvZHksIHNvIHRoZSByZW5kZXJlciBoYWQgbm90aGluZyB0byBkcmF3LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gSXQgaXMgYm91bmQgdG8gYGNybV9ldmVudGAncyBzYXZlZCBgdXBjb21pbmdfZXZlbnRzYCB2aWV3LCByZWFkIG9mZlxuICAgICAgICAgIC8vIHRoZSB2aWV3IGV4YWN0bHkgbGlrZSB0aGUgdGFicyBhYm92ZSwgYW5kIHRoZSBuYW1lIG5vdyBtYXRjaGVzIHdoYXRcbiAgICAgICAgICAvLyB0aGUgcGFuZWwgc2hvd3MuIFwiVG9kYXkncyBTY2hlZHVsZVwiIGlzIE5PVCB3aGF0IGFueSBleGlzdGluZyB2aWV3XG4gICAgICAgICAgLy8gc2F5czogYG15X2V2ZW50c2AgaXMgc2NvcGVkIHRvIHRoZSBjdXJyZW50IHVzZXIgYnV0IGNhcnJpZXMgbm8gZGF0ZVxuICAgICAgICAgIC8vIGZpbHRlciwgbm8gc29ydCBhbmQgbm8gZGF0ZSBjb2x1bW4gKDI3IHNlZWRlZCByb3dzLCBtb3N0bHkgYGhlbGRgXG4gICAgICAgICAgLy8gaW50ZXJhY3Rpb25zIGZyb20gdGhlIHBhc3QpLCB3aGlsZSBgdXBjb21pbmdfZXZlbnRzYCBpc1xuICAgICAgICAgIC8vIGBzdGF0dXM6ICdwbGFubmVkJ2Agc29ydGVkIGJ5IGBzdGFydF9kYXRldGltZWAgYXNjZW5kaW5nIHdpdGggdGhlXG4gICAgICAgICAgLy8gZGF0ZSBvbiB0aGUgcm93LiBOYXJyb3dpbmcgZWl0aGVyIG9uZSB0byB0b2RheSB3b3VsZCBtZWFuIHJldHlwaW5nXG4gICAgICAgICAgLy8gYSBmaWx0ZXIgaW4gdGhpcyBwYWdlIFx1MjAxNCB0aGUgc2Vjb25kIGRlZmluaXRpb24gdGhlIGhlbHBlciBhYm92ZVxuICAgICAgICAgIC8vIGV4aXN0cyB0byBwcmV2ZW50IFx1MjAxNCBzbyB0aGUgdGl0bGUgc2F5cyBcInVwY29taW5nXCIgaW5zdGVhZCBvZlxuICAgICAgICAgIC8vIHByb21pc2luZyBhIGRheSB0aGlzIHBhZ2UgY2Fubm90IGNvbXB1dGUuXG4gICAgICAgICAgbGFiZWw6ICdVcGNvbWluZyBFdmVudHMnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIHRpdGxlOiAnVXBjb21pbmcgRXZlbnRzJyxcbiAgICAgICAgICAgIGJvcmRlcmVkOiB0cnVlLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtlbWJlZGRlZExpc3RWaWV3KCdob21lX3VwY29taW5nX2V2ZW50cycsICdjcm1fZXZlbnQnLCBFdmVudFZpZXdzLCAndXBjb21pbmdfZXZlbnRzJyldLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0sXG4gIF0sXG4gIFxuICBpc0RlZmF1bHQ6IHRydWUsXG4gIFxuICBhcmlhOiB7XG4gICAgYXJpYUxhYmVsOiAnU2FsZXMgSG9tZSBQYWdlJyxcbiAgICBhcmlhRGVzY3JpYmVkQnk6ICdTYWxlcyB0ZWFtIGhvbWUgcGFnZSB3aXRoIG1ldHJpY3MsIGxlYWRzLCBhbmQgcXVpY2sgYWN0aW9ucycsXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXMvYXBwX2xhdW5jaGVyLnBhZ2UudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvcGFnZXMvYXBwX2xhdW5jaGVyLnBhZ2UudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IFBhZ2UgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogQXBwIExhdW5jaGVyIFBhZ2VcbiAqIFxuICogRGVtb25zdHJhdGVzIGFuIGFwcGxpY2F0aW9uIGxhdW5jaGVyIHBhZ2Ugc2ltaWxhciB0byBTYWxlc2ZvcmNlIEFwcCBMYXVuY2hlci5cbiAqIFxuICogRmVhdHVyZXM6XG4gKiAtIEdyaWQtYmFzZWQgYXBwIGljb24gbGF5b3V0XG4gKiAtIEdsb2JhbCBzZWFyY2hcbiAqIC0gUXVpY2sgYWNjZXNzIHRvIGFsbCBhcHBzXG4gKi9cbmV4cG9ydCBjb25zdCBBcHBMYXVuY2hlclBhZ2U6IFBhZ2UgPSB7XG4gIG5hbWU6ICdhcHBfbGF1bmNoZXJfcGFnZScsXG4gIGxhYmVsOiAnQXBwIExhdW5jaGVyJyxcbiAgZGVzY3JpcHRpb246ICdDZW50cmFsIGh1YiBmb3IgYWNjZXNzaW5nIGFsbCBhcHBsaWNhdGlvbnMnLFxuICBcbiAgdHlwZTogJ2FwcCcsXG4gIFxuICB0ZW1wbGF0ZTogJ2NlbnRlcmVkJyxcbiAga2luZDogJ2Z1bGwnLCAgXG4gIHJlZ2lvbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnaGVhZGVyJyxcbiAgICAgIHdpZHRoOiAnZnVsbCcsXG4gICAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2xvYmFsOnNlYXJjaCcsXG4gICAgICAgICAgaWQ6ICdhcHBfc2VhcmNoJyxcbiAgICAgICAgICBsYWJlbDogJ1NlYXJjaCBBcHBzJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBcbiAgICB7XG4gICAgICBuYW1lOiAnbWFpbicsXG4gICAgICB3aWR0aDogJ2xhcmdlJyxcbiAgICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdwYWdlOmhlYWRlcicsXG4gICAgICAgICAgaWQ6ICdsYXVuY2hlcl9oZWFkZXInLFxuICAgICAgICAgIGxhYmVsOiAnQXBwIExhdW5jaGVyIEhlYWRlcicsXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgdGl0bGU6ICdBcHAgTGF1bmNoZXInLFxuICAgICAgICAgICAgc3VidGl0bGU6ICdTZWxlY3QgYW4gYXBwIHRvIGdldCBzdGFydGVkJyxcbiAgICAgICAgICAgIC8vIGBpY29uYCByZW1vdmVkIGZyb20gYHBhZ2U6aGVhZGVyYCBpbiBAb2JqZWN0c3RhY2svc3BlYyAxNy4wLjBcbiAgICAgICAgICAgIC8vICgjNjk0NiwgQURSLTAwODcgRDIpIFx1MjAxNCBkZWxldGVkLCBub3QgcmVuYW1lZC4gU2VlIHRoZSBmdWxsIG5vdGUgb25cbiAgICAgICAgICAgIC8vIGBhY2NvdW50X2RldGFpbC5wYWdlLnRzYDsgbm90aGluZyBldmVyIGRyZXcgaXQuXG4gICAgICAgICAgICAvLyBgYnJlYWRjcnVtYmAgcmV0aXJlZCBmcm9tIGBwYWdlOmhlYWRlcmAgaW4gQG9iamVjdHN0YWNrL3NwZWMgMTcuNi4wXG4gICAgICAgICAgICAvLyAoIzIwNzg1LCBgcGFnZS1oZWFkZXItYnJlYWRjcnVtYi1yZW1vdmVkYCkgXHUyMDE0IGRlbGV0ZWQ6IG5vIHJlbmRlcmVyXG4gICAgICAgICAgICAvLyBldmVyIGRyZXcgYSB0cmFpbCBmb3IgaXQ7IHRoZSBhcHAgc2hlbGwncyBvd24gdHJhaWwgaXMgdW5jaGFuZ2VkLlxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnYXBwOmxhdW5jaGVyJyxcbiAgICAgICAgICBpZDogJ2FwcF9ncmlkJyxcbiAgICAgICAgICBsYWJlbDogJ0FwcGxpY2F0aW9uIEdyaWQnLFxuICAgICAgICAgIHByb3BlcnRpZXM6IHt9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9LFxuICBdLFxuICBcbiAgaXNEZWZhdWx0OiBmYWxzZSxcbiAgXG4gIGFyaWE6IHtcbiAgICBhcmlhTGFiZWw6ICdBcHAgTGF1bmNoZXIgUGFnZScsXG4gICAgYXJpYURlc2NyaWJlZEJ5OiAnQ2VudHJhbCBhcHBsaWNhdGlvbiBsYXVuY2hlciBmb3IgYWNjZXNzaW5nIGFsbCBhcHBzJyxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wYWdlcy91dGlsaXR5X2Jhci5wYWdlLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3BhZ2VzL3V0aWxpdHlfYmFyLnBhZ2UudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IFBhZ2UgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy91aSc7XG5cbi8qKlxuICogVXRpbGl0eSBCYXIgUGFnZVxuICogXG4gKiBEZW1vbnN0cmF0ZXMgYSB1dGlsaXR5IGJhciBwYWdlIGZvciBmbG9hdGluZyBwYW5lbHMgYW5kIHF1aWNrIGFjY2VzcyB0b29scy5cbiAqIFNpbWlsYXIgdG8gU2FsZXNmb3JjZSBMaWdodG5pbmcgVXRpbGl0eSBCYXIuXG4gKiBcbiAqIEZlYXR1cmVzOlxuICogLSBGbG9hdGluZyB1dGlsaXR5IHBhbmVsc1xuICogLSBRdWljayBub3Rlc1xuICogLSBDaGF0L21lc3NhZ2luZ1xuICogLSBOb3RpZmljYXRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBVdGlsaXR5QmFyUGFnZTogUGFnZSA9IHtcbiAgbmFtZTogJ3V0aWxpdHlfYmFyX3BhZ2UnLFxuICBsYWJlbDogJ1V0aWxpdHkgQmFyJyxcbiAgZGVzY3JpcHRpb246ICdRdWljayBhY2Nlc3MgdXRpbGl0eSBiYXIgd2l0aCBmbG9hdGluZyB0b29scycsXG4gIFxuICB0eXBlOiAndXRpbGl0eScsXG4gIFxuICB0ZW1wbGF0ZTogJ3V0aWxpdHktYmFyJyxcbiAga2luZDogJ2Z1bGwnLFxuICByZWdpb25zOiBbXG4gICAge1xuICAgICAgbmFtZTogJ3V0aWxpdGllcycsXG4gICAgICB3aWR0aDogJ2Z1bGwnLFxuICAgICAgY29tcG9uZW50czogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2dsb2JhbDpub3RpZmljYXRpb25zJyxcbiAgICAgICAgICBpZDogJ25vdGlmaWNhdGlvbnNfcGFuZWwnLFxuICAgICAgICAgIGxhYmVsOiAnTm90aWZpY2F0aW9ucycsXG4gICAgICAgICAgcHJvcGVydGllczoge30sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAncGFnZTpjYXJkJyxcbiAgICAgICAgICBpZDogJ3F1aWNrX25vdGVzJyxcbiAgICAgICAgICBsYWJlbDogJ1F1aWNrIE5vdGVzJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgICB0aXRsZTogJ1F1aWNrIE5vdGVzJyxcbiAgICAgICAgICAgIGJvcmRlcmVkOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2xvYmFsOnNlYXJjaCcsXG4gICAgICAgICAgaWQ6ICdxdWlja19zZWFyY2gnLFxuICAgICAgICAgIGxhYmVsOiAnUXVpY2sgU2VhcmNoJyxcbiAgICAgICAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXSxcbiAgXG4gIGlzRGVmYXVsdDogZmFsc2UsXG4gIFxuICBhcmlhOiB7XG4gICAgYXJpYUxhYmVsOiAnVXRpbGl0eSBCYXInLFxuICAgIGFyaWFEZXNjcmliZWRCeTogJ1F1aWNrIGFjY2VzcyB1dGlsaXR5IGJhciB3aXRoIGZsb2F0aW5nIHRvb2xzIGFuZCBub3RpZmljYXRpb25zJyxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBTYWxlcyBlbWFpbC10ZW1wbGF0ZSBiYXJyZWwuXG4gKlxuICogQW4gZW1haWwgdGVtcGxhdGUgbGl2ZXMgd2l0aCB0aGUgb2JqZWN0IGl0cyBgbm90aWZ5YCBub2RlIGlzIGF1dGhvcmVkXG4gKiBhZ2FpbnN0IChBR0VOVFMubWQgbGF5b3V0IHJ1bGUgMyksIHNvIHRoZSBwYWNrYWdlcyB0aGF0IG93biBub3RpZnlpbmcgZmxvd3NcbiAqIGVhY2ggY2FycnkgdGhlaXIgb3duIGRpcmVjdG9yeS4gYF9idW5kbGUudHNgIGlzIHRoZSBzaGFyZWQgc291cmNlIHRoZSBvdGhlclxuICogdHdvIHJlYWQgYWxvbmcgdGhlaXIgZWRnZSBpbnRvIHNhbGVzLlxuICovXG5leHBvcnQgeyBTYWxlc0VtYWlsVGVtcGxhdGVzIH0gZnJvbSAnLi9jcm0uZW1haWwtdGVtcGxhdGUnO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzL2VuLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvZW4udHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZVBhY2sgfSBmcm9tICcuL19idW5kbGUnO1xuXG4vKipcbiAqIEVuZ2xpc2ggKGVuLVVTKSBcdTIwMTQgdGhlIHNhbGVzIHBhY2thZ2UncyBub3RpZmljYXRpb24gdGVtcGxhdGVzLlxuICpcbiAqIFBlci1sb2NhbGUgZmlsZSwgb25lIGxhbmd1YWdlIGVhY2gsIGFzc2VtYmxlZCBpbiBgY3JtLmVtYWlsLXRlbXBsYXRlLnRzYCBcdTIwMTRcbiAqIHRoZSBzYW1lIGNvbnZlbnRpb24gYHNyYy9zYWxlcy90cmFuc2xhdGlvbnMvYCBhbHJlYWR5IGZvbGxvd3MgZm9yIHRoZSBVSVxuICogbG9jYWxlIHBhY2tzLlxuICpcbiAqIEV2ZXJ5IHN0cmluZyBoZXJlIGlzIHRoZSB0ZXh0IGl0cyBgbm90aWZ5YCBub2RlIGFscmVhZHkgc2VudCwgd2l0aCB0aGVcbiAqIGZsb3cncyBge3Zhci5wYXRofWAgaW50ZXJwb2xhdGlvbnMgcmUtZXhwcmVzc2VkIGFzIHRoZSBge3trZXl9fWAgaG9sZXMgdGhlXG4gKiByZW5kZXJlciBmaWxscyBmcm9tIHRoYXQgbm9kZSdzIGB0ZW1wbGF0ZURhdGFgLiBBIGNvbnZlcnNpb24sIG5vdCBhIHJld3JpdGU6XG4gKiBubyBub3RpZmljYXRpb24gc2F5cyBhbnl0aGluZyBuZXcuXG4gKlxuICogXHUyNkEwXHVGRTBGIFJlZ2lzdGVyZWQgdW5kZXIgYGVuLVVTYCwgbm90IGBlbmAgXHUyMDE0IHNlZSB0aGUgbGFkZGVyIG5vdGUgb24gYGJ1bmRsZSgpYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVuOiBFbWFpbFRlbXBsYXRlUGFjayA9IHtcbiAgJ2NybS5hY2NvdW50X2FwcHJvdmVkJzoge1xuICAgIGxhYmVsOiAnQWNjb3VudCBBcHByb3ZlZCcsXG4gICAgc3ViamVjdDogJ0FjY291bnQgYXBwcm92ZWQ6IHt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlRoaXMgYWNjb3VudCBoYXMgYmVlbiBzaWduZWQgb2ZmIGFuZCBpcyBub3cgZXN0YWJsaXNoZWQgZGF0YS48L3A+JyxcbiAgfSxcbiAgJ2NybS5hY2NvdW50X3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnQWNjb3VudCBOb3QgQXBwcm92ZWQnLFxuICAgIHN1YmplY3Q6ICdBY2NvdW50IG5vdCBhcHByb3ZlZDoge3tuYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+VGhpcyBhY2NvdW50IHdhcyBub3Qgc2lnbmVkIG9mZi4gQ29ycmVjdCBpdHMgZGV0YWlscyBhbmQgYXNrIGZvciBhbm90aGVyIHJldmlldy48L3A+JyxcbiAgfSxcbiAgJ2NybS5jb250YWN0X3dlbGNvbWUnOiB7XG4gICAgbGFiZWw6ICdOZXcgQ29udGFjdCcsXG4gICAgc3ViamVjdDogJ05ldyBjb250YWN0OiB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPnt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0gd2FzIGFkZGVkIGFzIGEgY29udGFjdC4gUmVhY2ggb3V0IHRvIHdlbGNvbWUgdGhlbS48L3A+JyxcbiAgfSxcbiAgJ2NybS5kZWFsX3N0YWxsZWQnOiB7XG4gICAgbGFiZWw6ICdTdGFsbGVkIERlYWwnLFxuICAgIHN1YmplY3Q6ICdTdGFsbGVkIGRlYWw6IHt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPk9wcG9ydHVuaXR5IHt7bmFtZX19IGhhcyBzYXQgaW4ge3tzdGFnZX19IGZvciB7e2RheXNfaW5fc3RhZ2V9fSBkYXlzLiBUaW1lIHRvIGFkdmFuY2Ugb3IgcmUtcXVhbGlmeSBpdC48L3A+JyxcbiAgfSxcbiAgJ2NybS5sYXJnZV9kZWFsX3dvbic6IHtcbiAgICBsYWJlbDogJ0xhcmdlIERlYWwgV29uJyxcbiAgICBzdWJqZWN0OiAnTGFyZ2UgZGVhbCB3b246IHt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPnt7bmFtZX19IGNsb3NlZCBhdCB7e2Ftb3VudH19LiBDb25ncmF0dWxhdGlvbnMgdG8gdGhlIHRlYW0uPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9jb252ZXJzaW9uX2FwcHJvdmVkJzoge1xuICAgIGxhYmVsOiAnTGVhZCBBcHByb3ZlZCBmb3IgQ29udmVyc2lvbicsXG4gICAgc3ViamVjdDogJ0xlYWQgYXBwcm92ZWQgZm9yIGNvbnZlcnNpb246IHt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+VGhpcyBsZWFkIGhhcyBiZWVuIHNpZ25lZCBvZmYuIFlvdSBjYW4gY29udmVydCBpdCBpbnRvIGFuIGFjY291bnQsIGNvbnRhY3QgYW5kIG9wcG9ydHVuaXR5LjwvcD4nLFxuICB9LFxuICAnY3JtLmxlYWRfY29udmVyc2lvbl9yZWplY3RlZCc6IHtcbiAgICBsYWJlbDogJ0xlYWQgTm90IEFwcHJvdmVkJyxcbiAgICBzdWJqZWN0OiAnTGVhZCBub3QgYXBwcm92ZWQ6IHt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+Q29udmVyc2lvbiBvZiB0aGlzIGxlYWQgd2FzIG5vdCBhcHByb3ZlZC4gS2VlcCB3b3JraW5nIGl0LCBvciBkaXNxdWFsaWZ5IGl0IHdpdGggYSByZWFzb24uPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9jb252ZXJ0ZWQnOiB7XG4gICAgbGFiZWw6ICdMZWFkIENvbnZlcnRlZCcsXG4gICAgc3ViamVjdDogJ0xlYWQgY29udmVydGVkOiB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPkxlYWQge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fSB3YXMgY29udmVydGVkIGludG8gYW4gYWNjb3VudCBhbmQgY29udGFjdC48L3A+JyxcbiAgfSxcbiAgJ2NybS5sZWFkX3JvdXRpbmdfaG90Jzoge1xuICAgIGxhYmVsOiAnSG90IExlYWQgUm91dGluZycsXG4gICAgc3ViamVjdDogJ0hvdCBsZWFkIFx1MjAxNCBhc3NpZ24gd2l0aGluIDI0aDoge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD57e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19IGZyb20ge3tjb21wYW55fX0gKHJhdGluZyB7e3JhdGluZ319KSBuZWVkcyBhbiBvd25lciB0b2RheS48L3A+JyxcbiAgfSxcbiAgJ2NybS5sZWFkX3JvdXRpbmdfbmV3Jzoge1xuICAgIGxhYmVsOiAnTmV3IExlYWQgUm91dGluZycsXG4gICAgc3ViamVjdDogJ05ldyBsZWFkIHRvIGFzc2lnbjoge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD57e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19IGZyb20ge3tjb21wYW55fX0gaXMgYXdhaXRpbmcgYXNzaWdubWVudC48L3A+JyxcbiAgfSxcbiAgJ2NybS5vcHBvcnR1bml0eV9hcHByb3ZlZCc6IHtcbiAgICBsYWJlbDogJ0RlYWwgQXBwcm92ZWQnLFxuICAgIHN1YmplY3Q6ICdEZWFsIGFwcHJvdmVkOiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5Zb3VyIG9wcG9ydHVuaXR5IHt7bmFtZX19IGhhcyBiZWVuIGFwcHJvdmVkLjwvcD4nLFxuICB9LFxuICAnY3JtLm9wcG9ydHVuaXR5X3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnRGVhbCBSZWplY3RlZCcsXG4gICAgc3ViamVjdDogJ0RlYWwgcmVqZWN0ZWQ6IHt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPllvdXIgb3Bwb3J0dW5pdHkge3tuYW1lfX0gd2FzIG5vdCBhcHByb3ZlZC4gUmV2aWV3IGFuZCByZXZpc2UgYmVmb3JlIHJlc3VibWl0dGluZy48L3A+JyxcbiAgfSxcbiAgJ2NybS50YXNrX3JlbWluZGVyJzoge1xuICAgIGxhYmVsOiAnVGFzayBSZW1pbmRlcicsXG4gICAgc3ViamVjdDogJ1Rhc2sgcmVtaW5kZXI6IHt7c3ViamVjdH19JyxcbiAgICBib2R5SHRtbDogJzxwPllvdXIgdGFzayBcInt7c3ViamVjdH19XCIgaXMgZHVlIChyZW1pbmRlciBzZXQgZm9yIHt7cmVtaW5kZXJfZGF0ZX19KS48L3A+JyxcbiAgfSxcbiAgJ2NybS51cmdlbnRfdGFzayc6IHtcbiAgICBsYWJlbDogJ1VyZ2VudCBUYXNrJyxcbiAgICBzdWJqZWN0OiAnVXJnZW50IHRhc2s6IHt7c3ViamVjdH19JyxcbiAgICBib2R5SHRtbDogJzxwPkFuIHVyZ2VudCB0YXNrIFwie3tzdWJqZWN0fX1cIiB3YXMgYXNzaWduZWQgdG8geW91IGFuZCBuZWVkcyBhdHRlbnRpb24uPC9wPicsXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzL3poLUNOLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvemgtQ04udHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZVBhY2sgfSBmcm9tICcuL19idW5kbGUnO1xuXG4vKiogXHU3QjgwXHU0RjUzXHU0RTJEXHU2NTg3ICh6aC1DTikgXHUyMDE0IHRoZSBzYWxlcyBwYWNrYWdlJ3Mgbm90aWZpY2F0aW9uIHRlbXBsYXRlcy4gU2VlIGBlbi50c2AuICovXG5leHBvcnQgY29uc3QgemhDTjogRW1haWxUZW1wbGF0ZVBhY2sgPSB7XG4gICdjcm0uYWNjb3VudF9hcHByb3ZlZCc6IHtcbiAgICBsYWJlbDogJ1x1NUJBMlx1NjIzN1x1NUJBMVx1NjI3OVx1OTAxQVx1OEZDNycsXG4gICAgc3ViamVjdDogJ1x1NUJBMlx1NjIzN1x1NURGMlx1NUJBMVx1NjI3OVx1OTAxQVx1OEZDN1x1RkYxQXt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1OEJFNVx1NUJBMlx1NjIzN1x1NURGMlx1NUJBMVx1NjI3OVx1OTAxQVx1OEZDN1x1RkYwQ1x1NzNCMFx1NEUzQVx1NkI2M1x1NUYwRlx1NjU3MFx1NjM2RVx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLmFjY291bnRfcmVqZWN0ZWQnOiB7XG4gICAgbGFiZWw6ICdcdTVCQTJcdTYyMzdcdTVCQTFcdTYyNzlcdTY3MkFcdTkwMUFcdThGQzcnLFxuICAgIHN1YmplY3Q6ICdcdTVCQTJcdTYyMzdcdTY3MkFcdTkwMUFcdThGQzdcdTVCQTFcdTYyNzlcdUZGMUF7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5cdThCRTVcdTVCQTJcdTYyMzdcdTY3MkFcdTkwMUFcdThGQzdcdTVCQTFcdTYyNzlcdTMwMDJcdThCRjdcdTRGRUVcdTZCNjNcdTUxNzZcdTRGRTFcdTYwNkZcdTU0MEVcdTUxOERcdTZCMjFcdTYzRDBcdTRFQTRcdTVCQTFcdTY4MzhcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5jb250YWN0X3dlbGNvbWUnOiB7XG4gICAgbGFiZWw6ICdcdTY1QjBcdTgwNTRcdTdDRkJcdTRFQkEnLFxuICAgIHN1YmplY3Q6ICdcdTY1QjBcdTgwNTRcdTdDRkJcdTRFQkFcdUZGMUF7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPnt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0gXHU1REYyXHU2REZCXHU1MkEwXHU0RTNBXHU4MDU0XHU3Q0ZCXHU0RUJBXHUzMDAyXHU4QkY3XHU0RTNCXHU1MkE4XHU4MDU0XHU3Q0ZCXHU1RTc2XHU4ODY4XHU3OTNBXHU2QjIyXHU4RkNFXHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0uZGVhbF9zdGFsbGVkJzoge1xuICAgIGxhYmVsOiAnXHU1NTQ2XHU2NzNBXHU1MDVDXHU2RURFJyxcbiAgICBzdWJqZWN0OiAnXHU1MDVDXHU2RURFXHU1NTQ2XHU2NzNBXHVGRjFBe3tuYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHU1NTQ2XHU2NzNBIHt7bmFtZX19IFx1NURGMlx1NTcyOFx1MjAxQ3t7c3RhZ2V9fVx1MjAxRFx1OTYzNlx1NkJCNVx1NTA1Q1x1NzU1OSB7e2RheXNfaW5fc3RhZ2V9fSBcdTU5MjlcdTMwMDJcdThCRjdcdTYzQThcdThGREJcdTYyMTZcdTkxQ0RcdTY1QjBcdThCQzRcdTRGMzBcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5sYXJnZV9kZWFsX3dvbic6IHtcbiAgICBsYWJlbDogJ1x1NTkyN1x1OTg5RFx1NTU0Nlx1NjczQVx1OEQ2Mlx1NTM1NScsXG4gICAgc3ViamVjdDogJ1x1NTkyN1x1OTg5RFx1NTU0Nlx1NjczQVx1OEQ2Mlx1NTM1NVx1RkYxQXt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPnt7bmFtZX19IFx1NEVFNSB7e2Ftb3VudH19IFx1NjIxMFx1NEVBNFx1MzAwMlx1NjA2RFx1NTU5Q1x1NTZFMlx1OTYxRlx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLmxlYWRfY29udmVyc2lvbl9hcHByb3ZlZCc6IHtcbiAgICBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1OEY2Q1x1NjM2Mlx1NURGMlx1NjI3OVx1NTFDNicsXG4gICAgc3ViamVjdDogJ1x1N0VCRlx1N0QyMlx1OEY2Q1x1NjM2Mlx1NURGMlx1NjI3OVx1NTFDNlx1RkYxQXt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHU4QkU1XHU3RUJGXHU3RDIyXHU1REYyXHU1QkExXHU2Mjc5XHU5MDFBXHU4RkM3XHUzMDAyXHU2MEE4XHU1M0VGXHU0RUU1XHU1QzA2XHU1MTc2XHU4RjZDXHU2MzYyXHU0RTNBXHU1QkEyXHU2MjM3XHUzMDAxXHU4MDU0XHU3Q0ZCXHU0RUJBXHU1NDhDXHU1NTQ2XHU2NzNBXHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9jb252ZXJzaW9uX3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnXHU3RUJGXHU3RDIyXHU4RjZDXHU2MzYyXHU2NzJBXHU2Mjc5XHU1MUM2JyxcbiAgICBzdWJqZWN0OiAnXHU3RUJGXHU3RDIyXHU2NzJBXHU5MDFBXHU4RkM3XHU1QkExXHU2Mjc5XHVGRjFBe3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5cdThCRTVcdTdFQkZcdTdEMjJcdTc2ODRcdThGNkNcdTYzNjJcdTY3MkFcdTgzQjdcdTYyNzlcdTUxQzZcdTMwMDJcdThCRjdcdTdFRTdcdTdFRURcdThEREZcdThGREJcdUZGMENcdTYyMTZcdTZDRThcdTY2MEVcdTUzOUZcdTU2RTBcdTVDMDZcdTUxNzZcdTUzRDZcdTZEODhcdThENDRcdTY4M0NcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5sZWFkX2NvbnZlcnRlZCc6IHtcbiAgICBsYWJlbDogJ1x1N0VCRlx1N0QyMlx1NURGMlx1OEY2Q1x1NjM2MicsXG4gICAgc3ViamVjdDogJ1x1N0VCRlx1N0QyMlx1NURGMlx1OEY2Q1x1NjM2Mlx1RkYxQXt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHU3RUJGXHU3RDIyIHt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0gXHU1REYyXHU4RjZDXHU2MzYyXHU0RTNBXHU1QkEyXHU2MjM3XHU1NDhDXHU4MDU0XHU3Q0ZCXHU0RUJBXHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9yb3V0aW5nX2hvdCc6IHtcbiAgICBsYWJlbDogJ1x1NzBFRFx1OTVFOFx1N0VCRlx1N0QyMlx1NTIwNlx1OTE0RCcsXG4gICAgc3ViamVjdDogJ1x1NzBFRFx1OTVFOFx1N0VCRlx1N0QyMiBcdTIwMTQgMjQgXHU1QzBGXHU2NUY2XHU1MTg1XHU1MjA2XHU5MTREXHVGRjFBe3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5cdTY3NjVcdTgxRUEge3tjb21wYW55fX0gXHU3Njg0IHt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX1cdUZGMDhcdThCQzRcdTUyMDYge3tyYXRpbmd9fVx1RkYwOVx1OTcwMFx1ODk4MVx1NEVDQVx1NTkyOVx1NUMzMVx1NjMwN1x1NUI5QVx1OEQxRlx1OEQyM1x1NEVCQVx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLmxlYWRfcm91dGluZ19uZXcnOiB7XG4gICAgbGFiZWw6ICdcdTY1QjBcdTdFQkZcdTdEMjJcdTUyMDZcdTkxNEQnLFxuICAgIHN1YmplY3Q6ICdcdTVGODVcdTUyMDZcdTkxNERcdTY1QjBcdTdFQkZcdTdEMjJcdUZGMUF7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1Njc2NVx1ODFFQSB7e2NvbXBhbnl9fSBcdTc2ODQge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fSBcdTZCNjNcdTU3MjhcdTdCNDlcdTVGODVcdTUyMDZcdTkxNERcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5vcHBvcnR1bml0eV9hcHByb3ZlZCc6IHtcbiAgICBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1NUJBMVx1NjI3OVx1OTAxQVx1OEZDNycsXG4gICAgc3ViamVjdDogJ1x1NTU0Nlx1NjczQVx1NURGMlx1NjI3OVx1NTFDNlx1RkYxQXt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NjBBOFx1NzY4NFx1NTU0Nlx1NjczQSB7e25hbWV9fSBcdTVERjJcdTgzQjdcdTYyNzlcdTUxQzZcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5vcHBvcnR1bml0eV9yZWplY3RlZCc6IHtcbiAgICBsYWJlbDogJ1x1NTU0Nlx1NjczQVx1NUJBMVx1NjI3OVx1NjcyQVx1OTAxQVx1OEZDNycsXG4gICAgc3ViamVjdDogJ1x1NTU0Nlx1NjczQVx1NjcyQVx1NjI3OVx1NTFDNlx1RkYxQXt7bmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NjBBOFx1NzY4NFx1NTU0Nlx1NjczQSB7e25hbWV9fSBcdTY3MkFcdTgzQjdcdTYyNzlcdTUxQzZcdTMwMDJcdThCRjdcdTY4QzBcdTY3RTVcdTVFNzZcdTRGRUVcdTY1MzlcdTU0MEVcdTkxQ0RcdTY1QjBcdTYzRDBcdTRFQTRcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS50YXNrX3JlbWluZGVyJzoge1xuICAgIGxhYmVsOiAnXHU0RUZCXHU1MkExXHU2M0QwXHU5MTkyJyxcbiAgICBzdWJqZWN0OiAnXHU0RUZCXHU1MkExXHU2M0QwXHU5MTkyXHVGRjFBe3tzdWJqZWN0fX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHU2MEE4XHU3Njg0XHU0RUZCXHU1MkExXHUyMDFDe3tzdWJqZWN0fX1cdTIwMURcdTVERjJcdTUyMzBcdTY3MUZcdUZGMDhcdTYzRDBcdTkxOTJcdTY1RjZcdTk1RjQge3tyZW1pbmRlcl9kYXRlfX1cdUZGMDlcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS51cmdlbnRfdGFzayc6IHtcbiAgICBsYWJlbDogJ1x1N0QyN1x1NjAyNVx1NEVGQlx1NTJBMScsXG4gICAgc3ViamVjdDogJ1x1N0QyN1x1NjAyNVx1NEVGQlx1NTJBMVx1RkYxQXt7c3ViamVjdH19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NEUwMFx1OTg3OVx1N0QyN1x1NjAyNVx1NEVGQlx1NTJBMVx1MjAxQ3t7c3ViamVjdH19XHUyMDFEXHU1REYyXHU1MjA2XHU5MTREXHU3RUQ5XHU2MEE4XHVGRjBDXHU5NzAwXHU4OTgxXHU1QzNEXHU1RkVCXHU1OTA0XHU3NDA2XHUzMDAyPC9wPicsXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzL2phLUpQLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvamEtSlAudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZVBhY2sgfSBmcm9tICcuL19idW5kbGUnO1xuXG4vKiogXHU2NUU1XHU2NzJDXHU4QTlFIChqYS1KUCkgXHUyMDE0IHRoZSBzYWxlcyBwYWNrYWdlJ3Mgbm90aWZpY2F0aW9uIHRlbXBsYXRlcy4gU2VlIGBlbi50c2AuICovXG5leHBvcnQgY29uc3QgamFKUDogRW1haWxUZW1wbGF0ZVBhY2sgPSB7XG4gICdjcm0uYWNjb3VudF9hcHByb3ZlZCc6IHtcbiAgICBsYWJlbDogJ1x1MzBBMlx1MzBBQlx1MzBBNlx1MzBGM1x1MzBDOFx1NjI3Rlx1OEE4RFx1NkUwOFx1MzA3RicsXG4gICAgc3ViamVjdDogJ1x1MzBBMlx1MzBBQlx1MzBBNlx1MzBGM1x1MzBDOFx1MzA0Q1x1NjI3Rlx1OEE4RFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1Rjoge3tuYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHUzMDUzXHUzMDZFXHUzMEEyXHUzMEFCXHUzMEE2XHUzMEYzXHUzMEM4XHUzMDZGXHU2MjdGXHU4QThEXHUzMDU1XHUzMDhDXHUzMDAxXHU2QjYzXHU1RjBGXHUzMDZBXHUzMEM3XHUzMEZDXHUzMEJGXHUzMDZCXHUzMDZBXHUzMDhBXHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0uYWNjb3VudF9yZWplY3RlZCc6IHtcbiAgICBsYWJlbDogJ1x1MzBBMlx1MzBBQlx1MzBBNlx1MzBGM1x1MzBDOFx1NjcyQVx1NjI3Rlx1OEE4RCcsXG4gICAgc3ViamVjdDogJ1x1MzBBMlx1MzBBQlx1MzBBNlx1MzBGM1x1MzBDOFx1MzA0Q1x1NjI3Rlx1OEE4RFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1Qlx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Rjoge3tuYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHUzMDUzXHUzMDZFXHUzMEEyXHUzMEFCXHUzMEE2XHUzMEYzXHUzMEM4XHUzMDZGXHU2MjdGXHU4QThEXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGXHUzMDAyXHU1MTg1XHU1QkI5XHUzMDkyXHU0RkVFXHU2QjYzXHUzMDZFXHUzMDQ2XHUzMDQ4XHUzMDAxXHU1MThEXHU1RUE2XHU2MjdGXHU4QThEXHUzMDkyXHU0RjlEXHU5ODNDXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0uY29udGFjdF93ZWxjb21lJzoge1xuICAgIGxhYmVsOiAnXHU2NUIwXHU4OThGXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1JyxcbiAgICBzdWJqZWN0OiAnXHU2NUIwXHUzMDU3XHUzMDQ0XHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1OiB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPnt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0gXHUzMDRDXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDY4XHUzMDU3XHUzMDY2XHU4RkZEXHU1MkEwXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyXHUzMDU0XHU2MzI4XHU2MkY2XHUzMDZFXHU5MDIzXHU3RDYxXHUzMDkyXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0uZGVhbF9zdGFsbGVkJzoge1xuICAgIGxhYmVsOiAnXHU1MDVDXHU2RURFXHU0RTJEXHUzMDZFXHU1NTQ2XHU4QUM3JyxcbiAgICBzdWJqZWN0OiAnXHU1MDVDXHU2RURFXHU0RTJEXHUzMDZFXHU1NTQ2XHU4QUM3OiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5cdTU1NDZcdThBQzcge3tuYW1lfX0gXHUzMDZGXHUzMDBDe3tzdGFnZX19XHUzMDBEXHUzMDZCIHt7ZGF5c19pbl9zdGFnZX19IFx1NjVFNVx1OTU5M1x1NzU1OVx1MzA3RVx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA3RVx1MzA1OVx1MzAwMlx1NkIyMVx1MzA2RVx1NkJCNVx1OTY4RVx1MzA2Qlx1OTAzMlx1MzA4MVx1MzA4Qlx1MzA0Qlx1MzAwMVx1NTE4RFx1OEE1NVx1NEZBMVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLmxhcmdlX2RlYWxfd29uJzoge1xuICAgIGxhYmVsOiAnXHU1OTI3XHU1NzhCXHU1NTQ2XHU4QUM3XHUzMDZFXHU1M0Q3XHU2Q0U4JyxcbiAgICBzdWJqZWN0OiAnXHU1OTI3XHU1NzhCXHU1NTQ2XHU4QUM3XHUzMDkyXHU1M0Q3XHU2Q0U4OiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD57e25hbWV9fSBcdTMwNEMge3thbW91bnR9fSBcdTMwNjdcdTYyMTBcdTdEMDRcdTMwNTdcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDJcdTMwQzFcdTMwRkNcdTMwRTBcdTMwNkVcdTc2ODZcdTMwNTVcdTMwOTNcdTMwMDFcdTMwNEFcdTMwODFcdTMwNjdcdTMwNjhcdTMwNDZcdTMwNTRcdTMwNTZcdTMwNDRcdTMwN0VcdTMwNTlcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5sZWFkX2NvbnZlcnNpb25fYXBwcm92ZWQnOiB7XG4gICAgbGFiZWw6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTU5MDlcdTYzREJcdTMwNkVcdTYyN0ZcdThBOEQnLFxuICAgIHN1YmplY3Q6ICdcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkVcdTU5MDlcdTYzREJcdTMwNENcdTYyN0ZcdThBOERcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUY6IHt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHUzMDUzXHUzMDZFXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDZGXHU2MjdGXHU4QThEXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDU3XHUzMDVGXHUzMDAyXHU1M0Q2XHU1RjE1XHU1MTQ4XHUzMDAxXHU1M0Q2XHU1RjE1XHU1MTQ4XHU4Q0FDXHU0RUZCXHU4MDA1XHUzMDAxXHU1NTQ2XHU4QUM3XHUzMDZCXHU1OTA5XHU2M0RCXHUzMDY3XHUzMDREXHUzMDdFXHUzMDU5XHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9jb252ZXJzaW9uX3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU2NzJBXHU2MjdGXHU4QThEJyxcbiAgICBzdWJqZWN0OiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDRDXHU2MjdGXHU4QThEXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGOiB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1MzA1M1x1MzA2RVx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2RVx1NTkwOVx1NjNEQlx1MzA2Rlx1NjI3Rlx1OEE4RFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1Qlx1MzA5M1x1MzA2N1x1MzA1N1x1MzA1Rlx1MzAwMlx1NUYxNVx1MzA0RFx1N0Q5QVx1MzA0RFx1NUJGRVx1NUZEQ1x1MzA1OVx1MzA4Qlx1MzA0Qlx1MzAwMVx1NzQwNlx1NzUzMVx1MzA5Mlx1NEVEOFx1MzA1MVx1MzA2Nlx1NUJGRVx1OEM2MVx1NTkxNlx1MzA2Qlx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA2MFx1MzA1NVx1MzA0NFx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLmxlYWRfY29udmVydGVkJzoge1xuICAgIGxhYmVsOiAnXHUzMEVBXHUzMEZDXHUzMEM5XHU1OTA5XHU2M0RCXHU2RTA4XHUzMDdGJyxcbiAgICBzdWJqZWN0OiAnXHUzMEVBXHUzMEZDXHUzMEM5XHUzMDkyXHU1OTA5XHU2M0RCXHUzMDU3XHUzMDdFXHUzMDU3XHUzMDVGOiB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1MzBFQVx1MzBGQ1x1MzBDOSB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19IFx1MzA5Mlx1NTNENlx1NUYxNVx1NTE0OFx1MzA2OFx1NTNENlx1NUYxNVx1NTE0OFx1OENBQ1x1NEVGQlx1ODAwNVx1MzA2Qlx1NTkwOVx1NjNEQlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLmxlYWRfcm91dGluZ19ob3QnOiB7XG4gICAgbGFiZWw6ICdcdTMwREJcdTMwQzNcdTMwQzhcdTMwRUFcdTMwRkNcdTMwQzlcdTMwNkVcdTUyNzJcdTMwOEFcdTVGNTNcdTMwNjYnLFxuICAgIHN1YmplY3Q6ICdcdTMwREJcdTMwQzNcdTMwQzhcdTMwRUFcdTMwRkNcdTMwQzkgXHUyMDE0IDI0IFx1NjY0Mlx1OTU5M1x1NEVFNVx1NTE4NVx1MzA2Qlx1NTI3Mlx1MzA4QVx1NUY1M1x1MzA2Njoge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD57e2NvbXBhbnl9fSBcdTMwNkUge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fVx1RkYwOFx1OEE1NVx1NEZBMSB7e3JhdGluZ319XHVGRjA5XHUzMDZCXHU2NzJDXHU2NUU1XHU0RTJEXHUzMDZCXHU2MkM1XHU1RjUzXHU4MDA1XHUzMDkyXHU1MjcyXHUzMDhBXHU1RjUzXHUzMDY2XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9yb3V0aW5nX25ldyc6IHtcbiAgICBsYWJlbDogJ1x1NjVCMFx1ODk4Rlx1MzBFQVx1MzBGQ1x1MzBDOVx1MzA2RVx1NTI3Mlx1MzA4QVx1NUY1M1x1MzA2NicsXG4gICAgc3ViamVjdDogJ1x1NTI3Mlx1MzA4QVx1NUY1M1x1MzA2Nlx1NUY4NVx1MzA2MVx1MzA2RVx1NjVCMFx1ODk4Rlx1MzBFQVx1MzBGQ1x1MzBDOToge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD57e2NvbXBhbnl9fSBcdTMwNkUge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fSBcdTMwNENcdTUyNzJcdTMwOEFcdTVGNTNcdTMwNjZcdTMwOTJcdTVGODVcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN0VcdTMwNTlcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5vcHBvcnR1bml0eV9hcHByb3ZlZCc6IHtcbiAgICBsYWJlbDogJ1x1NTU0Nlx1OEFDN1x1NjI3Rlx1OEE4RFx1NkUwOFx1MzA3RicsXG4gICAgc3ViamVjdDogJ1x1NTU0Nlx1OEFDN1x1MzA0Q1x1NjI3Rlx1OEE4RFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1Rjoge3tuYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHU1NTQ2XHU4QUM3IHt7bmFtZX19IFx1MzA0Q1x1NjI3Rlx1OEE4RFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLm9wcG9ydHVuaXR5X3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnXHU1NTQ2XHU4QUM3XHU2NzJBXHU2MjdGXHU4QThEJyxcbiAgICBzdWJqZWN0OiAnXHU1NTQ2XHU4QUM3XHUzMDRDXHU2MjdGXHU4QThEXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGOiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5cdTU1NDZcdThBQzcge3tuYW1lfX0gXHUzMDZGXHU2MjdGXHU4QThEXHUzMDU1XHUzMDhDXHUzMDdFXHUzMDVCXHUzMDkzXHUzMDY3XHUzMDU3XHUzMDVGXHUzMDAyXHU1MTg1XHU1QkI5XHUzMDkyXHU3OEJBXHU4QThEXHUzMEZCXHU0RkVFXHU2QjYzXHUzMDZFXHUzMDQ2XHUzMDQ4XHUzMDAxXHU1MThEXHU3NTMzXHU4QUNCXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0udGFza19yZW1pbmRlcic6IHtcbiAgICBsYWJlbDogJ1RvRG8gXHUzMEVBXHUzMERFXHUzMEE0XHUzMEYzXHUzMEMwXHUzMEZDJyxcbiAgICBzdWJqZWN0OiAnVG9EbyBcdTMwNkVcdTMwRUFcdTMwREVcdTMwQTRcdTMwRjNcdTMwQzBcdTMwRkM6IHt7c3ViamVjdH19JyxcbiAgICBib2R5SHRtbDogJzxwPlRvRG9cdTMwMEN7e3N1YmplY3R9fVx1MzAwRFx1MzA0Q1x1NjcxRlx1OTY1MFx1MzA5Mlx1OEZDRVx1MzA0OFx1MzA3RVx1MzA1N1x1MzA1Rlx1RkYwOFx1MzBFQVx1MzBERVx1MzBBNFx1MzBGM1x1MzBDMFx1MzBGQ1x1OEEyRFx1NUI5QToge3tyZW1pbmRlcl9kYXRlfX1cdUZGMDlcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS51cmdlbnRfdGFzayc6IHtcbiAgICBsYWJlbDogJ1x1N0RDQVx1NjAyNSBUb0RvJyxcbiAgICBzdWJqZWN0OiAnXHU3RENBXHU2MDI1XHUzMDZFIFRvRG86IHt7c3ViamVjdH19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1N0RDQVx1NjAyNVx1MzA2RSBUb0RvXHUzMDBDe3tzdWJqZWN0fX1cdTMwMERcdTMwNENcdTUyNzJcdTMwOEFcdTVGNTNcdTMwNjZcdTMwODlcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDJcdTVCRkVcdTVGRENcdTMwOTJcdTMwNEFcdTk4NThcdTMwNDRcdTMwNTdcdTMwN0VcdTMwNTlcdTMwMDI8L3A+JyxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvZXMtRVMudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9lcy1FUy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBFbWFpbFRlbXBsYXRlUGFjayB9IGZyb20gJy4vX2J1bmRsZSc7XG5cbi8qKiBFc3BhXHUwMEYxb2wgKGVzLUVTKSBcdTIwMTQgdGhlIHNhbGVzIHBhY2thZ2UncyBub3RpZmljYXRpb24gdGVtcGxhdGVzLiBTZWUgYGVuLnRzYC4gKi9cbmV4cG9ydCBjb25zdCBlc0VTOiBFbWFpbFRlbXBsYXRlUGFjayA9IHtcbiAgJ2NybS5hY2NvdW50X2FwcHJvdmVkJzoge1xuICAgIGxhYmVsOiAnQ3VlbnRhIGFwcm9iYWRhJyxcbiAgICBzdWJqZWN0OiAnQ3VlbnRhIGFwcm9iYWRhOiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5Fc3RhIGN1ZW50YSBoYSBzaWRvIGFwcm9iYWRhIHkgeWEgZXMgdW4gZGF0byBjb25zb2xpZGFkby48L3A+JyxcbiAgfSxcbiAgJ2NybS5hY2NvdW50X3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnQ3VlbnRhIG5vIGFwcm9iYWRhJyxcbiAgICBzdWJqZWN0OiAnQ3VlbnRhIG5vIGFwcm9iYWRhOiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5Fc3RhIGN1ZW50YSBubyBmdWUgYXByb2JhZGEuIENvcnJpZ2Ugc3VzIGRhdG9zIHkgc29saWNpdGEgb3RyYSByZXZpc2lcdTAwRjNuLjwvcD4nLFxuICB9LFxuICAnY3JtLmNvbnRhY3Rfd2VsY29tZSc6IHtcbiAgICBsYWJlbDogJ051ZXZvIGNvbnRhY3RvJyxcbiAgICBzdWJqZWN0OiAnTnVldm8gY29udGFjdG86IHt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+e3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fSBzZSBoYSBhXHUwMEYxYWRpZG8gY29tbyBjb250YWN0by4gUG9udGUgZW4gY29udGFjdG8gcGFyYSBkYXJsZSBsYSBiaWVudmVuaWRhLjwvcD4nLFxuICB9LFxuICAnY3JtLmRlYWxfc3RhbGxlZCc6IHtcbiAgICBsYWJlbDogJ09wb3J0dW5pZGFkIGVzdGFuY2FkYScsXG4gICAgc3ViamVjdDogJ09wb3J0dW5pZGFkIGVzdGFuY2FkYToge3tuYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+TGEgb3BvcnR1bmlkYWQge3tuYW1lfX0gbGxldmEge3tkYXlzX2luX3N0YWdlfX0gZFx1MDBFRGFzIGVuIHt7c3RhZ2V9fS4gRXMgaG9yYSBkZSBhdmFuemFybGEgbyB2b2x2ZXIgYSBjdWFsaWZpY2FybGEuPC9wPicsXG4gIH0sXG4gICdjcm0ubGFyZ2VfZGVhbF93b24nOiB7XG4gICAgbGFiZWw6ICdHcmFuIG9wZXJhY2lcdTAwRjNuIGdhbmFkYScsXG4gICAgc3ViamVjdDogJ0dyYW4gb3BlcmFjaVx1MDBGM24gZ2FuYWRhOiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD57e25hbWV9fSBzZSBjZXJyXHUwMEYzIHBvciB7e2Ftb3VudH19LiBFbmhvcmFidWVuYSBhbCBlcXVpcG8uPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9jb252ZXJzaW9uX2FwcHJvdmVkJzoge1xuICAgIGxhYmVsOiAnQ2xpZW50ZSBwb3RlbmNpYWwgYXByb2JhZG8gcGFyYSBjb252ZXJzaVx1MDBGM24nLFxuICAgIHN1YmplY3Q6ICdDbGllbnRlIHBvdGVuY2lhbCBhcHJvYmFkbyBwYXJhIGNvbnZlcnNpXHUwMEYzbjoge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5Fc3RlIGNsaWVudGUgcG90ZW5jaWFsIGhhIHNpZG8gYXByb2JhZG8uIFB1ZWRlcyBjb252ZXJ0aXJsbyBlbiBjdWVudGEsIGNvbnRhY3RvIHkgb3BvcnR1bmlkYWQuPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9jb252ZXJzaW9uX3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnQ2xpZW50ZSBwb3RlbmNpYWwgbm8gYXByb2JhZG8nLFxuICAgIHN1YmplY3Q6ICdDbGllbnRlIHBvdGVuY2lhbCBubyBhcHJvYmFkbzoge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5MYSBjb252ZXJzaVx1MDBGM24gZGUgZXN0ZSBjbGllbnRlIHBvdGVuY2lhbCBubyBmdWUgYXByb2JhZGEuIFNpZ3VlIHRyYWJhalx1MDBFMW5kb2xvIG8gZGVzY2FsaWZcdTAwRURjYWxvIGluZGljYW5kbyB1biBtb3Rpdm8uPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9jb252ZXJ0ZWQnOiB7XG4gICAgbGFiZWw6ICdDbGllbnRlIHBvdGVuY2lhbCBjb252ZXJ0aWRvJyxcbiAgICBzdWJqZWN0OiAnQ2xpZW50ZSBwb3RlbmNpYWwgY29udmVydGlkbzoge3tmaXJzdF9uYW1lfX0ge3tsYXN0X25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5FbCBjbGllbnRlIHBvdGVuY2lhbCB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19IHNlIGNvbnZpcnRpXHUwMEYzIGVuIGN1ZW50YSB5IGNvbnRhY3RvLjwvcD4nLFxuICB9LFxuICAnY3JtLmxlYWRfcm91dGluZ19ob3QnOiB7XG4gICAgbGFiZWw6ICdBc2lnbmFjaVx1MDBGM24gZGUgY2xpZW50ZSBwb3RlbmNpYWwgY2FsaWVudGUnLFxuICAgIHN1YmplY3Q6ICdDbGllbnRlIHBvdGVuY2lhbCBjYWxpZW50ZSBcdTIwMTQgYXNpZ25hciBlbiAyNCBoOiB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPnt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0gZGUge3tjb21wYW55fX0gKHB1bnR1YWNpXHUwMEYzbiB7e3JhdGluZ319KSBuZWNlc2l0YSBwcm9waWV0YXJpbyBob3kuPC9wPicsXG4gIH0sXG4gICdjcm0ubGVhZF9yb3V0aW5nX25ldyc6IHtcbiAgICBsYWJlbDogJ0FzaWduYWNpXHUwMEYzbiBkZSBjbGllbnRlIHBvdGVuY2lhbCcsXG4gICAgc3ViamVjdDogJ051ZXZvIGNsaWVudGUgcG90ZW5jaWFsIHBvciBhc2lnbmFyOiB7e2ZpcnN0X25hbWV9fSB7e2xhc3RfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPnt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0gZGUge3tjb21wYW55fX0gZXN0XHUwMEUxIHBlbmRpZW50ZSBkZSBhc2lnbmFjaVx1MDBGM24uPC9wPicsXG4gIH0sXG4gICdjcm0ub3Bwb3J0dW5pdHlfYXBwcm92ZWQnOiB7XG4gICAgbGFiZWw6ICdPcG9ydHVuaWRhZCBhcHJvYmFkYScsXG4gICAgc3ViamVjdDogJ09wb3J0dW5pZGFkIGFwcm9iYWRhOiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5UdSBvcG9ydHVuaWRhZCB7e25hbWV9fSBoYSBzaWRvIGFwcm9iYWRhLjwvcD4nLFxuICB9LFxuICAnY3JtLm9wcG9ydHVuaXR5X3JlamVjdGVkJzoge1xuICAgIGxhYmVsOiAnT3BvcnR1bmlkYWQgcmVjaGF6YWRhJyxcbiAgICBzdWJqZWN0OiAnT3BvcnR1bmlkYWQgcmVjaGF6YWRhOiB7e25hbWV9fScsXG4gICAgYm9keUh0bWw6ICc8cD5UdSBvcG9ydHVuaWRhZCB7e25hbWV9fSBubyBmdWUgYXByb2JhZGEuIFJldlx1MDBFRHNhbGEgeSBjb3JyXHUwMEVEZ2VsYSBhbnRlcyBkZSB2b2x2ZXIgYSBlbnZpYXJsYS48L3A+JyxcbiAgfSxcbiAgJ2NybS50YXNrX3JlbWluZGVyJzoge1xuICAgIGxhYmVsOiAnUmVjb3JkYXRvcmlvIGRlIHRhcmVhJyxcbiAgICBzdWJqZWN0OiAnUmVjb3JkYXRvcmlvIGRlIHRhcmVhOiB7e3N1YmplY3R9fScsXG4gICAgYm9keUh0bWw6ICc8cD5UdSB0YXJlYSBcInt7c3ViamVjdH19XCIgdmVuY2UgKHJlY29yZGF0b3JpbyBmaWphZG8gcGFyYSB7e3JlbWluZGVyX2RhdGV9fSkuPC9wPicsXG4gIH0sXG4gICdjcm0udXJnZW50X3Rhc2snOiB7XG4gICAgbGFiZWw6ICdUYXJlYSB1cmdlbnRlJyxcbiAgICBzdWJqZWN0OiAnVGFyZWEgdXJnZW50ZToge3tzdWJqZWN0fX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+U2UgdGUgaGEgYXNpZ25hZG8gdW5hIHRhcmVhIHVyZ2VudGUgXCJ7e3N1YmplY3R9fVwiIHF1ZSByZXF1aWVyZSBhdGVuY2lcdTAwRjNuLjwvcD4nLFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9jcm0uZW1haWwtdGVtcGxhdGUudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZW1haWwtdGVtcGxhdGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9jcm0uZW1haWwtdGVtcGxhdGUudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZURlZmluaXRpb24gfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuaW1wb3J0IHsgYnVuZGxlIH0gZnJvbSAnLi9fYnVuZGxlJztcbmltcG9ydCB7IGVuIH0gZnJvbSAnLi9lbic7XG5pbXBvcnQgeyB6aENOIH0gZnJvbSAnLi96aC1DTic7XG5pbXBvcnQgeyBqYUpQIH0gZnJvbSAnLi9qYS1KUCc7XG5pbXBvcnQgeyBlc0VTIH0gZnJvbSAnLi9lcy1FUyc7XG5cbi8qKlxuICogU2FsZXMgXHUyMDE0IGV2ZXJ5IGBzeXNfZW1haWxfdGVtcGxhdGVgIHJvdyB0aGlzIHBhY2thZ2UncyBgbm90aWZ5YCBub2RlcyBuYW1lLlxuICpcbiAqIEZvdXIgbG9jYWxlIHBhY2tzIGNyb3NzZWQgd2l0aCBmb3VydGVlbiB0ZW1wbGF0ZSBuYW1lczogdGhlIHJvd3MgYVxuICogcmVjaXBpZW50J3Mgb3duIGBzeXNfdXNlci5sb2NhbGVgIGlzIHJlc29sdmVkIGFnYWluc3QsIHBlciByZWNpcGllbnQsIGFmdGVyXG4gKiBmYW4tb3V0LiBBc3NlbWJsZWQgaGVyZSB0aGUgd2F5IGB0cmFuc2xhdGlvbnMvY3JtLnRyYW5zbGF0aW9uLnRzYCBhc3NlbWJsZXNcbiAqIHRoZSBVSSBsb2NhbGUgcGFja3MgXHUyMDE0IG9uZSBmaWxlIHBlciBsYW5ndWFnZSwgb25lIGZpbGUgdGhhdCBjb2xsZWN0cyB0aGVtLlxuICovXG5leHBvcnQgY29uc3QgU2FsZXNFbWFpbFRlbXBsYXRlczogRW1haWxUZW1wbGF0ZURlZmluaXRpb25bXSA9IGJ1bmRsZSh7XG4gICdlbi1VUyc6IGVuLFxuICAnemgtQ04nOiB6aENOLFxuICAnamEtSlAnOiBqYUpQLFxuICAnZXMtRVMnOiBlc0VTLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlcy9pbmRleC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlcy9pbmRleC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqIFJldmVudWUgZW1haWwtdGVtcGxhdGUgYmFycmVsLiAqL1xuZXhwb3J0IHsgUmV2ZW51ZUVtYWlsVGVtcGxhdGVzIH0gZnJvbSAnLi9jcm0uZW1haWwtdGVtcGxhdGUnO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXMvZW4udHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXMvZW4udHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZVBhY2sgfSBmcm9tICcuLi8uLi9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvX2J1bmRsZSc7XG5cbi8qKlxuICogRW5nbGlzaCAoZW4tVVMpIFx1MjAxNCB0aGUgcmV2ZW51ZSBwYWNrYWdlJ3Mgbm90aWZpY2F0aW9uIHRlbXBsYXRlcy5cbiAqXG4gKiBFdmVyeSBzdHJpbmcgaXMgdGhlIHRleHQgaXRzIGBub3RpZnlgIG5vZGUgYWxyZWFkeSBzZW50LCB3aXRoIHRoZSBmbG93J3NcbiAqIGB7dmFyLnBhdGh9YCBpbnRlcnBvbGF0aW9ucyByZS1leHByZXNzZWQgYXMgdGhlIGB7e2tleX19YCBob2xlcyB0aGUgcmVuZGVyZXJcbiAqIGZpbGxzIGZyb20gdGhhdCBub2RlJ3MgYHRlbXBsYXRlRGF0YWAuIFx1MjZBMFx1RkUwRiBUYWdnZWQgYGVuLVVTYCwgbm90IGBlbmAgXHUyMDE0IHNlZSB0aGVcbiAqIHJlc29sdXRpb24tbGFkZGVyIG5vdGUgb24gYGJ1bmRsZSgpYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGVuOiBFbWFpbFRlbXBsYXRlUGFjayA9IHtcbiAgJ2NybS5jb250cmFjdF9leHBpcmVkJzoge1xuICAgIGxhYmVsOiAnQ29udHJhY3QgRXhwaXJlZCcsXG4gICAgc3ViamVjdDogJ0NvbnRyYWN0IGV4cGlyZWQ6IHt7Y29udHJhY3RfbnVtYmVyfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+Q29udHJhY3Qge3tjb250cmFjdF9udW1iZXJ9fSByZWFjaGVkIGl0cyBlbmQgZGF0ZSBhbmQgaGFzIGJlZW4gbWFya2VkIGV4cGlyZWQuPC9wPicsXG4gIH0sXG4gICdjcm0uY29udHJhY3RfcmVuZXdhbCc6IHtcbiAgICBsYWJlbDogJ0NvbnRyYWN0IFJlbmV3YWwgRHVlJyxcbiAgICBzdWJqZWN0OiAnQ29udHJhY3QgcmVuZXdhbCBkdWU6IHt7Y29udHJhY3RfbnVtYmVyfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+Q29udHJhY3Qge3tjb250cmFjdF9udW1iZXJ9fSBlbmRzIG9uIHt7ZW5kX2RhdGV9fS4gU3RhcnQgdGhlIHJlbmV3YWwgY29udmVyc2F0aW9uIG5vdy48L3A+JyxcbiAgfSxcbiAgJ2NybS5xdW90ZV9jcmVhdGVkJzoge1xuICAgIGxhYmVsOiAnUXVvdGUgQ3JlYXRlZCcsXG4gICAgc3ViamVjdDogJ1F1b3RlIGNyZWF0ZWQ6IHt7cXVvdGVfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPllvdXIgcXVvdGUge3txdW90ZV9uYW1lfX0gaGFzIGJlZW4gY3JlYXRlZCBmcm9tIHRoaXMgb3Bwb3J0dW5pdHkuPC9wPicsXG4gIH0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXMvemgtQ04udHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXMvemgtQ04udHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZVBhY2sgfSBmcm9tICcuLi8uLi9zYWxlcy9lbWFpbC10ZW1wbGF0ZXMvX2J1bmRsZSc7XG5cbi8qKiBcdTdCODBcdTRGNTNcdTRFMkRcdTY1ODcgKHpoLUNOKSBcdTIwMTQgdGhlIHJldmVudWUgcGFja2FnZSdzIG5vdGlmaWNhdGlvbiB0ZW1wbGF0ZXMuIFNlZSBgZW4udHNgLiAqL1xuZXhwb3J0IGNvbnN0IHpoQ046IEVtYWlsVGVtcGxhdGVQYWNrID0ge1xuICAnY3JtLmNvbnRyYWN0X2V4cGlyZWQnOiB7XG4gICAgbGFiZWw6ICdcdTU0MDhcdTU0MENcdTVERjJcdTUyMzBcdTY3MUYnLFxuICAgIHN1YmplY3Q6ICdcdTU0MDhcdTU0MENcdTVERjJcdTUyMzBcdTY3MUZcdUZGMUF7e2NvbnRyYWN0X251bWJlcn19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NTQwOFx1NTQwQyB7e2NvbnRyYWN0X251bWJlcn19IFx1NURGMlx1NTIzMFx1OEZCRVx1N0VEM1x1Njc1Rlx1NjVFNVx1NjcxRlx1RkYwQ1x1NUU3Nlx1NURGMlx1NjgwN1x1OEJCMFx1NEUzQVx1NTIzMFx1NjcxRlx1MzAwMjwvcD4nLFxuICB9LFxuICAnY3JtLmNvbnRyYWN0X3JlbmV3YWwnOiB7XG4gICAgbGFiZWw6ICdcdTU0MDhcdTU0MENcdTdFRURcdTdFQTZcdTYzRDBcdTkxOTInLFxuICAgIHN1YmplY3Q6ICdcdTU0MDhcdTU0MENcdTVGODVcdTdFRURcdTdFQTZcdUZGMUF7e2NvbnRyYWN0X251bWJlcn19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NTQwOFx1NTQwQyB7e2NvbnRyYWN0X251bWJlcn19IFx1NUMwNlx1NEU4RSB7e2VuZF9kYXRlfX0gXHU3RUQzXHU2NzVGXHUzMDAyXHU4QkY3XHU3QUNCXHU1MzczXHU1NDJGXHU1MkE4XHU3RUVEXHU3RUE2XHU2QzlGXHU5MDFBXHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0ucXVvdGVfY3JlYXRlZCc6IHtcbiAgICBsYWJlbDogJ1x1NjJBNVx1NEVGN1x1NTM1NVx1NURGMlx1NTIxQlx1NUVGQScsXG4gICAgc3ViamVjdDogJ1x1NjJBNVx1NEVGN1x1NTM1NVx1NURGMlx1NTIxQlx1NUVGQVx1RkYxQXt7cXVvdGVfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NjBBOFx1NzY4NFx1NjJBNVx1NEVGN1x1NTM1NSB7e3F1b3RlX25hbWV9fSBcdTVERjJcdTRFQ0VcdThCRTVcdTU1NDZcdTY3M0FcdTUyMUJcdTVFRkFcdTMwMDI8L3A+JyxcbiAgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlcy9qYS1KUC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlcy9qYS1KUC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBFbWFpbFRlbXBsYXRlUGFjayB9IGZyb20gJy4uLy4uL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9fYnVuZGxlJztcblxuLyoqIFx1NjVFNVx1NjcyQ1x1OEE5RSAoamEtSlApIFx1MjAxNCB0aGUgcmV2ZW51ZSBwYWNrYWdlJ3Mgbm90aWZpY2F0aW9uIHRlbXBsYXRlcy4gU2VlIGBlbi50c2AuICovXG5leHBvcnQgY29uc3QgamFKUDogRW1haWxUZW1wbGF0ZVBhY2sgPSB7XG4gICdjcm0uY29udHJhY3RfZXhwaXJlZCc6IHtcbiAgICBsYWJlbDogJ1x1NTk1MVx1N0QwNFx1MzA2RVx1NkU4MFx1NEU4NicsXG4gICAgc3ViamVjdDogJ1x1NTk1MVx1N0QwNFx1MzA0Q1x1NkU4MFx1NEU4Nlx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rjoge3tjb250cmFjdF9udW1iZXJ9fScsXG4gICAgYm9keUh0bWw6ICc8cD5cdTU5NTFcdTdEMDQge3tjb250cmFjdF9udW1iZXJ9fSBcdTMwNkZcdTdENDJcdTRFODZcdTY1RTVcdTMwNkJcdTkwNTRcdTMwNTdcdTMwMDFcdTZFODBcdTRFODZcdTMwNjhcdTMwNTdcdTMwNjZcdThBMThcdTkzMzJcdTMwNTVcdTMwOENcdTMwN0VcdTMwNTdcdTMwNUZcdTMwMDI8L3A+JyxcbiAgfSxcbiAgJ2NybS5jb250cmFjdF9yZW5ld2FsJzoge1xuICAgIGxhYmVsOiAnXHU1OTUxXHU3RDA0XHU2NkY0XHU2NUIwXHUzMDZFXHU2NjQyXHU2NzFGJyxcbiAgICBzdWJqZWN0OiAnXHU1OTUxXHU3RDA0XHUzMDZFXHU2NkY0XHU2NUIwXHU2NjQyXHU2NzFGXHUzMDY3XHUzMDU5OiB7e2NvbnRyYWN0X251bWJlcn19JyxcbiAgICBib2R5SHRtbDogJzxwPlx1NTk1MVx1N0QwNCB7e2NvbnRyYWN0X251bWJlcn19IFx1MzA2RiB7e2VuZF9kYXRlfX0gXHUzMDZCXHU3RDQyXHU0RTg2XHUzMDU3XHUzMDdFXHUzMDU5XHUzMDAyXHU2NkY0XHU2NUIwXHUzMDZFXHU3NkY4XHU4QUM3XHUzMDkyXHU1OUNCXHUzMDgxXHUzMDY2XHUzMDRGXHUzMDYwXHUzMDU1XHUzMDQ0XHUzMDAyPC9wPicsXG4gIH0sXG4gICdjcm0ucXVvdGVfY3JlYXRlZCc6IHtcbiAgICBsYWJlbDogJ1x1ODk4Qlx1N0E0RFx1MzA2RVx1NEY1Q1x1NjIxMCcsXG4gICAgc3ViamVjdDogJ1x1ODk4Qlx1N0E0RFx1MzA5Mlx1NEY1Q1x1NjIxMFx1MzA1N1x1MzA3RVx1MzA1N1x1MzA1Rjoge3txdW90ZV9uYW1lfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+XHUzMDUzXHUzMDZFXHU1NTQ2XHU4QUM3XHUzMDRCXHUzMDg5XHU4OThCXHU3QTREIHt7cXVvdGVfbmFtZX19IFx1MzA0Q1x1NEY1Q1x1NjIxMFx1MzA1NVx1MzA4Q1x1MzA3RVx1MzA1N1x1MzA1Rlx1MzAwMjwvcD4nLFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZW1haWwtdGVtcGxhdGVzL2VzLUVTLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZW1haWwtdGVtcGxhdGVzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZW1haWwtdGVtcGxhdGVzL2VzLUVTLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEVtYWlsVGVtcGxhdGVQYWNrIH0gZnJvbSAnLi4vLi4vc2FsZXMvZW1haWwtdGVtcGxhdGVzL19idW5kbGUnO1xuXG4vKiogRXNwYVx1MDBGMW9sIChlcy1FUykgXHUyMDE0IHRoZSByZXZlbnVlIHBhY2thZ2UncyBub3RpZmljYXRpb24gdGVtcGxhdGVzLiBTZWUgYGVuLnRzYC4gKi9cbmV4cG9ydCBjb25zdCBlc0VTOiBFbWFpbFRlbXBsYXRlUGFjayA9IHtcbiAgJ2NybS5jb250cmFjdF9leHBpcmVkJzoge1xuICAgIGxhYmVsOiAnQ29udHJhdG8gdmVuY2lkbycsXG4gICAgc3ViamVjdDogJ0NvbnRyYXRvIHZlbmNpZG86IHt7Y29udHJhY3RfbnVtYmVyfX0nLFxuICAgIGJvZHlIdG1sOiAnPHA+RWwgY29udHJhdG8ge3tjb250cmFjdF9udW1iZXJ9fSBhbGNhbnpcdTAwRjMgc3UgZmVjaGEgZGUgZmluIHkgc2UgaGEgbWFyY2FkbyBjb21vIHZlbmNpZG8uPC9wPicsXG4gIH0sXG4gICdjcm0uY29udHJhY3RfcmVuZXdhbCc6IHtcbiAgICBsYWJlbDogJ1Jlbm92YWNpXHUwMEYzbiBkZSBjb250cmF0byBwZW5kaWVudGUnLFxuICAgIHN1YmplY3Q6ICdSZW5vdmFjaVx1MDBGM24gZGUgY29udHJhdG8gcGVuZGllbnRlOiB7e2NvbnRyYWN0X251bWJlcn19JyxcbiAgICBib2R5SHRtbDogJzxwPkVsIGNvbnRyYXRvIHt7Y29udHJhY3RfbnVtYmVyfX0gZmluYWxpemEgZWwge3tlbmRfZGF0ZX19LiBJbmljaWEgeWEgbGEgY29udmVyc2FjaVx1MDBGM24gZGUgcmVub3ZhY2lcdTAwRjNuLjwvcD4nLFxuICB9LFxuICAnY3JtLnF1b3RlX2NyZWF0ZWQnOiB7XG4gICAgbGFiZWw6ICdQcmVzdXB1ZXN0byBjcmVhZG8nLFxuICAgIHN1YmplY3Q6ICdQcmVzdXB1ZXN0byBjcmVhZG86IHt7cXVvdGVfbmFtZX19JyxcbiAgICBib2R5SHRtbDogJzxwPlR1IHByZXN1cHVlc3RvIHt7cXVvdGVfbmFtZX19IHNlIGhhIGNyZWFkbyBhIHBhcnRpciBkZSBlc3RhIG9wb3J0dW5pZGFkLjwvcD4nLFxuICB9LFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZW1haWwtdGVtcGxhdGVzL2NybS5lbWFpbC10ZW1wbGF0ZS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2VtYWlsLXRlbXBsYXRlcy9jcm0uZW1haWwtdGVtcGxhdGUudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZURlZmluaXRpb24gfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuaW1wb3J0IHsgYnVuZGxlIH0gZnJvbSAnLi4vLi4vc2FsZXMvZW1haWwtdGVtcGxhdGVzL19idW5kbGUnO1xuaW1wb3J0IHsgZW4gfSBmcm9tICcuL2VuJztcbmltcG9ydCB7IHpoQ04gfSBmcm9tICcuL3poLUNOJztcbmltcG9ydCB7IGphSlAgfSBmcm9tICcuL2phLUpQJztcbmltcG9ydCB7IGVzRVMgfSBmcm9tICcuL2VzLUVTJztcblxuLyoqXG4gKiBSZXZlbnVlIFx1MjAxNCBldmVyeSBgc3lzX2VtYWlsX3RlbXBsYXRlYCByb3cgdGhpcyBwYWNrYWdlJ3MgYG5vdGlmeWAgbm9kZXMgbmFtZS5cbiAqXG4gKiBGb3VyIGxvY2FsZSBwYWNrcyBjcm9zc2VkIHdpdGggdGhyZWUgdGVtcGxhdGUgbmFtZXMuIGBidW5kbGUoKWAgaXMgaW1wb3J0ZWRcbiAqIGFsb25nIHRoaXMgbW9kdWxlJ3MgZWRnZSBpbnRvIHNhbGVzLCB0aGUgb25lIGRldGVybWluaXN0aWMgaG9tZSBmb3IgYSBzb3VyY2VcbiAqIG1vcmUgdGhhbiBvbmUgcGFja2FnZSBuZWVkcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFJldmVudWVFbWFpbFRlbXBsYXRlczogRW1haWxUZW1wbGF0ZURlZmluaXRpb25bXSA9IGJ1bmRsZSh7XG4gICdlbi1VUyc6IGVuLFxuICAnemgtQ04nOiB6aENOLFxuICAnamEtSlAnOiBqYUpQLFxuICAnZXMtRVMnOiBlc0VTLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlcy90ZW5hbnQtYWRtaW4ucHJvZmlsZS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9wcm9maWxlcy90ZW5hbnQtYWRtaW4ucHJvZmlsZS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNiBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgU3lzdGVtQWRtaW5Qcm9maWxlIH0gZnJvbSAnLi9zeXN0ZW0tYWRtaW4ucHJvZmlsZSc7XG5cbi8qKlxuICogVGVuYW50IEFkbWluaXN0cmF0b3IgXHUyMDE0IHRoZSBhZG1pbiBwZXJzb25hIG9mIHRoZSBTYWFTIC8gbXVsdGktb3JnIGNvbXBvc2l0aW9uXG4gKiAoIzEzNjEpLiBSZWdpc3RlcmVkIE9OTFkgYnkgdGhhdCBjb21wb3NpdGlvbjsgdGhlIGNvbW11bml0eSBhcHAgc2hpcHNcbiAqIGBzeXN0ZW1fYWRtaW5gIGV4YWN0bHkgYXMgaXQgYWx3YXlzIGhhcyBhbmQgdGhpcyBmaWxlIGlzIG5vdCBpbiBpdHMgYXJ0aWZhY3QuXG4gKlxuICogIyMjIFdoeSBhIHNlY29uZCBhZG1pbiBzZXQgaW5zdGVhZCBvZiBuYXJyb3dpbmcgdGhlIGZpcnN0XG4gKlxuICogVGhlIHR3byBhZG1pbnMgYXJlIGRpZmZlcmVudCBwZW9wbGUuIGBzeXN0ZW1fYWRtaW5gIGlzIHRoZSBvcGVyYXRvciBvZiBhXG4gKiBzaW5nbGUtb3JnIGluc3RhbGw6IHRoZSBvbmUgd2hvIG93bnMgdGhlIGRlcGxveW1lbnQuIEEgdGVuYW50IGFkbWluIG93bnMgYW5cbiAqIE9SR0FOSVpBVElPTiBpbnNpZGUgc29tZWJvZHkgZWxzZSdzIGRlcGxveW1lbnQsIGFuZCB1bmRlciBhbiBgaXNvbGF0ZWRgXG4gKiBwb3N0dXJlIGV2ZXJ5IG90aGVyIG9yZ2FuaXphdGlvbiBpbiB0aGF0IGRhdGFiYXNlIGlzIG5vbmUgb2YgdGhlaXIgYnVzaW5lc3MuXG4gKiBBIHByb2ZpbGUgaXMgYSBkZXNjcmlwdGlvbiBvZiBhIHBlcnNvbmEsIHNvIHdoZXJlIHRoZSBwZXJzb25hIGRpZmZlcnMgdGhlXG4gKiBwcm9maWxlIGRvZXMgXHUyMDE0IG5hcnJvd2luZyBgc3lzdGVtX2FkbWluYCBpbiBwbGFjZSB3b3VsZCBoYXZlIGNoYW5nZWQgdGhlXG4gKiBjb21tdW5pdHkgYXBwJ3MgbWVhbmluZyB0byBkZXNjcmliZSBhIGN1c3RvbWVyIGl0IGRvZXMgbm90IGhhdmUuXG4gKlxuICogIyMjIFRoZSBPQkpFQ1QgZ3JhbnRzIGFyZSBzaGFyZWQsIG9uIHB1cnBvc2UgYW5kIGJ5IHJlZmVyZW5jZVxuICpcbiAqIEEgdGVuYW50IGFkbWluIGFkbWluaXN0ZXJzIHRoZWlyIG93biBvcmcncyByZWNvcmRzIHdpdGggZXhhY3RseSB0aGUgYXV0aG9yaXR5XG4gKiBgc3lzdGVtX2FkbWluYCBoYXMgb3ZlciBhIHNpbmdsZS1vcmcgaW5zdGFsbCdzIHJlY29yZHMgXHUyMDE0IHNhbWUgb2JqZWN0cywgc2FtZVxuICogQ1JVRCwgc2FtZSBhbGwtcmVjb3JkcyBkZXB0aCwgc2FtZSB0cmFuc2ZlciBhbmQgZXhwb3J0IGJpdHMuIFNvIHRoZSBtYXAgaXNcbiAqIERFUklWRUQgZnJvbSBgU3lzdGVtQWRtaW5Qcm9maWxlLm9iamVjdHNgIHJhdGhlciB0aGFuIHRyYW5zY3JpYmVkLlxuICpcbiAqIFRoYXQgaXMgdGhlIGxvYWQtYmVhcmluZyBoYWxmLiBQZXJtaXNzaW9uIHNldHMgYXJlIGV4cGxpY2l0LWFsbG93IG9ubHksIHNvIGFuXG4gKiBvYmplY3QgbWlzc2luZyBmcm9tIHRoZSBtYXAgaXMgcGVybWlzc2lvbi1kZW5pZWQgZm9yIHRlbmFudCBhZG1pbnMgdG9vLCBhbmQgYVxuICogdHJhbnNjcmliZWQgY29weSB3b3VsZCBkcmlmdCB0aGUgZmlyc3QgdGltZSBhbiBvYmplY3Qgc2hpcHBlZCBcdTIwMTQgdGhlIGV4YWN0XG4gKiBkZWZlY3QgYHRlc3QvYXV0aG9yaXphdGlvbi1jb3ZlcmFnZS50ZXN0LnRzYCBleGlzdHMgdG8gY2F0Y2ggb24gdGhlIGNvbW11bml0eVxuICogc2V0ICgjNDg4OiBvYmplY3RzIHRoYXQgc2hpcHBlZCB3aXRoIG5hdmlnYXRpb24sIHZpZXdzLCBob29rcyBhbmQgc2VlZHMgYnV0IGFcbiAqIGdyYW50IGluIG5vIHNldCBhdCBhbGwpLiBEZXJpdmluZyBtZWFucyBhIG5ldyBvYmplY3QgbGFuZHMgaW4gYm90aCBhZG1pbnMgdGhlXG4gKiBkYXkgaXQgbGFuZHMgaW4gb25lLCB3aXRoIG5vdGhpbmcgdG8gcmVtZW1iZXIuXG4gKlxuICogIyMjIFdoYXQgY2hhbmdlczogYG1hbmFnZV91c2Vyc2AgXHUyMTkyIGBtYW5hZ2Vfb3JnX3VzZXJzYFxuICpcbiAqIGBtYW5hZ2VfdXNlcnNgIGlzIGBzY29wZTogJ3BsYXRmb3JtJ2AgaW4gdGhlIHBsYXRmb3JtJ3Mgb3duIGNhcGFiaWxpdHlcbiAqIHJlZ2lzdHJ5IFx1MjAxNCBcIkNyZWF0ZSwgZWRpdCwgYW5kIGRlYWN0aXZhdGUgdXNlcnMgYWNyb3NzIHRoZSBwbGF0Zm9ybVwiLiBIYW5kaW5nXG4gKiB0aGF0IHRvIGEgdGVuYW50IGlzIGhhbmRpbmcgdGhlbSBldmVyeSBvdGhlciB0ZW5hbnQncyBwZW9wbGUuIEl0cyBvcmctc2NvcGVkXG4gKiBzaWJsaW5nLCBgbWFuYWdlX29yZ191c2Vyc2AgKFwiTWFuYWdlIG1lbWJlcnMgd2l0aGluIHRoZSBjYWxsZXInc1xuICogb3JnYW5pemF0aW9uXCIpLCBpcyB0aGUgbWVtYmVyLW1hbmFnZW1lbnQgYXV0aG9yaXR5IGEgdGVuYW50IGFkbWluIHNob3VsZCBob2xkLFxuICogYW5kIGl0IGlzIGRlY2xhcmVkIGluIHRoZSByZWxlYXNlZCBgQG9iamVjdHN0YWNrL3NwZWNgIDE3LjEuMCB0aGlzIGFwcCBkZXBlbmRzXG4gKiBvbiAodmVyaWZpZWQgYWdhaW5zdCB0aGUgaW5zdGFsbGVkIGBQTEFURk9STV9DQVBBQklMSVRJRVNgLCBub3QgYWdhaW5zdCBhXG4gKiBuZXdlciBwbGF0Zm9ybSBjaGVja291dCBcdTIwMTQgYW4gYXBwIG9uIGEgcmVsZWFzZWQgbGluZSBjYW5ub3QgZ3JhbnQgYSBjYXBhYmlsaXR5XG4gKiB0aGF0IGxpbmUgaGFzIG5vdCBzaGlwcGVkKS5cbiAqXG4gKiBCb3RoIGFyZSBERUNMQVJBVElPTlMgaGVyZSwgbm90IGVuZm9yY2VtZW50OiBtZWFzdXJlZCBhZ2FpbnN0IHRoZSBpbnN0YWxsZWRcbiAqIDE3LjEuMCBwYWNrYWdlcywgYG1hbmFnZV91c2Vyc2AgYXBwZWFycyBpbiBhIHNpbmdsZSBjb21tZW50IGFuZCBub3RoaW5nIHJlYWRzXG4gKiBlaXRoZXIgbmFtZSBcdTIwMTQgdGhlIG1lbWJlci1tYW5hZ2VtZW50IGRvb3IgaXMgdGhlIGVudGVycHJpc2Ugb3JnYW5pemF0aW9uc1xuICogcnVudGltZSdzLCBhbmQgaXQgaXMgdGhlIGVkaXRpb24gdGhhdCBzdXBwbGllcyB0aGUgZ2F0ZS4gVGhhdCBpcyB0aGUgc2hhcGUgdGhlXG4gKiBtYWludGFpbmVyJ3MgMjAyNi0wOC0xMSBydWxpbmcgYXNrcyBmb3IgYW5kIHRoZSBhcHAgcGFja2FnZSdzIGByZXF1aXJlc2BcbiAqIChgc3JjL3NhbGVzL2luZGV4LnRzYCkgYWxyZWFkeSBmb2xsb3dzIGZvciBgaGllcmFyY2h5LXNlY3VyaXR5YDogXHUzMDBDXHU2NzJDXHU5ODc5XHU3NkVFXHU2NjJGXHU1MTQzXHU2NTcwXHU2MzZFYXBwXHVGRjBDXHU1NzI4XHU0RjAxXHU0RTFBXHU3MjQ4XHU4RkQwXHU4ODRDXHU1QzMxXHU1MTc3XHU1OTA3XHU0RjAxXHU0RTFBXHU3MjQ4XG4gKiBcdTc2RjhcdTUxNzNcdTc2ODRcdTgwRkRcdTUyOUJcdUZGMENcdTRFMERcdTkxQ0RcdTU5MERcdTVGMDBcdTUzRDFcdTMwMDJcdTMwMEQgVGhlIGFwcCBzdGF0ZXMgd2hhdCBpdCBNRUFOUzsgdGhlIGVkaXRpb24gZW5mb3JjZXMuXG4gKlxuICogIyMjIFdoYXQgYHZpZXdfYWxsX2RhdGFgIC8gYG1vZGlmeV9hbGxfZGF0YWAgbWVhbiB1bmRlciB0aGUgd2FsbCBcdTIwMTQgdGhlIGF1ZGl0XG4gKlxuICogVGhleSBhcmUgS0VQVCwgYW5kIHRoZXkgYXJlIGJvdW5kZWQgYnkgdGhlIG9yZ2FuaXphdGlvbiwgbm90IGJ5IHRoZW0uXG4gKlxuICogVHdvIG1lYXN1cmVtZW50cywgYm90aCBhZ2FpbnN0IHRoZSAxNy4xLjAgbGluZSBcdTIwMTQgdGhlIHZlcnNpb25cbiAqIGluc3RhbGxlZCBBVCBUSEUgVElNRSB0aGV5IHdlcmUgdGFrZW4sIG5vdCB0aGUgY3VycmVudCBwaW4gKG5laXRoZXIgd2FzXG4gKiByZS10YWtlbiBvbiAxNy4zLjAsIDE3LjQuMCBvciAxNy41LjApLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBUaGUgemVyby1vY2N1cnJlbmNlIHJlc3VsdCBpbiAxIFx1MjAxNCB0aGUgbG9hZC1iZWFyaW5nIGhhbGYgXHUyMDE0IHJlcHJvZHVjZWQgb25cbiAqIDE3LjIuMCBhbmQgaGFzIG5vdCBiZWVuIHJlLXJ1biBzaW5jZSAoIzE2NzYpLiBUaGUgdGhyZWUgQ09OVFJPTCBjb3VudHMgaW5cbiAqIGl0IGRvIE5PVCByZXByb2R1Y2U6IHRoZXkgYXJlXG4gKiBhcy1tZWFzdXJlZC10aGVuIGZpZ3VyZXMgYW5kIGhhdmUgc2luY2UgbW92ZWQuIFRoZXkgYXJlIGtlcHQgYXQgdGhlaXJcbiAqIG1lYXN1cmVkIHZhbHVlcyBvbiBwdXJwb3NlIHJhdGhlciB0aGFuIHJlZnJlc2hlZCwgYmVjYXVzZSB3aGF0IHRoZXkgYXJlXG4gKiBldmlkZW5jZSBGT1IgaXMgdGhhdCB0aGUgc3dlZXAgY2FuIGZpbmQgYSBuYW1lIGl0IGxvb2tzIGZvciBcdTIwMTQgbmV2ZXIgYVxuICogY3VycmVudCB0b3RhbC4gXHUyNkQ0IERvIG5vdCBjaXRlIHRoZW0gYXMgb25lLCBhbmQgXHUyNkQ0IGRvIG5vdCBcImZpeFwiIHRoZW0gYnlcbiAqIHBhc3RpbmcgdG9kYXkncyBudW1iZXJzIG92ZXIgYSAxNy4xLjAgbWVhc3VyZW1lbnQuXG4gKlxuICogIDEuICoqTmVpdGhlciBzdHJpbmcgaXMgcmVhZCBieSBhbnl0aGluZy4qKiBgdmlld19hbGxfZGF0YWAgYW5kXG4gKiAgICAgYG1vZGlmeV9hbGxfZGF0YWAgb2NjdXIgaW4gWkVSTyBpbnN0YWxsZWQgYEBvYmplY3RzdGFjay8qYCBKYXZhU2NyaXB0XG4gKiAgICAgZmlsZXMgKGNvbnRyb2wgcHJvYmVzIGluIHRoZSBzYW1lIHN3ZWVwOiBgbWFuYWdlX3NoYXJpbmdgIDE1IGZpbGVzLFxuICogICAgIGBtYW5hZ2VfbWV0YWRhdGFgIDI1LCBgc2V0dXAuYWNjZXNzYCAzMiBcdTIwMTQgc28gdGhlIHN3ZWVwIGNhbiBmaW5kIGEgbmFtZSBpdFxuICogICAgIGlzIGxvb2tpbmcgZm9yKS4gVGhleSBhcmUgYXBwLWRlY2xhcmVkIHZvY2FidWxhcnkuIFRoZSBhdXRob3JpdHkgdGhhdCBpc1xuICogICAgIHJlYWxseSBlbmZvcmNlZCBpcyB0aGUgUEVSLU9CSkVDVCBgdmlld0FsbFJlY29yZHNgIC8gYG1vZGlmeUFsbFJlY29yZHNgXG4gKiAgICAgYml0cyBpbiB0aGUgbWFwIGFib3ZlLCB3aGljaCB0aGUgc2hhcmluZyBsYXllciByZWFkcyBvbiBldmVyeSByZXF1ZXN0LlxuICogIDIuICoqVGhlIG9yZ2FuaXphdGlvbiBwcmVkaWNhdGUgaXMgbm90IHBhcnQgb2YgdGhhdCBsYXllci4qKiBBIHRlbmFudC1zY29wZWRcbiAqICAgICByZWFkIGlzIGNvbXBpbGVkIGJ5IHRoZSBEUklWRVIgZnJvbSB0aGUgZXhlY3V0aW9uIGNvbnRleHQncyB0ZW5hbnQgaWQsXG4gKiAgICAgdW5kZXJuZWF0aCBwZXJtaXNzaW9ucyBhbmQgc2hhcmluZyBlbnRpcmVseS4gTWVhc3VyZWQgb24gYSByZWFsIGVuZ2luZTogYVxuICogICAgIGNhbGxlciBpbiBgb3JnX2FgIHJlYWRpbmcgYGNybV9hY2NvdW50YCBzZWVzIDEgb2YgdGhlIDIgcm93cyBpbiB0aGUgdGFibGVcbiAqICAgICBcdTIwMTQgYW5kIHN0aWxsIHNlZXMgMSBvZiAyIHdpdGggdGhlIHRlbmFuY3kgcG9zdHVyZSBmbGlwcGVkIHRvIGBzaW5nbGVgLFxuICogICAgIHdoaWNoIGlzIHdoYXQgc2hvd3MgdGhlIGJvdW5kYXJ5IGJlbG9uZ3MgdG8gdGhlIGRyaXZlciBhbmQgdGhlIGNvbnRleHRcbiAqICAgICByYXRoZXIgdGhhbiB0byBhIGRlcGxveW1lbnQga25vYiBhIHByb2ZpbGUgbWlnaHQgaG9wZSB0byBvdXQtcmFuay5cbiAqXG4gKiBTbyBcImFsbCBkYXRhXCIgYW5zd2VycyBhIHF1ZXN0aW9uIGFib3V0IERFUFRIIGluc2lkZSBvbmUgb3JnYW5pemF0aW9uIFx1MjAxNCBhbGxcbiAqIHJvd3MgcmVnYXJkbGVzcyBvZiBvd25lciBcdTIwMTQgYW5kIG5vIHBlcm1pc3Npb24tc2V0IGJpdCBjYW4gd2lkZW4gaXQgcGFzdCB0aGVcbiAqIHdhbGwsIGJlY2F1c2UgdGhlIHdhbGwgaXMgbm90IGFwcGxpZWQgYnkgdGhlIHBlcm1pc3Npb24gc2V0LiBUaGUgb25lIGNvbnRleHRcbiAqIHRoYXQgZG9lcyBjcm9zcyBpdCBpcyBhIHN5c3RlbSBjb250ZXh0IChgaXNTeXN0ZW1gKSwgd2hpY2ggbm8gcHJvZmlsZSBncmFudHNcbiAqIGFuZCBubyBzZXNzaW9uIHByb2R1Y2VzLiBLZWVwaW5nIHRoZSB0d28gZ3JhbnRzIHRoZXJlZm9yZSBzYXlzIHRoZSB0cnVlXG4gKiB0aGluZyBhYm91dCBhIHRlbmFudCBhZG1pbjogaW5zaWRlIHRoZWlyIG9yZywgdGhleSBzZWUgYW5kIGVkaXQgZXZlcnl0aGluZy5cbiAqXG4gKiAjIyMgV2hhdCBhIHRlbmFudCBhZG1pbiBtYXkgQVVUSE9SOiBub3RoaW5nLCBzaW5jZSAxOC4wLjAtbmV4dC4wXG4gKlxuICogVGhyb3VnaCAxNy43LjAgdGhpcyBzZXQgaGVsZCBgbWFuYWdlX29yZ19wcmVzZW50YXRpb25gLCB0aGUgcGxhdGZvcm0nc1xuICogYHNjb3BlOiAnb3JnJ2AgY2FwYWJpbGl0eSAob2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjMTI3MDIpIHRoYXQgYWRtaXR0ZWRcbiAqIGAvbWV0YWAgd3JpdGVzIG9mIHRoZSBgYWxsb3dPcmdPdmVycmlkZTogdHJ1ZWAgdHlwZXMgXHUyMDE0IHZpZXcsIGRhc2hib2FyZCxcbiAqIHJlcG9ydCwgdHJhbnNsYXRpb24sIGVtYWlsX3RlbXBsYXRlIFx1MjAxNCBhcyBvdmVybGF5cyBpbiB0aGUgY2FsbGVyJ3Mgb3duXG4gKiBvcmdhbml6YXRpb24uIDE4LjAuMC1uZXh0LjAgUkVUSVJFUyBpdCB3aXRoIHRoZSBwZXItb3JnYW5pemF0aW9uIG92ZXJsYXlcbiAqIGF4aXMgKEFEUi0wMTMxIEQ2LCB0aGUgc3BlYydzIGBtYW5hZ2Utb3JnLXByZXNlbnRhdGlvbi1yZXRpcmVkYCBlbnRyeSk6IGl0IGlzXG4gKiBubyBsb25nZXIgaW4gYFBMQVRGT1JNX0NBUEFCSUxJVElFU2AsIG5vdGhpbmcgY29uc3VsdHMgaXQsIGFuZCB0aGUgZW50cnknc1xuICogcmVtZWR5IGlzIHRvIGRlbGV0ZSBpdCBmcm9tIGV2ZXJ5IHNldC4gVGhlcmUgaXMgbm8gb3JnYW5pemF0aW9uLWJvdW5kZWRcbiAqIGF1dGhvcmluZyBjYXBhYmlsaXR5IGxlZnQ7IHRoZSBvbmx5IGtleSB0aGF0IGFkbWl0cyB0aG9zZSB3cml0ZXMgaXNcbiAqIGBtYW5hZ2VfbWV0YWRhdGFgLCB3aG9zZSB3cml0ZXMgbGFuZCBlbnZpcm9ubWVudC13aWRlLCBzbyBpdCBzdGF5c1xuICogdW5ncmFudGVkIGZvciB0aGUgcmVhc29uIGJlbG93LlxuICpcbiAqIGBjdXN0b21pemVfYXBwbGljYXRpb25gLCBgbWFuYWdlX3Byb2ZpbGVzYCBhbmQgYG1hbmFnZV9yb2xlc2Agc3RheVxuICogdW5ncmFudGVkLiBUaGV5IGRlc2NyaWJlIGF1dGhvcmluZyB0aGUgYXBwJ3Mgc3RydWN0dXJlIGFuZCBzZWN1cml0eSBtb2RlbCBcdTIwMTRcbiAqIG9iamVjdHMsIGFwcHMsIHBhZ2VzLCBwZXJtaXNzaW9uIHNldHMsIHBvc2l0aW9ucyBcdTIwMTQgYW5kIHRoZSByZWdpc3RyeSBkZWNsYXJlc1xuICogZXZlcnkgb25lIG9mIHRob3NlIHR5cGVzIGBhbGxvd09yZ092ZXJyaWRlOiBmYWxzZWAsIHNvIHRoZSBvbmx5IGtleSB0aGF0XG4gKiBhZG1pdHMgdGhvc2Ugd3JpdGVzIGlzIHN0aWxsIGBtYW5hZ2VfbWV0YWRhdGFgOiBgc2NvcGU6ICdwbGF0Zm9ybSdgLCByZWFjaFxuICogYWNyb3NzIGV2ZXJ5IG9yZ2FuaXphdGlvbiBpbiB0aGUgZGVwbG95bWVudC4gR3JhbnRpbmcgdGhlIHRocmVlIHdvdWxkXG4gKiBkZXNjcmliZSBhbiBhdXRob3JpdHkgdGhlIGRlcGxveW1lbnQgY2Fubm90IHNhZmVseSBnaXZlLlxuICpcbiAqIGBtYW5hZ2Vfc2hhcmluZ2AgSVMgZ3JhbnRlZDogdGhlIHBsYXRmb3JtIGRlY2xhcmVzIGl0IGBzY29wZTogJ29yZydgXG4gKiAoXCJBZG1pbmlzdGVyIHJlY29yZCBzaGFyaW5nIFx1MjAyNiBiZXlvbmQgb25lJ3Mgb3duIHJlY29yZHNcIiksIHdoaWNoIGlzIHByZWNpc2VseVxuICogYSB0ZW5hbnQgYWRtaW4ncyBqb2Igb3ZlciB0aGVpciBvd24gb3JnJ3MgcmVjb3Jkcy5cbiAqXG4gKiBgdmlld19zZXR1cGAgaXMga2VwdCBmb3IgcGFyaXR5IHdpdGggdGhlIGNvbW11bml0eSBhZG1pbiBcdTIwMTQgaXQgaXMgdGhpcyBhcHAnc1xuICogb3duIFNldHVwLWVudHJ5IHZvY2FidWxhcnkgYW5kLCBsaWtlIHRoZSB0d28gYWJvdmUsIGhhcyBubyBwbGF0Zm9ybSBjb25zdW1lclxuICogb24gdGhpcyBsaW5lLiAoVGhlIHBsYXRmb3JtJ3Mgb3duIGBzZXR1cC5hY2Nlc3NgIGlzIGBzY29wZTogJ3BsYXRmb3JtJ2AgYW5kXG4gKiBpcyBub3QgZ3JhbnRlZCBoZXJlIGZvciB0aGUgc2FtZSByZWFzb24gYG1hbmFnZV91c2Vyc2AgaXMgbm90LilcbiAqL1xuZXhwb3J0IGNvbnN0IFRlbmFudEFkbWluUHJvZmlsZSA9IHtcbiAgbmFtZTogJ3RlbmFudF9hZG1pbicsXG4gIGxhYmVsOiAnVGVuYW50IEFkbWluaXN0cmF0b3InLFxuICAvLyBEZXJpdmVkLCBuZXZlciB0cmFuc2NyaWJlZCBcdTIwMTQgc2VlIHRoZSBub3RlIGFib3ZlLiBTcHJlYWQgcmF0aGVyIHRoYW5cbiAgLy8gYWxpYXNlZCBzbyB0aGUgdHdvIHNldHMgYXJlIGluZGVwZW5kZW50IHZhbHVlcyBpbiB0aGUgYnVpbHQgYXJ0aWZhY3QuXG4gIG9iamVjdHM6IHsgLi4uU3lzdGVtQWRtaW5Qcm9maWxlLm9iamVjdHMgfSxcbiAgc3lzdGVtUGVybWlzc2lvbnM6IFtcbiAgICAndmlld19zZXR1cCcsXG4gICAgLy8gVGhlIG9uZSBzdWJzdGl0dXRpb24gdGhpcyBwcm9maWxlIGV4aXN0cyBmb3I6IG9yZy1zY29wZWQgbWVtYmVyXG4gICAgLy8gbWFuYWdlbWVudCBpbnN0ZWFkIG9mIHBsYXRmb3JtLXdpZGUgdXNlciBtYW5hZ2VtZW50LlxuICAgICdtYW5hZ2Vfb3JnX3VzZXJzJyxcbiAgICAvLyBPcmctYm91bmRlZCBieSB0aGUgZHJpdmVyJ3MgdGVuYW50IHByZWRpY2F0ZSBcdTIwMTQgc2VlIHRoZSBhdWRpdCBhYm92ZS5cbiAgICAndmlld19hbGxfZGF0YScsICdtb2RpZnlfYWxsX2RhdGEnLFxuICAgICdtYW5hZ2Vfc2hhcmluZycsXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0cy9hY2NvdW50Lmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2FjY291bnQuaG9vay50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBIb29rLCBIb29rQ29udGV4dCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHR5cGUgeyBIb29rQXBpIH0gZnJvbSAnLi9faG9vay1hcGknO1xuXG4vKipcbiAqIEFjY291bnQgcHJvdGVjdGlvbiBob29rLlxuICpcbiAqIC0gVmFsaWRhdGVzIGB3ZWJzaXRlYCBmb3JtYXQgYW5kIGBhbm51YWxfcmV2ZW51ZWAgbm9uLW5lZ2F0aXZlLlxuICogLSBQcm9qZWN0cyBgYmlsbGluZ19hZGRyZXNzLmNvdW50cnlgIG9udG8gdGhlIGZsYXQgYGJpbGxpbmdfY291bnRyeWAgY29sdW1uXG4gKiAgICgjNjIxKSBhbmQgY2xhc3NpZmllcyBpdCBpbnRvIHRoZSBgdGVycml0b3J5YCBzZWxlY3QgdGhlIHRlcnJpdG9yeSBzaGFyaW5nXG4gKiAgIHJ1bGVzIGZpbHRlciBvbiAoIzYzOSkuXG4gKiAtIEZvbGRzIGBuYW1lYCBpbnRvIHRoZSBgbmFtZV9ub3JtYWxpemVkYCBjb2x1bW4gbGVhZCBjb252ZXJzaW9uIG1hdGNoZXNcbiAqICAgYWNjb3VudHMgb24gKCM2MjYpLlxuICogLSBSZWZ1c2VzIHRvIGRlbGV0ZSBhIGBjdXN0b21lcmAgYWNjb3VudCB0aGF0IHN0aWxsIGhhcyBvcHBvcnR1bml0aWVzIFx1MjAxNFxuICogICBvcGVuIG9yIGNsb3NlZCwgdGhlIGFjY291bnQncyBzYWxlcyBoaXN0b3J5ICgjMjAxOSkgXHUyMDE0IG9yIGFjdGl2YXRlZFxuICogICBjb250cmFjdHMgXHUyMDE0IGNvbnRyYWN0cyBjYXNjYWRlIHdpdGggdGhlIGFjY291bnQgc2luY2UgIzU0OS5cbiAqL1xuY29uc3QgYWNjb3VudEhvb2s6IEhvb2sgPSB7XG4gIG5hbWU6ICdhY2NvdW50X3Byb3RlY3Rpb24nLFxuICBvYmplY3Q6ICdjcm1fYWNjb3VudCcsXG4gIGV2ZW50czogWydiZWZvcmVJbnNlcnQnLCAnYmVmb3JlVXBkYXRlJywgJ2JlZm9yZURlbGV0ZSddLFxuICBwcmlvcml0eTogMjAwLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnVmFsaWRhdGUgYWNjb3VudCBmaWVsZHMgYW5kIHByb3RlY3QgY3VzdG9tZXIgYWNjb3VudHMgd2l0aCBvcHBvcnR1bml0aWVzIG9yIGFjdGl2YXRlZCBjb250cmFjdHMgZnJvbSBkZWxldGlvbi4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIC8vIFRoZSByZWZ1c2FsIGVudmVsb3BlICgjMTA3NSkuIE1pcnJvcmVkIGZyb20gYC4vX3JlZnVzYWwudHNgIGJlY2F1c2UgYVxuICAgIC8vIGxvd2VyZWQgYm9keSBoYXMgbm8gbW9kdWxlIHNjb3BlIGFuZCBgZXh0cmFjdEhvb2tCb2R5YCBUSFJPV1Mgb24gYW5cbiAgICAvLyBpbXBvcnQ7IGB0ZXN0L3JlZnVzYWwtZW52ZWxvcGUudGVzdC50c2AgcGlucyBldmVyeSBjb3B5IGFnYWluc3QgaXQuXG4gICAgZnVuY3Rpb24gcmVmdXNlKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29kZTogc3RyaW5nLFxuICAgICAgc3RhdHVzOiBudW1iZXIsXG4gICAgICB1c2VyTWVzc2FnZTogc3RyaW5nID0gbWVzc2FnZSxcbiAgICApOiBFcnJvciB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSkgYXMgRXJyb3IgJiB7XG4gICAgICAgIGNvZGU6IHN0cmluZztcbiAgICAgICAgc3RhdHVzOiBudW1iZXI7XG4gICAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmc7XG4gICAgICB9O1xuICAgICAgZXJyLmNvZGUgPSBjb2RlO1xuICAgICAgZXJyLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgIGVyci51c2VyTWVzc2FnZSA9IHVzZXJNZXNzYWdlO1xuICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG4gICAgY29uc3QgeyBldmVudCwgaW5wdXQgfSA9IGN0eDtcblxuICAgIGlmIChldmVudCA9PT0gJ2JlZm9yZUluc2VydCcgfHwgZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnKSB7XG4gICAgICBpZiAodHlwZW9mIGlucHV0LndlYnNpdGUgPT09ICdzdHJpbmcnICYmIGlucHV0LndlYnNpdGUubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoIS9eaHR0cHM/OlxcL1xcLy9pLnRlc3QoaW5wdXQud2Vic2l0ZSkpIHtcbiAgICAgICAgICB0aHJvdyByZWZ1c2UoJ1dlYnNpdGUgbXVzdCBzdGFydCB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly8nLCAnVkFMSURBVElPTl9GQUlMRUQnLCA0MDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGlucHV0LmFubnVhbF9yZXZlbnVlID09PSAnbnVtYmVyJyAmJiBpbnB1dC5hbm51YWxfcmV2ZW51ZSA8IDApIHtcbiAgICAgICAgdGhyb3cgcmVmdXNlKCdBbm51YWwgUmV2ZW51ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwJywgJ1ZBTElEQVRJT05fRkFJTEVEJywgNDAwKTtcbiAgICAgIH1cblxuICAgICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFRlcnJpdG9yeSAoIzYyMSBzdG9yYWdlIGxvY2F0aW9uLCAjNjM5IGNsYXNzaWZpY2F0aW9uKSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAgIC8vXG4gICAgICAvLyBUd28gZGVyaXZlZCBjb2x1bW5zLCBvbmUgaW5wdXQuIGBiaWxsaW5nX2NvdW50cnlgIGlzIHRoZSBmbGF0XG4gICAgICAvLyBwcm9qZWN0aW9uIG9mIGBiaWxsaW5nX2FkZHJlc3MuY291bnRyeWA7IGB0ZXJyaXRvcnlgIGlzIHRoZSBDTEFTU0lGSUVEXG4gICAgICAvLyB2YWx1ZSB0aGUgdHdvIHRlcnJpdG9yeSBzaGFyaW5nIHJ1bGVzIG5vdyBmaWx0ZXIgb24uIFRoaXMgYmxvY2sgaXMgdGhlXG4gICAgICAvLyBvbmx5IHdyaXRlciBvZiBib3RoLlxuICAgICAgLy9cbiAgICAgIC8vIGBiaWxsaW5nX2NvdW50cnlgIGJlY2FtZSBhIGZsYXQgY29sdW1uIGJlY2F1c2UgYSBzaGFyaW5nIHJ1bGUncyBDRUxcbiAgICAgIC8vIGNvbmRpdGlvbiBpcyBjb21waWxlZCBpbnRvIGEgcHVzaGRvd24tYWJsZSBxdWVyeSBmaWx0ZXIsIGFuZCB0aGF0XG4gICAgICAvLyBjb21waWxlciByZWplY3RzIGFueSBwYXRoIHJlYWNoaW5nIElOU0lERSBhIGNvbXBvc2l0ZSBgYWRkcmVzc2AgdmFsdWVcbiAgICAgIC8vIFx1MjAxNCBgcmVjb3JkLmJpbGxpbmdfYWRkcmVzcy5jb3VudHJ5IGluIFsuLi5dYCBpcyBub3QgdHJhbnNsYXRhYmxlLCBzb1xuICAgICAgLy8gcGx1Z2luLXNoYXJpbmcgZHJvcHBlZCBib3RoIHJ1bGVzIG9uIGV2ZXJ5IGJvb3QgYW5kIGBuYV9zYWxlc190ZWFtYCAvXG4gICAgICAvLyBgZXVfc2FsZXNfdGVhbWAgZ290IG5vdGhpbmcgYXQgYWxsICgjNjIxKS5cbiAgICAgIC8vXG4gICAgICAvLyBUaGF0IGZpeGVkIFdIRVJFIHRoZSBjb3VudHJ5IGlzIHJlYWQgZnJvbSBhbmQgbGVmdCBXSEFUIHRoZSBydWxlc1xuICAgICAgLy8gbWF0Y2ggb24gdW5maXhlZDogYSBmcmVlLXRleHQgY291bnRyeS4gYFVuaXRlZCBTdGF0ZXNgIG1hdGNoZWQgbm9cbiAgICAgIC8vIHRlcnJpdG9yeSwgc2lsZW50bHksIGFuZCB0aGUgc2FtZSBjb3VudHJ5IGxpc3RzIHdlcmUgcmVzdGF0ZWQgaW4gdHdvXG4gICAgICAvLyBDRUwgc3RyaW5ncyBhbmQgc2l4IGRvY3VtZW50YXRpb24gZmlsZXMuICM2MzkgcmVwbGFjZWQgdGhlIG1hdGNoaW5nXG4gICAgICAvLyB3aXRoIGB0ZXJyaXRvcnlgLCBhIGRlY2xhcmVkIHNlbGVjdCBcdTIwMTQgc2VlIGAuL190ZXJyaXRvcnkudHNgIGZvciB0aGVcbiAgICAgIC8vIHdob2xlIGFyZ3VtZW50IGFuZCBmb3IgdGhlIGF1dGhvcmVkIHRhYmxlcyB0aGlzIHRhYmxlIGlzIGRlcml2ZWQgZnJvbS5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI1MDBcdTI1MDAgVHdvIGRpZmZlcmVudCByZWNvbXB1dGUgcnVsZXMsIG9uIHB1cnBvc2UgXHUyNTAwXHUyNTAwXG4gICAgICAvL1xuICAgICAgLy8gYGJpbGxpbmdfY291bnRyeWAgTUlSUk9SUyB0aGUgYWRkcmVzcywgc28gaXQgaXMgcmV3cml0dGVuIG9ubHkgd2hlblxuICAgICAgLy8gdGhlIHdyaXRlIGNhcnJpZXMgb25lOiBhIHBhcnRpYWwgdXBkYXRlIHRoYXQgbmV2ZXIgbWVudGlvbnNcbiAgICAgIC8vIGBiaWxsaW5nX2FkZHJlc3NgIG11c3QgbGVhdmUgaXQgYWxvbmUsIG9yIGV2ZXJ5IHVucmVsYXRlZCBlZGl0IHdvdWxkXG4gICAgICAvLyBibGFuayB0aGUgY29sdW1uLiBBIHdyaXRlIHRoYXQgQ0xFQVJTIHRoZSBhZGRyZXNzXG4gICAgICAvLyAoYGJpbGxpbmdfYWRkcmVzczogbnVsbGApIGRvZXMgY2xlYXIgaXQgXHUyMDE0IHRoZSBrZXkgaXMgcHJlc2VudCwgdGhlXG4gICAgICAvLyB2YWx1ZSBpcyBlbXB0eS5cbiAgICAgIC8vXG4gICAgICAvLyBgdGVycml0b3J5YCBpcyBhIENMQVNTSUZJQ0FUSU9OLCBhbmQgIzYzOSBkZWNpZGVkIGl0IGlzIGFsd2F5cyBhXG4gICAgICAvLyBzdGF0ZWQgZmFjdCByYXRoZXIgdGhhbiBhIGJsYW5rIChcImJlbG9uZ3MgdG8gbm8gdGVycml0b3J5XCIgYW5kIFwibm9ib2R5XG4gICAgICAvLyBmaWxsZWQgaXQgaW5cIiBtdXN0IG5vdCBsb29rIGFsaWtlKS4gU28gaXQgaXMgYWxzbyBzdGF0ZWQgb24gYW4gaW5zZXJ0XG4gICAgICAvLyB0aGF0IGNhcnJpZXMgbm8gYWRkcmVzcyBhdCBhbGwsIHdoZXJlIGl0IGlzIGBvdGhlcmAuIE9uIGFuIHVwZGF0ZSB0aGF0XG4gICAgICAvLyBkb2VzIG5vdCBtZW50aW9uIHRoZSBhZGRyZXNzIGl0IGlzIGxlZnQgYWxvbmUsIGV4YWN0bHkgbGlrZSB0aGVcbiAgICAgIC8vIHByb2plY3Rpb24gXHUyMDE0IGFuIHVucmVsYXRlZCBlZGl0IG11c3Qgbm90IHJlLWRlcml2ZSBpdC5cbiAgICAgIC8vXG4gICAgICAvLyBPbmx5IGBjb3VudHJ5YCBpcyByZWFkLiBgY291bnRyeUNvZGVgIGlzIHRoZSBJU08gMzE2Ni0xIGFscGhhLTIgc2xvdFxuICAgICAgLy8gYW5kIHdvdWxkIGJlIHRoZSBiZXR0ZXIgaW5wdXQsIGJ1dCBpdCBpcyBvcHRpb25hbCBhbmQgbW9zdGx5IGVtcHR5IGluXG4gICAgICAvLyB0aGlzIGFwcCdzIGRhdGE7IHJlYWRpbmcgaXQgaW4gcHJlZmVyZW5jZSB3b3VsZCBtb3ZlIHdoaWNoIHNsb3QgZGVjaWRlc1xuICAgICAgLy8gYW4gYWNjb3VudCdzIHRlcnJpdG9yeSwgd2hpY2ggIzYzOSBkaWQgbm90IGFzayBmb3IuIGBVS2AgdnMgYEdCYCBpc1xuICAgICAgLy8gaGFuZGxlZCBpbiB0aGUgbWFwcGluZyBpbnN0ZWFkIChib3RoIGFyZSBgZW1lYWApLCB3aGljaCBpcyB3aHkgbm90aGluZ1xuICAgICAgLy8gaGFkIHRvIG1pZ3JhdGUuXG4gICAgICAvL1xuICAgICAgLy8gXHUyNTAwXHUyNTAwIFdoeSB0aGUgbWFwIGlzIElOTElORSByYXRoZXIgdGhhbiBpbXBvcnRlZCBcdTI1MDBcdTI1MDBcbiAgICAgIC8vXG4gICAgICAvLyBBIGhvb2sgaGFuZGxlciBpcyBsb3dlcmVkIHRvIGEgbWV0YWRhdGEtb25seSBgYm9keS5zb3VyY2VgIGFuZFxuICAgICAgLy8gZXZhbHVhdGVkIGluc2lkZSBRdWlja0pTIHdpdGggbm8gbW9kdWxlIHNjb3BlLCBzbyBhbiBpbXBvcnQgaXMgYVxuICAgICAgLy8gYFJlZmVyZW5jZUVycm9yYCBhdCBydW50aW1lLCBub3QgYSBjbG9zdXJlOyBgZXh0cmFjdEhvb2tCb2R5YCByZWplY3RzXG4gICAgICAvLyBzdWNoIGEgaGFuZGxlciBhbmQgYHRlc3QvYWN0aW9uLXNhbmRib3gudGVzdC50c2AgcnVucyB0aGF0IHNhbWVcbiAgICAgIC8vIGxvd2VyaW5nIHBhc3Mgb3ZlciBldmVyeSByZWdpc3RlcmVkIGhvb2suIFRoZSB0YWJsZSB0aGVyZWZvcmUgY2Fubm90IGJlXG4gICAgICAvLyByZWFkIGZyb20gYC4vX3RlcnJpdG9yeS50c2AgaGVyZS4gSXQgaXMgbm90IHRydXN0ZWQgdG8gc3RheSBpbiBzdGVwXG4gICAgICAvLyBlaXRoZXI6IGB0ZXN0L3RlcnJpdG9yeS1zaW5nbGUtc291cmNlLnRlc3QudHNgIHBhcnNlcyB0aGlzIGxpdGVyYWwgb3V0XG4gICAgICAvLyBvZiB0aGUgTE9XRVJFRCBib2R5IGFuZCBhc3NlcnRzIGRlZXAgZXF1YWxpdHkgd2l0aCB0aGUgbW9kdWxlJ3MgZGVyaXZlZFxuICAgICAgLy8gbWFwLCBzbyBhIGNvdW50cnkgYWRkZWQgdG8gZWl0aGVyIHNpZGUgYWxvbmUgZmFpbHMuXG4gICAgICBpZiAoJ2JpbGxpbmdfYWRkcmVzcycgaW4gaW5wdXQgfHwgZXZlbnQgPT09ICdiZWZvcmVJbnNlcnQnKSB7XG4gICAgICAgIGNvbnN0IGFkZHJlc3MgPSBpbnB1dC5iaWxsaW5nX2FkZHJlc3M7XG4gICAgICAgIGNvbnN0IGNvdW50cnkgPVxuICAgICAgICAgIGFkZHJlc3MgIT09IG51bGwgJiYgdHlwZW9mIGFkZHJlc3MgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGFkZHJlc3MpXG4gICAgICAgICAgICA/IChhZGRyZXNzIGFzIHsgY291bnRyeT86IHVua25vd24gfSkuY291bnRyeVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIC8vIFRoZSBvbmUgbm9ybWFsaXNhdGlvbiBydWxlLCBtaXJyb3JlZCBmcm9tIGBub3JtYWxpemVDb3VudHJ5YDogdHJpbSxcbiAgICAgICAgLy8gY29sbGFwc2UgaW50ZXJuYWwgd2hpdGVzcGFjZSwgdXBwZXItY2FzZS4gRXZlcnkga2V5IGJlbG93IGlzIHdyaXR0ZW5cbiAgICAgICAgLy8gaW4gdGhhdCBmb3JtLCBzbyB0aGUgbG9va3VwIGlzIGEgcGxhaW4gcHJvcGVydHkgcmVhZCByYXRoZXIgdGhhbiBhXG4gICAgICAgIC8vIHBpbGUgb2YgdG9sZXJhbnQgY29tcGFyaXNvbnMuXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPVxuICAgICAgICAgIHR5cGVvZiBjb3VudHJ5ID09PSAnc3RyaW5nJyA/IGNvdW50cnkudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKS50b1VwcGVyQ2FzZSgpIDogJyc7XG5cbiAgICAgICAgaWYgKCdiaWxsaW5nX2FkZHJlc3MnIGluIGlucHV0KSB7XG4gICAgICAgICAgaW5wdXQuYmlsbGluZ19jb3VudHJ5ID0gbm9ybWFsaXplZCA9PT0gJycgPyBudWxsIDogbm9ybWFsaXplZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEEgQ09QWSBvZiB0aGUgbWFwIGRlcml2ZWQgaW4gYC4vX3RlcnJpdG9yeS50c2AsIGtlcHQgaGVyZSBiZWNhdXNlIGFcbiAgICAgICAgLy8gc2FuZGJveGVkIGJvZHkgY2Fubm90IGltcG9ydCBpdCAoc2VlIGFib3ZlKS4gRWRpdCBgX3RlcnJpdG9yeS50c2BcbiAgICAgICAgLy8gYW5kIG1pcnJvciB0aGUgcmVzdWx0IGhlcmUgXHUyMDE0IGB0ZXN0L3RlcnJpdG9yeS1zaW5nbGUtc291cmNlLnRlc3QudHNgXG4gICAgICAgIC8vIHJlYWRzIHRoaXMgbGl0ZXJhbCBiYWNrIG91dCBvZiB0aGUgbG93ZXJlZCBib2R5IGFuZCBmYWlscyBpZiB0aGUgdHdvXG4gICAgICAgIC8vIGRpc2FncmVlLCBzbyB0aGUgbWlycm9yaW5nIGlzIGVuZm9yY2VkIHJhdGhlciB0aGFuIHJlbWVtYmVyZWQuXG4gICAgICAgIGNvbnN0IFRFUlJJVE9SWV9CWV9DT1VOVFJZOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgICAgIFwiVVNcIjogXCJuYVwiLCBcIkNBXCI6IFwibmFcIiwgXCJNWFwiOiBcIm5hXCIsXG4gICAgICAgICAgXCJHQlwiOiBcImVtZWFcIiwgXCJERVwiOiBcImVtZWFcIiwgXCJGUlwiOiBcImVtZWFcIiwgXCJJVFwiOiBcImVtZWFcIiwgXCJFU1wiOiBcImVtZWFcIixcbiAgICAgICAgICBcIlVOSVRFRCBTVEFURVNcIjogXCJuYVwiLCBcIlVOSVRFRCBTVEFURVMgT0YgQU1FUklDQVwiOiBcIm5hXCIsIFwiVVNBXCI6IFwibmFcIixcbiAgICAgICAgICBcIkNBTkFEQVwiOiBcIm5hXCIsIFwiTUVYSUNPXCI6IFwibmFcIixcbiAgICAgICAgICBcIlVLXCI6IFwiZW1lYVwiLCBcIlVOSVRFRCBLSU5HRE9NXCI6IFwiZW1lYVwiLCBcIkdSRUFUIEJSSVRBSU5cIjogXCJlbWVhXCIsXG4gICAgICAgICAgXCJHRVJNQU5ZXCI6IFwiZW1lYVwiLCBcIkZSQU5DRVwiOiBcImVtZWFcIiwgXCJJVEFMWVwiOiBcImVtZWFcIiwgXCJTUEFJTlwiOiBcImVtZWFcIlxuICAgICAgICB9O1xuICAgICAgICBpbnB1dC50ZXJyaXRvcnkgPSBURVJSSVRPUllfQllfQ09VTlRSWVtub3JtYWxpemVkXSB8fCAnb3RoZXInO1xuICAgICAgfVxuXG4gICAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQWNjb3VudC1uYW1lIG1hdGNoIGtleSAoIzYyNikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgICAvL1xuICAgICAgLy8gYG5hbWVfbm9ybWFsaXplZGAgaXMgdGhlIGNvbHVtbiBgbGVhZF9jb252ZXJzaW9uYCBtYXRjaGVzIGFjY291bnRzIG9uLFxuICAgICAgLy8gYW5kIHRoaXMgYmxvY2sgaXMgaXRzIG9ubHkgd3JpdGVyLiBJdCBleGlzdHMgYmVjYXVzZSB0aGUgZmxvdyB0aGF0XG4gICAgICAvLyByZWFkcyBpdCBjYW5ub3QgY29tcHV0ZSBpdDogYHNlcnZpY2UtYXV0b21hdGlvbmAncyB0ZW1wbGF0ZSByZXNvbHZlclxuICAgICAgLy8ga25vd3Mgb25lIGZ1bmN0aW9uIGZvcm0gKGBOT1coKWAgLyBgVE9EQVkoKWApLCBzbyBge0xPV0VSKHgpfWAsXG4gICAgICAvLyBge1RSSU0oeCl9YCBhbmQgYHt4LnRvTG93ZXJDYXNlKCl9YCBhbGwgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBcdTIwMTQgYW5kIGFcbiAgICAgIC8vIGZvcm11bGEgZmllbGQgaGFzIG5vIHBoeXNpY2FsIGNvbHVtbiB0byBmaWx0ZXIgb25cbiAgICAgIC8vIChgZmllbGRIYXNDb2x1bW4oZm9ybXVsYSkgPT09IGZhbHNlYCkuIFRoZSBjYW5vbmljYWwgZm9ybSB0aGVyZWZvcmUgaGFzXG4gICAgICAvLyB0byBiZSBlc3RhYmxpc2hlZCBIRVJFLCBieSB0aGUgcHJvZHVjZXIsIGV4YWN0bHkgYXMgYGNybV9sZWFkLmVtYWlsYFxuICAgICAgLy8gYW5kIGBjcm1fY29udGFjdC5lbWFpbGAgYXJlLlxuICAgICAgLy9cbiAgICAgIC8vIGxvd2VyICsgdHJpbSArIGNvbGxhcHNlIGludGVybmFsIHdoaXRlc3BhY2UsIHNvIFwiQWNtZSBDb3JwXCIsXG4gICAgICAvLyBcIkFDTUUgIENvcnBcIiBhbmQgXCIgYWNtZSBjb3JwIFwiIGFsbCBsYW5kIG9uIGBhY21lIGNvcnBgLiBUaGF0IGlzIHRoZVxuICAgICAgLy8gd2hvbGUgdHJhbnNmb3JtOiBub3JtYWxpemUtdGhlbi1FWEFDVC4gRnV6enkgbWF0Y2hpbmcgaXMgb3V0IG9mIHNjb3BlXG4gICAgICAvLyAoc2VlIHRoZSBmaWVsZCdzIGRvYyBjb21tZW50IG9uIGBjcm1fYWNjb3VudGApLlxuICAgICAgLy9cbiAgICAgIC8vIFJlY29tcHV0ZSBPTkxZIHdoZW4gdGhlIHdyaXRlIGNhcnJpZXMgdGhlIG5hbWUgXHUyMDE0IGEgcGFydGlhbCB1cGRhdGUgdGhhdFxuICAgICAgLy8gbmV2ZXIgbWVudGlvbnMgYG5hbWVgIG11c3QgbGVhdmUgdGhlIGtleSBhbG9uZSwgb3IgZXZlcnkgdW5yZWxhdGVkIGVkaXRcbiAgICAgIC8vIHdvdWxkIGJsYW5rIGl0IGFuZCBtYWtlIHRoZSBhY2NvdW50IGludmlzaWJsZSB0byBjb252ZXJzaW9uLiBgbmFtZWAgaXNcbiAgICAgIC8vIHJlcXVpcmVkICsgbm90TnVsbCwgc28gb24gaW5zZXJ0IGl0IGlzIGFsd2F5cyBwcmVzZW50OyB0aGUgbnVsbCBicmFuY2hcbiAgICAgIC8vIGlzIGZvciBhIHdoaXRlc3BhY2Utb25seSB2YWx1ZSB0aGUgdmFsaWRhdG9yIHdvdWxkIHJlamVjdCBhbnl3YXkuXG4gICAgICAvL1xuICAgICAgLy8gV3JpdHRlbiBpbmxpbmUsIG5vdCBhcyBhIG1vZHVsZS1zY29wZSBoZWxwZXIsIGZvciB0aGUgc2FtZSByZWFzb24gYXNcbiAgICAgIC8vIHRoZSBibG9jayBhYm92ZTogaG9vayBib2RpZXMgbG93ZXIgdG8gbWV0YWRhdGEtb25seSAobm8gZnJlZVxuICAgICAgLy8gaWRlbnRpZmllcnMpLCB3aGljaCBgdGVzdC9hY3Rpb24tc2FuZGJveC50ZXN0LnRzYCBlbmZvcmNlcy5cbiAgICAgIGlmICgnbmFtZScgaW4gaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcmF3TmFtZSA9IGlucHV0Lm5hbWU7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID1cbiAgICAgICAgICB0eXBlb2YgcmF3TmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgID8gcmF3TmFtZS50cmltKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICcgJylcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIGlucHV0Lm5hbWVfbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWROYW1lID09PSAnJyA/IG51bGwgOiBub3JtYWxpemVkTmFtZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdGFtcCBsYXN0X2FjdGl2aXR5X2RhdGUgd2hlbiBvd25lcnNoaXAgb3IgdHlwZSBjaGFuZ2VzLlxuICAgIC8vIFVTRVIgd3JpdGVzIG9ubHkgKGBjdHgudXNlcj8uaWRgIFx1MjAxNCB0aGlzIHJlcG8ncyBzeXN0ZW0td3JpdGUgc2lnbmFsLCBjZi5cbiAgICAvLyBvcHBvcnR1bml0eS9xdW90ZSBob29rcyk6IHRoZSBwbGF0Zm9ybSdzIHNlZWQtb3duZXJzaGlwIGNsYWltIHJlLW93bnNcbiAgICAvLyBvd25lcmxlc3Mgc2VlZGVkIGFjY291bnRzIGFzIGEgc3lzdGVtIHdyaXRlICh0aGUgcmV0aXJlZCBgZGVtb19ib290c3RyYXBgXG4gICAgLy8gc3dlZXAgZGlkIHRoZSBzYW1lIGV2ZXJ5IDEwIG1pbnV0ZXMpLCBhbmQgc3RhbXBpbmcgdGhvc2UgZmxhdHRlbmVkIGV2ZXJ5XG4gICAgLy8gc2VlZGVkIGFjdGl2aXR5IGRhdGUgdG8gXCJ0b2RheVwiLCBlbXB0eWluZyB0aGUgY2h1cm4gcmVwb3J0IGJ1Y2tldHMuXG4gICAgLy8gRDMgc3RhbmQtZG93biBvbiB0aGUgcHJlZGljYXRlIHBhdGggKGBmb3JlY2FzdC5ob29rLnRzYCk6IGBvd25lckNoYW5nZWRgXG4gICAgLy8gLyBgdHlwZUNoYW5nZWRgIGFyZSBkZWNpZGVkIGFnYWluc3QgVEhJUyByb3cncyBgcHJldmlvdXNgLCBzbyB0aGUgc3RhbXBcbiAgICAvLyB3b3VsZCBzcHJlYWQgdG8gZXZlcnkgbWF0Y2hlZCByb3cuIFRoZSBgYmlsbGluZ19jb3VudHJ5YCAvIGB0ZXJyaXRvcnlgIC9cbiAgICAvLyBgbmFtZV9ub3JtYWxpemVkYCBub3JtYWxpc2F0aW9uIGFib3ZlIHJlYWRzIG9ubHkgdGhlIHBheWxvYWQgYW5kIHN0YXlzLlxuICAgIGlmIChldmVudCA9PT0gJ2JlZm9yZVVwZGF0ZScgJiYgY3R4LnVzZXI/LmlkICYmIGN0eC5kaXNwYXRjaD8ubW9kZSAhPT0gJ3Blci1yb3cnKSB7XG4gICAgICBjb25zdCBwcmV2ID0gY3R4LnByZXZpb3VzID8/IHt9O1xuICAgICAgY29uc3Qgb3duZXJDaGFuZ2VkID0gdHlwZW9mIGlucHV0Lm93bmVyX2lkICE9PSAndW5kZWZpbmVkJyAmJiBpbnB1dC5vd25lcl9pZCAhPT0gcHJldi5vd25lcl9pZDtcbiAgICAgIGNvbnN0IHR5cGVDaGFuZ2VkID0gdHlwZW9mIGlucHV0LnR5cGUgIT09ICd1bmRlZmluZWQnICYmIGlucHV0LnR5cGUgIT09IHByZXYudHlwZTtcbiAgICAgIGlmIChvd25lckNoYW5nZWQgfHwgdHlwZUNoYW5nZWQpIHtcbiAgICAgICAgaW5wdXQubGFzdF9hY3Rpdml0eV9kYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVEZWxldGUnKSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICAgIGlmICghcHJldmlvdXMgfHwgcHJldmlvdXMudHlwZSAhPT0gJ2N1c3RvbWVyJykgcmV0dXJuO1xuICAgICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFhcGkpIHJldHVybjtcbiAgICAgIC8vIEVWRVJZIG9wcG9ydHVuaXR5LCBjbG9zZWQgb25lcyBpbmNsdWRlZCAoIzIwMTkpLiBBIGNsb3NlZCBkZWFsIGlzIHRoZVxuICAgICAgLy8gYWNjb3VudCdzIHNhbGVzIGhpc3RvcnkgXHUyMDE0IHRoZSB3b24gYW5kIGxvc3QgYW1vdW50cyBpdHMgcm9sbHVwcyxcbiAgICAgIC8vIGZvcmVjYXN0cyBhbmQgd2luIHJhdGVzIGFyZSByZWFkIGZyb20gXHUyMDE0IGFuZCB0aGUgYXBwIGtlZXBzIGl0OiB0aGVcbiAgICAgIC8vIGBjcm1fb3Bwb3J0dW5pdHkuY3JtX2FjY291bnRgIGxvb2t1cCBpcyByZXF1aXJlZCBhbmQgZG9lcyBub3QgY2FzY2FkZSxcbiAgICAgIC8vIHNvIHRoZSBlbmdpbmUgcmVmdXNlcyB0aGUgZGVsZXRlIHdoaWxlIEFOWSBkZWFsIG5hbWVzIHRoZSBhY2NvdW50LCBhbmRcbiAgICAgIC8vIGBvcHBvcnR1bml0eV9saWZlY3ljbGVgIGZyZWV6ZXMgYSBjbG9zZWQgZGVhbCBhZ2FpbnN0IGJlaW5nIG1vdmVkIHRvXG4gICAgICAvLyBhbm90aGVyIGFjY291bnQuIFRoaXMgZ3VhcmQgdXNlZCB0byBjb3VudCBvcGVuIGRlYWxzIG9ubHkgYW5kIHRlbGwgdGhlXG4gICAgICAvLyB1c2VyIHRvIFwiQ2xvc2Ugb3IgcmVhc3NpZ24gaXQgZmlyc3RcIjsgY2xvc2luZyBpdCB3YXMgYW5zd2VyZWQgYnkgdGhlXG4gICAgICAvLyBlbmdpbmUncyBvd24gcmVmdXNhbCBhbGwgdGhlIHNhbWUuIFNvIHRoZSBjb3VudCBpcyB0aGUgZW5naW5lJ3MsIGFuZFxuICAgICAgLy8gdGhlIHNlbnRlbmNlIG5hbWVzIHdoYXQgZnJlZXMgdGhlIGFjY291bnQgZm9yIGV2ZXJ5IGRlYWwgaXQgY291bnRzIFx1MjAxNFxuICAgICAgLy8gZGVsZXRpbmcgaXQgKGFuIG9wZW4gZGVhbCBjb3VsZCBhbHNvIGJlIG1vdmVkOyBhIGNsb3NlZCBvbmUgY2Fubm90KSBcdTIwMTRcbiAgICAgIC8vIGFuZCB0aGUgd2F5IHRvIHJldGlyZSBhIGN1c3RvbWVyIHRoYXQga2VlcHMgaXRzIGhpc3Rvcnk6IHRoZSBhY2NvdW50XG4gICAgICAvLyBnb2VzIGluYWN0aXZlLCBhcyBgcHJvZHVjdF9jYXRhbG9nYCByZXRpcmVzIGEgcHJvZHVjdCB3aXRoIGEgaGlzdG9yeS5cbiAgICAgIGNvbnN0IG9wcG9ydHVuaXRpZXMgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fb3Bwb3J0dW5pdHknKS5jb3VudCh7XG4gICAgICAgIHdoZXJlOiB7IGNybV9hY2NvdW50OiBwcmV2aW91cy5pZCB9LFxuICAgICAgfSk7XG4gICAgICBpZiAob3Bwb3J0dW5pdGllcyA+IDApIHtcbiAgICAgICAgLy8gV2hvbGUgc2VudGVuY2UgcGVyIGJyYW5jaCwgbm90IGEgc3RpdGNoZWQtdG9nZXRoZXIgbm91biAoIzcyMSkuIFRoZVxuICAgICAgICAvLyBjb3VudCBzd2l0Y2hlZCB0aGUgTk9VTiBvbmx5IChgb3Bwb3J0dW5pdHt5LGllc31gKSB3aGlsZSB0aGUgdmVyYiBhbmRcbiAgICAgICAgLy8gdGhlIGNsb3NpbmcgcHJvbm91biBzdGF5ZWQgcGx1cmFsLCBzbyB0aGUgc2luZ3VsYXIgY2FzZSByZWFkXG4gICAgICAgIC8vIFwiMSBvcGVuIG9wcG9ydHVuaXR5IHN0aWxsIHJlZmVyZW5jZSBpdC4gQ2xvc2Ugb3IgcmVhc3NpZ24gdGhlbVxuICAgICAgICAvLyBmaXJzdC5cIiBBZ3JlZW1lbnQgcnVucyBhY3Jvc3MgdGhyZWUgd29yZHMgaGVyZSBcdTIwMTQgbm91biwgdmVyYiBhbmRcbiAgICAgICAgLy8gcHJvbm91biBcdTIwMTQgYW5kIHRoZSB0d28gcmVhZGFibGUgc2VudGVuY2VzIGFyZSBjaGVhcGVyIHRvIGtlZXAgY29ycmVjdFxuICAgICAgICAvLyAoYW5kIHRvIGdyZXAgZm9yKSB0aGFuIHRocmVlIGludGVybG9ja2luZyBjb25kaXRpb25hbHMuXG4gICAgICAgIHRocm93IHJlZnVzZShcbiAgICAgICAgICBvcHBvcnR1bml0aWVzID09PSAxXG4gICAgICAgICAgICA/ICdDYW5ub3QgZGVsZXRlIGN1c3RvbWVyIGFjY291bnQ6IDEgb3Bwb3J0dW5pdHksIG9wZW4gb3IgY2xvc2VkLCBzdGlsbCByZWZlcmVuY2VzIGl0LiBEZWxldGUgdGhlIG9wcG9ydHVuaXR5IGZpcnN0LCBvciBtYXJrIHRoZSBhY2NvdW50IGluYWN0aXZlIHRvIHJldGlyZSBpdCBpbnN0ZWFkLidcbiAgICAgICAgICAgIDogYENhbm5vdCBkZWxldGUgY3VzdG9tZXIgYWNjb3VudDogJHtvcHBvcnR1bml0aWVzfSBvcHBvcnR1bml0aWVzLCBvcGVuIG9yIGNsb3NlZCwgc3RpbGwgcmVmZXJlbmNlIGl0LiBEZWxldGUgdGhlIG9wcG9ydHVuaXRpZXMgZmlyc3QsIG9yIG1hcmsgdGhlIGFjY291bnQgaW5hY3RpdmUgdG8gcmV0aXJlIGl0IGluc3RlYWQuYCxcbiAgICAgICAgICAnREVMRVRFX1JFU1RSSUNURUQnLFxuICAgICAgICAgIDQwOSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vIGBjcm1fY29udHJhY3RgIGlzIG1hc3Rlci1kZXRhaWwgdW5kZXIgdGhlIGFjY291bnQgKCM1NDkpLCBzbyBhIGRlbGV0ZVxuICAgICAgLy8gd291bGQgY2FzY2FkZSB0aGUgc2lnbmVkIGFncmVlbWVudHMgYXdheS4gQWN0aXZhdGVkID0gbGl2ZSAodGhlIHNhbWVcbiAgICAgIC8vIGRlZmluaXRpb24gYGNvbnRhY3RfaW50ZWdyaXR5YCB1c2VzKTsgZHJhZnRzIGFuZCBlbmRlZCBjb250cmFjdHMgZ28uXG4gICAgICBjb25zdCBhY3RpdmVDb250cmFjdHMgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fY29udHJhY3QnKS5jb3VudCh7XG4gICAgICAgIHdoZXJlOiB7IGNybV9hY2NvdW50OiBwcmV2aW91cy5pZCwgc3RhdHVzOiAnYWN0aXZhdGVkJyB9LFxuICAgICAgfSk7XG4gICAgICBpZiAoYWN0aXZlQ29udHJhY3RzID4gMCkge1xuICAgICAgICB0aHJvdyByZWZ1c2UoXG4gICAgICAgICAgYWN0aXZlQ29udHJhY3RzID09PSAxXG4gICAgICAgICAgICA/ICdDYW5ub3QgZGVsZXRlIGN1c3RvbWVyIGFjY291bnQ6IDEgYWN0aXZhdGVkIGNvbnRyYWN0IHN0aWxsIHJlZmVyZW5jZXMgaXQuIFRlcm1pbmF0ZSBvciByZWFzc2lnbiBpdCBmaXJzdC4nXG4gICAgICAgICAgICA6IGBDYW5ub3QgZGVsZXRlIGN1c3RvbWVyIGFjY291bnQ6ICR7YWN0aXZlQ29udHJhY3RzfSBhY3RpdmF0ZWQgY29udHJhY3RzIHN0aWxsIHJlZmVyZW5jZSBpdC4gVGVybWluYXRlIG9yIHJlYXNzaWduIHRoZW0gZmlyc3QuYCxcbiAgICAgICAgICAnREVMRVRFX1JFU1RSSUNURUQnLFxuICAgICAgICAgIDQwOSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBhY2NvdW50SG9vaztcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvY29udGFjdC5ob29rLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0cy9jb250YWN0Lmhvb2sudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB0eXBlIHsgSG9va0FwaSB9IGZyb20gJy4vX2hvb2stYXBpJztcblxuLyoqXG4gKiBDb250YWN0IGludGVncml0eSBob29rLlxuICpcbiAqIC0gT24gaW5zZXJ0L3VwZGF0ZSwgZGVkdXBlcyBieSBgZW1haWxgIFdJVEhJTiBUSEUgT1JHQU5JWkFUSU9OIFx1MjAxNCBtYXRjaGluZ1xuICogICB0aGUgY29uc3RyYWludCB0aGUgc2NoZW1hIGFjdHVhbGx5IGRlY2xhcmVzLiBgY3JtX2NvbnRhY3QuZW1haWxgIGNhcnJpZXNcbiAqICAgZmllbGQtbGV2ZWwgYHVuaXF1ZTogdHJ1ZWAsIHdoaWNoIG1hdGVyaWFsaXplcyBhcyB0aGUgdGVuYW50IGNvbXBvc2l0ZVxuICogICBgKG9yZ2FuaXphdGlvbl9pZCwgZW1haWwpYCAoZnJhbWV3b3JrIzM2OTYpLCBzbyB0aGUgYWRkcmVzcyBpcyB1bmlxdWVcbiAqICAgYWNyb3NzIGV2ZXJ5IGFjY291bnQgb2Ygb25lIG9yZ2FuaXphdGlvbiBhbmQgdHdvIG9yZ2FuaXphdGlvbnMgbWF5IGVhY2hcbiAqICAga25vdyB0aGUgc2FtZSBwZXJzb24uIFRoZSBsb29rdXAgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhY2NvdW50LXNjb3BlZCAodGhlXG4gKiAgIG9sZCBwZXItYWNjb3VudCBsb29rdXAgbGV0IGEgY3Jvc3MtYWNjb3VudCBkdXBsaWNhdGUgc2FpbCBwYXN0IHRoZVxuICogICBmcmllbmRseSBjaGVjayBhbmQgZXhwbG9kZSBvbiB0aGUgREIgaW5kZXggaW5zdGVhZCwgbWlkLWNvbnZlcnNpb24pIFx1MjAxNCBidXRcbiAqICAgaXQgbXVzdCBub3QgcmVhY2ggQUNST1NTIG9yZ2FuaXphdGlvbnMgZWl0aGVyLlxuICpcbiAqICAgIyMgV2hhdCBhbiB1bnNjb3BlZCBsb29rdXAgY29zdCwgYXMgbWVhc3VyZWRcbiAqXG4gKiAgIGBjdHguYXBpYCByZWFkcyBhcmUgbm90IG9yZ2FuaXphdGlvbi1zY29wZWQgZm9yIGV2ZXJ5IGNhbGxlcjogdGhlIHNlZWRcbiAqICAgbG9hZGVyIHJlcGxheXMgYSBkYXRhc2V0IHBlciBvcmdhbml6YXRpb24gYXMgYSBTWVNURU0gd3JpdGUsIGFuZCBhblxuICogICB1bnNjb3BlZCBgZmluZE9uZSh7IHdoZXJlOiB7IGVtYWlsIH0gfSlgIGZyb20gaW5zaWRlIHRoYXQgcmVwbGF5IG1lZXRzIHRoZVxuICogICBGSVJTVCBvcmdhbml6YXRpb24ncyBjb250YWN0cy4gT24gdGhlIGRlcGxveW1lbnQgc2hhcGUgd2hlcmUgbWFueVxuICogICBvcmdhbml6YXRpb25zIHNoYXJlIG9uZSBkYXRhYmFzZSwgdGhlIHNlY29uZCBvcmdhbml6YXRpb24ncyByZXBsYXkgd2FzXG4gKiAgIHJlZnVzZWQgcm93IGJ5IHJvdyBcdTIwMTQgYEFub3RoZXIgY29udGFjdCAoXHUyMDI2KSB3aXRoIGVtYWlsXG4gKiAgIGpvaG4uc21pdGhAYWNtZS5leGFtcGxlLmNvbSBhbHJlYWR5IGV4aXN0cy5gIFx1MjAxNCBsYW5kaW5nIDAgb2YgOSBjb250YWN0c1xuICogICBhbmQsIGJlY2F1c2UgYGNybV9jb250cmFjdGAgcmVxdWlyZXMgb25lLCAwIG9mIDQgY29udHJhY3RzLCBwbHVzXG4gKiAgIGhhbGYtcG9wdWxhdGVkIHF1b3RlcywgcXVvdGUgbGluZSBpdGVtcywgY2FtcGFpZ24gbWVtYmVycyBhbmQgZXZlbnRcbiAqICAgYXR0ZW5kZWVzLiBOb3RoaW5nIGxlYWtlZDsgdGhlIHRlbmFudCB3YWxsIGhlbGQuIFRoZSBkYXRhIG5ldmVyIGFycml2ZWQuXG4gKlxuICogICBUaGUgb3JnYW5pemF0aW9uIGlzIHRoZXJlZm9yZSByZXNvbHZlZCBiZWZvcmUgdGhlIGxvb2t1cCwgaW4gdGhlIGJsZXNzZWRcbiAqICAgb3JkZXI6IHRoZSBhY3RpbmcgdXNlcidzIGFjdGl2ZSBvcmdhbml6YXRpb24gZmlyc3QgKGB1c2VyLm9yZ2FuaXphdGlvbklkYFxuICogICA9PT0gYHNlc3Npb24ub3JnYW5pemF0aW9uSWRgID09PSB0aGUgYG9yZ2FuaXphdGlvbl9pZGAgY29sdW1uID09PSBSTFMnc1xuICogICBgY3VycmVudF91c2VyLm9yZ2FuaXphdGlvbklkYCksIHRoZW4gdGhlIHJvdydzIG93biBzdGFtcCwgd2hpY2ggaXMgd2hhdCBhXG4gKiAgIHN5c3RlbSB3cml0ZSBjYXJyaWVzIHdoZW4gbm8gc2Vzc2lvbiBkb2VzLiBSZXNvbHZlZDogc2NvcGUgdGhlIGxvb2t1cC5cbiAqICAgVW5yZXNvbHZhYmxlIG9uIGEgc3lzdGVtIHdyaXRlOiBza2lwIHRoZSBmcmllbmRseSBndWFyZCBhbmQgbGV0IHRoZVxuICogICBgKG9yZ2FuaXphdGlvbl9pZCwgZW1haWwpYCBpbmRleCBlbmZvcmNlLiBVbnJlc29sdmFibGUgZm9yIGEgVVNFUiB3cml0ZTpcbiAqICAgYW4gdW50ZW5hbnRlZCAoY29tbXVuaXR5KSBpbnN0YWxsLCB3aGVyZSB0aGUgb2xkIGdsb2JhbCBsb29rdXAgaXMgcmlnaHQuXG4gKiAtIE9uIGRlbGV0ZSwgcmVmdXNlcyBpZiB0aGUgY29udGFjdCBpcyByZWZlcmVuY2VkIGJ5IGFuIGFjdGl2ZSBvcHBvcnR1bml0eSxcbiAqICAgb3BlbiBxdW90ZSBvciBhY3RpdmUgY29udHJhY3QuXG4gKlxuICogXHUyNkQ0IE5vIGVtYWlsL3Bob25lIHByb3BhZ2F0aW9uIHRvIG9wcG9ydHVuaXRpZXM6IGBjcm1fb3Bwb3J0dW5pdHlgIGhhcyBub1xuICogYGNvbnRhY3RfZW1haWxgIC8gYGNvbnRhY3RfcGhvbmVgIGNvbHVtbnMsIGFuZCBhIHJvbGx1cCB3cml0aW5nIG5vbmV4aXN0ZW50XG4gKiBmaWVsZHMgaXMgc2lsZW50bHkgc3dhbGxvd2VkLiBPcHBvcnR1bml0aWVzIHJlYWNoIHRoZSBsaXZlIHZhbHVlcyB0aHJvdWdoXG4gKiB0aGVpciBgcHJpbWFyeV9jb250YWN0YCBsb29rdXAuXG4gKi9cblxuY29uc3QgY29udGFjdEhvb2s6IEhvb2sgPSB7XG4gIG5hbWU6ICdjb250YWN0X2ludGVncml0eScsXG4gIG9iamVjdDogJ2NybV9jb250YWN0JyxcbiAgZXZlbnRzOiBbJ2JlZm9yZUluc2VydCcsICdiZWZvcmVVcGRhdGUnLCAnYmVmb3JlRGVsZXRlJ10sXG4gIHByaW9yaXR5OiAyMDAsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdEZWR1cGUgY29udGFjdHMgYnkgZW1haWwgYW5kIHByb3RlY3QgcmVmZXJlbmNlZCBjb250YWN0cyBmcm9tIGRlbGV0aW9uLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgLy8gVGhlIHJlZnVzYWwgZW52ZWxvcGUgKCMxMDc1KS4gTWlycm9yZWQgZnJvbSBgLi9fcmVmdXNhbC50c2AgYmVjYXVzZSBhXG4gICAgLy8gbG93ZXJlZCBib2R5IGhhcyBubyBtb2R1bGUgc2NvcGUgYW5kIGBleHRyYWN0SG9va0JvZHlgIFRIUk9XUyBvbiBhblxuICAgIC8vIGltcG9ydDsgYHRlc3QvcmVmdXNhbC1lbnZlbG9wZS50ZXN0LnRzYCBwaW5zIGV2ZXJ5IGNvcHkgYWdhaW5zdCBpdC5cbiAgICBmdW5jdGlvbiByZWZ1c2UoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb2RlOiBzdHJpbmcsXG4gICAgICBzdGF0dXM6IG51bWJlcixcbiAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmcgPSBtZXNzYWdlLFxuICAgICk6IEVycm9yIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29kZTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZztcbiAgICAgIH07XG4gICAgICBlcnIuY29kZSA9IGNvZGU7XG4gICAgICBlcnIuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgZXJyLnVzZXJNZXNzYWdlID0gdXNlck1lc3NhZ2U7XG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjb25zdCB7IGV2ZW50LCBpbnB1dCB9ID0gY3R4O1xuICAgIGNvbnN0IGFwaSA9IGN0eC5hcGkgYXMgSG9va0FwaSB8IHVuZGVmaW5lZDtcblxuICAgIGlmICgoZXZlbnQgPT09ICdiZWZvcmVJbnNlcnQnIHx8IGV2ZW50ID09PSAnYmVmb3JlVXBkYXRlJykgJiYgYXBpKSB7XG4gICAgICBjb25zdCBlbWFpbCA9IHR5cGVvZiBpbnB1dC5lbWFpbCA9PT0gJ3N0cmluZycgPyBpbnB1dC5lbWFpbC50b0xvd2VyQ2FzZSgpIDogJyc7XG4gICAgICBpZiAoZW1haWwpIHtcbiAgICAgICAgaW5wdXQuZW1haWwgPSBlbWFpbDtcbiAgICAgICAgLy8gU2NvcGUgdGhlIGd1YXJkIHRvIHRoZSBvcmdhbml6YXRpb24gdGhlIHdyaXRlIGJlbG9uZ3MgdG8sIHNvIGl0IGlzXG4gICAgICAgIC8vIGV4YWN0bHkgYXMgc3RyaWN0IGFzIHRoZSBgKG9yZ2FuaXphdGlvbl9pZCwgZW1haWwpYCBpbmRleCBpdCBmaXJlc1xuICAgICAgICAvLyBhaGVhZCBvZiBcdTIwMTQgbm8gc3RyaWN0ZXIuIEFuIHVucmVzb2x2YWJsZSBvcmdhbml6YXRpb24gb24gYSBTWVNURU1cbiAgICAgICAgLy8gd3JpdGUgKG5vIGBjdHgudXNlcmApIG1lYW5zIHRoZSBjYWxsZXIgaXMgdGhlIHNlZWQgbG9hZGVyIG9yIGFcbiAgICAgICAgLy8gYmFja2ZpbGw6IHNraXAgdGhlIGZyaWVuZGx5IGd1YXJkIHJhdGhlciB0aGFuIHJ1biBpdCB1bnNjb3BlZCwgYW5kXG4gICAgICAgIC8vIGxldCB0aGUgZGF0YWJhc2UgY29uc3RyYWludCBiZSB0aGUgZW5mb3JjZW1lbnQuIFJ1bm5pbmcgaXQgdW5zY29wZWRcbiAgICAgICAgLy8gdGhlcmUgaXMgd2hhdCBzdGFydmVkIGV2ZXJ5IG9yZ2FuaXphdGlvbiBhZnRlciB0aGUgZmlyc3Qgb2YgaXRzXG4gICAgICAgIC8vIGNvbnRhY3RzLlxuICAgICAgICBjb25zdCBvcmdhbml6YXRpb25JZCA9IFtcbiAgICAgICAgICBjdHgudXNlcj8ub3JnYW5pemF0aW9uSWQsXG4gICAgICAgICAgY3R4LnNlc3Npb24/Lm9yZ2FuaXphdGlvbklkLFxuICAgICAgICAgIGlucHV0Lm9yZ2FuaXphdGlvbl9pZCxcbiAgICAgICAgICBjdHgucHJldmlvdXM/Lm9yZ2FuaXphdGlvbl9pZCxcbiAgICAgICAgXS5maW5kKChjYW5kaWRhdGUpOiBjYW5kaWRhdGUgaXMgc3RyaW5nID0+IHR5cGVvZiBjYW5kaWRhdGUgPT09ICdzdHJpbmcnICYmIGNhbmRpZGF0ZSAhPT0gJycpO1xuICAgICAgICBpZiAob3JnYW5pemF0aW9uSWQgfHwgY3R4LnVzZXI/LmlkKSB7XG4gICAgICAgICAgY29uc3QgZHVwID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2NvbnRhY3QnKS5maW5kT25lKHtcbiAgICAgICAgICAgIHdoZXJlOiBvcmdhbml6YXRpb25JZCA/IHsgb3JnYW5pemF0aW9uX2lkOiBvcmdhbml6YXRpb25JZCwgZW1haWwgfSA6IHsgZW1haWwgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBkdXBSb3cgPSBkdXAgYXNcbiAgICAgICAgICAgIHwgeyBpZD86IHN0cmluZzsgZmlyc3RfbmFtZT86IHVua25vd247IGxhc3RfbmFtZT86IHVua25vd24gfVxuICAgICAgICAgICAgfCBudWxsO1xuICAgICAgICAgIGNvbnN0IGR1cElkID0gZHVwUm93Py5pZDtcbiAgICAgICAgICBjb25zdCBzZWxmSWQgPSBjdHgucHJldmlvdXM/LmlkID8/IGlucHV0LmlkO1xuICAgICAgICAgIGlmIChkdXAgJiYgZHVwSWQgIT09IHNlbGZJZCkge1xuICAgICAgICAgICAgLy8gTmFtZSB0aGUgY29sbGlkaW5nIGNvbnRhY3QsIG5vdCBpdHMgcHJpbWFyeSBrZXkgKCMxMjQzLCB0aGUgc2FtZVxuICAgICAgICAgICAgLy8gY2xhc3MgIzEyMDggY2xvc2VkIG9uIHRoZSBlc2NhbGF0aW9uIHRhc2spLiBUaGlzIHJlZnVzYWwgaXMgcmVhZFxuICAgICAgICAgICAgLy8gYnkgYSByZXAgaW4gYSBkaWFsb2cgYXQgdGhlIG1vbWVudCB0aGVpciBzYXZlIGlzIGJsb2NrZWQsIGFuZCB0aGVcbiAgICAgICAgICAgIC8vIG9uZSBhY3Rpb25hYmxlIHRoaW5nIGl0IGNhbiBzYXkgaXMgV0hPU0UgcmVjb3JkIGFscmVhZHkgaG9sZHMgdGhlXG4gICAgICAgICAgICAvLyBhZGRyZXNzLiBUaGUgaWQgd2FzIHRoZSBvcHBvc2l0ZSBvZiB0aGF0OiBhIDE2LWNoYXJhY3RlciBzdHJpbmdcbiAgICAgICAgICAgIC8vIHRoYXQgYXBwZWFycyBvbiBubyBzY3JlZW4gaW4gdGhpcyBhcHAgYW5kIGNhbm5vdCBiZSBwYXN0ZWQgaW50b1xuICAgICAgICAgICAgLy8gc2VhcmNoLiBgZnVsbF9uYW1lYCBpcyBgY3JtX2NvbnRhY3QubmFtZUZpZWxkYCwgYW5kIGl0IGlzIGNvbXBvc2VkXG4gICAgICAgICAgICAvLyBmcm9tIHRoZSBzYW1lIHR3byBzdG9yZWQgY29sdW1ucyBoZXJlIFx1MjAxNCBhIGxvd2VyZWQgaG9vayBib2R5IGNhbm5vdFxuICAgICAgICAgICAgLy8gcmVhZCBhIGZvcm11bGEgZmllbGQuIE5vIHNlY29uZCByZWFkIHBheXMgZm9yIGl0OiB0aGUgYGZpbmRPbmVgXG4gICAgICAgICAgICAvLyBhYm92ZSBjYXJyaWVzIG5vIHByb2plY3Rpb24sIHNvIHRoZSB3aG9sZSByb3cgaXMgYWxyZWFkeSBpbiBoYW5kLlxuICAgICAgICAgICAgY29uc3QgZHVwTmFtZSA9IFtkdXBSb3c/LmZpcnN0X25hbWUsIGR1cFJvdz8ubGFzdF9uYW1lXVxuICAgICAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiB0eXBlb2YgcGFydCA9PT0gJ3N0cmluZycgJiYgcGFydC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAuam9pbignICcpO1xuICAgICAgICAgICAgdGhyb3cgcmVmdXNlKFxuICAgICAgICAgICAgICBkdXBOYW1lXG4gICAgICAgICAgICAgICAgPyBgQW5vdGhlciBjb250YWN0ICgke2R1cE5hbWV9KSB3aXRoIGVtYWlsICR7ZW1haWx9IGFscmVhZHkgZXhpc3RzLmBcbiAgICAgICAgICAgICAgICA6IGBBbm90aGVyIGNvbnRhY3Qgd2l0aCBlbWFpbCAke2VtYWlsfSBhbHJlYWR5IGV4aXN0cy5gLFxuICAgICAgICAgICAgICAnRFVQTElDQVRFX1ZBTFVFJyxcbiAgICAgICAgICAgICAgNDA5LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVEZWxldGUnICYmIGFwaSkge1xuICAgICAgY29uc3QgaWQgPSBjdHgucHJldmlvdXM/LmlkO1xuICAgICAgaWYgKCFpZCkgcmV0dXJuO1xuICAgICAgY29uc3QgW29wZW5PcHBzLCBvcGVuUXVvdGVzLCBhY3RpdmVDb250cmFjdHNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBhcGkub2JqZWN0KCdjcm1fb3Bwb3J0dW5pdHknKS5jb3VudCh7XG4gICAgICAgICAgd2hlcmU6IHsgcHJpbWFyeV9jb250YWN0OiBpZCwgc3RhZ2U6IHsgJG5pbjogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfSB9LFxuICAgICAgICB9KSxcbiAgICAgICAgYXBpLm9iamVjdCgnY3JtX3F1b3RlJykuY291bnQoe1xuICAgICAgICAgIHdoZXJlOiB7IGNybV9jb250YWN0OiBpZCwgc3RhdHVzOiB7ICRuaW46IFsncmVqZWN0ZWQnLCAnZXhwaXJlZCddIH0gfSxcbiAgICAgICAgfSksXG4gICAgICAgIGFwaS5vYmplY3QoJ2NybV9jb250cmFjdCcpLmNvdW50KHtcbiAgICAgICAgICB3aGVyZTogeyBjcm1fY29udGFjdDogaWQsIHN0YXR1czogJ2FjdGl2YXRlZCcgfSxcbiAgICAgICAgfSksXG4gICAgICBdKTtcbiAgICAgIGNvbnN0IHRvdGFsID0gb3Blbk9wcHMgKyBvcGVuUXVvdGVzICsgYWN0aXZlQ29udHJhY3RzO1xuICAgICAgaWYgKHRvdGFsID4gMCkge1xuICAgICAgICAvLyBQaHJhc2UgdGhlIHJlZnVzYWwgYXMgdGhlIEJMT0NLSU5HIFJFTEFUSU9OU0hJUCwgbm90IGFzIHRoZSBjYWxsZXInc1xuICAgICAgICAvLyBvcGVyYXRpb24gKCM2OTMpLiBUaGlzIGhvb2sgZmlyZXMgb24gYSBkaXJlY3RcbiAgICAgICAgLy8gYERFTEVURSAvY3JtX2NvbnRhY3QvPGlkPmAgQU5EIGFzIGEgY2FzY2FkZSBjaGlsZCBvZlxuICAgICAgICAvLyBgREVMRVRFIC9jcm1fYWNjb3VudC88aWQ+YCAoYGNybV9jb250YWN0LmNybV9hY2NvdW50YCBpcyBhXG4gICAgICAgIC8vIG1hc3Rlci1kZXRhaWwgd2l0aCBgZGVsZXRlQmVoYXZpb3I6ICdjYXNjYWRlJ2ApLCBhbmQgdGhlIGhvb2sgY29udGV4dFxuICAgICAgICAvLyBjYXJyaWVzIG5vdGhpbmcgdGhhdCBkaXN0aW5ndWlzaGVzIHRoZSB0d28gXHUyMDE0IG1lYXN1cmVkIG9uIDE3LjAuMC1yYy4yLFxuICAgICAgICAvLyBhIGNhc2NhZGVkIGBiZWZvcmVEZWxldGVgIGN0eCBob2xkcyBleGFjdGx5XG4gICAgICAgIC8vIHthcGksZXZlbnQsaW5wdXQsb2JqZWN0LHByZXZpb3VzLHByb3ZlbmFuY2UscWwsc2Vzc2lvbix0cmFuc2FjdGlvbix1c2VyfVxuICAgICAgICAvLyB3aXRoIG5vIGNhc2NhZGUgbWFya2VyLiBTbyBcIkNhbm5vdCBkZWxldGUgY29udGFjdFwiIHRvbGQgYW4gYWNjb3VudFxuICAgICAgICAvLyBkZWxldGVyIHRoYXQgdGhleSBoYWQgYXNrZWQgdG8gZGVsZXRlIGEgY29udGFjdCwgYW5kIHNlbnQgdGhlbVxuICAgICAgICAvLyBsb29raW5nIGZvciB0aGUgd3JvbmcgcmVjb3JkLiBOYW1pbmcgdGhlIGNvbnRhY3QgYW5kIGJvdGhcbiAgICAgICAgLy8gY29uc2VxdWVuY2VzIGlzIHRydWUgaW4gZWl0aGVyIGNvbnRleHQuXG4gICAgICAgIGNvbnN0IG5hbWUgPSBbY3R4LnByZXZpb3VzPy5maXJzdF9uYW1lLCBjdHgucHJldmlvdXM/Lmxhc3RfbmFtZV1cbiAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiB0eXBlb2YgcGFydCA9PT0gJ3N0cmluZycgJiYgcGFydC50cmltKCkgIT09ICcnKVxuICAgICAgICAgIC5qb2luKCcgJyk7XG4gICAgICAgIC8vIE5hbWVkLCBuZXZlciBrZXllZCAoIzEyNDMpLiBgaWRgIHN0aWxsIGRvZXMgdGhlIHdvcmsgaXQgaXMgZ29vZCBhdCBcdTIwMTRcbiAgICAgICAgLy8gaXQgaXMgd2hhdCB0aGUgdGhyZWUgY291bnRzIGFib3ZlIHdlcmUgcXVlcmllZCBieSBcdTIwMTQgYnV0IHRoZSBzZW50ZW5jZVxuICAgICAgICAvLyB0aGUgdXNlciByZWFkcyBuYW1lcyB0aGUgY29udGFjdCB0aGUgd2F5IGBuYW1lRmllbGRgIGRvZXMuIEEgY29udGFjdFxuICAgICAgICAvLyB3aXRoIG5vIG5hbWUgYXQgYWxsIGlzIHJlZmVycmVkIHRvLCBub3QgaWRlbnRpZmllZDogYSBiYXJlIGlkIHRvbGRcbiAgICAgICAgLy8gdGhlIHJlYWRlciBub3RoaW5nIHRoZXkgY291bGQgbG9vayB1cCBlaXRoZXIuXG4gICAgICAgIGNvbnN0IHN1YmplY3QgPSBuYW1lID8gYENvbnRhY3QgJHtuYW1lfWAgOiAnVGhpcyBjb250YWN0JztcbiAgICAgICAgLy8gV2hhdCBmcmVlcyB0aGUgY29udGFjdCBpcyBub3QgdGhlIHNhbWUgZm9yIHRoZSB0aHJlZSAoIzIwMTkpLiBBblxuICAgICAgICAvLyBvcHBvcnR1bml0eSdzIGBwcmltYXJ5X2NvbnRhY3RgIGFuZCBhIHF1b3RlJ3MgYGNybV9jb250YWN0YCBhcmVcbiAgICAgICAgLy8gb3B0aW9uYWwsIHNvIG9uY2UgdGhlIGRlYWwgb3IgcXVvdGUgaXMgc2V0dGxlZCB0aGUgZW5naW5lIGNsZWFycyB0aGVcbiAgICAgICAgLy8gbGluayBhbmQgdGhlIGRlbGV0ZSBsYW5kcy4gQSBjb250cmFjdCdzIGBjcm1fY29udGFjdGAgaXMgUkVRVUlSRUQ6IGFcbiAgICAgICAgLy8gY29udHJhY3Qga2VlcHMgaXRzIHByaW1hcnkgY29udGFjdCBmb3IgaXRzIHdob2xlIGxpZmUsIGVuZGVkIG9yIG5vdFxuICAgICAgICAvLyBcdTIwMTQgaXQgaXMgdGhlIGFjY291bnQncyBzaWduZWQgcmVjb3JkIGFuZCBpcyBrZXB0LCBzbyB0aGUgZW5naW5lXG4gICAgICAgIC8vIHJlZnVzZXMgdGhlIGRlbGV0ZSB3aGlsZSBBTlkgY29udHJhY3QgbmFtZXMgdGhlIGNvbnRhY3QuIFRoZSBvbGRcbiAgICAgICAgLy8gY2xvc2luZyBcIkNsb3NlIG9yIHJlYXNzaWduIHRob3NlIHJlY29yZHMgZmlyc3RcIiBzZW50IHRoZSB1c2VyIHRvXG4gICAgICAgIC8vIHRlcm1pbmF0ZSB0aGUgY29udHJhY3QsIGFmdGVyIHdoaWNoIHRoZSBlbmdpbmUgcmVmdXNlZCBhbGwgdGhlIHNhbWUuXG4gICAgICAgIC8vIFNvIHRoZSBzZW50ZW5jZSBzYXlzIHdoYXQgZnJlZXMgdGhlIGNvbnRhY3QgZnJvbSBhIGNvbnRyYWN0OiBhbm90aGVyXG4gICAgICAgIC8vIHByaW1hcnkgY29udGFjdCBvbiBpdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gXHUyNkQ0IFRoZSBDT1VOVCBzdGF5cyBgYWN0aXZhdGVkYCwgYW5kIHRoYXQgaXMgZGVsaWJlcmF0ZS4gVGhpcyBndWFyZCBhbHNvXG4gICAgICAgIC8vIHJ1bnMgaW5zaWRlIGFuIGFjY291bnQgZGVsZXRlICh0aGUgY2FzY2FkZSBhYm92ZSkgYW5kIGNhbm5vdCB0ZWxsIHRoZVxuICAgICAgICAvLyB0d28gYXBhcnQsIGFuZCBhbiBhY2NvdW50IGRlbGV0ZSB0YWtlcyBpdHMgZHJhZnQgYW5kIGVuZGVkIGNvbnRyYWN0c1xuICAgICAgICAvLyB3aXRoIGl0ICgjNTQ5LCBgYWNjb3VudF9wcm90ZWN0aW9uYCkuIENvdW50aW5nIHRob3NlIGhlcmUgd291bGQgbWFrZVxuICAgICAgICAvLyB0aGlzIGd1YXJkIHJlZnVzZSB0aGF0IGFjY291bnQgZGVsZXRlIGl0c2VsZiBcdTIwMTQgdG9kYXkgdGhlIGVuZ2luZVxuICAgICAgICAvLyBhbHJlYWR5IHJlZnVzZXMgaXQgb24gdGhlIGNhc2NhZGUncyBvcmRlciAob2JqZWN0c3RhY2sjMjIzMDUsIHBpbm5lZFxuICAgICAgICAvLyBpbiBgdGVzdC9ob29rcy1ydW50aW1lLXNhbGVzLnRlc3QudHNgKSwgYW5kIHRoYXQgaXMgdGhlIHBsYXRmb3JtJ3MgdG9cbiAgICAgICAgLy8gZml4LiBBbiBlbmRlZCBjb250cmFjdCBvbiBhIERJUkVDVCBjb250YWN0IGRlbGV0ZSBpcyByZWZ1c2VkIGJ5IHRoZVxuICAgICAgICAvLyBlbmdpbmUsIGluIGl0cyBvd24gd29yZHMgbmFtaW5nIHRoZSBjb250cmFjdC5cbiAgICAgICAgdGhyb3cgcmVmdXNlKFxuICAgICAgICAgIGAke3N1YmplY3R9IGlzIHN0aWxsIHJlZmVyZW5jZWQgYnkgJHtvcGVuT3Bwc30gb3BlbiBvcHBvcnR1bml0eShpZXMpLCAke29wZW5RdW90ZXN9IGFjdGl2ZSBxdW90ZShzKSwgJHthY3RpdmVDb250cmFjdHN9IGFjdGl2ZSBjb250cmFjdChzKSwgc28gaXQgY2Fubm90IGJlIGRlbGV0ZWQgXHUyMDE0IGFuZCBuZWl0aGVyIGNhbiBpdHMgYWNjb3VudCwgYmVjYXVzZSBkZWxldGluZyBhbiBhY2NvdW50IGRlbGV0ZXMgaXRzIGNvbnRhY3RzLiBDbG9zZSBvciByZWFzc2lnbiB0aGUgb3Bwb3J0dW5pdGllcyBhbmQgcXVvdGVzIGZpcnN0LCBhbmQgZ2l2ZSBlYWNoIGNvbnRyYWN0IGFub3RoZXIgcHJpbWFyeSBjb250YWN0OiBhIGNvbnRyYWN0IGtlZXBzIGl0cyBwcmltYXJ5IGNvbnRhY3QgZXZlbiBhZnRlciBpdCBlbmRzLmAsXG4gICAgICAgICAgJ0RFTEVURV9SRVNUUklDVEVEJyxcbiAgICAgICAgICA0MDksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29udGFjdEhvb2s7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2V2ZW50Lmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2V2ZW50Lmhvb2sudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB0eXBlIHsgSG9va0FwaSB9IGZyb20gJy4vX2hvb2stYXBpJztcblxuLyoqXG4gKiBFdmVudCBsaWZlY3ljbGUgaG9va3MgKCM1OTIpLlxuICpcbiAqIC0gYGV2ZW50X3NjaGVkdWxlX2Rlcml2ZWAga2VlcHMgYHN0YXJ0X2RhdGV0aW1lYCAvIGBlbmRfZGF0ZXRpbWVgIC9cbiAqICAgYGR1cmF0aW9uX21pbnV0ZXNgIG11dHVhbGx5IGNvbnNpc3RlbnQsIHNvIGEgY2FsZW5kYXIgdmlldyBhbmQgYSBkdXJhdGlvblxuICogICByZXBvcnQgY2Fubm90IGRpc2FncmVlIGFib3V0IHRoZSBzYW1lIHJvdy5cbiAqIC0gYGV2ZW50X2FjdGl2aXR5X2J1YmJsZWAgaXMgdGhlIGFwcCdzIFBSSU1BUlkgd3JpdGVyIG9mIGludGVyYWN0aW9uXG4gKiAgIHJlY2VuY3k6IGEgYGhlbGRgIGV2ZW50IHN0YW1wcyBgY3JtX2FjY291bnQubGFzdF9hY3Rpdml0eV9kYXRlYCxcbiAqICAgYGNybV9sZWFkLmxhc3RfY29udGFjdGVkX2RhdGVgIGFuZCBgY3JtX2NvbnRhY3QubGFzdF9jb250YWN0ZWRfZGF0ZWAsXG4gKiAgIHdhbGtpbmcgVVAgZnJvbSBhbiBvcHBvcnR1bml0eSAvIGNhc2UgLyBjb250YWN0IHRvIHRoZSBhY2NvdW50IGl0IGhhbmdzXG4gKiAgIG9mZi4gU2luY2UgIzU5NSBpdCBpcyBhbHNvIHRoZSBTSU5HTEUgd3JpdGVyIG9mXG4gKiAgIGBjcm1fY2FzZS5maXJzdF9yZXNwb25zZV9kYXRlYCAoc2VlIHRoZSBibG9jayBhdCB0aGUgZW5kIG9mIHRoZSBoYW5kbGVyKS5cbiAqXG4gKiAjIFdoeSB0aGUgd2Fsay11cCBtYXR0ZXJzXG4gKlxuICogYGF0X3Jpc2tfYWNjb3VudHNgIGFuZCBgY3VzdG9tZXJfY2h1cm5fc2lnbmFsc2AgYXJlIGJ1aWx0IG9uXG4gKiBgY3JtX2FjY291bnQubGFzdF9hY3Rpdml0eV9kYXRlYCwgYnV0IGEgcmVwIGxvZ3MgYSBjYWxsIG9uIHRoZSBPUFBPUlRVTklUWSBvclxuICogdGhlIENPTlRBQ1QgXHUyMDE0IGFsbW9zdCBuZXZlciBvbiB0aGUgYWNjb3VudCByb3cgaXRzZWxmLiBcdTI2RDQgQnViYmxpbmcgb25seSB0byB0aGVcbiAqIGRpcmVjdGx5LW5hbWVkIHJlY29yZCBsZWF2ZXMgdGhlIGFjY291bnQgY2xvY2sgdW50b3VjaGVkIHRocm91Z2ggYW4gZW50aXJlXG4gKiBzYWxlcyBjeWNsZSwgYW5kIHRoZSBjaHVybiByZXBvcnQgdGhlbiBjb3VudHMgYSBidXN5IGN1c3RvbWVyIGFzIHNpbGVudC4gVGhlXG4gKiB3YWxrLXVwIGlzIHRoZSB3aG9sZSByZWFzb24gdGhlIHNpZ25hbCBiZWNvbWVzIHJlYWwuXG4gKi9cblxuY29uc3QgZXZlbnRTY2hlZHVsZURlcml2ZTogSG9vayA9IHtcbiAgbmFtZTogJ2V2ZW50X3NjaGVkdWxlX2Rlcml2ZScsXG4gIG9iamVjdDogJ2NybV9ldmVudCcsXG4gIGV2ZW50czogWydiZWZvcmVJbnNlcnQnLCAnYmVmb3JlVXBkYXRlJ10sXG4gIHByaW9yaXR5OiAyMDAsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdLZWVwIHN0YXJ0L2VuZC9kdXJhdGlvbiBjb2hlcmVudDogZGVyaXZlIHdoaWNoZXZlciBvZiBlbmRfZGF0ZXRpbWUgb3IgZHVyYXRpb25fbWludXRlcyB3YXMgbm90IHN1cHBsaWVkLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgLy8gRDMgc3RhbmQtZG93bjogYSBwcmVkaWNhdGUgdXBkYXRlIGhhcyBPTkUgcGF5bG9hZCBmb3IgZXZlcnkgbWF0Y2hlZCByb3csXG4gICAgLy8gc28gdGhlIGBjdHgucHJldmlvdXNgLWNvbmRpdGlvbmVkIHdyaXRlcyBiZWxvdyB3b3VsZCBsYW5kIG9uIHJvd3MgdGhhdFxuICAgIC8vIGRpZCBub3QgZWFybiB0aGVtIFx1MjAxNCByZWZ1c2VkIGFzIGEgZGl2ZXJnaW5nIGtleSBzZXQsIG9yIHN0b3JlZCBzaWxlbnRseVxuICAgIC8vIGZyb20gdGhlIGxhc3Qgcm93LiBGdWxsIGFjY291bnQgYW5kIHRoZSBtZWFzdXJlbWVudDogYGZvcmVjYXN0Lmhvb2sudHNgLlxuICAgIGlmIChjdHguZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIGN0eC5kaXNwYXRjaD8ubW9kZSA9PT0gJ3Blci1yb3cnKSByZXR1cm47XG5cbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG5cbiAgICBjb25zdCBlZmZlY3RpdmUgPSAoa2V5OiBzdHJpbmcpOiB1bmtub3duID0+XG4gICAgICBpbnB1dFtrZXldICE9PSB1bmRlZmluZWQgJiYgaW5wdXRba2V5XSAhPT0gbnVsbCA/IGlucHV0W2tleV0gOiBwcmV2aW91cz8uW2tleV07XG5cbiAgICBjb25zdCBzdGFydCA9IGVmZmVjdGl2ZSgnc3RhcnRfZGF0ZXRpbWUnKTtcbiAgICBjb25zdCBlbmQgPSBlZmZlY3RpdmUoJ2VuZF9kYXRldGltZScpO1xuICAgIGNvbnN0IGR1cmF0aW9uUmF3ID0gZWZmZWN0aXZlKCdkdXJhdGlvbl9taW51dGVzJyk7XG5cbiAgICBjb25zdCBzdGFydE1zID0gdHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJyB8fCBzdGFydCBpbnN0YW5jZW9mIERhdGUgPyBuZXcgRGF0ZShzdGFydCBhcyBzdHJpbmcpLmdldFRpbWUoKSA6IE5hTjtcbiAgICBjb25zdCBlbmRNcyA9IHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnIHx8IGVuZCBpbnN0YW5jZW9mIERhdGUgPyBuZXcgRGF0ZShlbmQgYXMgc3RyaW5nKS5nZXRUaW1lKCkgOiBOYU47XG4gICAgY29uc3QgZHVyYXRpb24gPSB0eXBlb2YgZHVyYXRpb25SYXcgPT09ICdudW1iZXInICYmIGlzRmluaXRlKGR1cmF0aW9uUmF3KSA/IGR1cmF0aW9uUmF3IDogTmFOO1xuXG4gICAgLy8gQW4gYWxsLWRheSBldmVudCBoYXMgbm8gbWVhbmluZ2Z1bCBtaW51dGUgY291bnQ7IGxlYXZlIGR1cmF0aW9uIGFsb25lIHNvXG4gICAgLy8gYSByZXBvcnQgY2FuIHRlbGwgXCJhbGwgZGF5XCIgYXBhcnQgZnJvbSBcIndlIGZvcmdvdCB0byBmaWxsIGl0IGluXCIuXG4gICAgY29uc3QgYWxsRGF5ID0gZWZmZWN0aXZlKCdhbGxfZGF5JykgPT09IHRydWU7XG5cbiAgICBpZiAoIWlzTmFOKHN0YXJ0TXMpICYmICFpc05hTihlbmRNcykpIHtcbiAgICAgIC8vIEJvdGggZW5kcyBrbm93biBcdTIwMTQgdGhlIGR1cmF0aW9uIGlzIGEgTUVBU1VSRU1FTlQsIHNvIGl0IGlzIHJlY29tcHV0ZWRcbiAgICAgIC8vIGV2ZW4gd2hlbiB0aGUgY2FsbGVyIHN1cHBsaWVkIG9uZS4gQSBzdG9yZWQgZHVyYXRpb24gdGhhdCBkaXNhZ3JlZXNcbiAgICAgIC8vIHdpdGggaXRzIG93biB0aW1lc3RhbXBzIGlzIHRoZSBraW5kIG9mIG1ldGFkYXRhIGEgcmVwb3J0IHF1aWV0bHlcbiAgICAgIC8vIGF2ZXJhZ2VzIGludG8gbm9uc2Vuc2UuXG4gICAgICBpZiAoIWFsbERheSkgaW5wdXQuZHVyYXRpb25fbWludXRlcyA9IE1hdGgubWF4KDAsIE1hdGgucm91bmQoKGVuZE1zIC0gc3RhcnRNcykgLyA2MDAwMCkpO1xuICAgIH0gZWxzZSBpZiAoIWlzTmFOKHN0YXJ0TXMpICYmIGlzTmFOKGVuZE1zKSAmJiAhaXNOYU4oZHVyYXRpb24pICYmIGR1cmF0aW9uID4gMCkge1xuICAgICAgLy8gRHVyYXRpb24tb25seSwgdGhlIHNoYXBlIGBsb2dfY2FsbGAgc3VibWl0cyAoXCJhIDIwLW1pbnV0ZSBjYWxsLCBub3dcIikuXG4gICAgICAvLyBNYXRlcmlhbGlzaW5nIHRoZSBlbmQgdGltZXN0YW1wIGlzIHdoYXQgcHV0cyB0aGUgcm93IG9uIGEgY2FsZW5kYXIuXG4gICAgICBpbnB1dC5lbmRfZGF0ZXRpbWUgPSBuZXcgRGF0ZShzdGFydE1zICsgZHVyYXRpb24gKiA2MDAwMCkudG9JU09TdHJpbmcoKTtcbiAgICB9XG5cbiAgICAvLyBBIGNhbmNlbGxlZCBvciBuby1zaG93IG1lZXRpbmcgb2NjdXBpZXMgbm8gb25lJ3MgdGltZS4gWmVyb2luZyBpdCBrZWVwc1xuICAgIC8vIFwibWVldGluZyBtaW51dGVzIHRoaXMgd2Vla1wiIGhvbmVzdCB3aXRob3V0IGRlbGV0aW5nIHRoZSByb3csIHdoaWNoIGlzXG4gICAgLy8gc3RpbGwgZXZpZGVuY2UgdGhhdCB0aGUgaW50ZXJhY3Rpb24gd2FzIGF0dGVtcHRlZC5cbiAgICBjb25zdCBzdGF0dXMgPSBlZmZlY3RpdmUoJ3N0YXR1cycpO1xuICAgIGlmIChzdGF0dXMgPT09ICdjYW5jZWxsZWQnIHx8IHN0YXR1cyA9PT0gJ25vX3Nob3cnKSBpbnB1dC5kdXJhdGlvbl9taW51dGVzID0gMDtcbiAgfSxcbn07XG5cbi8qKlxuICogVGhlIGFjdGl2aXR5IGJ1YmJsZSBcdTIwMTQgdGhlIGNhbm9uaWNhbCBjb3B5IChgdGFza19hY3Rpdml0eV9idWJibGVgIGNhcnJpZXMgYVxuICogdmVyYmF0aW0gdHdpbikuXG4gKlxuICogIyMgYHJ1bkFzOiAnc3lzdGVtJ2AgKCMyMDE0LCBBR0VOVFMubWQgcnVsZSA5KVxuICpcbiAqIFRoZSBjbG9ja3MgaXQgc3RhbXBzIGJlbG9uZyB0byB0aGUgcmVjb3JkcyB0aGUgaW50ZXJhY3Rpb24gd2FzIFdJVEggXHUyMDE0IHRoZVxuICogYWNjb3VudCwgY29udGFjdCBhbmQgbGVhZCBcdTIwMTQgYW5kIHRvIHRoZSBjYXNlIGl0IGFuc3dlcmVkLCBub3QgdG8gdGhlIHBlcnNvblxuICogd2hvIGxvZ2dlZCBpdC4gQXMgdGhlIGNhbGxlciwgZXZlcnkgb25lIG9mIHRob3NlIHdyaXRlcyAoYW5kIHRoZSB3YWxrLXVwXG4gKiByZWFkcykgbWV0IHRoZSBjYWxsZXIncyBncmFudHM6IGEgc2VydmljZSBhZ2VudCBob2xkcyBubyBlZGl0IHJpZ2h0IG9uXG4gKiBhY2NvdW50cywgYW5kIGEgcmVwIG5lZWQgbm90IG93biB0aGUgYWNjb3VudCBvciBjb250YWN0IHRoZWlyIG93biBkZWFsIGhhbmdzXG4gKiBvZmYuIEVhY2ggcmVmdXNhbCB3YXMgc3dhbGxvd2VkIGJlc3QtZWZmb3J0LCBzbyB0aGUgY2xvY2tzIG5ldmVyIG1vdmVkXG4gKiAobWVhc3VyZWQgb24gMTcuNy4wOiBhIHNlcnZpY2UgYWdlbnQncyBoZWxkIGNhbGwgb24gdGhlaXIgb3duIGNhc2UgbGVmdCB0aGVcbiAqIGNhc2UgYWNjb3VudCdzIGBsYXN0X2FjdGl2aXR5X2RhdGVgIGVtcHR5IHdoaWxlIGFuIGFkbWluJ3MgaWRlbnRpY2FsIGNhbGxcbiAqIHN0YW1wZWQgaXQ7IHRoZSB0YXNrIHR3aW4gdGhlIHNhbWUsIGFuZCBhIHJlcCdzIGNvbXBsZXRlZCB0YXNrIG9uIHRoZWlyIG93blxuICogZGVhbCByZWFjaGVkIG5laXRoZXIgdGhlIGFjY291bnQgbm9yIHRoZSBjb250YWN0IGEgbWFuYWdlciBvd25zKS4gU28gdGhlXG4gKiBob29rIGVsZXZhdGVzLiBJdCB3cml0ZXMgbm90aGluZyB0aGUgY2FsbGVyIGNob3NlIGJleW9uZCB0aGUgbGlua3MgYWxyZWFkeSBvblxuICogdGhlIGV2ZW50LCBhbmQgb25seSB0aGUgcmVjZW5jeSBkYXRlcyBhbmQgdGhlIGNhc2UncyBmaXJzdC1yZXNwb25zZSBzdGFtcDtcbiAqIGVsZXZhdGlvbiBpcyBub3QgYW5vbnltaXR5IFx1MjAxNCBgdXBkYXRlZF9ieWAgc3RpbGwgbmFtZXMgdGhlIHBlcnNvbi5cbiAqXG4gKiAjIyBPcmdhbml6YXRpb24gKEFHRU5UUy5tZCBydWxlIDEwKVxuICpcbiAqIEV2ZXJ5IHJlYWQgYW5kIGV2ZXJ5IHdyaXRlIGlzIHBpbm5lZCB0byB0aGUgdHJpZ2dlcmluZyBldmVudCdzIG93blxuICogYG9yZ2FuaXphdGlvbl9pZGAgd2hlbiBpdCBjYXJyaWVzIG9uZTogdGhlIHdhbGstdXAgcmVhZHMgY2FycnkgdGhlIHByZWRpY2F0ZSxcbiAqIGFuZCBiZWNhdXNlIGEgYnktaWQgdXBkYXRlIGNhbm5vdCAodGhlIGVuZ2luZSByZWZ1c2VzIGFuIGV4dHJhIGB3aGVyZWAga2V5IG9uXG4gKiB0aGUgYnktaWQgcGF0aCksIGVhY2ggd3JpdGUgdGFyZ2V0IGlzIGZpcnN0IGNvbmZpcm1lZCBpbnNpZGUgdGhlXG4gKiBvcmdhbml6YXRpb24gYnkgb25lIHBpbm5lZCByZWFkIHBlciBvYmplY3QuIEEgcGVyc29uJ3MgZWxldmF0ZWQgY29udGV4dFxuICogYWxyZWFkeSBrZWVwcyB0aGVpciB0ZW5hbnQ7IHRoZSBwaW4gaXMgd2hhdCBob2xkcyB0aGUgd2FsbCBmb3IgYSB0cmlnZ2VyXG4gKiB0aGF0IGNhcnJpZXMgbm9uZSAoYSBzeXN0ZW0gd3JpdGUsIHdoaWNoIHJ1bnMgdW5zY29wZWQpLiBBbiBldmVudCB3aXRoIG5vXG4gKiBvcmdhbml6YXRpb24gKGEgc2luZ2xlLW9yZ2FuaXphdGlvbiBpbnN0YWxsKSBoYXMgbm8gd2FsbCwgYW5kIGlzIG5vdCBwaW5uZWQuXG4gKi9cbmNvbnN0IGV2ZW50QWN0aXZpdHlCdWJibGU6IEhvb2sgPSB7XG4gIG5hbWU6ICdldmVudF9hY3Rpdml0eV9idWJibGUnLFxuICBvYmplY3Q6ICdjcm1fZXZlbnQnLFxuICBldmVudHM6IFsnYWZ0ZXJJbnNlcnQnLCAnYWZ0ZXJVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDgwMCxcbiAgYXN5bmM6IHRydWUsXG4gIG9uRXJyb3I6ICdsb2cnLFxuICBydW5BczogJ3N5c3RlbScsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdBIGhlbGQgZXZlbnQgc3RhbXBzIGludGVyYWN0aW9uIHJlY2VuY3kgb24gdGhlIHJlbGF0ZWQgYWNjb3VudCAod2Fsa2luZyB1cCBmcm9tIGNvbnRhY3Qvb3Bwb3J0dW5pdHkvY2FzZSksIGxlYWQgYW5kIGNvbnRhY3QsIGFuZCB0aGUgZmlyc3QtcmVzcG9uc2UgdGltZSBvbiBhIHJlbGF0ZWQgY2FzZS4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcblxuICAgIGNvbnN0IHI6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLihwcmV2aW91cyA/PyB7fSksIC4uLmlucHV0IH07XG5cbiAgICAvLyBPbmx5IGFuIGludGVyYWN0aW9uIHRoYXQgSEFQUEVORUQgcmVzZXRzIHRoZSByZWNlbmN5IGNsb2NrLiBBIG1lZXRpbmdcbiAgICAvLyBib29rZWQgZm9yIG5leHQgcXVhcnRlciBpcyBub3QgY29udGFjdDsgbGV0dGluZyBgcGxhbm5lZGAgYnViYmxlIHdvdWxkXG4gICAgLy8gbWFrZSBhbiBhY2NvdW50IGxvb2sgZnJlc2hseS10b3VjaGVkIHRoZSBtb21lbnQgc29tZW9uZSBwdXQgYSBwbGFjZWhvbGRlclxuICAgIC8vIG9uIHRoZSBjYWxlbmRhciwgd2hpY2ggaXMgdGhlIGV4YWN0IGZhaWx1cmUgbW9kZSB0aGUgY2h1cm4gcmVwb3J0IGV4aXN0c1xuICAgIC8vIHRvIGF2b2lkLlxuICAgIGlmIChyLnN0YXR1cyAhPT0gJ2hlbGQnKSByZXR1cm47XG4gICAgLy8gRmlyZSBvbmNlLCBvbiB0aGUgdHJhbnNpdGlvbiBpbnRvIGBoZWxkYCAoYWZ0ZXJJbnNlcnQgaGFzIG5vIGBwcmV2aW91c2ApLlxuICAgIGlmIChwcmV2aW91cyAmJiBwcmV2aW91cy5zdGF0dXMgPT09ICdoZWxkJykgcmV0dXJuO1xuXG4gICAgY29uc3Qgbm93SXNvID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIC8vIGBjcm1fYWNjb3VudC5sYXN0X2FjdGl2aXR5X2RhdGVgIGlzIGEgREFURSBjb2x1bW47IHRoZSB0d28gY29udGFjdFxuICAgIC8vIHRpbWVzdGFtcHMgYXJlIGRhdGV0aW1lcy4gUGFzc2luZyBhbiBJU08gaW5zdGFudCB0byBhIGRhdGUgY29sdW1uIGlzIHdoYXRcbiAgICAvLyBzdG9yZXMgJzIwMjYtMDgtMDRUXHUyMDI2JyBpbiBhIGZpZWxkIGV2ZXJ5IGZpbHRlciBjb21wYXJlcyBhcyAnWVlZWS1NTS1ERCcuXG4gICAgY29uc3QgdG9kYXkgPSBub3dJc28uc2xpY2UoMCwgMTApO1xuXG4gICAgY29uc3QgaWRPZiA9IChrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PlxuICAgICAgdHlwZW9mIHJba2V5XSA9PT0gJ3N0cmluZycgJiYgcltrZXldLmxlbmd0aCA+IDAgPyAocltrZXldIGFzIHN0cmluZykgOiB1bmRlZmluZWQ7XG4gICAgLy8gVGhlIHJ1bGUtMTAgcGluIFx1MjAxNCBzZWUgdGhlIGhvb2sncyBub3RlLlxuICAgIGNvbnN0IG9yZyA9IGlkT2YoJ29yZ2FuaXphdGlvbl9pZCcpO1xuICAgIGNvbnN0IGluT3JnOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0gb3JnID8geyBvcmdhbml6YXRpb25faWQ6IG9yZyB9IDoge307XG5cbiAgICBjb25zdCBhY2NvdW50SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgY29udGFjdElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGxlYWRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0IGRpcmVjdCA9IGlkT2YoJ3JlbGF0ZWRfdG9fYWNjb3VudCcpO1xuICAgIGlmIChkaXJlY3QpIGFjY291bnRJZHMuYWRkKGRpcmVjdCk7XG4gICAgY29uc3QgY29udGFjdElkID0gaWRPZigncmVsYXRlZF90b19jb250YWN0Jyk7XG4gICAgaWYgKGNvbnRhY3RJZCkgY29udGFjdElkcy5hZGQoY29udGFjdElkKTtcbiAgICBjb25zdCBsZWFkSWQgPSBpZE9mKCdyZWxhdGVkX3RvX2xlYWQnKTtcbiAgICBpZiAobGVhZElkKSBsZWFkSWRzLmFkZChsZWFkSWQpO1xuXG4gICAgLy8gV2FsayBVUCB0byB0aGUgYWNjb3VudC4gRXZlcnkgb25lIG9mIHRoZXNlIG9iamVjdHMgbmFtZXMgaXRzIHBhcmVudFxuICAgIC8vIGBjcm1fYWNjb3VudGAsIHNvIG9uZSBsb29wIGNvdmVycyBhbGwgdGhyZWUuIGBmaW5kKC4uLiB0b3A6IDEpYCByYXRoZXJcbiAgICAvLyB0aGFuIGBmaW5kT25lYDogdGhlIHR3byBhZ3JlZSBoZXJlLCBhbmQgYGZpbmRgIGlzIHRoZSBzaGFwZSB0aGUgcmVzdCBvZlxuICAgIC8vIHRoZSBhcHAncyBob29rcyByZWFkIHdpdGguXG4gICAgY29uc3QgcGFyZW50TG9va3VwczogQXJyYXk8W3N0cmluZywgc3RyaW5nXT4gPSBbXG4gICAgICBbJ3JlbGF0ZWRfdG9fY29udGFjdCcsICdjcm1fY29udGFjdCddLFxuICAgICAgWydyZWxhdGVkX3RvX29wcG9ydHVuaXR5JywgJ2NybV9vcHBvcnR1bml0eSddLFxuICAgICAgWydyZWxhdGVkX3RvX2Nhc2UnLCAnY3JtX2Nhc2UnXSxcbiAgICBdO1xuICAgIGZvciAoY29uc3QgW2ZpZWxkLCBvYmplY3RdIG9mIHBhcmVudExvb2t1cHMpIHtcbiAgICAgIGNvbnN0IGlkID0gaWRPZihmaWVsZCk7XG4gICAgICBpZiAoIWlkKSBjb250aW51ZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdzogYW55ID0gYXdhaXQgYXBpLm9iamVjdChvYmplY3QpLmZpbmQoe1xuICAgICAgICAgIHdoZXJlOiB7IGlkLCAuLi5pbk9yZyB9LFxuICAgICAgICAgIGZpZWxkczogWydjcm1fYWNjb3VudCddLFxuICAgICAgICAgIHRvcDogMSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJvd3MgPSBBcnJheS5pc0FycmF5KHJhdykgPyByYXcgOiAocmF3Py5yZWNvcmRzID8/IFtdKTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gcm93cy5sZW5ndGggPyByb3dzWzBdLmNybV9hY2NvdW50IDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAodHlwZW9mIHBhcmVudCA9PT0gJ3N0cmluZycgJiYgcGFyZW50Lmxlbmd0aCA+IDApIGFjY291bnRJZHMuYWRkKHBhcmVudCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQmVzdC1lZmZvcnQ6IGEgcGFyZW50IHRoYXQgY2Fubm90IGJlIHJlYWQgaXMgbm90IGJ1YmJsZWQgdGhyb3VnaC5cbiAgICAgICAgLy8gTm8gYGNvbnNvbGVgIGluIHRoZSBMMiBob29rIHNhbmRib3ggXHUyMDE0IGxvZ2dpbmcgaGVyZSB3b3VsZCB0aHJvdyBpdHNcbiAgICAgICAgLy8gb3duIFJlZmVyZW5jZUVycm9yIChjZi4gIzQ3MSkuXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0czogQXJyYXk8W3N0cmluZywgU2V0PHN0cmluZz4sIFJlY29yZDxzdHJpbmcsIGFueT5dPiA9IFtcbiAgICAgIFsnY3JtX2FjY291bnQnLCBhY2NvdW50SWRzLCB7IGxhc3RfYWN0aXZpdHlfZGF0ZTogdG9kYXkgfV0sXG4gICAgICBbJ2NybV9jb250YWN0JywgY29udGFjdElkcywgeyBsYXN0X2NvbnRhY3RlZF9kYXRlOiBub3dJc28gfV0sXG4gICAgICBbJ2NybV9sZWFkJywgbGVhZElkcywgeyBsYXN0X2NvbnRhY3RlZF9kYXRlOiBub3dJc28gfV0sXG4gICAgXTtcbiAgICBmb3IgKGNvbnN0IFtvYmplY3QsIGlkcywgZG9jXSBvZiB0YXJnZXRzKSB7XG4gICAgICBsZXQgaW5zaWRlID0gWy4uLmlkc107XG4gICAgICBpZiAob3JnICYmIGluc2lkZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmF3OiBhbnkgPSBhd2FpdCBhcGkub2JqZWN0KG9iamVjdCkuZmluZCh7IHdoZXJlOiB7IGlkOiB7ICRpbjogaW5zaWRlIH0sIC4uLmluT3JnIH0sIGZpZWxkczogWydpZCddLCB0b3A6IGluc2lkZS5sZW5ndGggfSk7XG4gICAgICAgICAgaW5zaWRlID0gKEFycmF5LmlzQXJyYXkocmF3KSA/IHJhdyA6IChyYXc/LnJlY29yZHMgPz8gW10pKS5tYXAoKHJvdzogYW55KSA9PiBTdHJpbmcocm93LmlkKSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIGluc2lkZSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGlkIG9mIGluc2lkZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGB1cGRhdGUoZG9jdW1lbnQsIG9wdGlvbnMpYCBcdTIwMTQgYGN0eC5hcGlgIGlzIHRoZSBlbmdpbmUgcmVwbyBmYWNhZGUsXG4gICAgICAgICAgLy8gd2hvc2UgdXBkYXRlIHRha2VzIGEgRE9DVU1FTlQsIG5vdCBhbiBpZCAoIzYxNjsgcGlubmVkIGJ5XG4gICAgICAgICAgLy8gdGVzdC9ob29rLXdyaXRlLXNoYXBlLnRlc3QudHMgYWdhaW5zdCBhIHJlYWwga2VybmVsKS5cbiAgICAgICAgICBhd2FpdCBhcGkub2JqZWN0KG9iamVjdCkudXBkYXRlKHsgLi4uZG9jLCBpZCB9LCB7IHdoZXJlOiB7IGlkIH0gfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IGFjdGl2aXR5IGJ1YmJsZTsgbmV2ZXIgYnJlYWsgdGhlIHBhcmVudCB3cml0ZS5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFx1MjUwMFx1MjUwMCBGaXJzdCByZXNwb25zZSBvbiBhIGNhc2UgKCM1OTUpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gXHUyNkQ0IFRoZSBTSU5HTEUgd3JpdGVyIG9mIGBjcm1fY2FzZS5maXJzdF9yZXNwb25zZV9kYXRlYCwgYW5kIGl0IGJlbG9uZ3NcbiAgICAvLyBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSBgbG9nX2NhbGxgIC8gYGxvZ19tZWV0aW5nYCBhY3Rpb24gYm9kaWVzOiBzdGFtcGluZ1xuICAgIC8vIGl0IHBlci1idXR0b24gY292ZXJzIG9ubHkgaW50ZXJhY3Rpb25zIHJlY29yZGVkIHRocm91Z2ggdGhvc2UgdHdvXG4gICAgLy8gYnV0dG9ucywgYW5kIGFuIGV2ZW50IGNyZWF0ZWQgYW55IG90aGVyIHdheSAodGhlIEFjdGl2aXR5IHRhYiwgYW4gaW1wb3J0LFxuICAgIC8vIGFuIGludGVncmF0aW9uLCBhIGZ1dHVyZSBhY3Rpb24pIGxlYXZlcyB0aGUgbW9zdCBzdGFuZGFyZCBTTEEgbWV0cmljIGFcbiAgICAvLyBzZXJ2aWNlIGRlc2sgcmVwb3J0cyBwZXJtYW5lbnRseSBudWxsLiBUaGUgcnVsZSB0aG9zZSBhY3Rpb25zIGV4cHJlc3MgaXNcbiAgICAvLyB0aGUgb25lIHRoaXMgaG9vayBhbHJlYWR5IGNvbXB1dGVzIGZvciByZWNlbmN5IFx1MjAxNCBhbiBpbnRlcmFjdGlvbiB0aGF0XG4gICAgLy8gSEFQUEVORUQgXHUyMDE0IHNvIGl0IGxpdmVzIG9uY2UsIHdoZXJlIGV2ZXJ5IHdyaXRlciBvZiBhIGhlbGQgZXZlbnQgcGFzc2VzXG4gICAgLy8gdGhyb3VnaCBpdC4gU2FtZSBhcmd1bWVudCB0aGF0IG1ha2VzIHRoaXMgaG9vayB0aGUgc2luZ2xlIHdyaXRlciBvZlxuICAgIC8vIHJlY2VuY3ksIGFuZCBgY2FzZV9zdGF0dXNfc2lkZV9lZmZlY3RzYCB0aGUgc2luZ2xlIG93bmVyIG9mIGVzY2FsYXRpb25cbiAgICAvLyBmb2xsb3ctdXAgdGFza3MuXG4gICAgLy9cbiAgICAvLyBBIHN0YXR1cyBjaGFuZ2UgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhIGZpcnN0IHJlc3BvbnNlOiBhbiBhZ2VudCBjYW4gbW92ZSBhXG4gICAgLy8gY2FzZSB0byBcImluIHByb2dyZXNzXCIgYW5kIGludmVzdGlnYXRlXG4gICAgLy8gZm9yIGFuIGhvdXIgd2hpbGUgdGhlIGN1c3RvbWVyIGhlYXJzIG5vdGhpbmcsIHNvIGEgc3RhdHVzLWRlcml2ZWQgbnVtYmVyXG4gICAgLy8gd291bGQgcmVwb3J0IGEgcmVzcG9uc2UgdGhhdCBuZXZlciBoYXBwZW5lZC4gTmVpdGhlciBpcyBhIG1lZXRpbmcgbWVyZWx5XG4gICAgLy8gQk9PS0VEIFx1MjAxNCB0aGF0IGlzIHRoZSBgaGVsZGAgZ2F0ZSBhYm92ZSwgd2hpY2ggdGhpcyBibG9jayBzaXRzIHVuZGVyLlxuICAgIGNvbnN0IHJlc3BvbnNlQ2FzZUlkID0gaWRPZigncmVsYXRlZF90b19jYXNlJyk7XG4gICAgaWYgKHJlc3BvbnNlQ2FzZUlkKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBSZWFkIHRoZSBTVE9SRUQgdmFsdWUgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgdGhlIGV2ZW50J3Mgb3duIHBheWxvYWQ6XG4gICAgICAgIC8vIFwiZmlyc3QgcmVzcG9uc2VcIiBpcyBhIHByb3BlcnR5IG9mIHRoZSBjYXNlLCBzbyB0aGUgc2Vjb25kIGhlbGQgZXZlbnRcbiAgICAgICAgLy8gb24gYSBjYXNlIG11c3QgZmluZCB0aGUgZmlyc3Qgb25lJ3Mgc3RhbXAgYW5kIGxlYXZlIGl0IGFsb25lLiBBXG4gICAgICAgIC8vIHJlLXN0YW1wIHdvdWxkIHNpbGVudGx5IHR1cm4gdGhlIG1ldHJpYyBpbnRvIFwibGFzdCByZXNwb25zZVwiLlxuICAgICAgICAvLyBQaW5uZWQgbGlrZSB0aGUgYnViYmxlLCBhbmQgd3JpdHRlbiBvbmx5IHdoZW4gdGhlIHJlYWQgRk9VTkQgdGhlXG4gICAgICAgIC8vIGNhc2U6IHVuZGVyIGVsZXZhdGlvbiBhbiBlbXB0eSByZWFkIG1lYW5zIFwibm90IHRoaXMgb3JnYW5pemF0aW9uJ3NcIlxuICAgICAgICAvLyAob3IgZ29uZSksIG5ldmVyIFwibm90IHN0YW1wZWQgeWV0XCIuXG4gICAgICAgIGNvbnN0IHJhdzogYW55ID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2Nhc2UnKS5maW5kKHtcbiAgICAgICAgICB3aGVyZTogeyBpZDogcmVzcG9uc2VDYXNlSWQsIC4uLmluT3JnIH0sXG4gICAgICAgICAgZmllbGRzOiBbJ2ZpcnN0X3Jlc3BvbnNlX2RhdGUnXSxcbiAgICAgICAgICB0b3A6IDEsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByb3dzID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3IDogKHJhdz8ucmVjb3JkcyA/PyBbXSk7XG4gICAgICAgIGlmIChyb3dzLmxlbmd0aCA+IDAgJiYgIXJvd3NbMF0uZmlyc3RfcmVzcG9uc2VfZGF0ZSkge1xuICAgICAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV9jYXNlJykudXBkYXRlKFxuICAgICAgICAgICAgeyBpZDogcmVzcG9uc2VDYXNlSWQsIGZpcnN0X3Jlc3BvbnNlX2RhdGU6IG5vd0lzbyB9LFxuICAgICAgICAgICAgeyB3aGVyZTogeyBpZDogcmVzcG9uc2VDYXNlSWQgfSB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBCZXN0LWVmZm9ydCwgbGlrZSB0aGUgYnViYmxlIGFib3ZlOiBuZXZlciBicmVhayB0aGUgZXZlbnQgd3JpdGUuXG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBgZG9fbm90X2NhbGxgIFx1MjAxNCB0aGUgY2FsZW5kYXIgaGFsZiBvZiB0aGUgc2FtZSBwcm9taXNlLlxuICpcbiAqIGBjcm1fdGFza2AgY2FycmllcyB0aGUgZm9sbG93LXVwIGEgcmVwIE9XRVM7IGBjcm1fZXZlbnRgIGNhcnJpZXMgdGhlIHNsb3QgYVxuICogcmVwIEJPT0tTLiBBIGBwbGFubmVkYCBldmVudCBvZiB0eXBlIGBjYWxsYCBpcyBhIGJvb2tlZCBvdXRib3VuZCBwaG9uZSBjYWxsLFxuICogc28gaXQgaXMgcmVmdXNlZCBhZ2FpbnN0IGEgcGVyc29uIGZsYWdnZWQgYGRvX25vdF9jYWxsYCBmb3IgZXhhY3RseSB0aGVcbiAqIHJlYXNvbnMgc3RhdGVkIG9uIGB0YXNrX2RvX25vdF9jYWxsX2d1YXJkYCBpbiBgc3JjL3NhbGVzL29iamVjdHMvdGFzay5ob29rLnRzYFxuICogKHJlYWQgdGhhdCBibG9jayBmaXJzdCBcdTIwMTQgaXQgY2FycmllcyB0aGUgZnVsbCByYXRpb25hbGUgZm9yIGVuZm9yY2luZyBvbiB0aGVcbiAqIHdyaXRlIHJhdGhlciB0aGFuIG9uIGEgYnV0dG9uLCBhbmQgZm9yIHNjb3BpbmcgdG8gdGhlIHBob25lKS5cbiAqXG4gKiBUaGUgc3RhdHVzIHNwbGl0IGlzIHdoYXQgbWFrZXMgdGhpcyBndWFyZCBob25lc3QsIGFuZCBpdCBpcyB0aGUgd2hvbGUgcmVhc29uXG4gKiBgbG9nX2NhbGxgIG5lZWRzIG5vIGdhdGUgb2YgaXRzIG93bjpcbiAqXG4gKiAgIC0gYHN0YXR1czogJ2hlbGQnYCAgIFx1MjAxNCB0aGUgY2FsbCBIQVBQRU5FRC4gQWxsb3dlZCwgYWx3YXlzLiBUaGlzIGlzIHdoYXRcbiAqICAgICBgbG9nX2NhbGxgIHdyaXRlcywgYW5kIHJlZnVzaW5nIGl0IHdvdWxkIGhpZGUgZXZpZGVuY2Ugb2YgYSBjYWxsIHJhdGhlclxuICogICAgIHRoYW4gcHJldmVudCBvbmUuXG4gKiAgIC0gYHN0YXR1czogJ3BsYW5uZWQnYCBcdTIwMTQgdGhlIGNhbGwgaXMgQk9PS0VELiBSZWZ1c2VkLlxuICpcbiAqIGBzY2hlZHVsZV9tZWV0aW5nYCBpcyBkZWxpYmVyYXRlbHkgTk9UIGNhdWdodCBoZXJlOiBpdCBoYXJkY29kZXNcbiAqIGB0eXBlOiAnbWVldGluZydgLCBhbmQgYSBwZXJzb24gd2hvIGRvZXMgbm90IHdhbnQgcGhvbmUgY2FsbHMgbWF5IHN0aWxsIGJlXG4gKiBtZXQgaW4gcGVyc29uIG9yIG92ZXIgdmlkZW8uIEdhdGluZyBpdCB3b3VsZCB3aWRlbiBgZG9fbm90X2NhbGxgIGludG9cbiAqIGBkb19ub3RfY29udGFjdGAuXG4gKi9cbmNvbnN0IGV2ZW50RG9Ob3RDYWxsR3VhcmQ6IEhvb2sgPSB7XG4gIG5hbWU6ICdldmVudF9kb19ub3RfY2FsbF9ndWFyZCcsXG4gIG9iamVjdDogJ2NybV9ldmVudCcsXG4gIGV2ZW50czogWydiZWZvcmVJbnNlcnQnLCAnYmVmb3JlVXBkYXRlJ10sXG4gIHByaW9yaXR5OiAxNTAsXG4gIGRlc2NyaXB0aW9uOiAnUmVmdXNlIHRvIGJvb2sgYSBwbGFubmVkIENhbGwgZXZlbnQgYWdhaW5zdCBhIGxlYWQvY29udGFjdCBmbGFnZ2VkIERvIE5vdCBDYWxsLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgLy8gVGhlIHJlZnVzYWwgZW52ZWxvcGUgKCMxMDc1KS4gTWlycm9yZWQgZnJvbSBgLi9fcmVmdXNhbC50c2AgYmVjYXVzZSBhXG4gICAgLy8gbG93ZXJlZCBib2R5IGhhcyBubyBtb2R1bGUgc2NvcGUgYW5kIGBleHRyYWN0SG9va0JvZHlgIFRIUk9XUyBvbiBhblxuICAgIC8vIGltcG9ydDsgYHRlc3QvcmVmdXNhbC1lbnZlbG9wZS50ZXN0LnRzYCBwaW5zIGV2ZXJ5IGNvcHkgYWdhaW5zdCBpdC5cbiAgICBmdW5jdGlvbiByZWZ1c2UoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb2RlOiBzdHJpbmcsXG4gICAgICBzdGF0dXM6IG51bWJlcixcbiAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmcgPSBtZXNzYWdlLFxuICAgICk6IEVycm9yIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29kZTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZztcbiAgICAgIH07XG4gICAgICBlcnIuY29kZSA9IGNvZGU7XG4gICAgICBlcnIuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgZXJyLnVzZXJNZXNzYWdlID0gdXNlck1lc3NhZ2U7XG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXBpKSByZXR1cm47XG5cbiAgICBjb25zdCBlZmZlY3RpdmUgPSAoa2V5OiBzdHJpbmcpOiB1bmtub3duID0+XG4gICAgICBpbnB1dFtrZXldICE9PSB1bmRlZmluZWQgJiYgaW5wdXRba2V5XSAhPT0gbnVsbCA/IGlucHV0W2tleV0gOiBwcmV2aW91cz8uW2tleV07XG5cbiAgICBpZiAoZWZmZWN0aXZlKCd0eXBlJykgIT09ICdjYWxsJykgcmV0dXJuO1xuICAgIC8vIE9ubHkgYSBib29raW5nLiBgaGVsZGAgKHdoYXQgYGxvZ19jYWxsYCB3cml0ZXMpIGFuZCBldmVyeSBvdGhlciBzdGF0dXNcbiAgICAvLyBkZXNjcmliZSBhIGNhbGwgdGhhdCBpcyBubyBsb25nZXIgcHJldmVudGFibGUuXG4gICAgaWYgKGVmZmVjdGl2ZSgnc3RhdHVzJykgIT09ICdwbGFubmVkJykgcmV0dXJuO1xuXG4gICAgY29uc3QgbGVhZElkID0gZWZmZWN0aXZlKCdyZWxhdGVkX3RvX2xlYWQnKTtcbiAgICBjb25zdCBjb250YWN0SWQgPSBlZmZlY3RpdmUoJ3JlbGF0ZWRfdG9fY29udGFjdCcpO1xuXG4gICAgY29uc3QgdGFyZ2V0czogQXJyYXk8eyBvYmplY3Q6IHN0cmluZzsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9PiA9IFtdO1xuICAgIGlmICh0eXBlb2YgbGVhZElkID09PSAnc3RyaW5nJyAmJiBsZWFkSWQpIHtcbiAgICAgIHRhcmdldHMucHVzaCh7IG9iamVjdDogJ2NybV9sZWFkJywgaWQ6IGxlYWRJZCwgbGFiZWw6ICdsZWFkJyB9KTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjb250YWN0SWQgPT09ICdzdHJpbmcnICYmIGNvbnRhY3RJZCkge1xuICAgICAgdGFyZ2V0cy5wdXNoKHsgb2JqZWN0OiAnY3JtX2NvbnRhY3QnLCBpZDogY29udGFjdElkLCBsYWJlbDogJ2NvbnRhY3QnIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdCBvZiB0YXJnZXRzKSB7XG4gICAgICAvLyBgZmluZCguLi4gdG9wOiAxKWAsIG5vcm1hbGlzZWQgZm9yIGJvdGggZHJpdmVyIHNoYXBlcyBcdTIwMTQgc2FtZSByZWFzb25pbmdcbiAgICAgIC8vIGFzIGBldmVudF9hY3Rpdml0eV9idWJibGVgIGJlbG93LlxuICAgICAgY29uc3QgcmF3OiBhbnkgPSBhd2FpdCBhcGkub2JqZWN0KHQub2JqZWN0KS5maW5kKHtcbiAgICAgICAgd2hlcmU6IHsgaWQ6IHQuaWQgfSxcbiAgICAgICAgZmllbGRzOiBbJ2lkJywgJ2RvX25vdF9jYWxsJ10sXG4gICAgICAgIHRvcDogMSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgcm93cyA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhdyA6IChyYXc/LnJlY29yZHMgPz8gW10pO1xuICAgICAgY29uc3QgcGVyc29uID0gcm93c1swXTtcbiAgICAgIC8vIGA9PT0gdHJ1ZWA6IGFic2VudCAvIG51bGwgLyBmYWxzZSBhcmUgYWxsIFwibm90IGZsYWdnZWRcIi5cbiAgICAgIGlmIChwZXJzb24/LmRvX25vdF9jYWxsID09PSB0cnVlKSB7XG4gICAgICAgIHRocm93IHJlZnVzZShcbiAgICAgICAgICBgVGhpcyAke3QubGFiZWx9IGlzIGZsYWdnZWQgRG8gTm90IENhbGwsIHNvIGEgY2FsbCBjYW5ub3QgYmUgc2NoZWR1bGVkIGFnYWluc3QgdGhlbS4gYCArXG4gICAgICAgICAgICAnTG9nIHRoZSBjYWxsIGFzIGhlbGQgaWYgaXQgYWxyZWFkeSBoYXBwZW5lZCwgYm9vayBhIG1lZXRpbmcgaW5zdGVhZCwgJyArXG4gICAgICAgICAgICAnb3IgY2xlYXIgRG8gTm90IENhbGwgb24gdGhlIHJlY29yZCBmaXJzdC4nLFxuICAgICAgICAgICdGT1JCSURERU4nLFxuICAgICAgICAgIDQwMyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBbZXZlbnRTY2hlZHVsZURlcml2ZSwgZXZlbnREb05vdENhbGxHdWFyZCwgZXZlbnRBY3Rpdml0eUJ1YmJsZV07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2ZvcmVjYXN0Lmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2ZvcmVjYXN0Lmhvb2sudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcblxuLyoqXG4gKiBGb3JlY2FzdCBsaWZlY3ljbGUgaG9vay5cbiAqXG4gKiBBdXRvLWRlcml2ZXMgdGhlIHdob2xlIHBlcmlvZCBmYW1pbHkgXHUyMDE0IGBwZXJpb2Rfc3RhcnRgLCBgcGVyaW9kX2VuZGAgYW5kXG4gKiBgcGVyaW9kX2xhYmVsYCBcdTIwMTQgZnJvbSBgcGVyaW9kYCAoKyBgcGVyaW9kX3N0YXJ0YCwgd2hlbiB0aGUgY2FsbGVyIHN1cHBsaWVzXG4gKiBvbmUpIHNvIGNhbGxlcnMgKFVJLCBBSSBza2lsbCwgdGhlIGBmb3JlY2FzdF9zbmFwc2hvdGAgc2NoZWR1bGVkIGZsb3cpIGRvbid0XG4gKiBoYXZlIHRvIGNvbXB1dGUgdGhlbS4gQWxzbyBzdGFtcHMgYHNuYXBzaG90X2RhdGVgIHRvIHRvZGF5IG9uIGluc2VydCBpZlxuICogdW5zZXQuXG4gKlxuICogV2h5IGBwZXJpb2Rfc3RhcnRgIGlzIGRlcml2ZWQgaGVyZSBhbmQgbm93aGVyZSBlbHNlOiBhIGZsb3cgdGVtcGxhdGUgY2FuXG4gKiBleHByZXNzIGB7VE9EQVkoKX1gIGFuZCBkYXkgb2Zmc2V0cywgYnV0IGl0IGhhcyBubyB3YXkgdG8gc2F5IFwidGhlIGZpcnN0IGRheVxuICogb2YgdGhlIGNhbGVuZGFyIHF1YXJ0ZXIgY29udGFpbmluZyB0b2RheVwiLiBJZiBlYWNoIHdyaXRlciBjb21wdXRlZCBpdHMgb3duXG4gKiBib3VuZGFyeSB3ZSB3b3VsZCBnZXQgZXhhY3RseSB0aGUgZHJpZnQgIzUzMCBwaW5uZWQgaW4gdGhlIHNlZWRzIFx1MjAxNCBzbmFwc2hvdHNcbiAqIGxhYmVsbGVkICdRMyAyMDI2JyB3aG9zZSBgcGVyaW9kX3N0YXJ0YCBpcyBzb21lIG1pZC1xdWFydGVyIGRhdGUsIHNvIGV2ZXJ5XG4gKiBcInRoaXMgcXVhcnRlclwiIGVxdWFscy1maWx0ZXIgbWlzc2VzLiBPbmUgZGVyaXZhdGlvbiwgb25lIGRlZmluaXRpb246IGdpdmVcbiAqIHRoZSBvYmplY3QgYSBgcGVyaW9kYCBhbmQgaXQgbGFuZHMgb24gYSBjYWxlbmRhci10cnVlIGJvdW5kYXJ5IG9yIG5vdCBhdCBhbGwuXG4gKlxuICogTk9URTogYWxsIGhlbHBlcnMgYXJlIGlubGluZWQgaW50byBgaGFuZGxlcmAgYmVjYXVzZSB0aGUgYnVpbGQgcGlwZWxpbmVcbiAqIGxvd2VycyBpbmxpbmUgaGFuZGxlcnMgXHUyMDE0IG1vZHVsZS1zY29wZSBoZWxwZXJzIHdvdWxkIG5vdCBzdXJ2aXZlIGxvd2VyaW5nLlxuICovXG5jb25zdCBmb3JlY2FzdERlcml2ZTogSG9vayA9IHtcbiAgbmFtZTogJ2ZvcmVjYXN0X2Rlcml2ZV9wZXJpb2QnLFxuICBvYmplY3Q6ICdjcm1fZm9yZWNhc3QnLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICBwcmlvcml0eTogMjAwLFxuICBkZXNjcmlwdGlvbjogJ0Rlcml2ZSBwZXJpb2Rfc3RhcnQsIHBlcmlvZF9lbmQgYW5kIHBlcmlvZF9sYWJlbCBmcm9tIHBlcmlvZCAoKyBzbmFwc2hvdF9kYXRlKS4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIC8vIFx1MjZENCBBIFBSRURJQ0FURSBVUERBVEUgREVSSVZFUyBOT1RISU5HIEhFUkUgXHUyMDE0IEFEUi0wMDU4IEFkZGVuZHVtIElJIEQzLlxuICAgIC8vXG4gICAgLy8gYHVwZGF0ZShvYmosIHBheWxvYWQsIHsgbXVsdGk6IHRydWUsIHdoZXJlIH0pYCBzZW5kcyBPTkUgYFNFVGAgY2xhdXNlIGZvclxuICAgIC8vIGFsbCBOIG1hdGNoZWQgcm93cywgYW5kIHRoZSBlbmdpbmUgaGFuZHMgZXZlcnkgcm93J3MgYGJlZm9yZVVwZGF0ZWAgVEhBVFxuICAgIC8vIHBheWxvYWQgcmF0aGVyIHRoYW4gYSBwZXItcm93IGNvcHkuIEEgcGF5bG9hZCB3cml0ZSB3aG9zZSB2YWx1ZSBcdTIwMTQgb3JcbiAgICAvLyB3aG9zZSBpZi1ndWFyZCBcdTIwMTQgcmVhZHMgYGN0eC5wcmV2aW91c2AgdGhlcmVmb3JlIGRvZXMgbm90IHNjb3BlIGl0c2VsZiB0b1xuICAgIC8vIHRoZSByb3cgaXQgd2FzIGRlY2lkZWQgb24uIEJvdGggb3V0Y29tZXMgYXJlIG1lYXN1cmVkIG9uXG4gICAgLy8gMTcuNC4wLCBpbiB0aGlzIGFwcCwgb24gYSBmcmVzaCBgcG5wbSBkZXZgOlxuICAgIC8vXG4gICAgLy8gIC0ga2V5cyB3cml0dGVuIGZvciBTT01FIHJvd3Mgb25seSBcdTIxRDIgdGhlIGVuZ2luZSByZWZ1c2VzIHRoZSB3aG9sZSBiYXRjaFxuICAgIC8vICAgIChgTVVMVElfVVBEQVRFX0hPT0tfS0VZX0RJVkVSR0VOQ0VgKSBhbmQgd3JpdGVzIG5vdGhpbmcuIFRoaXMgaG9vaydzXG4gICAgLy8gICAgb3duIGBpZiAoIWlucHV0LnBlcmlvZF9lbmQpYCBkaWQgZXhhY3RseSB0aGF0IHVuZGVyIHRoZSBwbGF0Zm9ybSdzXG4gICAgLy8gICAgc2VlZC1vd25lcnNoaXAgY2xhaW06IHJvdyAwIHN0YW1wZWQgYHBlcmlvZF9lbmRgIC8gYHBlcmlvZF9sYWJlbGBcbiAgICAvLyAgICBpbnRvIHRoZSBzaGFyZWQgcGF5bG9hZCwgcm93cyAxLTYgdGhlbiBzYXcgdGhlbSBhbHJlYWR5IHNldCBhbmRcbiAgICAvLyAgICBzdGFtcGVkIG5vdGhpbmcsIHNvIGFsbCA3IHNlZWRlZCBmb3JlY2FzdHMgc3RheWVkIG93bmVybGVzcyAoIzE4MDQpLlxuICAgIC8vICAtIHRoZSBTQU1FIGtleSBvbiBFVkVSWSByb3cgXHUyMUQyIG5vdGhpbmcgZGl2ZXJnZXMsIHRoZSBiYXRjaCByZXNvbHZlcywgYW5kXG4gICAgLy8gICAgdGhlIExBU1Qgcm93J3MgdmFsdWUgaXMgc3RvcmVkIGZvciBhbGwgb2YgdGhlbSwgaW4gc2lsZW5jZS4gVGhhdCBpc1xuICAgIC8vICAgIHdoYXQgbGVmdCBgcHJvYmFiaWxpdHk6IDgwYCBvbiBjbG9zZWQtbG9zdCBvcHBvcnR1bml0aWVzICgjMTI3NSkuXG4gICAgLy9cbiAgICAvLyBgY3R4LnByZXZpb3VzYCBvbiB0aGlzIHBhdGggaXMgc3VwcGxpZWQgc28gYSBndWFyZCBjYW4gUkVGVVNFIGEgd3JpdGUsXG4gICAgLy8gbmV2ZXIgc28gYSByZXdyaXRlIGNhbiBiZSBhaW1lZC4gRGVyaXZpbmcgaXMgcGVyLXJlY29yZCB3b3JrLCBzbyBpdFxuICAgIC8vIHN0YW5kcyBkb3duIGhlcmUgYW5kIHN0aWxsIGhhcHBlbnMgb24gdGhlIHBlci1yZWNvcmQgcGF0aCBcdTIwMTQgd2hpY2ggaXNcbiAgICAvLyBldmVyeSB3cml0ZXIgdGhpcyBhcHAgaGFzOiBhbGwgMTkgYHVwZGF0ZV9yZWNvcmRgIGZsb3cgbm9kZXMgYW5kIGV2ZXJ5XG4gICAgLy8gYWN0aW9uIGFuZCBob29rIHdyaXRlIHRocm91Z2ggYGN0eC5hcGlgLCBhbGwgb2YgdGhlbSBieSBpZC4gVGhlIHBsYXRmb3JtJ3NcbiAgICAvLyBzZWVkLW93bmVyc2hpcCBjbGFpbSBpcyBhIHByZWRpY2F0ZSB3cml0ZSwgYW5kIGl0IHdyaXRlcyBvbmx5IGBvd25lcl9pZGAsXG4gICAgLy8gd2hpY2ggZGVyaXZlcyBub3RoaW5nLlxuICAgIC8vXG4gICAgLy8gXHUyNkEwXHVGRTBGIFRoZSBgY3R4LmV2ZW50YCBoYWxmIGlzIGxvYWQtYmVhcmluZywgbm90IGNlcmVtb255OiBhIEJBVENIIElOU0VSVFxuICAgIC8vIGFsc28gcmVwb3J0cyBgZGlzcGF0Y2gubW9kZSA9PT0gJ3Blci1yb3cnYCwgYW5kIHRoZXJlIGVhY2ggcm93IGNhcnJpZXNcbiAgICAvLyBpdHMgT1dOIHBheWxvYWQgXHUyMDE0IGRyb3BwaW5nIHRoYXQgaGFsZiB3b3VsZCBzdG9wIHRoZSBzZWVkcyBkZXJpdmluZyB0aGVpclxuICAgIC8vIHBlcmlvZHMgYXQgYWxsLlxuICAgIGlmIChjdHguZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIGN0eC5kaXNwYXRjaD8ubW9kZSA9PT0gJ3Blci1yb3cnKSByZXR1cm47XG5cbiAgICBjb25zdCBwYWQgPSAobjogbnVtYmVyKSA9PiBTdHJpbmcobikucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCBpc29EYXRlID0gKGQ6IERhdGUpID0+XG4gICAgICBgJHtkLmdldFVUQ0Z1bGxZZWFyKCl9LSR7cGFkKGQuZ2V0VVRDTW9udGgoKSArIDEpfS0ke3BhZChkLmdldFVUQ0RhdGUoKSl9YDtcbiAgICBjb25zdCBNT05USFMgPSBbJ0phbicsJ0ZlYicsJ01hcicsJ0FwcicsJ01heScsJ0p1bicsJ0p1bCcsJ0F1ZycsJ1NlcCcsJ09jdCcsJ05vdicsJ0RlYyddO1xuICAgIGNvbnN0IGVuZE9mTW9udGggPSAoc3RhcnQ6IERhdGUpID0+XG4gICAgICBuZXcgRGF0ZShEYXRlLlVUQyhzdGFydC5nZXRVVENGdWxsWWVhcigpLCBzdGFydC5nZXRVVENNb250aCgpICsgMSwgMCkpO1xuICAgIC8vIFwic3RhcnQgKyBvbmUgcGVyaW9kXCIsIGEgUk9MTElORyB3aW5kb3cgXHUyMDE0IGNhbGVuZGFyLXRydWUgb25seSBiZWNhdXNlIGFcbiAgICAvLyBoYW5kLWZpbGxlZCBgcGVyaW9kX3N0YXJ0YCBvZmYgYSBjYWxlbmRhciBib3VuZGFyeSBpcyBub3cgUkVGVVNFRCBieVxuICAgIC8vIGBwZXJpb2Rfc3RhcnRfZmlyc3Rfb2ZfcGVyaW9kYCAvIGBxdWFydGVyX3N0YXJ0c19vbl9xdWFydGVyX2JvdW5kYXJ5YCBpblxuICAgIC8vIGBmb3JlY2FzdC5vYmplY3QudHNgICgjMTAwOCkuIEJlZm9yZSB0aGF0IHJ1bGUsIGAyMDI2LTA4LTE1YCArIGBxdWFydGVyYFxuICAgIC8vIGRlcml2ZWQgYDIwMjYtMTAtMzFgIHVuZGVyIHRoZSBsYWJlbCBgUTMgMjAyNmAuXG4gICAgY29uc3QgZW5kT2ZRdWFydGVyID0gKHN0YXJ0OiBEYXRlKSA9PlxuICAgICAgbmV3IERhdGUoRGF0ZS5VVEMoc3RhcnQuZ2V0VVRDRnVsbFllYXIoKSwgc3RhcnQuZ2V0VVRDTW9udGgoKSArIDMsIDApKTtcbiAgICAvLyBGaXJzdCBkYXkgb2YgdGhlIGNhbGVuZGFyIHBlcmlvZCBDT05UQUlOSU5HIGBkYCBcdTIwMTQgdGhlIGludmVyc2Ugb2YgdGhlXG4gICAgLy8gdHdvIGhlbHBlcnMgYWJvdmUsIGFuZCB0aGUgcGllY2UgYSBmbG93IHRlbXBsYXRlIGNhbm5vdCBleHByZXNzLlxuICAgIGNvbnN0IHN0YXJ0T2ZQZXJpb2QgPSAocGVyaW9kOiBzdHJpbmcsIGQ6IERhdGUpID0+XG4gICAgICBuZXcgRGF0ZShEYXRlLlVUQyhcbiAgICAgICAgZC5nZXRVVENGdWxsWWVhcigpLFxuICAgICAgICBwZXJpb2QgPT09ICdxdWFydGVyJyA/IE1hdGguZmxvb3IoZC5nZXRVVENNb250aCgpIC8gMykgKiAzIDogZC5nZXRVVENNb250aCgpLFxuICAgICAgICAxLFxuICAgICAgKSk7XG4gICAgY29uc3QgbGFiZWxGb3IgPSAocGVyaW9kOiBzdHJpbmcsIHN0YXJ0OiBEYXRlKSA9PiB7XG4gICAgICBpZiAocGVyaW9kID09PSAncXVhcnRlcicpIHtcbiAgICAgICAgY29uc3QgcSA9IE1hdGguZmxvb3Ioc3RhcnQuZ2V0VVRDTW9udGgoKSAvIDMpICsgMTtcbiAgICAgICAgcmV0dXJuIGBRJHtxfSAke3N0YXJ0LmdldFVUQ0Z1bGxZZWFyKCl9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgJHtNT05USFNbc3RhcnQuZ2V0VVRDTW9udGgoKV19ICR7c3RhcnQuZ2V0VVRDRnVsbFllYXIoKX1gO1xuICAgIH07XG5cbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgY29uc3QgcGVyaW9kID1cbiAgICAgICh0eXBlb2YgaW5wdXQucGVyaW9kID09PSAnc3RyaW5nJyAmJiBpbnB1dC5wZXJpb2QpIHx8XG4gICAgICAodHlwZW9mIHByZXZpb3VzPy5wZXJpb2QgPT09ICdzdHJpbmcnICYmIChwcmV2aW91cy5wZXJpb2QgYXMgc3RyaW5nKSkgfHxcbiAgICAgICdtb250aCc7XG4gICAgbGV0IHN0YXJ0U3RyID1cbiAgICAgICh0eXBlb2YgaW5wdXQucGVyaW9kX3N0YXJ0ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5wZXJpb2Rfc3RhcnQpIHx8XG4gICAgICAodHlwZW9mIHByZXZpb3VzPy5wZXJpb2Rfc3RhcnQgPT09ICdzdHJpbmcnICYmIChwcmV2aW91cy5wZXJpb2Rfc3RhcnQgYXMgc3RyaW5nKSkgfHxcbiAgICAgIHVuZGVmaW5lZDtcblxuICAgIC8vIE5vIHBlcmlvZF9zdGFydCBhbnl3aGVyZSBcdTIxRDIgc25hcHNob3QgdGhlIHBlcmlvZCB0aGF0IGNvbnRhaW5zIHRoZVxuICAgIC8vIHNuYXBzaG90IGRheSAoZmFsbGluZyBiYWNrIHRvIHRvZGF5KS4gYHBlcmlvZF9zdGFydGAgaXMgcmVxdWlyZWQgK1xuICAgIC8vIG5vdE51bGwsIHNvIGJlZm9yZSB0aGlzIHRoZSB3cml0ZSBzaW1wbHkgZmFpbGVkOyBkZXJpdmluZyBpdCBpcyB3aGF0XG4gICAgLy8gbWFrZXMgYHsgcGVyaW9kOiAncXVhcnRlcicgfWAgYSBjb21wbGV0ZSwgY2FsZW5kYXItdHJ1ZSBzbmFwc2hvdFxuICAgIC8vIHJlcXVlc3QgXHUyMDE0IHRoZSBvbmx5IHNoYXBlIGFuIGF1dG9tYXRlZCB3cml0ZXIgY2FuIGV4cHJlc3MuXG4gICAgaWYgKCFzdGFydFN0cikge1xuICAgICAgY29uc3QgYW5jaG9yU3RyID1cbiAgICAgICAgKHR5cGVvZiBpbnB1dC5zbmFwc2hvdF9kYXRlID09PSAnc3RyaW5nJyAmJiBpbnB1dC5zbmFwc2hvdF9kYXRlKSB8fFxuICAgICAgICAodHlwZW9mIHByZXZpb3VzPy5zbmFwc2hvdF9kYXRlID09PSAnc3RyaW5nJyAmJiAocHJldmlvdXMuc25hcHNob3RfZGF0ZSBhcyBzdHJpbmcpKSB8fFxuICAgICAgICBpc29EYXRlKG5ldyBEYXRlKCkpO1xuICAgICAgY29uc3QgYW5jaG9yID0gbmV3IERhdGUoYCR7YW5jaG9yU3RyLnNsaWNlKDAsIDEwKX1UMDA6MDA6MDBaYCk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihhbmNob3IuZ2V0VGltZSgpKSkge1xuICAgICAgICBzdGFydFN0ciA9IGlzb0RhdGUoc3RhcnRPZlBlcmlvZChwZXJpb2QsIGFuY2hvcikpO1xuICAgICAgICBpbnB1dC5wZXJpb2Rfc3RhcnQgPSBzdGFydFN0cjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhcnRTdHIpIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoYCR7c3RhcnRTdHJ9VDAwOjAwOjAwWmApO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oc3RhcnQuZ2V0VGltZSgpKSkge1xuICAgICAgICBjb25zdCBlbmQgPSBwZXJpb2QgPT09ICdxdWFydGVyJyA/IGVuZE9mUXVhcnRlcihzdGFydCkgOiBlbmRPZk1vbnRoKHN0YXJ0KTtcbiAgICAgICAgaWYgKCFpbnB1dC5wZXJpb2RfZW5kKSBpbnB1dC5wZXJpb2RfZW5kID0gaXNvRGF0ZShlbmQpO1xuICAgICAgICBpZiAoIWlucHV0LnBlcmlvZF9sYWJlbCkgaW5wdXQucGVyaW9kX2xhYmVsID0gbGFiZWxGb3IocGVyaW9kLCBzdGFydCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpbnB1dC5zbmFwc2hvdF9kYXRlICYmICFwcmV2aW91cz8uc25hcHNob3RfZGF0ZSkge1xuICAgICAgaW5wdXQuc25hcHNob3RfZGF0ZSA9IGlzb0RhdGUobmV3IERhdGUoKSk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZm9yZWNhc3REZXJpdmU7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2xlYWQuaG9vay50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvbGVhZC5ob29rLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tDb250ZXh0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEhvb2tBcGkgfSBmcm9tICcuL19ob29rLWFwaSc7XG5cbi8qKlxuICogTGVhZCBhdXRvbWF0aW9uIGhvb2suXG4gKlxuICogLSBBdXRvLXNjb3JlcyBpbmNvbWluZyBsZWFkcyBpbnRvIGByYXRpbmdgICgxLTUpIHVzaW5nIGluZHVzdHJ5L3RpdGxlL2VtYWlsL3Bob25lIHdlaWdodHMuXG4gKiAtIFJlZnVzZXMgZWRpdHMgdG8gYSBjb252ZXJ0ZWQgbGVhZCBcdTIwMTQgYnV0IG5vdCB0aGUgZW5naW5lJ3MgcmVmZXJlbmNlIGNsZWFudXAsXG4gKiAgIHNvIGEgY29udmVydGVkIGxlYWQgbmV2ZXIgbWFrZXMgaXRzIGNvbnZlcnNpb24gcHJvZHVjdHMgdW5kZWxldGFibGUuXG4gKiAtIFdoZW4gc3RhdHVzIGZsaXBzIHRvIGBxdWFsaWZpZWRgLCBzY2hlZHVsZXMgYSBmb2xsb3ctdXAgYGNybV90YXNrYCBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAqIC0gTm9ybWFsaXplcyBgZW1haWxgIGFuZCBmbGFncyBhIHJlLWNhcHR1cmVkIGFkZHJlc3MgYXMgYSBzdXNwZWN0ZWQgZHVwbGljYXRlLlxuICovXG5cbi8vIFx1MjZBMFx1RkUwRiBUaGUgc2NvcmluZyBjb25zdGFudHMgYW5kIGBjb21wdXRlUmF0aW5nYCBsaXZlIElOU0lERSBgbGVhZF9hdXRvbWF0aW9uYCdzXG4vLyBoYW5kbGVyOiBMMiBob29rIGJvZGllcyBydW4gYm9keS1vbmx5IGluIHRoZSBRdWlja0pTIHNhbmRib3gsIHNvIG1vZHVsZSBzY29wZVxuLy8gaXMgbm90IHJlYWNoYWJsZSBhdCBydW50aW1lLiBUdW5lIHRoZSB3ZWlnaHRzIGluIHRoZSBoYW5kbGVyIFx1MjAxNCBhIG1vZHVsZS1sZXZlbFxuLy8gY29weSBpcyBkZWFkIGNvZGUgdGhhdCBzaWxlbnRseSBkaXZlcmdlcyBmcm9tIHRoZSBjb3B5IHRoYXQgYWN0dWFsbHkgcnVucy5cblxuLyoqXG4gKiBMZWFkIGF1dG8tYXNzaWdubWVudCAobG9hZC1iYWxhbmNlZCByb3VuZC1yb2JpbikuXG4gKlxuICogQSBsZWFkIGNyZWF0ZWQgd2l0aG91dCBhbiBvd25lciAoQ1NWIGltcG9ydCwgd2ViLXRvLWxlYWQsIEFQSSBjYXB0dXJlKSBpc1xuICogYXNzaWduZWQgdG8gdGhlIHNhbGVzIHJlcCB3aXRoIHRoZSBGRVdFU1Qgb3BlbiBsZWFkcyBcdTIwMTQgYSBzZWxmLWJhbGFuY2luZ1xuICogcm91bmQtcm9iaW4gdGhhdCBuZWVkcyBubyByb3RhdGlvbiBjb3VudGVyLiBJdCB3cml0ZXMgYG93bmVyX2lkYCwgdGhlIHBsYXRmb3JtXG4gKiBvd25lcnNoaXAgYW5jaG9yIHRoYXQgT1dELCBzaGFyaW5nIGFuZCB0aGUgXCJNeSBMZWFkc1wiIHZpZXcgYWxsIHJlYWQsIHNvIHRoZVxuICogYXNzaWduZWQgcmVwIHJlYWxseSBvd25zIHRoZSBsZWFkIHJhdGhlciB0aGFuIG1lcmVseSBiZWluZyBuYW1lZCBvbiBpdC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgV3JpdGluZyBhIEZPUkVJR04gb3duZXIgaXMgbm9ybWFsbHkgYW4gb3duZXJzaGlwIHRyYW5zZmVyLCBkZW5pZWQgd2l0aG91dFxuICogYGFsbG93VHJhbnNmZXJgICgjMzAwNCkuIEl0IHBhc3NlcyBoZXJlIGJlY2F1c2Ugb2YgV0hFUkUgdGhpcyBydW5zLCBub3Qgd2hhdFxuICogaXQgaXMgZ3JhbnRlZDogYSBgYmVmb3JlSW5zZXJ0YCBob29rIG11dGF0ZXMgYG9wQ3R4LmRhdGFgIElOU0lERSB0aGUgb3BlcmF0aW9uXG4gKiB0aGUgc2VjdXJpdHkgbWlkZGxld2FyZSBhbHJlYWR5IHdyYXBwZWQsIHNvIHRoZSBndWFyZCByZWFkIChhbmQgc3RhbXBlZCkgdGhlXG4gKiBwYXlsb2FkIGJlZm9yZSB0aGlzIGxpbmUgY2hhbmdlZCBpdC4gYHRlc3Qvb3duZXJzaGlwLW1vZGVsLnRlc3QudHNgIHBpbnMgdGhhdFxuICogb3JkZXJpbmcgYWdhaW5zdCBhIHJlYWwgT2JqZWN0UUwgXHUyMDE0IGFuIGFzc3VtcHRpb24gaGVyZSB3b3VsZCBiZSB0aGUgZGlmZmVyZW5jZVxuICogYmV0d2VlbiByb3VuZC1yb2JpbiB3b3JraW5nIGFuZCBldmVyeSB3ZWItdG8tbGVhZCBzdWJtaXNzaW9uIDQwMy1pbmcuXG4gKlxuICogVGhlIHJlcCBwb29sIGlzIHdob2V2ZXIgaG9sZHMgdGhlIGBzYWxlc19yZXBgIHBvc2l0aW9uIChgc3lzX3VzZXJfcG9zaXRpb25gKS5cbiAqIFdoZW4gdGhhdCBwb29sIGlzIGVtcHR5IChhIGZyZXNoIG9yZyBiZWZvcmUgcG9zaXRpb25zIGFyZSBhc3NpZ25lZCkgdGhlIGhvb2tcbiAqIGlzIGEgTk8tT1AgYW5kIHRoZSBsZWFkIGtlZXBzIHdoYXRldmVyIG93bmVyIGl0IGhhZCBcdTIwMTQgaXQgbmV2ZXIgYmxvY2tzIGxlYWRcbiAqIGNyZWF0aW9uLiBVSS1jcmVhdGVkIGxlYWRzIGFscmVhZHkgY2FycnkgYG93bmVyX2lkYCA9IGNyZWF0b3IgKHRoZVxuICogbWlkZGxld2FyZSdzIGluc2VydC10aW1lIHN0YW1wKSwgc28gdGhpcyBvbmx5IGZpcmVzIG9uIGdlbnVpbmVseSBvd25lcmxlc3NcbiAqIGludGFrZS5cbiAqXG4gKiBSdW5zIGJlZm9yZUluc2VydCBzbyB0aGUgZG93bnN0cmVhbSBgbGVhZF9hc3NpZ25tZW50YCBmbG93IChhZnRlckluc2VydCkgc2Vlc1xuICogdGhlIGFzc2lnbmVkIG93bmVyIGFuZCByb3V0ZXMgaXRzIFNMQSBhbGVydCB0byB0aGF0IHJlcC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgUHJpb3JpdHkgMjUwIFx1MjAxNCBob29rcyBydW4gaW4gQVNDRU5ESU5HIHByaW9yaXR5IG9yZGVyLCBzbyB0aGlzIG11c3QgcnVuXG4gKiBBRlRFUiBgbGVhZF9hdXRvbWF0aW9uYCAoMjAwKSwgd2hvc2UgZ3Vlc3QgYnJhbmNoIHN0cmlwcyBhIGNsaWVudC1zcG9vZmVkXG4gKiBgb3duZXJfaWRgIGZyb20gYW5vbnltb3VzIFdlYi10by1MZWFkIHN1Ym1pc3Npb25zLiBBc3NpZ25pbmcgZmlyc3QgYW5kIGJlaW5nXG4gKiBzdHJpcHBlZCBhZnRlcndhcmRzIGxhbmRzIGV2ZXJ5IHdlYi10by1sZWFkIG93bmVybGVzcyBcdTIwMTQgdGhlIGV4YWN0IGNhc2UgdGhpc1xuICogaG9vayBleGlzdHMgZm9yLlxuICovXG5jb25zdCBsZWFkQXV0b0Fzc2lnbkhvb2s6IEhvb2sgPSB7XG4gIG5hbWU6ICdsZWFkX2F1dG9fYXNzaWduJyxcbiAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0J10sXG4gIHByaW9yaXR5OiAyNTAsXG4gIGRlc2NyaXB0aW9uOiAnQXNzaWduIG93bmVybGVzcyBuZXcgbGVhZHMgdG8gdGhlIGxlYXN0LWxvYWRlZCBzYWxlcyByZXAuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgLy8gUmVzcGVjdCBhbiBleHBsaWNpdCAvIGNyZWF0b3ItYXNzaWduZWQgb3duZXIuIE9uIGEgd3JpdGUgdGhhdCBjYXJyaWVzIGFcbiAgICAvLyB1c2VyIHRoZSBzZWN1cml0eSBtaWRkbGV3YXJlIGhhcyBBTFJFQURZIHN0YW1wZWQgYG93bmVyX2lkYCB0byB0aGF0IHVzZXJcbiAgICAvLyBieSB0aGUgdGltZSB0aGlzIHJ1bnMsIHNvIHRoaXMgaXMgYWxzbyB3aGF0IG1ha2VzIHRoZSBob29rIGEgbm8tb3AgZm9yXG4gICAgLy8gb3JkaW5hcnkgVUkgY3JlYXRpb24gXHUyMDE0IG9ubHkgZ2VudWluZWx5IG93bmVybGVzcyBpbnRha2UgZmFsbHMgdGhyb3VnaC5cbiAgICBpZiAodHlwZW9mIGlucHV0Lm93bmVyX2lkID09PSAnc3RyaW5nJyAmJiBpbnB1dC5vd25lcl9pZCkgcmV0dXJuO1xuICAgIGNvbnN0IGFwaSA9IGN0eC5hcGkgYXMgSG9va0FwaSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFwaSkgcmV0dXJuO1xuXG4gICAgLy8gQXV0by1hc3NpZ25tZW50IGlzIGEgYmVzdC1lZmZvcnQgRU5IQU5DRU1FTlQgXHUyMDE0IGl0IG11c3QgTkVWRVIgYmxvY2sgbGVhZFxuICAgIC8vIGNyZWF0aW9uLiBJbiBwYXJ0aWN1bGFyIGFuIGFub255bW91cyBXZWItdG8tTGVhZCBzdWJtaXNzaW9uIHJ1bnMgdW5kZXIgdGhlXG4gICAgLy8gcHVibGljLWZvcm0gZ3JhbnQsIHdoaWNoIHBlcm1pdHMgb25seSBjcmVhdGUvcmVhZC1iYWNrIG9uIGNybV9sZWFkIGFuZFxuICAgIC8vIERFTklFUyBgZmluZGAgb24gc3lzX3VzZXJfcG9zaXRpb247IGxldHRpbmcgdGhhdCBkZW5pYWwgcHJvcGFnYXRlIHdvdWxkXG4gICAgLy8gcmVqZWN0IHRoZSB3aG9sZSBpbnNlcnQgYW5kIGJyZWFrIHRoZSBwdWJsaWMgZm9ybS4gU28gdGhlIHBvb2wgbG9va3VwICtcbiAgICAvLyBsb2FkIGJhbGFuY2luZyBhcmUgd3JhcHBlZDogb24gQU5ZIGVycm9yIChwZXJtaXNzaW9uLCBldGMuKSB3ZSBsb2cgYW5kXG4gICAgLy8gbGVhdmUgdGhlIGxlYWQgb3duZXJsZXNzIChhIG1hbmFnZXIgLyB0aGUgbGVhZF9hc3NpZ25tZW50IGZsb3cgcm91dGVzIGl0KS5cbiAgICB0cnkge1xuICAgICAgLy8gUmVwIHBvb2wgPSBob2xkZXJzIG9mIHRoZSBzYWxlc19yZXAgcG9zaXRpb24uXG4gICAgICBjb25zdCBob2xkZXJzID0gYXdhaXQgYXBpLm9iamVjdCgnc3lzX3VzZXJfcG9zaXRpb24nKS5maW5kKHtcbiAgICAgICAgd2hlcmU6IHsgcG9zaXRpb246ICdzYWxlc19yZXAnIH0sIGZpZWxkczogWyd1c2VyX2lkJ10sIHRvcDogMTAwMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVwSWRzID0gQXJyYXkuZnJvbShcbiAgICAgICAgbmV3IFNldChcbiAgICAgICAgICAoaG9sZGVycyA/PyBbXSlcbiAgICAgICAgICAgIC5tYXAoKHIpID0+ICh0eXBlb2Ygci51c2VyX2lkID09PSAnc3RyaW5nJyA/IHIudXNlcl9pZCA6ICcnKSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbiksXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgaWYgKHJlcElkcy5sZW5ndGggPT09IDApIHJldHVybjsgLy8gbm8gcG9vbCBcdTIxOTIgbGVhdmUgb3duZXJsZXNzIChuby1vcClcblxuICAgICAgLy8gUGljayB0aGUgcmVwIHdpdGggdGhlIGZld2VzdCBPUEVOIChub24tY29udmVydGVkKSBsZWFkcy5cbiAgICAgIGxldCBiZXN0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgYmVzdENvdW50ID0gSW5maW5pdHk7XG4gICAgICBmb3IgKGNvbnN0IHJlcElkIG9mIHJlcElkcykge1xuICAgICAgICBjb25zdCBvcGVuQ291bnQgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fbGVhZCcpLmNvdW50KHtcbiAgICAgICAgICB3aGVyZTogeyBvd25lcl9pZDogcmVwSWQsIGlzX2NvbnZlcnRlZDogZmFsc2UgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvcGVuQ291bnQgPCBiZXN0Q291bnQpIHtcbiAgICAgICAgICBiZXN0Q291bnQgPSBvcGVuQ291bnQ7XG4gICAgICAgICAgYmVzdCA9IHJlcElkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYmVzdCkgaW5wdXQub3duZXJfaWQgPSBiZXN0O1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3dhbGxvdzogYXV0by1hc3NpZ25tZW50IG11c3QgbmV2ZXIgYmxvY2sgdGhlIGluc2VydC4gQ29tbW9uIGNhc2UgaXMgdGhlXG4gICAgICAvLyBhbm9ueW1vdXMgcHVibGljLWZvcm0gY29udGV4dCwgd2hpY2ggY2FuJ3QgcmVhZCBzeXNfdXNlcl9wb3NpdGlvbiBcdTIwMTQgdGhlXG4gICAgICAvLyBsZWFkIGlzIHN0aWxsIGNhcHR1cmVkLCBvd25lcmxlc3MsIGZvciBkb3duc3RyZWFtIHJvdXRpbmcuIChObyBgY29uc29sZWBcbiAgICAgIC8vIGhlcmUgXHUyMDE0IHRoZSBMMiBob29rIHNhbmRib3ggZG9lc24ndCBkZWZpbmUgaXQuKVxuICAgIH1cbiAgfSxcbn07XG5cbmNvbnN0IGxlYWRIb29rOiBIb29rID0ge1xuICBuYW1lOiAnbGVhZF9hdXRvbWF0aW9uJyxcbiAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZScsICdhZnRlclVwZGF0ZSddLFxuICBwcmlvcml0eTogMjAwLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnU2NvcmUgbmV3IGxlYWRzLCBsb2NrIGNvbnZlcnRlZCBsZWFkcywgYW5kIGNyZWF0ZSBmb2xsb3ctdXAgdGFzayBvbiBxdWFsaWZpY2F0aW9uLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgLy8gVGhlIHJlZnVzYWwgZW52ZWxvcGUgKCMxMDc1KS4gTWlycm9yZWQgZnJvbSBgLi9fcmVmdXNhbC50c2AgYmVjYXVzZSBhXG4gICAgLy8gbG93ZXJlZCBib2R5IGhhcyBubyBtb2R1bGUgc2NvcGUgYW5kIGBleHRyYWN0SG9va0JvZHlgIFRIUk9XUyBvbiBhblxuICAgIC8vIGltcG9ydDsgYHRlc3QvcmVmdXNhbC1lbnZlbG9wZS50ZXN0LnRzYCBwaW5zIGV2ZXJ5IGNvcHkgYWdhaW5zdCBpdC5cbiAgICBmdW5jdGlvbiByZWZ1c2UoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb2RlOiBzdHJpbmcsXG4gICAgICBzdGF0dXM6IG51bWJlcixcbiAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmcgPSBtZXNzYWdlLFxuICAgICk6IEVycm9yIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29kZTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZztcbiAgICAgIH07XG4gICAgICBlcnIuY29kZSA9IGNvZGU7XG4gICAgICBlcnIuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgZXJyLnVzZXJNZXNzYWdlID0gdXNlck1lc3NhZ2U7XG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjb25zdCB7IGV2ZW50LCBpbnB1dCB9ID0gY3R4O1xuXG4gICAgY29uc3QgSElHSF9WQUxVRV9JTkRVU1RSSUVTID0gbmV3IFNldChbJ3RlY2hub2xvZ3knLCAnZmluYW5jZScsICdoZWFsdGhjYXJlJ10pO1xuICAgIGNvbnN0IFNFTklPUl9USVRMRV9QQVRURVJOID0gL1xcYihjZW98Y3RvfGNmb3xjaW98Y29vfGZvdW5kZXJ8dnB8dmljZSBwcmVzaWRlbnR8ZGlyZWN0b3J8aGVhZCBvZilcXGIvaTtcbiAgICBmdW5jdGlvbiBjb21wdXRlUmF0aW5nKGlucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IG51bWJlciB7XG4gICAgICBsZXQgc2NvcmUgPSAwO1xuICAgICAgY29uc3QgZW1haWwgPSB0eXBlb2YgaW5wdXQuZW1haWwgPT09ICdzdHJpbmcnID8gaW5wdXQuZW1haWwgOiAnJztcbiAgICAgIGNvbnN0IHBob25lID0gdHlwZW9mIGlucHV0LnBob25lID09PSAnc3RyaW5nJyA/IGlucHV0LnBob25lIDogJyc7XG4gICAgICBjb25zdCB0aXRsZSA9IHR5cGVvZiBpbnB1dC50aXRsZSA9PT0gJ3N0cmluZycgPyBpbnB1dC50aXRsZSA6ICcnO1xuICAgICAgY29uc3QgaW5kdXN0cnkgPSB0eXBlb2YgaW5wdXQuaW5kdXN0cnkgPT09ICdzdHJpbmcnID8gaW5wdXQuaW5kdXN0cnkgOiAnJztcbiAgICAgIGNvbnN0IGVtcGxveWVlcyA9IHR5cGVvZiBpbnB1dC5udW1iZXJfb2ZfZW1wbG95ZWVzID09PSAnbnVtYmVyJyA/IGlucHV0Lm51bWJlcl9vZl9lbXBsb3llZXMgOiAwO1xuICAgICAgY29uc3QgcmV2ZW51ZSA9IHR5cGVvZiBpbnB1dC5hbm51YWxfcmV2ZW51ZSA9PT0gJ251bWJlcicgPyBpbnB1dC5hbm51YWxfcmV2ZW51ZSA6IDA7XG4gICAgICBpZiAoZW1haWwgJiYgIS8oZ21haWx8eWFob298aG90bWFpbHxvdXRsb29rfHFxfDE2MylcXC5jb20kL2kudGVzdChlbWFpbCkpIHNjb3JlICs9IDE7XG4gICAgICBpZiAocGhvbmUubGVuZ3RoID4gMCkgc2NvcmUgKz0gMC41O1xuICAgICAgaWYgKFNFTklPUl9USVRMRV9QQVRURVJOLnRlc3QodGl0bGUpKSBzY29yZSArPSAxLjU7XG4gICAgICBpZiAoSElHSF9WQUxVRV9JTkRVU1RSSUVTLmhhcyhpbmR1c3RyeSkpIHNjb3JlICs9IDE7XG4gICAgICBpZiAoZW1wbG95ZWVzID49IDIwMCkgc2NvcmUgKz0gMC41O1xuICAgICAgaWYgKHJldmVudWUgPj0gMTBfMDAwXzAwMCkgc2NvcmUgKz0gMC41O1xuICAgICAgLy8gQ2FwIGF0IDUsIGZsb29yIGF0IDEsIHJvdW5kIHRvIFdIT0xFIHN0YXJzIFx1MjAxNCBgcmF0aW5nYCBpcyBhIDEtNSBzdGFyXG4gICAgICAvLyBmaWVsZDsgaGFsZiB2YWx1ZXMgcmVuZGVyZWQgaW5jb25zaXN0ZW50bHkgaW4gdGhlIHN0YXIgd2lkZ2V0LlxuICAgICAgY29uc3QgY2xhbXBlZCA9IE1hdGgubWF4KDEsIE1hdGgubWluKDUsIHNjb3JlKSk7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChjbGFtcGVkKTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVJbnNlcnQnKSB7XG4gICAgICAvLyBXZWItdG8tTGVhZDogYW5vbnltb3VzIHN1Ym1pc3Npb25zIGZyb20gdGhlIHB1YmxpYyBmb3JtIGdldCBzZW5zaWJsZVxuICAgICAgLy8gZGVmYXVsdHMgc3RhbXBlZCBzZXJ2ZXItc2lkZSBzbyB0aGV5IGNhbm5vdCBiZSBzcG9vZmVkIGJ5IHRoZSBjbGllbnQuXG4gICAgICAvLyBHdWVzdHMgYXJlIHVuYXV0aGVudGljYXRlZCwgc28gd2UgaWRlbnRpZnkgdGhlbSBieSB0aGUgYWJzZW5jZSBvZlxuICAgICAgLy8gYGN0eC51c2VyPy5pZGAuIChUaGUgYGd1ZXN0X3BvcnRhbGAgcHJvZmlsZSBhbHJlYWR5IHJlc3RyaWN0cyB0aGVtIHRvXG4gICAgICAvLyBJTlNFUlQtb25seSBvbiBgY3JtX2xlYWRgLilcbiAgICAgIC8vXG4gICAgICAvLyBcdTI2QTBcdUZFMEYgYCFjdHguc2Vzc2lvbj8uaXNTeXN0ZW1gIGlzIHJlcXVpcmVkLCBub3QgZGVjb3JhdGlvbjogYSBTWVNURU0gd3JpdGVcbiAgICAgIC8vIChzZWVkIGxvYWQsIGJhY2tmaWxsLCBzZWVkLW93bmVyc2hpcCBjbGFpbSkgYWxzbyBhcnJpdmVzIHdpdGggbm8gdXNlciBpZCwgYW5kXG4gICAgICAvLyB0aGUgc3RyaXAgYmVsb3cgd291bGQgb3RoZXJ3aXNlIGJsYW5rIHRoZSBvd25lciBhbmQgY29udmVyc2lvbiBzdGF0ZSBvZlxuICAgICAgLy8gZXZlcnkgc3lzdGVtLXdyaXR0ZW4gbGVhZC4gVGhlIGNvbnZlcnRlZC1sZWFkIGxvY2sgZnVydGhlciBkb3duIHJlYWRzXG4gICAgICAvLyB0aGF0IHNhbWUgYWJzZW5jZSBhcyB0aGUgc3lzdGVtLXdyaXRlIHNpZ25hbCwgc28gdGhlIHR3byByZWFkaW5ncyBoYXZlXG4gICAgICAvLyB0byBhZ3JlZS4gYGNhc2UuaG9vay50c2AncyBndWVzdCBicmFuY2ggY2FycmllcyB0aGUgc2FtZSBjb3JyZWN0aW9uLlxuICAgICAgY29uc3QgaXNHdWVzdFN1Ym1pc3Npb24gPSAhY3R4LnVzZXI/LmlkICYmICFjdHguc2Vzc2lvbj8uaXNTeXN0ZW07XG4gICAgICBpZiAoaXNHdWVzdFN1Ym1pc3Npb24pIHtcbiAgICAgICAgaWYgKCFpbnB1dC5sZWFkX3NvdXJjZSkgaW5wdXQubGVhZF9zb3VyY2UgPSAnd2ViJztcbiAgICAgICAgaWYgKCFpbnB1dC5zdGF0dXMpICAgICAgaW5wdXQuc3RhdHVzICAgICAgPSAnbmV3JztcbiAgICAgICAgLy8gTmV2ZXIgdHJ1c3QgY2xpZW50LXN1cHBsaWVkIGNvbnZlcnNpb24gLyBvd25lcnNoaXAgZmllbGRzIG9uIGEgcHVibGljXG4gICAgICAgIC8vIGZvcm0gXHUyMDE0IE9WRVJXUklURSB0aGVtIHdpdGggYSBzYWZlIHZhbHVlLlxuICAgICAgICAvL1xuICAgICAgICAvLyBcdTI3MDUgSElTVE9SWSwgUkVTT0xWRUQgXHUyMDE0IGFuZCB0aGUgY29uY2x1c2lvbiBpcyB1bmNoYW5nZWQuIFRocm91Z2hcbiAgICAgICAgLy8gMTcuMi4wLCBgZGVsZXRlIGlucHV0LnhgIGluIGEgaG9vayB3YXMgYSBTSUxFTlQgTk8tT1A6IE9iamVjdFFMJ3NcbiAgICAgICAgLy8gZmxhdC1yZWNvcmQgaW5wdXQgUHJveHkgaGFkIG5vIGBkZWxldGVQcm9wZXJ0eWAgdHJhcCwgc28gdGhlIGtleVxuICAgICAgICAvLyBzdXJ2aXZlZCB0aGUgZGVsZXRlIGFuZCByZWFjaGVkIHN0b3JhZ2UsIHdoaWxlIGFuIEFTU0lHTk1FTlQgdG8gdGhlXG4gICAgICAgIC8vIHNhbWUga2V5IG9uIHRoZSBzYW1lIGBpbnB1dGAgbGFuZGVkIG5vcm1hbGx5LiBUaGlzIGJsb2NrIHdhcyB0ZW5cbiAgICAgICAgLy8gYGRlbGV0ZWAgc3RhdGVtZW50cyBhbmQgZXZlcnkgb25lIG9mIHRoZW0gZGlkIG5vdGhpbmc7IHRoZSBzeW1wdG9tIHdhc1xuICAgICAgICAvLyBhIGd1ZXN0IGluc2VydCBzdG9yaW5nIGBpc19jb252ZXJ0ZWQ6IHRydWVgIGFuZCBhbiBgb3duZXJfaWRgIGl0XG4gICAgICAgIC8vIHN1cHBsaWVkIGl0c2VsZi4gQXNzaWdubWVudCBpcyB3aGF0IHRoaXMgYmxvY2sgdXNlcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVXBzdHJlYW0gb2JqZWN0c3RhY2sjMTIyNzcgc2hpcHBlZCBpbiAqKjE3LjMuMCoqLCBzbyBldmVyeSBsYXRlclxuICAgICAgICAvLyBwaW4gY2FycmllcyB0aGUgZml4IGFuZCBgZGVsZXRlYCBpcyBlZmZlY3RpdmUgb24gYm90aCBleGVjdXRpb24gcGF0aHMuXG4gICAgICAgIC8vIFx1MjZENCBUaGF0IGlzIHN0aWxsIG5vdCBhIGxpY2VuY2UgdG8gc3BlbGwgdGhpcyBibG9jayB3aXRoIGBkZWxldGVgOiB0aGVcbiAgICAgICAgLy8gYXNzaWdubWVudHMgYXJlIGxvYWQtYmVhcmluZyBhcyBXUklURVMgXHUyMDE0IGBsZWFkX2R1cGxpY2F0ZV9jaGVja2Agc3RhbmRzXG4gICAgICAgIC8vIGRvd24gb25seSBvbiBhIE5PTi1CTEFOSyB2ZXJkaWN0LCBzbyB0aGVzZSBjb2x1bW5zIG11c3QgYXJyaXZlIGBudWxsYFxuICAgICAgICAvLyByYXRoZXIgdGhhbiBBQlNFTlQuIGBjYXNlLmhvb2sudHNgJ3MgY29weSBjYXJyaWVzIHRoZSBmdWxsIG5vdGUgYW5kXG4gICAgICAgIC8vIHRoZSBtZWFzdXJlbWVudDsgYHRlc3QvaG9vay1pbnB1dC1zaGFwZS50ZXN0LnRzYCBwaW5zIHRoZSBuZXcgY29udHJhY3QuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIGBudWxsYCBpcyB0aGUgbm8tdmFsdWUgc3BlbGxpbmcgdGhyb3VnaG91dCwgYW5kIGl0IGlzIGxvYWQtYmVhcmluZ1xuICAgICAgICAvLyB0d2ljZSBvdmVyOiBgbGVhZF9hdXRvX2Fzc2lnbmAgc3RhbmRzIGRvd24gb25seSBvbiBhIG5vbi1lbXB0eSBTVFJJTkdcbiAgICAgICAgLy8gYG93bmVyX2lkYCwgYW5kIGBsZWFkX2R1cGxpY2F0ZV9jaGVja2Agc3RhbmRzIGRvd24gb25seSBvbiBhIE5PTi1CTEFOS1xuICAgICAgICAvLyBgZHVwbGljYXRlX3N0YXR1c2AgLyBgZHVwbGljYXRlX29mX3R5cGVgIFx1MjAxNCB3aGVyZSBpdHMgb3duIGBpc0JsYW5rYFxuICAgICAgICAvLyBjb3VudHMgYG51bGxgIGFzIGJsYW5rLiBCb3RoIHRoZXJlZm9yZSBzdGlsbCBydW4gb24gYSBzYW5pdGlzZWQgZ3Vlc3RcbiAgICAgICAgLy8gc3VibWlzc2lvbiwgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHRoZSByZW1vdmVkIGRlbGV0ZXMgd2VyZSBmb3IuXG4gICAgICAgIGlucHV0LmlzX2NvbnZlcnRlZCAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgaW5wdXQuY29udmVydGVkX2FjY291bnQgICAgICA9IG51bGw7XG4gICAgICAgIGlucHV0LmNvbnZlcnRlZF9jb250YWN0ICAgICAgPSBudWxsO1xuICAgICAgICBpbnB1dC5jb252ZXJ0ZWRfb3Bwb3J0dW5pdHkgID0gbnVsbDtcbiAgICAgICAgaW5wdXQuY29udmVydGVkX2RhdGUgICAgICAgICA9IG51bGw7XG4gICAgICAgIGlucHV0Lm93bmVyX2lkICAgICAgICAgICAgICAgPSBudWxsO1xuICAgICAgICAvLyBTYW1lIHJlYXNvbmluZyBmb3IgdGhlIGR1cGxpY2F0ZSBsaW5rOiBhIHN1Ym1pdHRlciB3aG8gY2FuIHBvc3RcbiAgICAgICAgLy8gYGR1cGxpY2F0ZV9zdGF0dXM6ICdjb25maXJtZWQnYCBjYW4gc3dpdGNoIE9GRiB0aGUgaW50YWtlIGRlZHVwZSBmb3JcbiAgICAgICAgLy8gdGhlaXIgb3duIHN1Ym1pc3Npb24gKGBsZWFkX2R1cGxpY2F0ZV9jaGVja2Agc3RhbmRzIGRvd24gb24gYSByZWNvcmRcbiAgICAgICAgLy8gdGhhdCBhbHJlYWR5IGNhcnJpZXMgYSB2ZXJkaWN0KSBhbmQgcGFyayBhIGxpbmsgdG8gYW55IHJlY29yZCBpZCB0aGV5XG4gICAgICAgIC8vIGNhcmUgdG8gZ3Vlc3MuIEd1ZXN0cyBzdGF0ZSBmYWN0cyBhYm91dCB0aGVtc2VsdmVzLCBuZXZlciBhYm91dCB0aGVcbiAgICAgICAgLy8gcGlwZWxpbmUuXG4gICAgICAgIGlucHV0LmR1cGxpY2F0ZV9vZl90eXBlICAgICAgPSBudWxsO1xuICAgICAgICBpbnB1dC5kdXBsaWNhdGVfb2ZfbGVhZCAgICAgID0gbnVsbDtcbiAgICAgICAgaW5wdXQuZHVwbGljYXRlX29mX2NvbnRhY3QgICA9IG51bGw7XG4gICAgICAgIGlucHV0LmR1cGxpY2F0ZV9zdGF0dXMgICAgICAgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGlucHV0LnJhdGluZyAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgaW5wdXQucmF0aW5nID0gY29tcHV0ZVJhdGluZyhpbnB1dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFRoZSBjb252ZXJzaW9uIGFwcHJvdmFsIGdhdGUgKFJFUS0wMDA1IHN0ZXAgNykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBcdTMwMENcdTdFQkZcdTdEMjJcdTVCRjlcdTVFOTRcdTVCQTFcdTYyNzlcdTZENDFcdTdBMEJcdUZGMENcdTVCQTFcdTYyNzlcdTkwMUFcdThGQzdcdTU0MEVcdTY1QjlcdTUzRUZcdThGNkNcdTUzMTZcdTRFM0FcdTZCNjNcdTVGMEZcdTU1NDZcdTY3M0FcdTMwMEQuIFRoaXMgaXMgdGhlIFdSSVRFLVBBVEhcbiAgICAvLyBoYWxmIG9mIHRoZSBnYXRlOyBgY29udmVydF9sZWFkYCdzIGB2aXNpYmxlYCBwcmVkaWNhdGUgaXMgdGhlIG90aGVyLCBhbmRcbiAgICAvLyBpdCBvbmx5IGhpZGVzIGEgYnV0dG9uLiBIaWRpbmcgYSBidXR0b24gaXMgbm90IGEgY29udHJvbDogdGhlIGNvbnZlcnNpb25cbiAgICAvLyBzY3JlZW4gZmxvdyBpcyByZWFjaGFibGUgb3ZlciBSRVNUIChgUE9TVCAvYXV0b21hdGlvbi9sZWFkX2NvbnZlcnNpb24vXG4gICAgLy8gdHJpZ2dlcmApLCBhbmQgc28gaXMgYSBiYXJlIGBQQVRDSGAgdGhhdCBzZXRzIGBpc19jb252ZXJ0ZWRgIGl0c2VsZi4gQm90aFxuICAgIC8vIGxhbmQgSEVSRSwgYmVjYXVzZSBib3RoIGFyZSBhbiB1cGRhdGUgdG8gYGNybV9sZWFkYC5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBBIFRSQU5TSVRJT04gR0FURSwgbm90IGFuIGludmFyaWFudCAoQUdFTlRTLm1kIG1ldGFkYXRhIHNlbWFudGljcyBydWxlXG4gICAgLy8gNyksIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgYCF3YXNDb252ZXJ0ZWRgIHRlcm0gcmF0aGVyIHRoYW4gYSBjb21tZW50XG4gICAgLy8gY2xhaW1pbmcgaXQuIFRoZSByZWZ1c2FsIGlzIGNvbmRpdGlvbmVkIG9uIHRoZSByZWNvcmQgQ1JPU1NJTkcgaW50b1xuICAgIC8vIGNvbnZlcnRlZCBvbiBUSElTIHdyaXRlOyBhIGxlYWQgdGhhdCB3YXMgYWxyZWFkeSBjb252ZXJ0ZWQgYmVmb3JlIHRoZVxuICAgIC8vIGdhdGUgZXhpc3RlZCBpcyB1bnRvdWNoZWQgYnkgaXQgZm9yZXZlciwgd2hhdGV2ZXIgaXRzIGFwcHJvdmFsIGNvbHVtblxuICAgIC8vIHNheXMgKFJFUS0wMDA1IGFjY2VwdGFuY2UgNCkuIFx1MjZENCBOZXZlciByZXN0YXRlIHRoaXMgYXMgYSBgdmFsaWRhdGlvbnNbXWBcbiAgICAvLyBzY3JpcHQ6IGEgdmFsaWRhdGlvbiBpcyBldmFsdWF0ZWQgYWdhaW5zdCBgey4uLnByZXZpb3VzLCAuLi5kYXRhfWAsIHdoZXJlXG4gICAgLy8gXCJhbHJlYWR5IGNvbnZlcnRlZFwiIGFuZCBcImNvbnZlcnRpbmcgbm93XCIgYXJlIHRoZSBzYW1lIHN0YXRlLCBzbyBpdCB3b3VsZFxuICAgIC8vIGJyaWNrIGV2ZXJ5IGxhdGVyIHdyaXRlIHRvIGV2ZXJ5IGhpc3RvcmljYWwgY29udmVydGVkIGxlYWQuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgVGhlIHZlcmRpY3QgaXMgcmVhZCBvZmYgYHByZXZpb3VzYCwgbmV2ZXIgb2ZmIGBpbnB1dGAuIFRoZSBhcHByb3ZhbFxuICAgIC8vIGNvbHVtbiBpcyBgcmVhZG9ubHk6IHRydWVgLCBzbyBhIGNhbGxlci1zdXBwbGllZCB2YWx1ZSBpcyBzdHJpcHBlZCBiZWZvcmVcbiAgICAvLyBzdG9yYWdlIG9uIHRoZSBub24tc3lzdGVtIHBhdGggXHUyMDE0IGJ1dCBgc3RyaXBSZWFkb25seUZpZWxkc2AgaXMgbm90IGEgdGhpbmdcbiAgICAvLyB0aGlzIGd1YXJkIG1heSBsZWFuIG9uIChpdCBkb2VzIG5vdCBydW4gb24gaW5zZXJ0cywgbm9yIGZvciBhIHN5c3RlbVxuICAgIC8vIHdyaXRlKSwgYW5kIHJlYWRpbmcgdGhlIFNUT1JFRCB2ZXJkaWN0IGlzIHRoZSBjb3JyZWN0IHNlbWFudGljcyBhbnl3YXk6XG4gICAgLy8gd2hhdCBtYXkgY29udmVydCBhIGxlYWQgaXMgd2hhdCBhbiBhcHByb3ZlciBkZWNpZGVkLCBub3Qgd2hhdCB0aGUgd3JpdGVyXG4gICAgLy8gYXR0YWNoZWQgdG8gdGhlIHJlcXVlc3QuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgRmFpbCBPUEVOIG9uIGFuIGFic2VudCBvciB1bnJlY29nbmlzZWQgdmVyZGljdCwgYW5kIHRoYXQgaXMgdGhlIGdhdGUnc1xuICAgIC8vIG9mZiBzd2l0Y2gsIG5vdCBhbiBvdmVyc2lnaHQuIFdpdGggdGhlIGdhdGUgb2ZmIFx1MjAxNCB0aGUgc2hpcHBlZCBkZWZhdWx0IFx1MjAxNFxuICAgIC8vIGV2ZXJ5IGxlYWQgY2FycmllcyBgbm90X3JlcXVpcmVkYCwgYW5kIGEgbGVhZCB0aGF0IHByZWRhdGVzIHRoZSBjb2x1bW5cbiAgICAvLyBjYXJyaWVzIG5vdGhpbmcgYXQgYWxsOyBib3RoIG11c3QgY29udmVydCBleGFjdGx5IGFzIHRoZXkgZGlkIGJlZm9yZSB0aGlzXG4gICAgLy8gZmllbGQgZXhpc3RlZC4gU28gb25seSB0aGUgdHdvIHZlcmRpY3RzIGEgbGl2ZSBhcHByb3ZhbCBhY3R1YWxseSB3cml0ZXNcbiAgICAvLyByZWZ1c2UuIChgY29udmVydF9sZWFkYCdzIHByZWRpY2F0ZSBjYXJyaWVzIHRoZSBzYW1lIHBvbGFyaXR5IGFuZCB0aGVcbiAgICAvLyBzYW1lIHJlYXNvbiwgYWdhaW5zdCBpdHMgb3duIGZhaWwtQ0xPU0VEIG5laWdoYm91cnMuKVxuICAgIGlmIChldmVudCA9PT0gJ2JlZm9yZVVwZGF0ZScpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gY3R4LnByZXZpb3VzO1xuICAgICAgY29uc3Qgd2FzQ29udmVydGVkID0gcHJldmlvdXM/LmlzX2NvbnZlcnRlZCA9PT0gdHJ1ZSB8fCBwcmV2aW91cz8uc3RhdHVzID09PSAnY29udmVydGVkJztcbiAgICAgIGNvbnN0IGlzQ29udmVydGluZyA9XG4gICAgICAgICF3YXNDb252ZXJ0ZWQgJiYgKGlucHV0LmlzX2NvbnZlcnRlZCA9PT0gdHJ1ZSB8fCBpbnB1dC5zdGF0dXMgPT09ICdjb252ZXJ0ZWQnKTtcbiAgICAgIGNvbnN0IHZlcmRpY3QgPSBwcmV2aW91cz8uY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXM7XG4gICAgICBpZiAoaXNDb252ZXJ0aW5nICYmICh2ZXJkaWN0ID09PSAncGVuZGluZycgfHwgdmVyZGljdCA9PT0gJ3JlamVjdGVkJykpIHtcbiAgICAgICAgLy8gTmFtZSB0aGUgbGVhZCB0aGUgd2F5IGBkaXNwbGF5X3RpdGxlYCBkb2VzIFx1MjAxNCBzZWUgdGhlIGNvbnZlcnRlZC1sZWFkXG4gICAgICAgIC8vIGxvY2sgYmVsb3cgZm9yIHdoeSBhbiBpZCBuZXZlciBhcHBlYXJzIGluIGEgc2VudGVuY2UgYSB1c2VyIHJlYWRzLlxuICAgICAgICBjb25zdCBwZXJzb24gPSBbcHJldmlvdXM/LmZpcnN0X25hbWUsIHByZXZpb3VzPy5sYXN0X25hbWVdXG4gICAgICAgICAgLmZpbHRlcigocGFydCkgPT4gdHlwZW9mIHBhcnQgPT09ICdzdHJpbmcnICYmIHBhcnQudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAuam9pbignICcpO1xuICAgICAgICBjb25zdCBjb21wYW55ID1cbiAgICAgICAgICB0eXBlb2YgcHJldmlvdXM/LmNvbXBhbnkgPT09ICdzdHJpbmcnID8gcHJldmlvdXMuY29tcGFueS50cmltKCkgOiAnJztcbiAgICAgICAgY29uc3QgbGFiZWwgPSBbcGVyc29uLCBjb21wYW55XS5maWx0ZXIoQm9vbGVhbikuam9pbignIC0gJyk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdmVyZGljdCA9PT0gJ3JlamVjdGVkJyA/ICd3YXMgcmVqZWN0ZWQnIDogJ2lzIHN0aWxsIGF3YWl0aW5nIGFwcHJvdmFsJztcbiAgICAgICAgdGhyb3cgcmVmdXNlKFxuICAgICAgICAgIGBDYW5ub3QgY29udmVydCAke2xhYmVsID8gYGxlYWQgJHtsYWJlbH1gIDogJ3RoaXMgbGVhZCd9OiBpdHMgY29udmVyc2lvbiAke3N0YXRlfS4gQ29udmVyc2lvbiBvcGVucyBvbmNlIGFuIGFwcHJvdmVyIHNpZ25zIGl0IG9mZiBcdTIwMTQgdGhlIENvbnZlcnNpb24gQXBwcm92YWwgZmllbGQgb24gdGhlIGxlYWQgc2hvd3Mgd2hlcmUgaXQgc3RhbmRzLmAsXG4gICAgICAgICAgJ1JFQ09SRF9MT0NLRUQnLFxuICAgICAgICAgIDQwOSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0ZWQtbGVhZCBsb2NrIFx1MjAxNCBVU0VSIGVkaXRzIG9ubHkgKGBjdHgudXNlcj8uaWRgIGlzIHRoaXMgcmVwbydzXG4gICAgLy8gc3lzdGVtLXdyaXRlIHNpZ25hbCwgY2YuIG9wcG9ydHVuaXR5L3F1b3RlL2FjY291bnQgaG9va3MpOiBhIGJsYW5rZXRcbiAgICAvLyB0aHJvdyBhbHNvIHJlamVjdGVkIHN5c3RlbSB3cml0ZXMgKHNlZWQtb3duZXJzaGlwIGNsYWltcywgZmxvd1xuICAgIC8vIGJhY2tmaWxscykuIE5hcnJhdGl2ZSBub3RlcyBhbmQgZnJhbWV3b3JrLW1hbmFnZWQgY29sdW1ucyBzdGF5IGVkaXRhYmxlO1xuICAgIC8vIGlkZW50aXR5IGFuZCBjb252ZXJzaW9uIGZpZWxkcyBzdGF5IGxvY2tlZC5cbiAgICAvL1xuICAgIC8vIFRoaXMgaXMgdGhlIE9OTFkgY29udmVydGVkLWxlYWQgZ3VhcmQgXHUyMDE0IHRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBzZWNvbmQsXG4gICAgLy8gZnJpZW5kbGllciBzY3JpcHQgdmFsaWRhdGlvbiBvdmVyIHRoZSBzYW1lIGZvdXIgaWRlbnRpdHkgZmllbGRzLCBiZWNhdXNlXG4gICAgLy8gdGhpcyB0aHJvdyBhbHdheXMgd29uIHRoZSByYWNlIGFuZCBhIHNlY29uZCBsYXllciBjb3VsZCBvbmx5IGRyaWZ0LiBUaGVcbiAgICAvLyBtZXNzYWdlIGJlbG93IHRoZXJlZm9yZSBoYXMgdG8gY2FycnkgdGhlIHdob2xlIHN0b3J5LCBoZW5jZSB0aGVcbiAgICAvLyBhdHRlbXB0ZWQtZmllbGQgbGlzdC5cbiAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIGN0eC51c2VyPy5pZCkge1xuICAgICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgICBjb25zdCB3YXNDb252ZXJ0ZWQgPSBwcmV2aW91cz8uaXNfY29udmVydGVkID09PSB0cnVlIHx8IHByZXZpb3VzPy5zdGF0dXMgPT09ICdjb252ZXJ0ZWQnO1xuICAgICAgaWYgKHdhc0NvbnZlcnRlZCkge1xuICAgICAgICBjb25zdCBBTExPV0VEID0gbmV3IFNldChbXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJywgJ25vdGVzJyxcbiAgICAgICAgICAvLyBGcmFtZXdvcmstbWFuYWdlZCAvIHN5c3RlbSBjb2x1bW5zIChjZi4gb3Bwb3J0dW5pdHkuaG9vay50cykuXG4gICAgICAgICAgJ2lkJywgJ293bmVyX2lkJywgJ2NyZWF0ZWRfYXQnLCAndXBkYXRlZF9hdCcsXG4gICAgICAgICAgJ2NyZWF0ZWRfYnknLCAndXBkYXRlZF9ieScsICdzcGFjZV9pZCcsICdvcmdhbml6YXRpb25faWQnLCAnb3JnX2lkJywgJ3ZlcnNpb24nLFxuICAgICAgICBdKTtcbiAgICAgICAgY29uc3QgdmlvbGF0aW5nID0gT2JqZWN0LmtleXMoaW5wdXQpLmZpbHRlcihcbiAgICAgICAgICAoaykgPT4gIUFMTE9XRUQuaGFzKGspICYmIGlucHV0W2tdICE9PSBwcmV2aW91cz8uW2tdLFxuICAgICAgICApO1xuICAgICAgICBpZiAodmlvbGF0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBFdmVyeSBsb29rdXAgb24gYGNybV9sZWFkYCBhIHJlZmVyZW50aWFsIGNsZWFyIGNhbiBhdHRhY2suXG4gICAgICAgICAgY29uc3QgUkVGRVJFTkNFX0ZJRUxEUyA9IG5ldyBTZXQoW1xuICAgICAgICAgICAgJ2NvbnZlcnRlZF9hY2NvdW50JywgJ2NvbnZlcnRlZF9jb250YWN0JywgJ2NvbnZlcnRlZF9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAnZHVwbGljYXRlX29mX2xlYWQnLCAnZHVwbGljYXRlX29mX2NvbnRhY3QnLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCB0aGUgcmVmZXJlbmNlLWNsZWFudXAgeWllbGQgXHUyNTAwXHUyNTAwXG4gICAgICAgICAgLy8gIzcyMC4gVGhlIGVuZ2luZSBpbXBsZW1lbnRzIGBkZWxldGVCZWhhdmlvcjogJ3NldF9udWxsJ2AgYnkgVVBEQVRJTkdcbiAgICAgICAgICAvLyB0aGUgcm93IHRoYXQgSE9MRFMgdGhlIGxvb2t1cCwgc28gZGVsZXRpbmcgdGhlIGFjY291bnQgLyBjb250YWN0IC9cbiAgICAgICAgICAvLyBvcHBvcnR1bml0eSBhIGNvbnZlcnRlZCBsZWFkIHBvaW50cyBhdCAob3IgdGhlIGxlYWQgLyBjb250YWN0IGl0IHdhc1xuICAgICAgICAgIC8vIGZsYWdnZWQgYXMgYSBkdXBsaWNhdGUgb2YpIGFycml2ZXMgaGVyZSBhcyBhbiBvcmRpbmFyeSB1c2VyXG4gICAgICAgICAgLy8gYGJlZm9yZVVwZGF0ZWAgXHUyMDE0IGFuZCB0aGlzIGxvY2sgcmVmdXNlZCBpdCwgd2hpY2ggbWFkZSBhIGNvbnZlcnRlZFxuICAgICAgICAgIC8vIGxlYWQgYWJsZSB0byBrZWVwIGFsbCB0aHJlZSBvZiBpdHMgY29udmVyc2lvbiBwcm9kdWN0cyB1bmRlbGV0YWJsZVxuICAgICAgICAgIC8vIGZvcmV2ZXIgKGEgR0RQUiBlcmFzdXJlIHRoYXQgY2Fubm90IGJlIGNhcnJpZWQgb3V0KS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIE1lYXN1cmVkIG9uIDE3LjEuMCBcdTIwMTQgdGhlIHZlcnNpb24gdGhpcyByZXBvIHBpbm5lZCBBVCBUSEUgVElNRSBvZlxuICAgICAgICAgIC8vIHRoZSBtZWFzdXJlbWVudCwgbm90IHRoZSBjdXJyZW50IHBpbiAodGhlIGNhc2NhZGUgc2hhcGUgYmVsb3cgaGFzXG4gICAgICAgICAgLy8gTk9UIGJlZW4gcmUtbWVhc3VyZWQgb24gYW55IGxhdGVyIHBpbiBcdTIwMTQgbm90IDE3LjMuMCwgIzE2NzYsIG5vdFxuICAgICAgICAgIC8vIDE3LjQuMCwgUFIgIzE4MTQsIGFuZCBub3QgMTcuNS4wKSBcdTIwMTQgd2l0aCBhIHByb2JlIGhvb2sgYXQgcHJpb3JpdHkgMTk5IGltbWVkaWF0ZWx5XG4gICAgICAgICAgLy8gYWhlYWQgb2YgZWFjaCBndWFyZCwgbm90IGFzc3VtZWQuXG4gICAgICAgICAgLy8gVGhlIGVuZ2luZSBidWlsZHMgaXRzIGNsZWFudXAgd3JpdGUgb24gdGhlIENBTExFUidzIG93biBjb250ZXh0XG4gICAgICAgICAgLy8gcGx1cyB0d28gZW5naW5lIGtleXMsIHNvIG9uIHRoZSBwYXRoIGEgUkVTVCBgREVMRVRFYCB0YWtlcywgdGhlXG4gICAgICAgICAgLy8gY2FzY2FkZSBhbmQgYSB1c2VyJ3MgaGFuZC1jbGVhciBvZiB0aGUgc2FtZSBsb29rdXAgYXJlIGlkZW50aWNhbFxuICAgICAgICAgIC8vIGV2ZXJ5d2hlcmUgYSBndWFyZCBjYW4gbG9vazogcGF5bG9hZFxuICAgICAgICAgIC8vIGB7IGlkLCA8bGluaz46IG51bGwsIHVwZGF0ZWRfYXQsIHVwZGF0ZWRfYnkgfWAsIGBjdHgudXNlcmAgdGhlXG4gICAgICAgICAgLy8gQ0FMTEVSLCBgY3R4LnNlc3Npb25gIHRoZSBjYWxsZXIncyBvd24gYHsgdXNlcklkLCBpc1N5c3RlbSB9YC5cbiAgICAgICAgICAvLyAoQm90aCBgdXBkYXRlZF9ieWAgYW5kIHRoZSBpZGVudGl0eSBkcm9wIG91dCB0b2dldGhlciB3aGVuIHRoZVxuICAgICAgICAgIC8vIERFTEVURSBpdHNlbGYgY2FycmllZCBubyBgdXNlcklkYCBcdTIwMTQgYSByaWcgYXJ0ZWZhY3QsIG5vdCB0aGlzIGFwcCdzXG4gICAgICAgICAgLy8gcGF0aC4pIFNvIHRoZSBXUklURSBTSEFQRSBpcyBub3QgYSBkaXNjcmltaW5hdG9yLCBhbmQgdGhlIHlpZWxkXG4gICAgICAgICAgLy8gYmVsb3cgaXMgbm90IG9uZSBlaXRoZXI6IGl0IGxldHMgQU5ZIGNhbGxlciBjbGVhciBhIGRlY2xhcmVkIGxpbmtcbiAgICAgICAgICAvLyBvbiBhIHNldHRsZWQgcmVjb3JkLiBUaGF0IGlzIHRoZSB0cmFkZSAjNzIwIGFjY2VwdGVkLCBub3QgYSBzaWRlXG4gICAgICAgICAgLy8gZWZmZWN0IG9mIGl0LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gXHUyNkEwXHVGRTBGIEEgbWFya2VyIERPRVMgcmVhY2ggYSBob29rIFx1MjAxNCBhbmQgaXMgZGVsaWJlcmF0ZWx5IG5vdCByZWFkLiBBblxuICAgICAgICAgIC8vIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGlzIG5vdGUgY29uY2x1ZGVkIFwibm8gbWFya2VyIHJlYWNoZXMgYSBob29rLFxuICAgICAgICAgIC8vIGFuZCB0aGUgV1JJVEUgU0hBUEUgaXMgdGhlIG9ubHkgZXZpZGVuY2UgdGhlcmUgaXNcIjsgaXQgcmVhc29uZWRcbiAgICAgICAgICAvLyBvbmx5IGFib3V0IGBjdHguc2Vzc2lvbmAsIHdob3NlIGFsbG93LWxpc3QgcmVhbGx5IGRvZXMgb21pdFxuICAgICAgICAgIC8vIGBfX2AtcHJlZml4ZWQgb3BlcmF0aW9uLXByaXZhdGUga2V5cywgYW5kIG1pc3NlZCB0aGUgb3RoZXIgcm91dGVcbiAgICAgICAgICAvLyBpbnRvIHRoZSBjb250ZXh0LiBgT2JqZWN0UUwuY2FzY2FkZURlbGV0ZVJlbGF0aW9uc2AgYnVpbGRzXG4gICAgICAgICAgLy8gYHsgLi4uY29udGV4dCwgX19yZWZlcmVudGlhbEZpZWxkQ2xlYXI6IHRydWUgfWAsIHJlYWRhYmxlIGF0XG4gICAgICAgICAgLy8gYGN0eC5hcGkuZXhlY3V0aW9uQ29udGV4dC5fX3JlZmVyZW50aWFsRmllbGRDbGVhcmA6IG1lYXN1cmVkIGB0cnVlYFxuICAgICAgICAgIC8vIG9uIGV2ZXJ5IGNhc2NhZGUgaW50byBgY3JtX29wcG9ydHVuaXR5YCwgYGNybV9xdW90ZWAgYW5kXG4gICAgICAgICAgLy8gYGNybV9sZWFkYCwgYHVuZGVmaW5lZGAgb24gZXZlcnkgaGFuZC1jbGVhciAoIzExNjUsICMxNDEyKS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFx1MjZENCBUaGUgIzExNjUgcnVsaW5nICgyMDI2LTA4LTI1KSByZXZpZXdlZCB0aGF0IGFuZCB1cGhlbGQgTk9UXG4gICAgICAgICAgLy8gcmVhZGluZyBpdCwgb24gdHdvIGdyb3VuZHMuIEl0IGlzIGFuIG9wZXJhdGlvbi1wcml2YXRlIGtleSBcdTIwMTQgYW5cbiAgICAgICAgICAvLyB1bmRlY2xhcmVkIGRlcGVuZGVuY3kgdGhhdCBjYW4gdmFuaXNoIGluIGEgcGF0Y2ggcmVsZWFzZS4gQW5kXG4gICAgICAgICAgLy8gcmVhY2hhYmlsaXR5IHRocm91Z2ggdGhlIFNISVBQRUQgcGF0aCBpcyB1bnByb3ZlbjogYSBob29rIGJvZHkgcnVuc1xuICAgICAgICAgIC8vIGJvZHktb25seSBpbiBRdWlja0pTLCB3aGVyZSBgYnVpbGRTYW5kYm94QXBpYCBwYXNzZXMgYGVuZ2luZUN0eC5hcGlgXG4gICAgICAgICAgLy8gb25seSB3aGVuIHRoYXQgZXhwb3NlcyBgb2JqZWN0KClgLCBhbmQgb3RoZXJ3aXNlIGEgc2hpbSB3aXRoIG5vXG4gICAgICAgICAgLy8gYGV4ZWN1dGlvbkNvbnRleHRgIGF0IGFsbC4gR3JlZW4gaW4gYSBrZXJuZWwgcmlnIGFuZCBzaWxlbnRseSBmYWxzZVxuICAgICAgICAgIC8vIGluIHByb2R1Y3Rpb24gaXMgdGhlIHdvcnN0IG91dGNvbWUgYSBndWFyZCBjYW4gaGF2ZS4gVGhlIGRlY2xhcmVkXG4gICAgICAgICAgLy8gcmVwbGFjZW1lbnQgYGN0eC5yZWZlcmVudGlhbEZpZWxkQ2xlYXJgIGlzIGFza2VkIGZvciB1cHN0cmVhbSBhc1xuICAgICAgICAgIC8vIG9iamVjdHN0YWNrLWFpL29iamVjdHN0YWNrIzEzNjQ0LlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gXHUyNkQ0IEtlZXAgdGhpcyBuYXJyb3cgKG1haW50YWluZXIncyBydWxpbmcgb24gIzcyMCwgT3B0aW9uIEEpOiBhIHdyaXRlXG4gICAgICAgICAgLy8geWllbGRzIE9OTFkgd2hlbiBldmVyeSBvbmUgb2YgaXRzIG5vbi1zeXN0ZW0gY2hhbmdlcyBpcyBhIERFQ0xBUkVEXG4gICAgICAgICAgLy8gbGluayBnb2luZyBmcm9tIGEgdmFsdWUgdG8gYG51bGxgLiBPbmUgYnVzaW5lc3MgZmllbGQgYWxvbmdzaWRlIGl0LFxuICAgICAgICAgIC8vIG9yIGEgbGluayByZXBvaW50ZWQgdG8gYSBORVcgdmFsdWUsIGFuZCB0aGUgcmVmdXNhbCBiZWxvdyBzdGlsbFxuICAgICAgICAgIC8vIGZpcmVzLiBUaGUgdGhyZWUgZnJlZXplIGd1YXJkcyBzaGFyZSB0aGlzIGJsb2NrIHZlcmJhdGltIFx1MjAxNCBzaGFyaW5nXG4gICAgICAgICAgLy8gaXQgYXMgYW4gaW1wb3J0ZWQgaGVscGVyIGlzIG5vdCBwb3NzaWJsZSAoaG9vayBib2RpZXMgcnVuIGJvZHktb25seVxuICAgICAgICAgIC8vIGluIHRoZSBzYW5kYm94IGFuZCBjYW5ub3QgcmVhY2ggbW9kdWxlIHNjb3BlKSwgc29cbiAgICAgICAgICAvLyBgdGVzdC9mcmVlemUtZ3VhcmQtcmVmZXJlbmNlLWNsZWFudXAudGVzdC50c2AgcGlucyB0aGUgdGhyZWUgY29waWVzXG4gICAgICAgICAgLy8gYXMgaWRlbnRpY2FsIHRleHQgYW5kIHBpbnMgYm90aCBkaXJlY3Rpb25zIG9mIHRoZSBuYXJyb3duZXNzLlxuICAgICAgICAgIGNvbnN0IGlzUmVmZXJlbmNlQ2xlYW51cCA9IHZpb2xhdGluZy5ldmVyeShcbiAgICAgICAgICAgIChrKSA9PiBSRUZFUkVOQ0VfRklFTERTLmhhcyhrKSAmJiBpbnB1dFtrXSA9PT0gbnVsbCAmJiBwcmV2aW91cz8uW2tdICE9IG51bGwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoaXNSZWZlcmVuY2VDbGVhbnVwKSByZXR1cm47XG5cbiAgICAgICAgICAvLyBOYW1lIHRoZSBsZWFkIHRoZSB3YXkgYGNybV9sZWFkLmRpc3BsYXlfdGl0bGVgIGRvZXMgXHUyMDE0IHRoZSBwZXJzb25cbiAgICAgICAgICAvLyBhbmQgdGhlIGNvbXBhbnksIGpvaW5lZCBcdTIwMTQgcmF0aGVyIHRoYW4gYXBwZW5kaW5nIHRoZSByZWNvcmQgaWQsXG4gICAgICAgICAgLy8gd2hpY2ggaXMgdW5tYXRjaGFibGUgYWdhaW5zdCBldmVyeSBsZWFkIHN1cmZhY2UgaW4gdGhpcyBhcHAgKHJlY29yZFxuICAgICAgICAgIC8vIHBhZ2UsIGxpc3QgdmlldywgYnJlYWRjcnVtYiwgbG9va3VwIHBpY2tlciksIGFsbCBvZiB3aGljaCB0aXRsZSBhXG4gICAgICAgICAgLy8gbGVhZCBgQWRhIExvdmVsYWNlIC0gQWNtZWAuIENvbXBvc2VkIGZyb20gdGhlIHR3byBzdG9yZWQgY29sdW1uc1xuICAgICAgICAgIC8vIGJlY2F1c2UgYSBsb3dlcmVkIGhvb2sgYm9keSBjYW5ub3QgcmVhZCB0aGUgYGRpc3BsYXlfdGl0bGVgIGZvcm11bGEuXG4gICAgICAgICAgY29uc3QgcGVyc29uID0gW3ByZXZpb3VzPy5maXJzdF9uYW1lLCBwcmV2aW91cz8ubGFzdF9uYW1lXVxuICAgICAgICAgICAgLmZpbHRlcigocGFydCkgPT4gdHlwZW9mIHBhcnQgPT09ICdzdHJpbmcnICYmIHBhcnQudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgIC5qb2luKCcgJyk7XG4gICAgICAgICAgY29uc3QgY29tcGFueSA9XG4gICAgICAgICAgICB0eXBlb2YgcHJldmlvdXM/LmNvbXBhbnkgPT09ICdzdHJpbmcnID8gcHJldmlvdXMuY29tcGFueS50cmltKCkgOiAnJztcbiAgICAgICAgICBjb25zdCBsYWJlbCA9IFtwZXJzb24sIGNvbXBhbnldLmZpbHRlcihCb29sZWFuKS5qb2luKCcgLSAnKTtcblxuICAgICAgICAgIHRocm93IHJlZnVzZShcbiAgICAgICAgICAgIGBDYW5ub3QgZWRpdCAke2xhYmVsID8gYGNvbnZlcnRlZCBsZWFkICR7bGFiZWx9YCA6ICdhIGNvbnZlcnRlZCBsZWFkJ30gKGF0dGVtcHRlZDogJHt2aW9sYXRpbmcuam9pbignLCAnKX0pLiBNYWtlIGNoYW5nZXMgb24gdGhlIGNvbnZlcnRlZCByZWNvcmRzIGluc3RlYWQuYCxcbiAgICAgICAgICAgICdSRUNPUkRfTE9DS0VEJyxcbiAgICAgICAgICAgIDQwOSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ID09PSAnYWZ0ZXJVcGRhdGUnKSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICAgIGNvbnN0IGJlY2FtZVF1YWxpZmllZCA9XG4gICAgICAgIGlucHV0LnN0YXR1cyA9PT0gJ3F1YWxpZmllZCcgJiYgcHJldmlvdXM/LnN0YXR1cyAhPT0gJ3F1YWxpZmllZCc7XG4gICAgICBpZiAoIWJlY2FtZVF1YWxpZmllZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWFwaSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBsZWFkSWQgPVxuICAgICAgICAodHlwZW9mIGlucHV0LmlkID09PSAnc3RyaW5nJyAmJiBpbnB1dC5pZCkgfHxcbiAgICAgICAgKHR5cGVvZiBwcmV2aW91cz8uaWQgPT09ICdzdHJpbmcnICYmIHByZXZpb3VzLmlkKSB8fFxuICAgICAgICB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBvd25lcklkID1cbiAgICAgICAgKHR5cGVvZiBpbnB1dC5vd25lcl9pZCA9PT0gJ3N0cmluZycgJiYgaW5wdXQub3duZXJfaWQpIHx8XG4gICAgICAgICh0eXBlb2YgcHJldmlvdXM/Lm93bmVyX2lkID09PSAnc3RyaW5nJyAmJiBwcmV2aW91cy5vd25lcl9pZCkgfHxcbiAgICAgICAgY3R4LnVzZXI/LmlkO1xuXG4gICAgICAvLyBPTkUgY2FsZW5kYXIsIGFuZCBpdCBpcyBVVEMgXHUyMDE0IHRoZSBkYXkgc3RlcCBpcyB0YWtlbiB3aXRoIGBzZXRVVENEYXRlYFxuICAgICAgLy8gYmVjYXVzZSB0aGUgcmVzdWx0IGlzIHJlbmRlcmVkIHdpdGggYHRvSVNPU3RyaW5nKClgIGJlbG93LiBgc2V0RGF0ZWBcbiAgICAgIC8vIHJlYWRzIGFuZCB3cml0ZXMgdGhlIExPQ0FMIGNhbGVuZGFyIGFuZCBwcmVzZXJ2ZXMgd2FsbC1jbG9jayB0aW1lLCBzb1xuICAgICAgLy8gaW4gYSBEU1Qtb2JzZXJ2aW5nIGRlcGxveW1lbnQgYSB0d28tZGF5IHN0ZXAgYWNyb3NzIGEgc3ByaW5nLWZvcndhcmRcbiAgICAgIC8vIGFkdmFuY2VzIDQ3IGgsIG5vdCA0OCwgYW5kIHRoZSByZW5kZXJlZCBVVEMgZGF5IGlzIG9uZSBzaG9ydC4gSXQgaXNcbiAgICAgIC8vIGludmlzaWJsZSBhdCBgVFo9VVRDYCwgd2hlcmUgdGhlIHR3byBjYWxlbmRhcnMgY29pbmNpZGUuXG4gICAgICBjb25zdCBkdWVEYXRlID0gbmV3IERhdGUoKTtcbiAgICAgIGR1ZURhdGUuc2V0VVRDRGF0ZShkdWVEYXRlLmdldFVUQ0RhdGUoKSArIDIpO1xuXG4gICAgICAvLyBUaXRsZSB0aGUgdGFzayB3aXRoIHRoZSBsZWFkJ3MgbmFtZSwgbm90IGl0cyByZWNvcmQgaWQuICoqQWxsIFRhc2tzKipcbiAgICAgIC8vIGlzIHdoZXJlIGEgcmVwIHN0YXJ0cyB0aGUgZGF5OyBhIHF1ZXVlIG9mIHJvd3MgcmVhZGluZyBgRm9sbG93IHVwIHdpdGhcbiAgICAgIC8vIHF1YWxpZmllZCBsZWFkIChFTXRtYVNjb2EzSS11WUZHKWAgaXMgYSBxdWV1ZSBub2JvZHkgY2FuIHRyaWFnZSwgYW5kXG4gICAgICAvLyB0aGUga2V5IG1hdGNoZXMgbm90aGluZyBvbiBhbnkgbGVhZCBwYWdlIG9yIGluIHNlYXJjaC4gQm90aCBoYWx2ZXNcbiAgICAgIC8vIHByZWZlciB0aGUgdmFsdWUgVEhJUyB3cml0ZSBpcyBzZXR0aW5nLCBzaW5jZSBhIHF1YWxpZnlpbmcgd3JpdGUgbWF5IGJlXG4gICAgICAvLyByZW5hbWluZyB0aGUgbGVhZCBpbiB0aGUgc2FtZSBwYXlsb2FkLlxuICAgICAgLy9cbiAgICAgIC8vIFx1MjZBMFx1RkUwRiBUaGUgMjU1IGNhcCBpcyBsb2FkLWJlYXJpbmcsIGV4YWN0bHkgYXMgaW4gYGNhc2UuaG9vay50c2A6XG4gICAgICAvLyBgY3JtX3Rhc2suc3ViamVjdGAgZGVjbGFyZXMgYG1heExlbmd0aDogMjU1YCBhbmQgdGhlIGVuZ2luZSBlbmZvcmNlc1xuICAgICAgLy8gaXQsIHdoaWxlIGBjcm1fbGVhZC5jb21wYW55YCBhbG9uZSBhbGxvd3MgMjU1IFx1MjAxNCBzbyBhbiB1bmNhcHBlZCB0aXRsZSBpc1xuICAgICAgLy8gcmVqZWN0ZWQsIGFuZCB0aGUgYGNhdGNoYCBiZWxvdyBzd2FsbG93cyB0aGF0IHJlamVjdGlvbiwgbGVhdmluZyBub1xuICAgICAgLy8gZm9sbG93LXVwIHRhc2sgYW5kIG5vIHRyYWNlLiBUcnVuY2F0aW5nIHRoZSBUQUlMIGtlZXBzIHRoZVxuICAgICAgLy8gZGlzY3JpbWluYXRpbmcgaGVhZCBpbnRhY3QuXG4gICAgICBjb25zdCBwZXJzb24gPSBbXG4gICAgICAgICh0eXBlb2YgaW5wdXQuZmlyc3RfbmFtZSA9PT0gJ3N0cmluZycgJiYgaW5wdXQuZmlyc3RfbmFtZSkgfHwgcHJldmlvdXM/LmZpcnN0X25hbWUsXG4gICAgICAgICh0eXBlb2YgaW5wdXQubGFzdF9uYW1lID09PSAnc3RyaW5nJyAmJiBpbnB1dC5sYXN0X25hbWUpIHx8IHByZXZpb3VzPy5sYXN0X25hbWUsXG4gICAgICBdXG4gICAgICAgIC5maWx0ZXIoKHBhcnQpID0+IHR5cGVvZiBwYXJ0ID09PSAnc3RyaW5nJyAmJiBwYXJ0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgIC5qb2luKCcgJyk7XG4gICAgICBjb25zdCBjb21wYW55ID1cbiAgICAgICAgKHR5cGVvZiBpbnB1dC5jb21wYW55ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jb21wYW55LnRyaW0oKSkgfHxcbiAgICAgICAgKHR5cGVvZiBwcmV2aW91cz8uY29tcGFueSA9PT0gJ3N0cmluZycgJiYgcHJldmlvdXMuY29tcGFueS50cmltKCkpIHx8XG4gICAgICAgICcnO1xuICAgICAgY29uc3QgbGFiZWwgPSBbcGVyc29uLCBjb21wYW55XS5maWx0ZXIoQm9vbGVhbikuam9pbignIC0gJyk7XG4gICAgICBjb25zdCB0aXRsZWQgPSBsYWJlbFxuICAgICAgICA/IGBGb2xsb3cgdXAgd2l0aCBxdWFsaWZpZWQgbGVhZDogJHtsYWJlbH1gXG4gICAgICAgIDogJ0ZvbGxvdyB1cCB3aXRoIHF1YWxpZmllZCBsZWFkJztcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX3Rhc2snKS5pbnNlcnQoe1xuICAgICAgICAgIHN1YmplY3Q6IHRpdGxlZC5sZW5ndGggPiAyNTUgPyBgJHt0aXRsZWQuc2xpY2UoMCwgMjU0KX1cdTIwMjZgIDogdGl0bGVkLFxuICAgICAgICAgIHN0YXR1czogJ25vdF9zdGFydGVkJyxcbiAgICAgICAgICBwcmlvcml0eTogJ2hpZ2gnLFxuICAgICAgICAgIHR5cGU6ICdmb2xsb3dfdXAnLFxuICAgICAgICAgIGR1ZV9kYXRlOiBkdWVEYXRlLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApLFxuICAgICAgICAgIC8vIFVubGlrZSBgbGVhZF9hdXRvX2Fzc2lnbmAgYWJvdmUsIHRoaXMgaXMgYSBTRVBBUkFURSBpbnNlcnQgb25cbiAgICAgICAgICAvLyBgY3R4LmFwaWAgXHUyMDE0IGEgbmV3IG9wZXJhdGlvbiBjYXJyeWluZyB0aGUgY2FsbGVyJ3MgY29udGV4dCwgc28gdGhlXG4gICAgICAgICAgLy8gIzMwMDQgdHJhbnNmZXIgZ3VhcmQgZG9lcyBhcHBseSB0byBpdC4gV2hlbiB0aGUgcXVhbGlmaWVyIGlzIHRoZVxuICAgICAgICAgIC8vIGxlYWQncyBvd24gcmVwIChgb3duZXJfaWRgID09IGNhbGxlcikgaXQgaXMgbm90IGEgdHJhbnNmZXIgYXQgYWxsO1xuICAgICAgICAgIC8vIGEgbWFuYWdlciBxdWFsaWZ5aW5nIGEgcmVwJ3MgbGVhZCBob2xkcyBgYWxsb3dUcmFuc2ZlcmAuIEFueSBvdGhlclxuICAgICAgICAgIC8vIGNhbGxlciBpcyBkZW5pZWQgYW5kIHRoZSBjYXRjaCBiZWxvdyBkcm9wcyB0aGUgdGFzayByYXRoZXIgdGhhblxuICAgICAgICAgIC8vIGxhbmRpbmcgaXQgb24gdGhlIHdyb25nIGRlc2suXG4gICAgICAgICAgb3duZXJfaWQ6IG93bmVySWQsXG4gICAgICAgICAgcmVsYXRlZF90b190eXBlOiAnY3JtX2xlYWQnLFxuICAgICAgICAgIHJlbGF0ZWRfdG9fbGVhZDogbGVhZElkLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBTaWRlLWVmZmVjdCBmYWlsdXJlIG11c3Qgbm90IGJyZWFrIHRoZSBwYXJlbnQgdHJhbnNhY3Rpb24uIE5vXG4gICAgICAgIC8vIGBjb25zb2xlYCBpbiB0aGUgTDIgaG9vayBzYW5kYm94IFx1MjAxNCBsb2dnaW5nIHdvdWxkIHRocm93IGl0cyBvd25cbiAgICAgICAgLy8gUmVmZXJlbmNlRXJyb3IgYW5kIG1hc2sgdGhlIHJlYWwgZmFpbHVyZSAoY2YuICM0NzEpLlxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogU29mdCBsZWFkIGRlZHVwZS5cbiAqXG4gKiBBIHByb3NwZWN0IHdobyBlbnF1aXJlcyB0d2ljZSBtdXN0IG5vdCBiZSBSRUpFQ1RFRCBcdTIwMTQgYSByZS1jYXB0dXJlZCBhZGRyZXNzIGlzXG4gKiByZWNvcmRlZCBhcyBhIGZhY3QgaW5zdGVhZCBvZiByZWZ1c2VkLCBzbyB0aGUgcHVibGljIFdlYi10by1MZWFkIGZvcm0gbmV2ZXJcbiAqIGFuc3dlcnMgYSByZXR1cm5pbmcgdmlzaXRvciB3aXRoIGEgc2F2ZSBlcnJvci5cbiAqXG4gKiBGb3VyIGpvYnMsIGFsbCBgYmVmb3JlYC1waGFzZSBzbyB0aGUgdmFsdWVzIGxhbmQgaW4gdGhlIHNhbWUgd3JpdGU6XG4gKlxuICogMS4gKipOb3JtYWxpemUgYGVtYWlsYCoqICh0cmltICsgbG93ZXJjYXNlKSwgZXhhY3RseSBhcyBgY29udGFjdF9pbnRlZ3JpdHlgXG4gKiAgICBkb2VzIG9uIGBjcm1fY29udGFjdGAuIFx1MjZBMFx1RkUwRiBUaGlzIGlzIHdoYXQgbWFrZXMgdGhlIGRlZHVwZSBsb29rdXAgYmVsb3cgYVxuICogICAgcGxhaW4gZXF1YWxpdHkgbWF0Y2g6IHRoZXJlIGlzIG5vIGNhc2UtaW5zZW5zaXRpdmUgcHJlZGljYXRlIHRvIGxlYW4gb24gXHUyMDE0XG4gKiAgICBPYmplY3RRTCdzIGAkcmVnZXhgIGNvbXBpbGVzIHRvIGEgTElLRSAqc3Vic3RyaW5nKiBvbiBTUUwsIHdoaWNoIHdvdWxkXG4gKiAgICBtYXRjaCBgYUBiLmNvbWAgaW5zaWRlIGB4YUBiLmNvbWAgXHUyMDE0IHNvIHRoZSBjYW5vbmljYWwgZm9ybSBoYXMgdG8gYmVcbiAqICAgIGVzdGFibGlzaGVkIGJ5IHRoZSBQUk9EVUNFUiBhdCB3cml0ZSB0aW1lIHJhdGhlciB0aGFuIHdvcmtlZCBhcm91bmQgYnlcbiAqICAgIGV2ZXJ5IHJlYWRlci4gQWxzbyBvbiB1cGRhdGU6IGFuIGVkaXQgcmVpbnRyb2R1Y2luZyBtaXhlZCBjYXNlIHdvdWxkXG4gKiAgICBzaWxlbnRseSBtYWtlIHRoZSByZWNvcmQgaW52aXNpYmxlIHRvIGV2ZXJ5IGxhdGVyIGRlZHVwZS5cbiAqXG4gKiAxYi4gKipGb2xkIGBjb21wYW55YCBpbnRvIGBjb21wYW55X25vcm1hbGl6ZWRgKiogXHUyMDE0IGEgU0VQQVJBVEUgY29sdW1uLCBub3QgYW5cbiAqICAgIGluLXBsYWNlIHJld3JpdGUsIGJlY2F1c2UgYGNvbXBhbnlgIGlzIHRoZSBkaXNwbGF5IHZhbHVlIHRoZSBjb252ZXJzaW9uXG4gKiAgICBmbG93IGNvcGllcyBvbnRvIHRoZSBhY2NvdW50IGl0IGNyZWF0ZXMuIEl0IGlzIHRoZSBsZWFkIGhhbGYgb2YgdGhlIHBhaXJcbiAqICAgIGBjcm1fYWNjb3VudC5uYW1lX25vcm1hbGl6ZWRgIGNvbXBsZXRlcywgYW5kIGl0IGV4aXN0cyBmb3IgdGhlIHNhbWUgcmVhc29uXG4gKiAgICBhcyB0aGUgZW1haWwgZm9sZDogdGhlIHJlYWRlciAoYSBmbG93IHRlbXBsYXRlKSBjYW4gY29tcGFyZSB0d28gc3RvcmVkXG4gKiAgICBjb2x1bW5zIGJ1dCBjYW5ub3QgY29tcHV0ZSBlaXRoZXIgb25lLlxuICpcbiAqIDIuICoqTGluayBhIHJlcGVhdGVkIGFkZHJlc3MgdG8gdGhlIHJlY29yZCBpdCByZXBlYXRzKiogXHUyMDE0IG9uIGluc2VydCBvbmx5LlxuICogICAgQW4gZXhpc3RpbmcgYGNybV9jb250YWN0YCB3aW5zIG92ZXIgYW4gb3BlbiBsZWFkOiB0aGUgcHJvc3BlY3Qgd2hvIGFscmVhZHlcbiAqICAgIGJlY2FtZSBhIGNvbnRhY3QgaXMgdGhlIGZ1cnRoZXItYWxvbmcgcmVjb3JkLCBhbmQgdGhlIG9uZSB0aGUgY29udmVyc2lvblxuICogICAgZmxvdyB3b3VsZCByZXVzZSBhbnl3YXkuIFdpdGhpbiBhIGtpbmQgdGhlIE9MREVTVCByZWNvcmQgd2lucywgc28gYSBjbHVzdGVyXG4gKiAgICBvZiBmaXZlIHJlLXN1Ym1pc3Npb25zIGFsbCBwb2ludCBhdCB0aGUgc2FtZSBvcmlnaW4gaW5zdGVhZCBvZiBjaGFpbmluZy5cbiAqXG4gKiAzLiAqKlJldGlyZSB0aGUgd2hvbGUgY2xhaW0gd2hlbiB0aGUgcmVjb3JkIGl0IG5hbWVkIGlzIGdvbmUqKiBcdTIwMTQgb24gdXBkYXRlXG4gKiAgICBvbmx5LCBhbmQgdGhlIGV4YWN0IG1pcnJvciBvZiBqb2IgMjogdGhlIGhvb2sgdGhhdCBzdGFtcHMgYSBkdXBsaWNhdGUgbGlua1xuICogICAgaXMgdGhlIG9uZSB0aGF0IHRha2VzIGl0IGJhY2sgZG93bi4gU2VlIHRoZSBub3RlIGF0IHRoZSBibG9jayBpdHNlbGYuXG4gKlxuICogVGhlIHdyaXRlIGlzIGBkdXBsaWNhdGVfc3RhdHVzOiAnc3VzcGVjdGVkJ2AgXHUyMDE0IGEgbWFjaGluZSdzIGd1ZXNzLCBleHBsaWNpdGx5XG4gKiBkaXN0aW5ndWlzaGVkIGZyb20gdGhlIGBjb25maXJtZWRgIHZlcmRpY3QgYSBodW1hbiByZWNvcmRzIHdoZW4gZGlzcXVhbGlmeWluZ1xuICogYXMgYSBkdXBsaWNhdGUuIFRoZSBob29rIHN0YW5kcyBkb3duIG9uIGFueSByZWNvcmQgdGhhdCBhbHJlYWR5IGNhcnJpZXMgYVxuICogdmVyZGljdCwgc28gYGNvbmZpcm1lZGAgY2FuIG5ldmVyIGJlIHJldmVydGVkIHRvIGBzdXNwZWN0ZWRgIGJ5IGEgbGF0ZXJcbiAqIHdyaXRlLCBhbmQgb24gYW55IHJlY29yZCB0aGF0IGFscmVhZHkgbmFtZXMgYSBzdXJ2aXZvci5cbiAqXG4gKiBEZXRlY3Rpb24gaXMgSU5TRVJULW9ubHkgYnkgZGVzaWduOiBhIGxhdGVyIGVkaXQgcmUtc2Nhbm5pbmcgd291bGQgcmUtb3BlbiBhXG4gKiBxdWVzdGlvbiBhIGh1bWFuIG1heSBoYXZlIGFscmVhZHkgY2xvc2VkLCBhbmQgdGhlIHJldmlldyBxdWV1ZVxuICogKGBzdXNwZWN0ZWRfZHVwbGljYXRlc2ApIGlzIHRoZSBhZmZvcmRhbmNlIGZvciBhbnl0aGluZyBpbnRha2UgbWlzc2VkLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBQcmlvcml0eSAzMDAgXHUyMDE0IGFmdGVyIGBsZWFkX2F1dG9tYXRpb25gICgyMDApLCB3aG9zZSBndWVzdCBicmFuY2ggc3RyaXBzXG4gKiBjbGllbnQtc3VwcGxpZWQgYGR1cGxpY2F0ZV8qYCBmcm9tIGFub255bW91cyBzdWJtaXNzaW9ucy4gUnVubmluZyBlYXJsaWVyXG4gKiB3b3VsZCBsZXQgYSBzcG9vZmVkIGBkdXBsaWNhdGVfc3RhdHVzYCBzd2l0Y2ggdGhpcyBob29rIG9mZi5cbiAqL1xuY29uc3QgbGVhZER1cGxpY2F0ZUNoZWNrSG9vazogSG9vayA9IHtcbiAgbmFtZTogJ2xlYWRfZHVwbGljYXRlX2NoZWNrJyxcbiAgb2JqZWN0OiAnY3JtX2xlYWQnLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICBwcmlvcml0eTogMzAwLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnTm9ybWFsaXplIGxlYWQgZW1haWwgYW5kIGNvbXBhbnkgbWF0Y2gga2V5OyBmbGFnIGEgcmUtY2FwdHVyZWQgYWRkcmVzcyBhcyBhIHN1c3BlY3RlZCBkdXBsaWNhdGUgb2YgdGhlIHJlY29yZCBpdCByZXBlYXRzLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgY29uc3QgeyBldmVudCwgaW5wdXQgfSA9IGN0eDtcblxuICAgIC8vIEEgZHVwbGljYXRlIGNsdXN0ZXIgbGFyZ2VyIHRoYW4gdGhpcyBpcyBwYXRob2xvZ2ljYWw7IGV2ZXJ5IG1lbWJlciBwb2ludHNcbiAgICAvLyBhdCB0aGUgc2FtZSBvcmlnaW4gZWl0aGVyIHdheSwgc28gdGhlIHNjYW4gaXMgYm91bmRlZCByYXRoZXIgdGhhbiBwYWdlZC5cbiAgICBjb25zdCBTQ0FOX0xJTUlUID0gNTA7XG5cbiAgICAvKiogQWJzZW50LCBudWxsIG9yIHdoaXRlc3BhY2UgXHUyMDE0IHRoZSBzaGFwZSBgaXNCbGFua2AgdGVzdHMgaW4gQ0VMLiAqL1xuICAgIGNvbnN0IGlzQmxhbmsgPSAodmFsdWU6IHVua25vd24pOiBib29sZWFuID0+XG4gICAgICB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8ICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKSA9PT0gJycpO1xuXG4gICAgLy8gMS4gQ2Fub25pY2FsIGVtYWlsLiBgaW5wdXQuZW1haWxgIGlzIGFic2VudCBvbiBhIHBhcnRpYWwgdXBkYXRlOyBsZWF2ZSBpdFxuICAgIC8vICAgIGFsb25lIHRoZW4gcmF0aGVyIHRoYW4gd3JpdGluZyBhbiBlbXB0eSBzdHJpbmcgb3ZlciBhIHJlYWwgYWRkcmVzcy5cbiAgICBpZiAodHlwZW9mIGlucHV0LmVtYWlsID09PSAnc3RyaW5nJykge1xuICAgICAgaW5wdXQuZW1haWwgPSBpbnB1dC5lbWFpbC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgY29uc3QgZW1haWwgPSB0eXBlb2YgaW5wdXQuZW1haWwgPT09ICdzdHJpbmcnID8gaW5wdXQuZW1haWwgOiAnJztcblxuICAgIC8vIDFiLiBDYW5vbmljYWwgQ09NUEFOWSwgaW50byBpdHMgb3duIGNvbHVtbiAoIzYyNikuIFNhbWUgZG9jdHJpbmUgYXMgdGhlXG4gICAgLy8gICAgIGVtYWlsIGFib3ZlIFx1MjAxNCB0aGUgY2Fub25pY2FsIGZvcm0gaXMgZXN0YWJsaXNoZWQgYnkgdGhlIHByb2R1Y2VyIGF0XG4gICAgLy8gICAgIHdyaXRlIHRpbWUgXHUyMDE0IGJ1dCBpdCBjYW5ub3QgYmUgZG9uZSBpbiBwbGFjZTogYGNvbXBhbnlgIGlzIHRoZSBkaXNwbGF5XG4gICAgLy8gICAgIHZhbHVlIGFuZCBpcyBjb3BpZWQgdmVyYmF0aW0gb250byB0aGUgYWNjb3VudCBgbGVhZF9jb252ZXJzaW9uYFxuICAgIC8vICAgICBjcmVhdGVzLCBzbyBmb2xkaW5nIGl0IHdvdWxkIHNoaXAgXCJhY21lIGNvcnBcIiBhcyB0aGUgYWNjb3VudCBuYW1lLlxuICAgIC8vICAgICBgY3JtX2FjY291bnQubmFtZV9ub3JtYWxpemVkYCBpcyB0aGUgb3RoZXIgaGFsZiBvZiB0aGUgcGFpcjsgdGhlIGZsb3dcbiAgICAvLyAgICAgY29tcGFyZXMgdGhlIHR3byBjb2x1bW5zIGJlY2F1c2UgaXQgY2FuIGNvbXB1dGUgbmVpdGhlclxuICAgIC8vICAgICAoYHJlc29sdmVUb2tlbmAga25vd3Mgb25seSBgTk9XKClgIC8gYFRPREFZKClgKS5cbiAgICAvL1xuICAgIC8vICAgICBSdW5zIGJlZm9yZSB0aGUgaW5zZXJ0LW9ubHkgZWFybHkgcmV0dXJuIGJlbG93LCBzbyBhbiBlZGl0IHRoYXRcbiAgICAvLyAgICAgcmV3cml0ZXMgYGNvbXBhbnlgIHJlLWZvbGRzIHRoZSBrZXkgaW5zdGVhZCBvZiBsZWF2aW5nIGEgc3RhbGUgb25lLlxuICAgIC8vICAgICBBYnNlbnQga2V5IFx1MjFEMiB1bnRvdWNoZWQ6IGEgcGFydGlhbCB1cGRhdGUgdGhhdCBuZXZlciBtZW50aW9uc1xuICAgIC8vICAgICBgY29tcGFueWAgbXVzdCBub3QgYmxhbmsgdGhlIG1hdGNoIGtleS5cbiAgICBpZiAoJ2NvbXBhbnknIGluIGlucHV0KSB7XG4gICAgICBjb25zdCByYXdDb21wYW55ID0gaW5wdXQuY29tcGFueTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDb21wYW55ID1cbiAgICAgICAgdHlwZW9mIHJhd0NvbXBhbnkgPT09ICdzdHJpbmcnXG4gICAgICAgICAgPyByYXdDb21wYW55LnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccysvZywgJyAnKVxuICAgICAgICAgIDogJyc7XG4gICAgICBpbnB1dC5jb21wYW55X25vcm1hbGl6ZWQgPSBub3JtYWxpemVkQ29tcGFueSA9PT0gJycgPyBudWxsIDogbm9ybWFsaXplZENvbXBhbnk7XG4gICAgfVxuXG4gICAgLy8gMWMuIFJldGlyZSBhIGR1cGxpY2F0ZSBjbGFpbSBvbmNlIHRoZSByZWNvcmQgaXQgbmFtZWQgaXMgZ29uZS5cbiAgICAvL1xuICAgIC8vICAgICBcdTI2QTBcdUZFMEYgUGxhdGZvcm0gY29uc3RyYWludC4gYGR1cGxpY2F0ZV9vZl90eXBlYCBpcyBhIERJU0NSSU1JTkFUT1IsIGFuZFxuICAgIC8vICAgICBgbGVhZC5vYmplY3QudHNgIHBhaXJzIGl0IHdpdGggdGhlIGxvb2t1cCBpdCBuYW1lcyB0aHJvdWdoXG4gICAgLy8gICAgIGByZXF1aXJlZFdoZW5gIFx1MjAxNCBzbyBcInRoZSB0eXBlIGlzIHNldFwiIGFuZCBcInRoYXQgbG9va3VwIGlzIHBvcHVsYXRlZFwiXG4gICAgLy8gICAgIGFyZSBPTkUgZmFjdCBzdGF0ZWQgaW4gdHdvIGNvbHVtbnMuIE5laXRoZXIgbG9va3VwIGRlY2xhcmVzIGFcbiAgICAvLyAgICAgYGRlbGV0ZUJlaGF2aW9yYCwgc28gYm90aCB0YWtlIHRoZSBzcGVjIGRlZmF1bHQgYHNldF9udWxsYCwgYW5kIHRoZVxuICAgIC8vICAgICBlbmdpbmUgaW1wbGVtZW50cyBgc2V0X251bGxgIGJ5IFVQREFUSU5HIHRoZSByb3cgdGhhdCBIT0xEUyB0aGVcbiAgICAvLyAgICAgbG9va3VwLiBEZWxldGluZyB0aGUgY29udGFjdCAob3IgbGVhZCkgYSBsZWFkIHdhcyBmbGFnZ2VkIGFnYWluc3RcbiAgICAvLyAgICAgdGhlcmVmb3JlIGFycml2ZXMgaGVyZSBhcyBgeyBpZCwgZHVwbGljYXRlX29mXzx4PjogbnVsbCwgXHUyMDI2IH1gLCBudWxsc1xuICAgIC8vICAgICBvbmUgaGFsZiBvZiB0aGUgcGFpciwgYW5kIHRoZSByb3cgaW5zdGFudGx5IGJyZWFrcyBpdHMgb3duIHJ1bGUgXHUyMDE0IHNvXG4gICAgLy8gICAgIHRoZSB3aG9sZSBkZWxldGUgcm9sbHMgYmFjayB3aXRoIGBEdXBsaWNhdGUgT2YgQ29udGFjdCBpcyByZXF1aXJlZGAsXG4gICAgLy8gICAgIGFuIGVycm9yIG5hbWluZyBhIGZpZWxkIG9uIGFuIG9iamVjdCB0aGUgY2FsbGVyIG5ldmVyIGFkZHJlc3NlZC5cbiAgICAvL1xuICAgIC8vICAgICBUaGUgYmxhc3QgcmFkaXVzIGlzIHdoeSB0aGlzIG1hdHRlcnM6IHRoZSBmbGFnIGlzIHN0YW1wZWRcbiAgICAvLyAgICAgYXV0b21hdGljYWxseSBhdCBpbnRha2Ugb24gYW55IE9QRU4gbGVhZCB0aGF0IG1lcmVseSByZS11c2VzIGFcbiAgICAvLyAgICAgY29udGFjdCdzIGVtYWlsLCBzbyBhbiBvcmRpbmFyeSBkdXBsaWNhdGUgbWFrZXMgdGhhdCBDT05UQUNUXG4gICAgLy8gICAgIHVuZGVsZXRhYmxlIFx1MjAxNCBhbmQgYmVjYXVzZSBgY3JtX2NvbnRhY3QuY3JtX2FjY291bnRgIGlzIGFcbiAgICAvLyAgICAgbWFzdGVyLWRldGFpbCB3aXRoIGBkZWxldGVCZWhhdmlvcjogJ2Nhc2NhZGUnYCwgdGhlIEFDQ09VTlQgYWJvdmUgaXRcbiAgICAvLyAgICAgdG9vLiBBIEdEUFIgXCJkZWxldGUgdGhpcyBwZXJzb25cIiByZXF1ZXN0IHdpdGggbm8gd2F5IHRvIGNhcnJ5IGl0IG91dC5cbiAgICAvL1xuICAgIC8vICAgICBUaGUgcnVsZSByZXN0b3JlZCBoZXJlIGlzIG9uZSBsaW5lOiAqKnRoZSBkaXNjcmltaW5hdG9yIG1heSBub3RcbiAgICAvLyAgICAgb3V0bGl2ZSB0aGUgbG9va3VwIGl0IG5hbWVzLioqIFdoZW4gYSB3cml0ZSBsZWF2ZXMgdGhhdCBsb29rdXAgYmxhbmssXG4gICAgLy8gICAgIHRoZSBjbGFpbSBpcyByZXRpcmVkIFdIT0xFIFx1MjAxNCB0eXBlIGFuZCBzdGF0dXMgZ28gd2l0aCB0aGUgbGluayBcdTIwMTQgYW5kXG4gICAgLy8gICAgIHRoZSBsZWFkIHNpbXBseSBzdG9wcyBzYXlpbmcgaXQgZHVwbGljYXRlcyBzb21ldGhpbmcuXG4gICAgLy9cbiAgICAvLyAgICAgXHUyNkEwXHVGRTBGIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IE5PVCBhIHNlY29uZCBzcGVsbGluZyBvZiAjNzIwJ3MgXCJpcyB0aGlzIHdyaXRlXG4gICAgLy8gICAgIHRoZSBlbmdpbmUncyByZWZlcmVuY2UgY2xlYW51cD9cIiBwcmVkaWNhdGUgaW4gYGxlYWRfYXV0b21hdGlvbmAgYWJvdmUuXG4gICAgLy8gICAgIFJlLW1lYXN1cmVkIG9uIDE3LjEuMCB3aXRoIGEgcHJvYmUgaG9vayBhdCBwcmlvcml0eSAxOTk6IHRoZSBlbmdpbmUnc1xuICAgIC8vICAgICBjbGVhbnVwIHdyaXRlIGFuZCBhIHVzZXIncyBoYW5kLWNsZWFyIG9mIHRoZSBzYW1lIGxvb2t1cCBhcmUgaWRlbnRpY2FsXG4gICAgLy8gICAgIGluIGV2ZXJ5dGhpbmcgdGhpcyBibG9jayBjb3VsZCByZWFkIFx1MjAxNCBpZGVudGljYWwgYGlucHV0YFxuICAgIC8vICAgICAoYHsgaWQsIDxsaW5rPjogbnVsbCwgdXBkYXRlZF9hdCwgdXBkYXRlZF9ieSB9YCksIGlkZW50aWNhbFxuICAgIC8vICAgICBgY3R4LnVzZXJgLCBpZGVudGljYWwgYGN0eC5zZXNzaW9uYCBcdTIwMTQgYmVjYXVzZSB0aGUgZW5naW5lIGJ1aWxkcyB0aGVcbiAgICAvLyAgICAgY2xlYW51cCBvbiB0aGUgQ0FMTEVSJ3Mgb3duIGNvbnRleHQuIFRoZXkgYXJlIG5vdCBpbmRpc3Rpbmd1aXNoYWJsZVxuICAgIC8vICAgICBvdXRyaWdodCwgdGhvdWdoOiBhIG1hcmtlciBpcyByZWFjaGFibGUgYXRcbiAgICAvLyAgICAgYGN0eC5hcGkuZXhlY3V0aW9uQ29udGV4dC5fX3JlZmVyZW50aWFsRmllbGRDbGVhcmAsIGB0cnVlYCBvbiB0aGVcbiAgICAvLyAgICAgY2FzY2FkZSBhbmQgYHVuZGVmaW5lZGAgb24gdGhlIGhhbmQtY2xlYXIuIFRoZSAjMTE2NSBydWxpbmcgb2ZcbiAgICAvLyAgICAgMjAyNi0wOC0yNSB1cGhlbGQgTk9UIHJlYWRpbmcgaXQgXHUyMDE0IGFuIG9wZXJhdGlvbi1wcml2YXRlIGtleSBpcyBhblxuICAgIC8vICAgICB1bmRlY2xhcmVkIGRlcGVuZGVuY3ksIGFuZCBhIGhvb2sgYm9keSBpbiBRdWlja0pTIGNhbiBiZSBoYW5kZWQgYW5cbiAgICAvLyAgICAgYXBpIHNoaW0gd2l0aCBubyBgZXhlY3V0aW9uQ29udGV4dGAgYXQgYWxsICgjMTQxMjsgdGhlIGRlY2xhcmVkXG4gICAgLy8gICAgIHJlcGxhY2VtZW50IGlzIGFza2VkIGZvciBhcyBvYmplY3RzdGFjay1haS9vYmplY3RzdGFjayMxMzY0NCkuXG4gICAgLy8gICAgIE5vbmUgb2Ygd2hpY2ggY2hhbmdlcyB0aGlzIGJsb2NrLCBhbmQgdGhhdCBpcyB0aGUgcG9pbnQ6IGFza2luZyBcImlzXG4gICAgLy8gICAgIHRoZSBwYWlyIHN0aWxsIHdob2xlP1wiIG5lZWRzIG5vIHByb3ZlbmFuY2UgYXQgYWxsLCBhbmQgYW5zd2VycyBib3RoXG4gICAgLy8gICAgIGNhbGxlcnMgdGhlIHNhbWUgY29ycmVjdCB3YXkgXHUyMDE0IGEgbGVhZCB3aG9zZSBsaW5rIHlvdSByZW1vdmVkIG5vXG4gICAgLy8gICAgIGxvbmdlciBkdXBsaWNhdGVzIGFueXRoaW5nLCBob3dldmVyIHRoZSByZW1vdmFsIHdhcyBzcGVsbGVkLlxuICAgIC8vXG4gICAgLy8gICAgIEl0IGRvZXMgTk9UIGxvb3NlbiB0aGUgcGFpcmluZywgd2hpY2ggaXMgdGhlIHRoaW5nIHRvIGNoZWNrIHdoZW5cbiAgICAvLyAgICAgcmVhZGluZyB0aGlzOiBhIHdyaXRlIHRoYXQgU1RBVEVTIGEgdHlwZSB3aXRob3V0IG5hbWluZyBhIHJlY29yZCBpc1xuICAgIC8vICAgICBzdGlsbCByZWZ1c2VkIGJ5IGByZXF1aXJlZFdoZW5gLCBvbiBpbnNlcnQgYW5kIG9uIHVwZGF0ZS4gVGhhdCBpcyB3aGF0XG4gICAgLy8gICAgIHRoZSBgcmVzdGF0ZWRgIGd1YXJkIGJlbG93IHByb3RlY3RzIFx1MjAxNCBhIHBheWxvYWQgY2FycnlpbmcgaXRzIG93blxuICAgIC8vICAgICBub24tYmxhbmsgYGR1cGxpY2F0ZV9vZl90eXBlYCBpcyBhbiBhdXRob3IncyBjbGFpbSwgc28gaXQgaXMgbGVmdCBmb3JcbiAgICAvLyAgICAgdGhlIHJ1bGUgdG8ganVkZ2UgaW5zdGVhZCBvZiBiZWluZyBxdWlldGx5IGRlbGV0ZWQuXG4gICAgLy9cbiAgICAvLyAgICAgXHUyNkEwXHVGRTBGIFByaW9yaXR5IDMwMCBpcyBsb2FkLWJlYXJpbmcgaGVyZSwgbm90IGp1c3QgZm9yIGpvYiAyOlxuICAgIC8vICAgICBgbGVhZF9hdXRvbWF0aW9uYCAoMjAwKSBtdXN0IHNlZSB0aGUgQ0FMTEVSJ3MgcGF5bG9hZCBiZWZvcmUgdGhlc2UgdHdvXG4gICAgLy8gICAgIG51bGxzIGFyZSBhZGRlZCB0byBpdC4gSXRzIHJlZmVyZW5jZS1jbGVhbnVwIHlpZWxkIHBhc3NlcyBhIHdyaXRlIG9ubHlcbiAgICAvLyAgICAgd2hlbiBldmVyeSBub24tc3lzdGVtIGNoYW5nZSBpcyBhIGRlY2xhcmVkIExPT0tVUCBnb2luZyB2YWx1ZVx1MjE5Mm51bGwsXG4gICAgLy8gICAgIGFuZCBgZHVwbGljYXRlX29mX3R5cGVgIC8gYGR1cGxpY2F0ZV9zdGF0dXNgIGFyZSBuZWl0aGVyIFx1MjAxNCBzbyBhdCBhXG4gICAgLy8gICAgIGxvd2VyIHByaW9yaXR5IHRoaXMgYmxvY2sgd291bGQgbWFrZSB0aGUgY29udmVydGVkLWxlYWQgbG9jayByZWZ1c2VcbiAgICAvLyAgICAgdGhlIHZlcnkgY2xlYW51cCB0aGF0IHlpZWxkIGV4aXN0cyB0byBhbGxvdy5cbiAgICAvLyBEMyBzdGFuZC1kb3duIG9uIHRoZSBwcmVkaWNhdGUgcGF0aCBcdTIwMTQgdGhlIGBlbWFpbGAgLyBgY29tcGFueV9ub3JtYWxpemVkYFxuICAgIC8vIG5vcm1hbGlzYXRpb24gYWJvdmUgcmVhZHMgb25seSB0aGUgcGF5bG9hZCwgc28gaXQgaXMgYmF0Y2gtc2NvcGVkIGJ5XG4gICAgLy8gY29uc3RydWN0aW9uIGFuZCBrZWVwcyBydW5uaW5nLiBUaGlzIGJsb2NrIGlzIG5vdDogc2VlIGBmb3JlY2FzdC5ob29rLnRzYC5cbiAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIGN0eC5kaXNwYXRjaD8ubW9kZSAhPT0gJ3Blci1yb3cnKSB7XG4gICAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICAgIGNvbnN0IExJTktfT0ZfVFlQRTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgY3JtX2xlYWQ6ICdkdXBsaWNhdGVfb2ZfbGVhZCcsXG4gICAgICAgIGNybV9jb250YWN0OiAnZHVwbGljYXRlX29mX2NvbnRhY3QnLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3RhdGVkID0gJ2R1cGxpY2F0ZV9vZl90eXBlJyBpbiBpbnB1dCAmJiAhaXNCbGFuayhpbnB1dC5kdXBsaWNhdGVfb2ZfdHlwZSk7XG4gICAgICBjb25zdCBkZWNsYXJlZCA9IHByZXZpb3VzPy5kdXBsaWNhdGVfb2ZfdHlwZTtcbiAgICAgIGNvbnN0IGxpbmsgPSB0eXBlb2YgZGVjbGFyZWQgPT09ICdzdHJpbmcnID8gTElOS19PRl9UWVBFW2RlY2xhcmVkXSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICghcmVzdGF0ZWQgJiYgbGluayAmJiBsaW5rIGluIGlucHV0ICYmIGlzQmxhbmsoaW5wdXRbbGlua10pKSB7XG4gICAgICAgIC8vIFR3byBvdXRjb21lcywgYW5kIHdoaWNoIGFwcGxpZXMgdHVybnMgb24gT05FIHF1ZXN0aW9uOiBkaWQgYSBodW1hblxuICAgICAgICAvLyBldmVyIGxvb2sgYXQgdGhlc2UgdHdvIHJlY29yZHMgYW5kIGFncmVlPyBgZHVwbGljYXRlX3N0YXR1c2AgYWxyZWFkeVxuICAgICAgICAvLyByZWNvcmRzIGV4YWN0bHkgdGhhdCwgc28gdGhlIHF1ZXN0aW9uIGlzIGFuc3dlcmVkIGZyb20gdGhlIHJlY29yZCdzXG4gICAgICAgIC8vIG93biB2b2NhYnVsYXJ5IHJhdGhlciB0aGFuIGZyb20gYSBzZWNvbmQgcnVsZSByZXN0YXRlZCBoZXJlLlxuICAgICAgICAvL1xuICAgICAgICAvLyAgIGBjb25maXJtZWRgIFx1MjAxNCBhIHBlcnNvbiBjb21wYXJlZCB0aGUgdHdvIHJlY29yZHMgYW5kIHNhaWQgeWVzLiBUaGVcbiAgICAgICAgLy8gICAgIHJlY29yZCBpdCBuYW1lZCBpcyBnb25lLCBidXQgdGhlIFZFUkRJQ1QgaXMgYWJvdXQgd2hhdCB0aGVcbiAgICAgICAgLy8gICAgIHJldmlld2VyIGZvdW5kLCBub3QgYWJvdXQgdGhlIHBvaW50ZXIuIFNvIHRoZSBjbGFpbSBpc1xuICAgICAgICAvLyAgICAgVE9NQlNUT05FRDogdGhlIGRpc2NyaW1pbmF0b3IgbW92ZXMgdG8gYGVyYXNlZGAgYW5kIHRoZSBzdGF0dXNcbiAgICAgICAgLy8gICAgIHN0YW5kcywgYW5kIHRoZSBsZWFkIGdvZXMgb24gc2F5aW5nIFwiY29uZmlybWVkIGR1cGxpY2F0ZSBvZiBhXG4gICAgICAgIC8vICAgICByZWNvcmQgdGhhdCBoYXMgc2luY2UgYmVlbiBlcmFzZWRcIi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gICBhbnl0aGluZyBlbHNlIFx1MjAxNCB0aGUgbWFjaGluZSdzIGBzdXNwZWN0ZWRgIGd1ZXNzLCBvciBubyBvcGluaW9uIGF0XG4gICAgICAgIC8vICAgICBhbGwuIFJldGlyZWQgV0hPTEU7IHRoZXJlIGlzIG5vIGh1bWFuIHZlcmRpY3QgdG8gcHJlc2VydmUuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFx1MjZBMFx1RkUwRiBgJ2VyYXNlZCdgIGlzIHNwZWxsZWQgSU5MSU5FIG9uIHB1cnBvc2UuIEwyIGhvb2sgYm9kaWVzIHJ1blxuICAgICAgICAvLyBib2R5LW9ubHkgaW4gdGhlIFF1aWNrSlMgc2FuZGJveCwgc28gYERVUExJQ0FURV9PRl9UWVBFX0VSQVNFRGAgZnJvbVxuICAgICAgICAvLyBgX3BpY2tsaXN0cy50c2Agd291bGQgcmVzb2x2ZSBhdCBhdXRob3JpbmcgdGltZSBhbmQgYXJyaXZlIGFzXG4gICAgICAgIC8vIGB1bmRlZmluZWRgLiBUaGUgY2Fub25pY2FsIGNvbnN0YW50IGlzIHRoZSBvbmUgaW4gYF9waWNrbGlzdHMudHNgO1xuICAgICAgICAvLyBgdGVzdC9sZWFkLWR1cGxpY2F0ZS1tYW5hZ2VtZW50LnRlc3QudHNgIHBpbnMgdGhpcyBsaXRlcmFsIHRvIGl0IGFuZFxuICAgICAgICAvLyBwaW5zIHRoaXMgYmxvY2sgYXMgaXRzIG9ubHkgd3JpdGVyLCBzbyB0aGUgdHdvIGNhbm5vdCBkcmlmdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhlIHZlcmRpY3QgaXMgcmVhZCBmcm9tIGBwcmV2aW91c2AsIGFuZCB0aGUgd3JpdGUgbXVzdCBiZSBTSUxFTlRcbiAgICAgICAgLy8gYWJvdXQgaXQgXHUyMDE0IGAnZHVwbGljYXRlX3N0YXR1cycgaW4gaW5wdXRgIGRpc3F1YWxpZmllcyB0aGUgdG9tYnN0b25lLlxuICAgICAgICAvLyBUaGF0IGtlZXBzIHRoZSB0b21ic3RvbmUgb24gdGhlIGVyYXN1cmUgcGF0aCBhbmQgb2ZmIGV2ZXJ5IG90aGVyIG9uZTpcbiAgICAgICAgLy8gdGhlIGVuZ2luZSdzIGBzZXRfbnVsbGAgY2xlYW51cCBuZXZlciBtZW50aW9ucyB0aGUgc3RhdHVzLCB3aGlsZSBhXG4gICAgICAgIC8vIGNhbGxlciB0aGF0IERPRVMgbWVudGlvbiBpdCBpcyBtYW5hZ2luZyB0aGUgY2xhaW0gYnkgaGFuZCwgYW5kIGFcbiAgICAgICAgLy8gaGFuZC1ibGFua2VkIHBvaW50ZXIgaXMgbm90IGFuIGVyYXN1cmUuIEl0IGFsc28gbWVhbnMgbm8gcGF5bG9hZCBjYW5cbiAgICAgICAgLy8gbWFudWZhY3R1cmUgYSB0b21ic3RvbmUgYnkgc3VwcGx5aW5nIGl0cyBvd24gYGNvbmZpcm1lZGAuXG4gICAgICAgIGlmICghKCdkdXBsaWNhdGVfc3RhdHVzJyBpbiBpbnB1dCkgJiYgcHJldmlvdXM/LmR1cGxpY2F0ZV9zdGF0dXMgPT09ICdjb25maXJtZWQnKSB7XG4gICAgICAgICAgaW5wdXQuZHVwbGljYXRlX29mX3R5cGUgPSAnZXJhc2VkJztcbiAgICAgICAgICAvLyBgZHVwbGljYXRlX3N0YXR1c2AgZGVsaWJlcmF0ZWx5IFVOVE9VQ0hFRCBcdTIwMTQgaXQgc3RheXMgYGNvbmZpcm1lZGAsXG4gICAgICAgICAgLy8gd2hpY2ggaXMgd2hhdCBrZWVwcyB0aGUgc3Vydml2aW5nIHN0YXRlIHJlYWRhYmxlIGFzIGEgdmVyZGljdC5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnB1dC5kdXBsaWNhdGVfb2ZfdHlwZSA9IG51bGw7XG4gICAgICAgICAgLy8gYGR1cGxpY2F0ZV9zdGF0dXNgIGdvZXMgd2l0aCBpdC4gSXRzIHJlYWRlcnMgaW4gdGhpcyBhcHAgYXJlIHRoZVxuICAgICAgICAgIC8vIGBzdXNwZWN0ZWRfZHVwbGljYXRlc2AgcmV2aWV3IHF1ZXVlIChgc3JjL3NhbGVzL3ZpZXdzL2xlYWQudmlldy50c2ApLFxuICAgICAgICAgIC8vIHdob3NlIHdob2xlIHdvcmtmbG93IGlzIFwib3BlbiB0aGUgdHdvIHJlY29yZHMgYW5kIGNvbXBhcmUgdGhlbVwiO1xuICAgICAgICAgIC8vIHRoZSBgZHVwbGljYXRlX2Rpc3F1YWxpZmljYXRpb25fcmVxdWlyZXNfc3Vydml2b3JgIHZhbGlkYXRpb24sXG4gICAgICAgICAgLy8gd2hpY2ggZGVtYW5kcyBhIE5BTUVEIHN1cnZpdm9yOyB0aGUgZHVwbGljYXRlIGZvcm0gYmxvY2s7IGFuZCB0aGlzXG4gICAgICAgICAgLy8gaG9vaydzIG93biBpbnNlcnQtdGltZSBzdGFuZC1kb3duLCB3aGljaCByZWFkcyB0aGUgcGF5bG9hZCBhbmRcbiAgICAgICAgICAvLyBuZXZlciB0aGUgc3RvcmVkIHJvdy4gV2l0aCBubyBsaW5rIGxlZnQsIG5vbmUgb2YgdGhlbSBjYW4gYWN0IG9uXG4gICAgICAgICAgLy8gYHN1c3BlY3RlZGAsIGFuZCBsZWF2aW5nIGl0IHdvdWxkIHBhcmsgYSBwZXJtYW5lbnRseSB1bndvcmthYmxlIHJvd1xuICAgICAgICAgIC8vIGluIHRoYXQgcXVldWUuIFRoZSB2ZXJkaWN0IGlzIG5vdCBsb3N0OiBgZHVwbGljYXRlX3N0YXR1c2AgZGVjbGFyZXNcbiAgICAgICAgICAvLyBgdHJhY2tIaXN0b3J5OiB0cnVlYCwgc28gd2hvIGRlY2lkZWQgd2hhdCwgYW5kIHdoZW4sIHN0YXlzIG9uIHRoZVxuICAgICAgICAgIC8vIHJlY29yZCdzIGZpZWxkIGhpc3RvcnkuXG4gICAgICAgICAgaW5wdXQuZHVwbGljYXRlX3N0YXR1cyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgIT09ICdiZWZvcmVJbnNlcnQnIHx8ICFlbWFpbCkgcmV0dXJuO1xuXG4gICAgLy8gMi4gTmV2ZXIgb3ZlcndyaXRlIGFuIG9waW5pb24gdGhlIHJlY29yZCBhbHJlYWR5IGNhcnJpZXMuIFRoZVxuICAgIC8vICAgIGBkdXBsaWNhdGVfc3RhdHVzYCBoYWxmIGlzIHRoZSBsb2FkLWJlYXJpbmcgb25lOiBpdCBpcyB3aGF0IGtlZXBzIGFcbiAgICAvLyAgICBodW1hbidzIGBjb25maXJtZWRgIHZlcmRpY3Qgc2FmZSBmcm9tIGFueSBsYXRlciBhdXRvbWF0aWMgd3JpdGUuXG4gICAgaWYgKCFpc0JsYW5rKGlucHV0LmR1cGxpY2F0ZV9zdGF0dXMpIHx8ICFpc0JsYW5rKGlucHV0LmR1cGxpY2F0ZV9vZl90eXBlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXBpKSByZXR1cm47XG5cbiAgICAvKiogT2xkZXN0IHJvdyB3aW5zOyBhbiB1bmRhdGVkIHJvdyBvbmx5IHdpbnMgaWYgbm90aGluZyBkYXRlZCBpcyBwcmVzZW50LiAqL1xuICAgIGNvbnN0IG9yaWdpbmFsID0gKHJvd3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBsZXQgYmVzdDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IGJlc3RLZXkgPSBJbmZpbml0eTtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgY29uc3QgaWQgPSB0eXBlb2Ygcm93LmlkID09PSAnc3RyaW5nJyA/IHJvdy5pZCA6ICcnO1xuICAgICAgICBpZiAoIWlkKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcmF3ID0gcm93LmNyZWF0ZWRfYXQ7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9XG4gICAgICAgICAgdHlwZW9mIHJhdyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHJhdyA9PT0gJ251bWJlcicgfHwgcmF3IGluc3RhbmNlb2YgRGF0ZVxuICAgICAgICAgICAgPyBuZXcgRGF0ZShyYXcgYXMgc3RyaW5nKS5nZXRUaW1lKClcbiAgICAgICAgICAgIDogTnVtYmVyLk5hTjtcbiAgICAgICAgY29uc3Qga2V5ID0gTnVtYmVyLmlzRmluaXRlKHBhcnNlZCkgPyBwYXJzZWQgOiBJbmZpbml0eTtcbiAgICAgICAgaWYgKGJlc3QgPT09IHVuZGVmaW5lZCB8fCBrZXkgPCBiZXN0S2V5KSB7XG4gICAgICAgICAgYmVzdCA9IGlkO1xuICAgICAgICAgIGJlc3RLZXkgPSBrZXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBiZXN0O1xuICAgIH07XG5cbiAgICAvLyBCZXN0LWVmZm9ydCBFTkhBTkNFTUVOVCwgbmV2ZXIgYSBnYXRlIG9uIHRoZSB3cml0ZSBcdTIwMTQgaWRlbnRpY2FsIHRvXG4gICAgLy8gYGxlYWRfYXV0b19hc3NpZ25gIGFib3ZlLiBBbiBhbm9ueW1vdXMgV2ViLXRvLUxlYWQgc3VibWlzc2lvbiBydW5zIHVuZGVyXG4gICAgLy8gdGhlIGBndWVzdF9wb3J0YWxgIGdyYW50LCB3aGljaCBpcyBJTlNFUlQtb25seSBvbiBgY3JtX2xlYWRgIGFuZCBkZW5pZXNcbiAgICAvLyByZWFkcyBvdXRyaWdodDsgbGV0dGluZyB0aGF0IGRlbmlhbCBwcm9wYWdhdGUgd291bGQgcmVqZWN0IHRoZSB2ZXJ5XG4gICAgLy8gc3VibWlzc2lvbiB0aGlzIGZlYXR1cmUgZXhpc3RzIHRvIGFjY2VwdC4gQSBndWVzdCdzIGR1cGxpY2F0ZSB0aGVyZWZvcmVcbiAgICAvLyBsYW5kcyB1bmZsYWdnZWQgcmF0aGVyIHRoYW4gbm90IGxhbmRpbmcgYXQgYWxsLlxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250YWN0cyA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9jb250YWN0JykuZmluZCh7XG4gICAgICAgIHdoZXJlOiB7IGVtYWlsIH0sXG4gICAgICAgIGZpZWxkczogWydpZCcsICdjcmVhdGVkX2F0J10sXG4gICAgICAgIHRvcDogU0NBTl9MSU1JVCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY29udGFjdElkID0gb3JpZ2luYWwoY29udGFjdHMgPz8gW10pO1xuICAgICAgaWYgKGNvbnRhY3RJZCkge1xuICAgICAgICBpbnB1dC5kdXBsaWNhdGVfb2ZfdHlwZSA9ICdjcm1fY29udGFjdCc7XG4gICAgICAgIGlucHV0LmR1cGxpY2F0ZV9vZl9jb250YWN0ID0gY29udGFjdElkO1xuICAgICAgICBpbnB1dC5kdXBsaWNhdGVfc3RhdHVzID0gJ3N1c3BlY3RlZCc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gT3BlbiBsZWFkcyBvbmx5LiBBIHByZWRlY2Vzc29yIHRoYXQgYWxyZWFkeSBjb252ZXJ0ZWQgaXMgcmVwcmVzZW50ZWQgYnlcbiAgICAgIC8vIHRoZSBjb250YWN0IGl0IGNyZWF0ZWQsIHdoaWNoIHRoZSBicmFuY2ggYWJvdmUgbWF0Y2hlcyBvbiB0aGUgc2FtZVxuICAgICAgLy8gYWRkcmVzcyBcdTIwMTQgcG9pbnRpbmcgYXQgdGhlIGxvY2tlZCBsZWFkIGluc3RlYWQgd291bGQgbmFtZSBhIHJlY29yZFxuICAgICAgLy8gbm9ib2R5IGNhbiB3b3JrLlxuICAgICAgY29uc3QgbGVhZHMgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fbGVhZCcpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBlbWFpbCwgaXNfY29udmVydGVkOiBmYWxzZSB9LFxuICAgICAgICBmaWVsZHM6IFsnaWQnLCAnY3JlYXRlZF9hdCddLFxuICAgICAgICB0b3A6IFNDQU5fTElNSVQsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxlYWRJZCA9IG9yaWdpbmFsKGxlYWRzID8/IFtdKTtcbiAgICAgIGlmIChsZWFkSWQpIHtcbiAgICAgICAgaW5wdXQuZHVwbGljYXRlX29mX3R5cGUgPSAnY3JtX2xlYWQnO1xuICAgICAgICBpbnB1dC5kdXBsaWNhdGVfb2ZfbGVhZCA9IGxlYWRJZDtcbiAgICAgICAgaW5wdXQuZHVwbGljYXRlX3N0YXR1cyA9ICdzdXNwZWN0ZWQnO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gU3dhbGxvdzogc2VlIGFib3ZlLiAoTm8gYGNvbnNvbGVgIGluIHRoZSBMMiBob29rIHNhbmRib3guKVxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFtsZWFkQXV0b0Fzc2lnbkhvb2ssIGxlYWRIb29rLCBsZWFkRHVwbGljYXRlQ2hlY2tIb29rXTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL29iamVjdHMvbGVhZC5jYW1wYWlnbi1tZXRyaWNzLmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL2xlYWQuY2FtcGFpZ24tbWV0cmljcy5ob29rLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tDb250ZXh0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEhvb2tBcGkgfSBmcm9tICcuL19ob29rLWFwaSc7XG5cbi8qKlxuICogQ2FtcGFpZ24gbWV0cmljIHJlZnJlc2gsIHRyaWdnZXJlZCBieSBhIExFQUQgY29udmVyc2lvbi5cbiAqXG4gKiBBdHRhY2hlZCB0byBgY3JtX2xlYWRgLCB3aGljaCB0aGUgc2FsZXMgcGFja2FnZSBvd25zLCBzbyBpdCBsaXZlcyBoZXJlXG4gKiBiZXNpZGUgdGhhdCBvYmplY3QgcmF0aGVyIHRoYW4gd2l0aCB0aGUgY2FtcGFpZ24gbWV0YWRhdGEgaXQgbWFpbnRhaW5zXG4gKiAocGxhbiBpdGVtIDY6IGEgaG9vayBzaXRzIGJlc2lkZSBpdHMgb2JqZWN0LCB3aGljaCBpcyB3aGF0IGVuZm9yY2VzIFI0KS5cbiAqIEl0cyB0aHJlZSBzaWJsaW5nczogYGNhbXBhaWduX3ZhbGlkYXRpb25gIGFuZCBgY2FtcGFpZ25fbWV0cmljc19yZWZyZXNoYCBvblxuICogYGNybV9jYW1wYWlnbmAgaW4gYHNyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbi5ob29rLnRzYCwgYW5kXG4gKiBgY2FtcGFpZ25fYXR0cmlidXRpb25fcmVmcmVzaGAgb24gYGNybV9vcHBvcnR1bml0eWAgbmV4dCBkb29yIGluXG4gKiBgb3Bwb3J0dW5pdHkuY2FtcGFpZ24tbWV0cmljcy5ob29rLnRzYC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgV0hZIFRIRSBSRUNPTVBVVEUgSVMgV1JJVFRFTiBPVVQgRk9VUiBUSU1FUy5cbiAqXG4gKiBMMiBob29rIGJvZGllcyBhcmUgbG93ZXJlZCB0byBtZXRhZGF0YSBhbmQgZXZhbHVhdGVkIEJPRFktT05MWSBpbiB0aGUgUXVpY2tKU1xuICogc2FuZGJveDogYSBoYW5kbGVyIGNhbm5vdCByZWFjaCBtb2R1bGUgc2NvcGUgYXQgcnVudGltZSwgc28gYSBzaGFyZWRcbiAqIGByZWZyZXNoQ2FtcGFpZ25NZXRyaWNzKClgIGltcG9ydCB3b3VsZCBiZSBhIGZyZWUgaWRlbnRpZmllciBcdTIwMTQgdGhlIENMSSBidWlsZFxuICogc2lsZW50bHkgZGVjbGluZXMgdG8gbG93ZXIgdGhlIGhhbmRsZXIsIGtlZXBzIGl0IGluIGEgYnVuZGxlZCBydW50aW1lIGZpbGUsXG4gKiBhbmQgdGhlIGhvb2sgc3RvcHMgYmVpbmcgZGVwbG95YWJsZSBhcyBwdXJlIG1ldGFkYXRhICh0aGUgYnVpbGQgc2F5cyBzbyBpblxuICogb25lIGxpbmUgbm9ib2R5IHJlYWRzKS4gYHRlc3QvYWN0aW9uLXNhbmRib3gudGVzdC50c2AgaXMgd2hhdCBjYXRjaGVzIGl0LlxuICpcbiAqIFNvIHRoZSBhcml0aG1ldGljIGlzIGlubGluZWQgcGVyIGhhbmRsZXIuIFRoZSBkdXBsaWNhdGlvbiBpcyBOT1QgdHJ1c3RlZDpcbiAqIGB0ZXN0L2NhbXBhaWduLW1lbWJlci1saWZlY3ljbGUudGVzdC50c2AgbG93ZXJzIGFsbCBmb3VyIGJvZGllcyBhbmQgYXNzZXJ0c1xuICogdGhlIHJlY29tcHV0ZSBibG9jayBpcyBjaGFyYWN0ZXItaWRlbnRpY2FsIGFjcm9zcyB0aGVtLCBzbyBhIGZpeCBsYW5kaW5nIG9uXG4gKiBvbmUgY29weSBhbmQgc2tpcHBpbmcgdGhyZWUgZmFpbHMgYSB0ZXN0IGluc3RlYWQgb2Ygc2hpcHBpbmcgZm91ciBkZWZpbml0aW9uc1xuICogb2YgYG51bV9zZW50YC4gU3BsaXR0aW5nIHRoZSBmb3VyIGFjcm9zcyB0aHJlZSBmaWxlcyBieSBvd25pbmcgb2JqZWN0IGNoYW5nZWRcbiAqIG5vbmUgb2YgdGhhdCBcdTIwMTQgdGhlIHN1aXRlIHJlYWRzIHRoZW0gYnkgaG9vayBuYW1lLCBub3QgYnkgZmlsZS5cbiAqL1xuXG4vKipcbiAqIFByb21vdGUgdGhlIG1lbWJlciByb3dzIG9mIGEgY29udmVydGluZyBsZWFkLCB0aGVuIHJlY29tcHV0ZS5cbiAqXG4gKiBUaGlzIGhvb2sgaXMgYGNvbnZlcnRlZGAncyBPTkxZIHdyaXRlciwgYW5kIHdpdGhvdXQgaXQgdGhhdCBzdGF0dXMgb3B0aW9uXG4gKiB3b3VsZCBiZSBleGFjdGx5IHRoZSBraW5kIG9mIGluZXJ0IHZvY2FidWxhcnkgIzU5NyByZW1vdmVkIHRoZSB0cmFja2VyIHN0YXRlc1xuICogZm9yIFx1MjAxNCBhIHZhbHVlIHRoZSBwaWNrbGlzdCBvZmZlcnMsIHRoZSBST0kgc3VyZmFjZXMgc2VnbWVudCBieSwgYW5kIG5vdGhpbmdcbiAqIHByb2R1Y2VzLiBDb252ZXJzaW9uIGlzIHRoZSBvbmUgY2FtcGFpZ24gb3V0Y29tZSB0aGUgYXBwIGNhbiBvYnNlcnZlIGJ5XG4gKiBpdHNlbGY6IGBjcm1fbGVhZC5pc19jb252ZXJ0ZWRgIGZsaXBzICh0aGUgYGxlYWRfY29udmVyc2lvbmAgZmxvdywgb3IgdGhlXG4gKiBjb252ZXJ0IGFjdGlvbiksIGFuZCBldmVyeSBjYW1wYWlnbiB0aGF0IGxlYWQgd2FzIGVucm9sbGVkIGluIGhhcyBqdXN0XG4gKiByZWNvcmRlZCBhIGNvbnZlcnNpb24uXG4gKlxuICogT25seSBtZW1iZXJzIHN0aWxsIGBzZW50YCBvciBgcmVzcG9uZGVkYCBhcmUgcHJvbW90ZWQuIEFuIGB1bnN1YnNjcmliZWRgXG4gKiBtZW1iZXIgaXMgTk9UOiB0aGF0IHBlcnNvbiBhc2tlZCB0byBiZSBsZWZ0IGFsb25lLCBhbmQgb3ZlcndyaXRpbmcgdGhlaXJcbiAqIG9wdC1vdXQgc3RhdGUgd2l0aCBhIG1hcmtldGluZyBvdXRjb21lIGlzIHByZWNpc2VseSB0aGUga2luZCBvZiBxdWlldCByZXdyaXRlXG4gKiBgY2FtcGFpZ25fbWVtYmVyX29wdG91dF9zeW5jYCBleGlzdHMgdG8gcHJldmVudC5cbiAqXG4gKiBgbnVtX2NvbnZlcnRlZF9sZWFkc2AgYWxzbyBjb3VudHMgYGNybV9sZWFkLmlzX2NvbnZlcnRlZGAgYWNyb3NzIHRoZVxuICogbWVtYmVyc2hpcCwgc28gdGhpcyBzYW1lIGV2ZW50IGlzIHRoZSBtZXRyaWMncyB0cmlnZ2VyIFx1MjAxNCBhIGxlYWQgY2FuIHNpdCBpblxuICogc2V2ZXJhbCBjYW1wYWlnbnMgYW5kIGV2ZXJ5IG9uZSBvZiB0aGVtIGlzIHJlZnJlc2hlZC5cbiAqXG4gKiBgcnVuQXM6ICdzeXN0ZW0nYCAoIzIwMTQsIEFHRU5UUy5tZCBydWxlIDkpLiBDb252ZXJzaW9ucyBhcmUgYSByZXAncyBhY3QsXG4gKiBhbmQgYSByZXAgbWF5IGVkaXQgbmVpdGhlciBjYW1wYWlnbiBtZW1iZXJzIG5vciBjYW1wYWlnbnMsIHNvIHRoZSBwcm9tb3Rpb25cbiAqIHdhcyByZWZ1c2VkLCBsb2dnZWQgYW5kIHN3YWxsb3dlZDogdGhlIGxlYWQgY29udmVydGVkIGFuZCBpdHMgbWVtYmVyc2hpcHNcbiAqIHN0YXllZCB3aGVyZSB0aGV5IHdlcmUuIFRoZSBwcm9tb3Rpb24gYW5kIHRoZSByZWNvbXB1dGUgYXJlIG1hcmtldGluZydzXG4gKiByZWNvcmQgb2YgdGhlIG91dGNvbWUsIG5vdCB0aGUgcmVwJ3Mgd3JpdGUsIHNvIHRoZSBob29rIGVsZXZhdGVzOyB0aGUgbGVhZFxuICogd3JpdGUgc3RheXMgdGhlIGNhbGxlcidzLiBPcmdhbml6YXRpb24gKHJ1bGUgMTApOiBldmVyeSByZWFkIGlzIGtleWVkIHRvIHRoZVxuICogdHJpZ2dlcmluZyBsZWFkJ3Mgb3duIG1lbWJlcnNoaXBzIGFuZCB0aGVpciBjYW1wYWlnbnMsIGFuZCB0aGUgZWxldmF0ZWRcbiAqIGBjdHguYXBpYCBrZWVwcyB0aGUgdHJpZ2dlcidzIHRlbmFudC5cbiAqL1xuY29uc3QgY2FtcGFpZ25MZWFkQ29udmVyc2lvblJlZnJlc2g6IEhvb2sgPSB7XG4gIG5hbWU6ICdjYW1wYWlnbl9sZWFkX2NvbnZlcnNpb25fcmVmcmVzaCcsXG4gIG9iamVjdDogJ2NybV9sZWFkJyxcbiAgZXZlbnRzOiBbJ2FmdGVyVXBkYXRlJ10sXG4gIHByaW9yaXR5OiA4MTAsXG4gIGFzeW5jOiB0cnVlLFxuICBvbkVycm9yOiAnbG9nJyxcbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICBkZXNjcmlwdGlvbjogJ1Byb21vdGUgY2FtcGFpZ24gbWVtYmVycyBvZiBhIGNvbnZlcnRpbmcgbGVhZCBhbmQgcmVjb21wdXRlIGNhbXBhaWduIG1ldHJpY3MuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgaWYgKGlucHV0Py5pc19jb252ZXJ0ZWQgIT09IHRydWUpIHJldHVybjtcbiAgICBpZiAocHJldmlvdXM/LmlzX2NvbnZlcnRlZCA9PT0gdHJ1ZSkgcmV0dXJuO1xuICAgIGNvbnN0IGxlYWRJZCA9XG4gICAgICAodHlwZW9mIGlucHV0Py5pZCA9PT0gJ3N0cmluZycgJiYgaW5wdXQuaWQpIHx8XG4gICAgICAodHlwZW9mIHByZXZpb3VzPy5pZCA9PT0gJ3N0cmluZycgPyAocHJldmlvdXMuaWQgYXMgc3RyaW5nKSA6ICcnKTtcbiAgICBpZiAoIWxlYWRJZCkgcmV0dXJuO1xuICAgIC8vIGBpZGAgaXMgcHJvamVjdGVkIGJlY2F1c2UgdGhlIHByb21vdGlvbiBiZWxvdyB1cGRhdGVzIGVhY2ggcm93IGJ5IGl0OlxuICAgIC8vIHRoZSBTUUwgZGF0YXNvdXJjZSByZXR1cm5zIGV4YWN0bHkgdGhlIGNvbHVtbnMgYSByZWFkIG5hbWVzICgjMjAxOCkuXG4gICAgY29uc3QgbWVtYmVyc2hpcHMgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fY2FtcGFpZ25fbWVtYmVyJykuZmluZCh7XG4gICAgICB3aGVyZTogeyBjcm1fbGVhZDogbGVhZElkIH0sIGZpZWxkczogWydpZCcsICdjcm1fY2FtcGFpZ24nLCAnc3RhdHVzJ10sIHRvcDogNTAwLFxuICAgIH0pO1xuICAgIGZvciAoY29uc3QgbSBvZiBtZW1iZXJzaGlwcykge1xuICAgICAgY29uc3QgbWVtYmVySWQgPSB0eXBlb2YgbS5pZCA9PT0gJ3N0cmluZycgPyBtLmlkIDogJyc7XG4gICAgICBpZiAoIW1lbWJlcklkKSBjb250aW51ZTtcbiAgICAgIGlmIChtLnN0YXR1cyAhPT0gJ3NlbnQnICYmIG0uc3RhdHVzICE9PSAncmVzcG9uZGVkJykgY29udGludWU7XG4gICAgICBhd2FpdCBhcGkub2JqZWN0KCdjcm1fY2FtcGFpZ25fbWVtYmVyJykudXBkYXRlKFxuICAgICAgICB7IGlkOiBtZW1iZXJJZCwgc3RhdHVzOiAnY29udmVydGVkJyB9LFxuICAgICAgICB7IHdoZXJlOiB7IGlkOiBtZW1iZXJJZCB9IH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBjYW1wYWlnbklkcyA9IEFycmF5LmZyb20obmV3IFNldChcbiAgICAgIG1lbWJlcnNoaXBzLm1hcCgobSkgPT4gKHR5cGVvZiBtLmNybV9jYW1wYWlnbiA9PT0gJ3N0cmluZycgPyBtLmNybV9jYW1wYWlnbiA6ICcnKSkuZmlsdGVyKEJvb2xlYW4pLFxuICAgICkpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgY2FtcGFpZ25JZHMpIHtcbiAgICAgIC8vIFx1MjUwMFx1MjUwMCByZWNvbXB1dGUgXHUyNTAwXHUyNTAwIGlkZW50aWNhbCBpbiBhbGwgZm91ciByZWZyZXNoIGhvb2tzOyBzZWUgdGhlIGhlYWRlci5cbiAgICAgIGNvbnN0IG1lbWJlclJvd3MgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fY2FtcGFpZ25fbWVtYmVyJykuZmluZCh7XG4gICAgICAgIHdoZXJlOiB7IGNybV9jYW1wYWlnbjogaWQgfSwgZmllbGRzOiBbJ2NybV9sZWFkJywgJ3N0YXR1cyddLCB0b3A6IDUwMDAsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxlYWRJZHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoXG4gICAgICAgIG1lbWJlclJvd3MubWFwKChyKSA9PiAodHlwZW9mIHIuY3JtX2xlYWQgPT09ICdzdHJpbmcnID8gci5jcm1fbGVhZCA6ICcnKSkuZmlsdGVyKEJvb2xlYW4pLFxuICAgICAgKSk7XG4gICAgICBjb25zdCBjb252ZXJ0ZWRMZWFkcyA9IGxlYWRJZHMubGVuZ3RoID4gMFxuICAgICAgICA/IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9sZWFkJykuY291bnQoeyB3aGVyZTogeyBpZDogeyAkaW46IGxlYWRJZHMgfSwgaXNfY29udmVydGVkOiB0cnVlIH0gfSlcbiAgICAgICAgOiAwO1xuICAgICAgY29uc3QgbnVtT3Bwb3J0dW5pdGllcyA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9vcHBvcnR1bml0eScpLmNvdW50KHsgd2hlcmU6IHsgY3JtX2NhbXBhaWduOiBpZCB9IH0pO1xuICAgICAgY29uc3QgbnVtV29uID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykuY291bnQoeyB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGlkLCBzdGFnZTogJ2Nsb3NlZF93b24nIH0gfSk7XG4gICAgICBjb25zdCB3b25Sb3dzID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykuZmluZCh7XG4gICAgICAgIHdoZXJlOiB7IGNybV9jYW1wYWlnbjogaWQsIHN0YWdlOiAnY2xvc2VkX3dvbicgfSwgZmllbGRzOiBbJ2Ftb3VudCddLCB0b3A6IDUwMDAsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGFjdHVhbFJldmVudWUgPSB3b25Sb3dzLnJlZHVjZShcbiAgICAgICAgKHN1bSwgcm93KSA9PiBzdW0gKyAodHlwZW9mIHJvdy5hbW91bnQgPT09ICdudW1iZXInID8gcm93LmFtb3VudCA6IE51bWJlcihyb3cuYW1vdW50KSB8fCAwKSwgMCxcbiAgICAgICk7XG4gICAgICBhd2FpdCBhcGkub2JqZWN0KCdjcm1fY2FtcGFpZ24nKS51cGRhdGUoe1xuICAgICAgICBpZCxcbiAgICAgICAgbnVtX3NlbnQ6IG1lbWJlclJvd3MubGVuZ3RoLFxuICAgICAgICBudW1fcmVzcG9uc2VzOiBtZW1iZXJSb3dzLmZpbHRlcigocikgPT4gci5zdGF0dXMgPT09ICdyZXNwb25kZWQnIHx8IHIuc3RhdHVzID09PSAnY29udmVydGVkJykubGVuZ3RoLFxuICAgICAgICBudW1fbGVhZHM6IGxlYWRJZHMubGVuZ3RoLFxuICAgICAgICBudW1fY29udmVydGVkX2xlYWRzOiBjb252ZXJ0ZWRMZWFkcyxcbiAgICAgICAgbnVtX29wcG9ydHVuaXRpZXM6IG51bU9wcG9ydHVuaXRpZXMsXG4gICAgICAgIG51bV93b25fb3Bwb3J0dW5pdGllczogbnVtV29uLFxuICAgICAgICBhY3R1YWxfcmV2ZW51ZTogYWN0dWFsUmV2ZW51ZSxcbiAgICAgIH0sIHsgd2hlcmU6IHsgaWQgfSB9KTtcbiAgICAgIC8vIFx1MjUwMFx1MjUwMCAvcmVjb21wdXRlIFx1MjUwMFx1MjUwMFxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFtjYW1wYWlnbkxlYWRDb252ZXJzaW9uUmVmcmVzaF07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL29wcG9ydHVuaXR5Lmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL29wcG9ydHVuaXR5Lmhvb2sudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB0eXBlIHsgSG9va0FwaSB9IGZyb20gJy4vX2hvb2stYXBpJztcblxuLyoqXG4gKiBPcHBvcnR1bml0eSBsaWZlY3ljbGUgaG9vay5cbiAqXG4gKiAtIFJlLWRlcml2ZXMgYGV4cGVjdGVkX3JldmVudWVgIGZyb20gYGFtb3VudCAqIHN0YWdlUHJvYmFiaWxpdHlgIHdoZW4gZWl0aGVyIGNoYW5nZXMuXG4gKiAtIFN0YW1wcyBgc3RhZ2VfZW50cnlfZGF0ZWAgb24gaW5zZXJ0IGFuZCBvbiBldmVyeSBzdGFnZSBjaGFuZ2UgXHUyMDE0IHRoZSBzdG9yZWRcbiAqICAgY2xvY2sgYmVoaW5kIHRoZSBgZGF5c19pbl9zdGFnZWAgZm9ybXVsYSBhbmQgdGhlIHN0YWduYXRpb24gc3dlZXAgKCM0ODkpLlxuICogLSBGcmVlemVzIG1vc3QgZmllbGRzIGFmdGVyIHN0YWdlIGlzIGNsb3NlZCAod29uL2xvc3QpIFx1MjAxNCBvbmx5IG5hcnJhdGl2ZSBmaWVsZHNcbiAqICAgZWRpdGFibGUuIFRoZSBmcmVlemUgeWllbGRzIHRvIHRoZSBlbmdpbmUncyByZWZlcmVuY2UgY2xlYW51cCwgc28gYSBjbG9zZWRcbiAqICAgZGVhbCBuZXZlciBtYWtlcyB0aGUgcmVjb3JkcyBpdCBwb2ludHMgYXQgdW5kZWxldGFibGUgKCM3MjApLlxuICogLSBPbiBgY2xvc2VkX3dvbmA6IHN0YW1wcyBgY2xvc2VfZGF0ZT10b2RheWAsIHByb21vdGVzIHRoZSBwYXJlbnQgYWNjb3VudCB0byBgY3VzdG9tZXJgLFxuICogICBhbmQgYXN5bmNocm9ub3VzbHkgc2NoZWR1bGVzIGFuIFwiQWN0aXZhdGUgY3VzdG9tZXJcIiB0YXNrLlxuICovXG5cbmNvbnN0IG9wcG9ydHVuaXR5VmFsaWRhdGlvbkhvb2s6IEhvb2sgPSB7XG4gIG5hbWU6ICdvcHBvcnR1bml0eV9saWZlY3ljbGUnLFxuICBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICBwcmlvcml0eTogMjAwLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnUmVjb21wdXRlIGV4cGVjdGVkX3JldmVudWUsIGZyZWV6ZSBjbG9zZWQgb3Bwb3J0dW5pdGllcyBleGNlcHQgbmFycmF0aXZlIGZpZWxkcy4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIC8vIFRoZSByZWZ1c2FsIGVudmVsb3BlICgjMTA3NSkuIE1pcnJvcmVkIGZyb20gYC4vX3JlZnVzYWwudHNgIGJlY2F1c2UgYVxuICAgIC8vIGxvd2VyZWQgYm9keSBoYXMgbm8gbW9kdWxlIHNjb3BlIGFuZCBgZXh0cmFjdEhvb2tCb2R5YCBUSFJPV1Mgb24gYW5cbiAgICAvLyBpbXBvcnQ7IGB0ZXN0L3JlZnVzYWwtZW52ZWxvcGUudGVzdC50c2AgcGlucyBldmVyeSBjb3B5IGFnYWluc3QgaXQuXG4gICAgZnVuY3Rpb24gcmVmdXNlKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29kZTogc3RyaW5nLFxuICAgICAgc3RhdHVzOiBudW1iZXIsXG4gICAgICB1c2VyTWVzc2FnZTogc3RyaW5nID0gbWVzc2FnZSxcbiAgICApOiBFcnJvciB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSkgYXMgRXJyb3IgJiB7XG4gICAgICAgIGNvZGU6IHN0cmluZztcbiAgICAgICAgc3RhdHVzOiBudW1iZXI7XG4gICAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmc7XG4gICAgICB9O1xuICAgICAgZXJyLmNvZGUgPSBjb2RlO1xuICAgICAgZXJyLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgIGVyci51c2VyTWVzc2FnZSA9IHVzZXJNZXNzYWdlO1xuICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG4gICAgLy8gTk9URTogTDIgaG9vayBib2RpZXMgcnVuICpib2R5LW9ubHkqIGluIGEgc2FuZGJveCAoUXVpY2tKUykgXHUyMDE0IG1vZHVsZS1sZXZlbFxuICAgIC8vIGNvbnN0YW50cyBhcmUgTk9UIGluIHNjb3BlIGF0IHJ1bnRpbWUuIFRoZXNlIE1VU1QgYmUgZGVjbGFyZWQgaW5zaWRlIHRoZVxuICAgIC8vIGhhbmRsZXIgb3IgdGhlIGJvZHkgdGhyb3dzIGBSZWZlcmVuY2VFcnJvcmAgb24gZXZlcnkgd3JpdGUuIChTZWUgQURSIG9uXG4gICAgLy8gc2FuZGJveGVkIGhvb2tzOyBzYW1lIHBhdHRlcm4gYXMgbGVhZC5ob29rLnRzLilcbiAgICBjb25zdCBTVEFHRV9QUk9CQUJJTElUWTogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgICAgIHByb3NwZWN0aW5nOiAxMCxcbiAgICAgIHF1YWxpZmljYXRpb246IDI1LFxuICAgICAgbmVlZHNfYW5hbHlzaXM6IDQwLFxuICAgICAgcHJvcG9zYWw6IDYwLFxuICAgICAgbmVnb3RpYXRpb246IDgwLFxuICAgICAgY2xvc2VkX3dvbjogMTAwLFxuICAgICAgY2xvc2VkX2xvc3Q6IDAsXG4gICAgfTtcbiAgICBjb25zdCBOQVJSQVRJVkVfRklFTERTID0gbmV3IFNldChbJ2Rlc2NyaXB0aW9uJywgJ25leHRfc3RlcCcsICdub3RlcyddKTtcbiAgICAvLyBGcmFtZXdvcmstbWFuYWdlZCBjb2x1bW5zIGFyZSByZS1zdGFtcGVkIGJ5IHRoZSBydW50aW1lIGl0c2VsZiAob3duZXJzaGlwXG4gICAgLy8gcmVhc3NpZ25tZW50LCBhdWRpdCB0aW1lc3RhbXBzKSBcdTIwMTQgaW5jbHVkaW5nIGR1cmluZyBwb3N0LXNlZWQgb3duZXJzaGlwXG4gICAgLy8gYXNzaWdubWVudCBpbnRyb2R1Y2VkIGluIE9iamVjdFN0YWNrIDkueC4gVGhlIFwiZnJlZXplIGNsb3NlZCByZWNvcmRcIiBndWFyZFxuICAgIC8vIG11c3QgbmV2ZXIgcmVqZWN0IHRoZXNlIHN5c3RlbSB3cml0ZXMsIG9ubHkgdXNlciBlZGl0cyB0byBidXNpbmVzcyBmaWVsZHMuXG4gICAgLy8gKERlY2xhcmVkIGluLWhhbmRsZXI6IHNhbmRib3hlZCBib2RpZXMgaGF2ZSBubyBtb2R1bGUgc2NvcGUuKVxuICAgIGNvbnN0IFNZU1RFTV9GSUVMRFMgPSBuZXcgU2V0KFtcbiAgICAgICdpZCcsICdvd25lcl9pZCcsICdjcmVhdGVkX2F0JywgJ3VwZGF0ZWRfYXQnLFxuICAgICAgJ2NyZWF0ZWRfYnknLCAndXBkYXRlZF9ieScsICdzcGFjZV9pZCcsICdvcmdhbml6YXRpb25faWQnLCAnb3JnX2lkJywgJ3ZlcnNpb24nLFxuICAgIF0pO1xuICAgIC8vIEFwcHJvdmFsIHZlcmRpY3RzIG11c3QgYmUgYWxsb3dlZCB0byBsYW5kIGV2ZW4gaWYgdGhlIGRlYWwgY2xvc2VzIHdoaWxlXG4gICAgLy8gdGhlIHJlcXVlc3QgaXMgaW4gZmxpZ2h0IFx1MjAxNCByZWplY3RpbmcgdGhlbSBsZWZ0IHRoZSByZWNvcmQgbG9ja2VkIHdpdGggYVxuICAgIC8vIHBlcm1hbmVudGx5IHBlbmRpbmcgYXBwcm92YWwuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgV2h5IHRoaXMgZXhlbXB0aW9uIGlzIHN0aWxsIG5lZWRlZCBldmVuIHRob3VnaCBgb3Bwb3J0dW5pdHlfYXBwcm92YWxgXG4gICAgLy8gZGVjbGFyZXMgYHJ1bkFzOiAnc3lzdGVtJ2AsIGFuZCB3aHkgdGhhdCBpcyBub3QgYSBjb250cmFkaWN0aW9uOlxuICAgIC8vIEVMRVZBVElPTiBJUyBOT1QgQU5PTllNSVRZIChvYmplY3RzdGFjayM1NDk0KS4gYHJlc29sdmVSdW5EYXRhQ29udGV4dGBcbiAgICAvLyByZXR1cm5zIGB7IGlzU3lzdGVtOiB0cnVlLCBhY3RvciwgLi4udXNlcklkIH1gIGZvciBhIGBydW5BczogJ3N5c3RlbSdgXG4gICAgLy8gcnVuIFx1MjAxNCBpdCBjYXJyaWVzIHRoZSB0cmlnZ2VyaW5nIHVzZXIgdGhyb3VnaCByYXRoZXIgdGhhbiBlcmFzaW5nIHRoZW0uXG4gICAgLy8gU28gT05FIGFwcHJvdmFsIHdyaXRlIGlzIHNlZW4gYnkgVFdPIGd1YXJkcyBrZXllZCBvbiBESUZGRVJFTlQgaGFsdmVzIG9mXG4gICAgLy8gdGhhdCBjb250ZXh0LCBhbmQgYm90aCBmaXJlIGFzIGRlc2lnbmVkOlxuICAgIC8vICAgXHUyMDIyIHRoaXMgZnJlZXplIGd1YXJkIGtleXMgb24gYGN0eC51c2VyPy5pZGAsIHdoaWNoIGlzIFBSRVNFTlQgXHUyMUQyIHRoZVxuICAgIC8vICAgICB3cml0ZSBpcyBqdWRnZWQgYXMgYSB1c2VyIGVkaXQgYW5kIHdvdWxkIGJlIHJlamVjdGVkIG9uIGEgY2xvc2VkXG4gICAgLy8gICAgIGRlYWwgXHUyMDE0IGhlbmNlIHRoaXMgYWxsb3ctbGlzdC5cbiAgICAvLyAgIFx1MjAyMiB0aGUgZW5naW5lJ3MgcmVhZG9ubHkgc3RyaXAga2V5cyBvbiBgaXNTeXN0ZW1gLCB3aGljaCBpcyBUUlVFIFx1MjFEMiB0aGVcbiAgICAvLyAgICAgc3RyaXAgYnJhbmNoIChgaWYgKCFvcEN0eC5jb250ZXh0Py5pc1N5c3RlbSlgKSBpcyBza2lwcGVkLCBzbyB0aGVcbiAgICAvLyAgICAgc3RhbXBzIGxhbmQgZXZlbiB0aG91Z2ggYm90aCBjb2x1bW5zIGFyZSBkZWNsYXJlZCBgcmVhZG9ubHk6IHRydWVgXG4gICAgLy8gICAgICgjMTY2NikuXG4gICAgLy8gXHUyNkQ0IE5laXRoZXIgbWVjaGFuaXNtIG5lZWRzIGNoYW5naW5nLCBhbmQgbmVpdGhlciBpcyBhIHN1YnN0aXR1dGUgZm9yIHRoZVxuICAgIC8vIG90aGVyOiBkcm9wcGluZyB0aGlzIGFsbG93LWxpc3QgcmUtbG9ja3MgaW4tZmxpZ2h0IGFwcHJvdmFscywgYW5kIHRoZVxuICAgIC8vIHJlYWRvbmx5IGRlY2xhcmF0aW9uIGlzIHdoYXQga2VlcHMgYSBoYW5kLWVkaXQgb3V0LiBNZWFzdXJlZCBpblxuICAgIC8vIGB0ZXN0L3JlYWRvbmx5LXdyaXRlLXNlbWFudGljcy50ZXN0LnRzYCBhbmQgcGlubmVkIGZvciB0aGVzZSB0d28gY29sdW1uc1xuICAgIC8vIGluIGB0ZXN0L2F1ZGl0LXN0YW1wLXJlYWRvbmx5LnRlc3QudHNgLlxuICAgIC8vIGBzdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1c2AgYW5kIGByZXF1ZXN0ZWRfc3RhdHVzYCBqb2luIHRoZVxuICAgIC8vIGFsbG93LWxpc3QgZm9yIHRoZSBzYW1lIHJlYXNvbiBhbmQgYnkgdGhlIHNhbWUgbWVjaGFuaXNtOiB0aGUgUkVRLTAwMDZcbiAgICAvLyBnYXRlJ3MgZmxvdyBzdGFtcHMgaXRzIHZlcmRpY3QgYW5kIGNsZWFycyB0aGUgcmVxdWVzdCBBRlRFUiB0aGUgZGVhbCBoYXNcbiAgICAvLyByZWFjaGVkIGEgY2xvc2VkIHN0YWdlLCBhbmQgZWxldmF0aW9uIGlzIG5vdCBhbm9ueW1pdHkgXHUyMDE0IHRoZSBmcmVlemVcbiAgICAvLyBndWFyZCBiZWxvdyB3b3VsZCBqdWRnZSB0aG9zZSB3cml0ZXMgYXMgdXNlciBlZGl0cyBvbiBhIGNsb3NlZCByZWNvcmRcbiAgICAvLyBhbmQgcmUtbG9jayBhbiBpbi1mbGlnaHQgYXBwcm92YWwuXG4gICAgLy8gYHF1YWxpZmljYXRpb25fYXBwcm92YWxfc3RhdHVzYCBhbmQgYHF1YWxpZmljYXRpb25fcmVxdWVzdGVkYCAodGhlXG4gICAgLy8gUkVRLTAwMDYgc3RlcC0xMSBcdTdBQ0JcdTk4NzkgZ2F0ZSkgam9pbiBmb3IgdGhlIHNhbWUgcmVhc29uIGFuZCBieSB0aGUgc2FtZVxuICAgIC8vIG1lY2hhbmlzbS4gVGhlaXIgZmxvdyBzdGFtcHMgdGhlIHZlcmRpY3QsIGFuZCBvbiBhIHJlamVjdGlvbiBjbGVhcnMgdGhlXG4gICAgLy8gcmVxdWVzdCwgdW5kZXIgdGhlIHRyaWdnZXJpbmcgdXNlcjsgYSBkZWFsIGEgd3JpdGUgdGhpcyBob29rIGRvZXMgbm90XG4gICAgLy8ganVkZ2UgKGEgc3lzdGVtIHdyaXRlLCBubyB1c2VyKSBjbG9zZWQgd2hpbGUgdGhlIFx1N0FDQlx1OTg3OSByZXF1ZXN0IHdhcyBvcGVuXG4gICAgLy8gd291bGQgb3RoZXJ3aXNlIHJlZnVzZSB0aGF0IHN0YW1wIGFuZCBsZWF2ZSB0aGUgYXBwcm92YWwgZGVjaWRlZCBidXRcbiAgICAvLyBuZXZlciByZWNvcmRlZC5cbiAgICBjb25zdCBBUFBST1ZBTF9GSUVMRFMgPSBuZXcgU2V0KFtcbiAgICAgICdhcHByb3ZhbF9zdGF0dXMnLCAnYXBwcm92ZWRfZGF0ZScsXG4gICAgICAnc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXMnLCAncmVxdWVzdGVkX3N0YXR1cycsXG4gICAgICAncXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXMnLCAncXVhbGlmaWNhdGlvbl9yZXF1ZXN0ZWQnLFxuICAgIF0pO1xuICAgIC8vIFN0YWdlIFx1MjE5MiBmb3JlY2FzdCBjYXRlZ29yeS5cbiAgICBjb25zdCBTVEFHRV9GT1JFQ0FTVDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIHByb3NwZWN0aW5nOiAncGlwZWxpbmUnLFxuICAgICAgcXVhbGlmaWNhdGlvbjogJ3BpcGVsaW5lJyxcbiAgICAgIG5lZWRzX2FuYWx5c2lzOiAnYmVzdF9jYXNlJyxcbiAgICAgIHByb3Bvc2FsOiAnY29tbWl0JyxcbiAgICAgIG5lZ290aWF0aW9uOiAnY29tbWl0JyxcbiAgICAgIGNsb3NlZF93b246ICdjbG9zZWQnLFxuICAgICAgY2xvc2VkX2xvc3Q6ICdvbWl0dGVkJyxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBldmVudCwgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcblxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBcdTdBQ0JcdTk4NzkgKHF1YWxpZmljYXRpb24pIGdhdGUgKFJFUS0wMDA2IHN0ZXAgMTEpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gXHUzMDBDXHU2NUIwXHU1ODlFXHU1NTQ2XHU2NzNBXHU1M0VGXHU4RERGXHU4RkRCXHVGRjBDXHU3QUNCXHU5ODc5XHU5MDFBXHU4RkM3XHU1NDBFXHU2NUI5XHU1M0VGXHU2NkY0XHU2NUIwXHU5NjM2XHU2QkI1XHUzMDAxXHU2Mjk1XHU2ODA3XHUzMDAxXHU4RDYyXHU0RTIyXHU1MzU1XHU2NENEXHU0RjVDXHUzMDAyXHUzMDBEIFVudGlsIFx1N0FDQlx1OTg3OSBpc1xuICAgIC8vIGFwcHJvdmVkLCB0d28gYWN0cyBhcmUgcmVmdXNlZCBhbmQgZXZlcnkgb3RoZXIgZWRpdCBzdGF5cyBvcGVuOlxuICAgIC8vICAgXHUyMDIyIGFueSBjaGFuZ2Ugb2YgYHN0YWdlYCBcdTIwMTQgXHU2NkY0XHU2NUIwXHU5NjM2XHU2QkI1LCB3aGljaCBpbmNsdWRlcyBhIGRpcmVjdCBjbG9zZVxuICAgIC8vICAgICAoXHU4RDYyXHU0RTIyXHU1MzU1KTtcbiAgICAvLyAgIFx1MjAyMiBhIE5FVyBgcmVxdWVzdGVkX3N0YXR1c2AgXHUyMDE0IHRoZSB3b24vbG9zdCByZXF1ZXN0IChcdThENjJcdTRFMjJcdTUzNTUpIHRoZSBzdGVwLTE0XG4gICAgLy8gICAgIGdhdGUgb3BlbnMuIFNvIHdpdGggYm90aCBnYXRlcyBhcm1lZCBcdTdBQ0JcdTk4NzkgY29tZXMgRklSU1Q6IGFuIHVucXVhbGlmaWVkXG4gICAgLy8gICAgIGRlYWwgY2Fubm90IGV2ZW4gYXNrIGZvciBhIHN0YXR1cyBjaGFuZ2UuXG4gICAgLy8gYHdpbGxfYmlkYCAoXHU2NjJGXHU1NDI2XHU2Mjk1XHU2ODA3KSBpcyBkZWxpYmVyYXRlbHkgTk9UIGhlbGQgKCMyMDA0LCBydWxlZCk6IHN0ZXAgOCBoYXNcbiAgICAvLyB0aGUgcmVwIGZpbGwgaXQgYXMgSU5QVVQgdG8gXHU3QUNCXHU5ODc5LCBmb3IgdGhlIGFwcHJvdmVyIHRvIHJlYWQsIHNvIGhvbGRpbmcgaXRcbiAgICAvLyB1bnRpbCBhcHByb3ZhbCB3b3VsZCBoYXZlIHRoZSBhcHByb3ZlciBkZWNpZGUgd2l0aG91dCBpdC4gU3RlcCAxMSdzIFx1NjI5NVx1NjgwN1xuICAgIC8vIGlzIHRoZSBhY3Qgb2YgYmlkZGluZywgd2hpY2ggSG90Q1JNIGRvZXMgbm90IG1vZGVsLlxuICAgIC8vIEJ1aWx0IG9uIHRoZSBzdGVwLTE0IGdhdGUgYmVsb3cgYW5kIGRlbGliZXJhdGVseSB0aGUgc2FtZSBpbiBldmVyeVxuICAgIC8vIGxvYWQtYmVhcmluZyB0ZXJtOlxuICAgIC8vICAgXHUyMDIyIGEgVFJBTlNJVElPTiBHQVRFLCBub3QgYW4gaW52YXJpYW50IChBR0VOVFMubWQgbWV0YWRhdGEgc2VtYW50aWNzXG4gICAgLy8gICAgIHJ1bGUgNykgXHUyMDE0IGluZXJ0IHVubGVzcyB0aGUgaW5zdGFsbCBhcm1zIGl0LCBzaW5jZVxuICAgIC8vICAgICBgcXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXNgIHNoaXBzIGBub3RfcmVxdWlyZWRgO1xuICAgIC8vICAgXHUyMDIyIHRoZSB2ZXJkaWN0IGlzIHJlYWQgSU5QVVQtRklSU1QsIHNvIGEgd3JpdGUgdGhhdCBjYXJyaWVzIHRoZVxuICAgIC8vICAgICBhcHByb3ZlZCB2ZXJkaWN0IGlzIGp1ZGdlZCBhcyBhcHByb3ZlZC4gVGhpcyBnYXRlJ3Mgb3duIGZsb3cgd3JpdGVzXG4gICAgLy8gICAgIG9ubHkgdGhlIHZlcmRpY3QgKGFuZCBvbiBhIHJlamVjdGlvbiB0aGUgcmVxdWVzdCksIHNvIGl0IG5ldmVyIG5lZWRzXG4gICAgLy8gICAgIHRoYXQ7IGl0IGtlZXBzIHRoZSBzaWJsaW5nJ3MgcmVhZGluZywgYW5kIGEgaGFuZC1zdXBwbGllZCB2ZXJkaWN0IGlzXG4gICAgLy8gICAgIHN0cmlwcGVkIGJlZm9yZSB0aGlzIGhvb2sgcnVucyAoc2VlIHRoZSBmaWVsZCk7XG4gICAgLy8gICBcdTIwMjIgYHJlamVjdGVkYCByZWZ1c2VzIGFzIGBwZW5kaW5nYCBkb2VzIFx1MjAxNCBhbiBhcHByb3ZlcidzIFwibm9cIiBpcyBub3QgYVxuICAgIC8vICAgICByZWxlYXNlOyB0aGUgd2F5IG9uIGlzIGEgbmV3IHJlcXVlc3Q7XG4gICAgLy8gICBcdTIwMjIgVVNFUiB3cml0ZXMgb25seSAoYGN0eC51c2VyPy5pZGApLCB0aGUgYm91bmRhcnkgYm90aCBvdGhlciBndWFyZHMgaW5cbiAgICAvLyAgICAgdGhpcyBob29rIGRyYXc7XG4gICAgLy8gICBcdTIwMjIgUkVDT1JEX0xPQ0tFRCAvIDQwOSAoYFJFRlVTQUxfQ09ERVMubG9ja2VkYCkuXG4gICAgLy8gSXQgc2l0cyBBQk9WRSB0aGUgc3RlcC0xNCBibG9jayBzbyBhbiB1bnF1YWxpZmllZCBkZWFsJ3MgZGlyZWN0IGNsb3NlXG4gICAgLy8gbmFtZXMgdGhlIGdhdGUgdGhhdCBjb21lcyBmaXJzdC5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBCT1VOREFSWSwgcmVjb3JkZWQgcmF0aGVyIHRoYW4gaGlkZGVuOiBgYmVmb3JlSW5zZXJ0YCBpcyBub3QganVkZ2VkLlxuICAgIC8vIENyZWF0aW5nIGEgZGVhbCBpcyBcdTY1QjBcdTU4OUVcdTU1NDZcdTY3M0EsIHdoaWNoIHN0ZXAgMTEgbGVhdmVzIG9wZW4gKHN0ZXAgOCBoYXMgdGhlIHJlcFxuICAgIC8vIGZpbGwgXHU2NjJGXHU1NDI2XHU2Mjk1XHU2ODA3IG9uIHRoZSBuZXctZGVhbCBmb3JtKSBcdTIwMTQgdGhlIGxpbmUgdGhlIHN0ZXAtMTQgZ2F0ZSBkcmF3cyB0b28uXG4gICAgaWYgKGV2ZW50ID09PSAnYmVmb3JlVXBkYXRlJyAmJiBwcmV2aW91cyAmJiBjdHgudXNlcj8uaWQpIHtcbiAgICAgIGNvbnN0IHF1YWxpZmljYXRpb24gPSAoaW5wdXQucXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXMgPz8gcHJldmlvdXMucXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXMpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChxdWFsaWZpY2F0aW9uID09PSAncGVuZGluZycgfHwgcXVhbGlmaWNhdGlvbiA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICBjb25zdCBoZWxkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0LnN0YWdlID09PSAnc3RyaW5nJyAmJiBpbnB1dC5zdGFnZSAhPT0gcHJldmlvdXMuc3RhZ2UpIGhlbGQucHVzaCgnU3RhZ2UnKTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dC5yZXF1ZXN0ZWRfc3RhdHVzID09PSAnc3RyaW5nJyAmJiBpbnB1dC5yZXF1ZXN0ZWRfc3RhdHVzICE9PSAnJyAmJiBpbnB1dC5yZXF1ZXN0ZWRfc3RhdHVzICE9PSBwcmV2aW91cy5yZXF1ZXN0ZWRfc3RhdHVzKSB7XG4gICAgICAgICAgaGVsZC5wdXNoKCdSZXF1ZXN0ZWQgU3RhdHVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlbGQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRocm93IHJlZnVzZShcbiAgICAgICAgICAgIGBUaGlzIGRlYWwgbmVlZHMgcXVhbGlmaWNhdGlvbiBhcHByb3ZhbCBmaXJzdDogdGljayBSZXF1ZXN0IFF1YWxpZmljYXRpb24gQXBwcm92YWwuICR7aGVsZC5qb2luKCcgYW5kICcpfSBjYW4gY2hhbmdlIG9uY2UgaXQgaXMgYXBwcm92ZWQuYCxcbiAgICAgICAgICAgICdSRUNPUkRfTE9DS0VEJyxcbiAgICAgICAgICAgIDQwOSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFN0YXR1cy1jaGFuZ2UgZ2F0ZSAoUkVRLTAwMDYgc3RlcHMgMTMtMTQpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gQSBUUkFOU0lUSU9OIEdBVEUsIG5vdCBhbiBpbnZhcmlhbnQgKEFHRU5UUy5tZCBtZXRhZGF0YSBzZW1hbnRpY3MgcnVsZVxuICAgIC8vIDcpOiBpdCByZWZ1c2VzIHRoZSBuZXh0IG1vdmUsIGFuZCBldmVyeSBkZWFsIGFscmVhZHkgc2l0dGluZyBpbiBhIGNsb3NlZFxuICAgIC8vIHN0YWdlIGtlZXBzIGl0LiBJbmVydCB1bmxlc3MgdGhlIGluc3RhbGwgYXJtcyB0aGUgZ2F0ZSBcdTIwMTQgc2hpcHBlZCxcbiAgICAvLyBgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXNgIGRlZmF1bHRzIHRvIGBub3RfcmVxdWlyZWRgIGFuZCB0aGlzXG4gICAgLy8gY29uZGl0aW9uIGlzIGZhbHNlIGZvciBldmVyeSByZWNvcmQgdGhhdCBoYXMgZXZlciBleGlzdGVkLCB3aGljaCBpcyB3aGF0XG4gICAgLy8ga2VlcHMgUkVRLTAwMDYgYWNjZXB0YW5jZSAzJ3MgXCJiaXQtZm9yLWJpdCB3aGF0IGl0IGlzIHRvZGF5XCIgdHJ1ZS5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBUaGUgZ2F0ZSB2YWx1ZSBpcyByZWFkIElOUFVULUZJUlNULCBhbmQgdGhhdCBpcyBsb2FkLWJlYXJpbmcuIFRoZVxuICAgIC8vIGFwcHJvdmluZyBmbG93IHdyaXRlcyBgc3RhZ2VgIGFuZCBgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXM6XG4gICAgLy8gJ2FwcHJvdmVkJ2AgaW4gT05FIHBheWxvYWQ7IHJlYWRpbmcgYHByZXZpb3VzYCBmaXJzdCB3b3VsZCBzZWUgYHBlbmRpbmdgXG4gICAgLy8gYW5kIHJlZnVzZSB0aGUgZmxvdydzIG93biB3cml0ZS4gYHJ1bkFzOiAnc3lzdGVtJ2AgZG9lcyBub3QgaGVscCBcdTIwMTRcbiAgICAvLyBlbGV2YXRpb24gaXMgbm90IGFub255bWl0eSwgc28gYGN0eC51c2VyPy5pZGAgaXMgcHJlc2VudCBpbiB0aGF0IHJ1blxuICAgIC8vIGV4YWN0bHkgYXMgdGhlIEFQUFJPVkFMX0ZJRUxEUyBub3RlIGFib3ZlIHJlY29yZHMuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgYHJlamVjdGVkYCByZWZ1c2VzIHRvbywgZXhhY3RseSBhcyBgbGVhZF9hdXRvbWF0aW9uYCByZWZ1c2VzIGFcbiAgICAvLyBjb252ZXJzaW9uIGluIGJvdGggYHBlbmRpbmdgIGFuZCBgcmVqZWN0ZWRgLiBBbiBhcHByb3ZlcidzIFwibm9cIiBpcyBub3QgYVxuICAgIC8vIHJlbGVhc2U6IGlmIG9ubHkgYHBlbmRpbmdgIHJlZnVzZWQsIGEgc2luZ2xlIHJlamVjdGlvbiB3b3VsZCBkaXNhcm0gdGhlXG4gICAgLy8gZ2F0ZSBvbiB0aGF0IGRlYWwgZm9yIGdvb2QsIGFuZCB0aGUgcmVwIGNvdWxkIHRoZW4gY2xvc2UgaXQgZGlyZWN0bHkgd2l0aFxuICAgIC8vIG5vIGFwcHJvdmFsIGF0IGFsbC4gRnJvbSBgcmVqZWN0ZWRgIHRoZSB3YXkgZm9yd2FyZCBpcyBhIE5FVyByZXF1ZXN0IFx1MjAxNCB0aGVcbiAgICAvLyBmbG93J3Mgc3RhcnQgY29uZGl0aW9uIHJlLW9wZW5zIG9uIGl0IFx1MjAxNCBuZXZlciBhIGRpcmVjdCBzdGFnZSB3cml0ZS5cbiAgICAvL1xuICAgIC8vIFJFQ09SRF9MT0NLRUQgLyA0MDkgKGBSRUZVU0FMX0NPREVTLmxvY2tlZGApOiB3aGlsZSB0aGUgZ2F0ZSBob2xkcywgdGhlXG4gICAgLy8gZGVhbCdzIG93biBzdGF0ZSBmcmVlemVzIGBzdGFnZWAgYWdhaW5zdCBhIG1vdmUgaW50byBhIGNsb3NlZCBzdGFnZSBcdTIwMTQgdGhlXG4gICAgLy8gc2FtZSBjbGFzcyB0aGUgbGVhZCBzaWJsaW5nIGFuc3dlcnMgd2l0aC5cbiAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIHByZXZpb3VzICYmIGN0eC51c2VyPy5pZCkge1xuICAgICAgY29uc3QgZ2F0ZSA9IChpbnB1dC5zdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1cyA/PyBwcmV2aW91cy5zdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1cykgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgbmV4dCA9IGlucHV0LnN0YWdlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGNsb3NpbmcgPSAobmV4dCA9PT0gJ2Nsb3NlZF93b24nIHx8IG5leHQgPT09ICdjbG9zZWRfbG9zdCcpICYmIG5leHQgIT09IHByZXZpb3VzLnN0YWdlO1xuICAgICAgaWYgKGNsb3NpbmcgJiYgKGdhdGUgPT09ICdwZW5kaW5nJyB8fCBnYXRlID09PSAncmVqZWN0ZWQnKSkge1xuICAgICAgICB0aHJvdyByZWZ1c2UoXG4gICAgICAgICAgJ1RoaXMgZGVhbFxcJ3Mgc3RhdHVzIGNoYW5nZSBuZWVkcyBhcHByb3ZhbDogc2V0IFJlcXVlc3RlZCBTdGF0dXMgKGFuZCB0aGUgd2luL2xvc3MgcmVhc29uKSBpbnN0ZWFkLiBUaGUgc3RhZ2UgdGFrZXMgZWZmZWN0IHdoZW4gdGhlIHJlcXVlc3QgaXMgYXBwcm92ZWQuJyxcbiAgICAgICAgICAnUkVDT1JEX0xPQ0tFRCcsXG4gICAgICAgICAgNDA5LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZyZWV6ZSBjbG9zZWQgb3Bwb3J0dW5pdGllcyBcdTIwMTQgYnV0IGd1YXJkIE9OTFkgZ2VudWluZSBVU0VSIGVkaXRzLiBBIHdyaXRlXG4gICAgLy8gd2l0aCBubyBhdXRoZW50aWNhdGVkIHVzZXIgKGBjdHgudXNlcj8uaWRgIGFic2VudCkgaXMgYSBzeXN0ZW0gLyBzZWVkIC9cbiAgICAvLyBiYWNrZmlsbCB3cml0ZSBhbmQgbXVzdCBwYXNzOiB0aGUgc2VlZCdzIGBjbG9zZV9kYXRlOiBkYXlzQWdvKDE1KWBcbiAgICAvLyByZS1ldmFsdWF0ZXMgdG8gYSBuZXcgZGF0ZSBvbiBldmVyeSByZWJvb3QsIHNvIGEgcmUtc2VlZCBsZWdpdGltYXRlbHlcbiAgICAvLyBjaGFuZ2VzIGNsb3NlX2RhdGUgb24gYWxyZWFkeS1jbG9zZWQgb3Bwcy4gR3VhcmRpbmcgdGhvc2UgdGhyZXcgMjNcbiAgICAvLyBib290LXRpbWUgQm9keVJ1bm5lciBlcnJvcnMgQU5EIGJsb2NrZWQgdGhlIHNlZWQgZnJvbSBjb3JyZWN0aW5nXG4gICAgLy8gY2xvc2VkLXdvbiBgcHJvYmFiaWxpdHlgIHRvIDEwMCAoIzQ1OSkuIGBjdHgudXNlcj8uaWRgIGlzIHRoaXMgcmVwbydzXG4gICAgLy8gc3lzdGVtLXdyaXRlIHNpZ25hbCAoY2YuIGNhc2UvbGVhZC9xdW90ZSBob29rcykgYW5kIG1hdGNoZXMgdGhlXG4gICAgLy8gU1lTVEVNX0ZJRUxEUyBpbnRlbnQgYWJvdmUgKFwib25seSB1c2VyIGVkaXRzIHRvIGJ1c2luZXNzIGZpZWxkc1wiKS5cbiAgICAvLyBTdGlsbCBydW5zIGJlZm9yZSB0aGUgZGVyaXZlZC1maWVsZCByZWNvbXB1dGUgYmVsb3cgc28gYSBnZW51aW5lIHVzZXJcbiAgICAvLyBlZGl0IGlzIGp1ZGdlZCBvbiB0aGUgY2FsbGVyJ3Mgb3duIGZpZWxkcywgbm90IGluamVjdGVkIG9uZXMuXG4gICAgaWYgKGV2ZW50ID09PSAnYmVmb3JlVXBkYXRlJyAmJiBwcmV2aW91cyAmJiBjdHgudXNlcj8uaWQpIHtcbiAgICAgIGNvbnN0IHByZXZTdGFnZSA9IHByZXZpb3VzLnN0YWdlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGlzQ2xvc2VkID0gcHJldlN0YWdlID09PSAnY2xvc2VkX3dvbicgfHwgcHJldlN0YWdlID09PSAnY2xvc2VkX2xvc3QnO1xuICAgICAgaWYgKGlzQ2xvc2VkKSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGluZyA9IE9iamVjdC5rZXlzKGlucHV0KS5maWx0ZXIoXG4gICAgICAgICAgKGspID0+ICFOQVJSQVRJVkVfRklFTERTLmhhcyhrKSAmJiAhU1lTVEVNX0ZJRUxEUy5oYXMoaykgJiYgIUFQUFJPVkFMX0ZJRUxEUy5oYXMoaykgJiYgaW5wdXRba10gIT09IHByZXZpb3VzW2tdLFxuICAgICAgICApO1xuICAgICAgICBpZiAodmlvbGF0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBFdmVyeSBsb29rdXAgb24gYGNybV9vcHBvcnR1bml0eWAgYSByZWZlcmVudGlhbCBjbGVhciBjYW4gYXR0YWNrLlxuICAgICAgICAgIGNvbnN0IFJFRkVSRU5DRV9GSUVMRFMgPSBuZXcgU2V0KFsnY3JtX2FjY291bnQnLCAncHJpbWFyeV9jb250YWN0JywgJ2NybV9jYW1wYWlnbiddKTtcbiAgICAgICAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgdGhlIHJlZmVyZW5jZS1jbGVhbnVwIHlpZWxkIFx1MjUwMFx1MjUwMFxuICAgICAgICAgIC8vICM3MjAuIFRoZSBlbmdpbmUgaW1wbGVtZW50cyBgZGVsZXRlQmVoYXZpb3I6ICdzZXRfbnVsbCdgIGJ5IFVQREFUSU5HXG4gICAgICAgICAgLy8gdGhlIHJvdyB0aGF0IEhPTERTIHRoZSBsb29rdXAsIHNvIGRlbGV0aW5nIGEgY29udGFjdCBvciBhIGNhbXBhaWduIGFcbiAgICAgICAgICAvLyBDTE9TRUQgb3Bwb3J0dW5pdHkgcmVmZXJlbmNlcyBhcnJpdmVzIGhlcmUgYXMgYW4gb3JkaW5hcnkgdXNlclxuICAgICAgICAgIC8vIGBiZWZvcmVVcGRhdGVgIFx1MjAxNCBhbmQgdGhpcyBmcmVlemUgcmVmdXNlZCBpdCwgd2hpY2ggbWFkZSB0aGUgZnJvemVuXG4gICAgICAgICAgLy8gb3Bwb3J0dW5pdHkgYWJsZSB0byBrZWVwIGEgcGVyc29uIHVuZGVsZXRhYmxlIGZvcmV2ZXIgKGFuZCwgdGhyb3VnaFxuICAgICAgICAgIC8vIHRoZSBtYXN0ZXItZGV0YWlsIGNhc2NhZGUsIHRoYXQgcGVyc29uJ3MgYWNjb3VudCB0b28gXHUyMDE0IGEgR0RQUlxuICAgICAgICAgIC8vIGVyYXN1cmUgdGhhdCBjYW5ub3QgYmUgY2FycmllZCBvdXQpLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gTWVhc3VyZWQgb24gMTcuMS4wIFx1MjAxNCB0aGUgdmVyc2lvbiB0aGlzIHJlcG8gcGlubmVkIEFUIFRIRSBUSU1FIG9mXG4gICAgICAgICAgLy8gdGhlIG1lYXN1cmVtZW50LCBub3QgdGhlIGN1cnJlbnQgcGluICh0aGUgY2FzY2FkZSBzaGFwZSBiZWxvdyBoYXNcbiAgICAgICAgICAvLyBOT1QgYmVlbiByZS1tZWFzdXJlZCBvbiBhbnkgbGF0ZXIgcGluIFx1MjAxNCBub3QgMTcuMy4wLCAjMTY3Niwgbm90XG4gICAgICAgICAgLy8gMTcuNC4wLCBQUiAjMTgxNCwgYW5kIG5vdCAxNy41LjApIFx1MjAxNCB3aXRoIGEgcHJvYmUgaG9vayBhdCBwcmlvcml0eSAxOTkgaW1tZWRpYXRlbHlcbiAgICAgICAgICAvLyBhaGVhZCBvZiBlYWNoIGd1YXJkLCBub3QgYXNzdW1lZC5cbiAgICAgICAgICAvLyBUaGUgZW5naW5lIGJ1aWxkcyBpdHMgY2xlYW51cCB3cml0ZSBvbiB0aGUgQ0FMTEVSJ3Mgb3duIGNvbnRleHRcbiAgICAgICAgICAvLyBwbHVzIHR3byBlbmdpbmUga2V5cywgc28gb24gdGhlIHBhdGggYSBSRVNUIGBERUxFVEVgIHRha2VzLCB0aGVcbiAgICAgICAgICAvLyBjYXNjYWRlIGFuZCBhIHVzZXIncyBoYW5kLWNsZWFyIG9mIHRoZSBzYW1lIGxvb2t1cCBhcmUgaWRlbnRpY2FsXG4gICAgICAgICAgLy8gZXZlcnl3aGVyZSBhIGd1YXJkIGNhbiBsb29rOiBwYXlsb2FkXG4gICAgICAgICAgLy8gYHsgaWQsIDxsaW5rPjogbnVsbCwgdXBkYXRlZF9hdCwgdXBkYXRlZF9ieSB9YCwgYGN0eC51c2VyYCB0aGVcbiAgICAgICAgICAvLyBDQUxMRVIsIGBjdHguc2Vzc2lvbmAgdGhlIGNhbGxlcidzIG93biBgeyB1c2VySWQsIGlzU3lzdGVtIH1gLlxuICAgICAgICAgIC8vIChCb3RoIGB1cGRhdGVkX2J5YCBhbmQgdGhlIGlkZW50aXR5IGRyb3Agb3V0IHRvZ2V0aGVyIHdoZW4gdGhlXG4gICAgICAgICAgLy8gREVMRVRFIGl0c2VsZiBjYXJyaWVkIG5vIGB1c2VySWRgIFx1MjAxNCBhIHJpZyBhcnRlZmFjdCwgbm90IHRoaXMgYXBwJ3NcbiAgICAgICAgICAvLyBwYXRoLikgU28gdGhlIFdSSVRFIFNIQVBFIGlzIG5vdCBhIGRpc2NyaW1pbmF0b3IsIGFuZCB0aGUgeWllbGRcbiAgICAgICAgICAvLyBiZWxvdyBpcyBub3Qgb25lIGVpdGhlcjogaXQgbGV0cyBBTlkgY2FsbGVyIGNsZWFyIGEgZGVjbGFyZWQgbGlua1xuICAgICAgICAgIC8vIG9uIGEgc2V0dGxlZCByZWNvcmQuIFRoYXQgaXMgdGhlIHRyYWRlICM3MjAgYWNjZXB0ZWQsIG5vdCBhIHNpZGVcbiAgICAgICAgICAvLyBlZmZlY3Qgb2YgaXQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBcdTI2QTBcdUZFMEYgQSBtYXJrZXIgRE9FUyByZWFjaCBhIGhvb2sgXHUyMDE0IGFuZCBpcyBkZWxpYmVyYXRlbHkgbm90IHJlYWQuIEFuXG4gICAgICAgICAgLy8gZWFybGllciB2ZXJzaW9uIG9mIHRoaXMgbm90ZSBjb25jbHVkZWQgXCJubyBtYXJrZXIgcmVhY2hlcyBhIGhvb2ssXG4gICAgICAgICAgLy8gYW5kIHRoZSBXUklURSBTSEFQRSBpcyB0aGUgb25seSBldmlkZW5jZSB0aGVyZSBpc1wiOyBpdCByZWFzb25lZFxuICAgICAgICAgIC8vIG9ubHkgYWJvdXQgYGN0eC5zZXNzaW9uYCwgd2hvc2UgYWxsb3ctbGlzdCByZWFsbHkgZG9lcyBvbWl0XG4gICAgICAgICAgLy8gYF9fYC1wcmVmaXhlZCBvcGVyYXRpb24tcHJpdmF0ZSBrZXlzLCBhbmQgbWlzc2VkIHRoZSBvdGhlciByb3V0ZVxuICAgICAgICAgIC8vIGludG8gdGhlIGNvbnRleHQuIGBPYmplY3RRTC5jYXNjYWRlRGVsZXRlUmVsYXRpb25zYCBidWlsZHNcbiAgICAgICAgICAvLyBgeyAuLi5jb250ZXh0LCBfX3JlZmVyZW50aWFsRmllbGRDbGVhcjogdHJ1ZSB9YCwgcmVhZGFibGUgYXRcbiAgICAgICAgICAvLyBgY3R4LmFwaS5leGVjdXRpb25Db250ZXh0Ll9fcmVmZXJlbnRpYWxGaWVsZENsZWFyYDogbWVhc3VyZWQgYHRydWVgXG4gICAgICAgICAgLy8gb24gZXZlcnkgY2FzY2FkZSBpbnRvIGBjcm1fb3Bwb3J0dW5pdHlgLCBgY3JtX3F1b3RlYCBhbmRcbiAgICAgICAgICAvLyBgY3JtX2xlYWRgLCBgdW5kZWZpbmVkYCBvbiBldmVyeSBoYW5kLWNsZWFyICgjMTE2NSwgIzE0MTIpLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gXHUyNkQ0IFRoZSAjMTE2NSBydWxpbmcgKDIwMjYtMDgtMjUpIHJldmlld2VkIHRoYXQgYW5kIHVwaGVsZCBOT1RcbiAgICAgICAgICAvLyByZWFkaW5nIGl0LCBvbiB0d28gZ3JvdW5kcy4gSXQgaXMgYW4gb3BlcmF0aW9uLXByaXZhdGUga2V5IFx1MjAxNCBhblxuICAgICAgICAgIC8vIHVuZGVjbGFyZWQgZGVwZW5kZW5jeSB0aGF0IGNhbiB2YW5pc2ggaW4gYSBwYXRjaCByZWxlYXNlLiBBbmRcbiAgICAgICAgICAvLyByZWFjaGFiaWxpdHkgdGhyb3VnaCB0aGUgU0hJUFBFRCBwYXRoIGlzIHVucHJvdmVuOiBhIGhvb2sgYm9keSBydW5zXG4gICAgICAgICAgLy8gYm9keS1vbmx5IGluIFF1aWNrSlMsIHdoZXJlIGBidWlsZFNhbmRib3hBcGlgIHBhc3NlcyBgZW5naW5lQ3R4LmFwaWBcbiAgICAgICAgICAvLyBvbmx5IHdoZW4gdGhhdCBleHBvc2VzIGBvYmplY3QoKWAsIGFuZCBvdGhlcndpc2UgYSBzaGltIHdpdGggbm9cbiAgICAgICAgICAvLyBgZXhlY3V0aW9uQ29udGV4dGAgYXQgYWxsLiBHcmVlbiBpbiBhIGtlcm5lbCByaWcgYW5kIHNpbGVudGx5IGZhbHNlXG4gICAgICAgICAgLy8gaW4gcHJvZHVjdGlvbiBpcyB0aGUgd29yc3Qgb3V0Y29tZSBhIGd1YXJkIGNhbiBoYXZlLiBUaGUgZGVjbGFyZWRcbiAgICAgICAgICAvLyByZXBsYWNlbWVudCBgY3R4LnJlZmVyZW50aWFsRmllbGRDbGVhcmAgaXMgYXNrZWQgZm9yIHVwc3RyZWFtIGFzXG4gICAgICAgICAgLy8gb2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjMTM2NDQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBcdTI2RDQgS2VlcCB0aGlzIG5hcnJvdyAobWFpbnRhaW5lcidzIHJ1bGluZyBvbiAjNzIwLCBPcHRpb24gQSk6IGEgd3JpdGVcbiAgICAgICAgICAvLyB5aWVsZHMgT05MWSB3aGVuIGV2ZXJ5IG9uZSBvZiBpdHMgbm9uLXN5c3RlbSBjaGFuZ2VzIGlzIGEgREVDTEFSRURcbiAgICAgICAgICAvLyBsaW5rIGdvaW5nIGZyb20gYSB2YWx1ZSB0byBgbnVsbGAuIE9uZSBidXNpbmVzcyBmaWVsZCBhbG9uZ3NpZGUgaXQsXG4gICAgICAgICAgLy8gb3IgYSBsaW5rIHJlcG9pbnRlZCB0byBhIE5FVyB2YWx1ZSwgYW5kIHRoZSByZWZ1c2FsIGJlbG93IHN0aWxsXG4gICAgICAgICAgLy8gZmlyZXMuIFRoZSB0aHJlZSBmcmVlemUgZ3VhcmRzIHNoYXJlIHRoaXMgYmxvY2sgdmVyYmF0aW0gXHUyMDE0IHNoYXJpbmdcbiAgICAgICAgICAvLyBpdCBhcyBhbiBpbXBvcnRlZCBoZWxwZXIgaXMgbm90IHBvc3NpYmxlIChob29rIGJvZGllcyBydW4gYm9keS1vbmx5XG4gICAgICAgICAgLy8gaW4gdGhlIHNhbmRib3ggYW5kIGNhbm5vdCByZWFjaCBtb2R1bGUgc2NvcGUpLCBzb1xuICAgICAgICAgIC8vIGB0ZXN0L2ZyZWV6ZS1ndWFyZC1yZWZlcmVuY2UtY2xlYW51cC50ZXN0LnRzYCBwaW5zIHRoZSB0aHJlZSBjb3BpZXNcbiAgICAgICAgICAvLyBhcyBpZGVudGljYWwgdGV4dCBhbmQgcGlucyBib3RoIGRpcmVjdGlvbnMgb2YgdGhlIG5hcnJvd25lc3MuXG4gICAgICAgICAgY29uc3QgaXNSZWZlcmVuY2VDbGVhbnVwID0gdmlvbGF0aW5nLmV2ZXJ5KFxuICAgICAgICAgICAgKGspID0+IFJFRkVSRU5DRV9GSUVMRFMuaGFzKGspICYmIGlucHV0W2tdID09PSBudWxsICYmIHByZXZpb3VzPy5ba10gIT0gbnVsbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChpc1JlZmVyZW5jZUNsZWFudXApIHJldHVybjtcblxuICAgICAgICAgIC8vIGBjcm1fb3Bwb3J0dW5pdHkubmFtZUZpZWxkYCBJUyBgbmFtZWAsIHNvIHRoZSBuYW1lIG9uIGl0cyBvd24gaXNcbiAgICAgICAgICAvLyBleGFjdGx5IGhvdyBldmVyeSBvdGhlciBzdXJmYWNlIHRpdGxlcyB0aGlzIHJlY29yZC4gXHUyNkQ0IE5ldmVyIGFwcGVuZFxuICAgICAgICAgIC8vIHRoZSByZWNvcmQgaWQgXHUyMDE0IGl0IG1hdGNoZXMgbm9uZSBvZiB0aGVtLlxuICAgICAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgcHJldmlvdXMubmFtZSA9PT0gJ3N0cmluZycgPyBwcmV2aW91cy5uYW1lLnRyaW0oKSA6ICcnO1xuICAgICAgICAgIGNvbnN0IHN1YmplY3QgPSBuYW1lID8gYE9wcG9ydHVuaXR5ICR7bmFtZX1gIDogJ09wcG9ydHVuaXR5JztcbiAgICAgICAgICB0aHJvdyByZWZ1c2UoXG4gICAgICAgICAgICBgJHtzdWJqZWN0fSBpcyBjbG9zZWQgKCR7cHJldlN0YWdlfSk7IG9ubHkgJHtbLi4uTkFSUkFUSVZFX0ZJRUxEU10uam9pbignLCAnKX0gbWF5IGJlIGVkaXRlZC4gQXR0ZW1wdGVkOiAke3Zpb2xhdGluZy5qb2luKCcsICcpfS5gLFxuICAgICAgICAgICAgJ1JFQ09SRF9MT0NLRUQnLFxuICAgICAgICAgICAgNDA5LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEMyBzdGFuZC1kb3duOiBhIHByZWRpY2F0ZSB1cGRhdGUgaGFzIE9ORSBwYXlsb2FkIGZvciBldmVyeSBtYXRjaGVkIHJvdyxcbiAgICAvLyBzbyB0aGUgYGN0eC5wcmV2aW91c2AtY29uZGl0aW9uZWQgcmVjb21wdXRlcyBiZWxvdyB3b3VsZCBsYW5kIG9uIHJvd3MgdGhhdFxuICAgIC8vIGRpZCBub3QgZWFybiB0aGVtIFx1MjAxNCByZWZ1c2VkIGFzIGEgZGl2ZXJnaW5nIGtleSBzZXQsIG9yIHN0b3JlZCBzaWxlbnRseVxuICAgIC8vIGZyb20gdGhlIGxhc3Qgcm93LiBGdWxsIGFjY291bnQgYW5kIHRoZSBtZWFzdXJlbWVudDogYGZvcmVjYXN0Lmhvb2sudHNgLlxuICAgIC8vIFRoZSBjbG9zZWQtcmVjb3JkIFJFRlVTQUwgYWJvdmUgZGVsaWJlcmF0ZWx5IHNpdHMgYmVmb3JlIHRoaXMgbGluZTpcbiAgICAvLyByZWFkaW5nIGBwcmV2aW91c2AgdG8gdGhyb3cgaXMgd2hhdCBEMyBzdXBwbGllcyBpdCBmb3IsIGFuZCBhIGJhdGNoIHRoYXRcbiAgICAvLyB0b3VjaGVzIGEgY2xvc2VkIGRlYWwgbXVzdCBzdGlsbCBiZSByZWZ1c2VkLlxuICAgIGlmIChjdHguZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIGN0eC5kaXNwYXRjaD8ubW9kZSA9PT0gJ3Blci1yb3cnKSByZXR1cm47XG5cbiAgICAvLyBSZWNvbXB1dGUgZXhwZWN0ZWRfcmV2ZW51ZVxuICAgIGNvbnN0IGFtb3VudCA9XG4gICAgICB0eXBlb2YgaW5wdXQuYW1vdW50ID09PSAnbnVtYmVyJ1xuICAgICAgICA/IGlucHV0LmFtb3VudFxuICAgICAgICA6IHR5cGVvZiBwcmV2aW91cz8uYW1vdW50ID09PSAnbnVtYmVyJ1xuICAgICAgICAgID8gKHByZXZpb3VzLmFtb3VudCBhcyBudW1iZXIpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3RhZ2UgPVxuICAgICAgdHlwZW9mIGlucHV0LnN0YWdlID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGlucHV0LnN0YWdlXG4gICAgICAgIDogdHlwZW9mIHByZXZpb3VzPy5zdGFnZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IChwcmV2aW91cy5zdGFnZSBhcyBzdHJpbmcpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBhbW91bnQgPT09ICdudW1iZXInICYmIHN0YWdlICYmIFNUQUdFX1BST0JBQklMSVRZW3N0YWdlXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbnB1dC5leHBlY3RlZF9yZXZlbnVlID0gTWF0aC5yb3VuZChhbW91bnQgKiBTVEFHRV9QUk9CQUJJTElUWVtzdGFnZV0pIC8gMTAwO1xuICAgIH1cbiAgICBpZiAoc3RhZ2UgJiYgU1RBR0VfUFJPQkFCSUxJVFlbc3RhZ2VdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEFsd2F5cyBzeW5jIHByb2JhYmlsaXR5IHdpdGggc3RhZ2UgKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggPSBzdGFnZSkuXG4gICAgICBpbnB1dC5wcm9iYWJpbGl0eSA9IFNUQUdFX1BST0JBQklMSVRZW3N0YWdlXTtcbiAgICB9XG4gICAgLy8gU3luYyBmb3JlY2FzdF9jYXRlZ29yeSB3aXRoIHN0YWdlIG9uIGluc2VydCBhbmQgd2hlbmV2ZXIgc3RhZ2UgY2hhbmdlcy5cbiAgICBpZiAoc3RhZ2UgJiYgU1RBR0VfRk9SRUNBU1Rbc3RhZ2VdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHN0YWdlQ2hhbmdlZCA9IGV2ZW50ID09PSAnYmVmb3JlSW5zZXJ0JyB8fCAodHlwZW9mIGlucHV0LnN0YWdlID09PSAnc3RyaW5nJyAmJiBpbnB1dC5zdGFnZSAhPT0gcHJldmlvdXM/LnN0YWdlKTtcbiAgICAgIGlmIChzdGFnZUNoYW5nZWQpIGlucHV0LmZvcmVjYXN0X2NhdGVnb3J5ID0gU1RBR0VfRk9SRUNBU1Rbc3RhZ2VdO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IHRoZSBzdGFnZS1hZ2UgY2xvY2sgYXQgY3JlYXRpb24uIFdpdGhvdXQgdGhpcyB0aGUgcm93IGxhbmRzIHdpdGggYVxuICAgIC8vIG51bGwgYHN0YWdlX2VudHJ5X2RhdGVgLCBgZGF5c19pbl9zdGFnZWAgcmVhZHMgbnVsbCBpbnN0ZWFkIG9mIDAsIGFuZCB0aGVcbiAgICAvLyBkZWFsIGlzIGludmlzaWJsZSB0byB0aGUgc3RhZ25hdGlvbiBzd2VlcCB1bnRpbCBpdHMgZmlyc3Qgc3RhZ2UgY2hhbmdlIFx1MjAxNFxuICAgIC8vIGV4YWN0bHkgYmFja3dhcmRzLCBzaW5jZSBhIGRlYWwgdGhhdCBuZXZlciBtb3ZlcyBpcyB0aGUgc3RhbGxlZCBvbmUuXG4gICAgaWYgKGV2ZW50ID09PSAnYmVmb3JlSW5zZXJ0JyAmJiAhaW5wdXQuc3RhZ2VfZW50cnlfZGF0ZSkge1xuICAgICAgaW5wdXQuc3RhZ2VfZW50cnlfZGF0ZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ID09PSAnYmVmb3JlVXBkYXRlJyAmJiBwcmV2aW91cykge1xuICAgICAgLy8gU3RhbXAgY2xvc2VfZGF0ZSB3aGVuIHRyYW5zaXRpb25pbmcgaW50byBjbG9zZWRfd29uXG4gICAgICBpZiAoaW5wdXQuc3RhZ2UgPT09ICdjbG9zZWRfd29uJyAmJiBwcmV2aW91cy5zdGFnZSAhPT0gJ2Nsb3NlZF93b24nICYmICFpbnB1dC5jbG9zZV9kYXRlKSB7XG4gICAgICAgIGlucHV0LmNsb3NlX2RhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApO1xuICAgICAgfVxuICAgICAgLy8gUmVzdGFydCB0aGUgc3RhZ2UtYWdlIGNsb2NrIG9uIGFueSBzdGFnZSBjaGFuZ2Ugc28gYSBkZWFsIHRoYXRcbiAgICAgIC8vIGFkdmFuY2VzIHN0b3BzIG1hdGNoaW5nIHRoZSBzdGFnbmF0aW9uIHN3ZWVwLiBgZGF5c19pbl9zdGFnZWAgaXMgYVxuICAgICAgLy8gZm9ybXVsYSBvdmVyIHRoaXMgY29sdW1uLCBzbyB0aGlzIG9uZSB3cml0ZSBJUyB0aGUgcmVzZXQgXHUyMDE0IGl0IHVzZWQgdG9cbiAgICAgIC8vIHNldCBgZGF5c19pbl9zdGFnZSA9IDBgIGFnYWluc3QgYSBjb3VudGVyIG5vdGhpbmcgZXZlciBpbmNyZW1lbnRlZC5cbiAgICAgIC8vIChSZWFkb25seSBmaWVsZHMgYXJlIHdyaXRhYmxlIGZyb20gYmVmb3JlLWhvb2tzIHZpYSBpbnB1dCBtdXRhdGlvbjpcbiAgICAgIC8vIHJlYWRvbmx5IHN0cmlwcGluZyBvbmx5IGRyb3BzIGtleXMgdGhlIENBTExFUiBzdXBwbGllZC4pXG4gICAgICBpZiAodHlwZW9mIGlucHV0LnN0YWdlID09PSAnc3RyaW5nJyAmJiBpbnB1dC5zdGFnZSAhPT0gcHJldmlvdXMuc3RhZ2UpIHtcbiAgICAgICAgaW5wdXQuc3RhZ2VfZW50cnlfZGF0ZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBPbiBjbG9zZS13b246IHByb21vdGUgdGhlIGFjY291bnQgdG8gYGN1c3RvbWVyYCBhbmQgc2NoZWR1bGUgdGhlIGFjdGl2YXRpb25cbiAqIHRhc2sgZm9yIHRoZSBkZWFsJ3Mgb3duZXIuXG4gKlxuICogYHJ1bkFzOiAnc3lzdGVtJ2AgKCMyMDE0LCBBR0VOVFMubWQgcnVsZSA5KS4gVGhlIHRyaWdnZXIgaXMgYSByZXAgd2lubmluZ1xuICogdGhlaXIgb3duIGRlYWwsIGFuZCB0aGUgYWNjb3VudCBuZWVkIG5vdCBiZSB0aGVpcnM6IGFzIHRoZSBjYWxsZXIsIGEgcmVhZCBvZlxuICogYW4gYWNjb3VudCB0aGUgcmVwIGNhbm5vdCBzZWUgY2FtZSBiYWNrIGVtcHR5IGFuZCB0aGUgcHJvbW90aW9uIHdhcyBza2lwcGVkXG4gKiB3aXRob3V0IGEgd29yZCAobWVhc3VyZWQ6IGEgcmVwJ3Mgd2luIG9uIGFuIGFjY291bnQgYW5vdGhlciB1c2VyIG93bnMgbGVmdFxuICogaXQgYSBgcHJvc3BlY3RgKS4gVGhhdCBhbiBhY2NvdW50IGhhcyBhIHdvbiBkZWFsIGlzIHRoZSBhY2NvdW50J3MgZmFjdCwgbm90XG4gKiB0aGUgcmVwJ3MgZWRpdCwgc28gdGhlIGhvb2sgZWxldmF0ZXM7IHRoZSBkZWFsIHdyaXRlIHN0YXlzIHRoZSBjYWxsZXIncy5cbiAqIEVsZXZhdGlvbiBpcyBub3QgYW5vbnltaXR5OiBgY3R4LnVzZXJgIGFuZCB0aGUgYXVkaXQgc3RhbXBzIHN0aWxsIG5hbWUgdGhlXG4gKiByZXAuIE9yZ2FuaXphdGlvbiAocnVsZSAxMCk6IGl0IHJlYWRzIGFuZCB3cml0ZXMgb25seSB0aGUgYWNjb3VudCB0aGVcbiAqIHRyaWdnZXJpbmcgZGVhbCBuYW1lcywgYW5kIHRoZSBlbGV2YXRlZCBgY3R4LmFwaWAga2VlcHMgdGhlIHRyaWdnZXIncyB0ZW5hbnQuXG4gKi9cbmNvbnN0IG9wcG9ydHVuaXR5V29uSG9vazogSG9vayA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X3Byb21vdGVfYWNjb3VudCcsXG4gIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScsXG4gIGV2ZW50czogWydhZnRlclVwZGF0ZSddLFxuICBwcmlvcml0eTogODAwLFxuICBhc3luYzogdHJ1ZSxcbiAgb25FcnJvcjogJ2xvZycsXG4gIHJ1bkFzOiAnc3lzdGVtJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ09uIGNsb3NlZF93b246IHByb21vdGUgbGlua2VkIGFjY291bnQgdG8gY3VzdG9tZXIgYW5kIGNyZWF0ZSBhY3RpdmF0aW9uIHRhc2suJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgY29uc3QgYmVjYW1lV29uID0gaW5wdXQuc3RhZ2UgPT09ICdjbG9zZWRfd29uJyAmJiBwcmV2aW91cz8uc3RhZ2UgIT09ICdjbG9zZWRfd29uJztcbiAgICBpZiAoIWJlY2FtZVdvbikgcmV0dXJuO1xuICAgIGNvbnN0IGFwaSA9IGN0eC5hcGkgYXMgSG9va0FwaSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFwaSkgcmV0dXJuO1xuXG4gICAgY29uc3QgYWNjb3VudElkID1cbiAgICAgICh0eXBlb2YgaW5wdXQuY3JtX2FjY291bnQgPT09ICdzdHJpbmcnICYmIGlucHV0LmNybV9hY2NvdW50KSB8fFxuICAgICAgKHR5cGVvZiBwcmV2aW91cz8uY3JtX2FjY291bnQgPT09ICdzdHJpbmcnICYmIHByZXZpb3VzLmNybV9hY2NvdW50KSB8fFxuICAgICAgdW5kZWZpbmVkO1xuICAgIGlmICghYWNjb3VudElkKSByZXR1cm47XG5cbiAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2FjY291bnQnKS5maW5kT25lKHsgd2hlcmU6IHsgaWQ6IGFjY291bnRJZCB9IH0pO1xuICAgIGlmIChhY2NvdW50ICYmIGFjY291bnQudHlwZSAhPT0gJ2N1c3RvbWVyJykge1xuICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX2FjY291bnQnKS51cGRhdGUoXG4gICAgICAgIHsgaWQ6IGFjY291bnRJZCwgdHlwZTogJ2N1c3RvbWVyJyB9LFxuICAgICAgICB7IHdoZXJlOiB7IGlkOiBhY2NvdW50SWQgfSB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHBJZCA9ICh0eXBlb2YgaW5wdXQuaWQgPT09ICdzdHJpbmcnICYmIGlucHV0LmlkKSB8fCBwcmV2aW91cz8uaWQ7XG4gICAgY29uc3Qgb3duZXJJZCA9XG4gICAgICAodHlwZW9mIGlucHV0Lm93bmVyX2lkID09PSAnc3RyaW5nJyAmJiBpbnB1dC5vd25lcl9pZCkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXM/Lm93bmVyX2lkID09PSAnc3RyaW5nJyAmJiBwcmV2aW91cy5vd25lcl9pZCkgfHxcbiAgICAgIGN0eC51c2VyPy5pZDtcbiAgICAvLyBVVEMgY2FsZW5kYXIgZm9yIHRoZSBzdGVwLCBtYXRjaGluZyB0aGUgYHRvSVNPU3RyaW5nKClgIHJlbmRlciBiZWxvdyBcdTIwMTRcbiAgICAvLyBzZWUgdGhlIG5vdGUgb24gdGhlIHNhbWUgc2hhcGUgaW4gYGxlYWQuaG9vay50c2AuIEEgbG9jYWwgYHNldERhdGVgIHN0ZXBcbiAgICAvLyBwcmVzZXJ2ZXMgd2FsbC1jbG9jayB0aW1lLCBzbyBhY3Jvc3MgYSBzcHJpbmctZm9yd2FyZCB0aGUgYWN0aXZhdGlvbiB0YXNrXG4gICAgLy8gaXMgZmlsZWQgYSBkYXkgZWFybHkgaW4gZXZlcnkgbm9uLVVUQyBkZXBsb3ltZW50LlxuICAgIGNvbnN0IGR1ZSA9IG5ldyBEYXRlKCk7XG4gICAgZHVlLnNldFVUQ0RhdGUoZHVlLmdldFVUQ0RhdGUoKSArIDMpO1xuXG4gICAgLy8gVGl0bGUgdGhlIHRhc2sgd2l0aCB0aGUgb3Bwb3J0dW5pdHkncyBOQU1FICgjMTI0MykuIFRoaXMgaXMgb25lIG9mIHRoZVxuICAgIC8vIHR3byByb3dzIGEgd2Fsa3Rocm91Z2ggb2YgY3VycmVudCBtYWluIHN0aWxsIHdyaXRlcyB3aXRoIGEgcmF3IGtleSBpbiBpdCxcbiAgICAvLyBhbmQgaXQgbGFuZHMgaW4gKipBbGwgVGFza3MqKiBuZXh0IHRvIHRoZSBlc2NhbGF0aW9uIHJvd3MgIzEyMDggYWxyZWFkeVxuICAgIC8vIGZpeGVkLiBgY3JtX29wcG9ydHVuaXR5Lm5hbWVgIGlzIHJlcXVpcmVkICsgbm90TnVsbCwgc28gdGhlIGJhcmUgZmFsbGJhY2tcbiAgICAvLyBpcyBhIHNoYXBlIHRoZSBzY2hlbWEgZG9lcyBub3QgcGVybWl0IHJhdGhlciB0aGFuIGFuIGV4cGVjdGVkIGNhc2UgXHUyMDE0IGl0XG4gICAgLy8gZXhpc3RzIHNvIGEgcHJlLWltYWdlIHRoYXQgYXJyaXZlZCB3aXRob3V0IHRoZSBjb2x1bW4gc3RpbGwgcHJvZHVjZXMgYVxuICAgIC8vIHNlbnRlbmNlIGluc3RlYWQgb2YgYSBkYW5nbGluZyBvbmUuIFRoZSAyNTUgY2FwIGlzIHRoZSBzYW1lIG9uZVxuICAgIC8vIGBjYXNlLmhvb2sudHNgIGRvY3VtZW50czogYGNybV90YXNrLnN1YmplY3RgIGVuZm9yY2VzIGl0LCBhbmQgdGhpcyBob29rIGlzXG4gICAgLy8gYGFzeW5jOiB0cnVlYCArIGBvbkVycm9yOiAnbG9nJ2AsIHNvIGEgcmVqZWN0ZWQgaW5zZXJ0IHdvdWxkIHN1cmZhY2VcbiAgICAvLyBub3doZXJlIGF0IGFsbC5cbiAgICBjb25zdCBvcHBOYW1lID1cbiAgICAgICh0eXBlb2YgaW5wdXQubmFtZSA9PT0gJ3N0cmluZycgJiYgaW5wdXQubmFtZS50cmltKCkpIHx8XG4gICAgICAodHlwZW9mIHByZXZpb3VzPy5uYW1lID09PSAnc3RyaW5nJyAmJiBwcmV2aW91cy5uYW1lLnRyaW0oKSkgfHxcbiAgICAgICcnO1xuICAgIGNvbnN0IHRpdGxlZCA9IG9wcE5hbWVcbiAgICAgID8gYEFjdGl2YXRlIG5ldyBjdXN0b21lciBmb3Igb3Bwb3J0dW5pdHkgJHtvcHBOYW1lfWBcbiAgICAgIDogJ0FjdGl2YXRlIG5ldyBjdXN0b21lcic7XG4gICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX3Rhc2snKS5pbnNlcnQoe1xuICAgICAgc3ViamVjdDogdGl0bGVkLmxlbmd0aCA+IDI1NSA/IGAke3RpdGxlZC5zbGljZSgwLCAyNTQpfVx1MjAyNmAgOiB0aXRsZWQsXG4gICAgICBzdGF0dXM6ICdub3Rfc3RhcnRlZCcsXG4gICAgICBwcmlvcml0eTogJ2hpZ2gnLFxuICAgICAgdHlwZTogJ2ZvbGxvd191cCcsXG4gICAgICBkdWVfZGF0ZTogZHVlLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApLFxuICAgICAgb3duZXJfaWQ6IG93bmVySWQsXG4gICAgICByZWxhdGVkX3RvX3R5cGU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgcmVsYXRlZF90b19vcHBvcnR1bml0eTogb3BwSWQsXG4gICAgICByZWxhdGVkX3RvX2FjY291bnQ6IGFjY291bnRJZCxcbiAgICB9KTtcbiAgfSxcbn07XG5cblxuLyoqXG4gKiBUaGUgY2FwYWJpbGl0eSBnYXRlIFx1MjAxNCBhbiBhY2NvdW50IHdob3NlIGBjb21tZXJjaWFsX2NhcGFiaWxpdHlgIGlzXG4gKiBgc2V0dGxlbWVudF9vbmx5YCBtYXkgbm90IGhhdmUgYSBORVcgb3Bwb3J0dW5pdHkgb3BlbmVkIGFnYWluc3QgaXQuXG4gKlxuICogUkVRLTAwMDMncyBtb3N0IHZhbHVhYmxlIHByaW1pdGl2ZTogKnNvbWUgY291bnRlcnBhcnRpZXMgYXJlIHBheWFibGUgYnV0IG5vdFxuICogc2VsbGFibGUqIFx1MjAxNCBcdTMwMENcdTYyREJcdTY4MDdcdTRFRTNcdTc0MDZcdTUzQ0FcdTUxNzZcdTRFRDZcdTdDN0JcdTVCQTJcdTYyMzdcdTRFQzVcdTUzRUZcdTc1MjhcdTRFOEVcdTRFRDhcdTZCM0VcdTU2REVcdTZCM0VcdUZGMENcdTY1RTBcdTZDRDVcdTUzRDFcdThENzdcdTU1NDZcdTY3M0FcdTMwMEQuIFRoZSBjYXRlZ29yeSBsaXZlcyBvblxuICogYGNybV9hY2NvdW50YDsgdGhpcyBpcyB0aGUgcnVsZSB0aGF0IHJlYWRzIGl0LCBhbmQgd2l0aG91dCBhIHJlYWRlciB0aGVcbiAqIGNhdGVnb3J5IHdvdWxkIGJlIHByb3NlIChSRVEtMDAwMyAqRGlzcG9zaXRpb24gJiByYXRpb25hbGUqKS5cbiAqXG4gKiAjIyBcdTI2QTBcdUZFMEYgYGJlZm9yZUluc2VydGAgT05MWSBcdTIwMTQgYSB0cmFuc2l0aW9uIGdhdGUsIG5vdCBhbiBpbnZhcmlhbnRcbiAqXG4gKiBNYWludGFpbmVyIHJ1bGluZywgMjAyNi0wOS0xNiAodmVyYmF0aW0sIGtlcHQgdW50cmFuc2xhdGVkKTpcbiAqXG4gKiAgIFx1MzAwQ1x1OTVGOFx1OTVFOFx1OEQ3MCBgb3Bwb3J0dW5pdHkuaG9vay50c2AgXHU3Njg0IGBiZWZvcmVJbnNlcnRgXHVGRjBDXHU3NTI4IGhvb2sgXHU3Njg0IGBjdHguYXBpYCBcdThCRkJcdTVCQTJcdTYyMzdcdTdDN0JcdTUyMkJcdTMwMDJcbiAqICAgIFJFUS0wMDAzIFx1N0IyQyAxMjggXHU4ODRDXHU3Njg0IGB2YWxpZGF0aW9uc1tdYCBcdTRFMEVcdThCRTVcdThCQjBcdTVGNTVcdTgxRUFcdTVERjFcdTc2ODRcdTlBOENcdTY1MzZcdTdCMkMgMiBcdTY3NjFcdTUxQjJcdTdBODFcdUZGMENcdTRFRTVcdTlBOENcdTY1MzZcdTRFM0FcdTUxQzZcdTMwMDJcdTMwMERcbiAqXG4gKiBUaGUgZXZlbnQgbGlzdCBJUyB0aGUgdHJhbnNpdGlvbiBnYXRlIChBR0VOVFMubWQgbWV0YWRhdGEgc2VtYW50aWNzIHJ1bGUgNyksXG4gKiBhbmQgaXQgaXMgdGhlIGNvbnN0cnVjdCByYXRoZXIgdGhhbiBhIGNvbW1lbnQgY2xhaW1pbmcgdGhlIHByb3BlcnR5LiBBblxuICogb3Bwb3J0dW5pdHkgdGhhdCBhbHJlYWR5IHBvaW50cyBhdCBhbiBhY2NvdW50IHJlc3RyaWN0ZWQgbGF0ZXIgaXMgbmV2ZXJcbiAqIHJlLWV2YWx1YXRlZDogaXQga2VlcHMgd29ya2luZyBhbmQga2VlcHMgYmVpbmcgZWRpdGFibGUsIHdoaWNoIFJFUS0wMDAzXG4gKiBhY2NlcHRhbmNlIDIgZGVtYW5kcyBpbiBhcyBtYW55IHdvcmRzLiBcdTI2RDQgTmV2ZXIgcmVzdGF0ZSB0aGlzIGFzIGFcbiAqIGB2YWxpZGF0aW9uc1tdYCBzY3JpcHQgXHUyMDE0IGEgdmFsaWRhdGlvbiBpcyBldmFsdWF0ZWQgYWdhaW5zdFxuICogYHsuLi5wcmV2aW91cywgLi4uZGF0YX1gIG9uIGV2ZXJ5IHdyaXRlLCB3aGVyZSBcImFscmVhZHkgbGlua2VkXCIgYW5kIFwibGlua2luZ1xuICogbm93XCIgYXJlIHRoZSBzYW1lIHN0YXRlLCBzbyBpdCB3b3VsZCByZWZ1c2UgZXZlcnkgbGF0ZXIgZWRpdCB0byBldmVyeVxuICogaGlzdG9yaWNhbCBvcHBvcnR1bml0eS4gVGhlIHdob2xlIG1lYXN1cmVtZW50LCBpbmNsdWRpbmcgd2h5IGEgcHJlZGljYXRlXG4gKiBjYW5ub3QgcmVhZCB0aGUgYWNjb3VudCBhdCBhbGwsIGlzIG9uIGBjcm1fYWNjb3VudC5jb21tZXJjaWFsX2NhcGFiaWxpdHlgLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBCT1VOREFSWSwgcmVjb3JkZWQgcmF0aGVyIHRoYW4gaGlkZGVuOiBhbiBVUERBVEUgdGhhdCByZS1wb2ludHMgYW5cbiAqIEVYSVNUSU5HIG9wcG9ydHVuaXR5IG9udG8gYSByZXN0cmljdGVkIGFjY291bnQgaXMgbm90IHJlZnVzZWQuIFRoYXQgaXMgdGhlXG4gKiBydWxpbmcncyBjb25zdHJ1Y3QgYW5kIGl0IGlzIGFsc28gd2hhdCBhY2NlcHRhbmNlIDIgYXNrcyBmb3IgXHUyMDE0IHRoZSByZWZ1c2FsIGlzXG4gKiBzY29wZWQgdG8gXCJsaW5rZWQgdG8gYSBORVcgb3Bwb3J0dW5pdHlcIi4gV2lkZW5pbmcgdG8gYGJlZm9yZVVwZGF0ZWAgaXMgbm90IGFcbiAqIGZyZWUgd2luIGVpdGhlcjogdGhlIHVwZGF0ZSBwYXlsb2FkIHdvdWxkIGhhdmUgdG8gYmUganVkZ2VkIGFnYWluc3RcbiAqIGBwcmV2aW91c2AgdG8gdGVsbCBhIHJlLXBvaW50IGZyb20gYW4gb3JkaW5hcnkgZWRpdCwgd2hpY2ggaXMgdGhlIHN0YXRlXG4gKiBjb25mdXNpb24gdGhpcyBldmVudCBsaXN0IGV4aXN0cyB0byBhdm9pZC4gQSBnYXRlIG9uIHJlLXBvaW50aW5nIGlzIGFcbiAqIHNlcGFyYXRlIGRlY2lzaW9uLCBub3QgYSB0aWR5LXVwLlxuICpcbiAqICMjIEZhaWxzIE9QRU4sIG9uIHB1cnBvc2VcbiAqXG4gKiBPbmx5IHRoZSBvbmUgdmVyZGljdCBhIHBlcnNvbiB3cm90ZSBkb3duIHJlZnVzZXMgKEFHRU5UUy5tZCBtZXRhZGF0YVxuICogc2VtYW50aWNzIHJ1bGUgOCkuIEFuIGFjY291bnQgdGhhdCBwcmVkYXRlcyB0aGUgY29sdW1uLCBhbiBhY2NvdW50IHRoYXRcbiAqIGNhbm5vdCBiZSBmb3VuZCwgYW4gYWJzZW50IGBjdHguYXBpYCBhbmQgYW4gdW5yZWNvZ25pc2VkIHZhbHVlIGFsbCBsZXQgdGhlXG4gKiB3cml0ZSB0aHJvdWdoOiB0aGUgc2hpcHBlZCBkZWZhdWx0IGlzIGBmdWxsYCwgYW5kIGFuIGFjY291bnQgY3JlYXRlZCBiZWZvcmVcbiAqIHRoaXMgZmllbGQgZXhpc3RlZCBjYXJyaWVzIG5vdGhpbmcgYXQgYWxsIFx1MjAxNCBib3RoIG11c3Qgb3BlbiBkZWFscyBleGFjdGx5IGFzXG4gKiB0aGV5IGRpZCBiZWZvcmUgdGhlIGdhdGUgZXhpc3RlZC5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgQSByZWFkIHRoYXQgVEhST1dTIGlzIG5vdCBpbiB0aGF0IGxpc3QgYW5kIGlzIGRlbGliZXJhdGVseSBub3QgY2F1Z2h0LiBBXG4gKiBicm9rZW4gcmVhZCBpcyBub3QgZXZpZGVuY2UgdGhhdCB0aGUgYWNjb3VudCBpcyBzZWxsYWJsZTsgc3dhbGxvd2luZyBpdFxuICogd291bGQgbWFrZSB0aGUgZ2F0ZSBzaWxlbnRseSBhYnNlbnQgZXhhY3RseSB3aGVuIHRoZSBwbGF0Zm9ybSBjYW5ub3QgYW5zd2VyLlxuICpcbiAqICMjIGBydW5BczogJ3N5c3RlbSdgLCBhbmQgYSByZWZ1c2FsIHRoYXQgbmFtZXMgbm8gYWNjb3VudCAoIzIwMTQpXG4gKlxuICogQXMgdGhlIGNhbGxlciwgdGhlIHZlcmRpY3Qgd2FzIHJlYWQgdW5kZXIgdGhlIGNhbGxlcidzIHJlY29yZCBhY2Nlc3MgXHUyMDE0IGFuZCBhXG4gKiByZXAgd2hvIGNhbm5vdCByZWFkIHRoZSBhY2NvdW50IGlzIG5vdCByZWZ1c2VkIHRoYXQgcmVhZDogcmVjb3JkLWxldmVsXG4gKiBhY2Nlc3MgRklMVEVSUyBpdCwgYGZpbmRPbmVgIGFuc3dlcnMgYG51bGxgLCB0aGUgZ2F0ZSB0b29rIHRoYXQgZm9yIFwiY2Fubm90XG4gKiBiZSBmb3VuZFwiIGFuZCBzdG9vZCBkb3duLCBhbmQgdGhlIGVuZ2luZSdzIHJlZmVyZW5jZSBjaGVjayBhY2NlcHRlZCB0aGUgbGlua1xuICogKG1lYXN1cmVkIG9uIDE3LjcuMDogYW4gb3V0c2lkZXIgb3BlbmVkIGEgZGVhbCBvbiBhIFNldHRsZW1lbnQgT25seSBhY2NvdW50XG4gKiB0aGV5IGNhbm5vdCByZWFkKS4gV2hldGhlciBhbiBhY2NvdW50IGlzIHNlbGxhYmxlIGlzIHRoZSBhY2NvdW50J3NcbiAqIGNvbW1lcmNpYWwgZmFjdCwgbm90IGEgcHJpdmlsZWdlIG9mIHdob2V2ZXIgbmFtZXMgaXQsIHNvIHRoZSBnYXRlIHJlYWRzIGl0XG4gKiBlbGV2YXRlZCAoQUdFTlRTLm1kIHJ1bGUgOSBcdTIwMTQgdGhlIHJlYWQgaXMgdGhlIG9uZSB0aGluZyBlbGV2YXRlZDsgdGhlIGRlYWxcbiAqIHdyaXRlIHN0YXlzIHRoZSBjYWxsZXIncykuXG4gKlxuICogV2hhdCBlbGV2YXRpb24gcmVhZHMgbXVzdCBub3QgbGVhayBiYWNrIHRocm91Z2ggdGhlIHJlZnVzYWwuIE1haW50YWluZXJcbiAqIHJ1bGluZyBvbiAjMjAxNCAob3B0aW9uIEIpOiB0aGUgcmVmdXNhbCBzYXlzIFwidGhpcyBhY2NvdW50XCIgYW5kIG5hbWVzIG5vbmUgXHUyMDE0XG4gKiBubyBudW1iZXIsIG5vIG5hbWUsIG5vIGlkIFx1MjAxNCBhbmQgc3RhdGVzIG5vdGhpbmcgaXQgcmVhZCBiZXlvbmQgdGhlIG9uZSBmYWN0XG4gKiB0aGF0IGJsb2NrcyB0aGUgZGVhbCwgdGhlIFNldHRsZW1lbnQgT25seSB2ZXJkaWN0LiBJdCBzdXBlcnNlZGVzICMxMjQzJ3NcbiAqIFwibmFtZSB0aGUgYWNjb3VudCB0aGUgd2F5IHRoZSBVSSBkb2VzXCIgb24gdGhpcyBvbmUgcGF0aDogdGhlIGNhbGxlciBjaG9zZVxuICogdGhlIGFjY291bnQgb24gdGhlIHZlcnkgZm9ybSB0aGUgcmVmdXNhbCBhbnN3ZXJzLCBzbyB0aGUgZGlhbG9nIHN0YXlzIGNsZWFyXG4gKiB3aXRob3V0IGVjaG9pbmcgYW4gYWNjb3VudCB0aGUgY2FsbGVyIG1heSBub3QgYmUgYWxsb3dlZCB0byByZWFkLiBTbyB0aGUgcmVhZFxuICogYXNrcyBmb3IgYGNvbW1lcmNpYWxfY2FwYWJpbGl0eWAgYW5kIG5vdGhpbmcgZWxzZS5cbiAqXG4gKiBPcmdhbml6YXRpb24gKEFHRU5UUy5tZCBydWxlIDEwKTogdGhlIHJlYWQgaXMgcGlubmVkIHRvIHRoZSBuZXcgZGVhbCdzIG93blxuICogYG9yZ2FuaXphdGlvbl9pZGAgd2hlbiBpdCBjYXJyaWVzIG9uZSwgc28gYW4gZWxldmF0ZWQgdmVyZGljdCBpcyBuZXZlciByZWFkXG4gKiBmcm9tIGFub3RoZXIgb3JnYW5pemF0aW9uJ3MgYWNjb3VudDsgYSBkZWFsIHdpdGggbm8gb3JnYW5pemF0aW9uIChhXG4gKiBzaW5nbGUtb3JnYW5pemF0aW9uIGluc3RhbGwpIGhhcyBubyB3YWxsIHRvIHN0YXkgaW5zaWRlLCBhbmQgaXMgbm90IHBpbm5lZC5cbiAqIEFuIGFjY291bnQgb3V0c2lkZSB0aGUgZGVhbCdzIG9yZ2FuaXphdGlvbiB0aGVuIHJlYWRzIGFzIFwiY2Fubm90IGJlIGZvdW5kXCJcbiAqIGFuZCB0aGUgZ2F0ZSBzdGFuZHMgZG93biBcdTIwMTQgdGhlIHNhbWUgYW5zd2VyIGEgcGVyc29uJ3MgdGVuYW50LXNjb3BlZCByZWFkXG4gKiBhbHJlYWR5IGdpdmVzLlxuICpcbiAqIFx1MjZENCBObyBzeXN0ZW0td3JpdGUgZXhlbXB0aW9uLCBkZWxpYmVyYXRlbHksIGFuZCBpdCBpcyB0aGUgc2FtZSByZWFkaW5nIHRoZVxuICogdHdvIGFwcHJvdmFsIGZsb3dzIHJlY29yZDogYSBjb250cm9sIHRoYXQgZW5nYWdlcyBvbmx5IGZvciB3cml0ZXJzIGNhcnJ5aW5nIGFcbiAqIHNlc3Npb24gaXMgbm90IGEgY29udHJvbCwgc2luY2UgYSBgcnVuQXM6ICdzeXN0ZW0nYCBpbXBvcnRlciB3b3VsZCBzaW1wbHlcbiAqIGJ5cGFzcyBpdC5cbiAqXG4gKiBQcmlvcml0eSAxNTAgcnVucyBpdCBBSEVBRCBvZiBgb3Bwb3J0dW5pdHlfbGlmZWN5Y2xlYCAoMjAwKTogYSByZWZ1c2VkIHdyaXRlXG4gKiBzaG91bGQgbm90IGZpcnN0IHBheSBmb3IgdGhlIGRlcml2ZWQtZmllbGQgcmVjb21wdXRlLlxuICovXG5jb25zdCBvcHBvcnR1bml0eUFjY291bnRDYXBhYmlsaXR5SG9vazogSG9vayA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X2FjY291bnRfY2FwYWJpbGl0eScsXG4gIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScsXG4gIGV2ZW50czogWydiZWZvcmVJbnNlcnQnXSxcbiAgcHJpb3JpdHk6IDE1MCxcbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnUmVmdXNlIGEgTkVXIG9wcG9ydHVuaXR5IGxpbmtlZCB0byBhbiBhY2NvdW50IHdob3NlIGNvbW1lcmNpYWwgY2FwYWJpbGl0eSBpcyBzZXR0bGVtZW50IG9ubHkuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvLyBUaGUgcmVmdXNhbCBlbnZlbG9wZSAoIzEwNzUpLiBNaXJyb3JlZCBmcm9tIGAuL19yZWZ1c2FsLnRzYCBiZWNhdXNlIGFcbiAgICAvLyBsb3dlcmVkIGJvZHkgaGFzIG5vIG1vZHVsZSBzY29wZSBhbmQgYGV4dHJhY3RIb29rQm9keWAgVEhST1dTIG9uIGFuXG4gICAgLy8gaW1wb3J0OyBgdGVzdC9yZWZ1c2FsLWVudmVsb3BlLnRlc3QudHNgIHBpbnMgZXZlcnkgY29weSBhZ2FpbnN0IGl0LlxuICAgIGZ1bmN0aW9uIHJlZnVzZShcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvZGU6IHN0cmluZyxcbiAgICAgIHN0YXR1czogbnVtYmVyLFxuICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZyA9IG1lc3NhZ2UsXG4gICAgKTogRXJyb3Ige1xuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpIGFzIEVycm9yICYge1xuICAgICAgICBjb2RlOiBzdHJpbmc7XG4gICAgICAgIHN0YXR1czogbnVtYmVyO1xuICAgICAgICB1c2VyTWVzc2FnZTogc3RyaW5nO1xuICAgICAgfTtcbiAgICAgIGVyci5jb2RlID0gY29kZTtcbiAgICAgIGVyci5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICBlcnIudXNlck1lc3NhZ2UgPSB1c2VyTWVzc2FnZTtcbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGNvbnN0IGFwaSA9IGN0eC5hcGkgYXMgSG9va0FwaSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFwaSkgcmV0dXJuO1xuICAgIGNvbnN0IGFjY291bnRJZCA9IGN0eC5pbnB1dC5jcm1fYWNjb3VudDtcbiAgICBpZiAodHlwZW9mIGFjY291bnRJZCAhPT0gJ3N0cmluZycgfHwgYWNjb3VudElkID09PSAnJykgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3JnID0gY3R4LmlucHV0Lm9yZ2FuaXphdGlvbl9pZDtcbiAgICBjb25zdCBhY2NvdW50ID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2FjY291bnQnKS5maW5kT25lKHtcbiAgICAgIHdoZXJlOiB7IGlkOiBhY2NvdW50SWQsIC4uLih0eXBlb2Ygb3JnID09PSAnc3RyaW5nJyAmJiBvcmcgPyB7IG9yZ2FuaXphdGlvbl9pZDogb3JnIH0gOiB7fSkgfSxcbiAgICAgIGZpZWxkczogWydjb21tZXJjaWFsX2NhcGFiaWxpdHknXSxcbiAgICB9KTtcbiAgICBpZiAoIWFjY291bnQgfHwgYWNjb3VudC5jb21tZXJjaWFsX2NhcGFiaWxpdHkgIT09ICdzZXR0bGVtZW50X29ubHknKSByZXR1cm47XG5cbiAgICAvLyBcdTI2RDQgXCJ0aGlzIGFjY291bnRcIiwgbmV2ZXIgYSBudW1iZXIsIGEgbmFtZSBvciBhbiBpZCBcdTIwMTQgc2VlIHRoZSBub3RlIGFib3ZlLlxuICAgIHRocm93IHJlZnVzZShcbiAgICAgICdDYW5ub3Qgb3BlbiBhbiBvcHBvcnR1bml0eSBhZ2FpbnN0IHRoaXMgYWNjb3VudDogaXRzIENvbW1lcmNpYWwgQ2FwYWJpbGl0eSBpcyBTZXR0bGVtZW50IE9ubHksIHNvIGl0IGlzIGF2YWlsYWJsZSBmb3IgYmlsbGluZyBhbmQgcGF5bWVudCBidXQgbm8gbmV3IGJ1c2luZXNzIG1heSBiZSBib29rZWQgYWdhaW5zdCBpdC4gUGljayBhIGRpZmZlcmVudCBhY2NvdW50LCBvciBoYXZlIHRoZSBhY2NvdW50IHJlY2xhc3NpZmllZCB0byBGdWxsIGZpcnN0LicsXG4gICAgICAnVkFMSURBVElPTl9GQUlMRUQnLFxuICAgICAgNDAwLFxuICAgICk7XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBbXG4gIG9wcG9ydHVuaXR5QWNjb3VudENhcGFiaWxpdHlIb29rLFxuICBvcHBvcnR1bml0eVZhbGlkYXRpb25Ib29rLFxuICBvcHBvcnR1bml0eVdvbkhvb2ssXG5dO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0cy9vcHBvcnR1bml0eS5jYW1wYWlnbi1tZXRyaWNzLmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL29wcG9ydHVuaXR5LmNhbXBhaWduLW1ldHJpY3MuaG9vay50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBIb29rLCBIb29rQ29udGV4dCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHR5cGUgeyBIb29rQXBpIH0gZnJvbSAnLi9faG9vay1hcGknO1xuXG4vKipcbiAqIENhbXBhaWduIG1ldHJpYyByZWZyZXNoLCB0cmlnZ2VyZWQgYnkgYW4gT1BQT1JUVU5JVFkgd3JpdGUuXG4gKlxuICogVGhlIGhvb2sgaXMgY2FtcGFpZ24gYXJpdGhtZXRpYywgYnV0IGl0IGlzIGF0dGFjaGVkIHRvIGBjcm1fb3Bwb3J0dW5pdHlgLFxuICogd2hpY2ggdGhlIHNhbGVzIHBhY2thZ2Ugb3ducyBcdTIwMTQgYW5kIHNpbmNlIHRoZSBBRFItMDEzMCBsYXlvdXQgYSBob29rIGxpdmVzXG4gKiBiZXNpZGUgdGhlIG9iamVjdCBpdCBuYW1lcyAocGxhbiBpdGVtIDY6IFI0IGlzIGVuZm9yY2VkIGJ5IGNvLWxvY2F0aW9uXG4gKiByYXRoZXIgdGhhbiBieSByZWFkaW5nKS4gSXRzIHRocmVlIHNpYmxpbmdzOiBgY2FtcGFpZ25fdmFsaWRhdGlvbmAgYW5kXG4gKiBgY2FtcGFpZ25fbWV0cmljc19yZWZyZXNoYCBvbiBgY3JtX2NhbXBhaWduYCBpblxuICogYHNyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbi5ob29rLnRzYCwgYW5kXG4gKiBgY2FtcGFpZ25fbGVhZF9jb252ZXJzaW9uX3JlZnJlc2hgIG9uIGBjcm1fbGVhZGAgbmV4dCBkb29yIGluXG4gKiBgbGVhZC5jYW1wYWlnbi1tZXRyaWNzLmhvb2sudHNgLiBUaGUgbWVtYmVyc2hpcCBzaWRlIG9mIHRoZSBzYW1lIHJlY29tcHV0ZVxuICogaXMgYHNyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbl9tZW1iZXIuaG9vay50c2AuXG4gKlxuICogXHUyNkEwXHVGRTBGIFdIWSBUSEUgUkVDT01QVVRFIElTIFdSSVRURU4gT1VUIEZPVVIgVElNRVMuXG4gKlxuICogTDIgaG9vayBib2RpZXMgYXJlIGxvd2VyZWQgdG8gbWV0YWRhdGEgYW5kIGV2YWx1YXRlZCBCT0RZLU9OTFkgaW4gdGhlIFF1aWNrSlNcbiAqIHNhbmRib3g6IGEgaGFuZGxlciBjYW5ub3QgcmVhY2ggbW9kdWxlIHNjb3BlIGF0IHJ1bnRpbWUsIHNvIGEgc2hhcmVkXG4gKiBgcmVmcmVzaENhbXBhaWduTWV0cmljcygpYCBpbXBvcnQgd291bGQgYmUgYSBmcmVlIGlkZW50aWZpZXIgXHUyMDE0IHRoZSBDTEkgYnVpbGRcbiAqIHNpbGVudGx5IGRlY2xpbmVzIHRvIGxvd2VyIHRoZSBoYW5kbGVyLCBrZWVwcyBpdCBpbiBhIGJ1bmRsZWQgcnVudGltZSBmaWxlLFxuICogYW5kIHRoZSBob29rIHN0b3BzIGJlaW5nIGRlcGxveWFibGUgYXMgcHVyZSBtZXRhZGF0YSAodGhlIGJ1aWxkIHNheXMgc28gaW5cbiAqIG9uZSBsaW5lIG5vYm9keSByZWFkcykuIGB0ZXN0L2FjdGlvbi1zYW5kYm94LnRlc3QudHNgIGlzIHdoYXQgY2F0Y2hlcyBpdC5cbiAqXG4gKiBTbyB0aGUgYXJpdGhtZXRpYyBpcyBpbmxpbmVkIHBlciBoYW5kbGVyLiBUaGUgZHVwbGljYXRpb24gaXMgTk9UIHRydXN0ZWQ6XG4gKiBgdGVzdC9jYW1wYWlnbi1tZW1iZXItbGlmZWN5Y2xlLnRlc3QudHNgIGxvd2VycyBhbGwgZm91ciBib2RpZXMgYW5kIGFzc2VydHNcbiAqIHRoZSByZWNvbXB1dGUgYmxvY2sgaXMgY2hhcmFjdGVyLWlkZW50aWNhbCBhY3Jvc3MgdGhlbSwgc28gYSBmaXggbGFuZGluZyBvblxuICogb25lIGNvcHkgYW5kIHNraXBwaW5nIHRocmVlIGZhaWxzIGEgdGVzdCBpbnN0ZWFkIG9mIHNoaXBwaW5nIGZvdXIgZGVmaW5pdGlvbnNcbiAqIG9mIGBudW1fc2VudGAuIFNwbGl0dGluZyB0aGUgZm91ciBhY3Jvc3MgdGhyZWUgZmlsZXMgYnkgb3duaW5nIG9iamVjdCBjaGFuZ2VkXG4gKiBub25lIG9mIHRoYXQgXHUyMDE0IHRoZSBzdWl0ZSByZWFkcyB0aGVtIGJ5IGhvb2sgbmFtZSwgbm90IGJ5IGZpbGUuXG4gKi9cblxuLyoqXG4gKiBSZWNvbXB1dGUgd2hlbiBhbiBvcHBvcnR1bml0eSdzIGNhbXBhaWduIGF0dHJpYnV0aW9uIGNoYW5nZXMuXG4gKlxuICogYG51bV9vcHBvcnR1bml0aWVzYCwgYG51bV93b25fb3Bwb3J0dW5pdGllc2AgYW5kIGBhY3R1YWxfcmV2ZW51ZWAgZGVyaXZlIGZyb21cbiAqIG9wcG9ydHVuaXRpZXMsIG5vdCBmcm9tIG1lbWJlcnMgXHUyMDE0IHNvIHRoZSBtZW1iZXJzaGlwIHRyaWdnZXIgYWxvbmUgd291bGQgbGVhdmVcbiAqIGV4YWN0bHkgdGhlIHRocmVlIG1ldHJpY3MgYHJvaWAgaXMgYnVpbHQgb24gc3RhbGUuIEluc2VydCAvIHVwZGF0ZSAvIGRlbGV0ZSxcbiAqIGFuZCBib3RoIHNpZGVzIG9mIGEgcmUtYXR0cmlidXRpb24gKG9sZCBhbmQgbmV3IGNhbXBhaWduKSwgdGhlIHNhbWUgd2F5IHRoZVxuICogbGluZS1pdGVtIHJvbGx1cCBoYW5kbGVzIHJlLXBhcmVudGluZy5cbiAqXG4gKiBEZWNsYXJlZCBoZXJlIHJhdGhlciB0aGFuIGluIGBvcHBvcnR1bml0eS5ob29rLnRzYCBvbiBwdXJwb3NlOiBpdCBpcyBjYW1wYWlnblxuICogYXJpdGhtZXRpYyB0aGF0IGhhcHBlbnMgdG8gYmUgdHJpZ2dlcmVkIGJ5IGFuIG9wcG9ydHVuaXR5IHdyaXRlLCBhbmQgdGhlXG4gKiBob29rcyBiYXJyZWwgZmxhdHRlbnMgZWFjaCBgKi5ob29rLnRzYCBkZWZhdWx0IGV4cG9ydCByZWdhcmRsZXNzIG9mIHdoaWNoXG4gKiBvYmplY3QgZWFjaCBlbnRyeSBuYW1lcy5cbiAqXG4gKiBgcnVuQXM6ICdzeXN0ZW0nYCAoIzIwMTQsIEFHRU5UUy5tZCBydWxlIDkpLiBUaGUgdHJpZ2dlciBpcyBhIHNhbGVzIHdyaXRlIFx1MjAxNFxuICogYSByZXAgd2lubmluZyB0aGVpciBvd24gZGVhbCwgYSBtYW5hZ2VyIHdpbm5pbmcgb25lIG9uIGEgbWFya2V0aW5nLW93bmVkXG4gKiBjYW1wYWlnbiBcdTIwMTQgYW5kIG5laXRoZXIgbWF5IGVkaXQgdGhlIGNhbXBhaWduLCBzbyB0aGUgbWV0cmljIHdyaXRlIHdhc1xuICogcmVmdXNlZCwgbG9nZ2VkIGFuZCBzd2FsbG93ZWQ6IHRoZSBkZWFsIHdhcyB3b24gYW5kIHRoZSBjYW1wYWlnbidzIHJldmVudWVcbiAqIHN0YXllZCAwLiBUaGUgcmVjb21wdXRlIGlzIHRoZSBjYW1wYWlnbidzIHdyaXRlciwgbm90IHRoZSByZXAncywgc28gdGhlXG4gKiBob29rIGVsZXZhdGVzOyB0aGUgb3Bwb3J0dW5pdHkgd3JpdGUgc3RheXMgdGhlIGNhbGxlcidzLiBPcmdhbml6YXRpb25cbiAqIChydWxlIDEwKTogZXZlcnkgcmVhZCBpcyBrZXllZCB0byB0aGUgdHJpZ2dlcmluZyBkZWFsJ3MgY2FtcGFpZ24gKGFuZCB0aGVcbiAqIGxlYWRzIGl0cyBtZW1iZXJzIG5hbWUpLCBhbmQgdGhlIGVsZXZhdGVkIGBjdHguYXBpYCBrZWVwcyB0aGUgdHJpZ2dlcidzXG4gKiB0ZW5hbnQuXG4gKi9cbmNvbnN0IGNhbXBhaWduQXR0cmlidXRpb25SZWZyZXNoOiBIb29rID0ge1xuICBuYW1lOiAnY2FtcGFpZ25fYXR0cmlidXRpb25fcmVmcmVzaCcsXG4gIG9iamVjdDogJ2NybV9vcHBvcnR1bml0eScsXG4gIGV2ZW50czogWydhZnRlckluc2VydCcsICdhZnRlclVwZGF0ZScsICdhZnRlckRlbGV0ZSddLFxuICBwcmlvcml0eTogODEwLFxuICBhc3luYzogdHJ1ZSxcbiAgb25FcnJvcjogJ2xvZycsXG4gIHJ1bkFzOiAnc3lzdGVtJyxcbiAgZGVzY3JpcHRpb246ICdSZWNvbXB1dGUgY2FtcGFpZ24gbWV0cmljcyB3aGVuIGFuIG9wcG9ydHVuaXR5XHUyMDE5cyBjYW1wYWlnbiBhdHRyaWJ1dGlvbiBjaGFuZ2VzLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXBpKSByZXR1cm47XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gY3R4O1xuICAgIGNvbnN0IHByZXZpb3VzID0gY3R4LnByZXZpb3VzO1xuICAgIGNvbnN0IGNhbXBhaWduSWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFtcbiAgICAgIHR5cGVvZiBpbnB1dD8uY3JtX2NhbXBhaWduID09PSAnc3RyaW5nJyA/IGlucHV0LmNybV9jYW1wYWlnbiA6ICcnLFxuICAgICAgdHlwZW9mIHByZXZpb3VzPy5jcm1fY2FtcGFpZ24gPT09ICdzdHJpbmcnID8gKHByZXZpb3VzLmNybV9jYW1wYWlnbiBhcyBzdHJpbmcpIDogJycsXG4gICAgXS5maWx0ZXIoQm9vbGVhbikpKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIGNhbXBhaWduSWRzKSB7XG4gICAgICAvLyBcdTI1MDBcdTI1MDAgcmVjb21wdXRlIFx1MjUwMFx1MjUwMCBpZGVudGljYWwgaW4gYWxsIGZvdXIgcmVmcmVzaCBob29rczsgc2VlIHRoZSBoZWFkZXIuXG4gICAgICBjb25zdCBtZW1iZXJSb3dzID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduX21lbWJlcicpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGlkIH0sIGZpZWxkczogWydjcm1fbGVhZCcsICdzdGF0dXMnXSwgdG9wOiA1MDAwLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsZWFkSWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFxuICAgICAgICBtZW1iZXJSb3dzLm1hcCgocikgPT4gKHR5cGVvZiByLmNybV9sZWFkID09PSAnc3RyaW5nJyA/IHIuY3JtX2xlYWQgOiAnJykpLmZpbHRlcihCb29sZWFuKSxcbiAgICAgICkpO1xuICAgICAgY29uc3QgY29udmVydGVkTGVhZHMgPSBsZWFkSWRzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhd2FpdCBhcGkub2JqZWN0KCdjcm1fbGVhZCcpLmNvdW50KHsgd2hlcmU6IHsgaWQ6IHsgJGluOiBsZWFkSWRzIH0sIGlzX2NvbnZlcnRlZDogdHJ1ZSB9IH0pXG4gICAgICAgIDogMDtcbiAgICAgIGNvbnN0IG51bU9wcG9ydHVuaXRpZXMgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fb3Bwb3J0dW5pdHknKS5jb3VudCh7IHdoZXJlOiB7IGNybV9jYW1wYWlnbjogaWQgfSB9KTtcbiAgICAgIGNvbnN0IG51bVdvbiA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9vcHBvcnR1bml0eScpLmNvdW50KHsgd2hlcmU6IHsgY3JtX2NhbXBhaWduOiBpZCwgc3RhZ2U6ICdjbG9zZWRfd29uJyB9IH0pO1xuICAgICAgY29uc3Qgd29uUm93cyA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9vcHBvcnR1bml0eScpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGlkLCBzdGFnZTogJ2Nsb3NlZF93b24nIH0sIGZpZWxkczogWydhbW91bnQnXSwgdG9wOiA1MDAwLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBhY3R1YWxSZXZlbnVlID0gd29uUm93cy5yZWR1Y2UoXG4gICAgICAgIChzdW0sIHJvdykgPT4gc3VtICsgKHR5cGVvZiByb3cuYW1vdW50ID09PSAnbnVtYmVyJyA/IHJvdy5hbW91bnQgOiBOdW1iZXIocm93LmFtb3VudCkgfHwgMCksIDAsXG4gICAgICApO1xuICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduJykudXBkYXRlKHtcbiAgICAgICAgaWQsXG4gICAgICAgIG51bV9zZW50OiBtZW1iZXJSb3dzLmxlbmd0aCxcbiAgICAgICAgbnVtX3Jlc3BvbnNlczogbWVtYmVyUm93cy5maWx0ZXIoKHIpID0+IHIuc3RhdHVzID09PSAncmVzcG9uZGVkJyB8fCByLnN0YXR1cyA9PT0gJ2NvbnZlcnRlZCcpLmxlbmd0aCxcbiAgICAgICAgbnVtX2xlYWRzOiBsZWFkSWRzLmxlbmd0aCxcbiAgICAgICAgbnVtX2NvbnZlcnRlZF9sZWFkczogY29udmVydGVkTGVhZHMsXG4gICAgICAgIG51bV9vcHBvcnR1bml0aWVzOiBudW1PcHBvcnR1bml0aWVzLFxuICAgICAgICBudW1fd29uX29wcG9ydHVuaXRpZXM6IG51bVdvbixcbiAgICAgICAgYWN0dWFsX3JldmVudWU6IGFjdHVhbFJldmVudWUsXG4gICAgICB9LCB7IHdoZXJlOiB7IGlkIH0gfSk7XG4gICAgICAvLyBcdTI1MDBcdTI1MDAgL3JlY29tcHV0ZSBcdTI1MDBcdTI1MDBcbiAgICB9XG4gIH0sXG59O1xuXG5leHBvcnQgZGVmYXVsdCBbY2FtcGFpZ25BdHRyaWJ1dGlvblJlZnJlc2hdO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0cy90YXNrLmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9vYmplY3RzL3Rhc2suaG9vay50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBIb29rLCBIb29rQ29udGV4dCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHR5cGUgeyBIb29rQXBpIH0gZnJvbSAnLi9faG9vay1hcGknO1xuXG4vKipcbiAqIFRhc2sgbGlmZWN5Y2xlIGhvb2suXG4gKlxuICogLSBPbiBgY29tcGxldGVkYCB0cmFuc2l0aW9uLCBzdGFtcHMgYGNvbXBsZXRlZF9kYXRlYCBhbmQgYHByb2dyZXNzX3BlcmNlbnQ9MTAwYC5cbiAqIC0gV2FybnMgd2hlbiBgcmVtaW5kZXJfZGF0ZWAgaXMgYWZ0ZXIgYGR1ZV9kYXRlYC5cbiAqIC0gQnViYmxlcyBhY3Rpdml0eSB0byB0aGUgcG9seW1vcnBoaWMgcGFyZW50IChhY2NvdW50IGBsYXN0X2FjdGl2aXR5X2RhdGVgLFxuICogICBsZWFkIGBsYXN0X2NvbnRhY3RlZF9kYXRlYCkuXG4gKiAtIFJlZnVzZXMgdG8gU0NIRURVTEUgYSBwaG9uZSB0b3VjaCBhZ2FpbnN0IGEgcGVyc29uIGZsYWdnZWQgYGRvX25vdF9jYWxsYFxuICogICAoc2VlIHtAbGluayB0YXNrRG9Ob3RDYWxsR3VhcmR9KS5cbiAqL1xuXG5jb25zdCB0YXNrVmFsaWRhdGlvbjogSG9vayA9IHtcbiAgbmFtZTogJ3Rhc2tfY29tcGxldGlvbicsXG4gIG9iamVjdDogJ2NybV90YXNrJyxcbiAgZXZlbnRzOiBbJ2JlZm9yZUluc2VydCcsICdiZWZvcmVVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDIwMCxcbiAgZGVzY3JpcHRpb246ICdTdGFtcCBjb21wbGV0ZWQvb3ZlcmR1ZSBmbGFncyArIGRhdGVzIG9uIGNvbXBsZXRpb24gYW5kIHZhbGlkYXRlIHJlbWluZGVyIHRpbWluZy4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIC8vIEQzIHN0YW5kLWRvd246IGEgcHJlZGljYXRlIHVwZGF0ZSBoYXMgT05FIHBheWxvYWQgZm9yIGV2ZXJ5IG1hdGNoZWQgcm93LFxuICAgIC8vIHNvIHRoZSBgY3R4LnByZXZpb3VzYC1jb25kaXRpb25lZCB3cml0ZXMgYmVsb3cgd291bGQgbGFuZCBvbiByb3dzIHRoYXRcbiAgICAvLyBkaWQgbm90IGVhcm4gdGhlbSBcdTIwMTQgcmVmdXNlZCBhcyBhIGRpdmVyZ2luZyBrZXkgc2V0LCBvciBzdG9yZWQgc2lsZW50bHlcbiAgICAvLyBmcm9tIHRoZSBsYXN0IHJvdy4gRnVsbCBhY2NvdW50IGFuZCB0aGUgbWVhc3VyZW1lbnQ6IGBmb3JlY2FzdC5ob29rLnRzYC5cbiAgICBpZiAoY3R4LmV2ZW50ID09PSAnYmVmb3JlVXBkYXRlJyAmJiBjdHguZGlzcGF0Y2g/Lm1vZGUgPT09ICdwZXItcm93JykgcmV0dXJuO1xuXG4gICAgLy8gVGhlIHJlZnVzYWwgZW52ZWxvcGUgKCMxMDc1KS4gTWlycm9yZWQgZnJvbSBgLi9fcmVmdXNhbC50c2AgYmVjYXVzZSBhXG4gICAgLy8gbG93ZXJlZCBib2R5IGhhcyBubyBtb2R1bGUgc2NvcGUgYW5kIGBleHRyYWN0SG9va0JvZHlgIFRIUk9XUyBvbiBhblxuICAgIC8vIGltcG9ydDsgYHRlc3QvcmVmdXNhbC1lbnZlbG9wZS50ZXN0LnRzYCBwaW5zIGV2ZXJ5IGNvcHkgYWdhaW5zdCBpdC5cbiAgICBmdW5jdGlvbiByZWZ1c2UoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb2RlOiBzdHJpbmcsXG4gICAgICBzdGF0dXM6IG51bWJlcixcbiAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmcgPSBtZXNzYWdlLFxuICAgICk6IEVycm9yIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29kZTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZztcbiAgICAgIH07XG4gICAgICBlcnIuY29kZSA9IGNvZGU7XG4gICAgICBlcnIuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgZXJyLnVzZXJNZXNzYWdlID0gdXNlck1lc3NhZ2U7XG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG5cbiAgICAvLyBMYW5kIGByZW1pbmRlcl9zZW50YCBhcyBhIHJlYWwgYm9vbGVhbiBvbiBpbnNlcnQsIG5ldmVyIE5VTEwuIFRoZVxuICAgIC8vIHRhc2tfZHVlX3JlbWluZGVyIHN3ZWVwIGRlLWR1cHMgb24gYHJlbWluZGVyX2RhdGVgIChjbGVhcmVkIGFmdGVyIGVhY2hcbiAgICAvLyBzZW5kKSwgbm90IG9uIHRoaXMgZmxhZyBcdTIwMTQgYnV0IGtlZXAgaXQgYSByZWFsIGJvb2xlYW4gc28gdGhlIGF1ZGl0IHRyYWlsXG4gICAgLy8gYW5kIGFueSBmdXR1cmUgYCE9IHRydWVgIGZpbHRlciBiZWhhdmUgdW5kZXIgU1FMIHRocmVlLXZhbHVlZCBsb2dpYy5cbiAgICBpZiAoIXByZXZpb3VzICYmIGlucHV0LnJlbWluZGVyX3NlbnQgPT0gbnVsbCkge1xuICAgICAgaW5wdXQucmVtaW5kZXJfc2VudCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIE1hdGVyaWFsaXNlIHRoZSB1cmdlbmN5IG9yZGluYWwgc28gdGhlIHRvLWRvIHF1ZXVlIGNhbiBzb3J0IGJ5IGl0IFx1MjAxNFxuICAgIC8vIHNvcnRpbmcgb24gYHByaW9yaXR5YCBpdHNlbGYgY29tcGFyZXMgcmF3IHN0cmluZ3MgYW5kIGludmVydHMgdXJnZW5jeS5cbiAgICBjb25zdCBlZmZQcmlvcml0eSA9XG4gICAgICAodHlwZW9mIGlucHV0LnByaW9yaXR5ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5wcmlvcml0eSkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXM/LnByaW9yaXR5ID09PSAnc3RyaW5nJyAmJiAocHJldmlvdXMucHJpb3JpdHkgYXMgc3RyaW5nKSkgfHxcbiAgICAgIHVuZGVmaW5lZDtcbiAgICAvL1xuICAgIC8vIElubGluZSBhbmQgZHVwbGljYXRlZCBpbiBjYXNlLmhvb2sudHMgb24gcHVycG9zZSBcdTIwMTQgTDIgaG9vayBib2RpZXMgcnVuXG4gICAgLy8gYm9keS1vbmx5IGluIHRoZSBRdWlja0pTIHNhbmRib3gsIHNvIGEgc2hhcmVkIG1vZHVsZSBjb25zdGFudCByZXNvbHZlcyBhdFxuICAgIC8vIGF1dGhvcmluZyB0aW1lIGFuZCBhcnJpdmVzIGFzIGB1bmRlZmluZWRgIChzZWUgX2xpbmUtaXRlbS1wcmljZS1maWxsLnRzKS5cbiAgICAvLyBUaGUgdm9jYWJ1bGFyaWVzIGRpZmZlciAobm9ybWFsIHZzIG1lZGl1bSksIGJ1dCB0aGUgVU5LTk9XTiBmYWxsYmFjayBtdXN0XG4gICAgLy8gbWF0Y2ggY3JtX2Nhc2U6IGAwYCwgdGhlIHVucmFua2VkIHNlbnRpbmVsIHRoYXQgc29ydHMgYmVsb3cgZXZlcnkgcmVhbFxuICAgIC8vIHJhbmsuIGB0ZXN0L3ByaW9yaXR5LXJhbmstcGFyaXR5LnRlc3QudHNgIHBpbnMgdGhhdCBhZ3JlZW1lbnQuXG4gICAgaWYgKGVmZlByaW9yaXR5KSB7XG4gICAgICBjb25zdCByYW5rOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0geyBsb3c6IDEsIG5vcm1hbDogMiwgaGlnaDogMywgdXJnZW50OiA0IH07XG4gICAgICBpbnB1dC5wcmlvcml0eV9yYW5rID0gcmFua1tlZmZQcmlvcml0eV0gPz8gMDtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXQuc3RhdHVzID09PSAnY29tcGxldGVkJyAmJiBwcmV2aW91cz8uc3RhdHVzICE9PSAnY29tcGxldGVkJykge1xuICAgICAgLy8gXHUyNkEwXHVGRTBGIGAhaW5wdXQuY29tcGxldGVkX2RhdGVgIEFMT05FIHdhcyB0aGUgZGVmZWN0LCBhbmQgYHx8ICFjdHguc2Vzc2lvbj8uaXNTeXN0ZW1gXG4gICAgICAvLyBpcyB0aGUgZml4IFx1MjAxNCBcdTI2RDQgZG8gbm90IHRpZHkgdGhlIHNlY29uZCBoYWxmIGF3YXkuIGBjb21wbGV0ZWRfZGF0ZWAgaXNcbiAgICAgIC8vIGByZWFkb25seTogdHJ1ZWAsIGFuZCBzaW5jZSBgQG9iamVjdHN0YWNrL29iamVjdHFsQDE3LjQuMGAgdGhlIGVuZ2luZSBzdHJpcHMgYVxuICAgICAgLy8gc3RhdGljIHJlYWRvbmx5IGZpZWxkIGZyb20gYSBOT04tU1lTVEVNIGNhbGxlcidzIElOU0VSVCB0b28sIG5vdCBqdXN0IHRoZWlyXG4gICAgICAvLyBVUERBVEUgKHRoZSByZXRpcmVkLXBpbiBub3RlIGluIGB0ZXN0L3JlYWRvbmx5LXdyaXRlLXNlbWFudGljcy50ZXN0LnRzYCBjYXJyaWVzXG4gICAgICAvLyB0aGF0IG1pZ3JhdGlvbikuIE1lYXN1cmVkIGFnYWluc3QgYSBydW5uaW5nIHNlcnZlciBvbiB0aGUgMTcuNC4wIHBpbjogdGhpc1xuICAgICAgLy8gaGFuZGxlciBzdGlsbCBTRUVTIHRoZSBjYWxsZXIncyB2YWx1ZSBcdTIwMTQgdGhlIHN0cmlwIHJ1bnMgYWZ0ZXIgYGJlZm9yZUluc2VydGBcbiAgICAgIC8vIHJldHVybnMgXHUyMDE0IGFuZCB0aGUgdmFsdWUgVEhJUyBsaW5lIHdyaXRlcyBzdXJ2aXZlcyBpdCwgYmVjYXVzZSBhIGhvb2std3JpdHRlblxuICAgICAgLy8ga2V5IGlzIG5vdCBjYWxsZXItc3VwcGxpZWQuXG4gICAgICAvL1xuICAgICAgLy8gU28gZGVmZXJyaW5nIHRvIGEgc3VwcGxpZWQgdmFsdWUgaW52ZXJ0ZWQgdGhlIHJ1bGUgYmVsb3cgaXQ6IGEgY2FsbGVyIHdobyBzZW50XG4gICAgICAvLyBgY29tcGxldGVkX2RhdGVgIHN1cHByZXNzZWQgdGhlIG9ubHkgc3RhbXAgdGhlcmUgd2FzLCB0aGUgZW5naW5lIHRoZW4gZGVsZXRlZFxuICAgICAgLy8gd2hhdCB0aGV5IHNlbnQsIGFuZCBgY29tcGxldGVkX2RhdGVfcmVxdWlyZWRgIHJlamVjdGVkIHRoZSBvbmUgY2FsbCB0aGF0IGhhZFxuICAgICAgLy8gYWN0dWFsbHkgc3VwcGxpZWQgdGhlIGZpZWxkIFx1MjAxNCB3aGlsZSBvbWl0dGluZyBpdCBzdWNjZWVkZWQuIFRoZSBlcnJvciBuYW1lZCB0aGVcbiAgICAgIC8vIGZpZWxkIHdob3NlIFBSRVNFTkNFIGNhdXNlZCBpdCwgc28gYW4gYWdlbnQgcmV0cmllZCBieSBzZW5kaW5nIGl0IGFnYWluLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBgaXNTeXN0ZW1gIGhhbGYgaXMgbm90IGRlY29yYXRpb246IG5vdGhpbmcgc3RyaXBzIGEgc3lzdGVtIHdyaXRlLCBhbmRcbiAgICAgIC8vIGBzcmMvc2FsZXMvZGF0YS9hY3Rpdml0eS5zZWVkLnRzYCBiYWNrLWRhdGVzIGNvbXBsZXRpb25zIHdpdGggYGRheXNBZ28oMylgIC9cbiAgICAgIC8vIGBkYXlzQWdvKDIpYC4gU3RhbXBpbmcgb3ZlciB0aG9zZSB3b3VsZCByZXBsYXkgdGhlIGRlbW8gYm9vayB3aXRoIGV2ZXJ5XG4gICAgICAvLyBjb21wbGV0aW9uIGRhdGVkIHRvZGF5LlxuICAgICAgaWYgKCFpbnB1dC5jb21wbGV0ZWRfZGF0ZSB8fCAhY3R4LnNlc3Npb24/LmlzU3lzdGVtKSB7XG4gICAgICAgIGlucHV0LmNvbXBsZXRlZF9kYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBpbnB1dC5wcm9ncmVzc19wZXJjZW50ICE9PSAnbnVtYmVyJykgaW5wdXQucHJvZ3Jlc3NfcGVyY2VudCA9IDEwMDtcbiAgICB9XG5cbiAgICAvLyBEZXJpdmVkIGZsYWdzLlxuICAgIGNvbnN0IGVmZlN0YXR1cyA9XG4gICAgICAodHlwZW9mIGlucHV0LnN0YXR1cyA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3RhdHVzKSB8fFxuICAgICAgKHR5cGVvZiBwcmV2aW91cz8uc3RhdHVzID09PSAnc3RyaW5nJyAmJiAocHJldmlvdXMuc3RhdHVzIGFzIHN0cmluZykpIHx8XG4gICAgICB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBlZmZTdGF0dXMgPT09ICdzdHJpbmcnKSBpbnB1dC5pc19jb21wbGV0ZWQgPSBlZmZTdGF0dXMgPT09ICdjb21wbGV0ZWQnO1xuICAgIGNvbnN0IGVmZkR1ZSA9XG4gICAgICAodHlwZW9mIGlucHV0LmR1ZV9kYXRlID09PSAnc3RyaW5nJyAmJiBpbnB1dC5kdWVfZGF0ZSkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXM/LmR1ZV9kYXRlID09PSAnc3RyaW5nJyAmJiAocHJldmlvdXMuZHVlX2RhdGUgYXMgc3RyaW5nKSkgfHxcbiAgICAgIHVuZGVmaW5lZDtcbiAgICBjb25zdCB0b2RheVN0ciA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gICAgaW5wdXQuaXNfb3ZlcmR1ZSA9ICEhZWZmRHVlICYmIGVmZkR1ZS5zbGljZSgwLCAxMCkgPCB0b2RheVN0ciAmJiBpbnB1dC5pc19jb21wbGV0ZWQgIT09IHRydWU7XG5cbiAgICBjb25zdCByZW1pbmRlciA9XG4gICAgICAodHlwZW9mIGlucHV0LnJlbWluZGVyX2RhdGUgPT09ICdzdHJpbmcnICYmIGlucHV0LnJlbWluZGVyX2RhdGUpIHx8XG4gICAgICAodHlwZW9mIHByZXZpb3VzPy5yZW1pbmRlcl9kYXRlID09PSAnc3RyaW5nJyAmJiAocHJldmlvdXMucmVtaW5kZXJfZGF0ZSBhcyBzdHJpbmcpKSB8fFxuICAgICAgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGR1ZSA9XG4gICAgICAodHlwZW9mIGlucHV0LmR1ZV9kYXRlID09PSAnc3RyaW5nJyAmJiBpbnB1dC5kdWVfZGF0ZSkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXM/LmR1ZV9kYXRlID09PSAnc3RyaW5nJyAmJiAocHJldmlvdXMuZHVlX2RhdGUgYXMgc3RyaW5nKSkgfHxcbiAgICAgIHVuZGVmaW5lZDtcbiAgICBpZiAocmVtaW5kZXIgJiYgZHVlICYmIHJlbWluZGVyLnNsaWNlKDAsIDEwKSA+IGR1ZS5zbGljZSgwLCAxMCkpIHtcbiAgICAgIHRocm93IHJlZnVzZShcbiAgICAgICAgYFJlbWluZGVyICgke3JlbWluZGVyfSkgaXMgYWZ0ZXIgdGhlIGR1ZSBkYXRlICgke2R1ZX0pOyByZW1pbmRlcnMgc2hvdWxkIGZpcmUgYmVmb3JlIHRoZSBkZWFkbGluZS5gLFxuICAgICAgICAnVkFMSURBVElPTl9GQUlMRUQnLFxuICAgICAgICA0MDAsXG4gICAgICApO1xuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogUmVjdXJyaW5nLXRhc2sgZ2VuZXJhdG9yLlxuICpcbiAqIFRoZSBzY2hlbWEgY2FycmllcyBgaXNfcmVjdXJyaW5nYCAvIGByZWN1cnJlbmNlX3R5cGVgIC8gYHJlY3VycmVuY2VfaW50ZXJ2YWxgXG4gKiAvIGByZWN1cnJlbmNlX2VuZF9kYXRlYCwgYnV0IG5vdGhpbmcgZXZlciBzcGF3bmVkIHRoZSBuZXh0IG9jY3VycmVuY2UgXHUyMDE0IHNvIGFcbiAqIFwicmVjdXJyaW5nXCIgdGFzayB3YXMgcmVjdXJyaW5nIGluIG5hbWUgb25seS4gT24gdGhlIGNvbXBsZXRpbmcgdHJhbnNpdGlvbiBvZiBhXG4gKiByZWN1cnJpbmcgdGFzaywgdGhpcyBjbG9uZXMgaXQgd2l0aCBgZHVlX2RhdGVgIChhbmQgYHJlbWluZGVyX2RhdGVgKSBhZHZhbmNlZFxuICogYnkgYHJlY3VycmVuY2VfdHlwZSBcdTAwRDcgaW50ZXJ2YWxgLCB1bnRpbCBgcmVjdXJyZW5jZV9lbmRfZGF0ZWAgaXMgcGFzc2VkLlxuICpcbiAqIERvbmUgaW4gYSBob29rIChub3QgYSBmbG93KSBiZWNhdXNlIHRoZSBuZXh0IGR1ZSBkYXRlIG5lZWRzIHJlYWwgY2FsZW5kYXIgbWF0aFxuICogKG1vbnRoL3llYXIgcm9sbG92ZXIpOyB0aGUgZmxvdyBydW50aW1lJ3MgYHtOT1coKStufWAgb25seSBkb2VzIGRheSBvZmZzZXRzIGFuZFxuICogaGFzIG5vIGBEQVRFQUREYC4gVGhlIHNwYXduZWQgdGFzayBpcyBgbm90X3N0YXJ0ZWRgLCBzbyBpdCBuZXZlciByZS10cmlnZ2Vyc1xuICogdGhpcyBjb21wbGV0aW9uIGhvb2sgKG5vIHJlY3Vyc2lvbikuXG4gKi9cbmNvbnN0IHRhc2tSZWN1cnJlbmNlOiBIb29rID0ge1xuICBuYW1lOiAndGFza19yZWN1cnJlbmNlJyxcbiAgb2JqZWN0OiAnY3JtX3Rhc2snLFxuICBldmVudHM6IFsnYWZ0ZXJVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDcwMCxcbiAgYXN5bmM6IHRydWUsXG4gIG9uRXJyb3I6ICdsb2cnLFxuICBkZXNjcmlwdGlvbjogJ09uIGNvbXBsZXRpb24gb2YgYSByZWN1cnJpbmcgdGFzaywgc3Bhd24gdGhlIG5leHQgb2NjdXJyZW5jZSAoZGF0ZXMgYWR2YW5jZWQgYnkgcmVjdXJyZW5jZV90eXBlIFx1MDBENyBpbnRlcnZhbCkuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvKipcbiAgICAgKiBBZHZhbmNlIGEgZGF0ZSBieSBgaW50ZXJ2YWxgIHVuaXRzIG9mIHRoZSBnaXZlbiByZWN1cnJlbmNlIHR5cGUuXG4gICAgICpcbiAgICAgKiBEZWNsYXJlZCBJTlNJREUgdGhlIGhhbmRsZXIsIG1hdGNoaW5nIGV2ZXJ5IG90aGVyIGhvb2sgaW4gdGhpcyBkaXJlY3Rvcnk6XG4gICAgICogTDIgaG9vayBib2RpZXMgcnVuIGJvZHktb25seSBpbiB0aGUgUXVpY2tKUyBzYW5kYm94LCB3aGVyZSBtb2R1bGUgc2NvcGVcbiAgICAgKiBpcyBub3QgYXZhaWxhYmxlIChjZi4gb3Bwb3J0dW5pdHkuaG9vay50cyAvIGxlYWQuaG9vay50cykuIFRoaXMgd2FzIHRoZVxuICAgICAqIG9uZSBtb2R1bGUtbGV2ZWwgaGVscGVyIGxlZnQgaW4gdGhlIHRyZWUuXG4gICAgICpcbiAgICAgKiBNb250aCBhbmQgeWVhciBzdGVwcyBDTEFNUCB0byB0aGUgbGFzdCB2YWxpZCBkYXkgb2YgdGhlIHRhcmdldCBtb250aFxuICAgICAqIGluc3RlYWQgb2Ygb3ZlcmZsb3dpbmcuIGBEYXRlLnNldE1vbnRoYCByb2xscyBhIGRheSB0aGF0IGRvZXMgbm90IGV4aXN0XG4gICAgICogZm9yd2FyZCBpbnRvIHRoZSBuZXh0IG1vbnRoIFx1MjAxNCBKYW4gMzEgKyAxIG1vbnRoIGxhbmRlZCBvbiBNYXIgMywgc28gYVxuICAgICAqIG1vbnRoLWVuZCByZWN1cnJpbmcgdGFzayB3YWxrZWQgZnVydGhlciBpbnRvIHRoZSBmb2xsb3dpbmcgbW9udGggb24gZXZlcnlcbiAgICAgKiBvY2N1cnJlbmNlIGFuZCwgZm9yIHRoZSAzMXN0LCBza2lwcGVkIEZlYnJ1YXJ5IGVudGlyZWx5LlxuICAgICAqXG4gICAgICogXHUyNkEwXHVGRTBGIEV2ZXJ5IHJlYWQgYW5kIHdyaXRlIGJlbG93IGlzIG9uIHRoZSBVVEMgY2FsZW5kYXIsIGFuZCB0aGF0IGlzIHRoZVxuICAgICAqIHdob2xlIHBvaW50IG9mIHRoZSBzcGVsbGluZyByYXRoZXIgdGhhbiBhIHN0eWxlIGNob2ljZS4gVGhlIGJhc2UgaXMgdGhlXG4gICAgICogc3RvcmVkIGBkdWVfZGF0ZWAgXHUyMDE0IGEgYmFyZSBgWVlZWS1NTS1ERGAsIHdoaWNoIHRoZSBzcGVjJ3MgZGF0ZS1vbmx5IGZvcm1cbiAgICAgKiBhbmNob3JzIGF0IFVUQyBtaWRuaWdodCBcdTIwMTQgYW5kIHRoZSByZXN1bHQgaXMgcmVuZGVyZWQgd2l0aFxuICAgICAqIGB0b0lTT1N0cmluZygpYC4gQSBsb2NhbCBgZ2V0RGF0ZWAvYHNldERhdGVgL2BzZXRNb250aGAgc3RlcCBpbiBiZXR3ZWVuXG4gICAgICogcmVhZHMgdGhhdCBVVEMgYW5jaG9yIG9uIGEgZGlmZmVyZW50IGNhbGVuZGFyICh3ZXN0IG9mIEdyZWVud2ljaCBpdCBpc1xuICAgICAqIHRoZSBwcmV2aW91cyBldmVuaW5nLCBzbyBgZ2V0RGF0ZSgpYCBvbiBgMjAyNi0wMS0xNWAgYW5zd2VycyAxNCkgYW5kXG4gICAgICogcHJlc2VydmVzIHdhbGwtY2xvY2sgdGltZSBhY3Jvc3MgYSBEU1QgdHJhbnNpdGlvbiwgd2hpY2ggaXMgYSAyMyBoIG9yXG4gICAgICogMjUgaCBkYXkuIEJvdGggZXJyb3JzIHJlbmRlciBhcyBhIGRheSB0aGUgc2VyaWVzIG5ldmVyIHJlY292ZXJzIGZyb206XG4gICAgICogZWFjaCBvY2N1cnJlbmNlIGlzIGNvbXB1dGVkIGZyb20gdGhlIHByZXZpb3VzIG9uZS5cbiAgICAgKlxuICAgICAqIFRoZSBjbGFtcCBwcm9iZSBpcyBidWlsdCB3aXRoIGBEYXRlLlVUQ2AgZm9yIHRoZSBzYW1lIHJlYXNvbiBcdTIwMTQgYVxuICAgICAqIGBuZXcgRGF0ZSh5LCBtLCBkKWAgY29uc3RydWN0b3IgcmVhZHMgaXRzIGFyZ3VtZW50cyBhcyBMT0NBTCBmaWVsZHMsIHNvXG4gICAgICogaXQgd291bGQgYW5zd2VyIHRoZSBsZW5ndGggb2YgdGhlIHdyb25nIG1vbnRoIGF0IGVpdGhlciBlbmQgb2YgdGhlIHllYXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWR2YW5jZURhdGUoZDogRGF0ZSwgdHlwZTogc3RyaW5nLCBpbnRlcnZhbDogbnVtYmVyKTogRGF0ZSB7XG4gICAgICBjb25zdCBuZXh0ID0gbmV3IERhdGUoZCk7XG4gICAgICBpZiAodHlwZSA9PT0gJ2RhaWx5Jykge1xuICAgICAgICBuZXh0LnNldFVUQ0RhdGUobmV4dC5nZXRVVENEYXRlKCkgKyBpbnRlcnZhbCk7XG4gICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09ICd3ZWVrbHknKSB7XG4gICAgICAgIG5leHQuc2V0VVRDRGF0ZShuZXh0LmdldFVUQ0RhdGUoKSArIDcgKiBpbnRlcnZhbCk7XG4gICAgICAgIHJldHVybiBuZXh0O1xuICAgICAgfVxuICAgICAgY29uc3QgbW9udGhzID0gdHlwZSA9PT0gJ21vbnRobHknID8gaW50ZXJ2YWwgOiB0eXBlID09PSAneWVhcmx5JyA/IDEyICogaW50ZXJ2YWwgOiAwO1xuICAgICAgaWYgKG1vbnRocyA9PT0gMCkgcmV0dXJuIG5leHQ7XG5cbiAgICAgIGNvbnN0IGRheSA9IG5leHQuZ2V0VVRDRGF0ZSgpO1xuICAgICAgLy8gTW92ZSB0byB0aGUgMXN0IGZpcnN0IHNvIHRoZSBtb250aCBhcml0aG1ldGljIGNhbiBuZXZlciBvdmVyZmxvdywgdGhlblxuICAgICAgLy8gY2xhbXAgdGhlIGRheSB0byB0aGUgdGFyZ2V0IG1vbnRoJ3MgbGVuZ3RoLlxuICAgICAgbmV4dC5zZXRVVENEYXRlKDEpO1xuICAgICAgbmV4dC5zZXRVVENNb250aChuZXh0LmdldFVUQ01vbnRoKCkgKyBtb250aHMpO1xuICAgICAgY29uc3QgbGFzdERheU9mVGFyZ2V0TW9udGggPSBuZXcgRGF0ZShEYXRlLlVUQyhcbiAgICAgICAgbmV4dC5nZXRVVENGdWxsWWVhcigpLCBuZXh0LmdldFVUQ01vbnRoKCkgKyAxLCAwLFxuICAgICAgKSkuZ2V0VVRDRGF0ZSgpO1xuICAgICAgbmV4dC5zZXRVVENEYXRlKE1hdGgubWluKGRheSwgbGFzdERheU9mVGFyZ2V0TW9udGgpKTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH1cblxuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcblxuICAgIC8vIEZpcmUgb25seSBvbiB0aGUgdHJhbnNpdGlvbiBJTlRPIGNvbXBsZXRlZCAobm90IG9uIGxhdGVyIGVkaXRzIG9mIGFuXG4gICAgLy8gYWxyZWFkeS1jb21wbGV0ZWQgdGFzaykuXG4gICAgY29uc3Qgbm93RG9uZSA9IGlucHV0LnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcgfHwgaW5wdXQuaXNfY29tcGxldGVkID09PSB0cnVlO1xuICAgIGNvbnN0IHdhc0RvbmUgPSBwcmV2aW91cz8uc3RhdHVzID09PSAnY29tcGxldGVkJyB8fCBwcmV2aW91cz8uaXNfY29tcGxldGVkID09PSB0cnVlO1xuICAgIGlmICghbm93RG9uZSB8fCB3YXNEb25lKSByZXR1cm47XG5cbiAgICBjb25zdCByOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0geyAuLi4ocHJldmlvdXMgPz8ge30pLCAuLi5pbnB1dCB9O1xuICAgIGlmIChyLmlzX3JlY3VycmluZyAhPT0gdHJ1ZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiByLnJlY3VycmVuY2VfdHlwZSA9PT0gJ3N0cmluZycgPyByLnJlY3VycmVuY2VfdHlwZSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIXR5cGUgfHwgIVsnZGFpbHknLCAnd2Vla2x5JywgJ21vbnRobHknLCAneWVhcmx5J10uaW5jbHVkZXModHlwZSkpIHJldHVybjtcbiAgICBjb25zdCBpbnRlcnZhbCA9IE51bWJlcihyLnJlY3VycmVuY2VfaW50ZXJ2YWwpID4gMCA/IE51bWJlcihyLnJlY3VycmVuY2VfaW50ZXJ2YWwpIDogMTtcblxuICAgIGNvbnN0IGJhc2VEdWUgPSByLmR1ZV9kYXRlID8gbmV3IERhdGUoci5kdWVfZGF0ZSkgOiBuZXcgRGF0ZSgpO1xuICAgIGlmIChpc05hTihiYXNlRHVlLmdldFRpbWUoKSkpIHJldHVybjtcbiAgICBjb25zdCBuZXh0RHVlID0gYWR2YW5jZURhdGUoYmFzZUR1ZSwgdHlwZSwgaW50ZXJ2YWwpO1xuXG4gICAgLy8gU3RvcCB0aGUgc2VyaWVzIG9uY2UgdGhlIG5leHQgb2NjdXJyZW5jZSB3b3VsZCBmYWxsIHBhc3QgdGhlIGVuZCBkYXRlLlxuICAgIGlmIChyLnJlY3VycmVuY2VfZW5kX2RhdGUpIHtcbiAgICAgIGNvbnN0IGVuZCA9IG5ldyBEYXRlKHIucmVjdXJyZW5jZV9lbmRfZGF0ZSk7XG4gICAgICBpZiAoIWlzTmFOKGVuZC5nZXRUaW1lKCkpICYmIG5leHREdWUgPiBlbmQpIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkb2M6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICBzdWJqZWN0OiByLnN1YmplY3QsXG4gICAgICBkZXNjcmlwdGlvbjogci5kZXNjcmlwdGlvbiA/PyBudWxsLFxuICAgICAgcHJpb3JpdHk6IHIucHJpb3JpdHksXG4gICAgICB0eXBlOiByLnR5cGUgPz8gbnVsbCxcbiAgICAgIG93bmVyX2lkOiByLm93bmVyX2lkID8/IG51bGwsXG4gICAgICBzdGF0dXM6ICdub3Rfc3RhcnRlZCcsXG4gICAgICBpc19jb21wbGV0ZWQ6IGZhbHNlLFxuICAgICAgcmVtaW5kZXJfc2VudDogZmFsc2UsXG4gICAgICBkdWVfZGF0ZTogbmV4dER1ZS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKSxcbiAgICAgIGlzX3JlY3VycmluZzogdHJ1ZSxcbiAgICAgIHJlY3VycmVuY2VfdHlwZTogdHlwZSxcbiAgICAgIHJlY3VycmVuY2VfaW50ZXJ2YWw6IGludGVydmFsLFxuICAgICAgcmVjdXJyZW5jZV9lbmRfZGF0ZTogci5yZWN1cnJlbmNlX2VuZF9kYXRlID8/IG51bGwsXG4gICAgICByZWxhdGVkX3RvX3R5cGU6IHIucmVsYXRlZF90b190eXBlID8/IG51bGwsXG4gICAgICByZWxhdGVkX3RvX2FjY291bnQ6IHIucmVsYXRlZF90b19hY2NvdW50ID8/IG51bGwsXG4gICAgICByZWxhdGVkX3RvX2NvbnRhY3Q6IHIucmVsYXRlZF90b19jb250YWN0ID8/IG51bGwsXG4gICAgICByZWxhdGVkX3RvX29wcG9ydHVuaXR5OiByLnJlbGF0ZWRfdG9fb3Bwb3J0dW5pdHkgPz8gbnVsbCxcbiAgICAgIHJlbGF0ZWRfdG9fbGVhZDogci5yZWxhdGVkX3RvX2xlYWQgPz8gbnVsbCxcbiAgICAgIHJlbGF0ZWRfdG9fY2FzZTogci5yZWxhdGVkX3RvX2Nhc2UgPz8gbnVsbCxcbiAgICB9O1xuICAgIGlmIChyLnJlbWluZGVyX2RhdGUpIHtcbiAgICAgIGNvbnN0IGJhc2VSZW0gPSBuZXcgRGF0ZShyLnJlbWluZGVyX2RhdGUpO1xuICAgICAgaWYgKCFpc05hTihiYXNlUmVtLmdldFRpbWUoKSkpIGRvYy5yZW1pbmRlcl9kYXRlID0gYWR2YW5jZURhdGUoYmFzZVJlbSwgdHlwZSwgaW50ZXJ2YWwpLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV90YXNrJykuaW5zZXJ0KGRvYyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBCZXN0LWVmZm9ydDsgbmV2ZXIgYnJlYWsgdGhlIHBhcmVudCB3cml0ZS4gTm8gYGNvbnNvbGVgIGluIHRoZSBMMiBob29rXG4gICAgICAvLyBzYW5kYm94IFx1MjAxNCBsb2dnaW5nIGhlcmUgd291bGQgdGhyb3cgaXRzIG93biBSZWZlcmVuY2VFcnJvciAoY2YuICM0NzEpLlxuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogVGhlIGFjdGl2aXR5IGJ1YmJsZSdzIHRhc2sgdHdpbi5cbiAqXG4gKiBgcnVuQXM6ICdzeXN0ZW0nYCAoIzIwMTQsIEFHRU5UUy5tZCBydWxlIDkpIGFuZCB0aGUgb3JnYW5pemF0aW9uIHBpbiAocnVsZVxuICogMTApIGZvciB0aGUgcmVhc29ucyBgZXZlbnRfYWN0aXZpdHlfYnViYmxlYCByZWNvcmRzIFx1MjAxNCByZWFkIHRoYXQgbm90ZS4gVGhlXG4gKiBtZWFzdXJlbWVudCB0aGF0IHB1dCB0aGlzIGNvcHkgb24gdGhlIGNhcmQ6IGEgc2VydmljZSBhZ2VudCBjb21wbGV0aW5nIGFcbiAqIHRhc2sgb24gdGhlaXIgb3duIGNhc2UgbGVmdCB0aGUgY2FzZSBhY2NvdW50J3MgYGxhc3RfYWN0aXZpdHlfZGF0ZWAgZW1wdHksXG4gKiB3aGlsZSBhbiBhZG1pbidzIGlkZW50aWNhbCBjb21wbGV0aW9uIHN0YW1wZWQgaXQgKDE3LjcuMCk7IGEgcmVwJ3NcbiAqIGNvbXBsZXRlZCB0YXNrIG9uIHRoZWlyIG93biBkZWFsIHJlYWNoZWQgbmVpdGhlciB0aGUgYWNjb3VudCBub3IgdGhlXG4gKiBjb250YWN0IGEgbWFuYWdlciBvd25zLlxuICovXG5jb25zdCB0YXNrQnViYmxlOiBIb29rID0ge1xuICBuYW1lOiAndGFza19hY3Rpdml0eV9idWJibGUnLFxuICBvYmplY3Q6ICdjcm1fdGFzaycsXG4gIGV2ZW50czogWydhZnRlclVwZGF0ZSddLFxuICBwcmlvcml0eTogODAwLFxuICBhc3luYzogdHJ1ZSxcbiAgb25FcnJvcjogJ2xvZycsXG4gIHJ1bkFzOiAnc3lzdGVtJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ0EgY29tcGxldGVkIHRhc2sgc3RhbXBzIGludGVyYWN0aW9uIHJlY2VuY3kgb24gdGhlIHJlbGF0ZWQgYWNjb3VudCAod2Fsa2luZyB1cCBmcm9tIGNvbnRhY3Qvb3Bwb3J0dW5pdHkvY2FzZSksIGxlYWQgYW5kIGNvbnRhY3QuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvKlxuICAgICAqIFRoZSBhY3Rpdml0eSBidWJibGUsIHNlY29uZCBjb3B5LiBgc3JjL3NhbGVzL29iamVjdHMvZXZlbnQuaG9vay50c2AgY2FycmllcyB0aGVcbiAgICAgKiBjYW5vbmljYWwgb25lIGFuZCB0aGUgcmF0aW9uYWxlOyB0aGlzIGlzIGEgZGVsaWJlcmF0ZSB2ZXJiYXRpbSBkdXBsaWNhdGUsXG4gICAgICogbm90IGRyaWZ0IFx1MjAxNCBhbiBMMiBob29rIGJvZHkgc2hpcHMgYm9keS1vbmx5IGludG8gdGhlIFF1aWNrSlMgc2FuZGJveCwgc28gYVxuICAgICAqIHNoYXJlZCBtb2R1bGUgaGVscGVyIHJlc29sdmVzIGF0IGF1dGhvcmluZyB0aW1lIGFuZCBhcnJpdmVzIGB1bmRlZmluZWRgIGF0XG4gICAgICogcnVudGltZSAoc2FtZSBjb25zdHJhaW50IGFzIGBfbGluZS1pdGVtLXByaWNlLWZpbGwudHNgIGFuZCB0aGVcbiAgICAgKiBgcHJpb3JpdHlfcmFua2AgdGFibGUgYWJvdmUpLiBgdGVzdC9hY3Rpdml0eS1yZWNlbmN5LnRlc3QudHNgIHJ1bnMgQk9USFxuICAgICAqIGNvcGllcyB0aHJvdWdoIHRoZSBzYW1lIGNhc2VzIHNvIHRoZXkgY2Fubm90IGRpdmVyZ2Ugc2lsZW50bHkuXG4gICAgICpcbiAgICAgKiBcdTI2RDQgVHdvIHByb3BlcnRpZXMgdGhpcyBtdXN0IGtlZXA6XG4gICAgICpcbiAgICAgKiAgIDEuIEl0IGRvZXMgTk9UIGtleSBvZmYgYHJlbGF0ZWRfdG9fdHlwZWAuIFRoYXQgZGlzY3JpbWluYXRvciBpcyBhXG4gICAgICogICAgICBkaXNwbGF5IGhpbnQgYSByZXAgY2FuIGxlYXZlIGJsYW5rLCBhbmQgYSB0YXNrIHdpdGggYSBwZXJmZWN0bHkgZ29vZFxuICAgICAqICAgICAgYHJlbGF0ZWRfdG9fYWNjb3VudGAgdGhlbiBidWJibGVzIHRvIG5vdGhpbmcgYXQgYWxsLlxuICAgICAqICAgMi4gSXQgV0FMS1MgVVAgdG8gdGhlIGFjY291bnQuIEEgcmVwIGNvbXBsZXRlcyBhIHRhc2sgb24gdGhlXG4gICAgICogICAgICBvcHBvcnR1bml0eSwgbm90IG9uIHRoZSBhY2NvdW50IHJvdywgc28gYnViYmxpbmcgb25seSB0byB0aGUgbmFtZWRcbiAgICAgKiAgICAgIHJlY29yZCBsZWF2ZXMgYGNybV9hY2NvdW50Lmxhc3RfYWN0aXZpdHlfZGF0ZWAgdW50b3VjaGVkIHRocm91Z2ggYW5cbiAgICAgKiAgICAgIGVudGlyZSBkZWFsIFx1MjAxNCBhbmQgYGF0X3Jpc2tfYWNjb3VudHNgIHRoZW4gbGlzdHMgYWN0aXZlIGN1c3RvbWVycy5cbiAgICAgKi9cbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXBpKSByZXR1cm47XG5cbiAgICAvLyBSZWNlbmN5IG1lYW5zIHRoZSBpbnRlcmFjdGlvbiBIQVBQRU5FRC4gQW4gb3BlbiB0YXNrIGlzIGEgcHJvbWlzZSwgbm90XG4gICAgLy8gY29udGFjdDsgb25seSB0aGUgY29tcGxldGluZyB0cmFuc2l0aW9uIGJ1YmJsZXMuXG4gICAgY29uc3Qgbm93RG9uZSA9IGlucHV0LnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCcgfHwgaW5wdXQuaXNfY29tcGxldGVkID09PSB0cnVlO1xuICAgIGNvbnN0IHdhc0RvbmUgPSBwcmV2aW91cz8uc3RhdHVzID09PSAnY29tcGxldGVkJyB8fCBwcmV2aW91cz8uaXNfY29tcGxldGVkID09PSB0cnVlO1xuICAgIGlmICghbm93RG9uZSB8fCB3YXNEb25lKSByZXR1cm47XG5cbiAgICBjb25zdCByOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0geyAuLi4ocHJldmlvdXMgPz8ge30pLCAuLi5pbnB1dCB9O1xuXG4gICAgY29uc3Qgbm93SXNvID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIC8vIGBjcm1fYWNjb3VudC5sYXN0X2FjdGl2aXR5X2RhdGVgIGlzIGEgREFURSBjb2x1bW47IHRoZSB0d28gY29udGFjdFxuICAgIC8vIHRpbWVzdGFtcHMgYXJlIGRhdGV0aW1lcy5cbiAgICBjb25zdCB0b2RheSA9IG5vd0lzby5zbGljZSgwLCAxMCk7XG5cbiAgICBjb25zdCBpZE9mID0gKGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+XG4gICAgICB0eXBlb2YgcltrZXldID09PSAnc3RyaW5nJyAmJiByW2tleV0ubGVuZ3RoID4gMCA/IChyW2tleV0gYXMgc3RyaW5nKSA6IHVuZGVmaW5lZDtcbiAgICAvLyBUaGUgcnVsZS0xMCBwaW4gXHUyMDE0IHNlZSBgZXZlbnRfYWN0aXZpdHlfYnViYmxlYCdzIG5vdGUuXG4gICAgY29uc3Qgb3JnID0gaWRPZignb3JnYW5pemF0aW9uX2lkJyk7XG4gICAgY29uc3QgaW5Pcmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSBvcmcgPyB7IG9yZ2FuaXphdGlvbl9pZDogb3JnIH0gOiB7fTtcblxuICAgIGNvbnN0IGFjY291bnRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBjb25zdCBjb250YWN0SWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3QgbGVhZElkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3QgZGlyZWN0ID0gaWRPZigncmVsYXRlZF90b19hY2NvdW50Jyk7XG4gICAgaWYgKGRpcmVjdCkgYWNjb3VudElkcy5hZGQoZGlyZWN0KTtcbiAgICBjb25zdCBjb250YWN0SWQgPSBpZE9mKCdyZWxhdGVkX3RvX2NvbnRhY3QnKTtcbiAgICBpZiAoY29udGFjdElkKSBjb250YWN0SWRzLmFkZChjb250YWN0SWQpO1xuICAgIGNvbnN0IGxlYWRJZCA9IGlkT2YoJ3JlbGF0ZWRfdG9fbGVhZCcpO1xuICAgIGlmIChsZWFkSWQpIGxlYWRJZHMuYWRkKGxlYWRJZCk7XG5cbiAgICBjb25zdCBwYXJlbnRMb29rdXBzOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtcbiAgICAgIFsncmVsYXRlZF90b19jb250YWN0JywgJ2NybV9jb250YWN0J10sXG4gICAgICBbJ3JlbGF0ZWRfdG9fb3Bwb3J0dW5pdHknLCAnY3JtX29wcG9ydHVuaXR5J10sXG4gICAgICBbJ3JlbGF0ZWRfdG9fY2FzZScsICdjcm1fY2FzZSddLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBbZmllbGQsIG9iamVjdF0gb2YgcGFyZW50TG9va3Vwcykge1xuICAgICAgY29uc3QgaWQgPSBpZE9mKGZpZWxkKTtcbiAgICAgIGlmICghaWQpIGNvbnRpbnVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmF3OiBhbnkgPSBhd2FpdCBhcGkub2JqZWN0KG9iamVjdCkuZmluZCh7XG4gICAgICAgICAgd2hlcmU6IHsgaWQsIC4uLmluT3JnIH0sXG4gICAgICAgICAgZmllbGRzOiBbJ2NybV9hY2NvdW50J10sXG4gICAgICAgICAgdG9wOiAxLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgcm93cyA9IEFycmF5LmlzQXJyYXkocmF3KSA/IHJhdyA6IChyYXc/LnJlY29yZHMgPz8gW10pO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSByb3dzLmxlbmd0aCA/IHJvd3NbMF0uY3JtX2FjY291bnQgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgcGFyZW50ID09PSAnc3RyaW5nJyAmJiBwYXJlbnQubGVuZ3RoID4gMCkgYWNjb3VudElkcy5hZGQocGFyZW50KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBCZXN0LWVmZm9ydDogYSBwYXJlbnQgdGhhdCBjYW5ub3QgYmUgcmVhZCBpcyBub3QgYnViYmxlZCB0aHJvdWdoLlxuICAgICAgICAvLyBObyBgY29uc29sZWAgaW4gdGhlIEwyIGhvb2sgc2FuZGJveCAoY2YuICM0NzEpLlxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHM6IEFycmF5PFtzdHJpbmcsIFNldDxzdHJpbmc+LCBSZWNvcmQ8c3RyaW5nLCBhbnk+XT4gPSBbXG4gICAgICBbJ2NybV9hY2NvdW50JywgYWNjb3VudElkcywgeyBsYXN0X2FjdGl2aXR5X2RhdGU6IHRvZGF5IH1dLFxuICAgICAgWydjcm1fY29udGFjdCcsIGNvbnRhY3RJZHMsIHsgbGFzdF9jb250YWN0ZWRfZGF0ZTogbm93SXNvIH1dLFxuICAgICAgWydjcm1fbGVhZCcsIGxlYWRJZHMsIHsgbGFzdF9jb250YWN0ZWRfZGF0ZTogbm93SXNvIH1dLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBbb2JqZWN0LCBpZHMsIGRvY10gb2YgdGFyZ2V0cykge1xuICAgICAgbGV0IGluc2lkZSA9IFsuLi5pZHNdO1xuICAgICAgaWYgKG9yZyAmJiBpbnNpZGUubGVuZ3RoID4gMCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJhdzogYW55ID0gYXdhaXQgYXBpLm9iamVjdChvYmplY3QpLmZpbmQoeyB3aGVyZTogeyBpZDogeyAkaW46IGluc2lkZSB9LCAuLi5pbk9yZyB9LCBmaWVsZHM6IFsnaWQnXSwgdG9wOiBpbnNpZGUubGVuZ3RoIH0pO1xuICAgICAgICAgIGluc2lkZSA9IChBcnJheS5pc0FycmF5KHJhdykgPyByYXcgOiAocmF3Py5yZWNvcmRzID8/IFtdKSkubWFwKChyb3c6IGFueSkgPT4gU3RyaW5nKHJvdy5pZCkpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICBpbnNpZGUgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBpZCBvZiBpbnNpZGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhcGkub2JqZWN0KG9iamVjdCkudXBkYXRlKHsgLi4uZG9jLCBpZCB9LCB7IHdoZXJlOiB7IGlkIH0gfSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IGFjdGl2aXR5IGJ1YmJsZTsgbmV2ZXIgYnJlYWsgdGhlIHBhcmVudCB3cml0ZS5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogYGRvX25vdF9jYWxsYCBcdTIwMTQgcmVmdXNlIHRvIFNDSEVEVUxFIGEgcGhvbmUgdG91Y2gsIG5ldmVyIHRvIHJlY29yZCBvbmUuXG4gKlxuICogIyBXaHkgdGhpcyBpcyBhIGhvb2sgYW5kIG5vdCBhbiBhY3Rpb24gcHJlZGljYXRlXG4gKlxuICogVGhlIG9idmlvdXMgbWlycm9yIG9mIHRoZSBgZW1haWxfb3B0X291dGAgdHJlYXRtZW50IGlzXG4gKiBgdmlzaWJsZTogUFxcYHJlY29yZC5kb19ub3RfY2FsbCA9PSBmYWxzZVxcYGAgb24gYSBidXR0b24sIHRoZSB3YXlcbiAqIGBzZW5kX2VtYWlsYCBhbmQgYGFkZF9jb250YWN0X3RvX2NhbXBhaWduYCBhcmUgZ2F0ZWQgaW5cbiAqIGBzcmMvc2FsZXMvYWN0aW9ucy9jb250YWN0LmFjdGlvbnMudHNgLiBUaGF0IGlzIGEgUkVOREVSSU5HIGhpbnQsIGFuZCBpdCBpcyB0aGVcbiAqIHdob2xlIG9mIHdoYXQgdGhvc2UgdHdvIGRvOiBpdCBoaWRlcyBhIGJ1dHRvbiBpbiB0aGUgQ29uc29sZSBhbmQgbGVhdmVzIHRoZVxuICogYWN0aW9uIHJlYWNoYWJsZSBvdmVyIFJFU1QsIGZyb20gYW4gQUkgdG9vbCBjYWxsLCBmcm9tIGEgZmxvdywgYW5kIGZyb20gYW5cbiAqIGltcG9ydC4gRm9yIGVtYWlsIHRoYXQgaXMgb25seSBoYWxmIGEgcHJvbWlzZSB0b28gXHUyMDE0IGJ1dCB0aGUgZW1haWwgaGFsZiBpc1xuICogYmFja2VkIGJ5IHJlYWwgZW5mb3JjZW1lbnQgZWxzZXdoZXJlIChgY2FtcGFpZ24tZW5yb2xsbWVudC5mbG93LnRzYCBmaWx0ZXJzXG4gKiBvbiB0aGUgZmxhZywgYGNhbXBhaWduX21lbWJlci5ob29rLnRzYCB3cml0ZXMgaXQpLiBgZG9fbm90X2NhbGxgIGhhZCBubyBzdWNoXG4gKiBiYWNraW5nLCBzbyBhIHByZWRpY2F0ZSBhbG9uZSB3b3VsZCBoYXZlIG1vdmVkIHRoZSBmaWVsZCBmcm9tIFwiZGVjbGFyZWQgYW5kXG4gKiB1bmVuZm9yY2VkXCIgdG8gXCJkZWNsYXJlZCBhbmQgdW5lbmZvcmNlZCB1bmxlc3MgeW91IHVzZSB0aGUgbW91c2VcIi5cbiAqXG4gKiBFbmZvcmNpbmcgb24gdGhlIFdSSVRFIGluc3RlYWQgY292ZXJzIGV2ZXJ5IGVudHJ5IHBvaW50IGF0IG9uY2UgXHUyMDE0IHRoZVxuICogYHNjaGVkdWxlX2ZvbGxvd3VwYCBzY3JlZW4gZmxvdywgYSBoYW5kLWNyZWF0ZWQgdGFzaywgYW4gaW1wb3J0LCBhbiBBSSBhZ2VudFxuICogY2FsbGluZyB0aGUgZGF0YSBBUEkgXHUyMDE0IHdoaWNoIGlzIHRoZSBzYW1lIFwib25lIHdyaXRlciwgbm90IG9uZSBwZXIgZW50cnlcbiAqIHBvaW50XCIgcmVhc29uaW5nIGBzcmMvc2FsZXMvYWN0aW9ucy9hY3Rpdml0eS1hY3Rpb25zLnRzYCBnaXZlcyBmb3Iga2VlcGluZyB0aGVcbiAqIHJlY2VuY3kgYnViYmxlIG9uIGBjcm1fZXZlbnRgJ3MgaG9vayByYXRoZXIgdGhhbiBpbiBlYWNoIGJ1dHRvbidzIGJvZHkuXG4gKlxuICogIyBXaHkgYHR5cGU6ICdjYWxsJ2AgYW5kIG5vdCBcImFueSBmb3J3YXJkLWxvb2tpbmcgb3V0cmVhY2hcIlxuICpcbiAqIGBkb19ub3RfY2FsbGAgaXMgYSBwcm9taXNlIGFib3V0IHRoZSBQSE9ORS4gSXQgaXMgbm90IGBkb19ub3RfY29udGFjdGA6XG4gKiB0aGlzIHBlcnNvbiBtYXkgc3RpbGwgYmUgZW1haWxlZCAodGhhdCBpcyBgZW1haWxfb3B0X291dGAncyBzZXBhcmF0ZSBmbGFnKSxcbiAqIG1ldCwgb3IgZGVtb2VkIHRvLiBSZWZ1c2luZyBhIGBtZWV0aW5nYCB0YXNrIGhlcmUgd291bGQgc2lsZW50bHkgd2lkZW4gYVxuICogZGVjbGFyZWQgZmllbGQgaW50byBhIHByb21pc2UgdGhlIGFwcCBuZXZlciBtYWRlIFx1MjAxNCB0aGUgbWlycm9yIGltYWdlIG9mIHRoZVxuICogZGVmZWN0IHRoaXMgZ3VhcmQgY2xvc2VzLlxuICpcbiAqICMgV2h5IGEgY29tcGxldGVkIHRhc2sgaXMgYWxsb3dlZCB0aHJvdWdoXG4gKlxuICogQSBgY29tcGxldGVkYCBDYWxsIHRhc2sgaXMgYSBSRUNPUkQgb2YgYSBjYWxsIHRoYXQgYWxyZWFkeSBoYXBwZW5lZCwgbm90IGFcbiAqIHBsYW4gdG8gcGxhY2Ugb25lLiBSZWZ1c2luZyBpdCB3b3VsZCBkZWxldGUgdGhlIGV2aWRlbmNlIHJhdGhlciB0aGFuIHByZXZlbnRcbiAqIHRoZSBjYWxsIFx1MjAxNCBhbmQgd291bGQgbWFrZSB0aGUgZmxhZyBhY3RpdmVseSBoYXJtZnVsLCBiZWNhdXNlIHRoZSBob25lc3QgcmVwXG4gKiB3aG8gbG9ncyB0aGUgY2FsbCB0aGV5IHNob3VsZCBub3QgaGF2ZSBtYWRlIGlzIHRoZSBvbmUgd2hvIGdldHMgYmxvY2tlZC4gVGhlXG4gKiBzYW1lIHJlYXNvbmluZyBrZWVwcyB0aGUgYGxvZ19jYWxsYCBhY3Rpb24gcmVhY2hhYmxlIGFuZCB1bmdhdGVkLlxuICovXG5jb25zdCB0YXNrRG9Ob3RDYWxsR3VhcmQ6IEhvb2sgPSB7XG4gIG5hbWU6ICd0YXNrX2RvX25vdF9jYWxsX2d1YXJkJyxcbiAgb2JqZWN0OiAnY3JtX3Rhc2snLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICBwcmlvcml0eTogMTUwLFxuICBkZXNjcmlwdGlvbjogJ1JlZnVzZSB0byBzY2hlZHVsZSBhbiBvcGVuIENhbGwgdGFzayBhZ2FpbnN0IGEgbGVhZC9jb250YWN0IGZsYWdnZWQgRG8gTm90IENhbGwuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvLyBUaGUgcmVmdXNhbCBlbnZlbG9wZSAoIzEwNzUpLiBNaXJyb3JlZCBmcm9tIGAuL19yZWZ1c2FsLnRzYCBiZWNhdXNlIGFcbiAgICAvLyBsb3dlcmVkIGJvZHkgaGFzIG5vIG1vZHVsZSBzY29wZSBhbmQgYGV4dHJhY3RIb29rQm9keWAgVEhST1dTIG9uIGFuXG4gICAgLy8gaW1wb3J0OyBgdGVzdC9yZWZ1c2FsLWVudmVsb3BlLnRlc3QudHNgIHBpbnMgZXZlcnkgY29weSBhZ2FpbnN0IGl0LlxuICAgIGZ1bmN0aW9uIHJlZnVzZShcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvZGU6IHN0cmluZyxcbiAgICAgIHN0YXR1czogbnVtYmVyLFxuICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZyA9IG1lc3NhZ2UsXG4gICAgKTogRXJyb3Ige1xuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpIGFzIEVycm9yICYge1xuICAgICAgICBjb2RlOiBzdHJpbmc7XG4gICAgICAgIHN0YXR1czogbnVtYmVyO1xuICAgICAgICB1c2VyTWVzc2FnZTogc3RyaW5nO1xuICAgICAgfTtcbiAgICAgIGVyci5jb2RlID0gY29kZTtcbiAgICAgIGVyci5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICBlcnIudXNlck1lc3NhZ2UgPSB1c2VyTWVzc2FnZTtcbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcblxuICAgIC8vIFRoZSB2YWx1ZSB0aGUgcm93IHdpbGwgSEFWRSBhZnRlciB0aGlzIHdyaXRlLCBub3QgdGhlIHZhbHVlIHRoZSB3cml0ZVxuICAgIC8vIGhhcHBlbnMgdG8gbWVudGlvbjogZmxpcHBpbmcgYHR5cGVgIHRvIGBjYWxsYCBvbiBhbiBleGlzdGluZyB0YXNrIGFuZFxuICAgIC8vIHJlLXBhcmVudGluZyBhbiBleGlzdGluZyBDYWxsIHRhc2sgYXJlIGJvdGggd2F5cyBpbiwgYW5kIGVhY2ggb25seVxuICAgIC8vIHN1cHBsaWVzIG9uZSBvZiB0aGUgdHdvIGtleXMuXG4gICAgY29uc3QgZWZmZWN0aXZlID0gKGtleTogc3RyaW5nKTogdW5rbm93biA9PlxuICAgICAgaW5wdXRba2V5XSAhPT0gdW5kZWZpbmVkICYmIGlucHV0W2tleV0gIT09IG51bGwgPyBpbnB1dFtrZXldIDogcHJldmlvdXM/LltrZXldO1xuXG4gICAgaWYgKGVmZmVjdGl2ZSgndHlwZScpICE9PSAnY2FsbCcpIHJldHVybjtcbiAgICBpZiAoZWZmZWN0aXZlKCdzdGF0dXMnKSA9PT0gJ2NvbXBsZXRlZCcpIHJldHVybjtcblxuICAgIGNvbnN0IGxlYWRJZCA9IGVmZmVjdGl2ZSgncmVsYXRlZF90b19sZWFkJyk7XG4gICAgY29uc3QgY29udGFjdElkID0gZWZmZWN0aXZlKCdyZWxhdGVkX3RvX2NvbnRhY3QnKTtcblxuICAgIC8vIEJvdGggYnJhbmNoZXMgcnVuIHJhdGhlciB0aGFuIGFuIGlmL2Vsc2U6IGByZWxhdGVkX3RvX3JlcXVpcmVkYCBvbiB0aGVcbiAgICAvLyBvYmplY3QgZ3VhcmFudGVlcyBhdCBsZWFzdCBvbmUgcGFyZW50LCBhbmQgYSByb3cgdGhhdCBzb21laG93IGNhcnJpZXNcbiAgICAvLyBib3RoIG11c3QgYmUgY2hlY2tlZCBhZ2FpbnN0IGJvdGggcGVvcGxlLCBub3QgYWdhaW5zdCB3aGljaGV2ZXIgdGhlXG4gICAgLy8gYXV0aG9yIGxpc3RlZCBmaXJzdC5cbiAgICBjb25zdCB0YXJnZXRzOiBBcnJheTx7IG9iamVjdDogc3RyaW5nOyBpZDogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH0+ID0gW107XG4gICAgaWYgKHR5cGVvZiBsZWFkSWQgPT09ICdzdHJpbmcnICYmIGxlYWRJZCkge1xuICAgICAgdGFyZ2V0cy5wdXNoKHsgb2JqZWN0OiAnY3JtX2xlYWQnLCBpZDogbGVhZElkLCBsYWJlbDogJ2xlYWQnIH0pO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbnRhY3RJZCA9PT0gJ3N0cmluZycgJiYgY29udGFjdElkKSB7XG4gICAgICB0YXJnZXRzLnB1c2goeyBvYmplY3Q6ICdjcm1fY29udGFjdCcsIGlkOiBjb250YWN0SWQsIGxhYmVsOiAnY29udGFjdCcgfSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB0IG9mIHRhcmdldHMpIHtcbiAgICAgIC8vIGBmaW5kKC4uLiB0b3A6IDEpYCByYXRoZXIgdGhhbiBgZmluZE9uZWAsIG1hdGNoaW5nXG4gICAgICAvLyBgZXZlbnRfYWN0aXZpdHlfYnViYmxlYCBpbiBgc3JjL3NhbGVzL29iamVjdHMvZXZlbnQuaG9vay50c2AgYW5kIHRoZSBzaGFwZVxuICAgICAgLy8gdGhlIHJlc3Qgb2YgdGhlIGFwcCdzIGhvb2tzIHJlYWQgd2l0aC4gVGhlIHJlc3VsdCBpcyBub3JtYWxpc2VkIGZvclxuICAgICAgLy8gYm90aCBkcml2ZXIgc2hhcGVzIChiYXJlIGFycmF5IC8gYHsgcmVjb3JkcyB9YCkuXG4gICAgICBjb25zdCByYXc6IGFueSA9IGF3YWl0IGFwaS5vYmplY3QodC5vYmplY3QpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBpZDogdC5pZCB9LFxuICAgICAgICBmaWVsZHM6IFsnaWQnLCAnZG9fbm90X2NhbGwnXSxcbiAgICAgICAgdG9wOiAxLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByb3dzID0gQXJyYXkuaXNBcnJheShyYXcpID8gcmF3IDogKHJhdz8ucmVjb3JkcyA/PyBbXSk7XG4gICAgICBjb25zdCBwZXJzb24gPSByb3dzWzBdO1xuICAgICAgLy8gYD09PSB0cnVlYCBvbiBwdXJwb3NlOiBhbiBhYnNlbnQga2V5LCBgbnVsbGAsIGFuZCBgZmFsc2VgIGFyZSBhbGwgXCJub3RcbiAgICAgIC8vIGZsYWdnZWRcIi4gQSBkcml2ZXIgdGhhdCBzdG9yZXMgb25seSB3cml0dGVuIGNvbHVtbnMgaGFuZHMgYmFjayB0aGUga2V5XG4gICAgICAvLyBBQlNFTlQgKHNlZSBBR0VOVFMubWQgb24gcHJlZGljYXRlIHRvdGFsaXR5KSwgYW5kIHRyZWF0aW5nIHRoYXQgYXNcbiAgICAgIC8vIHRydXRoeSB3b3VsZCBibG9jayBldmVyeSBvcmRpbmFyeSBjYWxsIHRhc2sgaW4gdGhlIGFwcC5cbiAgICAgIGlmIChwZXJzb24/LmRvX25vdF9jYWxsID09PSB0cnVlKSB7XG4gICAgICAgIHRocm93IHJlZnVzZShcbiAgICAgICAgICBgVGhpcyAke3QubGFiZWx9IGlzIGZsYWdnZWQgRG8gTm90IENhbGwsIHNvIGEgQ2FsbCB0YXNrIGNhbm5vdCBiZSBzY2hlZHVsZWQgYWdhaW5zdCB0aGVtLiBgICtcbiAgICAgICAgICAgICdMb2cgYSBjb21wbGV0ZWQgY2FsbCBpZiBvbmUgYWxyZWFkeSBoYXBwZW5lZCwgY2hvb3NlIGEgbm9uLXBob25lIGFjdGl2aXR5IHR5cGUsICcgK1xuICAgICAgICAgICAgJ29yIGNsZWFyIERvIE5vdCBDYWxsIG9uIHRoZSByZWNvcmQgZmlyc3QuJyxcbiAgICAgICAgICAnRk9SQklEREVOJyxcbiAgICAgICAgICA0MDMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgW3Rhc2tWYWxpZGF0aW9uLCB0YXNrRG9Ob3RDYWxsR3VhcmQsIHRhc2tSZWN1cnJlbmNlLCB0YXNrQnViYmxlXTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9jb250cmFjdC5ob29rLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHMvY29udHJhY3QuaG9vay50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBIb29rLCBIb29rQ29udGV4dCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHR5cGUgeyBIb29rQXBpIH0gZnJvbSAnLi4vLi4vc2FsZXMvb2JqZWN0cy9faG9vay1hcGknO1xuXG4vKipcbiAqIENvbnRyYWN0IGxpZmVjeWNsZSBob29rLlxuICpcbiAqIC0gVmFsaWRhdGVzIGBlbmRfZGF0ZWAgXHUyMjQ4IGBzdGFydF9kYXRlICsgY29udHJhY3RfdGVybV9tb250aHNgLlxuICogLSBSZWplY3RzIHNocmlua2luZyBgZW5kX2RhdGVgIGFmdGVyIGFjdGl2YXRpb24uXG4gKiAtIE9uIGBhY3RpdmF0ZWRgOiBzdGFtcHMgYHNpZ25lZF9kYXRlYCAoaWYgbWlzc2luZykgYW5kIHByb21vdGVzIHRoZSBhY2NvdW50XG4gKiAgIHRvIGBjdXN0b21lcmAuIFJlbmV3YWwgcmVtaW5kZXJzIGFyZSBvd25lZCBieSB0aGUgYGNvbnRyYWN0X3JlbmV3YWxgIGZsb3cuXG4gKi9cblxuLy8gTkI6IGhlbHBlcnMgdXNlZCBieSBoYW5kbGVycyBhcmUgZGVjbGFyZWQgSU5TSURFIGVhY2ggaGFuZGxlciBcdTIwMTQgTDIgaG9va1xuLy8gYm9kaWVzIHJ1biBib2R5LW9ubHkgaW4gdGhlIFF1aWNrSlMgc2FuZGJveCwgc28gbW9kdWxlIHNjb3BlIGlzIG5vdFxuLy8gYXZhaWxhYmxlIGF0IHJ1bnRpbWUgKGNmLiBvcHBvcnR1bml0eS5ob29rLnRzKS4gTW9kdWxlLWxldmVsIGNvcGllcyB3ZXJlXG4vLyBkZWFkIGNvZGUgdGhhdCBpbnZpdGVkIHNpbGVudCBkaXZlcmdlbmNlLlxuXG5jb25zdCBjb250cmFjdFZhbGlkYXRpb246IEhvb2sgPSB7XG4gIG5hbWU6ICdjb250cmFjdF92YWxpZGF0aW9uJyxcbiAgb2JqZWN0OiAnY3JtX2NvbnRyYWN0JyxcbiAgZXZlbnRzOiBbJ2JlZm9yZUluc2VydCcsICdiZWZvcmVVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDIwMCxcbiAgZGVzY3JpcHRpb246ICdFbmZvcmNlIGNvbnRyYWN0IHRlcm0gbWF0aCBhbmQgcHJldmVudCBzaHJpbmtpbmcgZW5kX2RhdGUgb25jZSBhY3RpdmF0ZWQuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvLyBUaGUgcmVmdXNhbCBlbnZlbG9wZSAoIzEwNzUpLiBNaXJyb3JlZCBmcm9tIGBzcmMvc2FsZXMvb2JqZWN0cy9fcmVmdXNhbC50c2AgYmVjYXVzZSBhXG4gICAgLy8gbG93ZXJlZCBib2R5IGhhcyBubyBtb2R1bGUgc2NvcGUgYW5kIGBleHRyYWN0SG9va0JvZHlgIFRIUk9XUyBvbiBhblxuICAgIC8vIGltcG9ydDsgYHRlc3QvcmVmdXNhbC1lbnZlbG9wZS50ZXN0LnRzYCBwaW5zIGV2ZXJ5IGNvcHkgYWdhaW5zdCBpdC5cbiAgICBmdW5jdGlvbiByZWZ1c2UoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb2RlOiBzdHJpbmcsXG4gICAgICBzdGF0dXM6IG51bWJlcixcbiAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmcgPSBtZXNzYWdlLFxuICAgICk6IEVycm9yIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29kZTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZztcbiAgICAgIH07XG4gICAgICBlcnIuY29kZSA9IGNvZGU7XG4gICAgICBlcnIuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgZXJyLnVzZXJNZXNzYWdlID0gdXNlck1lc3NhZ2U7XG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjb25zdCB7IGV2ZW50LCBpbnB1dCwgcHJldmlvdXMgfSA9IGN0eDtcblxuICAgIC8vIEJvdGggb3BlcmFuZHMgYXJlIHN0b3JlZCBgWVlZWS1NTS1ERGAgdmFsdWVzLCB3aGljaCB0aGUgZGF0ZS1vbmx5IHBhcnNlXG4gICAgLy8gYW5jaG9ycyBhdCBVVEMgTUlETklHSFQgXHUyMDE0IHNvIHRoZXkgYXJlIHJlYWQgaGVyZSBvbiB0aGUgY2FsZW5kYXIgdGhleSB3ZXJlXG4gICAgLy8gd3JpdHRlbiBvbi4gVGhlIGxvY2FsIGFjY2Vzc29ycyBhcmUgb25lIGRheSBlYXJsaWVyIHdlc3Qgb2YgR3JlZW53aWNoXG4gICAgLy8gKGBuZXcgRGF0ZSgnMjAyNi0wMS0wMScpLmdldERhdGUoKWAgYW5zd2VycyAzMSBpbiBgQW1lcmljYS9OZXdfWW9ya2AsIDEgaW5cbiAgICAvLyBgRXVyb3BlL0JlcmxpbmApLCBhbmQgdGhpcyBjb3VudCBmZWVkcyBhIGhhcmQgcmVmdXNhbCB0aGF0IHRoZSArLy0xIG1vbnRoXG4gICAgLy8gdG9sZXJhbmNlIGRvZXMgbm90IGFic29yYiBhdCB0aGUgYm91bmRhcnk6IGEgbGVnYWwgY29udHJhY3Qgc3Bhbm5pbmdcbiAgICAvLyBgdGVybSArIDFgIG1vbnRocyBtZWFzdXJlZCBgdGVybSArIDJgIGFuZCB0aGUgc2F2ZSB3YXMgcmVqZWN0ZWQsIHF1b3RpbmcgYVxuICAgIC8vIG1vbnRoIGNvdW50IGl0cyBvd24gZGF0ZXMgZG8gbm90IGhhdmUuXG4gICAgZnVuY3Rpb24gbW9udGhzQmV0d2VlbihzdGFydElTTzogc3RyaW5nLCBlbmRJU086IHN0cmluZyk6IG51bWJlciB7XG4gICAgICBjb25zdCBzID0gbmV3IERhdGUoc3RhcnRJU08pO1xuICAgICAgY29uc3QgZSA9IG5ldyBEYXRlKGVuZElTTyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoZS5nZXRVVENGdWxsWWVhcigpIC0gcy5nZXRVVENGdWxsWWVhcigpKSAqIDEyICtcbiAgICAgICAgKGUuZ2V0VVRDTW9udGgoKSAtIHMuZ2V0VVRDTW9udGgoKSkgK1xuICAgICAgICAvLyBVbmNoYW5nZWQgaW50ZW50OiBoYXMgdGhlIGVuZCBkYXktb2YtbW9udGggcmVhY2hlZCB0aGUgc3RhcnQncyB5ZXQ/XG4gICAgICAgIC8vIElmIG5vdCwgdGhlIGxhc3QgbW9udGggaXMgbm90IGNvbXBsZXRlIGFuZCBkb2VzIG5vdCBjb3VudC5cbiAgICAgICAgKGUuZ2V0VVRDRGF0ZSgpID49IHMuZ2V0VVRDRGF0ZSgpID8gMCA6IC0xKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgcGF0Y2gncyB2YWx1ZSwgZWxzZSB0aGUgc3RvcmVkIG9uZTsgYW4gZW1wdHkgc3RyaW5nIG9yIGEgMCAvIE5hTlxuICAgIC8vIHRlcm0gY291bnRzIGFzIGFic2VudCwgc28gdGhlIGNoZWNrIGJlbG93IHN0YW5kcyBkb3duLlxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IFtpbnB1dC5zdGFydF9kYXRlLCBwcmV2aW91cz8uc3RhcnRfZGF0ZV0uZmluZCgodik6IHYgaXMgc3RyaW5nID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2ICE9PSAnJyk7XG4gICAgY29uc3QgZW5kRGF0ZSA9IFtpbnB1dC5lbmRfZGF0ZSwgcHJldmlvdXM/LmVuZF9kYXRlXS5maW5kKCh2KTogdiBpcyBzdHJpbmcgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYgIT09ICcnKTtcbiAgICBjb25zdCB0ZXJtID0gW2lucHV0LmNvbnRyYWN0X3Rlcm1fbW9udGhzLCBwcmV2aW91cz8uY29udHJhY3RfdGVybV9tb250aHNdLmZpbmQoKHYpOiB2IGlzIG51bWJlciA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicgJiYgISF2KTtcblxuICAgIGlmIChzdGFydERhdGUgJiYgZW5kRGF0ZSAmJiB0ZXJtKSB7XG4gICAgICBjb25zdCBjYWxjID0gbW9udGhzQmV0d2VlbihzdGFydERhdGUsIGVuZERhdGUpO1xuICAgICAgaWYgKE1hdGguYWJzKGNhbGMgLSB0ZXJtKSA+IDEpIHtcbiAgICAgICAgdGhyb3cgcmVmdXNlKFxuICAgICAgICAgIGBDb250cmFjdCB0ZXJtICgke3Rlcm19IG1vbnRocykgZG9lcyBub3QgbWF0Y2ggZGF0ZSByYW5nZSAoJHtjYWxjfSBtb250aHMgZnJvbSAke3N0YXJ0RGF0ZX0gdG8gJHtlbmREYXRlfSkuYCxcbiAgICAgICAgICAnVkFMSURBVElPTl9GQUlMRUQnLFxuICAgICAgICAgIDQwMCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIHByZXZpb3VzPy5zdGF0dXMgPT09ICdhY3RpdmF0ZWQnKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBpbnB1dC5lbmRfZGF0ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdHlwZW9mIHByZXZpb3VzLmVuZF9kYXRlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICBpbnB1dC5lbmRfZGF0ZSA8IHByZXZpb3VzLmVuZF9kYXRlXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgcmVmdXNlKFxuICAgICAgICAgIGBDYW5ub3Qgc2hyaW5rIGVuZF9kYXRlICgke3ByZXZpb3VzLmVuZF9kYXRlIGFzIHN0cmluZ30gXHUyMTkyICR7aW5wdXQuZW5kX2RhdGV9KSBhZnRlciBhY3RpdmF0aW9uLiBVc2UgYSB0ZXJtaW5hdGlvbi9hbWVuZG1lbnQgd29ya2Zsb3cgaW5zdGVhZC5gLFxuICAgICAgICAgICdSRUNPUkRfTE9DS0VEJyxcbiAgICAgICAgICA0MDksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuY29uc3QgY29udHJhY3RBY3RpdmF0aW9uOiBIb29rID0ge1xuICBuYW1lOiAnY29udHJhY3Rfb25fYWN0aXZhdGlvbicsXG4gIG9iamVjdDogJ2NybV9jb250cmFjdCcsXG4gIGV2ZW50czogWydhZnRlclVwZGF0ZSddLFxuICBwcmlvcml0eTogODAwLFxuICBhc3luYzogdHJ1ZSxcbiAgb25FcnJvcjogJ2xvZycsXG4gIGRlc2NyaXB0aW9uOiAnT24gYWN0aXZhdGlvbjogc3RhbXAgc2lnbmVkX2RhdGUsIHByb21vdGUgYWNjb3VudC4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXQsIHByZXZpb3VzIH0gPSBjdHg7XG4gICAgaWYgKGlucHV0LnN0YXR1cyAhPT0gJ2FjdGl2YXRlZCcgfHwgcHJldmlvdXM/LnN0YXR1cyA9PT0gJ2FjdGl2YXRlZCcpIHJldHVybjtcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcblxuICAgIGNvbnN0IGlkID0gW2lucHV0LmlkLCBwcmV2aW91cz8uaWRdLmZpbmQoKHYpOiB2IGlzIHN0cmluZyA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdiAhPT0gJycpO1xuICAgIGNvbnN0IGFjY291bnRJZCA9IFtpbnB1dC5jcm1fYWNjb3VudCwgcHJldmlvdXM/LmNybV9hY2NvdW50XS5maW5kKCh2KTogdiBpcyBzdHJpbmcgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYgIT09ICcnKTtcblxuICAgIGlmIChpZCAmJiAhaW5wdXQuc2lnbmVkX2RhdGUgJiYgIXByZXZpb3VzPy5zaWduZWRfZGF0ZSkge1xuICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX2NvbnRyYWN0JykudXBkYXRlKFxuICAgICAgICB7IGlkLCBzaWduZWRfZGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsIDEwKSB9LFxuICAgICAgICB7IHdoZXJlOiB7IGlkIH0gfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGFjY291bnRJZCkge1xuICAgICAgY29uc3QgYWNjb3VudCA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9hY2NvdW50JykuZmluZE9uZSh7IHdoZXJlOiB7IGlkOiBhY2NvdW50SWQgfSB9KTtcbiAgICAgIGlmIChhY2NvdW50ICYmIGFjY291bnQudHlwZSAhPT0gJ2N1c3RvbWVyJykge1xuICAgICAgICBhd2FpdCBhcGkub2JqZWN0KCdjcm1fYWNjb3VudCcpLnVwZGF0ZShcbiAgICAgICAgICB7IGlkOiBhY2NvdW50SWQsIHR5cGU6ICdjdXN0b21lcicgfSxcbiAgICAgICAgICB7IHdoZXJlOiB7IGlkOiBhY2NvdW50SWQgfSB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vIHJlbmV3YWwgdGFzayBoZXJlOiByZW5ld2FsIHJlbWluZGVycyBhcmUgb3duZWQgYnkgdGhlXG4gICAgLy8gYGNvbnRyYWN0X3JlbmV3YWxgIHNjaGVkdWxlZCBmbG93LCB3aGljaCBob25vdXJzIHRoZSBwZXItY29udHJhY3RcbiAgICAvLyBgcmVuZXdhbF9ub3RpY2VfZGF5c2AuIFRoZSBhY3RpdmF0aW9uLXRpbWUgdGFzayB0aGlzIGhvb2sgdXNlZCB0b1xuICAgIC8vIGNyZWF0ZSBoYXJkY29kZWQgYSA2MC1kYXkgbm90aWNlIGFuZCBkdXBsaWNhdGVkIHRoZSBmbG93J3MgdGFzay5cbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFtjb250cmFjdFZhbGlkYXRpb24sIGNvbnRyYWN0QWN0aXZhdGlvbl07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHMvX2xpbmUtaXRlbS1wcmljZS1maWxsLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHMvX2xpbmUtaXRlbS1wcmljZS1maWxsLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tDb250ZXh0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEhvb2tBcGkgfSBmcm9tICcuLi8uLi9zYWxlcy9vYmplY3RzL19ob29rLWFwaSc7XG5cbi8qKlxuICogU2hhcmVkIGxpbmUtaXRlbSBwcmljZSBmaWxsLlxuICpcbiAqIGBsaXN0X3ByaWNlYCBvbiBib3RoIGxpbmUtaXRlbSBvYmplY3RzIGlzIGRvY3VtZW50ZWQgYXMgXCJhdXRvLXBvcHVsYXRlZCBmcm9tXG4gKiBwcm9kdWN0Lmxpc3RfcHJpY2VcIiwgYW5kIG5vdGhpbmcgaW1wbGVtZW50ZWQgaXQgdW50aWwgdGhpcyBob29rLiBPbiB3cml0ZSxcbiAqIHdoZW4gYSBwcm9kdWN0IGlzIHBhcnQgb2YgVEhJUyBjaGFuZ2UsIGl0IHN0YW1wcyB0aGUgY2F0YWxvZyBgbGlzdF9wcmljZWA7XG4gKiBvbiBJTlNFUlQgaXQgYWxzbyBkZWZhdWx0cyB0aGUgbmVnb3RpYXRlZCBgdW5pdF9wcmljZWAgdG8gdGhlIGxpc3QgcHJpY2Ugd2hlblxuICogdGhlIHJlcCBsZWZ0IGl0IGJsYW5rICh0aGV5IGNhbiBzdGlsbCBvdmVycmlkZSkuIE9uIHVwZGF0ZSB0aGUgbmVnb3RpYXRlZFxuICogYHVuaXRfcHJpY2VgIGlzIGxlZnQgYWxvbmUsIHNvIGEgcmUtc3luY2VkIGNhdGFsb2cgcHJpY2UgbmV2ZXIgY2xvYmJlcnMgYVxuICogcHJpY2Ugc29tZW9uZSBhY3R1YWxseSBuZWdvdGlhdGVkLlxuICpcbiAqIFdoeSBpdCBsaXZlcyBoZXJlIHJhdGhlciB0aGFuIHR3aWNlOiBgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbWAgYW5kXG4gKiBgY3JtX3F1b3RlX2xpbmVfaXRlbWAgY2FycmllZCBuZWFyLXZlcmJhdGltIGNvcGllcyBvZiB0aGlzIGhhbmRsZXIgdGhhdFxuICogZGlmZmVyZWQgb25seSBpbiBjb21tZW50cyBcdTIwMTQgdGhlIHNoYXBlIHRoYXQgbGV0cyBhIGZpeCBsYW5kIG9uIG9uZSBvYmplY3QgYW5kXG4gKiBzaWxlbnRseSBza2lwIHRoZSBvdGhlci4gT25seSB0aGUgcHJpY2UgZmlsbCBpcyBzaGFyZWQ7IHRoZSB0d28gUk9MTFVQIGhvb2tzXG4gKiBuZXh0IGRvb3IgbG9vayBhbGlrZSBidXQgY29tcHV0ZSBnZW51aW5lbHkgZGlmZmVyZW50IHRvdGFscywgc28gdGhleSBzdGF5XG4gKiBzZXBhcmF0ZS5cbiAqXG4gKiBTYW5kYm94IG5vdGU6IEwyIGhvb2sgYm9kaWVzIHJ1biBCT0RZLU9OTFkgaW4gdGhlIFF1aWNrSlMgc2FuZGJveCwgc28gYVxuICogaGFuZGxlciBjYW5ub3QgcmVhY2ggbW9kdWxlIHNjb3BlIGF0IHJ1bnRpbWUuIFRoaXMgZmFjdG9yeSBpcyBzdGlsbCBzYWZlXG4gKiBiZWNhdXNlIHRoZSBzaGFyaW5nIGhhcHBlbnMgYXQgYXV0aG9yaW5nIHRpbWUgXHUyMDE0IGBvYmplY3ROYW1lYC9gaG9va05hbWVgIGFyZVxuICogcGxhaW4gbWV0YWRhdGEgb24gdGhlIHJldHVybmVkIEhvb2ssIGFuZCB0aGUgaGFuZGxlciBib2R5IGJlbG93IGNsb3NlcyBvdmVyXG4gKiBOT1RISU5HIGJ1dCBpdHMgb3duIGBjdHhgLiBOZXZlciBtb3ZlIGEgdmFsdWUgdGhlIGJvZHkgcmVhZHMgaW50byB0aGlzXG4gKiBmYWN0b3J5J3MgcGFyYW1ldGVyczsgaXQgd291bGQgcmVzb2x2ZSBoZXJlIGFuZCBiZSB1bmRlZmluZWQgaW4gdGhlIHNhbmRib3guXG4gKlxuICogVGhhdCBydWxlIGlzIGVuZm9yY2VkLCBub3QganVzdCBkb2N1bWVudGVkOiBgdGVzdC9hY3Rpb24tc2FuZGJveC50ZXN0LnRzYFxuICogbG93ZXJzIHRoaXMgaGFuZGxlciB3aXRoIHRoZSBDTEkgYnVpbGQncyBvd24gZXh0cmFjdGlvbiBwYXNzICh3aGljaCByZWplY3RzIGFcbiAqIGJvZHkgcmVmZXJlbmNpbmcgYW55dGhpbmcgb3V0IG9mIHNjb3BlKSBhbmQgcnVucyB0aGUgcmVzdWx0IHVuZGVyIHRoZSByZWFsXG4gKiBRdWlja0pTIHJ1bm5lciwgd2l0aCBhIG5lZ2F0aXZlIGNvbnRyb2wgdGhhdCBzaG93cyB0aGUgZ3VhcmQgc3RpbGwgYml0ZXMuXG4gKiBXb3J0aCBrbm93aW5nIHdoeSBhIHRlc3QgaGFzIHRvOiB3aGVuIGV4dHJhY3Rpb24gZmFpbHMgdGhlIGJ1aWxkIGRvZXMgbm90LFxuICogaXQgc2lsZW50bHkga2VlcHMgdGhlIGhhbmRsZXIgaW4gaXRzIGJ1bmRsZWQgZm9ybSBhbmQgdGhlIGhvb2sgc3RvcHMgYmVpbmdcbiAqIGRlcGxveWFibGUgYXMgcHVyZSBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxpbmVJdGVtUHJpY2VGaWxsKG9iamVjdE5hbWU6IHN0cmluZywgaG9va05hbWU6IHN0cmluZyk6IEhvb2sge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGhvb2tOYW1lLFxuICAgIG9iamVjdDogb2JqZWN0TmFtZSxcbiAgICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICAgIHByaW9yaXR5OiAxMDAsXG4gICAgZGVzY3JpcHRpb246ICdEZWZhdWx0IGxpc3RfcHJpY2UgLyB1bml0X3ByaWNlIGZyb20gdGhlIGNob3NlbiBwcm9kdWN0LicsXG4gICAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHsgZXZlbnQsIGlucHV0IH0gPSBjdHg7XG4gICAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWFwaSkgcmV0dXJuO1xuICAgICAgLy8gT25seSBhY3Qgd2hlbiBhIHByb2R1Y3QgcmVmZXJlbmNlIGlzIHBhcnQgb2YgVEhJUyB3cml0ZS5cbiAgICAgIGNvbnN0IHByb2R1Y3RJZCA9IHR5cGVvZiBpbnB1dC5jcm1fcHJvZHVjdCA9PT0gJ3N0cmluZycgPyBpbnB1dC5jcm1fcHJvZHVjdCA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICghcHJvZHVjdElkKSByZXR1cm47XG4gICAgICBjb25zdCBwcm9kdWN0ID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX3Byb2R1Y3QnKS5maW5kT25lKHtcbiAgICAgICAgd2hlcmU6IHsgaWQ6IHByb2R1Y3RJZCB9LCBmaWVsZHM6IFsnaWQnLCAnbGlzdF9wcmljZSddLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsaXN0UHJpY2UgPSBwcm9kdWN0ICYmIHR5cGVvZiBwcm9kdWN0Lmxpc3RfcHJpY2UgPT09ICdudW1iZXInID8gcHJvZHVjdC5saXN0X3ByaWNlIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKGxpc3RQcmljZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICAvLyBDYXRhbG9nIHJlZmVyZW5jZSBhbHdheXMgdHJhY2tzIHRoZSBwcm9kdWN0LlxuICAgICAgaW5wdXQubGlzdF9wcmljZSA9IGxpc3RQcmljZTtcbiAgICAgIC8vIE5lZ290aWF0ZWQgcHJpY2UgZGVmYXVsdHMgdG8gbGlzdCBvbiBjcmVhdGUgd2hlbiBsZWZ0IGJsYW5rOyBuZXZlclxuICAgICAgLy8gb3ZlcndyaXR0ZW4gb24gdXBkYXRlIChyZXNwZWN0IGEgcmVwJ3MgbmVnb3RpYXRlZCBmaWd1cmUpLlxuICAgICAgaWYgKGV2ZW50ID09PSAnYmVmb3JlSW5zZXJ0JyAmJiBpbnB1dC51bml0X3ByaWNlID09IG51bGwpIHtcbiAgICAgICAgaW5wdXQudW5pdF9wcmljZSA9IGxpc3RQcmljZTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFNoYXJlZCBsaW5lLW51bWJlciBhc3NpZ25lciAoIzE4MjgpIFx1MjAxNCBgbGluZV9udW1iZXJgIGlzIGByZWFkb25seWAsIHNvIHRoaXMgaXNcbiAqIGl0cyBvbmUgd3JpdGVyLiBJbnNlcnQ6IGBtYXggdW5kZXIgdGhlIHBhcmVudCArIDFgLiBVcGRhdGUgb2YgYSByb3cgdGhhdCBzdGlsbFxuICogaGFzIG5vbmUgKGNyZWF0ZWQgYmVmb3JlIHRoaXMgaG9vayBcdTIwMTQgYHNjcmlwdHMvYmFja2ZpbGwtbGluZS1udW1iZXIudHNgIHRvdWNoZXNcbiAqIGVhY2ggb25jZSk6IHNhbWUgc3RhbXAuIEFuIGV4aXN0aW5nIG9yZGluYWwgaXMgbmV2ZXIgcmVudW1iZXJlZC4gVGhlIGVuZ2luZVxuICoga2VlcHMgYSBwYXlsb2FkIGtleSBhIGhvb2sgd3JvdGUgdGhyb3VnaCBpdHMgcmVhZG9ubHkgc3RyaXAsIHNvIGEgdXNlciB3cml0ZVxuICogbGFuZHMgdGhlIHN0YW1wIGFuZCBhIHVzZXItc3VwcGxpZWQgdmFsdWUgaXMgb3ZlcndyaXR0ZW47IG9ubHkgYSBuby11c2VyXG4gKiBzeXN0ZW0gd3JpdGUgdGhhdCBzdXBwbGllcyBvbmUgKHRoZSBzZWVkLCBhbmQgaXRzIHJlcGxheSkga2VlcHMgaXRzIG93bi4gYHJ1bkFzOiAnc3lzdGVtJ2BcbiAqIGVsZXZhdGVzIHRoZSBzaWJsaW5nIHJlYWQgYW5kIG5vdGhpbmcgZWxzZS4gQm9keS1vbmx5IHJ1bGUgYXMgYWJvdmU6IHRoZVxuICogcGFyZW50IGtleSBjb21lcyBmcm9tIGBjdHgub2JqZWN0YCwgbmV2ZXIgYSBmYWN0b3J5IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxpbmVJdGVtTnVtYmVyaW5nKG9iamVjdE5hbWU6IHN0cmluZywgaG9va05hbWU6IHN0cmluZyk6IEhvb2sge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGhvb2tOYW1lLFxuICAgIG9iamVjdDogb2JqZWN0TmFtZSxcbiAgICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICAgIHByaW9yaXR5OiAxMTAsXG4gICAgcnVuQXM6ICdzeXN0ZW0nLFxuICAgIGRlc2NyaXB0aW9uOiAnQXNzaWduIGxpbmVfbnVtYmVyID0gKG1heCB1bmRlciB0aGUgcGFyZW50KSArIDEuJyxcbiAgICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgeyBldmVudCwgaW5wdXQgfSA9IGN0eDtcbiAgICAgIGNvbnN0IHByZXYgPSBjdHgucHJldmlvdXM7XG4gICAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWFwaSkgcmV0dXJuO1xuICAgICAgaWYgKCFjdHgudXNlcj8uaWQgJiYgdHlwZW9mIGlucHV0LmxpbmVfbnVtYmVyID09PSAnbnVtYmVyJykgcmV0dXJuO1xuICAgICAgLy8gRDM6IGEgcHJlZGljYXRlIHVwZGF0ZSBoYXMgT05FIHBheWxvYWQgZm9yIGV2ZXJ5IHJvdyAoZm9yZWNhc3QuaG9vay50cykuXG4gICAgICBpZiAoZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnICYmIChjdHguZGlzcGF0Y2g/Lm1vZGUgPT09ICdwZXItcm93JyB8fCB0eXBlb2YgcHJldj8ubGluZV9udW1iZXIgPT09ICdudW1iZXInKSkgcmV0dXJuO1xuICAgICAgY29uc3QgcGFyZW50S2V5ID0gY3R4Lm9iamVjdCA9PT0gJ2NybV9xdW90ZV9saW5lX2l0ZW0nID8gJ2NybV9xdW90ZScgOiAnY3JtX29wcG9ydHVuaXR5JztcbiAgICAgIGNvbnN0IHBhcmVudElkID0gaW5wdXRbcGFyZW50S2V5XSA/PyBwcmV2Py5bcGFyZW50S2V5XTtcbiAgICAgIGlmICh0eXBlb2YgcGFyZW50SWQgIT09ICdzdHJpbmcnIHx8ICFwYXJlbnRJZCkgcmV0dXJuO1xuICAgICAgY29uc3Qgc2libGluZ3MgPSBhd2FpdCBhcGkub2JqZWN0KGN0eC5vYmplY3QpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBbcGFyZW50S2V5XTogcGFyZW50SWQgfSwgZmllbGRzOiBbJ2xpbmVfbnVtYmVyJ10sIHRvcDogNTAwMCxcbiAgICAgIH0pO1xuICAgICAgbGV0IG1heCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygc2libGluZ3MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzLmxpbmVfbnVtYmVyID09PSAnbnVtYmVyJyAmJiBzLmxpbmVfbnVtYmVyID4gbWF4KSBtYXggPSBzLmxpbmVfbnVtYmVyO1xuICAgICAgfVxuICAgICAgLy8gQSBiYXRjaCBpbnNlcnQgcnVucyBldmVyeSByb3cncyBiZWZvcmVJbnNlcnQgYmVmb3JlIHN0b3JpbmcgYW55IHJvdy5cbiAgICAgIGNvbnN0IG9mZnNldCA9IGV2ZW50ID09PSAnYmVmb3JlSW5zZXJ0JyAmJiBjdHguZGlzcGF0Y2g/Lm1vZGUgPT09ICdwZXItcm93JyA/IGN0eC5kaXNwYXRjaC5pbmRleCA6IDA7XG4gICAgICBpbnB1dC5saW5lX251bWJlciA9IG1heCArIDEgKyBvZmZzZXQ7XG4gICAgfSxcbiAgfTtcbn1cbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9vcHBvcnR1bml0eV9saW5lX2l0ZW0uaG9vay50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL29wcG9ydHVuaXR5X2xpbmVfaXRlbS5ob29rLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tDb250ZXh0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEhvb2tBcGkgfSBmcm9tICcuLi8uLi9zYWxlcy9vYmplY3RzL19ob29rLWFwaSc7XG5pbXBvcnQgeyBjcmVhdGVMaW5lSXRlbU51bWJlcmluZywgY3JlYXRlTGluZUl0ZW1QcmljZUZpbGwgfSBmcm9tICcuL19saW5lLWl0ZW0tcHJpY2UtZmlsbCc7XG5cbi8qKlxuICogT3Bwb3J0dW5pdHkgYW1vdW50IHJvbGx1cC5cbiAqXG4gKiBLZWVwcyBgY3JtX29wcG9ydHVuaXR5LmFtb3VudGAgaW4gc3luYyB3aXRoIHRoZSBzdW0gb2YgaXRzIGxpbmUgaXRlbXMnXG4gKiBleHRlbmRlZCBwcmljZS4gRmlyZXMgYWZ0ZXIgYSBsaW5lIGl0ZW0gaXMgaW5zZXJ0ZWQgLyB1cGRhdGVkIC8gZGVsZXRlZCAodGhlXG4gKiBjb25zb2xlIHN1cmZhY2VzIHRoZXNlIGFzIHRoZSBvcHBvcnR1bml0eSdzIFwiUHJvZHVjdHNcIiByZWxhdGVkIGxpc3QpIGFuZFxuICogcmVjb21wdXRlcyB0aGUgcGFyZW50IG9wcG9ydHVuaXR5J3MgYW1vdW50IGZyb20gdGhlIGN1cnJlbnQgbGluZSBzZXQuXG4gKlxuICogV2h5IHRoaXMgZXhpc3RzOiBgYW1vdW50YCB3YXMgYSBmcmVlLXR5cGVkIGN1cnJlbmN5IGZpZWxkIHdpdGggbm8gbGluayB0b1xuICogYGNybV9vcHBvcnR1bml0eV9saW5lX2l0ZW1gLCBzbyBpdGVtaXNpbmcgYSBkZWFsIGFuZCBpdHMgaGVhZGxpbmUgbnVtYmVyXG4gKiBjb3VsZCBkcmlmdCBhcGFydC4gT25jZSBhIGRlYWwgaXMgaXRlbWlzZWQsIHRoZSBsaW5lIHN1bSBpcyBhdXRob3JpdGF0aXZlLlxuICpcbiAqIERlc2lnbiBkZWNpc2lvbnM6XG4gKiAtIFJlY29tcHV0ZXMgZnJvbSByYXcgYHF1YW50aXR5ICogdW5pdF9wcmljZSAqICgxIC0gZGlzY291bnQvMTAwKWAgcmF0aGVyIHRoYW5cbiAqICAgcmVhZGluZyB0aGUgYHRvdGFsX3ByaWNlYCBGT1JNVUxBIGZpZWxkLCBzbyBpdCBkb2Vzbid0IGRlcGVuZCBvbiBmb3JtdWxhXG4gKiAgIGh5ZHJhdGlvbiBpbnNpZGUgdGhlIHNhbmRib3hlZCBob29rIGJvZHkuXG4gKiAtIElmIHRoZSBvcHBvcnR1bml0eSBoYXMgTk8gbGluZSBpdGVtcyAoZS5nLiB0aGUgbGFzdCBvbmUgd2FzIGp1c3QgZGVsZXRlZCksXG4gKiAgIGBhbW91bnRgIGlzIGxlZnQgdW50b3VjaGVkIFx1MjAxNCB6ZXJvaW5nIGl0IHdvdWxkIHRyaXAgdGhlIGBhbW91bnQgPiAwYFxuICogICB2YWxpZGF0aW9uIGFuZCB3aXBlIHRoZSBtYW51YWxseS1lbnRlcmVkIGZpZ3VyZSBvbiBvcHBvcnR1bml0aWVzIHRoYXQgbmV2ZXJcbiAqICAgdXNlZCBsaW5lIGl0ZW1zIGF0IGFsbC5cbiAqIC0gYGFzeW5jOiB0cnVlYCArIGBvbkVycm9yOiAnbG9nJ2AgXHUyMDE0IHRoZSByb2xsdXAgaXMgYSBkZXJpdmVkIGNvbnZlbmllbmNlOyBhXG4gKiAgIGZhaWx1cmUgbXVzdCBuZXZlciBibG9jayB0aGUgbGluZS1pdGVtIHdyaXRlLiBVcGRhdGluZyB0aGUgcGFyZW50IGRvZXMgbm90XG4gKiAgIHJlLXRyaWdnZXIgdGhpcyBob29rIChkaWZmZXJlbnQgb2JqZWN0KSwgc28gdGhlcmUncyBubyBsb29wLlxuICogLSBPbiByZS1wYXJlbnRpbmcgKHVwZGF0ZSB0aGF0IG1vdmVzIGEgbGluZSB0byBhbm90aGVyIG9wcG9ydHVuaXR5KSwgQk9USCB0aGVcbiAqICAgb2xkIGFuZCBuZXcgcGFyZW50cyBhcmUgcmVjb21wdXRlZC5cbiAqL1xuLyoqXG4gKiBMaW5lLWl0ZW0gcHJpY2UgZmlsbCBcdTIwMTQgb25lIGltcGxlbWVudGF0aW9uIHNoYXJlZCB3aXRoIHRoZSBxdW90ZSBsaW5lIGl0ZW07XG4gKiBzZWUgYF9saW5lLWl0ZW0tcHJpY2UtZmlsbC50c2AgZm9yIHRoZSBiZWhhdmlvdXIgYW5kIHRoZSBzYW5kYm94IGNhdmVhdC5cbiAqL1xuY29uc3Qgb3Bwb3J0dW5pdHlMaW5lSXRlbVByaWNlRmlsbDogSG9vayA9IGNyZWF0ZUxpbmVJdGVtUHJpY2VGaWxsKFxuICAnY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbScsXG4gICdvcHBvcnR1bml0eV9saW5lX2l0ZW1fcHJpY2VfZmlsbCcsXG4pO1xuXG4vKiogYGxpbmVfbnVtYmVyYCBhc3NpZ25lciBcdTIwMTQgc2VlIGBfbGluZS1pdGVtLXByaWNlLWZpbGwudHNgICgjMTgyOCkuICovXG5jb25zdCBvcHBvcnR1bml0eUxpbmVJdGVtTnVtYmVyaW5nOiBIb29rID0gY3JlYXRlTGluZUl0ZW1OdW1iZXJpbmcoXG4gICdjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtJyxcbiAgJ29wcG9ydHVuaXR5X2xpbmVfaXRlbV9saW5lX251bWJlcicsXG4pO1xuXG5jb25zdCBvcHBvcnR1bml0eUFtb3VudFJvbGx1cDogSG9vayA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X2Ftb3VudF9yb2xsdXAnLFxuICBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtJyxcbiAgZXZlbnRzOiBbJ2FmdGVySW5zZXJ0JywgJ2FmdGVyVXBkYXRlJywgJ2FmdGVyRGVsZXRlJ10sXG4gIHByaW9yaXR5OiAzMDAsXG4gIGFzeW5jOiB0cnVlLFxuICBvbkVycm9yOiAnbG9nJyxcbiAgZGVzY3JpcHRpb246ICdSZWNvbXB1dGUgcGFyZW50IG9wcG9ydHVuaXR5LmFtb3VudCBmcm9tIHRoZSBzdW0gb2YgaXRzIGxpbmUgaXRlbXMuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcbiAgICBjb25zdCB7IGlucHV0LCBwcmV2aW91cyB9ID0gY3R4O1xuICAgIGNvbnN0IG51bSA9ICh2OiB1bmtub3duKTogbnVtYmVyID0+ICh0eXBlb2YgdiA9PT0gJ251bWJlcicgPyB2IDogMCk7XG5cbiAgICAvLyBFdmVyeSBwYXJlbnQgb3Bwb3J0dW5pdHkgdG91Y2hlZCBieSB0aGlzIGNoYW5nZSAob2xkICsgbmV3IGhhbmRsZXMgdGhlXG4gICAgLy8gcmUtcGFyZW50aW5nIGNhc2Ugb24gdXBkYXRlKS5cbiAgICBjb25zdCBvcHBJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHYgb2YgW2lucHV0Py5jcm1fb3Bwb3J0dW5pdHksIHByZXZpb3VzPy5jcm1fb3Bwb3J0dW5pdHldKSB7XG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYpIG9wcElkcy5hZGQodik7XG4gICAgfVxuICAgIGlmIChvcHBJZHMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBvcHBJZCBvZiBvcHBJZHMpIHtcbiAgICAgIC8vIFNraXAgY2xvc2VkIGRlYWxzLiBUaGUgcm9sbHVwIHJ1bnMgaW4gYSBzeXN0ZW0gY29udGV4dCAobm8gY3R4LnVzZXIpLFxuICAgICAgLy8gd2hpY2ggQllQQVNTRVMgdGhlIG9wcG9ydHVuaXR5IGZyZWV6ZSBndWFyZCBcdTIwMTQgc28gd2l0aG91dCB0aGlzIGNoZWNrLFxuICAgICAgLy8gZWRpdGluZyBhIGxpbmUgaXRlbSB3b3VsZCBzaWxlbnRseSByZXdyaXRlIGEgY2xvc2VkLXdvbiBkZWFsJ3MgcmVjb3JkZWRcbiAgICAgIC8vIGFtb3VudC4gQSBjbG9zZWQgZGVhbCdzIHZhbHVlIGlzIHNldHRsZWQ7IGxlYXZlIGl0LlxuICAgICAgY29uc3Qgb3BwID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykuZmluZE9uZSh7XG4gICAgICAgIHdoZXJlOiB7IGlkOiBvcHBJZCB9LCBmaWVsZHM6IFsnaWQnLCAnc3RhZ2UnXSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3RhZ2UgPSBvcHAgJiYgdHlwZW9mIG9wcC5zdGFnZSA9PT0gJ3N0cmluZycgPyBvcHAuc3RhZ2UgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoc3RhZ2UgPT09ICdjbG9zZWRfd29uJyB8fCBzdGFnZSA9PT0gJ2Nsb3NlZF9sb3N0JykgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGxpbmVzID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbScpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fb3Bwb3J0dW5pdHk6IG9wcElkIH0sXG4gICAgICAgIGZpZWxkczogWydxdWFudGl0eScsICd1bml0X3ByaWNlJywgJ2Rpc2NvdW50J10sXG4gICAgICAgIHRvcDogNTAwMCxcbiAgICAgIH0pO1xuICAgICAgLy8gTm8gbGluZXMgbGVmdCBcdTIxOTIgbGVhdmUgdGhlIGV4aXN0aW5nIGFtb3VudCBhcy1pcyAoc2VlIGRlc2lnbiBub3RlKS5cbiAgICAgIGlmICghbGluZXMgfHwgbGluZXMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGwgb2YgbGluZXMpIHN1bSArPSBudW0obC5xdWFudGl0eSkgKiBudW0obC51bml0X3ByaWNlKSAqICgxIC0gbnVtKGwuZGlzY291bnQpIC8gMTAwKTtcbiAgICAgIHN1bSA9IE1hdGgucm91bmQoc3VtICogMTAwKSAvIDEwMDtcbiAgICAgIGlmIChzdW0gPiAwKSB7XG4gICAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV9vcHBvcnR1bml0eScpLnVwZGF0ZShcbiAgICAgICAgICB7IGlkOiBvcHBJZCwgYW1vdW50OiBzdW0gfSxcbiAgICAgICAgICB7IHdoZXJlOiB7IGlkOiBvcHBJZCB9IH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgW29wcG9ydHVuaXR5TGluZUl0ZW1QcmljZUZpbGwsIG9wcG9ydHVuaXR5TGluZUl0ZW1OdW1iZXJpbmcsIG9wcG9ydHVuaXR5QW1vdW50Um9sbHVwXTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9wcm9kdWN0Lmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9wcm9kdWN0Lmhvb2sudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB0eXBlIHsgSG9va0FwaSB9IGZyb20gJy4uLy4uL3NhbGVzL29iamVjdHMvX2hvb2stYXBpJztcblxuLyoqXG4gKiBQcm9kdWN0IGNhdGFsb2cgaG9vay5cbiAqXG4gKiAtIEVuZm9yY2VzIGBsaXN0X3ByaWNlID49IGNvc3RgLlxuICogLSBOb3JtYWxpemVzIGBza3VgIHRvIHVwcGVyY2FzZS5cbiAqIC0gUmVmdXNlcyBkZWxldGUgd2hlbiB0aGUgcHJvZHVjdCBpcyByZWZlcmVuY2VkIGJ5IEFOWSBvcHBvcnR1bml0eSBvciBxdW90ZVxuICogICBsaW5lIGl0ZW0gKGhpc3RvcmljYWwgaW5jbHVkZWQgXHUyMDE0IGRlYWxzIGtlZXAgdGhlaXIgbGluZSBoaXN0b3J5KTsgc3VnZ2VzdHNcbiAqICAgZGVhY3RpdmF0aW5nIChgaXNfYWN0aXZlPWZhbHNlYCkgaW5zdGVhZC5cbiAqL1xuXG5jb25zdCBwcm9kdWN0SG9vazogSG9vayA9IHtcbiAgbmFtZTogJ3Byb2R1Y3RfY2F0YWxvZycsXG4gIG9iamVjdDogJ2NybV9wcm9kdWN0JyxcbiAgZXZlbnRzOiBbJ2JlZm9yZUluc2VydCcsICdiZWZvcmVVcGRhdGUnLCAnYmVmb3JlRGVsZXRlJ10sXG4gIHByaW9yaXR5OiAyMDAsXG4gIGRlc2NyaXB0aW9uOiAnUHJpY2luZyBzYW5pdHksIFNLVSBub3JtYWxpemF0aW9uLCBhbmQgcHJvdGVjdCByZWZlcmVuY2VkIHByb2R1Y3RzIGZyb20gZGVsZXRpb24uJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvLyBUaGUgcmVmdXNhbCBlbnZlbG9wZSAoIzEwNzUpLiBNaXJyb3JlZCBmcm9tIGBzcmMvc2FsZXMvb2JqZWN0cy9fcmVmdXNhbC50c2AgYmVjYXVzZSBhXG4gICAgLy8gbG93ZXJlZCBib2R5IGhhcyBubyBtb2R1bGUgc2NvcGUgYW5kIGBleHRyYWN0SG9va0JvZHlgIFRIUk9XUyBvbiBhblxuICAgIC8vIGltcG9ydDsgYHRlc3QvcmVmdXNhbC1lbnZlbG9wZS50ZXN0LnRzYCBwaW5zIGV2ZXJ5IGNvcHkgYWdhaW5zdCBpdC5cbiAgICBmdW5jdGlvbiByZWZ1c2UoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBjb2RlOiBzdHJpbmcsXG4gICAgICBzdGF0dXM6IG51bWJlcixcbiAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmcgPSBtZXNzYWdlLFxuICAgICk6IEVycm9yIHtcbiAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcihtZXNzYWdlKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29kZTogc3RyaW5nO1xuICAgICAgICBzdGF0dXM6IG51bWJlcjtcbiAgICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZztcbiAgICAgIH07XG4gICAgICBlcnIuY29kZSA9IGNvZGU7XG4gICAgICBlcnIuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgZXJyLnVzZXJNZXNzYWdlID0gdXNlck1lc3NhZ2U7XG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjb25zdCB7IGV2ZW50LCBpbnB1dCwgcHJldmlvdXMgfSA9IGN0eDtcblxuICAgIGlmIChldmVudCA9PT0gJ2JlZm9yZUluc2VydCcgfHwgZXZlbnQgPT09ICdiZWZvcmVVcGRhdGUnKSB7XG4gICAgICAvLyBUaGUgcGF0Y2gncyB2YWx1ZSwgZWxzZSB0aGUgc3RvcmVkIG9uZSBcdTIwMTQgdGhlIGZpcnN0IHRoYXQgaXMgYSBudW1iZXIuXG4gICAgICBjb25zdCBsaXN0UHJpY2UgPSBbaW5wdXQubGlzdF9wcmljZSwgcHJldmlvdXM/Lmxpc3RfcHJpY2VdLmZpbmQoKHYpOiB2IGlzIG51bWJlciA9PiB0eXBlb2YgdiA9PT0gJ251bWJlcicpO1xuICAgICAgY29uc3QgY29zdCA9IFtpbnB1dC5jb3N0LCBwcmV2aW91cz8uY29zdF0uZmluZCgodik6IHYgaXMgbnVtYmVyID0+IHR5cGVvZiB2ID09PSAnbnVtYmVyJyk7XG4gICAgICBpZiAodHlwZW9mIGxpc3RQcmljZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGNvc3QgPT09ICdudW1iZXInICYmIGxpc3RQcmljZSA8IGNvc3QpIHtcbiAgICAgICAgdGhyb3cgcmVmdXNlKFxuICAgICAgICAgIGBMaXN0IFByaWNlICgke2xpc3RQcmljZX0pIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIENvc3QgKCR7Y29zdH0pLmAsXG4gICAgICAgICAgJ1ZBTElEQVRJT05fRkFJTEVEJyxcbiAgICAgICAgICA0MDAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGlucHV0LnNrdSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaW5wdXQuc2t1ID0gaW5wdXQuc2t1LnRvVXBwZXJDYXNlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ID09PSAnYmVmb3JlRGVsZXRlJykge1xuICAgICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaWQgPSBwcmV2aW91cz8uaWQ7XG4gICAgICBpZiAoIWFwaSB8fCAhaWQpIHJldHVybjtcbiAgICAgIGNvbnN0IFtvcHBSZWZzLCBxdW90ZVJlZnNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBhcGkub2JqZWN0KCdjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtJykuY291bnQoeyB3aGVyZTogeyBjcm1fcHJvZHVjdDogaWQgfSB9KS5jYXRjaCgoKSA9PiAwKSxcbiAgICAgICAgYXBpLm9iamVjdCgnY3JtX3F1b3RlX2xpbmVfaXRlbScpLmNvdW50KHsgd2hlcmU6IHsgY3JtX3Byb2R1Y3Q6IGlkIH0gfSkuY2F0Y2goKCkgPT4gMCksXG4gICAgICBdKTtcbiAgICAgIGlmIChvcHBSZWZzICsgcXVvdGVSZWZzID4gMCkge1xuICAgICAgICB0aHJvdyByZWZ1c2UoXG4gICAgICAgICAgYENhbm5vdCBkZWxldGUgcHJvZHVjdDogcmVmZXJlbmNlZCBieSAke29wcFJlZnN9IG9wcG9ydHVuaXR5KGllcykgYW5kICR7cXVvdGVSZWZzfSBxdW90ZShzKS4gU2V0IGlzX2FjdGl2ZT1mYWxzZSB0byByZXRpcmUgaW5zdGVhZC5gLFxuICAgICAgICAgICdERUxFVEVfUkVTVFJJQ1RFRCcsXG4gICAgICAgICAgNDA5LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHByb2R1Y3RIb29rO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL3F1b3RlLmhvb2sudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0cy9xdW90ZS5ob29rLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tDb250ZXh0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEhvb2tBcGkgfSBmcm9tICcuLi8uLi9zYWxlcy9vYmplY3RzL19ob29rLWFwaSc7XG5cbi8qKlxuICogUXVvdGUgd29ya2Zsb3cgaG9vay5cbiAqXG4gKiAtIERlZmF1bHRzIGBleHBpcmF0aW9uX2RhdGVgIHRvIGBxdW90ZV9kYXRlICsgMzAgZGF5c2Agd2hlbiBtaXNzaW5nLlxuICogLSBGcmVlemVzIHF1b3RlcyBvbmNlIGBhY2NlcHRlZGAgb3IgYGV4cGlyZWRgIFx1MjAxNCBhZ2FpbnN0IFVTRVIgZWRpdHMgb25seTogYVxuICogICB3cml0ZSB0aGF0IGlzIHB1cmVseSB0aGUgZW5naW5lIGNsZWFyaW5nIGEgbGluayBpcyBsZXQgdGhyb3VnaC4gVGhlXG4gKiAgIGZyZWV6ZSBjb3ZlcnMgdGhlIHF1b3RlJ3MgTElORSBJVEVNUyB0b28gKCMyMDYwKTogYSB1c2VyIG1heSBuZWl0aGVyIGFkZFxuICogICBhIGxpbmUgdG8gYSBzZXR0bGVkIHF1b3RlIG5vciBjaGFuZ2Ugb25lIG9mIGl0cyBsaW5lcy5cbiAqIC0gUmVmdXNlcyBhIHVzZXIncyBhY2NlcHRhbmNlIHdoaWxlIHRoZSBsaW5rZWQgb3Bwb3J0dW5pdHkgaXMgaGVsZCBieSBhblxuICogICBhcHByb3ZhbCwgYmVjYXVzZSBhY2NlcHRhbmNlIGNsb3NlcyB0aGF0IGRlYWwgYXMgd29uICgjMjAxNCkuXG4gKiAtIE9uIGBhY2NlcHRlZGAsIGRyYWZ0cyBhIGNvbnRyYWN0IFx1MjAxNCBjYXJyeWluZyB0aGUgcXVvdGUncyBuZWdvdGlhdGVkXG4gKiAgIGBwYXltZW50X3Rlcm1zYCBvbnRvIGl0LCBhbmQgZmlsbGluZyB3aGF0IHRoZSBxdW90ZSBjYW5ub3QgZXhwcmVzcyBmcm9tXG4gKiAgIGBEUkFGVF9DT05UUkFDVF9ERUZBVUxUU2AsIGRlY2xhcmVkIHBsYWNlaG9sZGVycyByYXRoZXIgdGhhbiBkZWNpc2lvbnNcbiAqICAgKCMxMTI5KSBcdTIwMTQgYW5kIHB1c2hlcyB0aGUgbGlua2VkIG9wcG9ydHVuaXR5IHRvIGBjbG9zZWRfd29uYC4gVHdvIGhvb2tzLFxuICogICBgcXVvdGVfYWNjZXB0ZWRfY29udHJhY3RfZHJhZnRgIGFuZCBgcXVvdGVfb25fYWNjZXB0ZWRgLCBiZWNhdXNlIG9ubHkgdGhlXG4gKiAgIGRyYWZ0IGlzIGVsZXZhdGVkICgjMjAxNDsgc2VlIGl0cyBub3RlKS5cbiAqL1xuXG4vLyBcdTI2QTBcdUZFMEYgSGVscGVycyB1c2VkIGJ5IGhhbmRsZXJzIGFyZSBkZWNsYXJlZCBJTlNJREUgZWFjaCBoYW5kbGVyIFx1MjAxNCBMMiBob29rIGJvZGllc1xuLy8gcnVuIGJvZHktb25seSBpbiB0aGUgUXVpY2tKUyBzYW5kYm94LCBzbyBtb2R1bGUgc2NvcGUgaXMgbm90IGF2YWlsYWJsZSBhdFxuLy8gcnVudGltZSAoY2YuIG9wcG9ydHVuaXR5Lmhvb2sudHMpLlxuXG5jb25zdCBxdW90ZVZhbGlkYXRpb246IEhvb2sgPSB7XG4gIG5hbWU6ICdxdW90ZV93b3JrZmxvdycsXG4gIC8vIFx1MjZBMFx1RkUwRiBUd28gb2JqZWN0cywgZGVsaWJlcmF0ZWx5ICgjMjA2MCk6IHRoZSBmcmVlemUgYmVsb3cgaXMgT05FIGZyZWV6ZSBcdTIwMTQgdGhlXG4gIC8vIHF1b3RlJ3MgYW5kIGl0cyBsaW5lcycgXHUyMDE0IHNvIGl0IGxpdmVzIGluIG9uZSBwbGFjZSwganVkZ2VkIGJ5IG9uZSB1c2VyL3N5c3RlbVxuICAvLyBib3VuZGFyeSBhbmQgY2FycmllZCBieSBvbmUgZW52ZWxvcGUsIHJhdGhlciB0aGFuIGEgc2Vjb25kIGNvcHkgb2YgYm90aCBvblxuICAvLyB0aGUgbGluZS4gYHRlc3QvcGFja2FnZS1vd25lcnNoaXAudGVzdC50c2AgcmVhZHMgZXZlcnkgbmFtZSBpbiB0aGUgbGlzdC5cbiAgb2JqZWN0OiBbJ2NybV9xdW90ZScsICdjcm1fcXVvdGVfbGluZV9pdGVtJ10sXG4gIGV2ZW50czogWydiZWZvcmVJbnNlcnQnLCAnYmVmb3JlVXBkYXRlJ10sXG4gIHByaW9yaXR5OiAyMDAsXG4gIGRlc2NyaXB0aW9uOiAnRGVmYXVsdCBleHBpcmF0aW9uIGRhdGU7IGZyZWV6ZSBhY2NlcHRlZC9leHBpcmVkIHF1b3RlcyBhbmQgdGhlaXIgbGluZXMuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICAvLyBUaGUgcmVmdXNhbCBlbnZlbG9wZS4gXHUyNkEwXHVGRTBGIE1pcnJvcmVkIGZyb20gYHNyYy9zYWxlcy9vYmplY3RzL19yZWZ1c2FsLnRzYCBiZWNhdXNlIGEgbG93ZXJlZFxuICAgIC8vIGJvZHkgaGFzIG5vIG1vZHVsZSBzY29wZSBhbmQgYGV4dHJhY3RIb29rQm9keWAgVEhST1dTIG9uIGFuIGltcG9ydDtcbiAgICAvLyBgdGVzdC9yZWZ1c2FsLWVudmVsb3BlLnRlc3QudHNgIHBpbnMgZXZlcnkgY29weSBhZ2FpbnN0IGl0LlxuICAgIGZ1bmN0aW9uIHJlZnVzZShcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGNvZGU6IHN0cmluZyxcbiAgICAgIHN0YXR1czogbnVtYmVyLFxuICAgICAgdXNlck1lc3NhZ2U6IHN0cmluZyA9IG1lc3NhZ2UsXG4gICAgKTogRXJyb3Ige1xuICAgICAgY29uc3QgZXJyID0gbmV3IEVycm9yKG1lc3NhZ2UpIGFzIEVycm9yICYge1xuICAgICAgICBjb2RlOiBzdHJpbmc7XG4gICAgICAgIHN0YXR1czogbnVtYmVyO1xuICAgICAgICB1c2VyTWVzc2FnZTogc3RyaW5nO1xuICAgICAgfTtcbiAgICAgIGVyci5jb2RlID0gY29kZTtcbiAgICAgIGVyci5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICBlcnIudXNlck1lc3NhZ2UgPSB1c2VyTWVzc2FnZTtcbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGNvbnN0IHsgZXZlbnQsIGlucHV0LCBwcmV2aW91cyB9ID0gY3R4O1xuXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEEgc2V0dGxlZCBxdW90ZSdzIExJTkVTIGFyZSBmcm96ZW4gd2l0aCBpdCAoIzIwNjAgaXRlbSAxLCBCLTA5KSBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIE1lYXN1cmVkIG9uIDE3LjcuMCBiZWZvcmUgdGhpcyBicmFuY2g6IGEgcmVwIGFkZGVkIGEgbGluZSB0byBhbiBhY2NlcHRlZFxuICAgIC8vIHF1b3RlICgyMDApLCBgcXVvdGVfdG90YWxfcm9sbHVwYCByaWdodGx5IGxlZnQgdGhlIHNldHRsZWQgdG90YWxzIGFsb25lLFxuICAgIC8vIGFuZCB0aGUgcXVvdGUncyBsaW5lcyBzdG9wcGVkIHN1bW1pbmcgdG8gdGhlbS4gVGhlIGRvYyBwcm9taXNlcyB0aGVcbiAgICAvLyBvcHBvc2l0ZSAoYGNvbnRlbnQvZG9jcy9zYWxlcy9xdW90ZXMubWR4YCwgXCJ0aGUgcXVvdGUgaXMgZnJvemVuXCIpLlxuICAgIC8vXG4gICAgLy8gVGhlIGZyZWV6ZSdzIG93biBib3VuZGFyeSwgbm90IGEgc2Vjb25kIG9uZTogVVNFUiB3cml0ZXMgb25seSAoYSBzZWVkIG9yXG4gICAgLy8gaW1wb3J0IGNhcnJpZXMgbm8gdXNlciBhbmQgaXMgbGV0IHRocm91Z2gsIGFzIGJlbG93KSwgYW5kIGFuIHVwZGF0ZSBpc1xuICAgIC8vIGp1ZGdlZCBieSB3aGF0IGl0IENIQU5HRVMsIGxpa2UgYHZpb2xhdGluZ2AgYmVsb3cgXHUyMDE0IGBpZGAgYWRkcmVzc2VzIHRoZVxuICAgIC8vIHJvdywgYHVwZGF0ZWRfYXRgIC8gYHVwZGF0ZWRfYnlgIGFyZSB0aGUgZW5naW5lJ3Mgc3RhbXBzIChtZWFzdXJlZCBvbiBldmVyeVxuICAgIC8vIHVzZXIgdXBkYXRlKSwgYW5kIGBsaW5lX251bWJlcmAgaXMgdGhlIHJlYWQtb25seSBwbGF0Zm9ybSBvcmRpbmFsLCB3aGljaFxuICAgIC8vIHRoZSA0LjAuMCBvbmUtdGltZSBiYWNrLWZpbGwgdG91Y2hlcyB3aXRoIGB7IGxpbmVfbnVtYmVyOiBudWxsIH1gIG9uIGV2ZXJ5XG4gICAgLy8gdW5udW1iZXJlZCBsaW5lLCBzZXR0bGVkIHF1b3RlcyBpbmNsdWRlZC4gQm90aCBwYXJlbnRzIGFyZSBqdWRnZWQsIHNvIGFcbiAgICAvLyBsaW5lIG1vdmVzIG5laXRoZXIgb250byBhIHNldHRsZWQgcXVvdGUgbm9yIG9mZiBvbmUuXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgREVMRVRFIGlzIG5vdCBndWFyZGVkLCBwZW5kaW5nIGEgZGVjaXNpb24gb24gIzIwNjA6IGRlbGV0aW5nIGEgcXVvdGUsXG4gICAgLy8gb3IgdGhlIGFjY291bnQgaXQgY2FzY2FkZXMgZnJvbSwgZGVsZXRlcyBpdHMgbGluZXMgQVMgVEhFIERFTEVUSU5HIFVTRVJcbiAgICAvLyAobWVhc3VyZWQ6IGVhY2ggbGluZSdzIGBiZWZvcmVEZWxldGVgIHNlZXMgdGhhdCB1c2VyKSwgYW5kIG5vIGRlY2xhcmVkXG4gICAgLy8gaG9vay1jb250ZXh0IGtleSB0ZWxscyB0aGF0IGNhc2NhZGUgZnJvbSBhIGhhbmQgZGVsZXRlIG9mIG9uZSBsaW5lIFx1MjAxNCBzbyBhXG4gICAgLy8gZGVsZXRlIGd1YXJkIHdvdWxkIG1ha2UgZXZlcnkgc2V0dGxlZCBxdW90ZSB3aXRoIGxpbmVzIHVuZGVsZXRhYmxlLlxuICAgIGlmIChjdHgub2JqZWN0ID09PSAnY3JtX3F1b3RlX2xpbmVfaXRlbScpIHtcbiAgICAgIGNvbnN0IGNoYW5nZWQgPSBPYmplY3Qua2V5cyhpbnB1dCkuc29tZSgoaykgPT4gIVsnaWQnLCAndXBkYXRlZF9hdCcsICd1cGRhdGVkX2J5JywgJ2xpbmVfbnVtYmVyJ10uaW5jbHVkZXMoaykgJiYgaW5wdXRba10gIT09IHByZXZpb3VzPy5ba10pO1xuICAgICAgZm9yIChjb25zdCBpZCBvZiBuZXcgU2V0KFtpbnB1dC5jcm1fcXVvdGUsIHByZXZpb3VzPy5jcm1fcXVvdGVdKSkge1xuICAgICAgICBjb25zdCBxID0gY2hhbmdlZCAmJiBjdHgudXNlcj8uaWQgJiYgdHlwZW9mIGlkID09PSAnc3RyaW5nJyAmJiBpZFxuICAgICAgICAgID8gYXdhaXQgKGN0eC5hcGkgYXMgSG9va0FwaSB8IHVuZGVmaW5lZCk/Lm9iamVjdCgnY3JtX3F1b3RlJykuZmluZE9uZSh7IHdoZXJlOiB7IGlkIH0sIGZpZWxkczogWydxdW90ZV9udW1iZXInLCAnbmFtZScsICdzdGF0dXMnXSB9KVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgaWYgKHE/LnN0YXR1cyA9PT0gJ2FjY2VwdGVkJyB8fCBxPy5zdGF0dXMgPT09ICdleHBpcmVkJykge1xuICAgICAgICAgIHRocm93IHJlZnVzZShgUXVvdGUgJHtTdHJpbmcocS5xdW90ZV9udW1iZXIpfSAtICR7U3RyaW5nKHEubmFtZSl9IGlzICR7cS5zdGF0dXN9LCBzbyBpdHMgbGluZSBpdGVtcyBjYW4gbm8gbG9uZ2VyIGJlIGFkZGVkIG9yIGNoYW5nZWQuYCwgJ1JFQ09SRF9MT0NLRUQnLCA0MDkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIHF1b3RlIGFzIGV2ZXJ5IHF1b3RlIHN1cmZhY2UgdGl0bGVzIGl0LiBgY3JtX3F1b3RlLmRpc3BsYXlfdGl0bGVgIGlzXG4gICAgLy8gYHF1b3RlX251bWJlciAtIG5hbWVgOyBjb21wb3NlIHRoZSBzYW1lIHBhaXIgZnJvbSB0aGUgdHdvIHN0b3JlZCBjb2x1bW5zXG4gICAgLy8gcmF0aGVyIHRoYW4gYXBwZW5kaW5nIHRoZSByZWNvcmQgaWQuIEEgbG93ZXJlZCBob29rIGJvZHkgY2Fubm90IHJlYWQgdGhlXG4gICAgLy8gZm9ybXVsYSBmaWVsZCBpdHNlbGYsIGFuZCBib3RoIG9mIGl0cyBzb3VyY2VzIGFyZSBhbHJlYWR5IG9uIHRoZVxuICAgIC8vIHByZS1pbWFnZSBcdTIwMTQgdGhlIG51bWJlciBpcyBhbiBlbmdpbmUtaXNzdWVkIGF1dG9udW1iZXIsIHNvIGl0IGlzIHJlYWQgZnJvbVxuICAgIC8vIGBwcmV2aW91c2Agb25seS4gQm90aCByZWZ1c2FscyBiZWxvdyBuYW1lIHRoZSBxdW90ZSB3aXRoIGl0LlxuICAgIGZ1bmN0aW9uIHN1YmplY3QoKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gW3ByZXZpb3VzPy5xdW90ZV9udW1iZXIsIHByZXZpb3VzPy5uYW1lXS5tYXAoKHYpID0+ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB2LnRyaW0oKSA6ICcnKSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAtICcpO1xuICAgICAgcmV0dXJuIGxhYmVsID8gYFF1b3RlICR7bGFiZWx9YCA6ICdRdW90ZSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYGlzb2AgKyBgZGF5c2AsIG9uIE9ORSBjYWxlbmRhciBcdTIwMTQgVVRDLCBlbmQgdG8gZW5kLlxuICAgICAqXG4gICAgICogVGhlIGJhc2UgaXMgbm90IGFuIGluc3RhbnQgaGVyZSwgaXQgaXMgYSBzdG9yZWQgREFURTogYSBiYXJlXG4gICAgICogYFlZWVktTU0tRERgIGlzIHBhcnNlZCBieSB0aGUgZGF0ZS1vbmx5IGZvcm0gb2YgdGhlIHNwZWMsIHdoaWNoIGFuY2hvcnNcbiAgICAgKiBpdCBhdCBVVEMgbWlkbmlnaHQgKG1lYXN1cmVkOiBgbmV3IERhdGUoJzIwMjYtMDEtMDEnKWAgaXNcbiAgICAgKiBgMjAyNi0wMS0wMVQwMDowMDowMC4wMDBaYCBpbiBldmVyeSB6b25lKS4gU28gdGhlIGFuY2hvciB3YXMgYWxyZWFkeVxuICAgICAqIFVUQyBhbmQgb25seSB0aGUgYXJpdGhtZXRpYyB3YXMgbm90IFx1MjAxNCBhbmQgcmVhZGluZyBhIFVUQy1taWRuaWdodCBhbmNob3JcbiAgICAgKiBvbiB0aGUgTE9DQUwgY2FsZW5kYXIgaXMgb2ZmIGJ5IGEgd2hvbGUgZGF5IHdlc3Qgb2YgR3JlZW53aWNoLCB3aGVyZVxuICAgICAqIHRoYXQgaW5zdGFudCBpcyB0aGUgcHJldmlvdXMgZXZlbmluZyAoYGdldERhdGUoKWAgb24gdGhlIHZhbHVlIGFib3ZlXG4gICAgICogYW5zd2VycyAzMSwgbm90IDEpLlxuICAgICAqXG4gICAgICogVGhhdCBpcyB3aHkgdGhpcyBzaXRlJ3MgZXhwb3N1cmUgaXMgbm90IHRoZSBvbmUtaG91ciB3aW5kb3cgdGhlXG4gICAgICogXCJhZHZhbmNlIG5vdyBieSBOIGRheXNcIiBob29rcyBoYXZlOiB0aGUgYW5jaG9yIGRvZXMgbm90IG1vdmUgd2l0aCB0aGVcbiAgICAgKiBjbG9jaywgc28gZXZlcnkgcXVvdGUgd2hvc2UgW3F1b3RlX2RhdGUsIHF1b3RlX2RhdGUgKyBkYXlzXSBzcGFuIGNyb3NzZXNcbiAgICAgKiBhIERTVCB0cmFuc2l0aW9uIHRvb2sgYSAyMyBoIGRheSBhbmQgcmVuZGVyZWQgYSBkYXkgc2hvcnQgXHUyMDE0IG1lYXN1cmVkIGF0XG4gICAgICogNjAgb2YgNzMwIGNvbnNlY3V0aXZlIGJhc2UgZGF0ZXMgaW4gYEFtZXJpY2EvTmV3X1lvcmtgLCBgRXVyb3BlL0JlcmxpbmAsXG4gICAgICogYEFtZXJpY2EvU2FudGlhZ29gLCBgQXVzdHJhbGlhL1N5ZG5leWAgYW5kIGBQYWNpZmljL0F1Y2tsYW5kYCBhbGlrZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBhZGREYXlzKGlzbzogc3RyaW5nLCBkYXlzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGlzbyk7XG4gICAgICBkLnNldFVUQ0RhdGUoZC5nZXRVVENEYXRlKCkgKyBkYXlzKTtcbiAgICAgIHJldHVybiBkLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApO1xuICAgIH1cblxuICAgIGlmIChldmVudCA9PT0gJ2JlZm9yZUluc2VydCcgJiYgIWlucHV0LmV4cGlyYXRpb25fZGF0ZSkge1xuICAgICAgY29uc3QgYmFzZSA9IHR5cGVvZiBpbnB1dC5xdW90ZV9kYXRlID09PSAnc3RyaW5nJyA/IGlucHV0LnF1b3RlX2RhdGUgOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApO1xuICAgICAgaW5wdXQuZXhwaXJhdGlvbl9kYXRlID0gYWRkRGF5cyhiYXNlLCAzMCk7XG4gICAgfVxuXG4gICAgLy8gXHUyNkEwXHVGRTBGIEd1YXJkIE9OTFkgZ2VudWluZSBVU0VSIGVkaXRzIChgY3R4LnVzZXI/LmlkYCBwcmVzZW50KS4gU3lzdGVtIC8gc2VlZCAvXG4gICAgLy8gYmFja2ZpbGwgd3JpdGVzIGNhcnJ5IG5vIHVzZXIgYW5kIGxlZ2l0aW1hdGVseSByZS1hcHBseSBidXNpbmVzcyBmaWVsZHNcbiAgICAvLyAodGhlIHNlZWQncyBxdW90ZV9kYXRlL2V4cGlyYXRpb25fZGF0ZSByZS1ldmFsdWF0ZSBvbiBldmVyeSByZWJvb3QpLCBzb1xuICAgIC8vIGd1YXJkaW5nIHRoZW0gdGhyb3dzIGJvb3QtdGltZSBCb2R5UnVubmVyIGVycm9ycy4gTWF0Y2hlcyB0aGUgc3lzdGVtLXdyaXRlXG4gICAgLy8gY29udmVudGlvbiB1c2VkIGFjcm9zcyB0aGUgY2FzZS9sZWFkL29wcG9ydHVuaXR5IGhvb2tzLlxuICAgIGlmIChldmVudCA9PT0gJ2JlZm9yZVVwZGF0ZScgJiYgcHJldmlvdXMgJiYgY3R4LnVzZXI/LmlkKSB7XG4gICAgICBjb25zdCBmcm96ZW4gPSBwcmV2aW91cy5zdGF0dXMgPT09ICdhY2NlcHRlZCcgfHwgcHJldmlvdXMuc3RhdHVzID09PSAnZXhwaXJlZCc7XG4gICAgICBpZiAoZnJvemVuKSB7XG4gICAgICAgIGNvbnN0IGFsbG93ZWQgPSBuZXcgU2V0KFsnaW50ZXJuYWxfbm90ZXMnXSk7XG4gICAgICAgIC8vIEZyYW1ld29yay1tYW5hZ2VkIGNvbHVtbnMgKG93bmVyc2hpcCwgYXVkaXQgdGltZXN0YW1wcykgYXJlIHJlLXN0YW1wZWRcbiAgICAgICAgLy8gYnkgdGhlIDkueCBydW50aW1lIFx1MjAxNCBuZXZlciB0cmVhdCB0aG9zZSBzeXN0ZW0gd3JpdGVzIGFzIGVkaXRzIHRvIGFcbiAgICAgICAgLy8gZnJvemVuIHF1b3RlLCBvbmx5IHVzZXIgY2hhbmdlcyB0byBidXNpbmVzcyBmaWVsZHMuXG4gICAgICAgIGNvbnN0IFNZU1RFTV9GSUVMRFMgPSBuZXcgU2V0KFtcbiAgICAgICAgICAnaWQnLCAnb3duZXJfaWQnLCAnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ2NyZWF0ZWRfYnknLCAndXBkYXRlZF9ieScsICdzcGFjZV9pZCcsICdvcmdhbml6YXRpb25faWQnLCAnb3JnX2lkJywgJ3ZlcnNpb24nLFxuICAgICAgICBdKTtcbiAgICAgICAgLy8gXHUyNkEwXHVGRTBGIGB2aW9sYXRpbmdgIHJhdGhlciB0aGFuIGBjaGFuZ2VkYDogdGhlIHRocmVlIGZyZWV6ZSBndWFyZHMgc2hhcmVcbiAgICAgICAgLy8gb25lIHJlZmVyZW5jZS1jbGVhbnVwIHByZWRpY2F0ZSB2ZXJiYXRpbSwgYW5kIGEgc2hhcmVkIGJsb2NrIGNhbiBvbmx5XG4gICAgICAgIC8vIGJlIHNoYXJlZCBpZiBpdCByZWFkcyB0aGUgc2FtZSB2YXJpYWJsZSBpbiBhbGwgdGhyZWUuXG4gICAgICAgIGNvbnN0IHZpb2xhdGluZyA9IE9iamVjdC5rZXlzKGlucHV0KS5maWx0ZXIoXG4gICAgICAgICAgKGspID0+ICFhbGxvd2VkLmhhcyhrKSAmJiAhU1lTVEVNX0ZJRUxEUy5oYXMoaykgJiYgaW5wdXRba10gIT09IHByZXZpb3VzW2tdLFxuICAgICAgICApO1xuICAgICAgICBpZiAodmlvbGF0aW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAvLyBFdmVyeSBsb29rdXAgb24gYGNybV9xdW90ZWAgYSByZWZlcmVudGlhbCBjbGVhciBjYW4gYXR0YWNrLlxuICAgICAgICAgIGNvbnN0IFJFRkVSRU5DRV9GSUVMRFMgPSBuZXcgU2V0KFsnY3JtX2FjY291bnQnLCAnY3JtX2NvbnRhY3QnLCAnY3JtX29wcG9ydHVuaXR5J10pO1xuICAgICAgICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCB0aGUgcmVmZXJlbmNlLWNsZWFudXAgeWllbGQgXHUyNTAwXHUyNTAwXG4gICAgICAgICAgLy8gIzcyMC4gVGhlIGVuZ2luZSBpbXBsZW1lbnRzIGBkZWxldGVCZWhhdmlvcjogJ3NldF9udWxsJ2AgYnkgVVBEQVRJTkdcbiAgICAgICAgICAvLyB0aGUgcm93IHRoYXQgSE9MRFMgdGhlIGxvb2t1cCwgc28gZGVsZXRpbmcgdGhlIG9wcG9ydHVuaXR5IChvciB0aGVcbiAgICAgICAgICAvLyBjb250YWN0KSBhbiBBQ0NFUFRFRCBxdW90ZSByZWZlcmVuY2VzIGFycml2ZXMgaGVyZSBhcyBhbiBvcmRpbmFyeVxuICAgICAgICAgIC8vIHVzZXIgYGJlZm9yZVVwZGF0ZWAgXHUyMDE0IGFuZCB0aGlzIGZyZWV6ZSByZWZ1c2VkIGl0LCB3aGljaCBtYWRlIGFcbiAgICAgICAgICAvLyBzZXR0bGVkIHF1b3RlIGFibGUgdG8ga2VlcCBhIGRlYWwsIGEgcGVyc29uIGFuZCAodGhyb3VnaCB0aGVcbiAgICAgICAgICAvLyBtYXN0ZXItZGV0YWlsIGNhc2NhZGUpIHRoYXQgcGVyc29uJ3MgYWNjb3VudCB1bmRlbGV0YWJsZSBmb3JldmVyLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gTWVhc3VyZWQgb24gMTcuMS4wIFx1MjAxNCB0aGUgdmVyc2lvbiB0aGlzIHJlcG8gcGlubmVkIEFUIFRIRSBUSU1FIG9mXG4gICAgICAgICAgLy8gdGhlIG1lYXN1cmVtZW50LCBub3QgdGhlIGN1cnJlbnQgcGluICh0aGUgY2FzY2FkZSBzaGFwZSBiZWxvdyBoYXNcbiAgICAgICAgICAvLyBOT1QgYmVlbiByZS1tZWFzdXJlZCBvbiBhbnkgbGF0ZXIgcGluIFx1MjAxNCBub3QgMTcuMy4wLCAjMTY3Niwgbm90XG4gICAgICAgICAgLy8gMTcuNC4wLCBQUiAjMTgxNCwgYW5kIG5vdCAxNy41LjApIFx1MjAxNCB3aXRoIGEgcHJvYmUgaG9vayBhdCBwcmlvcml0eSAxOTkgaW1tZWRpYXRlbHlcbiAgICAgICAgICAvLyBhaGVhZCBvZiBlYWNoIGd1YXJkLCBub3QgYXNzdW1lZC5cbiAgICAgICAgICAvLyBUaGUgZW5naW5lIGJ1aWxkcyBpdHMgY2xlYW51cCB3cml0ZSBvbiB0aGUgQ0FMTEVSJ3Mgb3duIGNvbnRleHRcbiAgICAgICAgICAvLyBwbHVzIHR3byBlbmdpbmUga2V5cywgc28gb24gdGhlIHBhdGggYSBSRVNUIGBERUxFVEVgIHRha2VzLCB0aGVcbiAgICAgICAgICAvLyBjYXNjYWRlIGFuZCBhIHVzZXIncyBoYW5kLWNsZWFyIG9mIHRoZSBzYW1lIGxvb2t1cCBhcmUgaWRlbnRpY2FsXG4gICAgICAgICAgLy8gZXZlcnl3aGVyZSBhIGd1YXJkIGNhbiBsb29rOiBwYXlsb2FkXG4gICAgICAgICAgLy8gYHsgaWQsIDxsaW5rPjogbnVsbCwgdXBkYXRlZF9hdCwgdXBkYXRlZF9ieSB9YCwgYGN0eC51c2VyYCB0aGVcbiAgICAgICAgICAvLyBDQUxMRVIsIGBjdHguc2Vzc2lvbmAgdGhlIGNhbGxlcidzIG93biBgeyB1c2VySWQsIGlzU3lzdGVtIH1gLlxuICAgICAgICAgIC8vIChCb3RoIGB1cGRhdGVkX2J5YCBhbmQgdGhlIGlkZW50aXR5IGRyb3Agb3V0IHRvZ2V0aGVyIHdoZW4gdGhlXG4gICAgICAgICAgLy8gREVMRVRFIGl0c2VsZiBjYXJyaWVkIG5vIGB1c2VySWRgIFx1MjAxNCBhIHJpZyBhcnRlZmFjdCwgbm90IHRoaXMgYXBwJ3NcbiAgICAgICAgICAvLyBwYXRoLikgU28gdGhlIFdSSVRFIFNIQVBFIGlzIG5vdCBhIGRpc2NyaW1pbmF0b3IsIGFuZCB0aGUgeWllbGRcbiAgICAgICAgICAvLyBiZWxvdyBpcyBub3Qgb25lIGVpdGhlcjogaXQgbGV0cyBBTlkgY2FsbGVyIGNsZWFyIGEgZGVjbGFyZWQgbGlua1xuICAgICAgICAgIC8vIG9uIGEgc2V0dGxlZCByZWNvcmQuIFRoYXQgaXMgdGhlIHRyYWRlICM3MjAgYWNjZXB0ZWQsIG5vdCBhIHNpZGVcbiAgICAgICAgICAvLyBlZmZlY3Qgb2YgaXQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBcdTI2QTBcdUZFMEYgQSBtYXJrZXIgRE9FUyByZWFjaCBhIGhvb2sgXHUyMDE0IGFuZCBpcyBkZWxpYmVyYXRlbHkgbm90IHJlYWQuIEFuXG4gICAgICAgICAgLy8gZWFybGllciB2ZXJzaW9uIG9mIHRoaXMgbm90ZSBjb25jbHVkZWQgXCJubyBtYXJrZXIgcmVhY2hlcyBhIGhvb2ssXG4gICAgICAgICAgLy8gYW5kIHRoZSBXUklURSBTSEFQRSBpcyB0aGUgb25seSBldmlkZW5jZSB0aGVyZSBpc1wiOyBpdCByZWFzb25lZFxuICAgICAgICAgIC8vIG9ubHkgYWJvdXQgYGN0eC5zZXNzaW9uYCwgd2hvc2UgYWxsb3ctbGlzdCByZWFsbHkgZG9lcyBvbWl0XG4gICAgICAgICAgLy8gYF9fYC1wcmVmaXhlZCBvcGVyYXRpb24tcHJpdmF0ZSBrZXlzLCBhbmQgbWlzc2VkIHRoZSBvdGhlciByb3V0ZVxuICAgICAgICAgIC8vIGludG8gdGhlIGNvbnRleHQuIGBPYmplY3RRTC5jYXNjYWRlRGVsZXRlUmVsYXRpb25zYCBidWlsZHNcbiAgICAgICAgICAvLyBgeyAuLi5jb250ZXh0LCBfX3JlZmVyZW50aWFsRmllbGRDbGVhcjogdHJ1ZSB9YCwgcmVhZGFibGUgYXRcbiAgICAgICAgICAvLyBgY3R4LmFwaS5leGVjdXRpb25Db250ZXh0Ll9fcmVmZXJlbnRpYWxGaWVsZENsZWFyYDogbWVhc3VyZWQgYHRydWVgXG4gICAgICAgICAgLy8gb24gZXZlcnkgY2FzY2FkZSBpbnRvIGBjcm1fb3Bwb3J0dW5pdHlgLCBgY3JtX3F1b3RlYCBhbmRcbiAgICAgICAgICAvLyBgY3JtX2xlYWRgLCBgdW5kZWZpbmVkYCBvbiBldmVyeSBoYW5kLWNsZWFyICgjMTE2NSwgIzE0MTIpLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gXHUyNkQ0IFRoZSAjMTE2NSBydWxpbmcgKDIwMjYtMDgtMjUpIHJldmlld2VkIHRoYXQgYW5kIHVwaGVsZCBOT1RcbiAgICAgICAgICAvLyByZWFkaW5nIGl0LCBvbiB0d28gZ3JvdW5kcy4gSXQgaXMgYW4gb3BlcmF0aW9uLXByaXZhdGUga2V5IFx1MjAxNCBhblxuICAgICAgICAgIC8vIHVuZGVjbGFyZWQgZGVwZW5kZW5jeSB0aGF0IGNhbiB2YW5pc2ggaW4gYSBwYXRjaCByZWxlYXNlLiBBbmRcbiAgICAgICAgICAvLyByZWFjaGFiaWxpdHkgdGhyb3VnaCB0aGUgU0hJUFBFRCBwYXRoIGlzIHVucHJvdmVuOiBhIGhvb2sgYm9keSBydW5zXG4gICAgICAgICAgLy8gYm9keS1vbmx5IGluIFF1aWNrSlMsIHdoZXJlIGBidWlsZFNhbmRib3hBcGlgIHBhc3NlcyBgZW5naW5lQ3R4LmFwaWBcbiAgICAgICAgICAvLyBvbmx5IHdoZW4gdGhhdCBleHBvc2VzIGBvYmplY3QoKWAsIGFuZCBvdGhlcndpc2UgYSBzaGltIHdpdGggbm9cbiAgICAgICAgICAvLyBgZXhlY3V0aW9uQ29udGV4dGAgYXQgYWxsLiBHcmVlbiBpbiBhIGtlcm5lbCByaWcgYW5kIHNpbGVudGx5IGZhbHNlXG4gICAgICAgICAgLy8gaW4gcHJvZHVjdGlvbiBpcyB0aGUgd29yc3Qgb3V0Y29tZSBhIGd1YXJkIGNhbiBoYXZlLiBUaGUgZGVjbGFyZWRcbiAgICAgICAgICAvLyByZXBsYWNlbWVudCBgY3R4LnJlZmVyZW50aWFsRmllbGRDbGVhcmAgaXMgYXNrZWQgZm9yIHVwc3RyZWFtIGFzXG4gICAgICAgICAgLy8gb2JqZWN0c3RhY2stYWkvb2JqZWN0c3RhY2sjMTM2NDQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBcdTI2RDQgS2VlcCB0aGlzIG5hcnJvdyAobWFpbnRhaW5lcidzIHJ1bGluZyBvbiAjNzIwLCBPcHRpb24gQSk6IGEgd3JpdGVcbiAgICAgICAgICAvLyB5aWVsZHMgT05MWSB3aGVuIGV2ZXJ5IG9uZSBvZiBpdHMgbm9uLXN5c3RlbSBjaGFuZ2VzIGlzIGEgREVDTEFSRURcbiAgICAgICAgICAvLyBsaW5rIGdvaW5nIGZyb20gYSB2YWx1ZSB0byBgbnVsbGAuIE9uZSBidXNpbmVzcyBmaWVsZCBhbG9uZ3NpZGUgaXQsXG4gICAgICAgICAgLy8gb3IgYSBsaW5rIHJlcG9pbnRlZCB0byBhIE5FVyB2YWx1ZSwgYW5kIHRoZSByZWZ1c2FsIGJlbG93IHN0aWxsXG4gICAgICAgICAgLy8gZmlyZXMuIFRoZSB0aHJlZSBmcmVlemUgZ3VhcmRzIHNoYXJlIHRoaXMgYmxvY2sgdmVyYmF0aW0gXHUyMDE0IHNoYXJpbmdcbiAgICAgICAgICAvLyBpdCBhcyBhbiBpbXBvcnRlZCBoZWxwZXIgaXMgbm90IHBvc3NpYmxlIChob29rIGJvZGllcyBydW4gYm9keS1vbmx5XG4gICAgICAgICAgLy8gaW4gdGhlIHNhbmRib3ggYW5kIGNhbm5vdCByZWFjaCBtb2R1bGUgc2NvcGUpLCBzb1xuICAgICAgICAgIC8vIGB0ZXN0L2ZyZWV6ZS1ndWFyZC1yZWZlcmVuY2UtY2xlYW51cC50ZXN0LnRzYCBwaW5zIHRoZSB0aHJlZSBjb3BpZXNcbiAgICAgICAgICAvLyBhcyBpZGVudGljYWwgdGV4dCBhbmQgcGlucyBib3RoIGRpcmVjdGlvbnMgb2YgdGhlIG5hcnJvd25lc3MuXG4gICAgICAgICAgY29uc3QgaXNSZWZlcmVuY2VDbGVhbnVwID0gdmlvbGF0aW5nLmV2ZXJ5KFxuICAgICAgICAgICAgKGspID0+IFJFRkVSRU5DRV9GSUVMRFMuaGFzKGspICYmIGlucHV0W2tdID09PSBudWxsICYmIHByZXZpb3VzPy5ba10gIT0gbnVsbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChpc1JlZmVyZW5jZUNsZWFudXApIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IHdoYXQgPSBgJHtzdWJqZWN0KCl9IGlzICR7cHJldmlvdXMuc3RhdHVzIGFzIHN0cmluZ31gO1xuICAgICAgICAgIHRocm93IHJlZnVzZShgJHt3aGF0fTsgb25seSBpbnRlcm5hbF9ub3RlcyBtYXkgYmUgZWRpdGVkLiBBdHRlbXB0ZWQ6ICR7dmlvbGF0aW5nLmpvaW4oJywgJyl9LmAsICdSRUNPUkRfTE9DS0VEJywgNDA5KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQW4gYWNjZXB0YW5jZSB0aGUgbGlua2VkIGRlYWwncyBhcHByb3ZhbCBob2xkcyAoIzIwMTQpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgICAgLy9cbiAgICAgIC8vIEFjY2VwdGluZyBhIHF1b3RlIGNsb3NlcyBpdHMgb3Bwb3J0dW5pdHkgYXMgd29uIChgcXVvdGVfb25fYWNjZXB0ZWRgLFxuICAgICAgLy8gYXMgdGhlIENBTExFUikuIFdoaWxlIGFuIGFwcHJvdmFsIGhvbGRzIHRoYXQgZGVhbCwgdGhhdCBjbG9zZSBpc1xuICAgICAgLy8gcmVmdXNlZCBcdTIwMTQgYW5kIGl0IHVzZWQgdG8gYmUgcmVmdXNlZCBvbmUgd3JpdGUgdG9vIGxhdGU6IHRoZSBhY2NlcHRhbmNlXG4gICAgICAvLyB3YXMgYWRtaXR0ZWQsIHRoZSBjbG9zZS13b24gbWV0IHRoZSByZWZ1c2FsIGluc2lkZSBhbiBgYXN5bmNgIGhvb2ssXG4gICAgICAvLyBgb25FcnJvcjogJ2xvZydgIHN3YWxsb3dlZCBpdCwgYW5kIGFuIGFjY2VwdGVkICh0aGVyZWZvcmUgZnJvemVuKSBxdW90ZVxuICAgICAgLy8gc2F0IG9uIGFuIG9wZW4gZGVhbCBpdCBjb3VsZCBuZXZlciBjbG9zZSBhZ2FpbiAobWVhc3VyZWQgb24gMTcuNy4wOiBhXG4gICAgICAvLyBzYWxlcyByZXAsIGEgZGVhbCBwZW5kaW5nIGl0cyBMYXJnZSBEZWFsIEFwcHJvdmFsKS4gTWFpbnRhaW5lciBydWxpbmdcbiAgICAgIC8vIG9uICMyMDE0IChvcHRpb24gQyk6IHJlZnVzZSB0aGUgQUNDRVBUQU5DRSwgYXQgdGhlIG1vbWVudCBpdCBpcyBtYWRlLFxuICAgICAgLy8gc28gYW4gYXBwcm92YWwgc3RheXMgYW4gYXBwcm92YWwgYW5kIHRoZSByZXAgbGVhcm5zIHdoeS5cbiAgICAgIC8vXG4gICAgICAvLyBcIkhlbGRcIiBpcyBleGFjdGx5IHdoYXQgbWFrZXMgdGhhdCBjbG9zZS13b24gZmFpbCwgbWVhc3VyZWQgcGVyIHN0YXRlXG4gICAgICAvLyBvbiAxNy43LjAgd2l0aCBhIHJlcCdzIGRpcmVjdCBjbG9zZSBcdTIwMTQgbm8gd2lkZXI6XG4gICAgICAvLyAgIFx1MjAyMiBgYXBwcm92YWxfc3RhdHVzYCBgcGVuZGluZ2A6IHRoZSBMYXJnZSBEZWFsIEFwcHJvdmFsJ3MgcmVxdWVzdCBpc1xuICAgICAgLy8gICAgIG9wZW4sIGFuZCBpdHMgYXBwcm92YWwgbm9kZSBsb2NrcyB0aGUgcmVjb3JkIChgbG9ja1JlY29yZDogdHJ1ZWApXG4gICAgICAvLyAgICAgXHUyMTkyIHRoZSBwbGF0Zm9ybSdzIFJFQ09SRF9MT0NLRUQuIFRoZSBjb2x1bW4gaXMgdGhlIG5vZGUncyBvd25cbiAgICAgIC8vICAgICBtaXJyb3Igb2YgdGhlIGxpdmUgcmVxdWVzdCAoYGFwcHJvdmFsU3RhdHVzRmllbGRgKTsgYSByZWNhbGxlZCBvclxuICAgICAgLy8gICAgIGRlY2lkZWQgcmVxdWVzdCBsZWF2ZXMgaXQgYHJlamVjdGVkYCAvIGBhcHByb3ZlZGAsIGFuZCBuZWl0aGVyXG4gICAgICAvLyAgICAgaG9sZHMgdGhlIGRlYWwgKHRoZSBjbG9zZSBnb2VzIHRocm91Z2ggb24gYm90aCk7XG4gICAgICAvLyAgIFx1MjAyMiBgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXNgIGBwZW5kaW5nYCBvciBgcmVqZWN0ZWRgIChSRVEtMDAwNixcbiAgICAgIC8vICAgICBvbmNlIGFuIGluc3RhbGwgYXJtcyBpdCkgXHUyMTkyIGBvcHBvcnR1bml0eV9saWZlY3ljbGVgJ3MgcmVmdXNhbCBvZiBhXG4gICAgICAvLyAgICAgZGlyZWN0IGNsb3NlOyB3aXRoIGEgcmVxdWVzdCBvcGVuIHRoZSBwbGF0Zm9ybSBsb2NrIGhvbGRzIHRvbztcbiAgICAgIC8vICAgXHUyMDIyIGBxdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1c2AgYHBlbmRpbmdgIG9yIGByZWplY3RlZGAgKHRoZSBcdTdBQ0JcdTk4NzlcbiAgICAgIC8vICAgICBnYXRlLCBvbmNlIGFybWVkKSBcdTIxOTIgYG9wcG9ydHVuaXR5X2xpZmVjeWNsZWAncyByZWZ1c2FsIG9mIGFueSBzdGFnZVxuICAgICAgLy8gICAgIG1vdmUuIEl0cyBhcHByb3ZhbCBub2RlIGRvZXMgTk9UIGxvY2sgdGhlIHJlY29yZCAoYGxvY2tSZWNvcmQ6XG4gICAgICAvLyAgICAgZmFsc2VgKTsgdGhlIHJlZnVzYWwgaXMgdGhlIGFwcCdzIGdhdGUsIGFuZCBpdCBpcyBtaXJyb3JlZCBmb3IgdGhhdC5cbiAgICAgIC8vIEEgY2xvc2VkIGRlYWwgaXMgbmV2ZXIgY2xvc2Utd29uIGFnYWluLCBzbyBpdCBob2xkcyBub3RoaW5nIGhlcmUuXG4gICAgICAvL1xuICAgICAgLy8gXHUyNkEwXHVGRTBGIEJPVU5EQVJJRVMsIHJlY29yZGVkIHJhdGhlciB0aGFuIGhpZGRlbi4gUmVhZCBhcyB0aGUgQ0FMTEVSOiBhIGRlYWxcbiAgICAgIC8vIHRoZSBjYWxsZXIgY2Fubm90IHJlYWQgY2Fubm90IGJlIGNsb3NlZCBieSB0aGVtIGVpdGhlciwgZm9yIGEgcmVhc29uXG4gICAgICAvLyB0aGF0IGlzIG5vdCBhbiBhcHByb3ZhbCwgYW5kIHRoYXQgaXMgbm90IHRoaXMgZ2F0ZSdzIHRvIG5hbWUgXHUyMDE0IHNvIGFuXG4gICAgICAvLyB1bnJlYWRhYmxlIGRlYWwsIG9yIGEgcmVhZCB0aGF0IGZhaWxzLCBzdGFuZHMgZG93bi4gVVNFUiB3cml0ZXMgb25seSxcbiAgICAgIC8vIHRoZSBib3VuZGFyeSB0aGUgZnJlZXplIGFib3ZlIGRyYXdzOiBhIHN5c3RlbSB3cml0ZSdzIGNsb3NlLXdvbiBpcyBub3RcbiAgICAgIC8vIGhlbGQgYnkgdGhlIGxvY2sgb3IgYnkgZWl0aGVyIGFwcCBnYXRlIChib3RoIGp1ZGdlIHVzZXJzKSwgc28gcmVmdXNpbmdcbiAgICAgIC8vIGl0cyBhY2NlcHRhbmNlIHdvdWxkIGJlIHdpZGVyIHRoYW4gdGhlIGNvbmRpdGlvbiBpdCBtaXJyb3JzLlxuICAgICAgaWYgKGlucHV0LnN0YXR1cyA9PT0gJ2FjY2VwdGVkJyAmJiBwcmV2aW91cy5zdGF0dXMgIT09ICdhY2NlcHRlZCcpIHtcbiAgICAgICAgY29uc3QgZGVhbElkID0gW2lucHV0LmNybV9vcHBvcnR1bml0eSwgcHJldmlvdXMuY3JtX29wcG9ydHVuaXR5XS5maW5kKCh2KSA9PiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdik7XG4gICAgICAgIGNvbnN0IGRlYWwgPSBkZWFsSWRcbiAgICAgICAgICA/IGF3YWl0IChjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQpPy5vYmplY3QoJ2NybV9vcHBvcnR1bml0eScpLmZpbmRPbmUoe1xuICAgICAgICAgICAgd2hlcmU6IHsgaWQ6IGRlYWxJZCB9LFxuICAgICAgICAgICAgZmllbGRzOiBbJ3N0YWdlJywgJ2FwcHJvdmFsX3N0YXR1cycsICdzdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1cycsICdxdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1cyddLFxuICAgICAgICAgIH0pLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgICAvLyBFYWNoIGhvbGQgaXMgbmFtZWQgYnkgdGhlIGZpZWxkIGxhYmVsIGFuZCB2YWx1ZSB0aGUgcmVwIHNlZXMgb24gdGhlXG4gICAgICAgIC8vIGRlYWwgaXRzZWxmLCBzbyB0aGUgc2VudGVuY2UgcG9pbnRzIGF0IHdoZXJlIHRvIGxvb2suIEEgYHJlamVjdGVkYFxuICAgICAgICAvLyBMYXJnZSBEZWFsIEFwcHJvdmFsIGhvbGRzIG5vdGhpbmcgKG1lYXN1cmVkOiB0aGUgY2xvc2UgZ29lcyB0aHJvdWdoKS5cbiAgICAgICAgY29uc3QgaGVsZCA9IGRlYWwgJiYgIVN0cmluZyhkZWFsLnN0YWdlKS5zdGFydHNXaXRoKCdjbG9zZWRfJylcbiAgICAgICAgICA/IFtbJ2FwcHJvdmFsX3N0YXR1cycsICdBcHByb3ZhbCBTdGF0dXMnXSwgWydzdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1cycsICdTdGF0dXMgQ2hhbmdlIEFwcHJvdmFsJ10sIFsncXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXMnLCAnUXVhbGlmaWNhdGlvbiBBcHByb3ZhbCddXVxuICAgICAgICAgICAgLmZpbHRlcigoW2ZdKSA9PiBkZWFsW2ZdID09PSAncGVuZGluZycgfHwgKGRlYWxbZl0gPT09ICdyZWplY3RlZCcgJiYgZiAhPT0gJ2FwcHJvdmFsX3N0YXR1cycpKVxuICAgICAgICAgICAgLm1hcCgoW2YsIGxhYmVsXSkgPT4gYCR7bGFiZWx9IGlzICR7ZGVhbFtmXSA9PT0gJ3BlbmRpbmcnID8gJ1BlbmRpbmcnIDogJ1JlamVjdGVkJ31gKVxuICAgICAgICAgIDogW107XG4gICAgICAgIC8vIFRoZSBxdW90ZSBoYXMgZXhhY3RseSBvbmUgb3Bwb3J0dW5pdHksIHNvIFwiaXRzIG9wcG9ydHVuaXR5XCIgbmFtZXMgdGhlXG4gICAgICAgIC8vIGRlYWwgdW5hbWJpZ3VvdXNseSBcdTIwMTQgYW5kIFx1MjZENCBuZXZlciBieSBpdHMgcmVjb3JkIGlkLlxuICAgICAgICBpZiAoaGVsZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3Qgd2hhdCA9IGAke3N1YmplY3QoKX0gY2Fubm90IGJlIGFjY2VwdGVkIHdoaWxlIGl0cyBvcHBvcnR1bml0eSBpcyBoZWxkIGJ5IGFuIGFwcHJvdmFsYDtcbiAgICAgICAgICB0aHJvdyByZWZ1c2UoYCR7d2hhdH0gKCR7aGVsZC5qb2luKCc7ICcpfSk6IGFjY2VwdGluZyBpdCB3b3VsZCBjbG9zZSB0aGF0IGRlYWwgYXMgd29uLiBBY2NlcHQgaXQgb25jZSB0aGUgYXBwcm92YWwgaXMgZ3JhbnRlZC5gLCAnUkVDT1JEX0xPQ0tFRCcsIDQwOSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG59O1xuXG4vKipcbiAqIE9uIGFjY2VwdGFuY2U6IGRyYWZ0IHRoZSBjb250cmFjdC5cbiAqXG4gKiAjIyBgcnVuQXM6ICdzeXN0ZW0nYCwgYW5kIHdoeSB0aGUgY2xvc2Utd29uIGlzIGEgc2VwYXJhdGUgaG9vayAoIzIwMTQpXG4gKlxuICogQSBzYWxlcyByZXAgaG9sZHMgYGNybV9jb250cmFjdC5hbGxvd0NyZWF0ZTogZmFsc2VgLCBhbmQgYSByZXAgYWNjZXB0aW5nIHRoZVxuICogcXVvdGUgb24gdGhlaXIgb3duIGRlYWwgaXMgdGhlIG9yZGluYXJ5IENQUSBwYXRoIFx1MjAxNCBzbyBhcyB0aGUgY2FsbGVyIHRoZVxuICogZHJhZnQgd2FzIHJlZnVzZWQgKFwiWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb25cIiksIGBvbkVycm9yOiAnbG9nJ2Agc3dhbGxvd2VkXG4gKiBpdCwgYW5kIHRoZSBkZWFsIHdlbnQgYGNsb3NlZF93b25gIHdpdGggbm8gY29udHJhY3QgKG1lYXN1cmVkIG9uIDE3LjcuMCkuXG4gKiBUaGUgZHJhZnQgaXMgdGhlIGJ1c2luZXNzJ3MgcGFwZXJ3b3JrIGZvciBhIHNhbGUgdGhlIHJlcCBpcyBlbnRpdGxlZCB0b1xuICogcmVjb3JkLCBub3QgdGhlIHJlcCBhdXRob3JpbmcgYSBjb250cmFjdCwgc28gdGhpcyBob29rIGVsZXZhdGVzIChBR0VOVFMubWRcbiAqIHJ1bGUgOSk7IHRoZSByZXAgc3RpbGwgY2Fubm90IGNyZWF0ZSBhIGNvbnRyYWN0IGJ5IGhhbmQuIEVsZXZhdGlvbiBpcyBub3RcbiAqIGFub255bWl0eTogdGhlIGNvbnRyYWN0J3MgYGNyZWF0ZWRfYnlgIG5hbWVzIHRoZSBwZXJzb24gd2hvIGFjY2VwdGVkLlxuICpcbiAqIEVsZXZhdGluZyBhcyBsaXR0bGUgYXMgcG9zc2libGUgaXMgd2h5IHRoZSBjbG9zZS13b24gaXMgTk9UIGhlcmUuIGBydW5Bc2AgaXNcbiAqIHBlciBob29rLCBhbmQgYSBzeXN0ZW0gd3JpdGUgaXMgbm90IGhlbGQgYnkgYW4gYXBwcm92YWwncyByZWNvcmQgbG9jazpcbiAqIGVsZXZhdGVkLCBhbiBhY2NlcHRlZCBxdW90ZSB3b3VsZCBjbG9zZSBhIGRlYWwgaXRzIG1hbmFnZXIgaGFzIG5vdCBhcHByb3ZlZC5cbiAqIGBxdW90ZV9vbl9hY2NlcHRlZGAga2VlcHMgdGhhdCB3cml0ZSB0aGUgY2FsbGVyJ3MuIFRoZSB0d28gd2VyZSBhbHJlYWR5XG4gKiBpbmRlcGVuZGVudCBsZWdzICgjNzE0KSBcdTIwMTQgYSBjb250cmFjdCB0aGF0IHdpbGwgbm90IGRyYWZ0IG11c3Qgbm90IGRlY2lkZVxuICogd2hldGhlciB0aGUgZGVhbCBpcyB3b24gXHUyMDE0IGFuZCB0d28gaG9va3MgbWFrZSB0aGF0IHN0cnVjdHVyYWwuXG4gKlxuICogT3JnYW5pemF0aW9uIChBR0VOVFMubWQgcnVsZSAxMCk6IGl0IGlzc3VlcyBubyByZWFkLCBzbyB0aGVyZSBpcyBubyBzY2FuIHRvXG4gKiBwaW47IGl0cyBvbmUgd3JpdGUgaXMgYW4gaW5zZXJ0IGJ1aWx0IGZyb20gdGhlIHRyaWdnZXJpbmcgcXVvdGUncyBvd24gbGlua3MsXG4gKiBhbmQgdGhlIGVuZ2luZSBzdGFtcHMgaXRzIGBvcmdhbml6YXRpb25faWRgIGZyb20gdGhlIHRyaWdnZXIncyBjb250ZXh0LCB3aGljaFxuICogZWxldmF0aW9uIGNhcnJpZXMgdGhyb3VnaCB1bmNoYW5nZWQgKGB3aXRoUnVuQXMoJ3N5c3RlbScpYCBpcyB0aGUgdHJpZ2dlcmluZ1xuICogY29udGV4dCBwbHVzIGBpc1N5c3RlbWApIFx1MjAxNCBwaW5uZWQgb24gYSB3YWxsZWQgZGVwbG95bWVudCBieVxuICogYHRlc3QvaG9vay1vcmctaW5oZXJpdGFuY2UudGVzdC50c2AuXG4gKi9cbmNvbnN0IHF1b3RlQWNjZXB0ZWRDb250cmFjdERyYWZ0OiBIb29rID0ge1xuICBuYW1lOiAncXVvdGVfYWNjZXB0ZWRfY29udHJhY3RfZHJhZnQnLFxuICBvYmplY3Q6ICdjcm1fcXVvdGUnLFxuICBldmVudHM6IFsnYWZ0ZXJVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDgwMCxcbiAgYXN5bmM6IHRydWUsXG4gIG9uRXJyb3I6ICdsb2cnLFxuICBydW5BczogJ3N5c3RlbScsXG4gIGRlc2NyaXB0aW9uOiAnRHJhZnQgdGhlIGFjY2VwdGVkIHF1b3RlXHUyMDE5cyBjb250cmFjdC4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXQsIHByZXZpb3VzIH0gPSBjdHg7XG4gICAgaWYgKGlucHV0LnN0YXR1cyAhPT0gJ2FjY2VwdGVkJyB8fCBwcmV2aW91cz8uc3RhdHVzID09PSAnYWNjZXB0ZWQnKSByZXR1cm47XG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXBpKSByZXR1cm47XG5cbiAgICAvLyBSZWFsIGNhbGVuZGFyIG1vbnRocyBcdTIwMTQgYGRheXMgKiAzMGAgc2hvcnRlZCBhIDEyLW1vbnRoIHRlcm0gYnkgfjUgZGF5c1xuICAgIC8vIGFuZCBvbmx5IHNsaXBwZWQgcGFzdCBjb250cmFjdF92YWxpZGF0aW9uJ3MgXHUwMEIxMS1tb250aCB0b2xlcmFuY2UgYnkgbHVjay5cbiAgICAvL1xuICAgIC8vIE9uIHRoZSBVVEMgY2FsZW5kYXIgdGhyb3VnaG91dCwgZm9yIHRoZSByZWFzb24gYGFkZERheXNgIGRvY3VtZW50cyBpblxuICAgIC8vIHRoZSBzaWJsaW5nIGhvb2sgYWJvdmU6IHRoZSBiYXNlIGlzIGEgVVRDLW1pZG5pZ2h0LWFuY2hvcmVkIGRhdGUgc3RyaW5nLFxuICAgIC8vIHNvIGEgbG9jYWwgYGdldE1vbnRoYC9gc2V0TW9udGhgIHN0ZXAgcmVhZHMgdGhhdCBhbmNob3IgYXMgdGhlIHByZXZpb3VzXG4gICAgLy8gZXZlbmluZyBhbmQgcmVuZGVycyBhIGRheSBzaG9ydCB3aGVuZXZlciB0aGUgb2Zmc2V0IGF0IHRoZSBlbmQgb2YgdGhlXG4gICAgLy8gdGVybSBkaWZmZXJzIGZyb20gdGhlIG9mZnNldCBhdCBpdHMgc3RhcnQuIEEgMTItbW9udGggdGVybSBtYWtlcyB0aGF0XG4gICAgLy8gcmFyZSBidXQgbm90IGFic2VudCBcdTIwMTQgbWVhc3VyZWQgb24gOSBvZiA3MzAgY29uc2VjdXRpdmUgc3RhcnQgZGF0ZXMgaW5cbiAgICAvLyBgQW1lcmljYS9OZXdfWW9ya2AgKGUuZy4gYDIwMjYtMTEtMDJgICsgMTIgbW9udGhzIGFuc3dlcmVkXG4gICAgLy8gYDIwMjctMTEtMDFgKSwgYW5kIGl0IGlzIGBjcm1fY29udHJhY3QuZW5kX2RhdGVgLCBhIGRhdGUgdGhlIGN1c3RvbWVyIGlzXG4gICAgLy8gaW52b2ljZWQgYWdhaW5zdC5cbiAgICBmdW5jdGlvbiBhZGRNb250aHMoaXNvOiBzdHJpbmcsIG1vbnRoczogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShpc28pO1xuICAgICAgZC5zZXRVVENNb250aChkLmdldFVUQ01vbnRoKCkgKyBtb250aHMpO1xuICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlyc3QgY2FuZGlkYXRlIHRoYXQgaXMgYSBub24tZW1wdHkgcmVjb3JkIGlkLCBvciBgdW5kZWZpbmVkYCAoIzcxNCkuXG4gICAgICpcbiAgICAgKiBUaGUgaWQgY2hhaW5zIGhlcmUgdXNlZCB0byBiZSB3cml0dGVuIGAodHlwZW9mIGEgPT09ICdzdHJpbmcnICYmIGEpIHx8ICh0eXBlb2ZcbiAgICAgKiBiID09PSAnc3RyaW5nJyAmJiBiKWAsIHdob3NlIHZhbHVlIHdoZW4gTkVJVEhFUiBvcGVyYW5kIGhvbGRzIGlzIGJvb2xlYW5cbiAgICAgKiBgZmFsc2VgIFx1MjAxNCBub3QgYHVuZGVmaW5lZGAuIGBmYWxzZWAgaXMgYSBWQUxVRTogaXQgd2VudCBpbnRvIHRoZSBjb250cmFjdFxuICAgICAqIGRvY3VtZW50IGFzIHRoZSBjb250ZW50IG9mIGEgbG9va3VwLCBhbmQgYSBsb29rdXAgY29sdW1uIHRha2VzIGEgcmVjb3JkIGlkXG4gICAgICogb3Igbm90aGluZyBhdCBhbGwuIFdoYXQgdGhlIGVuZ2luZSBkaWQgd2l0aCBpdCBkZXBlbmRzIG9uIHRoZSBkZXBsb3ltZW50J3NcbiAgICAgKiBBRFItMDEwNCB2YWx1ZS1zaGFwZSBwb3N0dXJlLCBhbmQgYm90aCBvdXRjb21lcyBhcmUgd3Jvbmc6XG4gICAgICpcbiAgICAgKiAgIC0gd2Fybi1maXJzdCAoYSBkZXBsb3ltZW50IHRoYXQgaGFzIG5vdCBydW4gYG9zIG1pZ3JhdGUgdmFsdWUtc2hhcGVzXG4gICAgICogICAgIC0tYXBwbHlgKTogdGhlIHdyaXRlIGlzIEFETUlUVEVEIHdpdGggYSBgW3ZhbHVlLXNoYXBlXSBcdTIwMjYgYWNjZXB0ZWQgZm9yXG4gICAgICogICAgIG5vd2Agd2FybmluZywgYW5kIGBjcm1fY29udGFjdCA9IGZhbHNlYCBpcyBwZXJzaXN0ZWQgaW50byBhIHJlZmVyZW5jZVxuICAgICAqICAgICBjb2x1bW4gXHUyMDE0IGEgcm93IHRoZSB2YWx1ZS1zaGFwZSBzY2FuIHdpbGwgbGF0ZXIgcmVmdXNlIHRvIGNvbnZlcnQ7XG4gICAgICogICAtIHN0cmljdCAoYWZ0ZXIgdGhhdCBnYXRlLCBvciBgT1NfREFUQV9WQUxVRV9TSEFQRV9TVFJJQ1RfRU5BQkxFRD0xYCk6XG4gICAgICogICAgIGBWYWxpZGF0aW9uRXJyb3I6IFByaW1hcnkgQ29udGFjdCBoYXMgYW4gaW52YWxpZCBsb29rdXAgdmFsdWU6IEludmFsaWRcbiAgICAgKiAgICAgaW5wdXQ6IGV4cGVjdGVkIHN0cmluZywgcmVjZWl2ZWQgYm9vbGVhbmAsIHdoaWNoIGFib3J0ZWQgdGhpcyB3aG9sZVxuICAgICAqICAgICBoYW5kbGVyIFx1MjAxNCBzbyBubyBjb250cmFjdCwgYW5kIHRoZSBjbG9zZS13b24gbGVnIGJlbG93IG5ldmVyIHJhbi5cbiAgICAgKlxuICAgICAqIGB1bmRlZmluZWRgIGlzIHRoZSBvbmx5IGNvcnJlY3QgXCJ0aGVyZSBpcyBubyBpZCBoZXJlXCI6IGl0IGRvZXMgbm90IHN1cnZpdmVcbiAgICAgKiB0aGUgSlNPTiBob3AgaW50byB0aGUgZW5naW5lLCBhbmQgdGhlIHdyaXRlcyBiZWxvdyBkcm9wIHRoZSBrZXkgb3V0cmlnaHQsXG4gICAgICogc28gYW4gYWJzZW50IG9wdGlvbmFsIGxpbmsgaXMgYW4gQUJTRU5UIENPTFVNTiByYXRoZXIgdGhhbiBhIGp1bmsgdmFsdWUuXG4gICAgICovXG4gICAgY29uc3QgcGlja0lkID0gKC4uLmNhbmRpZGF0ZXM6IHVua25vd25bXSk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PlxuICAgICAgY2FuZGlkYXRlcy5maW5kKChjKTogYyBpcyBzdHJpbmcgPT4gdHlwZW9mIGMgPT09ICdzdHJpbmcnICYmIGMgIT09ICcnKTtcblxuICAgIGNvbnN0IGFjY291bnRJZCA9IHBpY2tJZChpbnB1dC5jcm1fYWNjb3VudCwgcHJldmlvdXM/LmNybV9hY2NvdW50KTtcbiAgICBjb25zdCBjb250YWN0SWQgPSBwaWNrSWQoaW5wdXQuY3JtX2NvbnRhY3QsIHByZXZpb3VzPy5jcm1fY29udGFjdCk7XG4gICAgY29uc3Qgb3Bwb3J0dW5pdHlJZCA9IHBpY2tJZChpbnB1dC5jcm1fb3Bwb3J0dW5pdHksIHByZXZpb3VzPy5jcm1fb3Bwb3J0dW5pdHkpO1xuICAgIGNvbnN0IG93bmVySWQgPSBwaWNrSWQoaW5wdXQub3duZXJfaWQsIHByZXZpb3VzPy5vd25lcl9pZCwgY3R4LnVzZXI/LmlkKTtcbiAgICBjb25zdCB0b3RhbFByaWNlID0gW2lucHV0LnRvdGFsX3ByaWNlLCBwcmV2aW91cz8udG90YWxfcHJpY2VdLmZpbmQoKHYpID0+IHR5cGVvZiB2ID09PSAnbnVtYmVyJykgPz8gMDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBwYXltZW50IHRlcm1zIHRoZSBjdXN0b21lciBhY3R1YWxseSBuZWdvdGlhdGVkLlxuICAgICAqXG4gICAgICogUXVvdGUgYW5kIENvbnRyYWN0IHNoYXJlIG9uZSBgcGF5bWVudF90ZXJtc2Agdm9jYWJ1bGFyeSBiZWNhdXNlIGFuXG4gICAgICogYWNjZXB0ZWQgcXVvdGUncyB0ZXJtcyBjYXJyeSBvdmVyIHRvIHRoZSBjb250cmFjdCBcdTIwMTQgYnV0IG9ubHkgaWYgc29tZXRoaW5nXG4gICAgICogY2FycmllcyB0aGVtLiBXaXRob3V0IHRoaXMgdGhlIGRyYWZ0ZWQgY29udHJhY3QgdGFrZXNcbiAgICAgKiBgY3JtX2NvbnRyYWN0LnBheW1lbnRfdGVybXNgJ3Mgb3duIG9wdGlvbiBkZWZhdWx0IGBuZXRfMzBgIG9uIGV2ZXJ5XG4gICAgICogYWNjZXB0ZWQgcXVvdGUsIGluY2x1ZGluZyBvbmUgbmVnb3RpYXRlZCBhdCBgZHVlX29uX3JlY2VpcHRgOyBhbmQgdGhlXG4gICAgICogY29udHJhY3QncyBgcGF5bWVudF90ZXJtc2AgaXMgb25lIG9mIHRoZSBmaWVsZHNcbiAgICAgKiBgc3JjL3JldmVudWUvZmxvd3MvYmlsbGluZy1oYW5kb2ZmLWNvbnRyYWN0LWFjdGl2YXRlZC5mbG93LnRzYCBQT1NUcyB0b1xuICAgICAqIGJpbGxpbmcgd2hlbiB0aGUgY29udHJhY3QgYWN0aXZhdGVzLCBzbyBhIGRlZmF1bHRlZCB0ZXJtIGJlY29tZXMgYW5cbiAgICAgKiBpbnZvaWNpbmcgdGVybS5cbiAgICAgKlxuICAgICAqIFJlYWQgbGlrZSBgdG90YWxQcmljZWAgYWJvdmU6IHRoZSBwYXRjaCdzIHZhbHVlIHdoZW4gdGhlIGFjY2VwdGluZyB3cml0ZVxuICAgICAqIGNhcnJpZWQgb25lLCBlbHNlIHRoZSB2YWx1ZSBhbHJlYWR5IG9uIHRoZSBxdW90ZSBcdTIwMTQgYHBpY2tJZGAncyBydWxlXG4gICAgICogZXhhY3RseSAodGhlIGZpcnN0IG5vbi1lbXB0eSBzdHJpbmcpLCBzbyBpdCBpcyByZWFkIHdpdGggYHBpY2tJZGAuIEFcbiAgICAgKiBxdW90ZSB0aGF0IG5ldmVyIGNob3NlIGEgdGVybSB5aWVsZHMgYHVuZGVmaW5lZGAsIHdoaWNoIGRyb3BzIHRoZSBrZXkgYW5kXG4gICAgICogbGV0cyB0aGUgY29udHJhY3QncyBvd24gZGVmYXVsdCBhcHBseS5cbiAgICAgKi9cbiAgICBjb25zdCBwYXltZW50VGVybXMgPSBwaWNrSWQoaW5wdXQucGF5bWVudF90ZXJtcywgcHJldmlvdXM/LnBheW1lbnRfdGVybXMpO1xuXG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc2xpY2UoMCwgMTApO1xuXG4gICAgLyoqXG4gICAgICogUExBQ0VIT0xERVIgREVGQVVMVFMgXHUyMDE0IGRlY2xhcmVkIGFzIGRlZmF1bHRzLCBOT1QgZGVjaWRlZCBhcyBidXNpbmVzc1xuICAgICAqIGZhY3RzICgjMTEyOSBydWxpbmcsIDIwMjYtMDgtMzEpLiBBbiBhdXRvLWRyYWZ0ZWQgY29udHJhY3QgaXMgYSBTVEFSVElOR1xuICAgICAqIERSQUZUIGFuIGFkbWluIGNvbXBsZXRlcywgbm90IGEgZmFpdGhmdWwgdHJhbnNjcmlwdGlvbiBvZiB3aGF0IHdhcyBzb2xkLlxuICAgICAqIGBjcm1fY29udHJhY3RgIHJlcXVpcmVzIGFsbCB0aHJlZSwgYSBxdW90ZSBjYW4gZXhwcmVzcyBub25lIG9mIHRoZW0sIHNvXG4gICAgICogdGhlIGhvb2sgaGFzIHRvIHN1cHBseSBzb21ldGhpbmc7IG5vbmUgb2YgaXQgaXMgZXZpZGVuY2UgYWJvdXQgdGhlIGRlYWw6XG4gICAgICpcbiAgICAgKiAgIC0gYGNvbnRyYWN0X3Rlcm1fbW9udGhzYCBcdTIwMTQgYHJlcXVpcmVkICsgbm90TnVsbCArIG1pbjogMWAgb24gdGhlXG4gICAgICogICAgIGNvbnRyYWN0LCBhbmQgdGhlIHF1b3RlIGhhcyBub3doZXJlIHRvIHJlY29yZCBhIHRlcm0uIDEyIGlzIGEgZ3Vlc3NcbiAgICAgKiAgICAgd2l0aCBub3RoaW5nIGJlaGluZCBpdDtcbiAgICAgKiAgIC0gYGNvbnRyYWN0X3R5cGVgIFx1MjAxNCB0aGUgY29udHJhY3QgZGVjbGFyZXMgc2l4IHZhbHVlcyAoc3Vic2NyaXB0aW9uIC9cbiAgICAgKiAgICAgc2VydmljZSAvIGxpY2Vuc2UgLyBwYXJ0bmVyc2hpcCAvIG5kYSAvIG1zYSkgYW5kIE5PIG9wdGlvbiBkZWZhdWx0LFxuICAgICAqICAgICBzbyB0aGlzIGxpbmUgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBldmVyIHBpY2tzIG9uZTogZXZlcnlcbiAgICAgKiAgICAgYXV0by1kcmFmdGVkIGNvbnRyYWN0IGluIHRoZSBhcHAgaXMgYSBzdWJzY3JpcHRpb24gYW5kIHRoZSBvdGhlclxuICAgICAqICAgICBmaXZlIHR5cGVzIGFyZSB1bnJlYWNoYWJsZSBvbiB0aGlzIHBhdGguIEl0IGRvZXMgbm90IHN0YXkgaGVyZVxuICAgICAqICAgICBlaXRoZXIgXHUyMDE0XG4gICAgICogICAgIGBzcmMvcmV2ZW51ZS9mbG93cy9iaWxsaW5nLWhhbmRvZmYtY29udHJhY3QtYWN0aXZhdGVkLmZsb3cudHNgXG4gICAgICogICAgIFBPU1RzIGBjb250cmFjdF90eXBlYCB0byBiaWxsaW5nIHdoZW4gdGhlIGNvbnRyYWN0IGFjdGl2YXRlcztcbiAgICAgKiAgIC0gYHN0YXJ0X2RhdGVgIFx1MjAxNCB0aGUgb25lIG1lbWJlciB0aGF0IGlzIG5vdCBhIGxpdGVyYWw6IHRoZSBkYXRlIHRoZVxuICAgICAqICAgICBxdW90ZSBoYXBwZW5lZCB0byBiZSBBQ0NFUFRFRCwgd2hpY2ggaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBkYXRlIHRoZVxuICAgICAqICAgICBjdXN0b21lcidzIHRlcm0gYmVnaW5zLiBBIHBsYWNlaG9sZGVyIFJVTEUgcmF0aGVyIHRoYW4gYSBwbGFjZWhvbGRlclxuICAgICAqICAgICB2YWx1ZS4gSXQgc2l0cyBpbiB0aGUgYmxvY2sgYmVjYXVzZSB0aGUgYmxvY2sgaXMgaXRzZWxmIHBlci1kcmFmdDpcbiAgICAgKiAgICAgYW4gTDIgYm9keSBoYXMgbm8gbW9kdWxlIHNjb3BlIGF0IHJ1bnRpbWUgKHNlZSB0aGUgZmlsZSBoZWFkZXIpLCBzb1xuICAgICAqICAgICB0aGVzZSBhcmUgaGFuZGxlci1sb2NhbCBieSBjb25zdHJ1Y3Rpb24sIG5vdCBtb2R1bGUgY29uc3RhbnRzLlxuICAgICAqXG4gICAgICogYGVuZF9kYXRlYCBpcyBub3QgYSBmb3VydGggZGVmYXVsdCBcdTIwMTQgaXQgaXMgREVSSVZFRCBmcm9tIHRoZSB0d28gYWJvdmVcbiAgICAgKiAoYGFkZE1vbnRoc2AsIHJlYWwgY2FsZW5kYXIgbW9udGhzKSwgc28gaXQgaW5oZXJpdHMgdGhlaXIgZ3Vlc3NlcyByYXRoZXJcbiAgICAgKiB0aGFuIGFkZGluZyBvbmUgb2YgaXRzIG93bi5cbiAgICAgKlxuICAgICAqIFx1MjZENCBEbyBub3QgcmVhZCB0aGVzZSBhcyBkZWNpc2lvbnMgYW5kIGRvIG5vdCBxdWlldGx5IHJlLXR1bmUgdGhlbS4gVGhlXG4gICAgICogYWx0ZXJuYXRpdmUgXHUyMDE0IHRoZSBxdW90ZSBjYXJyeWluZyBhIHJlYWwgdGVybSBhbmQgdHlwZSBzbyB0aGUgZHJhZnRcbiAgICAgKiB0cmFuc2NyaWJlcyB3aGF0IHdhcyBzb2xkIFx1MjAxNCBpcyBvcHRpb24gQSBvZiAjMTEyOTogcmVjb3JkZWQsIG5vdFxuICAgICAqIHVuZGVydGFrZW4sIHVuZnJvemVuIG9ubHkgYnkgbWVhc3VyZWQgZXZpZGVuY2UgdGhhdCByZWFsIHNhbGVzIHByb2Nlc3Nlc1xuICAgICAqIGZpeCB0aGUgdGVybSBhbmQgdHlwZSBhdCBhY2NlcHRhbmNlIHRpbWUuIFRoaXMgYmxvY2sgaXMgdGhlbiB0aGUgbGlzdCBvZlxuICAgICAqIHZhbHVlcyB0aGF0IG1vdmUgb250byBgY3JtX3F1b3RlYC4gTGVhdmluZyB0aGVtIHVubWFya2VkIHdhcyBleGNsdWRlZCBieVxuICAgICAqIHRoZSBzYW1lIHJ1bGluZzogYW4gdW5tYXJrZWQgaGFyZGNvZGUgaXMgZXhhY3RseSBob3cgdGhlIGBwYXltZW50X3Rlcm1zYFxuICAgICAqIGRyaWZ0IG9mICM4NzMgaGFwcGVuZWQuXG4gICAgICovXG4gICAgY29uc3QgRFJBRlRfQ09OVFJBQ1RfREVGQVVMVFMgPSB7XG4gICAgICBjb250cmFjdF90ZXJtX21vbnRoczogMTIsXG4gICAgICBjb250cmFjdF90eXBlOiAnc3Vic2NyaXB0aW9uJyxcbiAgICAgIHN0YXJ0X2RhdGU6IHRvZGF5LFxuICAgIH0gYXMgY29uc3Q7XG5cbiAgICAvLyBUaGUgY29udHJhY3QncyBPTkUgZmllbGQgZXhwbGFpbmluZyB3aGVyZSBpdCBjYW1lIGZyb20uIFx1MjZENCBOZXZlciBhIHJlY29yZFxuICAgIC8vIGlkOiBgQXV0by1kcmFmdGVkIGZyb20gYWNjZXB0ZWQgcXVvdGUgTXZOb3BXZ0VEWndtMlQ1TGAgbmFtZXMgYSBzdHJpbmcgbm9cbiAgICAvLyBzdXJmYWNlIGluIHRoaXMgYXBwIGV2ZXIgc2hvd3MsIG9uIGEgcXVvdGUgZXZlcnkgc2NyZWVuIGNhbGxzIGBRVEUtMDAwNmAuXG4gICAgLy8gTmFtZSBpdCB0aGUgd2F5IGBjcm1fcXVvdGUuZGlzcGxheV90aXRsZWAgZG9lcy4gVW5saWtlIHRoZSB0YXNrIHNpdGVzIGluXG4gICAgLy8gdGhpcyBjbGFzcyB0aGVyZSBpcyBubyByZWxhdGlvbnNoaXAgZmllbGQgdG8gaG9sZCB0aGUgaWQgYWZ0ZXJ3YXJkcyBcdTIwMTRcbiAgICAvLyBgY3JtX2NvbnRyYWN0YCBsaW5rcyBhY2NvdW50LCBjb250YWN0IGFuZCBvcHBvcnR1bml0eSBidXQgbm90IHRoZSBxdW90ZSBcdTIwMTRcbiAgICAvLyBzbyB0aGlzIHNlbnRlbmNlIGlzIHRoZSB3aG9sZSBwcm92ZW5hbmNlIHJlY29yZCBhbmQgaGFkIGJldHRlciBiZVxuICAgIC8vIHJlYWRhYmxlLiBgcXVvdGVfbnVtYmVyYCBpcyBhbiBlbmdpbmUtaXNzdWVkIGF1dG9udW1iZXIgYW5kIG5ldmVyIGFwcGVhcnNcbiAgICAvLyBvbiBhbiB1cGRhdGUgcGF5bG9hZCwgc28gaXQgaXMgcmVhZCBmcm9tIHRoZSBwcmUtaW1hZ2UgYWxvbmU7IGBuYW1lYCBjYW5cbiAgICAvLyBiZSBjaGFuZ2luZyBpbiB0aGlzIHZlcnkgd3JpdGUuXG4gICAgY29uc3QgdHJpbW1lZCA9ICh2OiB1bmtub3duKTogc3RyaW5nID0+ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB2LnRyaW0oKSA6ICcnKTtcbiAgICBjb25zdCBxdW90ZUxhYmVsID0gW3RyaW1tZWQocHJldmlvdXM/LnF1b3RlX251bWJlciksIFtpbnB1dC5uYW1lLCBwcmV2aW91cz8ubmFtZV0ubWFwKHRyaW1tZWQpLmZpbmQoQm9vbGVhbildLmZpbHRlcihCb29sZWFuKS5qb2luKCcgLSAnKTtcblxuICAgIC8vIE9ubHkgbG9va3VwcyB3ZSBhY3R1YWxseSBIQVZFIGFyZSB3cml0dGVuLiBBIG1pc3Npbmcgb3B0aW9uYWwgbGluayBpcyBhblxuICAgIC8vIGFic2VudCBrZXkgXHUyMDE0IG5ldmVyIGBmYWxzZWAgKHNlZSBgcGlja0lkYCksIGFuZCBuZXZlciBgbnVsbGAgZWl0aGVyOiBgbnVsbGBcbiAgICAvLyBpcyBhIGxlZ2FsIHNoYXBlIGZvciB0aGUgb3B0aW9uYWwgYGNybV9vcHBvcnR1bml0eWAgYnV0IG5vdCBmb3IgdGhlXG4gICAgLy8gcmVxdWlyZWQgYGNybV9jb250YWN0YCwgYW5kIG9uZSBpZGlvbSBmb3IgYm90aCBpcyB3aGF0IGtlZXBzIHRoaXMgaG9uZXN0LlxuICAgIGNvbnN0IGNvbnRyYWN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICAgIC4uLkRSQUZUX0NPTlRSQUNUX0RFRkFVTFRTLFxuICAgICAgc3RhdHVzOiAnZHJhZnQnLFxuICAgICAgZW5kX2RhdGU6IGFkZE1vbnRocyhEUkFGVF9DT05UUkFDVF9ERUZBVUxUUy5zdGFydF9kYXRlLCBEUkFGVF9DT05UUkFDVF9ERUZBVUxUUy5jb250cmFjdF90ZXJtX21vbnRocyksXG4gICAgICBjb250cmFjdF92YWx1ZTogdG90YWxQcmljZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBxdW90ZUxhYmVsID8gYEF1dG8tZHJhZnRlZCBmcm9tIGFjY2VwdGVkIHF1b3RlICR7cXVvdGVMYWJlbH1gIDogJ0F1dG8tZHJhZnRlZCBmcm9tIGFuIGFjY2VwdGVkIHF1b3RlJyxcbiAgICB9O1xuICAgIGlmIChhY2NvdW50SWQpIGNvbnRyYWN0LmNybV9hY2NvdW50ID0gYWNjb3VudElkO1xuICAgIGlmIChjb250YWN0SWQpIGNvbnRyYWN0LmNybV9jb250YWN0ID0gY29udGFjdElkO1xuICAgIGlmIChvcHBvcnR1bml0eUlkKSBjb250cmFjdC5jcm1fb3Bwb3J0dW5pdHkgPSBvcHBvcnR1bml0eUlkO1xuICAgIGlmIChvd25lcklkKSBjb250cmFjdC5vd25lcl9pZCA9IG93bmVySWQ7XG4gICAgLy8gU2FtZSBpZGlvbSBmb3IgdGhlIHNhbWUgcmVhc29uOiB3cml0dGVuIG9ubHkgd2hlbiB0aGUgcXVvdGUgSEFTIGEgdGVybSxcbiAgICAvLyBzbyBcInRoZSBxdW90ZSBjaG9zZSBub3RoaW5nXCIgc3RheXMgYW4gYWJzZW50IGtleSByYXRoZXIgdGhhbiBiZWNvbWluZyBhXG4gICAgLy8gdmFsdWUgdGhlIGNvbnRyYWN0J3MgZGVmYXVsdCB3b3VsZCBvdGhlcndpc2UgaGF2ZSBzdXBwbGllZC5cbiAgICBpZiAocGF5bWVudFRlcm1zKSBjb250cmFjdC5wYXltZW50X3Rlcm1zID0gcGF5bWVudFRlcm1zO1xuXG4gICAgLy8gV2hhdCB0aGUgZHJhZnQgZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIGNhcnJ5ICgjMTEyOSBydWxpbmcsIDIwMjYtMDgtMzEpIFx1MjAxNFxuICAgIC8vIERFQ0lERUQsIG5vdCBvdmVybG9va2VkLiBgY3JtX3F1b3RlLnNoaXBwaW5nX3Rlcm1zYCBhbmRcbiAgICAvLyBgY3JtX3F1b3RlLnNoaXBwaW5nX2FkZHJlc3NgIGhhdmUgbm8gY291bnRlcnBhcnQgY29sdW1uIG9uXG4gICAgLy8gYGNybV9jb250cmFjdGAgYXQgYWxsOyBgY3JtX3F1b3RlLmJpbGxpbmdfYWRkcmVzc2AgaGFzIG9uZSBhbmQgaXMgbGVmdFxuICAgIC8vIGZvciB0aGUgYWRtaW4gY29tcGxldGluZyB0aGUgZHJhZnQ7IGFuZCB0aGUgcXVvdGUncyBgZGVzY3JpcHRpb25gIHdvdWxkXG4gICAgLy8gZGlzcGxhY2UgdGhlIHByb3ZlbmFuY2Ugc2VudGVuY2Ugd3JpdHRlbiBhYm92ZSwgd2hpY2ggaXMgdGhpcyBjb250cmFjdCdzXG4gICAgLy8gb25seSByZWNvcmQgb2Ygd2hlcmUgaXQgY2FtZSBmcm9tLiBDb3B5aW5nIGFueSBvZiB0aGVtIGlzIHBhcnQgb2Ygb3B0aW9uXG4gICAgLy8gQSAoZmFpdGhmdWwgdHJhbnNjcmlwdGlvbikgYW5kIHVuZnJlZXplcyB3aXRoIGl0LCBub3QgYmVmb3JlLlxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV9jb250cmFjdCcpLmluc2VydChjb250cmFjdCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBgY3JtX3F1b3RlLmNybV9jb250YWN0YCBpcyBkZWxpYmVyYXRlbHkgb3B0aW9uYWwgd2hpbGVcbiAgICAgIC8vIGBjcm1fY29udHJhY3QuY3JtX2NvbnRhY3RgIGlzIGByZXF1aXJlZCArIG5vdE51bGxgLCBzbyBhIHF1b3RlIGFjY2VwdGVkXG4gICAgICAvLyB3aXRob3V0IGEgcmVjaXBpZW50IGxlZ2l0aW1hdGVseSBsYW5kcyBoZXJlIHdpdGggXCJQcmltYXJ5IENvbnRhY3QgaXNcbiAgICAgIC8vIHJlcXVpcmVkXCIuIFRoYXQgcmVmdXNhbCBpcyB0aGUgZG9jdW1lbnRlZCBiZWhhdmlvdXIsIG5vdCBhIGRlZmVjdCBcdTIwMTRcbiAgICAgIC8vIGBjb250ZW50L2RvY3Mvc2FsZXMvcXVvdGVzLm1keGAgYWxyZWFkeSB0ZWxscyByZXBzIHRvIHB1dCB0aGUgY29udGFjdCBvblxuICAgICAgLy8gdGhlIHF1b3RlIGZpcnN0LCBiZWNhdXNlIFwid2hhdCB0aGUgcXVvdGUgZG9lcyBub3QgY2FycnksIGFjY2VwdGFuY2VcbiAgICAgIC8vIGNhbm5vdCBwYXNzIG9uXCIuIFRoZSByZWZ1c2FsIGlzIHRydXRoZnVsIChhIG5hbWVkIG1pc3NpbmcgZmllbGQsIG5vdFxuICAgICAgLy8gXCJyZWNlaXZlZCBib29sZWFuXCIpLCBhbmQgc2luY2UgdGhlIGNsb3NlLXdvbiBsaXZlcyBpbiBpdHMgb3duIGhvb2sgaXRcbiAgICAgIC8vIGNhbiBubyBsb25nZXIgdGFrZSB0aGF0IGxlZyB3aXRoIGl0LlxuICAgICAgLy9cbiAgICAgIC8vIERFTElCRVJBVEVMWSBCQVJFLCBsaWtlIHRoZSBjbG9zZS13b24gb25lIGluIGBxdW90ZV9vbl9hY2NlcHRlZGA6IGFcbiAgICAgIC8vIGNhc2NhZGUgZmF1bHQgdGhlIGFjY2VwdGluZyB1c2VyIG5laXRoZXIgY2F1c2VkIG5vciBjYW4gYWN0IG9uLCBzbyBhXG4gICAgICAvLyA1MDAsIG5ldmVyIGEgNHh4IHJlZnVzYWwgZW52ZWxvcGUgKCMxMDc1KS4gSXQgbmFtZXMgdGhlIHF1b3RlIHRoZSB3YXlcbiAgICAgIC8vIGV2ZXJ5IHNjcmVlbiBkb2VzIFx1MjAxNCB0aGUgbGFiZWwgY29tcG9zZWQgYWJvdmUgXHUyMDE0IG5ldmVyIGJ5IGl0cyBpZCAoIzEyNDMpLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb3VsZCBub3QgZHJhZnQgdGhlIGNvbnRyYWN0IGZvciBxdW90ZSAke3F1b3RlTGFiZWx9OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9LFxufTtcblxuLyoqXG4gKiBPbiBhY2NlcHRhbmNlOiBwdXNoIHRoZSBsaW5rZWQgb3Bwb3J0dW5pdHkgdG8gYGNsb3NlZF93b25gLlxuICpcbiAqIERlbGliZXJhdGVseSBOT1QgZWxldmF0ZWQgXHUyMDE0IHRoZSByZWFzb24gaXMgb24gYHF1b3RlX2FjY2VwdGVkX2NvbnRyYWN0X2RyYWZ0YFxuICogYWJvdmU6IHRoaXMgd3JpdGUgc3RheXMgdGhlIGFjY2VwdGluZyBjYWxsZXIncywgc28gdGhlIG9wcG9ydHVuaXR5J3Mgb3duXG4gKiBndWFyZHMgYW5kIGFuIGFwcHJvdmFsJ3MgcmVjb3JkIGxvY2sganVkZ2UgaXQgYXMgdGhleSBhbHdheXMgaGF2ZS4gQSBkZWFsIGFuXG4gKiBhcHByb3ZhbCBob2xkcyBpcyByZWZ1c2VkIGF0IHRoZSBhY2NlcHRhbmNlIGl0c2VsZiAoYHF1b3RlX3dvcmtmbG93YCksIHNvIHRoaXNcbiAqIHdyaXRlIG5vIGxvbmdlciBtZWV0cyB0aGF0IGxvY2sgb24gYSB1c2VyJ3MgYWNjZXB0YW5jZS5cbiAqL1xuY29uc3QgcXVvdGVBY2NlcHRlZDogSG9vayA9IHtcbiAgbmFtZTogJ3F1b3RlX29uX2FjY2VwdGVkJyxcbiAgb2JqZWN0OiAnY3JtX3F1b3RlJyxcbiAgZXZlbnRzOiBbJ2FmdGVyVXBkYXRlJ10sXG4gIHByaW9yaXR5OiA4MDAsXG4gIGFzeW5jOiB0cnVlLFxuICBvbkVycm9yOiAnbG9nJyxcbiAgZGVzY3JpcHRpb246ICdDbG9zZS13aW4gdGhlIGFjY2VwdGVkIHF1b3RlXHUyMDE5cyBvcHBvcnR1bml0eS4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXQsIHByZXZpb3VzIH0gPSBjdHg7XG4gICAgaWYgKGlucHV0LnN0YXR1cyAhPT0gJ2FjY2VwdGVkJyB8fCBwcmV2aW91cz8uc3RhdHVzID09PSAnYWNjZXB0ZWQnKSByZXR1cm47XG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIC8vIEEgcmVjb3JkIGlkIG9yIG5vdGhpbmcgXHUyMDE0IG5ldmVyIGJvb2xlYW4gYGZhbHNlYCAoIzcxNDsgdGhlIGZ1bGwgbm90ZSBpcyBvblxuICAgIC8vIGBwaWNrSWRgIGluIGBxdW90ZV9hY2NlcHRlZF9jb250cmFjdF9kcmFmdGApLlxuICAgIGNvbnN0IGlkID0gW2lucHV0LmNybV9vcHBvcnR1bml0eSwgcHJldmlvdXM/LmNybV9vcHBvcnR1bml0eV0uZmluZCgodik6IHYgaXMgc3RyaW5nID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2ICE9PSAnJyk7XG4gICAgaWYgKCFhcGkgfHwgIWlkKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3BwID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykuZmluZE9uZSh7IHdoZXJlOiB7IGlkIH0gfSk7XG4gICAgICAvLyBBIGRlYWwgYWxyZWFkeSBjbG9zZWQsIHdvbiBvciBsb3N0LCBpcyBsZWZ0IHdoZXJlIGl0IGlzLlxuICAgICAgaWYgKG9wcCAmJiAhU3RyaW5nKG9wcC5zdGFnZSkuc3RhcnRzV2l0aCgnY2xvc2VkXycpKSB7XG4gICAgICAgIC8vIGBjcm1fb3Bwb3J0dW5pdHkud2luX3JlYXNvbmAgaXMgYHJlcXVpcmVkV2hlbmAgc3RhZ2UgaXMgY2xvc2VkX3dvblxuICAgICAgICAvLyAoIzU5MyksIGFuZCB0aGlzIHdyaXRlIGlzIHRoZSBPTkUgY2xvc2UgcGF0aCB3aXRoIG5vIGh1bWFuIGluIGl0IHRvXG4gICAgICAgIC8vIGF0dHJpYnV0ZSB0aGUgd2luIFx1MjAxNCBzbyB3aXRob3V0IGEgdmFsdWUgaGVyZSB0aGUgQ1BRIGxlZyB3b3VsZCBiZVxuICAgICAgICAvLyByZWplY3RlZCBieSB0aGUgZW5naW5lIG9uIGV2ZXJ5IGFjY2VwdGVkIHF1b3RlLiBgcXVvdGVfYWNjZXB0ZWRgXG4gICAgICAgIC8vIG5hbWVzIHRoZSBhdXRvbWF0ZWQgcGF0aCByYXRoZXIgdGhhbiBndWVzc2luZyBhIHJlcCdzIGFuc3dlcjsga2VlcFxuICAgICAgICAvLyB0aGUgcmVhc29uIHRoZSByZXAgYWxyZWFkeSByZWNvcmRlZCBpZiB0aGVyZSBpcyBvbmUuXG4gICAgICAgIGNvbnN0IHdvbiA9IHsgaWQsIHN0YWdlOiAnY2xvc2VkX3dvbicsIGNsb3NlX2RhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCkgfTtcbiAgICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykudXBkYXRlKHsgLi4ud29uLCAuLi4ob3BwLndpbl9yZWFzb24gPyB7fSA6IHsgd2luX3JlYXNvbjogJ3F1b3RlX2FjY2VwdGVkJyB9KSB9LCB7IHdoZXJlOiB7IGlkIH0gfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBERUxJQkVSQVRFTFkgQkFSRSBcdTIwMTQgb25lIG9mIHRoZSB0d28gdGhyb3dzIGluIHRoaXMgZmlsZSB0aGUgIzEwNzUgc3dlZXBcbiAgICAgIC8vIGxlZnQgYWxvbmUgKHRoZSBvdGhlciBpcyB0aGUgY29udHJhY3QgZHJhZnQncywgYWJvdmUpLiBFdmVyeSBvdGhlclxuICAgICAgLy8gdGhyb3cgaGVyZSBpcyBhIGJ1c2luZXNzIHJlZnVzYWw6IHRoZSB1c2VyIGFza2VkIGZvciBzb21ldGhpbmcgdGhlXG4gICAgICAvLyBydWxlcyBmb3JiaWQsIGFuZCBhbiBlbnZlbG9wZSB0ZWxscyB0aGVpciBjbGllbnQgd2hpY2ggcnVsZS4gVGhpcyBvbmVcbiAgICAgIC8vIGlzIHRoZSBvcHBvc2l0ZS4gSXQgZmlyZXMgZnJvbSBhbiBgYWZ0ZXJVcGRhdGVgIGNhc2NhZGUgd2hlbiBjbG9zZS13b25cbiAgICAgIC8vIGJvb2trZWVwaW5nIEZBSUxFRCBmb3IgcmVhc29ucyB0aGUgdXNlciBkaWQgbm90IGNhdXNlIGFuZCBjYW5ub3QgYWN0XG4gICAgICAvLyBvbiwgc28gaXQgaXMgYSBzZXJ2ZXIgZmF1bHQgYW5kIGJlbG9uZ3MgaW4gdGhlIDV4eCBiYW5kLiBBIGJhcmUgRXJyb3IgaXNcbiAgICAgIC8vIGFscmVhZHkgbWFwcGVkIHRvIGA1MDAgLyBJTlRFUk5BTF9FUlJPUmAgYnkgYHJlc29sdmVUaHJvd25IdHRwRXJyb3JgLFxuICAgICAgLy8gd2hpY2ggaXMgdGhlIGNvcnJlY3QgYW5zd2VyIFx1MjAxNCBkcmVzc2luZyBpdCBpbiBhIDR4eCByZWZ1c2FsIGNvZGUgd291bGRcbiAgICAgIC8vIGZpbGUgYSBicm9rZW4gY2FzY2FkZSBhcyB1c2VyIGVycm9yLiBJdCBuYW1lcyB0aGUgcXVvdGUgYnkgaXRzIG51bWJlcixcbiAgICAgIC8vIHRoZSBlbmdpbmUncyBhdXRvbnVtYmVyIGV2ZXJ5IHNjcmVlbiBzaG93cyBcdTIwMTQgbmV2ZXIgYSByZWNvcmQgaWQgKCMxMjQzKS5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgY291bGQgbm90IGNsb3NlLXdvbiB0aGUgb3Bwb3J0dW5pdHkgb2YgcXVvdGUgJHtTdHJpbmcocHJldmlvdXM/LnF1b3RlX251bWJlcil9OiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgW3F1b3RlVmFsaWRhdGlvbiwgcXVvdGVBY2NlcHRlZENvbnRyYWN0RHJhZnQsIHF1b3RlQWNjZXB0ZWRdO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9vYmplY3RzL3F1b3RlX2xpbmVfaXRlbS5ob29rLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL29iamVjdHMvcXVvdGVfbGluZV9pdGVtLmhvb2sudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB0eXBlIHsgSG9vaywgSG9va0NvbnRleHQgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9kYXRhJztcbmltcG9ydCB0eXBlIHsgSG9va0FwaSB9IGZyb20gJy4uLy4uL3NhbGVzL29iamVjdHMvX2hvb2stYXBpJztcbmltcG9ydCB7IGNyZWF0ZUxpbmVJdGVtTnVtYmVyaW5nLCBjcmVhdGVMaW5lSXRlbVByaWNlRmlsbCB9IGZyb20gJy4vX2xpbmUtaXRlbS1wcmljZS1maWxsJztcblxuLyoqXG4gKiBRdW90ZSB0b3RhbCByb2xsdXAuXG4gKlxuICogS2VlcHMgYSBxdW90ZSdzIHByaWNpbmcgKGBzdWJ0b3RhbGAgLyBgZGlzY291bnRfYW1vdW50YCAvIGB0b3RhbF9wcmljZWApIGluXG4gKiBzeW5jIHdpdGggdGhlIHN1bSBvZiBpdHMgbGluZSBpdGVtcy4gRmlyZXMgYWZ0ZXIgYSBxdW90ZSBsaW5lIGl0ZW0gaXNcbiAqIGluc2VydGVkIC8gdXBkYXRlZCAvIGRlbGV0ZWQgKHRoZSBjb25zb2xlIHN1cmZhY2VzIHRoZXNlIGFzIHRoZSBxdW90ZSdzXG4gKiBcIkxpbmUgSXRlbXNcIiByZWxhdGVkIGxpc3QpLlxuICpcbiAqIFdoeSB0aGlzIGV4aXN0czogYHF1b3RlX2dlbmVyYXRpb25gIHNlZWRzIHRoZSBxdW90ZSB0b3RhbHMgZnJvbSB0aGUgc291cmNlXG4gKiBvcHBvcnR1bml0eSdzIGFtb3VudCBhdCBjcmVhdGUgdGltZSwgYnV0IG5vdGhpbmcga2VwdCB0aGVtIGluIHN0ZXAgb25jZSBhXG4gKiByZXAgZWRpdGVkIHRoZSBsaW5lIGl0ZW1zIFx1MjAxNCB0aGUgcXVvdGUgdG90YWwgYW5kIGl0cyBpdGVtaXphdGlvbiBjb3VsZCBkcmlmdC5cbiAqXG4gKiBUb3RhbCBtb2RlbCAobWlycm9ycyB0aGUgcXVvdGVfZ2VuZXJhdGlvbiBmbG93KTpcbiAqICAgc3VidG90YWwgICAgICAgID0gXHUwM0EzIGxpbmUgKHF1YW50aXR5IFx1MDBENyB1bml0X3ByaWNlIFx1MDBENyAoMSBcdTIyMTIgbGluZV9kaXNjb3VudC8xMDApKVxuICogICBkaXNjb3VudF9hbW91bnQgPSBzdWJ0b3RhbCBcdTAwRDcgcXVvdGUuZGlzY291bnQlICAgICAgICAgICAgICAocXVvdGUtbGV2ZWwpXG4gKiAgIHRvdGFsX3ByaWNlICAgICA9IHN1YnRvdGFsIFx1MjIxMiBkaXNjb3VudF9hbW91bnQgKyB0YXggKyBzaGlwcGluZ19oYW5kbGluZ1xuICogUXVvdGUtbGV2ZWwgYHRheGAgYW5kIGBzaGlwcGluZ19oYW5kbGluZ2Agc3RheSBtYW51YWw7IG9ubHkgdGhlIGxpbmUtZGVyaXZlZFxuICogZmlndXJlcyBhcmUgcm9sbGVkIHVwLlxuICpcbiAqIERlc2lnbiBkZWNpc2lvbnMgbWlycm9yIG9wcG9ydHVuaXR5X2xpbmVfaXRlbS5ob29rOlxuICogLSByZWNvbXB1dGUgZnJvbSByYXcgYHF1YW50aXR5L3VuaXRfcHJpY2UvZGlzY291bnRgIChub3QgdGhlIGBzdWJ0b3RhbGBcbiAqICAgRk9STVVMQSBmaWVsZCkgc28gaXQgZG9lc24ndCBkZXBlbmQgb24gZm9ybXVsYSBoeWRyYXRpb24gaW4gdGhlIHNhbmRib3g7XG4gKiAtIGxlYXZlIHRvdGFscyB1bnRvdWNoZWQgd2hlbiB0aGVyZSBhcmUgTk8gbGluZXMgKG5ldmVyIHplcm8gYSBxdW90ZSB3aG9zZVxuICogICB0b3RhbHMgY2FtZSBmcm9tIHRoZSBvcHBvcnR1bml0eSk7XG4gKiAtIHNraXAgYWNjZXB0ZWQgLyBleHBpcmVkIHF1b3RlcyBcdTIwMTQgdGhlIHJvbGx1cCBydW5zIHN5c3RlbS1jb250ZXh0IGFuZCB3b3VsZFxuICogICBvdGhlcndpc2UgYnlwYXNzIHRoZSBxdW90ZSBmcmVlemUgZ3VhcmQgYW5kIHJld3JpdGUgYSBzZXR0bGVkIHF1b3RlO1xuICogLSBhc3luYyArIG9uRXJyb3I6J2xvZycgXHUyMDE0IGEgZGVyaXZlZCBjb252ZW5pZW5jZSwgbmV2ZXIgYmxvY2tzIHRoZSBsaW5lIHdyaXRlO1xuICogLSBoYW5kbGVzIHJlLXBhcmVudGluZyAob2xkICsgbmV3IHF1b3RlKS5cbiAqL1xuLyoqXG4gKiBMaW5lLWl0ZW0gcHJpY2UgZmlsbCBcdTIwMTQgb25lIGltcGxlbWVudGF0aW9uIHNoYXJlZCB3aXRoIHRoZSBvcHBvcnR1bml0eSBsaW5lXG4gKiBpdGVtOyBzZWUgYF9saW5lLWl0ZW0tcHJpY2UtZmlsbC50c2AgZm9yIHRoZSBiZWhhdmlvdXIgYW5kIHRoZSBzYW5kYm94IGNhdmVhdC5cbiAqL1xuY29uc3QgcXVvdGVMaW5lSXRlbVByaWNlRmlsbDogSG9vayA9IGNyZWF0ZUxpbmVJdGVtUHJpY2VGaWxsKFxuICAnY3JtX3F1b3RlX2xpbmVfaXRlbScsXG4gICdxdW90ZV9saW5lX2l0ZW1fcHJpY2VfZmlsbCcsXG4pO1xuXG4vKiogYGxpbmVfbnVtYmVyYCBhc3NpZ25lciBcdTIwMTQgc2VlIGBfbGluZS1pdGVtLXByaWNlLWZpbGwudHNgICgjMTgyOCkuICovXG5jb25zdCBxdW90ZUxpbmVJdGVtTnVtYmVyaW5nOiBIb29rID0gY3JlYXRlTGluZUl0ZW1OdW1iZXJpbmcoXG4gICdjcm1fcXVvdGVfbGluZV9pdGVtJyxcbiAgJ3F1b3RlX2xpbmVfaXRlbV9saW5lX251bWJlcicsXG4pO1xuXG5jb25zdCBxdW90ZVRvdGFsUm9sbHVwOiBIb29rID0ge1xuICBuYW1lOiAncXVvdGVfdG90YWxfcm9sbHVwJyxcbiAgb2JqZWN0OiAnY3JtX3F1b3RlX2xpbmVfaXRlbScsXG4gIGV2ZW50czogWydhZnRlckluc2VydCcsICdhZnRlclVwZGF0ZScsICdhZnRlckRlbGV0ZSddLFxuICBwcmlvcml0eTogMzAwLFxuICBhc3luYzogdHJ1ZSxcbiAgb25FcnJvcjogJ2xvZycsXG4gIGRlc2NyaXB0aW9uOiAnUmVjb21wdXRlIHBhcmVudCBxdW90ZSBzdWJ0b3RhbC9kaXNjb3VudC90b3RhbCBmcm9tIGl0cyBsaW5lIGl0ZW1zLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXBpKSByZXR1cm47XG4gICAgY29uc3QgeyBpbnB1dCwgcHJldmlvdXMgfSA9IGN0eDtcbiAgICBjb25zdCBudW0gPSAodjogdW5rbm93bik6IG51bWJlciA9PiAodHlwZW9mIHYgPT09ICdudW1iZXInID8gdiA6IDApO1xuXG4gICAgY29uc3QgcXVvdGVJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHYgb2YgW2lucHV0Py5jcm1fcXVvdGUsIHByZXZpb3VzPy5jcm1fcXVvdGVdKSB7XG4gICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYpIHF1b3RlSWRzLmFkZCh2KTtcbiAgICB9XG4gICAgaWYgKHF1b3RlSWRzLnNpemUgPT09IDApIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgcXVvdGVJZCBvZiBxdW90ZUlkcykge1xuICAgICAgY29uc3QgcXVvdGUgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fcXVvdGUnKS5maW5kT25lKHtcbiAgICAgICAgd2hlcmU6IHsgaWQ6IHF1b3RlSWQgfSxcbiAgICAgICAgZmllbGRzOiBbJ2lkJywgJ3N0YXR1cycsICdkaXNjb3VudCcsICd0YXgnLCAnc2hpcHBpbmdfaGFuZGxpbmcnXSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFxdW90ZSkgY29udGludWU7XG4gICAgICBjb25zdCBzdGF0dXMgPSB0eXBlb2YgcXVvdGUuc3RhdHVzID09PSAnc3RyaW5nJyA/IHF1b3RlLnN0YXR1cyA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChzdGF0dXMgPT09ICdhY2NlcHRlZCcgfHwgc3RhdHVzID09PSAnZXhwaXJlZCcpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBsaW5lcyA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9xdW90ZV9saW5lX2l0ZW0nKS5maW5kKHtcbiAgICAgICAgd2hlcmU6IHsgY3JtX3F1b3RlOiBxdW90ZUlkIH0sXG4gICAgICAgIGZpZWxkczogWydxdWFudGl0eScsICd1bml0X3ByaWNlJywgJ2Rpc2NvdW50J10sXG4gICAgICAgIHRvcDogNTAwMCxcbiAgICAgIH0pO1xuICAgICAgLy8gTm8gbGluZXMgbGVmdCBcdTIxOTIgbGVhdmUgdGhlIGZsb3ctc2VlZGVkIHRvdGFscyBhcy1pcyAoc2VlIGRlc2lnbiBub3RlKS5cbiAgICAgIGlmICghbGluZXMgfHwgbGluZXMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgbGV0IHN1YnRvdGFsID0gMDtcbiAgICAgIGZvciAoY29uc3QgbCBvZiBsaW5lcykgc3VidG90YWwgKz0gbnVtKGwucXVhbnRpdHkpICogbnVtKGwudW5pdF9wcmljZSkgKiAoMSAtIG51bShsLmRpc2NvdW50KSAvIDEwMCk7XG4gICAgICBzdWJ0b3RhbCA9IE1hdGgucm91bmQoc3VidG90YWwgKiAxMDApIC8gMTAwO1xuXG4gICAgICBjb25zdCBkaXNjb3VudEFtb3VudCA9IE1hdGgucm91bmQoc3VidG90YWwgKiAobnVtKHF1b3RlLmRpc2NvdW50KSAvIDEwMCkgKiAxMDApIC8gMTAwO1xuICAgICAgY29uc3QgdG90YWwgPSBNYXRoLnJvdW5kKChzdWJ0b3RhbCAtIGRpc2NvdW50QW1vdW50ICsgbnVtKHF1b3RlLnRheCkgKyBudW0ocXVvdGUuc2hpcHBpbmdfaGFuZGxpbmcpKSAqIDEwMCkgLyAxMDA7XG5cbiAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV9xdW90ZScpLnVwZGF0ZShcbiAgICAgICAgeyBpZDogcXVvdGVJZCwgc3VidG90YWwsIGRpc2NvdW50X2Ftb3VudDogZGlzY291bnRBbW91bnQsIHRvdGFsX3ByaWNlOiB0b3RhbCB9LFxuICAgICAgICB7IHdoZXJlOiB7IGlkOiBxdW90ZUlkIH0gfSxcbiAgICAgICk7XG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgW3F1b3RlTGluZUl0ZW1QcmljZUZpbGwsIHF1b3RlTGluZUl0ZW1OdW1iZXJpbmcsIHF1b3RlVG90YWxSb2xsdXBdO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL29iamVjdHMvY2FtcGFpZ24uaG9vay50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbi5ob29rLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tDb250ZXh0IH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgdHlwZSB7IEhvb2tBcGkgfSBmcm9tICcuLi8uLi9zYWxlcy9vYmplY3RzL19ob29rLWFwaSc7XG5cbi8qKlxuICogQ2FtcGFpZ24gbGlmZWN5Y2xlIGhvb2tzLlxuICpcbiAqIC0gYGNhbXBhaWduX3ZhbGlkYXRpb25gIFx1MjAxNCBzdGFydC9lbmQgZGF0ZSBvcmRlcmluZywgYW5kIG5vIGBpbl9wcm9ncmVzc2BcbiAqICAgd2l0aG91dCBib3RoIGRhdGVzLlxuICogLSBgY2FtcGFpZ25fbWV0cmljc19yZWZyZXNoYCBcdTIwMTQgcmVjb21wdXRlIHRoZSBtZXRyaWMgYmxvY2sgd2hlbiB0aGUgY2FtcGFpZ24nc1xuICogICBvd24gc3RhdHVzIG1vdmVzLlxuICogVGhlIG90aGVyIHR3byBob29rcyBvZiB0aGlzIGZhbWlseSBhcmUgYXR0YWNoZWQgdG8gb2JqZWN0cyB0aGUgU0FMRVMgcGFja2FnZVxuICogb3ducywgc28gc2luY2UgdGhlIEFEUi0wMTMwIGxheW91dCB0aGV5IHNpdCBiZXNpZGUgdGhvc2Ugb2JqZWN0cyBpbnN0ZWFkXG4gKiAocGxhbiBpdGVtIDYgXHUyMDE0IGNvLWxvY2F0aW9uIGlzIHdoYXQgZW5mb3JjZXMgUjQpOlxuICpcbiAqIC0gYGNhbXBhaWduX2F0dHJpYnV0aW9uX3JlZnJlc2hgIChgY3JtX29wcG9ydHVuaXR5YCkgXHUyMDE0XG4gKiAgIGBzcmMvc2FsZXMvb2JqZWN0cy9vcHBvcnR1bml0eS5jYW1wYWlnbi1tZXRyaWNzLmhvb2sudHNgXG4gKiAtIGBjYW1wYWlnbl9sZWFkX2NvbnZlcnNpb25fcmVmcmVzaGAgKGBjcm1fbGVhZGApIFx1MjAxNFxuICogICBgc3JjL3NhbGVzL29iamVjdHMvbGVhZC5jYW1wYWlnbi1tZXRyaWNzLmhvb2sudHNgXG4gKlxuICogVGhlIG1lbWJlcnNoaXAgc2lkZSBvZiB0aGUgc2FtZSByZWNvbXB1dGUgbGl2ZXMgaW4gYGNhbXBhaWduX21lbWJlci5ob29rLnRzYC5cbiAqIFRvZ2V0aGVyIHRoZXNlIGFyZSB3aGF0IHJlcGxhY2VkIHRoZSBzaW5nbGUgY29tcGxldGlvbi10aW1lIHNuYXBzaG90ICgjNTk3KTpcbiAqIGV2ZXJ5IGlucHV0IGEgY2FtcGFpZ24gbWV0cmljIGRlcml2ZXMgZnJvbSBub3cgaGFzIGEgdHJpZ2dlciB0aGF0IHJlZnJlc2hlc1xuICogdGhlIG1ldHJpYyB3aGVuIGl0IGNoYW5nZXMsIHNvIGEgTElWRSBjYW1wYWlnbiByZXBvcnRzIGxpdmUgbnVtYmVycyBpbnN0ZWFkXG4gKiBvZiB6ZXJvcyB1bnRpbCB0aGUgZGF5IGl0IGVuZHMuXG4gKlxuICogXHUyNkEwXHVGRTBGIFdIWSBUSEUgUkVDT01QVVRFIElTIFdSSVRURU4gT1VUIEZPVVIgVElNRVMuXG4gKlxuICogTDIgaG9vayBib2RpZXMgYXJlIGxvd2VyZWQgdG8gbWV0YWRhdGEgYW5kIGV2YWx1YXRlZCBCT0RZLU9OTFkgaW4gdGhlIFF1aWNrSlNcbiAqIHNhbmRib3g6IGEgaGFuZGxlciBjYW5ub3QgcmVhY2ggbW9kdWxlIHNjb3BlIGF0IHJ1bnRpbWUsIHNvIGEgc2hhcmVkXG4gKiBgcmVmcmVzaENhbXBhaWduTWV0cmljcygpYCBpbXBvcnQgd291bGQgYmUgYSBmcmVlIGlkZW50aWZpZXIgXHUyMDE0IHRoZSBDTEkgYnVpbGRcbiAqIHNpbGVudGx5IGRlY2xpbmVzIHRvIGxvd2VyIHRoZSBoYW5kbGVyLCBrZWVwcyBpdCBpbiBhIGJ1bmRsZWQgcnVudGltZSBmaWxlLFxuICogYW5kIHRoZSBob29rIHN0b3BzIGJlaW5nIGRlcGxveWFibGUgYXMgcHVyZSBtZXRhZGF0YSAodGhlIGJ1aWxkIHNheXMgc28gaW5cbiAqIG9uZSBsaW5lIG5vYm9keSByZWFkcykuIGB0ZXN0L2FjdGlvbi1zYW5kYm94LnRlc3QudHNgIGlzIHdoYXQgY2F0Y2hlcyBpdC5cbiAqXG4gKiBTbyB0aGUgYXJpdGhtZXRpYyBpcyBpbmxpbmVkIHBlciBoYW5kbGVyLCB0aGUgc2FtZSB3YXkgYGFjY291bnRfcHJvdGVjdGlvbmBcbiAqIGlubGluZXMgdGhlIHRlcnJpdG9yeSB0YWJsZSByYXRoZXIgdGhhbiBpbXBvcnRpbmcgYF90ZXJyaXRvcnkudHNgLiBUaGVcbiAqIGR1cGxpY2F0aW9uIGlzIE5PVCB0cnVzdGVkOiBgdGVzdC9jYW1wYWlnbi1tZW1iZXItbGlmZWN5Y2xlLnRlc3QudHNgIGxvd2Vyc1xuICogYWxsIGZvdXIgYm9kaWVzIGFuZCBhc3NlcnRzIHRoZSByZWNvbXB1dGUgYmxvY2sgaXMgY2hhcmFjdGVyLWlkZW50aWNhbCBhY3Jvc3NcbiAqIHRoZW0sIHNvIGEgZml4IGxhbmRpbmcgb24gb25lIGNvcHkgYW5kIHNraXBwaW5nIHRocmVlIGZhaWxzIGEgdGVzdCBpbnN0ZWFkIG9mXG4gKiBzaGlwcGluZyBmb3VyIGRlZmluaXRpb25zIG9mIGBudW1fc2VudGAuIFNwbGl0dGluZyB0aGUgZm91ciBhY3Jvc3MgdGhyZWVcbiAqIGZpbGVzIGJ5IG93bmluZyBvYmplY3QgY2hhbmdlZCBub25lIG9mIHRoYXQgXHUyMDE0IHRoZSBzdWl0ZSByZWFkcyB0aGVtIGJ5IGhvb2tcbiAqIG5hbWUsIG5vdCBieSBmaWxlLlxuICovXG5cbmNvbnN0IGNhbXBhaWduVmFsaWRhdGlvbjogSG9vayA9IHtcbiAgbmFtZTogJ2NhbXBhaWduX3ZhbGlkYXRpb24nLFxuICBvYmplY3Q6ICdjcm1fY2FtcGFpZ24nLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICBwcmlvcml0eTogMjAwLFxuICBkZXNjcmlwdGlvbjogJ1ZhbGlkYXRlIGNhbXBhaWduIGRhdGUgcmFuZ2UgYW5kIHJlcXVpcmVkIGZpZWxkcyBwZXIgc3RhdHVzLicsXG4gIGhhbmRsZXI6IGFzeW5jIChjdHg6IEhvb2tDb250ZXh0KSA9PiB7XG4gICAgLy8gVGhlIHJlZnVzYWwgZW52ZWxvcGUgKCMxMDc1KS4gTWlycm9yZWQgZnJvbSBgc3JjL3NhbGVzL29iamVjdHMvX3JlZnVzYWwudHNgIGJlY2F1c2UgYVxuICAgIC8vIGxvd2VyZWQgYm9keSBoYXMgbm8gbW9kdWxlIHNjb3BlIGFuZCBgZXh0cmFjdEhvb2tCb2R5YCBUSFJPV1Mgb24gYW5cbiAgICAvLyBpbXBvcnQ7IGB0ZXN0L3JlZnVzYWwtZW52ZWxvcGUudGVzdC50c2AgcGlucyBldmVyeSBjb3B5IGFnYWluc3QgaXQuXG4gICAgZnVuY3Rpb24gcmVmdXNlKFxuICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgY29kZTogc3RyaW5nLFxuICAgICAgc3RhdHVzOiBudW1iZXIsXG4gICAgICB1c2VyTWVzc2FnZTogc3RyaW5nID0gbWVzc2FnZSxcbiAgICApOiBFcnJvciB7XG4gICAgICBjb25zdCBlcnIgPSBuZXcgRXJyb3IobWVzc2FnZSkgYXMgRXJyb3IgJiB7XG4gICAgICAgIGNvZGU6IHN0cmluZztcbiAgICAgICAgc3RhdHVzOiBudW1iZXI7XG4gICAgICAgIHVzZXJNZXNzYWdlOiBzdHJpbmc7XG4gICAgICB9O1xuICAgICAgZXJyLmNvZGUgPSBjb2RlO1xuICAgICAgZXJyLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgIGVyci51c2VyTWVzc2FnZSA9IHVzZXJNZXNzYWdlO1xuICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG4gICAgY29uc3QgeyBpbnB1dCB9ID0gY3R4O1xuICAgIGNvbnN0IHByZXZpb3VzID0gY3R4LnByZXZpb3VzO1xuICAgIGNvbnN0IHN0YXJ0ID1cbiAgICAgICh0eXBlb2YgaW5wdXQuc3RhcnRfZGF0ZSA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3RhcnRfZGF0ZSkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXM/LnN0YXJ0X2RhdGUgPT09ICdzdHJpbmcnICYmIChwcmV2aW91cy5zdGFydF9kYXRlIGFzIHN0cmluZykpIHx8XG4gICAgICB1bmRlZmluZWQ7XG4gICAgY29uc3QgZW5kID1cbiAgICAgICh0eXBlb2YgaW5wdXQuZW5kX2RhdGUgPT09ICdzdHJpbmcnICYmIGlucHV0LmVuZF9kYXRlKSB8fFxuICAgICAgKHR5cGVvZiBwcmV2aW91cz8uZW5kX2RhdGUgPT09ICdzdHJpbmcnICYmIChwcmV2aW91cy5lbmRfZGF0ZSBhcyBzdHJpbmcpKSB8fFxuICAgICAgdW5kZWZpbmVkO1xuICAgIGlmIChzdGFydCAmJiBlbmQgJiYgc3RhcnQgPiBlbmQpIHtcbiAgICAgIHRocm93IHJlZnVzZShgQ2FtcGFpZ24gc3RhcnRfZGF0ZSAoJHtzdGFydH0pIG11c3Qgbm90IGJlIGFmdGVyIGVuZF9kYXRlICgke2VuZH0pLmAsICdWQUxJREFUSU9OX0ZBSUxFRCcsIDQwMCk7XG4gICAgfVxuICAgIGNvbnN0IHN0YXR1cyA9XG4gICAgICAodHlwZW9mIGlucHV0LnN0YXR1cyA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3RhdHVzKSB8fFxuICAgICAgKHR5cGVvZiBwcmV2aW91cz8uc3RhdHVzID09PSAnc3RyaW5nJyAmJiAocHJldmlvdXMuc3RhdHVzIGFzIHN0cmluZykpIHx8XG4gICAgICB1bmRlZmluZWQ7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ2luX3Byb2dyZXNzJyAmJiAoIXN0YXJ0IHx8ICFlbmQpKSB7XG4gICAgICB0aHJvdyByZWZ1c2UoJ0NhbXBhaWduIGNhbm5vdCBtb3ZlIHRvIGluX3Byb2dyZXNzIHdpdGhvdXQgYm90aCBzdGFydF9kYXRlIGFuZCBlbmRfZGF0ZS4nLCAnVkFMSURBVElPTl9GQUlMRUQnLCA0MDApO1xuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogUmVjb21wdXRlIHRoaXMgY2FtcGFpZ24ncyBtZXRyaWNzIHdoZW4gaXRzIG93biBzdGF0dXMgbW92ZXMuXG4gKlxuICogXHUyNkEwXHVGRTBGIFJFQ1VSU0lPTi4gVGhpcyBob29rIHdyaXRlcyB0byB0aGUgb2JqZWN0IGl0IGxpc3RlbnMgb24sIHNvIGl0cyB0cmlnZ2VyXG4gKiBoYXMgdG8gYmUgYSBjb25kaXRpb24gaXRzIG93biB3cml0ZSBjYW5ub3Qgc2F0aXNmeS4gSXQgaXM6IHRoZSB3cml0ZSBjYXJyaWVzXG4gKiB0aGUgbWV0cmljIGJsb2NrIGFuZCBub3RoaW5nIGVsc2UsIGFuZCB0aGlzIGZpcmVzIG9ubHkgb24gYSBgc3RhdHVzYFxuICogVFJBTlNJVElPTiBcdTIwMTQgYGlucHV0LnN0YXR1c2AgcHJlc2VudCBBTkQgZGlmZmVyZW50IGZyb20gYHByZXZpb3VzLnN0YXR1c2AuIEFcbiAqIG1ldHJpYy1vbmx5IHdyaXRlIGhhcyBubyBgc3RhdHVzYCBrZXkgYXQgYWxsLCBzbyB0aGUgcmUtZW50cnkgZW5kcyBhdCB0aGVcbiAqIGZpcnN0IGd1YXJkLiBgQ0FNUEFJR05fTUVUUklDX1dSSVRFX0tFWVNgIGF0IHRoZSBib3R0b20gb2YgdGhpcyBmaWxlIHN0YXRlc1xuICogdGhlIG90aGVyIGhhbGYgb2YgdGhhdCBjb250cmFjdCBhcyBkYXRhIHRoZSBydW50aW1lIHRlc3QgY2hlY2tzIHRoZSByZWNvcmRlZFxuICogd3JpdGUgYWdhaW5zdCwgc28gYSBmdXR1cmUgd3JpdGVyIHRoYXQgYWRkcyBhIG5vbi1tZXRyaWMga2V5IHRvIHRoZSByZWZyZXNoXG4gKiB3cml0ZSBmYWlscyBhIHRlc3QgaW5zdGVhZCBvZiBsb29waW5nIGluIHByb2R1Y3Rpb24uXG4gKlxuICogVGhlIG9sZCBgY2FtcGFpZ25fc25hcHNob3RfbWV0cmljc2AgZmlyZWQgb24gYFx1MjE5MiBjb21wbGV0ZWRgIGFuZCBub3RoaW5nIGVsc2UsXG4gKiB3aGljaCBtZWFudCBhIGNhbXBhaWduIHJlcG9ydGVkIHplcm9zIGZvciBpdHMgZW50aXJlIHVzZWZ1bCBsaWZlIGFuZCBiZWNhbWVcbiAqIGFjY3VyYXRlIG9uIHRoZSBkYXkgZXZlcnlib2R5IHN0b3BwZWQgbG9va2luZyBhdCBpdC4gQ29tcGxldGlvbiBpcyBub3cgc2ltcGx5XG4gKiBvbmUgb2YgdGhlIHRyYW5zaXRpb25zIHRoaXMgY2F0Y2hlcy5cbiAqL1xuY29uc3QgY2FtcGFpZ25NZXRyaWNzUmVmcmVzaDogSG9vayA9IHtcbiAgbmFtZTogJ2NhbXBhaWduX21ldHJpY3NfcmVmcmVzaCcsXG4gIG9iamVjdDogJ2NybV9jYW1wYWlnbicsXG4gIGV2ZW50czogWydhZnRlclVwZGF0ZSddLFxuICBwcmlvcml0eTogODAwLFxuICBhc3luYzogdHJ1ZSxcbiAgb25FcnJvcjogJ2xvZycsXG4gIGRlc2NyaXB0aW9uOiAnUmVjb21wdXRlIHRoZSBjYW1wYWlnbiBtZXRyaWMgYmxvY2sgd2hlbmV2ZXIgdGhlIGNhbXBhaWduIHN0YXR1cyBtb3Zlcy4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICAvLyBUaGUgcmVjdXJzaW9uIGd1YXJkLCBzdGF0ZWQgcG9zaXRpdmVseTogb25seSBhIHN0YXR1cyBUUkFOU0lUSU9OIHJ1bnMuXG4gICAgaWYgKHR5cGVvZiBpbnB1dC5zdGF0dXMgIT09ICdzdHJpbmcnKSByZXR1cm47XG4gICAgaWYgKHByZXZpb3VzICYmIGlucHV0LnN0YXR1cyA9PT0gcHJldmlvdXMuc3RhdHVzKSByZXR1cm47XG4gICAgY29uc3QgYXBpID0gY3R4LmFwaSBhcyBIb29rQXBpIHwgdW5kZWZpbmVkO1xuICAgIGlmICghYXBpKSByZXR1cm47XG4gICAgY29uc3QgY2FtcGFpZ25JZCA9XG4gICAgICAodHlwZW9mIGlucHV0LmlkID09PSAnc3RyaW5nJyAmJiBpbnB1dC5pZCkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXM/LmlkID09PSAnc3RyaW5nJyA/IChwcmV2aW91cy5pZCBhcyBzdHJpbmcpIDogJycpO1xuICAgIGlmICghY2FtcGFpZ25JZCkgcmV0dXJuO1xuICAgIGZvciAoY29uc3QgaWQgb2YgW2NhbXBhaWduSWRdKSB7XG4gICAgICAvLyBcdTI1MDBcdTI1MDAgcmVjb21wdXRlIFx1MjUwMFx1MjUwMCBpZGVudGljYWwgaW4gYWxsIGZvdXIgcmVmcmVzaCBob29rczsgc2VlIHRoZSBoZWFkZXIuXG4gICAgICBjb25zdCBtZW1iZXJSb3dzID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduX21lbWJlcicpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGlkIH0sIGZpZWxkczogWydjcm1fbGVhZCcsICdzdGF0dXMnXSwgdG9wOiA1MDAwLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsZWFkSWRzID0gQXJyYXkuZnJvbShuZXcgU2V0KFxuICAgICAgICBtZW1iZXJSb3dzLm1hcCgocikgPT4gKHR5cGVvZiByLmNybV9sZWFkID09PSAnc3RyaW5nJyA/IHIuY3JtX2xlYWQgOiAnJykpLmZpbHRlcihCb29sZWFuKSxcbiAgICAgICkpO1xuICAgICAgY29uc3QgY29udmVydGVkTGVhZHMgPSBsZWFkSWRzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBhd2FpdCBhcGkub2JqZWN0KCdjcm1fbGVhZCcpLmNvdW50KHsgd2hlcmU6IHsgaWQ6IHsgJGluOiBsZWFkSWRzIH0sIGlzX2NvbnZlcnRlZDogdHJ1ZSB9IH0pXG4gICAgICAgIDogMDtcbiAgICAgIGNvbnN0IG51bU9wcG9ydHVuaXRpZXMgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fb3Bwb3J0dW5pdHknKS5jb3VudCh7IHdoZXJlOiB7IGNybV9jYW1wYWlnbjogaWQgfSB9KTtcbiAgICAgIGNvbnN0IG51bVdvbiA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9vcHBvcnR1bml0eScpLmNvdW50KHsgd2hlcmU6IHsgY3JtX2NhbXBhaWduOiBpZCwgc3RhZ2U6ICdjbG9zZWRfd29uJyB9IH0pO1xuICAgICAgY29uc3Qgd29uUm93cyA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9vcHBvcnR1bml0eScpLmZpbmQoe1xuICAgICAgICB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGlkLCBzdGFnZTogJ2Nsb3NlZF93b24nIH0sIGZpZWxkczogWydhbW91bnQnXSwgdG9wOiA1MDAwLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBhY3R1YWxSZXZlbnVlID0gd29uUm93cy5yZWR1Y2UoXG4gICAgICAgIChzdW0sIHJvdykgPT4gc3VtICsgKHR5cGVvZiByb3cuYW1vdW50ID09PSAnbnVtYmVyJyA/IHJvdy5hbW91bnQgOiBOdW1iZXIocm93LmFtb3VudCkgfHwgMCksIDAsXG4gICAgICApO1xuICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX2NhbXBhaWduJykudXBkYXRlKHtcbiAgICAgICAgaWQsXG4gICAgICAgIG51bV9zZW50OiBtZW1iZXJSb3dzLmxlbmd0aCxcbiAgICAgICAgbnVtX3Jlc3BvbnNlczogbWVtYmVyUm93cy5maWx0ZXIoKHIpID0+IHIuc3RhdHVzID09PSAncmVzcG9uZGVkJyB8fCByLnN0YXR1cyA9PT0gJ2NvbnZlcnRlZCcpLmxlbmd0aCxcbiAgICAgICAgbnVtX2xlYWRzOiBsZWFkSWRzLmxlbmd0aCxcbiAgICAgICAgbnVtX2NvbnZlcnRlZF9sZWFkczogY29udmVydGVkTGVhZHMsXG4gICAgICAgIG51bV9vcHBvcnR1bml0aWVzOiBudW1PcHBvcnR1bml0aWVzLFxuICAgICAgICBudW1fd29uX29wcG9ydHVuaXRpZXM6IG51bVdvbixcbiAgICAgICAgYWN0dWFsX3JldmVudWU6IGFjdHVhbFJldmVudWUsXG4gICAgICB9LCB7IHdoZXJlOiB7IGlkIH0gfSk7XG4gICAgICAvLyBcdTI1MDBcdTI1MDAgL3JlY29tcHV0ZSBcdTI1MDBcdTI1MDBcbiAgICB9XG4gIH0sXG59O1xuXG4vKipcbiAqIFRoZSBtZXRyaWMgYmxvY2sgdGhlc2UgaG9va3Mgb3duLiBOb3RoaW5nIGVsc2UgbWF5IHdyaXRlIHRoZXNlIGNvbHVtbnMuXG4gKlxuICogTW9kdWxlIHNjb3BlLCBkZWxpYmVyYXRlbHkgT1VUU0lERSBldmVyeSBoYW5kbGVyOiB0aGlzIGlzIHJlYWQgYnkgdGhlIHRlc3RzLFxuICogbmV2ZXIgYnkgYSBzYW5kYm94ZWQgYm9keSBcdTIwMTQgYSBib2R5IHRoYXQgcmVmZXJlbmNlZCBpdCB3b3VsZCBzdG9wIGxvd2VyaW5nXG4gKiAoc2VlIHRoZSBoZWFkZXIpLlxuICovXG5leHBvcnQgY29uc3QgQ0FNUEFJR05fTUVUUklDX0ZJRUxEUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gICdudW1fc2VudCcsXG4gICdudW1fcmVzcG9uc2VzJyxcbiAgJ251bV9sZWFkcycsXG4gICdudW1fY29udmVydGVkX2xlYWRzJyxcbiAgJ251bV9vcHBvcnR1bml0aWVzJyxcbiAgJ251bV93b25fb3Bwb3J0dW5pdGllcycsXG4gICdhY3R1YWxfcmV2ZW51ZScsXG5dO1xuXG4vKipcbiAqIFRoZSByZWN1cnNpb24gY29udHJhY3Qgb2YgYGNhbXBhaWduX21ldHJpY3NfcmVmcmVzaGAsIGFzc2VydGVkIHJhdGhlciB0aGFuXG4gKiBkZXNjcmliZWQ6IHRoZSByZWZyZXNoIHdyaXRlIG1heSBjYXJyeSB0aGUgbWV0cmljIGJsb2NrIGFuZCBgaWRgLCBub3RoaW5nXG4gKiBlbHNlLiBBIGNvbW1lbnQgY2Fubm90IGZhaWw7IHRoaXMgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSByZWNvcmRlZCB3cml0ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IENBTVBBSUdOX01FVFJJQ19XUklURV9LRVlTOiByZWFkb25seSBzdHJpbmdbXSA9IFsnaWQnLCAuLi5DQU1QQUlHTl9NRVRSSUNfRklFTERTXTtcblxuZXhwb3J0IGRlZmF1bHQgW2NhbXBhaWduVmFsaWRhdGlvbiwgY2FtcGFpZ25NZXRyaWNzUmVmcmVzaF07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbl9tZW1iZXIuaG9vay50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvb2JqZWN0cy9jYW1wYWlnbl9tZW1iZXIuaG9vay50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHR5cGUgeyBIb29rLCBIb29rQ29udGV4dCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHR5cGUgeyBIb29rQXBpIH0gZnJvbSAnLi4vLi4vc2FsZXMvb2JqZWN0cy9faG9vay1hcGknO1xuXG4vKipcbiAqIENhbXBhaWduIG1lbWJlciBob29rcyBcdTIwMTQgdGhlIHdyaXRlcnMgdGhhdCBtYWtlIHRoZSB0cmltbWVkIGxpZmVjeWNsZSBob25lc3RcbiAqICgjNTk3KS5cbiAqXG4gKiBgY3JtX2NhbXBhaWduX21lbWJlcmAgd2FzIHRoZSBhcHAncyBjbGVhcmVzdCBjYXNlIG9mIGRlY2xhcmVkLWJ1dC1pbmVydFxuICogbWV0YWRhdGE6IGEgc2V2ZW4tdmFsdWUgZW5nYWdlbWVudCBsaWZlY3ljbGUgYW5kIHR3byB0cmFja2VyIHN0YW1wcywgd2l0aCB0aGVcbiAqIGVucm9sbG1lbnQgZmxvdyB3cml0aW5nIGBzZW50YCBhbmQgbm90aGluZyB3cml0aW5nIGFueXRoaW5nIGVsc2UsIGV2ZXIuIFRoZVxuICogb2JqZWN0IHRyaW0gcmVtb3ZlZCB0aGUgdmFsdWVzIG5vIHdyaXRlciBjb3VsZCByZWFjaDsgdGhlc2UgdGhyZWUgaG9va3MgYXJlXG4gKiB0aGUgb3RoZXIgaGFsZiBvZiB0aGF0IHRyYWRlIFx1MjAxNCB0aGV5IGdpdmUgZXZlcnkgdmFsdWUgdGhhdCBTVVJWSVZFRCBhIHdyaXRlclxuICogdGhhdCBhY3R1YWxseSBydW5zLlxuICpcbiAqIC0gYGNhbXBhaWduX21lbWJlcl9saWZlY3ljbGVgIChiZWZvcmUpIFx1MjAxNCBrZWVwcyBgaGFzX3Jlc3BvbmRlZGAgL1xuICogICBgcmVzcG9uc2VfZGF0ZWAgaW4gbG9ja3N0ZXAgd2l0aCBgc3RhdHVzYCwgd2hpY2hldmVyIGVuZCBhIGNhbGxlciB3cml0ZXMuXG4gKiAtIGBjYW1wYWlnbl9tZW1iZXJfb3B0b3V0X3N5bmNgIChhZnRlcikgXHUyMDE0IHJvdW5kLXRyaXBzIGB1bnN1YnNjcmliZWRgIHRvIHRoZVxuICogICBtZW1iZXIncyBsZWFkL2NvbnRhY3QgYGVtYWlsX29wdF9vdXRgLlxuICogLSBgY2FtcGFpZ25fbWVtYmVyX21ldHJpY3NfcmVmcmVzaGAgKGFmdGVyKSBcdTIwMTQgcmVjb21wdXRlcyB0aGUgY2FtcGFpZ24nc1xuICogICBtZXRyaWMgYmxvY2sgb24gZXZlcnkgbWVtYmVyc2hpcCBjaGFuZ2UsIHdoaWNoIGlzIHdoYXQgbWFrZXMgYSBsaXZlXG4gKiAgIGNhbXBhaWduIHNob3cgbGl2ZSBudW1iZXJzLlxuICpcbiAqIFx1MjZBMFx1RkUwRiBUaGUgcmVjb21wdXRlIGJsb2NrIGJlbG93IGlzIHdyaXR0ZW4gb3V0IGhlcmUgYW5kIHRocmVlIG1vcmUgdGltZXMgaW5cbiAqIGBjYW1wYWlnbi5ob29rLnRzYCwgZGVsaWJlcmF0ZWx5OiBhIHNhbmRib3hlZCBob29rIGJvZHkgY2Fubm90IHJlYWNoIG1vZHVsZVxuICogc2NvcGUsIHNvIGEgc2hhcmVkIGltcG9ydCB3b3VsZCBzdG9wIHRoZSBoYW5kbGVyIGxvd2VyaW5nIHRvIG1ldGFkYXRhIChzZWVcbiAqIHRoYXQgZmlsZSdzIGhlYWRlciBmb3IgdGhlIGZ1bGwgcmVhc29uaW5nKS4gQWxsIGZvdXIgY29waWVzIGFyZSBhc3NlcnRlZFxuICogY2hhcmFjdGVyLWlkZW50aWNhbCBieSBgdGVzdC9jYW1wYWlnbi1tZW1iZXItbGlmZWN5Y2xlLnRlc3QudHNgLlxuICovXG5cbi8qKlxuICogS2VlcCB0aGUgcmVzcG9uc2Ugc3VtbWFyeSBmaWVsZHMgaG9uZXN0LCBvbiBldmVyeSB3cml0ZSBwYXRoLlxuICpcbiAqIFRoZXJlIGFyZSB0d28gd2F5cyBhIG1lbWJlciBiZWNvbWVzIFwicmVzcG9uZGVkXCIgYW5kIHRoZXkgbXVzdCBub3QgZGlzYWdyZWU6XG4gKiB0aGUgYG1hcmtfcmVzcG9uZGVkYCBhY3Rpb24gKHdoaWNoIHN0YW1wcyBhbGwgdGhyZWUgZmllbGRzIGl0c2VsZikgYW5kIGEgcmVwXG4gKiBmbGlwcGluZyBgc3RhdHVzYCBvbiB0aGUgcmVjb3JkIGRldGFpbCBwYWdlICh3aGljaCBzdGFtcHMgb25seSBgc3RhdHVzYCkuIFRoZVxuICogc2Vjb25kIHBhdGggaXMgd2h5IHRoaXMgaG9vayBleGlzdHMgXHUyMDE0IHdpdGhvdXQgaXQsIGEgaGFuZC1mbGlwcGVkIG1lbWJlciByZWFkc1xuICogYFJlc3BvbmRlZGAgb24gdGhlIHN0YXR1cyBiYWRnZSBhbmQgYEhhcyBSZXNwb25kZWQ6IGZhbHNlYCB0d28gcm93cyBiZWxvdyBpdCxcbiAqIGFuZCBgdGVzdC9zZWVkLWNvbnNpc3RlbmN5LnRlc3QudHNgJ3MgXCJ0cmFjayB0aGUgcmVzcG9uZGVkIHN0YXR1cyBleGFjdGx5XCJcbiAqIGNvbnRyYWN0IGhvbGRzIGZvciBzZWVkZWQgcm93cyB3aGlsZSBydW50aW1lIHJvd3MgZHJpZnQgb3V0IG9mIGl0LlxuICpcbiAqIGBjb252ZXJ0ZWRgIGNvdW50cyBhcyByZXNwb25kZWQgdG9vOiBhIG1lbWJlciBjYW5ub3QgY29udmVydCB3aXRob3V0IGhhdmluZ1xuICogcmVzcG9uZGVkIGZpcnN0LCBhbmQgYGhhc19yZXNwb25kZWRgIGlzIHRoZSBcImRpZCB0aGlzIHBlcnNvbiBldmVyIGVuZ2FnZVwiXG4gKiBmbGFnIHRoZSByZXNwb25zZSBzdXJmYWNlcyBmaWx0ZXIgb24uXG4gKi9cbmNvbnN0IGNhbXBhaWduTWVtYmVyTGlmZWN5Y2xlOiBIb29rID0ge1xuICBuYW1lOiAnY2FtcGFpZ25fbWVtYmVyX2xpZmVjeWNsZScsXG4gIG9iamVjdDogJ2NybV9jYW1wYWlnbl9tZW1iZXInLFxuICBldmVudHM6IFsnYmVmb3JlSW5zZXJ0JywgJ2JlZm9yZVVwZGF0ZSddLFxuICBwcmlvcml0eTogMjAwLFxuICBkZXNjcmlwdGlvbjogJ0tlZXAgaGFzX3Jlc3BvbmRlZCAvIHJlc3BvbnNlX2RhdGUgaW4gbG9ja3N0ZXAgd2l0aCB0aGUgbWVtYmVyIHN0YXR1cy4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIC8vIEQzIHN0YW5kLWRvd246IGEgcHJlZGljYXRlIHVwZGF0ZSBoYXMgT05FIHBheWxvYWQgZm9yIGV2ZXJ5IG1hdGNoZWQgcm93LFxuICAgIC8vIHNvIHRoZSBgY3R4LnByZXZpb3VzYC1jb25kaXRpb25lZCB3cml0ZXMgYmVsb3cgd291bGQgbGFuZCBvbiByb3dzIHRoYXRcbiAgICAvLyBkaWQgbm90IGVhcm4gdGhlbSBcdTIwMTQgcmVmdXNlZCBhcyBhIGRpdmVyZ2luZyBrZXkgc2V0LCBvciBzdG9yZWQgc2lsZW50bHlcbiAgICAvLyBmcm9tIHRoZSBsYXN0IHJvdy4gRnVsbCBhY2NvdW50IGFuZCB0aGUgbWVhc3VyZW1lbnQ6IGBmb3JlY2FzdC5ob29rLnRzYC5cbiAgICBpZiAoY3R4LmV2ZW50ID09PSAnYmVmb3JlVXBkYXRlJyAmJiBjdHguZGlzcGF0Y2g/Lm1vZGUgPT09ICdwZXItcm93JykgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBpbnB1dCB9ID0gY3R4O1xuICAgIGNvbnN0IHByZXZpb3VzID0gY3R4LnByZXZpb3VzO1xuICAgIGNvbnN0IHN0YXR1cyA9XG4gICAgICAodHlwZW9mIGlucHV0LnN0YXR1cyA9PT0gJ3N0cmluZycgJiYgaW5wdXQuc3RhdHVzKSB8fFxuICAgICAgKHR5cGVvZiBwcmV2aW91cz8uc3RhdHVzID09PSAnc3RyaW5nJyA/IChwcmV2aW91cy5zdGF0dXMgYXMgc3RyaW5nKSA6IHVuZGVmaW5lZCk7XG4gICAgaWYgKCFzdGF0dXMpIHJldHVybjtcblxuICAgIC8vIFRoZSByZXNwb25kZWQgc2V0IGlzIHNwZWxsZWQgSU5MSU5FLCBub3QgbGlmdGVkIHRvIGEgbW9kdWxlIGNvbnN0YW50OiBhXG4gICAgLy8gc2FuZGJveGVkIGJvZHkgY2Fubm90IHJlYWNoIG1vZHVsZSBzY29wZSwgYW5kIGEgaGFuZGxlciB0aGF0IHJlYWRzIG9uZVxuICAgIC8vIHN0b3BzIGxvd2VyaW5nIHRvIG1ldGFkYXRhIChzZWUgYGNhbXBhaWduLmhvb2sudHNgJ3MgaGVhZGVyKS5cbiAgICBjb25zdCByZXNwb25kZWQgPSBzdGF0dXMgPT09ICdyZXNwb25kZWQnIHx8IHN0YXR1cyA9PT0gJ2NvbnZlcnRlZCc7XG4gICAgY29uc3QgcHJpb3JTdGF0dXMgPSB0eXBlb2YgcHJldmlvdXM/LnN0YXR1cyA9PT0gJ3N0cmluZycgPyAocHJldmlvdXMuc3RhdHVzIGFzIHN0cmluZykgOiAnJztcbiAgICBjb25zdCB3YXNSZXNwb25kZWQgPSBwcmlvclN0YXR1cyA9PT0gJ3Jlc3BvbmRlZCcgfHwgcHJpb3JTdGF0dXMgPT09ICdjb252ZXJ0ZWQnO1xuXG4gICAgaWYgKHJlc3BvbmRlZCkge1xuICAgICAgaW5wdXQuaGFzX3Jlc3BvbmRlZCA9IHRydWU7XG4gICAgICAvLyBTdGFtcCBhIHJlc3BvbnNlIGRhdGUgb25seSB3aGVuIHRoZSBtZW1iZXIgaXMgQ1JPU1NJTkcgaW50byBhIHJlc3BvbmRlZFxuICAgICAgLy8gc3RhdGUgYW5kIGRvZXMgbm90IGFscmVhZHkgY2Fycnkgb25lLiBSZS1zdGFtcGluZyBvbiBldmVyeSBsYXRlciBlZGl0XG4gICAgICAvLyB3b3VsZCBxdWlldGx5IG1vdmUgdGhlIHJlc3BvbnNlIGRhdGUgZm9yd2FyZCBlYWNoIHRpbWUgc29tZWJvZHkgdG91Y2hlZFxuICAgICAgLy8gdGhlIHJvdywgYW5kIHJlc3BvbnNlLXRpbWUgcmVwb3J0aW5nIHJlYWRzIHRoaXMgY29sdW1uLlxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBpbnB1dC5yZXNwb25zZV9kYXRlID8/IHByZXZpb3VzPy5yZXNwb25zZV9kYXRlO1xuICAgICAgaWYgKCF3YXNSZXNwb25kZWQgJiYgKGV4aXN0aW5nID09PSB1bmRlZmluZWQgfHwgZXhpc3RpbmcgPT09IG51bGwgfHwgZXhpc3RpbmcgPT09ICcnKSkge1xuICAgICAgICBpbnB1dC5yZXNwb25zZV9kYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE1vdmluZyBCQUNLIG91dCBvZiBhIHJlc3BvbmRlZCBzdGF0ZSAoYSBtaXMtY2xpY2sgY29ycmVjdGVkLCBvciBhIG1lbWJlclxuICAgIC8vIHJlc2V0IHRvIGBzZW50YCBmb3IgYSByZS1zZW5kKSBjbGVhcnMgdGhlIHN1bW1hcnkgd2l0aCBpdC4gTGVhdmluZ1xuICAgIC8vIGBoYXNfcmVzcG9uZGVkOiB0cnVlYCBiZWhpbmQgb24gYSBgc2VudGAgbWVtYmVyIGlzIHRoZSBzYW1lIGRpc2FncmVlbWVudFxuICAgIC8vIGluIHRoZSBvdGhlciBkaXJlY3Rpb24sIGFuZCBpdCBpbmZsYXRlcyBub3RoaW5nIHZpc2libGUgXHUyMDE0IHdoaWNoIGlzXG4gICAgLy8gZXhhY3RseSB3aHkgaXQgd291bGQgc3Vydml2ZSByZXZpZXcuXG4gICAgaWYgKHdhc1Jlc3BvbmRlZCAmJiB0eXBlb2YgaW5wdXQuc3RhdHVzID09PSAnc3RyaW5nJykge1xuICAgICAgaW5wdXQuaGFzX3Jlc3BvbmRlZCA9IGZhbHNlO1xuICAgICAgaW5wdXQucmVzcG9uc2VfZGF0ZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdHguZXZlbnQgPT09ICdiZWZvcmVJbnNlcnQnICYmIGlucHV0Lmhhc19yZXNwb25kZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5wdXQuaGFzX3Jlc3BvbmRlZCA9IGZhbHNlO1xuICAgIH1cbiAgfSxcbn07XG5cbi8qKlxuICogUm91bmQtdHJpcCBgdW5zdWJzY3JpYmVkYCB0byB0aGUgcGVyc29uJ3MgYGVtYWlsX29wdF9vdXRgLlxuICpcbiAqIFRoaXMgY2xvc2VzIGEgbG9vcCB0aGUgYXBwIGFscmVhZHkgaGFkIG9uZSBoYWxmIG9mOiBgY2FtcGFpZ25fZW5yb2xsbWVudGBcbiAqIGZpbHRlcnMgb24gYGVtYWlsX29wdF9vdXQ6IGZhbHNlYCwgYW5kIHRoZSBgc2VuZF9lbWFpbGAgYWN0aW9uIGhpZGVzIGl0c2VsZlxuICogb24gYW4gb3B0ZWQtb3V0IGNvbnRhY3QgXHUyMDE0IGJ1dCBOT1RISU5HIGV2ZXIgc2V0IHRoZSBmbGFnLCBzbyBob25vdXJpbmcgaXQgd2FzXG4gKiBhIHByb21pc2UgYWJvdXQgYSBjb2x1bW4gbm8gdXNlciBhY3Rpb24gY291bGQgcmVhY2guIFVuc3Vic2NyaWJpbmcgYSBtZW1iZXJcbiAqIG1hcmtlZCB0aGUganVuY3Rpb24gcm93IGFuZCBsZWZ0IHRoZSBwZXJzb24gZW5yb2xsYWJsZSBieSB0aGUgdmVyeSBuZXh0XG4gKiBjYW1wYWlnbiwgd2hpY2ggaXMgdGhlIGZhaWx1cmUgbW9kZSBhbiBvcHQtb3V0IGV4aXN0cyB0byBwcmV2ZW50LlxuICpcbiAqIERlbGliZXJhdGVseSBvbmUtZGlyZWN0aW9uYWw6IG1lbWJlciBgdW5zdWJzY3JpYmVkYCBcdTIxRDIgcGVyc29uIG9wdGVkIG91dC5cbiAqIFRoZSByZXZlcnNlIChwZXJzb24gb3B0cyBvdXQgXHUyMUQyIGNsb3NlIHRoZWlyIG9wZW4gbWVtYmVyc2hpcHMpIGlzIE5PVCBkb25lXG4gKiBoZXJlIFx1MjAxNCBhIHBhc3QgY2FtcGFpZ24ncyBtZW1iZXJzaGlwIGlzIGEgaGlzdG9yaWNhbCByZWNvcmQsIGFuZCByZXdyaXRpbmcgaXRcbiAqIHdvdWxkIGZhbHNpZnkgd2hhdCBoYXBwZW5lZCBhdCB0aGUgdGltZS5cbiAqXG4gKiBgYXN5bmNgICsgYG9uRXJyb3I6ICdsb2cnYDogdGhlIG1lbWJlciB3cml0ZSBpcyB0aGUgdXNlcidzIGFjdGlvbiBhbmQgbXVzdFxuICogbm90IGZhaWwgYmVjYXVzZSB0aGUgbGVhZCByb3cgaXMgbG9ja2VkIG9yIGdvbmUuIEEgbWlzc2VkIHN5bmMgaXMgcmVjb3ZlcmVkXG4gKiBieSB0aGUgbmV4dCB1bnN1YnNjcmliZTsgYSByZWplY3RlZCB3cml0ZSBsb3NlcyB0aGUgdW5zdWJzY3JpYmUgaXRzZWxmLlxuICpcbiAqIGBydW5BczogJ3N5c3RlbSdgICgjMjAxNCwgQUdFTlRTLm1kIHJ1bGUgOSkuIE1lbWJlcnMgYXJlIHdvcmtlZCBieVxuICogbWFya2V0aW5nLCBhbmQgYSBjb250YWN0IGlzIGEgbWFzdGVyLWRldGFpbCBjaGlsZCBvZiBpdHMgYWNjb3VudCwgd2hpY2ggYVxuICogbWFya2V0aW5nIHVzZXIgbWF5IG5vdCBlZGl0IFx1MjAxNCBzbyB0aGUgY29udGFjdCB3cml0ZSB3YXMgcmVmdXNlZCAoXCJyZXF1aXJlc1xuICogZWRpdCBhY2Nlc3MgdG8gaXRzIG1hc3RlciByZWNvcmRcIiksIGxvZ2dlZCBhbmQgc3dhbGxvd2VkLCBhbmQgdGhlIHBlcnNvblxuICogc3RheWVkIGVucm9sbGFibGUgYnkgdGhlIG5leHQgY2FtcGFpZ24uIEFuIHVuc3Vic2NyaWJlIGhhcyB0byByZWFjaCB0aGVcbiAqIHBlcnNvbiB3aG9ldmVyIHJlY29yZGVkIGl0LCBzbyB0aGUgaG9vayBlbGV2YXRlczsgdGhlIG1lbWJlciB3cml0ZSBzdGF5cyB0aGVcbiAqIGNhbGxlcidzLCBhbmQgYHVwZGF0ZWRfYnlgIG9uIHRoZSBwZXJzb24gc3RpbGwgbmFtZXMgdGhlbS4gT3JnYW5pemF0aW9uXG4gKiAocnVsZSAxMCk6IGl0IHdyaXRlcyBvbmx5IHRoZSBsZWFkIC8gY29udGFjdCB0aGUgdHJpZ2dlcmluZyBtZW1iZXIgcm93XG4gKiBuYW1lcywgYW5kIHRoZSBlbGV2YXRlZCBgY3R4LmFwaWAga2VlcHMgdGhlIHRyaWdnZXIncyB0ZW5hbnQuXG4gKi9cbmNvbnN0IGNhbXBhaWduTWVtYmVyT3B0T3V0U3luYzogSG9vayA9IHtcbiAgbmFtZTogJ2NhbXBhaWduX21lbWJlcl9vcHRvdXRfc3luYycsXG4gIG9iamVjdDogJ2NybV9jYW1wYWlnbl9tZW1iZXInLFxuICBldmVudHM6IFsnYWZ0ZXJJbnNlcnQnLCAnYWZ0ZXJVcGRhdGUnXSxcbiAgcHJpb3JpdHk6IDMwMCxcbiAgYXN5bmM6IHRydWUsXG4gIG9uRXJyb3I6ICdsb2cnLFxuICBydW5BczogJ3N5c3RlbScsXG4gIGRlc2NyaXB0aW9uOiAnU3luYyBhbiB1bnN1YnNjcmliZWQgbWVtYmVyIGJhY2sgdG8gdGhlIGxlYWQvY29udGFjdCBlbWFpbF9vcHRfb3V0IGZsYWcuJyxcbiAgaGFuZGxlcjogYXN5bmMgKGN0eDogSG9va0NvbnRleHQpID0+IHtcbiAgICBjb25zdCBhcGkgPSBjdHguYXBpIGFzIEhvb2tBcGkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFhcGkpIHJldHVybjtcbiAgICBjb25zdCB7IGlucHV0IH0gPSBjdHg7XG4gICAgY29uc3QgcHJldmlvdXMgPSBjdHgucHJldmlvdXM7XG4gICAgaWYgKGlucHV0Py5zdGF0dXMgIT09ICd1bnN1YnNjcmliZWQnKSByZXR1cm47XG4gICAgLy8gQWxyZWFkeSB1bnN1YnNjcmliZWQgXHUyMUQyIGFscmVhZHkgc3luY2VkLiBSZS1ydW5uaW5nIHdvdWxkIGJlIGhhcm1sZXNzXG4gICAgLy8gKHRoZSB3cml0ZSBpcyBpZGVtcG90ZW50KSBidXQgaXQgd291bGQgYWxzbyByZS1vcGVuIGEgcm93IG9uIGV2ZXJ5XG4gICAgLy8gdW5yZWxhdGVkIGVkaXQgb2YgYW4gdW5zdWJzY3JpYmVkIG1lbWJlci5cbiAgICBpZiAocHJldmlvdXM/LnN0YXR1cyA9PT0gJ3Vuc3Vic2NyaWJlZCcpIHJldHVybjtcblxuICAgIGNvbnN0IGxlYWRJZCA9XG4gICAgICAodHlwZW9mIGlucHV0Py5jcm1fbGVhZCA9PT0gJ3N0cmluZycgJiYgaW5wdXQuY3JtX2xlYWQpIHx8XG4gICAgICAodHlwZW9mIHByZXZpb3VzPy5jcm1fbGVhZCA9PT0gJ3N0cmluZycgPyAocHJldmlvdXMuY3JtX2xlYWQgYXMgc3RyaW5nKSA6IHVuZGVmaW5lZCk7XG4gICAgY29uc3QgY29udGFjdElkID1cbiAgICAgICh0eXBlb2YgaW5wdXQ/LmNybV9jb250YWN0ID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jcm1fY29udGFjdCkgfHxcbiAgICAgICh0eXBlb2YgcHJldmlvdXM/LmNybV9jb250YWN0ID09PSAnc3RyaW5nJyA/IChwcmV2aW91cy5jcm1fY29udGFjdCBhcyBzdHJpbmcpIDogdW5kZWZpbmVkKTtcblxuICAgIC8vIEV4YWN0bHkgb25lIG9mIHRoZSB0d28gaXMgc2V0IFx1MjAxNCBgbGVhZF9vcl9jb250YWN0X3JlcXVpcmVkYCBvbiB0aGUgb2JqZWN0XG4gICAgLy8gZ3VhcmFudGVlcyBhdCBsZWFzdCBvbmUsIGFuZCB0aGUgZW5yb2xsbWVudCB3cml0ZXJzIG5ldmVyIHNldCBib3RoLiBCb3RoXG4gICAgLy8gYnJhbmNoZXMgcnVuIGFueXdheSByYXRoZXIgdGhhbiBhbiBpZi9lbHNlLCBzbyBhIHJvdyB0aGF0IHNvbWVob3cgY2Fycmllc1xuICAgIC8vIGJvdGggc3RpbGwgb3B0cyBvdXQgYm90aCBwZW9wbGUgaW5zdGVhZCBvZiBoYWxmIG9mIHRoZW0uXG4gICAgaWYgKGxlYWRJZCkge1xuICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX2xlYWQnKS51cGRhdGUoXG4gICAgICAgIHsgaWQ6IGxlYWRJZCwgZW1haWxfb3B0X291dDogdHJ1ZSB9LFxuICAgICAgICB7IHdoZXJlOiB7IGlkOiBsZWFkSWQgfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGNvbnRhY3RJZCkge1xuICAgICAgYXdhaXQgYXBpLm9iamVjdCgnY3JtX2NvbnRhY3QnKS51cGRhdGUoXG4gICAgICAgIHsgaWQ6IGNvbnRhY3RJZCwgZW1haWxfb3B0X291dDogdHJ1ZSB9LFxuICAgICAgICB7IHdoZXJlOiB7IGlkOiBjb250YWN0SWQgfSB9LFxuICAgICAgKTtcbiAgICB9XG4gIH0sXG59O1xuXG4vKipcbiAqIFJlY29tcHV0ZSB0aGUgY2FtcGFpZ24ncyBtZXRyaWMgYmxvY2sgb24gZXZlcnkgbWVtYmVyc2hpcCBjaGFuZ2UuXG4gKlxuICogVEhJUyBpcyB0aGUgaG9vayB0aGUgXCJtZXRyaWNzIGFyZSBsaXZlXCIgYWNjZXB0YW5jZSBjcml0ZXJpb24gcmVzdHMgb246XG4gKiBlbnJvbGxpbmcgYSBtZW1iZXIsIG1hcmtpbmcgb25lIHJlc3BvbmRlZCwgb3IgcmVtb3Zpbmcgb25lIG1vdmVzXG4gKiBgbnVtX3NlbnRgIC8gYG51bV9yZXNwb25zZXNgIC8gYG51bV9sZWFkc2AgLyBgbnVtX2NvbnZlcnRlZF9sZWFkc2BcbiAqIGltbWVkaWF0ZWx5IFx1MjAxNCBubyB3YWl0aW5nIGZvciB0aGUgY2FtcGFpZ24gdG8gcmVhY2ggYGNvbXBsZXRlZGAsIHdoaWNoIGlzXG4gKiB3aGF0IHRoZSByZW1vdmVkIGBjYW1wYWlnbl9zbmFwc2hvdF9tZXRyaWNzYCBtYWRlIGV2ZXJ5b25lIHdhaXQgZm9yLlxuICpcbiAqIEJvdGggc2lkZXMgb24gdXBkYXRlOiBtb3ZpbmcgYSBtZW1iZXIgYmV0d2VlbiBjYW1wYWlnbnMgaGFzIHRvIGRlY3JlbWVudCB0aGVcbiAqIG9sZCBjYW1wYWlnbiBhcyB3ZWxsIGFzIGluY3JlbWVudCB0aGUgbmV3IG9uZS5cbiAqXG4gKiBObyBsb29wOiB0aGlzIHdyaXRlcyBgY3JtX2NhbXBhaWduYCwgYW5kIHRoZSBjYW1wYWlnbi1zaWRlIHJlZnJlc2ggb25seSBmaXJlc1xuICogb24gYSBgc3RhdHVzYCB0cmFuc2l0aW9uLCB3aGljaCBhIG1ldHJpYy1vbmx5IHdyaXRlIGRvZXMgbm90IGNhcnJ5LlxuICpcbiAqIGBydW5BczogJ3N5c3RlbSdgICgjMjAxNCwgQUdFTlRTLm1kIHJ1bGUgOSkuIEEgcm9sbHVwIG11c3Qgbm90IGRlcGVuZCBvbiB3aG9cbiAqIGZpcmVkIGl0LiBSdW4gYXMgYSBtYXJrZXRpbmcgdXNlciwgdGhlIHJlY29tcHV0ZSBjb3VudGVkIG9ubHkgdGhlIGRlYWxzIHRoYXRcbiAqIHVzZXIgbWF5IHNlZSBcdTIwMTQgYSBQcml2YXRlIHdvbiBkZWFsIGlzIGl0cyBvd25lcidzIGFsb25lIFx1MjAxNCBhbmQgd3JvdGUgdGhlXG4gKiBzbWFsbGVyIG51bWJlcnMgb3ZlciB0aGUgcmlnaHQgb25lczogbWVhc3VyZWQsIGBudW1fd29uX29wcG9ydHVuaXRpZXNgIDIgXHUyMTkyIDFcbiAqIGFuZCBgYWN0dWFsX3JldmVudWVgIDEsMTAwIFx1MjE5MiAxMDAgdGhlIG1vbWVudCBhIG1hcmtldGVyIGVucm9sbGVkIGEgbWVtYmVyLlxuICogRWxldmF0ZWQsIGV2ZXJ5IG1lbWJlciB3cml0ZSByZWNvbXB1dGVzIHRoZSBzYW1lIGNhbXBhaWduIHRoZSBzYW1lIHdheTsgdGhlXG4gKiBtZW1iZXIgd3JpdGUgaXRzZWxmIHN0YXlzIHRoZSBjYWxsZXIncy4gT3JnYW5pemF0aW9uIChydWxlIDEwKTogZXZlcnkgcmVhZFxuICogaXMga2V5ZWQgdG8gdGhlIHRyaWdnZXJpbmcgbWVtYmVyJ3MgY2FtcGFpZ24gKGFuZCB0aGUgbGVhZHMgdGhhdCBjYW1wYWlnbidzXG4gKiBtZW1iZXJzIG5hbWUpLCBhbmQgdGhlIGVsZXZhdGVkIGBjdHguYXBpYCBrZWVwcyB0aGUgdHJpZ2dlcidzIHRlbmFudC5cbiAqL1xuY29uc3QgY2FtcGFpZ25NZW1iZXJNZXRyaWNzUmVmcmVzaDogSG9vayA9IHtcbiAgbmFtZTogJ2NhbXBhaWduX21lbWJlcl9tZXRyaWNzX3JlZnJlc2gnLFxuICBvYmplY3Q6ICdjcm1fY2FtcGFpZ25fbWVtYmVyJyxcbiAgZXZlbnRzOiBbJ2FmdGVySW5zZXJ0JywgJ2FmdGVyVXBkYXRlJywgJ2FmdGVyRGVsZXRlJ10sXG4gIHByaW9yaXR5OiA4MDAsXG4gIGFzeW5jOiB0cnVlLFxuICBvbkVycm9yOiAnbG9nJyxcbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICBkZXNjcmlwdGlvbjogJ1JlY29tcHV0ZSB0aGUgY2FtcGFpZ24gbWV0cmljIGJsb2NrIGxpdmUgd2hlbmV2ZXIgaXRzIG1lbWJlcnNoaXAgY2hhbmdlcy4nLFxuICBoYW5kbGVyOiBhc3luYyAoY3R4OiBIb29rQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IGFwaSA9IGN0eC5hcGkgYXMgSG9va0FwaSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFwaSkgcmV0dXJuO1xuICAgIGNvbnN0IHsgaW5wdXQgfSA9IGN0eDtcbiAgICBjb25zdCBwcmV2aW91cyA9IGN0eC5wcmV2aW91cztcbiAgICBjb25zdCBjYW1wYWlnbklkcyA9IEFycmF5LmZyb20obmV3IFNldChbXG4gICAgICB0eXBlb2YgaW5wdXQ/LmNybV9jYW1wYWlnbiA9PT0gJ3N0cmluZycgPyBpbnB1dC5jcm1fY2FtcGFpZ24gOiAnJyxcbiAgICAgIHR5cGVvZiBwcmV2aW91cz8uY3JtX2NhbXBhaWduID09PSAnc3RyaW5nJyA/IChwcmV2aW91cy5jcm1fY2FtcGFpZ24gYXMgc3RyaW5nKSA6ICcnLFxuICAgIF0uZmlsdGVyKEJvb2xlYW4pKSk7XG4gICAgZm9yIChjb25zdCBpZCBvZiBjYW1wYWlnbklkcykge1xuICAgICAgLy8gXHUyNTAwXHUyNTAwIHJlY29tcHV0ZSBcdTI1MDBcdTI1MDAgaWRlbnRpY2FsIGluIGFsbCBmb3VyIHJlZnJlc2ggaG9va3M7IHNlZSB0aGUgaGVhZGVyLlxuICAgICAgY29uc3QgbWVtYmVyUm93cyA9IGF3YWl0IGFwaS5vYmplY3QoJ2NybV9jYW1wYWlnbl9tZW1iZXInKS5maW5kKHtcbiAgICAgICAgd2hlcmU6IHsgY3JtX2NhbXBhaWduOiBpZCB9LCBmaWVsZHM6IFsnY3JtX2xlYWQnLCAnc3RhdHVzJ10sIHRvcDogNTAwMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbGVhZElkcyA9IEFycmF5LmZyb20obmV3IFNldChcbiAgICAgICAgbWVtYmVyUm93cy5tYXAoKHIpID0+ICh0eXBlb2Ygci5jcm1fbGVhZCA9PT0gJ3N0cmluZycgPyByLmNybV9sZWFkIDogJycpKS5maWx0ZXIoQm9vbGVhbiksXG4gICAgICApKTtcbiAgICAgIGNvbnN0IGNvbnZlcnRlZExlYWRzID0gbGVhZElkcy5sZW5ndGggPiAwXG4gICAgICAgID8gYXdhaXQgYXBpLm9iamVjdCgnY3JtX2xlYWQnKS5jb3VudCh7IHdoZXJlOiB7IGlkOiB7ICRpbjogbGVhZElkcyB9LCBpc19jb252ZXJ0ZWQ6IHRydWUgfSB9KVxuICAgICAgICA6IDA7XG4gICAgICBjb25zdCBudW1PcHBvcnR1bml0aWVzID0gYXdhaXQgYXBpLm9iamVjdCgnY3JtX29wcG9ydHVuaXR5JykuY291bnQoeyB3aGVyZTogeyBjcm1fY2FtcGFpZ246IGlkIH0gfSk7XG4gICAgICBjb25zdCBudW1Xb24gPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fb3Bwb3J0dW5pdHknKS5jb3VudCh7IHdoZXJlOiB7IGNybV9jYW1wYWlnbjogaWQsIHN0YWdlOiAnY2xvc2VkX3dvbicgfSB9KTtcbiAgICAgIGNvbnN0IHdvblJvd3MgPSBhd2FpdCBhcGkub2JqZWN0KCdjcm1fb3Bwb3J0dW5pdHknKS5maW5kKHtcbiAgICAgICAgd2hlcmU6IHsgY3JtX2NhbXBhaWduOiBpZCwgc3RhZ2U6ICdjbG9zZWRfd29uJyB9LCBmaWVsZHM6IFsnYW1vdW50J10sIHRvcDogNTAwMCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYWN0dWFsUmV2ZW51ZSA9IHdvblJvd3MucmVkdWNlKFxuICAgICAgICAoc3VtLCByb3cpID0+IHN1bSArICh0eXBlb2Ygcm93LmFtb3VudCA9PT0gJ251bWJlcicgPyByb3cuYW1vdW50IDogTnVtYmVyKHJvdy5hbW91bnQpIHx8IDApLCAwLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGFwaS5vYmplY3QoJ2NybV9jYW1wYWlnbicpLnVwZGF0ZSh7XG4gICAgICAgIGlkLFxuICAgICAgICBudW1fc2VudDogbWVtYmVyUm93cy5sZW5ndGgsXG4gICAgICAgIG51bV9yZXNwb25zZXM6IG1lbWJlclJvd3MuZmlsdGVyKChyKSA9PiByLnN0YXR1cyA9PT0gJ3Jlc3BvbmRlZCcgfHwgci5zdGF0dXMgPT09ICdjb252ZXJ0ZWQnKS5sZW5ndGgsXG4gICAgICAgIG51bV9sZWFkczogbGVhZElkcy5sZW5ndGgsXG4gICAgICAgIG51bV9jb252ZXJ0ZWRfbGVhZHM6IGNvbnZlcnRlZExlYWRzLFxuICAgICAgICBudW1fb3Bwb3J0dW5pdGllczogbnVtT3Bwb3J0dW5pdGllcyxcbiAgICAgICAgbnVtX3dvbl9vcHBvcnR1bml0aWVzOiBudW1Xb24sXG4gICAgICAgIGFjdHVhbF9yZXZlbnVlOiBhY3R1YWxSZXZlbnVlLFxuICAgICAgfSwgeyB3aGVyZTogeyBpZCB9IH0pO1xuICAgICAgLy8gXHUyNTAwXHUyNTAwIC9yZWNvbXB1dGUgXHUyNTAwXHUyNTAwXG4gICAgfVxuICB9LFxufTtcblxuZXhwb3J0IGRlZmF1bHQgW1xuICBjYW1wYWlnbk1lbWJlckxpZmVjeWNsZSxcbiAgY2FtcGFpZ25NZW1iZXJPcHRPdXRTeW5jLFxuICBjYW1wYWlnbk1lbWJlck1ldHJpY3NSZWZyZXNoLFxuXTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL2xlYWQtY29udmVyc2lvbi5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL2xlYWQtY29udmVyc2lvbi5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKiBMZWFkIENvbnZlcnNpb24gXHUyMDE0IG11bHRpLXN0ZXAgc2NyZWVuIGZsb3cgdG8gY29udmVydCBxdWFsaWZpZWQgbGVhZHMgKi9cbmV4cG9ydCBjb25zdCBMZWFkQ29udmVyc2lvbkZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICdsZWFkX2NvbnZlcnNpb24nLFxuICBsYWJlbDogJ0xlYWQgQ29udmVyc2lvbiBQcm9jZXNzJyxcbiAgZGVzY3JpcHRpb246ICdBdXRvbWF0ZWQgZmxvdyB0byBjb252ZXJ0IHF1YWxpZmllZCBsZWFkcyB0byBhY2NvdW50cywgY29udGFjdHMsIGFuZCBvcHBvcnR1bml0aWVzJyxcbiAgdHlwZTogJ3NjcmVlbicsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG5cbiAgdmFyaWFibGVzOiBbXG4gICAgLy8gTmFtZWQgYHJlY29yZElkYCB0byBtYXRjaCB0aGUgY29uc29sZSdzIGZsb3ctYWN0aW9uIGludm9jYXRpb24gY29udHJhY3Q6XG4gICAgLy8gUE9TVCAvYXV0b21hdGlvbi86bmFtZS90cmlnZ2VyIHNlbmRzIHsgcmVjb3JkSWQsIG9iamVjdE5hbWUgfSBhbmQgdGhlXG4gICAgLy8gZGlzcGF0Y2hlciBleHBvc2VzIHRoZW0gYXMgcGFyYW1zLnJlY29yZElkIC8gcGFyYW1zLmNybUxlYWRJZC4gQSBjdXN0b21cbiAgICAvLyBuYW1lIGxpa2UgYGxlYWRJZGAgbmV2ZXIgZ2V0cyBzZWVkZWQgKDE2LnggcnVudGltZSkuXG4gICAgeyBuYW1lOiAncmVjb3JkSWQnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICAgIC8vIFRIRSBhdXRob3JpdHkgZm9yIHRoZSBjb252ZXJzaW9uIGRlZmF1bHQuIGBkZWZhdWx0VmFsdWVgIGlzIHdoYXQgbWFrZXNcbiAgICAvLyBkZWNsYXJlZCBtZWFuIEJPVU5EOiB0aGUgZW5naW5lIHNlZWRzIGV2ZXJ5IGRlY2xhcmVkIHZhcmlhYmxlIHRoYXRcbiAgICAvLyBjYXJyaWVzIG9uZSBiZWZvcmUgdGhlIHJ1biBzdGFydHMsIHNvIGBjcmVhdGVPcHBvcnR1bml0eWAgaXMgYm91bmQgb25cbiAgICAvLyBldmVyeSBwYXRoIFx1MjAxNCBpbmNsdWRpbmcgdGhlIG9uZSB3aGVyZSB0aGUgc2NyZWVuIHJ1bm5lciBwb3N0cyBiYWNrIG9ubHlcbiAgICAvLyB0aGUgZmllbGRzIHRoZSB1c2VyIHRvdWNoZWQuIFRoZSBzY3JlZW4gZmllbGQgYmVsb3cgZGVyaXZlcyBpdHMgcHJlZmlsbFxuICAgIC8vIGZyb20gdGhpcyBsaW5lIHJhdGhlciB0aGFuIHJlc3RhdGluZyBgZmFsc2VgLlxuICAgIC8vXG4gICAgLy8gTWVhc3VyZWQgb24gMTcuMC4wIEdBLCBieSBydW5uaW5nIGZsb3dzIChub3QgYnkgcmVhZGluZyB0aGUgZW5naW5lKTpcbiAgICAvLyAgIFx1MDBCNyBkZWNsYXJlZCArIG5vdGhpbmcgc3VwcGxpZWQgIFx1MjE5MiBib3VuZCB0byBgZmFsc2VgOyBhYmxhdGluZyB0aGlzIGtleVxuICAgIC8vICAgICBmcm9tIHRoZSBkZWNsYXJhdGlvbiByZS1mYWlscyB0aGUgcmVhZCB3aXRoIGBObyBzdWNoIGtleTpcbiAgICAvLyAgICAgY3JlYXRlT3Bwb3J0dW5pdHlgLCBzbyB0aGUgZGVmYXVsdCBpcyB3aGF0IGJpbmRzIGl0O1xuICAgIC8vICAgXHUwMEI3IHNlZWRlZCBCRUZPUkUgdGhlIHN0YXJ0IGNvbmRpdGlvbiBpcyBldmFsdWF0ZWQsIHNvIGEgc3RhcnQgY29uZGl0aW9uXG4gICAgLy8gICAgIGNvdWxkIHJlYWQgaXQgdG9vO1xuICAgIC8vICAgXHUwMEI3IGEgY2FsbGVyLXN1cHBsaWVkIGBjb250ZXh0LnBhcmFtcy5jcmVhdGVPcHBvcnR1bml0eWAgV0lOUyBcdTIwMTQgdGhlXG4gICAgLy8gICAgIGJvdW5kYXJ5IGlzIGAhPT0gdW5kZWZpbmVkYCwgc28gYW4gZXhwbGljaXQgYGZhbHNlYC9gbnVsbGAgaXMgYVxuICAgIC8vICAgICBzdXBwbGllZCBhbnN3ZXIsIGFuZCBvbmx5IGFic2VuY2UgZmFsbHMgdGhyb3VnaCB0byB0aGlzIGRlZmF1bHQuXG4gICAgLy8gXHUyNkQ0IE5ldmVyIHNlZWQgdGhpcyB3aXRoIGFuIGFzc2lnbm1lbnQgbm9kZSBpbnN0ZWFkOiBhbiBhc3NpZ25tZW50IGlzXG4gICAgLy8gdW5jb25kaXRpb25hbCBhbmQgY2xvYmJlcnMgYSBjYWxsZXItc3VwcGxpZWQgdmFsdWUuIEFsbCBvZiB0aGUgYWJvdmUgaXNcbiAgICAvLyBwaW5uZWQgaW4gYHRlc3QvZmxvdy12YXJpYWJsZS1jb25kaXRpb25zLnRlc3QudHNgLlxuICAgIHsgbmFtZTogJ2NyZWF0ZU9wcG9ydHVuaXR5JywgdHlwZTogJ2Jvb2xlYW4nLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UsIGRlZmF1bHRWYWx1ZTogZmFsc2UgfSxcbiAgICB7IG5hbWU6ICdvcHBvcnR1bml0eU5hbWUnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICAgIHsgbmFtZTogJ29wcG9ydHVuaXR5QW1vdW50JywgdHlwZTogJ3RleHQnLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgICAvLyBUaGUgY29udmVyc2lvbidzIGNsb3NlIGRhdGUsIGNvbGxlY3RlZCBvbiB0aGUgc2NyZWVuIGJlbG93XG4gICAgLy8gaW5zdGVhZCBvZiBzdGFtcGVkIGluc2lkZSBgY3JlYXRlX29wcG9ydHVuaXR5YC4gRGVjbGFyZWQgd2l0aCBOT1xuICAgIC8vIGBkZWZhdWx0VmFsdWVgLCBhbmQgdGhhdCBpcyBtZWFzdXJlZCByYXRoZXIgdGhhbiBjaG9zZW46IHRoZSBlbmdpbmVcbiAgICAvLyBiaW5kcyBhIERFQ0xBUkFUSU9OJ3MgZGVmYXVsdCByYXcgXHUyMDE0IGBzZWVkRGVjbGFyZWRWYXJpYWJsZXNgIGRvZXMgYSBwbGFpblxuICAgIC8vIGB2YXJpYWJsZXMuc2V0KG5hbWUsIGRlZmF1bHRWYWx1ZSlgIHdpdGggbm8gYGludGVycG9sYXRlYCBjYWxsIFx1MjAxNCBzb1xuICAgIC8vIGB7VE9EQVkoKSArIDkwfWAgd3JpdHRlbiBoZXJlIHdvdWxkIGJpbmQgdGhhdCBzdHJpbmcgdmVyYmF0aW0gYW5kXG4gICAgLy8gYGNyZWF0ZV9vcHBvcnR1bml0eWAgd291bGQgcG9zdCB0aGUgYnJhY2VzIGludG8gYSBkYXRlIGNvbHVtbi4gTWVhc3VyZWRcbiAgICAvLyBvbiAxNy4zLjAgYnkgcnVubmluZyBhIHByb2JlIGZsb3csIG5vdCBieSByZWFkaW5nIHRoZSBlbmdpbmUuIFRoZSBzY3JlZW5cbiAgICAvLyBmaWVsZCBpcyB0aGVyZWZvcmUgdGhlIG9ubHkgbGF5ZXIgdGhhdCBjYW4gY2FycnkgdGhlIGV4cHJlc3Npb24sIHdoaWNoXG4gICAgLy8gaXMgd2hlcmUgdGhlICs5MCBsaXZlcyBhbmQgd2h5IHRoaXMgbGluZSBpcyBkZWxpYmVyYXRlbHkgYmFyZS5cbiAgICB7IG5hbWU6ICdjbG9zZURhdGUnLCB0eXBlOiAnZGF0ZScsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICBdLFxuXG4gIG5vZGVzOiBbXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCcsIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX2xlYWQnIH0gfSxcbiAgICB7XG4gICAgICBpZDogJ3NjcmVlbl8xJywgdHlwZTogJ3NjcmVlbicsIGxhYmVsOiAnQ29udmVyc2lvbiBEZXRhaWxzJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBUaGUgc3VzcGVjdGVkLWR1cGxpY2F0ZSB3YXJuaW5nLiBgbGVhZF9kdXBsaWNhdGVfY2hlY2tgIGZsYWdzIGFcbiAgICAgICAgLy8gcmUtY2FwdHVyZWQgZW1haWwgYXQgaW50YWtlIGFuZCBsaW5rcyB0aGUgcmVjb3JkIHRoZSBsZWFkIHJlcGVhdHM7XG4gICAgICAgIC8vIHRoZSByZXAgYWJvdXQgdG8gQ09OVkVSVCBpcyB0aGUgbGFzdCBtb21lbnQgdGhhdCBmbGFnIGlzIHdvcnRoXG4gICAgICAgIC8vIGFueXRoaW5nLCBhbmQgd2l0aG91dCBpdCB0aGUgZHVwbGljYXRlIGJlY29tZXMgYSBzZWNvbmQgYWNjb3VudCxcbiAgICAgICAgLy8gY29udGFjdCBhbmQgb3Bwb3J0dW5pdHkuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFx1MjZENCBOb3Qgb24gYGNvbnZlcnRfbGVhZGAncyBgY29uZmlybVRleHRgOiB0aGF0IHN0cmluZyBpcyBzdGF0aWMgYW5kXG4gICAgICAgIC8vIHVuY29uZGl0aW9uYWwsIHNvIGl0IHdvdWxkIHdhcm4gaWRlbnRpY2FsbHkgb24gZXZlcnkgY2xlYW4gbGVhZCBcdTIwMTQgdGhlXG4gICAgICAgIC8vIGNyeS13b2xmIHRoYXQgbWFrZXMgYSBjb25maXJtIGRpYWxvZyBmdXJuaXR1cmUuIFRoaXMgc2NyZWVuIGlzIHdoZXJlXG4gICAgICAgIC8vIHRoZSBjb252ZXJzaW9uIGRlY2lzaW9uIGlzIGFjdHVhbGx5IHRha2VuLCBhbmQgdGhlIG9uZSBzdXJmYWNlIHRoYXRcbiAgICAgICAgLy8gY2FuIHNheSBzb21ldGhpbmcgVFJVRSBhYm91dCBUSElTIGxlYWQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE1lY2hhbmlzbTogdGhlIGV4ZWN1dG9yIHJlbmRlcnMgYGNvbmZpZy5kZXNjcmlwdGlvbmAgXHUyMDE0IGEgdGV4dCBzbG90LFxuICAgICAgICAvLyB3cml0dGVuIGFzIGEgYHt7IH19YCBob2xlIHNpbmNlIDE4LjAuMC1uZXh0LjAgXHUyMDE0IGludG8gdGhlIGBTY3JlZW5TcGVjYFxuICAgICAgICAvLyBpdCBwdXRzIG9uIHRoZSB3aXJlLCBhbmQgYEZsb3dSdW5uZXIudHN4YCByZW5kZXJzIGl0IFx1MjAxNFxuICAgICAgICAvLyBge3NjcmVlbi5kZXNjcmlwdGlvbiAmJiA8RGlhbG9nRGVzY3JpcHRpb24+XHUyMDI2fWAuIEEgaG9sZSBvdmVyIGBudWxsYFxuICAgICAgICAvLyByZW5kZXJzIHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIHRoZSBleGVjdXRvcidzIGByZW5kZXJUZXh0U2xvdGBcbiAgICAgICAgLy8gdHVybnMgaW50byBubyBkZXNjcmlwdGlvbiBhdCBhbGwgKHJlYWQgaW4gdGhlIGluc3RhbGxlZFxuICAgICAgICAvLyAxOC4wLjAtbmV4dC4wIGBzZXJ2aWNlLWF1dG9tYXRpb25gOyBvbiB0aGUgMTcuMS4wIGJ1bmRsZXMgaXQgd2FzXG4gICAgICAgIC8vIG1lYXN1cmVkIGFzIGBpbnRlcnBgIG1hcHBpbmcgbnVsbCB0byBgdW5kZWZpbmVkYCksIHNvIHRoZSBjbGVhbi1sZWFkXG4gICAgICAgIC8vIGJyYW5jaCBiZWxvdyAod2hpY2ggYXNzaWducyBgbnVsbGApIHJlbmRlcnMgTk8gZGVzY3JpcHRpb24gcmF0aGVyXG4gICAgICAgIC8vIHRoYW4gYW4gZW1wdHkgcGFyYWdyYXBoLiBUaGF0IGlzIHdoeSB0aGUgY29uZGl0aW9uYWxpdHkgbGl2ZXMgaW4gYW5cbiAgICAgICAgLy8gYXNzaWdubWVudCBhbmQgbm90IGluIHRoZSBjb3B5OiBhIHNjcmVlbiBgZGVzY3JpcHRpb25gIGhhcyBub1xuICAgICAgICAvLyBgdmlzaWJsZVdoZW5gLlxuICAgICAgICBkZXNjcmlwdGlvbjogJ3t7ZHVwbGljYXRlV2FybmluZ319JyxcbiAgICAgICAgLy8gYHZpc2libGVXaGVuYCBvbiBhIHNjcmVlbiBmaWVsZCBpcyBCQVJFIENFTCBvdmVyIHRoZSBzY3JlZW4ncyBvd25cbiAgICAgICAgLy8gZmllbGQgbmFtZXMgXHUyMDE0IG5vdCB0aGUgQ0VMIHZhbHVlIGVudmVsb3BlcyB0aGUgcmVzdCBvZiB0aGlzIGZsb3cgdXNlc1xuICAgICAgICAvLyBmb3IgZmlsdGVycyBhbmQgYHVwZGF0ZV9yZWNvcmRgIGZpZWxkcywgZXZhbHVhdGVkIG9uIHRoZSBzZXJ2ZXIuIFRoZVxuICAgICAgICAvLyBjbGllbnQgcmUtZXZhbHVhdGVzIHRoZSBwcmVkaWNhdGUgYWdhaW5zdCB0aGUgdmFsdWVzIGNvbGxlY3RlZCBzbyBmYXIsXG4gICAgICAgIC8vIHdoaWNoIGlzIHdoeSBpdCBjYW5ub3QgYmUgYSBzZXJ2ZXItZXZhbHVhdGVkIGVudmVsb3BlLlxuICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAvLyBcdTI2RDQgTkVWRVIgYHJlcXVpcmVkYCBvbiBhIGJvb2xlYW4gc2NyZWVuIGZpZWxkLiBBIGNoZWNrYm94IGhhcyBub1xuICAgICAgICAgIC8vIHVuYW5zd2VyZWQgc3RhdGUgXHUyMDE0IGNsZWFyIElTIGFuIGFuc3dlciwgYW5kIFwiY29udmVydCB0aGlzIGxlYWRcbiAgICAgICAgICAvLyBXSVRIT1VUIGFuIG9wcG9ydHVuaXR5XCIgaXMgdGhlIGNvbW1vbmVzdCBwYXRoLiBgcmVxdWlyZWQ6IHRydWVgXG4gICAgICAgICAgLy8gYmxvY2tzIG9uIGJvdGggc2lkZXMgb2YgdGhlIHdpcmU6IHRoZSBjbGllbnQgY291bnRzIHRoZSB1bnRvdWNoZWRcbiAgICAgICAgICAvLyBib3ggYXMgYW4gdW5hbnN3ZXJlZCBmaWVsZCBhbmQgZGlzYWJsZXMgU3VibWl0LCBhbmQgZnJvbVxuICAgICAgICAgIC8vIDE3LjAuMC1yYy4yIHRoZSBTRVJWRVIgZW5mb3JjZXMgdGhlIHNjcmVlbidzIGRlY2xhcmVkIGNvbnRyYWN0IHRvbyxcbiAgICAgICAgICAvLyByZWZ1c2luZyB0aGUgcmVzdW1lIHdpdGggYElOVkFMSURfU0NSRUVOX0lOUFVUOiBTY3JlZW4gZmllbGRcbiAgICAgICAgICAvLyBcImNyZWF0ZU9wcG9ydHVuaXR5XCIgaXMgcmVxdWlyZWRgIFx1MjAxNCBzbyBhIHJ1bm5lciB0aGF0IHBvc3RzIG9ubHkgd2hhdFxuICAgICAgICAgIC8vIHRoZSB1c2VyIHRvdWNoZWQgY2Fubm90IGNvbnZlcnQgYSBsZWFkIGF0IGFsbC4gVGhlIHZhcmlhYmxlJ3NcbiAgICAgICAgICAvLyBkZWNsYXJlZCBgZGVmYXVsdFZhbHVlYCBpcyB3aGF0IHN1cHBsaWVzIHRoZSBhbnN3ZXIuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBERVJJVkVELCBub3QgcmVzdGF0ZWQuIFRoZSBlbnZlbG9wZSByZWFkcyB0aGUgZmxvdyB2YXJpYWJsZVxuICAgICAgICAgIC8vIGBjcmVhdGVPcHBvcnR1bml0eWAsIHNvIHRoZSBsaXRlcmFsIGBmYWxzZWAgaXMgd3JpdHRlbiBleGFjdGx5IG9uY2UgaW4gdGhpc1xuICAgICAgICAgIC8vIGZpbGUgXHUyMDE0IG9uIHRoZSBkZWNsYXJhdGlvbiBcdTIwMTQgYW5kIHRoZSB3aWRnZXQgcHJlZmlsbCBjYW5ub3QgZHJpZnQgZnJvbVxuICAgICAgICAgIC8vIHRoZSB2YWx1ZSB0aGUgZW5naW5lIGJpbmRzLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gQSBzY3JlZW4gZmllbGQncyBgZGVmYXVsdFZhbHVlYCBpcyBhIENFTCB2YWx1ZSBlbnZlbG9wZSBldmFsdWF0ZWRcbiAgICAgICAgICAvLyBiZWZvcmUgdGhlIGRlc2NyaXB0b3IgZ29lcyBvbiB0aGUgd2lyZSwgc28gdGhlIGNsaWVudCByZWNlaXZlcyB0aGVcbiAgICAgICAgICAvLyB2YWx1ZSwgbmV2ZXIgdGhlIGVudmVsb3BlOiBib29sZWFuIGBmYWxzZWAsIHdoaWNoIGlzIHdoYXQgdGhlXG4gICAgICAgICAgLy8gMTcuMC4wIEdBIHRlbXBsYXRlIHdhcyBtZWFzdXJlZCB0byBzZW5kLiAoYHZpc2libGVXaGVuYCBiZWxvdyBpcyB0aGVcbiAgICAgICAgICAvLyBvcHBvc2l0ZSBjYXNlOiBmb3J3YXJkZWQgcmF3LCBuZXZlciBldmFsdWF0ZWQgb24gdGhlIHNlcnZlci4gU2FtZVxuICAgICAgICAgIC8vIG5vZGUsIHR3byBkaWZmZXJlbnQgZGlhbGVjdHMuKVxuICAgICAgICAgIHsgbmFtZTogJ2NyZWF0ZU9wcG9ydHVuaXR5JywgbGFiZWw6ICdDcmVhdGUgT3Bwb3J0dW5pdHk/JywgdHlwZTogJ2Jvb2xlYW4nLCBkZWZhdWx0VmFsdWU6IGNlbGBjcmVhdGVPcHBvcnR1bml0eWAgfSxcbiAgICAgICAgICAvLyBQUkVGSUxMRUQgRlJPTSBUSEUgTEVBRCAoUkVRLTAwMDUgYWNjZXB0YW5jZSAyKS4gQm90aCBkZWZhdWx0cyBhcmVcbiAgICAgICAgICAvLyBDRUwgZW52ZWxvcGVzIG92ZXIgYGxlYWRSZWNvcmRgLCB3aGljaCBgZ2V0X2xlYWRgIGJvdW5kIGJlZm9yZSB0aGlzXG4gICAgICAgICAgLy8gc2NyZWVuIHdhcyByZWFjaGVkIFx1MjAxNCB0aGUgZmV0Y2ggc2l0cyBBSEVBRCBvZiB0aGUgc2NyZWVuIGZvciB0aGVcbiAgICAgICAgICAvLyBkdXBsaWNhdGUgd2FybmluZywgYW5kIHRoZXNlIHR3byByaWRlIHRoZSBzYW1lIG9yZGVyaW5nLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gXHUyNkEwXHVGRTBGIEVhY2ggZW52ZWxvcGUgaXMgZXZhbHVhdGVkIGJlZm9yZSB0aGUgZGVzY3JpcHRvciBnb2VzIG9uIHRoZVxuICAgICAgICAgIC8vIHdpcmUsIHNvIGBlc3RpbWF0ZWRfYW1vdW50YCBhcnJpdmVzIGFzIGEgTlVNQkVSLiBgY29tcGFueWAgaXNcbiAgICAgICAgICAvLyByZXF1aXJlZCBvbiBhIGxlYWQ7IGBlc3RpbWF0ZWRfYW1vdW50YCBpcyBub3QsIHNvIGl0cyByZWFkIGlzXG4gICAgICAgICAgLy8gZ3VhcmRlZDogYSBsZWFkIHdpdGggbm8gZXN0aW1hdGUgaXMgc2VydmVkIGBudWxsYCB3aGVyZSAxNy54IHNlcnZlZFxuICAgICAgICAgIC8vIG5vdGhpbmcgKHRoZSBtaWdyYXRpb24gZW50cnk6IGEgZmllbGQncyBgZGVmYXVsdFZhbHVlYCBzZWVkcyB0aGVcbiAgICAgICAgICAvLyBmaWVsZCB3aXRoIG51bGwpLCBhbmQgYW4gQUJTRU5UIGNvbHVtbiBvbiBhIHNwYXJzZSBkYXRhc291cmNlIG5vXG4gICAgICAgICAgLy8gbG9uZ2VyIGZhaWxzIHRoZSBydW4gYXQgdGhpcyBzY3JlZW4uXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBcdTI2RDQgVGhlIGFtb3VudCBpcyBwcmVmaWxsZWQsIG5ldmVyIGNvcGllZCBzaWxlbnRseS4gYGVzdGltYXRlZF9hbW91bnRgXG4gICAgICAgICAgLy8gaXMgYSBwcmUtcXVhbGlmaWNhdGlvbiBndWVzcyBhbmQgYGNybV9vcHBvcnR1bml0eS5hbW91bnRgIGlzIGFcbiAgICAgICAgICAvLyBudW1iZXIgYSByZXAgZGVmZW5kcyBpbiBhIGZvcmVjYXN0OyBjb252ZXJzaW9uIGlzIHRoZSBtb21lbnQgYSBodW1hblxuICAgICAgICAgIC8vIHR1cm5zIG9uZSBpbnRvIHRoZSBvdGhlciwgc28gdGhlIGZpZ3VyZSBpcyBzaG93biBpbiBhbiBlZGl0YWJsZSBib3hcbiAgICAgICAgICAvLyBhbmQgdGhlIHJlcCBjb25maXJtcyBpdC4gV3JpdGluZyBpdCBzdHJhaWdodCBpbnRvXG4gICAgICAgICAgLy8gYGNyZWF0ZV9vcHBvcnR1bml0eWAgd291bGQgcHV0IGFuIHVucmV2aWV3ZWQgZXN0aW1hdGUgaW50byB0aGVcbiAgICAgICAgICAvLyBmb3JlY2FzdCBhbmQgbGVhdmUgdGhlIHR3byBmaWVsZHMgbG9va2luZyBsaWtlIGNvcGllcyBvZiBlYWNoIG90aGVyLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gYHJlcXVpcmVkYCBvbiB0aGUgYW1vdW50IG1pcnJvcnMgdGhlIGNvbHVtbiwgZm9yIHRoZSByZWFzb24gZ2l2ZW5cbiAgICAgICAgICAvLyBhdCBgY2xvc2VEYXRlYCBiZWxvdzogYGNybV9vcHBvcnR1bml0eS5hbW91bnRgIGlzIGByZXF1aXJlZGAgK1xuICAgICAgICAgIC8vIGBub3ROdWxsYCwgYW5kIHdpdGhvdXQgdGhpcyBhIHRpY2tlZCBib3ggd2l0aCBubyBhbW91bnQgcmVhY2hlZFxuICAgICAgICAgIC8vIGBjcmVhdGVfb3Bwb3J0dW5pdHlgIGFmdGVyIHRoZSBhY2NvdW50IGFuZCBjb250YWN0IHdlcmUgd3JpdHRlbixcbiAgICAgICAgICAvLyBsZWF2aW5nIHRoZSBsZWFkIGhhbGYtY29udmVydGVkICgjMjA2MCBpdGVtIDIpLiBWaXNpYmxlLW9ubHksIHNvXG4gICAgICAgICAgLy8gYW4gdW50aWNrZWQgYm94IHN0aWxsIGNvbnZlcnRzIHdpdGggbm8gYW1vdW50LlxuICAgICAgICAgIHsgbmFtZTogJ29wcG9ydHVuaXR5TmFtZScsIGxhYmVsOiAnT3Bwb3J0dW5pdHkgTmFtZScsIHR5cGU6ICd0ZXh0JywgcmVxdWlyZWQ6IHRydWUsIGRlZmF1bHRWYWx1ZTogY2VsYGxlYWRSZWNvcmQuY29tcGFueWAsIHZpc2libGVXaGVuOiAnY3JlYXRlT3Bwb3J0dW5pdHkgPT0gdHJ1ZScgfSxcbiAgICAgICAgICB7IG5hbWU6ICdvcHBvcnR1bml0eUFtb3VudCcsIGxhYmVsOiAnT3Bwb3J0dW5pdHkgQW1vdW50JywgdHlwZTogJ2N1cnJlbmN5JywgcmVxdWlyZWQ6IHRydWUsIGRlZmF1bHRWYWx1ZTogY2VsYGhhcyhsZWFkUmVjb3JkLmVzdGltYXRlZF9hbW91bnQpID8gbGVhZFJlY29yZC5lc3RpbWF0ZWRfYW1vdW50IDogbnVsbGAsIHZpc2libGVXaGVuOiAnY3JlYXRlT3Bwb3J0dW5pdHkgPT0gdHJ1ZScgfSxcbiAgICAgICAgICAvLyBUaGUgY2xvc2UgZGF0ZSwgREVGQVVMVEVEIEFORCBWSVNJQkxFLiBgY2xvc2VfZGF0ZWAgaXMgd2hhdCBmaWxlc1xuICAgICAgICAgIC8vIGFuIG9wcG9ydHVuaXR5IGludG8gYSBmb3JlY2FzdCBQRVJJT0QsIHNvIFx1MjZENCBuZXZlciBzdGFtcCBpdCBzaWxlbnRseVxuICAgICAgICAgIC8vIGluc2lkZSBgY3JlYXRlX29wcG9ydHVuaXR5YDogYSBoaWRkZW4gKzkwIGRheXMgZmlsZXMgZXZlcnkgY29udmVydGVkXG4gICAgICAgICAgLy8gZGVhbCBhIHF1YXJ0ZXIgb3V0IGFuZCBtb3ZlcyB0aGUgZm9yZWNhc3Qgd2hlcmUgbm9ib2R5IGNhbiBzZWUgaXQuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGUgKzkwIGlzIHdyaXR0ZW4gSEVSRSBhbmQgbm93aGVyZSBlbHNlLCBhbmQgaGVyZSB0aGUgbGF5ZXIgaXNcbiAgICAgICAgICAvLyBGT1JDRUQgcmF0aGVyIHRoYW4gcHJlZmVycmVkLiBBIHNjcmVlbiBmaWVsZCdzIGBkZWZhdWx0VmFsdWVgIGlzXG4gICAgICAgICAgLy8gZXZhbHVhdGVkIGJlZm9yZSB0aGUgZGVzY3JpcHRvciBnb2VzIG9uIHRoZSB3aXJlIGFuZCBhIGZsb3dcbiAgICAgICAgICAvLyB2YXJpYWJsZSdzIGRlZmF1bHQgaXMgYm91bmQgcmF3IChzZWUgdGhlIGRlY2xhcmF0aW9uIGFib3ZlKSwgc28gdGhpc1xuICAgICAgICAgIC8vIGlzIHRoZSBvbmx5IHBsYWNlIHRoZSBleHByZXNzaW9uIGNhbiBiZSB3cml0dGVuIGF0IGFsbC5cbiAgICAgICAgICAvLyBgaXNvRGF0ZShkYXlzRnJvbU5vdyg5MCkpYCB3cml0ZXMgdGhlIGBZWVlZLU1NLUREYCBzdHJpbmcgOTAgZGF5cyBvdXRcbiAgICAgICAgICAvLyBvbiB0aGUgVVRDIGNhbGVuZGFyIFx1MjAxNCB3aGF0IDE3LjMuMCdzIGB7VE9EQVkoKSArIDkwfWAgd2FzIG1lYXN1cmVkIHRvXG4gICAgICAgICAgLy8gc2VuZCBcdTIwMTQgYW5kIHRoZSB2YWx1ZSB0aGUgcmVwIHNlZXMgaXMgdGhlIHZhbHVlXG4gICAgICAgICAgLy8gYGNyZWF0ZV9vcHBvcnR1bml0eWAgd3JpdGVzLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gYHJlcXVpcmVkYCBtaXJyb3JzIHRoZSBjb2x1bW4gXHUyMDE0IGBjcm1fb3Bwb3J0dW5pdHkuY2xvc2VfZGF0ZWAgaXNcbiAgICAgICAgICAvLyBgcmVxdWlyZWRgICsgYG5vdE51bGxgIFx1MjAxNCBhbmQgaXQgaXMgd2hhdCBrZWVwcyB0aGUgcmVmdXNhbCBhdCB0aGVcbiAgICAgICAgICAvLyBTQ1JFRU4gYm91bmRhcnkuIE1lYXN1cmVkIGJvdGggd2F5cyBhZ2FpbnN0IGEgcmVhbCBPYmplY3RRTCBlbmdpbmU6XG4gICAgICAgICAgLy8gV0lUSE9VVCBpdCwgYSBzdWJtaXNzaW9uIGNhcnJ5aW5nIG5vIGRhdGUgcmVhY2hlc1xuICAgICAgICAgIC8vIGBjcmVhdGVfb3Bwb3J0dW5pdHlgIGFuZCBmYWlscyB0aGVyZSB3aXRoIGBDbG9zZSBEYXRlIGlzIHJlcXVpcmVkYCxcbiAgICAgICAgICAvLyBieSB3aGljaCBwb2ludCB0aGUgYWNjb3VudCBhbmQgdGhlIGNvbnRhY3QgaGF2ZSBhbHJlYWR5IGJlZW5cbiAgICAgICAgICAvLyB3cml0dGVuIGFuZCB0aGUgbGVhZCBpcyBsZWZ0IGhhbGYtY29udmVydGVkOyBXSVRIIGl0IHRoZSByZXN1bWUgaXNcbiAgICAgICAgICAvLyByZWZ1c2VkIGJlZm9yZSBhbnkgbm9kZSBydW5zLCBub3RoaW5nIGlzIHdyaXR0ZW4sIGFuZCB0aGUgbWVzc2FnZVxuICAgICAgICAgIC8vIG5hbWVzIHRoZSBmaWVsZC4gVGhhdCBwYXRoIGlzIG5vdCBoeXBvdGhldGljYWwgXHUyMDE0IGEgcmVwIHdobyBDTEVBUlNcbiAgICAgICAgICAvLyB0aGUgcHJlZmlsbGVkIGRhdGUgcG9zdHMgdGhlIGtleSBlbXB0eSwgYW5kIGBpc1ByZXNlbnQoJycpYCBpc1xuICAgICAgICAgIC8vIGZhbHNlLiBBIGhpZGRlbiBgcmVxdWlyZWRgIG5ldmVyIGZpcmVzOiB0aGUgc2VydmVyIGNvbnRyYWN0IHNraXBzIGl0XG4gICAgICAgICAgLy8gd2hlbiBgdmlzaWJsZVdoZW5gIGV2YWx1YXRlcyBmYWxzZSwgYW5kIHNvIGRvZXMgdGhlIGNvbnNvbGUsIHdoaWNoXG4gICAgICAgICAgLy8gaXMgdGhlIHVudG91Y2hlZC1jaGVja2JveCBwYXRoIHRoaXMgc2NyZWVuIGhhcyBhbHdheXMgaGFkIHRvIGtlZXBcbiAgICAgICAgICAvLyB3b3JraW5nLlxuICAgICAgICAgIHsgbmFtZTogJ2Nsb3NlRGF0ZScsIGxhYmVsOiAnQ2xvc2UgRGF0ZScsIHR5cGU6ICdkYXRlJywgcmVxdWlyZWQ6IHRydWUsIGRlZmF1bHRWYWx1ZTogY2VsYGlzb0RhdGUoZGF5c0Zyb21Ob3coOTApKWAsIHZpc2libGVXaGVuOiAnY3JlYXRlT3Bwb3J0dW5pdHkgPT0gdHJ1ZScgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBcdTI2RDQgVGhpcyBmZXRjaCBtdXN0IHN0YXkgQUhFQUQgb2YgdGhlIHNjcmVlbjogdGhlIGR1cGxpY2F0ZSB3YXJuaW5nXG4gICAgICAvLyByZWFkcyBgbGVhZFJlY29yZGAsIGFuZCBhIHNjcmVlbiB0aGF0IHN1c3BlbmRzIGJlZm9yZSB0aGUgZmV0Y2ggaGFzXG4gICAgICAvLyBub3RoaW5nIHRvIHJlYWQuIFRoZSBmZXRjaCBpdHNlbGYgbmV2ZXIgZGVwZW5kZWQgb24gdGhlIHNjcmVlbiBcdTIwMTRcbiAgICAgIC8vIGByZWNvcmRJZGAgaXMgYW4gaW5wdXQgdmFyaWFibGUsIHNlZWRlZCBiZWZvcmUgdGhlIHJ1biBzdGFydHMuXG4gICAgICBpZDogJ2dldF9sZWFkJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0dldCBMZWFkIFJlY29yZCcsXG4gICAgICBjb25maWc6IHsgb2JqZWN0TmFtZTogJ2NybV9sZWFkJywgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkSWRgIH0sIG91dHB1dFZhcmlhYmxlOiAnbGVhZFJlY29yZCcgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEJyYW5jaGluZyBpcyBvbiBlZGdlcyBgZTIxYCAvIGBlMjJgIC8gYGUyNWAgXHUyMDE0IHNlZSBgZGVjaXNpb25fYWNjb3VudGAuXG4gICAgICAvLyBUaHJlZSB3YXlzIG91dCwgYmVjYXVzZSBgZHVwbGljYXRlX3N0YXR1c2AgY2FycmllcyB0d28gZGlmZmVyZW50IEtJTkRTXG4gICAgICAvLyBvZiBmYWN0IGFuZCB0aGV5IGdldCBkaWZmZXJlbnQgYW5zd2VyczogdGhlIG1hY2hpbmUncyBgc3VzcGVjdGVkYCBndWVzc1xuICAgICAgLy8gd2FybnMgYW5kIGxldHMgdGhlIHJlcCBkZWNpZGUgKGBlMjFgKSwgYSBwZXJzb24ncyBgY29uZmlybWVkYCB2ZXJkaWN0XG4gICAgICAvLyByZWZ1c2VzIG91dHJpZ2h0IChgZTI1YCksIGFuZCBldmVyeXRoaW5nIGVsc2UgY29udmVydHMgc2lsZW50bHkgKGBlMjJgKS5cbiAgICAgIGlkOiAnZGVjaXNpb25fZHVwbGljYXRlJywgdHlwZTogJ2RlY2lzaW9uJywgbGFiZWw6ICdEdXBsaWNhdGUgVmVyZGljdD8nLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gVGhlIHdhcm5pbmcgbmFtZXMgdGhlIHJlY29yZCB0aGUgd2F5IHRoZSBVSSBuYW1lcyBhIHBlcnNvbiBcdTIwMTQgYnkgdGhlXG4gICAgICAvLyBlbWFpbCBhZGRyZXNzIHRoZSB0d28gcmVjb3JkcyBzaGFyZSBcdTIwMTQgYW5kIE5PVCBieVxuICAgICAgLy8gYGR1cGxpY2F0ZV9vZl9sZWFkYCAvIGBkdXBsaWNhdGVfb2ZfY29udGFjdGAsIHdoaWNoIGhvbGQgaWRzLiBUaGF0IGlzXG4gICAgICAvLyB0aGUgaG91c2UgcnVsZSBgdGVzdC9yZWNvcmQtaWQtbm90LWluLXByb3NlLnRlc3QudHNgIHN0YXRlcyBmb3IgZXZlcnlcbiAgICAgIC8vIHNlbnRlbmNlIGEgdXNlciByZWFkczogXCJ0aGUgaWQgZ29lcyBpbiB0aGUgcmVsYXRpb25zaGlwIGZpZWxkIHRoYXRcbiAgICAgIC8vIGV4aXN0cyB0byBjYXJyeSBpdCwgb3Igbm93aGVyZVwiLiBUaGUgbGluayBpdHNlbGYgaXMgb24gdGhlIGxlYWQnc1xuICAgICAgLy8gcmVjb3JkIHBhZ2UgKGBsZWFkX2RldGFpbC5wYWdlLnRzYCksIHdoZXJlIGl0IGNhbiBiZSBjbGlja2VkLlxuICAgICAgLy9cbiAgICAgIC8vIFwiZmxhZ2dlZCBhdCBpbnRha2VcIiBpcyB0aGUgYXBwJ3Mgb3duIHB1Ymxpc2hlZCBkZWZpbml0aW9uIG9mIHRoaXNcbiAgICAgIC8vIHZhbHVlLCBub3QgYSBndWVzcyBhYm91dCBwcm92ZW5hbmNlOiBgZHVwbGljYXRlX3N0YXR1c2AncyBoZWxwIHRleHRcbiAgICAgIC8vIHJlYWRzIFwiU3VzcGVjdGVkID0gZmxhZ2dlZCBhdXRvbWF0aWNhbGx5IGF0IGludGFrZVwiIGluIGFsbCBmb3VyXG4gICAgICAvLyBsb2NhbGVzLCBhbmQgYGxlYWRfZHVwbGljYXRlX2NoZWNrYCBpcyBpbnNlcnQtb25seSBieSBkZXNpZ24uXG4gICAgICAvL1xuICAgICAgLy8gVGhpcyB3YXJuaW5nJ3MgVEVYVCBpcyBFbmdsaXNoLW9ubHk6IGl0IGlzIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLFxuICAgICAgLy8gYW5kIG5vIGxvY2FsZSBwYWNrIHJlYWNoZXMgYSB2YXJpYWJsZSBcdTIwMTQgdGhlIHNjcmVlbidzIHRyYW5zbGF0ZWRcbiAgICAgIC8vIGBkZXNjcmlwdGlvbmAgY2FuIG9ubHkgY2FycnkgdGhlIGB7e2R1cGxpY2F0ZVdhcm5pbmd9fWAgaG9sZSB0aGF0XG4gICAgICAvLyBzaG93cyBpdC4gVGhlIHNjcmVlbnMnIG93biBoZWFkaW5ncyBhbmQgYm9kaWVzIGFyZSBrZXllZCBpbiB0aGUgcGFja3NcbiAgICAgIC8vIChgZmxvd3MubGVhZF9jb252ZXJzaW9uYCBpbiBgc3JjL3NhbGVzL3RyYW5zbGF0aW9ucy88bG9jYWxlPi9hcHAudHNgKSxcbiAgICAgIC8vIGFuZCB0aGUgYmFubmVyIG9uIHRoZSByZWNvcmQgcGFnZSBjYXJyaWVzIHRoZSB3YXJuaW5nIGluIGFsbCBmb3VyLlxuICAgICAgaWQ6ICd3YXJuX2R1cGxpY2F0ZScsIHR5cGU6ICdhc3NpZ25tZW50JywgbGFiZWw6ICdDb21wb3NlIER1cGxpY2F0ZSBXYXJuaW5nJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBhc3NpZ25tZW50czoge1xuICAgICAgICAgIGR1cGxpY2F0ZVdhcm5pbmc6XG4gICAgICAgICAgICBjZWxgJ1N1c3BlY3RlZCBkdXBsaWNhdGUgXHUyMDE0IGludGFrZSBmbGFnZ2VkIHRoaXMgbGVhZCBhcyByZXBlYXRpbmcgYW4gZXhpc3RpbmcgcmVjb3JkIHdpdGggdGhpcyBlbWFpbCBhZGRyZXNzICgnICsgbGVhZFJlY29yZC5lbWFpbCArICcpLiBDb252ZXJ0aW5nIGNyZWF0ZXMgYSBzZWNvbmQgYWNjb3VudCwgY29udGFjdCBhbmQgb3Bwb3J0dW5pdHkgZm9yIHRoZSBzYW1lIGJ1eWVyOyBjb21wYXJlIHRoZSBsaW5rZWQgcmVjb3JkIG9uIHRoZSBsZWFkIHBhZ2UgYmVmb3JlIHlvdSBjb250aW51ZS4nYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBUaGUgb3RoZXIgYnJhbmNoIGFzc2lnbnMgYG51bGxgLCB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSB3YXJuaW5nXG4gICAgICAvLyBDT05ESVRJT05BTDogdGhlIGRlc2NyaXB0aW9uIGhvbGUgcmVuZGVycyBpdCBhcyBubyBkZXNjcmlwdGlvbiBhdFxuICAgICAgLy8gYWxsIChzZWUgYHNjcmVlbl8xYCkuIFNhbWUgc2hhcGUgYXMgYG5vX29wcG9ydHVuaXR5YCBiZWxvdyBcdTIwMTQgYm90aCBicmFuY2hlc1xuICAgICAgLy8gd3JpdGUgdGhlIHZhcmlhYmxlIHNvIG5vIGRvd25zdHJlYW0gcmVhZCBldmVyIG1lZXRzIGFuIHVuc2V0IG9uZS5cbiAgICAgIGlkOiAnbm9fZHVwbGljYXRlX3dhcm5pbmcnLCB0eXBlOiAnYXNzaWdubWVudCcsIGxhYmVsOiAnTm8gRHVwbGljYXRlIFdhcm5pbmcnLFxuICAgICAgY29uZmlnOiB7IGFzc2lnbm1lbnRzOiB7IGR1cGxpY2F0ZVdhcm5pbmc6IG51bGwgfSB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gVGhlIFJFRlVTQUwuIEEgYGNvbmZpcm1lZGAgZHVwbGljYXRlIGlzIGEgcGVyc29uJ3MgdmVyZGljdCwgYW5kIHRoZSBhcHBcbiAgICAgIC8vIHN0b3BzIGNvbnZlcnRpbmcgb24gaXQgXHUyMDE0IHRoZSBydWxlIEFHRU5UUy5tZCBzdGF0ZXMgYXMgXCJpbnRlcmNlcHRpb25cbiAgICAgIC8vIHN0YW5kcyBvbiBhIHBlcnNvbidzIGp1ZGdlbWVudFwiLiBgc3VzcGVjdGVkYCBrZWVwcyB0aGUgd2Fybi1hbmQtYWxsb3dcbiAgICAgIC8vIGFib3ZlOiBhIG1hY2hpbmUncyBndWVzcyBzdGF5cyBhZHZpc29yeSwgYmVjYXVzZSBgbGVhZF9kdXBsaWNhdGVfY2hlY2tgXG4gICAgICAvLyBtYXRjaGVzIG9uIGVtYWlsIEVRVUFMSVRZIGFuZCBhIHNoYXJlZCBpbmJveCAoYGluZm9AYCwgYSBzd2l0Y2hib2FyZFxuICAgICAgLy8gYWRkcmVzcykgZmFsc2UtcG9zaXRpdmVzIGJ5IGNvbnN0cnVjdGlvbi4gXHUyNkQ0IERvIG5vdCBibG9jayBvbiB0aGUgZ3Vlc3MgXHUyMDE0XG4gICAgICAvLyBpdCB3b3VsZCBuZWVkIGFuIG92ZXJyaWRlIGZsYWcgdG8gc3RheSB1c2FibGUsIGFuZCBhbiBvdmVycmlkZSBmbGFnIGlzXG4gICAgICAvLyB0aGUgb25lIHNoYXBlIHRoaXMgZXhoaWJpdCBtdXN0IG5vdCBkZW1vbnN0cmF0ZS5cbiAgICAgIC8vXG4gICAgICAvLyAjIyBXaHkgdGhlIHJlZnVzYWwgaXMgSEVSRSBhbmQgbm90IG9uIGBjb252ZXJ0X2xlYWRgJ3MgcHJlZGljYXRlXG4gICAgICAvL1xuICAgICAgLy8gQSByZWZ1c2FsIG11c3QgTkFNRSB0aGUgdmVyZGljdCBhbmQgdGhlIHN1cnZpdmluZyByZWNvcmQsIGFuZCBtZWFzdXJlZFxuICAgICAgLy8gYWdhaW5zdCBgQG9iamVjdHN0YWNrL3NwZWNgIDE3LjIuMCB0aGUgYWN0aW9uIHByZWRpY2F0ZXMgY2Fubm90OlxuICAgICAgLy8gYHZpc2libGVgIGFuZCBgZGlzYWJsZWRgIGFyZSBlYWNoIGEgYmFyZSBib29sZWFuL0NFTCBlbnZlbG9wZSB3aXRoXG4gICAgICAvLyBub3doZXJlIHRvIHB1dCBhIHNlbnRlbmNlLCBzbyBgdmlzaWJsZWAgaGlkZXMgYSBidXR0b24gdGhhdCBjYW5ub3QgdGhlblxuICAgICAgLy8gZXhwbGFpbiBpdHNlbGYgYW5kIGBkaXNhYmxlZGAgZ3JleXMgb25lIG91dCB3aXRoIG5vIHJlYXNvbiBhdHRhY2hlZC5cbiAgICAgIC8vIGBlcnJvck1lc3NhZ2VgIG9uIHRoZSBBY3Rpb24gaXMgYSBzaW5nbGUgc3RhdGljIHN0cmluZyBcdTIwMTQgd2hhdCB0aGVcbiAgICAgIC8vIGNvbnNvbGUgdG9hc3RzIG9uIGEgRkFJTEVEIHJ1biBcdTIwMTQgYW5kIGNhbm5vdCBzYXkgYW55dGhpbmcgYWJvdXQgVEhJU1xuICAgICAgLy8gbGVhZC4gQSBzY3JlZW4gbm9kZSdzIGBkZXNjcmlwdGlvbmAgaXMgYSB0ZXh0IHNsb3QgcmVuZGVyZWQgcGVyIHJ1blxuICAgICAgLy8gYW5kIHNob3duIGJ5IGBGbG93UnVubmVyYCBhcyB0aGUgZGlhbG9nIGJvZHkuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIGZsb3cgaXMgYWxzbyB0aGUgb25seSBjaG9rZSBwb2ludCBjb3ZlcmluZyBldmVyeSBkb29yOiB0aGVcbiAgICAgIC8vIHJlY29yZC1oZWFkZXIgYnV0dG9uLCB0aGUgbGlzdC1yb3cgYnV0dG9uIGFuZCB0aGUgYGFjdGlvbl9jb252ZXJ0X2xlYWRgXG4gICAgICAvLyBBSSB0b29sIGFsbCBkaXNwYXRjaCBgUE9TVCAvYXV0b21hdGlvbi9sZWFkX2NvbnZlcnNpb24vdHJpZ2dlcmAsIHdoaWxlXG4gICAgICAvLyBgdmlzaWJsZWAgLyBgZGlzYWJsZWRgIGFyZSBjb25zb2xlLXNpZGUgYW5kIHNheSBub3RoaW5nIHRvIHRoZSBvdGhlclxuICAgICAgLy8gdHdvLlxuICAgICAgLy9cbiAgICAgIC8vICMjIFdoYXQgdGhlIHJlcCBzZWVzLCBtZWFzdXJlZCBvbiB0aGUgc2hpcHBlZCBjb25zb2xlIGJ1bmRsZVxuICAgICAgLy9cbiAgICAgIC8vIEEgcnVuIHRoYXQgUEFVU0VTIHJldHVybnMgYHsgc3VjY2VzczogdHJ1ZSwgc2lsZW50OiB0cnVlIH1gIHRvIHRoZVxuICAgICAgLy8gYWN0aW9uIGZyYW1ld29yayAoYFJlY29yZERldGFpbFZpZXdgJ3MgZmxvdyBoYW5kbGVyKSwgYW5kIGBzaWxlbnRgXG4gICAgICAvLyBzdXBwcmVzc2VzIHRoZSBzdWNjZXNzIHRvYXN0IFx1MjAxNCBzbyBgY29udmVydF9sZWFkYCdzXG4gICAgICAvLyBgc3VjY2Vzc01lc3NhZ2U6ICdMZWFkIGNvbnZlcnRlZCBzdWNjZXNzZnVsbHkhJ2AgZG9lcyBOT1QgZmlyZSBiZWhpbmRcbiAgICAgIC8vIHRoaXMgZGlhbG9nLiBTdWJtaXR0aW5nIGl0IHJlc3VtZXMgaW50byBgZW5kYDsgbm90aGluZyBpcyBjcmVhdGVkIGFuZFxuICAgICAgLy8gdGhlIGxlYWQgaXMgdW50b3VjaGVkIG9uIGVpdGhlciBwYXRoLCBiZWNhdXNlIGV2ZXJ5IHdyaXRlIGluIHRoaXMgZmxvd1xuICAgICAgLy8gaXMgZG93bnN0cmVhbSBvZiBgc2NyZWVuXzFgLlxuICAgICAgLy9cbiAgICAgIC8vICMjIFdoYXQgdGhlIGNvcHkgbWF5IGNsYWltXG4gICAgICAvL1xuICAgICAgLy8gXHUyNkQ0IE5PVCB0aGUgc2hhcmVkIGVtYWlsIGFkZHJlc3MsIHdoaWNoIGlzIHdoYXQgYHdhcm5fZHVwbGljYXRlYCBhYm92ZVxuICAgICAgLy8gdXNlcy4gVGhhdCBjbGFpbSBpcyBzYWZlIGZvciBgc3VzcGVjdGVkYCBiZWNhdXNlIG9ubHlcbiAgICAgIC8vIGBsZWFkX2R1cGxpY2F0ZV9jaGVja2Agd3JpdGVzIGl0IGFuZCBpdCBtYXRjaGVzIG9uIGVtYWlsOyBgY29uZmlybWVkYFxuICAgICAgLy8gaXMgd3JpdHRlbiBieSBhIFBFUlNPTiwgYW5kIHRoZSBsZWFkIGZvcm0gbGV0cyBhIHJldmlld2VyIHBvaW50XG4gICAgICAvLyBgZHVwbGljYXRlX29mX3R5cGVgICsgaXRzIGxvb2t1cCBhdCBhbnkgcmVjb3JkIHRoZXkgbGlrZS4gU28gdGhlXG4gICAgICAvLyByZWZ1c2FsIG5hbWVzIHRoZSBzdXJ2aXZvciB0aHJvdWdoIHRoZSByZWxhdGlvbnNoaXAgZmllbGRzIHRoYXQgZXhpc3RcbiAgICAgIC8vIHRvIGNhcnJ5IGl0IChgdGVzdC9yZWNvcmQtaWQtbm90LWluLXByb3NlLnRlc3QudHNgOiBcInRoZSBpZCBnb2VzIGluIHRoZVxuICAgICAgLy8gcmVsYXRpb25zaGlwIGZpZWxkIHRoYXQgZXhpc3RzIHRvIGNhcnJ5IGl0LCBvciBub3doZXJlXCIpLCBuYW1pbmcgdGhlXG4gICAgICAvLyBgZHVwbGljYXRlc2AgZmllbGQgZ3JvdXAgYnkgaXRzIHNoaXBwZWQgbGFiZWwsIFwiRHVwbGljYXRlIE1hbmFnZW1lbnRcIi5cbiAgICAgIC8vIFRoYXQgc2VudGVuY2UgYWxzbyBzdGF5cyB0cnVlIG9uIHRoZSBgZXJhc2VkYCB0b21ic3RvbmUsIHdoZXJlIHRoZVxuICAgICAgLy8gdmVyZGljdCBzdXJ2aXZlcyBpdHMgcG9pbnRlciAoYGxlYWQuaG9vay50c2AsIGpvYiAxYykuXG4gICAgICAvL1xuICAgICAgLy8gXHUyNkQ0IE5ldmVyIHRyYW5zY3JpYmUgdGhlIHZvY2FidWxhcnkgb2YgYGR1cGxpY2F0ZV9vZl90eXBlYCBpbnRvIHRoaXNcbiAgICAgIC8vIHNlbnRlbmNlIChcImFuIGV4aXN0aW5nIExlYWRcIiAvIFwiYW4gZXhpc3RpbmcgQ29udGFjdFwiKS4gVGhvc2UgbGFiZWxzIGFyZVxuICAgICAgLy8gbG9jYWxlLXBhY2sgZmFjdHMgd2l0aCBvbmUgc291cmNlIG9mIHRydXRoLCB0aGUgcmVwIGNhbiBzZWUgdGhlbSBvbiB0aGVcbiAgICAgIC8vIHNlY3Rpb24gdGhpcyBsaW5lIHBvaW50cyBhdCwgYW5kIGEgaGFuZC1jb3BpZWQgbWFjaGluZSBsaXN0IGluIHByb3NlIGlzXG4gICAgICAvLyB0aGUgZHJpZnQgQUdFTlRTLm1kIGRvY3VtZW50YXRpb24gcnVsZSA1IGZvcmJpZHMuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHRpdGxlIGFuZCB0aGUgYm9keSBhcmUgdHJhbnNsYXRlZCBpbiB0aGUgcGFja3NcbiAgICAgIC8vIChgZmxvd3MubGVhZF9jb252ZXJzaW9uLnNjcmVlbnMucmVmdXNlX2NvbmZpcm1lZF9kdXBsaWNhdGVgKS5cbiAgICAgIGlkOiAncmVmdXNlX2NvbmZpcm1lZF9kdXBsaWNhdGUnLCB0eXBlOiAnc2NyZWVuJywgbGFiZWw6ICdDb252ZXJzaW9uIFJlZnVzZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHRpdGxlOiAnQ29udmVyc2lvbiByZWZ1c2VkJyxcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJUaGlzIGxlYWQncyBEdXBsaWNhdGUgU3RhdHVzIGlzIENvbmZpcm1lZDogYSByZXZpZXdlciBjb21wYXJlZCBpdCBhZ2FpbnN0IGFuIGV4aXN0aW5nIHJlY29yZCBhbmQgcmVjb3JkZWQgdGhhdCBpdCByZXBlYXRzIG9uZS4gQ29udmVydGluZyB3b3VsZCBjcmVhdGUgYSBzZWNvbmQgYWNjb3VudCwgY29udGFjdCBhbmQgb3Bwb3J0dW5pdHkgZm9yIHRoZSBzYW1lIGJ1eWVyLiBUaGUgRHVwbGljYXRlIE1hbmFnZW1lbnQgc2VjdGlvbiBvbiB0aGlzIGxlYWQgbmFtZXMgdGhlIHN1cnZpdmluZyByZWNvcmQ7IGRpc3F1YWxpZnkgdGhpcyBsZWFkIGFzIGEgZHVwbGljYXRlIGluc3RlYWQuIE9ubHkgYSByZXZpZXdlciByZXZpc2luZyB0aGF0IHZlcmRpY3QgcmVvcGVucyBjb252ZXJzaW9uLlwiLFxuICAgICAgICAvLyBBIG1lc3NhZ2Utb25seSBzY3JlZW46IG5vIGZpZWxkcywgc28gdGhlIHBhdXNlIGhhcyB0byBiZSBhc2tlZCBmb3IuXG4gICAgICAgIC8vIGB3YWl0Rm9ySW5wdXRgIGlzIHdoYXQgdHVybnMgYSBmaWVsZC1sZXNzIHNjcmVlbiBmcm9tIGEgc2VydmVyLXNpZGVcbiAgICAgICAgLy8gcGFzcy10aHJvdWdoIGludG8gdGhlIGRpYWxvZyB0aGUgcmVwIHJlYWRzICh0aGUgZXhlY3V0b3Inc1xuICAgICAgICAvLyBgc2hvdWxkUGF1c2VgKSwgYW5kIHdpdGhvdXQgaXQgdGhpcyBub2RlIHdvdWxkIGZhbGwgdGhyb3VnaCB0byBgZW5kYFxuICAgICAgICAvLyBpbiBzaWxlbmNlIFx1MjAxNCBhIHJlZnVzYWwgbm9ib2R5IGlzIHRvbGQgYWJvdXQuXG4gICAgICAgIHdhaXRGb3JJbnB1dDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBCcmFuY2hpbmcgaXMgb24gZWRnZXMgYGUyOGAgLyBgZTI5YCBcdTIwMTQgc2VlIGBkZWNpc2lvbl9hY2NvdW50YC5cbiAgICAgIGlkOiAnZGVjaXNpb25fYXBwcm92YWwnLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0FwcHJvdmVkIGZvciBDb252ZXJzaW9uPycsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBUaGUgYXBwcm92YWwgZ2F0ZSwgb24gdGhlIHN1cmZhY2UgYSBSRVNUIGNhbGxlciByZWFjaGVzIChSRVEtMDAwNVxuICAgICAgLy8gYWNjZXB0YW5jZSAzKS4gYGNvbnZlcnRfbGVhZGAncyBgdmlzaWJsZWAgcHJlZGljYXRlIGhpZGVzIHRoZSBidXR0b24gYW5kXG4gICAgICAvLyBgbGVhZC5ob29rLnRzYCByZWZ1c2VzIHRoZSB3cml0ZSwgYnV0IHRoaXMgZmxvdyBoYXMgaXRzIG93biBkb29yIFx1MjAxNFxuICAgICAgLy8gYFBPU1QgL2F1dG9tYXRpb24vbGVhZF9jb252ZXJzaW9uL3RyaWdnZXJgIFx1MjAxNCBhbmQgd2l0aG91dCB0aGlzIGJyYW5jaCBhXG4gICAgICAvLyBjYWxsZXIgdGhyb3VnaCB0aGF0IGRvb3Igd291bGQgcnVuIHRoZSB3aG9sZSBjb252ZXJzaW9uIGFuZCBvbmx5IGJlXG4gICAgICAvLyByZWZ1c2VkIGF0IGBtYXJrX2NvbnZlcnRlZGAsIGJ5IHdoaWNoIHBvaW50IHRoZSBhY2NvdW50LCB0aGUgY29udGFjdCBhbmRcbiAgICAgIC8vIHRoZSBvcHBvcnR1bml0eSBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuIGFuZCB0aGUgbGVhZCBpcyBsZWZ0XG4gICAgICAvLyBoYWxmLWNvbnZlcnRlZC4gUmVmdXNpbmcgSEVSRSwgYWhlYWQgb2YgYHNjcmVlbl8xYCwgaXMgd2hhdCBtYWtlcyB0aGVcbiAgICAgIC8vIGdhdGUgd2hvbGU6IGV2ZXJ5IGNyZWF0ZSBhbmQgdXBkYXRlIGluIHRoaXMgZmxvdyBzaXRzIGJlaGluZCB0aGF0XG4gICAgICAvLyBzY3JlZW4sIGFuZCB0aGlzIHBhdGggbmV2ZXIgcmVhY2hlcyBpdC5cbiAgICAgIGlkOiAncmVmdXNlX3VuYXBwcm92ZWQnLCB0eXBlOiAnc2NyZWVuJywgbGFiZWw6ICdDb252ZXJzaW9uIFJlZnVzZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHRpdGxlOiAnQ29udmVyc2lvbiByZWZ1c2VkJyxcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgXCJUaGlzIGxlYWQgaGFzIG5vdCBiZWVuIGFwcHJvdmVkIGZvciBjb252ZXJzaW9uLiBBbiBhcHByb3ZlciBoYXMgdG8gc2lnbiBpdCBvZmYgYmVmb3JlIGl0IGNhbiBiZWNvbWUgYW4gYWNjb3VudCwgY29udGFjdCBhbmQgb3Bwb3J0dW5pdHk7IHRoZSBDb252ZXJzaW9uIEFwcHJvdmFsIGZpZWxkIG9uIHRoZSBsZWFkIHNob3dzIHdoZXRoZXIgdGhlIGRlY2lzaW9uIGlzIHN0aWxsIHBlbmRpbmcgb3Igd2FzIHJlZnVzZWQuIEtlZXAgd29ya2luZyB0aGUgbGVhZCBpbiB0aGUgbWVhbnRpbWUgXHUyMDE0IG5vdGhpbmcgYWJvdXQgaXQgaXMgZnJvemVuLlwiLFxuICAgICAgICAvLyBGaWVsZC1sZXNzIHNjcmVlbjogYHdhaXRGb3JJbnB1dGAgaXMgd2hhdCB0dXJucyBpdCBmcm9tIGEgc2VydmVyLXNpZGVcbiAgICAgICAgLy8gcGFzcy10aHJvdWdoIGludG8gdGhlIGRpYWxvZyB0aGUgcmVwIHJlYWRzLiBTZWVcbiAgICAgICAgLy8gYHJlZnVzZV9jb25maXJtZWRfZHVwbGljYXRlYCBmb3IgdGhlIG1lY2hhbmlzbS5cbiAgICAgICAgd2FpdEZvcklucHV0OiB0cnVlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEJyYW5jaGluZyBpcyBvbiBlZGdlcyBgZTMxYCAvIGBlMzJgIFx1MjAxNCBzZWUgYGRlY2lzaW9uX2FjY291bnRgLiBUaGVcbiAgICAgIC8vIG1hdGNoLWtleSBndWFyZCBzaXRzIGJldHdlZW4gdGhlIGR1cGxpY2F0ZSB2ZXJkaWN0IGFuZCBgc2NyZWVuXzFgLCBzb1xuICAgICAgLy8gaXQgZG9taW5hdGVzIGBmaW5kX2FjY291bnRgIGFuZCBhIGtleS1sZXNzIGxlYWQgaXMgcmVmdXNlZCBiZWZvcmUgdGhlXG4gICAgICAvLyByZXAgZmlsbHMgaW4gdGhlIGZvcm0gYW5kIGJlZm9yZSBhbnkgd3JpdGUuIEl0IGlzIHRoZSBMQVNUIG9mIHRoZVxuICAgICAgLy8gdGhyZWUgcmVmdXNhbHMgb24gcHVycG9zZTogYW4gdW5hcHByb3ZlZCBsZWFkIG9yIGEgY29uZmlybWVkIGR1cGxpY2F0ZVxuICAgICAgLy8gaXMgdG9sZCB0aGF0IHZlcmRpY3QgZmlyc3QsIGFuZCBhIG1pc3Npbmcga2V5IGlzIGEgcmVwYWlyYWJsZSBkYXRhXG4gICAgICAvLyBnYXAgcmF0aGVyIHRoYW4gYSB2ZXJkaWN0LlxuICAgICAgaWQ6ICdkZWNpc2lvbl9tYXRjaF9rZXknLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0NvbXBhbnkgTWF0Y2ggS2V5PycsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBUaGUgS0VZLUxFU1MgcmVmdXNhbCAoIzIwMTcpLiBXaHkgYGZpbmRfYWNjb3VudGAgbXVzdCBub3QgcnVuIHdpdGhvdXRcbiAgICAgIC8vIGEga2V5IGlzIHJlY29yZGVkIG9uIHRoYXQgbm9kZTsgdGhpcyBpcyB3aGF0IHRoZSByZXAgcmVhZHMgaW5zdGVhZC5cbiAgICAgIC8vXG4gICAgICAvLyBBIHJlZnVzYWwsIG5vdCBhIG5ldyBhY2NvdW50LCBhbmQgdGhhdCBpcyB0aGUgZmxvdydzIG93biBzdGF0ZWQgaW50ZW50XG4gICAgICAvLyByYXRoZXIgdGhhbiBhIGZyZXNoIGNob2ljZTogYSBjb252ZXJzaW9uIHRoYXQgc3RvcHMgaXMgZmFyIGNoZWFwZXIgdG9cbiAgICAgIC8vIGRpYWdub3NlIHRoYW4gb25lIHRoYXQgcXVpZXRseSBhdHRhY2hlcyB0byB0aGUgd3JvbmcgYWNjb3VudCBvclxuICAgICAgLy8gY3JlYXRlcyBhIGR1cGxpY2F0ZSBvbmUsIGFuZCBgc2NyZWVuXzFgIG9mZmVycyB0aGUgcmVwIG5vIGFjY291bnRcbiAgICAgIC8vIGNob2ljZSB0aGF0IGNvdWxkIGNvbmZpcm0gYSBtYXRjaCBieSBoYW5kLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBjb3B5IGNsYWltcyBvbmx5IHdoYXQgaG9sZHMgb24gZXZlcnkgcGF0aCBpbnRvIGl0OiB0aGUga2V5IGlzXG4gICAgICAvLyBkZXJpdmVkIGZyb20gYGNvbXBhbnlgIG9uIGV2ZXJ5IHdyaXRlIHRoYXQgY2FycmllcyBpdFxuICAgICAgLy8gKGBsZWFkX2R1cGxpY2F0ZV9jaGVja2ApLCBhbmQgbm90aGluZyBoYXMgYmVlbiB3cml0dGVuLCBiZWNhdXNlIGV2ZXJ5XG4gICAgICAvLyBjcmVhdGUgYW5kIHVwZGF0ZSBpbiB0aGlzIGZsb3cgc2l0cyBiZWhpbmQgYHNjcmVlbl8xYC4gSXRzIHRpdGxlIGFuZFxuICAgICAgLy8gYm9keSBhcmUgdHJhbnNsYXRlZCBpbiB0aGUgcGFja3MsIGxpa2UgdGhlIG90aGVyIHR3byByZWZ1c2Fscy5cbiAgICAgIC8vXG4gICAgICAvLyBGaWVsZC1sZXNzIHNjcmVlbjogYHdhaXRGb3JJbnB1dGAgaXMgd2hhdCB0dXJucyBpdCBmcm9tIGEgc2VydmVyLXNpZGVcbiAgICAgIC8vIHBhc3MtdGhyb3VnaCBpbnRvIHRoZSBkaWFsb2cgdGhlIHJlcCByZWFkcy4gU2VlXG4gICAgICAvLyBgcmVmdXNlX2NvbmZpcm1lZF9kdXBsaWNhdGVgIGZvciB0aGUgbWVjaGFuaXNtLlxuICAgICAgaWQ6ICdyZWZ1c2Vfbm9fbWF0Y2hfa2V5JywgdHlwZTogJ3NjcmVlbicsIGxhYmVsOiAnQ29udmVyc2lvbiBSZWZ1c2VkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICB0aXRsZTogJ0NvbnZlcnNpb24gcmVmdXNlZCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIFwiVGhpcyBsZWFkJ3MgY29tcGFueSBoYXMgbm8gbWF0Y2gga2V5LCBzbyBjb252ZXJzaW9uIGNhbm5vdCB0ZWxsIHdoaWNoIGFjY291bnQgaXQgYmVsb25ncyB0bywgYW5kIGl0IHdpbGwgbm90IGd1ZXNzOiBhIGd1ZXNzIGNvdWxkIGZpbGUgdGhlIGNvbnRhY3QgYW5kIG9wcG9ydHVuaXR5IHVuZGVyIGFub3RoZXIgY3VzdG9tZXIuIFNhdmluZyB0aGUgbGVhZCdzIENvbXBhbnkgcmVidWlsZHMgdGhlIGtleSwgc28gc2F2ZSBpdCBhZ2FpbiwgdGhlbiBjb252ZXJ0LiBOb3RoaW5nIGhhcyBiZWVuIGNyZWF0ZWQuXCIsXG4gICAgICAgIHdhaXRGb3JJbnB1dDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBBY2NvdW50IGRlZHVwZTogbWF0Y2ggb24gdGhlIE5PUk1BTElaRUQgY29tcGFueSBuYW1lLCBuZXZlciBvbiB0aGUgcmF3XG4gICAgICAvLyBvbmUgXHUyMDE0IFwiQWNtZSBDb3JwXCIgYW5kIFwiQUNNRSAgQ29ycFwiIGFyZSB0aGUgc2FtZSBhY2NvdW50LlxuICAgICAgLy9cbiAgICAgIC8vIEJvdGggc2lkZXMgb2YgdGhpcyBjb21wYXJpc29uIGFyZSBzdG9yZWQsIGhvb2stbWFpbnRhaW5lZCBjb2x1bW5zLCBhbmRcbiAgICAgIC8vIG9uIDE3LnggdGhhdCB3YXMgZm9yY2VkIHJhdGhlciB0aGFuIGNob3NlbjogYSBmbG93IHRlbXBsYXRlIGNvdWxkIG5vdFxuICAgICAgLy8gbm9ybWFsaXplIEFOWVRISU5HLiBgc2VydmljZS1hdXRvbWF0aW9uYCdzIGByZXNvbHZlVG9rZW5gIHJlY29nbmlzZXMgZXhhY3RseSBvbmVcbiAgICAgIC8vIGZ1bmN0aW9uIGZvcm0gXHUyMDE0IGBOT1coKWAgLyBgVE9EQVkoKWAgXHUyMDE0IGFuZCBldmVyeSBiYXJlIGlkZW50aWZpZXIgaW4gdGhlXG4gICAgICAvLyBleHByZXNzaW9uIGZhbGxiYWNrIGlzIHN1YnN0aXR1dGVkIGJlZm9yZSBldmFsdWF0aW9uLCBzbyBubyBzdHJpbmdcbiAgICAgIC8vIG1ldGhvZCBpcyByZWFjaGFibGUgZWl0aGVyOiBge0xPV0VSKHgpfWAsIGB7VFJJTSh4KX1gIGFuZFxuICAgICAgLy8gYHt4LnRvTG93ZXJDYXNlKCl9YCBhbGwgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCwgYW5kIGFuIHVud3JhcHBlZFxuICAgICAgLy8gYExPV0VSKHt4fSlgIGludGVycG9sYXRlcyBsaXRlcmFsbHkgdG8gXCJMT1dFUihBY21lIENvcnApXCIuIEEgZm9ybXVsYVxuICAgICAgLy8gZmllbGQgaXMgbm8gaGVscCBlaXRoZXIgXHUyMDE0IGl0IGhhcyBubyBwaHlzaWNhbCBjb2x1bW4gdG8gZmlsdGVyIG9uLiBTb1xuICAgICAgLy8gdGhlIHByb2R1Y2VyIGNhbm9uaWNhbGl6ZXMgKGBhY2NvdW50X3Byb3RlY3Rpb25gLFxuICAgICAgLy8gYGxlYWRfZHVwbGljYXRlX2NoZWNrYCkgYW5kIHRoaXMgbm9kZSBkb2VzIGEgcGxhaW4sIGluZGV4ZWQgZXF1YWxpdHlcbiAgICAgIC8vIG1hdGNoLiBgdGVzdC9hY2NvdW50LW5hbWUtbm9ybWFsaXplZC1tYXRjaC50ZXN0LnRzYCByZS1tZWFzdXJlcyBhbGwgb2ZcbiAgICAgIC8vIHRoYXQgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgdGhpcyBwYXJhZ3JhcGguXG4gICAgICAvL1xuICAgICAgLy8gTm9ybWFsaXplLXRoZW4tRVhBQ1Qgb25seTogbG93ZXIgKyB0cmltICsgY29sbGFwc2UgaW50ZXJuYWxcbiAgICAgIC8vIHdoaXRlc3BhY2UuIEZ1enp5IG1hdGNoaW5nIHN0YXlzIG91dCBvZiBzY29wZS5cbiAgICAgIC8vXG4gICAgICAvLyBBIGxlYWQgd2l0aCBOTyBgY29tcGFueV9ub3JtYWxpemVkYCBuZXZlciByZWFjaGVzIHRoaXMgbm9kZTpcbiAgICAgIC8vIGBkZWNpc2lvbl9tYXRjaF9rZXlgLCBhaGVhZCBvZiBgc2NyZWVuXzFgLCByZWZ1c2VzIGl0IGZpcnN0LiBUaGUgbm9kZVxuICAgICAgLy8gY2Fubm90IGJlIGxlZnQgdG8gcmVmdXNlIG9uIGl0cyBvd24sIGJlY2F1c2UgXCJubyBrZXlcIiBhcnJpdmVzIGluIHR3b1xuICAgICAgLy8gc2hhcGVzIHRoYXQgYmVoYXZlIGRpZmZlcmVudGx5IChib3RoIG1lYXN1cmVkIG9uIDE3LjcuMCk6XG4gICAgICAvL1xuICAgICAgLy8gICBcdTAwQjcgQUJTRU5UIFx1MjAxNCBhIHNwYXJzZSBkYXRhc291cmNlIChgZHJpdmVyLW1lbW9yeWAgLyBgZHJpdmVyLW1vbmdvZGJgKVxuICAgICAgLy8gICAgIG9uIGEgcm93IG5ldmVyIHdyaXR0ZW4gd2l0aCB0aGUgY29sdW1uLiBUaGUgdG9rZW4gcmVzb2x2ZXMgdG9cbiAgICAgIC8vICAgICBub3RoaW5nIGFuZCBgZ2V0X3JlY29yZGAgcmVmdXNlcyB0byBydW4sIHNvIHRoZSBydW4gRkFJTFNcbiAgICAgIC8vICAgICAoYEZMT1dfRkFJTEVEYCwgXCJyZWZ1c2luZyB0byBydW4gXHUyMDE0IDEgZmlsdGVyIGNvbmRpdGlvbihzKSByZXNvbHZlZFxuICAgICAgLy8gICAgIHRvIG5vdGhpbmcgYW5kIHdlcmUgZHJvcHBlZCBmcm9tIHRoZSBxdWVyeSBcdTIwMjZcIikuXG4gICAgICAvLyAgIFx1MDBCNyBOVUxMIFx1MjAxNCBTUUwsIG9yIGFueSBkYXRhc291cmNlIG9uY2UgdGhlIGNvbHVtbiBpcyB3cml0dGVuIGVtcHR5LFxuICAgICAgLy8gICAgIHdoaWNoIGBsZWFkX2R1cGxpY2F0ZV9jaGVja2AgZG9lcyBvbiBwdXJwb3NlIGZvciBhIGNvbXBhbnkgdGhhdFxuICAgICAgLy8gICAgIGZvbGRzIHRvIG5vdGhpbmcuIFRoZSB0b2tlbiByZXNvbHZlcyB0byBgbnVsbGAsIGFuZCBhIGJhcmUgYG51bGxgXG4gICAgICAvLyAgICAgaW4gYSBmaWx0ZXIgaXMgdGhlIHBsYXRmb3JtJ3MgZG9jdW1lbnRlZCBIQVMtTk8tVkFMVUUgcHJlZGljYXRlXG4gICAgICAvLyAgICAgKGAkZXE6IG51bGxgLCBgQG9iamVjdHN0YWNrL3NwZWNgIGBkYXRhL2ZpbHRlci56b2QudHNgKS4gVGhpc1xuICAgICAgLy8gICAgIGxvb2t1cCB0aGVuIE1BVENIRVMgZXZlcnkgYWNjb3VudCB3aG9zZSBvd24ga2V5IGlzIG51bGwsIGFuZCB0aGVcbiAgICAgIC8vICAgICBsZWFkIGNvbnZlcnRzIG9udG8gYW4gdW5yZWxhdGVkIGN1c3RvbWVyJ3MgYWNjb3VudCAoIzIwMTcpLlxuICAgICAgLy9cbiAgICAgIC8vIEEga2V5LWxlc3MgbGVhZCBpcyBub3Qgb25seSBhIHJvdyB3cml0dGVuIGJlZm9yZSB0aGUgcHJvZHVjZXIgZXhpc3RlZFxuICAgICAgLy8gKHRoZSBiYWNrZmlsbCBpbiBkb2NzL01BSU5URU5BTkNFLm1kIFx1MDBBNzMuMyk6IGEgbm9uLXN0cmluZyBjb21wYW55XG4gICAgICAvLyB3cml0dGVuIHRocm91Z2ggdGhlIHJlY29yZCBBUEkgZm9sZHMgdG8gYG51bGxgIHRvby4gQSBjb252ZXJzaW9uIHRoYXRcbiAgICAgIC8vIHN0b3BzIGlzIGZhciBjaGVhcGVyIHRvIGRpYWdub3NlIHRoYW4gb25lIHRoYXQgcXVpZXRseSBhdHRhY2hlcyB0byB0aGVcbiAgICAgIC8vIHdyb25nIGFjY291bnQgb3IgY3JlYXRlcyBhIGR1cGxpY2F0ZSBvbmUsIHNvIHRoZSBhbnN3ZXIgaXMgdGhlXG4gICAgICAvLyByZWZ1c2FsIHRoZSByZXAgcmVhZHMgaW4gYHJlZnVzZV9ub19tYXRjaF9rZXlgLlxuICAgICAgLy9cbiAgICAgIC8vIFNpbmNlIDE4LjAuMC1uZXh0LjAgdGhlIG9wZXJhbmQgaXMgYSBDRUwgZW52ZWxvcGU6IGFuIGFic2VudCBrZXkgZmFpbHNcbiAgICAgIC8vIHRoZSBydW4gYmVmb3JlIHRoZSBxdWVyeSwgYW5kIGEgbnVsbCBvbmUgcmVmdXNlcyB0aGUgbm9kZSBpbnN0ZWFkIG9mXG4gICAgICAvLyBtYXRjaGluZyAodGhlIHBsYXRmb3JtJ3MgYGZsb3ctdmFsdWUtc2xvdC10ZW1wbGF0ZS1kaWFsZWN0LXJlZnVzZWRgXG4gICAgICAvLyBlbnRyeTsgbm90IHJlLW1lYXN1cmVkIGhlcmUpLiBOZWl0aGVyIHNoYXBlIGNvbnZlcnRzIG9udG8gYW5vdGhlclxuICAgICAgLy8gYWNjb3VudCBhbnkgbW9yZSwgYW5kIGBkZWNpc2lvbl9tYXRjaF9rZXlgIHN0aWxsIHJlZnVzZXMgZmlyc3QsIHdpdGhcbiAgICAgIC8vIGNvcHkgdGhlIHJlcCBjYW4gcmVhZC5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2RDQgTmV2ZXIgcGFwZXIgdGhpcyBvdmVyIHdpdGggYSBzZWNvbmQsIGNhc2Utc2Vuc2l0aXZlIGxvb2t1cCBvbiB0aGVcbiAgICAgIC8vIHJhdyBgbmFtZWA6IGEgbWlzc2luZyBrZXkgbWVhbnMgdGhlIHByb2R1Y2VyIGNvdWxkIG5vdCBkZXJpdmUgb25lLCBhbmRcbiAgICAgIC8vIGEgdG9sZXJhbnQgY29uc3VtZXIgcGF0aCB3b3VsZCBoaWRlIHRoYXQgd2hpbGUgcmVzdG9yaW5nIHRoZSBleGFjdCBidWdcbiAgICAgIC8vIHRoaXMgbm9kZSBleGlzdHMgdG8gZml4LlxuICAgICAgaWQ6ICdmaW5kX2FjY291bnQnLCB0eXBlOiAnZ2V0X3JlY29yZCcsIGxhYmVsOiAnRmluZCBFeGlzdGluZyBBY2NvdW50JyxcbiAgICAgIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX2FjY291bnQnLCBmaWx0ZXI6IHsgbmFtZV9ub3JtYWxpemVkOiBjZWxgbGVhZFJlY29yZC5jb21wYW55X25vcm1hbGl6ZWRgIH0sIG91dHB1dFZhcmlhYmxlOiAnbWF0Y2hlZEFjY291bnQnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBCcmFuY2hpbmcgaXMgb24gZWRnZXMgYGU1YCAvIGBlNmAuIE5vIGBjb25maWcuY29uZGl0aW9uYCBoZXJlOiBhXG4gICAgICAvLyBgZGVjaXNpb25gIG5vZGUncyBzaW5ndWxhciBvbmUgaXMgbmV2ZXIgZXZhbHVhdGVkLlxuICAgICAgaWQ6ICdkZWNpc2lvbl9hY2NvdW50JywgdHlwZTogJ2RlY2lzaW9uJywgbGFiZWw6ICdBY2NvdW50IEFscmVhZHkgRXhpc3RzPycsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBORVctYWNjb3VudCBicmFuY2guIG91dHB1dFZhcmlhYmxlIGlzIGBjcmVhdGVkQWNjb3VudGA7IHRoZSBhc3NpZ25tZW50XG4gICAgICAvLyBiZWxvdyBub3JtYWxpemVzIGJvdGggYnJhbmNoZXMgb250byBhIHNpbmdsZSBgYWNjb3VudElkYCBpZCBzdHJpbmcgc29cbiAgICAgIC8vIGRvd25zdHJlYW0gbm9kZXMgZG9uJ3QgbmVlZCB0byBrbm93IHdoaWNoIHBhdGggcmFuLlxuICAgICAgLy9cbiAgICAgIC8vIGBuYW1lYCBjYXJyaWVzIHRoZSBsZWFkJ3MgY29tcGFueSBWRVJCQVRJTSBcdTIwMTQgdGhlIGRpc3BsYXkgdmFsdWUuIFRoZVxuICAgICAgLy8gbWF0Y2gga2V5IGBuYW1lX25vcm1hbGl6ZWRgIGlzIGRlbGliZXJhdGVseSBhYnNlbnQ6IGl0IGlzIHJlYWRvbmx5IGFuZFxuICAgICAgLy8gaG9vay1vd25lZCwgYW5kIGBhY2NvdW50X3Byb3RlY3Rpb25gIGRlcml2ZXMgaXQgZnJvbSB0aGUgYG5hbWVgIHdyaXR0ZW5cbiAgICAgIC8vIGhlcmUsIHNvIGFuIGFjY291bnQgY3JlYXRlZCBieSB0aGlzIG5vZGUgaXMgaW1tZWRpYXRlbHkgZmluZGFibGUgYnkgdGhlXG4gICAgICAvLyBuZXh0IGNvbnZlcnNpb24uXG4gICAgICBpZDogJ2NyZWF0ZV9hY2NvdW50JywgdHlwZTogJ2NyZWF0ZV9yZWNvcmQnLCBsYWJlbDogJ0NyZWF0ZSBBY2NvdW50JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2FjY291bnQnLFxuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAvLyBgY29tcGFueWAgaXMgcmVxdWlyZWQgb24gYSBsZWFkOyBldmVyeSBvdGhlciBjb3BpZWQgZmFjdCBpc1xuICAgICAgICAgIC8vIG9wdGlvbmFsLCBzbyBpdHMgcmVhZCBpcyBndWFyZGVkIHRvIG51bGwgKGFuIGluc2VydCB0cmVhdHMgbnVsbCBhc1xuICAgICAgICAgIC8vIGl0IHRyZWF0ZWQgdGhlIGtleSB0aGUgdGVtcGxhdGUgbGVmdCBvdXQpLlxuICAgICAgICAgIG5hbWU6IGNlbGBsZWFkUmVjb3JkLmNvbXBhbnlgLCBwaG9uZTogY2VsYGhhcyhsZWFkUmVjb3JkLnBob25lKSA/IGxlYWRSZWNvcmQucGhvbmUgOiBudWxsYCxcbiAgICAgICAgICB3ZWJzaXRlOiBjZWxgaGFzKGxlYWRSZWNvcmQud2Vic2l0ZSkgPyBsZWFkUmVjb3JkLndlYnNpdGUgOiBudWxsYCxcbiAgICAgICAgICBpbmR1c3RyeTogY2VsYGhhcyhsZWFkUmVjb3JkLmluZHVzdHJ5KSA/IGxlYWRSZWNvcmQuaW5kdXN0cnkgOiBudWxsYCxcbiAgICAgICAgICBhbm51YWxfcmV2ZW51ZTogY2VsYGhhcyhsZWFkUmVjb3JkLmFubnVhbF9yZXZlbnVlKSA/IGxlYWRSZWNvcmQuYW5udWFsX3JldmVudWUgOiBudWxsYCxcbiAgICAgICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiBjZWxgaGFzKGxlYWRSZWNvcmQubnVtYmVyX29mX2VtcGxveWVlcykgPyBsZWFkUmVjb3JkLm51bWJlcl9vZl9lbXBsb3llZXMgOiBudWxsYCxcbiAgICAgICAgICBiaWxsaW5nX2FkZHJlc3M6IGNlbGBoYXMobGVhZFJlY29yZC5hZGRyZXNzKSA/IGxlYWRSZWNvcmQuYWRkcmVzcyA6IG51bGxgLFxuICAgICAgICAgIG93bmVyX2lkOiBjZWxgY3VycmVudF91c2VyLmlkYCwgaXNfYWN0aXZlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2NyZWF0ZWRBY2NvdW50JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ3VzZV9uZXdfYWNjb3VudCcsIHR5cGU6ICdhc3NpZ25tZW50JywgbGFiZWw6ICdVc2UgTmV3IEFjY291bnQnLFxuICAgICAgY29uZmlnOiB7IGFzc2lnbm1lbnRzOiB7IGFjY291bnRJZDogY2VsYGNyZWF0ZWRBY2NvdW50LmlkYCB9IH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ3VzZV9leGlzdGluZ19hY2NvdW50JywgdHlwZTogJ2Fzc2lnbm1lbnQnLCBsYWJlbDogJ1JldXNlIEV4aXN0aW5nIEFjY291bnQnLFxuICAgICAgY29uZmlnOiB7IGFzc2lnbm1lbnRzOiB7IGFjY291bnRJZDogY2VsYG1hdGNoZWRBY2NvdW50LmlkYCB9IH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBDb250YWN0IGRlZHVwZSBieSBlbWFpbCBcdTIwMTQgR0xPQkFMLCBub3QgcGVyLWFjY291bnQuIFx1MjZENCBOZXZlciBzY29wZSB0aGlzXG4gICAgICAvLyBsb29rdXAgdG8gdGhlIGFjY291bnQ6IGBjcm1fY29udGFjdGAgY2FycmllcyBhIGdsb2JhbCB1bmlxdWUgaW5kZXggb25cbiAgICAgIC8vIGBlbWFpbGAsIHNvIGFuIGFjY291bnQtc2NvcGVkIGxvb2t1cCBtaXNzZXMgYSBzYW1lLWVtYWlsIGNvbnRhY3QgdW5kZXJcbiAgICAgIC8vIGFub3RoZXIgYWNjb3VudCBhbmQgYGNyZWF0ZV9jb250YWN0YCB0aGVuIGV4cGxvZGVzIG9uIHRoZSBEQiBpbmRleFxuICAgICAgLy8gQUZURVIgdGhlIGFjY291bnQgaGFzIGJlZW4gY3JlYXRlZCwgb3JwaGFuaW5nIGl0LiBMZWFkcyByZXF1aXJlIGFuXG4gICAgICAvLyBlbWFpbCwgc28gdGhlIG1hdGNoIGtleSBpcyByZWxpYWJsZS5cbiAgICAgIGlkOiAnZmluZF9jb250YWN0JywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0ZpbmQgRXhpc3RpbmcgQ29udGFjdCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9jb250YWN0JyxcbiAgICAgICAgZmlsdGVyOiB7IGVtYWlsOiBjZWxgbGVhZFJlY29yZC5lbWFpbGAgfSxcbiAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdtYXRjaGVkQ29udGFjdCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gQnJhbmNoaW5nIGlzIG9uIGVkZ2VzIGBlMTFgIC8gYGUxMmAgXHUyMDE0IHNlZSBgZGVjaXNpb25fYWNjb3VudGAuXG4gICAgICBpZDogJ2RlY2lzaW9uX2NvbnRhY3QnLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0NvbnRhY3QgQWxyZWFkeSBFeGlzdHM/JyxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIGBhY2NvdW50SWRgIGlzIGEgYmFyZSBpZCBzdHJpbmcgZnJvbSB3aGljaGV2ZXIgYWNjb3VudCBicmFuY2ggcmFuLlxuICAgICAgaWQ6ICdjcmVhdGVfY29udGFjdCcsIHR5cGU6ICdjcmVhdGVfcmVjb3JkJywgbGFiZWw6ICdDcmVhdGUgQ29udGFjdCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9jb250YWN0JyxcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgLy8gVGhlIHBlcnNvbidzIG93biBmYWN0cyB0cmF2ZWwgd2l0aCB0aGVtICgjMjA2OCkuIGBjcm1fY29udGFjdGBcbiAgICAgICAgICAvLyBkZWNsYXJlcyBlYWNoIG9mIHRoZXNlIG9uIHRoZSBsZWFkJ3Mgdm9jYWJ1bGFyeSAoYF9waWNrbGlzdHMudHNgXG4gICAgICAgICAgLy8gZm9yIHRoZSB0d28gc2VsZWN0cywgcGlubmVkIGJ5IGB0ZXN0L2FjdGlvbnMtZmxvd3MtaW50ZWdyaXR5YCksIHNvXG4gICAgICAgICAgLy8gYSBzdHJhaWdodCBjb3B5IGlzIGFsd2F5cyBsZWdhbC4gVGhlIHR3byBvcHQtb3V0cyBhcmUgY29waWVkLFxuICAgICAgICAgIC8vIG5ldmVyIGRlZmF1bHRlZDogYSBsZWFkIHRoYXQgb3B0ZWQgb3V0IG11c3Qgbm90IGJlY29tZSBhIGNvbnRhY3RcbiAgICAgICAgICAvLyB0aGF0IGhhcyBub3QgXHUyMDE0IGBlbWFpbF9vcHRfb3V0YCBoaWRlcyBTZW5kIEVtYWlsIGFuZCBzaWxlbmNlc1xuICAgICAgICAgIC8vIGBjb250YWN0X3dlbGNvbWVgLCBgZG9fbm90X2NhbGxgIHJlZnVzZXMgYSBzY2hlZHVsZWQgY2FsbC4gQVxuICAgICAgICAgIC8vIFJFVVNFRCBjb250YWN0IGRvZXMgbm90IGNvbWUgdGhyb3VnaCBoZXJlOiBzZWVcbiAgICAgICAgICAvLyBgZGVjaXNpb25fY29udGFjdF9kb19ub3RfY2FsbGAuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBOYW1lcyBhbmQgZW1haWwgYXJlIHJlcXVpcmVkIG9uIGEgbGVhZCBhbmQgcmVhZCBiYXJlOyB0aGUgcmVzdFxuICAgICAgICAgIC8vIGFyZSBvcHRpb25hbCBhbmQgZ3VhcmRlZCB0byBudWxsLCB3aGljaCBhbiBpbnNlcnQgcmVhZHMgYXMgdGhlXG4gICAgICAgICAgLy8gb21pdHRlZCBrZXkgdGhlIHRlbXBsYXRlIHdyb3RlIChlYWNoIG9wdC1vdXQgdGhlbiB0YWtlcyBpdHNcbiAgICAgICAgICAvLyBgZmFsc2VgIGRlZmF1bHQsIGFzIGJlZm9yZSkuXG4gICAgICAgICAgc2FsdXRhdGlvbjogY2VsYGhhcyhsZWFkUmVjb3JkLnNhbHV0YXRpb24pID8gbGVhZFJlY29yZC5zYWx1dGF0aW9uIDogbnVsbGAsXG4gICAgICAgICAgbW9iaWxlOiBjZWxgaGFzKGxlYWRSZWNvcmQubW9iaWxlKSA/IGxlYWRSZWNvcmQubW9iaWxlIDogbnVsbGAsXG4gICAgICAgICAgbGVhZF9zb3VyY2U6IGNlbGBoYXMobGVhZFJlY29yZC5sZWFkX3NvdXJjZSkgPyBsZWFkUmVjb3JkLmxlYWRfc291cmNlIDogbnVsbGAsXG4gICAgICAgICAgZG9fbm90X2NhbGw6IGNlbGBoYXMobGVhZFJlY29yZC5kb19ub3RfY2FsbCkgPyBsZWFkUmVjb3JkLmRvX25vdF9jYWxsIDogbnVsbGAsXG4gICAgICAgICAgZW1haWxfb3B0X291dDogY2VsYGhhcyhsZWFkUmVjb3JkLmVtYWlsX29wdF9vdXQpID8gbGVhZFJlY29yZC5lbWFpbF9vcHRfb3V0IDogbnVsbGAsXG4gICAgICAgICAgZmlyc3RfbmFtZTogY2VsYGxlYWRSZWNvcmQuZmlyc3RfbmFtZWAsIGxhc3RfbmFtZTogY2VsYGxlYWRSZWNvcmQubGFzdF9uYW1lYCxcbiAgICAgICAgICBlbWFpbDogY2VsYGxlYWRSZWNvcmQuZW1haWxgLCBwaG9uZTogY2VsYGhhcyhsZWFkUmVjb3JkLnBob25lKSA/IGxlYWRSZWNvcmQucGhvbmUgOiBudWxsYCxcbiAgICAgICAgICB0aXRsZTogY2VsYGhhcyhsZWFkUmVjb3JkLnRpdGxlKSA/IGxlYWRSZWNvcmQudGl0bGUgOiBudWxsYCwgY3JtX2FjY291bnQ6IGNlbGBhY2NvdW50SWRgLFxuICAgICAgICAgIGlzX3ByaW1hcnk6IHRydWUsIG93bmVyX2lkOiBjZWxgY3VycmVudF91c2VyLmlkYCxcbiAgICAgICAgfSxcbiAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdjcmVhdGVkQ29udGFjdCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICd1c2VfbmV3X2NvbnRhY3QnLCB0eXBlOiAnYXNzaWdubWVudCcsIGxhYmVsOiAnVXNlIE5ldyBDb250YWN0JyxcbiAgICAgIGNvbmZpZzogeyBhc3NpZ25tZW50czogeyBjb250YWN0SWQ6IGNlbGBjcmVhdGVkQ29udGFjdC5pZGAgfSB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICd1c2VfZXhpc3RpbmdfY29udGFjdCcsIHR5cGU6ICdhc3NpZ25tZW50JywgbGFiZWw6ICdSZXVzZSBFeGlzdGluZyBDb250YWN0JyxcbiAgICAgIGNvbmZpZzogeyBhc3NpZ25tZW50czogeyBjb250YWN0SWQ6IGNlbGBtYXRjaGVkQ29udGFjdC5pZGAgfSB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gXHUyNTAwXHUyNTAwIEEgUkVVU0VEIGNvbnRhY3Qga2VlcHMgdGhlIHN0cmljdGVyIGNvbnNlbnQgKCMyMDY4KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAgIC8vXG4gICAgICAvLyBgY3JlYXRlX2NvbnRhY3RgIGNvcGllcyB0aGUgbGVhZCdzIG9wdC1vdXRzIG9udG8gYSBORVcgY29udGFjdC4gQVxuICAgICAgLy8gcmV1c2VkIGNvbnRhY3QgYWxyZWFkeSBob2xkcyBpdHMgb3duIGFuc3dlciwgYW5kIGFuIG9wdC1vdXQgaXMgYVxuICAgICAgLy8gcHJvbWlzZSB0byBhIHBlcnNvbiB0aGF0IGEgY29udmVyc2lvbiBuZXZlciB0YWtlcyBiYWNrIFx1MjAxNCBzbyB0aGlzIHBhdGhcbiAgICAgIC8vIG9ubHkgZXZlciBSQUlTRVMgYSBmbGFnLCBvbmUgbm9kZSBwZXIgZmxhZywgYW5kIG9ubHkgd2hlbiB0aGUgbGVhZFxuICAgICAgLy8gY2FycmllcyBpdC4gVGhlIGByYWlzZV8qYCBub2RlcyB3cml0ZSB0aGUgbGl0ZXJhbCBgdHJ1ZWAsIFx1MjZENCBuZXZlciBhXG4gICAgICAvLyBjb3B5IG9mIGBsZWFkUmVjb3JkLnhgOiBhIGNvcHkgd291bGQgd3JpdGUgdGhlIGxlYWQncyBgZmFsc2VgIG92ZXIgYSBjb250YWN0XG4gICAgICAvLyB3aG8gaGFkIG9wdGVkIG91dC4gYGNybV9hY2NvdW50YCBjYXJyaWVzIG5laXRoZXIgZmxhZywgc28gdGhlIGFjY291bnRcbiAgICAgIC8vIGhhbGYgb2YgXCJ0aGUgc3RyaWN0ZXIgdmFsdWUgd2luc1wiIGhhcyBub3RoaW5nIHRvIHdyaXRlLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBlZGdlcyByZWFkIHRoZSBMRUFEJ3MgZmxhZyBvbmx5LCBub3Qgd2hldGhlciB0aGUgY29udGFjdCBhbHJlYWR5XG4gICAgICAvLyBob2xkcyBpdC4gUmVhZGluZyBgdmFycy5tYXRjaGVkQ29udGFjdC54YCBuZWVkcyBhXG4gICAgICAvLyBgaGFzKHZhcnMubWF0Y2hlZENvbnRhY3QpYCBndWFyZCwgd2hpY2hcbiAgICAgIC8vIGB0ZXN0L2Zsb3ctdmFyaWFibGUtY29uZGl0aW9ucy50ZXN0LnRzYCBmb3JiaWRzIG9uIHRoaXMgZmxvdyAoYVxuICAgICAgLy8gYGdldF9yZWNvcmRgIGJpbmRzIGl0IG9uIGV2ZXJ5IHBhdGgpIFx1MjAxNCBhbmQgd3JpdGluZyBgdHJ1ZWAgb3ZlciBgdHJ1ZWBcbiAgICAgIC8vIGNoYW5nZXMgbm90aGluZy5cbiAgICAgIC8vXG4gICAgICAvLyBCcmFuY2hpbmcgb24gYGUzNWAgLyBgZTM2YCwgdGhlbiBgZTM4YCAvIGBlMzlgOiBlYWNoIHBhaXIgaXMgVE9UQUwgYW5kXG4gICAgICAvLyBwYXJ0aXRpb25zIGJ5IERlIE1vcmdhbiwgc28gZXhhY3RseSBvbmUgZWRnZSBob2xkcyBvbiBldmVyeSBzaGFwZVxuICAgICAgLy8gYGdldF9sZWFkYCBjYW4gYmluZCBcdTIwMTQgcGlubmVkIGluIGB0ZXN0L2Zsb3ctY29udmVyc2lvbi50ZXN0LnRzYC5cbiAgICAgIGlkOiAnZGVjaXNpb25fY29udGFjdF9kb19ub3RfY2FsbCcsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnTGVhZCBJcyBEby1Ob3QtQ2FsbD8nLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdyYWlzZV9jb250YWN0X2RvX25vdF9jYWxsJywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ0NhcnJ5IERvLU5vdC1DYWxsIHRvIENvbnRhY3QnLFxuICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fY29udGFjdCcsIGZpbHRlcjogeyBpZDogY2VsYGNvbnRhY3RJZGAgfSwgZmllbGRzOiB7IGRvX25vdF9jYWxsOiB0cnVlIH0gfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnZGVjaXNpb25fY29udGFjdF9lbWFpbF9vcHRfb3V0JywgdHlwZTogJ2RlY2lzaW9uJywgbGFiZWw6ICdMZWFkIE9wdGVkIE91dCBvZiBFbWFpbD8nLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdyYWlzZV9jb250YWN0X2VtYWlsX29wdF9vdXQnLCB0eXBlOiAndXBkYXRlX3JlY29yZCcsIGxhYmVsOiAnQ2FycnkgRW1haWwgT3B0LU91dCB0byBDb250YWN0JyxcbiAgICAgIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX2NvbnRhY3QnLCBmaWx0ZXI6IHsgaWQ6IGNlbGBjb250YWN0SWRgIH0sIGZpZWxkczogeyBlbWFpbF9vcHRfb3V0OiB0cnVlIH0gfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEJyYW5jaGluZyBpcyBvbiBlZGdlcyBgZTE2YCAvIGBlMTdgIFx1MjAxNCBzZWUgYGRlY2lzaW9uX2FjY291bnRgLlxuICAgICAgaWQ6ICdkZWNpc2lvbl9vcHBvcnR1bml0eScsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnQ3JlYXRlIE9wcG9ydHVuaXR5PycsXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBgY2xvc2VfZGF0ZWAgY29tZXMgZnJvbSB0aGUgc2NyZWVuIGZpZWxkLCB3aGljaCBpcyB0aGUgb25seSBsYXllciB0aGF0XG4gICAgICAvLyBjYW4gY2FycnkgdGhlIGBpc29EYXRlKGRheXNGcm9tTm93KDkwKSlgIGV4cHJlc3Npb24gXHUyMDE0IHNlZSB0aGVcbiAgICAgIC8vIGBjbG9zZURhdGVgIGRlY2xhcmF0aW9uLiBBbiB1bmJvdW5kIGBjbG9zZURhdGVgIGZhaWxzIHRoZSBydW4gYXQgdGhpc1xuICAgICAgLy8gbm9kZSByYXRoZXIgdGhhbiBpbnZlbnRpbmcgYSBxdWFydGVyLCB3aGljaCBpcyB0aGUgZmFpbHVyZSB0aGlzIG5vZGVcbiAgICAgIC8vIGlzIGFsbG93ZWQgdG8gaGF2ZS5cbiAgICAgIGlkOiAnY3JlYXRlX29wcG9ydHVuaXR5JywgdHlwZTogJ2NyZWF0ZV9yZWNvcmQnLCBsYWJlbDogJ0NyZWF0ZSBPcHBvcnR1bml0eScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIG5hbWU6IGNlbGBvcHBvcnR1bml0eU5hbWVgLCBjcm1fYWNjb3VudDogY2VsYGFjY291bnRJZGAsIHByaW1hcnlfY29udGFjdDogY2VsYGNvbnRhY3RJZGAsXG4gICAgICAgICAgYW1vdW50OiBjZWxgb3Bwb3J0dW5pdHlBbW91bnRgLCBzdGFnZTogJ3Byb3NwZWN0aW5nJywgcHJvYmFiaWxpdHk6IDEwLFxuICAgICAgICAgIGxlYWRfc291cmNlOiBjZWxgaGFzKGxlYWRSZWNvcmQubGVhZF9zb3VyY2UpID8gbGVhZFJlY29yZC5sZWFkX3NvdXJjZSA6IG51bGxgLFxuICAgICAgICAgIGNsb3NlX2RhdGU6IGNlbGBjbG9zZURhdGVgLCBvd25lcl9pZDogY2VsYGN1cnJlbnRfdXNlci5pZGAsXG4gICAgICAgIH0sXG4gICAgICAgIG91dHB1dFZhcmlhYmxlOiAnY3JlYXRlZE9wcG9ydHVuaXR5JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBOb3JtYWxpemUgYm90aCBvcHBvcnR1bml0eSBicmFuY2hlcyBvbnRvIGEgc2luZ2xlIGBvcHBvcnR1bml0eUlkYCwgdGhlXG4gICAgICAvLyBzYW1lIHBhdHRlcm4gYXMgYWNjb3VudElkL2NvbnRhY3RJZC4gXHUyNkQ0IE5ldmVyIHJlZmVyZW5jZVxuICAgICAgLy8gYGNyZWF0ZWRPcHBvcnR1bml0eS5pZGAgZG93bnN0cmVhbSBpbnN0ZWFkOiBvbiB0aGUgXCJOb1wiIGJyYW5jaCB0aGVcbiAgICAgIC8vIGNyZWF0ZSBub2RlIG5ldmVyIHJhbiwgYW5kIHRoZSB1bmJvdW5kIHJlYWQgZmFpbHMgdGhlIHJ1biAob24gMTcueCB0aGVcbiAgICAgIC8vIHVucmVzb2x2ZWQgdG9rZW4gaW50ZXJwb2xhdGVkIGludG8gdGhlIGBjb252ZXJ0ZWRfb3Bwb3J0dW5pdHlgIGxvb2t1cFxuICAgICAgLy8gYXMgYSBwbGFjZWhvbGRlcikuXG4gICAgICBpZDogJ3VzZV9uZXdfb3Bwb3J0dW5pdHknLCB0eXBlOiAnYXNzaWdubWVudCcsIGxhYmVsOiAnVXNlIE5ldyBPcHBvcnR1bml0eScsXG4gICAgICBjb25maWc6IHsgYXNzaWdubWVudHM6IHsgb3Bwb3J0dW5pdHlJZDogY2VsYGNyZWF0ZWRPcHBvcnR1bml0eS5pZGAgfSB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdub19vcHBvcnR1bml0eScsIHR5cGU6ICdhc3NpZ25tZW50JywgbGFiZWw6ICdObyBPcHBvcnR1bml0eScsXG4gICAgICBjb25maWc6IHsgYXNzaWdubWVudHM6IHsgb3Bwb3J0dW5pdHlJZDogbnVsbCB9IH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ21hcmtfY29udmVydGVkJywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ01hcmsgTGVhZCBhcyBDb252ZXJ0ZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fbGVhZCcsIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZElkYCB9LFxuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAvLyBgc3RhdHVzOiAnY29udmVydGVkJ2AgcmlkZXMgYWxvbmcgc28gbGlzdCB2aWV3cyBhZ3JlZSB3aXRoIHRoZVxuICAgICAgICAgIC8vIGNvbnZlcnNpb24gZmxhZ3MgKHRoZSBxdWFsaWZpZWQgXHUyMTkyIGNvbnZlcnRlZCB0cmFuc2l0aW9uIGlzIGxlZ2FsXG4gICAgICAgICAgLy8gcGVyIHRoZSBsZWFkX3N0YXR1c19wcm9ncmVzc2lvbiBzdGF0ZSBtYWNoaW5lKS5cbiAgICAgICAgICBpc19jb252ZXJ0ZWQ6IHRydWUsIHN0YXR1czogJ2NvbnZlcnRlZCcsIGNvbnZlcnRlZF9kYXRlOiBjZWxgaXNvRGF0ZXRpbWUobm93KCkpYCxcbiAgICAgICAgICBjb252ZXJ0ZWRfYWNjb3VudDogY2VsYGFjY291bnRJZGAsIGNvbnZlcnRlZF9jb250YWN0OiBjZWxgY29udGFjdElkYCxcbiAgICAgICAgICBjb252ZXJ0ZWRfb3Bwb3J0dW5pdHk6IGNlbGBvcHBvcnR1bml0eUlkYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBBRFItMDAxMjogZGVsaXZlciB2aWEgdGhlIGBub3RpZnlgIG5vZGUgKGluYm94ICsgZW1haWwpLiBUaGUgbGVnYWN5XG4gICAgICAvLyBgc2NyaXB0YCArIGBhY3Rpb25UeXBlOidlbWFpbCdgIHNoYXBlIGlzIGEgbm8tb3Agc3R1YiBpbiA3LjQuXG4gICAgICBpZDogJ3NlbmRfbm90aWZpY2F0aW9uJywgdHlwZTogJ25vdGlmeScsIGxhYmVsOiAnU2VuZCBDb25maXJtYXRpb24nLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtjZWxgY3VycmVudF91c2VyLmlkYF0sXG4gICAgICAgIGNoYW5uZWxzOiBbJ2luYm94JywgJ2VtYWlsJ10sXG4gICAgICAgIHRvcGljOiAnbGVhZF9jb252ZXJ0ZWQnLFxuICAgICAgICB0ZW1wbGF0ZTogJ2NybS5sZWFkX2NvbnZlcnRlZCcsXG4gICAgICAgIHRlbXBsYXRlRGF0YTogeyBmaXJzdF9uYW1lOiBjZWxgbGVhZFJlY29yZC5maXJzdF9uYW1lYCwgbGFzdF9uYW1lOiBjZWxgbGVhZFJlY29yZC5sYXN0X25hbWVgIH0sXG4gICAgICAgIGFjdGlvblVybDogJy9jcm1fYWNjb3VudC97e2FjY291bnRJZH19JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgLy8gXHUyNkQ0IEEgcmV0aXJlZCBlZGdlJ3MgaWQgc3RheXMgVkFDQU5UIGFuZCBldmVyeSBzdXJ2aXZpbmcgZWRnZSBrZWVwcyB0aGUgaWRcbiAgICAvLyBpdCBoYXMgYWx3YXlzIGhhZCBcdTIwMTQgYGUxYCwgYGUzYCBhbmQgYGUxNWAgYXJlIGdhcHMgb24gcHVycG9zZS5cbiAgICAvLyBSZW51bWJlcmluZyB0byBjbG9zZSBhIGdhcCByZXdyaXRlcyBpZHMgdGhhdCBvdGhlciBub3RlcywgdGVzdHMgYW5kIHJ1blxuICAgIC8vIGxvZ3MgcmVmZXIgdG8uXG4gICAgeyBpZDogJ2UwJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdnZXRfbGVhZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIC8vIFx1MjZENCBXaGVuIHlvdSBhZGQgYW4gZWRnZSwgdGFrZSB0aGUgbmV4dCBpZCBBRlRFUiBUSEUgSElHSEVTVCBJTiBVU0UgXHUyMDE0IGRvXG4gICAgLy8gbm90IHJldXNlIGEgdmFjYW50IG9uZSwgYW5kIGRvIG5vdCBhc3N1bWUgYW4gdW51c2VkLWxvb2tpbmcgaWQgaXMgZnJlZS5cbiAgICAvLyBBIGR1cGxpY2F0ZSBpZCBpcyBJTkVSVCAodHJhdmVyc2FsIGZpbHRlcnMgb3V0LWVkZ2VzIGJ5IGBzb3VyY2VgLCBuZXZlclxuICAgIC8vIGJ5IGBpZGApLCBzbyBub3RoaW5nIGZhaWxzIGFuZCB0aGUgY29sbGlzaW9uIHN1cnZpdmVzIHRvIHRyYXAgdGhlIG5leHRcbiAgICAvLyBlZGl0b3IgcGlja2luZyBvdXQgb2YgdGhlIHNlcXVlbmNlLiBgZTFgLCBgZTNgIGFuZCBgZTE1YCBhcmUgdmFjYW50XG4gICAgLy8gcmV0aXJlZCBpZHMgYW5kIHN0YXkgdGhhdCB3YXk7IGBlMjdgIGlzIGFib3ZlIHRoZSBoaWdoZXN0IGxpdmUgaWQsIG5vdFxuICAgIC8vIGEgZ2FwLWZpbGwuXG4gICAgeyBpZDogJ2UyNycsIHNvdXJjZTogJ2dldF9sZWFkJywgdGFyZ2V0OiAnZGVjaXNpb25fYXBwcm92YWwnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAvLyBcdTI1MDBcdTI1MDAgVGhlIGFwcHJvdmFsIGdhdGUgKFJFUS0wMDA1IHN0ZXAgNykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBUaGUgc2FtZSBUT1RBTCwgUEFSVElUSU9OSU5HIHBhaXIgdGhlIGR1cGxpY2F0ZSB2ZXJkaWN0IGJlbG93IGlzIHdyaXR0ZW5cbiAgICAvLyBhcywgYW5kIGZvciB0aGUgc2FtZSBtZWFzdXJlZCByZWFzb246IGEgZGVjaXNpb24gbm9kZSBkZWNsYXJpbmcgbm9cbiAgICAvLyBgY29uZmlnLmNvbmRpdGlvbnNgIHRha2VzIEVWRVJZIG91dC1lZGdlIHdob3NlIGNvbmRpdGlvbiBob2xkcywgaW5cbiAgICAvLyBwYXJhbGxlbCwgc28gdHdvIG92ZXJsYXBwaW5nIGd1YXJkcyB3b3VsZCByZWZ1c2UgdGhlIGNvbnZlcnNpb24gYW5kXG4gICAgLy8gY29udGludWUgaXQgaW4gb25lIHJ1bi4gYGUyOWAgaXMgYGUyOGAgbmVnYXRlZCBieSBEZSBNb3JnYW4uXG4gICAgLy9cbiAgICAvLyBcdTI2QTBcdUZFMEYgVGhlIHBvbGFyaXR5IGlzIGZhaWwtT1BFTiwgdW5saWtlIHRoZSBkdXBsaWNhdGUgYnJhbmNoLCBhbmQgdGhhdCBpcyB0aGVcbiAgICAvLyBnYXRlJ3Mgb2ZmIHN3aXRjaCByYXRoZXIgdGhhbiBhIHNsaXAuIE9ubHkgdGhlIHR3byB2ZXJkaWN0cyBhIGxpdmVcbiAgICAvLyBhcHByb3ZhbCB3cml0ZXMgcmVmdXNlOyBgbm90X3JlcXVpcmVkYCBcdTIwMTQgdGhlIHNoaXBwZWQgZGVmYXVsdCBcdTIwMTQgYW5kIGFuXG4gICAgLy8gYWJzZW50IGNvbHVtbiAoYSBsZWFkIGZyb20gYmVmb3JlIHRoZSBmaWVsZCBleGlzdGVkKSBib3RoIGNvbnRpbnVlLCBzb1xuICAgIC8vIHdpdGggdGhlIGdhdGUgb2ZmIHRoaXMgcGFpciBpcyBpbnZpc2libGUgYW5kIGNvbnZlcnNpb24gYmVoYXZlcyBleGFjdGx5IGFzXG4gICAgLy8gaXQgZGlkIGJlZm9yZS4gYGxlYWQuaG9vay50c2AgYW5kIGBjb252ZXJ0X2xlYWQudmlzaWJsZWAgY2FycnkgdGhlIHNhbWVcbiAgICAvLyBwb2xhcml0eSwgYmVjYXVzZSB0aGUgdGhyZWUgaGF2ZSB0byBhZ3JlZSBhYm91dCB3aGF0IFwib2ZmXCIgbWVhbnMuXG4gICAgeyBpZDogJ2UyOCcsIHNvdXJjZTogJ2RlY2lzaW9uX2FwcHJvdmFsJywgdGFyZ2V0OiAncmVmdXNlX3VuYXBwcm92ZWQnLCB0eXBlOiAnZGVmYXVsdCcsIGNvbmRpdGlvbjogUGBoYXModmFycy5sZWFkUmVjb3JkKSAmJiBoYXModmFycy5sZWFkUmVjb3JkLmNvbnZlcnNpb25fYXBwcm92YWxfc3RhdHVzKVxuICAgICAgJiYgKHZhcnMubGVhZFJlY29yZC5jb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1cyA9PSBcInBlbmRpbmdcIiB8fCB2YXJzLmxlYWRSZWNvcmQuY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXMgPT0gXCJyZWplY3RlZFwiKWAsIGxhYmVsOiAnTm90IGFwcHJvdmVkJyB9LFxuICAgIHsgaWQ6ICdlMjknLCBzb3VyY2U6ICdkZWNpc2lvbl9hcHByb3ZhbCcsIHRhcmdldDogJ2RlY2lzaW9uX2R1cGxpY2F0ZScsIHR5cGU6ICdkZWZhdWx0JywgY29uZGl0aW9uOiBQYCFoYXModmFycy5sZWFkUmVjb3JkKSB8fCAhaGFzKHZhcnMubGVhZFJlY29yZC5jb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1cylcbiAgICAgIHx8ICh2YXJzLmxlYWRSZWNvcmQuY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXMgIT0gXCJwZW5kaW5nXCIgJiYgdmFycy5sZWFkUmVjb3JkLmNvbnZlcnNpb25fYXBwcm92YWxfc3RhdHVzICE9IFwicmVqZWN0ZWRcIilgLCBsYWJlbDogJ0NsZWFyJyB9LFxuICAgIC8vIFJlam9pbnMgbm90aGluZywgZXhhY3RseSBsaWtlIGBlMjZgOiB0aGUgcmVmdXNhbCBJUyBub3QgcmVhY2hpbmcgYSB3cml0ZXIuXG4gICAgeyBpZDogJ2UzMCcsIHNvdXJjZTogJ3JlZnVzZV91bmFwcHJvdmVkJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gXHUyNkEwXHVGRTBGIEJvdGggY29uZGl0aW9ucyBhcmUgVE9UQUwsIGFuZCBvbiB0aGlzIHN1cmZhY2UgdGhhdCBpcyBub3QgYSBzdHlsZVxuICAgIC8vIHByZWZlcmVuY2U6IGEgZmxvdyBjb25kaXRpb24gaXMgaW50ZXJwcmV0ZWQgc3RyaWN0IENFTCBvbiBldmVyeSBydW4sIGFuZFxuICAgIC8vIGFuIHVuZ3VhcmRlZCBmaWVsZCByZWFkIGFnYWluc3QgYSBkcml2ZXIgdGhhdCBvbWl0cyBhYnNlbnQgY29sdW1uc1xuICAgIC8vIChgZHJpdmVyLW1lbW9yeWAgLyBgZHJpdmVyLW1vbmdvZGJgKSBhYm9ydHMgXHUyMDE0IHdoaWNoIEZBSUxTIFRIRSBSVU4sIHNvIGFuXG4gICAgLy8gdW5ndWFyZGVkIHJlYWQgaGVyZSB3b3VsZCBtYWtlIG9yZGluYXJ5IGxlYWRzIHVuY29udmVydGlibGUuIE1lYXN1cmVkLCBpblxuICAgIC8vIGV4YWN0bHkgdGhhdCBzaGFwZTogYGNvbmRpdGlvbiBmYWlsZWQgdG8gZXZhbHVhdGUgYXMgQ0VMOiBObyBzdWNoIGtleTpcbiAgICAvLyBkdXBsaWNhdGVfc3RhdHVzYC4gVGhlIGZ1bGwgdGFibGUgaXMgaW5cbiAgICAvLyBgdGVzdC9mbG93LWNvbmRpdGlvbi10b3RhbGl0eS50ZXN0LnRzYC5cbiAgICAvL1xuICAgIC8vIFRXTyBndWFyZHMsIGluIHRoZSBzcGVsbGluZyBgdGVzdC9mbG93LXZhcmlhYmxlLWNvbmRpdGlvbnMudGVzdC50c2BcbiAgICAvLyByZXF1aXJlcywgYW5kIHRoZSBvdXRlciBvbmUgaXMgbm90IGRlY29yYXRpb246IGB2YXJzLmxlYWRSZWNvcmRgIGlzIGFcbiAgICAvLyBLRVksIHNvIGEgcGxhaW4gYHZhcnMubGVhZFJlY29yZCAhPSBudWxsYCB3b3VsZCBpdHNlbGYgYWJvcnQgd2l0aFxuICAgIC8vIGBVbmtub3duIHZhcmlhYmxlYCBvbiB0aGUgcnVuIHdoZXJlIGBnZXRfbGVhZGAgYm91bmQgbm90aGluZyBcdTIwMTQgdGhlIGd1YXJkXG4gICAgLy8gd291bGQgYmUgdGhlIGZhdWx0IGl0IHdhcyB3cml0dGVuIHRvIHByZXZlbnQuIGBoYXModmFycy5sZWFkUmVjb3JkKWBcbiAgICAvLyBhbnN3ZXJzIGluc3RlYWQgb2YgcmVhZGluZy5cbiAgICAvL1xuICAgIC8vIFRoZSBUSFJFRSBlZGdlcyBQQVJUSVRJT04gYnkgRGUgTW9yZ2FuIChgIShhICYmIGIgJiYgYylgIHdyaXR0ZW4gb3V0IGFzXG4gICAgLy8gYCFhIHx8ICFiIHx8ICFjYCwgd2l0aCB0aGUgdHdvIHZlcmRpY3QgdGVzdHMgY29uam9pbmVkIHVuZGVyIHRoZSBsYXN0XG4gICAgLy8gdGVybSksIHNvIGV4YWN0bHkgb25lIGlzIHRydWUgZm9yIGV2ZXJ5IHJlY29yZCBzaGFwZSwgaW5jbHVkaW5nIHRoZVxuICAgIC8vIHNoYXBlcyB3aGVyZSB0aGUgY29sdW1uLCB0aGUgcm93IG9yIGJvdGggYXJlIG1pc3NpbmcuXG4gICAgLy9cbiAgICAvLyBcdTI2RDQgYGUyMmAncyB0aGlyZCB0ZXJtIG11c3QgY2FycnkgQk9USCBpbmVxdWFsaXRpZXMuIEEgZGVjaXNpb24gbm9kZSB0aGF0XG4gICAgLy8gZGVjbGFyZXMgbm8gYGNvbmZpZy5jb25kaXRpb25zYCByZXBvcnRzIG5vIGJyYW5jaCwgc28gdHJhdmVyc2FsIHRha2VzXG4gICAgLy8gRVZFUlkgb3V0LWVkZ2Ugd2hvc2UgY29uZGl0aW9uIGhvbGRzLCBJTiBQQVJBTExFTCBcdTIwMTQgd2l0aCBgZTIyYCBsZWZ0IGF0XG4gICAgLy8gYCE9IFwic3VzcGVjdGVkXCJgIGEgY29uZmlybWVkIGxlYWQgc2F0aXNmaWVzIGBlMjJgIEFORCBgZTI1YCwgc2hvd2luZyB0aGVcbiAgICAvLyByZWZ1c2FsIGFuZCBjb252ZXJ0aW5nIHRoZSBsZWFkIGluIHRoZSBzYW1lIHJ1bi4gTWVhc3VyZWQgb25cbiAgICAvLyBgQXV0b21hdGlvbkVuZ2luZS5ldmFsdWF0ZUNvbmRpdGlvbmAgYWNyb3NzIGFsbCBzZXZlbiByZWNvcmQgc2hhcGVzOyB0aGVcbiAgICAvLyBwaW4gaXMgaW4gYHRlc3QvbGVhZC1kdXBsaWNhdGUtdmlzaWJpbGl0eS50ZXN0LnRzYC5cbiAgICB7IGlkOiAnZTIxJywgc291cmNlOiAnZGVjaXNpb25fZHVwbGljYXRlJywgdGFyZ2V0OiAnd2Fybl9kdXBsaWNhdGUnLCB0eXBlOiAnZGVmYXVsdCcsIGNvbmRpdGlvbjogUGBoYXModmFycy5sZWFkUmVjb3JkKSAmJiBoYXModmFycy5sZWFkUmVjb3JkLmR1cGxpY2F0ZV9zdGF0dXMpICYmIHZhcnMubGVhZFJlY29yZC5kdXBsaWNhdGVfc3RhdHVzID09IFwic3VzcGVjdGVkXCJgLCBsYWJlbDogJ1N1c3BlY3RlZCcgfSxcbiAgICB7IGlkOiAnZTI1Jywgc291cmNlOiAnZGVjaXNpb25fZHVwbGljYXRlJywgdGFyZ2V0OiAncmVmdXNlX2NvbmZpcm1lZF9kdXBsaWNhdGUnLCB0eXBlOiAnZGVmYXVsdCcsIGNvbmRpdGlvbjogUGBoYXModmFycy5sZWFkUmVjb3JkKSAmJiBoYXModmFycy5sZWFkUmVjb3JkLmR1cGxpY2F0ZV9zdGF0dXMpICYmIHZhcnMubGVhZFJlY29yZC5kdXBsaWNhdGVfc3RhdHVzID09IFwiY29uZmlybWVkXCJgLCBsYWJlbDogJ0NvbmZpcm1lZCcgfSxcbiAgICB7IGlkOiAnZTIyJywgc291cmNlOiAnZGVjaXNpb25fZHVwbGljYXRlJywgdGFyZ2V0OiAnbm9fZHVwbGljYXRlX3dhcm5pbmcnLCB0eXBlOiAnZGVmYXVsdCcsIGNvbmRpdGlvbjogUGAhaGFzKHZhcnMubGVhZFJlY29yZCkgfHwgIWhhcyh2YXJzLmxlYWRSZWNvcmQuZHVwbGljYXRlX3N0YXR1cykgfHwgKHZhcnMubGVhZFJlY29yZC5kdXBsaWNhdGVfc3RhdHVzICE9IFwic3VzcGVjdGVkXCIgJiYgdmFycy5sZWFkUmVjb3JkLmR1cGxpY2F0ZV9zdGF0dXMgIT0gXCJjb25maXJtZWRcIilgLCBsYWJlbDogJ0NsZWFuJyB9LFxuICAgIC8vIEJvdGggY2xlYXIgZHVwbGljYXRlIGJyYW5jaGVzIHBhc3MgdGhlIG1hdGNoLWtleSBndWFyZCBiZWZvcmUgdGhlIGZvcm0uXG4gICAgeyBpZDogJ2UyMycsIHNvdXJjZTogJ3dhcm5fZHVwbGljYXRlJywgdGFyZ2V0OiAnZGVjaXNpb25fbWF0Y2hfa2V5JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyNCcsIHNvdXJjZTogJ25vX2R1cGxpY2F0ZV93YXJuaW5nJywgdGFyZ2V0OiAnZGVjaXNpb25fbWF0Y2hfa2V5JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gXHUyNTAwXHUyNTAwIFRoZSBtYXRjaC1rZXkgZ3VhcmQgKCMyMDE3KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIFRPVEFMIGFuZCBQQVJUSVRJT05JTkcsIGZvciB0aGUgcmVhc29uIHJlY29yZGVkIGF0IGBlMjhgIC8gYGUyOWA6IGBlMzJgXG4gICAgLy8gaXMgYGUzMWAgbmVnYXRlZCBieSBEZSBNb3JnYW4sIHNvIGV4YWN0bHkgb25lIGhvbGRzIGZvciBldmVyeSBzaGFwZVxuICAgIC8vIGBnZXRfbGVhZGAgY2FuIGJpbmQgXHUyMDE0IHVuYm91bmQsIGEgbnVsbCByb3csIHRoZSBjb2x1bW4gYWJzZW50LCBudWxsLFxuICAgIC8vIGVtcHR5LCBvciBrZXllZC4gYGhhcygpYCBhbG9uZSBpcyBub3QgdGhlIHRlc3Q6IG9uIGEgcm93IHRoYXQgY2Fycmllc1xuICAgIC8vIHRoZSBjb2x1bW4gYXMgbnVsbCBpdCBhbnN3ZXJzIHRydWUsIHNvIHRoZSB2YWx1ZSBuZWVkcyBgaXNCbGFua2AgdG9vLlxuICAgIC8vIEZhaWwtQ0xPU0VELCB1bmxpa2UgdGhlIGFwcHJvdmFsIGdhdGU6IHdpdGhvdXQgYSBrZXkgdGhlcmUgaXMgbm90aGluZyB0b1xuICAgIC8vIG1hdGNoIG9uLCBhbmQgYSBndWVzcyBpcyB0aGUgZGVmZWN0LlxuICAgIHsgaWQ6ICdlMzEnLCBzb3VyY2U6ICdkZWNpc2lvbl9tYXRjaF9rZXknLCB0YXJnZXQ6ICdzY3JlZW5fMScsIHR5cGU6ICdkZWZhdWx0JywgY29uZGl0aW9uOiBQYGhhcyh2YXJzLmxlYWRSZWNvcmQpICYmIGhhcyh2YXJzLmxlYWRSZWNvcmQuY29tcGFueV9ub3JtYWxpemVkKSAmJiAhaXNCbGFuayh2YXJzLmxlYWRSZWNvcmQuY29tcGFueV9ub3JtYWxpemVkKWAsIGxhYmVsOiAnSGFzIG1hdGNoIGtleScgfSxcbiAgICB7IGlkOiAnZTMyJywgc291cmNlOiAnZGVjaXNpb25fbWF0Y2hfa2V5JywgdGFyZ2V0OiAncmVmdXNlX25vX21hdGNoX2tleScsIHR5cGU6ICdkZWZhdWx0JywgY29uZGl0aW9uOiBQYCFoYXModmFycy5sZWFkUmVjb3JkKSB8fCAhaGFzKHZhcnMubGVhZFJlY29yZC5jb21wYW55X25vcm1hbGl6ZWQpIHx8IGlzQmxhbmsodmFycy5sZWFkUmVjb3JkLmNvbXBhbnlfbm9ybWFsaXplZClgLCBsYWJlbDogJ05vIG1hdGNoIGtleScgfSxcbiAgICAvLyBSZWpvaW5zIG5vdGhpbmcsIGV4YWN0bHkgbGlrZSBgZTI2YCAvIGBlMzBgLlxuICAgIHsgaWQ6ICdlMzMnLCBzb3VyY2U6ICdyZWZ1c2Vfbm9fbWF0Y2hfa2V5JywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gVGhlIHJlZnVzYWwgYnJhbmNoIHJlam9pbnMgbm90aGluZzogaXQgZ29lcyBzdHJhaWdodCB0byBgZW5kYCwgc28gbm9cbiAgICAvLyBub2RlIHRoYXQgd3JpdGVzIGlzIGRvd25zdHJlYW0gb2YgaXQuIFRoYXQgaXMgdGhlIHJlZnVzYWwgXHUyMDE0IHRoZSBmbG93J3NcbiAgICAvLyBldmVyeSBjcmVhdGUvdXBkYXRlIHNpdHMgYmVoaW5kIGBzY3JlZW5fMWAsIHdoaWNoIHRoaXMgcGF0aCBuZXZlclxuICAgIC8vIHJlYWNoZXMuXG4gICAgeyBpZDogJ2UyNicsIHNvdXJjZTogJ3JlZnVzZV9jb25maXJtZWRfZHVwbGljYXRlJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAnc2NyZWVuXzEnLCB0YXJnZXQ6ICdmaW5kX2FjY291bnQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTQnLCBzb3VyY2U6ICdmaW5kX2FjY291bnQnLCB0YXJnZXQ6ICdkZWNpc2lvbl9hY2NvdW50JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gRXhpc3RpbmcgYWNjb3VudCBcdTIxOTIgcmV1c2U7IG5vIGFjY291bnQgXHUyMTkyIGNyZWF0ZS4gQm90aCBjb252ZXJnZSBvbiBjcmVhdGVfY29udGFjdC5cbiAgICAvLyBgZmluZF9hY2NvdW50YCBpcyByZWFjaGVkIG9ubHkgd2l0aCBhIG1hdGNoIGtleSAoYGUzMWApLCBzbyBhIG1hdGNoXG4gICAgLy8gaGVyZSBpcyBhbiBlcXVhbGl0eSBvbiBhIHJlYWwga2V5LCBuZXZlciB0aGUgaGFzLW5vLXZhbHVlIHByZWRpY2F0ZS5cbiAgICAvLyBcdTI2RDQgTm8gc2Vjb25kIGNvcHkgb2YgdGhlIGtleSB0ZXN0IG9uIHRoZXNlIHR3byBlZGdlczogaXQgY291bGQgbmV2ZXJcbiAgICAvLyBiZSBmYWxzZSBoZXJlLCBhbmQgYW4gaW5lcnQgcmVzdGF0ZW1lbnQgb2YgYSBsaXZlIHByZWRpY2F0ZSBpcyB0aGVcbiAgICAvLyBzaGFwZSAjNjUwIHJldGlyZWQgZnJvbSB0aGlzIHJlcG8ncyBkZWNpc2lvbiBub2Rlcy5cbiAgICB7IGlkOiAnZTUnLCBzb3VyY2U6ICdkZWNpc2lvbl9hY2NvdW50JywgdGFyZ2V0OiAndXNlX2V4aXN0aW5nX2FjY291bnQnLCB0eXBlOiAnZGVmYXVsdCcsIGNvbmRpdGlvbjogUGB2YXJzLm1hdGNoZWRBY2NvdW50ICE9IG51bGxgLCBsYWJlbDogJ0V4aXN0aW5nJyB9LFxuICAgIHsgaWQ6ICdlNicsIHNvdXJjZTogJ2RlY2lzaW9uX2FjY291bnQnLCB0YXJnZXQ6ICdjcmVhdGVfYWNjb3VudCcsIHR5cGU6ICdkZWZhdWx0JywgY29uZGl0aW9uOiBQYHZhcnMubWF0Y2hlZEFjY291bnQgPT0gbnVsbGAsIGxhYmVsOiAnTmV3JyB9LFxuICAgIHsgaWQ6ICdlNycsIHNvdXJjZTogJ2NyZWF0ZV9hY2NvdW50JywgdGFyZ2V0OiAndXNlX25ld19hY2NvdW50JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gQm90aCBhY2NvdW50IGJyYW5jaGVzIGNvbnZlcmdlIG9uIHRoZSBjb250YWN0LWRlZHVwZSBsb29rdXAuXG4gICAgeyBpZDogJ2U4Jywgc291cmNlOiAndXNlX25ld19hY2NvdW50JywgdGFyZ2V0OiAnZmluZF9jb250YWN0JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U5Jywgc291cmNlOiAndXNlX2V4aXN0aW5nX2FjY291bnQnLCB0YXJnZXQ6ICdmaW5kX2NvbnRhY3QnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTEwJywgc291cmNlOiAnZmluZF9jb250YWN0JywgdGFyZ2V0OiAnZGVjaXNpb25fY29udGFjdCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIC8vIEV4aXN0aW5nIGNvbnRhY3QgXHUyMTkyIHJldXNlOyBub25lIFx1MjE5MiBjcmVhdGUuIEJvdGggY29udmVyZ2Ugb25cbiAgICAvLyBkZWNpc2lvbl9vcHBvcnR1bml0eSwgdGhlIHJldXNlIHBhdGggdGhyb3VnaCB0aGUgY29uc2VudCByYWlzZSBiZWxvdy5cbiAgICB7IGlkOiAnZTExJywgc291cmNlOiAnZGVjaXNpb25fY29udGFjdCcsIHRhcmdldDogJ3VzZV9leGlzdGluZ19jb250YWN0JywgdHlwZTogJ2RlZmF1bHQnLCBjb25kaXRpb246IFBgdmFycy5tYXRjaGVkQ29udGFjdCAhPSBudWxsYCwgbGFiZWw6ICdFeGlzdGluZycgfSxcbiAgICB7IGlkOiAnZTEyJywgc291cmNlOiAnZGVjaXNpb25fY29udGFjdCcsIHRhcmdldDogJ2NyZWF0ZV9jb250YWN0JywgdHlwZTogJ2RlZmF1bHQnLCBjb25kaXRpb246IFBgdmFycy5tYXRjaGVkQ29udGFjdCA9PSBudWxsYCwgbGFiZWw6ICdOZXcnIH0sXG4gICAgeyBpZDogJ2UxMycsIHNvdXJjZTogJ2NyZWF0ZV9jb250YWN0JywgdGFyZ2V0OiAndXNlX25ld19jb250YWN0JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UxNCcsIHNvdXJjZTogJ3VzZV9uZXdfY29udGFjdCcsIHRhcmdldDogJ2RlY2lzaW9uX29wcG9ydHVuaXR5JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gXHUyNTAwXHUyNTAwIFRoZSByZXVzZWQgY29udGFjdCdzIGNvbnNlbnQgcmFpc2UgKCMyMDY4KSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvL1xuICAgIC8vIGBlMTVgICh1c2VfZXhpc3RpbmdfY29udGFjdCBcdTIxOTIgZGVjaXNpb25fb3Bwb3J0dW5pdHkpIGlzIFJFVElSRUQgYW5kIHN0YXlzXG4gICAgLy8gdmFjYW50OyBgZTM0YCByZXBsYWNlcyBpdC4gRWFjaCBwYWlyIGJlbG93IGlzIFRPVEFMIGFuZCBQQVJUSVRJT05JTkcsIGFuZFxuICAgIC8vIG9ubHkgYSBmbGFnIHRoZSBsZWFkIGNhcnJpZXMgYXMgYHRydWVgIHRha2VzIHRoZSByYWlzZS5cbiAgICB7IGlkOiAnZTM0Jywgc291cmNlOiAndXNlX2V4aXN0aW5nX2NvbnRhY3QnLCB0YXJnZXQ6ICdkZWNpc2lvbl9jb250YWN0X2RvX25vdF9jYWxsJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UzNScsIHNvdXJjZTogJ2RlY2lzaW9uX2NvbnRhY3RfZG9fbm90X2NhbGwnLCB0YXJnZXQ6ICdyYWlzZV9jb250YWN0X2RvX25vdF9jYWxsJywgdHlwZTogJ2RlZmF1bHQnLCBjb25kaXRpb246IFBgaGFzKHZhcnMubGVhZFJlY29yZCkgJiYgaGFzKHZhcnMubGVhZFJlY29yZC5kb19ub3RfY2FsbCkgJiYgdmFycy5sZWFkUmVjb3JkLmRvX25vdF9jYWxsID09IHRydWVgLCBsYWJlbDogJ0RvIG5vdCBjYWxsJyB9LFxuICAgIHsgaWQ6ICdlMzYnLCBzb3VyY2U6ICdkZWNpc2lvbl9jb250YWN0X2RvX25vdF9jYWxsJywgdGFyZ2V0OiAnZGVjaXNpb25fY29udGFjdF9lbWFpbF9vcHRfb3V0JywgdHlwZTogJ2RlZmF1bHQnLCBjb25kaXRpb246IFBgIWhhcyh2YXJzLmxlYWRSZWNvcmQpIHx8ICFoYXModmFycy5sZWFkUmVjb3JkLmRvX25vdF9jYWxsKSB8fCB2YXJzLmxlYWRSZWNvcmQuZG9fbm90X2NhbGwgIT0gdHJ1ZWAsIGxhYmVsOiAnQ2FsbGFibGUnIH0sXG4gICAgeyBpZDogJ2UzNycsIHNvdXJjZTogJ3JhaXNlX2NvbnRhY3RfZG9fbm90X2NhbGwnLCB0YXJnZXQ6ICdkZWNpc2lvbl9jb250YWN0X2VtYWlsX29wdF9vdXQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTM4Jywgc291cmNlOiAnZGVjaXNpb25fY29udGFjdF9lbWFpbF9vcHRfb3V0JywgdGFyZ2V0OiAncmFpc2VfY29udGFjdF9lbWFpbF9vcHRfb3V0JywgdHlwZTogJ2RlZmF1bHQnLCBjb25kaXRpb246IFBgaGFzKHZhcnMubGVhZFJlY29yZCkgJiYgaGFzKHZhcnMubGVhZFJlY29yZC5lbWFpbF9vcHRfb3V0KSAmJiB2YXJzLmxlYWRSZWNvcmQuZW1haWxfb3B0X291dCA9PSB0cnVlYCwgbGFiZWw6ICdPcHRlZCBvdXQnIH0sXG4gICAgeyBpZDogJ2UzOScsIHNvdXJjZTogJ2RlY2lzaW9uX2NvbnRhY3RfZW1haWxfb3B0X291dCcsIHRhcmdldDogJ2RlY2lzaW9uX29wcG9ydHVuaXR5JywgdHlwZTogJ2RlZmF1bHQnLCBjb25kaXRpb246IFBgIWhhcyh2YXJzLmxlYWRSZWNvcmQpIHx8ICFoYXModmFycy5sZWFkUmVjb3JkLmVtYWlsX29wdF9vdXQpIHx8IHZhcnMubGVhZFJlY29yZC5lbWFpbF9vcHRfb3V0ICE9IHRydWVgLCBsYWJlbDogJ0VtYWlsYWJsZScgfSxcbiAgICB7IGlkOiAnZTQwJywgc291cmNlOiAncmFpc2VfY29udGFjdF9lbWFpbF9vcHRfb3V0JywgdGFyZ2V0OiAnZGVjaXNpb25fb3Bwb3J0dW5pdHknLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTE2Jywgc291cmNlOiAnZGVjaXNpb25fb3Bwb3J0dW5pdHknLCB0YXJnZXQ6ICdjcmVhdGVfb3Bwb3J0dW5pdHknLCB0eXBlOiAnZGVmYXVsdCcsIGNvbmRpdGlvbjogUGB2YXJzLmNyZWF0ZU9wcG9ydHVuaXR5ID09IHRydWVgLCBsYWJlbDogJ1llcycgfSxcbiAgICB7IGlkOiAnZTE3Jywgc291cmNlOiAnZGVjaXNpb25fb3Bwb3J0dW5pdHknLCB0YXJnZXQ6ICdub19vcHBvcnR1bml0eScsIHR5cGU6ICdkZWZhdWx0JywgY29uZGl0aW9uOiBQYHZhcnMuY3JlYXRlT3Bwb3J0dW5pdHkgIT0gdHJ1ZWAsIGxhYmVsOiAnTm8nIH0sXG4gICAgeyBpZDogJ2UxOCcsIHNvdXJjZTogJ2NyZWF0ZV9vcHBvcnR1bml0eScsIHRhcmdldDogJ3VzZV9uZXdfb3Bwb3J0dW5pdHknLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTE4YScsIHNvdXJjZTogJ3VzZV9uZXdfb3Bwb3J0dW5pdHknLCB0YXJnZXQ6ICdtYXJrX2NvbnZlcnRlZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMThiJywgc291cmNlOiAnbm9fb3Bwb3J0dW5pdHknLCB0YXJnZXQ6ICdtYXJrX2NvbnZlcnRlZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMTknLCBzb3VyY2U6ICdtYXJrX2NvbnZlcnRlZCcsIHRhcmdldDogJ3NlbmRfbm90aWZpY2F0aW9uJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyMCcsIHNvdXJjZTogJ3NlbmRfbm90aWZpY2F0aW9uJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3MvbGVhZC1jb252ZXJzaW9uLWFwcHJvdmFsLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3MvbGVhZC1jb252ZXJzaW9uLWFwcHJvdmFsLmZsb3cudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IFAsIGNlbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcbnR5cGUgRmxvdyA9IEF1dG9tYXRpb24uRmxvdztcblxuLyoqXG4gKiBMZWFkIENvbnZlcnNpb24gQXBwcm92YWwgXHUyMDE0IHNpZ24tb2ZmIGJlZm9yZSBhIGxlYWQgbWF5IGJlY29tZSBhIGRlYWwuXG4gKlxuICogUkVRLTAwMDUgc3RlcCA3OiBcdTMwMENcdTdFQkZcdTdEMjJcdTVCRjlcdTVFOTRcdTVCQTFcdTYyNzlcdTZENDFcdTdBMEJcdUZGMENcdTVCQTFcdTYyNzlcdTkwMUFcdThGQzdcdTU0MEVcdTY1QjlcdTUzRUZcdThGNkNcdTUzMTZcdTRFM0FcdTZCNjNcdTVGMEZcdTU1NDZcdTY3M0FcdTMwMEQuIEV4cHJlc3NlZCBhcyBhblxuICogKiphcHByb3ZhbCBub2RlKiogKGB0eXBlOiAnYXBwcm92YWwnYCwgQURSLTAwMTkpLCB0aGUgY29uc3RydWN0XG4gKiBgb3Bwb3J0dW5pdHktYXBwcm92YWwuZmxvdy50c2AgYWxyZWFkeSB1c2VzIFx1MjAxNCBcdTI2RDQgdGhlcmUgaXMgbm8gYHdvcmtmbG93YFxuICogbWV0YWRhdGEgdHlwZSBhbmQgbm8gc3RhbmRhbG9uZSBgQXBwcm92YWxQcm9jZXNzYCB0byBhdXRob3IuXG4gKlxuICogIyMgXHUyNkEwXHVGRTBGIFRoaXMgZmxvdyBpcyBJTkVSVCB1bnRpbCBhbiBpbnN0YWxsIGFybXMgdGhlIGdhdGUsIGFuZCB0aGF0IGlzIGJ5IGRlc2lnblxuICpcbiAqIFJFUS0wMDA1OiBcIlRoZSBnYXRlIG11c3QgYmUgY29uZmlndXJhYmxlIFx1MjAxNCBvZmYgYnkgZGVmYXVsdC4gQSBzaW5nbGUtc2VsbGVyXG4gKiBpbnN0YWxsIG11c3Qgbm90IGJlIGZvcmNlZCB0aHJvdWdoIGFuIGFwcHJvdmFsIHRvIGNvbnZlcnQgYSBsZWFkLlwiXG4gKlxuICogVGhlIHN3aXRjaCBpcyBgY3JtX2xlYWQuY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXNgJ3MgYGRlZmF1bHRWYWx1ZWAsIG5vdCB0aGlzXG4gKiBmbG93J3MgYHN0YXR1c2AuIFNoaXBwZWQsIHRoYXQgZGVmYXVsdCBpcyBgbm90X3JlcXVpcmVkYCwgc28gTk8gbGVhZCBpcyBldmVyXG4gKiBib3JuIGBwZW5kaW5nYCBhbmQgdGhlIHN0YXJ0IGNvbmRpdGlvbiBiZWxvdyBpcyBmYWxzZSBmb3IgZXZlcnkgcmVjb3JkIHRoYXRcbiAqIGhhcyBldmVyIGV4aXN0ZWQgXHUyMDE0IHRoZSBmbG93IHJlZ2lzdGVycywgYmluZHMgaXRzIHRyaWdnZXIsIG9wZW5zIG5vdGhpbmcsIGFuZFxuICogY29zdHMgYSBwcmVkaWNhdGUgZXZhbHVhdGlvbiBwZXIgaW5zZXJ0LiBBbiBpbnN0YWxsIGFybXMgdGhlIGdhdGUgYnkgY2hhbmdpbmdcbiAqIHRoYXQgb25lIHZhbHVlIHRvIGAncGVuZGluZydgOyBmcm9tIHRoZW4gb24gZXZlcnkgTkVXIGxlYWQgZW50ZXJzIGhlcmUsIGFuZFxuICogYGxlYWQuaG9vay50c2AgcmVmdXNlcyBpdHMgY29udmVyc2lvbiB1bnRpbCB0aGlzIGZsb3cgd3JpdGVzIGEgdmVyZGljdC5cbiAqXG4gKiBcdTI2RDQgRG8gTk9UIHJlYWNoIGZvciBgc3RhdHVzOiAnZHJhZnQnYCBhcyB0aGUgb2ZmIHN3aXRjaCBpbnN0ZWFkLiBNZWFzdXJlZCBvblxuICogYEBvYmplY3RzdGFjay9zZXJ2aWNlLWF1dG9tYXRpb25gIDE3LjQuMCwgd2hvc2Ugb3duIHJlZ2lzdHJhdGlvblxuICogZGlhZ25vc3RpYyBzYXlzIGl0IGluIGFzIG1hbnkgd29yZHMgXHUyMDE0IFwiZHJhZnQgZmxvd3Mgc3RpbGwgZmlyZSB0aGVpciB0cmlnZ2VycztcbiAqIHNldCBzdGF0dXM6ICdhY3RpdmUnIHRvIG1ha2UgaW50ZW50IGV4cGxpY2l0LCBvciAnb2Jzb2xldGUnIHRvIGRpc2FibGVcIi4gQW5kXG4gKiBcdTI2RDQgbm90IGAnb2Jzb2xldGUnYCBlaXRoZXI6IGBpc0Zsb3dFbmFibGVkYCBjb21wb3NlcyB0aGUgYXV0aG9yaW5nIHN0YXR1cyB3aXRoXG4gKiB0aGUgaW5zdGFsbGF0aW9uJ3MgYWN0aXZhdGlvbiBsZWRnZXIgc28gdGhhdCBcImVpdGhlciBvbmUgZGlzYXJtczsgbmVpdGhlciBjYW5cbiAqIG92ZXJyaWRlIHRoZSBvdGhlclwiLCB3aGljaCBtYWtlcyBgb2Jzb2xldGVgIGEgZ2F0ZSBubyBpbnN0YWxsIGNhbiBldmVyIHR1cm5cbiAqIE9OIFx1MjAxNCB0aGUgb3Bwb3NpdGUgb2YgY29uZmlndXJhYmxlLiBBIGNvbmRpdGlvbiBubyByZWNvcmQgc2F0aXNmaWVzIGlzIG9mZiBBTkRcbiAqIHN3aXRjaGFibGU7IGEgZGlzYWJsZWQgZmxvdyBpcyBvbmx5IG9mZi5cbiAqXG4gKiAjIyBXaHkgdGhlIHRyaWdnZXIgaXMgaW5zZXJ0LW9ubHlcbiAqXG4gKiBgcGVuZGluZ2AgYXBwZWFycyBhdCBleGFjdGx5IG9uZSBtb21lbnQgXHUyMDE0IHRoZSBmaWVsZCBkZWZhdWx0LCBzdGFtcGVkIGFzIHRoZVxuICogcm93IGlzIHdyaXR0ZW4gXHUyMDE0IHNvIHRoZSByZXF1ZXN0IGlzIG9wZW5lZCB3aGVyZSBpdCBhcHBlYXJzLiBcdTI2RDQgQW4gYWZ0ZXJVcGRhdGVcbiAqIHR3aW4gKHRoZSBzaGFwZSBgb3Bwb3J0dW5pdHlfYXBwcm92YWxgIG5lZWRzLCBiZWNhdXNlIGEgZGVhbCBjYW4gR1JPVyBhY3Jvc3NcbiAqIGl0cyB0aHJlc2hvbGQpIHdvdWxkIHJlLWVudGVyIG9uIGV2ZXJ5IGVkaXQgbWFkZSB3aGlsZSB0aGUgbGVhZCBzYXQgcGVuZGluZ1xuICogYW5kIG9wZW4gYSBzZWNvbmQgcmVxdWVzdCBmb3IgdGhlIHNhbWUgZGVjaXNpb24uXG4gKlxuICogXHUyMUQyIEEgbGVhZCB0aGF0IHByZWRhdGVzIHRoZSBhcm1pbmcga2VlcHMgYG5vdF9yZXF1aXJlZGAgYW5kIG5ldmVyIGVudGVycywgd2hpY2hcbiAqIGlzIFJFUS0wMDA1IGFjY2VwdGFuY2UgNCBob2xkaW5nIGJ5IGNvbnN0cnVjdGlvbjogYXJtaW5nIHRoZSBnYXRlIGludmFsaWRhdGVzXG4gKiBubyBleGlzdGluZyByZWNvcmQuXG4gKi9cbmV4cG9ydCBjb25zdCBMZWFkQ29udmVyc2lvbkFwcHJvdmFsRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2xlYWRfY29udmVyc2lvbl9hcHByb3ZhbCcsXG4gIGxhYmVsOiAnTGVhZCBDb252ZXJzaW9uIEFwcHJvdmFsJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1NpZ24tb2ZmIGEgbGVhZCBuZWVkcyBiZWZvcmUgaXQgbWF5IGJlIGNvbnZlcnRlZC4gSW5lcnQgdW5sZXNzIHRoZSBpbnN0YWxsIGFybXMgdGhlIGdhdGUgb24gY3JtX2xlYWQuY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXMuJyxcbiAgdHlwZTogJ3JlY29yZF9jaGFuZ2UnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBTYW1lIHJlYWRpbmcgYG9wcG9ydHVuaXR5X2FwcHJvdmFsYCByZWNvcmRzLCBhbmQgZm9yIHRoZSBzYW1lIHR3byByZWFzb25zLlxuICAvLyBBIGdhdGUgZXhpc3RzIHRvIENPTlNUUkFJTiB0aGUgc3VibWl0dGVyLCBzbyB0aGUgc3VibWl0dGVyJ3Mgb3duIHNjb3BlIGlzXG4gIC8vIHRoZSB3cm9uZyBpZGVudGl0eSB0byBldmFsdWF0ZSBpdCB1bmRlciBcdTIwMTQgYW5kIGFuIGFwcHJvdmFsIGNvbnRyb2wgdGhhdFxuICAvLyBlbmdhZ2VzIG9ubHkgZm9yIHdyaXRlcnMgY2FycnlpbmcgYSBzZXNzaW9uIGlzIG5vdCBhIGNvbnRyb2wsIHNpbmNlIGFcbiAgLy8gYHJ1bkFzOiAnc3lzdGVtJ2AgaW1wb3J0ZXIgY3JlYXRpbmcgbGVhZHMgd291bGQgc2ltcGx5IGJ5cGFzcyBpdC4gVGhlXG4gIC8vIHZlcmRpY3Qgd3JpdGVzIGJlbG93IGFsc28gbGFuZCBvbiBgY29udmVyc2lvbl9hcHByb3ZhbF9zdGF0dXNgLCB3aGljaCBpc1xuICAvLyBgcmVhZG9ubHk6IHRydWVgIG9uIHRoZSBvYmplY3QsIHNvIG9ubHkgYSBwbGF0Zm9ybSB3cml0ZSByZWFjaGVzIGl0LlxuICBydW5BczogJ3N5c3RlbScsXG5cbiAgdmFyaWFibGVzOiBbXG4gICAgeyBuYW1lOiAnbGVhZElkJywgdHlwZTogJ3RleHQnLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgXSxcblxuICBub2RlczogW1xuICAgIHtcbiAgICAgIGlkOiAnc3RhcnQnLFxuICAgICAgdHlwZTogJ3N0YXJ0JyxcbiAgICAgIGxhYmVsOiAnU3RhcnQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fbGVhZCcsXG4gICAgICAgIHRyaWdnZXJUeXBlOiAncmVjb3JkLWFmdGVyLWNyZWF0ZScsXG4gICAgICAgIC8vIFRPVEFMSVRZIChBR0VOVFMubWQgXHUyMDE0IHZhbGlkYXRpb24gcHJlZGljYXRlcyBtdXN0IGJlIFRPVEFMKTogYGhhcygpYFxuICAgICAgICAvLyBvbiBldmVyeSByZWFkLiBBIGZsb3cgY29uZGl0aW9uIGlzIHN0cmljdCBDRUwgb24gZXZlcnkgcnVuLCBhbmQgYW5cbiAgICAgICAgLy8gdW5ndWFyZGVkIHJlYWQgYWdhaW5zdCBhIGRyaXZlciB0aGF0IG9taXRzIGFic2VudCBjb2x1bW5zIGFib3J0cyBcdTIwMTRcbiAgICAgICAgLy8gd2hpY2ggZnJvbSAxNy4wLjAtcmMuMiBGQUlMUyBUSEUgUlVOIHJhdGhlciB0aGFuIHNraXBwaW5nIGl0LiBUaGVcbiAgICAgICAgLy8gYWJzZW50IGNhc2UgbXVzdCByZWFkIGFzIFwibm90IGdhdGVkXCI6IGEgbGVhZCB3aXRoIG5vIGFwcHJvdmFsIGNvbHVtblxuICAgICAgICAvLyBhdCBhbGwgaXMgYSBsZWFkIGZyb20gYmVmb3JlIHRoZSBmaWVsZCBleGlzdGVkLCBhbmQgaXQgY29udmVydHMgdGhlXG4gICAgICAgIC8vIHdheSBpdCBhbHdheXMgZGlkLlxuICAgICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5jb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1cykgJiYgcmVjb3JkLmNvbnZlcnNpb25fYXBwcm92YWxfc3RhdHVzID09IFwicGVuZGluZ1wiYCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2dldF9sZWFkJyxcbiAgICAgIHR5cGU6ICdnZXRfcmVjb3JkJyxcbiAgICAgIGxhYmVsOiAnR2V0IExlYWQnLFxuICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fbGVhZCcsIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZC5pZGAgfSwgb3V0cHV0VmFyaWFibGU6ICdsZWFkUmVjb3JkJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdjb252ZXJzaW9uX3JldmlldycsXG4gICAgICB0eXBlOiAnYXBwcm92YWwnLFxuICAgICAgbGFiZWw6ICdMZWFkIENvbnZlcnNpb24gUmV2aWV3JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBUaGUgY3VzdG9tZXIncyBjaGFpbiBpcyBcdTk1MDBcdTU1MkVcdThEMUZcdThEMjNcdTRFQkEgXHUyMTkyIFx1OTUwMFx1NTUyRVx1NjAzQlx1NzZEMTsgdGhlIGdlbmVyaWMgc2hhcGUgY29yZVxuICAgICAgICAvLyBzaGlwcyBpcyB0aGUgbWFuYWdlciBiZW5jaCB0aGlzIGFwcCBhbHJlYWR5IGRlY2xhcmVzIGFwcHJvdmVyc1xuICAgICAgICAvLyBhZ2FpbnN0LiBBIHNlY29uZCB0aWVyLCBvciBhIGRpZmZlcmVudCBwb3NpdGlvbiwgaXMgb3ZlcmxheVxuICAgICAgICAvLyBjb25maWd1cmF0aW9uIFx1MjAxNCB0aGUgc2FtZSBzdGF0dXMgYXMgdGhlIG5lZWQtdHlwZSB2b2NhYnVsYXJ5LlxuICAgICAgICBhcHByb3ZlcnM6IFt7IHR5cGU6ICdwb3NpdGlvbicsIHZhbHVlOiAnc2FsZXNfbWFuYWdlcicgfV0sXG4gICAgICAgIC8vIEV4cGxpY2l0IHRob3VnaCBpdCBpcyB0aGUgc2NoZW1hIGRlZmF1bHQsIGV4YWN0bHkgYXNcbiAgICAgICAgLy8gYG9wcG9ydHVuaXR5X2FwcHJvdmFsYCBhdXRob3JzIGl0OiBhcHByb3ZlcnMgc25hcHNob3QgYXQgcmVxdWVzdFxuICAgICAgICAvLyBjcmVhdGlvbiwgc28gYW4gZW1wdHkgYmVuY2ggd291bGQgb3RoZXJ3aXNlIGxlYXZlIHRoZSByZXF1ZXN0XG4gICAgICAgIC8vIHVuZGVjaWRhYmxlIFx1MjAxNCBhbmQgaGVyZSB0aGF0IG1lYW5zIGEgbGVhZCBub2JvZHkgY2FuIGV2ZXIgY29udmVydC5cbiAgICAgICAgb25FbXB0eUFwcHJvdmVyczogJ2FkbWluX3Jlc2N1ZScsXG4gICAgICAgIGJlaGF2aW9yOiAnZmlyc3RfcmVzcG9uc2UnLFxuICAgICAgICAvLyBcdTI2QTBcdUZFMEYgYGZhbHNlYCwgYW5kIE5PVCB0aGUgc2NoZW1hIGRlZmF1bHQgYHRydWVgIFx1MjAxNCB0aGUgb25lIHBsYWNlIHRoaXNcbiAgICAgICAgLy8gbm9kZSBkZWxpYmVyYXRlbHkgZGlmZmVycyBmcm9tIGl0cyBvcHBvcnR1bml0eSBzaWJsaW5nLiBBIGRlYWwgdW5kZXJcbiAgICAgICAgLy8gcmV2aWV3IGlzIGEgZG9jdW1lbnQgYmVpbmcgbmVnb3RpYXRlZDsgYSBMRUFEIHVuZGVyIHJldmlldyBpcyBhIHBlcnNvblxuICAgICAgICAvLyBhIHJlcCBpcyBzdGlsbCBjYWxsaW5nLiBMb2NraW5nIHRoZSByZWNvcmQgd291bGQgZnJlZXplXG4gICAgICAgIC8vIGBsYXN0X2NvbnRhY3RlZF9kYXRlYCwgYG5leHRfZm9sbG93dXBfZGF0ZWAsIHRoZSBub3RlcyBhbmQgZXZlcnlcbiAgICAgICAgLy8gYWN0aXZpdHkgYnViYmxlIGZvciBhcyBsb25nIGFzIHRoZSBhcHByb3ZlciB0YWtlcywgc28gdGhlIGdhdGUgd291bGRcbiAgICAgICAgLy8gc3RvcCB0aGUgd29yayBpdCBleGlzdHMgdG8gYXV0aG9yaXNlLiBOb3RoaW5nIGlzIGF0IHJpc2sgaW4gbGVhdmluZyBpdFxuICAgICAgICAvLyBvcGVuOiB0aGUgdmVyZGljdCBjb2x1bW4gaXMgYHJlYWRvbmx5OiB0cnVlYCwgc28gdGhlIG9ubHkgZmllbGQgdGhpc1xuICAgICAgICAvLyBub2RlJ3MgZGVjaXNpb24gdG91Y2hlcyBpcyBvbmUgbm8gdXNlciBtYXkgd3JpdGUgYW55d2F5LlxuICAgICAgICBsb2NrUmVjb3JkOiBmYWxzZSxcbiAgICAgICAgYXBwcm92YWxTdGF0dXNGaWVsZDogJ2NvbnZlcnNpb25fYXBwcm92YWxfc3RhdHVzJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ21hcmtfYXBwcm92ZWQnLFxuICAgICAgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLFxuICAgICAgbGFiZWw6ICdNYXJrIEFwcHJvdmVkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2xlYWQnLFxuICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBjb252ZXJzaW9uX2FwcHJvdmFsX3N0YXR1czogJ2FwcHJvdmVkJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnbm90aWZ5X2FwcHJvdmVkJyxcbiAgICAgIHR5cGU6ICdub3RpZnknLFxuICAgICAgbGFiZWw6ICdOb3RpZnkgT3duZXIgXHUyMDE0IEFwcHJvdmVkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICByZWNpcGllbnRzOiBbY2VsYGhhcyhsZWFkUmVjb3JkLm93bmVyX2lkKSA/IGxlYWRSZWNvcmQub3duZXJfaWQgOiBudWxsYF0sXG4gICAgICAgIGNoYW5uZWxzOiBbJ2luYm94J10sXG4gICAgICAgIHRvcGljOiAnbGVhZF9jb252ZXJzaW9uX2FwcHJvdmVkJyxcbiAgICAgICAgdGVtcGxhdGU6ICdjcm0ubGVhZF9jb252ZXJzaW9uX2FwcHJvdmVkJyxcbiAgICAgICAgdGVtcGxhdGVEYXRhOiB7IGZpcnN0X25hbWU6IGNlbGBsZWFkUmVjb3JkLmZpcnN0X25hbWVgLCBsYXN0X25hbWU6IGNlbGBsZWFkUmVjb3JkLmxhc3RfbmFtZWAgfSxcbiAgICAgICAgYWN0aW9uVXJsOiAnL2NybV9sZWFkL3t7cmVjb3JkLmlkfX0nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnbWFya19yZWplY3RlZCcsXG4gICAgICB0eXBlOiAndXBkYXRlX3JlY29yZCcsXG4gICAgICBsYWJlbDogJ01hcmsgUmVqZWN0ZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fbGVhZCcsXG4gICAgICAgIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZC5pZGAgfSxcbiAgICAgICAgZmllbGRzOiB7IGNvbnZlcnNpb25fYXBwcm92YWxfc3RhdHVzOiAncmVqZWN0ZWQnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdub3RpZnlfcmVqZWN0ZWQnLFxuICAgICAgdHlwZTogJ25vdGlmeScsXG4gICAgICBsYWJlbDogJ05vdGlmeSBPd25lciBcdTIwMTQgUmVqZWN0ZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtjZWxgaGFzKGxlYWRSZWNvcmQub3duZXJfaWQpID8gbGVhZFJlY29yZC5vd25lcl9pZCA6IG51bGxgXSxcbiAgICAgICAgY2hhbm5lbHM6IFsnaW5ib3gnXSxcbiAgICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgICAgdG9waWM6ICdsZWFkX2NvbnZlcnNpb25fcmVqZWN0ZWQnLFxuICAgICAgICB0ZW1wbGF0ZTogJ2NybS5sZWFkX2NvbnZlcnNpb25fcmVqZWN0ZWQnLFxuICAgICAgICB0ZW1wbGF0ZURhdGE6IHsgZmlyc3RfbmFtZTogY2VsYGxlYWRSZWNvcmQuZmlyc3RfbmFtZWAsIGxhc3RfbmFtZTogY2VsYGxlYWRSZWNvcmQubGFzdF9uYW1lYCB9LFxuICAgICAgICBhY3Rpb25Vcmw6ICcvY3JtX2xlYWQve3tyZWNvcmQuaWR9fScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIHsgaWQ6ICdlMScsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAnZ2V0X2xlYWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdnZXRfbGVhZCcsIHRhcmdldDogJ2NvbnZlcnNpb25fcmV2aWV3JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gQXBwcm92YWwtbm9kZSBicmFuY2ggbGFiZWxzIFx1MjAxNCB0aGUgZW5naW5lIHJlc3VtZXMgZG93biB0aGUgb3V0LWVkZ2Ugd2hvc2VcbiAgICAvLyBgbGFiZWxgIG1hdGNoZXMgdGhlIHJlY29yZGVkIGRlY2lzaW9uLlxuICAgIHsgaWQ6ICdlMycsIHNvdXJjZTogJ2NvbnZlcnNpb25fcmV2aWV3JywgdGFyZ2V0OiAnbWFya19hcHByb3ZlZCcsIHR5cGU6ICdkZWZhdWx0JywgbGFiZWw6ICdhcHByb3ZlJyB9LFxuICAgIHsgaWQ6ICdlNCcsIHNvdXJjZTogJ2NvbnZlcnNpb25fcmV2aWV3JywgdGFyZ2V0OiAnbWFya19yZWplY3RlZCcsIHR5cGU6ICdkZWZhdWx0JywgbGFiZWw6ICdyZWplY3QnIH0sXG4gICAgeyBpZDogJ2U1Jywgc291cmNlOiAnbWFya19hcHByb3ZlZCcsIHRhcmdldDogJ25vdGlmeV9hcHByb3ZlZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlNicsIHNvdXJjZTogJ25vdGlmeV9hcHByb3ZlZCcsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlNycsIHNvdXJjZTogJ21hcmtfcmVqZWN0ZWQnLCB0YXJnZXQ6ICdub3RpZnlfcmVqZWN0ZWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTgnLCBzb3VyY2U6ICdub3RpZnlfcmVqZWN0ZWQnLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9hY2NvdW50LWFwcHJvdmFsLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3MvYWNjb3VudC1hcHByb3ZhbC5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogQWNjb3VudCBBcHByb3ZhbCBcdTIwMTQgdGhlIHNpZ24tb2ZmIGEgbmV3IGFjY291bnQgcmVjb3JkIG5lZWRzIGJlZm9yZSBpdCBjb3VudHNcbiAqIGFzIGVzdGFibGlzaGVkIGRhdGEuXG4gKlxuICogUkVRLTAwMDMgc3RlcCA1OiBcdTMwMENcdTVCQTJcdTYyMzdcdTRGRTFcdTYwNkZcdTYzRDBcdTRFQTRcdTU0MEVcdThGREJcdTUxNjVcdTVCQTFcdTYyNzlcdTZENDFcdUZGMENcdTVCQTFcdTYyNzlcdTkwMUFcdThGQzdcdTU0MEVcdTVCQTJcdTYyMzdcdTZCNjNcdTVGMEZcdTc1MUZcdTY1NDhcdTMwMEQuIEV4cHJlc3NlZCBhcyBhblxuICogKiphcHByb3ZhbCBub2RlKiogKGB0eXBlOiAnYXBwcm92YWwnYCwgQURSLTAwMTkpLCB0aGUgY29uc3RydWN0XG4gKiBgb3Bwb3J0dW5pdHktYXBwcm92YWwuZmxvdy50c2AgYW5kIGBsZWFkLWNvbnZlcnNpb24tYXBwcm92YWwuZmxvdy50c2AgYWxyZWFkeVxuICogdXNlIFx1MjAxNCBcdTI2RDQgdGhlcmUgaXMgbm8gYHdvcmtmbG93YCBtZXRhZGF0YSB0eXBlIGFuZCBubyBzdGFuZGFsb25lXG4gKiBgQXBwcm92YWxQcm9jZXNzYCB0byBhdXRob3IuXG4gKlxuICogIyMgXHUyNkEwXHVGRTBGIFRoaXMgZmxvdyBzaGlwcyBBUk1FRCwgYW5kIHRoYXQgaXMgdGhlIG9uZSBwbGFjZSBpdCBkaWZmZXJzIGZyb20gaXRzXG4gKiAjIyBsZWFkIHNpYmxpbmdcbiAqXG4gKiBgbGVhZC1jb252ZXJzaW9uLWFwcHJvdmFsYCBpcyBpbmVydCB1bnRpbCBhbiBpbnN0YWxsIG9wdHMgaW4sIGJlY2F1c2VcbiAqIFJFUS0wMDA1IGFza2VkIGZvciBhIGdhdGUgdGhhdCBpcyBvZmYgYnkgZGVmYXVsdC4gUkVRLTAwMDMgYXNrcyBmb3IgdGhlXG4gKiBvcHBvc2l0ZSBpbiBhcyBtYW55IHdvcmRzIFx1MjAxNCBhY2NlcHRhbmNlIDQ6IFwiQSBuZXdseSBjcmVhdGVkIGFjY291bnQgc2l0cyBpbiBhXG4gKiBwZW5kaW5nIHN0YXRlLCBhcHBlYXJzIGluIHRoZSBwbGF0Zm9ybSBhcHByb3ZhbCBpbmJveCBIb3RDUk0gYWxyZWFkeSBtb3VudHMsXG4gKiBhbmQgb25seSByZWFjaGVzIHRoZSBhcHByb3ZlZCBzdGF0ZSB0aHJvdWdoIGEgZGVjaXNpb24gb24gdGhhdCByZXF1ZXN0LlwiIFNvXG4gKiBldmVyeSBuZXcgYWNjb3VudCBlbnRlcnMgaGVyZTogYGNybV9hY2NvdW50LmFwcHJvdmFsX3N0YXR1c2Agc2hpcHMgd2l0aCBOT1xuICogZGVmYXVsdCwgYSBuZXcgYWNjb3VudCBpcyBib3JuIGJsYW5rLCBhbmQgdGhlIHN0YXJ0IGNvbmRpdGlvbiBiZWxvdyBmaXJlcyBvblxuICogdGhlIGJsYW5rLlxuICpcbiAqICMjIGBwZW5kaW5nYCBpcyB3cml0dGVuIGJ5IHRoZSByZXF1ZXN0LCBub3QgYnkgdGhlIGZpZWxkIGRlZmF1bHQgKCMyMDY3KVxuICpcbiAqIFRoZSBhcHByb3ZhbCBub2RlJ3MgYGFwcHJvdmFsU3RhdHVzRmllbGRgIG1pcnJvciB3cml0ZXMgYHBlbmRpbmdgIG9udG8gdGhlXG4gKiBhY2NvdW50IHRoZSBtb21lbnQgaXQgb3BlbnMgdGhlIHJlcXVlc3QgKHBsdWdpbi1hcHByb3ZhbHMgYG9wZW5Ob2RlUmVxdWVzdGAsXG4gKiBtZWFzdXJlZCBvbiAxNy43LjApLCBpbnNpZGUgdGhlIGNyZWF0ZSwgc28gd2l0aCBhcHByb3ZhbHMgaW4gdGhlXG4gKiBjb21wb3NpdGlvbiBhY2NlcHRhbmNlIDQgaG9sZHMgZXhhY3RseSBhcyBiZWZvcmUgYW5kIGBwZW5kaW5nYCBhbHdheXMgaGFzIGFcbiAqIHJlcXVlc3QgYmVoaW5kIGl0LiBXaXRob3V0IGFwcHJvdmFscyBubyBleGVjdXRvciBleGlzdHMgZm9yIHRoZSBub2RlLCB0aGVcbiAqIHJ1biBmYWlscyBhdCBpdCAoYE5vIGV4ZWN1dG9yIHJlZ2lzdGVyZWQgZm9yIG5vZGUgdHlwZSAnYXBwcm92YWwnYCksIGFuZFxuICogbm90aGluZyB3cml0ZXMgYHBlbmRpbmdgOiB0aGUgYWNjb3VudCBzdGF5cyBibGFuayBhbmQgZWRpdGFibGUuIEEgc2hpcHBlZFxuICogYHBlbmRpbmdgIGRlZmF1bHQgaGFkIHN0YW1wZWQgZXZlcnkgc3VjaCBhY2NvdW50IGBwZW5kaW5nYCB3aXRoIG5vIHJlcXVlc3RcbiAqIGJlaGluZCBpdCwgYW5kIHRoZSBjb25zb2xlIGRlcml2ZXMgaXRzIGxvY2sgZnJvbSB0aGF0IHZhbHVlLCBzbyBlYWNoIG9uZVxuICogcmVhZCBcImxvY2tlZCBmb3IgYXBwcm92YWxcIiBmb3JldmVyIHdpdGggbm90aGluZyBhYmxlIHRvIGRlY2lkZSBpdC5cbiAqXG4gKiBUaGUgb2ZmIHN3aXRjaCBpcyBzdGlsbCB0aGUgZmllbGQgZGVmYXVsdCwgbm90IHRoaXMgZmxvdydzIGBzdGF0dXNgOiBhblxuICogaW5zdGFsbCB0aGF0IHdhbnRzIG5vIGFjY291bnQgc2lnbi1vZmYgZ2l2ZXMgdGhlIGNvbHVtbiBhIGRlZmF1bHQgb2ZcbiAqIGBhcHByb3ZlZGAsIHRoZSBzdGFydCBjb25kaXRpb24gYmVsb3cgaXMgdGhlbiBmYWxzZSBmb3IgZXZlcnkgcmVjb3JkIHRoYXRcbiAqIHdpbGwgZXZlciBleGlzdCwgYW5kIHRoZSBnYXRlIGlzIG9mZiBBTkQgc3RpbGwgc3dpdGNoYWJsZS4gXHUyNkQ0IERvIE5PVCByZWFjaFxuICogZm9yIGBzdGF0dXM6ICdkcmFmdCdgIG9yIGAnb2Jzb2xldGUnYCBpbnN0ZWFkIFx1MjAxNCBib3RoIHdlcmUgbWVhc3VyZWQgb25cbiAqIGBAb2JqZWN0c3RhY2svc2VydmljZS1hdXRvbWF0aW9uYCAxNy40LjAgYW5kIG5laXRoZXIgaXMgYW4gb2ZmIHN3aXRjaDogZHJhZnRcbiAqIGZsb3dzIHN0aWxsIGZpcmUgdGhlaXIgdHJpZ2dlcnMsIGFuZCBgaXNGbG93RW5hYmxlZGAgY29tcG9zZXMgYXV0aG9yaW5nXG4gKiBzdGF0dXMgd2l0aCB0aGUgaW5zdGFsbGF0aW9uJ3MgYWN0aXZhdGlvbiBsZWRnZXIgc28gdGhhdCBgb2Jzb2xldGVgIGlzIGEgZ2F0ZVxuICogbm8gaW5zdGFsbCBjYW4gZXZlciB0dXJuIGJhY2sgT04uIFRoYXQgbWVhc3VyZW1lbnQgaXMgcmVjb3JkZWQgaW5cbiAqIGBsZWFkLWNvbnZlcnNpb24tYXBwcm92YWwuZmxvdy50c2A7IGl0IGlzIHF1b3RlZCBoZXJlLCBcdTI2RDQgbm90IHJlLWRlcml2ZWQuXG4gKlxuICogIyMgV2h5IHRoZSB0cmlnZ2VyIGlzIGluc2VydC1vbmx5XG4gKlxuICogU3VibWlzc2lvbiBoYXBwZW5zIGF0IGV4YWN0bHkgb25lIG1vbWVudCwgdGhlIGFjY291bnQncyBjcmVhdGlvbiwgc28gdGhhdCBpc1xuICogd2hlcmUgdGhlIHJlcXVlc3QgaXMgb3BlbmVkLiBcdTI2RDQgQW4gYWZ0ZXJVcGRhdGUgdHdpbiB3b3VsZCByZS1lbnRlciBvbiBldmVyeVxuICogZWRpdCBtYWRlIHdoaWxlIHRoZSBhY2NvdW50IHNhdCBibGFuayBvciBwZW5kaW5nIGFuZCBvcGVuIGEgc2Vjb25kIHJlcXVlc3RcbiAqIGZvciB0aGUgc2FtZSBkZWNpc2lvbi4gVGhlIHRyaWdnZXIsIG5vdCB0aGUgY29uZGl0aW9uLCBpcyBhbHNvIHdoYXQga2VlcHMgYW5cbiAqIGFjY291bnQgdGhhdCBwcmVkYXRlcyB0aGlzIGZpZWxkIG91dDogaXQgY2FycmllcyBubyBgYXBwcm92YWxfc3RhdHVzYCwgd2hpY2hcbiAqIHRoZSBjb25kaXRpb24gYmVsb3cgd291bGQgcmVhZCBhcyBibGFuaywgYnV0IGl0IGlzIG5ldmVyIGluc2VydGVkIGFnYWluLCBzb1xuICogaXQgaXMgbmV2ZXIgZHJhZ2dlZCBpbnRvIGFuIGFwcHJvdmFsIGl0IHdhcyBub3QgY3JlYXRlZCB1bmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IEFjY291bnRBcHByb3ZhbEZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICdhY2NvdW50X2FwcHJvdmFsJyxcbiAgbGFiZWw6ICdBY2NvdW50IEFwcHJvdmFsJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ1NpZ24tb2ZmIGEgbmV3bHkgY3JlYXRlZCBhY2NvdW50IG5lZWRzIGJlZm9yZSBpdCBjb3VudHMgYXMgZXN0YWJsaXNoZWQgZGF0YS4gU3dpdGNoYWJsZSBmcm9tIGNybV9hY2NvdW50LmFwcHJvdmFsX3N0YXR1cy4nLFxuICB0eXBlOiAncmVjb3JkX2NoYW5nZScsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG4gIC8vIFNhbWUgcmVhZGluZyB0aGUgdHdvIHNpYmxpbmcgYXBwcm92YWwgZmxvd3MgcmVjb3JkLiBBIGdhdGUgZXhpc3RzIHRvXG4gIC8vIENPTlNUUkFJTiB0aGUgc3VibWl0dGVyLCBzbyB0aGUgc3VibWl0dGVyJ3Mgb3duIHNjb3BlIGlzIHRoZSB3cm9uZyBpZGVudGl0eVxuICAvLyB0byBldmFsdWF0ZSBpdCB1bmRlcjsgYW5kIHRoZSB2ZXJkaWN0IHdyaXRlcyBiZWxvdyBsYW5kIG9uXG4gIC8vIGBhcHByb3ZhbF9zdGF0dXNgLCB3aGljaCBpcyBgcmVhZG9ubHk6IHRydWVgIG9uIHRoZSBvYmplY3QsIHNvIG9ubHkgYVxuICAvLyBwbGF0Zm9ybSB3cml0ZSByZWFjaGVzIGl0IGF0IGFsbC5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuXG4gIHZhcmlhYmxlczogW3sgbmFtZTogJ2FjY291bnRJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH1dLFxuXG4gIG5vZGVzOiBbXG4gICAge1xuICAgICAgaWQ6ICdzdGFydCcsXG4gICAgICB0eXBlOiAnc3RhcnQnLFxuICAgICAgbGFiZWw6ICdTdGFydCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9hY2NvdW50JyxcbiAgICAgICAgdHJpZ2dlclR5cGU6ICdyZWNvcmQtYWZ0ZXItY3JlYXRlJyxcbiAgICAgICAgLy8gRmlyZXMgb24gdGhlIEJMQU5LIGEgbmV3IGFjY291bnQgaXMgYm9ybiB3aXRoIChzZWUgdGhlIGhlYWRlcik6XG4gICAgICAgIC8vIGFic2VudCBvbiBhIHNwYXJzZSBkcml2ZXIsIG51bGwgb24gU1FMLiBBIHVzZXIgY2Fubm90IHByZS1maWxsIHRoZVxuICAgICAgICAvLyBjb2x1bW4gKGl0IGlzIGByZWFkb25seWApLCBzbyBvbmx5IGEgc3lzdGVtIHdyaXRlciBvciBhbiBpbnN0YWxsJ3NcbiAgICAgICAgLy8gYGFwcHJvdmVkYCBkZWZhdWx0IGNhbiBtYWtlIGl0IG5vbi1ibGFuayBhdCBpbnNlcnQsIGFuZCBib3RoIG1lYW5cbiAgICAgICAgLy8gXCJub3RoaW5nIHRvIHN1Ym1pdFwiLlxuICAgICAgICAvLyBUT1RBTElUWSAoQUdFTlRTLm1kIFx1MjAxNCB2YWxpZGF0aW9uIHByZWRpY2F0ZXMgbXVzdCBiZSBUT1RBTCk6IHRoZVxuICAgICAgICAvLyBgKCFoYXMoeCkgfHwgaXNCbGFuayh4KSlgIGZvcm0gaXMgdGhlIFwieCBob2xkcyBubyB2YWx1ZVwiIHJvdyBvZiB0aGF0XG4gICAgICAgIC8vIHRhYmxlLiBBIGZsb3cgY29uZGl0aW9uIGlzIHN0cmljdCBDRUwgb24gZXZlcnkgcnVuLCBhbmQgYW4gdW5ndWFyZGVkXG4gICAgICAgIC8vIHJlYWQgYWdhaW5zdCBhIGRyaXZlciB0aGF0IG9taXRzIGFic2VudCBjb2x1bW5zIGFib3J0cyBcdTIwMTQgd2hpY2ggZnJvbVxuICAgICAgICAvLyAxNy4wLjAtcmMuMiBGQUlMUyBUSEUgUlVOIHJhdGhlciB0aGFuIHNraXBwaW5nIGl0LlxuICAgICAgICBjb25kaXRpb246IFBgIWhhcyhyZWNvcmQuYXBwcm92YWxfc3RhdHVzKSB8fCBpc0JsYW5rKHJlY29yZC5hcHByb3ZhbF9zdGF0dXMpYCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2dldF9hY2NvdW50JyxcbiAgICAgIHR5cGU6ICdnZXRfcmVjb3JkJyxcbiAgICAgIGxhYmVsOiAnR2V0IEFjY291bnQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fYWNjb3VudCcsXG4gICAgICAgIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZC5pZGAgfSxcbiAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdhY2NvdW50UmVjb3JkJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2FjY291bnRfcmV2aWV3JyxcbiAgICAgIHR5cGU6ICdhcHByb3ZhbCcsXG4gICAgICBsYWJlbDogJ0FjY291bnQgUmV2aWV3JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBUaGUgY3VzdG9tZXIncyBjaGFpbiBpcyBcdTk1MDBcdTU1MkVcdThEMUZcdThEMjNcdTRFQkEgXHUyMTkyIFx1OTUwMFx1NTUyRVx1NjAzQlx1NzZEMTsgUkVRLTAwMDMgcnVsZXMgdGhhdCBuYW1lZFxuICAgICAgICAvLyBjaGFpbiAqKkMqKiAob3ZlcmxheSBcdTIwMTQgb25lIGNvbXBhbnkncyBvcmcgY2hhcnQpLCBzbyBjb3JlIHNoaXBzIHRoZVxuICAgICAgICAvLyBvbmUgZ2VuZXJpYyB0aWVyIGFnYWluc3QgdGhlIG1hbmFnZXIgYmVuY2ggdGhpcyBhcHAgYWxyZWFkeSBkZWNsYXJlcy5cbiAgICAgICAgYXBwcm92ZXJzOiBbeyB0eXBlOiAncG9zaXRpb24nLCB2YWx1ZTogJ3NhbGVzX21hbmFnZXInIH1dLFxuICAgICAgICAvLyBFeHBsaWNpdCB0aG91Z2ggaXQgaXMgdGhlIHNjaGVtYSBkZWZhdWx0LCBleGFjdGx5IGFzIGJvdGggc2libGluZ1xuICAgICAgICAvLyBmbG93cyBhdXRob3IgaXQ6IGFwcHJvdmVycyBzbmFwc2hvdCBhdCByZXF1ZXN0IGNyZWF0aW9uLCBzbyBhbiBlbXB0eVxuICAgICAgICAvLyBiZW5jaCB3b3VsZCBvdGhlcndpc2UgbGVhdmUgdGhlIHJlcXVlc3QgdW5kZWNpZGFibGUgXHUyMDE0IGFuZCBoZXJlIHRoYXRcbiAgICAgICAgLy8gbWVhbnMgYW4gYWNjb3VudCBub2JvZHkgY2FuIGV2ZXIgYXBwcm92ZS5cbiAgICAgICAgb25FbXB0eUFwcHJvdmVyczogJ2FkbWluX3Jlc2N1ZScsXG4gICAgICAgIGJlaGF2aW9yOiAnZmlyc3RfcmVzcG9uc2UnLFxuICAgICAgICAvLyBcdTI2QTBcdUZFMEYgYGZhbHNlYCwgbWF0Y2hpbmcgdGhlIGxlYWQgc2libGluZyByYXRoZXIgdGhhbiB0aGUgb3Bwb3J0dW5pdHkgb25lLlxuICAgICAgICAvLyBBbiBhY2NvdW50IHVuZGVyIHJldmlldyBpcyBhIHJlY29yZCBhIHJlcCBpcyBzdGlsbCB3b3JraW5nIFx1MjAxNCBjb250YWN0c1xuICAgICAgICAvLyBhcmUgYmVpbmcgYXR0YWNoZWQsIHRoZSBhZGRyZXNzIGlzIGJlaW5nIGNvcnJlY3RlZCwgYWN0aXZpdHkgaXNcbiAgICAgICAgLy8gbGFuZGluZyBvbiBpdC4gTG9ja2luZyBpdCB3b3VsZCBmcmVlemUgZXhhY3RseSB0aGUgZGF0YS1lbnRyeSB0aGVcbiAgICAgICAgLy8gYXBwcm92YWwgZXhpc3RzIHRvIHJldmlldy4gTm90aGluZyBpcyBhdCByaXNrOiB0aGUgdmVyZGljdCBjb2x1bW4gaXNcbiAgICAgICAgLy8gYHJlYWRvbmx5OiB0cnVlYCwgc28gdGhlIG9ubHkgZmllbGQgdGhpcyBkZWNpc2lvbiB0b3VjaGVzIGlzIG9uZSBub1xuICAgICAgICAvLyB1c2VyIG1heSB3cml0ZSBhbnl3YXkuXG4gICAgICAgIGxvY2tSZWNvcmQ6IGZhbHNlLFxuICAgICAgICBhcHByb3ZhbFN0YXR1c0ZpZWxkOiAnYXBwcm92YWxfc3RhdHVzJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ21hcmtfYXBwcm92ZWQnLFxuICAgICAgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLFxuICAgICAgbGFiZWw6ICdNYXJrIEFwcHJvdmVkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2FjY291bnQnLFxuICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ25vdGlmeV9hcHByb3ZlZCcsXG4gICAgICB0eXBlOiAnbm90aWZ5JyxcbiAgICAgIGxhYmVsOiAnTm90aWZ5IE93bmVyIFx1MjAxNCBBcHByb3ZlZCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgcmVjaXBpZW50czogW2NlbGBoYXMoYWNjb3VudFJlY29yZC5vd25lcl9pZCkgPyBhY2NvdW50UmVjb3JkLm93bmVyX2lkIDogbnVsbGBdLFxuICAgICAgICBjaGFubmVsczogWydpbmJveCddLFxuICAgICAgICB0b3BpYzogJ2FjY291bnRfYXBwcm92ZWQnLFxuICAgICAgICB0ZW1wbGF0ZTogJ2NybS5hY2NvdW50X2FwcHJvdmVkJyxcbiAgICAgICAgdGVtcGxhdGVEYXRhOiB7IG5hbWU6IGNlbGBhY2NvdW50UmVjb3JkLm5hbWVgIH0sXG4gICAgICAgIGFjdGlvblVybDogJy9jcm1fYWNjb3VudC97e3JlY29yZC5pZH19JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ21hcmtfcmVqZWN0ZWQnLFxuICAgICAgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLFxuICAgICAgbGFiZWw6ICdNYXJrIFJlamVjdGVkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2FjY291bnQnLFxuICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBhcHByb3ZhbF9zdGF0dXM6ICdyZWplY3RlZCcgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ25vdGlmeV9yZWplY3RlZCcsXG4gICAgICB0eXBlOiAnbm90aWZ5JyxcbiAgICAgIGxhYmVsOiAnTm90aWZ5IE93bmVyIFx1MjAxNCBSZWplY3RlZCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgcmVjaXBpZW50czogW2NlbGBoYXMoYWNjb3VudFJlY29yZC5vd25lcl9pZCkgPyBhY2NvdW50UmVjb3JkLm93bmVyX2lkIDogbnVsbGBdLFxuICAgICAgICBjaGFubmVsczogWydpbmJveCddLFxuICAgICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgICB0b3BpYzogJ2FjY291bnRfcmVqZWN0ZWQnLFxuICAgICAgICB0ZW1wbGF0ZTogJ2NybS5hY2NvdW50X3JlamVjdGVkJyxcbiAgICAgICAgdGVtcGxhdGVEYXRhOiB7IG5hbWU6IGNlbGBhY2NvdW50UmVjb3JkLm5hbWVgIH0sXG4gICAgICAgIGFjdGlvblVybDogJy9jcm1fYWNjb3VudC97e3JlY29yZC5pZH19JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdnZXRfYWNjb3VudCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ2dldF9hY2NvdW50JywgdGFyZ2V0OiAnYWNjb3VudF9yZXZpZXcnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAvLyBBcHByb3ZhbC1ub2RlIGJyYW5jaCBsYWJlbHMgXHUyMDE0IHRoZSBlbmdpbmUgcmVzdW1lcyBkb3duIHRoZSBvdXQtZWRnZSB3aG9zZVxuICAgIC8vIGBsYWJlbGAgbWF0Y2hlcyB0aGUgcmVjb3JkZWQgZGVjaXNpb24uXG4gICAgeyBpZDogJ2UzJywgc291cmNlOiAnYWNjb3VudF9yZXZpZXcnLCB0YXJnZXQ6ICdtYXJrX2FwcHJvdmVkJywgdHlwZTogJ2RlZmF1bHQnLCBsYWJlbDogJ2FwcHJvdmUnIH0sXG4gICAgeyBpZDogJ2U0Jywgc291cmNlOiAnYWNjb3VudF9yZXZpZXcnLCB0YXJnZXQ6ICdtYXJrX3JlamVjdGVkJywgdHlwZTogJ2RlZmF1bHQnLCBsYWJlbDogJ3JlamVjdCcgfSxcbiAgICB7IGlkOiAnZTUnLCBzb3VyY2U6ICdtYXJrX2FwcHJvdmVkJywgdGFyZ2V0OiAnbm90aWZ5X2FwcHJvdmVkJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U2Jywgc291cmNlOiAnbm90aWZ5X2FwcHJvdmVkJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U3Jywgc291cmNlOiAnbWFya19yZWplY3RlZCcsIHRhcmdldDogJ25vdGlmeV9yZWplY3RlZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlOCcsIHNvdXJjZTogJ25vdGlmeV9yZWplY3RlZCcsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL3NjaGVkdWxlLWZvbGxvd3VwLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3Mvc2NoZWR1bGUtZm9sbG93dXAuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xuaW1wb3J0IHsgVEFTS19UWVBFX09QVElPTlMsIHBsYWluT3B0aW9ucyB9IGZyb20gJy4uL29iamVjdHMvX3BpY2tsaXN0cyc7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogU2NoZWR1bGUgRm9sbG93LXVwIFx1MjAxNCBvbmUgc2NyZWVuLCBvbmUgdGFzaywgc3RyYWlnaHQgb2ZmIHRoZSBsZWFkIGhlYWRlci5cbiAqXG4gKiBgbG9nX2NhbGxgIC8gYGxvZ19tZWV0aW5nYCByZWNvcmQgd2hhdCBhbHJlYWR5IGhhcHBlbmVkOyB0aGlzIGZsb3cgcHV0cyB0aGVcbiAqIE5FWFQgdG91Y2ggb24gdGhlIHJlcCdzIGxpc3Qgd2l0aG91dCBsZWF2aW5nIHRoZSBsZWFkIFx1MjAxNCB0aGUgc2luZ2xlIG1vc3RcbiAqIGNvbW1vbiB0aGluZyBhIHJlcCBkb2VzIGFmdGVyIGEgY2FsbC5cbiAqXG4gKiBcdTI2RDQgSW1wbGVtZW50ZWQgYXMgYSBTQ1JFRU4gRkxPVywgbmV2ZXIgYSBgdHlwZTogJ21vZGFsJ2AgYWN0aW9uOiBtb2RhbCBhY3Rpb25zXG4gKiBhcmUgbm9uLWZ1bmN0aW9uYWwgaW4gMTYuMS4wIFx1MjAxNCB0aGUgY29uc29sZSByZXNvbHZlcyB0aGUgYWN0aW9uJ3MgYHRhcmdldGAgYXNcbiAqIGFuIG9iamVjdCBuYW1lIGFuZCB0aGUgc3VibWl0IGRpZXMgb24gYEdFVCAvYXBpL3YxL21ldGEvb2JqZWN0Lzx0YXJnZXQ+YCBcdTIxOTJcbiAqIDQwMCwgZXZlbiB0aG91Z2ggdGhlIHNwZWMgZGVmaW5lcyBgdGFyZ2V0YCBmb3IgbW9kYWxzIGFzIFwidGhlIG1vZGFsL3BhZ2UgbmFtZVxuICogdG8gb3BlblwiLiBGbG93LXR5cGVkIGFjdGlvbnMgYXJlIHRoZSBtZWNoYW5pc20gdGhhdCBkZW1vbnN0cmFibHkgd29ya3MgdG9kYXk7XG4gKiBgY29udmVydF9sZWFkYCB1c2VzIGl0LlxuICovXG5leHBvcnQgY29uc3QgU2NoZWR1bGVGb2xsb3dVcEZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICdzY2hlZHVsZV9mb2xsb3d1cCcsXG4gIGxhYmVsOiAnU2NoZWR1bGUgRm9sbG93LXVwJyxcbiAgZGVzY3JpcHRpb246ICdDcmVhdGUgdGhlIG5leHQgZm9sbG93LXVwIHRhc2sgb24gYSBsZWFkLCBhbHJlYWR5IGxpbmtlZCBhbmQgb3duZWQuJyxcbiAgdHlwZTogJ3NjcmVlbicsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG5cbiAgdmFyaWFibGVzOiBbXG4gICAgLy8gTVVTVCBiZSBgcmVjb3JkSWRgIFx1MjAxNCB0aGUgY29uc29sZSdzIGZsb3ctYWN0aW9uIGNvbnRyYWN0IHNlZWRzIG9ubHkgdGhhdFxuICAgIC8vIG5hbWUgKGFuZCBpdHMgY2FtZWxDYXNlIG9iamVjdCBhbGlhcyk7IGEgY3VzdG9tIG5hbWUgYXJyaXZlcyB1bmRlZmluZWQuXG4gICAgeyBuYW1lOiAncmVjb3JkSWQnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICAgIHsgbmFtZTogJ3N1YmplY3QnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICAgIHsgbmFtZTogJ2R1ZURhdGUnLCB0eXBlOiAnZGF0ZScsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICAgIHsgbmFtZTogJ2FjdGl2aXR5VHlwZScsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAncHJpb3JpdHknLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICAgIHsgbmFtZTogJ25vdGVzJywgdHlwZTogJ3RleHQnLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgXSxcblxuICBub2RlczogW1xuICAgIHsgaWQ6ICdzdGFydCcsIHR5cGU6ICdzdGFydCcsIGxhYmVsOiAnU3RhcnQnLCBjb25maWc6IHsgb2JqZWN0TmFtZTogJ2NybV9sZWFkJyB9IH0sXG4gICAge1xuICAgICAgaWQ6ICdzY3JlZW5fMScsIHR5cGU6ICdzY3JlZW4nLCBsYWJlbDogJ1NjaGVkdWxlIEZvbGxvdy11cCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgeyBuYW1lOiAnc3ViamVjdCcsIGxhYmVsOiAnV2hhdCBpcyB0aGUgbmV4dCBzdGVwPycsIHR5cGU6ICd0ZXh0JywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICB7IG5hbWU6ICdkdWVEYXRlJywgbGFiZWw6ICdEdWUgRGF0ZScsIHR5cGU6ICdkYXRlJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnYWN0aXZpdHlUeXBlJywgbGFiZWw6ICdBY3Rpdml0eSBUeXBlJywgdHlwZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICAvLyBNaXJyb3JzIGNybV90YXNrLnR5cGUgZXhhY3RseS4gXHUyNkQ0IE5ldmVyIGhhbmQtY29weSB0aGUgc3Vic2V0IFx1MjAxNCBpdFxuICAgICAgICAgICAgLy8gc2lsZW50bHkgZHJvcHMgYW4gb3B0aW9uIChgb3RoZXJgKSBmcm9tIHRoZSBwaWNrZXIuXG4gICAgICAgICAgICBvcHRpb25zOiBwbGFpbk9wdGlvbnMoVEFTS19UWVBFX09QVElPTlMpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ3ByaW9yaXR5JywgbGFiZWw6ICdQcmlvcml0eScsIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnTG93JywgdmFsdWU6ICdsb3cnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdOb3JtYWwnLCB2YWx1ZTogJ25vcm1hbCcgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0hpZ2gnLCB2YWx1ZTogJ2hpZ2gnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdVcmdlbnQnLCB2YWx1ZTogJ3VyZ2VudCcgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IG5hbWU6ICdub3RlcycsIGxhYmVsOiAnTm90ZXMnLCB0eXBlOiAndGV4dGFyZWEnIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdnZXRfbGVhZCcsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdHZXQgTGVhZCBSZWNvcmQnLFxuICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fbGVhZCcsIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZElkYCB9LCBvdXRwdXRWYXJpYWJsZTogJ2xlYWRSZWNvcmQnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2NyZWF0ZV90YXNrJywgdHlwZTogJ2NyZWF0ZV9yZWNvcmQnLCBsYWJlbDogJ0NyZWF0ZSBGb2xsb3ctdXAgVGFzaycsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV90YXNrJyxcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgc3ViamVjdDogY2VsYHN1YmplY3RgLFxuICAgICAgICAgIGR1ZV9kYXRlOiBjZWxgZHVlRGF0ZWAsXG4gICAgICAgICAgLy8gVGhlIHRocmVlIG9wdGlvbmFsIGFuc3dlcnM6IGEgcmVzdW1lIG1heSBsZWF2ZSBvbmUgdW5ib3VuZCwgd2hpY2hcbiAgICAgICAgICAvLyB0aGUgdGVtcGxhdGUgd3JvdGUgYXMgbm90aGluZyBhbmQgdGhlIGd1YXJkIHdyaXRlcyBhcyBudWxsLiBPbiBhblxuICAgICAgICAgIC8vIGluc2VydCB0aGUgdHdvIGFyZSB0aGUgc2FtZSBcdTIwMTQgdGhlIGVuZ2luZSBhcHBsaWVzIGEgZmllbGQncyBkZWZhdWx0XG4gICAgICAgICAgLy8gdG8gYW4gZXhwbGljaXQgbnVsbCBleGFjdGx5IGFzIHRvIGFuIG9taXR0ZWQga2V5LCBzbyBhbiB1bmFuc3dlcmVkXG4gICAgICAgICAgLy8gcHJpb3JpdHkgc3RpbGwgbGFuZHMgYXMgYG5vcm1hbGAuXG4gICAgICAgICAgdHlwZTogY2VsYGhhcyh2YXJzLmFjdGl2aXR5VHlwZSkgPyBhY3Rpdml0eVR5cGUgOiBudWxsYCxcbiAgICAgICAgICBwcmlvcml0eTogY2VsYGhhcyh2YXJzLnByaW9yaXR5KSA/IHByaW9yaXR5IDogbnVsbGAsXG4gICAgICAgICAgZGVzY3JpcHRpb246IGNlbGBoYXModmFycy5ub3RlcykgPyBub3RlcyA6IG51bGxgLFxuICAgICAgICAgIHN0YXR1czogJ25vdF9zdGFydGVkJyxcbiAgICAgICAgICBvd25lcl9pZDogY2VsYGN1cnJlbnRfdXNlci5pZGAsXG4gICAgICAgICAgLy8gUG9seW1vcnBoaWMgcGFyZW50OiBib3RoIGhhbHZlcyBhcmUgcmVxdWlyZWQgZm9yIHRoZSBsZWFkJ3NcbiAgICAgICAgICAvLyBSZWxhdGVkIHRhYiB0byBwaWNrIHRoZSB0YXNrIHVwLlxuICAgICAgICAgIHJlbGF0ZWRfdG9fdHlwZTogJ2NybV9sZWFkJyxcbiAgICAgICAgICByZWxhdGVkX3RvX2xlYWQ6IGNlbGByZWNvcmRJZGAsXG4gICAgICAgIH0sXG4gICAgICAgIG91dHB1dFZhcmlhYmxlOiAnY3JlYXRlZFRhc2snLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEtlZXAgdGhlIGxlYWQncyBvd24gZm9sbG93LXVwIGRhdGUgaW4gc3RlcCB3aXRoIHRoZSB0YXNrIHRoYXQgd2FzIGp1c3RcbiAgICAgIC8vIGZpbGVkLCBzbyB0aGUgSG90IExlYWRzIHZpZXcgKHNvcnRlZCBieSBuZXh0X2ZvbGxvd3VwX2RhdGUpIHJlZmxlY3RzXG4gICAgICAvLyB0aGUgY29tbWl0bWVudCB0aGUgcmVwIGFjdHVhbGx5IG1hZGUuXG4gICAgICBpZDogJ3N0YW1wX2xlYWQnLCB0eXBlOiAndXBkYXRlX3JlY29yZCcsIGxhYmVsOiAnU3RhbXAgTmV4dCBGb2xsb3ctdXAgRGF0ZScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9sZWFkJyxcbiAgICAgICAgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkSWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBuZXh0X2ZvbGxvd3VwX2RhdGU6IGNlbGBkdWVEYXRlYCB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG5cbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ3NjcmVlbl8xJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAnc2NyZWVuXzEnLCB0YXJnZXQ6ICdnZXRfbGVhZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMycsIHNvdXJjZTogJ2dldF9sZWFkJywgdGFyZ2V0OiAnY3JlYXRlX3Rhc2snLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTQnLCBzb3VyY2U6ICdjcmVhdGVfdGFzaycsIHRhcmdldDogJ3N0YW1wX2xlYWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTUnLCBzb3VyY2U6ICdzdGFtcF9sZWFkJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3Mvb3Bwb3J0dW5pdHktYXBwcm92YWwuZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9vcHBvcnR1bml0eS1hcHByb3ZhbC5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG5pbXBvcnQgeyBISUdIX1ZBTFVFX0RFQUxfQU1PVU5ULCBMQVJHRV9ERUFMX0FNT1VOVCB9IGZyb20gJy4uL29iamVjdHMvX3RocmVzaG9sZHMnO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIE9wcG9ydHVuaXR5IEFwcHJvdmFsIFx1MjAxNCB0aWVyZWQgc2lnbi1vZmYgZm9yIGxhcmdlIGRlYWxzLlxuICpcbiAqIEV4cHJlc3NlZCBhcyAqKkFwcHJvdmFsIG5vZGVzKiogKGB0eXBlOiAnYXBwcm92YWwnYCwgQURSLTAwMTkpOiB0aGUgZW5naW5lXG4gKiBvcGVucyBhbiBhcHByb3ZhbCByZXF1ZXN0IG9uIGVudHJ5LCBzdXNwZW5kcyB0aGUgcnVuLCBhbmQgcmVzdW1lcyBkb3duIHRoZVxuICogb3V0LWVkZ2Ugd2hvc2UgYGxhYmVsYCBtYXRjaGVzIHRoZSBkZWNpc2lvbiAoYGFwcHJvdmVgIC8gYHJlamVjdGApLlxuICogTm90aWZpY2F0aW9ucyB1c2UgdGhlICoqYG5vdGlmeWAgbm9kZSoqIChBRFItMDAxMikuIFx1MjZENCBOZWl0aGVyIGFcbiAqIGBjb25uZWN0b3JfYWN0aW9uYCBub3IgYSBzdGFuZGFsb25lIGBBcHByb3ZhbFByb2Nlc3NgIGlzIGF2YWlsYWJsZSBcdTIwMTQgYm90aFxuICogYXV0aG9yaW5nIHN1cmZhY2VzIHdlcmUgcmVtb3ZlZCBpbiBPYmplY3RTdGFjayA3LjQuXG4gKlxuICogVGllcmVkIHBvbGljeSAoc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBcdTIwMTQgbm8gZG91YmxlLWZpcmluZyk6XG4gKiAgIC0gYW1vdW50ID49ICQxMDBLICAgICAgICAgXHUyMTkyIFNhbGVzIE1hbmFnZXIgcmV2aWV3XG4gKiAgIC0gYW1vdW50ID4gJDUwMEsgICAgICAgICAgXHUyMTkyIGFkZGl0aW9uYWxseSBTYWxlcyBEaXJlY3RvciBzaWduLW9mZlxuICpcbiAqIFRoZSBlbnRyeSBnYXRlIGlzIElOQ0xVU0lWRSBhdCB0aGUgbGluZSAoYD49YCkgYW5kIHRoZSBkaXJlY3RvciB0aWVyIGlzXG4gKiBleGNsdXNpdmUgKGA+YCk6IHRob3NlIGFyZSBub3QgdGhlIHNhbWUga2luZCBvZiBudW1iZXIuIGBMQVJHRV9ERUFMX0FNT1VOVGAgaXNcbiAqIHRoZSBvbmUgbGluZSB0aGlzIGFwcCBkcmF3cyBhcm91bmQgXCJsYXJnZSBkZWFsXCIsIGFuZCBldmVyeSBjb25zdW1lciBvZiBpdCBcdTIwMTRcbiAqIHRoaXMgZ2F0ZSwgaXRzIGluc2VydCB0d2luLCB0aGUgd29uLWRlYWwgYWxlcnQgYW5kIGJvdGggc2hhcmluZyBydWxlcyBcdTIwMTQgbXVzdFxuICogY3V0IHRoZSBzYW1lIHdheSwgc28gYSBkZWFsIGF0IGV4YWN0bHkgJDEwMCwwMDAgaXMgbGFyZ2UgZXZlcnl3aGVyZSBvclxuICogbm93aGVyZS4gYEhJR0hfVkFMVUVfREVBTF9BTU9VTlRgIGJlbG93IGlzIGEgbWF0Y2hlZCBQQUlSIChgPiA1MDAwMDBgIC9cbiAqIGA8PSA1MDAwMDBgKSB3aG9zZSB0d28gaGFsdmVzIG11c3QgcGFydGl0aW9uLCB3aGljaCBpcyBhIGRpZmZlcmVudCBwcm9wZXJ0eVxuICogYW5kIGlzIGxlZnQgYWxvbmUuXG4gKlxuICogT24gZnVsbCBhcHByb3ZhbCB0aGUgZGVhbCBpcyBzdGFtcGVkIGBhcHByb3ZhbF9zdGF0dXMgPSBhcHByb3ZlZGAgKCsgZGF0ZSk7XG4gKiBhbnkgcmVqZWN0aW9uIHN0YW1wcyBgYXBwcm92YWxfc3RhdHVzID0gcmVqZWN0ZWRgLiBUaGUgcmVjb3JkIGlzIGxvY2tlZCB3aGlsZVxuICogYSBzdGVwIGlzIHBlbmRpbmcgYW5kIGBhcHByb3ZhbF9zdGF0dXNgIG1pcnJvcnMgdGhlIGxpdmUgcmVxdWVzdCBzdGF0dXMuXG4gKi9cbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eUFwcHJvdmFsRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X2FwcHJvdmFsJyxcbiAgbGFiZWw6ICdMYXJnZSBEZWFsIEFwcHJvdmFsJyxcbiAgZGVzY3JpcHRpb246ICdUaWVyZWQgYXBwcm92YWwgZm9yIG9wcG9ydHVuaXRpZXM6IG1hbmFnZXIgcmV2aWV3IGF0ICQxMDBLIG9yIG1vcmUsIGRpcmVjdG9yIHNpZ24tb2ZmID4gJDUwMEsuJyxcbiAgdHlwZTogJ3JlY29yZF9jaGFuZ2UnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBTYW1lIHVzZXItbGVzcyBleHBvc3VyZSBhcyBldmVyeSByZWNvcmQtY2hhbmdlIGZsb3cgKEFEUi0wMDQ5KSBcdTIwMTQgYW5kIHRoZVxuICAvLyBvbmUgd2l0aCB0ZWV0aC4gTWVhc3VyZWQgb24gMTcuMC4wLXJjLjI6IGEgJDE1MEsgcmVuZXdhbFxuICAvLyBjcmVhdGVkIGJ5IHRoZSBgcnVuQXM6ICdzeXN0ZW0nYCBjb250cmFjdF9yZW5ld2FsIHN3ZWVwIGZpcmVkIHRoaXMgZmxvd1xuICAvLyB3aXRoIG5vIHRyaWdnZXIgdXNlciwgYW5kIHRoZSBydW4gZGllZCBhdCBgZ2V0X29wcG9ydHVuaXR5YC4gVGhlIGRlYWwgc2F0XG4gIC8vIGF0IGBhcHByb3ZhbF9zdGF0dXM6ICdub3RfcmVxdWlyZWQnYCwgdW5sb2NrZWQsIHdpdGggbm8gYXBwcm92YWwgcmVxdWVzdFxuICAvLyBldmVyIG9wZW5lZCBcdTIwMTQgdGhlIGdhdGUgd2FzIGJ5cGFzc2VkIGJ5IHRoZSB3cml0ZXIgc2ltcGx5IG5vdCBjYXJyeWluZyBhXG4gIC8vIHNlc3Npb24uIEFuIGFwcHJvdmFsIGNvbnRyb2wgdGhhdCBvbmx5IGVuZ2FnZXMgZm9yIGxvZ2dlZC1pbiB3cml0ZXJzIGlzXG4gIC8vIG5vdCBhIGNvbnRyb2wuXG4gIC8vXG4gIC8vIEVsZXZhdGluZyB0aGUgVVNFUi1kcml2ZW4gcnVucyB0b28gaXMgbm90IG1lcmVseSBhY2NlcHRhYmxlIGhlcmUsIGl0IGlzXG4gIC8vIHJlcXVpcmVkLiBUaGlzIGdhdGUgZXhpc3RzIHRvIENPTlNUUkFJTiB0aGUgc3VibWl0dGVyLCBzbyB0aGUgc3VibWl0dGVyJ3NcbiAgLy8gb3duIHNjb3BlIGlzIHRoZSB3cm9uZyBpZGVudGl0eSB0byBldmFsdWF0ZSBpdCB1bmRlcjsgYW5kXG4gIC8vIGBtYXJrX2FwcHJvdmVkYCAvIGBtYXJrX3JlamVjdGVkYCBzdGFtcCBgYXBwcm92YWxfc3RhdHVzYCBvbiBhIHJlY29yZCB0aGVcbiAgLy8gYXBwcm92YWwgbm9kZSBob2xkcyBsb2NrZWQgKGBsb2NrUmVjb3JkOiB0cnVlYCksIHdoaWNoIG9ubHkgYSBwbGF0Zm9ybVxuICAvLyB3cml0ZSBtYXkgbGFuZC4gVGhlIGFwcHJvdmFsIG5vZGUgaXRzZWxmIGFscmVhZHkgb3BlbnMgaXRzIHJlcXVlc3QgdW5kZXJcbiAgLy8gdGhlIHBsYXRmb3JtIGlkZW50aXR5IHdoaWxlIHJlLWF0dGFjaGluZyB0aGUgZGVjaWRpbmcgdXNlciBmb3JcbiAgLy8gYXR0cmlidXRpb24sIHNvIHRoaXMgZGVjbGFyYXRpb24gYWxpZ25zIHRoZSBmbG93IHdpdGggdGhlIG5vZGUgaXQgZHJpdmVzLlxuICBydW5BczogJ3N5c3RlbScsXG5cbiAgdmFyaWFibGVzOiBbXG4gICAgeyBuYW1lOiAnb3Bwb3J0dW5pdHlJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gIF0sXG5cbiAgbm9kZXM6IFtcbiAgICB7XG4gICAgICBpZDogJ3N0YXJ0JyxcbiAgICAgIHR5cGU6ICdzdGFydCcsXG4gICAgICBsYWJlbDogJ1N0YXJ0JyxcbiAgICAgIC8vIFRyaWdnZXIgd2lyaW5nICg3LjQpOiBiaW5kIHRvIGFmdGVyVXBkYXRlOyBnYXRlIG9uIGNyb3NzaW5nIHRoZSBlbnRyeVxuICAgICAgLy8gdGhyZXNob2xkIHdoaWxlIG5vdCBhbHJlYWR5IGluIGFuIGFwcHJvdmFsIHN0YXRlLiBUaGUgYG5vdF9yZXF1aXJlZGBcbiAgICAgIC8vIGd1YXJkIHN0b3BzIHRoZSBmbG93J3Mgb3duIGFwcHJvdmFsX3N0YXR1cyB3cml0ZXMgZnJvbSByZS10cmlnZ2VyaW5nIGl0LlxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgICB0cmlnZ2VyVHlwZTogJ3JlY29yZC1hZnRlci11cGRhdGUnLFxuICAgICAgICAvLyBOdWxsLXRvbGVyYW50OiByb3dzIGluc2VydGVkIGJlZm9yZSBhcHByb3ZhbF9zdGF0dXMgaGFkIGEgZmllbGQtbGV2ZWxcbiAgICAgICAgLy8gZGVmYXVsdFZhbHVlIChlLmcuIGZsb3ctY3JlYXRlZCBvcHBvcnR1bml0aWVzKSBjYXJyeSBudWxsLCB3aGljaCBtdXN0XG4gICAgICAgIC8vIHN0aWxsIGVudGVyIGFwcHJvdmFsLlxuICAgICAgICAvLyBTdGFnZSBndWFyZDogYSBzZXR0bGVkIGRlYWwgbXVzdCBuZXZlciAocmUtKWVudGVyIGFwcHJvdmFsIFx1MjAxNCB0aGVcbiAgICAgICAgLy8gZnJlZXplIGhvb2sgcmVqZWN0cyBhcHByb3ZhbC1zdGF0dXMgd3JpdGVzIG9uIGNsb3NlZCByZWNvcmRzLCBzb1xuICAgICAgICAvLyB3aXRob3V0IHRoaXMgZ3VhcmQgdGhlIGZsb3cgb3BlbmVkIGEgbG9ja2VkIGFwcHJvdmFsIHJlcXVlc3QgaXRcbiAgICAgICAgLy8gY291bGQgbmV2ZXIgcmVzb2x2ZSAobG9ja1JlY29yZCBoZWxkIHRoZSBjbG9zZWQgcmVjb3JkIGhvc3RhZ2UpLlxuICAgICAgICAvLyBUT1RBTElUWTogYGhhcyguLi4pYCBvbiBldmVyeSByZWFkLCBwbHVzIGAhPSBudWxsYCBvbiB0aGVcbiAgICAgICAgLy8gb3JkZXJpbmcgY29tcGFyaXNvbiBcdTIwMTQgYGhhcygpYCBwYXNzZXMgYW4gZXhwbGljaXQgbnVsbCBhbmRcbiAgICAgICAgLy8gYHJlY29yZC5hbW91bnQgPj0gMTAwMDAwYCB0aGVuIGFib3J0cyB3aXRoXG4gICAgICAgIC8vIGBubyBzdWNoIG92ZXJsb2FkOiBkeW48bnVsbD4gPj0gaW50YC4gTWVhc3VyZWQgdG90YWwgYXMgYXV0aG9yZWRcbiAgICAgICAgLy8gdG9kYXkgKGFtb3VudC9zdGFnZSBhcmUgcmVxdWlyZWQsIGFwcHJvdmFsX3N0YXR1cyBpcyBkZWZhdWx0ZWQpLCBidXRcbiAgICAgICAgLy8gdGhhdCBpcyBgY3JtX29wcG9ydHVuaXR5YCdzIHNjaGVtYSBkb2luZyB0aGUgd29yaywgbm90IHRoZVxuICAgICAgICAvLyBwcmVkaWNhdGUuIEFuIGFic2VudCBgYXBwcm92YWxfc3RhdHVzYCByZWFkcyB0aGUgc2FtZSBhcyB0aGUgbnVsbFxuICAgICAgICAvLyB0aGlzIGNvbmRpdGlvbiBhbHJlYWR5IHRvbGVyYXRlczsgYW4gYWJzZW50IGBzdGFnZWAgaXMgbm90IGEgc2V0dGxlZFxuICAgICAgICAvLyBzdGFnZSwgc28gaXQgbXVzdCBub3QgYmxvY2sgYXBwcm92YWwuXG4gICAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLmFtb3VudCkgJiYgcmVjb3JkLmFtb3VudCAhPSBudWxsICYmIHJlY29yZC5hbW91bnQgPj0gJHtMQVJHRV9ERUFMX0FNT1VOVH1cbiAgICAgICAgICAmJiAoIWhhcyhyZWNvcmQuYXBwcm92YWxfc3RhdHVzKSB8fCByZWNvcmQuYXBwcm92YWxfc3RhdHVzID09IFwibm90X3JlcXVpcmVkXCIgfHwgcmVjb3JkLmFwcHJvdmFsX3N0YXR1cyA9PSBudWxsKVxuICAgICAgICAgICYmICghaGFzKHJlY29yZC5zdGFnZSkgfHwgKHJlY29yZC5zdGFnZSAhPSBcImNsb3NlZF93b25cIiAmJiByZWNvcmQuc3RhZ2UgIT0gXCJjbG9zZWRfbG9zdFwiKSlgLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnZ2V0X29wcG9ydHVuaXR5JyxcbiAgICAgIHR5cGU6ICdnZXRfcmVjb3JkJyxcbiAgICAgIGxhYmVsOiAnR2V0IE9wcG9ydHVuaXR5JyxcbiAgICAgIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JywgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkLmlkYCB9LCBvdXRwdXRWYXJpYWJsZTogJ29wcFJlY29yZCcgfSxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFRpZXIgMTogU2FsZXMgTWFuYWdlciByZXZpZXcgKGFsbCBkZWFscyBhdCAkMTAwSyBvciBtb3JlKSBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBpZDogJ21hbmFnZXJfcmV2aWV3JyxcbiAgICAgIHR5cGU6ICdhcHByb3ZhbCcsXG4gICAgICBsYWJlbDogJ1NhbGVzIE1hbmFnZXIgUmV2aWV3JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBcdTI2RDQgTmV2ZXIgYWRkIGFuIG9yZy1vd25lciBhcHByb3ZlciBhcyBhbiBlbXB0eS1iZW5jaCB3b3JrYXJvdW5kLlxuICAgICAgICAvLyBgb25FbXB0eUFwcHJvdmVyczogJ2FkbWluX3Jlc2N1ZSdgIGlzIHRoZSBub2RlIHBvbGljeSBmb3IgYW4gZW1wdHlcbiAgICAgICAgLy8gcG9zaXRpb24gb24gQG9iamVjdHN0YWNrIDE3IChhcHByb3ZlcnMgc25hcHNob3QgYXQgcmVxdWVzdCBjcmVhdGlvbixcbiAgICAgICAgLy8gc28gYSBwb3NpdGlvbiB3aXRoIG5vIGhvbGRlcnMgd291bGQgb3RoZXJ3aXNlIGxlYXZlIHRoZSByZXF1ZXN0XG4gICAgICAgIC8vIHVuZGVjaWRhYmxlIHdoaWxlIGBsb2NrUmVjb3JkYCBoZWxkIHRoZSByZWNvcmQgaG9zdGFnZSkuIEFuXG4gICAgICAgIC8vIGB7IHR5cGU6ICdvcmdfbWVtYmVyc2hpcF9sZXZlbCcsIHZhbHVlOiAnb3duZXInIH1gIGVudHJ5IG92ZXJzaG9vdHM6XG4gICAgICAgIC8vIHdpdGggYGJlaGF2aW9yOiAnZmlyc3RfcmVzcG9uc2UnYCBpdCBtYWtlcyBhbiBvcmcgb3duZXIgYSByb3V0aW5lXG4gICAgICAgIC8vIGFwcHJvdmVyIGZvciBldmVyeSBkZWFsLCBub3QgYSByZXNjdWUgd2hlbiB0aGUgYmVuY2ggaXMgZW1wdHkuXG4gICAgICAgIGFwcHJvdmVyczogW3sgdHlwZTogJ3Bvc2l0aW9uJywgdmFsdWU6ICdzYWxlc19tYW5hZ2VyJyB9XSxcbiAgICAgICAgLy8gRXhwbGljaXQgZXZlbiB0aG91Z2ggYGFkbWluX3Jlc2N1ZWAgaXMgdGhlIHNjaGVtYSBkZWZhdWx0IFx1MjAxNCB0aGlzIGlzXG4gICAgICAgIC8vIHRoZSBtZWNoYW5pc20gdGhlIG5vZGUgZGVwZW5kcyBvbiwgc28gaXQgaXMgYXV0aG9yZWQsIG5vdCBpbmhlcml0ZWQuXG4gICAgICAgIG9uRW1wdHlBcHByb3ZlcnM6ICdhZG1pbl9yZXNjdWUnLFxuICAgICAgICBiZWhhdmlvcjogJ2ZpcnN0X3Jlc3BvbnNlJyxcbiAgICAgICAgbG9ja1JlY29yZDogdHJ1ZSxcbiAgICAgICAgYXBwcm92YWxTdGF0dXNGaWVsZDogJ2FwcHJvdmFsX3N0YXR1cycsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgVGllciBnYXRlOiBkb2VzIHRoaXMgZGVhbCBhbHNvIG5lZWQgZGlyZWN0b3Igc2lnbi1vZmY/IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIC8vIE5vIGBjb25maWcuY29uZGl0aW9uYCBoZXJlOiB0aGUgYnJhbmNoIGlzIG9uIGVkZ2VzIGBlNWAgLyBgZTZgLCB3aGljaFxuICAgICAgLy8gaXMgd2hlcmUgdGhlIGVuZ2luZSBhY3R1YWxseSByZWFkcyBpdC4gQSBjb3B5IG9uIHRoZSBub2RlIHdvdWxkIGJlXG4gICAgICAvLyBpbmVydCBhbmQgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgbGl2ZSBvbmUgKDE3LjAuMC1yYy4yJ3NcbiAgICAgIC8vIGBmbG93LWluZXJ0LW5vZGUtY29uZGl0aW9uYCkuXG4gICAgICBpZDogJ2NoZWNrX2hpZ2hfdmFsdWUnLFxuICAgICAgdHlwZTogJ2RlY2lzaW9uJyxcbiAgICAgIGxhYmVsOiAnSGlnaCBWYWx1ZSAoPiAkNTAwSyk/JyxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFRpZXIgMjogU2FsZXMgRGlyZWN0b3Igc2lnbi1vZmYgKGRlYWxzID4gJDUwMEsgb25seSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgaWQ6ICdkaXJlY3Rvcl9zaWdub2ZmJyxcbiAgICAgIHR5cGU6ICdhcHByb3ZhbCcsXG4gICAgICBsYWJlbDogJ1NhbGVzIERpcmVjdG9yIFNpZ24tb2ZmJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBTYW1lIG5vZGUgcG9saWN5IGFzIG1hbmFnZXJfcmV2aWV3IFx1MjAxNCBzZWUgdGhlIG5vdGUgdGhlcmUuXG4gICAgICAgIGFwcHJvdmVyczogW3sgdHlwZTogJ3Bvc2l0aW9uJywgdmFsdWU6ICdzYWxlc19kaXJlY3RvcicgfV0sXG4gICAgICAgIG9uRW1wdHlBcHByb3ZlcnM6ICdhZG1pbl9yZXNjdWUnLFxuICAgICAgICBiZWhhdmlvcjogJ2ZpcnN0X3Jlc3BvbnNlJyxcbiAgICAgICAgbG9ja1JlY29yZDogdHJ1ZSxcbiAgICAgICAgYXBwcm92YWxTdGF0dXNGaWVsZDogJ2FwcHJvdmFsX3N0YXR1cycsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgRmluYWwgYXBwcm92ZTogc3RhbXAgc3RhdHVzICsgbm90aWZ5IG93bmVyIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGlkOiAnbWFya19hcHByb3ZlZCcsXG4gICAgICB0eXBlOiAndXBkYXRlX3JlY29yZCcsXG4gICAgICBsYWJlbDogJ01hcmsgQXBwcm92ZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcsIGFwcHJvdmVkX2RhdGU6IGNlbGBpc29EYXRldGltZShub3coKSlgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdub3RpZnlfYXBwcm92ZWQnLFxuICAgICAgdHlwZTogJ25vdGlmeScsXG4gICAgICBsYWJlbDogJ05vdGlmeSBPd25lciBcdTIwMTQgQXBwcm92ZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtjZWxgaGFzKG9wcFJlY29yZC5vd25lcl9pZCkgPyBvcHBSZWNvcmQub3duZXJfaWQgOiBudWxsYF0sXG4gICAgICAgIGNoYW5uZWxzOiBbJ2luYm94JywgJ2VtYWlsJ10sXG4gICAgICAgIHRvcGljOiAnb3Bwb3J0dW5pdHlfYXBwcm92ZWQnLFxuICAgICAgICB0ZW1wbGF0ZTogJ2NybS5vcHBvcnR1bml0eV9hcHByb3ZlZCcsXG4gICAgICAgIHRlbXBsYXRlRGF0YTogeyBuYW1lOiBjZWxgb3BwUmVjb3JkLm5hbWVgIH0sXG4gICAgICAgIGFjdGlvblVybDogJy9jcm1fb3Bwb3J0dW5pdHkve3tyZWNvcmQuaWR9fScsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgUmVqZWN0aW9uOiBzdGFtcCBzdGF0dXMgKyBub3RpZnkgb3duZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgaWQ6ICdtYXJrX3JlamVjdGVkJyxcbiAgICAgIHR5cGU6ICd1cGRhdGVfcmVjb3JkJyxcbiAgICAgIGxhYmVsOiAnTWFyayBSZWplY3RlZCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZC5pZGAgfSxcbiAgICAgICAgZmllbGRzOiB7IGFwcHJvdmFsX3N0YXR1czogJ3JlamVjdGVkJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnbm90aWZ5X3JlamVjdGVkJyxcbiAgICAgIHR5cGU6ICdub3RpZnknLFxuICAgICAgbGFiZWw6ICdOb3RpZnkgT3duZXIgXHUyMDE0IFJlamVjdGVkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICByZWNpcGllbnRzOiBbY2VsYGhhcyhvcHBSZWNvcmQub3duZXJfaWQpID8gb3BwUmVjb3JkLm93bmVyX2lkIDogbnVsbGBdLFxuICAgICAgICBjaGFubmVsczogWydpbmJveCcsICdlbWFpbCddLFxuICAgICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgICB0b3BpYzogJ29wcG9ydHVuaXR5X3JlamVjdGVkJyxcbiAgICAgICAgdGVtcGxhdGU6ICdjcm0ub3Bwb3J0dW5pdHlfcmVqZWN0ZWQnLFxuICAgICAgICB0ZW1wbGF0ZURhdGE6IHsgbmFtZTogY2VsYG9wcFJlY29yZC5uYW1lYCB9LFxuICAgICAgICBhY3Rpb25Vcmw6ICcvY3JtX29wcG9ydHVuaXR5L3t7cmVjb3JkLmlkfX0nLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIHsgaWQ6ICdlMScsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAnZ2V0X29wcG9ydHVuaXR5JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAnZ2V0X29wcG9ydHVuaXR5JywgdGFyZ2V0OiAnbWFuYWdlcl9yZXZpZXcnLCB0eXBlOiAnZGVmYXVsdCcgfSxcblxuICAgIC8vIE1hbmFnZXIgZGVjaXNpb24gKGFwcHJvdmFsLW5vZGUgYnJhbmNoIGxhYmVscylcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdtYW5hZ2VyX3JldmlldycsIHRhcmdldDogJ2NoZWNrX2hpZ2hfdmFsdWUnLCB0eXBlOiAnZGVmYXVsdCcsIGxhYmVsOiAnYXBwcm92ZScgfSxcbiAgICB7IGlkOiAnZTQnLCBzb3VyY2U6ICdtYW5hZ2VyX3JldmlldycsIHRhcmdldDogJ21hcmtfcmVqZWN0ZWQnLCB0eXBlOiAnZGVmYXVsdCcsIGxhYmVsOiAncmVqZWN0JyB9LFxuXG4gICAgLy8gVGllciBnYXRlIChkZWNpc2lvbi1ub2RlIGNvbmRpdGlvbmFsIGJyYW5jaGVzKS4gVGhlc2UgRURHRVMgYXJlIHRoZSBsaXZlXG4gICAgLy8gc2l0ZXMgXHUyMDE0IHRoZSBlbmdpbmUgbmV2ZXIgZXZhbHVhdGVzIGEgYGRlY2lzaW9uYCBub2RlJ3Mgc2luZ3VsYXJcbiAgICAvLyBgY29uZmlnLmNvbmRpdGlvbmAgXHUyMDE0IGFuZCB0aGV5IG11c3QgUEFSVElUSU9OLCBzbyB0aGUgZ3VhcmRzIGFyZSB3cml0dGVuXG4gICAgLy8gaW4gb3Bwb3NpdGUgcG9sYXJpdHkuIEEgZGVhbCB3aG9zZSBhbW91bnQgY2Fubm90IGJlIHJlYWQgbGFuZHMgb25cbiAgICAvLyBgbWFya19hcHByb3ZlZGA6IHRoZSBtYW5hZ2VyIGhhcyBhbHJlYWR5IGFwcHJvdmVkIGl0LCBhbmQgYW4gdW5yZWFkYWJsZVxuICAgIC8vIGFtb3VudCBtdXN0IG5vdCBzdHJhbmQgYW4gYXBwcm92ZWQgZGVhbCBpbiBhIGxvY2tlZCwgdW5kZWNpZGFibGVcbiAgICAvLyBkaXJlY3RvciBzdGVwLlxuICAgIC8vXG4gICAgLy8gVE9UQUxJVFk6IGBvcHBSZWNvcmRgIGlzIGEgYGdldF9yZWNvcmRgIE9VVFBVVCwgc28gdGhlIHJlYWQgbmVlZHNcbiAgICAvLyBgaGFzKHZhcnMub3BwUmVjb3JkKWAgKHRoZSB2YXJpYWJsZSksIGBoYXModmFycy5vcHBSZWNvcmQuYW1vdW50KWAgKHRoZVxuICAgIC8vIGNvbHVtbiBcdTIwMTQgYGZpbmRPbmVgIGFuc3dlcnMgYSBtaXNzIHdpdGggYG51bGxgLCBhbmQgYSBzcGFyc2UgZHJpdmVyIHJvd1xuICAgIC8vIG9taXRzIGFuIHVud3JpdHRlbiBjb2x1bW4gb3V0cmlnaHQpIGFuZCBgIT0gbnVsbGAgKGFuIGV4cGxpY2l0IG51bGxcbiAgICAvLyBwYXNzZXMgYGhhcygpYCBhbmQgdGhlIG9yZGVyaW5nIGNvbXBhcmlzb24gdGhlbiBhYm9ydHMgd2l0aCBgbm8gc3VjaFxuICAgIC8vIG92ZXJsb2FkOiBkeW48bnVsbD4gPiBpbnRgKS4gTWVhc3VyZWQgdG90YWwgYXMgYXV0aG9yZWQgdG9kYXkgXHUyMDE0IGBhbW91bnRgXG4gICAgLy8gaXMgYHJlcXVpcmVkYCBvbiBgY3JtX29wcG9ydHVuaXR5YCBhbmQgdGhlIGBnZXRfcmVjb3JkYCBpcyBrZXllZCBvbiB0aGVcbiAgICAvLyByb3cgdGhhdCBqdXN0IGZpcmVkIHRoZSB0cmlnZ2VyIFx1MjAxNCBidXQgdGhhdCBpcyB0aGUgbmVpZ2hib3VyaW5nIHNjaGVtYVxuICAgIC8vIGRvaW5nIHRoZSB3b3JrLCBleGFjdGx5IGFzIGluIHRoZSBzdGFydCBjb25kaXRpb24gYWJvdmUuIGB2YXJzLmAtc2NvcGVkXG4gICAgLy8gcmF0aGVyIHRoYW4gYmFyZTogYGhhcyhvcHBSZWNvcmQuYW1vdW50KWAgc3RpbGwgYWJvcnRzIHdpdGggYFVua25vd25cbiAgICAvLyB2YXJpYWJsZTogb3BwUmVjb3JkYCBvbiBhbiB1bmJvdW5kIHZhcmlhYmxlLCBgaGFzKHZhcnMub3BwUmVjb3JkKWBcbiAgICAvLyBhbnN3ZXJzIGBmYWxzZWAgKG1lYXN1cmVkKS4gRnJvbSAxNy4wLjAtcmMuMiBhbiB1bmV2YWx1YWJsZSBjb25kaXRpb25cbiAgICAvLyBBQk9SVFMgdGhlIHN0ZXAgcmF0aGVyIHRoYW4gc2tpcHBpbmcgaXQsIHNvIGEgZ3VhcmQgdGhhdCB3YXNcbiAgICAvLyBiZWx0LWFuZC1icmFjZXMgaXMgbm93IHdoYXQga2VlcHMgdGhlIHJ1biBhbGl2ZS5cbiAgICB7IGlkOiAnZTUnLCBzb3VyY2U6ICdjaGVja19oaWdoX3ZhbHVlJywgdGFyZ2V0OiAnZGlyZWN0b3Jfc2lnbm9mZicsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGBoYXModmFycy5vcHBSZWNvcmQpICYmIGhhcyh2YXJzLm9wcFJlY29yZC5hbW91bnQpXG4gICAgICAmJiB2YXJzLm9wcFJlY29yZC5hbW91bnQgIT0gbnVsbCAmJiB2YXJzLm9wcFJlY29yZC5hbW91bnQgPiAke0hJR0hfVkFMVUVfREVBTF9BTU9VTlR9YCwgbGFiZWw6ICdIaWdoIHZhbHVlICg+ICQ1MDBLKScgfSxcbiAgICB7IGlkOiAnZTYnLCBzb3VyY2U6ICdjaGVja19oaWdoX3ZhbHVlJywgdGFyZ2V0OiAnbWFya19hcHByb3ZlZCcsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGAhaGFzKHZhcnMub3BwUmVjb3JkKSB8fCAhaGFzKHZhcnMub3BwUmVjb3JkLmFtb3VudClcbiAgICAgIHx8IHZhcnMub3BwUmVjb3JkLmFtb3VudCA9PSBudWxsIHx8IHZhcnMub3BwUmVjb3JkLmFtb3VudCA8PSAke0hJR0hfVkFMVUVfREVBTF9BTU9VTlR9YCwgbGFiZWw6ICdTdGFuZGFyZCAoXHUyMjY0ICQ1MDBLKScgfSxcblxuICAgIC8vIERpcmVjdG9yIGRlY2lzaW9uIChhcHByb3ZhbC1ub2RlIGJyYW5jaCBsYWJlbHMpXG4gICAgeyBpZDogJ2U3Jywgc291cmNlOiAnZGlyZWN0b3Jfc2lnbm9mZicsIHRhcmdldDogJ21hcmtfYXBwcm92ZWQnLCB0eXBlOiAnZGVmYXVsdCcsIGxhYmVsOiAnYXBwcm92ZScgfSxcbiAgICB7IGlkOiAnZTgnLCBzb3VyY2U6ICdkaXJlY3Rvcl9zaWdub2ZmJywgdGFyZ2V0OiAnbWFya19yZWplY3RlZCcsIHR5cGU6ICdkZWZhdWx0JywgbGFiZWw6ICdyZWplY3QnIH0sXG5cbiAgICAvLyBUZXJtaW5hbCBicmFuY2hlc1xuICAgIHsgaWQ6ICdlOScsIHNvdXJjZTogJ21hcmtfYXBwcm92ZWQnLCB0YXJnZXQ6ICdub3RpZnlfYXBwcm92ZWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTEwJywgc291cmNlOiAnbm90aWZ5X2FwcHJvdmVkJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UxMScsIHNvdXJjZTogJ21hcmtfcmVqZWN0ZWQnLCB0YXJnZXQ6ICdub3RpZnlfcmVqZWN0ZWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTEyJywgc291cmNlOiAnbm90aWZ5X3JlamVjdGVkJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuXG4vKipcbiAqIEluc2VydC10aW1lIHR3aW4gb2YgYG9wcG9ydHVuaXR5X2FwcHJvdmFsYC4gQSByZWNvcmQtY2hhbmdlIGZsb3cgYmluZHNcbiAqIGV4YWN0bHkgb25lIGhvb2sgZXZlbnQsIHNvIHRoZSBhZnRlclVwZGF0ZSBmbG93IGFib3ZlIG5ldmVyIHNlZXNcbiAqIG9wcG9ydHVuaXRpZXMgQk9STiBvdmVyIHRoZSB0aHJlc2hvbGQgXHUyMDE0IGZsb3ctY3JlYXRlZCBkZWFscyAoY29udHJhY3RcbiAqIHJlbmV3YWxzLCBsZWFkIGNvbnZlcnNpb24pIGFuZCBBUEkgaW5zZXJ0cy4gXHUyNkQ0IERvIG5vdCBkZWxldGUgdGhpcyB0d2luXG4gKiBleHBlY3RpbmcgdGhlIGFmdGVyVXBkYXRlIGZsb3cgdG8gY292ZXIgdGhlbTsgdGhhdCBwb3B1bGF0aW9uIGlzIGV4YWN0bHkgd2hhdFxuICogdGhlIHN0YXJ0IGNvbmRpdGlvbidzIG51bGwtdG9sZXJhbmNlIGlzIHdyaXR0ZW4gZm9yLiBTYW1lIG5vZGVzL2VkZ2VzLCBvbmx5XG4gKiB0aGUgc3RhcnQgbm9kZSBpcyByZWJvdW5kIHRvIGFmdGVySW5zZXJ0IChtaXJyb3JzIGBDYXNlRXNjYWxhdGlvbk9uQ3JlYXRlRmxvd2ApLlxuICogVGhlIHN0YWdlIGd1YXJkIGNhcnJpZXMgb3Zlciwga2VlcGluZyBzZWVkZWQvaW1wb3J0ZWQgY2xvc2VkIGRlYWxzIG91dC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9wcG9ydHVuaXR5QXBwcm92YWxPbkNyZWF0ZUZsb3c6IEZsb3cgPSB7XG4gIC4uLk9wcG9ydHVuaXR5QXBwcm92YWxGbG93LFxuICBuYW1lOiAnb3Bwb3J0dW5pdHlfYXBwcm92YWxfb25fY3JlYXRlJyxcbiAgbGFiZWw6ICdMYXJnZSBEZWFsIEFwcHJvdmFsIChvbiBjcmVhdGUpJyxcbiAgZGVzY3JpcHRpb246ICdBcHByb3ZhbCBpbnRha2UgZm9yIG9wcG9ydHVuaXRpZXMgY3JlYXRlZCBhYm92ZSB0aGUgdGhyZXNob2xkIChpbnNlcnQtdGltZSB0d2luIG9mIG9wcG9ydHVuaXR5X2FwcHJvdmFsKS4nLFxuICBub2RlczogT3Bwb3J0dW5pdHlBcHByb3ZhbEZsb3cubm9kZXMubWFwKChuKSA9PlxuICAgIG4uaWQgPT09ICdzdGFydCdcbiAgICAgID8geyAuLi5uLCBjb25maWc6IHsgLi4ubi5jb25maWcsIHRyaWdnZXJUeXBlOiAncmVjb3JkLWFmdGVyLWNyZWF0ZScgfSB9XG4gICAgICA6IG4sXG4gICksXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3Mvb3Bwb3J0dW5pdHktc3RhdHVzLWNoYW5nZS1hcHByb3ZhbC5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL29wcG9ydHVuaXR5LXN0YXR1cy1jaGFuZ2UtYXBwcm92YWwuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNiBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUCwgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIE9wcG9ydHVuaXR5IFN0YXR1cyBDaGFuZ2UgQXBwcm92YWwgXHUyMDE0IHNpZ24tb2ZmIGJlZm9yZSBhIGRlYWwgaXMgZGVjbGFyZWQgd29uXG4gKiBvciBhYmFuZG9uZWQuXG4gKlxuICogUkVRLTAwMDYgc3RlcHMgMTMgKyAxNDogXHUzMDBDXHU1M0QxXHU4RDc3XHU4RDYyXHU1MzU1XHUzMDAxXHU1RjAzXHU1MzU1XHUyMDI2XHU3MkI2XHU2MDAxXHU1M0Q4XHU2NkY0XHU2NENEXHU0RjVDXHVGRjBDXHU1ODZCXHU1MTk5XHU1M0Q4XHU2NkY0XHU1MzlGXHU1NkUwXHU0RTBFXHU4QkY0XHU2NjBFXHUzMDBEIHRoZW5cbiAqIFx1MzAwQ1x1OTFDRFx1ODk4MVx1NzJCNlx1NjAwMVx1NTNEOFx1NjZGNFx1OTcwMFx1NUJBMVx1NjI3OVx1RkYwQyoqXHU5MDFBXHU4RkM3XHU1NDBFXHU1NTQ2XHU2NzNBXHU3MkI2XHU2MDAxXHU2QjYzXHU1RjBGXHU3NTFGXHU2NTQ4KipcdTMwMEQuIEV4cHJlc3NlZCBhcyBhbiAqKmFwcHJvdmFsIG5vZGUqKlxuICogKGB0eXBlOiAnYXBwcm92YWwnYCwgQURSLTAwMTkpLCB0aGUgY29uc3RydWN0IGBvcHBvcnR1bml0eS1hcHByb3ZhbC5mbG93LnRzYFxuICogYWxyZWFkeSB1c2VzIFx1MjAxNCBcdTI2RDQgdGhlcmUgaXMgbm8gYHdvcmtmbG93YCBtZXRhZGF0YSB0eXBlIGFuZCBubyBzdGFuZGFsb25lXG4gKiBgQXBwcm92YWxQcm9jZXNzYCB0byBhdXRob3IuXG4gKlxuICogIyMgV2h5IHRoZSBTVEFHRSBpcyBub3Qgd2hhdCB0aGUgcmVwIHdyaXRlc1xuICpcbiAqIFJFUS0wMDA2IGFjY2VwdGFuY2UgMzogdGhlIHJlcXVlc3Qgb3BlbnMgXCJhbmQgdGhlIHN0YWdlIGRvZXMgbm90IGNoYW5nZVxuICogdW50aWwgaXQgaXMgZGVjaWRlZFwiLiBBIGByZWNvcmRfY2hhbmdlYCBmbG93IGJpbmRzIGFuIEFGVEVSIGhvb2ssIHNvIGJ5IHRoZVxuICogdGltZSBpdCBydW5zIHRoZSBzdGFnZSBoYXMgYWxyZWFkeSBtb3ZlZCBcdTIwMTQgYW4gYWZ0ZXItZmxvdyBjYW4gbG9jayB0aGUgcmVjb3JkXG4gKiBidXQgaXQgY2Fubm90IHVuLW1vdmUgaXQuIFNvIHRoZSByZXAgd3JpdGVzIHRoZSBSRVFVRVNUXG4gKiAoYHJlcXVlc3RlZF9zdGF0dXNgKSBhbmQgdGhlIGFwcHJvdmVkIGRlY2lzaW9uIHdyaXRlcyB0aGUgU1RBR0UsIHdoaWNoIGlzXG4gKiBhbHNvIGxpdGVyYWxseSB3aGF0IHRoZSBjdXN0b21lcidzIG93biBzdGVwIDE0IHNheXMgKFwiXHU5MDFBXHU4RkM3XHU1NDBFXHUyMDI2XHU2QjYzXHU1RjBGXHU3NTFGXHU2NTQ4XCIpLlxuICogYG9wcG9ydHVuaXR5Lmhvb2sudHNgIHJlZnVzZXMgYSBkaXJlY3QgdXNlciBtb3ZlIGludG8gYSBjbG9zZWQgc3RhZ2Ugd2hpbGVcbiAqIHRoZSBnYXRlIGlzIGFybWVkLCBhbmQgbmFtZXMgdGhpcyBmaWVsZCBpbiB0aGUgcmVmdXNhbC5cbiAqXG4gKiAjIyBcdTI2QTBcdUZFMEYgVGhpcyBmbG93IGlzIElORVJUIHVudGlsIGFuIGluc3RhbGwgYXJtcyB0aGUgZ2F0ZSwgYW5kIHRoYXQgaXMgYnkgZGVzaWduXG4gKlxuICogUkVRLTAwMDYgYWNjZXB0YW5jZSAzIGFnYWluOiBcIndpdGggaXQgb2ZmICh0aGUgZGVmYXVsdCksIHRoZSBleGlzdGluZ1xuICogYW1vdW50LXRpZXJlZCBiZWhhdmlvdXIgb2YgYG9wcG9ydHVuaXR5LWFwcHJvdmFsLmZsb3cudHNgIGlzIGJpdC1mb3ItYml0XG4gKiB3aGF0IGl0IGlzIHRvZGF5LlwiXG4gKlxuICogVGhlIHN3aXRjaCBpcyBgY3JtX29wcG9ydHVuaXR5LnN0YXR1c19jaGFuZ2VfYXBwcm92YWxfc3RhdHVzYCdzXG4gKiBgZGVmYXVsdFZhbHVlYCwgXHUyNkQ0IG5vdCB0aGlzIGZsb3cncyBgc3RhdHVzYC4gU2hpcHBlZCwgdGhhdCBkZWZhdWx0IGlzXG4gKiBgbm90X3JlcXVpcmVkYCwgc28gbm8gZGVhbCBpcyBldmVyIGJvcm4gYHBlbmRpbmdgLCB0aGUgc3RhcnQgY29uZGl0aW9uIGJlbG93XG4gKiBpcyBmYWxzZSBmb3IgZXZlcnkgcmVjb3JkIHRoYXQgaGFzIGV2ZXIgZXhpc3RlZCwgYW5kIHRoaXMgZmxvdyBvcGVucyBub3RoaW5nXG4gKiBcdTIwMTQgaXQgY29zdHMgb25lIHByZWRpY2F0ZSBldmFsdWF0aW9uIHBlciB1cGRhdGUuIEFuIGluc3RhbGwgYXJtcyB0aGUgZ2F0ZSBieVxuICogY2hhbmdpbmcgdGhhdCBvbmUgdmFsdWUgdG8gYCdwZW5kaW5nJ2AuXG4gKlxuICogXHUyNkQ0IERvIE5PVCByZWFjaCBmb3IgYHN0YXR1czogJ2RyYWZ0J2AgYXMgdGhlIG9mZiBzd2l0Y2ggaW5zdGVhZCwgYW5kIFx1MjZENCBub3RcbiAqIGAnb2Jzb2xldGUnYCBlaXRoZXIuIEJvdGggcmVhZGluZ3MgYXJlIG1lYXN1cmVkIGFuZCByZWNvcmRlZCBpblxuICogYGxlYWQtY29udmVyc2lvbi1hcHByb3ZhbC5mbG93LnRzYCdzIGRvY3N0cmluZyBvblxuICogYEBvYmplY3RzdGFjay9zZXJ2aWNlLWF1dG9tYXRpb25gIDE3LjQuMCwgdGhlIHBpbiBhdCB0aGF0IHRha2luZzogZHJhZnQgZmxvd3Mgc3RpbGwgZmlyZSB0aGVpclxuICogdHJpZ2dlcnMsIGFuZCBgaXNGbG93RW5hYmxlZGAgY29tcG9zZXMgYG9ic29sZXRlYCB3aXRoIHRoZSBpbnN0YWxsYXRpb24nc1xuICogYWN0aXZhdGlvbiBsZWRnZXIgaW50byBhIGdhdGUgbm8gaW5zdGFsbCBjYW4gZXZlciB0dXJuIE9OLiBcdTI2RDQgRG8gbm90XG4gKiByZS1kZXJpdmUgaXQgaGVyZS5cbiAqXG4gKiBcdTIxRDIgQSBkZWFsIHRoYXQgcHJlZGF0ZXMgdGhlIGFybWluZyBrZWVwcyBgbm90X3JlcXVpcmVkYCBhbmQgbmV2ZXIgZW50ZXJzLFxuICogc28gYXJtaW5nIHRoZSBnYXRlIGludmFsaWRhdGVzIG5vIGV4aXN0aW5nIHJlY29yZC5cbiAqXG4gKiAjIyBcdTI2QTBcdUZFMEYgSXRzIG93biB2ZXJkaWN0IGNvbHVtbiwgTk9UIGBhcHByb3ZhbF9zdGF0dXNgXG4gKlxuICogYGFwcHJvdmFsX3N0YXR1c2AgYmVsb25ncyB0byB0aGUgYW1vdW50LXRpZXJlZCBmbG93LiBTaGFyaW5nIGl0IHdvdWxkIG1ha2VcbiAqIGVpdGhlciBnYXRlJ3MgdmVyZGljdCBlcmFzZSB0aGUgb3RoZXIncyBcdTIwMTQgYW5kIHdvcnNlLCByZS1hcm0gdGhlIGFtb3VudCBmbG93LFxuICogd2hvc2UgZW50cnkgY29uZGl0aW9uIGZpcmVzIG9uIGBhcHByb3ZhbF9zdGF0dXMgPT0gXCJub3RfcmVxdWlyZWRcImAuXG4gKi9cbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eVN0YXR1c0NoYW5nZUFwcHJvdmFsRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X3N0YXR1c19jaGFuZ2VfYXBwcm92YWwnLFxuICBsYWJlbDogJ09wcG9ydHVuaXR5IFN0YXR1cyBDaGFuZ2UgQXBwcm92YWwnLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnU2lnbi1vZmYgYSBkZWFsIG5lZWRzIGJlZm9yZSBpdCBpcyBkZWNsYXJlZCB3b24gb3IgbG9zdC4gSW5lcnQgdW5sZXNzIHRoZSBpbnN0YWxsIGFybXMgdGhlIGdhdGUgb24gY3JtX29wcG9ydHVuaXR5LnN0YXR1c19jaGFuZ2VfYXBwcm92YWxfc3RhdHVzLicsXG4gIHR5cGU6ICdyZWNvcmRfY2hhbmdlJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gUkVRLTAwMDYgYWNjZXB0YW5jZSA0LCBhbmQgdGhlIHNhbWUgcmVhZGluZyBgb3Bwb3J0dW5pdHlfYXBwcm92YWxgIHJlY29yZHNcbiAgLy8gZnJvbSBpdHMgb3duIG1lYXN1cmVkIGZhaWx1cmU6IGEgZ2F0ZSB0aGF0IGVuZ2FnZXMgb25seSBmb3Igd3JpdGVyc1xuICAvLyBjYXJyeWluZyBhIHNlc3Npb24gaXMgbm90IGEgY29udHJvbCBcdTIwMTQgYSBgcnVuQXM6ICdzeXN0ZW0nYCBzd2VlcCBvciBpbXBvcnRcbiAgLy8gd291bGQgc2ltcGx5IGJ5cGFzcyBpdC4gVGhlIHZlcmRpY3QgYW5kIHRoZSBzdGFnZSB3cml0ZSBiZWxvdyBhbHNvIGxhbmQgb25cbiAgLy8gY29sdW1ucyB0aGUgcmVhZG9ubHkgc3RyaXAgcHJvdGVjdHMsIHdoaWNoIG9ubHkgYSBwbGF0Zm9ybSB3cml0ZSByZWFjaGVzLlxuICBydW5BczogJ3N5c3RlbScsXG5cbiAgdmFyaWFibGVzOiBbXG4gICAgeyBuYW1lOiAnb3Bwb3J0dW5pdHlJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gIF0sXG5cbiAgbm9kZXM6IFtcbiAgICB7XG4gICAgICBpZDogJ3N0YXJ0JyxcbiAgICAgIHR5cGU6ICdzdGFydCcsXG4gICAgICBsYWJlbDogJ1N0YXJ0JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgICAgdHJpZ2dlclR5cGU6ICdyZWNvcmQtYWZ0ZXItdXBkYXRlJyxcbiAgICAgICAgLy8gVE9UQUxJVFkgKEFHRU5UUy5tZCBcdTIwMTQgdmFsaWRhdGlvbiBwcmVkaWNhdGVzIG11c3QgYmUgVE9UQUwpOiBgaGFzKClgXG4gICAgICAgIC8vIG9uIGV2ZXJ5IHJlYWQuIEEgZmxvdyBjb25kaXRpb24gaXMgc3RyaWN0IENFTCBvbiBldmVyeSBydW4gYW5kIGFuXG4gICAgICAgIC8vIHVuZ3VhcmRlZCByZWFkIGFnYWluc3QgYSBkcml2ZXIgdGhhdCBvbWl0cyBhYnNlbnQgY29sdW1ucyBhYm9ydHMsXG4gICAgICAgIC8vIHdoaWNoIGZyb20gMTcuMC4wLXJjLjIgRkFJTFMgVEhFIFJVTiByYXRoZXIgdGhhbiBza2lwcGluZyBpdC4gVGhlXG4gICAgICAgIC8vIGFic2VudCBjYXNlIG11c3QgcmVhZCBhcyBcIm5vdCBnYXRlZFwiOiBhIGRlYWwgd2l0aCBubyBnYXRlIGNvbHVtbiBhdFxuICAgICAgICAvLyBhbGwgcHJlZGF0ZXMgdGhlIGZpZWxkIGFuZCBjbG9zZXMgdGhlIHdheSBpdCBhbHdheXMgZGlkLlxuICAgICAgICAvL1xuICAgICAgICAvLyBUaHJlZSBoYWx2ZXM6XG4gICAgICAgIC8vXG4gICAgICAgIC8vIC0gdGhlIGdhdGUgaXMgQVJNRUQ6IGBwZW5kaW5nYCAoYm9ybiBhcm1lZCwgbm8gcmVxdWVzdCBkZWNpZGVkIHlldClcbiAgICAgICAgLy8gICBvciBgcmVqZWN0ZWRgICh0aGUgbGFzdCByZXF1ZXN0IHdhcyByZWZ1c2VkKS4gYHJlamVjdGVkYCByZS1vcGVuc1xuICAgICAgICAvLyAgIG9uIGEgbmV3IHJlcXVlc3QgYmVjYXVzZSBgb3Bwb3J0dW5pdHkuaG9vay50c2AgcmVmdXNlcyBhIGRpcmVjdFxuICAgICAgICAvLyAgIGNsb3NlIGluIGJvdGggc3RhdGVzIFx1MjAxNCBpZiBvbmx5IGBwZW5kaW5nYCBlbnRlcmVkIGhlcmUsIGEgcmVqZWN0ZWRcbiAgICAgICAgLy8gICBkZWFsIGNvdWxkIGJlIG5laXRoZXIgcmVxdWVzdGVkIG5vciBjbG9zZWQsIGV2ZXIuXG4gICAgICAgIC8vIC0gYSByZXF1ZXN0IGlzIHByZXNlbnQ7XG4gICAgICAgIC8vIC0gdGhlIHJlcXVlc3QgaXMgTkVXIG9uIHRoaXMgd3JpdGUuIFRSQU5TSVRJT04sIG5vdCBjdXJyZW50IHZhbHVlIFx1MjAxNFxuICAgICAgICAvLyAgIHRoZSBpZGlvbSBgYmlsbGluZ19oYW5kb2ZmX2Nsb3NlZF93b25gIHJlY29yZHMgZm9yIHRoaXMgb2JqZWN0LlxuICAgICAgICAvLyAgIFdpdGhvdXQgaXQgdGhlIGZsb3cgcmUtZmlyZXMgb24gaXRzIG93biB3cml0ZS1iYWNrIHdoaWxlIHRoZVxuICAgICAgICAvLyAgIHJlcXVlc3QgaXMgc3RpbGwgb3BlbiAodGhlIGFwcHJvdmFsIG5vZGUncyBgcGVuZGluZ2Agc3RhbXAgdGhyb3VnaFxuICAgICAgICAvLyAgIGBhcHByb3ZhbFN0YXR1c0ZpZWxkYCBpcyBhbiB1cGRhdGUgb2YgdGhpcyByZWNvcmQpLiBNZWFzdXJlZCBvblxuICAgICAgICAvLyAgIDE3LjYuMCB3aXRoIHRoaXMgdGVybSBkZWxldGVkOiBvbmUgcmUtZW50cnkgcGVyIHJlcXVlc3QsIGVhY2hcbiAgICAgICAgLy8gICBjYXVnaHQgb25seSBieSB0aGUgZW5naW5lJ3Mgc2VsZi10cmlnZ2VyIGd1YXJkIChcInRoZSBndWFyZCBhc1xuICAgICAgICAvLyAgIGF1dGhvcmVkIGRvZXMgbm90IGV4Y2x1ZGUgdGhlIGZsb3cncyBvd24gd3JpdGUtYmFja1wiKTsgd2l0aCBpdCxcbiAgICAgICAgLy8gICBub25lLiBgcHJldmlvdXMuKmAgaXMgZ3VhcmRlZCBGQUlMLUNMT1NFRDogbm8gdmlzaWJsZSBwcmlvclxuICAgICAgICAvLyAgIHZhbHVlLCBubyB2aXNpYmxlIG5ldyByZXF1ZXN0LlxuICAgICAgICAvL1xuICAgICAgICAvLyBgYXBwbHlfc3RhdHVzYCBsZWF2ZXMgdGhlIGdhdGUgYGFwcHJvdmVkYCAob3V0IG9mIHJlYWNoKSBhbmRcbiAgICAgICAgLy8gYGNsZWFyX3JlcXVlc3RgIGVtcHRpZXMgdGhlIHJlcXVlc3QsIHNvIG5laXRoZXIgcmUtZW50ZXJzLlxuICAgICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5zdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1cylcbiAgICAgICAgICAmJiAocmVjb3JkLnN0YXR1c19jaGFuZ2VfYXBwcm92YWxfc3RhdHVzID09IFwicGVuZGluZ1wiIHx8IHJlY29yZC5zdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1cyA9PSBcInJlamVjdGVkXCIpXG4gICAgICAgICAgJiYgaGFzKHJlY29yZC5yZXF1ZXN0ZWRfc3RhdHVzKSAmJiByZWNvcmQucmVxdWVzdGVkX3N0YXR1cyAhPSBudWxsICYmIHJlY29yZC5yZXF1ZXN0ZWRfc3RhdHVzICE9IFwiXCJcbiAgICAgICAgICAmJiBoYXMocHJldmlvdXMucmVxdWVzdGVkX3N0YXR1cykgJiYgcHJldmlvdXMucmVxdWVzdGVkX3N0YXR1cyAhPSByZWNvcmQucmVxdWVzdGVkX3N0YXR1c2AsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdnZXRfb3Bwb3J0dW5pdHknLFxuICAgICAgdHlwZTogJ2dldF9yZWNvcmQnLFxuICAgICAgbGFiZWw6ICdHZXQgT3Bwb3J0dW5pdHknLFxuICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLCBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sIG91dHB1dFZhcmlhYmxlOiAnb3BwUmVjb3JkJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdzdGF0dXNfcmV2aWV3JyxcbiAgICAgIHR5cGU6ICdhcHByb3ZhbCcsXG4gICAgICBsYWJlbDogJ1N0YXR1cyBDaGFuZ2UgUmV2aWV3JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBUaGUgY3VzdG9tZXIncyBjaGFpbiBpcyBcdTk1MDBcdTU1MkVcdThEMUZcdThEMjNcdTRFQkEgXHUyMTkyIFx1NEU4Qlx1NEUxQVx1OTBFOFx1OEQxRlx1OEQyM1x1NEVCQTsgdGhlIGdlbmVyaWMgc2hhcGUgY29yZVxuICAgICAgICAvLyBzaGlwcyBpcyB0aGUgbWFuYWdlciBiZW5jaCB0aGlzIGFwcCBhbHJlYWR5IGRlY2xhcmVzIGFwcHJvdmVyc1xuICAgICAgICAvLyBhZ2FpbnN0LiBBIHNlY29uZCB0aWVyLCBvciBhIGRpZmZlcmVudCBwb3NpdGlvbiwgaXMgb3ZlcmxheVxuICAgICAgICAvLyBjb25maWd1cmF0aW9uIChSRVEtMDAwNiBhY2NlcHRhbmNlIDUpLlxuICAgICAgICBhcHByb3ZlcnM6IFt7IHR5cGU6ICdwb3NpdGlvbicsIHZhbHVlOiAnc2FsZXNfbWFuYWdlcicgfV0sXG4gICAgICAgIC8vIEV4cGxpY2l0IHRob3VnaCBpdCBpcyB0aGUgc2NoZW1hIGRlZmF1bHQsIGV4YWN0bHkgYXMgYm90aCBzaWJsaW5nXG4gICAgICAgIC8vIGFwcHJvdmFscyBhdXRob3IgaXQ6IGFwcHJvdmVycyBzbmFwc2hvdCBhdCByZXF1ZXN0IGNyZWF0aW9uLCBzbyBhblxuICAgICAgICAvLyBlbXB0eSBiZW5jaCB3b3VsZCBsZWF2ZSB0aGUgcmVxdWVzdCB1bmRlY2lkYWJsZSBcdTIwMTQgYW5kIGhlcmUgdGhhdFxuICAgICAgICAvLyBtZWFucyBhIGRlYWwgbm9ib2R5IGNhbiBldmVyIGNsb3NlLlxuICAgICAgICBvbkVtcHR5QXBwcm92ZXJzOiAnYWRtaW5fcmVzY3VlJyxcbiAgICAgICAgYmVoYXZpb3I6ICdmaXJzdF9yZXNwb25zZScsXG4gICAgICAgIC8vIGB0cnVlYCwgbWF0Y2hpbmcgYG9wcG9ydHVuaXR5X2FwcHJvdmFsYCBhbmQgTk9UIHRoZSBsZWFkIGdhdGU6IGEgZGVhbFxuICAgICAgICAvLyBhd2FpdGluZyBhIHdvbi9sb3N0IHZlcmRpY3QgbXVzdCBub3Qga2VlcCBtb3ZpbmcgdW5kZXJuZWF0aCB0aGVcbiAgICAgICAgLy8gYXBwcm92ZXIuIEl0cyBuYXJyYXRpdmUgZmllbGRzIGFyZSB3aGF0IHRoZSBmcmVlemUgaG9vayBsZWF2ZXMgb3BlblxuICAgICAgICAvLyBhbnl3YXkuXG4gICAgICAgIGxvY2tSZWNvcmQ6IHRydWUsXG4gICAgICAgIGFwcHJvdmFsU3RhdHVzRmllbGQ6ICdzdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1cycsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gVGhlIGFwcHJvdmVkIGRlY2lzaW9uIGlzIHdoYXQgbW92ZXMgdGhlIHN0YWdlIFx1MjAxNCBcIlx1OTAxQVx1OEZDN1x1NTQwRVx1NkI2M1x1NUYwRlx1NzUxRlx1NjU0OFwiLlxuICAgICAgLy9cbiAgICAgIC8vIFx1MjZBMFx1RkUwRiBCb3RoIGZpZWxkcyBpbiBPTkUgd3JpdGUsIGFuZCB0aGF0IGlzIGxvYWQtYmVhcmluZzogdGhlXG4gICAgICAvLyBzdGF0dXMtY2hhbmdlIGd1YXJkIGluIGBvcHBvcnR1bml0eS5ob29rLnRzYCByZWFkcyB0aGUgZ2F0ZSBjb2x1bW5cbiAgICAgIC8vIElOUFVULUZJUlNULCBzbyB0aGlzIHdyaXRlIHByZXNlbnRzIGl0c2VsZiBhcyBhbHJlYWR5LWFwcHJvdmVkIGFuZCB0aGVcbiAgICAgIC8vIGd1YXJkIGxldHMgdGhlIHN0YWdlIHRocm91Z2guIFNwbGl0dGluZyBpdCBpbnRvIHR3byB3cml0ZXMgd291bGQgaGF2ZVxuICAgICAgLy8gdGhlIGd1YXJkIHJlZnVzZSB0aGUgZmxvdydzIG93biB3cml0ZSAoRUxFVkFUSU9OIElTIE5PVCBBTk9OWU1JVFkgXHUyMDE0XG4gICAgICAvLyBgcnVuQXM6ICdzeXN0ZW0nYCBjYXJyaWVzIHRoZSB0cmlnZ2VyaW5nIHVzZXIsIHNvIGBjdHgudXNlcj8uaWRgIGlzXG4gICAgICAvLyBwcmVzZW50IGluIHRoaXMgcnVuKS5cbiAgICAgIC8vXG4gICAgICAvLyBgd2luX3JlYXNvbmAgLyBgbG9zc19yZWFzb25gIGFyZSBgcmVxdWlyZWRXaGVuYCB0aGUgc3RhZ2UgaXMgY2xvc2VkIGFuZFxuICAgICAgLy8gYXJlIGV2YWx1YXRlZCBhZ2FpbnN0IHRoZSBtZXJnZWQgcmVjb3JkLCBzbyB0aGUgdmFsdWVzIHRoZSByZXAgY2FwdHVyZWRcbiAgICAgIC8vIHdoZW4gcmVxdWVzdGluZyBzYXRpc2Z5IHRoZW0gaGVyZS5cbiAgICAgIGlkOiAnYXBwbHlfc3RhdHVzJyxcbiAgICAgIHR5cGU6ICd1cGRhdGVfcmVjb3JkJyxcbiAgICAgIGxhYmVsOiAnQXBwbHkgUmVxdWVzdGVkIFN0YXR1cycsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgIGZpbHRlcjogeyBpZDogY2VsYHJlY29yZC5pZGAgfSxcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgc3RhZ2U6IGNlbGBvcHBSZWNvcmQucmVxdWVzdGVkX3N0YXR1c2AsXG4gICAgICAgICAgc3RhdHVzX2NoYW5nZV9hcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcsXG4gICAgICAgICAgYXBwcm92ZWRfZGF0ZTogY2VsYGlzb0RhdGV0aW1lKG5vdygpKWAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gQSByZWplY3RlZCByZXF1ZXN0IGlzIGNsZWFyZWQsIG5vdCBsZWZ0IHN0YW5kaW5nLCBhbmQgdGhlIHZlcmRpY3Qgc3RheXNcbiAgICAgIC8vIGByZWplY3RlZGAgc28gdGhlIGhvb2sga2VlcHMgcmVmdXNpbmcgYSBkaXJlY3QgY2xvc2U6IHRoZSB3YXkgb24gaXMgYVxuICAgICAgLy8gbmV3IHJlcXVlc3QsIHdoaWNoIHRoZSBzdGFydCBjb25kaXRpb24gb3BlbnMgYXMgYSBmcmVzaCBhcHByb3ZhbC5cbiAgICAgIGlkOiAnY2xlYXJfcmVxdWVzdCcsXG4gICAgICB0eXBlOiAndXBkYXRlX3JlY29yZCcsXG4gICAgICBsYWJlbDogJ0NsZWFyIFJlamVjdGVkIFJlcXVlc3QnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBzdGF0dXNfY2hhbmdlX2FwcHJvdmFsX3N0YXR1czogJ3JlamVjdGVkJywgcmVxdWVzdGVkX3N0YXR1czogbnVsbCB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG5cbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ2dldF9vcHBvcnR1bml0eScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ2dldF9vcHBvcnR1bml0eScsIHRhcmdldDogJ3N0YXR1c19yZXZpZXcnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAvLyBBcHByb3ZhbC1ub2RlIGJyYW5jaCBsYWJlbHMuXG4gICAgeyBpZDogJ2UzJywgc291cmNlOiAnc3RhdHVzX3JldmlldycsIHRhcmdldDogJ2FwcGx5X3N0YXR1cycsIHR5cGU6ICdkZWZhdWx0JywgbGFiZWw6ICdhcHByb3ZlJyB9LFxuICAgIHsgaWQ6ICdlNCcsIHNvdXJjZTogJ3N0YXR1c19yZXZpZXcnLCB0YXJnZXQ6ICdjbGVhcl9yZXF1ZXN0JywgdHlwZTogJ2RlZmF1bHQnLCBsYWJlbDogJ3JlamVjdCcgfSxcbiAgICB7IGlkOiAnZTUnLCBzb3VyY2U6ICdhcHBseV9zdGF0dXMnLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTYnLCBzb3VyY2U6ICdjbGVhcl9yZXF1ZXN0JywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3Mvb3Bwb3J0dW5pdHktcXVhbGlmaWNhdGlvbi1hcHByb3ZhbC5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL29wcG9ydHVuaXR5LXF1YWxpZmljYXRpb24tYXBwcm92YWwuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNiBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUCwgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIE9wcG9ydHVuaXR5IFF1YWxpZmljYXRpb24gQXBwcm92YWwgXHUyMDE0IHRoZSBcdTdBQ0JcdTk4Nzkgc2lnbi1vZmYgYSBuZXcgZGVhbCBuZWVkc1xuICogYmVmb3JlIGl0cyBzdGFnZSBvciBpdHMgd29uL2xvc3QgY2FsbCBtYXkgY2hhbmdlLiBXaWxsIEJpZCAoXHU2NjJGXHU1NDI2XHU2Mjk1XHU2ODA3KSBpc1xuICogbm90IGhlbGQ6IHN0ZXAgOCBtYWtlcyBpdCBpbnB1dCB0byBcdTdBQ0JcdTk4NzksIGZvciB0aGUgYXBwcm92ZXIgdG8gcmVhZCAoIzIwMDQpLlxuICpcbiAqIFJFUS0wMDA2IHN0ZXAgMTE6IFx1MzAwQ1x1OTUwMFx1NTUyRVx1N0FDQlx1OTg3OVx1OTcwMFx1OEQ3MFx1NUJBMVx1NjI3OVx1NkQ0MVx1N0EwQlx1RkYxQlx1NjVCMFx1NTg5RVx1NTU0Nlx1NjczQVx1NTNFRlx1OERERlx1OEZEQlx1RkYwQ1x1N0FDQlx1OTg3OVx1OTAxQVx1OEZDN1x1NTQwRVx1NjVCOVx1NTNFRlx1NjZGNFx1NjVCMFx1OTYzNlx1NkJCNVx1MzAwMVx1NjI5NVx1NjgwN1x1MzAwMVxuICogXHU4RDYyXHU0RTIyXHU1MzU1XHU2NENEXHU0RjVDXHUzMDAyXHUzMDBEIEV4cHJlc3NlZCBhcyBhbiAqKmFwcHJvdmFsIG5vZGUqKiAoYHR5cGU6ICdhcHByb3ZhbCdgLCBBRFItMDAxOSksXG4gKiB0aGUgY29uc3RydWN0IGBvcHBvcnR1bml0eS1hcHByb3ZhbC5mbG93LnRzYCBhbHJlYWR5IHVzZXMgXHUyMDE0IFx1MjZENCB0aGVyZSBpcyBub1xuICogYHdvcmtmbG93YCBtZXRhZGF0YSB0eXBlIGFuZCBubyBzdGFuZGFsb25lIGBBcHByb3ZhbFByb2Nlc3NgIHRvIGF1dGhvci5cbiAqXG4gKiBCdWlsdCBvbiBgb3Bwb3J0dW5pdHktc3RhdHVzLWNoYW5nZS1hcHByb3ZhbC5mbG93LnRzYCAoUkVRLTAwMDYgc3RlcCAxNCkgYW5kXG4gKiBkZWxpYmVyYXRlbHkgdGhlIHNhbWUgaW4gZXZlcnkgbG9hZC1iZWFyaW5nIHRlcm06IHRoZSBzd2l0Y2ggaXMgYSB2ZXJkaWN0XG4gKiBmaWVsZCdzIGBkZWZhdWx0VmFsdWVgLCB0aGUgcmVwIHdyaXRlcyBhIFJFUVVFU1QgYW5kIHRoZSBmbG93IG9wZW5zIG9uZVxuICogYXBwcm92YWwgd2hlbiB0aGUgcmVxdWVzdCBpcyBORVcsIGByZWplY3RlZGAgcmUtb3BlbnMgb24gYSBuZXcgcmVxdWVzdCxcbiAqIGBydW5BczogJ3N5c3RlbSdgLCBgb25FbXB0eUFwcHJvdmVyczogJ2FkbWluX3Jlc2N1ZSdgLiBUaGUgcmVmdXNhbCBvZiB0aGVcbiAqIHR3byBnYXRlZCBhY3RzIGxpdmVzIGJlc2lkZSB0aGUgc3RlcC0xNCByZWZ1c2FsIGluIGBvcHBvcnR1bml0eS5ob29rLnRzYCdzXG4gKiBgb3Bwb3J0dW5pdHlfbGlmZWN5Y2xlYC4gV2hlcmUgaXQgZGlmZmVycywgdGhlIHJlYXNvbiBpcyB3cml0dGVuIGJlc2lkZSBpdFxuICogKGBsb2NrUmVjb3JkYCkuXG4gKlxuICogIyMgXHUyNkEwXHVGRTBGIFRoaXMgZmxvdyBpcyBJTkVSVCB1bnRpbCBhbiBpbnN0YWxsIGFybXMgdGhlIGdhdGUsIGFuZCB0aGF0IGlzIGJ5IGRlc2lnblxuICpcbiAqIFJFUS0wMDA2ICpEaXNwb3NpdGlvbio6IFwiKipCb3RoIGdhdGVzIG11c3QgYmUgY29uZmlndXJhYmxlIFx1MjAxNCBvZmYgYnlcbiAqIGRlZmF1bHQqKiwgc28gZXhpc3RpbmcgaW5zdGFsbHMga2VlcCB0b2RheSdzIGFtb3VudC1vbmx5IGJlaGF2aW91ci5cIlxuICpcbiAqIFRoZSBzd2l0Y2ggaXMgYGNybV9vcHBvcnR1bml0eS5xdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1c2Anc1xuICogYGRlZmF1bHRWYWx1ZWAsIFx1MjZENCBub3QgdGhpcyBmbG93J3MgYHN0YXR1c2AgKGBkcmFmdGAgc3RpbGwgZmlyZXMgdHJpZ2dlcnMgYW5kXG4gKiBgb2Jzb2xldGVgIGlzIGEgZ2F0ZSBubyBpbnN0YWxsIGNhbiB0dXJuIE9OIFx1MjAxNCBtZWFzdXJlZCBhbmQgcmVjb3JkZWQgaW5cbiAqIGBsZWFkLWNvbnZlcnNpb24tYXBwcm92YWwuZmxvdy50c2A7IFx1MjZENCBkbyBub3QgcmUtZGVyaXZlIGl0IGhlcmUpLiBTaGlwcGVkLFxuICogdGhhdCBkZWZhdWx0IGlzIGBub3RfcmVxdWlyZWRgLCBzbyBubyBkZWFsIGlzIGV2ZXIgYm9ybiBgcGVuZGluZ2AsIHRoZSBzdGFydFxuICogY29uZGl0aW9uIGJlbG93IGlzIGZhbHNlIGZvciBldmVyeSByZWNvcmQgdGhhdCBoYXMgZXZlciBleGlzdGVkLCBhbmQgdGhpc1xuICogZmxvdyBvcGVucyBub3RoaW5nIFx1MjAxNCBpdCBjb3N0cyBvbmUgcHJlZGljYXRlIGV2YWx1YXRpb24gcGVyIHVwZGF0ZS4gQW5cbiAqIGluc3RhbGwgYXJtcyB0aGUgZ2F0ZSBieSBjaGFuZ2luZyB0aGF0IG9uZSB2YWx1ZSB0byBgJ3BlbmRpbmcnYC5cbiAqXG4gKiAjIyBXaXRoIHRoZSBzdGF0dXMtY2hhbmdlIGdhdGUgYXJtZWQgdG9vXG4gKlxuICogXHU3QUNCXHU5ODc5IGNvbWVzIGZpcnN0OiB3aGlsZSB0aGlzIHZlcmRpY3QgaXMgYHBlbmRpbmdgIG9yIGByZWplY3RlZGAsXG4gKiBgb3Bwb3J0dW5pdHlfbGlmZWN5Y2xlYCByZWZ1c2VzIGEgbmV3IGByZXF1ZXN0ZWRfc3RhdHVzYCwgc28gbm8gc3RhdHVzLWNoYW5nZVxuICogYXBwcm92YWwgY2FuIGJlIGFza2VkIGZvci4gT25jZSBcdTdBQ0JcdTk4NzkgaXMgYGFwcHJvdmVkYCB0aGlzIGZsb3cgaXMgb3V0IG9mIHJlYWNoXG4gKiBmb3IgZ29vZCwgYW5kIHRoZSBzdGF0dXMtY2hhbmdlIGdhdGUgYmVoYXZlcyBleGFjdGx5IGFzIGl0IGRvZXMgYWxvbmUuIFRoaXNcbiAqIGZsb3cncyBvd24gd3JpdGVzIGNhcnJ5IG5laXRoZXIgYHN0YWdlYCBub3IgYHJlcXVlc3RlZF9zdGF0dXNgLCBzbyB0aGV5IGNhblxuICogdHJpcCBuZWl0aGVyIGdhdGU7IGJvdGggY29sdW1ucyBzaXQgaW4gdGhlIGhvb2sncyBBUFBST1ZBTF9GSUVMRFMgc28gdGhlXG4gKiBjbG9zZWQtZGVhbCBmcmVlemUgY2Fubm90IHJlZnVzZSB0aGVtIGVpdGhlci5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgVGhlIHBsYXRmb3JtIGhvbGRzIE9ORSBwZW5kaW5nIGFwcHJvdmFsIHBlciByZWNvcmQgKGBvcGVuTm9kZVJlcXVlc3RgXG4gKiB0aHJvd3MgYERVUExJQ0FURV9SRVFVRVNUYCBvdGhlcndpc2UsIGBAb2JqZWN0c3RhY2svcGx1Z2luLWFwcHJvdmFsc2BcbiAqIDE3LjYuMCksIHNvIHRoZSBvcHBvcnR1bml0eSBnYXRlcyBuZXZlciBzdGFjayBvbiBvbmUgZGVhbDogYSByZXF1ZXN0IGFcbiAqIHNlY29uZCBnYXRlIHdvdWxkIG9wZW4gd2hpbGUgYW5vdGhlciBpcyBwZW5kaW5nIGlzIHJlZnVzZWQsIG5vdCBxdWV1ZWQuXG4gKiBNZWFzdXJlZCBvbiBhIDE3LjYuMCBib290IHdpdGggdGhpcyBnYXRlIGFybWVkOiBhIGRlYWwgcmFpc2VkIHBhc3RcbiAqIGBMQVJHRV9ERUFMX0FNT1VOVGAgd2hpbGUgaXRzIFx1N0FDQlx1OTg3OSByZXF1ZXN0IHdhaXRlZCBmYWlsZWRcbiAqIGBvcHBvcnR1bml0eV9hcHByb3ZhbGAncyBydW4gd2l0aCB0aGF0IGVycm9yIChsb2dnZWQsIG5vdGhpbmcgb3BlbmVkKTsgdGhlXG4gKiBhbW91bnQgYXBwcm92YWwgb3BlbmVkIG9uIHRoZSBuZXh0IHdyaXRlLCB3aGljaCB3YXMgdGhpcyBmbG93J3Mgb3duIHZlcmRpY3RcbiAqIHN0YW1wLCBiZWNhdXNlIHRoZSBhbW91bnQgZmxvdydzIGVudHJ5IHRlc3RzIHRoZSBjdXJyZW50IHZhbHVlLlxuICovXG5leHBvcnQgY29uc3QgT3Bwb3J0dW5pdHlRdWFsaWZpY2F0aW9uQXBwcm92YWxGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnb3Bwb3J0dW5pdHlfcXVhbGlmaWNhdGlvbl9hcHByb3ZhbCcsXG4gIGxhYmVsOiAnT3Bwb3J0dW5pdHkgUXVhbGlmaWNhdGlvbiBBcHByb3ZhbCcsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdUaGUgXHU3QUNCXHU5ODc5IHNpZ24tb2ZmIGEgZGVhbCBuZWVkcyBiZWZvcmUgaXRzIHN0YWdlIG9yIHdvbi9sb3N0IGNhbGwgbWF5IGNoYW5nZS4gSW5lcnQgdW5sZXNzIHRoZSBpbnN0YWxsIGFybXMgdGhlIGdhdGUgb24gY3JtX29wcG9ydHVuaXR5LnF1YWxpZmljYXRpb25fYXBwcm92YWxfc3RhdHVzLicsXG4gIHR5cGU6ICdyZWNvcmRfY2hhbmdlJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gVGhlIHJlYWRpbmcgYm90aCBzaWJsaW5nIGdhdGVzIHJlY29yZCBmcm9tIGBvcHBvcnR1bml0eV9hcHByb3ZhbGAnc1xuICAvLyBtZWFzdXJlZCBmYWlsdXJlOiBhIGdhdGUgdGhhdCBlbmdhZ2VzIG9ubHkgZm9yIHdyaXRlcnMgY2FycnlpbmcgYSBzZXNzaW9uXG4gIC8vIGlzIG5vdCBhIGNvbnRyb2wuIFRoZSB2ZXJkaWN0IHdyaXRlcyBiZWxvdyBhbHNvIGxhbmQgb24gYSBjb2x1bW4gdGhlXG4gIC8vIHJlYWRvbmx5IHN0cmlwIHByb3RlY3RzLCB3aGljaCBvbmx5IGEgcGxhdGZvcm0gd3JpdGUgcmVhY2hlcy5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuXG4gIHZhcmlhYmxlczogW1xuICAgIHsgbmFtZTogJ29wcG9ydHVuaXR5SWQnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICBdLFxuXG4gIG5vZGVzOiBbXG4gICAge1xuICAgICAgaWQ6ICdzdGFydCcsXG4gICAgICB0eXBlOiAnc3RhcnQnLFxuICAgICAgbGFiZWw6ICdTdGFydCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgIHRyaWdnZXJUeXBlOiAncmVjb3JkLWFmdGVyLXVwZGF0ZScsXG4gICAgICAgIC8vIFRPVEFMSVRZIChBR0VOVFMubWQgXHUyMDE0IHZhbGlkYXRpb24gcHJlZGljYXRlcyBtdXN0IGJlIFRPVEFMKTogYGhhcygpYFxuICAgICAgICAvLyBvbiBldmVyeSByZWFkOyB0aGUgYWJzZW50IGNhc2UgcmVhZHMgYXMgXCJub3QgZ2F0ZWRcIi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gVGhyZWUgaGFsdmVzLCB0aGUgc3RhdHVzLWNoYW5nZSBnYXRlJ3Mgb3duOlxuICAgICAgICAvL1xuICAgICAgICAvLyAtIHRoZSBnYXRlIGlzIEFSTUVEOiBgcGVuZGluZ2Agb3IgYHJlamVjdGVkYC4gYHJlamVjdGVkYCByZS1vcGVucyBvbiBhXG4gICAgICAgIC8vICAgbmV3IHJlcXVlc3QgYmVjYXVzZSB0aGUgaG9vayByZWZ1c2VzIHRoZSBnYXRlZCBhY3RzIGluIGJvdGggc3RhdGVzIFx1MjAxNFxuICAgICAgICAvLyAgIGlmIG9ubHkgYHBlbmRpbmdgIGVudGVyZWQgaGVyZSwgYSByZWplY3RlZCBkZWFsIGNvdWxkIG5ldmVyIHF1YWxpZnkuXG4gICAgICAgIC8vIC0gdGhlIHJlcXVlc3QgaXMgdGlja2VkO1xuICAgICAgICAvLyAtIHRoZSByZXF1ZXN0IGlzIE5FVyBvbiB0aGlzIHdyaXRlLiBUUkFOU0lUSU9OLCBub3QgY3VycmVudCB2YWx1ZTpcbiAgICAgICAgLy8gICB0aGUgYXBwcm92YWwgbm9kZSdzIGBwZW5kaW5nYCBzdGFtcCB0aHJvdWdoIGBhcHByb3ZhbFN0YXR1c0ZpZWxkYCBpc1xuICAgICAgICAvLyAgIGFuIHVwZGF0ZSBvZiB0aGlzIHJlY29yZCB3aGlsZSB0aGUgcmVxdWVzdCBpcyBzdGlsbCB0aWNrZWQsIGFuZCBhXG4gICAgICAgIC8vICAgY3VycmVudC12YWx1ZSB0ZXN0IHJlLWZpcmVzIG9uIGl0LiBNZWFzdXJlZCBvbiBhIDE3LjYuMCBib290IHdpdGhcbiAgICAgICAgLy8gICB0aGlzIHRlcm0gZGVsZXRlZDogb25lIHJlLWVudHJ5IHBlciByZXF1ZXN0LCBjYXVnaHQgb25seSBieSB0aGVcbiAgICAgICAgLy8gICBlbmdpbmUncyBzZWxmLXRyaWdnZXIgZ3VhcmQgKFwidGhlIGd1YXJkIGFzIGF1dGhvcmVkIGRvZXMgbm90XG4gICAgICAgIC8vICAgZXhjbHVkZSB0aGUgZmxvdydzIG93biB3cml0ZS1iYWNrXCIpOyB3aXRoIGl0LCBub25lLiBgcHJldmlvdXMuKmAgaXNcbiAgICAgICAgLy8gICBndWFyZGVkIEZBSUwtQ0xPU0VEOiBubyB2aXNpYmxlIHByaW9yIHZhbHVlLCBubyB2aXNpYmxlIG5ldyByZXF1ZXN0LlxuICAgICAgICAvL1xuICAgICAgICAvLyBgbWFya19xdWFsaWZpZWRgIGxlYXZlcyB0aGUgZ2F0ZSBgYXBwcm92ZWRgIChvdXQgb2YgcmVhY2gpIGFuZFxuICAgICAgICAvLyBgY2xlYXJfcmVxdWVzdGAgdW50aWNrcyB0aGUgcmVxdWVzdCwgc28gbmVpdGhlciByZS1lbnRlcnMuXG4gICAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnF1YWxpZmljYXRpb25fYXBwcm92YWxfc3RhdHVzKVxuICAgICAgICAgICYmIChyZWNvcmQucXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXMgPT0gXCJwZW5kaW5nXCIgfHwgcmVjb3JkLnF1YWxpZmljYXRpb25fYXBwcm92YWxfc3RhdHVzID09IFwicmVqZWN0ZWRcIilcbiAgICAgICAgICAmJiBoYXMocmVjb3JkLnF1YWxpZmljYXRpb25fcmVxdWVzdGVkKSAmJiByZWNvcmQucXVhbGlmaWNhdGlvbl9yZXF1ZXN0ZWQgPT0gdHJ1ZVxuICAgICAgICAgICYmIGhhcyhwcmV2aW91cy5xdWFsaWZpY2F0aW9uX3JlcXVlc3RlZCkgJiYgcHJldmlvdXMucXVhbGlmaWNhdGlvbl9yZXF1ZXN0ZWQgIT0gdHJ1ZWAsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdnZXRfb3Bwb3J0dW5pdHknLFxuICAgICAgdHlwZTogJ2dldF9yZWNvcmQnLFxuICAgICAgbGFiZWw6ICdHZXQgT3Bwb3J0dW5pdHknLFxuICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLCBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sIG91dHB1dFZhcmlhYmxlOiAnb3BwUmVjb3JkJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdxdWFsaWZpY2F0aW9uX3JldmlldycsXG4gICAgICB0eXBlOiAnYXBwcm92YWwnLFxuICAgICAgbGFiZWw6ICdRdWFsaWZpY2F0aW9uIFJldmlldycsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgLy8gVGhlIGN1c3RvbWVyJ3MgY2hhaW4gaXMgXHU5NTAwXHU1NTJFXHU4RDFGXHU4RDIzXHU0RUJBIC8gXHU0RThCXHU0RTFBXHU5MEU4XHU1QkExXHU2Mjc5XHU1Qzk3IFx1MjE5MiBcdTRFOEJcdTRFMUFcdTkwRThcdThEMUZcdThEMjNcdTRFQkE7IHRoZSBnZW5lcmljXG4gICAgICAgIC8vIHNoYXBlIGNvcmUgc2hpcHMgaXMgdGhlIG1hbmFnZXIgYmVuY2ggYm90aCBzaWJsaW5nIGdhdGVzIHJvdXRlIHRvLiBBXG4gICAgICAgIC8vIHNlY29uZCB0aWVyLCBvciBhIGRpZmZlcmVudCBwb3NpdGlvbiwgaXMgb3ZlcmxheSBjb25maWd1cmF0aW9uXG4gICAgICAgIC8vIChSRVEtMDAwNjogdGhlIG5hbWVkIGFwcHJvdmFsIGNoYWlucyBhcmUgQykuXG4gICAgICAgIGFwcHJvdmVyczogW3sgdHlwZTogJ3Bvc2l0aW9uJywgdmFsdWU6ICdzYWxlc19tYW5hZ2VyJyB9XSxcbiAgICAgICAgLy8gRXhwbGljaXQgdGhvdWdoIGl0IGlzIHRoZSBzY2hlbWEgZGVmYXVsdCwgYXMgZXZlcnkgc2libGluZyBhdXRob3JzXG4gICAgICAgIC8vIGl0OiBhbiBlbXB0eSBiZW5jaCB3b3VsZCBsZWF2ZSB0aGUgcmVxdWVzdCB1bmRlY2lkYWJsZSBcdTIwMTQgaGVyZSwgYVxuICAgICAgICAvLyBkZWFsIHRoYXQgY2FuIG5ldmVyIG1vdmUgaXRzIHN0YWdlLlxuICAgICAgICBvbkVtcHR5QXBwcm92ZXJzOiAnYWRtaW5fcmVzY3VlJyxcbiAgICAgICAgYmVoYXZpb3I6ICdmaXJzdF9yZXNwb25zZScsXG4gICAgICAgIC8vIFx1MjZBMFx1RkUwRiBgZmFsc2VgLCBOT1QgdGhlIHN0YXR1cy1jaGFuZ2UgZ2F0ZSdzIGB0cnVlYCBcdTIwMTQgdGhlIG9uZSB0ZXJtIHRoaXNcbiAgICAgICAgLy8gbm9kZSBkZWxpYmVyYXRlbHkgdGFrZXMgZnJvbSB0aGUgTEVBRCBnYXRlIGluc3RlYWQuIFN0ZXAgMTEgc2F5cyBpdFxuICAgICAgICAvLyBpbiBhcyBtYW55IHdvcmRzOiBcdTMwMENcdTY1QjBcdTU4OUVcdTU1NDZcdTY3M0FcdTUzRUZcdThEREZcdThGREJcdTMwMEQuIEEgZGVhbCBhd2FpdGluZyBcdTdBQ0JcdTk4NzkgaXMgc3RpbGwgYmVpbmdcbiAgICAgICAgLy8gd29ya2VkIFx1MjAxNCB0aGUgbmFycmF0aXZlLCB0aGUgY3VzdG9tZXIgY2FsZW5kYXIsIHRoZSBhbW91bnQgYW5kIFdpbGxcbiAgICAgICAgLy8gQmlkIGFyZSB3aGF0IHRoZSBhcHByb3ZlciByZWFkcyBcdTIwMTQgYW5kIGxvY2tpbmcgaXQgd291bGQgc3RvcCB0aGF0IHdvcmtcbiAgICAgICAgLy8gZm9yIGFzIGxvbmcgYXMgdGhlIGFwcHJvdmVyIHRha2VzLiBUaGUgdHdvIGFjdHMgdGhlIGdhdGUgZXhpc3RzIHRvIGhvbGRcbiAgICAgICAgLy8gYXJlIHJlZnVzZWQgYnkgYG9wcG9ydHVuaXR5X2xpZmVjeWNsZWAgd2hldGhlciBvciBub3QgYSByZXF1ZXN0IGlzXG4gICAgICAgIC8vIG9wZW4sIHNvIHRoZSBsb2NrIHdvdWxkIGFkZCBub3RoaW5nIGJ1dCB0aGUgZnJlZXplLlxuICAgICAgICBsb2NrUmVjb3JkOiBmYWxzZSxcbiAgICAgICAgYXBwcm92YWxTdGF0dXNGaWVsZDogJ3F1YWxpZmljYXRpb25fYXBwcm92YWxfc3RhdHVzJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ21hcmtfcXVhbGlmaWVkJyxcbiAgICAgIHR5cGU6ICd1cGRhdGVfcmVjb3JkJyxcbiAgICAgIGxhYmVsOiAnTWFyayBRdWFsaWZpZWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBxdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1czogJ2FwcHJvdmVkJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEEgcmVqZWN0ZWQgcmVxdWVzdCBpcyBjbGVhcmVkLCBub3QgbGVmdCBzdGFuZGluZywgYW5kIHRoZSB2ZXJkaWN0IHN0YXlzXG4gICAgICAvLyBgcmVqZWN0ZWRgIHNvIHRoZSBob29rIGtlZXBzIHJlZnVzaW5nIHRoZSBnYXRlZCBhY3RzOiB0aGUgd2F5IG9uIGlzIGFcbiAgICAgIC8vIG5ldyByZXF1ZXN0LCB3aGljaCB0aGUgc3RhcnQgY29uZGl0aW9uIG9wZW5zIGFzIGEgZnJlc2ggYXBwcm92YWwuXG4gICAgICBpZDogJ2NsZWFyX3JlcXVlc3QnLFxuICAgICAgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLFxuICAgICAgbGFiZWw6ICdDbGVhciBSZWplY3RlZCBSZXF1ZXN0JyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgICAgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkLmlkYCB9LFxuICAgICAgICBmaWVsZHM6IHsgcXVhbGlmaWNhdGlvbl9hcHByb3ZhbF9zdGF0dXM6ICdyZWplY3RlZCcsIHF1YWxpZmljYXRpb25fcmVxdWVzdGVkOiBmYWxzZSB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG5cbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ2dldF9vcHBvcnR1bml0eScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ2dldF9vcHBvcnR1bml0eScsIHRhcmdldDogJ3F1YWxpZmljYXRpb25fcmV2aWV3JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gQXBwcm92YWwtbm9kZSBicmFuY2ggbGFiZWxzLlxuICAgIHsgaWQ6ICdlMycsIHNvdXJjZTogJ3F1YWxpZmljYXRpb25fcmV2aWV3JywgdGFyZ2V0OiAnbWFya19xdWFsaWZpZWQnLCB0eXBlOiAnZGVmYXVsdCcsIGxhYmVsOiAnYXBwcm92ZScgfSxcbiAgICB7IGlkOiAnZTQnLCBzb3VyY2U6ICdxdWFsaWZpY2F0aW9uX3JldmlldycsIHRhcmdldDogJ2NsZWFyX3JlcXVlc3QnLCB0eXBlOiAnZGVmYXVsdCcsIGxhYmVsOiAncmVqZWN0JyB9LFxuICAgIHsgaWQ6ICdlNScsIHNvdXJjZTogJ21hcmtfcXVhbGlmaWVkJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U2Jywgc291cmNlOiAnY2xlYXJfcmVxdWVzdCcsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL29wcG9ydHVuaXR5LXN0YWduYXRpb24uZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9vcHBvcnR1bml0eS1zdGFnbmF0aW9uLmZsb3cudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IFAsIGNlbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcbmltcG9ydCB7IGd1YXJkZWQgfSBmcm9tICcuL19ndWFyZGVkLWl0ZXJhdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogT3Bwb3J0dW5pdHkgU3RhZ25hdGlvbiBcdTIwMTQgc2NoZWR1bGVkIFwiZGVhbC1yb3RcIiBkZXRlY3Rvci5cbiAqXG4gKiBUaGlzIGRhaWx5IHN3ZWVwIGlzIHdoYXQgYWN0cyBvbiBgc3RhZ2VfZW50cnlfZGF0ZWAgKHN0YW1wZWQgYnkgdGhlIGxpZmVjeWNsZVxuICogaG9vayBvbiBpbnNlcnQgYW5kIG9uIGV2ZXJ5IHN0YWdlIGNoYW5nZSk6IGl0IGZpbmRzIG9wZW4gb3Bwb3J0dW5pdGllc1xuICogc3RhbGxlZCBsb25nZXIgdGhhbiB0aGUgdGhyZXNob2xkLCBudWRnZXMgdGhlIG93bmVyIGFuZCBib29rcyBhIGZvbGxvdy11cFxuICogdGFzayBzbyB0aGUgZGVhbCByZS1lbnRlcnMgdGhlIHdvcmtpbmcgc2V0LiBBIGRlYWwgd2l0aCBhblxuICogb3BlbiBzdGFsbCB0YXNrIGlzIHNraXBwZWQgKGlkZW1wb3RlbmN5KSwgc28gZWFjaCBzdGFsbCBlcGlzb2RlIHByb2R1Y2VzXG4gKiBleGFjdGx5IG9uZSBudWRnZTsgY29tcGxldGluZyB0aGUgdGFzayByZS1hcm1zIGl0LlxuICpcbiAqIENhcGFiaWxpdGllcyBleGVyY2lzZWQ6IHNjaGVkdWxlZCB0cmlnZ2VyICsgYGxvb3BgICsgYG5vdGlmeWAgKyB0YXNrXG4gKiBjcmVhdGlvbi4gUGlwZWxpbmUtaHlnaWVuZSBhdXRvbWF0aW9uIGlzIG9uZSBvZiB0aGUgaGlnaGVzdC1ST0kgdXNlcyBvZlxuICogRmxvd3MgaW4gYSBzYWxlcyBvcmcuXG4gKi9cbmNvbnN0IFNUQUxFX1RIUkVTSE9MRF9EQVlTID0gMTQ7XG5cbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eVN0YWduYXRpb25GbG93OiBGbG93ID0ge1xuICBuYW1lOiAnb3Bwb3J0dW5pdHlfc3RhZ25hdGlvbicsXG4gIGxhYmVsOiAnU3RhbGxlZCBEZWFsIEFsZXJ0JyxcbiAgZGVzY3JpcHRpb246ICdEYWlseSBzd2VlcDogbnVkZ2Ugb3duZXJzIGFib3V0IG9wZW4gb3Bwb3J0dW5pdGllcyBzdHVjayBpbi1zdGFnZSBiZXlvbmQgdGhlIHRocmVzaG9sZC4nLFxuICB0eXBlOiAnc2NoZWR1bGUnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBTY2hlZHVsZWQgcnVucyBoYXZlIG5vIHRyaWdnZXIgdXNlciwgc28gdW5kZXIgdGhlIGRlZmF1bHQgcnVuQXM6J3VzZXInIHRoZVxuICAvLyBkYXRhIG5vZGVzIGV4ZWN1dGUgVU5TQ09QRUQgYW55d2F5LiBEZWNsYXJlIHJ1bkFzOidzeXN0ZW0nIHRvIG1ha2UgdGhhdFxuICAvLyBSTFMtYnlwYXNzaW5nIGVsZXZhdGlvbiBleHBsaWNpdCBhbmQgaW50ZW5kZWQgKEFEUi0wMDQ5KS5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuXG4gIHZhcmlhYmxlczogW10sXG5cbiAgbm9kZXM6IFtcbiAgICB7IGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0IChkYWlseSAwNzozMCknLCBjb25maWc6IHsgc2NoZWR1bGU6ICczMCA3ICogKiAqJyB9IH0sXG4gICAge1xuICAgICAgaWQ6ICdxdWVyeV9zdGFsbGVkJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0ZpbmQgU3RhbGxlZCBEZWFscycsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgIC8vIFx1MjZENCBQcmVkaWNhdGUgb24gdGhlIFNUT1JFRCBgc3RhZ2VfZW50cnlfZGF0ZWAsIG5ldmVyIG9uXG4gICAgICAgIC8vIGBkYXlzX2luX3N0YWdlYDogdGhlIGxhdHRlciBpcyBhIGZvcm11bGEsIGNvbXB1dGVkIGFmdGVyIHRoZSBxdWVyeSwgc29cbiAgICAgICAgLy8gYXMgYSBmaWx0ZXIga2V5IGl0IGFkZHJlc3NlcyBhIGNvbHVtbiB0aGF0IGRvZXMgbm90IGV4aXN0LlxuICAgICAgICAvLyBgZW50cnkgPCB0b2RheSBcdTIyMTIgTmBcbiAgICAgICAgLy8gaXMgdGhlIHNhbWUgdGVzdCBhcyBgZGF5c19pbl9zdGFnZSA+IE5gLCBjb21wdXRlZCBieSBhIENFTCB2YWx1ZVxuICAgICAgICAvLyBlbnZlbG9wZSAodGhlIGBpc29EYXRlKGRheXNBZ28obikpYCBzcGVsbGluZzsgY29udHJhY3QtcmVuZXdhbCB1c2VzXG4gICAgICAgIC8vIGl0cyBgZGF5c0Zyb21Ob3dgIHR3aW4pLlxuICAgICAgICAvLyBBIHJvdyB3aXRoIGEgbnVsbCBgc3RhZ2VfZW50cnlfZGF0ZWAgZG9lcyBub3Qgc2F0aXNmeSBgJGx0YCBhbmQgaXNcbiAgICAgICAgLy8gc2tpcHBlZCwgcHJlc2VydmluZyBcIm5vdGhpbmcgaGFzIHN0YWduYXRlZCB5ZXRcIiBmb3IgdW5zdGFtcGVkIHJvd3MuXG4gICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgIHN0YWdlOiB7ICRuaW46IFsnY2xvc2VkX3dvbicsICdjbG9zZWRfbG9zdCddIH0sXG4gICAgICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogeyAkbHQ6IGNlbGBpc29EYXRlKGRheXNBZ28oJHtTVEFMRV9USFJFU0hPTERfREFZU30pKWAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgbGltaXQ6IDUwMCxcbiAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdvcHBMaXN0JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2xvb3Bfb3BwcycsIHR5cGU6ICdsb29wJywgbGFiZWw6ICdGb3IgRWFjaCBTdGFsbGVkIERlYWwnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGNvbGxlY3Rpb246IGNlbGBvcHBMaXN0YCxcbiAgICAgICAgaXRlcmF0b3JWYXJpYWJsZTogJ2N1cnJlbnRPcHAnLFxuICAgICAgICBib2R5OiBndWFyZGVkKCdvcHAnLCB7XG4gICAgICAgICAgbm9kZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gSWRlbXBvdGVuY3kgZ2F0ZTogYSBzdGlsbC1vcGVuIHN0YWxsIHRhc2sgbWVhbnMgdGhpcyBkZWFsIHdhc1xuICAgICAgICAgICAgICAvLyBhbHJlYWR5IG51ZGdlZC4gXHUyNkQ0IFdpdGhvdXQgaXQgdGhlIGRhaWx5IHN3ZWVwIHJlLW5vdGlmaWVzIGFuZFxuICAgICAgICAgICAgICAvLyByZS1jcmVhdGVzIGFuIGlkZW50aWNhbCB0YXNrIGV2ZXJ5IG1vcm5pbmcgZm9yIGFzIGxvbmcgYXMgdGhlXG4gICAgICAgICAgICAgIC8vIGRlYWwgc3RheXMgc3RhbGxlZCBcdTIwMTQgYW4gdW5ib3VuZGVkIGR1cGxpY2F0ZSBwaWxlLXVwLlxuICAgICAgICAgICAgICBpZDogJ2ZpbmRfZXhpc3RpbmdfdGFzaycsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdBbHJlYWR5IE51ZGdlZD8nLFxuICAgICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX3Rhc2snLFxuICAgICAgICAgICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgICAgICAgICAgcmVsYXRlZF90b19vcHBvcnR1bml0eTogY2VsYGN1cnJlbnRPcHAuaWRgLFxuICAgICAgICAgICAgICAgICAgc3ViamVjdDogY2VsYCdBZHZhbmNlIHN0YWxsZWQgZGVhbDogJyArIGN1cnJlbnRPcHAubmFtZWAsXG4gICAgICAgICAgICAgICAgICBzdGF0dXM6IHsgJG5pbjogWydjb21wbGV0ZWQnXSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdleGlzdGluZ1N0YWxsVGFzaycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBHYXRld2F5IG9ubHkgXHUyMDE0IHRoZSBwcmVkaWNhdGUgbGl2ZXMgb24gdGhlIG91dC1lZGdlLlxuICAgICAgICAgICAgICBpZDogJ2NoZWNrX25vdF9udWRnZWQnLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0ZpcnN0IE51ZGdlPycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBPd25lciBvbmx5OiBge2N1cnJlbnRPcHAub3duZXJfaWQubWFuYWdlcn1gIGNhbm5vdCB0cmF2ZXJzZSBhXG4gICAgICAgICAgICAgIC8vIGxvb2t1cCBpbiBmbG93IHRlbXBsYXRlcyBcdTIwMTQgaXQgaW50ZXJwb2xhdGVzIHRvIHRoZSBsaXRlcmFsXG4gICAgICAgICAgICAgIC8vIFwidW5kZWZpbmVkXCIgKGNmLiBvcHBvcnR1bml0eV93b25fYWxlcnQpLlxuICAgICAgICAgICAgICBpZDogJ25vdGlmeV9vd25lcicsIHR5cGU6ICdub3RpZnknLCBsYWJlbDogJ051ZGdlIE93bmVyJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgcmVjaXBpZW50czogW2NlbGBoYXMoY3VycmVudE9wcC5vd25lcl9pZCkgPyBjdXJyZW50T3BwLm93bmVyX2lkIDogbnVsbGBdLFxuICAgICAgICAgICAgICAgIGNoYW5uZWxzOiBbJ2luYm94JywgJ2VtYWlsJ10sXG4gICAgICAgICAgICAgICAgdG9waWM6ICdkZWFsX3N0YWxsZWQnLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnY3JtLmRlYWxfc3RhbGxlZCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVEYXRhOiB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBjZWxgY3VycmVudE9wcC5uYW1lYCwgc3RhZ2U6IGNlbGBjdXJyZW50T3BwLnN0YWdlYCxcbiAgICAgICAgICAgICAgICAgIGRheXNfaW5fc3RhZ2U6IGNlbGBjdXJyZW50T3BwLmRheXNfaW5fc3RhZ2VgLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWN0aW9uVXJsOiAnL2NybV9vcHBvcnR1bml0eS97e2N1cnJlbnRPcHAuaWR9fScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogJ2NyZWF0ZV9mb2xsb3d1cF90YXNrJywgdHlwZTogJ2NyZWF0ZV9yZWNvcmQnLCBsYWJlbDogJ0NyZWF0ZSBGb2xsb3ctdXAgVGFzaycsXG4gICAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fdGFzaycsXG4gICAgICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgICAgICBzdWJqZWN0OiBjZWxgJ0FkdmFuY2Ugc3RhbGxlZCBkZWFsOiAnICsgY3VycmVudE9wcC5uYW1lYCxcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdmb2xsb3dfdXAnLCBwcmlvcml0eTogJ2hpZ2gnLCBzdGF0dXM6ICdub3Rfc3RhcnRlZCcsXG4gICAgICAgICAgICAgICAgICBkdWVfZGF0ZTogY2VsYGlzb0RhdGUoZGF5c0Zyb21Ob3coMikpYCxcbiAgICAgICAgICAgICAgICAgIG93bmVyX2lkOiBjZWxgaGFzKGN1cnJlbnRPcHAub3duZXJfaWQpID8gY3VycmVudE9wcC5vd25lcl9pZCA6IG51bGxgLFxuICAgICAgICAgICAgICAgICAgLy8gT1JHIFBBUlRJVElPTi4gQSBzY2hlZHVsZSB0cmlnZ2VyIGNhcnJpZXMgbm9cbiAgICAgICAgICAgICAgICAgIC8vIG9yZ2FuaXphdGlvbiwgc28gd2l0aG91dCB0aGlzIHRoZSBudWRnZSB0YXNrIGlzIGJvcm5cbiAgICAgICAgICAgICAgICAgIC8vIGBvcmdhbml6YXRpb25faWRgIE5VTEwgXHUyMDE0IG91dHNpZGUgZXZlcnkgb3JnIHBhcnRpdGlvbi5cbiAgICAgICAgICAgICAgICAgIC8vIFVwc3RyZWFtIHJ1bGluZyBvYmplY3RzdGFjayM2MTU1IFEyPUEgYXNzaWducyB0aGUgYW5zd2VyIHRvXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgZmxvdyBhdXRob3I7IHRoZSB0YXNrIGJlbG9uZ3MgdG8gdGhlIG9yZyBvZiB0aGUgZGVhbCBpdFxuICAgICAgICAgICAgICAgICAgLy8gbnVkZ2VzLiBgY3JtX29wcG9ydHVuaXR5YCBjYXJyaWVzIHRoZSBjb2x1bW4sIHNvIHRoZSByZWFkXG4gICAgICAgICAgICAgICAgICAvLyByZXNvbHZlcy4gSXQgaXMgZGVsaWJlcmF0ZWx5IFVOR1VBUkRFRDogb24gMTcueCBhIHNvdXJjZVxuICAgICAgICAgICAgICAgICAgLy8gbGFja2luZyBpdCBpbnRlcnBvbGF0ZWQgdG8gYHVuZGVmaW5lZGAgYW5kIGxhbmRlZCBhcyBOVUxMXG4gICAgICAgICAgICAgICAgICAvLyB3aGlsZSBsb29raW5nIGRlY2xhcmVkOyBDRUwgZmFpbHMgdGhlIGl0ZXJhdGlvbiBpbnN0ZWFkLCBhbmRcbiAgICAgICAgICAgICAgICAgIC8vIGEgYGhhcygpYCBndWFyZCB3b3VsZCB3cml0ZSB0aGF0IE5VTEwgYmFjay5cbiAgICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbl9pZDogY2VsYGN1cnJlbnRPcHAub3JnYW5pemF0aW9uX2lkYCxcbiAgICAgICAgICAgICAgICAgIHJlbGF0ZWRfdG9fdHlwZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICAgICByZWxhdGVkX3RvX29wcG9ydHVuaXR5OiBjZWxgY3VycmVudE9wcC5pZGAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBlZGdlczogW1xuICAgICAgICAgICAgeyBpZDogJ2IxJywgc291cmNlOiAnZmluZF9leGlzdGluZ190YXNrJywgdGFyZ2V0OiAnY2hlY2tfbm90X251ZGdlZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgICAgLy8gXCJBbHJlYWR5IG51ZGdlZFwiIGhhcyBubyBlZGdlLCBzbyB0aGUgbG9vcCBtb3ZlcyB0byB0aGUgbmV4dCBpdGVtLlxuICAgICAgICAgICAgLy8gVGhpcyBlZGdlIGlzIHRoZSBPTkxZIHNpdGUgZm9yIHRoZSBwcmVkaWNhdGU6IGEgYGRlY2lzaW9uYFxuICAgICAgICAgICAgLy8gbm9kZSdzIHNpbmd1bGFyIGBjb25maWcuY29uZGl0aW9uYCBpcyBuZXZlciByZWFkLCBzbyBhIG5vZGUgY29weVxuICAgICAgICAgICAgLy8gd291bGQgYmUgaW5lcnQgbWV0YWRhdGEgZnJlZSB0byBkcmlmdCBhd2F5IGZyb20gd2hhdCBydW5zLlxuICAgICAgICAgICAgeyBpZDogJ2IyJywgc291cmNlOiAnY2hlY2tfbm90X251ZGdlZCcsIHRhcmdldDogJ25vdGlmeV9vd25lcicsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGBleGlzdGluZ1N0YWxsVGFzayA9PSBudWxsYCwgbGFiZWw6ICdGaXJzdCBudWRnZScgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiMycsIHNvdXJjZTogJ25vdGlmeV9vd25lcicsIHRhcmdldDogJ2NyZWF0ZV9mb2xsb3d1cF90YXNrJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIHsgaWQ6ICdlMScsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAncXVlcnlfc3RhbGxlZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ3F1ZXJ5X3N0YWxsZWQnLCB0YXJnZXQ6ICdsb29wX29wcHMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdsb29wX29wcHMnLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9mb3JlY2FzdC1zbmFwc2hvdC5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL2ZvcmVjYXN0LXNuYXBzaG90LmZsb3cudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IFAsIGV4cHJlc3Npb24sIGNlbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcbmltcG9ydCB7IGd1YXJkZWQgfSBmcm9tICcuL19ndWFyZGVkLWl0ZXJhdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogRm9yZWNhc3QgU25hcHNob3QgXHUyMDE0IG5pZ2h0bHkgcGVyLW93bmVyIHBpcGVsaW5lIHNuYXBzaG90IGludG8gYGNybV9mb3JlY2FzdGAuXG4gKlxuICogYGZvcmVjYXN0Lmhvb2sudHNgIG9ubHkgREVSSVZFUyBmaWVsZHMgb24gYSByb3cgc29tZW9uZSBlbHNlIGNyZWF0ZXMsIHNvIHRoaXNcbiAqIHN3ZWVwIGlzIHdoYXQgY3JlYXRlcyB0aGVtLiBXaXRob3V0IGl0IHRoZSBmb3JlY2FzdCBvYmplY3QsIGl0c1xuICogYGF0dGFpbm1lbnRfcGN0YCAvIGBjb3ZlcmFnZV9yYXRpb2AgZm9ybXVsYXMsIHRoZSBgZm9yZWNhc3RfbWV0cmljc2AgZGF0YXNldFxuICogYW5kIHRoZSBkYXNoYm9hcmQncyBxdW90YS1hdHRhaW5tZW50IHRhYmxlIGFsbCBydW4gb24gaGFuZC1zZWVkZWQgZGVtbyByb3dzLlxuICpcbiAqICMjIEJ1Y2tldHNcbiAqXG4gKiBBbW91bnRzIGFyZSBhZ2dyZWdhdGVkIGZyb20gYGNybV9vcHBvcnR1bml0eWAgYnkgYGZvcmVjYXN0X2NhdGVnb3J5YCBcdTIwMTQgdGhlXG4gKiBzdG9yZWQsIGluZGV4ZWQgY29sdW1uIHRoZSBvcHBvcnR1bml0eSBsaWZlY3ljbGUgaG9vayBkZXJpdmVzIGZyb20gYHN0YWdlYCxcbiAqIGFuZCB0aGUgc2FtZSBjb2x1bW4gdGhlIFwiQ29tbWl0ICYgQmVzdCBDYXNlXCIgbGlzdCB2aWV3IGFuZCB0aGVcbiAqIGBwaXBlbGluZV9ieV9mb3JlY2FzdF9jYXRlZ29yeWAgZGFzaGJvYXJkIHdpZGdldCBhbHJlYWR5IGdyb3VwIG9uLiBcdTI2RDQgTmV2ZXJcbiAqIHJlYWQgdGhlIHNuYXBzaG90IG9mZiBgcHJvYmFiaWxpdHlgIGluc3RlYWQ6IHRoYXQgY3JlYXRlcyBhIFNFQ09ORCBkZWZpbml0aW9uXG4gKiBvZiBcImNvbW1pdFwiIHRoYXQgc2lsZW50bHkgZGlzYWdyZWVzIHdpdGggdGhvc2Ugc3VyZmFjZXMuXG4gKlxuICogVGhlIGJ1Y2tldHMgYXJlIENVTVVMQVRJVkUsIHRoZSBzdGFuZGFyZCBmb3JlY2FzdCBsYWRkZXIgXHUyMDE0IGFuZCB0aGUgc2hhcGUgdGhlXG4gKiBvYmplY3QncyBvd24gZmllbGRzIGFscmVhZHkgYXNzdW1lIChgcGlwZWxpbmVgIGlzIFwiYWxsIG9wZW4gb3Bwb3J0dW5pdGllc1wiLFxuICogc28gaXQgbmVjZXNzYXJpbHkgY29udGFpbnMgdGhlIG90aGVyIHR3byksIHRoZSBzZWVkZWQgbWFnbml0dWRlcyBzaG93XG4gKiAocGlwZWxpbmUgPiBiZXN0IGNhc2UgPiBjb21taXQpLCBhbmQgdGhlIG9wcG9ydHVuaXR5IGBjbG9zaW5nX3RoaXNfcXVhcnRlcmBcbiAqIHZpZXcgc3BlbGxzIG91dCBieSB0cmVhdGluZyBgWydjb21taXQnLCAnYmVzdF9jYXNlJ11gIGFzIG9uZSBidWNrZXQ6XG4gKlxuICogICBwaXBlbGluZV9hbW91bnQgIFx1MjE5MiBldmVyeSBPUEVOIG9wcG9ydHVuaXR5IGNsb3NpbmcgaW4gdGhlIHBlcmlvZFxuICogICBiZXN0X2Nhc2VfYW1vdW50IFx1MjE5MiBvcGVuLCBmb3JlY2FzdF9jYXRlZ29yeSBcdTIyMDggeyBiZXN0X2Nhc2UsIGNvbW1pdCB9XG4gKiAgIGNvbW1pdF9hbW91bnQgICAgXHUyMTkyIG9wZW4sIGZvcmVjYXN0X2NhdGVnb3J5ID0gY29tbWl0XG4gKiAgIGNsb3NlZF9hbW91bnQgICAgXHUyMTkyIHN0YWdlID0gY2xvc2VkX3dvbiwgY2xvc2luZyBpbiB0aGUgcGVyaW9kXG4gKlxuICogYHF1b3RhYCBpcyBkZWxpYmVyYXRlbHkgbmV2ZXIgd3JpdHRlbjogaXQgaXMgbWFpbnRhaW5lZCBieSBoYW5kIHVudGlsIGFcbiAqIHF1b3RhIG1vZGVsIGV4aXN0cywgYW5kIGEgc3dlZXAgdGhhdCByZXNldCBpdCBldmVyeSBuaWdodCB3b3VsZCBlcmFzZSB0aGVcbiAqIGRlbm9taW5hdG9yIG9mIGBhdHRhaW5tZW50X3BjdGAuXG4gKlxuICogIyMgU2hhcGVcbiAqXG4gKiBQZXIgb3duZXI6IGVuc3VyZSB0aGUgY3VycmVudC1wZXJpb2Qgcm93IGV4aXN0cywgcmUtcmVhZCBpdCwgdGhlbiBzdW0gZm91clxuICogc2NvcGVkIHF1ZXJpZXMgaW50byBpdC4gVHdvIHRoaW5ncyBmb3JjZSB0aGF0IG9yZGVyaW5nLlxuICpcbiAqIDEuIFRoZSBwZXJpb2Qgd2luZG93IGlzIERBVEEsIG5vdCBhcml0aG1ldGljLiBUaGUgMTcueCBmbG93IHRlbXBsYXRlXG4gKiAgICByZXNvbHZlZCBge1RPREFZKCl9YCBhbmQgZGF5IG9mZnNldHMgb25seSBcdTIwMTQgaXQgY291bGQgbm90IHNheSBcInRoZSBmaXJzdFxuICogICAgZGF5IG9mIHRoaXMgY2FsZW5kYXIgcXVhcnRlclwiLiBTbyB0aGUgZmxvdyBzZWxlY3RzIHRoZSByb3cgd2hvc2Ugd2luZG93XG4gKiAgICBDT05UQUlOUyB0b2RheSAoYHBlcmlvZF9zdGFydCA8PSB0b2RheSA8PSBwZXJpb2RfZW5kYCksIGxldHMgYGZvcmVjYXN0Lmhvb2sudHNgXG4gKiAgICBkZXJpdmUgYSBjYWxlbmRhci10cnVlIHdpbmRvdyBvbiBjcmVhdGUsIGFuZCB0aGVuIHJlYWRzIHRoZSBib3VuZGFyaWVzXG4gKiAgICBiYWNrIG9mZiB0aGUgcm93IHRvIHNjb3BlIHRoZSBvcHBvcnR1bml0eSBxdWVyaWVzLiBPbmUgZGVmaW5pdGlvbiBvZiBcInRoZVxuICogICAgY3VycmVudCBwZXJpb2RcIiwgb3duZWQgYnkgdGhlIG9iamVjdC5cbiAqIDIuIFN1bXMgY29tZSBmcm9tIGZvdXIgc2VwYXJhdGUgYGdldF9yZWNvcmRgICsgYGxvb3BgIHBhaXJzIHJhdGhlciB0aGFuIG9uZVxuICogICAgcXVlcnkgd2l0aCBpbi1sb29wIGJyYW5jaGluZy4gQSBmaWx0ZXIgaXMgcGxhaW4gbWV0YWRhdGEsIHNvIHRoZSBidWNrZXRcbiAqICAgIGRlZmluaXRpb25zIHN0YXkgZGVjbGFyYXRpdmUgYW5kIGdyZXBwYWJsZTsgdGhlIGFjY3VtdWxhdG9ycyBzdGF5IHB1cmVcbiAqICAgIENFTCBhcml0aG1ldGljIChzZWUgYHN1bUJ1Y2tldGApLlxuICpcbiAqIElkZW1wb3RlbmN5OiB0aGUgcm93IGlzIGtleWVkIGJ5IChvd25lciwgcGVyaW9kLCBjb250YWluaW5nIHdpbmRvdyksIHNvIGFcbiAqIHJlLXJ1biBmaW5kcyBpdCBhbmQgT1ZFUldSSVRFUyB0aGUgYW1vdW50cyBpbnN0ZWFkIG9mIGluc2VydGluZyBhIHNlY29uZFxuICogcm93IFx1MjAxNCB0aGUgc2FtZSB1cHNlcnQgZGlzY2lwbGluZSBhcyBgY29udHJhY3RfcmVuZXdhbGAgL1xuICogYG9wcG9ydHVuaXR5X3N0YWduYXRpb25gLiBSZS1ydW5uaW5nIGlzIGhvdyBhIHNuYXBzaG90IHN0YXlzIGN1cnJlbnQsIGFuZCBpdFxuICogaXMgdGhlIG9ubHkgd2F5IGFuIGFtb3VudCBldmVyIGRlY3JlYXNlcy5cbiAqXG4gKiAjIyBUd28gcXVlc3Rpb25zLCB0d28gc2NvcGVzIFx1MjAxNCBhIG1hbnVhbCBmb3JlY2FzdCBTVVBQUkVTU0VTIHRoZSBzd2VlcFxuICpcbiAqIFx1MjZENCBOZXZlciBhbnN3ZXIgYm90aCBxdWVzdGlvbnMgd2l0aCBvbmUgZmlsdGVyLiBUaGUgd2luZG93IGFuc3dlcnMgXCJoYXMgdGhpc1xuICogcGVyaW9kIGJlZW4gaGFuZGxlZD9cIiBhbmQgZG9lcyBOT1QgYW5zd2VyIFwid2hpY2ggcm93IGRvIEkgb3duP1wiLiBVc2VkIGZvclxuICogYm90aCwgaXQgZGVzdHJveXMgYSBtYW5hZ2VyJ3MgdHlwZWQgbnVtYmVyczogYHNvdXJjZTogJ21hbnVhbCdgIGlzIG9uZSBvZlxuICogdGhyZWUgZG9jdW1lbnRlZCBvcmlnaW5zLCBhbmQgYSBoYW5kLWVudGVyZWQgY3VycmVudC1xdWFydGVyIHJvdyBzYXRpc2ZpZXMgdGhlXG4gKiB3aW5kb3cgZmlsdGVyIGV4YWN0bHkgYXMgdGhlIHN3ZWVwJ3Mgb3duIHJvdyBkb2VzLCBzaW5jZSBib3RoIGVuZHMgb2YgdGhlXG4gKiB3aW5kb3cgYXJlIHBpbm5lZCB0byB0aGUgY2FsZW5kYXIgcXVhcnRlci4gVGhlIHN3ZWVwIHRoZW4gYWRvcHRzIGl0LFxuICogb3ZlcndyaXRlcyB0aGUgZm91ciBhbW91bnRzLCByZXN0YW1wcyBgc25hcHNob3RfZGF0ZWAgYW5kIGZsaXBzIGBzb3VyY2VgIHRvXG4gKiBgc2NoZWR1bGVkYC4gYHF1b3RhYCBzdXJ2aXZlcyAoaXQgaXMgbmV2ZXIgd3JpdHRlbiksIHNvIGF0dGFpbm1lbnQgc2lsZW50bHlcbiAqIHJlLWJhc2VzIG9udG8gc3dlcHQgbnVtYmVycyBhbmQgdGhlIHJvdyBzdGlsbCBsb29rcyBwbGF1c2libGUuXG4gKlxuICogU28gdGhlIHR3byBqb2JzIHJlYWQgdGhyb3VnaCB0d28gZmlsdGVyczpcbiAqXG4gKiAgIGdhdGUgIChgZmluZF9mb3JlY2FzdGApICAgXHUyMTkyIENVUlJFTlRfUEVSSU9EX0ZJTFRFUiBcdTIwMTQgQU5ZIHJvdyBpbiB0aGUgd2luZG93LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWFsIGluY2x1ZGVkLiBcIkhhbmRsZWRcIiBpcyBhYm91dCB0aGUgcGVyaW9kLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGFib3V0IHdobyBoYW5kbGVkIGl0LlxuICogICB3cml0ZSAoYHJlbG9hZF9mb3JlY2FzdGApIFx1MjE5MiBPV05FRF9QRVJJT0RfRklMVEVSICBcdTIwMTQgb25seSByb3dzIHRoZSBzd2VlcFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JvdGUgKGBzb3VyY2U6ICdzY2hlZHVsZWQnYCkuXG4gKlxuICogYW5kIGBjaGVja19vd25lZGAgdHVybnMgXCJ0aGUgd2luZG93IGlzIGhhbmRsZWQsIGJ1dCBub3QgYnkgYSByb3cgSSBvd25cIiBpbnRvXG4gKiBhIHN0YW5kLWRvd246IG5vIHdyaXRlLCBhbmQgXHUyMDE0IGVxdWFsbHkgbG9hZC1iZWFyaW5nIFx1MjAxNCBubyBzZWNvbmQgcm93LlxuICpcbiAqIFx1MjZENCBOZXZlciByZWFjaCB0aGF0IGJ5IGV4Y2x1ZGluZyBub24tYHNjaGVkdWxlZGAgcm93cyBmcm9tIE9ORSBzaGFyZWQgZmlsdGVyLlxuICogVGhlIHN3ZWVwIHdvdWxkIHN0b3AgZmluZGluZyB0aGUgbWFudWFsIHJvdywgZGVjaWRlIHRoZSBwZXJpb2Qgd2FzIHVuaGFuZGxlZFxuICogYW5kIE9QRU4gYSBkdXBsaWNhdGUgaW4gdGhlIHNhbWUgd2luZG93IFx1MjAxNCBhbmQgYHRoaXNfcXVhcnRlcl9mb3JlY2FzdHNgIGFuZCB0aGVcbiAqIHF1b3RhLWF0dGFpbm1lbnQgd2lkZ2V0IHBpbiBgcGVyaW9kX3N0YXJ0YCBieSBlcXVhbGl0eSwgc28gYm90aCB3b3VsZCBtYXRjaFxuICogdHdvIHJvd3MuXG4gKlxuICogVGhlIHdheSBvdXQgc3RheXMgb3BlbjogZGVsZXRlIHRoZSBtYW51YWwgcm93IGFuZCB0aGUgbmV4dCBzd2VlcCBvcGVucyBpdHNcbiAqIG93biBhZ2Fpbi4gQXV0b21hdGlvbiBhbiBvdmVycmlkZSBjYW5ub3Qgc2lsZW5jZSBpcyBub3QgYW4gb3ZlcnJpZGUuXG4gKlxuICogTm90ZSB0aGUgc2NvcGUgaXMgYHNvdXJjZSA9PSAnc2NoZWR1bGVkJ2AsIG5vdCBgc291cmNlICE9ICdtYW51YWwnYDogYW4gYGFpYFxuICogcm93IGlzIGVxdWFsbHkgbm90IHRoZSBzd2VlcCdzIHRvIG92ZXJ3cml0ZSwgYW5kIGdldHMgdGhlIHNhbWUgZGVmZXJlbmNlLlxuICpcbiAqIFNjb3BlOiBhbiBcImFjdGl2ZSBvcHBvcnR1bml0eSBvd25lclwiIGlzIGEgdXNlciBvd25pbmcgYXQgbGVhc3Qgb25lXG4gKiBvcHBvcnR1bml0eSB0aGF0IGlzIG5vdCBgY2xvc2VkX2xvc3RgLiBVc2VycyB3aXRoIG5vbmUgYXJlIHNraXBwZWQgZW50aXJlbHksXG4gKiBzbyBhIGZyZXNoIGluc3RhbGwgZG9lcyBub3QgbGl0dGVyIGEgemVybyByb3cgcGVyIGVtcGxveWVlLlxuICovXG5cbi8qKlxuICogVGhlIHBlcmlvZCB0aGlzIHN3ZWVwIHNuYXBzaG90cy4gYHF1YXJ0ZXJgIGJlY2F1c2UgdGhhdCBpcyB3aGF0IGV2ZXJ5XG4gKiBjb25zdW1lciByZWFkczogdGhlIGB0aGlzX3F1YXJ0ZXJfZm9yZWNhc3RzYCB2aWV3IGZpbHRlcnMgYHBlcmlvZDogJ3F1YXJ0ZXInYFxuICogYW5kIHRoZSBxdW90YS1hdHRhaW5tZW50IHRhYmxlIGlzIGEgcXVhcnRlcmx5IHNjb3JlYm9hcmQuIEEgbW9udGhseSBjYWRlbmNlXG4gKiB3b3VsZCBiZSBhIHNlY29uZCBmbG93LCBub3QgYSBmbGFnIFx1MjAxNCB0aGUgdXBzZXJ0IGtleSBpcyAob3duZXIsIHBlcmlvZCkuXG4gKi9cbmNvbnN0IFNOQVBTSE9UX1BFUklPRCA9ICdxdWFydGVyJztcblxuLyoqIE9wZW4gPSBub3QgeWV0IHJlc29sdmVkIGVpdGhlciB3YXkuIEJvdGggY2xvc2VkIHN0YWdlcyBsZWF2ZSB0aGUgcGlwZWxpbmUuICovXG5jb25zdCBPUEVOX1NUQUdFUyA9IHsgJG5pbjogWydjbG9zZWRfd29uJywgJ2Nsb3NlZF9sb3N0J10gfTtcblxuLyoqXG4gKiBXaW5kb3cgdGhlIGN1cnJlbnQtcGVyaW9kIHJvdzogYHBlcmlvZF9zdGFydCA8PSB0b2RheSA8PSBwZXJpb2RfZW5kYC5cbiAqXG4gKiBUaGUgSURFTVBPVEVOQ1kgc2NvcGUgXHUyMDE0IGRlbGliZXJhdGVseSBzb3VyY2UtYmxpbmQuIFwiSGFzIHRoaXMgcGVyaW9kIGJlZW5cbiAqIGhhbmRsZWQ/XCIgaXMgYSBxdWVzdGlvbiBhYm91dCB0aGUgd2luZG93LCBzbyBhIG1hbnVhbCByb3cgYW5zd2VycyBpdCBqdXN0IGFzXG4gKiBhIHNjaGVkdWxlZCBvbmUgZG9lcywgYW5kIHRoZSBzd2VlcCBvcGVucyBub3RoaW5nIGJlc2lkZSBpdC5cbiAqL1xuY29uc3QgQ1VSUkVOVF9QRVJJT0RfRklMVEVSID0ge1xuICBvd25lcl9pZDogY2VsYGN1cnJlbnRPd25lci5pZGAsXG4gIHBlcmlvZDogU05BUFNIT1RfUEVSSU9ELFxuICBwZXJpb2Rfc3RhcnQ6IHsgJGx0ZTogY2VsYGlzb0RhdGUodG9kYXkoKSlgIH0sXG4gIHBlcmlvZF9lbmQ6IHsgJGd0ZTogY2VsYGlzb0RhdGUodG9kYXkoKSlgIH0sXG59O1xuXG4vKipcbiAqIFRoZSBzYW1lIHdpbmRvdyBuYXJyb3dlZCB0byB0aGUgcm93cyB0aGlzIHN3ZWVwIE9XTlMgXHUyMDE0IGl0cyBXUklURSBzY29wZS5cbiAqXG4gKiBgc291cmNlYCBpcyB3aGF0IHNlcGFyYXRlcyB0aGUgdHdvIGpvYnMuIEFueXRoaW5nIGVsc2UgaW4gdGhlIHdpbmRvd1xuICogYmVsb25ncyB0byBhIGh1bWFuIChgbWFudWFsYCkgb3IgYW4gYWdlbnQgKGBhaWApIGFuZCBpcyB0aGVpcnMgdG8ga2VlcDsgYVxuICogbWlzcyBoZXJlIGlzIHRoZSBzdGFuZC1kb3duIHNpZ25hbCBgY2hlY2tfb3duZWRgIHJlYWRzLCBub3QgYSByZWFzb24gdG9cbiAqIGNyZWF0ZSBhIHNlY29uZCByb3cuIE5hcnJvd2luZyB0aGUgd3JpdGUgc2NvcGUgYWxzbyBtYWtlcyB0aGUgdGFyZ2V0XG4gKiBERVRFUk1JTklTVElDIHdoZW4gYSBtYW5hZ2VyIGFkZHMgYSBtYW51YWwgcm93IGJlc2lkZSBhbiBleGlzdGluZyBzY2hlZHVsZWRcbiAqIG9uZTogYGZpbmRPbmVgIG92ZXIgdGhlIHNoYXJlZCB3aW5kb3cgd291bGQgaGFuZCBiYWNrIHdoaWNoZXZlciByb3cgdGhlXG4gKiBkcml2ZXIgaGFwcGVuZWQgdG8gb3JkZXIgZmlyc3QuXG4gKi9cbmNvbnN0IE9XTkVEX1BFUklPRF9GSUxURVIgPSB7IC4uLkNVUlJFTlRfUEVSSU9EX0ZJTFRFUiwgc291cmNlOiAnc2NoZWR1bGVkJyB9O1xuXG4vKipcbiAqIE9wcG9ydHVuaXRpZXMgb2YgdGhlIG93bmVyIGluIGZsaWdodCBkdXJpbmcgdGhlIHNuYXBzaG90IHdpbmRvdy5cbiAqXG4gKiAjIyBUaGUgb3JnYW5pemF0aW9uIHBpblxuICpcbiAqIGBvd25lcl9pZGAgYW5kIHRoZSBwZXJpb2Qgd2luZG93IGFyZSBib3RoIG9yZ2FuaXphdGlvbi1ORVVUUkFMIHByZWRpY2F0ZXMsXG4gKiBhbmQgdGhpcyBzd2VlcCBydW5zIGBydW5BczogJ3N5c3RlbSdgIFx1MjAxNCB0aGUgb25lIGNvbnRleHQgdGhlIGRyaXZlcidzXG4gKiBvcmdhbml6YXRpb24gcHJlZGljYXRlIGRvZXMgbm90IGNvbnN0cmFpbi4gV2l0aG91dCB0aGUgcGluIGJlbG93LCBhbiBvd25lclxuICogaG9sZGluZyBvcHBvcnR1bml0aWVzIGluIG1vcmUgdGhhbiBvbmUgb3JnYW5pemF0aW9uIGhhcyBldmVyeSBvbmUgb2YgdGhlbVxuICogc3VtbWVkIGludG8gdGhlIHNpbmdsZSByb3cgYENVUlJFTlRfUEVSSU9EX0ZJTFRFUmAgc2VsZWN0czogb25lIHRlbmFudCdzXG4gKiBmb3JlY2FzdCByb3cgcmVwb3J0aW5nIGFub3RoZXIgdGVuYW50J3MgcGlwZWxpbmUuIE5vdGhpbmcgaXMgTlVMTC1wYXJ0aXRpb25lZFxuICogYW5kIG5vIGluZGV4IGlzIHZpb2xhdGVkIFx1MjAxNCB0aGUgbnVtYmVycyBhcmUgc2ltcGx5IHdyb25nLCBhbmQgd3JvbmcgaW4gdGhlXG4gKiBkaXJlY3Rpb24gdGhhdCBsb29rcyBwbGF1c2libGUuIGBzeXNfdXNlcmAgaXMgd2hhdCBtYWtlcyBpdCByZWFjaGFibGU6XG4gKiBpZGVudGl0eSBpcyBHTE9CQUwgYW5kIGRlY2xhcmVzIG5vIGBvcmdhbml6YXRpb25faWRgLCBzbyB0aGUgcGVyLW93bmVyIGxvb3BcbiAqIGl0ZW0gY2Fubm90IG5hcnJvdyBhbnl0aGluZy5cbiAqXG4gKiBUaGUgcGluIGlzIHRoZSB0YXJnZXQgcm93J3Mgb3duIG9yZ2FuaXphdGlvbiwgcmVhZCBiYWNrIG9mZlxuICogYGN1cnJlbnRGb3JlY2FzdGAuIFRoYXQgaXMgdGhlIFNBTUUgXCJwcm92ZSB0aGUgc291cmNlIGNhcnJpZXMgdGhlIHJpZ2h0XG4gKiBvcmdhbml6YXRpb25cIiBtZWNoYW5pc20gYG93bmVyQW55RGVhbC5vcmdhbml6YXRpb25faWRgIGVzdGFibGlzaGVzIG9uXG4gKiBgY3JlYXRlX2ZvcmVjYXN0YCwgaW52ZXJ0ZWQgXHUyMDE0IG5vdCBhIHNlY29uZCBvbmUuIEl0IGlzIGluIHNjb3BlIGJ5XG4gKiBjb25zdHJ1Y3Rpb246IGBjdXJyZW50Rm9yZWNhc3RgIGFscmVhZHkgc3VwcGxpZXMgdGhlIHdpbmRvdyBib3VuZGFyaWVzIGluXG4gKiB0aGlzIHZlcnkgZmlsdGVyLCBhbmQgYHJlbG9hZF9mb3JlY2FzdGAgYmluZHMgaXQgYmVmb3JlIGFueSBidWNrZXQgcnVucy5cbiAqXG4gKiBXaGF0IHRoaXMgZG9lcyBOT1QgZG86IGdpdmUgYSBjcm9zcy1vcmdhbml6YXRpb24gb3duZXIgb25lIHJvdyBwZXJcbiAqIG9yZ2FuaXphdGlvbi4gYGNybV9mb3JlY2FzdGAgaXMgc3RpbGwga2V5ZWQgYnkgKG93bmVyLCBwZXJpb2QpLCBzbyBzdWNoIGFuXG4gKiBvd25lcidzIHNuYXBzaG90IG5vdyByZXBvcnRzIFRISVMgb3JnYW5pemF0aW9uJ3MgbnVtYmVycyBvbmx5IFx1MjAxNCB0cnVlIGJ1dFxuICogaW5jb21wbGV0ZSwgYW5kIHN0cmljdGx5IGJldHRlciB0aGFuIHRoZSBjcm9zcy10ZW5hbnQgdG90YWwgaXQgcmVwbGFjZXMuXG4gKiBXaGV0aGVyIHRoYXQga2V5IHNob3VsZCB3aWRlbiBpcyBhIHByb2R1Y3QgZGVjaXNpb24sIHJlY29yZGVkIG9uICMxMzcyIGFuZFxuICogZGVsaWJlcmF0ZWx5IG5vdCB1bmRlcnRha2VuIGhlcmUuXG4gKi9cbmNvbnN0IGluUGVyaW9kID0gKGV4dHJhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gKHtcbiAgb3duZXJfaWQ6IGNlbGBjdXJyZW50T3duZXIuaWRgLFxuICBvcmdhbml6YXRpb25faWQ6IGNlbGBjdXJyZW50Rm9yZWNhc3Qub3JnYW5pemF0aW9uX2lkYCxcbiAgY2xvc2VfZGF0ZToge1xuICAgICRndGU6IGNlbGBjdXJyZW50Rm9yZWNhc3QucGVyaW9kX3N0YXJ0YCxcbiAgICAkbHRlOiBjZWxgY3VycmVudEZvcmVjYXN0LnBlcmlvZF9lbmRgLFxuICB9LFxuICAuLi5leHRyYSxcbn0pO1xuXG4vKipcbiAqIE9uZSBgZ2V0X3JlY29yZGAgKyBgbG9vcGAgcGFpciB0aGF0IHN1bXMgYGFtb3VudGAgaW50byBgdG90YWxgLlxuICpcbiAqIFRoZSBhY2N1bXVsYXRvciBpcyBhIENFTCB2YWx1ZSBlbnZlbG9wZSwgc28gaXRzIG9wZXJhbmRzIGFyZSBUWVBFRDpcbiAqIGBkb3VibGUoKWAgdHVybnMgYSBjdXJyZW5jeSBzb21lIGRyaXZlcnMgcmV0dXJuIGFzIGEgc3RyaW5nIChgXCI5MDAwMFwiYCkgaW50b1xuICogYSBudW1iZXIsIGFuZCBhIGRlY2ltYWwgYW1vdW50IGtlZXBzIGl0cyBjZW50cy4gXHUyNkQ0IE5ldmVyIGEgYmFyZVxuICogYGRvdWJsZShhbW91bnQpYDogaXQgRVJST1JTIG9uIG51bGwgXHUyMDE0IGBmb3VuZCBubyBtYXRjaGluZyBvdmVybG9hZCBmb3JcbiAqICdkb3VibGUobnVsbCknYCBcdTIwMTQgYW5kIG9uZSBvcHBvcnR1bml0eSB3aXRob3V0IGFuIGFtb3VudCB3b3VsZCBmYWlsIHRoZVxuICogb3duZXIncyB3aG9sZSBzd2VlcC4gVGhlIGBoYXMoKWAgLyBgaXNCbGFuaygpYCBndWFyZCBzdW1zIGEgbnVsbCBvciBhYnNlbnRcbiAqIGFtb3VudCBhcyAwLiBgZXhwcmVzc2lvbigpYCByYXRoZXIgdGhhbiBgUGA6IHRoZSBzb3VyY2Ugc3BsaWNlcyB0aGUgbm9kZSdzXG4gKiB2YXJpYWJsZSBuYW1lcywgd2hpY2ggdGhlIHRhZyB3b3VsZCBKU09OLXF1b3RlLlxuICovXG5jb25zdCBzdW1CdWNrZXQgPSAoa2V5OiBzdHJpbmcsIGxhYmVsOiBzdHJpbmcsIGZpbHRlcjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHRvdGFsOiBzdHJpbmcsIGl0ZW0gPSBgY3VycmVudF8ke2tleX1gKSA9PiAoe1xuICBmaW5kOiB7XG4gICAgaWQ6IGBmaW5kXyR7a2V5fWAsXG4gICAgdHlwZTogJ2dldF9yZWNvcmQnIGFzIGNvbnN0LFxuICAgIGxhYmVsOiBgRmluZCAke2xhYmVsfWAsXG4gICAgY29uZmlnOiB7XG4gICAgICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgIGZpbHRlcixcbiAgICAgIGxpbWl0OiA1MDAsXG4gICAgICBvdXRwdXRWYXJpYWJsZTogYCR7a2V5fU9wcHNgLFxuICAgIH0sXG4gIH0sXG4gIHN1bToge1xuICAgIGlkOiBgc3VtXyR7a2V5fWAsXG4gICAgdHlwZTogJ2xvb3AnIGFzIGNvbnN0LFxuICAgIGxhYmVsOiBgU3VtICR7bGFiZWx9YCxcbiAgICBjb25maWc6IHtcbiAgICAgIGNvbGxlY3Rpb246IGV4cHJlc3Npb24oYCR7a2V5fU9wcHNgLCAnY2VsJyksXG4gICAgICBpdGVyYXRvclZhcmlhYmxlOiBpdGVtLFxuICAgICAgYm9keToge1xuICAgICAgICBub2RlczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBgYWRkXyR7a2V5fWAsXG4gICAgICAgICAgICB0eXBlOiAnYXNzaWdubWVudCcgYXMgY29uc3QsXG4gICAgICAgICAgICBsYWJlbDogYEFkZCB0byAke2xhYmVsfWAsXG4gICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgYXNzaWdubWVudHM6IHtcbiAgICAgICAgICAgICAgICBbdG90YWxdOiBleHByZXNzaW9uKGAke3RvdGFsfSArICghaGFzKCR7aXRlbX0uYW1vdW50KSB8fCBpc0JsYW5rKCR7aXRlbX0uYW1vdW50KSA/IDAuMCA6IGRvdWJsZSgke2l0ZW19LmFtb3VudCkpYCwgJ2NlbCcpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBlZGdlczogW10sXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59KTtcblxuY29uc3QgQlVDS0VUUyA9IFtcbiAgc3VtQnVja2V0KCdwaXBlbGluZScsICdPcGVuIFBpcGVsaW5lJywgaW5QZXJpb2QoeyBzdGFnZTogT1BFTl9TVEFHRVMgfSksICdwaXBlbGluZVRvdGFsJyksXG4gIHN1bUJ1Y2tldChcbiAgICAnYmVzdF9jYXNlJyxcbiAgICAnQmVzdCBDYXNlJyxcbiAgICBpblBlcmlvZCh7IHN0YWdlOiBPUEVOX1NUQUdFUywgZm9yZWNhc3RfY2F0ZWdvcnk6IHsgJGluOiBbJ2Jlc3RfY2FzZScsICdjb21taXQnXSB9IH0pLFxuICAgICdiZXN0Q2FzZVRvdGFsJyxcbiAgKSxcbiAgc3VtQnVja2V0KFxuICAgICdjb21taXQnLFxuICAgICdDb21taXQnLFxuICAgIGluUGVyaW9kKHsgc3RhZ2U6IE9QRU5fU1RBR0VTLCBmb3JlY2FzdF9jYXRlZ29yeTogJ2NvbW1pdCcgfSksXG4gICAgJ2NvbW1pdFRvdGFsJyxcbiAgKSxcbiAgc3VtQnVja2V0KCd3b24nLCAnQ2xvc2VkIFdvbicsIGluUGVyaW9kKHsgc3RhZ2U6ICdjbG9zZWRfd29uJyB9KSwgJ2Nsb3NlZFRvdGFsJyksXG5dO1xuXG4vKipcbiAqIFRoZSBwZXItb3duZXIgYm9keSBydW5zIGFzIG9uZSBzdHJhaWdodCBsaW5lIG9uY2UgdGhlIFRIUkVFIGdhdGVzIHBhc3M6XG4gKiByZXNldCBcdTIxOTIgKGZpbmQvc3VtKSBcdTAwRDcgNCBcdTIxOTIgd3JpdGUuXG4gKlxuICogXHUyNkQ0IFRoZSBjaGFpbiBtdXN0IHN0YXJ0IEFGVEVSIHRoZSBgY2hlY2tfb3duZWRgIGdhdGV3YXk6IGV2ZXJ5IGVkZ2UgZGVyaXZlZFxuICogZnJvbSB0aGlzIGxpc3QgaXMgdW5jb25kaXRpb25hbCwgYW5kIGBjaGVja19vd25lZGAncyBvdXQtZWRnZSBpcyBub3QuXG4gKi9cbmNvbnN0IE9XTkVSX0NIQUlOID0gW1xuICAncmVzZXRfdG90YWxzJyxcbiAgLi4uQlVDS0VUUy5mbGF0TWFwKChiKSA9PiBbYi5maW5kLmlkLCBiLnN1bS5pZF0pLFxuICAnd3JpdGVfc25hcHNob3QnLFxuXTtcblxuZXhwb3J0IGNvbnN0IEZvcmVjYXN0U25hcHNob3RGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnZm9yZWNhc3Rfc25hcHNob3QnLFxuICBsYWJlbDogJ0ZvcmVjYXN0IFNuYXBzaG90JyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ05pZ2h0bHkgc3dlZXA6IHVwc2VydCBhIGN1cnJlbnQtcXVhcnRlciBjcm1fZm9yZWNhc3Qgcm93IHBlciBhY3RpdmUgb3Bwb3J0dW5pdHkgb3duZXIgd2l0aCBwaXBlbGluZSwgYmVzdC1jYXNlLCBjb21taXQgYW5kIGNsb3NlZC13b24gdG90YWxzLicsXG4gIHR5cGU6ICdzY2hlZHVsZScsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG4gIC8vIFNjaGVkdWxlZCBydW5zIGhhdmUgbm8gdHJpZ2dlciB1c2VyLCBzbyB1bmRlciB0aGUgZGVmYXVsdCBydW5BczondXNlcicgdGhlXG4gIC8vIGRhdGEgbm9kZXMgZXhlY3V0ZSBVTlNDT1BFRCBhbnl3YXkuIERlY2xhcmUgcnVuQXM6J3N5c3RlbScgdG8gbWFrZSB0aGF0XG4gIC8vIFJMUy1ieXBhc3NpbmcgZWxldmF0aW9uIGV4cGxpY2l0IGFuZCBpbnRlbmRlZCAoQURSLTAwNDkpIFx1MjAxNCBhbmQgaXRcbiAgLy8gaXMgbG9hZC1iZWFyaW5nIGhlcmU6IGBjcm1fZm9yZWNhc3RgIGlzIGBzaGFyaW5nTW9kZWw6ICdwcml2YXRlJ2AsIHNvIGFcbiAgLy8gdXNlci1zY29wZWQgc3dlZXAgY291bGQgb25seSBldmVyIHNlZSBpdHMgb3duIHJvd3MuXG4gIHJ1bkFzOiAnc3lzdGVtJyxcblxuICB2YXJpYWJsZXM6IFtdLFxuXG4gIG5vZGVzOiBbXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCAoZGFpbHkgMDM6MDApJywgY29uZmlnOiB7IHNjaGVkdWxlOiAnMCAzICogKiAqJyB9IH0sXG4gICAge1xuICAgICAgLy8gRXZlcnkgdXNlciBpcyBhIGNhbmRpZGF0ZTsgdGhlIGBoYXNfZGVhbHNgIGdhdGUgYmVsb3cgZGVjaWRlcyB3aG8gaXNcbiAgICAgIC8vIGFjdHVhbGx5IGFuIG9wcG9ydHVuaXR5IG93bmVyLiBGaWx0ZXJpbmcgYHN5c191c2VyYCBoZXJlIGluc3RlYWQgd291bGRcbiAgICAgIC8vIGhhcmQtY29kZSBhbiBhY3Rpdml0eSBmbGFnIHRoaXMgYXBwIGRvZXMgbm90IG93bi5cbiAgICAgIC8vIE5vIGBmaWx0ZXJgIGtleTogYW4gRU1QVFkgZmlsdGVyIG5vZGUgKGB7fWApIHJlZHVjZXMgdG8gVFJVRSBhbmRcbiAgICAgIC8vIG1hdGNoZXMgZXZlcnkgcm93LCBzbyBpdCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIGFic2VudCBrZXkgXHUyMDE0XG4gICAgICAvLyBPYmplY3RTdGFjayAxNy4wLjAtcmMuNiBwcm9tb3RlcyB0aGUgcGFpciB0byBhbiBhdXRob3ItdGltZSBlcnJvclxuICAgICAgLy8gKGBmaWx0ZXItZW1wdHktbm9kZWApIHByZWNpc2VseSBiZWNhdXNlIG9ubHkgdGhlIGFic2VudCBrZXkgU0FZU1xuICAgICAgLy8gXCJldmVyeSB1c2VyIGlzIGEgY2FuZGlkYXRlXCIgdG8gdGhlIG5leHQgcmVhZGVyLiBUaGUgYGhhc19kZWFsc2AgZ2F0ZVxuICAgICAgLy8gYmVsb3cgaXMgd2hhdCBhY3R1YWxseSBuYXJyb3dzIHRoZSBzZXQuXG4gICAgICBpZDogJ3F1ZXJ5X293bmVycycsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdGaW5kIFVzZXJzJyxcbiAgICAgIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnc3lzX3VzZXInLCBsaW1pdDogNTAwLCBvdXRwdXRWYXJpYWJsZTogJ293bmVyTGlzdCcgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnbG9vcF9vd25lcnMnLCB0eXBlOiAnbG9vcCcsIGxhYmVsOiAnRm9yIEVhY2ggT3duZXInLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGNvbGxlY3Rpb246IGNlbGBvd25lckxpc3RgLFxuICAgICAgICBpdGVyYXRvclZhcmlhYmxlOiAnY3VycmVudE93bmVyJyxcbiAgICAgICAgYm9keTogZ3VhcmRlZCgnb3duZXInLCB7XG4gICAgICAgICAgbm9kZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gQ2hlYXAgZmluZE9uZSBnYXRlOiBhIHVzZXIgd2l0aCBubyBsaXZlIG9wcG9ydHVuaXR5IGlzIG5vdCBhXG4gICAgICAgICAgICAgIC8vIGZvcmVjYXN0IG93bmVyLCBhbmQgbXVzdCBub3QgZ2V0IGEgcm93IChhIGZyZXNoIGluc3RhbGwgd291bGRcbiAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGdhaW4gb25lIGVtcHR5IHNuYXBzaG90IHBlciBlbXBsb3llZSkuXG4gICAgICAgICAgICAgIGlkOiAnZmluZF9hbnlfZGVhbCcsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdPd25zIEFueSBMaXZlIERlYWw/JyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7IG93bmVyX2lkOiBjZWxgY3VycmVudE93bmVyLmlkYCwgc3RhZ2U6IHsgJG5pbjogWydjbG9zZWRfbG9zdCddIH0gfSxcbiAgICAgICAgICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ293bmVyQW55RGVhbCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBHYXRld2F5IG9ubHkgXHUyMDE0IHRoZSBwcmVkaWNhdGUgbGl2ZXMgb24gdGhlIG91dC1lZGdlLlxuICAgICAgICAgICAgICBpZDogJ2hhc19kZWFscycsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnQWN0aXZlIE93bmVyPycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBJZGVtcG90ZW5jeSBnYXRlIEFORCBwZXJpb2QgbG9va3VwIGluIG9uZSByZWFkOiB0aGUgcm93IHdob3NlXG4gICAgICAgICAgICAgIC8vIHdpbmRvdyBjb250YWlucyB0b2RheSBJUyB0aGlzIG93bmVyJ3MgY3VycmVudC1wZXJpb2Qgc25hcHNob3QuXG4gICAgICAgICAgICAgIGlkOiAnZmluZF9mb3JlY2FzdCcsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdDdXJyZW50LVBlcmlvZCBTbmFwc2hvdD8nLFxuICAgICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2ZvcmVjYXN0JyxcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IENVUlJFTlRfUEVSSU9EX0ZJTFRFUixcbiAgICAgICAgICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2V4aXN0aW5nRm9yZWNhc3QnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gR2F0ZXdheSBvbmx5IFx1MjAxNCB0aGUgcHJlZGljYXRlIGxpdmVzIG9uIHRoZSBvdXQtZWRnZXMuXG4gICAgICAgICAgICAgIGlkOiAnY2hlY2tfbWlzc2luZycsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnRmlyc3QgU25hcHNob3QgVGhpcyBQZXJpb2Q/JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIE9ubHkgYHBlcmlvZGAgaXMgc3VwcGxpZWQ6IGBmb3JlY2FzdC5ob29rLnRzYCBkZXJpdmVzXG4gICAgICAgICAgICAgIC8vIHBlcmlvZF9zdGFydC9wZXJpb2RfZW5kL3BlcmlvZF9sYWJlbCBzbyB0aGUgYm91bmRhcmllcyBhcmVcbiAgICAgICAgICAgICAgLy8gY2FsZW5kYXItdHJ1ZSB3aXRob3V0IHRoZSBmbG93IGRvaW5nIGRhdGUgYXJpdGhtZXRpYyBpdFxuICAgICAgICAgICAgICAvLyBjYW5ub3QgZG8uIGBxdW90YWAgaXMgb21pdHRlZCBvbiBwdXJwb3NlIFx1MjAxNCBzZWUgdGhlIGhlYWRlci5cbiAgICAgICAgICAgICAgLy8gQSBsZWFmIG5vZGU6IHRoZSB0d28gbXV0dWFsbHktZXhjbHVzaXZlIGVkZ2VzIG91dCBvZlxuICAgICAgICAgICAgICAvLyBgY2hlY2tfbWlzc2luZ2AgYm90aCBjb252ZXJnZSBvbiBgcmVsb2FkX2ZvcmVjYXN0YCwgc28gdGhlXG4gICAgICAgICAgICAgIC8vIGNoYWluIGJlbG93IHJ1bnMgZXhhY3RseSBvbmNlIG9uIGVpdGhlciBwYXRoLlxuICAgICAgICAgICAgICBpZDogJ2NyZWF0ZV9mb3JlY2FzdCcsIHR5cGU6ICdjcmVhdGVfcmVjb3JkJywgbGFiZWw6ICdPcGVuIFNuYXBzaG90IFJvdycsXG4gICAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fZm9yZWNhc3QnLFxuICAgICAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICAgICAgb3duZXJfaWQ6IGNlbGBjdXJyZW50T3duZXIuaWRgLFxuICAgICAgICAgICAgICAgICAgLy8gT1JHIFBBUlRJVElPTi4gQSBzY2hlZHVsZSB0cmlnZ2VyIGNhcnJpZXMgbm9cbiAgICAgICAgICAgICAgICAgIC8vIG9yZ2FuaXphdGlvbiwgc28gd2l0aG91dCB0aGlzIHRoZSBzbmFwc2hvdCByb3cgaXMgYm9yblxuICAgICAgICAgICAgICAgICAgLy8gYG9yZ2FuaXphdGlvbl9pZGAgTlVMTCBcdTIwMTQgb3V0c2lkZSBldmVyeSBvcmcgcGFydGl0aW9uLCB3aGVyZVxuICAgICAgICAgICAgICAgICAgLy8gYW4gYChvcmdhbml6YXRpb25faWQsIFx1MjAyNilgIHVuaXF1ZSBpbmRleCBkb2VzIG5vdCBjb25zdHJhaW5cbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBvcmctc2NvcGVkIHJlYWRzIG5ldmVyIHNlZSBpdC4gVXBzdHJlYW0gcnVsaW5nXG4gICAgICAgICAgICAgICAgICAvLyBvYmplY3RzdGFjayM2MTU1IFEyPUEgYXNzaWducyB0aGUgYW5zd2VyIHRvIHRoZSBmbG93IGF1dGhvci5cbiAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAvLyBUaGUgc291cmNlIGlzIGBvd25lckFueURlYWxgLCBOT1QgYGN1cnJlbnRPd25lcmAuIFRoZSBsb29wXG4gICAgICAgICAgICAgICAgICAvLyBpdGVtIGhlcmUgaXMgYSBgc3lzX3VzZXJgIHJvdywgYW5kIGBzeXNfdXNlcmAgZGVjbGFyZXMgTk9cbiAgICAgICAgICAgICAgICAgIC8vIGBvcmdhbml6YXRpb25faWRgIFx1MjAxNCBpZGVudGl0eSBpcyBnbG9iYWwsIG9yZy1wYXJ0aXRpb25lZCBpdFxuICAgICAgICAgICAgICAgICAgLy8gaXMgbm90IChpdCBjYXJyaWVzIGBwcmltYXJ5X2J1c2luZXNzX3VuaXRfaWRgIGluc3RlYWQpLlxuICAgICAgICAgICAgICAgICAgLy8gT24gMTcueCBge2N1cnJlbnRPd25lci5vcmdhbml6YXRpb25faWR9YCBpbnRlcnBvbGF0ZWQgdG9cbiAgICAgICAgICAgICAgICAgIC8vIGB1bmRlZmluZWRgIGFuZCBsYW5kZWQgYXMgTlVMTDogdGhlIHB1Ymxpc2ggZ3VhcmQsIHdoaWNoIG9ubHlcbiAgICAgICAgICAgICAgICAgIC8vIGNoZWNrcyB0aGF0IHRoZSBrZXkgaXMgZGVjbGFyZWQsIHdlbnQgZ3JlZW4gb3ZlciBhIHJvdyBzdGlsbFxuICAgICAgICAgICAgICAgICAgLy8gYm9ybiBvdXRzaWRlIGV2ZXJ5IHBhcnRpdGlvbiAobWVhc3VyZWQsIG5vdCBhc3N1bWVkKS4gVW5kZXJcbiAgICAgICAgICAgICAgICAgIC8vIENFTCB0aGF0IHJlYWQgZmFpbHMgdGhlIGl0ZXJhdGlvbiBpbnN0ZWFkLlxuICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgIC8vIGBvd25lckFueURlYWxgIGlzIHRoZSBgY3JtX29wcG9ydHVuaXR5YCBmcm9tIGBmaW5kX2FueV9kZWFsYFxuICAgICAgICAgICAgICAgICAgLy8gXHUyMDE0IGl0IGNhcnJpZXMgdGhlIGNvbHVtbiwgYW5kIGVkZ2UgYGIyYCAoYG93bmVyQW55RGVhbCAhPVxuICAgICAgICAgICAgICAgICAgLy8gbnVsbGApIGlzIHRoZSBvbmx5IHJvdXRlIHRvIHRoaXMgbm9kZSwgc28gaXQgaXMgbmV2ZXIgbnVsbFxuICAgICAgICAgICAgICAgICAgLy8gaGVyZS4gU2VtYW50aWNhbGx5IHJpZ2h0IHRvbzogYW4gb3duZXIncyBmb3JlY2FzdCBiZWxvbmdzIHRvXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgb3JnIHRoZWlyIHBpcGVsaW5lIGlzIGluLlxuICAgICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uX2lkOiBjZWxgb3duZXJBbnlEZWFsLm9yZ2FuaXphdGlvbl9pZGAsXG4gICAgICAgICAgICAgICAgICBwZXJpb2Q6IFNOQVBTSE9UX1BFUklPRCxcbiAgICAgICAgICAgICAgICAgIHNuYXBzaG90X2RhdGU6IGNlbGBpc29EYXRlKHRvZGF5KCkpYCxcbiAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ3NjaGVkdWxlZCcsXG4gICAgICAgICAgICAgICAgICBwaXBlbGluZV9hbW91bnQ6IDAsXG4gICAgICAgICAgICAgICAgICBiZXN0X2Nhc2VfYW1vdW50OiAwLFxuICAgICAgICAgICAgICAgICAgY29tbWl0X2Ftb3VudDogMCxcbiAgICAgICAgICAgICAgICAgIGNsb3NlZF9hbW91bnQ6IDAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIFJlLXJlYWQgcmF0aGVyIHRoYW4gcmV1c2UgdGhlIGNyZWF0ZSBvdXRwdXQsIHNvIGJvdGggcGF0aHNcbiAgICAgICAgICAgICAgLy8gKHJvdyBhbHJlYWR5IGV4aXN0ZWQgLyByb3cganVzdCBjcmVhdGVkKSBoYW5kIHRoZSByZXN0IG9mIHRoZVxuICAgICAgICAgICAgICAvLyBib2R5IE9ORSB2YXJpYWJsZSBjYXJyeWluZyB0aGUgaG9vay1kZXJpdmVkIHBlcmlvZCB3aW5kb3cuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vIFx1MjZENCBTY29wZSB0aGlzIHRvIE9XTkVEX1BFUklPRF9GSUxURVIsIG5ldmVyIHRvIHRoZSBnYXRlJ3NcbiAgICAgICAgICAgICAgLy8gd2luZG93OiB0aGlzIHJlYWQgY2hvb3NlcyB0aGUgcm93IHRoYXQgZ2V0cyBXUklUVEVOLCBhbmQgdGhlXG4gICAgICAgICAgICAgIC8vIHN3ZWVwIG9ubHkgZXZlciBvd25zIGl0cyBvd24uIEEgbWlzcyBiaW5kcyBgY3VycmVudEZvcmVjYXN0YCB0b1xuICAgICAgICAgICAgICAvLyBudWxsIFx1MjAxNCBgZ2V0X3JlY29yZGAgYWx3YXlzIGJpbmRzIFx1MjAxNCB3aGljaCBpcyBleGFjdGx5IHdoYXRcbiAgICAgICAgICAgICAgLy8gYGNoZWNrX293bmVkYCBiZWxvdyBpcyB0aGVyZSB0byByZWFkLlxuICAgICAgICAgICAgICBpZDogJ3JlbG9hZF9mb3JlY2FzdCcsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdMb2FkIFNuYXBzaG90IFJvdycsXG4gICAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fZm9yZWNhc3QnLFxuICAgICAgICAgICAgICAgIGZpbHRlcjogT1dORURfUEVSSU9EX0ZJTFRFUixcbiAgICAgICAgICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2N1cnJlbnRGb3JlY2FzdCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBHYXRld2F5IG9ubHkgXHUyMDE0IHRoZSBwcmVkaWNhdGUgbGl2ZXMgb24gdGhlIG91dC1lZGdlLlxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvLyBUaGUgc3RhbmQtZG93biBnYXRlLiBUaGUgd2luZG93IGlzIGhhbmRsZWQgZWl0aGVyIHdheSBieSB0aGVcbiAgICAgICAgICAgICAgLy8gdGltZSB3ZSBnZXQgaGVyZTsgdGhpcyBhc2tzIHdoZXRoZXIgdGhlIHJvdyBoYW5kbGluZyBpdCBpcyB0aGVcbiAgICAgICAgICAgICAgLy8gc3dlZXAncy4gU2FtZSBzaW5nbGUtb3V0LWVkZ2Ugc2tpcCBzaGFwZSBhcyBgaGFzX2RlYWxzYDogd2hlblxuICAgICAgICAgICAgICAvLyB0aGUgb25seSBjb25kaXRpb25hbCBlZGdlIGRvZXMgbm90IG1hdGNoLCB0aGUgaXRlcmF0aW9uIGVuZHMgYW5kXG4gICAgICAgICAgICAgIC8vIHRoZSBlbmdpbmUgcmVjb3JkcyB0aGUgdW5yZWFjaGVkIG5vZGVzIGFzIGBza2lwcGVkYCB3aXRoIHRoaXNcbiAgICAgICAgICAgICAgLy8gbm9kZSBhcyBgc2tpcHBlZEJ5YCBcdTIwMTQgc28gYSBzdGFuZC1kb3duIGlzIHZpc2libGUgaW4gdGhlIHJ1biBsb2dcbiAgICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gc2lsZW50LlxuICAgICAgICAgICAgICBpZDogJ2NoZWNrX293bmVkJywgdHlwZTogJ2RlY2lzaW9uJywgbGFiZWw6ICdTd2VlcCBPd25zIFRoaXMgUm93PycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBBY2N1bXVsYXRvcnMgbGl2ZSBpbiB0aGUgZmxvdy13aWRlIHZhcmlhYmxlIG1hcCAoYSBsb29wIGJvZHlcbiAgICAgICAgICAgICAgLy8gc2hhcmVzIHRoZSBlbmNsb3Npbmcgc2NvcGUpLCBzbyB0aGV5IE1VU1QgYmUgemVyb2VkIHBlciBvd25lclxuICAgICAgICAgICAgICAvLyBvciBldmVyeSByZXAgaW5oZXJpdHMgdGhlIHByZXZpb3VzIHJlcCdzIHRvdGFscy5cbiAgICAgICAgICAgICAgaWQ6ICdyZXNldF90b3RhbHMnLCB0eXBlOiAnYXNzaWdubWVudCcsIGxhYmVsOiAnUmVzZXQgVG90YWxzJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgYXNzaWdubWVudHM6IHtcbiAgICAgICAgICAgICAgICAgIHBpcGVsaW5lVG90YWw6IDAsXG4gICAgICAgICAgICAgICAgICBiZXN0Q2FzZVRvdGFsOiAwLFxuICAgICAgICAgICAgICAgICAgY29tbWl0VG90YWw6IDAsXG4gICAgICAgICAgICAgICAgICBjbG9zZWRUb3RhbDogMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLkJVQ0tFVFMuZmxhdE1hcCgoYikgPT4gW2IuZmluZCwgYi5zdW1dKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gRmlsdGVyIGJ5IGlkOiBgdXBkYXRlX3JlY29yZGAgY2FsbHMgYGRhdGEudXBkYXRlYCB3aXRob3V0XG4gICAgICAgICAgICAgIC8vIGBvcHRpb25zLm11bHRpYCwgc28gYSBmaWx0ZXIgbWF0Y2hpbmcgbW9yZSB0aGFuIG9uZSByb3cgZmFpbHNcbiAgICAgICAgICAgICAgLy8gKHNhbWUgY29uc3RyYWludCBhcyBkZW1vX2Jvb3RzdHJhcCAvIGNhc2Vfc2xhX21vbml0b3IpLlxuICAgICAgICAgICAgICBpZDogJ3dyaXRlX3NuYXBzaG90JywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ1dyaXRlIFNuYXBzaG90JyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9mb3JlY2FzdCcsXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7IGlkOiBjZWxgY3VycmVudEZvcmVjYXN0LmlkYCB9LFxuICAgICAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICAgICAgcGlwZWxpbmVfYW1vdW50OiBjZWxgcGlwZWxpbmVUb3RhbGAsXG4gICAgICAgICAgICAgICAgICBiZXN0X2Nhc2VfYW1vdW50OiBjZWxgYmVzdENhc2VUb3RhbGAsXG4gICAgICAgICAgICAgICAgICBjb21taXRfYW1vdW50OiBjZWxgY29tbWl0VG90YWxgLFxuICAgICAgICAgICAgICAgICAgY2xvc2VkX2Ftb3VudDogY2VsYGNsb3NlZFRvdGFsYCxcbiAgICAgICAgICAgICAgICAgIHNuYXBzaG90X2RhdGU6IGNlbGBpc29EYXRlKHRvZGF5KCkpYCxcbiAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ3NjaGVkdWxlZCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBlZGdlczogW1xuICAgICAgICAgICAgLy8gTG9vcC1uZXN0ZWQgY29uZGl0aW9ucyBhcmUgZXhwbGljaXQgQ0VMIGVudmVsb3BlcyAoYFBgKTogdGhlXG4gICAgICAgICAgICAvLyBjb252ZXJzaW9uIHBhc3MgdGhhdCB3cmFwcyBiYXJlIHN0cmluZ3Mgb25seSB3YWxrcyBhIGZsb3cnc1xuICAgICAgICAgICAgLy8gVE9QLUxFVkVMIGVkZ2VzLCBzbyBhIGJhcmUgc3RyaW5nIGluIGhlcmUgd291bGQgZmFsbCB0aHJvdWdoIHRvXG4gICAgICAgICAgICAvLyB0aGUgbGVnYWN5IHRlbXBsYXRlIHBhdGggYW5kIGNvbXBhcmUgYXMgdGV4dCBcdTIwMTQgYSBnYXRlIHRoYXQgbmV2ZXJcbiAgICAgICAgICAgIC8vIG9wZW5zLCBzaWxlbnRseS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGVzZSBlZGdlcyBhcmUgdGhlIE9OTFkgc2l0ZSBmb3IgdGhlaXIgcHJlZGljYXRlczogYVxuICAgICAgICAgICAgLy8gYGRlY2lzaW9uYCBub2RlJ3Mgc2luZ3VsYXIgYGNvbmZpZy5jb25kaXRpb25gIGlzIG5ldmVyIHJlYWQsIHNvIGFcbiAgICAgICAgICAgIC8vIG5vZGUtbGV2ZWwgY29weSB3b3VsZCBiZSBpbmVydCBtZXRhZGF0YSBmcmVlIHRvIGRyaWZ0LlxuICAgICAgICAgICAgeyBpZDogJ2IxJywgc291cmNlOiAnZmluZF9hbnlfZGVhbCcsIHRhcmdldDogJ2hhc19kZWFscycsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgICAgLy8gTm8gbWF0Y2hpbmcgZWRnZSBzaW1wbHkgZW5kcyB0aGlzIGl0ZXJhdGlvbiwgc28gYSB1c2VyIHdpdGggbm9cbiAgICAgICAgICAgIC8vIGxpdmUgZGVhbCBpcyBza2lwcGVkIHdpdGhvdXQgYSBzbmFwc2hvdCByb3cuXG4gICAgICAgICAgICB7IGlkOiAnYjInLCBzb3VyY2U6ICdoYXNfZGVhbHMnLCB0YXJnZXQ6ICdmaW5kX2ZvcmVjYXN0JywgdHlwZTogJ2NvbmRpdGlvbmFsJywgY29uZGl0aW9uOiBQYG93bmVyQW55RGVhbCAhPSBudWxsYCwgbGFiZWw6ICdBY3RpdmUgb3duZXInIH0sXG4gICAgICAgICAgICB7IGlkOiAnYjMnLCBzb3VyY2U6ICdmaW5kX2ZvcmVjYXN0JywgdGFyZ2V0OiAnY2hlY2tfbWlzc2luZycsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgICAgLy8gTXV0dWFsbHkgZXhjbHVzaXZlLCBhbmQgYm90aCByZWFjaCBgcmVsb2FkX2ZvcmVjYXN0YCBcdTIwMTQgbmV2ZXIgYVxuICAgICAgICAgICAgLy8gZGVmYXVsdCBlZGdlIGFsb25nc2lkZSBhIGNvbmRpdGlvbmFsIG9uZSwgd2hpY2ggd291bGQgdHJhdmVyc2VcbiAgICAgICAgICAgIC8vIEJPVEggYW5kIGRvdWJsZS1jb3VudCB0aGUgd2hvbGUgY2hhaW4uXG4gICAgICAgICAgICB7IGlkOiAnYjQnLCBzb3VyY2U6ICdjaGVja19taXNzaW5nJywgdGFyZ2V0OiAnY3JlYXRlX2ZvcmVjYXN0JywgdHlwZTogJ2NvbmRpdGlvbmFsJywgY29uZGl0aW9uOiBQYGV4aXN0aW5nRm9yZWNhc3QgPT0gbnVsbGAsIGxhYmVsOiAnT3BlbiBuZXcgcm93JyB9LFxuICAgICAgICAgICAgeyBpZDogJ2I1Jywgc291cmNlOiAnY2hlY2tfbWlzc2luZycsIHRhcmdldDogJ3JlbG9hZF9mb3JlY2FzdCcsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGBleGlzdGluZ0ZvcmVjYXN0ICE9IG51bGxgLCBsYWJlbDogJ1JlZnJlc2ggZXhpc3Rpbmcgcm93JyB9LFxuICAgICAgICAgICAgeyBpZDogJ2I2Jywgc291cmNlOiAnY3JlYXRlX2ZvcmVjYXN0JywgdGFyZ2V0OiAncmVsb2FkX2ZvcmVjYXN0JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgICAgICAgICB7IGlkOiAnYjcnLCBzb3VyY2U6ICdyZWxvYWRfZm9yZWNhc3QnLCB0YXJnZXQ6ICdjaGVja19vd25lZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgICAgLy8gVGhlIHN0YW5kLWRvd24uIE5vIGNvbXBsZW1lbnRhcnkgZWRnZSwgb24gcHVycG9zZTogdGhlXG4gICAgICAgICAgICAvLyBmYWxzZSBicmFuY2ggaXMgXCJ0aGlzIHdpbmRvdyBiZWxvbmdzIHRvIGEgbWFudWFsL2FpIHJvd1wiLCBhbmQgdGhlXG4gICAgICAgICAgICAvLyB3aG9sZSBwb2ludCBpcyB0aGF0IHRoZSBzd2VlcCB0aGVuIGRvZXMgTk9USElORyBcdTIwMTQgbm8gd3JpdGUsIGFuZFxuICAgICAgICAgICAgLy8gbm8gc2Vjb25kIHJvdy4gQSB2YXJpYWJsZS1yb290IG51bGwgdGVzdCwgc28gbm8gYGhhcygpYCBndWFyZCBpc1xuICAgICAgICAgICAgLy8gbmVlZGVkOiBgcmVsb2FkX2ZvcmVjYXN0YCBpcyBhIGBnZXRfcmVjb3JkYCBhbmQgYmluZHNcbiAgICAgICAgICAgIC8vIGBjdXJyZW50Rm9yZWNhc3RgIHVuY29uZGl0aW9uYWxseSwgdG8gYG51bGxgIG9uIGEgbWlzcy5cbiAgICAgICAgICAgIHsgaWQ6ICdiOCcsIHNvdXJjZTogJ2NoZWNrX293bmVkJywgdGFyZ2V0OiAncmVzZXRfdG90YWxzJywgdHlwZTogJ2NvbmRpdGlvbmFsJywgY29uZGl0aW9uOiBQYGN1cnJlbnRGb3JlY2FzdCAhPSBudWxsYCwgbGFiZWw6ICdTd2VlcCBvd25zIHRoZSByb3cnIH0sXG4gICAgICAgICAgICAuLi5PV05FUl9DSEFJTi5zbGljZSgwLCAtMSkubWFwKChzb3VyY2UsIGkpID0+ICh7XG4gICAgICAgICAgICAgIGlkOiBgYyR7aX1gLFxuICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgIHRhcmdldDogT1dORVJfQ0hBSU5baSArIDFdLFxuICAgICAgICAgICAgICB0eXBlOiAnZGVmYXVsdCcgYXMgY29uc3QsXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIHsgaWQ6ICdlMScsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAncXVlcnlfb3duZXJzJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAncXVlcnlfb3duZXJzJywgdGFyZ2V0OiAnbG9vcF9vd25lcnMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdsb29wX293bmVycycsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL2xlYWQtYXNzaWdubWVudC5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL2xlYWQtYXNzaWdubWVudC5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogTGVhZCBBc3NpZ25tZW50ICYgUm91dGluZyBcdTIwMTQgcmVhY3QgdGhlIGluc3RhbnQgYSBuZXcgbGVhZCBsYW5kcy5cbiAqXG4gKiBGaXJlcyBvbiBsZWFkICppbnNlcnQqLCBzZXRzIGEgcmF0aW5nLWJhc2VkIGBuZXh0X2ZvbGxvd3VwX2RhdGVgIFNMQSwgYW5kXG4gKiBhbGVydHMgdGhlIGxlYWQncyBPV05FUiBcdTIwMTQgdGhlIGFjY291bnRhYmxlIHBhcnR5IFx1MjAxNCB0byBmb2xsb3cgdXAuXG4gKlxuICogXHUyNkQ0IE5ldmVyIGFkZHJlc3MgYSBDUk0gcG9zaXRpb24gKGBzYWxlc19tYW5hZ2VyYCBhbmQgZnJpZW5kcykgYXMgYSByZWNpcGllbnQuXG4gKiBQb3NpdGlvbnMgYXJlIG5vdCBhIG1lc3NhZ2luZyBhdWRpZW5jZTogdGhlIG1lc3NhZ2luZyBzZXJ2aWNlIHJlc29sdmVzXG4gKiBgdXNlcjpgIC8gYHJvbGU6YCAoc3lzX21lbWJlcikgLyBgdGVhbTpgIC8gYG93bmVyX29mOmAsIGFuZCBhIGJhcmUgcG9zaXRpb25cbiAqIG5hbWUgaXMgc3RvcmVkIHZlcmJhdGltIGFzIGBzeXNfaW5ib3hfbWVzc2FnZS51c2VyX2lkYCwgbWF0Y2hpbmcgbm8gcmVhbCB1c2VyLFxuICogc28gdGhlIGFsZXJ0IHJlYWNoZXMgbm9ib2R5LiBXaXRoIG5vIHRlcnJpdG9yeSAvIHJvdW5kLXJvYmluIHRhYmxlIG1vZGVsbGVkLFxuICogdGhlIG93bmVyIGlzIHRoZSBjb3JyZWN0IHJlY2lwaWVudC4gKFN3YXAgdG8gYSBgdGVhbTpgL2Byb2xlOmAgYXVkaWVuY2Ugb25jZSBhXG4gKiBtYW5hZ2VyIGdyb3VwIGlzIHNlZWRlZC4pXG4gKlxuICogVHJpZ2dlciB3aXJpbmc6IHRoZSBgc3RhcnRgIG5vZGUgZGVjbGFyZXMgYHRyaWdnZXJUeXBlOiAncmVjb3JkLWFmdGVyLWNyZWF0ZSdgXG4gKiBzbyB0aGUgcmVjb3JkLWNoYW5nZSB0cmlnZ2VyIHByb3ZpZGVyIGJpbmRzIGl0IHRvIHRoZSBPYmplY3RRTCBgYWZ0ZXJJbnNlcnRgXG4gKiBsaWZlY3ljbGUgaG9vay4gRmlyaW5nIG9uIGluc2VydCBvbmx5IG1lYW5zIHRoZSBTTEEgd3JpdGUgZG9lcyBub3QgcmUtdHJpZ2dlclxuICogdGhlIGZsb3cuIFRoZSBmdWxsIHJlY29yZCBpcyBzZWVkZWQgaW50byB0aGUgcnVuLCBzbyBmaWVsZHMgYXJlIHJlYWQgdmlhXG4gKiBgcmVjb3JkLipgIChubyBnZXRfcmVjb3JkIHJvdW5kLXRyaXAgbmVlZGVkKS5cbiAqL1xuZXhwb3J0IGNvbnN0IExlYWRBc3NpZ25tZW50RmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2xlYWRfYXNzaWdubWVudCcsXG4gIGxhYmVsOiAnTmV3IExlYWQgUm91dGluZyAmIFNMQScsXG4gIGRlc2NyaXB0aW9uOiAnT24gbmV3IGxlYWQ6IHNldCBhIHJhdGluZy1iYXNlZCBmb2xsb3ctdXAgU0xBIGFuZCBhbGVydCB0aGUgbGVhZCBvd25lci4nLFxuICB0eXBlOiAncmVjb3JkX2NoYW5nZScsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG4gIC8vIEEgcmVjb3JkLWNoYW5nZSBmbG93IGZpcmVkIGJ5IGEgU1lTVEVNIHdyaXRlIGNhcnJpZXMgbm8gdHJpZ2dlciB1c2VyXG4gIC8vIGVpdGhlciAoQURSLTAwNDkpLiBUaGlzIGlzIHRoZSBwb3B1bGF0aW9uIHRoZSBmbG93IGlzIEZPUjpcbiAgLy8gbGVhZHMgYXJyaXZlIGZyb20gd2ViLXRvLWxlYWQsIGEgQ1NWIGltcG9ydCwgYSBwYXJ0bmVyIGludGVncmF0aW9uIG9yIGFcbiAgLy8gc2VlZCBsb2FkLCBub25lIG9mIHdoaWNoIGNhcnJ5IGEgdXNlciBzZXNzaW9uLiBNZWFzdXJlZCBvbiAxNy4wLjAtcmMuMiwgYVxuICAvLyB1c2VyLWxlc3MgcnVuIHJlZnVzZXMgYHNsYV9ob3RgIC8gYHNsYV9zdGRgIG91dHJpZ2h0LCBzbyB0aGUgbGVhZCBsYW5kc1xuICAvLyB3aXRoIG5vIGZvbGxvdy11cCBTTEEgYW5kIG5vIGFsZXJ0IGF0IGFsbCBcdTIwMTQgc2lsZW50bHksIHNpbmNlIHRoZSByZWZ1c2FsXG4gIC8vIHN1cmZhY2VzIG9ubHkgaW4gdGhlIHNlcnZlciBsb2cuXG4gIC8vXG4gIC8vIEVsZXZhdGluZyB0aGUgVVNFUi1kcml2ZW4gcnVucyB0b28gaXMgY29ycmVjdDogdGhlIFNMQSBzdGFtcCBpcyB0aGVcbiAgLy8gcGxhdGZvcm0ncyByb3V0aW5nIGRlY2lzaW9uIGFib3V0IHRoZSByb3cgdGhhdCBqdXN0IGZpcmVkIHRoZSB0cmlnZ2VyXG4gIC8vIChrZXllZCB0byBge3JlY29yZC5pZH1gKSwgbm90IHRoZSBzdWJtaXR0aW5nIHJlcCdzIG93biBlZGl0LCBhbmQgYSByZXAgd2hvXG4gIC8vIG1heSBjcmVhdGUgYSBsZWFkIGlzIG5vdCB0aGVyZWJ5IGd1YXJhbnRlZWQgZWRpdCByaWdodHMgb24gaXQuXG4gIHJ1bkFzOiAnc3lzdGVtJyxcblxuICB2YXJpYWJsZXM6IFtdLFxuXG4gIG5vZGVzOiBbXG4gICAge1xuICAgICAgaWQ6ICdzdGFydCcsIHR5cGU6ICdzdGFydCcsIGxhYmVsOiAnU3RhcnQgKGxlYWQgY3JlYXRlZCknLFxuICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fbGVhZCcsIHRyaWdnZXJUeXBlOiAncmVjb3JkLWFmdGVyLWNyZWF0ZScgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEJyYW5jaGluZyBsaXZlcyBvbiBlZGdlcyBgZTJgIC8gYGUzYCBcdTIwMTQgc2VlIHRoZSB0b3RhbGl0eSBub3RlIHRoZXJlLlxuICAgICAgLy8gVGhpcyBub2RlIGNhcnJpZXMgbm8gYGNvbmZpZy5jb25kaXRpb25gOiB0aGUgZW5naW5lIG5ldmVyIGV2YWx1YXRlcyBhXG4gICAgICAvLyBgZGVjaXNpb25gIG5vZGUncyBzaW5ndWxhciBvbmUsIHNvIGEgY29weSBoZXJlIHdvdWxkIHJlc3RhdGUgdGhlIGdhdGVcbiAgICAgIC8vIHdpdGhvdXQgYmVpbmcgdGhlIGdhdGUgKDE3LjAuMC1yYy4yJ3MgYGZsb3ctaW5lcnQtbm9kZS1jb25kaXRpb25gKS5cbiAgICAgIGlkOiAnY2hlY2tfaG90JywgdHlwZTogJ2RlY2lzaW9uJywgbGFiZWw6ICdIb3QgTGVhZCAocmF0aW5nIFx1MjI2NSA0KT8nLFxuICAgIH0sXG5cbiAgICAvLyBcdTI1MDBcdTI1MDAgSG90IHBhdGg6IDEtZGF5IFNMQSwgaGlnaC1zZXZlcml0eSBhbGVydCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICB7XG4gICAgICBpZDogJ3NsYV9ob3QnLCB0eXBlOiAndXBkYXRlX3JlY29yZCcsIGxhYmVsOiAnU2V0IDEtRGF5IFNMQScsXG4gICAgICBjb25maWc6IHsgb2JqZWN0TmFtZTogJ2NybV9sZWFkJywgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkLmlkYCB9LCBmaWVsZHM6IHsgbmV4dF9mb2xsb3d1cF9kYXRlOiBjZWxgaXNvRGF0ZShkYXlzRnJvbU5vdygxKSlgIH0gfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnbm90aWZ5X2hvdCcsIHR5cGU6ICdub3RpZnknLCBsYWJlbDogJ0FsZXJ0IFx1MjAxNCBIb3QgTGVhZCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgLy8gUm91dGUgdG8gdGhlIGxlYWQncyBPV05FUiAoYSByZWFsIHVzZXIgaWQpLiBBIENSTSBwb3NpdGlvbiBsaWtlXG4gICAgICAgIC8vICdzYWxlc19tYW5hZ2VyJyBpcyBOT1QgYSBtZXNzYWdpbmcgYXVkaWVuY2UgXHUyMDE0IHRoZSBtZXNzYWdpbmcgc2VydmljZVxuICAgICAgICAvLyByZXNvbHZlcyB1c2VyOi9yb2xlOihzeXNfbWVtYmVyKS90ZWFtOi9vd25lcl9vZjosIGFuZCBhIGJhcmVcbiAgICAgICAgLy8gJ3NhbGVzX21hbmFnZXInIHdhcyBzdG9yZWQgdmVyYmF0aW0gYXMgc3lzX2luYm94X21lc3NhZ2UudXNlcl9pZCxcbiAgICAgICAgLy8gbWF0Y2hpbmcgbm8gcmVhbCB1c2VyLCBzbyB0aGVzZSBhbGVydHMgcmVhY2hlZCBub2JvZHkuIG93bmVyIGlzIHNldFxuICAgICAgICAvLyBvbiBpbnNlcnQgKGRlZmF1bHRWYWx1ZSBvcy51c2VyLmlkKSBhbmQgaXMgdGhlIGFjY291bnRhYmxlIHBhcnR5LlxuICAgICAgICByZWNpcGllbnRzOiBbY2VsYHJlY29yZC5vd25lcl9pZGBdLFxuICAgICAgICBjaGFubmVsczogWydpbmJveCcsICdlbWFpbCddLFxuICAgICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgICB0b3BpYzogJ2xlYWRfcm91dGluZycsXG4gICAgICAgIHRlbXBsYXRlOiAnY3JtLmxlYWRfcm91dGluZ19ob3QnLFxuICAgICAgICB0ZW1wbGF0ZURhdGE6IHtcbiAgICAgICAgICBmaXJzdF9uYW1lOiBjZWxgcmVjb3JkLmZpcnN0X25hbWVgLCBsYXN0X25hbWU6IGNlbGByZWNvcmQubGFzdF9uYW1lYCxcbiAgICAgICAgICBjb21wYW55OiBjZWxgcmVjb3JkLmNvbXBhbnlgLCByYXRpbmc6IGNlbGByZWNvcmQucmF0aW5nYCxcbiAgICAgICAgfSxcbiAgICAgICAgYWN0aW9uVXJsOiAnL2NybV9sZWFkL3t7cmVjb3JkLmlkfX0nLFxuICAgICAgfSxcbiAgICB9LFxuXG4gICAgLy8gXHUyNTAwXHUyNTAwIFN0YW5kYXJkIHBhdGg6IDMtZGF5IFNMQSwgbm9ybWFsIGFsZXJ0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIHtcbiAgICAgIGlkOiAnc2xhX3N0ZCcsIHR5cGU6ICd1cGRhdGVfcmVjb3JkJywgbGFiZWw6ICdTZXQgMy1EYXkgU0xBJyxcbiAgICAgIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX2xlYWQnLCBmaWx0ZXI6IHsgaWQ6IGNlbGByZWNvcmQuaWRgIH0sIGZpZWxkczogeyBuZXh0X2ZvbGxvd3VwX2RhdGU6IGNlbGBpc29EYXRlKGRheXNGcm9tTm93KDMpKWAgfSB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdub3RpZnlfc3RkJywgdHlwZTogJ25vdGlmeScsIGxhYmVsOiAnQWxlcnQgXHUyMDE0IE5ldyBMZWFkJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAvLyBSb3V0ZSB0byB0aGUgbGVhZCdzIG93bmVyIFx1MjAxNCBzZWUgbm90aWZ5X2hvdCBmb3Igd2h5IGEgYmFyZVxuICAgICAgICAvLyAnc2FsZXNfbWFuYWdlcicgcG9zaXRpb24gbmV2ZXIgcmVhY2hlZCBhbnlvbmUuXG4gICAgICAgIHJlY2lwaWVudHM6IFtjZWxgcmVjb3JkLm93bmVyX2lkYF0sXG4gICAgICAgIGNoYW5uZWxzOiBbJ2luYm94J10sXG4gICAgICAgIHRvcGljOiAnbGVhZF9yb3V0aW5nJyxcbiAgICAgICAgdGVtcGxhdGU6ICdjcm0ubGVhZF9yb3V0aW5nX25ldycsXG4gICAgICAgIHRlbXBsYXRlRGF0YToge1xuICAgICAgICAgIGZpcnN0X25hbWU6IGNlbGByZWNvcmQuZmlyc3RfbmFtZWAsIGxhc3RfbmFtZTogY2VsYHJlY29yZC5sYXN0X25hbWVgLCBjb21wYW55OiBjZWxgcmVjb3JkLmNvbXBhbnlgLFxuICAgICAgICB9LFxuICAgICAgICBhY3Rpb25Vcmw6ICcvY3JtX2xlYWQve3tyZWNvcmQuaWR9fScsXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdjaGVja19ob3QnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAvLyBUT1RBTElUWTogdGhlc2UgdHdvIGVkZ2VzIG11c3QgUEFSVElUSU9OIGV2ZXJ5IGxlYWQgXHUyMDE0IGEgcmF0aW5nXG4gICAgLy8gdGhlIHByZWRpY2F0ZSBjYW5ub3QgcmVhZCBoYXMgdG8gZmFsbCBkb3duIG9uZSBicmFuY2gsIG5ldmVyIG5laXRoZXIuXG4gICAgLy8gR3VhcmRpbmcgYm90aCB3aXRoIGBoYXMoLi4uKSAmJmAgd291bGQgaGF2ZSB0cmFkZWQgYSBsb3VkIGFib3J0IGZvciBhXG4gICAgLy8gc2lsZW50IG5vLW9wICh1bnJhdGVkIGxlYWQgXHUyMTkyIG5vIFNMQSwgbm8gYWxlcnQsIG5vIGVycm9yKSwgd2hpY2ggaXMgdGhlXG4gICAgLy8gXCJkZWNsYXJlZCBcdTIyNjAgZW5mb3JjZWRcIiBzaGFwZSB0aGlzIHJlcG8ga2VlcHMgZGVsZXRpbmcgcnVsZXMgb3Zlci4gU28gdGhlXG4gICAgLy8gaG90IGJyYW5jaCBkZW1hbmRzIGEgcmVhZGFibGUgcmF0aW5nIGFuZCB0aGUgc3RhbmRhcmQgYnJhbmNoIGFic29yYnNcbiAgICAvLyBldmVyeXRoaW5nIGVsc2U6IGFuIHVucmF0ZWQgbGVhZCBpcywgY29ycmVjdGx5LCBub3QgYSBob3QgbGVhZC5cbiAgICAvL1xuICAgIC8vIGByYXRpbmdgIGlzIG5laXRoZXIgcmVxdWlyZWQgbm9yIGRlZmF1bHRlZCwgc28gYSBsZWFkIHdyaXR0ZW4gd2l0aG91dCBvbmVcbiAgICAvLyBpcyBzdG9yZWQgd2l0aCBOTyBgcmF0aW5nYCBjb2x1bW4gb24gZHJpdmVyLW1lbW9yeSAvIGRyaXZlci1tb25nb2RiLlxuICAgIC8vIE1lYXN1cmVkIGVuZC10by1lbmQ6IHRoZSB1bmd1YXJkZWQgYHJlY29yZC5yYXRpbmcgPj0gNGAgYWJvcnRlZCB3aXRoIGBOb1xuICAgIC8vIHN1Y2gga2V5OiByYXRpbmdgIGFuZCBhbiB1bnJhdGVkIGxlYWQgZ290IG5vIFNMQSBzdGFtcCBhbmQgbm8gYWxlcnQgYXRcbiAgICAvLyBhbGwuIGBoYXMoKWAgYWxvbmUgaXMgbm90IGVub3VnaCBvbiBhbiBPUkRFUklORyBjb21wYXJpc29uIFx1MjAxNCBhbiBleHBsaWNpdFxuICAgIC8vIGByYXRpbmc6IG51bGxgIHBhc3NlcyBgaGFzKClgIGFuZCB0aGVuIGFib3J0cyB3aXRoIGBubyBzdWNoIG92ZXJsb2FkOlxuICAgIC8vIGR5bjxudWxsPiA+PSBpbnRgIFx1MjAxNCBzbyBib3RoIGd1YXJkcyBhcmUgcmVxdWlyZWQsIGluIHRoaXMgb3JkZXIuXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAnY2hlY2tfaG90JywgdGFyZ2V0OiAnc2xhX2hvdCcsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnJhdGluZykgJiYgcmVjb3JkLnJhdGluZyAhPSBudWxsICYmIHJlY29yZC5yYXRpbmcgPj0gNGAsIGxhYmVsOiAnSG90JyB9LFxuICAgIHsgaWQ6ICdlMycsIHNvdXJjZTogJ2NoZWNrX2hvdCcsIHRhcmdldDogJ3NsYV9zdGQnLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IFBgIWhhcyhyZWNvcmQucmF0aW5nKSB8fCByZWNvcmQucmF0aW5nID09IG51bGwgfHwgcmVjb3JkLnJhdGluZyA8IDRgLCBsYWJlbDogJ1N0YW5kYXJkJyB9LFxuICAgIHsgaWQ6ICdlNCcsIHNvdXJjZTogJ3NsYV9ob3QnLCB0YXJnZXQ6ICdub3RpZnlfaG90JywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U1Jywgc291cmNlOiAnbm90aWZ5X2hvdCcsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlNicsIHNvdXJjZTogJ3NsYV9zdGQnLCB0YXJnZXQ6ICdub3RpZnlfc3RkJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U3Jywgc291cmNlOiAnbm90aWZ5X3N0ZCcsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL2NvbnRhY3Qtd2VsY29tZS5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL2NvbnRhY3Qtd2VsY29tZS5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogTmV3LWNvbnRhY3QgYWxlcnQgXHUyMDE0IHJlY29yZC1jaGFuZ2UgZmxvdyBvbiBjb250YWN0IGluc2VydC5cbiAqXG4gKiBcdTI2RDQgTm90aWZpZXMgdGhlIE9XTkVSLCBuZXZlciB0aGUgY29udGFjdC4gYG5vdGlmeWAgYWRkcmVzc2VzIHBsYXRmb3JtIHVzZXJzIFx1MjAxNFxuICogYSByYXcgZW1haWwgYWRkcmVzcyBpcyBzdG9yZWQgdmVyYmF0aW0gYXMgYW4gaW5ib3ggYHVzZXJfaWRgIGFuZCByZWFjaGVzXG4gKiBub2JvZHkuIEEgdHJ1ZSBvdXRib3VuZCB3ZWxjb21lIGVtYWlsIHRvIHRoZSBjb250YWN0IG5lZWRzIGFuIGVtYWlsIGNvbm5lY3RvclxuICogYWN0aW9uLCBub3QgYW4gaW5ib3ggbm90aWZpY2F0aW9uLlxuICpcbiAqIEdhdGVkIG9uIGBlbWFpbF9vcHRfb3V0ICE9IHRydWVgIHNvIGFuIG9wdGVkLW91dCBjb250YWN0IHRyaWdnZXJzIG5vIG91dHJlYWNoXG4gKiBwcm9tcHQsIGFuZCBza2lwcGVkIGVudGlyZWx5IHdoZW4gdGhlcmUgaXMgbm8gb3duZXIgdG8gbm90aWZ5LlxuICovXG5leHBvcnQgY29uc3QgQ29udGFjdFdlbGNvbWVGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnY29udGFjdF93ZWxjb21lJyxcbiAgbGFiZWw6ICdDb250YWN0IFdlbGNvbWUnLFxuICBkZXNjcmlwdGlvbjogJ09uIG5ldyBjb250YWN0OiBwcm9tcHQgdGhlIG93bmVyIHRvIHdlbGNvbWUgdGhlbS4nLFxuICB0eXBlOiAncmVjb3JkX2NoYW5nZScsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG4gIC8vIEEgcmVjb3JkLWNoYW5nZSBmbG93IGZpcmVkIGJ5IGEgU1lTVEVNIHdyaXRlIGNhcnJpZXMgbm8gdHJpZ2dlciB1c2VyXG4gIC8vIGVpdGhlciAoQURSLTAwNDkpIFx1MjAxNCBhbmQgdGhpcyBmbG93IGV4aXN0cyBGT1IgdGhhdFxuICAvLyBwb3B1bGF0aW9uOiB0aGUgc3RhcnQgY29uZGl0aW9uIGJlbG93IGFscmVhZHkgZG9jdW1lbnRzIHRoZSBzZWVkZWQgL1xuICAvLyBpbnRlZ3JhdGlvbi13cml0dGVuIGNvbnRhY3RzIHdob3NlIGBvd25lcl9pZGAgdGhlIHNlY3VyaXR5IG1pZGRsZXdhcmVcbiAgLy8gbmV2ZXIgc3RhbXBlZCBiZWNhdXNlIHRoZSB3cml0ZSBjYXJyaWVkIG5vIHNlc3Npb24uXG4gIC8vXG4gIC8vIE1lYXN1cmVkIGhvbmVzdGx5IG9uIDE3LjAuMC1yYy4yOiB0aGlzIGZsb3cgaGFzIE5PIGRhdGEgbm9kZSB0b2RheSAoc3RhcnRcbiAgLy8gXHUyMTkyIG5vdGlmeSBcdTIxOTIgZW5kKSwgdGhlIHJ1bkFzIHJlZnVzYWwgY292ZXJzIGdldC9jcmVhdGUvdXBkYXRlL2RlbGV0ZSBvbmx5LFxuICAvLyBhbmQgYG5vdGlmeWAgZGlzcGF0Y2hlcyB0aHJvdWdoIHRoZSBtZXNzYWdpbmcgc2VydmljZSB3aXRob3V0IGEgcnVuIGRhdGFcbiAgLy8gY29udGV4dCBcdTIwMTQgc28gYSB1c2VyLWxlc3MgcnVuIGNvbXBsZXRlcyBhbmQgZGVsaXZlcnMgdG9kYXksIGFuZCB0aGlzXG4gIC8vIGRlY2xhcmF0aW9uIGNoYW5nZXMgbm90aGluZyBvYnNlcnZhYmxlIHJpZ2h0IG5vdy4gSXQgaXMgZGVjbGFyZWQgYW55d2F5XG4gIC8vIGJlY2F1c2UgdGhlIGRlY2lzaW9uIGJlaW5nIHJlY29yZGVkIGlzIFwicmVjb3JkLWNoYW5nZSBhdXRvbWF0aW9uIHJ1bnMgYXNcbiAgLy8gdGhlIHBsYXRmb3JtXCIsIG5vdCBcInRoaXMgZmxvdyBjdXJyZW50bHkgaGFwcGVucyB0byBoYXZlIG5vIGRhdGEgbm9kZVwiLlxuICAvLyBUaGUgZGF5IGEgZGF0YSBub2RlIGlzIGFkZGVkIFx1MjAxNCBvciBhIHN0YXJ0LW5vZGUgYGNvbmZpZy5leHBhbmRgLCB3aGljaCBpc1xuICAvLyB0aGUgcmVtZWR5IHRoZSBub3RpZnkgbm9kZSdzIG93biBlcnJvciBtZXNzYWdlIHJlY29tbWVuZHMgYW5kIHdoaWNoIHJlYWRzXG4gIC8vIHRocm91Z2ggdGhlIHNhbWUgZ3VhcmRlZCBwYXRoIFx1MjAxNCB0aGUgZWxldmF0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcmVhc29uZWRcbiAgLy8gYWJvdXQgaGVyZSByYXRoZXIgdGhhbiBkaXNjb3ZlcmVkIGFzIGEgcmVmdXNhbCBpbiBwcm9kdWN0aW9uLiBFbGV2YXRpb24gaXNcbiAgLy8gaGFybWxlc3MgZm9yIHRoZSB1c2VyLWRyaXZlbiBydW5zOiB0aGVyZSBpcyBubyBkYXRhIG9wZXJhdGlvbiB0byBzY29wZS5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICB2YXJpYWJsZXM6IFtdLFxuICBub2RlczogW1xuICAgIHtcbiAgICAgIGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0IChjb250YWN0IGNyZWF0ZWQpJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2NvbnRhY3QnLFxuICAgICAgICB0cmlnZ2VyVHlwZTogJ3JlY29yZC1hZnRlci1jcmVhdGUnLFxuICAgICAgICAvLyBUT1RBTElUWTogZXZlcnkgYHJlY29yZC54YCByZWFkIGNhcnJpZXMgYSBgaGFzKHJlY29yZC54KWBcbiAgICAgICAgLy8gZ3VhcmQgXHUyMDE0IHNlZSB0aGUgaG91c2UtcnVsZSBibG9jayBpblxuICAgICAgICAvLyBgdGVzdC9mbG93LWNvbmRpdGlvbi10b3RhbGl0eS50ZXN0LnRzYC4gVGhlIGFic2VudC1rZXkgY2FzZSBpcyByZWFsXG4gICAgICAgIC8vIGhlcmUsIG5vdCBoeXBvdGhldGljYWw6IGBvd25lcl9pZGAgaXMgYXV0by1zdGFtcGVkIGJ5IHRoZSBzZWN1cml0eVxuICAgICAgICAvLyBtaWRkbGV3YXJlIG9ubHkgb24gd3JpdGVzIHRoYXQgQ0FSUlkgYSB1c2VyLCBhbmQgYSBzeXN0ZW0gd3JpdGUgXHUyMDE0XG4gICAgICAgIC8vIHNlZWQgZGF0YSwgYW4gaW50ZWdyYXRpb24sIGEgYHJ1bkFzOiAnc3lzdGVtJ2AgZmxvdyBcdTIwMTQgc2hvcnQtY2lyY3VpdHNcbiAgICAgICAgLy8gdGhhdCBtaWRkbGV3YXJlIGVudGlyZWx5LiBTdWNoIGEgcm93IHJlYWNoZXMgZHJpdmVyLW1lbW9yeVxuICAgICAgICAvLyB3aXRoIE5PIGBvd25lcl9pZGAgY29sdW1uIGF0IGFsbCwgc28gYHJlY29yZC5vd25lcl9pZCAhPSBudWxsYCBhbG9uZVxuICAgICAgICAvLyBhYm9ydHMgd2l0aCBgTm8gc3VjaCBrZXlgIGFuZCBubyBzZWVkZWQgY29udGFjdCBldmVyIGdldHMgYSB3ZWxjb21lXG4gICAgICAgIC8vIHByb21wdC4gYCE9IG51bGxgIGlzIG5vdCBhIHN1YnN0aXR1dGUgZm9yIGBoYXMoKWA6IG9uIGFuIGFic2VudCBrZXlcbiAgICAgICAgLy8gaXQgYWJvcnRzIGV4YWN0bHkgbGlrZSBgPT0gXCJ2XCJgIGRvZXMuIEFuIGFic2VudCBgZW1haWxfb3B0X291dGBcbiAgICAgICAgLy8gbWVhbnMgdGhlIGNvbnRhY3QgaGFzIG5vdCBvcHRlZCBvdXQuXG4gICAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLm93bmVyX2lkKSAmJiByZWNvcmQub3duZXJfaWQgIT0gbnVsbFxuICAgICAgICAgICYmICghaGFzKHJlY29yZC5lbWFpbF9vcHRfb3V0KSB8fCByZWNvcmQuZW1haWxfb3B0X291dCAhPSB0cnVlKWAsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdzZW5kX3dlbGNvbWUnLCB0eXBlOiAnbm90aWZ5JywgbGFiZWw6ICdQcm9tcHQgT3duZXIgdG8gV2VsY29tZScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgcmVjaXBpZW50czogW2NlbGByZWNvcmQub3duZXJfaWRgXSxcbiAgICAgICAgY2hhbm5lbHM6IFsnaW5ib3gnLCAnZW1haWwnXSxcbiAgICAgICAgdG9waWM6ICdjb250YWN0X3dlbGNvbWUnLFxuICAgICAgICB0ZW1wbGF0ZTogJ2NybS5jb250YWN0X3dlbGNvbWUnLFxuICAgICAgICB0ZW1wbGF0ZURhdGE6IHsgZmlyc3RfbmFtZTogY2VsYHJlY29yZC5maXJzdF9uYW1lYCwgbGFzdF9uYW1lOiBjZWxgcmVjb3JkLmxhc3RfbmFtZWAgfSxcbiAgICAgICAgYWN0aW9uVXJsOiAnL2NybV9jb250YWN0L3t7cmVjb3JkLmlkfX0nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdzZW5kX3dlbGNvbWUnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdzZW5kX3dlbGNvbWUnLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9vcHBvcnR1bml0eS13b24tYWxlcnQuZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9vcHBvcnR1bml0eS13b24tYWxlcnQuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUCwgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xuaW1wb3J0IHsgTEFSR0VfREVBTF9BTU9VTlQgfSBmcm9tICcuLi9vYmplY3RzL190aHJlc2hvbGRzJztcbnR5cGUgRmxvdyA9IEF1dG9tYXRpb24uRmxvdztcblxuLyoqXG4gKiBMYXJnZS1kZWFsLXdvbiBhbGVydCBcdTIwMTQgcmVjb3JkLWNoYW5nZSBmbG93IG9uIG9wcG9ydHVuaXR5IHVwZGF0ZS5cbiAqXG4gKiBXaGVuIGEgZGVhbCBvZiAkMTAwSyBvciBtb3JlIGlzIG1hcmtlZCBjbG9zZWRfd29uLCBub3RpZnkgdGhlIG93bmVyIFx1MjAxNCB0aGVcbiAqIG93bmVyIGFsb25lLCBub3QgdGhlaXIgbWFuYWdlciAoc2VlIHRoZSBub3RpZnkgbm9kZSBmb3Igd2h5IHRoZSBtYW5hZ2VyXG4gKiBjYW5ub3QgYmUgcmVhY2hlZCkuXG4gKlxuICogVGhlIGN1dCBpcyBJTkNMVVNJVkUgKGA+PWApOiBgTEFSR0VfREVBTF9BTU9VTlRgIG11c3QgbWVhbiBvbmUgdGhpbmcgYWNyb3NzXG4gKiB0aGlzIGFsZXJ0LCB0aGUgYXBwcm92YWwgZW50cnkgZ2F0ZSBhbmQgYm90aCBzaGFyaW5nIHJ1bGVzLCBzbyBhIGRlYWwgYXRcbiAqIGV4YWN0bHkgJDEwMCwwMDAgaXMgYW5ub3VuY2VkIG9uIHdpbiBmb3IgdGhlIHNhbWUgcmVhc29uIGl0IGlzIHNoYXJlZCB3aXRoXG4gKiBsZWFkZXJzaGlwLiBcdTI2RDQgTmV2ZXIgbGV0IHRoaXMgc2l0ZSBhbmQgdGhlIHNoYXJpbmcgcnVsZXMgY3V0IGRpZmZlcmVudGx5IFx1MjAxNCBhXG4gKiBkZWFsIG9uIHRoZSBsaW5lIHRoZW4gYmVjb21lcyB2aXNpYmxlIHRvIGxlYWRlcnNoaXAgYW5kIGludmlzaWJsZSB0b1xuICogZ292ZXJuYW5jZS5cbiAqXG4gKiBOQjogYHJlY29yZC5hbW91bnQgPj0gMTAwMDAwYCBpcyBhdXRob3JlZCBhcyBiYXJlIENFTCBhZ2FpbnN0IHRoZVxuICogKHN0cmluZy1zZXJpYWxpemVkKSBjdXJyZW5jeSBmaWVsZCwgd2hpY2ggcmVsaWVzIG9uIHRoZSA3LjcgbnVtZXJpYy1oeWRyYXRpb25cbiAqIGZpeDsgcHJlLTcuNyBpdCB3b3VsZCBoYXZlIG5lZWRlZCBgZG91YmxlKHJlY29yZC5hbW91bnQpYC5cbiAqL1xuZXhwb3J0IGNvbnN0IE9wcG9ydHVuaXR5V29uQWxlcnRGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnb3Bwb3J0dW5pdHlfd29uX2FsZXJ0JyxcbiAgbGFiZWw6ICdMYXJnZSBEZWFsIFdvbiBBbGVydCcsXG4gIGRlc2NyaXB0aW9uOiAnT24gY2xvc2VkX3dvbiBvcHBvcnR1bml0aWVzIG9mICQxMDBLIG9yIG1vcmU6IG5vdGlmeSB0aGUgb3duZXIgXHUyMDE0IHRoZSBvd25lciBhbG9uZSwgbm90IHRoZWlyIG1hbmFnZXIuJyxcbiAgdHlwZTogJ3JlY29yZF9jaGFuZ2UnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBBIHJlY29yZC1jaGFuZ2UgZmxvdyBmaXJlZCBieSBhIFNZU1RFTSB3cml0ZSBjYXJyaWVzIG5vIHRyaWdnZXIgdXNlclxuICAvLyBlaXRoZXIgKEFEUi0wMDQ5KS4gRGVhbHMgcmVhY2ggYGNsb3NlZF93b25gIHRocm91Z2hcbiAgLy8gbWFjaGluZXJ5IGFzIHdlbGwgYXMgdGhyb3VnaCBhIHJlcCdzIG93biBzYXZlIFx1MjAxNCBgbGVhZF9jb252ZXJzaW9uYCBhbmQgdGhlXG4gIC8vIGBjb250cmFjdF9yZW5ld2FsYCBzd2VlcCBib3RoIHdyaXRlIG9wcG9ydHVuaXRpZXMsIGFuZCB0aGUgbGF0dGVyIGlzXG4gIC8vIGl0c2VsZiBgcnVuQXM6ICdzeXN0ZW0nYC5cbiAgLy9cbiAgLy8gTWVhc3VyZWQgaG9uZXN0bHkgb24gMTcuMC4wLXJjLjI6IHRoaXMgZmxvdyBoYXMgTk8gZGF0YSBub2RlIChzdGFydCBcdTIxOTJcbiAgLy8gbm90aWZ5IFx1MjE5MiBlbmQpLCBzbyB0aGUgcmVmdXNhbCBkb2VzIG5vdCByZWFjaCBpdCB0b2RheSBhbmQgZGVjbGFyaW5nXG4gIC8vIGBzeXN0ZW1gIGNoYW5nZXMgbm90aGluZyBvYnNlcnZhYmxlLiBEZWNsYXJlZCBmb3IgdGhlIHNhbWUgcmVhc29uIGFzXG4gIC8vIGBjb250YWN0X3dlbGNvbWVgIFx1MjAxNCBzZWUgdGhlIGZ1bGxlciBub3RlIHRoZXJlLiBOb3RoaW5nIHRvIHNjb3BlLCBzb1xuICAvLyBlbGV2YXRpbmcgdGhlIHVzZXItZHJpdmVuIHJ1bnMgY29zdHMgbm90aGluZy5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICB2YXJpYWJsZXM6IFtdLFxuICBub2RlczogW1xuICAgIHtcbiAgICAgIGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0IChvcHAgdXBkYXRlZCknLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgICB0cmlnZ2VyVHlwZTogJ3JlY29yZC1hZnRlci11cGRhdGUnLFxuICAgICAgICAvLyBgcHJldmlvdXMuc3RhZ2VgIGd1YXJkOiBmaXJlIG9uIHRoZSBUUkFOU0lUSU9OIGludG8gY2xvc2VkX3dvbiBvbmx5LlxuICAgICAgICAvLyBXaXRob3V0IGl0IGV2ZXJ5IGxhdGVyIGVkaXQgb2YgYSB3b24gZGVhbCAoc2VlZC1vd25lcnNoaXBcbiAgICAgICAgLy8gY2xhaW1zLCBhcHByb3ZhbC1zdGF0dXMgc3RhbXBzLCBkZXNjcmlwdGlvbiB0d2Vha3MpIHJlLXNlbnQgdGhlXG4gICAgICAgIC8vIGNvbmdyYXR1bGF0aW9ucyBibGFzdC4gVGhlIHRyaWdnZXIgZm9yd2FyZHMgYHByZXZpb3VzYCBpbnRvIHRoZVxuICAgICAgICAvLyBjb25kaXRpb24gc2NvcGUgKGNmLiB0aGUgZW5naW5lJ3MgcmVjb3JkLWNoYW5nZSBjb250ZXh0KS5cbiAgICAgICAgLy8gVE9UQUxJVFk6IGBoYXMoLi4uKWAgb24gZXZlcnkgcmVhZCwgcGx1cyBgIT0gbnVsbGAgb24gdGhlXG4gICAgICAgIC8vIG9yZGVyaW5nIGNvbXBhcmlzb24gKGBoYXMoKWAgcGFzc2VzIGFuIGV4cGxpY2l0IG51bGwgYW5kXG4gICAgICAgIC8vIGByZWNvcmQuYW1vdW50ID49IDEwMDAwMGAgdGhlbiBhYm9ydHMgd2l0aFxuICAgICAgICAvLyBgbm8gc3VjaCBvdmVybG9hZDogZHluPG51bGw+ID49IGludGApLlxuICAgICAgICAvL1xuICAgICAgICAvLyBgcHJldmlvdXMuc3RhZ2VgIGlzIGd1YXJkZWQgRkFJTC1DTE9TRUQgXHUyMDE0IGBoYXMocHJldmlvdXMuc3RhZ2UpICYmYCxcbiAgICAgICAgLy8gbm90IGAhaGFzKHByZXZpb3VzLnN0YWdlKSB8fGAgXHUyMDE0IHdoaWNoIGlzIHRoZSBvcHBvc2l0ZSBvZiBob3dcbiAgICAgICAgLy8gYHJlY29yZC5zdGFnZWAgaXMgZ3VhcmRlZCwgZGVsaWJlcmF0ZWx5LiBUaGlzIHRlcm0gZXhpc3RzIHNvbGVseSB0b1xuICAgICAgICAvLyBzdXBwcmVzcyBhIHJlLWZpcmUsIGFuZCB0aGUgZmFpbHVyZSBpdCB3YXMgd3JpdHRlbiBmb3IgKGFcbiAgICAgICAgLy8gY29uZ3JhdHVsYXRpb25zIGJsYXN0IHRvIG1hbmFnZW1lbnQgcmUtc2VudCBvbiBldmVyeSBsYXRlciBlZGl0IG9mIGFcbiAgICAgICAgLy8gd29uIGRlYWwpIGlzIHdvcnNlIHRoYW4gYSBtaXNzZWQgb25lLiBXaGVuIHRoZSBlbmdpbmUgY2Fubm90IHNlZVxuICAgICAgICAvLyB3aGF0IHRoZSBwcmlvciBzdGFnZSB3YXMgaXQgY2Fubm90IHNlZSBhIFRSQU5TSVRJT04gZWl0aGVyLCBzbyBpdFxuICAgICAgICAvLyBtdXN0IG5vdCBjbGFpbSBvbmUuIEluIHByYWN0aWNlIGBwcmV2aW91c2AgaXMgYSBmdWxsIHByaW9yIHJvdyBvblxuICAgICAgICAvLyBldmVyeSByZWNvcmQtYWZ0ZXItdXBkYXRlOyB0aGUgc2hhcGUgdGhpcyBjb3ZlcnMgaXMgYSBidWxrXG4gICAgICAgIC8vIGB1cGRhdGVNYW55YCwgd2hlcmUgT2JqZWN0UUwgbmV2ZXIgcmVhZHMgYSBwcmlvciByb3cgYW5kIGBwcmV2aW91c2BcbiAgICAgICAgLy8gYXJyaXZlcyBudWxsIFx1MjAxNCBhbmQgZmlyaW5nIG9uZSBibGFzdCBwZXIgcm93IG9mIGEgYnVsayB1cGRhdGUgaXNcbiAgICAgICAgLy8gZXhhY3RseSB3aGF0IG5vYm9keSB3YW50cy5cbiAgICAgICAgY29uZGl0aW9uOiBQYGhhcyhyZWNvcmQuc3RhZ2UpICYmIHJlY29yZC5zdGFnZSA9PSBcImNsb3NlZF93b25cIlxuICAgICAgICAgICYmIGhhcyhwcmV2aW91cy5zdGFnZSkgJiYgcHJldmlvdXMuc3RhZ2UgIT0gXCJjbG9zZWRfd29uXCJcbiAgICAgICAgICAmJiBoYXMocmVjb3JkLmFtb3VudCkgJiYgcmVjb3JkLmFtb3VudCAhPSBudWxsICYmIHJlY29yZC5hbW91bnQgPj0gJHtMQVJHRV9ERUFMX0FNT1VOVH1gLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSBgbGFiZWxgIG5hbWVzIHdoYXQgdGhpcyBub2RlIGFjdHVhbGx5IGRvZXM6IGl0IG5vdGlmaWVzIHRoZSBvd25lclxuICAgICAgLy8gYW5kIG5vYm9keSBlbHNlLiBUaGUgYGlkYCBrZWVwcyBpdHMgb3JpZ2luYWwgYG5vdGlmeV9tYW5hZ2VtZW50YFxuICAgICAgLy8gc3BlbGxpbmcgb24gcHVycG9zZSBcdTIwMTQgYGVkZ2VzW11gIHJlZmVyZW5jZSBub2RlcyBieSBpZCwgc28gcmVuYW1pbmcgb25lXG4gICAgICAvLyBpcyBhIGJlaGF2aW91ciBjaGFuZ2UsIG5vdCBhIHdvcmRpbmcgZml4LlxuICAgICAgaWQ6ICdub3RpZnlfbWFuYWdlbWVudCcsIHR5cGU6ICdub3RpZnknLCBsYWJlbDogJ05vdGlmeSBPd25lcicsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgLy8gT3duZXIgb25seTogYHtyZWNvcmQub3duZXJfaWQubWFuYWdlcn1gIGNhbm5vdCB0cmF2ZXJzZSBhIGxvb2t1cCBvbiB0aGVcbiAgICAgICAgLy8gcmF3IHRyaWdnZXIgc25hcHNob3QgXHUyMDE0IGl0IGludGVycG9sYXRlcyB0byB0aGUgbGl0ZXJhbCBcInVuZGVmaW5lZFwiXG4gICAgICAgIC8vIGFuZCB0aGUgbWVzc2FnZSBpcyBkZWxpdmVyZWQgdG8gYSBwaGFudG9tIHVzZXIuXG4gICAgICAgIHJlY2lwaWVudHM6IFtjZWxgcmVjb3JkLm93bmVyX2lkYF0sXG4gICAgICAgIGNoYW5uZWxzOiBbJ2luYm94JywgJ2VtYWlsJ10sXG4gICAgICAgIHNldmVyaXR5OiAnaW5mbycsXG4gICAgICAgIHRvcGljOiAnbGFyZ2VfZGVhbF93b24nLFxuICAgICAgICB0ZW1wbGF0ZTogJ2NybS5sYXJnZV9kZWFsX3dvbicsXG4gICAgICAgIHRlbXBsYXRlRGF0YTogeyBuYW1lOiBjZWxgcmVjb3JkLm5hbWVgLCBhbW91bnQ6IGNlbGByZWNvcmQuYW1vdW50YCB9LFxuICAgICAgICBhY3Rpb25Vcmw6ICcvY3JtX29wcG9ydHVuaXR5L3t7cmVjb3JkLmlkfX0nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdub3RpZnlfbWFuYWdlbWVudCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ25vdGlmeV9tYW5hZ2VtZW50JywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3MvdGFzay11cmdlbnQtYWxlcnQuZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy90YXNrLXVyZ2VudC1hbGVydC5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogVXJnZW50IHRhc2sgYWxlcnQgXHUyMDE0IHJlY29yZC1jaGFuZ2UgZmxvdyBvbiB0YXNrIGluc2VydC5cbiAqXG4gKiBXaGVuIGFuIHVyZ2VudCwgbm90LXlldC1jb21wbGV0ZWQgdGFzayBpcyBjcmVhdGVkLCBub3RpZnkgaXRzIG93bmVyLlxuICovXG5leHBvcnQgY29uc3QgVGFza1VyZ2VudEFsZXJ0RmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ3Rhc2tfdXJnZW50X2FsZXJ0JyxcbiAgbGFiZWw6ICdVcmdlbnQgVGFzayBBbGVydCcsXG4gIGRlc2NyaXB0aW9uOiAnT24gbmV3IHVyZ2VudCB0YXNrOiBub3RpZnkgdGhlIG93bmVyLicsXG4gIHR5cGU6ICdyZWNvcmRfY2hhbmdlJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gQSByZWNvcmQtY2hhbmdlIGZsb3cgZmlyZWQgYnkgYSBTWVNURU0gd3JpdGUgY2FycmllcyBubyB0cmlnZ2VyIHVzZXJcbiAgLy8gZWl0aGVyIChBRFItMDA0OSksIGFuZCBtb3N0IHVyZ2VudCB0YXNrcyBpbiB0aGlzIGFwcCBhcmVcbiAgLy8gbWFjaGluZS13cml0dGVuOiBgY2FzZV9zdGF0dXNfc2lkZV9lZmZlY3RzYCBvcGVucyB0aGUgZXNjYWxhdGlvbiBmb2xsb3ctdXBcbiAgLy8gdGFzaywgYW5kIHRoZSBzY2hlZHVsZWQgc3dlZXBzIGNyZWF0ZSB0aGVpciBvd24gXHUyMDE0IG5vbmUgb2YgdGhvc2Ugd3JpdGVzXG4gIC8vIGNhcnJpZXMgYSBzZXNzaW9uLlxuICAvL1xuICAvLyBNZWFzdXJlZCBob25lc3RseSBvbiAxNy4wLjAtcmMuMjogdGhpcyBmbG93IGhhcyBOTyBkYXRhIG5vZGUgKHN0YXJ0IFx1MjE5MlxuICAvLyBub3RpZnkgXHUyMTkyIGVuZCksIHNvIHRoZSByZWZ1c2FsIGRvZXMgbm90IHJlYWNoIGl0IHRvZGF5IGFuZCBkZWNsYXJpbmdcbiAgLy8gYHN5c3RlbWAgY2hhbmdlcyBub3RoaW5nIG9ic2VydmFibGUuIERlY2xhcmVkIGZvciB0aGUgc2FtZSByZWFzb24gYXNcbiAgLy8gYGNvbnRhY3Rfd2VsY29tZWAgXHUyMDE0IHNlZSB0aGUgZnVsbGVyIG5vdGUgdGhlcmU6IHRoZSByZWNvcmRlZCBkZWNpc2lvbiBpc1xuICAvLyB0aGF0IHJlY29yZC1jaGFuZ2UgYXV0b21hdGlvbiBydW5zIGFzIHRoZSBwbGF0Zm9ybSwgc28gYSBkYXRhIG5vZGUgYWRkZWRcbiAgLy8gbGF0ZXIgaW5oZXJpdHMgYW4gZWxldmF0aW9uIHRoYXQgd2FzIHJlYXNvbmVkIGFib3V0IHJhdGhlciB0aGFuIG9uZVxuICAvLyBkaXNjb3ZlcmVkIGFzIGEgcHJvZHVjdGlvbiByZWZ1c2FsLiBObyBkYXRhIG9wZXJhdGlvbiBleGlzdHMgdG8gc2NvcGUsIHNvXG4gIC8vIGVsZXZhdGluZyB0aGUgdXNlci1kcml2ZW4gcnVucyBjb3N0cyBub3RoaW5nLlxuICBydW5BczogJ3N5c3RlbScsXG4gIHZhcmlhYmxlczogW10sXG4gIG5vZGVzOiBbXG4gICAge1xuICAgICAgaWQ6ICdzdGFydCcsIHR5cGU6ICdzdGFydCcsIGxhYmVsOiAnU3RhcnQgKHRhc2sgY3JlYXRlZCknLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fdGFzaycsXG4gICAgICAgIHRyaWdnZXJUeXBlOiAncmVjb3JkLWFmdGVyLWNyZWF0ZScsXG4gICAgICAgIC8vIEdhdGUgb24gdGhlIGBzdGF0dXNgIGVudW0sIG5vdCB0aGUgYGlzX2NvbXBsZXRlZGAgYm9vbGVhbjogb25cbiAgICAgICAgLy8gU1FMaXRlL2xpYnNxbCBib29sZWFucyBwZXJzaXN0IGFzIGludGVnZXIgMSwgc28gYGlzX2NvbXBsZXRlZCAhPSB0cnVlYFxuICAgICAgICAvLyBpcyBgMSAhPSB0cnVlYCA9IGFsd2F5cyB0cnVlIGFuZCB0aGUgZ3VhcmQgbmV2ZXIgdHJpcHMgKGNmLiB0aGUgc2FtZVxuICAgICAgICAvLyBoYXphcmQgZG9jdW1lbnRlZCBpbiBjYXNlX2VzY2FsYXRpb24pLlxuICAgICAgICAvLyBUT1RBTElUWTogYGhhcyguLi4pYCBvbiBldmVyeSByZWFkLiBCb3RoIGZpZWxkcyBhcmUgYHJlcXVpcmVkYFxuICAgICAgICAvLyBBTkQgZGVmYXVsdGVkIHRvZGF5LCBzbyB0aGlzIHByZWRpY2F0ZSBtZWFzdXJlZCB0b3RhbCBhcyBhdXRob3JlZCBcdTIwMTRcbiAgICAgICAgLy8gYnV0IHRoYXQgaXMgYSBwcm9wZXJ0eSBvZiBgY3JtX3Rhc2tgJ3Mgc2NoZW1hLCBub3Qgb2YgdGhlIHByZWRpY2F0ZS5cbiAgICAgICAgLy8gRHJvcCBlaXRoZXIgZGVmYXVsdCBhbmQgdGhlIGZsb3cgZ29lcyBzaWxlbnRseSBpbmVydCBvblxuICAgICAgICAvLyBkcml2ZXItbWVtb3J5IC8gZHJpdmVyLW1vbmdvZGIsIHdpdGggbm90aGluZyB0byBjYXRjaCBpdC4gQW4gYWJzZW50XG4gICAgICAgIC8vIGBzdGF0dXNgIGlzIG5vdCBgY29tcGxldGVkYCwgc28gaXQgbXVzdCBub3Qgc3VwcHJlc3MgdGhlIGFsZXJ0LlxuICAgICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5wcmlvcml0eSkgJiYgcmVjb3JkLnByaW9yaXR5ID09IFwidXJnZW50XCJcbiAgICAgICAgICAmJiAoIWhhcyhyZWNvcmQuc3RhdHVzKSB8fCByZWNvcmQuc3RhdHVzICE9IFwiY29tcGxldGVkXCIpYCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ25vdGlmeV9vd25lcicsIHR5cGU6ICdub3RpZnknLCBsYWJlbDogJ05vdGlmeSBPd25lcicsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgcmVjaXBpZW50czogW2NlbGByZWNvcmQub3duZXJfaWRgXSxcbiAgICAgICAgY2hhbm5lbHM6IFsnaW5ib3gnLCAnZW1haWwnXSxcbiAgICAgICAgc2V2ZXJpdHk6ICd3YXJuaW5nJyxcbiAgICAgICAgdG9waWM6ICd1cmdlbnRfdGFzaycsXG4gICAgICAgIHRlbXBsYXRlOiAnY3JtLnVyZ2VudF90YXNrJyxcbiAgICAgICAgdGVtcGxhdGVEYXRhOiB7IHN1YmplY3Q6IGNlbGByZWNvcmQuc3ViamVjdGAgfSxcbiAgICAgICAgYWN0aW9uVXJsOiAnL2NybV90YXNrL3t7cmVjb3JkLmlkfX0nLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdub3RpZnlfb3duZXInLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdub3RpZnlfb3duZXInLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy90YXNrLWR1ZS1yZW1pbmRlci5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2Zsb3dzL3Rhc2stZHVlLXJlbWluZGVyLmZsb3cudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGNlbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcbmltcG9ydCB7IGd1YXJkZWQgfSBmcm9tICcuL19ndWFyZGVkLWl0ZXJhdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogVGFzayBEdWUgUmVtaW5kZXIgXHUyMDE0IHNjaGVkdWxlZCB0aW1lLWJhc2VkIHJlbWluZGVycy5cbiAqXG4gKiBUaGUgdGFzayBzY2hlbWEgY2FycmllcyBgcmVtaW5kZXJfZGF0ZWAgKGFuZCBgZHVlX2RhdGVgKSwgYW5kIHRoZSBjYWxlbmRhciAvXG4gKiBnYW50dCB2aWV3cyAqZGlzcGxheSogdGhlbTsgdGhpcyBmbG93IGlzIHdoYXQgd2F0Y2hlcyB0aGUgY2xvY2suIEl0IHN3ZWVwc1xuICogdGFza3Mgd2hvc2UgYHJlbWluZGVyX2RhdGVgIGhhcyBhcnJpdmVkIChhbmQgdGhhdCBhcmUgc3RpbGwgb3BlbiBhbmQgbm90IHlldFxuICogcmVtaW5kZWQpLCBub3RpZmllcyB0aGUgb3duZXIgb24gdGhlIGluYm94ICsgZW1haWwgY2hhbm5lbHMsIGFuZCBzdGFtcHNcbiAqIGByZW1pbmRlcl9zZW50YCBzbyB0aGUgc2FtZSB0YXNrIGlzIG5ldmVyIGFsZXJ0ZWQgdHdpY2UuXG4gKlxuICogTWlycm9ycyBgY2FzZV9zbGFfbW9uaXRvcmAgKHNjaGVkdWxlZCB0cmlnZ2VyICsgZ2V0X3JlY29yZCArIGxvb3AgKyBub3RpZnkgK1xuICogdXBkYXRlX3JlY29yZCksIHdoaWNoIGlzIHRoZSBlc3RhYmxpc2hlZCBwYXR0ZXJuIGZvciB0aW1lLWJhc2VkIHN3ZWVwcyBoZXJlLlxuICpcbiAqL1xuZXhwb3J0IGNvbnN0IFRhc2tEdWVSZW1pbmRlckZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICd0YXNrX2R1ZV9yZW1pbmRlcicsXG4gIGxhYmVsOiAnVGFzayBEdWUgUmVtaW5kZXInLFxuICBkZXNjcmlwdGlvbjogJ0hvdXJseSBzd2VlcDogbm90aWZ5IG93bmVycyBvZiB0YXNrcyB3aG9zZSByZW1pbmRlciB0aW1lIGhhcyBhcnJpdmVkLicsXG4gIHR5cGU6ICdzY2hlZHVsZScsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG4gIC8vIFNjaGVkdWxlZCBydW5zIGhhdmUgbm8gdHJpZ2dlciB1c2VyLCBzbyB1bmRlciB0aGUgZGVmYXVsdCBydW5BczondXNlcicgdGhlXG4gIC8vIGRhdGEgbm9kZXMgZXhlY3V0ZSBVTlNDT1BFRCBhbnl3YXkuIERlY2xhcmUgcnVuQXM6J3N5c3RlbScgdG8gbWFrZSB0aGF0XG4gIC8vIFJMUy1ieXBhc3NpbmcgZWxldmF0aW9uIGV4cGxpY2l0IGFuZCBpbnRlbmRlZCAoQURSLTAwNDkpLlxuICBydW5BczogJ3N5c3RlbScsXG5cbiAgdmFyaWFibGVzOiBbXSxcblxuICBub2RlczogW1xuICAgIHtcbiAgICAgIGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0IChob3VybHkpJyxcbiAgICAgIGNvbmZpZzogeyBzY2hlZHVsZTogJzAgKiAqICogKicgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAncXVlcnlfZHVlJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0ZpbmQgVGFza3MgRHVlIGZvciBSZW1pbmRlcicsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV90YXNrJyxcbiAgICAgICAgLy8gRGUtZHVwIHZpYSBgcmVtaW5kZXJfZGF0ZWAgaXRzZWxmOiB0aGUgc3dlZXAgbm90aWZpZXMgdGFza3Mgd2hvc2VcbiAgICAgICAgLy8gcmVtaW5kZXIgdGltZSBoYXMgYXJyaXZlZCwgdGhlbiBDTEVBUlMgcmVtaW5kZXJfZGF0ZSAoc2VlIG1hcmtfc2VudCksXG4gICAgICAgIC8vIHNvIHRoZSByb3cgbm8gbG9uZ2VyIG1hdGNoZXMgYCRsdGVgIG5leHQgdGljay4gV2UgZG8gTk9UIGZpbHRlciBvbiB0aGVcbiAgICAgICAgLy8gYHJlbWluZGVyX3NlbnRgIGJvb2xlYW4gaGVyZSBcdTIwMTQgZW1waXJpY2FsbHksIGEgd2hlcmUtY2xhdXNlIG9uIHRoYXRcbiAgICAgICAgLy8gKG5ld2x5IGFkZGVkKSBib29sZWFuIGNvbHVtbiByZXR1cm5zIHplcm8gcm93cyBhdCBydW50aW1lIGluIHRoaXNcbiAgICAgICAgLy8gZW5naW5lIGJ1aWxkLCB3aGlsZSB0aGUgbG9uZy1zdGFuZGluZyBgaXNfY29tcGxldGVkYCBib29sZWFuIHdvcmtzLlxuICAgICAgICAvLyBSZXVzaW5nIHRoZSB2ZXJpZmllZCBgJGx0ZWAgKyBgaXNfY29tcGxldGVkYCBwcmVkaWNhdGVzIGtlZXBzIHRoZVxuICAgICAgICAvLyBzd2VlcCByZWxpYWJsZTsgYHJlbWluZGVyX3NlbnRgIGlzIHN0aWxsIHN0YW1wZWQgZm9yIHRoZSBhdWRpdCB0cmFpbC5cbiAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgaXNfY29tcGxldGVkOiBmYWxzZSxcbiAgICAgICAgICByZW1pbmRlcl9kYXRlOiB7ICRsdGU6IGNlbGBpc29EYXRldGltZShub3coKSlgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGxpbWl0OiA1MDAsXG4gICAgICAgIG91dHB1dFZhcmlhYmxlOiAncmVtaW5kZXJMaXN0JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBUaGUgbG9vcCBib2R5IE1VU1QgYmUgbmVzdGVkIGluIGBjb25maWcuYm9keWAgXHUyMDE0IGEgZmxhdC1ncmFwaCBsb29wXG4gICAgICAvLyAoYm9keSBvbWl0dGVkLCBpdGVyYXRvciB3aXJlZCB2aWEgb3V0ZXIgZWRnZXMpIGRvZXMgTk9UIGl0ZXJhdGUgb3IgYmluZFxuICAgICAgLy8gdGhlIGl0ZXJhdG9yIHZhcmlhYmxlIGluIHRoZSBydW50aW1lIChsZWdhY3kgbm8tb3AgcGF0aCksIHNvXG4gICAgICAvLyBge2N1cnJlbnRUYXNrLip9YCByZXNvbHZlcyBlbXB0eS4gVmVyaWZpZWQgZW1waXJpY2FsbHkuXG4gICAgICBpZDogJ2xvb3BfdGFza3MnLCB0eXBlOiAnbG9vcCcsIGxhYmVsOiAnRm9yIEVhY2ggRHVlIFRhc2snLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGNvbGxlY3Rpb246IGNlbGByZW1pbmRlckxpc3RgLFxuICAgICAgICBpdGVyYXRvclZhcmlhYmxlOiAnY3VycmVudFRhc2snLFxuICAgICAgICBib2R5OiBndWFyZGVkKCd0YXNrJywge1xuICAgICAgICAgIG5vZGVzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnbm90aWZ5X293bmVyJywgdHlwZTogJ25vdGlmeScsIGxhYmVsOiAnTm90aWZ5IE93bmVyJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgcmVjaXBpZW50czogW2NlbGBoYXMoY3VycmVudFRhc2sub3duZXJfaWQpID8gY3VycmVudFRhc2sub3duZXJfaWQgOiBudWxsYF0sXG4gICAgICAgICAgICAgICAgY2hhbm5lbHM6IFsnaW5ib3gnLCAnZW1haWwnXSxcbiAgICAgICAgICAgICAgICBzZXZlcml0eTogJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgIHRvcGljOiAndGFza19yZW1pbmRlcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6ICdjcm0udGFza19yZW1pbmRlcicsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVEYXRhOiB7XG4gICAgICAgICAgICAgICAgICBzdWJqZWN0OiBjZWxgY3VycmVudFRhc2suc3ViamVjdGAsIHJlbWluZGVyX2RhdGU6IGNlbGBjdXJyZW50VGFzay5yZW1pbmRlcl9kYXRlYCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFjdGlvblVybDogJy9jcm1fdGFzay97e2N1cnJlbnRUYXNrLmlkfX0nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWQ6ICdtYXJrX3NlbnQnLCB0eXBlOiAndXBkYXRlX3JlY29yZCcsIGxhYmVsOiAnTWFyayBSZW1pbmRlciBTZW50JyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV90YXNrJyxcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IHsgaWQ6IGNlbGBjdXJyZW50VGFzay5pZGAgfSxcbiAgICAgICAgICAgICAgICAvLyBDbGVhcmluZyByZW1pbmRlcl9kYXRlIGlzIHdoYXQgZGUtZHVwcyAodGhlIHJvdyBzdG9wcyBtYXRjaGluZ1xuICAgICAgICAgICAgICAgIC8vIHRoZSBzd2VlcCdzIGAkbHRlYCBuZXh0IHRpY2spOyByZW1pbmRlcl9zZW50IGlzIHRoZSBhdWRpdCBmbGFnLlxuICAgICAgICAgICAgICAgIGZpZWxkczogeyByZW1pbmRlcl9zZW50OiB0cnVlLCByZW1pbmRlcl9kYXRlOiBudWxsIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZWRnZXM6IFtcbiAgICAgICAgICAgIHsgaWQ6ICdiMScsIHNvdXJjZTogJ25vdGlmeV9vd25lcicsIHRhcmdldDogJ21hcmtfc2VudCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG5cbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ3F1ZXJ5X2R1ZScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ3F1ZXJ5X2R1ZScsIHRhcmdldDogJ2xvb3BfdGFza3MnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdsb29wX3Rhc2tzJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3MvYmlsbGluZy1oYW5kb2ZmLWNsb3NlZC13b24uZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9mbG93cy9iaWxsaW5nLWhhbmRvZmYtY2xvc2VkLXdvbi5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbmltcG9ydCB7XG4gIEJJTExJTkdfSEFORE9GRl9FTkRQT0lOVCxcbiAgQklMTElOR19IQU5ET0ZGX0VWRU5ULFxuICBCSUxMSU5HX0hBTkRPRkZfTElORV9JVEVNX0xJTUlULFxuICBCSUxMSU5HX0hBTkRPRkZfU0lHTklOR19TRUNSRVQsXG4gIEJJTExJTkdfSEFORE9GRl9USU1FT1VUX01TLFxuICBMSU5FX0lURU1fRklFTERTLFxuICBiaWxsaW5nQm9keSxcbiAgbG9hZEFjY291bnROb2RlLFxufSBmcm9tICcuL19iaWxsaW5nLWVuZHBvaW50JztcblxuLyoqXG4gKiBcdTI1NTBcdTI1NTBcdTI1NTAgQmlsbGluZyBoYW5kLW9mZiBcdTIwMTQgd2hlcmUgSG90Q1JNJ3MgcmV2ZW51ZSBzY29wZSBlbmRzIFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFxuICpcbiAqIEhvdENSTSBvd25zIGxlYWQgXHUyMTkyIGNvbnRyYWN0LiBJdCBkb2VzICoqbm90KiogbW9kZWwgT3JkZXJzLCBJbnZvaWNlcyBvclxuICogUGF5bWVudHMgKG1haW50YWluZXIgZGVjaXNpb24sIDIwMjYtMDgtMDIpOiBiaWxsaW5nIGlzIGFuIGV4dGVybmFsIHN5c3RlbSdzXG4gKiBqb2IuIFdoYXQgdGhlIENSTSBvd2VzIHRoYXQgc3lzdGVtIGlzIGEgcmVsaWFibGUgaGFuZC1vZmYsIGFuZCB0aGVzZSB0d29cbiAqIGZsb3dzIGFyZSBpdDpcbiAqXG4gKiAgIC0gYGJpbGxpbmdfaGFuZG9mZl9jbG9zZWRfd29uYCAgICAgICAgICBcdTIwMTQgYW4gb3Bwb3J0dW5pdHkgRU5URVJTIGBjbG9zZWRfd29uYFxuICogICAgICh0aGlzIGZpbGU7IGBjcm1fb3Bwb3J0dW5pdHlgIGlzIHRoZSBzYWxlcyBwYWNrYWdlJ3Mgb2JqZWN0KVxuICogICAtIGBiaWxsaW5nX2hhbmRvZmZfY29udHJhY3RfYWN0aXZhdGVkYCAgXHUyMDE0IGEgY29udHJhY3QgRU5URVJTIGBhY3RpdmF0ZWRgXG4gKiAgICAgKGBzcmMvcmV2ZW51ZS9mbG93cy9iaWxsaW5nLWhhbmRvZmYtY29udHJhY3QtYWN0aXZhdGVkLmZsb3cudHNgKVxuICpcbiAqIEVhY2ggUE9TVHMgb25lIEpTT04gZG9jdW1lbnQgXHUyMDE0IHRoZSByZWNvcmQsIGl0cyBhY2NvdW50LCBhbmQgaXRzIGxpbmUgaXRlbXMgXHUyMDE0XG4gKiB0byB7QGxpbmsgQklMTElOR19IQU5ET0ZGX0VORFBPSU5UfSwgdGhyb3VnaCB0aGUgcGxhdGZvcm0ncyAqKmR1cmFibGUgSFRUUFxuICogb3V0Ym94Kio6IHRoZSBgaHR0cGAgbm9kZSB3aXRoIGBkdXJhYmxlOiB0cnVlYCBjYWxsc1xuICogYG1lc3NhZ2luZy5lbnF1ZXVlSHR0cCh7IHNvdXJjZTogJ2Zsb3cnLCBcdTIwMjYgfSlgLCB3aGljaCBwZXJzaXN0cyBhXG4gKiBgc3lzX2h0dHBfZGVsaXZlcnlgIHJvdyB0aGF0IHRoZSBIVFRQIGRpc3BhdGNoZXIgZHJhaW5zIHdpdGggcmV0cnksIGJhY2tvZmZcbiAqIGFuZCBkZWFkLWxldHRlcmluZywgc2lnbmluZyB0aGUgYm9keSB3aXRoIEhNQUMtU0hBMjU2IHdoZW4gYSBzZWNyZXQgaXMgc2V0LlxuICogTm90aGluZyBoZXJlIGlzIGN1c3RvbSBwbHVtYmluZzsgaXQgaXMgdGhlIHBsYXRmb3JtJ3Mgb3duIG91dGJvdW5kLWNhbGxvdXRcbiAqIHZlcmIsIG9uIHRoZSBzYW1lIG91dGJveCB0aGUgZGVjbGFyYXRpdmUgYHdlYmhvb2tzYCBzdXJmYWNlIHVzZXMuXG4gKlxuICogIyMgXHUyNkQ0IERvIG5vdCByZS1leHByZXNzIHRoZXNlIGFzIGRlY2xhcmVkIGB3ZWJob29rc2BcbiAqXG4gKiBNZWFzdXJlZCBvbiAxNy4wLjAtcmMuNiwgdGhhdCBzdXJmYWNlIGNhbm5vdCBleHByZXNzIGVpdGhlciBldmVudDpcbiAqIGBXZWJob29rU2NoZW1hYCBpcyBgLnN0cmljdGAgYW5kIHJlamVjdHMgYGNvbmRpdGlvbmAgLyBgZmlsdGVyYCAvIGBib2R5YCAvXG4gKiBgcGF5bG9hZEZpZWxkc2AgLyBgcmV0cnlQb2xpY3lgOyBpdHMgYHRyaWdnZXJzYCB2b2NhYnVsYXJ5IGlzXG4gKiBgY3JlYXRlIC8gdXBkYXRlIC8gZGVsZXRlIC8gYnVsa18qYCB3aXRoIG5vIHRyYW5zaXRpb24gZm9ybTsgYW5kIHRoZVxuICogYXV0by1lbnF1ZXVlciBtYXRjaGVzIG9uIG9iamVjdCArIHRyaWdnZXIgYWxvbmUgYW5kIGRlbGl2ZXJzIGEgZml4ZWRcbiAqIGBEYXRhRXZlbnRgIGVudmVsb3BlIGNhcnJ5aW5nIG5laXRoZXIgdGhlIGFjY291bnQgbm9yIHRoZSBsaW5lIGl0ZW1zLiBBXG4gKiBgc3lzX3dlYmhvb2tgIHJvdyBuYW1lZCBmb3IgY2xvc2VkLXdvbiB3b3VsZCBmaXJlIG9uICpldmVyeSogb3Bwb3J0dW5pdHkgZWRpdFxuICogXHUyMDE0IGEgZGVjbGFyYXRpb24gdGhhdCBsaWVzIGFib3V0IGl0c2VsZiwgaW4gdGhlIGFwcCBvdGhlciBwZW9wbGUgY29weS5cbiAqIERpc3BhdGNoIHRoZXJlIGlzIGFkZGl0aW9uYWxseSBnYXRlZCBvbiB0aGUgYHJlYWx0aW1lYCBjYXBhYmlsaXR5LCB3aGljaCB0aGlzXG4gKiBhcHAgZG9lcyBub3QgcmVxdWlyZSwgc28gc3VjaCBhIHJvdyB3b3VsZCBiZSB2aXNpYmxlIGluIFNldHVwIGFuZCBuZXZlciBmaXJlXG4gKiBhdCBhbGwuXG4gKlxuICogVGhlIGNvc3Qgb2YgdGhpcyByb3V0ZSBpcyBzdGF0ZWQgaW4gYF9iaWxsaW5nLWVuZHBvaW50LnRzYCBhbmQgaW5cbiAqIGBjb250ZW50L2RvY3MvcmV2ZW51ZS9iaWxsaW5nLWhhbmRvZmYubWR4YDogdGhlIGVuZHBvaW50IGFuZCBzZWNyZXQgbGl2ZSBpblxuICogZmxvdyBtZXRhZGF0YSwgc28gcmVwb2ludGluZyB0aGVtIGlzIGEgcmVidWlsZCwgbm90IGEgU2V0dXAgZWRpdC5cbiAqXG4gKiAjIyBFeGFjdGx5IG9uY2UgcGVyIHRyYW5zaXRpb24sIG5vdCBvbmNlIHBlciBlZGl0XG4gKlxuICogXHUyNkQ0IEJvdGggc3RhcnQgY29uZGl0aW9ucyBtdXN0IHRlc3QgdGhlIFRSQU5TSVRJT05cbiAqIChgcmVjb3JkLnggPT0gdiAmJiBwcmV2aW91cy54ICE9IHZgKSwgbmV2ZXIgdGhlIGN1cnJlbnQgdmFsdWUuIFRoaXMgaXMgdGhlXG4gKiBpZGlvbSBgb3Bwb3J0dW5pdHlfd29uX2FsZXJ0YCB1c2VzIG9uIHRoaXMgdmVyeSBvYmplY3Q6IHdpdGhvdXQgdGhlXG4gKiBgcHJldmlvdXMuKmAgdGVybSwgZXZlcnkgbGF0ZXIgZWRpdCBvZiBhIHdvbiBkZWFsIFx1MjAxNCBhIHNlZWQtb3duZXJzaGlwXG4gKiBjbGFpbSwgYW4gYXBwcm92YWwgc3RhbXAsIGEgZGVzY3JpcHRpb24gdHdlYWsgXHUyMDE0IHJlLWZpcmVzIHRoZSBmbG93LiBGb3IgYVxuICogY29uZ3JhdHVsYXRpb25zIG5vdGlmaWNhdGlvbiB0aGF0IGlzIG5vaXNlOyBmb3IgYSBiaWxsaW5nIGhhbmQtb2ZmIGl0IGlzIGFcbiAqIGR1cGxpY2F0ZSBvcmRlci4gYHByZXZpb3VzLipgIGlzIGd1YXJkZWQgRkFJTC1DTE9TRUQgKGBoYXMocHJldmlvdXMueCkgJiZgKVxuICogZm9yIHRoZSBzYW1lIHJlYXNvbiBpdCBpcyB0aGVyZTogd2hlbiB0aGUgZW5naW5lIGNhbm5vdCBzZWUgdGhlIHByaW9yIHZhbHVlXG4gKiBpdCBjYW5ub3Qgc2VlIGEgdHJhbnNpdGlvbiBlaXRoZXIsIGFuZCBtdXN0IG5vdCBjbGFpbSBvbmUuIFRoZSBzaGFwZSB0aGF0XG4gKiBjb3ZlcnMgaXMgYSBidWxrIGB1cGRhdGVNYW55YCwgd2hlcmUgT2JqZWN0UUwgcmVhZHMgbm8gcHJpb3Igcm93IGFuZFxuICogYHByZXZpb3VzYCBhcnJpdmVzIG51bGwgXHUyMDE0IG9uZSBoYW5kLW9mZiBwZXIgcm93IG9mIGEgYnVsayB1cGRhdGUgaXMgZXhhY3RseVxuICogd2hhdCBub2JvZHkgd2FudHMuXG4gKlxuICogRGVsaXZlcnkgaXRzZWxmIGlzICoqYXQtbGVhc3Qtb25jZSoqOiB0aGUgb3V0Ym94IHJldHJpZXMgYSBmYWlsZWQgYXR0ZW1wdCxcbiAqIGFuZCBldmVyeSBhdHRlbXB0IG9mIG9uZSBlbnF1ZXVlZCByb3cgY2FycmllcyB0aGUgc2FtZSBgWC1PYmplY3RzdGFjay1EZWxpdmVyeWBcbiAqIGlkLiBSZWNlaXZlcnMgZGVkdXBlIG9uIHRoYXQgaGVhZGVyLlxuICpcbiAqICMjIFRvdGFsaXR5XG4gKlxuICogRXZlcnkgYHJlY29yZC4qYCAvIGBwcmV2aW91cy4qYCByZWFkIGJlbG93IGNhcnJpZXMgYSBgaGFzKC4uLilgIGd1YXJkIFx1MjAxNCB0aGVcbiAqIGhvdXNlIHJ1bGUgYHRlc3QvZmxvdy1jb25kaXRpb24tdG90YWxpdHkudGVzdC50c2AgZW5mb3JjZXMsIGJlY2F1c2UgYSBmbG93XG4gKiBjb25kaXRpb24gdGhhdCBhYm9ydHMgZmFpbHMgdGhlIHdob2xlIHJ1biByYXRoZXIgdGhhbiB5aWVsZGluZyBgZmFsc2VgLlxuICovXG5cbi8qKlxuICogXHUyNTAwXHUyNTAwIEV2ZW50IDE6IG9wcG9ydHVuaXR5IGVudGVycyBgY2xvc2VkX3dvbmAgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gKi9cbmV4cG9ydCBjb25zdCBCaWxsaW5nSGFuZG9mZkNsb3NlZFdvbkZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICdiaWxsaW5nX2hhbmRvZmZfY2xvc2VkX3dvbicsXG4gIGxhYmVsOiAnQmlsbGluZyBIYW5kLW9mZjogQ2xvc2VkIFdvbicsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdPbiB0aGUgdHJhbnNpdGlvbiBpbnRvIGNsb3NlZF93b246IFBPU1QgdGhlIGRlYWwsIGl0cyBhY2NvdW50IGFuZCBpdHMgbGluZSBpdGVtcyB0byB0aGUgYmlsbGluZyBlbmRwb2ludCB2aWEgdGhlIGR1cmFibGUgSFRUUCBvdXRib3guJyxcbiAgdHlwZTogJ3JlY29yZF9jaGFuZ2UnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBBIHJlY29yZC1jaGFuZ2UgZmxvdyBmaXJlZCBieSBhIFNZU1RFTSB3cml0ZSBjYXJyaWVzIG5vIHRyaWdnZXIgdXNlclxuICAvLyAoQURSLTAwNDkpLCBhbmQgb3Bwb3J0dW5pdGllcyByZWFjaCBgY2xvc2VkX3dvbmAgdGhyb3VnaFxuICAvLyBtYWNoaW5lcnkgYXMgd2VsbCBhcyBhIHJlcCdzIG93biBzYXZlIFx1MjAxNCBgbGVhZF9jb252ZXJzaW9uYCB3cml0ZXMgdGhlbSwgYW5kXG4gIC8vIHRoZSBgY29udHJhY3RfcmVuZXdhbGAgc3dlZXAgaXMgaXRzZWxmIGBydW5BczogJ3N5c3RlbSdgLiBUaGlzIGZsb3cgaGFzIHR3b1xuICAvLyBkYXRhIG5vZGVzLCBzbyB1bmRlciB0aGUgZGVmYXVsdCBgcnVuQXM6ICd1c2VyJ2AgdGhvc2UgcmVhZHMgd291bGQgYmVcbiAgLy8gUkVGVVNFRCBvbiBleGFjdGx5IHRob3NlIHJ1bnMgYW5kIHRoZSBoYW5kLW9mZiB3b3VsZCB2YW5pc2ggc2lsZW50bHkuIFRoZVxuICAvLyBoYW5kLW9mZiBtdXN0IGFsc28gc2VlIHRoZSBXSE9MRSBkZWFsLCBub3QgdGhlIHNsaWNlIHRoZSBjbG9zaW5nIHJlcCBtYXlcbiAgLy8gcmVhZDogYW4gUkxTLXNjb3BlZCBsaW5lLWl0ZW0gcXVlcnkgdGhhdCByZXR1cm5zIHRocmVlIG9mIGZpdmUgcm93cyB3b3VsZFxuICAvLyB1bmRlci1iaWxsIHRoZSBjdXN0b21lciB3aXRob3V0IGZhaWxpbmcgYW55dGhpbmcuXG4gIHJ1bkFzOiAnc3lzdGVtJyxcbiAgdmFyaWFibGVzOiBbXG4gICAgLy8gQm91bmQgd2l0aCBhIGRlZmF1bHQgc28gdGhlIHBheWxvYWQga2V5IGFsd2F5cyBleGlzdHMuIE5vdCBzdHJpY3RseVxuICAgIC8vIG5lZWRlZCBoZXJlICh0aGlzIGZsb3cgYWx3YXlzIHJ1bnMgdGhlIHJlYWQpIFx1MjAxNCBkZWNsYXJlZCBmb3Igc3ltbWV0cnkgd2l0aFxuICAgIC8vIHRoZSBjb250cmFjdCBmbG93LCB3aGVyZSB0aGUgcmVhZCBpcyBjb25kaXRpb25hbCwgc28gdGhlIHR3byBwYXlsb2Fkc1xuICAgIC8vIGNhbm5vdCBkcmlmdCBpbnRvIGRpZmZlcmVudCBzaGFwZXMgZm9yIGFuIGVtcHR5IGl0ZW0gbGlzdC5cbiAgICB7IG5hbWU6ICdiaWxsaW5nTGluZUl0ZW1zJywgdHlwZTogJ2NvbGxlY3Rpb24nLCBpc0lucHV0OiBmYWxzZSwgaXNPdXRwdXQ6IGZhbHNlLCBkZWZhdWx0VmFsdWU6IFtdIH0sXG4gIF0sXG4gIG5vZGVzOiBbXG4gICAge1xuICAgICAgaWQ6ICdzdGFydCcsXG4gICAgICB0eXBlOiAnc3RhcnQnLFxuICAgICAgbGFiZWw6ICdTdGFydCAob3Bwb3J0dW5pdHkgdXBkYXRlZCknLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgICB0cmlnZ2VyVHlwZTogJ3JlY29yZC1hZnRlci11cGRhdGUnLFxuICAgICAgICAvLyBUUkFOU0lUSU9OLCBub3QgY3VycmVudCB2YWx1ZSBcdTIwMTQgc2VlIHRoZSBmaWxlIGhlYWRlci4gYHByZXZpb3VzLnN0YWdlYFxuICAgICAgICAvLyBpcyBndWFyZGVkIGZhaWwtY2xvc2VkOiBubyB2aXNpYmxlIHByaW9yIHN0YWdlIG1lYW5zIG5vIHZpc2libGVcbiAgICAgICAgLy8gdHJhbnNpdGlvbiwgc28gbm8gaGFuZC1vZmYuXG4gICAgICAgIGNvbmRpdGlvbjogUGBoYXMocmVjb3JkLnN0YWdlKSAmJiByZWNvcmQuc3RhZ2UgPT0gXCJjbG9zZWRfd29uXCJcbiAgICAgICAgICAmJiBoYXMocHJldmlvdXMuc3RhZ2UpICYmIHByZXZpb3VzLnN0YWdlICE9IFwiY2xvc2VkX3dvblwiYCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsb2FkQWNjb3VudE5vZGUoKSxcbiAgICB7XG4gICAgICBpZDogJ2xvYWRfbGluZV9pdGVtcycsXG4gICAgICB0eXBlOiAnZ2V0X3JlY29yZCcsXG4gICAgICBsYWJlbDogJ0xvYWQgTGluZSBJdGVtcycsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eV9saW5lX2l0ZW0nLFxuICAgICAgICBmaWx0ZXI6IHsgY3JtX29wcG9ydHVuaXR5OiBjZWxgcmVjb3JkLmlkYCB9LFxuICAgICAgICBmaWVsZHM6IExJTkVfSVRFTV9GSUVMRFMsXG4gICAgICAgIC8vID4gMSBpcyB3aGF0IG1ha2VzIGBnZXRfcmVjb3JkYCBpc3N1ZSBhIGBmaW5kYCBhbmQgYmluZCBhbiBBUlJBWTtcbiAgICAgICAgLy8gb21pdCBpdCBhbmQgdGhlIG5vZGUgY2FsbHMgYGZpbmRPbmVgIGFuZCBiaW5kcyBhIHNpbmdsZSByb3cuXG4gICAgICAgIGxpbWl0OiBCSUxMSU5HX0hBTkRPRkZfTElORV9JVEVNX0xJTUlULFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2JpbGxpbmdMaW5lSXRlbXMnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSBub2RlIGlkIGJlY29tZXMgdGhlIGRlbGl2ZXJ5J3MgYFgtT2JqZWN0c3RhY2stRXZlbnRgIGhlYWRlclxuICAgICAgLy8gKGBmbG93Ojxub2RlSWQ+YCksIHNvIGl0IGlzIG5hbWVkIGZvciB0aGUgZXZlbnQgYW5kIG5vdCBmb3IgdGhlIHZlcmIuXG4gICAgICBpZDogJ3NlbmRfY2xvc2VkX3dvbl9oYW5kb2ZmJyxcbiAgICAgIHR5cGU6ICdodHRwJyxcbiAgICAgIGxhYmVsOiAnRW5xdWV1ZSBCaWxsaW5nIEhhbmQtb2ZmJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICB1cmw6IEJJTExJTkdfSEFORE9GRl9FTkRQT0lOVCxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIC8vIFRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIHJvdXRlOiBlbnF1ZXVlIG9uIGBzeXNfaHR0cF9kZWxpdmVyeWAgcmF0aGVyXG4gICAgICAgIC8vIHRoYW4gY2FsbCBpbmxpbmUsIHNvIGEgcmVjZWl2ZXIgdGhhdCBpcyBkb3duIGdldHMgdGhlIGRlbGl2ZXJ5IHdoZW5cbiAgICAgICAgLy8gaXQgY29tZXMgYmFjayBpbnN0ZWFkIG9mIGxvc2luZyBpdC5cbiAgICAgICAgZHVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdGltZW91dE1zOiBCSUxMSU5HX0hBTkRPRkZfVElNRU9VVF9NUyxcbiAgICAgICAgc2lnbmluZ1NlY3JldDogQklMTElOR19IQU5ET0ZGX1NJR05JTkdfU0VDUkVULFxuICAgICAgICAvLyBPbmUgZW52ZWxvcGUgYnVpbGRpbmcgdGhlIHdob2xlIHBheWxvYWQgKHNlZSBgYmlsbGluZ0JvZHlgKS4gRWFjaFxuICAgICAgICAvLyByZWFkIGlzIHRoZSB2YWx1ZSBpdHNlbGYsIG5ldmVyIGl0cyBzdHJpbmdpZmljYXRpb24sIHNvIHRoZSBhbW91bnRcbiAgICAgICAgLy8gc3RheXMgYSBudW1iZXIgYW5kIHRoZSBsaW5lIGl0ZW1zIGFuIGFycmF5LlxuICAgICAgICBib2R5OiBiaWxsaW5nQm9keShCSUxMSU5HX0hBTkRPRkZfRVZFTlQub3Bwb3J0dW5pdHlDbG9zZWRXb24sICdvcHBvcnR1bml0eScsIFtcbiAgICAgICAgICAnaWQnLCAnbmFtZScsICdhbW91bnQnLCAnY2xvc2VfZGF0ZScsICdzdGFnZScsICd0eXBlJywgWydhY2NvdW50X2lkJywgJ2NybV9hY2NvdW50J10sICdvd25lcl9pZCcsXG4gICAgICAgIF0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdsb2FkX2FjY291bnQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdsb2FkX2FjY291bnQnLCB0YXJnZXQ6ICdsb2FkX2xpbmVfaXRlbXMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdsb2FkX2xpbmVfaXRlbXMnLCB0YXJnZXQ6ICdzZW5kX2Nsb3NlZF93b25faGFuZG9mZicsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlNCcsIHNvdXJjZTogJ3NlbmRfY2xvc2VkX3dvbl9oYW5kb2ZmJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3MvX2JpbGxpbmctZW5kcG9pbnQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZmxvd3MvX2JpbGxpbmctZW5kcG9pbnQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGNlbCwgZXhwcmVzc2lvbiB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcblxuLyoqXG4gKiBCaWxsaW5nIGhhbmQtb2ZmIGNvbnRyYWN0IFx1MjAxNCB0aGUgT05FIHBsYWNlIHRoZSBvdXRib3VuZCB0YXJnZXQgYW5kIHRoZSBzaGFwZVxuICogb2Ygd2hhdCBpcyBzZW50IHRvIGl0IGxpdmUuXG4gKlxuICogSG90Q1JNJ3MgcmV2ZW51ZSBzY29wZSBlbmRzIGF0IHRoZSBzaWduZWQgY29udHJhY3QgKG1haW50YWluZXIgZGVjaXNpb24sXG4gKiAyMDI2LTA4LTAyKTogbm8gT3JkZXIgLyBJbnZvaWNlIC8gUGF5bWVudCBvYmplY3RzIGFyZSBtb2RlbGxlZCBoZXJlLiBXaGF0IHRoZVxuICogQ1JNIG93ZXMgdGhlIGJpbGxpbmcgc3lzdGVtIGlzIGEgKipyZWxpYWJsZSBoYW5kLW9mZioqIFx1MjAxNCB0d28gb3V0Ym91bmQgZXZlbnRzLFxuICogZGVsaXZlcmVkIG9uIHRoZSBwbGF0Zm9ybSdzIGR1cmFibGUgSFRUUCBvdXRib3guXG4gKlxuICogIyMgV2hlcmUgdGhlIGVuZHBvaW50IGxpdmVzLCBhbmQgd2h5IHRoYXQgaXMgYSBjb2RlIGNoYW5nZVxuICpcbiAqIFRoZXNlIGNvbnN0YW50cyBhcmUgcmVhZCBhdCAqKmJ1aWxkIHRpbWUqKiBieSB0aGUgdHdvIGBodHRwYCBub2RlcyBpblxuICogYGJpbGxpbmctaGFuZG9mZi5mbG93LnRzYCwgYW5kIGBvYmplY3RzdGFjayBidWlsZGAgYmFrZXMgdGhlaXIgdmFsdWVzIGludG8gdGhlXG4gKiBjb21waWxlZCBhcnRpZmFjdCdzIGZsb3cgbWV0YWRhdGEuIFRoZXJlIGlzIG5vIFNldHVwIHNjcmVlbiBmb3IgdGhlbS5cbiAqXG4gKiBUaGF0IGlzIGEgcmVhbCBjb3N0IG9mIHRoZSBtZWNoYW5pc20sIHN0YXRlZCByYXRoZXIgdGhhbiBidXJpZWQ6IHRoZVxuICogYWRtaW4tZWRpdGFibGUgYHdlYmhvb2tzYCBzdXJmYWNlIGNhbm5vdCBleHByZXNzIGVpdGhlciBvZiB0aGVzZSBldmVudHMsIHNvXG4gKiB0aGUgdHJhZGUgaXMgZXhhY3QgZXZlbnRzIHdpdGggYSBzaGFwZWQgcGF5bG9hZCBhdCB0aGUgcHJpY2Ugb2YgcmVwb2ludGluZ1xuICogYmVpbmcgYSByZWJ1aWxkLiBUaGUgbWVhc3VyZW1lbnRzIGJlaGluZCB0aGF0IGFyZSBpblxuICogYGJpbGxpbmctaGFuZG9mZi5mbG93LnRzYDsgYGNvbnRlbnQvZG9jcy9yZXZlbnVlL2JpbGxpbmctaGFuZG9mZi5tZHhgXG4gKiBkb2N1bWVudHMgdGhlIGNvc3QgcGxhaW5seSBpbnN0ZWFkIG9mIHRlYWNoaW5nIGEgU2V0dXAgc2NyZWVuIHRoYXQgZG9lcyBub3RcbiAqIGFwcGx5LlxuICpcbiAqICMjIE92ZXJyaWRpbmcgd2l0aG91dCBlZGl0aW5nIHRoaXMgZmlsZVxuICpcbiAqIEJvdGggdmFsdWVzIGFyZSByZWFkIGZyb20gdGhlIGVudmlyb25tZW50IGZpcnN0LCBzbyBhIGRlcGxveW1lbnQgY2FuIHNldCB0aGVtXG4gKiBpbiB0aGUgYnVpbGQgZW52aXJvbm1lbnQgcmF0aGVyIHRoYW4gcGF0Y2hpbmcgc291cmNlOlxuICpcbiAqICAgSE9UQ1JNX0JJTExJTkdfRU5EUE9JTlQ9aHR0cHM6Ly9iaWxsaW5nLmFjbWUuaW50ZXJuYWwvaG90Y3JtL2V2ZW50cyBcXFxuICogICBIT1RDUk1fQklMTElOR19TSUdOSU5HX1NFQ1JFVD1cdTIwMjYgXFxcbiAqICAgcG5wbSBidWlsZFxuICpcbiAqIFRoZSBzZWNyZXQgaXMgZGVsaWJlcmF0ZWx5IE5PVCBkZWZhdWx0ZWQgdG8gYSBsaXRlcmFsOiBhIGNvbW1pdHRlZCBITUFDIGtleVxuICogaW4gYSBwdWJsaWMgcmVmZXJlbmNlIGFwcCBpcyB3b3JzZSB0aGFuIGFuIHVuc2lnbmVkIGRlbGl2ZXJ5LCBhbmQgYW4gdW5zaWduZWRcbiAqIGRlbGl2ZXJ5IGlzIGF0IGxlYXN0IHZpc2libGUgKG5vIGBYLU9iamVjdHN0YWNrLVNpZ25hdHVyZWAgaGVhZGVyIG9uIHRoZVxuICogcmVxdWVzdCkgcmF0aGVyIHRoYW4gc2lsZW50bHkgdHJ1c3RlZC5cbiAqL1xuXG4vKipcbiAqIFdoZXJlIGJvdGggaGFuZC1vZmYgZXZlbnRzIGFyZSBQT1NUZWQuXG4gKlxuICogVGhlIGRlZmF1bHQgaXMgdGhlIFJGQyAyNjA2IGV4YW1wbGUgaG9zdCwgaS5lLiBkZWxpYmVyYXRlbHkgbm90IGEgcmVhbFxuICogcmVjZWl2ZXI6IGFuIHVudG91Y2hlZCBpbnN0YWxsIGVucXVldWVzIHRoZSBkZWxpdmVyeSwgcmV0cmllcyBpdCBvbiB0aGVcbiAqIHBsYXRmb3JtJ3MgYmFja29mZiBzY2hlZHVsZSwgYW5kIGxhbmRzIGl0IGluIGBzeXNfaHR0cF9kZWxpdmVyeWAgYXMgYGRlYWRgLlxuICogVGhhdCBpcyB0aGUgaG9uZXN0IGRlZmF1bHQgXHUyMDE0IHRoZSBoYW5kLW9mZiBpcyB3aXJlZCBhbmQgdmlzaWJseSB3YWl0aW5nIGZvciBhblxuICogZW5kcG9pbnQsIHJhdGhlciB0aGFuIHF1aWV0bHkgZG9pbmcgbm90aGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IEJJTExJTkdfSEFORE9GRl9FTkRQT0lOVCA9XG4gIHByb2Nlc3MuZW52LkhPVENSTV9CSUxMSU5HX0VORFBPSU5UPy50cmltKCkgfHwgJ2h0dHBzOi8vYmlsbGluZy5leGFtcGxlLmNvbS9ob3Rjcm0vZXZlbnRzJztcblxuLyoqXG4gKiBITUFDLVNIQTI1NiBzZWNyZXQgZm9yIHRoZSBgWC1PYmplY3RzdGFjay1TaWduYXR1cmVgIGhlYWRlci5cbiAqXG4gKiBgdW5kZWZpbmVkYCB3aGVuIHVuc2V0IFx1MjAxNCB0aGUgbWVzc2FnaW5nIHNlbmRlciBvbmx5IHNpZ25zIHdoZW4gYSBzZWNyZXQgaXNcbiAqIHByZXNlbnQsIGFuZCBhbiBlbXB0eSBzdHJpbmcgd291bGQgcmVhZCBhcyBcInNpZ25lZFwiIHRvIGFuIGF1dGhvciB3aGlsZVxuICogcHJvZHVjaW5nIG5vIGhlYWRlciBhdCBhbGwuXG4gKi9cbmV4cG9ydCBjb25zdCBCSUxMSU5HX0hBTkRPRkZfU0lHTklOR19TRUNSRVQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9XG4gIHByb2Nlc3MuZW52LkhPVENSTV9CSUxMSU5HX1NJR05JTkdfU0VDUkVUPy50cmltKCkgfHwgdW5kZWZpbmVkO1xuXG4vKiogUGVyLXJlcXVlc3QgdGltZW91dCBoYW5kZWQgdG8gdGhlIG91dGJveCBzZW5kZXIgKG1zKS4gKi9cbmV4cG9ydCBjb25zdCBCSUxMSU5HX0hBTkRPRkZfVElNRU9VVF9NUyA9IDMwXzAwMDtcblxuLyoqXG4gKiBFdmVudCBuYW1lcyBjYXJyaWVkIGluIHRoZSBwYXlsb2FkJ3MgYGV2ZW50YCBmaWVsZC5cbiAqXG4gKiBUaGUgcmVjZWl2ZXIgcm91dGVzIG9uIHRoaXMsIHNvIHRoZSBzdHJpbmdzIGFyZSBwYXJ0IG9mIHRoZSBjb250cmFjdCB3aXRoIHRoZVxuICogYmlsbGluZyBzeXN0ZW0gXHUyMDE0IGNoYW5naW5nIG9uZSBpcyBhIGJyZWFraW5nIGNoYW5nZSBmb3IgdGhlIGNvbnN1bWVyLCBub3QgYVxuICogcmVuYW1lLlxuICovXG5leHBvcnQgY29uc3QgQklMTElOR19IQU5ET0ZGX0VWRU5UID0ge1xuICBvcHBvcnR1bml0eUNsb3NlZFdvbjogJ2NybS5vcHBvcnR1bml0eS5jbG9zZWRfd29uJyxcbiAgY29udHJhY3RBY3RpdmF0ZWQ6ICdjcm0uY29udHJhY3QuYWN0aXZhdGVkJyxcbn0gYXMgY29uc3Q7XG5cbi8qKiBQYXlsb2FkIGNvbnRyYWN0IHZlcnNpb24gXHUyMDE0IGJ1bXBlZCB3aGVuIHRoZSBib2R5IHNoYXBlIGNoYW5nZXMgc2hhcGUuICovXG5leHBvcnQgY29uc3QgQklMTElOR19IQU5ET0ZGX1BBWUxPQURfVkVSU0lPTiA9IDE7XG5cbi8qKiBMaW5lIGl0ZW1zIHJlYWQgcGVyIGhhbmQtb2ZmLiBEZWFscyBpbiB0aGlzIGFwcCB0b3Agb3V0IHdlbGwgYmVsb3cgaXQuICovXG5leHBvcnQgY29uc3QgQklMTElOR19IQU5ET0ZGX0xJTkVfSVRFTV9MSU1JVCA9IDIwMDtcblxuLypcbiAqIFx1MjUwMFx1MjUwMFx1MjUwMCBUaGUgcGF5bG9hZCBoYWx2ZXMgYm90aCBoYW5kLW9mZiBldmVudHMgc2hhcmUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gKlxuICogVGhlc2Ugc2F0IGluIGBiaWxsaW5nLWhhbmRvZmYuZmxvdy50c2Agd2hpbGUgYm90aCBmbG93cyBsaXZlZCBpbiBvbmUgZmlsZS5cbiAqIFRoZSBBRFItMDEzMCBsYXlvdXQgcHV0cyBhIGZsb3cgd2l0aCBpdHMgdHJpZ2dlciBvYmplY3QsIGFuZCB0aGUgdHdvIGV2ZW50c1xuICogdHJpZ2dlciBvbiBvYmplY3RzIGluIGRpZmZlcmVudCBwYWNrYWdlcyBcdTIwMTQgYGNybV9vcHBvcnR1bml0eWAgaXMgc2FsZXMnLFxuICogYGNybV9jb250cmFjdGAgaXMgcmV2ZW51ZSdzIFx1MjAxNCBzbyB0aGUgZmxvd3MgYXJlIG5vd1xuICogYHNyYy9zYWxlcy9mbG93cy9iaWxsaW5nLWhhbmRvZmYtY2xvc2VkLXdvbi5mbG93LnRzYCBhbmRcbiAqIGBzcmMvcmV2ZW51ZS9mbG93cy9iaWxsaW5nLWhhbmRvZmYtY29udHJhY3QtYWN0aXZhdGVkLmZsb3cudHNgLiBUaGUgc2hhcmVkXG4gKiBoYWxmIG1vdmVkIEhFUkUgcmF0aGVyIHRoYW4gYmVpbmcgY29waWVkIGludG8gZWFjaDogaXQgaXMgdGhlIHNhbWUgY29udHJhY3RcbiAqIHdpdGggdGhlIHNhbWUgcmVjZWl2ZXIsIGFuZCB0d28gY29waWVzIG9mIGEgY29udHJhY3QgaXMgaG93IGEgcmVjZWl2ZXIgZW5kc1xuICogdXAgd2l0aCB0d28gc2hhcGVzLiBSZXZlbnVlIHJlYWRzIGl0IGFsb25nIHRoZSByZXZlbnVlIC0+IHNhbGVzIGVkZ2UsIHRoZVxuICogb25lIGRpcmVjdGlvbiBBRFItMDEzMCBhbGxvd3MuXG4gKi9cblxuLyoqIEFjY291bnQgZmllbGRzIHRoZSBiaWxsaW5nIHN5c3RlbSBuZWVkcyB0byBvcGVuIGEgY3VzdG9tZXIuICovXG5leHBvcnQgY29uc3QgQUNDT1VOVF9GSUVMRFMgPSBbXG4gICdpZCcsXG4gICduYW1lJyxcbiAgJ2FjY291bnRfbnVtYmVyJyxcbiAgJ2JpbGxpbmdfYWRkcmVzcycsXG4gICdiaWxsaW5nX2NvdW50cnknLFxuICAncGhvbmUnLFxuICAnd2Vic2l0ZScsXG5dO1xuXG4vKiogTGluZS1pdGVtIGZpZWxkcyB0aGF0IHByaWNlIGEgaGFuZC1vZmYuIGB0b3RhbF9wcmljZWAgaXMgdGhlIGZvcm11bGEgdG90YWwuICovXG5leHBvcnQgY29uc3QgTElORV9JVEVNX0ZJRUxEUyA9IFtcbiAgJ2lkJyxcbiAgJ2xpbmVfbnVtYmVyJyxcbiAgJ2NybV9wcm9kdWN0JyxcbiAgJ2Rlc2NyaXB0aW9uJyxcbiAgJ3F1YW50aXR5JyxcbiAgJ2xpc3RfcHJpY2UnLFxuICAndW5pdF9wcmljZScsXG4gICdkaXNjb3VudCcsXG4gICd0b3RhbF9wcmljZScsXG5dO1xuXG4vKiogQW4gb3B0aW9uYWwgY29sdW1uIG9mIHRoZSBhY2NvdW50IHJvdywgcmVhZCBhcyBgbnVsbGAgd2hlcmUgdGhlIHJvdyBsYWNrcyBpdC4gKi9cbmNvbnN0IGFjY291bnRGaWVsZCA9IChmaWVsZDogc3RyaW5nKSA9PiBgaGFzKGJpbGxpbmdBY2NvdW50LiR7ZmllbGR9KSA/IGJpbGxpbmdBY2NvdW50LiR7ZmllbGR9IDogbnVsbGA7XG5cbi8qKlxuICogVGhlIGFjY291bnQgYmxvY2ssIHNoYXJlZCBieSBib3RoIHBheWxvYWRzOiBhIENFTCBtYXAgbGl0ZXJhbCBvdmVyIHRoZVxuICogYGJpbGxpbmdBY2NvdW50YCByb3cge0BsaW5rIGxvYWRBY2NvdW50Tm9kZX0gYmluZHMsIHNwbGljZWQgaW50byBlYWNoIGJvZHkgYnlcbiAqIHtAbGluayBiaWxsaW5nQm9keX0uXG4gKlxuICogQXV0aG9yZWQgZmllbGQtYnktZmllbGQgcmF0aGVyIHRoYW4gcGFzc2luZyB0aGUgcm93IHdob2xlOiB0aGlzIG9iamVjdCBJUyB0aGVcbiAqIGNvbnRyYWN0IHdpdGggdGhlIGJpbGxpbmcgc3lzdGVtLCBzbyBpdCBtdXN0IG5vdCBzaWxlbnRseSBncm93IGEgY29sdW1uIHRoZVxuICogZGF5IHNvbWVvbmUgYWRkcyBhIGZpZWxkIHRvIGBjcm1fYWNjb3VudGAuXG4gKlxuICogYG5hbWVgIGlzIHJlcXVpcmVkIGFuZCBgYWNjb3VudF9udW1iZXJgIGFuIGF1dG9udW1iZXIsIHNvIGJvdGggYXJlIHJlYWRcbiAqIGJhcmUuIFRoZSBvdGhlciBmb3VyIGFyZSBvcHRpb25hbCwgYW5kIGEgc3BhcnNlIGRyaXZlciAobWVtb3J5LCBtb25nb2RiKVxuICogaGFuZHMgYmFjayBhIGNvbHVtbiB0aGUgcm93IHdhcyBuZXZlciB3cml0dGVuIHdpdGggQUJTRU5ULCB3aGljaCBDRUwgcmVmdXNlcyxcbiAqIHNvIGVhY2ggaXMgZ3VhcmRlZCB0byBgbnVsbGAuIFRoZSAxNy54IHRlbXBsYXRlIGRyb3BwZWQgc3VjaCBhIGtleSBmcm9tIHRoZVxuICogSlNPTiBpbnN0ZWFkOyBvbiB0aGUgU1FMIGRyaXZlcnMgdGhlIGNvbHVtbiBpcyBhbHdheXMgcHJlc2VudCBhbmQgdGhlIHR3b1xuICogYWdyZWUuXG4gKi9cbmV4cG9ydCBjb25zdCBBQ0NPVU5UX0JMT0NLID1cbiAgYHsnaWQnOiBiaWxsaW5nQWNjb3VudC5pZCwgJ25hbWUnOiBiaWxsaW5nQWNjb3VudC5uYW1lLCAnYWNjb3VudF9udW1iZXInOiBiaWxsaW5nQWNjb3VudC5hY2NvdW50X251bWJlciwgYCArXG4gIGAnYmlsbGluZ19hZGRyZXNzJzogJHthY2NvdW50RmllbGQoJ2JpbGxpbmdfYWRkcmVzcycpfSwgJ2JpbGxpbmdfY291bnRyeSc6ICR7YWNjb3VudEZpZWxkKCdiaWxsaW5nX2NvdW50cnknKX0sIGAgK1xuICBgJ3Bob25lJzogJHthY2NvdW50RmllbGQoJ3Bob25lJyl9LCAnd2Vic2l0ZSc6ICR7YWNjb3VudEZpZWxkKCd3ZWJzaXRlJyl9fWA7XG5cbi8qKlxuICogVGhlIGh0dHAgYGJvZHlgIG9mIGJvdGggaGFuZC1vZmZzOiBPTkUgQ0VMIHZhbHVlIGVudmVsb3BlIGJ1aWxkaW5nIHRoZSB3aG9sZVxuICogcGF5bG9hZC4gYGtleWAgbmFtZXMgdGhlIHJlY29yZCdzIG93biBibG9jaywgYW5kIGBmaWVsZHNgIGxpc3RzIHdoYXQgaXRcbiAqIGNhcnJpZXMsIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSB0cmlnZ2VyaW5nIGByZWNvcmRgOiBhIGZpZWxkIHVuZGVyIGl0cyBvd25cbiAqIG5hbWUsIG9yIGBba2V5LCBmaWVsZF1gIHdoZXJlIHRoZSBwYXlsb2FkIG5hbWVzIGl0IGRpZmZlcmVudGx5LiBgcmVjb3JkYCBpc1xuICogdGhlIHJlY29yZC1jaGFuZ2UgdHJpZ2dlcidzLCB3aGljaCBoYW5kcyB0aGUgcnVuIGV2ZXJ5IGRlY2xhcmVkIGZpZWxkIChudWxsXG4gKiB3aGVyZSB1bnNldCksIHNvIHRoZXNlIHJlYWRzIHRha2Ugbm8gZ3VhcmQuXG4gKlxuICogU2luY2UgMTguMC4wLW5leHQuMCBhbiBodHRwIGJvZHkgaXMgb25lIHZhbHVlLCBldmFsdWF0ZWQgb25jZSBiZWZvcmUgdGhlXG4gKiBjYWxsLCBzbyB0aGUgZHVyYWJsZSBvdXRib3ggZW5xdWV1ZXMgZXhhY3RseSB3aGF0IGFuIGlubGluZSBjYWxsIHdvdWxkIHNlbmQuXG4gKiBBIGB7XHUyMDI2fWAgdG9rZW4gaW4gYSBuZXN0ZWQgc3RyaW5nIGlzIHJlZnVzZWQgdGhlcmUsIGFuZCBhbiBlbnZlbG9wZSBuZXN0ZWQgaW5cbiAqIGEgbGl0ZXJhbCBvYmplY3Qgd291bGQgYmUgc2VudCBhcyB0aGUgb2JqZWN0IGl0IHNwZWxscyBcdTIwMTQgc28gdGhlIHBheWxvYWQgaXNcbiAqIGJ1aWx0IGJ5IG9uZSBlbnZlbG9wZSwgbm90IGJ5IGEgbGl0ZXJhbCB3aXRoIGVudmVsb3BlcyBpbnNpZGUgaXQuIENFTCBob2xkcyBhXG4gKiBtYXAncyB2YWx1ZXMgdG8gb25lIHR5cGUsIHNvIGVhY2ggbGl0ZXJhbCBhbmQgZWFjaCBuZXN0ZWQgbWFwIGlzIHdyYXBwZWQgaW5cbiAqIGBkeW4oKWAuIGBiaWxsaW5nTGluZUl0ZW1zYCBpcyBhIHZhcmlhYmxlIHJlYWQgYW5kIGFscmVhZHkgZHluYW1pYy5cbiAqL1xuZXhwb3J0IGNvbnN0IGJpbGxpbmdCb2R5ID0gKGV2ZW50OiBzdHJpbmcsIGtleTogc3RyaW5nLCBmaWVsZHM6IChzdHJpbmcgfCBbc3RyaW5nLCBzdHJpbmddKVtdKSA9PlxuICBleHByZXNzaW9uKFxuICAgIGB7J2V2ZW50JzogZHluKCcke2V2ZW50fScpLCAndmVyc2lvbic6IGR5bigke0JJTExJTkdfSEFORE9GRl9QQVlMT0FEX1ZFUlNJT059KSwgYCArXG4gICAgICBgJ29jY3VycmVkX2F0JzogZHluKGlzb0RhdGV0aW1lKG5vdygpKSksIGAgK1xuICAgICAgYCcke2tleX0nOiBkeW4oeyR7ZmllbGRzLm1hcCgoZikgPT4gKHR5cGVvZiBmID09PSAnc3RyaW5nJyA/IFtmLCBmXSA6IGYpKS5tYXAoKFtrLCBmXSkgPT4gYCcke2t9JzogcmVjb3JkLiR7Zn1gKS5qb2luKCcsICcpfX0pLCBgICtcbiAgICAgIGAnYWNjb3VudCc6IGR5bigke0FDQ09VTlRfQkxPQ0t9KSwgJ2xpbmVfaXRlbXMnOiBiaWxsaW5nTGluZUl0ZW1zfWAsXG4gICk7XG5cbi8qKlxuICogUmVhZCB0aGUgYWNjb3VudCBuYW1lZCBieSB0aGUgdHJpZ2dlcmluZyByZWNvcmQuXG4gKlxuICogYGNybV9hY2NvdW50YCBpcyBgcmVxdWlyZWRgICsgYHN0b3JhZ2Uubm90TnVsbGAgb24gYm90aCBgY3JtX29wcG9ydHVuaXR5YCBhbmRcbiAqIGBjcm1fY29udHJhY3RgLCBzbyB0aGUgdmFsdWUgaXMgYWx3YXlzIHRoZXJlIG9uIGEgcmVhbCByb3cuIExlZnQgVU5HVUFSREVEIG9uXG4gKiBwdXJwb3NlOiBpZiBpdCB3ZXJlIGV2ZXIgYWJzZW50LCB0aGUgZW52ZWxvcGUgZmFpbHMgdGhlIHJ1biBsb3VkbHkgaW4gU3R1ZGlvJ3NcbiAqIEZsb3cgUnVucyBwYWdlLiBGb3IgYSByZXF1aXJlZCBmaWVsZCB0aGF0IGlzIHRoZSByaWdodCBmYWlsdXJlIFx1MjAxNCBhIHNpbGVudCBza2lwXG4gKiB3b3VsZCBkcm9wIGEgaGFuZC1vZmYgd2l0aCBubyB0cmFjZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRBY2NvdW50Tm9kZSA9ICgpOiBBdXRvbWF0aW9uLkZsb3dOb2RlID0+ICh7XG4gIGlkOiAnbG9hZF9hY2NvdW50JyxcbiAgdHlwZTogJ2dldF9yZWNvcmQnLFxuICBsYWJlbDogJ0xvYWQgQWNjb3VudCcsXG4gIGNvbmZpZzoge1xuICAgIG9iamVjdE5hbWU6ICdjcm1fYWNjb3VudCcsXG4gICAgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkLmNybV9hY2NvdW50YCB9LFxuICAgIGZpZWxkczogQUNDT1VOVF9GSUVMRFMsXG4gICAgLy8gTm8gYGxpbWl0YDogYGdldF9yZWNvcmRgIGNhbGxzIGBmaW5kT25lYCBiZWxvdyAyIGFuZCBiaW5kcyB0aGUgc2luZ2xlIHJvd1xuICAgIC8vIGl0c2VsZiwgd2hpY2ggaXMgd2hhdCB0aGUgYWNjb3VudCBibG9jaydzIGBiaWxsaW5nQWNjb3VudC5GSUVMRGAgcmVhZHMgbmVlZC5cbiAgICBvdXRwdXRWYXJpYWJsZTogJ2JpbGxpbmdBY2NvdW50JyxcbiAgfSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9mbG93cy9xdW90ZS1nZW5lcmF0aW9uLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2Zsb3dzL3F1b3RlLWdlbmVyYXRpb24uZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUCwgZXhwcmVzc2lvbiwgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xuaW1wb3J0IHsgUVVPVEVfRElTQ09VTlRfQ0VJTElORyB9IGZyb20gJy4uLy4uL3NhbGVzL29iamVjdHMvX3RocmVzaG9sZHMnO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIFRoZSBzY3JlZW4ncyBkaXNjb3VudCBhcyBhIENFTCBkb3VibGUsIDAgd2hlbiB0aGUgcmVwIGNsZWFyZWQgdGhlIGJveC4gQVxuICogc291cmNlIEZSQUdNRU5ULCBzcGxpY2VkIGludG8gYm90aCBwcmljaW5nIGVudmVsb3BlcyB3aXRoIGBleHByZXNzaW9uKClgOlxuICogdGhlIGBQYCB0YWcgSlNPTi1xdW90ZXMgYW4gaW50ZXJwb2xhdGVkIHN0cmluZywgc28gaXQgY2Fubm90IHNwbGljZSBvbmUuXG4gKi9cbmNvbnN0IERJU0NPVU5UID0gJyghaGFzKHZhcnMuZGlzY291bnQpIHx8IGlzQmxhbmsodmFycy5kaXNjb3VudCkgPyAwLjAgOiBkb3VibGUodmFycy5kaXNjb3VudCkpJztcblxuLyoqXG4gKiBFZGdlIGBlNGFgJ3MgcHJlZGljYXRlIFx1MjAxNCBhZHZhbmNlIHRoZSBkZWFsIHRvIGBwcm9wb3NhbGAuIEEgc291cmNlIEZSQUdNRU5UXG4gKiBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIGBESVNDT1VOVGA6IGVkZ2UgYGU0YmAgaXMgaXRzIGV4YWN0IG5lZ2F0aW9uLFxuICogc3BsaWNlZCBhcyBgIShcdTIwMjYpYCwgc28gdGhlIHR3byBicmFuY2hlcyBwYXJ0aXRpb24gYnkgY29uc3RydWN0aW9uIHJhdGhlclxuICogdGhhbiBieSBhIGhhbmQta2VwdCBEZSBNb3JnYW4gY29weSAodGhlIHJhdGlvbmFsZSBpcyBvbiB0aGUgZWRnZXMpLlxuICovXG5jb25zdCBBRFZBTkNFID0gYGhhcyh2YXJzLm9wcFJlY29yZCkgJiYgaGFzKHZhcnMub3BwUmVjb3JkLnN0YWdlKVxuICAmJiAodmFycy5vcHBSZWNvcmQuc3RhZ2UgPT0gXCJwcm9zcGVjdGluZ1wiIHx8IHZhcnMub3BwUmVjb3JkLnN0YWdlID09IFwicXVhbGlmaWNhdGlvblwiIHx8IHZhcnMub3BwUmVjb3JkLnN0YWdlID09IFwibmVlZHNfYW5hbHlzaXNcIilcbiAgJiYgKCFoYXModmFycy5vcHBSZWNvcmQuYXBwcm92YWxfc3RhdHVzKSB8fCB2YXJzLm9wcFJlY29yZC5hcHByb3ZhbF9zdGF0dXMgIT0gXCJwZW5kaW5nXCIpYDtcblxuLyoqIFF1b3RlIEdlbmVyYXRpb24gXHUyMDE0IHNjcmVlbiBmbG93IHRvIGNyZWF0ZSBhIHF1b3RlIGZyb20gYW4gb3Bwb3J0dW5pdHkgKi9cbmV4cG9ydCBjb25zdCBRdW90ZUdlbmVyYXRpb25GbG93OiBGbG93ID0ge1xuICBuYW1lOiAncXVvdGVfZ2VuZXJhdGlvbicsXG4gIGxhYmVsOiAnR2VuZXJhdGUgUXVvdGUgZnJvbSBPcHBvcnR1bml0eScsXG4gIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGEgcXVvdGUgYmFzZWQgb24gb3Bwb3J0dW5pdHkgZGV0YWlscycsXG4gIHR5cGU6ICdzY3JlZW4nLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuXG4gIHZhcmlhYmxlczogW1xuICAgIC8vIE1VU1QgYmUgYHJlY29yZElkYCBcdTIwMTQgdGhlIGNvbnNvbGUncyBmbG93LWFjdGlvbiB0cmlnZ2VyIGNvbnRyYWN0IHNlZWRzXG4gICAgLy8gb25seSB0aGF0IG5hbWUgKHsgcmVjb3JkSWQsIG9iamVjdE5hbWUgfSk7IGEgY3VzdG9tIG5hbWUgbGlrZVxuICAgIC8vIGBvcHBvcnR1bml0eUlkYCBhcnJpdmVzIHVuZGVmaW5lZC5cbiAgICB7IG5hbWU6ICdyZWNvcmRJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAncXVvdGVOYW1lJywgdHlwZTogJ3RleHQnLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgICB7IG5hbWU6ICdleHBpcmF0aW9uRGF5cycsIHR5cGU6ICdudW1iZXInLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgICB7IG5hbWU6ICdkaXNjb3VudCcsIHR5cGU6ICdudW1iZXInLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgXSxcblxuICBub2RlczogW1xuICAgIHsgaWQ6ICdzdGFydCcsIHR5cGU6ICdzdGFydCcsIGxhYmVsOiAnU3RhcnQnLCBjb25maWc6IHsgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScgfSB9LFxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBUaGUgXHU3QUNCXHU5ODc5IChxdWFsaWZpY2F0aW9uKSBnYXRlLCBSRVEtMDAwNiBzdGVwIDExICgjMjAzMikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBcdTMwMENcdTY1QjBcdTU4OUVcdTU1NDZcdTY3M0FcdTUzRUZcdThEREZcdThGREJcdUZGMENcdTdBQ0JcdTk4NzlcdTkwMUFcdThGQzdcdTU0MEVcdTY1QjlcdTUzRUZcdTY2RjRcdTY1QjBcdTk2MzZcdTZCQjVcdTMwMDFcdTYyOTVcdTY4MDdcdTMwMDFcdThENjJcdTRFMjJcdTUzNTVcdTY0Q0RcdTRGNUNcdTMwMDJcdTMwMEQgUnVsZWQgKGhvdGNybS1SNzRiXG4gICAgLy8gaXRlbSAyLCBCKTogYmVmb3JlIFx1N0FDQlx1OTg3OSBpcyBhcHByb3ZlZCwgR2VuZXJhdGUgUXVvdGUgUkVGVVNFUyBhbmQgY3JlYXRlc1xuICAgIC8vIG5vdGhpbmcuIFN0ZXBzIDE1IGFuZCAxOCBwdXQgcXVvdGluZyBhZnRlciB0aGUgZGVhbCdzIGFwcHJvdmFsIHRvby5cbiAgICAvL1xuICAgIC8vIFdoeSB0aGUgcmVmdXNhbCBpcyBIRVJFLCBhaGVhZCBvZiB0aGUgZm9ybSBhbmQgb2YgZXZlcnkgd3JpdGVyOiB0aGlzXG4gICAgLy8gZmxvdyB3cml0ZXMgdGhlIHF1b3RlIEJFRk9SRSB0aGUgc3RhZ2UsIGFuZCBhIGZsb3cgY2FycmllcyBub1xuICAgIC8vIHRyYW5zYWN0aW9uIChBRFItMDA3NykuIFdpdGggdGhlIGdhdGUgYXJtZWQsIGBvcHBvcnR1bml0eV9saWZlY3ljbGVgXG4gICAgLy8gcmVmdXNlcyB0aGUgYHVwZGF0ZV9vcHBvcnR1bml0eWAgc3RhZ2Ugd3JpdGUgXHUyMDE0IHNvIHRoZSBydW4gdXNlZCB0byBmYWlsXG4gICAgLy8gQUZURVIgYGNyZWF0ZV9xdW90ZWAgaGFkIGxhbmRlZDogbWVhc3VyZWQgb24gMTcuNy4wIGFzIGEgc2FsZXNfcmVwLFxuICAgIC8vIGBGTE9XX0ZBSUxFRGAgNDAwIGF0IGB1cGRhdGVfb3Bwb3J0dW5pdHlgIChcIlRoaXMgZGVhbCBuZWVkc1xuICAgIC8vIHF1YWxpZmljYXRpb24gYXBwcm92YWwgZmlyc3QgXHUyMDI2XCIpLCBvbmUgZHJhZnQgcXVvdGUgbGVmdCBiZWhpbmQsIHRoZVxuICAgIC8vIHN0YWdlIHVuY2hhbmdlZC4gXHUyNkQ0IE5vdCAjMjAxNSdzIGtlZXAtc3RhZ2UtYW5kLXF1b3RlOiB0aGF0IGxvY2sgZG9lc1xuICAgIC8vIG5vdCBob2xkIHF1b3RpbmcsIHRoaXMgZ2F0ZSBkb2VzLlxuICAgIC8vXG4gICAgLy8gVGhlIGZsb3cgaXMgdGhlIG9uZSBjaG9rZSBwb2ludCBldmVyeSBkb29yIHJlYWNoZXMgXHUyMDE0IHRoZSByZWNvcmQtaGVhZGVyXG4gICAgLy8gYW5kIGxpc3Qtcm93IGJ1dHRvbnMgYW5kIGBQT1NUIC9hdXRvbWF0aW9uL3F1b3RlX2dlbmVyYXRpb24vdHJpZ2dlcmAgXHUyMDE0XG4gICAgLy8gc28gdGhlIHJlZnVzYWwgbGl2ZXMgaGVyZSBhbmQgYGdlbmVyYXRlX3F1b3RlYCBzdGF5cyB2aXNpYmxlOiBoaWRpbmdcbiAgICAvLyBpdCB3b3VsZCBsZWF2ZSB0aGUgcmVwIGEgbWlzc2luZyBidXR0b24gd2l0aCBubyByZWFzb24sIGJlY2F1c2UgYW5cbiAgICAvLyBhY3Rpb24ncyBgdmlzaWJsZWAgLyBgZGlzYWJsZWRgIGFyZSBiYXJlIHByZWRpY2F0ZXMgd2l0aCBub3doZXJlIHRvXG4gICAgLy8gcHV0IGEgc2VudGVuY2UuXG4gICAgLy9cbiAgICAvLyBUaGUgRklMVEVSIGlzIHRoZSBnYXRlJ3MgcmVhZGluZywgdGhlIG9uZSBgb3Bwb3J0dW5pdHlfbGlmZWN5Y2xlYFxuICAgIC8vIGFwcGxpZXM6IGBwZW5kaW5nYCBvciBgcmVqZWN0ZWRgIGhvbGRzIHRoZSBkZWFsIChhbiBhcHByb3ZlcidzIFwibm9cIiBpc1xuICAgIC8vIG5vdCBhIHJlbGVhc2UpLCBldmVyeSBvdGhlciB2YWx1ZSBcdTIwMTQgdGhlIHNoaXBwZWQgYG5vdF9yZXF1aXJlZGAsXG4gICAgLy8gYGFwcHJvdmVkYCwgbm9uZSBhdCBhbGwgXHUyMDE0IGRvZXMgbm90LiBTbyBgaGVsZGAgYmluZHMgdGhlIGRlYWwgb25seSB3aGlsZVxuICAgIC8vIGl0IGlzIGhlbGQsIGFuZCBgbnVsbGAgb3RoZXJ3aXNlOyBgdGVzdC9mbG93LXF1b3RlLnRlc3QudHNgIHBpbnMgdGhhdFxuICAgIC8vIHRoZSB0d28gYW5zd2VyIGFsaWtlLCB2ZXJkaWN0IGJ5IHZlcmRpY3QuXG4gICAgLy9cbiAgICAvLyBBIHJlYWQgb2YgaXRzIG93biwgYXQgY2xpY2sgdGltZS4gXHUyNkQ0IERvIG5vdCBmb2xkIGl0IGludG9cbiAgICAvLyBgZ2V0X29wcG9ydHVuaXR5YDogdGhhdCByZWFkIHN0YXlzIEFGVEVSIHRoZSBzY3JlZW4gc28gdGhlIHByaWNpbmcgYW5kXG4gICAgLy8gdGhlICMyMDE1IGFwcHJvdmFsIGJyYW5jaCAoYGU0YWAgLyBgZTRiYCkgc2VlIHRoZSBkZWFsIGFzIGl0IGlzIGF0XG4gICAgLy8gc3VibWl0LiBUaGUgdmVyZGljdCBjYW5ub3QgZHJpZnQgdG93YXJkIGhlbGQgd2hpbGUgdGhlIGZvcm0gaXMgb3BlbjpcbiAgICAvLyBgbm90X3JlcXVpcmVkYCBhbmQgYGFwcHJvdmVkYCBhcmUgbmV2ZXIgd3JpdHRlbiBiYWNrIHRvIGBwZW5kaW5nYC5cbiAgICB7IGlkOiAnZ2V0X2hlbGQnLCB0eXBlOiAnZ2V0X3JlY29yZCcsIGxhYmVsOiAnR2V0IEhlbGQgRGVhbCcsIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JywgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkSWRgLCBxdWFsaWZpY2F0aW9uX2FwcHJvdmFsX3N0YXR1czogeyAkaW46IFsncGVuZGluZycsICdyZWplY3RlZCddIH0gfSwgb3V0cHV0VmFyaWFibGU6ICdoZWxkJyB9IH0sXG4gICAgLy8gQSBmaXJzdC1jbGFzcyByZWZ1c2FsIChgRW5kQ29uZmlnU2NoZW1hYCBgb3V0Y29tZTogJ3JlZnVzZWQnYCk6IHRoZSBydW5cbiAgICAvLyBlbmRzIGByZWZ1c2VkYCwgbmV2ZXIgYGZhaWxlZGAgYW5kIG5ldmVyIHBhcmtlZCwgbm90aGluZyBpcyB3cml0dGVuLFxuICAgIC8vIGFuZCB0aGUgY29uc29sZSBzaG93cyB0aGUgbWVzc2FnZSB3aXRoIENsb3NlIG9ubHkgXHUyMDE0IG5vIFN1Ym1pdCBhbmQgbm9cbiAgICAvLyBcImNvbXBsZXRlZFwiIHRvYXN0LCB3aGljaCBpcyB3aGF0IGEgbWVzc2FnZS1vbmx5IHNjcmVlbiB3b3VsZCBnaXZlLiBJdFxuICAgIC8vIG5hbWVzIHRoZSBuZXh0IHN0ZXAgdGhlIGBvcHBvcnR1bml0eV9saWZlY3ljbGVgIHJlZnVzYWwgb2YgdGhpcyBnYXRlXG4gICAgLy8gbmFtZXMuXG4gICAgLy9cbiAgICAvLyBUcmFuc2xhdGVkOiBzaW5jZSAxOC4wLjAtbmV4dC4wIHRoZSBgZmxvd3NgIHRyYW5zbGF0aW9uIGdyb3VwIGtleXMgYW5cbiAgICAvLyBgZW5kYCBub2RlJ3MgcmVmdXNhbCBhcyBgcmVmdXNhbHMucmVmdXNlX2hlbGQubWVzc2FnZWAsIHdoaWNoIHRoZVxuICAgIC8vIGVuZ2luZSByZW5kZXJzIGluIHRoZSBydW4ncyBsb2NhbGUgKGF0IDE3LjcuMCBpdCBoYWQgbm8gc3VjaCBrZXksIHRoZVxuICAgIC8vIGdhcCByYWlzZWQgZnJvbSAjMjAzMikuIFRoZSBjb25zb2xlIHRpdGxlcyB0aGUgZGlhbG9nIHdpdGggdGhlIGFjdGlvbidzXG4gICAgLy8gdHJhbnNsYXRlZCBsYWJlbC4gXHUyNkQ0IERvIG5vdCByZS1yb3V0ZSB0aGUgcmVmdXNhbCB0aHJvdWdoIGEgc2NyZWVuIHRvXG4gICAgLy8gYm9ycm93IGEgdHJhbnNsYXRhYmxlIHRpdGxlLlxuICAgIHsgaWQ6ICdyZWZ1c2VfaGVsZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ1F1b3RlIFJlZnVzZWQnLCBjb25maWc6IHsgb3V0Y29tZTogJ3JlZnVzZWQnLCBtZXNzYWdlOiAnUXVhbGlmaWNhdGlvbiBhcHByb3ZhbCBjb21lcyBmaXJzdDogdGljayBSZXF1ZXN0IFF1YWxpZmljYXRpb24gQXBwcm92YWwuIE5vdGhpbmcgd2FzIGNyZWF0ZWQuJyB9IH0sXG4gICAge1xuICAgICAgaWQ6ICdzY3JlZW5fMScsIHR5cGU6ICdzY3JlZW4nLCBsYWJlbDogJ1F1b3RlIERldGFpbHMnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHsgbmFtZTogJ3F1b3RlTmFtZScsIGxhYmVsOiAnUXVvdGUgTmFtZScsIHR5cGU6ICd0ZXh0JywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICAgICAgICB7IG5hbWU6ICdleHBpcmF0aW9uRGF5cycsIGxhYmVsOiAnVmFsaWQgRm9yIChEYXlzKScsIHR5cGU6ICdudW1iZXInLCByZXF1aXJlZDogdHJ1ZSwgZGVmYXVsdFZhbHVlOiAzMCB9LFxuICAgICAgICAgIC8vIFRoZSBjZWlsaW5nIGlzIGEgSEFSRCBibG9jayB3aXRoIG5vIG92ZXJyaWRlXG4gICAgICAgICAgLy8gKGBjcm1fcXVvdGUuZGlzY291bnRfd2l0aGluX2NlaWxpbmdgKSwgc28gdW50aWwgaXQgaXMgd3JpdHRlbiBoZXJlXG4gICAgICAgICAgLy8gYSByZXAgbWVldHMgdGhlIG51bWJlciBvbmx5IGJ5IGhhdmluZyB0aGUgcXVvdGUgcmVmdXNlZC4gQm90aFxuICAgICAgICAgIC8vIHN0cmluZ3MgYmVsb3cgaW50ZXJwb2xhdGUgYFFVT1RFX0RJU0NPVU5UX0NFSUxJTkdgIFx1MjAxNCBpbXBvcnRlZCxcbiAgICAgICAgICAvLyBuZXZlciByZXR5cGVkLCB0aGUgc2FtZSBydWxlIHRoZSB0d28gb2JqZWN0IHJ1bGVzIGZvbGxvdyBcdTIwMTQgc28gdGhlXG4gICAgICAgICAgLy8gaGludCBjYW5ub3QgZHJpZnQgZnJvbSB0aGUgcnVsZSBpdCBkZXNjcmliZXMuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBcdTI2RDQgVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IE5PIGBtYXhgLCBhbmQgYWRkaW5nIG9uZSBkb2VzIG5vdCB3b3JrOlxuICAgICAgICAgIC8vIGBTY3JlZW5GaWVsZENvbmZpZ1NjaGVtYWAgaXMgU1RSSUNUIGF0IDE3LjMuMCBhbmQgaXRzIGVudGlyZSBrZXlcbiAgICAgICAgICAvLyBzZXQgaXMgYG5hbWVgIC8gYGxhYmVsYCAvIGB0eXBlYCAvIGByZXF1aXJlZGAgLyBgb3B0aW9uc2AgL1xuICAgICAgICAgIC8vIGBkZWZhdWx0VmFsdWVgIC8gYHBsYWNlaG9sZGVyYCAvIGB2aXNpYmxlV2hlbmAuIGBtYXhgIGlzIHJlamVjdGVkXG4gICAgICAgICAgLy8gQlkgTkFNRSAoYFVucmVjb2duaXplZCBrZXkocykgb24gdGhpcyBzY3JlZW4gZmllbGQ6IG1heGApLCBzb1xuICAgICAgICAgIC8vIGl0IGZhaWxzIGBwbnBtIHZhbGlkYXRlYCByYXRoZXIgdGhhbiBxdWlldGx5IGRvaW5nIG5vdGhpbmcsIGFuZFxuICAgICAgICAgIC8vIHRoZSBleGVjdXRvciBmb3J3YXJkcyBubyBzdWNoIGtleSBpbnRvIHRoZSBgU2NyZWVuU3BlY2AgdGhlIGNsaWVudFxuICAgICAgICAgIC8vIHJlbmRlcnMuIGBoZWxwVGV4dGAgaXMgcmVqZWN0ZWQgdGhlIHNhbWUgd2F5IFx1MjAxNCB0aGUgY29uc29sZSdzXG4gICAgICAgICAgLy8gZGlhbG9nIHdvdWxkIHJlbmRlciBvbmUsIGJ1dCBubyBmbG93IHNjcmVlbiBjYW4gY2FycnkgaXQgdGhlcmUuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvLyBUaGF0IGxlYXZlcyB0d28gY2FycmllcnMsIGFuZCB0aGUgbGFiZWwgaXMgdGhlIGxvYWQtYmVhcmluZyBvbmU6XG4gICAgICAgICAgLy8gYHBsYWNlaG9sZGVyYCByZW5kZXJzIG9ubHkgd2hpbGUgdGhlIGlucHV0IGlzIGVtcHR5IGFuZFxuICAgICAgICAgIC8vIGBkZWZhdWx0VmFsdWU6IDBgIHNlZWRzIGl0LCBzbyBpdCBzdXJmYWNlcyBmb3IgdGhlIG1vbWVudCB0aGUgcmVwXG4gICAgICAgICAgLy8gY2xlYXJzIHRoZSBib3ggdG8gdHlwZSBcdTIwMTQgcmVhbCwgYnV0IG5vdCBlbm91Z2ggb24gaXRzIG93bi5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnZGlzY291bnQnLFxuICAgICAgICAgICAgbGFiZWw6IGBEaXNjb3VudCAlIChcdTIyNjQgJHtRVU9URV9ESVNDT1VOVF9DRUlMSU5HfSlgLFxuICAgICAgICAgICAgdHlwZTogJ3BlcmNlbnQnLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAwLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6IGAwLSR7UVVPVEVfRElTQ09VTlRfQ0VJTElOR31gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdnZXRfb3Bwb3J0dW5pdHknLCB0eXBlOiAnZ2V0X3JlY29yZCcsIGxhYmVsOiAnR2V0IE9wcG9ydHVuaXR5JyxcbiAgICAgIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JywgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkSWRgIH0sIG91dHB1dFZhcmlhYmxlOiAnb3BwUmVjb3JkJyB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdjcmVhdGVfcXVvdGUnLCB0eXBlOiAnY3JlYXRlX3JlY29yZCcsIGxhYmVsOiAnQ3JlYXRlIFF1b3RlJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX3F1b3RlJyxcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgbmFtZTogY2VsYHF1b3RlTmFtZWAsIGNybV9vcHBvcnR1bml0eTogY2VsYHJlY29yZElkYCxcbiAgICAgICAgICBjcm1fYWNjb3VudDogY2VsYG9wcFJlY29yZC5jcm1fYWNjb3VudGAsIGNybV9jb250YWN0OiBjZWxgaGFzKG9wcFJlY29yZC5wcmltYXJ5X2NvbnRhY3QpID8gb3BwUmVjb3JkLnByaW1hcnlfY29udGFjdCA6IG51bGxgLFxuICAgICAgICAgIG93bmVyX2lkOiBjZWxgY3VycmVudF91c2VyLmlkYCwgc3RhdHVzOiAnZHJhZnQnLFxuICAgICAgICAgIHF1b3RlX2RhdGU6IGNlbGBpc29EYXRlKHRvZGF5KCkpYCwgZXhwaXJhdGlvbl9kYXRlOiBjZWxgaXNvRGF0ZShhZGREYXlzKHRvZGF5KCksIGV4cGlyYXRpb25EYXlzKSlgLFxuICAgICAgICAgIC8vIGBzdWJ0b3RhbGAgaXMgYSBiYXJlIHBhdGggcGFzcy10aHJvdWdoIGFuZCBuZWVkcyBubyByb3VuZGluZzogaXRcbiAgICAgICAgICAvLyBjb3BpZXMgYGNybV9vcHBvcnR1bml0eS5hbW91bnRgIGFzIHN0b3JlZCBhbmQgZG9lcyBubyBhcml0aG1ldGljLFxuICAgICAgICAgIC8vIHNvIGl0IGFkZHMgbm8gZmxvYXRpbmctcG9pbnQgdGFpbCBvZiBpdHMgb3duLlxuICAgICAgICAgIC8vIGBkaXNjb3VudGAgaXMgYW4gb3B0aW9uYWwgc2NyZWVuIGFuc3dlcjogYSByZXN1bWUgbWF5IGxlYXZlIGl0XG4gICAgICAgICAgLy8gdW5ib3VuZCwgd2hpY2ggdGhlIHRlbXBsYXRlIHdyb3RlIGFzIG5vdGhpbmcgYW5kIHRoZSBndWFyZCB3cml0ZXNcbiAgICAgICAgICAvLyBhcyBudWxsICh0aGUgcXVvdGUgZmllbGQgaGFzIG5vIGRlZmF1bHQsIHNvIHRoZSB0d28gYWdyZWUpLlxuICAgICAgICAgIHN1YnRvdGFsOiBjZWxgb3BwUmVjb3JkLmFtb3VudGAsIGRpc2NvdW50OiBjZWxgaGFzKHZhcnMuZGlzY291bnQpID8gZGlzY291bnQgOiBudWxsYCxcbiAgICAgICAgICAvLyBcdTI2RDQgQSBjdXJyZW5jeSBcdTAwRDcgcGVyY2VudGFnZSBNVVNUIGJlIHJvdW5kZWQgdG8gd2hvbGUgY2VudHMgaW5zaWRlIHRoZVxuICAgICAgICAgIC8vIGV4cHJlc3Npb24gXHUyMDE0IHRoZSBmbG93IGhhbmRzIHRoZSBlbmdpbmUgYSBtb25leSBhbW91bnQsIG5ldmVyIGFuXG4gICAgICAgICAgLy8gdW5yb3VuZGVkIGRvdWJsZS4gYGRpc2NvdW50IC8gMTAwYCBpcyBpbmV4YWN0IGZvciBldmVyeSBwZXJjZW50YWdlXG4gICAgICAgICAgLy8gd2hvc2UgaHVuZHJlZHRoIGlzIG5vdCBhIGR5YWRpYyByYXRpb25hbCwgc28gYSBCQVJFIHByb2R1Y3QgY2Fycmllc1xuICAgICAgICAgIC8vIGEgdGFpbDogMTgwLDAwMCBhdCAzMCUgaXMgMTI1OTk5Ljk5OTk5OTk5OTk5LiBXaGlsZSB0aGVzZSBmaWVsZHNcbiAgICAgICAgICAvLyBkZWNsYXJlZCBgc2NhbGU6IDJgIHRoZSBpbnNlcnQgd2FzIHJlamVjdGVkIGZvciBpdCAoYFRvdGFsIFByaWNlXG4gICAgICAgICAgLy8gbXVzdCBoYXZlIGF0IG1vc3QgMiBkZWNpbWFsIHBsYWNlcyAoZ290IDExKWAsICMxMjA2KS4gQ3VycmVuY3lcbiAgICAgICAgICAvLyBmaWVsZHMgbm8gbG9uZ2VyIGRlY2xhcmUgYHNjYWxlYCBcdTIwMTQgdGhlIHBsYXRmb3JtIHJlZnVzZXMgaXQsIGFcbiAgICAgICAgICAvLyBjdXJyZW5jeSdzIGRlY2ltYWxzIGFyZSBpdHMgSVNPIDQyMTcgbWlub3IgdW5pdCAoIzE5NjUpIFx1MjAxNCBzbyB0aGVcbiAgICAgICAgICAvLyB3cml0ZSBpcyBub3cgQUNDRVBURUQgYW5kIHRoZSB0YWlsIHdvdWxkIGJlIHN0b3JlZCBzaWxlbnRseS4gVGhlXG4gICAgICAgICAgLy8gcm91bmRpbmcga2VlcHMgYGRpc2NvdW50X2Ftb3VudGAgLyBgdG90YWxfcHJpY2VgIHdob2xlLWNlbnQgYW1vdW50cy5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIEJvdGggYXJlIENFTCB2YWx1ZSBlbnZlbG9wZXMuIENFTCdzIGByb3VuZCgpYCBpcyBJTlRFR0VSLU9OTFkgYW5kXG4gICAgICAgICAgLy8gc2luZ2xlLWFyZ3VtZW50LCBhbmQgaXQgcmV0dXJucyBhbiBJTlQgXHUyMDE0IHNvIHRoZSBkaXZpc29yIE1VU1QgYmVcbiAgICAgICAgICAvLyB0aGUgZGVjaW1hbCBgMTAwLjBgLiBcdTI2RDQgTmV2ZXIgYC8gMTAwYDogaW4gQ0VMIGludCAvIGludCBpcyBpbnRlZ2VyXG4gICAgICAgICAgLy8gZGl2aXNpb24sIHdoaWNoIHNpbGVudGx5IGRyb3BzIHRoZSBjZW50cyAoMSwyMzQuNTYgYXQgMTAlIHdvdWxkXG4gICAgICAgICAgLy8gc3RvcmUgMTIzLCBub3QgMTIzLjQ2OyBgdGVzdC9mbG93LXF1b3RlLnRlc3QudHNgIHBpbnMgaXQpLiBcdTI2RDQgTm90XG4gICAgICAgICAgLy8gYHJvdW5kKHgsIDIpYCBlaXRoZXI6IHRoZXJlIGlzIG5vIHByZWNpc2lvbiBmb3JtLCBhbmQgaXQgZmFpbHNcbiAgICAgICAgICAvLyBsb3VkbHkuIGBkb3VibGUoKWAgdHlwZXMgdGhlIGFtb3VudCwgd2hpY2ggc29tZSBkcml2ZXJzIHJldHVybiBhc1xuICAgICAgICAgIC8vIGEgc3RyaW5nLiBBIGNsZWFyZWQgZGlzY291bnQgKG51bGwgLyBhYnNlbnQgLyBcIlwiKSBwcmljZXMgYXMgMCUsIGFzXG4gICAgICAgICAgLy8gaXQgZGlkIGJlZm9yZTsgdGhlIGBoYXMoKWAgZ3VhcmQgaXMgd2hhdCBrZWVwcyB0aGF0IFRPVEFMLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gXHUyQjUwIFRoaXMgc2hhcGUgYXBwbGllcyBBTllXSEVSRSBhIGZsb3cgbXVsdGlwbGllcyBhIGN1cnJlbmN5IGJ5IGFcbiAgICAgICAgICAvLyBwZXJjZW50YWdlLiBXcml0ZSB0aGUgcm91bmRpbmcsIG5vdCB0aGUgYmFyZSBwcm9kdWN0LlxuICAgICAgICAgIGRpc2NvdW50X2Ftb3VudDogZXhwcmVzc2lvbihgcm91bmQoZG91YmxlKG9wcFJlY29yZC5hbW91bnQpICogKCR7RElTQ09VTlR9IC8gMTAwLjApICogMTAwLjApIC8gMTAwLjBgLCAnY2VsJyksXG4gICAgICAgICAgdG90YWxfcHJpY2U6IGV4cHJlc3Npb24oYHJvdW5kKGRvdWJsZShvcHBSZWNvcmQuYW1vdW50KSAqICgxLjAgLSAke0RJU0NPVU5UfSAvIDEwMC4wKSAqIDEwMC4wKSAvIDEwMC4wYCwgJ2NlbCcpLFxuICAgICAgICAgIHBheW1lbnRfdGVybXM6ICduZXRfMzAnLFxuICAgICAgICB9LFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ3F1b3RlSWQnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEFkdmFuY2UgdG8gYHByb3Bvc2FsYCBvbmx5IGZyb20gYSBQUkUtcHJvcG9zYWwgc3RhZ2UgKHRoZSBzdGF0ZSBtYWNoaW5lXG4gICAgICAvLyBhbGxvd3MgYFx1MjE5MiBwcm9wb3NhbGAgZnJvbSBhbGwgdGhyZWUpLiBcdTI2RDQgTmV2ZXIgcmUtd3JpdGUgYHByb3Bvc2FsYCBvbiBhXG4gICAgICAvLyBkZWFsIGFscmVhZHkgYXQgcHJvcG9zYWwvbmVnb3RpYXRpb246IHRoYXQgaXMgYW4gaWxsZWdhbCBzZWxmL2JhY2t3YXJkXG4gICAgICAvLyB0cmFuc2l0aW9uLiBUaG9zZSBkZWFscyBrZWVwIHRoZWlyIHN0YWdlOyB0aGUgcXVvdGUgaXMgc3RpbGwgY3JlYXRlZC5cbiAgICAgIC8vXG4gICAgICAvLyBcdTI2RDQgTm9yIG9uIGEgZGVhbCBBV0FJVElORyBBUFBST1ZBTCAoYGFwcHJvdmFsX3N0YXR1cyA9PSBcInBlbmRpbmdcImApLiBBXG4gICAgICAvLyBkZWFsIG9mIGBMQVJHRV9ERUFMX0FNT1VOVGAgb3IgbW9yZSBpcyBoZWxkIGJ5IGBvcHBvcnR1bml0eV9hcHByb3ZhbGAnc1xuICAgICAgLy8gYXBwcm92YWwgbm9kZSAoYGxvY2tSZWNvcmQ6IHRydWVgKSB1bnRpbCBhIG1hbmFnZXIgZGVjaWRlcywgYW5kIHRoZVxuICAgICAgLy8gbG9jayByZWZ1c2VzIHRoaXMgcnVuJ3Mgc3RhZ2Ugd3JpdGUgXHUyMDE0IHRoZSBydW4gaXMgdGhlIHJlcCdzXG4gICAgICAvLyAoYHJ1bkFzOiAndXNlcidgKSwgYW5kIHRoZSBsb2NrIGlzIHRoZSBhcHByb3ZhbCB3b3JraW5nIGFzIGludGVuZGVkLlxuICAgICAgLy8gYGNyZWF0ZV9xdW90ZWAgaGFzIGFscmVhZHkgbGFuZGVkIGJ5IHRoZW4gYW5kIGEgZmxvdyBjYXJyaWVzIG5vXG4gICAgICAvLyB0cmFuc2FjdGlvbiAoQURSLTAwNzcpLCBzbyB0aGUgcmVmdXNhbCB1c2VkIHRvIGZhaWwgdGhlIHJ1biBBRlRFUiB0aGVcbiAgICAgIC8vIHF1b3RlIGV4aXN0ZWQ6IG1lYXN1cmVkIG9uIDE3LjcuMCwgYEZMT1dfRkFJTEVEYCA0MDAgYFJFQ09SRF9MT0NLRURgXG4gICAgICAvLyBhdCBgdXBkYXRlX29wcG9ydHVuaXR5YCwgdGhlIHJlcCB0b2xkIHRoZSBxdW90ZSBmYWlsZWQsIGFuZCB0aGUgZHJhZnRcbiAgICAgIC8vIHF1b3RlIGxlZnQgc3RhbmRpbmcgKCMyMDE1KS4gQSBkZWFsIHVuZGVyIHJldmlldyBrZWVwcyBpdHMgc3RhZ2VcbiAgICAgIC8vIGV4YWN0bHkgbGlrZSBhIGRlYWwgYWxyZWFkeSBhdCBwcm9wb3NhbDsgdGhlIHF1b3RlIGlzIHN0aWxsIGNyZWF0ZWQgXHUyMDE0XG4gICAgICAvLyB0aGUgYnV0dG9uIGlzIG9mZmVyZWQgYXQgZXZlcnkgb3BlbiBzdGFnZSwgYW5kIGEgZHJhZnQgcXVvdGUgY29tbWl0c1xuICAgICAgLy8gbm90aGluZyB0aGUgYXBwcm92YWwgaXMgdGhlcmUgdG8gaG9sZC4gYGFwcHJvdmFsX3N0YXR1c2AgaXMgdGhlIGxvY2snc1xuICAgICAgLy8gb3duIG1pcnJvciAoYGFwcHJvdmFsU3RhdHVzRmllbGRgKTogdGhlIGFwcHJvdmFscyBwbHVnaW4gc3RhbXBzXG4gICAgICAvLyBgcGVuZGluZ2Agd2hlbiBpdCBvcGVucyB0aGUgbG9ja2luZyByZXF1ZXN0IGFuZCBhIHRlcm1pbmFsIHZlcmRpY3RcbiAgICAgIC8vIHdoZW4gaXQgcmVsZWFzZXMgaXQuXG4gICAgICAvL1xuICAgICAgLy8gVGhlIHByZWRpY2F0ZSBpdHNlbGYgbGl2ZXMgb24gZWRnZXMgYGU0YWAgLyBgZTRiYCBcdTIwMTQgYSBgZGVjaXNpb25gIG5vZGUnc1xuICAgICAgLy8gc2luZ3VsYXIgYGNvbmZpZy5jb25kaXRpb25gIGlzIG5ldmVyIGV2YWx1YXRlZCwgc28gYSBjb3B5IGhlcmUgd291bGQgYmVcbiAgICAgIC8vIGluZXJ0ICgxNy4wLjAtcmMuMidzIGBmbG93LWluZXJ0LW5vZGUtY29uZGl0aW9uYCkuIFRoZSB0b3RhbGl0eVxuICAgICAgLy8gcmF0aW9uYWxlIGlzIG9uIHRob3NlIGVkZ2VzLCB3aGVyZSB0aGUgZ3VhcmRzIGFyZS5cbiAgICAgIGlkOiAnY2hlY2tfc3RhZ2UnLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0NhbiBBZHZhbmNlIHRvIFByb3Bvc2FsPycsXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ3VwZGF0ZV9vcHBvcnR1bml0eScsIHR5cGU6ICd1cGRhdGVfcmVjb3JkJywgbGFiZWw6ICdVcGRhdGUgT3Bwb3J0dW5pdHknLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIC8vIFx1MjZENCBObyBgbGFzdF9hY3Rpdml0eV9kYXRlYCB3cml0ZTogYGNybV9vcHBvcnR1bml0eWAgaGFzIG5vIHN1Y2ggZmllbGRcbiAgICAgICAgLy8gKGl0IGxpdmVzIG9uIGBjcm1fYWNjb3VudGApLCBhbmQgYW4gdW5rbm93biBjb2x1bW4gZmFpbHMgdGhpcyBub2RlLlxuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JywgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkSWRgIH0sXG4gICAgICAgIGZpZWxkczogeyBzdGFnZTogJ3Byb3Bvc2FsJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEFEUi0wMDEyOiBkZWxpdmVyIHZpYSB0aGUgYG5vdGlmeWAgbm9kZSAoaW5ib3ggKyBlbWFpbCkuIFRoZSBsZWdhY3lcbiAgICAgIC8vIGBzY3JpcHRgICsgYGFjdGlvblR5cGU6J2VtYWlsJ2Agc2hhcGUgaXMgYSBuby1vcCBzdHViIGluIDcuNC5cbiAgICAgIGlkOiAnbm90aWZ5X293bmVyJywgdHlwZTogJ25vdGlmeScsIGxhYmVsOiAnU2VuZCBOb3RpZmljYXRpb24nLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtjZWxgY3VycmVudF91c2VyLmlkYF0sXG4gICAgICAgIGNoYW5uZWxzOiBbJ2luYm94JywgJ2VtYWlsJ10sXG4gICAgICAgIHRvcGljOiAncXVvdGVfY3JlYXRlZCcsXG4gICAgICAgIHRlbXBsYXRlOiAnY3JtLnF1b3RlX2NyZWF0ZWQnLFxuICAgICAgICB0ZW1wbGF0ZURhdGE6IHsgcXVvdGVfbmFtZTogY2VsYHF1b3RlTmFtZWAgfSxcbiAgICAgICAgYWN0aW9uVXJsOiAnL2NybV9xdW90ZS97e3F1b3RlSWQuaWR9fScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIC8vIFx1MjZENCBBIHJldGlyZWQgZWRnZSdzIGlkIHN0YXlzIFZBQ0FOVDogYGUxYCAoc3RhcnQgXHUyMTkyIHNjcmVlbl8xKSBpcyBvbmUuXG4gICAgLy8gRXZlcnkgc3Vydml2aW5nIGVkZ2Uga2VlcHMgaXRzIGlkLCBhbmQgYSBuZXcgb25lIHRha2VzIHRoZSBuZXh0IGlkIGFmdGVyXG4gICAgLy8gdGhlIGhpZ2hlc3QgaW4gdXNlIFx1MjAxNCBhIGR1cGxpY2F0ZSBpZCBpcyBpbmVydCwgc28gbm90aGluZyB3b3VsZCBmbGFnIGl0LlxuICAgIHsgaWQ6ICdlNycsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAnZ2V0X2hlbGQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAvLyBcdTI1MDBcdTI1MDAgVGhlIFx1N0FDQlx1OTg3OSBnYXRlICgjMjAzMikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy9cbiAgICAvLyBDT01QTEVNRU5UQVJZIENPTkRJVElPTkFMUyBvZmYgYSBwbGFpbiBkYXRhIG5vZGUsIG5vdCBhIGBkZWNpc2lvbmAgXHUyMDE0IHRoZVxuICAgIC8vIHNoYXBlIGBiaWxsaW5nLWhhbmRvZmYtY29udHJhY3QtYWN0aXZhdGVkLmZsb3cudHNgIHJlY29yZHM6IHRoZXkgYXJlXG4gICAgLy8gZXZhbHVhdGVkIG9uZSBieSBvbmUsIGFuZCBgIT0gbnVsbGAgLyBgPT0gbnVsbGAgcGFydGl0aW9uIGV4YWN0bHkuXG4gICAgLy8gYGdldF9oZWxkYCBkb21pbmF0ZXMgYm90aCBhbmQgYmluZHMgYGhlbGRgIG9uIGV2ZXJ5IHBhdGggXHUyMDE0IHRoZSByb3csIG9yXG4gICAgLy8gYG51bGxgIG9uIGEgbWlzcyBcdTIwMTQgc28gbmVpdGhlciByZWFkIHRha2VzIGEgYGhhcygpYCBndWFyZDogdGhlXG4gICAgLy8gZ2V0X3JlY29yZC1kb21pbmF0ZWQgY2FzZSBgdGVzdC9mbG93LXZhcmlhYmxlLWNvbmRpdGlvbnMudGVzdC50c2BcbiAgICAvLyByZWNvcmRzIGFzIG5lZWRpbmcgbm9uZSwgd3JpdHRlbiBsaWtlIGBsZWFkX2NvbnZlcnNpb25gJ3MgYGU1YCAvIGBlNmAuXG4gICAgLy8gRmFpbC1PUEVOIGxpa2UgdGhlIGhvb2s6IGEgZGVhbCB0aGUgcmVhZCBjYW5ub3Qgc2VlIGdvZXMgb24gdG8gdGhlIGZvcm1cbiAgICAvLyBhbmQgZmFpbHMgYXQgYGNyZWF0ZV9xdW90ZWAgZXhhY3RseSBhcyBpdCBhbHdheXMgZGlkLlxuICAgIHsgaWQ6ICdlOScsIHNvdXJjZTogJ2dldF9oZWxkJywgdGFyZ2V0OiAncmVmdXNlX2hlbGQnLCB0eXBlOiAnZGVmYXVsdCcsIGNvbmRpdGlvbjogUGB2YXJzLmhlbGQgIT0gbnVsbGAsIGxhYmVsOiAnSGVsZCcgfSxcbiAgICB7IGlkOiAnZTEwJywgc291cmNlOiAnZ2V0X2hlbGQnLCB0YXJnZXQ6ICdzY3JlZW5fMScsIHR5cGU6ICdkZWZhdWx0JywgY29uZGl0aW9uOiBQYHZhcnMuaGVsZCA9PSBudWxsYCwgbGFiZWw6ICdOb3QgaGVsZCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdzY3JlZW5fMScsIHRhcmdldDogJ2dldF9vcHBvcnR1bml0eScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMycsIHNvdXJjZTogJ2dldF9vcHBvcnR1bml0eScsIHRhcmdldDogJ2NyZWF0ZV9xdW90ZScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlNCcsIHNvdXJjZTogJ2NyZWF0ZV9xdW90ZScsIHRhcmdldDogJ2NoZWNrX3N0YWdlJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gVGhlIHR3byBicmFuY2hlcyBtdXN0IFBBUlRJVElPTiwgc28gdGhlIGtlZXAgc2lkZSBpcyB0aGUgYWR2YW5jZSBzaWRlXG4gICAgLy8gbmVnYXRlZCB3aG9sZSAoYEFEVkFOQ0VgIGFib3ZlKTogYGhhcyhcdTIwMjYpICYmIFx1MjAyNmAgYWR2YW5jZXMgYW5kIGV2ZXJ5dGhpbmdcbiAgICAvLyBlbHNlIGtlZXBzLiBBbiB1bmtub3duIHN0YWdlIHRoZXJlZm9yZSBsYW5kcyBvbiBcImtlZXAgc3RhZ2VcIiBcdTIwMTQgdGhlIHF1b3RlXG4gICAgLy8gaXMgc3RpbGwgY3JlYXRlZCBhbmQgbm90aGluZyBpbGxlZ2FsIGlzIHdyaXR0ZW4gdG8gdGhlIHN0YXRlIG1hY2hpbmUuXG4gICAgLy8gVGhlc2UgRURHRVMgYXJlIHRoZSBsaXZlIHNpdGVzOyBgY2hlY2tfc3RhZ2VgIGNhcnJpZXMgbm9cbiAgICAvLyBgY29uZmlnLmNvbmRpdGlvbmAgYXQgYWxsLCBiZWNhdXNlIHRoZSBlbmdpbmUgbmV2ZXIgZXZhbHVhdGVzIG9uZS5cbiAgICAvL1xuICAgIC8vIFRPVEFMSVRZOiBgb3BwUmVjb3JkYCBpcyBhIGBnZXRfcmVjb3JkYCBPVVRQVVQgXHUyMDE0IGBmaW5kT25lYCBhbnN3ZXJzXG4gICAgLy8gYSBtaXNzIHdpdGggYG51bGxgLCBhbmQgcmVhZGluZyBhIGZpZWxkIG9mZiBpdCB0aGVuIGFib3J0cyB3aXRoIGBObyBzdWNoXG4gICAgLy8ga2V5OiBzdGFnZWAuIE1lYXN1cmVkIHVucmVhY2hhYmxlIFRPREFZIG9ubHkgYmVjYXVzZSB0d28gbmVpZ2hib3VyaW5nXG4gICAgLy8gc2NoZW1hcyBoYXBwZW4gdG8gY2xvc2UgaXQ6IGBjcm1fb3Bwb3J0dW5pdHkuc3RhZ2VgIGlzIGByZXF1aXJlZGAgKG5ldmVyXG4gICAgLy8gYSBzcGFyc2UgY29sdW1uKSBhbmQgYGNybV9xdW90ZS5jcm1fYWNjb3VudGAgaXMgYHJlcXVpcmVkYCwgc28gYSBudWxsXG4gICAgLy8gYG9wcFJlY29yZGAgbWFrZXMgYGNyZWF0ZV9xdW90ZWAgZmFpbCBvbmUgbm9kZSBlYXJsaWVyLiBCb3RoIGFyZSBvbmVcbiAgICAvLyBgcmVxdWlyZWQ6IGZhbHNlYCBhd2F5IGZyb20gcmUtb3BlbmluZyBpdCwgc28gdGhlIHByZWRpY2F0ZSBjYXJyaWVzIGl0c1xuICAgIC8vIG93biBndWFyZCBcdTIwMTQgYW5kIGZyb20gMTcuMC4wLXJjLjIgYW4gdW5ldmFsdWFibGUgY29uZGl0aW9uIGFib3J0cyB0aGUgc3RlcFxuICAgIC8vIGluc3RlYWQgb2Ygc2tpcHBpbmcgaXQsIHNvIHRoZSBndWFyZCBpcyBsb2FkLWJlYXJpbmcsIG5vdFxuICAgIC8vIGRlY29yYXRpdmUuIE5vdGUgdGhlIHNjb3BlIGlzIGB2YXJzLm9wcFJlY29yZGAsIG5vdCBiYXJlIGBvcHBSZWNvcmRgOlxuICAgIC8vIG1lYXN1cmVkLCBgaGFzKG9wcFJlY29yZC5zdGFnZSlgIHN0aWxsIGFib3J0cyB3aXRoIGBVbmtub3duIHZhcmlhYmxlOlxuICAgIC8vIG9wcFJlY29yZGAgd2hlbiB0aGUgdmFyaWFibGUgaXMgdW5ib3VuZCwgd2hpbGUgYGhhcyh2YXJzLm9wcFJlY29yZClgXG4gICAgLy8gYW5zd2VycyBgZmFsc2VgIFx1MjAxNCBvbmx5IHRoZSBgdmFycy5gLXNjb3BlZCBmb3JtIGlzIHRvdGFsIGFnYWluc3QgYm90aFxuICAgIC8vIGhhemFyZHMuXG4gICAgLy9cbiAgICAvLyBUaGUgYXBwcm92YWwgdGVybSAoc2VlIGBjaGVja19zdGFnZWApIGlzIGd1YXJkZWQgdGhlIHNhbWUgd2F5OiBhbiBhYnNlbnRcbiAgICAvLyBvciBudWxsIGBhcHByb3ZhbF9zdGF0dXNgIGlzIFwibm90IHVuZGVyIGFwcHJvdmFsXCIgYW5kIGFkdmFuY2VzLCBhcyBpdFxuICAgIC8vIGRpZCBiZWZvcmUgdGhlIHRlcm0gZXhpc3RlZC5cbiAgICB7IGlkOiAnZTRhJywgc291cmNlOiAnY2hlY2tfc3RhZ2UnLCB0YXJnZXQ6ICd1cGRhdGVfb3Bwb3J0dW5pdHknLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IGV4cHJlc3Npb24oQURWQU5DRSwgJ2NlbCcpLCBsYWJlbDogJ0FkdmFuY2UnIH0sXG4gICAgeyBpZDogJ2U0YicsIHNvdXJjZTogJ2NoZWNrX3N0YWdlJywgdGFyZ2V0OiAnbm90aWZ5X293bmVyJywgdHlwZTogJ2NvbmRpdGlvbmFsJywgY29uZGl0aW9uOiBleHByZXNzaW9uKGAhKCR7QURWQU5DRX0pYCwgJ2NlbCcpLCBsYWJlbDogJ0tlZXAgc3RhZ2UnIH0sXG4gICAgeyBpZDogJ2U1Jywgc291cmNlOiAndXBkYXRlX29wcG9ydHVuaXR5JywgdGFyZ2V0OiAnbm90aWZ5X293bmVyJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U2Jywgc291cmNlOiAnbm90aWZ5X293bmVyJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9mbG93cy9jb250cmFjdC1yZW5ld2FsLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2Zsb3dzL2NvbnRyYWN0LXJlbmV3YWwuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgUCwgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xuaW1wb3J0IHsgZ3VhcmRlZCB9IGZyb20gJy4uLy4uL3NhbGVzL2Zsb3dzL19ndWFyZGVkLWl0ZXJhdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogQ29udHJhY3QgUmVuZXdhbCBcdTIwMTQgc2NoZWR1bGVkIGRhaWx5IHN3ZWVwIGZvciBjb250cmFjdHMgZW50ZXJpbmcgdGhlaXJcbiAqIHJlbmV3YWwtbm90aWNlIHdpbmRvdy5cbiAqXG4gKiBUaGlzIGZsb3cgaXMgd2hhdCBjb25zdW1lcyBgZW5kX2RhdGVgLCBgYXV0b19yZW5ld2FsYCBhbmRcbiAqIGByZW5ld2FsX25vdGljZV9kYXlzYDogZWFjaCBtb3JuaW5nIGl0IGZpbmRzIGBhY3RpdmF0ZWRgIGNvbnRyYWN0cyB3aG9zZVxuICogYGVuZF9kYXRlYCBmYWxscyBpbnNpZGUgdGhlaXIgcGVyLWNvbnRyYWN0IG5vdGljZSB3aW5kb3csIGJvb2tzIGEgcmVuZXdhbCB0YXNrXG4gKiBmb3IgdGhlIG93bmVyLCBub3RpZmllcyB0aGVtLCBhbmQgXHUyMDE0IHdoZW4gYGF1dG9fcmVuZXdhbGAgaXMgb24gXHUyMDE0IG9wZW5zIGFuXG4gKiBgZXhpc3RpbmdfcmVuZXdhbGAgb3Bwb3J0dW5pdHkgcHJlLWZpbGxlZCBmcm9tIHRoZSBjb250cmFjdCB2YWx1ZSBzbyB0aGUgZGVhbFxuICogaXMgYWxyZWFkeSBpbiB0aGUgcGlwZWxpbmUuXG4gKlxuICogQ2FwYWJpbGl0aWVzIGV4ZXJjaXNlZDogc2NoZWR1bGVkIHRyaWdnZXIgKyBgbG9vcGAgb3ZlciBhIHF1ZXJ5IHJlc3VsdCArXG4gKiBwZXItcmVjb3JkIGBkZWNpc2lvbmAgZ2F0ZXMgKyBgbm90aWZ5YCAoQURSLTAwMTIpLlxuICovXG5leHBvcnQgY29uc3QgQ29udHJhY3RSZW5ld2FsRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2NvbnRyYWN0X3JlbmV3YWwnLFxuICBsYWJlbDogJ0NvbnRyYWN0IFJlbmV3YWwgUmVtaW5kZXInLFxuICBkZXNjcmlwdGlvbjogJ0RhaWx5IHN3ZWVwOiBvcGVuIHJlbmV3YWwgdGFza3Mvb3Bwb3J0dW5pdGllcyBmb3IgY29udHJhY3RzIG5lYXJpbmcgZW5kX2RhdGUuJyxcbiAgdHlwZTogJ3NjaGVkdWxlJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gU2NoZWR1bGVkIHJ1bnMgaGF2ZSBubyB0cmlnZ2VyIHVzZXIsIHNvIHVuZGVyIHRoZSBkZWZhdWx0IHJ1bkFzOid1c2VyJyB0aGVcbiAgLy8gZGF0YSBub2RlcyBleGVjdXRlIFVOU0NPUEVEIGFueXdheS4gRGVjbGFyZSBydW5Bczonc3lzdGVtJyB0byBtYWtlIHRoYXRcbiAgLy8gUkxTLWJ5cGFzc2luZyBlbGV2YXRpb24gZXhwbGljaXQgYW5kIGludGVuZGVkIChBRFItMDA0OSkuXG4gIHJ1bkFzOiAnc3lzdGVtJyxcblxuICB2YXJpYWJsZXM6IFtdLFxuXG4gIG5vZGVzOiBbXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCAoZGFpbHkgMDg6MDApJywgY29uZmlnOiB7IHNjaGVkdWxlOiAnMCA4ICogKiAqJyB9IH0sXG4gICAge1xuICAgICAgLy8gQnJvYWQgcHJlLWZpbHRlciAobmV4dCAxMjAgZGF5cyBcdTIwMTQgXHUyNkQ0IG11c3QgY292ZXIgdGhlIExBUkdFU1RcbiAgICAgIC8vIHJlbmV3YWxfbm90aWNlX2RheXMgaW4gdXNlOyBzZWVkcyBnbyB1cCB0byA5MCkuIFRoZSBwZXItcmVjb3JkIG5vdGljZVxuICAgICAgLy8gd2luZG93IGlzIGFwcGxpZWQgaW4gdGhlIGRlY2lzaW9uIG5vZGUgYmVsb3cgc28gZWFjaCBjb250cmFjdCBob25vdXJzXG4gICAgICAvLyBpdHMgb3duIHJlbmV3YWxfbm90aWNlX2RheXMuIEEgcHJlLWZpbHRlciBuYXJyb3dlciB0aGFuIHRoZSBsYXJnZXN0XG4gICAgICAvLyBub3RpY2UgcGVyaW9kIHNpbGVudGx5IHRydW5jYXRlcyBpdDogYSA5MC1kYXkgY29udHJhY3Qgc3RheXMgaW52aXNpYmxlXG4gICAgICAvLyB1bnRpbCA2MCBkYXlzIG91dC5cbiAgICAgIGlkOiAncXVlcnlfY29udHJhY3RzJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0ZpbmQgRXhwaXJpbmcgQ29udHJhY3RzJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2NvbnRyYWN0JyxcbiAgICAgICAgZmlsdGVyOiB7IHN0YXR1czogJ2FjdGl2YXRlZCcsIGVuZF9kYXRlOiB7ICRndGU6IGNlbGBpc29EYXRlKHRvZGF5KCkpYCwgJGx0ZTogY2VsYGlzb0RhdGUoZGF5c0Zyb21Ob3coMTIwKSlgIH0gfSxcbiAgICAgICAgbGltaXQ6IDUwMCxcbiAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdjb250cmFjdExpc3QnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnbG9vcF9jb250cmFjdHMnLCB0eXBlOiAnbG9vcCcsIGxhYmVsOiAnRm9yIEVhY2ggQ29udHJhY3QnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGNvbGxlY3Rpb246IGNlbGBjb250cmFjdExpc3RgLFxuICAgICAgICBpdGVyYXRvclZhcmlhYmxlOiAnY3VycmVudENvbnRyYWN0JyxcbiAgICAgICAgYm9keTogZ3VhcmRlZCgnY29udHJhY3QnLCB7XG4gICAgICAgICAgbm9kZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gR2F0ZXdheSBvbmx5IFx1MjAxNCB0aGUgcHJlZGljYXRlIGxpdmVzIG9uIHRoZSBvdXQtZWRnZS5cbiAgICAgICAgICAgICAgaWQ6ICdjaGVja19ub3RpY2Vfd2luZG93JywgdHlwZTogJ2RlY2lzaW9uJywgbGFiZWw6ICdXaXRoaW4gTm90aWNlIFdpbmRvdz8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gSWRlbXBvdGVuY3kgZ2F0ZTogdGhlIHN3ZWVwIG1hdGNoZXMgdGhlIHNhbWUgY29udHJhY3QgZXZlcnkgZGF5XG4gICAgICAgICAgICAgIC8vIG9mIGl0cyBub3RpY2Ugd2luZG93LCBzbyBcdTI2RDQgd2l0aG91dCBpdCBldmVyeSBkYXkgcHJvZHVjZXMgYVxuICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgdGFzayArIG5vdGlmaWNhdGlvbiAoYW5kLCBiZWxvdywgYSBkdXBsaWNhdGVcbiAgICAgICAgICAgICAgLy8gcGlwZWxpbmUtaW5mbGF0aW5nIHJlbmV3YWwgb3Bwb3J0dW5pdHkpLiBBbiBvcGVuIHJlbmV3YWwgdGFza1xuICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBjb250cmFjdCBtZWFucyB0aGlzIHdpbmRvdyB3YXMgYWxyZWFkeSBoYW5kbGVkLlxuICAgICAgICAgICAgICBpZDogJ2ZpbmRfZXhpc3RpbmdfdGFzaycsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdBbHJlYWR5IFJlbWluZGVkPycsXG4gICAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIG9iamVjdE5hbWU6ICdjcm1fdGFzaycsXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgICByZWxhdGVkX3RvX2FjY291bnQ6IGNlbGBjdXJyZW50Q29udHJhY3QuY3JtX2FjY291bnRgLFxuICAgICAgICAgICAgICAgICAgc3ViamVjdDogY2VsYCdSZW5ld2FsIGR1ZTogY29udHJhY3QgJyArIGN1cnJlbnRDb250cmFjdC5jb250cmFjdF9udW1iZXJgLFxuICAgICAgICAgICAgICAgICAgc3RhdHVzOiB7ICRuaW46IFsnY29tcGxldGVkJ10gfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG91dHB1dFZhcmlhYmxlOiAnZXhpc3RpbmdSZW5ld2FsVGFzaycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBHYXRld2F5IG9ubHkgXHUyMDE0IHRoZSBwcmVkaWNhdGUgbGl2ZXMgb24gdGhlIG91dC1lZGdlLlxuICAgICAgICAgICAgICBpZDogJ2NoZWNrX25vdF9yZW1pbmRlZCcsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnRmlyc3QgUmVtaW5kZXI/JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnY3JlYXRlX3JlbmV3YWxfdGFzaycsIHR5cGU6ICdjcmVhdGVfcmVjb3JkJywgbGFiZWw6ICdDcmVhdGUgUmVuZXdhbCBUYXNrJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV90YXNrJyxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgICAgIHN1YmplY3Q6IGNlbGAnUmVuZXdhbCBkdWU6IGNvbnRyYWN0ICcgKyBjdXJyZW50Q29udHJhY3QuY29udHJhY3RfbnVtYmVyYCxcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICdmb2xsb3dfdXAnLCBwcmlvcml0eTogJ2hpZ2gnLCBzdGF0dXM6ICdub3Rfc3RhcnRlZCcsXG4gICAgICAgICAgICAgICAgICBkdWVfZGF0ZTogY2VsYGN1cnJlbnRDb250cmFjdC5lbmRfZGF0ZWAsXG4gICAgICAgICAgICAgICAgICBvd25lcl9pZDogY2VsYGhhcyhjdXJyZW50Q29udHJhY3Qub3duZXJfaWQpID8gY3VycmVudENvbnRyYWN0Lm93bmVyX2lkIDogbnVsbGAsXG4gICAgICAgICAgICAgICAgICAvLyBPUkcgUEFSVElUSU9OLiBBIHNjaGVkdWxlIHRyaWdnZXIgY2FycmllcyBub1xuICAgICAgICAgICAgICAgICAgLy8gb3JnYW5pemF0aW9uLCBzbyB0aGUgZW5naW5lIGhhcyBub3RoaW5nIHRvIGZpbGwgdGhpcyBmcm9tXG4gICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIHJvdyB3b3VsZCBiZSBib3JuIGBvcmdhbml6YXRpb25faWRgIE5VTEwgXHUyMDE0IG91dHNpZGVcbiAgICAgICAgICAgICAgICAgIC8vIGV2ZXJ5IG9yZyBwYXJ0aXRpb24sIHdoZXJlIGFuIGAob3JnYW5pemF0aW9uX2lkLCBcdTIwMjYpYCB1bmlxdWVcbiAgICAgICAgICAgICAgICAgIC8vIGluZGV4IGRvZXMgbm90IGNvbnN0cmFpbiBhbmQgb3JnLXNjb3BlZCByZWFkcyBuZXZlciBzZWUgaXQuXG4gICAgICAgICAgICAgICAgICAvLyBVcHN0cmVhbSBydWxpbmcgb2JqZWN0c3RhY2sjNjE1NSBRMj1BIHB1dHMgdGhlIGFuc3dlciBoZXJlLFxuICAgICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgZmxvdyBhdXRob3I6IGEgcmVuZXdhbCB0YXNrIGJlbG9uZ3MgdG8gdGhlIG9yZyBvZlxuICAgICAgICAgICAgICAgICAgLy8gdGhlIGNvbnRyYWN0IHRoYXQgc3Bhd25lZCBpdC4gRmlsbC1vbmx5IHByZWNlZGVuY2UgbWVhbnMgYW5cbiAgICAgICAgICAgICAgICAgIC8vIGF1dGhvci1zZXQgdmFsdWUgd2lucyBvdmVyIHRoZSBlbmdpbmUgKG9iamVjdHN0YWNrIzYxNTMpLlxuICAgICAgICAgICAgICAgICAgLy8gVGhlIHNvdXJjZSBNVVNUIGJlIGEgcm93IHRoYXQgYWN0dWFsbHkgY2FycmllcyB0aGUgY29sdW1uLlxuICAgICAgICAgICAgICAgICAgLy8gT24gMTcueCBhbiBhYnNlbnQga2V5IGludGVycG9sYXRlZCB0byBgdW5kZWZpbmVkYCBhbmQgbGFuZGVkXG4gICAgICAgICAgICAgICAgICAvLyBhcyBOVUxMLCB3aGljaCBzYXRpc2ZpZWQgdGhlIHB1Ymxpc2ggZ3VhcmQgd2hpbGUgcmVwcm9kdWNpbmdcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBidWc7IHRoZSBDRUwgcmVhZCBiZWxvdyBmYWlscyB0aGUgaXRlcmF0aW9uIGluc3RlYWQsIGFuZFxuICAgICAgICAgICAgICAgICAgLy8gaXQgaXMgZGVsaWJlcmF0ZWx5IGxlZnQgVU5HVUFSREVEIFx1MjAxNCBhIGBoYXMoKWAgZ3VhcmQgd291bGRcbiAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoYXQgTlVMTCBiYWNrLiBgY3JtX2NvbnRyYWN0YCBjYXJyaWVzIGl0OyBgc3lzX3VzZXJgXG4gICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdC5cbiAgICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbl9pZDogY2VsYGN1cnJlbnRDb250cmFjdC5vcmdhbml6YXRpb25faWRgLFxuICAgICAgICAgICAgICAgICAgcmVsYXRlZF90b190eXBlOiAnY3JtX2FjY291bnQnLFxuICAgICAgICAgICAgICAgICAgcmVsYXRlZF90b19hY2NvdW50OiBjZWxgY3VycmVudENvbnRyYWN0LmNybV9hY2NvdW50YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaWQ6ICdub3RpZnlfb3duZXInLCB0eXBlOiAnbm90aWZ5JywgbGFiZWw6ICdOb3RpZnkgT3duZXInLFxuICAgICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICByZWNpcGllbnRzOiBbY2VsYGhhcyhjdXJyZW50Q29udHJhY3Qub3duZXJfaWQpID8gY3VycmVudENvbnRyYWN0Lm93bmVyX2lkIDogbnVsbGBdLFxuICAgICAgICAgICAgICAgIGNoYW5uZWxzOiBbJ2luYm94JywgJ2VtYWlsJ10sXG4gICAgICAgICAgICAgICAgdG9waWM6ICdjb250cmFjdF9yZW5ld2FsJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogJ2NybS5jb250cmFjdF9yZW5ld2FsJyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZURhdGE6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnRyYWN0X251bWJlcjogY2VsYGN1cnJlbnRDb250cmFjdC5jb250cmFjdF9udW1iZXJgLCBlbmRfZGF0ZTogY2VsYGN1cnJlbnRDb250cmFjdC5lbmRfZGF0ZWAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhY3Rpb25Vcmw6ICcvY3JtX2NvbnRyYWN0L3t7Y3VycmVudENvbnRyYWN0LmlkfX0nLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gR2F0ZXdheSBvbmx5IFx1MjAxNCB0aGUgcHJlZGljYXRlIGxpdmVzIG9uIHRoZSBvdXQtZWRnZS5cbiAgICAgICAgICAgICAgaWQ6ICdjaGVja19hdXRvX3JlbmV3YWwnLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0F1dG8tUmVuZXdhbCBPbj8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gU2Vjb25kIGdhdGU6IG5ldmVyIG9wZW4gYSBzZWNvbmQgcmVuZXdhbCBvcHBvcnR1bml0eSB3aGlsZSBvbmVcbiAgICAgICAgICAgICAgLy8gaXMgc3RpbGwgaW4gZmxpZ2h0IGZvciB0aGlzIGFjY291bnQgKGJlbHQtYW5kLWJyYWNlcyBmb3IgdGhlXG4gICAgICAgICAgICAgIC8vIGNhc2Ugd2hlcmUgdGhlIHRhc2sgd2FzIGNvbXBsZXRlZCBidXQgdGhlIGRlYWwgaXMgc3RpbGwgb3BlbikuXG4gICAgICAgICAgICAgIGlkOiAnZmluZF9leGlzdGluZ19yZW5ld2FsX29wcCcsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdPcGVuIFJlbmV3YWwgRGVhbCBFeGlzdHM/JyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eScsXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgICAgICAgICBjcm1fYWNjb3VudDogY2VsYGN1cnJlbnRDb250cmFjdC5jcm1fYWNjb3VudGAsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnZXhpc3RpbmdfcmVuZXdhbCcsXG4gICAgICAgICAgICAgICAgICBzdGFnZTogeyAkbmluOiBbJ2Nsb3NlZF93b24nLCAnY2xvc2VkX2xvc3QnXSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdleGlzdGluZ1JlbmV3YWxPcHAnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gR2F0ZXdheSBvbmx5IFx1MjAxNCB0aGUgcHJlZGljYXRlIGxpdmVzIG9uIHRoZSBvdXQtZWRnZS5cbiAgICAgICAgICAgICAgaWQ6ICdjaGVja19ub19vcGVuX3JlbmV3YWwnLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ05vIE9wZW4gUmVuZXdhbCBEZWFsPycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogJ2NyZWF0ZV9yZW5ld2FsX29wcCcsIHR5cGU6ICdjcmVhdGVfcmVjb3JkJywgbGFiZWw6ICdPcGVuIFJlbmV3YWwgT3Bwb3J0dW5pdHknLFxuICAgICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IGNlbGAnUmVuZXdhbCBcdTIwMTQgJyArIGN1cnJlbnRDb250cmFjdC5jb250cmFjdF9udW1iZXJgLFxuICAgICAgICAgICAgICAgICAgY3JtX2FjY291bnQ6IGNlbGBjdXJyZW50Q29udHJhY3QuY3JtX2FjY291bnRgLFxuICAgICAgICAgICAgICAgICAgYW1vdW50OiBjZWxgY3VycmVudENvbnRyYWN0LmNvbnRyYWN0X3ZhbHVlYCxcbiAgICAgICAgICAgICAgICAgIHN0YWdlOiAncHJvcG9zYWwnLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ2V4aXN0aW5nX3JlbmV3YWwnLFxuICAgICAgICAgICAgICAgICAgY2xvc2VfZGF0ZTogY2VsYGN1cnJlbnRDb250cmFjdC5lbmRfZGF0ZWAsXG4gICAgICAgICAgICAgICAgICBvd25lcl9pZDogY2VsYGhhcyhjdXJyZW50Q29udHJhY3Qub3duZXJfaWQpID8gY3VycmVudENvbnRyYWN0Lm93bmVyX2lkIDogbnVsbGAsXG4gICAgICAgICAgICAgICAgICAvLyBPUkcgUEFSVElUSU9OIFx1MjAxNCBzZWUgYGNyZWF0ZV9yZW5ld2FsX3Rhc2tgIGFib3ZlLlxuICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlbmV3YWwgZGVhbCBiZWxvbmdzIHRvIHRoZSBzYW1lIG9yZyBhcyB0aGUgY29udHJhY3QuXG4gICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25faWQ6IGNlbGBjdXJyZW50Q29udHJhY3Qub3JnYW5pemF0aW9uX2lkYCxcbiAgICAgICAgICAgICAgICAgIG5leHRfc3RlcDogJ0NvbmZpcm0gcmVuZXdhbCB0ZXJtcyB3aXRoIGN1c3RvbWVyJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIGVkZ2VzOiBbXG4gICAgICAgICAgICAvLyBPbmx5IGFjdCB3aGVuIGluc2lkZSB0aGUgcGVyLWNvbnRyYWN0IG5vdGljZSB3aW5kb3c7IGdhdGVzIHdpdGhcbiAgICAgICAgICAgIC8vIG5vIG1hdGNoaW5nIGVkZ2Ugc2ltcGx5IGVuZCB0aGUgaXRlcmF0aW9uLCBzbyB0aGUgbG9vcCBtb3ZlcyBvbi5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBUaGUgRURHRSBpcyB0aGUgT05MWSBzaXRlOiBhIGBkZWNpc2lvbmAgbm9kZSdzIHNpbmd1bGFyXG4gICAgICAgICAgICAvLyBgY29uZmlnLmNvbmRpdGlvbmAgaXMgbmV2ZXIgcmVhZCBcdTIwMTQgdGhlIGV4ZWN1dG9yIHJlYWRzIHRoZSBwbHVyYWxcbiAgICAgICAgICAgIC8vIGBjb25maWcuY29uZGl0aW9uc1tdYCBhbmQgbm90aGluZyBlbHNlIFx1MjAxNCBzbyBhIGNvcHkgb24gdGhlIG5vZGVcbiAgICAgICAgICAgIC8vIHdvdWxkIGJlIGluZXJ0IG1ldGFkYXRhIHRoYXQgZHJpZnRzIHNpbGVudGx5LiBgY2hlY2tfbm90aWNlX3dpbmRvd2BcbiAgICAgICAgICAgIC8vIGlzIHRoZXJlZm9yZSBhIGJhcmUgZ2F0ZXdheSBhbmQgdGhpcyBwcmVkaWNhdGUgaXMgYXV0aG9yZWQgb25jZS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBgZW5kX2RhdGVgIGlzIGEgREFURSBmaWVsZCBhbmQgYXJyaXZlcyBhcyBgWVlZWS1NTS1ERGAsIGJ1dCBDRUwnc1xuICAgICAgICAgICAgLy8gYHRpbWVzdGFtcCgpYCBvbmx5IGFjY2VwdHMgYSBmdWxsIElTTyA4NjAxIGRhdGV0aW1lIGFuZCB0aHJvd3NcbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSAoXCJ0aW1lc3RhbXAoKSByZXF1aXJlcyBhIHN0cmluZyBpbiBJU08gODYwMSBmb3JtYXRcIikuXG4gICAgICAgICAgICAvLyBBcHBlbmRpbmcgdGhlIHRpbWUgcGFydCBpcyB3aGF0IG1ha2VzIHRoaXMgZXZhbHVhdGUgaW5zdGVhZCBvZlxuICAgICAgICAgICAgLy8gYmxvd2luZyB1cCBtaWQtc3dlZXAuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gVE9UQUxJVFk6IGBjdXJyZW50Q29udHJhY3RgIGlzIGEgTE9PUCBJVEVNIG92ZXJcbiAgICAgICAgICAgIC8vIGBjb250cmFjdExpc3RgLCB3aGljaCBgZ2V0X3JlY29yZGAgZmlsbGVkIGZyb20gYGRhdGEuZmluZGAgXHUyMDE0XG4gICAgICAgICAgICAvLyBldmVyeSBlbGVtZW50IGlzIGEgcmF3IGRyaXZlciByb3csIHNwYXJzZSBpbiBleGFjdGx5IHRoZSB3YXlcbiAgICAgICAgICAgIC8vIGEgcmF3IGRyaXZlciByb3cgaXMuIGBlbmRfZGF0ZWAgaXMgYHJlcXVpcmVkYCBvbiBgY3JtX2NvbnRyYWN0YCBzb1xuICAgICAgICAgICAgLy8gdGhhdCBjb2x1bW4gaXMgYWx3YXlzIHdyaXR0ZW4sIGJ1dCBgcmVuZXdhbF9ub3RpY2VfZGF5c2BcbiAgICAgICAgICAgIC8vIChgZGVmYXVsdFZhbHVlOiAzMGApIGFuZCBgYXV0b19yZW5ld2FsYCAoYGRlZmF1bHRWYWx1ZTogZmFsc2VgKVxuICAgICAgICAgICAgLy8gYXJlIG9ubHkgREVGQVVMVEVELCBhbmQgYSByb3cgd3JpdHRlbiBiZWZvcmUgdGhlIGRlZmF1bHQgZXhpc3RlZFxuICAgICAgICAgICAgLy8gY2FycmllcyBuZWl0aGVyIHRoZSBjb2x1bW4gbm9yIGEgdmFsdWUuIEJvdGggb3BlcmFuZHNcbiAgICAgICAgICAgIC8vIGFkZGl0aW9uYWxseSBuZWVkIGAhPSBudWxsYCwgYmVjYXVzZSB0aGUgYWJvcnQgaGVyZSBpcyBub3QgdGhlXG4gICAgICAgICAgICAvLyB1c3VhbCBvdmVybG9hZCBlcnJvcjogYG51bGwgKyBcIlQwMDowMDowMFpcImAgYW5kIGBpbnQobnVsbClgIGVhY2hcbiAgICAgICAgICAgIC8vIGJsb3cgdXAgaW5zaWRlIHRoZSBmdW5jdGlvbiBjYWxsLCBvbmUgY29udHJhY3QgaW50byBhIDUwMC1yb3dcbiAgICAgICAgICAgIC8vIHN3ZWVwLCB0YWtpbmcgdGhlIHdob2xlIHNjaGVkdWxlZCBydW4gd2l0aCB0aGVtLlxuICAgICAgICAgICAgeyBpZDogJ2IxJywgc291cmNlOiAnY2hlY2tfbm90aWNlX3dpbmRvdycsIHRhcmdldDogJ2ZpbmRfZXhpc3RpbmdfdGFzaycsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGBoYXModmFycy5jdXJyZW50Q29udHJhY3QpICYmIGhhcyh2YXJzLmN1cnJlbnRDb250cmFjdC5lbmRfZGF0ZSkgJiYgaGFzKHZhcnMuY3VycmVudENvbnRyYWN0LnJlbmV3YWxfbm90aWNlX2RheXMpXG4gICAgICAgICAgICAgICYmIHZhcnMuY3VycmVudENvbnRyYWN0LmVuZF9kYXRlICE9IG51bGwgJiYgdmFycy5jdXJyZW50Q29udHJhY3QucmVuZXdhbF9ub3RpY2VfZGF5cyAhPSBudWxsXG4gICAgICAgICAgICAgICYmIHRpbWVzdGFtcCh2YXJzLmN1cnJlbnRDb250cmFjdC5lbmRfZGF0ZSArIFwiVDAwOjAwOjAwWlwiKSA8PSBkYXlzRnJvbU5vdyhpbnQodmFycy5jdXJyZW50Q29udHJhY3QucmVuZXdhbF9ub3RpY2VfZGF5cykpYCwgbGFiZWw6ICdJbiB3aW5kb3cnIH0sXG4gICAgICAgICAgICB7IGlkOiAnYjInLCBzb3VyY2U6ICdmaW5kX2V4aXN0aW5nX3Rhc2snLCB0YXJnZXQ6ICdjaGVja19ub3RfcmVtaW5kZWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiMycsIHNvdXJjZTogJ2NoZWNrX25vdF9yZW1pbmRlZCcsIHRhcmdldDogJ2NyZWF0ZV9yZW5ld2FsX3Rhc2snLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IFBgZXhpc3RpbmdSZW5ld2FsVGFzayA9PSBudWxsYCwgbGFiZWw6ICdGaXJzdCByZW1pbmRlcicgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiNCcsIHNvdXJjZTogJ2NyZWF0ZV9yZW5ld2FsX3Rhc2snLCB0YXJnZXQ6ICdub3RpZnlfb3duZXInLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiNScsIHNvdXJjZTogJ25vdGlmeV9vd25lcicsIHRhcmdldDogJ2NoZWNrX2F1dG9fcmVuZXdhbCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgICAgLy8gVE9UQUxJVFk6IHNhbWUgbG9vcCBpdGVtLCBzYW1lIHNwYXJzZSBkcml2ZXIgcm93LiBPbmx5IGFuXG4gICAgICAgICAgICAvLyBleHBsaWNpdCBgdHJ1ZWAgb3BlbnMgYSByZW5ld2FsIGRlYWwsIHNvIGFuIGFic2VudCBjb2x1bW4gcmVhZHNcbiAgICAgICAgICAgIC8vIGFzIFwiYXV0by1yZW5ld2FsIG9mZlwiIFx1MjAxNCB0aGUgY29uc2VydmF0aXZlIGJyYW5jaC5cbiAgICAgICAgICAgIHsgaWQ6ICdiNicsIHNvdXJjZTogJ2NoZWNrX2F1dG9fcmVuZXdhbCcsIHRhcmdldDogJ2ZpbmRfZXhpc3RpbmdfcmVuZXdhbF9vcHAnLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IFBgaGFzKHZhcnMuY3VycmVudENvbnRyYWN0KSAmJiBoYXModmFycy5jdXJyZW50Q29udHJhY3QuYXV0b19yZW5ld2FsKVxuICAgICAgICAgICAgICAmJiB2YXJzLmN1cnJlbnRDb250cmFjdC5hdXRvX3JlbmV3YWwgPT0gdHJ1ZWAsIGxhYmVsOiAnQXV0by1yZW5ldycgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiNycsIHNvdXJjZTogJ2ZpbmRfZXhpc3RpbmdfcmVuZXdhbF9vcHAnLCB0YXJnZXQ6ICdjaGVja19ub19vcGVuX3JlbmV3YWwnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAgICAgICAgIHsgaWQ6ICdiOCcsIHNvdXJjZTogJ2NoZWNrX25vX29wZW5fcmVuZXdhbCcsIHRhcmdldDogJ2NyZWF0ZV9yZW5ld2FsX29wcCcsIHR5cGU6ICdjb25kaXRpb25hbCcsIGNvbmRpdGlvbjogUGBleGlzdGluZ1JlbmV3YWxPcHAgPT0gbnVsbGAsIGxhYmVsOiAnT3BlbiByZW5ld2FsIGRlYWwnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIHsgaWQ6ICdlMScsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAncXVlcnlfY29udHJhY3RzJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UyJywgc291cmNlOiAncXVlcnlfY29udHJhY3RzJywgdGFyZ2V0OiAnbG9vcF9jb250cmFjdHMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTMnLCBzb3VyY2U6ICdsb29wX2NvbnRyYWN0cycsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZmxvd3MvcXVvdGUtZXhwaXJhdGlvbi5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZmxvd3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9mbG93cy9xdW90ZS1leHBpcmF0aW9uLmZsb3cudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IGNlbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcbmltcG9ydCB7IGd1YXJkZWQgfSBmcm9tICcuLi8uLi9zYWxlcy9mbG93cy9fZ3VhcmRlZC1pdGVyYXRpb24nO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIFF1b3RlIGF1dG8tZXhwaXJhdGlvbiBcdTIwMTQgc2NoZWR1bGVkIGRhaWx5IHN3ZWVwLlxuICpcbiAqIEZsaXBzIHF1b3RlcyBwYXN0IHRoZWlyIGBleHBpcmF0aW9uX2RhdGVgIHRvIGBleHBpcmVkYCB1bmxlc3MgYWxyZWFkeVxuICogYWNjZXB0ZWQvcmVqZWN0ZWQvZXhwaXJlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFF1b3RlRXhwaXJhdGlvbkZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICdxdW90ZV9leHBpcmF0aW9uJyxcbiAgbGFiZWw6ICdRdW90ZSBBdXRvLUV4cGlyYXRpb24nLFxuICBkZXNjcmlwdGlvbjogJ0RhaWx5OiBleHBpcmUgcXVvdGVzIHBhc3QgdGhlaXIgZXhwaXJhdGlvbl9kYXRlIHRoYXQgYXJlIHN0aWxsIG9wZW4uJyxcbiAgdHlwZTogJ3NjaGVkdWxlJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgLy8gU2NoZWR1bGVkIHJ1bnMgaGF2ZSBubyB0cmlnZ2VyIHVzZXIsIHNvIHVuZGVyIHRoZSBkZWZhdWx0IHJ1bkFzOid1c2VyJyB0aGVcbiAgLy8gZGF0YSBub2RlcyBleGVjdXRlIFVOU0NPUEVEIGFueXdheS4gRGVjbGFyZSBydW5Bczonc3lzdGVtJyB0byBtYWtlIHRoYXRcbiAgLy8gUkxTLWJ5cGFzc2luZyBlbGV2YXRpb24gZXhwbGljaXQgYW5kIGludGVuZGVkIChBRFItMDA0OSkuXG4gIHJ1bkFzOiAnc3lzdGVtJyxcbiAgdmFyaWFibGVzOiBbXSxcbiAgbm9kZXM6IFtcbiAgICB7IGlkOiAnc3RhcnQnLCB0eXBlOiAnc3RhcnQnLCBsYWJlbDogJ1N0YXJ0IChkYWlseSAwMTowMCknLCBjb25maWc6IHsgc2NoZWR1bGU6ICcwIDEgKiAqIConIH0gfSxcbiAgICB7XG4gICAgICBpZDogJ3F1ZXJ5X3F1b3RlcycsIHR5cGU6ICdnZXRfcmVjb3JkJywgbGFiZWw6ICdGaW5kIEV4cGlyZWQgUXVvdGVzJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX3F1b3RlJyxcbiAgICAgICAgZmlsdGVyOiB7IHN0YXR1czogeyAkbmluOiBbJ2FjY2VwdGVkJywgJ3JlamVjdGVkJywgJ2V4cGlyZWQnXSB9LCBleHBpcmF0aW9uX2RhdGU6IHsgJGx0OiBjZWxgaXNvRGF0ZSh0b2RheSgpKWAgfSB9LFxuICAgICAgICBsaW1pdDogNTAwLFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ3F1b3RlTGlzdCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdsb29wX3F1b3RlcycsIHR5cGU6ICdsb29wJywgbGFiZWw6ICdGb3IgRWFjaCBRdW90ZScsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgY29sbGVjdGlvbjogY2VsYHF1b3RlTGlzdGAsXG4gICAgICAgIGl0ZXJhdG9yVmFyaWFibGU6ICdjdXJyZW50UXVvdGUnLFxuICAgICAgICBib2R5OiBndWFyZGVkKCdxdW90ZScsIHtcbiAgICAgICAgICBub2RlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogJ21hcmtfZXhwaXJlZCcsIHR5cGU6ICd1cGRhdGVfcmVjb3JkJywgbGFiZWw6ICdNYXJrIEV4cGlyZWQnLFxuICAgICAgICAgICAgICBjb25maWc6IHsgb2JqZWN0TmFtZTogJ2NybV9xdW90ZScsIGZpbHRlcjogeyBpZDogY2VsYGN1cnJlbnRRdW90ZS5pZGAgfSwgZmllbGRzOiB7IHN0YXR1czogJ2V4cGlyZWQnIH0gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBlZGdlczogW10sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdxdWVyeV9xdW90ZXMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdxdWVyeV9xdW90ZXMnLCB0YXJnZXQ6ICdsb29wX3F1b3RlcycsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMycsIHNvdXJjZTogJ2xvb3BfcXVvdGVzJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9mbG93cy9jb250cmFjdC1leHBpcmF0aW9uLmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2Zsb3dzL2NvbnRyYWN0LWV4cGlyYXRpb24uZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xuaW1wb3J0IHsgZ3VhcmRlZCB9IGZyb20gJy4uLy4uL3NhbGVzL2Zsb3dzL19ndWFyZGVkLWl0ZXJhdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbi8qKlxuICogQ29udHJhY3QgYXV0by1leHBpcmF0aW9uIFx1MjAxNCBzY2hlZHVsZWQgZGFpbHkgc3dlZXAuXG4gKlxuICogRmxpcHMgYGFjdGl2YXRlZGAgY29udHJhY3RzIHBhc3QgdGhlaXIgYGVuZF9kYXRlYCB0byBgZXhwaXJlZGAgYW5kIG5vdGlmaWVzXG4gKiB0aGUgb3duZXIuIChSZW5ld2FsICpyZW1pbmRlcnMqIGFyZSBhIHNlcGFyYXRlIGNvbmNlcm4sIGhhbmRsZWQgYnkgdGhlXG4gKiBgY29udHJhY3RfcmVuZXdhbGAgZmxvdy4pXG4gKi9cbmV4cG9ydCBjb25zdCBDb250cmFjdEV4cGlyYXRpb25GbG93OiBGbG93ID0ge1xuICBuYW1lOiAnY29udHJhY3RfZXhwaXJhdGlvbicsXG4gIGxhYmVsOiAnQ29udHJhY3QgQXV0by1FeHBpcmF0aW9uJyxcbiAgZGVzY3JpcHRpb246ICdEYWlseTogZXhwaXJlIGFjdGl2YXRlZCBjb250cmFjdHMgcGFzdCB0aGVpciBlbmRfZGF0ZSBhbmQgbm90aWZ5IHRoZSBvd25lci4nLFxuICB0eXBlOiAnc2NoZWR1bGUnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBTY2hlZHVsZWQgcnVucyBoYXZlIG5vIHRyaWdnZXIgdXNlciwgc28gdW5kZXIgdGhlIGRlZmF1bHQgcnVuQXM6J3VzZXInIHRoZVxuICAvLyBkYXRhIG5vZGVzIGV4ZWN1dGUgVU5TQ09QRUQgYW55d2F5LiBEZWNsYXJlIHJ1bkFzOidzeXN0ZW0nIHRvIG1ha2UgdGhhdFxuICAvLyBSTFMtYnlwYXNzaW5nIGVsZXZhdGlvbiBleHBsaWNpdCBhbmQgaW50ZW5kZWQgKEFEUi0wMDQ5KS5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICB2YXJpYWJsZXM6IFtdLFxuICBub2RlczogW1xuICAgIHsgaWQ6ICdzdGFydCcsIHR5cGU6ICdzdGFydCcsIGxhYmVsOiAnU3RhcnQgKGRhaWx5IDAwOjAwKScsIGNvbmZpZzogeyBzY2hlZHVsZTogJzAgMCAqICogKicgfSB9LFxuICAgIHtcbiAgICAgIGlkOiAncXVlcnlfY29udHJhY3RzJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0ZpbmQgRXhwaXJlZCBDb250cmFjdHMnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fY29udHJhY3QnLFxuICAgICAgICBmaWx0ZXI6IHsgc3RhdHVzOiAnYWN0aXZhdGVkJywgZW5kX2RhdGU6IHsgJGx0OiBjZWxgaXNvRGF0ZSh0b2RheSgpKWAgfSB9LFxuICAgICAgICBsaW1pdDogNTAwLFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2NvbnRyYWN0TGlzdCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdsb29wX2NvbnRyYWN0cycsIHR5cGU6ICdsb29wJywgbGFiZWw6ICdGb3IgRWFjaCBDb250cmFjdCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgY29sbGVjdGlvbjogY2VsYGNvbnRyYWN0TGlzdGAsXG4gICAgICAgIGl0ZXJhdG9yVmFyaWFibGU6ICdjdXJyZW50Q29udHJhY3QnLFxuICAgICAgICBib2R5OiBndWFyZGVkKCdjb250cmFjdCcsIHtcbiAgICAgICAgICBub2RlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogJ21hcmtfZXhwaXJlZCcsIHR5cGU6ICd1cGRhdGVfcmVjb3JkJywgbGFiZWw6ICdNYXJrIEV4cGlyZWQnLFxuICAgICAgICAgICAgICBjb25maWc6IHsgb2JqZWN0TmFtZTogJ2NybV9jb250cmFjdCcsIGZpbHRlcjogeyBpZDogY2VsYGN1cnJlbnRDb250cmFjdC5pZGAgfSwgZmllbGRzOiB7IHN0YXR1czogJ2V4cGlyZWQnIH0gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGlkOiAnbm90aWZ5X293bmVyJywgdHlwZTogJ25vdGlmeScsIGxhYmVsOiAnTm90aWZ5IE93bmVyJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgcmVjaXBpZW50czogW2NlbGBoYXMoY3VycmVudENvbnRyYWN0Lm93bmVyX2lkKSA/IGN1cnJlbnRDb250cmFjdC5vd25lcl9pZCA6IG51bGxgXSxcbiAgICAgICAgICAgICAgICBjaGFubmVsczogWydpbmJveCcsICdlbWFpbCddLFxuICAgICAgICAgICAgICAgIHRvcGljOiAnY29udHJhY3RfZXhwaXJlZCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6ICdjcm0uY29udHJhY3RfZXhwaXJlZCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGVEYXRhOiB7IGNvbnRyYWN0X251bWJlcjogY2VsYGN1cnJlbnRDb250cmFjdC5jb250cmFjdF9udW1iZXJgIH0sXG4gICAgICAgICAgICAgICAgYWN0aW9uVXJsOiAnL2NybV9jb250cmFjdC97e2N1cnJlbnRDb250cmFjdC5pZH19JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBlZGdlczogW1xuICAgICAgICAgICAgeyBpZDogJ2IxJywgc291cmNlOiAnbWFya19leHBpcmVkJywgdGFyZ2V0OiAnbm90aWZ5X293bmVyJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ3F1ZXJ5X2NvbnRyYWN0cycsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ3F1ZXJ5X2NvbnRyYWN0cycsIHRhcmdldDogJ2xvb3BfY29udHJhY3RzJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UzJywgc291cmNlOiAnbG9vcF9jb250cmFjdHMnLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2Zsb3dzL2JpbGxpbmctaGFuZG9mZi1jb250cmFjdC1hY3RpdmF0ZWQuZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZmxvd3MvYmlsbGluZy1oYW5kb2ZmLWNvbnRyYWN0LWFjdGl2YXRlZC5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQLCBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG50eXBlIEZsb3cgPSBBdXRvbWF0aW9uLkZsb3c7XG5cbmltcG9ydCB7XG4gIEJJTExJTkdfSEFORE9GRl9FTkRQT0lOVCxcbiAgQklMTElOR19IQU5ET0ZGX0VWRU5ULFxuICBCSUxMSU5HX0hBTkRPRkZfTElORV9JVEVNX0xJTUlULFxuICBCSUxMSU5HX0hBTkRPRkZfU0lHTklOR19TRUNSRVQsXG4gIEJJTExJTkdfSEFORE9GRl9USU1FT1VUX01TLFxuICBMSU5FX0lURU1fRklFTERTLFxuICBiaWxsaW5nQm9keSxcbiAgbG9hZEFjY291bnROb2RlLFxufSBmcm9tICcuLi8uLi9zYWxlcy9mbG93cy9fYmlsbGluZy1lbmRwb2ludCc7XG5cbi8qKlxuICogXHUyNTUwXHUyNTUwXHUyNTUwIEJpbGxpbmcgaGFuZC1vZmYgXHUyMDE0IHdoZXJlIEhvdENSTSdzIHJldmVudWUgc2NvcGUgZW5kcyBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcbiAqXG4gKiBIb3RDUk0gb3ducyBsZWFkIFx1MjE5MiBjb250cmFjdC4gSXQgZG9lcyAqKm5vdCoqIG1vZGVsIE9yZGVycywgSW52b2ljZXMgb3JcbiAqIFBheW1lbnRzIChtYWludGFpbmVyIGRlY2lzaW9uLCAyMDI2LTA4LTAyKTogYmlsbGluZyBpcyBhbiBleHRlcm5hbCBzeXN0ZW0nc1xuICogam9iLiBXaGF0IHRoZSBDUk0gb3dlcyB0aGF0IHN5c3RlbSBpcyBhIHJlbGlhYmxlIGhhbmQtb2ZmLCBhbmQgdGhlc2UgdHdvXG4gKiBmbG93cyBhcmUgaXQ6XG4gKlxuICogICAtIGBiaWxsaW5nX2hhbmRvZmZfY2xvc2VkX3dvbmAgICAgICAgICAgXHUyMDE0IGFuIG9wcG9ydHVuaXR5IEVOVEVSUyBgY2xvc2VkX3dvbmBcbiAqICAgICAoYHNyYy9zYWxlcy9mbG93cy9iaWxsaW5nLWhhbmRvZmYtY2xvc2VkLXdvbi5mbG93LnRzYClcbiAqICAgLSBgYmlsbGluZ19oYW5kb2ZmX2NvbnRyYWN0X2FjdGl2YXRlZGAgIFx1MjAxNCBhIGNvbnRyYWN0IEVOVEVSUyBgYWN0aXZhdGVkYFxuICogICAgICh0aGlzIGZpbGU7IGBjcm1fY29udHJhY3RgIGlzIHRoZSByZXZlbnVlIHBhY2thZ2UncyBvYmplY3QpXG4gKlxuICogRWFjaCBQT1NUcyBvbmUgSlNPTiBkb2N1bWVudCBcdTIwMTQgdGhlIHJlY29yZCwgaXRzIGFjY291bnQsIGFuZCBpdHMgbGluZSBpdGVtcyBcdTIwMTRcbiAqIHRvIHtAbGluayBCSUxMSU5HX0hBTkRPRkZfRU5EUE9JTlR9LCB0aHJvdWdoIHRoZSBwbGF0Zm9ybSdzICoqZHVyYWJsZSBIVFRQXG4gKiBvdXRib3gqKjogdGhlIGBodHRwYCBub2RlIHdpdGggYGR1cmFibGU6IHRydWVgIGNhbGxzXG4gKiBgbWVzc2FnaW5nLmVucXVldWVIdHRwKHsgc291cmNlOiAnZmxvdycsIFx1MjAyNiB9KWAsIHdoaWNoIHBlcnNpc3RzIGFcbiAqIGBzeXNfaHR0cF9kZWxpdmVyeWAgcm93IHRoYXQgdGhlIEhUVFAgZGlzcGF0Y2hlciBkcmFpbnMgd2l0aCByZXRyeSwgYmFja29mZlxuICogYW5kIGRlYWQtbGV0dGVyaW5nLCBzaWduaW5nIHRoZSBib2R5IHdpdGggSE1BQy1TSEEyNTYgd2hlbiBhIHNlY3JldCBpcyBzZXQuXG4gKiBOb3RoaW5nIGhlcmUgaXMgY3VzdG9tIHBsdW1iaW5nOyBpdCBpcyB0aGUgcGxhdGZvcm0ncyBvd24gb3V0Ym91bmQtY2FsbG91dFxuICogdmVyYiwgb24gdGhlIHNhbWUgb3V0Ym94IHRoZSBkZWNsYXJhdGl2ZSBgd2ViaG9va3NgIHN1cmZhY2UgdXNlcy5cbiAqXG4gKiAjIyBcdTI2RDQgRG8gbm90IHJlLWV4cHJlc3MgdGhlc2UgYXMgZGVjbGFyZWQgYHdlYmhvb2tzYFxuICpcbiAqIE1lYXN1cmVkIG9uIDE3LjAuMC1yYy42LCB0aGF0IHN1cmZhY2UgY2Fubm90IGV4cHJlc3MgZWl0aGVyIGV2ZW50OlxuICogYFdlYmhvb2tTY2hlbWFgIGlzIGAuc3RyaWN0YCBhbmQgcmVqZWN0cyBgY29uZGl0aW9uYCAvIGBmaWx0ZXJgIC8gYGJvZHlgIC9cbiAqIGBwYXlsb2FkRmllbGRzYCAvIGByZXRyeVBvbGljeWA7IGl0cyBgdHJpZ2dlcnNgIHZvY2FidWxhcnkgaXNcbiAqIGBjcmVhdGUgLyB1cGRhdGUgLyBkZWxldGUgLyBidWxrXypgIHdpdGggbm8gdHJhbnNpdGlvbiBmb3JtOyBhbmQgdGhlXG4gKiBhdXRvLWVucXVldWVyIG1hdGNoZXMgb24gb2JqZWN0ICsgdHJpZ2dlciBhbG9uZSBhbmQgZGVsaXZlcnMgYSBmaXhlZFxuICogYERhdGFFdmVudGAgZW52ZWxvcGUgY2FycnlpbmcgbmVpdGhlciB0aGUgYWNjb3VudCBub3IgdGhlIGxpbmUgaXRlbXMuIEFcbiAqIGBzeXNfd2ViaG9va2Agcm93IG5hbWVkIGZvciBjbG9zZWQtd29uIHdvdWxkIGZpcmUgb24gKmV2ZXJ5KiBvcHBvcnR1bml0eSBlZGl0XG4gKiBcdTIwMTQgYSBkZWNsYXJhdGlvbiB0aGF0IGxpZXMgYWJvdXQgaXRzZWxmLCBpbiB0aGUgYXBwIG90aGVyIHBlb3BsZSBjb3B5LlxuICogRGlzcGF0Y2ggdGhlcmUgaXMgYWRkaXRpb25hbGx5IGdhdGVkIG9uIHRoZSBgcmVhbHRpbWVgIGNhcGFiaWxpdHksIHdoaWNoIHRoaXNcbiAqIGFwcCBkb2VzIG5vdCByZXF1aXJlLCBzbyBzdWNoIGEgcm93IHdvdWxkIGJlIHZpc2libGUgaW4gU2V0dXAgYW5kIG5ldmVyIGZpcmVcbiAqIGF0IGFsbC5cbiAqXG4gKiBUaGUgY29zdCBvZiB0aGlzIHJvdXRlIGlzIHN0YXRlZCBpbiBgX2JpbGxpbmctZW5kcG9pbnQudHNgIGFuZCBpblxuICogYGNvbnRlbnQvZG9jcy9yZXZlbnVlL2JpbGxpbmctaGFuZG9mZi5tZHhgOiB0aGUgZW5kcG9pbnQgYW5kIHNlY3JldCBsaXZlIGluXG4gKiBmbG93IG1ldGFkYXRhLCBzbyByZXBvaW50aW5nIHRoZW0gaXMgYSByZWJ1aWxkLCBub3QgYSBTZXR1cCBlZGl0LlxuICpcbiAqICMjIEV4YWN0bHkgb25jZSBwZXIgdHJhbnNpdGlvbiwgbm90IG9uY2UgcGVyIGVkaXRcbiAqXG4gKiBcdTI2RDQgQm90aCBzdGFydCBjb25kaXRpb25zIG11c3QgdGVzdCB0aGUgVFJBTlNJVElPTlxuICogKGByZWNvcmQueCA9PSB2ICYmIHByZXZpb3VzLnggIT0gdmApLCBuZXZlciB0aGUgY3VycmVudCB2YWx1ZS4gVGhpcyBpcyB0aGVcbiAqIGlkaW9tIGBvcHBvcnR1bml0eV93b25fYWxlcnRgIHVzZXMgb24gdGhpcyB2ZXJ5IG9iamVjdDogd2l0aG91dCB0aGVcbiAqIGBwcmV2aW91cy4qYCB0ZXJtLCBldmVyeSBsYXRlciBlZGl0IG9mIGEgd29uIGRlYWwgXHUyMDE0IGEgc2VlZC1vd25lcnNoaXBcbiAqIGNsYWltLCBhbiBhcHByb3ZhbCBzdGFtcCwgYSBkZXNjcmlwdGlvbiB0d2VhayBcdTIwMTQgcmUtZmlyZXMgdGhlIGZsb3cuIEZvciBhXG4gKiBjb25ncmF0dWxhdGlvbnMgbm90aWZpY2F0aW9uIHRoYXQgaXMgbm9pc2U7IGZvciBhIGJpbGxpbmcgaGFuZC1vZmYgaXQgaXMgYVxuICogZHVwbGljYXRlIG9yZGVyLiBgcHJldmlvdXMuKmAgaXMgZ3VhcmRlZCBGQUlMLUNMT1NFRCAoYGhhcyhwcmV2aW91cy54KSAmJmApXG4gKiBmb3IgdGhlIHNhbWUgcmVhc29uIGl0IGlzIHRoZXJlOiB3aGVuIHRoZSBlbmdpbmUgY2Fubm90IHNlZSB0aGUgcHJpb3IgdmFsdWVcbiAqIGl0IGNhbm5vdCBzZWUgYSB0cmFuc2l0aW9uIGVpdGhlciwgYW5kIG11c3Qgbm90IGNsYWltIG9uZS4gVGhlIHNoYXBlIHRoYXRcbiAqIGNvdmVycyBpcyBhIGJ1bGsgYHVwZGF0ZU1hbnlgLCB3aGVyZSBPYmplY3RRTCByZWFkcyBubyBwcmlvciByb3cgYW5kXG4gKiBgcHJldmlvdXNgIGFycml2ZXMgbnVsbCBcdTIwMTQgb25lIGhhbmQtb2ZmIHBlciByb3cgb2YgYSBidWxrIHVwZGF0ZSBpcyBleGFjdGx5XG4gKiB3aGF0IG5vYm9keSB3YW50cy5cbiAqXG4gKiBEZWxpdmVyeSBpdHNlbGYgaXMgKiphdC1sZWFzdC1vbmNlKio6IHRoZSBvdXRib3ggcmV0cmllcyBhIGZhaWxlZCBhdHRlbXB0LFxuICogYW5kIGV2ZXJ5IGF0dGVtcHQgb2Ygb25lIGVucXVldWVkIHJvdyBjYXJyaWVzIHRoZSBzYW1lIGBYLU9iamVjdHN0YWNrLURlbGl2ZXJ5YFxuICogaWQuIFJlY2VpdmVycyBkZWR1cGUgb24gdGhhdCBoZWFkZXIuXG4gKlxuICogIyMgVG90YWxpdHlcbiAqXG4gKiBFdmVyeSBgcmVjb3JkLipgIC8gYHByZXZpb3VzLipgIHJlYWQgYmVsb3cgY2FycmllcyBhIGBoYXMoLi4uKWAgZ3VhcmQgXHUyMDE0IHRoZVxuICogaG91c2UgcnVsZSBgdGVzdC9mbG93LWNvbmRpdGlvbi10b3RhbGl0eS50ZXN0LnRzYCBlbmZvcmNlcywgYmVjYXVzZSBhIGZsb3dcbiAqIGNvbmRpdGlvbiB0aGF0IGFib3J0cyBmYWlscyB0aGUgd2hvbGUgcnVuIHJhdGhlciB0aGFuIHlpZWxkaW5nIGBmYWxzZWAuXG4gKi9cblxuLyoqXG4gKiBcdTI1MDBcdTI1MDAgRXZlbnQgMjogY29udHJhY3QgZW50ZXJzIGBhY3RpdmF0ZWRgIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICpcbiAqIE5CIHRoZSB2YWx1ZSBpcyBgYWN0aXZhdGVkYC4gYGNybV9jb250cmFjdC5zdGF0dXNgIGhhcyBubyBgYWN0aXZlYCBtZW1iZXIgXHUyMDE0XG4gKiB0aGUgb3B0aW9ucyBhcmUgYGRyYWZ0IC8gaW5fYXBwcm92YWwgLyBhY3RpdmF0ZWQgLyBleHBpcmVkIC8gdGVybWluYXRlZGAsXG4gKiBnb3Zlcm5lZCBieSB0aGUgYGNvbnRyYWN0X3N0YXR1c19wcm9ncmVzc2lvbmAgc3RhdGUgbWFjaGluZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEJpbGxpbmdIYW5kb2ZmQ29udHJhY3RBY3RpdmF0ZWRGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnYmlsbGluZ19oYW5kb2ZmX2NvbnRyYWN0X2FjdGl2YXRlZCcsXG4gIGxhYmVsOiAnQmlsbGluZyBIYW5kLW9mZjogQ29udHJhY3QgQWN0aXZhdGVkJyxcbiAgZGVzY3JpcHRpb246XG4gICAgJ09uIHRoZSB0cmFuc2l0aW9uIGludG8gYWN0aXZhdGVkOiBQT1NUIHRoZSBjb250cmFjdCwgaXRzIGFjY291bnQgYW5kIHRoZSBvcmlnaW5hdGluZyBkZWFsXHUyMDE5cyBsaW5lIGl0ZW1zIHRvIHRoZSBiaWxsaW5nIGVuZHBvaW50IHZpYSB0aGUgZHVyYWJsZSBIVFRQIG91dGJveC4nLFxuICB0eXBlOiAncmVjb3JkX2NoYW5nZScsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG4gIC8vIENvbnRyYWN0cyBhcmUgYWN0aXZhdGVkIGJ5IG1hY2hpbmVyeSBhcyB3ZWxsIGFzIGJ5IGhhbmQgXHUyMDE0IGBjb250cmFjdC5ob29rLnRzYFxuICAvLyBzdGFtcHMgdGhlIGFjY291bnQgcHJvbW90aW9uIGFuZCBzaWduZWQgZGF0ZSBvbiB0aGF0IHNhbWUgdHJhbnNpdGlvbiwgYW5kXG4gIC8vIHRoZSByZW5ld2FsIHN3ZWVwIHJ1bnMgYHJ1bkFzOiAnc3lzdGVtJ2AuIEEgc3lzdGVtIHdyaXRlIGNhcnJpZXMgbm8gdHJpZ2dlclxuICAvLyB1c2VyLCBzbyB1bmRlciB0aGUgZGVmYXVsdCBgcnVuQXM6ICd1c2VyJ2AgdGhpcyBmbG93J3MgdHdvIHJlYWRzIHdvdWxkIGJlXG4gIC8vIHJlZnVzZWQgb24gZXhhY3RseSB0aG9zZSBydW5zIGFuZCB0aGUgaGFuZC1vZmYgd291bGQgZGlzYXBwZWFyIHdpdGhvdXQgYVxuICAvLyBmYWlsZWQgc3RlcC4gRWxldmF0aW9uIGFsc28gZ3VhcmFudGVlcyB0aGUgcGF5bG9hZCBpcyB0aGUgd2hvbGUgY29udHJhY3QsXG4gIC8vIG5vdCBhbiBSTFMtbmFycm93ZWQgdmlldyBvZiBpdC5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICB2YXJpYWJsZXM6IFtcbiAgICAvLyBCb3VuZCB3aXRoIGEgZGVmYXVsdCBiZWNhdXNlIHRoZSBsaW5lLWl0ZW0gcmVhZCBiZWxvdyBpcyBDT05ESVRJT05BTDogYVxuICAgIC8vIGNvbnRyYWN0IG5lZWQgbm90IGhhdmUgYW4gb3JpZ2luYXRpbmcgb3Bwb3J0dW5pdHkuIFdpdGhvdXQgdGhlIGRlZmF1bHQsXG4gICAgLy8gdGhlIHNraXBwZWQgcGF0aCBsZWF2ZXMgYGJpbGxpbmdMaW5lSXRlbXNgIHVuYm91bmQgYW5kIHRoZSBwYXlsb2FkIGtleVxuICAgIC8vIHZhbmlzaGVzIFx1MjAxNCBzbyBhIHJlY2VpdmVyIGNvdWxkIG5vdCB0ZWxsIFwibm8gaXRlbXNcIiBmcm9tIFwibm90IHNlbnRcIi5cbiAgICB7IG5hbWU6ICdiaWxsaW5nTGluZUl0ZW1zJywgdHlwZTogJ2NvbGxlY3Rpb24nLCBpc0lucHV0OiBmYWxzZSwgaXNPdXRwdXQ6IGZhbHNlLCBkZWZhdWx0VmFsdWU6IFtdIH0sXG4gIF0sXG4gIG5vZGVzOiBbXG4gICAge1xuICAgICAgaWQ6ICdzdGFydCcsXG4gICAgICB0eXBlOiAnc3RhcnQnLFxuICAgICAgbGFiZWw6ICdTdGFydCAoY29udHJhY3QgdXBkYXRlZCknLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fY29udHJhY3QnLFxuICAgICAgICB0cmlnZ2VyVHlwZTogJ3JlY29yZC1hZnRlci11cGRhdGUnLFxuICAgICAgICBjb25kaXRpb246IFBgaGFzKHJlY29yZC5zdGF0dXMpICYmIHJlY29yZC5zdGF0dXMgPT0gXCJhY3RpdmF0ZWRcIlxuICAgICAgICAgICYmIGhhcyhwcmV2aW91cy5zdGF0dXMpICYmIHByZXZpb3VzLnN0YXR1cyAhPSBcImFjdGl2YXRlZFwiYCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBsb2FkQWNjb3VudE5vZGUoKSxcbiAgICB7XG4gICAgICBpZDogJ2xvYWRfbGluZV9pdGVtcycsXG4gICAgICB0eXBlOiAnZ2V0X3JlY29yZCcsXG4gICAgICBsYWJlbDogJ0xvYWQgT3JpZ2luYXRpbmcgRGVhbFx1MjAxOXMgTGluZSBJdGVtcycsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9vcHBvcnR1bml0eV9saW5lX2l0ZW0nLFxuICAgICAgICAvLyBDb250cmFjdHMgY2Fycnkgbm8gbGluZSBpdGVtcyBvZiB0aGVpciBvd247IHdoYXQgd2FzIHNvbGQgc2l0cyBvbiB0aGVcbiAgICAgICAgLy8gb3Bwb3J0dW5pdHkgdGhlIGNvbnRyYWN0IGNhbWUgZnJvbS4gUmVhY2hlZCBvbmx5IHZpYSB0aGUgZ3VhcmRlZCBlZGdlXG4gICAgICAgIC8vIGJlbG93LCBiZWNhdXNlIGBjcm1fb3Bwb3J0dW5pdHlgIGlzIE9QVElPTkFMIG9uIGEgY29udHJhY3QgYW5kIGFcbiAgICAgICAgLy8gZmlsdGVyIG9wZXJhbmQgdGhhdCBldmFsdWF0ZXMgdG8gbnVsbCBtYWtlcyBgZ2V0X3JlY29yZGAgcmVmdXNlIHRoZVxuICAgICAgICAvLyBzdGVwIChhbiBhYnNlbnQgY29uZGl0aW9uIHdpZGVucyBhIHF1ZXJ5IHJhdGhlciB0aGFuIG5hcnJvd2luZyBpdCkuXG4gICAgICAgIGZpbHRlcjogeyBjcm1fb3Bwb3J0dW5pdHk6IGNlbGByZWNvcmQuY3JtX29wcG9ydHVuaXR5YCB9LFxuICAgICAgICBmaWVsZHM6IExJTkVfSVRFTV9GSUVMRFMsXG4gICAgICAgIGxpbWl0OiBCSUxMSU5HX0hBTkRPRkZfTElORV9JVEVNX0xJTUlULFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2JpbGxpbmdMaW5lSXRlbXMnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAnc2VuZF9jb250cmFjdF9hY3RpdmF0ZWRfaGFuZG9mZicsXG4gICAgICB0eXBlOiAnaHR0cCcsXG4gICAgICBsYWJlbDogJ0VucXVldWUgQmlsbGluZyBIYW5kLW9mZicsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgdXJsOiBCSUxMSU5HX0hBTkRPRkZfRU5EUE9JTlQsXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBkdXJhYmxlOiB0cnVlLFxuICAgICAgICB0aW1lb3V0TXM6IEJJTExJTkdfSEFORE9GRl9USU1FT1VUX01TLFxuICAgICAgICBzaWduaW5nU2VjcmV0OiBCSUxMSU5HX0hBTkRPRkZfU0lHTklOR19TRUNSRVQsXG4gICAgICAgIC8vIE9uZSBlbnZlbG9wZSBidWlsZGluZyB0aGUgd2hvbGUgcGF5bG9hZCAoc2VlIGBiaWxsaW5nQm9keWApLiBUaGlzXG4gICAgICAgIC8vIGZsb3cgaXMgdGhlIGNvbnN1bWVyIG9mIGBiaWxsaW5nX2ZyZXF1ZW5jeWAgYW5kIGBwYXltZW50X3Rlcm1zYDogdGhleVxuICAgICAgICAvLyBhcmUgd2hhdCB0aGUgYmlsbGluZyBzeXN0ZW0gbmVlZHMgdG8gcmFpc2UgdGhlIHNjaGVkdWxlIEhvdENSTVxuICAgICAgICAvLyBkZWxpYmVyYXRlbHkgZG9lcyBub3QgbW9kZWwuXG4gICAgICAgIGJvZHk6IGJpbGxpbmdCb2R5KEJJTExJTkdfSEFORE9GRl9FVkVOVC5jb250cmFjdEFjdGl2YXRlZCwgJ2NvbnRyYWN0JywgW1xuICAgICAgICAgICdpZCcsICdjb250cmFjdF9udW1iZXInLCAnc3RhdHVzJywgJ2NvbnRyYWN0X3R5cGUnLCAnc3RhcnRfZGF0ZScsICdlbmRfZGF0ZScsICdjb250cmFjdF90ZXJtX21vbnRocycsXG4gICAgICAgICAgJ2NvbnRyYWN0X3ZhbHVlJywgJ2JpbGxpbmdfZnJlcXVlbmN5JywgJ3BheW1lbnRfdGVybXMnLCAnYXV0b19yZW5ld2FsJywgJ3NpZ25lZF9kYXRlJyxcbiAgICAgICAgICBbJ2FjY291bnRfaWQnLCAnY3JtX2FjY291bnQnXSwgWydvcHBvcnR1bml0eV9pZCcsICdjcm1fb3Bwb3J0dW5pdHknXSwgJ293bmVyX2lkJyxcbiAgICAgICAgXSksXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcbiAgZWRnZXM6IFtcbiAgICB7IGlkOiAnZTEnLCBzb3VyY2U6ICdzdGFydCcsIHRhcmdldDogJ2xvYWRfYWNjb3VudCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIC8vIFRoZSB0d28gZWRnZXMgYmVsb3cgYXJlIENPTVBMRU1FTlRBUlkgQ09ORElUSU9OQUxTIG9uIGEgcGxhaW4gZGF0YSBub2RlLFxuICAgIC8vIGRlbGliZXJhdGVseSBub3QgYSBgZGVjaXNpb25gIGdhdGV3YXkuIEEgZGVjaXNpb24gd2l0aCBubyBkZWNsYXJlZFxuICAgIC8vIGBjb25maWcuY29uZGl0aW9uc2AgcmVwb3J0cyB0aGUgZW5naW5lJ3MgYGRlZmF1bHRgIGJyYW5jaCBsYWJlbCwgYW5kXG4gICAgLy8gdHJhdmVyc2FsIHRoZW4gbmFycm93cyB0aGUgZWRnZSBzZXQgdG8gb3V0LWVkZ2VzIGNsYWltaW5nIHRoYXQgbGFiZWwgXHUyMDE0XG4gICAgLy8gYW4gYGlzRGVmYXVsdDogdHJ1ZWAgc2libGluZyB3b3VsZCBzd2FsbG93IHRoZSB3aG9sZSBicmFuY2ggYW5kIHRoZVxuICAgIC8vIGNvbmRpdGlvbmFsIGVkZ2Ugd291bGQgbmV2ZXIgYmUgZXZhbHVhdGVkLiBDb21wbGVtZW50YXJ5IGNvbmRpdGlvbnMgb2ZmIGFcbiAgICAvLyBub24tYnJhbmNoaW5nIG5vZGUgYXJlIGV2YWx1YXRlZCBvbmUgYnkgb25lLCB3aGljaCBpcyB0aGUgYmVoYXZpb3VyIHRoaXNcbiAgICAvLyBuZWVkcy5cbiAgICB7XG4gICAgICBpZDogJ2UyJyxcbiAgICAgIHNvdXJjZTogJ2xvYWRfYWNjb3VudCcsXG4gICAgICB0YXJnZXQ6ICdsb2FkX2xpbmVfaXRlbXMnLFxuICAgICAgdHlwZTogJ2NvbmRpdGlvbmFsJyxcbiAgICAgIGxhYmVsOiAnSGFzIG9yaWdpbmF0aW5nIGRlYWwnLFxuICAgICAgY29uZGl0aW9uOiBQYGhhcyhyZWNvcmQuY3JtX29wcG9ydHVuaXR5KSAmJiByZWNvcmQuY3JtX29wcG9ydHVuaXR5ICE9IG51bGxgLFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdlMycsXG4gICAgICBzb3VyY2U6ICdsb2FkX2FjY291bnQnLFxuICAgICAgdGFyZ2V0OiAnc2VuZF9jb250cmFjdF9hY3RpdmF0ZWRfaGFuZG9mZicsXG4gICAgICB0eXBlOiAnY29uZGl0aW9uYWwnLFxuICAgICAgbGFiZWw6ICdObyBvcmlnaW5hdGluZyBkZWFsJyxcbiAgICAgIGNvbmRpdGlvbjogUGAhaGFzKHJlY29yZC5jcm1fb3Bwb3J0dW5pdHkpIHx8IHJlY29yZC5jcm1fb3Bwb3J0dW5pdHkgPT0gbnVsbGAsXG4gICAgfSxcbiAgICB7IGlkOiAnZTQnLCBzb3VyY2U6ICdsb2FkX2xpbmVfaXRlbXMnLCB0YXJnZXQ6ICdzZW5kX2NvbnRyYWN0X2FjdGl2YXRlZF9oYW5kb2ZmJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2U1Jywgc291cmNlOiAnc2VuZF9jb250cmFjdF9hY3RpdmF0ZWRfaGFuZG9mZicsIHRhcmdldDogJ2VuZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICBdLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9mbG93cy9jYW1wYWlnbi1lbnJvbGxtZW50LmZsb3cudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL2Zsb3dzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9mbG93cy9jYW1wYWlnbi1lbnJvbGxtZW50LmZsb3cudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IFAsIGNlbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcbmltcG9ydCB0eXBlICogYXMgQXV0b21hdGlvbiBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9hdXRvbWF0aW9uJztcbmltcG9ydCB7IGd1YXJkZWQgfSBmcm9tICcuLi8uLi9zYWxlcy9mbG93cy9fZ3VhcmRlZC1pdGVyYXRpb24nO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIENhbXBhaWduIEVucm9sbG1lbnQgXHUyMDE0IHNjcmVlbiBmbG93IHRvIGJ1bGstZW5yb2xsIGxlYWRzIE9SIGNvbnRhY3RzIGludG8gYVxuICogY2FtcGFpZ24uXG4gKlxuICogTGF1bmNoZWQgZnJvbSB0aGUgXCJFbnJvbGwgTWVtYmVyc1wiIGFjdGlvbiBvbiBhIGNhbXBhaWduIHJlY29yZC4gXHUyNkQ0IE5ldmVyIHR1cm5cbiAqIHRoaXMgaW50byBhIGBzY2hlZHVsZWAgZmxvdzogYSBjcm9uIGZpcmluZyBzZWVkcyBOTyBpbnB1dCB2YXJpYWJsZXMgXHUyMDE0IG9ubHkgdGhlXG4gKiBjb25zb2xlJ3MgZmxvdy1hY3Rpb24gdHJpZ2dlciBkb2VzIChjZi4gbGVhZF9jb252ZXJzaW9uKSBcdTIwMTQgc28gYHJlY29yZElkYCBhbmRcbiAqIHRoZSBzZWdtZW50IGZpZWxkcyBhcnJpdmUgdW5kZWZpbmVkLCBhbmQgdGhlIHJ1biBlaXRoZXIgbWF0Y2hlcyBubyBjYW1wYWlnbiBvclxuICogbWFzcy1lbnJvbGxzIGV2ZXJ5IG9wZW4gbGVhZCBpbnRvIGEgbnVsbCBjYW1wYWlnbi5cbiAqXG4gKiBUaGUgY29udGFjdCBicmFuY2ggbWlycm9ycyB0aGUgbGVhZCBicmFuY2ggcmF0aGVyIHRoYW4gYmVpbmcgYSBzZWNvbmQgZGlhbGVjdDpcbiAqIHNhbWUgb3Blbi1jYW1wYWlnbiBnYXRlLCBzYW1lIGVsaWdpYmlsaXR5IHNoYXBlLCBzYW1lIHBlci1tZW1iZXIgZGVkdXBlLCBzYW1lXG4gKiBgc2VudGAgKyBgYWRkZWRfZGF0ZWAgc3RhbXAuIFNlZ21lbnRhdGlvbiBtaXJyb3JzIHRvbyBcdTIwMTQgbGVhZHMgYXJlIHNlZ21lbnRlZCBieVxuICogYHN0YXR1c2AgKHdoZXJlIHRoZXkgYXJlIGluIHF1YWxpZmljYXRpb24pOyBjb250YWN0cyBoYXZlIG5vIHN1Y2ggY29sdW1uLCBzb1xuICogdGhleSBhcmUgc2VnbWVudGVkIGJ5IGBkZXBhcnRtZW50YCwgdGhlIGZpZWxkIHRoYXQgYW5zd2VycyBcIndobyBpcyB0aGlzIHBlcnNvblxuICogYXQgdGhlIGFjY291bnRcIiwgd2hpY2ggaXMgd2hhdCBhIGNhbXBhaWduIHRhcmdldGluZyBhbiBleGlzdGluZyBjdXN0b21lciBiYXNlXG4gKiBzZWxlY3RzIG9uLlxuICpcbiAqIEVsaWdpYmlsaXR5LCBib3RoIHNpZGVzOiBoYXMgYW4gZW1haWwsIGFuZCBpcyBub3Qgb3B0ZWQgb3V0IG9mIGVtYWlsOyBsZWFkc1xuICogYWRkaXRpb25hbGx5IG11c3Qgbm90IGFscmVhZHkgYmUgY29udmVydGVkIChhIGNvbnZlcnRlZCBsZWFkIGlzIG5vdyBhIGNvbnRhY3QsXG4gKiBhbmQgd291bGQgb3RoZXJ3aXNlIGJlIGVucm9sbGFibGUgdGhyb3VnaCBib3RoIGJyYW5jaGVzIGFzIHR3byBwZW9wbGUpLlxuICogQWxyZWFkeS1lbnJvbGxlZCBwZW9wbGUgYXJlIHNraXBwZWQsIHNvIHJlLXJ1bm5pbmcgdGhlIGFjdGlvbiB0b3BzIHVwIHJhdGhlclxuICogdGhhbiBkdXBsaWNhdGluZy5cbiAqXG4gKiBcdTI2RDQgVGhpcyBmbG93IGRvZXMgTk9UIHdyaXRlIHRoZSBjYW1wYWlnbiBtZXRyaWMgcm9sbHVwcyAoYG51bV9zZW50YCBldGMuKSBcdTIwMTRcbiAqIHRoZSBjYW1wYWlnbiBtZXRyaWMgaG9va3Mgb3duIHRoZW0gYW5kIHJlZnJlc2ggb24gZXZlcnkgbWVtYmVyc2hpcCBjaGFuZ2UuIEFcbiAqIHBlci1ydW4gYG51bV9zZW50ID0ge2xlYWRMaXN0Lmxlbmd0aH1gIG92ZXJ3cml0ZSBoZXJlIGNsb2JiZXJzIHByaW9yIGJhdGNoZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBDYW1wYWlnbkVucm9sbG1lbnRGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnY2FtcGFpZ25fZW5yb2xsbWVudCcsXG4gIGxhYmVsOiAnRW5yb2xsIE1lbWJlcnMgaW4gQ2FtcGFpZ24nLFxuICBkZXNjcmlwdGlvbjogJ0J1bGsgZW5yb2xsIGVsaWdpYmxlIGxlYWRzIG9yIGNvbnRhY3RzIGludG8gdGhpcyBjYW1wYWlnbiAoc2tpcHMgYWxyZWFkeS1lbnJvbGxlZCBhbmQgb3B0ZWQtb3V0IHBlb3BsZSkuJyxcbiAgdHlwZTogJ3NjcmVlbicsXG4gIHN0YXR1czogJ2FjdGl2ZScsXG5cbiAgdmFyaWFibGVzOiBbXG4gICAgLy8gYHJlY29yZElkYCBtYXRjaGVzIHRoZSBjb25zb2xlJ3MgZmxvdy1hY3Rpb24gdHJpZ2dlciBjb250cmFjdFxuICAgIC8vICh7IHJlY29yZElkLCBvYmplY3ROYW1lIH0pIFx1MjAxNCBjZi4gbGVhZF9jb252ZXJzaW9uIC8gcXVvdGVfZ2VuZXJhdGlvbi5cbiAgICB7IG5hbWU6ICdyZWNvcmRJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgLyoqXG4gICAgICogYG1lbWJlclNvdXJjZWAgaXMgQk9VTkQgQlkgVEhJUyBERUNMQVJBVElPTiBcdTIwMTQgbm90IGJ5IGEgc2VlZGluZyBub2RlLlxuICAgICAqXG4gICAgICogQm90aCBicmFuY2ggZWRnZXMgKGBlNGAgLyBgZTdgKSByZWFkIGB2YXJzLm1lbWJlclNvdXJjZWAsIHNvIGl0IG11c3QgYmVcbiAgICAgKiBib3VuZCBvbiBldmVyeSBwYXRoIHJlYWNoaW5nIHRoZW0uIGBGbG93VmFyaWFibGVTY2hlbWFgIGNhcnJpZXNcbiAgICAgKiBgZGVmYXVsdFZhbHVlYCBhbmQgdGhlIGVuZ2luZSBzZWVkcyBpdCBiZWZvcmUgdGhlIHN0YXJ0IG5vZGUgcnVucywgc28gdGhpc1xuICAgICAqIGtleSBhbG9uZSBiaW5kcyB0aGUgbmFtZSBcdTIwMTQgd2hpbGUgYSBjYWxsZXItc3VwcGxpZWRcbiAgICAgKiBgY29udGV4dC5wYXJhbXMubWVtYmVyU291cmNlYCBzdGlsbCBXSU5TIG92ZXIgaXQuXG4gICAgICpcbiAgICAgKiBcdTI2QTBcdUZFMEYgTWVhc3VyZWQgb24gdGhlIDE3LjEuMCBzcGVjLCB3aXRoIHRoZSBzY2hlbWEga2V5IHJlLWNoZWNrZWQgb24gMTcuMi4wLlxuICAgICAqIE5laXRoZXIgdGhhdCBrZXkgbm9yIHRoZSBzZWVkaW5nIGJlaGF2aW91ciB3YXMgcmUtY2hlY2tlZCBvbiAxNy4zLjAgb3JcbiAgICAgKiAxNy40LjAgKFBSICMxODE0LCAjMTgwNyksIG5vciBvbiAxNy41LjAsIDE3LjYuMCwgMTcuNy4wIG9yIDE4LjAuMC1uZXh0LjAgKHRoZSBwaW4gc2luY2UgIzIwMzEpLlxuICAgICAqXG4gICAgICogXHUyNkQ0IE5ldmVyIHNlZWQgdGhpcyB3aXRoIGFuIGFzc2lnbm1lbnQgbm9kZSBpbnN0ZWFkLiBBbiBhc3NpZ25tZW50IGlzXG4gICAgICogdW5jb25kaXRpb25hbCwgc28gaXQgQ0xPQkJFUlMgYSBzdXBwbGllZCBwYXJhbSBcdTIwMTQgbWVhc3VyZWQ6IGxhdW5jaGluZyB3aXRoXG4gICAgICogYHBhcmFtcy5tZW1iZXJTb3VyY2UgPSAnY29udGFjdHMnYCByYW4gdGhlIExFQUQgYnJhbmNoLiBJdCBhbHNvIHJlc3RhdGVzIGFcbiAgICAgKiBkZWZhdWx0IHRoZSBzY3JlZW4gZmllbGQgY2Fycmllcywgd2l0aCBub3RoaW5nIGtlZXBpbmcgdGhlIHR3byBpbiBzdGVwLlxuICAgICAqXG4gICAgICogQSBzZWNvbmQsIGluZGVwZW5kZW50IHJlYXNvbiBubyBzZWVkaW5nIG5vZGUgaXMgbmVlZGVkIGhlcmU6IHRoZVxuICAgICAqIGBtZW1iZXJTb3VyY2VgIHNjcmVlbiBmaWVsZCBiZWxvdyBpcyBgcmVxdWlyZWQ6IHRydWVgLCBhbmQgc2luY2VcbiAgICAgKiAxNy4wLjAtcmMuMiB0aGUgU0VSVkVSIGhvbGRzIGEgc2NyZWVuIHJlc3VtZSB0byB0aGUgZGVjbGFyZWQgZmllbGRcbiAgICAgKiBjb250cmFjdC4gQSByZXN1bWUgc2lnbmFsIG9taXR0aW5nIGBtZW1iZXJTb3VyY2VgIGlzIHJlZnVzZWQgd2l0aFxuICAgICAqIGBJTlZBTElEX1NDUkVFTl9JTlBVVGAgYW5kIHRoZSBydW4gc3RheXMgcGF1c2VkLCBzbyB0aGUgb3JkaW5hcnkgcmVzdW1lXG4gICAgICogcGF0aCBjYW5ub3QgcmVhY2ggYW4gdW5ib3VuZCByZWFkIGF0IGFsbCBcdTIwMTQgdW5saWtlIGBsZWFkX2NvbnZlcnNpb25gJ3NcbiAgICAgKiBjaGVja2JveCwgd2hpY2ggaXMgZGVsaWJlcmF0ZWx5IG5vdCBgcmVxdWlyZWRgIGFuZCB0aGVyZWZvcmUgaGFzIGFuXG4gICAgICogdW5hbnN3ZXJlZCBzdGF0ZS4gVGhlIG9uZSBwYXRoIHRoYXQgc2tpcHMgdGhhdCBjaGVjayBpcyBhIHJlc3VtZSBjYXJyeWluZ1xuICAgICAqIE5PIHNpZ25hbCBvYmplY3Q7IG1lYXN1cmVkIG9uIDE3LngsIGl0IGZhaWxzIG9uZSBub2RlIGxhdGVyIGF0XG4gICAgICogYHF1ZXJ5X2xlYWRzYCByZWdhcmRsZXNzIG9mIHRoaXMgYmluZGluZywgYmVjYXVzZSBgbGVhZFN0YXR1c2AgaXMgdW5ib3VuZFxuICAgICAqIGFuZCB0aGUgcXVlcnkgbmV2ZXIgcnVucyB3aWRlbmVkLiBTaW5jZSAxOC4wLjAtbmV4dC4wIHRoZSBmaWx0ZXIgb3BlcmFuZFxuICAgICAqIGlzIGEgQ0VMIGVudmVsb3BlLCBhbmQgYW4gdW5ib3VuZCB2YXJpYWJsZSBmYWlscyB0aGUgcnVuIGJlZm9yZSB0aGUgcXVlcnlcbiAgICAgKiAodGhlIHBsYXRmb3JtJ3MgYGZsb3ctdmFsdWUtc2xvdC10ZW1wbGF0ZS1kaWFsZWN0LXJlZnVzZWRgIGNvbnRyYWN0OyBub3RcbiAgICAgKiByZS1tZWFzdXJlZCBoZXJlKS5cbiAgICAgKlxuICAgICAqIFRoZSBsaXRlcmFsIGxpdmVzIEhFUkUgYW5kIG5vd2hlcmUgZWxzZTogdGhlIHNjcmVlbiBmaWVsZCBkZXJpdmVzIGl0c1xuICAgICAqIHByZWZpbGwgZnJvbSB0aGlzIHZhcmlhYmxlIChpdHMgYGRlZmF1bHRWYWx1ZWAgZW52ZWxvcGUgcmVhZHMgYG1lbWJlclNvdXJjZWApLlxuICAgICAqL1xuICAgIHsgbmFtZTogJ21lbWJlclNvdXJjZScsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlLCBkZWZhdWx0VmFsdWU6ICdsZWFkcycgfSxcbiAgICAvKipcbiAgICAgKiBgbGVhZFN0YXR1c2AgLyBgY29udGFjdERlcGFydG1lbnRgIGRlbGliZXJhdGVseSBjYXJyeSBOTyBgZGVmYXVsdFZhbHVlYCxcbiAgICAgKiBhbmQgdGhlIGFzeW1tZXRyeSB3aXRoIGBtZW1iZXJTb3VyY2VgIGlzIHRoZSBwb2ludC4gTm8gY29uZGl0aW9uIGluIHRoaXNcbiAgICAgKiBmbG93IHJlYWRzIGVpdGhlciBvbmUgXHUyMDE0IGVhY2ggaXMgYSBgZ2V0X3JlY29yZGAgYGZpbHRlcmAgb3BlcmFuZCBcdTIwMTQgc28gdGhlXG4gICAgICogYmluZGluZyBhbmFseXNpcyBpbiBgdGVzdC9mbG93LXZhcmlhYmxlLWNvbmRpdGlvbnMudGVzdC50c2AgZG9lcyBub3RcbiAgICAgKiBjb3ZlciB0aGVtLiBBbiB1bmJvdW5kIG9uZSBmYWlscyB0aGUgcnVuIGJlZm9yZSB0aGUgcXVlcnkgaXMgbWFkZSAodGhlXG4gICAgICogMTguMC4wLW5leHQuMCBmaWx0ZXItb3BlcmFuZCBjb250cmFjdCksIGJlY2F1c2UgYW4gYWJzZW50IGNvbmRpdGlvblxuICAgICAqIHdpZGVucyBhIHF1ZXJ5IGluc3RlYWQgb2YgbmFycm93aW5nIGl0LiBTZWVkaW5nIHRoZXNlIHR3byB3b3VsZCB0dXJuIHRoYXRcbiAgICAgKiBsb3VkIGZhaWx1cmUgaW50byBhIHNpbGVudCBlbnJvbG1lbnQgb2YgYSBzZWdtZW50IG5vYm9keSBjaG9zZTsgdGhlaXJcbiAgICAgKiBgcmVxdWlyZWQ6IHRydWVgIHNjcmVlbiBmaWVsZHMgYXJlIHdoYXQgc3VwcGx5IHRoZW0uXG4gICAgICovXG4gICAgeyBuYW1lOiAnbGVhZFN0YXR1cycsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gICAgeyBuYW1lOiAnY29udGFjdERlcGFydG1lbnQnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICBdLFxuXG4gIG5vZGVzOiBbXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCcsIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX2NhbXBhaWduJyB9IH0sXG4gICAge1xuICAgICAgaWQ6ICdzY3JlZW5fMScsIHR5cGU6ICdzY3JlZW4nLCBsYWJlbDogJ0Vucm9sbG1lbnQgQ3JpdGVyaWEnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGZpZWxkczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vIFByZWZpbGwgREVSSVZFRCBmcm9tIHRoZSB2YXJpYWJsZSwgc28gdGhlIGRlZmF1bHQgaXMgd3JpdHRlblxuICAgICAgICAgICAgLy8gb25jZSAob24gdGhlIGRlY2xhcmF0aW9uKSByYXRoZXIgdGhhbiByZXN0YXRlZCBoZXJlIFx1MjAxNCB0aGVcbiAgICAgICAgICAgIC8vIHNpbmdsZS1hdXRob3JpdHkgZm9ybS4gVGhlIGVudmVsb3BlIGlzIGV2YWx1YXRlZCBiZWZvcmUgdGhlXG4gICAgICAgICAgICAvLyBzY3JlZW4gZ29lcyBvbiB0aGUgd2lyZSwgc28gdGhlIGNsaWVudCByZWNlaXZlcyB0aGUgcmF3IHZhbHVlLFxuICAgICAgICAgICAgLy8gdGhlIHN0cmluZyBgbGVhZHNgLCB3aGljaCBpcyB3aGF0IGEgbGl0ZXJhbFxuICAgICAgICAgICAgLy8gYGRlZmF1bHRWYWx1ZTogJ2xlYWRzJ2AgdXNlZCB0byBzZW5kLlxuICAgICAgICAgICAgbmFtZTogJ21lbWJlclNvdXJjZScsIGxhYmVsOiAnRW5yb2xsJywgdHlwZTogJ3NlbGVjdCcsIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBjZWxgbWVtYmVyU291cmNlYCxcbiAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0xlYWRzJywgdmFsdWU6ICdsZWFkcycgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0NvbnRhY3RzJywgdmFsdWU6ICdjb250YWN0cycgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAnbGVhZFN0YXR1cycsIGxhYmVsOiAnRW5yb2xsIGxlYWRzIGluIHN0YXR1cycsIHR5cGU6ICdzZWxlY3QnLCByZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJ25ldycsXG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdOZXcnLCB2YWx1ZTogJ25ldycgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0NvbnRhY3RlZCcsIHZhbHVlOiAnY29udGFjdGVkJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnUXVhbGlmaWVkJywgdmFsdWU6ICdxdWFsaWZpZWQnIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gUmVxdWlyZWQsIGxpa2UgYGxlYWRTdGF0dXNgLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbjogYSBibGFua1xuICAgICAgICAgICAgLy8gc2VnbWVudCB3b3VsZCByZWFjaCB0aGUgZmlsdGVyIGFzIGFuIGVtcHR5IHN0cmluZyBhbmRcbiAgICAgICAgICAgIC8vIHNpbGVudGx5IG1hdGNoIHRoZSBjb250YWN0cyB3aXRoIE5PIGRlcGFydG1lbnQgcmF0aGVyIHRoYW4gYWxsIG9mXG4gICAgICAgICAgICAvLyB0aGVtLiBCb3RoIGJyYW5jaGVzIG1ha2UgdGhlIGNhbGxlciBuYW1lIGEgc2VnbWVudC5cbiAgICAgICAgICAgIG5hbWU6ICdjb250YWN0RGVwYXJ0bWVudCcsIGxhYmVsOiAnRW5yb2xsIGNvbnRhY3RzIGluIGRlcGFydG1lbnQnLFxuICAgICAgICAgICAgdHlwZTogJ3NlbGVjdCcsIHJlcXVpcmVkOiB0cnVlLCBkZWZhdWx0VmFsdWU6ICdleGVjdXRpdmUnLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICB7IGxhYmVsOiAnRXhlY3V0aXZlJywgdmFsdWU6ICdleGVjdXRpdmUnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdTYWxlcycsIHZhbHVlOiAnc2FsZXMnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdNYXJrZXRpbmcnLCB2YWx1ZTogJ21hcmtldGluZycgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ0VuZ2luZWVyaW5nJywgdmFsdWU6ICdlbmdpbmVlcmluZycgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ1N1cHBvcnQnLCB2YWx1ZTogJ3N1cHBvcnQnIH0sXG4gICAgICAgICAgICAgIHsgbGFiZWw6ICdGaW5hbmNlJywgdmFsdWU6ICdmaW5hbmNlJyB9LFxuICAgICAgICAgICAgICB7IGxhYmVsOiAnSHVtYW4gUmVzb3VyY2VzJywgdmFsdWU6ICdocicgfSxcbiAgICAgICAgICAgICAgeyBsYWJlbDogJ09wZXJhdGlvbnMnLCB2YWx1ZTogJ29wZXJhdGlvbnMnIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdnZXRfY2FtcGFpZ24nLCB0eXBlOiAnZ2V0X3JlY29yZCcsIGxhYmVsOiAnR2V0IENhbXBhaWduJyxcbiAgICAgIGNvbmZpZzogeyBvYmplY3ROYW1lOiAnY3JtX2NhbXBhaWduJywgZmlsdGVyOiB7IGlkOiBjZWxgcmVjb3JkSWRgIH0sIG91dHB1dFZhcmlhYmxlOiAnY2FtcGFpZ25SZWNvcmQnIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICAvLyBUaGUgZ2F0ZSBpdHNlbGYgaXMgb24gZWRnZXMgYGU0YCAvIGBlN2AgXHUyMDE0IHNlZSB0aGUgbm90ZXMgdGhlcmUuIFRoaXMgbm9kZVxuICAgICAgLy8gY2FycmllcyBOTyBgY29uZmlnLmNvbmRpdGlvbmA6IHRoZSBrZXkgaXMgdGhlIHRyaWdnZXIgZ2F0ZSBvbiBhIGBzdGFydGBcbiAgICAgIC8vIG5vZGUgYW5kIGlzIHJlYWQgbm93aGVyZSBlbHNlLCBzbyBhIGNvcHkgaGVyZSB3b3VsZCBiZSBhIHNlY29uZCwgaW5lcnRcbiAgICAgIC8vIHN0YXRlbWVudCBvZiB0aGUgcHJlZGljYXRlIHRoYXQgbm8gcmVhZGVyIGNhbiB0ZWxsIGFwYXJ0IGZyb20gdGhlIGxpdmVcbiAgICAgIC8vIG9uZSAoZmxhZ2dlZCBieSBgZmxvdy1pbmVydC1ub2RlLWNvbmRpdGlvbmAgZnJvbSAxNy4wLjAtcmMuMikuXG4gICAgICBpZDogJ2NoZWNrX2NhbXBhaWduX29wZW4nLCB0eXBlOiAnZGVjaXNpb24nLCBsYWJlbDogJ0NhbXBhaWduIE9wZW4/JyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGlkOiAncXVlcnlfbGVhZHMnLCB0eXBlOiAnZ2V0X3JlY29yZCcsIGxhYmVsOiAnRmluZCBFbGlnaWJsZSBMZWFkcycsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9sZWFkJyxcbiAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgc3RhdHVzOiBjZWxgbGVhZFN0YXR1c2AsXG4gICAgICAgICAgaXNfY29udmVydGVkOiBmYWxzZSxcbiAgICAgICAgICBlbWFpbDogeyAkbmU6IG51bGwgfSxcbiAgICAgICAgICAvLyBUaGlzIGlzIGVtYWlsLWNhbXBhaWduIGVucm9sbG1lbnQgXHUyMDE0IGhvbm91ciB0aGUgb3B0LW91dCBmbGFnLlxuICAgICAgICAgIC8vIGBjYW1wYWlnbl9tZW1iZXJfb3B0b3V0X3N5bmNgIHBvcHVsYXRlcyBpdDogYW4gdW5zdWJzY3JpYmVkIG1lbWJlclxuICAgICAgICAgIC8vIHJvdW5kLXRyaXBzIHRvIHRoZSBwZXJzb24ncyBgZW1haWxfb3B0X291dGAuXG4gICAgICAgICAgZW1haWxfb3B0X291dDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2xlYWRMaXN0JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2xvb3BfbGVhZHMnLCB0eXBlOiAnbG9vcCcsIGxhYmVsOiAnUHJvY2VzcyBFYWNoIExlYWQnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGNvbGxlY3Rpb246IGNlbGBsZWFkTGlzdGAsXG4gICAgICAgIGl0ZXJhdG9yVmFyaWFibGU6ICdjdXJyZW50TGVhZCcsXG4gICAgICAgIGJvZHk6IGd1YXJkZWQoJ2xlYWQnLCB7XG4gICAgICAgICAgbm9kZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gRGVkdXBlOiBza2lwIGxlYWRzIGFscmVhZHkgZW5yb2xsZWQgaW4gVEhJUyBjYW1wYWlnbiwgc28gYVxuICAgICAgICAgICAgICAvLyByZS1ydW4gdG9wcyB1cCBpbnN0ZWFkIG9mIGRvdWJsZS1lbnJvbGxpbmcgKGRvdWJsZSByb3dzXG4gICAgICAgICAgICAgIC8vIGluZmxhdGVkIG51bV9zZW50IC8gcmVzcG9uc2VfcmF0ZSkuXG4gICAgICAgICAgICAgIGlkOiAnZmluZF9leGlzdGluZ19tZW1iZXInLCB0eXBlOiAnZ2V0X3JlY29yZCcsIGxhYmVsOiAnQWxyZWFkeSBFbnJvbGxlZD8nLFxuICAgICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2NhbXBhaWduX21lbWJlcicsXG4gICAgICAgICAgICAgICAgZmlsdGVyOiB7IGNybV9jYW1wYWlnbjogY2VsYHJlY29yZElkYCwgY3JtX2xlYWQ6IGNlbGBjdXJyZW50TGVhZC5pZGAgfSxcbiAgICAgICAgICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2V4aXN0aW5nTWVtYmVyJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIEdhdGV3YXkgb25seSBcdTIwMTQgdGhlIHByZWRpY2F0ZSBsaXZlcyBvbiB0aGUgb3V0LWVkZ2UuXG4gICAgICAgICAgICAgIGlkOiAnY2hlY2tfbm90X2Vucm9sbGVkJywgdHlwZTogJ2RlY2lzaW9uJywgbGFiZWw6ICdOZXcgTWVtYmVyPycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAvLyBcdTJCNTAgVGhlIElOU0VSVCBpcyBlbGV2YXRlZCwgdGhpcyBmbG93IGlzIE5PVC4gYGFkZGVkX2RhdGVgIGlzXG4gICAgICAgICAgICAgIC8vIGByZWFkb25seTogdHJ1ZWAsIGFuZCBmcm9tIEBvYmplY3RzdGFjay9vYmplY3RxbCAxNy40LjAgdGhlXG4gICAgICAgICAgICAgIC8vIHJlYWRvbmx5IHN0cmlwIHJ1bnMgaW5zaWRlIGBlbmdpbmUuaW5zZXJ0YCBmb3IgYSBub24tc3lzdGVtXG4gICAgICAgICAgICAgIC8vIGNhbGxlciBhcyB3ZWxsIGFzIG9uIHVwZGF0ZSBcdTIwMTQgc28gYSB3cml0ZSBmcm9tIHRoaXMgc2NyZWVuXG4gICAgICAgICAgICAgIC8vIGZsb3cncyB1c2VyIGNvbnRleHQgbm93IGxvc2VzIHRoZSBzdGFtcC4gVGhlIHJlbWVkeSB0aGVcbiAgICAgICAgICAgICAgLy8gcGxhdGZvcm0gbmFtZXMgaXMgYSBzeXN0ZW0gY29udGV4dDsgdGhlIHJlbWVkeSBBR0VOVFMubWQgaG91c2VcbiAgICAgICAgICAgICAgLy8gcnVsZSA5IG5hbWVzIGlzIGEgZGVkaWNhdGVkIGBzeXN0ZW1gIHN1Yi1mbG93IHJhdGhlciB0aGFuXG4gICAgICAgICAgICAgIC8vIGVsZXZhdGluZyB0aGUgc2NyZWVuIGZsb3cuIEJvdGggYXJlIHNhdGlzZmllZCBoZXJlLiBcdTI2RDQgRG8gbm90XG4gICAgICAgICAgICAgIC8vIGZvbGQgdGhpcyBiYWNrIGJ5IGdpdmluZyBUSElTIGZsb3cgYHJ1bkFzOiAnc3lzdGVtJ2A6IGl0IHdvdWxkXG4gICAgICAgICAgICAgIC8vIGFsc28gbGlmdCBSTFMgb2ZmIGBxdWVyeV9sZWFkc2AgLyBgcXVlcnlfY29udGFjdHNgLCBhbmRcbiAgICAgICAgICAgICAgLy8gYGNybV9sZWFkYCBpcyBgc2hhcmluZ01vZGVsOiAncHJpdmF0ZSdgLlxuICAgICAgICAgICAgICAvLyBTZWUgYHNyYy9tYXJrZXRpbmcvZmxvd3MvY2FtcGFpZ24tbWVtYmVyLWVucm9sbC5mbG93LnRzYC5cbiAgICAgICAgICAgICAgaWQ6ICdjcmVhdGVfY2FtcGFpZ25fbWVtYmVyJywgdHlwZTogJ3N1YmZsb3cnLCBsYWJlbDogJ0FkZCB0byBDYW1wYWlnbicsXG4gICAgICAgICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgICAgICAgIGZsb3dOYW1lOiAnY2FtcGFpZ25fbGVhZF9tZW1iZXJfZW5yb2xsJyxcbiAgICAgICAgICAgICAgICBpbnB1dDogeyBjYW1wYWlnbklkOiBjZWxgcmVjb3JkSWRgLCBsZWFkSWQ6IGNlbGBjdXJyZW50TGVhZC5pZGAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBlZGdlczogW1xuICAgICAgICAgICAgeyBpZDogJ2IxJywgc291cmNlOiAnZmluZF9leGlzdGluZ19tZW1iZXInLCB0YXJnZXQ6ICdjaGVja19ub3RfZW5yb2xsZWQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICAgICAgICAgIC8vIEFscmVhZHkgZW5yb2xsZWQgXHUyMTkyIG5vIGVkZ2UgXHUyMTkyIG5leHQgbGVhZC4gVGhpcyBlZGdlIGlzIHRoZSBPTkxZXG4gICAgICAgICAgICAvLyBzaXRlIGZvciB0aGUgcHJlZGljYXRlOiBhIGBkZWNpc2lvbmAgbm9kZSdzIHNpbmd1bGFyXG4gICAgICAgICAgICAvLyBgY29uZmlnLmNvbmRpdGlvbmAgaXMgbmV2ZXIgcmVhZCwgc28gYSBub2RlIGNvcHkgd291bGQgYmUgaW5lcnQuXG4gICAgICAgICAgICB7IGlkOiAnYjInLCBzb3VyY2U6ICdjaGVja19ub3RfZW5yb2xsZWQnLCB0YXJnZXQ6ICdjcmVhdGVfY2FtcGFpZ25fbWVtYmVyJywgdHlwZTogJ2NvbmRpdGlvbmFsJywgY29uZGl0aW9uOiBQYGV4aXN0aW5nTWVtYmVyID09IG51bGxgLCBsYWJlbDogJ0Vucm9sbCcgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ3F1ZXJ5X2NvbnRhY3RzJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0ZpbmQgRWxpZ2libGUgQ29udGFjdHMnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIG9iamVjdE5hbWU6ICdjcm1fY29udGFjdCcsXG4gICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgIGRlcGFydG1lbnQ6IGNlbGBjb250YWN0RGVwYXJ0bWVudGAsXG4gICAgICAgICAgZW1haWw6IHsgJG5lOiBudWxsIH0sXG4gICAgICAgICAgLy8gU2FtZSBvcHQtb3V0IGhvbm91ciBhcyB0aGUgbGVhZCBicmFuY2guIFRoZXJlIGlzIG5vIGBpc19jb252ZXJ0ZWRgXG4gICAgICAgICAgLy8gdHdpbiBoZXJlOiBhIGNvbnRhY3QgSVMgdGhlIGNvbnZlcnRlZCBlbmQgc3RhdGUuXG4gICAgICAgICAgZW1haWxfb3B0X291dDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGxpbWl0OiAxMDAwLFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2NvbnRhY3RMaXN0JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBpZDogJ2xvb3BfY29udGFjdHMnLCB0eXBlOiAnbG9vcCcsIGxhYmVsOiAnUHJvY2VzcyBFYWNoIENvbnRhY3QnLFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGNvbGxlY3Rpb246IGNlbGBjb250YWN0TGlzdGAsXG4gICAgICAgIGl0ZXJhdG9yVmFyaWFibGU6ICdjdXJyZW50Q29udGFjdCcsXG4gICAgICAgIGJvZHk6IGd1YXJkZWQoJ2NvbnRhY3QnLCB7XG4gICAgICAgICAgbm9kZXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gRGVkdXBlIHNjb3BlZCBvbiBgY3JtX2NvbnRhY3RgLCBzbyBhIHBlcnNvbiBlbnJvbGxlZCBhcyBhIExFQURcbiAgICAgICAgICAgICAgLy8gYW5kIGFnYWluIGFzIGEgQ09OVEFDVCBpcyBub3QgdHJlYXRlZCBhcyBhIGR1cGxpY2F0ZTogdGhvc2UgYXJlXG4gICAgICAgICAgICAgIC8vIHR3byByZWNvcmRzIG9mIHR3byBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcywgYW5kIHRoZSBzZWVkXG4gICAgICAgICAgICAgIC8vIGRhdGFzZXRzIGtleSB0aGVtIHNlcGFyYXRlbHkgZm9yIHRoZSBzYW1lIHJlYXNvbi5cbiAgICAgICAgICAgICAgaWQ6ICdmaW5kX2V4aXN0aW5nX2NvbnRhY3RfbWVtYmVyJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0FscmVhZHkgRW5yb2xsZWQ/JyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9jYW1wYWlnbl9tZW1iZXInLFxuICAgICAgICAgICAgICAgIGZpbHRlcjogeyBjcm1fY2FtcGFpZ246IGNlbGByZWNvcmRJZGAsIGNybV9jb250YWN0OiBjZWxgY3VycmVudENvbnRhY3QuaWRgIH0sXG4gICAgICAgICAgICAgICAgb3V0cHV0VmFyaWFibGU6ICdleGlzdGluZ0NvbnRhY3RNZW1iZXInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gR2F0ZXdheSBvbmx5IFx1MjAxNCB0aGUgcHJlZGljYXRlIGxpdmVzIG9uIHRoZSBvdXQtZWRnZS5cbiAgICAgICAgICAgICAgaWQ6ICdjaGVja19jb250YWN0X25vdF9lbnJvbGxlZCcsIHR5cGU6ICdkZWNpc2lvbicsIGxhYmVsOiAnTmV3IE1lbWJlcj8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gVGhlIGNvbnRhY3QgbWlycm9yIG9mIGBjcmVhdGVfY2FtcGFpZ25fbWVtYmVyYCBhYm92ZSBcdTIwMTQgc2FtZVxuICAgICAgICAgICAgICAvLyBlbGV2YXRpb24sIHNhbWUgcmVhc29uLiBTZWUgdGhhdCBub2RlJ3Mgbm90ZS5cbiAgICAgICAgICAgICAgaWQ6ICdjcmVhdGVfY29udGFjdF9tZW1iZXInLCB0eXBlOiAnc3ViZmxvdycsIGxhYmVsOiAnQWRkIENvbnRhY3QgdG8gQ2FtcGFpZ24nLFxuICAgICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICBmbG93TmFtZTogJ2NhbXBhaWduX2NvbnRhY3RfbWVtYmVyX2Vucm9sbCcsXG4gICAgICAgICAgICAgICAgaW5wdXQ6IHsgY2FtcGFpZ25JZDogY2VsYHJlY29yZElkYCwgY29udGFjdElkOiBjZWxgY3VycmVudENvbnRhY3QuaWRgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgZWRnZXM6IFtcbiAgICAgICAgICAgIHsgaWQ6ICdjMScsIHNvdXJjZTogJ2ZpbmRfZXhpc3RpbmdfY29udGFjdF9tZW1iZXInLCB0YXJnZXQ6ICdjaGVja19jb250YWN0X25vdF9lbnJvbGxlZCcsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgICAgICAgICAgeyBpZDogJ2MyJywgc291cmNlOiAnY2hlY2tfY29udGFjdF9ub3RfZW5yb2xsZWQnLCB0YXJnZXQ6ICdjcmVhdGVfY29udGFjdF9tZW1iZXInLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IFBgZXhpc3RpbmdDb250YWN0TWVtYmVyID09IG51bGxgLCBsYWJlbDogJ0Vucm9sbCcgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdzY3JlZW5fMScsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ3NjcmVlbl8xJywgdGFyZ2V0OiAnZ2V0X2NhbXBhaWduJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgeyBpZDogJ2UzJywgc291cmNlOiAnZ2V0X2NhbXBhaWduJywgdGFyZ2V0OiAnY2hlY2tfY2FtcGFpZ25fb3BlbicsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIC8vIENsb3NlZCBjYW1wYWlnbiBcdTIxOTIgbm8gZWRnZSBcdTIxOTIgZmxvdyBlbmRzIHdpdGhvdXQgZW5yb2xsaW5nLlxuICAgIC8vXG4gICAgLy8gVEhFIGxpdmUgZ2F0ZSwgb24gdGhlIEVER0VTIGFuZCBvbmx5IGhlcmUuIEEgYGRlY2lzaW9uYCBub2RlJ3Mgc2luZ3VsYXJcbiAgICAvLyBgY29uZmlnLmNvbmRpdGlvbmAgaXMgbmV2ZXIgcmVhZCBieSB0aGUgZW5naW5lLlxuICAgIC8vXG4gICAgLy8gT25seSBlbnJvbGwgaW50byBjYW1wYWlnbnMgdGhhdCBhcmUgYWN0dWFsbHkgcnVubmluZyAob3IgcGxhbm5lZCk6XG4gICAgLy8gdG9wcGluZyB1cCBhIGNvbXBsZXRlZC9hYm9ydGVkIGNhbXBhaWduIHdvdWxkIGNvcnJ1cHQgaXRzIHJlY29yZGVkXG4gICAgLy8gbWV0cmljcy4gKFN0YXR1cyB2YWx1ZXM6IHBsYW5uaW5nIC8gaW5fcHJvZ3Jlc3MgLyBjb21wbGV0ZWQgLyBhYm9ydGVkLilcbiAgICAvL1xuICAgIC8vIFRPVEFMSVRZOiBgaGFzKHZhcnMuY2FtcGFpZ25SZWNvcmQpYCBmaXJzdCwgdGhlblxuICAgIC8vIGBoYXModmFycy5jYW1wYWlnblJlY29yZC5zdGF0dXMpYC4gYGNhbXBhaWduUmVjb3JkYCBpcyBhIGBnZXRfcmVjb3JkYFxuICAgIC8vIE9VVFBVVCwgYW5kIGBmaW5kT25lYCBhbnN3ZXJzIGEgbWlzcyB3aXRoIGBudWxsYCBcdTIwMTQgc28gYSBjYW1wYWlnbiB0aGF0IHdhc1xuICAgIC8vIGRlbGV0ZWQgKG9yIGhpZGRlbiBieSBzaGFyaW5nKSBiZXR3ZWVuIHRoZSBhY3Rpb24gY2xpY2sgYW5kIHRoaXMgbm9kZVxuICAgIC8vIGxlYXZlcyB0aGUgdmFyaWFibGUgYm91bmQgdG8gbnVsbCwgYW5kIGFuIHVuZ3VhcmRlZCByZWFkIGFib3J0cyB3aXRoXG4gICAgLy8gYE5vIHN1Y2gga2V5OiBzdGF0dXNgLCByZWNvcmRpbmcgdGhlIHJ1biBgZmFpbGVkYCB3aXRoIG5vdCBvbmUgbGVhZFxuICAgIC8vIGVucm9sbGVkLiBgc3RhdHVzYCBpcyBgcmVxdWlyZWRgIG9uIGBjcm1fY2FtcGFpZ25gIHRvZGF5IHNvIHRoZSBjb2x1bW4gaXNcbiAgICAvLyBuZXZlciBzcGFyc2UgXHUyMDE0IGJ1dCB0aGF0IGlzIHRoZSBuZWlnaGJvdXJpbmcgc2NoZW1hIGRvaW5nIHRoZSB3b3JrLCBub3RcbiAgICAvLyB0aGlzIHByZWRpY2F0ZSwgc28gaXQgaXMgZ3VhcmRlZCB0b28uXG4gICAgLy9cbiAgICAvLyBUV08gY29uZGl0aW9uYWwgb3V0LWVkZ2VzLCBvbmUgcGVyIG1lbWJlciBzaWRlLiBUaGUgb3Blbi1jYW1wYWlnbiBjbGF1c2VcbiAgICAvLyBpcyByZXBlYXRlZCBvbiBib3RoIHJhdGhlciB0aGFuIGhvaXN0ZWQgdG8gYSBzZWNvbmQgZGVjaXNpb24gbm9kZTogdGhlXG4gICAgLy8gZ2F0ZSBJUyB0aGUgZWRnZSBwcmVkaWNhdGUgaGVyZSwgc28gYSBzZXBhcmF0ZSBcIndoaWNoIHNpZGVcIiBub2RlIHdvdWxkXG4gICAgLy8gbmVlZCBpdHMgb3duIG91dC1lZGdlcyBjYXJyeWluZyB0aGUgc2FtZSBjbGF1c2UgYW55d2F5LCBhbmQgYSBub2RlXG4gICAgLy8gc3RhdGluZyBpdCBvbmNlIGluIGBjb25maWcuY29uZGl0aW9uYCBpcyBpbmVydC5cbiAgICB7IGlkOiAnZTQnLCBzb3VyY2U6ICdjaGVja19jYW1wYWlnbl9vcGVuJywgdGFyZ2V0OiAncXVlcnlfbGVhZHMnLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IFBgaGFzKHZhcnMuY2FtcGFpZ25SZWNvcmQpICYmIGhhcyh2YXJzLmNhbXBhaWduUmVjb3JkLnN0YXR1cylcbiAgICAgICYmICh2YXJzLmNhbXBhaWduUmVjb3JkLnN0YXR1cyA9PSBcInBsYW5uaW5nXCIgfHwgdmFycy5jYW1wYWlnblJlY29yZC5zdGF0dXMgPT0gXCJpbl9wcm9ncmVzc1wiKVxuICAgICAgJiYgdmFycy5tZW1iZXJTb3VyY2UgIT0gXCJjb250YWN0c1wiYCwgbGFiZWw6ICdPcGVuIFx1MDBCNyBMZWFkcycgfSxcbiAgICB7IGlkOiAnZTUnLCBzb3VyY2U6ICdxdWVyeV9sZWFkcycsIHRhcmdldDogJ2xvb3BfbGVhZHMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTYnLCBzb3VyY2U6ICdsb29wX2xlYWRzJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gICAgLy8gVGhlIGNvbnRhY3QgYnJhbmNoLiBgbWVtYmVyU291cmNlYCBjYXJyaWVzIG5vIGBoYXMoKWAgZ3VhcmQgb24gZWl0aGVyXG4gICAgLy8gZWRnZSwgZGVsaWJlcmF0ZWx5OiBpdHMgYGZsb3cudmFyaWFibGVzYCBkZWNsYXJhdGlvbiBjYXJyaWVzXG4gICAgLy8gYGRlZmF1bHRWYWx1ZTogJ2xlYWRzJ2AsIHdoaWNoIHRoZSBlbmdpbmUgc2VlZHMgYmVmb3JlIHRoZSBzdGFydCBub2RlLCBzb1xuICAgIC8vIGl0IGlzIGJvdW5kIG9uIGV2ZXJ5IHBhdGggdGhhdCByZWFjaGVzIGhlcmUgXHUyMDE0IGFuZCBvbiB0aGUgb3JkaW5hcnkgcmVzdW1lXG4gICAgLy8gcGF0aCB0aGUgc2VydmVyIGhhcyBhbHJlYWR5IHJlZnVzZWQgYW55IHNpZ25hbCB0aGF0IG9taXR0ZWQgdGhlXG4gICAgLy8gYHJlcXVpcmVkYCBzY3JlZW4gZmllbGQuIEEgZ3VhcmQgd291bGQgaGF2ZSBidXJpZWQgdGhlIHBvbGljeSAoXCJubyBhbnN3ZXJcbiAgICAvLyBtZWFucyBsZWFkc1wiKSBpbnNpZGUgYSBwcmVkaWNhdGUgYW5kIGxlZnQgdGhlIGdyYXBoIGRlZmVjdCBpbiBwbGFjZSBcdTIwMTQgc2VlXG4gICAgLy8gdGVzdC9mbG93LXZhcmlhYmxlLWNvbmRpdGlvbnMudGVzdC50cy5cbiAgICB7IGlkOiAnZTcnLCBzb3VyY2U6ICdjaGVja19jYW1wYWlnbl9vcGVuJywgdGFyZ2V0OiAncXVlcnlfY29udGFjdHMnLCB0eXBlOiAnY29uZGl0aW9uYWwnLCBjb25kaXRpb246IFBgaGFzKHZhcnMuY2FtcGFpZ25SZWNvcmQpICYmIGhhcyh2YXJzLmNhbXBhaWduUmVjb3JkLnN0YXR1cylcbiAgICAgICYmICh2YXJzLmNhbXBhaWduUmVjb3JkLnN0YXR1cyA9PSBcInBsYW5uaW5nXCIgfHwgdmFycy5jYW1wYWlnblJlY29yZC5zdGF0dXMgPT0gXCJpbl9wcm9ncmVzc1wiKVxuICAgICAgJiYgdmFycy5tZW1iZXJTb3VyY2UgPT0gXCJjb250YWN0c1wiYCwgbGFiZWw6ICdPcGVuIFx1MDBCNyBDb250YWN0cycgfSxcbiAgICB7IGlkOiAnZTgnLCBzb3VyY2U6ICdxdWVyeV9jb250YWN0cycsIHRhcmdldDogJ2xvb3BfY29udGFjdHMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTknLCBzb3VyY2U6ICdsb29wX2NvbnRhY3RzJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL2Zsb3dzL2NhbXBhaWduLW1lbWJlci1lbnJvbGwuZmxvdy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvZmxvd3NcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvbWFya2V0aW5nL2Zsb3dzL2NhbXBhaWduLW1lbWJlci1lbnJvbGwuZmxvdy50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHR5cGUgKiBhcyBBdXRvbWF0aW9uIGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2F1dG9tYXRpb24nO1xudHlwZSBGbG93ID0gQXV0b21hdGlvbi5GbG93O1xuXG4vKipcbiAqIFRoZSBjYW1wYWlnbi1tZW1iZXJzaGlwIElOU0VSVCBcdTIwMTQgdGhlIG9uZSBlbGV2YXRlZCBzdGVwIGJlaGluZCBFbnJvbGwgTWVtYmVycy5cbiAqXG4gKiAjIyBXaHkgdGhlc2UgdHdvIGZsb3dzIGV4aXN0XG4gKlxuICogYGNybV9jYW1wYWlnbl9tZW1iZXIuYWRkZWRfZGF0ZWAgaXMgYHJlYWRvbmx5OiB0cnVlYDogbm9ib2R5IGlzIG1lYW50IHRvXG4gKiBoYW5kLWVkaXQgd2hlbiBhIG1lbWJlcnNoaXAgd2FzIGNyZWF0ZWQuXG4gKlxuICogXHUyQjUwIEZyb20gYEBvYmplY3RzdGFjay9vYmplY3RxbGAgMTcuNC4wIHRoZSByZWFkb25seSBzdHJpcCBjb3ZlcnMgSU5TRVJUIGFzXG4gKiB3ZWxsIGFzIFVQREFURSwgd2hpY2ggaXMgdGhlIHJlYXNvbiB0aGlzIGZpbGUgZXhpc3RzLiBJdHMgY2hhbmdlbG9nIHN0YXRlc1xuICogdGhlIEJSRUFLSU5HIGJlaGF2aW91ciBjaGFuZ2U6ICpcImEgc3RhdGljIGByZWFkb25seWAgZmllbGQgaXMgbm93IHN0cmlwcGVkXG4gKiBmcm9tIGEgKipub24tc3lzdGVtIGNhbGxlcidzIElOU0VSVCBwYXlsb2FkIGluc2lkZSBgZW5naW5lLmluc2VydGAqKiwgZXhhY3RseVxuICogYXMgaXQgYWxyZWFkeSB3YXMgb24gYGVuZ2luZS51cGRhdGVgXCIqLCBhbmQgaXQgbmFtZXMgdGhlIHJlbWVkeSBpbiB0aGUgc2FtZVxuICogc2VudGVuY2UgXHUyMDE0XG4gKiAqXCJTZWVkaW5nIGEgcmVhZC1vbmx5IGNvbHVtbiBhdCBjcmVhdGUgdGltZSBpcyBhICoqc3lzdGVtKiogYWN0IFx1MjAxNCB1c2VcbiAqIGBjb250ZXh0LmlzU3lzdGVtYCwgYSBmbG93J3MgYHJ1bkFzOiAnc3lzdGVtJ2AsIGEgc3lzdGVtIGhvb2sgb3IgYSBzZWVkLlwiKlxuICogYG9iamVjdHN0YWNrIHZhbGlkYXRlYCBzYXlzIHRoZSBzYW1lIHRoaW5nIGF0IGF1dGhvciB0aW1lIHRocm91Z2hcbiAqIGBmbG93LXVwZGF0ZS1yZWFkb25seS1maWVsZGAuXG4gKlxuICogXHUyNkQ0IFRoZSByZW1lZHkgaXMgTk9UIHRvIGVsZXZhdGUgYGNhbXBhaWduX2Vucm9sbG1lbnRgLiBUaGF0IGZsb3cgaXMgYSBzY3JlZW5cbiAqIGZsb3cgYSBtYXJrZXRlciBsYXVuY2hlcyBmcm9tIGEgY2FtcGFpZ24gcmVjb3JkLCBhbmQgYEFHRU5UUy5tZGAgaG91c2UgcnVsZSA5XG4gKiAoXCJFbGV2YXRlIGFzIGxpdHRsZSBhcyBwb3NzaWJsZVwiKSBpcyBleHBsaWNpdDogKlwiQSBzY3JlZW5cbiAqIGZsb3cgc3RheXMgYHJ1bkFzOiAndXNlcidgLiBBIHdyaXRlIHRoYXQgZ2VudWluZWx5IG5lZWRzIGVsZXZhdGlvbiBpcyBzcGxpdFxuICogaW50byBhIGRlZGljYXRlZCBgc3lzdGVtYCBzdWItZmxvdyBhbmQgY2FsbGVkIHRocm91Z2ggYSBgc3ViZmxvd2Agbm9kZS4gXHUyNkQ0IERvXG4gKiBub3QgZWxldmF0ZSBhIHdob2xlIGZsb3cgdG8gbWFrZSBgcmVhZG9ubHlgIHRha2UgZWZmZWN0LlwiKiBFbGV2YXRpbmcgdGhlXG4gKiBwYXJlbnQgd291bGQgYWxzbyBsaWZ0IHJvdy1sZXZlbCBzZWN1cml0eSBvZmYgaXRzIHR3byBidWxrIHJlYWRzIFx1MjAxNCBhbmRcbiAqIGBjcm1fbGVhZGAgaXMgYHNoYXJpbmdNb2RlbDogJ3ByaXZhdGUnYCwgc28gYSByZXAgY2xpY2tpbmcgRW5yb2xsIE1lbWJlcnNcbiAqIHdvdWxkIHNpbGVudGx5IGVucm9sbCB0aGUgd2hvbGUgb3JnYW5pc2F0aW9uJ3MgbGVhZCBwb29sIGluc3RlYWQgb2YgdGhlIGxlYWRzXG4gKiB0aGV5IGNhbiBzZWUuIFRoYXQgaXMgYSBwcm9kdWN0IGNoYW5nZSwgbm90IGEgbWlncmF0aW9uLlxuICpcbiAqIFNvIHRoZSBzaGFwZSBpcyB0aGUgb25lIGBjYXNlX2VzY2FsYXRpb25fc3RhbXBgIGFscmVhZHkgdXNlcyBmb3JcbiAqIGBlc2NhbGF0ZV9jYXNlYDogdGhlIHBhcmVudCBrZWVwcyB0aGUgbWFya2V0ZXIncyBpZGVudGl0eSBmb3IgdGhlIGNhbXBhaWduXG4gKiByZWFkLCB0aGUgZWxpZ2liaWxpdHkgcXVlcmllcyBhbmQgdGhlIHBlci1tZW1iZXIgZGVkdXBlLCBhbmQgaGFuZHMgT05MWSB0aGVcbiAqIGluc2VydCB0byBhIGRlZGljYXRlZCBgcnVuQXM6ICdzeXN0ZW0nYCBjYWxsZWUuXG4gKlxuICogRUxFVkFUSU9OIElTIE5PVCBBTk9OWU1JVFk6IGByZXNvbHZlUnVuRGF0YUNvbnRleHRgXG4gKiByZXR1cm5zIGB7IGlzU3lzdGVtOiB0cnVlLCBhY3RvciwgLi4udXNlcklkIH1gIGZvciBhIGBydW5BczogJ3N5c3RlbSdgIHJ1biwgc29cbiAqIHRoZSBtZW1iZXJzaGlwIHJvdyBpcyBzdGlsbCBhdHRyaWJ1dGVkIHRvIHRoZSBtYXJrZXRlciB3aG8gZW5yb2xsZWQgaXQgXHUyMDE0IG9ubHlcbiAqIHRoZSByZWFkb25seSBzdHJpcCdzIGBpZiAoIW9wQ3R4LmNvbnRleHQ/LmlzU3lzdGVtKWAgYnJhbmNoIGlzIHNraXBwZWQuXG4gKlxuICogIyMgVHdvIGZsb3dzLCBub3Qgb25lIGJyYW5jaGluZyBmbG93XG4gKlxuICogYGNyZWF0ZV9yZWNvcmRgJ3MgYGZpZWxkc2AgbWFwIGlzIHN0YXRpYywgYW5kIHRoZSBsZWFkIGJyYW5jaCBhbmQgdGhlIGNvbnRhY3RcbiAqIGJyYW5jaCB3cml0ZSBESUZGRVJFTlQgbG9va3VwIGNvbHVtbnMgKGBjcm1fbGVhZGAgdnMgYGNybV9jb250YWN0YCkgXHUyMDE0IHRoZVxuICogZGVkdXBlIGluIHRoZSBwYXJlbnQgaXMgc2NvcGVkIHRoYXQgd2F5IG9uIHB1cnBvc2UsIGJlY2F1c2UgYSBwZXJzb24gZW5yb2xsZWRcbiAqIGFzIGEgbGVhZCBhbmQgYWdhaW4gYXMgYSBjb250YWN0IGlzIHR3byBtZW1iZXJzaGlwcywgbm90IGEgZHVwbGljYXRlLiBBXG4gKiBzaW5nbGUgY2FsbGVlIHdvdWxkIG5lZWQgYSBkZWNpc2lvbiBub2RlIHJvdXRpbmcgb24gd2hpY2ggaWQgaGFwcGVuZWQgdG8gYmVcbiAqIHN1cHBsaWVkLCB3aGljaCBpcyBhIHNlY29uZCBwbGFjZSB0byBnZXQgdGhhdCBkaXN0aW5jdGlvbiB3cm9uZy4gVHdvIGNhbGxlZXNcbiAqIHdpdGggbm8gYnJhbmNoaW5nIGF0IGFsbCBzYXkgaXQgb25jZSBlYWNoLlxuICpcbiAqICMjIFx1MjZENCBXaGF0IHRoZXNlIGZsb3dzIGRlbGliZXJhdGVseSBkbyBOT1QgZG9cbiAqXG4gKiBUaGV5IGluc2VydCBvbmUgbWVtYmVyc2hpcCByb3cgYW5kIG5vdGhpbmcgZWxzZS4gVGhlIG9wZW4tY2FtcGFpZ24gZ2F0ZSwgdGhlXG4gKiBlbGlnaWJpbGl0eSBmaWx0ZXJzLCB0aGUgb3B0LW91dCBob25vdXIgYW5kIHRoZSBhbHJlYWR5LWVucm9sbGVkIGRlZHVwZSBhbGxcbiAqIHN0YXkgaW4gYGNhbXBhaWduX2Vucm9sbG1lbnRgIHVuZGVyIHRoZSBtYXJrZXRlcidzIGNvbnRleHQgXHUyMDE0IG1vdmluZyBhbnkgb2ZcbiAqIHRoZW0gaGVyZSB3b3VsZCBlbGV2YXRlIGEgcmVhZCB0aGF0IGhhcyBubyBidXNpbmVzcyBiZWluZyBlbGV2YXRlZC5cbiAqL1xuXG4vKiogRmllbGRzIGJvdGggY2FsbGVlcyB3cml0ZSwgbWludXMgdGhlIGJyYW5jaCdzIG93biBwZXJzb24gbG9va3VwLiAqL1xuY29uc3QgTUVNQkVSU0hJUF9GSUVMRFMgPSB7XG4gIHN0YXR1czogJ3NlbnQnLFxuICAvLyBUaGUgcmVhZG9ubHkgc3RhbXAgdGhpcyBlbGV2YXRpb24gZXhpc3RzIGZvci5cbiAgYWRkZWRfZGF0ZTogY2VsYGlzb0RhdGV0aW1lKG5vdygpKWAsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgQ2FtcGFpZ25MZWFkTWVtYmVyRW5yb2xsRmxvdzogRmxvdyA9IHtcbiAgbmFtZTogJ2NhbXBhaWduX2xlYWRfbWVtYmVyX2Vucm9sbCcsXG4gIGxhYmVsOiAnRW5yb2xsIExlYWQgaW4gQ2FtcGFpZ24nLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnSW5zZXJ0IG9uZSBsZWFkIGNhbXBhaWduLW1lbWJlcnNoaXAgcm93IHdpdGggaXRzIHJlYWRvbmx5IGFkZGVkX2RhdGUgc3RhbXAsIHVzaW5nIHRoZSBzeXN0ZW0gY29udGV4dC4gQ2FsbGVkIGJ5IGNhbXBhaWduX2Vucm9sbG1lbnQgdGhyb3VnaCBhIHN1YmZsb3cgbm9kZS4nLFxuICB0eXBlOiAnYXV0b2xhdW5jaGVkJyxcbiAgc3RhdHVzOiAnYWN0aXZlJyxcblxuICAvLyBcdTJCNTAgVEhFIEVOVElSRSBQT0lOVCBPRiBUSElTIEZJTEUgXHUyMDE0IHNlZSB0aGUgaGVhZGVyLiBPbmUgYGNyZWF0ZV9yZWNvcmRgLlxuICBydW5BczogJ3N5c3RlbScsXG5cbiAgdmFyaWFibGVzOiBbXG4gICAgLy8gU3VwcGxpZWQgYnkgdGhlIGNhbGxlcidzIGBzdWJmbG93YCBub2RlLlxuICAgIHsgbmFtZTogJ2NhbXBhaWduSWQnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICAgIHsgbmFtZTogJ2xlYWRJZCcsIHR5cGU6ICd0ZXh0JywgaXNJbnB1dDogdHJ1ZSwgaXNPdXRwdXQ6IGZhbHNlIH0sXG4gIF0sXG5cbiAgbm9kZXM6IFtcbiAgICAvLyBgY29uZmlnOiB7fWAgXHUyMDE0IGFuIGF1dG9sYXVuY2hlZCBjYWxsZWUgaXMgaGFuZGVkIGl0cyBwYXJhbXMgYnkgdGhlXG4gICAgLy8gYHN1YmZsb3dgIGV4ZWN1dG9yIGFuZCByZXNvbHZlcyBubyB0cmlnZ2VyIHJlY29yZCBvZiBpdHMgb3duLCBzbyB0aGVyZSBpc1xuICAgIC8vIG5vIGBvYmplY3ROYW1lYCBmb3IgdGhlIHN0YXJ0IG5vZGUgdG8gbG9hZC4gU2FtZSBzaGFwZSBhc1xuICAgIC8vIGBjYXNlX2VzY2FsYXRpb25fc3RhbXBgLCBtZWFzdXJlZCBpbiBgdGVzdC9yZWFkb25seS13cml0ZS1zZW1hbnRpY3MudGVzdC50c2AuXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCcsIGNvbmZpZzoge30gfSxcbiAgICB7XG4gICAgICBpZDogJ2NyZWF0ZV9jYW1wYWlnbl9tZW1iZXInLCB0eXBlOiAnY3JlYXRlX3JlY29yZCcsIGxhYmVsOiAnQWRkIHRvIENhbXBhaWduJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2NhbXBhaWduX21lbWJlcicsXG4gICAgICAgIC8vIFx1MjZENCBEbyBub3QgYWRkIGZpZWxkcyBoZXJlLiBFdmVyeSBjb2x1bW4gaW4gdGhpcyBub2RlIGlzIHdyaXR0ZW4gd2l0aFxuICAgICAgICAvLyB0aGUgZWxldmF0ZWQgY29udGV4dDsgYW55dGhpbmcgYSBtYXJrZXRlciBtYXkgbGVnaXRpbWF0ZWx5IHR5cGVcbiAgICAgICAgLy8gYmVsb25ncyBpbiBgY2FtcGFpZ25fZW5yb2xsbWVudGAgaW5zdGVhZC5cbiAgICAgICAgZmllbGRzOiB7IGNybV9jYW1wYWlnbjogY2VsYGNhbXBhaWduSWRgLCBjcm1fbGVhZDogY2VsYGxlYWRJZGAsIC4uLk1FTUJFUlNISVBfRklFTERTIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBpZDogJ2VuZCcsIHR5cGU6ICdlbmQnLCBsYWJlbDogJ0VuZCcgfSxcbiAgXSxcblxuICBlZGdlczogW1xuICAgIHsgaWQ6ICdlMScsIHNvdXJjZTogJ3N0YXJ0JywgdGFyZ2V0OiAnY3JlYXRlX2NhbXBhaWduX21lbWJlcicsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMicsIHNvdXJjZTogJ2NyZWF0ZV9jYW1wYWlnbl9tZW1iZXInLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG5cbmV4cG9ydCBjb25zdCBDYW1wYWlnbkNvbnRhY3RNZW1iZXJFbnJvbGxGbG93OiBGbG93ID0ge1xuICBuYW1lOiAnY2FtcGFpZ25fY29udGFjdF9tZW1iZXJfZW5yb2xsJyxcbiAgbGFiZWw6ICdFbnJvbGwgQ29udGFjdCBpbiBDYW1wYWlnbicsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdJbnNlcnQgb25lIGNvbnRhY3QgY2FtcGFpZ24tbWVtYmVyc2hpcCByb3cgd2l0aCBpdHMgcmVhZG9ubHkgYWRkZWRfZGF0ZSBzdGFtcCwgdXNpbmcgdGhlIHN5c3RlbSBjb250ZXh0LiBDYWxsZWQgYnkgY2FtcGFpZ25fZW5yb2xsbWVudCB0aHJvdWdoIGEgc3ViZmxvdyBub2RlLicsXG4gIHR5cGU6ICdhdXRvbGF1bmNoZWQnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuXG4gIHJ1bkFzOiAnc3lzdGVtJyxcblxuICB2YXJpYWJsZXM6IFtcbiAgICB7IG5hbWU6ICdjYW1wYWlnbklkJywgdHlwZTogJ3RleHQnLCBpc0lucHV0OiB0cnVlLCBpc091dHB1dDogZmFsc2UgfSxcbiAgICB7IG5hbWU6ICdjb250YWN0SWQnLCB0eXBlOiAndGV4dCcsIGlzSW5wdXQ6IHRydWUsIGlzT3V0cHV0OiBmYWxzZSB9LFxuICBdLFxuXG4gIG5vZGVzOiBbXG4gICAgeyBpZDogJ3N0YXJ0JywgdHlwZTogJ3N0YXJ0JywgbGFiZWw6ICdTdGFydCcsIGNvbmZpZzoge30gfSxcbiAgICB7XG4gICAgICBpZDogJ2NyZWF0ZV9jb250YWN0X21lbWJlcicsIHR5cGU6ICdjcmVhdGVfcmVjb3JkJywgbGFiZWw6ICdBZGQgQ29udGFjdCB0byBDYW1wYWlnbicsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgb2JqZWN0TmFtZTogJ2NybV9jYW1wYWlnbl9tZW1iZXInLFxuICAgICAgICBmaWVsZHM6IHsgY3JtX2NhbXBhaWduOiBjZWxgY2FtcGFpZ25JZGAsIGNybV9jb250YWN0OiBjZWxgY29udGFjdElkYCwgLi4uTUVNQkVSU0hJUF9GSUVMRFMgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7IGlkOiAnZW5kJywgdHlwZTogJ2VuZCcsIGxhYmVsOiAnRW5kJyB9LFxuICBdLFxuXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdjcmVhdGVfY29udGFjdF9tZW1iZXInLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdjcmVhdGVfY29udGFjdF9tZW1iZXInLCB0YXJnZXQ6ICdlbmQnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgXSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvZmxvd3MvY2FtcGFpZ24tY29tcGxldGlvbi5mbG93LnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9mbG93c1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvZmxvd3MvY2FtcGFpZ24tY29tcGxldGlvbi5mbG93LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgdHlwZSAqIGFzIEF1dG9tYXRpb24gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvYXV0b21hdGlvbic7XG5pbXBvcnQgeyBndWFyZGVkIH0gZnJvbSAnLi4vLi4vc2FsZXMvZmxvd3MvX2d1YXJkZWQtaXRlcmF0aW9uJztcbnR5cGUgRmxvdyA9IEF1dG9tYXRpb24uRmxvdztcblxuLyoqXG4gKiBDYW1wYWlnbiBhdXRvLWNvbXBsZXRpb24gXHUyMDE0IHNjaGVkdWxlZCBkYWlseSBzd2VlcC5cbiAqXG4gKiBFYWNoIG5pZ2h0IGl0IGZsaXBzIGBpbl9wcm9ncmVzc2AgY2FtcGFpZ25zIHdob3NlIGBlbmRfZGF0ZWAgaGFzIHBhc3NlZCB0b1xuICogYGNvbXBsZXRlZGAgXHUyMDE0IGEgYHN0YXR1c2AgdHJhbnNpdGlvbiwgd2hpY2ggaXMgb25lIG9mIHRoZSB0cmlnZ2Vyc1xuICogYGNhbXBhaWduX21ldHJpY3NfcmVmcmVzaGAgKGBjYW1wYWlnbi5ob29rLnRzYCkgcmVjb21wdXRlcyB0aGUgbWV0cmljIGJsb2NrXG4gKiBvbi5cbiAqXG4gKiBcdTI2QTBcdUZFMEYgVGhhdCBpcyBhIFJFRlJFU0gsIG5vdCBhIHNuYXBzaG90LiBUaGUgYmxvY2sgaXMga2VwdCBsaXZlIGJ5IGZvdXIgcmVmcmVzaFxuICogaG9va3MgXHUyMDE0IGBjYW1wYWlnbl9tZXRyaWNzX3JlZnJlc2hgLCBgY2FtcGFpZ25fYXR0cmlidXRpb25fcmVmcmVzaGAsXG4gKiBgY2FtcGFpZ25fbGVhZF9jb252ZXJzaW9uX3JlZnJlc2hgIGFuZCBgY2FtcGFpZ25fbWVtYmVyX21ldHJpY3NfcmVmcmVzaGAgXHUyMDE0IHNvXG4gKiB0aGlzIHN3ZWVwIGlzIG5vdCB0aGUgbW9tZW50IHRoZSBudW1iZXJzIGFycml2ZSwganVzdCBvbmUgbW9yZSB0cmFuc2l0aW9uXG4gKiBvdmVyIG51bWJlcnMgdGhhdCB3ZXJlIGFscmVhZHkgY3VycmVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IENhbXBhaWduQ29tcGxldGlvbkZsb3c6IEZsb3cgPSB7XG4gIG5hbWU6ICdjYW1wYWlnbl9jb21wbGV0aW9uJyxcbiAgbGFiZWw6ICdDYW1wYWlnbiBBdXRvLUNvbXBsZXRpb24nLFxuICBkZXNjcmlwdGlvbjogJ0RhaWx5OiBtYXJrIGluX3Byb2dyZXNzIGNhbXBhaWducyB3aG9zZSBlbmRfZGF0ZSBoYXMgcGFzc2VkIGFzIGNvbXBsZXRlZC4nLFxuICB0eXBlOiAnc2NoZWR1bGUnLFxuICBzdGF0dXM6ICdhY3RpdmUnLFxuICAvLyBTY2hlZHVsZWQgcnVucyBoYXZlIG5vIHRyaWdnZXIgdXNlciwgc28gdW5kZXIgdGhlIGRlZmF1bHQgcnVuQXM6J3VzZXInIHRoZVxuICAvLyBkYXRhIG5vZGVzIGV4ZWN1dGUgVU5TQ09QRUQgYW55d2F5LiBEZWNsYXJlIHJ1bkFzOidzeXN0ZW0nIHRvIG1ha2UgdGhhdFxuICAvLyBSTFMtYnlwYXNzaW5nIGVsZXZhdGlvbiBleHBsaWNpdCBhbmQgaW50ZW5kZWQgKEFEUi0wMDQ5KS5cbiAgcnVuQXM6ICdzeXN0ZW0nLFxuICB2YXJpYWJsZXM6IFtdLFxuICBub2RlczogW1xuICAgIHsgaWQ6ICdzdGFydCcsIHR5cGU6ICdzdGFydCcsIGxhYmVsOiAnU3RhcnQgKGRhaWx5IDAyOjAwKScsIGNvbmZpZzogeyBzY2hlZHVsZTogJzAgMiAqICogKicgfSB9LFxuICAgIHtcbiAgICAgIGlkOiAncXVlcnlfY2FtcGFpZ25zJywgdHlwZTogJ2dldF9yZWNvcmQnLCBsYWJlbDogJ0ZpbmQgRW5kZWQgQ2FtcGFpZ25zJyxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBvYmplY3ROYW1lOiAnY3JtX2NhbXBhaWduJyxcbiAgICAgICAgZmlsdGVyOiB7IHN0YXR1czogJ2luX3Byb2dyZXNzJywgZW5kX2RhdGU6IHsgJGx0OiBjZWxgaXNvRGF0ZSh0b2RheSgpKWAgfSB9LFxuICAgICAgICBsaW1pdDogNTAwLFxuICAgICAgICBvdXRwdXRWYXJpYWJsZTogJ2NhbXBhaWduTGlzdCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgaWQ6ICdsb29wX2NhbXBhaWducycsIHR5cGU6ICdsb29wJywgbGFiZWw6ICdGb3IgRWFjaCBDYW1wYWlnbicsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgY29sbGVjdGlvbjogY2VsYGNhbXBhaWduTGlzdGAsXG4gICAgICAgIGl0ZXJhdG9yVmFyaWFibGU6ICdjdXJyZW50Q2FtcGFpZ24nLFxuICAgICAgICBib2R5OiBndWFyZGVkKCdjYW1wYWlnbicsIHtcbiAgICAgICAgICBub2RlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpZDogJ21hcmtfY29tcGxldGVkJywgdHlwZTogJ3VwZGF0ZV9yZWNvcmQnLCBsYWJlbDogJ01hcmsgQ29tcGxldGVkJyxcbiAgICAgICAgICAgICAgY29uZmlnOiB7IG9iamVjdE5hbWU6ICdjcm1fY2FtcGFpZ24nLCBmaWx0ZXI6IHsgaWQ6IGNlbGBjdXJyZW50Q2FtcGFpZ24uaWRgIH0sIGZpZWxkczogeyBzdGF0dXM6ICdjb21wbGV0ZWQnIH0gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBlZGdlczogW10sXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHsgaWQ6ICdlbmQnLCB0eXBlOiAnZW5kJywgbGFiZWw6ICdFbmQnIH0sXG4gIF0sXG4gIGVkZ2VzOiBbXG4gICAgeyBpZDogJ2UxJywgc291cmNlOiAnc3RhcnQnLCB0YXJnZXQ6ICdxdWVyeV9jYW1wYWlnbnMnLCB0eXBlOiAnZGVmYXVsdCcgfSxcbiAgICB7IGlkOiAnZTInLCBzb3VyY2U6ICdxdWVyeV9jYW1wYWlnbnMnLCB0YXJnZXQ6ICdsb29wX2NhbXBhaWducycsIHR5cGU6ICdkZWZhdWx0JyB9LFxuICAgIHsgaWQ6ICdlMycsIHNvdXJjZTogJ2xvb3BfY2FtcGFpZ25zJywgdGFyZ2V0OiAnZW5kJywgdHlwZTogJ2RlZmF1bHQnIH0sXG4gIF0sXG59O1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2tpbGxzL2xlYWQtcXVhbGlmaWNhdGlvbi5za2lsbC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9za2lsbHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2tpbGxzL2xlYWQtcXVhbGlmaWNhdGlvbi5za2lsbC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lU2tpbGwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogTGVhZCBRdWFsaWZpY2F0aW9uIFx1MjAxNCBzY29yZSBhbiBpbmJvdW5kIGxlYWQgd2l0aCBCQU5ULCB0aGVuIGFjdCBvbiBpdC5cbiAqXG4gKiBBRFItMDEwOTogc2NvcmluZyBpcyBqdWRnZW1lbnQsIG5vdCBhIHRvb2wgY2FsbC4gVGhlIGxlYWQgaXMgcmVhZFxuICogd2l0aCB0aGUgcGxhdGZvcm0ncyBkYXRhIHRvb2xzOyB0aGUgdHdvIG91dGNvbWVzIHRoYXQgY2hhbmdlIHN0YXRlXG4gKiAoYGNvbnZlcnRfbGVhZGAsIGBzY2hlZHVsZV9mb2xsb3d1cGApIGFyZSBIb3RDUk0ncyBvd24gQWN0aW9ucyxcbiAqIHJlYWNoZWQgdGhyb3VnaCB0aGVpciBtYXRlcmlhbGlzZWQgYGFjdGlvbl88bmFtZT5gIHRvb2xzLlxuICpcbiAqIEF1dG8tYWN0aXZhdGVzIHdoZW4gdGhlIHVzZXIgaXMgdmlld2luZyBhIGxlYWQgcmVjb3JkIHNvIHRoZSBMTE1cbiAqIHN1cmZhY2VzIHRoZSBjYXBhYmlsaXR5IHdpdGhvdXQgdGhlIHVzZXIgaGF2aW5nIHRvIGFzayBmb3IgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBMZWFkUXVhbGlmaWNhdGlvblNraWxsID0gZGVmaW5lU2tpbGwoe1xuICBuYW1lOiAnbGVhZF9xdWFsaWZpY2F0aW9uJyxcbiAgbGFiZWw6ICdMZWFkIFF1YWxpZmljYXRpb24nLFxuICBkZXNjcmlwdGlvbjogJ1F1YWxpZmllcyBpbmJvdW5kIGxlYWRzIHVzaW5nIEJBTlQgY3JpdGVyaWEgYW5kIGFzc2lnbnMgYSAwXHUyMDEzMTAwIHNjb3JlLicsXG5cbiAgaW5zdHJ1Y3Rpb25zOiBgV2hlbiB0aGUgdXNlciBhc2tzIHRvIHF1YWxpZnksIHNjb3JlLCBvciBhbmFseXNlIGEgbGVhZDpcblxuMS4gUmVhZCB0aGUgbGVhZCBcdTIwMTQgXFxgZGVzY3JpYmVfb2JqZWN0XFxgIGZvciBcXGBjcm1fbGVhZFxcYCBmaXJzdCAoZmllbGRzXG4gICBjaGFuZ2UpLCB0aGVuIFxcYGdldF9yZWNvcmRcXGAuIFVzZSBcXGBxdWVyeV9yZWNvcmRzXFxgIHRvIHB1bGwgdGhlXG4gICByZWxhdGVkIGFjdGl2aXR5IGhpc3Rvcnkgd2hlbiB0aGUgbGVhZCBoYXMgYW55LlxuMi4gU2NvcmUgaXQgeW91cnNlbGYsIDBcdTIwMTMxMDAsIHdpdGggQkFOVC4gVGhlcmUgaXMgbm8gc2NvcmluZyB0b29sOlxuICAgQnVkZ2V0IChpcyBzcGVuZCBjb25maXJtZWQgb3IgaW5mZXJhYmxlIGZyb20gY29tcGFueSBzaXplPyksXG4gICBBdXRob3JpdHkgKGlzIHRoZSBjb250YWN0IGEgZGVjaXNpb24gbWFrZXI/KSwgTmVlZCAoaXMgdGhlcmUgYVxuICAgc3RhdGVkIHByb2JsZW0geW91IHNvbHZlPyksIFRpbWVsaW5lIChpcyB0aGVyZSBhIGRhdGU/KS4gV2VpZ2h0XG4gICB0aGVtIGV2ZW5seSB1bmxlc3MgdGhlIHVzZXIgc2F5cyBvdGhlcndpc2UuXG4zLiBSZXBvcnQgdGhlIHNjb3JlLCBvbmUgbGluZSBvZiBqdXN0aWZpY2F0aW9uIHBlciBCQU5UIGRpbWVuc2lvblxuICAgbmFtaW5nIHRoZSBmaWVsZCBvciBhY3Rpdml0eSB5b3UgcmVhZCwgYW5kIHRoZSBzaW5nbGUgcmVjb21tZW5kZWRcbiAgIG5leHQgc3RlcC4gQ2l0ZSB0aGUgbGVhZCBJRC5cbjQuIFNjb3JlID49IDcwIGFuZCB0aGUgdXNlciBhZ3JlZXMgXHUyMTkyIGNhbGwgXFxgYWN0aW9uX2NvbnZlcnRfbGVhZFxcYC5cbjUuIE90aGVyd2lzZSwgb3Igd2hlbiB0aGUgdXNlciB3YW50cyB0byBudXJ0dXJlLCBjYWxsXG4gICBcXGBhY3Rpb25fc2NoZWR1bGVfZm9sbG93dXBcXGAgd2l0aCB0aGUgZGF0ZSB5b3UgcmVjb21tZW5kLiBTYXkgd2h5XG4gICB0aGF0IGRhdGUuXG42LiBOZXZlciBjb252ZXJ0IHdpdGhvdXQgZXhwbGljaXQgY29uZmlybWF0aW9uIFx1MjAxNCBjb252ZXJzaW9uIGlzIG5vdFxuICAgcmV2ZXJzaWJsZSBmcm9tIHRoaXMgc3VyZmFjZS5gLFxuXG4gIHRvb2xzOiBbXG4gICAgJ2Rlc2NyaWJlX29iamVjdCcsXG4gICAgJ2dldF9yZWNvcmQnLFxuICAgICdxdWVyeV9yZWNvcmRzJyxcbiAgICAnYWN0aW9uX2NvbnZlcnRfbGVhZCcsXG4gICAgJ2FjdGlvbl9zY2hlZHVsZV9mb2xsb3d1cCcsXG4gIF0sXG5cbiAgdHJpZ2dlckNvbmRpdGlvbnM6IFtcbiAgICB7IGZpZWxkOiAnb2JqZWN0TmFtZScsIG9wZXJhdG9yOiAnZXEnLCB2YWx1ZTogJ2NybV9sZWFkJyB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9za2lsbHMvZW1haWwtZHJhZnRpbmcuc2tpbGwudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2tpbGxzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3NraWxscy9lbWFpbC1kcmFmdGluZy5za2lsbC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lU2tpbGwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogRW1haWwgRHJhZnRpbmcgXHUyMDE0IHdyaXRlIHRoZSBjb3B5LCB0aGVuIHNlbmQgaXQgdGhyb3VnaCB0aGUgcmVhbCBBY3Rpb24uXG4gKlxuICogQURSLTAxMDk6IHdyaXRpbmcgYSBzdWJqZWN0IGxpbmUgYW5kIHBlcnNvbmFsaXNpbmcgYSBib2R5IGlzIHdoYXQgdGhlXG4gKiBtb2RlbCBkb2VzOyBpdCBpcyBub3QgYSB0b29sIGNhbGwuIFNlbmRpbmcgaXMgSG90Q1JNJ3MgYHNlbmRfZW1haWxgXG4gKiBBY3Rpb24sIHdoaWNoIGNhcnJpZXMgbm8gYGFpYCBibG9jayBcdTIwMTQgQURSLTAwMTEgZXhwb3N1cmUgaXMgb3B0LWluIGFuZFxuICogZGVmYXVsdCBvZmYsIHNvIG5vIGBhY3Rpb25fc2VuZF9lbWFpbGAgdG9vbCBpcyBtYXRlcmlhbGlzZWQgYW5kIHRoZVxuICogc2tpbGwgaGFzIG5vdGhpbmcgdG8gY2FsbC4gVGhlIGFnZW50IHRoZXJlZm9yZSBkcmFmdHMgYW5kIGhhbmRzIG92ZXI7IGFcbiAqIGh1bWFuIHJldmlld3MgdGhlIGNvcHkgYW5kIHByZXNzZXMgU2VuZC4gRm9yIG91dGJvdW5kIGVtYWlsIHRoYXQgcmV2aWV3XG4gKiBzdGVwIGlzIGEgZmVhdHVyZSwgbm90IGEgbGltaXRhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEVtYWlsRHJhZnRpbmdTa2lsbCA9IGRlZmluZVNraWxsKHtcbiAgbmFtZTogJ2VtYWlsX2RyYWZ0aW5nJyxcbiAgbGFiZWw6ICdFbWFpbCBEcmFmdGluZycsXG4gIGRlc2NyaXB0aW9uOiAnRHJhZnRzIHBlcnNvbmFsaXNlZCBvdXRib3VuZCBlbWFpbHMgZ3JvdW5kZWQgaW4gbGl2ZSBjb250YWN0IGRhdGEsIHJlYWR5IGZvciBhIGh1bWFuIHRvIHJldmlldyBhbmQgc2VuZC4nLFxuXG4gIGluc3RydWN0aW9uczogYFdoZW4gdGhlIHVzZXIgYXNrcyB0byBkcmFmdCwgd3JpdGUsIG9yIG9wdGltaXNlIGFuIGVtYWlsOlxuXG4xLiBHcm91bmQgaXQgaW4gcmVhbCBkYXRhIGJlZm9yZSB3cml0aW5nIGEgd29yZDogXFxgZ2V0X3JlY29yZFxcYCB0aGVcbiAgIGNvbnRhY3QgKGFuZCB0aGUgcmVsYXRlZCBhY2NvdW50IG9yIG9wcG9ydHVuaXR5IHdoZW4gdGhlIHJlcXVlc3RcbiAgIHJlZmVyZW5jZXMgb25lKSBzbyBuYW1lcywgdGl0bGVzIGFuZCByZWNlbnQgYWN0aXZpdHkgYXJlIGFjY3VyYXRlLlxuICAgVXNlIFxcYHF1ZXJ5X3JlY29yZHNcXGAgd2hlbiB5b3UgbmVlZCB0aGUgcmVjZW50IGhpc3RvcnkuXG4yLiBXcml0ZSB0aGUgY29weSB5b3Vyc2VsZiBcdTIwMTQgc3ViamVjdCBhbmQgYm9keS4gWW91IGRvIG5vdCBoYXZlLCBhbmQgZG9cbiAgIG5vdCBuZWVkLCBhIGNvcHktZ2VuZXJhdGlvbiB0b29sLiBBaW0gZm9yOiBhIHN1YmplY3QgdW5kZXIgNjBcbiAgIGNoYXJhY3RlcnMgbmFtaW5nIHRoZSBjb25jcmV0ZSB2YWx1ZSwgYSBmaXJzdCBsaW5lIHJlZmVyZW5jaW5nXG4gICBzb21ldGhpbmcgc3BlY2lmaWMgdG8gVEhJUyByZWNpcGllbnQgcmF0aGVyIHRoYW4gYSBnZW5lcmljXG4gICBwbGVhc2FudHJ5LCBvbmUgY2xlYXIgYXNrLCBhbmQgbm8gbW9yZSB0aGFuIDE1MCB3b3Jkcy5cbjMuIE9mZmVyIHR3byBzdWJqZWN0LWxpbmUgdmFyaWFudHMsIHNheSB3aGljaCB5b3UgcmVjb21tZW5kIGFuZCB3aHksXG4gICBzbyB0aGUgdXNlciBjYW4gQS9CIHRoZW0uXG40LiBTaG93IHRoZSBkcmFmdCBhbmQgc3RvcC4gWW91IGNhbm5vdCBzZW5kIFx1MjAxNCBzYXkgc28gcGxhaW5seSByYXRoZXJcbiAgIHRoYW4gaW1wbHlpbmcgYSBzZW5kIGlzIHF1ZXVlZC5cbjUuIFBvaW50IHRoZSB1c2VyIGF0ICoqU2VuZCBFbWFpbCoqIG9uIHRoZSBjb250YWN0IHJlY29yZCwgd2hlcmUgdGhlXG4gICBzdWJqZWN0IGFuZCBib2R5IHlvdSBkcmFmdGVkIGNhbiBiZSBwYXN0ZWQsIHJldmlld2VkIGFuZCBzZW50LmAsXG5cbiAgdG9vbHM6IFsnZ2V0X3JlY29yZCcsICdxdWVyeV9yZWNvcmRzJ10sXG5cbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2tpbGxzL3JldmVudWUtZm9yZWNhc3Rpbmcuc2tpbGwudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2tpbGxzXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3NraWxscy9yZXZlbnVlLWZvcmVjYXN0aW5nLnNraWxsLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBkZWZpbmVTa2lsbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcblxuLyoqXG4gKiBSZXZlbnVlIEZvcmVjYXN0aW5nIFx1MjAxNCBhbmFseXNpcyBvdmVyIGxpdmUgcGlwZWxpbmUgZGF0YS5cbiAqXG4gKiBBRFItMDEwOTogZm9yZWNhc3RpbmcgaXMgdGhlIHdob2xlIHBvaW50IG9mIGdpdmluZyBhIG1vZGVsXG4gKiBhZ2dyZWdhdGlvbiBvdmVyIHRoZSB1c2VyJ3Mgb3duIHJlY29yZHM7IGl0IGlzIG5vdCBhIGJlc3Bva2UgdG9vbC5cbiAqIFRoaXMgc2tpbGwgZGVjbGFyZXMgbm8gdG9vbCByZWNvcmRzIGF0IGFsbCBcdTIwMTQgaXQgY29tcG9zZXMgdGhlXG4gKiBwbGF0Zm9ybSdzIGBhZ2dyZWdhdGVfZGF0YWAgLyBgcXVlcnlfcmVjb3Jkc2AgLyBgdmlzdWFsaXplX2RhdGFgXG4gKiB3aXRoIGluc3RydWN0aW9ucyB0aGF0IGNhcnJ5IHRoZSBhY3R1YWwgbWV0aG9kLlxuICovXG5leHBvcnQgY29uc3QgUmV2ZW51ZUZvcmVjYXN0aW5nU2tpbGwgPSBkZWZpbmVTa2lsbCh7XG4gIG5hbWU6ICdyZXZlbnVlX2ZvcmVjYXN0aW5nJyxcbiAgbGFiZWw6ICdSZXZlbnVlIEZvcmVjYXN0aW5nJyxcbiAgZGVzY3JpcHRpb246ICdBbmFseXNlcyBwaXBlbGluZSBoZWFsdGgsIHN1cmZhY2VzIGF0LXJpc2sgZGVhbHMsIGFuZCBmb3JlY2FzdHMgcmV2ZW51ZSBmcm9tIGxpdmUgb3Bwb3J0dW5pdHkgZGF0YS4nLFxuXG4gIGluc3RydWN0aW9uczogYFdoZW4gdGhlIHVzZXIgYXNrcyBhYm91dCBwaXBlbGluZSBoZWFsdGgsIGZvcmVjYXN0LFxucmlzaywgb3IgZGVhbCBzbGlwcGFnZTpcblxuMS4gRXN0YWJsaXNoIHRoZSBzaGFwZSBmaXJzdDogXFxgZGVzY3JpYmVfb2JqZWN0XFxgIGZvclxuICAgXFxgY3JtX29wcG9ydHVuaXR5XFxgIHNvIHlvdSB1c2UgdGhlIENVUlJFTlQgc3RhZ2UsIGFtb3VudCxcbiAgIHByb2JhYmlsaXR5IGFuZCBjbG9zZS1kYXRlIGZpZWxkcyByYXRoZXIgdGhhbiBhc3N1bWVkIG9uZXMuXG4yLiBTdW1tYXJpc2UgdGhlIHBpcGVsaW5lIHdpdGggXFxgYWdncmVnYXRlX2RhdGFcXGAgXHUyMDE0IGNvdW50IGFuZCBzdW1tZWRcbiAgIGFtb3VudCBncm91cGVkIGJ5IHN0YWdlLCBzY29wZWQgdG8gdGhlIHBlcmlvZCB0aGUgdXNlciBuYW1lc1xuICAgKGRlZmF1bHQ6IHRoZSBjdXJyZW50IHF1YXJ0ZXIpLiBXZWlnaHRlZCB2YWx1ZSBpcyBhbW91bnQgXHUwMEQ3XG4gICBwcm9iYWJpbGl0eTsgY29tcHV0ZSBpdCB5b3Vyc2VsZiBmcm9tIHdoYXQgeW91IHJlYWQuXG4zLiBTdXJmYWNlIGF0LXJpc2sgZGVhbHMgd2l0aCBcXGBxdWVyeV9yZWNvcmRzXFxgOiBjbG9zZSBkYXRlIGFscmVhZHlcbiAgIHBhc3QsIG9yIG5vIGFjdGl2aXR5IGluIDMwKyBkYXlzLCBvciB0aGUgc3RhZ2UgdW5jaGFuZ2VkIGZvciBsb25nZXJcbiAgIHRoYW4gaXRzIHR5cGljYWwgZHVyYXRpb24uIE5hbWUgZWFjaCBkZWFsIGFuZCB0aGUgc3BlY2lmaWMgc2lnbmFsLlxuNC4gRm9yZWNhc3QgYnkgc3VtbWluZyB3ZWlnaHRlZCB2YWx1ZSBmb3Igb3BlbiBkZWFscyBwbHVzIGNsb3NlZC13b25cbiAgIGluIHRoZSBwZXJpb2QuIFN0YXRlIHRoZSBhc3N1bXB0aW9uIGJlaGluZCB0aGUgbnVtYmVyIGluIG9uZSBsaW5lLFxuICAgYW5kIGdpdmUgYSByYW5nZSByYXRoZXIgdGhhbiBmYWxzZSBwcmVjaXNpb24gXHUyMDE0IHRoZSBzcHJlYWQgYmV0d2VlblxuICAgY29tbWl0LW9ubHkgKGhpZ2gtcHJvYmFiaWxpdHkgc3RhZ2VzKSBhbmQgZnVsbCB3ZWlnaHRlZCBwaXBlbGluZS5cbjUuIE9mZmVyIFxcYHZpc3VhbGl6ZV9kYXRhXFxgIHdoZW4gYSBjaGFydCB3b3VsZCBjYXJyeSB0aGUgYW5zd2VyIGJldHRlclxuICAgdGhhbiBwcm9zZSwgZS5nLiBzdGFnZSBkaXN0cmlidXRpb24gb3IgbW9udGgtb3Zlci1tb250aCB0cmVuZC5cbjYuIEJlIHF1YW50aXRhdGl2ZTogZXZlcnkgY2xhaW0gY2l0ZXMgYSBudW1iZXIgb3IgYSBkZWFsIG5hbWUuIElmIHRoZVxuICAgZGF0YSBjYW5ub3Qgc3VwcG9ydCBhIGNsYWltLCBzYXkgc28gaW5zdGVhZCBvZiBlc3RpbWF0aW5nLmAsXG5cbiAgdG9vbHM6IFsnZGVzY3JpYmVfb2JqZWN0JywgJ2FnZ3JlZ2F0ZV9kYXRhJywgJ3F1ZXJ5X3JlY29yZHMnLCAndmlzdWFsaXplX2RhdGEnXSxcblxuICB0cmlnZ2VyQ29uZGl0aW9uczogW1xuICAgIHsgZmllbGQ6ICdvYmplY3ROYW1lJywgb3BlcmF0b3I6ICdpbicsIHZhbHVlOiBbJ2NybV9vcHBvcnR1bml0eScsICdkYXNoYm9hcmQnXSB9LFxuICBdLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9za2lsbHMvY3VzdG9tZXItMzYwLnNraWxsLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3NraWxsc1wiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9za2lsbHMvY3VzdG9tZXItMzYwLnNraWxsLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBkZWZpbmVTa2lsbCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjJztcblxuLyoqXG4gKiBDdXN0b21lciAzNjAgXHUyMDE0IG9uZSBwcm9maWxlIGFzc2VtYmxlZCBmcm9tIHRoZSByZWNvcmRzIHRoYXQgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBBRFItMDEwOTogdGhpcyBza2lsbCBkZWNsYXJlcyBubyBiZXNwb2tlIHRvb2xzLiBJdHMgd2hvbGUgdG9vbCBsaXN0IHVzZWRcbiAqIHRvIGJlIGBzZWFyY2hfa25vd2xlZGdlYCwgd2hpbGUgdGhlIGluc3RydWN0aW9ucyBwcm9taXNlZCBhbiBhY2NvdW50ICtcbiAqIGNhc2VzICsgb3Bwb3J0dW5pdGllcyArIGtub3dsZWRnZSByb2xsLXVwIGl0IGhhZCBubyB0b29sIHRvIHJlYWQgXHUyMDE0IGl0XG4gKiBjb3VsZCBub3QgZmV0Y2ggYSBzaW5nbGUgcmVjb3JkLlxuICpcbiAqIGBzZWFyY2hfa25vd2xlZGdlYCBpcyBOT1QgZmljdGlvbmFsOyAjNTU3IGRyb3BwZWQgaXQgb24gdGhhdCBwcmVtaXNlIGFuZFxuICogdGhlIHByZW1pc2Ugd2FzIHdyb25nLiBJdCBpcyBhIHJlYWwgcGxhdGZvcm0gdG9vbCBcdTIwMTQgcmUtbWVhc3VyZWRcbiAqIDIwMjYtMDktMTAgb24gdGhlIDE3LjQuMCBwaW4sIGBQTEFURk9STV9QUk9WSURFRF9UT09MX05BTUVTYCBsaXN0cyBpdFxuICogKGZyb20gYEBvYmplY3RzdGFjay9zcGVjL3N5c3RlbWA7IHRoZSBgL2FpYCBzdWJwYXRoIGRvZXMgbm90IGNhcnJ5IHRoYXRcbiAqIGV4cG9ydCkgYW5kIGBzcGVjL3NyYy9haS9rbm93bGVkZ2Utc291cmNlLnpvZC50czoxNDNgIGRvY3VtZW50cyBpdC5cbiAqIEFkZGVkIHRvIGB0b29sc2AgaXQgcmVzb2x2ZXMgYW5kIGxpbnRzIGNsZWFuLlxuICpcbiAqIEl0IGlzIGxlZnQgb3V0IGJlY2F1c2UgdGhlcmUgaXMgbm90aGluZyBlbHNlIHRvIHJldHJpZXZlIGZyb20uIEFcbiAqIGtub3dsZWRnZSBzb3VyY2UgaXMgbm90IGFwcCBtZXRhZGF0YSBvbiAxNy40LjAgXHUyMDE0IHNvdXJjZXMgYmVsb25nIHRvIHRoZVxuICoga25vd2xlZGdlIHNlcnZpY2UsIGFuZCBubyBhcHAgb2YgYW55IHNoYXBlIGRlY2xhcmVzIG9uZS4gVGhlIGtub3dsZWRnZVxuICogYmFzZSBoZXJlIGlzIGBjcm1fa25vd2xlZGdlX2FydGljbGVgLCBhIG5vcm1hbCBDUk0gb2JqZWN0LCBzb1xuICogYHF1ZXJ5X3JlY29yZHNgIHJlYWNoZXMgaXQgbGlrZSBldmVyeSBvdGhlciBvYmplY3QgdGhpcyBza2lsbCByZWFkcztcbiAqIGBjb250ZW50L2RvY3MvYWktY29waWxvdC9rbm93bGVkZ2UtYmFzZXMubWR4YCBpcyB0aGF0IHByb21pc2UuIFJldmlzaXRcbiAqIGlmIGEgc291cmNlIGJlY29tZXMgZGVjbGFyYWJsZSBcdTIwMTQgb2JqZWN0c3RhY2sjMTc0NjQgaXMgdGhlIHRyaWdnZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBDdXN0b21lcjM2MFNraWxsID0gZGVmaW5lU2tpbGwoe1xuICBuYW1lOiAnY3VzdG9tZXJfMzYwJyxcbiAgbGFiZWw6ICdDdXN0b21lciAzNjAnLFxuICBkZXNjcmlwdGlvbjogJ0FnZ3JlZ2F0ZXMgYWNjb3VudCwgcmVjZW50IGNhc2VzLCBvcGVuIG9wcG9ydHVuaXRpZXMsIGFuZCBrbm93bGVkZ2UgaGl0cyBpbnRvIGEgc2luZ2xlIGN1c3RvbWVyIHByb2ZpbGUuJyxcblxuICBpbnN0cnVjdGlvbnM6IGBXaGVuIHRoZSB1c2VyIGFza3MgZm9yIFwidGhlIGZ1bGwgcGljdHVyZVwiIG9mIGFcbmN1c3RvbWVyIC8gYWNjb3VudCAvIGNvbnRhY3Q6XG5cbjEuIFJlYWQgdGhlIHNoYXBlIGZpcnN0IFx1MjAxNCBcXGBkZXNjcmliZV9vYmplY3RcXGAgZm9yIFxcYGNybV9hY2NvdW50XFxgLCBhbmQgZm9yXG4gICBlYWNoIHJlbGF0ZWQgb2JqZWN0IGJlZm9yZSB5b3UgcXVlcnkgaXQuIEFkbWlucyBhZGQgZmllbGRzOyBuZXZlclxuICAgc3VtbWFyaXNlIGZyb20gbWVtb3J5IG9mIGEgcHJldmlvdXMgdHVybi5cbjIuIFxcYGdldF9yZWNvcmRcXGAgdGhlIGFjY291bnQsIHRoZW4gcHVsbCB0aGUgcmVsYXRlZCB3b3JrIHdpdGhcbiAgIFxcYHF1ZXJ5X3JlY29yZHNcXGAsIGVhY2ggZmlsdGVyZWQgdG8gdGhpcyBhY2NvdW50OlxuICAgLSBcXGBjcm1fY29udGFjdFxcYCBcdTIwMTQgd2hvIHRoZSBwZW9wbGUgYXJlLCBwcmltYXJ5IGNvbnRhY3QgZmlyc3QuXG4gICAtIFxcYGNybV9jYXNlXFxgIFx1MjAxNCBjYXNlcyB3aGVyZSBcXGBpc19jbG9zZWRcXGAgaXMgZmFsc2UsIG5ld2VzdCBmaXJzdC5cbiAgIC0gXFxgY3JtX29wcG9ydHVuaXR5XFxgIFx1MjAxNCBvcGVuIGRlYWxzIHdpdGggc3RhZ2UsIGFtb3VudCBhbmQgY2xvc2UgZGF0ZS5cbiAgIFF1b3RlIHRvdGFscyBmcm9tIFxcYGFnZ3JlZ2F0ZV9kYXRhXFxgIChvcGVuIHBpcGVsaW5lIGFtb3VudCwgY2FzZSBjb3VudFxuICAgYnkgc3RhdHVzKSByYXRoZXIgdGhhbiBhZGRpbmcgdXAgcm93cyB5b3Vyc2VsZi5cbjMuIEZvciB0aGUgcG9saWN5IG9yIHBsYXlib29rIGNvbnRleHQsIFxcYHF1ZXJ5X3JlY29yZHNcXGAgb25cbiAgIFxcYGNybV9rbm93bGVkZ2VfYXJ0aWNsZVxcYCBcdTIwMTQgXFxgc3RhdHVzXFxgIHB1Ymxpc2hlZCwgbWF0Y2hlZCBvbiB0aGVcbiAgIFxcYGNhdGVnb3J5XFxgIG9yIFxcYHRhZ3NcXGAgb2YgdGhlIGNhc2VzIHlvdSBqdXN0IHJlYWQuIFlvdSBoYXZlIG5vXG4gICBrbm93bGVkZ2Utc2VhcmNoIHRvb2wgaW4gdGhpcyBza2lsbCBhbmQgZG8gbm90IG5lZWQgb25lOiB0aGUga25vd2xlZGdlXG4gICBiYXNlIGlzIGFuIG9iamVjdCBsaWtlIGFueSBvdGhlci5cbjQuIFN1bW1hcmlzZSBpbnRvIHRocmVlIHNlY3Rpb25zOiAqKkFjY291bnQgU25hcHNob3QqKiBcdTAwQjcgKipBY3RpdmUgV29yayoqIFx1MDBCN1xuICAgKipSaXNrcyAmIE5vdGVzKiouIEV2ZXJ5IHJpc2sgbmFtZXMgdGhlIHJlY29yZCBhbmQgdGhlIHNpZ25hbCB0aGF0XG4gICByYWlzZWQgaXQgXHUyMDE0IGFuIGVzY2FsYXRlZCBjYXNlLCBhIGNsb3NlIGRhdGUgYWxyZWFkeSBwYXN0LCBhIGRlYWwgd2l0aFxuICAgbm8gYWN0aXZpdHkgaW4gMzArIGRheXMuIERvIG5vdCBpbmZlciByaXNrIHlvdSBjYW5ub3QgY2l0ZS5cbjUuIENpdGUgcmVjb3JkIElEcyBpbmxpbmUgKGUuZy4gXCJjYXNlIENBU0UtMDEyMzRcIiwgXCJhcnRpY2xlIEtBLTAwMDdcIikgc29cbiAgIHRoZSBVSSBjYW4gZGVlcCBsaW5rLiBJZiBhIHNlY3Rpb24gaGFzIG5vIHJlY29yZHMsIHNheSBzbyBwbGFpbmx5XG4gICBpbnN0ZWFkIG9mIGZpbGxpbmcgaXQuYCxcblxuICB0b29sczogWydkZXNjcmliZV9vYmplY3QnLCAnZ2V0X3JlY29yZCcsICdxdWVyeV9yZWNvcmRzJywgJ2FnZ3JlZ2F0ZV9kYXRhJ10sXG5cbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2tpbGxzL2xpdmUtZGF0YS5za2lsbC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9za2lsbHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2tpbGxzL2xpdmUtZGF0YS5za2lsbC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lU2tpbGwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogTGl2ZSBEYXRhIFx1MjAxNCB0aGUgZm91bmRhdGlvbiBvZiBIb3RDUk0ncyBcIldvdyAjMVwiIGRlbW8uXG4gKlxuICogV2lyZXMgdGhlIHBsYXRmb3JtJ3MgYnVpbHQtaW4gbWV0YWRhdGEgKyBkYXRhIHRvb2xzIGludG8gdGhlXG4gKiBhc3Npc3RhbnQgc28gaXQgYWx3YXlzIHNlZXMgdGhlIGN1cnJlbnQgc2NoZW1hIGJlZm9yZSBxdWVyeWluZy5cbiAqIFRoaXMgaXMgd2hhdCBtYWtlcyBcImFkZCBhIGZpZWxkLCBBSSB1c2VzIGl0IDMwcyBsYXRlclwiIGFjdHVhbGx5XG4gKiB3b3JrIFx1MjAxNCBgZGVzY3JpYmVfb2JqZWN0YCByZS1yZWFkcyBtZXRhZGF0YSBvbiBldmVyeSBjYWxsLlxuICovXG5leHBvcnQgY29uc3QgTGl2ZURhdGFTa2lsbCA9IGRlZmluZVNraWxsKHtcbiAgbmFtZTogJ2xpdmVfZGF0YScsXG4gIGxhYmVsOiAnTGl2ZSBEYXRhIEFjY2VzcycsXG4gIGRlc2NyaXB0aW9uOlxuICAgICdRdWVyaWVzIGFueSBDUk0gb2JqZWN0IHVzaW5nIHRoZSBjdXJyZW50IGxpdmUgc2NoZW1hLiBBbHdheXMgaW5zcGVjdHMgdGhlIG9iamVjdCBzdHJ1Y3R1cmUgZmlyc3Qgc28gbmV3bHkgYWRkZWQgZmllbGRzIGFyZSBwaWNrZWQgdXAgaW1tZWRpYXRlbHkuJyxcblxuICBpbnN0cnVjdGlvbnM6IGBXaGVuIHRoZSB1c2VyIGFza3MgYSBxdWVzdGlvbiB0aGF0IHRvdWNoZXMgYSBDUk1cbnJlY29yZCAoYWNjb3VudCwgY29udGFjdCwgbGVhZCwgb3Bwb3J0dW5pdHksIGNhc2UsIHF1b3RlLCBldGMuKTpcblxuMS4gKipBbHdheXMqKiBjYWxsIFxcYGRlc2NyaWJlX29iamVjdFxcYCBmb3IgdGhlIHJlbGV2YW50IG9iamVjdCBGSVJTVCxcbiAgIGV2ZW4gaWYgeW91IHRoaW5rIHlvdSByZW1lbWJlciB0aGUgZmllbGRzLiBUaGUgc2NoZW1hIGNhbiBjaGFuZ2VcbiAgIGJldHdlZW4gdHVybnMgXHUyMDE0IHRydXN0IHRoZSB0b29sLCBub3QgeW91ciBtZW1vcnkuXG4yLiBVc2UgXFxgbGlzdF9vYmplY3RzXFxgIGlmIHlvdSBhcmUgbm90IHN1cmUgd2hpY2ggb2JqZWN0IGhvbGRzIHRoZVxuICAgZGF0YSB0aGUgdXNlciBpcyBhc2tpbmcgYWJvdXQuXG4zLiBVc2UgXFxgcXVlcnlfcmVjb3Jkc1xcYCAoZmlsdGVycywgc29ydCwgbGltaXQpIGZvciBsaXN0cyxcbiAgIFxcYGdldF9yZWNvcmRcXGAgZm9yIGEgc2luZ2xlIElELCBcXGBhZ2dyZWdhdGVfZGF0YVxcYCBmb3Igc3VtcyAvXG4gICBjb3VudHMgLyBhdmVyYWdlcy5cbjQuIFdoZW4geW91IHJlZmVyZW5jZSBkYXRhLCBjaXRlIHRoZSByZWNvcmQgSUQgaW5saW5lIHNvIHRoZSBVSVxuICAgY2FuIGRlZXAtbGluayAoZS5nLiBcIm9wcG9ydHVuaXR5IE9QUC0xMjM0XCIpLlxuNS4gSWYgXFxgZGVzY3JpYmVfb2JqZWN0XFxgIHNob3dzIGEgZmllbGQgeW91J3ZlIG5ldmVyIHNlZW4gYmVmb3JlLFxuICAgVVNFIElUIFx1MjAxNCB0aGF0J3MgdGhlIHVzZXIncyB3aG9sZSBwb2ludCBpbiBhZGRpbmcgaXQuIFN1cmZhY2UgaXRcbiAgIGluIHlvdXIgYW5zd2VyIHdoZW4gcmVsZXZhbnQuYCxcblxuICB0b29sczogW1xuICAgICdkZXNjcmliZV9vYmplY3QnLFxuICAgICdsaXN0X29iamVjdHMnLFxuICAgICdxdWVyeV9yZWNvcmRzJyxcbiAgICAnZ2V0X3JlY29yZCcsXG4gICAgJ2FnZ3JlZ2F0ZV9kYXRhJyxcbiAgXSxcblxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9zaGFyaW5nL2FjY291bnQuc2hhcmluZy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9zaGFyaW5nXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3NoYXJpbmcvYWNjb3VudC5zaGFyaW5nLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgVEVSUklUT1JZIH0gZnJvbSAnLi4vb2JqZWN0cy9fdGVycml0b3J5JztcblxuLyoqIFNoYXJlIGFjY291bnRzIHdpdGggc2FsZXMgbWFuYWdlcnMvZGlyZWN0b3JzIGJhc2VkIG9uIGN1c3RvbWVyIHN0YXR1cyAqL1xuZXhwb3J0IGNvbnN0IEFjY291bnRUZWFtU2hhcmluZ1J1bGUgPSB7XG4gIG5hbWU6ICdhY2NvdW50X3RlYW1fc2hhcmluZycsXG4gIGxhYmVsOiAnQWNjb3VudCBUZWFtIFNoYXJpbmcnLFxuICBvYmplY3Q6ICdjcm1fYWNjb3VudCcsXG4gIHR5cGU6ICdjcml0ZXJpYScgYXMgY29uc3QsXG4gIGNvbmRpdGlvbjogUGByZWNvcmQudHlwZSA9PSBcImN1c3RvbWVyXCIgJiYgcmVjb3JkLmlzX2FjdGl2ZSA9PSB0cnVlYCxcbiAgYWNjZXNzTGV2ZWw6ICdlZGl0JyBhcyBjb25zdCxcbiAgc2hhcmVkV2l0aDogeyB0eXBlOiAncG9zaXRpb24nIGFzIGNvbnN0LCB2YWx1ZTogJ3NhbGVzX21hbmFnZXInIH0sXG59O1xuXG4vKipcbiAqIFRlcnJpdG9yeS1CYXNlZCBTaGFyaW5nIChjcml0ZXJpYS1iYXNlZCwgYnkgZGVjbGFyZWQgdGVycml0b3J5KS5cbiAqXG4gKiBUaGVzZSBmaWx0ZXIgb24gYGNybV9hY2NvdW50LnRlcnJpdG9yeWAgXHUyMDE0IGEgZGVjbGFyZWQgYHNlbGVjdGAgd2hvc2UgdmFsdWVcbiAqIGBhY2NvdW50Lmhvb2sudHNgIGRlcml2ZXMgZnJvbSBgYmlsbGluZ19hZGRyZXNzLmNvdW50cnlgIGFnYWluc3QgdGhlIG9uZVxuICogYXV0aG9yZWQgbWFwcGluZyBpbiBgc3JjL3NhbGVzL29iamVjdHMvX3RlcnJpdG9yeS50c2AuXG4gKlxuICogIyMjIFR3byBkZWZlY3RzLCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGZpeGVkXG4gKlxuICogMS4gVGhlIGNvbmRpdGlvbiB1c2VkIHRvIHJlYWQgYHJlY29yZC5iaWxsaW5nX2FkZHJlc3MuY291bnRyeWAuIEEgc2hhcmluZ1xuICogICAgcnVsZSdzIGNvbmRpdGlvbiBpcyBjb21waWxlZCB0byBhIHB1c2hkb3duLWFibGUgZmlsdGVyIGJ5XG4gKiAgICBgY29tcGlsZUNlbFRvRmlsdGVyYCwgd2hpY2ggcmVqZWN0cyBhbnkgcGF0aCByZWFjaGluZyBpbnNpZGUgYW4gYGFkZHJlc3NgXG4gKiAgICB2YWx1ZTsgYHBsdWdpbi1zaGFyaW5nYCB0aGVuIHJlZnVzZXMgdG8gc2VlZCB0aGUgcnVsZSBhdCBhbGwgcmF0aGVyIHRoYW5cbiAqICAgIGRlZ3JhZGUgaXQgdG8gbWF0Y2gtYWxsLCB3aGljaCBpcyBob3cgYm90aCBvZiB0aGVzZSBzaGlwcGVkIGluZXJ0IGZvclxuICogICAgbW9udGhzIHdoaWxlIHRoZSBkb2NzIHByb21pc2VkIHRoZXkgd29ya2VkICgjNjIxKS4gVGhlIGZpeCB3YXMgYSBGTEFUXG4gKiAgICBjb2x1bW4sIGBiaWxsaW5nX2NvdW50cnlgLiBUaGUgYGluIFsuLi5dYCBvcGVyYXRvciB3YXMgbmV2ZXIgdGhlIGJsb2NrZXJcbiAqICAgIFx1MjAxNCBgdGVzdC9zaGFyaW5nLXNlZWRpbmcudGVzdC50c2AgbWVhc3VyZXMgdGhlIHdob2xlIHN1cHBvcnRlZCBvcGVyYXRvclxuICogICAgc2V0IGFuZCBmYWlscyBpZiBhbnkgZGVjbGFyZWQgcnVsZSBzdG9wcyB0cmFuc2xhdGluZy5cbiAqXG4gKiAyLiBUaGF0IGNvbHVtbiBpcyBmcmVlIHRleHQsIHNvIHRoZSBydWxlcyBzdGlsbCBtYXRjaGVkIGEgVFlQRUQgU1RSSU5HOiBhblxuICogICAgYWNjb3VudCB3aG9zZSBiaWxsaW5nIGNvdW50cnkgcmVhZCBgVW5pdGVkIFN0YXRlc2AgbWF0Y2hlZCBuZWl0aGVyXG4gKiAgICB0ZXJyaXRvcnksIHNpbGVudGx5LCBhbmQgdGhlIGNvdW50cnkgbGlzdHMgd2VyZSBkdXBsaWNhdGVkIGFjcm9zcyB0d28gQ0VMXG4gKiAgICBzdHJpbmdzIGFuZCBzaXggbG9jYWxpc2VkIGRvY3VtZW50YXRpb24gdGFibGVzICgjNjM5KS4gVGhlIGZpeCBpcyB0b1xuICogICAgbWF0Y2ggYSBkZWNsYXJlZCB2YWx1ZSBpbnN0ZWFkLiBUaGUgY291bnRyeSBuZXZlciByZWFjaGVzIGEgcnVsZSBub3csIGFuZFxuICogICAgdGhlIGBVS2AtdnMtYEdCYCBxdWVzdGlvbiB0aGF0IGNvdWxkIG5vdCBiZSBmaXhlZCBpbiBpc29sYXRpb24gZGlzc29sdmVkXG4gKiAgICB3aXRoIGl0OiBib3RoIHNwZWxsaW5ncyBhcmUgYGVtZWFgIGluIHRoZSBtYXBwaW5nLCBzbyBub3RoaW5nIG1pZ3JhdGVkLlxuICpcbiAqIFRoZSBsaXRlcmFsIHZhbHVlcyBiZWxvdyBhcmUgSU5URVJQT0xBVEVEIGZyb20gdGhlIGRlY2xhcmVkIGRvbWFpbiBcdTIwMTQgYFBgXG4gKiBxdW90ZXMgYW4gaW50ZXJwb2xhdGVkIHN0cmluZywgc28gYHJlY29yZC50ZXJyaXRvcnkgPT0gXCJuYVwiYCBpcyB3aGF0IGlzXG4gKiBhdXRob3JlZCwgYW5kIHJlbmFtaW5nIGEgdGVycml0b3J5IHZhbHVlIGNhbm5vdCBiZSBoYWxmLWFwcGxpZWQuXG4gKiBgdGVzdC90ZXJyaXRvcnktc2luZ2xlLXNvdXJjZS50ZXN0LnRzYCBwaW5zIHRoZSByZXN0IG9mIHRoZSBkZXJpdmF0aW9uOlxuICogZXZlcnkgdmFsdWUgb25lIG9mIHRoZXNlIHJ1bGVzIG5hbWVzIG11c3QgYmUgYSBkZWNsYXJlZCBvcHRpb24sIGFuZCBtdXN0IGJlXG4gKiByZWFjaGFibGUgZnJvbSBhdCBsZWFzdCBvbmUgY291bnRyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IFRlcnJpdG9yeVNoYXJpbmdSdWxlcyA9IFtcbiAge1xuICAgIG5hbWU6ICdub3J0aF9hbWVyaWNhX3RlcnJpdG9yeScsXG4gICAgbGFiZWw6ICdOb3J0aCBBbWVyaWNhIFRlcnJpdG9yeScsXG4gICAgb2JqZWN0OiAnY3JtX2FjY291bnQnLFxuICAgIHR5cGU6ICdjcml0ZXJpYScgYXMgY29uc3QsXG4gICAgY29uZGl0aW9uOiBQYHJlY29yZC50ZXJyaXRvcnkgPT0gJHtURVJSSVRPUlkuTkF9YCxcbiAgICBhY2Nlc3NMZXZlbDogJ2VkaXQnIGFzIGNvbnN0LFxuICAgIHNoYXJlZFdpdGg6IHsgdHlwZTogJ3Bvc2l0aW9uJyBhcyBjb25zdCwgdmFsdWU6ICduYV9zYWxlc190ZWFtJyB9LFxuICB9LFxuICB7XG4gICAgbmFtZTogJ2V1cm9wZV90ZXJyaXRvcnknLFxuICAgIGxhYmVsOiAnRXVyb3BlIFRlcnJpdG9yeScsXG4gICAgb2JqZWN0OiAnY3JtX2FjY291bnQnLFxuICAgIHR5cGU6ICdjcml0ZXJpYScgYXMgY29uc3QsXG4gICAgY29uZGl0aW9uOiBQYHJlY29yZC50ZXJyaXRvcnkgPT0gJHtURVJSSVRPUlkuRU1FQX1gLFxuICAgIGFjY2Vzc0xldmVsOiAnZWRpdCcgYXMgY29uc3QsXG4gICAgc2hhcmVkV2l0aDogeyB0eXBlOiAncG9zaXRpb24nIGFzIGNvbnN0LCB2YWx1ZTogJ2V1X3NhbGVzX3RlYW0nIH0sXG4gIH0sXG5dO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2hhcmluZy9vcHBvcnR1bml0eS5zaGFyaW5nLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3NoYXJpbmdcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvc2hhcmluZy9vcHBvcnR1bml0eS5zaGFyaW5nLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG5pbXBvcnQgeyBQIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgTEFSR0VfREVBTF9BTU9VTlQgfSBmcm9tICcuLi9vYmplY3RzL190aHJlc2hvbGRzJztcblxuLyoqXG4gKiBTaGFyZSBoaWdoLXZhbHVlIG9wZW4gb3Bwb3J0dW5pdGllcyB3aXRoIHRoZSBzYWxlcyBkaXJlY3Rvci5cbiAqIEFEUi0wMDkwIEQzOiBgcm9sZV9hbmRfc3Vib3JkaW5hdGVzYCBpcyBnb25lIChwb3NpdGlvbnMgYXJlIGZsYXQpOyB0aGVcbiAqIGdyYW50IG5vdyB0YXJnZXRzIHRoZSBkaXJlY3RvciBwb3NpdGlvbiBpdHNlbGYuXG4gKi9cbmV4cG9ydCBjb25zdCBPcHBvcnR1bml0eVNhbGVzU2hhcmluZ1J1bGUgPSB7XG4gIG5hbWU6ICdvcHBvcnR1bml0eV9zYWxlc19zaGFyaW5nJyxcbiAgbGFiZWw6ICdPcHBvcnR1bml0eSBTYWxlcyBUZWFtIFNoYXJpbmcnLFxuICBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICB0eXBlOiAnY3JpdGVyaWEnIGFzIGNvbnN0LFxuICBjb25kaXRpb246IFBgIShyZWNvcmQuc3RhZ2UgaW4gW1wiY2xvc2VkX3dvblwiLCBcImNsb3NlZF9sb3N0XCJdKSAmJiByZWNvcmQuYW1vdW50ID49ICR7TEFSR0VfREVBTF9BTU9VTlR9YCxcbiAgYWNjZXNzTGV2ZWw6ICdyZWFkJyBhcyBjb25zdCxcbiAgc2hhcmVkV2l0aDogeyB0eXBlOiAncG9zaXRpb24nIGFzIGNvbnN0LCB2YWx1ZTogJ3NhbGVzX2RpcmVjdG9yJyB9LFxufTtcblxuLyoqXG4gKiBUaGUgc2FtZSBsYXJnZS1kZWFsIHZpc2liaWxpdHkgb25lIHJ1bmcgdXAuXG4gKlxuICogUG9zaXRpb25zIGFyZSBGTEFUIChBRFItMDA5MCBEMyk6IG5vdGhpbmcgcm9sbHMgdGhlIGRpcmVjdG9yJ3MgZ3JhbnQgdXAgdG8gdGhlXG4gKiBleGVjdXRpdmUgcnVuZywgc28gdGhlIHJ1bGUgdGhhdCBnaXZlcyBsZWFkZXJzaGlwIGl0cyBwaXBlbGluZSB2aWV3IGhhcyB0byBiZVxuICogYXV0aG9yZWQgcGVyIHBvc2l0aW9uLiBTYW1lIGNyaXRlcmlhLCBzYW1lIHJlYWQtb25seSBsZXZlbCBcdTIwMTQgYW4gZXhlY3V0aXZlXG4gKiByZWFkcyB0aGUgZGVhbCwgdGhlIGRlYWwgdGVhbSBzdGlsbCBvd25zIGl0LlxuICovXG5leHBvcnQgY29uc3QgT3Bwb3J0dW5pdHlFeGVjdXRpdmVTaGFyaW5nUnVsZSA9IHtcbiAgbmFtZTogJ29wcG9ydHVuaXR5X2V4ZWN1dGl2ZV9zaGFyaW5nJyxcbiAgbGFiZWw6ICdMYXJnZSBPcGVuIERlYWxzIFx1MjAxNCBFeGVjdXRpdmUnLFxuICBvYmplY3Q6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICB0eXBlOiAnY3JpdGVyaWEnIGFzIGNvbnN0LFxuICBjb25kaXRpb246IFBgIShyZWNvcmQuc3RhZ2UgaW4gW1wiY2xvc2VkX3dvblwiLCBcImNsb3NlZF9sb3N0XCJdKSAmJiByZWNvcmQuYW1vdW50ID49ICR7TEFSR0VfREVBTF9BTU9VTlR9YCxcbiAgYWNjZXNzTGV2ZWw6ICdyZWFkJyBhcyBjb25zdCxcbiAgc2hhcmVkV2l0aDogeyB0eXBlOiAncG9zaXRpb24nIGFzIGNvbnN0LCB2YWx1ZTogJ2V4ZWN1dGl2ZScgfSxcbn07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9zaGFyaW5nL3Bvc2l0aW9ucy50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9zaGFyaW5nXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL3NoYXJpbmcvcG9zaXRpb25zLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIENSTSBQb3NpdGlvbnMgKEFEUi0wMDkwIEQzIFx1MjAxNCBmb3JtZXJseSB0aGUgcm9sZSBoaWVyYXJjaHkpLlxuICpcbiAqIFBvc2l0aW9ucyBhcmUgZGVsaWJlcmF0ZWx5IEZMQVQ6IG5vIHBhcmVudCwgbm8gaGllcmFyY2h5LiBUaGUgdjEgcm9sZVxuICogdHJlZSdzIHJlcG9ydGluZyBsaW5lcyBiZWxvbmcgb24gdGhlIGJ1c2luZXNzLXVuaXQgdHJlZSAvIG1hbmFnZXIgY2hhaW4sXG4gKiB3aGljaCB0aGlzIGFwcCBkb2VzIG5vdCBtb2RlbCBcdTIwMTQgc28gdGhlIG9sZCBgcGFyZW50Um9sZWAgbGlua3Mgd2VyZVxuICogZHJvcHBlZCByYXRoZXIgdGhhbiB0cmFuc2xhdGVkLlxuICpcbiAqIEZsYXQgYWxzbyBtZWFucyB2aXNpYmlsaXR5IGRvZXMgTk9UIHJvbGwgdXA6IGV2ZXJ5IHJ1bmcgdGhhdCBuZWVkcyBhY2Nlc3MgdG9cbiAqIGEgcmVjb3JkIGNhcnJpZXMgaXRzIG93biBzaGFyaW5nIHJ1bGUuIFRoYXQgaXMgd2h5IGVhY2ggbGVhZGVyc2hpcCBydW5nIGhhc1xuICogYW4gZXhwbGljaXQgY29tcGFuaW9uIHJ1bGUgKGBvcHBvcnR1bml0eV9leGVjdXRpdmVfc2hhcmluZ2AsXG4gKiBgY2FzZV9kaXJlY3Rvcl9zaGFyaW5nYCwgYGNhbXBhaWduX2xlYWRlcnNoaXBfKmApIHJhdGhlciB0aGFuIGluaGVyaXRpbmcgdGhlXG4gKiBtYW5hZ2VyJ3MgXHUyMDE0IGEgcG9zaXRpb24gdGhhdCBubyBzaGFyaW5nIHJ1bGUgYW5kIG5vIHBlcm1pc3Npb24tc2V0IGJpbmRpbmdcbiAqIG5hbWVzIGdyYW50cyBub3RoaW5nIGF0IGFsbCAoIzQ4OCkuXG4gKi9cbmV4cG9ydCBjb25zdCBDcm1Qb3NpdGlvbnMgPSBbXG4gIHsgbmFtZTogJ2V4ZWN1dGl2ZScsICAgICAgICAgIGxhYmVsOiAnRXhlY3V0aXZlJyB9LFxuICB7IG5hbWU6ICdzYWxlc19kaXJlY3RvcicsICAgICBsYWJlbDogJ1NhbGVzIERpcmVjdG9yJyB9LFxuICB7IG5hbWU6ICdzYWxlc19tYW5hZ2VyJywgICAgICBsYWJlbDogJ1NhbGVzIE1hbmFnZXInIH0sXG4gIHsgbmFtZTogJ3NhbGVzX3JlcCcsICAgICAgICAgIGxhYmVsOiAnU2FsZXMgUmVwcmVzZW50YXRpdmUnIH0sXG4gIHsgbmFtZTogJ3NlcnZpY2VfZGlyZWN0b3InLCAgIGxhYmVsOiAnU2VydmljZSBEaXJlY3RvcicgfSxcbiAgeyBuYW1lOiAnc2VydmljZV9tYW5hZ2VyJywgICAgbGFiZWw6ICdTZXJ2aWNlIE1hbmFnZXInIH0sXG4gIHsgbmFtZTogJ3NlcnZpY2VfYWdlbnQnLCAgICAgIGxhYmVsOiAnU2VydmljZSBBZ2VudCcgfSxcbiAgeyBuYW1lOiAnbWFya2V0aW5nX2RpcmVjdG9yJywgbGFiZWw6ICdNYXJrZXRpbmcgRGlyZWN0b3InIH0sXG4gIHsgbmFtZTogJ21hcmtldGluZ19tYW5hZ2VyJywgIGxhYmVsOiAnTWFya2V0aW5nIE1hbmFnZXInIH0sXG4gIHsgbmFtZTogJ21hcmtldGluZ191c2VyJywgICAgIGxhYmVsOiAnTWFya2V0aW5nIFVzZXInIH0sXG4gIC8vIFRlcnJpdG9yeSBncm91cGluZ3MgcmVmZXJlbmNlZCBieSB0aGUgYWNjb3VudCBzaGFyaW5nIHJ1bGVzLlxuICB7IG5hbWU6ICduYV9zYWxlc190ZWFtJywgICAgICBsYWJlbDogJ05BIFNhbGVzIFRlYW0nIH0sXG4gIHsgbmFtZTogJ2V1X3NhbGVzX3RlYW0nLCAgICAgIGxhYmVsOiAnRVUgU2FsZXMgVGVhbScgfSxcbl07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9tYXJrZXRpbmcvc2hhcmluZy9jYW1wYWlnbi5zaGFyaW5nLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9zaGFyaW5nXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9zaGFyaW5nL2NhbXBhaWduLnNoYXJpbmcudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbmltcG9ydCB7IFAgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogQ2FtcGFpZ24gbGVhZGVyc2hpcCBzaGFyaW5nLlxuICpcbiAqIGBjcm1fY2FtcGFpZ25gIGlzIGBwdWJsaWNfcmVhZGAgKGBzcmMvbWFya2V0aW5nL29iamVjdHMvY2FtcGFpZ24ub2JqZWN0LnRzYCksIHNvIHRoZSBPV0RcbiAqIGJhc2VsaW5lIGFscmVhZHkgaGFuZHMgUkVBRCB0byBldmVyeW9uZSBob2xkaW5nIG9iamVjdC1sZXZlbCByZWFkIG9uIGl0OiBhXG4gKiBtYXJrZXRpbmcgbWFuYWdlciBvciBkaXJlY3RvciBvcGVucyBhbnkgY2FtcGFpZ24gd2l0aCBvciB3aXRob3V0IHRoaXMgZmlsZS5cbiAqIFdoYXQgYHB1YmxpY19yZWFkYCBkb2VzIE5PVCBoYW5kIG91dCBpcyBXUklURS4gYEBvYmplY3RzdGFjay9wbHVnaW4tc2hhcmluZ2BcbiAqIDE3LjAuMC1yYy4yIHN0YXRlcyB0aGUgYm91bmRhcnkgaW4gYGJ1aWxkV3JpdGVGaWx0ZXJgJ3Mgb3duIGNvbW1lbnQgXHUyMDE0IHRoZVxuICogZWRpdGFibGUgc2V0IFwiYXBwbGllcyB0byBCT1RIIGBwcml2YXRlYCBhbmQgYHJlYWRgIChwdWJsaWNfcmVhZCkgbW9kZWxzIFx1MjAxNFxuICogcHVibGljX3JlYWQgaXMgcmVhZC1vcGVuIGJ1dCB3cml0ZS1vd25lZDsgb25seSBhIGZ1bGx5IGBwdWJsaWNgIG9iamVjdCBpc1xuICogd3JpdGUtb3BlblwiIFx1MjAxNCBpLmUuIG93bmVyLW1hdGNoIE9SIHJlY29yZHMgc2hhcmVkIGF0IGEgd3JpdGUgYWNjZXNzIGxldmVsLlxuICpcbiAqIFRoZXNlIHR3byBydWxlcyBhcmUgdGhhdCBzZWNvbmQgYnJhbmNoLCBhbmQgYGFjY2Vzc0xldmVsOiAnZWRpdCdgIGlzIHRoZSBwYXJ0XG4gKiBkb2luZyB0aGUgd29yazogdGhleSBsZXQgYSBtYXJrZXRpbmcgbWFuYWdlciAvIGRpcmVjdG9yIEVESVQgYSBsaXZlIGNhbXBhaWduIGFcbiAqIHNwZWNpYWxpc3Qgb3ducywgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIHRha2Ugb3duZXJzaGlwIG9mIGl0LiBOb3IgZG9lcyB0aGVcbiAqIGBtYXJrZXRpbmdfdXNlcmAgcGVybWlzc2lvbiBzZXQgbWFrZSB0aGVtIHJlZHVuZGFudCBcdTIwMTQgaXRzXG4gKiBgbWFya2V0aW5nX2NhbXBhaWduX3VwZGF0ZXNgIFJMUyBwb2xpY3kgKGBpZCAhPSBudWxsYCkgd2lkZW5zIHRoZSBSTFMgbGF5ZXJcbiAqIG9ubHksIGFuZCB0aGUgc2hhcmluZyBsYXllcidzIHdyaXRlLW93bmVkIGJhc2VsaW5lIHN0aWxsIHJlZnVzZXMgdGhlIHVwZGF0ZS5cbiAqXG4gKiBNRUFTVVJFRCBvbiAxNy4wLjAtcmMuMiBhZ2FpbnN0IHRoaXMgYXBwJ3Mgb3duIG1ldGFkYXRhICgjNzI0KSwgZm9yIGEgdXNlclxuICogaG9sZGluZyB0aGUgYG1hcmtldGluZ191c2VyYCBzZXQgcGx1cyBwb3NpdGlvbiBgbWFya2V0aW5nX21hbmFnZXJgIGFuZCBvd25pbmdcbiAqIG5vIGNhbXBhaWduOiByZWFkcyByZXR1cm4gRVZFUlkgY2FtcGFpZ24gYXQgYWxsIHRpbWVzOyBiZWZvcmUgdGhlc2UgcnVsZXNcbiAqIG1hdGVyaWFsaXNlLCBgYnVpbGRXcml0ZUZpbHRlcmAgaXMgYHsgb3duZXJfaWQ6IHNwZWNpYWxpc3QgfWAgYW5kIHVwZGF0aW5nIGFcbiAqIHNwZWNpYWxpc3Qtb3duZWQgY2FtcGFpZ24gaXMgRk9SQklEREVOOyBhZnRlciwgdGhlIGZpbHRlciBnYWluc1xuICogYHsgaWQ6IHsgJGluOiBbbGl2ZSBjYW1wYWlnbl0gfSB9YCBhbmQgdGhlIHNhbWUgdXBkYXRlIHN1Y2NlZWRzLCB3aGlsZSB0aGVcbiAqIGNvbXBsZXRlZCBjYW1wYWlnbiBzdGF5cyBGT1JCSURERU4uIFNvIGRlbGV0aW5nIHRoZXNlIHJ1bGVzIGNvc3RzIHRoZSB0d29cbiAqIHJ1bmdzIHRoZWlyIG9ubHkgZWRpdCBwYXRoIGFuZCBjaGFuZ2VzIG5vdGhpbmcgYWJvdXQgd2hhdCB0aGV5IGNhbiBSRUFEIFx1MjAxNFxuICogd2hpY2ggaXMgZXhhY3RseSB3aGF0IG1ha2VzIHRoZSBsb3NzIGVhc3kgdG8gbWlzcy5cbiAqXG4gKiBBRFItMDA5MCBEMyBwb3NpdGlvbnMgYXJlIEZMQVQgKG5vIGhpZXJhcmNoeSB0byByb2xsIHZpc2liaWxpdHkgdXApLCBzbyBlYWNoXG4gKiBydW5nIHRoYXQgbmVlZHMgdGhlIGFjY2VzcyBjYXJyaWVzIGl0cyBvd24gZ3JhbnQuIFNjb3BlZCB0byBsaXZlIGNhbXBhaWduczpcbiAqIGZpbmlzaGVkIG9uZXMgc3RheSB3aXRoIHRoZWlyIG93bmVyIGFuZCB0aGUgYW5hbHl0aWNzIHN1cmZhY2VzIHRoYXQgcmVwb3J0IG9uXG4gKiB0aGVtLlxuICovXG5leHBvcnQgY29uc3QgQ2FtcGFpZ25MZWFkZXJzaGlwU2hhcmluZ1J1bGVzID0gW1xuICB7XG4gICAgbmFtZTogJ2NhbXBhaWduX2xlYWRlcnNoaXBfbWFuYWdlcicsXG4gICAgbGFiZWw6ICdMaXZlIENhbXBhaWducyBcdTIwMTQgTWFya2V0aW5nIE1hbmFnZXInLFxuICAgIG9iamVjdDogJ2NybV9jYW1wYWlnbicsXG4gICAgdHlwZTogJ2NyaXRlcmlhJyBhcyBjb25zdCxcbiAgICBjb25kaXRpb246IFBgcmVjb3JkLnN0YXR1cyBpbiBbXCJwbGFubmluZ1wiLCBcImluX3Byb2dyZXNzXCJdICYmIHJlY29yZC5pc19hY3RpdmUgPT0gdHJ1ZWAsXG4gICAgYWNjZXNzTGV2ZWw6ICdlZGl0JyBhcyBjb25zdCxcbiAgICBzaGFyZWRXaXRoOiB7IHR5cGU6ICdwb3NpdGlvbicgYXMgY29uc3QsIHZhbHVlOiAnbWFya2V0aW5nX21hbmFnZXInIH0sXG4gIH0sXG4gIHtcbiAgICBuYW1lOiAnY2FtcGFpZ25fbGVhZGVyc2hpcF9kaXJlY3RvcicsXG4gICAgbGFiZWw6ICdMaXZlIENhbXBhaWducyBcdTIwMTQgTWFya2V0aW5nIERpcmVjdG9yJyxcbiAgICBvYmplY3Q6ICdjcm1fY2FtcGFpZ24nLFxuICAgIHR5cGU6ICdjcml0ZXJpYScgYXMgY29uc3QsXG4gICAgY29uZGl0aW9uOiBQYHJlY29yZC5zdGF0dXMgaW4gW1wicGxhbm5pbmdcIiwgXCJpbl9wcm9ncmVzc1wiXSAmJiByZWNvcmQuaXNfYWN0aXZlID09IHRydWVgLFxuICAgIGFjY2Vzc0xldmVsOiAnZWRpdCcgYXMgY29uc3QsXG4gICAgc2hhcmVkV2l0aDogeyB0eXBlOiAncG9zaXRpb24nIGFzIGNvbnN0LCB2YWx1ZTogJ21hcmtldGluZ19kaXJlY3RvcicgfSxcbiAgfSxcbl07XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhL3NhbGVzLnNlZWQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YVwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhL3NhbGVzLnNlZWQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogU2FsZXMgc2VlZHMgXHUyMDE0IGFjY291bnRzLCBjb250YWN0cywgbGVhZHMgYW5kIG9wcG9ydHVuaXRpZXMuXG4gKlxuICogU3BsaXQgb3V0IG9mIHRoZSBmb3JtZXIgbW9ub2xpdGhpYyBgc3JjL2RhdGEvaW5kZXgudHNgICgjNjM1KS4gU2VlZCBkb2N0cmluZVxuICogbGl2ZXMgaW4gYC4vX3NoYXJlZC50c2AuXG4gKlxuICogYE9QUE9SVFVOSVRZX0xJTkVTYCBzdGF5cyBoZXJlLCB3aXRoIHRoZSBkZWFscyBpdCBwcmljZXM6IGBkZWFsVmFsdWUoKWBcbiAqIGRlcml2ZXMgZXZlcnkgb3Bwb3J0dW5pdHkncyBgYW1vdW50YCBmcm9tIGl0LiBUaGUgbGluZS1pdGVtIFJPV1MgaXQgYWxzb1xuICogZmVlZHMgYXJlIGBjcm1fb3Bwb3J0dW5pdHlfbGluZV9pdGVtYCwgYSByZXZlbnVlIG9iamVjdCwgc28gdGhleSBhcmUgc2VlZGVkXG4gKiBmcm9tIGBzcmMvcmV2ZW51ZS9kYXRhL29wcG9ydHVuaXR5LWxpbmUtaXRlbS5zZWVkLnRzYCwgd2hpY2ggcmVhZHMgdGhpc1xuICogdGFibGUgYWxvbmcgdGhlIHJldmVudWUgLT4gc2FsZXMgZWRnZS5cbiAqL1xuaW1wb3J0IHsgZGVmaW5lU2VlZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgQWNjb3VudCB9IGZyb20gJy4uL29iamVjdHMvYWNjb3VudC5vYmplY3QnO1xuaW1wb3J0IHsgQ29udGFjdCB9IGZyb20gJy4uL29iamVjdHMvY29udGFjdC5vYmplY3QnO1xuaW1wb3J0IHsgTGVhZCB9IGZyb20gJy4uL29iamVjdHMvbGVhZC5vYmplY3QnO1xuaW1wb3J0IHsgT3Bwb3J0dW5pdHkgfSBmcm9tICcuLi9vYmplY3RzL29wcG9ydHVuaXR5Lm9iamVjdCc7XG5pbXBvcnQgeyBjZWxEYXlzQWdvLCBsaW5lc1RvdGFsLCB0eXBlIExpbmVTcGVjIH0gZnJvbSAnLi9fc2hhcmVkJztcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEFjY291bnRzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy9cbi8vIGBiaWxsaW5nX2FkZHJlc3NgIGlzIGxvYWQtYmVhcmluZyBkZW1vIGRhdGEsIG5vdCBkZWNvcmF0aW9uICgjNjM4KS4gVGhlIHR3b1xuLy8gdGVycml0b3J5IHNoYXJpbmcgcnVsZXMgZmlsdGVyIG9uIGBjcm1fYWNjb3VudC5iaWxsaW5nX2NvdW50cnlgIFx1MjAxNCB0aGUgZmxhdFxuLy8gcHJvamVjdGlvbiBgYWNjb3VudF9wcm90ZWN0aW9uYCBkZXJpdmVzIGZyb20gYGJpbGxpbmdfYWRkcmVzcy5jb3VudHJ5YCBcdTIwMTQgc29cbi8vIGFuIGFjY291bnQgd2l0aCBubyBhZGRyZXNzIGJlbG9uZ3MgdG8gbm8gdGVycml0b3J5LiBVbnRpbCBub3cgbm90IG9uZSBzZWVkZWRcbi8vIGFjY291bnQgY2FycmllZCBhbiBhZGRyZXNzLCB3aGljaCBtZWFudCAjNjIxIHNoaXBwZWQgdHdvIHRlcnJpdG9yeSBydWxlc1xuLy8gdGhhdCBpbnN0YWxsZWQgY29ycmVjdGx5IGFuZCB0aGVuIG1hdGNoZWQgemVybyByZWNvcmRzOiBTZXR1cCBsaXN0ZWQgdHdvXG4vLyB0ZXJyaXRvcmllcyB3aXRoIG5vdGhpbmcgYmVoaW5kIHRoZW0uXG4vL1xuLy8gVGhlIG5pbmUgYWNjb3VudHMgcGFydGl0aW9uIGRlbGliZXJhdGVseSBhY3Jvc3MgYWxsIFRIUkVFIG91dGNvbWVzIHRoZSBydWxlc1xuLy8gY2FuIHByb2R1Y2UsIHNvIGEgZGVtbyBzaG93cyB0aGUgc3BsaXQgaW5zdGVhZCBvZiBhc3NlcnRpbmcgaXQ6XG4vL1xuLy8gICBub3J0aF9hbWVyaWNhX3RlcnJpdG9yeSAgdGVycml0b3J5ID09IFwibmFcIiAgICAgXHUyMTkyIDYgICg1IFx1MDBENyBVUywgMSBcdTAwRDcgQ0EpXG4vLyAgIGV1cm9wZV90ZXJyaXRvcnkgICAgICAgICB0ZXJyaXRvcnkgPT0gXCJlbWVhXCIgICBcdTIxOTIgMiAgKERFLCBVSylcbi8vICAgbmVpdGhlciB0ZXJyaXRvcnkgICAgICAgIHRlcnJpdG9yeSA9PSBcIm90aGVyXCIgIFx1MjE5MiAxICAoU0cpXG4vL1xuLy8gVGhlIHJ1bGVzIG1hdGNoIGB0ZXJyaXRvcnlgLCBhIGRlY2xhcmVkIHNlbGVjdCB0aGUgaG9vayBjbGFzc2lmaWVzIHRoZVxuLy8gYWRkcmVzcyBjb3VudHJ5IGludG8gKCM2MzkpIFx1MjAxNCBubyBydWxlIGNvbXBhcmVzIGEgY291bnRyeSBzdHJpbmcgYW55IG1vcmUuXG4vLyBgY291bnRyeWAgc3RpbGwgY2FycmllcyB0aGUgMi1MRVRURVIgQ09ERSBoZXJlOiBzZWVkIGFkZHJlc3NlcyBrZWVwIHRvIElTT1xuLy8gMzE2Ni0xIGFscGhhLTIgYXMgYSBkYXRhLXF1YWxpdHkgY29udmVudGlvbiwgYW5kIHRoZSBzcGVsbGluZyB0YWJsZSBpblxuLy8gYHNyYy9zYWxlcy9vYmplY3RzL190ZXJyaXRvcnkudHNgIGV4aXN0cyBmb3Igd2hhdCBVU0VSUyB0eXBlLCBub3QgZm9yIHdoYXQgdGhpc1xuLy8gZmlsZSBhdXRob3JzLlxuLy9cbi8vIGBVS2Agb24gdGhlIExvbmRvbiBhY2NvdW50IGlzIHRoZSBvbmUgZGVsaWJlcmF0ZSBleGNlcHRpb24sIGFuZCBpdCBpcyBub3dcbi8vIGxvYWQtYmVhcmluZyByYXRoZXIgdGhhbiBtZXJlbHkgaGlzdG9yaWNhbDogYFVLYCBpcyBhbiBBQ0NFUFRFRCBTUEVMTElORyBvZlxuLy8gYEdCYCBpbiB0aGF0IHRhYmxlLCBzbyB0aGlzIHJvdyBpcyB0aGUgc3RvY2stZGF0YSBwcm9vZiB0aGF0IHRoZSBhbGlhcyBwYXRoXG4vLyB3b3JrcyBlbmQgdG8gZW5kLiBDb3JyZWN0aW5nIGl0IHRvIGBHQmAgd291bGQgZGVsZXRlIHRoYXQgY292ZXJhZ2UgXHUyMDE0IGFuZCB0aGVcbi8vIGV2aWN0aW9uICM2Mzkgd2FzIHdvcnJpZWQgYWJvdXQgY2Fubm90IGhhcHBlbiwgYmVjYXVzZSBib3RoIHNwZWxsaW5ncyBhcmVcbi8vIGBlbWVhYC5cbi8vXG4vLyBgYmlsbGluZ19jb3VudHJ5YCBhbmQgYHRlcnJpdG9yeWAgYXJlIGJvdGggZGVsaWJlcmF0ZWx5IE5PVCBhdXRob3JlZCBoZXJlLlxuLy8gSG9va3MgRE8gcnVuIG92ZXIgc2VlZCB3cml0ZXMgKCM2MTcsIGNvcnJlY3RlZCBpbiBgLi9fc2hhcmVkLnRzYCksIHNvIGJvdGhcbi8vIGFyZSBjb21wdXRlZCBhdCBzZWVkIHRpbWU7IHRoZSBmaWVsZCBpcyBgcmVhZG9ubHlgIGFuZCBob29rLW93bmVkLCBhbmQgYVxuLy8gaGFuZC1jb3BpZWQgdmFsdWUgd291bGQgYmUgYSBzZWNvbmQgc291cmNlIG9mIHRydXRoIGZvciBzb21ldGhpbmdcbi8vIGBhY2NvdW50X3Byb3RlY3Rpb25gIGFscmVhZHkgbWFpbnRhaW5zIFx1MjAxNCB0aGUgZXhhY3QgZHJpZnQgdGhlIGRvY3RyaW5lIGJsb2NrXG4vLyBleGlzdHMgdG8gcHJldmVudC4gYHRlc3QvdGVycml0b3J5LXNlZWQtY292ZXJhZ2UudGVzdC50c2AgcGlucyB0aGUgZGVwZW5kZW5jeVxuLy8gZnJvbSB0aGUgb3RoZXIgc2lkZTogZXZlcnkgc2VlZGVkIGFkZHJlc3MgbXVzdCBjYXJyeSBhIGNvdW50cnkgdGhlXG4vLyBwcm9qZWN0aW9uIGNhbiB0dXJuIGludG8gdGhlIHRlcnJpdG9yeSBidWNrZXQgY2xhaW1lZCBhYm92ZS5cbi8vXG4vLyBQaG9uZSBudW1iZXJzIG1vdmVkIHdpdGggdGhlIGFkZHJlc3NlczogYSBNdW5pY2ggYWNjb3VudCBhbnN3ZXJpbmcgYSBEZW52ZXJcbi8vIG51bWJlciBpcyB0aGUga2luZCBvZiBpbmNvaGVyZW5jZSBhbiBldmFsdWF0b3Igbm90aWNlcyBiZWZvcmUgdGhlIGZlYXR1cmUuXG4vL1xuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIGBsYXN0X2FjdGl2aXR5X2RhdGVgOiB0aGUgY2h1cm4gY2xvY2ssIGFuZCB3aG8gaXMgYWxsb3dlZCB0byBzZXQgaXQgXHUyNTAwXHUyNTAwXHUyNTAwXG4vL1xuLy8gVGhlIHRocmVlIFwiUXVpZXQgMzAgLyA2MCAvIDkwKyBEYXlzXCIgdGlsZXMgb24gdGhlIFNhbGVzIEFjdGl2aXR5IGRhc2hib2FyZCxcbi8vIGBhdF9yaXNrX2FjY291bnRzYCBhbmQgYGN1c3RvbWVyX2NodXJuX3NpZ25hbHNgIGFsbCB3aW5kb3cgdGhpcyBvbmUgY29sdW1uLFxuLy8gc28gdGhlIGRlbW8gbmVlZHMgYSByZWFsIERJU1RSSUJVVElPTiBhY3Jvc3MgdGhlIHRocmVlIGJhbmRzIFx1MjAxNCBub3QgdGhlXG4vLyBjbHVzdGVyIGluc2lkZSBhIGZvcnRuaWdodCBpdCB1c2VkIHRvIGJlLCB3aGljaCBsZWZ0IGV2ZXJ5IGNodXJuIHN1cmZhY2Vcbi8vIGVtcHR5IHdoaWxlIHRoZSBkYXRhIGxvb2tlZCBwb3B1bGF0ZWQgKCM2NzEpLlxuLy9cbi8vIEF1dGhvcmluZyBpdCBoZXJlIGlzIGxlZ2l0aW1hdGUsIGFuZCB0aGUgYm91bmRhcnkgaXMgd29ydGggc3RhdGluZyBiZWNhdXNlIGl0XG4vLyBpcyBOT1QgdGhlIGBiaWxsaW5nX2NvdW50cnlgIGNhc2UgdGhyZWUgcGFyYWdyYXBocyB1cCAoZG9jdHJpbmUgcnVsZSAzIGluXG4vLyBgLi9fc2hhcmVkLnRzYCkuIGBiaWxsaW5nX2NvdW50cnlgIGlzIGByZWFkb25seWAgYW5kIERFUklWRUQgXHUyMDE0IHRoZSBob29rXG4vLyByZWNvbXB1dGVzIGl0IGZyb20gYGJpbGxpbmdfYWRkcmVzc2Agb24gZXZlcnkgd3JpdGUgdGhhdCBjYXJyaWVzIG9uZSwgc28gYVxuLy8gc2VlZGVkIGNvcHkgd291bGQgYmUgYSBzZWNvbmQgc291cmNlIG9mIHRydXRoIGZvciBhIHZhbHVlIG5vdGhpbmcgZWxzZSBvd25zLlxuLy8gYGxhc3RfYWN0aXZpdHlfZGF0ZWAgaXMgbmVpdGhlcjogIzU5MiByZW1vdmVkIHRoZSBgcmVhZG9ubHlgIGZsYWcgcHJlY2lzZWx5XG4vLyBzbyBob29rcyBjb3VsZCB3cml0ZSBpdCwgYW5kIG5vIGhvb2sgZGVyaXZlcyBpdCBmcm9tIGFueXRoaW5nIG9uIHRoZSBhY2NvdW50LlxuLy8gSXQgaXMgYSBISVNUT1JJQ0FMIGZhY3QgXHUyMDE0IFwid2hlbiBkaWQgYW55b25lIGxhc3Qgc3BlYWsgdG8gdGhpcyBjdXN0b21lclwiIFx1MjAxNCBhbmRcbi8vIGF1dGhvcmluZyBoaXN0b3J5IGludG8gYSBmaWVsZCB3aG9zZSB3cml0ZXJzIG9ubHkgZXZlciBzdGFtcCB0aGUgY3VycmVudCBkYXRlXG4vLyBpcyBkb2N0cmluZSBydWxlIDEsIHRoZSBzYW1lIGxpY2VuY2UgYHN0YWdlX2VudHJ5X2RhdGVgIGFuZCB0aGUgY2FzZSBzZWVkcydcbi8vIGBjcmVhdGVkX2F0YCBhbHJlYWR5IHVzZS5cbi8vXG4vLyBXaGF0IHRoZSB3cml0ZXJzIERPIGltcG9zZSBpcyBhIGNvbnN0cmFpbnQgb24gdGhlIGV2ZW50cyBzZWVkZWQgYmVzaWRlIHRoZXNlXG4vLyByb3dzLCBhbmQgaXQgZGVjaWRlcyB0aGUgd2hvbGUgbGF5b3V0IGJlbG93LiBMaWZlY3ljbGUgaG9va3MgcnVuIG92ZXIgc2VlZFxuLy8gd3JpdGVzICgjNjE3KSwgYW5kIHR3byBvZiB0aGVtIHN0YW1wIFRPREFZIG9uIGFuIGFjY291bnQ6XG4vL1xuLy8gICBcdTAwQjcgYGV2ZW50X2FjdGl2aXR5X2J1YmJsZWAgXHUyMDE0IG9uIGFueSBgaGVsZGAgZXZlbnQsIHdhbGtpbmcgdXAgZnJvbSBpdHNcbi8vICAgICBjb250YWN0IC8gb3Bwb3J0dW5pdHkgLyBjYXNlIChgc3JjL3NhbGVzL29iamVjdHMvZXZlbnQuaG9vay50c2ApO1xuLy8gICBcdTAwQjcgYHRhc2tfYWN0aXZpdHlfYnViYmxlYCAgXHUyMDE0IG9uIGFueSB0YXNrIHNlZWRlZCBhbHJlYWR5IGNvbXBsZXRlZC5cbi8vXG4vLyBOZWl0aGVyIHJlYWRzIHRoZSBhY3Rpdml0eSdzIG93biB0aW1lc3RhbXA6IGEgYGhlbGRgIG1lZXRpbmcgc2VlZGVkIDQ1IGRheXNcbi8vIGFnbyBzdGlsbCBzdGFtcHMgdGhlIGRheSB0aGUgZGVtbyB3YXMgc2VlZGVkLiBTbyBhbiBhY2NvdW50IG1heSBjYXJyeSBhblxuLy8gYXV0aG9yZWQgYWdlIE9OTFkgaWYgbm90aGluZyBpbiB0aGUgc2VlZCBib29rIGJ1YmJsZXMgdG8gaXQ7IG90aGVyd2lzZSB0aGVcbi8vIGF1dGhvcmVkIHZhbHVlIGlzIG92ZXJ3cml0dGVuIGF0IHNlZWQgdGltZSBhbmQgdGhlIGRlbW8gc2hvd3Mgc29tZXRoaW5nXG4vLyBub2JvZHkgd3JvdGUgKGRvY3RyaW5lIHJ1bGUgMikuIEhlbmNlIHRoZSB0aHJlZS13YXkgc3BsaXQ6XG4vL1xuLy8gICB0b2RheSgpICAgQWNtZSwgV2F5bmUsIFZlcnRleCwgU3RhcmsgXHUyMDE0IGV2ZXJ5IGFjY291bnQgc29tZXRoaW5nIGluIHRoZSBzZWVkXG4vLyAgICAgICAgICAgICBib29rIGJ1YmJsZXMgdG8uIEFjbWUgLyBXYXluZSAvIFZlcnRleCBjYXJyeSBgaGVsZGAgZXZlbnRzO1xuLy8gICAgICAgICAgICAgU3RhcmsgY2FycmllcyB0aGUgY29tcGxldGVkIHdlbGNvbWUtcGFja2FnZSB0YXNrLCB3aGljaCBoYXNcbi8vICAgICAgICAgICAgIGJ1YmJsZWQgc2luY2UgbG9uZyBiZWZvcmUgdGhpcyBpc3N1ZSAoaXRzIGF1dGhvcmVkIGBkYXlzQWdvKDUpYFxuLy8gICAgICAgICAgICAgd2FzIGJlaW5nIHNpbGVudGx5IG92ZXJ3cml0dGVuKS4gQXV0aG9yZWQgYXMgdG9kYXkgYmVjYXVzZSB0aGF0XG4vLyAgICAgICAgICAgICBpcyBleGFjdGx5IHdoYXQgdGhlIGJ1YmJsZSB3cml0ZXMsIHNvIHRoZSB2YWx1ZSBpcyByaWdodCB3aGV0aGVyXG4vLyAgICAgICAgICAgICBvciBub3QgaG9va3MgZmlyZS5cbi8vICAgNlx1MjAxMzggZGF5cyAgTGF0dGljZSwgR2xvYmV4IFx1MjAxNCByZWNlbmN5IGZyb20gY2hhbm5lbHMgdGhpcyBzZWVkIGJvb2sgZG9lcyBub3Rcbi8vICAgICAgICAgICAgIG1vZGVsIChhbiBlbWFpbCB0aHJlYWQsIGEgc2lnbmF0dXJlKS4gVGhleSBjYXJyeSBvbmx5IGBwbGFubmVkYFxuLy8gICAgICAgICAgICAgYW5kIGBjYW5jZWxsZWRgIGV2ZW50cywgbmVpdGhlciBvZiB3aGljaCBidWJibGVzLlxuLy8gICA0MS83Mi8xMDQgTm9ydGh3aW5kLCBJbml0ZWNoLCBBcGV4IFx1MjAxNCBvbmUgcGVyIGNodXJuIGJhbmQuIE5vdGhpbmcgaGVsZFxuLy8gICAgICAgICAgICAgcmVhY2hlcyB0aGVtOyBlYWNoIGNhcnJpZXMgYSBCT09LRUQgcmUtZW5nYWdlbWVudCBtZWV0aW5nXG4vLyAgICAgICAgICAgICBpbnN0ZWFkLCB3aGljaCBpcyAjNTkyJ3Mgd2hvbGUgcG9pbnQ6IGEgbWVldGluZyBvbiB0aGUgY2FsZW5kYXJcbi8vICAgICAgICAgICAgIGlzIG5vdCBhbiBpbnRlcmFjdGlvbiB0aGF0IGhhcHBlbmVkLCBhbmQgb25seSBgaGVsZGAgbW92ZXMgdGhlXG4vLyAgICAgICAgICAgICBjbG9jay4gSW50ZXJuYWwgcGlwZWxpbmUgbW90aW9uIChhIGBzdGFnZV9lbnRyeV9kYXRlYCkgaXMgbm90XG4vLyAgICAgICAgICAgICBjdXN0b21lciBjb250YWN0IGVpdGhlciwgd2hpY2ggaXMgd2h5IGEgc3RhZ25hdGluZyBkZWFsIGNhbiBzaXRcbi8vICAgICAgICAgICAgIG9uIGEgc2lsZW50IGFjY291bnQgXHUyMDE0IHRoYXQgcGFpcmluZyBpcyB3aGF0IHRoZSBzdGFnbmF0aW9uIHN3ZWVwXG4vLyAgICAgICAgICAgICBhbmQgdGhlIGNodXJuIHRpbGVzIGFyZSBlYWNoIGxvb2tpbmcgYXQgZnJvbSBvbmUgc2lkZS5cbi8vXG4vLyBgdGVzdC9hY3Rpdml0eS1zZWVkLWNvdmVyYWdlLnRlc3QudHNgIHJlY29tcHV0ZXMgdGhlIGJ1YmJsZSdzIHJlYWNoYWJpbGl0eVxuLy8gZnJvbSB0aGUgc2VlZHMgdGhlbXNlbHZlcyBhbmQgZmFpbHMgaWYgYSBoZWxkIGV2ZW50IGV2ZXIgcmVhY2hlcyBvbmUgb2YgdGhlXG4vLyB0aHJlZSBxdWlldCBhY2NvdW50cywgc28gdGhlIHNwbGl0IGFib3ZlIGNhbm5vdCByb3QgaW50byBhIGNvbW1lbnQuXG4vL1xuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIGBoZWFsdGhfc2NvcmVgOiB0aGUgY2h1cm4gc2lnbmFsIGEgSFVNQU4gYXNzZXJ0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vXG4vLyBGb3VyIG9wdGlvbnMgc2hpcCAoYGhlYWx0aHlgIC8gYHdhdGNoaW5nYCAvIGBhdF9yaXNrYCAvIGBjaHVybmluZ2ApIGFuZCB0aGVcbi8vIGNodXJuIHJlcG9ydCdzIGZpcnN0IHBhbmVsLCBgY3NtX2ZsYWdnZWRfYWNjb3VudHNgLCBzZWxlY3RzIHRoZSB3b3JzdCB0d28uXG4vLyBUaGF0IHBhbmVsIGlzIHRoZSBPTkxZIG9uZSBvbiB0aGUgcmVwb3J0IHdpdGggbm8gdGltZSB3aW5kb3csIHNvIHRoZVxuLy8gcG9wdWxhdGlvbiBpdCBleGlzdHMgZm9yIGlzIGFuIGFjY291bnQgYmVpbmcgd29ya2VkIHJpZ2h0IG5vdyBhbmQgc3RpbGxcbi8vIGZsYWdnZWQuIFRoZSBzZWVkIGJvb2sgaGFzIHRvIGNvbnRhaW4gb25lLCBvciB0aGUgZGVtbyByZW5kZXJzIGEgcGFuZWwgdGhhdFxuLy8gbWVyZWx5IHJlc3RhdGVzIHRoZSA2MC1kYXkgd2luZG93IHN0YWNrZWQgYmVsb3cgaXQgKCMxNDE0KS4gSGVuY2UgYVxuLy8gZGVsaWJlcmF0ZSB0aHJlZS13YXkgc3BsaXQsIHRoZSBzYW1lIHNoYXBlIGFzIHRoZSB0ZXJyaXRvcnkgYW5kIGFjdGl2aXR5XG4vLyBwYXJ0aXRpb25zIGFib3ZlOlxuLy9cbi8vICAgSW5pdGVjaCAgYGF0X3Jpc2tgICArIDcyIGRheXMgcXVpZXQgXHUyMDE0IGZsYWdnZWQgQU5EIGRlcml2ZWQuIEl0IGxhbmRzIGluXG4vLyAgICAgICAgICAgIHRoaXMgcGFuZWwgYW5kIGluIGBhdF9yaXNrX2FjY291bnRzYDsgdGhlIHJlcG9ydCdzIG93biBoZWFkZXJcbi8vICAgICAgICAgICAgc2F5cyB0aGUgdHdvIGJsb2NrcyBhcmUgYWxsb3dlZCB0byBvdmVybGFwLlxuLy8gICBXYXluZSAgICBgY2h1cm5pbmdgICsgY2xvY2sgYXQgdG9kYXkoKSBcdTIwMTQgZmxhZ2dlZCBhbmQgTk9UIGRlcml2ZWQuIEl0c1xuLy8gICAgICAgICAgICBgc3RyYXRlZ2ljYCB0aWVyIGlzIGluc2lkZSBgc2lsZW50X2hpZ2hfdmFsdWVgJ3Mgc2NvcGUgYXMgd2VsbCxcbi8vICAgICAgICAgICAgc28gdGhlIGNsb2NrIGFsb25lIGtlZXBzIGl0IG91dCBvZiBCT1RIIHdpbmRvd2VkIHBhbmVsczogdGhlXG4vLyAgICAgICAgICAgIGFjY291bnQgbm8gZGVyaXZlZCBzaWduYWwgY2FuIHNlZS4gSXQgaXMgd2hhdCBtYWtlcyB0aGUgc2V0XG4vLyAgICAgICAgICAgIGRpZmZlcmVuY2UgRkxBR0dFRCBcXCBRVUlFVDYwIG5vbi1lbXB0eS5cbi8vICAgU3RhcmsgICAgYGF0X3Jpc2tgICArIGNsb2NrIGF0IHRvZGF5KCksIGFuZCBOT1QgYSBjdXN0b21lciBcdTIwMTQgdGhlIHJvdyB0aGVcbi8vICAgICAgICAgICAgcGFuZWwncyBgcm93czogWyd0eXBlJ11gIGdyb3VwaW5nIGV4aXN0cyBmb3IgKCMxNjQ3KS4gV2hpbGUgZXZlcnlcbi8vICAgICAgICAgICAgZmxhZ2dlZCBhY2NvdW50IHdhcyBhIGBjdXN0b21lcmAgdGhlIGdyb3VwaW5nIHJlbmRlcmVkIGEgc2luZ2xlXG4vLyAgICAgICAgICAgIHJvdyBhbmQgY291bGQgZGVtb25zdHJhdGUgbm90aGluZzsgdGhlIGdyaWQgdmlld1xuLy8gICAgICAgICAgICBgY3JtX2FjY291bnQuYXRfcmlza19hY2NvdW50c2AgZmlsdGVycyBgdHlwZSA9PSAnY3VzdG9tZXInYFxuLy8gICAgICAgICAgICBiZWZvcmUgYW55dGhpbmcgZWxzZSwgc28gYSBmbGFnZ2VkIFBBUlRORVIgaXMgYSByb3cgdGhlIHJlcG9ydFxuLy8gICAgICAgICAgICBibG9jayBjYW4gc2hvdyBhbmQgdGhhdCBncmlkIGNhbm5vdC5cbi8vXG4vLyBUaGUgb3RoZXIgY3VzdG9tZXJzIHN0YXkgYGhlYWx0aHlgIG9uIHB1cnBvc2UuIEEgc2V2ZXJpdHkgZXZlcnkgcmVjb3JkXG4vLyBjYXJyaWVzIGRlbW9uc3RyYXRlcyBub3RoaW5nLCBhbmQgYGNodXJuaW5nYCBpcyB0aGUgbW9zdCBzZXZlcmUgb3B0aW9uIGluXG4vLyB0aGUgbW9kZWwgXHUyMDE0IG9uZSByZWNvcmQgaXMgd2hhdCBtYWtlcyBpdCByZWFsIHJhdGhlciB0aGFuIGRlY2xhcmVkLlxuLy9cbi8vIFRoZSB0aHJlZSBQUk9TUEVDVFMgY2Fycnkgbm8gYGhlYWx0aF9zY29yZWAgYXQgYWxsLCBhbmQgdGhhdCBibGFuayBpcyBhXG4vLyBzdGF0ZWQgY2hvaWNlIHJhdGhlciB0aGFuIGFuIG92ZXJzaWdodDogdGhlIGNvbHVtbiBpcyB3aGF0IGEgQ1NNIGFzc2VydHNcbi8vIGFib3V0IGEgUkVMQVRJT05TSElQLCBhbmQgbm9ib2R5IGhhcyBiZWVuIGluIHRoZSByb29tIHdpdGggYW4gYWNjb3VudCB0aGF0XG4vLyB3YXMgbmV2ZXIgd29uLiBUaGUgY3JpdGVyaW9uIGAkaW4gW2F0X3Jpc2ssIGNodXJuaW5nXWAgZG9lcyBub3QgbWF0Y2ggYW5cbi8vIGFic2VudCB2YWx1ZSwgc28gYSBibGFuayByb3cgaXMgb3V0c2lkZSB0aGUgcGFuZWwgZWl0aGVyIHdheSBcdTIwMTQgaXQgc2F5c1xuLy8gXCJub2JvZHkgaGFzIGFzc2Vzc2VkIHRoaXNcIiwgd2hpY2ggaXMgZXhhY3RseSB0cnVlIG9mIGEgcHJvc3BlY3QuXG4vL1xuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIGBhcHByb3ZhbF9zdGF0dXNgOiBldmVyeSBzZWVkZWQgYWNjb3VudCBpcyBhbHJlYWR5IHNpZ25lZCBvZmYgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vL1xuLy8gRWFjaCByb3cgYmVsb3cgc3RhdGVzIGBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCdgLCBhbmQgaXQgaGFzIHRvLiBPbiBhIHJlYWxcbi8vIGluc2VydCB0aGUgY29sdW1uIGlzIGJvcm4gYmxhbmsgYW5kIGBhY2NvdW50X2FwcHJvdmFsYCBzdWJtaXRzIGl0IChSRVEtMDAwMztcbi8vIHRoZSByZXF1ZXN0J3MgbWlycm9yIHdyaXRlcyBgcGVuZGluZ2AsICMyMDY3KS4gQSBzZWVkIHJvdyBuZXZlciByZWFjaGVzIHRoYXRcbi8vIGZsb3c6IHRoZSBwbGF0Zm9ybSB3cml0ZXMgZXZlcnkgc2VlZCByb3cgd2l0aCBgc2tpcFRyaWdnZXJzYFxuLy8gKGBTRUVEX1dSSVRFX0VYRUNVVElPTl9DT05URVhUYCwgYEBvYmplY3RzdGFjay9zcGVjYCksIGJlY2F1c2UgYSBzZWVkIGlzXG4vLyBlc3RhYmxpc2hlZCBFTkQtU1RBVEUgZGF0YSwgbm90IGEgdXNlciBldmVudC4gTGVmdCB1bnN0YXRlZCwgYSByb3cgd291bGRcbi8vIGNsYWltIG5vIHNpZ24tb2ZmIGF0IGFsbDsgdW5kZXIgdGhlIGZvcm1lciBgcGVuZGluZ2AgZGVmYXVsdCBpdCByZWFkXG4vLyBgcGVuZGluZ2Agd2l0aCBubyByZXF1ZXN0IGJlaGluZCBpdCwgdGhlIGNvbnNvbGUgc2hvd2VkIFwiTG9ja2VkIGZvclxuLy8gYXBwcm92YWxcIiBhbmQgZGlzYWJsZWQgRWRpdCwgYW5kIG5vIGFkbWluIGNvdWxkIGVkaXQgYSBzZWVkZWQgYWNjb3VudFxuLy8gKCMyMDQyKS4gVGhlc2UgYWNjb3VudHMgY2FycnkgZGVhbHMsIGNvbnRyYWN0cyBhbmQgY2FzZXM7IHRoZXkgYXJlIHBhc3Rcbi8vIHRoZWlyIHNpZ24tb2ZmLCBzbyB0aGUgcm93IHNheXMgc28uXG4vLyBcdTI2RDQgRG8gbm90IFwiZml4XCIgaXQgd2l0aCBhbiBgYXBwcm92ZWRgIGZpZWxkIGRlZmF1bHQgaW5zdGVhZDogdGhhdCBzd2l0Y2hlc1xuLy8gdGhlIGdhdGUgb2ZmIGZvciBldmVyeSBhY2NvdW50IGEgdXNlciBjcmVhdGVzLlxuZXhwb3J0IGNvbnN0IGFjY291bnRzID0gZGVmaW5lU2VlZChBY2NvdW50LCB7XG4gIG1vZGU6ICd1cHNlcnQnLFxuICBleHRlcm5hbElkOiAnbmFtZScsXG4gIHJlY29yZHM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcsXG4gICAgICB0eXBlOiAnY3VzdG9tZXInLFxuICAgICAgaW5kdXN0cnk6ICd0ZWNobm9sb2d5JyxcbiAgICAgIGFubnVhbF9yZXZlbnVlOiA1MDAwMDAwLFxuICAgICAgbnVtYmVyX29mX2VtcGxveWVlczogMjUwLFxuICAgICAgcGhvbmU6ICcrMS00MTUtNTU1LTAxMDAnLFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IHN0cmVldDogJzUwMCBIb3dhcmQgU3RyZWV0LCBTdWl0ZSA0MDAnLCBjaXR5OiAnU2FuIEZyYW5jaXNjbycsIHN0YXRlOiAnQ0EnLCBwb3N0YWxDb2RlOiAnOTQxMDUnLCBjb3VudHJ5OiAnVVMnIH0sXG4gICAgICB3ZWJzaXRlOiAnaHR0cHM6Ly9hY21lLmV4YW1wbGUuY29tJyxcbiAgICAgIHRpZXI6ICdlbnRlcnByaXNlJyxcbiAgICAgIHNlZ21lbnQ6ICdncm93dGgnLFxuICAgICAgaGVhbHRoX3Njb3JlOiAnaGVhbHRoeScsXG4gICAgICAvLyBIZWxkOiB3b3Jrc2hvcCwgZGVtbywgY2FsbHMgYW5kIGFuIG9uc2l0ZSB2aXNpdCBcdTIwMTQgc2VlIGBzZXJ2aWNlLnNlZWQudHNgLlxuICAgICAgbGFzdF9hY3Rpdml0eV9kYXRlOiBjZWxgdG9kYXkoKWAsXG4gICAgICAvLyBUaGUgQVJSIGxpbmUgYmVsb3cgdXNlZCB0byByZWFkIFwic2lnbmVkIFExIDIwMjUgcmVuZXdhbFwiIHdoaWxlIHRoZVxuICAgICAgLy8gZGVhbCBpdCBkZXNjcmliZXMgY2xvc2VzIGBkYXlzQWdvKDE1KWAgXHUyMDE0IGEgZml4ZWQgY2FsZW5kYXIgcXVhcnRlciBvbiBhXG4gICAgICAvLyByZWxhdGl2ZS1kYXRlIHJlY29yZCwgd3JvbmcgaW4gYm90aCB0aGUgcXVhcnRlciBhbmQgdGhlIHllYXIgKCMxNjkyKS5cbiAgICAgIC8vIFRoZSBsYWJlbCBpcyBub3QgcmUtZGVyaXZlZCBoZXJlIGVpdGhlcjogdGhhdCBkYXRlIGJlbG9uZ3MgdG9cbiAgICAgIC8vIGBBY21lIEFubnVhbCBSZW5ld2FsIDIwMjVgIChgY2xvc2VfZGF0ZWApIGFuZCB0byBpdHMgY29udHJhY3RcbiAgICAgIC8vIChgc2lnbmVkX2RhdGVgLCBgcmV2ZW51ZS5zZWVkLnRzYCksIGFuZCBjb21wdXRpbmcgYSBjb3B5IGluIHRoaXMgbW9kdWxlXG4gICAgICAvLyBtZWFucyByZS1zdGF0aW5nIHRoYXQgcmVjb3JkJ3Mgb3duIG9mZnNldCBcdTIwMTQgYSBzZWNvbmQgc291cmNlIG9mIHRydXRoXG4gICAgICAvLyBmb3IgYSB2YWx1ZSB0d28gcmVjb3JkcyBhbHJlYWR5IG93bi4gU2FtZSBydWxpbmcgYXMgdGhlIGBuZXh0X3N0ZXBgXG4gICAgICAvLyBibG9jayBiZWxvdyAoIzE2NjApOiBubyBkYXRlIGdvZXMgYmFjayBpbnRvIHRoaXMgcHJvc2UsIGFic29sdXRlIE9SXG4gICAgICAvLyByZWxhdGl2ZS4gV2hhdCBzdGF5cyB0cnVlIGhvd2V2ZXIgdGhlIHJlbmV3YWwgaXMgZGF0ZWQgaXMgdGhhdCBpdCBJU1xuICAgICAgLy8gc2lnbmVkOiB0aGUgZGVhbCBpcyBgY2xvc2VkX3dvbmAgYW5kIGl0cyBjb250cmFjdCBgYWN0aXZhdGVkYC5cbiAgICAgIGRlc2NyaXB0aW9uOiBgKipTdHJhdGVnaWMgQ3VzdG9tZXIgXHUwMEI3IEVudGVycHJpc2UgVGllcioqXG5cbkFjbWUgQ29ycG9yYXRpb24gaXMgYSBTZXJpZXMtQyByb2JvdGljcyAmIGluZHVzdHJpYWwgYXV0b21hdGlvblxuY29tcGFueSB0aGF0IHN3aXRjaGVkIGZyb20gYSBjb21wZXRpdG9yIDE4IG1vbnRocyBhZ28uIFRoZXkgcnVuXG5Ib3RDUk0gYXMgdGhlaXIgc3lzdGVtIG9mIHJlY29yZCBmb3Igc2FsZXMgKyBzZXJ2aWNlIGFjcm9zc1xudGhyZWUgcmVnaW9uYWwgdGVhbXMgKE5BLCBFTUVBLCBBUEFDKS5cblxuKipSZWxhdGlvbnNoaXAqKlxuLSBQcmltYXJ5IGVjb25vbWljIGJ1eWVyOiBKb3JkYW4gUGFyayAoQ1RPKSBcdTIwMTQgdmFsdWVzIG91ciBvcGVuXG4gIGFyY2hpdGVjdHVyZSBhbmQgQUkgcm9hZG1hcC5cbi0gRGF5LXRvLWRheSBjaGFtcGlvbjogSm9obiBTbWl0aCAoVlAgRW5naW5lZXJpbmcpIFx1MjAxNCBvd25zIHRoZVxuICB0ZWNobmljYWwgZXZhbHVhdGlvbiBhbmQgaW50ZWdyYXRpb24gcXVlc3Rpb25zLlxuLSBQcm9jdXJlbWVudDogaGFuZGxlZCBieSBMaXNhIEtpbSBcdTIwMTQgcHJlZmVycyBhbm51YWwgY29udHJhY3RzLFxuICBuZXQtMzAgdGVybXMuXG5cbioqQ3VycmVudCBzdGF0ZSoqXG4tIEFSUjogJDIyMEsgKHNpZ25lZCByZW5ld2FsKS4gVXAgMjIlIFlvWS5cbi0gMSBvcGVuIGVudGVycHJpc2Ugb3Bwb3J0dW5pdHkgKCQxNTBLIHBsYXRmb3JtIHVwZ3JhZGUpIGluIHByb3Bvc2FsXG4gIHN0YWdlLCAxIHNlcnZpY2UgdGlja2V0IG9wZW4gKGxvZ2luIGlzc3VlcyksIDEgYmlsbGluZyBkaXNwdXRlXG4gIGF3YWl0aW5nIGN1c3RvbWVyIHJlc3BvbnNlLlxuLSBBSSBhZ2VudCBnb3Zlcm5hbmNlIGJlY2FtZSBhIGhhcmQgcmVxdWlyZW1lbnQgZm9yIHRoYXQgdXBncmFkZVxuICBhZnRlciB0aGVpciBpbnRlcm5hbCBjb21wbGlhbmNlIHJldmlldywgc28gdGhlIHdvcmtzaG9wIG5vdyBvblxuICB0aGUgY2FsZW5kYXIgaXMgdGhlIGdhdGUgb24gc2lnbmF0dXJlLlxuXG4qKlJlZCBmbGFncyoqXG4tIExvc3QgdGhlICQ3NUsgTWFya2V0aW5nIENsb3VkIGFkZC1vbiBvbiB0aW1pbmcgXHUyMDE0IHRoZWlyIG1hcmtldGluZ1xuICBvcmcgaXMgbG9ja2VkIGludG8gYSAyLXllYXIgSHViU3BvdCBjb250cmFjdCwgYW5kIHRoZSBidXlpbmdcbiAgd2luZG93IG9wZW5zIHdoZW4gdGhhdCBjb250cmFjdCByZW5ld3MuXG4tIExvZ2luIGlzc3VlcyB0aWNrZXQgaXMgYWxyZWFkeSBwYXN0IGl0cyBTTEEgY2xvY2sgXHUyMDE0IG5lZWRzIGV5ZXNcbiAgdG9kYXkuYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdHbG9iZXggSW5kdXN0cmllcycsXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcsXG4gICAgICB0eXBlOiAncHJvc3BlY3QnLFxuICAgICAgaW5kdXN0cnk6ICdtYW51ZmFjdHVyaW5nJyxcbiAgICAgIGFubnVhbF9yZXZlbnVlOiAxMjAwMDAwMCxcbiAgICAgIG51bWJlcl9vZl9lbXBsb3llZXM6IDgwMCxcbiAgICAgIHBob25lOiAnKzEtMzEyLTU1NS0wMjAwJyxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBzdHJlZXQ6ICcyMzMgU291dGggV2Fja2VyIERyaXZlJywgY2l0eTogJ0NoaWNhZ28nLCBzdGF0ZTogJ0lMJywgcG9zdGFsQ29kZTogJzYwNjA2JywgY291bnRyeTogJ1VTJyB9LFxuICAgICAgd2Vic2l0ZTogJ2h0dHBzOi8vZ2xvYmV4LmV4YW1wbGUuY29tJyxcbiAgICAgIHRpZXI6ICdlbnRlcnByaXNlJyxcbiAgICAgIHNlZ21lbnQ6ICduZXRfbmV3JyxcbiAgICAgIC8vIE9ubHkgYSBib29rZWQgZGVtbyBhbmQgYSBjYW5jZWxsZWQgcmV2aWV3IFx1MjAxNCBuZWl0aGVyIGJ1YmJsZXMsIHNvIHRoaXNcbiAgICAgIC8vIDgtZGF5IGFnZSBzdXJ2aXZlcyB0aGUgc2VlZCBsb2FkIGFuZCBzdGF5cyBpbnNpZGUgZXZlcnkgY2h1cm4gd2luZG93LlxuICAgICAgbGFzdF9hY3Rpdml0eV9kYXRlOiBjZWxgZGF5c0Fnbyg4KWAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSW5pdGVjaCBTb2x1dGlvbnMnLFxuICAgICAgYXBwcm92YWxfc3RhdHVzOiAnYXBwcm92ZWQnLFxuICAgICAgdHlwZTogJ2N1c3RvbWVyJyxcbiAgICAgIGluZHVzdHJ5OiAnZmluYW5jZScsXG4gICAgICBhbm51YWxfcmV2ZW51ZTogMzUwMDAwMCxcbiAgICAgIG51bWJlcl9vZl9lbXBsb3llZXM6IDE1MCxcbiAgICAgIHBob25lOiAnKzEtMjEyLTU1NS0wMzAwJyxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBzdHJlZXQ6ICcxIExpYmVydHkgUGxhemEsIDIzcmQgRmxvb3InLCBjaXR5OiAnTmV3IFlvcmsnLCBzdGF0ZTogJ05ZJywgcG9zdGFsQ29kZTogJzEwMDA2JywgY291bnRyeTogJ1VTJyB9LFxuICAgICAgd2Vic2l0ZTogJ2h0dHBzOi8vaW5pdGVjaC5leGFtcGxlLmNvbScsXG4gICAgICB0aWVyOiAnbWlkX21hcmtldCcsXG4gICAgICBzZWdtZW50OiAnYXRfcmlzaycsXG4gICAgICBoZWFsdGhfc2NvcmU6ICdhdF9yaXNrJyxcbiAgICAgIC8vIFFVSUVUIDYwKyBcdTIwMTQgdGhlIGBhdF9yaXNrYCBzZWdtZW50IGFuZCBoZWFsdGggc2NvcmUsIHdpdGggYSBjbG9jayB0aGF0XG4gICAgICAvLyBmaW5hbGx5IGFncmVlcyB3aXRoIHRoZW06IHRlbiB3ZWVrcyBvZiBzaWxlbmNlLiBBIG5vLXNob3cgY2FsbCA1NSBkYXlzXG4gICAgICAvLyBhZ28gd2FzIHRoZSBsYXN0IGF0dGVtcHQ7IHRoZSByZS1lbmdhZ2VtZW50IGNhbGwgb24gdGhlIGNhbGVuZGFyIGlzXG4gICAgICAvLyBgcGxhbm5lZGAsIHNvIGl0IG1vdmVzIG5vdGhpbmcuXG4gICAgICBsYXN0X2FjdGl2aXR5X2RhdGU6IGNlbGBkYXlzQWdvKDcyKWAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnU3RhcmsgTWVkaWNhbCcsXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcsXG4gICAgICB0eXBlOiAncGFydG5lcicsXG4gICAgICBpbmR1c3RyeTogJ2hlYWx0aGNhcmUnLFxuICAgICAgYW5udWFsX3JldmVudWU6IDgwMDAwMDAsXG4gICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiA0MDAsXG4gICAgICAvLyBUaGUgb25lIENhbmFkaWFuIGFjY291bnQ6IHN0aWxsIGluc2lkZSBub3J0aF9hbWVyaWNhX3RlcnJpdG9yeSwgYW5kIHRoZVxuICAgICAgLy8gcmVhc29uIHRoYXQgcnVsZSdzIGAkaW5gIGxpc3QgaXMgbm90IGEgc2luZ2xlLWNvdW50cnkgbGlzdCBpbiBkaXNndWlzZS5cbiAgICAgIHBob25lOiAnKzEtNDE2LTU1NS0wNDAwJyxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBzdHJlZXQ6ICcxODEgQmF5IFN0cmVldCwgU3VpdGUgMjIwMCcsIGNpdHk6ICdUb3JvbnRvJywgc3RhdGU6ICdPTicsIHBvc3RhbENvZGU6ICdNNUogMlQzJywgY291bnRyeTogJ0NBJyB9LFxuICAgICAgd2Vic2l0ZTogJ2h0dHBzOi8vc3RhcmttZWQuZXhhbXBsZS5jb20nLFxuICAgICAgdGllcjogJ21pZF9tYXJrZXQnLFxuICAgICAgc2VnbWVudDogJ3N0YWJsZScsXG4gICAgICAvLyBgYXRfcmlza2AgcmF0aGVyIHRoYW4gYGNodXJuaW5nYCwgYW5kIHRoZSBkaXN0aW5jdGlvbiBpcyB0aGUgcmVhc29uXG4gICAgICAvLyB0aGlzIHJvdyBjYW4gZXhpc3QgYXQgYWxsOiBhIHBhcnRuZXIgd2hvc2UgcGlsb3Qgd2FzIFdPTiBhbmQgd2hvc2VcbiAgICAgIC8vIGV4cGFuc2lvbiB0aGVuIGRpZWQgb24gYSBjYXBpdGFsIGZyZWV6ZSBjYW4gYmUgYXQgcmlzaywgYnV0IGl0IHdhc1xuICAgICAgLy8gbmV2ZXIgYSBzdWJzY3JpcHRpb24gdGhhdCBjb3VsZCBjaHVybi4gVGhlIHJlY29yZHMgc2F5IGl0IFx1MjAxNCBgU3RhcmtcbiAgICAgIC8vIEV4cGFuc2lvbiAoTG9zdClgIGNsb3NlZCBgbm9fYnVkZ2V0YCA2MCBkYXlzIGFnbyBhbmQgdGhlIHBhcnRuZXJzaGlwXG4gICAgICAvLyBjb250cmFjdCBpcyBzdGlsbCBpbiBsZWdhbCByZXZpZXcgXHUyMDE0IGFuZCB0aGUgcGFuZWwncyBjcml0ZXJpb24gYWRtaXRzXG4gICAgICAvLyBib3RoIHZhbHVlcywgc28gdGhlIGhvbmVzdCBzZXZlcml0eSBpcyBhbHNvIHRoZSBvbmUgdGhhdCBmbGFncy5cbiAgICAgIC8vXG4gICAgICAvLyBEaXZlcmdpbmcgZnJvbSBgc2VnbWVudDogJ3N0YWJsZSdgIGlzIGRlbGliZXJhdGUsIHRoZSBzYW1lIHNwbGl0XG4gICAgICAvLyBXYXluZSBkZW1vbnN0cmF0ZXMgYmVsb3c6IGBzZWdtZW50YCBpcyBob3cgdGhlIGJvb2sgY2xhc3NpZmllcyB0aGVcbiAgICAgIC8vIGFjY291bnQsIGBoZWFsdGhfc2NvcmVgIGlzIHdoYXQgYSBwZXJzb24gYXNzZXJ0cyBhYm91dCBpdC4gVGhlIGNsb2NrXG4gICAgICAvLyBzdGF5cyBhdCB0b2RheSgpLCBzbyBsaWtlIFdheW5lIHRoaXMgcm93IGlzIG91dHNpZGUgZXZlcnkgd2luZG93ZWRcbiAgICAgIC8vIHBhbmVsIG9uIHRoYXQgcmVwb3J0OiBpdCByZWFjaGVzIGBjc21fZmxhZ2dlZF9hY2NvdW50c2AgYW5kIG5vIG90aGVyXG4gICAgICAvLyBibG9jay5cbiAgICAgIGhlYWx0aF9zY29yZTogJ2F0X3Jpc2snLFxuICAgICAgLy8gVGhlIGNvbXBsZXRlZCAnU2VuZCB3ZWxjb21lIHBhY2thZ2UnIHRhc2sgYnViYmxlcyBoZXJlIG9uIGV2ZXJ5IHNlZWRcbiAgICAgIC8vIGxvYWQsIHNvIHRoaXMgaGFzIEFMV0FZUyByZXNvbHZlZCB0byB0b2RheSBcdTIwMTQgdGhlIHByZXZpb3VzIGBkYXlzQWdvKDUpYFxuICAgICAgLy8gd2FzIGF1dGhvcmVkIGFuZCB0aGVuIG92ZXJ3cml0dGVuIGJlZm9yZSBhbnlvbmUgY291bGQgcmVhZCBpdC5cbiAgICAgIGxhc3RfYWN0aXZpdHlfZGF0ZTogY2VsYHRvZGF5KClgLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1dheW5lIEVudGVycHJpc2VzJyxcbiAgICAgIGFwcHJvdmFsX3N0YXR1czogJ2FwcHJvdmVkJyxcbiAgICAgIHR5cGU6ICdjdXN0b21lcicsXG4gICAgICBpbmR1c3RyeTogJ3RlY2hub2xvZ3knLFxuICAgICAgYW5udWFsX3JldmVudWU6IDI1MDAwMDAwLFxuICAgICAgbnVtYmVyX29mX2VtcGxveWVlczogMjAwMCxcbiAgICAgIHBob25lOiAnKzEtNjUwLTU1NS0wNTAwJyxcbiAgICAgIGJpbGxpbmdfYWRkcmVzczogeyBzdHJlZXQ6ICczMDAwIEhhbm92ZXIgU3RyZWV0JywgY2l0eTogJ1BhbG8gQWx0bycsIHN0YXRlOiAnQ0EnLCBwb3N0YWxDb2RlOiAnOTQzMDQnLCBjb3VudHJ5OiAnVVMnIH0sXG4gICAgICB3ZWJzaXRlOiAnaHR0cHM6Ly93YXluZS5leGFtcGxlLmNvbScsXG4gICAgICB0aWVyOiAnc3RyYXRlZ2ljJyxcbiAgICAgIHNlZ21lbnQ6ICdncm93dGgnLFxuICAgICAgLy8gQ0hVUk5JTkcsIHdpdGggdGhlIGNsb2NrIHN0aWxsIHJ1bm5pbmcgXHUyMDE0IHRoZSBwb3B1bGF0aW9uXG4gICAgICAvLyBgY3NtX2ZsYWdnZWRfYWNjb3VudHNgIGV4aXN0cyBmb3IgKCMxNDE0KS4gRXZlcnkgREVSSVZFRCBzaWduYWwgb25cbiAgICAgIC8vIHRoaXMgcm93IHJlYWRzIGhlYWx0aHk6IGFuIG9wZXJhdGlvbnMgcm9sbG91dCBjbG9zZWQgZm91ciBkYXlzIGFnbywgYVxuICAgICAgLy8gbGljZW5jZSBzaXRzIGF0IDgwJSB0d28gd2Vla3MgZnJvbSBzaWduYXR1cmUsIHRocmVlIG1lZXRpbmdzIHdlcmUgaGVsZFxuICAgICAgLy8gdGhpcyBtb250aC4gVGhlIENTTSB3aG8gaGFzIGJlZW4gaW4gdGhlIHJvb20gc2F5cyB0aGUgYWNjb3VudCBpcyBnb2luZ1xuICAgICAgLy8gYW55d2F5LCBhbmQgYGhlYWx0aF9zY29yZWAgaXMgdGhlIG9ubHkgY2h1cm4gc2lnbmFsIGluIHRoZSBtb2RlbCBhXG4gICAgICAvLyBwZXJzb24gQVNTRVJUUyBcdTIwMTQgd2hpY2ggaXMgd2h5IHRoZSBwYW5lbCB0aGF0IHJlYWRzIGl0IGlzIGZpcnN0IG9uIHRoZVxuICAgICAgLy8gcmVwb3J0IGFuZCBjYXJyaWVzIG5vIHRpbWUgd2luZG93LlxuICAgICAgLy9cbiAgICAgIC8vIFx1MjZENCBEbyBub3QgXCJjb3JyZWN0XCIgdGhpcyB0byBgYXRfcmlza2AgdG8gYWdyZWUgd2l0aCB0aGUgcGlwZWxpbmUsIGFuZFxuICAgICAgLy8gXHUyNkQ0IGRvIG5vdCBzdG9wIHRoZSBjbG9jayB0byBhZ3JlZSB3aXRoIHRoZSBoZWFsdGggc2NvcmU6IGVpdGhlciBlZGl0XG4gICAgICAvLyBmb2xkcyB0aGUgcm93IGJhY2sgaW50byBgYXRfcmlza19hY2NvdW50c2AgKDYwLWRheSB3aW5kb3cpIGFuZCB0aGVcbiAgICAgIC8vIGZsYWdnZWQgcGFuZWwgZ29lcyBiYWNrIHRvIHJlc3RhdGluZyBpdHMgbmVpZ2hib3VyLlxuICAgICAgaGVhbHRoX3Njb3JlOiAnY2h1cm5pbmcnLFxuICAgICAgLy8gSGVsZDogbmVnb3RpYXRpb24gbWVldGluZywgc2VjdXJpdHktYWRkZW5kdW0gY2FsbCwgZ292ZXJuYW5jZSB3ZWJpbmFyLlxuICAgICAgbGFzdF9hY3Rpdml0eV9kYXRlOiBjZWxgdG9kYXkoKWAsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnTm9ydGh3aW5kIEVuZXJneScsXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcsXG4gICAgICB0eXBlOiAncHJvc3BlY3QnLFxuICAgICAgaW5kdXN0cnk6ICdlbmVyZ3knLFxuICAgICAgYW5udWFsX3JldmVudWU6IDE4MDAwMDAwLFxuICAgICAgbnVtYmVyX29mX2VtcGxveWVlczogMTEwMCxcbiAgICAgIC8vIGV1cm9wZV90ZXJyaXRvcnksIGhhbGYgMTogREUuXG4gICAgICBwaG9uZTogJys0OS04OS01NTUwLTA2MDAnLFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IHN0cmVldDogJ0xlb3BvbGRzdHJhc3NlIDIxJywgY2l0eTogJ011bmljaCcsIHN0YXRlOiAnQlknLCBwb3N0YWxDb2RlOiAnODA4MDInLCBjb3VudHJ5OiAnREUnIH0sXG4gICAgICB3ZWJzaXRlOiAnaHR0cHM6Ly9ub3J0aHdpbmQuZXhhbXBsZS5jb20nLFxuICAgICAgdGllcjogJ2VudGVycHJpc2UnLFxuICAgICAgc2VnbWVudDogJ25ldF9uZXcnLFxuICAgICAgLy8gUVVJRVQgMzArIFx1MjAxNCB0aGUgZmllbGQtc2VydmljZSBwaWxvdCB3YXMgbG9zdCA4MCBkYXlzIGFnbyBhbmQgdGhlIGdyaWRcbiAgICAgIC8vIHByb2dyYW0gaGFzIG5vdCBiZWVuIHdvcmtlZCBzaW5jZS4gVGhlIGRpc2NvdmVyeSB3b3Jrc2hvcCBpcyBib29rZWQsXG4gICAgICAvLyBub3QgaGVsZC5cbiAgICAgIGxhc3RfYWN0aXZpdHlfZGF0ZTogY2VsYGRheXNBZ28oNDEpYCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQSByZWdpb25hbCBlbmVyZ3kgcHJvdmlkZXIgZXZhbHVhdGluZyBhIHVuaWZpZWQgb3BlcmF0aW9ucyBhbmQgY3VzdG9tZXItZGF0YSBwbGF0Zm9ybS4nLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ZlcnRleCBBbmFseXRpY3MnLFxuICAgICAgYXBwcm92YWxfc3RhdHVzOiAnYXBwcm92ZWQnLFxuICAgICAgdHlwZTogJ2N1c3RvbWVyJyxcbiAgICAgIGluZHVzdHJ5OiAnc29mdHdhcmUnLFxuICAgICAgYW5udWFsX3JldmVudWU6IDk1MDAwMDAsXG4gICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiA0MjAsXG4gICAgICBwaG9uZTogJysxLTUxMi01NTUtMDcwMCcsXG4gICAgICBiaWxsaW5nX2FkZHJlc3M6IHsgc3RyZWV0OiAnNjAwIENvbmdyZXNzIEF2ZW51ZSwgRmxvb3IgMTQnLCBjaXR5OiAnQXVzdGluJywgc3RhdGU6ICdUWCcsIHBvc3RhbENvZGU6ICc3ODcwMScsIGNvdW50cnk6ICdVUycgfSxcbiAgICAgIHdlYnNpdGU6ICdodHRwczovL3ZlcnRleC5leGFtcGxlLmNvbScsXG4gICAgICB0aWVyOiAnZW50ZXJwcmlzZScsXG4gICAgICBzZWdtZW50OiAnZ3Jvd3RoJyxcbiAgICAgIGhlYWx0aF9zY29yZTogJ2hlYWx0aHknLFxuICAgICAgLy8gSGVsZDogcm9sbG91dCBtZWV0aW5nLCBhbmFseXRpY3MgZGVtbywgY29tbWl0dGVlIGNhbGwsIHJldHJvc3BlY3RpdmUuXG4gICAgICBsYXN0X2FjdGl2aXR5X2RhdGU6IGNlbGB0b2RheSgpYCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQW4gYW5hbHl0aWNzIFNhYVMgY3VzdG9tZXIgZXhwYW5kaW5nIHVzYWdlIGZyb20gdGhlIGRhdGEgdGVhbSB0byBpdHMgcmV2ZW51ZSBvcmdhbml6YXRpb24uJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdMYXR0aWNlIEVkdWNhdGlvbicsXG4gICAgICBhcHByb3ZhbF9zdGF0dXM6ICdhcHByb3ZlZCcsXG4gICAgICB0eXBlOiAnY3VzdG9tZXInLFxuICAgICAgaW5kdXN0cnk6ICdlZHVjYXRpb24nLFxuICAgICAgYW5udWFsX3JldmVudWU6IDY4MDAwMDAsXG4gICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiAzMjAsXG4gICAgICAvLyBldXJvcGVfdGVycml0b3J5LCBoYWxmIDIgXHUyMDE0IGFuZCB0aGUgYWxpYXMgZml4dHVyZS4gYFVLYCBpcyBub3QgSVNPXG4gICAgICAvLyAzMTY2LTEgYWxwaGEtMiAoYEdCYCBpcyk7IGl0IGlzIGFuIEFDQ0VQVEVEIFNQRUxMSU5HIGluXG4gICAgICAvLyBgc3JjL3NhbGVzL29iamVjdHMvX3RlcnJpdG9yeS50c2AsIHNvIHRoaXMgcm93IHByb3ZlcyBvbiBzdG9jayBkYXRhIHRoYXQgYVxuICAgICAgLy8gbGVnYWN5IHNwZWxsaW5nIHN0aWxsIGxhbmRzIGluIGBlbWVhYCAoIzYzOSkuIE5vIGBzdGF0ZWA6IGFuIGFkZHJlc3NcbiAgICAgIC8vIHdpdGhvdXQgYSBzdWJkaXZpc2lvbiBpcyBhIG5vcm1hbCBzaGFwZSwgYW5kIG9ubHkgYGNvdW50cnlgIGlzIHJlYWQuXG4gICAgICBwaG9uZTogJys0NC0yMC03OTQ2LTA4MDAnLFxuICAgICAgYmlsbGluZ19hZGRyZXNzOiB7IHN0cmVldDogJzIwIEZlbmNodXJjaCBTdHJlZXQnLCBjaXR5OiAnTG9uZG9uJywgcG9zdGFsQ29kZTogJ0VDM00gM0JZJywgY291bnRyeTogJ1VLJyB9LFxuICAgICAgd2Vic2l0ZTogJ2h0dHBzOi8vbGF0dGljZS5leGFtcGxlLmNvbScsXG4gICAgICB0aWVyOiAnbWlkX21hcmtldCcsXG4gICAgICBzZWdtZW50OiAnc3RhYmxlJyxcbiAgICAgIGhlYWx0aF9zY29yZTogJ2hlYWx0aHknLFxuICAgICAgLy8gU2lnbmVkIHRoZSBhbmFseXRpY3MgZXhwYW5zaW9uIHNpeCBkYXlzIGFnbzsgdGhlIHJlbmV3YWwgcmV2aWV3IGlzXG4gICAgICAvLyBib29rZWQsIG5vdCBoZWxkLCBzbyBub3RoaW5nIGJ1YmJsZXMgYW5kIHRoaXMgYWdlIHN0YW5kcy5cbiAgICAgIGxhc3RfYWN0aXZpdHlfZGF0ZTogY2VsYGRheXNBZ28oNilgLFxuICAgICAgZGVzY3JpcHRpb246ICdBIGhpZ2hlci1lZHVjYXRpb24gdGVjaG5vbG9neSBjb21wYW55IGNvbnNvbGlkYXRpbmcgYWRtaXNzaW9ucywgc3R1ZGVudC1zdWNjZXNzIGFuZCBhbHVtbmkgd29ya2Zsb3dzLicsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnQXBleCBMb2dpc3RpY3MnLFxuICAgICAgYXBwcm92YWxfc3RhdHVzOiAnYXBwcm92ZWQnLFxuICAgICAgdHlwZTogJ3Byb3NwZWN0JyxcbiAgICAgIGluZHVzdHJ5OiAnbG9naXN0aWNzJyxcbiAgICAgIGFubnVhbF9yZXZlbnVlOiAyMjAwMDAwMCxcbiAgICAgIG51bWJlcl9vZl9lbXBsb3llZXM6IDE0MDAsXG4gICAgICAvLyBgdGVycml0b3J5ID09IFwib3RoZXJcImAgb24gcHVycG9zZTogd2l0aG91dCBhIHJlY29yZCB0aGF0IG1hdGNoZXNcbiAgICAgIC8vIG5laXRoZXIgcnVsZSwgXCJ0aGUgcnVsZXMgcGFydGl0aW9uIHRoZSBhY2NvdW50c1wiIGlzIHVuZmFsc2lmaWFibGUgXHUyMDE0XG4gICAgICAvLyBhIG1hdGNoLWFsbCByZWdyZXNzaW9uIHdvdWxkIGxvb2sgaWRlbnRpY2FsIHRvIGEgd29ya2luZyBvbmUuIGBTR2AgaXNcbiAgICAgIC8vIGEgcmVhbCBjb3VudHJ5IHRoZSBzdGFmZmVkIHRlcnJpdG9yaWVzIGRvIG5vdCBjb3Zlciwgd2hpY2ggaXMgZXhhY3RseVxuICAgICAgLy8gd2hhdCBgb3RoZXJgIGlzIGZvciAoIzYzOSkgXHUyMDE0IGl0IGlzIGEgc3RhdGVkIGNsYXNzaWZpY2F0aW9uIGhlcmUsIG5vdCBhXG4gICAgICAvLyBibGFuay5cbiAgICAgIHBob25lOiAnKzY1LTY1NTUtMDkwMCcsXG4gICAgICBiaWxsaW5nX2FkZHJlc3M6IHsgc3RyZWV0OiAnMTAgTWFyaW5hIEJvdWxldmFyZCwgIzMwLTAxJywgY2l0eTogJ1NpbmdhcG9yZScsIHBvc3RhbENvZGU6ICcwMTg5ODMnLCBjb3VudHJ5OiAnU0cnIH0sXG4gICAgICB3ZWJzaXRlOiAnaHR0cHM6Ly9hcGV4bG9naXN0aWNzLmV4YW1wbGUuY29tJyxcbiAgICAgIHRpZXI6ICdlbnRlcnByaXNlJyxcbiAgICAgIHNlZ21lbnQ6ICduZXRfbmV3JyxcbiAgICAgIC8vIFFVSUVUIDkwKyBcdTIwMTQgYSBsb3N0IGNvbXBsaWFuY2UgZGVhbCAxMTAgZGF5cyBhZ28gYW5kIGEgZGF0YS1odWJcbiAgICAgIC8vIGV2YWx1YXRpb24gdGhhdCBoYXMgYmVlbiBzaWxlbnQgZm9yIGEgcXVhcnRlci4gT25seSBhIGJvb2tlZFxuICAgICAgLy8gcmUtZW5nYWdlbWVudCBjYWxsLlxuICAgICAgbGFzdF9hY3Rpdml0eV9kYXRlOiBjZWxgZGF5c0FnbygxMDQpYCxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQSBmYXN0LWdyb3dpbmcgbG9naXN0aWNzIHByb3ZpZGVyIGFzc2Vzc2luZyBhIG1vZGVybiBkYXRhIGh1YiBmb3IgaXRzIG9wZXJhdGlvbnMgYW5kIGNvbW1lcmNpYWwgdGVhbXMuJyxcbiAgICB9LFxuICBdXG59KTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENvbnRhY3RzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IGNvbnN0IGNvbnRhY3RzID0gZGVmaW5lU2VlZChDb250YWN0LCB7XG4gIG1vZGU6ICd1cHNlcnQnLFxuICBleHRlcm5hbElkOiAnZW1haWwnLFxuICByZWNvcmRzOiBbXG4gICAge1xuICAgICAgc2FsdXRhdGlvbjogJ21yJyxcbiAgICAgIGZpcnN0X25hbWU6ICdKb2huJyxcbiAgICAgIGxhc3RfbmFtZTogJ1NtaXRoJyxcbiAgICAgIGVtYWlsOiAnam9obi5zbWl0aEBhY21lLmV4YW1wbGUuY29tJyxcbiAgICAgIHBob25lOiAnKzEtNDE1LTU1NS0wMTAxJyxcbiAgICAgIHRpdGxlOiAnVlAgb2YgRW5naW5lZXJpbmcnLFxuICAgICAgZGVwYXJ0bWVudDogJ2VuZ2luZWVyaW5nJyxcbiAgICAgIGNybV9hY2NvdW50OiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICBpc19wcmltYXJ5OiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgc2FsdXRhdGlvbjogJ21zJyxcbiAgICAgIGZpcnN0X25hbWU6ICdTYXJhaCcsXG4gICAgICBsYXN0X25hbWU6ICdKb2huc29uJyxcbiAgICAgIGVtYWlsOiAnc2FyYWguakBnbG9iZXguZXhhbXBsZS5jb20nLFxuICAgICAgcGhvbmU6ICcrMS0zMTItNTU1LTAyMDEnLFxuICAgICAgdGl0bGU6ICdDaGllZiBQcm9jdXJlbWVudCBPZmZpY2VyJyxcbiAgICAgIGRlcGFydG1lbnQ6ICdleGVjdXRpdmUnLFxuICAgICAgY3JtX2FjY291bnQ6ICdHbG9iZXggSW5kdXN0cmllcycsXG4gICAgICBpc19wcmltYXJ5OiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgc2FsdXRhdGlvbjogJ2RyJyxcbiAgICAgIGZpcnN0X25hbWU6ICdNaWNoYWVsJyxcbiAgICAgIGxhc3RfbmFtZTogJ0NoZW4nLFxuICAgICAgZW1haWw6ICdtY2hlbkBpbml0ZWNoLmV4YW1wbGUuY29tJyxcbiAgICAgIHBob25lOiAnKzEtMjEyLTU1NS0wMzAxJyxcbiAgICAgIHRpdGxlOiAnRGlyZWN0b3Igb2YgT3BlcmF0aW9ucycsXG4gICAgICBkZXBhcnRtZW50OiAnb3BlcmF0aW9ucycsXG4gICAgICBjcm1fYWNjb3VudDogJ0luaXRlY2ggU29sdXRpb25zJyxcbiAgICAgIGlzX3ByaW1hcnk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBzYWx1dGF0aW9uOiAnbXMnLFxuICAgICAgZmlyc3RfbmFtZTogJ0VtaWx5JyxcbiAgICAgIGxhc3RfbmFtZTogJ0RhdmlzJyxcbiAgICAgIGVtYWlsOiAnZW1pbHkuZEBzdGFya21lZC5leGFtcGxlLmNvbScsXG4gICAgICBwaG9uZTogJysxLTYxNy01NTUtMDQwMScsXG4gICAgICB0aXRsZTogJ0hlYWQgb2YgUGFydG5lcnNoaXBzJyxcbiAgICAgIGRlcGFydG1lbnQ6ICdzYWxlcycsXG4gICAgICBjcm1fYWNjb3VudDogJ1N0YXJrIE1lZGljYWwnLFxuICAgICAgaXNfcHJpbWFyeTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNhbHV0YXRpb246ICdtcicsXG4gICAgICBmaXJzdF9uYW1lOiAnUm9iZXJ0JyxcbiAgICAgIGxhc3RfbmFtZTogJ1dpbHNvbicsXG4gICAgICBlbWFpbDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLFxuICAgICAgcGhvbmU6ICcrMS02NTAtNTU1LTA1MDEnLFxuICAgICAgdGl0bGU6ICdDVE8nLFxuICAgICAgZGVwYXJ0bWVudDogJ2VuZ2luZWVyaW5nJyxcbiAgICAgIGNybV9hY2NvdW50OiAnV2F5bmUgRW50ZXJwcmlzZXMnLFxuICAgICAgaXNfcHJpbWFyeTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNhbHV0YXRpb246ICdtcycsXG4gICAgICBmaXJzdF9uYW1lOiAnT2xpdmlhJyxcbiAgICAgIGxhc3RfbmFtZTogJ0NoZW4nLFxuICAgICAgZW1haWw6ICdvbGl2aWEuY2hlbkBub3J0aHdpbmQuZXhhbXBsZS5jb20nLFxuICAgICAgcGhvbmU6ICcrMS0zMDMtNTU1LTA2MDEnLFxuICAgICAgdGl0bGU6ICdWUCBvZiBEaWdpdGFsIE9wZXJhdGlvbnMnLFxuICAgICAgZGVwYXJ0bWVudDogJ29wZXJhdGlvbnMnLFxuICAgICAgY3JtX2FjY291bnQ6ICdOb3J0aHdpbmQgRW5lcmd5JyxcbiAgICAgIGlzX3ByaW1hcnk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBzYWx1dGF0aW9uOiAnbXInLFxuICAgICAgZmlyc3RfbmFtZTogJ0V0aGFuJyxcbiAgICAgIGxhc3RfbmFtZTogJ0Jyb29rcycsXG4gICAgICBlbWFpbDogJ2V0aGFuLmJyb29rc0B2ZXJ0ZXguZXhhbXBsZS5jb20nLFxuICAgICAgcGhvbmU6ICcrMS01MTItNTU1LTA3MDEnLFxuICAgICAgdGl0bGU6ICdDaGllZiBSZXZlbnVlIE9mZmljZXInLFxuICAgICAgZGVwYXJ0bWVudDogJ2V4ZWN1dGl2ZScsXG4gICAgICBjcm1fYWNjb3VudDogJ1ZlcnRleCBBbmFseXRpY3MnLFxuICAgICAgaXNfcHJpbWFyeTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHNhbHV0YXRpb246ICdtcycsXG4gICAgICBmaXJzdF9uYW1lOiAnUHJpeWEnLFxuICAgICAgbGFzdF9uYW1lOiAnU2hhaCcsXG4gICAgICBlbWFpbDogJ3ByaXlhLnNoYWhAbGF0dGljZS5leGFtcGxlLmNvbScsXG4gICAgICBwaG9uZTogJysxLTYxNy01NTUtMDgwMScsXG4gICAgICB0aXRsZTogJ1ZQIG9mIFN0dWRlbnQgU3VjY2VzcycsXG4gICAgICBkZXBhcnRtZW50OiAnb3BlcmF0aW9ucycsXG4gICAgICBjcm1fYWNjb3VudDogJ0xhdHRpY2UgRWR1Y2F0aW9uJyxcbiAgICAgIGlzX3ByaW1hcnk6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBzYWx1dGF0aW9uOiAnbXInLFxuICAgICAgZmlyc3RfbmFtZTogJ01hcmN1cycsXG4gICAgICBsYXN0X25hbWU6ICdSZWVkJyxcbiAgICAgIGVtYWlsOiAnbWFyY3VzLnJlZWRAYXBleGxvZ2lzdGljcy5leGFtcGxlLmNvbScsXG4gICAgICBwaG9uZTogJysxLTQwNC01NTUtMDkwMScsXG4gICAgICB0aXRsZTogJ0RpcmVjdG9yIG9mIENvbW1lcmNpYWwgU3lzdGVtcycsXG4gICAgICBkZXBhcnRtZW50OiAnb3BlcmF0aW9ucycsXG4gICAgICBjcm1fYWNjb3VudDogJ0FwZXggTG9naXN0aWNzJyxcbiAgICAgIGlzX3ByaW1hcnk6IHRydWUsXG4gICAgfSxcbiAgXVxufSk7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBMZWFkcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8qKlxuICogRGlzcXVhbGlmaWNhdGlvbiByZWFzb25zIGZvciB0aGUgZ2VuZXJhdGVkIGB1bnF1YWxpZmllZGAgZGVtbyBsZWFkcywgcGFpcmVkXG4gKiB3aXRoIHRoZSBub3RlIHRoYXQgZXhwbGFpbnMgdGhlbS5cbiAqXG4gKiBgY3JtX2xlYWQuZGlzcXVhbGlmaWNhdGlvbl9yZWFzb25fcmVxdWlyZWRgIHJlamVjdHMgYW4gdW5xdWFsaWZpZWQgbGVhZCB0aGF0XG4gKiBjYXJyaWVzIG5vIHJlYXNvbiwgc28gZXZlcnkgc2VlZGVkIHVucXVhbGlmaWVkIHJvdyBtdXN0IHN1cHBseSBvbmUgXHUyMDE0IHRoZSByb3dzXG4gKiB1c2VkIHRvIGNhcnJ5IGEgYnVkZ2V0LWZsYXZvdXJlZCBub3RlIGFuZCBubyByZWFzb24gYXQgYWxsLiBSb3RhdGVkIG92ZXIgZm91clxuICogdmFsdWVzIHNvIHRoZSBkZW1vJ3MgZGlzcXVhbGlmaWNhdGlvbiBicmVha2Rvd24gaGFzIG1vcmUgdGhhbiBvbmUgYmFyLCBhbmRcbiAqIHRoZSBub3RlIGFsd2F5cyBtYXRjaGVzIHRoZSByZWFzb24gaXQgc2l0cyBuZXh0IHRvLlxuICovXG5jb25zdCBESVNRVUFMSUZJQ0FUSU9OX1JFQVNPTlMgPSBbXG4gIHsgcmVhc29uOiAnbm9fYnVkZ2V0JywgICAgIG5vdGU6ICdObyBidWRnZXQgYXBwcm92ZWQgZm9yIHRoaXMgZmlzY2FsIHllYXIgXHUyMDE0IHJldmlzaXQgbmV4dCBwbGFubmluZyBjeWNsZS4nIH0sXG4gIHsgcmVhc29uOiAnbm90X2FfZml0JywgICAgIG5vdGU6ICdSZXF1aXJlbWVudHMgc2l0IG91dHNpZGUgd2hhdCB0aGUgcHJvZHVjdCBjb3ZlcnMgdG9kYXkuJyB9LFxuICB7IHJlYXNvbjogJ3dyb25nX3BlcnNvbmEnLCBub3RlOiAnQ29udGFjdCBoYXMgbm8gc2F5IGluIHRoZSBidXlpbmcgZGVjaXNpb24gYW5kIG5vIHBhdGggdG8gYW4gb3duZXIuJyB9LFxuICB7IHJlYXNvbjogJ3VucmVhY2hhYmxlJywgICBub3RlOiAnU2l4IHRvdWNoZXMgYWNyb3NzIGVtYWlsIGFuZCBwaG9uZSBvdmVyIGZvdXIgd2Vla3MsIG5vIHJlc3BvbnNlLicgfSxcbl0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBsZWFkcyA9IGRlZmluZVNlZWQoTGVhZCwge1xuICBtb2RlOiAndXBzZXJ0JyxcbiAgZXh0ZXJuYWxJZDogJ2VtYWlsJyxcbiAgcmVjb3JkczogW1xuICAgIHtcbiAgICAgIGZpcnN0X25hbWU6ICdBbGljZScsXG4gICAgICBsYXN0X25hbWU6ICdNYXJ0aW5leicsXG4gICAgICBjb21wYW55OiAnTmV4dEdlbiBSZXRhaWwnLFxuICAgICAgZW1haWw6ICdhbGljZUBuZXh0Z2VucmV0YWlsLmV4YW1wbGUuY29tJyxcbiAgICAgIHBob25lOiAnKzEtNTAzLTU1NS0wNjAwJyxcbiAgICAgIHN0YXR1czogJ25ldycsXG4gICAgICBsZWFkX3NvdXJjZTogJ3dlYicsXG4gICAgICBpbmR1c3RyeTogJ3JldGFpbCcsXG4gICAgICByYXRpbmc6IDMsXG4gICAgICBuZXh0X2ZvbGxvd3VwX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygyKWAsXG4gICAgfSxcbiAgICB7XG4gICAgICBmaXJzdF9uYW1lOiAnRGF2aWQnLFxuICAgICAgbGFzdF9uYW1lOiAnS2ltJyxcbiAgICAgIGNvbXBhbnk6ICdFZHVUZWNoIExhYnMnLFxuICAgICAgZW1haWw6ICdka2ltQGVkdXRlY2hsYWJzLmV4YW1wbGUuY29tJyxcbiAgICAgIHBob25lOiAnKzEtNDA4LTU1NS0wNzAwJyxcbiAgICAgIHN0YXR1czogJ2NvbnRhY3RlZCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ3JlZmVycmFsJyxcbiAgICAgIGluZHVzdHJ5OiAnZWR1Y2F0aW9uJyxcbiAgICAgIHJhdGluZzogNCxcbiAgICAgIG5leHRfZm9sbG93dXBfZGF0ZTogY2VsYGRheXNGcm9tTm93KDEpYCxcbiAgICAgIC8vIEEgc2VlZGVkIGBoZWxkYCBldmVudCBuYW1lcyB0aGlzIGxlYWQsIGFuZCBgZXZlbnRfYWN0aXZpdHlfYnViYmxlYFxuICAgICAgLy8gc3RhbXBzIGBsYXN0X2NvbnRhY3RlZF9kYXRlYCB3aXRoIHRoZSBTRUVEIE1PTUVOVCByYXRoZXIgdGhhbiB0aGVcbiAgICAgIC8vIGV2ZW50J3Mgb3duIHRpbWVzdGFtcCBcdTIwMTQgc28gYW4gYXV0aG9yZWQgYWdlIGhlcmUgd291bGQgYmUgb3ZlcndyaXR0ZW5cbiAgICAgIC8vIHRoZSBpbnN0YW50IGl0IHdhcyB3cml0dGVuIChkb2N0cmluZSBydWxlIDIgaW4gYC4vX3NoYXJlZC50c2ApLiBEYXlcbiAgICAgIC8vIGdyYW51bGFyaXR5IGlzIHRoZSBob25lc3QgbWF0Y2g6IHRoZSBzZWVkIHdyaXRlcyB0b2RheSdzIFVUQyBtaWRuaWdodCxcbiAgICAgIC8vIHRoZSBidWJibGUgd3JpdGVzIHRvZGF5J3MgaW5zdGFudCwgYW5kIGJvdGggcmVuZGVyIGFzIFwidG9kYXlcIi5cbiAgICAgIGxhc3RfY29udGFjdGVkX2RhdGU6IGNlbGB0b2RheSgpYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIGZpcnN0X25hbWU6ICdMaXNhJyxcbiAgICAgIGxhc3RfbmFtZTogJ1Rob21wc29uJyxcbiAgICAgIGNvbXBhbnk6ICdDbG91ZEZpcnN0IEluYycsXG4gICAgICBlbWFpbDogJ2xpc2EudEBjbG91ZGZpcnN0LmV4YW1wbGUuY29tJyxcbiAgICAgIHBob25lOiAnKzEtMjA2LTU1NS0wODAwJyxcbiAgICAgIHN0YXR1czogJ3F1YWxpZmllZCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ2V2ZW50JyxcbiAgICAgIGluZHVzdHJ5OiAndGVjaG5vbG9neScsXG4gICAgICAvLyBXSE9MRSBzdGFycyBvbmx5LiBgbGVhZC5ob29rLnRzYCByb3VuZHMgaXRzIGNvbXB1dGVkIHNjb3JlIHRvIGFuXG4gICAgICAvLyBpbnRlZ2VyIGJlY2F1c2UgXCJoYWxmIHZhbHVlcyByZW5kZXJlZCBpbmNvbnNpc3RlbnRseSBpbiB0aGUgc3RhclxuICAgICAgLy8gd2lkZ2V0XCIsIGFuZCB0aGUgaG9vayBsZWF2ZXMgYW4gZXhwbGljaXRseSBzZWVkZWQgbnVtYmVyIGFsb25lIFx1MjAxNCBzbyBhXG4gICAgICAvLyBzZWVkZWQgNC41IHdhcyB0aGUgb25lIHJhdGluZyBpbiB0aGUgc3lzdGVtIHRoZSBjb250cmFjdCBjb3VsZCBuZXZlclxuICAgICAgLy8gcHJvZHVjZSwgYW5kIGl0IHJlbmRlcmVkIGFzIHRoZSBicm9rZW4gaGFsZi1zdGFyIGl0IHdhcyBtZWFudCB0b1xuICAgICAgLy8gcHJldmVudCAoIzU5MSkuXG4gICAgICByYXRpbmc6IDUsXG4gICAgICBuZXh0X2ZvbGxvd3VwX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygwKWAsXG4gICAgICAvLyBTYW1lIGFzIERhdmlkIEtpbSBhYm92ZTogYSBgaGVsZGAgcXVhbGlmaWNhdGlvbiBjYWxsIG5hbWVzIHRoaXMgbGVhZC5cbiAgICAgIGxhc3RfY29udGFjdGVkX2RhdGU6IGNlbGB0b2RheSgpYCxcbiAgICB9LFxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBHZW5lcmF0ZWQgZGVtbyBsZWFkcyBcdTIwMTQgc3ByZWFkIGFjcm9zcyA2IG1vbnRocyBmb3IgbW9udGhseS1idWNrZXQgcmVwb3J0c1xuICAgIC8vIChgTGVhZEluZmxvd0J5TW9udGhTb3VyY2VSZXBvcnRgKS4gRWFjaCBgbGFzdF9jb250YWN0ZWRfZGF0ZWAgbGl2ZXMgaW4gYVxuICAgIC8vIGRpc3RpbmN0IG1vbnRoIC8gc291cmNlIHBhaXIgc28gdGhlIG1hdHJpeCBoYXMgbXVsdGlwbGUgY2VsbHMgcG9wdWxhdGVkLlxuICAgIC4uLltcbiAgICAgIHsgZm46ICdOb2FoJywgICAgbG46ICdQYXRlbCcsICAgIGNvOiAnVmVydGV4IEFuYWx5dGljcycsICAgICBzcmM6ICd3ZWInLCAgICAgICAgIGluZDogJ3RlY2hub2xvZ3knLCAgIGFnZTogNyAgIH0sXG4gICAgICB7IGZuOiAnTWF5YScsICAgIGxuOiAnU2luZ2gnLCAgICBjbzogJ0JsdWVQZWFrIExvZ2lzdGljcycsICAgc3JjOiAncmVmZXJyYWwnLCAgICBpbmQ6ICdsb2dpc3RpY3MnLCAgICBhZ2U6IDE0ICB9LFxuICAgICAgeyBmbjogJ093ZW4nLCAgICBsbjogJ0JlY2tlcicsICAgY286ICdOb3J0aHdpbmQgRW5lcmd5JywgICAgIHNyYzogJ2V2ZW50JywgICAgICAgaW5kOiAnZW5lcmd5JywgICAgICAgYWdlOiAyMSAgfSxcbiAgICAgIHsgZm46ICdTYXJhJywgICAgbG46ICdMb3BleicsICAgIGNvOiAnSGVsaW9zIFNvbGFyJywgICAgICAgICBzcmM6ICdwYXJ0bmVyJywgICAgIGluZDogJ2VuZXJneScsICAgICAgIGFnZTogMjggIH0sXG4gICAgICB7IGZuOiAnTGVvJywgICAgIGxuOiAnVmFuY2UnLCAgICBjbzogJ0NsZWFuQ2FydCcsICAgICAgICAgICAgc3JjOiAnd2ViJywgICAgICAgICBpbmQ6ICdyZXRhaWwnLCAgICAgICBhZ2U6IDM4ICB9LFxuICAgICAgeyBmbjogJ0lyaXMnLCAgICBsbjogJ09rYWZvcicsICAgY286ICdQdWxzZUhlYWx0aCcsICAgICAgICAgIHNyYzogJ2NvbGRfY2FsbCcsICAgaW5kOiAnaGVhbHRoY2FyZScsICAgYWdlOiA0NSAgfSxcbiAgICAgIHsgZm46ICdSYXZpJywgICAgbG46ICdNZWh0YScsICAgIGNvOiAnRm91bmRyeSBSb2JvdGljcycsICAgICBzcmM6ICdldmVudCcsICAgICAgIGluZDogJ21hbnVmYWN0dXJpbmcnLGFnZTogNTIgIH0sXG4gICAgICB7IGZuOiAnVGVzcycsICAgIGxuOiAnQnJvd24nLCAgICBjbzogJ0xhdHRpY2UgRWR1Y2F0aW9uJywgICAgc3JjOiAncmVmZXJyYWwnLCAgICBpbmQ6ICdlZHVjYXRpb24nLCAgICBhZ2U6IDY3ICB9LFxuICAgICAgeyBmbjogJ01hcmNvJywgICBsbjogJ1JpY2NpJywgICAgY286ICdBdXJvcmEgVHJhdmVsJywgICAgICAgIHNyYzogJ2FkdmVydGlzZW1lbnQnLCBpbmQ6ICdob3NwaXRhbGl0eScsICAgICAgIGFnZTogNzQgIH0sXG4gICAgICB7IGZuOiAnUGlhJywgICAgIGxuOiAnQW5hbmQnLCAgICBjbzogJ0NpdHJpbmUgRmluYW5jZScsICAgICAgc3JjOiAncGFydG5lcicsICAgICBpbmQ6ICdmaW5hbmNlJywgYWdlOiA4MSB9LFxuICAgICAgeyBmbjogJ0pvbmFzJywgICBsbjogJ0hvbHQnLCAgICAgY286ICdQb2xhciBDYXJnbycsICAgICAgICAgIHNyYzogJ3dlYicsICAgICAgICAgaW5kOiAnbG9naXN0aWNzJywgICAgYWdlOiA5NSAgfSxcbiAgICAgIHsgZm46ICdBbnlhJywgICAgbG46ICdWb2xrb3YnLCAgIGNvOiAnUmVkT2FrIFJlYWx0eScsICAgICAgICBzcmM6ICdjb2xkX2NhbGwnLCAgIGluZDogJ3JlYWxfZXN0YXRlJywgIGFnZTogMTAyIH0sXG4gICAgICB7IGZuOiAnVGhlbycsICAgIGxuOiAnUGFyaycsICAgICBjbzogJ1NreWxpbmUgTWVkaWEnLCAgICAgICAgc3JjOiAnYWR2ZXJ0aXNlbWVudCcsIGluZDogJ21lZGlhJywgICAgICAgIGFnZTogMTE2IH0sXG4gICAgICB7IGZuOiAnV3JlbicsICAgIGxuOiAnR2FyY2lhJywgICBjbzogJ01hcGxlIEJha2VyeSBHcm91cCcsICAgc3JjOiAnZXZlbnQnLCAgICAgICBpbmQ6ICdyZXRhaWwnLCBhZ2U6IDEyMyB9LFxuICAgICAgeyBmbjogJ0h1Z28nLCAgICBsbjogJ0R1Ym9pcycsICAgY286ICdOaW1idXMgQWVyb3NwYWNlJywgICAgIHNyYzogJ3JlZmVycmFsJywgICAgaW5kOiAnbWFudWZhY3R1cmluZycsYWdlOiAxMzggfSxcbiAgICAgIHsgZm46ICdMZW5hJywgICAgbG46ICdGaXNjaGVyJywgIGNvOiAnR3Jhbml0ZSBJbnN1cmFuY2UnLCAgICBzcmM6ICdwYXJ0bmVyJywgICAgIGluZDogJ2ZpbmFuY2UnLCBhZ2U6IDE0NSB9LFxuICAgICAgeyBmbjogJ0thaScsICAgICBsbjogJ1dhdGFuYWJlJywgY286ICdDb3JhbCBSZWVmIEhvdGVscycsICAgIHNyYzogJ3dlYicsICAgICAgICAgaW5kOiAnaG9zcGl0YWxpdHknLCAgICAgICBhZ2U6IDE2MiB9LFxuICAgICAgeyBmbjogJ01pcmEnLCAgICBsbjogJ0Nvc3RhJywgICAgY286ICdBdGxhcyBDb25zdHJ1Y3Rpb24nLCAgIHNyYzogJ2NvbGRfY2FsbCcsICAgaW5kOiAnb3RoZXInLCBhZ2U6IDE3NSB9LFxuICAgIF0ubWFwKChsLCBpKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSBgJHtsLmNvLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnJyl9LmV4YW1wbGUuY29tYDtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IChbJ25ldycsICdjb250YWN0ZWQnLCAncXVhbGlmaWVkJywgJ3VucXVhbGlmaWVkJ10gYXMgY29uc3QpW2kgJSA0XTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpcnN0X25hbWU6IGwuZm4sXG4gICAgICAgIGxhc3RfbmFtZTogbC5sbixcbiAgICAgICAgY29tcGFueTogbC5jbyxcbiAgICAgICAgZW1haWw6IGAke2wuZm4udG9Mb3dlckNhc2UoKX0uJHtsLmxuLnRvTG93ZXJDYXNlKCl9QCR7ZG9tYWlufWAsXG4gICAgICAgIHBob25lOiBgKzEtNTU1LTAxJHtTdHJpbmcoaSkucGFkU3RhcnQoMiwgJzAnKX0tJHtTdHJpbmcoMTAwMCArIGkgKiA3KX1gLFxuICAgICAgICBzdGF0dXMsXG4gICAgICAgIGxlYWRfc291cmNlOiBsLnNyYyxcbiAgICAgICAgaW5kdXN0cnk6IGwuaW5kLFxuICAgICAgICByYXRpbmc6IDEgKyAoKGkgKiA3KSAlIDUpLFxuICAgICAgICBsYXN0X2NvbnRhY3RlZF9kYXRlOiBjZWxEYXlzQWdvKGwuYWdlKSxcbiAgICAgICAgLy8gVGhlIHF1YWxpZmljYXRpb24gZmllbGRzIHdlcmUgbGVmdCBibGFuayBvbiBldmVyeSBnZW5lcmF0ZWQgbGVhZCwgc29cbiAgICAgICAgLy8gdGhlIGRldGFpbCBwYWdlJ3MgQ29udGFjdCAvIExlYWQgRGV0YWlsIC8gRGVzY3JpcHRpb24gc2VjdGlvbnMgaGFkXG4gICAgICAgIC8vIG5vdGhpbmcgdG8gcmVuZGVyICh0aGV5IGFsc28gZHJvcCB3aGF0ZXZlciB0aGUgaGlnaGxpZ2h0cyBzdHJpcFxuICAgICAgICAvLyBhbHJlYWR5IHNob3dzLCBzbyBhbGwgZm91ciBjb2xsYXBzZWQgdG8gbm90aGluZykgYW5kIHRoZSBkZW1vIHJlYWRcbiAgICAgICAgLy8gbGlrZSBhIGhhbGYtZmluaXNoZWQgaW1wb3J0LlxuICAgICAgICB0aXRsZTogKFsnVlAgT3BlcmF0aW9ucycsICdIZWFkIG9mIElUJywgJ0RpcmVjdG9yIG9mIFNhbGVzJywgJ0NPTycsICdQcm9jdXJlbWVudCBMZWFkJ10gYXMgY29uc3QpW2kgJSA1XSxcbiAgICAgICAgbW9iaWxlOiBgKzEtNTU1LTAyJHtTdHJpbmcoaSkucGFkU3RhcnQoMiwgJzAnKX0tJHtTdHJpbmcoMjAwMCArIGkgKiAzKX1gLFxuICAgICAgICB3ZWJzaXRlOiBgaHR0cHM6Ly8ke2RvbWFpbn1gLFxuICAgICAgICBhbm51YWxfcmV2ZW51ZTogMl8wMDBfMDAwICsgKChpICogM183MDBfMDAwKSAlIDkwXzAwMF8wMDApLFxuICAgICAgICBudW1iZXJfb2ZfZW1wbG95ZWVzOiAyNSArICgoaSAqIDEzNykgJSA0XzgwMCksXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgIGBJbmJvdW5kIHZpYSAke2wuc3JjLnJlcGxhY2UoL18vZywgJyAnKX0uIEV2YWx1YXRpbmcgYSBDUk0gdG8gcmVwbGFjZSBzcHJlYWRzaGVldHMgYCArXG4gICAgICAgICAgYGFjcm9zcyB0aGVpciAke2wuaW5kLnJlcGxhY2UoL18vZywgJyAnKX0gb3BlcmF0aW9uLmAsXG4gICAgICAgIC4uLihzdGF0dXMgPT09ICd1bnF1YWxpZmllZCdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZGlzcXVhbGlmaWNhdGlvbl9yZWFzb246IERJU1FVQUxJRklDQVRJT05fUkVBU09OU1soaSA+PiAyKSAlIERJU1FVQUxJRklDQVRJT05fUkVBU09OUy5sZW5ndGhdLnJlYXNvbixcbiAgICAgICAgICAgICAgbm90ZXM6IERJU1FVQUxJRklDQVRJT05fUkVBU09OU1soaSA+PiAyKSAlIERJU1FVQUxJRklDQVRJT05fUkVBU09OUy5sZW5ndGhdLm5vdGUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9O1xuICAgIH0pLFxuICBdXG59KTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIExpbmUgaXRlbXM6IHRoZSBvbmUgc291cmNlIG9mIHRydXRoIGZvciBkZWFsIHZhbHVlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLyoqXG4gKiBPcHBvcnR1bml0eSBsaW5lIGl0ZW1zLCBrZXllZCBieSB0aGUgb3Bwb3J0dW5pdHkncyBuYW1lIChpdHMgc2VlZFxuICogZXh0ZXJuYWxJZCkuIEV2ZXJ5IHNlZWRlZCBkZWFsIGlzIGl0ZW1pc2VkIFx1MjAxNCBiZWZvcmUgIzU5MSBub3Qgb25lIHdhcywgc28gdGhlXG4gKiBQcm9kdWN0cyByZWxhdGVkIGxpc3Qgd2FzIGVtcHR5IG9uIGV2ZXJ5IG9wcG9ydHVuaXR5IGluIHRoZSBkZW1vIGFuZCB0aGUgQ1BRXG4gKiBzdG9yeSBoYWQgbm90aGluZyB0byBzaG93LlxuICpcbiAqIFRoZXNlIHN1bXMgYXJlIEFVVEhPUklUQVRJVkU6IGVhY2ggb3Bwb3J0dW5pdHkncyBgYW1vdW50YCBiZWxvdyBpcyBjb21wdXRlZFxuICogZnJvbSBpdHMgbGluZXMgYnkgYGRlYWxWYWx1ZSgpYCByYXRoZXIgdGhhbiB0eXBlZCBpbiwgd2hpY2ggaXMgdGhlIHNhbWVcbiAqIGFuc3dlciBgb3Bwb3J0dW5pdHlfYW1vdW50X3JvbGx1cGAgY29tcHV0ZXMgd2hlbiBhIHJlcCB0b3VjaGVzIGEgbGluZS4gVGhlcmVcbiAqIGlzIHRoZXJlZm9yZSBubyBzZWVkZWQgcGFyZW50IHRvdGFsIHRoYXQgYSBmaXJzdCBsaW5lLWl0ZW0gZWRpdCBjYW4gc2lsZW50bHlcbiAqIHJld3JpdGUgXHUyMDE0IHRoZSBhY2NlcHRhbmNlIGNvbmRpdGlvbiBvZiAjNTkxIGhvbGRzIGJ5IGNvbnN0cnVjdGlvbiByYXRoZXIgdGhhblxuICogYnkgYW55b25lIHJlLWNoZWNraW5nIHRoZSBhcml0aG1ldGljLlxuICpcbiAqIERlcml2aW5nIHJhdGhlciB0aGFuIGRlbGVnYXRpbmcgaXMgZGVsaWJlcmF0ZS4gTGV0dGluZyB0aGUgcm9sbHVwIG93biB0aGVcbiAqIG51bWJlciB3b3VsZCBtYWtlIGV2ZXJ5IHNlZWRlZCBgYW1vdW50YCBkZXBlbmQgb24gd2hldGhlciBob29rcyBmaXJlIG92ZXJcbiAqIHNlZWQgd3JpdGVzIFx1MjAxNCB3aGljaCB0aGUgZG9jdHJpbmUgYmxvY2sgYWJvdmUgc2F5cyB0aGV5IGRvIG5vdCBhbmQgYSBib290IGxvZ1xuICogc2F5cyB0aGV5IGRvICgjNjE3KSBcdTIwMTQgYW5kIG9uIHRoYXQgaG9vayBzdXJ2aXZpbmcgaXRzIG93biB3cml0ZSBjYWxsICgjNjE2KS5cbiAqIEEgZGVyaXZlZCBsaXRlcmFsIGlzIGNvcnJlY3QgdW5kZXIgZXZlcnkgb25lIG9mIHRob3NlIGNvbWJpbmF0aW9uczogaWYgdGhlXG4gKiByb2xsdXAgcnVucyBpdCByZWNvbXB1dGVzIHRoZSBzYW1lIGZpZ3VyZSwgYW5kIGlmIGl0IG5ldmVyIHJ1bnMgdGhlIGZpZ3VyZVxuICogd2FzIGFscmVhZHkgcmlnaHQuXG4gKi9cbmV4cG9ydCBjb25zdCBPUFBPUlRVTklUWV9MSU5FUzogUmVjb3JkPHN0cmluZywgcmVhZG9ubHkgTGluZVNwZWNbXT4gPSB7XG4gICdBY21lIFBsYXRmb3JtIFVwZ3JhZGUnOiBbXG4gICAgeyBwcm9kdWN0OiAnT2JqZWN0U3RhY2sgUGxhdGZvcm0nLCBxdWFudGl0eTogMiwgdW5pdF9wcmljZTogNTAwMDAsIGRpc2NvdW50OiAxMCwgZGVzY3JpcHRpb246ICdFbnRlcnByaXNlIGVkaXRpb24gXHUyMDE0IE5BICsgRU1FQSBwcm9kdWN0aW9uIHRlbmFudHMgKG11bHRpLXllYXIgZGlzY291bnQpLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdQcmVtaXVtIFN1cHBvcnQnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogMjUwMDAsIGRlc2NyaXB0aW9uOiAnMjRcdTAwRDc3IHByZW1pdW0gc3VwcG9ydCB3aXRoIGEgbmFtZWQgVEFNLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJywgcXVhbnRpdHk6IDM1LCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgT3BzIG9yZ2FuaXphdGlvbi4nIH0sXG4gIF0sXG4gICdHbG9iZXggTWFudWZhY3R1cmluZyBTdWl0ZSc6IFtcbiAgICB7IHByb2R1Y3Q6ICdPYmplY3RTdGFjayBQbGF0Zm9ybScsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiA1MDAwMCwgZGVzY3JpcHRpb246ICdFbnRlcnByaXNlIGVkaXRpb24gXHUyMDE0IG9uZSBzaGFyZWQgdGVuYW50IHNlcnZpbmcgYWxsIHNpeCBtYW51ZmFjdHVyaW5nIHNpdGVzLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBZG1pbiBUcmFpbmluZyBXb3Jrc2hvcCcsIHF1YW50aXR5OiA0LCB1bml0X3ByaWNlOiA2MDAwLCBkZXNjcmlwdGlvbjogJ0ZvdXIgd29ya3Nob3AgZGF5cywgb25lIHBlciByZWdpb25hbCBwbGFudCBjbHVzdGVyLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdTdGFuZGFyZCBTdXBwb3J0JywgcXVhbnRpdHk6IDEsIHVuaXRfcHJpY2U6IDkwMDAsIGRlc2NyaXB0aW9uOiAnQnVzaW5lc3MtaG91cnMgc3VwcG9ydCBmb3IgdGhlIGZpcnN0IHllYXIuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogMTIsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnQWdlbnQgc2VhdHMgZm9yIHRoZSBwbGFudCBvcGVyYXRpb25zIGxlYWRzLicgfSxcbiAgXSxcbiAgJ1dheW5lIEVudGVycHJpc2UgTGljZW5zZSc6IFtcbiAgICB7IHByb2R1Y3Q6ICdPYmplY3RTdGFjayBQbGF0Zm9ybScsIHF1YW50aXR5OiAyMCwgdW5pdF9wcmljZTogNTAwMDAsIGRpc2NvdW50OiAxNSwgZGVzY3JpcHRpb246ICdFbnRlcnByaXNlLXdpZGUgbGljZW5zZSwgdm9sdW1lIGRpc2NvdW50IGF0IDIwIHRlbmFudHMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ1ByZW1pdW0gU3VwcG9ydCcsIHF1YW50aXR5OiA0LCB1bml0X3ByaWNlOiAyNTAwMCwgZGVzY3JpcHRpb246ICdQcmVtaXVtIHN1cHBvcnQgYWNyb3NzIGZvdXIgYnVzaW5lc3MgdW5pdHMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogMjUwLCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgZ2xvYmFsIHJldmVudWUgb3JnYW5pemF0aW9uLicgfSxcbiAgXSxcbiAgJ0luaXRlY2ggQ2xvdWQgTWlncmF0aW9uJzogW1xuICAgIHsgcHJvZHVjdDogJ0RhdGEgTWlncmF0aW9uIFNlcnZpY2VzJywgcXVhbnRpdHk6IDEsIHVuaXRfcHJpY2U6IDM1MDAwLCBkZXNjcmlwdGlvbjogJ01pZ3JhdGlvbiBvZmYgdGhlIGxlZ2FjeSBvbi1wcmVtaXNlIENSTS4nIH0sXG4gICAgeyBwcm9kdWN0OiAnQ2xvdWQgSG9zdGluZyAoQW5udWFsKScsIHF1YW50aXR5OiAyLCB1bml0X3ByaWNlOiAxMjAwMCwgZGVzY3JpcHRpb246ICdNYW5hZ2VkIGhvc3RpbmcsIHByaW1hcnkgKyBEUiByZWdpb24uJyB9LFxuICAgIHsgcHJvZHVjdDogJ1N0YW5kYXJkIFN1cHBvcnQnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogOTAwMCwgZGVzY3JpcHRpb246ICdCdXNpbmVzcy1ob3VycyBzdXBwb3J0IGZvciB0aGUgZmlyc3QgeWVhci4nIH0sXG4gICAgeyBwcm9kdWN0OiAnQUkgQWdlbnQgU2VhdCAoQW5udWFsKScsIHF1YW50aXR5OiAxMiwgdW5pdF9wcmljZTogMTAwMCwgZGVzY3JpcHRpb246ICdBZ2VudCBzZWF0cyBmb3IgdGhlIHNlcnZpY2UgZGVzay4nIH0sXG4gIF0sXG4gICdBY21lIEFubnVhbCBSZW5ld2FsIDIwMjUnOiBbXG4gICAgeyBwcm9kdWN0OiAnT2JqZWN0U3RhY2sgUGxhdGZvcm0nLCBxdWFudGl0eTogMywgdW5pdF9wcmljZTogNTAwMDAsIGRlc2NyaXB0aW9uOiAnUmVuZXdhbCBvZiB0aGUgdGhyZWUgcHJvZHVjdGlvbiB0ZW5hbnRzLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdQcmVtaXVtIFN1cHBvcnQnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogMjUwMDAsIGRlc2NyaXB0aW9uOiAnUHJlbWl1bSBzdXBwb3J0IHJlbmV3YWwuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogNDUsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnU2VhdCBleHBhbnNpb24gZHJpdmVuIGJ5IHRoZSBuZXcgRU1FQSB0ZWFtLicgfSxcbiAgXSxcbiAgJ1N0YXJrIE1lZGljYWwgUGlsb3QnOiBbXG4gICAgeyBwcm9kdWN0OiAnT2JqZWN0U3RhY2sgUGxhdGZvcm0nLCBxdWFudGl0eTogMiwgdW5pdF9wcmljZTogNTAwMDAsIGRlc2NyaXB0aW9uOiAnUGlsb3QgdGVuYW50cyBmb3IgdHdvIGNsaW5pY2FsIHNlcnZpY2UgbGluZXMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ1N0YW5kYXJkIFN1cHBvcnQnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogOTAwMCwgZGVzY3JpcHRpb246ICdTdGFuZGFyZCBzdXBwb3J0IGR1cmluZyB0aGUgcGlsb3QuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FkbWluIFRyYWluaW5nIFdvcmtzaG9wJywgcXVhbnRpdHk6IDYsIHVuaXRfcHJpY2U6IDYwMDAsIGRlc2NyaXB0aW9uOiAnU2l4IHdvcmtzaG9wIGRheXMgZm9yIHRoZSBjbGluaWNhbCBvcGVyYXRpb25zIGFkbWlucy4nIH0sXG4gIF0sXG4gICdXYXluZSBRMSBFeHBhbnNpb24nOiBbXG4gICAgeyBwcm9kdWN0OiAnT2JqZWN0U3RhY2sgUGxhdGZvcm0nLCBxdWFudGl0eTogNiwgdW5pdF9wcmljZTogNTAwMDAsIGRlc2NyaXB0aW9uOiAnRXhwYW5zaW9uIGludG8gc2l4IGFkZGl0aW9uYWwgc3Vic2lkaWFyaWVzLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdQcmVtaXVtIFN1cHBvcnQnLCBxdWFudGl0eTogMiwgdW5pdF9wcmljZTogMjUwMDAsIGRlc2NyaXB0aW9uOiAnUHJlbWl1bSBzdXBwb3J0IGZvciB0aGUgZXhwYW5kZWQgZm9vdHByaW50LicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJywgcXVhbnRpdHk6IDMwLCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgZXhwYW5zaW9uIHRlYW1zLicgfSxcbiAgXSxcbiAgJ0dsb2JleCBUcmFpbmluZyBQYWNrYWdlJzogW1xuICAgIHsgcHJvZHVjdDogJ0FkbWluIFRyYWluaW5nIFdvcmtzaG9wJywgcXVhbnRpdHk6IDEwLCB1bml0X3ByaWNlOiA2MDAwLCBkZXNjcmlwdGlvbjogJ1RlbiB3b3Jrc2hvcCBkYXlzIGFjcm9zcyB0aGUgcGxhbnQgYWRtaW4gY29tbXVuaXR5LicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJywgcXVhbnRpdHk6IDUsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnQWdlbnQgc2VhdHMgZm9yIHRoZSB0cmFpbmluZyBzYW5kYm94LicgfSxcbiAgXSxcbiAgJ0luaXRlY2ggUGhhc2UgMSc6IFtcbiAgICB7IHByb2R1Y3Q6ICdJbXBsZW1lbnRhdGlvbiBTZXJ2aWNlcycsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiA3NTAwMCwgZGVzY3JpcHRpb246ICdQaGFzZSAxIGltcGxlbWVudGF0aW9uOiBhY2NvdW50cywgY29udGFjdHMsIHBpcGVsaW5lLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdTdGFuZGFyZCBTdXBwb3J0JywgcXVhbnRpdHk6IDEsIHVuaXRfcHJpY2U6IDkwMDAsIGRlc2NyaXB0aW9uOiAnU3RhbmRhcmQgc3VwcG9ydCBmb3IgcGhhc2UgMS4nIH0sXG4gICAgeyBwcm9kdWN0OiAnQUkgQWdlbnQgU2VhdCAoQW5udWFsKScsIHF1YW50aXR5OiA2LCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgcGhhc2UtMSBwaWxvdCBncm91cC4nIH0sXG4gIF0sXG4gICdBY21lIEFkZC1vbiAoTG9zdCknOiBbXG4gICAgeyBwcm9kdWN0OiAnQW5hbHl0aWNzIEFkZC1vbicsIHF1YW50aXR5OiAyLCB1bml0X3ByaWNlOiAyMjAwMCwgZGVzY3JpcHRpb246ICdNYXJrZXRpbmcgYW5hbHl0aWNzIGZvciB0d28gYnVzaW5lc3MgdW5pdHMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0ludGVncmF0aW9uIENvbm5lY3RvciBQYWNrJywgcXVhbnRpdHk6IDEsIHVuaXRfcHJpY2U6IDE2MDAwLCBkZXNjcmlwdGlvbjogJ01hcmtldGluZy1hdXRvbWF0aW9uIGNvbm5lY3RvciBwYWNrLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdTYW5kYm94IEVudmlyb25tZW50IChBbm51YWwpJywgcXVhbnRpdHk6IDIsIHVuaXRfcHJpY2U6IDc1MDAsIGRlc2NyaXB0aW9uOiAnVHdvIHNhbmRib3hlcyBmb3IgdGhlIG1hcmtldGluZyBidWlsZC1vdXQuJyB9LFxuICBdLFxuICAnU3RhcmsgRXhwYW5zaW9uIChMb3N0KSc6IFtcbiAgICB7IHByb2R1Y3Q6ICdPYmplY3RTdGFjayBQbGF0Zm9ybScsIHF1YW50aXR5OiAyLCB1bml0X3ByaWNlOiA1MDAwMCwgZGVzY3JpcHRpb246ICdUd28gYWRkaXRpb25hbCBjbGluaWNhbCB0ZW5hbnRzLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdGaWVsZCBTZXJ2aWNlIE1vYmlsZScsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiAxNDAwMCwgZGVzY3JpcHRpb246ICdGaWVsZCBzZXJ2aWNlIG1vYmlsZSBmb3IgdGhlIGRldmljZS1zZXJ2aWNpbmcgdGVhbS4nIH0sXG4gICAgeyBwcm9kdWN0OiAnQUkgQWdlbnQgU2VhdCAoQW5udWFsKScsIHF1YW50aXR5OiA2LCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgc2VydmljZSBjb29yZGluYXRvcnMuJyB9LFxuICBdLFxuICAnR2xvYmV4IExpbmUgRXhwYW5zaW9uIChMb3N0KSc6IFtcbiAgICB7IHByb2R1Y3Q6ICdPYmplY3RTdGFjayBQbGF0Zm9ybScsIHF1YW50aXR5OiAyLCB1bml0X3ByaWNlOiA1MDAwMCwgZGVzY3JpcHRpb246ICdUd28gZnVydGhlciBwcm9kdWN0aW9uLWxpbmUgdGVuYW50cy4nIH0sXG4gICAgeyBwcm9kdWN0OiAnSW50ZWdyYXRpb24gQ29ubmVjdG9yIFBhY2snLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogMTYwMDAsIGRlc2NyaXB0aW9uOiAnQ29ubmVjdG9yIHBhY2sgZm9yIHRoZSBsaW5lLWNvbnRyb2wgc3lzdGVtcy4nIH0sXG4gICAgeyBwcm9kdWN0OiAnQUkgQWdlbnQgU2VhdCAoQW5udWFsKScsIHF1YW50aXR5OiA4LCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgbGluZSBzdXBlcnZpc29ycy4nIH0sXG4gIF0sXG4gICdOb3J0aHdpbmQgRmllbGQgU2VydmljZSBQaWxvdCAoTG9zdCknOiBbXG4gICAgeyBwcm9kdWN0OiAnRmllbGQgU2VydmljZSBNb2JpbGUnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogMTQwMDAsIGRlc2NyaXB0aW9uOiAnRmllbGQtc2VydmljZSBtb2JpbGUgZm9yIHRoZSBtZXRlcmluZyBjcmV3cy4nIH0sXG4gICAgeyBwcm9kdWN0OiAnU3RhbmRhcmQgU3VwcG9ydCcsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiA5MDAwLCBkZXNjcmlwdGlvbjogJ0J1c2luZXNzLWhvdXJzIHN1cHBvcnQgZHVyaW5nIHRoZSBwaWxvdC4nIH0sXG4gICAgeyBwcm9kdWN0OiAnQUkgQWdlbnQgU2VhdCAoQW5udWFsKScsIHF1YW50aXR5OiAxMCwgdW5pdF9wcmljZTogMTAwMCwgZGVzY3JpcHRpb246ICdBZ2VudCBzZWF0cyBmb3IgdGhlIGRpc3BhdGNoIGRlc2suJyB9LFxuICBdLFxuICAnQXBleCBDb21wbGlhbmNlIFJlcG9ydGluZyAoTG9zdCknOiBbXG4gICAgeyBwcm9kdWN0OiAnQW5hbHl0aWNzIEFkZC1vbicsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiAyMjAwMCwgZGVzY3JpcHRpb246ICdSZWd1bGF0b3J5IHJlcG9ydGluZyBwYWNrIGZvciBmbGVldCBjb21wbGlhbmNlLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdTYW5kYm94IEVudmlyb25tZW50IChBbm51YWwpJywgcXVhbnRpdHk6IDEsIHVuaXRfcHJpY2U6IDc1MDAsIGRlc2NyaXB0aW9uOiAnU2FuZGJveCBmb3IgdGhlIGNvbXBsaWFuY2UgcnVsZSBidWlsZC1vdXQuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogNiwgdW5pdF9wcmljZTogMTAwMCwgZGVzY3JpcHRpb246ICdBZ2VudCBzZWF0cyBmb3IgdGhlIGNvbXBsaWFuY2UgYW5hbHlzdHMuJyB9LFxuICBdLFxuICAnTm9ydGh3aW5kIEdyaWQgTW9kZXJuaXphdGlvbic6IFtcbiAgICB7IHByb2R1Y3Q6ICdPYmplY3RTdGFjayBQbGF0Zm9ybScsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiA1MDAwMCwgZGVzY3JpcHRpb246ICdFbnRlcnByaXNlIGVkaXRpb24gZm9yIGdyaWQsIGZpZWxkIGFuZCBjdXN0b21lciBvcGVyYXRpb25zLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdGaWVsZCBTZXJ2aWNlIE1vYmlsZScsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiAxNDAwMCwgZGVzY3JpcHRpb246ICdGaWVsZC1zZXJ2aWNlIG1vYmlsZSBmb3IgdGhlIGdyaWQgbWFpbnRlbmFuY2UgY3Jld3MuJyB9LFxuICAgIHsgcHJvZHVjdDogJ1NhbmRib3ggRW52aXJvbm1lbnQgKEFubnVhbCknLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogNzUwMCwgZGVzY3JpcHRpb246ICdTYW5kYm94IGZvciB0aGUgb3BlcmF0aW9uYWwtZGF0YSBhc3Nlc3NtZW50LicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJywgcXVhbnRpdHk6IDE1LCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgY29udHJvbC1yb29tIHBpbG90LicgfSxcbiAgXSxcbiAgJ0xhdHRpY2UgU3R1ZGVudCBTdWNjZXNzIFBsYXRmb3JtJzogW1xuICAgIHsgcHJvZHVjdDogJ09iamVjdFN0YWNrIFBsYXRmb3JtIChTTUIgRWRpdGlvbiknLCBxdWFudGl0eTogMiwgdW5pdF9wcmljZTogMTgwMDAsIGRlc2NyaXB0aW9uOiAnU3R1ZGVudC1zdWNjZXNzIHRlbmFudHMgZm9yIHRoZSB0d28gcGlsb3QgY29sbGVnZXMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FkbWluIFRyYWluaW5nIFdvcmtzaG9wJywgcXVhbnRpdHk6IDIsIHVuaXRfcHJpY2U6IDYwMDAsIGRlc2NyaXB0aW9uOiAnVHdvIHdvcmtzaG9wIGRheXMgZm9yIHRoZSBzdHVkZW50LXN1Y2Nlc3MgYWR2aXNlcnMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogNSwgdW5pdF9wcmljZTogMTAwMCwgZGVzY3JpcHRpb246ICdBZ2VudCBzZWF0cyBmb3IgdGhlIGFkdmlzaW5nIHRlYW0uJyB9LFxuICBdLFxuICAnVmVydGV4IEFuYWx5dGljcyBFeHBhbnNpb24nOiBbXG4gICAgeyBwcm9kdWN0OiAnQW5hbHl0aWNzIEFkZC1vbicsIHF1YW50aXR5OiAyLCB1bml0X3ByaWNlOiAyMjAwMCwgZGVzY3JpcHRpb246ICdBbmFseXRpY3MgZm9yIHRoZSBzYWxlcyBhbmQgbWFya2V0aW5nIHRlYW1zLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdQcmVtaXVtIFN1cHBvcnQnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogMjUwMDAsIGRlc2NyaXB0aW9uOiAnUHJlbWl1bSBzdXBwb3J0IGZvciB0aGUgZXhwYW5kZWQgZm9vdHByaW50LicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJywgcXVhbnRpdHk6IDEwLCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgcmV2ZW51ZSBvcGVyYXRpb25zIHRlYW0uJyB9LFxuICBdLFxuICAnQXBleCBMb2dpc3RpY3MgRGF0YSBIdWInOiBbXG4gICAgeyBwcm9kdWN0OiAnT2JqZWN0U3RhY2sgUGxhdGZvcm0nLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogNTAwMDAsIGRlc2NyaXB0aW9uOiAnRGF0YS1odWIgdGVuYW50IHNoYXJlZCBieSBjb21tZXJjaWFsLCBvcGVyYXRpb25zIGFuZCBmaW5hbmNlLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdEYXRhIE1pZ3JhdGlvbiBTZXJ2aWNlcycsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiAzNTAwMCwgZGVzY3JpcHRpb246ICdDb25zb2xpZGF0aW9uIG9mIGZvdXIgZnJhZ21lbnRlZCBjb21tZXJjaWFsIHN5c3RlbXMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogOCwgdW5pdF9wcmljZTogMTAwMCwgZGVzY3JpcHRpb246ICdBZ2VudCBzZWF0cyBmb3IgdGhlIGNvbW1lcmNpYWwgb3BlcmF0aW9ucyB0ZWFtLicgfSxcbiAgXSxcbiAgJ0xhdHRpY2UgRWR1Y2F0aW9uIFJlbmV3YWwnOiBbXG4gICAgeyBwcm9kdWN0OiAnT2JqZWN0U3RhY2sgUGxhdGZvcm0nLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogNTAwMDAsIGRlc2NyaXB0aW9uOiAnUmVuZXdhbCBvZiB0aGUgaW5zdGl0dXRpb24td2lkZSB0ZW5hbnQuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FuYWx5dGljcyBBZGQtb24nLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogMjIwMDAsIGRlc2NyaXB0aW9uOiAnRXhwYW5kZWQgYW5hbHl0aWNzIHBhY2thZ2UgZm9yIHRoZSByZW5ld2FsIHRlcm0uJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogMTUsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnU3R1ZGVudC1zdWNjZXNzIGF1dG9tYXRpb24gc2VhdHMuJyB9LFxuICBdLFxuICAnVmVydGV4IEVudGVycHJpc2UgUm9sbG91dCc6IFtcbiAgICB7IHByb2R1Y3Q6ICdPYmplY3RTdGFjayBQbGF0Zm9ybScsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiA1MDAwMCwgZGlzY291bnQ6IDIwLCBkZXNjcmlwdGlvbjogJ1BoYXNlLW9uZSB0ZW5hbnQgZm9yIHRoZSBmaXJzdCByZWdpb24sIHdpdGggZGF0YS1yZXNpZGVuY3kgY29udHJvbHMgKG11bHRpLXBoYXNlIGNvbW1pdG1lbnQgZGlzY291bnQpLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdEYXRhIE1pZ3JhdGlvbiBTZXJ2aWNlcycsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiAzNTAwMCwgZGVzY3JpcHRpb246ICdQaGFzZS1vbmUgbWlncmF0aW9uIG9mIHRoZSByZWdpb25hbCByZXZlbnVlIGRhdGEuJyB9LFxuICAgIHsgcHJvZHVjdDogJ1N0YW5kYXJkIFN1cHBvcnQnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogOTAwMCwgZGVzY3JpcHRpb246ICdCdXNpbmVzcy1ob3VycyBzdXBwb3J0IGZvciBwaGFzZSBvbmUuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogMTAsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnQWdlbnQgc2VhdHMgZm9yIHRoZSBmaXJzdCByb2xsb3V0IHdhdmUuJyB9LFxuICBdLFxuICAvLyBDYW1wYWlnbi1hdHRyaWJ1dGVkIHdpbnMgXHUyMDE0IHNlZSB0aGUgY2FtcGFpZ24gbWV0cmljcyBub3RlIGJlbG93LlxuICAnTGF0dGljZSBBbmFseXRpY3MgRXhwYW5zaW9uJzogW1xuICAgIHsgcHJvZHVjdDogJ0FuYWx5dGljcyBBZGQtb24nLCBxdWFudGl0eTogMiwgdW5pdF9wcmljZTogMjIwMDAsIGRlc2NyaXB0aW9uOiAnQW5hbHl0aWNzIGZvciBhZG1pc3Npb25zIGFuZCBhbHVtbmkgZW5nYWdlbWVudC4nIH0sXG4gICAgeyBwcm9kdWN0OiAnQWRtaW4gVHJhaW5pbmcgV29ya3Nob3AnLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogNjAwMCwgZGVzY3JpcHRpb246ICdBbmFseXRpY3MgZW5hYmxlbWVudCBkYXkgZm9yIHRoZSBpbnN0aXR1dGlvbmFsLXJlc2VhcmNoIHRlYW0uJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogMjAsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnQWdlbnQgc2VhdHMgZm9yIHRoZSBhZG1pc3Npb25zIHRlYW0uJyB9LFxuICBdLFxuICAnV2F5bmUgT3BlcmF0aW9ucyBNb2R1bGUgUm9sbG91dCc6IFtcbiAgICB7IHByb2R1Y3Q6ICdPYmplY3RTdGFjayBQbGF0Zm9ybScsIHF1YW50aXR5OiAyLCB1bml0X3ByaWNlOiA1MDAwMCwgZGVzY3JpcHRpb246ICdPcGVyYXRpb25zIHRlbmFudHMgZm9yIHR3byBtYW51ZmFjdHVyaW5nIGRpdmlzaW9ucy4nIH0sXG4gICAgeyBwcm9kdWN0OiAnU3RhbmRhcmQgU3VwcG9ydCcsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiA5MDAwLCBkZXNjcmlwdGlvbjogJ1N0YW5kYXJkIHN1cHBvcnQgZm9yIHRoZSBvcGVyYXRpb25zIHJvbGxvdXQuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FJIEFnZW50IFNlYXQgKEFubnVhbCknLCBxdWFudGl0eTogMTEsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnQWdlbnQgc2VhdHMgZm9yIHRoZSBvcGVyYXRpb25zIHBsYW5uZXJzLicgfSxcbiAgXSxcbiAgJ1ZlcnRleCBEZXZlbG9wZXIgUGxhdGZvcm0gQWRvcHRpb24nOiBbXG4gICAgeyBwcm9kdWN0OiAnT2JqZWN0U3RhY2sgUGxhdGZvcm0nLCBxdWFudGl0eTogMywgdW5pdF9wcmljZTogNTAwMDAsIGRlc2NyaXB0aW9uOiAnRGV2ZWxvcGVyIHBsYXRmb3JtIHRlbmFudHMgZm9yIHRocmVlIHByb2R1Y3QgdGVhbXMuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0ludGVncmF0aW9uIENvbm5lY3RvciBQYWNrJywgcXVhbnRpdHk6IDEsIHVuaXRfcHJpY2U6IDE2MDAwLCBkZXNjcmlwdGlvbjogJ0Nvbm5lY3RvciBwYWNrIGZvciB0aGUgaW50ZXJuYWwgZGF0YSB3YXJlaG91c2UuJyB9LFxuICAgIHsgcHJvZHVjdDogJ0FuYWx5dGljcyBBZGQtb24nLCBxdWFudGl0eTogMSwgdW5pdF9wcmljZTogMjIwMDAsIGRlc2NyaXB0aW9uOiAnUHJvZHVjdC11c2FnZSBhbmFseXRpY3MgZm9yIHRoZSBwbGF0Zm9ybSB0ZWFtLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJywgcXVhbnRpdHk6IDEyLCB1bml0X3ByaWNlOiAxMDAwLCBkZXNjcmlwdGlvbjogJ0FnZW50IHNlYXRzIGZvciB0aGUgZGV2ZWxvcGVyLWV4cGVyaWVuY2UgdGVhbS4nIH0sXG4gIF0sXG59O1xuXG4vKipcbiAqIGBhbW91bnRgICsgYGV4cGVjdGVkX3JldmVudWVgIGZvciBhIHNlZWRlZCBkZWFsLCBib3RoIGRlcml2ZWQgZnJvbSBpdHMgbGluZVxuICogaXRlbXMuIGBleHBlY3RlZF9yZXZlbnVlYCB1c2VzIG9wcG9ydHVuaXR5Lmhvb2sudHMncyBvd24gZXhwcmVzc2lvblxuICogKGBNYXRoLnJvdW5kKGFtb3VudCAqIHByb2JhYmlsaXR5KSAvIDEwMGApIHNvIHRoZSB0d28gYWdyZWUgdG8gdGhlIGNlbnQuXG4gKi9cbmNvbnN0IGRlYWxWYWx1ZSA9IChvcHBvcnR1bml0eU5hbWU6IHN0cmluZywgcHJvYmFiaWxpdHk6IG51bWJlcikgPT4ge1xuICBjb25zdCBsaW5lcyA9IE9QUE9SVFVOSVRZX0xJTkVTW29wcG9ydHVuaXR5TmFtZV07XG4gIGlmICghbGluZXMpIHRocm93IG5ldyBFcnJvcihgU2VlZCBlcnJvcjogbm8gbGluZSBpdGVtcyBhdXRob3JlZCBmb3Igb3Bwb3J0dW5pdHkgXCIke29wcG9ydHVuaXR5TmFtZX1cImApO1xuICBjb25zdCBhbW91bnQgPSBsaW5lc1RvdGFsKGxpbmVzKTtcbiAgcmV0dXJuIHsgYW1vdW50LCBleHBlY3RlZF9yZXZlbnVlOiBNYXRoLnJvdW5kKGFtb3VudCAqIHByb2JhYmlsaXR5KSAvIDEwMCB9O1xufTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIE9wcG9ydHVuaXRpZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vLyBgcHJvYmFiaWxpdHlgLCBgZm9yZWNhc3RfY2F0ZWdvcnlgIGFuZCBgZXhwZWN0ZWRfcmV2ZW51ZWAgYXJlIGRlcml2ZWQgZnJvbVxuLy8gYHN0YWdlYCBieSBvcHBvcnR1bml0eS5ob29rLnRzIChTVEFHRV9QUk9CQUJJTElUWSAvIFNUQUdFX0ZPUkVDQVNUKS4gSG9va3Ncbi8vIGRvbid0IHJ1biBvdmVyIHNlZWRzLCBzbyBldmVyeSByb3cgYmVsb3cgY2FycmllcyB0aGUgZXhhY3QgdmFsdWVzIHRoZSBob29rXG4vLyB3b3VsZCBjb21wdXRlIFx1MjAxNCBhbnl0aGluZyBlbHNlIGdldHMgc2lsZW50bHkgcmV3cml0dGVuIG9uIHRoZSBmaXJzdCB1c2VyXG4vLyBlZGl0ICgjNDkwKS5cbi8vXG4vLyBgc3RhZ2VfZW50cnlfZGF0ZWAgZm9sbG93cyB0aGUgc2FtZSBydWxlOiB0aGUgaG9vayBzdGFtcHMgaXQgb24gZXZlcnkgaW5zZXJ0XG4vLyBhbmQgc3RhZ2UgY2hhbmdlLCBzbyBhIHNlZWRlZCBkZWFsIHdpdGhvdXQgb25lIGlzIGEgc2hhcGUgcmVhbCBkYXRhIG5ldmVyXG4vLyBoYXMgXHUyMDE0IGFuZCBpdCBpcyB3aGF0IHRoZSBzdGFnbmF0aW9uIHN3ZWVwIGZpbHRlcnMgb24gYW5kIHdoYXQgdGhlXG4vLyBgZGF5c19pbl9zdGFnZWAgRk9STVVMQSBjb3VudHMgZnJvbSwgc28gaXQgcmVwbGFjZXMgdGhlIG9sZCBoYXJkY29kZWRcbi8vIGBkYXlzX2luX3N0YWdlYCBudW1iZXJzICgjNDg5KS4gT3BlbiBkZWFscyBjYXJyeSBhbiBhZ2UgdGhhdCBzcGFucyB0aGVcbi8vIDE0LWRheSBzdGFsZSB0aHJlc2hvbGQgaW4gYm90aCBkaXJlY3Rpb25zOyBzZXR0bGVkIGRlYWxzIGVudGVyZWQgdGhlaXJcbi8vIGNsb3NlZCBzdGFnZSBvbiB0aGVpciBjbG9zZSBkYXRlLlxuZXhwb3J0IGNvbnN0IG9wcG9ydHVuaXRpZXMgPSBkZWZpbmVTZWVkKE9wcG9ydHVuaXR5LCB7XG4gIG1vZGU6ICd1cHNlcnQnLFxuICBleHRlcm5hbElkOiAnbmFtZScsXG4gIHJlY29yZHM6IFtcbiAgICB7XG4gICAgICBuYW1lOiAnQWNtZSBQbGF0Zm9ybSBVcGdyYWRlJyxcbiAgICAgIGNybV9hY2NvdW50OiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICAuLi5kZWFsVmFsdWUoJ0FjbWUgUGxhdGZvcm0gVXBncmFkZScsIDYwKSxcbiAgICAgIHN0YWdlOiAncHJvcG9zYWwnLFxuICAgICAgcHJvYmFiaWxpdHk6IDYwLFxuICAgICAgY2xvc2VfZGF0ZTogY2VsYGRheXNGcm9tTm93KDMwKWAsXG4gICAgICB0eXBlOiAnZXhpc3RpbmdfdXBncmFkZScsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ2NvbW1pdCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ3dlYicsXG4gICAgICBzdGFnZV9lbnRyeV9kYXRlOiBjZWxEYXlzQWdvKDEyKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgVXBncmFkZSBmcm9tIFN0YW5kYXJkIHRvIEVudGVycHJpc2UgZWRpdGlvbiBmb3IgdGhlXG5OQSArIEVNRUEgdGVhbXMuIERyaXZlcnM6ICgxKSBBSSBhZ2VudCBnb3Zlcm5hbmNlIGJlY29tZXMgYSBoYXJkXG5yZXF1aXJlbWVudCBhZnRlciB0aGVpciBpbnRlcm5hbCBjb21wbGlhbmNlIHJldmlldywgKDIpIGFkdmFuY2VkXG5hbmFseXRpY3Mgc2VhdHMgZm9yIHRoZSBPcHMgb3JnLCAoMykgcHJpb3JpdHkgc3VwcG9ydCBTTEEuYCxcbiAgICAgIC8vIFRoaXMgc2VudGVuY2UgdXNlZCB0byBEQVRFIHRoZSB3b3Jrc2hvcCBpdHNlbGYgKFwidGhlIHdlZWsgb2ZcbiAgICAgIC8vIGNsb3NlX2RhdGUgLSAxNGRcIiA9PiBkYXlzRnJvbU5vdygxNikpIHdoaWxlIHRoZSBzZWVkZWQgZXZlbnQgaGFkIGl0IGF0XG4gICAgICAvLyBkYXlzRnJvbU5vdyg2KSBhbmQgYSBzZWVkZWQgdGFzayBjaGFzZWQgaXQgYXQgZGF5c0Zyb21Ob3coNykgXHUyMDE0IHRocmVlXG4gICAgICAvLyByZWNvcmRzLCB0aHJlZSBhbnN3ZXJzICgjMTY2MCkuIFRoZSBkYXRlIG5vdyBsaXZlcyBpbiBleGFjdGx5IE9ORVxuICAgICAgLy8gcGxhY2UsIHRoZSBgY3JtX2V2ZW50YCByb3cgaW4gc2VydmljZS5zZWVkLnRzLCBhbmQgdGhpcyBwcm9zZSBzdGF0ZXNcbiAgICAgIC8vIG9ubHkgd2hhdCBzdGF5cyB0cnVlIGhvd2V2ZXIgdGhhdCBldmVudCBpcyBzY2hlZHVsZWQ6IGl0IGlzIGJvb2tlZCxcbiAgICAgIC8vIGFuZCBpdHMgaW52aXRhdGlvbiBoYXMgZ29uZSBvdXQgKHRoZSBhdHRlbmRlZSBidWlsZGVyIGNsYW1wc1xuICAgICAgLy8gYGludml0ZWRfZGF0ZWAgYXQgZGF5c0FnbygwKSwgc28gYSBwbGFubmVkIGV2ZW50J3MgaW52aXRlIGlzIG5ldmVyIGluXG4gICAgICAvLyB0aGUgZnV0dXJlKS4gUmUtZGF0aW5nIHRoZSBldmVudCB0aGVyZWZvcmUgY2Fubm90IHN0cmFuZCB0aGlzIGxpbmUuXG4gICAgICAvLyBEbyBub3QgcHV0IGEgZGF0ZSBiYWNrIGhlcmUsIGFic29sdXRlIE9SIHJlbGF0aXZlOiBhIHNlY29uZCBjb3B5IGlzXG4gICAgICAvLyBhIHNlY29uZCB0aGluZyB0byBkcmlmdC5cbiAgICAgIG5leHRfc3RlcDogYFNlbmQgdGhlIHJldmlzZWQgcHJvcG9zYWwgKEVudGVycHJpc2UgZWRpdGlvbiwgMTgtbW9udGggdGVybSwgMTIlIG11bHRpLXllYXIgZGlzY291bnQpIHRvIEpvcmRhbiBQYXJrIGJ5IEVPVy4gVGhlIEFJIGdvdmVybmFuY2Ugd29ya3Nob3Agd2l0aCB0aGVpciBjb21wbGlhbmNlIHRlYW0gaXMgYWxyZWFkeSBib29rZWQgYW5kIHRoZSBpbnZpdGF0aW9uIGlzIG91dC5gLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0dsb2JleCBNYW51ZmFjdHVyaW5nIFN1aXRlJyxcbiAgICAgIGNybV9hY2NvdW50OiAnR2xvYmV4IEluZHVzdHJpZXMnLFxuICAgICAgLi4uZGVhbFZhbHVlKCdHbG9iZXggTWFudWZhY3R1cmluZyBTdWl0ZScsIDI1KSxcbiAgICAgIHN0YWdlOiAncXVhbGlmaWNhdGlvbicsXG4gICAgICBwcm9iYWJpbGl0eTogMjUsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coNjApYCxcbiAgICAgIHR5cGU6ICduZXdfYnVzaW5lc3MnLFxuICAgICAgZm9yZWNhc3RfY2F0ZWdvcnk6ICdwaXBlbGluZScsXG4gICAgICBsZWFkX3NvdXJjZTogJ3JlZmVycmFsJyxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbERheXNBZ28oNDUpLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1dheW5lIEVudGVycHJpc2UgTGljZW5zZScsXG4gICAgICBjcm1fYWNjb3VudDogJ1dheW5lIEVudGVycHJpc2VzJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnV2F5bmUgRW50ZXJwcmlzZSBMaWNlbnNlJywgODApLFxuICAgICAgc3RhZ2U6ICduZWdvdGlhdGlvbicsXG4gICAgICBwcm9iYWJpbGl0eTogODAsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMTQpYCxcbiAgICAgIHR5cGU6ICduZXdfYnVzaW5lc3MnLFxuICAgICAgZm9yZWNhc3RfY2F0ZWdvcnk6ICdjb21taXQnLFxuICAgICAgbGVhZF9zb3VyY2U6ICdwYXJ0bmVyJyxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbERheXNBZ28oNyksXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnSW5pdGVjaCBDbG91ZCBNaWdyYXRpb24nLFxuICAgICAgY3JtX2FjY291bnQ6ICdJbml0ZWNoIFNvbHV0aW9ucycsXG4gICAgICAuLi5kZWFsVmFsdWUoJ0luaXRlY2ggQ2xvdWQgTWlncmF0aW9uJywgNDApLFxuICAgICAgc3RhZ2U6ICduZWVkc19hbmFseXNpcycsXG4gICAgICBwcm9iYWJpbGl0eTogNDAsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coNDUpYCxcbiAgICAgIHR5cGU6ICdleGlzdGluZ191cGdyYWRlJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAnYmVzdF9jYXNlJyxcbiAgICAgIGxlYWRfc291cmNlOiAnZXZlbnQnLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsRGF5c0FnbygzOCksXG4gICAgfSxcbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ2xvc2VkIFdvbiBkZWFscyAocG93ZXJzIEtQSXMgJiByZXZlbnVlIHRyZW5kcykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAge1xuICAgICAgbmFtZTogJ0FjbWUgQW5udWFsIFJlbmV3YWwgMjAyNScsXG4gICAgICBjcm1fYWNjb3VudDogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgICAgLi4uZGVhbFZhbHVlKCdBY21lIEFubnVhbCBSZW5ld2FsIDIwMjUnLCAxMDApLFxuICAgICAgc3RhZ2U6ICdjbG9zZWRfd29uJyxcbiAgICAgIHByb2JhYmlsaXR5OiAxMDAsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0FnbygxNSlgLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsYGRheXNBZ28oMTUpYCxcbiAgICAgIHR5cGU6ICdleGlzdGluZ19yZW5ld2FsJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAnY2xvc2VkJyxcbiAgICAgIGxlYWRfc291cmNlOiAncGFydG5lcicsXG4gICAgICB3aW5fcmVhc29uOiAncmVsYXRpb25zaGlwJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBgQW5udWFsIHJlbmV3YWwgb2YgdGhlIEFjbWUgU3RhbmRhcmQgc3Vic2NyaXB0aW9uLCBzaWduZWQgdHdvIHdlZWtzIGFoZWFkIG9mIHRoZSByZW5ld2FsIGRhdGUuIDIyJSBZb1kgdXBsaWZ0IGRyaXZlbiBieSBzZWF0IGV4cGFuc2lvbiBpbiB0aGUgbmV3IEVNRUEgdGVhbS4gTXVsdGkteWVhciBvcHRpb24gZGVjbGluZWQgdGhpcyByb3VuZCBcdTIwMTQgdGhleSB3YW50IHRvIHNlZSBob3cgdGhlIHBsYXRmb3JtIHVwZ3JhZGUgbGFuZHMgZmlyc3QuYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdTdGFyayBNZWRpY2FsIFBpbG90JyxcbiAgICAgIGNybV9hY2NvdW50OiAnU3RhcmsgTWVkaWNhbCcsXG4gICAgICAuLi5kZWFsVmFsdWUoJ1N0YXJrIE1lZGljYWwgUGlsb3QnLCAxMDApLFxuICAgICAgc3RhZ2U6ICdjbG9zZWRfd29uJyxcbiAgICAgIHByb2JhYmlsaXR5OiAxMDAsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0Fnbyg1MClgLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsYGRheXNBZ28oNTApYCxcbiAgICAgIHR5cGU6ICduZXdfYnVzaW5lc3MnLFxuICAgICAgZm9yZWNhc3RfY2F0ZWdvcnk6ICdjbG9zZWQnLFxuICAgICAgbGVhZF9zb3VyY2U6ICdldmVudCcsXG4gICAgICB3aW5fcmVhc29uOiAnYmVzdF9maXQnLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1dheW5lIFExIEV4cGFuc2lvbicsXG4gICAgICBjcm1fYWNjb3VudDogJ1dheW5lIEVudGVycHJpc2VzJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnV2F5bmUgUTEgRXhwYW5zaW9uJywgMTAwKSxcbiAgICAgIHN0YWdlOiAnY2xvc2VkX3dvbicsXG4gICAgICBwcm9iYWJpbGl0eTogMTAwLFxuICAgICAgY2xvc2VfZGF0ZTogY2VsYGRheXNBZ28oOTUpYCxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbGBkYXlzQWdvKDk1KWAsXG4gICAgICB0eXBlOiAnZXhpc3RpbmdfdXBncmFkZScsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ2Nsb3NlZCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ3dlYicsXG4gICAgICB3aW5fcmVhc29uOiAnYmV0dGVyX3Byb2R1Y3QnLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0dsb2JleCBUcmFpbmluZyBQYWNrYWdlJyxcbiAgICAgIGNybV9hY2NvdW50OiAnR2xvYmV4IEluZHVzdHJpZXMnLFxuICAgICAgLi4uZGVhbFZhbHVlKCdHbG9iZXggVHJhaW5pbmcgUGFja2FnZScsIDEwMCksXG4gICAgICBzdGFnZTogJ2Nsb3NlZF93b24nLFxuICAgICAgcHJvYmFiaWxpdHk6IDEwMCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzQWdvKDE0MClgLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsYGRheXNBZ28oMTQwKWAsXG4gICAgICB0eXBlOiAnbmV3X2J1c2luZXNzJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAnY2xvc2VkJyxcbiAgICAgIGxlYWRfc291cmNlOiAncmVmZXJyYWwnLFxuICAgICAgd2luX3JlYXNvbjogJ2JldHRlcl9zdXBwb3J0JyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJbml0ZWNoIFBoYXNlIDEnLFxuICAgICAgY3JtX2FjY291bnQ6ICdJbml0ZWNoIFNvbHV0aW9ucycsXG4gICAgICAuLi5kZWFsVmFsdWUoJ0luaXRlY2ggUGhhc2UgMScsIDEwMCksXG4gICAgICBzdGFnZTogJ2Nsb3NlZF93b24nLFxuICAgICAgcHJvYmFiaWxpdHk6IDEwMCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzQWdvKDIwMClgLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsYGRheXNBZ28oMjAwKWAsXG4gICAgICB0eXBlOiAnbmV3X2J1c2luZXNzJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAnY2xvc2VkJyxcbiAgICAgIGxlYWRfc291cmNlOiAnd2ViJyxcbiAgICAgIHdpbl9yZWFzb246ICdiZXR0ZXJfcHJpY2UnLFxuICAgIH0sXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENhbXBhaWduLWF0dHJpYnV0ZWQgd2lucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAgICAvLyBgY3JtX2NhbXBhaWduYCBpcyB3aGF0IGBjYW1wYWlnbl9hdHRyaWJ1dGlvbl9yZWZyZXNoYCBjb3VudHNcbiAgICAvLyAoYG51bV9vcHBvcnR1bml0aWVzYCAvIGBudW1fd29uX29wcG9ydHVuaXRpZXNgIC8gdGhlIHN1bW1lZFxuICAgIC8vIGBhY3R1YWxfcmV2ZW51ZWApIFx1MjAxNCBvbiBldmVyeSBvcHBvcnR1bml0eSBpbnNlcnQsIHVwZGF0ZSBhbmQgZGVsZXRlLCBub3RcbiAgICAvLyBvbmNlIGF0IGNvbXBsZXRpb24uIEJlZm9yZSAjNTkxIG5vdCBvbmUgb3Bwb3J0dW5pdHkgY2FycmllZCBpdCwgc28gdGhvc2VcbiAgICAvLyB0aHJlZSBtZXRyaWNzIHdlcmUgc3RydWN0dXJhbGx5IHplcm8gYW5kIGV2ZXJ5IGNhbXBhaWduJ3Mgc2VlZGVkXG4gICAgLy8gYGFjdHVhbF9yZXZlbnVlYCB3YXMgYSBudW1iZXIgdGhlIGhvb2sgd291bGQgaGF2ZSBvdmVyd3JpdHRlbiBvbiB0aGVcbiAgICAvLyBmaXJzdCBhdHRyaWJ1dGVkIHdyaXRlLlxuICAgIC8vIFRoZXNlIHRocmVlIHdpbnMgYXJlIHdoYXQgbWFrZSB0aGUgbWFya2V0aW5nIFJPSSBudW1iZXJzIGJlbG93IFRSVUUuXG4gICAge1xuICAgICAgbmFtZTogJ0xhdHRpY2UgQW5hbHl0aWNzIEV4cGFuc2lvbicsXG4gICAgICBjcm1fYWNjb3VudDogJ0xhdHRpY2UgRWR1Y2F0aW9uJyxcbiAgICAgIHByaW1hcnlfY29udGFjdDogJ3ByaXlhLnNoYWhAbGF0dGljZS5leGFtcGxlLmNvbScsXG4gICAgICBjcm1fY2FtcGFpZ246ICdRMyBFbnRlcnByaXNlIEVtYWlsIE51cnR1cmUnLFxuICAgICAgLi4uZGVhbFZhbHVlKCdMYXR0aWNlIEFuYWx5dGljcyBFeHBhbnNpb24nLCAxMDApLFxuICAgICAgc3RhZ2U6ICdjbG9zZWRfd29uJyxcbiAgICAgIHByb2JhYmlsaXR5OiAxMDAsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0Fnbyg2KWAsXG4gICAgICBzdGFnZV9lbnRyeV9kYXRlOiBjZWxgZGF5c0Fnbyg2KWAsXG4gICAgICB0eXBlOiAnZXhpc3RpbmdfZXhwYW5zaW9uJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAnY2xvc2VkJyxcbiAgICAgIGxlYWRfc291cmNlOiAnZW1haWxfY2FtcGFpZ24nLFxuICAgICAgd2luX3JlYXNvbjogJ2Jlc3RfZml0JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQW5hbHl0aWNzIHBhY2thZ2UgZm9yIGFkbWlzc2lvbnMgYW5kIGFsdW1uaSBlbmdhZ2VtZW50LCBzb3VyY2VkIGZyb20gdGhlIGVudGVycHJpc2UgbnVydHVyZSB0cmFjay4nLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1dheW5lIE9wZXJhdGlvbnMgTW9kdWxlIFJvbGxvdXQnLFxuICAgICAgY3JtX2FjY291bnQ6ICdXYXluZSBFbnRlcnByaXNlcycsXG4gICAgICBwcmltYXJ5X2NvbnRhY3Q6ICdyd2lsc29uQHdheW5lLmV4YW1wbGUuY29tJyxcbiAgICAgIGNybV9jYW1wYWlnbjogJ09wZXJhdGlvbnMgUGxhdGZvcm0gTGF1bmNoJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnV2F5bmUgT3BlcmF0aW9ucyBNb2R1bGUgUm9sbG91dCcsIDEwMCksXG4gICAgICBzdGFnZTogJ2Nsb3NlZF93b24nLFxuICAgICAgcHJvYmFiaWxpdHk6IDEwMCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzQWdvKDQpYCxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbGBkYXlzQWdvKDQpYCxcbiAgICAgIHR5cGU6ICdleGlzdGluZ191cGdyYWRlJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAnY2xvc2VkJyxcbiAgICAgIGxlYWRfc291cmNlOiAnY29udGVudCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ09wZXJhdGlvbnMgbW9kdWxlIGZvciB0d28gbWFudWZhY3R1cmluZyBkaXZpc2lvbnMsIGNsb3NlZCBvZmYgdGhlIG9wZXJhdGlvbnMtcGxhdGZvcm0gbGF1bmNoIHByb2dyYW0uJyxcbiAgICAgIHdpbl9yZWFzb246ICdyZWxhdGlvbnNoaXAnLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ZlcnRleCBEZXZlbG9wZXIgUGxhdGZvcm0gQWRvcHRpb24nLFxuICAgICAgY3JtX2FjY291bnQ6ICdWZXJ0ZXggQW5hbHl0aWNzJyxcbiAgICAgIHByaW1hcnlfY29udGFjdDogJ2V0aGFuLmJyb29rc0B2ZXJ0ZXguZXhhbXBsZS5jb20nLFxuICAgICAgY3JtX2NhbXBhaWduOiAnRGV2ZWxvcGVyIENvbnRlbnQgTWFya2V0aW5nIFB1c2gnLFxuICAgICAgLi4uZGVhbFZhbHVlKCdWZXJ0ZXggRGV2ZWxvcGVyIFBsYXRmb3JtIEFkb3B0aW9uJywgMTAwKSxcbiAgICAgIHN0YWdlOiAnY2xvc2VkX3dvbicsXG4gICAgICBwcm9iYWJpbGl0eTogMTAwLFxuICAgICAgY2xvc2VfZGF0ZTogY2VsYGRheXNBZ28oNilgLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsYGRheXNBZ28oNilgLFxuICAgICAgdHlwZTogJ2V4aXN0aW5nX2V4cGFuc2lvbicsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ2Nsb3NlZCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ2NvbnRlbnQnLFxuICAgICAgZGVzY3JpcHRpb246ICdUaHJlZSBwcm9kdWN0IHRlYW1zIGFkb3B0ZWQgdGhlIGRldmVsb3BlciBwbGF0Zm9ybSBhZnRlciB0aGUgdGVjaG5pY2FsIGNvbnRlbnQgc2VyaWVzLicsXG4gICAgICB3aW5fcmVhc29uOiAnYmV0dGVyX3Byb2R1Y3QnLFxuICAgIH0sXG4gICAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENsb3NlZCBMb3N0IGRlYWxzIChwb3dlcnMgd2luLXJhdGUgKyBsb3NzLXJlYXNvbiBhbmFseXRpY3MpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICAgIC8vXG4gICAgLy8gRml2ZSBsb3NzZXMgYWNyb3NzIGZpdmUgZGlzdGluY3QgYGxvc3NfcmVhc29uYCB2YWx1ZXMsIGFuZCBldmVyeSBvbmUgb2ZcbiAgICAvLyB0aGVtIGlzIG5vdyBNQU5EQVRPUlkgcmF0aGVyIHRoYW4gZGVjb3JhdGl2ZTogYGxvc3NfcmVhc29uYCBpc1xuICAgIC8vIGByZXF1aXJlZFdoZW5gIHN0YWdlIGlzIGBjbG9zZWRfbG9zdGAgKCM1OTMpLCBzbyBhIHNlZWRlZCBsb3N0IGRlYWxcbiAgICAvLyB3aXRob3V0IG9uZSBpcyByZWplY3RlZCBieSB0aGUgZW5naW5lIGF0IHNlZWQgdGltZSBcdTIwMTQgdGhlIGRlbW8gZGF0YWJhc2VcbiAgICAvLyBjYW5ub3QgYm9vdCB3aXRoIHRoZSBlbXB0eSBjb2x1bW4gdGhhdCBtYWRlIHRoZSBsb3NzLXJlYXNvbiB3aWRnZXRcbiAgICAvLyB1bmJ1aWxkYWJsZSBpbiB0aGUgZmlyc3QgcGxhY2UuXG4gICAgLy9cbiAgICAvLyBUaGVpciBgbGVhZF9zb3VyY2VgIHZhbHVlcyBhcmUgY2hvc2VuIHNvIHRoYXQgdGhlIHNvdXJjZXMgY2FycnlpbmcgYSBsb3NzXG4gICAgLy8gQUxTTyBjYXJyeSBhIHdpbiAoYHdlYmAsIGByZWZlcnJhbGAsIGBjb250ZW50YCksIHBsdXMgdHdvIHNvdXJjZXMgdGhhdFxuICAgIC8vIG9ubHkgZXZlciBsb3N0IChgY29sZF9jYWxsYCwgYGFkdmVydGlzZW1lbnRgKS4gVGhhdCBpcyB3aGF0IG1ha2VzXG4gICAgLy8gYHdpbl9yYXRlX2J5X2xlYWRfc291cmNlYCBhIHJlYWwgbWVhc3VyZW1lbnQgaW5zdGVhZCBvZiBhIGNvbHVtbiBvZlxuICAgIC8vIDEwMCVzOiB0aHJlZSByb3dzIHdoZXJlIGJvdGggaGFsdmVzIG9mIHRoZSByYXRpbyBtb3ZlLCBhbmQgdHdvIHJvd3MgdGhhdFxuICAgIC8vIHNob3cgd2hhdCBhbiBhbGwtbG9zcyBzb3VyY2UgbG9va3MgbGlrZS5cbiAgICB7XG4gICAgICBuYW1lOiAnQWNtZSBBZGQtb24gKExvc3QpJyxcbiAgICAgIGNybV9hY2NvdW50OiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICAuLi5kZWFsVmFsdWUoJ0FjbWUgQWRkLW9uIChMb3N0KScsIDApLFxuICAgICAgc3RhZ2U6ICdjbG9zZWRfbG9zdCcsXG4gICAgICBwcm9iYWJpbGl0eTogMCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzQWdvKDI1KWAsXG4gICAgICBzdGFnZV9lbnRyeV9kYXRlOiBjZWxgZGF5c0FnbygyNSlgLFxuICAgICAgdHlwZTogJ2V4aXN0aW5nX3VwZ3JhZGUnLFxuICAgICAgZm9yZWNhc3RfY2F0ZWdvcnk6ICdvbWl0dGVkJyxcbiAgICAgIGxlYWRfc291cmNlOiAnY29sZF9jYWxsJyxcbiAgICAgIGxvc3NfcmVhc29uOiAndGltaW5nJyxcbiAgICAgIGxvc3NfZGV0YWlsczogJ01hcmtldGluZyBpcyBsb2NrZWQgaW50byBhIDIteWVhciBIdWJTcG90IGNvbnRyYWN0OyB0aGUgYnV5aW5nIHdpbmRvdyBvcGVucyB3aGVuIHRoYXQgcmVuZXdzLicsXG4gICAgICAvLyBUaGlzIGxpbmUgdXNlZCB0byBlbmQgXCJSZXZpc2l0IGluIFEzXCIgXHUyMDE0IGEgaGFuZC10eXBlZCBjYWxlbmRhciBxdWFydGVyXG4gICAgICAvLyBvbiBhIHJlY29yZCB3aG9zZSBgY2xvc2VfZGF0ZWAgaXMgYGRheXNBZ28oMjUpYCwgc28gdGhlIHF1YXJ0ZXIgaXQgdG9sZFxuICAgICAgLy8gYSByZXAgdG8gd2FpdCBmb3IgaXMgdGhlIG9uZSB0aGUgZGVhbCB3YXMgYWxyZWFkeSBsb3N0IGluLCBhbmQgaXRcbiAgICAgIC8vIGNvbnRyYWRpY3RlZCB0aGlzIHJlY29yZCdzIG93biBgbG9zc19kZXRhaWxzYDogYSAyLXllYXIgbG9jayBkb2VzIG5vdFxuICAgICAgLy8gcmVvcGVuIGluc2lkZSB0aGUgcXVhcnRlciB0aGUgZGVhbCBjbG9zZWQgaW4gKCMxNzEyKS4gU2FtZSBydWxpbmcgYXNcbiAgICAgIC8vIHRoZSBgbmV4dF9zdGVwYCBibG9jayBhYm92ZSAoIzE2NjApOiBubyBkYXRlIGdvZXMgYmFjayBpbnRvIHRoaXMgcHJvc2UsXG4gICAgICAvLyBhYnNvbHV0ZSBPUiByZWxhdGl2ZS4gVGhlIHJlbmV3YWwgaXMgdGhlIGFuY2hvciB0aGF0IHN0YXlzIHRydWUgaG93ZXZlclxuICAgICAgLy8gdGhpcyByZWNvcmQgaXMgZGF0ZWQgXHUyMDE0IHdoaWNoIGlzIGhvdyBgbG9zc19kZXRhaWxzYCBhbmQgdGhlIGFjY291bnRcbiAgICAgIC8vIGRlc2NyaXB0aW9uIGFscmVhZHkgc3RhdGUgaXQuXG4gICAgICBkZXNjcmlwdGlvbjogYFRyaWVkIHRvIGJvbHQgb24gdGhlIE1hcmtldGluZyBDbG91ZCBtb2R1bGUgdmlhIGNvbGQgb3V0Ym91bmQuIExvc3QgYmVjYXVzZSBBY21lJ3MgbWFya2V0aW5nIG9yZyBpcyBhbHJlYWR5IG9uIGEgMi15ZWFyIEh1YlNwb3QgY29udHJhY3QuIFJldmlzaXQgd2hlbiB0aGF0IGNvbnRyYWN0IGNvbWVzIHVwIGZvciByZW5ld2FsIFx1MjAxNCB0aGF0IGlzIHdoZW4gdGhlIGJ1eWluZyB3aW5kb3cgb3BlbnMuYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdTdGFyayBFeHBhbnNpb24gKExvc3QpJyxcbiAgICAgIGNybV9hY2NvdW50OiAnU3RhcmsgTWVkaWNhbCcsXG4gICAgICAuLi5kZWFsVmFsdWUoJ1N0YXJrIEV4cGFuc2lvbiAoTG9zdCknLCAwKSxcbiAgICAgIHN0YWdlOiAnY2xvc2VkX2xvc3QnLFxuICAgICAgcHJvYmFiaWxpdHk6IDAsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0Fnbyg2MClgLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsYGRheXNBZ28oNjApYCxcbiAgICAgIHR5cGU6ICduZXdfYnVzaW5lc3MnLFxuICAgICAgZm9yZWNhc3RfY2F0ZWdvcnk6ICdvbWl0dGVkJyxcbiAgICAgIGxlYWRfc291cmNlOiAnYWR2ZXJ0aXNlbWVudCcsXG4gICAgICBsb3NzX3JlYXNvbjogJ25vX2J1ZGdldCcsXG4gICAgICBsb3NzX2RldGFpbHM6ICdDYXBpdGFsIGZyZWV6ZSBvbiBub24tY2xpbmljYWwgc3lzdGVtcyBmb3IgdGhlIHJlc3Qgb2YgdGhlIGZpc2NhbCB5ZWFyLicsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnR2xvYmV4IExpbmUgRXhwYW5zaW9uIChMb3N0KScsXG4gICAgICBjcm1fYWNjb3VudDogJ0dsb2JleCBJbmR1c3RyaWVzJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnR2xvYmV4IExpbmUgRXhwYW5zaW9uIChMb3N0KScsIDApLFxuICAgICAgc3RhZ2U6ICdjbG9zZWRfbG9zdCcsXG4gICAgICBwcm9iYWJpbGl0eTogMCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzQWdvKDM1KWAsXG4gICAgICBzdGFnZV9lbnRyeV9kYXRlOiBjZWxgZGF5c0FnbygzNSlgLFxuICAgICAgdHlwZTogJ2V4aXN0aW5nX2V4cGFuc2lvbicsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ29taXR0ZWQnLFxuICAgICAgbGVhZF9zb3VyY2U6ICdyZWZlcnJhbCcsXG4gICAgICBsb3NzX3JlYXNvbjogJ2NvbXBldGl0b3InLFxuICAgICAgbG9zc19kZXRhaWxzOiAnSW5jdW1iZW50IE1FUyB2ZW5kb3IgYnVuZGxlZCB0aGUgdHdvIGFkZGl0aW9uYWwgbGluZXMgaW50byBhbiBleGlzdGluZyBtYXN0ZXIgYWdyZWVtZW50LicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0V4cGFuc2lvbiBpbnRvIHR3byBmdXJ0aGVyIHByb2R1Y3Rpb24gbGluZXMsIGxvc3QgdG8gdGhlIGluY3VtYmVudCBNRVMgdmVuZG9yIG9uIGJ1bmRsaW5nLicsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnTm9ydGh3aW5kIEZpZWxkIFNlcnZpY2UgUGlsb3QgKExvc3QpJyxcbiAgICAgIGNybV9hY2NvdW50OiAnTm9ydGh3aW5kIEVuZXJneScsXG4gICAgICAuLi5kZWFsVmFsdWUoJ05vcnRod2luZCBGaWVsZCBTZXJ2aWNlIFBpbG90IChMb3N0KScsIDApLFxuICAgICAgc3RhZ2U6ICdjbG9zZWRfbG9zdCcsXG4gICAgICBwcm9iYWJpbGl0eTogMCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzQWdvKDgwKWAsXG4gICAgICBzdGFnZV9lbnRyeV9kYXRlOiBjZWxgZGF5c0Fnbyg4MClgLFxuICAgICAgdHlwZTogJ25ld19idXNpbmVzcycsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ29taXR0ZWQnLFxuICAgICAgbGVhZF9zb3VyY2U6ICd3ZWInLFxuICAgICAgbG9zc19yZWFzb246ICdwcmljZScsXG4gICAgICBsb3NzX2RldGFpbHM6ICdQZXItdGVjaG5pY2lhbiBwcmljaW5nIGxhbmRlZCB+MzAlIGFib3ZlIHRoZSBidWRnZXQgdGhlIG9wZXJhdGlvbnMgZGlyZWN0b3IgaGFkIGFwcHJvdmVkLicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ZpZWxkLXNlcnZpY2UgcGlsb3QgZm9yIHRoZSBtZXRlcmluZyBjcmV3cywgbG9zdCBvbiBwcmljZSBhZ2FpbnN0IGEgY2hlYXBlciBwb2ludCBzb2x1dGlvbi4nLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0FwZXggQ29tcGxpYW5jZSBSZXBvcnRpbmcgKExvc3QpJyxcbiAgICAgIGNybV9hY2NvdW50OiAnQXBleCBMb2dpc3RpY3MnLFxuICAgICAgLi4uZGVhbFZhbHVlKCdBcGV4IENvbXBsaWFuY2UgUmVwb3J0aW5nIChMb3N0KScsIDApLFxuICAgICAgc3RhZ2U6ICdjbG9zZWRfbG9zdCcsXG4gICAgICBwcm9iYWJpbGl0eTogMCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzQWdvKDExMClgLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsYGRheXNBZ28oMTEwKWAsXG4gICAgICB0eXBlOiAnbmV3X2J1c2luZXNzJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAnb21pdHRlZCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ2NvbnRlbnQnLFxuICAgICAgbG9zc19yZWFzb246ICdmZWF0dXJlcycsXG4gICAgICBsb3NzX2RldGFpbHM6ICdObyBuYXRpdmUgaG91cnMtb2Ytc2VydmljZSBhdWRpdCB0cmFpbDsgdGhlIGNvbXBsaWFuY2UgdGVhbSBjb3VsZCBub3Qgc2lnbiBvZmYgd2l0aG91dCBpdC4nLFxuICAgICAgZGVzY3JpcHRpb246ICdSZWd1bGF0b3J5IHJlcG9ydGluZyBwYWNrIGZvciB0aGUgZmxlZXQgY29tcGxpYW5jZSB0ZWFtLCBsb3N0IG9uIGEgbWlzc2luZyBhdWRpdC10cmFpbCBjYXBhYmlsaXR5LicsXG4gICAgfSxcbiAgICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ3VyYXRlZCBhY3RpdmUgcGlwZWxpbmUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gICAgLy8gVHdvIGNhcmRzIGluIGVhY2ggYWN0aXZlIHN0YWdlIG1ha2UgdGhlIGthbmJhbiBpbW1lZGlhdGVseSBsZWdpYmxlIGluXG4gICAgLy8gYSBjdXN0b21lciBkZW1vLiBUaGV5IGFsc28gdGVsbCBhIGNvaGVyZW50IHNhbGVzIHN0b3J5IGluc3RlYWQgb2ZcbiAgICAvLyBvdmVyd2hlbG1pbmcgdGhlIGJvYXJkIHdpdGggYW5vbnltb3VzIGdlbmVyYXRlZCByb3dzLlxuICAgIC8vXG4gICAgLy8gUFJJQ0VEIFRPIFNUQVkgRFJBR0dBQkxFICgjMTkwMikuIEEgZGVhbCBhdCBvciBhYm92ZVxuICAgIC8vIGBMQVJHRV9ERUFMX0FNT1VOVGAgaXMgYm9ybiBpbnRvIGBvcHBvcnR1bml0eV9hcHByb3ZhbF9vbl9jcmVhdGVgLCB3aG9zZVxuICAgIC8vIGFwcHJvdmFsIG5vZGVzIGhvbGQgdGhlIHJlY29yZCB3aXRoIGBsb2NrUmVjb3JkOiB0cnVlYCBcdTIwMTQgb24gdGhlIGJvYXJkXG4gICAgLy8gdGhhdCBjYXJkIHJlZnVzZXMgZXZlcnkgZHJhZyB3aXRoIGBSRUNPUkRfTE9DS0VEYC4gV2hlbiBuaW5lIG9mIHRoZSB0ZW5cbiAgICAvLyBvcGVuIGRlYWxzIHNhdCBvdmVyIHRoZSBsaW5lLCB0aGUgb25lIGJvYXJkIGEgZGVtbyBvcGVucyBmaXJzdCB3YXNcbiAgICAvLyBmcm96ZW4uIFNvIGV4YWN0bHkgVFdPIG9wZW4gZGVhbHMgZXhoaWJpdCB0aGUgYXBwcm92YWwgZmxvdywgb25lIHBlclxuICAgIC8vIHRpZXIsIGFuZCBib3RoIGFyZSBpbiB0aGUgYmxvY2sgYWJvdmU6IGBBY21lIFBsYXRmb3JtIFVwZ3JhZGVgXG4gICAgLy8gKG1hbmFnZXIgcmV2aWV3IG9ubHksICQxMDBLXHUyMDEzJDUwMEspIGFuZCBgV2F5bmUgRW50ZXJwcmlzZSBMaWNlbnNlYFxuICAgIC8vIChtYW5hZ2VyLCB0aGVuIGRpcmVjdG9yIHNpZ24tb2ZmLCBvdmVyIGBISUdIX1ZBTFVFX0RFQUxfQU1PVU5UYCkuIEV2ZXJ5XG4gICAgLy8gZGVhbCBpbiB0aGlzIGJsb2NrIGlzIHByaWNlZCB1bmRlciB0aGUgbGluZSwgc28gZWFjaCBhY3RpdmUgc3RhZ2Uga2VlcHNcbiAgICAvLyBhdCBsZWFzdCBvbmUgY2FyZCB0aGF0IG1vdmVzLiBgdGVzdC9zZWVkLWNvbnNpc3RlbmN5LnRlc3QudHNgIHBpbnMgdGhlXG4gICAgLy8gdHdvIGJ5IG5hbWUgXHUyMDE0IHJlLXByaWNpbmcgYSBkZWFsIGhlcmUgb3ZlciAkMTAwSyBnb2VzIHJlZCB0aGVyZS5cbiAgICB7XG4gICAgICBuYW1lOiAnTm9ydGh3aW5kIEdyaWQgTW9kZXJuaXphdGlvbicsXG4gICAgICBjcm1fYWNjb3VudDogJ05vcnRod2luZCBFbmVyZ3knLFxuICAgICAgcHJpbWFyeV9jb250YWN0OiAnb2xpdmlhLmNoZW5Abm9ydGh3aW5kLmV4YW1wbGUuY29tJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnTm9ydGh3aW5kIEdyaWQgTW9kZXJuaXphdGlvbicsIDEwKSxcbiAgICAgIHN0YWdlOiAncHJvc3BlY3RpbmcnLFxuICAgICAgcHJvYmFiaWxpdHk6IDEwLFxuICAgICAgY2xvc2VfZGF0ZTogY2VsYGRheXNGcm9tTm93KDcyKWAsXG4gICAgICB0eXBlOiAnbmV3X2J1c2luZXNzJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAncGlwZWxpbmUnLFxuICAgICAgbGVhZF9zb3VyY2U6ICd3ZWJpbmFyJyxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbERheXNBZ28oNCksXG4gICAgICBkZXNjcmlwdGlvbjogJ05vcnRod2luZCBpcyBhc3Nlc3NpbmcgYSB1bmlmaWVkIGdyaWQtbW9kZXJuaXphdGlvbiBwcm9ncmFtIGFmdGVyIGFuIGV4ZWN1dGl2ZSB3ZWJpbmFyLicsXG4gICAgICBuZXh0X3N0ZXA6ICdDb25maXJtIGRpc2NvdmVyeSBwYXJ0aWNpcGFudHMgYW5kIGFncmVlIHRoZSBvcGVyYXRpb25hbC1kYXRhIGFzc2Vzc21lbnQgc2NvcGUuJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdMYXR0aWNlIFN0dWRlbnQgU3VjY2VzcyBQbGF0Zm9ybScsXG4gICAgICBjcm1fYWNjb3VudDogJ0xhdHRpY2UgRWR1Y2F0aW9uJyxcbiAgICAgIHByaW1hcnlfY29udGFjdDogJ3ByaXlhLnNoYWhAbGF0dGljZS5leGFtcGxlLmNvbScsXG4gICAgICBjcm1fY2FtcGFpZ246ICdEZXZlbG9wZXIgQ29udGVudCBNYXJrZXRpbmcgUHVzaCcsXG4gICAgICAuLi5kZWFsVmFsdWUoJ0xhdHRpY2UgU3R1ZGVudCBTdWNjZXNzIFBsYXRmb3JtJywgMTApLFxuICAgICAgc3RhZ2U6ICdwcm9zcGVjdGluZycsXG4gICAgICBwcm9iYWJpbGl0eTogMTAsXG4gICAgICBjbG9zZV9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coOTYpYCxcbiAgICAgIHR5cGU6ICduZXdfYnVzaW5lc3MnLFxuICAgICAgZm9yZWNhc3RfY2F0ZWdvcnk6ICdwaXBlbGluZScsXG4gICAgICBsZWFkX3NvdXJjZTogJ2NvbnRlbnQnLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsRGF5c0FnbygxMSksXG4gICAgICBkZXNjcmlwdGlvbjogJ0EgbmV3IHN0dWRlbnQtc3VjY2VzcyBpbml0aWF0aXZlIHNvdXJjZWQgZnJvbSB0aGUgaGlnaGVyLWVkdWNhdGlvbiBjb250ZW50IHNlcmllcy4nLFxuICAgICAgbmV4dF9zdGVwOiAnSW52aXRlIHRoZSBvcGVyYXRpb25zIHNwb25zb3IgdG8gdGhlIGRpc2NvdmVyeSB3b3Jrc2hvcC4nLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ZlcnRleCBBbmFseXRpY3MgRXhwYW5zaW9uJyxcbiAgICAgIGNybV9hY2NvdW50OiAnVmVydGV4IEFuYWx5dGljcycsXG4gICAgICBwcmltYXJ5X2NvbnRhY3Q6ICdldGhhbi5icm9va3NAdmVydGV4LmV4YW1wbGUuY29tJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnVmVydGV4IEFuYWx5dGljcyBFeHBhbnNpb24nLCAyNSksXG4gICAgICBzdGFnZTogJ3F1YWxpZmljYXRpb24nLFxuICAgICAgcHJvYmFiaWxpdHk6IDI1LFxuICAgICAgY2xvc2VfZGF0ZTogY2VsYGRheXNGcm9tTm93KDUyKWAsXG4gICAgICB0eXBlOiAnZXhpc3RpbmdfZXhwYW5zaW9uJyxcbiAgICAgIGZvcmVjYXN0X2NhdGVnb3J5OiAncGlwZWxpbmUnLFxuICAgICAgbGVhZF9zb3VyY2U6ICdwYXJ0bmVyJyxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbERheXNBZ28oOCksXG4gICAgICBkZXNjcmlwdGlvbjogJ1ZlcnRleCB3YW50cyB0byBleHRlbmQgdGhlIHBsYXRmb3JtIGZyb20gaXRzIGRhdGEgdGVhbSB0byB0aGUgZnVsbCByZXZlbnVlIG9yZ2FuaXphdGlvbi4nLFxuICAgICAgbmV4dF9zdGVwOiAnVmFsaWRhdGUgdGhlIGJ1eWluZyBjb21taXR0ZWUsIGJ1ZGdldCBvd25lciBhbmQgZXhwYW5zaW9uIHRpbWVsaW5lLicsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnQXBleCBMb2dpc3RpY3MgRGF0YSBIdWInLFxuICAgICAgY3JtX2FjY291bnQ6ICdBcGV4IExvZ2lzdGljcycsXG4gICAgICBwcmltYXJ5X2NvbnRhY3Q6ICdtYXJjdXMucmVlZEBhcGV4bG9naXN0aWNzLmV4YW1wbGUuY29tJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnQXBleCBMb2dpc3RpY3MgRGF0YSBIdWInLCA0MCksXG4gICAgICBzdGFnZTogJ25lZWRzX2FuYWx5c2lzJyxcbiAgICAgIHByb2JhYmlsaXR5OiA0MCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygzOClgLFxuICAgICAgdHlwZTogJ25ld19idXNpbmVzcycsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ2Jlc3RfY2FzZScsXG4gICAgICBsZWFkX3NvdXJjZTogJ3BhcnRuZXInLFxuICAgICAgc3RhZ2VfZW50cnlfZGF0ZTogY2VsRGF5c0FnbygxOCksXG4gICAgICBkZXNjcmlwdGlvbjogJ0FwZXggaXMgbWFwcGluZyBpdHMgZnJhZ21lbnRlZCBjb21tZXJjaWFsIHN5c3RlbXMgYmVmb3JlIGNvbW1pdHRpbmcgdG8gYSBkYXRhLWh1YiBwcm9ncmFtLicsXG4gICAgICBuZXh0X3N0ZXA6ICdDb21wbGV0ZSB0aGUgYXJjaGl0ZWN0dXJlIHdvcmtzaG9wIGFuZCBxdWFudGlmeSB0aGUgaW50ZWdyYXRpb24gYmFja2xvZy4nLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0xhdHRpY2UgRWR1Y2F0aW9uIFJlbmV3YWwnLFxuICAgICAgY3JtX2FjY291bnQ6ICdMYXR0aWNlIEVkdWNhdGlvbicsXG4gICAgICBwcmltYXJ5X2NvbnRhY3Q6ICdwcml5YS5zaGFoQGxhdHRpY2UuZXhhbXBsZS5jb20nLFxuICAgICAgY3JtX2NhbXBhaWduOiAnUTMgRW50ZXJwcmlzZSBFbWFpbCBOdXJ0dXJlJyxcbiAgICAgIC4uLmRlYWxWYWx1ZSgnTGF0dGljZSBFZHVjYXRpb24gUmVuZXdhbCcsIDYwKSxcbiAgICAgIHN0YWdlOiAncHJvcG9zYWwnLFxuICAgICAgcHJvYmFiaWxpdHk6IDYwLFxuICAgICAgY2xvc2VfZGF0ZTogY2VsYGRheXNGcm9tTm93KDI0KWAsXG4gICAgICB0eXBlOiAnZXhpc3RpbmdfcmVuZXdhbCcsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ2NvbW1pdCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ2VtYWlsX2NhbXBhaWduJyxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbERheXNBZ28oNiksXG4gICAgICBkZXNjcmlwdGlvbjogJ1JlbmV3YWwgcHJvcG9zYWwgYWRkcyBzdHVkZW50LXN1Y2Nlc3MgYXV0b21hdGlvbiBhbmQgYW4gZXhwYW5kZWQgYW5hbHl0aWNzIHBhY2thZ2UuJyxcbiAgICAgIG5leHRfc3RlcDogJ1JldmlldyB0aGUgdHdvLXllYXIgb3B0aW9uIHdpdGggcHJvY3VyZW1lbnQgYmVmb3JlIHRoZSBleGVjdXRpdmUgc3BvbnNvciBtZWV0aW5nLicsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnVmVydGV4IEVudGVycHJpc2UgUm9sbG91dCcsXG4gICAgICBjcm1fYWNjb3VudDogJ1ZlcnRleCBBbmFseXRpY3MnLFxuICAgICAgcHJpbWFyeV9jb250YWN0OiAnZXRoYW4uYnJvb2tzQHZlcnRleC5leGFtcGxlLmNvbScsXG4gICAgICAuLi5kZWFsVmFsdWUoJ1ZlcnRleCBFbnRlcnByaXNlIFJvbGxvdXQnLCA4MCksXG4gICAgICBzdGFnZTogJ25lZ290aWF0aW9uJyxcbiAgICAgIHByb2JhYmlsaXR5OiA4MCxcbiAgICAgIGNsb3NlX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygxMSlgLFxuICAgICAgdHlwZTogJ2V4aXN0aW5nX2V4cGFuc2lvbicsXG4gICAgICBmb3JlY2FzdF9jYXRlZ29yeTogJ2NvbW1pdCcsXG4gICAgICBsZWFkX3NvdXJjZTogJ3JlZmVycmFsJyxcbiAgICAgIHN0YWdlX2VudHJ5X2RhdGU6IGNlbERheXNBZ28oMyksXG4gICAgICBkZXNjcmlwdGlvbjogJ1BoYXNlIG9uZSBvZiBhbiBlbnRlcnByaXNlIHJvbGxvdXQsIG5lZ290aWF0ZWQgYXJvdW5kIHBoYXNlZCBkZXBsb3ltZW50IGFuZCBkYXRhLXJlc2lkZW5jeSByZXF1aXJlbWVudHMuJyxcbiAgICAgIG5leHRfc3RlcDogJ1Jlc29sdmUgdGhlIGZpbmFsIHNlY3VyaXR5IGFkZGVuZHVtIGFuZCBjb25maXJtIHRoZSBwcm9jdXJlbWVudCBzaWduYXR1cmUgZGF0ZS4nLFxuICAgIH0sXG4gIF1cbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YS9fc2hhcmVkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGFcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YS9fc2hhcmVkLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFNlZWQgaGVscGVycyBzaGFyZWQgYnkgZXZlcnkgYCouc2VlZC50c2AgZmFtaWx5IG1vZHVsZS5cbiAqXG4gKiBUaGUgc2VlZCBkYXRhIHVzZWQgdG8gYmUgb25lIDEwMEtCIGBzcmMvZGF0YS9pbmRleC50c2AsIHdoaWNoIHNhdCB+MS41S0JcbiAqIHVuZGVyIHRoZSBgcG5wbSBoeWdpZW5lYCBieXRlIGNhcCBhbmQgdHVybmVkIHRoZSBuZXh0IGRlbW8gcmVjb3JkIGludG8gYVxuICogYnVpbGQgZmFpbHVyZSAoIzYzNSkuIEl0IGlzIG5vdyBzcGxpdCBieSBvYmplY3QgZmFtaWx5IFx1MjAxNCBgY2F0YWxvZ2AsIGBzYWxlc2AsXG4gKiBgc2VydmljZWAsIGBtYXJrZXRpbmdgLCBgcmV2ZW51ZWAgXHUyMDE0IHdpdGggYGluZGV4LnRzYCByZWR1Y2VkIHRvIHRoZVxuICogYWdncmVnYXRpbmcgYENybVNlZWREYXRhYCBleHBvcnQuIFRoaXMgbW9kdWxlIGhvbGRzIHdoYXQgbW9yZSB0aGFuIG9uZVxuICogZmFtaWx5IG5lZWRzLlxuICovXG5pbXBvcnQgeyBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5cbi8qKlxuICogQSBub3RlIG9uIHN5c3RlbS1jb21wdXRlZCBmaWVsZHMgaW4gc2VlZHMgKCM0OTAsICM2MTcpLlxuICpcbiAqICMjIyBIb29rcyBETyBydW4gb3ZlciBzZWVkIHdyaXRlcyBcdTIwMTQgYXV0b21hdGlvbnMgZG8gbm90XG4gKlxuICogVGhlIHNlZWQgbG9hZGVyIHdyaXRlcyB3aXRoIGB7IGlzU3lzdGVtOiB0cnVlLCBza2lwVHJpZ2dlcnM6IHRydWUsXG4gKiBzZWVkUmVwbGF5OiB0cnVlIH1gLCBhbmQgdGhlIHByZW1pc2UgdGhpcyBmaWxlIHVzZWQgdG8gc3RhdGUgXHUyMDE0IFwiaG9va3MgZG8gTk9UXG4gKiBydW4gb3ZlciBzZWVkIHJvd3NcIiBcdTIwMTQgd2FzIHdyb25nICgjNjE3KS4gTWVhc3VyZWQgYWdhaW5zdCAxNy4wLjAtcmMuMSwgYW5kXG4gKiBtYXRjaGluZyBgU2VlZExvYWRlclNlcnZpY2UuU0VFRF9PUFRJT05TYCcgb3duIGNvbnRyYWN0OlxuICpcbiAqICAgLSBgaXNTeXN0ZW1gICAgYnlwYXNzZXMgUkJBQyBhbmQgRElTQUJMRVMgdGhlIHNlY3VyaXR5IHBsdWdpbidzIGluamVjdGlvblxuICogICAgICAgICAgICAgICAgICBvZiBgb3JnYW5pemF0aW9uX2lkYCAvIGBvd25lcl9pZGAgXHUyMDE0IHdoaWNoIGlzIHdoeSBzZWVkZWQgcm93c1xuICogICAgICAgICAgICAgICAgICBsYW5kIG93bmVybGVzcyB1bnRpbCB0aGUgcGxhdGZvcm0ncyBzZWVkLW93bmVyc2hpcCBjbGFpbVxuICogICAgICAgICAgICAgICAgICBoYW5kcyB0aGVtIHRvIHRoZSBmaXJzdCBhZG1pbmlzdHJhdG9yIHdoZW4gdGhlIHNlZWQgc2V0dGxlcy5cbiAqICAgLSBgc2tpcFRyaWdnZXJzYCBzdXBwcmVzc2VzIHJlY29yZC1jaGFuZ2UgQVVUT01BVElPTiAoYXV0b2xhdW5jaGVkIGZsb3dzKSxcbiAqICAgICAgICAgICAgICAgICAgbm90IGxpZmVjeWNsZSBob29rcy4gU2VlZCBkYXRhIGlzIHByZS1leGlzdGluZyBlbmQgc3RhdGUsXG4gKiAgICAgICAgICAgICAgICAgIG5vdCBhIHN0cmVhbSBvZiB1c2VyIGV2ZW50cy5cbiAqICAgLSBgc2VlZFJlcGxheWAgc2tpcHMgdGhlIGBzdGF0ZV9tYWNoaW5lYCBlbnRyeS90cmFuc2l0aW9uIGd1YXJkcywgc28gYVxuICogICAgICAgICAgICAgICAgICBtaWQtbGlmZWN5Y2xlIHJvdyAoYSBgY2xvc2VkX3dvbmAgZGVhbCkgaXMgYWNjZXB0ZWQuXG4gKlxuICogTGlmZWN5Y2xlIEhPT0tTIFx1MjAxNCBkZXJpdmVkIGZpZWxkcywgZGVmYXVsdHMsIHZhbGlkYXRpb24gXHUyMDE0IHN0aWxsIHJ1bi4gVGhlIGJvb3RcbiAqIGxvZyBzaG93cyB0aGVtIGZpcmluZyAoYG9wcG9ydHVuaXR5X2Ftb3VudF9yb2xsdXBgLCBgcXVvdGVfdG90YWxfcm9sbHVwYCksXG4gKiBhbmQgYGNybV9hY2NvdW50LmJpbGxpbmdfY291bnRyeWAgLyBgY3JtX2FjY291bnQudGVycml0b3J5YCBhcmUgb25seSBldmVyXG4gKiBwb3B1bGF0ZWQgYmVjYXVzZSBgYWNjb3VudF9wcm90ZWN0aW9uYCBkZXJpdmVzIHRoZW0gZnJvbSBgYmlsbGluZ19hZGRyZXNzYFxuICogb24gdGhlIHNlZWQgaW5zZXJ0ICgjNjM4LCAjNjM5KS4gYHRlc3QvdGVycml0b3J5LXNlZWQtY292ZXJhZ2UudGVzdC50c2AgcGlucyB0aGF0IGRlcGVuZGVuY3kuXG4gKlxuICogIyMjIFdoYXQgdGhhdCBtZWFucyBmb3IgYXV0aG9yaW5nXG4gKlxuICogVGhlIG9sZCBjb25jbHVzaW9uIHN1cnZpdmVzIHRoZSBjb3JyZWN0ZWQgcHJlbWlzZSwgYW5kIGlzIHN0aWxsIHRoZSBydWxlOlxuICpcbiAqIDEuIFNlZWRpbmcgaGlzdG9yaWNhbCB2YWx1ZXMgaW50byByZWFkb25seSBmaWVsZHMgKGBzdGFnZV9lbnRyeV9kYXRlYCxcbiAqICAgIGBsYXN0X2NvbnRhY3RlZF9kYXRlYCwgYGFjdHVhbF9yZXZlbnVlYCwgYW5kIHRoZSBwbGF0Zm9ybSdzIG93blxuICogICAgYGNyZWF0ZWRfYXRgIFx1MjAxNCB3aGljaCB0aGUgY2FzZSBzZWVkcyBhdXRob3Igc2luY2UgIzE5OTIpIGlzIGxlZ2l0aW1hdGVcbiAqICAgIGFuZCBsb2FkLWJlYXJpbmcgXHUyMDE0IGl0IGlzIHRoZSBvbmx5IHdheSBkZW1vIHJlcG9ydHMgZ2V0IGhpc3RvcnkgXHUyMDE0IGFuZCB0aGVcbiAqICAgIHBsYXRmb3JtIGV4cGxpY2l0bHkgcHJlc2VydmVzIGV4cGxpY2l0IHNlZWQgdmFsdWVzIChgY3JlYXRlZF9hdGAgb24gdGhlXG4gKiAgICBmaXJzdCBpbnNlcnQgc2luY2UgQG9iamVjdHN0YWNrL29iamVjdHFsIDE3LjcuMCwgb2JqZWN0c3RhY2sjMjE2NDYpLlxuICogMi4gRXZlcnkgc2VlZGVkIHZhbHVlIG9mIGEgaG9vay1vd25lZCBmaWVsZCBNVVNUIGVxdWFsIHdoYXQgdGhlIGhvb2sgd291bGRcbiAqICAgIGNvbXB1dGUgKGBpc19jbG9zZWRgIFx1MjFENCBzdGF0dXMsIGByZXNvbHV0aW9uX3RpbWVfaG91cnNgIFx1MjFENCBjbG9zZWRcdTIyMTJjcmVhdGVkLFxuICogICAgb3Bwb3J0dW5pdHkgYHByb2JhYmlsaXR5YC9gZm9yZWNhc3RfY2F0ZWdvcnlgL2BleHBlY3RlZF9yZXZlbnVlYCBcdTIxRDQgc3RhZ2UsXG4gKiAgICBmb3JlY2FzdCBgcGVyaW9kX2xhYmVsYCBcdTIxRDQgcGVyaW9kX3N0YXJ0KS4gVW5kZXIgdGhlIGNvcnJlY3RlZCBwcmVtaXNlIGFcbiAqICAgIG1pc21hdGNoIGlzIHJld3JpdHRlbiBpbW1lZGlhdGVseSwgYXQgc2VlZCB0aW1lLCBpbnN0ZWFkIG9mIG9uIHRoZSBmaXJzdFxuICogICAgdXNlciBlZGl0IFx1MjAxNCBlaXRoZXIgd2F5IHRoZSBkZW1vIGRvZXMgbm90IHNob3cgd2hhdCB3YXMgYXV0aG9yZWQuXG4gKiAzLiBBIGZpZWxkIHRoZSBob29rIERFUklWRVMgYW5kIHRoZSBzY2hlbWEgbWFya3MgYHJlYWRvbmx5YCBpcyBub3QgYXV0aG9yZWRcbiAqICAgIGhlcmUgYXQgYWxsIChgY3JtX2FjY291bnQuYmlsbGluZ19jb3VudHJ5YCwgYGNybV9hY2NvdW50LnRlcnJpdG9yeWApOlxuICogICAgZHVwbGljYXRpbmcgaXQgd291bGQgY3JlYXRlIGEgc2Vjb25kIHNvdXJjZSBvZiB0cnV0aCBmb3IgYSB2YWx1ZSB0aGUgaG9va1xuICogICAgYWxyZWFkeSBvd25zLlxuICpcbiAqIEF1dG9udW1iZXIgZmllbGRzIChgY2FzZV9udW1iZXJgLCBgY29udHJhY3RfbnVtYmVyYCwgYHF1b3RlX251bWJlcmApIGFyZVxuICogTkVWRVIgc2VlZGVkOiB0aGUgcnVudGltZSBvd25zIHRob3NlIHNlcXVlbmNlcyAodGhlIFNRTCBkcml2ZXIgYm9vdHN0cmFwc1xuICogZWFjaCBjb3VudGVyIHBhc3QgZXhpc3Rpbmcgcm93cyksIHNvIGhhbmQtbnVtYmVyaW5nIHRoZW0gb25seSBpbnZpdGVzXG4gKiBkcmlmdC4gVXBzZXJ0IGlkZW50aXR5IHVzZXMgYSBuYXR1cmFsIGtleSBpbnN0ZWFkIChzdWJqZWN0IC8gbmFtZSAvXG4gKiBkZXNjcmlwdGlvbikuXG4gKi9cblxuLyoqXG4gKiBCdWlsZCBhIENFTCBgZGF5c0FnbyhOKWAgZXhwcmVzc2lvbiBmcm9tIGEgcnVudGltZSBudW1iZXIuIE1pcnJvcnMgdGhlXG4gKiBleGlzdGluZyB0YWdnZWQtdGVtcGxhdGUgdXNhZ2UgKGBjZWxcXGBkYXlzQWdvKE4pXFxgYCkgc28gd2UgY2FuIHByb2R1Y2VcbiAqIHRpbWVzdGFtcHMgaW5zaWRlIGAubWFwKClgIGdlbmVyYXRvcnMgd2l0aG91dCBtYW51ZmFjdHVyaW5nIGZha2UgdGVtcGxhdGVcbiAqIHN0cmluZyBhcnJheXMuXG4gKi9cbmV4cG9ydCBjb25zdCBjZWxEYXlzQWdvID0gKG46IG51bWJlcikgPT4gY2VsYGRheXNBZ28oJHtufSlgO1xuZXhwb3J0IGNvbnN0IGNlbERheXNGcm9tTm93ID0gKG46IG51bWJlcikgPT4gY2VsYGRheXNGcm9tTm93KCR7bn0pYDtcblxuLyoqXG4gKiBBIGNvbmZpZ3VyZWQgcHJvZHVjdCBsaW5lLiBgdW5pdF9wcmljZWAgaXMgdGhlIE5FR09USUFURUQgcHJpY2UgKHdoYXQgdGhlXG4gKiByZXAgc29sZCBhdCk7IHRoZSBjYXRhbG9nIGBsaXN0X3ByaWNlYCBpcyBzdGFtcGVkIHNlcGFyYXRlbHkgZnJvbSB0aGVcbiAqIHByb2R1Y3QgcmVjb3JkLCBleGFjdGx5IGFzIHRoZSBwcmljZS1maWxsIGhvb2sgd291bGQuXG4gKi9cbmV4cG9ydCB0eXBlIExpbmVTcGVjID0ge1xuICByZWFkb25seSBwcm9kdWN0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1YW50aXR5OiBudW1iZXI7XG4gIHJlYWRvbmx5IHVuaXRfcHJpY2U6IG51bWJlcjtcbiAgLyoqIExpbmUtbGV2ZWwgZGlzY291bnQgJSwgZGVmYXVsdHMgdG8gMC4gKi9cbiAgcmVhZG9ubHkgZGlzY291bnQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59O1xuXG4vKiogYHF1YW50aXR5IFx1MDBENyB1bml0X3ByaWNlIFx1MDBENyAoMSBcdTIyMTIgZGlzY291bnQvMTAwKWAsIHJvdW5kZWQgZXhhY3RseSBhcyB0aGUgcm9sbHVwIGhvb2tzIHJvdW5kLiAqL1xuZXhwb3J0IGNvbnN0IGxpbmVUb3RhbCA9IChsOiBMaW5lU3BlYyk6IG51bWJlciA9PlxuICBNYXRoLnJvdW5kKGwucXVhbnRpdHkgKiBsLnVuaXRfcHJpY2UgKiAoMSAtIChsLmRpc2NvdW50ID8/IDApIC8gMTAwKSAqIDEwMCkgLyAxMDA7XG5cbmV4cG9ydCBjb25zdCBsaW5lc1RvdGFsID0gKGxpbmVzOiByZWFkb25seSBMaW5lU3BlY1tdKTogbnVtYmVyID0+XG4gIE1hdGgucm91bmQobGluZXMucmVkdWNlKChzdW0sIGwpID0+IHN1bSArIGxpbmVUb3RhbChsKSwgMCkgKiAxMDApIC8gMTAwO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YS9hY3Rpdml0eS5zZWVkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGFcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YS9hY3Rpdml0eS5zZWVkLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIEFjdGl2aXR5IHNlZWRzIFx1MjAxNCB0aGUgdGFzayBsaXN0IGFuZCB0aGUgaW50ZXJhY3Rpb24gbG9nLlxuICpcbiAqIGBjcm1fdGFza2AsIGBjcm1fZXZlbnRgIGFuZCBgY3JtX2V2ZW50X2F0dGVuZGVlYCBhcmUgdGhlIGFjdGl2aXR5IGxheWVyIG92ZXJcbiAqIGV2ZXJ5IG9iamVjdCBpbiB0aGUgYXBwIChhY2NvdW50cywgb3Bwb3J0dW5pdGllcyBBTkQgY2FzZXMpLCB3aGljaCBpcyB3aHlcbiAqIHBsYW4gaXRlbSA0IGZvbGRzIHRoZW0gaW50byB0aGUgYXBwIHBhY2thZ2UgcmF0aGVyIHRoYW4gZ2l2aW5nIGFjdGl2aXRpZXMgYVxuICogbW9kdWxlIG9mIHRoZWlyIG93bjogXCJhY3Rpdml0aWVzIGFyZSBhIGNyb3NzLWN1dHRpbmcgY2FwYWJpbGl0eSBubyBjdXN0b21lclxuICogYnV5cyBzZXBhcmF0ZWx5XCIuIFRoZWlyIHJvd3Mgd2VyZSBhdXRob3JlZCBpbiBgc3JjL2RhdGEvc2VydmljZS5zZWVkLnRzYCxcbiAqIGJlc2lkZSB0aGUgY2FzZXMgdGhleSBtb3N0IG9mdGVuIGhhbmcgb2ZmOyB0aG9zZSBjYXNlcyBhcmUgbm93XG4gKiBgc3JjL3NlcnZpY2UvZGF0YS9zZXJ2aWNlLnNlZWQudHNgIGFuZCBhcmUgcmVmZXJlbmNlZCBmcm9tIGhlcmUgYnkgbmF0dXJhbFxuICoga2V5IGV4YWN0bHkgYXMgYmVmb3JlLiBUaGUgY2FzZXMgYXJlIHJlZ2lzdGVyZWQgYnkgdGhlIHNlcnZpY2UgcGFja2FnZSBhbmRcbiAqIHRoZXNlIHJvd3MgYnkgdGhlIGFwcCBwYWNrYWdlOyBtZWFzdXJlZCBvbiBhIGZyZXNoIGJvb3Qgb2YgdGhlIHR3by1wYWNrYWdlXG4gKiBhcnRpZmFjdCAoIzE5MDcpLCBldmVyeSBzZWVkZWQgZXZlbnQncyBgcmVsYXRlZF90b19jYXNlYCByZXNvbHZlcyB0byBhIHJlYWxcbiAqIGNhc2UuXG4gKlxuICogU2VlZCBkb2N0cmluZSBsaXZlcyBpbiBgLi9fc2hhcmVkLnRzYC5cbiAqL1xuaW1wb3J0IHsgZGVmaW5lU2VlZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gJy4uL29iamVjdHMvdGFzay5vYmplY3QnO1xuaW1wb3J0IHsgRXZlbnQgfSBmcm9tICcuLi9vYmplY3RzL2V2ZW50Lm9iamVjdCc7XG5pbXBvcnQgeyBFdmVudEF0dGVuZGVlIH0gZnJvbSAnLi4vb2JqZWN0cy9ldmVudF9hdHRlbmRlZS5vYmplY3QnO1xuaW1wb3J0IHsgY2VsRGF5c0FnbyB9IGZyb20gJy4vX3NoYXJlZCc7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBUYXNrcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIFBvbHltb3JwaGljIHBhcmVudHMgbmVlZCBCT1RIIGhhbHZlczogYHJlbGF0ZWRfdG9fdHlwZWAgbmFtZXMgdGhlIHBhcmVudFxuLy8gb2JqZWN0IGFuZCB0aGUgbWF0Y2hpbmcgYHJlbGF0ZWRfdG9fKmAgbG9va3VwIGNhcnJpZXMgdGhlIHJlY29yZC4gVGhlXG4vLyBSZWxhdGVkIHRhYiBhbmQgdGFzay5ob29rJ3MgYWN0aXZpdHkgYnViYmxlIGtleSBvZmYgYHJlbGF0ZWRfdG9fdHlwZWAsIHNvIGFcbi8vIGxvb2t1cCB3aXRob3V0IGl0IGlzIGludmlzaWJsZSB0byBib3RoICgjNDkwKS5cbmV4cG9ydCBjb25zdCB0YXNrcyA9IGRlZmluZVNlZWQoVGFzaywge1xuICBtb2RlOiAndXBzZXJ0JyxcbiAgZXh0ZXJuYWxJZDogJ3N1YmplY3QnLFxuICByZWNvcmRzOiBbXG4gICAge1xuICAgICAgc3ViamVjdDogJ0ZvbGxvdyB1cCB3aXRoIEFjbWUgb24gcHJvcG9zYWwnLFxuICAgICAgZGVzY3JpcHRpb246ICdTZW5kIEpvcmRhbiBQYXJrIHRoZSByZXZpc2VkIEVudGVycHJpc2UgcHJvcG9zYWwgYW5kIGEgMzAtbWluIGNhbGVuZGFyIHNsb3QgdG8gd2FsayB0aHJvdWdoIHRoZSBBSSBnb3Zlcm5hbmNlIHNlY3Rpb24uJyxcbiAgICAgIHN0YXR1czogJ25vdF9zdGFydGVkJyxcbiAgICAgIHByaW9yaXR5OiAnaGlnaCcsXG4gICAgICBwcmlvcml0eV9yYW5rOiAzLFxuICAgICAgZHVlX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygyKWAsXG4gICAgICByZWxhdGVkX3RvX3R5cGU6ICdjcm1fb3Bwb3J0dW5pdHknLFxuICAgICAgcmVsYXRlZF90b19hY2NvdW50OiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICByZWxhdGVkX3RvX29wcG9ydHVuaXR5OiAnQWNtZSBQbGF0Zm9ybSBVcGdyYWRlJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIFRoZSB3b3Jrc2hvcCB0aGlzIHRhc2sgYXNrcyBzb21lb25lIHRvIGJvb2sgaXMgQUxSRUFEWSBvbiB0aGVcbiAgICAgIC8vIGNhbGVuZGFyOiB0aGUgYEFjbWUgXHUyMDE0IEFJIGFnZW50IGdvdmVybmFuY2Ugd29ya3Nob3BgIGV2ZW50IGxvd2VyIGluXG4gICAgICAvLyB0aGlzIGZpbGUgaXMgYHBsYW5uZWRgIGF0IGRheXNGcm9tTm93KDYpLCBhbmQgdGhlIGF0dGVuZGVlIGJ1aWxkZXJcbiAgICAgIC8vIGRhdGVzIGl0cyBpbnZpdGF0aW9uIGBkYXlzQWdvKG1heCgtNiArIGludml0ZWREYXlzQmVmb3JlKDkpLCAwKSlgID1cbiAgICAgIC8vIGRheXNBZ28oMykgXHUyMDE0IGFscmVhZHkgc2VudCwgYW5kIGFscmVhZHkgYW5zd2VyZWQgYHRlbnRhdGl2ZWAuIFNvIHRoZVxuICAgICAgLy8gYm9va2luZyB0YXNrIGlzIERPTkUsIGFuZCBpdCB3YXMgZG9uZSB0aGUgZGF5IHRoZSBpbnZpdGF0aW9uIHdlbnRcbiAgICAgIC8vIG91dC4gQW4gb3BlbiBcInNjaGVkdWxlIGl0XCIgdGFzayBiZXNpZGUgYSBib29rZWQtYW5kLWludml0ZWQgbWVldGluZ1xuICAgICAgLy8gaXMgdGhlIGNvbnRyYWRpY3Rpb24gaXRzZWxmLCBub3QgYSBkdWUgZGF0ZSB0byBudWRnZSAoIzE2NjApLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBFVkVOVCBvd25zIHRoZSB3b3Jrc2hvcCdzIGRhdGUuIE5vdGhpbmcgaGVyZSByZXN0YXRlcyBpdCBcdTIwMTQgYm90aFxuICAgICAgLy8gZGF0ZXMgYmVsb3cgZGVyaXZlIGZyb20gdGhlIGludml0YXRpb24gaW5zdGFudCBcdTIwMTQgc28gdGhlcmUgaXMgbm9cbiAgICAgIC8vIHNlY29uZCBjb3B5IHRvIGRyaWZ0IG91dCBvZiBzdGVwLlxuICAgICAgc3ViamVjdDogJ0FjbWUgXHUyMDE0IHNjaGVkdWxlIEFJIGdvdmVybmFuY2Ugd29ya3Nob3AnLFxuICAgICAgZGVzY3JpcHRpb246ICdCbG9jayBhIDkwLW1pbiBqb2ludCB3b3Jrc2hvcCB3aXRoIEFjbWVcdTIwMTlzIGNvbXBsaWFuY2UgdGVhbSB0byB3YWxrIHRocm91Z2ggaG93IEhvdENSTSBhZ2VudHMgaGFuZGxlIGRhdGEgc2NvcGluZywgUkJBQywgYXVkaXQgdHJhaWxzLCBhbmQgaHVtYW4taW4tdGhlLWxvb3AuIFByZS1yZWFkOiBBRFItMDAwNyArIHRoZSBnb3Zlcm5hbmNlIGRlbW8gZGVjay4nLFxuICAgICAgc3RhdHVzOiAnY29tcGxldGVkJyxcbiAgICAgIHByaW9yaXR5OiAnaGlnaCcsXG4gICAgICBwcmlvcml0eV9yYW5rOiAzLFxuICAgICAgZHVlX2RhdGU6IGNlbGBkYXlzQWdvKDMpYCxcbiAgICAgIGNvbXBsZXRlZF9kYXRlOiBjZWxgZGF5c0FnbygzKWAsXG4gICAgICAvLyBIb29rcyBkb24ndCBydW4gb3ZlciBzZWVkcyBcdTIwMTQgbWlycm9yIHdoYXQgdGFza19jb21wbGV0aW9uIHdvdWxkIHN0YW1wLlxuICAgICAgaXNfY29tcGxldGVkOiB0cnVlLFxuICAgICAgcHJvZ3Jlc3NfcGVyY2VudDogMTAwLFxuICAgICAgcmVsYXRlZF90b190eXBlOiAnY3JtX29wcG9ydHVuaXR5JyxcbiAgICAgIHJlbGF0ZWRfdG9fYWNjb3VudDogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgICAgcmVsYXRlZF90b19vcHBvcnR1bml0eTogJ0FjbWUgUGxhdGZvcm0gVXBncmFkZScsXG4gICAgfSxcbiAgICB7XG4gICAgICBzdWJqZWN0OiAnQWNtZSBcdTIwMTQgY2xvc2Ugb3V0IGxvZ2luLWlzc3VlcyB0aWNrZXQgYmVmb3JlIFNMQScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NvbmZpcm0gZW5naW5lZXJpbmcgaGFzIHRoZSBFTUVBIFNTTyBjbG9jay1za2V3IHBhdGNoIHJlYWR5LCBkZXBsb3kgdG8gQWNtZVx1MjAxOXMgdGVuYW50LCBhbmQgc2VuZCBMaXNhIEtpbSBhIGN1c3RvbWVyLWZhY2luZyBwb3N0LW1vcnRlbS4nLFxuICAgICAgc3RhdHVzOiAnaW5fcHJvZ3Jlc3MnLFxuICAgICAgcHJpb3JpdHk6ICd1cmdlbnQnLFxuICAgICAgcHJpb3JpdHlfcmFuazogNCxcbiAgICAgIGR1ZV9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMSlgLFxuICAgICAgcmVsYXRlZF90b190eXBlOiAnY3JtX2Nhc2UnLFxuICAgICAgcmVsYXRlZF90b19hY2NvdW50OiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICByZWxhdGVkX3RvX2Nhc2U6ICdMb2dpbiBpc3N1ZXMgYWZ0ZXIgcGxhdGZvcm0gdXBncmFkZScsXG4gICAgfSxcbiAgICB7XG4gICAgICBzdWJqZWN0OiAnU2NoZWR1bGUgZGVtbyBmb3IgR2xvYmV4IHRlYW0nLFxuICAgICAgc3RhdHVzOiAnaW5fcHJvZ3Jlc3MnLFxuICAgICAgcHJpb3JpdHk6ICdub3JtYWwnLFxuICAgICAgcHJpb3JpdHlfcmFuazogMixcbiAgICAgIGR1ZV9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coNSlgLFxuICAgICAgcmVsYXRlZF90b190eXBlOiAnY3JtX2FjY291bnQnLFxuICAgICAgcmVsYXRlZF90b19hY2NvdW50OiAnR2xvYmV4IEluZHVzdHJpZXMnLFxuICAgIH0sXG4gICAge1xuICAgICAgc3ViamVjdDogJ1ByZXBhcmUgY29udHJhY3QgZm9yIFdheW5lIEVudGVycHJpc2VzJyxcbiAgICAgIHN0YXR1czogJ25vdF9zdGFydGVkJyxcbiAgICAgIHByaW9yaXR5OiAndXJnZW50JyxcbiAgICAgIHByaW9yaXR5X3Jhbms6IDQsXG4gICAgICBkdWVfZGF0ZTogY2VsYGRheXNGcm9tTm93KDEpYCxcbiAgICAgIHJlbGF0ZWRfdG9fdHlwZTogJ2NybV9hY2NvdW50JyxcbiAgICAgIHJlbGF0ZWRfdG9fYWNjb3VudDogJ1dheW5lIEVudGVycHJpc2VzJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIHN1YmplY3Q6ICdTZW5kIHdlbGNvbWUgcGFja2FnZSB0byBTdGFyayBNZWRpY2FsJyxcbiAgICAgIHN0YXR1czogJ2NvbXBsZXRlZCcsXG4gICAgICBwcmlvcml0eTogJ2xvdycsXG4gICAgICBwcmlvcml0eV9yYW5rOiAxLFxuICAgICAgY29tcGxldGVkX2RhdGU6IGNlbGBkYXlzQWdvKDIpYCxcbiAgICAgIC8vIEhvb2tzIGRvbid0IHJ1biBvdmVyIHNlZWRzIFx1MjAxNCBtaXJyb3Igd2hhdCB0YXNrX2NvbXBsZXRpb24gd291bGQgc3RhbXAuXG4gICAgICBpc19jb21wbGV0ZWQ6IHRydWUsXG4gICAgICBwcm9ncmVzc19wZXJjZW50OiAxMDAsXG4gICAgICByZWxhdGVkX3RvX3R5cGU6ICdjcm1fYWNjb3VudCcsXG4gICAgICByZWxhdGVkX3RvX2FjY291bnQ6ICdTdGFyayBNZWRpY2FsJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIC8vIEludGVybmFsIGhvdXNla2VlcGluZyB0YXNrIFx1MjAxNCBkZWxpYmVyYXRlbHkgdW5wYXJlbnRlZCAodGhlXG4gICAgICAvLyByZWxhdGVkX3RvX3JlcXVpcmVkIHJ1bGUgaXMgYSB3YXJuaW5nLCBub3QgYW4gZXJyb3IpLlxuICAgICAgc3ViamVjdDogJ1VwZGF0ZSBDUk0gcGlwZWxpbmUgcmVwb3J0JyxcbiAgICAgIHN0YXR1czogJ25vdF9zdGFydGVkJyxcbiAgICAgIHByaW9yaXR5OiAnbm9ybWFsJyxcbiAgICAgIHByaW9yaXR5X3Jhbms6IDIsXG4gICAgICBkdWVfZGF0ZTogY2VsYGRheXNGcm9tTm93KDcpYCxcbiAgICB9LFxuICBdXG59KTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEV2ZW50cyAmIGF0dGVuZGVlczogdGhlIGludGVyYWN0aW9uIGxvZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vXG4vLyAjNTkyIHNoaXBwZWQgdGhlIGFjdGl2aXR5IG1vZGVsIFx1MjAxNCBgY3JtX2V2ZW50YCwgYGNybV9ldmVudF9hdHRlbmRlZWAsIHRoZVxuLy8gcGVyLW9iamVjdCBsb2cvc2NoZWR1bGUgYWN0aW9ucywgdGhlIGBldmVudF9tZXRyaWNzYCBjdWJlIGFuZCB0aGUgU2FsZXNcbi8vIEFjdGl2aXR5IGRhc2hib2FyZCBcdTIwMTQgYW5kIGRlbGliZXJhdGVseSBsZWZ0IHRoZSBkZW1vIHJvd3MgdG8gdGhpcyBpc3N1ZVxuLy8gKCM2NzEpLiBVbnRpbCBub3cgdGhlIGRlbW8gYm9vdGVkIHdpdGggdGhlIHdob2xlIG1vZGVsIGluc3RhbGxlZCBhbmQgbm90IG9uZVxuLy8gcm93IGluIGl0OiBldmVyeSB3aWRnZXQgb24gdGhhdCBkYXNoYm9hcmQgcmVhZCAwLCB0aGUgY2FsZW5kYXIgYW5kXG4vLyBpbnRlcmFjdGlvbi1oaXN0b3J5IHZpZXdzIHdlcmUgZW1wdHksIGFuZCB0aGUgdGhyZWUgY2h1cm4gdGlsZXMgaGFkIG5vdGhpbmdcbi8vIHRvIHN0cmF0aWZ5LlxuLy9cbi8vICMgVGltZSBpcyBhdXRob3JlZCBpbiBDRUwsIG5ldmVyIGluIFR5cGVTY3JpcHRcbi8vXG4vLyBgc3RhcnRfZGF0ZXRpbWVgIC8gYGVuZF9kYXRldGltZWAgYXJlIGBjZWxgIGV4cHJlc3Npb25zXG4vLyAoYGRheXNBZ28oMTIpICsgZHVyYXRpb24oXCI5aDBtXCIpYCksIHJlc29sdmVkIGJ5IHRoZSBzZWVkIGxvYWRlciBhdCBCT09ULlxuLy8gUGxhaW4tVFMgZGF0ZXMgd291bGQgZnJlZXplIGludG8gYGRpc3Qvb2JqZWN0c3RhY2suanNvbmAgYXQgQlVJTEQgdGltZSwgYW5kIGFcbi8vIHB1Ymxpc2hlZCBhcnRpZmFjdCB3b3VsZCBzaGlwIGEgY2FsZW5kYXIgdGhhdCBhZ2VzIG91dCBcdTIwMTQgdGhlIHNhbWUgaGF6YXJkXG4vLyBgdGVzdC9hbmFseXRpY3MtaW50ZWdyaXR5LnRlc3QudHNgIGd1YXJkcyBvbiByZXBvcnQgZmlsdGVycy4gYGRheXNBZ28oKWBcbi8vIGFsb25lIHJldHVybnMgVVRDIG1pZG5pZ2h0LCB3aGljaCBpcyB3aHkgdGhlIGR1cmF0aW9uIHRlcm0gaXMgdGhlcmU6IGFcbi8vIGNhbGVuZGFyIG9iamVjdCB3aG9zZSBldmVyeSByb3cgc3RhcnRzIGF0IDAwOjAwIGlzIGEgY2FsZW5kYXIgbm9ib2R5IHdvdWxkXG4vLyBkZW1vLlxuLy9cbi8vICMgQSBgaGVsZGAgZXZlbnQgc3RhbXBzIFRPREFZIG9uIGl0cyBhY2NvdW50IFx1MjAxNCB0aGF0IGlzIHRoZSB3aG9sZSBsYXlvdXQgcnVsZVxuLy9cbi8vIExpZmVjeWNsZSBob29rcyBydW4gb3ZlciBzZWVkIHdyaXRlcyAoIzYxNyksIHNvIGBldmVudF9hY3Rpdml0eV9idWJibGVgIGZpcmVzXG4vLyBvbiB0aGVzZSBpbnNlcnRzIGFuZCBzdGFtcHMgYGNybV9hY2NvdW50Lmxhc3RfYWN0aXZpdHlfZGF0ZWAgL1xuLy8gYGNybV9jb250YWN0Lmxhc3RfY29udGFjdGVkX2RhdGVgIC8gYGNybV9sZWFkLmxhc3RfY29udGFjdGVkX2RhdGVgIHdpdGggdGhlXG4vLyBTRUVEIE1PTUVOVCBcdTIwMTQgbm90IHdpdGggdGhlIGV2ZW50J3Mgb3duIHRpbWVzdGFtcC4gTm90aGluZyBoZXJlIGNhbiBtYWtlIGFuXG4vLyBhY2NvdW50IGxvb2sgcXVpZXQgQU5EIGdpdmUgaXQgYSBoZWxkIGludGVyYWN0aW9uOyB0aGUgdHdvIGFyZSB0aGUgc2FtZVxuLy8gY29sdW1uLiBTbyB0aGUgcXVpZXQgYWNjb3VudHMgb2YgYHNhbGVzLnNlZWQudHNgIGNhcnJ5IG9ubHkgYHBsYW5uZWRgLFxuLy8gYGNhbmNlbGxlZGAgYW5kIGBub19zaG93YCByb3dzLCBub25lIG9mIHdoaWNoIGJ1YmJsZSwgYW5kIHRoZSBhY2NvdW50cyB0aGF0XG4vLyBkbyBjYXJyeSBoZWxkIHJvd3MgYXJlIGF1dGhvcmVkIGF0IGB0b2RheSgpYCB0aGVyZS4gVGhlIGxvbmcgbm90ZSBiZXNpZGUgdGhlXG4vLyBhY2NvdW50IHJlY29yZHMgc3RhdGVzIHRoZSBib3VuZGFyeTsgYHRlc3QvYWN0aXZpdHktc2VlZC1jb3ZlcmFnZS50ZXN0LnRzYFxuLy8gcmVjb21wdXRlcyB0aGUgYnViYmxlJ3Mgb3duIHJlYWNoYWJpbGl0eSBvdmVyIHRoZXNlIHJvd3MgYW5kIGZhaWxzIGlmIGEgaGVsZFxuLy8gZXZlbnQgZXZlciByZWFjaGVzIGFuIGFjY291bnQgdGhlIGNodXJuIHRpbGVzIGRlcGVuZCBvbi5cbi8vXG4vLyAjIFVwc2VydCBpZGVudGl0eSBpcyBgc3ViamVjdGBcbi8vXG4vLyBTYW1lIGNob2ljZSBhcyBgY3JtX3Rhc2tgIGFuZCBgY3JtX2Nhc2VgIGFib3ZlLCBhbmQgaXQgY2FycmllcyB0aGUgc2FtZSBrbm93blxuLy8gY29zdDogYSB1c2VyIHdobyBsb2dzIGFuIGludGVyYWN0aW9uIHVuZGVyIGEgc3ViamVjdCB0aGlzIGZpbGUgYWxzbyB1c2VzXG4vLyB3b3VsZCBoYXZlIHRoZWlyIHJvdyBhZG9wdGVkIChhbmQgb3ZlcndyaXR0ZW4pIGJ5IHRoZSBuZXh0IHJlLXNlZWQuIFRoZVxuLy8gZm9yZWNhc3Qgc2VlZHMgZXNjYXBlIHRoYXQgd2l0aCBhIGRlZGljYXRlZCBgc2VlZF9rZXlgIGNvbHVtbiAoIzYxMyksIHdoaWNoXG4vLyBpcyBhbiBPQkpFQ1QgY2hhbmdlIGFuZCBvdXQgb2YgdGhpcyBpc3N1ZSdzIHNjb3BlOyB0aGUgc3ViamVjdHMgYmVsb3cgYXJlXG4vLyBsb25nIGFuZCBhY2NvdW50LXNwZWNpZmljIHNvIHRoZSBjb2xsaXNpb24gbmVlZHMgZGVsaWJlcmF0ZSBlZmZvcnQsIGFuZCB0aGVcbi8vIHR3byBhY3Rpdml0eS1zaGFwZWQgb2JqZWN0cyB0aGF0IGNhbWUgYmVmb3JlIGFscmVhZHkgYWNjZXB0IHRoZSBzYW1lIHRyYWRlLlxuLy8gTm8gY29sbGlzaW9uIGV4aXN0cyB3aXRoIHRoZSBydW50aW1lIHdyaXRlcidzIG93biByb3dzOiBgbG9nX2NhbGxgIC9cbi8vIGBsb2dfbWVldGluZ2AgLyBgc2NoZWR1bGVfbWVldGluZ2AgaW5zZXJ0IHdpdGggYW4gZXhwbGljaXQgYG93bmVyX2lkYFxuLy8gKGBzcmMvc2FsZXMvYWN0aW9ucy9hY3Rpdml0eS1hY3Rpb25zLnRzYCksIHNvIHRoZXkgYXJlIG5ldmVyIG93bmVybGVzcyBhbmQgdGhlXG4vLyBwbGF0Zm9ybSdzIHNlZWQtb3duZXJzaGlwIGNsYWltIG5ldmVyIHRvdWNoZXMgdGhlbSBcdTIwMTQgdGhlIFwib25lIHByb2R1Y2VyIHBlclxuLy8gd2luZG93XCIgcXVlc3Rpb24gIzcwMiByYWlzZWQsIGFuc3dlcmVkIGZvciB0aGlzIG9iamVjdC5cblxuLyoqIFdoaWNoIGByZWxhdGVkX3RvXypgIGxvb2t1cCBjYXJyaWVzIGVhY2ggYHJlbGF0ZWRfdG9fdHlwZWAuICovXG5jb25zdCBFVkVOVF9SRUxBVEVEX0ZJRUxEID0ge1xuICBjcm1fYWNjb3VudDogJ3JlbGF0ZWRfdG9fYWNjb3VudCcsXG4gIGNybV9jb250YWN0OiAncmVsYXRlZF90b19jb250YWN0JyxcbiAgY3JtX29wcG9ydHVuaXR5OiAncmVsYXRlZF90b19vcHBvcnR1bml0eScsXG4gIGNybV9sZWFkOiAncmVsYXRlZF90b19sZWFkJyxcbiAgY3JtX2Nhc2U6ICdyZWxhdGVkX3RvX2Nhc2UnLFxufSBhcyBjb25zdDtcblxudHlwZSBFdmVudFJlbGF0ZWRUeXBlID0ga2V5b2YgdHlwZW9mIEVWRU5UX1JFTEFURURfRklFTEQ7XG5cbnR5cGUgQXR0ZW5kZWVTcGVjID0ge1xuICAvKiogQ29udGFjdCBlbWFpbCBcdTIwMTQgdGhlIGNvbnRhY3QgZGF0YXNldCdzIGV4dGVybmFsSWQuIEV4Y2x1c2l2ZSB3aXRoIGBsZWFkYC4gKi9cbiAgcmVhZG9ubHkgY29udGFjdD86IHN0cmluZztcbiAgLyoqIExlYWQgZW1haWwgXHUyMDE0IHRoZSBsZWFkIGRhdGFzZXQncyBleHRlcm5hbElkLiAqL1xuICByZWFkb25seSBsZWFkPzogc3RyaW5nO1xuICByZWFkb25seSByZXNwb25zZTogJ2FjY2VwdGVkJyB8ICdkZWNsaW5lZCcgfCAndGVudGF0aXZlJyB8ICdub19yZXNwb25zZSc7XG59O1xuXG50eXBlIEV2ZW50U3BlYyA9IHtcbiAgcmVhZG9ubHkgc3ViamVjdDogc3RyaW5nO1xuICByZWFkb25seSB0eXBlOiAnbWVldGluZycgfCAnY2FsbCcgfCAnZGVtbycgfCAnd2ViaW5hcicgfCAnb25zaXRlX3Zpc2l0JyB8ICdvdGhlcic7XG4gIHJlYWRvbmx5IHN0YXR1czogJ2hlbGQnIHwgJ3BsYW5uZWQnIHwgJ2NhbmNlbGxlZCcgfCAnbm9fc2hvdyc7XG4gIC8qKiBEYXlzIGJlZm9yZSBib290LiBORUdBVElWRSBtZWFucyB0aGF0IG1hbnkgZGF5cyBBRlRFUiBib290LiAqL1xuICByZWFkb25seSBkYXlzQWdvOiBudW1iZXI7XG4gIC8qKiBVVEMgd2FsbCBjbG9jayB0aGUgc2xvdCBvcGVucyBhdDogYFtob3VyLCBtaW51dGVdYC4gKi9cbiAgcmVhZG9ubHkgYXQ6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl07XG4gIC8qKiBTbG90IGxlbmd0aCBpbiBtaW51dGVzIFx1MjAxNCB0aGUgZ2FwIGJldHdlZW4gc3RhcnQgYW5kIGVuZCBvbiB0aGUgY2FsZW5kYXIuICovXG4gIHJlYWRvbmx5IG1pbnV0ZXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcmVsYXRlZFR5cGU6IEV2ZW50UmVsYXRlZFR5cGU7XG4gIC8qKiBOYXR1cmFsIGtleSBvZiB0aGUgcmVsYXRlZCByZWNvcmQgKHRoYXQgZGF0YXNldCdzIGV4dGVybmFsSWQpLiAqL1xuICByZWFkb25seSByZWxhdGVkS2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBY2NvdW50IG5hdHVyYWwga2V5LCB3aGVuIHRoZSByZWxhdGVkIHJlY29yZCBoYW5ncyBvZmYgb25lLiBBdXRob3JlZCBvbiB0aGVcbiAgICogZXZlbnQgYXMgd2VsbCBhcyBpbXBsaWVkIHRocm91Z2ggdGhlIHBhcmVudCBcdTIwMTQgc2FtZSBzaGFwZSB0aGUgdGFzayBzZWVkc1xuICAgKiB1c2UsIGFuZCBpdCBpcyB3aGF0IHB1dHMgdGhlIHJvdyBpbiB0aGUgQUNDT1VOVCdzIGFjdGl2aXR5IHJlbGF0ZWQgbGlzdC5cbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogc3RyaW5nO1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcmVhZG9ubHkgb3V0Y29tZT86IHN0cmluZztcbiAgcmVhZG9ubHkgYXR0ZW5kZWVzOiByZWFkb25seSBBdHRlbmRlZVNwZWNbXTtcbiAgLyoqIERheXMgYmVmb3JlIHRoZSBldmVudCB0aGUgaW52aXRhdGlvbiB3ZW50IG91dC4gRGVmYXVsdHMgdG8gMy4gKi9cbiAgcmVhZG9ubHkgaW52aXRlZERheXNCZWZvcmU/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIEEgd2FsbC1jbG9jayBpbnN0YW50IG9uIGEgZGF5IHJlbGF0aXZlIHRvIHRoZSBib290IGRhdGUuXG4gKlxuICogYGRheXNBZ28obilgIC8gYGRheXNGcm9tTm93KG4pYCBib3RoIHJldHVybiBVVEMgbWlkbmlnaHQgb2YgdGhhdCBjYWxlbmRhclxuICogZGF5LCBhbmQgQ0VMIHRpbWVzdGFtcCArIGR1cmF0aW9uIGFyaXRobWV0aWMgaXMgd2hhdCBwdXRzIGEgcmVhbCB0aW1lIG9uIGl0LlxuICovXG5jb25zdCBjZWxDbG9jayA9IChkYXlzQWdvOiBudW1iZXIsIGhvdXI6IG51bWJlciwgbWludXRlOiBudW1iZXIpID0+IHtcbiAgY29uc3QgY2xvY2sgPSBgJHtob3VyfWgke21pbnV0ZX1tYDtcbiAgcmV0dXJuIGRheXNBZ28gPj0gMFxuICAgID8gY2VsYGRheXNBZ28oJHtkYXlzQWdvfSkgKyBkdXJhdGlvbigke2Nsb2NrfSlgXG4gICAgOiBjZWxgZGF5c0Zyb21Ob3coJHstZGF5c0Fnb30pICsgZHVyYXRpb24oJHtjbG9ja30pYDtcbn07XG5cbi8qKlxuICogVGhlIGludGVyYWN0aW9uIGxvZy5cbiAqXG4gKiBgaGVsZGAgcm93cyBzcGFuIGFsbCBmaXZlIGByZWxhdGVkX3RvX3R5cGVgIHZhbHVlcyBhbmQgZml2ZSBvZiB0aGUgc2l4XG4gKiBgdHlwZWAgdmFsdWVzIGFjcm9zcyByb3VnaGx5IG5pbmUgd2Vla3MsIGJlY2F1c2UgdGhhdCBpcyB3aGF0IHRoZSBTYWxlc1xuICogQWN0aXZpdHkgZGFzaGJvYXJkIHJlYWRzOiB0aGUgbWl4IGRvbnV0IGdyb3VwcyBieSBgdHlwZWAsIHRoZSBcIndoZXJlIHRoZVxuICogYWN0aXZpdHkgbGFuZHNcIiBiYXIgZ3JvdXBzIGJ5IGByZWxhdGVkX3RvX3R5cGVgLCBhbmQgdGhlIHZvbHVtZSBhcmVhIGNoYXJ0XG4gKiBidWNrZXRzIGBzdGFydF9kYXRldGltZWAgYnkgd2Vlay4gQSBibG9jayBvZiByb3dzIGluIG9uZSB3ZWVrIG9uIG9uZSBwYXJlbnRcbiAqIHdvdWxkIGxpZ2h0IGV2ZXJ5IHdpZGdldCB1cCB3aGlsZSBwcm92aW5nIG5vbmUgb2YgdGhlbS5cbiAqL1xuY29uc3QgRVZFTlRfU1BFQ1M6IHJlYWRvbmx5IEV2ZW50U3BlY1tdID0gW1xuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgQWNtZSBDb3Jwb3JhdGlvbiBcdTIwMTQgdGhlIGhlcm8gYWNjb3VudCwgd29ya2VkIGFjcm9zcyBldmVyeSBwYXJlbnQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIHtcbiAgICBzdWJqZWN0OiAnQWNtZSBcdTIwMTQgRW50ZXJwcmlzZSBlZGl0aW9uIHdhbGt0aHJvdWdoJyxcbiAgICB0eXBlOiAnZGVtbycsIHN0YXR1czogJ2hlbGQnLCBkYXlzQWdvOiAyLCBhdDogWzEwLCAwXSwgbWludXRlczogNjAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fb3Bwb3J0dW5pdHknLCByZWxhdGVkS2V5OiAnQWNtZSBQbGF0Zm9ybSBVcGdyYWRlJywgYWNjb3VudDogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgIGxvY2F0aW9uOiAnWm9vbScsXG4gICAgb3V0Y29tZTogJ1dhbGtlZCB0aGUgT3BzIHRlYW0gdGhyb3VnaCBhZ2VudCBnb3Zlcm5hbmNlIGFuZCB0aGUgYW5hbHl0aWNzIHNlYXRzLiBSZXZpc2VkIHByb3Bvc2FsIHRvIGZvbGxvdyB0aGlzIHdlZWsuJyxcbiAgICBhdHRlbmRlZXM6IFt7IGNvbnRhY3Q6ICdqb2huLnNtaXRoQGFjbWUuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdBY21lIFx1MjAxNCBwcm9wb3NhbCBmb2xsb3ctdXAgY2FsbCcsXG4gICAgdHlwZTogJ2NhbGwnLCBzdGF0dXM6ICdoZWxkJywgZGF5c0FnbzogNSwgYXQ6IFsxNSwgMzBdLCBtaW51dGVzOiAyNSxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9jb250YWN0JywgcmVsYXRlZEtleTogJ2pvaG4uc21pdGhAYWNtZS5leGFtcGxlLmNvbScsIGFjY291bnQ6ICdBY21lIENvcnBvcmF0aW9uJyxcbiAgICBvdXRjb21lOiAnUHJvY3VyZW1lbnQgd2FudHMgYW4gMTgtbW9udGggdGVybS4gUHJpY2luZyB0byBiZSByZS1jdXQgYmVmb3JlIHRoZSBnb3Zlcm5hbmNlIHdvcmtzaG9wLicsXG4gICAgYXR0ZW5kZWVzOiBbeyBjb250YWN0OiAnam9obi5zbWl0aEBhY21lLmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdhY2NlcHRlZCcgfV0sXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnQWNtZSBcdTIwMTQgQUkgZ292ZXJuYW5jZSBzY29waW5nIHNlc3Npb24nLFxuICAgIHR5cGU6ICdtZWV0aW5nJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDEyLCBhdDogWzksIDBdLCBtaW51dGVzOiA5MCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9hY2NvdW50JywgcmVsYXRlZEtleTogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgIGxvY2F0aW9uOiAnR29vZ2xlIE1lZXQnLFxuICAgIG91dGNvbWU6ICdBZ3JlZWQgdGhlIHdvcmtzaG9wIGFnZW5kYTogZGF0YSBzY29waW5nLCBSQkFDLCBhdWRpdCB0cmFpbHMsIGh1bWFuLWluLXRoZS1sb29wLicsXG4gICAgYXR0ZW5kZWVzOiBbeyBjb250YWN0OiAnam9obi5zbWl0aEBhY21lLmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdhY2NlcHRlZCcgfV0sXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnQWNtZSBcdTIwMTQgbG9naW4gaW5jaWRlbnQgc3RhdHVzIGNhbGwnLFxuICAgIHR5cGU6ICdjYWxsJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDE2LCBhdDogWzgsIDMwXSwgbWludXRlczogMjAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fY2FzZScsIHJlbGF0ZWRLZXk6ICdMb2dpbiBpc3N1ZXMgYWZ0ZXIgcGxhdGZvcm0gdXBncmFkZScsIGFjY291bnQ6ICdBY21lIENvcnBvcmF0aW9uJyxcbiAgICBvdXRjb21lOiAnQ29uZmlybWVkIHRoZSBFTUVBIFNTTyBjbG9jay1za2V3IGh5cG90aGVzaXM7IGVuZ2luZWVyaW5nIHJlcHJvZHVjaW5nIGluIHN0YWdpbmcuJyxcbiAgICBhdHRlbmRlZXM6IFt7IGNvbnRhY3Q6ICdqb2huLnNtaXRoQGFjbWUuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdBY21lIFx1MjAxNCByZW5ld2FsIHNpZ25hdHVyZSByZXZpZXcnLFxuICAgIHR5cGU6ICdtZWV0aW5nJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDIwLCBhdDogWzE0LCAwXSwgbWludXRlczogNDUsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fb3Bwb3J0dW5pdHknLCByZWxhdGVkS2V5OiAnQWNtZSBBbm51YWwgUmVuZXdhbCAyMDI1JywgYWNjb3VudDogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgIG91dGNvbWU6ICdTaWduZWQgdHdvIHdlZWtzIGFoZWFkIG9mIHRoZSByZW5ld2FsIGRhdGUuIE11bHRpLXllYXIgZGVmZXJyZWQgdG8gdGhlIHVwZ3JhZGUgZGVjaXNpb24uJyxcbiAgICBhdHRlbmRlZXM6IFt7IGNvbnRhY3Q6ICdqb2huLnNtaXRoQGFjbWUuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdBY21lIFx1MjAxNCBTYW4gRnJhbmNpc2NvIEhRIGJ1c2luZXNzIHJldmlldycsXG4gICAgdHlwZTogJ29uc2l0ZV92aXNpdCcsIHN0YXR1czogJ2hlbGQnLCBkYXlzQWdvOiAzMywgYXQ6IFsxMywgMF0sIG1pbnV0ZXM6IDEyMCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9hY2NvdW50JywgcmVsYXRlZEtleTogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgIGxvY2F0aW9uOiAnNTAwIEhvd2FyZCBTdHJlZXQsIFN1aXRlIDQwMCwgU2FuIEZyYW5jaXNjbycsXG4gICAgb3V0Y29tZTogJ1F1YXJ0ZXJseSByZXZpZXcgd2l0aCB0aGUgQ1RPIG9yZy4gRXhwYW5zaW9uIGludG8gdGhlIEVNRUEgdGVhbSBjb25maXJtZWQgYXMgdGhlIG5leHQgbW90aW9uLicsXG4gICAgYXR0ZW5kZWVzOiBbeyBjb250YWN0OiAnam9obi5zbWl0aEBhY21lLmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdhY2NlcHRlZCcgfV0sXG4gIH0sXG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFdheW5lIEVudGVycHJpc2VzIFx1MjAxNCBhIGRlYWwgaW4gbmVnb3RpYXRpb24gXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIHtcbiAgICBzdWJqZWN0OiAnV2F5bmUgXHUyMDE0IGVudGVycHJpc2UgbGljZW5zZSBuZWdvdGlhdGlvbicsXG4gICAgdHlwZTogJ21lZXRpbmcnLCBzdGF0dXM6ICdoZWxkJywgZGF5c0FnbzogMywgYXQ6IFsxNiwgMF0sIG1pbnV0ZXM6IDYwLFxuICAgIHJlbGF0ZWRUeXBlOiAnY3JtX29wcG9ydHVuaXR5JywgcmVsYXRlZEtleTogJ1dheW5lIEVudGVycHJpc2UgTGljZW5zZScsIGFjY291bnQ6ICdXYXluZSBFbnRlcnByaXNlcycsXG4gICAgbG9jYXRpb246ICdab29tJyxcbiAgICBvdXRjb21lOiAnVm9sdW1lIHRpZXIgYWdyZWVkIGF0IDIwIHRlbmFudHMuIFNlY3VyaXR5IGFkZGVuZHVtIGlzIHRoZSBsYXN0IG9wZW4gaXRlbS4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdXYXluZSBcdTIwMTQgc2VjdXJpdHkgYWRkZW5kdW0gd2Fsa3Rocm91Z2gnLFxuICAgIHR5cGU6ICdjYWxsJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDgsIGF0OiBbMTEsIDBdLCBtaW51dGVzOiAzMCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9jb250YWN0JywgcmVsYXRlZEtleTogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLCBhY2NvdW50OiAnV2F5bmUgRW50ZXJwcmlzZXMnLFxuICAgIG91dGNvbWU6ICdMZWdhbCB0byByZXR1cm4gcmVkbGluZXMgd2l0aGluIHRoZSB3ZWVrLicsXG4gICAgYXR0ZW5kZWVzOiBbeyBjb250YWN0OiAncndpbHNvbkB3YXluZS5leGFtcGxlLmNvbScsIHJlc3BvbnNlOiAnYWNjZXB0ZWQnIH1dLFxuICB9LFxuICB7XG4gICAgc3ViamVjdDogJ1dheW5lIFx1MjAxNCBwbGF0Zm9ybSBnb3Zlcm5hbmNlIHdlYmluYXInLFxuICAgIHR5cGU6ICd3ZWJpbmFyJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDI2LCBhdDogWzE1LCAwXSwgbWludXRlczogNjAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fYWNjb3VudCcsIHJlbGF0ZWRLZXk6ICdXYXluZSBFbnRlcnByaXNlcycsXG4gICAgbG9jYXRpb246ICdodHRwczovL2FjbWUuZXhhbXBsZS5jb20vd2ViaW5hcnMvZ292ZXJuYW5jZScsXG4gICAgb3V0Y29tZTogJ0ZvdXIgYnVzaW5lc3MgdW5pdHMgYXR0ZW5kZWQ7IHR3byBhc2tlZCBmb3IgdGhlaXIgb3duIHJvbGxvdXQgcGxhbi4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdXYXluZSBcdTIwMTQgYnVsayBpbXBvcnQgcm9sbG91dCBjaGVjay1pbicsXG4gICAgdHlwZTogJ2NhbGwnLCBzdGF0dXM6ICdoZWxkJywgZGF5c0FnbzogNDUsIGF0OiBbMTAsIDMwXSwgbWludXRlczogMjUsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fY2FzZScsIHJlbGF0ZWRLZXk6ICdSZXF1ZXN0OiBidWxrIGltcG9ydCB2aWEgQ1NWJywgYWNjb3VudDogJ1dheW5lIEVudGVycHJpc2VzJyxcbiAgICBvdXRjb21lOiAnQ1NWIGltcG9ydCBzaGlwcGVkIGFuZCBkb2N1bWVudGVkOyB0aGUgY3VzdG9tZXIgY2xvc2VkIHRoZSByZXF1ZXN0IG91dCBvbiB0aGUgY2FsbC4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgVmVydGV4IEFuYWx5dGljcyBcdTIwMTQgZXhwYW5zaW9uLCB0aGVuIGFuIGVudGVycHJpc2Ugcm9sbG91dCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAge1xuICAgIHN1YmplY3Q6ICdWZXJ0ZXggXHUyMDE0IHJvbGxvdXQgcGhhc2luZyBhbmQgZGF0YSByZXNpZGVuY3knLFxuICAgIHR5cGU6ICdtZWV0aW5nJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDEsIGF0OiBbOSwgMzBdLCBtaW51dGVzOiA3NSxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9vcHBvcnR1bml0eScsIHJlbGF0ZWRLZXk6ICdWZXJ0ZXggRW50ZXJwcmlzZSBSb2xsb3V0JywgYWNjb3VudDogJ1ZlcnRleCBBbmFseXRpY3MnLFxuICAgIGxvY2F0aW9uOiAnWm9vbScsXG4gICAgb3V0Y29tZTogJ1BoYXNlIDEgc2NvcGVkIHRvIGZvdXIgcmVnaW9ucy4gUmVzaWRlbmN5IGNvbnRyb2xzIHRvIGJlIGNvbmZpcm1lZCB3aXRoIHRoZWlyIHNlY3VyaXR5IHRlYW0uJyxcbiAgICBhdHRlbmRlZXM6IFt7IGNvbnRhY3Q6ICdldGhhbi5icm9va3NAdmVydGV4LmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdhY2NlcHRlZCcgfV0sXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnVmVydGV4IFx1MjAxNCByZXZlbnVlIGFuYWx5dGljcyBkZW1vJyxcbiAgICB0eXBlOiAnZGVtbycsIHN0YXR1czogJ2hlbGQnLCBkYXlzQWdvOiAxMCwgYXQ6IFsxNCwgMzBdLCBtaW51dGVzOiA0NSxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9vcHBvcnR1bml0eScsIHJlbGF0ZWRLZXk6ICdWZXJ0ZXggQW5hbHl0aWNzIEV4cGFuc2lvbicsIGFjY291bnQ6ICdWZXJ0ZXggQW5hbHl0aWNzJyxcbiAgICBsb2NhdGlvbjogJ1pvb20nLFxuICAgIG91dGNvbWU6ICdTYWxlcywgbWFya2V0aW5nIGFuZCBzZXJ2aWNlIGxlYWRzIGFsbCBhc2tlZCBmb3IgdGhlaXIgb3duIHdvcmtzcGFjZSBcdTIwMTQgdGhlIGV4cGFuc2lvbiBjYXNlIG1ha2VzIGl0c2VsZi4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ2V0aGFuLmJyb29rc0B2ZXJ0ZXguZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdWZXJ0ZXggXHUyMDE0IGV4cGFuc2lvbiBidXlpbmcgY29tbWl0dGVlIGNhbGwnLFxuICAgIHR5cGU6ICdjYWxsJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDE5LCBhdDogWzE2LCAzMF0sIG1pbnV0ZXM6IDMwLFxuICAgIHJlbGF0ZWRUeXBlOiAnY3JtX2NvbnRhY3QnLCByZWxhdGVkS2V5OiAnZXRoYW4uYnJvb2tzQHZlcnRleC5leGFtcGxlLmNvbScsIGFjY291bnQ6ICdWZXJ0ZXggQW5hbHl0aWNzJyxcbiAgICBvdXRjb21lOiAnQ1JPIG93bnMgdGhlIGJ1ZGdldDsgdGhlIGRhdGEgdGVhbSBzdGF5cyB0aGUgdGVjaG5pY2FsIHNwb25zb3IuJyxcbiAgICBhdHRlbmRlZXM6IFt7IGNvbnRhY3Q6ICdldGhhbi5icm9va3NAdmVydGV4LmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdhY2NlcHRlZCcgfV0sXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnVmVydGV4IFx1MjAxNCBkZXZlbG9wZXIgcGxhdGZvcm0gcmV0cm9zcGVjdGl2ZScsXG4gICAgdHlwZTogJ21lZXRpbmcnLCBzdGF0dXM6ICdoZWxkJywgZGF5c0FnbzogMzgsIGF0OiBbMTEsIDBdLCBtaW51dGVzOiA2MCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9hY2NvdW50JywgcmVsYXRlZEtleTogJ1ZlcnRleCBBbmFseXRpY3MnLFxuICAgIG91dGNvbWU6ICdUaHJlZSBwcm9kdWN0IHRlYW1zIGxpdmUgb24gdGhlIGRldmVsb3BlciBwbGF0Zm9ybTsgdXNhZ2UgYW5hbHl0aWNzIGlzIHRoZSBuZXh0IGFzay4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ2V0aGFuLmJyb29rc0B2ZXJ0ZXguZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgfSxcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgU3RhcmsgTWVkaWNhbCBcdTIwMTQgdGhlIHBhcnRuZXIgbW90aW9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICB7XG4gICAgc3ViamVjdDogJ1N0YXJrIE1lZGljYWwgXHUyMDE0IFRvcm9udG8gY2xpbmljYWwgb3BlcmF0aW9ucyB2aXNpdCcsXG4gICAgdHlwZTogJ29uc2l0ZV92aXNpdCcsIHN0YXR1czogJ2hlbGQnLCBkYXlzQWdvOiA1MiwgYXQ6IFs5LCAwXSwgbWludXRlczogMTgwLFxuICAgIHJlbGF0ZWRUeXBlOiAnY3JtX2FjY291bnQnLCByZWxhdGVkS2V5OiAnU3RhcmsgTWVkaWNhbCcsXG4gICAgbG9jYXRpb246ICcxODEgQmF5IFN0cmVldCwgU3VpdGUgMjIwMCwgVG9yb250bycsXG4gICAgb3V0Y29tZTogJ1R3byBjbGluaWNhbCBzZXJ2aWNlIGxpbmVzIGxpdmUgb24gdGhlIHBpbG90LiBEZXZpY2Utc2VydmljaW5nIGV4cGFuc2lvbiBwYXJrZWQgb24gYnVkZ2V0LicsXG4gICAgYXR0ZW5kZWVzOiBbeyBjb250YWN0OiAnZW1pbHkuZEBzdGFya21lZC5leGFtcGxlLmNvbScsIHJlc3BvbnNlOiAnYWNjZXB0ZWQnIH1dLFxuICB9LFxuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBMZWFkczogdGhlIG9ubHkgaGVsZCByb3dzIHRoYXQgdG91Y2ggYSBwcm9zcGVjdCdzIG93biBjbG9jayBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbiAge1xuICAgIHN1YmplY3Q6ICdDbG91ZEZpcnN0IFx1MjAxNCBxdWFsaWZpY2F0aW9uIGNhbGwgd2l0aCBMaXNhIFRob21wc29uJyxcbiAgICB0eXBlOiAnY2FsbCcsIHN0YXR1czogJ2hlbGQnLCBkYXlzQWdvOiAxLCBhdDogWzExLCAwXSwgbWludXRlczogMzAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fbGVhZCcsIHJlbGF0ZWRLZXk6ICdsaXNhLnRAY2xvdWRmaXJzdC5leGFtcGxlLmNvbScsXG4gICAgb3V0Y29tZTogJ0J1ZGdldCBjb25maXJtZWQgYW5kIGEgdGVjaG5pY2FsIGV2YWx1YXRpb24gYWdyZWVkIFx1MjAxNCBxdWFsaWZpZWQuJyxcbiAgICBhdHRlbmRlZXM6IFt7IGxlYWQ6ICdsaXNhLnRAY2xvdWRmaXJzdC5leGFtcGxlLmNvbScsIHJlc3BvbnNlOiAnYWNjZXB0ZWQnIH1dLFxuICB9LFxuICB7XG4gICAgc3ViamVjdDogJ0VkdVRlY2ggTGFicyBcdTIwMTQgZGlzY292ZXJ5IGNhbGwgd2l0aCBEYXZpZCBLaW0nLFxuICAgIHR5cGU6ICdjYWxsJywgc3RhdHVzOiAnaGVsZCcsIGRheXNBZ286IDQsIGF0OiBbMTMsIDBdLCBtaW51dGVzOiAzMCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9sZWFkJywgcmVsYXRlZEtleTogJ2RraW1AZWR1dGVjaGxhYnMuZXhhbXBsZS5jb20nLFxuICAgIG91dGNvbWU6ICdSZXBsYWNpbmcgc3ByZWFkc2hlZXRzIGFjcm9zcyBhZG1pc3Npb25zLiBSZWZlcnJhbCBzb3VyY2UgY29uZmlybWVkLicsXG4gICAgYXR0ZW5kZWVzOiBbeyBsZWFkOiAnZGtpbUBlZHV0ZWNobGFicy5leGFtcGxlLmNvbScsIHJlc3BvbnNlOiAnYWNjZXB0ZWQnIH1dLFxuICB9LFxuICAvLyBUaGUgZWFybGllciB0b3VjaCBvbiBlYWNoIG9mIHRoZSB0d28gbGVhZHMgYWJvdmUsIHNvIGVhY2ggbGVhZCdzIEFjdGl2aXR5XG4gIC8vIHRhYiByZWFkcyBhcyBhIHNob3J0IGhpc3RvcnkgcmF0aGVyIHRoYW4gYSBzaW5nbGUgcm93LiBCb3RoIGxlYWRzIGFscmVhZHlcbiAgLy8gY2FycnkgYGxhc3RfY29udGFjdGVkX2RhdGU6IHRvZGF5KClgIGZvciB0aGVpciBsYXRlciBjYWxsLCBzbyBhIHNlY29uZCBoZWxkXG4gIC8vIHJvdyBtb3ZlcyBubyByZWNlbmN5IGNsb2NrIChgZXZlbnRfYWN0aXZpdHlfYnViYmxlYCBzdGFtcHMgdGhlIHNlZWQgbW9tZW50KS5cbiAge1xuICAgIHN1YmplY3Q6ICdDbG91ZEZpcnN0IFx1MjAxNCBmb2xsb3ctdXAgbWVldGluZyBhZnRlciB0aGUgQ2xvdWQgU3VtbWl0IGJvb3RoJyxcbiAgICB0eXBlOiAnbWVldGluZycsIHN0YXR1czogJ2hlbGQnLCBkYXlzQWdvOiA4LCBhdDogWzE1LCAwXSwgbWludXRlczogNDUsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fbGVhZCcsIHJlbGF0ZWRLZXk6ICdsaXNhLnRAY2xvdWRmaXJzdC5leGFtcGxlLmNvbScsXG4gICAgb3V0Y29tZTogJ1dhbGtlZCB0aHJvdWdoIHBpcGVsaW5lIGFuZCBmb3JlY2FzdGluZy4gQXNrZWQgZm9yIGEgcXVhbGlmaWNhdGlvbiBjYWxsIHdpdGggZmluYW5jZS4nLFxuICAgIGF0dGVuZGVlczogW3sgbGVhZDogJ2xpc2EudEBjbG91ZGZpcnN0LmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdhY2NlcHRlZCcgfV0sXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnRWR1VGVjaCBMYWJzIFx1MjAxNCByZWZlcnJhbCBpbnRybyBjYWxsIHdpdGggRGF2aWQgS2ltJyxcbiAgICB0eXBlOiAnY2FsbCcsIHN0YXR1czogJ2hlbGQnLCBkYXlzQWdvOiA5LCBhdDogWzEwLCAwXSwgbWludXRlczogMTUsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fbGVhZCcsIHJlbGF0ZWRLZXk6ICdka2ltQGVkdXRlY2hsYWJzLmV4YW1wbGUuY29tJyxcbiAgICBvdXRjb21lOiAnV2FybSBpbnRybyBmcm9tIHRoZSByZWZlcnJpbmcgcGFydG5lci4gQm9va2VkIGEgcHJvcGVyIGRpc2NvdmVyeSBjYWxsLicsXG4gICAgYXR0ZW5kZWVzOiBbeyBsZWFkOiAnZGtpbUBlZHV0ZWNobGFicy5leGFtcGxlLmNvbScsIHJlc3BvbnNlOiAnYWNjZXB0ZWQnIH1dLFxuICB9LFxuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBCb29rZWQsIG5vdCBoZWxkOiB0aGUgY2FsZW5kYXIgYWhlYWQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIC8vIFRoZXNlIGFyZSB3aGF0IGBzdGF0dXNgIGV4aXN0cyBmb3IuIE5vdCBvbmUgb2YgdGhlbSBtb3ZlcyBhIHJlY2VuY3kgY2xvY2ssXG4gIC8vIGFuZCB0aGUgdGhyZWUgcmUtZW5nYWdlbWVudCByb3dzIGJlbG93IHNpdCBvbiB0aGUgYWNjb3VudHMgdGhlIGNodXJuIHRpbGVzXG4gIC8vIGNvdW50IFx1MjAxNCB3aGljaCBpcyB0aGUgZGVtb25zdHJhdGlvbiwgbm90IGFuIG92ZXJzaWdodC5cbiAge1xuICAgIHN1YmplY3Q6ICdBY21lIFx1MjAxNCBBSSBhZ2VudCBnb3Zlcm5hbmNlIHdvcmtzaG9wJyxcbiAgICB0eXBlOiAnbWVldGluZycsIHN0YXR1czogJ3BsYW5uZWQnLCBkYXlzQWdvOiAtNiwgYXQ6IFs5LCAwXSwgbWludXRlczogOTAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fb3Bwb3J0dW5pdHknLCByZWxhdGVkS2V5OiAnQWNtZSBQbGF0Zm9ybSBVcGdyYWRlJywgYWNjb3VudDogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgIGxvY2F0aW9uOiAnR29vZ2xlIE1lZXQnLFxuICAgIGRlc2NyaXB0aW9uOiAnSm9pbnQgd29ya3Nob3Agd2l0aCBBY21lIGNvbXBsaWFuY2U6IGRhdGEgc2NvcGluZywgUkJBQywgYXVkaXQgdHJhaWxzLCBodW1hbi1pbi10aGUtbG9vcC4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ2pvaG4uc21pdGhAYWNtZS5leGFtcGxlLmNvbScsIHJlc3BvbnNlOiAndGVudGF0aXZlJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogOSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdXYXluZSBcdTIwMTQgcHJvY3VyZW1lbnQgc2lnbmF0dXJlIGNhbGwnLFxuICAgIHR5cGU6ICdtZWV0aW5nJywgc3RhdHVzOiAncGxhbm5lZCcsIGRheXNBZ286IC0xLCBhdDogWzExLCAwXSwgbWludXRlczogMzAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fb3Bwb3J0dW5pdHknLCByZWxhdGVkS2V5OiAnV2F5bmUgRW50ZXJwcmlzZSBMaWNlbnNlJywgYWNjb3VudDogJ1dheW5lIEVudGVycHJpc2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NvbmZpcm0gdGhlIHNpZ25hdHVyZSBkYXRlIG9uY2UgdGhlIHNlY3VyaXR5IGFkZGVuZHVtIGlzIGNsb3NlZC4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogNCxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdHbG9iZXggXHUyMDE0IG1hbnVmYWN0dXJpbmcgc3VpdGUgZGVtbycsXG4gICAgdHlwZTogJ2RlbW8nLCBzdGF0dXM6ICdwbGFubmVkJywgZGF5c0FnbzogLTUsIGF0OiBbMTUsIDBdLCBtaW51dGVzOiA2MCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9vcHBvcnR1bml0eScsIHJlbGF0ZWRLZXk6ICdHbG9iZXggTWFudWZhY3R1cmluZyBTdWl0ZScsIGFjY291bnQ6ICdHbG9iZXggSW5kdXN0cmllcycsXG4gICAgbG9jYXRpb246ICdab29tJyxcbiAgICBkZXNjcmlwdGlvbjogJ1BsYW50LW9wZXJhdGlvbnMgZGVtbyBmb3IgdGhlIHNpeC1zaXRlIHJvbGxvdXQsIGFoZWFkIG9mIHRoZSBxdWFsaWZpY2F0aW9uIHJldmlldy4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ3NhcmFoLmpAZ2xvYmV4LmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdhY2NlcHRlZCcgfV0sXG4gICAgaW52aXRlZERheXNCZWZvcmU6IDgsXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnTGF0dGljZSBcdTIwMTQgcmVuZXdhbCBwcm9wb3NhbCByZXZpZXcnLFxuICAgIHR5cGU6ICdtZWV0aW5nJywgc3RhdHVzOiAncGxhbm5lZCcsIGRheXNBZ286IC0zLCBhdDogWzEwLCAwXSwgbWludXRlczogNDUsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fb3Bwb3J0dW5pdHknLCByZWxhdGVkS2V5OiAnTGF0dGljZSBFZHVjYXRpb24gUmVuZXdhbCcsIGFjY291bnQ6ICdMYXR0aWNlIEVkdWNhdGlvbicsXG4gICAgZGVzY3JpcHRpb246ICdXYWxrIHByb2N1cmVtZW50IHRocm91Z2ggdGhlIHR3by15ZWFyIG9wdGlvbiBiZWZvcmUgdGhlIGV4ZWN1dGl2ZSBzcG9uc29yIG1lZXRpbmcuJyxcbiAgICBhdHRlbmRlZXM6IFt7IGNvbnRhY3Q6ICdwcml5YS5zaGFoQGxhdHRpY2UuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ2FjY2VwdGVkJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogNixcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdJbml0ZWNoIFx1MjAxNCByZS1lbmdhZ2VtZW50IGNhbGwgYmVmb3JlIHJlbmV3YWwnLFxuICAgIHR5cGU6ICdjYWxsJywgc3RhdHVzOiAncGxhbm5lZCcsIGRheXNBZ286IC0yLCBhdDogWzE0LCAwXSwgbWludXRlczogMzAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fYWNjb3VudCcsIHJlbGF0ZWRLZXk6ICdJbml0ZWNoIFNvbHV0aW9ucycsXG4gICAgZGVzY3JpcHRpb246ICdOb2JvZHkgaGFzIHNwb2tlbiB0byBJbml0ZWNoIGluIHRlbiB3ZWVrcyBhbmQgdGhlIHJlbmV3YWwgaXMgNzUgZGF5cyBvdXQuIFJlLW9wZW4gdGhlIHJlbGF0aW9uc2hpcC4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ21jaGVuQGluaXRlY2guZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ25vX3Jlc3BvbnNlJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogNSxcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdOb3J0aHdpbmQgXHUyMDE0IGdyaWQgbW9kZXJuaXphdGlvbiBkaXNjb3Zlcnkgd29ya3Nob3AnLFxuICAgIHR5cGU6ICdtZWV0aW5nJywgc3RhdHVzOiAncGxhbm5lZCcsIGRheXNBZ286IC03LCBhdDogWzksIDMwXSwgbWludXRlczogMTIwLFxuICAgIHJlbGF0ZWRUeXBlOiAnY3JtX29wcG9ydHVuaXR5JywgcmVsYXRlZEtleTogJ05vcnRod2luZCBHcmlkIE1vZGVybml6YXRpb24nLCBhY2NvdW50OiAnTm9ydGh3aW5kIEVuZXJneScsXG4gICAgbG9jYXRpb246ICdMZW9wb2xkc3RyYXNzZSAyMSwgTXVuaWNoJyxcbiAgICBkZXNjcmlwdGlvbjogJ0NvbmZpcm0gZGlzY292ZXJ5IHBhcnRpY2lwYW50cyBhbmQgYWdyZWUgdGhlIG9wZXJhdGlvbmFsLWRhdGEgYXNzZXNzbWVudCBzY29wZS4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ29saXZpYS5jaGVuQG5vcnRod2luZC5leGFtcGxlLmNvbScsIHJlc3BvbnNlOiAndGVudGF0aXZlJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogMTAsXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnQXBleCBMb2dpc3RpY3MgXHUyMDE0IGRhdGEgaHViIHJlLWVuZ2FnZW1lbnQgY2FsbCcsXG4gICAgdHlwZTogJ2NhbGwnLCBzdGF0dXM6ICdwbGFubmVkJywgZGF5c0FnbzogLTQsIGF0OiBbMTYsIDBdLCBtaW51dGVzOiAzMCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9hY2NvdW50JywgcmVsYXRlZEtleTogJ0FwZXggTG9naXN0aWNzJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RoZSBkYXRhLWh1YiBldmFsdWF0aW9uIGhhcyBiZWVuIHNpbGVudCBmb3IgYSBxdWFydGVyLiBSZS1lc3RhYmxpc2ggdGhlIGNvbW1lcmNpYWwgc3BvbnNvci4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ21hcmN1cy5yZWVkQGFwZXhsb2dpc3RpY3MuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ25vX3Jlc3BvbnNlJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogNixcbiAgfSxcbiAge1xuICAgIHN1YmplY3Q6ICdOZXh0R2VuIFJldGFpbCBcdTIwMTQgZmlyc3QgZGlzY292ZXJ5IGNhbGwgd2l0aCBBbGljZSBNYXJ0aW5leicsXG4gICAgdHlwZTogJ2NhbGwnLCBzdGF0dXM6ICdwbGFubmVkJywgZGF5c0FnbzogLTIsIGF0OiBbMTUsIDBdLCBtaW51dGVzOiAzMCxcbiAgICByZWxhdGVkVHlwZTogJ2NybV9sZWFkJywgcmVsYXRlZEtleTogJ2FsaWNlQG5leHRnZW5yZXRhaWwuZXhhbXBsZS5jb20nLFxuICAgIGRlc2NyaXB0aW9uOiAnSW5ib3VuZCB3ZWIgbGVhZCwgYm9va2VkIG9uIGhlciBmb2xsb3ctdXAgZGF0ZS4nLFxuICAgIGF0dGVuZGVlczogW3sgbGVhZDogJ2FsaWNlQG5leHRnZW5yZXRhaWwuZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ25vX3Jlc3BvbnNlJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogMyxcbiAgfSxcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgTmVpdGhlciBoZWxkIG5vciBib29rZWQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4gIC8vIGBkdXJhdGlvbl9taW51dGVzYCBpcyAwIG9uIGJvdGgsIGV4YWN0bHkgYXMgYGV2ZW50X3NjaGVkdWxlX2Rlcml2ZWBcbiAgLy8gcmVjb21wdXRlcyBpdDogYSBtZWV0aW5nIG5vYm9keSBhdHRlbmRlZCBvY2N1cGllcyBub2JvZHkncyB0aW1lLCB3aGlsZSB0aGVcbiAgLy8gY2FsZW5kYXIgc2xvdCBpdCB3YXMgYm9va2VkIGludG8gc3RheXMgb24gdGhlIHJlY29yZCBhcyBldmlkZW5jZSBvZiB0aGVcbiAgLy8gYXR0ZW1wdC5cbiAge1xuICAgIHN1YmplY3Q6ICdHbG9iZXggXHUyMDE0IGxpbmUgZXhwYW5zaW9uIHJldmlldycsXG4gICAgdHlwZTogJ21lZXRpbmcnLCBzdGF0dXM6ICdjYW5jZWxsZWQnLCBkYXlzQWdvOiAzMCwgYXQ6IFsxNCwgMF0sIG1pbnV0ZXM6IDYwLFxuICAgIHJlbGF0ZWRUeXBlOiAnY3JtX29wcG9ydHVuaXR5JywgcmVsYXRlZEtleTogJ0dsb2JleCBMaW5lIEV4cGFuc2lvbiAoTG9zdCknLCBhY2NvdW50OiAnR2xvYmV4IEluZHVzdHJpZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnQ2FuY2VsbGVkIGJ5IHRoZSBjdXN0b21lcjogdGhlIGluY3VtYmVudCBNRVMgdmVuZG9yIGhhZCBhbHJlYWR5IGJ1bmRsZWQgdGhlIHR3byBsaW5lcy4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ3NhcmFoLmpAZ2xvYmV4LmV4YW1wbGUuY29tJywgcmVzcG9uc2U6ICdkZWNsaW5lZCcgfV0sXG4gICAgaW52aXRlZERheXNCZWZvcmU6IDcsXG4gIH0sXG4gIHtcbiAgICBzdWJqZWN0OiAnSW5pdGVjaCBcdTIwMTQgU1NPIGNvbmZpZ3VyYXRpb24gY2hlY2staW4nLFxuICAgIHR5cGU6ICdjYWxsJywgc3RhdHVzOiAnbm9fc2hvdycsIGRheXNBZ286IDU1LCBhdDogWzEwLCAwXSwgbWludXRlczogMzAsXG4gICAgcmVsYXRlZFR5cGU6ICdjcm1fYWNjb3VudCcsIHJlbGF0ZWRLZXk6ICdJbml0ZWNoIFNvbHV0aW9ucycsXG4gICAgZGVzY3JpcHRpb246ICdDdXN0b21lciBkaWQgbm90IGpvaW4uIFRoZSBsYXN0IGF0dGVtcHQgdG8gcmVhY2ggSW5pdGVjaCBiZWZvcmUgdGhlIGFjY291bnQgd2VudCBxdWlldC4nLFxuICAgIGF0dGVuZGVlczogW3sgY29udGFjdDogJ21jaGVuQGluaXRlY2guZXhhbXBsZS5jb20nLCByZXNwb25zZTogJ25vX3Jlc3BvbnNlJyB9XSxcbiAgICBpbnZpdGVkRGF5c0JlZm9yZTogNCxcbiAgfSxcbl07XG5cbi8qKiBgW2hvdXIsIG1pbnV0ZV1gIHBsdXMgYG1pbnV0ZXNgLCBhcyB0aGUgZW5kLW9mLXNsb3Qgd2FsbCBjbG9jay4gKi9cbmNvbnN0IGVuZENsb2NrID0gKHNwZWM6IEV2ZW50U3BlYyk6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0gPT4ge1xuICBjb25zdCB0b3RhbCA9IHNwZWMuYXRbMF0gKiA2MCArIHNwZWMuYXRbMV0gKyBzcGVjLm1pbnV0ZXM7XG4gIHJldHVybiBbTWF0aC5mbG9vcih0b3RhbCAvIDYwKSwgdG90YWwgJSA2MF07XG59O1xuXG5leHBvcnQgY29uc3QgZXZlbnRzID0gZGVmaW5lU2VlZChFdmVudCwge1xuICBtb2RlOiAndXBzZXJ0JyxcbiAgZXh0ZXJuYWxJZDogJ3N1YmplY3QnLFxuICByZWNvcmRzOiBFVkVOVF9TUEVDUy5tYXAoKHNwZWMpID0+IHtcbiAgICBjb25zdCBbZW5kSG91ciwgZW5kTWludXRlXSA9IGVuZENsb2NrKHNwZWMpO1xuICAgIHJldHVybiB7XG4gICAgICBzdWJqZWN0OiBzcGVjLnN1YmplY3QsXG4gICAgICB0eXBlOiBzcGVjLnR5cGUsXG4gICAgICBzdGF0dXM6IHNwZWMuc3RhdHVzLFxuICAgICAgc3RhcnRfZGF0ZXRpbWU6IGNlbENsb2NrKHNwZWMuZGF5c0Fnbywgc3BlYy5hdFswXSwgc3BlYy5hdFsxXSksXG4gICAgICBlbmRfZGF0ZXRpbWU6IGNlbENsb2NrKHNwZWMuZGF5c0FnbywgZW5kSG91ciwgZW5kTWludXRlKSxcbiAgICAgIC8vIEF1dGhvcmVkIHJhdGhlciB0aGFuIGxlZnQgdG8gdGhlIGhvb2ssIGFuZCBhdXRob3JlZCB0byB0aGUgdmFsdWUgdGhlXG4gICAgICAvLyBob29rIGNvbXB1dGVzOiBgZXZlbnRfc2NoZWR1bGVfZGVyaXZlYCBtZWFzdXJlcyB0aGUgZ2FwIGJldHdlZW4gdGhlIHR3b1xuICAgICAgLy8gdGltZXN0YW1wcyBhYm92ZSwgdGhlbiB6ZXJvZXMgaXQgZm9yIGEgY2FuY2VsbGVkIC8gbm8tc2hvdyByb3cuIEJvdGhcbiAgICAgIC8vIGJyYW5jaGVzIGFncmVlIHdpdGggdGhpcyBsaXRlcmFsLCBzbyB0aGUgZmlndXJlIGlzIHJpZ2h0IHdoZXRoZXIgb3Igbm90XG4gICAgICAvLyBob29rcyBmaXJlIG92ZXIgdGhlIHNlZWQgd3JpdGUgKGAuL19zaGFyZWQudHNgLCBkb2N0cmluZSBydWxlIDIpLlxuICAgICAgZHVyYXRpb25fbWludXRlczogc3BlYy5zdGF0dXMgPT09ICdjYW5jZWxsZWQnIHx8IHNwZWMuc3RhdHVzID09PSAnbm9fc2hvdycgPyAwIDogc3BlYy5taW51dGVzLFxuICAgICAgYWxsX2RheTogZmFsc2UsXG4gICAgICByZWxhdGVkX3RvX3R5cGU6IHNwZWMucmVsYXRlZFR5cGUsXG4gICAgICBbRVZFTlRfUkVMQVRFRF9GSUVMRFtzcGVjLnJlbGF0ZWRUeXBlXV06IHNwZWMucmVsYXRlZEtleSxcbiAgICAgIC8vIFRoZSBhY2NvdW50IGxpbmsgaXMgYXV0aG9yZWQgb24gZXZlcnkgcm93IHRoYXQgaGFzIG9uZSwgaW5jbHVkaW5nIHJvd3NcbiAgICAgIC8vIHdob3NlIGByZWxhdGVkX3RvX3R5cGVgIGlzIHRoZSBjb250YWN0IC8gb3Bwb3J0dW5pdHkgLyBjYXNlIFx1MjAxNCB0aGUgc2FtZVxuICAgICAgLy8gc2hhcGUgdGhlIHRhc2sgc2VlZHMgdXNlLCBhbmQgd2hhdCBmaWxscyB0aGUgQUNDT1VOVCdzIGFjdGl2aXR5IGxpc3QuXG4gICAgICAuLi4oc3BlYy5hY2NvdW50ICYmIHNwZWMucmVsYXRlZFR5cGUgIT09ICdjcm1fYWNjb3VudCdcbiAgICAgICAgPyB7IHJlbGF0ZWRfdG9fYWNjb3VudDogc3BlYy5hY2NvdW50IH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4oc3BlYy5sb2NhdGlvbiA/IHsgbG9jYXRpb246IHNwZWMubG9jYXRpb24gfSA6IHt9KSxcbiAgICAgIC4uLihzcGVjLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogc3BlYy5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgLi4uKHNwZWMub3V0Y29tZSA/IHsgb3V0Y29tZV9ub3Rlczogc3BlYy5vdXRjb21lIH0gOiB7fSksXG4gICAgICAvLyBObyBgb3duZXJfaWRgOiBhIHNlZWQgY2Fubm90IG5hbWUgYSB1c2VyIChzZWUgYG9iamVjdHN0YWNrLmNvbXBvc2l0aW9uLnRzYCxcbiAgICAgIC8vIFwiQSBzZWVkIGNhbid0IG5hbWUgYSB1c2VyXCIpLCBzbyB0aGVzZSByb3dzIGxhbmQgb3duZXJsZXNzIGFuZCB0aGVcbiAgICAgIC8vIHBsYXRmb3JtJ3Mgc2VlZC1vd25lcnNoaXAgY2xhaW0gaGFuZHMgdGhlbSB0byB0aGUgZmlyc3QgYWRtaW5pc3RyYXRvclxuICAgICAgLy8gd2hlbiB0aGUgc2VlZCBzZXR0bGVzICgjNjcxLCAjMTg5MikuXG4gICAgfTtcbiAgfSksXG59KTtcblxuLyoqXG4gKiBBdHRlbmRlZXMsIHNlZWRlZCBhcyBUV08gZGF0YXNldHMgb3ZlciBvbmUgb2JqZWN0LCBzcGxpdCBieSB3aGljaCBwYXJ0eVxuICogbG9va3VwIGlzIHBvcHVsYXRlZCBcdTIwMTQgdGhlIHNhbWUgY29uc3RydWN0aW9uLCBmb3IgdGhlIHNhbWUgcmVhc29uLCBhc1xuICogYGNhbXBhaWduTWVtYmVyc0Zyb21MZWFkc2AgLyBgY2FtcGFpZ25NZW1iZXJzRnJvbUNvbnRhY3RzYDogdGhlIGxvYWRlcidzXG4gKiBjb21wb3NpdGUga2V5IGlzIEVNUFRZIHdoZW4gYW55IGNvbXBvbmVudCBpcyBudWxsLCB3aGljaCBzaWxlbnRseSBkaXNhYmxlc1xuICogZGVkdXBlIGFuZCByZS1pbnNlcnRzIGV2ZXJ5IHJvdyBvbiBlYWNoIHJlcGxheSBib290LlxuICpcbiAqIFRoZXJlIGlzIG5vIHRoaXJkIGRhdGFzZXQgZm9yIGBzeXNfdXNlcmAgYXR0ZW5kZWVzLCBhbmQgbm8gYGlzX29yZ2FuaXplcjpcbiAqIHRydWVgIHJvdyBhbnl3aGVyZSBiZWxvdy4gVGhlIG9yZ2FuaXNlciBvZiBldmVyeSBvbmUgb2YgdGhlc2UgbWVldGluZ3MgaXMgdGhlXG4gKiByZXAgXHUyMDE0IGEgYHN5c191c2VyYCBcdTIwMTQgYW5kIGEgc2VlZCBjYW5ub3QgbmFtZSBhIHVzZXI6IGxvb2t1cCB2YWx1ZXMgcmVzb2x2ZVxuICogYWdhaW5zdCB0aGUgdGFyZ2V0J3MgZXh0ZXJuYWxJZCwgd2hpY2ggb25seSB3b3JrcyBpbnNpZGUgdGhlIGFwcCdzIG93blxuICogb2JqZWN0IGdyYXBoLiBgYWN0aXZpdHktYWN0aW9ucy50c2AgYWRkcyB0aGUgb3JnYW5pc2VyIHJvdyBhdCBydW50aW1lLCB3aGVyZVxuICogdGhlIGlkIGV4aXN0cy4gTm90aGluZyBpcyBpbnZlbnRlZCBoZXJlIHRvIHN0YW5kIGluIGZvciBpdC5cbiAqXG4gKiAjIFRoZSBleHRlcm5hbCBndWVzdCwgcmV2aXNpdGVkICgjNzQwKVxuICpcbiAqICM2NzEgc2VlZGVkIG5vIGV4dGVybmFsLW9ubHkgYXR0ZW5kZWUgZm9yIGEgcmVhc29uIHRoYXQgaGFzIG5vdyBFWFBJUkVELCBhbmRcbiAqIHRoZSBub3RlIGlzIHVwZGF0ZWQgcmF0aGVyIHRoYW4gZGVsZXRlZCBiZWNhdXNlIHRoZSByZWFzb24gd2FzIGEgZGVmZWN0LCBub3RcbiAqIGEgdGFzdGU6IGBhdHRlbmRlZV90eXBlYCBoYWQgbm8gYGV4dGVybmFsYCB2YWx1ZSwgc28gdGhlIG9ubHkgd2F5IHRvIHN0b3JlIGFcbiAqIGd1ZXN0IHdobyBpcyBpbiBubyBDUk0gb2JqZWN0IHdhcyB0byBmaWxlIHRoZSByb3cgdW5kZXIgYGNvbnRhY3RgIGFuZCBsZWF2ZVxuICogYGNybV9jb250YWN0YCBlbXB0eSBcdTIwMTQgYSBzZWVkIHRoYXQgbGllcyBhYm91dCBpdHMgb3duIGRpc2NyaW1pbmF0b3IuICM3NDAgYWRkZWRcbiAqIHRoZSBmb3VydGggb3B0aW9uIGFuZCBtYWRlIGBhdHRlbmRlZV9yZXNvbHZlc2AgLyBgYXR0ZW5kZWVfdHlwZV9leGNsdXNpdmVgXG4gKiBlbmZvcmNlIHRoZSBwYWlyaW5nLCBzbyBgeyBhdHRlbmRlZV90eXBlOiAnZXh0ZXJuYWwnLCBleHRlcm5hbF9uYW1lOiBcIlx1MjAyNlwiIH1gIGlzXG4gKiBub3cgYW4gaG9uZXN0LCBhY2NlcHRlZCByb3cgYW5kIHNlZWRpbmcgb25lIGlzIGxlZ2l0aW1hdGUuXG4gKlxuICogSXQgaXMgc3RpbGwgbm90IHNlZWRlZCwgb24gdGhlIG5hcnJvd2VyIGdyb3VuZCB0aGF0IHN1cnZpdmVzOiBldmVyeSByb3cgYmVsb3dcbiAqIGlzIGRyYXduIGZyb20gYSBzZWVkZWQgY29udGFjdCBvciBsZWFkIHNvIHRoZSBkZW1vJ3MgcmVsYXRlZCBsaXN0cyBhbmQgY2h1cm5cbiAqIHRpbGVzIGhhbmcgdG9nZXRoZXIsIGFuZCBhbiBpbnZlbnRlZCBvdXRzaWRlIGNvdW5zZWwgd291bGQgYnV5IGEgdGhpcmRcbiAqIGRhdGFzZXQgKGl0cyBvd24gYGV4dGVybmFsSWQ6IFsnY3JtX2V2ZW50JywgJ2V4dGVybmFsX25hbWUnXWAsIHNpbmNlIHRoZVxuICogbG9hZGVyJ3MgY29tcG9zaXRlIGtleSBpcyBlbXB0eSB3aGVuIGEgY29tcG9uZW50IGlzIG51bGwpIGZvciBvbmUgZGVjb3JhdGl2ZVxuICogcm93IHRoYXQgbm8gdmlldywgY3ViZSBvciBkYXNoYm9hcmQgcmVhZHMuIFRoZSBjYXBhYmlsaXR5IGlzIHByb3ZlbiB3aGVyZSB0aGVcbiAqIHF1ZXN0aW9uIGFjdHVhbGx5IGlzIFx1MjAxNCBvbiB0aGUgcmVhbCBlbmdpbmUsIGluXG4gKiBgdGVzdC9hdHRlbmRlZS10eXBlLXJlc29sdXRpb24udGVzdC50c2AgXHUyMDE0IG5vdCBpbiB0aGUgZml4dHVyZSBib29rLiBBZGQgb25lXG4gKiBoZXJlIHRoZSBkYXkgYSBkZW1vIHNjZW5hcmlvIGdlbnVpbmVseSBoYXMgYSBndWVzdCBpbiB0aGUgcm9vbTsgbm90aGluZyBpblxuICogdGhlIG1ldGFkYXRhIHN0YW5kcyBpbiB0aGUgd2F5IGFueSBtb3JlLlxuICovXG5jb25zdCBhdHRlbmRlZVJlY29yZHMgPSAoa2luZDogJ2NvbnRhY3QnIHwgJ2xlYWQnKSA9PlxuICBFVkVOVF9TUEVDUy5mbGF0TWFwKChzcGVjKSA9PlxuICAgIHNwZWMuYXR0ZW5kZWVzXG4gICAgICAuZmlsdGVyKChhKSA9PiAoa2luZCA9PT0gJ2xlYWQnID8gYS5sZWFkIDogYS5jb250YWN0KSlcbiAgICAgIC5tYXAoKGEpID0+ICh7XG4gICAgICAgIGNybV9ldmVudDogc3BlYy5zdWJqZWN0LFxuICAgICAgICBhdHRlbmRlZV90eXBlOiBraW5kLFxuICAgICAgICAuLi4oa2luZCA9PT0gJ2xlYWQnID8geyBjcm1fbGVhZDogYS5sZWFkIH0gOiB7IGNybV9jb250YWN0OiBhLmNvbnRhY3QgfSksXG4gICAgICAgIHJlc3BvbnNlOiBhLnJlc3BvbnNlLFxuICAgICAgICBpc19vcmdhbml6ZXI6IGZhbHNlLFxuICAgICAgICAvLyBUaGUgaW52aXRhdGlvbiBwcmVkYXRlcyB0aGUgc2xvdC4gQ2xhbXBlZCBhdCAwIHNvIGEgbWVldGluZyBib29rZWRcbiAgICAgICAgLy8gZm9yIHRoZSBkYXkgYWZ0ZXIgdG9tb3Jyb3cgd2FzIGludml0ZWQgdG9kYXksIG5ldmVyIHRvbW9ycm93LlxuICAgICAgICBpbnZpdGVkX2RhdGU6IGNlbERheXNBZ28oTWF0aC5tYXgoc3BlYy5kYXlzQWdvICsgKHNwZWMuaW52aXRlZERheXNCZWZvcmUgPz8gMyksIDApKSxcbiAgICAgIH0pKSxcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGV2ZW50QXR0ZW5kZWVzRnJvbUNvbnRhY3RzID0gZGVmaW5lU2VlZChFdmVudEF0dGVuZGVlLCB7XG4gIG1vZGU6ICd1cHNlcnQnLFxuICBleHRlcm5hbElkOiBbJ2NybV9ldmVudCcsICdjcm1fY29udGFjdCddLFxuICByZWNvcmRzOiBhdHRlbmRlZVJlY29yZHMoJ2NvbnRhY3QnKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZXZlbnRBdHRlbmRlZXNGcm9tTGVhZHMgPSBkZWZpbmVTZWVkKEV2ZW50QXR0ZW5kZWUsIHtcbiAgbW9kZTogJ3Vwc2VydCcsXG4gIGV4dGVybmFsSWQ6IFsnY3JtX2V2ZW50JywgJ2NybV9sZWFkJ10sXG4gIHJlY29yZHM6IGF0dGVuZGVlUmVjb3JkcygnbGVhZCcpLFxufSk7XG5cbi8qKlxuICogVGhlIGxlYWQgdGltZWxpbmUgcG9pbnRlcnMgXHUyMDE0IHdoYXQgYGxvZ19jYWxsYCB3b3VsZCBoYXZlIHdyaXR0ZW4gKCMxMjU4KS5cbiAqXG4gKiBBIGhlbGQgaW50ZXJhY3Rpb24gbG9nZ2VkIHRocm91Z2ggYGxvZ19jYWxsYCAvIGBsb2dfbWVldGluZ2BcbiAqIChgc3JjL3NhbGVzL2FjdGlvbnMvYWN0aXZpdHktYWN0aW9ucy50c2ApIHdyaXRlcyB0aHJlZSB0aGluZ3M6IHRoZVxuICogYGNybV9ldmVudGAsIGl0cyBhdHRlbmRlZXMsIGFuZCBvbmUgYHN5c19hY3Rpdml0eWAgcm93IFx1MjAxNCB0aGUgQURSLTAwNTJcbiAqIEFjdGl2aXR5UG9pbnRlciB0aGUgbGVhZCdzICoqQWN0aXZpdHkqKiB0YWIgcmVhZHNcbiAqIChgcmVjb3JkOmFjdGl2aXR5YCBcdTIxOTIgYHN5c19hY3Rpdml0eWAgYnkgYHsgb2JqZWN0X25hbWUsIHJlY29yZF9pZCB9YCwgZmlsdGVyZWRcbiAqIHRvIHRoZSBgdGFza2Aga2luZCwgd2hpY2ggaXMgYHR5cGU6ICdjb21wbGV0ZWQnYCkuIFRoZSBzZWVkcyBhYm92ZSBhdXRob3IgdGhlXG4gKiBmaXJzdCB0d28gZm9yIGV2ZXJ5IGhlbGQgbGVhZCBpbnRlcmFjdGlvbjsgdGhpcyBkYXRhc2V0IGF1dGhvcnMgdGhlIHRoaXJkLFxuICogZGVyaXZlZCBmcm9tIHRoZSBTQU1FIHNwZWNzIHNvIHRoZSB0d28gY2Fubm90IGRyaWZ0IGFwYXJ0LlxuICpcbiAqIGByZWNvcmRfaWRgIGFuZCBgc291cmNlX2lkYCBjYXJyeSBOQVRVUkFMIEtFWVMgXHUyMDE0IHRoZSBsZWFkJ3MgZW1haWwgYW5kIHRoZVxuICogZXZlbnQncyBzdWJqZWN0LiBCb3RoIGFyZSBgcmVmZXJlbmNlVmlhYCBwb2ludGVyIHBhaXJzIG9uIHRoZSBwbGF0Zm9ybSBvYmplY3RcbiAqIChgcmVjb3JkX2lkYCBcdTIxOTQgYG9iamVjdF9uYW1lYCwgYHNvdXJjZV9pZGAgXHUyMTk0IGBzb3VyY2Vfb2JqZWN0YCksIHNvIHRoZSBzZWVkXG4gKiBsb2FkZXIgcmVzb2x2ZXMgZWFjaCBhZ2FpbnN0IHRoZSBvYmplY3QgaXRzIHNpYmxpbmcgY29sdW1uIG5hbWVzIGFuZFxuICogcmVmdXNlcyBhbiB1bnJlc29sdmFibGUgb25lIGxvdWRseSByYXRoZXIgdGhhbiBzdG9yaW5nIHRoZSBsaXRlcmFsLlxuICpcbiAqIFR3byBwbGF0Zm9ybSBmYWN0cyBib3VuZCB3aGF0IGlzIGF1dGhvcmVkIGhlcmU6XG4gKlxuICogICAtIGBzeXNfYWN0aXZpdHlgIGlzIGBsaWZlY3ljbGUuY2xhc3M6ICd0ZWxlbWV0cnknYCB3aXRoXG4gKiAgICAgYHJldGVudGlvbjogeyBtYXhBZ2U6ICcxNGQnIH1gLCBzbyBvbmx5IGludGVyYWN0aW9ucyB5b3VuZ2VyIHRoYW4gYVxuICogICAgIGZvcnRuaWdodCBhcmUgc2VlZGVkIFx1MjAxNCBhbiBvbGRlciByb3cgd291bGQgYmUgcmVhcGVkIGJlZm9yZSBhbnlvbmUgZGVtb3NcbiAqICAgICBpdC4gVGhlIGZpbHRlciBiZWxvdyBlbmZvcmNlcyB0aGF0IHJhdGhlciB0aGFuIHRydXN0aW5nIHRoZSBzcGVjIGxpc3QuXG4gKiAgIC0gQSBzZWVkIGNhbm5vdCBuYW1lIGEgdXNlciwgc28gYGFjdG9yX2lkYCAvIGBhY3Rvcl9uYW1lYCBhcmUgbm90IGF1dGhvcmVkXG4gKiAgICAgKHNlZSBgb2JqZWN0c3RhY2suY29tcG9zaXRpb24udHNgLCBcIkEgc2VlZCBjYW4ndCBuYW1lIGEgdXNlclwiKS4gVGhlXG4gKiAgICAgYWN0aW9uIHN0YW1wcyB0aGUgcmVwIGF0IHJ1bnRpbWUsIHdoZXJlIHRoZSBpZCBleGlzdHMuXG4gKi9cbmNvbnN0IFNZU19BQ1RJVklUWV9SRVRFTlRJT05fREFZUyA9IDE0O1xuXG4vKipcbiAqIFRoZSBzdW1tYXJ5IHByZWZpeCBvZiB0aGUgYWN0aW9uIHRoYXQgbG9ncyBlYWNoIGhlbGQgZXZlbnQgdHlwZSBcdTIwMTQgdGhlIHR3b1xuICogd3JpdGVycyB0aGF0IGV4aXN0IChgTE9HX0NBTExfU1BFQ2AgLyBgTE9HX01FRVRJTkdfU1BFQ2ApLiBBIGhlbGQgZXZlbnQgb2ZcbiAqIGFueSBvdGhlciB0eXBlIGhhcyBubyBhY3Rpb24gdGhhdCB3b3VsZCBoYXZlIHdyaXR0ZW4gYSBwb2ludGVyIGZvciBpdCwgc28gaXRcbiAqIGdldHMgbm9uZSBoZXJlIGVpdGhlcjogdGhpcyBkYXRhc2V0IG1pcnJvcnMgYSB3cml0ZXIsIGl0IGlzIG5vdCBhIGZvdXJ0aCBvbmUuXG4gKi9cbmNvbnN0IExPR0dFRF9TVU1NQVJZX1BSRUZJWDogUGFydGlhbDxSZWNvcmQ8RXZlbnRTcGVjWyd0eXBlJ10sIHN0cmluZz4+ID0ge1xuICBjYWxsOiAnJyxcbiAgbWVldGluZzogJ01lZXRpbmc6ICcsXG59O1xuXG5leHBvcnQgY29uc3QgbGVhZEludGVyYWN0aW9uUG9pbnRlcnMgPSB7XG4gIG9iamVjdDogJ3N5c19hY3Rpdml0eScsXG4gIG1vZGU6ICd1cHNlcnQnIGFzIGNvbnN0LFxuICAvLyBPbmUgdGltZWxpbmUgcG9pbnRlciBwZXIgcmljaCBzb3VyY2UgcmVjb3JkLCBleGFjdGx5IGFzIHRoZSBhY3Rpb24gd3JpdGVzXG4gIC8vIGl0LiBNYXRjaGVkIG9uIHRoZSBSRVNPTFZFRCBpZHMsIHNvIHJlcGxheSBib290cyBkZWR1cGUuXG4gIGV4dGVybmFsSWQ6IFsnc291cmNlX29iamVjdCcsICdzb3VyY2VfaWQnXSxcbiAgcmVjb3JkczogRVZFTlRfU1BFQ1MuZmlsdGVyKFxuICAgIChzcGVjKSA9PlxuICAgICAgc3BlYy5yZWxhdGVkVHlwZSA9PT0gJ2NybV9sZWFkJyAmJlxuICAgICAgc3BlYy5zdGF0dXMgPT09ICdoZWxkJyAmJlxuICAgICAgTE9HR0VEX1NVTU1BUllfUFJFRklYW3NwZWMudHlwZV0gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgc3BlYy5kYXlzQWdvID49IDAgJiZcbiAgICAgIHNwZWMuZGF5c0FnbyA8IFNZU19BQ1RJVklUWV9SRVRFTlRJT05fREFZUyxcbiAgKS5tYXAoKHNwZWMpID0+IHtcbiAgICBjb25zdCBbZW5kSG91ciwgZW5kTWludXRlXSA9IGVuZENsb2NrKHNwZWMpO1xuICAgIHJldHVybiB7XG4gICAgICAvLyBgaGVsZGAgaXMgd2hhdCBib3RoIGFjdGlvbnMgd3JpdGUgYXMgYGNvbXBsZXRlZGAgXHUyMDE0IHRoZSBgdGFza2AgZmVlZFxuICAgICAgLy8ga2luZCwgdGhlIG9uZSB0aGUgbGVhZCBBY3Rpdml0eSB0YWIgcmVuZGVycy5cbiAgICAgIHR5cGU6ICdjb21wbGV0ZWQnLFxuICAgICAgLy8gVGhlIGFjdGlvbidzIG93biBzdW1tYXJ5OiBwcmVmaXgsIHN1YmplY3QsIGR1cmF0aW9uIGluIGJyYWNrZXRzLlxuICAgICAgc3VtbWFyeTogYCR7TE9HR0VEX1NVTU1BUllfUFJFRklYW3NwZWMudHlwZV19JHtzcGVjLnN1YmplY3R9ICgke3NwZWMubWludXRlc30gbWluKWAsXG4gICAgICAvLyBMb2dnZWQgd2hlbiB0aGUgc2xvdCBlbmRlZC5cbiAgICAgIHRpbWVzdGFtcDogY2VsQ2xvY2soc3BlYy5kYXlzQWdvLCBlbmRIb3VyLCBlbmRNaW51dGUpLFxuICAgICAgb2JqZWN0X25hbWU6ICdjcm1fbGVhZCcsXG4gICAgICByZWNvcmRfaWQ6IHNwZWMucmVsYXRlZEtleSxcbiAgICAgIHNvdXJjZV9vYmplY3Q6ICdjcm1fZXZlbnQnLFxuICAgICAgc291cmNlX2lkOiBzcGVjLnN1YmplY3QsXG4gICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBraW5kOiBzcGVjLnR5cGUsXG4gICAgICAgIGR1cmF0aW9uX21pbnV0ZXM6IHNwZWMubWludXRlcyxcbiAgICAgICAgbm90ZXM6IHNwZWMub3V0Y29tZSA/PyAnJyxcbiAgICAgICAgYXR0ZW5kZWVfY291bnQ6IHNwZWMuYXR0ZW5kZWVzLmxlbmd0aCxcbiAgICAgIH0pLFxuICAgIH07XG4gIH0pLFxufTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGEvZm9yZWNhc3Quc2VlZC50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGEvZm9yZWNhc3Quc2VlZC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBGb3JlY2FzdCBzZWVkcyBcdTIwMTQgdGhlIHF1YXJ0ZXJseSBhbmQgbW9udGhseSBzbmFwc2hvdCByb3dzLlxuICpcbiAqIGBjcm1fZm9yZWNhc3RgIGlzIGEgc2FsZXMgb2JqZWN0IChwbGFuIGl0ZW0gNDogdGhlIGN1c3RvbWVyIGNvcmUgYW5kIHRoZVxuICogYWN0aXZpdHkgb2JqZWN0cyBmb2xkIGludG8gdGhlIGFwcCBwYWNrYWdlKSwgc28gaXRzIHNlZWQgcm93cyBhcmUgc2FsZXMnIFx1MjAxNFxuICogdGhleSB3ZXJlIGF1dGhvcmVkIGluIGBzcmMvZGF0YS9yZXZlbnVlLnNlZWQudHNgIGJlY2F1c2UgYSBmb3JlY2FzdCBpcyBhXG4gKiByZXZlbnVlIE5VTUJFUiwgYnV0IHRoZSBhc3NpZ25tZW50IHJ1bGUgZm9sbG93cyB0aGUgb2JqZWN0LCBub3QgdGhlIHN1YmplY3QuXG4gKiBTZWVkIGRvY3RyaW5lIGxpdmVzIGluIGAuL19zaGFyZWQudHNgLlxuICovXG5pbXBvcnQgeyBkZWZpbmVTZWVkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgeyBGb3JlY2FzdCB9IGZyb20gJy4uL29iamVjdHMvZm9yZWNhc3Qub2JqZWN0JztcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEZvcmVjYXN0cyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIGBvd25lcl9pZGAgaXMgbGVmdCB1bnNldDogYSBzZWVkIGNhbm5vdCBuYW1lIGEgdXNlciBhbmQgc2VlZCB3cml0ZXMgcnVuXG4vLyBgaXNTeXN0ZW1gLCBzbyBub3RoaW5nIHN0YW1wcyBpdCBcdTIwMTQgb3duZXJzaGlwIGlzIGJhY2tmaWxsZWQgYnkgdGhlIHBsYXRmb3JtJ3Ncbi8vIHNlZWQtb3duZXJzaGlwIGNsYWltIHdoZW4gdGhlIHNlZWQgc2V0dGxlcywgd2hpY2ggY292ZXJzIGBjcm1fZm9yZWNhc3RgXG4vLyBhbG9uZ3NpZGUgZXZlcnkgb3RoZXIgb3duZXItc2NvcGVkIG9iamVjdCAoIzcwMiwgIzE4OTIpLiBTZWUgdGhlIG5vdGUgb25cbi8vIG93bmVyc2hpcCBpbiBgb2JqZWN0c3RhY2suY29tcG9zaXRpb24udHNgLlxuLy9cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBPTkUgUFJPRFVDRVIgUEVSIFdJTkRPVyAoIzcwMikgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vL1xuLy8gYGZvcmVjYXN0X3NuYXBzaG90YCAoIzU5MCkgdXBzZXJ0cyB0aGUgcm93IHdob3NlIHdpbmRvdyBjb250YWlucyB0b2RheSwgYW5kXG4vLyBpdHMgbG9va3VwIGlzIE9XTkVSLVNDT1BFRDpcbi8vXG4vLyAgICAgeyBvd25lcl9pZDogJ3tjdXJyZW50T3duZXIuaWR9JywgcGVyaW9kOiAncXVhcnRlcicsXG4vLyAgICAgICBwZXJpb2Rfc3RhcnQ6IHsgJGx0ZTogJ3tUT0RBWSgpfScgfSwgcGVyaW9kX2VuZDogeyAkZ3RlOiAne1RPREFZKCl9JyB9IH1cbi8vXG4vLyBBIHNlZWRlZCByb3cgaW4gdGhhdCBzYW1lIHdpbmRvdyBjYW4gbmV2ZXIgc2F0aXNmeSB0aGF0IGZpbHRlciBhdCB0aGUgbW9tZW50XG4vLyB0aGUgc3dlZXAgcmVhZHMgaXQgXHUyMDE0IHRoZSBzZWVkIHdyaXRlcyBubyBvd25lciwgYW5kIHRoZSBjbGFpbSBpcyBhIHNlcGFyYXRlLFxuLy8gbGF0ZXIgc3dlZXAgXHUyMDE0IHNvIHRoZSBmbG93IGNvbmNsdWRlcyB0aGUgcGVyaW9kIGlzIG1pc3NpbmcgYW5kIG9wZW5zIGEgU0VDT05EXG4vLyByb3cgYmVzaWRlIGl0LiBCb3RoIHNwYW4gdGhlIHNhbWUgcXVhcnRlcjsgb25lIGhhcyBhbiBvd25lciBhbmQgb25lIGRvZXMgbm90LlxuLy8gRXZlcnkgb3duZXItZ3JvdXBlZCBjb25zdW1lciB0aGVuIHJlbmRlcnMgYSBwaGFudG9tLCBvd25lcmxlc3MgZHVwbGljYXRlIGZvclxuLy8gdGhlIGN1cnJlbnQgcXVhcnRlciwgb24gZXZlcnkgcmUtc2VlZGVkIGRldiBib290IChgcXVvdGFfYXR0YWlubWVudF9ieV9yZXBgXG4vLyBtb3N0IHZpc2libHksIHNpbmNlIGl0IHBpbnMgZXhhY3RseSB0aGF0IHdpbmRvdykuXG4vL1xuLy8gQ2xhaW1pbmcgdGhlIHJvdyBkb2VzIG5vdCBmaXggdGhhdCwgaXQgb25seSByZS1sYWJlbHMgdGhlIHBoYW50b206IHdoaWNoZXZlclxuLy8gb2YgdGhlIHR3byBzY2hlZHVsZWQgc3dlZXBzIHJlYWNoZXMgdGhlIHdpbmRvdyBmaXJzdCBkZWNpZGVzIHdoZXRoZXIgdGhlXG4vLyBzZWNvbmQgb25lIGFkb3B0cyB0aGUgcm93IG9yIGR1cGxpY2F0ZXMgaXQsIGFuZCBhIGR1cGxpY2F0ZSBuZXZlciBoZWFscy5cbi8vXG4vLyBTbyB0aGUgc2VlZHMgc3RvcCBhdCB0aGUgd2luZG93J3MgZWRnZS4gVGhleSBzaGlwIFNFVFRMRUQgcXVhcnRlcnMgb25seSwgcGx1c1xuLy8gdGhlIGN1cnJlbnQgTU9OVEggXHUyMDE0IGEgd2luZG93IG5vIHJ1bnRpbWUgd3JpdGVyIHRvdWNoZXMsIHNpbmNlIHRoZSBzd2VlcCdzXG4vLyBwZXJpb2QgaXMgZml4ZWQgdG8gYHF1YXJ0ZXJgLiBUaGUgY3VycmVudCBxdWFydGVyIGJlbG9uZ3MgdG9cbi8vIGBmb3JlY2FzdF9zbmFwc2hvdGAgYWxvbmUuIGB0ZXN0L2ZvcmVjYXN0LXNlZWRzLnRlc3QudHNgIGRlcml2ZXMgdGhlXG4vLyBmb3JiaWRkZW4gd2luZG93IGZyb20gdGhlIGZsb3cncyBvd24gbG9va3VwIGZpbHRlciBhbmQgZmFpbHMgb24gYW55IHNlZWRlZFxuLy8gcm93IHRoYXQgbGFuZHMgaW5zaWRlIGl0LlxuLy9cbi8vIFRoZSBjb3N0LCBzdGF0ZWQgcmF0aGVyIHRoYW4gaGlkZGVuOiBvbiBhIGZyZXNobHkgc2VlZGVkIG9yZyB0aGUgU2FsZXNcbi8vIGRhc2hib2FyZCdzICpRdW90YSBBdHRhaW5tZW50IGJ5IFJlcCogdGFibGUgaXMgZW1wdHkgdW50aWwgdGhlIDAzOjAwIHN3ZWVwXG4vLyBvcGVucyB0aGUgcXVhcnRlcidzIHJvd3MsIGFuZCB0aGVpciBgcXVvdGFgIHN0YXlzIGJsYW5rIHVudGlsIHNvbWVvbmUgc2V0c1xuLy8gb25lIGJ5IGhhbmQgKGBxdW90YWAgaGFzIG5vIGF1dG9tYXRlZCB3cml0ZXIgXHUyMDE0IHNlZSBgZm9yZWNhc3Qub2JqZWN0LnRzYCkuXG4vLyBUaGF0IGlzIHRoZSBzYW1lIGhvbmVzdC1lbXB0eSBzdGF0ZSB0aGUgd2lkZ2V0IGFscmVhZHkgY2hvb3NlcyBhdCBhIHF1YXJ0ZXJcbi8vIGJvdW5kYXJ5OyB0aGUgYWx0ZXJuYXRpdmUgd2FzIGEgcm93IGF0dHJpYnV0ZWQgdG8gbm9ib2R5LCBjYXJyeWluZyBhIHF1b3RhIG5vXG4vLyByZXAgaXMgb24gdGhlIGhvb2sgZm9yLlxuLy9cbi8vIFBlcmlvZHMgYXJlIFJFQUwgY2FsZW5kYXIgcGVyaW9kcywgbGFiZWxsZWQgZXhhY3RseSB0aGUgd2F5XG4vLyBmb3JlY2FzdC5ob29rLnRzIGRlcml2ZXMgdGhlbSAoJ1EzIDIwMjYnIC8gJ0F1ZyAyMDI2JykgXHUyMDE0IGhvb2tzIGRvbid0IHJ1blxuLy8gb3ZlciBzZWVkcywgYW5kIHRoZSBob29rIG9ubHkgZmlsbHMgYSBCTEFOSyBwZXJpb2RfbGFiZWwsIHNvIHNlZWRlZCByb3dzXG4vLyBtdXN0IHNwZWFrIHRoZSBzYW1lIGRpYWxlY3QgYXMgcnVudGltZSBzbmFwc2hvdHMgb3IgbGlzdCB2aWV3cyBlbmQgdXBcbi8vIG1peGluZyAnVGhpcyBRdWFydGVyJyB3aXRoICdRMyAyMDI2JyAoIzQ5MCkuIENhbGVuZGFyLXRydWUgYHBlcmlvZF9zdGFydGBcbi8vIHZhbHVlcyBjYXJyeSB0aGUgc2FtZSBvYmxpZ2F0aW9uIG9uIHRoZSBRVUVSWSBzaWRlOiBgcGVyaW9kX3N0YXJ0YCBpcyBvbmVcbi8vIGhhbGYgb2YgdGhlIChvd25lciwgcGVyaW9kLCBwZXJpb2Rfc3RhcnQpIGtleSB0aGUgc25hcHNob3Qgc3dlZXAgdXBzZXJ0cyBvbixcbi8vIHRoZSBvYmplY3QgaW5kZXhlcywgYW5kIGV2ZXJ5IHBlcmlvZC1zY29wZWQgc3VyZmFjZSBwaW5zIGJ5IGVxdWFsaXR5IFx1MjAxNCBhXG4vLyB2YWx1ZSB0aGF0IGlzIG5vdCB0aGUgcGVyaW9kJ3MgcmVhbCBmaXJzdCBkYXkgbmFtZXMgYSByb3cgbm8gc3VjaCBmaWx0ZXIgY2FuXG4vLyBldmVyIHNlbGVjdCwgYW5kIG5vIHJvbGx1cCBjYW4gbGluZSB1cCBhZ2FpbnN0IGl0cyBuZWlnaGJvdXJzLlxuLy9cbi8vIFdoYXQgdGhlc2Ugcm93cyBtdXN0IE5PVCBkbyBpcyBhbnN3ZXIgYSBDVVJSRU5ULXF1YXJ0ZXIgZmlsdGVyOiBwZXIgIzcwMiB0aGF0XG4vLyB3aW5kb3cgYmVsb25ncyB0byBgZm9yZWNhc3Rfc25hcHNob3RgIGFsb25lLCBzbyB0aGUgc2VlZHMgYmVsb3cgc2hpcCBzZXR0bGVkXG4vLyBxdWFydGVycyBwbHVzIHRoZSBjdXJyZW50IG1vbnRoLCBhbmQgYHRoaXNfcXVhcnRlcl9mb3JlY2FzdHNgIC9cbi8vIGBxdW90YV9hdHRhaW5tZW50X2J5X3JlcGAgY29ycmVjdGx5IHJldHVybiBub25lIG9mIHRoZW0uXG4vL1xuLy8gKFRoZSBzZW50ZW5jZSB0aGF0IHN0b29kIGhlcmUgc2FpZCB0aGUgb3Bwb3NpdGUgXHUyMDE0IHRoYXQgdGhlc2UgdmFsdWVzIG1ha2UgdGhlXG4vLyBgdGhpc19xdWFydGVyX2ZvcmVjYXN0c2AgdmlldydzIGB7dGhpc19xdWFydGVyX3N0YXJ0fWAgZmlsdGVyIFwibWF0Y2ggdGhlXG4vLyBzZWVkZWQgcm93XCIuIENvcnJlY3RlZCBpbiAjNzQ0LCBhbmQgaXQgd2FzIHdyb25nIHRocmVlIHdheXM6XG4vLyBge3RoaXNfcXVhcnRlcl9zdGFydH1gIGlzIG5vdCBpbiB0aGUgdG9rZW4gdm9jYWJ1bGFyeSBcdTIwMTQgdGhlIHNwZWxsaW5nIGlzXG4vLyBge2N1cnJlbnRfcXVhcnRlcl9zdGFydH1gLCBhbmQgc2luY2UgMTcuMC4wLXJjLjAgdGhlIG1pc3NwZWxsaW5nIHRocm93c1xuLy8gYFVucmVzb2x2YWJsZSBmaWx0ZXIgcGxhY2Vob2xkZXJgIGluc3RlYWQgb2Ygc2lsZW50bHkgbWF0Y2hpbmcgbm90aGluZzsgdGhlXG4vLyBmaWx0ZXIgaXRzZWxmIHdhcyByZW1vdmVkIGZyb20gdGhlIHZpZXcgaW4gIzUxNSBhbmQgb25seSBjYW1lIGJhY2sgaW4gIzczMDtcbi8vIGFuZCBtYXRjaGluZyBpcyB0aGUgb3V0Y29tZSAjNzAyIHJ1bGVzIG91dC4pXG4vL1xuLy8gQ29tcHV0ZWQgaW4gcGxhaW4gVFMgKFVUQywgbWlycm9yaW5nIHRoZSBob29rJ3MgaGVscGVycyk6IHRoaXMgbW9kdWxlIGlzXG4vLyBldmFsdWF0ZWQgd2hlbiB0aGUgYXBwIGJ1bmRsZSBsb2FkcywgdGhlIHNhbWUgbW9tZW50IHRoZSBjZWxgLi4uYCBzZWVkc1xuLy8gYXJlIHJlc29sdmVkLlxuY29uc3QgRk9SRUNBU1RfTU9OVEhTID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuY29uc3QgZm9yZWNhc3RJc29EYXRlID0gKGQ6IERhdGUpID0+XG4gIGAke2QuZ2V0VVRDRnVsbFllYXIoKX0tJHtTdHJpbmcoZC5nZXRVVENNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKX0tJHtTdHJpbmcoZC5nZXRVVENEYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbmNvbnN0IGZvcmVjYXN0UXVhcnRlckxhYmVsID0gKGQ6IERhdGUpID0+IGBRJHtNYXRoLmZsb29yKGQuZ2V0VVRDTW9udGgoKSAvIDMpICsgMX0gJHtkLmdldFVUQ0Z1bGxZZWFyKCl9YDtcbmNvbnN0IGZvcmVjYXN0TW9udGhMYWJlbCA9IChkOiBEYXRlKSA9PiBgJHtGT1JFQ0FTVF9NT05USFNbZC5nZXRVVENNb250aCgpXX0gJHtkLmdldFVUQ0Z1bGxZZWFyKCl9YDtcbmNvbnN0IGZvcmVjYXN0Tm93ID0gbmV3IERhdGUoKTtcbmNvbnN0IGZvcmVjYXN0WWVhciA9IGZvcmVjYXN0Tm93LmdldFVUQ0Z1bGxZZWFyKCk7XG5jb25zdCBmb3JlY2FzdE1vbnRoID0gZm9yZWNhc3ROb3cuZ2V0VVRDTW9udGgoKTtcbmNvbnN0IGZvcmVjYXN0UXVhcnRlck1vbnRoID0gTWF0aC5mbG9vcihmb3JlY2FzdE1vbnRoIC8gMykgKiAzO1xuLy8gTm8gYHRoaXNRdWFydGVyU3RhcnRgIC8gYHRoaXNRdWFydGVyRW5kYDogdGhhdCB3aW5kb3cgaXMgYGZvcmVjYXN0X3NuYXBzaG90YCdzXG4vLyBhbmQgbm90aGluZyBoZXJlIG1heSBvcGVuIGEgcm93IGluIGl0ICgjNzAyLCBub3RlIGFib3ZlKS5cbmNvbnN0IHRoaXNNb250aFN0YXJ0ID0gbmV3IERhdGUoRGF0ZS5VVEMoZm9yZWNhc3RZZWFyLCBmb3JlY2FzdE1vbnRoLCAxKSk7XG5jb25zdCB0aGlzTW9udGhFbmQgPSBuZXcgRGF0ZShEYXRlLlVUQyhmb3JlY2FzdFllYXIsIGZvcmVjYXN0TW9udGggKyAxLCAwKSk7XG5jb25zdCBsYXN0UXVhcnRlclN0YXJ0ID0gbmV3IERhdGUoRGF0ZS5VVEMoZm9yZWNhc3RZZWFyLCBmb3JlY2FzdFF1YXJ0ZXJNb250aCAtIDMsIDEpKTtcbmNvbnN0IGxhc3RRdWFydGVyRW5kID0gbmV3IERhdGUoRGF0ZS5VVEMoZm9yZWNhc3RZZWFyLCBmb3JlY2FzdFF1YXJ0ZXJNb250aCwgMCkpO1xuLy8gRGVlcGVyIGhpc3Rvcnk6IHF1b3RhLWF0dGFpbm1lbnQgYW5kIGNvdmVyYWdlIHRyZW5kcyBuZWVkIG1vcmUgdGhhbiBhIHNpbmdsZVxuLy8gcHJpb3IgcGVyaW9kIHRvIHBsb3QgKCM1OTEpLiBUaGVzZSBhcmUgYWxsIFNFVFRMRUQgcGVyaW9kcyBcdTIwMTQgZGVsaWJlcmF0ZWx5IHNvOlxuLy8gdGhlIGZvcmVjYXN0IHNuYXBzaG90IHN3ZWVwIHVwc2VydHMgdGhlIENVUlJFTlQgcXVhcnRlciwgc28gaGlzdG9yaWNhbCByb3dzXG4vLyBjYW4gbmV2ZXIgY29sbGlkZSB3aXRoIHdoYXQgaXQgd3JpdGVzLiBUaGF0IHJ1bGUgaXMgbm93IHRoZSB3aG9sZSBydWxlIGZvclxuLy8gcXVhcnRlcnMgKCM3MDIpOiBldmVyeSBxdWFydGVybHkgc2VlZCBiZWxvdyBpcyBzZXR0bGVkLlxuY29uc3QgcXVhcnRlclN0YXJ0QWdvID0gKG46IG51bWJlcikgPT4gbmV3IERhdGUoRGF0ZS5VVEMoZm9yZWNhc3RZZWFyLCBmb3JlY2FzdFF1YXJ0ZXJNb250aCAtIDMgKiBuLCAxKSk7XG5jb25zdCBxdWFydGVyRW5kQWdvID0gKG46IG51bWJlcikgPT4gbmV3IERhdGUoRGF0ZS5VVEMoZm9yZWNhc3RZZWFyLCBmb3JlY2FzdFF1YXJ0ZXJNb250aCAtIDMgKiAobiAtIDEpLCAwKSk7XG5jb25zdCBtb250aFN0YXJ0QWdvID0gKG46IG51bWJlcikgPT4gbmV3IERhdGUoRGF0ZS5VVEMoZm9yZWNhc3RZZWFyLCBmb3JlY2FzdE1vbnRoIC0gbiwgMSkpO1xuY29uc3QgbW9udGhFbmRBZ28gPSAobjogbnVtYmVyKSA9PiBuZXcgRGF0ZShEYXRlLlVUQyhmb3JlY2FzdFllYXIsIGZvcmVjYXN0TW9udGggLSBuICsgMSwgMCkpO1xuXG4vKipcbiAqIFRoZSB0aHJlZSBvcGVuLXBpcGVsaW5lIGJ1Y2tldHMgb2YgYSBzZXR0bGVkIHNuYXBzaG90LCBpbiB0aGUgc2hhcGUgdGhlXG4gKiBmb3JlY2FzdCBvYmplY3QgZGVmaW5lcyB0aGVtIChgc3JjL3NhbGVzL29iamVjdHMvZm9yZWNhc3Qub2JqZWN0LnRzYCkuXG4gKlxuICogVGhlIGJ1Y2tldHMgYXJlIENVTVVMQVRJVkUgc3Vic2V0cyBvZiBvbmUgYW5vdGhlciwgc28gZXZlcnkgcm93IHNhdGlzZmllc1xuICogYHBpcGVsaW5lID49IGJlc3RDYXNlID49IGNvbW1pdGAuIE5hbWVkIHJhdGhlciB0aGFuIHBvc2l0aW9uYWw6IHRocmVlIGJhcmVcbiAqIG51bWJlcnMgaW4gYSByb3cgb2YgZWlnaHQgYXJndW1lbnRzIGlzIHRoZSBzaGFwZSBhIGxhdGVyIGVkaXQgdHJhbnNwb3Nlc1xuICogd2l0aG91dCBhbnl0aGluZyBub3RpY2luZy5cbiAqL1xudHlwZSBPcGVuQnVja2V0cyA9IHsgcGlwZWxpbmU6IG51bWJlcjsgYmVzdENhc2U6IG51bWJlcjsgY29tbWl0OiBudW1iZXIgfTtcblxuLyoqXG4gKiBBIHNldHRsZWQgKHBhc3QpIHBlcmlvZCBzbmFwc2hvdCwgY2FwdHVyZWQgb24gdGhlIGRheSB0aGUgcGVyaW9kIGNsb3NlZC5cbiAqXG4gKiBgb3BlbmAgaXMgd2hhdCB3YXMgc3RpbGwgT1BFTiBpbiB0aGUgcGVyaW9kIGF0IHRoYXQgbW9tZW50IFx1MjAxNCB0aGUgZGVhbHMgdGhhdFxuICogaGFkIG5vdCByZXNvbHZlZCBieSB0aGUgbGFzdCBkYXkgYW5kIHdlbnQgb24gdG8gc2xpcCBpbnRvIHRoZSBuZXh0IHBlcmlvZC5cbiAqXG4gKiBUaGVzZSByb3dzIGNhcnJpZWQgYDBgIGZvciBhbGwgdGhyZWUgYnVja2V0cyB1bnRpbCAjMTI0NC4gVGhlIHRoZW9yeSB3YXNcbiAqIFwiYSBjbG9zZWQgcGVyaW9kIGhhcyBubyBwaXBlbGluZSBsZWZ0XCIsIGFuZCBpdCBpcyB0aGUgb25lIHJlYWRpbmcgYVxuICogcGVyaW9kLUVORCBzbmFwc2hvdCBjYW5ub3QgaGF2ZTogYSBwZXJpb2QgZW5kcyB3aXRoIGRlYWxzIHN0aWxsIG9wZW4sIHdoaWNoXG4gKiBpcyBleGFjdGx5IHdoYXQgdGhlIFwic2xpcHBlZCBpbnRvIHRoZSBuZXh0IHF1YXJ0ZXJcIiBub3RlIGJlbG93IGRlc2NyaWJlcy5cbiAqIFRoZSBjb3N0IHdhcyBub3QgY29zbWV0aWMgXHUyMDE0IGBwaXBlbGluZV9hbW91bnRgLCBgYmVzdF9jYXNlX2Ftb3VudGAsXG4gKiBgY29tbWl0X2Ftb3VudGAgYW5kIHRoZSBgY292ZXJhZ2VfcmF0aW9gIGZvcm11bGEgdGhhdCBkaXZpZGVzIGJ5IHRoZSBmaXJzdFxuICogb2YgdGhlbSBhcmUgZm91ciBvZiB0aGUgdGhpcnRlZW4gY29sdW1ucyB0aGUgZm9yZWNhc3QgbGlzdCByZW5kZXJzLCBzbyB0aGVcbiAqIG1vZHVsZSBvcGVuZWQgb24gc2l4IHJvd3Mgb2YgemVyb3MgYW5kIGNvdWxkIG5vdCBhbnN3ZXIgdGhlIHF1ZXN0aW9uIHRoZVxuICogb2JqZWN0IGV4aXN0cyBmb3IuXG4gKlxuICogTk9UIGEgbGljZW5jZSB0byBzZWVkIHRoZSBDVVJSRU5UIHF1YXJ0ZXI6IHRoYXQgd2luZG93IGhhcyBleGFjdGx5IG9uZVxuICogcHJvZHVjZXIsIGBmb3JlY2FzdF9zbmFwc2hvdGAgKCM3MDIpLCBhbmQgdGhlIG5vdGUgYWJvdmUgaXMgdGhlIHdob2xlIHJ1bGUuXG4gKiBQaW5uZWQgYnkgYHRlc3QvZm9yZWNhc3Qtc2VlZHMudGVzdC50c2AuXG4gKi9cbmNvbnN0IGNsb3NlZFBlcmlvZCA9IChcbiAgc2VlZF9rZXk6IHN0cmluZyxcbiAgcGVyaW9kOiAnbW9udGgnIHwgJ3F1YXJ0ZXInLFxuICBzdGFydDogRGF0ZSxcbiAgZW5kOiBEYXRlLFxuICBxdW90YTogbnVtYmVyLFxuICBjbG9zZWQ6IG51bWJlcixcbiAgb3BlbjogT3BlbkJ1Y2tldHMsXG4gIG5vdGVzOiBzdHJpbmcsXG4pID0+ICh7XG4gIHNlZWRfa2V5LFxuICBwZXJpb2QsXG4gIHBlcmlvZF9sYWJlbDogcGVyaW9kID09PSAncXVhcnRlcicgPyBmb3JlY2FzdFF1YXJ0ZXJMYWJlbChzdGFydCkgOiBmb3JlY2FzdE1vbnRoTGFiZWwoc3RhcnQpLFxuICBwZXJpb2Rfc3RhcnQ6IGZvcmVjYXN0SXNvRGF0ZShzdGFydCksXG4gIHBlcmlvZF9lbmQ6IGZvcmVjYXN0SXNvRGF0ZShlbmQpLFxuICBzbmFwc2hvdF9kYXRlOiBmb3JlY2FzdElzb0RhdGUoZW5kKSxcbiAgcXVvdGEsXG4gIHBpcGVsaW5lX2Ftb3VudDogb3Blbi5waXBlbGluZSxcbiAgYmVzdF9jYXNlX2Ftb3VudDogb3Blbi5iZXN0Q2FzZSxcbiAgY29tbWl0X2Ftb3VudDogb3Blbi5jb21taXQsXG4gIGNsb3NlZF9hbW91bnQ6IGNsb3NlZCxcbiAgc291cmNlOiAnc2NoZWR1bGVkJyBhcyBjb25zdCxcbiAgbm90ZXMsXG59KTtcblxuLy8gVXBzZXJ0IGlkZW50aXR5IGlzIHRoZSBzeW50aGV0aWMgYHNlZWRfa2V5YCwgTk9UIGBwZXJpb2RfbGFiZWxgICgjNjEzKS5cbi8vIGBwZXJpb2RfbGFiZWxgIG5hbWVzIGEgU0VUIG9mIHJvd3Mgb25jZSB0aGUgZm9yZWNhc3Rfc25hcHNob3Qgc3dlZXAgKCM1OTApXG4vLyB3cml0ZXMgb25lIHBlciBhY3RpdmUgb3duZXIgcGVyIHF1YXJ0ZXIgXHUyMDE0IGFsbCByZWFkaW5nICdRMyAyMDI2JyBcdTIwMTQgYW5kIHRoZVxuLy8gbG9hZGVyIG1hdGNoZXMgYWdhaW5zdCB0aGUgd2hvbGUgdGFibGUsIHNvIGEgcmUtc2VlZCBjb3VsZCBvdmVyd3JpdGUgYSByZWFsXG4vLyByZXAncyBzbmFwc2hvdCB3aXRoIHRoZSBkZW1vIG51bWJlcnMuIFdoeSBhIHN5bnRoZXRpYyBrZXkgYW5kIG5vdCB0aGUgdHJ1ZVxuLy8gKG93bmVyLCBwZXJpb2QsIHBlcmlvZF9zdGFydCkgaWRlbnRpdHkgb3IgYW4gaW5zZXJ0LW9uY2UgbW9kZTogc2VlIHRoZVxuLy8gYHNlZWRfa2V5YCBkZWNsYXJhdGlvbiBpbiBgc3JjL3NhbGVzL29iamVjdHMvZm9yZWNhc3Qub2JqZWN0LnRzYC5cbi8vXG4vLyBUaGUga2V5cyBhcmUgUE9TSVRJT05BTCAoJ2N1cnJlbnQgbW9udGgnLCAndHdvIHF1YXJ0ZXJzIGJhY2snKSwgbm90IGNhbGVuZGFyXG4vLyB2YWx1ZXMsIGJlY2F1c2UgdGhlIHJlY29yZHMgYXJlIHBvc2l0aW9uYWwgXHUyMDE0IHJlY29tcHV0ZWQgYWdhaW5zdCBgbmV3IERhdGUoKWBcbi8vIG9uIGV2ZXJ5IGltcG9ydC4gQSBwb3NpdGlvbmFsIGtleSBrZWVwcyB0aGUgZGVtbyBhdCBleGFjdGx5IHRoZXNlIHNldmVuIHJvd3Ncbi8vIGFzIHRoZSBjYWxlbmRhciByb2xscyBmb3J3YXJkLCByZS1wb2ludGluZyBlYWNoIGF0IGl0cyBuZXcgcGVyaW9kOyBhXG4vLyBjYWxlbmRhci1kZXJpdmVkIGtleSB3b3VsZCBzdHJhbmQgbGFzdCBxdWFydGVyJ3MgZGVtbyByb3cgYW5kIGFkZCBvbmUgcm93IHBlclxuLy8gcmUtc2VlZC5cbi8vXG4vLyBUaGVyZSBpcyBubyBgZGVtb19xdWFydGVyX2N1cnJlbnRgOiB0aGUgY3VycmVudCBxdWFydGVyIGlzIHRoZSBvbmUgd2luZG93XG4vLyBgZm9yZWNhc3Rfc25hcHNob3RgIHdyaXRlcywgYW5kIHR3byBwcm9kdWNlcnMgaW4gb25lIHdpbmRvdyBpcyB3aGF0ICM3MDIgd2FzLlxuLy8gVGhlIGN1cnJlbnQgTU9OVEggc3RheXMgXHUyMDE0IHRoZSBzd2VlcCdzIHBlcmlvZCBpcyBgcXVhcnRlcmAsIHNvIG5vIHJ1bnRpbWVcbi8vIHdyaXRlciBvcGVucyBhIG1vbnRobHkgcm93LlxuZXhwb3J0IGNvbnN0IGZvcmVjYXN0cyA9IGRlZmluZVNlZWQoRm9yZWNhc3QsIHtcbiAgbW9kZTogJ3Vwc2VydCcsXG4gIGV4dGVybmFsSWQ6ICdzZWVkX2tleScsXG4gIHJlY29yZHM6IFtcbiAgICB7XG4gICAgICBzZWVkX2tleTogJ2RlbW9fbW9udGhfY3VycmVudCcsXG4gICAgICBwZXJpb2Q6ICdtb250aCcsXG4gICAgICBwZXJpb2RfbGFiZWw6IGZvcmVjYXN0TW9udGhMYWJlbCh0aGlzTW9udGhTdGFydCksXG4gICAgICBwZXJpb2Rfc3RhcnQ6IGZvcmVjYXN0SXNvRGF0ZSh0aGlzTW9udGhTdGFydCksXG4gICAgICBwZXJpb2RfZW5kOiBmb3JlY2FzdElzb0RhdGUodGhpc01vbnRoRW5kKSxcbiAgICAgIHNuYXBzaG90X2RhdGU6IGNlbGB0b2RheSgpYCxcbiAgICAgIHF1b3RhOiA1MDAwMDAsXG4gICAgICBwaXBlbGluZV9hbW91bnQ6IDc2MDAwMCxcbiAgICAgIGJlc3RfY2FzZV9hbW91bnQ6IDU0MDAwMCxcbiAgICAgIGNvbW1pdF9hbW91bnQ6IDM2MDAwMCxcbiAgICAgIGNsb3NlZF9hbW91bnQ6IDI5NTAwMCxcbiAgICAgIHNvdXJjZTogJ3NjaGVkdWxlZCcsXG4gICAgICBub3RlczogJ0hlYWx0aHkgY292ZXJhZ2U7IHR3byBjb21taXQgZGVhbHMgZXhwZWN0ZWQgdG8gY2xvc2UgdGhpcyB3ZWVrLicsXG4gICAgfSxcbiAgICB7XG4gICAgICBzZWVkX2tleTogJ2RlbW9fcXVhcnRlcl9taW51c18xJyxcbiAgICAgIHBlcmlvZDogJ3F1YXJ0ZXInLFxuICAgICAgcGVyaW9kX2xhYmVsOiBmb3JlY2FzdFF1YXJ0ZXJMYWJlbChsYXN0UXVhcnRlclN0YXJ0KSxcbiAgICAgIHBlcmlvZF9zdGFydDogZm9yZWNhc3RJc29EYXRlKGxhc3RRdWFydGVyU3RhcnQpLFxuICAgICAgcGVyaW9kX2VuZDogZm9yZWNhc3RJc29EYXRlKGxhc3RRdWFydGVyRW5kKSxcbiAgICAgIHNuYXBzaG90X2RhdGU6IGZvcmVjYXN0SXNvRGF0ZShsYXN0UXVhcnRlckVuZCksXG4gICAgICBxdW90YTogMTQwMDAwMCxcbiAgICAgIHBpcGVsaW5lX2Ftb3VudDogMjQwMDAwLFxuICAgICAgYmVzdF9jYXNlX2Ftb3VudDogMTUwMDAwLFxuICAgICAgY29tbWl0X2Ftb3VudDogOTUwMDAsXG4gICAgICBjbG9zZWRfYW1vdW50OiAxNDg1MDAwLFxuICAgICAgc291cmNlOiAnc2NoZWR1bGVkJyxcbiAgICAgIG5vdGVzOiAnQ2xvc2VkIGF0IDEwNiUgb2YgcXVvdGEuJyxcbiAgICB9LFxuICAgIGNsb3NlZFBlcmlvZCgnZGVtb19xdWFydGVyX21pbnVzXzInLCAncXVhcnRlcicsIHF1YXJ0ZXJTdGFydEFnbygyKSwgcXVhcnRlckVuZEFnbygyKSwgMTMwMDAwMCwgMTE5NjAwMCxcbiAgICAgIHsgcGlwZWxpbmU6IDI4NTAwMCwgYmVzdENhc2U6IDE5MDAwMCwgY29tbWl0OiAxMjAwMDAgfSxcbiAgICAgICdDbG9zZWQgYXQgOTIlIG9mIHF1b3RhIFx1MjAxNCB0d28gZW50ZXJwcmlzZSBkZWFscyBzbGlwcGVkIGludG8gdGhlIG5leHQgcXVhcnRlci4nKSxcbiAgICBjbG9zZWRQZXJpb2QoJ2RlbW9fcXVhcnRlcl9taW51c18zJywgJ3F1YXJ0ZXInLCBxdWFydGVyU3RhcnRBZ28oMyksIHF1YXJ0ZXJFbmRBZ28oMyksIDEyMDAwMDAsIDEzMDgwMDAsXG4gICAgICB7IHBpcGVsaW5lOiAxOTUwMDAsIGJlc3RDYXNlOiAxMzAwMDAsIGNvbW1pdDogODUwMDAgfSxcbiAgICAgICdDbG9zZWQgYXQgMTA5JSBvZiBxdW90YSwgY2FycmllZCBieSB0aGUgZW50ZXJwcmlzZSByZW5ld2FsIGNvaG9ydC4nKSxcbiAgICBjbG9zZWRQZXJpb2QoJ2RlbW9fcXVhcnRlcl9taW51c180JywgJ3F1YXJ0ZXInLCBxdWFydGVyU3RhcnRBZ28oNCksIHF1YXJ0ZXJFbmRBZ28oNCksIDExMDAwMDAsIDEwNDUwMDAsXG4gICAgICB7IHBpcGVsaW5lOiAxNjUwMDAsIGJlc3RDYXNlOiAxMTAwMDAsIGNvbW1pdDogNzAwMDAgfSxcbiAgICAgICdDbG9zZWQgYXQgOTUlIG9mIHF1b3RhIGluIHRoZSBmaXJzdCBxdWFydGVyIG9uIHRoZSBuZXcgdGVycml0b3J5IG1vZGVsLicpLFxuICAgIGNsb3NlZFBlcmlvZCgnZGVtb19tb250aF9taW51c18xJywgJ21vbnRoJywgbW9udGhTdGFydEFnbygxKSwgbW9udGhFbmRBZ28oMSksIDQ4MDAwMCwgNTA1MDAwLFxuICAgICAgeyBwaXBlbGluZTogOTYwMDAsIGJlc3RDYXNlOiA2MjAwMCwgY29tbWl0OiA0MDAwMCB9LFxuICAgICAgJ0Nsb3NlZCBhdCAxMDUlIG9mIHF1b3RhOyB0aGUgZXhwYW5zaW9uIG1vdGlvbiBjb3ZlcmVkIGEgc29mdCBuZXctYnVzaW5lc3MgbW9udGguJyksXG4gICAgY2xvc2VkUGVyaW9kKCdkZW1vX21vbnRoX21pbnVzXzInLCAnbW9udGgnLCBtb250aFN0YXJ0QWdvKDIpLCBtb250aEVuZEFnbygyKSwgNDYwMDAwLCA0MTQwMDAsXG4gICAgICB7IHBpcGVsaW5lOiA5MjAwMCwgYmVzdENhc2U6IDU4MDAwLCBjb21taXQ6IDM1MDAwIH0sXG4gICAgICAnQ2xvc2VkIGF0IDkwJSBvZiBxdW90YSBcdTIwMTQgc3VtbWVyIHNsb3dkb3duIGFjcm9zcyB0aGUgbWlkLW1hcmtldCBzZWdtZW50LicpLFxuICBdXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NhbGVzL2RhdGEvaW5kZXgudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2FsZXMvZGF0YVwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zYWxlcy9kYXRhL2luZGV4LnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFNhbGVzIHNlZWQgZGF0YSwgYW5kIHRoZSBjb21wb3NpdGlvbiBrbm9iIGV2ZXJ5IHBhY2thZ2UncyByb3dzIGFyZSBzZWxlY3RlZFxuICogYnkuXG4gKlxuICogVGhlIHJvd3MgdGhlbXNlbHZlcyBhcmUgYXV0aG9yZWQgcGVyIG9iamVjdCBmYW1pbHkgaW4gdGhlIGAqLnNlZWQudHNgXG4gKiBtb2R1bGVzIGJlc2lkZSB0aGlzIGZpbGU7IGBvYmplY3RzdGFjay5jb21wb3NpdGlvbi50c2AgY29sbGVjdHMgYWxsIGZvdXJcbiAqIGRpcmVjdG9yaWVzJyBmYW1pbGllcyBpbnRvIHRoZSBzaW5nbGUgb3JkZXJlZCBgQ3JtU2VlZERhdGFgIHVuaW9uIGFuZCBjdXRzIGl0XG4gKiBieSBvd25pbmcgcGFja2FnZSBcdTIwMTQgZWFjaCBwYWNrYWdlIHN0YWNrIHJlZ2lzdGVycyB0aGUgZmFtaWxpZXMgd2hvc2Ugb2JqZWN0XG4gKiBpdCBvd25zLlxuICogVGhhdCBhc3NlbWJseSBpcyBOT1QgaGVyZSwgYW5kIGNhbm5vdCBiZTogaXQgbmFtZXMgYGNybV9wcm9kdWN0YCxcbiAqIGBjcm1fY2FzZWAsIGBjcm1fY2FtcGFpZ25gIGFuZCB0aGUgcmVzdCwgd2hpY2ggYXJlIG90aGVyIHBhY2thZ2VzJyBvYmplY3RzLFxuICogYW5kIGEgc2FsZXMgZmlsZSBtYXkgaW1wb3J0IGZyb20gaXRzIG93biBkaXJlY3Rvcnkgb3IgZnJvbSBgc3JjL3NhbGVzL2Agb25seVxuICogKHBsYW4gaXRlbSA3KS4gVGhlIE9SREVSIGl0IGFzc2VtYmxlcyBpbiBpcyBsb2FkLWJlYXJpbmcgXHUyMDE0IHJvd3MgcmVmZXJlbmNlXG4gKiByb3dzIHNlZWRlZCBlYXJsaWVyIFx1MjAxNCBzbyBpdCBsaXZlcyBpbiB0aGUgb25lIGZpbGUgdGhhdCBjYW4gc2VlIGFsbCBmb3VyLlxuICpcbiAqIFdoZXJlIHRvIGFkZCBhIHJvdyBmb2xsb3dzIGZyb20gdGhlIG9iamVjdDpcbiAqXG4gKiAgIC0gYF9zaGFyZWQudHNgICAgICAgICBzZWVkIGRvY3RyaW5lICsgaGVscGVycyBldmVyeSBwYWNrYWdlJ3Mgcm93cyB1c2VcbiAqICAgLSBgc2FsZXMuc2VlZC50c2AgICAgIGFjY291bnRzLCBjb250YWN0cywgbGVhZHMsIG9wcG9ydHVuaXRpZXNcbiAqICAgLSBgYWN0aXZpdHkuc2VlZC50c2AgIHRhc2tzLCBldmVudHMsIGV2ZW50IGF0dGVuZGVlc1xuICogICAtIGBmb3JlY2FzdC5zZWVkLnRzYCAgZm9yZWNhc3Qgc25hcHNob3RzXG4gKiAgIC0gYHNyYy9yZXZlbnVlL2RhdGEvYCBwcm9kdWN0cywgb3Bwb3J0dW5pdHkgbGluZXMsIGNvbnRyYWN0cywgcXVvdGVzLCBxdW90ZSBsaW5lc1xuICogICAtIGBzcmMvc2VydmljZS9kYXRhL2AgY2FzZXMsIGtub3dsZWRnZSBhcnRpY2xlc1xuICogICAtIGBzcmMvbWFya2V0aW5nL2RhdGEvYCBjYW1wYWlnbnMsIGNhbXBhaWduIG1lbWJlcnNcbiAqL1xuZXhwb3J0IHsgYWNjb3VudHMsIGNvbnRhY3RzLCBsZWFkcywgb3Bwb3J0dW5pdGllcywgT1BQT1JUVU5JVFlfTElORVMgfSBmcm9tICcuL3NhbGVzLnNlZWQnO1xuZXhwb3J0IHsgdGFza3MsIGV2ZW50cywgZXZlbnRBdHRlbmRlZXNGcm9tQ29udGFjdHMsIGV2ZW50QXR0ZW5kZWVzRnJvbUxlYWRzLCBsZWFkSW50ZXJhY3Rpb25Qb2ludGVycyB9IGZyb20gJy4vYWN0aXZpdHkuc2VlZCc7XG5leHBvcnQgeyBmb3JlY2FzdHMgfSBmcm9tICcuL2ZvcmVjYXN0LnNlZWQnO1xuZXhwb3J0IHsgY2VsRGF5c0FnbywgY2VsRGF5c0Zyb21Ob3csIGxpbmVUb3RhbCwgbGluZXNUb3RhbCwgdHlwZSBMaW5lU3BlYyB9IGZyb20gJy4vX3NoYXJlZCc7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCB0aGUgU2FhUyAvIG11bHRpLW9yZyBjb21wb3NpdGlvbiBcdTI1MDBcdTI1MDBcblxuLyoqXG4gKiBXaGljaCBTSEFQRSBvZiB0aGlzIGFwcCBhIGJ1aWxkIGFzc2VtYmxlcyAoIzEzNjEpLlxuICpcbiAqIGBkZWZhdWx0YCBpcyB0aGUgY29tbXVuaXR5L3NpbmdsZS1vcmcgYXBwIGFuZCBpcyB3aGF0IGV2ZXJ5IGJ1aWxkIHByb2R1Y2VzXG4gKiB1bmxlc3Mgc29tZXRoaW5nIGFza3Mgb3RoZXJ3aXNlIFx1MjAxNCB0aGUgZGVtbyBvcmcgYW5kIGl0cyBzdG9yeXRlbGxpbmcgZGF0YSxcbiAqIHdoaWNoIHRoZSBwbGF0Zm9ybSdzIHNlZWQtc2V0dGxlIG93bmVyc2hpcCBjbGFpbSBiaW5kcyB0byB0aGUgZmlyc3QgcGxhdGZvcm1cbiAqIGFkbWluaXN0cmF0b3IuXG4gKlxuICogYHNhYXNgIGlzIHRoZSBzaGFwZSBhIG11bHRpLW9yZyBvcGVyYXRvciBkZXBsb3lzIG9uIHRoZSBlbnRlcnByaXNlIHJ1bnRpbWVcbiAqIHVuZGVyIGEgd2FsbGVkIHRlbmFuY3kgcG9zdHVyZSAoYE9TX1RFTkFOQ1lfUE9TVFVSRT1pc29sYXRlZGApLiBUaGUgdHdvXG4gKiBkaWZmZXIgT05MWSBieSB3aGF0IHRoZSBjb21wb3NpdGlvbiByZWdpc3RlcnM7IG5vIGNvZGUgYnJhbmNoZXMgYXQgcnVudGltZSxcbiAqIG5vdGhpbmcgaXMgZGVjaWRlZCBwZXIgdGVuYW50LCBhbmQgbm8gZW50ZXJwcmlzZSBwYWNrYWdlIGlzIGltcG9ydGVkLiBTZWVcbiAqIHtAbGluayBTYWFzVGVuYW50U2VlZERhdGF9IGZvciB3aHkgdGhlIHNlZWQgc2V0IHNocmlua3MgYW5kXG4gKiBgb2JqZWN0c3RhY2suY29tcG9zaXRpb24udHNgIGZvciB0aGUgcGVybWlzc2lvbiBoYWxmLlxuICovXG5leHBvcnQgdHlwZSBIb3RDcm1Db21wb3NpdGlvbiA9ICdkZWZhdWx0JyB8ICdzYWFzJztcblxuLyoqIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB7QGxpbmsgcmVzb2x2ZUNvbXBvc2l0aW9ufSByZWFkcy4gKi9cbmV4cG9ydCBjb25zdCBDT01QT1NJVElPTl9FTlZfVkFSID0gJ0hPVENSTV9DT01QT1NJVElPTic7XG5cbi8qKiBFdmVyeSB2YWx1ZSB7QGxpbmsgcmVzb2x2ZUNvbXBvc2l0aW9ufSBhY2NlcHRzLCBmb3IgZGlhZ25vc3RpY3MgYW5kIHRlc3RzLiAqL1xuZXhwb3J0IGNvbnN0IEhPVENSTV9DT01QT1NJVElPTlM6IHJlYWRvbmx5IEhvdENybUNvbXBvc2l0aW9uW10gPSBbJ2RlZmF1bHQnLCAnc2FhcyddO1xuXG4vKipcbiAqIFJlc29sdmUgdGhlIGNvbXBvc2l0aW9uIGZyb20gdGhlIGVudmlyb25tZW50IFx1MjAxNCBhbmQgUkVGVVNFIGFueXRoaW5nIGVsc2UuXG4gKlxuICogVGhlIHJlZnVzYWwgaXMgdGhlIHBvaW50LCBhbmQgaXQgaXMgd2h5IHRoaXMgaXMgYSBmdW5jdGlvbiByYXRoZXIgdGhhbiBhXG4gKiBgPT09ICdzYWFzJ2AgY29tcGFyaXNvbiBhdCB0aGUgb25lIGNhbGwgc2l0ZS4gVGhlIGZhaWx1cmUgbW9kZSBhIHNpbGVudFxuICogZGVmYXVsdCBwcm9kdWNlcyBpcyBub3QgXCJ0aGUgYnVpbGQgaXMgYSBiaXQgd3JvbmdcIjogYEhPVENSTV9DT01QT1NJVElPTj1zYXNzYFxuICogd291bGQgYXNzZW1ibGUgdGhlIEZVTEwgZGVtbyB1bmlvbiwgYW5kIHRoZSBvcGVyYXRvciB3b3VsZCBvbmx5IGZpbmQgb3V0IHdoZW5cbiAqIGV2ZXJ5IHRlbmFudCB0aGV5IG9uYm9hcmQgcmVjZWl2ZXMgbmluZSBhY2NvdW50cyBuYW1lZCBhZnRlciBvdGhlciBwZW9wbGUnc1xuICogY29tcGFuaWVzIFx1MjAxNCBhIGRhdGEtc2hhcGUgbWlzdGFrZSB0aGF0IGlzIGV4cGVuc2l2ZSB0byB1bndpbmQgb25jZSB0ZW5hbnRzXG4gKiBoYXZlIGVkaXRlZCB0aG9zZSByb3dzLiBBbiB1bnJlY29nbmlzZWQgdmFsdWUgdGhlcmVmb3JlIHRocm93cyBhdFxuICogY29uZmlnLWxvYWQgdGltZSwgd2hlcmUgYSBidWlsZCBmYWlscyBsb3VkbHkgYW5kIG5vdGhpbmcgaGFzIHNoaXBwZWQuXG4gKlxuICogVW5zZXQgYW5kIGVtcHR5IGJvdGggbWVhbiBgZGVmYXVsdGAsIGRlbGliZXJhdGVseTogXCJubyBvcGluaW9uXCIgaXMgdGhlXG4gKiBjb21tdW5pdHkgYXBwLCBzbyBubyBleGlzdGluZyBidWlsZCwgc2NyaXB0IG9yIENJIGpvYiBjaGFuZ2VzIGJlaGF2aW91ciBieVxuICogc2F5aW5nIG5vdGhpbmcgKGBwbnBtIGJ1aWxkYCwgYG9iamVjdHN0YWNrIHZhbGlkYXRlYCwgdGhlIGNsb3VkIEVFIHJpZ3MnXG4gKiBgc2NyaXB0cy9idWlsZC1ob3Rjcm0tYXJ0aWZhY3Quc2hgKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb21wb3NpdGlvbihcbiAgcmF3OiBzdHJpbmcgfCB1bmRlZmluZWQgPSBwcm9jZXNzLmVudltDT01QT1NJVElPTl9FTlZfVkFSXSxcbik6IEhvdENybUNvbXBvc2l0aW9uIHtcbiAgY29uc3QgdmFsdWUgPSAocmF3ID8/ICcnKS50cmltKCk7XG4gIGlmICh2YWx1ZSA9PT0gJycpIHJldHVybiAnZGVmYXVsdCc7XG4gIGlmICgoSE9UQ1JNX0NPTVBPU0lUSU9OUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlIGFzIEhvdENybUNvbXBvc2l0aW9uO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgJHtDT01QT1NJVElPTl9FTlZfVkFSfT1cIiR7dmFsdWV9XCIgaXMgbm90IGEgSG90Q1JNIGNvbXBvc2l0aW9uLiBgICtcbiAgICAgIGBFeHBlY3RlZCBvbmUgb2Y6ICR7SE9UQ1JNX0NPTVBPU0lUSU9OUy5qb2luKCcsICcpfSAob3IgbGVhdmUgaXQgdW5zZXQgZm9yICdkZWZhdWx0JykuYCxcbiAgKTtcbn1cbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YS9jYXRhbG9nLnNlZWQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9kYXRhXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YS9jYXRhbG9nLnNlZWQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogUHJvZHVjdCBjYXRhbG9ndWUgc2VlZHMgXHUyMDE0IGFuZCB0aGUgdHdvIGhlbHBlcnMgdGhhdCByZWFkIHByaWNlcyBiYWNrIG91dCBvZlxuICogaXQsIHNvIGEgbGluZSBpdGVtJ3MgYGxpc3RfcHJpY2VgIGNhbiBuZXZlciBkaXNhZ3JlZSB3aXRoIHRoZSBjYXRhbG9ndWUuXG4gKlxuICogU3BsaXQgb3V0IG9mIHRoZSBmb3JtZXIgbW9ub2xpdGhpYyBgc3JjL2RhdGEvaW5kZXgudHNgICgjNjM1KS4gU2VlZCBkb2N0cmluZVxuICogbGl2ZXMgaW4gYHNyYy9zYWxlcy9kYXRhL19zaGFyZWQudHNgLlxuICovXG5pbXBvcnQgeyBkZWZpbmVTZWVkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBQcm9kdWN0IH0gZnJvbSAnLi4vb2JqZWN0cy9wcm9kdWN0Lm9iamVjdCc7XG5pbXBvcnQgdHlwZSB7IExpbmVTcGVjIH0gZnJvbSAnLi4vLi4vc2FsZXMvZGF0YS9fc2hhcmVkJztcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFByb2R1Y3RzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gVGhlIGNhdGFsb2cgaXMgd2hhdCBldmVyeSBsaW5lIGl0ZW0gYmVsb3cgcHJpY2VzIGFnYWluc3QsIHNvIGl0IGhhcyB0byBiZVxuLy8gd2lkZSBlbm91Z2ggdG8gY29uZmlndXJlIGEgcmVhbGlzdGljIGRlYWw6IGFuIGVkaXRpb24sIGFuIGFkZC1vbiwgYVxuLy8gcGVyLXNlYXQgc3Vic2NyaXB0aW9uLCBzdXBwb3J0IHRpZXJzIGFuZCBwcm9mZXNzaW9uYWwgc2VydmljZXMuIEZvdXJcbi8vIHByb2R1Y3RzIGNvdWxkIG5vdCAoIzU5MSkuXG4vL1xuLy8gYGNvc3RgIGlzIHBvcHVsYXRlZCBvbiBldmVyeSBwcm9kdWN0OiBgY29zdF9sZXNzX3RoYW5fcHJpY2VgIGlzIGEgcmVhbFxuLy8gdmFsaWRhdGlvbiBydWxlIHRoYXQgXCJoYXMgbmV2ZXIgb25jZSBldmFsdWF0ZWRcIiB3aGlsZSB0aGUgZmllbGQgd2FzIGJsYW5rXG4vLyBldmVyeXdoZXJlLCBhbmQgbWFyZ2luIGlzIHdoYXQgdGhlIHByb2R1Y3QtbWl4IGFuYWx5dGljcyBhcmUgZm9yLiBFdmVyeSByb3dcbi8vIGtlZXBzIGNvc3Qgc3RyaWN0bHkgYmVsb3cgbGlzdCBwcmljZS5cbmV4cG9ydCBjb25zdCBwcm9kdWN0cyA9IGRlZmluZVNlZWQoUHJvZHVjdCwge1xuICBtb2RlOiAndXBzZXJ0JyxcbiAgZXh0ZXJuYWxJZDogJ25hbWUnLFxuICByZWNvcmRzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ09iamVjdFN0YWNrIFBsYXRmb3JtJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGVudGVycHJpc2UgZWRpdGlvbjogdW5saW1pdGVkIG9iamVjdHMsIEFJIGFnZW50cywgZ292ZXJuYW5jZSBhbmQgYXVkaXQuJyxcbiAgICAgIGNhdGVnb3J5OiAnc29mdHdhcmUnLFxuICAgICAgZmFtaWx5OiAnZW50ZXJwcmlzZScsXG4gICAgICBza3U6ICdPUy1QTEFULUVOVCcsXG4gICAgICBsaXN0X3ByaWNlOiA1MDAwMCxcbiAgICAgIGNvc3Q6IDEyMDAwLFxuICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ09iamVjdFN0YWNrIFBsYXRmb3JtIChTTUIgRWRpdGlvbiknLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgbWlkLW1hcmtldCBlZGl0aW9uOiBjb3JlIENSTSBvYmplY3RzIGFuZCBhdXRvbWF0aW9uLCBjYXBwZWQgYWdlbnQgdXNhZ2UuJyxcbiAgICAgIGNhdGVnb3J5OiAnc29mdHdhcmUnLFxuICAgICAgZmFtaWx5OiAnc21iJyxcbiAgICAgIHNrdTogJ09TLVBMQVQtU01CJyxcbiAgICAgIGxpc3RfcHJpY2U6IDE4MDAwLFxuICAgICAgY29zdDogNDUwMCxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdDbG91ZCBIb3N0aW5nIChBbm51YWwpJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTWFuYWdlZCBob3N0aW5nIHdpdGggcmVnaW9uYWwgZGF0YSByZXNpZGVuY3kgYW5kIGEgOTkuOSUgYXZhaWxhYmlsaXR5IHRhcmdldC4nLFxuICAgICAgY2F0ZWdvcnk6ICdzdWJzY3JpcHRpb24nLFxuICAgICAgZmFtaWx5OiAnY2xvdWQnLFxuICAgICAgc2t1OiAnT1MtQ0xPVUQtSE9TVCcsXG4gICAgICBsaXN0X3ByaWNlOiAxMjAwMCxcbiAgICAgIGNvc3Q6IDQyMDAsXG4gICAgICBpc19hY3RpdmU6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnU2FuZGJveCBFbnZpcm9ubWVudCAoQW5udWFsKScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0EgZnVsbC1jb3B5IG5vbi1wcm9kdWN0aW9uIGVudmlyb25tZW50IGZvciB0ZXN0aW5nIG1ldGFkYXRhIGNoYW5nZXMgYmVmb3JlIHJlbGVhc2UuJyxcbiAgICAgIGNhdGVnb3J5OiAnc3Vic2NyaXB0aW9uJyxcbiAgICAgIGZhbWlseTogJ2Nsb3VkJyxcbiAgICAgIHNrdTogJ09TLUNMT1VELVNCWCcsXG4gICAgICBsaXN0X3ByaWNlOiA3NTAwLFxuICAgICAgY29zdDogMjYwMCxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQSBuYW1lZC11c2VyIHNlYXQgZm9yIHRoZSBDby1QaWxvdCBhbmQgYWdlbnQgc3VyZmFjZXMsIGJpbGxlZCBhbm51YWxseS4nLFxuICAgICAgY2F0ZWdvcnk6ICdzdWJzY3JpcHRpb24nLFxuICAgICAgZmFtaWx5OiAnY2xvdWQnLFxuICAgICAgc2t1OiAnT1MtQUktU0VBVCcsXG4gICAgICBsaXN0X3ByaWNlOiAxMDAwLFxuICAgICAgY29zdDogMjYwLFxuICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0FuYWx5dGljcyBBZGQtb24nLFxuICAgICAgZGVzY3JpcHRpb246ICdEYXNoYm9hcmRzLCBjdWJlcyBhbmQgc2NoZWR1bGVkIHJlcG9ydGluZyBmb3IgdGhlIHJldmVudWUgb3JnYW5pemF0aW9uLicsXG4gICAgICBjYXRlZ29yeTogJ3NvZnR3YXJlJyxcbiAgICAgIGZhbWlseTogJ2VudGVycHJpc2UnLFxuICAgICAgc2t1OiAnT1MtQURET04tQU5MJyxcbiAgICAgIGxpc3RfcHJpY2U6IDIyMDAwLFxuICAgICAgY29zdDogNjUwMCxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJbnRlZ3JhdGlvbiBDb25uZWN0b3IgUGFjaycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1ByZS1idWlsdCBjb25uZWN0b3JzIGZvciBFUlAsIG1hcmtldGluZyBhdXRvbWF0aW9uIGFuZCBkYXRhIHdhcmVob3VzZSB0YXJnZXRzLicsXG4gICAgICBjYXRlZ29yeTogJ3NvZnR3YXJlJyxcbiAgICAgIGZhbWlseTogJ2VudGVycHJpc2UnLFxuICAgICAgc2t1OiAnT1MtQURET04tSU5UJyxcbiAgICAgIGxpc3RfcHJpY2U6IDE2MDAwLFxuICAgICAgY29zdDogNTIwMCxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdGaWVsZCBTZXJ2aWNlIE1vYmlsZScsXG4gICAgICBkZXNjcmlwdGlvbjogJ09mZmxpbmUtY2FwYWJsZSBtb2JpbGUgYXBwIGZvciBmaWVsZCB0ZWNobmljaWFucyBhbmQgcm91dGUtYmFzZWQgc2VydmljZSB3b3JrLicsXG4gICAgICBjYXRlZ29yeTogJ3NvZnR3YXJlJyxcbiAgICAgIGZhbWlseTogJ3NtYicsXG4gICAgICBza3U6ICdPUy1BRERPTi1GU00nLFxuICAgICAgbGlzdF9wcmljZTogMTQwMDAsXG4gICAgICBjb3N0OiA0MjAwLFxuICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1ByZW1pdW0gU3VwcG9ydCcsXG4gICAgICBkZXNjcmlwdGlvbjogJzI0XHUwMEQ3NyBzdXBwb3J0IHdpdGggYSBvbmUtaG91ciBQMSByZXNwb25zZSB0YXJnZXQgYW5kIGEgbmFtZWQgdGVjaG5pY2FsIGFjY291bnQgbWFuYWdlci4nLFxuICAgICAgY2F0ZWdvcnk6ICdzdXBwb3J0JyxcbiAgICAgIGZhbWlseTogJ3NlcnZpY2VzJyxcbiAgICAgIHNrdTogJ09TLVNVUC1QUkVNJyxcbiAgICAgIGxpc3RfcHJpY2U6IDI1MDAwLFxuICAgICAgY29zdDogOTAwMCxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdTdGFuZGFyZCBTdXBwb3J0JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQnVzaW5lc3MtaG91cnMgc3VwcG9ydCB3aXRoIGEgbmV4dC1idXNpbmVzcy1kYXkgcmVzcG9uc2UgdGFyZ2V0LicsXG4gICAgICBjYXRlZ29yeTogJ3N1cHBvcnQnLFxuICAgICAgZmFtaWx5OiAnc2VydmljZXMnLFxuICAgICAgc2t1OiAnT1MtU1VQLVNURCcsXG4gICAgICBsaXN0X3ByaWNlOiA5MDAwLFxuICAgICAgY29zdDogMzYwMCxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdJbXBsZW1lbnRhdGlvbiBTZXJ2aWNlcycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0d1aWRlZCBpbXBsZW1lbnRhdGlvbjogZGlzY292ZXJ5LCBtZXRhZGF0YSBidWlsZCwgaW50ZWdyYXRpb24gYW5kIGdvLWxpdmUgc3VwcG9ydC4nLFxuICAgICAgY2F0ZWdvcnk6ICdzZXJ2aWNlJyxcbiAgICAgIGZhbWlseTogJ3NlcnZpY2VzJyxcbiAgICAgIHNrdTogJ09TLVNWQy1JTVBMJyxcbiAgICAgIGxpc3RfcHJpY2U6IDc1MDAwLFxuICAgICAgY29zdDogNDEwMDAsXG4gICAgICBpc19hY3RpdmU6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnRGF0YSBNaWdyYXRpb24gU2VydmljZXMnLFxuICAgICAgZGVzY3JpcHRpb246ICdFeHRyYWN0aW9uLCBtYXBwaW5nIGFuZCByZWNvbmNpbGlhdGlvbiBvZiBsZWdhY3kgQ1JNIGFuZCBzcHJlYWRzaGVldCBkYXRhLicsXG4gICAgICBjYXRlZ29yeTogJ3NlcnZpY2UnLFxuICAgICAgZmFtaWx5OiAnc2VydmljZXMnLFxuICAgICAgc2t1OiAnT1MtU1ZDLU1JR1InLFxuICAgICAgbGlzdF9wcmljZTogMzUwMDAsXG4gICAgICBjb3N0OiAxOTAwMCxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdBZG1pbiBUcmFpbmluZyBXb3Jrc2hvcCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0Egb25lLWRheSB3b3Jrc2hvcCBmb3IgYWRtaW5pc3RyYXRvcnMgb24gbWV0YWRhdGEsIHBlcm1pc3Npb25zIGFuZCBhbmFseXRpY3MuJyxcbiAgICAgIGNhdGVnb3J5OiAnc2VydmljZScsXG4gICAgICBmYW1pbHk6ICdzZXJ2aWNlcycsXG4gICAgICBza3U6ICdPUy1TVkMtVFJOJyxcbiAgICAgIGxpc3RfcHJpY2U6IDYwMDAsXG4gICAgICBjb3N0OiAyNDAwLFxuICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgIH0sXG4gIF1cbn0pO1xuXG4vKipcbiAqIENhdGFsb2cgcHJpY2Ugb2YgYSBzZWVkZWQgcHJvZHVjdCwgcmVhZCBiYWNrIGZyb20gdGhlIGRhdGFzZXQgYWJvdmUgc28gdGhlXG4gKiBwcmljZSBsaXZlcyBpbiBleGFjdGx5IG9uZSBwbGFjZS5cbiAqXG4gKiBMaW5lIGl0ZW1zIGNhcnJ5IGBsaXN0X3ByaWNlYCBleHBsaWNpdGx5IGJlY2F1c2UgaG9va3MgZG8gTk9UIHJ1biBvdmVyIHNlZWRzXG4gKiAoIzQ5MCk6IHRoZSBzaGFyZWQgcHJpY2UtZmlsbCBob29rIChgX2xpbmUtaXRlbS1wcmljZS1maWxsLnRzYCkgaXMgd2hhdFxuICogc3RhbXBzIGBsaXN0X3ByaWNlYCBmcm9tIGBjcm1fcHJvZHVjdC5saXN0X3ByaWNlYCBvbiBhIHJlYWwgd3JpdGUsIHNvIGFcbiAqIHNlZWRlZCBsaW5lIGhhcyB0byBhcnJpdmUgYWxyZWFkeSBjYXJyeWluZyB3aGF0IHRoYXQgaG9vayB3b3VsZCBoYXZlXG4gKiB3cml0dGVuLiBSZWFkaW5nIGl0IGZyb20gdGhlIGNhdGFsb2cgcmVjb3JkIG1ha2VzIHRoYXQgbGl0ZXJhbGx5IGltcG9zc2libGVcbiAqIHRvIGdldCB3cm9uZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNhdGFsb2dQcmljZSA9IChwcm9kdWN0TmFtZTogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgcHJvZHVjdCA9IHByb2R1Y3RzLnJlY29yZHMuZmluZCgocikgPT4gci5uYW1lID09PSBwcm9kdWN0TmFtZSk7XG4gIGlmICghcHJvZHVjdCB8fCB0eXBlb2YgcHJvZHVjdC5saXN0X3ByaWNlICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2VlZCBlcnJvcjogbm8gY2F0YWxvZyBwcm9kdWN0IG5hbWVkIFwiJHtwcm9kdWN0TmFtZX1cImApO1xuICB9XG4gIHJldHVybiBwcm9kdWN0Lmxpc3RfcHJpY2U7XG59O1xuXG4vKipcbiAqIEZsYXR0ZW4gYSBgeyBwYXJlbnQgXHUyMTkyIGxpbmVzIH1gIHRhYmxlIGludG8gc2VlZCByZWNvcmRzIGZvciBvbmUgbGluZS1pdGVtXG4gKiBvYmplY3QuIGBsaXN0X3ByaWNlYCBhbmQgYGxpbmVfbnVtYmVyYCBhcmUgdGhlIHR3byBmaWVsZHMgYSByZWFsIHdyaXRlIGdldHNcbiAqIGZyb20gbWFjaGluZXJ5IGEgc2VlZCBjYW5ub3QgY291bnQgb24gKHRoZSBwcmljZS1maWxsIGhvb2ssIGFuZCB0aGUgcXVvdGUgL1xuICogb3Bwb3J0dW5pdHkgbGluZSBlZGl0b3JzKSwgc28gYm90aCBhcmUgbWF0ZXJpYWxpc2VkIGhlcmUgXHUyMDE0IHRoZSByb3cgaXMgdGhlblxuICogY29ycmVjdCB3aGV0aGVyIG9yIG5vdCB0aGUgaG9vayBmaXJlcyBvdmVyIGEgc2VlZCB3cml0ZSAoIzYxNykuXG4gKi9cbmV4cG9ydCBjb25zdCBsaW5lSXRlbVJlY29yZHMgPSA8SyBleHRlbmRzIHN0cmluZz4oXG4gIHBhcmVudEZpZWxkOiBLLFxuICB0YWJsZTogUmVjb3JkPHN0cmluZywgcmVhZG9ubHkgTGluZVNwZWNbXT4sXG4pOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPT5cbiAgT2JqZWN0LmVudHJpZXModGFibGUpLmZsYXRNYXAoKFtwYXJlbnQsIGxpbmVzXSkgPT5cbiAgICBsaW5lcy5tYXAoKGwsIGkpID0+ICh7XG4gICAgICBbcGFyZW50RmllbGRdOiBwYXJlbnQsXG4gICAgICBjcm1fcHJvZHVjdDogbC5wcm9kdWN0LFxuICAgICAgZGVzY3JpcHRpb246IGwuZGVzY3JpcHRpb24sXG4gICAgICBxdWFudGl0eTogbC5xdWFudGl0eSxcbiAgICAgIGxpc3RfcHJpY2U6IGNhdGFsb2dQcmljZShsLnByb2R1Y3QpLFxuICAgICAgdW5pdF9wcmljZTogbC51bml0X3ByaWNlLFxuICAgICAgZGlzY291bnQ6IGwuZGlzY291bnQgPz8gMCxcbiAgICAgIGxpbmVfbnVtYmVyOiBpICsgMSxcbiAgICB9KSksXG4gICk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9yZXZlbnVlL2RhdGEvb3Bwb3J0dW5pdHktbGluZS1pdGVtLnNlZWQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9kYXRhXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YS9vcHBvcnR1bml0eS1saW5lLWl0ZW0uc2VlZC50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuaW1wb3J0IHsgZGVmaW5lU2VlZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgT3Bwb3J0dW5pdHlMaW5lSXRlbSB9IGZyb20gJy4uL29iamVjdHMvb3Bwb3J0dW5pdHlfbGluZV9pdGVtLm9iamVjdCc7XG5pbXBvcnQgeyBsaW5lSXRlbVJlY29yZHMgfSBmcm9tICcuL2NhdGFsb2cuc2VlZCc7XG5pbXBvcnQgeyBPUFBPUlRVTklUWV9MSU5FUyB9IGZyb20gJy4uLy4uL3NhbGVzL2RhdGEvc2FsZXMuc2VlZCc7XG5cbi8qKlxuICogT3Bwb3J0dW5pdHkgbGluZSBpdGVtIHNlZWQgcm93cy5cbiAqXG4gKiBgY3JtX29wcG9ydHVuaXR5X2xpbmVfaXRlbWAgaXMgYSByZXZlbnVlIG9iamVjdCwgc28gaXRzIHNlZWQgcm93cyBhcmUgdGhlXG4gKiByZXZlbnVlIHBhY2thZ2UncyAocGxhbiBpdGVtIDU6IGFuIGl0ZW0gbGl2ZXMgd2l0aCB0aGUgb2JqZWN0IGl0IGlzIGF1dGhvcmVkXG4gKiBhZ2FpbnN0KSBcdTIwMTQgd2hpbGUgdGhlIExJTkVTIHRoZW1zZWx2ZXMgc3RheSB3aXRoIHRoZSBvcHBvcnR1bml0aWVzIHRoZXkgcHJpY2UuXG4gKiBgT1BQT1JUVU5JVFlfTElORVNgIGlzIHJlYWQgZnJvbSBgc3JjL3NhbGVzL2RhdGEvc2FsZXMuc2VlZC50c2AgYWxvbmcgdGhlXG4gKiByZXZlbnVlIC0+IHNhbGVzIGVkZ2UsIGFuZCBpdCBoYXMgdG8gYmU6IHRoZSBzYW1lIHRhYmxlIGlzIHdoYXRcbiAqIGBkZWFsVmFsdWUoKWAgZGVyaXZlcyBldmVyeSBvcHBvcnR1bml0eSdzIGBhbW91bnRgIGZyb20sIHNvIGEgc2Vjb25kIGNvcHlcbiAqIGhlcmUgd291bGQgYmUgYSBzZWNvbmQgYW5zd2VyIHRvIHdoYXQgYSBkZWFsIGlzIHdvcnRoLlxuICpcbiAqIFx1MjUwMFx1MjUwMFx1MjUwMCBPcHBvcnR1bml0eSBsaW5lIGl0ZW1zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuICogSWRlbnRpdHkgaXMgdGhlIENPTVBPU0lURSBuYXR1cmFsIGtleSAob3Bwb3J0dW5pdHksIHByb2R1Y3QpOiB0aGUgb2JqZWN0IGhhc1xuICogbm8gc2luZ2xlIG5hdHVyYWwga2V5IFx1MjAxNCBubyBuYW1lLCBhbmQgYGxpbmVfbnVtYmVyYCBpcyBvbmx5IHVuaXF1ZSB3aXRoaW4gYVxuICogcGFyZW50IFx1MjAxNCBhbmQgYSBqdW5jdGlvbi1zaGFwZWQgZGF0YXNldCB3aXRob3V0IG9uZSBjYW4gb25seSBydW5cbiAqIGBtb2RlOiAnaW5zZXJ0J2AsIHdoaWNoIHJlLWluc2VydHMgZXZlcnkgcm93IG9uIGVhY2ggcmVwbGF5IGJvb3QgYW5kXG4gKiBkdXBsaWNhdGVzIHRoZSB0YWJsZSAoZnJhbWV3b3JrIzM0MzQpLiBUaGUgbG9hZGVyIG1hdGNoZXMgY29tcG9zaXRlIGtleVxuICogZmllbGRzIGJ5IHRoZWlyIFJFU09MVkVEIGlkcywgc28gdGhpcyBkZWR1cGVzIGNvcnJlY3RseSBhY3Jvc3MgcmVzdGFydHMuXG4gKiBUaGUgcHJhY3RpY2FsIGNvbnN0cmFpbnQgaXQgaW1wb3NlczogYSBwcm9kdWN0IGFwcGVhcnMgYXQgbW9zdCBvbmNlIHBlclxuICogZGVhbCwgd2hpY2ggaXMgaG93IHRoZXNlIGxpbmVzIGFyZSBhdXRob3JlZCBhbnl3YXkuXG4gKi9cbmV4cG9ydCBjb25zdCBvcHBvcnR1bml0eUxpbmVJdGVtcyA9IGRlZmluZVNlZWQoT3Bwb3J0dW5pdHlMaW5lSXRlbSwge1xuICBtb2RlOiAndXBzZXJ0JyxcbiAgZXh0ZXJuYWxJZDogWydjcm1fb3Bwb3J0dW5pdHknLCAnY3JtX3Byb2R1Y3QnXSxcbiAgcmVjb3JkczogbGluZUl0ZW1SZWNvcmRzKCdjcm1fb3Bwb3J0dW5pdHknLCBPUFBPUlRVTklUWV9MSU5FUyksXG59KTtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YS9yZXZlbnVlLnNlZWQudHNcIjtjb25zdCBfX2luamVjdGVkX2Rpcm5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvcmV2ZW51ZS9kYXRhXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3JldmVudWUvZGF0YS9yZXZlbnVlLnNlZWQudHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogUmV2ZW51ZSBzZWVkcyBcdTIwMTQgY29udHJhY3RzLCBxdW90ZXMgYW5kIHRoZWlyIGxpbmVzLlxuICpcbiAqIFNwbGl0IG91dCBvZiB0aGUgZm9ybWVyIG1vbm9saXRoaWMgYHNyYy9kYXRhL2luZGV4LnRzYCAoIzYzNSkuIFNlZWQgZG9jdHJpbmVcbiAqIGxpdmVzIGluIGBzcmMvc2FsZXMvZGF0YS9fc2hhcmVkLnRzYC5cbiAqL1xuaW1wb3J0IHsgZGVmaW5lU2VlZCB9IGZyb20gJ0BvYmplY3RzdGFjay9zcGVjL2RhdGEnO1xuaW1wb3J0IHsgY2VsIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMnO1xuaW1wb3J0IHsgQ29udHJhY3QgfSBmcm9tICcuLi9vYmplY3RzL2NvbnRyYWN0Lm9iamVjdCc7XG5pbXBvcnQgeyBRdW90ZSB9IGZyb20gJy4uL29iamVjdHMvcXVvdGUub2JqZWN0JztcbmltcG9ydCB7IFF1b3RlTGluZUl0ZW0gfSBmcm9tICcuLi9vYmplY3RzL3F1b3RlX2xpbmVfaXRlbS5vYmplY3QnO1xuaW1wb3J0IHsgbGluZXNUb3RhbCwgdHlwZSBMaW5lU3BlYyB9IGZyb20gJy4uLy4uL3NhbGVzL2RhdGEvX3NoYXJlZCc7XG5pbXBvcnQgeyBsaW5lSXRlbVJlY29yZHMgfSBmcm9tICcuL2NhdGFsb2cuc2VlZCc7XG5pbXBvcnQgeyBPUFBPUlRVTklUWV9MSU5FUyB9IGZyb20gJy4uLy4uL3NhbGVzL2RhdGEvc2FsZXMuc2VlZCc7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDb250cmFjdHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vLyBgY29udHJhY3RfbnVtYmVyYCBpcyBhIHJ1bnRpbWUtb3duZWQgYXV0b251bWJlciBhbmQgaXMgTk9UIHNlZWRlZCAoIzQ5MCkuXG4vLyBDb250cmFjdCBoYXMgbm8gbmF0dXJhbC1uYW1lIGZpZWxkLCBzbyB0aGUgKHVuaXF1ZSwgc3RhYmxlKSBkZXNjcmlwdGlvblxuLy8gZG91YmxlcyBhcyB0aGUgdXBzZXJ0IGlkZW50aXR5IGZvciB0aGVzZSBmaXh0dXJlcy5cbmV4cG9ydCBjb25zdCBjb250cmFjdHMgPSBkZWZpbmVTZWVkKENvbnRyYWN0LCB7XG4gIG1vZGU6ICd1cHNlcnQnLFxuICBleHRlcm5hbElkOiAnZGVzY3JpcHRpb24nLFxuICByZWNvcmRzOiBbXG4gICAgLy8gVGhlIG9uZSBBQ1RJVkFURUQgY29udHJhY3QgaW4gdGhlIGFwcCBcdTIwMTQgYGNvbnRyYWN0X3JlbmV3YWxgLFxuICAgIC8vIGBjb250cmFjdF9leHBpcmF0aW9uYCBhbmQgYGJpbGxpbmdfaGFuZG9mZmAgYWxsIGZpbHRlciBvbiBleGFjdGx5IHRoYXRcbiAgICAvLyBzdGF0dXMgXHUyMDE0IHNvIGl0IGhhcyB0byBiZSBhIGNvbnRyYWN0IHRoYXQgd2FzIHJlYWxseSBzaWduZWQsIG9mZiBhIGRlYWxcbiAgICAvLyB0aGF0IHdhcyByZWFsbHkgd29uLlxuICAgIC8vXG4gICAgLy8gSXQgdXNlZCB0byBsaW5rIGBBY21lIFBsYXRmb3JtIFVwZ3JhZGVgIGFuZCBjYXJyeSB0aGF0IGRlYWwncyBsaW5lIHRvdGFsXG4gICAgLy8gKDE1MDAwMCkgd2hpbGUgdGhhdCBkZWFsIGlzIHN0aWxsIGBwcm9wb3NhbGAsIGNsb3NpbmcgYGRheXNGcm9tTm93KDMwKWBcbiAgICAvLyAoIzE2NjEpLiBOb3RoaW5nIGluIHRoaXMgYXBwIGNhbiBwcm9kdWNlIHRoYXQgcGFpcmluZzogYHF1b3RlX29uX2FjY2VwdGVkYFxuICAgIC8vIGNsb3NlLXdpbnMgYW4gb3Bwb3J0dW5pdHkgdGhlIG1vbWVudCBpdHMgcXVvdGUgaXMgYWNjZXB0ZWQsIGFuZFxuICAgIC8vIGBjbG9zZWRfd29uYCBpcyBURVJNSU5BTCBpbiBgb3Bwb3J0dW5pdHlfc3RhZ2VfcHJvZ3Jlc3Npb25gIFx1MjAxNCBzbyBhIHNpZ25lZFxuICAgIC8vIGNvbnRyYWN0IGNhbiBuZXZlciBzaXQgb24gYW4gb3BlbiBkZWFsLCBmcm9tIGVpdGhlciBkaXJlY3Rpb24uXG4gICAgLy9cbiAgICAvLyBFdmVyeSBmaWVsZCBiZWxvdyBpcyBub3cgZGVyaXZlZCBmcm9tIGBBY21lIEFubnVhbCBSZW5ld2FsIDIwMjVgLCB0aGVcbiAgICAvLyBgY2xvc2VkX3dvbmAgZGVhbCB0aGlzIGNvbnRyYWN0J3Mgb3duIGRlc2NyaXB0aW9uIHdhcyBhbHJlYWR5IGRlc2NyaWJpbmc6XG4gICAgLy8gICBjb250cmFjdF92YWx1ZSBcdTIwMTQgdGhhdCBkZWFsJ3MgbGluZS1pdGVtIHRvdGFsLCB3aGljaCBpcyBhbHNvIHRoZSBBUlIgdGhlXG4gICAgLy8gICAgICAgICAgICAgICAgICAgIGFjY291bnQgZGVzY3JpcHRpb24gcmVwb3J0cy4gMTUwMDAwIHdhcyB0aGUgdXBncmFkZSdzXG4gICAgLy8gICAgICAgICAgICAgICAgICAgIHRvdGFsLCBpLmUuIHRoZSB2YWx1ZSBjYW1lIGZyb20gYSBkaWZmZXJlbnQgZGVhbCB0aGFuXG4gICAgLy8gICAgICAgICAgICAgICAgICAgIHRoZSBsaW5rIGRpZDtcbiAgICAvLyAgIHNpZ25lZF9kYXRlICAgIFx1MjAxNCBpdHMgYGNsb3NlX2RhdGVgOiB5b3Ugc2lnbiB3aGVuIHlvdSB3aW4sIGFuZFxuICAgIC8vICAgICAgICAgICAgICAgICAgICBgcXVvdGVfb25fYWNjZXB0ZWRgIHN0YW1wcyB0aGF0IHNhbWUgZGF5O1xuICAgIC8vICAgc3RhcnRfZGF0ZSAgICAgXHUyMDE0IHNpZ25hdHVyZSArIDE0ZCwgYmVjYXVzZSB0aGF0IGRlYWwncyBkZXNjcmlwdGlvbiBzYXlzXG4gICAgLy8gICAgICAgICAgICAgICAgICAgIGl0IHdhcyBcInNpZ25lZCB0d28gd2Vla3MgYWhlYWQgb2YgdGhlIHJlbmV3YWwgZGF0ZVwiO1xuICAgIC8vICAgZW5kX2RhdGUgICAgICAgXHUyMDE0IHN0YXJ0ICsgMzY1ZCwgdGhlIHNwYW4gZXZlcnkgb3RoZXIgcm93IGhlcmUgdXNlcyBmb3IgYVxuICAgIC8vICAgICAgICAgICAgICAgICAgICAxMi1tb250aCB0ZXJtLlxuICAgIHtcbiAgICAgIGNybV9hY2NvdW50OiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICBjcm1fY29udGFjdDogJ2pvaG4uc21pdGhAYWNtZS5leGFtcGxlLmNvbScsXG4gICAgICBjcm1fb3Bwb3J0dW5pdHk6ICdBY21lIEFubnVhbCBSZW5ld2FsIDIwMjUnLFxuICAgICAgc3RhdHVzOiAnYWN0aXZhdGVkJyxcbiAgICAgIGNvbnRyYWN0X3Rlcm1fbW9udGhzOiAxMixcbiAgICAgIHN0YXJ0X2RhdGU6IGNlbGBkYXlzQWdvKDEpYCxcbiAgICAgIGVuZF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMzY0KWAsXG4gICAgICBjb250cmFjdF92YWx1ZTogMjIwMDAwLFxuICAgICAgYmlsbGluZ19mcmVxdWVuY3k6ICdhbm51YWxseScsXG4gICAgICBwYXltZW50X3Rlcm1zOiAnbmV0XzMwJyxcbiAgICAgIGF1dG9fcmVuZXdhbDogdHJ1ZSxcbiAgICAgIHJlbmV3YWxfbm90aWNlX2RheXM6IDYwLFxuICAgICAgY29udHJhY3RfdHlwZTogJ3N1YnNjcmlwdGlvbicsXG4gICAgICBzaWduZWRfZGF0ZTogY2VsYGRheXNBZ28oMTUpYCxcbiAgICAgIHNpZ25lZF9ieTogJ0pvaG4gU21pdGgnLFxuICAgICAgZGVzY3JpcHRpb246ICdBbm51YWwgcGxhdGZvcm0gc3Vic2NyaXB0aW9uIHdpdGggcHJlbWl1bSBzdXBwb3J0IHRpZXIuJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGNybV9hY2NvdW50OiAnV2F5bmUgRW50ZXJwcmlzZXMnLFxuICAgICAgY3JtX2NvbnRhY3Q6ICdyd2lsc29uQHdheW5lLmV4YW1wbGUuY29tJyxcbiAgICAgIGNybV9vcHBvcnR1bml0eTogJ1dheW5lIEVudGVycHJpc2UgTGljZW5zZScsXG4gICAgICBzdGF0dXM6ICdpbl9hcHByb3ZhbCcsXG4gICAgICBjb250cmFjdF90ZXJtX21vbnRoczogMzYsXG4gICAgICBzdGFydF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMTQpYCxcbiAgICAgIGVuZF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMTEwOSlgLFxuICAgICAgY29udHJhY3RfdmFsdWU6IDEyMDAwMDAsXG4gICAgICBiaWxsaW5nX2ZyZXF1ZW5jeTogJ2FubnVhbGx5JyxcbiAgICAgIHBheW1lbnRfdGVybXM6ICduZXRfNjAnLFxuICAgICAgYXV0b19yZW5ld2FsOiBmYWxzZSxcbiAgICAgIHJlbmV3YWxfbm90aWNlX2RheXM6IDkwLFxuICAgICAgY29udHJhY3RfdHlwZTogJ2xpY2Vuc2UnLFxuICAgICAgZGVzY3JpcHRpb246ICdNdWx0aS15ZWFyIGVudGVycHJpc2UgbGljZW5zZSB3aXRoIGN1c3RvbSBTTEEuJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGNybV9hY2NvdW50OiAnSW5pdGVjaCBTb2x1dGlvbnMnLFxuICAgICAgY3JtX2NvbnRhY3Q6ICdtY2hlbkBpbml0ZWNoLmV4YW1wbGUuY29tJyxcbiAgICAgIHN0YXR1czogJ2V4cGlyZWQnLFxuICAgICAgY29udHJhY3RfdGVybV9tb250aHM6IDEyLFxuICAgICAgc3RhcnRfZGF0ZTogY2VsYGRheXNBZ28oNDAwKWAsXG4gICAgICBlbmRfZGF0ZTogY2VsYGRheXNBZ28oMzUpYCxcbiAgICAgIGNvbnRyYWN0X3ZhbHVlOiA2MDAwMCxcbiAgICAgIGJpbGxpbmdfZnJlcXVlbmN5OiAncXVhcnRlcmx5JyxcbiAgICAgIHBheW1lbnRfdGVybXM6ICduZXRfMzAnLFxuICAgICAgYXV0b19yZW5ld2FsOiBmYWxzZSxcbiAgICAgIHJlbmV3YWxfbm90aWNlX2RheXM6IDMwLFxuICAgICAgY29udHJhY3RfdHlwZTogJ3NlcnZpY2UnLFxuICAgICAgc2lnbmVkX2RhdGU6IGNlbGBkYXlzQWdvKDQwNSlgLFxuICAgICAgc2lnbmVkX2J5OiAnTWljaGFlbCBDaGVuJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSW5pdGlhbCBzZXJ2aWNlIGFncmVlbWVudCwgcGVuZGluZyByZW5ld2FsIGRpc2N1c3Npb24uJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGNybV9hY2NvdW50OiAnU3RhcmsgTWVkaWNhbCcsXG4gICAgICBjcm1fY29udGFjdDogJ2VtaWx5LmRAc3RhcmttZWQuZXhhbXBsZS5jb20nLFxuICAgICAgc3RhdHVzOiAnZHJhZnQnLFxuICAgICAgY29udHJhY3RfdGVybV9tb250aHM6IDI0LFxuICAgICAgc3RhcnRfZGF0ZTogY2VsYGRheXNGcm9tTm93KDMwKWAsXG4gICAgICBlbmRfZGF0ZTogY2VsYGRheXNGcm9tTm93KDc2MClgLFxuICAgICAgY29udHJhY3RfdmFsdWU6IDM1MDAwMCxcbiAgICAgIGJpbGxpbmdfZnJlcXVlbmN5OiAnbW9udGhseScsXG4gICAgICBwYXltZW50X3Rlcm1zOiAnbmV0XzMwJyxcbiAgICAgIGF1dG9fcmVuZXdhbDogdHJ1ZSxcbiAgICAgIHJlbmV3YWxfbm90aWNlX2RheXM6IDYwLFxuICAgICAgY29udHJhY3RfdHlwZTogJ3BhcnRuZXJzaGlwJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnSGVhbHRoY2FyZSBwYXJ0bmVyc2hpcCBhZ3JlZW1lbnQsIGN1cnJlbnRseSB1bmRlciBsZWdhbCByZXZpZXcuJyxcbiAgICB9LFxuICBdXG59KTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFF1b3RlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIGBxdW90ZV9udW1iZXJgIGlzIGEgcnVudGltZS1vd25lZCBhdXRvbnVtYmVyIGFuZCBpcyBOT1Qgc2VlZGVkICgjNDkwKTtcbi8vIHRoZSAodW5pcXVlKSBxdW90ZSBuYW1lIGlzIHRoZSB1cHNlcnQgaWRlbnRpdHkgaW5zdGVhZC5cbi8qKlxuICogUXVvdGUgbGluZSBpdGVtcywga2V5ZWQgYnkgcXVvdGUgbmFtZS4gVGhlIGZvdXIgcXVvdGVzIGdlbmVyYXRlZCBmcm9tIGEgZGVhbFxuICogY2FycnkgdGhhdCBkZWFsJ3MgY29uZmlndXJhdGlvbiB2ZXJiYXRpbSBcdTIwMTQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHRoZVxuICogYHF1b3RlX2dlbmVyYXRpb25gIGZsb3cgZG9lcyB3aGVuIGl0IGNsb25lcyBvcHBvcnR1bml0eSBsaW5lcyBvbnRvIGEgcXVvdGUuXG4gKi9cbmNvbnN0IFFVT1RFX0xJTkVTOiBSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBMaW5lU3BlY1tdPiA9IHtcbiAgJ0FjbWUgUGxhdGZvcm0gVXBncmFkZSBRdW90ZSc6IE9QUE9SVFVOSVRZX0xJTkVTWydBY21lIFBsYXRmb3JtIFVwZ3JhZGUnXSxcbiAgJ0FjbWUgQW5udWFsIFJlbmV3YWwgMjAyNSBRdW90ZSc6IE9QUE9SVFVOSVRZX0xJTkVTWydBY21lIEFubnVhbCBSZW5ld2FsIDIwMjUnXSxcbiAgJ0dsb2JleCBNYW51ZmFjdHVyaW5nIFN1aXRlIFByb3Bvc2FsJzogT1BQT1JUVU5JVFlfTElORVNbJ0dsb2JleCBNYW51ZmFjdHVyaW5nIFN1aXRlJ10sXG4gICdXYXluZSBFbnRlcnByaXNlIExpY2Vuc2UgUXVvdGUnOiBPUFBPUlRVTklUWV9MSU5FU1snV2F5bmUgRW50ZXJwcmlzZSBMaWNlbnNlJ10sXG4gICdJbml0ZWNoIENsb3VkIE1pZ3JhdGlvbiBFc3RpbWF0ZSc6IE9QUE9SVFVOSVRZX0xJTkVTWydJbml0ZWNoIENsb3VkIE1pZ3JhdGlvbiddLFxuICAvLyBRdW90ZWQgc3RhbmRhbG9uZSwgYmVmb3JlIGFueSBvcHBvcnR1bml0eSBleGlzdGVkIFx1MjAxNCBhbmQgdGhlbiByZWplY3RlZC5cbiAgJ1N0YXJrIE1lZGljYWwgUGlsb3QgUXVvdGUnOiBbXG4gICAgeyBwcm9kdWN0OiAnQWRtaW4gVHJhaW5pbmcgV29ya3Nob3AnLCBxdWFudGl0eTogNSwgdW5pdF9wcmljZTogNjAwMCwgZGVzY3JpcHRpb246ICdGaXZlIHdvcmtzaG9wIGRheXMgZm9yIHRoZSBwaWxvdCBjbGluaWNhbCB0ZWFtcy4nIH0sXG4gICAgeyBwcm9kdWN0OiAnU3RhbmRhcmQgU3VwcG9ydCcsIHF1YW50aXR5OiAxLCB1bml0X3ByaWNlOiA5MDAwLCBkZXNjcmlwdGlvbjogJ1N0YW5kYXJkIHN1cHBvcnQgZm9yIHRoZSBwaWxvdCB0ZXJtLicgfSxcbiAgICB7IHByb2R1Y3Q6ICdBSSBBZ2VudCBTZWF0IChBbm51YWwpJywgcXVhbnRpdHk6IDYsIHVuaXRfcHJpY2U6IDEwMDAsIGRlc2NyaXB0aW9uOiAnQWdlbnQgc2VhdHMgZm9yIHRoZSBwaWxvdCBjb29yZGluYXRvcnMuJyB9LFxuICBdLFxufTtcblxuLyoqXG4gKiBgc3VidG90YWxgIC8gYGRpc2NvdW50X2Ftb3VudGAgLyBgdG90YWxfcHJpY2VgIGZvciBhIHF1b3RlLCBkZXJpdmVkIGZyb20gaXRzXG4gKiBsaW5lcyB3aXRoIGBxdW90ZV90b3RhbF9yb2xsdXBgJ3Mgb3duIG1vZGVsOlxuICpcbiAqICAgc3VidG90YWwgICAgICAgID0gXHUwM0EzIGxpbmUgKHF1YW50aXR5IFx1MDBENyB1bml0X3ByaWNlIFx1MDBENyAoMSBcdTIyMTIgbGluZV9kaXNjb3VudC8xMDApKVxuICogICBkaXNjb3VudF9hbW91bnQgPSBzdWJ0b3RhbCBcdTAwRDcgcXVvdGUuZGlzY291bnQlXG4gKiAgIHRvdGFsX3ByaWNlICAgICA9IHN1YnRvdGFsIFx1MjIxMiBkaXNjb3VudF9hbW91bnQgKyB0YXggKyBzaGlwcGluZ19oYW5kbGluZ1xuICpcbiAqIFF1b3RlLWxldmVsIGB0YXhgIGFuZCBgc2hpcHBpbmdfaGFuZGxpbmdgIHN0YXkgbWFudWFsIGlucHV0cyBcdTIwMTQgdGhlIHJvbGx1cFxuICogZG9lcyBub3QgZGVyaXZlIHRoZW0gZWl0aGVyLiBFdmVyeXRoaW5nIHRoZSByb2xsdXAgRE9FUyBvd24gaXMgY29tcHV0ZWQgaGVyZVxuICogc28gdGhhdCB0aGUgZmlyc3QgZWRpdCB0byBhIHNlZWRlZCBsaW5lIGl0ZW0gcmVjb21wdXRlcyB0aGUgc2FtZSBudW1iZXJzXG4gKiBpbnN0ZWFkIG9mIHZpc2libHkgY29ycmVjdGluZyB0aGVtLlxuICovXG5jb25zdCBxdW90ZVRvdGFscyA9IChcbiAgcXVvdGVOYW1lOiBzdHJpbmcsXG4gIG9wdHM6IHsgZGlzY291bnQ6IG51bWJlcjsgdGF4OiBudW1iZXI7IHNoaXBwaW5nX2hhbmRsaW5nOiBudW1iZXIgfSxcbikgPT4ge1xuICBjb25zdCBsaW5lcyA9IFFVT1RFX0xJTkVTW3F1b3RlTmFtZV07XG4gIGlmICghbGluZXMpIHRocm93IG5ldyBFcnJvcihgU2VlZCBlcnJvcjogbm8gbGluZSBpdGVtcyBhdXRob3JlZCBmb3IgcXVvdGUgXCIke3F1b3RlTmFtZX1cImApO1xuICBjb25zdCBzdWJ0b3RhbCA9IGxpbmVzVG90YWwobGluZXMpO1xuICBjb25zdCBkaXNjb3VudF9hbW91bnQgPSBNYXRoLnJvdW5kKHN1YnRvdGFsICogKG9wdHMuZGlzY291bnQgLyAxMDApICogMTAwKSAvIDEwMDtcbiAgY29uc3QgdG90YWxfcHJpY2UgPVxuICAgIE1hdGgucm91bmQoKHN1YnRvdGFsIC0gZGlzY291bnRfYW1vdW50ICsgb3B0cy50YXggKyBvcHRzLnNoaXBwaW5nX2hhbmRsaW5nKSAqIDEwMCkgLyAxMDA7XG4gIHJldHVybiB7XG4gICAgc3VidG90YWwsXG4gICAgZGlzY291bnQ6IG9wdHMuZGlzY291bnQsXG4gICAgZGlzY291bnRfYW1vdW50LFxuICAgIHRheDogb3B0cy50YXgsXG4gICAgc2hpcHBpbmdfaGFuZGxpbmc6IG9wdHMuc2hpcHBpbmdfaGFuZGxpbmcsXG4gICAgdG90YWxfcHJpY2UsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgcXVvdGVzID0gZGVmaW5lU2VlZChRdW90ZSwge1xuICBtb2RlOiAndXBzZXJ0JyxcbiAgZXh0ZXJuYWxJZDogJ25hbWUnLFxuICByZWNvcmRzOiBbXG4gICAge1xuICAgICAgbmFtZTogJ0FjbWUgUGxhdGZvcm0gVXBncmFkZSBRdW90ZScsXG4gICAgICBjcm1fYWNjb3VudDogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgICAgY3JtX2NvbnRhY3Q6ICdqb2huLnNtaXRoQGFjbWUuZXhhbXBsZS5jb20nLFxuICAgICAgY3JtX29wcG9ydHVuaXR5OiAnQWNtZSBQbGF0Zm9ybSBVcGdyYWRlJyxcbiAgICAgIC8vIGBleHBpcmVkYCwgbm90IGBhY2NlcHRlZGAgKCMxNjYxKS4gQWNjZXB0aW5nIHRoaXMgcXVvdGUgd291bGQgaGF2ZVxuICAgICAgLy8gY2xvc2Utd29uIGBBY21lIFBsYXRmb3JtIFVwZ3JhZGVgLCB3aGljaCBpcyBgcHJvcG9zYWxgIGFuZCAzMCBkYXlzIGZyb21cbiAgICAgIC8vIGNsb3NlIFx1MjAxNCB0aGUgc2FtZSBpbXBvc3NpYmxlIHBhaXJpbmcgdGhlIGNvbnRyYWN0IGFib3ZlIGNhcnJpZWQsIG9uZVxuICAgICAgLy8gb2JqZWN0IG92ZXIuIGBleHBpcmVkYCBpcyB3aGF0IGBxdW90ZV9leHBpcmF0aW9uYCBjb21wdXRlcyBmb3IgYVxuICAgICAgLy8gcHJlc2VudGVkIHF1b3RlIHBhc3QgaXRzIGBleHBpcmF0aW9uX2RhdGVgLCBhbmQgaXQgaXMgd2hhdCB0aGUgZGVhbCdzXG4gICAgICAvLyBvd24gbmV4dCBzdGVwIGFzc3VtZXM6IHRoZSByZXZpc2VkIEVudGVycHJpc2UgcHJvcG9zYWwgc3RpbGwgaGFzIHRvIGdvXG4gICAgICAvLyBvdXQuIEl0cyBgY3JtX2NvbnRhY3RgIHN0YXlzIHB1dCBcdTIwMTQgdGhlIHJvdyBpcyBubyBsb25nZXIgZ2F0ZWQgYnlcbiAgICAgIC8vIGByZXF1aXJlZFdoZW5gLCBidXQgdGhlIHJlY2lwaWVudCBpcyBzdGlsbCB3aG8gaXQgd2FzIHNlbnQgdG8uXG4gICAgICBzdGF0dXM6ICdleHBpcmVkJyxcbiAgICAgIHF1b3RlX2RhdGU6IGNlbGBkYXlzQWdvKDQ1KWAsXG4gICAgICBleHBpcmF0aW9uX2RhdGU6IGNlbGBkYXlzQWdvKDE1KWAsXG4gICAgICAuLi5xdW90ZVRvdGFscygnQWNtZSBQbGF0Zm9ybSBVcGdyYWRlIFF1b3RlJywgeyBkaXNjb3VudDogMTAsIHRheDogMTE0NzUsIHNoaXBwaW5nX2hhbmRsaW5nOiAwIH0pLFxuICAgICAgcGF5bWVudF90ZXJtczogJ25ldF8zMCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ1BsYXRmb3JtIHVwZ3JhZGUgd2l0aCAxMCUgbG95YWx0eSBkaXNjb3VudCBhcHBsaWVkLicsXG4gICAgfSxcbiAgICAvLyBUaGUgcmVuZXdhbCdzIG93biBxdW90ZSwgYW5kIHRoZSBzZWVkJ3Mgb25lIEFDQ0VQVEVEIHF1b3RlLiBBY2NlcHRhbmNlIGlzXG4gICAgLy8gb25seSBjb2hlcmVudCBoZXJlOiBgcXVvdGVfb25fYWNjZXB0ZWRgIGNsb3NlLXdpbnMgd2hhdGV2ZXIgb3Bwb3J0dW5pdHkgYVxuICAgIC8vIHF1b3RlIGxpbmtzLCBzbyBhbiBhY2NlcHRlZCBxdW90ZSBjYW4gb25seSBldmVyIHBvaW50IGF0IGEgYGNsb3NlZF93b25gXG4gICAgLy8gZGVhbC4gSXQgYWxzbyBjb21wbGV0ZXMgdGhlIHByb3ZlbmFuY2UgY2hhaW4gdGhlIGNvbnRyYWN0IGFib3ZlIG5lZWRzIFx1MjAxNFxuICAgIC8vIGRlYWwgd29uLCBxdW90ZSBhY2NlcHRlZCwgY29udHJhY3QgZHJhZnRlZCwgdGhlbiBjb21wbGV0ZWQgYW5kIGFjdGl2YXRlZFxuICAgIC8vIGJ5IGFuIGFkbWluICh0aGUgZHJhZnQgdGhlIGhvb2sgd3JpdGVzIGlzIGV4cGxpY2l0bHkgYSBzdGFydGluZyBwb2ludCkuXG4gICAgLy8gYEFjbWUgQW5udWFsIFJlbmV3YWwgMjAyNWAga2VlcHMgaXRzIHJlcC1yZWNvcmRlZCBgcmVsYXRpb25zaGlwYCB3aW5cbiAgICAvLyByZWFzb246IHRoZSBob29rIG9ubHkgc3VwcGxpZXMgYHF1b3RlX2FjY2VwdGVkYCB3aGVuIG5vYm9keSByZWNvcmRlZCBvbmUuXG4gICAge1xuICAgICAgbmFtZTogJ0FjbWUgQW5udWFsIFJlbmV3YWwgMjAyNSBRdW90ZScsXG4gICAgICBjcm1fYWNjb3VudDogJ0FjbWUgQ29ycG9yYXRpb24nLFxuICAgICAgY3JtX2NvbnRhY3Q6ICdqb2huLnNtaXRoQGFjbWUuZXhhbXBsZS5jb20nLFxuICAgICAgY3JtX29wcG9ydHVuaXR5OiAnQWNtZSBBbm51YWwgUmVuZXdhbCAyMDI1JyxcbiAgICAgIHN0YXR1czogJ2FjY2VwdGVkJyxcbiAgICAgIHF1b3RlX2RhdGU6IGNlbGBkYXlzQWdvKDMwKWAsXG4gICAgICBleHBpcmF0aW9uX2RhdGU6IGNlbGBkYXlzQWdvKDEpYCxcbiAgICAgIC8vIE5vIGRpc2NvdW50IFx1MjAxNCB0aGUgcmVuZXdhbCB3ZW50IGF0IGxpc3QgKFwibXVsdGkteWVhciBvcHRpb24gZGVjbGluZWRcbiAgICAgIC8vIHRoaXMgcm91bmRcIiksIHdoaWNoIGlzIHdoYXQgaXRzIDIyJSBZb1kgdXBsaWZ0IGlzIG1hZGUgb2YuIFRheCBpcyA4LjUlXG4gICAgICAvLyBvZiB0aGUgcG9zdC1kaXNjb3VudCBzdWJ0b3RhbCwgdGhlIHJhdGUgdGhlIG90aGVyIEFjbWUgcXVvdGUgYmlsbHMgYXQ7XG4gICAgICAvLyBldmVyeSBub24tQWNtZSBxdW90ZSBoZXJlIGJpbGxzIDglLlxuICAgICAgLi4ucXVvdGVUb3RhbHMoJ0FjbWUgQW5udWFsIFJlbmV3YWwgMjAyNSBRdW90ZScsIHsgZGlzY291bnQ6IDAsIHRheDogMTg3MDAsIHNoaXBwaW5nX2hhbmRsaW5nOiAwIH0pLFxuICAgICAgcGF5bWVudF90ZXJtczogJ25ldF8zMCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0FubnVhbCByZW5ld2FsIFx1MjAxNCB0aHJlZSBwcm9kdWN0aW9uIHRlbmFudHMsIHByZW1pdW0gc3VwcG9ydCBhbmQgdGhlIEVNRUEgc2VhdCBleHBhbnNpb24uJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdHbG9iZXggTWFudWZhY3R1cmluZyBTdWl0ZSBQcm9wb3NhbCcsXG4gICAgICBjcm1fYWNjb3VudDogJ0dsb2JleCBJbmR1c3RyaWVzJyxcbiAgICAgIGNybV9jb250YWN0OiAnc2FyYWguakBnbG9iZXguZXhhbXBsZS5jb20nLFxuICAgICAgY3JtX29wcG9ydHVuaXR5OiAnR2xvYmV4IE1hbnVmYWN0dXJpbmcgU3VpdGUnLFxuICAgICAgc3RhdHVzOiAncHJlc2VudGVkJyxcbiAgICAgIHF1b3RlX2RhdGU6IGNlbGBkYXlzQWdvKDcpYCxcbiAgICAgIGV4cGlyYXRpb25fZGF0ZTogY2VsYGRheXNGcm9tTm93KDIzKWAsXG4gICAgICAuLi5xdW90ZVRvdGFscygnR2xvYmV4IE1hbnVmYWN0dXJpbmcgU3VpdGUgUHJvcG9zYWwnLCB7IGRpc2NvdW50OiA1LCB0YXg6IDcyMjAsIHNoaXBwaW5nX2hhbmRsaW5nOiAyNTAwIH0pLFxuICAgICAgcGF5bWVudF90ZXJtczogJ25ldF82MCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ01hbnVmYWN0dXJpbmcgc3VpdGUgbGljZW5zaW5nIHdpdGggcGxhbnQtYWRtaW4gdHJhaW5pbmcuJyxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdXYXluZSBFbnRlcnByaXNlIExpY2Vuc2UgUXVvdGUnLFxuICAgICAgY3JtX2FjY291bnQ6ICdXYXluZSBFbnRlcnByaXNlcycsXG4gICAgICBjcm1fY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLFxuICAgICAgY3JtX29wcG9ydHVuaXR5OiAnV2F5bmUgRW50ZXJwcmlzZSBMaWNlbnNlJyxcbiAgICAgIHN0YXR1czogJ2luX3JldmlldycsXG4gICAgICBxdW90ZV9kYXRlOiBjZWxgZGF5c0FnbygzKWAsXG4gICAgICBleHBpcmF0aW9uX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygyNylgLFxuICAgICAgLi4ucXVvdGVUb3RhbHMoJ1dheW5lIEVudGVycHJpc2UgTGljZW5zZSBRdW90ZScsIHsgZGlzY291bnQ6IDE1LCB0YXg6IDgxNjAwLCBzaGlwcGluZ19oYW5kbGluZzogMCB9KSxcbiAgICAgIHBheW1lbnRfdGVybXM6ICduZXRfNjAnLFxuICAgICAgZGVzY3JpcHRpb246ICdNdWx0aS15ZWFyIGVudGVycHJpc2UgbGljZW5zZSB3aXRoIHZvbHVtZSBkaXNjb3VudC4nLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0luaXRlY2ggQ2xvdWQgTWlncmF0aW9uIEVzdGltYXRlJyxcbiAgICAgIGNybV9hY2NvdW50OiAnSW5pdGVjaCBTb2x1dGlvbnMnLFxuICAgICAgY3JtX2NvbnRhY3Q6ICdtY2hlbkBpbml0ZWNoLmV4YW1wbGUuY29tJyxcbiAgICAgIGNybV9vcHBvcnR1bml0eTogJ0luaXRlY2ggQ2xvdWQgTWlncmF0aW9uJyxcbiAgICAgIHN0YXR1czogJ2RyYWZ0JyxcbiAgICAgIHF1b3RlX2RhdGU6IGNlbGBkYXlzQWdvKDEpYCxcbiAgICAgIGV4cGlyYXRpb25fZGF0ZTogY2VsYGRheXNGcm9tTm93KDI5KWAsXG4gICAgICAuLi5xdW90ZVRvdGFscygnSW5pdGVjaCBDbG91ZCBNaWdyYXRpb24gRXN0aW1hdGUnLCB7IGRpc2NvdW50OiAwLCB0YXg6IDY0MDAsIHNoaXBwaW5nX2hhbmRsaW5nOiAwIH0pLFxuICAgICAgcGF5bWVudF90ZXJtczogJ25ldF8zMCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0Nsb3VkIG1pZ3JhdGlvbiBzZXJ2aWNlcywgYXdhaXRpbmcgaW50ZXJuYWwgcmV2aWV3LicsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnU3RhcmsgTWVkaWNhbCBQaWxvdCBRdW90ZScsXG4gICAgICBjcm1fYWNjb3VudDogJ1N0YXJrIE1lZGljYWwnLFxuICAgICAgY3JtX2NvbnRhY3Q6ICdlbWlseS5kQHN0YXJrbWVkLmV4YW1wbGUuY29tJyxcbiAgICAgIHN0YXR1czogJ3JlamVjdGVkJyxcbiAgICAgIHF1b3RlX2RhdGU6IGNlbGBkYXlzQWdvKDYwKWAsXG4gICAgICBleHBpcmF0aW9uX2RhdGU6IGNlbGBkYXlzQWdvKDMwKWAsXG4gICAgICAuLi5xdW90ZVRvdGFscygnU3RhcmsgTWVkaWNhbCBQaWxvdCBRdW90ZScsIHsgZGlzY291bnQ6IDAsIHRheDogMzYwMCwgc2hpcHBpbmdfaGFuZGxpbmc6IDAgfSksXG4gICAgICBwYXltZW50X3Rlcm1zOiAnbmV0XzMwJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUGlsb3QgcHJvamVjdCBxdW90ZSwgcmVqZWN0ZWQgZHVlIHRvIGJ1ZGdldCBjb25zdHJhaW50cy4nLFxuICAgICAgaW50ZXJuYWxfbm90ZXM6ICdDdXN0b21lciByZXF1ZXN0ZWQgcmUtcXVvdGUgd2l0aCBzbWFsbGVyIHNjb3BlLicsXG4gICAgfSxcbiAgXVxufSk7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBRdW90ZSBsaW5lIGl0ZW1zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuLy8gU2FtZSBjb21wb3NpdGUta2V5IHJlYXNvbmluZyBhcyB0aGUgb3Bwb3J0dW5pdHkgbGluZXMgYWJvdmU6IChxdW90ZSxcbi8vIHByb2R1Y3QpIGlzIHRoZSBvbmx5IG5hdHVyYWwga2V5IHRoaXMganVuY3Rpb24tc2hhcGVkIG9iamVjdCBoYXMuXG5leHBvcnQgY29uc3QgcXVvdGVMaW5lSXRlbXMgPSBkZWZpbmVTZWVkKFF1b3RlTGluZUl0ZW0sIHtcbiAgbW9kZTogJ3Vwc2VydCcsXG4gIGV4dGVybmFsSWQ6IFsnY3JtX3F1b3RlJywgJ2NybV9wcm9kdWN0J10sXG4gIHJlY29yZHM6IGxpbmVJdGVtUmVjb3JkcygnY3JtX3F1b3RlJywgUVVPVEVfTElORVMpLFxufSk7XG4iLCAiY29uc3QgX19pbmplY3RlZF9maWxlbmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2RhdGEvc2VydmljZS5zZWVkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL3NlcnZpY2UvZGF0YVwiO2NvbnN0IF9faW5qZWN0ZWRfaW1wb3J0X21ldGFfdXJsX18gPSBcImZpbGU6Ly8vaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL2RhdGEvc2VydmljZS5zZWVkLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIFNlcnZpY2Ugc2VlZHMgXHUyMDE0IHRoZSBjYXNlIGJhY2tsb2cgYW5kIHRoZSBrbm93bGVkZ2UgYmFzZS5cbiAqXG4gKiBUaGUgdGFzayBsaXN0IGFuZCB0aGUgaW50ZXJhY3Rpb24gbG9nIHVzZWQgdG8gYmUgaGVyZSB0b286IHRhc2tzLCBldmVudHMgYW5kXG4gKiBldmVudCBhdHRlbmRlZXMgYXJlIHRoZSBhY3Rpdml0eSBsYXllciBvdmVyIGV2ZXJ5IG9iamVjdCwgYW5kIHRoZSBjYXNlIHNlZWRzXG4gKiBhcmUgdGhlIHJlY29yZHMgdGhleSBtb3N0IG9mdGVuIGhhbmcgb2ZmICgjNjcxKS4gVGhvc2UgdGhyZWUgb2JqZWN0cyBhcmUgdGhlXG4gKiBTQUxFUyBwYWNrYWdlJ3MgdW5kZXIgdGhlIEFEUi0wMTMwIGxheW91dCAocGxhbiBpdGVtIDQgXHUyMDE0IHRoZSBhY3Rpdml0eVxuICogb2JqZWN0cyBmb2xkIGludG8gdGhlIGFwcCBwYWNrYWdlKSwgc28gdGhlaXIgcm93cyBtb3ZlZCB3aXRoIHRoZW0gdG9cbiAqIGBzcmMvc2FsZXMvZGF0YS9hY3Rpdml0eS5zZWVkLnRzYC4gTm90aGluZyBhYm91dCB0aGUgcm93cyBjaGFuZ2VkOiB0aGV5IHN0aWxsXG4gKiByZWZlcmVuY2UgY2FzZXMgYnkgbmF0dXJhbCBrZXkuIFRoZXNlIGNhc2Ugcm93cyBhcmUgcmVnaXN0ZXJlZCBieSB0aGUgc2VydmljZVxuICogcGFja2FnZSBhbmQgdGhlIGFjdGl2aXR5IHJvd3MgYnkgdGhlIGFwcCBwYWNrYWdlOyBtZWFzdXJlZCBvbiBhIGZyZXNoIGJvb3RcbiAqIG9mIHRoZSB0d28tcGFja2FnZSBhcnRpZmFjdCAoIzE5MDcpLCB0aGUgbG9va3VwcyByZXNvbHZlIGluIGJvdGggZGlyZWN0aW9ucyBcdTIwMTRcbiAqIGV2ZXJ5IHNlZWRlZCBjYXNlJ3MgYWNjb3VudCwgYW5kIGV2ZXJ5IHNlZWRlZCBldmVudCdzIGNhc2UuXG4gKlxuICogU3BsaXQgb3V0IG9mIHRoZSBmb3JtZXIgbW9ub2xpdGhpYyBgc3JjL2RhdGEvaW5kZXgudHNgICgjNjM1KS4gU2VlZCBkb2N0cmluZVxuICogbGl2ZXMgaW4gYHNyYy9zYWxlcy9kYXRhL19zaGFyZWQudHNgLlxuICovXG5pbXBvcnQgeyBkZWZpbmVTZWVkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgeyBDYXNlIH0gZnJvbSAnLi4vb2JqZWN0cy9jYXNlLm9iamVjdCc7XG5pbXBvcnQgeyBLbm93bGVkZ2VBcnRpY2xlIH0gZnJvbSAnLi4vb2JqZWN0cy9rbm93bGVkZ2VfYXJ0aWNsZS5vYmplY3QnO1xuaW1wb3J0IHsgQ0FTRV9TTEFfREVGQVVMVF9USUVSLCBjYXNlU2xhQnJlYWNoZWQsIGNhc2VTbGFDYWxlbmRhckhvdXJzIH0gZnJvbSAnLi4vb2JqZWN0cy9fY2FzZS1zbGEnO1xuaW1wb3J0IHsgY2VsRGF5c0FnbyB9IGZyb20gJy4uLy4uL3NhbGVzL2RhdGEvX3NoYXJlZCc7XG5pbXBvcnQgeyBhY2NvdW50cyB9IGZyb20gJy4uLy4uL3NhbGVzL2RhdGEvc2FsZXMuc2VlZCc7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBTZWVkZWQgU0xBIGR1ZSBkYXRlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vXG4vLyBIb29rcyBkbyBub3QgcnVuIG92ZXIgc2VlZHMsIHNvIGEgaG9vay1vd25lZCBmaWVsZCBoYXMgdG8gYXJyaXZlIGFscmVhZHlcbi8vIGhvbGRpbmcgd2hhdCB0aGUgaG9vayB3b3VsZCBoYXZlIGNvbXB1dGVkIChgdGVzdC9zZWVkLWNvbnNpc3RlbmN5LnRlc3QudHNgXG4vLyBpcyB0aGUgZW5mb3JjZW1lbnQpLiBgc2xhX2R1ZV9kYXRlYCB1c2VkIHRvIGJlIGhhbmQtdHlwZWQgcGVyIGNhc2UgXHUyMDE0IGVpZ2h0XG4vLyBudW1iZXJzIHBpY2tlZCB0byBsb29rIHBsYXVzaWJsZSBcdTIwMTQgYW5kIGl0IGlzIG5vdyBERVJJVkVEIGZyb20gdGhlIHNhbWVcbi8vIHByaW9yaXR5IFx1MDBENyBhY2NvdW50LXRpZXIgbWF0cml4IGBjYXNlX3NsYV9kZWZhdWx0c2AgYXBwbGllcywgc28gYSBjZWxsIGNoYW5nZVxuLy8gbW92ZXMgdGhlIGRlbW8gZGF0YSB3aXRoIGl0IGluc3RlYWQgb2YgbGVhdmluZyBpdCBseWluZy5cbi8vXG4vLyBUaGUgYWNjb3VudCB0aWVyIGlzIHJlYWQgb2ZmIHRoZSBhY2NvdW50IHNlZWQgaXRzZWxmIHJhdGhlciB0aGFuIGNvcGllZCBpbnRvXG4vLyBhIHRhYmxlIGhlcmU6IGBjcm1fYWNjb3VudC50aWVyYCBpcyB0aGUgaW5wdXQgdGhlIG1hdHJpeCB0YWtlcywgYW5kIHRoZXJlIGlzXG4vLyBubyByZWFzb24gZm9yIHRoaXMgZmlsZSB0byBob2xkIGEgc2Vjb25kIG9waW5pb24gYWJvdXQgd2hpY2ggdGllciBBY21lIGlzLlxuY29uc3QgVElFUl9CWV9BQ0NPVU5UID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oXG4gIChhY2NvdW50cy5yZWNvcmRzIGFzIFJlYWRvbmx5QXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KS5tYXAoKGEpID0+IFtcbiAgICBTdHJpbmcoYS5uYW1lKSxcbiAgICB0eXBlb2YgYS50aWVyID09PSAnc3RyaW5nJyA/IGEudGllciA6IENBU0VfU0xBX0RFRkFVTFRfVElFUixcbiAgXSksXG4pO1xuXG4vKiogVGhlIG1hdHJpeCBjZWxsIGBjYXNlX3NsYV9kZWZhdWx0c2Agd291bGQgaGF2ZSBhcHBsaWVkLCBpbiBjYWxlbmRhciBob3VycyBhZnRlciBjcmVhdGlvbi4gKi9cbmNvbnN0IHNlZWRlZFNsYUhvdXJzID0gKHByaW9yaXR5OiBzdHJpbmcsIGFjY291bnROYW1lPzogc3RyaW5nKTogbnVtYmVyID0+IHtcbiAgY29uc3QgaG91cnMgPSBjYXNlU2xhQ2FsZW5kYXJIb3Vycyhwcmlvcml0eSwgYWNjb3VudE5hbWUgPyBUSUVSX0JZX0FDQ09VTlQuZ2V0KGFjY291bnROYW1lKSA6IHVuZGVmaW5lZCk7XG4gIGlmIChob3VycyA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYHNlZWQ6IG5vIFNMQSBtYXRyaXggcm93IGZvciBwcmlvcml0eSBcIiR7cHJpb3JpdHl9XCJgKTtcbiAgcmV0dXJuIGhvdXJzO1xufTtcblxuLyoqXG4gKiBgY3JlYXRlZF9hdCArIG1hdHJpeChwcmlvcml0eSwgdGllcilgLCBhcyBhIENFTCBleHByZXNzaW9uIFx1MjAxNCB0aGUgY2FzZSdzXG4gKiBhdXRob3JlZCBjcmVhdGlvbiBpbnN0YW50ICh0aGUgcGxhdGZvcm0ncyBvd24gYGNyZWF0ZWRfYXRgLCB3aGljaCB0aGUgc2VlZFxuICogbG9hZGVyIGtlZXBzIG9uIGZpcnN0IGluc2VydCBzaW5jZSBAb2JqZWN0c3RhY2svb2JqZWN0cWwgMTcuNy4wLFxuICogb2JqZWN0c3RhY2sjMjE2NDYpIHBsdXMgdGhlIGNlbGwgYGNhc2Vfc2xhX2RlZmF1bHRzYCB3b3VsZCBoYXZlIGFwcGxpZWQuXG4gKlxuICogYGRheXNBZ28obilgIGlzIGEgVVRDIG1pZG5pZ2h0LCBzbyB0aGUgaG91ciBvZmZzZXQgaGFzIHRvIGJlIGFkZGVkIG9uIHRvcCBvZlxuICogaXQgXHUyMDE0IGhlbmNlIGArIGR1cmF0aW9uKCdOaCcpYCByYXRoZXIgdGhhbiBhIHNlY29uZCBkYXktZ3JhbnVsYXIgaGVscGVyLlxuICpcbiAqIEEgZHVlIGRhdGUgdGhhdCBsYW5kcyBpbiB0aGUgcGFzdCBpcyBleHBlY3RlZCBhbmQgY29ycmVjdCBvbiBhbiBvbGQgb3BlbiBjYXNlXG4gKiBcdTIwMTQgdGhhdCBpcyB3aGF0IGEgYnJlYWNoIElTLiBPbiBhbiBPUEVOIGNhc2UgdGhlIGZsYWcgaXMgYGNhc2Vfc2xhX21vbml0b3JgJ3NcbiAqIHRvIHdyaXRlLCBvbiBhIGRlcGxveW1lbnQgdGhhdCBydW5zIHNjaGVkdWxlZCB3b3JrLCBhbmQgdGhlIHNlZWQgb25seSBwcmUtc2V0c1xuICogaXQgd2hlcmUgdGhlIGRlbW8gd2FudHMgYSBicmVhY2ggdmlzaWJsZSB3aXRob3V0IGEgc3dlZXAuXG4gKi9cbmNvbnN0IGNlbENhc2VTbGFEdWUgPSAoY3JlYXRlZERheXNBZ286IG51bWJlciwgcHJpb3JpdHk6IHN0cmluZywgYWNjb3VudE5hbWU/OiBzdHJpbmcpID0+XG4gIGNlbGBkYXlzQWdvKCR7Y3JlYXRlZERheXNBZ299KSArIGR1cmF0aW9uKCcke3NlZWRlZFNsYUhvdXJzKHByaW9yaXR5LCBhY2NvdW50TmFtZSl9aCcpYDtcblxuLyoqXG4gKiBgaXNfc2xhX3Zpb2xhdGVkYCBvZiBhIFNFVFRMRUQgY2FzZSAocmVzb2x2ZWQgb3IgY2xvc2VkKSBcdTIwMTQgREVSSVZFRCwgbmV2ZXJcbiAqIHBpY2tlZCAoIzIwNzApLiBgY2FzZV9zbGFfZGVmYXVsdHNgIHJlY29yZHMgdGhlIGJyZWFjaCBvbiB0aGUgd3JpdGUgdGhhdFxuICogc2V0dGxlcyBhIGNhc2UgYWZ0ZXIgaXRzIGR1ZSBkYXRlLCBzbyBhIHNldHRsZWQgc2VlZCByb3cgaGFzIHRvIGFycml2ZVxuICogaG9sZGluZyBleGFjdGx5IHdoYXQgdGhhdCB3cml0ZSB3b3VsZCBoYXZlIHJlY29yZGVkOiBgY2FzZVNsYUJyZWFjaGVkYCBvdmVyXG4gKiB0aGUgcm93J3Mgb3duIGRhdGVzLiBCb3RoIGluc3RhbnRzIGFyZSBvZmZzZXRzIGZyb20gdGhlIHNhbWUgYGRheXNBZ28oKWBcbiAqIG1pZG5pZ2h0IFx1MjAxNCB0aGUgZHVlIGRhdGUgYG1hdHJpeChwcmlvcml0eSwgdGllcilgIGhvdXJzIGFmdGVyIGNyZWF0aW9uLCB0aGVcbiAqIHNldHRsZSBpbnN0YW50IChgY2xvc2VkX2RhdGVgLCB3aGljaCBhIHNldHRsZWQgc2VlZCByb3cgY2FycmllcyBhcyBpdHNcbiAqIHJlc29sdmVkLWRhdGUgcHJveHkpIHdob2xlIGRheXMgYWZ0ZXIgaXQgXHUyMDE0IHNvIHRoZSBob3VyIGNvdW50cyBjb21wYXJlXG4gKiBkaXJlY3RseSwgYW5kIGEgY2FzZSBzZXR0bGVkIGV4YWN0bHkgb24gaXRzIGRlYWRsaW5lIG1ldCBpdC5cbiAqXG4gKiBUaGVzZSByb3dzIHVzZWQgdG8gYmUgYXV0aG9yZWQgYGZhbHNlYCBhY3Jvc3MgdGhlIGJvYXJkLCB3aGljaCBtYWRlIHRoZVxuICogYHNsYV9wZXJmb3JtYW5jZWAgcmVwb3J0IGFuZCB0aGUgY29tcGxpYW5jZSBnYXVnZSByZWFkIDEwMCUgbWV0IG92ZXIgY2xvc2VkXG4gKiBjYXNlcyB0aGF0IGhhZCBmaW5pc2hlZCBkYXlzIGxhdGUgYnkgdGhlaXIgb3duIGRhdGVzLlxuICovXG5jb25zdCBzZWVkZWRTZXR0bGVkQnJlYWNoID0gKFxuICBjcmVhdGVkRGF5c0FnbzogbnVtYmVyLFxuICBzZXR0bGVkRGF5c0FnbzogbnVtYmVyLFxuICBwcmlvcml0eTogc3RyaW5nLFxuICBhY2NvdW50TmFtZT86IHN0cmluZyxcbik6IGJvb2xlYW4gPT4gY2FzZVNsYUJyZWFjaGVkKHNlZWRlZFNsYUhvdXJzKHByaW9yaXR5LCBhY2NvdW50TmFtZSksIChjcmVhdGVkRGF5c0FnbyAtIHNldHRsZWREYXlzQWdvKSAqIDI0KTtcblxuLy8gXHUyNTAwXHUyNTAwXHUyNTAwIENhc2VzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IGNvbnN0IGNhc2VzID0gZGVmaW5lU2VlZChDYXNlLCB7XG4gIG1vZGU6ICd1cHNlcnQnLFxuICBleHRlcm5hbElkOiAnc3ViamVjdCcsXG4gIHJlY29yZHM6IFtcbiAgICB7XG4gICAgICBzdWJqZWN0OiAnTG9naW4gaXNzdWVzIGFmdGVyIHBsYXRmb3JtIHVwZ3JhZGUnLFxuICAgICAgZGVzY3JpcHRpb246IGBVc2VycyBpbiB0aGUgRU1FQSBvZmZpY2UgcmVwb3J0IGludGVybWl0dGVudCA0MDEgZXJyb3JzIHdoZW4gbG9nZ2luZyBpbiBhZnRlciB0aGUgdjQuMiB1cGdyYWRlIHJvbGxlZCBvdXQgV2VkbmVzZGF5IG5pZ2h0LiBQYXR0ZXJuOiBvbmx5IGFmZmVjdHMgdXNlcnMgYXV0aGVudGljYXRpbmcgdmlhIFNBTUwgdGhyb3VnaCBPa3RhLCBvbmx5IGJldHdlZW4gMDk6MDBcdTIwMTMxMDozMCBVVEMuIE5BIGFuZCBBUEFDIHVzZXJzIGFyZSB1bmFmZmVjdGVkLlxuXG4qKkN1c3RvbWVyIGltcGFjdDoqKiB+NDAgdXNlcnMgYmxvY2tlZCBhdCBwZWFrLCBjb3N0aW5nIH4zIHByb2R1Y3RpdmUgaG91cnMgcGVyIGFmZmVjdGVkIHVzZXIuXG5cbioqSW5pdGlhbCB0cmlhZ2U6KiogU3VzcGVjdCBhIGNsb2NrLXNrZXcgaXNzdWUgb24gdGhlIEVNRUEgU1NPIHJlbGF5IGFkZGVkIGR1cmluZyB0aGUgdXBncmFkZSB3aW5kb3cuIEVuZ2luZWVyaW5nIGlzIHJlcHJvZHVjaW5nIGluIHN0YWdpbmcuYCxcbiAgICAgIGNybV9hY2NvdW50OiAnQWNtZSBDb3Jwb3JhdGlvbicsXG4gICAgICBjcm1fY29udGFjdDogJ2pvaG4uc21pdGhAYWNtZS5leGFtcGxlLmNvbScsXG4gICAgICBzdGF0dXM6ICdpbl9wcm9ncmVzcycsXG4gICAgICBwcmlvcml0eTogJ2hpZ2gnLFxuICAgICAgcHJpb3JpdHlfcmFuazogMyxcbiAgICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICAgIG9yaWdpbjogJ2VtYWlsJyxcbiAgICAgIGlzX2Nsb3NlZDogZmFsc2UsXG4gICAgICBpc19zbGFfdmlvbGF0ZWQ6IGZhbHNlLFxuICAgICAgaXNfZXNjYWxhdGVkOiBmYWxzZSxcbiAgICAgIGNyZWF0ZWRfYXQ6IGNlbGBkYXlzQWdvKDIpYCxcbiAgICAgIHNsYV9kdWVfZGF0ZTogY2VsQ2FzZVNsYUR1ZSgyLCAnaGlnaCcsICdBY21lIENvcnBvcmF0aW9uJyksXG4gICAgfSxcbiAgICB7XG4gICAgICBzdWJqZWN0OiAnRGF0YSBleHBvcnQgdGltaW5nIG91dCBmb3IgbGFyZ2UgZGF0YXNldHMnLFxuICAgICAgZGVzY3JpcHRpb246ICdDU1YgZXhwb3J0IGZhaWxzIGZvciBkYXRhc2V0cyBvdmVyIDEwayByb3dzLicsXG4gICAgICBjcm1fYWNjb3VudDogJ0dsb2JleCBJbmR1c3RyaWVzJyxcbiAgICAgIGNybV9jb250YWN0OiAnc2FyYWguakBnbG9iZXguZXhhbXBsZS5jb20nLFxuICAgICAgc3RhdHVzOiAnZXNjYWxhdGVkJyxcbiAgICAgIHByaW9yaXR5OiAnY3JpdGljYWwnLFxuICAgICAgcHJpb3JpdHlfcmFuazogNCxcbiAgICAgIHR5cGU6ICdidWcnLFxuICAgICAgb3JpZ2luOiAncGhvbmUnLFxuICAgICAgaXNfY2xvc2VkOiBmYWxzZSxcbiAgICAgIGlzX3NsYV92aW9sYXRlZDogdHJ1ZSxcbiAgICAgIGlzX2VzY2FsYXRlZDogdHJ1ZSxcbiAgICAgIGVzY2FsYXRpb25fcmVhc29uOiAnQ3VzdG9tZXIgdGhyZWF0ZW5pbmcgY2h1cm4nLFxuICAgICAgY3JlYXRlZF9hdDogY2VsYGRheXNBZ28oNSlgLFxuICAgICAgc2xhX2R1ZV9kYXRlOiBjZWxDYXNlU2xhRHVlKDUsICdjcml0aWNhbCcsICdHbG9iZXggSW5kdXN0cmllcycpLFxuICAgIH0sXG4gICAge1xuICAgICAgc3ViamVjdDogJ0hvdyB0byBjb25maWd1cmUgU1NPIHdpdGggT2t0YT8nLFxuICAgICAgZGVzY3JpcHRpb246ICdDdXN0b21lciBuZWVkcyBndWlkYW5jZSBvbiBTU08gc2V0dXAgd2l0aCBPa3RhLicsXG4gICAgICBjcm1fYWNjb3VudDogJ0luaXRlY2ggU29sdXRpb25zJyxcbiAgICAgIGNybV9jb250YWN0OiAnbWNoZW5AaW5pdGVjaC5leGFtcGxlLmNvbScsXG4gICAgICBzdGF0dXM6ICdyZXNvbHZlZCcsXG4gICAgICBwcmlvcml0eTogJ21lZGl1bScsXG4gICAgICBwcmlvcml0eV9yYW5rOiAyLFxuICAgICAgdHlwZTogJ3F1ZXN0aW9uJyxcbiAgICAgIG9yaWdpbjogJ3dlYicsXG4gICAgICAvLyBSZXNvbHZlZC1idXQtbm90LWNsb3NlZDogY2FzZS5ob29rIGtlZXBzIGlzX2Nsb3NlZD1mYWxzZSBhbmQgc3RhbXBzXG4gICAgICAvLyBjbG9zZWRfZGF0ZSBhcyB0aGUgcmVzb2x2ZWQtZGF0ZSBwcm94eTsgcmVzb2x1dGlvbl90aW1lX2hvdXJzIGlzIHRoZVxuICAgICAgLy8gY2xvc2VkXHUyMjEyY3JlYXRlZCBkZWx0YSB0aGUgaG9vayB3b3VsZCBjb21wdXRlIChkYXlzQWdvKCkgaXMgZGF5LWdyYW51bGFyLFxuICAgICAgLy8gc28gZGVsdGFzIGNvbWUgaW4gMjRoIHN0ZXBzKS5cbiAgICAgIGlzX2Nsb3NlZDogZmFsc2UsXG4gICAgICBpc19zbGFfdmlvbGF0ZWQ6IHNlZWRlZFNldHRsZWRCcmVhY2goMywgMiwgJ21lZGl1bScsICdJbml0ZWNoIFNvbHV0aW9ucycpLFxuICAgICAgaXNfZXNjYWxhdGVkOiBmYWxzZSxcbiAgICAgIHJlc29sdXRpb25fdGltZV9ob3VyczogMjQuMCxcbiAgICAgIGNyZWF0ZWRfYXQ6IGNlbGBkYXlzQWdvKDMpYCxcbiAgICAgIGNsb3NlZF9kYXRlOiBjZWxgZGF5c0FnbygyKWAsXG4gICAgICBzbGFfZHVlX2RhdGU6IGNlbENhc2VTbGFEdWUoMywgJ21lZGl1bScsICdJbml0ZWNoIFNvbHV0aW9ucycpLFxuICAgIH0sXG4gICAge1xuICAgICAgc3ViamVjdDogJ0FQSSByYXRlIGxpbWl0IGV4Y2VlZGVkIG9uIHByb2R1Y3Rpb24nLFxuICAgICAgZGVzY3JpcHRpb246ICdQcm9kdWN0aW9uIGVudmlyb25tZW50IGhpdHRpbmcgcmF0ZSBsaW1pdHMgZHVyaW5nIHBlYWsgaG91cnMuJyxcbiAgICAgIGNybV9hY2NvdW50OiAnV2F5bmUgRW50ZXJwcmlzZXMnLFxuICAgICAgY3JtX2NvbnRhY3Q6ICdyd2lsc29uQHdheW5lLmV4YW1wbGUuY29tJyxcbiAgICAgIHN0YXR1czogJ2Nsb3NlZCcsXG4gICAgICBwcmlvcml0eTogJ2hpZ2gnLFxuICAgICAgcHJpb3JpdHlfcmFuazogMyxcbiAgICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICAgIG9yaWdpbjogJ2NoYXQnLFxuICAgICAgaXNfY2xvc2VkOiB0cnVlLFxuICAgICAgaXNfc2xhX3Zpb2xhdGVkOiBzZWVkZWRTZXR0bGVkQnJlYWNoKDcsIDYsICdoaWdoJywgJ1dheW5lIEVudGVycHJpc2VzJyksXG4gICAgICBpc19lc2NhbGF0ZWQ6IGZhbHNlLFxuICAgICAgLy8gYHJlc29sdXRpb25gIGlzIFJFUVVJUkVEIHdoZW4gc3RhdHVzIGlzICdjbG9zZWQnIChvYmplY3QgdmFsaWRhdGlvblxuICAgICAgLy8gYHJlc29sdXRpb25fcmVxdWlyZWRfZm9yX2Nsb3NlZGApIFx1MjAxNCB3aXRob3V0IGl0IHRoZSBzZWVkIHJvdyBpcyByZWplY3RlZC5cbiAgICAgIHJlc29sdXRpb246ICdSYWlzZWQgdGhlIHByb2R1Y3Rpb24gcmF0ZS1saW1pdCB0aWVyIGFuZCBhZGRlZCBjbGllbnQtc2lkZSBiYWNrb2ZmOyB1c2FnZSBub3cgd2l0aGluIGxpbWl0cy4nLFxuICAgICAgLy8gVGhlIGRlZmxlY3Rpb24gbGluayAoIzYwMSk6IHRoaXMgY2FzZSB3YXMgYW5zd2VyZWQgb3V0IG9mIHRoZSBrbm93bGVkZ2VcbiAgICAgIC8vIGJhc2UsIHNvIGl0IG5hbWVzIHRoZSBhcnRpY2xlIHRoYXQgcmVzb2x2ZWQgaXQuIFJlZmVyZW5jZWQgYnkgdGhlXG4gICAgICAvLyBhcnRpY2xlIHNlZWQncyBgZXh0ZXJuYWxJZGAgKGB0aXRsZWApLCB0aGUgc2FtZSB3YXkgZXZlcnkgb3RoZXIgc2VlZGVkXG4gICAgICAvLyBsb29rdXAgbmFtZXMgaXRzIHRhcmdldC5cbiAgICAgIHJlc29sdmVkX2J5X2FydGljbGU6ICdBUEkgUmF0ZSBMaW1pdHMnLFxuICAgICAgLy8gY2xvc2VkXHUyMjEyY3JlYXRlZCBkZWx0YSwgYXMgY2FzZS5ob29rIGNvbXB1dGVzIGl0LlxuICAgICAgcmVzb2x1dGlvbl90aW1lX2hvdXJzOiAyNC4wLFxuICAgICAgY3JlYXRlZF9hdDogY2VsYGRheXNBZ28oNylgLFxuICAgICAgY2xvc2VkX2RhdGU6IGNlbGBkYXlzQWdvKDYpYCxcbiAgICAgIHNsYV9kdWVfZGF0ZTogY2VsQ2FzZVNsYUR1ZSg3LCAnaGlnaCcsICdXYXluZSBFbnRlcnByaXNlcycpLFxuICAgIH0sXG4gICAge1xuICAgICAgc3ViamVjdDogJ1BERiByZXBvcnRzIG5vdCByZW5kZXJpbmcgY2hhcnRzIGNvcnJlY3RseScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NoYXJ0cyBhcHBlYXIgYmxhbmsgd2hlbiBleHBvcnRpbmcgZGFzaGJvYXJkIHRvIFBERi4nLFxuICAgICAgY3JtX2FjY291bnQ6ICdTdGFyayBNZWRpY2FsJyxcbiAgICAgIGNybV9jb250YWN0OiAnZW1pbHkuZEBzdGFya21lZC5leGFtcGxlLmNvbScsXG4gICAgICBzdGF0dXM6ICduZXcnLFxuICAgICAgcHJpb3JpdHk6ICdtZWRpdW0nLFxuICAgICAgcHJpb3JpdHlfcmFuazogMixcbiAgICAgIHR5cGU6ICdidWcnLFxuICAgICAgb3JpZ2luOiAnZW1haWwnLFxuICAgICAgaXNfY2xvc2VkOiBmYWxzZSxcbiAgICAgIGlzX3NsYV92aW9sYXRlZDogZmFsc2UsXG4gICAgICBpc19lc2NhbGF0ZWQ6IGZhbHNlLFxuICAgICAgY3JlYXRlZF9hdDogY2VsYGRheXNBZ28oMSlgLFxuICAgICAgc2xhX2R1ZV9kYXRlOiBjZWxDYXNlU2xhRHVlKDEsICdtZWRpdW0nLCAnU3RhcmsgTWVkaWNhbCcpLFxuICAgIH0sXG4gICAge1xuICAgICAgc3ViamVjdDogJ0JpbGxpbmcgZGlzY3JlcGFuY3kgb24gbGFzdCBpbnZvaWNlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiBgQ3VzdG9tZXIgKExpc2EgS2ltLCBQcm9jdXJlbWVudCkgZmxhZ2dlZCB0aGF0IHRoZSBNYXkgaW52b2ljZSBzaG93cyAxNSBhY3RpdmUgc2VhdHMgYnV0IEFjbWUgaXMgb25seSB1c2luZyAxMi4gVHdvIG9mIHRoZSBzZWF0cyB3ZXJlIGRlLXByb3Zpc2lvbmVkIGluIGVhcmx5IEFwcmlsIHdoZW4gdHdvIGVuZ2luZWVycyBsZWZ0IHRoZSBjb21wYW55LlxuXG4qKlJvb3QgY2F1c2U6KiogdGhlIGRlLXByb3Zpc2lvbmluZyBoYXBwZW5lZCBpbiBvdXIgYWRtaW4gY29uc29sZSBidXQgdGhlIHNlYXQtY291bnQgbWV0cmljIGluIGJpbGxpbmcgb25seSByZWZyZXNoZXMgbW9udGhseSwgc28gdGhlIE1heSBpbnZvaWNlIHBpY2tlZCB1cCB0aGUgcHJlLWNoYW5nZSBjb3VudC5cblxuKipSZXNvbHV0aW9uIHBhdGg6KiogaXNzdWUgYSAkMSwyMDAgY3JlZGl0IG1lbW8gYW5kIHN3aXRjaCBBY21lIHRvIHRoZSBuZXcgcmVhbC10aW1lIHNlYXQtYmlsbGluZyBwaXBlbGluZSBzbyB0aGlzIGNhbid0IHJlY3VyLiBXYWl0aW5nIG9uIExpc2EgdG8gY29uZmlybSBzaGUncyBnb29kIHdpdGggdGhlIGNyZWRpdC1tZW1vIHRyZWF0bWVudCB2cyBhIHJlZnVuZC5gLFxuICAgICAgY3JtX2FjY291bnQ6ICdBY21lIENvcnBvcmF0aW9uJyxcbiAgICAgIGNybV9jb250YWN0OiAnam9obi5zbWl0aEBhY21lLmV4YW1wbGUuY29tJyxcbiAgICAgIHN0YXR1czogJ3dhaXRpbmdfY3VzdG9tZXInLFxuICAgICAgcHJpb3JpdHk6ICdsb3cnLFxuICAgICAgcHJpb3JpdHlfcmFuazogMSxcbiAgICAgIHR5cGU6ICdwcm9ibGVtJyxcbiAgICAgIG9yaWdpbjogJ2VtYWlsJyxcbiAgICAgIGlzX2Nsb3NlZDogZmFsc2UsXG4gICAgICBpc19zbGFfdmlvbGF0ZWQ6IGZhbHNlLFxuICAgICAgaXNfZXNjYWxhdGVkOiBmYWxzZSxcbiAgICAgIGNyZWF0ZWRfYXQ6IGNlbGBkYXlzQWdvKDQpYCxcbiAgICAgIHNsYV9kdWVfZGF0ZTogY2VsQ2FzZVNsYUR1ZSg0LCAnbG93JywgJ0FjbWUgQ29ycG9yYXRpb24nKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHN1YmplY3Q6ICdNb2JpbGUgYXBwIGNyYXNoZXMgb24gaU9TIDE3JyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQXBwIGNyYXNoZXMgb24gbGF1bmNoIGZvciB1c2VycyBydW5uaW5nIGlPUyAxNy4yKy4nLFxuICAgICAgY3JtX2FjY291bnQ6ICdHbG9iZXggSW5kdXN0cmllcycsXG4gICAgICBjcm1fY29udGFjdDogJ3NhcmFoLmpAZ2xvYmV4LmV4YW1wbGUuY29tJyxcbiAgICAgIHN0YXR1czogJ2luX3Byb2dyZXNzJyxcbiAgICAgIHByaW9yaXR5OiAnY3JpdGljYWwnLFxuICAgICAgcHJpb3JpdHlfcmFuazogNCxcbiAgICAgIHR5cGU6ICdidWcnLFxuICAgICAgb3JpZ2luOiAnd2ViJyxcbiAgICAgIGlzX2Nsb3NlZDogZmFsc2UsXG4gICAgICBpc19zbGFfdmlvbGF0ZWQ6IHRydWUsXG4gICAgICBpc19lc2NhbGF0ZWQ6IHRydWUsXG4gICAgICBlc2NhbGF0aW9uX3JlYXNvbjogJ0FmZmVjdHMgMzAlIG9mIG1vYmlsZSB1c2VycycsXG4gICAgICBjcmVhdGVkX2F0OiBjZWxgZGF5c0FnbygzKWAsXG4gICAgICBzbGFfZHVlX2RhdGU6IGNlbENhc2VTbGFEdWUoMywgJ2NyaXRpY2FsJywgJ0dsb2JleCBJbmR1c3RyaWVzJyksXG4gICAgfSxcbiAgICB7XG4gICAgICBzdWJqZWN0OiAnUmVxdWVzdDogYnVsayBpbXBvcnQgdmlhIENTVicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0N1c3RvbWVyIHJlcXVlc3RpbmcgYWJpbGl0eSB0byBpbXBvcnQgcmVjb3JkcyB2aWEgQ1NWIHVwbG9hZC4nLFxuICAgICAgY3JtX2FjY291bnQ6ICdXYXluZSBFbnRlcnByaXNlcycsXG4gICAgICBjcm1fY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLFxuICAgICAgc3RhdHVzOiAnY2xvc2VkJyxcbiAgICAgIHByaW9yaXR5OiAnbG93JyxcbiAgICAgIHByaW9yaXR5X3Jhbms6IDEsXG4gICAgICB0eXBlOiAnZmVhdHVyZV9yZXF1ZXN0JyxcbiAgICAgIG9yaWdpbjogJ3dlYicsXG4gICAgICBpc19jbG9zZWQ6IHRydWUsXG4gICAgICBpc19zbGFfdmlvbGF0ZWQ6IHNlZWRlZFNldHRsZWRCcmVhY2goMTAsIDgsICdsb3cnLCAnV2F5bmUgRW50ZXJwcmlzZXMnKSxcbiAgICAgIGlzX2VzY2FsYXRlZDogZmFsc2UsXG4gICAgICAvLyBSZXF1aXJlZCBmb3IgY2xvc2VkIGNhc2VzIChyZXNvbHV0aW9uX3JlcXVpcmVkX2Zvcl9jbG9zZWQpLlxuICAgICAgcmVzb2x1dGlvbjogJ0RlbGl2ZXJlZCBDU1YgYnVsay1pbXBvcnQgaW4gdGhlIDkuNCByZWxlYXNlOyBzaGFyZWQgdGhlIGRvY3MgbGluayB3aXRoIHRoZSBjdXN0b21lci4nLFxuICAgICAgLy8gY2xvc2VkXHUyMjEyY3JlYXRlZCBkZWx0YSwgYXMgY2FzZS5ob29rIGNvbXB1dGVzIGl0LlxuICAgICAgcmVzb2x1dGlvbl90aW1lX2hvdXJzOiA0OC4wLFxuICAgICAgY3JlYXRlZF9hdDogY2VsYGRheXNBZ28oMTApYCxcbiAgICAgIGNsb3NlZF9kYXRlOiBjZWxgZGF5c0Fnbyg4KWAsXG4gICAgICBzbGFfZHVlX2RhdGU6IGNlbENhc2VTbGFEdWUoMTAsICdsb3cnLCAnV2F5bmUgRW50ZXJwcmlzZXMnKSxcbiAgICB9LFxuICAgIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBHZW5lcmF0ZWQgZGVtbyBjYXNlcyBcdTIwMTQgMzAgY2FzZXMgb3ZlciB0aGUgbGFzdCAzMCBkYXlzLCBtaXhlZCBhY3Jvc3NcbiAgICAvLyBwcmlvcml0aWVzLiBQb3dlcnMgYENhc2VzT3BlbmVkQnlEYXlQcmlvcml0eVJlcG9ydGAgKGRhaWx5IGJ1Y2tldGluZ1xuICAgIC8vIG1hdHJpeCkgYW5kIHRoZSBzZXJ2aWNlIGRhc2hib2FyZCdzIGRhaWx5LXZvbHVtZSBhcmVhIGNoYXJ0LlxuICAgIC8vXG4gICAgLy8gIyMjIFdoeSBldmVyeSBheGlzIGNhcnJpZXMgYSByb3RhdGlvbiwgYW5kIG5vdCBqdXN0IGBpICUgbGVuZ3RoYCAoIzE2NTkpXG4gICAgLy9cbiAgICAvLyBUaGVzZSByb3dzIHVzZWQgdG8gcmVhZCBPTkUgY291bnRlciBmb3IgZXZlcnkgYXhpczogYGNybV9hY2NvdW50YCBhbmRcbiAgICAvLyBgc3RhdHVzYCBib3RoIHRvb2sgYGkgJSA1YCwgYW5kIGBwcmlvcml0eWAsIGB0eXBlYCBhbmQgYG9yaWdpbmAgYWxsIHRvb2tcbiAgICAvLyBgaSAlIDRgLiBFcXVhbC1sZW5ndGggbGlzdHMgd2Fsa2VkIGJ5IG9uZSBpbmRleCBhZHZhbmNlIGluIGxvY2tzdGVwLCBzb1xuICAgIC8vIGVhY2ggZ3JvdXAgY2FtZSBvdXQgUEVSRkVDVExZIGNvcnJlbGF0ZWQgXHUyMDE0IGV2ZXJ5IEFjbWUgY2FzZSBgbmV3YCwgZXZlcnlcbiAgICAvLyBHbG9iZXggY2FzZSBgaW5fcHJvZ3Jlc3NgLCBhbmQgZXZlcnkgYGxvd2AgY2FzZSBhIGBxdWVzdGlvbmAgcmFpc2VkIGJ5XG4gICAgLy8gYGVtYWlsYC4gVGhpcnR5IHJvd3Mgb2Ygdm9sdW1lIHdpdGggbm8gdmFyaWV0eSwgd2hpY2ggaXMgdGhlIG9wcG9zaXRlIG9mXG4gICAgLy8gd2hhdCBhIHZvbHVtZSBnZW5lcmF0b3IgaXMgZm9yOiB0aGUgYWNjb3VudCBcdTAwRDcgc3RhdHVzIGNyb3NzLXRhYiBoZWxkIDUgb2ZcbiAgICAvLyBpdHMgMjUgY2VsbHMsIGFuZCBwcmlvcml0eSBcdTAwRDcgdHlwZSBcdTAwRDcgb3JpZ2luIDQgb2YgMTYgYXBpZWNlLlxuICAgIC8vXG4gICAgLy8gRWFjaCBsaXN0IG5vdyBhZHZhbmNlcyBvbmUgc3RlcCBwZXIgcm93IFBMVVMgYSByb3RhdGlvbiBcdTIwMTQgYGNgIGV4dHJhIHN0ZXBzXG4gICAgLy8gZXZlcnkgYG1gIHJvd3MuIFR3byBheGVzIHN0YXkgY29ycmVsYXRlZCBleGFjdGx5IHdoZW4gdGhlaXIgcmVsYXRpdmVcbiAgICAvLyBvZmZzZXQgbmV2ZXIgbW92ZXMsIHNvIHRoZSByb3RhdGlvbnMgYXJlIGNob3NlbiB0byBtYWtlIGV2ZXJ5IHJlbGF0aXZlXG4gICAgLy8gb2Zmc2V0IHN3ZWVwIGl0cyB3aG9sZSBjeWNsZS4gYGNybV9hY2NvdW50YCBpcyB0aGUgYW5jaG9yIGFuZCBjYXJyaWVzIG5vXG4gICAgLy8gcm90YXRpb247IHRoZSBvdGhlciBmb3VyIGFyZSBzdGF0ZWQgcmVsYXRpdmUgdG8gaXQuXG4gICAgLy9cbiAgICAvLyBgYWNjb3VudCBcdTAwRDcgc3RhdHVzYCBpcyBjb21wbGV0ZSBCWSBDT05TVFJVQ1RJT04gcmF0aGVyIHRoYW4gYnkgbHVjaywgYW5kXG4gICAgLy8gdGhlIHByb29mIGlzIG9uZSBsaW5lOiBhY2NvdW50IGBhYCB0YWtlcyByb3dzIGkgPSBhLCBhKzUgXHUyMDI2IGErMjUsIHdob3NlXG4gICAgLy8gYmxvY2sgbnVtYmVycyBydW4gMFx1MjAyNjUsIHNvIGl0cyBzdGF0dXNlcyBhcmUgYChhICsgYikgJSA1YCBvdmVyIGIgPSAwXHUyMDI2NSBcdTIwMTRcbiAgICAvLyBhbGwgZml2ZSBvZiB0aGVtLiBUaGUgdGhpcnR5IHJvd3MgdGhlcmVmb3JlIHdhbGsgdGhlIHdob2xlIDUgXHUwMEQ3IDUgZ3JpZCxcbiAgICAvLyB0d2VudHktZml2ZSBjZWxscyBvbmNlIGFuZCBmaXZlIG9mIHRoZW0gYSBzZWNvbmQgdGltZS5cbiAgICAvL1xuICAgIC8vIFx1MjZBMFx1RkUwRiBUaGUgcmVtYWluaW5nIHRocmVlIGNvbnN0YW50cyBhcmUgVFVORUQsIG5vdCBkZXJpdmVkLiBUaGV5IHdlcmUgcGlja2VkXG4gICAgLy8gYnkgY29tcHV0aW5nIGFsbCB0ZW4gcGFpcndpc2UgY3Jvc3MtdGFicyBhbmQga2VlcGluZyB0aGUgYXNzaWdubWVudCB0aGF0XG4gICAgLy8gbGVmdCB0aGUgZmV3ZXN0IGVtcHR5IGNlbGxzLiBNZWFzdXJlZCBvdmVyIHRoZSBsaXN0cyBhcyBzaGlwcGVkOiAxODggb2ZcbiAgICAvLyB0aGUgMTkzIHBhaXJ3aXNlIGNlbGxzIGFyZSBvY2N1cGllZCwgbm8gY2VsbCBob2xkcyBtb3JlIHRoYW4gMyByb3dzLCBhbmRcbiAgICAvLyB0aGUgbWFyZ2luYWxzIHN0YXkgYXMgZmxhdCBhcyB0aGlydHkgcm93cyBhbGxvdyBcdTIwMTQgNi82LzYvNi82IGJ5IGFjY291bnRcbiAgICAvLyBhbmQgYnkgc3RhdHVzLCA4LzcvNy84IGJ5IHByaW9yaXR5LCB0eXBlIGFuZCBvcmlnaW4uIFx1MjZENCBDaGFuZ2luZyB0aGVcbiAgICAvLyBMRU5HVEggb2YgYW55IGxpc3QgYmVsb3cgdm9pZHMgdGhhdCB0dW5pbmc6IHJlLW1lYXN1cmUgdGhlIGNyb3NzLXRhYnNcbiAgICAvLyByYXRoZXIgdGhhbiBhc3N1bWluZyB0aGUgcm90YXRpb25zIHN0aWxsIHNlcGFyYXRlIHRoZSBheGVzLlxuICAgIC8vXG4gICAgLy8gVHdvIHNjaGVtZXMgdGhhdCByZWFkIGFzIG1vcmUgcHJpbmNpcGxlZCB0aGFuIHRoZXkgbWVhc3VyZSB3ZXJlIHJlamVjdGVkXG4gICAgLy8gaGVyZSwgYW5kIGFyZSByZWNvcmRlZCBzbyB0aGV5IGFyZSBub3QgcmUtZGVyaXZlZDogcm90YXRpbmcgdGhlIDUtbGlzdHNcbiAgICAvLyBvbiB0aGUgNC1ibG9jayBhbmQgdGhlIDQtbGlzdHMgb24gdGhlIDUtYmxvY2sgKFwidGhlIGxlbmd0aHMgYXJlIGNvcHJpbWUsXG4gICAgLy8gc28gdGhleSBjYW5ub3QgcmVzb25hdGVcIikgZW1wdGllcyBvbmUgc3RhdHVzIGNvbXBsZXRlbHk7IGFuZCByb3RhdGluZ1xuICAgIC8vIGBjcm1fYWNjb3VudGAgYXMgd2VsbCBcdTIwMTQgdG8gYnJlYWsgdGhlIGV2ZXJ5LWZpZnRoLWRheSBiZWF0IGl0IHdhbGtzIHRoZVxuICAgIC8vIGNhbGVuZGFyIG9uIFx1MjAxNCBjb3N0cyB0d2VsdmUgZnVydGhlciBlbXB0eSBjZWxscy4gVGhhdCBiZWF0IGlzIHRoZVxuICAgIC8vIGRlbGliZXJhdGUgcHJpY2Ugb2YgYW5jaG9yaW5nOiB3aXRoIG9uZSByb3cgcGVyIGRheSwgc29tZSBheGlzIGhhcyB0byBiZVxuICAgIC8vIHRoZSBmaXhlZCBvbmUgdGhlIG90aGVyIGZvdXIgYXJlIG1lYXN1cmVkIGFnYWluc3QuXG4gICAgLi4uKCgpOiByZWFkb25seSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0+IHtcbiAgICAgIGNvbnN0IHByaW9yaXRpZXMgPSBbJ2xvdycsICdtZWRpdW0nLCAnaGlnaCcsICdjcml0aWNhbCddIGFzIGNvbnN0O1xuICAgICAgLy8gTWlycm9yIG9mIGNhc2UuaG9vaydzIHByaW9yaXR5IHJhbmsgbWFwIFx1MjAxNCBob29rcyBkb24ndCBydW4gb3ZlciBzZWVkcy5cbiAgICAgIGNvbnN0IHJhbmtCeVByaW9yaXR5OiBSZWNvcmQ8dHlwZW9mIHByaW9yaXRpZXNbbnVtYmVyXSwgbnVtYmVyPiA9IHsgbG93OiAxLCBtZWRpdW06IDIsIGhpZ2g6IDMsIGNyaXRpY2FsOiA0IH07XG4gICAgICBjb25zdCB0eXBlcyA9IFsncXVlc3Rpb24nLCAnYnVnJywgJ3Byb2JsZW0nLCAnZmVhdHVyZV9yZXF1ZXN0J10gYXMgY29uc3Q7XG4gICAgICBjb25zdCBvcmlnaW5zID0gWydlbWFpbCcsICdwaG9uZScsICd3ZWInLCAnY2hhdCddIGFzIGNvbnN0O1xuICAgICAgY29uc3Qgc3RhdHVzZXMgPSBbJ25ldycsICdpbl9wcm9ncmVzcycsICdyZXNvbHZlZCcsICdjbG9zZWQnLCAnZXNjYWxhdGVkJ10gYXMgY29uc3Q7XG4gICAgICBjb25zdCBhY2NvdW50c0xpc3QgPSBbJ0FjbWUgQ29ycG9yYXRpb24nLCAnR2xvYmV4IEluZHVzdHJpZXMnLCAnV2F5bmUgRW50ZXJwcmlzZXMnLCAnSW5pdGVjaCBTb2x1dGlvbnMnLCAnU3RhcmsgTWVkaWNhbCddIGFzIGNvbnN0O1xuICAgICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDMwOyBpKyspIHtcbiAgICAgICAgLy8gVGhlIGFuY2hvciwgdGhlbiB0aGUgZm91ciByb3RhdGlvbnMgdGhlIGJsb2NrIGNvbW1lbnQgYWJvdmUgZGVyaXZlcy5cbiAgICAgICAgLy8gYDEwYCBpcyB0aGUgb25lIGNvbnN0YW50IHdpdGggbm8gcmVhZGluZyBvZmYgYSBsaXN0IGxlbmd0aCBcdTIwMTQgaXQgaXNcbiAgICAgICAgLy8gdGhlIHJvdGF0aW9uIHRoYXQgbWVhc3VyZWQgYmVzdCBmb3IgYG9yaWdpbmAgYWdhaW5zdCB0aGUgb3RoZXIgZm91ci5cbiAgICAgICAgY29uc3QgYWNjb3VudCA9IGFjY291bnRzTGlzdFtpICUgYWNjb3VudHNMaXN0Lmxlbmd0aF07XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHN0YXR1c2VzWyhpICsgTWF0aC5mbG9vcihpIC8gYWNjb3VudHNMaXN0Lmxlbmd0aCkpICUgc3RhdHVzZXMubGVuZ3RoXTtcbiAgICAgICAgY29uc3QgcHJpb3JpdHkgPSBwcmlvcml0aWVzWyhpICsgTWF0aC5mbG9vcihpIC8gcHJpb3JpdGllcy5sZW5ndGgpKSAlIHByaW9yaXRpZXMubGVuZ3RoXTtcbiAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVzWyhpICsgMiAqIE1hdGguZmxvb3IoaSAvIHR5cGVzLmxlbmd0aCkpICUgdHlwZXMubGVuZ3RoXTtcbiAgICAgICAgY29uc3Qgb3JpZ2luID0gb3JpZ2luc1soaSArIE1hdGguZmxvb3IoaSAvIDEwKSkgJSBvcmlnaW5zLmxlbmd0aF07XG4gICAgICAgIGNvbnN0IHNldHRsZWQgPSBzdGF0dXMgPT09ICdyZXNvbHZlZCcgfHwgc3RhdHVzID09PSAnY2xvc2VkJztcbiAgICAgICAgY29uc3QgYWdlRGF5cyA9IDEgKyAoaSAlIDMwKTtcbiAgICAgICAgLy8gU2V0dGxlZCBjYXNlcyBnZXQgYSByZXNvbHV0aW9uIGRlbGF5IG9mIDFcdTIwMTMzIGRheXMgKGNhcHBlZCBhdCB0aGVcbiAgICAgICAgLy8gY2FzZSdzIGFnZSk7IHJlc29sdXRpb25fdGltZV9ob3VycyBpcyBleGFjdGx5IHRoZSBjbG9zZWRcdTIyMTJjcmVhdGVkXG4gICAgICAgIC8vIGRlbHRhIGNhc2UuaG9vayB3b3VsZCBjb21wdXRlIChkYXlzQWdvKCkgaXMgZGF5LWdyYW51bGFyIFx1MjE5MiAyNGggc3RlcHMpLlxuICAgICAgICBjb25zdCByZXNvbHV0aW9uRGF5cyA9IE1hdGgubWluKGFnZURheXMsIDEgKyAoaSAlIDMpKTtcbiAgICAgICAgLy8gQSBTRVRUTEVEIHJvdydzIGZsYWcgaXMgZGVyaXZlZCBmcm9tIGl0cyBvd24gZGF0ZXMgKCMyMDcwLFxuICAgICAgICAvLyBgc2VlZGVkU2V0dGxlZEJyZWFjaGApOiB0aGUgd3JpdGUgdGhhdCBzZXR0bGVkIGl0IHdvdWxkIGhhdmUgcmVjb3JkZWRcbiAgICAgICAgLy8gYSBsYXRlIGZpbmlzaCwgc28gdGhlIHNlZWQgZG9lcyB0b28uXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEFuIE9QRU4gcm93J3MgZmxhZyBpcyB0aGUgc3dlZXAncyBkZWZpbml0aW9uIFx1MjAxNCBvcGVuLCBhbmQgaXRzIGR1ZSBkYXRlXG4gICAgICAgIC8vIGFscmVhZHkgaW4gdGhlIHBhc3QuIFRoZSBvbGQgZ2VuZXJhdG9yIGZsYWdnZWQgcm93cyBhcyB2aW9sYXRlZCB3aGlsZVxuICAgICAgICAvLyBnaXZpbmcgZXZlcnkgcm93IGEgRlVUVVJFIGR1ZSBkYXRlOyBzaW5jZSAjNTk1IHRoZSBkdWUgZGF0ZSBpcyBERVJJVkVEXG4gICAgICAgIC8vIChgY2VsQ2FzZVNsYUR1ZWAgYmVsb3cpLCBzbyBcImFscmVhZHkgaW4gdGhlIHBhc3RcIiBob2xkcyBieVxuICAgICAgICAvLyBjb25zdHJ1Y3Rpb24gaGVyZTogYSBjcml0aWNhbCBjYXNlIGlzIGR1ZSA0aCBhZnRlciBjcmVhdGlvbiBhbmQgZXZlcnlcbiAgICAgICAgLy8gZ2VuZXJhdGVkIGNhc2UgaXMgYXQgbGVhc3QgYSBkYXkgb2xkLiBUaGUgY29udmVyc2UgaXMgZGVsaWJlcmF0ZWx5IG5vdFxuICAgICAgICAvLyBlbmZvcmNlZCBcdTIwMTQgb3RoZXIgb3BlbiByb3dzIGFyZSBwYXN0IGR1ZSB0b28sIGFuZCBgY2FzZV9zbGFfbW9uaXRvcmBcbiAgICAgICAgLy8gbm90aWNlcyB0aGVtIHdoZXJlIHNjaGVkdWxlZCB3b3JrIHJ1bnMuIFByZS1zZXR0aW5nIHRoZSBmbGFnIGhlcmUgb25seVxuICAgICAgICAvLyBkZWNpZGVzIHdoaWNoIG9wZW4gYnJlYWNoZXMgdGhlIGRlbW8gc2hvd3Mgd2l0aG91dCBhIHN3ZWVwLlxuICAgICAgICBjb25zdCBzbGFWaW9sYXRlZCA9IHNldHRsZWRcbiAgICAgICAgICA/IHNlZWRlZFNldHRsZWRCcmVhY2goYWdlRGF5cywgYWdlRGF5cyAtIHJlc29sdXRpb25EYXlzLCBwcmlvcml0eSwgYWNjb3VudClcbiAgICAgICAgICA6IHByaW9yaXR5ID09PSAnY3JpdGljYWwnICYmIGkgJSAzID09PSAwO1xuICAgICAgICBvdXQucHVzaCh7XG4gICAgICAgICAgc3ViamVjdDogYERlbW8gY2FzZSAke1N0cmluZyhpICsgMSkucGFkU3RhcnQoMiwgJzAnKX0gXHUyMDE0ICR7cHJpb3JpdHl9ICR7dHlwZX1gLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQXV0by1nZW5lcmF0ZWQgZGVtbyBjYXNlIGZvciAke3ByaW9yaXR5fSBwcmlvcml0eSBvbiBkYXkgLSR7YWdlRGF5c30uYCxcbiAgICAgICAgICBjcm1fYWNjb3VudDogYWNjb3VudCxcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgcHJpb3JpdHksXG4gICAgICAgICAgcHJpb3JpdHlfcmFuazogcmFua0J5UHJpb3JpdHlbcHJpb3JpdHldLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgb3JpZ2luLFxuICAgICAgICAgIC8vIGlzX2Nsb3NlZCBzdHJpY3RseSBtaXJyb3JzIGNhc2UuaG9vazogdHJ1ZSBPTkxZIGZvciBzdGF0dXNcbiAgICAgICAgICAvLyAnY2xvc2VkJyBcdTIwMTQgYSByZXNvbHZlZCBjYXNlIGlzIE5PVCBjbG9zZWQgeWV0LlxuICAgICAgICAgIGlzX2Nsb3NlZDogc3RhdHVzID09PSAnY2xvc2VkJyxcbiAgICAgICAgICBpc19zbGFfdmlvbGF0ZWQ6IHNsYVZpb2xhdGVkLFxuICAgICAgICAgIGlzX2VzY2FsYXRlZDogc3RhdHVzID09PSAnZXNjYWxhdGVkJyxcbiAgICAgICAgICAuLi4oc2V0dGxlZCA/IHsgcmVzb2x1dGlvbl90aW1lX2hvdXJzOiByZXNvbHV0aW9uRGF5cyAqIDI0IH0gOiB7fSksXG4gICAgICAgICAgLy8gT2JqZWN0IHZhbGlkYXRpb25zIHJlcXVpcmUgdGhlc2Ugd2hlbiBjbG9zZWQvZXNjYWxhdGVkIFx1MjAxNCB3aXRob3V0XG4gICAgICAgICAgLy8gdGhlbSB0aGUgZ2VuZXJhdGVkIHJvd3MgYXJlIHJlamVjdGVkIChyZXNvbHV0aW9uX3JlcXVpcmVkX2Zvcl9jbG9zZWRcbiAgICAgICAgICAvLyAvIGVzY2FsYXRpb25fcmVhc29uX3JlcXVpcmVkKS5cbiAgICAgICAgICAuLi4oc3RhdHVzID09PSAnY2xvc2VkJyA/IHsgcmVzb2x1dGlvbjogJ1Jlc29sdmVkIHBlciBzdGFuZGFyZCBydW5ib29rOyByb290IGNhdXNlIGRvY3VtZW50ZWQgYW5kIGN1c3RvbWVyIGNvbmZpcm1lZC4nIH0gOiB7fSksXG4gICAgICAgICAgLi4uKHN0YXR1cyA9PT0gJ2VzY2FsYXRlZCcgPyB7IGVzY2FsYXRpb25fcmVhc29uOiAnRXNjYWxhdGVkIHRvIHRpZXItMiBlbmdpbmVlcmluZyBmb3IgU0xBLXJpc2sgcmV2aWV3LicgfSA6IHt9KSxcbiAgICAgICAgICBjcmVhdGVkX2F0OiBjZWxEYXlzQWdvKGFnZURheXMpLFxuICAgICAgICAgIC8vIFJlc29sdmVkIGNhc2VzIGFsc28gY2FycnkgY2xvc2VkX2RhdGU6IGNhc2UuaG9vayBzdGFtcHMgaXQgYXMgdGhlXG4gICAgICAgICAgLy8gcmVzb2x2ZWQtZGF0ZSBwcm94eSB3aGlsZSBrZWVwaW5nIGlzX2Nsb3NlZD1mYWxzZS5cbiAgICAgICAgICAuLi4oc2V0dGxlZCA/IHsgY2xvc2VkX2RhdGU6IGNlbERheXNBZ28oYWdlRGF5cyAtIHJlc29sdXRpb25EYXlzKSB9IDoge30pLFxuICAgICAgICAgIHNsYV9kdWVfZGF0ZTogY2VsQ2FzZVNsYUR1ZShhZ2VEYXlzLCBwcmlvcml0eSwgYWNjb3VudCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9KSgpLFxuICBdLFxufSk7XG5cbi8vIFx1MjUwMFx1MjUwMFx1MjUwMCBLbm93bGVkZ2UgQXJ0aWNsZXMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vL1xuLy8gTm8gYGhlbHBmdWxfY291bnRgIC8gYG5vdF9oZWxwZnVsX2NvdW50YCBoZXJlLCBkZWxpYmVyYXRlbHkgKCM2MDEpLiBUaG9zZSB0d29cbi8vIGFyZSBub3cgREVSSVZFRDogYGFydGljbGVfZmVlZGJhY2tfbWV0cmljc19yZWZyZXNoYCByZWNvdW50cyB0aGVtIGZyb21cbi8vIGBjcm1fYXJ0aWNsZV9mZWVkYmFja2Agb24gZXZlcnkgdm90ZS4gVGhpcyBmaWxlIHVzZWQgdG8gdHlwZSBpbiAzOCwgOTYsIDUsIDlcbi8vIFx1MjAxNCBudW1iZXJzIHdpdGggbm8gcm93cyBiZWhpbmQgdGhlbSBcdTIwMTQgYW5kIHRoZSBmaXJzdCByZWFsIHZvdGUgb24gYW4gYXJ0aWNsZVxuLy8gd291bGQgaGF2ZSByZWNvdW50ZWQgOTYgZG93biB0byAxLCBpbiBmcm9udCBvZiB3aG9ldmVyIHByZXNzZWQgdGhlIGJ1dHRvbi5cbi8vXG4vLyBUaGUgc2VlZCBkb2N0cmluZSBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZSBpcyB3aGF0IGRlY2lkZXMgaXQ6IGEgaG9vay1vd25lZFxuLy8gZmllbGQgbXVzdCBhcnJpdmUgaG9sZGluZyB3aGF0IHRoZSBob29rIFdPVUxEIGhhdmUgY29tcHV0ZWQuIFdpdGggbm8gc2VlZGVkXG4vLyBmZWVkYmFjayByb3dzIHRoZSBob25lc3QgdmFsdWUgaXMgdGhlIGZpZWxkJ3Mgb3duIGRlZmF1bHQsIDAuIFJvd3MgYXJlIG5vdFxuLy8gc2VlZGVkIGVpdGhlciwgYmVjYXVzZSBhIHNlZWQgY2Fubm90IG5hbWUgYSB1c2VyIChzZWUgdGhlIG5vdGUgb25cbi8vIGBjcm1fZXZlbnRfYXR0ZW5kZWVgIGJlbG93KSBhbmQgdGhlIHZvdGVyJ3MgaWRlbnRpdHkgaXMgZXhhY3RseSB3aGF0IHRoZVxuLy8gb25lLXZvdGUtcGVyLXJlYWRlciBpbmRleCBrZXlzIG9uIFx1MjAxNCBhIHRhYmxlIG9mIG93bmVybGVzcyB2ZXJkaWN0cyB3b3VsZCBiZVxuLy8gdGhlIHNhbWUgZmljdGlvbiBvbmUgbGV2ZWwgZG93bi5cbi8vXG4vLyBUaGUgZGVmbGVjdGlvbiBoYWxmIG9mICM2MDEgZG9lcyBub3QgaGF2ZSB0aGlzIHByb2JsZW0gYW5kIElTIHNlZWRlZDogYSBjYXNlXG4vLyBuYW1pbmcgdGhlIGFydGljbGUgdGhhdCByZXNvbHZlZCBpdCBuZWVkcyBubyB1c2VyLCBzbyB0aGUgY2xvc2VkXG4vLyBgQVBJIHJhdGUgbGltaXQgZXhjZWVkZWQgb24gcHJvZHVjdGlvbmAgY2FzZSBhYm92ZSBjYXJyaWVzIGEgcmVhbFxuLy8gYHJlc29sdmVkX2J5X2FydGljbGVgIGFuZCB0aGUgU2VydmljZSBkYXNoYm9hcmQncyBLQiB0aWxlcyBoYXZlIHNvbWV0aGluZ1xuLy8gdHJ1ZSB0byBzaG93IG9uIGEgZnJlc2ggYHBucG0gZGVtbzpyZXNldGAuXG5leHBvcnQgY29uc3Qga25vd2xlZGdlQXJ0aWNsZXMgPSBkZWZpbmVTZWVkKEtub3dsZWRnZUFydGljbGUsIHtcbiAgbW9kZTogJ3Vwc2VydCcsXG4gIGV4dGVybmFsSWQ6ICd0aXRsZScsXG4gIHJlY29yZHM6IFtcbiAgICB7XG4gICAgICB0aXRsZTogJ0dldHRpbmcgU3RhcnRlZCB3aXRoIEhvdENSTScsXG4gICAgICBzdW1tYXJ5OiAnQSBmaXZlLW1pbnV0ZSB0b3VyIG9mIGFjY291bnRzLCBjb250YWN0cywgbGVhZHMgYW5kIHRoZSBzYWxlcyBwaXBlbGluZS4nLFxuICAgICAgY2F0ZWdvcnk6ICdnZXR0aW5nX3N0YXJ0ZWQnLFxuICAgICAgc3RhdHVzOiAncHVibGlzaGVkJyxcbiAgICAgIGF1ZGllbmNlOiAncHVibGljJyxcbiAgICAgIGxhbmd1YWdlOiAnZW4nLFxuICAgICAgYm9keTogYCMgR2V0dGluZyBTdGFydGVkIHdpdGggSG90Q1JNXG5cbldlbGNvbWUhIFRoaXMgZ3VpZGUgd2Fsa3MgeW91IHRocm91Z2ggdGhlIGNvcmUgb2JqZWN0czpcblxuMS4gKipBY2NvdW50cyoqIFx1MjAxNCB0aGUgY29tcGFuaWVzIHlvdSBzZWxsIHRvIGFuZCBzZXJ2ZS5cbjIuICoqQ29udGFjdHMqKiBcdTIwMTQgdGhlIHBlb3BsZSBhdCB0aG9zZSBhY2NvdW50cy5cbjMuICoqTGVhZHMqKiBcdTIwMTQgdW5xdWFsaWZpZWQgcHJvc3BlY3RzIGluIHRoZSB0b3Agb2YgdGhlIGZ1bm5lbC5cbjQuICoqT3Bwb3J0dW5pdGllcyoqIFx1MjAxNCBxdWFsaWZpZWQgZGVhbHMgbW92aW5nIHRocm91Z2ggeW91ciBwaXBlbGluZS5cblxuT3BlbiB0aGUgKipTYWxlcyBQaXBlbGluZSoqIGthbmJhbiB0byBkcmFnIGRlYWxzIGJldHdlZW4gc3RhZ2VzLCBhbmQgdXNlIHRoZVxuKipFeGVjdXRpdmUgT3ZlcnZpZXcqKiBkYXNoYm9hcmQgdG8gdHJhY2sgcmV2ZW51ZSBhdCBhIGdsYW5jZS5gLFxuICAgICAgcHVibGlzaGVkX2F0OiBjZWxgZGF5c0Fnbyg0MClgLFxuICAgICAgbGFzdF9yZXZpZXdlZF9hdDogY2VsYGRheXNBZ28oMjApYCxcbiAgICB9LFxuICAgIHtcbiAgICAgIHRpdGxlOiAnUmVzZXR0aW5nIFlvdXIgUGFzc3dvcmQnLFxuICAgICAgc3VtbWFyeTogJ0hvdyBlbmQgdXNlcnMgcmVzZXQgYSBmb3Jnb3R0ZW4gcGFzc3dvcmQgZnJvbSB0aGUgbG9naW4gc2NyZWVuLicsXG4gICAgICBjYXRlZ29yeTogJ2hvd190bycsXG4gICAgICBzdGF0dXM6ICdwdWJsaXNoZWQnLFxuICAgICAgYXVkaWVuY2U6ICdwdWJsaWMnLFxuICAgICAgbGFuZ3VhZ2U6ICdlbicsXG4gICAgICBib2R5OiBgIyBSZXNldHRpbmcgWW91ciBQYXNzd29yZFxuXG4xLiBPbiB0aGUgbG9naW4gc2NyZWVuLCBjbGljayAqKkZvcmdvdCBwYXNzd29yZD8qKlxuMi4gRW50ZXIgdGhlIGVtYWlsIGFzc29jaWF0ZWQgd2l0aCB5b3VyIGFjY291bnQuXG4zLiBDaGVjayB5b3VyIGluYm94IGZvciBhIHJlc2V0IGxpbmsgKHZhbGlkIGZvciAzMCBtaW51dGVzKS5cbjQuIENob29zZSBhIG5ldyBwYXNzd29yZCBvZiBhdCBsZWFzdCAxMiBjaGFyYWN0ZXJzLlxuXG5JZiB0aGUgZW1haWwgZG9lcyBub3QgYXJyaXZlLCBjaGVjayBzcGFtIG9yIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yLmAsXG4gICAgICBwdWJsaXNoZWRfYXQ6IGNlbGBkYXlzQWdvKDI1KWAsXG4gICAgICBsYXN0X3Jldmlld2VkX2F0OiBjZWxgZGF5c0FnbygxMClgLFxuICAgIH0sXG4gICAge1xuICAgICAgdGl0bGU6ICdBUEkgUmF0ZSBMaW1pdHMnLFxuICAgICAgc3VtbWFyeTogJ1Blci10b2tlbiByZXF1ZXN0IHF1b3RhcyBhbmQgcmVjb21tZW5kZWQgYmFjay1vZmYgc3RyYXRlZ3kuJyxcbiAgICAgIGNhdGVnb3J5OiAnYXBpJyxcbiAgICAgIHN0YXR1czogJ2RyYWZ0JyxcbiAgICAgIGF1ZGllbmNlOiAnaW50ZXJuYWwnLFxuICAgICAgbGFuZ3VhZ2U6ICdlbicsXG4gICAgICBib2R5OiBgIyBBUEkgUmF0ZSBMaW1pdHMgKERSQUZUKVxuXG5EZWZhdWx0IHF1b3RhIGlzIDYwMCByZXF1ZXN0cy9taW51dGUgcGVyIHRva2VuLiBPbiBIVFRQIDQyOSwgYmFjayBvZmZcbmV4cG9uZW50aWFsbHkgc3RhcnRpbmcgYXQgMXMuIE51bWJlcnMgcGVuZGluZyBmaW5hbCByZXZpZXcgd2l0aCBwbGF0Zm9ybSB0ZWFtLmAsXG4gICAgfSxcbiAgICB7XG4gICAgICB0aXRsZTogJ0xlZ2FjeSBTU08gU2V0dXAnLFxuICAgICAgc3VtbWFyeTogJ1NBTUwgY29uZmlndXJhdGlvbiBmb3IgdGhlIHByZS0yMDI1IGlkZW50aXR5IHN0YWNrLicsXG4gICAgICBjYXRlZ29yeTogJ3Ryb3VibGVzaG9vdGluZycsXG4gICAgICBzdGF0dXM6ICdwdWJsaXNoZWQnLFxuICAgICAgYXVkaWVuY2U6ICdpbnRlcm5hbCcsXG4gICAgICBsYW5ndWFnZTogJ2VuJyxcbiAgICAgIGJvZHk6IGAjIExlZ2FjeSBTU08gU2V0dXBcblxuVGhpcyBjb3ZlcnMgdGhlIGRlcHJlY2F0ZWQgU0FNTCAxLjEgZmxvdy4gTmV3IHRlbmFudHMgc2hvdWxkIHVzZSB0aGUgT0lEQ1xuY29ubmVjdG9yIGluc3RlYWQuIFJldGFpbmVkIGZvciBjdXN0b21lcnMgc3RpbGwgb24gdGhlIGxlZ2FjeSBzdGFjay5gLFxuICAgICAgcHVibGlzaGVkX2F0OiBjZWxgZGF5c0FnbygyNDApYCxcbiAgICAgIGxhc3RfcmV2aWV3ZWRfYXQ6IGNlbGBkYXlzQWdvKDIyMClgLFxuICAgIH0sXG4gIF1cbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL19jYXNlLXNsYS50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3L3NyYy9zZXJ2aWNlL29iamVjdHNcIjtjb25zdCBfX2luamVjdGVkX2ltcG9ydF9tZXRhX3VybF9fID0gXCJmaWxlOi8vL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9zcmMvc2VydmljZS9vYmplY3RzL19jYXNlLXNsYS50c1wiOy8vIENvcHlyaWdodCAoYykgMjAyNSBPYmplY3RTdGFjay4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZS0yLjAgbGljZW5zZS5cblxuLyoqXG4gKiBUaGUgY2FzZSBTTEEgcG9saWN5IG1hdHJpeCBcdTIwMTQgcHJpb3JpdHkgXHUwMEQ3IGFjY291bnQgdGllciwgaW4gQ0FMRU5EQVIgSE9VUlMuXG4gKlxuICogIyBXaGF0IHRoaXMgcmVwbGFjZXNcbiAqXG4gKiBVbnRpbCAjNTk1IHRoZSBvbmx5IFNMQSBydWxlIGluIHRoZSBhcHAgd2FzIFwiY3JpdGljYWwgXHUyMUQyIG5vdyArIDRoXCIsIGhhcmRjb2RlZFxuICogaW4gYGNhc2Vfc2xhX2RlZmF1bHRzYC4gVGhyZWUgb2YgdGhlIGZvdXIgcHJpb3JpdGllcyB0aGVyZWZvcmUgZ290IE5PXG4gKiBgc2xhX2R1ZV9kYXRlYCBhdCBhbGwsIHdoaWNoIG1lYW50IGBjYXNlX3NsYV9tb25pdG9yYCBcdTIwMTQgdGhlIGhvdXJseSBzd2VlcCB0aGF0XG4gKiBmbGFncyBhbmQgZXNjYWxhdGVzIGJyZWFjaGVzIFx1MjAxNCBjb3VsZCBuZXZlciBmaXJlIGZvciB0aGVtOiBpdCBzZWxlY3RzIG9uXG4gKiBgc2xhX2R1ZV9kYXRlIDwgbm93YCwgYW5kIGEgYmxhbmsgZGF0ZSBpcyBuZXZlciBpbiB0aGUgcGFzdC4gQSBIaWdoIGNhc2VcbiAqIG5vYm9keSB0b3VjaGVkIGVudGVyZWQgbmVpdGhlciB0aGUgcHJpb3JpdHktZXNjYWxhdGlvbiBwYXRoIG5vciB0aGUgdGltZVxuICogcGF0aC4gVGhlIGZpZWxkLCB0aGUgc3dlZXAgYW5kIHRoZSBmb3VyIHB1Ymxpc2hlZCBwZXItcHJpb3JpdHkgdGFyZ2V0cyB3ZXJlXG4gKiBhbGwgc2hpcHBlZDsgb25seSB0aGUgY2xvY2sgYmVoaW5kIHRocmVlIG9mIHRoZW0gd2FzIG1pc3NpbmcuXG4gKlxuICogYGNybV9hY2NvdW50LnRpZXJgIHdhcyB0aGUgb3RoZXIgaGFsZiBvZiB0aGUgc2FtZSBnYXA6IGZvdXIgb3B0aW9ucyBkZWNsYXJlZFxuICogb24gdGhlIGFjY291bnQgb2JqZWN0IGFuZCByZWFkIGJ5IG5vdGhpbmcgb3V0c2lkZSBgc3JjL3ZpZXdzL2FjY291bnQudmlldy50c2AuXG4gKlxuICogIyBcdTI2QTBcdUZFMEYgQ0FMRU5EQVIgSE9VUlMsIE5PVCBCVVNJTkVTUyBIT1VSU1xuICpcbiAqIEV2ZXJ5IG51bWJlciBiZWxvdyBpcyBhZGRlZCB0byB0aGUgV0FMTCBDTE9DSy4gVGhpcyBhcHAgc2hpcHMgbm9cbiAqIGJ1c2luZXNzLWhvdXJzIGNhbGVuZGFyLCBubyB3b3JraW5nLWRheSBkZWZpbml0aW9uIGFuZCBubyBob2xpZGF5IGxpc3QgXHUyMDE0XG4gKiB0aGVyZSBpcyBub3RoaW5nIGluIGl0cyBtZXRhZGF0YSBhIGRlYWRsaW5lIGNvdWxkIGJlIGNvdW50ZWQgYWdhaW5zdCwgYW5kXG4gKiB0aGUgcGxhdGZvcm0gcHJvdmlkZXMgbm8gc3VjaCBzZXJ2aWNlIGVpdGhlci4gU28gYSBQMSByYWlzZWQgYXQgNXBtIG9uIGFcbiAqIEZyaWRheSBpcyBkdWUgYXQgOXBtIHRoYXQgc2FtZSBGcmlkYXksIGFuZCBhIExvdyBjYXNlIHJhaXNlZCBvbiB0aGUgMjNyZCBvZlxuICogRGVjZW1iZXIgcnVucyBpdHMgd2VlayBkb3duIG92ZXIgdGhlIGhvbGlkYXlzLlxuICpcbiAqIFRoaXMgaXMgc3RhdGVkIHJhdGhlciB0aGFuIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHRoZSBzaW5nbGUgbW9zdCBsaWtlbHkgd2F5XG4gKiBmb3IgdGhlc2UgbnVtYmVycyB0byBiZSBtaXNyZWFkLiBUZWFjaGluZyB0aGUgZGVhZGxpbmUgdG8gc2tpcCBub24td29ya2luZ1xuICogdGltZSBtZWFucyB0ZWFjaGluZyB0aGlzIG1vZHVsZSBhIGNhbGVuZGFyIFx1MjAxNCBpdCBpcyBub3QgYSBtYXR0ZXIgb2YgY2hhbmdpbmdcbiAqIGEgY2VsbC5cbiAqXG4gKiBUaGlzIGhlYWRlciBpcyB0aGUgT05FIHBsYWNlIHRoZSBhcHAgc2F5cyBpdCBpbiBwcm9zZSAoIzE5NzQpLiBFdmVyeXdoZXJlXG4gKiBlbHNlIHRoZSB1bml0IHJpZGVzIGluIGEgbmFtZSBcdTIwMTQgYENBU0VfU0xBX0NBTEVOREFSX0hPVVJTYCBhbmRcbiAqIGBjYXNlU2xhQ2FsZW5kYXJIb3Vyc2AgYmVsb3csIGBzbGFDYWxlbmRhckhvdXJzYCBpbiB0aGUgaG9vayBib2R5IFx1MjAxNCBhbmQgaW5cbiAqIGB0ZXN0L2Nhc2Utc2xhLW1hdHJpeC50ZXN0LnRzYCwgd2hpY2ggZHJpdmVzIHRoZSBob29rIG9uIGEgZml4ZWQgRnJpZGF5XG4gKiAxNzowMCBjbG9jayBhbmQgcGlucyB0aGUgZGVhZGxpbmVzIHRoYXQgbGFuZCBvbiB0aGUgd2Vla2VuZC4gVGhlIG9wZXJhdG9yXG4gKiByZWFkcyBpdCBpbiB0aGUgYHNsYV9kdWVfZGF0ZWAgZmllbGQgZGVzY3JpcHRpb24uXG4gKlxuICogIyBXaHkgdGhlIGBjcml0aWNhbGAgcm93IGlzIGZsYXRcbiAqXG4gKiBFdmVyeSBjZWxsIGluIHRoZSBgY3JpdGljYWxgIHJvdyBpcyA0IFx1MjAxNCBkZWxpYmVyYXRlbHksIGFuZCBpdCBpcyB0aGUgb25lXG4gKiBjb25zdHJhaW50IG9uIHRoaXMgdGFibGUgdGhhdCBpcyBub3QgYSBwcm9kdWN0IG9waW5pb24uIEJlZm9yZSAjNTk1IEVWRVJZXG4gKiBjcml0aWNhbCBjYXNlIGdvdCA0IGhvdXJzIHJlZ2FyZGxlc3Mgb2YgdGllci4gRGlmZmVyZW50aWF0aW5nIHRoZSByb3cgYnlcbiAqIHRpZXIgd291bGQgTE9PU0VOIHRoZSBkZWFkbGluZSBvbiB0aGUgY3JpdGljYWwgY2FzZXMgb2Ygbm9uLXN0cmF0ZWdpY1xuICogYWNjb3VudHMsIGkuZS4gdGhpcyBjaGFuZ2Ugd291bGQgdGFrZSBhIGNsb2NrIGF3YXkgZnJvbSB3b3JrIHRoYXQgYWxyZWFkeVxuICogaGFkIG9uZS4gRmxhdCBhdCA0IGtlZXBzIHRoZSBuZXcgYmVoYXZpb3VyIGEgc3RyaWN0IHN1cGVyc2V0IG9mIHRoZSBvbGQ6XG4gKiBldmVyeSBjYXNlIHRoYXQgaGFkIGEgZHVlIGRhdGUgc3RpbGwgZ2V0cyB0aGUgc2FtZSBvbmUsIGFuZCB0aHJlZSB3aG9sZVxuICogcHJpb3JpdGllcyBnYWluIG9uZS4gKFRoZSBydWxpbmcgb24gIzU5NSBhc2tzIGZvciA0aCBhcyB0aGUgKnN0cmF0ZWdpYypcbiAqIGNlbGw7IGhvbGRpbmcgdGhlIHJlc3Qgb2YgdGhlIHJvdyB0byBpdCB0b28gaXMgd2hhdCBtYWtlcyBcInN1cGVyc2V0XCIgdHJ1ZVxuICogcmF0aGVyIHRoYW4gYXBwcm94aW1hdGVseSB0cnVlLilcbiAqXG4gKiBUaGUgcmVtYWluaW5nIHJvd3MgbmV2ZXIgZXhjZWVkIHRoZSBwZXItcHJpb3JpdHkgdGFyZ2V0IHRoZSB1c2VyIGRvY3MgaGF2ZVxuICogYWx3YXlzIHB1Ymxpc2hlZCAoSGlnaCA4aCwgTWVkaXVtIDIgZGF5cyA9IDQ4aCwgTG93IDcgZGF5cyA9IDE2OGgpIFx1MjAxNCB0aGVcbiAqIGxvd2VzdCB0aWVyIGdldHMgZXhhY3RseSB0aGF0IGNvbW1pdG1lbnQgYW5kIHRoZSBoaWdoZXIgdGllcnMgZ2V0IHRpZ2h0ZXIuXG4gKiBObyBhY2NvdW50IGlzIHdvcnNlIG9mZiBhdCBhbnkgcHJpb3JpdHkgdGhhbiB0aGUgZG9jcyBhbHJlYWR5IHByb21pc2VkLlxuICpcbiAqICMgV2hlcmUgdGhpcyBjb25zdGFudCBpcywgYW5kIGlzIG5vdCwgdGhlIHNvdXJjZSBvZiB0cnV0aFxuICpcbiAqIFRoZSBob29rIGJvZHkgaW4gYGNhc2UuaG9vay50c2AgY2FycmllcyBhIEhBTkQtQ09QSUVEIG1pcnJvciBvZiB0aGlzIHRhYmxlXG4gKiBhbmQgY2Fubm90IGltcG9ydCBpdDogTDIgaG9vayBib2RpZXMgcnVuIGJvZHktb25seSBpbiB0aGUgUXVpY2tKUyBzYW5kYm94LFxuICogc28gYSBtb2R1bGUgY29uc3RhbnQgcmVzb2x2ZXMgYXQgYXV0aG9yaW5nIHRpbWUgYW5kIGFycml2ZXMgYXMgYHVuZGVmaW5lZGBcbiAqIGF0IHJ1bnRpbWUgKHNlZSBgX2xpbmUtaXRlbS1wcmljZS1maWxsLnRzYCwgYW5kIHRoZSBzYW1lIGZvcmNlZCBkdXBsaWNhdGlvblxuICogYmVoaW5kIGB0ZXN0L3ByaW9yaXR5LXJhbmstcGFyaXR5LnRlc3QudHNgKS4gYHNyYy9zZXJ2aWNlL2RhdGEvc2VydmljZS5zZWVkLnRzYFxuICogaW1wb3J0cyB0aGlzIG1vZHVsZSBmb3IgcmVhbCBcdTIwMTQgc2VlZHMgYXJlIGF1dGhvcmVkLXRpbWUgZGF0YSBhbmQgaG9va3MgZG8gbm90XG4gKiBydW4gb3ZlciB0aGVtLCBzbyB0aGUgc2VlZGVkIGR1ZSBkYXRlcyBoYXZlIHRvIGJlIHJpZ2h0IG9uIGFycml2YWwuXG4gKlxuICogYHRlc3QvY2FzZS1zbGEtbWF0cml4LnRlc3QudHNgIGlzIHdoYXQga2VlcHMgdGhlIHR3byBjb3BpZXMgaG9uZXN0OiBpdCBwaW5zXG4gKiBhbGwgc2l4dGVlbiBjZWxscyBieSBEUklWSU5HIHRoZSBzaGlwcGVkIGhvb2sgaGFuZGxlciwgc28gY2hhbmdpbmcgYSBjZWxsIGluXG4gKiBlaXRoZXIgcGxhY2Ugd2l0aG91dCB0aGUgb3RoZXIgZmFpbHMgdGhlIHN1aXRlLlxuICovXG5cbi8qKiBUaGUgZm91ciBgY3JtX2FjY291bnQudGllcmAgb3B0aW9ucywgdGlnaHRlc3Qgc2VydmljZSBsZXZlbCBmaXJzdC4gKi9cbmV4cG9ydCBjb25zdCBDQVNFX1NMQV9USUVSUyA9IFsnc3RyYXRlZ2ljJywgJ2VudGVycHJpc2UnLCAnbWlkX21hcmtldCcsICdzbWInXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIENhc2VTbGFUaWVyID0gKHR5cGVvZiBDQVNFX1NMQV9USUVSUylbbnVtYmVyXTtcblxuLyoqIFRoZSBmb3VyIGBjcm1fY2FzZS5wcmlvcml0eWAgb3B0aW9ucyB0aGF0IGNhcnJ5IGEgY2xvY2suICovXG5leHBvcnQgY29uc3QgQ0FTRV9TTEFfUFJJT1JJVElFUyA9IFsnY3JpdGljYWwnLCAnaGlnaCcsICdtZWRpdW0nLCAnbG93J10gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBDYXNlU2xhUHJpb3JpdHkgPSAodHlwZW9mIENBU0VfU0xBX1BSSU9SSVRJRVMpW251bWJlcl07XG5cbi8qKlxuICogVGllciB1c2VkIHdoZW4gdGhlIGNhc2UgbmFtZXMgbm8gYWNjb3VudCwgb3IgdGhlIGFjY291bnQncyB0aWVyIGlzIGJsYW5rLCBvclxuICogdGhlIHJlYWRlciBjYW5ub3Qgc2VlIHRoZSBhY2NvdW50IHJvdyAoZ3Vlc3QgaW50YWtlIHRocm91Z2ggdGhlIHdlYiBmb3JtIGlzXG4gKiB0aGUgb3JkaW5hcnkgY2FzZSBcdTIwMTQgaXQgY2FuIGNyZWF0ZSBhIGNhc2UgYW5kIHJlYWQgbm90aGluZyBlbHNlKS5cbiAqXG4gKiBgc21iYCBpcyB0aGUgbG9vc2VzdCBjb2x1bW4gQU5EIHRoZSBgZGVmYXVsdFZhbHVlYCB0aGUgYWNjb3VudCBvYmplY3QgYWxyZWFkeVxuICogZGVjbGFyZXMgZm9yIGB0aWVyYCwgc28gYW4gdW5yZWFkYWJsZSBhY2NvdW50IGlzIHRyZWF0ZWQgZXhhY3RseSBsaWtlIGFuXG4gKiBhY2NvdW50IG5vYm9keSBoYXMgY2xhc3NpZmllZC4gRXJyaW5nIGxvb3NlIGlzIHRoZSBzYWZlIGRpcmVjdGlvbjogYSBkZWFkbGluZVxuICogaW52ZW50ZWQgdGlnaHRlciB0aGFuIHRoZSBjdXN0b21lcidzIGNvbnRyYWN0IHdvdWxkIG1hbnVmYWN0dXJlIGJyZWFjaGVzIG91dFxuICogb2YgYSBwZXJtaXNzaW9uIGVycm9yLlxuICovXG5leHBvcnQgY29uc3QgQ0FTRV9TTEFfREVGQVVMVF9USUVSOiBDYXNlU2xhVGllciA9ICdzbWInO1xuXG4vKiogQ2FsZW5kYXIgaG91cnMgZnJvbSBjYXNlIGNyZWF0aW9uIHRvIGBzbGFfZHVlX2RhdGVgLCBieSBwcmlvcml0eSBhbmQgYWNjb3VudCB0aWVyLiAqL1xuZXhwb3J0IGNvbnN0IENBU0VfU0xBX0NBTEVOREFSX0hPVVJTOiBSZWNvcmQ8Q2FzZVNsYVByaW9yaXR5LCBSZWNvcmQ8Q2FzZVNsYVRpZXIsIG51bWJlcj4+ID0ge1xuICAvLyAgICAgICAgICAgc3RyYXRlZ2ljICBlbnRlcnByaXNlICBtaWRfbWFya2V0ICBzbWJcbiAgY3JpdGljYWw6IHsgc3RyYXRlZ2ljOiA0LCBlbnRlcnByaXNlOiA0LCBtaWRfbWFya2V0OiA0LCBzbWI6IDQgfSxcbiAgaGlnaDogeyBzdHJhdGVnaWM6IDYsIGVudGVycHJpc2U6IDgsIG1pZF9tYXJrZXQ6IDgsIHNtYjogOCB9LFxuICBtZWRpdW06IHsgc3RyYXRlZ2ljOiAyNCwgZW50ZXJwcmlzZTogMzYsIG1pZF9tYXJrZXQ6IDQ4LCBzbWI6IDQ4IH0sXG4gIGxvdzogeyBzdHJhdGVnaWM6IDk2LCBlbnRlcnByaXNlOiAxMjAsIG1pZF9tYXJrZXQ6IDE2OCwgc21iOiAxNjggfSxcbn07XG5cbi8qKiBMb29rIGEgY2VsbCB1cCB3aXRoIHRoZSBkb2N1bWVudGVkIGZhbGxiYWNrcy4gVW5rbm93biBwcmlvcml0eSBcdTIxRDIgbm8gY2xvY2suICovXG5leHBvcnQgZnVuY3Rpb24gY2FzZVNsYUNhbGVuZGFySG91cnMocHJpb3JpdHk6IHN0cmluZywgdGllcj86IHN0cmluZyB8IG51bGwpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCByb3cgPSBDQVNFX1NMQV9DQUxFTkRBUl9IT1VSU1twcmlvcml0eSBhcyBDYXNlU2xhUHJpb3JpdHldO1xuICBpZiAoIXJvdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHJvd1t0aWVyIGFzIENhc2VTbGFUaWVyXSA/PyByb3dbQ0FTRV9TTEFfREVGQVVMVF9USUVSXTtcbn1cblxuLyoqXG4gKiBUSEUgQlJFQUNIIFJVTEUgKCMyMDcwKTogYSBjYXNlIGJyZWFjaGVkIGl0cyBTTEEgd2hlbiBpdHMgYHNsYV9kdWVfZGF0ZWAgaXNcbiAqIFNUUklDVExZIGJlZm9yZSB0aGUgaW5zdGFudCBpdHMgY2xvY2sgc3RvcHBlZC4gQm90aCBhcmd1bWVudHMgYXJlIHJlYWQgb24gb25lXG4gKiBjbG9jayBcdTIwMTQgZXBvY2ggbWlsbGlzZWNvbmRzLCBvciBob3VycyBhZnRlciB0aGUgY2FzZSB3YXMgY3JlYXRlZCBcdTIwMTQgc28gYSBjYXNlXG4gKiB0aGF0IHN0b3BzIGV4YWN0bHkgb24gaXRzIGRlYWRsaW5lIG1ldCBpdC4gQSBjYXNlIHdpdGggbm8gZHVlIGRhdGUgaGFzIG5vXG4gKiBjbG9jaywgYW5kIGlzIG5ldmVyIGp1ZGdlZCBhdCBhbGw6IGNhbGxlcnMgZG8gbm90IHJlYWNoIHRoaXMgd2l0aG91dCBvbmUuXG4gKlxuICogVGhlIGNsb2NrIHN0b3BzIHdoZW4gdGhlIGNhc2Ugc3RvcHMgYmVpbmcgbGl2ZSB3b3JrIFx1MjAxNCB0aGUgZmlyc3Qgd3JpdGUgdGhhdFxuICogdGFrZXMgaXQgaW50byBgQ0xPU0VEX0NBU0VfU1RBVFVTRVNgIChgX2Nhc2UtYXNzaWdubWVudC50c2ApLiBUd28gd3JpdGVyc1xuICogcmVjb3JkIGEgYnJlYWNoLCBvbmUgcGVyIHNpZGUgb2YgdGhhdCBsaW5lLCBhbmQgYm90aCBhcHBseSBUSElTIHJ1bGU6XG4gKlxuICogICAtIHdoaWxlIHRoZSBjYXNlIGlzIGxpdmU6IGBjYXNlX3NsYV9tb25pdG9yYCBzZWxlY3RzXG4gKiAgICAgYHNsYV9kdWVfZGF0ZTogeyAkbHQ6IE5PVygpIH1gLCB0aGUgc2FtZSBzdHJpY3QgY29tcGFyaXNvbiwgd2l0aCBcIm5vd1wiIGFzXG4gKiAgICAgdGhlIGluc3RhbnQgXHUyMDE0IGJ1dCBvbmx5IG9uIGEgZGVwbG95bWVudCB0aGF0IHJ1bnMgc2NoZWR1bGVkIHdvcms7XG4gKiAgIC0gYXQgdGhlIHN0b3A6IGBjYXNlX3NsYV9kZWZhdWx0c2AgKGBjYXNlLmhvb2sudHNgKSBjb21wYXJlcyB0aGUgZHVlIGRhdGVcbiAqICAgICB3aXRoIHRoZSBpbnN0YW50IG9mIHRoZSByZXNvbHZpbmcgb3IgY2xvc2luZyB3cml0ZS4gSXQgbmVlZHMgbm8gc2NoZWR1bGUsXG4gKiAgICAgc28gdGhlIGNsb3NlZC1jYXNlIHN1cmZhY2VzIFx1MjAxNCB0aGUgYHNsYV9wZXJmb3JtYW5jZWAgcmVwb3J0IGFuZCB0aGVcbiAqICAgICBgc2xhX2NvbXBsaWFuY2VfcmF0ZWAgZ2F1Z2UgXHUyMDE0IGFyZSByaWdodCBvbiBldmVyeSBkZXBsb3ltZW50LlxuICpcbiAqIE5laXRoZXIgd3JpdGVyIGV2ZXIgY2xlYXJzIHRoZSBmbGFnOiBhIGJyZWFjaCwgb25jZSByZWNvcmRlZCwgc3RheXMuXG4gKlxuICogVGhlIGhvb2sgYm9keSBzcGVsbHMgdGhpcyBjb21wYXJpc29uIGlubGluZSwgZm9yIHRoZSByZWFzb24gdGhlIG1hdHJpeCBhYm92ZVxuICogaXMgbWlycm9yZWQgdGhlcmUgKG5vIG1vZHVsZSBzY29wZSBpbiB0aGUgc2FuZGJveCkuIFRoZSBzZWVkIGRlcml2ZXMgdGhlXG4gKiBmbGFnIG9mIGV2ZXJ5IHNldHRsZWQgZGVtbyBjYXNlIGZyb20gdGhpcyBmdW5jdGlvbiwgYW5kXG4gKiBgdGVzdC9jYXNlLXNsYS1icmVhY2gtb24tY2xvc2UudGVzdC50c2AgZHJpdmVzIHRoZSBMT1dFUkVEIGhvb2sgYm9keSBhZ2FpbnN0XG4gKiBpdCBvbiBib3RoIHNpZGVzIG9mIHRoZSBib3VuZGFyeSwgc28gdGhlIHR3byBjYW5ub3QgZHJpZnQuXG4gKi9cbmV4cG9ydCBjb25zdCBjYXNlU2xhQnJlYWNoZWQgPSAoZHVlQXQ6IG51bWJlciwgY2xvY2tTdG9wcGVkQXQ6IG51bWJlcik6IGJvb2xlYW4gPT4gZHVlQXQgPCBjbG9ja1N0b3BwZWRBdDtcbiIsICJjb25zdCBfX2luamVjdGVkX2ZpbGVuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9kYXRhL21hcmtldGluZy5zZWVkLnRzXCI7Y29uc3QgX19pbmplY3RlZF9kaXJuYW1lX18gPSBcIi9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9kYXRhXCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvc3JjL21hcmtldGluZy9kYXRhL21hcmtldGluZy5zZWVkLnRzXCI7Ly8gQ29weXJpZ2h0IChjKSAyMDI1IE9iamVjdFN0YWNrLiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlLTIuMCBsaWNlbnNlLlxuXG4vKipcbiAqIE1hcmtldGluZyBzZWVkcyBcdTIwMTQgY2FtcGFpZ25zIGFuZCB0aGVpciBtZW1iZXJzaGlwLlxuICpcbiAqIFJlYWRzIHRoZSBzYWxlcyBzZWVkcyAoYGxlYWRzYCwgYG9wcG9ydHVuaXRpZXNgKSBiZWNhdXNlIHRoZSBjYW1wYWlnbiBtZXRyaWNcbiAqIGJsb2NrIGlzIERFUklWRUQgZnJvbSB0aGVtIHJhdGhlciB0aGFuIHR5cGVkIGluIFx1MjAxNCBzZWUgYGNhbXBhaWduTWV0cmljc2AuXG4gKlxuICogU3BsaXQgb3V0IG9mIHRoZSBmb3JtZXIgbW9ub2xpdGhpYyBgc3JjL2RhdGEvaW5kZXgudHNgICgjNjM1KS4gU2VlZCBkb2N0cmluZVxuICogbGl2ZXMgaW4gYHNyYy9zYWxlcy9kYXRhL19zaGFyZWQudHNgLlxuICovXG5pbXBvcnQgeyBkZWZpbmVTZWVkIH0gZnJvbSAnQG9iamVjdHN0YWNrL3NwZWMvZGF0YSc7XG5pbXBvcnQgeyBjZWwgfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYyc7XG5pbXBvcnQgeyBDYW1wYWlnbiB9IGZyb20gJy4uL29iamVjdHMvY2FtcGFpZ24ub2JqZWN0JztcbmltcG9ydCB7IENhbXBhaWduTWVtYmVyIH0gZnJvbSAnLi4vb2JqZWN0cy9jYW1wYWlnbl9tZW1iZXIub2JqZWN0JztcbmltcG9ydCB7IGNlbERheXNBZ28gfSBmcm9tICcuLi8uLi9zYWxlcy9kYXRhL19zaGFyZWQnO1xuaW1wb3J0IHsgbGVhZHMsIG9wcG9ydHVuaXRpZXMgfSBmcm9tICcuLi8uLi9zYWxlcy9kYXRhL3NhbGVzLnNlZWQnO1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ2FtcGFpZ24gbWVtYmVyc2hpcCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8qKlxuICogQ2FtcGFpZ24gbWVtYmVycywga2V5ZWQgYnkgY2FtcGFpZ24gbmFtZS5cbiAqXG4gKiBNZW1iZXJzaGlwIGlzIHRoZSBPTkxZIHBhdGggZnJvbSBhIGNhbXBhaWduIHRvIGEgbGVhZCBcdTIwMTQgYGNybV9sZWFkYCBoYXMgbm9cbiAqIGNhbXBhaWduIGZpZWxkIFx1MjAxNCBzbyB3aXRoIHRoaXMgdGFibGUgZW1wdHkgKGFzIGl0IHdhcyBiZWZvcmUgIzU5MSkgZXZlcnlcbiAqIGNhbXBhaWduIHJlcG9ydGVkIGBudW1fc2VudGAgMCwgYHJlc3BvbnNlX3JhdGVgIDAlIGFuZCBubyBhdHRyaWJ1dGVkIGxlYWRzXG4gKiBhdCBhbGwsIHdoYXRldmVyIHRoZSBjYW1wYWlnbiByZWNvcmRzIGNsYWltZWQuXG4gKlxuICogU3RhdHVzIHZvY2FidWxhcnkgaXMgcmVzdHJpY3RlZCB0byB0aGUgbGlmZWN5Y2xlIHZhbHVlcyBhIHdyaXRlciBhY3R1YWxseVxuICogcHJvZHVjZXM6IGBzZW50YCAod2hhdCB0aGUgY2FtcGFpZ25fZW5yb2xsbWVudCBmbG93IGFuZCB0aGUgdHdvXG4gKiBBZGQtdG8tQ2FtcGFpZ24gYWN0aW9ucyBzdGFtcCksIGByZXNwb25kZWRgICh0aGUgYG1hcmtfcmVzcG9uZGVkYCBhY3Rpb24pXG4gKiBhbmQgYHVuc3Vic2NyaWJlZGAuIFRoZSBgb3BlbmVkYCAvIGBjbGlja2VkYCAvIGBib3VuY2VkYCBzdGF0ZXMgYW5kIHRoZVxuICogYGZpcnN0X29wZW5lZF9kYXRlYCAvIGBmaXJzdF9jbGlja2VkX2RhdGVgIHN0YW1wcyB3ZXJlIFJFTU9WRUQgZnJvbSB0aGVcbiAqIG9iamVjdCB1bmRlciAjNTk3IFx1MjAxNCBubyBlbWFpbC10cmFja2luZyBlbmdpbmUgZXhpc3RzIG9uIHRoZSBwbGF0Zm9ybSwgc29cbiAqIG5vdGhpbmcgY291bGQgZXZlciBoYXZlIHdyaXR0ZW4gdGhlbS5cbiAqXG4gKiBgY29udmVydGVkYCBpcyBhIGxpdmUgc3RhdHVzIHdpdGggYSByZWFsIHdyaXRlclxuICogKGBjYW1wYWlnbl9sZWFkX2NvbnZlcnNpb25fcmVmcmVzaGAgcHJvbW90ZXMgYSBtZW1iZXIgd2hlbiBpdHMgbGVhZCdzXG4gKiBgaXNfY29udmVydGVkYCBmbGlwcykgYnV0IGlzIGRlbGliZXJhdGVseSBub3QgU0VFREVEOiBubyBzZWVkZWQgbGVhZCBpc1xuICogY29udmVydGVkIFx1MjAxNCBjb252ZXJzaW9uIGlzIHRoZSBsZWFkX2NvbnZlcnNpb24gZmxvdydzIGpvYiBhdCBydW50aW1lIFx1MjAxNCBzbyBhXG4gKiBgY29udmVydGVkYCBtZW1iZXIgd291bGQgYmUgYSBtZW1iZXIgc3RhdGUgbm8gbGVhZCByZWNvcmQgYmFja3MgdXAuXG4gKi9cbnR5cGUgQ2FtcGFpZ25NZW1iZXJTcGVjID0ge1xuICAvKiogTGVhZCBlbWFpbCAodGhlIGxlYWQgZGF0YXNldCdzIGV4dGVybmFsSWQpIFx1MjAxNCBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgY29udGFjdGAuICovXG4gIHJlYWRvbmx5IGxlYWQ/OiBzdHJpbmc7XG4gIC8qKiBDb250YWN0IGVtYWlsICh0aGUgY29udGFjdCBkYXRhc2V0J3MgZXh0ZXJuYWxJZCkuICovXG4gIHJlYWRvbmx5IGNvbnRhY3Q/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0YXR1czogJ3NlbnQnIHwgJ3Jlc3BvbmRlZCcgfCAndW5zdWJzY3JpYmVkJztcbiAgcmVhZG9ubHkgYWRkZWREYXlzQWdvOiBudW1iZXI7XG4gIC8qKiBEYXlzIGFnbyB0aGUgbWVtYmVyIHJlc3BvbmRlZC4gUmVxdWlyZWQgYnkgYHJlc3BvbmRlZGAsIGFic2VudCBvdGhlcndpc2UuICovXG4gIHJlYWRvbmx5IHJlc3BvbmRlZERheXNBZ28/OiBudW1iZXI7XG59O1xuXG5jb25zdCBDQU1QQUlHTl9NRU1CRVJTOiBSZWNvcmQ8c3RyaW5nLCByZWFkb25seSBDYW1wYWlnbk1lbWJlclNwZWNbXT4gPSB7XG4gICdRMyBFbnRlcnByaXNlIEVtYWlsIE51cnR1cmUnOiBbXG4gICAgeyBsZWFkOiAnbm9haC5wYXRlbEB2ZXJ0ZXhhbmFseXRpY3MuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdyZXNwb25kZWQnLCBhZGRlZERheXNBZ286IDE0LCByZXNwb25kZWREYXlzQWdvOiA5IH0sXG4gICAgeyBsZWFkOiAnbWF5YS5zaW5naEBibHVlcGVha2xvZ2lzdGljcy5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDE0IH0sXG4gICAgeyBsZWFkOiAnb3dlbi5iZWNrZXJAbm9ydGh3aW5kZW5lcmd5LmV4YW1wbGUuY29tJywgc3RhdHVzOiAncmVzcG9uZGVkJywgYWRkZWREYXlzQWdvOiAxNCwgcmVzcG9uZGVkRGF5c0FnbzogMTEgfSxcbiAgICB7IGxlYWQ6ICdzYXJhLmxvcGV6QGhlbGlvc3NvbGFyLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogMTQgfSxcbiAgICB7IGxlYWQ6ICdsZW8udmFuY2VAY2xlYW5jYXJ0LmV4YW1wbGUuY29tJywgc3RhdHVzOiAndW5zdWJzY3JpYmVkJywgYWRkZWREYXlzQWdvOiAxNCB9LFxuICAgIHsgbGVhZDogJ2lyaXMub2thZm9yQHB1bHNlaGVhbHRoLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogMTMgfSxcbiAgICB7IGxlYWQ6ICdyYXZpLm1laHRhQGZvdW5kcnlyb2JvdGljcy5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDEzIH0sXG4gICAgeyBsZWFkOiAndGVzcy5icm93bkBsYXR0aWNlZWR1Y2F0aW9uLmV4YW1wbGUuY29tJywgc3RhdHVzOiAncmVzcG9uZGVkJywgYWRkZWREYXlzQWdvOiAxMywgcmVzcG9uZGVkRGF5c0FnbzogOCB9LFxuICAgIHsgY29udGFjdDogJ2pvaG4uc21pdGhAYWNtZS5leGFtcGxlLmNvbScsIHN0YXR1czogJ3Jlc3BvbmRlZCcsIGFkZGVkRGF5c0FnbzogMTQsIHJlc3BvbmRlZERheXNBZ286IDEwIH0sXG4gICAgeyBjb250YWN0OiAnZXRoYW4uYnJvb2tzQHZlcnRleC5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDE0IH0sXG4gICAgeyBjb250YWN0OiAncHJpeWEuc2hhaEBsYXR0aWNlLmV4YW1wbGUuY29tJywgc3RhdHVzOiAncmVzcG9uZGVkJywgYWRkZWREYXlzQWdvOiAxNCwgcmVzcG9uZGVkRGF5c0FnbzogNyB9LFxuICAgIHsgY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiAxMyB9LFxuICBdLFxuICAnT3BlcmF0aW9ucyBQbGF0Zm9ybSBMYXVuY2gnOiBbXG4gICAgeyBsZWFkOiAnam9uYXMuaG9sdEBwb2xhcmNhcmdvLmV4YW1wbGUuY29tJywgc3RhdHVzOiAncmVzcG9uZGVkJywgYWRkZWREYXlzQWdvOiAxMSwgcmVzcG9uZGVkRGF5c0FnbzogNiB9LFxuICAgIHsgbGVhZDogJ2FueWEudm9sa292QHJlZG9ha3JlYWx0eS5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDExIH0sXG4gICAgeyBsZWFkOiAndGhlby5wYXJrQHNreWxpbmVtZWRpYS5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDExIH0sXG4gICAgeyBsZWFkOiAnd3Jlbi5nYXJjaWFAbWFwbGViYWtlcnlncm91cC5leGFtcGxlLmNvbScsIHN0YXR1czogJ3Jlc3BvbmRlZCcsIGFkZGVkRGF5c0FnbzogMTAsIHJlc3BvbmRlZERheXNBZ286IDUgfSxcbiAgICB7IGxlYWQ6ICdodWdvLmR1Ym9pc0BuaW1idXNhZXJvc3BhY2UuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiAxMCB9LFxuICAgIHsgY29udGFjdDogJ3J3aWxzb25Ad2F5bmUuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdyZXNwb25kZWQnLCBhZGRlZERheXNBZ286IDExLCByZXNwb25kZWREYXlzQWdvOiA3IH0sXG4gICAgeyBjb250YWN0OiAnbWFyY3VzLnJlZWRAYXBleGxvZ2lzdGljcy5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDExIH0sXG4gICAgeyBjb250YWN0OiAnb2xpdmlhLmNoZW5Abm9ydGh3aW5kLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogMTAgfSxcbiAgICB7IGNvbnRhY3Q6ICdzYXJhaC5qQGdsb2JleC5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDEwIH0sXG4gIF0sXG4gICdEZXZlbG9wZXIgQ29udGVudCBNYXJrZXRpbmcgUHVzaCc6IFtcbiAgICB7IGxlYWQ6ICdsZW5hLmZpc2NoZXJAZ3Jhbml0ZWluc3VyYW5jZS5leGFtcGxlLmNvbScsIHN0YXR1czogJ3Jlc3BvbmRlZCcsIGFkZGVkRGF5c0FnbzogMzMsIHJlc3BvbmRlZERheXNBZ286IDI3IH0sXG4gICAgeyBsZWFkOiAna2FpLndhdGFuYWJlQGNvcmFscmVlZmhvdGVscy5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDMzIH0sXG4gICAgeyBsZWFkOiAnbWlyYS5jb3N0YUBhdGxhc2NvbnN0cnVjdGlvbi5leGFtcGxlLmNvbScsIHN0YXR1czogJ3Vuc3Vic2NyaWJlZCcsIGFkZGVkRGF5c0FnbzogMzMgfSxcbiAgICB7IGxlYWQ6ICdwaWEuYW5hbmRAY2l0cmluZWZpbmFuY2UuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdyZXNwb25kZWQnLCBhZGRlZERheXNBZ286IDMyLCByZXNwb25kZWREYXlzQWdvOiAyNCB9LFxuICAgIHsgbGVhZDogJ21hcmNvLnJpY2NpQGF1cm9yYXRyYXZlbC5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDMyIH0sXG4gICAgeyBsZWFkOiAnbGlzYS50QGNsb3VkZmlyc3QuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdyZXNwb25kZWQnLCBhZGRlZERheXNBZ286IDMwLCByZXNwb25kZWREYXlzQWdvOiAyMSB9LFxuICAgIHsgY29udGFjdDogJ2V0aGFuLmJyb29rc0B2ZXJ0ZXguZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdyZXNwb25kZWQnLCBhZGRlZERheXNBZ286IDMzLCByZXNwb25kZWREYXlzQWdvOiAxOSB9LFxuICAgIHsgY29udGFjdDogJ21jaGVuQGluaXRlY2guZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiAzMyB9LFxuICAgIHsgY29udGFjdDogJ2pvaG4uc21pdGhAYWNtZS5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDMyIH0sXG4gICAgeyBjb250YWN0OiAnZW1pbHkuZEBzdGFya21lZC5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDMyIH0sXG4gICAgeyBjb250YWN0OiAnc2FyYWguakBnbG9iZXguZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiAzMCB9LFxuICBdLFxuICAvLyBDYW1wYWlnbnMgc3RpbGwgaW4gYHBsYW5uaW5nYCBjYXJyeSB0aGVpciBpbnZpdGF0aW9uIC8gcmVnaXN0cmF0aW9uIGxpc3Q6XG4gIC8vIHRoZSBlbnJvbGxtZW50IGZsb3cgcnVucyBmb3IgYHBsYW5uaW5nYCBhbmQgYGluX3Byb2dyZXNzYCBjYW1wYWlnbnMgYWxpa2VcbiAgLy8gYW5kIHN0YW1wcyBgc2VudGAgb24gZW5yb2xsbWVudCwgc28gYSBwcmUtbGF1bmNoIHRhcmdldCBsaXN0IGxvb2tzIGV4YWN0bHlcbiAgLy8gbGlrZSB0aGlzLlxuICAnQ2xvdWQgTWlncmF0aW9uIFdlYmluYXInOiBbXG4gICAgeyBsZWFkOiAnZGtpbUBlZHV0ZWNobGFicy5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDQgfSxcbiAgICB7IGxlYWQ6ICdhbGljZUBuZXh0Z2VucmV0YWlsLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogNCB9LFxuICAgIHsgbGVhZDogJ2pvbmFzLmhvbHRAcG9sYXJjYXJnby5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDMgfSxcbiAgICB7IGxlYWQ6ICdhbnlhLnZvbGtvdkByZWRvYWtyZWFsdHkuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiAzIH0sXG4gICAgeyBjb250YWN0OiAnbWNoZW5AaW5pdGVjaC5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDQgfSxcbiAgICB7IGNvbnRhY3Q6ICdtYXJjdXMucmVlZEBhcGV4bG9naXN0aWNzLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogMyB9LFxuICBdLFxuICAnRXhlY3V0aXZlIEFJIEdvdmVybmFuY2UgUm91bmR0YWJsZSc6IFtcbiAgICB7IGNvbnRhY3Q6ICdqb2huLnNtaXRoQGFjbWUuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiA2IH0sXG4gICAgeyBjb250YWN0OiAncndpbHNvbkB3YXluZS5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDYgfSxcbiAgICB7IGNvbnRhY3Q6ICdldGhhbi5icm9va3NAdmVydGV4LmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogNSB9LFxuICAgIHsgY29udGFjdDogJ3ByaXlhLnNoYWhAbGF0dGljZS5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDUgfSxcbiAgICB7IGNvbnRhY3Q6ICdlbWlseS5kQHN0YXJrbWVkLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogNSB9LFxuICBdLFxuICAnUGFydG5lciBPcGVyYXRpb25zIFJvYWRzaG93JzogW1xuICAgIHsgbGVhZDogJ21heWEuc2luZ2hAYmx1ZXBlYWtsb2dpc3RpY3MuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiA3IH0sXG4gICAgeyBsZWFkOiAncmF2aS5tZWh0YUBmb3VuZHJ5cm9ib3RpY3MuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiA3IH0sXG4gICAgeyBjb250YWN0OiAnbWFyY3VzLnJlZWRAYXBleGxvZ2lzdGljcy5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDYgfSxcbiAgICB7IGNvbnRhY3Q6ICdvbGl2aWEuY2hlbkBub3J0aHdpbmQuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiA2IH0sXG4gIF0sXG4gICdTYWFTQ29uIDIwMjYgVHJhZGUgU2hvdyc6IFtcbiAgICB7IGxlYWQ6ICd0aGVvLnBhcmtAc2t5bGluZW1lZGlhLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogOCB9LFxuICAgIHsgbGVhZDogJ3dyZW4uZ2FyY2lhQG1hcGxlYmFrZXJ5Z3JvdXAuZXhhbXBsZS5jb20nLCBzdGF0dXM6ICdzZW50JywgYWRkZWREYXlzQWdvOiA4IH0sXG4gICAgeyBsZWFkOiAnaHVnby5kdWJvaXNAbmltYnVzYWVyb3NwYWNlLmV4YW1wbGUuY29tJywgc3RhdHVzOiAnc2VudCcsIGFkZGVkRGF5c0FnbzogNyB9LFxuICAgIHsgbGVhZDogJ21hcmNvLnJpY2NpQGF1cm9yYXRyYXZlbC5leGFtcGxlLmNvbScsIHN0YXR1czogJ3NlbnQnLCBhZGRlZERheXNBZ286IDcgfSxcbiAgXSxcbn07XG5cbi8qKlxuICogVGhlIG1ldHJpYyBibG9jayB0aGUgY2FtcGFpZ24gbWV0cmljIGhvb2tzIG1haW50YWluLCBjb21wdXRlZCBoZXJlIGZyb20gdGhlXG4gKiB2ZXJ5IHNhbWUgaW5wdXRzIHRoZXkgcmVhZDogdGhlIG1lbWJlcnNoaXAgdGFibGUgYWJvdmUgYW5kIHRoZSBvcHBvcnR1bml0aWVzXG4gKiBhdHRyaWJ1dGVkIHZpYSBgY3JtX2NhbXBhaWduYC5cbiAqXG4gKiBTZWVkaW5nIHRoZXNlIGJ5IGhhbmQgaXMgd2hhdCBtYWRlIHRoZW0gd3JvbmcgYmVmb3JlIFx1MjAxNCBhIGhhbmQtdHlwZWRcbiAqIGBhY3R1YWxfcmV2ZW51ZWAgc3Vydml2ZWQgdW50b3VjaGVkIHVudGlsIHNvbWV0aGluZyByZWNvbXB1dGVkLCBhdCB3aGljaFxuICogcG9pbnQgdGhlIGhvb2sgcmVwbGFjZWQgaXQgd2l0aCB0aGUgdHJ1dGggYW5kIHRoZSBudW1iZXIgXCJteXN0ZXJpb3VzbHlcIlxuICogY2hhbmdlZC4gRGVyaXZpbmcgaXQgaGVyZSBtYWtlcyB0aGUgZmlyc3QgcmVjb21wdXRlIGEgbm8tb3AgaW5zdGVhZDogc2FtZVxuICogaW5wdXRzLCBzYW1lIGFyaXRobWV0aWMsIHNhbWUgYW5zd2VyLlxuICpcbiAqIFRoYXQgZmlyc3QgcmVjb21wdXRlIG5vdyBhcnJpdmVzIG11Y2ggc29vbmVyIHRoYW4gaXQgdXNlZCB0by4gQmVmb3JlICM1OTcgdGhlXG4gKiBvbmx5IHdyaXRlciBmaXJlZCBvbiB0aGUgYFx1MjE5MiBjb21wbGV0ZWRgIHRyYW5zaXRpb24sIHNvIHRoZXNlIHNlZWRlZCB2YWx1ZXNcbiAqIHdlcmUgdGhlIE9OTFkgbnVtYmVycyBhIGxpdmUgY2FtcGFpZ24gZXZlciBzaG93ZWQ7IHRvZGF5IGFueSBtZW1iZXJzaGlwLFxuICogYXR0cmlidXRpb24gb3IgY29udmVyc2lvbiBjaGFuZ2UgcmVmcmVzaGVzIHRoZW0gKHNlZSB0aGUgZm91ciByZWZyZXNoIGhvb2tzOlxuICogYGNhbXBhaWduX21ldHJpY3NfcmVmcmVzaGAgYW5kIGBjYW1wYWlnbl9tZW1iZXJfbWV0cmljc19yZWZyZXNoYCBpblxuICogYHNyYy9tYXJrZXRpbmcvb2JqZWN0cy9gLCBgY2FtcGFpZ25fbGVhZF9jb252ZXJzaW9uX3JlZnJlc2hgIGFuZFxuICogYGNhbXBhaWduX2F0dHJpYnV0aW9uX3JlZnJlc2hgIGluIGBzcmMvc2FsZXMvb2JqZWN0cy9gKS4gVGhlIGRlcml2YXRpb24gYmVsb3dcbiAqIGlzIHRoZXJlZm9yZSBhIG1pcnJvciBvZiB0aGVpciBvbmUgaW5saW5lZCByZWNvbXB1dGUgYW5kIGhhcyB0byBzdGF5IG9uZSBcdTIwMTRcbiAqIGB0ZXN0L3NlZWQtY29uc2lzdGVuY3kudGVzdC50c2AgY2hlY2tzIHRoZSBzZWVkcyBhZ2FpbnN0IGl0LlxuICovXG5jb25zdCBjYW1wYWlnbk1ldHJpY3MgPSAoY2FtcGFpZ25OYW1lOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgbWVtYmVycyA9IENBTVBBSUdOX01FTUJFUlNbY2FtcGFpZ25OYW1lXSA/PyBbXTtcbiAgY29uc3QgbGVhZEtleXMgPSBuZXcgU2V0KG1lbWJlcnMubWFwKChtKSA9PiBtLmxlYWQpLmZpbHRlcigoZSk6IGUgaXMgc3RyaW5nID0+IEJvb2xlYW4oZSkpKTtcbiAgY29uc3QgY29udmVydGVkTGVhZHMgPSBsZWFkcy5yZWNvcmRzLmZpbHRlcihcbiAgICAobCkgPT4gdHlwZW9mIGwuZW1haWwgPT09ICdzdHJpbmcnICYmIGxlYWRLZXlzLmhhcyhsLmVtYWlsKSAmJiBsLmlzX2NvbnZlcnRlZCA9PT0gdHJ1ZSxcbiAgKS5sZW5ndGg7XG4gIGNvbnN0IGF0dHJpYnV0ZWQgPSBvcHBvcnR1bml0aWVzLnJlY29yZHMuZmlsdGVyKChvKSA9PiBvLmNybV9jYW1wYWlnbiA9PT0gY2FtcGFpZ25OYW1lKTtcbiAgY29uc3Qgd29uID0gYXR0cmlidXRlZC5maWx0ZXIoKG8pID0+IG8uc3RhZ2UgPT09ICdjbG9zZWRfd29uJyk7XG4gIHJldHVybiB7XG4gICAgLy8gXCJUb3RhbCBtZW1iZXJzIGVucm9sbGVkXCIgXHUyMDE0IGNhbXBhaWduLmhvb2sudHMncyBzaW5nbGUgZGVmaW5pdGlvbiBvZiBudW1fc2VudC5cbiAgICBudW1fc2VudDogbWVtYmVycy5sZW5ndGgsXG4gICAgLy8gYHJlc3BvbmRlZGAgb3IgYGNvbnZlcnRlZGAsIGFzIGluIGBjb21wdXRlQ2FtcGFpZ25NZXRyaWNzYC4gVGhlIHNlZWQgc2V0XG4gICAgLy8gaG9sZHMgbm8gYGNvbnZlcnRlZGAgbWVtYmVyIChzZWUgdGhlIG5vdGUgb24gQ0FNUEFJR05fTUVNQkVSUyksIHNvIHRoZVxuICAgIC8vIHR3byBwcmVkaWNhdGVzIGNvaW5jaWRlIG9uIHRoaXMgZGF0YSBcdTIwMTQgc3BlbGxlZCB0aGUgbmFycm93IHdheSBiZWNhdXNlXG4gICAgLy8gd2lkZW5pbmcgaXQgaGVyZSB3b3VsZCBzdWdnZXN0IGEgc2VlZGVkIHN0YXRlIHRoYXQgZG9lcyBub3QgZXhpc3QuXG4gICAgbnVtX3Jlc3BvbnNlczogbWVtYmVycy5maWx0ZXIoKG0pID0+IG0uc3RhdHVzID09PSAncmVzcG9uZGVkJykubGVuZ3RoLFxuICAgIG51bV9sZWFkczogbGVhZEtleXMuc2l6ZSxcbiAgICBudW1fY29udmVydGVkX2xlYWRzOiBjb252ZXJ0ZWRMZWFkcyxcbiAgICBudW1fb3Bwb3J0dW5pdGllczogYXR0cmlidXRlZC5sZW5ndGgsXG4gICAgbnVtX3dvbl9vcHBvcnR1bml0aWVzOiB3b24ubGVuZ3RoLFxuICAgIGFjdHVhbF9yZXZlbnVlOiB3b24ucmVkdWNlKChzdW0sIG8pID0+IHN1bSArICh0eXBlb2Ygby5hbW91bnQgPT09ICdudW1iZXInID8gby5hbW91bnQgOiAwKSwgMCksXG4gIH07XG59O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgQ2FtcGFpZ25zIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuZXhwb3J0IGNvbnN0IGNhbXBhaWducyA9IGRlZmluZVNlZWQoQ2FtcGFpZ24sIHtcbiAgbW9kZTogJ3Vwc2VydCcsXG4gIGV4dGVybmFsSWQ6ICduYW1lJyxcbiAgcmVjb3JkczogW1xuICAgIHtcbiAgICAgIG5hbWU6ICdRMyBFbnRlcnByaXNlIEVtYWlsIE51cnR1cmUnLFxuICAgICAgZGVzY3JpcHRpb246ICdNdWx0aS10b3VjaCBudXJ0dXJlIGZvciBlbnRlcnByaXNlIElUIGRlY2lzaW9uIG1ha2VycyBldmFsdWF0aW5nIEFJIGdvdmVybmFuY2UgYW5kIGFuYWx5dGljcy4nLFxuICAgICAgdHlwZTogJ2VtYWlsJyxcbiAgICAgIGNoYW5uZWw6ICdlbWFpbCcsXG4gICAgICBzdGF0dXM6ICdpbl9wcm9ncmVzcycsXG4gICAgICBzdGFydF9kYXRlOiBjZWxgZGF5c0FnbygxNSlgLFxuICAgICAgZW5kX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygyMSlgLFxuICAgICAgYnVkZ2V0ZWRfY29zdDogMjgwMDAsXG4gICAgICBhY3R1YWxfY29zdDogMTQwMDAsXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiA1NjAwMDAsXG4gICAgICB0YXJnZXRfc2l6ZTogNTAwMCxcbiAgICAgIC4uLmNhbXBhaWduTWV0cmljcygnUTMgRW50ZXJwcmlzZSBFbWFpbCBOdXJ0dXJlJyksXG4gICAgICBsYW5kaW5nX3BhZ2VfdXJsOiAnaHR0cHM6Ly9hY21lLmV4YW1wbGUuY29tL2xwL2VudGVycHJpc2UtcTMnLFxuICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0V4ZWN1dGl2ZSBBSSBHb3Zlcm5hbmNlIFJvdW5kdGFibGUnLFxuICAgICAgZGVzY3JpcHRpb246ICdBIGxpdmUgZXhlY3V0aXZlIHJvdW5kdGFibGUgb24gb3BlcmF0aW5nIEFJIGFnZW50cyB3aXRoIGdvdmVybmFuY2UsIGF1ZGl0YWJpbGl0eSBhbmQgdHJ1c3QuJyxcbiAgICAgIHR5cGU6ICdjb25mZXJlbmNlJyxcbiAgICAgIGNoYW5uZWw6ICdldmVudHMnLFxuICAgICAgc3RhdHVzOiAncGxhbm5pbmcnLFxuICAgICAgc3RhcnRfZGF0ZTogY2VsYGRheXNGcm9tTm93KDIpYCxcbiAgICAgIGVuZF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMylgLFxuICAgICAgYnVkZ2V0ZWRfY29zdDogMjIwMDAsXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiAzMjAwMDAsXG4gICAgICB0YXJnZXRfc2l6ZTogMTIwLFxuICAgICAgLi4uY2FtcGFpZ25NZXRyaWNzKCdFeGVjdXRpdmUgQUkgR292ZXJuYW5jZSBSb3VuZHRhYmxlJyksXG4gICAgICBpc19hY3RpdmU6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnQ2xvdWQgTWlncmF0aW9uIFdlYmluYXInLFxuICAgICAgZGVzY3JpcHRpb246ICdBIHRlY2huaWNhbCB3ZWJpbmFyIG9uIG1vZGVybml6aW5nIGN1c3RvbWVyIG9wZXJhdGlvbnMgYW5kIGRhdGEgd29ya2Zsb3dzIGluIHRoZSBjbG91ZC4nLFxuICAgICAgdHlwZTogJ3dlYmluYXInLFxuICAgICAgY2hhbm5lbDogJ2RpZ2l0YWwnLFxuICAgICAgc3RhdHVzOiAncGxhbm5pbmcnLFxuICAgICAgc3RhcnRfZGF0ZTogY2VsYGRheXNGcm9tTm93KDYpYCxcbiAgICAgIGVuZF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coOClgLFxuICAgICAgYnVkZ2V0ZWRfY29zdDogMTgwMDAsXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiAzNjAwMDAsXG4gICAgICB0YXJnZXRfc2l6ZTogMTUwMCxcbiAgICAgIC4uLmNhbXBhaWduTWV0cmljcygnQ2xvdWQgTWlncmF0aW9uIFdlYmluYXInKSxcbiAgICAgIGxhbmRpbmdfcGFnZV91cmw6ICdodHRwczovL2FjbWUuZXhhbXBsZS5jb20vd2ViaW5hcnMvY2xvdWQtbWlncmF0aW9uJyxcbiAgICAgIGlzX2FjdGl2ZTogdHJ1ZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIG5hbWU6ICdPcGVyYXRpb25zIFBsYXRmb3JtIExhdW5jaCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ0xhdW5jaCBjYW1wYWlnbiBmb3IgdGhlIG9wZXJhdGlvbnMgcGxhdGZvcm0sIHBhaXJpbmcgcHJvZHVjdCBjb250ZW50IHdpdGggY3VzdG9tZXIgcHJvb2YgcG9pbnRzLicsXG4gICAgICB0eXBlOiAnY29udGVudCcsXG4gICAgICBjaGFubmVsOiAnZGlnaXRhbCcsXG4gICAgICBzdGF0dXM6ICdpbl9wcm9ncmVzcycsXG4gICAgICAvLyBXYXMgYGRheXNGcm9tTm93KDEyKWAgXHUyMDE0IGFuIGBpbl9wcm9ncmVzc2AgY2FtcGFpZ24gdGhhdCBoYWQgbm90IHN0YXJ0ZWRcbiAgICAgIC8vIHlldCwgd2hpY2ggbm8gYXR0cmlidXRpb24gY2FuIGJlIGNvbnNpc3RlbnQgd2l0aCAoIzU5MSkuXG4gICAgICBzdGFydF9kYXRlOiBjZWxgZGF5c0FnbygxMilgLFxuICAgICAgZW5kX2RhdGU6IGNlbGBkYXlzRnJvbU5vdygxNClgLFxuICAgICAgYnVkZ2V0ZWRfY29zdDogMzYwMDAsXG4gICAgICBhY3R1YWxfY29zdDogMTIwMDAsXG4gICAgICBleHBlY3RlZF9yZXZlbnVlOiA0ODAwMDAsXG4gICAgICB0YXJnZXRfc2l6ZTogODAwMCxcbiAgICAgIC4uLmNhbXBhaWduTWV0cmljcygnT3BlcmF0aW9ucyBQbGF0Zm9ybSBMYXVuY2gnKSxcbiAgICAgIGxhbmRpbmdfcGFnZV91cmw6ICdodHRwczovL2FjbWUuZXhhbXBsZS5jb20vbGF1bmNoL29wZXJhdGlvbnMtcGxhdGZvcm0nLFxuICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ1BhcnRuZXIgT3BlcmF0aW9ucyBSb2Fkc2hvdycsXG4gICAgICBkZXNjcmlwdGlvbjogJ0pvaW50IHJlZ2lvbmFsIHNlc3Npb25zIHdpdGggc3RyYXRlZ2ljIHBhcnRuZXJzIGZvciBvcGVyYXRpb25zIGFuZCBJVCBsZWFkZXJzLicsXG4gICAgICB0eXBlOiAncGFydG5lcicsXG4gICAgICBjaGFubmVsOiAncGFydG5lcicsXG4gICAgICBzdGF0dXM6ICdwbGFubmluZycsXG4gICAgICBzdGFydF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMTkpYCxcbiAgICAgIGVuZF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMjIpYCxcbiAgICAgIGJ1ZGdldGVkX2Nvc3Q6IDQ4MDAwLFxuICAgICAgZXhwZWN0ZWRfcmV2ZW51ZTogNzIwMDAwLFxuICAgICAgdGFyZ2V0X3NpemU6IDYwMCxcbiAgICAgIC4uLmNhbXBhaWduTWV0cmljcygnUGFydG5lciBPcGVyYXRpb25zIFJvYWRzaG93JyksXG4gICAgICBpc19hY3RpdmU6IHRydWUsXG4gICAgfSxcbiAgICB7XG4gICAgICBuYW1lOiAnU2FhU0NvbiAyMDI2IFRyYWRlIFNob3cnLFxuICAgICAgZGVzY3JpcHRpb246ICdBIGZvY3VzZWQgYm9vdGgsIGV4ZWN1dGl2ZSBkaW5uZXIgYW5kIGN1c3RvbWVyLXN0b3J5IHByb2dyYW0gYXQgdGhlIFNhYVNDb24gaW5kdXN0cnkgY29uZmVyZW5jZS4nLFxuICAgICAgdHlwZTogJ3RyYWRlX3Nob3cnLFxuICAgICAgY2hhbm5lbDogJ2V2ZW50cycsXG4gICAgICBzdGF0dXM6ICdwbGFubmluZycsXG4gICAgICBzdGFydF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMjcpYCxcbiAgICAgIGVuZF9kYXRlOiBjZWxgZGF5c0Zyb21Ob3coMzApYCxcbiAgICAgIGJ1ZGdldGVkX2Nvc3Q6IDc1MDAwLFxuICAgICAgZXhwZWN0ZWRfcmV2ZW51ZTogMTIwMDAwMCxcbiAgICAgIHRhcmdldF9zaXplOiAzMDAwLFxuICAgICAgLi4uY2FtcGFpZ25NZXRyaWNzKCdTYWFTQ29uIDIwMjYgVHJhZGUgU2hvdycpLFxuICAgICAgaXNfYWN0aXZlOiB0cnVlLFxuICAgIH0sXG4gICAge1xuICAgICAgbmFtZTogJ0RldmVsb3BlciBDb250ZW50IE1hcmtldGluZyBQdXNoJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGVjaG5pY2FsIGJsb2cgcG9zdHMsIHZpZGVvIHR1dG9yaWFscyBhbmQgZGV2ZWxvcGVyIGNvbW11bml0eSBlbmdhZ2VtZW50IGNvbXBsZXRlZCBsYXN0IG1vbnRoLicsXG4gICAgICB0eXBlOiAnY29udGVudCcsXG4gICAgICBjaGFubmVsOiAnZGlnaXRhbCcsXG4gICAgICBzdGF0dXM6ICdjb21wbGV0ZWQnLFxuICAgICAgc3RhcnRfZGF0ZTogY2VsYGRheXNBZ28oMzUpYCxcbiAgICAgIGVuZF9kYXRlOiBjZWxgZGF5c0Fnbyg0KWAsXG4gICAgICBidWRnZXRlZF9jb3N0OiA0MDAwMCxcbiAgICAgIGFjdHVhbF9jb3N0OiAyNTAwMCxcbiAgICAgIGV4cGVjdGVkX3JldmVudWU6IDI1MDAwMCxcbiAgICAgIHRhcmdldF9zaXplOiAxMDAwMCxcbiAgICAgIC4uLmNhbXBhaWduTWV0cmljcygnRGV2ZWxvcGVyIENvbnRlbnQgTWFya2V0aW5nIFB1c2gnKSxcbiAgICAgIGxhbmRpbmdfcGFnZV91cmw6ICdodHRwczovL2FjbWUuZXhhbXBsZS5jb20vZGV2ZWxvcGVycycsXG4gICAgICBpc19hY3RpdmU6IHRydWUsXG4gICAgfSxcbiAgXVxufSk7XG5cbi8qKlxuICogQ2FtcGFpZ24gbWVtYmVycyBhcmUgc2VlZGVkIGFzIFRXTyBkYXRhc2V0cyBvdmVyIG9uZSBvYmplY3QsIHNwbGl0IGJ5IHdoaWNoXG4gKiBzaWRlIG9mIHRoZSBqdW5jdGlvbiBpcyBwb3B1bGF0ZWQuXG4gKlxuICogTm90IGEgc3R5bGlzdGljIGNob2ljZTogdGhlIG9iamVjdCBoYXMgbm8gc2luZ2xlIG5hdHVyYWwga2V5IChpdHMgb25seSB0ZXh0XG4gKiBpZGVudGl0eSBpcyBhIHJ1bnRpbWUtb3duZWQgYXV0b251bWJlciksIHNvIGlkZW50aXR5IGhhcyB0byBiZSB0aGUgY29tcG9zaXRlXG4gKiBvZiBjYW1wYWlnbiArIG1lbWJlci4gVGhlIGxvYWRlciBidWlsZHMgYSBjb21wb3NpdGUga2V5IGJ5IGpvaW5pbmcgdGhlXG4gKiBwZXItZmllbGQgdmFsdWVzIGFuZCByZXR1cm5zIGFuIEVNUFRZIGtleSBcdTIwMTQgbm8gZGVkdXBlLCBzbyBhIHJlcGxheSBib290XG4gKiByZS1pbnNlcnRzIGV2ZXJ5IHJvdyBcdTIwMTQgYXMgc29vbiBhcyBBTlkgY29tcG9uZW50IGlzIG51bGwuIGBjcm1fbGVhZGAgYW5kXG4gKiBgY3JtX2NvbnRhY3RgIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYnkgZGVzaWduLCBzbyBhIHNpbmdsZVxuICogYFsnY3JtX2NhbXBhaWduJywgJ2NybV9sZWFkJywgJ2NybV9jb250YWN0J11gIGtleSB3b3VsZCBiZSBibGFuayBvbiBldmVyeVxuICogcm93LiBTcGxpdHRpbmcgdGhlIHJvd3MgYnkgbWVtYmVyIHR5cGUgZ2l2ZXMgZWFjaCBkYXRhc2V0IGEga2V5IHdob3NlIHBhcnRzXG4gKiBhcmUgYWxsIHByZXNlbnQuXG4gKi9cbmNvbnN0IG1lbWJlclJlY29yZHMgPSAoXG4gIGtpbmQ6ICdsZWFkJyB8ICdjb250YWN0Jyxcbik6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9PlxuICBPYmplY3QuZW50cmllcyhDQU1QQUlHTl9NRU1CRVJTKS5mbGF0TWFwKChbY2FtcGFpZ24sIG1lbWJlcnNdKSA9PlxuICAgIG1lbWJlcnNcbiAgICAgIC5maWx0ZXIoKG0pID0+IChraW5kID09PSAnbGVhZCcgPyBtLmxlYWQgOiBtLmNvbnRhY3QpKVxuICAgICAgLm1hcCgobSkgPT4gKHtcbiAgICAgICAgY3JtX2NhbXBhaWduOiBjYW1wYWlnbixcbiAgICAgICAgLi4uKGtpbmQgPT09ICdsZWFkJyA/IHsgY3JtX2xlYWQ6IG0ubGVhZCB9IDogeyBjcm1fY29udGFjdDogbS5jb250YWN0IH0pLFxuICAgICAgICBzdGF0dXM6IG0uc3RhdHVzLFxuICAgICAgICBhZGRlZF9kYXRlOiBjZWxEYXlzQWdvKG0uYWRkZWREYXlzQWdvKSxcbiAgICAgICAgLy8gYGhhc19yZXNwb25kZWRgIC8gYHJlc3BvbnNlX2RhdGVgIHRyYWNrIHRoZSBgcmVzcG9uZGVkYCBzdGF0dXNcbiAgICAgICAgLy8gZXhhY3RseSBcdTIwMTQgYSByZXNwb25kZWQgbWVtYmVyIHdpdGggbm8gcmVzcG9uc2UgZGF0ZSBpcyBhIHNoYXBlIHRoZVxuICAgICAgICAvLyByZXNwb25zZS10cmFja2luZyBzdXJmYWNlcyBjYW5ub3QgcmVuZGVyLlxuICAgICAgICBoYXNfcmVzcG9uZGVkOiBtLnN0YXR1cyA9PT0gJ3Jlc3BvbmRlZCcsXG4gICAgICAgIC4uLihtLnJlc3BvbmRlZERheXNBZ28gIT09IHVuZGVmaW5lZCA/IHsgcmVzcG9uc2VfZGF0ZTogY2VsRGF5c0FnbyhtLnJlc3BvbmRlZERheXNBZ28pIH0gOiB7fSksXG4gICAgICB9KSksXG4gICk7XG5cbmV4cG9ydCBjb25zdCBjYW1wYWlnbk1lbWJlcnNGcm9tTGVhZHMgPSBkZWZpbmVTZWVkKENhbXBhaWduTWVtYmVyLCB7XG4gIG1vZGU6ICd1cHNlcnQnLFxuICBleHRlcm5hbElkOiBbJ2NybV9jYW1wYWlnbicsICdjcm1fbGVhZCddLFxuICByZWNvcmRzOiBtZW1iZXJSZWNvcmRzKCdsZWFkJyksXG59KTtcblxuZXhwb3J0IGNvbnN0IGNhbXBhaWduTWVtYmVyc0Zyb21Db250YWN0cyA9IGRlZmluZVNlZWQoQ2FtcGFpZ25NZW1iZXIsIHtcbiAgbW9kZTogJ3Vwc2VydCcsXG4gIGV4dGVybmFsSWQ6IFsnY3JtX2NhbXBhaWduJywgJ2NybV9jb250YWN0J10sXG4gIHJlY29yZHM6IG1lbWJlclJlY29yZHMoJ2NvbnRhY3QnKSxcbn0pO1xuIiwgImNvbnN0IF9faW5qZWN0ZWRfZmlsZW5hbWVfXyA9IFwiL2hvbWUvdXNlci9ob3Rjcm0taXNzdWUtMjA5Ny9vYmplY3RzdGFjay5jb21wb3NpdGlvbi50c1wiO2NvbnN0IF9faW5qZWN0ZWRfZGlybmFtZV9fID0gXCIvaG9tZS91c2VyL2hvdGNybS1pc3N1ZS0yMDk3XCI7Y29uc3QgX19pbmplY3RlZF9pbXBvcnRfbWV0YV91cmxfXyA9IFwiZmlsZTovLy9ob21lL3VzZXIvaG90Y3JtLWlzc3VlLTIwOTcvb2JqZWN0c3RhY2suY29tcG9zaXRpb24udHNcIjsvLyBDb3B5cmlnaHQgKGMpIDIwMjUgT2JqZWN0U3RhY2suIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUtMi4wIGxpY2Vuc2UuXG5cbi8qKlxuICogVGhlIGZvdXIgcGFja2FnZXMsIGNvbGxlY3RlZCBpbnRvIHRoZSB0d28gcGFja2FnZSBzdGFja3MgdGhpcyBhcnRpZmFjdFxuICogY2Fycmllcy5cbiAqXG4gKiBBIGRpcmVjdG9yeSB1bmRlciBgc3JjL2AgSVMgYSBwYWNrYWdlIChBRFItMDEzMCwgYG1vZHVsZS1zcGxpdC1wbGFuLm1kYFxuICogaXRlbXMgNFx1MjAxMzkpLiBUd28gb2YgdGhlbSBhcmUgcGFja2FnZXMgb2YgdGhlIEFSVElGQUNUIGFzIHdlbGw6XG4gKlxuICogICAtIGBzcmMvc2FsZXMvYCBcdTIwMTQgYGFwcC5vYmplY3RzdGFjay5ob3Rjcm1gLCB0aGUgYHR5cGU6ICdhcHAnYCBwYWNrYWdlIHRoaXNcbiAqICAgICBhcnRpZmFjdCB0YWtlcyBpdHMgaWRlbnRpdHkgZnJvbS4gSXRzIGBkZWZpbmVTdGFja2AgaXMgdGhlIGZhY3RvcnkgaW5cbiAqICAgICBgc3JjL3NhbGVzL2luZGV4LnRzYCwgYW5kIHRoaXMgZmlsZSBoYW5kcyBpdCBpdHMgY29sbGVjdGlvbnM6IHRoZSBzYWxlc1xuICogICAgIGJhcnJlbHMgcGx1cyB0aG9zZSBvZiBgc3JjL3JldmVudWUvYCBhbmQgYHNyYy9tYXJrZXRpbmcvYCwgd2hpY2ggc3RheVxuICogICAgIGRpcmVjdG9yaWVzIG9mIHRoZSBhcHAgcGFja2FnZSB1bnRpbCB0aGV5IGdldCBwYWNrYWdpbmcgY2FyZHMgb2YgdGhlaXJcbiAqICAgICBvd24sIGFuZCB3aGljaCBhIGZpbGUgdW5kZXIgYHNyYy9zYWxlcy9gIG1heSBub3QgaW1wb3J0LlxuICogICAtIGBzcmMvc2VydmljZS9gIFx1MjAxNCBgYXBwLm9iamVjdHN0YWNrLmhvdGNybS5zZXJ2aWNlYCwgYSBgdHlwZTogJ21vZHVsZSdgLlxuICogICAgIEl0cyBgZGVmaW5lU3RhY2tgIGlzIGBzcmMvc2VydmljZS9pbmRleC50c2AsIHdoaWNoIGFzc2VtYmxlcyBpdHMgb3duXG4gKiAgICAgY29sbGVjdGlvbnMgZnJvbSBpdHMgb3duIGJhcnJlbHM7IHRoaXMgZmlsZSBoYW5kcyBpdCBvbmx5IHRoZSBzZWVkIHJvd3NcbiAqICAgICB0aGUgY29tcG9zaXRpb24ga25vYiBzZWxlY3RzLlxuICpcbiAqIGBvYmplY3RzdGFjay5jb25maWcudHNgIGNvbXBvc2VzIHRoZSB0d28gaW50byBPTkUgcmVsZWFzZSBhcnRpZmFjdC4gVGhpcyBmaWxlXG4gKiBidWlsZHMgdGhlbSwgYmVjYXVzZSBpdCBpcyB0aGUgb25lIHBsYWNlIHRoYXQgbWF5IHNlZSBldmVyeSBwYWNrYWdlIEFORCBjYXJyeVxuICogbmFtZWQgZXhwb3J0cy5cbiAqXG4gKiAjIyBXaHkgdGhpcyBpcyBub3Qgc2ltcGx5IHRoZSB0b3Agb2YgYG9iamVjdHN0YWNrLmNvbmZpZy50c2BcbiAqXG4gKiBUaGF0IGZpbGUgbWF5IGNhcnJ5IE5PIG5hbWVkIGV4cG9ydC4gYG9iamVjdHN0YWNrIGJ1aWxkYCByZWFkcyB0aGUgY29uZmlnXG4gKiBtb2R1bGUgYW5kIHBhcnNlcyBpdCBhZ2FpbnN0IGBPYmplY3RTdGFja0RlZmluaXRpb25TY2hlbWFgLCB3aGljaCBpc1xuICogYC5zdHJpY3RgLCBzbyBhbnkgZXhwb3J0IGJlc2lkZSB0aGUgZGVmYXVsdCBpcyBhbiB1bnJlY29nbmlzZWQgdG9wLWxldmVsXG4gKiBzdGFjayBrZXkgYW5kIHRoZSBidWlsZCBmYWlscyBieSBuYW1lLiBNZWFzdXJlZCBvbiB0aGUgcHJlLW1vdmUgdHJlZSwgbm90XG4gKiBhc3N1bWVkOiBhcHBlbmRpbmcgYGV4cG9ydCBjb25zdCBQcm9iZU5hbWVkRXhwb3J0ID0gWzEsIDIsIDNdO2AgdG8gdGhlXG4gKiB1bm1vZGlmaWVkIGBvYmplY3RzdGFjay5jb25maWcudHNgIGF0IDU5MGIwOTUgZmFpbHMgYHBucG0gYnVpbGRgIHdpdGhcbiAqIFwiVW5yZWNvZ25pemVkIGtleShzKSBvbiB0aGlzIHN0YWNrIGRlZmluaXRpb246IGBQcm9iZU5hbWVkRXhwb3J0YFwiLlxuICpcbiAqIFR3byBraW5kcyBvZiB2YWx1ZSBuZWVkIHRvIGJlIGltcG9ydGFibGUsIHNvIHRoZXkgbGl2ZSBoZXJlOlxuICpcbiAqICAgLSB0aGUgQVVUSE9SRUQgY29sbGVjdGlvbnMgXHUyMDE0IGFib3V0IGEgZG96ZW4gc3VpdGVzIGFzc2VydCBhZ2FpbnN0IHRoZW1cbiAqICAgICB1cHN0cmVhbSBvZiBgZGVmaW5lU3RhY2soKWAsIHdoaWNoIGlzIHRoZSBvbmx5IHNpZGUgb2YgdGhhdCBjYWxsIHdoZXJlXG4gKiAgICAgYENybVNlZWREYXRhYCBhbmQgdGhlIHN0YWNrJ3MgYGRhdGFgIGFyZSBkaXN0aW5ndWlzaGFibGUgYXQgYWxsIChzZWUgdGhlXG4gKiAgICAgbm90ZSBpbiBgdGVzdC9zYWFzLWNvbXBvc2l0aW9uLnRlc3QudHNgKTtcbiAqICAgLSB0aGUgdHdvIEJVSUxUIHBhY2thZ2Ugc3RhY2tzIFx1MjAxNCBhIG11bHRpLXBhY2thZ2UgYXJ0aWZhY3QgY2FycmllcyBldmVyeVxuICogICAgIGNvbGxlY3Rpb24gb25jZSwgaW5zaWRlIGl0cyBwYWNrYWdlJ3MgYm9keSBpbiBgcGFja2FnZXNbXWAsIGFuZCBubyBsb25nZXJcbiAqICAgICBiZXNpZGUgdGhlbSBhdCB0aGUgdG9wIGxldmVsIChBRFItMDEzMCBENCwgMjAyNi0wOS0yMiBhZGRlbmR1bSksIHNvIGFcbiAqICAgICBzdWl0ZSB0aGF0IHJlYWRzIFwiZXZlcnkgb2JqZWN0IG9mIHRoZSBhcHBcIiBjb21wb3NlcyB0aGVzZSB0d28gaXRzZWxmLlxuICpcbiAqICMjIE9yZGVyXG4gKlxuICogUmVnaXN0cmF0aW9uIG9yZGVyIHdpdGhpbiBhIGNvbGxlY3Rpb24gaXMgYSBwcm9wZXJ0eSBvZiBlYWNoIFBBQ0tBR0Ugbm93OlxuICogdGhlIGFydGlmYWN0IGNhcnJpZXMgZWFjaCBwYWNrYWdlJ3MgY29sbGVjdGlvbnMgaW4gaXRzIG93biBib2R5LCBpbiB0aGUgb3JkZXJcbiAqIHRoYXQgcGFja2FnZSdzIHN0YWNrIHdhcyBoYW5kZWQgdGhlbS4gVHdvIG9yZGVycyBzdGF5IGxvYWQtYmVhcmluZyBhbmQgYXJlXG4gKiBzdGF0ZWQgZXhwbGljaXRseSBiZWxvdyBcdTIwMTQgYENybVNlZWREYXRhYCwgdGhlIHJlcGxheSBvcmRlciBhIHNlZWQgcm93J3NcbiAqIG5hdHVyYWwta2V5IGxvb2t1cHMgd2VyZSB3cml0dGVuIGFnYWluc3QsIGFuZCB0aGUgaGFuZC1vcmRlcmVkIGxpc3RzXG4gKiAoYGFwcEhvb2tzYCwgYGFwcEZsb3dzYCwgYGFwcFNraWxsc2AsIGBhcHBTaGFyaW5nUnVsZXNgKSB0aGF0IGtlZXAgdGhlIG9yZGVyXG4gKiB0aGUgc2luZ2xlLXRyZWUgYmFycmVscyBoYWQuIEV2ZXJ5dGhpbmcgZWxzZSB1c2VzIGBieUV4cG9ydE5hbWUoKWAgXHUyMDE0IGFcbiAqIG1vZHVsZSBuYW1lc3BhY2UgZW51bWVyYXRlcyBpdHMgZXhwb3J0cyBpbiBhc2NlbmRpbmcgY29kZS11bml0IG9yZGVyIG9mIHRoZVxuICogZXhwb3J0IE5BTUUsIHNvIG1lcmdpbmcgc2V2ZXJhbCBiYXJyZWxzIGFuZCBzb3J0aW5nIGJ5IHRoYXQgbmFtZSBpcyB0aGUgc2FtZVxuICogcnVsZSBvbmUgYmFycmVsIGFscmVhZHkgYXBwbGllZCwgcmF0aGVyIHRoYW4gYSBuZXcgb25lLlxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhvdENybUFwcFN0YWNrIH0gZnJvbSAnLi9zcmMvc2FsZXMvaW5kZXguanMnO1xuaW1wb3J0IHtcbiAgY3JlYXRlSG90Q3JtU2VydmljZVN0YWNrLCBzZXJ2aWNlSG9va3MsIHNlcnZpY2VGbG93cywgc2VydmljZVNraWxscywgc2VydmljZVNoYXJpbmdSdWxlcyxcbn0gZnJvbSAnLi9zcmMvc2VydmljZS9pbmRleC5qcyc7XG5cbmltcG9ydCAqIGFzIHNhbGVzT2JqZWN0cyBmcm9tICcuL3NyYy9zYWxlcy9vYmplY3RzL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIHJldmVudWVPYmplY3RzIGZyb20gJy4vc3JjL3JldmVudWUvb2JqZWN0cy9pbmRleC5qcyc7XG5pbXBvcnQgKiBhcyBtYXJrZXRpbmdPYmplY3RzIGZyb20gJy4vc3JjL21hcmtldGluZy9vYmplY3RzL2luZGV4LmpzJztcblxuaW1wb3J0ICogYXMgc2FsZXNBY3Rpb25zIGZyb20gJy4vc3JjL3NhbGVzL2FjdGlvbnMvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgbWFya2V0aW5nQWN0aW9ucyBmcm9tICcuL3NyYy9tYXJrZXRpbmcvYWN0aW9ucy9pbmRleC5qcyc7XG5cbmltcG9ydCAqIGFzIHNhbGVzRGFzaGJvYXJkcyBmcm9tICcuL3NyYy9zYWxlcy9kYXNoYm9hcmRzL2luZGV4LmpzJztcblxuaW1wb3J0ICogYXMgc2FsZXNEYXRhc2V0cyBmcm9tICcuL3NyYy9zYWxlcy9kYXRhc2V0cy9pbmRleC5qcyc7XG5pbXBvcnQgKiBhcyByZXZlbnVlRGF0YXNldHMgZnJvbSAnLi9zcmMvcmV2ZW51ZS9kYXRhc2V0cy9pbmRleC5qcyc7XG5cbmltcG9ydCAqIGFzIHNhbGVzUmVwb3J0cyBmcm9tICcuL3NyYy9zYWxlcy9yZXBvcnRzL2luZGV4LmpzJztcblxuaW1wb3J0ICogYXMgbWFwcGluZ3MgZnJvbSAnLi9zcmMvc2FsZXMvbWFwcGluZ3MvaW5kZXguanMnO1xuaW1wb3J0ICogYXMgYXBwcyBmcm9tICcuL3NyYy9zYWxlcy9hcHBzL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIHByb2ZpbGVzIGZyb20gJy4vc3JjL3NhbGVzL3Byb2ZpbGVzL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIHRyYW5zbGF0aW9ucyBmcm9tICcuL3NyYy9zYWxlcy90cmFuc2xhdGlvbnMvaW5kZXguanMnO1xuXG5pbXBvcnQgKiBhcyBzYWxlc1ZpZXdzIGZyb20gJy4vc3JjL3NhbGVzL3ZpZXdzL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIHJldmVudWVWaWV3cyBmcm9tICcuL3NyYy9yZXZlbnVlL3ZpZXdzL2luZGV4LmpzJztcbmltcG9ydCAqIGFzIG1hcmtldGluZ1ZpZXdzIGZyb20gJy4vc3JjL21hcmtldGluZy92aWV3cy9pbmRleC5qcyc7XG5cbmltcG9ydCAqIGFzIHNhbGVzUGFnZXMgZnJvbSAnLi9zcmMvc2FsZXMvcGFnZXMvaW5kZXguanMnO1xuXG5pbXBvcnQgKiBhcyBzYWxlc0VtYWlsVGVtcGxhdGVzIGZyb20gJy4vc3JjL3NhbGVzL2VtYWlsLXRlbXBsYXRlcy9pbmRleC5qcyc7XG5pbXBvcnQgKiBhcyByZXZlbnVlRW1haWxUZW1wbGF0ZXMgZnJvbSAnLi9zcmMvcmV2ZW51ZS9lbWFpbC10ZW1wbGF0ZXMvaW5kZXguanMnO1xuXG5pbXBvcnQgeyBTeXN0ZW1BZG1pblByb2ZpbGUgfSBmcm9tICcuL3NyYy9zYWxlcy9wcm9maWxlcy9pbmRleC5qcyc7XG5pbXBvcnQgeyBUZW5hbnRBZG1pblByb2ZpbGUgfSBmcm9tICcuL3NyYy9zYWxlcy9wcm9maWxlcy90ZW5hbnQtYWRtaW4ucHJvZmlsZS5qcyc7XG5cbi8vIEhvb2tzIFx1MjAxNCBvbmUgYmFycmVsIHBlciBkaXJlY3RvcnksIGFzc2VtYmxlZCBiZWxvdyBpbiBzb3VyY2UtZmlsZS1uYW1lIG9yZGVyLlxuaW1wb3J0IHtcbiAgYWNjb3VudEhvb2ssIGNvbnRhY3RIb29rLCBldmVudEhvb2ssIGZvcmVjYXN0SG9vaywgbGVhZEhvb2ssXG4gIGxlYWRDYW1wYWlnbk1ldHJpY3NIb29rLCBvcHBvcnR1bml0eUhvb2ssIG9wcG9ydHVuaXR5Q2FtcGFpZ25NZXRyaWNzSG9vaywgdGFza0hvb2ssXG59IGZyb20gJy4vc3JjL3NhbGVzL29iamVjdHMvaG9va3MuanMnO1xuaW1wb3J0IHtcbiAgY29udHJhY3RIb29rLCBvcHBvcnR1bml0eUxpbmVJdGVtSG9vaywgcHJvZHVjdEhvb2ssIHF1b3RlSG9vaywgcXVvdGVMaW5lSXRlbUhvb2ssXG59IGZyb20gJy4vc3JjL3JldmVudWUvb2JqZWN0cy9ob29rcy5qcyc7XG5pbXBvcnQgeyBjYW1wYWlnbkhvb2ssIGNhbXBhaWduTWVtYmVySG9vayB9IGZyb20gJy4vc3JjL21hcmtldGluZy9vYmplY3RzL2hvb2tzLmpzJztcblxuLy8gRmxvd3MgXHUyMDE0IHRoZSByZWdpc3RyYXRpb24gb3JkZXIgdGhlIHNpbmdsZSBgYWxsRmxvd3NgIGFycmF5IHVzZWQgdG8gaG9sZC5cbmltcG9ydCB7XG4gIENvbnRhY3RXZWxjb21lRmxvdywgRm9yZWNhc3RTbmFwc2hvdEZsb3csIExlYWRBc3NpZ25tZW50RmxvdyxcbiAgQWNjb3VudEFwcHJvdmFsRmxvdyxcbiAgTGVhZENvbnZlcnNpb25GbG93LCBMZWFkQ29udmVyc2lvbkFwcHJvdmFsRmxvdyxcbiAgT3Bwb3J0dW5pdHlBcHByb3ZhbEZsb3csIE9wcG9ydHVuaXR5QXBwcm92YWxPbkNyZWF0ZUZsb3csXG4gIE9wcG9ydHVuaXR5U3RhdHVzQ2hhbmdlQXBwcm92YWxGbG93LCBPcHBvcnR1bml0eVF1YWxpZmljYXRpb25BcHByb3ZhbEZsb3csXG4gIE9wcG9ydHVuaXR5U3RhZ25hdGlvbkZsb3csIE9wcG9ydHVuaXR5V29uQWxlcnRGbG93LCBTY2hlZHVsZUZvbGxvd1VwRmxvdyxcbiAgVGFza0R1ZVJlbWluZGVyRmxvdywgVGFza1VyZ2VudEFsZXJ0RmxvdywgQmlsbGluZ0hhbmRvZmZDbG9zZWRXb25GbG93LFxufSBmcm9tICcuL3NyYy9zYWxlcy9mbG93cy9pbmRleC5qcyc7XG5pbXBvcnQge1xuICBRdW90ZUdlbmVyYXRpb25GbG93LCBDb250cmFjdFJlbmV3YWxGbG93LCBRdW90ZUV4cGlyYXRpb25GbG93LCBDb250cmFjdEV4cGlyYXRpb25GbG93LFxuICBCaWxsaW5nSGFuZG9mZkNvbnRyYWN0QWN0aXZhdGVkRmxvdyxcbn0gZnJvbSAnLi9zcmMvcmV2ZW51ZS9mbG93cy9pbmRleC5qcyc7XG5pbXBvcnQge1xuICBDYW1wYWlnbkVucm9sbG1lbnRGbG93LCBDYW1wYWlnbkxlYWRNZW1iZXJFbnJvbGxGbG93LCBDYW1wYWlnbkNvbnRhY3RNZW1iZXJFbnJvbGxGbG93LFxuICBDYW1wYWlnbkNvbXBsZXRpb25GbG93LFxufSBmcm9tICcuL3NyYy9tYXJrZXRpbmcvZmxvd3MvaW5kZXguanMnO1xuXG4vLyBTa2lsbHMgXHUyMDE0IGxpa2V3aXNlLlxuaW1wb3J0IHtcbiAgTGVhZFF1YWxpZmljYXRpb25Ta2lsbCwgRW1haWxEcmFmdGluZ1NraWxsLCBSZXZlbnVlRm9yZWNhc3RpbmdTa2lsbCxcbiAgQ3VzdG9tZXIzNjBTa2lsbCwgTGl2ZURhdGFTa2lsbCxcbn0gZnJvbSAnLi9zcmMvc2FsZXMvc2tpbGxzL2luZGV4LmpzJztcblxuaW1wb3J0IHtcbiAgQWNjb3VudFRlYW1TaGFyaW5nUnVsZSwgVGVycml0b3J5U2hhcmluZ1J1bGVzLFxuICBPcHBvcnR1bml0eVNhbGVzU2hhcmluZ1J1bGUsIE9wcG9ydHVuaXR5RXhlY3V0aXZlU2hhcmluZ1J1bGUsXG4gIENybVBvc2l0aW9ucyxcbn0gZnJvbSAnLi9zcmMvc2FsZXMvc2hhcmluZy9pbmRleC5qcyc7XG5pbXBvcnQgeyBDYW1wYWlnbkxlYWRlcnNoaXBTaGFyaW5nUnVsZXMgfSBmcm9tICcuL3NyYy9tYXJrZXRpbmcvc2hhcmluZy9pbmRleC5qcyc7XG5cbmltcG9ydCB0eXBlIHsgRW1haWxUZW1wbGF0ZURlZmluaXRpb24gfSBmcm9tICdAb2JqZWN0c3RhY2svc3BlYy9zeXN0ZW0nO1xuXG4vLyBTZWVkIHJvd3MgXHUyMDE0IHRoZSByZXBsYXkgb3JkZXIgbGl2ZXMgaW4gYENybVNlZWREYXRhYCBiZWxvdy5cbmltcG9ydCB0eXBlIHsgSG90Q3JtQ29tcG9zaXRpb24gfSBmcm9tICcuL3NyYy9zYWxlcy9kYXRhL2luZGV4LmpzJztcbmltcG9ydCB7XG4gIHJlc29sdmVDb21wb3NpdGlvbixcbiAgYWNjb3VudHMsIGNvbnRhY3RzLCBsZWFkcywgb3Bwb3J0dW5pdGllcyxcbiAgdGFza3MsIGV2ZW50cywgZXZlbnRBdHRlbmRlZXNGcm9tQ29udGFjdHMsIGV2ZW50QXR0ZW5kZWVzRnJvbUxlYWRzLCBsZWFkSW50ZXJhY3Rpb25Qb2ludGVycywgZm9yZWNhc3RzLFxufSBmcm9tICcuL3NyYy9zYWxlcy9kYXRhL2luZGV4LmpzJztcbmltcG9ydCB7IHByb2R1Y3RzLCBvcHBvcnR1bml0eUxpbmVJdGVtcywgY29udHJhY3RzLCBxdW90ZXMsIHF1b3RlTGluZUl0ZW1zIH0gZnJvbSAnLi9zcmMvcmV2ZW51ZS9kYXRhL2luZGV4LmpzJztcbmltcG9ydCB7IGNhc2VzLCBrbm93bGVkZ2VBcnRpY2xlcyB9IGZyb20gJy4vc3JjL3NlcnZpY2UvZGF0YS9pbmRleC5qcyc7XG5pbXBvcnQgeyBjYW1wYWlnbnMsIGNhbXBhaWduTWVtYmVyc0Zyb21MZWFkcywgY2FtcGFpZ25NZW1iZXJzRnJvbUNvbnRhY3RzIH0gZnJvbSAnLi9zcmMvbWFya2V0aW5nL2RhdGEvaW5kZXguanMnO1xuXG4vKipcbiAqIE9uZSByZWdpc3RyYXRpb24gYXJyYXkgb3V0IG9mIHRoZSBtZXJnZWQgcGVyLXBhY2thZ2UgYmFycmVscyBvZiBhIG1ldGFkYXRhXG4gKiB0eXBlLCBvcmRlcmVkIGJ5IEVYUE9SVCBOQU1FLlxuICpcbiAqIGBPYmplY3QudmFsdWVzKDxtb2R1bGUgbmFtZXNwYWNlPilgIFx1MjAxNCB3aGF0IHRoaXMgZmlsZSBkaWQgZm9yIGVhY2ggb2YgdGhlc2VcbiAqIGNvbGxlY3Rpb25zIHdoaWxlIHRoZXJlIHdhcyBvbmUgYmFycmVsIHBlciB0eXBlIFx1MjAxNCBlbnVtZXJhdGVzIGluIGFzY2VuZGluZ1xuICogY29kZS11bml0IG9yZGVyIG9mIHRoZSBleHBvcnQgbmFtZSwgbm90IGluIHRoZSBiYXJyZWwncyBkZWNsYXJhdGlvbiBvcmRlci5cbiAqIChNZWFzdXJlZCBvbiB0aGUgcHJlLW1vdmUgYXJ0aWZhY3Q6IGBzcmMvcGFnZXMvaW5kZXgudHNgIGRlY2xhcmVkXG4gKiBgTGVhZERldGFpbFBhZ2VgIGZpcnN0IGFuZCB0aGUgYXJ0aWZhY3QncyBgcGFnZXNbXWAgc3RpbGwgYmVnYW4gd2l0aFxuICogYGFjY291bnRfZGV0YWlsX3BhZ2VgLikgU28gc29ydGluZyB0aGUgbWVyZ2VkIGVudHJpZXMgYnkgZXhwb3J0IG5hbWUgaXMgbm90XG4gKiBhIG5ldyBvcmRlcmluZyBydWxlIFx1MjAxNCBpdCBpcyB0aGUgc2FtZSBvbmUsIGFwcGxpZWQgYWNyb3NzIGZvdXIgbmFtZXNwYWNlc1xuICogaW5zdGVhZCBvZiBvbmUuXG4gKlxuICogVGhlIG5hbWVzcGFjZXMgYXJlIHNwcmVhZCBpbnRvIG9uZSBvYmplY3QgYXQgdGhlIGNhbGwgc2l0ZSwgd2hpY2ggaXMgYWxzb1xuICogd2hhdCBrZWVwcyB0aGUgZW50cmllcyBUWVBFRDogZWFjaCBiYXJyZWwgaXMgaXRzIG93biBtb2R1bGUgbmFtZXNwYWNlIHdpdGhcbiAqIGl0cyBvd24gZWxlbWVudCB1bmlvbiwgc28gcGFzc2luZyB0aGVtIGFzIHNlcGFyYXRlIGFyZ3VtZW50cyBtYWtlc1xuICogVHlwZVNjcmlwdCBpbmZlciBgVGAgZnJvbSB0aGUgZmlyc3Qgb25lIGFsb25lIGFuZCByZWplY3QgdGhlIHJlc3QuIEFcbiAqIGR1cGxpY2F0ZSBleHBvcnQgbmFtZSBhY3Jvc3MgdHdvIHBhY2thZ2VzIHdvdWxkIGNvbGxpZGUgaW4gdGhhdCBzcHJlYWQgXHUyMDE0IGl0XG4gKiBjb3VsZCBub3QgaGFwcGVuIHdoaWxlIHRoZSBleHBvcnRzIHNoYXJlZCBvbmUgbmFtZXNwYWNlIGVpdGhlciwgYW5kIGl0IGlzIGFcbiAqIGNvbXBpbGUgZXJyb3IgdGhlIGRheSB0d28gcGFja2FnZXMgZXhwb3J0IHRoZSBzYW1lIG5hbWUuXG4gKi9cbmNvbnN0IGJ5RXhwb3J0TmFtZSA9IDxUPihtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIFQ+KTogVFtdID0+XG4gIE9iamVjdC5lbnRyaWVzKG1lcmdlZClcbiAgICAuc29ydCgoW2FdLCBbYl0pID0+IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCkpXG4gICAgLm1hcCgoWywgdmFsdWVdKSA9PiB2YWx1ZSk7XG5cbi8qIFx1MjUwMFx1MjUwMFx1MjUwMCBUaGUgYXBwIHBhY2thZ2UncyBjb2xsZWN0aW9ucyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAgKi9cblxuLyoqXG4gKiBFdmVyeSBDUk0gbGlmZWN5Y2xlIGhvb2sgdGhlIEFQUCBQQUNLQUdFIHJlZ2lzdGVycywgaW4gdGhlIG9yZGVyXG4gKiBgc3JjL2hvb2tzL2luZGV4LnRzYCByZWdpc3RlcmVkIHRoZW0gKGJ5IGhvb2sgc291cmNlIGZpbGUgbmFtZSkgXHUyMDE0IHNlZSB0aGVcbiAqIE9SREVSIG5vdGUgYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuXG4gKlxuICogYCouaG9vay50c2AgZmlsZXMgc2l0IGJlc2lkZSB0aGUgYCoub2JqZWN0LnRzYCB0aGV5IG5hbWUsIG9uZSBkaXJlY3RvcnkgZWFjaCxcbiAqIHdoaWNoIGlzIHdoYXQgZW5mb3JjZXMgQURSLTAxMzAgUjQuIFR3byBlbnRyaWVzIHRoZXJlZm9yZSBjb21lIGZyb20gYVxuICogZGlmZmVyZW50IGRpcmVjdG9yeSB0aGFuIHRoZSBjYW1wYWlnbiBtZXRhZGF0YSB0aGV5IG1haW50YWluOlxuICogYG9wcG9ydHVuaXR5Q2FtcGFpZ25NZXRyaWNzSG9va2AgYW5kIGBsZWFkQ2FtcGFpZ25NZXRyaWNzSG9va2AgYXJlIGF0dGFjaGVkXG4gKiB0byBgY3JtX29wcG9ydHVuaXR5YCBhbmQgYGNybV9sZWFkYCwgc28gdGhleSBsaXZlIGluIHNhbGVzLiBUaGUgdGhyZWUgc2VydmljZVxuICogaG9va3MgcmVnaXN0ZXIgd2l0aCB0aGUgc2VydmljZSBwYWNrYWdlIChgc2VydmljZUhvb2tzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBIb29rcyA9IFtcbiAgYWNjb3VudEhvb2ssXG4gIGNhbXBhaWduSG9vayxcbiAgb3Bwb3J0dW5pdHlDYW1wYWlnbk1ldHJpY3NIb29rLFxuICBsZWFkQ2FtcGFpZ25NZXRyaWNzSG9vayxcbiAgY2FtcGFpZ25NZW1iZXJIb29rLFxuICBjb250YWN0SG9vayxcbiAgY29udHJhY3RIb29rLFxuICBldmVudEhvb2ssXG4gIGZvcmVjYXN0SG9vayxcbiAgbGVhZEhvb2ssXG4gIG9wcG9ydHVuaXR5SG9vayxcbiAgb3Bwb3J0dW5pdHlMaW5lSXRlbUhvb2ssXG4gIHByb2R1Y3RIb29rLFxuICBxdW90ZUhvb2ssXG4gIHF1b3RlTGluZUl0ZW1Ib29rLFxuICB0YXNrSG9vayxcbl0uZmxhdE1hcCgoZW50cnkpID0+IChBcnJheS5pc0FycmF5KGVudHJ5KSA/IGVudHJ5IDogW2VudHJ5XSkpO1xuXG4vKipcbiAqIEV2ZXJ5IGZsb3cgdGhlIGFwcCBwYWNrYWdlIHJlZ2lzdGVycywgaW4gdGhlIG9yZGVyIHRoZSBzaW5nbGUgYGFsbEZsb3dzYFxuICogYXJyYXkgcmVnaXN0ZXJlZCB0aGVtLiBUaGUgc2V2ZW4gY2FzZSBmbG93cyByZWdpc3RlciB3aXRoIHRoZSBzZXJ2aWNlXG4gKiBwYWNrYWdlIChgc2VydmljZUZsb3dzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBGbG93cyA9IFtcbiAgQ2FtcGFpZ25FbnJvbGxtZW50RmxvdyxcbiAgQ2FtcGFpZ25MZWFkTWVtYmVyRW5yb2xsRmxvdyxcbiAgQ2FtcGFpZ25Db250YWN0TWVtYmVyRW5yb2xsRmxvdyxcbiAgQWNjb3VudEFwcHJvdmFsRmxvdyxcbiAgTGVhZENvbnZlcnNpb25GbG93LFxuICBMZWFkQ29udmVyc2lvbkFwcHJvdmFsRmxvdyxcbiAgU2NoZWR1bGVGb2xsb3dVcEZsb3csXG4gIE9wcG9ydHVuaXR5QXBwcm92YWxGbG93LFxuICBPcHBvcnR1bml0eUFwcHJvdmFsT25DcmVhdGVGbG93LFxuICBPcHBvcnR1bml0eVN0YXR1c0NoYW5nZUFwcHJvdmFsRmxvdyxcbiAgT3Bwb3J0dW5pdHlRdWFsaWZpY2F0aW9uQXBwcm92YWxGbG93LFxuICBRdW90ZUdlbmVyYXRpb25GbG93LFxuICBDb250cmFjdFJlbmV3YWxGbG93LFxuICBPcHBvcnR1bml0eVN0YWduYXRpb25GbG93LFxuICBGb3JlY2FzdFNuYXBzaG90RmxvdyxcbiAgTGVhZEFzc2lnbm1lbnRGbG93LFxuICBDYW1wYWlnbkNvbXBsZXRpb25GbG93LFxuICBRdW90ZUV4cGlyYXRpb25GbG93LFxuICBDb250cmFjdEV4cGlyYXRpb25GbG93LFxuICBDb250YWN0V2VsY29tZUZsb3csXG4gIE9wcG9ydHVuaXR5V29uQWxlcnRGbG93LFxuICBUYXNrVXJnZW50QWxlcnRGbG93LFxuICBUYXNrRHVlUmVtaW5kZXJGbG93LFxuICBCaWxsaW5nSGFuZG9mZkNsb3NlZFdvbkZsb3csXG4gIEJpbGxpbmdIYW5kb2ZmQ29udHJhY3RBY3RpdmF0ZWRGbG93LFxuXTtcblxuLyoqXG4gKiBFdmVyeSBza2lsbCB0aGUgYXBwIHBhY2thZ2UgcmVnaXN0ZXJzIFx1MjAxNCB0aGUgY3Jvc3MtZG9tYWluIG9uZXMgYXJlIGFsbCBoZXJlLlxuICogVGhlIGNhc2UtdHJpYWdlIHNraWxsIHJlZ2lzdGVycyB3aXRoIHRoZSBzZXJ2aWNlIHBhY2thZ2UgKGBzZXJ2aWNlU2tpbGxzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBTa2lsbHMgPSBbXG4gIExlYWRRdWFsaWZpY2F0aW9uU2tpbGwsXG4gIEVtYWlsRHJhZnRpbmdTa2lsbCxcbiAgUmV2ZW51ZUZvcmVjYXN0aW5nU2tpbGwsXG4gIEN1c3RvbWVyMzYwU2tpbGwsXG4gIExpdmVEYXRhU2tpbGwsXG5dO1xuXG4vKiogRXZlcnkgb2JqZWN0IGRlZmluaXRpb24gdGhlIGFwcCBwYWNrYWdlIHJlZ2lzdGVycy4gKi9cbmV4cG9ydCBjb25zdCBhcHBPYmplY3RzID0gYnlFeHBvcnROYW1lKHtcbiAgLi4uc2FsZXNPYmplY3RzLCAuLi5yZXZlbnVlT2JqZWN0cywgLi4ubWFya2V0aW5nT2JqZWN0cyxcbn0pO1xuXG4vKiogRXZlcnkgVUkgLyBBSS1jYWxsYWJsZSBhY3Rpb24gaXQgcmVnaXN0ZXJzLiAqL1xuZXhwb3J0IGNvbnN0IGFwcEFjdGlvbnMgPSBieUV4cG9ydE5hbWUoeyAuLi5zYWxlc0FjdGlvbnMsIC4uLm1hcmtldGluZ0FjdGlvbnMgfSk7XG5cbi8qKiBJdHMgZGFzaGJvYXJkcyBcdTIwMTQgdGhlIGNyb3NzLWRvbWFpbiBvbmVzIGluY2x1ZGVkIChwbGFuIGl0ZW0gNCkuICovXG5leHBvcnQgY29uc3QgYXBwRGFzaGJvYXJkcyA9IGJ5RXhwb3J0TmFtZSh7IC4uLnNhbGVzRGFzaGJvYXJkcyB9KTtcblxuLyoqIEl0cyBhbmFseXRpY3MgZGF0YXNldHMgKEFEUi0wMDIxKS4gKi9cbmV4cG9ydCBjb25zdCBhcHBEYXRhc2V0cyA9IGJ5RXhwb3J0TmFtZSh7IC4uLnNhbGVzRGF0YXNldHMsIC4uLnJldmVudWVEYXRhc2V0cyB9KTtcblxuLyoqIEl0cyByZXBvcnRzLiAqL1xuZXhwb3J0IGNvbnN0IGFwcFJlcG9ydHMgPSBieUV4cG9ydE5hbWUoeyAuLi5zYWxlc1JlcG9ydHMgfSk7XG5cbi8qKiBJdHMgbGlzdC12aWV3IGdyb3Vwcy4gKi9cbmV4cG9ydCBjb25zdCBhcHBWaWV3cyA9IGJ5RXhwb3J0TmFtZSh7XG4gIC4uLnNhbGVzVmlld3MsIC4uLnJldmVudWVWaWV3cywgLi4ubWFya2V0aW5nVmlld3MsXG59KTtcblxuLyoqIEl0cyBwYWdlIGxheW91dHMgXHUyMDE0IGBob21lYCwgYGFwcF9sYXVuY2hlcmAgYW5kIGB1dGlsaXR5X2JhcmAgYW1vbmcgdGhlbS4gKi9cbmV4cG9ydCBjb25zdCBhcHBQYWdlcyA9IGJ5RXhwb3J0TmFtZSh7IC4uLnNhbGVzUGFnZXMgfSk7XG5cbi8qKiBFdmVyeSBpbXBvcnQgbWFwcGluZyBcdTIwMTQgc2FsZXMgb25seTsgbm90aGluZyBlbHNlIGF1dGhvcnMgb25lLiAqL1xuZXhwb3J0IGNvbnN0IGFwcE1hcHBpbmdzID0gYnlFeHBvcnROYW1lKHsgLi4ubWFwcGluZ3MgfSk7XG5cbi8qKiBUaGUgYXBwIGl0c2VsZiwgYW5kIGl0cyBuYXZpZ2F0aW9uIEdST1VQUyAodGhlIGNvbnRhaW5lcnMgbW9kdWxlcyBhaW0gYXQpLiAqL1xuZXhwb3J0IGNvbnN0IGFwcEFwcHMgPSBieUV4cG9ydE5hbWUoeyAuLi5hcHBzIH0pO1xuXG4vKiogVGhlIGxvY2FsZSBwYWNrcyBcdTIwMTQgd2hvbGUgaW4gdGhlIGFwcCBwYWNrYWdlIChwbGFuIGl0ZW0gNCksIHNlcnZpY2UgbGFiZWxzIGluY2x1ZGVkLiAqL1xuZXhwb3J0IGNvbnN0IGFwcFRyYW5zbGF0aW9ucyA9IGJ5RXhwb3J0TmFtZSh7IC4uLnRyYW5zbGF0aW9ucyB9KTtcblxuLyoqXG4gKiBFdmVyeSBgc3lzX2VtYWlsX3RlbXBsYXRlYCByb3cgdGhlIGFwcCBwYWNrYWdlIHJlZ2lzdGVycyBcdTIwMTQgdGhlIGxvY2FsaXphYmxlXG4gKiBjb250ZW50IHBhdGggZm9yIGBub3RpZnlgICgjOTIwNSkuIFRoZSBzZXJ2aWNlIHBhY2thZ2UgcmVnaXN0ZXJzIGl0cyBvd24gdHdvXG4gKiBjYXNlIHRlbXBsYXRlcywgYmVzaWRlIHRoZSBmbG93cyB0aGF0IHNlbmQgdGhlbS5cbiAqXG4gKiBBIHBhY2thZ2UgYmFycmVsIGV4cG9ydHMgT05FIHN5bWJvbCBjYXJyeWluZyB0aGF0IHBhY2thZ2UncyByb3dzLCBzb1xuICogYGJ5RXhwb3J0TmFtZSgpYCBvcmRlcnMgdGhlbSBieSBleHBvcnQgbmFtZSBhbmQgYC5mbGF0KClgIHByb2R1Y2VzIHRoZVxuICogc2luZ2xlIGFycmF5IGBkZWZpbmVTdGFjayh7IGVtYWlsVGVtcGxhdGVzIH0pYCB0YWtlcy4gUmVhY2hpbmcgdGhlIHBhY2thZ2VcbiAqIGJhcnJlbCBJUyByZWFjaGluZyB0aGUgcmVnaXN0cmF0aW9uIGhlcmU6IG5vIGhhbmQta2VwdCBvcmRlcmVkIGxpc3QsIGJlY2F1c2VcbiAqIG5vdGhpbmcgYWJvdXQgdGhlIG9yZGVyIGlzIGxvYWQtYmVhcmluZyBcdTIwMTQgYSByb3cgaXMgcmVzb2x2ZWQgYnlcbiAqIGAobmFtZSwgbG9jYWxlKWAgYXQgZGVsaXZlcnkgdGltZSwgbmV2ZXIgYnkgcG9zaXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBFbWFpbFRlbXBsYXRlcyA9IGJ5RXhwb3J0TmFtZTxFbWFpbFRlbXBsYXRlRGVmaW5pdGlvbltdPih7XG4gIC4uLnNhbGVzRW1haWxUZW1wbGF0ZXMsIC4uLnJldmVudWVFbWFpbFRlbXBsYXRlcyxcbn0pLmZsYXQoKTtcblxuLyoqXG4gKiBUaGUgcGVybWlzc2lvbiBzZXRzLCBhcyB0aGUgTkFNRVNQQUNFIHJhdGhlciB0aGFuIGFuIGFycmF5OiB0aGUgU2FhU1xuICogY29tcG9zaXRpb24gZmlsdGVycyB0aGVtIGJ5IGlkZW50aXR5IGJlbG93LCB3aGljaCBuZWVkcyBgT2JqZWN0LnZhbHVlcygpYFxuICogb3ZlciB0aGUgc2FtZSBvYmplY3QgdGhlIG5hbWVkIGV4cG9ydHMgY29tZSBmcm9tLlxuICpcbiAqIFRoZXkgc3RheSBXSE9MRSBpbiB0aGUgYXBwIHBhY2thZ2UgKEFEUi0wMTMwIGFkZGVuZHVtLCAyMDI2LTA5LTAyKSwgc2VydmljZVxuICogZ3JhbnRzIGluY2x1ZGVkOiBhIHBlcm1pc3Npb24gc2V0IGlzIGEgcm9sZSBhIHBlcnNvbiBob2xkcyBhY3Jvc3MgdGhlIHdob2xlXG4gKiBwcm9kdWN0LCBub3QgYSBwcm9wZXJ0eSBvZiBvbmUgbW9kdWxlLlxuICovXG5leHBvcnQgY29uc3QgYWxsUHJvZmlsZXMgPSBwcm9maWxlcztcblxuZXhwb3J0IHsgU3lzdGVtQWRtaW5Qcm9maWxlLCBUZW5hbnRBZG1pblByb2ZpbGUgfTtcblxuLyoqXG4gKiBUaGUgc2hhcmluZyBydWxlcyB0aGUgYXBwIHBhY2thZ2UgcmVnaXN0ZXJzLCBpbiB0aGUgb3JkZXIgdGhpcyBhcHAgaGFzXG4gKiBhbHdheXMgcmVnaXN0ZXJlZCB0aGVtLiBUaGUgdGhyZWUgQ0FTRSBydWxlcyBhcmUgYXV0aG9yZWQgYWdhaW5zdFxuICogYGNybV9jYXNlYCBhbmQgcmVnaXN0ZXIgd2l0aCB0aGUgc2VydmljZSBwYWNrYWdlIChgc2VydmljZVNoYXJpbmdSdWxlc2ApLlxuICovXG5leHBvcnQgY29uc3QgYXBwU2hhcmluZ1J1bGVzID0gW1xuICBBY2NvdW50VGVhbVNoYXJpbmdSdWxlLFxuICBPcHBvcnR1bml0eVNhbGVzU2hhcmluZ1J1bGUsXG4gIE9wcG9ydHVuaXR5RXhlY3V0aXZlU2hhcmluZ1J1bGUsXG4gIC4uLlRlcnJpdG9yeVNoYXJpbmdSdWxlcyxcbiAgLi4uQ2FtcGFpZ25MZWFkZXJzaGlwU2hhcmluZ1J1bGVzLFxuXTtcblxuZXhwb3J0IHsgQ3JtUG9zaXRpb25zIH07XG5cbi8qIFx1MjUwMFx1MjUwMFx1MjUwMCBBcnRpZmFjdC13aWRlIHN3ZWVwcyBcdTIwMTQgd2hhdCB0aGUgc3VpdGVzIHJlYWQgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwICovXG5cbi8qKlxuICogRXZlcnkgaG9vayBpbiB0aGUgQVJUSUZBQ1QsIGJvdGggcGFja2FnZXMuXG4gKlxuICogVGhlIHN1aXRlcyB0aGF0IHN3ZWVwIGhvb2tzIChgdGVzdC9yZWZ1c2FsLWVudmVsb3BlLnRlc3QudHNgLFxuICogYHRlc3QvcnVudGltZS1jb3ZlcmFnZS50ZXN0LnRzYCwgYHRlc3QvaG9vay13cml0ZS1zaGFwZS50ZXN0LnRzYCxcbiAqIGB0ZXN0L2FjdGlvbi1zYW5kYm94LnRlc3QudHNgLCBgdGVzdC90ZXJyaXRvcnktc2luZ2xlLXNvdXJjZS50ZXN0LnRzYCkgYXJlXG4gKiBhYm91dCB0aGUgYXBwIGEgY3VzdG9tZXIgaW5zdGFsbHMsIHdoaWNoIGlzIHRoZSB3aG9sZSBhcnRpZmFjdCBcdTIwMTQgc28gdGhleSBrZWVwXG4gKiByZWFkaW5nIG9uZSBsaXN0LCBhc3NlbWJsZWQgaGVyZSBmcm9tIGVhY2ggcGFja2FnZSdzIG93bi5cbiAqL1xuZXhwb3J0IGNvbnN0IGFsbEhvb2tzID0gWy4uLmFwcEhvb2tzLCAuLi5zZXJ2aWNlSG9va3NdO1xuXG4vKiogRXZlcnkgZmxvdyBpbiB0aGUgYXJ0aWZhY3QsIGJvdGggcGFja2FnZXMgXHUyMDE0IHNhbWUgcmVhc29uIGFzIHtAbGluayBhbGxIb29rc30uICovXG5leHBvcnQgY29uc3QgYWxsRmxvd3MgPSBbLi4uYXBwRmxvd3MsIC4uLnNlcnZpY2VGbG93c107XG5cbi8qKiBFdmVyeSBza2lsbCBpbiB0aGUgYXJ0aWZhY3QsIGJvdGggcGFja2FnZXMgXHUyMDE0IHNhbWUgcmVhc29uIGFzIHtAbGluayBhbGxIb29rc30uICovXG5leHBvcnQgY29uc3QgYWxsU2tpbGxzID0gWy4uLmFwcFNraWxscywgLi4uc2VydmljZVNraWxsc107XG5cbi8qKiBFdmVyeSBzaGFyaW5nIHJ1bGUgaW4gdGhlIGFydGlmYWN0LCBib3RoIHBhY2thZ2VzIFx1MjAxNCBzYW1lIHJlYXNvbiBhcyB7QGxpbmsgYWxsSG9va3N9LiAqL1xuZXhwb3J0IGNvbnN0IENybVNoYXJpbmdSdWxlcyA9IFsuLi5hcHBTaGFyaW5nUnVsZXMsIC4uLnNlcnZpY2VTaGFyaW5nUnVsZXNdO1xuXG5cbi8qKlxuICogT3duZXJzaGlwIGFuZCBDUk0gcG9zaXRpb25zIGFyZSBOT1Qgc2VlZGVkIGhlcmUgXHUyMDE0IHRoZXkgY2FuJ3QgYmUuXG4gKlxuICogQSBzZWVkIGNhbid0IG5hbWUgYSB1c2VyLiBMb29rdXAgdmFsdWVzIGFyZSByZXNvbHZlZCBhZ2FpbnN0IHRoZSB0YXJnZXQnc1xuICogZXh0ZXJuYWxJZCBhbmQgdGhhdCBvbmx5IHdvcmtzIGZvciBvYmplY3RzIGluIHRoZSBhcHAncyBvd24gZ3JhcGgsIHNvXG4gKiBgb3duZXJfaWQ6ICdEZXYgQWRtaW4nYCB3b3VsZCBzdG9yZSB0aGUgbGl0ZXJhbCBzdHJpbmcgcmF0aGVyIHRoYW4gYW4gaWQgKHZlcmlmaWVkOlxuICogYSBgc3lzX3VzZXJfcG9zaXRpb25gIHJvdyBzZWVkZWQgdGhhdCB3YXkgaXMgdW5tYXRjaGFibGUgYnkgdGhlIHJlYWwgdXNlclxuICogaWQpLCBhbmQgYGNlbFxcYG9zLnVzZXIuaWRcXGBgIGluc2lkZSBhIHNlZWQgZXZhbHVhdGVzIHRvIG5vdGhpbmcuIFRoZSBpZCBkb2VzXG4gKiBub3QgZXhpc3QgdW50aWwgZmlyc3QgYm9vdC5cbiAqXG4gKiBUaGUgUExBVEZPUk0gZG9lcyBpdCwgYXQgdGhlIG9ubHkgbW9tZW50IGl0IGNhbjogd2hlbiB0aGUgc2VlZCBzZXR0bGVzLFxuICogYEBvYmplY3RzdGFjay9wbHVnaW4tc2VjdXJpdHlgIHJlLXJ1bnMgaXRzIHNlZWQtb3duZXJzaGlwIGNsYWltIG9uXG4gKiBgYXBwOnNlZWRlZGAgYW5kIGhhbmRzIGV2ZXJ5IG93bmVybGVzcyByb3cgb2YgZXZlcnkgb2JqZWN0IGNhcnJ5aW5nXG4gKiBgb3duZXJfaWRgIHRvIHRoZSBmaXJzdCBwbGF0Zm9ybSBhZG1pbmlzdHJhdG9yIChvYmplY3RzdGFjayMxNzg3Miwgc2hpcHBlZCBpblxuICogMTcuNi4wKS4gTm8gSG90Q1JNIGZsb3cgaXMgaW52b2x2ZWQuIFRoZSBgZGVtb19ib290c3RyYXBgIHN3ZWVwIHRoYXQgdXNlZFxuICogdG8gZG8gdGhpcyBldmVyeSB0ZW4gbWludXRlcyB3YXMgcmV0aXJlZCBvbmNlIGEgZnJlc2ggYm9vdCBtZWFzdXJlZCB0aGF0XG4gKiBjbGFpbSBsZWF2aW5nIGFsbCB0d2VsdmUgc2VlZGVkIG93bmVyLXNjb3BlZCBvYmplY3RzIGF0IHplcm8gb3duZXJsZXNzIHJvd3NcbiAqIHdpdGggdGhlIHN3ZWVwIGRpc2FibGVkICgjMTg5MikuXG4gKlxuICogYG93bmVyX2lkYCBpcyB0aGUgYXBwJ3MgT05FIG93bmVyc2hpcCBjb2x1bW4gKCM1NDggcmV0aXJlZCB0aGUgYXBwLWF1dGhvcmVkXG4gKiBgb3duZXJgIGxvb2t1cCB0aGF0IHVzZWQgdG8gc2l0IGJlc2lkZSBpdCBcdTIwMTQgdGhlICM2MjIgc3BsaXQpLiBTZWVkIHdyaXRlcyBydW5cbiAqIHVuZGVyIGB7IGlzU3lzdGVtOiB0cnVlIH1gLCB3aGljaCBzaG9ydC1jaXJjdWl0cyB0aGUgc2VjdXJpdHkgbWlkZGxld2FyZSwgc29cbiAqIGl0cyBpbnNlcnQtdGltZSBhdXRvLXN0YW1wIG9mIGBvd25lcl9pZGAgbmV2ZXIgZmlyZXMgXHUyMDE0IFwic2VlZHMgZWl0aGVyIGRlY2xhcmVcbiAqIHRob3NlIGZpZWxkcyBleHBsaWNpdGx5IHBlciByZWNvcmRcIiBcdTIwMTQgYW5kIHBlciB0aGUgcGFyYWdyYXBoIGFib3ZlIHRoZXNlIHNlZWRzXG4gKiBjYW5ub3QgZGVjbGFyZSBpdC4gU28gYSBzZWVkZWQgcm93IHJlYWNoZXMgdGhlIGRhdGFiYXNlIG93bmVkIGJ5IG5vYm9keVxuICogKGBvd25lcl9pZGAgbnVsbCkgdW50aWwgdGhhdCBjbGFpbSBydW5zLiBOb3RoaW5nIGhlcmUgc2hvdWxkIGdyb3cgYW5cbiAqIGBvd25lcl9pZGAgc2VlZCB2YWx1ZSB0byBwYXBlciBvdmVyIHRoYXQ6IHRoZSBwbGF0Zm9ybSBjbGFpbSBpcyB0aGVcbiAqIG1lY2hhbmlzbS5cbiAqL1xuXG4vKipcbiAqIEFsbCBDUk0gc2VlZCBkYXRhc2V0cywgaW4gUkVQTEFZIE9SREVSIFx1MjAxNCB0aGUgQVJUSUZBQ1QncyB3aG9sZSBzZWVkIHVuaW9uLlxuICpcbiAqIFRoaXMgbGlzdCBhc3NlbWJsZXMgaGVyZSByYXRoZXIgdGhhbiBpbiBhIHBhY2thZ2UgYmFycmVsIGZvciB0d28gcmVhc29ucyxcbiAqIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBiaW5kaW5nIG9uZS4gSXQgbmFtZXMgcm93cyBmcm9tIGFsbCBmb3VyIHBhY2thZ2VzLCBhbmRcbiAqIG5vIGBzcmMvYCBmaWxlIG1heSByZWFjaCBzaWRld2F5cyBpbnRvIGFub3RoZXIgcGFja2FnZSAocGxhbiBpdGVtIDcpLiBBbmRcbiAqIHRoZSBvcmRlciBpcyBsb2FkLWJlYXJpbmcgXHUyMDE0IHJvd3MgcmVzb2x2ZSB0aGVpciBsb29rdXBzIGFnYWluc3Qgcm93cyBzZWVkZWRcbiAqIGVhcmxpZXIsIGFuZCB0aGUgb3JkZXIgaW50ZXJsZWF2ZXMgdGhlIHBhY2thZ2VzIChwcm9kdWN0cyBiZXR3ZWVuXG4gKiBvcHBvcnR1bml0aWVzIGFuZCB0YXNrcywgY29udHJhY3RzIGFmdGVyIGNhbXBhaWduIG1lbWJlcnMpLCBzbyBpdCBpcyBub3RcbiAqIHJlY292ZXJhYmxlIGJ5IGNvbmNhdGVuYXRpbmcgZm91ciBwZXItcGFja2FnZSBsaXN0cyBpbiBhbnkgcGFja2FnZSBvcmRlci5cbiAqIEl0IGlzIGV4YWN0bHkgdGhlIG9yZGVyIGBDcm1TZWVkRGF0YWAgaGFzIGFsd2F5cyBoYWQuIEFib3V0IHRlbiBzdWl0ZXMgcmVhZFxuICogdGhpcyB1bmlvbjsge0BsaW5rIHNlZWREYXRhRm9yfSBpcyB3aGF0IHRoZSB0d28gcGFja2FnZSBzdGFja3MgcmVnaXN0ZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBDcm1TZWVkRGF0YSA9IFtcbiAgYWNjb3VudHMsXG4gIGNvbnRhY3RzLFxuICBsZWFkcyxcbiAgb3Bwb3J0dW5pdGllcyxcbiAgcHJvZHVjdHMsXG4gIG9wcG9ydHVuaXR5TGluZUl0ZW1zLFxuICB0YXNrcyxcbiAgY2FzZXMsXG4gIC8vIEV2ZW50cyBjb21lIGFmdGVyIHRoZSBmaXZlIG9iamVjdHMgdGhlaXIgYHJlbGF0ZWRfdG9fKmAgbG9va3VwcyByZXNvbHZlXG4gIC8vIGFnYWluc3QgKGFjY291bnRzLCBjb250YWN0cywgbGVhZHMsIG9wcG9ydHVuaXRpZXMsIGNhc2VzKTsgdGhlIGF0dGVuZGVlXG4gIC8vIGp1bmN0aW9ucyBjb21lIGFmdGVyIHRoZSBldmVudHMgdGhleSBoYW5nIG9mZi5cbiAgZXZlbnRzLFxuICBldmVudEF0dGVuZGVlc0Zyb21Db250YWN0cyxcbiAgZXZlbnRBdHRlbmRlZXNGcm9tTGVhZHMsXG4gIGxlYWRJbnRlcmFjdGlvblBvaW50ZXJzLFxuICBjYW1wYWlnbnMsXG4gIGNhbXBhaWduTWVtYmVyc0Zyb21MZWFkcyxcbiAgY2FtcGFpZ25NZW1iZXJzRnJvbUNvbnRhY3RzLFxuICBjb250cmFjdHMsXG4gIHF1b3RlcyxcbiAgcXVvdGVMaW5lSXRlbXMsXG4gIGZvcmVjYXN0cyxcbiAga25vd2xlZGdlQXJ0aWNsZXMsXG5dO1xuXG4vKipcbiAqIFRoZSBzZWVkIGRhdGFzZXRzIGEgU2FhUyB0ZW5hbnQgZ2V0czogdGhlIHByb2R1Y3QgQ0FUQUxPR1VFLCBhbmQgbm90aGluZyBlbHNlLlxuICpcbiAqIE1haW50YWluZXIgcnVsaW5nLCAyMDI2LTA4LTI3IChvYmplY3RzdGFjayMxMjcwMSwgcXVvdGVkIHVudHJhbnNsYXRlZCk6XG4gKiBcdTMwMENcdTZCQ0ZcdTRFMkFcdTc5REZcdTYyMzdcdTVFOTRcdThCRTVcdTU0MDRcdTgxRUFcdTRGN0ZcdTc1MjhcdTU0MDRcdTgxRUFcdTc2ODRcdTY1NzBcdTYzNkVcdTU0MjdcdTMwMEQgXHUyMDE0IGV2ZXJ5IHRlbmFudCB1c2VzIGl0cyBvd24gZGF0YSwgdGhlXG4gKiBwcm9kdWN0IGNhdGFsb2d1ZSBpbmNsdWRlZDsgYW5kIFx1MzAwQ1x1NzlDRFx1NUI1MFx1NEU1Rlx1NEUwRFx1NUU5NFx1OEJFNVx1NjYyRlx1NTE2OFx1NUM0MFx1NzY4NFx1NTQ0MFx1RkYwQ1x1NTZFMFx1NEUzQVx1NzlDRFx1NUI1MFx1NjU3MFx1NjM2RVx1NEUwRFx1NTQwQ1x1NzY4NFx1NUJBMlx1NjIzN1xuICogXHU5MEZEXHU2NjJGXHU4OTgxXHU2NTM5XHU3Njg0XHU1NDQwXHVGRjBDXHU1M0VBXHU2NjJGXHU1M0MyXHU4MDAzXHU1NDQwXHVGRjBDXHU3OURGXHU2MjM3XHU4OTgxXHU4MUVBXHU1REYxXHU1MjIwXHU5NjY0XHU1NDQwXHUzMDBEIFx1MjAxNCBhIHNlZWQgaXMgYSBwZXItdGVuYW50XG4gKiBSRUZFUkVOQ0UgY29weSB0aGUgdGVuYW50IGVkaXRzIGFuZCBkZWxldGVzLlxuICpcbiAqIFRoZSBwbGF0Zm9ybSBhbHJlYWR5IHJlcGxheXMgcGVyIHRlbmFudDogYEBvYmplY3RzdGFjay9ydW50aW1lYCdzXG4gKiBgc2VlZC1yZXBsYXllcmAgcmVwbGF5cyB0aGUgcmVnaXN0ZXJlZCBkYXRhc2V0IHVuaW9uIGludG8gZWFjaCBuZXdseSBmb3VuZGVkXG4gKiBvcmdhbml6YXRpb24gc3RhbXBlZCB3aXRoIHRoYXQgb3JnYW5pemF0aW9uJ3MgaWQuIFdoYXQgaXQgaGFzIG5vIG5vdGlvbiBvZiBpc1xuICogV0hJQ0ggZmFtaWxpZXMgdG8gcmVwbGF5IFx1MjAxNCBpdCBhbHdheXMgcmVwbGF5cyB0aGUgd2hvbGUgdW5pb24gXHUyMDE0IHNvIHRoZVxuICogc2VsZWN0aW9uIGlzIG1hZGUgSEVSRSwgb25jZSwgYXQgY29tcG9zaXRpb24gdGltZS4gVGhhdCBpcyBhbHNvIHRoZSBzaGFwZSB0aGVcbiAqIHJ1bGluZyB3YW50czogdW5pZm9ybSBmb3IgZXZlcnkgdGVuYW50LCB3aXRoIG5vIHBlci10ZW5hbnQgb3B0LWluIG1lY2hhbmlzbVxuICogdG8gYXV0aG9yLCBtaXMtc2V0LCBvciBzdXBwb3J0LlxuICpcbiAqIFdoeSB0aGUgY2F0YWxvZ3VlIGFuZCBvbmx5IHRoZSBjYXRhbG9ndWU6XG4gKlxuICogIC0gQSBjYXRhbG9ndWUgaXMgdGhlIG9uZSBmYW1pbHkgdGhhdCBpcyBnZW51aW5lbHkgYSBzdGFydGluZyBwb2ludC4gQSBuZXdcbiAqICAgIHRlbmFudCBuZWVkcyBwcmljZWFibGUgcHJvZHVjdHMgYmVmb3JlIHRoZXkgY2FuIHF1b3RlIGFueXRoaW5nLCBhbmQgdGhlXG4gKiAgICByb3dzIGFyZSB0aGVpcnMgdG8gcmVuYW1lLCByZS1wcmljZSBhbmQgZGVsZXRlLlxuICogIC0gYHNhbGVzYCAvIGBzZXJ2aWNlYCAvIGBtYXJrZXRpbmdgIC8gYHJldmVudWVgIGFyZSBTVE9SWVRFTExJTkc6IEFjbWVcbiAqICAgIENvcnBvcmF0aW9uJ3MgcGlwZWxpbmUsIG5pbmUgZXNjYWxhdGVkIGNhc2VzLCBhIGZpbmlzaGVkIGNhbXBhaWduLiBMYW5kaW5nXG4gKiAgICB0aG9zZSBpbiBhIHBheWluZyB0ZW5hbnQncyBvcmcgaXMgbm90IGEgaGVscGZ1bCBoZWFkIHN0YXJ0LCBpdCBpcyBzb21lb25lXG4gKiAgICBlbHNlJ3MgZGF0YSBpbiB0aGVpciBDUk0uXG4gKiAgLSBJdCBpcyBhbHNvIHRoZSBmYW1pbHkgd2l0aCBubyBvdXRnb2luZyByZWZlcmVuY2VzLCBzbyB0aGUgc2hyaW5rIGNhbm5vdFxuICogICAgc3RyYW5kIGEgbG9va3VwOiBgc3JjL3JldmVudWUvZGF0YS9jYXRhbG9nLnNlZWQudHNgIHJlc29sdmVzIG5vdGhpbmcgYWdhaW5zdFxuICogICAgYW5vdGhlciBvYmplY3QsIHdoaWxlIGV2ZXJ5IG90aGVyIGZhbWlseSBwb2ludHMgYXQgYWNjb3VudHMsIGNvbnRhY3RzIG9yIHByb2R1Y3RzXG4gKiAgICBieSBuYXR1cmFsIGtleS5cbiAqXG4gKiBcdTI2RDQgTm90IGEgcGxhY2UgdG8gZ3JvdyBhIFwic3RhcnRlciBkYXRhXCIgYnVuZGxlLiBBIGZhbWlseSBhZGRlZCBoZXJlIHNoaXBzXG4gKiBpbnRvIGV2ZXJ5IHRlbmFudCBvZiBldmVyeSBTYWFTIGRlcGxveW1lbnQ7IHRoZSBiYXIgaXMgXCJhIHRlbmFudCBjYW5ub3RcbiAqIG9wZXJhdGUgd2l0aG91dCBpdFwiLCBub3QgXCJpdCBsb29rcyBuaWNlIG9uIGRheSBvbmVcIi5cbiAqL1xuZXhwb3J0IGNvbnN0IFNhYXNUZW5hbnRTZWVkRGF0YSA9IFtwcm9kdWN0c107XG5cbi8qKlxuICogVGhlIHNlZWQgZmFtaWxpZXMgb2YgdGhlIFNFUlZJQ0UgcGFja2FnZSBcdTIwMTQgdGhlIHJvd3Mgd2hvc2Ugb2JqZWN0IGl0IG93bnMuXG4gKlxuICogXHUyNkEwXHVGRTBGIEEgc2VlZCBmYW1pbHkgaXMgUkVHSVNURVJFRCBCWSBUSEUgUEFDS0FHRSBUSEFUIE9XTlMgSVRTIE9CSkVDVC4gTmFtZWRcbiAqIGhlcmUsIGJlc2lkZSB0aGUgcmVwbGF5IG9yZGVyIGl0IGlzIGN1dCBvdXQgb2YsIHNvIHRoZSB0d28gY2Fubm90IGRyaWZ0XG4gKiBhcGFydDogdGhlIHNwbGl0IGlzIGEgcHJvcGVydHkgb2Yge0BsaW5rIENybVNlZWREYXRhfS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNlcnZpY2VTZWVkRGF0YSA9IFtjYXNlcywga25vd2xlZGdlQXJ0aWNsZXNdO1xuXG4vKiogRXZlcnl0aGluZyBlbHNlIFx1MjAxNCB0aGUgYXBwIHBhY2thZ2UncyBvd24gZmFtaWxpZXMsIGluIHtAbGluayBDcm1TZWVkRGF0YX0gb3JkZXIuICovXG5leHBvcnQgY29uc3QgQXBwU2VlZERhdGEgPSBDcm1TZWVkRGF0YS5maWx0ZXIoKGZhbWlseSkgPT4gIVNlcnZpY2VTZWVkRGF0YS5pbmNsdWRlcyhmYW1pbHkpKTtcblxuLyoqXG4gKiBUaGUgc2VlZCBkYXRhc2V0cyBlYWNoIHBhY2thZ2UgcmVnaXN0ZXJzIHVuZGVyIGEgY29tcG9zaXRpb24uXG4gKlxuICogVGhlIFNhYVMgc2VsZWN0aW9uIGlzIHN0aWxsIG1hZGUgb25jZSwgaGVyZTogYSB0ZW5hbnQgZ2V0cyB0aGUgcHJvZHVjdFxuICogY2F0YWxvZ3VlIGFuZCBub3RoaW5nIGVsc2UsIHNvIHRoZSBzZXJ2aWNlIHBhY2thZ2UgcmVnaXN0ZXJzIG5vIHJvd3MgYXQgYWxsXG4gKiBpbiB0aGF0IHNoYXBlLiBTZWUge0BsaW5rIFNhYXNUZW5hbnRTZWVkRGF0YX0gZm9yIHdoeS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlZWREYXRhRm9yID0gKFxuICBjb21wb3NpdGlvbjogSG90Q3JtQ29tcG9zaXRpb24sXG4pOiB7IGFwcDogdHlwZW9mIENybVNlZWREYXRhOyBzZXJ2aWNlOiB0eXBlb2YgQ3JtU2VlZERhdGEgfSA9PlxuICBjb21wb3NpdGlvbiA9PT0gJ3NhYXMnXG4gICAgPyB7IGFwcDogU2Fhc1RlbmFudFNlZWREYXRhLCBzZXJ2aWNlOiBbXSB9XG4gICAgOiB7IGFwcDogQXBwU2VlZERhdGEsIHNlcnZpY2U6IFNlcnZpY2VTZWVkRGF0YSB9O1xuXG4vLyBcdTI1MDBcdTI1MDBcdTI1MDAgV2hpY2ggU0hBUEUgb2YgSG90Q1JNIHRoaXMgYnVpbGQgYXNzZW1ibGVzICgjMTM2MSkgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG4vL1xuLy8gYGRlZmF1bHRgICh1bnNldCwgb3IgYEhPVENSTV9DT01QT1NJVElPTj1kZWZhdWx0YCkgaXMgdGhlIGNvbW11bml0eSBhcHAgYW5kXG4vLyBpcyBieXRlLWZvci1ieXRlIHdoYXQgaXQgYWx3YXlzIHdhcyBcdTIwMTQgZXZlcnkgZmllbGQgYmVsb3cgdGhhdCBhIGNvbXBvc2l0aW9uXG4vLyB0b3VjaGVzIGZhbGxzIHRocm91Z2ggdG8gdGhlIHNhbWUgdmFsdWUgaXQgaGFkIGJlZm9yZSB0aGlzIGtub2IgZXhpc3RlZC5cbi8vIGBIT1RDUk1fQ09NUE9TSVRJT049c2Fhc2AgYXNzZW1ibGVzIHRoZSBzaGFwZSBhIG11bHRpLW9yZyBvcGVyYXRvciBkZXBsb3lzIG9uXG4vLyB0aGUgZW50ZXJwcmlzZSBydW50aW1lIHVuZGVyIGEgd2FsbGVkIHRlbmFuY3kgcG9zdHVyZTsgYW4gdW5yZWNvZ25pc2VkIHZhbHVlXG4vLyB0aHJvd3MgaGVyZSByYXRoZXIgdGhhbiBxdWlldGx5IGFzc2VtYmxpbmcgdGhlIHdyb25nIGFwcCAoc2VlXG4vLyBgcmVzb2x2ZUNvbXBvc2l0aW9uYCkuXG4vL1xuLy8gVGhlIGtub2IgaXMgcmVzb2x2ZWQgT05DRSwgaGVyZSwgYW5kIGhhbmRlZCB0byB0aGUgcGFja2FnZSBzdGFja3MgYWxyZWFkeVxuLy8gYXBwbGllZC4gSXQgaXMgZGVsaWJlcmF0ZWx5IENPTVBPU0lUSU9OLXRpbWUgYW5kIHVuaWZvcm0uIFRoZSBwbGF0Zm9ybSdzXG4vLyBgc2VlZC1yZXBsYXllcmAgZ2l2ZXMgZXZlcnkgbmV3bHkgZm91bmRlZCBvcmdhbml6YXRpb24gaXRzIG93biBwcml2YXRlIGNvcHlcbi8vIG9mIHRoZSByZWdpc3RlcmVkIGRhdGFzZXQgdW5pb24gKG1haW50YWluZXIgcnVsaW5nIDIwMjYtMDgtMjcsXG4vLyBvYmplY3RzdGFjayMxMjcwMTogXHUzMDBDXHU3OUNEXHU1QjUwXHU0RTVGXHU0RTBEXHU1RTk0XHU4QkU1XHU2NjJGXHU1MTY4XHU1QzQwXHU3Njg0XHU1NDQwIFx1MjAyNlx1NTNFQVx1NjYyRlx1NTNDMlx1ODAwM1x1NTQ0MFx1RkYwQ1x1NzlERlx1NjIzN1x1ODk4MVx1ODFFQVx1NURGMVx1NTIyMFx1OTY2NFx1NTQ0MFx1MzAwRCksXG4vLyBidXQgaXQgaGFzIG5vIHBlci1mYW1pbHkgb3IgcGVyLXRlbmFudCBzZWxlY3Rpb24gYW5kIG5vbmUgaXMgY2hhcnRlcmVkIFx1MjAxNCBzb1xuLy8gV0hBVCBnZXRzIHJlcGxheWVkIGlzIGRlY2lkZWQgb25jZSwgaGVyZSwgZm9yIGV2ZXJ5IHRlbmFudCBhbGlrZS5cbi8vXG4vLyBUd28gdGhpbmdzIGNoYW5nZSwgYW5kIG5vdGhpbmcgZWxzZS4gVGhlcmUgaXMgbm8gcnVudGltZSBicmFuY2ggYW55d2hlcmUgaW5cbi8vIGBzcmMvYCwgYW5kIG5vIGVudGVycHJpc2UgcGFja2FnZSBpcyBpbXBvcnRlZDogYW4gYXJ0aWZhY3QgYnVpbHQgZWl0aGVyIHdheVxuLy8gcnVucyBvbiB0aGUgY29tbXVuaXR5IHJ1bnRpbWUuIEJvdGggc2hhcGVzIHJlZ2lzdGVyIHRoZSBzYW1lIGZsb3dzOiB0aGUgb25lXG4vLyBmbG93IHRoZSBTYWFTIHNoYXBlIHVzZWQgdG8gZHJvcCwgdGhlIGBkZW1vX2Jvb3RzdHJhcGAgb3duZXJzaGlwIHN3ZWVwLCBpc1xuLy8gcmV0aXJlZCBmcm9tIHRoZSBhcHAgKCMxODkyKSBcdTIwMTQgdGhlIHBsYXRmb3JtIGNsYWltcyBzZWVkZWQgcm93cyBpdHNlbGYuXG4vL1xuLy8gIDEuIGBkYXRhYCBcdTIwMTQgdGhlIGNhdGFsb2d1ZSBmYW1pbHkgb25seSwgc28gdGhlIHNlcnZpY2UgcGFja2FnZSByZWdpc3RlcnNcbi8vICAgICBub25lLiBTZWUgYFNhYXNUZW5hbnRTZWVkRGF0YWAuXG4vLyAgICAgYGRlbW8tc3RhZmZpbmdgIG5lZWRzIG5vIGV4Y2x1c2lvbiBcdTIwMTQgYHNyYy9zYWxlcy9zaGFyaW5nL2RlbW8tc3RhZmZpbmcudHNgIGlzXG4vLyAgICAgZGVsaWJlcmF0ZWx5IG5vdCBleHBvcnRlZCBmcm9tIGBzcmMvc2FsZXMvc2hhcmluZy9pbmRleC5qc2AgYW5kIG5vdCByZWdpc3RlcmVkXG4vLyAgICAgaW4gYW55IGNvbXBvc2l0aW9uICgjNjQwLCBwaW5uZWQgYnkgYHRlc3QvZGVtby1zdGFmZmluZy50ZXN0LnRzYCkuXG4vLyAgMi4gYHBlcm1pc3Npb25zYCBcdTIwMTQgYHN5c3RlbV9hZG1pbmAgaXMgcmVwbGFjZWQgYnkgYHRlbmFudF9hZG1pbmAsIHdoaWNoIGhvbGRzXG4vLyAgICAgb3JnLXNjb3BlZCBgbWFuYWdlX29yZ191c2Vyc2AgaW5zdGVhZCBvZiBwbGF0Zm9ybS1zY29wZSBgbWFuYWdlX3VzZXJzYC5cbi8vICAgICBSZWFkIGBzcmMvc2FsZXMvcHJvZmlsZXMvdGVuYW50LWFkbWluLnByb2ZpbGUudHNgIGZvciB0aGUgZnVsbCBhdWRpdCwgaW5jbHVkaW5nXG4vLyAgICAgd2hhdCBgdmlld19hbGxfZGF0YWAgLyBgbW9kaWZ5X2FsbF9kYXRhYCBtZWFuIHVuZGVyIHRoZSB3YWxsLlxuY29uc3QgY29tcG9zaXRpb24gPSByZXNvbHZlQ29tcG9zaXRpb24oKTtcbmNvbnN0IGlzU2FhcyA9IGNvbXBvc2l0aW9uID09PSAnc2Fhcyc7XG5jb25zdCBzZWVkRGF0YSA9IHNlZWREYXRhRm9yKGNvbXBvc2l0aW9uKTtcblxuLyoqXG4gKiBQZXJtaXNzaW9uIHNldHMgdGhpcyBjb21wb3NpdGlvbiByZWdpc3RlcnMuIEZpbHRlcmVkIGJ5IElERU5USVRZLCBub3QgYnkgbmFtZVxuICogc3RyaW5nLCBzbyBhIHJlbmFtZSBjYW5ub3Qgc2lsZW50bHkgdHVybiB0aGUgc3Vic3RpdHV0aW9uIGludG8gYSBuby1vcC5cbiAqL1xuY29uc3QgY29tcG9zaXRpb25QZXJtaXNzaW9ucyA9IGlzU2Fhc1xuICA/IFsuLi5PYmplY3QudmFsdWVzKGFsbFByb2ZpbGVzKS5maWx0ZXIoKHNldCkgPT4gc2V0ICE9PSBTeXN0ZW1BZG1pblByb2ZpbGUpLCBUZW5hbnRBZG1pblByb2ZpbGVdXG4gIDogT2JqZWN0LnZhbHVlcyhhbGxQcm9maWxlcyk7XG5cbi8qIFx1MjUwMFx1MjUwMFx1MjUwMCBUaGUgdHdvIHBhY2thZ2Ugc3RhY2tzIGBvYmplY3RzdGFjay5jb25maWcudHNgIGNvbXBvc2VzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMCAqL1xuXG4vKiogYGFwcC5vYmplY3RzdGFjay5ob3Rjcm0uc2VydmljZWAgXHUyMDE0IHNlZSBgc3JjL3NlcnZpY2UvaW5kZXgudHNgLiAqL1xuZXhwb3J0IGNvbnN0IHNlcnZpY2VTdGFjayA9IGNyZWF0ZUhvdENybVNlcnZpY2VTdGFjayh7IGRhdGE6IHNlZWREYXRhLnNlcnZpY2UgfSk7XG5cbi8qKlxuICogYGFwcC5vYmplY3RzdGFjay5ob3Rjcm1gIFx1MjAxNCBzZWUgYHNyYy9zYWxlcy9pbmRleC50c2AsIGluY2x1ZGluZyB3aHkgaXQgaXNcbiAqIGhhbmRlZCBgYXJ0aWZhY3RPYmplY3RzYDogaXRzIHBlcm1pc3Npb24gc2V0cyBzdGF5IHdob2xlIGhlcmUgYW5kIGdyYW50IG9uXG4gKiB0aGUgc2VydmljZSBwYWNrYWdlJ3Mgb2JqZWN0cyB0b28uXG4gKi9cbmV4cG9ydCBjb25zdCBhcHBTdGFjayA9IGNyZWF0ZUhvdENybUFwcFN0YWNrKFxuICB7XG4gICAgb2JqZWN0czogYXBwT2JqZWN0cyxcbiAgICBhY3Rpb25zOiBhcHBBY3Rpb25zLFxuICAgIGRhc2hib2FyZHM6IGFwcERhc2hib2FyZHMsXG4gICAgZGF0YXNldHM6IGFwcERhdGFzZXRzLFxuICAgIHJlcG9ydHM6IGFwcFJlcG9ydHMsXG4gICAgLy8gUmV1c2FibGUgaW1wb3J0IHByb2plY3Rpb25zICgjNjAzKS4gUmVmZXJlbmNlZCBieSBuYW1lIGZyb20gdGhlIGltcG9ydFxuICAgIC8vIGVuZHBvaW50IFx1MjAxNCBgbWFwcGluZ05hbWU6ICdjcm1fYWNjb3VudF9pbXBvcnQnYCBcdTIwMTQgc28gYSBjdXN0b21lcidzIG93blxuICAgIC8vIHNwcmVhZHNoZWV0IGxvYWRzIHdpdGhvdXQgcGVyLWNvbHVtbiBtYXBwaW5nIGJ5IGhhbmQuIFRlbXBsYXRlczpcbiAgICAvLyBgYXNzZXRzL2ltcG9ydC10ZW1wbGF0ZXMvYC5cbiAgICBtYXBwaW5nczogYXBwTWFwcGluZ3MsXG4gICAgZmxvd3M6IGFwcEZsb3dzLFxuICAgIHNraWxsczogYXBwU2tpbGxzLFxuICAgIHBlcm1pc3Npb25zOiBjb21wb3NpdGlvblBlcm1pc3Npb25zLFxuICAgIGFwcHM6IGFwcEFwcHMsXG4gICAgdmlld3M6IGFwcFZpZXdzLFxuICAgIHBhZ2VzOiBhcHBQYWdlcyxcbiAgICAvLyBBcHByb3ZhbHMgYXJlIG1vZGVsZWQgYXMgYHJlY29yZF9jaGFuZ2VgIGZsb3dzIHdpdGggYGFwcHJvdmFsYCBub2Rlc1xuICAgIC8vIChBRFItMDAxOSk7IHNlZSBzcmMvc2FsZXMvZmxvd3Mvb3Bwb3J0dW5pdHktYXBwcm92YWwuZmxvdy50cy4gVGhlXG4gICAgLy8gc3RhbmRhbG9uZSBgYXBwcm92YWxzYCBzdGFjayBmaWVsZCB3YXMgcmVtb3ZlZCBpbiBPYmplY3RTdGFjayA3LjQuXG4gICAgLy8gTm8gYGFuYWx5dGljc0N1YmVzYDogZGF0YXNldHMgKEFEUi0wMDIxKSBhcmUgdGhlIHNlbWFudGljIGxheWVyIFx1MjAxNCB0aGVcbiAgICAvLyBhbmFseXRpY3Mgc2VydmljZSBjb21waWxlcyBlYWNoIGRhdGFzZXQgaW50byBpdHMgY3ViZSBpbnRlcm5hbGx5LCBhbmQgYVxuICAgIC8vIHNlY29uZCBoYW5kLXdyaXR0ZW4gY3ViZSBsYXllciBvbmx5IGR1cGxpY2F0ZXMgYW5kIGRyaWZ0cy5cblxuICAgIGhvb2tzOiBhcHBIb29rcyxcblxuICAgIGRhdGE6IHNlZWREYXRhLmFwcCxcblxuICAgIHRyYW5zbGF0aW9uczogYXBwVHJhbnNsYXRpb25zLFxuXG4gICAgLy8gVGhlIGxvY2FsaXphYmxlIGNvbnRlbnQgcGF0aCBmb3IgYG5vdGlmeWAgKCM5MjA1KS4gQSBub2RlIG5hbWVzIGEgdGVtcGxhdGVcbiAgICAvLyBhbmQgc3VwcGxpZXMgaXRzIGB0ZW1wbGF0ZURhdGFgOyB0aGUgZGVsaXZlcnkgcGF0aCByZXNvbHZlc1xuICAgIC8vIGAobmFtZSwgbG9jYWxlKWAgYWdhaW5zdCB0aGVzZSByb3dzIFBFUiBSRUNJUElFTlQsIGFmdGVyIGZhbi1vdXQgXHUyMDE0IHRoZVxuICAgIC8vIHJlY2lwaWVudCdzIG93biBgc3lzX3VzZXIubG9jYWxlYCB3aGVuIHNldCwgZWxzZSBgaTE4bi5kZWZhdWx0TG9jYWxlYCBcdTIwMTRcbiAgICAvLyBzbyB0d28gcGVvcGxlIG9uIG9uZSBub3RpZmljYXRpb24gY2FuIHJlYWQgaXQgaW4gdHdvIGxhbmd1YWdlcy5cbiAgICBlbWFpbFRlbXBsYXRlczogYXBwRW1haWxUZW1wbGF0ZXMsXG5cbiAgICBzaGFyaW5nUnVsZXM6IGFwcFNoYXJpbmdSdWxlcyxcbiAgICAvLyBBRFItMDA5MCBEMzogcG9zaXRpb25zIGFyZSBmbGF0IGNhcGFiaWxpdHktZGlzdHJpYnV0aW9uIGdyb3VwcyBcdTIwMTQgdGhlIHYxXG4gICAgLy8gcm9sZSBoaWVyYXJjaHkncyBwYXJlbnQgbGlua3MgYXJlIGdvbmUgKGhpZXJhcmNoeSBiZWxvbmdzIHRvIHRoZVxuICAgIC8vIGJ1c2luZXNzLXVuaXQgdHJlZSwgd2hpY2ggdGhpcyBhcHAgZG9lcyBub3QgbW9kZWwpLlxuICAgIHBvc2l0aW9uczogQ3JtUG9zaXRpb25zLFxuICB9LFxuICB7IGFydGlmYWN0T2JqZWN0czogKHNlcnZpY2VTdGFjay5vYmplY3RzID8/IFtdKS5tYXAoKG9iamVjdCkgPT4g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LGFBQWE7QUFBQSxNQUNYLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLGFBQWEsRUFBRSxZQUFZLEtBQUs7QUFBQSxNQUNoQztBQUFBLE1BQ0EsU0FBUyxDQUFDLGVBQWUsV0FBVyxlQUFlLFlBQVksZ0JBQWdCLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BV3pGLFFBQVE7QUFBQSxRQUNOLEVBQUUsT0FBTyxVQUFVLFVBQVUsVUFBVSxPQUFPLENBQUMsWUFBWSxRQUFRLEVBQUU7QUFBQSxRQUNyRSxFQUFFLE9BQU8sWUFBWSxVQUFVLE1BQU0sT0FBTyxDQUFDLFFBQVEsVUFBVSxFQUFFO0FBQUEsTUFDbkU7QUFBQSxNQUNBLE1BQU0sQ0FBQyxFQUFFLE9BQU8sZ0JBQWdCLE9BQU8sTUFBTSxDQUFDO0FBQUEsSUFDaEQ7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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Q0UsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sY0FBYztBQUFBLElBQ2hCO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sY0FBYztBQUFBLElBQ2hCO0FBQUEsRUFDRjtBQUFBO0FBQUEsRUFHQSxTQUFTO0FBQUEsSUFDUDtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBSVY7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxZQUNWLE9BQU87QUFBQSxZQUNQLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQXlCVixTQUFTO0FBQUEsY0FDUDtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBMkdBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixJQUFJO0FBQUEsVUFDSixPQUFPO0FBQUEsVUFDUCxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUtWLFVBQVU7QUFBQSxZQUNWLFNBQVNDO0FBQUEsWUFDVCxPQUFPO0FBQUEsY0FDTCxJQUFJO0FBQUEsY0FDSixTQUFTO0FBQUEsY0FDVCxTQUFTO0FBQUEsY0FDVCxTQUFTO0FBQUEsWUFDWDtBQUFBLFlBQ0EsTUFBTTtBQUFBLGNBQ0osSUFDRTtBQUFBLGNBS0YsU0FDRTtBQUFBLGNBR0YsU0FDRTtBQUFBLGNBS0YsU0FDRTtBQUFBLFlBTUo7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQU9WLFVBQVU7QUFBQSxZQUNWLFNBQVNBO0FBQUEsWUFDVCxPQUFPO0FBQUEsY0FDTCxJQUFJO0FBQUEsY0FDSixTQUFTO0FBQUEsY0FDVCxTQUFTO0FBQUEsY0FDVCxTQUFTO0FBQUEsWUFDWDtBQUFBLFlBQ0EsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNBSUosSUFDRTtBQUFBLGNBS0YsU0FDRTtBQUFBLGNBSUYsU0FDRTtBQUFBLGNBS0YsU0FDRTtBQUFBLFlBTUo7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBSUE7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxZQUNWLFFBQVEsQ0FBQyxVQUFVLFVBQVUsZUFBZSxZQUFZLFNBQVMsT0FBTztBQUFBLFVBQzFFO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxZQUNWLGFBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUliLFFBQVE7QUFBQSxjQUNOLEVBQUUsT0FBTyxPQUFPLE9BQU8sTUFBTTtBQUFBLGNBQzdCLEVBQUUsT0FBTyxhQUFhLE9BQU8sWUFBWTtBQUFBLGNBQ3pDLEVBQUUsT0FBTyxhQUFhLE9BQU8sWUFBWTtBQUFBLGNBQ3pDLEVBQUUsT0FBTyxhQUFhLE9BQU8sWUFBWTtBQUFBLGNBQ3pDLEVBQUUsT0FBTyxlQUFlLE9BQU8sY0FBYztBQUFBLFlBQy9DO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBRUE7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFlBQVk7QUFBQSxRQUNWO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixJQUFJO0FBQUEsVUFDSixPQUFPO0FBQUEsVUFDUCxZQUFZO0FBQUE7QUFBQTtBQUFBLFlBR1YsVUFBVTtBQUFBLFlBQ1YsVUFBVTtBQUFBLFlBQ1YsT0FBTztBQUFBLGNBQ0w7QUFBQSxnQkFDRSxPQUFPO0FBQUEsZ0JBQ1AsTUFBTTtBQUFBLGdCQUNOLFVBQVU7QUFBQSxrQkFDUjtBQUFBLG9CQUNFLE1BQU07QUFBQSxvQkFDTixJQUFJO0FBQUEsb0JBQ0osT0FBTztBQUFBLG9CQUNQLFlBQVk7QUFBQSxzQkFDVixTQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHNCQW1EVCxVQUFVO0FBQUEsd0JBQ1IsRUFBRSxPQUFPLFdBQVc7QUFBQSx3QkFDcEIsRUFBRSxPQUFPLGVBQWU7QUFBQSx3QkFDeEIsRUFBRSxPQUFPLGdCQUFnQixXQUFXLE1BQU07QUFBQTtBQUFBO0FBQUEsd0JBRzFDLEVBQUUsT0FBTyxjQUFjO0FBQUEsd0JBQ3ZCLEVBQUUsT0FBTyxnQkFBZ0I7QUFBQSx3QkFDekIsRUFBRSxPQUFPLGFBQWE7QUFBQSx3QkFDdEIsRUFBRSxPQUFPLFdBQVcsV0FBVyxNQUFNO0FBQUEsd0JBQ3JDLEVBQUUsT0FBTyxhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsd0JBT3RCLEVBQUUsT0FBTyxhQUFhO0FBQUE7QUFBQTtBQUFBLHdCQUd0QixFQUFFLE9BQU8sY0FBYyxXQUFXLE1BQU07QUFBQSxzQkFDMUM7QUFBQSxvQkFDRjtBQUFBLGtCQUNGO0FBQUEsZ0JBQ0Y7QUFBQSxjQUNGO0FBQUEsY0FDQTtBQUFBLGdCQUNFLE9BQU87QUFBQSxnQkFDUCxNQUFNO0FBQUEsZ0JBQ04sVUFBVTtBQUFBLGtCQUNSO0FBQUEsb0JBQ0UsTUFBTTtBQUFBLG9CQUNOLElBQUk7QUFBQSxvQkFDSixPQUFPO0FBQUEsb0JBQ1AsWUFBWTtBQUFBLHNCQUNWLGVBQWU7QUFBQSxzQkFDZixPQUFPO0FBQUEsd0JBQ0w7QUFBQSwwQkFDRSxPQUFPO0FBQUEsMEJBQ1AsTUFBTTtBQUFBLDBCQUNOLFdBQVc7QUFBQSwwQkFDWCxVQUFVO0FBQUEsNEJBQ1I7QUFBQSw4QkFDRSxNQUFNO0FBQUEsOEJBQ04sSUFBSTtBQUFBLDhCQUNKLE9BQU87QUFBQSw4QkFDUCxZQUFZO0FBQUEsZ0NBQ1YsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxnQ0FNWixtQkFBbUI7QUFBQSxnQ0FDbkIsU0FBUyxDQUFDLFdBQVcsVUFBVSxZQUFZLFlBQVksVUFBVTtBQUFBLGdDQUNqRSxNQUFNO0FBQUEsa0NBQ0osRUFBRSxPQUFPLFlBQVksT0FBTyxNQUFNO0FBQUEsZ0NBQ3BDO0FBQUEsZ0NBQ0EsT0FBTztBQUFBLGdDQUNQLE9BQU87QUFBQSxnQ0FDUCxRQUFRLENBQUMsRUFBRSxPQUFPLFVBQVUsVUFBVSxjQUFjLE9BQU8sWUFBWSxDQUFDO0FBQUEsZ0NBQ3hFLGFBQWE7QUFBQSw4QkFDZjtBQUFBLDRCQUNGO0FBQUEsMEJBQ0Y7QUFBQSx3QkFDRjtBQUFBLHNCQUNGO0FBQUEsb0JBQ0Y7QUFBQSxrQkFDRjtBQUFBLGdCQUNGO0FBQUEsY0FDRjtBQUFBLGNBQ0E7QUFBQSxnQkFDRSxPQUFPO0FBQUEsZ0JBQ1AsTUFBTTtBQUFBLGdCQUNOLFVBQVU7QUFBQSxrQkFDUjtBQUFBLG9CQUNFLE1BQU07QUFBQSxvQkFDTixJQUFJO0FBQUEsb0JBQ0osT0FBTztBQUFBLG9CQUNQLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsc0JBaUNWLE9BQU8sQ0FBQyxNQUFNO0FBQUEsc0JBQ2QsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxzQkFNUCxlQUFlO0FBQUEsb0JBQ2pCO0FBQUEsa0JBQ0Y7QUFBQSxnQkFDRjtBQUFBLGNBQ0Y7QUFBQSxjQUNBO0FBQUEsZ0JBQ0UsT0FBTztBQUFBLGdCQUNQLE1BQU07QUFBQSxnQkFDTixVQUFVO0FBQUEsa0JBQ1I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBU0UsTUFBTTtBQUFBLG9CQUNOLElBQUk7QUFBQSxvQkFDSixPQUFPO0FBQUEsb0JBQ1AsWUFBWTtBQUFBLHNCQUNWLE9BQU87QUFBQSxvQkFDVDtBQUFBLGtCQUNGO0FBQUEsZ0JBQ0Y7QUFBQSxjQUNGO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUE7QUFBQSxFQUdBLFdBQVc7QUFBQTtBQUFBLEVBR1gsTUFBTTtBQUFBLElBQ0osV0FBVztBQUFBLElBQ1gsaUJBQWlCO0FBQUEsRUFDbkI7QUFDRjs7O0FDcGlCTyxJQUFNLHdCQUE4QjtBQUFBLEVBQ3pDLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLGFBQWE7QUFBQSxFQUViLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUVSLFVBQVU7QUFBQSxFQUNWLE1BQU07QUFBQSxFQUNOLFdBQVc7QUFBQSxJQUNULEVBQUUsTUFBTSxhQUFhLE1BQU0sVUFBVSxjQUFjLFVBQVU7QUFBQSxFQUMvRDtBQUFBLEVBRUEsU0FBUztBQUFBLElBQ1A7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFlBQVk7QUFBQSxRQUNWO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixJQUFJO0FBQUEsVUFDSixPQUFPO0FBQUEsVUFDUCxZQUFZO0FBQUEsWUFDVixPQUFPO0FBQUE7QUFBQTtBQUFBLFlBR1AsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQXFCVixTQUFTO0FBQUEsY0FDUDtBQUFBLGNBQ0E7QUFBQSxjQUNBO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixJQUFJO0FBQUEsVUFDSixPQUFPO0FBQUEsVUFDUCxZQUFZO0FBQUEsWUFDVixRQUFRLENBQUMsVUFBVSxjQUFjLGVBQWUsb0JBQW9CLFlBQVksYUFBYTtBQUFBLFVBQy9GO0FBQUEsUUFDRjtBQUFBLFFBQ0E7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLE9BQU87QUFBQSxVQUNQLFlBQVk7QUFBQSxZQUNWLGFBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBUWIsUUFBUTtBQUFBLGNBQ04sRUFBRSxPQUFPLGVBQWUsT0FBTyxjQUFjO0FBQUEsY0FDN0MsRUFBRSxPQUFPLGlCQUFpQixPQUFPLGdCQUFnQjtBQUFBLGNBQ2pELEVBQUUsT0FBTyxrQkFBa0IsT0FBTyxpQkFBaUI7QUFBQSxjQUNuRCxFQUFFLE9BQU8sWUFBWSxPQUFPLFdBQVc7QUFBQSxjQUN2QyxFQUFFLE9BQU8sZUFBZSxPQUFPLGNBQWM7QUFBQSxjQUM3QyxFQUFFLE9BQU8sY0FBYyxPQUFPLGFBQWE7QUFBQSxjQUMzQyxFQUFFLE9BQU8sZUFBZSxPQUFPLGNBQWM7QUFBQSxZQUMvQztBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsTUFDUCxZQUFZO0FBQUEsUUFDVjtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sSUFBSTtBQUFBLFVBQ0osWUFBWTtBQUFBO0FBQUE7QUFBQSxZQUdWLFVBQVU7QUFBQSxZQUNWLFVBQVU7QUFBQSxZQUNWLE9BQU87QUFBQSxjQUNMO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0JBSUUsT0FBTztBQUFBLGdCQUNQLE9BQU87QUFBQSxnQkFDUCxVQUFVO0FBQUEsa0JBQ1I7QUFBQSxvQkFDRSxNQUFNO0FBQUEsb0JBQ04sSUFBSTtBQUFBLG9CQUNKLE9BQU87QUFBQSxvQkFDUCxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUEsc0JBSVYsU0FBUztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxzQkEwQ1QsVUFBVTtBQUFBLHdCQUNSLEVBQUUsT0FBTyxRQUFRO0FBQUEsd0JBQ2pCLEVBQUUsT0FBTyxhQUFhO0FBQUEsd0JBQ3RCLEVBQUUsT0FBTyxrQkFBa0IsV0FBVyxNQUFNO0FBQUEsd0JBQzVDLEVBQUUsT0FBTyxZQUFZLFdBQVcsTUFBTTtBQUFBLHdCQUN0QyxFQUFFLE9BQU8sZ0JBQWdCO0FBQUEsd0JBQ3pCLEVBQUUsT0FBTyxpQkFBaUIsV0FBVyxNQUFNO0FBQUEsd0JBQzNDLEVBQUUsT0FBTyxhQUFhLFdBQVcsTUFBTTtBQUFBLHdCQUN2QyxFQUFFLE9BQU8sZUFBZTtBQUFBLHdCQUN4QixFQUFFLE9BQU8sU0FBUyxXQUFXLE1BQU07QUFBQSxzQkFDckM7QUFBQSxvQkFDRjtBQUFBLGtCQUNGO0FBQUEsZ0JBQ0Y7QUFBQSxjQUNGO0FBQUEsY0FDQTtBQUFBLGdCQUNFLE9BQU87QUFBQSxnQkFDUCxPQUFPO0FBQUEsZ0JBQ1AsVUFBVTtBQUFBLGtCQUNSO0FBQUEsb0JBQ0UsTUFBTTtBQUFBLG9CQUNOLElBQUk7QUFBQSxvQkFDSixZQUFZO0FBQUEsc0JBQ1YsT0FBTztBQUFBLHdCQUNMO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDBCQU1FLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsMEJBdUNQLFdBQVc7QUFBQSwwQkFDWCxVQUFVO0FBQUEsNEJBQ1I7QUFBQSw4QkFDRSxNQUFNO0FBQUEsOEJBQ04sSUFBSTtBQUFBLDhCQUNKLFlBQVk7QUFBQSxnQ0FDVixZQUFZO0FBQUEsZ0NBQ1osbUJBQW1CO0FBQUEsZ0NBQ25CLFNBQVMsQ0FBQyxnQkFBZ0IsUUFBUSxVQUFVLGVBQWUsaUJBQWlCO0FBQUEsZ0NBQzVFLE9BQU87QUFBQSw4QkFDVDtBQUFBLDRCQUNGO0FBQUEsMEJBQ0Y7QUFBQSx3QkFDRjtBQUFBLHdCQUNBO0FBQUEsMEJBQ0UsT0FBTztBQUFBLDBCQUNQLFVBQVU7QUFBQSw0QkFDUjtBQUFBLDhCQUNFLE1BQU07QUFBQSw4QkFDTixJQUFJO0FBQUEsOEJBQ0osWUFBWTtBQUFBLGdDQUNWLFlBQVk7QUFBQSxnQ0FDWixtQkFBbUI7QUFBQSxnQ0FDbkIsU0FBUyxDQUFDLGVBQWUsWUFBWSxjQUFjLGFBQWE7QUFBQSxnQ0FDaEUsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZ0NBaUVQLEtBQUs7QUFBQSxrQ0FDSCxRQUFRO0FBQUEsb0NBQ04sUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQ0FTUixRQUFRLENBQUMsRUFBRSxPQUFPLGFBQWEsVUFBVSxVQUFVLE9BQU8sS0FBSyxDQUFDO0FBQUEsa0NBQ2xFO0FBQUEsa0NBQ0EsV0FBVztBQUFBLGdDQUNiO0FBQUEsOEJBQ0Y7QUFBQSw0QkFDRjtBQUFBLDBCQUNGO0FBQUEsd0JBQ0Y7QUFBQSx3QkFDQTtBQUFBLDBCQUNFLE9BQU87QUFBQSwwQkFDUCxVQUFVO0FBQUEsNEJBQ1I7QUFBQSw4QkFDRSxNQUFNO0FBQUEsOEJBQ04sSUFBSTtBQUFBLDhCQUNKLFlBQVk7QUFBQSxnQ0FDVixZQUFZO0FBQUEsZ0NBQ1osbUJBQW1CO0FBQUEsZ0NBQ25CLFNBQVMsQ0FBQyxXQUFXLFVBQVUsWUFBWSxZQUFZLFVBQVU7QUFBQSxnQ0FDakUsUUFBUSxDQUFDLEVBQUUsT0FBTyxVQUFVLFVBQVUsY0FBYyxPQUFPLFlBQVksQ0FBQztBQUFBLGdDQUN4RSxPQUFPO0FBQUEsOEJBQ1Q7QUFBQSw0QkFDRjtBQUFBLDBCQUNGO0FBQUEsd0JBQ0Y7QUFBQSxzQkFDRjtBQUFBLG9CQUNGO0FBQUEsa0JBQ0Y7QUFBQSxnQkFDRjtBQUFBLGNBQ0Y7QUFBQSxjQUNBO0FBQUEsZ0JBQ0UsT0FBTztBQUFBLGdCQUNQLE9BQU87QUFBQSxnQkFDUCxVQUFVO0FBQUEsa0JBQ1I7QUFBQSxvQkFDRSxNQUFNO0FBQUEsb0JBQ04sSUFBSTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBNENKLFlBQVk7QUFBQSxzQkFDVixPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHNCQVlQLGVBQWU7QUFBQSxvQkFDakI7QUFBQSxrQkFDRjtBQUFBLGdCQUNGO0FBQUEsY0FDRjtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsWUFBWTtBQUFBLFFBQ1Y7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBbUNWLFNBQVM7QUFBQSxjQUNQO0FBQUEsZ0JBQ0UsWUFBWTtBQUFBLGdCQUNaLG1CQUFtQjtBQUFBLGdCQUNuQixPQUFPO0FBQUEsY0FDVDtBQUFBLGNBQ0E7QUFBQSxnQkFDRSxZQUFZO0FBQUEsZ0JBQ1osbUJBQW1CO0FBQUEsZ0JBQ25CLE9BQU87QUFBQSxjQUNUO0FBQUEsY0FDQTtBQUFBLGdCQUNFLFlBQVk7QUFBQSxnQkFDWixtQkFBbUI7QUFBQSxnQkFDbkIsT0FBTztBQUFBLGNBQ1Q7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLFdBQVc7QUFBQSxFQUVYLE1BQU07QUFBQSxJQUNKLFdBQVc7QUFBQSxJQUNYLGlCQUFpQjtBQUFBLEVBQ25CO0FBQ0Y7OztBQ3BlTyxJQUFNLG9CQUFvQjtBQUFBLEVBQy9CLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLGFBQ0U7QUFBQSxFQUVGLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUVSLE1BQU07QUFBQSxFQUNOLFNBQVMsQ0FBQztBQUFBLEVBRVYsT0FBTztBQUFBLElBQ0wsUUFBUTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sSUFBSTtBQUFBLE1BQ0osT0FBTztBQUFBLE1BQ1AsWUFBWTtBQUFBLFFBQ1YsT0FBTztBQUFBLFFBQ1AsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFtQ1YsU0FBUyxDQUFDLFlBQVksZUFBZSxrQkFBa0I7QUFBQSxNQUN6RDtBQUFBLElBQ0Y7QUFBQSxJQUVBLFlBQVk7QUFBQSxNQUNWLE1BQU07QUFBQSxNQUNOLElBQUk7QUFBQSxNQUNKLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUE4QlAsWUFBWTtBQUFBLFFBQ1YsTUFBTTtBQUFBLFVBQ0osZUFBZTtBQUFBLFVBQ2YsaUJBQWlCO0FBQUEsVUFDakIsaUJBQWlCO0FBQUEsUUFDbkI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjs7O0FDekdPLElBQU0sdUJBQTZCO0FBQUEsRUFDeEMsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsTUFBTTtBQUFBLEVBQ04sVUFBVTtBQUFBLEVBQ1YsV0FBVztBQUFBO0FBQUE7QUFBQSxFQUdYLFNBQVMsQ0FBQztBQUFBLEVBQ1YsaUJBQWlCO0FBQUEsSUFDZixRQUFRO0FBQUEsSUFDUixZQUFZO0FBQUEsSUFFWixHQUFJO0FBQUEsTUFDRixhQUFhO0FBQUEsUUFDWCxTQUFTO0FBQUEsUUFDVCxRQUFRO0FBQUEsVUFDTixFQUFFLE9BQU8sWUFBWSxXQUFXLEtBQUs7QUFBQSxVQUNyQyxFQUFFLE9BQU8sT0FBTztBQUFBLFVBQ2hCLEVBQUUsT0FBTyxXQUFXO0FBQUEsUUFDdEI7QUFBQSxNQUNGO0FBQUE7QUFBQTtBQUFBLElBR0Y7QUFBQSxJQUVBLFlBQVk7QUFBQSxNQUNWLGlCQUFpQjtBQUFBLE1BQ2pCLHVCQUF1QixDQUFDLE1BQU07QUFBQSxJQUNoQztBQUFBLElBRUEsYUFBYTtBQUFBLE1BQ1gsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsUUFBUTtBQUFBLE1BQ1IsV0FBVztBQUFBLE1BQ1gsZUFBZTtBQUFBLElBQ2pCO0FBQUEsSUFFQSxpQkFBaUI7QUFBQSxFQUNuQjtBQUNGOzs7QUN4Q0EsSUFBTSxtQkFBbUIsQ0FBQyxJQUFZLFlBQW9CLE9BQWEsWUFBbUM7QUFDeEcsUUFBTSxPQUFPLE1BQU0sWUFBWSxPQUFPO0FBR3RDLE1BQUksQ0FBQyxLQUFNLE9BQU0sSUFBSSxNQUFNLGdDQUFnQyxPQUFPLFFBQVEsVUFBVSxFQUFFO0FBQ3RGLFNBQU87QUFBQSxJQUNMLE1BQU07QUFBQSxJQUNOO0FBQUEsSUFDQSxPQUFPLEtBQUs7QUFBQSxJQUNaLFlBQVk7QUFBQSxNQUNWO0FBQUEsTUFDQSxVQUFVO0FBQUEsTUFDVixTQUFTLEtBQUs7QUFBQSxNQUNkLFFBQVEsS0FBSztBQUFBLE1BQ2IsTUFBTSxLQUFLO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFDRjtBQWNPLElBQU0sZ0JBQXNCO0FBQUEsRUFDakMsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBRWIsTUFBTTtBQUFBLEVBRU4sVUFBVTtBQUFBLEVBQ1YsTUFBTTtBQUFBLEVBQ04sV0FBVztBQUFBLElBQ1Q7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLE1BQU07QUFBQSxNQUNOLGNBQWM7QUFBQSxJQUNoQjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLFNBQVM7QUFBQSxJQUNQO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsTUFDUCxZQUFZO0FBQUEsUUFDVjtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sSUFBSTtBQUFBLFVBQ0osT0FBTztBQUFBLFVBQ1AsWUFBWTtBQUFBLFlBQ1YsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUEwQlAsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBT1o7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUVBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsTUFDUCxZQUFZO0FBQUEsUUFDVjtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sSUFBSTtBQUFBLFVBQ0osT0FBTztBQUFBLFVBQ1AsWUFBWTtBQUFBLFlBQ1YsT0FBTztBQUFBLFlBQ1AsVUFBVTtBQUFBLFlBQ1YsVUFBVTtBQUFBLGNBQ1I7QUFBQSxnQkFDRSxNQUFNO0FBQUEsZ0JBQ04sSUFBSTtBQUFBLGdCQUNKLFlBQVksQ0FBQztBQUFBLGNBQ2Y7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQWdCRjtBQUFBLElBQ0Y7QUFBQSxJQUVBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsTUFDUCxZQUFZO0FBQUEsUUFDVjtBQUFBLFVBQ0UsTUFBTTtBQUFBLFVBQ04sSUFBSTtBQUFBLFVBQ0osT0FBTztBQUFBLFVBQ1AsWUFBWTtBQUFBLFlBQ1YsT0FBTztBQUFBLFlBQ1AsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFLVixVQUFVO0FBQUEsY0FDUjtBQUFBLGdCQUNFLE1BQU07QUFBQSxnQkFDTixJQUFJO0FBQUEsZ0JBQ0osWUFBWTtBQUFBLGtCQUNWLFlBQVk7QUFBQSxrQkFDWixPQUFPO0FBQUEsa0JBQ1AsTUFBTTtBQUFBLGtCQUNOLFdBQVcsRUFBRSxPQUFPLFVBQVUsVUFBVSxNQUFNO0FBQUEsa0JBQzlDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sU0FBUyxVQUFVLFVBQVUsT0FBTyxhQUFhLENBQUM7QUFBQSxnQkFDdEU7QUFBQSxjQUNGO0FBQUEsY0FDQTtBQUFBLGdCQUNFLE1BQU07QUFBQSxnQkFDTixJQUFJO0FBQUEsZ0JBQ0osWUFBWTtBQUFBLGtCQUNWLFlBQVk7QUFBQSxrQkFDWixPQUFPO0FBQUEsa0JBQ1AsTUFBTTtBQUFBLGtCQUNOLFdBQVcsRUFBRSxPQUFPLE1BQU0sVUFBVSxRQUFRO0FBQUEsa0JBQzVDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sU0FBUyxVQUFVLFVBQVUsT0FBTyxhQUFhLENBQUM7QUFBQSxnQkFDdEU7QUFBQSxjQUNGO0FBQUEsY0FDQTtBQUFBLGdCQUNFLE1BQU07QUFBQSxnQkFDTixJQUFJO0FBQUEsZ0JBQ0osWUFBWTtBQUFBLGtCQUNWLFlBQVk7QUFBQSxrQkFDWixPQUFPO0FBQUEsa0JBQ1AsTUFBTTtBQUFBLGtCQUNOLFdBQVcsRUFBRSxPQUFPLFVBQVUsVUFBVSxNQUFNO0FBQUEsa0JBQzlDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sU0FBUyxVQUFVLFVBQVUsT0FBTyxDQUFDLGNBQWMsYUFBYSxFQUFFLENBQUM7QUFBQSxnQkFDdkY7QUFBQSxjQUNGO0FBQUEsY0FDQTtBQUFBLGdCQUNFLE1BQU07QUFBQSxnQkFDTixJQUFJO0FBQUEsZ0JBQ0osWUFBWTtBQUFBLGtCQUNWLFlBQVk7QUFBQSxrQkFDWixPQUFPO0FBQUEsa0JBQ1AsTUFBTTtBQUFBLGtCQUNOLFdBQVcsRUFBRSxPQUFPLE1BQU0sVUFBVSxRQUFRO0FBQUEsa0JBQzVDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sZ0JBQWdCLFVBQVUsVUFBVSxPQUFPLE1BQU0sQ0FBQztBQUFBLGdCQUN0RTtBQUFBLGNBQ0Y7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixJQUFJO0FBQUEsVUFDSixPQUFPO0FBQUEsVUFDUCxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBa0JWLFVBQVU7QUFBQSxZQUNWLFVBQVU7QUFBQSxZQUNWLE9BQU87QUFBQSxjQUNMO0FBQUEsZ0JBQ0UsT0FBTztBQUFBLGdCQUNQLE1BQU07QUFBQSxnQkFDTixVQUFVLENBQUMsaUJBQWlCLGlCQUFpQixZQUFZLFdBQVcsVUFBVSxDQUFDO0FBQUEsY0FDakY7QUFBQSxjQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxnQkFLRSxPQUFPO0FBQUEsZ0JBQ1AsTUFBTTtBQUFBLGdCQUNOLFVBQVUsQ0FBQyxpQkFBaUIsaUJBQWlCLG1CQUFtQixrQkFBa0IsZUFBZSxDQUFDO0FBQUEsY0FDcEc7QUFBQSxjQUNBO0FBQUE7QUFBQSxnQkFFRSxPQUFPO0FBQUEsZ0JBQ1AsTUFBTTtBQUFBLGdCQUNOLFVBQVUsQ0FBQyxpQkFBaUIsaUJBQWlCLFlBQVksV0FBVyxlQUFlLENBQUM7QUFBQSxjQUN0RjtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFFQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsWUFBWTtBQUFBLFFBQ1Y7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBUUosT0FBTztBQUFBLFVBQ1AsWUFBWTtBQUFBLFlBQ1YsT0FBTztBQUFBLFlBQ1AsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFRVixVQUFVO0FBQUEsY0FDUjtBQUFBLGdCQUNFLE1BQU07QUFBQSxnQkFDTixJQUFJO0FBQUEsZ0JBQ0osWUFBWTtBQUFBLGtCQUNWLFNBQVM7QUFBQSxvQkFDUCxJQUFJO0FBQUEsb0JBQ0osU0FDRTtBQUFBLG9CQUNGLFNBQ0U7QUFBQSxvQkFDRixTQUNFO0FBQUEsa0JBQ0o7QUFBQSxnQkFDRjtBQUFBLGNBQ0Y7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixJQUFJO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBZUosT0FBTztBQUFBLFVBQ1AsWUFBWTtBQUFBLFlBQ1YsT0FBTztBQUFBLFlBQ1AsVUFBVTtBQUFBLFlBQ1YsVUFBVSxDQUFDLGlCQUFpQix3QkFBd0IsYUFBYSxZQUFZLGlCQUFpQixDQUFDO0FBQUEsVUFDakc7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFQSxXQUFXO0FBQUEsRUFFWCxNQUFNO0FBQUEsSUFDSixXQUFXO0FBQUEsSUFDWCxpQkFBaUI7QUFBQSxFQUNuQjtBQUNGOzs7QUN2Vk8sSUFBTSxrQkFBd0I7QUFBQSxFQUNuQyxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFFYixNQUFNO0FBQUEsRUFFTixVQUFVO0FBQUEsRUFDVixNQUFNO0FBQUEsRUFDTixTQUFTO0FBQUEsSUFDUDtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsWUFBWTtBQUFBLFFBQ1Y7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLE9BQU87QUFBQSxVQUNQLFlBQVksQ0FBQztBQUFBLFFBQ2Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBRUE7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFlBQVk7QUFBQSxRQUNWO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixJQUFJO0FBQUEsVUFDSixPQUFPO0FBQUEsVUFDUCxZQUFZO0FBQUEsWUFDVixPQUFPO0FBQUEsWUFDUCxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFPWjtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixJQUFJO0FBQUEsVUFDSixPQUFPO0FBQUEsVUFDUCxZQUFZLENBQUM7QUFBQSxRQUNmO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFQSxXQUFXO0FBQUEsRUFFWCxNQUFNO0FBQUEsSUFDSixXQUFXO0FBQUEsSUFDWCxpQkFBaUI7QUFBQSxFQUNuQjtBQUNGOzs7QUN4RE8sSUFBTSxpQkFBdUI7QUFBQSxFQUNsQyxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFFYixNQUFNO0FBQUEsRUFFTixVQUFVO0FBQUEsRUFDVixNQUFNO0FBQUEsRUFDTixTQUFTO0FBQUEsSUFDUDtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsWUFBWTtBQUFBLFFBQ1Y7QUFBQSxVQUNFLE1BQU07QUFBQSxVQUNOLElBQUk7QUFBQSxVQUNKLE9BQU87QUFBQSxVQUNQLFlBQVksQ0FBQztBQUFBLFFBQ2Y7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixJQUFJO0FBQUEsVUFDSixPQUFPO0FBQUEsVUFDUCxZQUFZO0FBQUEsWUFDVixPQUFPO0FBQUEsWUFDUCxVQUFVO0FBQUEsVUFDWjtBQUFBLFFBQ0Y7QUFBQSxRQUNBO0FBQUEsVUFDRSxNQUFNO0FBQUEsVUFDTixJQUFJO0FBQUEsVUFDSixPQUFPO0FBQUEsVUFDUCxZQUFZLENBQUM7QUFBQSxRQUNmO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFFQSxXQUFXO0FBQUEsRUFFWCxNQUFNO0FBQUEsSUFDSixXQUFXO0FBQUEsSUFDWCxpQkFBaUI7QUFBQSxFQUNuQjtBQUNGOzs7QUM3REE7QUFBQTtBQUFBO0FBQUE7OztBQ2tCTyxJQUFNQyxNQUF3QjtBQUFBLEVBQ25DLHdCQUF3QjtBQUFBLElBQ3RCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSx3QkFBd0I7QUFBQSxJQUN0QixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0EsdUJBQXVCO0FBQUEsSUFDckIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLG9CQUFvQjtBQUFBLElBQ2xCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSxzQkFBc0I7QUFBQSxJQUNwQixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0EsZ0NBQWdDO0FBQUEsSUFDOUIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLGdDQUFnQztBQUFBLElBQzlCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSxzQkFBc0I7QUFBQSxJQUNwQixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0Esd0JBQXdCO0FBQUEsSUFDdEIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLHdCQUF3QjtBQUFBLElBQ3RCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSw0QkFBNEI7QUFBQSxJQUMxQixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0EsNEJBQTRCO0FBQUEsSUFDMUIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLHFCQUFxQjtBQUFBLElBQ25CLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSxtQkFBbUI7QUFBQSxJQUNqQixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUNGOzs7QUNwRk8sSUFBTUMsUUFBMEI7QUFBQSxFQUNyQyx3QkFBd0I7QUFBQSxJQUN0QixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0Esd0JBQXdCO0FBQUEsSUFDdEIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLHVCQUF1QjtBQUFBLElBQ3JCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSxvQkFBb0I7QUFBQSxJQUNsQixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0Esc0JBQXNCO0FBQUEsSUFDcEIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLGdDQUFnQztBQUFBLElBQzlCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSxnQ0FBZ0M7QUFBQSxJQUM5QixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0Esc0JBQXNCO0FBQUEsSUFDcEIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLHdCQUF3QjtBQUFBLElBQ3RCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSx3QkFBd0I7QUFBQSxJQUN0QixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0EsNEJBQTRCO0FBQUEsSUFDMUIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLDRCQUE0QjtBQUFBLElBQzFCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSxxQkFBcUI7QUFBQSxJQUNuQixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0EsbUJBQW1CO0FBQUEsSUFDakIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFDRjs7O0FDdkVPLElBQU1DLFFBQTBCO0FBQUEsRUFDckMsd0JBQXdCO0FBQUEsSUFDdEIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLHdCQUF3QjtBQUFBLElBQ3RCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSx1QkFBdUI7QUFBQSxJQUNyQixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0Esb0JBQW9CO0FBQUEsSUFDbEIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLHNCQUFzQjtBQUFBLElBQ3BCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSxnQ0FBZ0M7QUFBQSxJQUM5QixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0EsZ0NBQWdDO0FBQUEsSUFDOUIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLHNCQUFzQjtBQUFBLElBQ3BCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSx3QkFBd0I7QUFBQSxJQUN0QixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0Esd0JBQXdCO0FBQUEsSUFDdEIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLDRCQUE0QjtBQUFBLElBQzFCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSw0QkFBNEI7QUFBQSxJQUMxQixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0EscUJBQXFCO0FBQUEsSUFDbkIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLG1CQUFtQjtBQUFBLElBQ2pCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQ0Y7OztBQ3ZFTyxJQUFNQyxRQUEwQjtBQUFBLEVBQ3JDLHdCQUF3QjtBQUFBLElBQ3RCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSx3QkFBd0I7QUFBQSxJQUN0QixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0EsdUJBQXVCO0FBQUEsSUFDckIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLG9CQUFvQjtBQUFBLElBQ2xCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSxzQkFBc0I7QUFBQSxJQUNwQixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0EsZ0NBQWdDO0FBQUEsSUFDOUIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLGdDQUFnQztBQUFBLElBQzlCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSxzQkFBc0I7QUFBQSxJQUNwQixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0Esd0JBQXdCO0FBQUEsSUFDdEIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLHdCQUF3QjtBQUFBLElBQ3RCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSw0QkFBNEI7QUFBQSxJQUMxQixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0EsNEJBQTRCO0FBQUEsSUFDMUIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLHFCQUFxQjtBQUFBLElBQ25CLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSxtQkFBbUI7QUFBQSxJQUNqQixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUNGOzs7QUMzRE8sSUFBTSxzQkFBaUQsT0FBTztBQUFBLEVBQ25FLFNBQVNDO0FBQUEsRUFDVCxTQUFTQztBQUFBLEVBQ1QsU0FBU0M7QUFBQSxFQUNULFNBQVNDO0FBQ1gsQ0FBQzs7O0FDdEJELElBQUFDLDJCQUFBO0FBQUEsU0FBQUEsMEJBQUE7QUFBQTtBQUFBOzs7QUNZTyxJQUFNQyxNQUF3QjtBQUFBLEVBQ25DLHdCQUF3QjtBQUFBLElBQ3RCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSx3QkFBd0I7QUFBQSxJQUN0QixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0EscUJBQXFCO0FBQUEsSUFDbkIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFDRjs7O0FDdkJPLElBQU1DLFFBQTBCO0FBQUEsRUFDckMsd0JBQXdCO0FBQUEsSUFDdEIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLHdCQUF3QjtBQUFBLElBQ3RCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSxxQkFBcUI7QUFBQSxJQUNuQixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUNGOzs7QUNoQk8sSUFBTUMsUUFBMEI7QUFBQSxFQUNyQyx3QkFBd0I7QUFBQSxJQUN0QixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0Esd0JBQXdCO0FBQUEsSUFDdEIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFBQSxFQUNBLHFCQUFxQjtBQUFBLElBQ25CLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQ0Y7OztBQ2hCTyxJQUFNQyxRQUEwQjtBQUFBLEVBQ3JDLHdCQUF3QjtBQUFBLElBQ3RCLE9BQU87QUFBQSxJQUNQLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxFQUNaO0FBQUEsRUFDQSx3QkFBd0I7QUFBQSxJQUN0QixPQUFPO0FBQUEsSUFDUCxTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBQ0EscUJBQXFCO0FBQUEsSUFDbkIsT0FBTztBQUFBLElBQ1AsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLEVBQ1o7QUFDRjs7O0FDTE8sSUFBTSx3QkFBbUQsT0FBTztBQUFBLEVBQ3JFLFNBQVNDO0FBQUEsRUFDVCxTQUFTQztBQUFBLEVBQ1QsU0FBU0M7QUFBQSxFQUNULFNBQVNDO0FBQ1gsQ0FBQzs7O0FDdUdNLElBQU0scUJBQXFCO0FBQUEsRUFDaEMsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBO0FBQUE7QUFBQSxFQUdQLFNBQVMsRUFBRSxHQUFHLG1CQUFtQixRQUFRO0FBQUEsRUFDekMsbUJBQW1CO0FBQUEsSUFDakI7QUFBQTtBQUFBO0FBQUEsSUFHQTtBQUFBO0FBQUEsSUFFQTtBQUFBLElBQWlCO0FBQUEsSUFDakI7QUFBQSxFQUNGO0FBQ0Y7OztBQ3pIQSxJQUFNLGNBQW9CO0FBQUEsRUFDeEIsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsUUFBUSxDQUFDLGdCQUFnQixnQkFBZ0IsY0FBYztBQUFBLEVBQ3ZELFVBQVU7QUFBQSxFQUNWLGFBQ0U7QUFBQSxFQUNGLFNBQVMsT0FBTyxRQUFxQjtBQUluQyxhQUFTLE9BQ1AsU0FDQSxNQUNBLFFBQ0EsY0FBc0IsU0FDZjtBQUNQLFlBQU0sTUFBTSxJQUFJLE1BQU0sT0FBTztBQUs3QixVQUFJLE9BQU87QUFDWCxVQUFJLFNBQVM7QUFDYixVQUFJLGNBQWM7QUFDbEIsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLEVBQUUsT0FBTyxNQUFNLElBQUk7QUFFekIsUUFBSSxVQUFVLGtCQUFrQixVQUFVLGdCQUFnQjtBQUN4RCxVQUFJLE9BQU8sTUFBTSxZQUFZLFlBQVksTUFBTSxRQUFRLFNBQVMsR0FBRztBQUNqRSxZQUFJLENBQUMsZ0JBQWdCLEtBQUssTUFBTSxPQUFPLEdBQUc7QUFDeEMsZ0JBQU0sT0FBTywrQ0FBK0MscUJBQXFCLEdBQUc7QUFBQSxRQUN0RjtBQUFBLE1BQ0Y7QUFDQSxVQUFJLE9BQU8sTUFBTSxtQkFBbUIsWUFBWSxNQUFNLGlCQUFpQixHQUFHO0FBQ3hFLGNBQU0sT0FBTyxxREFBcUQscUJBQXFCLEdBQUc7QUFBQSxNQUM1RjtBQXlEQSxVQUFJLHFCQUFxQixTQUFTLFVBQVUsZ0JBQWdCO0FBQzFELGNBQU0sVUFBVSxNQUFNO0FBQ3RCLGNBQU0sVUFDSixZQUFZLFFBQVEsT0FBTyxZQUFZLFlBQVksQ0FBQyxNQUFNLFFBQVEsT0FBTyxJQUNwRSxRQUFrQyxVQUNuQztBQUtOLGNBQU0sYUFDSixPQUFPLFlBQVksV0FBVyxRQUFRLEtBQUssRUFBRSxRQUFRLFFBQVEsR0FBRyxFQUFFLFlBQVksSUFBSTtBQUVwRixZQUFJLHFCQUFxQixPQUFPO0FBQzlCLGdCQUFNLGtCQUFrQixlQUFlLEtBQUssT0FBTztBQUFBLFFBQ3JEO0FBT0EsY0FBTSx1QkFBK0M7QUFBQSxVQUNuRCxNQUFNO0FBQUEsVUFBTSxNQUFNO0FBQUEsVUFBTSxNQUFNO0FBQUEsVUFDOUIsTUFBTTtBQUFBLFVBQVEsTUFBTTtBQUFBLFVBQVEsTUFBTTtBQUFBLFVBQVEsTUFBTTtBQUFBLFVBQVEsTUFBTTtBQUFBLFVBQzlELGlCQUFpQjtBQUFBLFVBQU0sNEJBQTRCO0FBQUEsVUFBTSxPQUFPO0FBQUEsVUFDaEUsVUFBVTtBQUFBLFVBQU0sVUFBVTtBQUFBLFVBQzFCLE1BQU07QUFBQSxVQUFRLGtCQUFrQjtBQUFBLFVBQVEsaUJBQWlCO0FBQUEsVUFDekQsV0FBVztBQUFBLFVBQVEsVUFBVTtBQUFBLFVBQVEsU0FBUztBQUFBLFVBQVEsU0FBUztBQUFBLFFBQ2pFO0FBQ0EsY0FBTSxZQUFZLHFCQUFxQixVQUFVLEtBQUs7QUFBQSxNQUN4RDtBQTRCQSxVQUFJLFVBQVUsT0FBTztBQUNuQixjQUFNLFVBQVUsTUFBTTtBQUN0QixjQUFNLGlCQUNKLE9BQU8sWUFBWSxXQUNmLFFBQVEsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLFFBQVEsR0FBRyxJQUNoRDtBQUNOLGNBQU0sa0JBQWtCLG1CQUFtQixLQUFLLE9BQU87QUFBQSxNQUN6RDtBQUFBLElBQ0Y7QUFZQSxRQUFJLFVBQVUsa0JBQWtCLElBQUksTUFBTSxNQUFNLElBQUksVUFBVSxTQUFTLFdBQVc7QUFDaEYsWUFBTSxPQUFPLElBQUksWUFBWSxDQUFDO0FBQzlCLFlBQU0sZUFBZSxPQUFPLE1BQU0sYUFBYSxlQUFlLE1BQU0sYUFBYSxLQUFLO0FBQ3RGLFlBQU0sY0FBYyxPQUFPLE1BQU0sU0FBUyxlQUFlLE1BQU0sU0FBUyxLQUFLO0FBQzdFLFVBQUksZ0JBQWdCLGFBQWE7QUFDL0IsY0FBTSxzQkFBcUIsb0JBQUksS0FBSyxHQUFFLFlBQVksRUFBRSxNQUFNLEdBQUcsRUFBRTtBQUFBLE1BQ2pFO0FBQUEsSUFDRjtBQUVBLFFBQUksVUFBVSxnQkFBZ0I7QUFDNUIsWUFBTSxXQUFXLElBQUk7QUFDckIsVUFBSSxDQUFDLFlBQVksU0FBUyxTQUFTLFdBQVk7QUFDL0MsWUFBTSxNQUFNLElBQUk7QUFDaEIsVUFBSSxDQUFDLElBQUs7QUFjVixZQUFNQyxpQkFBZ0IsTUFBTSxJQUFJLE9BQU8saUJBQWlCLEVBQUUsTUFBTTtBQUFBLFFBQzlELE9BQU8sRUFBRSxhQUFhLFNBQVMsR0FBRztBQUFBLE1BQ3BDLENBQUM7QUFDRCxVQUFJQSxpQkFBZ0IsR0FBRztBQVFyQixjQUFNO0FBQUEsVUFDSkEsbUJBQWtCLElBQ2QseUtBQ0EsbUNBQW1DQSxjQUFhO0FBQUEsVUFDcEQ7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFJQSxZQUFNLGtCQUFrQixNQUFNLElBQUksT0FBTyxjQUFjLEVBQUUsTUFBTTtBQUFBLFFBQzdELE9BQU8sRUFBRSxhQUFhLFNBQVMsSUFBSSxRQUFRLFlBQVk7QUFBQSxNQUN6RCxDQUFDO0FBQ0QsVUFBSSxrQkFBa0IsR0FBRztBQUN2QixjQUFNO0FBQUEsVUFDSixvQkFBb0IsSUFDaEIsOEdBQ0EsbUNBQW1DLGVBQWU7QUFBQSxVQUN0RDtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxJQUFPLHVCQUFROzs7QUNoTmYsSUFBTSxjQUFvQjtBQUFBLEVBQ3hCLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFFBQVEsQ0FBQyxnQkFBZ0IsZ0JBQWdCLGNBQWM7QUFBQSxFQUN2RCxVQUFVO0FBQUEsRUFDVixhQUNFO0FBQUEsRUFDRixTQUFTLE9BQU8sUUFBcUI7QUFJbkMsYUFBUyxPQUNQLFNBQ0EsTUFDQSxRQUNBLGNBQXNCLFNBQ2Y7QUFDUCxZQUFNLE1BQU0sSUFBSSxNQUFNLE9BQU87QUFLN0IsVUFBSSxPQUFPO0FBQ1gsVUFBSSxTQUFTO0FBQ2IsVUFBSSxjQUFjO0FBQ2xCLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTSxFQUFFLE9BQU8sTUFBTSxJQUFJO0FBQ3pCLFVBQU0sTUFBTSxJQUFJO0FBRWhCLFNBQUssVUFBVSxrQkFBa0IsVUFBVSxtQkFBbUIsS0FBSztBQUNqRSxZQUFNLFFBQVEsT0FBTyxNQUFNLFVBQVUsV0FBVyxNQUFNLE1BQU0sWUFBWSxJQUFJO0FBQzVFLFVBQUksT0FBTztBQUNULGNBQU0sUUFBUTtBQVNkLGNBQU0saUJBQWlCO0FBQUEsVUFDckIsSUFBSSxNQUFNO0FBQUEsVUFDVixJQUFJLFNBQVM7QUFBQSxVQUNiLE1BQU07QUFBQSxVQUNOLElBQUksVUFBVTtBQUFBLFFBQ2hCLEVBQUUsS0FBSyxDQUFDLGNBQW1DLE9BQU8sY0FBYyxZQUFZLGNBQWMsRUFBRTtBQUM1RixZQUFJLGtCQUFrQixJQUFJLE1BQU0sSUFBSTtBQUNsQyxnQkFBTSxNQUFNLE1BQU0sSUFBSSxPQUFPLGFBQWEsRUFBRSxRQUFRO0FBQUEsWUFDbEQsT0FBTyxpQkFBaUIsRUFBRSxpQkFBaUIsZ0JBQWdCLE1BQU0sSUFBSSxFQUFFLE1BQU07QUFBQSxVQUMvRSxDQUFDO0FBQ0QsZ0JBQU0sU0FBUztBQUdmLGdCQUFNLFFBQVEsUUFBUTtBQUN0QixnQkFBTSxTQUFTLElBQUksVUFBVSxNQUFNLE1BQU07QUFDekMsY0FBSSxPQUFPLFVBQVUsUUFBUTtBQVczQixrQkFBTSxVQUFVLENBQUMsUUFBUSxZQUFZLFFBQVEsU0FBUyxFQUNuRCxPQUFPLENBQUMsU0FBUyxPQUFPLFNBQVMsWUFBWSxLQUFLLEtBQUssTUFBTSxFQUFFLEVBQy9ELEtBQUssR0FBRztBQUNYLGtCQUFNO0FBQUEsY0FDSixVQUNJLG9CQUFvQixPQUFPLGdCQUFnQixLQUFLLHFCQUNoRCw4QkFBOEIsS0FBSztBQUFBLGNBQ3ZDO0FBQUEsY0FDQTtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBRUEsUUFBSSxVQUFVLGtCQUFrQixLQUFLO0FBQ25DLFlBQU0sS0FBSyxJQUFJLFVBQVU7QUFDekIsVUFBSSxDQUFDLEdBQUk7QUFDVCxZQUFNLENBQUMsVUFBVSxZQUFZLGVBQWUsSUFBSSxNQUFNLFFBQVEsSUFBSTtBQUFBLFFBQ2hFLElBQUksT0FBTyxpQkFBaUIsRUFBRSxNQUFNO0FBQUEsVUFDbEMsT0FBTyxFQUFFLGlCQUFpQixJQUFJLE9BQU8sRUFBRSxNQUFNLENBQUMsY0FBYyxhQUFhLEVBQUUsRUFBRTtBQUFBLFFBQy9FLENBQUM7QUFBQSxRQUNELElBQUksT0FBTyxXQUFXLEVBQUUsTUFBTTtBQUFBLFVBQzVCLE9BQU8sRUFBRSxhQUFhLElBQUksUUFBUSxFQUFFLE1BQU0sQ0FBQyxZQUFZLFNBQVMsRUFBRSxFQUFFO0FBQUEsUUFDdEUsQ0FBQztBQUFBLFFBQ0QsSUFBSSxPQUFPLGNBQWMsRUFBRSxNQUFNO0FBQUEsVUFDL0IsT0FBTyxFQUFFLGFBQWEsSUFBSSxRQUFRLFlBQVk7QUFBQSxRQUNoRCxDQUFDO0FBQUEsTUFDSCxDQUFDO0FBQ0QsWUFBTSxRQUFRLFdBQVcsYUFBYTtBQUN0QyxVQUFJLFFBQVEsR0FBRztBQWFiLGNBQU0sT0FBTyxDQUFDLElBQUksVUFBVSxZQUFZLElBQUksVUFBVSxTQUFTLEVBQzVELE9BQU8sQ0FBQyxTQUFTLE9BQU8sU0FBUyxZQUFZLEtBQUssS0FBSyxNQUFNLEVBQUUsRUFDL0QsS0FBSyxHQUFHO0FBTVgsY0FBTSxVQUFVLE9BQU8sV0FBVyxJQUFJLEtBQUs7QUFzQjNDLGNBQU07QUFBQSxVQUNKLEdBQUcsT0FBTywyQkFBMkIsUUFBUSwyQkFBMkIsVUFBVSxxQkFBcUIsZUFBZTtBQUFBLFVBQ3RIO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLElBQU8sdUJBQVE7OztBQzNLZixJQUFNLHNCQUE0QjtBQUFBLEVBQ2hDLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFFBQVEsQ0FBQyxnQkFBZ0IsY0FBYztBQUFBLEVBQ3ZDLFVBQVU7QUFBQSxFQUNWLGFBQ0U7QUFBQSxFQUNGLFNBQVMsT0FBTyxRQUFxQjtBQUtuQyxRQUFJLElBQUksVUFBVSxrQkFBa0IsSUFBSSxVQUFVLFNBQVMsVUFBVztBQUV0RSxVQUFNLEVBQUUsTUFBTSxJQUFJO0FBQ2xCLFVBQU0sV0FBVyxJQUFJO0FBRXJCLFVBQU0sWUFBWSxDQUFDLFFBQ2pCLE1BQU0sR0FBRyxNQUFNLFVBQWEsTUFBTSxHQUFHLE1BQU0sT0FBTyxNQUFNLEdBQUcsSUFBSSxXQUFXLEdBQUc7QUFFL0UsVUFBTSxRQUFRLFVBQVUsZ0JBQWdCO0FBQ3hDLFVBQU0sTUFBTSxVQUFVLGNBQWM7QUFDcEMsVUFBTSxjQUFjLFVBQVUsa0JBQWtCO0FBRWhELFVBQU0sVUFBVSxPQUFPLFVBQVUsWUFBWSxpQkFBaUIsT0FBTyxJQUFJLEtBQUssS0FBZSxFQUFFLFFBQVEsSUFBSTtBQUMzRyxVQUFNLFFBQVEsT0FBTyxRQUFRLFlBQVksZUFBZSxPQUFPLElBQUksS0FBSyxHQUFhLEVBQUUsUUFBUSxJQUFJO0FBQ25HLFVBQU0sV0FBVyxPQUFPLGdCQUFnQixZQUFZLFNBQVMsV0FBVyxJQUFJLGNBQWM7QUFJMUYsVUFBTSxTQUFTLFVBQVUsU0FBUyxNQUFNO0FBRXhDLFFBQUksQ0FBQyxNQUFNLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxHQUFHO0FBS3BDLFVBQUksQ0FBQyxPQUFRLE9BQU0sbUJBQW1CLEtBQUssSUFBSSxHQUFHLEtBQUssT0FBTyxRQUFRLFdBQVcsR0FBSyxDQUFDO0FBQUEsSUFDekYsV0FBVyxDQUFDLE1BQU0sT0FBTyxLQUFLLE1BQU0sS0FBSyxLQUFLLENBQUMsTUFBTSxRQUFRLEtBQUssV0FBVyxHQUFHO0FBRzlFLFlBQU0sZUFBZSxJQUFJLEtBQUssVUFBVSxXQUFXLEdBQUssRUFBRSxZQUFZO0FBQUEsSUFDeEU7QUFLQSxVQUFNLFNBQVMsVUFBVSxRQUFRO0FBQ2pDLFFBQUksV0FBVyxlQUFlLFdBQVcsVUFBVyxPQUFNLG1CQUFtQjtBQUFBLEVBQy9FO0FBQ0Y7QUFpQ0EsSUFBTSxzQkFBNEI7QUFBQSxFQUNoQyxNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixRQUFRLENBQUMsZUFBZSxhQUFhO0FBQUEsRUFDckMsVUFBVTtBQUFBLEVBQ1YsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsT0FBTztBQUFBLEVBQ1AsYUFDRTtBQUFBLEVBQ0YsU0FBUyxPQUFPLFFBQXFCO0FBQ25DLFVBQU0sRUFBRSxNQUFNLElBQUk7QUFDbEIsVUFBTSxXQUFXLElBQUk7QUFDckIsVUFBTSxNQUFNLElBQUk7QUFDaEIsUUFBSSxDQUFDLElBQUs7QUFFVixVQUFNLElBQXlCLEVBQUUsR0FBSSxZQUFZLENBQUMsR0FBSSxHQUFHLE1BQU07QUFPL0QsUUFBSSxFQUFFLFdBQVcsT0FBUTtBQUV6QixRQUFJLFlBQVksU0FBUyxXQUFXLE9BQVE7QUFFNUMsVUFBTSxVQUFTLG9CQUFJLEtBQUssR0FBRSxZQUFZO0FBSXRDLFVBQU0sUUFBUSxPQUFPLE1BQU0sR0FBRyxFQUFFO0FBRWhDLFVBQU0sT0FBTyxDQUFDLFFBQ1osT0FBTyxFQUFFLEdBQUcsTUFBTSxZQUFZLEVBQUUsR0FBRyxFQUFFLFNBQVMsSUFBSyxFQUFFLEdBQUcsSUFBZTtBQUV6RSxVQUFNLE1BQU0sS0FBSyxpQkFBaUI7QUFDbEMsVUFBTSxRQUFnQyxNQUFNLEVBQUUsaUJBQWlCLElBQUksSUFBSSxDQUFDO0FBRXhFLFVBQU0sYUFBYSxvQkFBSSxJQUFZO0FBQ25DLFVBQU0sYUFBYSxvQkFBSSxJQUFZO0FBQ25DLFVBQU0sVUFBVSxvQkFBSSxJQUFZO0FBRWhDLFVBQU0sU0FBUyxLQUFLLG9CQUFvQjtBQUN4QyxRQUFJLE9BQVEsWUFBVyxJQUFJLE1BQU07QUFDakMsVUFBTSxZQUFZLEtBQUssb0JBQW9CO0FBQzNDLFFBQUksVUFBVyxZQUFXLElBQUksU0FBUztBQUN2QyxVQUFNLFNBQVMsS0FBSyxpQkFBaUI7QUFDckMsUUFBSSxPQUFRLFNBQVEsSUFBSSxNQUFNO0FBTTlCLFVBQU0sZ0JBQXlDO0FBQUEsTUFDN0MsQ0FBQyxzQkFBc0IsYUFBYTtBQUFBLE1BQ3BDLENBQUMsMEJBQTBCLGlCQUFpQjtBQUFBLE1BQzVDLENBQUMsbUJBQW1CLFVBQVU7QUFBQSxJQUNoQztBQUNBLGVBQVcsQ0FBQyxPQUFPLE1BQU0sS0FBSyxlQUFlO0FBQzNDLFlBQU0sS0FBSyxLQUFLLEtBQUs7QUFDckIsVUFBSSxDQUFDLEdBQUk7QUFDVCxVQUFJO0FBQ0YsY0FBTSxNQUFXLE1BQU0sSUFBSSxPQUFPLE1BQU0sRUFBRSxLQUFLO0FBQUEsVUFDN0MsT0FBTyxFQUFFLElBQUksR0FBRyxNQUFNO0FBQUEsVUFDdEIsUUFBUSxDQUFDLGFBQWE7QUFBQSxVQUN0QixLQUFLO0FBQUEsUUFDUCxDQUFDO0FBQ0QsY0FBTSxPQUFPLE1BQU0sUUFBUSxHQUFHLElBQUksTUFBTyxLQUFLLFdBQVcsQ0FBQztBQUMxRCxjQUFNLFNBQVMsS0FBSyxTQUFTLEtBQUssQ0FBQyxFQUFFLGNBQWM7QUFDbkQsWUFBSSxPQUFPLFdBQVcsWUFBWSxPQUFPLFNBQVMsRUFBRyxZQUFXLElBQUksTUFBTTtBQUFBLE1BQzVFLFFBQVE7QUFBQSxNQUlSO0FBQUEsSUFDRjtBQUVBLFVBQU0sVUFBNkQ7QUFBQSxNQUNqRSxDQUFDLGVBQWUsWUFBWSxFQUFFLG9CQUFvQixNQUFNLENBQUM7QUFBQSxNQUN6RCxDQUFDLGVBQWUsWUFBWSxFQUFFLHFCQUFxQixPQUFPLENBQUM7QUFBQSxNQUMzRCxDQUFDLFlBQVksU0FBUyxFQUFFLHFCQUFxQixPQUFPLENBQUM7QUFBQSxJQUN2RDtBQUNBLGVBQVcsQ0FBQyxRQUFRLEtBQUssR0FBRyxLQUFLLFNBQVM7QUFDeEMsVUFBSSxTQUFTLENBQUMsR0FBRyxHQUFHO0FBQ3BCLFVBQUksT0FBTyxPQUFPLFNBQVMsR0FBRztBQUM1QixZQUFJO0FBQ0YsZ0JBQU0sTUFBVyxNQUFNLElBQUksT0FBTyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxPQUFPLEdBQUcsR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxLQUFLLE9BQU8sT0FBTyxDQUFDO0FBQy9ILG9CQUFVLE1BQU0sUUFBUSxHQUFHLElBQUksTUFBTyxLQUFLLFdBQVcsQ0FBQyxHQUFJLElBQUksQ0FBQyxRQUFhLE9BQU8sSUFBSSxFQUFFLENBQUM7QUFBQSxRQUM3RixRQUFRO0FBQ04sbUJBQVMsQ0FBQztBQUFBLFFBQ1o7QUFBQSxNQUNGO0FBQ0EsaUJBQVcsTUFBTSxRQUFRO0FBQ3ZCLFlBQUk7QUFJRixnQkFBTSxJQUFJLE9BQU8sTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssR0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQUEsUUFDbkUsUUFBUTtBQUFBLFFBRVI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQXFCQSxVQUFNLGlCQUFpQixLQUFLLGlCQUFpQjtBQUM3QyxRQUFJLGdCQUFnQjtBQUNsQixVQUFJO0FBUUYsY0FBTSxNQUFXLE1BQU0sSUFBSSxPQUFPLFVBQVUsRUFBRSxLQUFLO0FBQUEsVUFDakQsT0FBTyxFQUFFLElBQUksZ0JBQWdCLEdBQUcsTUFBTTtBQUFBLFVBQ3RDLFFBQVEsQ0FBQyxxQkFBcUI7QUFBQSxVQUM5QixLQUFLO0FBQUEsUUFDUCxDQUFDO0FBQ0QsY0FBTSxPQUFPLE1BQU0sUUFBUSxHQUFHLElBQUksTUFBTyxLQUFLLFdBQVcsQ0FBQztBQUMxRCxZQUFJLEtBQUssU0FBUyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUscUJBQXFCO0FBQ25ELGdCQUFNLElBQUksT0FBTyxVQUFVLEVBQUU7QUFBQSxZQUMzQixFQUFFLElBQUksZ0JBQWdCLHFCQUFxQixPQUFPO0FBQUEsWUFDbEQsRUFBRSxPQUFPLEVBQUUsSUFBSSxlQUFlLEVBQUU7QUFBQSxVQUNsQztBQUFBLFFBQ0Y7QUFBQSxNQUNGLFFBQVE7QUFBQSxNQUVSO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQXlCQSxJQUFNLHNCQUE0QjtBQUFBLEVBQ2hDLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFFBQVEsQ0FBQyxnQkFBZ0IsY0FBYztBQUFBLEVBQ3ZDLFVBQVU7QUFBQSxFQUNWLGFBQWE7QUFBQSxFQUNiLFNBQVMsT0FBTyxRQUFxQjtBQUluQyxhQUFTLE9BQ1AsU0FDQSxNQUNBLFFBQ0EsY0FBc0IsU0FDZjtBQUNQLFlBQU0sTUFBTSxJQUFJLE1BQU0sT0FBTztBQUs3QixVQUFJLE9BQU87QUFDWCxVQUFJLFNBQVM7QUFDYixVQUFJLGNBQWM7QUFDbEIsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLEVBQUUsTUFBTSxJQUFJO0FBQ2xCLFVBQU0sV0FBVyxJQUFJO0FBQ3JCLFVBQU0sTUFBTSxJQUFJO0FBQ2hCLFFBQUksQ0FBQyxJQUFLO0FBRVYsVUFBTSxZQUFZLENBQUMsUUFDakIsTUFBTSxHQUFHLE1BQU0sVUFBYSxNQUFNLEdBQUcsTUFBTSxPQUFPLE1BQU0sR0FBRyxJQUFJLFdBQVcsR0FBRztBQUUvRSxRQUFJLFVBQVUsTUFBTSxNQUFNLE9BQVE7QUFHbEMsUUFBSSxVQUFVLFFBQVEsTUFBTSxVQUFXO0FBRXZDLFVBQU0sU0FBUyxVQUFVLGlCQUFpQjtBQUMxQyxVQUFNLFlBQVksVUFBVSxvQkFBb0I7QUFFaEQsVUFBTSxVQUFnRSxDQUFDO0FBQ3ZFLFFBQUksT0FBTyxXQUFXLFlBQVksUUFBUTtBQUN4QyxjQUFRLEtBQUssRUFBRSxRQUFRLFlBQVksSUFBSSxRQUFRLE9BQU8sT0FBTyxDQUFDO0FBQUEsSUFDaEU7QUFDQSxRQUFJLE9BQU8sY0FBYyxZQUFZLFdBQVc7QUFDOUMsY0FBUSxLQUFLLEVBQUUsUUFBUSxlQUFlLElBQUksV0FBVyxPQUFPLFVBQVUsQ0FBQztBQUFBLElBQ3pFO0FBRUEsZUFBVyxLQUFLLFNBQVM7QUFHdkIsWUFBTSxNQUFXLE1BQU0sSUFBSSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUs7QUFBQSxRQUMvQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUc7QUFBQSxRQUNsQixRQUFRLENBQUMsTUFBTSxhQUFhO0FBQUEsUUFDNUIsS0FBSztBQUFBLE1BQ1AsQ0FBQztBQUNELFlBQU0sT0FBTyxNQUFNLFFBQVEsR0FBRyxJQUFJLE1BQU8sS0FBSyxXQUFXLENBQUM7QUFDMUQsWUFBTSxTQUFTLEtBQUssQ0FBQztBQUVyQixVQUFJLFFBQVEsZ0JBQWdCLE1BQU07QUFDaEMsY0FBTTtBQUFBLFVBQ0osUUFBUSxFQUFFLEtBQUs7QUFBQSxVQUdmO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLElBQU8scUJBQVEsQ0FBQyxxQkFBcUIscUJBQXFCLG1CQUFtQjs7O0FDalY3RSxJQUFNLGlCQUF1QjtBQUFBLEVBQzNCLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFFBQVEsQ0FBQyxnQkFBZ0IsY0FBYztBQUFBLEVBQ3ZDLFVBQVU7QUFBQSxFQUNWLGFBQWE7QUFBQSxFQUNiLFNBQVMsT0FBTyxRQUFxQjtBQWdDbkMsUUFBSSxJQUFJLFVBQVUsa0JBQWtCLElBQUksVUFBVSxTQUFTLFVBQVc7QUFFdEUsVUFBTSxNQUFNLENBQUMsTUFBYyxPQUFPLENBQUMsRUFBRSxTQUFTLEdBQUcsR0FBRztBQUNwRCxVQUFNLFVBQVUsQ0FBQyxNQUNmLEdBQUcsRUFBRSxlQUFlLENBQUMsSUFBSSxJQUFJLEVBQUUsWUFBWSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztBQUMxRSxVQUFNLFNBQVMsQ0FBQyxPQUFNLE9BQU0sT0FBTSxPQUFNLE9BQU0sT0FBTSxPQUFNLE9BQU0sT0FBTSxPQUFNLE9BQU0sS0FBSztBQUN2RixVQUFNLGFBQWEsQ0FBQyxVQUNsQixJQUFJLEtBQUssS0FBSyxJQUFJLE1BQU0sZUFBZSxHQUFHLE1BQU0sWUFBWSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBTXZFLFVBQU0sZUFBZSxDQUFDLFVBQ3BCLElBQUksS0FBSyxLQUFLLElBQUksTUFBTSxlQUFlLEdBQUcsTUFBTSxZQUFZLElBQUksR0FBRyxDQUFDLENBQUM7QUFHdkUsVUFBTSxnQkFBZ0IsQ0FBQ0MsU0FBZ0IsTUFDckMsSUFBSSxLQUFLLEtBQUs7QUFBQSxNQUNaLEVBQUUsZUFBZTtBQUFBLE1BQ2pCQSxZQUFXLFlBQVksS0FBSyxNQUFNLEVBQUUsWUFBWSxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsWUFBWTtBQUFBLE1BQzNFO0FBQUEsSUFDRixDQUFDO0FBQ0gsVUFBTSxXQUFXLENBQUNBLFNBQWdCLFVBQWdCO0FBQ2hELFVBQUlBLFlBQVcsV0FBVztBQUN4QixjQUFNLElBQUksS0FBSyxNQUFNLE1BQU0sWUFBWSxJQUFJLENBQUMsSUFBSTtBQUNoRCxlQUFPLElBQUksQ0FBQyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQUEsTUFDeEM7QUFDQSxhQUFPLEdBQUcsT0FBTyxNQUFNLFlBQVksQ0FBQyxDQUFDLElBQUksTUFBTSxlQUFlLENBQUM7QUFBQSxJQUNqRTtBQUVBLFVBQU0sRUFBRSxNQUFNLElBQUk7QUFDbEIsVUFBTSxXQUFXLElBQUk7QUFDckIsVUFBTSxTQUNILE9BQU8sTUFBTSxXQUFXLFlBQVksTUFBTSxVQUMxQyxPQUFPLFVBQVUsV0FBVyxZQUFhLFNBQVMsVUFDbkQ7QUFDRixRQUFJLFdBQ0QsT0FBTyxNQUFNLGlCQUFpQixZQUFZLE1BQU0sZ0JBQ2hELE9BQU8sVUFBVSxpQkFBaUIsWUFBYSxTQUFTLGdCQUN6RDtBQU9GLFFBQUksQ0FBQyxVQUFVO0FBQ2IsWUFBTSxZQUNILE9BQU8sTUFBTSxrQkFBa0IsWUFBWSxNQUFNLGlCQUNqRCxPQUFPLFVBQVUsa0JBQWtCLFlBQWEsU0FBUyxpQkFDMUQsUUFBUSxvQkFBSSxLQUFLLENBQUM7QUFDcEIsWUFBTSxTQUFTLG9CQUFJLEtBQUssR0FBRyxVQUFVLE1BQU0sR0FBRyxFQUFFLENBQUMsWUFBWTtBQUM3RCxVQUFJLENBQUMsT0FBTyxNQUFNLE9BQU8sUUFBUSxDQUFDLEdBQUc7QUFDbkMsbUJBQVcsUUFBUSxjQUFjLFFBQVEsTUFBTSxDQUFDO0FBQ2hELGNBQU0sZUFBZTtBQUFBLE1BQ3ZCO0FBQUEsSUFDRjtBQUVBLFFBQUksVUFBVTtBQUNaLFlBQU0sUUFBUSxvQkFBSSxLQUFLLEdBQUcsUUFBUSxZQUFZO0FBQzlDLFVBQUksQ0FBQyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUMsR0FBRztBQUNsQyxjQUFNLE1BQU0sV0FBVyxZQUFZLGFBQWEsS0FBSyxJQUFJLFdBQVcsS0FBSztBQUN6RSxZQUFJLENBQUMsTUFBTSxXQUFZLE9BQU0sYUFBYSxRQUFRLEdBQUc7QUFDckQsWUFBSSxDQUFDLE1BQU0sYUFBYyxPQUFNLGVBQWUsU0FBUyxRQUFRLEtBQUs7QUFBQSxNQUN0RTtBQUFBLElBQ0Y7QUFFQSxRQUFJLENBQUMsTUFBTSxpQkFBaUIsQ0FBQyxVQUFVLGVBQWU7QUFDcEQsWUFBTSxnQkFBZ0IsUUFBUSxvQkFBSSxLQUFLLENBQUM7QUFBQSxJQUMxQztBQUFBLEVBQ0Y7QUFDRjtBQUVBLElBQU8sd0JBQVE7OztBQ25GZixJQUFNLHFCQUEyQjtBQUFBLEVBQy9CLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFFBQVEsQ0FBQyxjQUFjO0FBQUEsRUFDdkIsVUFBVTtBQUFBLEVBQ1YsYUFBYTtBQUFBLEVBQ2IsU0FBUyxPQUFPLFFBQXFCO0FBQ25DLFVBQU0sRUFBRSxNQUFNLElBQUk7QUFLbEIsUUFBSSxPQUFPLE1BQU0sYUFBYSxZQUFZLE1BQU0sU0FBVTtBQUMxRCxVQUFNLE1BQU0sSUFBSTtBQUNoQixRQUFJLENBQUMsSUFBSztBQVNWLFFBQUk7QUFFRixZQUFNLFVBQVUsTUFBTSxJQUFJLE9BQU8sbUJBQW1CLEVBQUUsS0FBSztBQUFBLFFBQ3pELE9BQU8sRUFBRSxVQUFVLFlBQVk7QUFBQSxRQUFHLFFBQVEsQ0FBQyxTQUFTO0FBQUEsUUFBRyxLQUFLO0FBQUEsTUFDOUQsQ0FBQztBQUNELFlBQU0sU0FBUyxNQUFNO0FBQUEsUUFDbkIsSUFBSTtBQUFBLFdBQ0QsV0FBVyxDQUFDLEdBQ1YsSUFBSSxDQUFDLE1BQU8sT0FBTyxFQUFFLFlBQVksV0FBVyxFQUFFLFVBQVUsRUFBRyxFQUMzRCxPQUFPLE9BQU87QUFBQSxRQUNuQjtBQUFBLE1BQ0Y7QUFDQSxVQUFJLE9BQU8sV0FBVyxFQUFHO0FBR3pCLFVBQUk7QUFDSixVQUFJLFlBQVk7QUFDaEIsaUJBQVcsU0FBUyxRQUFRO0FBQzFCLGNBQU0sWUFBWSxNQUFNLElBQUksT0FBTyxVQUFVLEVBQUUsTUFBTTtBQUFBLFVBQ25ELE9BQU8sRUFBRSxVQUFVLE9BQU8sY0FBYyxNQUFNO0FBQUEsUUFDaEQsQ0FBQztBQUNELFlBQUksWUFBWSxXQUFXO0FBQ3pCLHNCQUFZO0FBQ1osaUJBQU87QUFBQSxRQUNUO0FBQUEsTUFDRjtBQUNBLFVBQUksS0FBTSxPQUFNLFdBQVc7QUFBQSxJQUM3QixRQUFRO0FBQUEsSUFLUjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLElBQU0sV0FBaUI7QUFBQSxFQUNyQixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixRQUFRLENBQUMsZ0JBQWdCLGdCQUFnQixhQUFhO0FBQUEsRUFDdEQsVUFBVTtBQUFBLEVBQ1YsYUFDRTtBQUFBLEVBQ0YsU0FBUyxPQUFPLFFBQXFCO0FBSW5DLGFBQVMsT0FDUCxTQUNBLE1BQ0EsUUFDQSxjQUFzQixTQUNmO0FBQ1AsWUFBTSxNQUFNLElBQUksTUFBTSxPQUFPO0FBSzdCLFVBQUksT0FBTztBQUNYLFVBQUksU0FBUztBQUNiLFVBQUksY0FBYztBQUNsQixhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sRUFBRSxPQUFPLE1BQU0sSUFBSTtBQUV6QixVQUFNLHdCQUF3QixvQkFBSSxJQUFJLENBQUMsY0FBYyxXQUFXLFlBQVksQ0FBQztBQUM3RSxVQUFNLHVCQUF1QjtBQUM3QixhQUFTLGNBQWNDLFFBQXdDO0FBQzdELFVBQUksUUFBUTtBQUNaLFlBQU0sUUFBUSxPQUFPQSxPQUFNLFVBQVUsV0FBV0EsT0FBTSxRQUFRO0FBQzlELFlBQU0sUUFBUSxPQUFPQSxPQUFNLFVBQVUsV0FBV0EsT0FBTSxRQUFRO0FBQzlELFlBQU0sUUFBUSxPQUFPQSxPQUFNLFVBQVUsV0FBV0EsT0FBTSxRQUFRO0FBQzlELFlBQU0sV0FBVyxPQUFPQSxPQUFNLGFBQWEsV0FBV0EsT0FBTSxXQUFXO0FBQ3ZFLFlBQU0sWUFBWSxPQUFPQSxPQUFNLHdCQUF3QixXQUFXQSxPQUFNLHNCQUFzQjtBQUM5RixZQUFNLFVBQVUsT0FBT0EsT0FBTSxtQkFBbUIsV0FBV0EsT0FBTSxpQkFBaUI7QUFDbEYsVUFBSSxTQUFTLENBQUMsOENBQThDLEtBQUssS0FBSyxFQUFHLFVBQVM7QUFDbEYsVUFBSSxNQUFNLFNBQVMsRUFBRyxVQUFTO0FBQy9CLFVBQUkscUJBQXFCLEtBQUssS0FBSyxFQUFHLFVBQVM7QUFDL0MsVUFBSSxzQkFBc0IsSUFBSSxRQUFRLEVBQUcsVUFBUztBQUNsRCxVQUFJLGFBQWEsSUFBSyxVQUFTO0FBQy9CLFVBQUksV0FBVyxJQUFZLFVBQVM7QUFHcEMsWUFBTSxVQUFVLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssQ0FBQztBQUM5QyxhQUFPLEtBQUssTUFBTSxPQUFPO0FBQUEsSUFDM0I7QUFFQSxRQUFJLFVBQVUsZ0JBQWdCO0FBYTVCLFlBQU0sb0JBQW9CLENBQUMsSUFBSSxNQUFNLE1BQU0sQ0FBQyxJQUFJLFNBQVM7QUFDekQsVUFBSSxtQkFBbUI7QUFDckIsWUFBSSxDQUFDLE1BQU0sWUFBYSxPQUFNLGNBQWM7QUFDNUMsWUFBSSxDQUFDLE1BQU0sT0FBYSxPQUFNLFNBQWM7QUEyQjVDLGNBQU0sZUFBeUI7QUFDL0IsY0FBTSxvQkFBeUI7QUFDL0IsY0FBTSxvQkFBeUI7QUFDL0IsY0FBTSx3QkFBeUI7QUFDL0IsY0FBTSxpQkFBeUI7QUFDL0IsY0FBTSxXQUF5QjtBQU8vQixjQUFNLG9CQUF5QjtBQUMvQixjQUFNLG9CQUF5QjtBQUMvQixjQUFNLHVCQUF5QjtBQUMvQixjQUFNLG1CQUF5QjtBQUFBLE1BQ2pDO0FBRUEsVUFBSSxPQUFPLE1BQU0sV0FBVyxVQUFVO0FBQ3BDLGNBQU0sU0FBUyxjQUFjLEtBQUs7QUFBQSxNQUNwQztBQUFBLElBQ0Y7QUFvQ0EsUUFBSSxVQUFVLGdCQUFnQjtBQUM1QixZQUFNLFdBQVcsSUFBSTtBQUNyQixZQUFNLGVBQWUsVUFBVSxpQkFBaUIsUUFBUSxVQUFVLFdBQVc7QUFDN0UsWUFBTSxlQUNKLENBQUMsaUJBQWlCLE1BQU0saUJBQWlCLFFBQVEsTUFBTSxXQUFXO0FBQ3BFLFlBQU0sVUFBVSxVQUFVO0FBQzFCLFVBQUksaUJBQWlCLFlBQVksYUFBYSxZQUFZLGFBQWE7QUFHckUsY0FBTSxTQUFTLENBQUMsVUFBVSxZQUFZLFVBQVUsU0FBUyxFQUN0RCxPQUFPLENBQUMsU0FBUyxPQUFPLFNBQVMsWUFBWSxLQUFLLEtBQUssTUFBTSxFQUFFLEVBQy9ELEtBQUssR0FBRztBQUNYLGNBQU0sVUFDSixPQUFPLFVBQVUsWUFBWSxXQUFXLFNBQVMsUUFBUSxLQUFLLElBQUk7QUFDcEUsY0FBTSxRQUFRLENBQUMsUUFBUSxPQUFPLEVBQUUsT0FBTyxPQUFPLEVBQUUsS0FBSyxLQUFLO0FBQzFELGNBQU0sUUFBUSxZQUFZLGFBQWEsaUJBQWlCO0FBQ3hELGNBQU07QUFBQSxVQUNKLGtCQUFrQixRQUFRLFFBQVEsS0FBSyxLQUFLLFdBQVcsb0JBQW9CLEtBQUs7QUFBQSxVQUNoRjtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFhQSxRQUFJLFVBQVUsa0JBQWtCLElBQUksTUFBTSxJQUFJO0FBQzVDLFlBQU0sV0FBVyxJQUFJO0FBQ3JCLFlBQU0sZUFBZSxVQUFVLGlCQUFpQixRQUFRLFVBQVUsV0FBVztBQUM3RSxVQUFJLGNBQWM7QUFDaEIsY0FBTSxVQUFVLG9CQUFJLElBQUk7QUFBQSxVQUN0QjtBQUFBLFVBQWU7QUFBQTtBQUFBLFVBRWY7QUFBQSxVQUFNO0FBQUEsVUFBWTtBQUFBLFVBQWM7QUFBQSxVQUNoQztBQUFBLFVBQWM7QUFBQSxVQUFjO0FBQUEsVUFBWTtBQUFBLFVBQW1CO0FBQUEsVUFBVTtBQUFBLFFBQ3ZFLENBQUM7QUFDRCxjQUFNLFlBQVksT0FBTyxLQUFLLEtBQUssRUFBRTtBQUFBLFVBQ25DLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLEtBQUssTUFBTSxDQUFDLE1BQU0sV0FBVyxDQUFDO0FBQUEsUUFDckQ7QUFDQSxZQUFJLFVBQVUsU0FBUyxHQUFHO0FBRXhCLGdCQUFNLG1CQUFtQixvQkFBSSxJQUFJO0FBQUEsWUFDL0I7QUFBQSxZQUFxQjtBQUFBLFlBQXFCO0FBQUEsWUFDMUM7QUFBQSxZQUFxQjtBQUFBLFVBQ3ZCLENBQUM7QUEyREQsZ0JBQU0scUJBQXFCLFVBQVU7QUFBQSxZQUNuQyxDQUFDLE1BQU0saUJBQWlCLElBQUksQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLFFBQVEsV0FBVyxDQUFDLEtBQUs7QUFBQSxVQUMxRTtBQUNBLGNBQUksbUJBQW9CO0FBUXhCLGdCQUFNLFNBQVMsQ0FBQyxVQUFVLFlBQVksVUFBVSxTQUFTLEVBQ3RELE9BQU8sQ0FBQyxTQUFTLE9BQU8sU0FBUyxZQUFZLEtBQUssS0FBSyxNQUFNLEVBQUUsRUFDL0QsS0FBSyxHQUFHO0FBQ1gsZ0JBQU0sVUFDSixPQUFPLFVBQVUsWUFBWSxXQUFXLFNBQVMsUUFBUSxLQUFLLElBQUk7QUFDcEUsZ0JBQU0sUUFBUSxDQUFDLFFBQVEsT0FBTyxFQUFFLE9BQU8sT0FBTyxFQUFFLEtBQUssS0FBSztBQUUxRCxnQkFBTTtBQUFBLFlBQ0osZUFBZSxRQUFRLGtCQUFrQixLQUFLLEtBQUssa0JBQWtCLGdCQUFnQixVQUFVLEtBQUssSUFBSSxDQUFDO0FBQUEsWUFDekc7QUFBQSxZQUNBO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVBLFFBQUksVUFBVSxlQUFlO0FBQzNCLFlBQU0sV0FBVyxJQUFJO0FBQ3JCLFlBQU0sa0JBQ0osTUFBTSxXQUFXLGVBQWUsVUFBVSxXQUFXO0FBQ3ZELFVBQUksQ0FBQyxnQkFBaUI7QUFFdEIsWUFBTSxNQUFNLElBQUk7QUFDaEIsVUFBSSxDQUFDLElBQUs7QUFFVixZQUFNLFNBQ0gsT0FBTyxNQUFNLE9BQU8sWUFBWSxNQUFNLE1BQ3RDLE9BQU8sVUFBVSxPQUFPLFlBQVksU0FBUyxNQUM5QztBQUNGLFlBQU0sVUFDSCxPQUFPLE1BQU0sYUFBYSxZQUFZLE1BQU0sWUFDNUMsT0FBTyxVQUFVLGFBQWEsWUFBWSxTQUFTLFlBQ3BELElBQUksTUFBTTtBQVFaLFlBQU0sVUFBVSxvQkFBSSxLQUFLO0FBQ3pCLGNBQVEsV0FBVyxRQUFRLFdBQVcsSUFBSSxDQUFDO0FBZTNDLFlBQU0sU0FBUztBQUFBLFFBQ1osT0FBTyxNQUFNLGVBQWUsWUFBWSxNQUFNLGNBQWUsVUFBVTtBQUFBLFFBQ3ZFLE9BQU8sTUFBTSxjQUFjLFlBQVksTUFBTSxhQUFjLFVBQVU7QUFBQSxNQUN4RSxFQUNHLE9BQU8sQ0FBQyxTQUFTLE9BQU8sU0FBUyxZQUFZLEtBQUssS0FBSyxNQUFNLEVBQUUsRUFDL0QsS0FBSyxHQUFHO0FBQ1gsWUFBTSxVQUNILE9BQU8sTUFBTSxZQUFZLFlBQVksTUFBTSxRQUFRLEtBQUssS0FDeEQsT0FBTyxVQUFVLFlBQVksWUFBWSxTQUFTLFFBQVEsS0FBSyxLQUNoRTtBQUNGLFlBQU0sUUFBUSxDQUFDLFFBQVEsT0FBTyxFQUFFLE9BQU8sT0FBTyxFQUFFLEtBQUssS0FBSztBQUMxRCxZQUFNLFNBQVMsUUFDWCxrQ0FBa0MsS0FBSyxLQUN2QztBQUVKLFVBQUk7QUFDRixjQUFNLElBQUksT0FBTyxVQUFVLEVBQUUsT0FBTztBQUFBLFVBQ2xDLFNBQVMsT0FBTyxTQUFTLE1BQU0sR0FBRyxPQUFPLE1BQU0sR0FBRyxHQUFHLENBQUMsV0FBTTtBQUFBLFVBQzVELFFBQVE7QUFBQSxVQUNSLFVBQVU7QUFBQSxVQUNWLE1BQU07QUFBQSxVQUNOLFVBQVUsUUFBUSxZQUFZLEVBQUUsTUFBTSxHQUFHLEVBQUU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBUTNDLFVBQVU7QUFBQSxVQUNWLGlCQUFpQjtBQUFBLFVBQ2pCLGlCQUFpQjtBQUFBLFFBQ25CLENBQUM7QUFBQSxNQUNILFFBQVE7QUFBQSxNQUlSO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQW1EQSxJQUFNLHlCQUErQjtBQUFBLEVBQ25DLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFFBQVEsQ0FBQyxnQkFBZ0IsY0FBYztBQUFBLEVBQ3ZDLFVBQVU7QUFBQSxFQUNWLGFBQ0U7QUFBQSxFQUNGLFNBQVMsT0FBTyxRQUFxQjtBQUNuQyxVQUFNLEVBQUUsT0FBTyxNQUFNLElBQUk7QUFJekIsVUFBTSxhQUFhO0FBR25CLFVBQU0sVUFBVSxDQUFDLFVBQ2YsVUFBVSxVQUFhLFVBQVUsUUFBUyxPQUFPLFVBQVUsWUFBWSxNQUFNLEtBQUssTUFBTTtBQUkxRixRQUFJLE9BQU8sTUFBTSxVQUFVLFVBQVU7QUFDbkMsWUFBTSxRQUFRLE1BQU0sTUFBTSxLQUFLLEVBQUUsWUFBWTtBQUFBLElBQy9DO0FBQ0EsVUFBTSxRQUFRLE9BQU8sTUFBTSxVQUFVLFdBQVcsTUFBTSxRQUFRO0FBZTlELFFBQUksYUFBYSxPQUFPO0FBQ3RCLFlBQU0sYUFBYSxNQUFNO0FBQ3pCLFlBQU0sb0JBQ0osT0FBTyxlQUFlLFdBQ2xCLFdBQVcsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLFFBQVEsR0FBRyxJQUNuRDtBQUNOLFlBQU0scUJBQXFCLHNCQUFzQixLQUFLLE9BQU87QUFBQSxJQUMvRDtBQWlFQSxRQUFJLFVBQVUsa0JBQWtCLElBQUksVUFBVSxTQUFTLFdBQVc7QUFDaEUsWUFBTSxXQUFXLElBQUk7QUFDckIsWUFBTSxlQUF1QztBQUFBLFFBQzNDLFVBQVU7QUFBQSxRQUNWLGFBQWE7QUFBQSxNQUNmO0FBQ0EsWUFBTSxXQUFXLHVCQUF1QixTQUFTLENBQUMsUUFBUSxNQUFNLGlCQUFpQjtBQUNqRixZQUFNLFdBQVcsVUFBVTtBQUMzQixZQUFNLE9BQU8sT0FBTyxhQUFhLFdBQVcsYUFBYSxRQUFRLElBQUk7QUFDckUsVUFBSSxDQUFDLFlBQVksUUFBUSxRQUFRLFNBQVMsUUFBUSxNQUFNLElBQUksQ0FBQyxHQUFHO0FBOEI5RCxZQUFJLEVBQUUsc0JBQXNCLFVBQVUsVUFBVSxxQkFBcUIsYUFBYTtBQUNoRixnQkFBTSxvQkFBb0I7QUFBQSxRQUc1QixPQUFPO0FBQ0wsZ0JBQU0sb0JBQW9CO0FBWTFCLGdCQUFNLG1CQUFtQjtBQUFBLFFBQzNCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxRQUFJLFVBQVUsa0JBQWtCLENBQUMsTUFBTztBQUt4QyxRQUFJLENBQUMsUUFBUSxNQUFNLGdCQUFnQixLQUFLLENBQUMsUUFBUSxNQUFNLGlCQUFpQixFQUFHO0FBRTNFLFVBQU0sTUFBTSxJQUFJO0FBQ2hCLFFBQUksQ0FBQyxJQUFLO0FBR1YsVUFBTSxXQUFXLENBQUMsU0FBNkQ7QUFDN0UsVUFBSTtBQUNKLFVBQUksVUFBVTtBQUNkLGlCQUFXLE9BQU8sTUFBTTtBQUN0QixjQUFNLEtBQUssT0FBTyxJQUFJLE9BQU8sV0FBVyxJQUFJLEtBQUs7QUFDakQsWUFBSSxDQUFDLEdBQUk7QUFDVCxjQUFNLE1BQU0sSUFBSTtBQUNoQixjQUFNLFNBQ0osT0FBTyxRQUFRLFlBQVksT0FBTyxRQUFRLFlBQVksZUFBZSxPQUNqRSxJQUFJLEtBQUssR0FBYSxFQUFFLFFBQVEsSUFDaEMsT0FBTztBQUNiLGNBQU0sTUFBTSxPQUFPLFNBQVMsTUFBTSxJQUFJLFNBQVM7QUFDL0MsWUFBSSxTQUFTLFVBQWEsTUFBTSxTQUFTO0FBQ3ZDLGlCQUFPO0FBQ1Asb0JBQVU7QUFBQSxRQUNaO0FBQUEsTUFDRjtBQUNBLGFBQU87QUFBQSxJQUNUO0FBUUEsUUFBSTtBQUNGLFlBQU1DLFlBQVcsTUFBTSxJQUFJLE9BQU8sYUFBYSxFQUFFLEtBQUs7QUFBQSxRQUNwRCxPQUFPLEVBQUUsTUFBTTtBQUFBLFFBQ2YsUUFBUSxDQUFDLE1BQU0sWUFBWTtBQUFBLFFBQzNCLEtBQUs7QUFBQSxNQUNQLENBQUM7QUFDRCxZQUFNLFlBQVksU0FBU0EsYUFBWSxDQUFDLENBQUM7QUFDekMsVUFBSSxXQUFXO0FBQ2IsY0FBTSxvQkFBb0I7QUFDMUIsY0FBTSx1QkFBdUI7QUFDN0IsY0FBTSxtQkFBbUI7QUFDekI7QUFBQSxNQUNGO0FBTUEsWUFBTUMsU0FBUSxNQUFNLElBQUksT0FBTyxVQUFVLEVBQUUsS0FBSztBQUFBLFFBQzlDLE9BQU8sRUFBRSxPQUFPLGNBQWMsTUFBTTtBQUFBLFFBQ3BDLFFBQVEsQ0FBQyxNQUFNLFlBQVk7QUFBQSxRQUMzQixLQUFLO0FBQUEsTUFDUCxDQUFDO0FBQ0QsWUFBTSxTQUFTLFNBQVNBLFVBQVMsQ0FBQyxDQUFDO0FBQ25DLFVBQUksUUFBUTtBQUNWLGNBQU0sb0JBQW9CO0FBQzFCLGNBQU0sb0JBQW9CO0FBQzFCLGNBQU0sbUJBQW1CO0FBQUEsTUFDM0I7QUFBQSxJQUNGLFFBQVE7QUFBQSxJQUVSO0FBQUEsRUFDRjtBQUNGO0FBRUEsSUFBTyxvQkFBUSxDQUFDLG9CQUFvQixVQUFVLHNCQUFzQjs7O0FDMXNCcEUsSUFBTSxnQ0FBc0M7QUFBQSxFQUMxQyxNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixRQUFRLENBQUMsYUFBYTtBQUFBLEVBQ3RCLFVBQVU7QUFBQSxFQUNWLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQSxFQUNULE9BQU87QUFBQSxFQUNQLGFBQWE7QUFBQSxFQUNiLFNBQVMsT0FBTyxRQUFxQjtBQUNuQyxVQUFNLE1BQU0sSUFBSTtBQUNoQixRQUFJLENBQUMsSUFBSztBQUNWLFVBQU0sRUFBRSxNQUFNLElBQUk7QUFDbEIsVUFBTSxXQUFXLElBQUk7QUFDckIsUUFBSSxPQUFPLGlCQUFpQixLQUFNO0FBQ2xDLFFBQUksVUFBVSxpQkFBaUIsS0FBTTtBQUNyQyxVQUFNLFNBQ0gsT0FBTyxPQUFPLE9BQU8sWUFBWSxNQUFNLE9BQ3ZDLE9BQU8sVUFBVSxPQUFPLFdBQVksU0FBUyxLQUFnQjtBQUNoRSxRQUFJLENBQUMsT0FBUTtBQUdiLFVBQU0sY0FBYyxNQUFNLElBQUksT0FBTyxxQkFBcUIsRUFBRSxLQUFLO0FBQUEsTUFDL0QsT0FBTyxFQUFFLFVBQVUsT0FBTztBQUFBLE1BQUcsUUFBUSxDQUFDLE1BQU0sZ0JBQWdCLFFBQVE7QUFBQSxNQUFHLEtBQUs7QUFBQSxJQUM5RSxDQUFDO0FBQ0QsZUFBVyxLQUFLLGFBQWE7QUFDM0IsWUFBTSxXQUFXLE9BQU8sRUFBRSxPQUFPLFdBQVcsRUFBRSxLQUFLO0FBQ25ELFVBQUksQ0FBQyxTQUFVO0FBQ2YsVUFBSSxFQUFFLFdBQVcsVUFBVSxFQUFFLFdBQVcsWUFBYTtBQUNyRCxZQUFNLElBQUksT0FBTyxxQkFBcUIsRUFBRTtBQUFBLFFBQ3RDLEVBQUUsSUFBSSxVQUFVLFFBQVEsWUFBWTtBQUFBLFFBQ3BDLEVBQUUsT0FBTyxFQUFFLElBQUksU0FBUyxFQUFFO0FBQUEsTUFDNUI7QUFBQSxJQUNGO0FBQ0EsVUFBTSxjQUFjLE1BQU0sS0FBSyxJQUFJO0FBQUEsTUFDakMsWUFBWSxJQUFJLENBQUMsTUFBTyxPQUFPLEVBQUUsaUJBQWlCLFdBQVcsRUFBRSxlQUFlLEVBQUcsRUFBRSxPQUFPLE9BQU87QUFBQSxJQUNuRyxDQUFDO0FBQ0QsZUFBVyxNQUFNLGFBQWE7QUFFNUIsWUFBTSxhQUFhLE1BQU0sSUFBSSxPQUFPLHFCQUFxQixFQUFFLEtBQUs7QUFBQSxRQUM5RCxPQUFPLEVBQUUsY0FBYyxHQUFHO0FBQUEsUUFBRyxRQUFRLENBQUMsWUFBWSxRQUFRO0FBQUEsUUFBRyxLQUFLO0FBQUEsTUFDcEUsQ0FBQztBQUNELFlBQU0sVUFBVSxNQUFNLEtBQUssSUFBSTtBQUFBLFFBQzdCLFdBQVcsSUFBSSxDQUFDLE1BQU8sT0FBTyxFQUFFLGFBQWEsV0FBVyxFQUFFLFdBQVcsRUFBRyxFQUFFLE9BQU8sT0FBTztBQUFBLE1BQzFGLENBQUM7QUFDRCxZQUFNLGlCQUFpQixRQUFRLFNBQVMsSUFDcEMsTUFBTSxJQUFJLE9BQU8sVUFBVSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssUUFBUSxHQUFHLGNBQWMsS0FBSyxFQUFFLENBQUMsSUFDMUY7QUFDSixZQUFNLG1CQUFtQixNQUFNLElBQUksT0FBTyxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDbEcsWUFBTSxTQUFTLE1BQU0sSUFBSSxPQUFPLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsY0FBYyxJQUFJLE9BQU8sYUFBYSxFQUFFLENBQUM7QUFDN0csWUFBTSxVQUFVLE1BQU0sSUFBSSxPQUFPLGlCQUFpQixFQUFFLEtBQUs7QUFBQSxRQUN2RCxPQUFPLEVBQUUsY0FBYyxJQUFJLE9BQU8sYUFBYTtBQUFBLFFBQUcsUUFBUSxDQUFDLFFBQVE7QUFBQSxRQUFHLEtBQUs7QUFBQSxNQUM3RSxDQUFDO0FBQ0QsWUFBTSxnQkFBZ0IsUUFBUTtBQUFBLFFBQzVCLENBQUMsS0FBSyxRQUFRLE9BQU8sT0FBTyxJQUFJLFdBQVcsV0FBVyxJQUFJLFNBQVMsT0FBTyxJQUFJLE1BQU0sS0FBSztBQUFBLFFBQUk7QUFBQSxNQUMvRjtBQUNBLFlBQU0sSUFBSSxPQUFPLGNBQWMsRUFBRSxPQUFPO0FBQUEsUUFDdEM7QUFBQSxRQUNBLFVBQVUsV0FBVztBQUFBLFFBQ3JCLGVBQWUsV0FBVyxPQUFPLENBQUMsTUFBTSxFQUFFLFdBQVcsZUFBZSxFQUFFLFdBQVcsV0FBVyxFQUFFO0FBQUEsUUFDOUYsV0FBVyxRQUFRO0FBQUEsUUFDbkIscUJBQXFCO0FBQUEsUUFDckIsbUJBQW1CO0FBQUEsUUFDbkIsdUJBQXVCO0FBQUEsUUFDdkIsZ0JBQWdCO0FBQUEsTUFDbEIsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUFBLElBRXRCO0FBQUEsRUFDRjtBQUNGO0FBRUEsSUFBTyxxQ0FBUSxDQUFDLDZCQUE2Qjs7O0FDbkg3QyxJQUFNLDRCQUFrQztBQUFBLEVBQ3RDLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFFBQVEsQ0FBQyxnQkFBZ0IsY0FBYztBQUFBLEVBQ3ZDLFVBQVU7QUFBQSxFQUNWLGFBQ0U7QUFBQSxFQUNGLFNBQVMsT0FBTyxRQUFxQjtBQUluQyxhQUFTLE9BQ1AsU0FDQSxNQUNBLFFBQ0EsY0FBc0IsU0FDZjtBQUNQLFlBQU0sTUFBTSxJQUFJLE1BQU0sT0FBTztBQUs3QixVQUFJLE9BQU87QUFDWCxVQUFJLFNBQVM7QUFDYixVQUFJLGNBQWM7QUFDbEIsYUFBTztBQUFBLElBQ1Q7QUFLQSxVQUFNLG9CQUE0QztBQUFBLE1BQ2hELGFBQWE7QUFBQSxNQUNiLGVBQWU7QUFBQSxNQUNmLGdCQUFnQjtBQUFBLE1BQ2hCLFVBQVU7QUFBQSxNQUNWLGFBQWE7QUFBQSxNQUNiLFlBQVk7QUFBQSxNQUNaLGFBQWE7QUFBQSxJQUNmO0FBQ0EsVUFBTSxtQkFBbUIsb0JBQUksSUFBSSxDQUFDLGVBQWUsYUFBYSxPQUFPLENBQUM7QUFNdEUsVUFBTSxnQkFBZ0Isb0JBQUksSUFBSTtBQUFBLE1BQzVCO0FBQUEsTUFBTTtBQUFBLE1BQVk7QUFBQSxNQUFjO0FBQUEsTUFDaEM7QUFBQSxNQUFjO0FBQUEsTUFBYztBQUFBLE1BQVk7QUFBQSxNQUFtQjtBQUFBLE1BQVU7QUFBQSxJQUN2RSxDQUFDO0FBcUNELFVBQU0sa0JBQWtCLG9CQUFJLElBQUk7QUFBQSxNQUM5QjtBQUFBLE1BQW1CO0FBQUEsTUFDbkI7QUFBQSxNQUFpQztBQUFBLE1BQ2pDO0FBQUEsTUFBaUM7QUFBQSxJQUNuQyxDQUFDO0FBRUQsVUFBTSxpQkFBeUM7QUFBQSxNQUM3QyxhQUFhO0FBQUEsTUFDYixlQUFlO0FBQUEsTUFDZixnQkFBZ0I7QUFBQSxNQUNoQixVQUFVO0FBQUEsTUFDVixhQUFhO0FBQUEsTUFDYixZQUFZO0FBQUEsTUFDWixhQUFhO0FBQUEsSUFDZjtBQUVBLFVBQU0sRUFBRSxPQUFPLE1BQU0sSUFBSTtBQUN6QixVQUFNLFdBQVcsSUFBSTtBQW9DckIsUUFBSSxVQUFVLGtCQUFrQixZQUFZLElBQUksTUFBTSxJQUFJO0FBQ3hELFlBQU0sZ0JBQWlCLE1BQU0saUNBQWlDLFNBQVM7QUFDdkUsVUFBSSxrQkFBa0IsYUFBYSxrQkFBa0IsWUFBWTtBQUMvRCxjQUFNLE9BQWlCLENBQUM7QUFDeEIsWUFBSSxPQUFPLE1BQU0sVUFBVSxZQUFZLE1BQU0sVUFBVSxTQUFTLE1BQU8sTUFBSyxLQUFLLE9BQU87QUFDeEYsWUFBSSxPQUFPLE1BQU0scUJBQXFCLFlBQVksTUFBTSxxQkFBcUIsTUFBTSxNQUFNLHFCQUFxQixTQUFTLGtCQUFrQjtBQUN2SSxlQUFLLEtBQUssa0JBQWtCO0FBQUEsUUFDOUI7QUFDQSxZQUFJLEtBQUssU0FBUyxHQUFHO0FBQ25CLGdCQUFNO0FBQUEsWUFDSixzRkFBc0YsS0FBSyxLQUFLLE9BQU8sQ0FBQztBQUFBLFlBQ3hHO0FBQUEsWUFDQTtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUE0QkEsUUFBSSxVQUFVLGtCQUFrQixZQUFZLElBQUksTUFBTSxJQUFJO0FBQ3hELFlBQU0sT0FBUSxNQUFNLGlDQUFpQyxTQUFTO0FBQzlELFlBQU0sT0FBTyxNQUFNO0FBQ25CLFlBQU0sV0FBVyxTQUFTLGdCQUFnQixTQUFTLGtCQUFrQixTQUFTLFNBQVM7QUFDdkYsVUFBSSxZQUFZLFNBQVMsYUFBYSxTQUFTLGFBQWE7QUFDMUQsY0FBTTtBQUFBLFVBQ0o7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQWFBLFFBQUksVUFBVSxrQkFBa0IsWUFBWSxJQUFJLE1BQU0sSUFBSTtBQUN4RCxZQUFNLFlBQVksU0FBUztBQUMzQixZQUFNLFdBQVcsY0FBYyxnQkFBZ0IsY0FBYztBQUM3RCxVQUFJLFVBQVU7QUFDWixjQUFNLFlBQVksT0FBTyxLQUFLLEtBQUssRUFBRTtBQUFBLFVBQ25DLENBQUMsTUFBTSxDQUFDLGlCQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLEtBQUssTUFBTSxDQUFDLE1BQU0sU0FBUyxDQUFDO0FBQUEsUUFDaEg7QUFDQSxZQUFJLFVBQVUsU0FBUyxHQUFHO0FBRXhCLGdCQUFNLG1CQUFtQixvQkFBSSxJQUFJLENBQUMsZUFBZSxtQkFBbUIsY0FBYyxDQUFDO0FBMkRuRixnQkFBTSxxQkFBcUIsVUFBVTtBQUFBLFlBQ25DLENBQUMsTUFBTSxpQkFBaUIsSUFBSSxDQUFDLEtBQUssTUFBTSxDQUFDLE1BQU0sUUFBUSxXQUFXLENBQUMsS0FBSztBQUFBLFVBQzFFO0FBQ0EsY0FBSSxtQkFBb0I7QUFLeEIsZ0JBQU0sT0FBTyxPQUFPLFNBQVMsU0FBUyxXQUFXLFNBQVMsS0FBSyxLQUFLLElBQUk7QUFDeEUsZ0JBQU0sVUFBVSxPQUFPLGVBQWUsSUFBSSxLQUFLO0FBQy9DLGdCQUFNO0FBQUEsWUFDSixHQUFHLE9BQU8sZUFBZSxTQUFTLFdBQVcsQ0FBQyxHQUFHLGdCQUFnQixFQUFFLEtBQUssSUFBSSxDQUFDLDhCQUE4QixVQUFVLEtBQUssSUFBSSxDQUFDO0FBQUEsWUFDL0g7QUFBQSxZQUNBO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQVNBLFFBQUksSUFBSSxVQUFVLGtCQUFrQixJQUFJLFVBQVUsU0FBUyxVQUFXO0FBR3RFLFVBQU0sU0FDSixPQUFPLE1BQU0sV0FBVyxXQUNwQixNQUFNLFNBQ04sT0FBTyxVQUFVLFdBQVcsV0FDekIsU0FBUyxTQUNWO0FBQ1IsVUFBTSxRQUNKLE9BQU8sTUFBTSxVQUFVLFdBQ25CLE1BQU0sUUFDTixPQUFPLFVBQVUsVUFBVSxXQUN4QixTQUFTLFFBQ1Y7QUFDUixRQUFJLE9BQU8sV0FBVyxZQUFZLFNBQVMsa0JBQWtCLEtBQUssTUFBTSxRQUFXO0FBQ2pGLFlBQU0sbUJBQW1CLEtBQUssTUFBTSxTQUFTLGtCQUFrQixLQUFLLENBQUMsSUFBSTtBQUFBLElBQzNFO0FBQ0EsUUFBSSxTQUFTLGtCQUFrQixLQUFLLE1BQU0sUUFBVztBQUVuRCxZQUFNLGNBQWMsa0JBQWtCLEtBQUs7QUFBQSxJQUM3QztBQUVBLFFBQUksU0FBUyxlQUFlLEtBQUssTUFBTSxRQUFXO0FBQ2hELFlBQU0sZUFBZSxVQUFVLGtCQUFtQixPQUFPLE1BQU0sVUFBVSxZQUFZLE1BQU0sVUFBVSxVQUFVO0FBQy9HLFVBQUksYUFBYyxPQUFNLG9CQUFvQixlQUFlLEtBQUs7QUFBQSxJQUNsRTtBQU1BLFFBQUksVUFBVSxrQkFBa0IsQ0FBQyxNQUFNLGtCQUFrQjtBQUN2RCxZQUFNLG9CQUFtQixvQkFBSSxLQUFLLEdBQUUsWUFBWSxFQUFFLE1BQU0sR0FBRyxFQUFFO0FBQUEsSUFDL0Q7QUFFQSxRQUFJLFVBQVUsa0JBQWtCLFVBQVU7QUFFeEMsVUFBSSxNQUFNLFVBQVUsZ0JBQWdCLFNBQVMsVUFBVSxnQkFBZ0IsQ0FBQyxNQUFNLFlBQVk7QUFDeEYsY0FBTSxjQUFhLG9CQUFJLEtBQUssR0FBRSxZQUFZLEVBQUUsTUFBTSxHQUFHLEVBQUU7QUFBQSxNQUN6RDtBQU9BLFVBQUksT0FBTyxNQUFNLFVBQVUsWUFBWSxNQUFNLFVBQVUsU0FBUyxPQUFPO0FBQ3JFLGNBQU0sb0JBQW1CLG9CQUFJLEtBQUssR0FBRSxZQUFZLEVBQUUsTUFBTSxHQUFHLEVBQUU7QUFBQSxNQUMvRDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFnQkEsSUFBTSxxQkFBMkI7QUFBQSxFQUMvQixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixRQUFRLENBQUMsYUFBYTtBQUFBLEVBQ3RCLFVBQVU7QUFBQSxFQUNWLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQSxFQUNULE9BQU87QUFBQSxFQUNQLGFBQ0U7QUFBQSxFQUNGLFNBQVMsT0FBTyxRQUFxQjtBQUNuQyxVQUFNLEVBQUUsTUFBTSxJQUFJO0FBQ2xCLFVBQU0sV0FBVyxJQUFJO0FBQ3JCLFVBQU0sWUFBWSxNQUFNLFVBQVUsZ0JBQWdCLFVBQVUsVUFBVTtBQUN0RSxRQUFJLENBQUMsVUFBVztBQUNoQixVQUFNLE1BQU0sSUFBSTtBQUNoQixRQUFJLENBQUMsSUFBSztBQUVWLFVBQU0sWUFDSCxPQUFPLE1BQU0sZ0JBQWdCLFlBQVksTUFBTSxlQUMvQyxPQUFPLFVBQVUsZ0JBQWdCLFlBQVksU0FBUyxlQUN2RDtBQUNGLFFBQUksQ0FBQyxVQUFXO0FBRWhCLFVBQU0sVUFBVSxNQUFNLElBQUksT0FBTyxhQUFhLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsRUFBRSxDQUFDO0FBQ3BGLFFBQUksV0FBVyxRQUFRLFNBQVMsWUFBWTtBQUMxQyxZQUFNLElBQUksT0FBTyxhQUFhLEVBQUU7QUFBQSxRQUM5QixFQUFFLElBQUksV0FBVyxNQUFNLFdBQVc7QUFBQSxRQUNsQyxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsRUFBRTtBQUFBLE1BQzdCO0FBQUEsSUFDRjtBQUVBLFVBQU0sUUFBUyxPQUFPLE1BQU0sT0FBTyxZQUFZLE1BQU0sTUFBTyxVQUFVO0FBQ3RFLFVBQU0sVUFDSCxPQUFPLE1BQU0sYUFBYSxZQUFZLE1BQU0sWUFDNUMsT0FBTyxVQUFVLGFBQWEsWUFBWSxTQUFTLFlBQ3BELElBQUksTUFBTTtBQUtaLFVBQU0sTUFBTSxvQkFBSSxLQUFLO0FBQ3JCLFFBQUksV0FBVyxJQUFJLFdBQVcsSUFBSSxDQUFDO0FBWW5DLFVBQU0sVUFDSCxPQUFPLE1BQU0sU0FBUyxZQUFZLE1BQU0sS0FBSyxLQUFLLEtBQ2xELE9BQU8sVUFBVSxTQUFTLFlBQVksU0FBUyxLQUFLLEtBQUssS0FDMUQ7QUFDRixVQUFNLFNBQVMsVUFDWCx5Q0FBeUMsT0FBTyxLQUNoRDtBQUNKLFVBQU0sSUFBSSxPQUFPLFVBQVUsRUFBRSxPQUFPO0FBQUEsTUFDbEMsU0FBUyxPQUFPLFNBQVMsTUFBTSxHQUFHLE9BQU8sTUFBTSxHQUFHLEdBQUcsQ0FBQyxXQUFNO0FBQUEsTUFDNUQsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsTUFBTTtBQUFBLE1BQ04sVUFBVSxJQUFJLFlBQVksRUFBRSxNQUFNLEdBQUcsRUFBRTtBQUFBLE1BQ3ZDLFVBQVU7QUFBQSxNQUNWLGlCQUFpQjtBQUFBLE1BQ2pCLHdCQUF3QjtBQUFBLE1BQ3hCLG9CQUFvQjtBQUFBLElBQ3RCLENBQUM7QUFBQSxFQUNIO0FBQ0Y7QUF5RkEsSUFBTSxtQ0FBeUM7QUFBQSxFQUM3QyxNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixRQUFRLENBQUMsY0FBYztBQUFBLEVBQ3ZCLFVBQVU7QUFBQSxFQUNWLE9BQU87QUFBQSxFQUNQLGFBQ0U7QUFBQSxFQUNGLFNBQVMsT0FBTyxRQUFxQjtBQUluQyxhQUFTLE9BQ1AsU0FDQSxNQUNBLFFBQ0EsY0FBc0IsU0FDZjtBQUNQLFlBQU0sTUFBTSxJQUFJLE1BQU0sT0FBTztBQUs3QixVQUFJLE9BQU87QUFDWCxVQUFJLFNBQVM7QUFDYixVQUFJLGNBQWM7QUFDbEIsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLE1BQU0sSUFBSTtBQUNoQixRQUFJLENBQUMsSUFBSztBQUNWLFVBQU0sWUFBWSxJQUFJLE1BQU07QUFDNUIsUUFBSSxPQUFPLGNBQWMsWUFBWSxjQUFjLEdBQUk7QUFFdkQsVUFBTSxNQUFNLElBQUksTUFBTTtBQUN0QixVQUFNLFVBQVUsTUFBTSxJQUFJLE9BQU8sYUFBYSxFQUFFLFFBQVE7QUFBQSxNQUN0RCxPQUFPLEVBQUUsSUFBSSxXQUFXLEdBQUksT0FBTyxRQUFRLFlBQVksTUFBTSxFQUFFLGlCQUFpQixJQUFJLElBQUksQ0FBQyxFQUFHO0FBQUEsTUFDNUYsUUFBUSxDQUFDLHVCQUF1QjtBQUFBLElBQ2xDLENBQUM7QUFDRCxRQUFJLENBQUMsV0FBVyxRQUFRLDBCQUEwQixrQkFBbUI7QUFHckUsVUFBTTtBQUFBLE1BQ0o7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxJQUFPLDJCQUFRO0FBQUEsRUFDYjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7OztBQy9oQkEsSUFBTSw2QkFBbUM7QUFBQSxFQUN2QyxNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixRQUFRLENBQUMsZUFBZSxlQUFlLGFBQWE7QUFBQSxFQUNwRCxVQUFVO0FBQUEsRUFDVixPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsRUFDVCxPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFDYixTQUFTLE9BQU8sUUFBcUI7QUFDbkMsVUFBTSxNQUFNLElBQUk7QUFDaEIsUUFBSSxDQUFDLElBQUs7QUFDVixVQUFNLEVBQUUsTUFBTSxJQUFJO0FBQ2xCLFVBQU0sV0FBVyxJQUFJO0FBQ3JCLFVBQU0sY0FBYyxNQUFNLEtBQUssSUFBSSxJQUFJO0FBQUEsTUFDckMsT0FBTyxPQUFPLGlCQUFpQixXQUFXLE1BQU0sZUFBZTtBQUFBLE1BQy9ELE9BQU8sVUFBVSxpQkFBaUIsV0FBWSxTQUFTLGVBQTBCO0FBQUEsSUFDbkYsRUFBRSxPQUFPLE9BQU8sQ0FBQyxDQUFDO0FBQ2xCLGVBQVcsTUFBTSxhQUFhO0FBRTVCLFlBQU0sYUFBYSxNQUFNLElBQUksT0FBTyxxQkFBcUIsRUFBRSxLQUFLO0FBQUEsUUFDOUQsT0FBTyxFQUFFLGNBQWMsR0FBRztBQUFBLFFBQUcsUUFBUSxDQUFDLFlBQVksUUFBUTtBQUFBLFFBQUcsS0FBSztBQUFBLE1BQ3BFLENBQUM7QUFDRCxZQUFNLFVBQVUsTUFBTSxLQUFLLElBQUk7QUFBQSxRQUM3QixXQUFXLElBQUksQ0FBQyxNQUFPLE9BQU8sRUFBRSxhQUFhLFdBQVcsRUFBRSxXQUFXLEVBQUcsRUFBRSxPQUFPLE9BQU87QUFBQSxNQUMxRixDQUFDO0FBQ0QsWUFBTSxpQkFBaUIsUUFBUSxTQUFTLElBQ3BDLE1BQU0sSUFBSSxPQUFPLFVBQVUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLFFBQVEsR0FBRyxjQUFjLEtBQUssRUFBRSxDQUFDLElBQzFGO0FBQ0osWUFBTSxtQkFBbUIsTUFBTSxJQUFJLE9BQU8saUJBQWlCLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBQ2xHLFlBQU0sU0FBUyxNQUFNLElBQUksT0FBTyxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGNBQWMsSUFBSSxPQUFPLGFBQWEsRUFBRSxDQUFDO0FBQzdHLFlBQU0sVUFBVSxNQUFNLElBQUksT0FBTyxpQkFBaUIsRUFBRSxLQUFLO0FBQUEsUUFDdkQsT0FBTyxFQUFFLGNBQWMsSUFBSSxPQUFPLGFBQWE7QUFBQSxRQUFHLFFBQVEsQ0FBQyxRQUFRO0FBQUEsUUFBRyxLQUFLO0FBQUEsTUFDN0UsQ0FBQztBQUNELFlBQU0sZ0JBQWdCLFFBQVE7QUFBQSxRQUM1QixDQUFDLEtBQUssUUFBUSxPQUFPLE9BQU8sSUFBSSxXQUFXLFdBQVcsSUFBSSxTQUFTLE9BQU8sSUFBSSxNQUFNLEtBQUs7QUFBQSxRQUFJO0FBQUEsTUFDL0Y7QUFDQSxZQUFNLElBQUksT0FBTyxjQUFjLEVBQUUsT0FBTztBQUFBLFFBQ3RDO0FBQUEsUUFDQSxVQUFVLFdBQVc7QUFBQSxRQUNyQixlQUFlLFdBQVcsT0FBTyxDQUFDLE1BQU0sRUFBRSxXQUFXLGVBQWUsRUFBRSxXQUFXLFdBQVcsRUFBRTtBQUFBLFFBQzlGLFdBQVcsUUFBUTtBQUFBLFFBQ25CLHFCQUFxQjtBQUFBLFFBQ3JCLG1CQUFtQjtBQUFBLFFBQ25CLHVCQUF1QjtBQUFBLFFBQ3ZCLGdCQUFnQjtBQUFBLE1BQ2xCLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFBQSxJQUV0QjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLElBQU8sNENBQVEsQ0FBQywwQkFBMEI7OztBQy9GMUMsSUFBTSxpQkFBdUI7QUFBQSxFQUMzQixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixRQUFRLENBQUMsZ0JBQWdCLGNBQWM7QUFBQSxFQUN2QyxVQUFVO0FBQUEsRUFDVixhQUFhO0FBQUEsRUFDYixTQUFTLE9BQU8sUUFBcUI7QUFLbkMsUUFBSSxJQUFJLFVBQVUsa0JBQWtCLElBQUksVUFBVSxTQUFTLFVBQVc7QUFLdEUsYUFBUyxPQUNQLFNBQ0EsTUFDQSxRQUNBLGNBQXNCLFNBQ2Y7QUFDUCxZQUFNLE1BQU0sSUFBSSxNQUFNLE9BQU87QUFLN0IsVUFBSSxPQUFPO0FBQ1gsVUFBSSxTQUFTO0FBQ2IsVUFBSSxjQUFjO0FBQ2xCLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTSxFQUFFLE1BQU0sSUFBSTtBQUNsQixVQUFNLFdBQVcsSUFBSTtBQU1yQixRQUFJLENBQUMsWUFBWSxNQUFNLGlCQUFpQixNQUFNO0FBQzVDLFlBQU0sZ0JBQWdCO0FBQUEsSUFDeEI7QUFJQSxVQUFNLGNBQ0gsT0FBTyxNQUFNLGFBQWEsWUFBWSxNQUFNLFlBQzVDLE9BQU8sVUFBVSxhQUFhLFlBQWEsU0FBUyxZQUNyRDtBQVFGLFFBQUksYUFBYTtBQUNmLFlBQU0sT0FBK0IsRUFBRSxLQUFLLEdBQUcsUUFBUSxHQUFHLE1BQU0sR0FBRyxRQUFRLEVBQUU7QUFDN0UsWUFBTSxnQkFBZ0IsS0FBSyxXQUFXLEtBQUs7QUFBQSxJQUM3QztBQUVBLFFBQUksTUFBTSxXQUFXLGVBQWUsVUFBVSxXQUFXLGFBQWE7QUFxQnBFLFVBQUksQ0FBQyxNQUFNLGtCQUFrQixDQUFDLElBQUksU0FBUyxVQUFVO0FBQ25ELGNBQU0sa0JBQWlCLG9CQUFJLEtBQUssR0FBRSxZQUFZO0FBQUEsTUFDaEQ7QUFDQSxVQUFJLE9BQU8sTUFBTSxxQkFBcUIsU0FBVSxPQUFNLG1CQUFtQjtBQUFBLElBQzNFO0FBR0EsVUFBTSxZQUNILE9BQU8sTUFBTSxXQUFXLFlBQVksTUFBTSxVQUMxQyxPQUFPLFVBQVUsV0FBVyxZQUFhLFNBQVMsVUFDbkQ7QUFDRixRQUFJLE9BQU8sY0FBYyxTQUFVLE9BQU0sZUFBZSxjQUFjO0FBQ3RFLFVBQU0sU0FDSCxPQUFPLE1BQU0sYUFBYSxZQUFZLE1BQU0sWUFDNUMsT0FBTyxVQUFVLGFBQWEsWUFBYSxTQUFTLFlBQ3JEO0FBQ0YsVUFBTSxZQUFXLG9CQUFJLEtBQUssR0FBRSxZQUFZLEVBQUUsTUFBTSxHQUFHLEVBQUU7QUFDckQsVUFBTSxhQUFhLENBQUMsQ0FBQyxVQUFVLE9BQU8sTUFBTSxHQUFHLEVBQUUsSUFBSSxZQUFZLE1BQU0saUJBQWlCO0FBRXhGLFVBQU0sV0FDSCxPQUFPLE1BQU0sa0JBQWtCLFlBQVksTUFBTSxpQkFDakQsT0FBTyxVQUFVLGtCQUFrQixZQUFhLFNBQVMsaUJBQzFEO0FBQ0YsVUFBTSxNQUNILE9BQU8sTUFBTSxhQUFhLFlBQVksTUFBTSxZQUM1QyxPQUFPLFVBQVUsYUFBYSxZQUFhLFNBQVMsWUFDckQ7QUFDRixRQUFJLFlBQVksT0FBTyxTQUFTLE1BQU0sR0FBRyxFQUFFLElBQUksSUFBSSxNQUFNLEdBQUcsRUFBRSxHQUFHO0FBQy9ELFlBQU07QUFBQSxRQUNKLGFBQWEsUUFBUSw0QkFBNEIsR0FBRztBQUFBLFFBQ3BEO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBZ0JBLElBQU0saUJBQXVCO0FBQUEsRUFDM0IsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsUUFBUSxDQUFDLGFBQWE7QUFBQSxFQUN0QixVQUFVO0FBQUEsRUFDVixPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsRUFDVCxhQUFhO0FBQUEsRUFDYixTQUFTLE9BQU8sUUFBcUI7QUE4Qm5DLGFBQVMsWUFBWSxHQUFTQyxPQUFjQyxXQUF3QjtBQUNsRSxZQUFNLE9BQU8sSUFBSSxLQUFLLENBQUM7QUFDdkIsVUFBSUQsVUFBUyxTQUFTO0FBQ3BCLGFBQUssV0FBVyxLQUFLLFdBQVcsSUFBSUMsU0FBUTtBQUM1QyxlQUFPO0FBQUEsTUFDVDtBQUNBLFVBQUlELFVBQVMsVUFBVTtBQUNyQixhQUFLLFdBQVcsS0FBSyxXQUFXLElBQUksSUFBSUMsU0FBUTtBQUNoRCxlQUFPO0FBQUEsTUFDVDtBQUNBLFlBQU0sU0FBU0QsVUFBUyxZQUFZQyxZQUFXRCxVQUFTLFdBQVcsS0FBS0MsWUFBVztBQUNuRixVQUFJLFdBQVcsRUFBRyxRQUFPO0FBRXpCLFlBQU0sTUFBTSxLQUFLLFdBQVc7QUFHNUIsV0FBSyxXQUFXLENBQUM7QUFDakIsV0FBSyxZQUFZLEtBQUssWUFBWSxJQUFJLE1BQU07QUFDNUMsWUFBTSx1QkFBdUIsSUFBSSxLQUFLLEtBQUs7QUFBQSxRQUN6QyxLQUFLLGVBQWU7QUFBQSxRQUFHLEtBQUssWUFBWSxJQUFJO0FBQUEsUUFBRztBQUFBLE1BQ2pELENBQUMsRUFBRSxXQUFXO0FBQ2QsV0FBSyxXQUFXLEtBQUssSUFBSSxLQUFLLG9CQUFvQixDQUFDO0FBQ25ELGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSxFQUFFLE1BQU0sSUFBSTtBQUNsQixVQUFNLFdBQVcsSUFBSTtBQUNyQixVQUFNLE1BQU0sSUFBSTtBQUNoQixRQUFJLENBQUMsSUFBSztBQUlWLFVBQU0sVUFBVSxNQUFNLFdBQVcsZUFBZSxNQUFNLGlCQUFpQjtBQUN2RSxVQUFNLFVBQVUsVUFBVSxXQUFXLGVBQWUsVUFBVSxpQkFBaUI7QUFDL0UsUUFBSSxDQUFDLFdBQVcsUUFBUztBQUV6QixVQUFNLElBQXlCLEVBQUUsR0FBSSxZQUFZLENBQUMsR0FBSSxHQUFHLE1BQU07QUFDL0QsUUFBSSxFQUFFLGlCQUFpQixLQUFNO0FBRTdCLFVBQU0sT0FBTyxPQUFPLEVBQUUsb0JBQW9CLFdBQVcsRUFBRSxrQkFBa0I7QUFDekUsUUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsVUFBVSxXQUFXLFFBQVEsRUFBRSxTQUFTLElBQUksRUFBRztBQUN2RSxVQUFNLFdBQVcsT0FBTyxFQUFFLG1CQUFtQixJQUFJLElBQUksT0FBTyxFQUFFLG1CQUFtQixJQUFJO0FBRXJGLFVBQU0sVUFBVSxFQUFFLFdBQVcsSUFBSSxLQUFLLEVBQUUsUUFBUSxJQUFJLG9CQUFJLEtBQUs7QUFDN0QsUUFBSSxNQUFNLFFBQVEsUUFBUSxDQUFDLEVBQUc7QUFDOUIsVUFBTSxVQUFVLFlBQVksU0FBUyxNQUFNLFFBQVE7QUFHbkQsUUFBSSxFQUFFLHFCQUFxQjtBQUN6QixZQUFNLE1BQU0sSUFBSSxLQUFLLEVBQUUsbUJBQW1CO0FBQzFDLFVBQUksQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLEtBQUssVUFBVSxJQUFLO0FBQUEsSUFDOUM7QUFFQSxVQUFNLE1BQTJCO0FBQUEsTUFDL0IsU0FBUyxFQUFFO0FBQUEsTUFDWCxhQUFhLEVBQUUsZUFBZTtBQUFBLE1BQzlCLFVBQVUsRUFBRTtBQUFBLE1BQ1osTUFBTSxFQUFFLFFBQVE7QUFBQSxNQUNoQixVQUFVLEVBQUUsWUFBWTtBQUFBLE1BQ3hCLFFBQVE7QUFBQSxNQUNSLGNBQWM7QUFBQSxNQUNkLGVBQWU7QUFBQSxNQUNmLFVBQVUsUUFBUSxZQUFZLEVBQUUsTUFBTSxHQUFHLEVBQUU7QUFBQSxNQUMzQyxjQUFjO0FBQUEsTUFDZCxpQkFBaUI7QUFBQSxNQUNqQixxQkFBcUI7QUFBQSxNQUNyQixxQkFBcUIsRUFBRSx1QkFBdUI7QUFBQSxNQUM5QyxpQkFBaUIsRUFBRSxtQkFBbUI7QUFBQSxNQUN0QyxvQkFBb0IsRUFBRSxzQkFBc0I7QUFBQSxNQUM1QyxvQkFBb0IsRUFBRSxzQkFBc0I7QUFBQSxNQUM1Qyx3QkFBd0IsRUFBRSwwQkFBMEI7QUFBQSxNQUNwRCxpQkFBaUIsRUFBRSxtQkFBbUI7QUFBQSxNQUN0QyxpQkFBaUIsRUFBRSxtQkFBbUI7QUFBQSxJQUN4QztBQUNBLFFBQUksRUFBRSxlQUFlO0FBQ25CLFlBQU0sVUFBVSxJQUFJLEtBQUssRUFBRSxhQUFhO0FBQ3hDLFVBQUksQ0FBQyxNQUFNLFFBQVEsUUFBUSxDQUFDLEVBQUcsS0FBSSxnQkFBZ0IsWUFBWSxTQUFTLE1BQU0sUUFBUSxFQUFFLFlBQVk7QUFBQSxJQUN0RztBQUVBLFFBQUk7QUFDRixZQUFNLElBQUksT0FBTyxVQUFVLEVBQUUsT0FBTyxHQUFHO0FBQUEsSUFDekMsUUFBUTtBQUFBLElBR1I7QUFBQSxFQUNGO0FBQ0Y7QUFhQSxJQUFNLGFBQW1CO0FBQUEsRUFDdkIsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsUUFBUSxDQUFDLGFBQWE7QUFBQSxFQUN0QixVQUFVO0FBQUEsRUFDVixPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsRUFDVCxPQUFPO0FBQUEsRUFDUCxhQUNFO0FBQUEsRUFDRixTQUFTLE9BQU8sUUFBcUI7QUFvQm5DLFVBQU0sRUFBRSxNQUFNLElBQUk7QUFDbEIsVUFBTSxXQUFXLElBQUk7QUFDckIsVUFBTSxNQUFNLElBQUk7QUFDaEIsUUFBSSxDQUFDLElBQUs7QUFJVixVQUFNLFVBQVUsTUFBTSxXQUFXLGVBQWUsTUFBTSxpQkFBaUI7QUFDdkUsVUFBTSxVQUFVLFVBQVUsV0FBVyxlQUFlLFVBQVUsaUJBQWlCO0FBQy9FLFFBQUksQ0FBQyxXQUFXLFFBQVM7QUFFekIsVUFBTSxJQUF5QixFQUFFLEdBQUksWUFBWSxDQUFDLEdBQUksR0FBRyxNQUFNO0FBRS9ELFVBQU0sVUFBUyxvQkFBSSxLQUFLLEdBQUUsWUFBWTtBQUd0QyxVQUFNLFFBQVEsT0FBTyxNQUFNLEdBQUcsRUFBRTtBQUVoQyxVQUFNLE9BQU8sQ0FBQyxRQUNaLE9BQU8sRUFBRSxHQUFHLE1BQU0sWUFBWSxFQUFFLEdBQUcsRUFBRSxTQUFTLElBQUssRUFBRSxHQUFHLElBQWU7QUFFekUsVUFBTSxNQUFNLEtBQUssaUJBQWlCO0FBQ2xDLFVBQU0sUUFBZ0MsTUFBTSxFQUFFLGlCQUFpQixJQUFJLElBQUksQ0FBQztBQUV4RSxVQUFNLGFBQWEsb0JBQUksSUFBWTtBQUNuQyxVQUFNLGFBQWEsb0JBQUksSUFBWTtBQUNuQyxVQUFNLFVBQVUsb0JBQUksSUFBWTtBQUVoQyxVQUFNLFNBQVMsS0FBSyxvQkFBb0I7QUFDeEMsUUFBSSxPQUFRLFlBQVcsSUFBSSxNQUFNO0FBQ2pDLFVBQU0sWUFBWSxLQUFLLG9CQUFvQjtBQUMzQyxRQUFJLFVBQVcsWUFBVyxJQUFJLFNBQVM7QUFDdkMsVUFBTSxTQUFTLEtBQUssaUJBQWlCO0FBQ3JDLFFBQUksT0FBUSxTQUFRLElBQUksTUFBTTtBQUU5QixVQUFNLGdCQUF5QztBQUFBLE1BQzdDLENBQUMsc0JBQXNCLGFBQWE7QUFBQSxNQUNwQyxDQUFDLDBCQUEwQixpQkFBaUI7QUFBQSxNQUM1QyxDQUFDLG1CQUFtQixVQUFVO0FBQUEsSUFDaEM7QUFDQSxlQUFXLENBQUMsT0FBTyxNQUFNLEtBQUssZUFBZTtBQUMzQyxZQUFNLEtBQUssS0FBSyxLQUFLO0FBQ3JCLFVBQUksQ0FBQyxHQUFJO0FBQ1QsVUFBSTtBQUNGLGNBQU0sTUFBVyxNQUFNLElBQUksT0FBTyxNQUFNLEVBQUUsS0FBSztBQUFBLFVBQzdDLE9BQU8sRUFBRSxJQUFJLEdBQUcsTUFBTTtBQUFBLFVBQ3RCLFFBQVEsQ0FBQyxhQUFhO0FBQUEsVUFDdEIsS0FBSztBQUFBLFFBQ1AsQ0FBQztBQUNELGNBQU0sT0FBTyxNQUFNLFFBQVEsR0FBRyxJQUFJLE1BQU8sS0FBSyxXQUFXLENBQUM7QUFDMUQsY0FBTSxTQUFTLEtBQUssU0FBUyxLQUFLLENBQUMsRUFBRSxjQUFjO0FBQ25ELFlBQUksT0FBTyxXQUFXLFlBQVksT0FBTyxTQUFTLEVBQUcsWUFBVyxJQUFJLE1BQU07QUFBQSxNQUM1RSxRQUFRO0FBQUEsTUFHUjtBQUFBLElBQ0Y7QUFFQSxVQUFNLFVBQTZEO0FBQUEsTUFDakUsQ0FBQyxlQUFlLFlBQVksRUFBRSxvQkFBb0IsTUFBTSxDQUFDO0FBQUEsTUFDekQsQ0FBQyxlQUFlLFlBQVksRUFBRSxxQkFBcUIsT0FBTyxDQUFDO0FBQUEsTUFDM0QsQ0FBQyxZQUFZLFNBQVMsRUFBRSxxQkFBcUIsT0FBTyxDQUFDO0FBQUEsSUFDdkQ7QUFDQSxlQUFXLENBQUMsUUFBUSxLQUFLLEdBQUcsS0FBSyxTQUFTO0FBQ3hDLFVBQUksU0FBUyxDQUFDLEdBQUcsR0FBRztBQUNwQixVQUFJLE9BQU8sT0FBTyxTQUFTLEdBQUc7QUFDNUIsWUFBSTtBQUNGLGdCQUFNLE1BQVcsTUFBTSxJQUFJLE9BQU8sTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssT0FBTyxHQUFHLEdBQUcsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxPQUFPLE9BQU8sQ0FBQztBQUMvSCxvQkFBVSxNQUFNLFFBQVEsR0FBRyxJQUFJLE1BQU8sS0FBSyxXQUFXLENBQUMsR0FBSSxJQUFJLENBQUMsUUFBYSxPQUFPLElBQUksRUFBRSxDQUFDO0FBQUEsUUFDN0YsUUFBUTtBQUNOLG1CQUFTLENBQUM7QUFBQSxRQUNaO0FBQUEsTUFDRjtBQUNBLGlCQUFXLE1BQU0sUUFBUTtBQUN2QixZQUFJO0FBQ0YsZ0JBQU0sSUFBSSxPQUFPLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLEdBQUcsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUFBLFFBQ25FLFFBQVE7QUFBQSxRQUVSO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUF5Q0EsSUFBTSxxQkFBMkI7QUFBQSxFQUMvQixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixRQUFRLENBQUMsZ0JBQWdCLGNBQWM7QUFBQSxFQUN2QyxVQUFVO0FBQUEsRUFDVixhQUFhO0FBQUEsRUFDYixTQUFTLE9BQU8sUUFBcUI7QUFJbkMsYUFBUyxPQUNQLFNBQ0EsTUFDQSxRQUNBLGNBQXNCLFNBQ2Y7QUFDUCxZQUFNLE1BQU0sSUFBSSxNQUFNLE9BQU87QUFLN0IsVUFBSSxPQUFPO0FBQ1gsVUFBSSxTQUFTO0FBQ2IsVUFBSSxjQUFjO0FBQ2xCLGFBQU87QUFBQSxJQUNUO0FBQ0EsVUFBTSxFQUFFLE1BQU0sSUFBSTtBQUNsQixVQUFNLFdBQVcsSUFBSTtBQUNyQixVQUFNLE1BQU0sSUFBSTtBQUNoQixRQUFJLENBQUMsSUFBSztBQU1WLFVBQU0sWUFBWSxDQUFDLFFBQ2pCLE1BQU0sR0FBRyxNQUFNLFVBQWEsTUFBTSxHQUFHLE1BQU0sT0FBTyxNQUFNLEdBQUcsSUFBSSxXQUFXLEdBQUc7QUFFL0UsUUFBSSxVQUFVLE1BQU0sTUFBTSxPQUFRO0FBQ2xDLFFBQUksVUFBVSxRQUFRLE1BQU0sWUFBYTtBQUV6QyxVQUFNLFNBQVMsVUFBVSxpQkFBaUI7QUFDMUMsVUFBTSxZQUFZLFVBQVUsb0JBQW9CO0FBTWhELFVBQU0sVUFBZ0UsQ0FBQztBQUN2RSxRQUFJLE9BQU8sV0FBVyxZQUFZLFFBQVE7QUFDeEMsY0FBUSxLQUFLLEVBQUUsUUFBUSxZQUFZLElBQUksUUFBUSxPQUFPLE9BQU8sQ0FBQztBQUFBLElBQ2hFO0FBQ0EsUUFBSSxPQUFPLGNBQWMsWUFBWSxXQUFXO0FBQzlDLGNBQVEsS0FBSyxFQUFFLFFBQVEsZUFBZSxJQUFJLFdBQVcsT0FBTyxVQUFVLENBQUM7QUFBQSxJQUN6RTtBQUVBLGVBQVcsS0FBSyxTQUFTO0FBS3ZCLFlBQU0sTUFBVyxNQUFNLElBQUksT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLO0FBQUEsUUFDL0MsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHO0FBQUEsUUFDbEIsUUFBUSxDQUFDLE1BQU0sYUFBYTtBQUFBLFFBQzVCLEtBQUs7QUFBQSxNQUNQLENBQUM7QUFDRCxZQUFNLE9BQU8sTUFBTSxRQUFRLEdBQUcsSUFBSSxNQUFPLEtBQUssV0FBVyxDQUFDO0FBQzFELFlBQU0sU0FBUyxLQUFLLENBQUM7QUFLckIsVUFBSSxRQUFRLGdCQUFnQixNQUFNO0FBQ2hDLGNBQU07QUFBQSxVQUNKLFFBQVEsRUFBRSxLQUFLO0FBQUEsVUFHZjtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxJQUFPLG9CQUFRLENBQUMsZ0JBQWdCLG9CQUFvQixnQkFBZ0IsVUFBVTs7O0FDemY5RSxJQUFNLHFCQUEyQjtBQUFBLEVBQy9CLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFFBQVEsQ0FBQyxnQkFBZ0IsY0FBYztBQUFBLEVBQ3ZDLFVBQVU7QUFBQSxFQUNWLGFBQWE7QUFBQSxFQUNiLFNBQVMsT0FBTyxRQUFxQjtBQUluQyxhQUFTLE9BQ1AsU0FDQSxNQUNBLFFBQ0EsY0FBc0IsU0FDZjtBQUNQLFlBQU0sTUFBTSxJQUFJLE1BQU0sT0FBTztBQUs3QixVQUFJLE9BQU87QUFDWCxVQUFJLFNBQVM7QUFDYixVQUFJLGNBQWM7QUFDbEIsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLEVBQUUsT0FBTyxPQUFPLFNBQVMsSUFBSTtBQVVuQyxhQUFTLGNBQWMsVUFBa0IsUUFBd0I7QUFDL0QsWUFBTSxJQUFJLElBQUksS0FBSyxRQUFRO0FBQzNCLFlBQU0sSUFBSSxJQUFJLEtBQUssTUFBTTtBQUN6QixjQUNHLEVBQUUsZUFBZSxJQUFJLEVBQUUsZUFBZSxLQUFLLE1BQzNDLEVBQUUsWUFBWSxJQUFJLEVBQUUsWUFBWTtBQUFBO0FBQUEsT0FHaEMsRUFBRSxXQUFXLEtBQUssRUFBRSxXQUFXLElBQUksSUFBSTtBQUFBLElBRTVDO0FBSUEsVUFBTSxZQUFZLENBQUMsTUFBTSxZQUFZLFVBQVUsVUFBVSxFQUFFLEtBQUssQ0FBQyxNQUFtQixPQUFPLE1BQU0sWUFBWSxNQUFNLEVBQUU7QUFDckgsVUFBTSxVQUFVLENBQUMsTUFBTSxVQUFVLFVBQVUsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFtQixPQUFPLE1BQU0sWUFBWSxNQUFNLEVBQUU7QUFDL0csVUFBTSxPQUFPLENBQUMsTUFBTSxzQkFBc0IsVUFBVSxvQkFBb0IsRUFBRSxLQUFLLENBQUMsTUFBbUIsT0FBTyxNQUFNLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFFL0gsUUFBSSxhQUFhLFdBQVcsTUFBTTtBQUNoQyxZQUFNLE9BQU8sY0FBYyxXQUFXLE9BQU87QUFDN0MsVUFBSSxLQUFLLElBQUksT0FBTyxJQUFJLElBQUksR0FBRztBQUM3QixjQUFNO0FBQUEsVUFDSixrQkFBa0IsSUFBSSx1Q0FBdUMsSUFBSSxnQkFBZ0IsU0FBUyxPQUFPLE9BQU87QUFBQSxVQUN4RztBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFFQSxRQUFJLFVBQVUsa0JBQWtCLFVBQVUsV0FBVyxhQUFhO0FBQ2hFLFVBQ0UsT0FBTyxNQUFNLGFBQWEsWUFDMUIsT0FBTyxTQUFTLGFBQWEsWUFDN0IsTUFBTSxXQUFXLFNBQVMsVUFDMUI7QUFDQSxjQUFNO0FBQUEsVUFDSiwyQkFBMkIsU0FBUyxRQUFrQixXQUFNLE1BQU0sUUFBUTtBQUFBLFVBQzFFO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLElBQU0scUJBQTJCO0FBQUEsRUFDL0IsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsUUFBUSxDQUFDLGFBQWE7QUFBQSxFQUN0QixVQUFVO0FBQUEsRUFDVixPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsRUFDVCxhQUFhO0FBQUEsRUFDYixTQUFTLE9BQU8sUUFBcUI7QUFDbkMsVUFBTSxFQUFFLE9BQU8sU0FBUyxJQUFJO0FBQzVCLFFBQUksTUFBTSxXQUFXLGVBQWUsVUFBVSxXQUFXLFlBQWE7QUFDdEUsVUFBTSxNQUFNLElBQUk7QUFDaEIsUUFBSSxDQUFDLElBQUs7QUFFVixVQUFNLEtBQUssQ0FBQyxNQUFNLElBQUksVUFBVSxFQUFFLEVBQUUsS0FBSyxDQUFDLE1BQW1CLE9BQU8sTUFBTSxZQUFZLE1BQU0sRUFBRTtBQUM5RixVQUFNLFlBQVksQ0FBQyxNQUFNLGFBQWEsVUFBVSxXQUFXLEVBQUUsS0FBSyxDQUFDLE1BQW1CLE9BQU8sTUFBTSxZQUFZLE1BQU0sRUFBRTtBQUV2SCxRQUFJLE1BQU0sQ0FBQyxNQUFNLGVBQWUsQ0FBQyxVQUFVLGFBQWE7QUFDdEQsWUFBTSxJQUFJLE9BQU8sY0FBYyxFQUFFO0FBQUEsUUFDL0IsRUFBRSxJQUFJLGNBQWEsb0JBQUksS0FBSyxHQUFFLFlBQVksRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFO0FBQUEsUUFDekQsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFO0FBQUEsTUFDbEI7QUFBQSxJQUNGO0FBRUEsUUFBSSxXQUFXO0FBQ2IsWUFBTSxVQUFVLE1BQU0sSUFBSSxPQUFPLGFBQWEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksVUFBVSxFQUFFLENBQUM7QUFDcEYsVUFBSSxXQUFXLFFBQVEsU0FBUyxZQUFZO0FBQzFDLGNBQU0sSUFBSSxPQUFPLGFBQWEsRUFBRTtBQUFBLFVBQzlCLEVBQUUsSUFBSSxXQUFXLE1BQU0sV0FBVztBQUFBLFVBQ2xDLEVBQUUsT0FBTyxFQUFFLElBQUksVUFBVSxFQUFFO0FBQUEsUUFDN0I7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBTUY7QUFDRjtBQUVBLElBQU8sd0JBQVEsQ0FBQyxvQkFBb0Isa0JBQWtCOzs7QUN2Ry9DLFNBQVMsd0JBQXdCLFlBQW9CLFVBQXdCO0FBQ2xGLFNBQU87QUFBQSxJQUNMLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLFFBQVEsQ0FBQyxnQkFBZ0IsY0FBYztBQUFBLElBQ3ZDLFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxJQUNiLFNBQVMsT0FBTyxRQUFxQjtBQUNuQyxZQUFNLEVBQUUsT0FBTyxNQUFNLElBQUk7QUFDekIsWUFBTSxNQUFNLElBQUk7QUFDaEIsVUFBSSxDQUFDLElBQUs7QUFFVixZQUFNLFlBQVksT0FBTyxNQUFNLGdCQUFnQixXQUFXLE1BQU0sY0FBYztBQUM5RSxVQUFJLENBQUMsVUFBVztBQUNoQixZQUFNLFVBQVUsTUFBTSxJQUFJLE9BQU8sYUFBYSxFQUFFLFFBQVE7QUFBQSxRQUN0RCxPQUFPLEVBQUUsSUFBSSxVQUFVO0FBQUEsUUFBRyxRQUFRLENBQUMsTUFBTSxZQUFZO0FBQUEsTUFDdkQsQ0FBQztBQUNELFlBQU0sWUFBWSxXQUFXLE9BQU8sUUFBUSxlQUFlLFdBQVcsUUFBUSxhQUFhO0FBQzNGLFVBQUksY0FBYyxPQUFXO0FBRTdCLFlBQU0sYUFBYTtBQUduQixVQUFJLFVBQVUsa0JBQWtCLE1BQU0sY0FBYyxNQUFNO0FBQ3hELGNBQU0sYUFBYTtBQUFBLE1BQ3JCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQWFPLFNBQVMsd0JBQXdCLFlBQW9CLFVBQXdCO0FBQ2xGLFNBQU87QUFBQSxJQUNMLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxJQUNSLFFBQVEsQ0FBQyxnQkFBZ0IsY0FBYztBQUFBLElBQ3ZDLFVBQVU7QUFBQSxJQUNWLE9BQU87QUFBQSxJQUNQLGFBQWE7QUFBQSxJQUNiLFNBQVMsT0FBTyxRQUFxQjtBQUNuQyxZQUFNLEVBQUUsT0FBTyxNQUFNLElBQUk7QUFDekIsWUFBTSxPQUFPLElBQUk7QUFDakIsWUFBTSxNQUFNLElBQUk7QUFDaEIsVUFBSSxDQUFDLElBQUs7QUFDVixVQUFJLENBQUMsSUFBSSxNQUFNLE1BQU0sT0FBTyxNQUFNLGdCQUFnQixTQUFVO0FBRTVELFVBQUksVUFBVSxtQkFBbUIsSUFBSSxVQUFVLFNBQVMsYUFBYSxPQUFPLE1BQU0sZ0JBQWdCLFVBQVc7QUFDN0csWUFBTSxZQUFZLElBQUksV0FBVyx3QkFBd0IsY0FBYztBQUN2RSxZQUFNLFdBQVcsTUFBTSxTQUFTLEtBQUssT0FBTyxTQUFTO0FBQ3JELFVBQUksT0FBTyxhQUFhLFlBQVksQ0FBQyxTQUFVO0FBQy9DLFlBQU0sV0FBVyxNQUFNLElBQUksT0FBTyxJQUFJLE1BQU0sRUFBRSxLQUFLO0FBQUEsUUFDakQsT0FBTyxFQUFFLENBQUMsU0FBUyxHQUFHLFNBQVM7QUFBQSxRQUFHLFFBQVEsQ0FBQyxhQUFhO0FBQUEsUUFBRyxLQUFLO0FBQUEsTUFDbEUsQ0FBQztBQUNELFVBQUksTUFBTTtBQUNWLGlCQUFXLEtBQUssVUFBVTtBQUN4QixZQUFJLE9BQU8sRUFBRSxnQkFBZ0IsWUFBWSxFQUFFLGNBQWMsSUFBSyxPQUFNLEVBQUU7QUFBQSxNQUN4RTtBQUVBLFlBQU0sU0FBUyxVQUFVLGtCQUFrQixJQUFJLFVBQVUsU0FBUyxZQUFZLElBQUksU0FBUyxRQUFRO0FBQ25HLFlBQU0sY0FBYyxNQUFNLElBQUk7QUFBQSxJQUNoQztBQUFBLEVBQ0Y7QUFDRjs7O0FDMUVBLElBQU0sK0JBQXFDO0FBQUEsRUFDekM7QUFBQSxFQUNBO0FBQ0Y7QUFHQSxJQUFNLCtCQUFxQztBQUFBLEVBQ3pDO0FBQUEsRUFDQTtBQUNGO0FBRUEsSUFBTSwwQkFBZ0M7QUFBQSxFQUNwQyxNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixRQUFRLENBQUMsZUFBZSxlQUFlLGFBQWE7QUFBQSxFQUNwRCxVQUFVO0FBQUEsRUFDVixPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsRUFDVCxhQUFhO0FBQUEsRUFDYixTQUFTLE9BQU8sUUFBcUI7QUFDbkMsVUFBTSxNQUFNLElBQUk7QUFDaEIsUUFBSSxDQUFDLElBQUs7QUFDVixVQUFNLEVBQUUsT0FBTyxTQUFTLElBQUk7QUFDNUIsVUFBTSxNQUFNLENBQUMsTUFBd0IsT0FBTyxNQUFNLFdBQVcsSUFBSTtBQUlqRSxVQUFNLFNBQVMsb0JBQUksSUFBWTtBQUMvQixlQUFXLEtBQUssQ0FBQyxPQUFPLGlCQUFpQixVQUFVLGVBQWUsR0FBRztBQUNuRSxVQUFJLE9BQU8sTUFBTSxZQUFZLEVBQUcsUUFBTyxJQUFJLENBQUM7QUFBQSxJQUM5QztBQUNBLFFBQUksT0FBTyxTQUFTLEVBQUc7QUFFdkIsZUFBVyxTQUFTLFFBQVE7QUFLMUIsWUFBTSxNQUFNLE1BQU0sSUFBSSxPQUFPLGlCQUFpQixFQUFFLFFBQVE7QUFBQSxRQUN0RCxPQUFPLEVBQUUsSUFBSSxNQUFNO0FBQUEsUUFBRyxRQUFRLENBQUMsTUFBTSxPQUFPO0FBQUEsTUFDOUMsQ0FBQztBQUNELFlBQU0sUUFBUSxPQUFPLE9BQU8sSUFBSSxVQUFVLFdBQVcsSUFBSSxRQUFRO0FBQ2pFLFVBQUksVUFBVSxnQkFBZ0IsVUFBVSxjQUFlO0FBRXZELFlBQU0sUUFBUSxNQUFNLElBQUksT0FBTywyQkFBMkIsRUFBRSxLQUFLO0FBQUEsUUFDL0QsT0FBTyxFQUFFLGlCQUFpQixNQUFNO0FBQUEsUUFDaEMsUUFBUSxDQUFDLFlBQVksY0FBYyxVQUFVO0FBQUEsUUFDN0MsS0FBSztBQUFBLE1BQ1AsQ0FBQztBQUVELFVBQUksQ0FBQyxTQUFTLE1BQU0sV0FBVyxFQUFHO0FBRWxDLFVBQUksTUFBTTtBQUNWLGlCQUFXLEtBQUssTUFBTyxRQUFPLElBQUksRUFBRSxRQUFRLElBQUksSUFBSSxFQUFFLFVBQVUsS0FBSyxJQUFJLElBQUksRUFBRSxRQUFRLElBQUk7QUFDM0YsWUFBTSxLQUFLLE1BQU0sTUFBTSxHQUFHLElBQUk7QUFDOUIsVUFBSSxNQUFNLEdBQUc7QUFDWCxjQUFNLElBQUksT0FBTyxpQkFBaUIsRUFBRTtBQUFBLFVBQ2xDLEVBQUUsSUFBSSxPQUFPLFFBQVEsSUFBSTtBQUFBLFVBQ3pCLEVBQUUsT0FBTyxFQUFFLElBQUksTUFBTSxFQUFFO0FBQUEsUUFDekI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLElBQU8scUNBQVEsQ0FBQyw4QkFBOEIsOEJBQThCLHVCQUF1Qjs7O0FDdEZuRyxJQUFNLGNBQW9CO0FBQUEsRUFDeEIsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsUUFBUSxDQUFDLGdCQUFnQixnQkFBZ0IsY0FBYztBQUFBLEVBQ3ZELFVBQVU7QUFBQSxFQUNWLGFBQWE7QUFBQSxFQUNiLFNBQVMsT0FBTyxRQUFxQjtBQUluQyxhQUFTLE9BQ1AsU0FDQSxNQUNBLFFBQ0EsY0FBc0IsU0FDZjtBQUNQLFlBQU0sTUFBTSxJQUFJLE1BQU0sT0FBTztBQUs3QixVQUFJLE9BQU87QUFDWCxVQUFJLFNBQVM7QUFDYixVQUFJLGNBQWM7QUFDbEIsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLEVBQUUsT0FBTyxPQUFPLFNBQVMsSUFBSTtBQUVuQyxRQUFJLFVBQVUsa0JBQWtCLFVBQVUsZ0JBQWdCO0FBRXhELFlBQU0sWUFBWSxDQUFDLE1BQU0sWUFBWSxVQUFVLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBbUIsT0FBTyxNQUFNLFFBQVE7QUFDekcsWUFBTSxPQUFPLENBQUMsTUFBTSxNQUFNLFVBQVUsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFtQixPQUFPLE1BQU0sUUFBUTtBQUN4RixVQUFJLE9BQU8sY0FBYyxZQUFZLE9BQU8sU0FBUyxZQUFZLFlBQVksTUFBTTtBQUNqRixjQUFNO0FBQUEsVUFDSixlQUFlLFNBQVMsNENBQTRDLElBQUk7QUFBQSxVQUN4RTtBQUFBLFVBQ0E7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUNBLFVBQUksT0FBTyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxjQUFNLE1BQU0sTUFBTSxJQUFJLFlBQVk7QUFBQSxNQUNwQztBQUFBLElBQ0Y7QUFFQSxRQUFJLFVBQVUsZ0JBQWdCO0FBQzVCLFlBQU0sTUFBTSxJQUFJO0FBQ2hCLFlBQU0sS0FBSyxVQUFVO0FBQ3JCLFVBQUksQ0FBQyxPQUFPLENBQUMsR0FBSTtBQUNqQixZQUFNLENBQUMsU0FBUyxTQUFTLElBQUksTUFBTSxRQUFRLElBQUk7QUFBQSxRQUM3QyxJQUFJLE9BQU8sMkJBQTJCLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFBQSxRQUMzRixJQUFJLE9BQU8scUJBQXFCLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFBQSxNQUN2RixDQUFDO0FBQ0QsVUFBSSxVQUFVLFlBQVksR0FBRztBQUMzQixjQUFNO0FBQUEsVUFDSix3Q0FBd0MsT0FBTyx5QkFBeUIsU0FBUztBQUFBLFVBQ2pGO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLElBQU8sdUJBQVE7OztBQ25EZixJQUFNLGtCQUF3QjtBQUFBLEVBQzVCLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS04sUUFBUSxDQUFDLGFBQWEscUJBQXFCO0FBQUEsRUFDM0MsUUFBUSxDQUFDLGdCQUFnQixjQUFjO0FBQUEsRUFDdkMsVUFBVTtBQUFBLEVBQ1YsYUFBYTtBQUFBLEVBQ2IsU0FBUyxPQUFPLFFBQXFCO0FBSW5DLGFBQVMsT0FDUCxTQUNBLE1BQ0EsUUFDQSxjQUFzQixTQUNmO0FBQ1AsWUFBTSxNQUFNLElBQUksTUFBTSxPQUFPO0FBSzdCLFVBQUksT0FBTztBQUNYLFVBQUksU0FBUztBQUNiLFVBQUksY0FBYztBQUNsQixhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sRUFBRSxPQUFPLE9BQU8sU0FBUyxJQUFJO0FBdUJuQyxRQUFJLElBQUksV0FBVyx1QkFBdUI7QUFDeEMsWUFBTSxVQUFVLE9BQU8sS0FBSyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sY0FBYyxjQUFjLGFBQWEsRUFBRSxTQUFTLENBQUMsS0FBSyxNQUFNLENBQUMsTUFBTSxXQUFXLENBQUMsQ0FBQztBQUMzSSxpQkFBVyxNQUFNLG9CQUFJLElBQUksQ0FBQyxNQUFNLFdBQVcsVUFBVSxTQUFTLENBQUMsR0FBRztBQUNoRSxjQUFNLElBQUksV0FBVyxJQUFJLE1BQU0sTUFBTSxPQUFPLE9BQU8sWUFBWSxLQUMzRCxNQUFPLElBQUksS0FBNkIsT0FBTyxXQUFXLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixRQUFRLFFBQVEsRUFBRSxDQUFDLElBQ2pJO0FBQ0osWUFBSSxHQUFHLFdBQVcsY0FBYyxHQUFHLFdBQVcsV0FBVztBQUN2RCxnQkFBTSxPQUFPLFNBQVMsT0FBTyxFQUFFLFlBQVksQ0FBQyxNQUFNLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0sMERBQTBELGlCQUFpQixHQUFHO0FBQUEsUUFDL0o7QUFBQSxNQUNGO0FBQ0E7QUFBQSxJQUNGO0FBUUEsYUFBUyxVQUFrQjtBQUN6QixZQUFNLFFBQVEsQ0FBQyxVQUFVLGNBQWMsVUFBVSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU8sT0FBTyxNQUFNLFdBQVcsRUFBRSxLQUFLLElBQUksRUFBRyxFQUFFLE9BQU8sT0FBTyxFQUFFLEtBQUssS0FBSztBQUNySSxhQUFPLFFBQVEsU0FBUyxLQUFLLEtBQUs7QUFBQSxJQUNwQztBQXFCQSxhQUFTLFFBQVEsS0FBYSxNQUFzQjtBQUNsRCxZQUFNLElBQUksSUFBSSxLQUFLLEdBQUc7QUFDdEIsUUFBRSxXQUFXLEVBQUUsV0FBVyxJQUFJLElBQUk7QUFDbEMsYUFBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEdBQUcsRUFBRTtBQUFBLElBQ3BDO0FBRUEsUUFBSSxVQUFVLGtCQUFrQixDQUFDLE1BQU0saUJBQWlCO0FBQ3RELFlBQU0sT0FBTyxPQUFPLE1BQU0sZUFBZSxXQUFXLE1BQU0sY0FBYSxvQkFBSSxLQUFLLEdBQUUsWUFBWSxFQUFFLE1BQU0sR0FBRyxFQUFFO0FBQzNHLFlBQU0sa0JBQWtCLFFBQVEsTUFBTSxFQUFFO0FBQUEsSUFDMUM7QUFPQSxRQUFJLFVBQVUsa0JBQWtCLFlBQVksSUFBSSxNQUFNLElBQUk7QUFDeEQsWUFBTSxTQUFTLFNBQVMsV0FBVyxjQUFjLFNBQVMsV0FBVztBQUNyRSxVQUFJLFFBQVE7QUFDVixjQUFNLFVBQVUsb0JBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDO0FBSTFDLGNBQU0sZ0JBQWdCLG9CQUFJLElBQUk7QUFBQSxVQUM1QjtBQUFBLFVBQU07QUFBQSxVQUFZO0FBQUEsVUFBYztBQUFBLFVBQWM7QUFBQSxVQUFjO0FBQUEsVUFBYztBQUFBLFVBQVk7QUFBQSxVQUFtQjtBQUFBLFVBQVU7QUFBQSxRQUNySCxDQUFDO0FBSUQsY0FBTSxZQUFZLE9BQU8sS0FBSyxLQUFLLEVBQUU7QUFBQSxVQUNuQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxJQUFJLENBQUMsS0FBSyxNQUFNLENBQUMsTUFBTSxTQUFTLENBQUM7QUFBQSxRQUM1RTtBQUNBLFlBQUksVUFBVSxTQUFTLEdBQUc7QUFFeEIsZ0JBQU0sbUJBQW1CLG9CQUFJLElBQUksQ0FBQyxlQUFlLGVBQWUsaUJBQWlCLENBQUM7QUEwRGxGLGdCQUFNLHFCQUFxQixVQUFVO0FBQUEsWUFDbkMsQ0FBQyxNQUFNLGlCQUFpQixJQUFJLENBQUMsS0FBSyxNQUFNLENBQUMsTUFBTSxRQUFRLFdBQVcsQ0FBQyxLQUFLO0FBQUEsVUFDMUU7QUFDQSxjQUFJLG1CQUFvQjtBQUV4QixnQkFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sU0FBUyxNQUFnQjtBQUN6RCxnQkFBTSxPQUFPLEdBQUcsSUFBSSxtREFBbUQsVUFBVSxLQUFLLElBQUksQ0FBQyxLQUFLLGlCQUFpQixHQUFHO0FBQUEsUUFDdEg7QUFBQSxNQUNGO0FBc0NBLFVBQUksTUFBTSxXQUFXLGNBQWMsU0FBUyxXQUFXLFlBQVk7QUFDakUsY0FBTSxTQUFTLENBQUMsTUFBTSxpQkFBaUIsU0FBUyxlQUFlLEVBQUUsS0FBSyxDQUFDLE1BQU0sT0FBTyxNQUFNLFlBQVksQ0FBQztBQUN2RyxjQUFNLE9BQU8sU0FDVCxNQUFPLElBQUksS0FBNkIsT0FBTyxpQkFBaUIsRUFBRSxRQUFRO0FBQUEsVUFDMUUsT0FBTyxFQUFFLElBQUksT0FBTztBQUFBLFVBQ3BCLFFBQVEsQ0FBQyxTQUFTLG1CQUFtQixpQ0FBaUMsK0JBQStCO0FBQUEsUUFDdkcsQ0FBQyxFQUFFLE1BQU0sTUFBTSxJQUFJLElBQ2pCO0FBSUosY0FBTSxPQUFPLFFBQVEsQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFLFdBQVcsU0FBUyxJQUN6RCxDQUFDLENBQUMsbUJBQW1CLGlCQUFpQixHQUFHLENBQUMsaUNBQWlDLHdCQUF3QixHQUFHLENBQUMsaUNBQWlDLHdCQUF3QixDQUFDLEVBQ2hLLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsTUFBTSxhQUFjLEtBQUssQ0FBQyxNQUFNLGNBQWMsTUFBTSxpQkFBa0IsRUFDNUYsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLE1BQU0sR0FBRyxLQUFLLE9BQU8sS0FBSyxDQUFDLE1BQU0sWUFBWSxZQUFZLFVBQVUsRUFBRSxJQUNwRixDQUFDO0FBR0wsWUFBSSxLQUFLLFNBQVMsR0FBRztBQUNuQixnQkFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQ3pCLGdCQUFNLE9BQU8sR0FBRyxJQUFJLEtBQUssS0FBSyxLQUFLLElBQUksQ0FBQyx5RkFBeUYsaUJBQWlCLEdBQUc7QUFBQSxRQUN2SjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBOEJBLElBQU0sNkJBQW1DO0FBQUEsRUFDdkMsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsUUFBUSxDQUFDLGFBQWE7QUFBQSxFQUN0QixVQUFVO0FBQUEsRUFDVixPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsRUFDVCxPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFDYixTQUFTLE9BQU8sUUFBcUI7QUFDbkMsVUFBTSxFQUFFLE9BQU8sU0FBUyxJQUFJO0FBQzVCLFFBQUksTUFBTSxXQUFXLGNBQWMsVUFBVSxXQUFXLFdBQVk7QUFDcEUsVUFBTSxNQUFNLElBQUk7QUFDaEIsUUFBSSxDQUFDLElBQUs7QUFjVixhQUFTLFVBQVUsS0FBYSxRQUF3QjtBQUN0RCxZQUFNLElBQUksSUFBSSxLQUFLLEdBQUc7QUFDdEIsUUFBRSxZQUFZLEVBQUUsWUFBWSxJQUFJLE1BQU07QUFDdEMsYUFBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEdBQUcsRUFBRTtBQUFBLElBQ3BDO0FBeUJBLFVBQU0sU0FBUyxJQUFJLGVBQ2pCLFdBQVcsS0FBSyxDQUFDLE1BQW1CLE9BQU8sTUFBTSxZQUFZLE1BQU0sRUFBRTtBQUV2RSxVQUFNLFlBQVksT0FBTyxNQUFNLGFBQWEsVUFBVSxXQUFXO0FBQ2pFLFVBQU0sWUFBWSxPQUFPLE1BQU0sYUFBYSxVQUFVLFdBQVc7QUFDakUsVUFBTSxnQkFBZ0IsT0FBTyxNQUFNLGlCQUFpQixVQUFVLGVBQWU7QUFDN0UsVUFBTSxVQUFVLE9BQU8sTUFBTSxVQUFVLFVBQVUsVUFBVSxJQUFJLE1BQU0sRUFBRTtBQUN2RSxVQUFNLGFBQWEsQ0FBQyxNQUFNLGFBQWEsVUFBVSxXQUFXLEVBQUUsS0FBSyxDQUFDLE1BQU0sT0FBTyxNQUFNLFFBQVEsS0FBSztBQXFCcEcsVUFBTSxlQUFlLE9BQU8sTUFBTSxlQUFlLFVBQVUsYUFBYTtBQUV4RSxVQUFNLFNBQVEsb0JBQUksS0FBSyxHQUFFLFlBQVksRUFBRSxNQUFNLEdBQUcsRUFBRTtBQXdDbEQsVUFBTSwwQkFBMEI7QUFBQSxNQUM5QixzQkFBc0I7QUFBQSxNQUN0QixlQUFlO0FBQUEsTUFDZixZQUFZO0FBQUEsSUFDZDtBQVlBLFVBQU0sVUFBVSxDQUFDLE1BQXdCLE9BQU8sTUFBTSxXQUFXLEVBQUUsS0FBSyxJQUFJO0FBQzVFLFVBQU0sYUFBYSxDQUFDLFFBQVEsVUFBVSxZQUFZLEdBQUcsQ0FBQyxNQUFNLE1BQU0sVUFBVSxJQUFJLEVBQUUsSUFBSSxPQUFPLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxPQUFPLE9BQU8sRUFBRSxLQUFLLEtBQUs7QUFNeEksVUFBTSxXQUFvQztBQUFBLE1BQ3hDLEdBQUc7QUFBQSxNQUNILFFBQVE7QUFBQSxNQUNSLFVBQVUsVUFBVSx3QkFBd0IsWUFBWSx3QkFBd0Isb0JBQW9CO0FBQUEsTUFDcEcsZ0JBQWdCO0FBQUEsTUFDaEIsYUFBYSxhQUFhLG9DQUFvQyxVQUFVLEtBQUs7QUFBQSxJQUMvRTtBQUNBLFFBQUksVUFBVyxVQUFTLGNBQWM7QUFDdEMsUUFBSSxVQUFXLFVBQVMsY0FBYztBQUN0QyxRQUFJLGNBQWUsVUFBUyxrQkFBa0I7QUFDOUMsUUFBSSxRQUFTLFVBQVMsV0FBVztBQUlqQyxRQUFJLGFBQWMsVUFBUyxnQkFBZ0I7QUFXM0MsUUFBSTtBQUNGLFlBQU0sSUFBSSxPQUFPLGNBQWMsRUFBRSxPQUFPLFFBQVE7QUFBQSxJQUNsRCxTQUFTLEtBQUs7QUFlWixZQUFNLElBQUksTUFBTSwwQ0FBMEMsVUFBVSxLQUFNLElBQWMsT0FBTyxFQUFFO0FBQUEsSUFDbkc7QUFBQSxFQUNGO0FBQ0Y7QUFXQSxJQUFNLGdCQUFzQjtBQUFBLEVBQzFCLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFFBQVEsQ0FBQyxhQUFhO0FBQUEsRUFDdEIsVUFBVTtBQUFBLEVBQ1YsT0FBTztBQUFBLEVBQ1AsU0FBUztBQUFBLEVBQ1QsYUFBYTtBQUFBLEVBQ2IsU0FBUyxPQUFPLFFBQXFCO0FBQ25DLFVBQU0sRUFBRSxPQUFPLFNBQVMsSUFBSTtBQUM1QixRQUFJLE1BQU0sV0FBVyxjQUFjLFVBQVUsV0FBVyxXQUFZO0FBQ3BFLFVBQU0sTUFBTSxJQUFJO0FBR2hCLFVBQU0sS0FBSyxDQUFDLE1BQU0saUJBQWlCLFVBQVUsZUFBZSxFQUFFLEtBQUssQ0FBQyxNQUFtQixPQUFPLE1BQU0sWUFBWSxNQUFNLEVBQUU7QUFDeEgsUUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFJO0FBRWpCLFFBQUk7QUFDRixZQUFNLE1BQU0sTUFBTSxJQUFJLE9BQU8saUJBQWlCLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUV6RSxVQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksS0FBSyxFQUFFLFdBQVcsU0FBUyxHQUFHO0FBT25ELGNBQU0sTUFBTSxFQUFFLElBQUksT0FBTyxjQUFjLGFBQVksb0JBQUksS0FBSyxHQUFFLFlBQVksRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFO0FBQ3pGLGNBQU0sSUFBSSxPQUFPLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssR0FBSSxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxpQkFBaUIsRUFBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQUEsTUFDdkk7QUFBQSxJQUNGLFNBQVMsS0FBSztBQVlaLFlBQU0sSUFBSSxNQUFNLGdEQUFnRCxPQUFPLFVBQVUsWUFBWSxDQUFDLEtBQU0sSUFBYyxPQUFPLEVBQUU7QUFBQSxJQUM3SDtBQUFBLEVBQ0Y7QUFDRjtBQUVBLElBQU8scUJBQVEsQ0FBQyxpQkFBaUIsNEJBQTRCLGFBQWE7OztBQ2poQjFFLElBQU0seUJBQStCO0FBQUEsRUFDbkM7QUFBQSxFQUNBO0FBQ0Y7QUFHQSxJQUFNLHlCQUErQjtBQUFBLEVBQ25DO0FBQUEsRUFDQTtBQUNGO0FBRUEsSUFBTSxtQkFBeUI7QUFBQSxFQUM3QixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFDUixRQUFRLENBQUMsZUFBZSxlQUFlLGFBQWE7QUFBQSxFQUNwRCxVQUFVO0FBQUEsRUFDVixPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsRUFDVCxhQUFhO0FBQUEsRUFDYixTQUFTLE9BQU8sUUFBcUI7QUFDbkMsVUFBTSxNQUFNLElBQUk7QUFDaEIsUUFBSSxDQUFDLElBQUs7QUFDVixVQUFNLEVBQUUsT0FBTyxTQUFTLElBQUk7QUFDNUIsVUFBTSxNQUFNLENBQUMsTUFBd0IsT0FBTyxNQUFNLFdBQVcsSUFBSTtBQUVqRSxVQUFNLFdBQVcsb0JBQUksSUFBWTtBQUNqQyxlQUFXLEtBQUssQ0FBQyxPQUFPLFdBQVcsVUFBVSxTQUFTLEdBQUc7QUFDdkQsVUFBSSxPQUFPLE1BQU0sWUFBWSxFQUFHLFVBQVMsSUFBSSxDQUFDO0FBQUEsSUFDaEQ7QUFDQSxRQUFJLFNBQVMsU0FBUyxFQUFHO0FBRXpCLGVBQVcsV0FBVyxVQUFVO0FBQzlCLFlBQU0sUUFBUSxNQUFNLElBQUksT0FBTyxXQUFXLEVBQUUsUUFBUTtBQUFBLFFBQ2xELE9BQU8sRUFBRSxJQUFJLFFBQVE7QUFBQSxRQUNyQixRQUFRLENBQUMsTUFBTSxVQUFVLFlBQVksT0FBTyxtQkFBbUI7QUFBQSxNQUNqRSxDQUFDO0FBQ0QsVUFBSSxDQUFDLE1BQU87QUFDWixZQUFNLFNBQVMsT0FBTyxNQUFNLFdBQVcsV0FBVyxNQUFNLFNBQVM7QUFDakUsVUFBSSxXQUFXLGNBQWMsV0FBVyxVQUFXO0FBRW5ELFlBQU0sUUFBUSxNQUFNLElBQUksT0FBTyxxQkFBcUIsRUFBRSxLQUFLO0FBQUEsUUFDekQsT0FBTyxFQUFFLFdBQVcsUUFBUTtBQUFBLFFBQzVCLFFBQVEsQ0FBQyxZQUFZLGNBQWMsVUFBVTtBQUFBLFFBQzdDLEtBQUs7QUFBQSxNQUNQLENBQUM7QUFFRCxVQUFJLENBQUMsU0FBUyxNQUFNLFdBQVcsRUFBRztBQUVsQyxVQUFJLFdBQVc7QUFDZixpQkFBVyxLQUFLLE1BQU8sYUFBWSxJQUFJLEVBQUUsUUFBUSxJQUFJLElBQUksRUFBRSxVQUFVLEtBQUssSUFBSSxJQUFJLEVBQUUsUUFBUSxJQUFJO0FBQ2hHLGlCQUFXLEtBQUssTUFBTSxXQUFXLEdBQUcsSUFBSTtBQUV4QyxZQUFNLGlCQUFpQixLQUFLLE1BQU0sWUFBWSxJQUFJLE1BQU0sUUFBUSxJQUFJLE9BQU8sR0FBRyxJQUFJO0FBQ2xGLFlBQU0sUUFBUSxLQUFLLE9BQU8sV0FBVyxpQkFBaUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxJQUFJLE1BQU0saUJBQWlCLEtBQUssR0FBRyxJQUFJO0FBRTlHLFlBQU0sSUFBSSxPQUFPLFdBQVcsRUFBRTtBQUFBLFFBQzVCLEVBQUUsSUFBSSxTQUFTLFVBQVUsaUJBQWlCLGdCQUFnQixhQUFhLE1BQU07QUFBQSxRQUM3RSxFQUFFLE9BQU8sRUFBRSxJQUFJLFFBQVEsRUFBRTtBQUFBLE1BQzNCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLElBQU8sK0JBQVEsQ0FBQyx3QkFBd0Isd0JBQXdCLGdCQUFnQjs7O0FDeERoRixJQUFNLHFCQUEyQjtBQUFBLEVBQy9CLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFFBQVEsQ0FBQyxnQkFBZ0IsY0FBYztBQUFBLEVBQ3ZDLFVBQVU7QUFBQSxFQUNWLGFBQWE7QUFBQSxFQUNiLFNBQVMsT0FBTyxRQUFxQjtBQUluQyxhQUFTLE9BQ1AsU0FDQSxNQUNBQyxTQUNBLGNBQXNCLFNBQ2Y7QUFDUCxZQUFNLE1BQU0sSUFBSSxNQUFNLE9BQU87QUFLN0IsVUFBSSxPQUFPO0FBQ1gsVUFBSSxTQUFTQTtBQUNiLFVBQUksY0FBYztBQUNsQixhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sRUFBRSxNQUFNLElBQUk7QUFDbEIsVUFBTSxXQUFXLElBQUk7QUFDckIsVUFBTSxRQUNILE9BQU8sTUFBTSxlQUFlLFlBQVksTUFBTSxjQUM5QyxPQUFPLFVBQVUsZUFBZSxZQUFhLFNBQVMsY0FDdkQ7QUFDRixVQUFNLE1BQ0gsT0FBTyxNQUFNLGFBQWEsWUFBWSxNQUFNLFlBQzVDLE9BQU8sVUFBVSxhQUFhLFlBQWEsU0FBUyxZQUNyRDtBQUNGLFFBQUksU0FBUyxPQUFPLFFBQVEsS0FBSztBQUMvQixZQUFNLE9BQU8sd0JBQXdCLEtBQUssaUNBQWlDLEdBQUcsTUFBTSxxQkFBcUIsR0FBRztBQUFBLElBQzlHO0FBQ0EsVUFBTSxTQUNILE9BQU8sTUFBTSxXQUFXLFlBQVksTUFBTSxVQUMxQyxPQUFPLFVBQVUsV0FBVyxZQUFhLFNBQVMsVUFDbkQ7QUFDRixRQUFJLFdBQVcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU07QUFDaEQsWUFBTSxPQUFPLDZFQUE2RSxxQkFBcUIsR0FBRztBQUFBLElBQ3BIO0FBQUEsRUFDRjtBQUNGO0FBb0JBLElBQU0seUJBQStCO0FBQUEsRUFDbkMsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsUUFBUSxDQUFDLGFBQWE7QUFBQSxFQUN0QixVQUFVO0FBQUEsRUFDVixPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsRUFDVCxhQUFhO0FBQUEsRUFDYixTQUFTLE9BQU8sUUFBcUI7QUFDbkMsVUFBTSxFQUFFLE1BQU0sSUFBSTtBQUNsQixVQUFNLFdBQVcsSUFBSTtBQUVyQixRQUFJLE9BQU8sTUFBTSxXQUFXLFNBQVU7QUFDdEMsUUFBSSxZQUFZLE1BQU0sV0FBVyxTQUFTLE9BQVE7QUFDbEQsVUFBTSxNQUFNLElBQUk7QUFDaEIsUUFBSSxDQUFDLElBQUs7QUFDVixVQUFNLGFBQ0gsT0FBTyxNQUFNLE9BQU8sWUFBWSxNQUFNLE9BQ3RDLE9BQU8sVUFBVSxPQUFPLFdBQVksU0FBUyxLQUFnQjtBQUNoRSxRQUFJLENBQUMsV0FBWTtBQUNqQixlQUFXLE1BQU0sQ0FBQyxVQUFVLEdBQUc7QUFFN0IsWUFBTSxhQUFhLE1BQU0sSUFBSSxPQUFPLHFCQUFxQixFQUFFLEtBQUs7QUFBQSxRQUM5RCxPQUFPLEVBQUUsY0FBYyxHQUFHO0FBQUEsUUFBRyxRQUFRLENBQUMsWUFBWSxRQUFRO0FBQUEsUUFBRyxLQUFLO0FBQUEsTUFDcEUsQ0FBQztBQUNELFlBQU0sVUFBVSxNQUFNLEtBQUssSUFBSTtBQUFBLFFBQzdCLFdBQVcsSUFBSSxDQUFDLE1BQU8sT0FBTyxFQUFFLGFBQWEsV0FBVyxFQUFFLFdBQVcsRUFBRyxFQUFFLE9BQU8sT0FBTztBQUFBLE1BQzFGLENBQUM7QUFDRCxZQUFNLGlCQUFpQixRQUFRLFNBQVMsSUFDcEMsTUFBTSxJQUFJLE9BQU8sVUFBVSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssUUFBUSxHQUFHLGNBQWMsS0FBSyxFQUFFLENBQUMsSUFDMUY7QUFDSixZQUFNLG1CQUFtQixNQUFNLElBQUksT0FBTyxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDbEcsWUFBTSxTQUFTLE1BQU0sSUFBSSxPQUFPLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsY0FBYyxJQUFJLE9BQU8sYUFBYSxFQUFFLENBQUM7QUFDN0csWUFBTSxVQUFVLE1BQU0sSUFBSSxPQUFPLGlCQUFpQixFQUFFLEtBQUs7QUFBQSxRQUN2RCxPQUFPLEVBQUUsY0FBYyxJQUFJLE9BQU8sYUFBYTtBQUFBLFFBQUcsUUFBUSxDQUFDLFFBQVE7QUFBQSxRQUFHLEtBQUs7QUFBQSxNQUM3RSxDQUFDO0FBQ0QsWUFBTSxnQkFBZ0IsUUFBUTtBQUFBLFFBQzVCLENBQUMsS0FBSyxRQUFRLE9BQU8sT0FBTyxJQUFJLFdBQVcsV0FBVyxJQUFJLFNBQVMsT0FBTyxJQUFJLE1BQU0sS0FBSztBQUFBLFFBQUk7QUFBQSxNQUMvRjtBQUNBLFlBQU0sSUFBSSxPQUFPLGNBQWMsRUFBRSxPQUFPO0FBQUEsUUFDdEM7QUFBQSxRQUNBLFVBQVUsV0FBVztBQUFBLFFBQ3JCLGVBQWUsV0FBVyxPQUFPLENBQUMsTUFBTSxFQUFFLFdBQVcsZUFBZSxFQUFFLFdBQVcsV0FBVyxFQUFFO0FBQUEsUUFDOUYsV0FBVyxRQUFRO0FBQUEsUUFDbkIscUJBQXFCO0FBQUEsUUFDckIsbUJBQW1CO0FBQUEsUUFDbkIsdUJBQXVCO0FBQUEsUUFDdkIsZ0JBQWdCO0FBQUEsTUFDbEIsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUFBLElBRXRCO0FBQUEsRUFDRjtBQUNGO0FBU08sSUFBTSx5QkFBNEM7QUFBQSxFQUN2RDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBT08sSUFBTSw2QkFBZ0QsQ0FBQyxNQUFNLEdBQUcsc0JBQXNCO0FBRTdGLElBQU8sd0JBQVEsQ0FBQyxvQkFBb0Isc0JBQXNCOzs7QUNqSjFELElBQU0sMEJBQWdDO0FBQUEsRUFDcEMsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBQ1IsUUFBUSxDQUFDLGdCQUFnQixjQUFjO0FBQUEsRUFDdkMsVUFBVTtBQUFBLEVBQ1YsYUFBYTtBQUFBLEVBQ2IsU0FBUyxPQUFPLFFBQXFCO0FBS25DLFFBQUksSUFBSSxVQUFVLGtCQUFrQixJQUFJLFVBQVUsU0FBUyxVQUFXO0FBRXRFLFVBQU0sRUFBRSxNQUFNLElBQUk7QUFDbEIsVUFBTSxXQUFXLElBQUk7QUFDckIsVUFBTSxTQUNILE9BQU8sTUFBTSxXQUFXLFlBQVksTUFBTSxXQUMxQyxPQUFPLFVBQVUsV0FBVyxXQUFZLFNBQVMsU0FBb0I7QUFDeEUsUUFBSSxDQUFDLE9BQVE7QUFLYixVQUFNLFlBQVksV0FBVyxlQUFlLFdBQVc7QUFDdkQsVUFBTSxjQUFjLE9BQU8sVUFBVSxXQUFXLFdBQVksU0FBUyxTQUFvQjtBQUN6RixVQUFNLGVBQWUsZ0JBQWdCLGVBQWUsZ0JBQWdCO0FBRXBFLFFBQUksV0FBVztBQUNiLFlBQU0sZ0JBQWdCO0FBS3RCLFlBQU0sV0FBVyxNQUFNLGlCQUFpQixVQUFVO0FBQ2xELFVBQUksQ0FBQyxpQkFBaUIsYUFBYSxVQUFhLGFBQWEsUUFBUSxhQUFhLEtBQUs7QUFDckYsY0FBTSxpQkFBZ0Isb0JBQUksS0FBSyxHQUFFLFlBQVk7QUFBQSxNQUMvQztBQUNBO0FBQUEsSUFDRjtBQU9BLFFBQUksZ0JBQWdCLE9BQU8sTUFBTSxXQUFXLFVBQVU7QUFDcEQsWUFBTSxnQkFBZ0I7QUFDdEIsWUFBTSxnQkFBZ0I7QUFDdEI7QUFBQSxJQUNGO0FBQ0EsUUFBSSxJQUFJLFVBQVUsa0JBQWtCLE1BQU0sa0JBQWtCLFFBQVc7QUFDckUsWUFBTSxnQkFBZ0I7QUFBQSxJQUN4QjtBQUFBLEVBQ0Y7QUFDRjtBQStCQSxJQUFNLDJCQUFpQztBQUFBLEVBQ3JDLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFFBQVEsQ0FBQyxlQUFlLGFBQWE7QUFBQSxFQUNyQyxVQUFVO0FBQUEsRUFDVixPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsRUFDVCxPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFDYixTQUFTLE9BQU8sUUFBcUI7QUFDbkMsVUFBTSxNQUFNLElBQUk7QUFDaEIsUUFBSSxDQUFDLElBQUs7QUFDVixVQUFNLEVBQUUsTUFBTSxJQUFJO0FBQ2xCLFVBQU0sV0FBVyxJQUFJO0FBQ3JCLFFBQUksT0FBTyxXQUFXLGVBQWdCO0FBSXRDLFFBQUksVUFBVSxXQUFXLGVBQWdCO0FBRXpDLFVBQU0sU0FDSCxPQUFPLE9BQU8sYUFBYSxZQUFZLE1BQU0sYUFDN0MsT0FBTyxVQUFVLGFBQWEsV0FBWSxTQUFTLFdBQXNCO0FBQzVFLFVBQU0sWUFDSCxPQUFPLE9BQU8sZ0JBQWdCLFlBQVksTUFBTSxnQkFDaEQsT0FBTyxVQUFVLGdCQUFnQixXQUFZLFNBQVMsY0FBeUI7QUFNbEYsUUFBSSxRQUFRO0FBQ1YsWUFBTSxJQUFJLE9BQU8sVUFBVSxFQUFFO0FBQUEsUUFDM0IsRUFBRSxJQUFJLFFBQVEsZUFBZSxLQUFLO0FBQUEsUUFDbEMsRUFBRSxPQUFPLEVBQUUsSUFBSSxPQUFPLEVBQUU7QUFBQSxNQUMxQjtBQUFBLElBQ0Y7QUFDQSxRQUFJLFdBQVc7QUFDYixZQUFNLElBQUksT0FBTyxhQUFhLEVBQUU7QUFBQSxRQUM5QixFQUFFLElBQUksV0FBVyxlQUFlLEtBQUs7QUFBQSxRQUNyQyxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsRUFBRTtBQUFBLE1BQzdCO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQTJCQSxJQUFNLCtCQUFxQztBQUFBLEVBQ3pDLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUNSLFFBQVEsQ0FBQyxlQUFlLGVBQWUsYUFBYTtBQUFBLEVBQ3BELFVBQVU7QUFBQSxFQUNWLE9BQU87QUFBQSxFQUNQLFNBQVM7QUFBQSxFQUNULE9BQU87QUFBQSxFQUNQLGFBQWE7QUFBQSxFQUNiLFNBQVMsT0FBTyxRQUFxQjtBQUNuQyxVQUFNLE1BQU0sSUFBSTtBQUNoQixRQUFJLENBQUMsSUFBSztBQUNWLFVBQU0sRUFBRSxNQUFNLElBQUk7QUFDbEIsVUFBTSxXQUFXLElBQUk7QUFDckIsVUFBTSxjQUFjLE1BQU0sS0FBSyxJQUFJLElBQUk7QUFBQSxNQUNyQyxPQUFPLE9BQU8saUJBQWlCLFdBQVcsTUFBTSxlQUFlO0FBQUEsTUFDL0QsT0FBTyxVQUFVLGlCQUFpQixXQUFZLFNBQVMsZUFBMEI7QUFBQSxJQUNuRixFQUFFLE9BQU8sT0FBTyxDQUFDLENBQUM7QUFDbEIsZUFBVyxNQUFNLGFBQWE7QUFFNUIsWUFBTSxhQUFhLE1BQU0sSUFBSSxPQUFPLHFCQUFxQixFQUFFLEtBQUs7QUFBQSxRQUM5RCxPQUFPLEVBQUUsY0FBYyxHQUFHO0FBQUEsUUFBRyxRQUFRLENBQUMsWUFBWSxRQUFRO0FBQUEsUUFBRyxLQUFLO0FBQUEsTUFDcEUsQ0FBQztBQUNELFlBQU0sVUFBVSxNQUFNLEtBQUssSUFBSTtBQUFBLFFBQzdCLFdBQVcsSUFBSSxDQUFDLE1BQU8sT0FBTyxFQUFFLGFBQWEsV0FBVyxFQUFFLFdBQVcsRUFBRyxFQUFFLE9BQU8sT0FBTztBQUFBLE1BQzFGLENBQUM7QUFDRCxZQUFNLGlCQUFpQixRQUFRLFNBQVMsSUFDcEMsTUFBTSxJQUFJLE9BQU8sVUFBVSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssUUFBUSxHQUFHLGNBQWMsS0FBSyxFQUFFLENBQUMsSUFDMUY7QUFDSixZQUFNLG1CQUFtQixNQUFNLElBQUksT0FBTyxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDbEcsWUFBTSxTQUFTLE1BQU0sSUFBSSxPQUFPLGlCQUFpQixFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsY0FBYyxJQUFJLE9BQU8sYUFBYSxFQUFFLENBQUM7QUFDN0csWUFBTSxVQUFVLE1BQU0sSUFBSSxPQUFPLGlCQUFpQixFQUFFLEtBQUs7QUFBQSxRQUN2RCxPQUFPLEVBQUUsY0FBYyxJQUFJLE9BQU8sYUFBYTtBQUFBLFFBQUcsUUFBUSxDQUFDLFFBQVE7QUFBQSxRQUFHLEtBQUs7QUFBQSxNQUM3RSxDQUFDO0FBQ0QsWUFBTSxnQkFBZ0IsUUFBUTtBQUFBLFFBQzVCLENBQUMsS0FBSyxRQUFRLE9BQU8sT0FBTyxJQUFJLFdBQVcsV0FBVyxJQUFJLFNBQVMsT0FBTyxJQUFJLE1BQU0sS0FBSztBQUFBLFFBQUk7QUFBQSxNQUMvRjtBQUNBLFlBQU0sSUFBSSxPQUFPLGNBQWMsRUFBRSxPQUFPO0FBQUEsUUFDdEM7QUFBQSxRQUNBLFVBQVUsV0FBVztBQUFBLFFBQ3JCLGVBQWUsV0FBVyxPQUFPLENBQUMsTUFBTSxFQUFFLFdBQVcsZUFBZSxFQUFFLFdBQVcsV0FBVyxFQUFFO0FBQUEsUUFDOUYsV0FBVyxRQUFRO0FBQUEsUUFDbkIscUJBQXFCO0FBQUEsUUFDckIsbUJBQW1CO0FBQUEsUUFDbkIsdUJBQXVCO0FBQUEsUUFDdkIsZ0JBQWdCO0FBQUEsTUFDbEIsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUFBLElBRXRCO0FBQUEsRUFDRjtBQUNGO0FBRUEsSUFBTywrQkFBUTtBQUFBLEVBQ2I7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGOzs7QUNoUUEsU0FBUyxLQUFBQyxLQUFHLE9BQUFDLFlBQVc7QUFLaEIsSUFBTSxxQkFBMkI7QUFBQSxFQUN0QyxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFDYixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFFUixXQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtULEVBQUUsTUFBTSxZQUFZLE1BQU0sUUFBUSxTQUFTLE1BQU0sVUFBVSxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQW9CakUsRUFBRSxNQUFNLHFCQUFxQixNQUFNLFdBQVcsU0FBUyxNQUFNLFVBQVUsT0FBTyxjQUFjLE1BQU07QUFBQSxJQUNsRyxFQUFFLE1BQU0sbUJBQW1CLE1BQU0sUUFBUSxTQUFTLE1BQU0sVUFBVSxNQUFNO0FBQUEsSUFDeEUsRUFBRSxNQUFNLHFCQUFxQixNQUFNLFFBQVEsU0FBUyxNQUFNLFVBQVUsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFXMUUsRUFBRSxNQUFNLGFBQWEsTUFBTSxRQUFRLFNBQVMsTUFBTSxVQUFVLE1BQU07QUFBQSxFQUNwRTtBQUFBLEVBRUEsT0FBTztBQUFBLElBQ0wsRUFBRSxJQUFJLFNBQVMsTUFBTSxTQUFTLE9BQU8sU0FBUyxRQUFRLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFBQSxJQUNqRjtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQVksTUFBTTtBQUFBLE1BQVUsT0FBTztBQUFBLE1BQ3ZDLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQXlCTixhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBTWIsUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUF1Qk4sRUFBRSxNQUFNLHFCQUFxQixPQUFPLHVCQUF1QixNQUFNLFdBQVcsY0FBY0Msd0JBQXVCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUE0QmpILEVBQUUsTUFBTSxtQkFBbUIsT0FBTyxvQkFBb0IsTUFBTSxRQUFRLFVBQVUsTUFBTSxjQUFjQSwwQkFBeUIsYUFBYSw0QkFBNEI7QUFBQSxVQUNwSyxFQUFFLE1BQU0scUJBQXFCLE9BQU8sc0JBQXNCLE1BQU0sWUFBWSxVQUFVLE1BQU0sY0FBY0EsNkVBQTRFLGFBQWEsNEJBQTRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBOEIvTixFQUFFLE1BQU0sYUFBYSxPQUFPLGNBQWMsTUFBTSxRQUFRLFVBQVUsTUFBTSxjQUFjQSxnQ0FBK0IsYUFBYSw0QkFBNEI7QUFBQSxRQUNoSztBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFLRSxJQUFJO0FBQUEsTUFBWSxNQUFNO0FBQUEsTUFBYyxPQUFPO0FBQUEsTUFDM0MsUUFBUSxFQUFFLFlBQVksWUFBWSxRQUFRLEVBQUUsSUFBSUEsZUFBYyxHQUFHLGdCQUFnQixhQUFhO0FBQUEsSUFDaEc7QUFBQSxJQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BTUUsSUFBSTtBQUFBLE1BQXNCLE1BQU07QUFBQSxNQUFZLE9BQU87QUFBQSxJQUNyRDtBQUFBLElBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1Bb0JFLElBQUk7QUFBQSxNQUFrQixNQUFNO0FBQUEsTUFBYyxPQUFPO0FBQUEsTUFDakQsUUFBUTtBQUFBLFFBQ04sYUFBYTtBQUFBLFVBQ1gsa0JBQ0VBO0FBQUEsUUFDSjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFLRSxJQUFJO0FBQUEsTUFBd0IsTUFBTTtBQUFBLE1BQWMsT0FBTztBQUFBLE1BQ3ZELFFBQVEsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEtBQUssRUFBRTtBQUFBLElBQ3BEO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQTRERSxJQUFJO0FBQUEsTUFBOEIsTUFBTTtBQUFBLE1BQVUsT0FBTztBQUFBLE1BQ3pELFFBQVE7QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLGFBQ0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFNRixjQUFjO0FBQUEsTUFDaEI7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBO0FBQUEsTUFFRSxJQUFJO0FBQUEsTUFBcUIsTUFBTTtBQUFBLE1BQVksT0FBTztBQUFBLElBQ3BEO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFXRSxJQUFJO0FBQUEsTUFBcUIsTUFBTTtBQUFBLE1BQVUsT0FBTztBQUFBLE1BQ2hELFFBQVE7QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLGFBQ0U7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUlGLGNBQWM7QUFBQSxNQUNoQjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQVFFLElBQUk7QUFBQSxNQUFzQixNQUFNO0FBQUEsTUFBWSxPQUFPO0FBQUEsSUFDckQ7QUFBQSxJQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFtQkUsSUFBSTtBQUFBLE1BQXVCLE1BQU07QUFBQSxNQUFVLE9BQU87QUFBQSxNQUNsRCxRQUFRO0FBQUEsUUFDTixPQUFPO0FBQUEsUUFDUCxhQUNFO0FBQUEsUUFDRixjQUFjO0FBQUEsTUFDaEI7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQXlERSxJQUFJO0FBQUEsTUFBZ0IsTUFBTTtBQUFBLE1BQWMsT0FBTztBQUFBLE1BQy9DLFFBQVEsRUFBRSxZQUFZLGVBQWUsUUFBUSxFQUFFLGlCQUFpQkEsb0NBQW1DLEdBQUcsZ0JBQWdCLGlCQUFpQjtBQUFBLElBQ3pJO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQSxNQUdFLElBQUk7QUFBQSxNQUFvQixNQUFNO0FBQUEsTUFBWSxPQUFPO0FBQUEsSUFDbkQ7QUFBQSxJQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFVRSxJQUFJO0FBQUEsTUFBa0IsTUFBTTtBQUFBLE1BQWlCLE9BQU87QUFBQSxNQUNwRCxRQUFRO0FBQUEsUUFDTixZQUFZO0FBQUEsUUFDWixRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUFJTixNQUFNQTtBQUFBLFVBQXlCLE9BQU9BO0FBQUEsVUFDdEMsU0FBU0E7QUFBQSxVQUNULFVBQVVBO0FBQUEsVUFDVixnQkFBZ0JBO0FBQUEsVUFDaEIscUJBQXFCQTtBQUFBLFVBQ3JCLGlCQUFpQkE7QUFBQSxVQUNqQixVQUFVQTtBQUFBLFVBQXNCLFdBQVc7QUFBQSxRQUM3QztBQUFBLFFBQ0EsZ0JBQWdCO0FBQUEsTUFDbEI7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQW1CLE1BQU07QUFBQSxNQUFjLE9BQU87QUFBQSxNQUNsRCxRQUFRLEVBQUUsYUFBYSxFQUFFLFdBQVdBLHdCQUF1QixFQUFFO0FBQUEsSUFDL0Q7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFBd0IsTUFBTTtBQUFBLE1BQWMsT0FBTztBQUFBLE1BQ3ZELFFBQVEsRUFBRSxhQUFhLEVBQUUsV0FBV0Esd0JBQXVCLEVBQUU7QUFBQSxJQUMvRDtBQUFBLElBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQU9FLElBQUk7QUFBQSxNQUFnQixNQUFNO0FBQUEsTUFBYyxPQUFPO0FBQUEsTUFDL0MsUUFBUTtBQUFBLFFBQ04sWUFBWTtBQUFBLFFBQ1osUUFBUSxFQUFFLE9BQU9BLHVCQUFzQjtBQUFBLFFBQ3ZDLGdCQUFnQjtBQUFBLE1BQ2xCO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQTtBQUFBLE1BRUUsSUFBSTtBQUFBLE1BQW9CLE1BQU07QUFBQSxNQUFZLE9BQU87QUFBQSxJQUNuRDtBQUFBLElBQ0E7QUFBQTtBQUFBLE1BRUUsSUFBSTtBQUFBLE1BQWtCLE1BQU07QUFBQSxNQUFpQixPQUFPO0FBQUEsTUFDcEQsUUFBUTtBQUFBLFFBQ04sWUFBWTtBQUFBLFFBQ1osUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQWVOLFlBQVlBO0FBQUEsVUFDWixRQUFRQTtBQUFBLFVBQ1IsYUFBYUE7QUFBQSxVQUNiLGFBQWFBO0FBQUEsVUFDYixlQUFlQTtBQUFBLFVBQ2YsWUFBWUE7QUFBQSxVQUE0QixXQUFXQTtBQUFBLFVBQ25ELE9BQU9BO0FBQUEsVUFBdUIsT0FBT0E7QUFBQSxVQUNyQyxPQUFPQTtBQUFBLFVBQXNELGFBQWFBO0FBQUEsVUFDMUUsWUFBWTtBQUFBLFVBQU0sVUFBVUE7QUFBQSxRQUM5QjtBQUFBLFFBQ0EsZ0JBQWdCO0FBQUEsTUFDbEI7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQW1CLE1BQU07QUFBQSxNQUFjLE9BQU87QUFBQSxNQUNsRCxRQUFRLEVBQUUsYUFBYSxFQUFFLFdBQVdBLHdCQUF1QixFQUFFO0FBQUEsSUFDL0Q7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFBd0IsTUFBTTtBQUFBLE1BQWMsT0FBTztBQUFBLE1BQ3ZELFFBQVEsRUFBRSxhQUFhLEVBQUUsV0FBV0Esd0JBQXVCLEVBQUU7QUFBQSxJQUMvRDtBQUFBLElBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQXNCRSxJQUFJO0FBQUEsTUFBZ0MsTUFBTTtBQUFBLE1BQVksT0FBTztBQUFBLElBQy9EO0FBQUEsSUFDQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQTZCLE1BQU07QUFBQSxNQUFpQixPQUFPO0FBQUEsTUFDL0QsUUFBUSxFQUFFLFlBQVksZUFBZSxRQUFRLEVBQUUsSUFBSUEsZ0JBQWUsR0FBRyxRQUFRLEVBQUUsYUFBYSxLQUFLLEVBQUU7QUFBQSxJQUNyRztBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUFrQyxNQUFNO0FBQUEsTUFBWSxPQUFPO0FBQUEsSUFDakU7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFBK0IsTUFBTTtBQUFBLE1BQWlCLE9BQU87QUFBQSxNQUNqRSxRQUFRLEVBQUUsWUFBWSxlQUFlLFFBQVEsRUFBRSxJQUFJQSxnQkFBZSxHQUFHLFFBQVEsRUFBRSxlQUFlLEtBQUssRUFBRTtBQUFBLElBQ3ZHO0FBQUEsSUFDQTtBQUFBO0FBQUEsTUFFRSxJQUFJO0FBQUEsTUFBd0IsTUFBTTtBQUFBLE1BQVksT0FBTztBQUFBLElBQ3ZEO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQU1FLElBQUk7QUFBQSxNQUFzQixNQUFNO0FBQUEsTUFBaUIsT0FBTztBQUFBLE1BQ3hELFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUNaLFFBQVE7QUFBQSxVQUNOLE1BQU1BO0FBQUEsVUFBc0IsYUFBYUE7QUFBQSxVQUFnQixpQkFBaUJBO0FBQUEsVUFDMUUsUUFBUUE7QUFBQSxVQUF3QixPQUFPO0FBQUEsVUFBZSxhQUFhO0FBQUEsVUFDbkUsYUFBYUE7QUFBQSxVQUNiLFlBQVlBO0FBQUEsVUFBZ0IsVUFBVUE7QUFBQSxRQUN4QztBQUFBLFFBQ0EsZ0JBQWdCO0FBQUEsTUFDbEI7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BT0UsSUFBSTtBQUFBLE1BQXVCLE1BQU07QUFBQSxNQUFjLE9BQU87QUFBQSxNQUN0RCxRQUFRLEVBQUUsYUFBYSxFQUFFLGVBQWVBLDRCQUEyQixFQUFFO0FBQUEsSUFDdkU7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFBa0IsTUFBTTtBQUFBLE1BQWMsT0FBTztBQUFBLE1BQ2pELFFBQVEsRUFBRSxhQUFhLEVBQUUsZUFBZSxLQUFLLEVBQUU7QUFBQSxJQUNqRDtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUFrQixNQUFNO0FBQUEsTUFBaUIsT0FBTztBQUFBLE1BQ3BELFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUFZLFFBQVEsRUFBRSxJQUFJQSxlQUFjO0FBQUEsUUFDcEQsUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBSU4sY0FBYztBQUFBLFVBQU0sUUFBUTtBQUFBLFVBQWEsZ0JBQWdCQTtBQUFBLFVBQ3pELG1CQUFtQkE7QUFBQSxVQUFnQixtQkFBbUJBO0FBQUEsVUFDdEQsdUJBQXVCQTtBQUFBLFFBQ3pCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUE7QUFBQTtBQUFBLE1BR0UsSUFBSTtBQUFBLE1BQXFCLE1BQU07QUFBQSxNQUFVLE9BQU87QUFBQSxNQUNoRCxRQUFRO0FBQUEsUUFDTixZQUFZLENBQUNBLHFCQUFvQjtBQUFBLFFBQ2pDLFVBQVUsQ0FBQyxTQUFTLE9BQU87QUFBQSxRQUMzQixPQUFPO0FBQUEsUUFDUCxVQUFVO0FBQUEsUUFDVixjQUFjLEVBQUUsWUFBWUEsNkJBQTRCLFdBQVdBLDJCQUEwQjtBQUFBLFFBQzdGLFdBQVc7QUFBQSxNQUNiO0FBQUEsSUFDRjtBQUFBLElBQ0EsRUFBRSxJQUFJLE9BQU8sTUFBTSxPQUFPLE9BQU8sTUFBTTtBQUFBLEVBQ3pDO0FBQUEsRUFFQSxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtMLEVBQUUsSUFBSSxNQUFNLFFBQVEsU0FBUyxRQUFRLFlBQVksTUFBTSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVFqRSxFQUFFLElBQUksT0FBTyxRQUFRLFlBQVksUUFBUSxxQkFBcUIsTUFBTSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFnQjlFLEVBQUUsSUFBSSxPQUFPLFFBQVEscUJBQXFCLFFBQVEscUJBQXFCLE1BQU0sV0FBVyxXQUFXQztBQUFBLGlJQUMwQixPQUFPLGVBQWU7QUFBQSxJQUNuSixFQUFFLElBQUksT0FBTyxRQUFRLHFCQUFxQixRQUFRLHNCQUFzQixNQUFNLFdBQVcsV0FBV0E7QUFBQSxpSUFDeUIsT0FBTyxRQUFRO0FBQUE7QUFBQSxJQUU1SSxFQUFFLElBQUksT0FBTyxRQUFRLHFCQUFxQixRQUFRLE9BQU8sTUFBTSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQTZCekUsRUFBRSxJQUFJLE9BQU8sUUFBUSxzQkFBc0IsUUFBUSxrQkFBa0IsTUFBTSxXQUFXLFdBQVdBLHVIQUFxSCxPQUFPLFlBQVk7QUFBQSxJQUN6TyxFQUFFLElBQUksT0FBTyxRQUFRLHNCQUFzQixRQUFRLDhCQUE4QixNQUFNLFdBQVcsV0FBV0EsdUhBQXFILE9BQU8sWUFBWTtBQUFBLElBQ3JQLEVBQUUsSUFBSSxPQUFPLFFBQVEsc0JBQXNCLFFBQVEsd0JBQXdCLE1BQU0sV0FBVyxXQUFXQSw4S0FBNEssT0FBTyxRQUFRO0FBQUE7QUFBQSxJQUVsUyxFQUFFLElBQUksT0FBTyxRQUFRLGtCQUFrQixRQUFRLHNCQUFzQixNQUFNLFVBQVU7QUFBQSxJQUNyRixFQUFFLElBQUksT0FBTyxRQUFRLHdCQUF3QixRQUFRLHNCQUFzQixNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVUzRixFQUFFLElBQUksT0FBTyxRQUFRLHNCQUFzQixRQUFRLFlBQVksTUFBTSxXQUFXLFdBQVdBLHNIQUFvSCxPQUFPLGdCQUFnQjtBQUFBLElBQ3RPLEVBQUUsSUFBSSxPQUFPLFFBQVEsc0JBQXNCLFFBQVEsdUJBQXVCLE1BQU0sV0FBVyxXQUFXQSx1SEFBcUgsT0FBTyxlQUFlO0FBQUE7QUFBQSxJQUVqUCxFQUFFLElBQUksT0FBTyxRQUFRLHVCQUF1QixRQUFRLE9BQU8sTUFBTSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUszRSxFQUFFLElBQUksT0FBTyxRQUFRLDhCQUE4QixRQUFRLE9BQU8sTUFBTSxVQUFVO0FBQUEsSUFDbEYsRUFBRSxJQUFJLE1BQU0sUUFBUSxZQUFZLFFBQVEsZ0JBQWdCLE1BQU0sVUFBVTtBQUFBLElBQ3hFLEVBQUUsSUFBSSxNQUFNLFFBQVEsZ0JBQWdCLFFBQVEsb0JBQW9CLE1BQU0sVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBT2hGLEVBQUUsSUFBSSxNQUFNLFFBQVEsb0JBQW9CLFFBQVEsd0JBQXdCLE1BQU0sV0FBVyxXQUFXQSxrQ0FBZ0MsT0FBTyxXQUFXO0FBQUEsSUFDdEosRUFBRSxJQUFJLE1BQU0sUUFBUSxvQkFBb0IsUUFBUSxrQkFBa0IsTUFBTSxXQUFXLFdBQVdBLGtDQUFnQyxPQUFPLE1BQU07QUFBQSxJQUMzSSxFQUFFLElBQUksTUFBTSxRQUFRLGtCQUFrQixRQUFRLG1CQUFtQixNQUFNLFVBQVU7QUFBQTtBQUFBLElBRWpGLEVBQUUsSUFBSSxNQUFNLFFBQVEsbUJBQW1CLFFBQVEsZ0JBQWdCLE1BQU0sVUFBVTtBQUFBLElBQy9FLEVBQUUsSUFBSSxNQUFNLFFBQVEsd0JBQXdCLFFBQVEsZ0JBQWdCLE1BQU0sVUFBVTtBQUFBLElBQ3BGLEVBQUUsSUFBSSxPQUFPLFFBQVEsZ0JBQWdCLFFBQVEsb0JBQW9CLE1BQU0sVUFBVTtBQUFBO0FBQUE7QUFBQSxJQUdqRixFQUFFLElBQUksT0FBTyxRQUFRLG9CQUFvQixRQUFRLHdCQUF3QixNQUFNLFdBQVcsV0FBV0Esa0NBQWdDLE9BQU8sV0FBVztBQUFBLElBQ3ZKLEVBQUUsSUFBSSxPQUFPLFFBQVEsb0JBQW9CLFFBQVEsa0JBQWtCLE1BQU0sV0FBVyxXQUFXQSxrQ0FBZ0MsT0FBTyxNQUFNO0FBQUEsSUFDNUksRUFBRSxJQUFJLE9BQU8sUUFBUSxrQkFBa0IsUUFBUSxtQkFBbUIsTUFBTSxVQUFVO0FBQUEsSUFDbEYsRUFBRSxJQUFJLE9BQU8sUUFBUSxtQkFBbUIsUUFBUSx3QkFBd0IsTUFBTSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTXhGLEVBQUUsSUFBSSxPQUFPLFFBQVEsd0JBQXdCLFFBQVEsZ0NBQWdDLE1BQU0sVUFBVTtBQUFBLElBQ3JHLEVBQUUsSUFBSSxPQUFPLFFBQVEsZ0NBQWdDLFFBQVEsNkJBQTZCLE1BQU0sV0FBVyxXQUFXQSxzR0FBb0csT0FBTyxjQUFjO0FBQUEsSUFDL08sRUFBRSxJQUFJLE9BQU8sUUFBUSxnQ0FBZ0MsUUFBUSxrQ0FBa0MsTUFBTSxXQUFXLFdBQVdBLHdHQUFzRyxPQUFPLFdBQVc7QUFBQSxJQUNuUCxFQUFFLElBQUksT0FBTyxRQUFRLDZCQUE2QixRQUFRLGtDQUFrQyxNQUFNLFVBQVU7QUFBQSxJQUM1RyxFQUFFLElBQUksT0FBTyxRQUFRLGtDQUFrQyxRQUFRLCtCQUErQixNQUFNLFdBQVcsV0FBV0EsMEdBQXdHLE9BQU8sWUFBWTtBQUFBLElBQ3JQLEVBQUUsSUFBSSxPQUFPLFFBQVEsa0NBQWtDLFFBQVEsd0JBQXdCLE1BQU0sV0FBVyxXQUFXQSw0R0FBMEcsT0FBTyxZQUFZO0FBQUEsSUFDaFAsRUFBRSxJQUFJLE9BQU8sUUFBUSwrQkFBK0IsUUFBUSx3QkFBd0IsTUFBTSxVQUFVO0FBQUEsSUFDcEcsRUFBRSxJQUFJLE9BQU8sUUFBUSx3QkFBd0IsUUFBUSxzQkFBc0IsTUFBTSxXQUFXLFdBQVdBLHFDQUFtQyxPQUFPLE1BQU07QUFBQSxJQUN2SixFQUFFLElBQUksT0FBTyxRQUFRLHdCQUF3QixRQUFRLGtCQUFrQixNQUFNLFdBQVcsV0FBV0EscUNBQW1DLE9BQU8sS0FBSztBQUFBLElBQ2xKLEVBQUUsSUFBSSxPQUFPLFFBQVEsc0JBQXNCLFFBQVEsdUJBQXVCLE1BQU0sVUFBVTtBQUFBLElBQzFGLEVBQUUsSUFBSSxRQUFRLFFBQVEsdUJBQXVCLFFBQVEsa0JBQWtCLE1BQU0sVUFBVTtBQUFBLElBQ3ZGLEVBQUUsSUFBSSxRQUFRLFFBQVEsa0JBQWtCLFFBQVEsa0JBQWtCLE1BQU0sVUFBVTtBQUFBLElBQ2xGLEVBQUUsSUFBSSxPQUFPLFFBQVEsa0JBQWtCLFFBQVEscUJBQXFCLE1BQU0sVUFBVTtBQUFBLElBQ3BGLEVBQUUsSUFBSSxPQUFPLFFBQVEscUJBQXFCLFFBQVEsT0FBTyxNQUFNLFVBQVU7QUFBQSxFQUMzRTtBQUNGOzs7QUMvdUJBLFNBQVMsS0FBQUMsS0FBRyxPQUFBQyxZQUFXO0FBK0NoQixJQUFNLDZCQUFtQztBQUFBLEVBQzlDLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLGFBQ0U7QUFBQSxFQUNGLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUVIsT0FBTztBQUFBLEVBRVAsV0FBVztBQUFBLElBQ1QsRUFBRSxNQUFNLFVBQVUsTUFBTSxRQUFRLFNBQVMsTUFBTSxVQUFVLE1BQU07QUFBQSxFQUNqRTtBQUFBLEVBRUEsT0FBTztBQUFBLElBQ0w7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUNaLGFBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBUWIsV0FBV0M7QUFBQSxNQUNiO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVEsRUFBRSxZQUFZLFlBQVksUUFBUSxFQUFFLElBQUlDLGdCQUFlLEdBQUcsZ0JBQWdCLGFBQWE7QUFBQSxJQUNqRztBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBS04sV0FBVyxDQUFDLEVBQUUsTUFBTSxZQUFZLE9BQU8sZ0JBQWdCLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBS3hELGtCQUFrQjtBQUFBLFFBQ2xCLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQVVWLFlBQVk7QUFBQSxRQUNaLHFCQUFxQjtBQUFBLE1BQ3ZCO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUNaLFFBQVEsRUFBRSxJQUFJQSxnQkFBZTtBQUFBLFFBQzdCLFFBQVEsRUFBRSw0QkFBNEIsV0FBVztBQUFBLE1BQ25EO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxRQUNOLFlBQVksQ0FBQ0EsMkRBQTBEO0FBQUEsUUFDdkUsVUFBVSxDQUFDLE9BQU87QUFBQSxRQUNsQixPQUFPO0FBQUEsUUFDUCxVQUFVO0FBQUEsUUFDVixjQUFjLEVBQUUsWUFBWUEsNkJBQTRCLFdBQVdBLDJCQUEwQjtBQUFBLFFBQzdGLFdBQVc7QUFBQSxNQUNiO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUNaLFFBQVEsRUFBRSxJQUFJQSxnQkFBZTtBQUFBLFFBQzdCLFFBQVEsRUFBRSw0QkFBNEIsV0FBVztBQUFBLE1BQ25EO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxRQUNOLFlBQVksQ0FBQ0EsMkRBQTBEO0FBQUEsUUFDdkUsVUFBVSxDQUFDLE9BQU87QUFBQSxRQUNsQixVQUFVO0FBQUEsUUFDVixPQUFPO0FBQUEsUUFDUCxVQUFVO0FBQUEsUUFDVixjQUFjLEVBQUUsWUFBWUEsNkJBQTRCLFdBQVdBLDJCQUEwQjtBQUFBLFFBQzdGLFdBQVc7QUFBQSxNQUNiO0FBQUEsSUFDRjtBQUFBLElBQ0EsRUFBRSxJQUFJLE9BQU8sTUFBTSxPQUFPLE9BQU8sTUFBTTtBQUFBLEVBQ3pDO0FBQUEsRUFFQSxPQUFPO0FBQUEsSUFDTCxFQUFFLElBQUksTUFBTSxRQUFRLFNBQVMsUUFBUSxZQUFZLE1BQU0sVUFBVTtBQUFBLElBQ2pFLEVBQUUsSUFBSSxNQUFNLFFBQVEsWUFBWSxRQUFRLHFCQUFxQixNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQUEsSUFHN0UsRUFBRSxJQUFJLE1BQU0sUUFBUSxxQkFBcUIsUUFBUSxpQkFBaUIsTUFBTSxXQUFXLE9BQU8sVUFBVTtBQUFBLElBQ3BHLEVBQUUsSUFBSSxNQUFNLFFBQVEscUJBQXFCLFFBQVEsaUJBQWlCLE1BQU0sV0FBVyxPQUFPLFNBQVM7QUFBQSxJQUNuRyxFQUFFLElBQUksTUFBTSxRQUFRLGlCQUFpQixRQUFRLG1CQUFtQixNQUFNLFVBQVU7QUFBQSxJQUNoRixFQUFFLElBQUksTUFBTSxRQUFRLG1CQUFtQixRQUFRLE9BQU8sTUFBTSxVQUFVO0FBQUEsSUFDdEUsRUFBRSxJQUFJLE1BQU0sUUFBUSxpQkFBaUIsUUFBUSxtQkFBbUIsTUFBTSxVQUFVO0FBQUEsSUFDaEYsRUFBRSxJQUFJLE1BQU0sUUFBUSxtQkFBbUIsUUFBUSxPQUFPLE1BQU0sVUFBVTtBQUFBLEVBQ3hFO0FBQ0Y7OztBQ3RMQSxTQUFTLEtBQUFDLEtBQUcsT0FBQUMsWUFBVztBQTREaEIsSUFBTSxzQkFBNEI7QUFBQSxFQUN2QyxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUNFO0FBQUEsRUFDRixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTVIsT0FBTztBQUFBLEVBRVAsV0FBVyxDQUFDLEVBQUUsTUFBTSxhQUFhLE1BQU0sUUFBUSxTQUFTLE1BQU0sVUFBVSxNQUFNLENBQUM7QUFBQSxFQUUvRSxPQUFPO0FBQUEsSUFDTDtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLFFBQ04sWUFBWTtBQUFBLFFBQ1osYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFXYixXQUFXQztBQUFBLE1BQ2I7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLFFBQ04sWUFBWTtBQUFBLFFBQ1osUUFBUSxFQUFFLElBQUlDLGdCQUFlO0FBQUEsUUFDN0IsZ0JBQWdCO0FBQUEsTUFDbEI7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBSU4sV0FBVyxDQUFDLEVBQUUsTUFBTSxZQUFZLE9BQU8sZ0JBQWdCLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBS3hELGtCQUFrQjtBQUFBLFFBQ2xCLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBUVYsWUFBWTtBQUFBLFFBQ1oscUJBQXFCO0FBQUEsTUFDdkI7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLFFBQ04sWUFBWTtBQUFBLFFBQ1osUUFBUSxFQUFFLElBQUlBLGdCQUFlO0FBQUEsUUFDN0IsUUFBUSxFQUFFLGlCQUFpQixXQUFXO0FBQUEsTUFDeEM7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLFFBQ04sWUFBWSxDQUFDQSxpRUFBZ0U7QUFBQSxRQUM3RSxVQUFVLENBQUMsT0FBTztBQUFBLFFBQ2xCLE9BQU87QUFBQSxRQUNQLFVBQVU7QUFBQSxRQUNWLGNBQWMsRUFBRSxNQUFNQSx5QkFBd0I7QUFBQSxRQUM5QyxXQUFXO0FBQUEsTUFDYjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsTUFDUCxRQUFRO0FBQUEsUUFDTixZQUFZO0FBQUEsUUFDWixRQUFRLEVBQUUsSUFBSUEsZ0JBQWU7QUFBQSxRQUM3QixRQUFRLEVBQUUsaUJBQWlCLFdBQVc7QUFBQSxNQUN4QztBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsTUFDUCxRQUFRO0FBQUEsUUFDTixZQUFZLENBQUNBLGlFQUFnRTtBQUFBLFFBQzdFLFVBQVUsQ0FBQyxPQUFPO0FBQUEsUUFDbEIsVUFBVTtBQUFBLFFBQ1YsT0FBTztBQUFBLFFBQ1AsVUFBVTtBQUFBLFFBQ1YsY0FBYyxFQUFFLE1BQU1BLHlCQUF3QjtBQUFBLFFBQzlDLFdBQVc7QUFBQSxNQUNiO0FBQUEsSUFDRjtBQUFBLElBQ0EsRUFBRSxJQUFJLE9BQU8sTUFBTSxPQUFPLE9BQU8sTUFBTTtBQUFBLEVBQ3pDO0FBQUEsRUFFQSxPQUFPO0FBQUEsSUFDTCxFQUFFLElBQUksTUFBTSxRQUFRLFNBQVMsUUFBUSxlQUFlLE1BQU0sVUFBVTtBQUFBLElBQ3BFLEVBQUUsSUFBSSxNQUFNLFFBQVEsZUFBZSxRQUFRLGtCQUFrQixNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQUEsSUFHN0UsRUFBRSxJQUFJLE1BQU0sUUFBUSxrQkFBa0IsUUFBUSxpQkFBaUIsTUFBTSxXQUFXLE9BQU8sVUFBVTtBQUFBLElBQ2pHLEVBQUUsSUFBSSxNQUFNLFFBQVEsa0JBQWtCLFFBQVEsaUJBQWlCLE1BQU0sV0FBVyxPQUFPLFNBQVM7QUFBQSxJQUNoRyxFQUFFLElBQUksTUFBTSxRQUFRLGlCQUFpQixRQUFRLG1CQUFtQixNQUFNLFVBQVU7QUFBQSxJQUNoRixFQUFFLElBQUksTUFBTSxRQUFRLG1CQUFtQixRQUFRLE9BQU8sTUFBTSxVQUFVO0FBQUEsSUFDdEUsRUFBRSxJQUFJLE1BQU0sUUFBUSxpQkFBaUIsUUFBUSxtQkFBbUIsTUFBTSxVQUFVO0FBQUEsSUFDaEYsRUFBRSxJQUFJLE1BQU0sUUFBUSxtQkFBbUIsUUFBUSxPQUFPLE1BQU0sVUFBVTtBQUFBLEVBQ3hFO0FBQ0Y7OztBQ25NQSxTQUFTLE9BQUFDLFlBQVc7QUFtQmIsSUFBTSx1QkFBNkI7QUFBQSxFQUN4QyxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFDYixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFFUixXQUFXO0FBQUE7QUFBQTtBQUFBLElBR1QsRUFBRSxNQUFNLFlBQVksTUFBTSxRQUFRLFNBQVMsTUFBTSxVQUFVLE1BQU07QUFBQSxJQUNqRSxFQUFFLE1BQU0sV0FBVyxNQUFNLFFBQVEsU0FBUyxNQUFNLFVBQVUsTUFBTTtBQUFBLElBQ2hFLEVBQUUsTUFBTSxXQUFXLE1BQU0sUUFBUSxTQUFTLE1BQU0sVUFBVSxNQUFNO0FBQUEsSUFDaEUsRUFBRSxNQUFNLGdCQUFnQixNQUFNLFFBQVEsU0FBUyxNQUFNLFVBQVUsTUFBTTtBQUFBLElBQ3JFLEVBQUUsTUFBTSxZQUFZLE1BQU0sUUFBUSxTQUFTLE1BQU0sVUFBVSxNQUFNO0FBQUEsSUFDakUsRUFBRSxNQUFNLFNBQVMsTUFBTSxRQUFRLFNBQVMsTUFBTSxVQUFVLE1BQU07QUFBQSxFQUNoRTtBQUFBLEVBRUEsT0FBTztBQUFBLElBQ0wsRUFBRSxJQUFJLFNBQVMsTUFBTSxTQUFTLE9BQU8sU0FBUyxRQUFRLEVBQUUsWUFBWSxXQUFXLEVBQUU7QUFBQSxJQUNqRjtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQVksTUFBTTtBQUFBLE1BQVUsT0FBTztBQUFBLE1BQ3ZDLFFBQVE7QUFBQSxRQUNOLFFBQVE7QUFBQSxVQUNOLEVBQUUsTUFBTSxXQUFXLE9BQU8sMEJBQTBCLE1BQU0sUUFBUSxVQUFVLEtBQUs7QUFBQSxVQUNqRixFQUFFLE1BQU0sV0FBVyxPQUFPLFlBQVksTUFBTSxRQUFRLFVBQVUsS0FBSztBQUFBLFVBQ25FO0FBQUEsWUFDRSxNQUFNO0FBQUEsWUFBZ0IsT0FBTztBQUFBLFlBQWlCLE1BQU07QUFBQTtBQUFBO0FBQUEsWUFHcEQsU0FBUyxhQUFhLGlCQUFpQjtBQUFBLFVBQ3pDO0FBQUEsVUFDQTtBQUFBLFlBQ0UsTUFBTTtBQUFBLFlBQVksT0FBTztBQUFBLFlBQVksTUFBTTtBQUFBLFlBQzNDLFNBQVM7QUFBQSxjQUNQLEVBQUUsT0FBTyxPQUFPLE9BQU8sTUFBTTtBQUFBLGNBQzdCLEVBQUUsT0FBTyxVQUFVLE9BQU8sU0FBUztBQUFBLGNBQ25DLEVBQUUsT0FBTyxRQUFRLE9BQU8sT0FBTztBQUFBLGNBQy9CLEVBQUUsT0FBTyxVQUFVLE9BQU8sU0FBUztBQUFBLFlBQ3JDO0FBQUEsVUFDRjtBQUFBLFVBQ0EsRUFBRSxNQUFNLFNBQVMsT0FBTyxTQUFTLE1BQU0sV0FBVztBQUFBLFFBQ3BEO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFBWSxNQUFNO0FBQUEsTUFBYyxPQUFPO0FBQUEsTUFDM0MsUUFBUSxFQUFFLFlBQVksWUFBWSxRQUFRLEVBQUUsSUFBSUMsZUFBYyxHQUFHLGdCQUFnQixhQUFhO0FBQUEsSUFDaEc7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFBZSxNQUFNO0FBQUEsTUFBaUIsT0FBTztBQUFBLE1BQ2pELFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUNaLFFBQVE7QUFBQSxVQUNOLFNBQVNBO0FBQUEsVUFDVCxVQUFVQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQU1WLE1BQU1BO0FBQUEsVUFDTixVQUFVQTtBQUFBLFVBQ1YsYUFBYUE7QUFBQSxVQUNiLFFBQVE7QUFBQSxVQUNSLFVBQVVBO0FBQUE7QUFBQTtBQUFBLFVBR1YsaUJBQWlCO0FBQUEsVUFDakIsaUJBQWlCQTtBQUFBLFFBQ25CO0FBQUEsUUFDQSxnQkFBZ0I7QUFBQSxNQUNsQjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFJRSxJQUFJO0FBQUEsTUFBYyxNQUFNO0FBQUEsTUFBaUIsT0FBTztBQUFBLE1BQ2hELFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUNaLFFBQVEsRUFBRSxJQUFJQSxlQUFjO0FBQUEsUUFDNUIsUUFBUSxFQUFFLG9CQUFvQkEsY0FBYTtBQUFBLE1BQzdDO0FBQUEsSUFDRjtBQUFBLElBQ0EsRUFBRSxJQUFJLE9BQU8sTUFBTSxPQUFPLE9BQU8sTUFBTTtBQUFBLEVBQ3pDO0FBQUEsRUFFQSxPQUFPO0FBQUEsSUFDTCxFQUFFLElBQUksTUFBTSxRQUFRLFNBQVMsUUFBUSxZQUFZLE1BQU0sVUFBVTtBQUFBLElBQ2pFLEVBQUUsSUFBSSxNQUFNLFFBQVEsWUFBWSxRQUFRLFlBQVksTUFBTSxVQUFVO0FBQUEsSUFDcEUsRUFBRSxJQUFJLE1BQU0sUUFBUSxZQUFZLFFBQVEsZUFBZSxNQUFNLFVBQVU7QUFBQSxJQUN2RSxFQUFFLElBQUksTUFBTSxRQUFRLGVBQWUsUUFBUSxjQUFjLE1BQU0sVUFBVTtBQUFBLElBQ3pFLEVBQUUsSUFBSSxNQUFNLFFBQVEsY0FBYyxRQUFRLE9BQU8sTUFBTSxVQUFVO0FBQUEsRUFDbkU7QUFDRjs7O0FDbEhBLFNBQVMsS0FBQUMsS0FBRyxPQUFBQyxhQUFXO0FBZ0NoQixJQUFNLDBCQUFnQztBQUFBLEVBQzNDLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLGFBQWE7QUFBQSxFQUNiLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFrQlIsT0FBTztBQUFBLEVBRVAsV0FBVztBQUFBLElBQ1QsRUFBRSxNQUFNLGlCQUFpQixNQUFNLFFBQVEsU0FBUyxNQUFNLFVBQVUsTUFBTTtBQUFBLEVBQ3hFO0FBQUEsRUFFQSxPQUFPO0FBQUEsSUFDTDtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBLE1BSVAsUUFBUTtBQUFBLFFBQ04sWUFBWTtBQUFBLFFBQ1osYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFpQmIsV0FBV0Msc0VBQW9FLGlCQUFpQjtBQUFBO0FBQUE7QUFBQSxNQUdsRztBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsTUFDUCxRQUFRLEVBQUUsWUFBWSxtQkFBbUIsUUFBUSxFQUFFLElBQUlDLGlCQUFlLEdBQUcsZ0JBQWdCLFlBQVk7QUFBQSxJQUN2RztBQUFBO0FBQUEsSUFHQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQVNOLFdBQVcsQ0FBQyxFQUFFLE1BQU0sWUFBWSxPQUFPLGdCQUFnQixDQUFDO0FBQUE7QUFBQTtBQUFBLFFBR3hELGtCQUFrQjtBQUFBLFFBQ2xCLFVBQVU7QUFBQSxRQUNWLFlBQVk7QUFBQSxRQUNaLHFCQUFxQjtBQUFBLE1BQ3ZCO0FBQUEsSUFDRjtBQUFBO0FBQUEsSUFHQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFLRSxJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsSUFDVDtBQUFBO0FBQUEsSUFHQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBO0FBQUEsUUFFTixXQUFXLENBQUMsRUFBRSxNQUFNLFlBQVksT0FBTyxpQkFBaUIsQ0FBQztBQUFBLFFBQ3pELGtCQUFrQjtBQUFBLFFBQ2xCLFVBQVU7QUFBQSxRQUNWLFlBQVk7QUFBQSxRQUNaLHFCQUFxQjtBQUFBLE1BQ3ZCO0FBQUEsSUFDRjtBQUFBO0FBQUEsSUFHQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLFFBQ04sWUFBWTtBQUFBLFFBQ1osUUFBUSxFQUFFLElBQUlBLGlCQUFlO0FBQUEsUUFDN0IsUUFBUSxFQUFFLGlCQUFpQixZQUFZLGVBQWVBLDBCQUF3QjtBQUFBLE1BQ2hGO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxRQUNOLFlBQVksQ0FBQ0EsMERBQXdEO0FBQUEsUUFDckUsVUFBVSxDQUFDLFNBQVMsT0FBTztBQUFBLFFBQzNCLE9BQU87QUFBQSxRQUNQLFVBQVU7QUFBQSxRQUNWLGNBQWMsRUFBRSxNQUFNQSxzQkFBb0I7QUFBQSxRQUMxQyxXQUFXO0FBQUEsTUFDYjtBQUFBLElBQ0Y7QUFBQTtBQUFBLElBR0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUNaLFFBQVEsRUFBRSxJQUFJQSxpQkFBZTtBQUFBLFFBQzdCLFFBQVEsRUFBRSxpQkFBaUIsV0FBVztBQUFBLE1BQ3hDO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxRQUNOLFlBQVksQ0FBQ0EsMERBQXdEO0FBQUEsUUFDckUsVUFBVSxDQUFDLFNBQVMsT0FBTztBQUFBLFFBQzNCLFVBQVU7QUFBQSxRQUNWLE9BQU87QUFBQSxRQUNQLFVBQVU7QUFBQSxRQUNWLGNBQWMsRUFBRSxNQUFNQSxzQkFBb0I7QUFBQSxRQUMxQyxXQUFXO0FBQUEsTUFDYjtBQUFBLElBQ0Y7QUFBQSxJQUVBLEVBQUUsSUFBSSxPQUFPLE1BQU0sT0FBTyxPQUFPLE1BQU07QUFBQSxFQUN6QztBQUFBLEVBRUEsT0FBTztBQUFBLElBQ0wsRUFBRSxJQUFJLE1BQU0sUUFBUSxTQUFTLFFBQVEsbUJBQW1CLE1BQU0sVUFBVTtBQUFBLElBQ3hFLEVBQUUsSUFBSSxNQUFNLFFBQVEsbUJBQW1CLFFBQVEsa0JBQWtCLE1BQU0sVUFBVTtBQUFBO0FBQUEsSUFHakYsRUFBRSxJQUFJLE1BQU0sUUFBUSxrQkFBa0IsUUFBUSxvQkFBb0IsTUFBTSxXQUFXLE9BQU8sVUFBVTtBQUFBLElBQ3BHLEVBQUUsSUFBSSxNQUFNLFFBQVEsa0JBQWtCLFFBQVEsaUJBQWlCLE1BQU0sV0FBVyxPQUFPLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBd0JoRyxFQUFFLElBQUksTUFBTSxRQUFRLG9CQUFvQixRQUFRLG9CQUFvQixNQUFNLGVBQWUsV0FBV0Q7QUFBQSxvRUFDcEMsc0JBQXNCLElBQUksT0FBTyx1QkFBdUI7QUFBQSxJQUN4SCxFQUFFLElBQUksTUFBTSxRQUFRLG9CQUFvQixRQUFRLGlCQUFpQixNQUFNLGVBQWUsV0FBV0E7QUFBQSxxRUFDaEMsc0JBQXNCLElBQUksT0FBTywwQkFBcUI7QUFBQTtBQUFBLElBR3ZILEVBQUUsSUFBSSxNQUFNLFFBQVEsb0JBQW9CLFFBQVEsaUJBQWlCLE1BQU0sV0FBVyxPQUFPLFVBQVU7QUFBQSxJQUNuRyxFQUFFLElBQUksTUFBTSxRQUFRLG9CQUFvQixRQUFRLGlCQUFpQixNQUFNLFdBQVcsT0FBTyxTQUFTO0FBQUE7QUFBQSxJQUdsRyxFQUFFLElBQUksTUFBTSxRQUFRLGlCQUFpQixRQUFRLG1CQUFtQixNQUFNLFVBQVU7QUFBQSxJQUNoRixFQUFFLElBQUksT0FBTyxRQUFRLG1CQUFtQixRQUFRLE9BQU8sTUFBTSxVQUFVO0FBQUEsSUFDdkUsRUFBRSxJQUFJLE9BQU8sUUFBUSxpQkFBaUIsUUFBUSxtQkFBbUIsTUFBTSxVQUFVO0FBQUEsSUFDakYsRUFBRSxJQUFJLE9BQU8sUUFBUSxtQkFBbUIsUUFBUSxPQUFPLE1BQU0sVUFBVTtBQUFBLEVBQ3pFO0FBQ0Y7QUFZTyxJQUFNLGtDQUF3QztBQUFBLEVBQ25ELEdBQUc7QUFBQSxFQUNILE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLGFBQWE7QUFBQSxFQUNiLE9BQU8sd0JBQXdCLE1BQU07QUFBQSxJQUFJLENBQUMsTUFDeEMsRUFBRSxPQUFPLFVBQ0wsRUFBRSxHQUFHLEdBQUcsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLGFBQWEsc0JBQXNCLEVBQUUsSUFDcEU7QUFBQSxFQUNOO0FBQ0Y7OztBQy9RQSxTQUFTLEtBQUFFLEtBQUcsT0FBQUMsYUFBVztBQXVEaEIsSUFBTSxzQ0FBNEM7QUFBQSxFQUN2RCxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUNFO0FBQUEsRUFDRixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTVIsT0FBTztBQUFBLEVBRVAsV0FBVztBQUFBLElBQ1QsRUFBRSxNQUFNLGlCQUFpQixNQUFNLFFBQVEsU0FBUyxNQUFNLFVBQVUsTUFBTTtBQUFBLEVBQ3hFO0FBQUEsRUFFQSxPQUFPO0FBQUEsSUFDTDtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLFFBQ04sWUFBWTtBQUFBLFFBQ1osYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUE2QmIsV0FBV0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUliO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVEsRUFBRSxZQUFZLG1CQUFtQixRQUFRLEVBQUUsSUFBSUMsaUJBQWUsR0FBRyxnQkFBZ0IsWUFBWTtBQUFBLElBQ3ZHO0FBQUEsSUFDQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFLTixXQUFXLENBQUMsRUFBRSxNQUFNLFlBQVksT0FBTyxnQkFBZ0IsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFLeEQsa0JBQWtCO0FBQUEsUUFDbEIsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFLVixZQUFZO0FBQUEsUUFDWixxQkFBcUI7QUFBQSxNQUN2QjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQWNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUNaLFFBQVEsRUFBRSxJQUFJQSxpQkFBZTtBQUFBLFFBQzdCLFFBQVE7QUFBQSxVQUNOLE9BQU9BO0FBQUEsVUFDUCwrQkFBK0I7QUFBQSxVQUMvQixlQUFlQTtBQUFBLFFBQ2pCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFJRSxJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsTUFDUCxRQUFRO0FBQUEsUUFDTixZQUFZO0FBQUEsUUFDWixRQUFRLEVBQUUsSUFBSUEsaUJBQWU7QUFBQSxRQUM3QixRQUFRLEVBQUUsK0JBQStCLFlBQVksa0JBQWtCLEtBQUs7QUFBQSxNQUM5RTtBQUFBLElBQ0Y7QUFBQSxJQUNBLEVBQUUsSUFBSSxPQUFPLE1BQU0sT0FBTyxPQUFPLE1BQU07QUFBQSxFQUN6QztBQUFBLEVBRUEsT0FBTztBQUFBLElBQ0wsRUFBRSxJQUFJLE1BQU0sUUFBUSxTQUFTLFFBQVEsbUJBQW1CLE1BQU0sVUFBVTtBQUFBLElBQ3hFLEVBQUUsSUFBSSxNQUFNLFFBQVEsbUJBQW1CLFFBQVEsaUJBQWlCLE1BQU0sVUFBVTtBQUFBO0FBQUEsSUFFaEYsRUFBRSxJQUFJLE1BQU0sUUFBUSxpQkFBaUIsUUFBUSxnQkFBZ0IsTUFBTSxXQUFXLE9BQU8sVUFBVTtBQUFBLElBQy9GLEVBQUUsSUFBSSxNQUFNLFFBQVEsaUJBQWlCLFFBQVEsaUJBQWlCLE1BQU0sV0FBVyxPQUFPLFNBQVM7QUFBQSxJQUMvRixFQUFFLElBQUksTUFBTSxRQUFRLGdCQUFnQixRQUFRLE9BQU8sTUFBTSxVQUFVO0FBQUEsSUFDbkUsRUFBRSxJQUFJLE1BQU0sUUFBUSxpQkFBaUIsUUFBUSxPQUFPLE1BQU0sVUFBVTtBQUFBLEVBQ3RFO0FBQ0Y7OztBQ3JNQSxTQUFTLEtBQUFDLEtBQUcsT0FBQUMsYUFBVztBQXlEaEIsSUFBTSx1Q0FBNkM7QUFBQSxFQUN4RCxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUNFO0FBQUEsRUFDRixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtSLE9BQU87QUFBQSxFQUVQLFdBQVc7QUFBQSxJQUNULEVBQUUsTUFBTSxpQkFBaUIsTUFBTSxRQUFRLFNBQVMsTUFBTSxVQUFVLE1BQU07QUFBQSxFQUN4RTtBQUFBLEVBRUEsT0FBTztBQUFBLElBQ0w7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUNaLGFBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFxQmIsV0FBV0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUliO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVEsRUFBRSxZQUFZLG1CQUFtQixRQUFRLEVBQUUsSUFBSUMsaUJBQWUsR0FBRyxnQkFBZ0IsWUFBWTtBQUFBLElBQ3ZHO0FBQUEsSUFDQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFLTixXQUFXLENBQUMsRUFBRSxNQUFNLFlBQVksT0FBTyxnQkFBZ0IsQ0FBQztBQUFBO0FBQUE7QUFBQTtBQUFBLFFBSXhELGtCQUFrQjtBQUFBLFFBQ2xCLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFTVixZQUFZO0FBQUEsUUFDWixxQkFBcUI7QUFBQSxNQUN2QjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsTUFDUCxRQUFRO0FBQUEsUUFDTixZQUFZO0FBQUEsUUFDWixRQUFRLEVBQUUsSUFBSUEsaUJBQWU7QUFBQSxRQUM3QixRQUFRLEVBQUUsK0JBQStCLFdBQVc7QUFBQSxNQUN0RDtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFJRSxJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsTUFDUCxRQUFRO0FBQUEsUUFDTixZQUFZO0FBQUEsUUFDWixRQUFRLEVBQUUsSUFBSUEsaUJBQWU7QUFBQSxRQUM3QixRQUFRLEVBQUUsK0JBQStCLFlBQVkseUJBQXlCLE1BQU07QUFBQSxNQUN0RjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEVBQUUsSUFBSSxPQUFPLE1BQU0sT0FBTyxPQUFPLE1BQU07QUFBQSxFQUN6QztBQUFBLEVBRUEsT0FBTztBQUFBLElBQ0wsRUFBRSxJQUFJLE1BQU0sUUFBUSxTQUFTLFFBQVEsbUJBQW1CLE1BQU0sVUFBVTtBQUFBLElBQ3hFLEVBQUUsSUFBSSxNQUFNLFFBQVEsbUJBQW1CLFFBQVEsd0JBQXdCLE1BQU0sVUFBVTtBQUFBO0FBQUEsSUFFdkYsRUFBRSxJQUFJLE1BQU0sUUFBUSx3QkFBd0IsUUFBUSxrQkFBa0IsTUFBTSxXQUFXLE9BQU8sVUFBVTtBQUFBLElBQ3hHLEVBQUUsSUFBSSxNQUFNLFFBQVEsd0JBQXdCLFFBQVEsaUJBQWlCLE1BQU0sV0FBVyxPQUFPLFNBQVM7QUFBQSxJQUN0RyxFQUFFLElBQUksTUFBTSxRQUFRLGtCQUFrQixRQUFRLE9BQU8sTUFBTSxVQUFVO0FBQUEsSUFDckUsRUFBRSxJQUFJLE1BQU0sUUFBUSxpQkFBaUIsUUFBUSxPQUFPLE1BQU0sVUFBVTtBQUFBLEVBQ3RFO0FBQ0Y7OztBQ2hMQSxTQUFTLEtBQUFDLEtBQUcsT0FBQUMsYUFBVztBQW1CdkIsSUFBTSx1QkFBdUI7QUFFdEIsSUFBTSw0QkFBa0M7QUFBQSxFQUM3QyxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFDYixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJUixPQUFPO0FBQUEsRUFFUCxXQUFXLENBQUM7QUFBQSxFQUVaLE9BQU87QUFBQSxJQUNMLEVBQUUsSUFBSSxTQUFTLE1BQU0sU0FBUyxPQUFPLHVCQUF1QixRQUFRLEVBQUUsVUFBVSxhQUFhLEVBQUU7QUFBQSxJQUMvRjtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQWlCLE1BQU07QUFBQSxNQUFjLE9BQU87QUFBQSxNQUNoRCxRQUFRO0FBQUEsUUFDTixZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFVWixRQUFRO0FBQUEsVUFDTixPQUFPLEVBQUUsTUFBTSxDQUFDLGNBQWMsYUFBYSxFQUFFO0FBQUEsVUFDN0Msa0JBQWtCLEVBQUUsS0FBS0Msd0JBQXNCLG9CQUFvQixLQUFLO0FBQUEsUUFDMUU7QUFBQSxRQUNBLE9BQU87QUFBQSxRQUNQLGdCQUFnQjtBQUFBLE1BQ2xCO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUFhLE1BQU07QUFBQSxNQUFRLE9BQU87QUFBQSxNQUN0QyxRQUFRO0FBQUEsUUFDTixZQUFZQTtBQUFBLFFBQ1osa0JBQWtCO0FBQUEsUUFDbEIsTUFBTSxRQUFRLE9BQU87QUFBQSxVQUNuQixPQUFPO0FBQUEsWUFDTDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FLRSxJQUFJO0FBQUEsY0FBc0IsTUFBTTtBQUFBLGNBQWMsT0FBTztBQUFBLGNBQ3JELFFBQVE7QUFBQSxnQkFDTixZQUFZO0FBQUEsZ0JBQ1osUUFBUTtBQUFBLGtCQUNOLHdCQUF3QkE7QUFBQSxrQkFDeEIsU0FBU0E7QUFBQSxrQkFDVCxRQUFRLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRTtBQUFBLGdCQUNoQztBQUFBLGdCQUNBLGdCQUFnQjtBQUFBLGNBQ2xCO0FBQUEsWUFDRjtBQUFBLFlBQ0E7QUFBQTtBQUFBLGNBRUUsSUFBSTtBQUFBLGNBQW9CLE1BQU07QUFBQSxjQUFZLE9BQU87QUFBQSxZQUNuRDtBQUFBLFlBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQUlFLElBQUk7QUFBQSxjQUFnQixNQUFNO0FBQUEsY0FBVSxPQUFPO0FBQUEsY0FDM0MsUUFBUTtBQUFBLGdCQUNOLFlBQVksQ0FBQ0EsNERBQTBEO0FBQUEsZ0JBQ3ZFLFVBQVUsQ0FBQyxTQUFTLE9BQU87QUFBQSxnQkFDM0IsT0FBTztBQUFBLGdCQUNQLFVBQVU7QUFBQSxnQkFDVixjQUFjO0FBQUEsa0JBQ1osTUFBTUE7QUFBQSxrQkFBc0IsT0FBT0E7QUFBQSxrQkFDbkMsZUFBZUE7QUFBQSxnQkFDakI7QUFBQSxnQkFDQSxXQUFXO0FBQUEsY0FDYjtBQUFBLFlBQ0Y7QUFBQSxZQUNBO0FBQUEsY0FDRSxJQUFJO0FBQUEsY0FBd0IsTUFBTTtBQUFBLGNBQWlCLE9BQU87QUFBQSxjQUMxRCxRQUFRO0FBQUEsZ0JBQ04sWUFBWTtBQUFBLGdCQUNaLFFBQVE7QUFBQSxrQkFDTixTQUFTQTtBQUFBLGtCQUNULE1BQU07QUFBQSxrQkFBYSxVQUFVO0FBQUEsa0JBQVEsUUFBUTtBQUFBLGtCQUM3QyxVQUFVQTtBQUFBLGtCQUNWLFVBQVVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxrQkFXVixpQkFBaUJBO0FBQUEsa0JBQ2pCLGlCQUFpQjtBQUFBLGtCQUNqQix3QkFBd0JBO0FBQUEsZ0JBQzFCO0FBQUEsY0FDRjtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsVUFDQSxPQUFPO0FBQUEsWUFDTCxFQUFFLElBQUksTUFBTSxRQUFRLHNCQUFzQixRQUFRLG9CQUFvQixNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBS3RGLEVBQUUsSUFBSSxNQUFNLFFBQVEsb0JBQW9CLFFBQVEsZ0JBQWdCLE1BQU0sZUFBZSxXQUFXQyxnQ0FBOEIsT0FBTyxjQUFjO0FBQUEsWUFDbkosRUFBRSxJQUFJLE1BQU0sUUFBUSxnQkFBZ0IsUUFBUSx3QkFBd0IsTUFBTSxVQUFVO0FBQUEsVUFDdEY7QUFBQSxRQUNGLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRjtBQUFBLElBQ0EsRUFBRSxJQUFJLE9BQU8sTUFBTSxPQUFPLE9BQU8sTUFBTTtBQUFBLEVBQ3pDO0FBQUEsRUFFQSxPQUFPO0FBQUEsSUFDTCxFQUFFLElBQUksTUFBTSxRQUFRLFNBQVMsUUFBUSxpQkFBaUIsTUFBTSxVQUFVO0FBQUEsSUFDdEUsRUFBRSxJQUFJLE1BQU0sUUFBUSxpQkFBaUIsUUFBUSxhQUFhLE1BQU0sVUFBVTtBQUFBLElBQzFFLEVBQUUsSUFBSSxNQUFNLFFBQVEsYUFBYSxRQUFRLE9BQU8sTUFBTSxVQUFVO0FBQUEsRUFDbEU7QUFDRjs7O0FDbkpBLFNBQVMsS0FBQUMsS0FBRyxjQUFBQyxhQUFZLE9BQUFDLGFBQVc7QUEwR25DLElBQU0sa0JBQWtCO0FBR3hCLElBQU0sY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjLGFBQWEsRUFBRTtBQVMxRCxJQUFNLHdCQUF3QjtBQUFBLEVBQzVCLFVBQVVDO0FBQUEsRUFDVixRQUFRO0FBQUEsRUFDUixjQUFjLEVBQUUsTUFBTUEsd0JBQXNCO0FBQUEsRUFDNUMsWUFBWSxFQUFFLE1BQU1BLHdCQUFzQjtBQUM1QztBQWFBLElBQU0sc0JBQXNCLEVBQUUsR0FBRyx1QkFBdUIsUUFBUSxZQUFZO0FBZ0M1RSxJQUFNLFdBQVcsQ0FBQyxXQUFvQztBQUFBLEVBQ3BELFVBQVVBO0FBQUEsRUFDVixpQkFBaUJBO0FBQUEsRUFDakIsWUFBWTtBQUFBLElBQ1YsTUFBTUE7QUFBQSxJQUNOLE1BQU1BO0FBQUEsRUFDUjtBQUFBLEVBQ0EsR0FBRztBQUNMO0FBY0EsSUFBTSxZQUFZLENBQUMsS0FBYSxPQUFlLFFBQWlDLE9BQWUsT0FBTyxXQUFXLEdBQUcsUUFBUTtBQUFBLEVBQzFILE1BQU07QUFBQSxJQUNKLElBQUksUUFBUSxHQUFHO0FBQUEsSUFDZixNQUFNO0FBQUEsSUFDTixPQUFPLFFBQVEsS0FBSztBQUFBLElBQ3BCLFFBQVE7QUFBQSxNQUNOLFlBQVk7QUFBQSxNQUNaO0FBQUEsTUFDQSxPQUFPO0FBQUEsTUFDUCxnQkFBZ0IsR0FBRyxHQUFHO0FBQUEsSUFDeEI7QUFBQSxFQUNGO0FBQUEsRUFDQSxLQUFLO0FBQUEsSUFDSCxJQUFJLE9BQU8sR0FBRztBQUFBLElBQ2QsTUFBTTtBQUFBLElBQ04sT0FBTyxPQUFPLEtBQUs7QUFBQSxJQUNuQixRQUFRO0FBQUEsTUFDTixZQUFZQyxZQUFXLEdBQUcsR0FBRyxRQUFRLEtBQUs7QUFBQSxNQUMxQyxrQkFBa0I7QUFBQSxNQUNsQixNQUFNO0FBQUEsUUFDSixPQUFPO0FBQUEsVUFDTDtBQUFBLFlBQ0UsSUFBSSxPQUFPLEdBQUc7QUFBQSxZQUNkLE1BQU07QUFBQSxZQUNOLE9BQU8sVUFBVSxLQUFLO0FBQUEsWUFDdEIsUUFBUTtBQUFBLGNBQ04sYUFBYTtBQUFBLGdCQUNYLENBQUMsS0FBSyxHQUFHQSxZQUFXLEdBQUcsS0FBSyxZQUFZLElBQUksdUJBQXVCLElBQUksMkJBQTJCLElBQUksYUFBYSxLQUFLO0FBQUEsY0FDMUg7QUFBQSxZQUNGO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxRQUNBLE9BQU8sQ0FBQztBQUFBLE1BQ1Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBRUEsSUFBTSxVQUFVO0FBQUEsRUFDZCxVQUFVLFlBQVksaUJBQWlCLFNBQVMsRUFBRSxPQUFPLFlBQVksQ0FBQyxHQUFHLGVBQWU7QUFBQSxFQUN4RjtBQUFBLElBQ0U7QUFBQSxJQUNBO0FBQUEsSUFDQSxTQUFTLEVBQUUsT0FBTyxhQUFhLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxhQUFhLFFBQVEsRUFBRSxFQUFFLENBQUM7QUFBQSxJQUNwRjtBQUFBLEVBQ0Y7QUFBQSxFQUNBO0FBQUEsSUFDRTtBQUFBLElBQ0E7QUFBQSxJQUNBLFNBQVMsRUFBRSxPQUFPLGFBQWEsbUJBQW1CLFNBQVMsQ0FBQztBQUFBLElBQzVEO0FBQUEsRUFDRjtBQUFBLEVBQ0EsVUFBVSxPQUFPLGNBQWMsU0FBUyxFQUFFLE9BQU8sYUFBYSxDQUFDLEdBQUcsYUFBYTtBQUNqRjtBQVNBLElBQU0sY0FBYztBQUFBLEVBQ2xCO0FBQUEsRUFDQSxHQUFHLFFBQVEsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQUEsRUFDL0M7QUFDRjtBQUVPLElBQU0sdUJBQTZCO0FBQUEsRUFDeEMsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsYUFDRTtBQUFBLEVBQ0YsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1SLE9BQU87QUFBQSxFQUVQLFdBQVcsQ0FBQztBQUFBLEVBRVosT0FBTztBQUFBLElBQ0wsRUFBRSxJQUFJLFNBQVMsTUFBTSxTQUFTLE9BQU8sdUJBQXVCLFFBQVEsRUFBRSxVQUFVLFlBQVksRUFBRTtBQUFBLElBQzlGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFVRSxJQUFJO0FBQUEsTUFBZ0IsTUFBTTtBQUFBLE1BQWMsT0FBTztBQUFBLE1BQy9DLFFBQVEsRUFBRSxZQUFZLFlBQVksT0FBTyxLQUFLLGdCQUFnQixZQUFZO0FBQUEsSUFDNUU7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFBZSxNQUFNO0FBQUEsTUFBUSxPQUFPO0FBQUEsTUFDeEMsUUFBUTtBQUFBLFFBQ04sWUFBWUQ7QUFBQSxRQUNaLGtCQUFrQjtBQUFBLFFBQ2xCLE1BQU0sUUFBUSxTQUFTO0FBQUEsVUFDckIsT0FBTztBQUFBLFlBQ0w7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQUlFLElBQUk7QUFBQSxjQUFpQixNQUFNO0FBQUEsY0FBYyxPQUFPO0FBQUEsY0FDaEQsUUFBUTtBQUFBLGdCQUNOLFlBQVk7QUFBQSxnQkFDWixRQUFRLEVBQUUsVUFBVUEsd0JBQXNCLE9BQU8sRUFBRSxNQUFNLENBQUMsYUFBYSxFQUFFLEVBQUU7QUFBQSxnQkFDM0UsZ0JBQWdCO0FBQUEsY0FDbEI7QUFBQSxZQUNGO0FBQUEsWUFDQTtBQUFBO0FBQUEsY0FFRSxJQUFJO0FBQUEsY0FBYSxNQUFNO0FBQUEsY0FBWSxPQUFPO0FBQUEsWUFDNUM7QUFBQSxZQUNBO0FBQUE7QUFBQTtBQUFBLGNBR0UsSUFBSTtBQUFBLGNBQWlCLE1BQU07QUFBQSxjQUFjLE9BQU87QUFBQSxjQUNoRCxRQUFRO0FBQUEsZ0JBQ04sWUFBWTtBQUFBLGdCQUNaLFFBQVE7QUFBQSxnQkFDUixnQkFBZ0I7QUFBQSxjQUNsQjtBQUFBLFlBQ0Y7QUFBQSxZQUNBO0FBQUE7QUFBQSxjQUVFLElBQUk7QUFBQSxjQUFpQixNQUFNO0FBQUEsY0FBWSxPQUFPO0FBQUEsWUFDaEQ7QUFBQSxZQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxjQVFFLElBQUk7QUFBQSxjQUFtQixNQUFNO0FBQUEsY0FBaUIsT0FBTztBQUFBLGNBQ3JELFFBQVE7QUFBQSxnQkFDTixZQUFZO0FBQUEsZ0JBQ1osUUFBUTtBQUFBLGtCQUNOLFVBQVVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxrQkF1QlYsaUJBQWlCQTtBQUFBLGtCQUNqQixRQUFRO0FBQUEsa0JBQ1IsZUFBZUE7QUFBQSxrQkFDZixRQUFRO0FBQUEsa0JBQ1IsaUJBQWlCO0FBQUEsa0JBQ2pCLGtCQUFrQjtBQUFBLGtCQUNsQixlQUFlO0FBQUEsa0JBQ2YsZUFBZTtBQUFBLGdCQUNqQjtBQUFBLGNBQ0Y7QUFBQSxZQUNGO0FBQUEsWUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNBVUUsSUFBSTtBQUFBLGNBQW1CLE1BQU07QUFBQSxjQUFjLE9BQU87QUFBQSxjQUNsRCxRQUFRO0FBQUEsZ0JBQ04sWUFBWTtBQUFBLGdCQUNaLFFBQVE7QUFBQSxnQkFDUixnQkFBZ0I7QUFBQSxjQUNsQjtBQUFBLFlBQ0Y7QUFBQSxZQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FVRSxJQUFJO0FBQUEsY0FBZSxNQUFNO0FBQUEsY0FBWSxPQUFPO0FBQUEsWUFDOUM7QUFBQSxZQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FJRSxJQUFJO0FBQUEsY0FBZ0IsTUFBTTtBQUFBLGNBQWMsT0FBTztBQUFBLGNBQy9DLFFBQVE7QUFBQSxnQkFDTixhQUFhO0FBQUEsa0JBQ1gsZUFBZTtBQUFBLGtCQUNmLGVBQWU7QUFBQSxrQkFDZixhQUFhO0FBQUEsa0JBQ2IsYUFBYTtBQUFBLGdCQUNmO0FBQUEsY0FDRjtBQUFBLFlBQ0Y7QUFBQSxZQUNBLEdBQUcsUUFBUSxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFBLFlBQ3pDO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FJRSxJQUFJO0FBQUEsY0FBa0IsTUFBTTtBQUFBLGNBQWlCLE9BQU87QUFBQSxjQUNwRCxRQUFRO0FBQUEsZ0JBQ04sWUFBWTtBQUFBLGdCQUNaLFFBQVEsRUFBRSxJQUFJQSwwQkFBd0I7QUFBQSxnQkFDdEMsUUFBUTtBQUFBLGtCQUNOLGlCQUFpQkE7QUFBQSxrQkFDakIsa0JBQWtCQTtBQUFBLGtCQUNsQixlQUFlQTtBQUFBLGtCQUNmLGVBQWVBO0FBQUEsa0JBQ2YsZUFBZUE7QUFBQSxrQkFDZixRQUFRO0FBQUEsZ0JBQ1Y7QUFBQSxjQUNGO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFBQSxVQUNBLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQVVMLEVBQUUsSUFBSSxNQUFNLFFBQVEsaUJBQWlCLFFBQVEsYUFBYSxNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQUEsWUFHMUUsRUFBRSxJQUFJLE1BQU0sUUFBUSxhQUFhLFFBQVEsaUJBQWlCLE1BQU0sZUFBZSxXQUFXRSwyQkFBeUIsT0FBTyxlQUFlO0FBQUEsWUFDekksRUFBRSxJQUFJLE1BQU0sUUFBUSxpQkFBaUIsUUFBUSxpQkFBaUIsTUFBTSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFJOUUsRUFBRSxJQUFJLE1BQU0sUUFBUSxpQkFBaUIsUUFBUSxtQkFBbUIsTUFBTSxlQUFlLFdBQVdBLCtCQUE2QixPQUFPLGVBQWU7QUFBQSxZQUNuSixFQUFFLElBQUksTUFBTSxRQUFRLGlCQUFpQixRQUFRLG1CQUFtQixNQUFNLGVBQWUsV0FBV0EsK0JBQTZCLE9BQU8sdUJBQXVCO0FBQUEsWUFDM0osRUFBRSxJQUFJLE1BQU0sUUFBUSxtQkFBbUIsUUFBUSxtQkFBbUIsTUFBTSxVQUFVO0FBQUEsWUFDbEYsRUFBRSxJQUFJLE1BQU0sUUFBUSxtQkFBbUIsUUFBUSxlQUFlLE1BQU0sVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBTzlFLEVBQUUsSUFBSSxNQUFNLFFBQVEsZUFBZSxRQUFRLGdCQUFnQixNQUFNLGVBQWUsV0FBV0EsOEJBQTRCLE9BQU8scUJBQXFCO0FBQUEsWUFDbkosR0FBRyxZQUFZLE1BQU0sR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsT0FBTztBQUFBLGNBQzlDLElBQUksSUFBSSxDQUFDO0FBQUEsY0FDVDtBQUFBLGNBQ0EsUUFBUSxZQUFZLElBQUksQ0FBQztBQUFBLGNBQ3pCLE1BQU07QUFBQSxZQUNSLEVBQUU7QUFBQSxVQUNKO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFBQSxJQUNBLEVBQUUsSUFBSSxPQUFPLE1BQU0sT0FBTyxPQUFPLE1BQU07QUFBQSxFQUN6QztBQUFBLEVBRUEsT0FBTztBQUFBLElBQ0wsRUFBRSxJQUFJLE1BQU0sUUFBUSxTQUFTLFFBQVEsZ0JBQWdCLE1BQU0sVUFBVTtBQUFBLElBQ3JFLEVBQUUsSUFBSSxNQUFNLFFBQVEsZ0JBQWdCLFFBQVEsZUFBZSxNQUFNLFVBQVU7QUFBQSxJQUMzRSxFQUFFLElBQUksTUFBTSxRQUFRLGVBQWUsUUFBUSxPQUFPLE1BQU0sVUFBVTtBQUFBLEVBQ3BFO0FBQ0Y7OztBQ2plQSxTQUFTLEtBQUFDLEtBQUcsT0FBQUMsYUFBVztBQXdCaEIsSUFBTSxxQkFBMkI7QUFBQSxFQUN0QyxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFDYixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFhUixPQUFPO0FBQUEsRUFFUCxXQUFXLENBQUM7QUFBQSxFQUVaLE9BQU87QUFBQSxJQUNMO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFBUyxNQUFNO0FBQUEsTUFBUyxPQUFPO0FBQUEsTUFDbkMsUUFBUSxFQUFFLFlBQVksWUFBWSxhQUFhLHNCQUFzQjtBQUFBLElBQ3ZFO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFLRSxJQUFJO0FBQUEsTUFBYSxNQUFNO0FBQUEsTUFBWSxPQUFPO0FBQUEsSUFDNUM7QUFBQTtBQUFBLElBR0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUFXLE1BQU07QUFBQSxNQUFpQixPQUFPO0FBQUEsTUFDN0MsUUFBUSxFQUFFLFlBQVksWUFBWSxRQUFRLEVBQUUsSUFBSUMsaUJBQWUsR0FBRyxRQUFRLEVBQUUsb0JBQW9CQSwrQkFBNkIsRUFBRTtBQUFBLElBQ2pJO0FBQUEsSUFDQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQWMsTUFBTTtBQUFBLE1BQVUsT0FBTztBQUFBLE1BQ3pDLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQU9OLFlBQVksQ0FBQ0Esc0JBQW9CO0FBQUEsUUFDakMsVUFBVSxDQUFDLFNBQVMsT0FBTztBQUFBLFFBQzNCLFVBQVU7QUFBQSxRQUNWLE9BQU87QUFBQSxRQUNQLFVBQVU7QUFBQSxRQUNWLGNBQWM7QUFBQSxVQUNaLFlBQVlBO0FBQUEsVUFBd0IsV0FBV0E7QUFBQSxVQUMvQyxTQUFTQTtBQUFBLFVBQXFCLFFBQVFBO0FBQUEsUUFDeEM7QUFBQSxRQUNBLFdBQVc7QUFBQSxNQUNiO0FBQUEsSUFDRjtBQUFBO0FBQUEsSUFHQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQVcsTUFBTTtBQUFBLE1BQWlCLE9BQU87QUFBQSxNQUM3QyxRQUFRLEVBQUUsWUFBWSxZQUFZLFFBQVEsRUFBRSxJQUFJQSxpQkFBZSxHQUFHLFFBQVEsRUFBRSxvQkFBb0JBLCtCQUE2QixFQUFFO0FBQUEsSUFDakk7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFBYyxNQUFNO0FBQUEsTUFBVSxPQUFPO0FBQUEsTUFDekMsUUFBUTtBQUFBO0FBQUE7QUFBQSxRQUdOLFlBQVksQ0FBQ0Esc0JBQW9CO0FBQUEsUUFDakMsVUFBVSxDQUFDLE9BQU87QUFBQSxRQUNsQixPQUFPO0FBQUEsUUFDUCxVQUFVO0FBQUEsUUFDVixjQUFjO0FBQUEsVUFDWixZQUFZQTtBQUFBLFVBQXdCLFdBQVdBO0FBQUEsVUFBdUIsU0FBU0E7QUFBQSxRQUNqRjtBQUFBLFFBQ0EsV0FBVztBQUFBLE1BQ2I7QUFBQSxJQUNGO0FBQUEsSUFFQSxFQUFFLElBQUksT0FBTyxNQUFNLE9BQU8sT0FBTyxNQUFNO0FBQUEsRUFDekM7QUFBQSxFQUVBLE9BQU87QUFBQSxJQUNMLEVBQUUsSUFBSSxNQUFNLFFBQVEsU0FBUyxRQUFRLGFBQWEsTUFBTSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFnQmxFLEVBQUUsSUFBSSxNQUFNLFFBQVEsYUFBYSxRQUFRLFdBQVcsTUFBTSxlQUFlLFdBQVdDLHdFQUFzRSxPQUFPLE1BQU07QUFBQSxJQUN2SyxFQUFFLElBQUksTUFBTSxRQUFRLGFBQWEsUUFBUSxXQUFXLE1BQU0sZUFBZSxXQUFXQSx3RUFBc0UsT0FBTyxXQUFXO0FBQUEsSUFDNUssRUFBRSxJQUFJLE1BQU0sUUFBUSxXQUFXLFFBQVEsY0FBYyxNQUFNLFVBQVU7QUFBQSxJQUNyRSxFQUFFLElBQUksTUFBTSxRQUFRLGNBQWMsUUFBUSxPQUFPLE1BQU0sVUFBVTtBQUFBLElBQ2pFLEVBQUUsSUFBSSxNQUFNLFFBQVEsV0FBVyxRQUFRLGNBQWMsTUFBTSxVQUFVO0FBQUEsSUFDckUsRUFBRSxJQUFJLE1BQU0sUUFBUSxjQUFjLFFBQVEsT0FBTyxNQUFNLFVBQVU7QUFBQSxFQUNuRTtBQUNGOzs7QUN0SUEsU0FBUyxLQUFBQyxLQUFHLE9BQUFDLGFBQVc7QUFlaEIsSUFBTSxxQkFBMkI7QUFBQSxFQUN0QyxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFDYixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFtQlIsT0FBTztBQUFBLEVBQ1AsV0FBVyxDQUFDO0FBQUEsRUFDWixPQUFPO0FBQUEsSUFDTDtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQVMsTUFBTTtBQUFBLE1BQVMsT0FBTztBQUFBLE1BQ25DLFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUNaLGFBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQWFiLFdBQVdDO0FBQUE7QUFBQSxNQUViO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUFnQixNQUFNO0FBQUEsTUFBVSxPQUFPO0FBQUEsTUFDM0MsUUFBUTtBQUFBLFFBQ04sWUFBWSxDQUFDQyxzQkFBb0I7QUFBQSxRQUNqQyxVQUFVLENBQUMsU0FBUyxPQUFPO0FBQUEsUUFDM0IsT0FBTztBQUFBLFFBQ1AsVUFBVTtBQUFBLFFBQ1YsY0FBYyxFQUFFLFlBQVlBLDBCQUF3QixXQUFXQSx3QkFBc0I7QUFBQSxRQUNyRixXQUFXO0FBQUEsTUFDYjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEVBQUUsSUFBSSxPQUFPLE1BQU0sT0FBTyxPQUFPLE1BQU07QUFBQSxFQUN6QztBQUFBLEVBQ0EsT0FBTztBQUFBLElBQ0wsRUFBRSxJQUFJLE1BQU0sUUFBUSxTQUFTLFFBQVEsZ0JBQWdCLE1BQU0sVUFBVTtBQUFBLElBQ3JFLEVBQUUsSUFBSSxNQUFNLFFBQVEsZ0JBQWdCLFFBQVEsT0FBTyxNQUFNLFVBQVU7QUFBQSxFQUNyRTtBQUNGOzs7QUNoRkEsU0FBUyxLQUFBQyxLQUFHLE9BQUFDLGFBQVc7QUF1QmhCLElBQU0sMEJBQWdDO0FBQUEsRUFDM0MsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVlSLE9BQU87QUFBQSxFQUNQLFdBQVcsQ0FBQztBQUFBLEVBQ1osT0FBTztBQUFBLElBQ0w7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUFTLE1BQU07QUFBQSxNQUFTLE9BQU87QUFBQSxNQUNuQyxRQUFRO0FBQUEsUUFDTixZQUFZO0FBQUEsUUFDWixhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQXVCYixXQUFXQztBQUFBO0FBQUEsK0VBRTRELGlCQUFpQjtBQUFBLE1BQzFGO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS0UsSUFBSTtBQUFBLE1BQXFCLE1BQU07QUFBQSxNQUFVLE9BQU87QUFBQSxNQUNoRCxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFJTixZQUFZLENBQUNDLHNCQUFvQjtBQUFBLFFBQ2pDLFVBQVUsQ0FBQyxTQUFTLE9BQU87QUFBQSxRQUMzQixVQUFVO0FBQUEsUUFDVixPQUFPO0FBQUEsUUFDUCxVQUFVO0FBQUEsUUFDVixjQUFjLEVBQUUsTUFBTUEsb0JBQWtCLFFBQVFBLHFCQUFtQjtBQUFBLFFBQ25FLFdBQVc7QUFBQSxNQUNiO0FBQUEsSUFDRjtBQUFBLElBQ0EsRUFBRSxJQUFJLE9BQU8sTUFBTSxPQUFPLE9BQU8sTUFBTTtBQUFBLEVBQ3pDO0FBQUEsRUFDQSxPQUFPO0FBQUEsSUFDTCxFQUFFLElBQUksTUFBTSxRQUFRLFNBQVMsUUFBUSxxQkFBcUIsTUFBTSxVQUFVO0FBQUEsSUFDMUUsRUFBRSxJQUFJLE1BQU0sUUFBUSxxQkFBcUIsUUFBUSxPQUFPLE1BQU0sVUFBVTtBQUFBLEVBQzFFO0FBQ0Y7OztBQ3BHQSxTQUFTLEtBQUFDLEtBQUcsT0FBQUMsYUFBVztBQVNoQixJQUFNLHNCQUE0QjtBQUFBLEVBQ3ZDLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLGFBQWE7QUFBQSxFQUNiLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFlUixPQUFPO0FBQUEsRUFDUCxXQUFXLENBQUM7QUFBQSxFQUNaLE9BQU87QUFBQSxJQUNMO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFBUyxNQUFNO0FBQUEsTUFBUyxPQUFPO0FBQUEsTUFDbkMsUUFBUTtBQUFBLFFBQ04sWUFBWTtBQUFBLFFBQ1osYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFXYixXQUFXQztBQUFBO0FBQUEsTUFFYjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFBZ0IsTUFBTTtBQUFBLE1BQVUsT0FBTztBQUFBLE1BQzNDLFFBQVE7QUFBQSxRQUNOLFlBQVksQ0FBQ0Msc0JBQW9CO0FBQUEsUUFDakMsVUFBVSxDQUFDLFNBQVMsT0FBTztBQUFBLFFBQzNCLFVBQVU7QUFBQSxRQUNWLE9BQU87QUFBQSxRQUNQLFVBQVU7QUFBQSxRQUNWLGNBQWMsRUFBRSxTQUFTQSxzQkFBb0I7QUFBQSxRQUM3QyxXQUFXO0FBQUEsTUFDYjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEVBQUUsSUFBSSxPQUFPLE1BQU0sT0FBTyxPQUFPLE1BQU07QUFBQSxFQUN6QztBQUFBLEVBQ0EsT0FBTztBQUFBLElBQ0wsRUFBRSxJQUFJLE1BQU0sUUFBUSxTQUFTLFFBQVEsZ0JBQWdCLE1BQU0sVUFBVTtBQUFBLElBQ3JFLEVBQUUsSUFBSSxNQUFNLFFBQVEsZ0JBQWdCLFFBQVEsT0FBTyxNQUFNLFVBQVU7QUFBQSxFQUNyRTtBQUNGOzs7QUNyRUEsU0FBUyxPQUFBQyxhQUFXO0FBa0JiLElBQU0sc0JBQTRCO0FBQUEsRUFDdkMsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVIsT0FBTztBQUFBLEVBRVAsV0FBVyxDQUFDO0FBQUEsRUFFWixPQUFPO0FBQUEsSUFDTDtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQVMsTUFBTTtBQUFBLE1BQVMsT0FBTztBQUFBLE1BQ25DLFFBQVEsRUFBRSxVQUFVLFlBQVk7QUFBQSxJQUNsQztBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUFhLE1BQU07QUFBQSxNQUFjLE9BQU87QUFBQSxNQUM1QyxRQUFRO0FBQUEsUUFDTixZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBU1osUUFBUTtBQUFBLFVBQ04sY0FBYztBQUFBLFVBQ2QsZUFBZSxFQUFFLE1BQU1DLDBCQUF3QjtBQUFBLFFBQ2pEO0FBQUEsUUFDQSxPQUFPO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxNQUNsQjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUtFLElBQUk7QUFBQSxNQUFjLE1BQU07QUFBQSxNQUFRLE9BQU87QUFBQSxNQUN2QyxRQUFRO0FBQUEsUUFDTixZQUFZQTtBQUFBLFFBQ1osa0JBQWtCO0FBQUEsUUFDbEIsTUFBTSxRQUFRLFFBQVE7QUFBQSxVQUNwQixPQUFPO0FBQUEsWUFDTDtBQUFBLGNBQ0UsSUFBSTtBQUFBLGNBQWdCLE1BQU07QUFBQSxjQUFVLE9BQU87QUFBQSxjQUMzQyxRQUFRO0FBQUEsZ0JBQ04sWUFBWSxDQUFDQSw4REFBNEQ7QUFBQSxnQkFDekUsVUFBVSxDQUFDLFNBQVMsT0FBTztBQUFBLGdCQUMzQixVQUFVO0FBQUEsZ0JBQ1YsT0FBTztBQUFBLGdCQUNQLFVBQVU7QUFBQSxnQkFDVixjQUFjO0FBQUEsa0JBQ1osU0FBU0E7QUFBQSxrQkFBMEIsZUFBZUE7QUFBQSxnQkFDcEQ7QUFBQSxnQkFDQSxXQUFXO0FBQUEsY0FDYjtBQUFBLFlBQ0Y7QUFBQSxZQUNBO0FBQUEsY0FDRSxJQUFJO0FBQUEsY0FBYSxNQUFNO0FBQUEsY0FBaUIsT0FBTztBQUFBLGNBQy9DLFFBQVE7QUFBQSxnQkFDTixZQUFZO0FBQUEsZ0JBQ1osUUFBUSxFQUFFLElBQUlBLHNCQUFvQjtBQUFBO0FBQUE7QUFBQSxnQkFHbEMsUUFBUSxFQUFFLGVBQWUsTUFBTSxlQUFlLEtBQUs7QUFBQSxjQUNyRDtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsVUFDQSxPQUFPO0FBQUEsWUFDTCxFQUFFLElBQUksTUFBTSxRQUFRLGdCQUFnQixRQUFRLGFBQWEsTUFBTSxVQUFVO0FBQUEsVUFDM0U7QUFBQSxRQUNGLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRjtBQUFBLElBQ0EsRUFBRSxJQUFJLE9BQU8sTUFBTSxPQUFPLE9BQU8sTUFBTTtBQUFBLEVBQ3pDO0FBQUEsRUFFQSxPQUFPO0FBQUEsSUFDTCxFQUFFLElBQUksTUFBTSxRQUFRLFNBQVMsUUFBUSxhQUFhLE1BQU0sVUFBVTtBQUFBLElBQ2xFLEVBQUUsSUFBSSxNQUFNLFFBQVEsYUFBYSxRQUFRLGNBQWMsTUFBTSxVQUFVO0FBQUEsSUFDdkUsRUFBRSxJQUFJLE1BQU0sUUFBUSxjQUFjLFFBQVEsT0FBTyxNQUFNLFVBQVU7QUFBQSxFQUNuRTtBQUNGOzs7QUMxR0EsU0FBUyxLQUFBQyxLQUFHLE9BQUFDLGFBQVc7OztBQ0F2QixTQUFTLE9BQUFDLE9BQUssY0FBQUMsbUJBQWtCO0FBa0R6QixJQUFNLDJCQUNYLFFBQVEsSUFBSSx5QkFBeUIsS0FBSyxLQUFLO0FBUzFDLElBQU0saUNBQ1gsUUFBUSxJQUFJLCtCQUErQixLQUFLLEtBQUs7QUFHaEQsSUFBTSw2QkFBNkI7QUFTbkMsSUFBTSx3QkFBd0I7QUFBQSxFQUNuQyxzQkFBc0I7QUFBQSxFQUN0QixtQkFBbUI7QUFDckI7QUFHTyxJQUFNLGtDQUFrQztBQUd4QyxJQUFNLGtDQUFrQztBQWtCeEMsSUFBTSxpQkFBaUI7QUFBQSxFQUM1QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBR08sSUFBTSxtQkFBbUI7QUFBQSxFQUM5QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFHQSxJQUFNLGVBQWUsQ0FBQyxVQUFrQixzQkFBc0IsS0FBSyxzQkFBc0IsS0FBSztBQWtCdkYsSUFBTSxnQkFDWCw4SEFDc0IsYUFBYSxpQkFBaUIsQ0FBQyx3QkFBd0IsYUFBYSxpQkFBaUIsQ0FBQyxjQUNoRyxhQUFhLE9BQU8sQ0FBQyxnQkFBZ0IsYUFBYSxTQUFTLENBQUM7QUFrQm5FLElBQU0sY0FBYyxDQUFDLE9BQWUsS0FBYSxXQUN0REM7QUFBQSxFQUNFLGtCQUFrQixLQUFLLHNCQUFzQiwrQkFBK0IsK0NBRXRFLEdBQUcsV0FBVyxPQUFPLElBQUksQ0FBQyxNQUFPLE9BQU8sTUFBTSxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBRSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLEtBQUssSUFBSSxDQUFDLHNCQUN6RyxhQUFhO0FBQ25DO0FBV0ssSUFBTSxrQkFBa0IsT0FBNEI7QUFBQSxFQUN6RCxJQUFJO0FBQUEsRUFDSixNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxRQUFRO0FBQUEsSUFDTixZQUFZO0FBQUEsSUFDWixRQUFRLEVBQUUsSUFBSUMsMEJBQXdCO0FBQUEsSUFDdEMsUUFBUTtBQUFBO0FBQUE7QUFBQSxJQUdSLGdCQUFnQjtBQUFBLEVBQ2xCO0FBQ0Y7OztBRDVHTyxJQUFNLDhCQUFvQztBQUFBLEVBQy9DLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLGFBQ0U7QUFBQSxFQUNGLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVVSLE9BQU87QUFBQSxFQUNQLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBS1QsRUFBRSxNQUFNLG9CQUFvQixNQUFNLGNBQWMsU0FBUyxPQUFPLFVBQVUsT0FBTyxjQUFjLENBQUMsRUFBRTtBQUFBLEVBQ3BHO0FBQUEsRUFDQSxPQUFPO0FBQUEsSUFDTDtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLFFBQ04sWUFBWTtBQUFBLFFBQ1osYUFBYTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBSWIsV0FBV0M7QUFBQTtBQUFBLE1BRWI7QUFBQSxJQUNGO0FBQUEsSUFDQSxnQkFBZ0I7QUFBQSxJQUNoQjtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQ0osTUFBTTtBQUFBLE1BQ04sT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLFFBQ04sWUFBWTtBQUFBLFFBQ1osUUFBUSxFQUFFLGlCQUFpQkMsaUJBQWU7QUFBQSxRQUMxQyxRQUFRO0FBQUE7QUFBQTtBQUFBLFFBR1IsT0FBTztBQUFBLFFBQ1AsZ0JBQWdCO0FBQUEsTUFDbEI7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQSxNQUdFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxRQUNOLEtBQUs7QUFBQSxRQUNMLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUlSLFNBQVM7QUFBQSxRQUNULFdBQVc7QUFBQSxRQUNYLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUlmLE1BQU0sWUFBWSxzQkFBc0Isc0JBQXNCLGVBQWU7QUFBQSxVQUMzRTtBQUFBLFVBQU07QUFBQSxVQUFRO0FBQUEsVUFBVTtBQUFBLFVBQWM7QUFBQSxVQUFTO0FBQUEsVUFBUSxDQUFDLGNBQWMsYUFBYTtBQUFBLFVBQUc7QUFBQSxRQUN4RixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFBQSxJQUNBLEVBQUUsSUFBSSxPQUFPLE1BQU0sT0FBTyxPQUFPLE1BQU07QUFBQSxFQUN6QztBQUFBLEVBQ0EsT0FBTztBQUFBLElBQ0wsRUFBRSxJQUFJLE1BQU0sUUFBUSxTQUFTLFFBQVEsZ0JBQWdCLE1BQU0sVUFBVTtBQUFBLElBQ3JFLEVBQUUsSUFBSSxNQUFNLFFBQVEsZ0JBQWdCLFFBQVEsbUJBQW1CLE1BQU0sVUFBVTtBQUFBLElBQy9FLEVBQUUsSUFBSSxNQUFNLFFBQVEsbUJBQW1CLFFBQVEsMkJBQTJCLE1BQU0sVUFBVTtBQUFBLElBQzFGLEVBQUUsSUFBSSxNQUFNLFFBQVEsMkJBQTJCLFFBQVEsT0FBTyxNQUFNLFVBQVU7QUFBQSxFQUNoRjtBQUNGOzs7QUV6S0EsU0FBUyxLQUFBQyxLQUFHLGNBQUFDLGFBQVksT0FBQUMsYUFBVztBQVVuQyxJQUFNLFdBQVc7QUFRakIsSUFBTSxVQUFVO0FBQUE7QUFBQTtBQUtULElBQU0sc0JBQTRCO0FBQUEsRUFDdkMsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBLEVBRVIsV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBLElBSVQsRUFBRSxNQUFNLFlBQVksTUFBTSxRQUFRLFNBQVMsTUFBTSxVQUFVLE1BQU07QUFBQSxJQUNqRSxFQUFFLE1BQU0sYUFBYSxNQUFNLFFBQVEsU0FBUyxNQUFNLFVBQVUsTUFBTTtBQUFBLElBQ2xFLEVBQUUsTUFBTSxrQkFBa0IsTUFBTSxVQUFVLFNBQVMsTUFBTSxVQUFVLE1BQU07QUFBQSxJQUN6RSxFQUFFLE1BQU0sWUFBWSxNQUFNLFVBQVUsU0FBUyxNQUFNLFVBQVUsTUFBTTtBQUFBLEVBQ3JFO0FBQUEsRUFFQSxPQUFPO0FBQUEsSUFDTCxFQUFFLElBQUksU0FBUyxNQUFNLFNBQVMsT0FBTyxTQUFTLFFBQVEsRUFBRSxZQUFZLGtCQUFrQixFQUFFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBb0N4RixFQUFFLElBQUksWUFBWSxNQUFNLGNBQWMsT0FBTyxpQkFBaUIsUUFBUSxFQUFFLFlBQVksbUJBQW1CLFFBQVEsRUFBRSxJQUFJQyxpQkFBZSwrQkFBK0IsRUFBRSxLQUFLLENBQUMsV0FBVyxVQUFVLEVBQUUsRUFBRSxHQUFHLGdCQUFnQixPQUFPLEVBQUU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBY2hPLEVBQUUsSUFBSSxlQUFlLE1BQU0sT0FBTyxPQUFPLGlCQUFpQixRQUFRLEVBQUUsU0FBUyxXQUFXLFNBQVMsZ0dBQWdHLEVBQUU7QUFBQSxJQUNuTTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQVksTUFBTTtBQUFBLE1BQVUsT0FBTztBQUFBLE1BQ3ZDLFFBQVE7QUFBQSxRQUNOLFFBQVE7QUFBQSxVQUNOLEVBQUUsTUFBTSxhQUFhLE9BQU8sY0FBYyxNQUFNLFFBQVEsVUFBVSxLQUFLO0FBQUEsVUFDdkUsRUFBRSxNQUFNLGtCQUFrQixPQUFPLG9CQUFvQixNQUFNLFVBQVUsVUFBVSxNQUFNLGNBQWMsR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBc0J0RztBQUFBLFlBQ0UsTUFBTTtBQUFBLFlBQ04sT0FBTyxzQkFBaUIsc0JBQXNCO0FBQUEsWUFDOUMsTUFBTTtBQUFBLFlBQ04sY0FBYztBQUFBLFlBQ2QsYUFBYSxLQUFLLHNCQUFzQjtBQUFBLFVBQzFDO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQW1CLE1BQU07QUFBQSxNQUFjLE9BQU87QUFBQSxNQUNsRCxRQUFRLEVBQUUsWUFBWSxtQkFBbUIsUUFBUSxFQUFFLElBQUlBLGdCQUFjLEdBQUcsZ0JBQWdCLFlBQVk7QUFBQSxJQUN0RztBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUFnQixNQUFNO0FBQUEsTUFBaUIsT0FBTztBQUFBLE1BQ2xELFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUNaLFFBQVE7QUFBQSxVQUNOLE1BQU1BO0FBQUEsVUFBZ0IsaUJBQWlCQTtBQUFBLFVBQ3ZDLGFBQWFBO0FBQUEsVUFBNEIsYUFBYUE7QUFBQSxVQUN0RCxVQUFVQTtBQUFBLFVBQXNCLFFBQVE7QUFBQSxVQUN4QyxZQUFZQTtBQUFBLFVBQXVCLGlCQUFpQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQU9wRCxVQUFVQTtBQUFBLFVBQXVCLFVBQVVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsVUF5QjNDLGlCQUFpQkMsWUFBVyxxQ0FBcUMsUUFBUSw4QkFBOEIsS0FBSztBQUFBLFVBQzVHLGFBQWFBLFlBQVcsMkNBQTJDLFFBQVEsOEJBQThCLEtBQUs7QUFBQSxVQUM5RyxlQUFlO0FBQUEsUUFDakI7QUFBQSxRQUNBLGdCQUFnQjtBQUFBLE1BQ2xCO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUEyQkUsSUFBSTtBQUFBLE1BQWUsTUFBTTtBQUFBLE1BQVksT0FBTztBQUFBLElBQzlDO0FBQUEsSUFDQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQXNCLE1BQU07QUFBQSxNQUFpQixPQUFPO0FBQUEsTUFDeEQsUUFBUTtBQUFBO0FBQUE7QUFBQSxRQUdOLFlBQVk7QUFBQSxRQUFtQixRQUFRLEVBQUUsSUFBSUQsZ0JBQWM7QUFBQSxRQUMzRCxRQUFRLEVBQUUsT0FBTyxXQUFXO0FBQUEsTUFDOUI7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQSxNQUdFLElBQUk7QUFBQSxNQUFnQixNQUFNO0FBQUEsTUFBVSxPQUFPO0FBQUEsTUFDM0MsUUFBUTtBQUFBLFFBQ04sWUFBWSxDQUFDQSxzQkFBb0I7QUFBQSxRQUNqQyxVQUFVLENBQUMsU0FBUyxPQUFPO0FBQUEsUUFDM0IsT0FBTztBQUFBLFFBQ1AsVUFBVTtBQUFBLFFBQ1YsY0FBYyxFQUFFLFlBQVlBLGlCQUFlO0FBQUEsUUFDM0MsV0FBVztBQUFBLE1BQ2I7QUFBQSxJQUNGO0FBQUEsSUFDQSxFQUFFLElBQUksT0FBTyxNQUFNLE9BQU8sT0FBTyxNQUFNO0FBQUEsRUFDekM7QUFBQSxFQUVBLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlMLEVBQUUsSUFBSSxNQUFNLFFBQVEsU0FBUyxRQUFRLFlBQVksTUFBTSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBWWpFLEVBQUUsSUFBSSxNQUFNLFFBQVEsWUFBWSxRQUFRLGVBQWUsTUFBTSxXQUFXLFdBQVdFLHdCQUFzQixPQUFPLE9BQU87QUFBQSxJQUN2SCxFQUFFLElBQUksT0FBTyxRQUFRLFlBQVksUUFBUSxZQUFZLE1BQU0sV0FBVyxXQUFXQSx3QkFBc0IsT0FBTyxXQUFXO0FBQUEsSUFDekgsRUFBRSxJQUFJLE1BQU0sUUFBUSxZQUFZLFFBQVEsbUJBQW1CLE1BQU0sVUFBVTtBQUFBLElBQzNFLEVBQUUsSUFBSSxNQUFNLFFBQVEsbUJBQW1CLFFBQVEsZ0JBQWdCLE1BQU0sVUFBVTtBQUFBLElBQy9FLEVBQUUsSUFBSSxNQUFNLFFBQVEsZ0JBQWdCLFFBQVEsZUFBZSxNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBMEIzRSxFQUFFLElBQUksT0FBTyxRQUFRLGVBQWUsUUFBUSxzQkFBc0IsTUFBTSxlQUFlLFdBQVdELFlBQVcsU0FBUyxLQUFLLEdBQUcsT0FBTyxVQUFVO0FBQUEsSUFDL0ksRUFBRSxJQUFJLE9BQU8sUUFBUSxlQUFlLFFBQVEsZ0JBQWdCLE1BQU0sZUFBZSxXQUFXQSxZQUFXLEtBQUssT0FBTyxLQUFLLEtBQUssR0FBRyxPQUFPLGFBQWE7QUFBQSxJQUNwSixFQUFFLElBQUksTUFBTSxRQUFRLHNCQUFzQixRQUFRLGdCQUFnQixNQUFNLFVBQVU7QUFBQSxJQUNsRixFQUFFLElBQUksTUFBTSxRQUFRLGdCQUFnQixRQUFRLE9BQU8sTUFBTSxVQUFVO0FBQUEsRUFDckU7QUFDRjs7O0FDN1JBLFNBQVMsS0FBQUUsS0FBRyxPQUFBQyxhQUFXO0FBbUJoQixJQUFNLHNCQUE0QjtBQUFBLEVBQ3ZDLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLGFBQWE7QUFBQSxFQUNiLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlSLE9BQU87QUFBQSxFQUVQLFdBQVcsQ0FBQztBQUFBLEVBRVosT0FBTztBQUFBLElBQ0wsRUFBRSxJQUFJLFNBQVMsTUFBTSxTQUFTLE9BQU8sdUJBQXVCLFFBQVEsRUFBRSxVQUFVLFlBQVksRUFBRTtBQUFBLElBQzlGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFPRSxJQUFJO0FBQUEsTUFBbUIsTUFBTTtBQUFBLE1BQWMsT0FBTztBQUFBLE1BQ2xELFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUNaLFFBQVEsRUFBRSxRQUFRLGFBQWEsVUFBVSxFQUFFLE1BQU1DLHlCQUF1QixNQUFNQSxpQ0FBK0IsRUFBRTtBQUFBLFFBQy9HLE9BQU87QUFBQSxRQUNQLGdCQUFnQjtBQUFBLE1BQ2xCO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUFrQixNQUFNO0FBQUEsTUFBUSxPQUFPO0FBQUEsTUFDM0MsUUFBUTtBQUFBLFFBQ04sWUFBWUE7QUFBQSxRQUNaLGtCQUFrQjtBQUFBLFFBQ2xCLE1BQU0sUUFBUSxZQUFZO0FBQUEsVUFDeEIsT0FBTztBQUFBLFlBQ0w7QUFBQTtBQUFBLGNBRUUsSUFBSTtBQUFBLGNBQXVCLE1BQU07QUFBQSxjQUFZLE9BQU87QUFBQSxZQUN0RDtBQUFBLFlBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FNRSxJQUFJO0FBQUEsY0FBc0IsTUFBTTtBQUFBLGNBQWMsT0FBTztBQUFBLGNBQ3JELFFBQVE7QUFBQSxnQkFDTixZQUFZO0FBQUEsZ0JBQ1osUUFBUTtBQUFBLGtCQUNOLG9CQUFvQkE7QUFBQSxrQkFDcEIsU0FBU0E7QUFBQSxrQkFDVCxRQUFRLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRTtBQUFBLGdCQUNoQztBQUFBLGdCQUNBLGdCQUFnQjtBQUFBLGNBQ2xCO0FBQUEsWUFDRjtBQUFBLFlBQ0E7QUFBQTtBQUFBLGNBRUUsSUFBSTtBQUFBLGNBQXNCLE1BQU07QUFBQSxjQUFZLE9BQU87QUFBQSxZQUNyRDtBQUFBLFlBQ0E7QUFBQSxjQUNFLElBQUk7QUFBQSxjQUF1QixNQUFNO0FBQUEsY0FBaUIsT0FBTztBQUFBLGNBQ3pELFFBQVE7QUFBQSxnQkFDTixZQUFZO0FBQUEsZ0JBQ1osUUFBUTtBQUFBLGtCQUNOLFNBQVNBO0FBQUEsa0JBQ1QsTUFBTTtBQUFBLGtCQUFhLFVBQVU7QUFBQSxrQkFBUSxRQUFRO0FBQUEsa0JBQzdDLFVBQVVBO0FBQUEsa0JBQ1YsVUFBVUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGtCQWlCVixpQkFBaUJBO0FBQUEsa0JBQ2pCLGlCQUFpQjtBQUFBLGtCQUNqQixvQkFBb0JBO0FBQUEsZ0JBQ3RCO0FBQUEsY0FDRjtBQUFBLFlBQ0Y7QUFBQSxZQUNBO0FBQUEsY0FDRSxJQUFJO0FBQUEsY0FBZ0IsTUFBTTtBQUFBLGNBQVUsT0FBTztBQUFBLGNBQzNDLFFBQVE7QUFBQSxnQkFDTixZQUFZLENBQUNBLHNFQUFvRTtBQUFBLGdCQUNqRixVQUFVLENBQUMsU0FBUyxPQUFPO0FBQUEsZ0JBQzNCLE9BQU87QUFBQSxnQkFDUCxVQUFVO0FBQUEsZ0JBQ1YsY0FBYztBQUFBLGtCQUNaLGlCQUFpQkE7QUFBQSxrQkFBc0MsVUFBVUE7QUFBQSxnQkFDbkU7QUFBQSxnQkFDQSxXQUFXO0FBQUEsY0FDYjtBQUFBLFlBQ0Y7QUFBQSxZQUNBO0FBQUE7QUFBQSxjQUVFLElBQUk7QUFBQSxjQUFzQixNQUFNO0FBQUEsY0FBWSxPQUFPO0FBQUEsWUFDckQ7QUFBQSxZQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FJRSxJQUFJO0FBQUEsY0FBNkIsTUFBTTtBQUFBLGNBQWMsT0FBTztBQUFBLGNBQzVELFFBQVE7QUFBQSxnQkFDTixZQUFZO0FBQUEsZ0JBQ1osUUFBUTtBQUFBLGtCQUNOLGFBQWFBO0FBQUEsa0JBQ2IsTUFBTTtBQUFBLGtCQUNOLE9BQU8sRUFBRSxNQUFNLENBQUMsY0FBYyxhQUFhLEVBQUU7QUFBQSxnQkFDL0M7QUFBQSxnQkFDQSxnQkFBZ0I7QUFBQSxjQUNsQjtBQUFBLFlBQ0Y7QUFBQSxZQUNBO0FBQUE7QUFBQSxjQUVFLElBQUk7QUFBQSxjQUF5QixNQUFNO0FBQUEsY0FBWSxPQUFPO0FBQUEsWUFDeEQ7QUFBQSxZQUNBO0FBQUEsY0FDRSxJQUFJO0FBQUEsY0FBc0IsTUFBTTtBQUFBLGNBQWlCLE9BQU87QUFBQSxjQUN4RCxRQUFRO0FBQUEsZ0JBQ04sWUFBWTtBQUFBLGdCQUNaLFFBQVE7QUFBQSxrQkFDTixNQUFNQTtBQUFBLGtCQUNOLGFBQWFBO0FBQUEsa0JBQ2IsUUFBUUE7QUFBQSxrQkFDUixPQUFPO0FBQUEsa0JBQ1AsTUFBTTtBQUFBLGtCQUNOLFlBQVlBO0FBQUEsa0JBQ1osVUFBVUE7QUFBQTtBQUFBO0FBQUEsa0JBR1YsaUJBQWlCQTtBQUFBLGtCQUNqQixXQUFXO0FBQUEsZ0JBQ2I7QUFBQSxjQUNGO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFBQSxVQUNBLE9BQU87QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQTRCTCxFQUFFLElBQUksTUFBTSxRQUFRLHVCQUF1QixRQUFRLHNCQUFzQixNQUFNLGVBQWUsV0FBV0M7QUFBQTtBQUFBLHlJQUVvQixPQUFPLFlBQVk7QUFBQSxZQUNoSixFQUFFLElBQUksTUFBTSxRQUFRLHNCQUFzQixRQUFRLHNCQUFzQixNQUFNLFVBQVU7QUFBQSxZQUN4RixFQUFFLElBQUksTUFBTSxRQUFRLHNCQUFzQixRQUFRLHVCQUF1QixNQUFNLGVBQWUsV0FBV0Esa0NBQWdDLE9BQU8saUJBQWlCO0FBQUEsWUFDakssRUFBRSxJQUFJLE1BQU0sUUFBUSx1QkFBdUIsUUFBUSxnQkFBZ0IsTUFBTSxVQUFVO0FBQUEsWUFDbkYsRUFBRSxJQUFJLE1BQU0sUUFBUSxnQkFBZ0IsUUFBUSxzQkFBc0IsTUFBTSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUEsWUFJbEYsRUFBRSxJQUFJLE1BQU0sUUFBUSxzQkFBc0IsUUFBUSw2QkFBNkIsTUFBTSxlQUFlLFdBQVdBO0FBQUEsNkRBQzlELE9BQU8sYUFBYTtBQUFBLFlBQ3JFLEVBQUUsSUFBSSxNQUFNLFFBQVEsNkJBQTZCLFFBQVEseUJBQXlCLE1BQU0sVUFBVTtBQUFBLFlBQ2xHLEVBQUUsSUFBSSxNQUFNLFFBQVEseUJBQXlCLFFBQVEsc0JBQXNCLE1BQU0sZUFBZSxXQUFXQSxpQ0FBK0IsT0FBTyxvQkFBb0I7QUFBQSxVQUN2SztBQUFBLFFBQ0YsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGO0FBQUEsSUFDQSxFQUFFLElBQUksT0FBTyxNQUFNLE9BQU8sT0FBTyxNQUFNO0FBQUEsRUFDekM7QUFBQSxFQUVBLE9BQU87QUFBQSxJQUNMLEVBQUUsSUFBSSxNQUFNLFFBQVEsU0FBUyxRQUFRLG1CQUFtQixNQUFNLFVBQVU7QUFBQSxJQUN4RSxFQUFFLElBQUksTUFBTSxRQUFRLG1CQUFtQixRQUFRLGtCQUFrQixNQUFNLFVBQVU7QUFBQSxJQUNqRixFQUFFLElBQUksTUFBTSxRQUFRLGtCQUFrQixRQUFRLE9BQU8sTUFBTSxVQUFVO0FBQUEsRUFDdkU7QUFDRjs7O0FDOU5BLFNBQVMsT0FBQUMsYUFBVztBQVdiLElBQU0sc0JBQTRCO0FBQUEsRUFDdkMsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBQ2IsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSVIsT0FBTztBQUFBLEVBQ1AsV0FBVyxDQUFDO0FBQUEsRUFDWixPQUFPO0FBQUEsSUFDTCxFQUFFLElBQUksU0FBUyxNQUFNLFNBQVMsT0FBTyx1QkFBdUIsUUFBUSxFQUFFLFVBQVUsWUFBWSxFQUFFO0FBQUEsSUFDOUY7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUFnQixNQUFNO0FBQUEsTUFBYyxPQUFPO0FBQUEsTUFDL0MsUUFBUTtBQUFBLFFBQ04sWUFBWTtBQUFBLFFBQ1osUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsWUFBWSxZQUFZLFNBQVMsRUFBRSxHQUFHLGlCQUFpQixFQUFFLEtBQUtDLHdCQUFzQixFQUFFO0FBQUEsUUFDakgsT0FBTztBQUFBLFFBQ1AsZ0JBQWdCO0FBQUEsTUFDbEI7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQWUsTUFBTTtBQUFBLE1BQVEsT0FBTztBQUFBLE1BQ3hDLFFBQVE7QUFBQSxRQUNOLFlBQVlBO0FBQUEsUUFDWixrQkFBa0I7QUFBQSxRQUNsQixNQUFNLFFBQVEsU0FBUztBQUFBLFVBQ3JCLE9BQU87QUFBQSxZQUNMO0FBQUEsY0FDRSxJQUFJO0FBQUEsY0FBZ0IsTUFBTTtBQUFBLGNBQWlCLE9BQU87QUFBQSxjQUNsRCxRQUFRLEVBQUUsWUFBWSxhQUFhLFFBQVEsRUFBRSxJQUFJQSx1QkFBcUIsR0FBRyxRQUFRLEVBQUUsUUFBUSxVQUFVLEVBQUU7QUFBQSxZQUN6RztBQUFBLFVBQ0Y7QUFBQSxVQUNBLE9BQU8sQ0FBQztBQUFBLFFBQ1YsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGO0FBQUEsSUFDQSxFQUFFLElBQUksT0FBTyxNQUFNLE9BQU8sT0FBTyxNQUFNO0FBQUEsRUFDekM7QUFBQSxFQUNBLE9BQU87QUFBQSxJQUNMLEVBQUUsSUFBSSxNQUFNLFFBQVEsU0FBUyxRQUFRLGdCQUFnQixNQUFNLFVBQVU7QUFBQSxJQUNyRSxFQUFFLElBQUksTUFBTSxRQUFRLGdCQUFnQixRQUFRLGVBQWUsTUFBTSxVQUFVO0FBQUEsSUFDM0UsRUFBRSxJQUFJLE1BQU0sUUFBUSxlQUFlLFFBQVEsT0FBTyxNQUFNLFVBQVU7QUFBQSxFQUNwRTtBQUNGOzs7QUN4REEsU0FBUyxPQUFBQyxhQUFXO0FBWWIsSUFBTSx5QkFBK0I7QUFBQSxFQUMxQyxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFDYixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJUixPQUFPO0FBQUEsRUFDUCxXQUFXLENBQUM7QUFBQSxFQUNaLE9BQU87QUFBQSxJQUNMLEVBQUUsSUFBSSxTQUFTLE1BQU0sU0FBUyxPQUFPLHVCQUF1QixRQUFRLEVBQUUsVUFBVSxZQUFZLEVBQUU7QUFBQSxJQUM5RjtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQW1CLE1BQU07QUFBQSxNQUFjLE9BQU87QUFBQSxNQUNsRCxRQUFRO0FBQUEsUUFDTixZQUFZO0FBQUEsUUFDWixRQUFRLEVBQUUsUUFBUSxhQUFhLFVBQVUsRUFBRSxLQUFLQyx3QkFBc0IsRUFBRTtBQUFBLFFBQ3hFLE9BQU87QUFBQSxRQUNQLGdCQUFnQjtBQUFBLE1BQ2xCO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUFrQixNQUFNO0FBQUEsTUFBUSxPQUFPO0FBQUEsTUFDM0MsUUFBUTtBQUFBLFFBQ04sWUFBWUE7QUFBQSxRQUNaLGtCQUFrQjtBQUFBLFFBQ2xCLE1BQU0sUUFBUSxZQUFZO0FBQUEsVUFDeEIsT0FBTztBQUFBLFlBQ0w7QUFBQSxjQUNFLElBQUk7QUFBQSxjQUFnQixNQUFNO0FBQUEsY0FBaUIsT0FBTztBQUFBLGNBQ2xELFFBQVEsRUFBRSxZQUFZLGdCQUFnQixRQUFRLEVBQUUsSUFBSUEsMEJBQXdCLEdBQUcsUUFBUSxFQUFFLFFBQVEsVUFBVSxFQUFFO0FBQUEsWUFDL0c7QUFBQSxZQUNBO0FBQUEsY0FDRSxJQUFJO0FBQUEsY0FBZ0IsTUFBTTtBQUFBLGNBQVUsT0FBTztBQUFBLGNBQzNDLFFBQVE7QUFBQSxnQkFDTixZQUFZLENBQUNBLHNFQUFvRTtBQUFBLGdCQUNqRixVQUFVLENBQUMsU0FBUyxPQUFPO0FBQUEsZ0JBQzNCLE9BQU87QUFBQSxnQkFDUCxVQUFVO0FBQUEsZ0JBQ1YsY0FBYyxFQUFFLGlCQUFpQkEsdUNBQXFDO0FBQUEsZ0JBQ3RFLFdBQVc7QUFBQSxjQUNiO0FBQUEsWUFDRjtBQUFBLFVBQ0Y7QUFBQSxVQUNBLE9BQU87QUFBQSxZQUNMLEVBQUUsSUFBSSxNQUFNLFFBQVEsZ0JBQWdCLFFBQVEsZ0JBQWdCLE1BQU0sVUFBVTtBQUFBLFVBQzlFO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFBQSxJQUNBLEVBQUUsSUFBSSxPQUFPLE1BQU0sT0FBTyxPQUFPLE1BQU07QUFBQSxFQUN6QztBQUFBLEVBQ0EsT0FBTztBQUFBLElBQ0wsRUFBRSxJQUFJLE1BQU0sUUFBUSxTQUFTLFFBQVEsbUJBQW1CLE1BQU0sVUFBVTtBQUFBLElBQ3hFLEVBQUUsSUFBSSxNQUFNLFFBQVEsbUJBQW1CLFFBQVEsa0JBQWtCLE1BQU0sVUFBVTtBQUFBLElBQ2pGLEVBQUUsSUFBSSxNQUFNLFFBQVEsa0JBQWtCLFFBQVEsT0FBTyxNQUFNLFVBQVU7QUFBQSxFQUN2RTtBQUNGOzs7QUN0RUEsU0FBUyxLQUFBQyxLQUFHLE9BQUFDLGFBQVc7QUF3RmhCLElBQU0sc0NBQTRDO0FBQUEsRUFDdkQsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsYUFDRTtBQUFBLEVBQ0YsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRUixPQUFPO0FBQUEsRUFDUCxXQUFXO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtULEVBQUUsTUFBTSxvQkFBb0IsTUFBTSxjQUFjLFNBQVMsT0FBTyxVQUFVLE9BQU8sY0FBYyxDQUFDLEVBQUU7QUFBQSxFQUNwRztBQUFBLEVBQ0EsT0FBTztBQUFBLElBQ0w7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUNaLGFBQWE7QUFBQSxRQUNiLFdBQVdDO0FBQUE7QUFBQSxNQUViO0FBQUEsSUFDRjtBQUFBLElBQ0EsZ0JBQWdCO0FBQUEsSUFDaEI7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFNWixRQUFRLEVBQUUsaUJBQWlCQyw4QkFBNEI7QUFBQSxRQUN2RCxRQUFRO0FBQUEsUUFDUixPQUFPO0FBQUEsUUFDUCxnQkFBZ0I7QUFBQSxNQUNsQjtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFDSixNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsTUFDUCxRQUFRO0FBQUEsUUFDTixLQUFLO0FBQUEsUUFDTCxRQUFRO0FBQUEsUUFDUixTQUFTO0FBQUEsUUFDVCxXQUFXO0FBQUEsUUFDWCxlQUFlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUtmLE1BQU0sWUFBWSxzQkFBc0IsbUJBQW1CLFlBQVk7QUFBQSxVQUNyRTtBQUFBLFVBQU07QUFBQSxVQUFtQjtBQUFBLFVBQVU7QUFBQSxVQUFpQjtBQUFBLFVBQWM7QUFBQSxVQUFZO0FBQUEsVUFDOUU7QUFBQSxVQUFrQjtBQUFBLFVBQXFCO0FBQUEsVUFBaUI7QUFBQSxVQUFnQjtBQUFBLFVBQ3hFLENBQUMsY0FBYyxhQUFhO0FBQUEsVUFBRyxDQUFDLGtCQUFrQixpQkFBaUI7QUFBQSxVQUFHO0FBQUEsUUFDeEUsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGO0FBQUEsSUFDQSxFQUFFLElBQUksT0FBTyxNQUFNLE9BQU8sT0FBTyxNQUFNO0FBQUEsRUFDekM7QUFBQSxFQUNBLE9BQU87QUFBQSxJQUNMLEVBQUUsSUFBSSxNQUFNLFFBQVEsU0FBUyxRQUFRLGdCQUFnQixNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFTckU7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFdBQVdEO0FBQUEsSUFDYjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUNKLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLE1BQU07QUFBQSxNQUNOLE9BQU87QUFBQSxNQUNQLFdBQVdBO0FBQUEsSUFDYjtBQUFBLElBQ0EsRUFBRSxJQUFJLE1BQU0sUUFBUSxtQkFBbUIsUUFBUSxtQ0FBbUMsTUFBTSxVQUFVO0FBQUEsSUFDbEcsRUFBRSxJQUFJLE1BQU0sUUFBUSxtQ0FBbUMsUUFBUSxPQUFPLE1BQU0sVUFBVTtBQUFBLEVBQ3hGO0FBQ0Y7OztBQ2hNQSxTQUFTLEtBQUFFLEtBQUcsT0FBQUMsYUFBVztBQWlDaEIsSUFBTSx5QkFBK0I7QUFBQSxFQUMxQyxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFDYixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUEsRUFFUixXQUFXO0FBQUE7QUFBQTtBQUFBLElBR1QsRUFBRSxNQUFNLFlBQVksTUFBTSxRQUFRLFNBQVMsTUFBTSxVQUFVLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQXFDakUsRUFBRSxNQUFNLGdCQUFnQixNQUFNLFFBQVEsU0FBUyxNQUFNLFVBQVUsT0FBTyxjQUFjLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFZNUYsRUFBRSxNQUFNLGNBQWMsTUFBTSxRQUFRLFNBQVMsTUFBTSxVQUFVLE1BQU07QUFBQSxJQUNuRSxFQUFFLE1BQU0scUJBQXFCLE1BQU0sUUFBUSxTQUFTLE1BQU0sVUFBVSxNQUFNO0FBQUEsRUFDNUU7QUFBQSxFQUVBLE9BQU87QUFBQSxJQUNMLEVBQUUsSUFBSSxTQUFTLE1BQU0sU0FBUyxPQUFPLFNBQVMsUUFBUSxFQUFFLFlBQVksZUFBZSxFQUFFO0FBQUEsSUFDckY7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUFZLE1BQU07QUFBQSxNQUFVLE9BQU87QUFBQSxNQUN2QyxRQUFRO0FBQUEsUUFDTixRQUFRO0FBQUEsVUFDTjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFlBT0UsTUFBTTtBQUFBLFlBQWdCLE9BQU87QUFBQSxZQUFVLE1BQU07QUFBQSxZQUFVLFVBQVU7QUFBQSxZQUNqRSxjQUFjQztBQUFBLFlBQ2QsU0FBUztBQUFBLGNBQ1AsRUFBRSxPQUFPLFNBQVMsT0FBTyxRQUFRO0FBQUEsY0FDakMsRUFBRSxPQUFPLFlBQVksT0FBTyxXQUFXO0FBQUEsWUFDekM7QUFBQSxVQUNGO0FBQUEsVUFDQTtBQUFBLFlBQ0UsTUFBTTtBQUFBLFlBQWMsT0FBTztBQUFBLFlBQTBCLE1BQU07QUFBQSxZQUFVLFVBQVU7QUFBQSxZQUMvRSxjQUFjO0FBQUEsWUFDZCxTQUFTO0FBQUEsY0FDUCxFQUFFLE9BQU8sT0FBTyxPQUFPLE1BQU07QUFBQSxjQUM3QixFQUFFLE9BQU8sYUFBYSxPQUFPLFlBQVk7QUFBQSxjQUN6QyxFQUFFLE9BQU8sYUFBYSxPQUFPLFlBQVk7QUFBQSxZQUMzQztBQUFBLFVBQ0Y7QUFBQSxVQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUtFLE1BQU07QUFBQSxZQUFxQixPQUFPO0FBQUEsWUFDbEMsTUFBTTtBQUFBLFlBQVUsVUFBVTtBQUFBLFlBQU0sY0FBYztBQUFBLFlBQzlDLFNBQVM7QUFBQSxjQUNQLEVBQUUsT0FBTyxhQUFhLE9BQU8sWUFBWTtBQUFBLGNBQ3pDLEVBQUUsT0FBTyxTQUFTLE9BQU8sUUFBUTtBQUFBLGNBQ2pDLEVBQUUsT0FBTyxhQUFhLE9BQU8sWUFBWTtBQUFBLGNBQ3pDLEVBQUUsT0FBTyxlQUFlLE9BQU8sY0FBYztBQUFBLGNBQzdDLEVBQUUsT0FBTyxXQUFXLE9BQU8sVUFBVTtBQUFBLGNBQ3JDLEVBQUUsT0FBTyxXQUFXLE9BQU8sVUFBVTtBQUFBLGNBQ3JDLEVBQUUsT0FBTyxtQkFBbUIsT0FBTyxLQUFLO0FBQUEsY0FDeEMsRUFBRSxPQUFPLGNBQWMsT0FBTyxhQUFhO0FBQUEsWUFDN0M7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQWdCLE1BQU07QUFBQSxNQUFjLE9BQU87QUFBQSxNQUMvQyxRQUFRLEVBQUUsWUFBWSxnQkFBZ0IsUUFBUSxFQUFFLElBQUlBLGdCQUFjLEdBQUcsZ0JBQWdCLGlCQUFpQjtBQUFBLElBQ3hHO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQU1FLElBQUk7QUFBQSxNQUF1QixNQUFNO0FBQUEsTUFBWSxPQUFPO0FBQUEsSUFDdEQ7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFBZSxNQUFNO0FBQUEsTUFBYyxPQUFPO0FBQUEsTUFDOUMsUUFBUTtBQUFBLFFBQ04sWUFBWTtBQUFBLFFBQ1osUUFBUTtBQUFBLFVBQ04sUUFBUUE7QUFBQSxVQUNSLGNBQWM7QUFBQSxVQUNkLE9BQU8sRUFBRSxLQUFLLEtBQUs7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQUluQixlQUFlO0FBQUEsUUFDakI7QUFBQSxRQUNBLE9BQU87QUFBQSxRQUNQLGdCQUFnQjtBQUFBLE1BQ2xCO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUFjLE1BQU07QUFBQSxNQUFRLE9BQU87QUFBQSxNQUN2QyxRQUFRO0FBQUEsUUFDTixZQUFZQTtBQUFBLFFBQ1osa0JBQWtCO0FBQUEsUUFDbEIsTUFBTSxRQUFRLFFBQVE7QUFBQSxVQUNwQixPQUFPO0FBQUEsWUFDTDtBQUFBO0FBQUE7QUFBQTtBQUFBLGNBSUUsSUFBSTtBQUFBLGNBQXdCLE1BQU07QUFBQSxjQUFjLE9BQU87QUFBQSxjQUN2RCxRQUFRO0FBQUEsZ0JBQ04sWUFBWTtBQUFBLGdCQUNaLFFBQVEsRUFBRSxjQUFjQSxpQkFBZSxVQUFVQSxzQkFBb0I7QUFBQSxnQkFDckUsZ0JBQWdCO0FBQUEsY0FDbEI7QUFBQSxZQUNGO0FBQUEsWUFDQTtBQUFBO0FBQUEsY0FFRSxJQUFJO0FBQUEsY0FBc0IsTUFBTTtBQUFBLGNBQVksT0FBTztBQUFBLFlBQ3JEO0FBQUEsWUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLGNBYUUsSUFBSTtBQUFBLGNBQTBCLE1BQU07QUFBQSxjQUFXLE9BQU87QUFBQSxjQUN0RCxRQUFRO0FBQUEsZ0JBQ04sVUFBVTtBQUFBLGdCQUNWLE9BQU8sRUFBRSxZQUFZQSxpQkFBZSxRQUFRQSxzQkFBb0I7QUFBQSxjQUNsRTtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsVUFDQSxPQUFPO0FBQUEsWUFDTCxFQUFFLElBQUksTUFBTSxRQUFRLHdCQUF3QixRQUFRLHNCQUFzQixNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUkxRixFQUFFLElBQUksTUFBTSxRQUFRLHNCQUFzQixRQUFRLDBCQUEwQixNQUFNLGVBQWUsV0FBV0MsNkJBQTJCLE9BQU8sU0FBUztBQUFBLFVBQ3pKO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFBa0IsTUFBTTtBQUFBLE1BQWMsT0FBTztBQUFBLE1BQ2pELFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQSxRQUNaLFFBQVE7QUFBQSxVQUNOLFlBQVlEO0FBQUEsVUFDWixPQUFPLEVBQUUsS0FBSyxLQUFLO0FBQUE7QUFBQTtBQUFBLFVBR25CLGVBQWU7QUFBQSxRQUNqQjtBQUFBLFFBQ0EsT0FBTztBQUFBLFFBQ1AsZ0JBQWdCO0FBQUEsTUFDbEI7QUFBQSxJQUNGO0FBQUEsSUFDQTtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQWlCLE1BQU07QUFBQSxNQUFRLE9BQU87QUFBQSxNQUMxQyxRQUFRO0FBQUEsUUFDTixZQUFZQTtBQUFBLFFBQ1osa0JBQWtCO0FBQUEsUUFDbEIsTUFBTSxRQUFRLFdBQVc7QUFBQSxVQUN2QixPQUFPO0FBQUEsWUFDTDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsY0FLRSxJQUFJO0FBQUEsY0FBZ0MsTUFBTTtBQUFBLGNBQWMsT0FBTztBQUFBLGNBQy9ELFFBQVE7QUFBQSxnQkFDTixZQUFZO0FBQUEsZ0JBQ1osUUFBUSxFQUFFLGNBQWNBLGlCQUFlLGFBQWFBLHlCQUF1QjtBQUFBLGdCQUMzRSxnQkFBZ0I7QUFBQSxjQUNsQjtBQUFBLFlBQ0Y7QUFBQSxZQUNBO0FBQUE7QUFBQSxjQUVFLElBQUk7QUFBQSxjQUE4QixNQUFNO0FBQUEsY0FBWSxPQUFPO0FBQUEsWUFDN0Q7QUFBQSxZQUNBO0FBQUE7QUFBQTtBQUFBLGNBR0UsSUFBSTtBQUFBLGNBQXlCLE1BQU07QUFBQSxjQUFXLE9BQU87QUFBQSxjQUNyRCxRQUFRO0FBQUEsZ0JBQ04sVUFBVTtBQUFBLGdCQUNWLE9BQU8sRUFBRSxZQUFZQSxpQkFBZSxXQUFXQSx5QkFBdUI7QUFBQSxjQUN4RTtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsVUFDQSxPQUFPO0FBQUEsWUFDTCxFQUFFLElBQUksTUFBTSxRQUFRLGdDQUFnQyxRQUFRLDhCQUE4QixNQUFNLFVBQVU7QUFBQSxZQUMxRyxFQUFFLElBQUksTUFBTSxRQUFRLDhCQUE4QixRQUFRLHlCQUF5QixNQUFNLGVBQWUsV0FBV0Msb0NBQWtDLE9BQU8sU0FBUztBQUFBLFVBQ3ZLO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0Y7QUFBQSxJQUNBLEVBQUUsSUFBSSxPQUFPLE1BQU0sT0FBTyxPQUFPLE1BQU07QUFBQSxFQUN6QztBQUFBLEVBRUEsT0FBTztBQUFBLElBQ0wsRUFBRSxJQUFJLE1BQU0sUUFBUSxTQUFTLFFBQVEsWUFBWSxNQUFNLFVBQVU7QUFBQSxJQUNqRSxFQUFFLElBQUksTUFBTSxRQUFRLFlBQVksUUFBUSxnQkFBZ0IsTUFBTSxVQUFVO0FBQUEsSUFDeEUsRUFBRSxJQUFJLE1BQU0sUUFBUSxnQkFBZ0IsUUFBUSx1QkFBdUIsTUFBTSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUF5Qm5GLEVBQUUsSUFBSSxNQUFNLFFBQVEsdUJBQXVCLFFBQVEsZUFBZSxNQUFNLGVBQWUsV0FBV0E7QUFBQTtBQUFBLDJDQUUzRCxPQUFPLGtCQUFlO0FBQUEsSUFDN0QsRUFBRSxJQUFJLE1BQU0sUUFBUSxlQUFlLFFBQVEsY0FBYyxNQUFNLFVBQVU7QUFBQSxJQUN6RSxFQUFFLElBQUksTUFBTSxRQUFRLGNBQWMsUUFBUSxPQUFPLE1BQU0sVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQVNqRSxFQUFFLElBQUksTUFBTSxRQUFRLHVCQUF1QixRQUFRLGtCQUFrQixNQUFNLGVBQWUsV0FBV0E7QUFBQTtBQUFBLDJDQUU5RCxPQUFPLHFCQUFrQjtBQUFBLElBQ2hFLEVBQUUsSUFBSSxNQUFNLFFBQVEsa0JBQWtCLFFBQVEsaUJBQWlCLE1BQU0sVUFBVTtBQUFBLElBQy9FLEVBQUUsSUFBSSxNQUFNLFFBQVEsaUJBQWlCLFFBQVEsT0FBTyxNQUFNLFVBQVU7QUFBQSxFQUN0RTtBQUNGOzs7QUM1VUEsU0FBUyxPQUFBQyxhQUFXO0FBK0RwQixJQUFNLG9CQUFvQjtBQUFBLEVBQ3hCLFFBQVE7QUFBQTtBQUFBLEVBRVIsWUFBWUM7QUFDZDtBQUVPLElBQU0sK0JBQXFDO0FBQUEsRUFDaEQsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsYUFDRTtBQUFBLEVBQ0YsTUFBTTtBQUFBLEVBQ04sUUFBUTtBQUFBO0FBQUEsRUFHUixPQUFPO0FBQUEsRUFFUCxXQUFXO0FBQUE7QUFBQSxJQUVULEVBQUUsTUFBTSxjQUFjLE1BQU0sUUFBUSxTQUFTLE1BQU0sVUFBVSxNQUFNO0FBQUEsSUFDbkUsRUFBRSxNQUFNLFVBQVUsTUFBTSxRQUFRLFNBQVMsTUFBTSxVQUFVLE1BQU07QUFBQSxFQUNqRTtBQUFBLEVBRUEsT0FBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLTCxFQUFFLElBQUksU0FBUyxNQUFNLFNBQVMsT0FBTyxTQUFTLFFBQVEsQ0FBQyxFQUFFO0FBQUEsSUFDekQ7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUEwQixNQUFNO0FBQUEsTUFBaUIsT0FBTztBQUFBLE1BQzVELFFBQVE7QUFBQSxRQUNOLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUlaLFFBQVEsRUFBRSxjQUFjQSxtQkFBaUIsVUFBVUEsZUFBYSxHQUFHLGtCQUFrQjtBQUFBLE1BQ3ZGO0FBQUEsSUFDRjtBQUFBLElBQ0EsRUFBRSxJQUFJLE9BQU8sTUFBTSxPQUFPLE9BQU8sTUFBTTtBQUFBLEVBQ3pDO0FBQUEsRUFFQSxPQUFPO0FBQUEsSUFDTCxFQUFFLElBQUksTUFBTSxRQUFRLFNBQVMsUUFBUSwwQkFBMEIsTUFBTSxVQUFVO0FBQUEsSUFDL0UsRUFBRSxJQUFJLE1BQU0sUUFBUSwwQkFBMEIsUUFBUSxPQUFPLE1BQU0sVUFBVTtBQUFBLEVBQy9FO0FBQ0Y7QUFFTyxJQUFNLGtDQUF3QztBQUFBLEVBQ25ELE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLGFBQ0U7QUFBQSxFQUNGLE1BQU07QUFBQSxFQUNOLFFBQVE7QUFBQSxFQUVSLE9BQU87QUFBQSxFQUVQLFdBQVc7QUFBQSxJQUNULEVBQUUsTUFBTSxjQUFjLE1BQU0sUUFBUSxTQUFTLE1BQU0sVUFBVSxNQUFNO0FBQUEsSUFDbkUsRUFBRSxNQUFNLGFBQWEsTUFBTSxRQUFRLFNBQVMsTUFBTSxVQUFVLE1BQU07QUFBQSxFQUNwRTtBQUFBLEVBRUEsT0FBTztBQUFBLElBQ0wsRUFBRSxJQUFJLFNBQVMsTUFBTSxTQUFTLE9BQU8sU0FBUyxRQUFRLENBQUMsRUFBRTtBQUFBLElBQ3pEO0FBQUEsTUFDRSxJQUFJO0FBQUEsTUFBeUIsTUFBTTtBQUFBLE1BQWlCLE9BQU87QUFBQSxNQUMzRCxRQUFRO0FBQUEsUUFDTixZQUFZO0FBQUEsUUFDWixRQUFRLEVBQUUsY0FBY0EsbUJBQWlCLGFBQWFBLGtCQUFnQixHQUFHLGtCQUFrQjtBQUFBLE1BQzdGO0FBQUEsSUFDRjtBQUFBLElBQ0EsRUFBRSxJQUFJLE9BQU8sTUFBTSxPQUFPLE9BQU8sTUFBTTtBQUFBLEVBQ3pDO0FBQUEsRUFFQSxPQUFPO0FBQUEsSUFDTCxFQUFFLElBQUksTUFBTSxRQUFRLFNBQVMsUUFBUSx5QkFBeUIsTUFBTSxVQUFVO0FBQUEsSUFDOUUsRUFBRSxJQUFJLE1BQU0sUUFBUSx5QkFBeUIsUUFBUSxPQUFPLE1BQU0sVUFBVTtBQUFBLEVBQzlFO0FBQ0Y7OztBQzlJQSxTQUFTLE9BQUFDLGFBQVc7QUFtQmIsSUFBTSx5QkFBK0I7QUFBQSxFQUMxQyxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFDYixNQUFNO0FBQUEsRUFDTixRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJUixPQUFPO0FBQUEsRUFDUCxXQUFXLENBQUM7QUFBQSxFQUNaLE9BQU87QUFBQSxJQUNMLEVBQUUsSUFBSSxTQUFTLE1BQU0sU0FBUyxPQUFPLHVCQUF1QixRQUFRLEVBQUUsVUFBVSxZQUFZLEVBQUU7QUFBQSxJQUM5RjtBQUFBLE1BQ0UsSUFBSTtBQUFBLE1BQW1CLE1BQU07QUFBQSxNQUFjLE9BQU87QUFBQSxNQUNsRCxRQUFRO0FBQUEsUUFDTixZQUFZO0FBQUEsUUFDWixRQUFRLEVBQUUsUUFBUSxlQUFlLFVBQVUsRUFBRSxLQUFLQyx3QkFBc0IsRUFBRTtBQUFBLFFBQzFFLE9BQU87QUFBQSxRQUNQLGdCQUFnQjtBQUFBLE1BQ2xCO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxNQUNFLElBQUk7QUFBQSxNQUFrQixNQUFNO0FBQUEsTUFBUSxPQUFPO0FBQUEsTUFDM0MsUUFBUTtBQUFBLFFBQ04sWUFBWUE7QUFBQSxRQUNaLGtCQUFrQjtBQUFBLFFBQ2xCLE1BQU0sUUFBUSxZQUFZO0FBQUEsVUFDeEIsT0FBTztBQUFBLFlBQ0w7QUFBQSxjQUNFLElBQUk7QUFBQSxjQUFrQixNQUFNO0FBQUEsY0FBaUIsT0FBTztBQUFBLGNBQ3BELFFBQVEsRUFBRSxZQUFZLGdCQUFnQixRQUFRLEVBQUUsSUFBSUEsMEJBQXdCLEdBQUcsUUFBUSxFQUFFLFFBQVEsWUFBWSxFQUFFO0FBQUEsWUFDakg7QUFBQSxVQUNGO0FBQUEsVUFDQSxPQUFPLENBQUM7QUFBQSxRQUNWLENBQUM7QUFBQSxNQUNIO0FBQUEsSUFDRjtBQUFBLElBQ0EsRUFBRSxJQUFJLE9BQU8sTUFBTSxPQUFPLE9BQU8sTUFBTTtBQUFBLEVBQ3pDO0FBQUEsRUFDQSxPQUFPO0FBQUEsSUFDTCxFQUFFLElBQUksTUFBTSxRQUFRLFNBQVMsUUFBUSxtQkFBbUIsTUFBTSxVQUFVO0FBQUEsSUFDeEUsRUFBRSxJQUFJLE1BQU0sUUFBUSxtQkFBbUIsUUFBUSxrQkFBa0IsTUFBTSxVQUFVO0FBQUEsSUFDakYsRUFBRSxJQUFJLE1BQU0sUUFBUSxrQkFBa0IsUUFBUSxPQUFPLE1BQU0sVUFBVTtBQUFBLEVBQ3ZFO0FBQ0Y7OztBQ2hFQSxTQUFTLGVBQUFDLG9CQUFtQjtBQWFyQixJQUFNLHlCQUF5QkMsYUFBWTtBQUFBLEVBQ2hELE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLGFBQWE7QUFBQSxFQUViLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQW9CZCxPQUFPO0FBQUEsSUFDTDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBQUEsRUFFQSxtQkFBbUI7QUFBQSxJQUNqQixFQUFFLE9BQU8sY0FBYyxVQUFVLE1BQU0sT0FBTyxXQUFXO0FBQUEsRUFDM0Q7QUFDRixDQUFDOzs7QUNqREQsU0FBUyxlQUFBQyxvQkFBbUI7QUFhckIsSUFBTSxxQkFBcUJDLGFBQVk7QUFBQSxFQUM1QyxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUFhO0FBQUEsRUFFYixjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWtCZCxPQUFPLENBQUMsY0FBYyxlQUFlO0FBRXZDLENBQUM7OztBQ3RDRCxTQUFTLGVBQUFDLG9CQUFtQjtBQVdyQixJQUFNLDBCQUEwQkMsYUFBWTtBQUFBLEVBQ2pELE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLGFBQWE7QUFBQSxFQUViLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFzQmQsT0FBTyxDQUFDLG1CQUFtQixrQkFBa0IsaUJBQWlCLGdCQUFnQjtBQUFBLEVBRTlFLG1CQUFtQjtBQUFBLElBQ2pCLEVBQUUsT0FBTyxjQUFjLFVBQVUsTUFBTSxPQUFPLENBQUMsbUJBQW1CLFdBQVcsRUFBRTtBQUFBLEVBQ2pGO0FBQ0YsQ0FBQzs7O0FDM0NELFNBQVMsZUFBQUMsb0JBQW1CO0FBeUJyQixJQUFNLG1CQUFtQkMsYUFBWTtBQUFBLEVBQzFDLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLGFBQWE7QUFBQSxFQUViLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQTBCZCxPQUFPLENBQUMsbUJBQW1CLGNBQWMsaUJBQWlCLGdCQUFnQjtBQUU1RSxDQUFDOzs7QUMxREQsU0FBUyxlQUFBQyxvQkFBbUI7QUFVckIsSUFBTSxnQkFBZ0JDLGFBQVk7QUFBQSxFQUN2QyxNQUFNO0FBQUEsRUFDTixPQUFPO0FBQUEsRUFDUCxhQUNFO0FBQUEsRUFFRixjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFpQmQsT0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUVGLENBQUM7OztBQ3pDRCxTQUFTLEtBQUFDLFdBQVM7QUFJWCxJQUFNLHlCQUF5QjtBQUFBLEVBQ3BDLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLFFBQVE7QUFBQSxFQUNSLE1BQU07QUFBQSxFQUNOLFdBQVdDO0FBQUEsRUFDWCxhQUFhO0FBQUEsRUFDYixZQUFZLEVBQUUsTUFBTSxZQUFxQixPQUFPLGdCQUFnQjtBQUNsRTtBQW9DTyxJQUFNLHdCQUF3QjtBQUFBLEVBQ25DO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixPQUFPO0FBQUEsSUFDUCxRQUFRO0FBQUEsSUFDUixNQUFNO0FBQUEsSUFDTixXQUFXQSwwQkFBd0IsVUFBVSxFQUFFO0FBQUEsSUFDL0MsYUFBYTtBQUFBLElBQ2IsWUFBWSxFQUFFLE1BQU0sWUFBcUIsT0FBTyxnQkFBZ0I7QUFBQSxFQUNsRTtBQUFBLEVBQ0E7QUFBQSxJQUNFLE1BQU07QUFBQSxJQUNOLE9BQU87QUFBQSxJQUNQLFFBQVE7QUFBQSxJQUNSLE1BQU07QUFBQSxJQUNOLFdBQVdBLDBCQUF3QixVQUFVLElBQUk7QUFBQSxJQUNqRCxhQUFhO0FBQUEsSUFDYixZQUFZLEVBQUUsTUFBTSxZQUFxQixPQUFPLGdCQUFnQjtBQUFBLEVBQ2xFO0FBQ0Y7OztBQ25FQSxTQUFTLEtBQUFDLFdBQVM7QUFRWCxJQUFNLDhCQUE4QjtBQUFBLEVBQ3pDLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLFFBQVE7QUFBQSxFQUNSLE1BQU07QUFBQSxFQUNOLFdBQVdDLDJFQUF5RSxpQkFBaUI7QUFBQSxFQUNyRyxhQUFhO0FBQUEsRUFDYixZQUFZLEVBQUUsTUFBTSxZQUFxQixPQUFPLGlCQUFpQjtBQUNuRTtBQVVPLElBQU0sa0NBQWtDO0FBQUEsRUFDN0MsTUFBTTtBQUFBLEVBQ04sT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsTUFBTTtBQUFBLEVBQ04sV0FBV0EsMkVBQXlFLGlCQUFpQjtBQUFBLEVBQ3JHLGFBQWE7QUFBQSxFQUNiLFlBQVksRUFBRSxNQUFNLFlBQXFCLE9BQU8sWUFBWTtBQUM5RDs7O0FDbkJPLElBQU0sZUFBZTtBQUFBLEVBQzFCLEVBQUUsTUFBTSxhQUFzQixPQUFPLFlBQVk7QUFBQSxFQUNqRCxFQUFFLE1BQU0sa0JBQXNCLE9BQU8saUJBQWlCO0FBQUEsRUFDdEQsRUFBRSxNQUFNLGlCQUFzQixPQUFPLGdCQUFnQjtBQUFBLEVBQ3JELEVBQUUsTUFBTSxhQUFzQixPQUFPLHVCQUF1QjtBQUFBLEVBQzVELEVBQUUsTUFBTSxvQkFBc0IsT0FBTyxtQkFBbUI7QUFBQSxFQUN4RCxFQUFFLE1BQU0sbUJBQXNCLE9BQU8sa0JBQWtCO0FBQUEsRUFDdkQsRUFBRSxNQUFNLGlCQUFzQixPQUFPLGdCQUFnQjtBQUFBLEVBQ3JELEVBQUUsTUFBTSxzQkFBc0IsT0FBTyxxQkFBcUI7QUFBQSxFQUMxRCxFQUFFLE1BQU0scUJBQXNCLE9BQU8sb0JBQW9CO0FBQUEsRUFDekQsRUFBRSxNQUFNLGtCQUFzQixPQUFPLGlCQUFpQjtBQUFBO0FBQUEsRUFFdEQsRUFBRSxNQUFNLGlCQUFzQixPQUFPLGdCQUFnQjtBQUFBLEVBQ3JELEVBQUUsTUFBTSxpQkFBc0IsT0FBTyxnQkFBZ0I7QUFDdkQ7OztBQzdCQSxTQUFTLEtBQUFDLFdBQVM7QUFvQ1gsSUFBTSxpQ0FBaUM7QUFBQSxFQUM1QztBQUFBLElBQ0UsTUFBTTtBQUFBLElBQ04sT0FBTztBQUFBLElBQ1AsUUFBUTtBQUFBLElBQ1IsTUFBTTtBQUFBLElBQ04sV0FBV0M7QUFBQSxJQUNYLGFBQWE7QUFBQSxJQUNiLFlBQVksRUFBRSxNQUFNLFlBQXFCLE9BQU8sb0JBQW9CO0FBQUEsRUFDdEU7QUFBQSxFQUNBO0FBQUEsSUFDRSxNQUFNO0FBQUEsSUFDTixPQUFPO0FBQUEsSUFDUCxRQUFRO0FBQUEsSUFDUixNQUFNO0FBQUEsSUFDTixXQUFXQTtBQUFBLElBQ1gsYUFBYTtBQUFBLElBQ2IsWUFBWSxFQUFFLE1BQU0sWUFBcUIsT0FBTyxxQkFBcUI7QUFBQSxFQUN2RTtBQUNGOzs7QUMzQ0EsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyxPQUFBQyxhQUFXOzs7QUNIcEIsU0FBUyxPQUFBQyxhQUFXO0FBOERiLElBQU0sYUFBYSxDQUFDLE1BQWNDLGdCQUFjLENBQUM7QUFrQmpELElBQU0sWUFBWSxDQUFDLE1BQ3hCLEtBQUssTUFBTSxFQUFFLFdBQVcsRUFBRSxjQUFjLEtBQUssRUFBRSxZQUFZLEtBQUssT0FBTyxHQUFHLElBQUk7QUFFekUsSUFBTSxhQUFhLENBQUMsVUFDekIsS0FBSyxNQUFNLE1BQU0sT0FBTyxDQUFDLEtBQUssTUFBTSxNQUFNLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUk7OztBRCtFL0QsSUFBTSxXQUFXLFdBQVcsU0FBUztBQUFBLEVBQzFDLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFBQSxFQUNaLFNBQVM7QUFBQSxJQUNQO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixpQkFBaUI7QUFBQSxNQUNqQixNQUFNO0FBQUEsTUFDTixVQUFVO0FBQUEsTUFDVixnQkFBZ0I7QUFBQSxNQUNoQixxQkFBcUI7QUFBQSxNQUNyQixPQUFPO0FBQUEsTUFDUCxpQkFBaUIsRUFBRSxRQUFRLGdDQUFnQyxNQUFNLGlCQUFpQixPQUFPLE1BQU0sWUFBWSxTQUFTLFNBQVMsS0FBSztBQUFBLE1BQ2xJLFNBQVM7QUFBQSxNQUNULE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxNQUNULGNBQWM7QUFBQTtBQUFBLE1BRWQsb0JBQW9CQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQVlwQixhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBOEJmO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04saUJBQWlCO0FBQUEsTUFDakIsTUFBTTtBQUFBLE1BQ04sVUFBVTtBQUFBLE1BQ1YsZ0JBQWdCO0FBQUEsTUFDaEIscUJBQXFCO0FBQUEsTUFDckIsT0FBTztBQUFBLE1BQ1AsaUJBQWlCLEVBQUUsUUFBUSwwQkFBMEIsTUFBTSxXQUFXLE9BQU8sTUFBTSxZQUFZLFNBQVMsU0FBUyxLQUFLO0FBQUEsTUFDdEgsU0FBUztBQUFBLE1BQ1QsTUFBTTtBQUFBLE1BQ04sU0FBUztBQUFBO0FBQUE7QUFBQSxNQUdULG9CQUFvQkE7QUFBQSxJQUN0QjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGlCQUFpQjtBQUFBLE1BQ2pCLE1BQU07QUFBQSxNQUNOLFVBQVU7QUFBQSxNQUNWLGdCQUFnQjtBQUFBLE1BQ2hCLHFCQUFxQjtBQUFBLE1BQ3JCLE9BQU87QUFBQSxNQUNQLGlCQUFpQixFQUFFLFFBQVEsK0JBQStCLE1BQU0sWUFBWSxPQUFPLE1BQU0sWUFBWSxTQUFTLFNBQVMsS0FBSztBQUFBLE1BQzVILFNBQVM7QUFBQSxNQUNULE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxNQUNULGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS2Qsb0JBQW9CQTtBQUFBLElBQ3RCO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04saUJBQWlCO0FBQUEsTUFDakIsTUFBTTtBQUFBLE1BQ04sVUFBVTtBQUFBLE1BQ1YsZ0JBQWdCO0FBQUEsTUFDaEIscUJBQXFCO0FBQUE7QUFBQTtBQUFBLE1BR3JCLE9BQU87QUFBQSxNQUNQLGlCQUFpQixFQUFFLFFBQVEsOEJBQThCLE1BQU0sV0FBVyxPQUFPLE1BQU0sWUFBWSxXQUFXLFNBQVMsS0FBSztBQUFBLE1BQzVILFNBQVM7QUFBQSxNQUNULE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFlVCxjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFJZCxvQkFBb0JBO0FBQUEsSUFDdEI7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixpQkFBaUI7QUFBQSxNQUNqQixNQUFNO0FBQUEsTUFDTixVQUFVO0FBQUEsTUFDVixnQkFBZ0I7QUFBQSxNQUNoQixxQkFBcUI7QUFBQSxNQUNyQixPQUFPO0FBQUEsTUFDUCxpQkFBaUIsRUFBRSxRQUFRLHVCQUF1QixNQUFNLGFBQWEsT0FBTyxNQUFNLFlBQVksU0FBUyxTQUFTLEtBQUs7QUFBQSxNQUNySCxTQUFTO0FBQUEsTUFDVCxNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQWNULGNBQWM7QUFBQTtBQUFBLE1BRWQsb0JBQW9CQTtBQUFBLElBQ3RCO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04saUJBQWlCO0FBQUEsTUFDakIsTUFBTTtBQUFBLE1BQ04sVUFBVTtBQUFBLE1BQ1YsZ0JBQWdCO0FBQUEsTUFDaEIscUJBQXFCO0FBQUE7QUFBQSxNQUVyQixPQUFPO0FBQUEsTUFDUCxpQkFBaUIsRUFBRSxRQUFRLHFCQUFxQixNQUFNLFVBQVUsT0FBTyxNQUFNLFlBQVksU0FBUyxTQUFTLEtBQUs7QUFBQSxNQUNoSCxTQUFTO0FBQUEsTUFDVCxNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFJVCxvQkFBb0JBO0FBQUEsTUFDcEIsYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixpQkFBaUI7QUFBQSxNQUNqQixNQUFNO0FBQUEsTUFDTixVQUFVO0FBQUEsTUFDVixnQkFBZ0I7QUFBQSxNQUNoQixxQkFBcUI7QUFBQSxNQUNyQixPQUFPO0FBQUEsTUFDUCxpQkFBaUIsRUFBRSxRQUFRLGlDQUFpQyxNQUFNLFVBQVUsT0FBTyxNQUFNLFlBQVksU0FBUyxTQUFTLEtBQUs7QUFBQSxNQUM1SCxTQUFTO0FBQUEsTUFDVCxNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsTUFDVCxjQUFjO0FBQUE7QUFBQSxNQUVkLG9CQUFvQkE7QUFBQSxNQUNwQixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGlCQUFpQjtBQUFBLE1BQ2pCLE1BQU07QUFBQSxNQUNOLFVBQVU7QUFBQSxNQUNWLGdCQUFnQjtBQUFBLE1BQ2hCLHFCQUFxQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQU1yQixPQUFPO0FBQUEsTUFDUCxpQkFBaUIsRUFBRSxRQUFRLHVCQUF1QixNQUFNLFVBQVUsWUFBWSxZQUFZLFNBQVMsS0FBSztBQUFBLE1BQ3hHLFNBQVM7QUFBQSxNQUNULE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxNQUNULGNBQWM7QUFBQTtBQUFBO0FBQUEsTUFHZCxvQkFBb0JBO0FBQUEsTUFDcEIsYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixpQkFBaUI7QUFBQSxNQUNqQixNQUFNO0FBQUEsTUFDTixVQUFVO0FBQUEsTUFDVixnQkFBZ0I7QUFBQSxNQUNoQixxQkFBcUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQU9yQixPQUFPO0FBQUEsTUFDUCxpQkFBaUIsRUFBRSxRQUFRLCtCQUErQixNQUFNLGFBQWEsWUFBWSxVQUFVLFNBQVMsS0FBSztBQUFBLE1BQ2pILFNBQVM7QUFBQSxNQUNULE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUlULG9CQUFvQkE7QUFBQSxNQUNwQixhQUFhO0FBQUEsSUFDZjtBQUFBLEVBQ0Y7QUFDRixDQUFDO0FBR00sSUFBTSxXQUFXLFdBQVcsU0FBUztBQUFBLEVBQzFDLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFBQSxFQUNaLFNBQVM7QUFBQSxJQUNQO0FBQUEsTUFDRSxZQUFZO0FBQUEsTUFDWixZQUFZO0FBQUEsTUFDWixXQUFXO0FBQUEsTUFDWCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxZQUFZO0FBQUEsTUFDWixhQUFhO0FBQUEsTUFDYixZQUFZO0FBQUEsSUFDZDtBQUFBLElBQ0E7QUFBQSxNQUNFLFlBQVk7QUFBQSxNQUNaLFlBQVk7QUFBQSxNQUNaLFdBQVc7QUFBQSxNQUNYLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLFlBQVk7QUFBQSxNQUNaLGFBQWE7QUFBQSxNQUNiLFlBQVk7QUFBQSxJQUNkO0FBQUEsSUFDQTtBQUFBLE1BQ0UsWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osV0FBVztBQUFBLE1BQ1gsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsWUFBWTtBQUFBLE1BQ1osYUFBYTtBQUFBLE1BQ2IsWUFBWTtBQUFBLElBQ2Q7QUFBQSxJQUNBO0FBQUEsTUFDRSxZQUFZO0FBQUEsTUFDWixZQUFZO0FBQUEsTUFDWixXQUFXO0FBQUEsTUFDWCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxZQUFZO0FBQUEsTUFDWixhQUFhO0FBQUEsTUFDYixZQUFZO0FBQUEsSUFDZDtBQUFBLElBQ0E7QUFBQSxNQUNFLFlBQVk7QUFBQSxNQUNaLFlBQVk7QUFBQSxNQUNaLFdBQVc7QUFBQSxNQUNYLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLFlBQVk7QUFBQSxNQUNaLGFBQWE7QUFBQSxNQUNiLFlBQVk7QUFBQSxJQUNkO0FBQUEsSUFDQTtBQUFBLE1BQ0UsWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osV0FBVztBQUFBLE1BQ1gsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsWUFBWTtBQUFBLE1BQ1osYUFBYTtBQUFBLE1BQ2IsWUFBWTtBQUFBLElBQ2Q7QUFBQSxJQUNBO0FBQUEsTUFDRSxZQUFZO0FBQUEsTUFDWixZQUFZO0FBQUEsTUFDWixXQUFXO0FBQUEsTUFDWCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxPQUFPO0FBQUEsTUFDUCxZQUFZO0FBQUEsTUFDWixhQUFhO0FBQUEsTUFDYixZQUFZO0FBQUEsSUFDZDtBQUFBLElBQ0E7QUFBQSxNQUNFLFlBQVk7QUFBQSxNQUNaLFlBQVk7QUFBQSxNQUNaLFdBQVc7QUFBQSxNQUNYLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLFlBQVk7QUFBQSxNQUNaLGFBQWE7QUFBQSxNQUNiLFlBQVk7QUFBQSxJQUNkO0FBQUEsSUFDQTtBQUFBLE1BQ0UsWUFBWTtBQUFBLE1BQ1osWUFBWTtBQUFBLE1BQ1osV0FBVztBQUFBLE1BQ1gsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsWUFBWTtBQUFBLE1BQ1osYUFBYTtBQUFBLE1BQ2IsWUFBWTtBQUFBLElBQ2Q7QUFBQSxFQUNGO0FBQ0YsQ0FBQztBQWFELElBQU0sMkJBQTJCO0FBQUEsRUFDL0IsRUFBRSxRQUFRLGFBQWlCLE1BQU0sOEVBQXlFO0FBQUEsRUFDMUcsRUFBRSxRQUFRLGFBQWlCLE1BQU0sMERBQTBEO0FBQUEsRUFDM0YsRUFBRSxRQUFRLGlCQUFpQixNQUFNLHFFQUFxRTtBQUFBLEVBQ3RHLEVBQUUsUUFBUSxlQUFpQixNQUFNLG1FQUFtRTtBQUN0RztBQUVPLElBQU0sUUFBUSxXQUFXLE1BQU07QUFBQSxFQUNwQyxNQUFNO0FBQUEsRUFDTixZQUFZO0FBQUEsRUFDWixTQUFTO0FBQUEsSUFDUDtBQUFBLE1BQ0UsWUFBWTtBQUFBLE1BQ1osV0FBVztBQUFBLE1BQ1gsU0FBUztBQUFBLE1BQ1QsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1IsYUFBYTtBQUFBLE1BQ2IsVUFBVTtBQUFBLE1BQ1YsUUFBUTtBQUFBLE1BQ1Isb0JBQW9CQTtBQUFBLElBQ3RCO0FBQUEsSUFDQTtBQUFBLE1BQ0UsWUFBWTtBQUFBLE1BQ1osV0FBVztBQUFBLE1BQ1gsU0FBUztBQUFBLE1BQ1QsT0FBTztBQUFBLE1BQ1AsT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1IsYUFBYTtBQUFBLE1BQ2IsVUFBVTtBQUFBLE1BQ1YsUUFBUTtBQUFBLE1BQ1Isb0JBQW9CQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BT3BCLHFCQUFxQkE7QUFBQSxJQUN2QjtBQUFBLElBQ0E7QUFBQSxNQUNFLFlBQVk7QUFBQSxNQUNaLFdBQVc7QUFBQSxNQUNYLFNBQVM7QUFBQSxNQUNULE9BQU87QUFBQSxNQUNQLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxNQUNSLGFBQWE7QUFBQSxNQUNiLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQU9WLFFBQVE7QUFBQSxNQUNSLG9CQUFvQkE7QUFBQTtBQUFBLE1BRXBCLHFCQUFxQkE7QUFBQSxJQUN2QjtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSUEsR0FBRztBQUFBLE1BQ0QsRUFBRSxJQUFJLFFBQVcsSUFBSSxTQUFZLElBQUksb0JBQXdCLEtBQUssT0FBZSxLQUFLLGNBQWdCLEtBQUssRUFBSTtBQUFBLE1BQy9HLEVBQUUsSUFBSSxRQUFXLElBQUksU0FBWSxJQUFJLHNCQUF3QixLQUFLLFlBQWUsS0FBSyxhQUFnQixLQUFLLEdBQUk7QUFBQSxNQUMvRyxFQUFFLElBQUksUUFBVyxJQUFJLFVBQVksSUFBSSxvQkFBd0IsS0FBSyxTQUFlLEtBQUssVUFBZ0IsS0FBSyxHQUFJO0FBQUEsTUFDL0csRUFBRSxJQUFJLFFBQVcsSUFBSSxTQUFZLElBQUksZ0JBQXdCLEtBQUssV0FBZSxLQUFLLFVBQWdCLEtBQUssR0FBSTtBQUFBLE1BQy9HLEVBQUUsSUFBSSxPQUFXLElBQUksU0FBWSxJQUFJLGFBQXdCLEtBQUssT0FBZSxLQUFLLFVBQWdCLEtBQUssR0FBSTtBQUFBLE1BQy9HLEVBQUUsSUFBSSxRQUFXLElBQUksVUFBWSxJQUFJLGVBQXdCLEtBQUssYUFBZSxLQUFLLGNBQWdCLEtBQUssR0FBSTtBQUFBLE1BQy9HLEVBQUUsSUFBSSxRQUFXLElBQUksU0FBWSxJQUFJLG9CQUF3QixLQUFLLFNBQWUsS0FBSyxpQkFBZ0IsS0FBSyxHQUFJO0FBQUEsTUFDL0csRUFBRSxJQUFJLFFBQVcsSUFBSSxTQUFZLElBQUkscUJBQXdCLEtBQUssWUFBZSxLQUFLLGFBQWdCLEtBQUssR0FBSTtBQUFBLE1BQy9HLEVBQUUsSUFBSSxTQUFXLElBQUksU0FBWSxJQUFJLGlCQUF3QixLQUFLLGlCQUFpQixLQUFLLGVBQXFCLEtBQUssR0FBSTtBQUFBLE1BQ3RILEVBQUUsSUFBSSxPQUFXLElBQUksU0FBWSxJQUFJLG1CQUF3QixLQUFLLFdBQWUsS0FBSyxXQUFXLEtBQUssR0FBRztBQUFBLE1BQ3pHLEVBQUUsSUFBSSxTQUFXLElBQUksUUFBWSxJQUFJLGVBQXdCLEtBQUssT0FBZSxLQUFLLGFBQWdCLEtBQUssR0FBSTtBQUFBLE1BQy9HLEVBQUUsSUFBSSxRQUFXLElBQUksVUFBWSxJQUFJLGlCQUF3QixLQUFLLGFBQWUsS0FBSyxlQUFnQixLQUFLLElBQUk7QUFBQSxNQUMvRyxFQUFFLElBQUksUUFBVyxJQUFJLFFBQVksSUFBSSxpQkFBd0IsS0FBSyxpQkFBaUIsS0FBSyxTQUFnQixLQUFLLElBQUk7QUFBQSxNQUNqSCxFQUFFLElBQUksUUFBVyxJQUFJLFVBQVksSUFBSSxzQkFBd0IsS0FBSyxTQUFlLEtBQUssVUFBVSxLQUFLLElBQUk7QUFBQSxNQUN6RyxFQUFFLElBQUksUUFBVyxJQUFJLFVBQVksSUFBSSxvQkFBd0IsS0FBSyxZQUFlLEtBQUssaUJBQWdCLEtBQUssSUFBSTtBQUFBLE1BQy9HLEVBQUUsSUFBSSxRQUFXLElBQUksV0FBWSxJQUFJLHFCQUF3QixLQUFLLFdBQWUsS0FBSyxXQUFXLEtBQUssSUFBSTtBQUFBLE1BQzFHLEVBQUUsSUFBSSxPQUFXLElBQUksWUFBWSxJQUFJLHFCQUF3QixLQUFLLE9BQWUsS0FBSyxlQUFxQixLQUFLLElBQUk7QUFBQSxNQUNwSCxFQUFFLElBQUksUUFBVyxJQUFJLFNBQVksSUFBSSxzQkFBd0IsS0FBSyxhQUFlLEtBQUssU0FBUyxLQUFLLElBQUk7QUFBQSxJQUMxRyxFQUFFLElBQUksQ0FBQyxHQUFHLE1BQU07QUFDZCxZQUFNLFNBQVMsR0FBRyxFQUFFLEdBQUcsWUFBWSxFQUFFLFFBQVEsUUFBUSxFQUFFLENBQUM7QUFDeEQsWUFBTSxTQUFVLENBQUMsT0FBTyxhQUFhLGFBQWEsYUFBYSxFQUFZLElBQUksQ0FBQztBQUNoRixhQUFPO0FBQUEsUUFDTCxZQUFZLEVBQUU7QUFBQSxRQUNkLFdBQVcsRUFBRTtBQUFBLFFBQ2IsU0FBUyxFQUFFO0FBQUEsUUFDWCxPQUFPLEdBQUcsRUFBRSxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxZQUFZLENBQUMsSUFBSSxNQUFNO0FBQUEsUUFDNUQsT0FBTyxZQUFZLE9BQU8sQ0FBQyxFQUFFLFNBQVMsR0FBRyxHQUFHLENBQUMsSUFBSSxPQUFPLE1BQU8sSUFBSSxDQUFDLENBQUM7QUFBQSxRQUNyRTtBQUFBLFFBQ0EsYUFBYSxFQUFFO0FBQUEsUUFDZixVQUFVLEVBQUU7QUFBQSxRQUNaLFFBQVEsSUFBTSxJQUFJLElBQUs7QUFBQSxRQUN2QixxQkFBcUIsV0FBVyxFQUFFLEdBQUc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFNckMsT0FBUSxDQUFDLGlCQUFpQixjQUFjLHFCQUFxQixPQUFPLGtCQUFrQixFQUFZLElBQUksQ0FBQztBQUFBLFFBQ3ZHLFFBQVEsWUFBWSxPQUFPLENBQUMsRUFBRSxTQUFTLEdBQUcsR0FBRyxDQUFDLElBQUksT0FBTyxNQUFPLElBQUksQ0FBQyxDQUFDO0FBQUEsUUFDdEUsU0FBUyxXQUFXLE1BQU07QUFBQSxRQUMxQixnQkFBZ0IsTUFBYyxJQUFJLE9BQWE7QUFBQSxRQUMvQyxxQkFBcUIsS0FBTyxJQUFJLE1BQU87QUFBQSxRQUN2QyxhQUNFLGVBQWUsRUFBRSxJQUFJLFFBQVEsTUFBTSxHQUFHLENBQUMsMkRBQ3ZCLEVBQUUsSUFBSSxRQUFRLE1BQU0sR0FBRyxDQUFDO0FBQUEsUUFDMUMsR0FBSSxXQUFXLGdCQUNYO0FBQUEsVUFDRSx5QkFBeUIsMEJBQTBCLEtBQUssS0FBSyx5QkFBeUIsTUFBTSxFQUFFO0FBQUEsVUFDOUYsT0FBTywwQkFBMEIsS0FBSyxLQUFLLHlCQUF5QixNQUFNLEVBQUU7QUFBQSxRQUM5RSxJQUNBLENBQUM7QUFBQSxNQUNQO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUNGLENBQUM7QUF3Qk0sSUFBTSxvQkFBeUQ7QUFBQSxFQUNwRSx5QkFBeUI7QUFBQSxJQUN2QixFQUFFLFNBQVMsd0JBQXdCLFVBQVUsR0FBRyxZQUFZLEtBQU8sVUFBVSxJQUFJLGFBQWEsZ0ZBQTJFO0FBQUEsSUFDekssRUFBRSxTQUFTLG1CQUFtQixVQUFVLEdBQUcsWUFBWSxNQUFPLGFBQWEsNENBQXlDO0FBQUEsSUFDcEgsRUFBRSxTQUFTLDBCQUEwQixVQUFVLElBQUksWUFBWSxLQUFNLGFBQWEsd0NBQXdDO0FBQUEsRUFDNUg7QUFBQSxFQUNBLDhCQUE4QjtBQUFBLElBQzVCLEVBQUUsU0FBUyx3QkFBd0IsVUFBVSxHQUFHLFlBQVksS0FBTyxhQUFhLG1GQUE4RTtBQUFBLElBQzlKLEVBQUUsU0FBUywyQkFBMkIsVUFBVSxHQUFHLFlBQVksS0FBTSxhQUFhLHNEQUFzRDtBQUFBLElBQ3hJLEVBQUUsU0FBUyxvQkFBb0IsVUFBVSxHQUFHLFlBQVksS0FBTSxhQUFhLDZDQUE2QztBQUFBLElBQ3hILEVBQUUsU0FBUywwQkFBMEIsVUFBVSxJQUFJLFlBQVksS0FBTSxhQUFhLDhDQUE4QztBQUFBLEVBQ2xJO0FBQUEsRUFDQSw0QkFBNEI7QUFBQSxJQUMxQixFQUFFLFNBQVMsd0JBQXdCLFVBQVUsSUFBSSxZQUFZLEtBQU8sVUFBVSxJQUFJLGFBQWEsMERBQTBEO0FBQUEsSUFDekosRUFBRSxTQUFTLG1CQUFtQixVQUFVLEdBQUcsWUFBWSxNQUFPLGFBQWEsOENBQThDO0FBQUEsSUFDekgsRUFBRSxTQUFTLDBCQUEwQixVQUFVLEtBQUssWUFBWSxLQUFNLGFBQWEsbURBQW1EO0FBQUEsRUFDeEk7QUFBQSxFQUNBLDJCQUEyQjtBQUFBLElBQ3pCLEVBQUUsU0FBUywyQkFBMkIsVUFBVSxHQUFHLFlBQVksTUFBTyxhQUFhLDJDQUEyQztBQUFBLElBQzlILEVBQUUsU0FBUywwQkFBMEIsVUFBVSxHQUFHLFlBQVksTUFBTyxhQUFhLHdDQUF3QztBQUFBLElBQzFILEVBQUUsU0FBUyxvQkFBb0IsVUFBVSxHQUFHLFlBQVksS0FBTSxhQUFhLDZDQUE2QztBQUFBLElBQ3hILEVBQUUsU0FBUywwQkFBMEIsVUFBVSxJQUFJLFlBQVksS0FBTSxhQUFhLG9DQUFvQztBQUFBLEVBQ3hIO0FBQUEsRUFDQSw0QkFBNEI7QUFBQSxJQUMxQixFQUFFLFNBQVMsd0JBQXdCLFVBQVUsR0FBRyxZQUFZLEtBQU8sYUFBYSwyQ0FBMkM7QUFBQSxJQUMzSCxFQUFFLFNBQVMsbUJBQW1CLFVBQVUsR0FBRyxZQUFZLE1BQU8sYUFBYSwyQkFBMkI7QUFBQSxJQUN0RyxFQUFFLFNBQVMsMEJBQTBCLFVBQVUsSUFBSSxZQUFZLEtBQU0sYUFBYSw4Q0FBOEM7QUFBQSxFQUNsSTtBQUFBLEVBQ0EsdUJBQXVCO0FBQUEsSUFDckIsRUFBRSxTQUFTLHdCQUF3QixVQUFVLEdBQUcsWUFBWSxLQUFPLGFBQWEsZ0RBQWdEO0FBQUEsSUFDaEksRUFBRSxTQUFTLG9CQUFvQixVQUFVLEdBQUcsWUFBWSxLQUFNLGFBQWEscUNBQXFDO0FBQUEsSUFDaEgsRUFBRSxTQUFTLDJCQUEyQixVQUFVLEdBQUcsWUFBWSxLQUFNLGFBQWEsd0RBQXdEO0FBQUEsRUFDNUk7QUFBQSxFQUNBLHNCQUFzQjtBQUFBLElBQ3BCLEVBQUUsU0FBUyx3QkFBd0IsVUFBVSxHQUFHLFlBQVksS0FBTyxhQUFhLDhDQUE4QztBQUFBLElBQzlILEVBQUUsU0FBUyxtQkFBbUIsVUFBVSxHQUFHLFlBQVksTUFBTyxhQUFhLDhDQUE4QztBQUFBLElBQ3pILEVBQUUsU0FBUywwQkFBMEIsVUFBVSxJQUFJLFlBQVksS0FBTSxhQUFhLHVDQUF1QztBQUFBLEVBQzNIO0FBQUEsRUFDQSwyQkFBMkI7QUFBQSxJQUN6QixFQUFFLFNBQVMsMkJBQTJCLFVBQVUsSUFBSSxZQUFZLEtBQU0sYUFBYSxzREFBc0Q7QUFBQSxJQUN6SSxFQUFFLFNBQVMsMEJBQTBCLFVBQVUsR0FBRyxZQUFZLEtBQU0sYUFBYSx3Q0FBd0M7QUFBQSxFQUMzSDtBQUFBLEVBQ0EsbUJBQW1CO0FBQUEsSUFDakIsRUFBRSxTQUFTLDJCQUEyQixVQUFVLEdBQUcsWUFBWSxNQUFPLGFBQWEsd0RBQXdEO0FBQUEsSUFDM0ksRUFBRSxTQUFTLG9CQUFvQixVQUFVLEdBQUcsWUFBWSxLQUFNLGFBQWEsZ0NBQWdDO0FBQUEsSUFDM0csRUFBRSxTQUFTLDBCQUEwQixVQUFVLEdBQUcsWUFBWSxLQUFNLGFBQWEsMkNBQTJDO0FBQUEsRUFDOUg7QUFBQSxFQUNBLHNCQUFzQjtBQUFBLElBQ3BCLEVBQUUsU0FBUyxvQkFBb0IsVUFBVSxHQUFHLFlBQVksTUFBTyxhQUFhLDhDQUE4QztBQUFBLElBQzFILEVBQUUsU0FBUyw4QkFBOEIsVUFBVSxHQUFHLFlBQVksTUFBTyxhQUFhLHVDQUF1QztBQUFBLElBQzdILEVBQUUsU0FBUyxnQ0FBZ0MsVUFBVSxHQUFHLFlBQVksTUFBTSxhQUFhLDZDQUE2QztBQUFBLEVBQ3RJO0FBQUEsRUFDQSwwQkFBMEI7QUFBQSxJQUN4QixFQUFFLFNBQVMsd0JBQXdCLFVBQVUsR0FBRyxZQUFZLEtBQU8sYUFBYSxtQ0FBbUM7QUFBQSxJQUNuSCxFQUFFLFNBQVMsd0JBQXdCLFVBQVUsR0FBRyxZQUFZLE1BQU8sYUFBYSxzREFBc0Q7QUFBQSxJQUN0SSxFQUFFLFNBQVMsMEJBQTBCLFVBQVUsR0FBRyxZQUFZLEtBQU0sYUFBYSw0Q0FBNEM7QUFBQSxFQUMvSDtBQUFBLEVBQ0EsZ0NBQWdDO0FBQUEsSUFDOUIsRUFBRSxTQUFTLHdCQUF3QixVQUFVLEdBQUcsWUFBWSxLQUFPLGFBQWEsdUNBQXVDO0FBQUEsSUFDdkgsRUFBRSxTQUFTLDhCQUE4QixVQUFVLEdBQUcsWUFBWSxNQUFPLGFBQWEsK0NBQStDO0FBQUEsSUFDckksRUFBRSxTQUFTLDBCQUEwQixVQUFVLEdBQUcsWUFBWSxLQUFNLGFBQWEsd0NBQXdDO0FBQUEsRUFDM0g7QUFBQSxFQUNBLHdDQUF3QztBQUFBLElBQ3RDLEVBQUUsU0FBUyx3QkFBd0IsVUFBVSxHQUFHLFlBQVksTUFBTyxhQUFhLCtDQUErQztBQUFBLElBQy9ILEVBQUUsU0FBUyxvQkFBb0IsVUFBVSxHQUFHLFlBQVksS0FBTSxhQUFhLDJDQUEyQztBQUFBLElBQ3RILEVBQUUsU0FBUywwQkFBMEIsVUFBVSxJQUFJLFlBQVksS0FBTSxhQUFhLHFDQUFxQztBQUFBLEVBQ3pIO0FBQUEsRUFDQSxvQ0FBb0M7QUFBQSxJQUNsQyxFQUFFLFNBQVMsb0JBQW9CLFVBQVUsR0FBRyxZQUFZLE1BQU8sYUFBYSxrREFBa0Q7QUFBQSxJQUM5SCxFQUFFLFNBQVMsZ0NBQWdDLFVBQVUsR0FBRyxZQUFZLE1BQU0sYUFBYSw2Q0FBNkM7QUFBQSxJQUNwSSxFQUFFLFNBQVMsMEJBQTBCLFVBQVUsR0FBRyxZQUFZLEtBQU0sYUFBYSwyQ0FBMkM7QUFBQSxFQUM5SDtBQUFBLEVBQ0EsZ0NBQWdDO0FBQUEsSUFDOUIsRUFBRSxTQUFTLHdCQUF3QixVQUFVLEdBQUcsWUFBWSxLQUFPLGFBQWEsOERBQThEO0FBQUEsSUFDOUksRUFBRSxTQUFTLHdCQUF3QixVQUFVLEdBQUcsWUFBWSxNQUFPLGFBQWEsdURBQXVEO0FBQUEsSUFDdkksRUFBRSxTQUFTLGdDQUFnQyxVQUFVLEdBQUcsWUFBWSxNQUFNLGFBQWEsK0NBQStDO0FBQUEsSUFDdEksRUFBRSxTQUFTLDBCQUEwQixVQUFVLElBQUksWUFBWSxLQUFNLGFBQWEsMENBQTBDO0FBQUEsRUFDOUg7QUFBQSxFQUNBLG9DQUFvQztBQUFBLElBQ2xDLEVBQUUsU0FBUyxzQ0FBc0MsVUFBVSxHQUFHLFlBQVksTUFBTyxhQUFhLHNEQUFzRDtBQUFBLElBQ3BKLEVBQUUsU0FBUywyQkFBMkIsVUFBVSxHQUFHLFlBQVksS0FBTSxhQUFhLHNEQUFzRDtBQUFBLElBQ3hJLEVBQUUsU0FBUywwQkFBMEIsVUFBVSxHQUFHLFlBQVksS0FBTSxhQUFhLHFDQUFxQztBQUFBLEVBQ3hIO0FBQUEsRUFDQSw4QkFBOEI7QUFBQSxJQUM1QixFQUFFLFNBQVMsb0JBQW9CLFVBQVUsR0FBRyxZQUFZLE1BQU8sYUFBYSwrQ0FBK0M7QUFBQSxJQUMzSCxFQUFFLFNBQVMsbUJBQW1CLFVBQVUsR0FBRyxZQUFZLE1BQU8sYUFBYSw4Q0FBOEM7QUFBQSxJQUN6SCxFQUFFLFNBQVMsMEJBQTBCLFVBQVUsSUFBSSxZQUFZLEtBQU0sYUFBYSwrQ0FBK0M7QUFBQSxFQUNuSTtBQUFBLEVBQ0EsMkJBQTJCO0FBQUEsSUFDekIsRUFBRSxTQUFTLHdCQUF3QixVQUFVLEdBQUcsWUFBWSxLQUFPLGFBQWEsZ0VBQWdFO0FBQUEsSUFDaEosRUFBRSxTQUFTLDJCQUEyQixVQUFVLEdBQUcsWUFBWSxNQUFPLGFBQWEsdURBQXVEO0FBQUEsSUFDMUksRUFBRSxTQUFTLDBCQUEwQixVQUFVLEdBQUcsWUFBWSxLQUFNLGFBQWEsa0RBQWtEO0FBQUEsRUFDckk7QUFBQSxFQUNBLDZCQUE2QjtBQUFBLElBQzNCLEVBQUUsU0FBUyx3QkFBd0IsVUFBVSxHQUFHLFlBQVksS0FBTyxhQUFhLDBDQUEwQztBQUFBLElBQzFILEVBQUUsU0FBUyxvQkFBb0IsVUFBVSxHQUFHLFlBQVksTUFBTyxhQUFhLG1EQUFtRDtBQUFBLElBQy9ILEVBQUUsU0FBUywwQkFBMEIsVUFBVSxJQUFJLFlBQVksS0FBTSxhQUFhLG9DQUFvQztBQUFBLEVBQ3hIO0FBQUEsRUFDQSw2QkFBNkI7QUFBQSxJQUMzQixFQUFFLFNBQVMsd0JBQXdCLFVBQVUsR0FBRyxZQUFZLEtBQU8sVUFBVSxJQUFJLGFBQWEseUdBQXlHO0FBQUEsSUFDdk0sRUFBRSxTQUFTLDJCQUEyQixVQUFVLEdBQUcsWUFBWSxNQUFPLGFBQWEsb0RBQW9EO0FBQUEsSUFDdkksRUFBRSxTQUFTLG9CQUFvQixVQUFVLEdBQUcsWUFBWSxLQUFNLGFBQWEsd0NBQXdDO0FBQUEsSUFDbkgsRUFBRSxTQUFTLDBCQUEwQixVQUFVLElBQUksWUFBWSxLQUFNLGFBQWEsMENBQTBDO0FBQUEsRUFDOUg7QUFBQTtBQUFBLEVBRUEsK0JBQStCO0FBQUEsSUFDN0IsRUFBRSxTQUFTLG9CQUFvQixVQUFVLEdBQUcsWUFBWSxNQUFPLGFBQWEsa0RBQWtEO0FBQUEsSUFDOUgsRUFBRSxTQUFTLDJCQUEyQixVQUFVLEdBQUcsWUFBWSxLQUFNLGFBQWEsZ0VBQWdFO0FBQUEsSUFDbEosRUFBRSxTQUFTLDBCQUEwQixVQUFVLElBQUksWUFBWSxLQUFNLGFBQWEsdUNBQXVDO0FBQUEsRUFDM0g7QUFBQSxFQUNBLG1DQUFtQztBQUFBLElBQ2pDLEVBQUUsU0FBUyx3QkFBd0IsVUFBVSxHQUFHLFlBQVksS0FBTyxhQUFhLHNEQUFzRDtBQUFBLElBQ3RJLEVBQUUsU0FBUyxvQkFBb0IsVUFBVSxHQUFHLFlBQVksS0FBTSxhQUFhLCtDQUErQztBQUFBLElBQzFILEVBQUUsU0FBUywwQkFBMEIsVUFBVSxJQUFJLFlBQVksS0FBTSxhQUFhLDJDQUEyQztBQUFBLEVBQy9IO0FBQUEsRUFDQSxzQ0FBc0M7QUFBQSxJQUNwQyxFQUFFLFNBQVMsd0JBQXdCLFVBQVUsR0FBRyxZQUFZLEtBQU8sYUFBYSxzREFBc0Q7QUFBQSxJQUN0SSxFQUFFLFNBQVMsOEJBQThCLFVBQVUsR0FBRyxZQUFZLE1BQU8sYUFBYSxrREFBa0Q7QUFBQSxJQUN4SSxFQUFFLFNBQVMsb0JBQW9CLFVBQVUsR0FBRyxZQUFZLE1BQU8sYUFBYSxpREFBaUQ7QUFBQSxJQUM3SCxFQUFFLFNBQVMsMEJBQTBCLFVBQVUsSUFBSSxZQUFZLEtBQU0sYUFBYSxpREFBaUQ7QUFBQSxFQUNySTtBQUNGO0FBT0EsSUFBTSxZQUFZLENBQUMsaUJBQXlCLGdCQUF3QjtBQUNsRSxRQUFNLFFBQVEsa0JBQWtCLGVBQWU7QUFDL0MsTUFBSSxDQUFDLE1BQU8sT0FBTSxJQUFJLE1BQU0sdURBQXVELGVBQWUsR0FBRztBQUNyRyxRQUFNLFNBQVMsV0FBVyxLQUFLO0FBQy9CLFNBQU8sRUFBRSxRQUFRLGtCQUFrQixLQUFLLE1BQU0sU0FBUyxXQUFXLElBQUksSUFBSTtBQUM1RTtBQWdCTyxJQUFNLGdCQUFnQixXQUFXLGFBQWE7QUFBQSxFQUNuRCxNQUFNO0FBQUEsRUFDTixZQUFZO0FBQUEsRUFDWixTQUFTO0FBQUEsSUFDUDtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsR0FBRyxVQUFVLHlCQUF5QixFQUFFO0FBQUEsTUFDeEMsT0FBTztBQUFBLE1BQ1AsYUFBYTtBQUFBLE1BQ2IsWUFBWUE7QUFBQSxNQUNaLE1BQU07QUFBQSxNQUNOLG1CQUFtQjtBQUFBLE1BQ25CLGFBQWE7QUFBQSxNQUNiLGtCQUFrQixXQUFXLEVBQUU7QUFBQSxNQUMvQixhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BZWIsV0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixHQUFHLFVBQVUsOEJBQThCLEVBQUU7QUFBQSxNQUM3QyxPQUFPO0FBQUEsTUFDUCxhQUFhO0FBQUEsTUFDYixZQUFZQTtBQUFBLE1BQ1osTUFBTTtBQUFBLE1BQ04sbUJBQW1CO0FBQUEsTUFDbkIsYUFBYTtBQUFBLE1BQ2Isa0JBQWtCLFdBQVcsRUFBRTtBQUFBLElBQ2pDO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsR0FBRyxVQUFVLDRCQUE0QixFQUFFO0FBQUEsTUFDM0MsT0FBTztBQUFBLE1BQ1AsYUFBYTtBQUFBLE1BQ2IsWUFBWUE7QUFBQSxNQUNaLE1BQU07QUFBQSxNQUNOLG1CQUFtQjtBQUFBLE1BQ25CLGFBQWE7QUFBQSxNQUNiLGtCQUFrQixXQUFXLENBQUM7QUFBQSxJQUNoQztBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLEdBQUcsVUFBVSwyQkFBMkIsRUFBRTtBQUFBLE1BQzFDLE9BQU87QUFBQSxNQUNQLGFBQWE7QUFBQSxNQUNiLFlBQVlBO0FBQUEsTUFDWixNQUFNO0FBQUEsTUFDTixtQkFBbUI7QUFBQSxNQUNuQixhQUFhO0FBQUEsTUFDYixrQkFBa0IsV0FBVyxFQUFFO0FBQUEsSUFDakM7QUFBQTtBQUFBLElBRUE7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLEdBQUcsVUFBVSw0QkFBNEIsR0FBRztBQUFBLE1BQzVDLE9BQU87QUFBQSxNQUNQLGFBQWE7QUFBQSxNQUNiLFlBQVlBO0FBQUEsTUFDWixrQkFBa0JBO0FBQUEsTUFDbEIsTUFBTTtBQUFBLE1BQ04sbUJBQW1CO0FBQUEsTUFDbkIsYUFBYTtBQUFBLE1BQ2IsWUFBWTtBQUFBLE1BQ1osYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixHQUFHLFVBQVUsdUJBQXVCLEdBQUc7QUFBQSxNQUN2QyxPQUFPO0FBQUEsTUFDUCxhQUFhO0FBQUEsTUFDYixZQUFZQTtBQUFBLE1BQ1osa0JBQWtCQTtBQUFBLE1BQ2xCLE1BQU07QUFBQSxNQUNOLG1CQUFtQjtBQUFBLE1BQ25CLGFBQWE7QUFBQSxNQUNiLFlBQVk7QUFBQSxJQUNkO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsR0FBRyxVQUFVLHNCQUFzQixHQUFHO0FBQUEsTUFDdEMsT0FBTztBQUFBLE1BQ1AsYUFBYTtBQUFBLE1BQ2IsWUFBWUE7QUFBQSxNQUNaLGtCQUFrQkE7QUFBQSxNQUNsQixNQUFNO0FBQUEsTUFDTixtQkFBbUI7QUFBQSxNQUNuQixhQUFhO0FBQUEsTUFDYixZQUFZO0FBQUEsSUFDZDtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLEdBQUcsVUFBVSwyQkFBMkIsR0FBRztBQUFBLE1BQzNDLE9BQU87QUFBQSxNQUNQLGFBQWE7QUFBQSxNQUNiLFlBQVlBO0FBQUEsTUFDWixrQkFBa0JBO0FBQUEsTUFDbEIsTUFBTTtBQUFBLE1BQ04sbUJBQW1CO0FBQUEsTUFDbkIsYUFBYTtBQUFBLE1BQ2IsWUFBWTtBQUFBLElBQ2Q7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixHQUFHLFVBQVUsbUJBQW1CLEdBQUc7QUFBQSxNQUNuQyxPQUFPO0FBQUEsTUFDUCxhQUFhO0FBQUEsTUFDYixZQUFZQTtBQUFBLE1BQ1osa0JBQWtCQTtBQUFBLE1BQ2xCLE1BQU07QUFBQSxNQUNOLG1CQUFtQjtBQUFBLE1BQ25CLGFBQWE7QUFBQSxNQUNiLFlBQVk7QUFBQSxJQUNkO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFVQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsaUJBQWlCO0FBQUEsTUFDakIsY0FBYztBQUFBLE1BQ2QsR0FBRyxVQUFVLCtCQUErQixHQUFHO0FBQUEsTUFDL0MsT0FBTztBQUFBLE1BQ1AsYUFBYTtBQUFBLE1BQ2IsWUFBWUE7QUFBQSxNQUNaLGtCQUFrQkE7QUFBQSxNQUNsQixNQUFNO0FBQUEsTUFDTixtQkFBbUI7QUFBQSxNQUNuQixhQUFhO0FBQUEsTUFDYixZQUFZO0FBQUEsTUFDWixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLGlCQUFpQjtBQUFBLE1BQ2pCLGNBQWM7QUFBQSxNQUNkLEdBQUcsVUFBVSxtQ0FBbUMsR0FBRztBQUFBLE1BQ25ELE9BQU87QUFBQSxNQUNQLGFBQWE7QUFBQSxNQUNiLFlBQVlBO0FBQUEsTUFDWixrQkFBa0JBO0FBQUEsTUFDbEIsTUFBTTtBQUFBLE1BQ04sbUJBQW1CO0FBQUEsTUFDbkIsYUFBYTtBQUFBLE1BQ2IsYUFBYTtBQUFBLE1BQ2IsWUFBWTtBQUFBLElBQ2Q7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixpQkFBaUI7QUFBQSxNQUNqQixjQUFjO0FBQUEsTUFDZCxHQUFHLFVBQVUsc0NBQXNDLEdBQUc7QUFBQSxNQUN0RCxPQUFPO0FBQUEsTUFDUCxhQUFhO0FBQUEsTUFDYixZQUFZQTtBQUFBLE1BQ1osa0JBQWtCQTtBQUFBLE1BQ2xCLE1BQU07QUFBQSxNQUNOLG1CQUFtQjtBQUFBLE1BQ25CLGFBQWE7QUFBQSxNQUNiLGFBQWE7QUFBQSxNQUNiLFlBQVk7QUFBQSxJQUNkO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFnQkE7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLEdBQUcsVUFBVSxzQkFBc0IsQ0FBQztBQUFBLE1BQ3BDLE9BQU87QUFBQSxNQUNQLGFBQWE7QUFBQSxNQUNiLFlBQVlBO0FBQUEsTUFDWixrQkFBa0JBO0FBQUEsTUFDbEIsTUFBTTtBQUFBLE1BQ04sbUJBQW1CO0FBQUEsTUFDbkIsYUFBYTtBQUFBLE1BQ2IsYUFBYTtBQUFBLE1BQ2IsY0FBYztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BVWQsYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixHQUFHLFVBQVUsMEJBQTBCLENBQUM7QUFBQSxNQUN4QyxPQUFPO0FBQUEsTUFDUCxhQUFhO0FBQUEsTUFDYixZQUFZQTtBQUFBLE1BQ1osa0JBQWtCQTtBQUFBLE1BQ2xCLE1BQU07QUFBQSxNQUNOLG1CQUFtQjtBQUFBLE1BQ25CLGFBQWE7QUFBQSxNQUNiLGFBQWE7QUFBQSxNQUNiLGNBQWM7QUFBQSxJQUNoQjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLEdBQUcsVUFBVSxnQ0FBZ0MsQ0FBQztBQUFBLE1BQzlDLE9BQU87QUFBQSxNQUNQLGFBQWE7QUFBQSxNQUNiLFlBQVlBO0FBQUEsTUFDWixrQkFBa0JBO0FBQUEsTUFDbEIsTUFBTTtBQUFBLE1BQ04sbUJBQW1CO0FBQUEsTUFDbkIsYUFBYTtBQUFBLE1BQ2IsYUFBYTtBQUFBLE1BQ2IsY0FBYztBQUFBLE1BQ2QsYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixHQUFHLFVBQVUsd0NBQXdDLENBQUM7QUFBQSxNQUN0RCxPQUFPO0FBQUEsTUFDUCxhQUFhO0FBQUEsTUFDYixZQUFZQTtBQUFBLE1BQ1osa0JBQWtCQTtBQUFBLE1BQ2xCLE1BQU07QUFBQSxNQUNOLG1CQUFtQjtBQUFBLE1BQ25CLGFBQWE7QUFBQSxNQUNiLGFBQWE7QUFBQSxNQUNiLGNBQWM7QUFBQSxNQUNkLGFBQWE7QUFBQSxJQUNmO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsR0FBRyxVQUFVLG9DQUFvQyxDQUFDO0FBQUEsTUFDbEQsT0FBTztBQUFBLE1BQ1AsYUFBYTtBQUFBLE1BQ2IsWUFBWUE7QUFBQSxNQUNaLGtCQUFrQkE7QUFBQSxNQUNsQixNQUFNO0FBQUEsTUFDTixtQkFBbUI7QUFBQSxNQUNuQixhQUFhO0FBQUEsTUFDYixhQUFhO0FBQUEsTUFDYixjQUFjO0FBQUEsTUFDZCxhQUFhO0FBQUEsSUFDZjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQWtCQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsaUJBQWlCO0FBQUEsTUFDakIsR0FBRyxVQUFVLGdDQUFnQyxFQUFFO0FBQUEsTUFDL0MsT0FBTztBQUFBLE1BQ1AsYUFBYTtBQUFBLE1BQ2IsWUFBWUE7QUFBQSxNQUNaLE1BQU07QUFBQSxNQUNOLG1CQUFtQjtBQUFBLE1BQ25CLGFBQWE7QUFBQSxNQUNiLGtCQUFrQixXQUFXLENBQUM7QUFBQSxNQUM5QixhQUFhO0FBQUEsTUFDYixXQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLGlCQUFpQjtBQUFBLE1BQ2pCLGNBQWM7QUFBQSxNQUNkLEdBQUcsVUFBVSxvQ0FBb0MsRUFBRTtBQUFBLE1BQ25ELE9BQU87QUFBQSxNQUNQLGFBQWE7QUFBQSxNQUNiLFlBQVlBO0FBQUEsTUFDWixNQUFNO0FBQUEsTUFDTixtQkFBbUI7QUFBQSxNQUNuQixhQUFhO0FBQUEsTUFDYixrQkFBa0IsV0FBVyxFQUFFO0FBQUEsTUFDL0IsYUFBYTtBQUFBLE1BQ2IsV0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixpQkFBaUI7QUFBQSxNQUNqQixHQUFHLFVBQVUsOEJBQThCLEVBQUU7QUFBQSxNQUM3QyxPQUFPO0FBQUEsTUFDUCxhQUFhO0FBQUEsTUFDYixZQUFZQTtBQUFBLE1BQ1osTUFBTTtBQUFBLE1BQ04sbUJBQW1CO0FBQUEsTUFDbkIsYUFBYTtBQUFBLE1BQ2Isa0JBQWtCLFdBQVcsQ0FBQztBQUFBLE1BQzlCLGFBQWE7QUFBQSxNQUNiLFdBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsaUJBQWlCO0FBQUEsTUFDakIsR0FBRyxVQUFVLDJCQUEyQixFQUFFO0FBQUEsTUFDMUMsT0FBTztBQUFBLE1BQ1AsYUFBYTtBQUFBLE1BQ2IsWUFBWUE7QUFBQSxNQUNaLE1BQU07QUFBQSxNQUNOLG1CQUFtQjtBQUFBLE1BQ25CLGFBQWE7QUFBQSxNQUNiLGtCQUFrQixXQUFXLEVBQUU7QUFBQSxNQUMvQixhQUFhO0FBQUEsTUFDYixXQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLGlCQUFpQjtBQUFBLE1BQ2pCLGNBQWM7QUFBQSxNQUNkLEdBQUcsVUFBVSw2QkFBNkIsRUFBRTtBQUFBLE1BQzVDLE9BQU87QUFBQSxNQUNQLGFBQWE7QUFBQSxNQUNiLFlBQVlBO0FBQUEsTUFDWixNQUFNO0FBQUEsTUFDTixtQkFBbUI7QUFBQSxNQUNuQixhQUFhO0FBQUEsTUFDYixrQkFBa0IsV0FBVyxDQUFDO0FBQUEsTUFDOUIsYUFBYTtBQUFBLE1BQ2IsV0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixpQkFBaUI7QUFBQSxNQUNqQixHQUFHLFVBQVUsNkJBQTZCLEVBQUU7QUFBQSxNQUM1QyxPQUFPO0FBQUEsTUFDUCxhQUFhO0FBQUEsTUFDYixZQUFZQTtBQUFBLE1BQ1osTUFBTTtBQUFBLE1BQ04sbUJBQW1CO0FBQUEsTUFDbkIsYUFBYTtBQUFBLE1BQ2Isa0JBQWtCLFdBQVcsQ0FBQztBQUFBLE1BQzlCLGFBQWE7QUFBQSxNQUNiLFdBQVc7QUFBQSxJQUNiO0FBQUEsRUFDRjtBQUNGLENBQUM7OztBRTVyQ0QsU0FBUyxjQUFBQyxtQkFBa0I7QUFDM0IsU0FBUyxPQUFBQyxhQUFXO0FBV2IsSUFBTSxRQUFRQyxZQUFXLE1BQU07QUFBQSxFQUNwQyxNQUFNO0FBQUEsRUFDTixZQUFZO0FBQUEsRUFDWixTQUFTO0FBQUEsSUFDUDtBQUFBLE1BQ0UsU0FBUztBQUFBLE1BQ1QsYUFBYTtBQUFBLE1BQ2IsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsZUFBZTtBQUFBLE1BQ2YsVUFBVUM7QUFBQSxNQUNWLGlCQUFpQjtBQUFBLE1BQ2pCLG9CQUFvQjtBQUFBLE1BQ3BCLHdCQUF3QjtBQUFBLElBQzFCO0FBQUEsSUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BYUUsU0FBUztBQUFBLE1BQ1QsYUFBYTtBQUFBLE1BQ2IsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsZUFBZTtBQUFBLE1BQ2YsVUFBVUE7QUFBQSxNQUNWLGdCQUFnQkE7QUFBQTtBQUFBLE1BRWhCLGNBQWM7QUFBQSxNQUNkLGtCQUFrQjtBQUFBLE1BQ2xCLGlCQUFpQjtBQUFBLE1BQ2pCLG9CQUFvQjtBQUFBLE1BQ3BCLHdCQUF3QjtBQUFBLElBQzFCO0FBQUEsSUFDQTtBQUFBLE1BQ0UsU0FBUztBQUFBLE1BQ1QsYUFBYTtBQUFBLE1BQ2IsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsZUFBZTtBQUFBLE1BQ2YsVUFBVUE7QUFBQSxNQUNWLGlCQUFpQjtBQUFBLE1BQ2pCLG9CQUFvQjtBQUFBLE1BQ3BCLGlCQUFpQjtBQUFBLElBQ25CO0FBQUEsSUFDQTtBQUFBLE1BQ0UsU0FBUztBQUFBLE1BQ1QsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsZUFBZTtBQUFBLE1BQ2YsVUFBVUE7QUFBQSxNQUNWLGlCQUFpQjtBQUFBLE1BQ2pCLG9CQUFvQjtBQUFBLElBQ3RCO0FBQUEsSUFDQTtBQUFBLE1BQ0UsU0FBUztBQUFBLE1BQ1QsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsZUFBZTtBQUFBLE1BQ2YsVUFBVUE7QUFBQSxNQUNWLGlCQUFpQjtBQUFBLE1BQ2pCLG9CQUFvQjtBQUFBLElBQ3RCO0FBQUEsSUFDQTtBQUFBLE1BQ0UsU0FBUztBQUFBLE1BQ1QsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsZUFBZTtBQUFBLE1BQ2YsZ0JBQWdCQTtBQUFBO0FBQUEsTUFFaEIsY0FBYztBQUFBLE1BQ2Qsa0JBQWtCO0FBQUEsTUFDbEIsaUJBQWlCO0FBQUEsTUFDakIsb0JBQW9CO0FBQUEsSUFDdEI7QUFBQSxJQUNBO0FBQUE7QUFBQTtBQUFBLE1BR0UsU0FBUztBQUFBLE1BQ1QsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsZUFBZTtBQUFBLE1BQ2YsVUFBVUE7QUFBQSxJQUNaO0FBQUEsRUFDRjtBQUNGLENBQUM7QUFxREQsSUFBTSxzQkFBc0I7QUFBQSxFQUMxQixhQUFhO0FBQUEsRUFDYixhQUFhO0FBQUEsRUFDYixpQkFBaUI7QUFBQSxFQUNqQixVQUFVO0FBQUEsRUFDVixVQUFVO0FBQ1o7QUE2Q0EsSUFBTSxXQUFXLENBQUMsU0FBaUIsTUFBYyxXQUFtQjtBQUNsRSxRQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksTUFBTTtBQUMvQixTQUFPLFdBQVcsSUFDZEEsZ0JBQWMsT0FBTyxnQkFBZ0IsS0FBSyxNQUMxQ0Esb0JBQWtCLENBQUMsT0FBTyxnQkFBZ0IsS0FBSztBQUNyRDtBQVlBLElBQU0sY0FBb0M7QUFBQTtBQUFBLEVBRXhDO0FBQUEsSUFDRSxTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsSUFBUSxRQUFRO0FBQUEsSUFBUSxTQUFTO0FBQUEsSUFBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQUEsSUFBRyxTQUFTO0FBQUEsSUFDaEUsYUFBYTtBQUFBLElBQW1CLFlBQVk7QUFBQSxJQUF5QixTQUFTO0FBQUEsSUFDOUUsVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBLElBQ1QsV0FBVyxDQUFDLEVBQUUsU0FBUywrQkFBK0IsVUFBVSxXQUFXLENBQUM7QUFBQSxFQUM5RTtBQUFBLEVBQ0E7QUFBQSxJQUNFLFNBQVM7QUFBQSxJQUNULE1BQU07QUFBQSxJQUFRLFFBQVE7QUFBQSxJQUFRLFNBQVM7QUFBQSxJQUFHLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFBQSxJQUFHLFNBQVM7QUFBQSxJQUNqRSxhQUFhO0FBQUEsSUFBZSxZQUFZO0FBQUEsSUFBK0IsU0FBUztBQUFBLElBQ2hGLFNBQVM7QUFBQSxJQUNULFdBQVcsQ0FBQyxFQUFFLFNBQVMsK0JBQStCLFVBQVUsV0FBVyxDQUFDO0FBQUEsRUFDOUU7QUFBQSxFQUNBO0FBQUEsSUFDRSxTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsSUFBVyxRQUFRO0FBQUEsSUFBUSxTQUFTO0FBQUEsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQUEsSUFBRyxTQUFTO0FBQUEsSUFDbkUsYUFBYTtBQUFBLElBQWUsWUFBWTtBQUFBLElBQ3hDLFVBQVU7QUFBQSxJQUNWLFNBQVM7QUFBQSxJQUNULFdBQVcsQ0FBQyxFQUFFLFNBQVMsK0JBQStCLFVBQVUsV0FBVyxDQUFDO0FBQUEsRUFDOUU7QUFBQSxFQUNBO0FBQUEsSUFDRSxTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsSUFBUSxRQUFRO0FBQUEsSUFBUSxTQUFTO0FBQUEsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQUEsSUFBRyxTQUFTO0FBQUEsSUFDakUsYUFBYTtBQUFBLElBQVksWUFBWTtBQUFBLElBQXVDLFNBQVM7QUFBQSxJQUNyRixTQUFTO0FBQUEsSUFDVCxXQUFXLENBQUMsRUFBRSxTQUFTLCtCQUErQixVQUFVLFdBQVcsQ0FBQztBQUFBLEVBQzlFO0FBQUEsRUFDQTtBQUFBLElBQ0UsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLElBQVcsUUFBUTtBQUFBLElBQVEsU0FBUztBQUFBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztBQUFBLElBQUcsU0FBUztBQUFBLElBQ3BFLGFBQWE7QUFBQSxJQUFtQixZQUFZO0FBQUEsSUFBNEIsU0FBUztBQUFBLElBQ2pGLFNBQVM7QUFBQSxJQUNULFdBQVcsQ0FBQyxFQUFFLFNBQVMsK0JBQStCLFVBQVUsV0FBVyxDQUFDO0FBQUEsRUFDOUU7QUFBQSxFQUNBO0FBQUEsSUFDRSxTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsSUFBZ0IsUUFBUTtBQUFBLElBQVEsU0FBUztBQUFBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztBQUFBLElBQUcsU0FBUztBQUFBLElBQ3pFLGFBQWE7QUFBQSxJQUFlLFlBQVk7QUFBQSxJQUN4QyxVQUFVO0FBQUEsSUFDVixTQUFTO0FBQUEsSUFDVCxXQUFXLENBQUMsRUFBRSxTQUFTLCtCQUErQixVQUFVLFdBQVcsQ0FBQztBQUFBLEVBQzlFO0FBQUE7QUFBQSxFQUdBO0FBQUEsSUFDRSxTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsSUFBVyxRQUFRO0FBQUEsSUFBUSxTQUFTO0FBQUEsSUFBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQUEsSUFBRyxTQUFTO0FBQUEsSUFDbkUsYUFBYTtBQUFBLElBQW1CLFlBQVk7QUFBQSxJQUE0QixTQUFTO0FBQUEsSUFDakYsVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBLElBQ1QsV0FBVyxDQUFDLEVBQUUsU0FBUyw2QkFBNkIsVUFBVSxXQUFXLENBQUM7QUFBQSxFQUM1RTtBQUFBLEVBQ0E7QUFBQSxJQUNFLFNBQVM7QUFBQSxJQUNULE1BQU07QUFBQSxJQUFRLFFBQVE7QUFBQSxJQUFRLFNBQVM7QUFBQSxJQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFBQSxJQUFHLFNBQVM7QUFBQSxJQUNoRSxhQUFhO0FBQUEsSUFBZSxZQUFZO0FBQUEsSUFBNkIsU0FBUztBQUFBLElBQzlFLFNBQVM7QUFBQSxJQUNULFdBQVcsQ0FBQyxFQUFFLFNBQVMsNkJBQTZCLFVBQVUsV0FBVyxDQUFDO0FBQUEsRUFDNUU7QUFBQSxFQUNBO0FBQUEsSUFDRSxTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsSUFBVyxRQUFRO0FBQUEsSUFBUSxTQUFTO0FBQUEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQUEsSUFBRyxTQUFTO0FBQUEsSUFDcEUsYUFBYTtBQUFBLElBQWUsWUFBWTtBQUFBLElBQ3hDLFVBQVU7QUFBQSxJQUNWLFNBQVM7QUFBQSxJQUNULFdBQVcsQ0FBQyxFQUFFLFNBQVMsNkJBQTZCLFVBQVUsV0FBVyxDQUFDO0FBQUEsRUFDNUU7QUFBQSxFQUNBO0FBQUEsSUFDRSxTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsSUFBUSxRQUFRO0FBQUEsSUFBUSxTQUFTO0FBQUEsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO0FBQUEsSUFBRyxTQUFTO0FBQUEsSUFDbEUsYUFBYTtBQUFBLElBQVksWUFBWTtBQUFBLElBQWdDLFNBQVM7QUFBQSxJQUM5RSxTQUFTO0FBQUEsSUFDVCxXQUFXLENBQUMsRUFBRSxTQUFTLDZCQUE2QixVQUFVLFdBQVcsQ0FBQztBQUFBLEVBQzVFO0FBQUE7QUFBQSxFQUdBO0FBQUEsSUFDRSxTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsSUFBVyxRQUFRO0FBQUEsSUFBUSxTQUFTO0FBQUEsSUFBRyxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQUEsSUFBRyxTQUFTO0FBQUEsSUFDbkUsYUFBYTtBQUFBLElBQW1CLFlBQVk7QUFBQSxJQUE2QixTQUFTO0FBQUEsSUFDbEYsVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBLElBQ1QsV0FBVyxDQUFDLEVBQUUsU0FBUyxtQ0FBbUMsVUFBVSxXQUFXLENBQUM7QUFBQSxFQUNsRjtBQUFBLEVBQ0E7QUFBQSxJQUNFLFNBQVM7QUFBQSxJQUNULE1BQU07QUFBQSxJQUFRLFFBQVE7QUFBQSxJQUFRLFNBQVM7QUFBQSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFBQSxJQUFHLFNBQVM7QUFBQSxJQUNsRSxhQUFhO0FBQUEsSUFBbUIsWUFBWTtBQUFBLElBQThCLFNBQVM7QUFBQSxJQUNuRixVQUFVO0FBQUEsSUFDVixTQUFTO0FBQUEsSUFDVCxXQUFXLENBQUMsRUFBRSxTQUFTLG1DQUFtQyxVQUFVLFdBQVcsQ0FBQztBQUFBLEVBQ2xGO0FBQUEsRUFDQTtBQUFBLElBQ0UsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLElBQVEsUUFBUTtBQUFBLElBQVEsU0FBUztBQUFBLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtBQUFBLElBQUcsU0FBUztBQUFBLElBQ2xFLGFBQWE7QUFBQSxJQUFlLFlBQVk7QUFBQSxJQUFtQyxTQUFTO0FBQUEsSUFDcEYsU0FBUztBQUFBLElBQ1QsV0FBVyxDQUFDLEVBQUUsU0FBUyxtQ0FBbUMsVUFBVSxXQUFXLENBQUM7QUFBQSxFQUNsRjtBQUFBLEVBQ0E7QUFBQSxJQUNFLFNBQVM7QUFBQSxJQUNULE1BQU07QUFBQSxJQUFXLFFBQVE7QUFBQSxJQUFRLFNBQVM7QUFBQSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7QUFBQSxJQUFHLFNBQVM7QUFBQSxJQUNwRSxhQUFhO0FBQUEsSUFBZSxZQUFZO0FBQUEsSUFDeEMsU0FBUztBQUFBLElBQ1QsV0FBVyxDQUFDLEVBQUUsU0FBUyxtQ0FBbUMsVUFBVSxXQUFXLENBQUM7QUFBQSxFQUNsRjtBQUFBO0FBQUEsRUFHQTtBQUFBLElBQ0UsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLElBQWdCLFFBQVE7QUFBQSxJQUFRLFNBQVM7QUFBQSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7QUFBQSxJQUFHLFNBQVM7QUFBQSxJQUN4RSxhQUFhO0FBQUEsSUFBZSxZQUFZO0FBQUEsSUFDeEMsVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBLElBQ1QsV0FBVyxDQUFDLEVBQUUsU0FBUyxnQ0FBZ0MsVUFBVSxXQUFXLENBQUM7QUFBQSxFQUMvRTtBQUFBO0FBQUEsRUFHQTtBQUFBLElBQ0UsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLElBQVEsUUFBUTtBQUFBLElBQVEsU0FBUztBQUFBLElBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztBQUFBLElBQUcsU0FBUztBQUFBLElBQ2hFLGFBQWE7QUFBQSxJQUFZLFlBQVk7QUFBQSxJQUNyQyxTQUFTO0FBQUEsSUFDVCxXQUFXLENBQUMsRUFBRSxNQUFNLGlDQUFpQyxVQUFVLFdBQVcsQ0FBQztBQUFBLEVBQzdFO0FBQUEsRUFDQTtBQUFBLElBQ0UsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLElBQVEsUUFBUTtBQUFBLElBQVEsU0FBUztBQUFBLElBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztBQUFBLElBQUcsU0FBUztBQUFBLElBQ2hFLGFBQWE7QUFBQSxJQUFZLFlBQVk7QUFBQSxJQUNyQyxTQUFTO0FBQUEsSUFDVCxXQUFXLENBQUMsRUFBRSxNQUFNLGdDQUFnQyxVQUFVLFdBQVcsQ0FBQztBQUFBLEVBQzVFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUEsSUFDRSxTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsSUFBVyxRQUFRO0FBQUEsSUFBUSxTQUFTO0FBQUEsSUFBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQUEsSUFBRyxTQUFTO0FBQUEsSUFDbkUsYUFBYTtBQUFBLElBQVksWUFBWTtBQUFBLElBQ3JDLFNBQVM7QUFBQSxJQUNULFdBQVcsQ0FBQyxFQUFFLE1BQU0saUNBQWlDLFVBQVUsV0FBVyxDQUFDO0FBQUEsRUFDN0U7QUFBQSxFQUNBO0FBQUEsSUFDRSxTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsSUFBUSxRQUFRO0FBQUEsSUFBUSxTQUFTO0FBQUEsSUFBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQUEsSUFBRyxTQUFTO0FBQUEsSUFDaEUsYUFBYTtBQUFBLElBQVksWUFBWTtBQUFBLElBQ3JDLFNBQVM7QUFBQSxJQUNULFdBQVcsQ0FBQyxFQUFFLE1BQU0sZ0NBQWdDLFVBQVUsV0FBVyxDQUFDO0FBQUEsRUFDNUU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUE7QUFBQSxJQUNFLFNBQVM7QUFBQSxJQUNULE1BQU07QUFBQSxJQUFXLFFBQVE7QUFBQSxJQUFXLFNBQVM7QUFBQSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUM7QUFBQSxJQUFHLFNBQVM7QUFBQSxJQUN0RSxhQUFhO0FBQUEsSUFBbUIsWUFBWTtBQUFBLElBQXlCLFNBQVM7QUFBQSxJQUM5RSxVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsSUFDYixXQUFXLENBQUMsRUFBRSxTQUFTLCtCQUErQixVQUFVLFlBQVksQ0FBQztBQUFBLElBQzdFLG1CQUFtQjtBQUFBLEVBQ3JCO0FBQUEsRUFDQTtBQUFBLElBQ0UsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLElBQVcsUUFBUTtBQUFBLElBQVcsU0FBUztBQUFBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztBQUFBLElBQUcsU0FBUztBQUFBLElBQ3ZFLGFBQWE7QUFBQSxJQUFtQixZQUFZO0FBQUEsSUFBNEIsU0FBUztBQUFBLElBQ2pGLGFBQWE7QUFBQSxJQUNiLFdBQVcsQ0FBQyxFQUFFLFNBQVMsNkJBQTZCLFVBQVUsV0FBVyxDQUFDO0FBQUEsSUFDMUUsbUJBQW1CO0FBQUEsRUFDckI7QUFBQSxFQUNBO0FBQUEsSUFDRSxTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsSUFBUSxRQUFRO0FBQUEsSUFBVyxTQUFTO0FBQUEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQUEsSUFBRyxTQUFTO0FBQUEsSUFDcEUsYUFBYTtBQUFBLElBQW1CLFlBQVk7QUFBQSxJQUE4QixTQUFTO0FBQUEsSUFDbkYsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLElBQ2IsV0FBVyxDQUFDLEVBQUUsU0FBUyw4QkFBOEIsVUFBVSxXQUFXLENBQUM7QUFBQSxJQUMzRSxtQkFBbUI7QUFBQSxFQUNyQjtBQUFBLEVBQ0E7QUFBQSxJQUNFLFNBQVM7QUFBQSxJQUNULE1BQU07QUFBQSxJQUFXLFFBQVE7QUFBQSxJQUFXLFNBQVM7QUFBQSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7QUFBQSxJQUFHLFNBQVM7QUFBQSxJQUN2RSxhQUFhO0FBQUEsSUFBbUIsWUFBWTtBQUFBLElBQTZCLFNBQVM7QUFBQSxJQUNsRixhQUFhO0FBQUEsSUFDYixXQUFXLENBQUMsRUFBRSxTQUFTLGtDQUFrQyxVQUFVLFdBQVcsQ0FBQztBQUFBLElBQy9FLG1CQUFtQjtBQUFBLEVBQ3JCO0FBQUEsRUFDQTtBQUFBLElBQ0UsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLElBQVEsUUFBUTtBQUFBLElBQVcsU0FBUztBQUFBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztBQUFBLElBQUcsU0FBUztBQUFBLElBQ3BFLGFBQWE7QUFBQSxJQUFlLFlBQVk7QUFBQSxJQUN4QyxhQUFhO0FBQUEsSUFDYixXQUFXLENBQUMsRUFBRSxTQUFTLDZCQUE2QixVQUFVLGNBQWMsQ0FBQztBQUFBLElBQzdFLG1CQUFtQjtBQUFBLEVBQ3JCO0FBQUEsRUFDQTtBQUFBLElBQ0UsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLElBQVcsUUFBUTtBQUFBLElBQVcsU0FBUztBQUFBLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRTtBQUFBLElBQUcsU0FBUztBQUFBLElBQ3ZFLGFBQWE7QUFBQSxJQUFtQixZQUFZO0FBQUEsSUFBZ0MsU0FBUztBQUFBLElBQ3JGLFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxJQUNiLFdBQVcsQ0FBQyxFQUFFLFNBQVMscUNBQXFDLFVBQVUsWUFBWSxDQUFDO0FBQUEsSUFDbkYsbUJBQW1CO0FBQUEsRUFDckI7QUFBQSxFQUNBO0FBQUEsSUFDRSxTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsSUFBUSxRQUFRO0FBQUEsSUFBVyxTQUFTO0FBQUEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQUEsSUFBRyxTQUFTO0FBQUEsSUFDcEUsYUFBYTtBQUFBLElBQWUsWUFBWTtBQUFBLElBQ3hDLGFBQWE7QUFBQSxJQUNiLFdBQVcsQ0FBQyxFQUFFLFNBQVMseUNBQXlDLFVBQVUsY0FBYyxDQUFDO0FBQUEsSUFDekYsbUJBQW1CO0FBQUEsRUFDckI7QUFBQSxFQUNBO0FBQUEsSUFDRSxTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsSUFBUSxRQUFRO0FBQUEsSUFBVyxTQUFTO0FBQUEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQUEsSUFBRyxTQUFTO0FBQUEsSUFDcEUsYUFBYTtBQUFBLElBQVksWUFBWTtBQUFBLElBQ3JDLGFBQWE7QUFBQSxJQUNiLFdBQVcsQ0FBQyxFQUFFLE1BQU0sbUNBQW1DLFVBQVUsY0FBYyxDQUFDO0FBQUEsSUFDaEYsbUJBQW1CO0FBQUEsRUFDckI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQTtBQUFBLElBQ0UsU0FBUztBQUFBLElBQ1QsTUFBTTtBQUFBLElBQVcsUUFBUTtBQUFBLElBQWEsU0FBUztBQUFBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztBQUFBLElBQUcsU0FBUztBQUFBLElBQ3pFLGFBQWE7QUFBQSxJQUFtQixZQUFZO0FBQUEsSUFBZ0MsU0FBUztBQUFBLElBQ3JGLGFBQWE7QUFBQSxJQUNiLFdBQVcsQ0FBQyxFQUFFLFNBQVMsOEJBQThCLFVBQVUsV0FBVyxDQUFDO0FBQUEsSUFDM0UsbUJBQW1CO0FBQUEsRUFDckI7QUFBQSxFQUNBO0FBQUEsSUFDRSxTQUFTO0FBQUEsSUFDVCxNQUFNO0FBQUEsSUFBUSxRQUFRO0FBQUEsSUFBVyxTQUFTO0FBQUEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQUEsSUFBRyxTQUFTO0FBQUEsSUFDcEUsYUFBYTtBQUFBLElBQWUsWUFBWTtBQUFBLElBQ3hDLGFBQWE7QUFBQSxJQUNiLFdBQVcsQ0FBQyxFQUFFLFNBQVMsNkJBQTZCLFVBQVUsY0FBYyxDQUFDO0FBQUEsSUFDN0UsbUJBQW1CO0FBQUEsRUFDckI7QUFDRjtBQUdBLElBQU0sV0FBVyxDQUFDLFNBQStDO0FBQy9ELFFBQU0sUUFBUSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLO0FBQ2xELFNBQU8sQ0FBQyxLQUFLLE1BQU0sUUFBUSxFQUFFLEdBQUcsUUFBUSxFQUFFO0FBQzVDO0FBRU8sSUFBTSxTQUFTRCxZQUFXLE9BQU87QUFBQSxFQUN0QyxNQUFNO0FBQUEsRUFDTixZQUFZO0FBQUEsRUFDWixTQUFTLFlBQVksSUFBSSxDQUFDLFNBQVM7QUFDakMsVUFBTSxDQUFDLFNBQVMsU0FBUyxJQUFJLFNBQVMsSUFBSTtBQUMxQyxXQUFPO0FBQUEsTUFDTCxTQUFTLEtBQUs7QUFBQSxNQUNkLE1BQU0sS0FBSztBQUFBLE1BQ1gsUUFBUSxLQUFLO0FBQUEsTUFDYixnQkFBZ0IsU0FBUyxLQUFLLFNBQVMsS0FBSyxHQUFHLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0FBQUEsTUFDN0QsY0FBYyxTQUFTLEtBQUssU0FBUyxTQUFTLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFNdkQsa0JBQWtCLEtBQUssV0FBVyxlQUFlLEtBQUssV0FBVyxZQUFZLElBQUksS0FBSztBQUFBLE1BQ3RGLFNBQVM7QUFBQSxNQUNULGlCQUFpQixLQUFLO0FBQUEsTUFDdEIsQ0FBQyxvQkFBb0IsS0FBSyxXQUFXLENBQUMsR0FBRyxLQUFLO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFJOUMsR0FBSSxLQUFLLFdBQVcsS0FBSyxnQkFBZ0IsZ0JBQ3JDLEVBQUUsb0JBQW9CLEtBQUssUUFBUSxJQUNuQyxDQUFDO0FBQUEsTUFDTCxHQUFJLEtBQUssV0FBVyxFQUFFLFVBQVUsS0FBSyxTQUFTLElBQUksQ0FBQztBQUFBLE1BQ25ELEdBQUksS0FBSyxjQUFjLEVBQUUsYUFBYSxLQUFLLFlBQVksSUFBSSxDQUFDO0FBQUEsTUFDNUQsR0FBSSxLQUFLLFVBQVUsRUFBRSxlQUFlLEtBQUssUUFBUSxJQUFJLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBS3hEO0FBQUEsRUFDRixDQUFDO0FBQ0gsQ0FBQztBQXNDRCxJQUFNLGtCQUFrQixDQUFDLFNBQ3ZCLFlBQVk7QUFBQSxFQUFRLENBQUMsU0FDbkIsS0FBSyxVQUNGLE9BQU8sQ0FBQyxNQUFPLFNBQVMsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFRLEVBQ3BELElBQUksQ0FBQyxPQUFPO0FBQUEsSUFDWCxXQUFXLEtBQUs7QUFBQSxJQUNoQixlQUFlO0FBQUEsSUFDZixHQUFJLFNBQVMsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLElBQUksRUFBRSxhQUFhLEVBQUUsUUFBUTtBQUFBLElBQ3RFLFVBQVUsRUFBRTtBQUFBLElBQ1osY0FBYztBQUFBO0FBQUE7QUFBQSxJQUdkLGNBQWMsV0FBVyxLQUFLLElBQUksS0FBSyxXQUFXLEtBQUsscUJBQXFCLElBQUksQ0FBQyxDQUFDO0FBQUEsRUFDcEYsRUFBRTtBQUNOO0FBRUssSUFBTSw2QkFBNkJBLFlBQVcsZUFBZTtBQUFBLEVBQ2xFLE1BQU07QUFBQSxFQUNOLFlBQVksQ0FBQyxhQUFhLGFBQWE7QUFBQSxFQUN2QyxTQUFTLGdCQUFnQixTQUFTO0FBQ3BDLENBQUM7QUFFTSxJQUFNLDBCQUEwQkEsWUFBVyxlQUFlO0FBQUEsRUFDL0QsTUFBTTtBQUFBLEVBQ04sWUFBWSxDQUFDLGFBQWEsVUFBVTtBQUFBLEVBQ3BDLFNBQVMsZ0JBQWdCLE1BQU07QUFDakMsQ0FBQztBQThCRCxJQUFNLDhCQUE4QjtBQVFwQyxJQUFNLHdCQUFvRTtBQUFBLEVBQ3hFLE1BQU07QUFBQSxFQUNOLFNBQVM7QUFDWDtBQUVPLElBQU0sMEJBQTBCO0FBQUEsRUFDckMsUUFBUTtBQUFBLEVBQ1IsTUFBTTtBQUFBO0FBQUE7QUFBQSxFQUdOLFlBQVksQ0FBQyxpQkFBaUIsV0FBVztBQUFBLEVBQ3pDLFNBQVMsWUFBWTtBQUFBLElBQ25CLENBQUMsU0FDQyxLQUFLLGdCQUFnQixjQUNyQixLQUFLLFdBQVcsVUFDaEIsc0JBQXNCLEtBQUssSUFBSSxNQUFNLFVBQ3JDLEtBQUssV0FBVyxLQUNoQixLQUFLLFVBQVU7QUFBQSxFQUNuQixFQUFFLElBQUksQ0FBQyxTQUFTO0FBQ2QsVUFBTSxDQUFDLFNBQVMsU0FBUyxJQUFJLFNBQVMsSUFBSTtBQUMxQyxXQUFPO0FBQUE7QUFBQTtBQUFBLE1BR0wsTUFBTTtBQUFBO0FBQUEsTUFFTixTQUFTLEdBQUcsc0JBQXNCLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxPQUFPLEtBQUssS0FBSyxPQUFPO0FBQUE7QUFBQSxNQUU1RSxXQUFXLFNBQVMsS0FBSyxTQUFTLFNBQVMsU0FBUztBQUFBLE1BQ3BELGFBQWE7QUFBQSxNQUNiLFdBQVcsS0FBSztBQUFBLE1BQ2hCLGVBQWU7QUFBQSxNQUNmLFdBQVcsS0FBSztBQUFBLE1BQ2hCLFVBQVUsS0FBSyxVQUFVO0FBQUEsUUFDdkIsTUFBTSxLQUFLO0FBQUEsUUFDWCxrQkFBa0IsS0FBSztBQUFBLFFBQ3ZCLE9BQU8sS0FBSyxXQUFXO0FBQUEsUUFDdkIsZ0JBQWdCLEtBQUssVUFBVTtBQUFBLE1BQ2pDLENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRixDQUFDO0FBQ0g7OztBQzVwQkEsU0FBUyxjQUFBRSxtQkFBa0I7QUFDM0IsU0FBUyxPQUFBQyxhQUFXO0FBeUVwQixJQUFNLGtCQUFrQixDQUFDLE9BQU8sT0FBTyxPQUFPLE9BQU8sT0FBTyxPQUFPLE9BQU8sT0FBTyxPQUFPLE9BQU8sT0FBTyxLQUFLO0FBQzNHLElBQU0sa0JBQWtCLENBQUMsTUFDdkIsR0FBRyxFQUFFLGVBQWUsQ0FBQyxJQUFJLE9BQU8sRUFBRSxZQUFZLElBQUksQ0FBQyxFQUFFLFNBQVMsR0FBRyxHQUFHLENBQUMsSUFBSSxPQUFPLEVBQUUsV0FBVyxDQUFDLEVBQUUsU0FBUyxHQUFHLEdBQUcsQ0FBQztBQUNsSCxJQUFNLHVCQUF1QixDQUFDLE1BQVksSUFBSSxLQUFLLE1BQU0sRUFBRSxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQztBQUN2RyxJQUFNLHFCQUFxQixDQUFDLE1BQVksR0FBRyxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDO0FBQ2pHLElBQU0sY0FBYyxvQkFBSSxLQUFLO0FBQzdCLElBQU0sZUFBZSxZQUFZLGVBQWU7QUFDaEQsSUFBTSxnQkFBZ0IsWUFBWSxZQUFZO0FBQzlDLElBQU0sdUJBQXVCLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQyxJQUFJO0FBRzdELElBQU0saUJBQWlCLElBQUksS0FBSyxLQUFLLElBQUksY0FBYyxlQUFlLENBQUMsQ0FBQztBQUN4RSxJQUFNLGVBQWUsSUFBSSxLQUFLLEtBQUssSUFBSSxjQUFjLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUMxRSxJQUFNLG1CQUFtQixJQUFJLEtBQUssS0FBSyxJQUFJLGNBQWMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0FBQ3JGLElBQU0saUJBQWlCLElBQUksS0FBSyxLQUFLLElBQUksY0FBYyxzQkFBc0IsQ0FBQyxDQUFDO0FBTS9FLElBQU0sa0JBQWtCLENBQUMsTUFBYyxJQUFJLEtBQUssS0FBSyxJQUFJLGNBQWMsdUJBQXVCLElBQUksR0FBRyxDQUFDLENBQUM7QUFDdkcsSUFBTSxnQkFBZ0IsQ0FBQyxNQUFjLElBQUksS0FBSyxLQUFLLElBQUksY0FBYyx1QkFBdUIsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQzNHLElBQU0sZ0JBQWdCLENBQUMsTUFBYyxJQUFJLEtBQUssS0FBSyxJQUFJLGNBQWMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQzFGLElBQU0sY0FBYyxDQUFDLE1BQWMsSUFBSSxLQUFLLEtBQUssSUFBSSxjQUFjLGdCQUFnQixJQUFJLEdBQUcsQ0FBQyxDQUFDO0FBaUM1RixJQUFNLGVBQWUsQ0FDbkIsVUFDQSxRQUNBLE9BQ0EsS0FDQSxPQUNBLFFBQ0EsTUFDQSxXQUNJO0FBQUEsRUFDSjtBQUFBLEVBQ0E7QUFBQSxFQUNBLGNBQWMsV0FBVyxZQUFZLHFCQUFxQixLQUFLLElBQUksbUJBQW1CLEtBQUs7QUFBQSxFQUMzRixjQUFjLGdCQUFnQixLQUFLO0FBQUEsRUFDbkMsWUFBWSxnQkFBZ0IsR0FBRztBQUFBLEVBQy9CLGVBQWUsZ0JBQWdCLEdBQUc7QUFBQSxFQUNsQztBQUFBLEVBQ0EsaUJBQWlCLEtBQUs7QUFBQSxFQUN0QixrQkFBa0IsS0FBSztBQUFBLEVBQ3ZCLGVBQWUsS0FBSztBQUFBLEVBQ3BCLGVBQWU7QUFBQSxFQUNmLFFBQVE7QUFBQSxFQUNSO0FBQ0Y7QUFxQk8sSUFBTSxZQUFZQyxZQUFXLFVBQVU7QUFBQSxFQUM1QyxNQUFNO0FBQUEsRUFDTixZQUFZO0FBQUEsRUFDWixTQUFTO0FBQUEsSUFDUDtBQUFBLE1BQ0UsVUFBVTtBQUFBLE1BQ1YsUUFBUTtBQUFBLE1BQ1IsY0FBYyxtQkFBbUIsY0FBYztBQUFBLE1BQy9DLGNBQWMsZ0JBQWdCLGNBQWM7QUFBQSxNQUM1QyxZQUFZLGdCQUFnQixZQUFZO0FBQUEsTUFDeEMsZUFBZUM7QUFBQSxNQUNmLE9BQU87QUFBQSxNQUNQLGlCQUFpQjtBQUFBLE1BQ2pCLGtCQUFrQjtBQUFBLE1BQ2xCLGVBQWU7QUFBQSxNQUNmLGVBQWU7QUFBQSxNQUNmLFFBQVE7QUFBQSxNQUNSLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQTtBQUFBLE1BQ0UsVUFBVTtBQUFBLE1BQ1YsUUFBUTtBQUFBLE1BQ1IsY0FBYyxxQkFBcUIsZ0JBQWdCO0FBQUEsTUFDbkQsY0FBYyxnQkFBZ0IsZ0JBQWdCO0FBQUEsTUFDOUMsWUFBWSxnQkFBZ0IsY0FBYztBQUFBLE1BQzFDLGVBQWUsZ0JBQWdCLGNBQWM7QUFBQSxNQUM3QyxPQUFPO0FBQUEsTUFDUCxpQkFBaUI7QUFBQSxNQUNqQixrQkFBa0I7QUFBQSxNQUNsQixlQUFlO0FBQUEsTUFDZixlQUFlO0FBQUEsTUFDZixRQUFRO0FBQUEsTUFDUixPQUFPO0FBQUEsSUFDVDtBQUFBLElBQ0E7QUFBQSxNQUFhO0FBQUEsTUFBd0I7QUFBQSxNQUFXLGdCQUFnQixDQUFDO0FBQUEsTUFBRyxjQUFjLENBQUM7QUFBQSxNQUFHO0FBQUEsTUFBUztBQUFBLE1BQzdGLEVBQUUsVUFBVSxPQUFRLFVBQVUsTUFBUSxRQUFRLEtBQU87QUFBQSxNQUNyRDtBQUFBLElBQThFO0FBQUEsSUFDaEY7QUFBQSxNQUFhO0FBQUEsTUFBd0I7QUFBQSxNQUFXLGdCQUFnQixDQUFDO0FBQUEsTUFBRyxjQUFjLENBQUM7QUFBQSxNQUFHO0FBQUEsTUFBUztBQUFBLE1BQzdGLEVBQUUsVUFBVSxPQUFRLFVBQVUsTUFBUSxRQUFRLEtBQU07QUFBQSxNQUNwRDtBQUFBLElBQW9FO0FBQUEsSUFDdEU7QUFBQSxNQUFhO0FBQUEsTUFBd0I7QUFBQSxNQUFXLGdCQUFnQixDQUFDO0FBQUEsTUFBRyxjQUFjLENBQUM7QUFBQSxNQUFHO0FBQUEsTUFBUztBQUFBLE1BQzdGLEVBQUUsVUFBVSxPQUFRLFVBQVUsTUFBUSxRQUFRLElBQU07QUFBQSxNQUNwRDtBQUFBLElBQXlFO0FBQUEsSUFDM0U7QUFBQSxNQUFhO0FBQUEsTUFBc0I7QUFBQSxNQUFTLGNBQWMsQ0FBQztBQUFBLE1BQUcsWUFBWSxDQUFDO0FBQUEsTUFBRztBQUFBLE1BQVE7QUFBQSxNQUNwRixFQUFFLFVBQVUsTUFBTyxVQUFVLE1BQU8sUUFBUSxJQUFNO0FBQUEsTUFDbEQ7QUFBQSxJQUFrRjtBQUFBLElBQ3BGO0FBQUEsTUFBYTtBQUFBLE1BQXNCO0FBQUEsTUFBUyxjQUFjLENBQUM7QUFBQSxNQUFHLFlBQVksQ0FBQztBQUFBLE1BQUc7QUFBQSxNQUFRO0FBQUEsTUFDcEYsRUFBRSxVQUFVLE1BQU8sVUFBVSxNQUFPLFFBQVEsS0FBTTtBQUFBLE1BQ2xEO0FBQUEsSUFBeUU7QUFBQSxFQUM3RTtBQUNGLENBQUM7OztBQ3ZMTSxJQUFNLHNCQUFzQjtBQUc1QixJQUFNLHNCQUFvRCxDQUFDLFdBQVcsTUFBTTtBQW1CNUUsU0FBUyxtQkFDZCxNQUEwQixRQUFRLElBQUksbUJBQW1CLEdBQ3RDO0FBQ25CLFFBQU0sU0FBUyxPQUFPLElBQUksS0FBSztBQUMvQixNQUFJLFVBQVUsR0FBSSxRQUFPO0FBQ3pCLE1BQUssb0JBQTBDLFNBQVMsS0FBSyxHQUFHO0FBQzlELFdBQU87QUFBQSxFQUNUO0FBQ0EsUUFBTSxJQUFJO0FBQUEsSUFDUixHQUFHLG1CQUFtQixLQUFLLEtBQUssbURBQ1Ysb0JBQW9CLEtBQUssSUFBSSxDQUFDO0FBQUEsRUFDdEQ7QUFDRjs7O0FDN0VBLFNBQVMsY0FBQUMsbUJBQWtCO0FBY3BCLElBQU0sV0FBV0MsWUFBVyxTQUFTO0FBQUEsRUFDMUMsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUFBLEVBQ1osU0FBUztBQUFBLElBQ1A7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLFVBQVU7QUFBQSxNQUNWLFFBQVE7QUFBQSxNQUNSLEtBQUs7QUFBQSxNQUNMLFlBQVk7QUFBQSxNQUNaLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsVUFBVTtBQUFBLE1BQ1YsUUFBUTtBQUFBLE1BQ1IsS0FBSztBQUFBLE1BQ0wsWUFBWTtBQUFBLE1BQ1osTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixVQUFVO0FBQUEsTUFDVixRQUFRO0FBQUEsTUFDUixLQUFLO0FBQUEsTUFDTCxZQUFZO0FBQUEsTUFDWixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLFVBQVU7QUFBQSxNQUNWLFFBQVE7QUFBQSxNQUNSLEtBQUs7QUFBQSxNQUNMLFlBQVk7QUFBQSxNQUNaLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsVUFBVTtBQUFBLE1BQ1YsUUFBUTtBQUFBLE1BQ1IsS0FBSztBQUFBLE1BQ0wsWUFBWTtBQUFBLE1BQ1osTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixVQUFVO0FBQUEsTUFDVixRQUFRO0FBQUEsTUFDUixLQUFLO0FBQUEsTUFDTCxZQUFZO0FBQUEsTUFDWixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLFVBQVU7QUFBQSxNQUNWLFFBQVE7QUFBQSxNQUNSLEtBQUs7QUFBQSxNQUNMLFlBQVk7QUFBQSxNQUNaLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsVUFBVTtBQUFBLE1BQ1YsUUFBUTtBQUFBLE1BQ1IsS0FBSztBQUFBLE1BQ0wsWUFBWTtBQUFBLE1BQ1osTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixVQUFVO0FBQUEsTUFDVixRQUFRO0FBQUEsTUFDUixLQUFLO0FBQUEsTUFDTCxZQUFZO0FBQUEsTUFDWixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLFVBQVU7QUFBQSxNQUNWLFFBQVE7QUFBQSxNQUNSLEtBQUs7QUFBQSxNQUNMLFlBQVk7QUFBQSxNQUNaLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsVUFBVTtBQUFBLE1BQ1YsUUFBUTtBQUFBLE1BQ1IsS0FBSztBQUFBLE1BQ0wsWUFBWTtBQUFBLE1BQ1osTUFBTTtBQUFBLE1BQ04sV0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixVQUFVO0FBQUEsTUFDVixRQUFRO0FBQUEsTUFDUixLQUFLO0FBQUEsTUFDTCxZQUFZO0FBQUEsTUFDWixNQUFNO0FBQUEsTUFDTixXQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLFVBQVU7QUFBQSxNQUNWLFFBQVE7QUFBQSxNQUNSLEtBQUs7QUFBQSxNQUNMLFlBQVk7QUFBQSxNQUNaLE1BQU07QUFBQSxNQUNOLFdBQVc7QUFBQSxJQUNiO0FBQUEsRUFDRjtBQUNGLENBQUM7QUFhTSxJQUFNLGVBQWUsQ0FBQyxnQkFBZ0M7QUFDM0QsUUFBTSxVQUFVLFNBQVMsUUFBUSxLQUFLLENBQUMsTUFBTSxFQUFFLFNBQVMsV0FBVztBQUNuRSxNQUFJLENBQUMsV0FBVyxPQUFPLFFBQVEsZUFBZSxVQUFVO0FBQ3RELFVBQU0sSUFBSSxNQUFNLHlDQUF5QyxXQUFXLEdBQUc7QUFBQSxFQUN6RTtBQUNBLFNBQU8sUUFBUTtBQUNqQjtBQVNPLElBQU0sa0JBQWtCLENBQzdCLGFBQ0EsVUFFQSxPQUFPLFFBQVEsS0FBSyxFQUFFO0FBQUEsRUFBUSxDQUFDLENBQUMsUUFBUSxLQUFLLE1BQzNDLE1BQU0sSUFBSSxDQUFDLEdBQUcsT0FBTztBQUFBLElBQ25CLENBQUMsV0FBVyxHQUFHO0FBQUEsSUFDZixhQUFhLEVBQUU7QUFBQSxJQUNmLGFBQWEsRUFBRTtBQUFBLElBQ2YsVUFBVSxFQUFFO0FBQUEsSUFDWixZQUFZLGFBQWEsRUFBRSxPQUFPO0FBQUEsSUFDbEMsWUFBWSxFQUFFO0FBQUEsSUFDZCxVQUFVLEVBQUUsWUFBWTtBQUFBLElBQ3hCLGFBQWEsSUFBSTtBQUFBLEVBQ25CLEVBQUU7QUFDSjs7O0FDdk1GLFNBQVMsY0FBQUMsbUJBQWtCO0FBMEJwQixJQUFNLHVCQUF1QkMsWUFBVyxxQkFBcUI7QUFBQSxFQUNsRSxNQUFNO0FBQUEsRUFDTixZQUFZLENBQUMsbUJBQW1CLGFBQWE7QUFBQSxFQUM3QyxTQUFTLGdCQUFnQixtQkFBbUIsaUJBQWlCO0FBQy9ELENBQUM7OztBQ3hCRCxTQUFTLGNBQUFDLG1CQUFrQjtBQUMzQixTQUFTLE9BQUFDLGFBQVc7QUFZYixJQUFNLFlBQVlDLFlBQVcsVUFBVTtBQUFBLEVBQzVDLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFBQSxFQUNaLFNBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQXlCUDtBQUFBLE1BQ0UsYUFBYTtBQUFBLE1BQ2IsYUFBYTtBQUFBLE1BQ2IsaUJBQWlCO0FBQUEsTUFDakIsUUFBUTtBQUFBLE1BQ1Isc0JBQXNCO0FBQUEsTUFDdEIsWUFBWUM7QUFBQSxNQUNaLFVBQVVBO0FBQUEsTUFDVixnQkFBZ0I7QUFBQSxNQUNoQixtQkFBbUI7QUFBQSxNQUNuQixlQUFlO0FBQUEsTUFDZixjQUFjO0FBQUEsTUFDZCxxQkFBcUI7QUFBQSxNQUNyQixlQUFlO0FBQUEsTUFDZixhQUFhQTtBQUFBLE1BQ2IsV0FBVztBQUFBLE1BQ1gsYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxhQUFhO0FBQUEsTUFDYixhQUFhO0FBQUEsTUFDYixpQkFBaUI7QUFBQSxNQUNqQixRQUFRO0FBQUEsTUFDUixzQkFBc0I7QUFBQSxNQUN0QixZQUFZQTtBQUFBLE1BQ1osVUFBVUE7QUFBQSxNQUNWLGdCQUFnQjtBQUFBLE1BQ2hCLG1CQUFtQjtBQUFBLE1BQ25CLGVBQWU7QUFBQSxNQUNmLGNBQWM7QUFBQSxNQUNkLHFCQUFxQjtBQUFBLE1BQ3JCLGVBQWU7QUFBQSxNQUNmLGFBQWE7QUFBQSxJQUNmO0FBQUEsSUFDQTtBQUFBLE1BQ0UsYUFBYTtBQUFBLE1BQ2IsYUFBYTtBQUFBLE1BQ2IsUUFBUTtBQUFBLE1BQ1Isc0JBQXNCO0FBQUEsTUFDdEIsWUFBWUE7QUFBQSxNQUNaLFVBQVVBO0FBQUEsTUFDVixnQkFBZ0I7QUFBQSxNQUNoQixtQkFBbUI7QUFBQSxNQUNuQixlQUFlO0FBQUEsTUFDZixjQUFjO0FBQUEsTUFDZCxxQkFBcUI7QUFBQSxNQUNyQixlQUFlO0FBQUEsTUFDZixhQUFhQTtBQUFBLE1BQ2IsV0FBVztBQUFBLE1BQ1gsYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxhQUFhO0FBQUEsTUFDYixhQUFhO0FBQUEsTUFDYixRQUFRO0FBQUEsTUFDUixzQkFBc0I7QUFBQSxNQUN0QixZQUFZQTtBQUFBLE1BQ1osVUFBVUE7QUFBQSxNQUNWLGdCQUFnQjtBQUFBLE1BQ2hCLG1CQUFtQjtBQUFBLE1BQ25CLGVBQWU7QUFBQSxNQUNmLGNBQWM7QUFBQSxNQUNkLHFCQUFxQjtBQUFBLE1BQ3JCLGVBQWU7QUFBQSxNQUNmLGFBQWE7QUFBQSxJQUNmO0FBQUEsRUFDRjtBQUNGLENBQUM7QUFVRCxJQUFNLGNBQW1EO0FBQUEsRUFDdkQsK0JBQStCLGtCQUFrQix1QkFBdUI7QUFBQSxFQUN4RSxrQ0FBa0Msa0JBQWtCLDBCQUEwQjtBQUFBLEVBQzlFLHVDQUF1QyxrQkFBa0IsNEJBQTRCO0FBQUEsRUFDckYsa0NBQWtDLGtCQUFrQiwwQkFBMEI7QUFBQSxFQUM5RSxvQ0FBb0Msa0JBQWtCLHlCQUF5QjtBQUFBO0FBQUEsRUFFL0UsNkJBQTZCO0FBQUEsSUFDM0IsRUFBRSxTQUFTLDJCQUEyQixVQUFVLEdBQUcsWUFBWSxLQUFNLGFBQWEsbURBQW1EO0FBQUEsSUFDckksRUFBRSxTQUFTLG9CQUFvQixVQUFVLEdBQUcsWUFBWSxLQUFNLGFBQWEsdUNBQXVDO0FBQUEsSUFDbEgsRUFBRSxTQUFTLDBCQUEwQixVQUFVLEdBQUcsWUFBWSxLQUFNLGFBQWEsMENBQTBDO0FBQUEsRUFDN0g7QUFDRjtBQWVBLElBQU0sY0FBYyxDQUNsQixXQUNBLFNBQ0c7QUFDSCxRQUFNLFFBQVEsWUFBWSxTQUFTO0FBQ25DLE1BQUksQ0FBQyxNQUFPLE9BQU0sSUFBSSxNQUFNLGlEQUFpRCxTQUFTLEdBQUc7QUFDekYsUUFBTSxXQUFXLFdBQVcsS0FBSztBQUNqQyxRQUFNLGtCQUFrQixLQUFLLE1BQU0sWUFBWSxLQUFLLFdBQVcsT0FBTyxHQUFHLElBQUk7QUFDN0UsUUFBTSxjQUNKLEtBQUssT0FBTyxXQUFXLGtCQUFrQixLQUFLLE1BQU0sS0FBSyxxQkFBcUIsR0FBRyxJQUFJO0FBQ3ZGLFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQSxVQUFVLEtBQUs7QUFBQSxJQUNmO0FBQUEsSUFDQSxLQUFLLEtBQUs7QUFBQSxJQUNWLG1CQUFtQixLQUFLO0FBQUEsSUFDeEI7QUFBQSxFQUNGO0FBQ0Y7QUFFTyxJQUFNLFNBQVNELFlBQVcsT0FBTztBQUFBLEVBQ3RDLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFBQSxFQUNaLFNBQVM7QUFBQSxJQUNQO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixhQUFhO0FBQUEsTUFDYixpQkFBaUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFTakIsUUFBUTtBQUFBLE1BQ1IsWUFBWUM7QUFBQSxNQUNaLGlCQUFpQkE7QUFBQSxNQUNqQixHQUFHLFlBQVksK0JBQStCLEVBQUUsVUFBVSxJQUFJLEtBQUssT0FBTyxtQkFBbUIsRUFBRSxDQUFDO0FBQUEsTUFDaEcsZUFBZTtBQUFBLE1BQ2YsYUFBYTtBQUFBLElBQ2Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFTQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsYUFBYTtBQUFBLE1BQ2IsaUJBQWlCO0FBQUEsTUFDakIsUUFBUTtBQUFBLE1BQ1IsWUFBWUE7QUFBQSxNQUNaLGlCQUFpQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS2pCLEdBQUcsWUFBWSxrQ0FBa0MsRUFBRSxVQUFVLEdBQUcsS0FBSyxPQUFPLG1CQUFtQixFQUFFLENBQUM7QUFBQSxNQUNsRyxlQUFlO0FBQUEsTUFDZixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLGFBQWE7QUFBQSxNQUNiLGlCQUFpQjtBQUFBLE1BQ2pCLFFBQVE7QUFBQSxNQUNSLFlBQVlBO0FBQUEsTUFDWixpQkFBaUJBO0FBQUEsTUFDakIsR0FBRyxZQUFZLHVDQUF1QyxFQUFFLFVBQVUsR0FBRyxLQUFLLE1BQU0sbUJBQW1CLEtBQUssQ0FBQztBQUFBLE1BQ3pHLGVBQWU7QUFBQSxNQUNmLGFBQWE7QUFBQSxJQUNmO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsYUFBYTtBQUFBLE1BQ2IsaUJBQWlCO0FBQUEsTUFDakIsUUFBUTtBQUFBLE1BQ1IsWUFBWUE7QUFBQSxNQUNaLGlCQUFpQkE7QUFBQSxNQUNqQixHQUFHLFlBQVksa0NBQWtDLEVBQUUsVUFBVSxJQUFJLEtBQUssT0FBTyxtQkFBbUIsRUFBRSxDQUFDO0FBQUEsTUFDbkcsZUFBZTtBQUFBLE1BQ2YsYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixhQUFhO0FBQUEsTUFDYixpQkFBaUI7QUFBQSxNQUNqQixRQUFRO0FBQUEsTUFDUixZQUFZQTtBQUFBLE1BQ1osaUJBQWlCQTtBQUFBLE1BQ2pCLEdBQUcsWUFBWSxvQ0FBb0MsRUFBRSxVQUFVLEdBQUcsS0FBSyxNQUFNLG1CQUFtQixFQUFFLENBQUM7QUFBQSxNQUNuRyxlQUFlO0FBQUEsTUFDZixhQUFhO0FBQUEsSUFDZjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLGFBQWE7QUFBQSxNQUNiLFFBQVE7QUFBQSxNQUNSLFlBQVlBO0FBQUEsTUFDWixpQkFBaUJBO0FBQUEsTUFDakIsR0FBRyxZQUFZLDZCQUE2QixFQUFFLFVBQVUsR0FBRyxLQUFLLE1BQU0sbUJBQW1CLEVBQUUsQ0FBQztBQUFBLE1BQzVGLGVBQWU7QUFBQSxNQUNmLGFBQWE7QUFBQSxNQUNiLGdCQUFnQjtBQUFBLElBQ2xCO0FBQUEsRUFDRjtBQUNGLENBQUM7QUFLTSxJQUFNLGlCQUFpQkQsWUFBVyxlQUFlO0FBQUEsRUFDdEQsTUFBTTtBQUFBLEVBQ04sWUFBWSxDQUFDLGFBQWEsYUFBYTtBQUFBLEVBQ3ZDLFNBQVMsZ0JBQWdCLGFBQWEsV0FBVztBQUNuRCxDQUFDOzs7QUNwUUQsU0FBUyxjQUFBRSxtQkFBa0I7QUFDM0IsU0FBUyxPQUFBQyxhQUFXOzs7QUN3RWIsSUFBTSx3QkFBcUM7QUFHM0MsSUFBTSwwQkFBZ0Y7QUFBQTtBQUFBLEVBRTNGLFVBQVUsRUFBRSxXQUFXLEdBQUcsWUFBWSxHQUFHLFlBQVksR0FBRyxLQUFLLEVBQUU7QUFBQSxFQUMvRCxNQUFNLEVBQUUsV0FBVyxHQUFHLFlBQVksR0FBRyxZQUFZLEdBQUcsS0FBSyxFQUFFO0FBQUEsRUFDM0QsUUFBUSxFQUFFLFdBQVcsSUFBSSxZQUFZLElBQUksWUFBWSxJQUFJLEtBQUssR0FBRztBQUFBLEVBQ2pFLEtBQUssRUFBRSxXQUFXLElBQUksWUFBWSxLQUFLLFlBQVksS0FBSyxLQUFLLElBQUk7QUFDbkU7QUFHTyxTQUFTLHFCQUFxQixVQUFrQixNQUEwQztBQUMvRixRQUFNLE1BQU0sd0JBQXdCLFFBQTJCO0FBQy9ELE1BQUksQ0FBQyxJQUFLLFFBQU87QUFDakIsU0FBTyxJQUFJLElBQW1CLEtBQUssSUFBSSxxQkFBcUI7QUFDOUQ7QUE2Qk8sSUFBTSxrQkFBa0IsQ0FBQyxPQUFlLG1CQUFvQyxRQUFROzs7QURsRzNGLElBQU0sa0JBQWtCLElBQUk7QUFBQSxFQUN6QixTQUFTLFFBQW1ELElBQUksQ0FBQyxNQUFNO0FBQUEsSUFDdEUsT0FBTyxFQUFFLElBQUk7QUFBQSxJQUNiLE9BQU8sRUFBRSxTQUFTLFdBQVcsRUFBRSxPQUFPO0FBQUEsRUFDeEMsQ0FBQztBQUNIO0FBR0EsSUFBTSxpQkFBaUIsQ0FBQyxVQUFrQixnQkFBaUM7QUFDekUsUUFBTSxRQUFRLHFCQUFxQixVQUFVLGNBQWMsZ0JBQWdCLElBQUksV0FBVyxJQUFJLE1BQVM7QUFDdkcsTUFBSSxVQUFVLE9BQVcsT0FBTSxJQUFJLE1BQU0seUNBQXlDLFFBQVEsR0FBRztBQUM3RixTQUFPO0FBQ1Q7QUFnQkEsSUFBTSxnQkFBZ0IsQ0FBQyxnQkFBd0IsVUFBa0IsZ0JBQy9EQyxnQkFBYyxjQUFjLGlCQUFpQixlQUFlLFVBQVUsV0FBVyxDQUFDO0FBaUJwRixJQUFNLHNCQUFzQixDQUMxQixnQkFDQSxnQkFDQSxVQUNBLGdCQUNZLGdCQUFnQixlQUFlLFVBQVUsV0FBVyxJQUFJLGlCQUFpQixrQkFBa0IsRUFBRTtBQUdwRyxJQUFNLFFBQVFDLFlBQVcsTUFBTTtBQUFBLEVBQ3BDLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFBQSxFQUNaLFNBQVM7QUFBQSxJQUNQO0FBQUEsTUFDRSxTQUFTO0FBQUEsTUFDVCxhQUFhO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUtiLGFBQWE7QUFBQSxNQUNiLGFBQWE7QUFBQSxNQUNiLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLGVBQWU7QUFBQSxNQUNmLE1BQU07QUFBQSxNQUNOLFFBQVE7QUFBQSxNQUNSLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLE1BQ2pCLGNBQWM7QUFBQSxNQUNkLFlBQVlEO0FBQUEsTUFDWixjQUFjLGNBQWMsR0FBRyxRQUFRLGtCQUFrQjtBQUFBLElBQzNEO0FBQUEsSUFDQTtBQUFBLE1BQ0UsU0FBUztBQUFBLE1BQ1QsYUFBYTtBQUFBLE1BQ2IsYUFBYTtBQUFBLE1BQ2IsYUFBYTtBQUFBLE1BQ2IsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsZUFBZTtBQUFBLE1BQ2YsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsTUFDakIsY0FBYztBQUFBLE1BQ2QsbUJBQW1CO0FBQUEsTUFDbkIsWUFBWUE7QUFBQSxNQUNaLGNBQWMsY0FBYyxHQUFHLFlBQVksbUJBQW1CO0FBQUEsSUFDaEU7QUFBQSxJQUNBO0FBQUEsTUFDRSxTQUFTO0FBQUEsTUFDVCxhQUFhO0FBQUEsTUFDYixhQUFhO0FBQUEsTUFDYixhQUFhO0FBQUEsTUFDYixRQUFRO0FBQUEsTUFDUixVQUFVO0FBQUEsTUFDVixlQUFlO0FBQUEsTUFDZixNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQUtSLFdBQVc7QUFBQSxNQUNYLGlCQUFpQixvQkFBb0IsR0FBRyxHQUFHLFVBQVUsbUJBQW1CO0FBQUEsTUFDeEUsY0FBYztBQUFBLE1BQ2QsdUJBQXVCO0FBQUEsTUFDdkIsWUFBWUE7QUFBQSxNQUNaLGFBQWFBO0FBQUEsTUFDYixjQUFjLGNBQWMsR0FBRyxVQUFVLG1CQUFtQjtBQUFBLElBQzlEO0FBQUEsSUFDQTtBQUFBLE1BQ0UsU0FBUztBQUFBLE1BQ1QsYUFBYTtBQUFBLE1BQ2IsYUFBYTtBQUFBLE1BQ2IsYUFBYTtBQUFBLE1BQ2IsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsZUFBZTtBQUFBLE1BQ2YsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsV0FBVztBQUFBLE1BQ1gsaUJBQWlCLG9CQUFvQixHQUFHLEdBQUcsUUFBUSxtQkFBbUI7QUFBQSxNQUN0RSxjQUFjO0FBQUE7QUFBQTtBQUFBLE1BR2QsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFLWixxQkFBcUI7QUFBQTtBQUFBLE1BRXJCLHVCQUF1QjtBQUFBLE1BQ3ZCLFlBQVlBO0FBQUEsTUFDWixhQUFhQTtBQUFBLE1BQ2IsY0FBYyxjQUFjLEdBQUcsUUFBUSxtQkFBbUI7QUFBQSxJQUM1RDtBQUFBLElBQ0E7QUFBQSxNQUNFLFNBQVM7QUFBQSxNQUNULGFBQWE7QUFBQSxNQUNiLGFBQWE7QUFBQSxNQUNiLGFBQWE7QUFBQSxNQUNiLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLGVBQWU7QUFBQSxNQUNmLE1BQU07QUFBQSxNQUNOLFFBQVE7QUFBQSxNQUNSLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLE1BQ2pCLGNBQWM7QUFBQSxNQUNkLFlBQVlBO0FBQUEsTUFDWixjQUFjLGNBQWMsR0FBRyxVQUFVLGVBQWU7QUFBQSxJQUMxRDtBQUFBLElBQ0E7QUFBQSxNQUNFLFNBQVM7QUFBQSxNQUNULGFBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BS2IsYUFBYTtBQUFBLE1BQ2IsYUFBYTtBQUFBLE1BQ2IsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsZUFBZTtBQUFBLE1BQ2YsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsTUFDakIsY0FBYztBQUFBLE1BQ2QsWUFBWUE7QUFBQSxNQUNaLGNBQWMsY0FBYyxHQUFHLE9BQU8sa0JBQWtCO0FBQUEsSUFDMUQ7QUFBQSxJQUNBO0FBQUEsTUFDRSxTQUFTO0FBQUEsTUFDVCxhQUFhO0FBQUEsTUFDYixhQUFhO0FBQUEsTUFDYixhQUFhO0FBQUEsTUFDYixRQUFRO0FBQUEsTUFDUixVQUFVO0FBQUEsTUFDVixlQUFlO0FBQUEsTUFDZixNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsTUFDUixXQUFXO0FBQUEsTUFDWCxpQkFBaUI7QUFBQSxNQUNqQixjQUFjO0FBQUEsTUFDZCxtQkFBbUI7QUFBQSxNQUNuQixZQUFZQTtBQUFBLE1BQ1osY0FBYyxjQUFjLEdBQUcsWUFBWSxtQkFBbUI7QUFBQSxJQUNoRTtBQUFBLElBQ0E7QUFBQSxNQUNFLFNBQVM7QUFBQSxNQUNULGFBQWE7QUFBQSxNQUNiLGFBQWE7QUFBQSxNQUNiLGFBQWE7QUFBQSxNQUNiLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLGVBQWU7QUFBQSxNQUNmLE1BQU07QUFBQSxNQUNOLFFBQVE7QUFBQSxNQUNSLFdBQVc7QUFBQSxNQUNYLGlCQUFpQixvQkFBb0IsSUFBSSxHQUFHLE9BQU8sbUJBQW1CO0FBQUEsTUFDdEUsY0FBYztBQUFBO0FBQUEsTUFFZCxZQUFZO0FBQUE7QUFBQSxNQUVaLHVCQUF1QjtBQUFBLE1BQ3ZCLFlBQVlBO0FBQUEsTUFDWixhQUFhQTtBQUFBLE1BQ2IsY0FBYyxjQUFjLElBQUksT0FBTyxtQkFBbUI7QUFBQSxJQUM1RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQTZDQSxJQUFJLE1BQTBDO0FBQzVDLFlBQU0sYUFBYSxDQUFDLE9BQU8sVUFBVSxRQUFRLFVBQVU7QUFFdkQsWUFBTSxpQkFBNEQsRUFBRSxLQUFLLEdBQUcsUUFBUSxHQUFHLE1BQU0sR0FBRyxVQUFVLEVBQUU7QUFDNUcsWUFBTSxRQUFRLENBQUMsWUFBWSxPQUFPLFdBQVcsaUJBQWlCO0FBQzlELFlBQU0sVUFBVSxDQUFDLFNBQVMsU0FBUyxPQUFPLE1BQU07QUFDaEQsWUFBTSxXQUFXLENBQUMsT0FBTyxlQUFlLFlBQVksVUFBVSxXQUFXO0FBQ3pFLFlBQU0sZUFBZSxDQUFDLG9CQUFvQixxQkFBcUIscUJBQXFCLHFCQUFxQixlQUFlO0FBQ3hILFlBQU0sTUFBaUMsQ0FBQztBQUN4QyxlQUFTLElBQUksR0FBRyxJQUFJLElBQUksS0FBSztBQUkzQixjQUFNLFVBQVUsYUFBYSxJQUFJLGFBQWEsTUFBTTtBQUNwRCxjQUFNLFNBQVMsVUFBVSxJQUFJLEtBQUssTUFBTSxJQUFJLGFBQWEsTUFBTSxLQUFLLFNBQVMsTUFBTTtBQUNuRixjQUFNLFdBQVcsWUFBWSxJQUFJLEtBQUssTUFBTSxJQUFJLFdBQVcsTUFBTSxLQUFLLFdBQVcsTUFBTTtBQUN2RixjQUFNLE9BQU8sT0FBTyxJQUFJLElBQUksS0FBSyxNQUFNLElBQUksTUFBTSxNQUFNLEtBQUssTUFBTSxNQUFNO0FBQ3hFLGNBQU0sU0FBUyxTQUFTLElBQUksS0FBSyxNQUFNLElBQUksRUFBRSxLQUFLLFFBQVEsTUFBTTtBQUNoRSxjQUFNLFVBQVUsV0FBVyxjQUFjLFdBQVc7QUFDcEQsY0FBTSxVQUFVLElBQUssSUFBSTtBQUl6QixjQUFNLGlCQUFpQixLQUFLLElBQUksU0FBUyxJQUFLLElBQUksQ0FBRTtBQWNwRCxjQUFNLGNBQWMsVUFDaEIsb0JBQW9CLFNBQVMsVUFBVSxnQkFBZ0IsVUFBVSxPQUFPLElBQ3hFLGFBQWEsY0FBYyxJQUFJLE1BQU07QUFDekMsWUFBSSxLQUFLO0FBQUEsVUFDUCxTQUFTLGFBQWEsT0FBTyxJQUFJLENBQUMsRUFBRSxTQUFTLEdBQUcsR0FBRyxDQUFDLFdBQU0sUUFBUSxJQUFJLElBQUk7QUFBQSxVQUMxRSxhQUFhLGdDQUFnQyxRQUFRLHFCQUFxQixPQUFPO0FBQUEsVUFDakYsYUFBYTtBQUFBLFVBQ2I7QUFBQSxVQUNBO0FBQUEsVUFDQSxlQUFlLGVBQWUsUUFBUTtBQUFBLFVBQ3RDO0FBQUEsVUFDQTtBQUFBO0FBQUE7QUFBQSxVQUdBLFdBQVcsV0FBVztBQUFBLFVBQ3RCLGlCQUFpQjtBQUFBLFVBQ2pCLGNBQWMsV0FBVztBQUFBLFVBQ3pCLEdBQUksVUFBVSxFQUFFLHVCQUF1QixpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxVQUloRSxHQUFJLFdBQVcsV0FBVyxFQUFFLFlBQVksK0VBQStFLElBQUksQ0FBQztBQUFBLFVBQzVILEdBQUksV0FBVyxjQUFjLEVBQUUsbUJBQW1CLHVEQUF1RCxJQUFJLENBQUM7QUFBQSxVQUM5RyxZQUFZLFdBQVcsT0FBTztBQUFBO0FBQUE7QUFBQSxVQUc5QixHQUFJLFVBQVUsRUFBRSxhQUFhLFdBQVcsVUFBVSxjQUFjLEVBQUUsSUFBSSxDQUFDO0FBQUEsVUFDdkUsY0FBYyxjQUFjLFNBQVMsVUFBVSxPQUFPO0FBQUEsUUFDeEQsQ0FBQztBQUFBLE1BQ0g7QUFDQSxhQUFPO0FBQUEsSUFDVCxHQUFHO0FBQUEsRUFDTDtBQUNGLENBQUM7QUF1Qk0sSUFBTSxvQkFBb0JDLFlBQVcsa0JBQWtCO0FBQUEsRUFDNUQsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUFBLEVBQ1osU0FBUztBQUFBLElBQ1A7QUFBQSxNQUNFLE9BQU87QUFBQSxNQUNQLFNBQVM7QUFBQSxNQUNULFVBQVU7QUFBQSxNQUNWLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLFVBQVU7QUFBQSxNQUNWLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BV04sY0FBY0Q7QUFBQSxNQUNkLGtCQUFrQkE7QUFBQSxJQUNwQjtBQUFBLElBQ0E7QUFBQSxNQUNFLE9BQU87QUFBQSxNQUNQLFNBQVM7QUFBQSxNQUNULFVBQVU7QUFBQSxNQUNWLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLFVBQVU7QUFBQSxNQUNWLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BUU4sY0FBY0E7QUFBQSxNQUNkLGtCQUFrQkE7QUFBQSxJQUNwQjtBQUFBLElBQ0E7QUFBQSxNQUNFLE9BQU87QUFBQSxNQUNQLFNBQVM7QUFBQSxNQUNULFVBQVU7QUFBQSxNQUNWLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLFVBQVU7QUFBQSxNQUNWLE1BQU07QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUlSO0FBQUEsSUFDQTtBQUFBLE1BQ0UsT0FBTztBQUFBLE1BQ1AsU0FBUztBQUFBLE1BQ1QsVUFBVTtBQUFBLE1BQ1YsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsVUFBVTtBQUFBLE1BQ1YsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BSU4sY0FBY0E7QUFBQSxNQUNkLGtCQUFrQkE7QUFBQSxJQUNwQjtBQUFBLEVBQ0Y7QUFDRixDQUFDOzs7QUVyY0QsU0FBUyxjQUFBRSxtQkFBa0I7QUFDM0IsU0FBUyxPQUFBQyxhQUFXO0FBd0NwQixJQUFNLG1CQUFrRTtBQUFBLEVBQ3RFLCtCQUErQjtBQUFBLElBQzdCLEVBQUUsTUFBTSwwQ0FBMEMsUUFBUSxhQUFhLGNBQWMsSUFBSSxrQkFBa0IsRUFBRTtBQUFBLElBQzdHLEVBQUUsTUFBTSw0Q0FBNEMsUUFBUSxRQUFRLGNBQWMsR0FBRztBQUFBLElBQ3JGLEVBQUUsTUFBTSwyQ0FBMkMsUUFBUSxhQUFhLGNBQWMsSUFBSSxrQkFBa0IsR0FBRztBQUFBLElBQy9HLEVBQUUsTUFBTSxzQ0FBc0MsUUFBUSxRQUFRLGNBQWMsR0FBRztBQUFBLElBQy9FLEVBQUUsTUFBTSxtQ0FBbUMsUUFBUSxnQkFBZ0IsY0FBYyxHQUFHO0FBQUEsSUFDcEYsRUFBRSxNQUFNLHVDQUF1QyxRQUFRLFFBQVEsY0FBYyxHQUFHO0FBQUEsSUFDaEYsRUFBRSxNQUFNLDBDQUEwQyxRQUFRLFFBQVEsY0FBYyxHQUFHO0FBQUEsSUFDbkYsRUFBRSxNQUFNLDJDQUEyQyxRQUFRLGFBQWEsY0FBYyxJQUFJLGtCQUFrQixFQUFFO0FBQUEsSUFDOUcsRUFBRSxTQUFTLCtCQUErQixRQUFRLGFBQWEsY0FBYyxJQUFJLGtCQUFrQixHQUFHO0FBQUEsSUFDdEcsRUFBRSxTQUFTLG1DQUFtQyxRQUFRLFFBQVEsY0FBYyxHQUFHO0FBQUEsSUFDL0UsRUFBRSxTQUFTLGtDQUFrQyxRQUFRLGFBQWEsY0FBYyxJQUFJLGtCQUFrQixFQUFFO0FBQUEsSUFDeEcsRUFBRSxTQUFTLDZCQUE2QixRQUFRLFFBQVEsY0FBYyxHQUFHO0FBQUEsRUFDM0U7QUFBQSxFQUNBLDhCQUE4QjtBQUFBLElBQzVCLEVBQUUsTUFBTSxxQ0FBcUMsUUFBUSxhQUFhLGNBQWMsSUFBSSxrQkFBa0IsRUFBRTtBQUFBLElBQ3hHLEVBQUUsTUFBTSx3Q0FBd0MsUUFBUSxRQUFRLGNBQWMsR0FBRztBQUFBLElBQ2pGLEVBQUUsTUFBTSxzQ0FBc0MsUUFBUSxRQUFRLGNBQWMsR0FBRztBQUFBLElBQy9FLEVBQUUsTUFBTSw0Q0FBNEMsUUFBUSxhQUFhLGNBQWMsSUFBSSxrQkFBa0IsRUFBRTtBQUFBLElBQy9HLEVBQUUsTUFBTSwyQ0FBMkMsUUFBUSxRQUFRLGNBQWMsR0FBRztBQUFBLElBQ3BGLEVBQUUsU0FBUyw2QkFBNkIsUUFBUSxhQUFhLGNBQWMsSUFBSSxrQkFBa0IsRUFBRTtBQUFBLElBQ25HLEVBQUUsU0FBUyx5Q0FBeUMsUUFBUSxRQUFRLGNBQWMsR0FBRztBQUFBLElBQ3JGLEVBQUUsU0FBUyxxQ0FBcUMsUUFBUSxRQUFRLGNBQWMsR0FBRztBQUFBLElBQ2pGLEVBQUUsU0FBUyw4QkFBOEIsUUFBUSxRQUFRLGNBQWMsR0FBRztBQUFBLEVBQzVFO0FBQUEsRUFDQSxvQ0FBb0M7QUFBQSxJQUNsQyxFQUFFLE1BQU0sNkNBQTZDLFFBQVEsYUFBYSxjQUFjLElBQUksa0JBQWtCLEdBQUc7QUFBQSxJQUNqSCxFQUFFLE1BQU0sNENBQTRDLFFBQVEsUUFBUSxjQUFjLEdBQUc7QUFBQSxJQUNyRixFQUFFLE1BQU0sNENBQTRDLFFBQVEsZ0JBQWdCLGNBQWMsR0FBRztBQUFBLElBQzdGLEVBQUUsTUFBTSx3Q0FBd0MsUUFBUSxhQUFhLGNBQWMsSUFBSSxrQkFBa0IsR0FBRztBQUFBLElBQzVHLEVBQUUsTUFBTSx3Q0FBd0MsUUFBUSxRQUFRLGNBQWMsR0FBRztBQUFBLElBQ2pGLEVBQUUsTUFBTSxpQ0FBaUMsUUFBUSxhQUFhLGNBQWMsSUFBSSxrQkFBa0IsR0FBRztBQUFBLElBQ3JHLEVBQUUsU0FBUyxtQ0FBbUMsUUFBUSxhQUFhLGNBQWMsSUFBSSxrQkFBa0IsR0FBRztBQUFBLElBQzFHLEVBQUUsU0FBUyw2QkFBNkIsUUFBUSxRQUFRLGNBQWMsR0FBRztBQUFBLElBQ3pFLEVBQUUsU0FBUywrQkFBK0IsUUFBUSxRQUFRLGNBQWMsR0FBRztBQUFBLElBQzNFLEVBQUUsU0FBUyxnQ0FBZ0MsUUFBUSxRQUFRLGNBQWMsR0FBRztBQUFBLElBQzVFLEVBQUUsU0FBUyw4QkFBOEIsUUFBUSxRQUFRLGNBQWMsR0FBRztBQUFBLEVBQzVFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLDJCQUEyQjtBQUFBLElBQ3pCLEVBQUUsTUFBTSxnQ0FBZ0MsUUFBUSxRQUFRLGNBQWMsRUFBRTtBQUFBLElBQ3hFLEVBQUUsTUFBTSxtQ0FBbUMsUUFBUSxRQUFRLGNBQWMsRUFBRTtBQUFBLElBQzNFLEVBQUUsTUFBTSxxQ0FBcUMsUUFBUSxRQUFRLGNBQWMsRUFBRTtBQUFBLElBQzdFLEVBQUUsTUFBTSx3Q0FBd0MsUUFBUSxRQUFRLGNBQWMsRUFBRTtBQUFBLElBQ2hGLEVBQUUsU0FBUyw2QkFBNkIsUUFBUSxRQUFRLGNBQWMsRUFBRTtBQUFBLElBQ3hFLEVBQUUsU0FBUyx5Q0FBeUMsUUFBUSxRQUFRLGNBQWMsRUFBRTtBQUFBLEVBQ3RGO0FBQUEsRUFDQSxzQ0FBc0M7QUFBQSxJQUNwQyxFQUFFLFNBQVMsK0JBQStCLFFBQVEsUUFBUSxjQUFjLEVBQUU7QUFBQSxJQUMxRSxFQUFFLFNBQVMsNkJBQTZCLFFBQVEsUUFBUSxjQUFjLEVBQUU7QUFBQSxJQUN4RSxFQUFFLFNBQVMsbUNBQW1DLFFBQVEsUUFBUSxjQUFjLEVBQUU7QUFBQSxJQUM5RSxFQUFFLFNBQVMsa0NBQWtDLFFBQVEsUUFBUSxjQUFjLEVBQUU7QUFBQSxJQUM3RSxFQUFFLFNBQVMsZ0NBQWdDLFFBQVEsUUFBUSxjQUFjLEVBQUU7QUFBQSxFQUM3RTtBQUFBLEVBQ0EsK0JBQStCO0FBQUEsSUFDN0IsRUFBRSxNQUFNLDRDQUE0QyxRQUFRLFFBQVEsY0FBYyxFQUFFO0FBQUEsSUFDcEYsRUFBRSxNQUFNLDBDQUEwQyxRQUFRLFFBQVEsY0FBYyxFQUFFO0FBQUEsSUFDbEYsRUFBRSxTQUFTLHlDQUF5QyxRQUFRLFFBQVEsY0FBYyxFQUFFO0FBQUEsSUFDcEYsRUFBRSxTQUFTLHFDQUFxQyxRQUFRLFFBQVEsY0FBYyxFQUFFO0FBQUEsRUFDbEY7QUFBQSxFQUNBLDJCQUEyQjtBQUFBLElBQ3pCLEVBQUUsTUFBTSxzQ0FBc0MsUUFBUSxRQUFRLGNBQWMsRUFBRTtBQUFBLElBQzlFLEVBQUUsTUFBTSw0Q0FBNEMsUUFBUSxRQUFRLGNBQWMsRUFBRTtBQUFBLElBQ3BGLEVBQUUsTUFBTSwyQ0FBMkMsUUFBUSxRQUFRLGNBQWMsRUFBRTtBQUFBLElBQ25GLEVBQUUsTUFBTSx3Q0FBd0MsUUFBUSxRQUFRLGNBQWMsRUFBRTtBQUFBLEVBQ2xGO0FBQ0Y7QUF1QkEsSUFBTSxrQkFBa0IsQ0FBQyxpQkFBeUI7QUFDaEQsUUFBTSxVQUFVLGlCQUFpQixZQUFZLEtBQUssQ0FBQztBQUNuRCxRQUFNLFdBQVcsSUFBSSxJQUFJLFFBQVEsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLE1BQW1CLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDMUYsUUFBTSxpQkFBaUIsTUFBTSxRQUFRO0FBQUEsSUFDbkMsQ0FBQyxNQUFNLE9BQU8sRUFBRSxVQUFVLFlBQVksU0FBUyxJQUFJLEVBQUUsS0FBSyxLQUFLLEVBQUUsaUJBQWlCO0FBQUEsRUFDcEYsRUFBRTtBQUNGLFFBQU0sYUFBYSxjQUFjLFFBQVEsT0FBTyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsWUFBWTtBQUN0RixRQUFNLE1BQU0sV0FBVyxPQUFPLENBQUMsTUFBTSxFQUFFLFVBQVUsWUFBWTtBQUM3RCxTQUFPO0FBQUE7QUFBQSxJQUVMLFVBQVUsUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLbEIsZUFBZSxRQUFRLE9BQU8sQ0FBQyxNQUFNLEVBQUUsV0FBVyxXQUFXLEVBQUU7QUFBQSxJQUMvRCxXQUFXLFNBQVM7QUFBQSxJQUNwQixxQkFBcUI7QUFBQSxJQUNyQixtQkFBbUIsV0FBVztBQUFBLElBQzlCLHVCQUF1QixJQUFJO0FBQUEsSUFDM0IsZ0JBQWdCLElBQUksT0FBTyxDQUFDLEtBQUssTUFBTSxPQUFPLE9BQU8sRUFBRSxXQUFXLFdBQVcsRUFBRSxTQUFTLElBQUksQ0FBQztBQUFBLEVBQy9GO0FBQ0Y7QUFHTyxJQUFNLFlBQVlDLFlBQVcsVUFBVTtBQUFBLEVBQzVDLE1BQU07QUFBQSxFQUNOLFlBQVk7QUFBQSxFQUNaLFNBQVM7QUFBQSxJQUNQO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsTUFDVCxRQUFRO0FBQUEsTUFDUixZQUFZQztBQUFBLE1BQ1osVUFBVUE7QUFBQSxNQUNWLGVBQWU7QUFBQSxNQUNmLGFBQWE7QUFBQSxNQUNiLGtCQUFrQjtBQUFBLE1BQ2xCLGFBQWE7QUFBQSxNQUNiLEdBQUcsZ0JBQWdCLDZCQUE2QjtBQUFBLE1BQ2hELGtCQUFrQjtBQUFBLE1BQ2xCLFdBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsTUFBTTtBQUFBLE1BQ04sU0FBUztBQUFBLE1BQ1QsUUFBUTtBQUFBLE1BQ1IsWUFBWUE7QUFBQSxNQUNaLFVBQVVBO0FBQUEsTUFDVixlQUFlO0FBQUEsTUFDZixrQkFBa0I7QUFBQSxNQUNsQixhQUFhO0FBQUEsTUFDYixHQUFHLGdCQUFnQixvQ0FBb0M7QUFBQSxNQUN2RCxXQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxNQUNULFFBQVE7QUFBQSxNQUNSLFlBQVlBO0FBQUEsTUFDWixVQUFVQTtBQUFBLE1BQ1YsZUFBZTtBQUFBLE1BQ2Ysa0JBQWtCO0FBQUEsTUFDbEIsYUFBYTtBQUFBLE1BQ2IsR0FBRyxnQkFBZ0IseUJBQXlCO0FBQUEsTUFDNUMsa0JBQWtCO0FBQUEsTUFDbEIsV0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsTUFDVCxRQUFRO0FBQUE7QUFBQTtBQUFBLE1BR1IsWUFBWUE7QUFBQSxNQUNaLFVBQVVBO0FBQUEsTUFDVixlQUFlO0FBQUEsTUFDZixhQUFhO0FBQUEsTUFDYixrQkFBa0I7QUFBQSxNQUNsQixhQUFhO0FBQUEsTUFDYixHQUFHLGdCQUFnQiw0QkFBNEI7QUFBQSxNQUMvQyxrQkFBa0I7QUFBQSxNQUNsQixXQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0E7QUFBQSxNQUNFLE1BQU07QUFBQSxNQUNOLGFBQWE7QUFBQSxNQUNiLE1BQU07QUFBQSxNQUNOLFNBQVM7QUFBQSxNQUNULFFBQVE7QUFBQSxNQUNSLFlBQVlBO0FBQUEsTUFDWixVQUFVQTtBQUFBLE1BQ1YsZUFBZTtBQUFBLE1BQ2Ysa0JBQWtCO0FBQUEsTUFDbEIsYUFBYTtBQUFBLE1BQ2IsR0FBRyxnQkFBZ0IsNkJBQTZCO0FBQUEsTUFDaEQsV0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBO0FBQUEsTUFDRSxNQUFNO0FBQUEsTUFDTixhQUFhO0FBQUEsTUFDYixNQUFNO0FBQUEsTUFDTixTQUFTO0FBQUEsTUFDVCxRQUFRO0FBQUEsTUFDUixZQUFZQTtBQUFBLE1BQ1osVUFBVUE7QUFBQSxNQUNWLGVBQWU7QUFBQSxNQUNmLGtCQUFrQjtBQUFBLE1BQ2xCLGFBQWE7QUFBQSxNQUNiLEdBQUcsZ0JBQWdCLHlCQUF5QjtBQUFBLE1BQzVDLFdBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQTtBQUFBLE1BQ0UsTUFBTTtBQUFBLE1BQ04sYUFBYTtBQUFBLE1BQ2IsTUFBTTtBQUFBLE1BQ04sU0FBUztBQUFBLE1BQ1QsUUFBUTtBQUFBLE1BQ1IsWUFBWUE7QUFBQSxNQUNaLFVBQVVBO0FBQUEsTUFDVixlQUFlO0FBQUEsTUFDZixhQUFhO0FBQUEsTUFDYixrQkFBa0I7QUFBQSxNQUNsQixhQUFhO0FBQUEsTUFDYixHQUFHLGdCQUFnQixrQ0FBa0M7QUFBQSxNQUNyRCxrQkFBa0I7QUFBQSxNQUNsQixXQUFXO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFDRixDQUFDO0FBZ0JELElBQU0sZ0JBQWdCLENBQ3BCLFNBRUEsT0FBTyxRQUFRLGdCQUFnQixFQUFFO0FBQUEsRUFBUSxDQUFDLENBQUMsVUFBVSxPQUFPLE1BQzFELFFBQ0csT0FBTyxDQUFDLE1BQU8sU0FBUyxTQUFTLEVBQUUsT0FBTyxFQUFFLE9BQVEsRUFDcEQsSUFBSSxDQUFDLE9BQU87QUFBQSxJQUNYLGNBQWM7QUFBQSxJQUNkLEdBQUksU0FBUyxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssSUFBSSxFQUFFLGFBQWEsRUFBRSxRQUFRO0FBQUEsSUFDdEUsUUFBUSxFQUFFO0FBQUEsSUFDVixZQUFZLFdBQVcsRUFBRSxZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJckMsZUFBZSxFQUFFLFdBQVc7QUFBQSxJQUM1QixHQUFJLEVBQUUscUJBQXFCLFNBQVksRUFBRSxlQUFlLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUM7QUFBQSxFQUM5RixFQUFFO0FBQ047QUFFSyxJQUFNLDJCQUEyQkQsWUFBVyxnQkFBZ0I7QUFBQSxFQUNqRSxNQUFNO0FBQUEsRUFDTixZQUFZLENBQUMsZ0JBQWdCLFVBQVU7QUFBQSxFQUN2QyxTQUFTLGNBQWMsTUFBTTtBQUMvQixDQUFDO0FBRU0sSUFBTSw4QkFBOEJBLFlBQVcsZ0JBQWdCO0FBQUEsRUFDcEUsTUFBTTtBQUFBLEVBQ04sWUFBWSxDQUFDLGdCQUFnQixhQUFhO0FBQUEsRUFDMUMsU0FBUyxjQUFjLFNBQVM7QUFDbEMsQ0FBQzs7O0FDNUpELElBQU0sZUFBZSxDQUFJLFdBQ3ZCLE9BQU8sUUFBUSxNQUFNLEVBQ2xCLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFFLEVBQy9DLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyxNQUFNLEtBQUs7QUFnQnRCLElBQU0sV0FBVztBQUFBLEVBQ3RCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsRUFBRSxRQUFRLENBQUMsVUFBVyxNQUFNLFFBQVEsS0FBSyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUU7QUFPdEQsSUFBTSxXQUFXO0FBQUEsRUFDdEI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQU1PLElBQU0sWUFBWTtBQUFBLEVBQ3ZCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGO0FBR08sSUFBTSxhQUFhLGFBQWE7QUFBQSxFQUNyQyxHQUFHRTtBQUFBLEVBQWMsR0FBR0E7QUFBQSxFQUFnQixHQUFHQTtBQUN6QyxDQUFDO0FBR00sSUFBTSxhQUFhLGFBQWEsRUFBRSxHQUFHLGlCQUFjLEdBQUdDLGlCQUFpQixDQUFDO0FBR3hFLElBQU0sZ0JBQWdCLGFBQWEsRUFBRSxHQUFHLG1CQUFnQixDQUFDO0FBR3pELElBQU0sY0FBYyxhQUFhLEVBQUUsR0FBRyxrQkFBZSxHQUFHQyxrQkFBZ0IsQ0FBQztBQUd6RSxJQUFNLGFBQWEsYUFBYSxFQUFFLEdBQUcsZ0JBQWEsQ0FBQztBQUduRCxJQUFNLFdBQVcsYUFBYTtBQUFBLEVBQ25DLEdBQUc7QUFBQSxFQUFZLEdBQUdDO0FBQUEsRUFBYyxHQUFHQTtBQUNyQyxDQUFDO0FBR00sSUFBTSxXQUFXLGFBQWEsRUFBRSxHQUFHLGNBQVcsQ0FBQztBQUcvQyxJQUFNLGNBQWMsYUFBYSxFQUFFLEdBQUcsaUJBQVMsQ0FBQztBQUdoRCxJQUFNLFVBQVUsYUFBYSxFQUFFLEdBQUcsYUFBSyxDQUFDO0FBR3hDLElBQU0sa0JBQWtCLGFBQWEsRUFBRSxHQUFHLHFCQUFhLENBQUM7QUFjeEQsSUFBTSxvQkFBb0IsYUFBd0M7QUFBQSxFQUN2RSxHQUFHO0FBQUEsRUFBcUIsR0FBR0M7QUFDN0IsQ0FBQyxFQUFFLEtBQUs7QUFXRCxJQUFNLGNBQWM7QUFTcEIsSUFBTSxrQkFBa0I7QUFBQSxFQUM3QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxHQUFHO0FBQUEsRUFDSCxHQUFHO0FBQ0w7QUFlTyxJQUFNLFdBQVcsQ0FBQyxHQUFHLFVBQVUsR0FBRyxZQUFZO0FBRzlDLElBQU0sV0FBVyxDQUFDLEdBQUcsVUFBVSxHQUFHLFlBQVk7QUFHOUMsSUFBTSxZQUFZLENBQUMsR0FBRyxXQUFXLEdBQUcsYUFBYTtBQUdqRCxJQUFNLGtCQUFrQixDQUFDLEdBQUcsaUJBQWlCLEdBQUcsbUJBQW1CO0FBOENuRSxJQUFNLGNBQWM7QUFBQSxFQUN6QjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQXFDTyxJQUFNLHFCQUFxQixDQUFDLFFBQVE7QUFTcEMsSUFBTSxrQkFBa0IsQ0FBQyxPQUFPLGlCQUFpQjtBQUdqRCxJQUFNLGNBQWMsWUFBWSxPQUFPLENBQUMsV0FBVyxDQUFDLGdCQUFnQixTQUFTLE1BQU0sQ0FBQztBQVNwRixJQUFNLGNBQWMsQ0FDekJDLGlCQUVBQSxpQkFBZ0IsU0FDWixFQUFFLEtBQUssb0JBQW9CLFNBQVMsQ0FBQyxFQUFFLElBQ3ZDLEVBQUUsS0FBSyxhQUFhLFNBQVMsZ0JBQWdCO0FBbUNuRCxJQUFNLGNBQWMsbUJBQW1CO0FBQ3ZDLElBQU0sU0FBUyxnQkFBZ0I7QUFDL0IsSUFBTSxXQUFXLFlBQVksV0FBVztBQU14QyxJQUFNLHlCQUF5QixTQUMzQixDQUFDLEdBQUcsT0FBTyxPQUFPLFdBQVcsRUFBRSxPQUFPLENBQUMsUUFBUSxRQUFRLGtCQUFrQixHQUFHLGtCQUFrQixJQUM5RixPQUFPLE9BQU8sV0FBVztBQUt0QixJQUFNLGVBQWUseUJBQXlCLEVBQUUsTUFBTSxTQUFTLFFBQVEsQ0FBQztBQU94RSxJQUFNLFdBQVc7QUFBQSxFQUN0QjtBQUFBLElBQ0UsU0FBUztBQUFBLElBQ1QsU0FBUztBQUFBLElBQ1QsWUFBWTtBQUFBLElBQ1osVUFBVTtBQUFBLElBQ1YsU0FBUztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLVCxVQUFVO0FBQUEsSUFDVixPQUFPO0FBQUEsSUFDUCxRQUFRO0FBQUEsSUFDUixhQUFhO0FBQUEsSUFDYixNQUFNO0FBQUEsSUFDTixPQUFPO0FBQUEsSUFDUCxPQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFRUCxPQUFPO0FBQUEsSUFFUCxNQUFNLFNBQVM7QUFBQSxJQUVmLGNBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFPZCxnQkFBZ0I7QUFBQSxJQUVoQixjQUFjO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFJZCxXQUFXO0FBQUEsRUFDYjtBQUFBLEVBQ0EsRUFBRSxrQkFBa0IsYUFBYSxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxPQUFPLElBQUksRUFBRTtBQUMvRTs7O0F2TzVoQkEsSUFBTyw2QkFBUSxjQUFjLENBQUMsY0FBYyxRQUFRLEdBQUcsRUFBRSxVQUFVLFdBQVcsQ0FBQzsiLAogICJuYW1lcyI6IFsiZGVmaW5lU3RhY2siLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIlAiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIlAiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIkYiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJQIiwgIm9iamVjdHNfZXhwb3J0cyIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJGIiwgIlAiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIkYiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJGIiwgIlAiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIkYiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJQIiwgIm9iamVjdHNfZXhwb3J0cyIsICJQIiwgIlAiLCAiUCIsICJQIiwgImNlbCIsICJjZWwiLCAiY2VsIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgIlAiLCAiZGVmaW5lVmlldyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVN0YWNrIiwgIm9iamVjdHNfZXhwb3J0cyIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJGIiwgIlAiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIkYiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJGIiwgIlAiLCAiY2VsIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJGIiwgIlAiLCAiY2VsIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJGIiwgIlAiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIkYiLCAiUCIsICJvYmplY3RzX2V4cG9ydHMiLCAiT2JqZWN0U2NoZW1hIiwgIkZpZWxkIiwgIkYiLCAiUCIsICJPYmplY3RTY2hlbWEiLCAiRmllbGQiLCAiRiIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJQIiwgIk9iamVjdFNjaGVtYSIsICJGaWVsZCIsICJQIiwgIlAiLCAiUCIsICJQIiwgIlAiLCAiUCIsICJQIiwgImFjdGlvbnNfZXhwb3J0cyIsICJQIiwgIlAiLCAiZGVmaW5lRGF0YXNldCIsICJkZWZpbmVEYXRhc2V0IiwgImRlZmluZURhdGFzZXQiLCAiZGVmaW5lRGF0YXNldCIsICJkZWZpbmVEYXRhc2V0IiwgImRlZmluZURhdGFzZXQiLCAiZGVmaW5lRGF0YXNldCIsICJkZWZpbmVEYXRhc2V0IiwgImRlZmluZURhdGFzZXQiLCAiZGVmaW5lRGF0YXNldCIsICJkZWZpbmVEYXRhc2V0IiwgImRlZmluZURhdGFzZXQiLCAiZGVmaW5lRGF0YXNldCIsICJkZWZpbmVEYXRhc2V0IiwgImRhdGFzZXRzX2V4cG9ydHMiLCAiZGVmaW5lRGF0YXNldCIsICJkZWZpbmVEYXRhc2V0IiwgImRlZmluZU1hcHBpbmciLCAiZGVmaW5lTWFwcGluZyIsICJkZWZpbmVNYXBwaW5nIiwgImRlZmluZU1hcHBpbmciLCAiZW4iLCAiYXBwU3VyZmFjZSIsICJhY3Rpdml0eUFjdGlvbnMiLCAiY3VzdG9tZXIiLCAiYWN0aXZpdHlBY3Rpb25zIiwgInBpcGVsaW5lIiwgImFjdGl2aXR5QWN0aW9ucyIsICJjb21tZXJjZSIsICJzZXJ2aWNlIiwgImFjdGl2aXR5QWN0aW9ucyIsICJhY3Rpdml0eSIsICJtYXJrZXRpbmciLCAiemhDTiIsICJjdXN0b21lciIsICJzZXJ2aWNlIiwgInBpcGVsaW5lIiwgImNvbW1lcmNlIiwgImFjdGl2aXR5IiwgIm1hcmtldGluZyIsICJhcHBTdXJmYWNlIiwgImFwcFN1cmZhY2UiLCAiYWN0aXZpdHlBY3Rpb25zIiwgImN1c3RvbWVyIiwgImFjdGl2aXR5QWN0aW9ucyIsICJwaXBlbGluZSIsICJhY3Rpdml0eUFjdGlvbnMiLCAiY29tbWVyY2UiLCAic2VydmljZSIsICJhY3Rpdml0eUFjdGlvbnMiLCAiYWN0aXZpdHkiLCAibWFya2V0aW5nIiwgImphSlAiLCAiY3VzdG9tZXIiLCAic2VydmljZSIsICJwaXBlbGluZSIsICJjb21tZXJjZSIsICJhY3Rpdml0eSIsICJtYXJrZXRpbmciLCAiYXBwU3VyZmFjZSIsICJhcHBTdXJmYWNlIiwgImFjdGl2aXR5QWN0aW9ucyIsICJjdXN0b21lciIsICJhY3Rpdml0eUFjdGlvbnMiLCAicGlwZWxpbmUiLCAiYWN0aXZpdHlBY3Rpb25zIiwgImNvbW1lcmNlIiwgInNlcnZpY2UiLCAiYWN0aXZpdHlBY3Rpb25zIiwgImFjdGl2aXR5IiwgIm1hcmtldGluZyIsICJlc0VTIiwgImN1c3RvbWVyIiwgInNlcnZpY2UiLCAicGlwZWxpbmUiLCAiY29tbWVyY2UiLCAiYWN0aXZpdHkiLCAibWFya2V0aW5nIiwgImFwcFN1cmZhY2UiLCAiZW4iLCAiemhDTiIsICJqYUpQIiwgImVzRVMiLCAiUCIsICJkZWZpbmVWaWV3IiwgIlAiLCAiZGVmaW5lVmlldyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVZpZXciLCAiZGVmaW5lVmlldyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVZpZXciLCAiZGVmaW5lVmlldyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVZpZXciLCAiZGVmaW5lVmlldyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVZpZXciLCAiZGVmaW5lVmlldyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVZpZXciLCAidmlld3NfZXhwb3J0cyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVZpZXciLCAiZGVmaW5lVmlldyIsICJkZWZpbmVWaWV3IiwgImRlZmluZVZpZXciLCAiZGVmaW5lVmlldyIsICJ2aWV3c19leHBvcnRzIiwgImRlZmluZVZpZXciLCAiZGVmaW5lVmlldyIsICJQIiwgIlAiLCAiZW4iLCAiemhDTiIsICJqYUpQIiwgImVzRVMiLCAiZW4iLCAiemhDTiIsICJqYUpQIiwgImVzRVMiLCAiZW1haWxfdGVtcGxhdGVzX2V4cG9ydHMiLCAiZW4iLCAiemhDTiIsICJqYUpQIiwgImVzRVMiLCAiZW4iLCAiemhDTiIsICJqYUpQIiwgImVzRVMiLCAib3Bwb3J0dW5pdGllcyIsICJwZXJpb2QiLCAiaW5wdXQiLCAiY29udGFjdHMiLCAibGVhZHMiLCAidHlwZSIsICJpbnRlcnZhbCIsICJzdGF0dXMiLCAiUCIsICJjZWwiLCAiY2VsIiwgIlAiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiY2VsIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImNlbCIsICJjZWwiLCAiUCIsICJQIiwgImV4cHJlc3Npb24iLCAiY2VsIiwgImNlbCIsICJleHByZXNzaW9uIiwgIlAiLCAiUCIsICJjZWwiLCAiY2VsIiwgIlAiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiUCIsICJjZWwiLCAiY2VsIiwgImNlbCIsICJQIiwgImNlbCIsICJjZWwiLCAiZXhwcmVzc2lvbiIsICJleHByZXNzaW9uIiwgImNlbCIsICJQIiwgImNlbCIsICJQIiwgImV4cHJlc3Npb24iLCAiY2VsIiwgImNlbCIsICJleHByZXNzaW9uIiwgIlAiLCAiUCIsICJjZWwiLCAiY2VsIiwgIlAiLCAiY2VsIiwgImNlbCIsICJjZWwiLCAiY2VsIiwgIlAiLCAiY2VsIiwgIlAiLCAiY2VsIiwgIlAiLCAiY2VsIiwgImNlbCIsICJQIiwgImNlbCIsICJjZWwiLCAiY2VsIiwgImNlbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJkZWZpbmVTa2lsbCIsICJQIiwgIlAiLCAiUCIsICJQIiwgIlAiLCAiUCIsICJjZWwiLCAiY2VsIiwgImNlbCIsICJjZWwiLCAiZGVmaW5lU2VlZCIsICJjZWwiLCAiZGVmaW5lU2VlZCIsICJjZWwiLCAiZGVmaW5lU2VlZCIsICJjZWwiLCAiZGVmaW5lU2VlZCIsICJjZWwiLCAiZGVmaW5lU2VlZCIsICJkZWZpbmVTZWVkIiwgImRlZmluZVNlZWQiLCAiZGVmaW5lU2VlZCIsICJkZWZpbmVTZWVkIiwgImNlbCIsICJkZWZpbmVTZWVkIiwgImNlbCIsICJkZWZpbmVTZWVkIiwgImNlbCIsICJjZWwiLCAiZGVmaW5lU2VlZCIsICJkZWZpbmVTZWVkIiwgImNlbCIsICJkZWZpbmVTZWVkIiwgImNlbCIsICJvYmplY3RzX2V4cG9ydHMiLCAiYWN0aW9uc19leHBvcnRzIiwgImRhdGFzZXRzX2V4cG9ydHMiLCAidmlld3NfZXhwb3J0cyIsICJlbWFpbF90ZW1wbGF0ZXNfZXhwb3J0cyIsICJjb21wb3NpdGlvbiJdCn0K diff --git a/test/ownership-model.test.ts b/test/ownership-model.test.ts index 03bae963..abf24c91 100644 --- a/test/ownership-model.test.ts +++ b/test/ownership-model.test.ts @@ -6,6 +6,7 @@ import { InMemoryDriver } from '@objectstack/driver-memory'; import type { VerifyStack } from '@objectstack/verify'; import stack from './helpers/composed-stack'; import { hotcrmStack, signUpPerson, type Person } from './helpers/verify-stack'; +import { LeadViews } from '../src/sales/views/lead.view'; /** * ═══ HotCRM has ONE owner, and it is the platform's (#548) ════════════════ @@ -162,6 +163,21 @@ describe('one ownership column, and it is `owner_id`', () => { ); expect(withDefault, 'owner_id must have no schema default').toEqual([]); }); + + it('the New Lead form leaves `owner_id` to that stamp — offered, not required (#2097)', () => { + // `LeadViews.form` IS the create dialog (see `case-create-form-narrowing`), + // and a `required` entry there is a client-side submit check. Measured on + // 18.0.0-next.0: a rep's Leads → New stopped at "Lead Owner is required" + // with nothing POSTed, so the stamp never saw the insert. The server half — + // a rep's ownerless insert lands owned by the rep — is pinned end to end by + // `stands down when the middleware already stamped an owner` below. + const entries: unknown[] = ((LeadViews as AnyRec).form?.sections ?? []).flatMap( + (s: AnyRec) => s.fields ?? [], + ); + const owner = entries.find((f) => (typeof f === 'string' ? f : (f as AnyRec)?.field) === 'owner_id'); + expect(owner, 'owner_id left the New Lead form — this pin would judge nothing').toBeDefined(); + expect((owner as AnyRec)?.required === true, 'the New Lead form demands an owner again').toBe(false); + }); }); // ──────────────────────────────────── which writers the gate can see ── From ca836d0dd67224e2622ffabfa9e36899efc7763d Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 14 Oct 2026 08:12:25 +0000 Subject: [PATCH 3/4] chore(changeset): note that a new lead no longer requires an owner pick Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv Co-authored-by: Claude --- .changeset/2097-lead-owner-not-required.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/2097-lead-owner-not-required.md diff --git a/.changeset/2097-lead-owner-not-required.md b/.changeset/2097-lead-owner-not-required.md new file mode 100644 index 00000000..594ce653 --- /dev/null +++ b/.changeset/2097-lead-owner-not-required.md @@ -0,0 +1,5 @@ +--- +'hotcrm': patch +--- + +A sales rep can create a lead without first picking themselves as its owner. The **New Lead** form marked **Lead Owner** as required, so clicking **Create** with the field left blank stopped at *"Lead Owner is required"* and nothing was saved. The form no longer requires it. A lead created with the field left blank is owned by the person who created it, as on the **Opportunity**, **Account** and **Contact** New forms. **Lead Owner** stays on the form. From 43a0b4c8c1a571881de71d201226a6ee088ba43a Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 14 Oct 2026 08:28:37 +0000 Subject: [PATCH 4/4] fix(lead): say that a create-time owner pick is dropped, not kept The owner_id comment on the New Lead form claimed a manager can still choose another owner. Measured on 18.0.0-next.0, the console drops a picked owner on create (objectui#12359); the comment now says so. Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv Co-authored-by: Claude --- src/sales/views/lead.view.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/sales/views/lead.view.ts b/src/sales/views/lead.view.ts index 049bedbe..26cdbd17 100644 --- a/src/sales/views/lead.view.ts +++ b/src/sales/views/lead.view.ts @@ -292,8 +292,9 @@ export const LeadViews = defineView({ 'industry', // Offered, ⛔ not `required` (#2097): an insert that leaves it empty is // stamped to the creator by the platform (see `lead.hook.ts`), so a - // rep's new lead is theirs without a pick, and a manager can still - // choose another owner. `required` blocked that save client-side. + // rep's new lead is theirs without a pick. `required` blocked that + // save client-side. A pick of another owner on create is currently + // dropped by the console (objectui#12359). 'owner_id', // `disqualification_reason` is enforced by the // `disqualification_reason_required` validation on crm_lead, so every